diff --git a/.github/docker/Dockerfile.ubuntu b/.github/docker/Dockerfile.ubuntu new file mode 100644 index 0000000..597e308 --- /dev/null +++ b/.github/docker/Dockerfile.ubuntu @@ -0,0 +1,45 @@ +ARG VERSION="22.04" +FROM ubuntu:${VERSION} + +ARG LLVM_VERSION="14" +ENV LLVM_VERSION=$LLVM_VERSION + +ARG SHORTNAME="jammy" +ENV SHORTNAME=$SHORTNAME + +RUN apt-get update && apt-get install -y curl gnupg +RUN if [ "${LLVM_VERSION}" = "17" ]; \ + then \ + echo "\n\ +deb http://apt.llvm.org/${SHORTNAME}/ llvm-toolchain-${SHORTNAME} main\n\ +deb-src http://apt.llvm.org/${SHORTNAME}/ llvm-toolchain-${SHORTNAME} main\n\ +" >> /etc/apt/sources.list;\ + else \ + echo "\n\ +deb http://apt.llvm.org/${SHORTNAME}/ llvm-toolchain-${SHORTNAME}-${LLVM_VERSION} main\n\ +deb-src http://apt.llvm.org/${SHORTNAME}/ llvm-toolchain-${SHORTNAME}-${LLVM_VERSION} main\n\ +" >> /etc/apt/sources.list; \ + fi +RUN curl -L https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - + +ARG DEBIAN_FRONTEND="noninteractive" +ENV TZ="Etc/UTC" + +RUN apt-get update && apt-get install -y \ + libelf-dev \ + zlib1g-dev \ + libbfd-dev \ + clang-${LLVM_VERSION} \ + libclang-${LLVM_VERSION}-dev \ + libclang-common-${LLVM_VERSION}-dev \ + libclang1-${LLVM_VERSION} \ + llvm-${LLVM_VERSION} \ + llvm-${LLVM_VERSION}-dev \ + llvm-${LLVM_VERSION}-runtime \ + libllvm${LLVM_VERSION} \ + make pkg-config \ + rustc cargo rustfmt \ + sudo \ + && apt-get -y clean + +RUN ln -s /usr/bin/clang-${LLVM_VERSION} /usr/bin/clang && ln -s /usr/bin/llvm-strip-${LLVM_VERSION} /usr/bin/llvm-strip diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..01bc011 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,55 @@ +name: libbpf-bootstrap build + +on: + push: + branches: + - master + pull_request: + +jobs: + build_libbpf_bootstrap: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + llvm: [11, 12, 13, 14, 15, 16, 17] + steps: + - uses: actions/checkout@v2 + with: + submodules: recursive + - name: Build container (20.04) + if: ${{ matrix.llvm < 14 }} + uses: docker/build-push-action@v3 + with: + push: false + build-args: | + LLVM_VERSION=${{ matrix.llvm }} + VERSION=20.04 + SHORTNAME=focal + file: ./.github/docker/Dockerfile.ubuntu + tags: build_container + - name: Build container (22.04) + if: ${{ matrix.llvm >= 14 }} + uses: docker/build-push-action@v3 + with: + push: false + build-args: | + LLVM_VERSION=${{ matrix.llvm }} + VERSION=22.04 + SHORTNAME=jammy + file: ./.github/docker/Dockerfile.ubuntu + tags: build_container + - name: Build examples/c + run: | + docker run \ + -v $(pwd):/libbpf-bootstrap \ + build_container \ + /bin/bash -c \ + 'cd /libbpf-bootstrap/examples/c && make -j`nproc`' + - name: Build examples/rust + run: | + docker run \ + -v $(pwd):/libbpf-bootstrap \ + build_container \ + /bin/bash -c \ + 'cd /libbpf-bootstrap/examples/rust && cargo build' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..12337c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +/build +/examples/c/build +/examples/c/.xmake +/examples/.vscode +/.idea +/.clang-format +/.vscode + diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..5cbb06a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "libbpf"] + path = libbpf + url = https://github.com/libbpf/libbpf.git +[submodule "bpftool"] + path = bpftool + url = https://github.com/libbpf/bpftool +[submodule "blazesym"] + path = blazesym + url = https://github.com/libbpf/blazesym.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..47fc3a4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2020, Andrii Nakryiko +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 9aeed84..0142dfd 100644 --- a/README.md +++ b/README.md @@ -1 +1,66 @@ -# libbpf-bootstrap-android \ No newline at end of file +# libbpf-bootstrap-android +--- +layout: post +title: libbpf-bootstrap-android +date: 2023-9-14 16:18 +category: Framework +author: JiaHuann +tags: [Android, ebpf-framework, cross-compile] +summary: For amd64 aarch machine to directly using libbpf-bootstrap framwork to write ebpf programs both kernel and user space.And you don't need to have `CONFIG_BTF_DEBUG_INFO` support by using externel BTF file in BTFhubForAndroid instead.For this goal,I did some changes on libbpf-bootstrap,and have done some embedded features.Wish this can help you sth.Best regards. +--- + +# Libbpf-bootstrap for android +> For amd64 aarch machine to directly using libbpf-bootstrap framwork to write ebpf programs both kernel and user space.And you don't need to have `CONFIG_BTF_DEBUG_INFO` support by using externel BTF file in BTFhubForAndroid instead.For this goal,I did some changes on libbpf-bootstrap,and have done some embedded features.Wish this can help you sth.Best regards. +## upstream: +- https://github.com/libbpf/libbpf-bootstrap +- https://github.com/SeeFlowerX/BTFHubForAndroid + +## prerare +- Android NDK +- gcc-aarch64-linux-gnu +- Android phone with root and unlock BL + +## usage +- deps +```shell +https://github.com/JiaHuann/libbpf-bootstrap-android +cd libbpf-bootstrap-android +sudo apt install gcc-aarch64-linux-gnu llvm clang +wget https://dl.google.com/android/repository/android-ndk-r25c-linux.zip?hl=zh-cn android-ndk-r25c-linux.zip +unzip android-ndk-r25c-linux +``` +- set NDK env to `$PATH` +```shell +vim ~/.bashrc +export your android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin to PATH +``` + +- compile and push to phone +``` +cd examples/c && make + +adb devices +adb remount # may fail, you can leave with issure. +adb push examples/c/btf_file/* example/c/your_executable_file /data/local/tmp +adb shell #into android kernel shell +``` +- in android shell +```shell +cd /data/local/tmp && chmod +x your_excutable_file +./run +Congratulations! +``` + + +# feature +- libelf,libz on aarcj64 embedded. +- x86 -> android13(aarch64) cross-compile you can directly write ebpf both kernel-program and user-program on x86 machine. +- FlameGraph embedded to monitor performance. +- For None BTF/vmlinux android-kernel(CONFIG_DEBUG_INFO_BTF not set) support. +- adb debug (after compiling&linking, directly push into android-phone) embedded. + +# RoadMap: +- change the static link to ShareLib. +- Measure the eBPF program's overhead by FlameGraph. +- Add more Android features into support. +- Test for lower Android version. diff --git a/blazesym/.cargo/config b/blazesym/.cargo/config new file mode 100644 index 0000000..e25818a --- /dev/null +++ b/blazesym/.cargo/config @@ -0,0 +1,2 @@ +[target.x86_64-unknown-linux-gnu] +runner = "sudo --preserve-env" diff --git a/blazesym/.gitattributes b/blazesym/.gitattributes new file mode 100644 index 0000000..113ad5d --- /dev/null +++ b/blazesym/.gitattributes @@ -0,0 +1 @@ +data/vmlinux-5.17.12-100.fc34.x86_64.xz filter=lfs diff=lfs merge=lfs -text diff --git a/blazesym/.gitignore b/blazesym/.gitignore new file mode 100644 index 0000000..b3f3ae8 --- /dev/null +++ b/blazesym/.gitignore @@ -0,0 +1,9 @@ +/data/*.bin +/data/*.gsym +/data/*.so +/data/*.zip +/data/kallsyms +/data/vmlinux-5.17.12-100.fc34.x86_64* +/data/zip-dir +/target +Cargo.lock diff --git a/blazesym/.rustfmt.toml b/blazesym/.rustfmt.toml new file mode 100644 index 0000000..3d155a1 --- /dev/null +++ b/blazesym/.rustfmt.toml @@ -0,0 +1,3 @@ +blank_lines_upper_bound = 2 +imports_granularity = "item" +trailing_semicolon = false diff --git a/blazesym/CHANGELOG.md b/blazesym/CHANGELOG.md new file mode 100644 index 0000000..7ed57c2 --- /dev/null +++ b/blazesym/CHANGELOG.md @@ -0,0 +1,25 @@ +0.2.0-alpha.2 +------------- +- Added `extern "C"` guards in `blazesym.h` header for easy of use from C++ code +- Added unused member variable to `blaze_user_addr_meta_unknown` type for + compliance with C standard, stating undefined behavior for empty structs +- Changed `blaze_inspect_elf_src::path` type to `*const _` +- Fixed incorrect `NULL` checks when working with `blaze_symbolize_src_kernel` + objects +- Switched away from using Git LFS for large benchmark files towards + on-demand downloading from a different repository, controlled by + `generate-bench-files` feature + + +0.2.0-alpha.1 +------------- +- Removed no longer necessary `base_address` member from various types +- Renamed `SymInfo::address` member to `addr` +- Fixed incorrect allocation size calculation in C API +- Fixed file offset lookup potentially reporting subtly wrong offsets on + certain ELF file segment constellations + + +0.2.0-alpha.0 +------------- +- Initial documented release diff --git a/blazesym/Cargo.toml b/blazesym/Cargo.toml new file mode 100644 index 0000000..4909824 --- /dev/null +++ b/blazesym/Cargo.toml @@ -0,0 +1,79 @@ +[package] +name = "blazesym" +description = "blazesym is a library that can be used for address symbolization and more." +version = "0.2.0-alpha.2" +edition = "2021" +rust-version = "1.63" +authors = ["Daniel Müller ", "Kui-Feng "] +license-file = "LICENSE" +repository = "https://github.com/libbpf/blazesym" +readme = "README.md" +categories = [ + "algorithms", + "api-bindings", + "development-tools::debugging", + "os::unix-apis", + "value-formatting", +] +keywords = [ + "dwarf", + "elf", + "gsym", + "stacktrace", + "tracing", +] +exclude = ["data/dwarf-example", "data/kallsyms.xz"] +autobenches = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +name = "blazesym" +crate-type = ["cdylib", "rlib", "staticlib"] + +[features] +default = ["lru"] +# Enable this feature to re-generate the library's C header file. An +# up-to-date version of this header should already be available in the +# include/ directory, so this feature is only necessary when APIs are +# changed. +generate-c-header = ["cbindgen", "which"] +# Enable this feature to opt in to the generation of test files. Having test +# files created is necessary for running tests. +generate-test-files = ["xz2", "zip"] +# Enable this feature to opt in to the generation of benchmark files. +# This feature is required for some of the benchmarks. Note that git-lfs +# needs to be installed in this case. +generate-bench-files = ["reqwest", "xz2"] +# Disable generation of test files. This feature takes preference over +# `generate-test-files`. +dont-generate-test-files = [] +# Enable code paths requiring a nightly toolchain. This feature is only meant to +# be used for testing and benchmarking purposes, not for the core library, which +# is expected to work on stable. +nightly = [] + +[[bench]] +name = "main" +harness = false + +[dependencies] +libc = "0.2.137" +log = {version = "0.4.17", optional = true} +lru = {version = "0.10", optional = true} + +[dev-dependencies] +anyhow = "1.0.71" +blazesym = {path = ".", features = ["generate-test-files", "log"]} +criterion = "0.4" +env_logger = "0.10" +tempfile = "3.4" +test-log = "0.2" + +[build-dependencies] +cbindgen = {version = "0.24", optional = true} +libc = "0.2.137" +reqwest = {version = "0.11.18", optional = true, features = ["blocking"]} +xz2 = {version = "0.1.7", optional = true} +which = {version = "4.4.0", optional = true} +zip = {version = "0.6.4", optional = true, default-features = false} diff --git a/blazesym/LICENSE b/blazesym/LICENSE new file mode 100644 index 0000000..a7c1bbc --- /dev/null +++ b/blazesym/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2022, Kuifeng Lee +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/blazesym/README.md b/blazesym/README.md new file mode 100644 index 0000000..0064c3f --- /dev/null +++ b/blazesym/README.md @@ -0,0 +1,93 @@ +[![pipeline](https://github.com/libbpf/blazesym/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/libbpf/blazesym/actions/workflows/test.yml) +[![coverage](https://codecov.io/gh/libbpf/blazesym/branch/main/graph/badge.svg)](https://codecov.io/gh/libbpf/blazesym) +[![crates.io](https://img.shields.io/crates/v/blazesym.svg)](https://crates.io/crates/blazesym) +[![Docs](https://docs.rs/blazesym/badge.svg)](https://docs.rs/blazesym) +[![rustc](https://img.shields.io/badge/rustc-1.63+-blue.svg)](https://blog.rust-lang.org/2022/08/11/Rust-1.63.0.html) + +# blazesym + +- [Changelog](CHANGELOG.md) + +**blazesym** is a library that can be used to symbolize addresses. Address +symbolization is a common problem in tracing contexts, for example, where users +want to reason about functions by name, but low level components report only the +"raw" addresses (e.g., in the form of stacktraces). + +In addition to symbolization, **blazesym** also provides APIs for the reverse +operation: looking up addresses from symbol names. That can be useful, for +example, for configuring breakpoints or tracepoints. + +The library aims to provide a "batteries-included" experience. That is to say, +it tries to do the expected thing by default. When offering such convenience +comes at the cost of performance, we aim to provide advanced APIs that allow for +runtime configuration of the corresponding features. + +The library is written in Rust and provides a first class C API. This crate +adheres to Cargo's [semantic versioning rules][cargo-semver]. At a minimum, it +builds with the most recent Rust stable release minus five minor versions ("N - +5"). E.g., assuming the most recent Rust stable is `1.68`, the crate is +guaranteed to build with `1.63` and higher. + + +## Status +**blazesym** is being actively worked on. Feel free to contribute with +discussions, feature suggestions, or code contributions! + +Here is rough roadmap of currently planned features (in no particular order): + +- [ ] Fully support handling of kernel addresses + - currently normalization APIs, for example, only support user space addresses +- [ ] Optimize normalization logic with more aggressive caching +- [ ] Switch to using [`gimli`](https://crates.io/crates/gimli) for DWARF parsing + - doing so will allow us to: + - [ ] Support more versions of the DWARF standard (https://github.com/libbpf/blazesym/issues/42 & https://github.com/libbpf/blazesym/issues/57) + - [ ] Support split debug information (https://github.com/libbpf/blazesym/issues/60) +- [ ] Support symbolization of addresses in APKs (relevant for Android) +- [ ] Support ELF32 binaries (https://github.com/libbpf/blazesym/issues/53) +- [ ] Support demangling of Rust & C++ symbol names (https://github.com/libbpf/blazesym/issues/50) +- [ ] Support remote symbolization (https://github.com/libbpf/blazesym/issues/61) + - [x] Add APIs for address normalization (https://github.com/libbpf/blazesym/pull/114, https://github.com/libbpf/blazesym/pull/128, ...) +- [ ] Support advanced symbolization use cases involving [`debuginfod`](https://sourceware.org/elfutils/Debuginfod.html) + + +## Build & Use +**blazesym** requires a standard Rust toolchain and can be built using the Cargo +project manager (e.g., `cargo build`). + +### Rust +Consumption from a Rust project should happen via `Cargo.toml`: +```toml +[dependencies] +blazesym = "0.2.0-alpha.2" +``` + +For a quick set of examples please refer to the [`examples/` folder](examples/). +Please refer to the [documentation](https://docs.rs/blazesym) for a +comprehensive explanation of individual types and functions. + + +### C +For C interoperability, the aforementioned build will produce `libblazesym.a` as +well as `libblazesym.so` in the respective target folder (e.g., +`/target/debug/`). + +In your C programs include [`blazesym.h`](include/blazesym.h) (provided as part +of the library) from your source code and then link against the static or shared +library, respectively. When linking statically, you may also need to link: +```text +-lrt -ldl -lpthread -lm +``` + +An example of usage of the C API is in available in **libbpf-bootstrap**: + + +This example periodically samples the running process of every processor +in a system and prints their stack traces. + +A detailed [documentation of the C API](https://docs.rs/blazesym/latest/blazesym/c_api) +is available as part of the Rust documentation or can be generated locally from +the current repository snapshot using `cargo doc` (grouped under the `c_api` +module). + + +[cargo-semver]: https://doc.rust-lang.org/cargo/reference/resolver.html#semver-compatibility diff --git a/blazesym/benches/inspect.rs b/blazesym/benches/inspect.rs new file mode 100644 index 0000000..ce7a408 --- /dev/null +++ b/blazesym/benches/inspect.rs @@ -0,0 +1,38 @@ +use std::path::Path; + +use blazesym::inspect; +use blazesym::inspect::Inspector; + +use criterion::measurement::Measurement; +use criterion::BenchmarkGroup; + + +/// Lookup an address in a DWARF file, end-to-end, i.e., including all necessary +/// setup. +fn lookup_dwarf() { + let dwarf_vmlinux = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("vmlinux-5.17.12-100.fc34.x86_64"); + let src = inspect::Source::Elf(inspect::Elf::new(dwarf_vmlinux)); + + let inspector = Inspector::new(); + let results = inspector + .lookup(&["abort_creds"], &src) + .unwrap() + .into_iter() + .flatten() + .collect::>(); + assert_eq!(results.len(), 1); + + let result = results.first().unwrap(); + assert_eq!(result.addr, 0xffffffff8110ecb0); +} + +pub fn benchmark(group: &mut BenchmarkGroup<'_, M>) +where + M: Measurement, +{ + if cfg!(feature = "generate-bench-files") { + group.bench_function(stringify!(inspect::lookup_dwarf), |b| b.iter(lookup_dwarf)); + } +} diff --git a/blazesym/benches/main.rs b/blazesym/benches/main.rs new file mode 100644 index 0000000..fcacc21 --- /dev/null +++ b/blazesym/benches/main.rs @@ -0,0 +1,26 @@ +#![allow(clippy::let_and_return, clippy::let_unit_value)] + +mod inspect; +mod normalize; +mod symbolize; + +use std::time::Duration; + +use criterion::criterion_group; +use criterion::criterion_main; +use criterion::Criterion; + + +fn benchmark(c: &mut Criterion) { + let mut group = c.benchmark_group("main"); + group.sample_size(500); + group.warm_up_time(Duration::from_secs(5)); + group.confidence_level(0.98); + group.significance_level(0.02); + inspect::benchmark(&mut group); + normalize::benchmark(&mut group); + symbolize::benchmark(&mut group); +} + +criterion_group!(benches, benchmark); +criterion_main!(benches); diff --git a/blazesym/benches/normalize.rs b/blazesym/benches/normalize.rs new file mode 100644 index 0000000..c18f78f --- /dev/null +++ b/blazesym/benches/normalize.rs @@ -0,0 +1,34 @@ +use blazesym::c_api; +use blazesym::normalize::Normalizer; +use blazesym::Addr; + +use criterion::measurement::Measurement; +use criterion::BenchmarkGroup; + + +/// Normalize addresses in the current process. +fn normalize_process() { + let mut addrs = [ + libc::__errno_location as Addr, + libc::dlopen as Addr, + libc::fopen as Addr, + normalize_process as Addr, + c_api::blaze_inspector_free as Addr, + ]; + let () = addrs.sort(); + + let normalizer = Normalizer::new(); + let norm_addrs = normalizer + .normalize_user_addrs_sorted(addrs.as_slice(), 0.into()) + .unwrap(); + assert_eq!(norm_addrs.addrs.len(), 5); +} + +pub fn benchmark(group: &mut BenchmarkGroup<'_, M>) +where + M: Measurement, +{ + group.bench_function(stringify!(normalize::normalize_process), |b| { + b.iter(normalize_process) + }); +} diff --git a/blazesym/benches/symbolize.rs b/blazesym/benches/symbolize.rs new file mode 100644 index 0000000..7cc9182 --- /dev/null +++ b/blazesym/benches/symbolize.rs @@ -0,0 +1,89 @@ +use std::path::Path; + +use blazesym::c_api; +use blazesym::symbolize::Elf; +use blazesym::symbolize::Gsym; +use blazesym::symbolize::Process; +use blazesym::symbolize::Source; +use blazesym::symbolize::Symbolizer; +use blazesym::Addr; +use blazesym::Pid; + +use criterion::measurement::Measurement; +use criterion::BenchmarkGroup; + + +/// Symbolize addresses in the current process. +fn symbolize_process() { + let src = Source::Process(Process::new(Pid::Slf)); + let addrs = [ + libc::__errno_location as Addr, + libc::dlopen as Addr, + libc::fopen as Addr, + symbolize_process as Addr, + c_api::blaze_inspector_free as Addr, + ]; + + let symbolizer = Symbolizer::new(); + let results = symbolizer.symbolize(&src, &addrs).unwrap(); + assert_eq!(results.len(), addrs.len()); +} + +/// Symbolize an address in a DWARF file, end-to-end, i.e., including all +/// necessary setup. +fn symbolize_dwarf() { + let dwarf_vmlinux = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("vmlinux-5.17.12-100.fc34.x86_64"); + let src = Source::Elf(Elf::new(dwarf_vmlinux)); + let symbolizer = Symbolizer::new(); + + let results = symbolizer + .symbolize(&src, &[0xffffffff8110ecb0]) + .unwrap() + .into_iter() + .flatten() + .collect::>(); + assert_eq!(results.len(), 1); + + let result = results.first().unwrap(); + assert_eq!(result.symbol, "abort_creds"); +} + +/// Symbolize an address in a GSYM file, end-to-end, i.e., including all +/// necessary setup. +fn symbolize_gsym() { + let gsym_vmlinux = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("vmlinux-5.17.12-100.fc34.x86_64.gsym"); + let src = Source::Gsym(Gsym::new(gsym_vmlinux)); + let symbolizer = Symbolizer::new(); + + let results = symbolizer + .symbolize(&src, &[0xffffffff8110ecb0]) + .unwrap() + .into_iter() + .flatten() + .collect::>(); + assert_eq!(results.len(), 1); + + let result = results.first().unwrap(); + assert_eq!(result.symbol, "abort_creds"); +} + +pub fn benchmark(group: &mut BenchmarkGroup<'_, M>) +where + M: Measurement, +{ + group.bench_function(stringify!(symbolize::symbolize_process), |b| { + b.iter(symbolize_process) + }); + if cfg!(feature = "generate-bench-files") { + group.bench_function(stringify!(symbolize::symbolize_dwarf), |b| { + b.iter(symbolize_dwarf) + }); + group.bench_function(stringify!(symbolize::symbolize_gsym), |b| { + b.iter(symbolize_gsym) + }); + } +} diff --git a/blazesym/build.rs b/blazesym/build.rs new file mode 100644 index 0000000..145cb43 --- /dev/null +++ b/blazesym/build.rs @@ -0,0 +1,444 @@ +use std::env; +use std::ffi::OsStr; +use std::ffi::OsString; +use std::fs::copy; +use std::fs::create_dir_all; +use std::fs::hard_link; +use std::io::Error; +use std::io::ErrorKind; +use std::io::Result; +use std::ops::Deref as _; +use std::path::Path; +use std::path::PathBuf; +use std::process::Command; +use std::process::Stdio; + + +/// Retrieve the system's page size. +fn page_size() -> Result { + // SAFETY: `sysconf` is always safe to call. + let rc = unsafe { libc::sysconf(libc::_SC_PAGE_SIZE) }; + if rc < 0 { + return Err(Error::new( + ErrorKind::Other, + format!("failed to retrieve page size: {}", Error::last_os_error()), + )) + } + Ok(usize::try_from(rc).unwrap()) +} + + +/// Format a command with the given list of arguments as a string. +fn format_command(command: C, args: A) -> String +where + C: AsRef, + A: IntoIterator, + S: AsRef, +{ + args.into_iter().fold( + command.as_ref().to_string_lossy().into_owned(), + |mut cmd, arg| { + cmd += " "; + cmd += arg.as_ref().to_string_lossy().deref(); + cmd + }, + ) +} + +/// Run a command with the provided arguments. +fn run(command: C, args: A) -> Result<()> +where + C: AsRef, + A: IntoIterator + Clone, + S: AsRef, +{ + let instance = Command::new(command.as_ref()) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .args(args.clone()) + .output() + .map_err(|err| { + Error::new( + ErrorKind::Other, + format!( + "failed to run `{}`: {err}", + format_command(command.as_ref(), args.clone()) + ), + ) + })?; + + if !instance.status.success() { + let code = if let Some(code) = instance.status.code() { + format!(" ({code})") + } else { + " (terminated by signal)".to_string() + }; + + let stderr = String::from_utf8_lossy(&instance.stderr); + let stderr = stderr.trim_end(); + let stderr = if !stderr.is_empty() { + format!(": {stderr}") + } else { + String::new() + }; + + Err(Error::new( + ErrorKind::Other, + format!( + "`{}` reported non-zero exit-status{code}{stderr}", + format_command(command, args) + ), + )) + } else { + Ok(()) + } +} + +/// Compile `src` into `dst` using the provided compiler. +fn compile(compiler: &str, src: &Path, dst: &str, options: &[&str]) { + let dst = src.with_file_name(dst); + println!("cargo:rerun-if-changed={}", src.display()); + println!("cargo:rerun-if-changed={}", dst.display()); + + run( + compiler, + options + .iter() + .map(OsStr::new) + .chain([src.as_os_str(), "-o".as_ref(), dst.as_os_str()]), + ) + .unwrap_or_else(|err| panic!("failed to run `{compiler}`: {err}")) +} + +/// Compile `src` into `dst` using `cc`. +fn cc(src: &Path, dst: &str, options: &[&str]) { + compile("cc", src, dst, options) +} + +/// Convert debug information contained in `src` into GSYM in `dst` using +/// `llvm-gsymutil`. +fn gsym(src: &Path, dst: impl AsRef) { + let dst = src.with_file_name(dst); + println!("cargo:rerun-if-changed={}", src.display()); + println!("cargo:rerun-if-changed={}", dst.display()); + + let gsymutil = env::var_os("LLVM_GSYMUTIL").unwrap_or_else(|| OsString::from("llvm-gsymutil")); + + run( + gsymutil, + ["--convert".as_ref(), src, "--out-file".as_ref(), &dst], + ) + .expect("failed to run `llvm-gsymutil`") +} + +/// Strip all non-debug information from an ELF binary, in an attempt to +/// leave only DWARF remains and necessary ELF bits. +fn dwarf_mostly(src: &Path, dst: &str) { + let dst = src.with_file_name(dst); + println!("cargo:rerun-if-changed={}", src.display()); + println!("cargo:rerun-if-changed={}", dst.display()); + + let _bytes = copy(src, &dst).expect("failed to copy file"); + + run("strip", ["--only-keep-debug".as_ref(), dst.as_os_str()]).expect("failed to run `strip`") +} + +/// Unpack an xz compressed file. +#[cfg(feature = "xz2")] +fn unpack_xz(src: &Path, dst: &Path) { + use std::fs::File; + use std::io::copy; + use xz2::read::XzDecoder; + + println!("cargo:rerun-if-changed={}", src.display()); + println!("cargo:rerun-if-changed={}", dst.display()); + + let src_file = File::options().create(false).read(true).open(src).unwrap(); + let mut decoder = XzDecoder::new_multi_decoder(src_file); + + let mut dst_file = File::options() + .create(true) + .truncate(true) + .read(false) + .write(true) + .open(dst) + .unwrap(); + + copy(&mut decoder, &mut dst_file).unwrap(); +} + +#[cfg(not(feature = "xz2"))] +fn unpack_xz(_src: &Path, _dst: &Path) { + unimplemented!() +} + + +/// Put files in a zip archive, uncompressed. +#[cfg(feature = "zip")] +fn zip(files: &[PathBuf], dst: &Path) { + use std::fs::read as read_file; + use std::fs::File; + use std::io::Write as _; + use zip::write::FileOptions; + use zip::CompressionMethod; + use zip::ZipWriter; + + let dst_file = File::options() + .create(true) + .truncate(true) + .read(false) + .write(true) + .open(dst) + .unwrap(); + let dst_dir = dst.parent().unwrap(); + + let page_size = page_size().unwrap(); + let options = FileOptions::default().compression_method(CompressionMethod::Stored); + let mut zip = ZipWriter::new(dst_file); + for file in files { + let contents = read_file(file).unwrap(); + let path = file.strip_prefix(dst_dir).unwrap(); + // Ensure that members are page aligned so that they can be + // mmap'ed directly. + let _align = zip + .start_file_aligned( + path.to_str().unwrap(), + options, + page_size.try_into().unwrap(), + ) + .unwrap(); + let _count = zip.write(&contents).unwrap(); + } + + for file in files { + println!("cargo:rerun-if-changed={}", file.display()); + } + println!("cargo:rerun-if-changed={}", dst.display()); +} + +#[cfg(not(feature = "zip"))] +fn zip(_files: &[PathBuf], _dst: &Path) { + let _page_size = page_size(); + unimplemented!() +} + + +/// Prepare the various test files. +fn prepare_test_files(crate_root: &Path) { + let src = crate_root.join("data").join("test-so.c"); + cc( + &src, + "libtest-so.so", + &["-shared", "-fPIC", "-Wl,--build-id=sha1"], + ); + cc( + &src, + "libtest-so-no-separate-code.so", + &["-shared", "-fPIC", "-Wl,-z,noseparate-code"], + ); + + let src = crate_root.join("data").join("test-exe.c"); + cc(&src, "test-no-debug.bin", &["-g0", "-Wl,--build-id=none"]); + cc(&src, "test-dwarf-v4.bin", &["-gdwarf-4"]); + cc(&src, "test-dwarf-v5.bin", &["-gdwarf-5"]); + + let src = crate_root.join("data").join("test-stable-addresses.c"); + let src_cu2 = crate_root.join("data").join("test-stable-addresses-cu2.c"); + let src_cu2 = src_cu2.to_str().unwrap(); + let ld_script = crate_root.join("data").join("test-stable-addresses.ld"); + let ld_script = ld_script.to_str().unwrap(); + println!("cargo:rerun-if-changed={ld_script}"); + cc( + &src, + "test-stable-addresses.bin", + &[ + "-gdwarf-4", + "-T", + ld_script, + "-Wl,--build-id=none", + "-O0", + "-nostdlib", + // TODO: Eventually we may want to make `cc` multi-input-file aware. + src_cu2, + ], + ); + cc( + &src, + "test-stable-addresses-no-dwarf.bin", + &[ + "-g0", + "-T", + ld_script, + "-Wl,--build-id=none", + "-O0", + "-nostdlib", + // TODO: Eventually we may want to make `cc` multi-input-file aware. + src_cu2, + ], + ); + + let src = crate_root.join("data").join("test-stable-addresses.bin"); + gsym(&src, "test.gsym"); + dwarf_mostly(&src, "test-dwarf.bin"); + + let src = crate_root.join("data").join("kallsyms.xz"); + let mut dst = src.clone(); + assert!(dst.set_extension("")); + unpack_xz(&src, &dst); + + let () = create_dir_all(crate_root.join("data").join("zip-dir")).unwrap(); + let () = hard_link( + crate_root.join("data").join("test-no-debug.bin"), + crate_root + .join("data") + .join("zip-dir") + .join("test-no-debug.bin"), + ) + .or_else(|err| { + if err.kind() == ErrorKind::AlreadyExists { + Ok(()) + } else { + Err(err) + } + }) + .unwrap(); + + let files = [ + crate_root.join("data").join("test-dwarf.bin"), + crate_root + .join("data") + .join("zip-dir") + .join("test-no-debug.bin"), + crate_root.join("data").join("libtest-so.so"), + ]; + let dst = crate_root.join("data").join("test.zip"); + zip(files.as_slice(), &dst); +} + +/// Download a multi-part file split into `part_count` pieces. +#[cfg(feature = "reqwest")] +fn download_multi_part(base_url: &reqwest::Url, part_count: usize, dst: &Path) { + use std::fs::File; + use std::io::Write as _; + + let mut dst = File::create(dst).unwrap(); + for part in 1..=part_count { + let url = reqwest::Url::parse(&format!("{}.part{part}", base_url.as_str())).unwrap(); + let response = reqwest::blocking::get(url).unwrap(); + let _count = dst.write(&response.bytes().unwrap()).unwrap(); + } +} + +/// Download large benchmark related files for later use. +#[cfg(feature = "reqwest")] +fn download_bench_files(crate_root: &Path) { + use reqwest::Url; + + let large_file_url = + Url::parse("https://github.com/danielocfb/blazesym-data/raw/main/").unwrap(); + let file = "vmlinux-5.17.12-100.fc34.x86_64.xz"; + + download_multi_part( + &large_file_url.join(file).unwrap(), + 2, + &crate_root.join("data").join(file), + ); +} + +#[cfg(not(feature = "reqwest"))] +fn download_bench_files(_crate_root: &Path) { + unimplemented!() +} + +/// Prepare benchmark files. +fn prepare_bench_files(crate_root: &Path) { + let vmlinux = Path::new(crate_root) + .join("data") + .join("vmlinux-5.17.12-100.fc34.x86_64.xz"); + + let mut dst = vmlinux.clone(); + assert!(dst.set_extension("")); + unpack_xz(&vmlinux, &dst); + + let src = dst.clone(); + let mut dst = vmlinux; + assert!(dst.set_extension("gsym")); + let dst = dst.file_name().unwrap(); + gsym(&src, dst); +} + +fn main() { + let crate_dir = env!("CARGO_MANIFEST_DIR"); + + if cfg!(feature = "generate-test-files") && !cfg!(feature = "dont-generate-test-files") { + prepare_test_files(crate_dir.as_ref()); + } + + if cfg!(feature = "generate-bench-files") { + download_bench_files(crate_dir.as_ref()); + prepare_bench_files(crate_dir.as_ref()); + } + + #[cfg(feature = "generate-c-header")] + { + use std::fs::write; + + cbindgen::Builder::new() + .with_crate(crate_dir) + .with_config(cbindgen::Config::from_root_or_default(crate_dir)) + .generate() + .expect("Unable to generate bindings") + .write_to_file(Path::new(crate_dir).join("include").join("blazesym.h")); + + // Generate a C program that just included blazesym.h as a basic + // smoke test that cbindgen didn't screw up completely. + let out_dir = env::var_os("OUT_DIR").unwrap(); + let out_dir = Path::new(&out_dir); + let blaze_src_c = out_dir.join("blazesym.c"); + let () = write( + &blaze_src_c, + r#" +#include + +int main() { + return 0; +} +"#, + ) + .unwrap(); + + let blaze_src_cxx = out_dir.join("blazesym.cpp"); + let _bytes = copy(&blaze_src_c, &blaze_src_cxx).expect("failed to copy file"); + + cc( + &blaze_src_c, + "blazesym.bin", + &[ + "-Wall", + "-Wextra", + "-Werror", + "-I", + Path::new(crate_dir).join("include").to_str().unwrap(), + ], + ); + + // Best-effort check that C++ can compile the thing as well. Hopefully + // all flags are supported... + for cxx in ["clang++", "g++"] { + if which::which(cxx).is_ok() { + compile( + cxx, + &blaze_src_cxx, + &format!("blazesym_cxx_{cxx}.bin"), + &[ + "-Wall", + "-Wextra", + "-Werror", + "-I", + Path::new(crate_dir).join("include").to_str().unwrap(), + ], + ); + } + } + } +} diff --git a/blazesym/cbindgen.toml b/blazesym/cbindgen.toml new file mode 100644 index 0000000..b7d9f64 --- /dev/null +++ b/blazesym/cbindgen.toml @@ -0,0 +1,33 @@ +# See https://github.com/eqrion/cbindgen/blob/master/docs.md#cbindgentoml + +language = "C" +cpp_compat = true +include_guard = "__blazesym_h_" +usize_is_size_t = true + +[export] +item_types = ["globals", "enums", "structs", "unions", "typedefs", "opaque", "functions"] +exclude = ["Addr"] + +[export.rename] +"Addr" = "uintptr_t" +"Inspector" = "blaze_inspector" +"Normalizer" = "blaze_normalizer" +"Symbolizer" = "blaze_symbolizer" + +[fn] +args = "Vertical" +rename_args = "none" + +[struct] +associated_constants_in_body = true +derive_eq = true +derive_ostream = true + +[enum] +add_sentinel = false +derive_helper_methods = true +derive_ostream = true + +[macro_expansion] +bitflags = true diff --git a/blazesym/codecov.yml b/blazesym/codecov.yml new file mode 100644 index 0000000..77707aa --- /dev/null +++ b/blazesym/codecov.yml @@ -0,0 +1,2 @@ +github_checks: + annotations: false diff --git a/blazesym/data/dwarf-example b/blazesym/data/dwarf-example new file mode 100755 index 0000000..6e8be8c Binary files /dev/null and b/blazesym/data/dwarf-example differ diff --git a/blazesym/data/kallsyms.xz b/blazesym/data/kallsyms.xz new file mode 100644 index 0000000..780f40d Binary files /dev/null and b/blazesym/data/kallsyms.xz differ diff --git a/blazesym/data/test-exe.c b/blazesym/data/test-exe.c new file mode 100644 index 0000000..741442f --- /dev/null +++ b/blazesym/data/test-exe.c @@ -0,0 +1,22 @@ +/* + * The sample program is used to generate test.bin. + */ + +#include + +static +unsigned int fibonacci(unsigned int n) { + if (n <= 1) + return n; + return fibonacci(n - 1) + fibonacci(n - 2); +} + +int +main() { + int i; + printf("calculate fibonacci(n); n = "); + scanf("%d", &i); + + printf("fibonacci(%d) = %d\n", i, fibonacci(i)); + return 0; +} diff --git a/blazesym/data/test-so.c b/blazesym/data/test-so.c new file mode 100644 index 0000000..637ad79 --- /dev/null +++ b/blazesym/data/test-so.c @@ -0,0 +1,3 @@ +int the_answer(void) { + return 42; +} diff --git a/blazesym/data/test-so.h b/blazesym/data/test-so.h new file mode 100644 index 0000000..c92148c --- /dev/null +++ b/blazesym/data/test-so.h @@ -0,0 +1,6 @@ +#ifndef _TEST_SO_H +#define _TEST_SO_H + +int the_answer(void); + +#endif diff --git a/blazesym/data/test-stable-addresses-cu2.c b/blazesym/data/test-stable-addresses-cu2.c new file mode 100644 index 0000000..57cc51e --- /dev/null +++ b/blazesym/data/test-stable-addresses-cu2.c @@ -0,0 +1,10 @@ +extern unsigned int factorial(unsigned int n); + +__attribute__((noinline)) static void +factorial_wrapper() { + factorial(5); +} + +void foo(void) { + factorial_wrapper(); +} diff --git a/blazesym/data/test-stable-addresses.c b/blazesym/data/test-stable-addresses.c new file mode 100644 index 0000000..36edc84 --- /dev/null +++ b/blazesym/data/test-stable-addresses.c @@ -0,0 +1,39 @@ +/* The sample program is used to generate test.gsym. + * + * Chosen functions are placed in dedicated sections to allow for control placement. + */ +extern void foo(void); + +__attribute__((section(".text.factorial"))) unsigned int +factorial(unsigned int n) { + if (n == 0) + return 1; + return factorial(n - 1) * n; +} + +__attribute__((noinline)) static void +factorial_wrapper() { + factorial(5); +} + +// A dummy function that should not actually be called. It just contains a bunch +// of signature bytes that we use for offset verification later on. +asm( + ".globl dummy\n" + ".type dummy, @function\n" + "dummy:\n" + ".byte 0xde\n" + ".byte 0xad\n" + ".byte 0xbe\n" + ".byte 0xef\n" +); + +extern void dummy(void); + +__attribute__((section(".text.main"))) int +main(int argc, const char *argv[]) { + factorial_wrapper(); + foo(); + dummy(); + return 0; +} diff --git a/blazesym/data/test-stable-addresses.ld b/blazesym/data/test-stable-addresses.ld new file mode 100644 index 0000000..1020af9 --- /dev/null +++ b/blazesym/data/test-stable-addresses.ld @@ -0,0 +1,40 @@ +SECTIONS { + .text (0x2000000) : { + *(.text.main) + *(.text) + . = ABSOLUTE(0x2000100); + *(.text.factorial) + } + .data : { + *(.data) + } + .bss : { + *(.bss) + } + + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. + */ + /* DWARF 1. */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions. */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2. */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2. */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + + /DISCARD/ : { + *(.*) + } +} diff --git a/blazesym/examples/addr2ln.rs b/blazesym/examples/addr2ln.rs new file mode 100644 index 0000000..2f4ebcf --- /dev/null +++ b/blazesym/examples/addr2ln.rs @@ -0,0 +1,46 @@ +use std::env; + +use anyhow::bail; +use anyhow::Context as _; +use anyhow::Result; + +use blazesym::symbolize::Elf; +use blazesym::symbolize::Source; +use blazesym::symbolize::Symbolizer; +use blazesym::Addr; + +fn main() -> Result<()> { + let args = env::args().collect::>(); + + if args.len() != 3 { + bail!( + "Usage: {}
", + args.first().map(String::as_str).unwrap_or("addr2ln_pid") + ); + } + + let bin_name = &args[1]; + let addr_str = &args[2][..]; + let src = Source::Elf(Elf::new(bin_name)); + let symbolizer = Symbolizer::new(); + + let addr = Addr::from_str_radix(addr_str.trim_start_matches("0x"), 16) + .with_context(|| format!("failed to parse address: {addr_str}"))?; + + let results = symbolizer + .symbolize(&src, &[addr]) + .with_context(|| format!("failed to symbolize address 0x{addr:x}"))?; + if results.len() == 1 && !results[0].is_empty() { + let result = &results[0][0]; + println!( + "0x{addr:x} @ {} {}:{}", + result.symbol, + result.path.display(), + result.line + ); + } else { + println!("0x{addr:x} is not found"); + } + + Ok(()) +} diff --git a/blazesym/examples/addr2ln_pid.rs b/blazesym/examples/addr2ln_pid.rs new file mode 100644 index 0000000..546d426 --- /dev/null +++ b/blazesym/examples/addr2ln_pid.rs @@ -0,0 +1,55 @@ +use std::env; + +use anyhow::bail; +use anyhow::Context as _; +use anyhow::Result; + +use blazesym::symbolize::Process; +use blazesym::symbolize::Source; +use blazesym::symbolize::SymbolizedResult; +use blazesym::symbolize::Symbolizer; +use blazesym::Addr; + +fn main() -> Result<()> { + let args = env::args().collect::>(); + + if args.len() != 3 { + bail!( + "Usage: {}
+Resolve an address in the process of the given pid, and +print its symbol, the file name of the source, and the line number.", + args.first().map(String::as_str).unwrap_or("addr2ln_pid") + ); + } + + let pid = args[1].parse::().unwrap(); + let addr_str = &args[2][..]; + println!("PID: {pid}"); + + let addr = Addr::from_str_radix(addr_str.trim_start_matches("0x"), 16) + .with_context(|| format!("failed to parse address: {addr_str}"))?; + + let src = Source::Process(Process::new(pid.into())); + let symbolizer = Symbolizer::new(); + let symlist = symbolizer + .symbolize(&src, &[addr]) + .with_context(|| format!("failed to symbolize address 0x{addr:x}"))?; + if !symlist[0].is_empty() { + let SymbolizedResult { + symbol, + addr: sym_addr, + path, + line, + column: _, + } = &symlist[0][0]; + println!( + "0x{addr:x} {symbol}@0x{addr:x}+{} {}:{line}", + addr - sym_addr, + path.display(), + ); + } else { + println!("0x{addr:x} is not found"); + } + + Ok(()) +} diff --git a/blazesym/include/blazesym.h b/blazesym/include/blazesym.h new file mode 100644 index 0000000..2e00bfa --- /dev/null +++ b/blazesym/include/blazesym.h @@ -0,0 +1,589 @@ +#ifndef __blazesym_h_ +#define __blazesym_h_ + +#include +#include +#include +#include +#include + +/** + * The type of a symbol. + */ +typedef enum blaze_sym_type { + /** + * That type could not be determined (possibly because the source does not + * contains information about the type). + */ + BLAZE_SYM_UNKNOWN, + /** + * The symbol is a function. + */ + BLAZE_SYM_FUNC, + /** + * The symbol is a variable. + */ + BLAZE_SYM_VAR, +} blaze_sym_type; + +/** + * The valid variant kind in [`blaze_user_addr_meta`]. + */ +typedef enum blaze_user_addr_meta_kind { + /** + * [`blaze_user_addr_meta_variant::unknown`] is valid. + */ + BLAZE_USER_ADDR_UNKNOWN, + /** + * [`blaze_user_addr_meta_variant::binary`] is valid. + */ + BLAZE_USER_ADDR_BINARY, +} blaze_user_addr_meta_kind; + +/** + * An inspector of various "sources". + * + * Object of this type can be used to perform inspections of supported sources. + * E.g., using an ELF file as a source, information about a symbol can be + * inquired based on its name. + */ +typedef struct blaze_inspector blaze_inspector; + +/** + * A normalizer for addresses. + * + * Address normalization is the process of taking virtual absolute + * addresses as they are seen by, say, a process (which include + * relocation and process specific layout randomizations, among other + * things) and converting them to "normalized" virtual addresses as + * they are present in, say, an ELF binary or a DWARF debug info file, + * and one would be able to see them using tools such as readelf(1). + */ +typedef struct blaze_normalizer blaze_normalizer; + +/** + * Symbolizer provides an interface to symbolize addresses. + */ +typedef struct blaze_symbolizer blaze_symbolizer; + +/** + * Information about a looked up symbol. + */ +typedef struct blaze_sym_info { + const char *name; + uintptr_t addr; + size_t size; + uint64_t file_offset; + const char *obj_file_name; + enum blaze_sym_type sym_type; +} blaze_sym_info; + +/** + * An object representing an ELF inspection source. + * + * C ABI compatible version of [`inspect::Elf`]. + */ +typedef struct blaze_inspect_elf_src { + /** + * The path to the binary. This member is always present. + */ + const char *path; + /** + * Whether or not to consult debug information to satisfy the request (if + * present). + */ + bool debug_info; +} blaze_inspect_elf_src; + +/** + * C compatible version of [`Binary`]. + */ +typedef struct blaze_user_addr_meta_binary { + /** + * The path to the binary. This member is always present. + */ + char *path; + /** + * The length of the build ID, in bytes. + */ + size_t build_id_len; + /** + * The optional build ID of the binary, if found. + */ + uint8_t *build_id; +} blaze_user_addr_meta_binary; + +/** + * C compatible version of [`Unknown`]. + */ +typedef struct blaze_user_addr_meta_unknown { + uint8_t __unused; +} blaze_user_addr_meta_unknown; + +/** + * The actual variant data in [`blaze_user_addr_meta`]. + */ +typedef union blaze_user_addr_meta_variant { + /** + * Valid on [`blaze_user_addr_meta_kind::BLAZE_USER_ADDR_BINARY`]. + */ + struct blaze_user_addr_meta_binary binary; + /** + * Valid on [`blaze_user_addr_meta_kind::BLAZE_USER_ADDR_UNKNOWN`]. + */ + struct blaze_user_addr_meta_unknown unknown; +} blaze_user_addr_meta_variant; + +/** + * C ABI compatible version of [`UserAddrMeta`]. + */ +typedef struct blaze_user_addr_meta { + /** + * The variant kind that is present. + */ + enum blaze_user_addr_meta_kind kind; + /** + * The actual variant with its data. + */ + union blaze_user_addr_meta_variant variant; +} blaze_user_addr_meta; + +/** + * A normalized address along with an index into the associated + * [`blaze_user_addr_meta`] array (such as + * [`blaze_normalized_user_addrs::metas`]). + */ +typedef struct blaze_normalized_addr { + /** + * The normalized address. + */ + uintptr_t addr; + /** + * The index into the associated [`blaze_user_addr_meta`] array. + */ + size_t meta_idx; +} blaze_normalized_addr; + +/** + * An object representing normalized user addresses. + * + * C ABI compatible version of [`NormalizedUserAddrs`]. + */ +typedef struct blaze_normalized_user_addrs { + /** + * The number of [`blaze_user_addr_meta`] objects present in `metas`. + */ + size_t meta_count; + /** + * An array of `meta_count` objects. + */ + struct blaze_user_addr_meta *metas; + /** + * The number of [`blaze_normalized_addr`] objects present in `addrs`. + */ + size_t addr_count; + /** + * An array of `addr_count` objects. + */ + struct blaze_normalized_addr *addrs; +} blaze_normalized_user_addrs; + +/** + * A placeholder symbolizer for C API. + * + * It is returned by [`blaze_symbolizer_new`] and should be free by + * [`blaze_symbolizer_free`]. + */ +typedef struct blaze_symbolizer blaze_symbolizer; + +/** + * Options for configuring `blaze_symbolizer` objects. + */ +typedef struct blaze_symbolizer_opts { + /** + * Whether to enable usage of debug symbols. + */ + bool debug_syms; + /** + * Whether to attempt to gather source code location information. + * + * This setting implies `debug_syms` (and forces it to `true`). + */ + bool src_location; +} blaze_symbolizer_opts; + +/** + * The result of symbolization of an address. + * + * A `blaze_sym` is the information of a symbol found for an + * address. One address may result in several symbols. + */ +typedef struct blaze_sym { + /** + * The symbol name is where the given address should belong to. + */ + const char *symbol; + /** + * The address (i.e.,the first byte) is where the symbol is located. + * + * The address is already relocated to the address space of + * the process. + */ + uintptr_t addr; + /** + * The path of the source file defining the symbol. + */ + const char *path; + /** + * The line number on which the symbol was to be found in the source code. + */ + size_t line; + size_t column; +} blaze_sym; + +/** + * `blaze_entry` is the output of symbolization for an address for C API. + * + * Every address has an `blaze_entry` in + * [`blaze_result::entries`] to collect symbols found. + */ +typedef struct blaze_entry { + /** + * The number of symbols found for an address. + */ + size_t size; + /** + * All symbols found. + * + * `syms` is an array of [`blaze_sym`] in the size `size`. + */ + const struct blaze_sym *syms; +} blaze_entry; + +/** + * `blaze_result` is the result of symbolization for C API. + * + * Instances of [`blaze_result`] are returned by any of the `blaze_symbolize_*` + * variants. They should be freed by calling [`blaze_result_free`]. + */ +typedef struct blaze_result { + /** + * The number of addresses being symbolized. + */ + size_t size; + /** + * The entries for addresses. + * + * Symbolization occurs based on the order of addresses. + * Therefore, every address must have an entry here on the same + * order. + */ + struct blaze_entry entries[0]; +} blaze_result; + +/** + * The parameters to load symbols and debug information from a process. + * + * Load all ELF files in a process as the sources of symbols and debug + * information. + */ +typedef struct blaze_symbolize_src_process { + /** + * It is the PID of a process to symbolize. + * + * blazesym will parse `/proc//maps` and load all the object + * files. + */ + uint32_t pid; +} blaze_symbolize_src_process; + +/** + * The parameters to load symbols and debug information from a kernel. + * + * Use a kernel image and a snapshot of its kallsyms as a source of symbols and + * debug information. + */ +typedef struct blaze_symbolize_src_kernel { + /** + * The path of a copy of kallsyms. + * + * It can be `"/proc/kallsyms"` for the running kernel on the + * device. However, you can make copies for later. In that situation, + * you should give the path of a copy. + * Passing a `NULL`, by default, will result in `"/proc/kallsyms"`. + */ + const char *kallsyms; + /** + * The path of a kernel image. + * + * The path of a kernel image should be, for instance, + * `"/boot/vmlinux-xxxx"`. For a `NULL` value, it will locate the + * kernel image of the running kernel in `"/boot/"` or + * `"/usr/lib/debug/boot/"`. + */ + const char *kernel_image; +} blaze_symbolize_src_kernel; + +/** + * The parameters to load symbols and debug information from an ELF. + * + * Describes the path and address of an ELF file loaded in a + * process. + */ +typedef struct blaze_symbolize_src_elf { + /** + * The path to the ELF file. + * + * The referenced file may be an executable or shared object. For example, + * passing "/bin/sh" will load symbols and debug information from `sh` and + * passing "/lib/libc.so.xxx" will load symbols and debug information from + * libc. + */ + const char *path; +} blaze_symbolize_src_elf; + +/** + * The parameters to load symbols and debug information from a gsym file. + */ +typedef struct blaze_symbolize_src_gsym { + /** + * The path to a gsym file. + */ + const char *path; +} blaze_symbolize_src_gsym; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Lookup symbol information in an ELF file. + * + * Return an array with the same size as the input names. The caller should + * free the returned array by calling [`blaze_inspect_syms_free`]. + * + * Every name in the input name list may have more than one address. + * The respective entry in the returned array is an array containing + * all addresses and ended with a null (0x0). + * + * The returned pointer should be freed by [`blaze_inspect_syms_free`]. + * + * # Safety + * The `inspector` object should have been created using + * [`blaze_inspector_new`], `src` needs to point to a valid object, and `names` + * needs to be a valid pointer to `name_cnt` strings. + */ +const struct blaze_sym_info *const *blaze_inspect_syms_elf(const struct blaze_inspector *inspector, + const struct blaze_inspect_elf_src *src, + const char *const *names, + size_t name_cnt); + +/** + * Free an array returned by [`blaze_inspect_syms_elf`]. + * + * # Safety + * + * The pointer must be returned by [`blaze_inspect_syms_elf`]. + * + */ +void blaze_inspect_syms_free(const struct blaze_sym_info *const *syms); + +/** + * Create an instance of a blazesym inspector. + * + * The returned pointer should be released using + * [`blaze_inspector_free`] once it is no longer needed. + */ +struct blaze_inspector *blaze_inspector_new(void); + +/** + * Free a blazesym inspector. + * + * Release resources associated with a inspector as created by + * [`blaze_inspector_new`], for example. + * + * # Safety + * The provided inspector should have been created by + * [`blaze_inspector_new`]. + */ +void blaze_inspector_free(struct blaze_inspector *inspector); + +/** + * Create an instance of a blazesym normalizer. + * + * The returned pointer should be released using + * [`blaze_normalizer_free`] once it is no longer needed. + */ +struct blaze_normalizer *blaze_normalizer_new(void); + +/** + * Free a blazesym normalizer. + * + * Release resources associated with a normalizer as created by + * [`blaze_normalizer_new`], for example. + * + * # Safety + * The provided normalizer should have been created by + * [`blaze_normalizer_new`]. + */ +void blaze_normalizer_free(struct blaze_normalizer *normalizer); + +/** + * Normalize a list of user space addresses. + * + * The `addrs` array has to be sorted in ascending order. `pid` should + * describe the PID of the process to which the addresses belong. It + * may be `0` if they belong to the calling process. + * + * C ABI compatible version of [`Normalizer::normalize_user_addrs`]. + * Returns `NULL` on error. The resulting object should be freed using + * [`blaze_user_addrs_free`]. + * + * # Safety + * Callers need to pass in a valid `addrs` pointer, pointing to memory of + * `addr_count` addresses. + */ +struct blaze_normalized_user_addrs *blaze_normalize_user_addrs(const struct blaze_normalizer *normalizer, + const uintptr_t *addrs, + size_t addr_count, + uint32_t pid); + +/** + * Normalize a list of user space addresses. + * + * `pid` should describe the PID of the process to which the addresses belong. + * It may be `0` if they belong to the calling process. + * + * C ABI compatible version of [`Normalizer::normalize_user_addrs_sorted`]. + * Returns `NULL` on error. The resulting object should be freed using + * [`blaze_user_addrs_free`]. + * + * # Safety + * Callers need to pass in a valid `addrs` pointer, pointing to memory of + * `addr_count` addresses. + */ +struct blaze_normalized_user_addrs *blaze_normalize_user_addrs_sorted(const struct blaze_normalizer *normalizer, + const uintptr_t *addrs, + size_t addr_count, + uint32_t pid); + +/** + * Free an object as returned by [`blaze_normalized_user_addrs`] or + * [`blaze_normalize_user_addrs_sorted`]. + * + * # Safety + * The provided object should have been created by + * [`blaze_normalized_user_addrs`] or + * [`blaze_normalize_user_addrs_sorted`]. + */ +void blaze_user_addrs_free(struct blaze_normalized_user_addrs *addrs); + +/** + * Create an instance of a symbolizer. + */ +blaze_symbolizer *blaze_symbolizer_new(void); + +/** + * Create an instance of a symbolizer with configurable options. + * + * # Safety + * `opts` needs to be a valid pointer. + */ +blaze_symbolizer *blaze_symbolizer_new_opts(const struct blaze_symbolizer_opts *opts); + +/** + * Free an instance of blazesym a symbolizer for C API. + * + * # Safety + * + * The pointer must have been returned by [`blaze_symbolizer_new`] or + * [`blaze_symbolizer_new_opts`]. + */ +void blaze_symbolizer_free(blaze_symbolizer *symbolizer); + +/** + * Symbolize addresses of a process. + * + * Return an array of [`blaze_result`] with the same size as the + * number of input addresses. The caller should free the returned array by + * calling [`blaze_result_free`]. + * + * # Safety + * `symbolizer` must have been allocated using [`blaze_symbolizer_new`] or + * [`blaze_symbolizer_new_opts`]. `src` must point to a valid + * [`blaze_symbolize_src_process`] object. `addrs` must represent an array of + * `addr_cnt` objects. + */ +const struct blaze_result *blaze_symbolize_process(blaze_symbolizer *symbolizer, + const struct blaze_symbolize_src_process *src, + const uintptr_t *addrs, + size_t addr_cnt); + +/** + * Symbolize kernel addresses. + * + * Return an array of [`blaze_result`] with the same size as the + * number of input addresses. The caller should free the returned array by + * calling [`blaze_result_free`]. + * + * # Safety + * `symbolizer` must have been allocated using [`blaze_symbolizer_new`] or + * [`blaze_symbolizer_new_opts`]. `src` must point to a valid + * [`blaze_symbolize_src_kernel`] object. `addrs` must represent an array of + * `addr_cnt` objects. + */ +const struct blaze_result *blaze_symbolize_kernel(blaze_symbolizer *symbolizer, + const struct blaze_symbolize_src_kernel *src, + const uintptr_t *addrs, + size_t addr_cnt); + +/** + * Symbolize addresses in an ELF file. + * + * Return an array of [`blaze_result`] with the same size as the + * number of input addresses. The caller should free the returned array by + * calling [`blaze_result_free`]. + * + * # Safety + * `symbolizer` must have been allocated using [`blaze_symbolizer_new`] or + * [`blaze_symbolizer_new_opts`]. `src` must point to a valid + * [`blaze_symbolize_src_elf`] object. `addrs` must represent an array of + * `addr_cnt` objects. + */ +const struct blaze_result *blaze_symbolize_elf(blaze_symbolizer *symbolizer, + const struct blaze_symbolize_src_elf *src, + const uintptr_t *addrs, + size_t addr_cnt); + +/** + * Symbolize addresses in a Gsym file. + * + * Return an array of [`blaze_result`] with the same size as the + * number of input addresses. The caller should free the returned array by + * calling [`blaze_result_free`]. + * + * # Safety + * `symbolizer` must have been allocated using [`blaze_symbolizer_new`] or + * [`blaze_symbolizer_new_opts`]. `src` must point to a valid + * [`blaze_symbolize_src_gsym`] object. `addrs` must represent an array of + * `addr_cnt` objects. + */ +const struct blaze_result *blaze_symbolize_gsym(blaze_symbolizer *symbolizer, + const struct blaze_symbolize_src_gsym *src, + const uintptr_t *addrs, + size_t addr_cnt); + +/** + * Free an array returned by any of the `blaze_symbolize_*` variants. + * + * # Safety + * The pointer must have been returned by any of the `blaze_symbolize_*` + * variants. + */ +void blaze_result_free(const struct blaze_result *results); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif /* __blazesym_h_ */ diff --git a/blazesym/src/c_api/inspect.rs b/blazesym/src/c_api/inspect.rs new file mode 100644 index 0000000..905378c --- /dev/null +++ b/blazesym/src/c_api/inspect.rs @@ -0,0 +1,432 @@ +use std::alloc::alloc; +use std::alloc::dealloc; +use std::alloc::Layout; +use std::ffi::CStr; +use std::ffi::CString; +use std::ffi::OsStr; +use std::ffi::OsString; +use std::fmt::Debug; +use std::mem; +use std::os::raw::c_char; +use std::os::unix::ffi::OsStrExt as _; +use std::os::unix::ffi::OsStringExt as _; +use std::path::Path; +use std::path::PathBuf; +use std::ptr; + +#[cfg(doc)] +use crate::inspect; +use crate::inspect::Elf; +use crate::inspect::Inspector; +use crate::inspect::Source; +use crate::inspect::SymInfo; +use crate::inspect::SymType; +use crate::log::error; +use crate::util::slice_from_user_array; +use crate::Addr; + + +/// An object representing an ELF inspection source. +/// +/// C ABI compatible version of [`inspect::Elf`]. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_inspect_elf_src { + /// The path to the binary. This member is always present. + path: *const c_char, + /// Whether or not to consult debug information to satisfy the request (if + /// present). + debug_info: bool, +} + +impl From for blaze_inspect_elf_src { + fn from(other: Elf) -> Self { + let Elf { + path, + debug_info, + _non_exhaustive: (), + } = other; + Self { + path: CString::new(path.into_os_string().into_vec()) + .expect("encountered path with NUL bytes") + .into_raw(), + debug_info, + } + } +} + +impl From for Elf { + fn from(other: blaze_inspect_elf_src) -> Self { + let blaze_inspect_elf_src { path, debug_info } = other; + + Elf { + path: PathBuf::from(OsString::from_vec( + unsafe { CString::from_raw(path as *mut _) }.into_bytes(), + )), + debug_info, + _non_exhaustive: (), + } + } +} + +impl From<&blaze_inspect_elf_src> for Elf { + fn from(other: &blaze_inspect_elf_src) -> Self { + let blaze_inspect_elf_src { path, debug_info } = other; + + Elf { + path: Path::new(OsStr::from_bytes( + unsafe { CStr::from_ptr(*path) }.to_bytes(), + )) + .to_path_buf(), + debug_info: *debug_info, + _non_exhaustive: (), + } + } +} + + +/// The type of a symbol. +#[repr(C)] +#[derive(Copy, Clone, Debug, PartialEq)] +pub enum blaze_sym_type { + /// That type could not be determined (possibly because the source does not + /// contains information about the type). + BLAZE_SYM_UNKNOWN, + /// The symbol is a function. + BLAZE_SYM_FUNC, + /// The symbol is a variable. + BLAZE_SYM_VAR, +} + +impl From for blaze_sym_type { + fn from(other: SymType) -> Self { + match other { + SymType::Unknown => blaze_sym_type::BLAZE_SYM_UNKNOWN, + SymType::Function => blaze_sym_type::BLAZE_SYM_FUNC, + SymType::Variable => blaze_sym_type::BLAZE_SYM_VAR, + } + } +} + + +/// Information about a looked up symbol. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_sym_info { + pub name: *const c_char, + pub addr: Addr, + pub size: usize, + pub file_offset: u64, + pub obj_file_name: *const c_char, + pub sym_type: blaze_sym_type, +} + + +/// Convert [`SymInfo`] objects as returned by +/// [`Symbolizer::find_addrs`] to a C array. +fn convert_syms_list_to_c(syms_list: Vec>) -> *const *const blaze_sym_info { + let mut sym_cnt = 0; + let mut str_buf_sz = 0; + + for syms in &syms_list { + sym_cnt += syms.len() + 1; + for sym in syms { + str_buf_sz += sym.name.len() + 1; + if let Some(fname) = sym.obj_file_name.as_ref() { + str_buf_sz += AsRef::::as_ref(fname).as_bytes().len() + 1; + } + } + } + + let array_sz = (mem::size_of::<*const u64>() * syms_list.len() + mem::size_of::() - 1) + / mem::size_of::() + * mem::size_of::(); + let sym_buf_sz = mem::size_of::() * sym_cnt; + let buf_size = array_sz + sym_buf_sz + str_buf_sz; + let raw_buf_with_sz = + unsafe { alloc(Layout::from_size_align(buf_size + mem::size_of::(), 8).unwrap()) }; + + unsafe { *(raw_buf_with_sz as *mut u64) = buf_size as u64 }; + + let raw_buf = unsafe { raw_buf_with_sz.add(mem::size_of::()) }; + let mut syms_ptr = raw_buf as *mut *mut blaze_sym_info; + let mut sym_ptr = unsafe { raw_buf.add(array_sz) } as *mut blaze_sym_info; + let mut str_ptr = unsafe { raw_buf.add(array_sz + sym_buf_sz) } as *mut c_char; + + for syms in syms_list { + unsafe { *syms_ptr = sym_ptr }; + for SymInfo { + name, + addr, + size, + sym_type, + file_offset, + obj_file_name, + } in syms + { + let name_ptr = str_ptr.cast(); + unsafe { ptr::copy_nonoverlapping(name.as_ptr().cast(), str_ptr, name.len()) }; + str_ptr = unsafe { str_ptr.add(name.len()) }; + unsafe { *str_ptr = 0 }; + str_ptr = unsafe { str_ptr.add(1) }; + let obj_file_name = if let Some(fname) = obj_file_name.as_ref() { + let fname = AsRef::::as_ref(fname).as_bytes(); + let obj_fname_ptr = str_ptr; + unsafe { ptr::copy_nonoverlapping(fname.as_ptr().cast(), str_ptr, fname.len()) }; + str_ptr = unsafe { str_ptr.add(fname.len()) }; + unsafe { *str_ptr = 0 }; + str_ptr = unsafe { str_ptr.add(1) }; + obj_fname_ptr + } else { + ptr::null() + }; + + unsafe { + (*sym_ptr) = blaze_sym_info { + name: name_ptr, + addr, + size, + sym_type: match sym_type { + SymType::Function => blaze_sym_type::BLAZE_SYM_FUNC, + SymType::Variable => blaze_sym_type::BLAZE_SYM_VAR, + SymType::Unknown => blaze_sym_type::BLAZE_SYM_UNKNOWN, + }, + file_offset, + obj_file_name, + } + }; + sym_ptr = unsafe { sym_ptr.add(1) }; + } + unsafe { + (*sym_ptr) = blaze_sym_info { + name: ptr::null(), + addr: 0, + size: 0, + sym_type: blaze_sym_type::BLAZE_SYM_UNKNOWN, + file_offset: 0, + obj_file_name: ptr::null(), + } + }; + sym_ptr = unsafe { sym_ptr.add(1) }; + + syms_ptr = unsafe { syms_ptr.add(1) }; + } + + raw_buf as *const *const blaze_sym_info +} + + +/// Lookup symbol information in an ELF file. +/// +/// Return an array with the same size as the input names. The caller should +/// free the returned array by calling [`blaze_inspect_syms_free`]. +/// +/// Every name in the input name list may have more than one address. +/// The respective entry in the returned array is an array containing +/// all addresses and ended with a null (0x0). +/// +/// The returned pointer should be freed by [`blaze_inspect_syms_free`]. +/// +/// # Safety +/// The `inspector` object should have been created using +/// [`blaze_inspector_new`], `src` needs to point to a valid object, and `names` +/// needs to be a valid pointer to `name_cnt` strings. +#[no_mangle] +pub unsafe extern "C" fn blaze_inspect_syms_elf( + inspector: *const Inspector, + src: *const blaze_inspect_elf_src, + names: *const *const c_char, + name_cnt: usize, +) -> *const *const blaze_sym_info { + // SAFETY: The caller ensures that the pointer is valid. + let inspector = unsafe { &*inspector }; + // SAFETY: The caller ensures that the pointer is valid. + let src = Source::Elf(Elf::from(unsafe { &*src })); + // SAFETY: The caller ensures that the pointer is valid and the count + // matches. + let names = unsafe { slice_from_user_array(names, name_cnt) }; + let names = names + .iter() + .map(|&p| { + // SAFETY: The caller ensures that the pointer is valid. + unsafe { CStr::from_ptr(p) }.to_str().unwrap() + }) + .collect::>(); + let result = inspector.lookup(&names, &src); + match result { + Ok(syms) => convert_syms_list_to_c(syms), + Err(err) => { + error!("failed to lookup symbols: {err}"); + ptr::null() + } + } +} + + +/// Free an array returned by [`blaze_inspect_syms_elf`]. +/// +/// # Safety +/// +/// The pointer must be returned by [`blaze_inspect_syms_elf`]. +/// +#[no_mangle] +pub unsafe extern "C" fn blaze_inspect_syms_free(syms: *const *const blaze_sym_info) { + if syms.is_null() { + return + } + + let raw_buf_with_sz = unsafe { (syms as *mut u8).offset(-(mem::size_of::() as isize)) }; + let sz = unsafe { *(raw_buf_with_sz as *mut u64) } as usize + mem::size_of::(); + unsafe { dealloc(raw_buf_with_sz, Layout::from_size_align(sz, 8).unwrap()) }; +} + + +/// Create an instance of a blazesym inspector. +/// +/// The returned pointer should be released using +/// [`blaze_inspector_free`] once it is no longer needed. +#[no_mangle] +pub extern "C" fn blaze_inspector_new() -> *mut Inspector { + let inspector = Inspector::new(); + let inspector_box = Box::new(inspector); + Box::into_raw(inspector_box) +} + + +/// Free a blazesym inspector. +/// +/// Release resources associated with a inspector as created by +/// [`blaze_inspector_new`], for example. +/// +/// # Safety +/// The provided inspector should have been created by +/// [`blaze_inspector_new`]. +#[no_mangle] +pub unsafe extern "C" fn blaze_inspector_free(inspector: *mut Inspector) { + if !inspector.is_null() { + // SAFETY: The caller needs to ensure that `inspector` is a + // valid pointer. + drop(unsafe { Box::from_raw(inspector) }); + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use test_log::test; + + + /// Check that we can properly convert a "syms list" into the corresponding + /// C representation. + #[test] + fn syms_list_conversion() { + fn test(syms: Vec>) { + let copy = syms.clone(); + let ptr = convert_syms_list_to_c(syms); + + for (i, list) in copy.into_iter().enumerate() { + for (j, sym) in list.into_iter().enumerate() { + let c_sym = unsafe { &(*(*ptr.add(i)).add(j)) }; + assert_eq!( + unsafe { CStr::from_ptr(c_sym.name) }.to_bytes(), + CString::new(sym.name).unwrap().to_bytes() + ); + assert_eq!(c_sym.addr, sym.addr); + assert_eq!(c_sym.size, sym.size); + assert_eq!(c_sym.sym_type, blaze_sym_type::from(sym.sym_type)); + assert_eq!(c_sym.file_offset, sym.file_offset); + assert_eq!( + unsafe { CStr::from_ptr(c_sym.obj_file_name) }.to_bytes(), + CString::new( + sym.obj_file_name + .as_deref() + .unwrap() + .as_os_str() + .to_os_string() + .into_vec() + ) + .unwrap() + .to_bytes() + ); + } + } + + let () = unsafe { blaze_inspect_syms_free(ptr) }; + } + + // Test conversion of no symbols. + let syms = vec![]; + test(syms); + + // Test conversion with a single symbol. + let syms = vec![vec![SymInfo { + name: "sym1".to_string(), + addr: 0xdeadbeef, + size: 42, + sym_type: SymType::Function, + file_offset: 1337, + obj_file_name: Some(PathBuf::from("/tmp/foobar.so")), + }]]; + test(syms); + + // Test conversion of two symbols in one result. + let syms = vec![vec![ + SymInfo { + name: "sym1".to_string(), + addr: 0xdeadbeef, + size: 42, + sym_type: SymType::Function, + file_offset: 1337, + obj_file_name: Some(PathBuf::from("/tmp/foobar.so")), + }, + SymInfo { + name: "sym2".to_string(), + addr: 0xdeadbeef + 52, + size: 45, + sym_type: SymType::Unknown, + file_offset: 1338, + obj_file_name: Some(PathBuf::from("other.so")), + }, + ]]; + test(syms); + + // Test conversion of two symbols spread over two results. + let syms = vec![ + vec![SymInfo { + name: "sym1".to_string(), + addr: 0xdeadbeef, + size: 42, + sym_type: SymType::Function, + file_offset: 1337, + obj_file_name: Some(PathBuf::from("/tmp/foobar.so")), + }], + vec![SymInfo { + name: "sym2".to_string(), + addr: 0xdeadbeef + 52, + size: 45, + sym_type: SymType::Unknown, + file_offset: 1338, + obj_file_name: Some(PathBuf::from("other.so")), + }], + ]; + test(syms); + + // Test conversion of a `SymInfo` vector with many elements. + let sym = SymInfo { + name: "sym1".to_string(), + addr: 0xdeadbeef, + size: 42, + sym_type: SymType::Function, + file_offset: 1337, + obj_file_name: Some(PathBuf::from("/tmp/foobar.so")), + }; + let syms = vec![(0..200).map(|_| sym.clone()).collect()]; + test(syms); + + // Test conversion of many `SymInfo` vectors. + let syms = (0..200).map(|_| vec![sym.clone()]).collect(); + test(syms); + } +} diff --git a/blazesym/src/c_api/mod.rs b/blazesym/src/c_api/mod.rs new file mode 100644 index 0000000..82d5c65 --- /dev/null +++ b/blazesym/src/c_api/mod.rs @@ -0,0 +1,12 @@ +//! C API bindings for the library. + +#[allow(non_camel_case_types)] +mod inspect; +#[allow(non_camel_case_types)] +mod normalize; +#[allow(non_camel_case_types)] +mod symbolize; + +pub use inspect::*; +pub use normalize::*; +pub use symbolize::*; diff --git a/blazesym/src/c_api/normalize.rs b/blazesym/src/c_api/normalize.rs new file mode 100644 index 0000000..d998c06 --- /dev/null +++ b/blazesym/src/c_api/normalize.rs @@ -0,0 +1,419 @@ +use std::ffi::CString; +use std::ffi::OsString; +use std::fmt::Debug; +use std::fmt::Formatter; +use std::fmt::Result as FmtResult; +use std::mem::ManuallyDrop; +use std::os::raw::c_char; +use std::os::unix::ffi::OsStringExt as _; +use std::path::PathBuf; +use std::ptr; +use std::slice; + +use crate::log::error; +use crate::normalize::Binary; +use crate::normalize::NormalizedUserAddrs; +use crate::normalize::Normalizer; +use crate::normalize::Unknown; +use crate::normalize::UserAddrMeta; +use crate::util::slice_from_user_array; +use crate::Addr; + + +/// Create an instance of a blazesym normalizer. +/// +/// The returned pointer should be released using +/// [`blaze_normalizer_free`] once it is no longer needed. +#[no_mangle] +pub extern "C" fn blaze_normalizer_new() -> *mut Normalizer { + let normalizer = Normalizer::new(); + let normalizer_box = Box::new(normalizer); + Box::into_raw(normalizer_box) +} + + +/// Free a blazesym normalizer. +/// +/// Release resources associated with a normalizer as created by +/// [`blaze_normalizer_new`], for example. +/// +/// # Safety +/// The provided normalizer should have been created by +/// [`blaze_normalizer_new`]. +#[no_mangle] +pub unsafe extern "C" fn blaze_normalizer_free(normalizer: *mut Normalizer) { + if !normalizer.is_null() { + // SAFETY: The caller needs to ensure that `normalizer` is a + // valid pointer. + drop(unsafe { Box::from_raw(normalizer) }); + } +} + + +/// A normalized address along with an index into the associated +/// [`blaze_user_addr_meta`] array (such as +/// [`blaze_normalized_user_addrs::metas`]). +#[repr(C)] +#[derive(Debug)] +pub struct blaze_normalized_addr { + /// The normalized address. + pub addr: Addr, + /// The index into the associated [`blaze_user_addr_meta`] array. + pub meta_idx: usize, +} + +impl From<(Addr, usize)> for blaze_normalized_addr { + fn from((addr, meta_idx): (Addr, usize)) -> Self { + Self { addr, meta_idx } + } +} + + +/// The valid variant kind in [`blaze_user_addr_meta`]. +#[repr(C)] +#[derive(Debug)] +pub enum blaze_user_addr_meta_kind { + /// [`blaze_user_addr_meta_variant::unknown`] is valid. + BLAZE_USER_ADDR_UNKNOWN, + /// [`blaze_user_addr_meta_variant::binary`] is valid. + BLAZE_USER_ADDR_BINARY, +} + + +/// C compatible version of [`Binary`]. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_user_addr_meta_binary { + /// The path to the binary. This member is always present. + path: *mut c_char, + /// The length of the build ID, in bytes. + build_id_len: usize, + /// The optional build ID of the binary, if found. + build_id: *mut u8, +} + +impl From for blaze_user_addr_meta_binary { + fn from(other: Binary) -> Self { + let Binary { + path, + build_id, + _non_exhaustive: (), + } = other; + Self { + path: CString::new(path.into_os_string().into_vec()) + .expect("encountered path with NUL bytes") + .into_raw(), + build_id_len: build_id + .as_ref() + .map(|build_id| build_id.len()) + .unwrap_or(0), + build_id: build_id + .map(|build_id| { + // SAFETY: We know the pointer is valid because it + // came from a `Box`. + unsafe { + Box::into_raw(build_id.into_boxed_slice()) + .as_mut() + .unwrap() + .as_mut_ptr() + } + }) + .unwrap_or_else(ptr::null_mut), + } + } +} + +impl From for Binary { + fn from(other: blaze_user_addr_meta_binary) -> Self { + let blaze_user_addr_meta_binary { + path, + build_id_len, + build_id, + } = other; + + Binary { + path: PathBuf::from(OsString::from_vec( + unsafe { CString::from_raw(path) }.into_bytes(), + )), + build_id: (!build_id.is_null()).then(|| unsafe { + Box::<[u8]>::from_raw(slice::from_raw_parts_mut(build_id, build_id_len)).into_vec() + }), + _non_exhaustive: (), + } + } +} + + +/// C compatible version of [`Unknown`]. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_user_addr_meta_unknown { + __unused: u8, +} + +impl From for blaze_user_addr_meta_unknown { + fn from(other: Unknown) -> Self { + let Unknown { + _non_exhaustive: (), + } = other; + Self { __unused: 0 } + } +} + +impl From for Unknown { + fn from(other: blaze_user_addr_meta_unknown) -> Self { + let blaze_user_addr_meta_unknown { __unused } = other; + Unknown { + _non_exhaustive: (), + } + } +} + + +/// The actual variant data in [`blaze_user_addr_meta`]. +#[repr(C)] +pub union blaze_user_addr_meta_variant { + /// Valid on [`blaze_user_addr_meta_kind::BLAZE_USER_ADDR_BINARY`]. + pub binary: ManuallyDrop, + /// Valid on [`blaze_user_addr_meta_kind::BLAZE_USER_ADDR_UNKNOWN`]. + pub unknown: ManuallyDrop, +} + +impl Debug for blaze_user_addr_meta_variant { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + f.debug_struct(stringify!(blaze_user_addr_meta_variant)) + .finish() + } +} + + +/// C ABI compatible version of [`UserAddrMeta`]. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_user_addr_meta { + /// The variant kind that is present. + kind: blaze_user_addr_meta_kind, + /// The actual variant with its data. + variant: blaze_user_addr_meta_variant, +} + +impl From for blaze_user_addr_meta { + fn from(other: UserAddrMeta) -> Self { + match other { + UserAddrMeta::Binary(binary) => Self { + kind: blaze_user_addr_meta_kind::BLAZE_USER_ADDR_BINARY, + variant: blaze_user_addr_meta_variant { + binary: ManuallyDrop::new(blaze_user_addr_meta_binary::from(binary)), + }, + }, + UserAddrMeta::Unknown(unknown) => Self { + kind: blaze_user_addr_meta_kind::BLAZE_USER_ADDR_UNKNOWN, + variant: blaze_user_addr_meta_variant { + unknown: ManuallyDrop::new(blaze_user_addr_meta_unknown::from(unknown)), + }, + }, + } + } +} + + +/// An object representing normalized user addresses. +/// +/// C ABI compatible version of [`NormalizedUserAddrs`]. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_normalized_user_addrs { + /// The number of [`blaze_user_addr_meta`] objects present in `metas`. + pub meta_count: usize, + /// An array of `meta_count` objects. + pub metas: *mut blaze_user_addr_meta, + /// The number of [`blaze_normalized_addr`] objects present in `addrs`. + pub addr_count: usize, + /// An array of `addr_count` objects. + pub addrs: *mut blaze_normalized_addr, +} + +impl From for blaze_normalized_user_addrs { + fn from(other: NormalizedUserAddrs) -> Self { + Self { + meta_count: other.meta.len(), + metas: unsafe { + Box::into_raw( + other + .meta + .into_iter() + .map(blaze_user_addr_meta::from) + .collect::>() + .into_boxed_slice(), + ) + .as_mut() + .unwrap() + .as_mut_ptr() + }, + addr_count: other.addrs.len(), + addrs: unsafe { + Box::into_raw( + other + .addrs + .into_iter() + .map(blaze_normalized_addr::from) + .collect::>() + .into_boxed_slice(), + ) + .as_mut() + .unwrap() + .as_mut_ptr() + }, + } + } +} + + +/// Normalize a list of user space addresses. +/// +/// The `addrs` array has to be sorted in ascending order. `pid` should +/// describe the PID of the process to which the addresses belong. It +/// may be `0` if they belong to the calling process. +/// +/// C ABI compatible version of [`Normalizer::normalize_user_addrs`]. +/// Returns `NULL` on error. The resulting object should be freed using +/// [`blaze_user_addrs_free`]. +/// +/// # Safety +/// Callers need to pass in a valid `addrs` pointer, pointing to memory of +/// `addr_count` addresses. +#[no_mangle] +pub unsafe extern "C" fn blaze_normalize_user_addrs( + normalizer: *const Normalizer, + addrs: *const Addr, + addr_count: usize, + pid: u32, +) -> *mut blaze_normalized_user_addrs { + // SAFETY: The caller needs to ensure that `normalizer` is a valid + // pointer. + let normalizer = unsafe { &*normalizer }; + // SAFETY: The caller needs to ensure that `addrs` is a valid pointer and + // that it points to `addr_count` elements. + let addrs = unsafe { slice_from_user_array(addrs, addr_count) }; + let result = normalizer.normalize_user_addrs(addrs, pid.into()); + match result { + Ok(addrs) => Box::into_raw(Box::new(blaze_normalized_user_addrs::from(addrs))), + Err(err) => { + error!("failed to normalize user addresses: {err}"); + ptr::null_mut() + } + } +} + + +/// Normalize a list of user space addresses. +/// +/// `pid` should describe the PID of the process to which the addresses belong. +/// It may be `0` if they belong to the calling process. +/// +/// C ABI compatible version of [`Normalizer::normalize_user_addrs_sorted`]. +/// Returns `NULL` on error. The resulting object should be freed using +/// [`blaze_user_addrs_free`]. +/// +/// # Safety +/// Callers need to pass in a valid `addrs` pointer, pointing to memory of +/// `addr_count` addresses. +#[no_mangle] +pub unsafe extern "C" fn blaze_normalize_user_addrs_sorted( + normalizer: *const Normalizer, + addrs: *const Addr, + addr_count: usize, + pid: u32, +) -> *mut blaze_normalized_user_addrs { + // SAFETY: The caller needs to ensure that `normalizer` is a valid + // pointer. + let normalizer = unsafe { &*normalizer }; + // SAFETY: The caller needs to ensure that `addrs` is a valid pointer and + // that it points to `addr_count` elements. + let addrs = unsafe { slice_from_user_array(addrs, addr_count) }; + let result = normalizer.normalize_user_addrs_sorted(addrs, pid.into()); + match result { + Ok(addrs) => Box::into_raw(Box::new(blaze_normalized_user_addrs::from(addrs))), + Err(err) => { + error!("failed to normalize user addresses: {err}"); + ptr::null_mut() + } + } +} + +/// Free an object as returned by [`blaze_normalized_user_addrs`] or +/// [`blaze_normalize_user_addrs_sorted`]. +/// +/// # Safety +/// The provided object should have been created by +/// [`blaze_normalized_user_addrs`] or +/// [`blaze_normalize_user_addrs_sorted`]. +#[no_mangle] +pub unsafe extern "C" fn blaze_user_addrs_free(addrs: *mut blaze_normalized_user_addrs) { + if addrs.is_null() { + return + } + + // SAFETY: The caller should make sure that `addrs` was created by + // `blaze_normalize_user_addrs_sorted`. + let user_addrs = unsafe { Box::from_raw(addrs) }; + let addr_metas = unsafe { + Box::<[blaze_user_addr_meta]>::from_raw(slice::from_raw_parts_mut( + user_addrs.metas, + user_addrs.meta_count, + )) + } + .into_vec(); + let _norm_addrs = unsafe { + Box::<[blaze_normalized_addr]>::from_raw(slice::from_raw_parts_mut( + user_addrs.addrs, + user_addrs.addr_count, + )) + } + .into_vec(); + + for addr_meta in addr_metas { + match addr_meta.kind { + blaze_user_addr_meta_kind::BLAZE_USER_ADDR_BINARY => { + let _binary = Binary::from(ManuallyDrop::into_inner(unsafe { + addr_meta.variant.binary + })); + } + blaze_user_addr_meta_kind::BLAZE_USER_ADDR_UNKNOWN => { + let _unknown = Unknown::from(ManuallyDrop::into_inner(unsafe { + addr_meta.variant.unknown + })); + } + } + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + + /// Check that we can convert an [`Unknown`] into a + /// [`blaze_user_addr_meta_unknown`] and back. + #[test] + fn unknown_convesion() { + let unknown = Unknown { + _non_exhaustive: (), + }; + + let unknown_new = Unknown::from(blaze_user_addr_meta_unknown::from(unknown.clone())); + assert_eq!(unknown_new, unknown); + } + + /// Check that we correctly format the debug representation of a + /// [`blaze_user_addr_meta_variant`]. + #[test] + fn debug_meta_variant() { + let unknown = blaze_user_addr_meta_unknown { __unused: 0 }; + let variant = blaze_user_addr_meta_variant { + unknown: ManuallyDrop::new(unknown), + }; + assert_eq!(format!("{variant:?}"), "blaze_user_addr_meta_variant"); + } +} diff --git a/blazesym/src/c_api/symbolize.rs b/blazesym/src/c_api/symbolize.rs new file mode 100644 index 0000000..018be6d --- /dev/null +++ b/blazesym/src/c_api/symbolize.rs @@ -0,0 +1,509 @@ +use std::alloc::alloc; +use std::alloc::dealloc; +use std::alloc::Layout; +use std::ffi::CStr; +use std::ffi::OsStr; +use std::fmt::Debug; +use std::mem; +use std::os::raw::c_char; +use std::os::unix::ffi::OsStrExt as _; +use std::path::Path; +use std::path::PathBuf; +use std::ptr; + +use crate::log::error; +use crate::log::warn; +use crate::symbolize::Elf; +use crate::symbolize::Gsym; +use crate::symbolize::Kernel; +use crate::symbolize::Process; +use crate::symbolize::Source; +use crate::symbolize::SymbolizedResult; +use crate::symbolize::Symbolizer; +use crate::util::slice_from_user_array; +use crate::Addr; + + +/// The parameters to load symbols and debug information from an ELF. +/// +/// Describes the path and address of an ELF file loaded in a +/// process. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_symbolize_src_elf { + /// The path to the ELF file. + /// + /// The referenced file may be an executable or shared object. For example, + /// passing "/bin/sh" will load symbols and debug information from `sh` and + /// passing "/lib/libc.so.xxx" will load symbols and debug information from + /// libc. + pub path: *const c_char, +} + +impl From<&blaze_symbolize_src_elf> for Elf { + fn from(elf: &blaze_symbolize_src_elf) -> Self { + let blaze_symbolize_src_elf { path } = elf; + Self { + path: unsafe { from_cstr(*path) }, + _non_exhaustive: (), + } + } +} + + +/// The parameters to load symbols and debug information from a kernel. +/// +/// Use a kernel image and a snapshot of its kallsyms as a source of symbols and +/// debug information. +#[repr(C)] +#[derive(Debug, PartialEq)] +pub struct blaze_symbolize_src_kernel { + /// The path of a copy of kallsyms. + /// + /// It can be `"/proc/kallsyms"` for the running kernel on the + /// device. However, you can make copies for later. In that situation, + /// you should give the path of a copy. + /// Passing a `NULL`, by default, will result in `"/proc/kallsyms"`. + pub kallsyms: *const c_char, + /// The path of a kernel image. + /// + /// The path of a kernel image should be, for instance, + /// `"/boot/vmlinux-xxxx"`. For a `NULL` value, it will locate the + /// kernel image of the running kernel in `"/boot/"` or + /// `"/usr/lib/debug/boot/"`. + pub kernel_image: *const c_char, +} + +impl From<&blaze_symbolize_src_kernel> for Kernel { + fn from(kernel: &blaze_symbolize_src_kernel) -> Self { + let blaze_symbolize_src_kernel { + kallsyms, + kernel_image, + } = kernel; + Self { + kallsyms: (!kallsyms.is_null()).then(|| unsafe { from_cstr(*kallsyms) }), + kernel_image: (!kernel_image.is_null()).then(|| unsafe { from_cstr(*kernel_image) }), + _non_exhaustive: (), + } + } +} + + +/// The parameters to load symbols and debug information from a process. +/// +/// Load all ELF files in a process as the sources of symbols and debug +/// information. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_symbolize_src_process { + /// It is the PID of a process to symbolize. + /// + /// blazesym will parse `/proc//maps` and load all the object + /// files. + pub pid: u32, +} + +impl From<&blaze_symbolize_src_process> for Process { + fn from(process: &blaze_symbolize_src_process) -> Self { + let blaze_symbolize_src_process { pid } = process; + Self { + pid: (*pid).into(), + _non_exhaustive: (), + } + } +} + + +/// The parameters to load symbols and debug information from a gsym file. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_symbolize_src_gsym { + /// The path to a gsym file. + pub path: *const c_char, +} + +impl From<&blaze_symbolize_src_gsym> for Gsym { + fn from(gsym: &blaze_symbolize_src_gsym) -> Self { + let blaze_symbolize_src_gsym { path } = gsym; + Self { + path: unsafe { from_cstr(*path) }, + _non_exhaustive: (), + } + } +} + + +/// A placeholder symbolizer for C API. +/// +/// It is returned by [`blaze_symbolizer_new`] and should be free by +/// [`blaze_symbolizer_free`]. +pub type blaze_symbolizer = Symbolizer; + + +/// The result of symbolization of an address. +/// +/// A `blaze_sym` is the information of a symbol found for an +/// address. One address may result in several symbols. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_sym { + /// The symbol name is where the given address should belong to. + pub symbol: *const c_char, + /// The address (i.e.,the first byte) is where the symbol is located. + /// + /// The address is already relocated to the address space of + /// the process. + pub addr: Addr, + /// The path of the source file defining the symbol. + pub path: *const c_char, + /// The line number on which the symbol was to be found in the source code. + pub line: usize, + pub column: usize, +} + +/// `blaze_entry` is the output of symbolization for an address for C API. +/// +/// Every address has an `blaze_entry` in +/// [`blaze_result::entries`] to collect symbols found. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_entry { + /// The number of symbols found for an address. + pub size: usize, + /// All symbols found. + /// + /// `syms` is an array of [`blaze_sym`] in the size `size`. + pub syms: *const blaze_sym, +} + +/// `blaze_result` is the result of symbolization for C API. +/// +/// Instances of [`blaze_result`] are returned by any of the `blaze_symbolize_*` +/// variants. They should be freed by calling [`blaze_result_free`]. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_result { + /// The number of addresses being symbolized. + pub size: usize, + /// The entries for addresses. + /// + /// Symbolization occurs based on the order of addresses. + /// Therefore, every address must have an entry here on the same + /// order. + pub entries: [blaze_entry; 0], +} + +/// Create a `PathBuf` from a pointer of C string +/// +/// # Safety +/// The provided `cstr` should be terminated with a NUL byte. +unsafe fn from_cstr(cstr: *const c_char) -> PathBuf { + Path::new(OsStr::from_bytes( + unsafe { CStr::from_ptr(cstr) }.to_bytes(), + )) + .to_path_buf() +} + + +/// Options for configuring `blaze_symbolizer` objects. +#[repr(C)] +#[derive(Debug)] +pub struct blaze_symbolizer_opts { + /// Whether to enable usage of debug symbols. + pub debug_syms: bool, + /// Whether to attempt to gather source code location information. + /// + /// This setting implies `debug_syms` (and forces it to `true`). + pub src_location: bool, +} + + +/// Create an instance of a symbolizer. +#[no_mangle] +pub extern "C" fn blaze_symbolizer_new() -> *mut blaze_symbolizer { + let symbolizer = Symbolizer::new(); + let symbolizer_box = Box::new(symbolizer); + Box::into_raw(symbolizer_box) +} + +/// Create an instance of a symbolizer with configurable options. +/// +/// # Safety +/// `opts` needs to be a valid pointer. +#[no_mangle] +pub unsafe extern "C" fn blaze_symbolizer_new_opts( + opts: *const blaze_symbolizer_opts, +) -> *mut blaze_symbolizer { + // SAFETY: The caller ensures that the pointer is valid. + let opts = unsafe { &*opts }; + let blaze_symbolizer_opts { + debug_syms, + src_location, + } = opts; + + let symbolizer = Symbolizer::builder() + .enable_debug_syms(*debug_syms) + .enable_src_location(*src_location) + .build(); + let symbolizer_box = Box::new(symbolizer); + Box::into_raw(symbolizer_box) +} + +/// Free an instance of blazesym a symbolizer for C API. +/// +/// # Safety +/// +/// The pointer must have been returned by [`blaze_symbolizer_new`] or +/// [`blaze_symbolizer_new_opts`]. +#[no_mangle] +pub unsafe extern "C" fn blaze_symbolizer_free(symbolizer: *mut blaze_symbolizer) { + if !symbolizer.is_null() { + drop(unsafe { Box::from_raw(symbolizer) }); + } +} + +/// Convert [`SymbolizedResult`] objects to [`blaze_result`] ones. +/// +/// # Safety +/// +/// The returned pointer should be freed by [`blaze_result_free`]. +unsafe fn convert_symbolizedresults_to_c( + results: Vec>, +) -> *const blaze_result { + // Allocate a buffer to contain a blaze_result, all + // blaze_sym, and C strings of symbol and path. + let strtab_size = results.iter().flatten().fold(0, |acc, result| { + acc + result.symbol.len() + result.path.as_os_str().len() + 2 + }); + let all_csym_size = results.iter().flatten().count(); + let buf_size = strtab_size + + mem::size_of::() + + mem::size_of::() * results.len() + + mem::size_of::() * all_csym_size; + let raw_buf_with_sz = + unsafe { alloc(Layout::from_size_align(buf_size + mem::size_of::(), 8).unwrap()) }; + if raw_buf_with_sz.is_null() { + return ptr::null() + } + + // prepend an u64 to keep the size of the buffer. + unsafe { *(raw_buf_with_sz as *mut u64) = buf_size as u64 }; + + let raw_buf = unsafe { raw_buf_with_sz.add(mem::size_of::()) }; + + let result_ptr = raw_buf as *mut blaze_result; + let mut entry_last = unsafe { &mut (*result_ptr).entries as *mut blaze_entry }; + let mut csym_last = unsafe { + raw_buf.add(mem::size_of::() + mem::size_of::() * results.len()) + } as *mut blaze_sym; + let mut cstr_last = unsafe { + raw_buf.add( + mem::size_of::() + + mem::size_of::() * results.len() + + mem::size_of::() * all_csym_size, + ) + } as *mut c_char; + + let mut make_cstr = |src: &OsStr| { + let cstr = cstr_last; + unsafe { ptr::copy(src.as_bytes().as_ptr(), cstr as *mut u8, src.len()) }; + unsafe { *cstr.add(src.len()) = 0 }; + cstr_last = unsafe { cstr_last.add(src.len() + 1) }; + + cstr + }; + + unsafe { (*result_ptr).size = results.len() }; + + // Convert all `SymbolizedResult`s to `blaze_entry`s and `blazesym_sym`s. + for entry in results { + unsafe { (*entry_last).size = entry.len() }; + unsafe { (*entry_last).syms = csym_last }; + entry_last = unsafe { entry_last.add(1) }; + + for r in entry { + let symbol_ptr = make_cstr(OsStr::new(&r.symbol)); + + let path_ptr = make_cstr(r.path.as_os_str()); + + let csym_ref = unsafe { &mut *csym_last }; + csym_ref.symbol = symbol_ptr; + csym_ref.addr = r.addr; + csym_ref.path = path_ptr; + csym_ref.line = r.line; + csym_ref.column = r.column; + + csym_last = unsafe { csym_last.add(1) }; + } + } + + result_ptr +} + +unsafe fn blaze_symbolize_impl( + symbolizer: *mut blaze_symbolizer, + src: Source, + addrs: *const Addr, + addr_cnt: usize, +) -> *const blaze_result { + // SAFETY: The caller ensures that the pointer is valid. + let symbolizer = unsafe { &*symbolizer }; + // SAFETY: The caller ensures that the pointer is valid and the count + // matches. + let addrs = unsafe { slice_from_user_array(addrs, addr_cnt) }; + + let result = symbolizer.symbolize(&src, addrs); + + match result { + Ok(results) if results.is_empty() => { + warn!("empty result while request for {addr_cnt}"); + ptr::null() + } + Ok(results) => unsafe { convert_symbolizedresults_to_c(results) }, + Err(_err) => { + error!("failed to symbolize {addr_cnt} addresses: {_err}"); + ptr::null() + } + } +} + + +/// Symbolize addresses of a process. +/// +/// Return an array of [`blaze_result`] with the same size as the +/// number of input addresses. The caller should free the returned array by +/// calling [`blaze_result_free`]. +/// +/// # Safety +/// `symbolizer` must have been allocated using [`blaze_symbolizer_new`] or +/// [`blaze_symbolizer_new_opts`]. `src` must point to a valid +/// [`blaze_symbolize_src_process`] object. `addrs` must represent an array of +/// `addr_cnt` objects. +#[no_mangle] +pub unsafe extern "C" fn blaze_symbolize_process( + symbolizer: *mut blaze_symbolizer, + src: *const blaze_symbolize_src_process, + addrs: *const Addr, + addr_cnt: usize, +) -> *const blaze_result { + // SAFETY: The caller ensures that the pointer is valid. + let src = Source::from(Process::from(unsafe { &*src })); + unsafe { blaze_symbolize_impl(symbolizer, src, addrs, addr_cnt) } +} + + +/// Symbolize kernel addresses. +/// +/// Return an array of [`blaze_result`] with the same size as the +/// number of input addresses. The caller should free the returned array by +/// calling [`blaze_result_free`]. +/// +/// # Safety +/// `symbolizer` must have been allocated using [`blaze_symbolizer_new`] or +/// [`blaze_symbolizer_new_opts`]. `src` must point to a valid +/// [`blaze_symbolize_src_kernel`] object. `addrs` must represent an array of +/// `addr_cnt` objects. +#[no_mangle] +pub unsafe extern "C" fn blaze_symbolize_kernel( + symbolizer: *mut blaze_symbolizer, + src: *const blaze_symbolize_src_kernel, + addrs: *const Addr, + addr_cnt: usize, +) -> *const blaze_result { + // SAFETY: The caller ensures that the pointer is valid. + let src = Source::from(Kernel::from(unsafe { &*src })); + unsafe { blaze_symbolize_impl(symbolizer, src, addrs, addr_cnt) } +} + + +/// Symbolize addresses in an ELF file. +/// +/// Return an array of [`blaze_result`] with the same size as the +/// number of input addresses. The caller should free the returned array by +/// calling [`blaze_result_free`]. +/// +/// # Safety +/// `symbolizer` must have been allocated using [`blaze_symbolizer_new`] or +/// [`blaze_symbolizer_new_opts`]. `src` must point to a valid +/// [`blaze_symbolize_src_elf`] object. `addrs` must represent an array of +/// `addr_cnt` objects. +#[no_mangle] +pub unsafe extern "C" fn blaze_symbolize_elf( + symbolizer: *mut blaze_symbolizer, + src: *const blaze_symbolize_src_elf, + addrs: *const Addr, + addr_cnt: usize, +) -> *const blaze_result { + // SAFETY: The caller ensures that the pointer is valid. + let src = Source::from(Elf::from(unsafe { &*src })); + unsafe { blaze_symbolize_impl(symbolizer, src, addrs, addr_cnt) } +} + + +/// Symbolize addresses in a Gsym file. +/// +/// Return an array of [`blaze_result`] with the same size as the +/// number of input addresses. The caller should free the returned array by +/// calling [`blaze_result_free`]. +/// +/// # Safety +/// `symbolizer` must have been allocated using [`blaze_symbolizer_new`] or +/// [`blaze_symbolizer_new_opts`]. `src` must point to a valid +/// [`blaze_symbolize_src_gsym`] object. `addrs` must represent an array of +/// `addr_cnt` objects. +#[no_mangle] +pub unsafe extern "C" fn blaze_symbolize_gsym( + symbolizer: *mut blaze_symbolizer, + src: *const blaze_symbolize_src_gsym, + addrs: *const Addr, + addr_cnt: usize, +) -> *const blaze_result { + // SAFETY: The caller ensures that the pointer is valid. + let src = Source::from(Gsym::from(unsafe { &*src })); + unsafe { blaze_symbolize_impl(symbolizer, src, addrs, addr_cnt) } +} + + +/// Free an array returned by any of the `blaze_symbolize_*` variants. +/// +/// # Safety +/// The pointer must have been returned by any of the `blaze_symbolize_*` +/// variants. +#[no_mangle] +pub unsafe extern "C" fn blaze_result_free(results: *const blaze_result) { + if results.is_null() { + return + } + + let raw_buf_with_sz = unsafe { (results as *mut u8).offset(-(mem::size_of::() as isize)) }; + let sz = unsafe { *(raw_buf_with_sz as *mut u64) } as usize + mem::size_of::(); + unsafe { dealloc(raw_buf_with_sz, Layout::from_size_align(sz, 8).unwrap()) }; +} + + +#[cfg(test)] +mod tests { + use super::*; + + + /// Check that we can convert an [`Unknown`] into a + /// [`blaze_user_addr_meta_unknown`] and back. + #[test] + fn kernel_conversion() { + let kernel = blaze_symbolize_src_kernel { + kallsyms: ptr::null(), + kernel_image: ptr::null(), + }; + let kernel = Kernel::from(&kernel); + assert_eq!(kernel.kallsyms, None); + assert_eq!(kernel.kernel_image, None); + + let kernel = blaze_symbolize_src_kernel { + kallsyms: b"/proc/kallsyms\0" as *const _ as *const c_char, + kernel_image: b"/boot/image\0" as *const _ as *const c_char, + }; + let kernel = Kernel::from(&kernel); + assert_eq!(kernel.kallsyms, Some(PathBuf::from("/proc/kallsyms"))); + assert_eq!(kernel.kernel_image, Some(PathBuf::from("/boot/image"))); + } +} diff --git a/blazesym/src/dwarf/constants.rs b/blazesym/src/dwarf/constants.rs new file mode 100644 index 0000000..c6e6a45 --- /dev/null +++ b/blazesym/src/dwarf/constants.rs @@ -0,0 +1,64 @@ +pub const DW_UT_compile: u8 = 0x1; +pub const DW_UT_type: u8 = 0x2; + +pub const DW_TAG_array_type: u8 = 0x1; +pub const DW_TAG_enumeration_type: u8 = 0x4; +pub const DW_TAG_compile_unit: u8 = 0x11; +pub const DW_TAG_subprogram: u8 = 0x2e; +pub const DW_TAG_variable: u8 = 0x34; +pub const DW_TAG_namespace: u8 = 0x39; + +pub const DW_CHILDREN_no: u8 = 0x00; +pub const DW_CHILDREN_yes: u8 = 0x01; + +pub const DW_AT_sibling: u8 = 0x01; +pub const DW_AT_location: u8 = 0x02; +pub const DW_AT_name: u8 = 0x03; +pub const DW_AT_lo_pc: u8 = 0x11; +pub const DW_AT_hi_pc: u8 = 0x12; +pub const DW_AT_entry_pc: u8 = 0x52; +pub const DW_AT_linkage_name: u8 = 0x6e; + +pub const DW_FORM_addr: u8 = 0x01; +pub const DW_FORM_block2: u8 = 0x03; +pub const DW_FORM_block4: u8 = 0x04; +pub const DW_FORM_data2: u8 = 0x05; +pub const DW_FORM_data4: u8 = 0x06; +pub const DW_FORM_data8: u8 = 0x07; +pub const DW_FORM_string: u8 = 0x08; +pub const DW_FORM_block: u8 = 0x09; +pub const DW_FORM_block1: u8 = 0x0a; +pub const DW_FORM_data1: u8 = 0x0b; +pub const DW_FORM_flag: u8 = 0x0c; +pub const DW_FORM_sdata: u8 = 0x0d; +pub const DW_FORM_strp: u8 = 0x0e; +pub const DW_FORM_udata: u8 = 0x0f; +pub const DW_FORM_ref_addr: u8 = 0x10; +pub const DW_FORM_ref1: u8 = 0x11; +pub const DW_FORM_ref2: u8 = 0x12; +pub const DW_FORM_ref4: u8 = 0x13; +pub const DW_FORM_ref8: u8 = 0x14; +pub const DW_FORM_ref_udata: u8 = 0x15; +pub const DW_FORM_indirect: u8 = 0x16; +pub const DW_FORM_sec_offset: u8 = 0x17; +pub const DW_FORM_exprloc: u8 = 0x18; +pub const DW_FORM_flag_present: u8 = 0x19; +pub const DW_FORM_strx: u8 = 0x1a; +pub const DW_FORM_addrx: u8 = 0x1b; +pub const DW_FORM_ref_sup4: u8 = 0x1c; +pub const DW_FORM_strp_sup: u8 = 0x1d; +pub const DW_FORM_data16: u8 = 0x1e; +pub const DW_FORM_line_strp: u8 = 0x1f; +pub const DW_FORM_ref_sig8: u8 = 0x20; +pub const DW_FORM_implicit_const: u8 = 0x21; +pub const DW_FORM_loclistx: u8 = 0x22; +pub const DW_FORM_rnglistx: u8 = 0x23; +pub const DW_FORM_ref_sup8: u8 = 0x24; +pub const DW_FORM_str1: u8 = 0x25; +pub const DW_FORM_str2: u8 = 0x26; +pub const DW_FORM_str3: u8 = 0x27; +pub const DW_FORM_str4: u8 = 0x28; +pub const DW_FORM_addrx1: u8 = 0x29; +pub const DW_FORM_addrx2: u8 = 0x2a; +pub const DW_FORM_addrx3: u8 = 0x2b; +pub const DW_FORM_addrx4: u8 = 0x2c; diff --git a/blazesym/src/dwarf/debug_info.rs b/blazesym/src/dwarf/debug_info.rs new file mode 100644 index 0000000..70f0c18 --- /dev/null +++ b/blazesym/src/dwarf/debug_info.rs @@ -0,0 +1,896 @@ +//! Parse the `.debug_info` section to get Debug Information Entries. +//! +//! It supports DWARFv4 now. (See ) +//! It parse DIEs from the `.debug_info` section and Abbreviations +//! from the `.debg_abbrev` section. +//! +//! The `.debug_info` section is a list of (Compile-)Units. Every +//! Unit comprises DIEs to carry debug information of a source file. +//! A Unit starts with a header to describe the size of this unit in +//! the section, the offset of its abbreviation table in the +//! `.debug_abbrev` section, ..., and DWARF version. (version 4) +//! +//! A DIE starts with an index encoded in LEB128 to the abbreviation +//! table of the Unit. The abbreviation given by the index describle +//! the content, format and layout of a DIE. The abbreviation index +//! starts from 1. 0 means a null entry. DIEs in an Unit are +//! organized as a tree, parent-children. Null entries are used to +//! signal the last sibling to end a level. +//! +//! A user starts a parser by creating an instance of [`UnitIter`]. +//! It will walk through the data in the `.debug_info` and +//! `.debug_abbrev` section to return Units. + +use std::io::Error; +use std::io::ErrorKind; +use std::iter::Iterator; +use std::mem; + +use crate::log; +use crate::util::decode_leb128_128; +use crate::util::decode_udword; +use crate::util::decode_uhalf; +use crate::util::decode_uword; +use crate::util::ReadRaw as _; + +use super::constants::*; + + +fn read_3bytes(data: &mut &[u8]) -> Option { + if let [b1, b2, b3] = data.read_slice(3)? { + Some(*b1 as u32 | ((*b2 as u32) << 8) | ((*b3 as u32) << 16)) + } else { + unreachable!() + } +} + +#[allow(unused)] +pub struct UnknownHeader { + init_length: usize, + bits64: bool, + version: u16, + unit_type: u8, + hdr_size: usize, +} + +#[allow(unused)] +pub struct CUHeaderV5 { + init_length: usize, + bits64: bool, + version: u16, + unit_type: u8, + address_size: u8, + debug_abbrev_offset: u64, + hdr_size: usize, +} + +#[allow(unused)] +pub struct CUHeaderV4 { + init_length: usize, + bits64: bool, + version: u16, + address_size: u8, + debug_abbrev_offset: u64, // The location of the abbreviation table. + hdr_size: usize, +} + +/// The Unit header. +/// +/// With DWARFv4, an unit header describe a compile unit followed by +/// DIEs of the unit in the `.debug_info` section. DWARFv5 is much +/// more complicated. +/// +/// So far, blazesym supports only DWARFv4, that is common used. +pub enum UnitHeader { + CompileV4(CUHeaderV4), + CompileV5(CUHeaderV5), + Unknown(UnknownHeader), +} + +impl UnitHeader { + fn unit_size(&self) -> usize { + match self { + UnitHeader::CompileV4(h) => h.init_length + (if h.bits64 { 12 } else { 4 }), + UnitHeader::CompileV5(h) => h.init_length + (if h.bits64 { 12 } else { 4 }), + UnitHeader::Unknown(h) => h.init_length + (if h.bits64 { 12 } else { 4 }), + } + } + + fn header_size(&self) -> usize { + match self { + UnitHeader::CompileV4(h) => h.hdr_size, + UnitHeader::CompileV5(h) => h.hdr_size, + UnitHeader::Unknown(h) => h.hdr_size, + } + } +} + +#[derive(Clone)] +pub struct AbbrevAttr { + name: u8, + form: u8, + opt: u128, +} + +/// An abbreviation. +/// +/// An abbreviation describes the format of a DIE. It comprises a list +/// of specifications that describe the names and the formats of +/// attributes. A DIE will be formatted in the way described by it's +/// abbreviation. +pub struct Abbrev { + /// The index to the abbreviation table. + pub abbrev_code: u32, + /// The type of the abbreviation. + /// + /// It can be a DW_TAG_compile (a compile unit), + /// DW_TAG_subprogram, DW_TAG_variable, ... etc. + pub tag: u8, + pub has_children: bool, + + parsed_attrs: Vec, +} + +impl Abbrev { + #[inline] + pub fn all_attrs(&self) -> &[AbbrevAttr] { + &self.parsed_attrs[..] + } +} + +/// Parse an abbreviation from a buffer. +/// +/// Include all attributes, names and forms. +#[inline] +fn parse_abbrev(data: &[u8]) -> Option<(Abbrev, usize)> { + let (abbrev_code, bytes) = decode_leb128_128(data)?; + if abbrev_code == 0 { + return Some(( + Abbrev { + abbrev_code: 0, + tag: 0, + has_children: false, + parsed_attrs: vec![], + }, + 1, + )) + } + + let mut pos = bytes as usize; + let (tag, bytes) = decode_leb128_128(&data[pos..])?; + pos += bytes as usize; + let has_children = data[pos] == DW_CHILDREN_yes; + pos += 1; + + let mut parsed_attrs = Vec::::new(); + while pos < data.len() { + if let Some((name, form, opt, bytes)) = parse_abbrev_attr(&data[pos..]) { + pos += bytes; + parsed_attrs.push(AbbrevAttr { name, form, opt }); + if form == 0 { + break + } + } else { + break + } + } + + Some(( + Abbrev { + abbrev_code: abbrev_code as u32, + tag: tag as u8, + has_children, + parsed_attrs, + }, + pos, + )) +} + +/// Parse an attribute specification from a buffer. +/// +/// Return the name, form, optional value and size of an abbreviation. +#[inline] +fn parse_abbrev_attr(data: &[u8]) -> Option<(u8, u8, u128, usize)> { + let mut pos = 0; // Track the size of this abbreviation. + let (name, bytes) = decode_leb128_128(&data[pos..])?; + pos += bytes as usize; + let (form, bytes) = decode_leb128_128(&data[pos..])?; + pos += bytes as usize; + let opt = if form as u8 == DW_FORM_implicit_const || form as u8 == DW_FORM_indirect { + let (c, bytes) = decode_leb128_128(&data[pos..])?; + pos += bytes as usize; + c + } else { + 0 + }; + Some((name as u8, form as u8, opt, pos)) +} + +#[derive(Clone, Debug)] +pub enum AttrValue<'a> { + Signed128(i128), + Unsigned(u64), + Unsigned128(u128), + Bytes(&'a [u8]), + String(&'a str), +} + +fn extract_attr_value_impl<'data>( + data: &mut &'data [u8], + form: u8, + dwarf_sz: usize, + addr_sz: usize, +) -> Option> { + match form { + DW_FORM_addr => { + if addr_sz == 0x4 { + Some(AttrValue::Unsigned(data.read_u32()? as u64)) + } else { + Some(AttrValue::Unsigned(data.read_u64()?)) + } + } + DW_FORM_block2 => { + let value = data.read_u16()?; + Some(AttrValue::Bytes(data.read_slice(value.into())?)) + } + DW_FORM_block4 => { + let value = data.read_u32()?; + Some(AttrValue::Bytes(data.read_slice(value as usize)?)) + } + DW_FORM_data2 => Some(AttrValue::Unsigned(data.read_u16()?.into())), + DW_FORM_data4 => Some(AttrValue::Unsigned(data.read_u32()?.into())), + DW_FORM_data8 => Some(AttrValue::Unsigned(data.read_u64()?)), + DW_FORM_string => { + let string = data.read_cstr()?; + Some(AttrValue::String(string.to_str().ok()?)) + } + DW_FORM_block => { + let (value, _bytes) = data.read_u128_leb128()?; + Some(AttrValue::Bytes(data.read_slice(value as usize)?)) + } + DW_FORM_block1 => { + let value = data.read_u8()?; + Some(AttrValue::Bytes(data.read_slice(value.into())?)) + } + DW_FORM_data1 => Some(AttrValue::Unsigned(data.read_u8()?.into())), + DW_FORM_flag => Some(AttrValue::Unsigned(data.read_u8()?.into())), + DW_FORM_sdata => { + let (value, _bytes) = data.read_i128_leb128()?; + Some(AttrValue::Signed128(value)) + } + DW_FORM_strp => { + if dwarf_sz == 0x4 { + Some(AttrValue::Unsigned(data.read_u32()?.into())) + } else { + Some(AttrValue::Unsigned(data.read_u64()?)) + } + } + DW_FORM_udata => { + let (value, _bytes) = data.read_u128_leb128()?; + Some(AttrValue::Unsigned128(value)) + } + DW_FORM_ref_addr => { + if dwarf_sz == 0x4 { + Some(AttrValue::Unsigned(data.read_u32()?.into())) + } else { + Some(AttrValue::Unsigned(data.read_u64()?)) + } + } + DW_FORM_ref1 => Some(AttrValue::Unsigned(data.read_u8()?.into())), + DW_FORM_ref2 => Some(AttrValue::Unsigned(data.read_u16()?.into())), + DW_FORM_ref4 => Some(AttrValue::Unsigned(data.read_u32()?.into())), + DW_FORM_ref8 => Some(AttrValue::Unsigned(data.read_u64()?)), + DW_FORM_ref_udata => { + let (value, _bytes) = data.read_u128_leb128()?; + Some(AttrValue::Unsigned128(value)) + } + DW_FORM_indirect => { + let (f, _bytes) = data.read_u128_leb128()?; + extract_attr_value_impl(data, f as u8, dwarf_sz, addr_sz) + } + DW_FORM_sec_offset => { + if dwarf_sz == 0x4 { + Some(AttrValue::Unsigned(data.read_u32()?.into())) + } else { + Some(AttrValue::Unsigned(data.read_u64()?)) + } + } + DW_FORM_exprloc => { + let (value, _bytes) = data.read_u128_leb128()?; + Some(AttrValue::Bytes(data.read_slice(value as usize)?)) + } + DW_FORM_flag_present => Some(AttrValue::Unsigned(0)), + DW_FORM_strx => { + let (value, _bytes) = data.read_u128_leb128()?; + Some(AttrValue::Unsigned(value as u64)) + } + DW_FORM_addrx => { + let (value, _bytes) = data.read_u128_leb128()?; + Some(AttrValue::Unsigned(value as u64)) + } + DW_FORM_ref_sup4 => Some(AttrValue::Unsigned(data.read_u32()?.into())), + DW_FORM_strp_sup => { + if dwarf_sz == 0x4 { + Some(AttrValue::Unsigned(data.read_u32()?.into())) + } else { + Some(AttrValue::Unsigned(data.read_u64()?)) + } + } + DW_FORM_data16 => Some(AttrValue::Bytes(data.read_slice(16)?)), + DW_FORM_line_strp => { + if dwarf_sz == 0x4 { + Some(AttrValue::Unsigned(data.read_u32()?.into())) + } else { + Some(AttrValue::Unsigned(data.read_u64()?)) + } + } + DW_FORM_ref_sig8 => Some(AttrValue::Bytes(data.read_slice(8)?)), + DW_FORM_implicit_const => Some(AttrValue::Unsigned(0)), + DW_FORM_loclistx => { + let (value, _bytes) = data.read_u128_leb128()?; + Some(AttrValue::Unsigned(value as u64)) + } + DW_FORM_rnglistx => { + let (value, _bytes) = data.read_u128_leb128()?; + Some(AttrValue::Unsigned(value as u64)) + } + DW_FORM_ref_sup8 => Some(AttrValue::Unsigned(data.read_u64()?)), + DW_FORM_str1 => Some(AttrValue::Unsigned(data.read_u8()?.into())), + DW_FORM_str2 => Some(AttrValue::Unsigned(data.read_u16()?.into())), + DW_FORM_str3 => Some(AttrValue::Unsigned(read_3bytes(data)?.into())), + DW_FORM_str4 => Some(AttrValue::Unsigned(data.read_u32()?.into())), + DW_FORM_addrx1 => Some(AttrValue::Unsigned(data.read_u8()?.into())), + DW_FORM_addrx2 => Some(AttrValue::Unsigned(data.read_u16()?.into())), + DW_FORM_addrx3 => Some(AttrValue::Unsigned(read_3bytes(data)?.into())), + DW_FORM_addrx4 => Some(AttrValue::Unsigned(data.read_u32()?.into())), + _ => None, + } +} + +/// Extract the value of an attribute from a data buffer. +/// +/// This function works with [`parse_abbrev_attr()`], that parse the +/// attribute specifications of DIEs declared in the abbreviation +/// table in the .debug_abbrev section, by using the result of +/// [`parse_abbrev_attr()`] to parse the value of an attribute of a +/// DIE. +/// +/// # Arguments +/// +/// * `data` - A buffer where the value is in. +/// * `form` - The format of the value. (DW_FORM_*) +/// * `dwarf_sz` - Describe the DWARF format. (4 for 32-bits and 8 for 64-bits) +/// * `addr_sz` - The size of an address of the target platform. (4 for 32-bits and 8 for 64-bits) +/// +/// Return AttrValue and the number of bytes it takes. +fn extract_attr_value( + mut data: &[u8], + form: u8, + dwarf_sz: usize, + addr_sz: usize, +) -> Option<(AttrValue<'_>, usize)> { + let data = &mut data; + let before = (*data).as_ptr(); + let value = extract_attr_value_impl(data, form, dwarf_sz, addr_sz)?; + let after = (*data).as_ptr(); + // TODO: Remove this workaround once callers no longer require an explicit + // byte count being passed out. + // SAFETY: Both pointers point into the same underlying byte array. + let count = unsafe { after.offset_from(before) }; + Some((value, count.try_into().unwrap())) +} + +/// Parse all abbreviations of an abbreviation table for a compile +/// unit. +/// +/// An abbreviation table is usually for a compile unit, but not always. +/// +/// Return a list of abbreviations and the number of bytes they take. +fn parse_cu_abbrevs(data: &[u8]) -> Option<(Vec, usize)> { + let mut pos = 0; + let mut abbrevs = Vec::::with_capacity(data.len() / 50); // Heuristic! + + while pos < data.len() { + let (abbrev, bytes) = parse_abbrev(&data[pos..])?; + pos += bytes; + if abbrev.abbrev_code == 0x0 { + return Some((abbrevs, pos)) + } + abbrevs.push(abbrev); + } + None +} + +/// Parse an Unit Header from a buffer. +/// +/// An Unit Header is the header of a compile unit, at least for v4. +/// +/// # Arguments +/// +/// * `data` - is the data from the `.debug_info` section. +fn parse_unit_header(data: &[u8]) -> Option { + if data.len() < 4 { + return None + } + + let mut pos = 0; + let mut init_length = decode_uword(data) as usize; + pos += 4; + + let bits64 = init_length == 0xffffffff; + if bits64 { + if (pos + 8) > data.len() { + return None + } + init_length = decode_udword(&data[pos..]) as usize; + pos += 8; + } + + if (pos + 2) > data.len() { + return None + } + let version = decode_uhalf(&data[pos..]); + pos += 2; + + if version == 0x4 { + let debug_abbrev_offset: u64 = if bits64 { + if (pos + 8) > data.len() { + return None + } + let v = decode_udword(&data[pos..]); + pos += 8; + v + } else { + if (pos + 4) > data.len() { + return None + } + let v = decode_uword(&data[pos..]); + pos += 4; + v as u64 + }; + let address_size = data[pos]; + pos += 1; + return Some(UnitHeader::CompileV4(CUHeaderV4 { + init_length, + bits64, + version, + debug_abbrev_offset, + address_size, + hdr_size: pos, + })) + } + + if (pos + 1) > data.len() { + return None + } + let unit_type = data[pos]; + pos += 1; + + match unit_type { + DW_UT_compile => { + if (pos + 1) > data.len() { + return None + } + let address_size = data[pos]; + pos += 1; + + let debug_abbrev_offset: u64 = if bits64 { + if (pos + 8) > data.len() { + return None + } + let v = decode_udword(&data[pos..]); + pos += 8; + v + } else { + if (pos + 4) > data.len() { + return None + } + let v = decode_uword(&data[pos..]); + pos += 4; + v as u64 + }; + Some(UnitHeader::CompileV5(CUHeaderV5 { + init_length, + bits64, + version, + unit_type, + address_size, + debug_abbrev_offset, + hdr_size: pos, + })) + } + _ => Some(UnitHeader::Unknown(UnknownHeader { + init_length, + bits64, + version, + unit_type, + hdr_size: pos, + })), + } +} + +/// Debug Information Entry. +/// +/// A DIE starts with the code of its abbreviation followed by the +/// attribute values described by the abbreviation. The code of an +/// abbreviation is an index to the abbreviation table of the compile +/// unit. +#[allow(clippy::upper_case_acronyms)] +pub struct DIE<'a> { + pub tag: u8, + pub abbrev: Option<&'a Abbrev>, + abbrev_attrs: &'a [AbbrevAttr], + abbrev_attrs_idx: usize, + data: &'a [u8], + dieiter: &'a mut DIEIter<'a>, + reading_offset: usize, + done: bool, +} + +impl<'a> DIE<'a> { + #[inline] + pub fn exhaust(&mut self) -> Result<(), Error> { + let abbrev_attrs = self.abbrev_attrs; + + if self.done { + return Ok(()) + } + + while self.abbrev_attrs_idx < abbrev_attrs.len() { + let attr = &abbrev_attrs[self.abbrev_attrs_idx]; + self.abbrev_attrs_idx += 1; + + if attr.form == 0 { + continue + } + let (_value, bytes) = extract_attr_value( + &self.data[self.reading_offset..], + attr.form, + self.dieiter.dwarf_sz, + self.dieiter.addr_sz, + ) + .ok_or_else(|| { + Error::new(ErrorKind::InvalidData, "failed to parse attribute values") + })?; + self.reading_offset += bytes; + } + self.dieiter.die_finish_reading(self.reading_offset); + self.done = true; + Ok(()) + } +} + +impl<'a> Iterator for DIE<'a> { + // name, form, opt, value + type Item = (u8, u8, u128, AttrValue<'a>); + + #[inline] + fn next(&mut self) -> Option { + if self.done { + return None + } + self.abbrev?; + + if self.abbrev_attrs_idx < self.abbrev_attrs.len() { + let AbbrevAttr { name, form, opt } = self.abbrev_attrs[self.abbrev_attrs_idx]; + self.abbrev_attrs_idx += 1; + + #[cfg(debug)] + if form == 0 { + assert_eq!(self.abbrev_off, abbrev.attrs.len()); + } + if form == 0 { + self.dieiter.die_finish_reading(self.reading_offset); + self.done = true; + return None + } + + let (value, bytes) = extract_attr_value( + &self.data[self.reading_offset..], + form, + self.dieiter.dwarf_sz, + self.dieiter.addr_sz, + )?; + self.reading_offset += bytes; + Some((name, form, opt, value)) + } else { + self.dieiter.die_finish_reading(self.reading_offset); + self.done = true; + None + } + } +} + +/// The iterator of DIEs in an Unit. +pub struct DIEIter<'a> { + data: &'a [u8], + dwarf_sz: usize, + addr_sz: usize, + off: usize, + off_delta: usize, + cur_depth: usize, + abbrevs: Vec, + abbrev: Option<&'a Abbrev>, + die_reading_done: bool, + done: bool, +} + +impl<'a> DIEIter<'a> { + pub fn die_finish_reading(&mut self, size: usize) { + self.die_reading_done = true; + self.off += size; + } + + pub fn seek_to_sibling(&mut self, off: usize) { + self.off = off - self.off_delta; + self.cur_depth -= 1; + self.die_reading_done = true; + } + + #[inline] + pub fn exhaust_die(&mut self) -> Result<(), Error> { + assert!( + !self.die_reading_done, + "DIE should not have been exhausted!" + ); + let abbrev = self.abbrev.unwrap(); + for attr in abbrev.all_attrs() { + if attr.form == 0 { + continue + } + let (_value, bytes) = extract_attr_value( + &self.data[self.off..], + attr.form, + self.dwarf_sz, + self.addr_sz, + ) + .ok_or_else(|| { + Error::new(ErrorKind::InvalidData, "failed to parse attribute values") + })?; + self.off += bytes; + } + self.die_reading_done = true; + Ok(()) + } +} + +impl<'a> Iterator for DIEIter<'a> { + type Item = DIE<'a>; + + fn next(&mut self) -> Option { + if !self.die_reading_done { + self.exhaust_die().unwrap(); + } + if self.done { + return None + } + + let (abbrev_idx, bytes) = decode_leb128_128(&self.data[self.off..])?; + self.off += bytes as usize; + + if abbrev_idx == 0 { + self.cur_depth -= 1; + if self.cur_depth == 0 { + self.done = true; + } + Some(DIE { + tag: 0, + abbrev: None, + abbrev_attrs: &[], + abbrev_attrs_idx: 0, + data: &self.data[self.off..], + dieiter: unsafe { mem::transmute(self) }, + reading_offset: 0, + done: false, + }) + } else { + let abbrev = unsafe { mem::transmute(&self.abbrevs[abbrev_idx as usize - 1]) }; + self.abbrev = Some(abbrev); + if abbrev.has_children { + self.cur_depth += 1; + } + + self.die_reading_done = false; + Some(DIE { + tag: abbrev.tag, + abbrev: Some(abbrev), + abbrev_attrs: abbrev.all_attrs(), + abbrev_attrs_idx: 0, + data: &self.data[self.off..], + dieiter: unsafe { mem::transmute(self) }, + reading_offset: 0, + done: false, + }) + } + } +} + +/// An iterator of Units in the `.debug_info` section. +/// +/// An iterator is built from the content of `.debug_info` section, +/// which is a list of compile units. A compile unit usually refers +/// to a source file. In the compile units, it is a forest of DIEs, +/// which presents functions, variables and other debug information. +pub struct UnitIter<'a> { + info_data: &'a [u8], + abbrev_data: &'a [u8], + off: usize, +} + +impl<'a> UnitIter<'a> { + /// Build an iterator from the content of `.debug_info` & `.debug_abbrev`. + /// + /// # Arguments + /// + /// * `info_data` is the content of the `.debug_info` section. + /// * `abbrev_data` is the content of the `.debug_abbrev` section. + pub fn new(info_data: &'a [u8], abbrev_data: &'a [u8]) -> UnitIter<'a> { + UnitIter { + info_data, + abbrev_data, + off: 0, + } + } +} + +impl<'a> Iterator for UnitIter<'a> { + type Item = (UnitHeader, DIEIter<'a>); + + fn next(&mut self) -> Option { + loop { + let off = self.off; + let uh = parse_unit_header(&self.info_data[off..])?; + let hdr_sz = uh.header_size(); + self.off += uh.unit_size(); + + match uh { + UnitHeader::CompileV4(ref cuh) => { + let dwarf_sz = if cuh.bits64 { 8 } else { 4 }; + let addr_sz = cuh.address_size as usize; + let (abbrevs, _) = + parse_cu_abbrevs(&self.abbrev_data[cuh.debug_abbrev_offset as usize..])?; + break Some(( + uh, + DIEIter { + data: &self.info_data[off + hdr_sz..], + dwarf_sz, + addr_sz, + off: 0, + off_delta: hdr_sz, + cur_depth: 0, + abbrevs, + abbrev: None, + die_reading_done: true, + done: false, + }, + )) + } + // blazesym supports only v4 so far. + UnitHeader::CompileV5(ref _cuh) => { + log::warn!("ignoring unsupported DWARF v5 unit header"); + } + UnitHeader::Unknown(ref _cuh) => (), + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::env; + use std::path::Path; + + use test_log::test; + + use crate::elf::ElfParser; + + + #[test] + fn test_parse_abbrev() { + let raw = [ + 0x01, 0x11, 0x01, 0x25, 0x0e, 0x13, 0x05, 0x03, 0x0e, 0x10, 0x17, 0x1b, 0x0e, 0xb4, + 0x42, 0x19, 0x11, 0x01, 0x55, 0x17, 0x00, 0x00, 0x02, 0x39, 0x01, 0x03, 0x0e, 0x00, + 0x00, 0x03, 0x04, 0x01, 0x49, 0x13, 0x6d, 0x19, 0x03, 0x0e, 0x0b, 0x0b, 0x88, 0x01, + 0x0f, 0x00, 0x00, 0x04, 0x28, 0x00, 0x03, 0x0e, 0x1c, 0x0f, 0x00, 0x00, 0x05, 0x13, + 0x01, 0x03, 0x0e, 0x0b, 0x0b, 0x88, 0x01, 0x0f, 0x00, 0x00, + ]; + let (abbrev, bytes) = parse_abbrev(&raw).unwrap(); + assert_eq!(bytes, 22); + assert_eq!(abbrev.abbrev_code, 0x1); + assert_eq!(abbrev.tag, DW_TAG_compile_unit); + assert!(abbrev.has_children); + let mut pos = bytes; + + let (abbrev, bytes) = parse_abbrev(&raw[pos..]).unwrap(); + assert_eq!(bytes, 7); + assert_eq!(abbrev.abbrev_code, 0x2); + assert_eq!(abbrev.tag, DW_TAG_namespace); + assert!(abbrev.has_children); + pos += bytes; + + let (abbrev, bytes) = parse_abbrev(&raw[pos..]).unwrap(); + assert_eq!(bytes, 16); + assert_eq!(abbrev.abbrev_code, 0x3); + assert_eq!(abbrev.tag, DW_TAG_enumeration_type); + assert!(abbrev.has_children); + pos += bytes; + + let (abbrev, bytes) = parse_abbrev(&raw[pos..]).unwrap(); + assert_eq!(bytes, 9); + assert_eq!(abbrev.abbrev_code, 0x4); + assert!(!abbrev.has_children); + pos += bytes; + + let (abbrev, bytes) = parse_abbrev(&raw[pos..]).unwrap(); + assert_eq!(bytes, 12); + assert_eq!(abbrev.abbrev_code, 0x5); + assert!(abbrev.has_children); + } + + #[test] + fn test_parse_cu_abbrevs() { + let raw = [ + 0x01, 0x11, 0x01, 0x25, 0x0e, 0x13, 0x05, 0x03, 0x0e, 0x10, 0x17, 0x1b, 0x0e, 0xb4, + 0x42, 0x19, 0x11, 0x01, 0x55, 0x17, 0x00, 0x00, 0x02, 0x39, 0x01, 0x03, 0x0e, 0x00, + 0x00, 0x03, 0x04, 0x01, 0x49, 0x13, 0x6d, 0x19, 0x03, 0x0e, 0x0b, 0x0b, 0x88, 0x01, + 0x0f, 0x00, 0x00, 0x04, 0x28, 0x00, 0x03, 0x0e, 0x1c, 0x0f, 0x00, 0x00, 0x05, 0x13, + 0x01, 0x03, 0x0e, 0x0b, 0x0b, 0x88, 0x01, 0x0f, 0x00, 0x00, 0x00, + ]; + let (abbrevs, bytes) = parse_cu_abbrevs(&raw).unwrap(); + assert_eq!(abbrevs.len(), 0x5); + assert_eq!(bytes, raw.len()); + } + + #[test] + fn test_unititer() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("dwarf-example"); + let elfparser = ElfParser::open(&bin_name).unwrap(); + let abbrev_idx = elfparser.find_section(".debug_abbrev").unwrap(); + let abbrev = elfparser.read_section_raw(abbrev_idx).unwrap(); + let info_idx = elfparser.find_section(".debug_info").unwrap(); + let info = elfparser.read_section_raw(info_idx).unwrap(); + + let iter = UnitIter::new(info, abbrev); + let mut cnt = 0; + let mut die_cnt = 0; + let mut attr_cnt = 0; + let mut subprog_cnt = 0; + for (_uh, dieiter) in iter { + cnt += 1; + for die in dieiter { + die_cnt += 1; + if die.tag == DW_TAG_subprogram { + subprog_cnt += 1; + } + for (_name, _form, _opt, _value) in die { + attr_cnt += 1; + } + } + } + assert_eq!(cnt, 9); + assert_eq!(die_cnt, 78752); + assert_eq!(subprog_cnt, 12451); + assert_eq!(attr_cnt, 275310); + } + + /// Make sure check we do not panic when handling DWARFv5 (which is not + /// currently supported). + #[test] + fn test_unititer_v5() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf-v5.bin"); + let elfparser = ElfParser::open(&bin_name).unwrap(); + let abbrev_idx = elfparser.find_section(".debug_abbrev").unwrap(); + let abbrev = elfparser.read_section_raw(abbrev_idx).unwrap(); + let info_idx = elfparser.find_section(".debug_info").unwrap(); + let info = elfparser.read_section_raw(info_idx).unwrap(); + + let iter = UnitIter::new(info, abbrev); + let () = iter.for_each(|(_header, _die)| ()); + } +} diff --git a/blazesym/src/dwarf/mod.rs b/blazesym/src/dwarf/mod.rs new file mode 100644 index 0000000..9f220b9 --- /dev/null +++ b/blazesym/src/dwarf/mod.rs @@ -0,0 +1,8 @@ +#[allow(non_upper_case_globals, unused)] +mod constants; +#[allow(non_upper_case_globals)] +mod debug_info; +mod parser; +mod resolver; + +pub(crate) use self::resolver::DwarfResolver; diff --git a/blazesym/src/dwarf/parser.rs b/blazesym/src/dwarf/parser.rs new file mode 100644 index 0000000..ff58ace --- /dev/null +++ b/blazesym/src/dwarf/parser.rs @@ -0,0 +1,1100 @@ +#[cfg(test)] +use std::env; +use std::ffi::CStr; +use std::ffi::OsStr; +use std::fmt::Debug; +use std::fmt::Formatter; +use std::fmt::Result as FmtResult; +use std::io::Error; +use std::io::ErrorKind; +use std::mem; +use std::path::Path; + +use crate::elf::ElfParser; +use crate::inspect::SymType; +use crate::util::decode_leb128; +use crate::util::decode_leb128_s; +use crate::util::decode_udword; +use crate::util::decode_uhalf; +use crate::util::decode_uword; +use crate::util::find_match_or_lower_bound_by; +use crate::util::Pod; +use crate::util::ReadRaw as _; +use crate::Addr; + +use super::constants; +use super::debug_info; + + +#[repr(C, packed)] +pub(crate) struct DebugLinePrologueV2 { + total_length: u32, + version: u16, + prologue_length: u32, + minimum_instruction_length: u8, + default_is_stmt: u8, + line_base: i8, + line_range: u8, + opcode_base: u8, +} + +// SAFETY: `DebugLinePrologueV2` is valid for any bit pattern. +unsafe impl Pod for DebugLinePrologueV2 {} + + +/// DebugLinePrologue is actually a V4. +/// +/// DebugLinePrologueV2 will be converted to this type. +#[repr(C, packed)] +pub(crate) struct DebugLinePrologue { + total_length: u32, + version: u16, + prologue_length: u32, + minimum_instruction_length: u8, + maximum_ops_per_instruction: u8, + default_is_stmt: u8, + line_base: i8, + line_range: u8, + opcode_base: u8, +} + +impl Debug for DebugLinePrologue { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + let total_length = self.total_length; + let version = self.version; + + f.debug_struct("DebugLinePrologue") + .field("total_length", &total_length) + .field("version", &version) + .finish() + } +} + +// SAFETY: `DebugLinePrologue` is valid for any bit pattern. +unsafe impl Pod for DebugLinePrologue {} + + +/// The file information of a file for a CU. +#[derive(Debug)] +pub(crate) struct DebugLineFileInfo { + name: String, + dir_idx: u32, // Index to include_directories of DebugLineCU. + _mod_tm: u64, + _size: usize, +} + +/// Represent a Compile Unit (CU) in a .debug_line section. +#[derive(Debug)] +pub(crate) struct DebugLineCU { + pub prologue: DebugLinePrologue, + pub _standard_opcode_lengths: Vec, + pub include_directories: Vec, + pub files: Vec, + pub matrix: Vec, +} + +impl DebugLineCU { + pub(crate) fn find_line(&self, addr: Addr) -> Option<(&Path, &OsStr, usize)> { + let idx = find_match_or_lower_bound_by(&self.matrix, addr, |dls| dls.addr)?; + let states = &self.matrix[idx]; + if states.end_sequence { + // This is the first byte after the last instruction + return None + } + + self.stringify_row(idx) + } + + pub(crate) fn stringify_row(&self, idx: usize) -> Option<(&Path, &OsStr, usize)> { + let states = &self.matrix[idx]; + let (dir, file) = { + if states.file > 0 { + let file = &self.files[states.file - 1]; + let dir = { + if file.dir_idx == 0 { + Path::new("") + } else { + Path::new(&self.include_directories[file.dir_idx as usize - 1]) + } + }; + (dir, OsStr::new(&file.name)) + } else { + (Path::new(""), OsStr::new("")) + } + }; + + Some((dir, file, states.line)) + } +} + +/// Parse the list of directory paths for a CU. +fn parse_debug_line_dirs(data: &mut &[u8]) -> Result, Error> { + let mut strs = Vec::::new(); + + loop { + let string = data + .read_cstr() + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "failed to find NUL terminated string", + ) + })? + .to_str() + .map_err(|_| Error::new(ErrorKind::InvalidData, "Invalid UTF-8 string"))?; + // If the first byte is 0 we reached the end. In our case that + // maps to an empty NUL terminated string. + if string.is_empty() { + break Ok(strs) + } + strs.push(string.to_string()); + } +} + +/// Parse the list of file information for a CU. +fn parse_debug_line_files(data: &mut &[u8]) -> Result, Error> { + let mut strs = Vec::::new(); + + loop { + let name = data + .read_cstr() + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "failed to find NUL terminated string", + ) + })? + .to_str() + .map_err(|_| Error::new(ErrorKind::InvalidData, "Invalid UTF-8 string"))?; + // If the first byte is 0 we reached the end. In our case that + // maps to an empty NUL terminated string. + if name.is_empty() { + break Ok(strs) + } + + let (dir_idx, _bytes) = data + .read_u128_leb128() + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "Invalid directory index"))?; + + let (mod_tm, _bytes) = data + .read_u128_leb128() + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "Invalid last modified time"))?; + + let (size, _bytes) = data + .read_u128_leb128() + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "Invalid file size"))?; + + let () = strs.push(DebugLineFileInfo { + name: name.to_string(), + dir_idx: dir_idx as u32, + _mod_tm: mod_tm as u64, + _size: size as usize, + }); + } +} + +fn parse_debug_line_cu(data: &mut &[u8], addresses: &[Addr]) -> Result { + let prologue_v2_size: usize = mem::size_of::(); + let prologue_v4_size: usize = mem::size_of::(); + + let mut head = *data; + let v2 = data + .read_pod::() + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "failed to read debug line prologue"))?; + + if v2.version != 2 && v2.version != 4 { + let version = v2.version; + return Err(Error::new( + ErrorKind::Unsupported, + format!("encountered unsupported DWARF version: {version}"), + )) + } + + let (prologue, prologue_size) = if v2.version == 4 { + // Upgrade to V4. + // V4 has more fields to read. + let prologue_v4 = head.read_pod::().ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "failed to read debug line v4 prologue", + ) + })?; + (*data) = head; + (prologue_v4, prologue_v4_size) + } else { + // Convert V2 to V4 + let prologue_v4 = DebugLinePrologue { + total_length: v2.total_length, + version: v2.version, + prologue_length: v2.prologue_length, + minimum_instruction_length: v2.minimum_instruction_length, + maximum_ops_per_instruction: 0, + default_is_stmt: v2.default_is_stmt, + line_base: v2.line_base, + line_range: v2.line_range, + opcode_base: v2.opcode_base, + }; + (prologue_v4, prologue_v2_size) + }; + + let to_read = prologue.total_length as usize + 4 - prologue_size; + let () = data.ensure(to_read).ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "encountered insufficient debug line information data", + ) + })?; + + let std_op_num = (prologue.opcode_base - 1) as usize; + let std_op_lengths = data + .read_slice(std_op_num) + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "failed to read std op lengths"))?; + let inc_dirs = parse_debug_line_dirs(data)?; + let files = parse_debug_line_files(data)?; + let matrix = run_debug_line_stmts(data, &prologue, addresses)?; + + #[cfg(debug_assertions)] + for i in 1..matrix.len() { + if matrix[i].addr < matrix[i - 1].addr && !matrix[i - 1].end_sequence { + panic!( + "Not in ascending order @ [{}] {:?} [{}] {:?}", + i - 1, + matrix[i - 1], + i, + matrix[i] + ); + } + } + + Ok(DebugLineCU { + prologue, + _standard_opcode_lengths: std_op_lengths.to_vec(), + include_directories: inc_dirs, + files, + matrix, + }) +} + +#[derive(Clone, Debug)] +pub(crate) struct DebugLineStates { + pub addr: Addr, + file: usize, + line: usize, + column: usize, + discriminator: u64, + is_stmt: bool, + basic_block: bool, + end_sequence: bool, + prologue_end: bool, + should_reset: bool, +} + +impl DebugLineStates { + fn new(prologue: &DebugLinePrologue) -> DebugLineStates { + DebugLineStates { + addr: 0, + file: 1, + line: 1, + column: 0, + discriminator: 0, + is_stmt: prologue.default_is_stmt != 0, + basic_block: false, + end_sequence: false, + prologue_end: false, + should_reset: false, + } + } + + fn reset(&mut self, prologue: &DebugLinePrologue) { + self.addr = 0; + self.file = 1; + self.line = 1; + self.column = 0; + self.discriminator = 0; + self.is_stmt = prologue.default_is_stmt != 0; + self.basic_block = false; + self.end_sequence = false; + self.prologue_end = false; + self.should_reset = false; + } +} + +/// Return `Ok((insn_bytes, emit))` if success. `insn_bytes1 is the +/// size of the instruction at the position given by ip. `emit` is +/// true if this instruction emit a new row to describe line +/// information of an address. Not every instructions emit rows. +/// Some instructions create only intermediate states for the next row +/// going to emit. +fn run_debug_line_stmt( + stmts: &[u8], + prologue: &DebugLinePrologue, + ip: usize, + states: &mut DebugLineStates, +) -> Result<(usize, bool), Error> { + // Standard opcodes + const DW_LNS_EXT: u8 = 0; + const DW_LNS_COPY: u8 = 1; + const DW_LNS_ADVANCE_PC: u8 = 2; + const DW_LNS_ADVANCE_LINE: u8 = 3; + const DW_LNS_SET_FILE: u8 = 4; + const DW_LNS_SET_COLUMN: u8 = 5; + const DW_LNS_NEGATE_STMT: u8 = 6; + const DW_LNS_SET_BASIC_BLOCK: u8 = 7; + const DW_LNS_CONST_ADD_PC: u8 = 8; + const DW_LNS_FIXED_ADVANCE_PC: u8 = 9; + const DW_LNS_SET_PROLOGUE_END: u8 = 10; + + // Extended opcodes + const DW_LINE_END_SEQUENCE: u8 = 1; + const DW_LINE_SET_ADDRESS: u8 = 2; + const DW_LINE_DEFINE_FILE: u8 = 3; + const DW_LINE_SET_DISCRIMINATOR: u8 = 4; + + let opcode_base = prologue.opcode_base; + let opcode = stmts[ip]; + + match opcode { + DW_LNS_EXT => { + // Extended opcodes + if let Some((insn_size, bytes)) = decode_leb128(&stmts[(ip + 1)..]) { + if insn_size < 1 { + return Err(Error::new( + ErrorKind::InvalidData, + format!("invalid extended opcode (ip=0x{ip:x}, insn_size=0x{insn_size:x}"), + )) + } + let ext_opcode = stmts[ip + 1 + bytes as usize]; + match ext_opcode { + DW_LINE_END_SEQUENCE => { + states.end_sequence = true; + states.should_reset = true; + Ok((1 + bytes as usize + insn_size as usize, true)) + } + DW_LINE_SET_ADDRESS => match insn_size - 1 { + 4 => { + let addr = decode_uword(&stmts[(ip + 1 + bytes as usize + 1)..]); + states.addr = addr as Addr; + Ok((1 + bytes as usize + insn_size as usize, false)) + } + 8 => { + let addr = decode_udword(&stmts[(ip + 1 + bytes as usize + 1)..]); + states.addr = addr as Addr; + Ok((1 + bytes as usize + insn_size as usize, false)) + } + _ => Err(Error::new( + ErrorKind::Unsupported, + format!("unsupported address size ({insn_size})"), + )), + }, + DW_LINE_DEFINE_FILE => Err(Error::new( + ErrorKind::Unsupported, + "DW_LINE_define_file is not supported yet", + )), + DW_LINE_SET_DISCRIMINATOR => { + if let Some((discriminator, discr_bytes)) = + decode_leb128(&stmts[(ip + 1 + bytes as usize + 1)..]) + { + if discr_bytes as u64 + 1 == insn_size { + states.discriminator = discriminator; + Ok((1 + bytes as usize + insn_size as usize, false)) + } else { + Err(Error::new( + ErrorKind::InvalidData, + "unmatched instruction size for DW_LINE_set_discriminator", + )) + } + } else { + Err(Error::new( + ErrorKind::InvalidData, + "discriminator is broken", + )) + } + } + _ => Err(Error::new( + ErrorKind::Unsupported, + format!( + "invalid extended opcode (ip=0x{ip:x}, ext_opcode=0x{ext_opcode:x})" + ), + )), + } + } else { + Err(Error::new( + ErrorKind::InvalidData, + format!("invalid extended opcode (ip=0x{ip:x})"), + )) + } + } + DW_LNS_COPY => Ok((1, true)), + DW_LNS_ADVANCE_PC => { + if let Some((adv, bytes)) = decode_leb128(&stmts[(ip + 1)..]) { + states.addr += (adv * u64::from(prologue.minimum_instruction_length)) as Addr; + Ok((1 + bytes as usize, false)) + } else { + Err(Error::new( + ErrorKind::InvalidData, + "the operand of advance_pc is broken", + )) + } + } + DW_LNS_ADVANCE_LINE => { + if let Some((adv, bytes)) = decode_leb128_s(&stmts[(ip + 1)..]) { + states.line = (states.line as i64 + adv) as usize; + Ok((1 + bytes as usize, false)) + } else { + Err(Error::new( + ErrorKind::InvalidData, + "the operand of advance_line is broken", + )) + } + } + DW_LNS_SET_FILE => { + if let Some((file_idx, bytes)) = decode_leb128(&stmts[(ip + 1)..]) { + states.file = file_idx as usize; + Ok((1 + bytes as usize, false)) + } else { + Err(Error::new( + ErrorKind::InvalidData, + "the operand of set_file is broken", + )) + } + } + DW_LNS_SET_COLUMN => { + if let Some((column, bytes)) = decode_leb128(&stmts[(ip + 1)..]) { + states.column = column as usize; + Ok((1 + bytes as usize, false)) + } else { + Err(Error::new( + ErrorKind::InvalidData, + "the operand of set_column is broken", + )) + } + } + DW_LNS_NEGATE_STMT => { + states.is_stmt = !states.is_stmt; + Ok((1, false)) + } + DW_LNS_SET_BASIC_BLOCK => { + states.basic_block = true; + Ok((1, false)) + } + DW_LNS_CONST_ADD_PC => { + let addr_adv = (255 - opcode_base) / prologue.line_range; + states.addr += Addr::from(addr_adv * prologue.minimum_instruction_length); + Ok((1, false)) + } + DW_LNS_FIXED_ADVANCE_PC => { + if (ip + 3) < stmts.len() { + let addr_adv = decode_uhalf(&stmts[(ip + 1)..]); + states.addr += + Addr::from(addr_adv * u16::from(prologue.minimum_instruction_length)); + Ok((1, false)) + } else { + Err(Error::new( + ErrorKind::InvalidData, + "the operand of fixed_advance_pc is broken", + )) + } + } + DW_LNS_SET_PROLOGUE_END => { + states.prologue_end = true; + Ok((1, false)) + } + _ => { + // Special opcodes + let opcode_offset = opcode.checked_sub(opcode_base).ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + format!("DWARF based opcode offset is invalid (opcode: {opcode}, base: {opcode_base})"), + ) + })?; + let desired_line_incr = opcode_offset % prologue.line_range; + let addr_adv = opcode_offset / prologue.line_range; + states.addr += Addr::from(addr_adv * prologue.minimum_instruction_length); + states.line = (states.line as i64 + + (desired_line_incr as i16 + prologue.line_base as i16) as i64 + * prologue.minimum_instruction_length as i64) + as usize; + Ok((1, true)) + } + } +} + +fn run_debug_line_stmts( + stmts: &[u8], + prologue: &DebugLinePrologue, + addresses: &[Addr], +) -> Result, Error> { + let mut ip = 0; + let mut matrix = Vec::::new(); + let mut should_sort = false; + let mut states_cur = DebugLineStates::new(prologue); + let mut states_last = states_cur.clone(); + let mut last_ip_pushed = false; + let mut force_no_emit = false; + + while ip < stmts.len() { + match run_debug_line_stmt(stmts, prologue, ip, &mut states_cur) { + Ok((sz, emit)) => { + ip += sz; + if emit { + if states_cur.addr == 0 { + // This is a special case. Somehow, rust + // compiler generate debug_line for some + // builtin code starting from 0. And, it + // causes incorrect behavior. + force_no_emit = true; + } + if !force_no_emit { + if !addresses.is_empty() { + let mut pushed = false; + for addr in addresses { + if *addr == states_cur.addr + || (states_last.addr != 0 + && !states_last.end_sequence + && *addr < states_cur.addr + && *addr > states_last.addr) + { + if !last_ip_pushed && *addr != states_cur.addr { + // The address falls between current and last emitted row. + matrix.push(states_last.clone()); + } + matrix.push(states_cur.clone()); + pushed = true; + break + } + } + last_ip_pushed = pushed; + states_last = states_cur.clone(); + } else { + matrix.push(states_cur.clone()); + } + if states_last.addr > states_cur.addr { + should_sort = true; + } + } + } + if states_cur.should_reset { + states_cur.reset(prologue); + force_no_emit = false; + } + } + Err(e) => return Err(e), + } + } + + if should_sort { + matrix.sort_by_key(|x| x.addr); + } + + Ok(matrix) +} + +/// If addresses is empty, it returns a full version of debug_line matrix. +/// If addresses is not empty, return only data needed to resolve given addresses. +pub(crate) fn parse_debug_line_elf_parser( + parser: &ElfParser, + addresses: &[Addr], +) -> Result, Error> { + let debug_line_idx = parser.find_section(".debug_line")?; + let debug_line_sz = parser.get_section_size(debug_line_idx)?; + let mut remain_sz = debug_line_sz; + let prologue_size: usize = mem::size_of::(); + let mut not_found = Vec::from(addresses); + + let data = &mut parser.section_data(debug_line_idx)?; + + let mut all_cus = Vec::::new(); + while remain_sz > prologue_size { + let debug_line_cu = parse_debug_line_cu(data, ¬_found)?; + let prologue = &debug_line_cu.prologue; + remain_sz -= prologue.total_length as usize + 4; + + if debug_line_cu.matrix.is_empty() { + continue + } + + if !addresses.is_empty() { + let mut last_row = &debug_line_cu.matrix[0]; + for row in debug_line_cu.matrix.as_slice() { + let mut i = 0; + // Remove addresses found in this CU from not_found. + while i < not_found.len() { + let addr = addresses[i]; + if addr == row.addr || (addr < row.addr && addr > last_row.addr) { + not_found.remove(i); + } else { + i += 1; + } + } + last_row = row; + } + + all_cus.push(debug_line_cu); + + if not_found.is_empty() { + return Ok(all_cus) + } + } else { + all_cus.push(debug_line_cu); + } + } + + if remain_sz != 0 { + return Err(Error::new( + ErrorKind::InvalidData, + "encountered remaining garbage data at the end", + )) + } + + Ok(all_cus) +} + + +/// The symbol information extracted out of DWARF. +#[derive(Clone, Debug)] +pub(crate) struct DWSymInfo<'a> { + pub name: &'a str, + pub addr: Addr, + pub size: usize, + pub sym_type: SymType, // A function or a variable. +} + +fn find_die_sibling(die: &mut debug_info::DIE<'_>) -> Option { + for (name, _form, _opt, value) in die { + if name == constants::DW_AT_sibling { + if let debug_info::AttrValue::Unsigned(off) = value { + return Some(off as usize) + } + return None + } + } + None +} + +/// Parse a DIE that declares a subprogram. (a function) +/// +/// We already know the given DIE is a declaration of a subprogram. +/// This function trys to extract the address of the subprogram and +/// other information from the DIE. +/// +/// # Arguments +/// +/// * `die` - is a DIE. +/// * `str_data` - is the content of the `.debug_str` section. +/// +/// Return a [`DWSymInfo`] if it finds the address of the subprogram. +fn parse_die_subprogram<'a>( + die: &mut debug_info::DIE<'a>, + str_data: &'a [u8], +) -> Result>, Error> { + let mut addr: Option = None; + let mut name_str: Option<&str> = None; + let mut size = 0; + + for (name, _form, _opt, value) in die { + match name { + constants::DW_AT_linkage_name | constants::DW_AT_name => { + if name_str.is_some() { + continue + } + name_str = Some(match value { + debug_info::AttrValue::Unsigned(str_off) => unsafe { + CStr::from_ptr(str_data[str_off as usize..].as_ptr().cast()) + .to_str() + .map_err(|_e| { + Error::new( + ErrorKind::InvalidData, + "fail to extract the name of a subprogram", + ) + })? + }, + debug_info::AttrValue::String(s) => s, + _ => { + return Err(Error::new( + ErrorKind::InvalidData, + "fail to parse DW_AT_linkage_name {}", + )) + } + }); + } + constants::DW_AT_lo_pc => match value { + debug_info::AttrValue::Unsigned(pc) => { + addr = Some(pc as Addr); + } + _ => { + return Err(Error::new( + ErrorKind::InvalidData, + "fail to parse DW_AT_lo_pc", + )) + } + }, + constants::DW_AT_hi_pc => match value { + debug_info::AttrValue::Unsigned(sz) => { + size = sz; + } + _ => { + return Err(Error::new( + ErrorKind::InvalidData, + "fail to parse DW_AT_lo_pc", + )) + } + }, + _ => {} + } + } + + match (addr, name_str) { + (Some(addr), Some(name)) => Ok(Some(DWSymInfo { + name, + addr, + size: size as usize, + sym_type: SymType::Function, + })), + _ => Ok(None), + } +} + +/// Walk through all DIEs of a compile unit to extract symbols. +/// +/// # Arguments +/// +/// * `dieiter` - is an iterator returned by the iterator that is +/// returned by an [`UnitIter`]. [`UnitIter`] returns +/// an [`UnitHeader`] and an [`DIEIter`]. +/// * `str_data` - is the content of the `.debug_str` section. +/// * `found_syms` - the Vec to append the found symbols. +fn debug_info_parse_symbols_cu<'a>( + mut dieiter: debug_info::DIEIter<'a>, + str_data: &'a [u8], + found_syms: &mut Vec>, +) { + while let Some(mut die) = dieiter.next() { + if die.tag == 0 || die.tag == constants::DW_TAG_namespace { + continue + } + + assert!(die.abbrev.is_some()); + if die.tag != constants::DW_TAG_subprogram { + if die.abbrev.unwrap().has_children { + if let Some(sibling_off) = find_die_sibling(&mut die) { + dieiter.seek_to_sibling(sibling_off); + continue + } + // Skip this DIE quickly, or the iterator will + // recalculate the size of the DIE. + die.exhaust().unwrap(); + } + continue + } + + if let Ok(Some(syminfo)) = parse_die_subprogram(&mut die, str_data) { + found_syms.push(syminfo); + } + } +} + +/// Parse the addresses of symbols from the `.debug_info` section. +/// +/// # Arguments +/// +/// * `parser` - is an ELF parser. +/// * `cond` - is a function to check if we have found the information +/// we need. The function will stop earlier if the +/// condition is met. +pub(crate) fn debug_info_parse_symbols<'a>( + parser: &'a ElfParser, + cond: Option<&(dyn Fn(&DWSymInfo<'a>) -> bool + Send + Sync)>, +) -> Result>, Error> { + let info_sect_idx = parser.find_section(".debug_info")?; + let info_data = parser.section_data(info_sect_idx)?; + let abbrev_sect_idx = parser.find_section(".debug_abbrev")?; + let abbrev_data = parser.section_data(abbrev_sect_idx)?; + let units = debug_info::UnitIter::new(info_data, abbrev_data); + let str_sect_idx = parser.find_section(".debug_str")?; + let str_data = parser.section_data(str_sect_idx)?; + + let mut syms = Vec::::new(); + + if let Some(cond) = cond { + 'outer: for (uhdr, dieiter) in units { + if let debug_info::UnitHeader::CompileV4(_) = uhdr { + let saved_sz = syms.len(); + debug_info_parse_symbols_cu(dieiter, str_data, &mut syms); + for sym in &syms[saved_sz..] { + if !cond(sym) { + break 'outer + } + } + } + } + } else { + for (uhdr, dieiter) in units { + if let debug_info::UnitHeader::CompileV4(_) = uhdr { + debug_info_parse_symbols_cu(dieiter, str_data, &mut syms); + } + } + } + Ok(syms) +} + +#[cfg(test)] +mod tests { + use super::*; + + use test_log::test; + + #[cfg(feature = "nightly")] + use test::Bencher; + + + #[allow(unused)] + struct ArangesCU { + debug_line_off: usize, + aranges: Vec<(u64, u64)>, + } + + fn parse_aranges_cu(data: &[u8]) -> Result<(ArangesCU, usize), Error> { + if data.len() < 12 { + return Err(Error::new( + ErrorKind::InvalidData, + "invalid arange header (too small)", + )) + } + let len = decode_uword(data); + let version = decode_uhalf(&data[4..]); + let offset = decode_uword(&data[6..]); + let addr_sz = data[10]; + let _seg_sz = data[11]; + + if data.len() < (len + 4) as usize { + return Err(Error::new( + ErrorKind::InvalidData, + "data is broken (too small)", + )) + } + + // Size of the header + let mut pos = 12; + + // Padding to align with the size of addresses on the target system. + pos += addr_sz as usize - 1; + pos -= pos % addr_sz as usize; + + let mut aranges = Vec::<(u64, u64)>::new(); + match addr_sz { + 4 => { + while pos < (len + 4 - 8) as usize { + let start = decode_uword(&data[pos..]); + pos += 4; + let size = decode_uword(&data[pos..]); + pos += 4; + + if start == 0 && size == 0 { + break + } + aranges.push((start as u64, size as u64)); + } + } + 8 => { + while pos < (len + 4 - 16) as usize { + let start = decode_udword(&data[pos..]); + pos += 8; + let size = decode_udword(&data[pos..]); + pos += 8; + + if start == 0 && size == 0 { + break + } + aranges.push((start, size)); + } + } + _ => { + return Err(Error::new( + ErrorKind::Unsupported, + format!("unsupported address size {addr_sz} ver {version} off 0x{offset:x}"), + )) + } + } + + Ok(( + ArangesCU { + debug_line_off: offset as usize, + aranges, + }, + len as usize + 4, + )) + } + + fn parse_aranges_elf_parser(parser: &ElfParser) -> Result, Error> { + let debug_aranges_idx = parser.find_section(".debug_aranges")?; + + let raw_data = parser.read_section_raw(debug_aranges_idx)?; + + let mut pos = 0; + let mut acus = Vec::::new(); + while pos < raw_data.len() { + let (acu, bytes) = parse_aranges_cu(&raw_data[pos..])?; + acus.push(acu); + pos += bytes; + } + + Ok(acus) + } + + fn parse_aranges_elf(filename: &Path) -> Result, Error> { + let parser = ElfParser::open(filename)?; + parse_aranges_elf_parser(&parser) + } + + #[test] + fn test_parse_debug_line_elf() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf-v4.bin"); + + let parser = ElfParser::open(bin_name.as_ref()).unwrap(); + let _line = parse_debug_line_elf_parser(&parser, &[]).unwrap(); + } + + #[test] + fn test_run_debug_line_stmts_1() { + let stmts = [ + 0x00, 0x09, 0x02, 0x30, 0x8b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xa0, 0x04, + 0x01, 0x05, 0x06, 0x0a, 0x08, 0x30, 0x02, 0x05, 0x00, 0x01, 0x01, + ]; + let prologue = DebugLinePrologue { + total_length: 0, + version: 4, + prologue_length: 0, + minimum_instruction_length: 1, + maximum_ops_per_instruction: 1, + default_is_stmt: 1, + line_base: -5, + line_range: 14, + opcode_base: 13, + }; + + let result = run_debug_line_stmts(&stmts, &prologue, &[]); + if result.is_err() { + let e = result.as_ref().err().unwrap(); + println!("result {e:?}"); + } + assert!(result.is_ok()); + let matrix = result.unwrap(); + assert_eq!(matrix.len(), 3); + assert_eq!(matrix[0].line, 545); + assert_eq!(matrix[0].addr, 0x18b30); + assert_eq!(matrix[1].line, 547); + assert_eq!(matrix[1].addr, 0x18b43); + assert_eq!(matrix[2].line, 547); + assert_eq!(matrix[2].addr, 0x18b48); + } + + #[test] + fn test_run_debug_line_stmts_2() { + // File name Line number Starting address View Stmt + // methods.rs 789 0x18c70 x + // methods.rs 791 0x18c7c x + // methods.rs 791 0x18c81 + // methods.rs 790 0x18c86 x + // methods.rs 0 0x18c88 + // methods.rs 791 0x18c8c x + // methods.rs 0 0x18c95 + // methods.rs 792 0x18c99 x + // methods.rs 792 0x18c9d + // methods.rs 0 0x18ca4 + // methods.rs 791 0x18ca8 x + // methods.rs 792 0x18caf x + // methods.rs 0 0x18cb6 + // methods.rs 792 0x18cba + // methods.rs 0 0x18cc4 + // methods.rs 792 0x18cc8 + // methods.rs 790 0x18cce x + // methods.rs 794 0x18cd0 x + // methods.rs 794 0x18cde x + let stmts = [ + 0x00, 0x09, 0x02, 0x70, 0x8c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x94, 0x06, + 0x01, 0x05, 0x0d, 0x0a, 0xbc, 0x05, 0x26, 0x06, 0x58, 0x05, 0x09, 0x06, 0x57, 0x06, + 0x03, 0xea, 0x79, 0x2e, 0x05, 0x13, 0x06, 0x03, 0x97, 0x06, 0x4a, 0x06, 0x03, 0xe9, + 0x79, 0x90, 0x05, 0x0d, 0x06, 0x03, 0x98, 0x06, 0x4a, 0x05, 0x12, 0x06, 0x4a, 0x03, + 0xe8, 0x79, 0x74, 0x05, 0x13, 0x06, 0x03, 0x97, 0x06, 0x4a, 0x05, 0x12, 0x75, 0x06, + 0x03, 0xe8, 0x79, 0x74, 0x05, 0x20, 0x03, 0x98, 0x06, 0x4a, 0x03, 0xe8, 0x79, 0x9e, + 0x05, 0x12, 0x03, 0x98, 0x06, 0x4a, 0x05, 0x09, 0x06, 0x64, 0x05, 0x06, 0x32, 0x02, + 0x0e, 0x00, 0x01, 0x01, + ]; + let prologue = DebugLinePrologue { + total_length: 0, + version: 4, + prologue_length: 0, + minimum_instruction_length: 1, + maximum_ops_per_instruction: 1, + default_is_stmt: 1, + line_base: -5, + line_range: 14, + opcode_base: 13, + }; + + let result = run_debug_line_stmts(&stmts, &prologue, &[]); + if result.is_err() { + let e = result.as_ref().err().unwrap(); + println!("result {e:?}"); + } + assert!(result.is_ok()); + let matrix = result.unwrap(); + + assert_eq!(matrix.len(), 19); + assert_eq!(matrix[0].line, 789); + assert_eq!(matrix[0].addr, 0x18c70); + assert!(matrix[0].is_stmt); + + assert_eq!(matrix[1].line, 791); + assert_eq!(matrix[1].addr, 0x18c7c); + assert!(matrix[1].is_stmt); + + assert_eq!(matrix[2].line, 791); + assert_eq!(matrix[2].addr, 0x18c81); + assert!(!matrix[2].is_stmt); + + assert_eq!(matrix[13].line, 792); + assert_eq!(matrix[13].addr, 0x18cba); + assert!(!matrix[13].is_stmt); + + assert_eq!(matrix[14].line, 0); + assert_eq!(matrix[14].addr, 0x18cc4); + assert!(!matrix[14].is_stmt); + + assert_eq!(matrix[18].line, 794); + assert_eq!(matrix[18].addr, 0x18cde); + assert!(matrix[18].is_stmt); + } + + #[test] + fn test_parse_aranges_elf() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf-v4.bin"); + + let _aranges = parse_aranges_elf(bin_name.as_ref()).unwrap(); + } + + #[test] + fn test_debug_info_parse_symbols() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf-v4.bin"); + + let parser = ElfParser::open(bin_name.as_ref()).unwrap(); + let syms = debug_info_parse_symbols(&parser, None).unwrap(); + assert!(syms.iter().any(|sym| sym.name == "fibonacci")) + } + + /// Benchmark the [`debug_info_parse_symbols`] function. + #[cfg(feature = "nightly")] + #[bench] + fn debug_info_parse_single_threaded(b: &mut Bencher) { + let bin_name = env::args().next().unwrap(); + let parser = ElfParser::open(bin_name.as_ref()).unwrap(); + + let () = b.iter(|| debug_info_parse_symbols(&parser, None).unwrap()); + } +} diff --git a/blazesym/src/dwarf/resolver.rs b/blazesym/src/dwarf/resolver.rs new file mode 100644 index 0000000..8036ba8 --- /dev/null +++ b/blazesym/src/dwarf/resolver.rs @@ -0,0 +1,268 @@ +use std::cell::RefCell; +#[cfg(test)] +use std::env; +use std::ffi::OsStr; +use std::fmt::Debug; +use std::io::Error; +use std::io::ErrorKind; +use std::mem; +use std::path::Path; +use std::rc::Rc; + +use crate::elf::ElfParser; +use crate::inspect::FindAddrOpts; +use crate::inspect::SymInfo; +use crate::inspect::SymType; +use crate::util::find_match_or_lower_bound_by; +use crate::Addr; + +use super::parser::debug_info_parse_symbols; +use super::parser::parse_debug_line_elf_parser; +use super::parser::DWSymInfo; +use super::parser::DebugLineCU; + + +/// DwarfResolver provides abilities to query DWARF information of binaries. +#[derive(Debug)] +pub(crate) struct DwarfResolver { + parser: Rc, + debug_line_cus: Vec, + addr_to_dlcu: Vec<(Addr, u32)>, + enable_debug_info_syms: bool, + debug_info_syms: RefCell>>>, +} + +impl DwarfResolver { + pub fn get_parser(&self) -> &ElfParser { + &self.parser + } + + pub fn from_parser_for_addresses( + parser: Rc, + addresses: &[Addr], + line_number_info: bool, + debug_info_symbols: bool, + ) -> Result { + let debug_line_cus: Vec = if line_number_info { + parse_debug_line_elf_parser(&parser, addresses).unwrap_or_default() + } else { + vec![] + }; + + let mut addr_to_dlcu = Vec::with_capacity(debug_line_cus.len()); + for (idx, dlcu) in debug_line_cus.iter().enumerate() { + if dlcu.matrix.is_empty() { + continue + } + let first_addr = dlcu.matrix[0].addr; + addr_to_dlcu.push((first_addr, idx as u32)); + } + addr_to_dlcu.sort_by_key(|v| v.0); + + Ok(DwarfResolver { + parser, + debug_line_cus, + addr_to_dlcu, + enable_debug_info_syms: debug_info_symbols, + debug_info_syms: RefCell::new(None), + }) + } + + /// Open a binary to load .debug_line only enough for a given list of addresses. + /// + /// When `addresses` is not empty, the returned instance only has + /// data that related to these addresses. For this case, the + /// instance have the ability that can serve only these addresses. + /// This would be much faster. + /// + /// If `addresses` is empty, the returned instance has all data + /// from the given file. If the instance will be used for long + /// running, you would want to load all data into memory to have + /// the ability of handling all possible addresses. + fn open_for_addresses( + filename: &Path, + addresses: &[Addr], + line_number_info: bool, + debug_info_symbols: bool, + ) -> Result { + let parser = ElfParser::open(filename)?; + Self::from_parser_for_addresses( + Rc::new(parser), + addresses, + line_number_info, + debug_info_symbols, + ) + } + + /// Open a binary to load and parse .debug_line for later uses. + /// + /// `filename` is the name of an ELF binary/or shared object that + /// has .debug_line section. + pub fn open( + filename: &Path, + debug_line_info: bool, + debug_info_symbols: bool, + ) -> Result { + Self::open_for_addresses(filename, &[], debug_line_info, debug_info_symbols) + } + + fn find_dlcu_index(&self, addr: Addr) -> Option { + let a2a = &self.addr_to_dlcu; + let a2a_idx = find_match_or_lower_bound_by(a2a, addr, |a2dlcu| a2dlcu.0)?; + let dlcu_idx = a2a[a2a_idx].1 as usize; + + Some(dlcu_idx) + } + + /// Find line information of an address. + /// + /// `addr` is an offset from the head of the loaded binary/or shared + /// object. This function returns a tuple of `(dir_name, file_name, + /// line_no)`. + pub fn find_line(&self, addr: Addr) -> Option<(&Path, &OsStr, usize)> { + let idx = self.find_dlcu_index(addr)?; + let dlcu = &self.debug_line_cus[idx]; + + dlcu.find_line(addr) + } + + /// Extract the symbol information from DWARf if having not done it before. + fn ensure_debug_info_syms(&self) -> Result<(), Error> { + if self.enable_debug_info_syms { + let mut dis_ref = self.debug_info_syms.borrow_mut(); + if dis_ref.is_some() { + return Ok(()) + } + let mut debug_info_syms = debug_info_parse_symbols(&self.parser, None)?; + debug_info_syms.sort_by_key(|v: &DWSymInfo| -> &str { v.name }); + *dis_ref = Some(unsafe { mem::transmute(debug_info_syms) }); + Ok(()) + } else { + Err(Error::new( + ErrorKind::Unsupported, + "debug info symbol information has been disabled", + )) + } + } + + /// Find the address of a symbol from DWARF. + /// + /// # Arguments + /// + /// * `name` - is the symbol name to find. + /// * `opts` - is the context giving additional parameters. + pub(crate) fn find_addr(&self, name: &str, opts: &FindAddrOpts) -> Result, Error> { + if let SymType::Variable = opts.sym_type { + return Err(Error::new(ErrorKind::Unsupported, "Not implemented")) + } + let elf_r = self.parser.find_addr(name, opts)?; + if !elf_r.is_empty() { + // Since it is found from symtab, symtab should be + // complete and DWARF shouldn't provide more information. + return Ok(elf_r) + } + + self.ensure_debug_info_syms()?; + let dis_ref = self.debug_info_syms.borrow(); + let debug_info_syms = dis_ref.as_ref().unwrap(); + let mut idx = + match debug_info_syms.binary_search_by_key(&name.to_string(), |v| v.name.to_string()) { + Ok(idx) => idx, + _ => return Ok(vec![]), + }; + while idx > 0 && debug_info_syms[idx].name.eq(name) { + idx -= 1; + } + if !debug_info_syms[idx].name.eq(name) { + idx += 1; + } + let mut found = vec![]; + while debug_info_syms[idx].name.eq(name) { + let DWSymInfo { + addr, + size, + sym_type, + .. + } = debug_info_syms[idx]; + found.push(SymInfo { + name: name.to_string(), + addr: addr as Addr, + size, + sym_type, + file_offset: 0, + obj_file_name: None, + }); + idx += 1; + } + Ok(found) + } + + #[cfg(test)] + fn pick_address_for_test(&self) -> (Addr, &Path, &OsStr, usize) { + let (addr, idx) = self.addr_to_dlcu[self.addr_to_dlcu.len() / 3]; + let dlcu = &self.debug_line_cus[idx as usize]; + let (dir, file, line) = dlcu.stringify_row(0).unwrap(); + (addr, dir, file, line) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use test_log::test; + + + #[test] + fn test_dwarf_resolver() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf-v4.bin"); + let resolver = DwarfResolver::open(bin_name.as_ref(), true, false).unwrap(); + let (addr, dir, file, line) = resolver.pick_address_for_test(); + + let (dir_ret, file_ret, line_ret) = resolver.find_line(addr).unwrap(); + assert_eq!(dir, dir_ret); + assert_eq!(file, file_ret); + assert_eq!(line, line_ret); + } + + /// Check that we can look up a symbol in DWARF debug information. + #[test] + fn lookup_symbol() { + let test_dwarf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf.bin"); + let opts = FindAddrOpts { + offset_in_file: false, + obj_file_name: false, + sym_type: SymType::Function, + }; + let resolver = DwarfResolver::open(test_dwarf.as_ref(), true, true).unwrap(); + + let symbols = resolver.find_addr("factorial", &opts).unwrap(); + assert_eq!(symbols.len(), 1); + + // `factorial` resides at address 0x2000100. + let symbol = symbols.first().unwrap(); + assert_eq!(symbol.addr, 0x2000100); + } + + /// Check that we fail to look up variables. + #[test] + fn lookup_symbol_wrong_type() { + let test_dwarf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf.bin"); + let opts = FindAddrOpts { + offset_in_file: false, + obj_file_name: false, + sym_type: SymType::Variable, + }; + let resolver = DwarfResolver::open(test_dwarf.as_ref(), true, true).unwrap(); + + let err = resolver.find_addr("factorial", &opts).unwrap_err(); + assert_eq!(err.kind(), ErrorKind::Unsupported); + } +} diff --git a/blazesym/src/elf/cache.rs b/blazesym/src/elf/cache.rs new file mode 100644 index 0000000..d703358 --- /dev/null +++ b/blazesym/src/elf/cache.rs @@ -0,0 +1,198 @@ +use std::cell::RefCell; +use std::fs::File; +use std::io::Error; +use std::num::NonZeroUsize; +use std::os::unix::io::AsRawFd; +use std::path::Path; +#[cfg(feature = "lru")] +use std::path::PathBuf; +use std::rc::Rc; + +#[cfg(feature = "lru")] +use lru::LruCache; + +use crate::dwarf::DwarfResolver; +use crate::util::fstat; + +use super::ElfParser; + +// SAFETY: The provided value is non-zero. +const DFL_CACHE_MAX: NonZeroUsize = unsafe { NonZeroUsize::new_unchecked(1024) }; + +#[derive(Clone, Debug)] +pub(crate) enum ElfBackend { + Dwarf(Rc), // ELF w/ DWARF + Elf(Rc), // ELF w/o DWARF +} + +#[cfg(test)] +impl ElfBackend { + pub fn to_dwarf(&self) -> Option> { + if let Self::Dwarf(dwarf) = self { + Some(Rc::clone(dwarf)) + } else { + None + } + } + + pub fn is_dwarf(&self) -> bool { + matches!(self, Self::Dwarf(_)) + } +} + +#[derive(Debug)] +struct ElfCacheEntry { + dev: libc::dev_t, + inode: libc::ino_t, + size: libc::off_t, + mtime_sec: libc::time_t, + mtime_nsec: i64, + backend: ElfBackend, +} + +impl ElfCacheEntry { + pub fn new( + file: File, + line_number_info: bool, + debug_info_symbols: bool, + ) -> Result { + let stat = fstat(file.as_raw_fd())?; + let parser = Rc::new(ElfParser::open_file(file)?); + let backend = if let Ok(dwarf) = DwarfResolver::from_parser_for_addresses( + Rc::clone(&parser), + &[], + line_number_info, + debug_info_symbols, + ) { + ElfBackend::Dwarf(Rc::new(dwarf)) + } else { + ElfBackend::Elf(parser) + }; + + Ok(ElfCacheEntry { + dev: stat.st_dev, + inode: stat.st_ino, + size: stat.st_size, + mtime_sec: stat.st_mtime, + mtime_nsec: stat.st_mtime_nsec, + backend, + }) + } + + fn is_valid(&self, stat: &libc::stat) -> bool { + stat.st_dev == self.dev + && stat.st_ino == self.inode + && stat.st_size == self.size + && stat.st_mtime == self.mtime_sec + && stat.st_mtime_nsec == self.mtime_nsec + } + + fn get_backend(&self) -> ElfBackend { + self.backend.clone() + } +} + + +#[derive(Debug)] +struct _ElfCache { + #[cfg(feature = "lru")] + cache: LruCache, + line_number_info: bool, + debug_info_symbols: bool, +} + +impl _ElfCache { + fn new(line_number_info: bool, debug_info_symbols: bool) -> _ElfCache { + _ElfCache { + #[cfg(feature = "lru")] + cache: LruCache::new(DFL_CACHE_MAX), + line_number_info, + debug_info_symbols, + } + } + + #[cfg(feature = "lru")] + fn find_or_create_backend( + &mut self, + file_name: &Path, + file: File, + ) -> Result { + if let Some(entry) = self.cache.get(file_name) { + let stat = fstat(file.as_raw_fd())?; + + if entry.is_valid(&stat) { + return Ok(entry.get_backend()) + } + } + + let entry = ElfCacheEntry::new(file, self.line_number_info, self.debug_info_symbols)?; + let backend = entry.get_backend(); + let _previous = self.cache.put(file_name.to_path_buf(), entry); + Ok(backend) + } + + #[cfg(not(feature = "lru"))] + fn find_or_create_backend( + &mut self, + _file_name: &Path, + file: File, + ) -> Result { + let entry = ElfCacheEntry::new(file, self.line_number_info, self.debug_info_symbols)?; + let backend = entry.get_backend(); + Ok(backend) + } + + pub fn find(&mut self, path: &Path) -> Result { + let file = File::open(path)?; + self.find_or_create_backend(path, file) + } +} + +#[derive(Debug)] +pub(crate) struct ElfCache { + cache: RefCell<_ElfCache>, +} + +impl ElfCache { + pub fn new(line_number_info: bool, debug_info_symbols: bool) -> ElfCache { + ElfCache { + cache: RefCell::new(_ElfCache::new(line_number_info, debug_info_symbols)), + } + } + + pub fn find(&self, path: &Path) -> Result { + let mut cache = self.cache.borrow_mut(); + cache.find(path) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::env; + use std::ptr; + + use test_log::test; + + #[test] + fn test_cache() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-no-debug.bin"); + + let cache = ElfCache::new(true, false); + let backend_first = cache.find(Path::new(&bin_name)); + let backend_second = cache.find(Path::new(&bin_name)); + assert!(backend_first.is_ok()); + assert!(backend_second.is_ok()); + let backend_first = backend_first.unwrap(); + let backend_second = backend_second.unwrap(); + assert!(backend_first.is_dwarf()); + assert!(backend_second.is_dwarf()); + assert_eq!( + ptr::addr_of!(*backend_first.to_dwarf().unwrap().get_parser()), + ptr::addr_of!(*backend_second.to_dwarf().unwrap().get_parser()) + ); + } +} diff --git a/blazesym/src/elf/mod.rs b/blazesym/src/elf/mod.rs new file mode 100644 index 0000000..f3f18e2 --- /dev/null +++ b/blazesym/src/elf/mod.rs @@ -0,0 +1,10 @@ +mod cache; +mod parser; +mod resolver; +#[allow(dead_code, non_camel_case_types)] +pub(crate) mod types; + +pub(crate) use cache::ElfBackend; +pub(crate) use cache::ElfCache; +pub(crate) use parser::ElfParser; +pub(crate) use resolver::ElfResolver; diff --git a/blazesym/src/elf/parser.rs b/blazesym/src/elf/parser.rs new file mode 100644 index 0000000..358a8f6 --- /dev/null +++ b/blazesym/src/elf/parser.rs @@ -0,0 +1,600 @@ +use std::cell::RefCell; +use std::fmt::Debug; +use std::fmt::Formatter; +use std::fmt::Result as FmtResult; +use std::fs::File; +use std::io::Error; +use std::io::ErrorKind; +use std::mem; +use std::ops::Deref as _; +use std::path::Path; + +use crate::inspect::FindAddrOpts; +use crate::inspect::SymInfo; +use crate::inspect::SymType; +use crate::mmap::Mmap; +use crate::util::find_match_or_lower_bound_by; +use crate::util::search_address_opt_key; +use crate::util::ReadRaw as _; +use crate::Addr; + +use super::types::Elf64_Ehdr; +use super::types::Elf64_Phdr; +use super::types::Elf64_Shdr; +use super::types::Elf64_Sym; +use super::types::SHN_UNDEF; +#[cfg(test)] +use super::types::STT_FUNC; + + +struct Cache<'mmap> { + /// A slice of the raw ELF data that we are about to parse. + elf_data: &'mmap [u8], + /// The cached ELF header. + ehdr: Option<&'mmap Elf64_Ehdr>, + /// The cached ELF section headers. + shdrs: Option<&'mmap [Elf64_Shdr]>, + shstrtab: Option<&'mmap [u8]>, + /// The cached ELF program headers. + phdrs: Option<&'mmap [Elf64_Phdr]>, + symtab: Option>, // in address order + /// The cached ELF string table. + strtab: Option<&'mmap [u8]>, + str2symtab: Option>, // strtab offset to symtab in the dictionary order +} + +impl<'mmap> Cache<'mmap> { + /// Create a new `Cache` using the provided raw ELF object data. + fn new(elf_data: &'mmap [u8]) -> Self { + Self { + elf_data, + ehdr: None, + shdrs: None, + shstrtab: None, + phdrs: None, + symtab: None, + strtab: None, + str2symtab: None, + } + } + + /// Retrieve the raw section data for the ELF section at index + /// `idx`. + fn section_data(&mut self, idx: usize) -> Result<&'mmap [u8], Error> { + let shdrs = self.ensure_shdrs()?; + let section = shdrs.get(idx).ok_or_else(|| { + Error::new( + ErrorKind::InvalidInput, + format!("ELF section index ({idx}) out of bounds"), + ) + })?; + + let data = self + .elf_data + .get(section.sh_offset as usize..) + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "failed to read section data: invalid offset", + ) + })? + .read_slice(section.sh_size as usize) + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "failed to read section data: invalid size", + ) + })?; + Ok(data) + } + + fn ensure_ehdr(&mut self) -> Result<&'mmap Elf64_Ehdr, Error> { + if let Some(ehdr) = self.ehdr { + return Ok(ehdr) + } + + let mut elf_data = self.elf_data; + let ehdr = elf_data + .read_pod_ref::() + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "failed to read Elf64_Ehdr"))?; + if !(ehdr.e_ident[0] == 0x7f + && ehdr.e_ident[1] == b'E' + && ehdr.e_ident[2] == b'L' + && ehdr.e_ident[3] == b'F') + { + return Err(Error::new( + ErrorKind::InvalidData, + format!("encountered unexpected e_ident: {:x?}", &ehdr.e_ident[0..4]), + )) + } + self.ehdr = Some(ehdr); + Ok(ehdr) + } + + fn ensure_shdrs(&mut self) -> Result<&'mmap [Elf64_Shdr], Error> { + if let Some(shdrs) = self.shdrs { + return Ok(shdrs) + } + + let ehdr = self.ensure_ehdr()?; + let shdrs = self + .elf_data + .get(ehdr.e_shoff as usize..) + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "Elf64_Ehdr::e_shoff is invalid"))? + .read_pod_slice_ref::(ehdr.e_shnum.into()) + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "failed to read Elf64_Shdr"))?; + self.shdrs = Some(shdrs); + Ok(shdrs) + } + + fn ensure_phdrs(&mut self) -> Result<&'mmap [Elf64_Phdr], Error> { + if let Some(phdrs) = self.phdrs { + return Ok(phdrs) + } + + let ehdr = self.ensure_ehdr()?; + let phdrs = self + .elf_data + .get(ehdr.e_phoff as usize..) + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "Elf64_Ehdr::e_phoff is invalid"))? + .read_pod_slice_ref::(ehdr.e_phnum.into()) + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "failed to read Elf64_Phdr"))?; + self.phdrs = Some(phdrs); + Ok(phdrs) + } + + fn ensure_shstrtab(&mut self) -> Result<&'mmap [u8], Error> { + if let Some(shstrtab) = self.shstrtab { + return Ok(shstrtab) + } + + let ehdr = self.ensure_ehdr()?; + let shstrndx = ehdr.e_shstrndx; + let shstrtab = self.section_data(shstrndx as usize)?; + self.shstrtab = Some(shstrtab); + Ok(shstrtab) + } + + /// Get the name of the section at a given index. + fn section_name(&mut self, idx: usize) -> Result<&'mmap str, Error> { + let shdrs = self.ensure_shdrs()?; + let shstrtab = self.ensure_shstrtab()?; + + let sect = shdrs.get(idx).ok_or_else(|| { + Error::new(ErrorKind::InvalidInput, "ELF section index out of bounds") + })?; + let name = shstrtab + .get(sect.sh_name as usize..) + .ok_or_else(|| Error::new(ErrorKind::InvalidInput, "string table index out of bounds"))? + .read_cstr() + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidInput, + "no valid string found in string table", + ) + })? + .to_str() + .map_err(|_| Error::new(ErrorKind::InvalidInput, "invalid section name"))?; + Ok(name) + } + + fn symbol(&mut self, idx: usize) -> Result<&'mmap Elf64_Sym, Error> { + let () = self.ensure_symtab()?; + // SANITY: The above `ensure_symtab` ensures we have `symtab` + // available. + let symtab = self.symtab.as_ref().unwrap(); + let symbol = symtab.get(idx).ok_or_else(|| { + Error::new( + ErrorKind::InvalidInput, + format!("ELF symbol index ({idx}) out of bounds"), + ) + })?; + + Ok(symbol) + } + + fn symbol_name(&mut self, sym: &Elf64_Sym) -> Result<&'mmap str, Error> { + let strtab = self.ensure_strtab()?; + + let name = strtab + .get(sym.st_name as usize..) + .ok_or_else(|| Error::new(ErrorKind::InvalidInput, "string table index out of bounds"))? + .read_cstr() + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidInput, + "no valid string found in string table", + ) + })? + .to_str() + .map_err(|_| Error::new(ErrorKind::InvalidInput, "invalid symbol name"))?; + + Ok(name) + } + + /// Find the section of a given name. + /// + /// This function return the index of the section if found. + fn find_section(&mut self, name: &str) -> Result { + let ehdr = self.ensure_ehdr()?; + for i in 1..ehdr.e_shnum.into() { + if self.section_name(i)? == name { + return Ok(i) + } + } + Err(Error::new( + ErrorKind::NotFound, + format!("unable to find ELF section: {name}"), + )) + } + + // Note: This function should really return a reference to + // `self.symtab`, but current borrow checker limitations + // effectively prevent us from doing so. + fn ensure_symtab(&mut self) -> Result<(), Error> { + if self.symtab.is_some() { + return Ok(()) + } + + let idx = if let Ok(idx) = self.find_section(".symtab") { + idx + } else { + self.find_section(".dynsym")? + }; + let mut symtab = self.section_data(idx)?; + + if symtab.len() % mem::size_of::() != 0 { + return Err(Error::new( + ErrorKind::InvalidData, + "size of symbol table section is invalid", + )) + } + + let count = symtab.len() / mem::size_of::(); + let mut symtab = symtab + .read_pod_slice_ref::(count) + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "failed to read symbol table contents", + ) + })? + .iter() + .collect::>(); + let () = symtab.sort_by_key(|x| x.st_value); + + self.symtab = Some(symtab); + Ok(()) + } + + fn ensure_strtab(&mut self) -> Result<&'mmap [u8], Error> { + if let Some(strtab) = self.strtab { + return Ok(strtab) + } + + let idx = if let Ok(idx) = self.find_section(".strtab") { + idx + } else { + self.find_section(".dynstr")? + }; + let strtab = self.section_data(idx)?; + self.strtab = Some(strtab); + Ok(strtab) + } + + // Note: This function should really return a reference to + // `self.str2symtab`, but current borrow checker limitations + // effectively prevent us from doing so. + fn ensure_str2symtab(&mut self) -> Result<(), Error> { + if self.str2symtab.is_some() { + return Ok(()) + } + + let strtab = self.ensure_strtab()?; + let () = self.ensure_symtab()?; + // SANITY: The above `ensure_symtab` ensures we have `symtab` + // available. + let symtab = self.symtab.as_ref().unwrap(); + + let mut str2symtab = symtab + .iter() + .enumerate() + .map(|(i, sym)| { + let name = strtab + .get(sym.st_name as usize..) + .ok_or_else(|| { + Error::new(ErrorKind::InvalidInput, "string table index out of bounds") + })? + .read_cstr() + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidInput, + "no valid string found in string table", + ) + })? + .to_str() + .map_err(|_| Error::new(ErrorKind::InvalidInput, "invalid symbol name"))?; + Ok((name, i)) + }) + .collect::, Error>>()?; + + let () = str2symtab.sort_by_key(|&(name, _i)| name); + + self.str2symtab = Some(str2symtab); + Ok(()) + } +} + +impl Debug for Cache<'_> { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + write!(f, "Cache") + } +} + + +/// A parser for ELF64 files. +#[derive(Debug)] +pub(crate) struct ElfParser { + /// A cache for relevant parts of the ELF file. + /// SAFETY: We must not hand out references with a 'static lifetime to + /// this member. Rather, they should never outlive `self`. + /// Furthermore, this member has to be listed before `mmap` + /// to make sure we never end up with a dangling reference. + cache: RefCell>, + /// The memory mapped file. + _mmap: Mmap, +} + +impl ElfParser { + /// Create an `ElfParser` from an open file. + pub fn open_file(file: File) -> Result { + Mmap::map(&file).map(Self::from_mmap) + } + + /// Create an `ElfParser` from mmap'ed data. + pub fn from_mmap(mmap: Mmap) -> ElfParser { + // We transmute the mmap's lifetime to static here as that is a + // necessity for self-referentiality. + // SAFETY: We never hand out any 'static references to cache + // data. + let elf_data = unsafe { mem::transmute(mmap.deref()) }; + + let parser = ElfParser { + _mmap: mmap, + cache: RefCell::new(Cache::new(elf_data)), + }; + parser + } + + /// Create an `ElfParser` for a path. + pub fn open(filename: &Path) -> Result { + let file = File::open(filename)?; + let parser = Self::open_file(file); + if let Ok(parser) = parser { + Ok(parser) + } else { + parser + } + } + + /// Retrieve the data corresponding to the ELF section at index `idx`. + pub fn section_data(&self, idx: usize) -> Result<&[u8], Error> { + let mut cache = self.cache.borrow_mut(); + cache.section_data(idx) + } + + /// Read the raw data of the section of a given index. + #[cfg(test)] + pub fn read_section_raw(&self, sect_idx: usize) -> Result<&[u8], Error> { + let mut cache = self.cache.borrow_mut(); + cache.section_data(sect_idx) + } + + pub fn get_section_size(&self, sect_idx: usize) -> Result { + let mut cache = self.cache.borrow_mut(); + let shdrs = cache.ensure_shdrs()?; + let sect = shdrs.get(sect_idx).ok_or_else(|| { + Error::new(ErrorKind::InvalidInput, "ELF section index out of bounds") + })?; + Ok(sect.sh_size as usize) + } + + /// Find the section of a given name. + /// + /// This function return the index of the section if found. + pub fn find_section(&self, name: &str) -> Result { + let mut cache = self.cache.borrow_mut(); + let index = cache.find_section(name)?; + Ok(index) + } + + pub fn find_symbol(&self, addr: Addr, st_type: u8) -> Result<(&str, Addr), Error> { + let mut cache = self.cache.borrow_mut(); + let () = cache.ensure_symtab()?; + // SANITY: The above `ensure_symtab` ensures we have `symtab` + // available. + let symtab = cache.symtab.as_ref().unwrap(); + + let idx_r = search_address_opt_key(symtab, addr, &|sym: &&Elf64_Sym| { + if sym.st_info & 0xf != st_type || sym.st_shndx == SHN_UNDEF { + None + } else { + Some(sym.st_value as Addr) + } + }); + if idx_r.is_none() { + return Err(Error::new( + ErrorKind::NotFound, + "Does not found a symbol for the given address", + )) + } + let idx = idx_r.unwrap(); + + let sym = cache.symbol(idx)?; + let name = cache.symbol_name(sym)?; + Ok((name, sym.st_value as Addr)) + } + + pub(crate) fn find_addr(&self, name: &str, opts: &FindAddrOpts) -> Result, Error> { + if let SymType::Variable = opts.sym_type { + return Err(Error::new(ErrorKind::Unsupported, "Not implemented")) + } + + let mut cache = self.cache.borrow_mut(); + let () = cache.ensure_symtab()?; + let () = cache.ensure_str2symtab()?; + // SANITY: The above `ensure_symtab` ensures we have `symtab` + // available. + let symtab = cache.symtab.as_ref().unwrap(); + // SANITY: The above `ensure_str2symtab` ensures we have + // `str2symtab` available. + let str2symtab = cache.str2symtab.as_ref().unwrap(); + + let r = find_match_or_lower_bound_by(str2symtab, name, |&(name, _i)| name); + match r { + Some(idx) => { + let mut found = vec![]; + for (name_visit, sym_i) in str2symtab.iter().skip(idx) { + if *name_visit != name { + break + } + let sym_ref = &symtab.get(*sym_i).ok_or_else(|| { + Error::new( + ErrorKind::InvalidInput, + format!("symbol table index ({sym_i}) out of bounds"), + ) + })?; + if sym_ref.st_shndx != SHN_UNDEF { + found.push(SymInfo { + name: name.to_string(), + addr: sym_ref.st_value as Addr, + size: sym_ref.st_size as usize, + sym_type: SymType::Function, + file_offset: 0, + obj_file_name: None, + }); + } + } + Ok(found) + } + None => Ok(vec![]), + } + } + + #[cfg(test)] + fn get_symbol_name(&self, idx: usize) -> Result<&str, Error> { + let mut cache = self.cache.borrow_mut(); + let sym = cache.symbol(idx)?; + let name = cache.symbol_name(sym)?; + Ok(name) + } + + pub(crate) fn section_headers(&self) -> Result<&[Elf64_Shdr], Error> { + let mut cache = self.cache.borrow_mut(); + let phdrs = cache.ensure_shdrs()?; + Ok(phdrs) + } + + pub(crate) fn program_headers(&self) -> Result<&[Elf64_Phdr], Error> { + let mut cache = self.cache.borrow_mut(); + let phdrs = cache.ensure_phdrs()?; + Ok(phdrs) + } + + #[cfg(test)] + fn pick_symtab_addr(&self) -> (&str, Addr) { + let mut cache = self.cache.borrow_mut(); + let () = cache.ensure_symtab().unwrap(); + let symtab = cache.symtab.as_ref().unwrap(); + + let mut idx = symtab.len() / 2; + while symtab[idx].st_info & 0xf != STT_FUNC || symtab[idx].st_shndx == SHN_UNDEF { + idx += 1; + } + let sym = &symtab[idx]; + let addr = sym.st_value; + drop(cache); + + let sym_name = self.get_symbol_name(idx).unwrap(); + (sym_name, addr as Addr) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use std::env; + + use test_log::test; + + + #[test] + fn test_elf64_parser() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-no-debug.bin"); + + let parser = ElfParser::open(bin_name.as_ref()).unwrap(); + assert!(parser.find_section(".shstrtab").is_ok()); + } + + #[test] + fn test_elf64_symtab() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-no-debug.bin"); + + let parser = ElfParser::open(bin_name.as_ref()).unwrap(); + assert!(parser.find_section(".shstrtab").is_ok()); + + let (sym_name, addr) = parser.pick_symtab_addr(); + + let sym_r = parser.find_symbol(addr, STT_FUNC); + assert!(sym_r.is_ok()); + let (sym_name_ret, addr_ret) = sym_r.unwrap(); + assert_eq!(addr_ret, addr); + assert_eq!(sym_name_ret, sym_name); + } + + #[test] + fn elf64_lookup_symbol_random() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-no-debug.bin"); + + let parser = ElfParser::open(bin_name.as_ref()).unwrap(); + assert!(parser.find_section(".shstrtab").is_ok()); + + let (sym_name, addr) = parser.pick_symtab_addr(); + + println!("{sym_name}"); + let opts = FindAddrOpts::default(); + let addr_r = parser.find_addr(sym_name, &opts).unwrap(); + assert_eq!(addr_r.len(), 1); + assert!(addr_r.iter().any(|x| x.addr == addr)); + } + + /// Make sure that we can look up a symbol in an ELF file. + #[test] + fn lookup_symbol() { + let bin_name = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf.bin"); + + let parser = ElfParser::open(bin_name.as_ref()).unwrap(); + let opts = FindAddrOpts::default(); + let syms = parser.find_addr("factorial", &opts).unwrap(); + assert_eq!(syms.len(), 1); + let sym = &syms[0]; + assert_eq!(sym.name, "factorial"); + assert_eq!(sym.addr, 0x2000100); + + let syms = parser.find_addr("factorial_wrapper", &opts).unwrap(); + assert_eq!(syms.len(), 2); + assert_eq!(syms[0].name, "factorial_wrapper"); + assert_eq!(syms[1].name, "factorial_wrapper"); + assert_ne!(syms[0].addr, syms[1].addr); + } +} diff --git a/blazesym/src/elf/resolver.rs b/blazesym/src/elf/resolver.rs new file mode 100644 index 0000000..1c46555 --- /dev/null +++ b/blazesym/src/elf/resolver.rs @@ -0,0 +1,142 @@ +use std::fmt::Debug; +use std::fmt::Formatter; +use std::fmt::Result as FmtResult; +use std::io::Result; +use std::path::Path; +use std::path::PathBuf; + +use crate::inspect::FindAddrOpts; +use crate::inspect::SymInfo; +use crate::log::warn; +use crate::symbolize::AddrLineInfo; +use crate::Addr; +use crate::SymResolver; + +use super::cache::ElfBackend; +use super::types::PT_LOAD; +use super::types::STT_FUNC; +use super::ElfParser; + +/// The symbol resolver for a single ELF file. +/// +/// An ELF file may be loaded into an address space with a relocation. +/// The callers should provide the path of an ELF file and where it's +/// executable segment(s) is loaded. +/// +/// For some ELF files, they are located at a specific address +/// determined during compile-time. For these cases, just pass `0` as +/// it's loaded address. +pub struct ElfResolver { + backend: ElfBackend, + file_name: PathBuf, +} + +impl ElfResolver { + pub(crate) fn with_backend(file_name: &Path, backend: ElfBackend) -> Result { + Ok(ElfResolver { + backend, + file_name: file_name.to_path_buf(), + }) + } + + fn get_parser(&self) -> &ElfParser { + match &self.backend { + ElfBackend::Dwarf(dwarf) => dwarf.get_parser(), + ElfBackend::Elf(parser) => parser, + } + } +} + +impl SymResolver for ElfResolver { + fn find_symbols(&self, addr: Addr) -> Vec<(&str, Addr)> { + let parser = self.get_parser(); + + match parser.find_symbol(addr, STT_FUNC) { + Ok((name, start_addr)) => { + vec![(name, start_addr)] + } + Err(err) => { + warn!("no symbol found for address 0x{addr:x}: {err}"); + vec![] + } + } + } + + fn find_addr(&self, name: &str, opts: &FindAddrOpts) -> Option> { + match &self.backend { + ElfBackend::Dwarf(dwarf) => dwarf.find_addr(name, opts), + ElfBackend::Elf(parser) => parser.find_addr(name, opts), + } + .ok() + } + + fn find_line_info(&self, addr: Addr) -> Option { + if let ElfBackend::Dwarf(dwarf) = &self.backend { + let (directory, file, line) = dwarf.find_line(addr)?; + Some(AddrLineInfo { + path: directory.join(file), + line, + column: 0, + }) + } else { + None + } + } + + /// Find the file offset of the symbol at address `addr`. + // TODO: See if we could make this a constant time calculation by supplying + // the ELF symbol index (and potentially an offset from it) [this will + // require a bit of a larger rework, including on call sites]. + fn addr_file_off(&self, addr: Addr) -> Option { + let addr = addr as u64; + let parser = self.get_parser(); + let phdrs = parser.program_headers().ok()?; + let offset = phdrs.iter().find_map(|phdr| { + if phdr.p_type == PT_LOAD { + if (phdr.p_vaddr..phdr.p_vaddr + phdr.p_memsz).contains(&addr) { + return Some(addr - phdr.p_vaddr + phdr.p_offset) + } + } + None + })?; + Some(offset) + } + + fn get_obj_file_name(&self) -> &Path { + &self.file_name + } +} + +impl Debug for ElfResolver { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + match self.backend { + ElfBackend::Dwarf(_) => write!(f, "DWARF {}", self.file_name.display()), + ElfBackend::Elf(_) => write!(f, "ELF {}", self.file_name.display()), + } + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use std::path::Path; + use std::rc::Rc; + + + /// Check that we fail finding an offset for an address not + /// representing a symbol in an ELF file. + #[test] + fn addr_without_offset() { + let path = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf.bin"); + let elf = ElfParser::open(&path).unwrap(); + let backend = ElfBackend::Elf(Rc::new(elf)); + let resolver = ElfResolver::with_backend(&path, backend).unwrap(); + + assert_eq!(resolver.addr_file_off(0x0), None); + assert_eq!(resolver.addr_file_off(0xffffffffffffffff), None); + } +} diff --git a/blazesym/src/elf/types.rs b/blazesym/src/elf/types.rs new file mode 100644 index 0000000..d318f56 --- /dev/null +++ b/blazesym/src/elf/types.rs @@ -0,0 +1,97 @@ +const EI_NIDENT: usize = 16; + +type Elf64_Addr = u64; +type Elf64_Half = u16; +type Elf64_Off = u64; +type Elf64_Word = u32; +type Elf64_Xword = u64; + +pub(crate) const ET_EXEC: u16 = 2; +pub(crate) const ET_DYN: u16 = 3; + +#[repr(C)] +pub(crate) struct Elf64_Ehdr { + pub e_ident: [u8; EI_NIDENT], /* ELF "magic number" */ + pub e_type: Elf64_Half, + pub e_machine: Elf64_Half, + pub e_version: Elf64_Word, + pub e_entry: Elf64_Addr, /* Entry point virtual address */ + pub e_phoff: Elf64_Off, /* Program header table file offset */ + pub e_shoff: Elf64_Off, /* Section header table file offset */ + pub e_flags: Elf64_Word, + pub e_ehsize: Elf64_Half, + pub e_phentsize: Elf64_Half, + pub e_phnum: Elf64_Half, + pub e_shentsize: Elf64_Half, + pub e_shnum: Elf64_Half, + pub e_shstrndx: Elf64_Half, +} + +// SAFETY: `Elf64_Ehdr` is valid for any bit pattern. +unsafe impl crate::util::Pod for Elf64_Ehdr {} + +pub(crate) const PT_LOAD: u32 = 1; + +#[repr(C)] +pub(crate) struct Elf64_Phdr { + pub p_type: Elf64_Word, + pub p_flags: Elf64_Word, + pub p_offset: Elf64_Off, /* Segment file offset */ + pub p_vaddr: Elf64_Addr, /* Segment virtual address */ + pub p_paddr: Elf64_Addr, /* Segment physical address */ + pub p_filesz: Elf64_Xword, /* Segment size in file */ + pub p_memsz: Elf64_Xword, /* Segment size in memory */ + pub p_align: Elf64_Xword, /* Segment alignment, file & memory */ +} + +// SAFETY: `Elf64_Phdr` is valid for any bit pattern. +unsafe impl crate::util::Pod for Elf64_Phdr {} + +pub(crate) const PF_X: Elf64_Word = 1; + +#[repr(C)] +pub(crate) struct Elf64_Shdr { + pub sh_name: Elf64_Word, /* Section name, index in string tbl */ + pub sh_type: Elf64_Word, /* Type of section */ + pub sh_flags: Elf64_Xword, /* Miscellaneous section attributes */ + pub sh_addr: Elf64_Addr, /* Section virtual addr at execution */ + pub sh_offset: Elf64_Off, /* Section file offset */ + pub sh_size: Elf64_Xword, /* Size of section in bytes */ + pub sh_link: Elf64_Word, /* Index of another section */ + pub sh_info: Elf64_Word, /* Additional section information */ + pub sh_addralign: Elf64_Xword, /* Section alignment */ + pub sh_entsize: Elf64_Xword, /* Entry size if section holds table */ +} + +// SAFETY: `Elf64_Shdr` is valid for any bit pattern. +unsafe impl crate::util::Pod for Elf64_Shdr {} + +pub(crate) const SHN_UNDEF: u16 = 0; + +pub(crate) const SHT_NOTE: Elf64_Word = 7; + +pub(crate) const STT_FUNC: u8 = 2; + +#[derive(Clone)] +#[repr(C)] +pub(crate) struct Elf64_Sym { + pub st_name: Elf64_Word, /* Symbol name, index in string tbl */ + pub st_info: u8, /* Type and binding attributes */ + pub st_other: u8, /* No defined meaning, 0 */ + pub st_shndx: Elf64_Half, /* Associated section index */ + pub st_value: Elf64_Addr, /* Value of the symbol */ + pub st_size: Elf64_Xword, /* Associated symbol size */ +} + +// SAFETY: `Elf64_Sym` is valid for any bit pattern. +unsafe impl crate::util::Pod for Elf64_Sym {} + +#[repr(C)] +pub(crate) struct Elf64_Nhdr { + pub n_namesz: Elf64_Word, + pub n_descsz: Elf64_Word, + pub n_type: Elf64_Word, +} + +// SAFETY: `Elf64_Nhdr` is valid for any bit pattern. +unsafe impl crate::util::Pod for Elf64_Nhdr {} diff --git a/blazesym/src/gsym/linetab.rs b/blazesym/src/gsym/linetab.rs new file mode 100644 index 0000000..d998c08 --- /dev/null +++ b/blazesym/src/gsym/linetab.rs @@ -0,0 +1,125 @@ +//! Opcode runner of GSYM line table. + +use crate::util::ReadRaw as _; +use crate::Addr; + +/// End of the line table +const END_SEQUENCE: u8 = 0x00; +/// Set [`LineTableRow.file_idx`], don't push a row. +const SET_FILE: u8 = 0x01; +/// Increment [`LineTableRow.address`], and push a row. +const ADVANCE_PC: u8 = 0x02; +/// Set [`LineTableRow.file_line`], don't push a row. +const ADVANCE_LINE: u8 = 0x03; +/// All special opcodes push a row. +const FIRST_SPECIAL: u8 = 0x04; + + +#[derive(Debug)] +pub enum RunResult { + /// Run the operator successfully. + Ok, + /// This operator creates a new row. + NewRow, + /// The end of the program (the operator stream.) + End, +} + +#[derive(Debug)] +pub struct LineTableHeader { + /// `min_data` & `max_delta` together is used to set the range and encoding + /// of line delta in special operator. Line delta is the number of lines + /// that a line table row is different from the previous row. + pub min_delta: i64, + pub max_delta: i64, + pub first_line: u32, +} + +#[derive(Clone, Debug)] +pub struct LineTableRow { + pub address: Addr, + pub file_idx: u32, + pub file_line: u32, +} + +impl LineTableRow { + /// Create a `LineTableRow` to use as the states of a line table virtual + /// machine. + /// + /// The returned `LineTableRow` can be passed to [`run_op`] as `ctx`. + /// + /// # Arguments + /// + /// * `header` - is a [`LineTableHeader`] returned by [`parse_line_table_header()`]. + /// * `symaddr` - the address of the symbol that `header` belongs to. + pub fn line_table_row_from(header: &LineTableHeader, symaddr: Addr) -> LineTableRow { + Self { + address: symaddr, + file_idx: 1, + file_line: header.first_line, + } + } +} + + +/// Run a GSYM line table operator/instruction in the buffer. +/// +/// # Arguments +/// +/// * `ctx` - a line table row to present the current states of the virtual +/// machine. [`line_table_row_from()`] can create a `LineTableRow` to +/// keep the states of a virtual machine. +/// * `header` - is a `LineTableHeader`. +/// * `ops` - is the buffer of the operators following the `LineTableHeader` in +/// a GSYM file. +pub fn run_op( + ctx: &mut LineTableRow, + header: &LineTableHeader, + ops: &mut &[u8], +) -> Option { + let op = ops.read_u8()?; + match op { + END_SEQUENCE => Some(RunResult::End), + SET_FILE => { + let (f, _bytes) = ops.read_u128_leb128()?; + ctx.file_idx = f as u32; + Some(RunResult::Ok) + } + ADVANCE_PC => { + let (adv, _bytes) = ops.read_u128_leb128()?; + ctx.address += adv as Addr; + Some(RunResult::NewRow) + } + ADVANCE_LINE => { + let (adv, _bytes) = ops.read_i128_leb128()?; + ctx.file_line = (ctx.file_line as i64 + adv as i64) as u32; + Some(RunResult::Ok) + } + // Special operators. + // + // All operators that have a value greater than or equal to + // FIRST_SPECIAL are considered special operators. These operators + // change both the line number and address of the virtual machine and + // emit a new row. + _ => { + let adjusted = (op - FIRST_SPECIAL) as i64; + // The range of line number delta is from min_delta to max_delta, + // including max_delta. + let range = header.max_delta - header.min_delta + 1; + if range == 0 { + return None + } + let line_delta = header.min_delta + (adjusted % range); + let addr_delta = adjusted / range; + + let file_line = ctx.file_line as i32 + line_delta as i32; + if file_line < 1 { + return None + } + + ctx.file_line = file_line as u32; + ctx.address += addr_delta as Addr; + Some(RunResult::NewRow) + } + } +} diff --git a/blazesym/src/gsym/mod.rs b/blazesym/src/gsym/mod.rs new file mode 100644 index 0000000..5dc54f1 --- /dev/null +++ b/blazesym/src/gsym/mod.rs @@ -0,0 +1,6 @@ +mod linetab; +mod parser; +mod resolver; +mod types; + +pub use resolver::GsymResolver; diff --git a/blazesym/src/gsym/parser.rs b/blazesym/src/gsym/parser.rs new file mode 100644 index 0000000..2bbc02a --- /dev/null +++ b/blazesym/src/gsym/parser.rs @@ -0,0 +1,389 @@ +//! Parser of GSYM format. +//! +//! The layout of a standalone GSYM contains following sections in the order. +//! +//! * Header +//! * Address Table +//! * Address Data Offset Table +//! * File Table +//! * String Table +//! * Address Data +//! +//! The standalone GSYM starts with a Header, which describes the +//! size of an entry in the address table, the number of entries in +//! the address table, and the location and the size of the string +//! table. +//! +//! Since the Address Table is immediately after the Header, the +//! Header describes only the size of an entry and number of entries +//! in the table but not where it is. The Address Table comprises +//! addresses of symbols in the ascending order, so we can find the +//! symbol an address belonging to by doing a binary search to find +//! the most close address but smaller or equal. +//! +//! The Address Data Offset Table has the same number of entries as +//! the Address Table. Every entry in one table will has +//! corresponding entry at the same offset in the other table. The +//! entries in the Address Data Offset Table are always 32bits +//! (4bytes.) It is the file offset to the respective Address +//! Data. (AddrInfo actually) +//! +//! An AddrInfo comprises the size and name of a symbol. The name +//! is an offset in the string table. You will find a null terminated +//! C string at the give offset. The size is the number of bytes of +//! the respective object; ex, a function or variable. +//! +//! See + +use std::io::Error; +use std::io::ErrorKind; +use std::mem::align_of; + +use crate::log::warn; +use crate::util::find_match_or_lower_bound; +use crate::util::Pod; +use crate::util::ReadRaw as _; +use crate::Addr; + +use super::linetab::LineTableHeader; +use super::types::AddrData; +use super::types::AddrInfo; +use super::types::FileInfo; +use super::types::Header; +use super::types::InfoTypeEndOfList; +use super::types::InfoTypeInlineInfo; +use super::types::InfoTypeLineTableInfo; +use super::types::GSYM_MAGIC; +use super::types::GSYM_VERSION; + +/// Hold the major parts of a standalone GSYM file. +/// +/// GsymContext provides functions to access major entities in GSYM. +/// GsymContext can find respective AddrInfo for an address. But, +/// it doesn't parse [`AddrData`] to get line numbers. +/// +/// The developers should use [`parse_address_data()`], +/// [`parse_line_table_header()`], and [`linetab::run_op()`] to get +/// line number information from [`AddrInfo`]. +pub struct GsymContext<'a> { + header: Header, + addr_tab: &'a [u8], + addr_data_off_tab: &'a [u32], + file_tab: &'a [FileInfo], + str_tab: &'a [u8], + raw_data: &'a [u8], +} + +impl GsymContext<'_> { + /// Parse the Header of a standalone GSYM file. + /// + /// # Arguments + /// + /// * `data` - is the content of a standalone GSYM. + /// + /// Returns a GsymContext, which includes the Header and other important tables. + pub fn parse_header(data: &[u8]) -> Result { + fn parse_header_impl(mut data: &[u8]) -> Option> { + let head = data; + let magic = data.read_u32()?; + if magic != GSYM_MAGIC { + return Some(Err(Error::new( + ErrorKind::InvalidData, + "invalid magic number", + ))) + } + let version = data.read_u16()?; + if version != GSYM_VERSION { + return Some(Err(Error::new( + ErrorKind::InvalidData, + "unknown version number", + ))) + } + + let addr_off_size = data.read_u8()?; + let uuid_size = data.read_u8()?; + let base_address = data.read_u64()?; + let num_addrs = data.read_u32()?; + let strtab_offset = data.read_u32()?; + let strtab_size = data.read_u32()?; + // SANITY: We know that the slice has 20 elements if read + // successful. + let uuid = <[u8; 20]>::try_from(data.read_slice(20)?).unwrap(); + + let addr_tab = data.read_slice(num_addrs as usize * usize::from(addr_off_size))?; + let () = data.align(align_of::())?; + let addr_data_off_tab = data.read_pod_slice_ref(num_addrs as usize)?; + + let file_num = data.read_u32()?; + let () = data.align(align_of::())?; + let file_tab = data.read_pod_slice_ref(file_num as usize)?; + + let mut data = head.get(strtab_offset as usize..)?; + let str_tab = data.read_slice(strtab_size as usize)?; + + let slf = GsymContext { + header: Header { + magic, + version, + addr_off_size, + uuid_size, + base_address, + num_addrs, + strtab_offset, + strtab_size, + uuid, + }, + addr_tab, + addr_data_off_tab, + file_tab, + str_tab, + raw_data: head, + }; + Some(Ok(slf)) + } + + parse_header_impl(data).ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "GSYM data does not contain sufficient bytes", + ) + })? + } + + /// Find the index of an entry in the address table potentially containing the + /// given address. + /// + /// Callers should check the `AddrInfo` object at the returned index to see + /// whether the symbol actually covers the provided address. + pub fn find_addr(&self, addr: Addr) -> Option { + fn find_addr_impl(mut addr_tab: &[u8], num_addrs: usize, addr: Addr) -> Option + where + T: Copy + Ord + TryFrom + Pod + 'static, + { + let addr = T::try_from(addr).ok()?; + let table = addr_tab.read_pod_slice_ref::(num_addrs)?; + find_match_or_lower_bound(table, addr) + } + + + let relative_addr = addr.checked_sub(self.header.base_address as Addr)?; + let num_addrs = self.header.num_addrs as usize; + + match self.header.addr_off_size { + 1 => find_addr_impl::(self.addr_tab, num_addrs, relative_addr), + 2 => find_addr_impl::(self.addr_tab, num_addrs, relative_addr), + 4 => find_addr_impl::(self.addr_tab, num_addrs, relative_addr), + 8 => find_addr_impl::(self.addr_tab, num_addrs, relative_addr), + _ => None, + } + } + + /// Get the address of an entry in the Address Table. + pub fn addr_at(&self, idx: usize) -> Option { + let addr_off_size = self.header.addr_off_size as usize; + let mut data = self.addr_tab.get(idx * addr_off_size..)?; + let addr = match addr_off_size { + 1 => data.read_u8()?.into(), + 2 => data.read_u16()?.into(), + 4 => data.read_u32()? as Addr, + 8 => data.read_u64()? as Addr, + _ => return None, + }; + Some(self.header.base_address as Addr + addr) + } + + /// Get the AddrInfo of an address given by an index. + pub fn addr_info(&self, idx: usize) -> Option { + let offset = *self.addr_data_off_tab.get(idx)?; + let mut data = self.raw_data.get(offset as usize..)?; + let size = data.read_u32()?; + let name = data.read_u32()?; + let info = AddrInfo { size, name, data }; + + Some(info) + } + + /// Get the string at the given offset from the String Table. + #[inline] + pub fn get_str(&self, offset: usize) -> Option<&str> { + self.str_tab.get(offset..)?.read_cstr()?.to_str().ok() + } + + #[inline] + pub fn file_info(&self, idx: usize) -> Option<&FileInfo> { + self.file_tab.get(idx) + } +} + + +/// Parse [`AddrData`]. +/// +/// [`AddrData`] objects are items following [`AndressInfo`]. +/// [`GsymContext::addr_info()`] returns the raw data of [`AddrData`] objects as +/// a slice at [`AddrInfo::data`]. +/// +/// # Arguments +/// +/// * `data` - is the slice from AddrInfo::data. +pub fn parse_address_data(mut data: &[u8]) -> Option> { + let mut data_objs = vec![]; + + while !data.is_empty() { + let typ = data.read_u32()?; + let length = data.read_u32()?; + let d = data.read_slice(length as usize)?; + data_objs.push(AddrData { + typ, + length, + data: d, + }); + + #[allow(non_upper_case_globals)] + match typ { + InfoTypeEndOfList => break, + InfoTypeLineTableInfo | InfoTypeInlineInfo => {} + _ => { + warn!("unknown info type"); + } + } + } + + Some(data_objs) +} + +/// Parse [`AddrData`] of type [`InfoTypeLineTableInfo`]. +/// +/// An `AddrData` of `InfoTypeLineTableInfo` type is a table of line numbers for +/// a symbol. `AddrData` is the payload of `AddrInfo`. One `AddrInfo` may +/// have several `AddrData` entries in its payload. Each `AddrData` entry stores +/// a type of data relates to the symbol the `AddrInfo` presents. +/// +/// # Arguments +/// +/// * `data` - is what [`AddrData::data`] is. +/// +/// Returns the `LineTableHeader` and the size of the header of a `AddrData` +/// entry of `InfoTypeLineTableInfo` type in the payload of an `Addressinfo`. +pub fn parse_line_table_header(data: &mut &[u8]) -> Option { + let (min_delta, _bytes) = data.read_i128_leb128()?; + let (max_delta, _bytes) = data.read_i128_leb128()?; + let (first_line, _bytes) = data.read_u128_leb128()?; + + let header = LineTableHeader { + min_delta: min_delta as i64, + max_delta: max_delta as i64, + first_line: first_line as u32, + }; + Some(header) +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::env; + use std::fs::File; + use std::io::Read; + use std::io::Write; + use std::path::Path; + + use test_log::test; + + + #[test] + fn test_parse_context() { + let test_gsym = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test.gsym"); + let mut gsym_fo = File::open(test_gsym).unwrap(); + let mut data = vec![]; + + gsym_fo.read_to_end(&mut data).unwrap(); + let ctx = GsymContext::parse_header(&data).unwrap(); + + let idx = ctx.find_addr(0x0000000002000000).unwrap(); + let addrinfo = ctx.addr_info(idx).unwrap(); + assert_eq!(ctx.get_str(addrinfo.name as usize).unwrap(), "main"); + + let idx = ctx.find_addr(0x0000000002000100).unwrap(); + let addrinfo = ctx.addr_info(idx).unwrap(); + assert_eq!(ctx.get_str(addrinfo.name as usize).unwrap(), "factorial"); + } + + #[test] + fn test_find_addr() { + let test_gsym = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test.gsym"); + let mut gsym_fo = File::open(test_gsym).unwrap(); + let mut data = vec![]; + + const TEST_SIZE: usize = 6; + + gsym_fo.read_to_end(&mut data).unwrap(); + + let mut addr_tab = Vec::::new(); + addr_tab.resize(TEST_SIZE * 4, 0); + + let mut values: Vec = (0_u32..(TEST_SIZE as u32)).collect(); + + let copy_to_addr_tab = |values: &[u32], addr_tab: &mut Vec| { + addr_tab.clear(); + for v in values { + let r = addr_tab.write(&v.to_ne_bytes()); + assert!(r.is_ok()); + } + }; + // Generate all possible sequences that values are in strictly + // ascending order and `< TEST_SIZE * 2`. + let gen_values = |values: &mut [u32]| { + let mut carry_out = TEST_SIZE as u32 * 2; + for i in (0..values.len()).rev() { + values[i] += 1; + if values[i] >= carry_out { + carry_out -= 1; + continue + } + // Make all values at right side minimal and strictly + // ascending. + for j in (i + 1)..values.len() { + values[j] = values[j - 1] + 1; + } + break + } + }; + + while values[0] <= TEST_SIZE as u32 { + copy_to_addr_tab(&values, &mut addr_tab); + + for addr in 0..(TEST_SIZE * 2) { + let addr_tab = addr_tab.clone(); + let mut ctx = GsymContext::parse_header(&data).unwrap(); + ctx.header.num_addrs = TEST_SIZE as u32; + ctx.header.addr_off_size = 4; + ctx.header.base_address = 0; + ctx.addr_tab = addr_tab.as_slice(); + + let idx = ctx.find_addr(addr).unwrap_or(0); + let addr_u32 = addr as u32; + let idx1 = match values.binary_search(&addr_u32) { + Ok(idx) => idx, + Err(idx) => { + // When the searching value is falling in + // between two values, it will return the + // index of the later one. But we want the + // earlier one. + if idx > 0 { + idx - 1 + } else { + 0 + } + } + }; + assert_eq!(idx, idx1); + } + + gen_values(&mut values); + } + } +} diff --git a/blazesym/src/gsym/resolver.rs b/blazesym/src/gsym/resolver.rs new file mode 100644 index 0000000..aa5a3f1 --- /dev/null +++ b/blazesym/src/gsym/resolver.rs @@ -0,0 +1,195 @@ +use std::fmt::Debug; +use std::fmt::Formatter; +use std::fmt::Result as FmtResult; +use std::fs::File; +use std::io::Error; +use std::io::Read as _; +use std::mem; +use std::path::Path; +use std::path::PathBuf; + +use crate::inspect::FindAddrOpts; +use crate::inspect::SymInfo; +use crate::symbolize::AddrLineInfo; +use crate::Addr; +use crate::SymResolver; + +use super::linetab::run_op; +use super::linetab::LineTableRow; +use super::linetab::RunResult; +use super::parser::parse_address_data; +use super::parser::parse_line_table_header; +use super::parser::GsymContext; +use super::types::InfoTypeLineTableInfo; + +/// The symbol resolver for the GSYM format. +pub struct GsymResolver { + file_name: PathBuf, + ctx: GsymContext<'static>, + _data: Vec, +} + +impl GsymResolver { + pub fn new(file_name: PathBuf) -> Result { + let mut fo = File::open(&file_name)?; + let mut data = vec![]; + fo.read_to_end(&mut data)?; + let ctx = GsymContext::parse_header(&data)?; + + Ok(GsymResolver { + file_name, + // SAFETY: the lifetime of ctx depends on data, which is + // owned by the object. So, it is safe to strip the + // lifetime of ctx. + ctx: unsafe { mem::transmute(ctx) }, + _data: data, + }) + } +} + +impl SymResolver for GsymResolver { + fn find_symbols(&self, addr: Addr) -> Vec<(&str, Addr)> { + fn find_addr_impl(gsym: &GsymResolver, addr: Addr) -> Option> { + let idx = gsym.ctx.find_addr(addr)?; + + let found = gsym.ctx.addr_at(idx)?; + if addr < found { + return None + } + + let info = gsym.ctx.addr_info(idx)?; + let name = gsym.ctx.get_str(info.name as usize)?; + + Some(vec![(name, found)]) + } + + find_addr_impl(self, addr).unwrap_or_default() + } + + fn find_addr(&self, _name: &str, _opts: &FindAddrOpts) -> Option> { + // It is inefficient to find the address of a symbol with + // GSYM. We may support it in the future if needed. + None + } + + /// Finds the source code location for a given address. + /// + /// This function takes in an address and returns the file path, + /// line number and column of the line in the source code that + /// the address corresponds to. If it doesn't find any match it + /// returns `None`. + /// + /// # Arguments + /// + /// * `addr` - The address to find the source code location for. + /// + /// # Returns + /// + /// The `AddrLineInfo` corresponding to the address or `None`. + fn find_line_info(&self, addr: Addr) -> Option { + let idx = self.ctx.find_addr(addr)?; + let symaddr = self.ctx.addr_at(idx)?; + if addr < symaddr { + return None + } + let addrinfo = self.ctx.addr_info(idx)?; + if addr >= (symaddr + addrinfo.size as Addr) { + return None + } + + let addrdatas = parse_address_data(addrinfo.data)?; + for adr_ent in addrdatas { + if adr_ent.typ != InfoTypeLineTableInfo { + continue + } + // Continue to execute all GSYM line table operations + // until the end of the buffer is reached or a row + // containing addr is located. + let mut data = adr_ent.data; + let lntab_hdr = parse_line_table_header(&mut data)?; + let mut lntab_row = LineTableRow::line_table_row_from(&lntab_hdr, symaddr); + let mut last_lntab_row = lntab_row.clone(); + let mut row_cnt = 0; + while !data.is_empty() { + match run_op(&mut lntab_row, &lntab_hdr, &mut data) { + Some(RunResult::Ok) => {} + Some(RunResult::NewRow) => { + row_cnt += 1; + if addr < lntab_row.address { + if row_cnt == 1 { + // The address is lower than the first row. + return None + } + // Rollback to the last row. + lntab_row = last_lntab_row; + break + } + last_lntab_row = lntab_row.clone(); + } + Some(RunResult::End) | None => break, + } + } + + if row_cnt == 0 { + continue + } + + let finfo = self.ctx.file_info(lntab_row.file_idx as usize)?; + let dirname = self.ctx.get_str(finfo.directory as usize)?; + let filename = self.ctx.get_str(finfo.filename as usize)?; + let path = Path::new(dirname).join(filename); + return Some(AddrLineInfo { + path, + line: lntab_row.file_line as usize, + column: 0, + }) + } + None + } + + fn addr_file_off(&self, _addr: Addr) -> Option { + // Unavailable + None + } + + fn get_obj_file_name(&self) -> &Path { + &self.file_name + } +} + +impl Debug for GsymResolver { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + write!(f, "GSYM {}", self.file_name.display()) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use std::env; + + use test_log::test; + + /// Make sure that we can find file line information for a function, if available. + #[test] + fn test_find_line_info() { + let test_gsym = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test.gsym"); + let resolver = GsymResolver::new(test_gsym).unwrap(); + + // `main` resides at address 0x2000000, and it's located at the given + // line. + let info = resolver.find_line_info(0x2000000).unwrap(); + assert_eq!(info.line, 34); + assert!(info.path.ends_with("test-stable-addresses.c")); + + // `factorial` resides at address 0x2000100, and it's located at the + // given line. + let info = resolver.find_line_info(0x2000100).unwrap(); + assert_eq!(info.line, 8); + assert!(info.path.ends_with("test-stable-addresses.c")); + } +} diff --git a/blazesym/src/gsym/types.rs b/blazesym/src/gsym/types.rs new file mode 100644 index 0000000..2c8e73b --- /dev/null +++ b/blazesym/src/gsym/types.rs @@ -0,0 +1,48 @@ +use crate::util::Pod; + +pub const GSYM_MAGIC: u32 = 0x4753594d; +pub const GSYM_VERSION: u16 = 1; + + +/// GSYM File Header +pub struct Header { + pub magic: u32, + pub version: u16, + pub addr_off_size: u8, + pub uuid_size: u8, + pub base_address: u64, + pub num_addrs: u32, + pub strtab_offset: u32, + pub strtab_size: u32, + pub uuid: [u8; 20], +} + +#[repr(C)] +pub struct FileInfo { + pub directory: u32, + pub filename: u32, +} + +// SAFETY: `FileInfo` is valid for any bit pattern. +unsafe impl Pod for FileInfo {} + +pub struct AddrInfo<'a> { + pub size: u32, + pub name: u32, + /// The raw data comprises a list of [`AddrData`]. + pub data: &'a [u8], +} + +pub struct AddrData<'a> { + /// The data type. Its value should be one of InfoType*. + pub typ: u32, + pub length: u32, + pub data: &'a [u8], +} + +#[allow(non_upper_case_globals)] +pub const InfoTypeEndOfList: u32 = 0; +#[allow(non_upper_case_globals)] +pub const InfoTypeLineTableInfo: u32 = 1; +#[allow(non_upper_case_globals)] +pub const InfoTypeInlineInfo: u32 = 2; diff --git a/blazesym/src/inspect/inspector.rs b/blazesym/src/inspect/inspector.rs new file mode 100644 index 0000000..5729975 --- /dev/null +++ b/blazesym/src/inspect/inspector.rs @@ -0,0 +1,117 @@ +use std::io::Result; +use std::rc::Rc; + +use crate::dwarf::DwarfResolver; +use crate::elf::ElfBackend; +use crate::elf::ElfParser; +use crate::elf::ElfResolver; +use crate::SymResolver; + +use super::source::Elf; +use super::source::Source; +use super::FindAddrOpts; +use super::SymInfo; +use super::SymType; + + +/// An inspector of various "sources". +/// +/// Object of this type can be used to perform inspections of supported sources. +/// E.g., using an ELF file as a source, information about a symbol can be +/// inquired based on its name. +#[derive(Debug, Default)] +pub struct Inspector { + _private: (), +} + +impl Inspector { + /// Create a new `Inspector`. + pub fn new() -> Self { + Self { _private: () } + } + + /// Look up information (address etc.) about a list of symbols, + /// given their names. + pub fn lookup(&self, names: &[&str], src: &Source) -> Result>> { + let opts = FindAddrOpts { + offset_in_file: true, + obj_file_name: true, + sym_type: SymType::Unknown, + }; + + match src { + Source::Elf(Elf { + path, + debug_info, + _non_exhaustive: (), + }) => { + let backend = if *debug_info { + let debug_line_info = true; + let debug_info_symbols = true; + let dwarf = DwarfResolver::open(path, debug_line_info, debug_info_symbols)?; + let backend = ElfBackend::Dwarf(Rc::new(dwarf)); + backend + } else { + let elf = ElfParser::open(path)?; + let backend = ElfBackend::Elf(Rc::new(elf)); + backend + }; + + let resolver = ElfResolver::with_backend(path, backend)?; + let syms = names + .iter() + .map(|name| { + let mut syms = resolver.find_addr(name, &opts).unwrap_or_default(); + let () = syms.iter_mut().for_each(|sym| { + if opts.offset_in_file { + if let Some(off) = resolver.addr_file_off(sym.addr) { + sym.file_offset = off; + } + } + if opts.obj_file_name { + sym.obj_file_name = + Some(resolver.get_obj_file_name().to_path_buf()); + } + }); + + syms + }) + .collect(); + + Ok(syms) + } + } + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use std::io::ErrorKind; + use std::path::Path; + + + /// Check that we error our as expected when encountering a source + /// that is not present. + #[test] + fn non_present_file() { + fn test(src: &Source) { + let inspector = Inspector::new(); + let err = inspector.lookup(&["factorial"], src).unwrap_err(); + assert_eq!(err.kind(), ErrorKind::NotFound); + } + + let file = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("does-not-exist"); + let src = Source::Elf(Elf::new(&file)); + let () = test(&src); + + let mut elf = Elf::new(file); + elf.debug_info = !elf.debug_info; + let src = Source::Elf(elf); + let () = test(&src); + } +} diff --git a/blazesym/src/inspect/mod.rs b/blazesym/src/inspect/mod.rs new file mode 100644 index 0000000..2299222 --- /dev/null +++ b/blazesym/src/inspect/mod.rs @@ -0,0 +1,73 @@ +//! Functionality for inspecting files such as ELF or Gsym. +//! +//! ```no_run +//! use blazesym::inspect; +//! use blazesym::inspect::Inspector; +//! +//! let src = inspect::Source::Elf(inspect::Elf::new("/usr/bin/libc.so")); +//! let inspector = Inspector::new(); +//! let results = inspector +//! .lookup(&["fopen"], &src) +//! .unwrap(); +//! +//! // `results` contains a list of addresses of `fopen` symbols in `libc`. +//! // There probably will only be a single one. +//! ``` + +mod inspector; +mod source; + +use std::path::PathBuf; + +use crate::Addr; + +pub use inspector::Inspector; +pub use source::Elf; +pub use source::Source; + + +/// The type of a symbol. +#[derive(Clone, Copy, Debug, Default)] +pub enum SymType { + /// The symbol type is unknown. + #[default] + Unknown, + /// The symbol is a function. + Function, + /// The symbol is a variable. + Variable, +} + + +/// Information about a symbol. +#[derive(Clone, Debug)] +pub struct SymInfo { + /// The name of the symbol; for example, a function name. + pub name: String, + /// Start address (the first byte) of the symbol. + pub addr: Addr, + /// The size of the symbol. The size of a function for example. + pub size: usize, + /// A function or a variable. + pub sym_type: SymType, + /// The offset in the object file. + pub file_offset: u64, + /// The file name of the shared object. + pub obj_file_name: Option, +} + + +/// The context of an address finding request. +/// +/// This type passes additional parameters to resolvers. +#[derive(Debug, Default)] +pub(crate) struct FindAddrOpts { + /// Return the offset of the symbol from the first byte of the + /// object file if it is true. (False by default) + pub offset_in_file: bool, + /// Return the name of the object file if it is true. (False by default) + pub obj_file_name: bool, + /// Return the symbol(s) matching a given type. Unknown, by default, + /// means all types. + pub sym_type: SymType, +} diff --git a/blazesym/src/inspect/source.rs b/blazesym/src/inspect/source.rs new file mode 100644 index 0000000..9031dfd --- /dev/null +++ b/blazesym/src/inspect/source.rs @@ -0,0 +1,51 @@ +use std::path::Path; +use std::path::PathBuf; + + +/// An ELF file. +#[derive(Clone, Debug, PartialEq)] +pub struct Elf { + /// The path to the ELF file. + pub path: PathBuf, + /// Whether or not to consult debug information to satisfy the request (if + /// present). + pub debug_info: bool, + /// The struct is non-exhaustive and open to extension. + #[doc(hidden)] + pub(crate) _non_exhaustive: (), +} + +impl Elf { + /// Create a new [`Elf`] object, referencing the provided path. + pub fn new(path: impl Into) -> Self { + Self { + path: path.into(), + debug_info: true, + _non_exhaustive: (), + } + } +} + +impl From for Source { + fn from(elf: Elf) -> Self { + Source::Elf(elf) + } +} + + +/// The source to use for the inspection request. +#[derive(Clone, Debug, PartialEq)] +#[non_exhaustive] +pub enum Source { + /// The source is an ELF file. + Elf(Elf), +} + +impl Source { + /// Retrieve the path to the source, if it has any. + pub fn path(&self) -> Option<&Path> { + match self { + Self::Elf(elf) => Some(&elf.path), + } + } +} diff --git a/blazesym/src/kernel.rs b/blazesym/src/kernel.rs new file mode 100644 index 0000000..5fbeaea --- /dev/null +++ b/blazesym/src/kernel.rs @@ -0,0 +1,101 @@ +use std::fmt::Debug; +use std::fmt::Formatter; +use std::fmt::Result as FmtResult; +use std::io::Error; +use std::io::ErrorKind; +use std::io::Result; +use std::ops::Deref as _; +use std::path::Path; +use std::rc::Rc; + +use crate::elf::ElfResolver; +use crate::inspect::FindAddrOpts; +use crate::inspect::SymInfo; +use crate::ksym::KSymResolver; +use crate::symbolize::AddrLineInfo; +use crate::Addr; +use crate::SymResolver; + + +pub(crate) struct KernelResolver { + pub ksym_resolver: Option>, + pub elf_resolver: Option, +} + +impl KernelResolver { + pub fn new( + ksym_resolver: Option>, + elf_resolver: Option, + ) -> Result { + if ksym_resolver.is_none() && elf_resolver.is_none() { + return Err(Error::new( + ErrorKind::NotFound, + "failed to create kernel resolver: neither ksym resolver nor kernel image ELF resolver are present", + )) + } + + Ok(KernelResolver { + ksym_resolver, + elf_resolver, + }) + } +} + +impl SymResolver for KernelResolver { + fn find_symbols(&self, addr: Addr) -> Vec<(&str, Addr)> { + if let Some(ksym_resolver) = self.ksym_resolver.as_ref() { + ksym_resolver.find_symbols(addr) + } else { + self.elf_resolver.as_ref().unwrap().find_symbols(addr) + } + } + + fn find_addr(&self, _name: &str, _opts: &FindAddrOpts) -> Option> { + None + } + + fn find_line_info(&self, addr: Addr) -> Option { + self.elf_resolver + .as_ref() + .and_then(|resolver| resolver.find_line_info(addr)) + } + + fn addr_file_off(&self, _addr: Addr) -> Option { + None + } + + fn get_obj_file_name(&self) -> &Path { + let ksym_resolver = self + .ksym_resolver + .as_ref() + .map(|resolver| resolver.deref() as &dyn SymResolver); + let elf_resolver = self + .elf_resolver + .as_ref() + .map(|resolver| resolver as &dyn SymResolver); + + ksym_resolver + .or(elf_resolver) + .map(|resolver| resolver.get_obj_file_name()) + .unwrap_or_else(|| Path::new("")) + } +} + +impl Debug for KernelResolver { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + write!( + f, + "KernelResolver {} {}", + self.ksym_resolver + .as_ref() + .map(|resolver| resolver.get_obj_file_name().to_path_buf()) + .unwrap_or_default() + .display(), + self.elf_resolver + .as_ref() + .map(|resolver| resolver.get_obj_file_name().to_path_buf()) + .unwrap_or_default() + .display(), + ) + } +} diff --git a/blazesym/src/ksym.rs b/blazesym/src/ksym.rs new file mode 100644 index 0000000..68ea71e --- /dev/null +++ b/blazesym/src/ksym.rs @@ -0,0 +1,397 @@ +use std::cell::RefCell; +use std::collections::HashMap; +use std::fmt::Debug; +use std::fmt::Formatter; +use std::fmt::Result as FmtResult; +use std::fs::File; +use std::io::BufRead; +use std::io::BufReader; +use std::io::Result; +use std::path::Path; +use std::path::PathBuf; +use std::rc::Rc; + +use crate::inspect::FindAddrOpts; +use crate::inspect::SymInfo; +use crate::inspect::SymType; +use crate::symbolize::AddrLineInfo; +use crate::Addr; +use crate::SymResolver; + +pub const KALLSYMS: &str = "/proc/kallsyms"; +const DFL_KSYM_CAP: usize = 200000; + +#[derive(Debug)] +pub struct Ksym { + pub addr: Addr, + pub name: String, +} + +/// The symbol resolver for /proc/kallsyms. +/// +/// The users should provide the path of kallsyms, so you can provide +/// a copy from other devices. +pub struct KSymResolver { + syms: Vec, + sym_to_addr: RefCell>, + file_name: PathBuf, +} + +impl KSymResolver { + pub fn load_file_name(filename: PathBuf) -> Result { + let f = File::open(&filename)?; + let mut reader = BufReader::new(f); + let mut line = String::new(); + let mut syms = Vec::with_capacity(DFL_KSYM_CAP); + + loop { + let sz = reader.read_line(&mut line)?; + if sz == 0 { + break + } + let tokens = line.split_whitespace().collect::>(); + if tokens.len() < 3 { + break + } + let (addr, _symbol, func) = (tokens[0], tokens[1], tokens[2]); + if let Ok(addr) = Addr::from_str_radix(addr, 16) { + if addr == 0 { + line.truncate(0); + continue + } + let name = String::from(func); + syms.push(Ksym { addr, name }); + } + + line.truncate(0); + } + + syms.sort_by(|a, b| a.addr.cmp(&b.addr)); + + let slf = Self { + syms, + sym_to_addr: RefCell::default(), + file_name: filename, + }; + Ok(slf) + } + + fn ensure_sym_to_addr(&self) { + if self.sym_to_addr.borrow().len() > 0 { + return + } + let mut sym_to_addr = self.sym_to_addr.borrow_mut(); + for Ksym { name, addr } in self.syms.iter() { + // Performance & lifetime hacking + let name_static = unsafe { &*(name as *const String) }; + sym_to_addr.insert(name_static, *addr); + } + } + + pub fn find_addresses_ksym(&self, addr: Addr) -> impl Iterator { + let mut l = 0; + let mut r = self.syms.len(); + + while l < r { + let m = (l + r) / 2; + let sym = &self.syms[m]; + + if addr < sym.addr { + r = m; + } else { + l = m + 1; + } + } + debug_assert!( + (l == 0 || l >= self.syms.len()) + || (self.syms[l - 1].addr <= addr && addr < self.syms[l].addr) + ); + self.syms[0..l] + .iter() + .rev() + .take_while(move |sym| sym.addr == self.syms[l - 1].addr) + } + + #[cfg(test)] + pub fn find_addresses_ksym_simple(&self, addr: Addr) -> impl Iterator { + let mut i = 0; + while i < self.syms.len() && addr >= self.syms[i].addr { + i += 1; + } + self.syms[..i] + .iter() + .rev() + .take_while(move |x| x.addr == self.syms[i - 1].addr) + } +} + +impl SymResolver for KSymResolver { + fn find_symbols(&self, addr: Addr) -> Vec<(&str, Addr)> { + self.find_addresses_ksym(addr) + .map(|sym| (sym.name.as_str(), sym.addr)) + .collect() + } + + fn find_addr(&self, name: &str, opts: &FindAddrOpts) -> Option> { + if let SymType::Variable = opts.sym_type { + return None + } + self.ensure_sym_to_addr(); + + self.sym_to_addr.borrow().get(name).map(|addr| { + vec![SymInfo { + name: name.to_string(), + addr: *addr, + size: 0, + sym_type: SymType::Function, + file_offset: 0, + obj_file_name: None, + }] + }) + } + + fn find_line_info(&self, _addr: Addr) -> Option { + None + } + + fn addr_file_off(&self, _addr: Addr) -> Option { + None + } + + fn get_obj_file_name(&self) -> &Path { + &self.file_name + } +} + +impl Debug for KSymResolver { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + write!(f, "KSymResolver") + } +} + + +/// Cache of KSymResolver. +/// +/// It returns the same instance if path is the same. +#[derive(Debug)] +pub struct KSymCache { + resolvers: RefCell>>, +} + +impl KSymCache { + pub fn new() -> KSymCache { + KSymCache { + resolvers: RefCell::new(HashMap::new()), + } + } + + /// Find an instance of KSymResolver from the cache or create a new one. + pub fn get_resolver(&self, path: &Path) -> Result> { + let mut resolvers = self.resolvers.borrow_mut(); + if let Some(resolver) = resolvers.get(path) { + return Ok(resolver.clone()) + } + + let resolver = KSymResolver::load_file_name(path.to_path_buf())?; + let resolver = Rc::new(resolver); + resolvers.insert(path.to_path_buf(), resolver.clone()); + Ok(resolver) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::cmp::Ordering; + + use test_log::test; + + + // This test case is skipped by default for /proc/kallsyms may + // not available in some environment. + #[test] + #[ignore = "system-dependent; may fail"] + fn ksym_resolver_load_find() { + let resolver = KSymResolver::load_file_name(PathBuf::from(KALLSYMS)).unwrap(); + + assert!( + resolver.syms.len() > 10000, + "kallsyms seems to be unavailable or with all 0 addresses. (Check {KALLSYMS})" + ); + + // Find the address of the symbol placed at the middle + let sym = &resolver.syms[resolver.syms.len() / 2]; + let addr = sym.addr; + let name = sym.name.clone(); + let found = resolver.find_symbols(addr); + assert!(!found.is_empty()); + assert!(found.iter().any(|x| x.0 == name)); + let addr = addr + 1; + let found = resolver.find_symbols(addr); + assert!(!found.is_empty()); + assert!(found.iter().any(|x| x.0 == name)); + + // 0 is an invalid address. We remove all symbols with 0 as + // thier address from the list. + let found = resolver.find_symbols(0); + assert!(found.is_empty()); + + // Find the address of the last symbol + let sym = &resolver.syms.last().unwrap(); + let addr = sym.addr; + let name = sym.name.clone(); + let found = resolver.find_symbols(addr); + assert!(!found.is_empty()); + assert!(found.iter().any(|x| x.0 == name)); + let found = resolver.find_symbols(addr + 1); + assert!(!found.is_empty()); + assert!(found.iter().any(|x| x.0 == name)); + + // Find the symbol placed at the one third + let sym = &resolver.syms[resolver.syms.len() / 3]; + let addr = sym.addr; + let name = sym.name.clone(); + let opts = FindAddrOpts { + offset_in_file: false, + obj_file_name: false, + sym_type: SymType::Function, + }; + let found = resolver.find_addr(&name, &opts); + assert!(found.is_some()); + assert!(found.unwrap().iter().any(|x| x.addr == addr)); + } + + #[test] + fn ksym_cache() { + let kallsyms = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("kallsyms"); + let cache = KSymCache::new(); + let resolver = cache.get_resolver(&kallsyms); + let resolver1 = cache.get_resolver(&kallsyms); + assert!(resolver.is_ok()); + assert!(resolver1.is_ok()); + } + + #[test] + fn find_addresses_ksym() { + let resolver = KSymResolver { + syms: vec![ + Ksym { + addr: 0x123, + name: "1".to_string(), + }, + Ksym { + addr: 0x123, + name: "1.5".to_string(), + }, + Ksym { + addr: 0x1234, + name: "2".to_string(), + }, + Ksym { + addr: 0x12345, + name: "3".to_string(), + }, + ], + sym_to_addr: RefCell::default(), + file_name: PathBuf::new(), + }; + + // The address is less than the smallest address of all symbols. + assert!(resolver.find_addresses_ksym(1).next().is_none()); + + // The address match symbols exactly (the first address.) + let syms = resolver.find_addresses_ksym(0x123).collect::>(); + assert_eq!(syms.len(), 2); + assert_eq!(syms[0].addr, 0x123); + assert_eq!(syms[0].name, "1.5"); + assert_eq!(syms[1].addr, 0x123); + assert_eq!(syms[1].name, "1"); + + // The address is in between two symbols (the first address.) + let syms = resolver.find_addresses_ksym(0x124).collect::>(); + assert_eq!(syms.len(), 2); + assert_eq!(syms[0].addr, 0x123); + assert_eq!(syms[0].name, "1.5"); + assert_eq!(syms[1].addr, 0x123); + assert_eq!(syms[1].name, "1"); + + // The address match symbols exactly. + let syms = resolver.find_addresses_ksym(0x1234).collect::>(); + assert_eq!(syms.len(), 1); + assert_eq!(syms[0].addr, 0x1234); + assert_eq!(syms[0].name, "2"); + + // The address is in between two symbols. + let syms = resolver.find_addresses_ksym(0x1235).collect::>(); + assert_eq!(syms.len(), 1); + assert_eq!(syms[0].addr, 0x1234); + assert_eq!(syms[0].name, "2"); + + // The address match symbols exactly (the biggest address.) + let syms = resolver.find_addresses_ksym(0x12345).collect::>(); + assert_eq!(syms.len(), 1); + assert_eq!(syms[0].addr, 0x12345); + assert_eq!(syms[0].name, "3"); + + // The address is bigger than the biggest address of all symbols. + let syms = resolver.find_addresses_ksym(0x1234568).collect::>(); + assert_eq!(syms.len(), 1); + assert_eq!(syms[0].addr, 0x12345); + assert_eq!(syms[0].name, "3"); + } + + #[test] + fn find_addresses_ksym_exhaust() { + let syms_sz = 10; + let mut resolver = KSymResolver { + syms: (0..syms_sz) + .map(|x| Ksym { + addr: 1, + name: x.to_string(), + }) + .collect(), + sym_to_addr: RefCell::default(), + file_name: PathBuf::new(), + }; + + // A full-adder has a carry-out signal, right? + // Yes! Here it is. + let raised_carry_out = |addr| addr > syms_sz; + + while !raised_carry_out(resolver.syms[0].addr) { + // Test find_addresses_ksym() against every address in the + // range [0..syms_sz+1]. + for i in 0..=(syms_sz + 1) { + let result: Vec<_> = resolver.find_addresses_ksym(i).collect(); + let result_s: Vec<_> = resolver.find_addresses_ksym_simple(i).collect(); + assert_eq!(result.len(), result_s.len()); + assert_eq!( + result + .iter() + .map(|x| x.name.as_str()) + .cmp(result_s.iter().map(|x| x.name.as_str())), + Ordering::Equal + ); + } + + let mut i = syms_sz - 1; + // Increase the address of the last symbol. + resolver.syms[i].addr += 1; + while i > 0 && raised_carry_out(resolver.syms[i].addr) { + // Bring the raised carry-out it to the left. + i -= 1; + resolver.syms[i].addr += 1; + } + // Every symbol on the right side have a raised carry-out. + // Reset their addresses. + let low_addr = resolver.syms[i].addr; + while i < (syms_sz - 1) { + i += 1; + resolver.syms[i].addr = low_addr; + } + } + } +} diff --git a/blazesym/src/lib.rs b/blazesym/src/lib.rs new file mode 100644 index 0000000..2ba7e13 --- /dev/null +++ b/blazesym/src/lib.rs @@ -0,0 +1,125 @@ +//! **blazesym** is a library that can be used to symbolize addresses. Address +//! symbolization is a common problem in tracing contexts, for example, where users +//! want to reason about functions by name, but low level components report only the +//! "raw" addresses (e.g., in the form of stacktraces). +//! +//! In addition to symbolization, **blazesym** also provides APIs for the reverse +//! operation: looking up addresses from symbol names. That can be useful, for +//! example, for configuring breakpoints or tracepoints. +//! +//! ## Overview +//! The crate is organized via public modules that expose functionality +//! pertaining a certain topic. Specifically, these areas are currently covered: +//! +//! - [`symbolize`] covers address symbolization functionality +//! - [`inspect`] contains APIs for inspecting files such as ELF and Gsym to +//! lookup addresses to symbol names, for example +//! - [`normalize`] exposes address normalization functionality +//! +//! C API bindings are defined in a cross-cutting manner as part of the +//! [`c_api`] module (note that Rust code should not have to consume these +//! functions and on the ABI level this module organization has no relevance for +//! C). + +#![allow(clippy::collapsible_if, clippy::let_and_return, clippy::let_unit_value)] +#![deny(unsafe_op_in_unsafe_fn)] +#![warn(missing_debug_implementations)] +#![cfg_attr(feature = "nightly", feature(test))] +#![cfg_attr(not(feature = "lru"), allow(dead_code))] + +#[cfg(feature = "nightly")] +extern crate test; + +pub mod c_api; +mod dwarf; +mod elf; +mod gsym; +pub mod inspect; +mod kernel; +mod ksym; +mod maps; +mod mmap; +pub mod normalize; +mod resolver; +pub mod symbolize; +mod util; +// TODO: Remove `allow`. +#[allow(unused)] +mod zip; + +use std::fmt::Display; +use std::fmt::Formatter; +use std::fmt::Result as FmtResult; +use std::num::NonZeroU32; + +use resolver::SymResolver; + + +// We import all C API items during doc creation to not have to mention the +// `c_api` module in, say, the README. +#[cfg(doc)] +use c_api::*; + + +/// A type representing addresses. +pub type Addr = usize; + + +/// An enumeration identifying a process. +#[derive(Clone, Copy, Debug)] +pub enum Pid { + /// The current process. + Slf, + /// The process identified by the provided ID. + Pid(NonZeroU32), +} + +impl Display for Pid { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + match self { + Self::Slf => write!(f, "self"), + Self::Pid(pid) => write!(f, "{pid}"), + } + } +} + +impl From for Pid { + fn from(pid: u32) -> Self { + NonZeroU32::new(pid).map(Pid::Pid).unwrap_or(Pid::Slf) + } +} + + +#[cfg(feature = "log")] +#[macro_use] +mod log { + #[allow(unused)] + pub(crate) use log::debug; + pub(crate) use log::error; + #[allow(unused)] + pub(crate) use log::info; + #[allow(unused)] + pub(crate) use log::trace; + pub(crate) use log::warn; +} +#[cfg(not(feature = "log"))] +#[macro_use] +mod log { + macro_rules! debug { + ($($args:tt)*) => {{ + if false { + // Make sure to use `args` to prevent any warnings about + // unused variables. + let _args = format_args!($($args)*); + } + }}; + } + #[allow(unused)] + pub(crate) use debug; + pub(crate) use debug as error; + #[allow(unused)] + pub(crate) use debug as info; + #[allow(unused)] + pub(crate) use debug as trace; + pub(crate) use debug as warn; +} diff --git a/blazesym/src/maps.rs b/blazesym/src/maps.rs new file mode 100644 index 0000000..7fe6569 --- /dev/null +++ b/blazesym/src/maps.rs @@ -0,0 +1,379 @@ +use std::fs::File; +use std::io::BufRead; +use std::io::BufReader; +use std::io::Error; +use std::io::ErrorKind; +use std::io::Read; +use std::io::Result; +use std::ops::Range; +use std::path::PathBuf; + +use crate::Addr; +use crate::Pid; + + +#[derive(Debug, Eq, Hash, PartialEq)] +pub(crate) struct EntryPath { + /// The path of the file backing the maps entry via a + /// `/proc//map_files/` component. + /// + /// This path should generally be used on the local system, unless perhaps + /// for reporting purposes (for which `path` below may be more appropriate). + pub maps_file: PathBuf, + /// The path to the file backing the proc maps entry as found directly in + /// the `/proc//maps` file. This path should generally only be used for + /// reporting matters or outside of the system on which proc maps was + /// parsed. This path has been sanitized and no longer contains any + /// `(deleted)` suffixes. + pub symbolic_path: PathBuf, +} + + +/// The "pathname" component in a proc maps entry. See `proc(5)` section +/// `/proc/[pid]/maps`. +#[derive(Debug, PartialEq)] +pub(crate) enum PathName { + Path(EntryPath), + Component(String), +} + +impl PathName { + #[cfg(test)] + pub fn as_path(&self) -> Option<&EntryPath> { + match self { + Self::Path(path) => Some(path), + _ => None, + } + } + + #[cfg(test)] + pub fn as_component(&self) -> Option<&str> { + match self { + Self::Component(comp) => Some(comp), + _ => None, + } + } +} + + +#[derive(Debug)] +pub(crate) struct MapsEntry { + /// The virtual address range covered by this entry. + pub range: Range, + pub mode: u8, + pub offset: u64, + pub path_name: Option, +} + + +/// An already filtered `MapsEntry` that is guaranteed to contain a path. +#[derive(Debug)] +pub(crate) struct PathMapsEntry { + /// The virtual address range covered by this entry. + pub range: Range, + pub _mode: u8, + pub offset: u64, + pub path: EntryPath, +} + + +/// Parse a line of a proc maps file. +fn parse_maps_line<'line>(line: &'line str, pid: Pid) -> Result { + let full_line = line; + + let split_once = |line: &'line str, component| -> Result<(&'line str, &'line str)> { + line.split_once(|c: char| c.is_ascii_whitespace()) + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + format!("failed to find {component} in proc maps line: {line}\n{full_line}"), + ) + }) + }; + + // Lines have the following format: + // address perms offset dev inode pathname + // 08048000-08049000 r-xp 00000000 03:00 8312 /opt/test + // 0804a000-0806b000 rw-p 00000000 00:00 0 [heap] + // a7cb1000-a7cb2000 ---p 00000000 00:00 0 + // a7ed5000-a8008000 r-xp 00000000 03:00 4222 /lib/libc.so.6 + let (address_str, line) = split_once(line, "address range")?; + let (loaded_str, end_str) = address_str.split_once('-').ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + format!("encountered malformed address range in proc maps line: {full_line}"), + ) + })?; + let loaded_address = Addr::from_str_radix(loaded_str, 16).map_err(|err| { + Error::new( + ErrorKind::InvalidData, + format!("encountered malformed start address in proc maps line: {full_line}: {err}"), + ) + })?; + let end_address = Addr::from_str_radix(end_str, 16).map_err(|err| { + Error::new( + ErrorKind::InvalidData, + format!("encountered malformed end address in proc maps line: {full_line}: {err}"), + ) + })?; + + let (mode_str, line) = split_once(line, "permissions component")?; + let mode = mode_str + .chars() + .fold(0, |mode, c| (mode << 1) | u8::from(c != '-')); + + let (offset_str, line) = split_once(line, "offset component")?; + let offset = u64::from_str_radix(offset_str, 16).map_err(|err| { + Error::new( + ErrorKind::InvalidData, + format!("encountered malformed offset component in proc maps line: {full_line}: {err}"), + ) + })?; + + let (_dev, line) = split_once(line, "device component")?; + // Note that by design, a path may not be present and so we may not be able + // to successfully split. + let path_str = split_once(line, "inode component") + .map(|(_inode, line)| line.trim()) + .unwrap_or(""); + + let path_name = match path_str.as_bytes() { + [] => None, + [b'/', ..] => { + let symbolic_path = + PathBuf::from(path_str.strip_suffix(" (deleted)").unwrap_or(path_str)); + // TODO: May have to resolve the symbolic link in case of + // `Pid::Slf` here for remote symbolization use cases. + let maps_file = PathBuf::from(format!("/proc/{pid}/map_files/{address_str}")); + Some(PathName::Path(EntryPath { + maps_file, + symbolic_path, + })) + } + // This variant would typically capture components such as `[vdso]` or + // `[heap]`, but we can't rely on square brackets being present + // unconditionally, as variants such as `anon_inode:bpf-map` are also + // possible. + [..] => Some(PathName::Component(path_str.to_string())), + }; + + let entry = MapsEntry { + range: (loaded_address..end_address), + mode, + offset, + path_name, + }; + Ok(entry) +} + + +#[derive(Debug)] +struct MapsEntryIter { + reader: R, + line: String, + pid: Pid, +} + +impl Iterator for MapsEntryIter +where + R: BufRead, +{ + type Item = Result; + + fn next(&mut self) -> Option { + loop { + let () = self.line.clear(); + match self.reader.read_line(&mut self.line) { + Err(err) => return Some(Err(err)), + Ok(0) => break None, + Ok(_) => { + let line_str = self.line.trim(); + // There shouldn't be any empty lines, but we'd just ignore them. We + // need to trim anyway. + if !line_str.is_empty() { + let result = parse_maps_line(line_str, self.pid); + break Some(result) + } + } + } + } + } +} + + +/// Parse a proc maps file from the provided reader. +/// +/// `filter` is a filter function (similar to those usable on iterators) +/// that determines which entries we keep (those for which it returned +/// `true`) and which we discard (anything `false`). +pub(crate) fn parse_file(reader: R, pid: Pid) -> impl Iterator> +where + R: Read, +{ + MapsEntryIter { + reader: BufReader::new(reader), + line: String::new(), + pid, + } +} + +/// Parse the maps file for the process with the given PID. +pub(crate) fn parse(pid: Pid) -> Result>> { + let path = format!("/proc/{pid}/maps"); + let file = File::open(path)?; + let iter = parse_file(file, pid); + Ok(iter) +} + +/// A helper function checking whether a `MapsEntry` has relevance to +/// symbolization efforts and converting it accordingly. +pub(crate) fn filter_map_relevant(entry: MapsEntry) -> Option { + let MapsEntry { + range, + mode, + offset, + path_name, + } = entry; + + // Only entries that are executable (--x-) are of relevance. + if (mode & 0b0010) != 0b0010 { + return None + } + + match path_name { + Some(PathName::Path(path)) => Some(PathMapsEntry { + range, + _mode: mode, + offset, + path, + }), + _ => None, + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use std::path::Path; + + use test_log::test; + + + /// Check that we can parse `/proc/self/maps`. + #[allow(clippy::suspicious_map)] + #[test] + fn self_map_parsing() { + let maps = parse(Pid::Slf).unwrap(); + assert_ne!(maps.map(|entry| entry.unwrap()).count(), 0); + } + + /// Make sure that we can parse proc maps lines correctly. + #[test] + fn map_line_parsing() { + let lines = r#" +55f4a95c9000-55f4a95cb000 r--p 00000000 00:20 41445 /usr/bin/cat +55f4a95cb000-55f4a95cf000 r-xp 00002000 00:20 41445 /usr/bin/cat +55f4a95cf000-55f4a95d1000 r--p 00006000 00:20 41445 /usr/bin/cat +55f4a95d1000-55f4a95d2000 r--p 00007000 00:20 41445 /usr/bin/cat +55f4a95d2000-55f4a95d3000 rw-p 00008000 00:20 41445 /usr/bin/cat +55f4aa379000-55f4aa39a000 rw-p 00000000 00:00 0 [heap] +7f1273b05000-7f1273b06000 r--s 00000000 00:13 19 /sys/fs/selinux/status +7f2321e00000-7f2321e37000 r--p 00000000 00:20 1808269 /usr/lib64/libgnutls.so.30.34.1 (deleted) +7f2321e37000-7f2321f6f000 r-xp 00037000 00:20 1808269 /usr/lib64/libgnutls.so.30.34.1 (deleted) +7f2321f6f000-7f2322009000 r--p 0016f000 00:20 1808269 /usr/lib64/libgnutls.so.30.34.1 (deleted) +7f2322009000-7f232201b000 r--p 00208000 00:20 1808269 /usr/lib64/libgnutls.so.30.34.1 (deleted) +7f232201b000-7f232201d000 rw-p 0021a000 00:20 1808269 /usr/lib64/libgnutls.so.30.34.1 (deleted) +7fa7ade00000-7fa7bb3b7000 r--p 00000000 00:20 12022451 /usr/lib/locale/locale-archive +7fa7bb400000-7fa7bb428000 r--p 00000000 00:20 12023223 /usr/lib64/libc.so.6 +7fa7bb428000-7fa7bb59c000 r-xp 00028000 00:20 12023223 /usr/lib64/libc.so.6 +7fa7bb59c000-7fa7bb5f4000 r--p 0019c000 00:20 12023223 /usr/lib64/libc.so.6 +7fa7bb5f4000-7fa7bb5f8000 r--p 001f3000 00:20 12023223 /usr/lib64/libc.so.6 +7fa7bb5f8000-7fa7bb5fa000 rw-p 001f7000 00:20 12023223 /usr/lib64/libc.so.6 +7fa7bb5fa000-7fa7bb602000 rw-p 00000000 00:00 0 +7fa7bb721000-7fa7bb746000 rw-p 00000000 00:00 0 +7fa7bb758000-7fa7bb75a000 rw-p 00000000 00:00 0 +7fa7bb75a000-7fa7bb75c000 r--p 00000000 00:20 12023220 /usr/lib64/ld-linux-x86-64.so.2 +7fa7bb75c000-7fa7bb783000 r-xp 00002000 00:20 12023220 /usr/lib64/ld-linux-x86-64.so.2 +7fa7bb783000-7fa7bb78e000 r--p 00029000 00:20 12023220 /usr/lib64/ld-linux-x86-64.so.2 +7fa7bb78f000-7fa7bb791000 r--p 00034000 00:20 12023220 /usr/lib64/ld-linux-x86-64.so.2 +7fa7bb791000-7fa7bb793000 rw-p 00036000 00:20 12023220 /usr/lib64/ld-linux-x86-64.so.2 +7ff8d9eab000-7ff8d9ecc000 rw-s 00000000 00:0e 2057 anon_inode:[perf_event] +7ff8d9ecc000-7ff8d9eed000 rw-s 00000000 00:0e 2057 anon_inode:[perf_event] +7ff8d9f2d000-7ff8d9f2e000 r--s 00000000 00:0e 2057 anon_inode:bpf-map +7ff8d9f6f000-7ff8d9f70000 r--s 00000000 00:0e 2057 anon_inode:bpf-map +7ffd03212000-7ffd03234000 rw-p 00000000 00:00 0 [stack] +7ffd033a7000-7ffd033ab000 r--p 00000000 00:00 0 [vvar] +7ffd033ab000-7ffd033ad000 r-xp 00000000 00:00 0 [vdso] +ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] +"#; + + let entries = parse_file(lines.as_bytes(), Pid::Slf); + let () = entries.for_each(|entry| { + let _entry = entry.unwrap(); + }); + + // Parse the first (actual) line. + let entry = parse_maps_line(lines.lines().nth(2).unwrap(), Pid::Slf).unwrap(); + assert_eq!(entry.range.start, 0x55f4a95cb000); + assert_eq!(entry.range.end, 0x55f4a95cf000); + assert_eq!(entry.mode, 0b1011); + assert_eq!( + entry + .path_name + .as_ref() + .unwrap() + .as_path() + .unwrap() + .maps_file, + Path::new("/proc/self/map_files/55f4a95cb000-55f4a95cf000") + ); + assert_eq!(entry.path_name.as_ref().unwrap().as_component(), None); + + let entry = parse_maps_line(lines.lines().nth(6).unwrap(), Pid::Slf).unwrap(); + assert_eq!(entry.range.start, 0x55f4aa379000); + assert_eq!(entry.range.end, 0x55f4aa39a000); + assert_eq!(entry.mode, 0b1101); + assert_eq!( + entry.path_name.as_ref().unwrap().as_component().unwrap(), + "[heap]", + ); + assert_eq!(entry.path_name.as_ref().unwrap().as_path(), None); + + let entry = parse_maps_line(lines.lines().nth(8).unwrap(), Pid::Slf).unwrap(); + assert_eq!(entry.mode, 0b1001); + assert_eq!( + entry + .path_name + .as_ref() + .unwrap() + .as_path() + .unwrap() + .maps_file, + Path::new("/proc/self/map_files/7f2321e00000-7f2321e37000") + ); + } + + /// Check that we error out as expected on malformed proc maps lines. + #[test] + fn malformed_proc_maps_lines() { + let lines = [ + "7fa7bb75a000+7fa7bb75c000", + "7fa7bb75a000-7fa7bb75c000", + "7fa7b$#5a000-7fa7bb75c000", + "7fa7bb75a000-7fa7@%@5c000", + "7fa7bb75a000+7fa7bb75c000 r--p", + "7fa7bb75a000-7fa7bb75c000 r--p", + "7fa7b$#5a000-7fa7bb75c000 r--p", + "7fa7bb75a000-7fa7@%@5c000 r--p", + "7fa7bb75a000-7fa7bb75c000 r--p", + "7fa7bb75a000-7fa7bb75c000 r--p 00000000", + "7fa7bb75a000-7fa7bb75c000 r--p 000zz000 00:20", + ]; + + let () = lines.iter().for_each(|line| { + let _err = parse_maps_line(line, Pid::Slf).unwrap_err(); + }); + } +} diff --git a/blazesym/src/mmap.rs b/blazesym/src/mmap.rs new file mode 100644 index 0000000..62acc88 --- /dev/null +++ b/blazesym/src/mmap.rs @@ -0,0 +1,193 @@ +use std::fs::File; +use std::io::Error; +use std::io::ErrorKind; +use std::io::Result; +use std::ops::Deref; +use std::ops::Range; +use std::os::unix::io::AsRawFd; +use std::path::Path; +use std::ptr::null_mut; +use std::rc::Rc; +use std::slice; + + +#[derive(Debug)] +pub(crate) struct Builder { + /// The protection flags to use. + protection: libc::c_int, +} + +impl Builder { + fn new() -> Self { + Self { + protection: libc::PROT_READ, + } + } + + /// Configure the mapping to be executable. + #[cfg(test)] + pub fn exec(mut self) -> Self { + self.protection |= libc::PROT_EXEC; + self + } + + /// Memory map the file at the provided `path`. + pub fn open

(self, path: P) -> Result + where + P: AsRef, + { + let file = File::open(path)?; + self.map(&file) + } + + /// Map the provided file into memory, in its entirety. + pub fn map(self, file: &File) -> Result { + let len = libc::size_t::try_from(file.metadata()?.len()) + .map_err(|_err| Error::new(ErrorKind::InvalidData, "file is too large to mmap"))?; + let offset = 0; + + // SAFETY: `mmap` with the provided arguments is always safe to call. + let ptr = unsafe { + libc::mmap( + null_mut(), + len, + self.protection, + libc::MAP_PRIVATE, + file.as_raw_fd(), + offset, + ) + }; + + if ptr == libc::MAP_FAILED { + return Err(Error::last_os_error()) + } + + let mapping = Mapping { ptr, len }; + let mmap = Mmap { + mapping: Rc::new(mapping), + view: 0..len, + }; + Ok(mmap) + } +} + + +#[derive(Debug)] +pub(crate) struct Mapping { + ptr: *mut libc::c_void, + len: usize, +} + +impl Deref for Mapping { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + // SAFETY: We know that the pointer is valid and represents a region of + // `len` bytes. + unsafe { slice::from_raw_parts(self.ptr.cast(), self.len) } + } +} + +impl Drop for Mapping { + fn drop(&mut self) { + // SAFETY: The `ptr` is valid. + let rc = unsafe { libc::munmap(self.ptr, self.len) }; + assert!(rc == 0, "unable to unmap mmap: {}", Error::last_os_error()); + } +} + + +#[derive(Clone, Debug)] +pub(crate) struct Mmap { + /// The actual memory mapping. + mapping: Rc, + /// The view on the memory mapping that this object represents. + view: Range, +} + +impl Mmap { + /// Create [`Builder`] for creating a customizable memory mapping. + pub fn builder() -> Builder { + Builder::new() + } + + /// Map the provided file into memory, in its entirety. + pub fn map(file: &File) -> Result { + Self::builder().map(file) + } + + /// Create a new `Mmap` object (sharing the same underlying memory mapping + /// as the current one) that restricts its view to the provided `range`. + /// Adjustment happens relative to the current view. + #[cfg(test)] + pub fn constrain(&self, range: Range) -> Option { + if self.view.start + range.end > self.view.end { + return None + } + + let mut mmap = self.clone(); + mmap.view.end = mmap.view.start + range.end; + mmap.view.start += range.start; + Some(mmap) + } +} + +impl Deref for Mmap { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + self.mapping.deref().get(self.view.clone()).unwrap() + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use std::ffi::CStr; + use std::io::Write; + + use tempfile::tempfile; + use test_log::test; + + use crate::util::ReadRaw; + + + /// Check that we can `mmap` a file. + #[test] + fn mmap() { + let mut file = tempfile().unwrap(); + let cstr = b"Daniel was here. Briefly.\0"; + let () = file.write_all(cstr).unwrap(); + let () = file.sync_all().unwrap(); + + let mmap = Mmap::map(&file).unwrap(); + let mut data = mmap.deref(); + let s = data.read_cstr().unwrap(); + assert_eq!( + s.to_str().unwrap(), + CStr::from_bytes_with_nul(cstr).unwrap().to_str().unwrap() + ); + } + + /// Check that we can properly restrict the view of a `Mmap`. + #[test] + fn view_constraining() { + let mut file = tempfile().unwrap(); + let s = b"abcdefghijklmnopqrstuvwxyz"; + let () = file.write_all(s).unwrap(); + let () = file.sync_all().unwrap(); + + let mmap = Mmap::map(&file).unwrap(); + assert_eq!(mmap.deref(), b"abcdefghijklmnopqrstuvwxyz"); + + let mmap = mmap.constrain(1..15).unwrap(); + assert_eq!(mmap.deref(), b"bcdefghijklmno"); + + let mmap = mmap.constrain(5..6).unwrap(); + assert_eq!(mmap.deref(), b"g"); + + assert!(mmap.constrain(1..2).is_none()); + } +} diff --git a/blazesym/src/normalize/meta.rs b/blazesym/src/normalize/meta.rs new file mode 100644 index 0000000..a3d9acd --- /dev/null +++ b/blazesym/src/normalize/meta.rs @@ -0,0 +1,55 @@ +use std::path::PathBuf; + + +/// A GNU build ID, as raw bytes. +type BuildId = Vec; + + +/// Meta information about a user space binary (executable, shared object, APK, +/// ...). +#[derive(Clone, Debug, PartialEq)] +pub struct Binary { + /// The canonical absolute path to the binary, including its name. + pub path: PathBuf, + /// The binary's build ID, if available. + pub build_id: Option, + /// The struct is non-exhaustive and open to extension. + #[doc(hidden)] + pub(crate) _non_exhaustive: (), +} + + +/// Meta information about an address that could not be determined to be +/// belonging to a specific component. Such an address will be reported +/// in non-normalized form (as provided by the user). +#[derive(Clone, Debug, Default, PartialEq)] +pub struct Unknown { + /// The struct is non-exhaustive and open to extension. + #[doc(hidden)] + pub(crate) _non_exhaustive: (), +} + +impl From for UserAddrMeta { + fn from(unknown: Unknown) -> Self { + Self::Unknown(unknown) + } +} + + +/// Meta information for an address. +#[derive(Clone, Debug, PartialEq)] +#[non_exhaustive] +pub enum UserAddrMeta { + Binary(Binary), + Unknown(Unknown), +} + +impl UserAddrMeta { + /// Retrieve the [`Binary`] of this enum, if this variant is active. + pub fn binary(&self) -> Option<&Binary> { + match self { + Self::Binary(binary) => Some(binary), + _ => None, + } + } +} diff --git a/blazesym/src/normalize/mod.rs b/blazesym/src/normalize/mod.rs new file mode 100644 index 0000000..555bb70 --- /dev/null +++ b/blazesym/src/normalize/mod.rs @@ -0,0 +1,33 @@ +//! Functionality for address normalization. +//! +//! Address normalization is one step of address symbolization: before can +//! address as captured in a process can be looked up in a file, it needs to be +//! converted into an address as it will be used inside the file. E.g., +//! addresses in a shared object (or any position independent binary) may be +//! relative to that file. When such a shared object is loaded into a process, +//! it is relocated. Normalization removes this relocation information and +//! similar adjustments made by the system (e.g., by address space layout +//! randomization). +//! +//! ```no_run +//! use blazesym::normalize::Normalizer; +//! use blazesym::Pid; +//! +//! let normalizer = Normalizer::new(); +//! let addrs = [0xdeadbeef]; +//! let pid = Pid::from(1234); +//! let norm_addrs = normalizer.normalize_user_addrs(&addrs, pid).unwrap(); +//! ``` + +mod meta; +mod normalizer; + +pub use meta::Binary; +pub use meta::Unknown; +pub use meta::UserAddrMeta; +pub use normalizer::NormalizedUserAddrs; +pub use normalizer::Normalizer; + +pub(crate) use normalizer::normalize_elf_addr; +pub(crate) use normalizer::normalize_sorted_user_addrs_with_entries; +pub(crate) use normalizer::Handler; diff --git a/blazesym/src/normalize/normalizer.rs b/blazesym/src/normalize/normalizer.rs new file mode 100644 index 0000000..24062f9 --- /dev/null +++ b/blazesym/src/normalize/normalizer.rs @@ -0,0 +1,619 @@ +use std::collections::HashMap; +use std::fs::File; +use std::io::Error; +use std::io::ErrorKind; +use std::io::Result; +use std::path::Path; +use std::path::PathBuf; + +use crate::elf; +use crate::elf::types::Elf64_Nhdr; +use crate::elf::ElfParser; +use crate::log::warn; +use crate::maps; +use crate::maps::PathMapsEntry; +use crate::util; +use crate::util::ReadRaw as _; +use crate::Addr; +use crate::Pid; + +use super::meta::Binary; +use super::meta::Unknown; +use super::meta::UserAddrMeta; + + +/// A typedef for functions reading build IDs. +type BuildIdFn = dyn Fn(&Path) -> Result>>; + + +/// A type capturing normalized addresses along with captured meta data. +/// +/// This type enables "remote" symbolization. That is to say, it represents the +/// input necessary for addresses to be symbolized on a system other than where +/// they were recorded. +#[derive(Clone, Debug)] +pub struct NormalizedAddrs { + /// Normalized addresses along with an index into `meta` for retrieval of + /// the corresponding [`AddrMeta`] information. + /// + /// A normalized address is one as it would appear in a binary or debug + /// symbol file, i.e., one excluding any relocations. + pub addrs: Vec<(Addr, usize)>, + /// Meta information about the normalized addresses. + pub meta: Vec, +} + +/// A type representing normalized user addresses. +pub type NormalizedUserAddrs = NormalizedAddrs; + + +/// A type representing a build ID note. +/// +/// In the ELF file, this header is typically followed by the variable sized +/// build ID. +#[repr(C)] +struct BuildIdNote { + /// ELF note header. + header: Elf64_Nhdr, + /// NUL terminated string representing the name. + name: [u8; 4], +} + +// SAFETY: `BuildIdNote` is valid for any bit pattern. +unsafe impl crate::util::Pod for BuildIdNote {} + + +/// Attempt to read an ELF binary's build ID. +// TODO: Currently look up is always performed based on section name, but there +// is also the possibility of iterating notes and checking checking +// Elf64_Nhdr.n_type for NT_GNU_BUILD_ID, specifically. +fn read_build_id(path: &Path) -> Result>> { + let build_id_section = ".note.gnu.build-id"; + let file = File::open(path)?; + let parser = ElfParser::open_file(file)?; + + // The build ID is contained in the `.note.gnu.build-id` section. See + // elf(5). + if let Ok(idx) = parser.find_section(build_id_section) { + // SANITY: We just found the index so the section should always be + // found. + let shdr = parser.section_headers()?.get(idx).unwrap(); + if shdr.sh_type != elf::types::SHT_NOTE { + warn!( + "build ID section {build_id_section} of {} is of unsupported type ({})", + path.display(), + shdr.sh_type + ); + return Ok(None) + } + + // SANITY: We just found the index so the section should always be + // found. + let mut bytes = parser.section_data(idx).unwrap(); + let header = bytes.read_pod_ref::().ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "failed to read build ID section header", + ) + })?; + if &header.name != b"GNU\0" { + warn!( + "encountered unsupported build ID type {:?}; ignoring", + header.name + ); + Ok(None) + } else { + // Every byte following the header is part of the build ID. + let build_id = bytes.to_vec(); + Ok(Some(build_id)) + } + } else { + Ok(None) + } +} + + +fn normalize_elf_offset_with_parser(offset: u64, parser: &ElfParser) -> Result> { + let phdrs = parser.program_headers()?; + let addr = phdrs.iter().find_map(|phdr| { + if phdr.p_type == elf::types::PT_LOAD { + if (phdr.p_offset..phdr.p_offset + phdr.p_memsz).contains(&offset) { + return Some((offset - phdr.p_offset + phdr.p_vaddr) as Addr) + } + } + None + }); + + Ok(addr) +} + +/// Normalize a virtual address belonging to an ELF file represented by the +/// provided [`PathMapsEntry`]. +pub(crate) fn normalize_elf_addr(virt_addr: Addr, entry: &PathMapsEntry) -> Result { + let file_off = virt_addr as u64 - entry.range.start as u64 + entry.offset; + let parser = ElfParser::open(&entry.path.maps_file)?; + let addr = normalize_elf_offset_with_parser(file_off, &parser)?.ok_or_else(|| { + Error::new( + ErrorKind::InvalidInput, + format!( + "failed to find ELF segment in {} that contains file offset 0x{:x}", + entry.path.symbolic_path.display(), + entry.offset, + ), + ) + })?; + + Ok(addr) +} + + +impl NormalizedUserAddrs { + /// Add an unknown (non-normalizable) address to this object. + /// + /// This function accepts `unknown_idx` which, if not `None`, should + /// contain the index into [`Self::meta`] at which an [`Unknown`] + /// without any build ID resides. + /// + /// It returns the index of the inserted [`Unknown`] variant. The + /// return type is an `Option` only for convenience of callers. + /// Returned is always a `Some`. + fn add_unknown_addr(&mut self, addr: Addr, unknown_idx: Option) -> Option { + let unknown_idx = if let Some(unknown_idx) = unknown_idx { + debug_assert_eq!(self.meta[unknown_idx], Unknown::default().into()); + unknown_idx + } else { + let unknown_idx = self.meta.len(); + let unknown = Unknown::default(); + let () = self.meta.push(UserAddrMeta::Unknown(unknown)); + unknown_idx + }; + + let () = self.addrs.push((addr, unknown_idx)); + Some(unknown_idx) + } +} + + +pub(crate) trait Handler { + /// Handle an unknown address. + fn handle_unknown_addr(&mut self, addr: Addr) -> Result<()>; + + /// Handle an address residing in the provided [`PathMapsEntry`]. + fn handle_entry_addr(&mut self, addr: Addr, entry: &PathMapsEntry) -> Result<()>; +} + + +struct NormalizationHandler { + /// The normalized user addresses we are building up. + normalized: NormalizedUserAddrs, + /// Lookup table from path (as used in each proc maps entry) to index into + /// `normalized.meta`. + meta_lookup: HashMap, + /// The index of the `Unknown` entry in `meta_lookup`, used for all unknown + /// addresses. + unknown_idx: Option, + /// The function used for retrieving build IDs. + get_build_id: &'static BuildIdFn, +} + +impl NormalizationHandler { + /// Instantiate a new `NormalizationHandler` object. + fn new(addr_count: usize, get_build_id: &'static BuildIdFn) -> Self { + Self { + normalized: NormalizedUserAddrs { + addrs: Vec::with_capacity(addr_count), + meta: Vec::new(), + }, + meta_lookup: HashMap::::new(), + unknown_idx: None, + get_build_id, + } + } +} + +impl Handler for NormalizationHandler { + fn handle_unknown_addr(&mut self, addr: Addr) -> Result<()> { + self.unknown_idx = self.normalized.add_unknown_addr(addr, self.unknown_idx); + Ok(()) + } + + fn handle_entry_addr(&mut self, addr: Addr, entry: &PathMapsEntry) -> Result<()> { + let meta_idx = if let Some(meta_idx) = self.meta_lookup.get(&entry.path.symbolic_path) { + *meta_idx + } else { + let binary = Binary { + path: entry.path.symbolic_path.to_path_buf(), + build_id: (self.get_build_id)(&entry.path.maps_file)?, + _non_exhaustive: (), + }; + + let meta_idx = self.normalized.meta.len(); + let () = self.normalized.meta.push(UserAddrMeta::Binary(binary)); + let _ref = self + .meta_lookup + .insert(entry.path.symbolic_path.to_path_buf(), meta_idx); + meta_idx + }; + + let normalized_addr = normalize_elf_addr(addr, entry)?; + let () = self.normalized.addrs.push((normalized_addr, meta_idx)); + Ok(()) + } +} + + +pub(crate) fn normalize_sorted_user_addrs_with_entries( + addrs: A, + entries: E, + mut handler: H, +) -> Result +where + A: ExactSizeIterator + Clone, + E: Iterator>, + H: Handler, +{ + let mut entries = entries.filter_map(|result| match result { + Ok(entry) => maps::filter_map_relevant(entry).map(Ok), + Err(err) => Some(Err(err)), + }); + + let mut entry = entries.next().ok_or_else(|| { + Error::new( + ErrorKind::UnexpectedEof, + "proc maps does not contain relevant entries", + ) + })??; + + let mut prev_addr = addrs.clone().next().unwrap_or_default(); + // We effectively do a single pass over `addrs`, advancing to the next + // proc maps entry whenever the current address is not (or no longer) + // contained in the current entry's range. + 'main: for addr in addrs { + if addr < prev_addr { + return Err(Error::new( + ErrorKind::InvalidInput, + "addresses to normalize are not sorted", + )) + } + prev_addr = addr; + + while addr >= entry.range.end { + entry = if let Some(entry) = entries.next() { + entry? + } else { + // If there are no proc maps entries left to check, we + // cannot normalize. We have to assume that addresses + // were valid and the ELF object was just unmapped, + // similar to above. + let () = handler.handle_unknown_addr(addr)?; + continue 'main + }; + } + + // proc maps entries are always sorted by start address. If the + // current address lies before the start address at this point, + // that means that we cannot find a suitable entry. This could + // happen, for example, if an ELF object was unmapped between + // address capture and normalization. + if addr < entry.range.start { + let () = handler.handle_unknown_addr(addr)?; + continue 'main + } + + let () = handler.handle_entry_addr(addr, &entry)?; + } + + Ok(handler) +} + + +/// A normalizer for addresses. +/// +/// Address normalization is the process of taking virtual absolute +/// addresses as they are seen by, say, a process (which include +/// relocation and process specific layout randomizations, among other +/// things) and converting them to "normalized" virtual addresses as +/// they are present in, say, an ELF binary or a DWARF debug info file, +/// and one would be able to see them using tools such as readelf(1). +#[derive(Debug, Default)] +pub struct Normalizer { + _private: (), +} + +impl Normalizer { + /// Create a new `Normalizer`. + pub fn new() -> Self { + Self { _private: () } + } + + /// Normalize all `addrs` in a given process. The `addrs` array has to + /// be sorted in ascending order or an error will be returned. + /// + /// Unknown addresses are not normalized. They are reported as + /// [`Unknown`] meta entries in the returned [`NormalizedUserAddrs`] + /// object. The cause of an address to be unknown (and, hence, not + /// normalized), could have a few reasons, including, but not limited + /// to: + /// - user error (if a bogus address was provided) + /// - they belonged to an ELF object that has been unmapped since the + /// address was captured + /// + /// The process' ID should be provided in `pid`. To normalize addresses of the + /// calling processes, `0` can be provided as a sentinel for the current + /// process' ID. + /// + /// Normalized addresses are reported in the exact same order in which the + /// non-normalized ones were provided. + fn normalize_user_addrs_sorted_impl(&self, addrs: A, pid: Pid) -> Result + where + A: ExactSizeIterator + Clone, + { + let entries = maps::parse(pid)?; + let handler = NormalizationHandler::new(addrs.len(), &read_build_id); + let handler = normalize_sorted_user_addrs_with_entries(addrs, entries, handler)?; + Ok(handler.normalized) + } + + /// Normalize `addresses` belonging to a process. + /// + /// Normalize all `addrs` in a given process. The `addrs` array has to + /// be sorted in ascending order or an error will be returned. + /// + /// Unknown addresses are not normalized. They are reported as + /// [`Unknown`] meta entries in the returned [`NormalizedUserAddrs`] + /// object. The cause of an address to be unknown (and, hence, not + /// normalized), could have a few reasons, including, but not limited + /// to: + /// - user error (if a bogus address was provided) + /// - they belonged to an ELF object that has been unmapped since the + /// address was captured + /// + /// The process' ID should be provided in `pid`. To normalize addresses of the + /// calling processes, `0` can be provided as a sentinel for the current + /// process' ID. + /// + /// Normalized addresses are reported in the exact same order in which the + /// non-normalized ones were provided. + pub fn normalize_user_addrs_sorted( + &self, + addrs: &[Addr], + pid: Pid, + ) -> Result { + self.normalize_user_addrs_sorted_impl(addrs.iter().copied(), pid) + } + + + /// Normalize `addresses` belonging to a process. + /// + /// Normalize all `addrs` in a given process. Contrary to + /// [`Normalizer::normalize_user_addrs_sorted`], the provided + /// `addrs` array does not have to be sorted, but otherwise the + /// functions behave identically. + pub fn normalize_user_addrs(&self, addrs: &[Addr], pid: Pid) -> Result { + util::with_ordered_elems( + addrs, + |normalized: &mut NormalizedUserAddrs| normalized.addrs.as_mut_slice(), + |sorted_addrs| self.normalize_user_addrs_sorted_impl(sorted_addrs, pid), + ) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use std::mem::transmute; + + use crate::inspect::FindAddrOpts; + use crate::inspect::SymType; + use crate::mmap::Mmap; + + + /// Check that we can read a binary's build ID. + #[test] + fn build_id_reading() { + let elf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("libtest-so.so"); + + let build_id = read_build_id(&elf).unwrap().unwrap(); + // The file contains a sha1 build ID, which is always 40 hex digits. + assert_eq!(build_id.len(), 20, "'{build_id:?}'"); + + // The shared object is explicitly built without build ID. + let elf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-no-debug.bin"); + let build_id = read_build_id(&elf).unwrap(); + assert_eq!(build_id, None); + } + + /// Check that we detect unsorted input addresses. + #[test] + fn user_address_normalization_unsorted() { + let mut addrs = [ + libc::__errno_location as Addr, + libc::dlopen as Addr, + libc::fopen as Addr, + ]; + let () = addrs.sort(); + let () = addrs.swap(0, 1); + + let normalizer = Normalizer::new(); + let err = normalizer + .normalize_user_addrs_sorted(addrs.as_slice(), Pid::Slf) + .unwrap_err(); + assert!(err.to_string().contains("are not sorted"), "{err}"); + } + + /// Check that we handle unknown addresses as expected. + #[test] + fn user_address_normalization_unknown() { + // The very first page of the address space should never be + // mapped, so use addresses from there. + let addrs = [0x500 as Addr, 0x600 as Addr]; + + let normalizer = Normalizer::new(); + let norm_addrs = normalizer + .normalize_user_addrs_sorted(addrs.as_slice(), Pid::Slf) + .unwrap(); + assert_eq!(norm_addrs.addrs.len(), 2); + assert_eq!(norm_addrs.meta.len(), 1); + assert_eq!(norm_addrs.meta[0], Unknown::default().into()); + assert_eq!(norm_addrs.addrs[0].1, 0); + assert_eq!(norm_addrs.addrs[1].1, 0); + } + + /// Check that we can normalize user addresses. + #[test] + fn user_address_normalization() { + let addrs = [ + libc::__errno_location as Addr, + libc::dlopen as Addr, + libc::fopen as Addr, + build_id_reading as Addr, + user_address_normalization as Addr, + Mmap::map as Addr, + ]; + + let (errno_idx, _) = addrs + .iter() + .enumerate() + .find(|(_idx, addr)| **addr == libc::__errno_location as Addr) + .unwrap(); + + let normalizer = Normalizer::new(); + let norm_addrs = normalizer + .normalize_user_addrs(addrs.as_slice(), Pid::Slf) + .unwrap(); + assert_eq!(norm_addrs.addrs.len(), 6); + + let addrs = &norm_addrs.addrs; + let meta = &norm_addrs.meta; + assert_eq!(meta.len(), 2); + + let errno_meta_idx = addrs[errno_idx].1; + assert!(meta[errno_meta_idx] + .binary() + .unwrap() + .path + .file_name() + .unwrap() + .to_string_lossy() + .contains("libc.so")); + } + + /// Check that we can normalize user addresses in our own shared object. + #[test] + fn user_address_normalization_custom_so() { + let test_so = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("libtest-so.so"); + + let mmap = Mmap::builder().exec().open(test_so).unwrap(); + // Look up the address of the `the_answer` function inside of the shared + // object. + let elf_parser = ElfParser::from_mmap(mmap.clone()); + let opts = FindAddrOpts { + sym_type: SymType::Function, + ..Default::default() + }; + let symbols = elf_parser.find_addr("the_answer", &opts).unwrap(); + // There is only one symbol with this address in there. + assert_eq!(symbols.len(), 1); + let symbol = symbols.first().unwrap(); + + let the_answer_addr = unsafe { mmap.as_ptr().add(symbol.addr) }; + // Now just double check that everything worked out and the function + // is actually where it was meant to be. + let the_answer_fn = + unsafe { transmute::<_, extern "C" fn() -> libc::c_int>(the_answer_addr) }; + let answer = the_answer_fn(); + assert_eq!(answer, 42); + + let normalizer = Normalizer::new(); + let norm_addrs = normalizer + .normalize_user_addrs_sorted([the_answer_addr as Addr].as_slice(), Pid::Slf) + .unwrap(); + assert_eq!(norm_addrs.addrs.len(), 1); + assert_eq!(norm_addrs.meta.len(), 1); + + let norm_addr = norm_addrs.addrs[0]; + assert_eq!(norm_addr.0, symbol.addr); + let meta = &norm_addrs.meta[norm_addr.1]; + let so_path = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("libtest-so.so"); + let expected_binary = Binary { + build_id: Some(read_build_id(&so_path).unwrap().unwrap()), + path: so_path, + _non_exhaustive: (), + }; + assert_eq!(meta, &UserAddrMeta::Binary(expected_binary)); + } + + /// Check that we correctly handle normalization of an address not + /// in any executable segment. + #[test] + fn user_address_normalization_static_maps() { + fn read_no_build_id(_path: &Path) -> Result>> { + Ok(None) + } + + fn test(unknown_addr: Addr) { + let maps = r#" +55d3195b7000-55d3195b9000 r--p 00000000 00:12 2015701 /bin/cat +55d3195b9000-55d3195be000 r-xp 00002000 00:12 2015701 /bin/cat +55d3195be000-55d3195c1000 r--p 00007000 00:12 2015701 /bin/cat +55d3195c1000-55d3195c2000 r--p 00009000 00:12 2015701 /bin/cat +55d3195c2000-55d3195c3000 rw-p 0000a000 00:12 2015701 /bin/cat +55d31b4dc000-55d31b4fd000 rw-p 00000000 00:00 0 [heap] +7fd5b9c3d000-7fd5b9c5f000 rw-p 00000000 00:00 0 +7fd5b9c5f000-7fd5ba034000 r--p 00000000 00:12 7689533 /usr/lib/locale/locale-archive +7fd5ba034000-7fd5ba037000 rw-p 00000000 00:00 0 +7fd5ba037000-7fd5ba059000 r--p 00000000 00:12 2088876 /lib64/libc.so.6 +7fd5ba059000-7fd5ba1a8000 r-xp 00022000 00:12 2088876 /lib64/libc.so.6 +7fd5ba1a8000-7fd5ba1fa000 r--p 00171000 00:12 2088876 /lib64/libc.so.6 +7fd5ba1fa000-7fd5ba1fe000 r--p 001c3000 00:12 2088876 /lib64/libc.so.6 +7fd5ba1fe000-7fd5ba200000 rw-p 001c7000 00:12 2088876 /lib64/libc.so.6 +7fd5ba200000-7fd5ba208000 rw-p 00000000 00:00 0 +7fd5ba214000-7fd5ba216000 rw-p 00000000 00:00 0 +7fd5ba216000-7fd5ba217000 r--p 00000000 00:12 2088889 /lib64/ld-linux-x86-64.so.2 +7fd5ba217000-7fd5ba23c000 r-xp 00001000 00:12 2088889 /lib64/ld-linux-x86-64.so.2 +7fd5ba23c000-7fd5ba246000 r--p 00026000 00:12 2088889 /lib64/ld-linux-x86-64.so.2 +7fd5ba246000-7fd5ba248000 r--p 00030000 00:12 2088889 /lib64/ld-linux-x86-64.so.2 +7fd5ba248000-7fd5ba24a000 rw-p 00032000 00:12 2088889 /lib64/ld-linux-x86-64.so.2 +7ffe102a2000-7ffe102c4000 rw-p 00000000 00:00 0 [stack] +7ffe103f6000-7ffe103fa000 r--p 00000000 00:00 0 [vvar] +7ffe103fa000-7ffe103fc000 r-xp 00000000 00:00 0 [vdso] +"#; + + let pid = Pid::Slf; + let entries = maps::parse_file(maps.as_bytes(), pid); + let addrs = [unknown_addr as Addr]; + + let handler = NormalizationHandler::new(addrs.len(), &read_no_build_id); + let norm_addrs = normalize_sorted_user_addrs_with_entries( + addrs.as_slice().iter().copied(), + entries, + handler, + ) + .unwrap() + .normalized; + assert_eq!(norm_addrs.addrs.len(), 1); + assert_eq!(norm_addrs.meta.len(), 1); + assert_eq!(norm_addrs.meta[0], Unknown::default().into()); + } + + test(0x0); + test(0x1); + test(0x1000); + test(0xa0000); + test(0x7fd5ba1fe000); + test(0x7fffffff0000); + test(0x7fffffff1000); + test(0x7fffffff1001); + test(0x7fffffffffff); + } +} diff --git a/blazesym/src/resolver.rs b/blazesym/src/resolver.rs new file mode 100644 index 0000000..081dadd --- /dev/null +++ b/blazesym/src/resolver.rs @@ -0,0 +1,30 @@ +use std::fmt::Debug; +use std::path::Path; + +use crate::inspect::FindAddrOpts; +use crate::inspect::SymInfo; +use crate::symbolize::AddrLineInfo; +use crate::Addr; + + +/// The trait of symbol resolvers. +/// +/// An symbol resolver usually provides information from one symbol +/// source; e.g., a symbol file. +pub(crate) trait SymResolver +where + Self: Debug, +{ + /// Find the names and the start addresses of a symbol found for + /// the given address. + fn find_symbols(&self, addr: Addr) -> Vec<(&str, Addr)>; + /// Find the address and size of a symbol name. + fn find_addr(&self, name: &str, opts: &FindAddrOpts) -> Option>; + /// Find the file name and the line number of an address. + fn find_line_info(&self, addr: Addr) -> Option; + /// Translate an address (virtual) in a process to the file offset + /// in the object file. + fn addr_file_off(&self, addr: Addr) -> Option; + /// Get the file name of the shared object. + fn get_obj_file_name(&self) -> &Path; +} diff --git a/blazesym/src/symbolize/mod.rs b/blazesym/src/symbolize/mod.rs new file mode 100644 index 0000000..c594a53 --- /dev/null +++ b/blazesym/src/symbolize/mod.rs @@ -0,0 +1,65 @@ +//! Functionality for symbolizing addresses. +//! +//! This module contains functionality for symbolizing addresses, i.e., finding +//! symbol names and other information based on "raw" addresses. +//! +//! Here an example illustrating usage of the symbolization functionality: +//! ```no_run +//! use blazesym::Addr; +//! use blazesym::symbolize::Symbolizer; +//! use blazesym::symbolize::Source; +//! use blazesym::symbolize::Process; +//! use blazesym::symbolize::SymbolizedResult; +//! +//! let process_id: u32 = std::process::id(); // +//! // Load all symbols of loaded files of the given process. +//! let src = Source::Process(Process::new(process_id.into())); +//! let symbolizer = Symbolizer::new(); +//! +//! let stack: [Addr; 2] = [0xff023, 0x17ff93b]; // Addresses of instructions +//! let symlist = symbolizer.symbolize(&src, // Pass this configuration every time +//! &stack).unwrap(); +//! for i in 0..stack.len() { +//! let addr = stack[i]; +//! +//! if symlist.len() <= i || symlist[i].len() == 0 { // Unknown address +//! println!("0x{addr:016x}"); +//! continue; +//! } +//! +//! let sym_results = &symlist[i]; +//! if sym_results.len() > 1 { +//! // One address may get several results. +//! println!("0x{addr:016x} ({} entries)", sym_results.len()); +//! +//! for result in sym_results { +//! let SymbolizedResult {symbol, addr, path, line, column} = result; +//! println!(" {symbol}@0x{addr:016x} {}:{line}", path.display()); +//! } +//! } else { +//! let SymbolizedResult {symbol, addr, path, line, column} = &sym_results[0]; +//! println!("0x{addr:016x} {symbol}@0x{addr:016x} {}:{line}", path.display()); +//! } +//! } +//! ``` + +mod source; +mod symbolizer; + +use std::path::PathBuf; + +pub use source::Elf; +pub use source::Gsym; +pub use source::Kernel; +pub use source::Process; +pub use source::Source; +pub use symbolizer::Builder; +pub use symbolizer::SymbolizedResult; +pub use symbolizer::Symbolizer; + + +pub(crate) struct AddrLineInfo { + pub path: PathBuf, + pub line: usize, + pub column: usize, +} diff --git a/blazesym/src/symbolize/source.rs b/blazesym/src/symbolize/source.rs new file mode 100644 index 0000000..8bcbbac --- /dev/null +++ b/blazesym/src/symbolize/source.rs @@ -0,0 +1,143 @@ +use std::path::PathBuf; + +use crate::Pid; + +#[cfg(doc)] +use super::Symbolizer; + + +/// A single ELF file. +#[derive(Clone, Debug)] +pub struct Elf { + /// The name of ELF file. + /// + /// It can be an executable or shared object. + /// For example, passing `"/bin/sh"` will load symbols and debug information from `sh`. + /// Whereas passing `"/lib/libc.so.xxx"` will load symbols and debug information from the libc. + pub path: PathBuf, + /// The struct is non-exhaustive and open to extension. + #[doc(hidden)] + pub(crate) _non_exhaustive: (), +} + +impl Elf { + /// Create a new [`Elf`] object, referencing the provided path. + pub fn new(path: impl Into) -> Self { + Self { + path: path.into(), + _non_exhaustive: (), + } + } +} + +impl From for Source { + fn from(elf: Elf) -> Self { + Source::Elf(elf) + } +} + + +/// Linux Kernel's binary image and a copy of /proc/kallsyms +#[derive(Clone, Debug, Default, PartialEq)] +pub struct Kernel { + /// The path of a kallsyms copy. + /// + /// For the running kernel on the device, it can be + /// "/proc/kallsyms". However, you can make a copy for later. + /// In that situation, you should give the path of the + /// copy. Passing `None`, by default, will be + /// `"/proc/kallsyms"`. + pub kallsyms: Option, + /// The path of a kernel image. + /// + /// This should be the path of a kernel image. For example, + /// `"/boot/vmlinux-xxxx"`. A `None` value will find the + /// kernel image of the running kernel in `"/boot/"` or + /// `"/usr/lib/debug/boot/"`. + pub kernel_image: Option, + /// The struct is non-exhaustive and open to extension. + #[doc(hidden)] + pub(crate) _non_exhaustive: (), +} + +impl From for Source { + fn from(kernel: Kernel) -> Self { + Source::Kernel(kernel) + } +} + + +/// Configuration for process based address symbolization. +/// +/// The corresponding addresses supplied to [`Symbolizer::symbolize`] are +/// expected to be absolute addresses as valid within the process identified +/// by the [`pid`][Process::pid] member. +#[derive(Clone, Debug)] +pub struct Process { + /// The referenced process' ID. + pub pid: Pid, + /// The struct is non-exhaustive and open to extension. + #[doc(hidden)] + pub(crate) _non_exhaustive: (), +} + +impl Process { + /// Create a new [`Process`] object using the provided `pid`. + pub fn new(pid: Pid) -> Self { + Self { + pid, + _non_exhaustive: (), + } + } +} + +impl From for Source { + fn from(process: Process) -> Self { + Source::Process(process) + } +} + + +/// A gsym file. +#[derive(Clone, Debug)] +pub struct Gsym { + /// The path to the gsym file. + pub path: PathBuf, + /// The struct is non-exhaustive and open to extension. + #[doc(hidden)] + pub(crate) _non_exhaustive: (), +} + +impl Gsym { + /// Create a new [`Gsym`] object, referencing the provided path. + pub fn new(path: impl Into) -> Self { + Self { + path: path.into(), + _non_exhaustive: (), + } + } +} + +impl From for Source { + fn from(gsym: Gsym) -> Self { + Source::Gsym(gsym) + } +} + + +/// The description of a source of symbols and debug information. +/// +/// The source of symbols and debug information can be an ELF file, kernel +/// image, or process. +#[derive(Clone, Debug)] +#[non_exhaustive] +pub enum Source { + /// A single ELF file + Elf(Elf), + /// Information about the Linux kernel. + Kernel(Kernel), + /// Information about a process. + Process(Process), + /// A gsym file. + Gsym(Gsym), +} diff --git a/blazesym/src/symbolize/symbolizer.rs b/blazesym/src/symbolize/symbolizer.rs new file mode 100644 index 0000000..f847ee7 --- /dev/null +++ b/blazesym/src/symbolize/symbolizer.rs @@ -0,0 +1,354 @@ +use std::fmt::Debug; +use std::io::Result; +use std::path::Path; +use std::path::PathBuf; + +use crate::elf::ElfCache; +use crate::elf::ElfResolver; +use crate::gsym::GsymResolver; +use crate::kernel::KernelResolver; +use crate::ksym::KSymCache; +use crate::ksym::KALLSYMS; +use crate::log; +use crate::maps; +use crate::maps::PathMapsEntry; +use crate::normalize; +use crate::normalize::normalize_elf_addr; +use crate::normalize::normalize_sorted_user_addrs_with_entries; +use crate::util; +use crate::util::uname_release; +use crate::Addr; +use crate::Pid; +use crate::SymResolver; + +use super::source::Elf; +use super::source::Gsym; +use super::source::Kernel; +use super::source::Process; +use super::source::Source; + + +/// The result of symbolization by Symbolizer. +/// +/// [`Symbolizer::symbolize()`] returns a list of lists of +/// `SymbolizedResult`. It appears as `[[SymbolizedResult {...}, +/// SymbolizedResult {...}, ...], [SymbolizedResult {...}, ...], +/// ...]`. At the first level, each entry is a list of +/// `SymbolizedResult`. [`Symbolizer::symbolize()`] can return +/// multiple results of an address due to compiler optimizations. +#[derive(Clone, Debug)] +pub struct SymbolizedResult { + /// The symbol name that an address may belong to. + pub symbol: String, + /// The address where the symbol is located within the process. + /// + /// The address is in the target process, not the offset from the + /// shared object file. + pub addr: Addr, + /// The source path that defines the symbol. + pub path: PathBuf, + /// The line number of the symbolized instruction in the source code. + /// + /// This is the line number of the instruction of the address being + /// symbolized, not the line number that defines the symbol + /// (function). + pub line: usize, + pub column: usize, +} + + +/// A builder for configurable construction of [`Symbolizer`] objects. +/// +/// By default all features are enabled. +#[derive(Clone, Debug)] +pub struct Builder { + /// Whether to enable usage of debug symbols. + debug_syms: bool, + /// Whether to attempt to gather source code location information. + /// + /// This setting implies usage of debug symbols and forces the corresponding + /// flag to `true`. + src_location: bool, +} + +impl Builder { + /// Enable/disable line number information. + pub fn enable_src_location(mut self, enable: bool) -> Builder { + self.src_location = enable; + self + } + + /// Enable/disable usage of debug symbols. + /// + /// That can be useful in cases where ELF symbol information is stripped. + pub fn enable_debug_syms(mut self, enable: bool) -> Builder { + self.debug_syms = enable; + self + } + + /// Create the [`Symbolizer`] object. + pub fn build(self) -> Symbolizer { + let Builder { + debug_syms, + src_location, + } = self; + let ksym_cache = KSymCache::new(); + let elf_cache = ElfCache::new(src_location, debug_syms); + + Symbolizer { + ksym_cache, + elf_cache, + src_location, + } + } +} + +impl Default for Builder { + fn default() -> Self { + Self { + src_location: true, + debug_syms: true, + } + } +} + + +/// Symbolizer provides an interface to symbolize addresses. +#[derive(Debug)] +pub struct Symbolizer { + ksym_cache: KSymCache, + elf_cache: ElfCache, + src_location: bool, +} + +impl Symbolizer { + /// Create a new [`Symbolizer`]. + pub fn new() -> Self { + Builder::default().build() + } + + /// Retrieve a [`Builder`] object for configurable construction of a + /// [`Symbolizer`]. + pub fn builder() -> Builder { + Builder::default() + } + + /// Symbolize an address using the provided [`SymResolver`]. + fn symbolize_with_resolver( + &self, + addr: Addr, + resolver: &dyn SymResolver, + ) -> Vec { + let res_syms = resolver.find_symbols(addr); + let linfo = if self.src_location { + resolver.find_line_info(addr) + } else { + None + }; + if res_syms.is_empty() { + if let Some(linfo) = linfo { + vec![SymbolizedResult { + symbol: "".to_string(), + addr: 0, + path: linfo.path, + line: linfo.line, + column: linfo.column, + }] + } else { + vec![] + } + } else { + let mut results = vec![]; + for sym in res_syms { + if let Some(ref linfo) = linfo { + let (sym, start) = sym; + results.push(SymbolizedResult { + symbol: String::from(sym), + addr: start, + path: linfo.path.clone(), + line: linfo.line, + column: linfo.column, + }); + } else { + let (sym, start) = sym; + results.push(SymbolizedResult { + symbol: String::from(sym), + addr: start, + path: PathBuf::new(), + line: 0, + column: 0, + }); + } + } + results + } + } + + /// Symbolize a list of addresses using the provided [`SymResolver`]. + fn symbolize_addrs( + &self, + addrs: &[Addr], + resolver: &dyn SymResolver, + ) -> Vec> { + addrs + .iter() + .map(|addr| self.symbolize_with_resolver(*addr, resolver)) + .collect() + } + + fn resolve_addr_in_binary(&self, addr: Addr, path: &Path) -> Result> { + let backend = self.elf_cache.find(path)?; + let resolver = ElfResolver::with_backend(path, backend)?; + let symbols = self.symbolize_with_resolver(addr, &resolver); + Ok(symbols) + } + + /// Symbolize the given list of user space addresses in the provided + /// process. + fn symbolize_user_addrs(&self, addrs: &[Addr], pid: Pid) -> Result>> { + struct SymbolizeHandler<'sym> { + /// The "outer" `Symbolizer` instance. + symbolizer: &'sym Symbolizer, + /// Symbols representing the symbolized addresses. + all_symbols: Vec>, + } + + impl normalize::Handler for SymbolizeHandler<'_> { + fn handle_unknown_addr(&mut self, _addr: Addr) -> Result<()> { + let () = self.all_symbols.push(Vec::new()); + Ok(()) + } + + fn handle_entry_addr(&mut self, addr: Addr, entry: &PathMapsEntry) -> Result<()> { + let path = &entry.path.maps_file; + let norm_addr = normalize_elf_addr(addr, entry)?; + let symbols = self.symbolizer.resolve_addr_in_binary(norm_addr, path)?; + let () = self.all_symbols.push(symbols); + Ok(()) + } + } + + let entries = maps::parse(pid)?; + let handler = SymbolizeHandler { + symbolizer: self, + all_symbols: Vec::with_capacity(addrs.len()), + }; + + let handler = util::with_ordered_elems( + addrs, + |handler: &mut SymbolizeHandler<'_>| handler.all_symbols.as_mut_slice(), + |sorted_addrs| normalize_sorted_user_addrs_with_entries(sorted_addrs, entries, handler), + )?; + Ok(handler.all_symbols) + } + + fn symbolize_kernel_addrs( + &self, + addrs: &[Addr], + src: &Kernel, + ) -> Result>> { + let Kernel { + kallsyms, + kernel_image, + _non_exhaustive: (), + } = src; + + let ksym_resolver = if let Some(kallsyms) = kallsyms { + let ksym_resolver = self.ksym_cache.get_resolver(kallsyms)?; + Some(ksym_resolver) + } else { + let kallsyms = Path::new(KALLSYMS); + let result = self.ksym_cache.get_resolver(kallsyms); + match result { + Ok(resolver) => Some(resolver), + Err(err) => { + log::warn!( + "failed to load kallsyms from {}: {err}; ignoring...", + kallsyms.display() + ); + None + } + } + }; + + let elf_resolver = if let Some(image) = kernel_image { + let backend = self.elf_cache.find(image)?; + let elf_resolver = ElfResolver::with_backend(image, backend)?; + Some(elf_resolver) + } else { + let release = uname_release()?.to_str().unwrap().to_string(); + let basename = "vmlinux-"; + let dirs = [Path::new("/boot/"), Path::new("/usr/lib/debug/boot/")]; + let kernel_image = dirs.iter().find_map(|dir| { + let path = dir.join(format!("{basename}{release}")); + path.exists().then_some(path) + }); + + if let Some(image) = kernel_image { + let result = self.elf_cache.find(&image); + match result { + Ok(backend) => { + let result = ElfResolver::with_backend(&image, backend); + match result { + Ok(resolver) => Some(resolver), + Err(err) => { + log::warn!("failed to create ELF resolver for kernel image {}: {err}; ignoring...", image.display()); + None + } + } + } + Err(err) => { + log::warn!( + "failed to load kernel image {}: {err}; ignoring...", + image.display() + ); + None + } + } + } else { + None + } + }; + + let resolver = KernelResolver::new(ksym_resolver, elf_resolver)?; + let symbols = self.symbolize_addrs(addrs, &resolver); + Ok(symbols) + } + + /// Symbolize a list of addresses. + /// + /// Symbolize a list of addresses according to the configuration + /// provided via `src`. + pub fn symbolize(&self, src: &Source, addrs: &[Addr]) -> Result>> { + match src { + Source::Elf(Elf { + path, + _non_exhaustive: (), + }) => { + let backend = self.elf_cache.find(path)?; + let resolver = ElfResolver::with_backend(path, backend)?; + let symbols = self.symbolize_addrs(addrs, &resolver); + Ok(symbols) + } + Source::Kernel(kernel) => self.symbolize_kernel_addrs(addrs, kernel), + Source::Process(Process { + pid, + _non_exhaustive: (), + }) => self.symbolize_user_addrs(addrs, *pid), + Source::Gsym(Gsym { + path, + _non_exhaustive: (), + }) => { + let resolver = GsymResolver::new(path.clone())?; + let symbols = self.symbolize_addrs(addrs, &resolver); + Ok(symbols) + } + } + } +} + +impl Default for Symbolizer { + fn default() -> Self { + Self::new() + } +} diff --git a/blazesym/src/util.rs b/blazesym/src/util.rs new file mode 100644 index 0000000..d6f1381 --- /dev/null +++ b/blazesym/src/util.rs @@ -0,0 +1,710 @@ +use std::ffi::CStr; +use std::ffi::CString; +use std::io::Error; +use std::io::Result; +use std::iter; +use std::mem::align_of; +use std::mem::size_of; +use std::mem::MaybeUninit; +use std::os::unix::io::RawFd; +use std::ptr::NonNull; +use std::slice; + + +/// Reorder elements of `array` based on index information in `indices`. +fn reorder(array: &mut [T], indices: Vec<(U, usize)>) { + debug_assert_eq!(array.len(), indices.len()); + + let mut indices = indices; + // Sort the entries in `array` based on the indexes in `indices` + // (second member). + for i in 0..array.len() { + while indices[i].1 != i { + let () = array.swap(i, indices[i].1); + let idx = indices[i].1; + let () = indices.swap(i, idx); + } + } +} + + +/// Take a slice `slice` of unordered elements, sort them into a vector, then +/// invoke a function `handle` on the vector, take the result of this function +/// and "extract" a mutable reference to a slice, reordered this slice in such a +/// way that the original order of `slice` is preserved. +pub(crate) fn with_ordered_elems(slice: &[T], extract: E, handle: H) -> Result +where + T: Copy + Ord, + E: FnOnce(&mut R) -> &mut [U], + H: FnOnce(iter::Map, fn(&(T, usize)) -> T>) -> Result, +{ + let mut vec = slice + .iter() + .enumerate() + .map(|(idx, t)| (*t, idx)) + .collect::>(); + let () = vec.sort_unstable(); + + let mut result = handle(vec.iter().map(|(t, _idx)| *t))?; + let () = reorder(extract(&mut result), vec); + Ok(result) +} + + +/// "Safely" create a slice from a user provided array. +pub(crate) unsafe fn slice_from_user_array<'t, T>(items: *const T, num_items: usize) -> &'t [T] { + let items = if items.is_null() { + // `slice::from_raw_parts` requires a properly aligned non-NULL pointer. + // Craft one. + NonNull::dangling().as_ptr() + } else { + items + }; + unsafe { slice::from_raw_parts(items, num_items) } +} + +pub(crate) fn fstat(fd: RawFd) -> Result { + let mut dst = MaybeUninit::uninit(); + let rc = unsafe { libc::fstat(fd, dst.as_mut_ptr()) }; + if rc < 0 { + return Err(Error::last_os_error()) + } + + // SAFETY: The object is initialized on success of `fstat`. + Ok(unsafe { dst.assume_init() }) +} + +pub(crate) fn uname_release() -> Result { + let mut dst = MaybeUninit::uninit(); + let rc = unsafe { libc::uname(dst.as_mut_ptr()) }; + if rc < 0 { + return Err(Error::last_os_error()) + } + + // SAFETY: The object is initialized on success of `uname`. + let uname = unsafe { dst.assume_init() }; + // SAFETY: `uname` ensures a NUL terminated string in `uname.release` on + // success. + let release = unsafe { CStr::from_ptr(uname.release.as_ptr()) }.to_owned(); + Ok(release) +} + +/// See `find_match_or_lower_bound`, but allow the user to pass in a comparison +/// function for increased flexibility. +pub(crate) fn find_match_or_lower_bound_by(slice: &[T], item: U, mut f: F) -> Option +where + U: Ord, + F: FnMut(&T) -> U, +{ + let idx = slice.partition_point(|e| f(e) < item); + + // At this point `idx` references the first item greater or equal to the one + // we are looking for. + + if let Some(e) = slice.get(idx) { + // If the item at `idx` is equal to what we were looking for, we are + // trivially done, as it's guaranteed to be the first one to match. + if f(e) == item { + return Some(idx) + } + } + + // Otherwise `idx` points to a "greater" item. Hence, we pick the previous + // one, but then have to scan backwards for as long as we see this one item, + // so that we end up reporting the index of the first of all equal ones. + let idx = idx.checked_sub(1)?; + let cmp_e = f(slice.get(idx)?); + + for i in (0..idx).rev() { + let e = slice.get(i)?; + if f(e) != cmp_e { + return Some(i + 1) + } + } + Some(idx) +} + +/// Perform a binary search on a slice, returning the index of the match (if +/// found) or the one of the previous item (if any), taking into account +/// duplicates. +/// +/// This functionality is useful for cases where we compare elements with a +/// size, such as ranges, and an address to search for can be covered by a range +/// whose start is before the item to search for. +pub(crate) fn find_match_or_lower_bound(slice: &[T], item: T) -> Option +where + T: Copy + Ord, +{ + find_match_or_lower_bound_by(slice, item, |e| *e) +} + + +/// Do binary search but skip entries not having a key. +pub fn search_address_opt_key( + data: &[T], + address: V, + keyfn: &dyn Fn(&T) -> Option, +) -> Option { + let mut left = 0; + let mut right = data.len(); + + while left < right { + let left_key = keyfn(&data[left]); + if left_key.is_some() { + break + } + left += 1; + } + + if left == right { + return None + } + + if address < keyfn(&data[left]).unwrap() { + return None + } + + while (left + 1) < right { + let mut v = (left + right) / 2; + + let v_saved = v; + // Skip entries not having a key + while v < right { + let key = keyfn(&data[v]); + if key.is_some() { + break + } + v += 1; + } + // All entries at the right side haven't keys. + // Shrink to the left side. + if v == right { + right = v_saved; + continue + } + + let key = keyfn(&data[v]).unwrap(); + + if key == address { + return Some(v) + } + if address < key { + right = v; + } else { + left = v; + } + } + + Some(left) +} + + +#[inline] +pub fn decode_leb128_128(mut data: &[u8]) -> Option<(u128, u8)> { + data.read_u128_leb128() +} + +#[inline] +pub fn decode_leb128(mut data: &[u8]) -> Option<(u64, u8)> { + data.read_u128_leb128().map(|(v, s)| (v as u64, s)) +} + +#[inline] +pub fn decode_leb128_s(mut data: &[u8]) -> Option<(i64, u8)> { + data.read_i128_leb128().map(|(v, s)| (v as i64, s)) +} + +#[inline] +pub fn decode_uhalf(mut data: &[u8]) -> u16 { + // TODO: Need to handle errors more gracefully. + data.read_u16().unwrap() +} + +#[inline] +pub fn decode_uword(mut data: &[u8]) -> u32 { + // TODO: Need to handle errors more gracefully. + data.read_u32().unwrap() +} + +#[inline] +pub fn decode_udword(mut data: &[u8]) -> u64 { + // TODO: Need to handle errors more gracefully. + data.read_u64().unwrap() +} + +/// A marker trait for "plain old data" data types. +/// +/// # Safety +/// Only safe to implement for types that are valid for any bit pattern. +pub(crate) unsafe trait Pod {} + +unsafe impl Pod for i8 {} +unsafe impl Pod for u8 {} +unsafe impl Pod for i16 {} +unsafe impl Pod for u16 {} +unsafe impl Pod for i32 {} +unsafe impl Pod for u32 {} +unsafe impl Pod for i64 {} +unsafe impl Pod for u64 {} +unsafe impl Pod for i128 {} +unsafe impl Pod for u128 {} + +/// An trait providing utility functions for reading data from a byte buffer. +pub(crate) trait ReadRaw<'data> { + /// Ensure that `len` bytes are available for consumption. + fn ensure(&self, len: usize) -> Option<()>; + + /// Align the read pointer to the next multiple of `align_to`. + /// + /// # Panics + /// This method may panic if `align_to` is not a power of two. + fn align(&mut self, align_to: usize) -> Option<()>; + + /// Consume and return `len` bytes. + fn read_slice(&mut self, len: usize) -> Option<&'data [u8]>; + + /// Read a NUL terminated string. + fn read_cstr(&mut self) -> Option<&'data CStr>; + + /// Read anything implementing `Pod`. + #[inline] + fn read_pod(&mut self) -> Option + where + T: Pod, + { + let data = self.read_slice(size_of::())?; + // SAFETY: `T` is `Pod` and hence valid for any bit pattern. The pointer + // is guaranteed to be valid and to point to memory of at least + // `sizeof(T)` bytes. + let value = unsafe { data.as_ptr().cast::().read_unaligned() }; + Some(value) + } + + /// Read a reference to something implementing `Pod`. + #[inline] + fn read_pod_ref(&mut self) -> Option<&'data T> + where + T: Pod, + { + let data = self.read_slice(size_of::())?; + let ptr = data.as_ptr(); + + if ptr.align_offset(align_of::()) == 0 { + // SAFETY: `T` is `Pod` and hence valid for any bit pattern. The pointer + // is guaranteed to be valid and to point to memory of at least + // `sizeof(T)` bytes. We know it is properly aligned + // because we checked that. + unsafe { ptr.cast::().as_ref() } + } else { + None + } + } + + /// Read a reference to something implementing `Pod`. + #[inline] + fn read_pod_slice_ref(&mut self, count: usize) -> Option<&'data [T]> + where + T: Pod, + { + let data = self.read_slice(size_of::().checked_mul(count)?)?; + let ptr = data.as_ptr(); + + if ptr.align_offset(align_of::()) == 0 { + // SAFETY: `T` is `Pod` and hence valid for any bit pattern. The pointer + // is guaranteed to be valid and to point to memory of at least + // `sizeof(T)` bytes. We know it is properly aligned + // because we checked that. + Some(unsafe { slice::from_raw_parts(ptr.cast::(), count) }) + } else { + None + } + } + + /// Read a `u8` value. + #[inline] + fn read_u8(&mut self) -> Option { + self.read_pod::() + } + + /// Read a `i16` value. + #[inline] + fn read_i16(&mut self) -> Option { + self.read_pod::() + } + + /// Read a `u16` value. + #[inline] + fn read_u16(&mut self) -> Option { + self.read_pod::() + } + + /// Read a `i32` value. + #[inline] + fn read_i32(&mut self) -> Option { + self.read_pod::() + } + + /// Read a `u32` value. + #[inline] + fn read_u32(&mut self) -> Option { + self.read_pod::() + } + + /// Read a `u64` value. + #[inline] + fn read_u64(&mut self) -> Option { + self.read_pod::() + } + + /// Read a `u128` encoded as unsigned variable length little endian base 128 + /// value. + /// + /// The function returns the value read along with the number of bytes + /// consumed. + fn read_u128_leb128(&mut self) -> Option<(u128, u8)> { + let mut shift = 0; + let mut value = 0u128; + while let Some(bytes) = self.read_slice(1) { + if let [byte] = bytes { + value |= ((byte & 0b0111_1111) as u128) << shift; + shift += 7; + if (byte & 0b1000_0000) == 0 { + return Some((value, shift / 7)) + } + } else { + unreachable!() + } + } + None + } + + /// Read a `u128` encoded as signed variable length little endian base 128 + /// value. + /// + /// The function returns the value read along with the number of bytes + /// consumed. + fn read_i128_leb128(&mut self) -> Option<(i128, u8)> { + let (value, shift) = self.read_u128_leb128()?; + let sign_bits = 128 - shift * 7; + let value = ((value as i128) << sign_bits) >> sign_bits; + Some((value, shift)) + } +} + +impl<'data> ReadRaw<'data> for &'data [u8] { + #[inline] + fn ensure(&self, len: usize) -> Option<()> { + if len > self.len() { + return None + } + Some(()) + } + + #[inline] + fn align(&mut self, align_to: usize) -> Option<()> { + let offset = self.as_ptr().align_offset(align_to); + let _slice = self.read_slice(offset)?; + Some(()) + } + + #[inline] + fn read_slice(&mut self, len: usize) -> Option<&'data [u8]> { + self.ensure(len)?; + let (a, b) = self.split_at(len); + *self = b; + Some(a) + } + + #[inline] + fn read_cstr(&mut self) -> Option<&'data CStr> { + let idx = self.iter().position(|byte| *byte == b'\0')?; + CStr::from_bytes_with_nul(self.read_slice(idx + 1)?).ok() + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use std::cmp::Ordering; + + + /// Check whether an iterator represents a sorted sequence. + // Copy of iterator::is_sorted_by used while it is still unstable. + pub fn is_sorted_by(mut iter: I, compare: F) -> bool + where + I: Iterator, + F: FnMut(&I::Item, &I::Item) -> Option, + { + #[inline] + fn check<'a, T>( + last: &'a mut T, + mut compare: impl FnMut(&T, &T) -> Option + 'a, + ) -> impl FnMut(T) -> bool + 'a { + move |curr| { + if let Some(Ordering::Greater) | None = compare(last, &curr) { + return false + } + *last = curr; + true + } + } + + let mut last = match iter.next() { + Some(e) => e, + None => return true, + }; + + iter.all(check(&mut last, compare)) + } + + /// Check whether an iterator represents a sorted sequence. + #[inline] + fn is_sorted(iter: I) -> bool + where + I: Iterator, + I::Item: PartialOrd, + { + is_sorted_by(iter, PartialOrd::partial_cmp) + } + + + /// Make sure that we can detect sorted slices. + #[test] + fn sorted_check() { + assert!(is_sorted([1, 5, 6].iter())); + assert!(!is_sorted([1, 5, 6, 0].iter())); + } + + /// Check that we can reorder elements in an array as expected. + #[test] + fn array_reordering() { + let mut array = vec![]; + reorder::(&mut array, vec![]); + + let mut array = vec![8]; + reorder(&mut array, vec![((), 0)]); + assert_eq!(array, vec![8]); + + let mut array = vec![8, 1, 4, 0, 3]; + reorder( + &mut array, + [4, 1, 3, 0, 2].into_iter().map(|x| ((), x)).collect(), + ); + assert_eq!(array, vec![0, 1, 3, 4, 8]); + } + + /// Check that `with_ordered_elems` works as it should. + #[test] + fn with_element_ordering() { + let vec = vec![5u8, 0, 1, 99, 6, 2]; + let result = with_ordered_elems( + &vec, + |x: &mut Vec| x.as_mut_slice(), + |iter| { + let vec = iter.collect::>(); + assert!(is_sorted(vec.iter())); + Ok(vec.into_iter().map(|x| x + 2).collect::>()) + }, + ) + .unwrap(); + assert_eq!(result, vec.into_iter().map(|x| x + 2).collect::>()); + } + + /// Make sure that `[u8]::ensure` works as expected. + #[test] + fn u8_slice_len_ensurance() { + let slice = [0u8; 0].as_slice(); + assert_eq!(slice.ensure(0), Some(())); + assert_eq!(slice.ensure(1), None); + + let slice = [1u8].as_slice(); + assert_eq!(slice.ensure(0), Some(())); + assert_eq!(slice.ensure(1), Some(())); + assert_eq!(slice.ensure(2), None); + } + + /// Check that we can align the read pointer on a `[u8]`. + #[test] + fn u8_slice_align() { + let mut buffer = [0u8; 64]; + let ptr = buffer.as_mut_ptr(); + + // Make sure that we have an aligned pointer to begin with. + let aligned_ptr = match ptr.align_offset(align_of::()) { + offset if offset < size_of::() => unsafe { ptr.add(offset) }, + _ => unreachable!(), + }; + + let aligned = unsafe { slice::from_raw_parts(aligned_ptr, 16) }; + let mut data = aligned; + + let () = data.align(1).unwrap(); + assert_eq!(data.as_ptr(), aligned.as_ptr()); + + let () = data.align(2).unwrap(); + assert_eq!(data.as_ptr(), aligned.as_ptr()); + + let () = data.align(4).unwrap(); + assert_eq!(data.as_ptr(), aligned.as_ptr()); + + let () = data.align(8).unwrap(); + assert_eq!(data.as_ptr(), aligned.as_ptr()); + + // After this read we are unaligned again. + let _byte = data.read_u8(); + + // Nothing should happen when attempting to align to 1 byte + // boundary. + let () = data.align(1).unwrap(); + assert_eq!(data.as_ptr(), unsafe { aligned.as_ptr().add(1) }); + + // But once we align to a four byte boundary we the pointer + // should move. + let () = data.align(4).unwrap(); + assert_eq!(data.as_ptr(), unsafe { aligned.as_ptr().add(4) }); + } + + /// Check that we can read various integers from a slice. + #[test] + fn pod_reading() { + macro_rules! test { + ($type:ty) => {{ + let max = <$type>::MAX.to_ne_bytes(); + let one = (1 as $type).to_ne_bytes(); + + let mut data = Vec::new(); + let () = data.extend_from_slice(&max); + let () = data.extend_from_slice(&one); + let () = data.extend_from_slice(&[1, 2, 3, 4, 5, 6, 7, 8]); + + let mut raw = data.as_slice(); + let uword = raw.read_pod::<$type>().unwrap(); + assert_eq!(uword, <$type>::MAX); + + let uword = raw.read_pod::<$type>().unwrap(); + assert_eq!(uword, 1); + }}; + } + + test!(i8); + test!(u8); + test!(i16); + test!(u16); + test!(i32); + test!(u32); + test!(i64); + test!(u64); + test!(i128); + test!(u128); + } + + /// Check that we can read references to `Pod`s. + #[test] + fn pod_ref_reading() { + // This test assumes that `u64`'s required alignment is greater + // than 1. + assert!(align_of::() > 1, "{}", align_of::()); + + let mut buffer = [0u8; 64]; + let ptr = buffer.as_mut_ptr(); + + let aligned_ptr = match ptr.align_offset(align_of::()) { + offset if offset < size_of::() => unsafe { ptr.add(offset) }, + _ => unreachable!(), + }; + + // Write some data at the aligned location so that we can read + // it back. + let () = unsafe { aligned_ptr.cast::().write(1337) }; + + // We are sure that we have at least space for two `u64` (16 + // bytes) in the buffer, even after alignment. + let mut slice = unsafe { slice::from_raw_parts(aligned_ptr, 16) }; + assert_eq!(slice.read_pod_ref::(), Some(&1337)); + + // Make sure that we fail if there is insufficient space. + let mut slice = unsafe { slice::from_raw_parts(aligned_ptr, 4) }; + assert_eq!(slice.read_pod_ref::(), None); + + // Now also try with an unaligned pointer. It is guaranteed to + // be unaligned if we add a one byte offset. + let mut slice = unsafe { slice::from_raw_parts(aligned_ptr.add(1), 15) }; + assert_eq!(slice.read_pod_ref::(), None); + } + + /// Test reading of signed and unsigned 16 and 32 bit values against known + /// results. + #[test] + fn word_reading() { + let data = 0xf936857fu32.to_ne_bytes(); + assert_eq!(data.as_slice().read_u16().unwrap(), 0x857f); + assert_eq!(data.as_slice().read_i16().unwrap(), -31361); + assert_eq!(data.as_slice().read_u32().unwrap(), 0xf936857f); + assert_eq!(data.as_slice().read_i32().unwrap(), -113867393); + } + + /// Make sure that we can read leb128 encoded values. + #[test] + fn leb128_reading() { + let data = [0xf4, 0xf3, 0x75]; + let (v, s) = data.as_slice().read_u128_leb128().unwrap(); + assert_eq!(v, 0x1d79f4); + assert_eq!(s, 3); + + let (v, s) = data.as_slice().read_i128_leb128().unwrap(); + assert_eq!(v, -165388); + assert_eq!(s, 3); + } + + /// Check that we can read a NUL terminated string from a slice. + #[test] + fn cstr_reading() { + let mut slice = b"abc\x001234".as_slice(); + + let cstr = slice.read_cstr().unwrap(); + assert_eq!(cstr, CStr::from_bytes_with_nul(b"abc\0").unwrap()); + + // No terminating NUL byte. + let mut slice = b"abc".as_slice(); + assert_eq!(slice.read_cstr(), None); + } + + /// Test that we correctly binary search for a lower bound. + #[test] + fn search_lower_bound() { + let data = []; + assert_eq!(find_match_or_lower_bound(&data, &0), None); + + let data = [5]; + assert_eq!(find_match_or_lower_bound(&data, 0), None); + assert_eq!(find_match_or_lower_bound(&data, 1), None); + assert_eq!(find_match_or_lower_bound(&data, 4), None); + assert_eq!(find_match_or_lower_bound(&data, 5), Some(0)); + assert_eq!(find_match_or_lower_bound(&data, 6), Some(0)); + + let data = [5, 5]; + assert_eq!(find_match_or_lower_bound(&data, 5), Some(0)); + + let data = [5, 5, 5]; + assert_eq!(find_match_or_lower_bound(&data, 5), Some(0)); + + let data = [5, 5, 5, 5]; + assert_eq!(find_match_or_lower_bound(&data, 5), Some(0)); + + let data = [4, 5, 5, 5, 5]; + assert_eq!(find_match_or_lower_bound(&data, 5), Some(1)); + + let data = [1, 4, 42, 43, 99]; + assert_eq!(find_match_or_lower_bound(&data, 0), None); + assert_eq!(find_match_or_lower_bound(&data, 1), Some(0)); + assert_eq!(find_match_or_lower_bound(&data, 4), Some(1)); + assert_eq!(find_match_or_lower_bound(&data, 5), Some(1)); + assert_eq!(find_match_or_lower_bound(&data, 41), Some(1)); + assert_eq!(find_match_or_lower_bound(&data, 98), Some(3)); + assert_eq!(find_match_or_lower_bound(&data, 99), Some(4)); + assert_eq!(find_match_or_lower_bound(&data, 100), Some(4)); + assert_eq!(find_match_or_lower_bound(&data, 1337), Some(4)); + } +} diff --git a/blazesym/src/zip.rs b/blazesym/src/zip.rs new file mode 100644 index 0000000..1d6ffca --- /dev/null +++ b/blazesym/src/zip.rs @@ -0,0 +1,470 @@ +/// Specification of ZIP file format can be found here: +/// https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT +/// For a high level overview of the structure of a ZIP file see +/// sections 4.3.1 - 4.3.6. +/// +/// Data structures appearing in ZIP files do not contain any +/// padding and they might be misaligned. To allow us to safely +/// operate on pointers to such structures and their members, we +/// declare the types as packed. +use std::ffi::OsStr; +use std::fs::File; +use std::io::Error; +use std::io::ErrorKind; +use std::io::Result; +use std::mem::size_of; +use std::os::unix::ffi::OsStrExt as _; +use std::path::Path; +use std::rc::Rc; + +use crate::mmap::Mmap; +use crate::util::Pod; +use crate::util::ReadRaw as _; + +const CD_FILE_HEADER_MAGIC: u32 = 0x02014b50; +const END_OF_CD_RECORD_MAGIC: u32 = 0x06054b50; +const LOCAL_FILE_HEADER_MAGIC: u32 = 0x04034b50; +const FLAG_ENCRYPTED: u16 = 1 << 0; +const FLAG_HAS_DATA_DESCRIPTOR: u16 = 1 << 3; + + +/// See section 4.3.16 of the spec. +#[repr(C, packed)] +struct EndOfCdRecord { + /// Magic value equal to END_OF_CD_RECORD_MAGIC. + magic: u32, + /// Number of the file containing this structure or 0xFFFF if ZIP64 archive. + /// Zip archive might span multiple files (disks). + this_disk: u16, + /// Number of the file containing the beginning of the central directory or + /// 0xFFFF if ZIP64 archive. + cd_disk: u16, + /// Number of central directory records on this disk or 0xFFFF if ZIP64 + /// archive. + cd_records: u16, + /// Number of central directory records on all disks or 0xFFFF if ZIP64 + /// archive. + cd_records_total: u16, + /// Size of the central directory record or 0xFFFFFFFF if ZIP64 archive. + cd_size: u32, + /// Offset of the central directory from the beginning of the archive or + /// 0xFFFFFFFF if ZIP64 archive. + cd_offset: u32, + /// Length of comment data following end of central directory record. + comment_length: u16, + // Up to 64k of arbitrary bytes. */ + // uint8_t comment[comment_length] */ +} + +// SAFETY: `EndOfCdRecord` is valid for any bit pattern. +unsafe impl Pod for EndOfCdRecord {} + + +/// See section 4.3.12 of the spec. +#[repr(C, packed)] +struct CdFileHeader { + /// Magic value equal to CD_FILE_HEADER_MAGIC. + magic: u32, + version: u16, + /// Minimum zip version needed to extract the file. + min_version: u16, + flags: u16, + compression: u16, + last_modified_time: u16, + last_modified_date: u16, + crc: u32, + compressed_size: u32, + uncompressed_size: u32, + file_name_length: u16, + extra_field_length: u16, + file_comment_length: u16, + /// Number of the disk where the file starts or 0xFFFF if ZIP64 archive. + disk: u16, + internal_attributes: u16, + external_attributes: u32, + /// Offset from the start of the disk containing the local file header to the + /// start of the local file header. + offset: u32, +} + +// SAFETY: `CdFileHeader` is valid for any bit pattern. +unsafe impl Pod for CdFileHeader {} + + +/// See section 4.3.7 of the spec. +#[repr(C, packed)] +struct LocalFileHeader { + /// Magic value equal to LOCAL_FILE_HEADER_MAGIC. + magic: u32, + /// Minimum zip version needed to extract the file. + min_version: u16, + flags: u16, + compression: u16, + last_modified_time: u16, + last_modified_date: u16, + crc: u32, + compressed_size: u32, + uncompressed_size: u32, + file_name_length: u16, + extra_field_length: u16, +} + +// SAFETY: `LocalFileHeader` is valid for any bit pattern. +unsafe impl Pod for LocalFileHeader {} + + +/// Carries information on path, compression method, and data corresponding to a +/// file in a zip archive. +#[derive(Debug)] +pub struct Entry<'archive> { + /// Compression method as defined in pkzip spec. 0 means data is uncompressed. + pub compression: u16, + /// The path to the file inside the archive. + pub path: &'archive Path, + /// The offset of the data from the beginning of the archive. + pub data_offset: usize, + /// Pointer to the file data. + pub data: &'archive [u8], +} + + +/// An iterator over the entries of an [`Archive`]. +pub struct EntryIter<'archive> { + /// The data of the archive. + archive_data: &'archive [u8], + /// Pointer to the central directory records. + /// + /// This read pointer will be advanced as entries are read. + cd_record_data: &'archive [u8], + /// The number of remaining records. + remaining_records: u16, +} + +impl<'archive> EntryIter<'archive> { + fn parse_entry_at_offset(data: &[u8], offset: u32) -> Result> { + fn entry_impl(data: &[u8], offset: u32) -> Option>> { + let mut data = data.get(offset as usize..)?; + let start = data.as_ptr(); + + let lfh = data.read_pod::()?; + if lfh.magic != LOCAL_FILE_HEADER_MAGIC { + return Some(Err(Error::new( + ErrorKind::InvalidData, + "local file header contains invalid magic number", + ))) + } + + if (lfh.flags & FLAG_ENCRYPTED) != 0 || (lfh.flags & FLAG_HAS_DATA_DESCRIPTOR) != 0 { + return Some(Err(Error::new( + ErrorKind::InvalidData, + "attempted lookup of unsupported entry", + ))) + } + + let path = data.read_slice(lfh.file_name_length.into())?; + let path = Path::new(OsStr::from_bytes(path)); + + let _extra = data.read_slice(lfh.extra_field_length.into())?; + // SAFETY: Both pointers point into the same underlying byte array. + let data_offset = offset as usize + + usize::try_from(unsafe { data.as_ptr().offset_from(start) }).unwrap(); + let data = data.read_slice(lfh.compressed_size as usize)?; + + let entry = Entry { + compression: lfh.compression, + path, + data_offset, + data, + }; + + Some(Ok(entry)) + } + + entry_impl(data, offset).unwrap_or_else(|| { + Err(Error::new( + ErrorKind::InvalidData, + "failed to read archive entry", + )) + }) + } + + fn parse_next_entry(&mut self) -> Result> { + fn entry_impl<'archive>(iter: &mut EntryIter<'archive>) -> Option>> { + let cdfh = iter.cd_record_data.read_pod::()?; + + if cdfh.magic != CD_FILE_HEADER_MAGIC { + return Some(Err(Error::new( + ErrorKind::InvalidData, + "central directory file header contains invalid magic number", + ))) + } + + let name = iter + .cd_record_data + .read_slice(cdfh.file_name_length.into())?; + let name = OsStr::from_bytes(name); + + let _extra = iter + .cd_record_data + .read_slice(cdfh.extra_field_length.into())?; + let _comment = iter + .cd_record_data + .read_slice(cdfh.file_comment_length.into())?; + + Some(EntryIter::parse_entry_at_offset( + iter.archive_data, + cdfh.offset, + )) + } + + entry_impl(self).unwrap_or_else(|| { + Err(Error::new( + ErrorKind::InvalidData, + "failed to read central directory record data", + )) + }) + } +} + +impl<'archive> Iterator for EntryIter<'archive> { + type Item = Result>; + + fn next(&mut self) -> Option { + self.remaining_records = self.remaining_records.checked_sub(1)?; + Some(self.parse_next_entry()) + } +} + + +/// An open zip archive. +/// +/// Only basic ZIP files are supported, in particular the following are not +/// supported: +/// - encryption +/// - streaming +/// - multi-part ZIP files +/// - ZIP64 +#[derive(Debug)] +pub(crate) struct Archive { + mmap: Mmap, + cd_offset: u32, + cd_records: u16, +} + +impl Archive { + /// Open a zip archive at the provided `path`. + pub fn open

(path: P) -> Result + where + P: AsRef, + { + let mmap = Mmap::builder().open(path)?; + Self::with_mmap(mmap) + } + + /// Create an `Archive` instance using the provided `Mmap`. + pub fn with_mmap(mmap: Mmap) -> Result { + // Check that a central directory is present as at least some form + // of validation that we are in fact dealing with a valid zip file. + let (cd_offset, cd_records) = Archive::find_cd(&mmap)?; + let slf = Archive { + mmap, + cd_offset, + cd_records, + }; + Ok(slf) + } + + fn try_parse_end_of_cd(mut data: &[u8]) -> Option> { + let eocd = data.read_pod::()?; + if eocd.magic != END_OF_CD_RECORD_MAGIC { + return None + } + + // Make sure that another `comment_length` bytes exist after the end of + // cd record. + let () = data.ensure(eocd.comment_length.into())?; + + if eocd.this_disk != 0 || eocd.cd_disk != 0 || eocd.cd_records_total != eocd.cd_records { + // This is a valid eocd, but we only support single-file non-ZIP64 archives. + Some(Err(Error::new( + ErrorKind::InvalidData, + "archive is unsupported and cannot be opened", + ))) + } else { + Some(Ok((eocd.cd_offset, eocd.cd_records))) + } + } + + /// Search for the central directory at the end of the archive (represented + /// by the provided slice of bytes). + fn find_cd(data: &[u8]) -> Result<(u32, u16)> { + // Because the end of central directory ends with a variable length + // array of up to 0xFFFF bytes we can't know exactly where it starts and + // need to search for it at the end of the file, scanning the [start, + // end] range. + let end = data + .len() + .checked_sub(size_of::()) + .ok_or_else(|| { + Error::new( + ErrorKind::InvalidData, + "archive is too small to contain end of central directory object", + ) + })?; + let start = end.saturating_sub(1 << 16); + + for offset in (start..=end).rev() { + let result = Self::try_parse_end_of_cd(data.get(offset..).unwrap()); + match result { + None => continue, + Some(Ok((cd_offset, cd_records))) => { + // Validate the offset and records quickly to eliminate + // potential error cases later on. + let cd_range = cd_offset as usize + ..cd_offset as usize + usize::from(cd_records) * size_of::(); + let _cd = data.get(cd_range).ok_or_else(|| { + Error::new( + ErrorKind::UnexpectedEof, + "failed to retrieve central directory entries; archive is corrupted", + ) + })?; + return Ok((cd_offset, cd_records)) + } + Some(Err(err)) => return Err(err), + } + } + + Err(Error::new( + ErrorKind::InvalidData, + "archive does not contain central directory", + )) + } + + /// Create an iterator over the entries of the archive. + pub fn entries(&self) -> EntryIter<'_> { + let archive_data = &self.mmap; + // SANITY: The offset has been validated during construction. + let cd_record_data = self.mmap.get(self.cd_offset as usize..).unwrap(); + let remaining_records = self.cd_records; + + let iter = EntryIter { + archive_data, + cd_record_data, + remaining_records, + }; + iter + } + + /// Retrieve the [`Mmap`] object used by this `Archive`. + #[inline] + pub fn mmap(&self) -> &Mmap { + &self.mmap + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + use std::io::copy; + use std::io::Write as _; + use std::ops::Deref as _; + + use tempfile::tempfile; + use tempfile::NamedTempFile; + + use test_log::test; + + use crate::elf::ElfParser; + + + /// Check that we can properly open a zip archive. + #[test] + fn zip_opening() { + let zip = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test.zip"); + let _archive = Archive::open(zip).unwrap(); + } + + /// Check that we can iterate over the entries of a zip archive. + #[test] + fn zip_entry_iteration() { + let zip = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test.zip"); + let archive = Archive::open(zip).unwrap(); + assert_eq!( + archive + .entries() + .inspect(|result| assert!(result.is_ok(), "{result:?}")) + .count(), + 3 + ); + } + + /// Check that we can find archive entries by name. + #[test] + fn zip_entry_reading() { + let zip = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test.zip"); + let archive = Archive::open(zip).unwrap(); + + let result = archive + .entries() + .find(|entry| entry.as_ref().unwrap().path == Path::new("non-existent")); + assert!(result.is_none()); + + let entry = archive + .entries() + .find(|entry| entry.as_ref().unwrap().path == Path::new("zip-dir/test-no-debug.bin")) + .unwrap() + .unwrap(); + assert_eq!(entry.compression, 0); + assert_eq!(entry.path, Path::new("zip-dir/test-no-debug.bin")); + assert_eq!( + entry.data, + archive + .mmap + .get(entry.data_offset..entry.data_offset + entry.data.len()) + .unwrap() + ); + + // Sanity check that the entry actually references a valid ELF binary, + // which is what we expect. + let mut file = tempfile().unwrap(); + let () = file.write_all(entry.data).unwrap(); + + let elf = ElfParser::open_file(file).unwrap(); + assert!(elf.find_section(".text").is_ok()); + } + + /// Check that we fail `Archive` creation for corrupted archives. + #[test] + fn zip_creation_corrupted() { + let zip = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test.zip"); + + let archive = Archive::open(zip).unwrap(); + + let mut corrupted_zip = NamedTempFile::new().unwrap(); + let mut partial_data = archive + .mmap + .deref() + .get( + ..archive.cd_offset as usize + + usize::from(archive.cd_records) * size_of::() + - 1, + ) + .unwrap(); + copy(&mut partial_data, &mut corrupted_zip); + + // The archive only contains a corrupted central directory and no end of + // central directory marker at all. + let err = Archive::open(corrupted_zip.path()).unwrap_err(); + assert_eq!(err.kind(), ErrorKind::InvalidData, "{err}"); + } +} diff --git a/blazesym/tests/blazesym.rs b/blazesym/tests/blazesym.rs new file mode 100644 index 0000000..b462ec1 --- /dev/null +++ b/blazesym/tests/blazesym.rs @@ -0,0 +1,214 @@ +#![allow(clippy::let_and_return, clippy::let_unit_value)] + +use std::ffi::CString; +use std::fs::read as read_file; +use std::io::Error; +use std::io::ErrorKind; +use std::os::unix::ffi::OsStringExt as _; +use std::path::Path; + +use blazesym::inspect; +use blazesym::inspect::Inspector; +use blazesym::normalize::Normalizer; +use blazesym::symbolize; +use blazesym::symbolize::Symbolizer; +use blazesym::Addr; +use blazesym::Pid; + + +/// Make sure that we fail symbolization when providing a non-existent source. +#[test] +fn error_on_non_existent_source() { + let non_existent = Path::new("/does-not-exists"); + let srcs = vec![ + symbolize::Source::Gsym(symbolize::Gsym::new(non_existent)), + symbolize::Source::Elf(symbolize::Elf::new(non_existent)), + ]; + let symbolizer = Symbolizer::new(); + + for src in srcs { + let err = symbolizer.symbolize(&src, &[0x2000100]).unwrap_err(); + assert_eq!(err.kind(), ErrorKind::NotFound); + } +} + +/// Check that we can correctly symbolize an address using GSYM. +#[test] +fn symbolize_gsym() { + let test_gsym = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test.gsym"); + + let src = symbolize::Source::Gsym(symbolize::Gsym::new(test_gsym)); + let symbolizer = Symbolizer::new(); + + let results = symbolizer + .symbolize(&src, &[0x2000100]) + .unwrap() + .into_iter() + .flatten() + .collect::>(); + assert_eq!(results.len(), 1); + + let result = results.first().unwrap(); + assert_eq!(result.symbol, "factorial"); +} + +/// Check that we can symbolize an address using DWARF. +#[test] +fn symbolize_dwarf() { + let test_dwarf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf.bin"); + let src = symbolize::Source::Elf(symbolize::Elf::new(test_dwarf)); + let symbolizer = Symbolizer::new(); + let results = symbolizer + .symbolize(&src, &[0x2000100]) + .unwrap() + .into_iter() + .flatten() + .collect::>(); + assert_eq!(results.len(), 1); + + let result = results.first().unwrap(); + assert_eq!(result.symbol, "factorial"); +} + +/// Check that we can symbolize addresses inside our own process. +#[test] +fn symbolize_process() { + let src = symbolize::Source::Process(symbolize::Process::new(Pid::Slf)); + let addrs = [symbolize_process as Addr, Symbolizer::new as Addr]; + let symbolizer = Symbolizer::new(); + let results = symbolizer + .symbolize(&src, &addrs) + .unwrap() + .into_iter() + .flatten() + .collect::>(); + assert_eq!(results.len(), 2); + + let result = &results[0]; + assert!(result.symbol.contains("symbolize_process"), "{result:x?}"); + + let result = &results[1]; + assert!(result.symbol.contains("Symbolizer3new"), "{result:x?}"); +} + +/// Check that we can normalize user addresses in our own shared object. +#[test] +fn normalize_user_addr() { + fn test(so: &str) { + let test_so = Path::new(&env!("CARGO_MANIFEST_DIR")).join("data").join(so); + let so_cstr = CString::new(test_so.clone().into_os_string().into_vec()).unwrap(); + let handle = unsafe { libc::dlopen(so_cstr.as_ptr(), libc::RTLD_NOW) }; + assert!(!handle.is_null()); + + let the_answer_addr = unsafe { libc::dlsym(handle, "the_answer\0".as_ptr().cast()) }; + assert!(!the_answer_addr.is_null()); + + let normalizer = Normalizer::new(); + let norm_addrs = normalizer + .normalize_user_addrs_sorted([the_answer_addr as Addr].as_slice(), Pid::Slf) + .unwrap(); + assert_eq!(norm_addrs.addrs.len(), 1); + assert_eq!(norm_addrs.meta.len(), 1); + + let rc = unsafe { libc::dlclose(handle) }; + assert_eq!(rc, 0, "{}", Error::last_os_error()); + + let norm_addr = norm_addrs.addrs[0]; + let meta = &norm_addrs.meta[norm_addr.1]; + assert_eq!(meta.binary().unwrap().path, test_so); + + let elf = symbolize::Elf::new(test_so); + let src = symbolize::Source::Elf(elf); + let symbolizer = Symbolizer::new(); + let results = symbolizer + .symbolize(&src, &[norm_addr.0]) + .unwrap() + .into_iter() + .flatten() + .collect::>(); + assert_eq!(results.len(), 1); + + let result = results.first().unwrap(); + assert_eq!(result.symbol, "the_answer"); + } + + test("libtest-so.so"); + test("libtest-so-no-separate-code.so"); +} + + +/// Check that we can look up an address. +#[test] +fn inspect() { + fn test(src: inspect::Source) { + let inspector = Inspector::new(); + let results = inspector + .lookup(&["factorial"], &src) + .unwrap() + .into_iter() + .flatten() + .collect::>(); + assert_eq!(results.len(), 1); + + let result = results.first().unwrap(); + assert_eq!(result.addr, 0x2000100); + assert_ne!(result.file_offset, 0); + assert_eq!( + result.obj_file_name.as_deref().unwrap(), + src.path().unwrap() + ); + } + + let test_dwarf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf.bin"); + let src = inspect::Source::Elf(inspect::Elf::new(test_dwarf)); + let () = test(src); + + let test_elf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-stable-addresses-no-dwarf.bin"); + let mut elf = inspect::Elf::new(test_elf); + assert!(elf.debug_info); + elf.debug_info = false; + let src = inspect::Source::Elf(elf); + let () = test(src); +} + + +/// Read four bytes at the given `offset` in the file identified by `path`. +fn read_4bytes_at(path: &Path, offset: u64) -> [u8; 4] { + let offset = offset as usize; + let content = read_file(path).unwrap(); + let slice = &content[offset..offset + 4]; + <[u8; 4]>::try_from(slice).unwrap() +} + + +/// Check that we can correctly retrieve the file offset in an ELF file. +#[test] +fn inspect_file_offset_elf() { + let test_elf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-stable-addresses-no-dwarf.bin"); + let elf = inspect::Elf::new(test_elf); + let src = inspect::Source::Elf(elf); + + let inspector = Inspector::new(); + let results = inspector + .lookup(&["dummy"], &src) + .unwrap() + .into_iter() + .flatten() + .collect::>(); + assert_eq!(results.len(), 1); + + let result = results.first().unwrap(); + assert_ne!(result.file_offset, 0); + let bytes = read_4bytes_at(src.path().unwrap(), result.file_offset); + assert_eq!(bytes, [0xde, 0xad, 0xbe, 0xef]); +} diff --git a/blazesym/tests/c_api.rs b/blazesym/tests/c_api.rs new file mode 100644 index 0000000..4f4b964 --- /dev/null +++ b/blazesym/tests/c_api.rs @@ -0,0 +1,256 @@ +#![allow(clippy::let_and_return, clippy::let_unit_value)] + +use std::ffi::CStr; +use std::ffi::CString; +use std::path::Path; +use std::ptr; +use std::slice; + +use blazesym::inspect; + +use blazesym::c_api::blaze_inspect_elf_src; +use blazesym::c_api::blaze_inspect_syms_elf; +use blazesym::c_api::blaze_inspect_syms_free; +use blazesym::c_api::blaze_inspector_free; +use blazesym::c_api::blaze_inspector_new; +use blazesym::c_api::blaze_normalize_user_addrs; +use blazesym::c_api::blaze_normalize_user_addrs_sorted; +use blazesym::c_api::blaze_normalizer_free; +use blazesym::c_api::blaze_normalizer_new; +use blazesym::c_api::blaze_result_free; +use blazesym::c_api::blaze_symbolize_elf; +use blazesym::c_api::blaze_symbolize_gsym; +use blazesym::c_api::blaze_symbolize_process; +use blazesym::c_api::blaze_symbolize_src_elf; +use blazesym::c_api::blaze_symbolize_src_gsym; +use blazesym::c_api::blaze_symbolize_src_process; +use blazesym::c_api::blaze_symbolizer_free; +use blazesym::c_api::blaze_symbolizer_new; +use blazesym::c_api::blaze_symbolizer_new_opts; +use blazesym::c_api::blaze_symbolizer_opts; +use blazesym::c_api::blaze_user_addrs_free; +use blazesym::Addr; + + +/// Make sure that we can create and free a symbolizer instance. +#[test] +fn symbolizer_creation() { + let symbolizer = blaze_symbolizer_new(); + let () = unsafe { blaze_symbolizer_free(symbolizer) }; +} + + +/// Make sure that we can create and free a symbolizer instance with the +/// provided options. +#[test] +fn symbolizer_creation_with_opts() { + let opts = blaze_symbolizer_opts { + debug_syms: true, + src_location: false, + }; + let symbolizer = unsafe { blaze_symbolizer_new_opts(&opts) }; + let () = unsafe { blaze_symbolizer_free(symbolizer) }; +} + + +/// Make sure that we can symbolize an address in an ELF file. +#[test] +fn symbolize_from_elf() { + let test_dwarf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf.bin"); + let test_dwarf_c = CString::new(test_dwarf.to_str().unwrap()).unwrap(); + + let elf_src = blaze_symbolize_src_elf { + path: test_dwarf_c.as_ptr(), + }; + + let symbolizer = blaze_symbolizer_new(); + let addrs = [0x2000100]; + let result = unsafe { blaze_symbolize_elf(symbolizer, &elf_src, addrs.as_ptr(), addrs.len()) }; + + assert!(!result.is_null()); + + let result = unsafe { &*result }; + assert_eq!(result.size, 1); + let entries = unsafe { slice::from_raw_parts(result.entries.as_ptr(), result.size) }; + let entry = &entries[0]; + assert_eq!(entry.size, 1); + + let syms = unsafe { slice::from_raw_parts(entry.syms, entry.size) }; + let sym = &syms[0]; + assert_eq!( + unsafe { CStr::from_ptr(sym.symbol) }, + CStr::from_bytes_with_nul(b"factorial\0").unwrap() + ); + + let () = unsafe { blaze_result_free(result) }; + let () = unsafe { blaze_symbolizer_free(symbolizer) }; +} + + +/// Make sure that we can symbolize an address in a Gsym file. +#[test] +fn symbolize_from_gsym() { + let test_gsym = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test.gsym"); + let test_gsym_c = CString::new(test_gsym.to_str().unwrap()).unwrap(); + let gsym_src = blaze_symbolize_src_gsym { + path: test_gsym_c.as_ptr(), + }; + + let symbolizer = blaze_symbolizer_new(); + let addrs = [0x2000100]; + let result = + unsafe { blaze_symbolize_gsym(symbolizer, &gsym_src, addrs.as_ptr(), addrs.len()) }; + + assert!(!result.is_null()); + + let result = unsafe { &*result }; + assert_eq!(result.size, 1); + let entries = unsafe { slice::from_raw_parts(result.entries.as_ptr(), result.size) }; + let entry = &entries[0]; + assert_eq!(entry.size, 1); + + let syms = unsafe { slice::from_raw_parts(entry.syms, entry.size) }; + let sym = &syms[0]; + assert_eq!( + unsafe { CStr::from_ptr(sym.symbol) }, + CStr::from_bytes_with_nul(b"factorial\0").unwrap() + ); + + let () = unsafe { blaze_result_free(result) }; + let () = unsafe { blaze_symbolizer_free(symbolizer) }; +} + + +/// Make sure that we can symbolize an address in a process. +#[test] +fn symbolize_in_process() { + let process_src = blaze_symbolize_src_process { pid: 0 }; + + let symbolizer = blaze_symbolizer_new(); + let addrs = [blaze_symbolizer_new as Addr]; + let result = + unsafe { blaze_symbolize_process(symbolizer, &process_src, addrs.as_ptr(), addrs.len()) }; + + assert!(!result.is_null()); + + let result = unsafe { &*result }; + assert_eq!(result.size, 1); + let entries = unsafe { slice::from_raw_parts(result.entries.as_ptr(), result.size) }; + let entry = &entries[0]; + assert_eq!(entry.size, 1); + + let syms = unsafe { slice::from_raw_parts(entry.syms, entry.size) }; + let sym = &syms[0]; + assert_eq!( + unsafe { CStr::from_ptr(sym.symbol) }, + CStr::from_bytes_with_nul(b"blaze_symbolizer_new\0").unwrap() + ); + + let () = unsafe { blaze_result_free(result) }; + let () = unsafe { blaze_symbolizer_free(symbolizer) }; +} + + +/// Make sure that we can create and free a normalizer instance. +#[test] +fn normalizer_creation() { + let normalizer = blaze_normalizer_new(); + let () = unsafe { blaze_normalizer_free(normalizer) }; +} + + +/// Check that we can normalize user space addresses. +#[test] +fn normalize_user_addrs() { + let addrs = [ + libc::__errno_location as Addr, + libc::dlopen as Addr, + libc::fopen as Addr, + lookup_dwarf as Addr, + normalize_user_addrs as Addr, + ]; + + let normalizer = blaze_normalizer_new(); + assert_ne!(normalizer, ptr::null_mut()); + + let result = unsafe { + blaze_normalize_user_addrs(normalizer, addrs.as_slice().as_ptr(), addrs.len(), 0) + }; + assert_ne!(result, ptr::null_mut()); + + let user_addrs = unsafe { &*result }; + assert_eq!(user_addrs.meta_count, 2); + assert_eq!(user_addrs.addr_count, 5); + + let () = unsafe { blaze_user_addrs_free(result) }; + let () = unsafe { blaze_normalizer_free(normalizer) }; +} + + +/// Check that we can normalize sorted user space addresses. +#[test] +fn normalize_user_addrs_sorted() { + let mut addrs = [ + libc::__errno_location as Addr, + libc::dlopen as Addr, + libc::fopen as Addr, + lookup_dwarf as Addr, + normalize_user_addrs as Addr, + ]; + let () = addrs.sort(); + + let normalizer = blaze_normalizer_new(); + assert_ne!(normalizer, ptr::null_mut()); + + let result = unsafe { + blaze_normalize_user_addrs_sorted(normalizer, addrs.as_slice().as_ptr(), addrs.len(), 0) + }; + assert_ne!(result, ptr::null_mut()); + + let user_addrs = unsafe { &*result }; + assert_eq!(user_addrs.meta_count, 2); + assert_eq!(user_addrs.addr_count, 5); + + let () = unsafe { blaze_user_addrs_free(result) }; + let () = unsafe { blaze_normalizer_free(normalizer) }; +} + + +/// Make sure that we can create and free an inspector instance. +#[test] +fn inspector_creation() { + let inspector = blaze_inspector_new(); + let () = unsafe { blaze_inspector_free(inspector) }; +} + + +/// Make sure that we can lookup a function's address using DWARF information. +#[test] +fn lookup_dwarf() { + let test_dwarf = Path::new(&env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("test-dwarf.bin"); + + let src = blaze_inspect_elf_src::from(inspect::Elf::new(test_dwarf)); + let factorial = CString::new("factorial").unwrap(); + let names = [factorial.as_ptr()]; + + let inspector = blaze_inspector_new(); + let result = unsafe { blaze_inspect_syms_elf(inspector, &src, names.as_ptr(), names.len()) }; + let _src = inspect::Elf::from(src); + + let sym_infos = unsafe { slice::from_raw_parts(result, names.len()) }; + let sym_info = unsafe { &*sym_infos[0] }; + assert_eq!( + unsafe { CStr::from_ptr(sym_info.name) }, + CStr::from_bytes_with_nul(b"factorial\0").unwrap() + ); + assert_eq!(sym_info.addr, 0x2000100); + + let () = unsafe { blaze_inspect_syms_free(result) }; + let () = unsafe { blaze_inspector_free(inspector) }; +} diff --git a/bpftool/.gitattributes b/bpftool/.gitattributes new file mode 100644 index 0000000..05e03be --- /dev/null +++ b/bpftool/.gitattributes @@ -0,0 +1 @@ +src/Makefile.* linguist-language=Makefile diff --git a/bpftool/.gitmodules b/bpftool/.gitmodules new file mode 100644 index 0000000..1706b4a --- /dev/null +++ b/bpftool/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libbpf"] + path = libbpf + url = https://github.com/libbpf/libbpf.git diff --git a/bpftool/BPF-CHECKPOINT-COMMIT b/bpftool/BPF-CHECKPOINT-COMMIT new file mode 100644 index 0000000..7ff5325 --- /dev/null +++ b/bpftool/BPF-CHECKPOINT-COMMIT @@ -0,0 +1 @@ +3a70e0d4c9d74cb00f7c0ec022f5599f9f7ba07d diff --git a/bpftool/CHECKPOINT-COMMIT b/bpftool/CHECKPOINT-COMMIT new file mode 100644 index 0000000..d9cb47c --- /dev/null +++ b/bpftool/CHECKPOINT-COMMIT @@ -0,0 +1 @@ +951bce29c8988209cc359e1fa35a4aaa35542fd5 diff --git a/bpftool/Dockerfile b/bpftool/Dockerfile new file mode 100644 index 0000000..730319c --- /dev/null +++ b/bpftool/Dockerfile @@ -0,0 +1,39 @@ +# With this Dockerfile, you can create a container image: +# $ docker build -f Dockerfile -t bpftool . +# And then use it: +# $ docker run --rm -ti --privileged --pid=host bpftool prog + +# hadolint global ignore=DL3008 + +FROM ubuntu:22.04 as builder + +RUN \ + export DEBIAN_FRONTEND=noninteractive && \ + apt-get update && \ + apt-get -y install --no-install-recommends \ + build-essential \ + libelf-dev \ + libz-dev \ + libcap-dev \ + clang llvm llvm-dev lld \ + binutils-dev \ + pkg-config && \ + rm -rf /var/lib/apt/lists/* + +COPY . /src +RUN \ + make -C /src/src clean && \ + make -C /src/src -j "$(nproc)" + +FROM ubuntu:22.04 +RUN \ + export DEBIAN_FRONTEND=noninteractive && \ + apt-get update && \ + apt-get -y install --no-install-recommends \ + libelf1 \ + llvm && \ + rm -rf /var/lib/apt/lists/* + +COPY --from=builder /src/src/bpftool /bin/bpftool + +ENTRYPOINT ["/bin/bpftool"] diff --git a/bpftool/LICENSE b/bpftool/LICENSE new file mode 100644 index 0000000..00c68fe --- /dev/null +++ b/bpftool/LICENSE @@ -0,0 +1 @@ +GPL-2.0-only OR BSD-2-Clause diff --git a/bpftool/LICENSE.BSD-2-Clause b/bpftool/LICENSE.BSD-2-Clause new file mode 100644 index 0000000..da366e2 --- /dev/null +++ b/bpftool/LICENSE.BSD-2-Clause @@ -0,0 +1,32 @@ +Valid-License-Identifier: BSD-2-Clause +SPDX-URL: https://spdx.org/licenses/BSD-2-Clause.html +Usage-Guide: + To use the BSD 2-clause "Simplified" License put the following SPDX + tag/value pair into a comment according to the placement guidelines in + the licensing rules documentation: + SPDX-License-Identifier: BSD-2-Clause +License-Text: + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/bpftool/LICENSE.GPL-2.0 b/bpftool/LICENSE.GPL-2.0 new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/bpftool/LICENSE.GPL-2.0 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/bpftool/README.md b/bpftool/README.md new file mode 100644 index 0000000..59d628f --- /dev/null +++ b/bpftool/README.md @@ -0,0 +1,154 @@ +bpftool +======= + +This is a mirror of [bpf-next Linux source tree's +`tools/bpf/bpftool`](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/bpf/bpftool) +directory, plus its few dependencies from under `kernel/bpf/`, and its +supporting header files. + +All the gory details of syncing can be found in `scripts/sync-kernel.sh` +script. + +Some header files in this repo (`include/linux/*.h`) are reduced versions of +their counterpart files at +[bpf-next](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/)'s +`tools/include/linux/*.h` to make compilation successful. + +BPF/bpftool usage and questions +------------------------------- + +Please check out [the manual pages](docs) for documentation about bpftool. A +number of example invocations are also displayed in [this blog +post](https://qmonnet.github.io/whirl-offload/2021/09/23/bpftool-features-thread/). + +All general BPF questions, including kernel functionality, bpftool features and +usage, should be sent to bpf@vger.kernel.org mailing list. You can subscribe to +it [here](http://vger.kernel.org/vger-lists.html#bpf) and search its archive +[here](https://lore.kernel.org/bpf/). Please search the archive before asking +new questions. It very well might be that this was already addressed or +answered before. + +bpf@vger.kernel.org is monitored by many more people and they will happily try +to help you with whatever issue you have. This repository's PRs and issues +should be opened only for dealing with issues pertaining to specific way this +bpftool mirror repo is set up and organized. + +Dependencies +------------ + +Required: + +- libelf +- zlib + +Optional: + +- libbfd (for dumping JIT-compiled program instructions) +- libcap (for better feature probing) +- kernel BTF information (for profiling programs or showing PIDs of processes + referencing BPF objects) +- clang/LLVM (idem) + +Build +[![build](https://github.com/libbpf/bpftool/actions/workflows/build.yaml/badge.svg)](https://github.com/libbpf/bpftool/actions/workflows/build.yaml) +----- + +### Initialize libbpf submodule + +This repository uses libbpf as a submodule. You can initialize it when cloning +bpftool: + +```console +$ git clone --recurse-submodules https://github.com/libbpf/bpftool.git +``` + +Alternatively, if you have already cloned the repository, you can initialize +the submodule by running the following command from within the repository: + +```console +$ git submodule update --init +``` + +### Build bpftool + +To build bpftool: + +```console +$ cd src +$ make +``` + +To build and install bpftool on the system: + +```console +$ cd src +# make install +``` + +Building bpftool in a separate directory is supported via the `OUTPUT` variable: + +```console +$ mkdir /tmp/bpftool +$ cd src +$ OUTPUT=/tmp/bpftool make +``` + +Most of the output is suppressed by default, but detailed building logs can be +displayed by passing `V=1`: + +```console +$ cd src +$ make V=1 +``` + +Additional compilation flags can be passed to the command line if required. For +example, we can create a static build with the following commands: + +```console +$ cd src +$ EXTRA_CFLAGS=--static make +``` + +Note that to use the LLVM disassembler with static builds, we need a static +version of the LLVM library installed on the system: + +1. Clone and build the LLVM libraries locally. + + ```console + $ git clone https://github.com/llvm/llvm-project.git + $ mkdir llvm_build + $ cmake -S llvm-project/llvm -B llvm_build -DCMAKE_BUILD_TYPE=Release + $ make -j -C llvm_build llvm-config llvm-libraries + ``` + +2. Build bpftool with `EXTRA_CFLAGS` set to `--static`, and by passing the path to + the relevant `llvm-config`. + + ```console + $ cd bpftool + $ LLVM_CONFIG=../llvm_build/bin/llvm-config EXTRA_CFLAGS=--static make -j + ``` + +### Build bpftool's man pages + +The man pages for bpftool can be built with: + +```console +$ cd docs +$ make +``` + +They can be installed on the system with: + +```console +$ cd docs +# make install +``` + +License +------- + +This work is dual-licensed under the GNU GPL v2.0 (only) license and the +BSD 2-clause license. You can choose between one of them if you use this work. + +`SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)` diff --git a/bpftool/bash-completion/bpftool b/bpftool/bash-completion/bpftool new file mode 100644 index 0000000..35f26f7 --- /dev/null +++ b/bpftool/bash-completion/bpftool @@ -0,0 +1,1214 @@ +# bpftool(8) bash completion -*- shell-script -*- +# +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +# Copyright (C) 2017-2018 Netronome Systems, Inc. +# +# Author: Quentin Monnet + +# Takes a list of words in argument; each one of them is added to COMPREPLY if +# it is not already present on the command line. Returns no value. +_bpftool_once_attr() +{ + local w idx found + for w in $*; do + found=0 + for (( idx=3; idx < ${#words[@]}-1; idx++ )); do + if [[ $w == ${words[idx]} ]]; then + found=1 + break + fi + done + [[ $found -eq 0 ]] && \ + COMPREPLY+=( $( compgen -W "$w" -- "$cur" ) ) + done +} + +# Takes a list of words as argument; if any of those words is present on the +# command line, return 0. Otherwise, return 1. +_bpftool_search_list() +{ + local w idx + for w in $*; do + for (( idx=3; idx < ${#words[@]}-1; idx++ )); do + [[ $w == ${words[idx]} ]] && return 0 + done + done + return 1 +} + +# Takes a list of words in argument; adds them all to COMPREPLY if none of them +# is already present on the command line. Returns no value. +_bpftool_one_of_list() +{ + _bpftool_search_list $* && return 1 + COMPREPLY+=( $( compgen -W "$*" -- "$cur" ) ) +} + +_bpftool_get_map_ids() +{ + COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \ + command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) ) +} + +# Takes map type and adds matching map ids to the list of suggestions. +_bpftool_get_map_ids_for_type() +{ + local type="$1" + COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \ + command grep -C2 "$type" | \ + command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) ) +} + +_bpftool_get_map_names() +{ + COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \ + command sed -n 's/.*"name": \(.*\),$/\1/p' )" -- "$cur" ) ) +} + +# Takes map type and adds matching map names to the list of suggestions. +_bpftool_get_map_names_for_type() +{ + local type="$1" + COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \ + command grep -C2 "$type" | \ + command sed -n 's/.*"name": \(.*\),$/\1/p' )" -- "$cur" ) ) +} + +_bpftool_get_prog_ids() +{ + COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \ + command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) ) +} + +_bpftool_get_prog_tags() +{ + COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \ + command sed -n 's/.*"tag": "\(.*\)",$/\1/p' )" -- "$cur" ) ) +} + +_bpftool_get_prog_names() +{ + COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \ + command sed -n 's/.*"name": "\(.*\)",$/\1/p' )" -- "$cur" ) ) +} + +_bpftool_get_btf_ids() +{ + COMPREPLY+=( $( compgen -W "$( bpftool -jp btf 2>&1 | \ + command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) ) +} + +_bpftool_get_link_ids() +{ + COMPREPLY+=( $( compgen -W "$( bpftool -jp link 2>&1 | \ + command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) ) +} + +_bpftool_get_obj_map_names() +{ + local obj + + obj=$1 + + maps=$(objdump -j maps -t $obj 2>/dev/null | \ + command awk '/g . maps/ {print $NF}') + + COMPREPLY+=( $( compgen -W "$maps" -- "$cur" ) ) +} + +_bpftool_get_obj_map_idxs() +{ + local obj + + obj=$1 + + nmaps=$(objdump -j maps -t $obj 2>/dev/null | grep -c 'g . maps') + + COMPREPLY+=( $( compgen -W "$(seq 0 $((nmaps - 1)))" -- "$cur" ) ) +} + +_sysfs_get_netdevs() +{ + COMPREPLY+=( $( compgen -W "$( ls /sys/class/net 2>/dev/null )" -- \ + "$cur" ) ) +} + +# Retrieve type of the map that we are operating on. +_bpftool_map_guess_map_type() +{ + local keyword ref + for (( idx=3; idx < ${#words[@]}-1; idx++ )); do + case "${words[$((idx-2))]}" in + lookup|update) + keyword=${words[$((idx-1))]} + ref=${words[$((idx))]} + ;; + push) + printf "stack" + return 0 + ;; + enqueue) + printf "queue" + return 0 + ;; + esac + done + [[ -z $ref ]] && return 0 + + local type + type=$(bpftool -jp map show $keyword $ref | \ + command sed -n 's/.*"type": "\(.*\)",$/\1/p') + [[ -n $type ]] && printf $type +} + +_bpftool_map_update_get_id() +{ + local command="$1" + + # Is it the map to update, or a map to insert into the map to update? + # Search for "value" keyword. + local idx value + for (( idx=7; idx < ${#words[@]}-1; idx++ )); do + if [[ ${words[idx]} == "value" ]]; then + value=1 + break + fi + done + if [[ $value -eq 0 ]]; then + case "$command" in + push) + _bpftool_get_map_ids_for_type stack + ;; + enqueue) + _bpftool_get_map_ids_for_type queue + ;; + *) + _bpftool_get_map_ids + ;; + esac + return 0 + fi + + # Id to complete is for a value. It can be either prog id or map id. This + # depends on the type of the map to update. + local type=$(_bpftool_map_guess_map_type) + case $type in + array_of_maps|hash_of_maps) + _bpftool_get_map_ids + return 0 + ;; + prog_array) + _bpftool_get_prog_ids + return 0 + ;; + *) + return 0 + ;; + esac +} + +_bpftool_map_update_get_name() +{ + local command="$1" + + # Is it the map to update, or a map to insert into the map to update? + # Search for "value" keyword. + local idx value + for (( idx=7; idx < ${#words[@]}-1; idx++ )); do + if [[ ${words[idx]} == "value" ]]; then + value=1 + break + fi + done + if [[ $value -eq 0 ]]; then + case "$command" in + push) + _bpftool_get_map_names_for_type stack + ;; + enqueue) + _bpftool_get_map_names_for_type queue + ;; + *) + _bpftool_get_map_names + ;; + esac + return 0 + fi + + # Name to complete is for a value. It can be either prog name or map name. This + # depends on the type of the map to update. + local type=$(_bpftool_map_guess_map_type) + case $type in + array_of_maps|hash_of_maps) + _bpftool_get_map_names + return 0 + ;; + prog_array) + _bpftool_get_prog_names + return 0 + ;; + *) + return 0 + ;; + esac +} + +_bpftool() +{ + local cur prev words objword + _init_completion || return + + # Deal with options + if [[ ${words[cword]} == -* ]]; then + local c='--version --json --pretty --bpffs --mapcompat --debug \ + --use-loader --base-btf' + COMPREPLY=( $( compgen -W "$c" -- "$cur" ) ) + return 0 + fi + + # Deal with simplest keywords + case $prev in + help|hex|opcodes|visual|linum) + return 0 + ;; + tag) + _bpftool_get_prog_tags + return 0 + ;; + dev) + _sysfs_get_netdevs + return 0 + ;; + file|pinned|-B|--base-btf) + _filedir + return 0 + ;; + batch) + COMPREPLY=( $( compgen -W 'file' -- "$cur" ) ) + return 0 + ;; + esac + + # Remove all options so completions don't have to deal with them. + local i + for (( i=1; i < ${#words[@]}; )); do + if [[ ${words[i]::1} == - ]] && + [[ ${words[i]} != "-B" ]] && [[ ${words[i]} != "--base-btf" ]]; then + words=( "${words[@]:0:i}" "${words[@]:i+1}" ) + [[ $i -le $cword ]] && cword=$(( cword - 1 )) + else + i=$(( ++i )) + fi + done + cur=${words[cword]} + prev=${words[cword - 1]} + pprev=${words[cword - 2]} + + local object=${words[1]} command=${words[2]} + + if [[ -z $object || $cword -eq 1 ]]; then + case $cur in + *) + COMPREPLY=( $( compgen -W "$( bpftool help 2>&1 | \ + command sed \ + -e '/OBJECT := /!d' \ + -e 's/.*{//' \ + -e 's/}.*//' \ + -e 's/|//g' )" -- "$cur" ) ) + COMPREPLY+=( $( compgen -W 'batch help' -- "$cur" ) ) + return 0 + ;; + esac + fi + + [[ $command == help ]] && return 0 + + # Completion depends on object and command in use + case $object in + prog) + # Complete id and name, only for subcommands that use prog (but no + # map) ids/names. + case $command in + show|list|dump|pin) + case $prev in + id) + _bpftool_get_prog_ids + return 0 + ;; + name) + _bpftool_get_prog_names + return 0 + ;; + esac + ;; + esac + + local PROG_TYPE='id pinned tag name' + local MAP_TYPE='id pinned name' + local METRIC_TYPE='cycles instructions l1d_loads llc_misses \ + itlb_misses dtlb_misses' + case $command in + show|list) + [[ $prev != "$command" ]] && return 0 + COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) ) + return 0 + ;; + dump) + case $prev in + $command) + COMPREPLY+=( $( compgen -W "xlated jited" -- \ + "$cur" ) ) + return 0 + ;; + xlated|jited) + COMPREPLY=( $( compgen -W "$PROG_TYPE" -- \ + "$cur" ) ) + return 0 + ;; + *) + _bpftool_once_attr 'file' + if _bpftool_search_list 'xlated'; then + COMPREPLY+=( $( compgen -W 'opcodes visual linum' -- \ + "$cur" ) ) + else + COMPREPLY+=( $( compgen -W 'opcodes linum' -- \ + "$cur" ) ) + fi + return 0 + ;; + esac + ;; + pin) + if [[ $prev == "$command" ]]; then + COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) ) + else + _filedir + fi + return 0 + ;; + attach|detach) + case $cword in + 3) + COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) ) + return 0 + ;; + 4) + case $prev in + id) + _bpftool_get_prog_ids + ;; + name) + _bpftool_get_prog_names + ;; + pinned) + _filedir + ;; + esac + return 0 + ;; + 5) + local BPFTOOL_PROG_ATTACH_TYPES='sk_msg_verdict \ + sk_skb_verdict sk_skb_stream_verdict sk_skb_stream_parser \ + flow_dissector' + COMPREPLY=( $( compgen -W "$BPFTOOL_PROG_ATTACH_TYPES" -- "$cur" ) ) + return 0 + ;; + 6) + COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) + return 0 + ;; + 7) + case $prev in + id) + _bpftool_get_map_ids + ;; + name) + _bpftool_get_map_names + ;; + pinned) + _filedir + ;; + esac + return 0 + ;; + esac + ;; + load|loadall) + local obj + + # Propose "load/loadall" to complete "bpftool prog load", + # or bash tries to complete "load" as a filename below. + if [[ ${#words[@]} -eq 3 ]]; then + COMPREPLY=( $( compgen -W "load loadall" -- "$cur" ) ) + return 0 + fi + + if [[ ${#words[@]} -lt 6 ]]; then + _filedir + return 0 + fi + + obj=${words[3]} + + if [[ ${words[-4]} == "map" ]]; then + COMPREPLY=( $( compgen -W "id pinned" -- "$cur" ) ) + return 0 + fi + if [[ ${words[-3]} == "map" ]]; then + if [[ ${words[-2]} == "idx" ]]; then + _bpftool_get_obj_map_idxs $obj + elif [[ ${words[-2]} == "name" ]]; then + _bpftool_get_obj_map_names $obj + fi + return 0 + fi + if [[ ${words[-2]} == "map" ]]; then + COMPREPLY=( $( compgen -W "idx name" -- "$cur" ) ) + return 0 + fi + + case $prev in + type) + local BPFTOOL_PROG_LOAD_TYPES='socket kprobe \ + kretprobe classifier flow_dissector \ + action tracepoint raw_tracepoint \ + xdp perf_event cgroup/skb cgroup/sock \ + cgroup/dev lwt_in lwt_out lwt_xmit \ + lwt_seg6local sockops sk_skb sk_msg \ + lirc_mode2 cgroup/bind4 cgroup/bind6 \ + cgroup/connect4 cgroup/connect6 \ + cgroup/getpeername4 cgroup/getpeername6 \ + cgroup/getsockname4 cgroup/getsockname6 \ + cgroup/sendmsg4 cgroup/sendmsg6 \ + cgroup/recvmsg4 cgroup/recvmsg6 \ + cgroup/post_bind4 cgroup/post_bind6 \ + cgroup/sysctl cgroup/getsockopt \ + cgroup/setsockopt cgroup/sock_release struct_ops \ + fentry fexit freplace sk_lookup' + COMPREPLY=( $( compgen -W "$BPFTOOL_PROG_LOAD_TYPES" -- "$cur" ) ) + return 0 + ;; + id) + _bpftool_get_map_ids + return 0 + ;; + name) + _bpftool_get_map_names + return 0 + ;; + pinned|pinmaps) + _filedir + return 0 + ;; + *) + COMPREPLY=( $( compgen -W "map" -- "$cur" ) ) + _bpftool_once_attr 'type' + _bpftool_once_attr 'dev' + _bpftool_once_attr 'pinmaps' + _bpftool_once_attr 'autoattach' + return 0 + ;; + esac + ;; + tracelog) + return 0 + ;; + profile) + case $cword in + 3) + COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) ) + return 0 + ;; + 4) + case $prev in + id) + _bpftool_get_prog_ids + ;; + name) + _bpftool_get_prog_names + ;; + pinned) + _filedir + ;; + esac + return 0 + ;; + 5) + COMPREPLY=( $( compgen -W "$METRIC_TYPE duration" -- "$cur" ) ) + return 0 + ;; + 6) + case $prev in + duration) + return 0 + ;; + *) + COMPREPLY=( $( compgen -W "$METRIC_TYPE" -- "$cur" ) ) + return 0 + ;; + esac + return 0 + ;; + *) + COMPREPLY=( $( compgen -W "$METRIC_TYPE" -- "$cur" ) ) + return 0 + ;; + esac + ;; + run) + if [[ ${#words[@]} -eq 4 ]]; then + COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) ) + return 0 + fi + case $prev in + id) + _bpftool_get_prog_ids + return 0 + ;; + name) + _bpftool_get_prog_names + return 0 + ;; + data_in|data_out|ctx_in|ctx_out) + _filedir + return 0 + ;; + repeat|data_size_out|ctx_size_out) + return 0 + ;; + *) + _bpftool_once_attr 'data_in data_out data_size_out \ + ctx_in ctx_out ctx_size_out repeat' + return 0 + ;; + esac + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'dump help pin attach detach \ + load loadall show list tracelog run profile' -- "$cur" ) ) + ;; + esac + ;; + struct_ops) + local STRUCT_OPS_TYPE='id name' + case $command in + show|list|dump|unregister) + case $prev in + $command) + COMPREPLY=( $( compgen -W "$STRUCT_OPS_TYPE" -- "$cur" ) ) + ;; + id) + _bpftool_get_map_ids_for_type struct_ops + ;; + name) + _bpftool_get_map_names_for_type struct_ops + ;; + esac + return 0 + ;; + register) + _filedir + return 0 + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'register unregister show list dump help' \ + -- "$cur" ) ) + ;; + esac + ;; + iter) + case $command in + pin) + case $prev in + $command) + _filedir + ;; + id) + _bpftool_get_map_ids + ;; + name) + _bpftool_get_map_names + ;; + pinned) + _filedir + ;; + *) + _bpftool_one_of_list $MAP_TYPE + ;; + esac + return 0 + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'pin help' \ + -- "$cur" ) ) + ;; + esac + ;; + map) + local MAP_TYPE='id pinned name' + case $command in + show|list|dump|peek|pop|dequeue|freeze) + case $prev in + $command) + COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) + return 0 + ;; + id) + case "$command" in + peek) + _bpftool_get_map_ids_for_type stack + _bpftool_get_map_ids_for_type queue + ;; + pop) + _bpftool_get_map_ids_for_type stack + ;; + dequeue) + _bpftool_get_map_ids_for_type queue + ;; + *) + _bpftool_get_map_ids + ;; + esac + return 0 + ;; + name) + case "$command" in + peek) + _bpftool_get_map_names_for_type stack + _bpftool_get_map_names_for_type queue + ;; + pop) + _bpftool_get_map_names_for_type stack + ;; + dequeue) + _bpftool_get_map_names_for_type queue + ;; + *) + _bpftool_get_map_names + ;; + esac + return 0 + ;; + *) + return 0 + ;; + esac + ;; + create) + case $prev in + $command) + _filedir + return 0 + ;; + type) + local BPFTOOL_MAP_CREATE_TYPES="$(bpftool feature list_builtins map_types 2>/dev/null | \ + grep -v '^unspec$')" + COMPREPLY=( $( compgen -W "$BPFTOOL_MAP_CREATE_TYPES" -- "$cur" ) ) + return 0 + ;; + key|value|flags|entries) + return 0 + ;; + inner_map) + COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) + return 0 + ;; + id) + _bpftool_get_map_ids + ;; + name) + case $pprev in + inner_map) + _bpftool_get_map_names + ;; + *) + return 0 + ;; + esac + ;; + *) + _bpftool_once_attr 'type' + _bpftool_once_attr 'key' + _bpftool_once_attr 'value' + _bpftool_once_attr 'entries' + _bpftool_once_attr 'name' + _bpftool_once_attr 'flags' + if _bpftool_search_list 'array_of_maps' 'hash_of_maps'; then + _bpftool_once_attr 'inner_map' + fi + _bpftool_once_attr 'dev' + return 0 + ;; + esac + ;; + lookup|getnext|delete) + case $prev in + $command) + COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) + return 0 + ;; + id) + _bpftool_get_map_ids + return 0 + ;; + name) + _bpftool_get_map_names + return 0 + ;; + key) + COMPREPLY+=( $( compgen -W 'hex' -- "$cur" ) ) + ;; + *) + case $(_bpftool_map_guess_map_type) in + queue|stack) + return 0 + ;; + esac + + _bpftool_once_attr 'key' + return 0 + ;; + esac + ;; + update|push|enqueue) + case $prev in + $command) + COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) + return 0 + ;; + id) + _bpftool_map_update_get_id $command + return 0 + ;; + name) + _bpftool_map_update_get_name $command + return 0 + ;; + key) + COMPREPLY+=( $( compgen -W 'hex' -- "$cur" ) ) + ;; + value) + # We can have bytes, or references to a prog or a + # map, depending on the type of the map to update. + case "$(_bpftool_map_guess_map_type)" in + array_of_maps|hash_of_maps) + local MAP_TYPE='id pinned name' + COMPREPLY+=( $( compgen -W "$MAP_TYPE" \ + -- "$cur" ) ) + return 0 + ;; + prog_array) + local PROG_TYPE='id pinned tag name' + COMPREPLY+=( $( compgen -W "$PROG_TYPE" \ + -- "$cur" ) ) + return 0 + ;; + *) + COMPREPLY+=( $( compgen -W 'hex' \ + -- "$cur" ) ) + return 0 + ;; + esac + return 0 + ;; + *) + case $(_bpftool_map_guess_map_type) in + queue|stack) + _bpftool_once_attr 'value' + return 0; + ;; + esac + + _bpftool_once_attr 'key' + local UPDATE_FLAGS='any exist noexist' + for (( idx=3; idx < ${#words[@]}-1; idx++ )); do + if [[ ${words[idx]} == 'value' ]]; then + # 'value' is present, but is not the last + # word i.e. we can now have UPDATE_FLAGS. + _bpftool_one_of_list "$UPDATE_FLAGS" + return 0 + fi + done + for (( idx=3; idx < ${#words[@]}-1; idx++ )); do + if [[ ${words[idx]} == 'key' ]]; then + # 'key' is present, but is not the last + # word i.e. we can now have 'value'. + _bpftool_once_attr 'value' + return 0 + fi + done + + return 0 + ;; + esac + ;; + pin) + case $prev in + $command) + COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) + ;; + id) + _bpftool_get_map_ids + ;; + name) + _bpftool_get_map_names + ;; + esac + return 0 + ;; + event_pipe) + case $prev in + $command) + COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) + return 0 + ;; + id) + _bpftool_get_map_ids_for_type perf_event_array + return 0 + ;; + name) + _bpftool_get_map_names_for_type perf_event_array + return 0 + ;; + cpu) + return 0 + ;; + index) + return 0 + ;; + *) + _bpftool_once_attr 'cpu' + _bpftool_once_attr 'index' + return 0 + ;; + esac + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'delete dump getnext help \ + lookup pin event_pipe show list update create \ + peek push enqueue pop dequeue freeze' -- \ + "$cur" ) ) + ;; + esac + ;; + btf) + local PROG_TYPE='id pinned tag name' + local MAP_TYPE='id pinned name' + case $command in + dump) + case $prev in + $command) + COMPREPLY+=( $( compgen -W "id map prog file" -- \ + "$cur" ) ) + return 0 + ;; + prog) + COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) ) + return 0 + ;; + map) + COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) + return 0 + ;; + id) + case $pprev in + prog) + _bpftool_get_prog_ids + ;; + map) + _bpftool_get_map_ids + ;; + $command) + _bpftool_get_btf_ids + ;; + esac + return 0 + ;; + name) + case $pprev in + prog) + _bpftool_get_prog_names + ;; + map) + _bpftool_get_map_names + ;; + esac + return 0 + ;; + format) + COMPREPLY=( $( compgen -W "c raw" -- "$cur" ) ) + ;; + *) + # emit extra options + case ${words[3]} in + id|file) + _bpftool_once_attr 'format' + ;; + map|prog) + if [[ ${words[3]} == "map" ]] && [[ $cword == 6 ]]; then + COMPREPLY+=( $( compgen -W "key value kv all" -- "$cur" ) ) + fi + _bpftool_once_attr 'format' + ;; + *) + ;; + esac + return 0 + ;; + esac + ;; + show|list) + case $prev in + $command) + COMPREPLY+=( $( compgen -W "id" -- "$cur" ) ) + ;; + id) + _bpftool_get_btf_ids + ;; + esac + return 0 + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'dump help show list' \ + -- "$cur" ) ) + ;; + esac + ;; + gen) + case $command in + object) + _filedir + return 0 + ;; + skeleton) + case $prev in + $command) + _filedir + return 0 + ;; + *) + _bpftool_once_attr 'name' + return 0 + ;; + esac + ;; + subskeleton) + case $prev in + $command) + _filedir + return 0 + ;; + *) + _bpftool_once_attr 'name' + return 0 + ;; + esac + ;; + min_core_btf) + _filedir + return 0 + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'object skeleton subskeleton help min_core_btf' -- "$cur" ) ) + ;; + esac + ;; + cgroup) + case $command in + show|list|tree) + case $cword in + 3) + _filedir + ;; + 4) + COMPREPLY=( $( compgen -W 'effective' -- "$cur" ) ) + ;; + esac + return 0 + ;; + attach|detach) + local BPFTOOL_CGROUP_ATTACH_TYPES="$(bpftool feature list_builtins attach_types 2>/dev/null | \ + grep '^cgroup_')" + local ATTACH_FLAGS='multi override' + local PROG_TYPE='id pinned tag name' + # Check for $prev = $command first + if [ $prev = $command ]; then + _filedir + return 0 + # Then check for attach type. This is done outside of the + # "case $prev in" to avoid writing the whole list of attach + # types again as pattern to match (where we cannot reuse + # our variable). + elif [[ $BPFTOOL_CGROUP_ATTACH_TYPES =~ $prev ]]; then + COMPREPLY=( $( compgen -W "$PROG_TYPE" -- \ + "$cur" ) ) + return 0 + fi + # case/esac for the other cases + case $prev in + id) + _bpftool_get_prog_ids + return 0 + ;; + *) + if ! _bpftool_search_list "$BPFTOOL_CGROUP_ATTACH_TYPES"; then + COMPREPLY=( $( compgen -W \ + "$BPFTOOL_CGROUP_ATTACH_TYPES" -- "$cur" ) ) + elif [[ "$command" == "attach" ]]; then + # We have an attach type on the command line, + # but it is not the previous word, or + # "id|pinned|tag|name" (we already checked for + # that). This should only leave the case when + # we need attach flags for "attach" commamnd. + _bpftool_one_of_list "$ATTACH_FLAGS" + fi + return 0 + ;; + esac + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'help attach detach \ + show list tree' -- "$cur" ) ) + ;; + esac + ;; + perf) + case $command in + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'help \ + show list' -- "$cur" ) ) + ;; + esac + ;; + net) + local PROG_TYPE='id pinned tag name' + local ATTACH_TYPES='xdp xdpgeneric xdpdrv xdpoffload' + case $command in + show|list) + [[ $prev != "$command" ]] && return 0 + COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) ) + return 0 + ;; + attach) + case $cword in + 3) + COMPREPLY=( $( compgen -W "$ATTACH_TYPES" -- "$cur" ) ) + return 0 + ;; + 4) + COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) ) + return 0 + ;; + 5) + case $prev in + id) + _bpftool_get_prog_ids + ;; + name) + _bpftool_get_prog_names + ;; + pinned) + _filedir + ;; + esac + return 0 + ;; + 6) + COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) ) + return 0 + ;; + 8) + _bpftool_once_attr 'overwrite' + return 0 + ;; + esac + ;; + detach) + case $cword in + 3) + COMPREPLY=( $( compgen -W "$ATTACH_TYPES" -- "$cur" ) ) + return 0 + ;; + 4) + COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) ) + return 0 + ;; + esac + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'help \ + show list attach detach' -- "$cur" ) ) + ;; + esac + ;; + feature) + case $command in + probe) + [[ $prev == "prefix" ]] && return 0 + if _bpftool_search_list 'macros'; then + _bpftool_once_attr 'prefix' + else + COMPREPLY+=( $( compgen -W 'macros' -- "$cur" ) ) + fi + _bpftool_one_of_list 'kernel dev' + _bpftool_once_attr 'full unprivileged' + return 0 + ;; + list_builtins) + [[ $prev != "$command" ]] && return 0 + COMPREPLY=( $( compgen -W 'prog_types map_types \ + attach_types link_types helpers' -- "$cur" ) ) + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'help list_builtins probe' -- "$cur" ) ) + ;; + esac + ;; + link) + case $command in + show|list|pin|detach) + case $prev in + id) + _bpftool_get_link_ids + return 0 + ;; + esac + ;; + esac + + local LINK_TYPE='id pinned' + case $command in + show|list) + [[ $prev != "$command" ]] && return 0 + COMPREPLY=( $( compgen -W "$LINK_TYPE" -- "$cur" ) ) + return 0 + ;; + pin|detach) + if [[ $prev == "$command" ]]; then + COMPREPLY=( $( compgen -W "$LINK_TYPE" -- "$cur" ) ) + else + _filedir + fi + return 0 + ;; + *) + [[ $prev == $object ]] && \ + COMPREPLY=( $( compgen -W 'help pin show list' -- "$cur" ) ) + ;; + esac + ;; + esac +} && +complete -F _bpftool bpftool + +# ex: ts=4 sw=4 et filetype=sh diff --git a/bpftool/docs/.gitignore b/bpftool/docs/.gitignore new file mode 100644 index 0000000..3c99250 --- /dev/null +++ b/bpftool/docs/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +bpftool*.8 diff --git a/bpftool/docs/Makefile b/bpftool/docs/Makefile new file mode 100644 index 0000000..8355aea --- /dev/null +++ b/bpftool/docs/Makefile @@ -0,0 +1,60 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +include ../src/Makefile.include + +INSTALL ?= install +RM ?= rm -f +RMDIR ?= rmdir --ignore-fail-on-non-empty + +ifeq ($(V),1) + Q = +else + Q = @ +endif + +prefix ?= /usr/local +mandir ?= $(prefix)/man +man8dir = $(mandir)/man8 + +MAN8_RST = $(wildcard bpftool*.rst) + +_DOC_MAN8 = $(patsubst %.rst,%.8,$(MAN8_RST)) +DOC_MAN8 = $(addprefix $(OUTPUT),$(_DOC_MAN8)) + +man: man8 +man8: $(DOC_MAN8) + +RST2MAN_DEP := $(shell command -v rst2man 2>/dev/null) +RST2MAN_OPTS += --verbose --strip-comments + +list_pages = $(sort $(basename $(filter-out $(1),$(MAN8_RST)))) +see_also = $(subst " ",, \ + "\n" \ + "SEE ALSO\n" \ + "========\n" \ + "\t**bpf**\ (2),\n" \ + "\t**bpf-helpers**\\ (7)" \ + $(foreach page,$(call list_pages,$(1)),",\n\t**$(page)**\\ (8)") \ + "\n") + +$(OUTPUT)%.8: %.rst +ifndef RST2MAN_DEP + $(error "rst2man not found, but required to generate man pages") +endif + $(QUIET_GEN)( cat $< ; printf "%b" $(call see_also,$<) ) | rst2man $(RST2MAN_OPTS) > $@ + +clean: + $(call QUIET_CLEAN, Documentation) + $(Q)$(RM) $(DOC_MAN8) + +install: man + $(call QUIET_INSTALL, Documentation-man) + $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(man8dir) + $(Q)$(INSTALL) -m 644 $(DOC_MAN8) $(DESTDIR)$(man8dir) + +uninstall: + $(call QUIET_UNINST, Documentation-man) + $(Q)$(RM) $(addprefix $(DESTDIR)$(man8dir)/,$(_DOC_MAN8)) + $(Q)$(RMDIR) $(DESTDIR)$(man8dir) + +.PHONY: man man8 clean install uninstall +.DEFAULT_GOAL := man diff --git a/bpftool/docs/bpftool-btf.rst b/bpftool/docs/bpftool-btf.rst new file mode 100644 index 0000000..342716f --- /dev/null +++ b/bpftool/docs/bpftool-btf.rst @@ -0,0 +1,268 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================ +bpftool-btf +================ +------------------------------------------------------------------------------- +tool for inspection of BTF data +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **btf** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| | { **-B** | **--base-btf** } } + + *COMMANDS* := { **dump** | **help** } + +BTF COMMANDS +============= + +| **bpftool** **btf** { **show** | **list** } [**id** *BTF_ID*] +| **bpftool** **btf dump** *BTF_SRC* [**format** *FORMAT*] +| **bpftool** **btf help** +| +| *BTF_SRC* := { **id** *BTF_ID* | **prog** *PROG* | **map** *MAP* [{**key** | **value** | **kv** | **all**}] | **file** *FILE* } +| *FORMAT* := { **raw** | **c** } +| *MAP* := { **id** *MAP_ID* | **pinned** *FILE* } +| *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* } + +DESCRIPTION +=========== + **bpftool btf { show | list }** [**id** *BTF_ID*] + Show information about loaded BTF objects. If a BTF ID is + specified, show information only about given BTF object, + otherwise list all BTF objects currently loaded on the + system. + + Since Linux 5.8 bpftool is able to discover information about + processes that hold open file descriptors (FDs) against BTF + objects. On such kernels bpftool will automatically emit this + information as well. + + **bpftool btf dump** *BTF_SRC* + Dump BTF entries from a given *BTF_SRC*. + + When **id** is specified, BTF object with that ID will be + loaded and all its BTF types emitted. + + When **map** is provided, it's expected that map has + associated BTF object with BTF types describing key and + value. It's possible to select whether to dump only BTF + type(s) associated with key (**key**), value (**value**), + both key and value (**kv**), or all BTF types present in + associated BTF object (**all**). If not specified, **kv** + is assumed. + + When **prog** is provided, it's expected that program has + associated BTF object with BTF types. + + When specifying *FILE*, an ELF file is expected, containing + .BTF section with well-defined BTF binary format data, + typically produced by clang or pahole. + + **format** option can be used to override default (raw) + output format. Raw (**raw**) or C-syntax (**c**) output + formats are supported. + + **bpftool btf help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + + -B, --base-btf *FILE* + Pass a base BTF object. Base BTF objects are typically used + with BTF objects for kernel modules. To avoid duplicating + all kernel symbols required by modules, BTF objects for + modules are "split", they are built incrementally on top of + the kernel (vmlinux) BTF object. So the base BTF reference + should usually point to the kernel BTF. + + When the main BTF object to process (for example, the + module BTF to dump) is passed as a *FILE*, bpftool attempts + to autodetect the path for the base object, and passing + this option is optional. When the main BTF object is passed + through other handles, this option becomes necessary. + +EXAMPLES +======== +**# bpftool btf dump id 1226** + +:: + + [1] PTR '(anon)' type_id=2 + [2] STRUCT 'dummy_tracepoint_args' size=16 vlen=2 + 'pad' type_id=3 bits_offset=0 + 'sock' type_id=4 bits_offset=64 + [3] INT 'long long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none) + [4] PTR '(anon)' type_id=5 + [5] FWD 'sock' fwd_kind=union + +This gives an example of default output for all supported BTF kinds. + +**$ cat prog.c** + +:: + + struct fwd_struct; + + enum my_enum { + VAL1 = 3, + VAL2 = 7, + }; + + typedef struct my_struct my_struct_t; + + struct my_struct { + const unsigned int const_int_field; + int bitfield_field: 4; + char arr_field[16]; + const struct fwd_struct *restrict fwd_field; + enum my_enum enum_field; + volatile my_struct_t *typedef_ptr_field; + }; + + union my_union { + int a; + struct my_struct b; + }; + + struct my_struct struct_global_var __attribute__((section("data_sec"))) = { + .bitfield_field = 3, + .enum_field = VAL1, + }; + int global_var __attribute__((section("data_sec"))) = 7; + + __attribute__((noinline)) + int my_func(union my_union *arg1, int arg2) + { + static int static_var __attribute__((section("data_sec"))) = 123; + static_var++; + return static_var; + } + +**$ bpftool btf dump file prog.o** + +:: + + [1] PTR '(anon)' type_id=2 + [2] UNION 'my_union' size=48 vlen=2 + 'a' type_id=3 bits_offset=0 + 'b' type_id=4 bits_offset=0 + [3] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED + [4] STRUCT 'my_struct' size=48 vlen=6 + 'const_int_field' type_id=5 bits_offset=0 + 'bitfield_field' type_id=3 bits_offset=32 bitfield_size=4 + 'arr_field' type_id=8 bits_offset=40 + 'fwd_field' type_id=10 bits_offset=192 + 'enum_field' type_id=14 bits_offset=256 + 'typedef_ptr_field' type_id=15 bits_offset=320 + [5] CONST '(anon)' type_id=6 + [6] INT 'unsigned int' size=4 bits_offset=0 nr_bits=32 encoding=(none) + [7] INT 'char' size=1 bits_offset=0 nr_bits=8 encoding=SIGNED + [8] ARRAY '(anon)' type_id=7 index_type_id=9 nr_elems=16 + [9] INT '__ARRAY_SIZE_TYPE__' size=4 bits_offset=0 nr_bits=32 encoding=(none) + [10] RESTRICT '(anon)' type_id=11 + [11] PTR '(anon)' type_id=12 + [12] CONST '(anon)' type_id=13 + [13] FWD 'fwd_struct' fwd_kind=union + [14] ENUM 'my_enum' size=4 vlen=2 + 'VAL1' val=3 + 'VAL2' val=7 + [15] PTR '(anon)' type_id=16 + [16] VOLATILE '(anon)' type_id=17 + [17] TYPEDEF 'my_struct_t' type_id=4 + [18] FUNC_PROTO '(anon)' ret_type_id=3 vlen=2 + 'arg1' type_id=1 + 'arg2' type_id=3 + [19] FUNC 'my_func' type_id=18 + [20] VAR 'struct_global_var' type_id=4, linkage=global-alloc + [21] VAR 'global_var' type_id=3, linkage=global-alloc + [22] VAR 'my_func.static_var' type_id=3, linkage=static + [23] DATASEC 'data_sec' size=0 vlen=3 + type_id=20 offset=0 size=48 + type_id=21 offset=0 size=4 + type_id=22 offset=52 size=4 + +The following commands print BTF types associated with specified map's key, +value, both key and value, and all BTF types, respectively. By default, both +key and value types will be printed. + +**# bpftool btf dump map id 123 key** + +:: + + [39] TYPEDEF 'u32' type_id=37 + +**# bpftool btf dump map id 123 value** + +:: + + [86] PTR '(anon)' type_id=87 + +**# bpftool btf dump map id 123 kv** + +:: + + [39] TYPEDEF 'u32' type_id=37 + [86] PTR '(anon)' type_id=87 + +**# bpftool btf dump map id 123 all** + +:: + + [1] PTR '(anon)' type_id=0 + . + . + . + [2866] ARRAY '(anon)' type_id=52 index_type_id=51 nr_elems=4 + +All the standard ways to specify map or program are supported: + +**# bpftool btf dump map id 123** + +**# bpftool btf dump map pinned /sys/fs/bpf/map_name** + +**# bpftool btf dump prog id 456** + +**# bpftool btf dump prog tag b88e0a09b1d9759d** + +**# bpftool btf dump prog pinned /sys/fs/bpf/prog_name** + +| +| **# bpftool btf dump file /sys/kernel/btf/i2c_smbus** +| (or) +| **# I2C_SMBUS_ID=$(bpftool btf show -p | jq '.[] | select(.name=="i2c_smbus").id')** +| **# bpftool btf dump id ${I2C_SMBUS_ID} -B /sys/kernel/btf/vmlinux** + +:: + + [104848] STRUCT 'i2c_smbus_alert' size=40 vlen=2 + 'alert' type_id=393 bits_offset=0 + 'ara' type_id=56050 bits_offset=256 + [104849] STRUCT 'alert_data' size=12 vlen=3 + 'addr' type_id=16 bits_offset=0 + 'type' type_id=56053 bits_offset=32 + 'data' type_id=7 bits_offset=64 + [104850] PTR '(anon)' type_id=104848 + [104851] PTR '(anon)' type_id=104849 + [104852] FUNC 'i2c_register_spd' type_id=84745 linkage=static + [104853] FUNC 'smbalert_driver_init' type_id=1213 linkage=static + [104854] FUNC_PROTO '(anon)' ret_type_id=18 vlen=1 + 'ara' type_id=56050 + [104855] FUNC 'i2c_handle_smbus_alert' type_id=104854 linkage=static + [104856] FUNC 'smbalert_remove' type_id=104854 linkage=static + [104857] FUNC_PROTO '(anon)' ret_type_id=18 vlen=2 + 'ara' type_id=56050 + 'id' type_id=56056 + [104858] FUNC 'smbalert_probe' type_id=104857 linkage=static + [104859] FUNC 'smbalert_work' type_id=9695 linkage=static + [104860] FUNC 'smbus_alert' type_id=71367 linkage=static + [104861] FUNC 'smbus_do_alert' type_id=84827 linkage=static diff --git a/bpftool/docs/bpftool-cgroup.rst b/bpftool/docs/bpftool-cgroup.rst new file mode 100644 index 0000000..bd015ec --- /dev/null +++ b/bpftool/docs/bpftool-cgroup.rst @@ -0,0 +1,157 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================ +bpftool-cgroup +================ +------------------------------------------------------------------------------- +tool for inspection and simple manipulation of eBPF progs +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **cgroup** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| | { **-f** | **--bpffs** } } + + *COMMANDS* := + { **show** | **list** | **tree** | **attach** | **detach** | **help** } + +CGROUP COMMANDS +=============== + +| **bpftool** **cgroup** { **show** | **list** } *CGROUP* [**effective**] +| **bpftool** **cgroup tree** [*CGROUP_ROOT*] [**effective**] +| **bpftool** **cgroup attach** *CGROUP* *ATTACH_TYPE* *PROG* [*ATTACH_FLAGS*] +| **bpftool** **cgroup detach** *CGROUP* *ATTACH_TYPE* *PROG* +| **bpftool** **cgroup help** +| +| *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* } +| *ATTACH_TYPE* := { **cgroup_inet_ingress** | **cgroup_inet_egress** | +| **cgroup_inet_sock_create** | **cgroup_sock_ops** | +| **cgroup_device** | **cgroup_inet4_bind** | **cgroup_inet6_bind** | +| **cgroup_inet4_post_bind** | **cgroup_inet6_post_bind** | +| **cgroup_inet4_connect** | **cgroup_inet6_connect** | +| **cgroup_inet4_getpeername** | **cgroup_inet6_getpeername** | +| **cgroup_inet4_getsockname** | **cgroup_inet6_getsockname** | +| **cgroup_udp4_sendmsg** | **cgroup_udp6_sendmsg** | +| **cgroup_udp4_recvmsg** | **cgroup_udp6_recvmsg** | +| **cgroup_sysctl** | **cgroup_getsockopt** | **cgroup_setsockopt** | +| **cgroup_inet_sock_release** } +| *ATTACH_FLAGS* := { **multi** | **override** } + +DESCRIPTION +=========== + **bpftool cgroup { show | list }** *CGROUP* [**effective**] + List all programs attached to the cgroup *CGROUP*. + + Output will start with program ID followed by attach type, + attach flags and program name. + + If **effective** is specified retrieve effective programs that + will execute for events within a cgroup. This includes + inherited along with attached ones. + + **bpftool cgroup tree** [*CGROUP_ROOT*] [**effective**] + Iterate over all cgroups in *CGROUP_ROOT* and list all + attached programs. If *CGROUP_ROOT* is not specified, + bpftool uses cgroup v2 mountpoint. + + The output is similar to the output of cgroup show/list + commands: it starts with absolute cgroup path, followed by + program ID, attach type, attach flags and program name. + + If **effective** is specified retrieve effective programs that + will execute for events within a cgroup. This includes + inherited along with attached ones. + + **bpftool cgroup attach** *CGROUP* *ATTACH_TYPE* *PROG* [*ATTACH_FLAGS*] + Attach program *PROG* to the cgroup *CGROUP* with attach type + *ATTACH_TYPE* and optional *ATTACH_FLAGS*. + + *ATTACH_FLAGS* can be one of: **override** if a sub-cgroup installs + some bpf program, the program in this cgroup yields to sub-cgroup + program; **multi** if a sub-cgroup installs some bpf program, + that cgroup program gets run in addition to the program in this + cgroup. + + Only one program is allowed to be attached to a cgroup with + no attach flags or the **override** flag. Attaching another + program will release old program and attach the new one. + + Multiple programs are allowed to be attached to a cgroup with + **multi**. They are executed in FIFO order (those that were + attached first, run first). + + Non-default *ATTACH_FLAGS* are supported by kernel version 4.14 + and later. + + *ATTACH_TYPE* can be on of: + **ingress** ingress path of the inet socket (since 4.10); + **egress** egress path of the inet socket (since 4.10); + **sock_create** opening of an inet socket (since 4.10); + **sock_ops** various socket operations (since 4.12); + **device** device access (since 4.15); + **bind4** call to bind(2) for an inet4 socket (since 4.17); + **bind6** call to bind(2) for an inet6 socket (since 4.17); + **post_bind4** return from bind(2) for an inet4 socket (since 4.17); + **post_bind6** return from bind(2) for an inet6 socket (since 4.17); + **connect4** call to connect(2) for an inet4 socket (since 4.17); + **connect6** call to connect(2) for an inet6 socket (since 4.17); + **sendmsg4** call to sendto(2), sendmsg(2), sendmmsg(2) for an + unconnected udp4 socket (since 4.18); + **sendmsg6** call to sendto(2), sendmsg(2), sendmmsg(2) for an + unconnected udp6 socket (since 4.18); + **recvmsg4** call to recvfrom(2), recvmsg(2), recvmmsg(2) for + an unconnected udp4 socket (since 5.2); + **recvmsg6** call to recvfrom(2), recvmsg(2), recvmmsg(2) for + an unconnected udp6 socket (since 5.2); + **sysctl** sysctl access (since 5.2); + **getsockopt** call to getsockopt (since 5.3); + **setsockopt** call to setsockopt (since 5.3); + **getpeername4** call to getpeername(2) for an inet4 socket (since 5.8); + **getpeername6** call to getpeername(2) for an inet6 socket (since 5.8); + **getsockname4** call to getsockname(2) for an inet4 socket (since 5.8); + **getsockname6** call to getsockname(2) for an inet6 socket (since 5.8). + **sock_release** closing an userspace inet socket (since 5.9). + + **bpftool cgroup detach** *CGROUP* *ATTACH_TYPE* *PROG* + Detach *PROG* from the cgroup *CGROUP* and attach type + *ATTACH_TYPE*. + + **bpftool prog help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + + -f, --bpffs + Show file names of pinned programs. + +EXAMPLES +======== +| +| **# mount -t bpf none /sys/fs/bpf/** +| **# mkdir /sys/fs/cgroup/test.slice** +| **# bpftool prog load ./device_cgroup.o /sys/fs/bpf/prog** +| **# bpftool cgroup attach /sys/fs/cgroup/test.slice/ device id 1 allow_multi** + +**# bpftool cgroup list /sys/fs/cgroup/test.slice/** + +:: + + ID AttachType AttachFlags Name + 1 device allow_multi bpf_prog1 + +| +| **# bpftool cgroup detach /sys/fs/cgroup/test.slice/ device id 1** +| **# bpftool cgroup list /sys/fs/cgroup/test.slice/** + +:: + + ID AttachType AttachFlags Name diff --git a/bpftool/docs/bpftool-feature.rst b/bpftool/docs/bpftool-feature.rst new file mode 100644 index 0000000..e44039f --- /dev/null +++ b/bpftool/docs/bpftool-feature.rst @@ -0,0 +1,90 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +=============== +bpftool-feature +=============== +------------------------------------------------------------------------------- +tool for inspection of eBPF-related parameters for Linux kernel or net device +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **feature** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| } + + *COMMANDS* := { **probe** | **help** } + +FEATURE COMMANDS +================ + +| **bpftool** **feature probe** [*COMPONENT*] [**full**] [**unprivileged**] [**macros** [**prefix** *PREFIX*]] +| **bpftool** **feature list_builtins** *GROUP* +| **bpftool** **feature help** +| +| *COMPONENT* := { **kernel** | **dev** *NAME* } +| *GROUP* := { **prog_types** | **map_types** | **attach_types** | **link_types** | **helpers** } + +DESCRIPTION +=========== + **bpftool feature probe** [**kernel**] [**full**] [**macros** [**prefix** *PREFIX*]] + Probe the running kernel and dump a number of eBPF-related + parameters, such as availability of the **bpf**\ () system call, + JIT status, eBPF program types availability, eBPF helper + functions availability, and more. + + By default, bpftool **does not run probes** for + **bpf_probe_write_user**\ () and **bpf_trace_printk**\() + helpers which print warnings to kernel logs. To enable them + and run all probes, the **full** keyword should be used. + + If the **macros** keyword (but not the **-j** option) is + passed, a subset of the output is dumped as a list of + **#define** macros that are ready to be included in a C + header file, for example. If, additionally, **prefix** is + used to define a *PREFIX*, the provided string will be used + as a prefix to the names of the macros: this can be used to + avoid conflicts on macro names when including the output of + this command as a header file. + + Keyword **kernel** can be omitted. If no probe target is + specified, probing the kernel is the default behaviour. + + When the **unprivileged** keyword is used, bpftool will dump + only the features available to a user who does not have the + **CAP_SYS_ADMIN** capability set. The features available in + that case usually represent a small subset of the parameters + supported by the system. Unprivileged users MUST use the + **unprivileged** keyword: This is to avoid misdetection if + bpftool is inadvertently run as non-root, for example. This + keyword is unavailable if bpftool was compiled without + libcap. + + **bpftool feature probe dev** *NAME* [**full**] [**macros** [**prefix** *PREFIX*]] + Probe network device for supported eBPF features and dump + results to the console. + + The keywords **full**, **macros** and **prefix** have the + same role as when probing the kernel. + + **bpftool feature list_builtins** *GROUP* + List items known to bpftool. These can be BPF program types + (**prog_types**), BPF map types (**map_types**), attach types + (**attach_types**), link types (**link_types**), or BPF helper + functions (**helpers**). The command does not probe the system, but + simply lists the elements that bpftool knows from compilation time, + as provided from libbpf (for all object types) or from the BPF UAPI + header (list of helpers). This can be used in scripts to iterate over + BPF types or helpers. + + **bpftool feature help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst diff --git a/bpftool/docs/bpftool-gen.rst b/bpftool/docs/bpftool-gen.rst new file mode 100644 index 0000000..68454ef --- /dev/null +++ b/bpftool/docs/bpftool-gen.rst @@ -0,0 +1,446 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================ +bpftool-gen +================ +------------------------------------------------------------------------------- +tool for BPF code-generation +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **gen** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| | { **-L** | **--use-loader** } } + + *COMMAND* := { **object** | **skeleton** | **help** } + +GEN COMMANDS +============= + +| **bpftool** **gen object** *OUTPUT_FILE* *INPUT_FILE* [*INPUT_FILE*...] +| **bpftool** **gen skeleton** *FILE* [**name** *OBJECT_NAME*] +| **bpftool** **gen subskeleton** *FILE* [**name** *OBJECT_NAME*] +| **bpftool** **gen min_core_btf** *INPUT* *OUTPUT* *OBJECT* [*OBJECT*...] +| **bpftool** **gen help** + +DESCRIPTION +=========== + **bpftool gen object** *OUTPUT_FILE* *INPUT_FILE* [*INPUT_FILE*...] + Statically link (combine) together one or more *INPUT_FILE*'s + into a single resulting *OUTPUT_FILE*. All the files involved + are BPF ELF object files. + + The rules of BPF static linking are mostly the same as for + user-space object files, but in addition to combining data + and instruction sections, .BTF and .BTF.ext (if present in + any of the input files) data are combined together. .BTF + data is deduplicated, so all the common types across + *INPUT_FILE*'s will only be represented once in the resulting + BTF information. + + BPF static linking allows to partition BPF source code into + individually compiled files that are then linked into + a single resulting BPF object file, which can be used to + generated BPF skeleton (with **gen skeleton** command) or + passed directly into **libbpf** (using **bpf_object__open()** + family of APIs). + + **bpftool gen skeleton** *FILE* + Generate BPF skeleton C header file for a given *FILE*. + + BPF skeleton is an alternative interface to existing libbpf + APIs for working with BPF objects. Skeleton code is intended + to significantly shorten and simplify code to load and work + with BPF programs from userspace side. Generated code is + tailored to specific input BPF object *FILE*, reflecting its + structure by listing out available maps, program, variables, + etc. Skeleton eliminates the need to lookup mentioned + components by name. Instead, if skeleton instantiation + succeeds, they are populated in skeleton structure as valid + libbpf types (e.g., **struct bpf_map** pointer) and can be + passed to existing generic libbpf APIs. + + In addition to simple and reliable access to maps and + programs, skeleton provides a storage for BPF links (**struct + bpf_link**) for each BPF program within BPF object. When + requested, supported BPF programs will be automatically + attached and resulting BPF links stored for further use by + user in pre-allocated fields in skeleton struct. For BPF + programs that can't be automatically attached by libbpf, + user can attach them manually, but store resulting BPF link + in per-program link field. All such set up links will be + automatically destroyed on BPF skeleton destruction. This + eliminates the need for users to manage links manually and + rely on libbpf support to detach programs and free up + resources. + + Another facility provided by BPF skeleton is an interface to + global variables of all supported kinds: mutable, read-only, + as well as extern ones. This interface allows to pre-setup + initial values of variables before BPF object is loaded and + verified by kernel. For non-read-only variables, the same + interface can be used to fetch values of global variables on + userspace side, even if they are modified by BPF code. + + During skeleton generation, contents of source BPF object + *FILE* is embedded within generated code and is thus not + necessary to keep around. This ensures skeleton and BPF + object file are matching 1-to-1 and always stay in sync. + Generated code is dual-licensed under LGPL-2.1 and + BSD-2-Clause licenses. + + It is a design goal and guarantee that skeleton interfaces + are interoperable with generic libbpf APIs. User should + always be able to use skeleton API to create and load BPF + object, and later use libbpf APIs to keep working with + specific maps, programs, etc. + + As part of skeleton, few custom functions are generated. + Each of them is prefixed with object name. Object name can + either be derived from object file name, i.e., if BPF object + file name is **example.o**, BPF object name will be + **example**. Object name can be also specified explicitly + through **name** *OBJECT_NAME* parameter. The following + custom functions are provided (assuming **example** as + the object name): + + - **example__open** and **example__open_opts**. + These functions are used to instantiate skeleton. It + corresponds to libbpf's **bpf_object__open**\ () API. + **_opts** variants accepts extra **bpf_object_open_opts** + options. + + - **example__load**. + This function creates maps, loads and verifies BPF + programs, initializes global data maps. It corresponds to + libppf's **bpf_object__load**\ () API. + + - **example__open_and_load** combines **example__open** and + **example__load** invocations in one commonly used + operation. + + - **example__attach** and **example__detach** + This pair of functions allow to attach and detach, + correspondingly, already loaded BPF object. Only BPF + programs of types supported by libbpf for auto-attachment + will be auto-attached and their corresponding BPF links + instantiated. For other BPF programs, user can manually + create a BPF link and assign it to corresponding fields in + skeleton struct. **example__detach** will detach both + links created automatically, as well as those populated by + user manually. + + - **example__destroy** + Detach and unload BPF programs, free up all the resources + used by skeleton and BPF object. + + If BPF object has global variables, corresponding structs + with memory layout corresponding to global data data section + layout will be created. Currently supported ones are: *.data*, + *.bss*, *.rodata*, and *.kconfig* structs/data sections. + These data sections/structs can be used to set up initial + values of variables, if set before **example__load**. + Afterwards, if target kernel supports memory-mapped BPF + arrays, same structs can be used to fetch and update + (non-read-only) data from userspace, with same simplicity + as for BPF side. + + **bpftool gen subskeleton** *FILE* + Generate BPF subskeleton C header file for a given *FILE*. + + Subskeletons are similar to skeletons, except they do not own + the corresponding maps, programs, or global variables. They + require that the object file used to generate them is already + loaded into a *bpf_object* by some other means. + + This functionality is useful when a library is included into a + larger BPF program. A subskeleton for the library would have + access to all objects and globals defined in it, without + having to know about the larger program. + + Consequently, there are only two functions defined + for subskeletons: + + - **example__open(bpf_object\*)** + Instantiates a subskeleton from an already opened (but not + necessarily loaded) **bpf_object**. + + - **example__destroy()** + Frees the storage for the subskeleton but *does not* unload + any BPF programs or maps. + + **bpftool** **gen min_core_btf** *INPUT* *OUTPUT* *OBJECT* [*OBJECT*...] + Generate a minimum BTF file as *OUTPUT*, derived from a given + *INPUT* BTF file, containing all needed BTF types so one, or + more, given eBPF objects CO-RE relocations may be satisfied. + + When kernels aren't compiled with CONFIG_DEBUG_INFO_BTF, + libbpf, when loading an eBPF object, has to rely on external + BTF files to be able to calculate CO-RE relocations. + + Usually, an external BTF file is built from existing kernel + DWARF data using pahole. It contains all the types used by + its respective kernel image and, because of that, is big. + + The min_core_btf feature builds smaller BTF files, customized + to one or multiple eBPF objects, so they can be distributed + together with an eBPF CO-RE based application, turning the + application portable to different kernel versions. + + Check examples bellow for more information how to use it. + + **bpftool gen help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + + -L, --use-loader + For skeletons, generate a "light" skeleton (also known as "loader" + skeleton). A light skeleton contains a loader eBPF program. It does + not use the majority of the libbpf infrastructure, and does not need + libelf. + +EXAMPLES +======== +**$ cat example1.bpf.c** + +:: + + #include + #include + #include + #include + + const volatile int param1 = 42; + bool global_flag = true; + struct { int x; } data = {}; + + SEC("raw_tp/sys_enter") + int handle_sys_enter(struct pt_regs *ctx) + { + static long my_static_var; + if (global_flag) + my_static_var++; + else + data.x += param1; + return 0; + } + +**$ cat example2.bpf.c** + +:: + + #include + #include + #include + + struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 128); + __type(key, int); + __type(value, long); + } my_map SEC(".maps"); + + SEC("raw_tp/sys_exit") + int handle_sys_exit(struct pt_regs *ctx) + { + int zero = 0; + bpf_map_lookup_elem(&my_map, &zero); + return 0; + } + +This is example BPF application with two BPF programs and a mix of BPF maps +and global variables. Source code is split across two source code files. + +**$ clang -target bpf -g example1.bpf.c -o example1.bpf.o** + +**$ clang -target bpf -g example2.bpf.c -o example2.bpf.o** + +**$ bpftool gen object example.bpf.o example1.bpf.o example2.bpf.o** + +This set of commands compiles *example1.bpf.c* and *example2.bpf.c* +individually and then statically links respective object files into the final +BPF ELF object file *example.bpf.o*. + +**$ bpftool gen skeleton example.bpf.o name example | tee example.skel.h** + +:: + + /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + + /* THIS FILE IS AUTOGENERATED! */ + #ifndef __EXAMPLE_SKEL_H__ + #define __EXAMPLE_SKEL_H__ + + #include + #include + + struct example { + struct bpf_object_skeleton *skeleton; + struct bpf_object *obj; + struct { + struct bpf_map *rodata; + struct bpf_map *data; + struct bpf_map *bss; + struct bpf_map *my_map; + } maps; + struct { + struct bpf_program *handle_sys_enter; + struct bpf_program *handle_sys_exit; + } progs; + struct { + struct bpf_link *handle_sys_enter; + struct bpf_link *handle_sys_exit; + } links; + struct example__bss { + struct { + int x; + } data; + } *bss; + struct example__data { + _Bool global_flag; + long int handle_sys_enter_my_static_var; + } *data; + struct example__rodata { + int param1; + } *rodata; + }; + + static void example__destroy(struct example *obj); + static inline struct example *example__open_opts( + const struct bpf_object_open_opts *opts); + static inline struct example *example__open(); + static inline int example__load(struct example *obj); + static inline struct example *example__open_and_load(); + static inline int example__attach(struct example *obj); + static inline void example__detach(struct example *obj); + + #endif /* __EXAMPLE_SKEL_H__ */ + +**$ cat example.c** + +:: + + #include "example.skel.h" + + int main() + { + struct example *skel; + int err = 0; + + skel = example__open(); + if (!skel) + goto cleanup; + + skel->rodata->param1 = 128; + + err = example__load(skel); + if (err) + goto cleanup; + + err = example__attach(skel); + if (err) + goto cleanup; + + /* all libbpf APIs are usable */ + printf("my_map name: %s\n", bpf_map__name(skel->maps.my_map)); + printf("sys_enter prog FD: %d\n", + bpf_program__fd(skel->progs.handle_sys_enter)); + + /* detach and re-attach sys_exit program */ + bpf_link__destroy(skel->links.handle_sys_exit); + skel->links.handle_sys_exit = + bpf_program__attach(skel->progs.handle_sys_exit); + + printf("my_static_var: %ld\n", + skel->bss->handle_sys_enter_my_static_var); + + cleanup: + example__destroy(skel); + return err; + } + +**# ./example** + +:: + + my_map name: my_map + sys_enter prog FD: 8 + my_static_var: 7 + +This is a stripped-out version of skeleton generated for above example code. + +min_core_btf +------------ + +**$ bpftool btf dump file 5.4.0-example.btf format raw** + +:: + + [1] INT 'long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none) + [2] CONST '(anon)' type_id=1 + [3] VOLATILE '(anon)' type_id=1 + [4] ARRAY '(anon)' type_id=1 index_type_id=21 nr_elems=2 + [5] PTR '(anon)' type_id=8 + [6] CONST '(anon)' type_id=5 + [7] INT 'char' size=1 bits_offset=0 nr_bits=8 encoding=(none) + [8] CONST '(anon)' type_id=7 + [9] INT 'unsigned int' size=4 bits_offset=0 nr_bits=32 encoding=(none) + + +**$ bpftool btf dump file one.bpf.o format raw** + +:: + + [1] PTR '(anon)' type_id=2 + [2] STRUCT 'trace_event_raw_sys_enter' size=64 vlen=4 + 'ent' type_id=3 bits_offset=0 + 'id' type_id=7 bits_offset=64 + 'args' type_id=9 bits_offset=128 + '__data' type_id=12 bits_offset=512 + [3] STRUCT 'trace_entry' size=8 vlen=4 + 'type' type_id=4 bits_offset=0 + 'flags' type_id=5 bits_offset=16 + 'preempt_count' type_id=5 bits_offset=24 + + +**$ bpftool gen min_core_btf 5.4.0-example.btf 5.4.0-smaller.btf one.bpf.o** + +**$ bpftool btf dump file 5.4.0-smaller.btf format raw** + +:: + + [1] TYPEDEF 'pid_t' type_id=6 + [2] STRUCT 'trace_event_raw_sys_enter' size=64 vlen=1 + 'args' type_id=4 bits_offset=128 + [3] STRUCT 'task_struct' size=9216 vlen=2 + 'pid' type_id=1 bits_offset=17920 + 'real_parent' type_id=7 bits_offset=18048 + [4] ARRAY '(anon)' type_id=5 index_type_id=8 nr_elems=6 + [5] INT 'long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none) + [6] TYPEDEF '__kernel_pid_t' type_id=8 + [7] PTR '(anon)' type_id=3 + [8] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED + + +Now, the "5.4.0-smaller.btf" file may be used by libbpf as an external BTF file +when loading the "one.bpf.o" object into the "5.4.0-example" kernel. Note that +the generated BTF file won't allow other eBPF objects to be loaded, just the +ones given to min_core_btf. + +:: + + LIBBPF_OPTS(bpf_object_open_opts, opts, .btf_custom_path = "5.4.0-smaller.btf"); + struct bpf_object *obj; + + obj = bpf_object__open_file("one.bpf.o", &opts); + + ... diff --git a/bpftool/docs/bpftool-iter.rst b/bpftool/docs/bpftool-iter.rst new file mode 100644 index 0000000..84839d4 --- /dev/null +++ b/bpftool/docs/bpftool-iter.rst @@ -0,0 +1,76 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +============ +bpftool-iter +============ +------------------------------------------------------------------------------- +tool to create BPF iterators +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **iter** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| } + + *COMMANDS* := { **pin** | **help** } + +ITER COMMANDS +=================== + +| **bpftool** **iter pin** *OBJ* *PATH* [**map** *MAP*] +| **bpftool** **iter help** +| +| *OBJ* := /a/file/of/bpf_iter_target.o +| *MAP* := { **id** *MAP_ID* | **pinned** *FILE* } + +DESCRIPTION +=========== + **bpftool iter pin** *OBJ* *PATH* [**map** *MAP*] + A bpf iterator combines a kernel iterating of + particular kernel data (e.g., tasks, bpf_maps, etc.) + and a bpf program called for each kernel data object + (e.g., one task, one bpf_map, etc.). User space can + *read* kernel iterator output through *read()* syscall. + + The *pin* command creates a bpf iterator from *OBJ*, + and pin it to *PATH*. The *PATH* should be located + in *bpffs* mount. It must not contain a dot + character ('.'), which is reserved for future extensions + of *bpffs*. + + Map element bpf iterator requires an additional parameter + *MAP* so bpf program can iterate over map elements for + that map. User can have a bpf program in kernel to run + with each map element, do checking, filtering, aggregation, + etc. without copying data to user space. + + User can then *cat PATH* to see the bpf iterator output. + + **bpftool iter help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + +EXAMPLES +======== +**# bpftool iter pin bpf_iter_netlink.o /sys/fs/bpf/my_netlink** + +:: + + Create a file-based bpf iterator from bpf_iter_netlink.o and pin it + to /sys/fs/bpf/my_netlink + +**# bpftool iter pin bpf_iter_hashmap.o /sys/fs/bpf/my_hashmap map id 20** + +:: + + Create a file-based bpf iterator from bpf_iter_hashmap.o and map with + id 20, and pin it to /sys/fs/bpf/my_hashmap diff --git a/bpftool/docs/bpftool-link.rst b/bpftool/docs/bpftool-link.rst new file mode 100644 index 0000000..52a4eee --- /dev/null +++ b/bpftool/docs/bpftool-link.rst @@ -0,0 +1,112 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================ +bpftool-link +================ +------------------------------------------------------------------------------- +tool for inspection and simple manipulation of eBPF links +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **link** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| | { **-f** | **--bpffs** } | { **-n** | **--nomount** } } + + *COMMANDS* := { **show** | **list** | **pin** | **help** } + +LINK COMMANDS +============= + +| **bpftool** **link { show | list }** [*LINK*] +| **bpftool** **link pin** *LINK* *FILE* +| **bpftool** **link detach** *LINK* +| **bpftool** **link help** +| +| *LINK* := { **id** *LINK_ID* | **pinned** *FILE* } + + +DESCRIPTION +=========== + **bpftool link { show | list }** [*LINK*] + Show information about active links. If *LINK* is + specified show information only about given link, + otherwise list all links currently active on the system. + + Output will start with link ID followed by link type and + zero or more named attributes, some of which depend on type + of link. + + Since Linux 5.8 bpftool is able to discover information about + processes that hold open file descriptors (FDs) against BPF + links. On such kernels bpftool will automatically emit this + information as well. + + **bpftool link pin** *LINK* *FILE* + Pin link *LINK* as *FILE*. + + Note: *FILE* must be located in *bpffs* mount. It must not + contain a dot character ('.'), which is reserved for future + extensions of *bpffs*. + + **bpftool link detach** *LINK* + Force-detach link *LINK*. BPF link and its underlying BPF + program will stay valid, but they will be detached from the + respective BPF hook and BPF link will transition into + a defunct state until last open file descriptor for that + link is closed. + + **bpftool link help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + + -f, --bpffs + When showing BPF links, show file names of pinned + links. + + -n, --nomount + Do not automatically attempt to mount any virtual file system + (such as tracefs or BPF virtual file system) when necessary. + +EXAMPLES +======== +**# bpftool link show** + +:: + + 10: cgroup prog 25 + cgroup_id 614 attach_type egress + pids test_progs(223) + +**# bpftool --json --pretty link show** + +:: + + [{ + "type": "cgroup", + "prog_id": 25, + "cgroup_id": 614, + "attach_type": "egress", + "pids": [{ + "pid": 223, + "comm": "test_progs" + } + ] + } + ] + +| +| **# bpftool link pin id 10 /sys/fs/bpf/link** +| **# ls -l /sys/fs/bpf/** + +:: + + -rw------- 1 root root 0 Apr 23 21:39 link diff --git a/bpftool/docs/bpftool-map.rst b/bpftool/docs/bpftool-map.rst new file mode 100644 index 0000000..11250c4 --- /dev/null +++ b/bpftool/docs/bpftool-map.rst @@ -0,0 +1,277 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================ +bpftool-map +================ +------------------------------------------------------------------------------- +tool for inspection and simple manipulation of eBPF maps +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **map** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| | { **-f** | **--bpffs** } | { **-n** | **--nomount** } } + + *COMMANDS* := + { **show** | **list** | **create** | **dump** | **update** | **lookup** | **getnext** | + **delete** | **pin** | **help** } + +MAP COMMANDS +============= + +| **bpftool** **map** { **show** | **list** } [*MAP*] +| **bpftool** **map create** *FILE* **type** *TYPE* **key** *KEY_SIZE* **value** *VALUE_SIZE* \ +| **entries** *MAX_ENTRIES* **name** *NAME* [**flags** *FLAGS*] [**inner_map** *MAP*] \ +| [**dev** *NAME*] +| **bpftool** **map dump** *MAP* +| **bpftool** **map update** *MAP* [**key** *DATA*] [**value** *VALUE*] [*UPDATE_FLAGS*] +| **bpftool** **map lookup** *MAP* [**key** *DATA*] +| **bpftool** **map getnext** *MAP* [**key** *DATA*] +| **bpftool** **map delete** *MAP* **key** *DATA* +| **bpftool** **map pin** *MAP* *FILE* +| **bpftool** **map event_pipe** *MAP* [**cpu** *N* **index** *M*] +| **bpftool** **map peek** *MAP* +| **bpftool** **map push** *MAP* **value** *VALUE* +| **bpftool** **map pop** *MAP* +| **bpftool** **map enqueue** *MAP* **value** *VALUE* +| **bpftool** **map dequeue** *MAP* +| **bpftool** **map freeze** *MAP* +| **bpftool** **map help** +| +| *MAP* := { **id** *MAP_ID* | **pinned** *FILE* | **name** *MAP_NAME* } +| *DATA* := { [**hex**] *BYTES* } +| *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* | **name** *PROG_NAME* } +| *VALUE* := { *DATA* | *MAP* | *PROG* } +| *UPDATE_FLAGS* := { **any** | **exist** | **noexist** } +| *TYPE* := { **hash** | **array** | **prog_array** | **perf_event_array** | **percpu_hash** +| | **percpu_array** | **stack_trace** | **cgroup_array** | **lru_hash** +| | **lru_percpu_hash** | **lpm_trie** | **array_of_maps** | **hash_of_maps** +| | **devmap** | **devmap_hash** | **sockmap** | **cpumap** | **xskmap** | **sockhash** +| | **cgroup_storage** | **reuseport_sockarray** | **percpu_cgroup_storage** +| | **queue** | **stack** | **sk_storage** | **struct_ops** | **ringbuf** | **inode_storage** +| | **task_storage** | **bloom_filter** | **user_ringbuf** | **cgrp_storage** } + +DESCRIPTION +=========== + **bpftool map { show | list }** [*MAP*] + Show information about loaded maps. If *MAP* is specified + show information only about given maps, otherwise list all + maps currently loaded on the system. In case of **name**, + *MAP* may match several maps which will all be shown. + + Output will start with map ID followed by map type and + zero or more named attributes (depending on kernel version). + + Since Linux 5.8 bpftool is able to discover information about + processes that hold open file descriptors (FDs) against BPF + maps. On such kernels bpftool will automatically emit this + information as well. + + **bpftool map create** *FILE* **type** *TYPE* **key** *KEY_SIZE* **value** *VALUE_SIZE* **entries** *MAX_ENTRIES* **name** *NAME* [**flags** *FLAGS*] [**inner_map** *MAP*] [**dev** *NAME*] + Create a new map with given parameters and pin it to *bpffs* + as *FILE*. + + *FLAGS* should be an integer which is the combination of + desired flags, e.g. 1024 for **BPF_F_MMAPABLE** (see bpf.h + UAPI header for existing flags). + + To create maps of type array-of-maps or hash-of-maps, the + **inner_map** keyword must be used to pass an inner map. The + kernel needs it to collect metadata related to the inner maps + that the new map will work with. + + Keyword **dev** expects a network interface name, and is used + to request hardware offload for the map. + + **bpftool map dump** *MAP* + Dump all entries in a given *MAP*. In case of **name**, + *MAP* may match several maps which will all be dumped. + + **bpftool map update** *MAP* [**key** *DATA*] [**value** *VALUE*] [*UPDATE_FLAGS*] + Update map entry for a given *KEY*. + + *UPDATE_FLAGS* can be one of: **any** update existing entry + or add if doesn't exit; **exist** update only if entry already + exists; **noexist** update only if entry doesn't exist. + + If the **hex** keyword is provided in front of the bytes + sequence, the bytes are parsed as hexadecimal values, even if + no "0x" prefix is added. If the keyword is not provided, then + the bytes are parsed as decimal values, unless a "0x" prefix + (for hexadecimal) or a "0" prefix (for octal) is provided. + + **bpftool map lookup** *MAP* [**key** *DATA*] + Lookup **key** in the map. + + **bpftool map getnext** *MAP* [**key** *DATA*] + Get next key. If *key* is not specified, get first key. + + **bpftool map delete** *MAP* **key** *DATA* + Remove entry from the map. + + **bpftool map pin** *MAP* *FILE* + Pin map *MAP* as *FILE*. + + Note: *FILE* must be located in *bpffs* mount. It must not + contain a dot character ('.'), which is reserved for future + extensions of *bpffs*. + + **bpftool** **map event_pipe** *MAP* [**cpu** *N* **index** *M*] + Read events from a **BPF_MAP_TYPE_PERF_EVENT_ARRAY** map. + + Install perf rings into a perf event array map and dump + output of any **bpf_perf_event_output**\ () call in the kernel. + By default read the number of CPUs on the system and + install perf ring for each CPU in the corresponding index + in the array. + + If **cpu** and **index** are specified, install perf ring + for given **cpu** at **index** in the array (single ring). + + Note that installing a perf ring into an array will silently + replace any existing ring. Any other application will stop + receiving events if it installed its rings earlier. + + **bpftool map peek** *MAP* + Peek next value in the queue or stack. + + **bpftool map push** *MAP* **value** *VALUE* + Push *VALUE* onto the stack. + + **bpftool map pop** *MAP* + Pop and print value from the stack. + + **bpftool map enqueue** *MAP* **value** *VALUE* + Enqueue *VALUE* into the queue. + + **bpftool map dequeue** *MAP* + Dequeue and print value from the queue. + + **bpftool map freeze** *MAP* + Freeze the map as read-only from user space. Entries from a + frozen map can not longer be updated or deleted with the + **bpf**\ () system call. This operation is not reversible, + and the map remains immutable from user space until its + destruction. However, read and write permissions for BPF + programs to the map remain unchanged. + + **bpftool map help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + + -f, --bpffs + Show file names of pinned maps. + + -n, --nomount + Do not automatically attempt to mount any virtual file system + (such as tracefs or BPF virtual file system) when necessary. + +EXAMPLES +======== +**# bpftool map show** + +:: + + 10: hash name some_map flags 0x0 + key 4B value 8B max_entries 2048 memlock 167936B + pids systemd(1) + +The following three commands are equivalent: + +| +| **# bpftool map update id 10 key hex 20 c4 b7 00 value hex 0f ff ff ab 01 02 03 4c** +| **# bpftool map update id 10 key 0x20 0xc4 0xb7 0x00 value 0x0f 0xff 0xff 0xab 0x01 0x02 0x03 0x4c** +| **# bpftool map update id 10 key 32 196 183 0 value 15 255 255 171 1 2 3 76** + +**# bpftool map lookup id 10 key 0 1 2 3** + +:: + + key: 00 01 02 03 value: 00 01 02 03 04 05 06 07 + + +**# bpftool map dump id 10** + +:: + + key: 00 01 02 03 value: 00 01 02 03 04 05 06 07 + key: 0d 00 07 00 value: 02 00 00 00 01 02 03 04 + Found 2 elements + +**# bpftool map getnext id 10 key 0 1 2 3** + +:: + + key: + 00 01 02 03 + next key: + 0d 00 07 00 + +| +| **# mount -t bpf none /sys/fs/bpf/** +| **# bpftool map pin id 10 /sys/fs/bpf/map** +| **# bpftool map del pinned /sys/fs/bpf/map key 13 00 07 00** + +Note that map update can also be used in order to change the program references +hold by a program array map. This can be used, for example, to change the +programs used for tail-call jumps at runtime, without having to reload the +entry-point program. Below is an example for this use case: we load a program +defining a prog array map, and with a main function that contains a tail call +to other programs that can be used either to "process" packets or to "debug" +processing. Note that the prog array map MUST be pinned into the BPF virtual +file system for the map update to work successfully, as kernel flushes prog +array maps when they have no more references from user space (and the update +would be lost as soon as bpftool exits). + +| +| **# bpftool prog loadall tail_calls.o /sys/fs/bpf/foo type xdp** +| **# bpftool prog --bpffs** + +:: + + 545: xdp name main_func tag 674b4b5597193dc3 gpl + loaded_at 2018-12-12T15:02:58+0000 uid 0 + xlated 240B jited 257B memlock 4096B map_ids 294 + pinned /sys/fs/bpf/foo/xdp + 546: xdp name bpf_func_process tag e369a529024751fc gpl + loaded_at 2018-12-12T15:02:58+0000 uid 0 + xlated 200B jited 164B memlock 4096B + pinned /sys/fs/bpf/foo/process + 547: xdp name bpf_func_debug tag 0b597868bc7f0976 gpl + loaded_at 2018-12-12T15:02:58+0000 uid 0 + xlated 200B jited 164B memlock 4096B + pinned /sys/fs/bpf/foo/debug + +**# bpftool map** + +:: + + 294: prog_array name jmp_table flags 0x0 + key 4B value 4B max_entries 1 memlock 4096B + owner_prog_type xdp owner jited + +| +| **# bpftool map pin id 294 /sys/fs/bpf/bar** +| **# bpftool map dump pinned /sys/fs/bpf/bar** + +:: + + Found 0 elements + +| +| **# bpftool map update pinned /sys/fs/bpf/bar key 0 0 0 0 value pinned /sys/fs/bpf/foo/debug** +| **# bpftool map dump pinned /sys/fs/bpf/bar** + +:: + + key: 00 00 00 00 value: 22 02 00 00 + Found 1 element diff --git a/bpftool/docs/bpftool-net.rst b/bpftool/docs/bpftool-net.rst new file mode 100644 index 0000000..f4e0a51 --- /dev/null +++ b/bpftool/docs/bpftool-net.rst @@ -0,0 +1,178 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================ +bpftool-net +================ +------------------------------------------------------------------------------- +tool for inspection of netdev/tc related bpf prog attachments +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **net** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| } + + *COMMANDS* := + { **show** | **list** | **attach** | **detach** | **help** } + +NET COMMANDS +============ + +| **bpftool** **net** { **show** | **list** } [ **dev** *NAME* ] +| **bpftool** **net attach** *ATTACH_TYPE* *PROG* **dev** *NAME* [ **overwrite** ] +| **bpftool** **net detach** *ATTACH_TYPE* **dev** *NAME* +| **bpftool** **net help** +| +| *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* } +| *ATTACH_TYPE* := { **xdp** | **xdpgeneric** | **xdpdrv** | **xdpoffload** } + +DESCRIPTION +=========== + **bpftool net { show | list }** [ **dev** *NAME* ] + List bpf program attachments in the kernel networking subsystem. + + Currently, only device driver xdp attachments and tc filter + classification/action attachments are implemented, i.e., for + program types **BPF_PROG_TYPE_SCHED_CLS**, + **BPF_PROG_TYPE_SCHED_ACT** and **BPF_PROG_TYPE_XDP**. + For programs attached to a particular cgroup, e.g., + **BPF_PROG_TYPE_CGROUP_SKB**, **BPF_PROG_TYPE_CGROUP_SOCK**, + **BPF_PROG_TYPE_SOCK_OPS** and **BPF_PROG_TYPE_CGROUP_SOCK_ADDR**, + users can use **bpftool cgroup** to dump cgroup attachments. + For sk_{filter, skb, msg, reuseport} and lwt/seg6 + bpf programs, users should consult other tools, e.g., iproute2. + + The current output will start with all xdp program attachments, followed by + all tc class/qdisc bpf program attachments. Both xdp programs and + tc programs are ordered based on ifindex number. If multiple bpf + programs attached to the same networking device through **tc filter**, + the order will be first all bpf programs attached to tc classes, then + all bpf programs attached to non clsact qdiscs, and finally all + bpf programs attached to root and clsact qdisc. + + **bpftool** **net attach** *ATTACH_TYPE* *PROG* **dev** *NAME* [ **overwrite** ] + Attach bpf program *PROG* to network interface *NAME* with + type specified by *ATTACH_TYPE*. Previously attached bpf program + can be replaced by the command used with **overwrite** option. + Currently, only XDP-related modes are supported for *ATTACH_TYPE*. + + *ATTACH_TYPE* can be of: + **xdp** - try native XDP and fallback to generic XDP if NIC driver does not support it; + **xdpgeneric** - Generic XDP. runs at generic XDP hook when packet already enters receive path as skb; + **xdpdrv** - Native XDP. runs earliest point in driver's receive path; + **xdpoffload** - Offload XDP. runs directly on NIC on each packet reception; + + **bpftool** **net detach** *ATTACH_TYPE* **dev** *NAME* + Detach bpf program attached to network interface *NAME* with + type specified by *ATTACH_TYPE*. To detach bpf program, same + *ATTACH_TYPE* previously used for attach must be specified. + Currently, only XDP-related modes are supported for *ATTACH_TYPE*. + + **bpftool net help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + +EXAMPLES +======== + +| **# bpftool net** + +:: + + xdp: + eth0(2) driver id 198 + + tc: + eth0(2) htb name prefix_matcher.o:[cls_prefix_matcher_htb] id 111727 act [] + eth0(2) clsact/ingress fbflow_icmp id 130246 act [] + eth0(2) clsact/egress prefix_matcher.o:[cls_prefix_matcher_clsact] id 111726 + eth0(2) clsact/egress cls_fg_dscp id 108619 act [] + eth0(2) clsact/egress fbflow_egress id 130245 + +| +| **# bpftool -jp net** + +:: + + [{ + "xdp": [{ + "devname": "eth0", + "ifindex": 2, + "mode": "driver", + "id": 198 + } + ], + "tc": [{ + "devname": "eth0", + "ifindex": 2, + "kind": "htb", + "name": "prefix_matcher.o:[cls_prefix_matcher_htb]", + "id": 111727, + "act": [] + },{ + "devname": "eth0", + "ifindex": 2, + "kind": "clsact/ingress", + "name": "fbflow_icmp", + "id": 130246, + "act": [] + },{ + "devname": "eth0", + "ifindex": 2, + "kind": "clsact/egress", + "name": "prefix_matcher.o:[cls_prefix_matcher_clsact]", + "id": 111726, + },{ + "devname": "eth0", + "ifindex": 2, + "kind": "clsact/egress", + "name": "cls_fg_dscp", + "id": 108619, + "act": [] + },{ + "devname": "eth0", + "ifindex": 2, + "kind": "clsact/egress", + "name": "fbflow_egress", + "id": 130245, + } + ] + } + ] + +| +| **# bpftool net attach xdpdrv id 16 dev enp6s0np0** +| **# bpftool net** + +:: + + xdp: + enp6s0np0(4) driver id 16 + +| +| **# bpftool net attach xdpdrv id 16 dev enp6s0np0** +| **# bpftool net attach xdpdrv id 20 dev enp6s0np0 overwrite** +| **# bpftool net** + +:: + + xdp: + enp6s0np0(4) driver id 20 + +| +| **# bpftool net attach xdpdrv id 16 dev enp6s0np0** +| **# bpftool net detach xdpdrv dev enp6s0np0** +| **# bpftool net** + +:: + + xdp: diff --git a/bpftool/docs/bpftool-perf.rst b/bpftool/docs/bpftool-perf.rst new file mode 100644 index 0000000..5fea633 --- /dev/null +++ b/bpftool/docs/bpftool-perf.rst @@ -0,0 +1,69 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================ +bpftool-perf +================ +------------------------------------------------------------------------------- +tool for inspection of perf related bpf prog attachments +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **perf** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| } + + *COMMANDS* := + { **show** | **list** | **help** } + +PERF COMMANDS +============= + +| **bpftool** **perf** { **show** | **list** } +| **bpftool** **perf help** + +DESCRIPTION +=========== + **bpftool perf { show | list }** + List all raw_tracepoint, tracepoint, kprobe attachment in the system. + + Output will start with process id and file descriptor in that process, + followed by bpf program id, attachment information, and attachment point. + The attachment point for raw_tracepoint/tracepoint is the trace probe name. + The attachment point for k[ret]probe is either symbol name and offset, + or a kernel virtual address. + The attachment point for u[ret]probe is the file name and the file offset. + + **bpftool perf help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + +EXAMPLES +======== + +| **# bpftool perf** + +:: + + pid 21711 fd 5: prog_id 5 kprobe func __x64_sys_write offset 0 + pid 21765 fd 5: prog_id 7 kretprobe func __x64_sys_nanosleep offset 0 + pid 21767 fd 5: prog_id 8 tracepoint sys_enter_nanosleep + pid 21800 fd 5: prog_id 9 uprobe filename /home/yhs/a.out offset 1159 + +| +| **# bpftool -j perf** + +:: + + [{"pid":21711,"fd":5,"prog_id":5,"fd_type":"kprobe","func":"__x64_sys_write","offset":0}, \ + {"pid":21765,"fd":5,"prog_id":7,"fd_type":"kretprobe","func":"__x64_sys_nanosleep","offset":0}, \ + {"pid":21767,"fd":5,"prog_id":8,"fd_type":"tracepoint","tracepoint":"sys_enter_nanosleep"}, \ + {"pid":21800,"fd":5,"prog_id":9,"fd_type":"uprobe","filename":"/home/yhs/a.out","offset":1159}] diff --git a/bpftool/docs/bpftool-prog.rst b/bpftool/docs/bpftool-prog.rst new file mode 100644 index 0000000..14de725 --- /dev/null +++ b/bpftool/docs/bpftool-prog.rst @@ -0,0 +1,374 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================ +bpftool-prog +================ +------------------------------------------------------------------------------- +tool for inspection and simple manipulation of eBPF progs +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **prog** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| | + { **-f** | **--bpffs** } | { **-m** | **--mapcompat** } | { **-n** | **--nomount** } | + { **-L** | **--use-loader** } } + + *COMMANDS* := + { **show** | **list** | **dump xlated** | **dump jited** | **pin** | **load** | + **loadall** | **help** } + +PROG COMMANDS +============= + +| **bpftool** **prog** { **show** | **list** } [*PROG*] +| **bpftool** **prog dump xlated** *PROG* [{**file** *FILE* | **opcodes** | **visual** | **linum**}] +| **bpftool** **prog dump jited** *PROG* [{**file** *FILE* | **opcodes** | **linum**}] +| **bpftool** **prog pin** *PROG* *FILE* +| **bpftool** **prog** { **load** | **loadall** } *OBJ* *PATH* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*] [**pinmaps** *MAP_DIR*] [**autoattach**] +| **bpftool** **prog attach** *PROG* *ATTACH_TYPE* [*MAP*] +| **bpftool** **prog detach** *PROG* *ATTACH_TYPE* [*MAP*] +| **bpftool** **prog tracelog** +| **bpftool** **prog run** *PROG* **data_in** *FILE* [**data_out** *FILE* [**data_size_out** *L*]] [**ctx_in** *FILE* [**ctx_out** *FILE* [**ctx_size_out** *M*]]] [**repeat** *N*] +| **bpftool** **prog profile** *PROG* [**duration** *DURATION*] *METRICs* +| **bpftool** **prog help** +| +| *MAP* := { **id** *MAP_ID* | **pinned** *FILE* } +| *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* | **name** *PROG_NAME* } +| *TYPE* := { +| **socket** | **kprobe** | **kretprobe** | **classifier** | **action** | +| **tracepoint** | **raw_tracepoint** | **xdp** | **perf_event** | **cgroup/skb** | +| **cgroup/sock** | **cgroup/dev** | **lwt_in** | **lwt_out** | **lwt_xmit** | +| **lwt_seg6local** | **sockops** | **sk_skb** | **sk_msg** | **lirc_mode2** | +| **cgroup/bind4** | **cgroup/bind6** | **cgroup/post_bind4** | **cgroup/post_bind6** | +| **cgroup/connect4** | **cgroup/connect6** | **cgroup/getpeername4** | **cgroup/getpeername6** | +| **cgroup/getsockname4** | **cgroup/getsockname6** | **cgroup/sendmsg4** | **cgroup/sendmsg6** | +| **cgroup/recvmsg4** | **cgroup/recvmsg6** | **cgroup/sysctl** | +| **cgroup/getsockopt** | **cgroup/setsockopt** | **cgroup/sock_release** | +| **struct_ops** | **fentry** | **fexit** | **freplace** | **sk_lookup** +| } +| *ATTACH_TYPE* := { +| **sk_msg_verdict** | **sk_skb_verdict** | **sk_skb_stream_verdict** | +| **sk_skb_stream_parser** | **flow_dissector** +| } +| *METRICs* := { +| **cycles** | **instructions** | **l1d_loads** | **llc_misses** | +| **itlb_misses** | **dtlb_misses** +| } + + +DESCRIPTION +=========== + **bpftool prog { show | list }** [*PROG*] + Show information about loaded programs. If *PROG* is + specified show information only about given programs, + otherwise list all programs currently loaded on the system. + In case of **tag** or **name**, *PROG* may match several + programs which will all be shown. + + Output will start with program ID followed by program type and + zero or more named attributes (depending on kernel version). + + Since Linux 5.1 the kernel can collect statistics on BPF + programs (such as the total time spent running the program, + and the number of times it was run). If available, bpftool + shows such statistics. However, the kernel does not collect + them by defaults, as it slightly impacts performance on each + program run. Activation or deactivation of the feature is + performed via the **kernel.bpf_stats_enabled** sysctl knob. + + Since Linux 5.8 bpftool is able to discover information about + processes that hold open file descriptors (FDs) against BPF + programs. On such kernels bpftool will automatically emit this + information as well. + + **bpftool prog dump xlated** *PROG* [{ **file** *FILE* | **opcodes** | **visual** | **linum** }] + Dump eBPF instructions of the programs from the kernel. By + default, eBPF will be disassembled and printed to standard + output in human-readable format. In this case, **opcodes** + controls if raw opcodes should be printed as well. + + In case of **tag** or **name**, *PROG* may match several + programs which will all be dumped. However, if **file** or + **visual** is specified, *PROG* must match a single program. + + If **file** is specified, the binary image will instead be + written to *FILE*. + + If **visual** is specified, control flow graph (CFG) will be + built instead, and eBPF instructions will be presented with + CFG in DOT format, on standard output. + + If the programs have line_info available, the source line will + be displayed by default. If **linum** is specified, + the filename, line number and line column will also be + displayed on top of the source line. + + **bpftool prog dump jited** *PROG* [{ **file** *FILE* | **opcodes** | **linum** }] + Dump jited image (host machine code) of the program. + + If *FILE* is specified image will be written to a file, + otherwise it will be disassembled and printed to stdout. + *PROG* must match a single program when **file** is specified. + + **opcodes** controls if raw opcodes will be printed. + + If the prog has line_info available, the source line will + be displayed by default. If **linum** is specified, + the filename, line number and line column will also be + displayed on top of the source line. + + **bpftool prog pin** *PROG* *FILE* + Pin program *PROG* as *FILE*. + + Note: *FILE* must be located in *bpffs* mount. It must not + contain a dot character ('.'), which is reserved for future + extensions of *bpffs*. + + **bpftool prog { load | loadall }** *OBJ* *PATH* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*] [**pinmaps** *MAP_DIR*] [**autoattach**] + Load bpf program(s) from binary *OBJ* and pin as *PATH*. + **bpftool prog load** pins only the first program from the + *OBJ* as *PATH*. **bpftool prog loadall** pins all programs + from the *OBJ* under *PATH* directory. + **type** is optional, if not specified program type will be + inferred from section names. + By default bpftool will create new maps as declared in the ELF + object being loaded. **map** parameter allows for the reuse + of existing maps. It can be specified multiple times, each + time for a different map. *IDX* refers to index of the map + to be replaced in the ELF file counting from 0, while *NAME* + allows to replace a map by name. *MAP* specifies the map to + use, referring to it by **id** or through a **pinned** file. + If **dev** *NAME* is specified program will be loaded onto + given networking device (offload). + Optional **pinmaps** argument can be provided to pin all + maps under *MAP_DIR* directory. + + If **autoattach** is specified program will be attached + before pin. In that case, only the link (representing the + program attached to its hook) is pinned, not the program as + such, so the path won't show in **bpftool prog show -f**, + only show in **bpftool link show -f**. Also, this only works + when bpftool (libbpf) is able to infer all necessary + information from the object file, in particular, it's not + supported for all program types. If a program does not + support autoattach, bpftool falls back to regular pinning + for that program instead. + + Note: *PATH* must be located in *bpffs* mount. It must not + contain a dot character ('.'), which is reserved for future + extensions of *bpffs*. + + **bpftool prog attach** *PROG* *ATTACH_TYPE* [*MAP*] + Attach bpf program *PROG* (with type specified by + *ATTACH_TYPE*). Most *ATTACH_TYPEs* require a *MAP* + parameter, with the exception of *flow_dissector* which is + attached to current networking name space. + + **bpftool prog detach** *PROG* *ATTACH_TYPE* [*MAP*] + Detach bpf program *PROG* (with type specified by + *ATTACH_TYPE*). Most *ATTACH_TYPEs* require a *MAP* + parameter, with the exception of *flow_dissector* which is + detached from the current networking name space. + + **bpftool prog tracelog** + Dump the trace pipe of the system to the console (stdout). + Hit to stop printing. BPF programs can write to this + trace pipe at runtime with the **bpf_trace_printk**\ () helper. + This should be used only for debugging purposes. For + streaming data from BPF programs to user space, one can use + perf events (see also **bpftool-map**\ (8)). + + **bpftool prog run** *PROG* **data_in** *FILE* [**data_out** *FILE* [**data_size_out** *L*]] [**ctx_in** *FILE* [**ctx_out** *FILE* [**ctx_size_out** *M*]]] [**repeat** *N*] + Run BPF program *PROG* in the kernel testing infrastructure + for BPF, meaning that the program works on the data and + context provided by the user, and not on actual packets or + monitored functions etc. Return value and duration for the + test run are printed out to the console. + + Input data is read from the *FILE* passed with **data_in**. + If this *FILE* is "**-**", input data is read from standard + input. Input context, if any, is read from *FILE* passed with + **ctx_in**. Again, "**-**" can be used to read from standard + input, but only if standard input is not already in use for + input data. If a *FILE* is passed with **data_out**, output + data is written to that file. Similarly, output context is + written to the *FILE* passed with **ctx_out**. For both + output flows, "**-**" can be used to print to the standard + output (as plain text, or JSON if relevant option was + passed). If output keywords are omitted, output data and + context are discarded. Keywords **data_size_out** and + **ctx_size_out** are used to pass the size (in bytes) for the + output buffers to the kernel, although the default of 32 kB + should be more than enough for most cases. + + Keyword **repeat** is used to indicate the number of + consecutive runs to perform. Note that output data and + context printed to files correspond to the last of those + runs. The duration printed out at the end of the runs is an + average over all runs performed by the command. + + Not all program types support test run. Among those which do, + not all of them can take the **ctx_in**/**ctx_out** + arguments. bpftool does not perform checks on program types. + + **bpftool prog profile** *PROG* [**duration** *DURATION*] *METRICs* + Profile *METRICs* for bpf program *PROG* for *DURATION* + seconds or until user hits . *DURATION* is optional. + If *DURATION* is not specified, the profiling will run up to + **UINT_MAX** seconds. + + **bpftool prog help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + + -f, --bpffs + When showing BPF programs, show file names of pinned + programs. + + -m, --mapcompat + Allow loading maps with unknown map definitions. + + -n, --nomount + Do not automatically attempt to mount any virtual file system + (such as tracefs or BPF virtual file system) when necessary. + + -L, --use-loader + Load program as a "loader" program. This is useful to debug + the generation of such programs. When this option is in + use, bpftool attempts to load the programs from the object + file into the kernel, but does not pin them (therefore, the + *PATH* must not be provided). + + When combined with the **-d**\ \|\ **--debug** option, + additional debug messages are generated, and the execution + of the loader program will use the **bpf_trace_printk**\ () + helper to log each step of loading BTF, creating the maps, + and loading the programs (see **bpftool prog tracelog** as + a way to dump those messages). + +EXAMPLES +======== +**# bpftool prog show** + +:: + + 10: xdp name some_prog tag 005a3d2123620c8b gpl run_time_ns 81632 run_cnt 10 + loaded_at 2017-09-29T20:11:00+0000 uid 0 + xlated 528B jited 370B memlock 4096B map_ids 10 + pids systemd(1) + +**# bpftool --json --pretty prog show** + +:: + + [{ + "id": 10, + "type": "xdp", + "tag": "005a3d2123620c8b", + "gpl_compatible": true, + "run_time_ns": 81632, + "run_cnt": 10, + "loaded_at": 1506715860, + "uid": 0, + "bytes_xlated": 528, + "jited": true, + "bytes_jited": 370, + "bytes_memlock": 4096, + "map_ids": [10 + ], + "pids": [{ + "pid": 1, + "comm": "systemd" + } + ] + } + ] + +| +| **# bpftool prog dump xlated id 10 file /tmp/t** +| **$ ls -l /tmp/t** + +:: + + -rw------- 1 root root 560 Jul 22 01:42 /tmp/t + +**# bpftool prog dump jited tag 005a3d2123620c8b** + +:: + + 0: push %rbp + 1: mov %rsp,%rbp + 2: sub $0x228,%rsp + 3: sub $0x28,%rbp + 4: mov %rbx,0x0(%rbp) + +| +| **# mount -t bpf none /sys/fs/bpf/** +| **# bpftool prog pin id 10 /sys/fs/bpf/prog** +| **# bpftool prog load ./my_prog.o /sys/fs/bpf/prog2** +| **# ls -l /sys/fs/bpf/** + +:: + + -rw------- 1 root root 0 Jul 22 01:43 prog + -rw------- 1 root root 0 Jul 22 01:44 prog2 + +**# bpftool prog dump jited pinned /sys/fs/bpf/prog opcodes** + +:: + + 0: push %rbp + 55 + 1: mov %rsp,%rbp + 48 89 e5 + 4: sub $0x228,%rsp + 48 81 ec 28 02 00 00 + b: sub $0x28,%rbp + 48 83 ed 28 + f: mov %rbx,0x0(%rbp) + 48 89 5d 00 + +| +| **# bpftool prog load xdp1_kern.o /sys/fs/bpf/xdp1 type xdp map name rxcnt id 7** +| **# bpftool prog show pinned /sys/fs/bpf/xdp1** + +:: + + 9: xdp name xdp_prog1 tag 539ec6ce11b52f98 gpl + loaded_at 2018-06-25T16:17:31-0700 uid 0 + xlated 488B jited 336B memlock 4096B map_ids 7 + +**# rm /sys/fs/bpf/xdp1** + +| +| **# bpftool prog profile id 337 duration 10 cycles instructions llc_misses** + +:: + + 51397 run_cnt + 40176203 cycles (83.05%) + 42518139 instructions # 1.06 insns per cycle (83.39%) + 123 llc_misses # 2.89 LLC misses per million insns (83.15%) + +| +| Output below is for the trace logs. +| Run in separate terminals: +| **# bpftool prog tracelog** +| **# bpftool prog load -L -d file.o** + +:: + + bpftool-620059 [004] d... 2634685.517903: bpf_trace_printk: btf_load size 665 r=5 + bpftool-620059 [004] d... 2634685.517912: bpf_trace_printk: map_create sample_map idx 0 type 2 value_size 4 value_btf_id 0 r=6 + bpftool-620059 [004] d... 2634685.517997: bpf_trace_printk: prog_load sample insn_cnt 13 r=7 + bpftool-620059 [004] d... 2634685.517999: bpf_trace_printk: close(5) = 0 diff --git a/bpftool/docs/bpftool-struct_ops.rst b/bpftool/docs/bpftool-struct_ops.rst new file mode 100644 index 0000000..ee53a12 --- /dev/null +++ b/bpftool/docs/bpftool-struct_ops.rst @@ -0,0 +1,88 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================== +bpftool-struct_ops +================== +------------------------------------------------------------------------------- +tool to register/unregister/introspect BPF struct_ops +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] **struct_ops** *COMMAND* + + *OPTIONS* := { |COMMON_OPTIONS| } + + *COMMANDS* := + { **show** | **list** | **dump** | **register** | **unregister** | **help** } + +STRUCT_OPS COMMANDS +=================== + +| **bpftool** **struct_ops { show | list }** [*STRUCT_OPS_MAP*] +| **bpftool** **struct_ops dump** [*STRUCT_OPS_MAP*] +| **bpftool** **struct_ops register** *OBJ* +| **bpftool** **struct_ops unregister** *STRUCT_OPS_MAP* +| **bpftool** **struct_ops help** +| +| *STRUCT_OPS_MAP* := { **id** *STRUCT_OPS_MAP_ID* | **name** *STRUCT_OPS_MAP_NAME* } +| *OBJ* := /a/file/of/bpf_struct_ops.o + + +DESCRIPTION +=========== + **bpftool struct_ops { show | list }** [*STRUCT_OPS_MAP*] + Show brief information about the struct_ops in the system. + If *STRUCT_OPS_MAP* is specified, it shows information only + for the given struct_ops. Otherwise, it lists all struct_ops + currently existing in the system. + + Output will start with struct_ops map ID, followed by its map + name and its struct_ops's kernel type. + + **bpftool struct_ops dump** [*STRUCT_OPS_MAP*] + Dump details information about the struct_ops in the system. + If *STRUCT_OPS_MAP* is specified, it dumps information only + for the given struct_ops. Otherwise, it dumps all struct_ops + currently existing in the system. + + **bpftool struct_ops register** *OBJ* + Register bpf struct_ops from *OBJ*. All struct_ops under + the ELF section ".struct_ops" will be registered to + its kernel subsystem. + + **bpftool struct_ops unregister** *STRUCT_OPS_MAP* + Unregister the *STRUCT_OPS_MAP* from the kernel subsystem. + + **bpftool struct_ops help** + Print short help message. + +OPTIONS +======= + .. include:: common_options.rst + +EXAMPLES +======== +**# bpftool struct_ops show** + +:: + + 100: dctcp tcp_congestion_ops + 105: cubic tcp_congestion_ops + +**# bpftool struct_ops unregister id 105** + +:: + + Unregistered tcp_congestion_ops cubic id 105 + +**# bpftool struct_ops register bpf_cubic.o** + +:: + + Registered tcp_congestion_ops cubic id 110 diff --git a/bpftool/docs/bpftool.rst b/bpftool/docs/bpftool.rst new file mode 100644 index 0000000..6965c94 --- /dev/null +++ b/bpftool/docs/bpftool.rst @@ -0,0 +1,70 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +================ +BPFTOOL +================ +------------------------------------------------------------------------------- +tool for inspection and simple manipulation of eBPF programs and maps +------------------------------------------------------------------------------- + +:Manual section: 8 + +.. include:: substitutions.rst + +SYNOPSIS +======== + + **bpftool** [*OPTIONS*] *OBJECT* { *COMMAND* | **help** } + + **bpftool** **batch file** *FILE* + + **bpftool** **version** + + *OBJECT* := { **map** | **program** | **link** | **cgroup** | **perf** | **net** | **feature** | + **btf** | **gen** | **struct_ops** | **iter** } + + *OPTIONS* := { { **-V** | **--version** } | |COMMON_OPTIONS| } + + *MAP-COMMANDS* := + { **show** | **list** | **create** | **dump** | **update** | **lookup** | **getnext** | + **delete** | **pin** | **event_pipe** | **help** } + + *PROG-COMMANDS* := { **show** | **list** | **dump jited** | **dump xlated** | **pin** | + **load** | **attach** | **detach** | **help** } + + *LINK-COMMANDS* := { **show** | **list** | **pin** | **detach** | **help** } + + *CGROUP-COMMANDS* := { **show** | **list** | **attach** | **detach** | **help** } + + *PERF-COMMANDS* := { **show** | **list** | **help** } + + *NET-COMMANDS* := { **show** | **list** | **help** } + + *FEATURE-COMMANDS* := { **probe** | **help** } + + *BTF-COMMANDS* := { **show** | **list** | **dump** | **help** } + + *GEN-COMMANDS* := { **object** | **skeleton** | **min_core_btf** | **help** } + + *STRUCT-OPS-COMMANDS* := { **show** | **list** | **dump** | **register** | **unregister** | **help** } + + *ITER-COMMANDS* := { **pin** | **help** } + +DESCRIPTION +=========== + *bpftool* allows for inspection and simple modification of BPF objects + on the system. + + Note that format of the output of all tools is not guaranteed to be + stable and should not be depended upon. + +OPTIONS +======= + .. include:: common_options.rst + + -m, --mapcompat + Allow loading maps with unknown map definitions. + + -n, --nomount + Do not automatically attempt to mount any virtual file system + (such as tracefs or BPF virtual file system) when necessary. diff --git a/bpftool/docs/common_options.rst b/bpftool/docs/common_options.rst new file mode 100644 index 0000000..30df7a7 --- /dev/null +++ b/bpftool/docs/common_options.rst @@ -0,0 +1,25 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +-h, --help + Print short help message (similar to **bpftool help**). + +-V, --version + Print bpftool's version number (similar to **bpftool version**), the + number of the libbpf version in use, and optional features that were + included when bpftool was compiled. Optional features include linking + against LLVM or libbfd to provide the disassembler for JIT-ted + programs (**bpftool prog dump jited**) and usage of BPF skeletons + (some features like **bpftool prog profile** or showing pids + associated to BPF objects may rely on it). + +-j, --json + Generate JSON output. For commands that cannot produce JSON, this + option has no effect. + +-p, --pretty + Generate human-readable JSON output. Implies **-j**. + +-d, --debug + Print all logs available, even debug-level information. This includes + logs from libbpf as well as from the verifier, when attempting to + load programs. diff --git a/bpftool/docs/substitutions.rst b/bpftool/docs/substitutions.rst new file mode 100644 index 0000000..827e3ff --- /dev/null +++ b/bpftool/docs/substitutions.rst @@ -0,0 +1,3 @@ +.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +.. |COMMON_OPTIONS| replace:: { **-j** | **--json** } [{ **-p** | **--pretty** }] | { **-d** | **--debug** } diff --git a/bpftool/include/linux/bitops.h b/bpftool/include/linux/bitops.h new file mode 100644 index 0000000..b4d3926 --- /dev/null +++ b/bpftool/include/linux/bitops.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef _LINUX_BITOPS_H_ +#define _LINUX_BITOPS_H_ + +#ifndef BITS_PER_LONG +# define BITS_PER_LONG __WORDSIZE +#endif + +#define BITS_PER_BYTE 8 + +#endif diff --git a/bpftool/include/linux/build_bug.h b/bpftool/include/linux/build_bug.h new file mode 100644 index 0000000..f26967c --- /dev/null +++ b/bpftool/include/linux/build_bug.h @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef _LINUX_BUILD_BUG_H +#define _LINUX_BUILD_BUG_H + +#include + +/* + * Force a compilation error if condition is true, but also produce a + * result (of value 0 and type int), so the expression can be used + * e.g. in a structure initializer (or where-ever else comma expressions + * aren't permitted). + */ +#define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { int:(-!!(e)); }))) + +/** + * BUILD_BUG_ON_MSG - break compile if a condition is true & emit supplied + * error message. + * @condition: the condition which the compiler should know is false. + * + * See BUILD_BUG_ON for description. + */ +#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) + +/** + * BUILD_BUG_ON - break compile if a condition is true. + * @condition: the condition which the compiler should know is false. + * + * If you have some code which relies on certain constants being equal, or + * some other compile-time-evaluated condition, you should use BUILD_BUG_ON to + * detect if someone changes it. + */ +#define BUILD_BUG_ON(condition) \ + BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition) + +/** + * BUILD_BUG - break compile if used. + * + * If you have some code that you expect the compiler to eliminate at + * build time, you should use BUILD_BUG to detect if it is + * unexpectedly used. + */ +#define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed") + +#endif diff --git a/bpftool/include/linux/compiler-gcc.h b/bpftool/include/linux/compiler-gcc.h new file mode 100644 index 0000000..e7f6808 --- /dev/null +++ b/bpftool/include/linux/compiler-gcc.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef _LINUX_COMPILER_H_ +#error "Please don't include directly, include instead." +#endif + +/* + * Common definitions for all gcc versions go here. + */ +#ifndef GCC_VERSION +#define GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +#endif + +#if __has_attribute(__error__) +# define __compiletime_error(message) __attribute__((error(message))) +#endif + +/* &a[0] degrades to a pointer: a different type from an array */ +#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) +#ifndef __noreturn +#define __noreturn __attribute__((noreturn)) +#endif +#define __printf(a, b) __attribute__((format(printf, a, b))) diff --git a/bpftool/include/linux/compiler.h b/bpftool/include/linux/compiler.h new file mode 100644 index 0000000..e9a2ce4 --- /dev/null +++ b/bpftool/include/linux/compiler.h @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef _LINUX_COMPILER_H_ +#define _LINUX_COMPILER_H_ + +#include + +#if defined(__OPTIMIZE__) && __has_attribute(__error__) +# define __compiletime_assert(condition, msg, prefix, suffix) \ + do { \ + extern void prefix ## suffix(void) __compiletime_error(msg); \ + if (!(condition)) \ + prefix ## suffix(); \ + } while (0) +#else +# define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0) +#endif + +#define _compiletime_assert(condition, msg, prefix, suffix) \ + __compiletime_assert(condition, msg, prefix, suffix) + +/** + * compiletime_assert - break build and emit msg if condition is false + * @condition: a compile-time constant condition to check + * @msg: a message to emit if condition is false + * + * In tradition of POSIX assert, this macro will break the build if the + * supplied condition is *false*, emitting the supplied error message if the + * compiler has support to do so. + */ +#define compiletime_assert(condition, msg) \ + _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) + +/* Are two types/vars the same type (ignoring qualifiers)? */ +#ifndef __same_type +# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) +#endif + +#ifndef __maybe_unused +# define __maybe_unused __attribute__((unused)) +#endif + +#ifndef __weak +# define __weak __attribute__((weak)) +#endif + +#endif diff --git a/bpftool/include/linux/compiler_types.h b/bpftool/include/linux/compiler_types.h new file mode 100644 index 0000000..0655f12 --- /dev/null +++ b/bpftool/include/linux/compiler_types.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef __LINUX_COMPILER_TYPES_H +#define __LINUX_COMPILER_TYPES_H + +/* Compiler specific macros. */ +#ifdef __GNUC__ +#include +#endif + +#endif diff --git a/bpftool/include/linux/err.h b/bpftool/include/linux/err.h new file mode 100644 index 0000000..d5b7211 --- /dev/null +++ b/bpftool/include/linux/err.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef __LINUX_ERR_H +#define __LINUX_ERR_H + +#include +#include + +#define MAX_ERRNO 4095 + +#define IS_ERR_VALUE(x) ((x) >= (unsigned long)-MAX_ERRNO) + +static inline void * ERR_PTR(long error_) +{ + return (void *) error_; +} + +static inline long PTR_ERR(const void *ptr) +{ + return (long) ptr; +} + +static inline bool IS_ERR(const void *ptr) +{ + return IS_ERR_VALUE((unsigned long)ptr); +} + +static inline bool IS_ERR_OR_NULL(const void *ptr) +{ + return (!ptr) || IS_ERR_VALUE((unsigned long)ptr); +} + +#endif diff --git a/bpftool/include/linux/filter.h b/bpftool/include/linux/filter.h new file mode 100644 index 0000000..f256caf --- /dev/null +++ b/bpftool/include/linux/filter.h @@ -0,0 +1,56 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef __LINUX_FILTER_H +#define __LINUX_FILTER_H + +#include + +#define BPF_ALU64_IMM(OP, DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_MOV64_IMM(DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_MOV | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_EXIT_INSN() \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_EXIT, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = 0 }) + +#define BPF_JMP_IMM(OP, DST, IMM, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +#define BPF_JMP32_IMM(OP, DST, IMM, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP32 | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +#define BPF_EMIT_CALL(FUNC) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_CALL, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = ((FUNC) - BPF_FUNC_unspec) }) + +#endif diff --git a/bpftool/include/linux/kernel.h b/bpftool/include/linux/kernel.h new file mode 100644 index 0000000..48d23ea --- /dev/null +++ b/bpftool/include/linux/kernel.h @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef __LINUX_KERNEL_H +#define __LINUX_KERNEL_H + +#include + +#ifndef container_of +#define container_of(ptr, type, member) ({ \ + const typeof(((type *)0)->member) * __mptr = (ptr); \ + (type *)((char *)__mptr - offsetof(type, member)); }) +#endif + +#ifndef max +#define max(x, y) ({ \ + typeof(x) _max1 = (x); \ + typeof(y) _max2 = (y); \ + (void) (&_max1 == &_max2); \ + _max1 > _max2 ? _max1 : _max2; }) +#endif + +#ifndef roundup +#define roundup(x, y) ( \ +{ \ + const typeof(y) __y = y; \ + (((x) + (__y - 1)) / __y) * __y; \ +} \ +) +#endif + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) +#define __round_mask(x, y) ((__typeof__(x))((y)-1)) +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) + +#endif diff --git a/bpftool/include/linux/list.h b/bpftool/include/linux/list.h new file mode 100644 index 0000000..1113376 --- /dev/null +++ b/bpftool/include/linux/list.h @@ -0,0 +1,119 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef __LINUX_LIST_H +#define __LINUX_LIST_H + +#include + +#define LIST_HEAD_INIT(name) { &(name), &(name) } +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define POISON_POINTER_DELTA 0 +#define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA) +#define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA) + + +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} + +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty() on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void __list_del_entry(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} + +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) +#define list_last_entry(ptr, type, member) \ + list_entry((ptr)->prev, type, member) +#define list_next_entry(pos, member) \ + list_entry((pos)->member.next, typeof(*(pos)), member) +#define list_prev_entry(pos, member) \ + list_entry((pos)->member.prev, typeof(*(pos)), member) +#define list_for_each_entry(pos, head, member) \ + for (pos = list_first_entry(head, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_next_entry(pos, member)) +#define list_for_each_entry_from(pos, head, member) \ + for (; &pos->member != (head); \ + pos = list_next_entry(pos, member)) +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_first_entry(head, typeof(*pos), member), \ + n = list_next_entry(pos, member); \ + &pos->member != (head); \ + pos = n, n = list_next_entry(n, member)) + +#endif diff --git a/bpftool/include/linux/sizes.h b/bpftool/include/linux/sizes.h new file mode 100644 index 0000000..95e51ac --- /dev/null +++ b/bpftool/include/linux/sizes.h @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef __LINUX_SIZES_H__ +#define __LINUX_SIZES_H__ + +#define SZ_32K 0x00008000 + +#endif diff --git a/bpftool/include/linux/stringify.h b/bpftool/include/linux/stringify.h new file mode 100644 index 0000000..d7cb093 --- /dev/null +++ b/bpftool/include/linux/stringify.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef __LINUX_STRINGIFY_H +#define __LINUX_STRINGIFY_H + +/* Indirect stringification. Doing two levels allows the parameter to be a + * macro itself. For example, compile with -DFOO=bar, __stringify(FOO) + * converts to "bar". + */ + +#define __stringify_1(x...) #x +#define __stringify(x...) __stringify_1(x) + +#endif diff --git a/bpftool/include/linux/types.h b/bpftool/include/linux/types.h new file mode 100644 index 0000000..f991d11 --- /dev/null +++ b/bpftool/include/linux/types.h @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ + +#ifndef __LINUX_TYPES_H +#define __LINUX_TYPES_H + +#include +#include +#include + +#include +#include + +typedef uint64_t u64; +typedef __u32 u32; +typedef __u8 u8; + +#define __bitwise__ +#define __bitwise __bitwise__ + +typedef __u16 __bitwise __le16; +typedef __u16 __bitwise __be16; +typedef __u32 __bitwise __le32; +typedef __u32 __bitwise __be32; +typedef __u64 __bitwise __le64; +typedef __u64 __bitwise __be64; + +#ifndef __aligned_u64 +# define __aligned_u64 __u64 __attribute__((aligned(8))) +#endif + +struct list_head { + struct list_head *next, *prev; +}; + +#endif diff --git a/bpftool/include/tools/dis-asm-compat.h b/bpftool/include/tools/dis-asm-compat.h new file mode 100644 index 0000000..70f331e --- /dev/null +++ b/bpftool/include/tools/dis-asm-compat.h @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */ +#ifndef _TOOLS_DIS_ASM_COMPAT_H +#define _TOOLS_DIS_ASM_COMPAT_H + +#include +#include + +/* define types for older binutils version, to centralize ifdef'ery a bit */ +#ifndef DISASM_INIT_STYLED +enum disassembler_style {DISASSEMBLER_STYLE_NOT_EMPTY}; +typedef int (*fprintf_styled_ftype) (void *, enum disassembler_style, const char*, ...); +#endif + +/* + * Trivial fprintf wrapper to be used as the fprintf_styled_func argument to + * init_disassemble_info_compat() when normal fprintf suffices. + */ +static inline int fprintf_styled(void *out, + enum disassembler_style style, + const char *fmt, ...) +{ + va_list args; + int r; + + (void)style; + + va_start(args, fmt); + r = vfprintf(out, fmt, args); + va_end(args); + + return r; +} + +/* + * Wrapper for init_disassemble_info() that hides version + * differences. Depending on binutils version and architecture either + * fprintf_func or fprintf_styled_func will be called. + */ +static inline void init_disassemble_info_compat(struct disassemble_info *info, + void *stream, + fprintf_ftype unstyled_func, + fprintf_styled_ftype styled_func) +{ +#ifdef DISASM_INIT_STYLED + init_disassemble_info(info, stream, + unstyled_func, + styled_func); +#else + (void)styled_func; + init_disassemble_info(info, stream, + unstyled_func); +#endif +} + +#endif /* _TOOLS_DIS_ASM_COMPAT_H */ diff --git a/bpftool/include/uapi/asm-generic/bitsperlong.h b/bpftool/include/uapi/asm-generic/bitsperlong.h new file mode 100644 index 0000000..23e6c41 --- /dev/null +++ b/bpftool/include/uapi/asm-generic/bitsperlong.h @@ -0,0 +1,15 @@ +#ifndef _UAPI__ASM_GENERIC_BITS_PER_LONG +#define _UAPI__ASM_GENERIC_BITS_PER_LONG + +/* + * There seems to be no way of detecting this automatically from user + * space, so 64 bit architectures should override this in their + * bitsperlong.h. In particular, an architecture that supports + * both 32 and 64 bit user space must not rely on CONFIG_64BIT + * to decide it, but rather check a compiler provided macro. + */ +#ifndef __BITS_PER_LONG +#define __BITS_PER_LONG 32 +#endif + +#endif /* _UAPI__ASM_GENERIC_BITS_PER_LONG */ diff --git a/bpftool/include/uapi/linux/bpf.h b/bpftool/include/uapi/linux/bpf.h new file mode 100644 index 0000000..62ce1f5 --- /dev/null +++ b/bpftool/include/uapi/linux/bpf.h @@ -0,0 +1,7086 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + */ +#ifndef _UAPI__LINUX_BPF_H__ +#define _UAPI__LINUX_BPF_H__ + +#include +#include + +/* Extended instruction set based on top of classic BPF */ + +/* instruction classes */ +#define BPF_JMP32 0x06 /* jmp mode in word width */ +#define BPF_ALU64 0x07 /* alu mode in double word width */ + +/* ld/ldx fields */ +#define BPF_DW 0x18 /* double word (64-bit) */ +#define BPF_ATOMIC 0xc0 /* atomic memory ops - op type in immediate */ +#define BPF_XADD 0xc0 /* exclusive add - legacy name */ + +/* alu/jmp fields */ +#define BPF_MOV 0xb0 /* mov reg to reg */ +#define BPF_ARSH 0xc0 /* sign extending arithmetic shift right */ + +/* change endianness of a register */ +#define BPF_END 0xd0 /* flags for endianness conversion: */ +#define BPF_TO_LE 0x00 /* convert to little-endian */ +#define BPF_TO_BE 0x08 /* convert to big-endian */ +#define BPF_FROM_LE BPF_TO_LE +#define BPF_FROM_BE BPF_TO_BE + +/* jmp encodings */ +#define BPF_JNE 0x50 /* jump != */ +#define BPF_JLT 0xa0 /* LT is unsigned, '<' */ +#define BPF_JLE 0xb0 /* LE is unsigned, '<=' */ +#define BPF_JSGT 0x60 /* SGT is signed '>', GT in x86 */ +#define BPF_JSGE 0x70 /* SGE is signed '>=', GE in x86 */ +#define BPF_JSLT 0xc0 /* SLT is signed, '<' */ +#define BPF_JSLE 0xd0 /* SLE is signed, '<=' */ +#define BPF_CALL 0x80 /* function call */ +#define BPF_EXIT 0x90 /* function return */ + +/* atomic op type fields (stored in immediate) */ +#define BPF_FETCH 0x01 /* not an opcode on its own, used to build others */ +#define BPF_XCHG (0xe0 | BPF_FETCH) /* atomic exchange */ +#define BPF_CMPXCHG (0xf0 | BPF_FETCH) /* atomic compare-and-write */ + +/* Register numbers */ +enum { + BPF_REG_0 = 0, + BPF_REG_1, + BPF_REG_2, + BPF_REG_3, + BPF_REG_4, + BPF_REG_5, + BPF_REG_6, + BPF_REG_7, + BPF_REG_8, + BPF_REG_9, + BPF_REG_10, + __MAX_BPF_REG, +}; + +/* BPF has 10 general purpose 64-bit registers and stack frame. */ +#define MAX_BPF_REG __MAX_BPF_REG + +struct bpf_insn { + __u8 code; /* opcode */ + __u8 dst_reg:4; /* dest register */ + __u8 src_reg:4; /* source register */ + __s16 off; /* signed offset */ + __s32 imm; /* signed immediate constant */ +}; + +/* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */ +struct bpf_lpm_trie_key { + __u32 prefixlen; /* up to 32 for AF_INET, 128 for AF_INET6 */ + __u8 data[0]; /* Arbitrary size */ +}; + +struct bpf_cgroup_storage_key { + __u64 cgroup_inode_id; /* cgroup inode id */ + __u32 attach_type; /* program attach type (enum bpf_attach_type) */ +}; + +enum bpf_cgroup_iter_order { + BPF_CGROUP_ITER_ORDER_UNSPEC = 0, + BPF_CGROUP_ITER_SELF_ONLY, /* process only a single object. */ + BPF_CGROUP_ITER_DESCENDANTS_PRE, /* walk descendants in pre-order. */ + BPF_CGROUP_ITER_DESCENDANTS_POST, /* walk descendants in post-order. */ + BPF_CGROUP_ITER_ANCESTORS_UP, /* walk ancestors upward. */ +}; + +union bpf_iter_link_info { + struct { + __u32 map_fd; + } map; + struct { + enum bpf_cgroup_iter_order order; + + /* At most one of cgroup_fd and cgroup_id can be non-zero. If + * both are zero, the walk starts from the default cgroup v2 + * root. For walking v1 hierarchy, one should always explicitly + * specify cgroup_fd. + */ + __u32 cgroup_fd; + __u64 cgroup_id; + } cgroup; + /* Parameters of task iterators. */ + struct { + __u32 tid; + __u32 pid; + __u32 pid_fd; + } task; +}; + +/* BPF syscall commands, see bpf(2) man-page for more details. */ +/** + * DOC: eBPF Syscall Preamble + * + * The operation to be performed by the **bpf**\ () system call is determined + * by the *cmd* argument. Each operation takes an accompanying argument, + * provided via *attr*, which is a pointer to a union of type *bpf_attr* (see + * below). The size argument is the size of the union pointed to by *attr*. + */ +/** + * DOC: eBPF Syscall Commands + * + * BPF_MAP_CREATE + * Description + * Create a map and return a file descriptor that refers to the + * map. The close-on-exec file descriptor flag (see **fcntl**\ (2)) + * is automatically enabled for the new file descriptor. + * + * Applying **close**\ (2) to the file descriptor returned by + * **BPF_MAP_CREATE** will delete the map (but see NOTES). + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_MAP_LOOKUP_ELEM + * Description + * Look up an element with a given *key* in the map referred to + * by the file descriptor *map_fd*. + * + * The *flags* argument may be specified as one of the + * following: + * + * **BPF_F_LOCK** + * Look up the value of a spin-locked map without + * returning the lock. This must be specified if the + * elements contain a spinlock. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_UPDATE_ELEM + * Description + * Create or update an element (key/value pair) in a specified map. + * + * The *flags* argument should be specified as one of the + * following: + * + * **BPF_ANY** + * Create a new element or update an existing element. + * **BPF_NOEXIST** + * Create a new element only if it did not exist. + * **BPF_EXIST** + * Update an existing element. + * **BPF_F_LOCK** + * Update a spin_lock-ed map element. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * May set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, + * **E2BIG**, **EEXIST**, or **ENOENT**. + * + * **E2BIG** + * The number of elements in the map reached the + * *max_entries* limit specified at map creation time. + * **EEXIST** + * If *flags* specifies **BPF_NOEXIST** and the element + * with *key* already exists in the map. + * **ENOENT** + * If *flags* specifies **BPF_EXIST** and the element with + * *key* does not exist in the map. + * + * BPF_MAP_DELETE_ELEM + * Description + * Look up and delete an element by key in a specified map. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_GET_NEXT_KEY + * Description + * Look up an element by key in a specified map and return the key + * of the next element. Can be used to iterate over all elements + * in the map. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * The following cases can be used to iterate over all elements of + * the map: + * + * * If *key* is not found, the operation returns zero and sets + * the *next_key* pointer to the key of the first element. + * * If *key* is found, the operation returns zero and sets the + * *next_key* pointer to the key of the next element. + * * If *key* is the last element, returns -1 and *errno* is set + * to **ENOENT**. + * + * May set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or + * **EINVAL** on error. + * + * BPF_PROG_LOAD + * Description + * Verify and load an eBPF program, returning a new file + * descriptor associated with the program. + * + * Applying **close**\ (2) to the file descriptor returned by + * **BPF_PROG_LOAD** will unload the eBPF program (but see NOTES). + * + * The close-on-exec file descriptor flag (see **fcntl**\ (2)) is + * automatically enabled for the new file descriptor. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_OBJ_PIN + * Description + * Pin an eBPF program or map referred by the specified *bpf_fd* + * to the provided *pathname* on the filesystem. + * + * The *pathname* argument must not contain a dot ("."). + * + * On success, *pathname* retains a reference to the eBPF object, + * preventing deallocation of the object when the original + * *bpf_fd* is closed. This allow the eBPF object to live beyond + * **close**\ (\ *bpf_fd*\ ), and hence the lifetime of the parent + * process. + * + * Applying **unlink**\ (2) or similar calls to the *pathname* + * unpins the object from the filesystem, removing the reference. + * If no other file descriptors or filesystem nodes refer to the + * same object, it will be deallocated (see NOTES). + * + * The filesystem type for the parent directory of *pathname* must + * be **BPF_FS_MAGIC**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_OBJ_GET + * Description + * Open a file descriptor for the eBPF object pinned to the + * specified *pathname*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_PROG_ATTACH + * Description + * Attach an eBPF program to a *target_fd* at the specified + * *attach_type* hook. + * + * The *attach_type* specifies the eBPF attachment point to + * attach the program to, and must be one of *bpf_attach_type* + * (see below). + * + * The *attach_bpf_fd* must be a valid file descriptor for a + * loaded eBPF program of a cgroup, flow dissector, LIRC, sockmap + * or sock_ops type corresponding to the specified *attach_type*. + * + * The *target_fd* must be a valid file descriptor for a kernel + * object which depends on the attach type of *attach_bpf_fd*: + * + * **BPF_PROG_TYPE_CGROUP_DEVICE**, + * **BPF_PROG_TYPE_CGROUP_SKB**, + * **BPF_PROG_TYPE_CGROUP_SOCK**, + * **BPF_PROG_TYPE_CGROUP_SOCK_ADDR**, + * **BPF_PROG_TYPE_CGROUP_SOCKOPT**, + * **BPF_PROG_TYPE_CGROUP_SYSCTL**, + * **BPF_PROG_TYPE_SOCK_OPS** + * + * Control Group v2 hierarchy with the eBPF controller + * enabled. Requires the kernel to be compiled with + * **CONFIG_CGROUP_BPF**. + * + * **BPF_PROG_TYPE_FLOW_DISSECTOR** + * + * Network namespace (eg /proc/self/ns/net). + * + * **BPF_PROG_TYPE_LIRC_MODE2** + * + * LIRC device path (eg /dev/lircN). Requires the kernel + * to be compiled with **CONFIG_BPF_LIRC_MODE2**. + * + * **BPF_PROG_TYPE_SK_SKB**, + * **BPF_PROG_TYPE_SK_MSG** + * + * eBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**). + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_DETACH + * Description + * Detach the eBPF program associated with the *target_fd* at the + * hook specified by *attach_type*. The program must have been + * previously attached using **BPF_PROG_ATTACH**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_TEST_RUN + * Description + * Run the eBPF program associated with the *prog_fd* a *repeat* + * number of times against a provided program context *ctx_in* and + * data *data_in*, and return the modified program context + * *ctx_out*, *data_out* (for example, packet data), result of the + * execution *retval*, and *duration* of the test run. + * + * The sizes of the buffers provided as input and output + * parameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must + * be provided in the corresponding variables *ctx_size_in*, + * *ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any + * of these parameters are not provided (ie set to NULL), the + * corresponding size field must be zero. + * + * Some program types have particular requirements: + * + * **BPF_PROG_TYPE_SK_LOOKUP** + * *data_in* and *data_out* must be NULL. + * + * **BPF_PROG_TYPE_RAW_TRACEPOINT**, + * **BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE** + * + * *ctx_out*, *data_in* and *data_out* must be NULL. + * *repeat* must be zero. + * + * BPF_PROG_RUN is an alias for BPF_PROG_TEST_RUN. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * **ENOSPC** + * Either *data_size_out* or *ctx_size_out* is too small. + * **ENOTSUPP** + * This command is not supported by the program type of + * the program referred to by *prog_fd*. + * + * BPF_PROG_GET_NEXT_ID + * Description + * Fetch the next eBPF program currently loaded into the kernel. + * + * Looks for the eBPF program with an id greater than *start_id* + * and updates *next_id* on success. If no other eBPF programs + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_MAP_GET_NEXT_ID + * Description + * Fetch the next eBPF map currently loaded into the kernel. + * + * Looks for the eBPF map with an id greater than *start_id* + * and updates *next_id* on success. If no other eBPF maps + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_PROG_GET_FD_BY_ID + * Description + * Open a file descriptor for the eBPF program corresponding to + * *prog_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_MAP_GET_FD_BY_ID + * Description + * Open a file descriptor for the eBPF map corresponding to + * *map_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_OBJ_GET_INFO_BY_FD + * Description + * Obtain information about the eBPF object corresponding to + * *bpf_fd*. + * + * Populates up to *info_len* bytes of *info*, which will be in + * one of the following formats depending on the eBPF object type + * of *bpf_fd*: + * + * * **struct bpf_prog_info** + * * **struct bpf_map_info** + * * **struct bpf_btf_info** + * * **struct bpf_link_info** + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_QUERY + * Description + * Obtain information about eBPF programs associated with the + * specified *attach_type* hook. + * + * The *target_fd* must be a valid file descriptor for a kernel + * object which depends on the attach type of *attach_bpf_fd*: + * + * **BPF_PROG_TYPE_CGROUP_DEVICE**, + * **BPF_PROG_TYPE_CGROUP_SKB**, + * **BPF_PROG_TYPE_CGROUP_SOCK**, + * **BPF_PROG_TYPE_CGROUP_SOCK_ADDR**, + * **BPF_PROG_TYPE_CGROUP_SOCKOPT**, + * **BPF_PROG_TYPE_CGROUP_SYSCTL**, + * **BPF_PROG_TYPE_SOCK_OPS** + * + * Control Group v2 hierarchy with the eBPF controller + * enabled. Requires the kernel to be compiled with + * **CONFIG_CGROUP_BPF**. + * + * **BPF_PROG_TYPE_FLOW_DISSECTOR** + * + * Network namespace (eg /proc/self/ns/net). + * + * **BPF_PROG_TYPE_LIRC_MODE2** + * + * LIRC device path (eg /dev/lircN). Requires the kernel + * to be compiled with **CONFIG_BPF_LIRC_MODE2**. + * + * **BPF_PROG_QUERY** always fetches the number of programs + * attached and the *attach_flags* which were used to attach those + * programs. Additionally, if *prog_ids* is nonzero and the number + * of attached programs is less than *prog_cnt*, populates + * *prog_ids* with the eBPF program ids of the programs attached + * at *target_fd*. + * + * The following flags may alter the result: + * + * **BPF_F_QUERY_EFFECTIVE** + * Only return information regarding programs which are + * currently effective at the specified *target_fd*. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_RAW_TRACEPOINT_OPEN + * Description + * Attach an eBPF program to a tracepoint *name* to access kernel + * internal arguments of the tracepoint in their raw form. + * + * The *prog_fd* must be a valid file descriptor associated with + * a loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**. + * + * No ABI guarantees are made about the content of tracepoint + * arguments exposed to the corresponding eBPF program. + * + * Applying **close**\ (2) to the file descriptor returned by + * **BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES). + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_BTF_LOAD + * Description + * Verify and load BPF Type Format (BTF) metadata into the kernel, + * returning a new file descriptor associated with the metadata. + * BTF is described in more detail at + * https://www.kernel.org/doc/html/latest/bpf/btf.html. + * + * The *btf* parameter must point to valid memory providing + * *btf_size* bytes of BTF binary metadata. + * + * The returned file descriptor can be passed to other **bpf**\ () + * subcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to + * associate the BTF with those objects. + * + * Similar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional + * parameters to specify a *btf_log_buf*, *btf_log_size* and + * *btf_log_level* which allow the kernel to return freeform log + * output regarding the BTF verification process. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_BTF_GET_FD_BY_ID + * Description + * Open a file descriptor for the BPF Type Format (BTF) + * corresponding to *btf_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_TASK_FD_QUERY + * Description + * Obtain information about eBPF programs associated with the + * target process identified by *pid* and *fd*. + * + * If the *pid* and *fd* are associated with a tracepoint, kprobe + * or uprobe perf event, then the *prog_id* and *fd_type* will + * be populated with the eBPF program id and file descriptor type + * of type **bpf_task_fd_type**. If associated with a kprobe or + * uprobe, the *probe_offset* and *probe_addr* will also be + * populated. Optionally, if *buf* is provided, then up to + * *buf_len* bytes of *buf* will be populated with the name of + * the tracepoint, kprobe or uprobe. + * + * The resulting *prog_id* may be introspected in deeper detail + * using **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_LOOKUP_AND_DELETE_ELEM + * Description + * Look up an element with the given *key* in the map referred to + * by the file descriptor *fd*, and if found, delete the element. + * + * For **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map + * types, the *flags* argument needs to be set to 0, but for other + * map types, it may be specified as: + * + * **BPF_F_LOCK** + * Look up and delete the value of a spin-locked map + * without returning the lock. This must be specified if + * the elements contain a spinlock. + * + * The **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types + * implement this command as a "pop" operation, deleting the top + * element rather than one corresponding to *key*. + * The *key* and *key_len* parameters should be zeroed when + * issuing this operation for these map types. + * + * This command is only valid for the following map types: + * * **BPF_MAP_TYPE_QUEUE** + * * **BPF_MAP_TYPE_STACK** + * * **BPF_MAP_TYPE_HASH** + * * **BPF_MAP_TYPE_PERCPU_HASH** + * * **BPF_MAP_TYPE_LRU_HASH** + * * **BPF_MAP_TYPE_LRU_PERCPU_HASH** + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_FREEZE + * Description + * Freeze the permissions of the specified map. + * + * Write permissions may be frozen by passing zero *flags*. + * Upon success, no future syscall invocations may alter the + * map state of *map_fd*. Write operations from eBPF programs + * are still possible for a frozen map. + * + * Not supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_BTF_GET_NEXT_ID + * Description + * Fetch the next BPF Type Format (BTF) object currently loaded + * into the kernel. + * + * Looks for the BTF object with an id greater than *start_id* + * and updates *next_id* on success. If no other BTF objects + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_MAP_LOOKUP_BATCH + * Description + * Iterate and fetch multiple elements in a map. + * + * Two opaque values are used to manage batch operations, + * *in_batch* and *out_batch*. Initially, *in_batch* must be set + * to NULL to begin the batched operation. After each subsequent + * **BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant + * *out_batch* as the *in_batch* for the next operation to + * continue iteration from the current point. + * + * The *keys* and *values* are output parameters which must point + * to memory large enough to hold *count* items based on the key + * and value size of the map *map_fd*. The *keys* buffer must be + * of *key_size* * *count*. The *values* buffer must be of + * *value_size* * *count*. + * + * The *elem_flags* argument may be specified as one of the + * following: + * + * **BPF_F_LOCK** + * Look up the value of a spin-locked map without + * returning the lock. This must be specified if the + * elements contain a spinlock. + * + * On success, *count* elements from the map are copied into the + * user buffer, with the keys copied into *keys* and the values + * copied into the corresponding indices in *values*. + * + * If an error is returned and *errno* is not **EFAULT**, *count* + * is set to the number of successfully processed elements. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * May set *errno* to **ENOSPC** to indicate that *keys* or + * *values* is too small to dump an entire bucket during + * iteration of a hash-based map type. + * + * BPF_MAP_LOOKUP_AND_DELETE_BATCH + * Description + * Iterate and delete all elements in a map. + * + * This operation has the same behavior as + * **BPF_MAP_LOOKUP_BATCH** with two exceptions: + * + * * Every element that is successfully returned is also deleted + * from the map. This is at least *count* elements. Note that + * *count* is both an input and an output parameter. + * * Upon returning with *errno* set to **EFAULT**, up to + * *count* elements may be deleted without returning the keys + * and values of the deleted elements. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_UPDATE_BATCH + * Description + * Update multiple elements in a map by *key*. + * + * The *keys* and *values* are input parameters which must point + * to memory large enough to hold *count* items based on the key + * and value size of the map *map_fd*. The *keys* buffer must be + * of *key_size* * *count*. The *values* buffer must be of + * *value_size* * *count*. + * + * Each element specified in *keys* is sequentially updated to the + * value in the corresponding index in *values*. The *in_batch* + * and *out_batch* parameters are ignored and should be zeroed. + * + * The *elem_flags* argument should be specified as one of the + * following: + * + * **BPF_ANY** + * Create new elements or update a existing elements. + * **BPF_NOEXIST** + * Create new elements only if they do not exist. + * **BPF_EXIST** + * Update existing elements. + * **BPF_F_LOCK** + * Update spin_lock-ed map elements. This must be + * specified if the map value contains a spinlock. + * + * On success, *count* elements from the map are updated. + * + * If an error is returned and *errno* is not **EFAULT**, *count* + * is set to the number of successfully processed elements. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * May set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or + * **E2BIG**. **E2BIG** indicates that the number of elements in + * the map reached the *max_entries* limit specified at map + * creation time. + * + * May set *errno* to one of the following error codes under + * specific circumstances: + * + * **EEXIST** + * If *flags* specifies **BPF_NOEXIST** and the element + * with *key* already exists in the map. + * **ENOENT** + * If *flags* specifies **BPF_EXIST** and the element with + * *key* does not exist in the map. + * + * BPF_MAP_DELETE_BATCH + * Description + * Delete multiple elements in a map by *key*. + * + * The *keys* parameter is an input parameter which must point + * to memory large enough to hold *count* items based on the key + * size of the map *map_fd*, that is, *key_size* * *count*. + * + * Each element specified in *keys* is sequentially deleted. The + * *in_batch*, *out_batch*, and *values* parameters are ignored + * and should be zeroed. + * + * The *elem_flags* argument may be specified as one of the + * following: + * + * **BPF_F_LOCK** + * Look up the value of a spin-locked map without + * returning the lock. This must be specified if the + * elements contain a spinlock. + * + * On success, *count* elements from the map are updated. + * + * If an error is returned and *errno* is not **EFAULT**, *count* + * is set to the number of successfully processed elements. If + * *errno* is **EFAULT**, up to *count* elements may be been + * deleted. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_LINK_CREATE + * Description + * Attach an eBPF program to a *target_fd* at the specified + * *attach_type* hook and return a file descriptor handle for + * managing the link. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_LINK_UPDATE + * Description + * Update the eBPF program in the specified *link_fd* to + * *new_prog_fd*. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_LINK_GET_FD_BY_ID + * Description + * Open a file descriptor for the eBPF Link corresponding to + * *link_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_LINK_GET_NEXT_ID + * Description + * Fetch the next eBPF link currently loaded into the kernel. + * + * Looks for the eBPF link with an id greater than *start_id* + * and updates *next_id* on success. If no other eBPF links + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_ENABLE_STATS + * Description + * Enable eBPF runtime statistics gathering. + * + * Runtime statistics gathering for the eBPF runtime is disabled + * by default to minimize the corresponding performance overhead. + * This command enables statistics globally. + * + * Multiple programs may independently enable statistics. + * After gathering the desired statistics, eBPF runtime statistics + * may be disabled again by calling **close**\ (2) for the file + * descriptor returned by this function. Statistics will only be + * disabled system-wide when all outstanding file descriptors + * returned by prior calls for this subcommand are closed. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_ITER_CREATE + * Description + * Create an iterator on top of the specified *link_fd* (as + * previously created using **BPF_LINK_CREATE**) and return a + * file descriptor that can be used to trigger the iteration. + * + * If the resulting file descriptor is pinned to the filesystem + * using **BPF_OBJ_PIN**, then subsequent **read**\ (2) syscalls + * for that path will trigger the iterator to read kernel state + * using the eBPF program attached to *link_fd*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_LINK_DETACH + * Description + * Forcefully detach the specified *link_fd* from its + * corresponding attachment point. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_BIND_MAP + * Description + * Bind a map to the lifetime of an eBPF program. + * + * The map identified by *map_fd* is bound to the program + * identified by *prog_fd* and only released when *prog_fd* is + * released. This may be used in cases where metadata should be + * associated with a program which otherwise does not contain any + * references to the map (for example, embedded in the eBPF + * program instructions). + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * NOTES + * eBPF objects (maps and programs) can be shared between processes. + * + * * After **fork**\ (2), the child inherits file descriptors + * referring to the same eBPF objects. + * * File descriptors referring to eBPF objects can be transferred over + * **unix**\ (7) domain sockets. + * * File descriptors referring to eBPF objects can be duplicated in the + * usual way, using **dup**\ (2) and similar calls. + * * File descriptors referring to eBPF objects can be pinned to the + * filesystem using the **BPF_OBJ_PIN** command of **bpf**\ (2). + * + * An eBPF object is deallocated only after all file descriptors referring + * to the object have been closed and no references remain pinned to the + * filesystem or attached (for example, bound to a program or device). + */ +enum bpf_cmd { + BPF_MAP_CREATE, + BPF_MAP_LOOKUP_ELEM, + BPF_MAP_UPDATE_ELEM, + BPF_MAP_DELETE_ELEM, + BPF_MAP_GET_NEXT_KEY, + BPF_PROG_LOAD, + BPF_OBJ_PIN, + BPF_OBJ_GET, + BPF_PROG_ATTACH, + BPF_PROG_DETACH, + BPF_PROG_TEST_RUN, + BPF_PROG_RUN = BPF_PROG_TEST_RUN, + BPF_PROG_GET_NEXT_ID, + BPF_MAP_GET_NEXT_ID, + BPF_PROG_GET_FD_BY_ID, + BPF_MAP_GET_FD_BY_ID, + BPF_OBJ_GET_INFO_BY_FD, + BPF_PROG_QUERY, + BPF_RAW_TRACEPOINT_OPEN, + BPF_BTF_LOAD, + BPF_BTF_GET_FD_BY_ID, + BPF_TASK_FD_QUERY, + BPF_MAP_LOOKUP_AND_DELETE_ELEM, + BPF_MAP_FREEZE, + BPF_BTF_GET_NEXT_ID, + BPF_MAP_LOOKUP_BATCH, + BPF_MAP_LOOKUP_AND_DELETE_BATCH, + BPF_MAP_UPDATE_BATCH, + BPF_MAP_DELETE_BATCH, + BPF_LINK_CREATE, + BPF_LINK_UPDATE, + BPF_LINK_GET_FD_BY_ID, + BPF_LINK_GET_NEXT_ID, + BPF_ENABLE_STATS, + BPF_ITER_CREATE, + BPF_LINK_DETACH, + BPF_PROG_BIND_MAP, +}; + +enum bpf_map_type { + BPF_MAP_TYPE_UNSPEC, + BPF_MAP_TYPE_HASH, + BPF_MAP_TYPE_ARRAY, + BPF_MAP_TYPE_PROG_ARRAY, + BPF_MAP_TYPE_PERF_EVENT_ARRAY, + BPF_MAP_TYPE_PERCPU_HASH, + BPF_MAP_TYPE_PERCPU_ARRAY, + BPF_MAP_TYPE_STACK_TRACE, + BPF_MAP_TYPE_CGROUP_ARRAY, + BPF_MAP_TYPE_LRU_HASH, + BPF_MAP_TYPE_LRU_PERCPU_HASH, + BPF_MAP_TYPE_LPM_TRIE, + BPF_MAP_TYPE_ARRAY_OF_MAPS, + BPF_MAP_TYPE_HASH_OF_MAPS, + BPF_MAP_TYPE_DEVMAP, + BPF_MAP_TYPE_SOCKMAP, + BPF_MAP_TYPE_CPUMAP, + BPF_MAP_TYPE_XSKMAP, + BPF_MAP_TYPE_SOCKHASH, + BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED, + /* BPF_MAP_TYPE_CGROUP_STORAGE is available to bpf programs attaching + * to a cgroup. The newer BPF_MAP_TYPE_CGRP_STORAGE is available to + * both cgroup-attached and other progs and supports all functionality + * provided by BPF_MAP_TYPE_CGROUP_STORAGE. So mark + * BPF_MAP_TYPE_CGROUP_STORAGE deprecated. + */ + BPF_MAP_TYPE_CGROUP_STORAGE = BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED, + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE, + BPF_MAP_TYPE_QUEUE, + BPF_MAP_TYPE_STACK, + BPF_MAP_TYPE_SK_STORAGE, + BPF_MAP_TYPE_DEVMAP_HASH, + BPF_MAP_TYPE_STRUCT_OPS, + BPF_MAP_TYPE_RINGBUF, + BPF_MAP_TYPE_INODE_STORAGE, + BPF_MAP_TYPE_TASK_STORAGE, + BPF_MAP_TYPE_BLOOM_FILTER, + BPF_MAP_TYPE_USER_RINGBUF, + BPF_MAP_TYPE_CGRP_STORAGE, +}; + +/* Note that tracing related programs such as + * BPF_PROG_TYPE_{KPROBE,TRACEPOINT,PERF_EVENT,RAW_TRACEPOINT} + * are not subject to a stable API since kernel internal data + * structures can change from release to release and may + * therefore break existing tracing BPF programs. Tracing BPF + * programs correspond to /a/ specific kernel which is to be + * analyzed, and not /a/ specific kernel /and/ all future ones. + */ +enum bpf_prog_type { + BPF_PROG_TYPE_UNSPEC, + BPF_PROG_TYPE_SOCKET_FILTER, + BPF_PROG_TYPE_KPROBE, + BPF_PROG_TYPE_SCHED_CLS, + BPF_PROG_TYPE_SCHED_ACT, + BPF_PROG_TYPE_TRACEPOINT, + BPF_PROG_TYPE_XDP, + BPF_PROG_TYPE_PERF_EVENT, + BPF_PROG_TYPE_CGROUP_SKB, + BPF_PROG_TYPE_CGROUP_SOCK, + BPF_PROG_TYPE_LWT_IN, + BPF_PROG_TYPE_LWT_OUT, + BPF_PROG_TYPE_LWT_XMIT, + BPF_PROG_TYPE_SOCK_OPS, + BPF_PROG_TYPE_SK_SKB, + BPF_PROG_TYPE_CGROUP_DEVICE, + BPF_PROG_TYPE_SK_MSG, + BPF_PROG_TYPE_RAW_TRACEPOINT, + BPF_PROG_TYPE_CGROUP_SOCK_ADDR, + BPF_PROG_TYPE_LWT_SEG6LOCAL, + BPF_PROG_TYPE_LIRC_MODE2, + BPF_PROG_TYPE_SK_REUSEPORT, + BPF_PROG_TYPE_FLOW_DISSECTOR, + BPF_PROG_TYPE_CGROUP_SYSCTL, + BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, + BPF_PROG_TYPE_CGROUP_SOCKOPT, + BPF_PROG_TYPE_TRACING, + BPF_PROG_TYPE_STRUCT_OPS, + BPF_PROG_TYPE_EXT, + BPF_PROG_TYPE_LSM, + BPF_PROG_TYPE_SK_LOOKUP, + BPF_PROG_TYPE_SYSCALL, /* a program that can execute syscalls */ +}; + +enum bpf_attach_type { + BPF_CGROUP_INET_INGRESS, + BPF_CGROUP_INET_EGRESS, + BPF_CGROUP_INET_SOCK_CREATE, + BPF_CGROUP_SOCK_OPS, + BPF_SK_SKB_STREAM_PARSER, + BPF_SK_SKB_STREAM_VERDICT, + BPF_CGROUP_DEVICE, + BPF_SK_MSG_VERDICT, + BPF_CGROUP_INET4_BIND, + BPF_CGROUP_INET6_BIND, + BPF_CGROUP_INET4_CONNECT, + BPF_CGROUP_INET6_CONNECT, + BPF_CGROUP_INET4_POST_BIND, + BPF_CGROUP_INET6_POST_BIND, + BPF_CGROUP_UDP4_SENDMSG, + BPF_CGROUP_UDP6_SENDMSG, + BPF_LIRC_MODE2, + BPF_FLOW_DISSECTOR, + BPF_CGROUP_SYSCTL, + BPF_CGROUP_UDP4_RECVMSG, + BPF_CGROUP_UDP6_RECVMSG, + BPF_CGROUP_GETSOCKOPT, + BPF_CGROUP_SETSOCKOPT, + BPF_TRACE_RAW_TP, + BPF_TRACE_FENTRY, + BPF_TRACE_FEXIT, + BPF_MODIFY_RETURN, + BPF_LSM_MAC, + BPF_TRACE_ITER, + BPF_CGROUP_INET4_GETPEERNAME, + BPF_CGROUP_INET6_GETPEERNAME, + BPF_CGROUP_INET4_GETSOCKNAME, + BPF_CGROUP_INET6_GETSOCKNAME, + BPF_XDP_DEVMAP, + BPF_CGROUP_INET_SOCK_RELEASE, + BPF_XDP_CPUMAP, + BPF_SK_LOOKUP, + BPF_XDP, + BPF_SK_SKB_VERDICT, + BPF_SK_REUSEPORT_SELECT, + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE, + BPF_PERF_EVENT, + BPF_TRACE_KPROBE_MULTI, + BPF_LSM_CGROUP, + __MAX_BPF_ATTACH_TYPE +}; + +#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE + +enum bpf_link_type { + BPF_LINK_TYPE_UNSPEC = 0, + BPF_LINK_TYPE_RAW_TRACEPOINT = 1, + BPF_LINK_TYPE_TRACING = 2, + BPF_LINK_TYPE_CGROUP = 3, + BPF_LINK_TYPE_ITER = 4, + BPF_LINK_TYPE_NETNS = 5, + BPF_LINK_TYPE_XDP = 6, + BPF_LINK_TYPE_PERF_EVENT = 7, + BPF_LINK_TYPE_KPROBE_MULTI = 8, + BPF_LINK_TYPE_STRUCT_OPS = 9, + + MAX_BPF_LINK_TYPE, +}; + +/* cgroup-bpf attach flags used in BPF_PROG_ATTACH command + * + * NONE(default): No further bpf programs allowed in the subtree. + * + * BPF_F_ALLOW_OVERRIDE: If a sub-cgroup installs some bpf program, + * the program in this cgroup yields to sub-cgroup program. + * + * BPF_F_ALLOW_MULTI: If a sub-cgroup installs some bpf program, + * that cgroup program gets run in addition to the program in this cgroup. + * + * Only one program is allowed to be attached to a cgroup with + * NONE or BPF_F_ALLOW_OVERRIDE flag. + * Attaching another program on top of NONE or BPF_F_ALLOW_OVERRIDE will + * release old program and attach the new one. Attach flags has to match. + * + * Multiple programs are allowed to be attached to a cgroup with + * BPF_F_ALLOW_MULTI flag. They are executed in FIFO order + * (those that were attached first, run first) + * The programs of sub-cgroup are executed first, then programs of + * this cgroup and then programs of parent cgroup. + * When children program makes decision (like picking TCP CA or sock bind) + * parent program has a chance to override it. + * + * With BPF_F_ALLOW_MULTI a new program is added to the end of the list of + * programs for a cgroup. Though it's possible to replace an old program at + * any position by also specifying BPF_F_REPLACE flag and position itself in + * replace_bpf_fd attribute. Old program at this position will be released. + * + * A cgroup with MULTI or OVERRIDE flag allows any attach flags in sub-cgroups. + * A cgroup with NONE doesn't allow any programs in sub-cgroups. + * Ex1: + * cgrp1 (MULTI progs A, B) -> + * cgrp2 (OVERRIDE prog C) -> + * cgrp3 (MULTI prog D) -> + * cgrp4 (OVERRIDE prog E) -> + * cgrp5 (NONE prog F) + * the event in cgrp5 triggers execution of F,D,A,B in that order. + * if prog F is detached, the execution is E,D,A,B + * if prog F and D are detached, the execution is E,A,B + * if prog F, E and D are detached, the execution is C,A,B + * + * All eligible programs are executed regardless of return code from + * earlier programs. + */ +#define BPF_F_ALLOW_OVERRIDE (1U << 0) +#define BPF_F_ALLOW_MULTI (1U << 1) +#define BPF_F_REPLACE (1U << 2) + +/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the + * verifier will perform strict alignment checking as if the kernel + * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set, + * and NET_IP_ALIGN defined to 2. + */ +#define BPF_F_STRICT_ALIGNMENT (1U << 0) + +/* If BPF_F_ANY_ALIGNMENT is used in BPF_PROF_LOAD command, the + * verifier will allow any alignment whatsoever. On platforms + * with strict alignment requirements for loads ands stores (such + * as sparc and mips) the verifier validates that all loads and + * stores provably follow this requirement. This flag turns that + * checking and enforcement off. + * + * It is mostly used for testing when we want to validate the + * context and memory access aspects of the verifier, but because + * of an unaligned access the alignment check would trigger before + * the one we are interested in. + */ +#define BPF_F_ANY_ALIGNMENT (1U << 1) + +/* BPF_F_TEST_RND_HI32 is used in BPF_PROG_LOAD command for testing purpose. + * Verifier does sub-register def/use analysis and identifies instructions whose + * def only matters for low 32-bit, high 32-bit is never referenced later + * through implicit zero extension. Therefore verifier notifies JIT back-ends + * that it is safe to ignore clearing high 32-bit for these instructions. This + * saves some back-ends a lot of code-gen. However such optimization is not + * necessary on some arches, for example x86_64, arm64 etc, whose JIT back-ends + * hence hasn't used verifier's analysis result. But, we really want to have a + * way to be able to verify the correctness of the described optimization on + * x86_64 on which testsuites are frequently exercised. + * + * So, this flag is introduced. Once it is set, verifier will randomize high + * 32-bit for those instructions who has been identified as safe to ignore them. + * Then, if verifier is not doing correct analysis, such randomization will + * regress tests to expose bugs. + */ +#define BPF_F_TEST_RND_HI32 (1U << 2) + +/* The verifier internal test flag. Behavior is undefined */ +#define BPF_F_TEST_STATE_FREQ (1U << 3) + +/* If BPF_F_SLEEPABLE is used in BPF_PROG_LOAD command, the verifier will + * restrict map and helper usage for such programs. Sleepable BPF programs can + * only be attached to hooks where kernel execution context allows sleeping. + * Such programs are allowed to use helpers that may sleep like + * bpf_copy_from_user(). + */ +#define BPF_F_SLEEPABLE (1U << 4) + +/* If BPF_F_XDP_HAS_FRAGS is used in BPF_PROG_LOAD command, the loaded program + * fully support xdp frags. + */ +#define BPF_F_XDP_HAS_FRAGS (1U << 5) + +/* If BPF_F_XDP_DEV_BOUND_ONLY is used in BPF_PROG_LOAD command, the loaded + * program becomes device-bound but can access XDP metadata. + */ +#define BPF_F_XDP_DEV_BOUND_ONLY (1U << 6) + +/* link_create.kprobe_multi.flags used in LINK_CREATE command for + * BPF_TRACE_KPROBE_MULTI attach type to create return probe. + */ +#define BPF_F_KPROBE_MULTI_RETURN (1U << 0) + +/* When BPF ldimm64's insn[0].src_reg != 0 then this can have + * the following extensions: + * + * insn[0].src_reg: BPF_PSEUDO_MAP_[FD|IDX] + * insn[0].imm: map fd or fd_idx + * insn[1].imm: 0 + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of map + * verifier type: CONST_PTR_TO_MAP + */ +#define BPF_PSEUDO_MAP_FD 1 +#define BPF_PSEUDO_MAP_IDX 5 + +/* insn[0].src_reg: BPF_PSEUDO_MAP_[IDX_]VALUE + * insn[0].imm: map fd or fd_idx + * insn[1].imm: offset into value + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of map[0]+offset + * verifier type: PTR_TO_MAP_VALUE + */ +#define BPF_PSEUDO_MAP_VALUE 2 +#define BPF_PSEUDO_MAP_IDX_VALUE 6 + +/* insn[0].src_reg: BPF_PSEUDO_BTF_ID + * insn[0].imm: kernel btd id of VAR + * insn[1].imm: 0 + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of the kernel variable + * verifier type: PTR_TO_BTF_ID or PTR_TO_MEM, depending on whether the var + * is struct/union. + */ +#define BPF_PSEUDO_BTF_ID 3 +/* insn[0].src_reg: BPF_PSEUDO_FUNC + * insn[0].imm: insn offset to the func + * insn[1].imm: 0 + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of the function + * verifier type: PTR_TO_FUNC. + */ +#define BPF_PSEUDO_FUNC 4 + +/* when bpf_call->src_reg == BPF_PSEUDO_CALL, bpf_call->imm == pc-relative + * offset to another bpf function + */ +#define BPF_PSEUDO_CALL 1 +/* when bpf_call->src_reg == BPF_PSEUDO_KFUNC_CALL, + * bpf_call->imm == btf_id of a BTF_KIND_FUNC in the running kernel + */ +#define BPF_PSEUDO_KFUNC_CALL 2 + +/* flags for BPF_MAP_UPDATE_ELEM command */ +enum { + BPF_ANY = 0, /* create new element or update existing */ + BPF_NOEXIST = 1, /* create new element if it didn't exist */ + BPF_EXIST = 2, /* update existing element */ + BPF_F_LOCK = 4, /* spin_lock-ed map_lookup/map_update */ +}; + +/* flags for BPF_MAP_CREATE command */ +enum { + BPF_F_NO_PREALLOC = (1U << 0), +/* Instead of having one common LRU list in the + * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list + * which can scale and perform better. + * Note, the LRU nodes (including free nodes) cannot be moved + * across different LRU lists. + */ + BPF_F_NO_COMMON_LRU = (1U << 1), +/* Specify numa node during map creation */ + BPF_F_NUMA_NODE = (1U << 2), + +/* Flags for accessing BPF object from syscall side. */ + BPF_F_RDONLY = (1U << 3), + BPF_F_WRONLY = (1U << 4), + +/* Flag for stack_map, store build_id+offset instead of pointer */ + BPF_F_STACK_BUILD_ID = (1U << 5), + +/* Zero-initialize hash function seed. This should only be used for testing. */ + BPF_F_ZERO_SEED = (1U << 6), + +/* Flags for accessing BPF object from program side. */ + BPF_F_RDONLY_PROG = (1U << 7), + BPF_F_WRONLY_PROG = (1U << 8), + +/* Clone map from listener for newly accepted socket */ + BPF_F_CLONE = (1U << 9), + +/* Enable memory-mapping BPF map */ + BPF_F_MMAPABLE = (1U << 10), + +/* Share perf_event among processes */ + BPF_F_PRESERVE_ELEMS = (1U << 11), + +/* Create a map that is suitable to be an inner map with dynamic max entries */ + BPF_F_INNER_MAP = (1U << 12), +}; + +/* Flags for BPF_PROG_QUERY. */ + +/* Query effective (directly attached + inherited from ancestor cgroups) + * programs that will be executed for events within a cgroup. + * attach_flags with this flag are always returned 0. + */ +#define BPF_F_QUERY_EFFECTIVE (1U << 0) + +/* Flags for BPF_PROG_TEST_RUN */ + +/* If set, run the test on the cpu specified by bpf_attr.test.cpu */ +#define BPF_F_TEST_RUN_ON_CPU (1U << 0) +/* If set, XDP frames will be transmitted after processing */ +#define BPF_F_TEST_XDP_LIVE_FRAMES (1U << 1) + +/* type for BPF_ENABLE_STATS */ +enum bpf_stats_type { + /* enabled run_time_ns and run_cnt */ + BPF_STATS_RUN_TIME = 0, +}; + +enum bpf_stack_build_id_status { + /* user space need an empty entry to identify end of a trace */ + BPF_STACK_BUILD_ID_EMPTY = 0, + /* with valid build_id and offset */ + BPF_STACK_BUILD_ID_VALID = 1, + /* couldn't get build_id, fallback to ip */ + BPF_STACK_BUILD_ID_IP = 2, +}; + +#define BPF_BUILD_ID_SIZE 20 +struct bpf_stack_build_id { + __s32 status; + unsigned char build_id[BPF_BUILD_ID_SIZE]; + union { + __u64 offset; + __u64 ip; + }; +}; + +#define BPF_OBJ_NAME_LEN 16U + +union bpf_attr { + struct { /* anonymous struct used by BPF_MAP_CREATE command */ + __u32 map_type; /* one of enum bpf_map_type */ + __u32 key_size; /* size of key in bytes */ + __u32 value_size; /* size of value in bytes */ + __u32 max_entries; /* max number of entries in a map */ + __u32 map_flags; /* BPF_MAP_CREATE related + * flags defined above. + */ + __u32 inner_map_fd; /* fd pointing to the inner map */ + __u32 numa_node; /* numa node (effective only if + * BPF_F_NUMA_NODE is set). + */ + char map_name[BPF_OBJ_NAME_LEN]; + __u32 map_ifindex; /* ifindex of netdev to create on */ + __u32 btf_fd; /* fd pointing to a BTF type data */ + __u32 btf_key_type_id; /* BTF type_id of the key */ + __u32 btf_value_type_id; /* BTF type_id of the value */ + __u32 btf_vmlinux_value_type_id;/* BTF type_id of a kernel- + * struct stored as the + * map value + */ + /* Any per-map-type extra fields + * + * BPF_MAP_TYPE_BLOOM_FILTER - the lowest 4 bits indicate the + * number of hash functions (if 0, the bloom filter will default + * to using 5 hash functions). + */ + __u64 map_extra; + }; + + struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ + __u32 map_fd; + __aligned_u64 key; + union { + __aligned_u64 value; + __aligned_u64 next_key; + }; + __u64 flags; + }; + + struct { /* struct used by BPF_MAP_*_BATCH commands */ + __aligned_u64 in_batch; /* start batch, + * NULL to start from beginning + */ + __aligned_u64 out_batch; /* output: next start batch */ + __aligned_u64 keys; + __aligned_u64 values; + __u32 count; /* input/output: + * input: # of key/value + * elements + * output: # of filled elements + */ + __u32 map_fd; + __u64 elem_flags; + __u64 flags; + } batch; + + struct { /* anonymous struct used by BPF_PROG_LOAD command */ + __u32 prog_type; /* one of enum bpf_prog_type */ + __u32 insn_cnt; + __aligned_u64 insns; + __aligned_u64 license; + __u32 log_level; /* verbosity level of verifier */ + __u32 log_size; /* size of user buffer */ + __aligned_u64 log_buf; /* user supplied buffer */ + __u32 kern_version; /* not used */ + __u32 prog_flags; + char prog_name[BPF_OBJ_NAME_LEN]; + __u32 prog_ifindex; /* ifindex of netdev to prep for */ + /* For some prog types expected attach type must be known at + * load time to verify attach type specific parts of prog + * (context accesses, allowed helpers, etc). + */ + __u32 expected_attach_type; + __u32 prog_btf_fd; /* fd pointing to BTF type data */ + __u32 func_info_rec_size; /* userspace bpf_func_info size */ + __aligned_u64 func_info; /* func info */ + __u32 func_info_cnt; /* number of bpf_func_info records */ + __u32 line_info_rec_size; /* userspace bpf_line_info size */ + __aligned_u64 line_info; /* line info */ + __u32 line_info_cnt; /* number of bpf_line_info records */ + __u32 attach_btf_id; /* in-kernel BTF type id to attach to */ + union { + /* valid prog_fd to attach to bpf prog */ + __u32 attach_prog_fd; + /* or valid module BTF object fd or 0 to attach to vmlinux */ + __u32 attach_btf_obj_fd; + }; + __u32 core_relo_cnt; /* number of bpf_core_relo */ + __aligned_u64 fd_array; /* array of FDs */ + __aligned_u64 core_relos; + __u32 core_relo_rec_size; /* sizeof(struct bpf_core_relo) */ + }; + + struct { /* anonymous struct used by BPF_OBJ_* commands */ + __aligned_u64 pathname; + __u32 bpf_fd; + __u32 file_flags; + }; + + struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ + __u32 target_fd; /* container object to attach to */ + __u32 attach_bpf_fd; /* eBPF program to attach */ + __u32 attach_type; + __u32 attach_flags; + __u32 replace_bpf_fd; /* previously attached eBPF + * program to replace if + * BPF_F_REPLACE is used + */ + }; + + struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */ + __u32 prog_fd; + __u32 retval; + __u32 data_size_in; /* input: len of data_in */ + __u32 data_size_out; /* input/output: len of data_out + * returns ENOSPC if data_out + * is too small. + */ + __aligned_u64 data_in; + __aligned_u64 data_out; + __u32 repeat; + __u32 duration; + __u32 ctx_size_in; /* input: len of ctx_in */ + __u32 ctx_size_out; /* input/output: len of ctx_out + * returns ENOSPC if ctx_out + * is too small. + */ + __aligned_u64 ctx_in; + __aligned_u64 ctx_out; + __u32 flags; + __u32 cpu; + __u32 batch_size; + } test; + + struct { /* anonymous struct used by BPF_*_GET_*_ID */ + union { + __u32 start_id; + __u32 prog_id; + __u32 map_id; + __u32 btf_id; + __u32 link_id; + }; + __u32 next_id; + __u32 open_flags; + }; + + struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ + __u32 bpf_fd; + __u32 info_len; + __aligned_u64 info; + } info; + + struct { /* anonymous struct used by BPF_PROG_QUERY command */ + __u32 target_fd; /* container object to query */ + __u32 attach_type; + __u32 query_flags; + __u32 attach_flags; + __aligned_u64 prog_ids; + __u32 prog_cnt; + /* output: per-program attach_flags. + * not allowed to be set during effective query. + */ + __aligned_u64 prog_attach_flags; + } query; + + struct { /* anonymous struct used by BPF_RAW_TRACEPOINT_OPEN command */ + __u64 name; + __u32 prog_fd; + } raw_tracepoint; + + struct { /* anonymous struct for BPF_BTF_LOAD */ + __aligned_u64 btf; + __aligned_u64 btf_log_buf; + __u32 btf_size; + __u32 btf_log_size; + __u32 btf_log_level; + }; + + struct { + __u32 pid; /* input: pid */ + __u32 fd; /* input: fd */ + __u32 flags; /* input: flags */ + __u32 buf_len; /* input/output: buf len */ + __aligned_u64 buf; /* input/output: + * tp_name for tracepoint + * symbol for kprobe + * filename for uprobe + */ + __u32 prog_id; /* output: prod_id */ + __u32 fd_type; /* output: BPF_FD_TYPE_* */ + __u64 probe_offset; /* output: probe_offset */ + __u64 probe_addr; /* output: probe_addr */ + } task_fd_query; + + struct { /* struct used by BPF_LINK_CREATE command */ + __u32 prog_fd; /* eBPF program to attach */ + union { + __u32 target_fd; /* object to attach to */ + __u32 target_ifindex; /* target ifindex */ + }; + __u32 attach_type; /* attach type */ + __u32 flags; /* extra flags */ + union { + __u32 target_btf_id; /* btf_id of target to attach to */ + struct { + __aligned_u64 iter_info; /* extra bpf_iter_link_info */ + __u32 iter_info_len; /* iter_info length */ + }; + struct { + /* black box user-provided value passed through + * to BPF program at the execution time and + * accessible through bpf_get_attach_cookie() BPF helper + */ + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + __aligned_u64 syms; + __aligned_u64 addrs; + __aligned_u64 cookies; + } kprobe_multi; + struct { + /* this is overlaid with the target_btf_id above. */ + __u32 target_btf_id; + /* black box user-provided value passed through + * to BPF program at the execution time and + * accessible through bpf_get_attach_cookie() BPF helper + */ + __u64 cookie; + } tracing; + }; + } link_create; + + struct { /* struct used by BPF_LINK_UPDATE command */ + __u32 link_fd; /* link fd */ + /* new program fd to update link with */ + __u32 new_prog_fd; + __u32 flags; /* extra flags */ + /* expected link's program fd; is specified only if + * BPF_F_REPLACE flag is set in flags */ + __u32 old_prog_fd; + } link_update; + + struct { + __u32 link_fd; + } link_detach; + + struct { /* struct used by BPF_ENABLE_STATS command */ + __u32 type; + } enable_stats; + + struct { /* struct used by BPF_ITER_CREATE command */ + __u32 link_fd; + __u32 flags; + } iter_create; + + struct { /* struct used by BPF_PROG_BIND_MAP command */ + __u32 prog_fd; + __u32 map_fd; + __u32 flags; /* extra flags */ + } prog_bind_map; + +} __attribute__((aligned(8))); + +/* The description below is an attempt at providing documentation to eBPF + * developers about the multiple available eBPF helper functions. It can be + * parsed and used to produce a manual page. The workflow is the following, + * and requires the rst2man utility: + * + * $ ./scripts/bpf_doc.py \ + * --filename include/uapi/linux/bpf.h > /tmp/bpf-helpers.rst + * $ rst2man /tmp/bpf-helpers.rst > /tmp/bpf-helpers.7 + * $ man /tmp/bpf-helpers.7 + * + * Note that in order to produce this external documentation, some RST + * formatting is used in the descriptions to get "bold" and "italics" in + * manual pages. Also note that the few trailing white spaces are + * intentional, removing them would break paragraphs for rst2man. + * + * Start of BPF helper function descriptions: + * + * void *bpf_map_lookup_elem(struct bpf_map *map, const void *key) + * Description + * Perform a lookup in *map* for an entry associated to *key*. + * Return + * Map value associated to *key*, or **NULL** if no entry was + * found. + * + * long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags) + * Description + * Add or update the value of the entry associated to *key* in + * *map* with *value*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * Flag value **BPF_NOEXIST** cannot be used for maps of types + * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all + * elements always exist), the helper would return an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_delete_elem(struct bpf_map *map, const void *key) + * Description + * Delete entry with *key* from *map*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read(void *dst, u32 size, const void *unsafe_ptr) + * Description + * For tracing programs, safely attempt to read *size* bytes from + * kernel space address *unsafe_ptr* and store the data in *dst*. + * + * Generally, use **bpf_probe_read_user**\ () or + * **bpf_probe_read_kernel**\ () instead. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_ktime_get_ns(void) + * Description + * Return the time elapsed since system boot, in nanoseconds. + * Does not include time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_MONOTONIC**) + * Return + * Current *ktime*. + * + * long bpf_trace_printk(const char *fmt, u32 fmt_size, ...) + * Description + * This helper is a "printk()-like" facility for debugging. It + * prints a message defined by format *fmt* (of size *fmt_size*) + * to file *\/sys/kernel/debug/tracing/trace* from DebugFS, if + * available. It can take up to three additional **u64** + * arguments (as an eBPF helpers, the total number of arguments is + * limited to five). + * + * Each time the helper is called, it appends a line to the trace. + * Lines are discarded while *\/sys/kernel/debug/tracing/trace* is + * open, use *\/sys/kernel/debug/tracing/trace_pipe* to avoid this. + * The format of the trace is customizable, and the exact output + * one will get depends on the options set in + * *\/sys/kernel/debug/tracing/trace_options* (see also the + * *README* file under the same directory). However, it usually + * defaults to something like: + * + * :: + * + * telnet-470 [001] .N.. 419421.045894: 0x00000001: + * + * In the above: + * + * * ``telnet`` is the name of the current task. + * * ``470`` is the PID of the current task. + * * ``001`` is the CPU number on which the task is + * running. + * * In ``.N..``, each character refers to a set of + * options (whether irqs are enabled, scheduling + * options, whether hard/softirqs are running, level of + * preempt_disabled respectively). **N** means that + * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** + * are set. + * * ``419421.045894`` is a timestamp. + * * ``0x00000001`` is a fake value used by BPF for the + * instruction pointer register. + * * ```` is the message formatted with + * *fmt*. + * + * The conversion specifiers supported by *fmt* are similar, but + * more limited than for printk(). They are **%d**, **%i**, + * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, + * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size + * of field, padding with zeroes, etc.) is available, and the + * helper will return **-EINVAL** (but print nothing) if it + * encounters an unknown specifier. + * + * Also, note that **bpf_trace_printk**\ () is slow, and should + * only be used for debugging purposes. For this reason, a notice + * block (spanning several lines) is printed to kernel logs and + * states that the helper should not be used "for production use" + * the first time this helper is used (or more precisely, when + * **trace_printk**\ () buffers are allocated). For passing values + * to user space, perf events should be preferred. + * Return + * The number of bytes written to the buffer, or a negative error + * in case of failure. + * + * u32 bpf_get_prandom_u32(void) + * Description + * Get a pseudo-random number. + * + * From a security point of view, this helper uses its own + * pseudo-random internal state, and cannot be used to infer the + * seed of other random functions in the kernel. However, it is + * essential to note that the generator used by the helper is not + * cryptographically secure. + * Return + * A random 32-bit unsigned value. + * + * u32 bpf_get_smp_processor_id(void) + * Description + * Get the SMP (symmetric multiprocessing) processor id. Note that + * all programs run with migration disabled, which means that the + * SMP processor id is stable during all the execution of the + * program. + * Return + * The SMP id of the processor running the program. + * + * long bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags) + * Description + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. *flags* are a combination of + * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the + * checksum for the packet after storing the bytes) and + * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ + * **->swhash** and *skb*\ **->l4hash** to 0). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size) + * Description + * Recompute the layer 3 (e.g. IP) checksum for the packet + * associated to *skb*. Computation is incremental, so the helper + * must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored in *size*. + * Alternatively, it is possible to store the difference between + * the previous and the new values of the header field in *to*, by + * setting *from* and *size* to 0. For both methods, *offset* + * indicates the location of the IP checksum within the packet. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags) + * Description + * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the + * packet associated to *skb*. Computation is incremental, so the + * helper must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored on the lowest + * four bits of *flags*. Alternatively, it is possible to store + * the difference between the previous and the new values of the + * header field in *to*, by setting *from* and the four lowest + * bits of *flags* to 0. For both methods, *offset* indicates the + * location of the IP checksum within the packet. In addition to + * the size of the field, *flags* can be added (bitwise OR) actual + * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left + * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and + * for updates resulting in a null checksum the value is set to + * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates + * the checksum is to be computed against a pseudo-header. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index) + * Description + * This special helper is used to trigger a "tail call", or in + * other words, to jump into another eBPF program. The same stack + * frame is used (but values on stack and in registers for the + * caller are not accessible to the callee). This mechanism allows + * for program chaining, either for raising the maximum number of + * available eBPF instructions, or to execute given programs in + * conditional blocks. For security reasons, there is an upper + * limit to the number of successive tail calls that can be + * performed. + * + * Upon call of this helper, the program attempts to jump into a + * program referenced at index *index* in *prog_array_map*, a + * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes + * *ctx*, a pointer to the context. + * + * If the call succeeds, the kernel immediately runs the first + * instruction of the new program. This is not a function call, + * and it never returns to the previous program. If the call + * fails, then the helper has no effect, and the caller continues + * to run its subsequent instructions. A call can fail if the + * destination program for the jump does not exist (i.e. *index* + * is superior to the number of entries in *prog_array_map*), or + * if the maximum number of tail calls has been reached for this + * chain of programs. This limit is defined in the kernel by the + * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), + * which is currently set to 33. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags) + * Description + * Clone and redirect the packet associated to *skb* to another + * net device of index *ifindex*. Both ingress and egress + * interfaces can be used for redirection. The **BPF_F_INGRESS** + * value in *flags* is used to make the distinction (ingress path + * is selected if the flag is present, egress path otherwise). + * This is the only flag supported for now. + * + * In comparison with **bpf_redirect**\ () helper, + * **bpf_clone_redirect**\ () has the associated cost of + * duplicating the packet buffer, but this can be executed out of + * the eBPF program. Conversely, **bpf_redirect**\ () is more + * efficient, but it is handled through an action code where the + * redirection happens only after the eBPF program has returned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_get_current_pid_tgid(void) + * Description + * Get the current pid and tgid. + * Return + * A 64-bit integer containing the current tgid and pid, and + * created as such: + * *current_task*\ **->tgid << 32 \|** + * *current_task*\ **->pid**. + * + * u64 bpf_get_current_uid_gid(void) + * Description + * Get the current uid and gid. + * Return + * A 64-bit integer containing the current GID and UID, and + * created as such: *current_gid* **<< 32 \|** *current_uid*. + * + * long bpf_get_current_comm(void *buf, u32 size_of_buf) + * Description + * Copy the **comm** attribute of the current task into *buf* of + * *size_of_buf*. The **comm** attribute contains the name of + * the executable (excluding the path) for the current task. The + * *size_of_buf* must be strictly positive. On success, the + * helper makes sure that the *buf* is NUL-terminated. On failure, + * it is filled with zeroes. + * Return + * 0 on success, or a negative error in case of failure. + * + * u32 bpf_get_cgroup_classid(struct sk_buff *skb) + * Description + * Retrieve the classid for the current task, i.e. for the net_cls + * cgroup to which *skb* belongs. + * + * This helper can be used on TC egress path, but not on ingress. + * + * The net_cls cgroup provides an interface to tag network packets + * based on a user-provided identifier for all traffic coming from + * the tasks belonging to the related cgroup. See also the related + * kernel documentation, available from the Linux sources in file + * *Documentation/admin-guide/cgroup-v1/net_cls.rst*. + * + * The Linux kernel has two versions for cgroups: there are + * cgroups v1 and cgroups v2. Both are available to users, who can + * use a mixture of them, but note that the net_cls cgroup is for + * cgroup v1 only. This makes it incompatible with BPF programs + * run on cgroups, which is a cgroup-v2-only feature (a socket can + * only hold data for one version of cgroups at a time). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to + * "**y**" or to "**m**". + * Return + * The classid, or 0 for the default unconfigured classid. + * + * long bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci) + * Description + * Push a *vlan_tci* (VLAN tag control information) of protocol + * *vlan_proto* to the packet associated to *skb*, then update + * the checksum. Note that if *vlan_proto* is different from + * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to + * be **ETH_P_8021Q**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_vlan_pop(struct sk_buff *skb) + * Description + * Pop a VLAN header from the packet associated to *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) + * Description + * Get tunnel metadata. This helper takes a pointer *key* to an + * empty **struct bpf_tunnel_key** of **size**, that will be + * filled with tunnel metadata for the packet associated to *skb*. + * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which + * indicates that the tunnel is based on IPv6 protocol instead of + * IPv4. + * + * The **struct bpf_tunnel_key** is an object that generalizes the + * principal parameters used by various tunneling protocols into a + * single struct. This way, it can be used to easily make a + * decision based on the contents of the encapsulation header, + * "summarized" in this struct. In particular, it holds the IP + * address of the remote end (IPv4 or IPv6, depending on the case) + * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, + * this struct exposes the *key*\ **->tunnel_id**, which is + * generally mapped to a VNI (Virtual Network Identifier), making + * it programmable together with the **bpf_skb_set_tunnel_key**\ + * () helper. + * + * Let's imagine that the following code is part of a program + * attached to the TC ingress interface, on one end of a GRE + * tunnel, and is supposed to filter out all messages coming from + * remote ends with IPv4 address other than 10.0.0.1: + * + * :: + * + * int ret; + * struct bpf_tunnel_key key = {}; + * + * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); + * if (ret < 0) + * return TC_ACT_SHOT; // drop packet + * + * if (key.remote_ipv4 != 0x0a000001) + * return TC_ACT_SHOT; // drop packet + * + * return TC_ACT_OK; // accept packet + * + * This interface can also be used with all encapsulation devices + * that can operate in "collect metadata" mode: instead of having + * one network device per specific configuration, the "collect + * metadata" mode only requires a single device where the + * configuration can be extracted from this helper. + * + * This can be used together with various tunnels such as VXLan, + * Geneve, GRE or IP in IP (IPIP). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) + * Description + * Populate tunnel metadata for packet associated to *skb.* The + * tunnel metadata is set to the contents of *key*, of *size*. The + * *flags* can be set to a combination of the following values: + * + * **BPF_F_TUNINFO_IPV6** + * Indicate that the tunnel is based on IPv6 protocol + * instead of IPv4. + * **BPF_F_ZERO_CSUM_TX** + * For IPv4 packets, add a flag to tunnel metadata + * indicating that checksum computation should be skipped + * and checksum set to zeroes. + * **BPF_F_DONT_FRAGMENT** + * Add a flag to tunnel metadata indicating that the + * packet should not be fragmented. + * **BPF_F_SEQ_NUMBER** + * Add a flag to tunnel metadata indicating that a + * sequence number should be added to tunnel header before + * sending the packet. This flag was added for GRE + * encapsulation, but might be used with other protocols + * as well in the future. + * **BPF_F_NO_TUNNEL_KEY** + * Add a flag to tunnel metadata indicating that no tunnel + * key should be set in the resulting tunnel header. + * + * Here is a typical usage on the transmit path: + * + * :: + * + * struct bpf_tunnel_key key; + * populate key ... + * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); + * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); + * + * See also the description of the **bpf_skb_get_tunnel_key**\ () + * helper for additional information. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_perf_event_read(struct bpf_map *map, u64 flags) + * Description + * Read the value of a perf event counter. This helper relies on a + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of + * the perf event counter is selected when *map* is updated with + * perf event file descriptors. The *map* is an array whose size + * is the number of available CPUs, and each cell contains a value + * relative to one CPU. The value to retrieve is indicated by + * *flags*, that contains the index of the CPU to look up, masked + * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * Note that before Linux 4.13, only hardware perf event can be + * retrieved. + * + * Also, be aware that the newer helper + * **bpf_perf_event_read_value**\ () is recommended over + * **bpf_perf_event_read**\ () in general. The latter has some ABI + * quirks where error and counter value are used as a return code + * (which is wrong to do since ranges may overlap). This issue is + * fixed with **bpf_perf_event_read_value**\ (), which at the same + * time provides more features over the **bpf_perf_event_read**\ + * () interface. Please refer to the description of + * **bpf_perf_event_read_value**\ () for details. + * Return + * The value of the perf event counter read from the map, or a + * negative error code in case of failure. + * + * long bpf_redirect(u32 ifindex, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_clone_redirect**\ + * (), except that the packet is not cloned, which provides + * increased performance. + * + * Except for XDP, both ingress and egress interfaces can be used + * for redirection. The **BPF_F_INGRESS** value in *flags* is used + * to make the distinction (ingress path is selected if the flag + * is present, egress path otherwise). Currently, XDP only + * supports redirection to the egress interface, and accepts no + * flag at all. + * + * The same effect can also be attained with the more generic + * **bpf_redirect_map**\ (), which uses a BPF map to store the + * redirect target instead of providing it directly to the helper. + * Return + * For XDP, the helper returns **XDP_REDIRECT** on success or + * **XDP_ABORTED** on error. For other program types, the values + * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on + * error. + * + * u32 bpf_get_route_realm(struct sk_buff *skb) + * Description + * Retrieve the realm or the route, that is to say the + * **tclassid** field of the destination for the *skb*. The + * identifier retrieved is a user-provided tag, similar to the + * one used with the net_cls cgroup (see description for + * **bpf_get_cgroup_classid**\ () helper), but here this tag is + * held by a route (a destination entry), not by a task. + * + * Retrieving this identifier works with the clsact TC egress hook + * (see also **tc-bpf(8)**), or alternatively on conventional + * classful egress qdiscs, but not on TC ingress path. In case of + * clsact TC egress hook, this has the advantage that, internally, + * the destination entry has not been dropped yet in the transmit + * path. Therefore, the destination entry does not need to be + * artificially held via **netif_keep_dst**\ () for a classful + * qdisc until the *skb* is freed. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_IP_ROUTE_CLASSID** configuration option. + * Return + * The realm of the route for the packet associated to *skb*, or 0 + * if none was found. + * + * long bpf_perf_event_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * The context of the program *ctx* needs also be passed to the + * helper. + * + * On user space, a program willing to read the values needs to + * call **perf_event_open**\ () on the perf event (either for + * one or for all CPUs) and to store the file descriptor into the + * *map*. This must be done before the eBPF program can send data + * into it. An example is available in file + * *samples/bpf/trace_output_user.c* in the Linux kernel source + * tree (the eBPF program counterpart is in + * *samples/bpf/trace_output_kern.c*). + * + * **bpf_perf_event_output**\ () achieves better performance + * than **bpf_trace_printk**\ () for sharing data with user + * space, and is much better suitable for streaming data from eBPF + * programs. + * + * Note that this helper is not restricted to tracing use cases + * and can be used with programs attached to TC or XDP as well, + * where it allows for passing data to user space listeners. Data + * can be: + * + * * Only custom structs, + * * Only the packet payload, or + * * A combination of both. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_load_bytes(const void *skb, u32 offset, void *to, u32 len) + * Description + * This helper was provided as an easy way to load data from a + * packet. It can be used to load *len* bytes from *offset* from + * the packet associated to *skb*, into the buffer pointed by + * *to*. + * + * Since Linux 4.7, usage of this helper has mostly been replaced + * by "direct packet access", enabling packet data to be + * manipulated with *skb*\ **->data** and *skb*\ **->data_end** + * pointing respectively to the first byte of packet data and to + * the byte after the last byte of packet data. However, it + * remains useful if one wishes to read large quantities of data + * at once from a packet into the eBPF stack. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_get_stackid(void *ctx, struct bpf_map *map, u64 flags) + * Description + * Walk a user or a kernel stack and return its id. To achieve + * this, the helper needs *ctx*, which is a pointer to the context + * on which the tracing program is executed, and a pointer to a + * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * a combination of the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_FAST_STACK_CMP** + * Compare stacks by hash only. + * **BPF_F_REUSE_STACKID** + * If two different stacks hash into the same *stackid*, + * discard the old one. + * + * The stack id retrieved is a 32 bit long integer handle which + * can be further combined with other data (including other stack + * ids) and used as a key into maps. This can be useful for + * generating a variety of graphs (such as flame graphs or off-cpu + * graphs). + * + * For walking a stack, this helper is an improvement over + * **bpf_probe_read**\ (), which can be used with unrolled loops + * but is not efficient and consumes a lot of eBPF instructions. + * Instead, **bpf_get_stackid**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * Return + * The positive or null stack id on success, or a negative error + * in case of failure. + * + * s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed) + * Description + * Compute a checksum difference, from the raw buffer pointed by + * *from*, of length *from_size* (that must be a multiple of 4), + * towards the raw buffer pointed by *to*, of size *to_size* + * (same remark). An optional *seed* can be added to the value + * (this can be cascaded, the seed may come from a previous call + * to the helper). + * + * This is flexible enough to be used in several ways: + * + * * With *from_size* == 0, *to_size* > 0 and *seed* set to + * checksum, it can be used when pushing new data. + * * With *from_size* > 0, *to_size* == 0 and *seed* set to + * checksum, it can be used when removing data from a packet. + * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it + * can be used to compute a diff. Note that *from_size* and + * *to_size* do not need to be equal. + * + * This helper can be used in combination with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to + * which one can feed in the difference computed with + * **bpf_csum_diff**\ (). + * Return + * The checksum result, or a negative error code in case of + * failure. + * + * long bpf_skb_get_tunnel_opt(struct sk_buff *skb, void *opt, u32 size) + * Description + * Retrieve tunnel options metadata for the packet associated to + * *skb*, and store the raw tunnel option data to the buffer *opt* + * of *size*. + * + * This helper can be used with encapsulation devices that can + * operate in "collect metadata" mode (please refer to the related + * note in the description of **bpf_skb_get_tunnel_key**\ () for + * more details). A particular example where this can be used is + * in combination with the Geneve encapsulation protocol, where it + * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) + * and retrieving arbitrary TLVs (Type-Length-Value headers) from + * the eBPF program. This allows for full customization of these + * headers. + * Return + * The size of the option data retrieved. + * + * long bpf_skb_set_tunnel_opt(struct sk_buff *skb, void *opt, u32 size) + * Description + * Set tunnel options metadata for the packet associated to *skb* + * to the option data contained in the raw buffer *opt* of *size*. + * + * See also the description of the **bpf_skb_get_tunnel_opt**\ () + * helper for additional information. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_change_proto(struct sk_buff *skb, __be16 proto, u64 flags) + * Description + * Change the protocol of the *skb* to *proto*. Currently + * supported are transition from IPv4 to IPv6, and from IPv6 to + * IPv4. The helper takes care of the groundwork for the + * transition, including resizing the socket buffer. The eBPF + * program is expected to fill the new headers, if any, via + * **skb_store_bytes**\ () and to recompute the checksums with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ + * (). The main case for this helper is to perform NAT64 + * operations out of an eBPF program. + * + * Internally, the GSO type is marked as dodgy so that headers are + * checked and segments are recalculated by the GSO/GRO engine. + * The size for GSO target is adapted as well. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_change_type(struct sk_buff *skb, u32 type) + * Description + * Change the packet type for the packet associated to *skb*. This + * comes down to setting *skb*\ **->pkt_type** to *type*, except + * the eBPF program does not have a write access to *skb*\ + * **->pkt_type** beside this helper. Using a helper here allows + * for graceful handling of errors. + * + * The major use case is to change incoming *skb*s to + * **PACKET_HOST** in a programmatic way instead of having to + * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for + * example. + * + * Note that *type* only allows certain values. At this time, they + * are: + * + * **PACKET_HOST** + * Packet is for us. + * **PACKET_BROADCAST** + * Send packet to all. + * **PACKET_MULTICAST** + * Send packet to group. + * **PACKET_OTHERHOST** + * Send packet to someone else. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index) + * Description + * Check whether *skb* is a descendant of the cgroup2 held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * Return + * The return value depends on the result of the test, and can be: + * + * * 0, if the *skb* failed the cgroup2 descendant test. + * * 1, if the *skb* succeeded the cgroup2 descendant test. + * * A negative error code, if an error occurred. + * + * u32 bpf_get_hash_recalc(struct sk_buff *skb) + * Description + * Retrieve the hash of the packet, *skb*\ **->hash**. If it is + * not set, in particular if the hash was cleared due to mangling, + * recompute this hash. Later accesses to the hash can be done + * directly with *skb*\ **->hash**. + * + * Calling **bpf_set_hash_invalid**\ (), changing a packet + * prototype with **bpf_skb_change_proto**\ (), or calling + * **bpf_skb_store_bytes**\ () with the + * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear + * the hash and to trigger a new computation for the next call to + * **bpf_get_hash_recalc**\ (). + * Return + * The 32-bit hash. + * + * u64 bpf_get_current_task(void) + * Description + * Get the current task. + * Return + * A pointer to the current task struct. + * + * long bpf_probe_write_user(void *dst, const void *src, u32 len) + * Description + * Attempt in a safe way to write *len* bytes from the buffer + * *src* to *dst* in memory. It only works for threads that are in + * user context, and *dst* must be a valid user space address. + * + * This helper should not be used to implement any kind of + * security mechanism because of TOC-TOU attacks, but rather to + * debug, divert, and manipulate execution of semi-cooperative + * processes. + * + * Keep in mind that this feature is meant for experiments, and it + * has a risk of crashing the system and running programs. + * Therefore, when an eBPF program using this helper is attached, + * a warning including PID and process name is printed to kernel + * logs. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_current_task_under_cgroup(struct bpf_map *map, u32 index) + * Description + * Check whether the probe is being run is the context of a given + * subset of the cgroup2 hierarchy. The cgroup2 to test is held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * Return + * The return value depends on the result of the test, and can be: + * + * * 1, if current task belongs to the cgroup2. + * * 0, if current task does not belong to the cgroup2. + * * A negative error code, if an error occurred. + * + * long bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags) + * Description + * Resize (trim or grow) the packet associated to *skb* to the + * new *len*. The *flags* are reserved for future usage, and must + * be left at zero. + * + * The basic idea is that the helper performs the needed work to + * change the size of the packet, then the eBPF program rewrites + * the rest via helpers like **bpf_skb_store_bytes**\ (), + * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () + * and others. This helper is a slow path utility intended for + * replies with control messages. And because it is targeted for + * slow path, the helper itself can afford to be slow: it + * implicitly linearizes, unclones and drops offloads from the + * *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_pull_data(struct sk_buff *skb, u32 len) + * Description + * Pull in non-linear data in case the *skb* is non-linear and not + * all of *len* are part of the linear section. Make *len* bytes + * from *skb* readable and writable. If a zero value is passed for + * *len*, then all bytes in the linear part of *skb* will be made + * readable and writable. + * + * This helper is only needed for reading and writing with direct + * packet access. + * + * For direct packet access, testing that offsets to access + * are within packet boundaries (test on *skb*\ **->data_end**) is + * susceptible to fail if offsets are invalid, or if the requested + * data is in non-linear parts of the *skb*. On failure the + * program can just bail out, or in the case of a non-linear + * buffer, use a helper to make the data available. The + * **bpf_skb_load_bytes**\ () helper is a first solution to access + * the data. Another one consists in using **bpf_skb_pull_data** + * to pull in once the non-linear parts, then retesting and + * eventually access the data. + * + * At the same time, this also makes sure the *skb* is uncloned, + * which is a necessary condition for direct write. As this needs + * to be an invariant for the write part only, the verifier + * detects writes and adds a prologue that is calling + * **bpf_skb_pull_data()** to effectively unclone the *skb* from + * the very beginning in case it is indeed cloned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * s64 bpf_csum_update(struct sk_buff *skb, __wsum csum) + * Description + * Add the checksum *csum* into *skb*\ **->csum** in case the + * driver has supplied a checksum for the entire packet into that + * field. Return an error otherwise. This helper is intended to be + * used in combination with **bpf_csum_diff**\ (), in particular + * when the checksum needs to be updated after data has been + * written into the packet through direct packet access. + * Return + * The checksum on success, or a negative error code in case of + * failure. + * + * void bpf_set_hash_invalid(struct sk_buff *skb) + * Description + * Invalidate the current *skb*\ **->hash**. It can be used after + * mangling on headers through direct packet access, in order to + * indicate that the hash is outdated and to trigger a + * recalculation the next time the kernel tries to access this + * hash or when the **bpf_get_hash_recalc**\ () helper is called. + * Return + * void. + * + * long bpf_get_numa_node_id(void) + * Description + * Return the id of the current NUMA node. The primary use case + * for this helper is the selection of sockets for the local NUMA + * node, when the program is attached to sockets using the + * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), + * but the helper is also available to other eBPF program types, + * similarly to **bpf_get_smp_processor_id**\ (). + * Return + * The id of current NUMA node. + * + * long bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags) + * Description + * Grows headroom of packet associated to *skb* and adjusts the + * offset of the MAC header accordingly, adding *len* bytes of + * space. It automatically extends and reallocates memory as + * required. + * + * This helper can be used on a layer 3 *skb* to push a MAC header + * for redirection into a layer 2 device. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that + * it is possible to use a negative value for *delta*. This helper + * can be used to prepare the packet for pushing or popping + * headers. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_str(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Copy a NUL terminated string from an unsafe kernel address + * *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for + * more details. + * + * Generally, use **bpf_probe_read_user_str**\ () or + * **bpf_probe_read_kernel_str**\ () instead. + * Return + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + * + * u64 bpf_get_socket_cookie(struct sk_buff *skb) + * Description + * If the **struct sk_buff** pointed by *skb* has a known socket, + * retrieve the cookie (generated by the kernel) of this socket. + * If no cookie has been set yet, generate a new cookie. Once + * generated, the socket cookie remains stable for the life of the + * socket. This helper can be useful for monitoring per socket + * networking traffic statistics as it provides a global socket + * identifier that can be assumed unique. + * Return + * A 8-byte long unique number on success, or 0 if the socket + * field is missing inside *skb*. + * + * u64 bpf_get_socket_cookie(struct bpf_sock_addr *ctx) + * Description + * Equivalent to bpf_get_socket_cookie() helper that accepts + * *skb*, but gets socket from **struct bpf_sock_addr** context. + * Return + * A 8-byte long unique number. + * + * u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx) + * Description + * Equivalent to **bpf_get_socket_cookie**\ () helper that accepts + * *skb*, but gets socket from **struct bpf_sock_ops** context. + * Return + * A 8-byte long unique number. + * + * u64 bpf_get_socket_cookie(struct sock *sk) + * Description + * Equivalent to **bpf_get_socket_cookie**\ () helper that accepts + * *sk*, but gets socket from a BTF **struct sock**. This helper + * also works for sleepable programs. + * Return + * A 8-byte long unique number or 0 if *sk* is NULL. + * + * u32 bpf_get_socket_uid(struct sk_buff *skb) + * Description + * Get the owner UID of the socked associated to *skb*. + * Return + * The owner UID of the socket associated to *skb*. If the socket + * is **NULL**, or if it is not a full socket (i.e. if it is a + * time-wait or a request socket instead), **overflowuid** value + * is returned (note that **overflowuid** might also be the actual + * UID value for the socket). + * + * long bpf_set_hash(struct sk_buff *skb, u32 hash) + * Description + * Set the full hash for *skb* (set the field *skb*\ **->hash**) + * to value *hash*. + * Return + * 0 + * + * long bpf_setsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen) + * Description + * Emulate a call to **setsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **setsockopt(2)** for more information. + * The option value of length *optlen* is pointed by *optval*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **setsockopt()**. + * It supports the following *level*\ s: + * + * * **SOL_SOCKET**, which supports the following *optname*\ s: + * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, + * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**, + * **SO_BINDTODEVICE**, **SO_KEEPALIVE**, **SO_REUSEADDR**, + * **SO_REUSEPORT**, **SO_BINDTOIFINDEX**, **SO_TXREHASH**. + * * **IPPROTO_TCP**, which supports the following *optname*\ s: + * **TCP_CONGESTION**, **TCP_BPF_IW**, + * **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, + * **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, + * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**, + * **TCP_NODELAY**, **TCP_MAXSEG**, **TCP_WINDOW_CLAMP**, + * **TCP_THIN_LINEAR_TIMEOUTS**, **TCP_BPF_DELACK_MAX**, + * **TCP_BPF_RTO_MIN**. + * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. + * * **IPPROTO_IPV6**, which supports the following *optname*\ s: + * **IPV6_TCLASS**, **IPV6_AUTOFLOWLABEL**. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_adjust_room(struct sk_buff *skb, s32 len_diff, u32 mode, u64 flags) + * Description + * Grow or shrink the room for data in the packet associated to + * *skb* by *len_diff*, and according to the selected *mode*. + * + * By default, the helper will reset any offloaded checksum + * indicator of the skb to CHECKSUM_NONE. This can be avoided + * by the following flag: + * + * * **BPF_F_ADJ_ROOM_NO_CSUM_RESET**: Do not reset offloaded + * checksum data of the skb to CHECKSUM_NONE. + * + * There are two supported modes at this time: + * + * * **BPF_ADJ_ROOM_MAC**: Adjust room at the mac layer + * (room space is added or removed between the layer 2 and + * layer 3 headers). + * + * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer + * (room space is added or removed between the layer 3 and + * layer 4 headers). + * + * The following flags are supported at this time: + * + * * **BPF_F_ADJ_ROOM_FIXED_GSO**: Do not adjust gso_size. + * Adjusting mss in this way is not allowed for datagrams. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV6**: + * Any new space is reserved to hold a tunnel header. + * Configure skb offsets and other fields accordingly. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L4_GRE**, + * **BPF_F_ADJ_ROOM_ENCAP_L4_UDP**: + * Use with ENCAP_L3 flags to further specify the tunnel type. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2**\ (*len*): + * Use with ENCAP_L3/L4 flags to further specify the tunnel + * type; *len* is the length of the inner MAC header. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2_ETH**: + * Use with BPF_F_ADJ_ROOM_ENCAP_L2 flag to further specify the + * L2 type as Ethernet. + * + * * **BPF_F_ADJ_ROOM_DECAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_DECAP_L3_IPV6**: + * Indicate the new IP header version after decapsulating the outer + * IP header. Used when the inner and outer IP versions are different. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_redirect_map(struct bpf_map *map, u64 key, u64 flags) + * Description + * Redirect the packet to the endpoint referenced by *map* at + * index *key*. Depending on its type, this *map* can contain + * references to net devices (for forwarding packets through other + * ports), or to CPUs (for redirecting XDP frames to another CPU; + * but this is only implemented for native XDP (with driver + * support) as of this writing). + * + * The lower two bits of *flags* are used as the return code if + * the map lookup fails. This is so that the return value can be + * one of the XDP program return codes up to **XDP_TX**, as chosen + * by the caller. The higher bits of *flags* can be set to + * BPF_F_BROADCAST or BPF_F_EXCLUDE_INGRESS as defined below. + * + * With BPF_F_BROADCAST the packet will be broadcasted to all the + * interfaces in the map, with BPF_F_EXCLUDE_INGRESS the ingress + * interface will be excluded when do broadcasting. + * + * See also **bpf_redirect**\ (), which only supports redirecting + * to an ifindex, but doesn't require a map to do so. + * Return + * **XDP_REDIRECT** on success, or the value of the two lower bits + * of the *flags* argument on error. + * + * long bpf_sk_redirect_map(struct sk_buff *skb, struct bpf_map *map, u32 key, u64 flags) + * Description + * Redirect the packet to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) + * Description + * Add an entry to, or update a *map* referencing sockets. The + * *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust the address pointed by *xdp_md*\ **->data_meta** by + * *delta* (which can be positive or negative). Note that this + * operation modifies the address stored in *xdp_md*\ **->data**, + * so the latter must be loaded only after the helper has been + * called. + * + * The use of *xdp_md*\ **->data_meta** is optional and programs + * are not required to use it. The rationale is that when the + * packet is processed with XDP (e.g. as DoS filter), it is + * possible to push further meta data along with it before passing + * to the stack, and to give the guarantee that an ingress eBPF + * program attached as a TC classifier on the same device can pick + * this up for further post-processing. Since TC works with socket + * buffers, it remains possible to set from XDP the **mark** or + * **priority** pointers, or other pointers for the socket buffer. + * Having this scratch space generic and programmable allows for + * more flexibility as the user is free to store whatever meta + * data they need. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size) + * Description + * Read the value of a perf event counter, and store it into *buf* + * of size *buf_size*. This helper relies on a *map* of type + * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event + * counter is selected when *map* is updated with perf event file + * descriptors. The *map* is an array whose size is the number of + * available CPUs, and each cell contains a value relative to one + * CPU. The value to retrieve is indicated by *flags*, that + * contains the index of the CPU to look up, masked with + * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * This helper behaves in a way close to + * **bpf_perf_event_read**\ () helper, save that instead of + * just returning the value observed, it fills the *buf* + * structure. This allows for additional data to be retrieved: in + * particular, the enabled and running times (in *buf*\ + * **->enabled** and *buf*\ **->running**, respectively) are + * copied. In general, **bpf_perf_event_read_value**\ () is + * recommended over **bpf_perf_event_read**\ (), which has some + * ABI issues and provides fewer functionalities. + * + * These values are interesting, because hardware PMU (Performance + * Monitoring Unit) counters are limited resources. When there are + * more PMU based perf events opened than available counters, + * kernel will multiplex these events so each event gets certain + * percentage (but not all) of the PMU time. In case that + * multiplexing happens, the number of samples or counter value + * will not reflect the case compared to when no multiplexing + * occurs. This makes comparison between different runs difficult. + * Typically, the counter value should be normalized before + * comparing to other experiments. The usual normalization is done + * as follows. + * + * :: + * + * normalized_counter = counter * t_enabled / t_running + * + * Where t_enabled is the time enabled for event and t_running is + * the time running for event since last normalization. The + * enabled and running times are accumulated since the perf event + * open. To achieve scaling factor between two invocations of an + * eBPF program, users can use CPU id as the key (which is + * typical for perf array usage model) to remember the previous + * value and do the calculation inside the eBPF program. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size) + * Description + * For an eBPF program attached to a perf event, retrieve the + * value of the event counter associated to *ctx* and store it in + * the structure pointed by *buf* and of size *buf_size*. Enabled + * and running times are also stored in the structure (see + * description of helper **bpf_perf_event_read_value**\ () for + * more details). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_getsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen) + * Description + * Emulate a call to **getsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **getsockopt(2)** for more information. + * The retrieved value is stored in the structure pointed by + * *opval* and of length *optlen*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **getsockopt()**. + * It supports the same set of *optname*\ s that is supported by + * the **bpf_setsockopt**\ () helper. The exceptions are + * **TCP_BPF_*** is **bpf_setsockopt**\ () only and + * **TCP_SAVED_SYN** is **bpf_getsockopt**\ () only. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_override_return(struct pt_regs *regs, u64 rc) + * Description + * Used for error injection, this helper uses kprobes to override + * the return value of the probed function, and to set it to *rc*. + * The first argument is the context *regs* on which the kprobe + * works. + * + * This helper works by setting the PC (program counter) + * to an override function which is run in place of the original + * probed function. This means the probed function is not run at + * all. The replacement function just returns with the required + * value. + * + * This helper has security implications, and thus is subject to + * restrictions. It is only available if the kernel was compiled + * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration + * option, and in this case it only works on functions tagged with + * **ALLOW_ERROR_INJECTION** in the kernel code. + * + * Also, the helper is only available for the architectures having + * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, + * x86 architecture is the only one to support this feature. + * Return + * 0 + * + * long bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval) + * Description + * Attempt to set the value of the **bpf_sock_ops_cb_flags** field + * for the full TCP socket associated to *bpf_sock_ops* to + * *argval*. + * + * The primary use of this field is to determine if there should + * be calls to eBPF programs of type + * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP + * code. A program of the same type can change its value, per + * connection and as necessary, when the connection is + * established. This field is directly accessible for reading, but + * this helper must be used for updates in order to return an + * error if an eBPF program tries to set a callback that is not + * supported in the current kernel. + * + * *argval* is a flag array which can combine these flags: + * + * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) + * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) + * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) + * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) + * + * Therefore, this function can be used to clear a callback flag by + * setting the appropriate bit to zero. e.g. to disable the RTO + * callback: + * + * **bpf_sock_ops_cb_flags_set(bpf_sock,** + * **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)** + * + * Here are some examples of where one could call such eBPF + * program: + * + * * When RTO fires. + * * When a packet is retransmitted. + * * When the connection terminates. + * * When a packet is sent. + * * When a packet is received. + * Return + * Code **-EINVAL** if the socket is not a full TCP socket; + * otherwise, a positive number containing the bits that could not + * be set is returned (which comes down to 0 if all bits were set + * as required). + * + * long bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes) + * Description + * For socket policies, apply the verdict of the eBPF program to + * the next *bytes* (number of bytes) of message *msg*. + * + * For example, this helper can be used in the following cases: + * + * * A single **sendmsg**\ () or **sendfile**\ () system call + * contains multiple logical messages that the eBPF program is + * supposed to read and for which it should apply a verdict. + * * An eBPF program only cares to read the first *bytes* of a + * *msg*. If the message has a large payload, then setting up + * and calling the eBPF program repeatedly for all bytes, even + * though the verdict is already known, would create unnecessary + * overhead. + * + * When called from within an eBPF program, the helper sets a + * counter internal to the BPF infrastructure, that is used to + * apply the last verdict to the next *bytes*. If *bytes* is + * smaller than the current data being processed from a + * **sendmsg**\ () or **sendfile**\ () system call, the first + * *bytes* will be sent and the eBPF program will be re-run with + * the pointer for start of data pointing to byte number *bytes* + * **+ 1**. If *bytes* is larger than the current data being + * processed, then the eBPF verdict will be applied to multiple + * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are + * consumed. + * + * Note that if a socket closes with the internal counter holding + * a non-zero value, this is not a problem because data is not + * being buffered for *bytes* and is sent as it is received. + * Return + * 0 + * + * long bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes) + * Description + * For socket policies, prevent the execution of the verdict eBPF + * program for message *msg* until *bytes* (byte number) have been + * accumulated. + * + * This can be used when one needs a specific number of bytes + * before a verdict can be assigned, even if the data spans + * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme + * case would be a user calling **sendmsg**\ () repeatedly with + * 1-byte long message segments. Obviously, this is bad for + * performance, but it is still valid. If the eBPF program needs + * *bytes* bytes to validate a header, this helper can be used to + * prevent the eBPF program to be called again until *bytes* have + * been accumulated. + * Return + * 0 + * + * long bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags) + * Description + * For socket policies, pull in non-linear data from user space + * for *msg* and set pointers *msg*\ **->data** and *msg*\ + * **->data_end** to *start* and *end* bytes offsets into *msg*, + * respectively. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it can only parse data that the (**data**, **data_end**) + * pointers have already consumed. For **sendmsg**\ () hooks this + * is likely the first scatterlist element. But for calls relying + * on the **sendpage** handler (e.g. **sendfile**\ ()) this will + * be the range (**0**, **0**) because the data is shared with + * user space and by default the objective is to avoid allowing + * user space to modify data while (or after) eBPF verdict is + * being decided. This helper can be used to pull in data and to + * set the start and end pointer to given values. Data will be + * copied if necessary (i.e. if data was not linear and if start + * and end pointers do not point to the same chunk). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) + * Description + * Bind the socket associated to *ctx* to the address pointed by + * *addr*, of length *addr_len*. This allows for making outgoing + * connection from the desired IP address, which can be useful for + * example when all processes inside a cgroup should use one + * single IP address on a host that has multiple IP configured. + * + * This helper works for IPv4 and IPv6, TCP and UDP sockets. The + * domain (*addr*\ **->sa_family**) must be **AF_INET** (or + * **AF_INET6**). It's advised to pass zero port (**sin_port** + * or **sin6_port**) which triggers IP_BIND_ADDRESS_NO_PORT-like + * behavior and lets the kernel efficiently pick up an unused + * port as long as 4-tuple is unique. Passing non-zero port might + * lead to degraded performance. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is + * possible to both shrink and grow the packet tail. + * Shrink done via *delta* being a negative integer. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags) + * Description + * Retrieve the XFRM state (IP transform framework, see also + * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. + * + * The retrieved value is stored in the **struct bpf_xfrm_state** + * pointed by *xfrm_state* and of length *size*. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_XFRM** configuration option. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_get_stack(void *ctx, void *buf, u32 size, u64 flags) + * Description + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *ctx*, which is a pointer + * to the context on which the tracing program is executed. + * To store the stacktrace, the bpf program provides *buf* with + * a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect (build_id, file_offset) instead of ips for user + * stack, only valid if **BPF_F_USER_STACK** is also + * specified. + * + * *file_offset* is an offset relative to the beginning + * of the executable or shared object file backing the vma + * which the *ip* falls in. It is *not* an offset relative + * to that object's base address. Accordingly, it must be + * adjusted by adding (sh_addr - sh_offset), where + * sh_{addr,offset} correspond to the executable section + * containing *file_offset* in the object, for comparisons + * to symbols' st_value to be valid. + * + * **bpf_get_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * Return + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + * + * long bpf_skb_load_bytes_relative(const void *skb, u32 offset, void *to, u32 len, u32 start_header) + * Description + * This helper is similar to **bpf_skb_load_bytes**\ () in that + * it provides an easy way to load *len* bytes from *offset* + * from the packet associated to *skb*, into the buffer pointed + * by *to*. The difference to **bpf_skb_load_bytes**\ () is that + * a fifth argument *start_header* exists in order to select a + * base offset to start from. *start_header* can be one of: + * + * **BPF_HDR_START_MAC** + * Base offset to load data from is *skb*'s mac header. + * **BPF_HDR_START_NET** + * Base offset to load data from is *skb*'s network header. + * + * In general, "direct packet access" is the preferred method to + * access packet data, however, this helper is in particular useful + * in socket filters where *skb*\ **->data** does not always point + * to the start of the mac header and where "direct packet access" + * is not available. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags) + * Description + * Do FIB lookup in kernel tables using parameters in *params*. + * If lookup is successful and result shows packet is to be + * forwarded, the neighbor tables are searched for the nexthop. + * If successful (ie., FIB lookup shows forwarding and nexthop + * is resolved), the nexthop address is returned in ipv4_dst + * or ipv6_dst based on family, smac is set to mac address of + * egress device, dmac is set to nexthop mac address, rt_metric + * is set to metric from route (IPv4/IPv6 only), and ifindex + * is set to the device index of the nexthop from the FIB lookup. + * + * *plen* argument is the size of the passed in struct. + * *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_FIB_LOOKUP_DIRECT** + * Do a direct table lookup vs full lookup using FIB + * rules. + * **BPF_FIB_LOOKUP_OUTPUT** + * Perform lookup from an egress perspective (default is + * ingress). + * **BPF_FIB_LOOKUP_SKIP_NEIGH** + * Skip the neighbour table lookup. *params*->dmac + * and *params*->smac will not be set as output. A common + * use case is to call **bpf_redirect_neigh**\ () after + * doing **bpf_fib_lookup**\ (). + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** tc cls_act programs. + * Return + * * < 0 if any input argument is invalid + * * 0 on success (packet is forwarded, nexthop neighbor exists) + * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the + * packet is not forwarded or needs assist from full stack + * + * If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU + * was exceeded and output params->mtu_result contains the MTU. + * + * long bpf_sock_hash_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) + * Description + * Add an entry to, or update a sockhash *map* referencing sockets. + * The *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. + * if the verdict eBPF program returns **SK_PASS**), redirect it + * to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len) + * Description + * Encapsulate the packet associated to *skb* within a Layer 3 + * protocol header. This header is provided in the buffer at + * address *hdr*, with *len* its size in bytes. *type* indicates + * the protocol of the header and can be one of: + * + * **BPF_LWT_ENCAP_SEG6** + * IPv6 encapsulation with Segment Routing Header + * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, + * the IPv6 header is computed by the kernel. + * **BPF_LWT_ENCAP_SEG6_INLINE** + * Only works if *skb* contains an IPv6 packet. Insert a + * Segment Routing Header (**struct ipv6_sr_hdr**) inside + * the IPv6 header. + * **BPF_LWT_ENCAP_IP** + * IP encapsulation (GRE/GUE/IPIP/etc). The outer header + * must be IPv4 or IPv6, followed by zero or more + * additional headers, up to **LWT_BPF_MAX_HEADROOM** + * total bytes in all prepended headers. Please note that + * if **skb_is_gso**\ (*skb*) is true, no more than two + * headers can be prepended, and the inner header, if + * present, should be either GRE or UDP/GUE. + * + * **BPF_LWT_ENCAP_SEG6**\ \* types can be called by BPF programs + * of type **BPF_PROG_TYPE_LWT_IN**; **BPF_LWT_ENCAP_IP** type can + * be called by bpf programs of types **BPF_PROG_TYPE_LWT_IN** and + * **BPF_PROG_TYPE_LWT_XMIT**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len) + * Description + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. Only the flags, tag and TLVs + * inside the outermost IPv6 Segment Routing Header can be + * modified through this helper. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta) + * Description + * Adjust the size allocated to TLVs in the outermost IPv6 + * Segment Routing Header contained in the packet associated to + * *skb*, at position *offset* by *delta* bytes. Only offsets + * after the segments are accepted. *delta* can be as well + * positive (growing) as negative (shrinking). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len) + * Description + * Apply an IPv6 Segment Routing action of type *action* to the + * packet associated to *skb*. Each action takes a parameter + * contained at address *param*, and of length *param_len* bytes. + * *action* can be one of: + * + * **SEG6_LOCAL_ACTION_END_X** + * End.X action: Endpoint with Layer-3 cross-connect. + * Type of *param*: **struct in6_addr**. + * **SEG6_LOCAL_ACTION_END_T** + * End.T action: Endpoint with specific IPv6 table lookup. + * Type of *param*: **int**. + * **SEG6_LOCAL_ACTION_END_B6** + * End.B6 action: Endpoint bound to an SRv6 policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * **SEG6_LOCAL_ACTION_END_B6_ENCAP** + * End.B6.Encap action: Endpoint bound to an SRv6 + * encapsulation policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_rc_repeat(void *ctx) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded repeat key message. This delays + * the generation of a key up event for previously generated + * key down event. + * + * Some IR protocols like NEC have a special IR message for + * repeating last button, for when a button is held down. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * long bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded key press with *scancode*, + * *toggle* value in the given *protocol*. The scancode will be + * translated to a keycode using the rc keymap, and reported as + * an input key down event. After a period a key up event is + * generated. This period can be extended by calling either + * **bpf_rc_keydown**\ () again with the same values, or calling + * **bpf_rc_repeat**\ (). + * + * Some protocols include a toggle bit, in case the button was + * released and pressed again between consecutive scancodes. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * The *protocol* is the decoded protocol number (see + * **enum rc_proto** for some predefined values). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * u64 bpf_skb_cgroup_id(struct sk_buff *skb) + * Description + * Return the cgroup v2 id of the socket associated with the *skb*. + * This is roughly similar to the **bpf_get_cgroup_classid**\ () + * helper for cgroup v1 by providing a tag resp. identifier that + * can be matched on or used for map lookups e.g. to implement + * policy. The cgroup v2 id of a given path in the hierarchy is + * exposed in user space through the f_handle API in order to get + * to the same 64-bit id. + * + * This helper can be used on TC egress path, but not on ingress, + * and is available only if the kernel was compiled with the + * **CONFIG_SOCK_CGROUP_DATA** configuration option. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * u64 bpf_get_current_cgroup_id(void) + * Description + * Get the current cgroup id based on the cgroup within which + * the current task is running. + * Return + * A 64-bit integer containing the current cgroup id based + * on the cgroup within which the current task is running. + * + * void *bpf_get_local_storage(void *map, u64 flags) + * Description + * Get the pointer to the local storage area. + * The type and the size of the local storage is defined + * by the *map* argument. + * The *flags* meaning is specific for each map type, + * and has to be 0 for cgroup local storage. + * + * Depending on the BPF program type, a local storage area + * can be shared between multiple instances of the BPF program, + * running simultaneously. + * + * A user should care about the synchronization by himself. + * For example, by using the **BPF_ATOMIC** instructions to alter + * the shared data. + * Return + * A pointer to the local storage area. + * + * long bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags) + * Description + * Select a **SO_REUSEPORT** socket from a + * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*. + * It checks the selected socket is matching the incoming + * request in the socket buffer. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *skb* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *skb*, then return value will be same as that + * of **bpf_skb_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *skb*. + * + * The format of returned id and helper limitations are same as in + * **bpf_skb_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * struct bpf_sock *bpf_sk_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + * + * struct bpf_sock *bpf_sk_lookup_udp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for UDP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + * + * long bpf_sk_release(void *sock) + * Description + * Release the reference held by *sock*. *sock* must be a + * non-**NULL** pointer that was returned from + * **bpf_sk_lookup_xxx**\ (). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags) + * Description + * Push an element *value* in *map*. *flags* is one of: + * + * **BPF_EXIST** + * If the queue/stack is full, the oldest element is + * removed to make room for this. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_pop_elem(struct bpf_map *map, void *value) + * Description + * Pop an element from *map*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_peek_elem(struct bpf_map *map, void *value) + * Description + * Get an element from *map* without removing it. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_msg_push_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags) + * Description + * For socket policies, insert *len* bytes into *msg* at offset + * *start*. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it may want to insert metadata or options into the *msg*. + * This can later be read and used by any of the lower layer BPF + * hooks. + * + * This helper may fail if under memory pressure (a malloc + * fails) in these cases BPF programs will get an appropriate + * error and BPF programs will need to handle them. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_msg_pop_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags) + * Description + * Will remove *len* bytes from a *msg* starting at byte *start*. + * This may result in **ENOMEM** errors under certain situations if + * an allocation and copy are required due to a full ring buffer. + * However, the helper will try to avoid doing the allocation + * if possible. Other errors can occur if input parameters are + * invalid either due to *start* byte not being valid part of *msg* + * payload and/or *pop* value being to large. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded pointer movement. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * long bpf_spin_lock(struct bpf_spin_lock *lock) + * Description + * Acquire a spinlock represented by the pointer *lock*, which is + * stored as part of a value of a map. Taking the lock allows to + * safely update the rest of the fields in that value. The + * spinlock can (and must) later be released with a call to + * **bpf_spin_unlock**\ (\ *lock*\ ). + * + * Spinlocks in BPF programs come with a number of restrictions + * and constraints: + * + * * **bpf_spin_lock** objects are only allowed inside maps of + * types **BPF_MAP_TYPE_HASH** and **BPF_MAP_TYPE_ARRAY** (this + * list could be extended in the future). + * * BTF description of the map is mandatory. + * * The BPF program can take ONE lock at a time, since taking two + * or more could cause dead locks. + * * Only one **struct bpf_spin_lock** is allowed per map element. + * * When the lock is taken, calls (either BPF to BPF or helpers) + * are not allowed. + * * The **BPF_LD_ABS** and **BPF_LD_IND** instructions are not + * allowed inside a spinlock-ed region. + * * The BPF program MUST call **bpf_spin_unlock**\ () to release + * the lock, on all execution paths, before it returns. + * * The BPF program can access **struct bpf_spin_lock** only via + * the **bpf_spin_lock**\ () and **bpf_spin_unlock**\ () + * helpers. Loading or storing data into the **struct + * bpf_spin_lock** *lock*\ **;** field of a map is not allowed. + * * To use the **bpf_spin_lock**\ () helper, the BTF description + * of the map value must be a struct and have **struct + * bpf_spin_lock** *anyname*\ **;** field at the top level. + * Nested lock inside another struct is not allowed. + * * The **struct bpf_spin_lock** *lock* field in a map value must + * be aligned on a multiple of 4 bytes in that value. + * * Syscall with command **BPF_MAP_LOOKUP_ELEM** does not copy + * the **bpf_spin_lock** field to user space. + * * Syscall with command **BPF_MAP_UPDATE_ELEM**, or update from + * a BPF program, do not update the **bpf_spin_lock** field. + * * **bpf_spin_lock** cannot be on the stack or inside a + * networking packet (it can only be inside of a map values). + * * **bpf_spin_lock** is available to root only. + * * Tracing programs and socket filter programs cannot use + * **bpf_spin_lock**\ () due to insufficient preemption checks + * (but this may change in the future). + * * **bpf_spin_lock** is not allowed in inner maps of map-in-map. + * Return + * 0 + * + * long bpf_spin_unlock(struct bpf_spin_lock *lock) + * Description + * Release the *lock* previously locked by a call to + * **bpf_spin_lock**\ (\ *lock*\ ). + * Return + * 0 + * + * struct bpf_sock *bpf_sk_fullsock(struct bpf_sock *sk) + * Description + * This helper gets a **struct bpf_sock** pointer such + * that all the fields in this **bpf_sock** can be accessed. + * Return + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + * + * struct bpf_tcp_sock *bpf_tcp_sock(struct bpf_sock *sk) + * Description + * This helper gets a **struct bpf_tcp_sock** pointer from a + * **struct bpf_sock** pointer. + * Return + * A **struct bpf_tcp_sock** pointer on success, or **NULL** in + * case of failure. + * + * long bpf_skb_ecn_set_ce(struct sk_buff *skb) + * Description + * Set ECN (Explicit Congestion Notification) field of IP header + * to **CE** (Congestion Encountered) if current value is **ECT** + * (ECN Capable Transport). Otherwise, do nothing. Works with IPv6 + * and IPv4. + * Return + * 1 if the **CE** flag is set (either by the current helper call + * or because it was already present), 0 if it is not set. + * + * struct bpf_sock *bpf_get_listener_sock(struct bpf_sock *sk) + * Description + * Return a **struct bpf_sock** pointer in **TCP_LISTEN** state. + * **bpf_sk_release**\ () is unnecessary and not allowed. + * Return + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + * + * struct bpf_sock *bpf_skc_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * This function is identical to **bpf_sk_lookup_tcp**\ (), except + * that it also returns timewait or request sockets. Use + * **bpf_sk_fullsock**\ () or **bpf_tcp_sock**\ () to access the + * full structure. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + * + * long bpf_tcp_check_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len) + * Description + * Check whether *iph* and *th* contain a valid SYN cookie ACK for + * the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative + * error otherwise. + * + * long bpf_sysctl_get_name(struct bpf_sysctl *ctx, char *buf, size_t buf_len, u64 flags) + * Description + * Get name of sysctl in /proc/sys/ and copy it into provided by + * program buffer *buf* of size *buf_len*. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * If *flags* is zero, full name (e.g. "net/ipv4/tcp_mem") is + * copied. Use **BPF_F_SYSCTL_BASE_NAME** flag to copy base name + * only (e.g. "tcp_mem"). + * Return + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * long bpf_sysctl_get_current_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len) + * Description + * Get current value of sysctl as it is presented in /proc/sys + * (incl. newline, etc), and copy it as a string into provided + * by program buffer *buf* of size *buf_len*. + * + * The whole value is copied, no matter what file position user + * space issued e.g. sys_read at. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * Return + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if current value was unavailable, e.g. because + * sysctl is uninitialized and read returns -EIO for it. + * + * long bpf_sysctl_get_new_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len) + * Description + * Get new value being written by user space to sysctl (before + * the actual write happens) and copy it as a string into + * provided by program buffer *buf* of size *buf_len*. + * + * User space may write new value at file position > 0. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * Return + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if sysctl is being read. + * + * long bpf_sysctl_set_new_value(struct bpf_sysctl *ctx, const char *buf, size_t buf_len) + * Description + * Override new value being written by user space to sysctl with + * value provided by program in buffer *buf* of size *buf_len*. + * + * *buf* should contain a string in same form as provided by user + * space on sysctl write. + * + * User space may write new value at file position > 0. To override + * the whole sysctl value file position should be set to zero. + * Return + * 0 on success. + * + * **-E2BIG** if the *buf_len* is too big. + * + * **-EINVAL** if sysctl is being read. + * + * long bpf_strtol(const char *buf, size_t buf_len, u64 flags, long *res) + * Description + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to a long integer according to the given base + * and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)) followed by a single + * optional '**-**' sign. + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtol**\ (3). + * Return + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + * + * long bpf_strtoul(const char *buf, size_t buf_len, u64 flags, unsigned long *res) + * Description + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to an unsigned long integer according to the + * given base and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)). + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtoul**\ (3). + * Return + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + * + * void *bpf_sk_storage_get(struct bpf_map *map, void *sk, void *value, u64 flags) + * Description + * Get a bpf-local-storage from a *sk*. + * + * Logically, it could be thought of getting the value from + * a *map* with *sk* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *sk*) except this + * helper enforces the key must be a full socket and the map must + * be a **BPF_MAP_TYPE_SK_STORAGE** also. + * + * Underneath, the value is stored locally at *sk* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf-local-storages residing at *sk*. + * + * *sk* is a kernel **struct sock** pointer for LSM program. + * *sk* is a **struct bpf_sock** pointer for other program types. + * + * An optional *flags* (**BPF_SK_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf-local-storage will be + * created if one does not exist. *value* can be used + * together with **BPF_SK_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf-local-storage. If *value* is + * **NULL**, the new bpf-local-storage will be zero initialized. + * Return + * A bpf-local-storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf-local-storage. + * + * long bpf_sk_storage_delete(struct bpf_map *map, void *sk) + * Description + * Delete a bpf-local-storage from a *sk*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf-local-storage cannot be found. + * **-EINVAL** if sk is not a fullsock (e.g. a request_sock). + * + * long bpf_send_signal(u32 sig) + * Description + * Send signal *sig* to the process of the current task. + * The signal may be delivered to any of this process's threads. + * Return + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + * + * s64 bpf_tcp_gen_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len) + * Description + * Try to issue a SYN cookie for the packet with corresponding + * IP/TCP headers, *iph* and *th*, on the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header with options (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** SYN cookie cannot be issued due to error + * + * **-ENOENT** SYN cookie should not be issued (no SYN flood) + * + * **-EOPNOTSUPP** kernel configuration does not enable SYN cookies + * + * **-EPROTONOSUPPORT** IP packet version is not 4 or 6 + * + * long bpf_skb_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct sk_buff. + * + * This helper is similar to **bpf_perf_event_output**\ () but + * restricted to raw_tracepoint bpf programs. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_user(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Safely attempt to read *size* bytes from user space address + * *unsafe_ptr* and store the data in *dst*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Safely attempt to read *size* bytes from kernel space address + * *unsafe_ptr* and store the data in *dst*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_user_str(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Copy a NUL terminated string from an unsafe user address + * *unsafe_ptr* to *dst*. The *size* should include the + * terminating NUL byte. In case the string length is smaller than + * *size*, the target is not padded with further NUL bytes. If the + * string length is larger than *size*, just *size*-1 bytes are + * copied and the last byte is set to NUL. + * + * On success, returns the number of bytes that were written, + * including the terminal NUL. This makes this helper useful in + * tracing programs for reading strings, and more importantly to + * get its length at runtime. See the following snippet: + * + * :: + * + * SEC("kprobe/sys_open") + * void bpf_sys_open(struct pt_regs *ctx) + * { + * char buf[PATHLEN]; // PATHLEN is defined to 256 + * int res = bpf_probe_read_user_str(buf, sizeof(buf), + * ctx->di); + * + * // Consume buf, for example push it to + * // userspace via bpf_perf_event_output(); we + * // can use res (the string length) as event + * // size, after checking its boundaries. + * } + * + * In comparison, using **bpf_probe_read_user**\ () helper here + * instead to read the string would require to estimate the length + * at compile time, and would often result in copying more memory + * than necessary. + * + * Another useful use case is when parsing individual process + * arguments or individual environment variables navigating + * *current*\ **->mm->arg_start** and *current*\ + * **->mm->env_start**: using this helper and the return value, + * one can quickly iterate at the right offset of the memory area. + * Return + * On success, the strictly positive length of the output string, + * including the trailing NUL character. On error, a negative + * value. + * + * long bpf_probe_read_kernel_str(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr* + * to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply. + * Return + * On success, the strictly positive length of the string, including + * the trailing NUL character. On error, a negative value. + * + * long bpf_tcp_send_ack(void *tp, u32 rcv_nxt) + * Description + * Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**. + * *rcv_nxt* is the ack_seq to be sent out. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_send_signal_thread(u32 sig) + * Description + * Send signal *sig* to the thread corresponding to the current task. + * Return + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + * + * u64 bpf_jiffies64(void) + * Description + * Obtain the 64bit jiffies + * Return + * The 64 bit jiffies + * + * long bpf_read_branch_records(struct bpf_perf_event_data *ctx, void *buf, u32 size, u64 flags) + * Description + * For an eBPF program attached to a perf event, retrieve the + * branch records (**struct perf_branch_entry**) associated to *ctx* + * and store it in the buffer pointed by *buf* up to size + * *size* bytes. + * Return + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to + * instead return the number of bytes required to store all the + * branch entries. If this flag is set, *buf* may be NULL. + * + * **-EINVAL** if arguments invalid or **size** not a multiple + * of **sizeof**\ (**struct perf_branch_entry**\ ). + * + * **-ENOENT** if architecture does not support branch records. + * + * long bpf_get_ns_current_pid_tgid(u64 dev, u64 ino, struct bpf_pidns_info *nsdata, u32 size) + * Description + * Returns 0 on success, values for *pid* and *tgid* as seen from the current + * *namespace* will be returned in *nsdata*. + * Return + * 0 on success, or one of the following in case of failure: + * + * **-EINVAL** if dev and inum supplied don't match dev_t and inode number + * with nsfs of current task, or if dev conversion to dev_t lost high bits. + * + * **-ENOENT** if pidns does not exists for the current task. + * + * long bpf_xdp_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct xdp_buff. + * + * This helper is similar to **bpf_perf_eventoutput**\ () but + * restricted to raw_tracepoint bpf programs. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_get_netns_cookie(void *ctx) + * Description + * Retrieve the cookie (generated by the kernel) of the network + * namespace the input *ctx* is associated with. The network + * namespace cookie remains stable for its lifetime and provides + * a global identifier that can be assumed unique. If *ctx* is + * NULL, then the helper returns the cookie for the initial + * network namespace. The cookie itself is very similar to that + * of **bpf_get_socket_cookie**\ () helper, but for network + * namespaces instead of sockets. + * Return + * A 8-byte long opaque number. + * + * u64 bpf_get_current_ancestor_cgroup_id(int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of the cgroup associated + * with the current task at the *ancestor_level*. The root cgroup + * is at *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with the current task, then return value will be the + * same as that of **bpf_get_current_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with the current task. + * + * The format of returned id and helper limitations are same as in + * **bpf_get_current_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * long bpf_sk_assign(struct sk_buff *skb, void *sk, u64 flags) + * Description + * Helper is overloaded depending on BPF program type. This + * description applies to **BPF_PROG_TYPE_SCHED_CLS** and + * **BPF_PROG_TYPE_SCHED_ACT** programs. + * + * Assign the *sk* to the *skb*. When combined with appropriate + * routing configuration to receive the packet towards the socket, + * will cause *skb* to be delivered to the specified socket. + * Subsequent redirection of *skb* via **bpf_redirect**\ (), + * **bpf_clone_redirect**\ () or other methods outside of BPF may + * interfere with successful delivery to the socket. + * + * This operation is only valid from TC ingress path. + * + * The *flags* argument must be zero. + * Return + * 0 on success, or a negative error in case of failure: + * + * **-EINVAL** if specified *flags* are not supported. + * + * **-ENOENT** if the socket is unavailable for assignment. + * + * **-ENETUNREACH** if the socket is unreachable (wrong netns). + * + * **-EOPNOTSUPP** if the operation is not supported, for example + * a call from outside of TC ingress. + * + * **-ESOCKTNOSUPPORT** if the socket type is not supported + * (reuseport). + * + * long bpf_sk_assign(struct bpf_sk_lookup *ctx, struct bpf_sock *sk, u64 flags) + * Description + * Helper is overloaded depending on BPF program type. This + * description applies to **BPF_PROG_TYPE_SK_LOOKUP** programs. + * + * Select the *sk* as a result of a socket lookup. + * + * For the operation to succeed passed socket must be compatible + * with the packet description provided by the *ctx* object. + * + * L4 protocol (**IPPROTO_TCP** or **IPPROTO_UDP**) must + * be an exact match. While IP family (**AF_INET** or + * **AF_INET6**) must be compatible, that is IPv6 sockets + * that are not v6-only can be selected for IPv4 packets. + * + * Only TCP listeners and UDP unconnected sockets can be + * selected. *sk* can also be NULL to reset any previous + * selection. + * + * *flags* argument can combination of following values: + * + * * **BPF_SK_LOOKUP_F_REPLACE** to override the previous + * socket selection, potentially done by a BPF program + * that ran before us. + * + * * **BPF_SK_LOOKUP_F_NO_REUSEPORT** to skip + * load-balancing within reuseport group for the socket + * being selected. + * + * On success *ctx->sk* will point to the selected socket. + * + * Return + * 0 on success, or a negative errno in case of failure. + * + * * **-EAFNOSUPPORT** if socket family (*sk->family*) is + * not compatible with packet family (*ctx->family*). + * + * * **-EEXIST** if socket has been already selected, + * potentially by another program, and + * **BPF_SK_LOOKUP_F_REPLACE** flag was not specified. + * + * * **-EINVAL** if unsupported flags were specified. + * + * * **-EPROTOTYPE** if socket L4 protocol + * (*sk->protocol*) doesn't match packet protocol + * (*ctx->protocol*). + * + * * **-ESOCKTNOSUPPORT** if socket is not in allowed + * state (TCP listening or UDP unconnected). + * + * u64 bpf_ktime_get_boot_ns(void) + * Description + * Return the time elapsed since system boot, in nanoseconds. + * Does include the time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_BOOTTIME**) + * Return + * Current *ktime*. + * + * long bpf_seq_printf(struct seq_file *m, const char *fmt, u32 fmt_size, const void *data, u32 data_len) + * Description + * **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print + * out the format string. + * The *m* represents the seq_file. The *fmt* and *fmt_size* are for + * the format string itself. The *data* and *data_len* are format string + * arguments. The *data* are a **u64** array and corresponding format string + * values are stored in the array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* array. + * The *data_len* is the size of *data* in bytes - must be a multiple of 8. + * + * Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory. + * Reading kernel memory may fail due to either invalid address or + * valid address but requiring a major memory fault. If reading kernel memory + * fails, the string for **%s** will be an empty string, and the ip + * address for **%p{i,I}{4,6}** will be 0. Not returning error to + * bpf program is consistent with what **bpf_trace_printk**\ () does for now. + * Return + * 0 on success, or a negative error in case of failure: + * + * **-EBUSY** if per-CPU memory copy buffer is busy, can try again + * by returning 1 from bpf program. + * + * **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported. + * + * **-E2BIG** if *fmt* contains too many format specifiers. + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + * + * long bpf_seq_write(struct seq_file *m, const void *data, u32 len) + * Description + * **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data. + * The *m* represents the seq_file. The *data* and *len* represent the + * data to write in bytes. + * Return + * 0 on success, or a negative error in case of failure: + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + * + * u64 bpf_sk_cgroup_id(void *sk) + * Description + * Return the cgroup v2 id of the socket *sk*. + * + * *sk* must be a non-**NULL** pointer to a socket, e.g. one + * returned from **bpf_sk_lookup_xxx**\ (), + * **bpf_sk_fullsock**\ (), etc. The format of returned id is + * same as in **bpf_skb_cgroup_id**\ (). + * + * This helper is available only if the kernel was compiled with + * the **CONFIG_SOCK_CGROUP_DATA** configuration option. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * u64 bpf_sk_ancestor_cgroup_id(void *sk, int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *sk* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *sk*, then return value will be same as that + * of **bpf_sk_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *sk*. + * + * The format of returned id and helper limitations are same as in + * **bpf_sk_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * long bpf_ringbuf_output(void *ringbuf, void *data, u64 size, u64 flags) + * Description + * Copy *size* bytes from *data* into a ring buffer *ringbuf*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * An adaptive notification is a notification sent whenever the user-space + * process has caught up and consumed all available payloads. In case the user-space + * process is still processing a previous payload, then no notification is needed + * as it will process the newly added payload automatically. + * Return + * 0 on success, or a negative error in case of failure. + * + * void *bpf_ringbuf_reserve(void *ringbuf, u64 size, u64 flags) + * Description + * Reserve *size* bytes of payload in a ring buffer *ringbuf*. + * *flags* must be 0. + * Return + * Valid pointer with *size* bytes of memory available; NULL, + * otherwise. + * + * void bpf_ringbuf_submit(void *data, u64 flags) + * Description + * Submit reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * Return + * Nothing. Always succeeds. + * + * void bpf_ringbuf_discard(void *data, u64 flags) + * Description + * Discard reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * Return + * Nothing. Always succeeds. + * + * u64 bpf_ringbuf_query(void *ringbuf, u64 flags) + * Description + * Query various characteristics of provided ring buffer. What + * exactly is queries is determined by *flags*: + * + * * **BPF_RB_AVAIL_DATA**: Amount of data not yet consumed. + * * **BPF_RB_RING_SIZE**: The size of ring buffer. + * * **BPF_RB_CONS_POS**: Consumer position (can wrap around). + * * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around). + * + * Data returned is just a momentary snapshot of actual values + * and could be inaccurate, so this facility should be used to + * power heuristics and for reporting, not to make 100% correct + * calculation. + * Return + * Requested value, or 0, if *flags* are not recognized. + * + * long bpf_csum_level(struct sk_buff *skb, u64 level) + * Description + * Change the skbs checksum level by one layer up or down, or + * reset it entirely to none in order to have the stack perform + * checksum validation. The level is applicable to the following + * protocols: TCP, UDP, GRE, SCTP, FCOE. For example, a decap of + * | ETH | IP | UDP | GUE | IP | TCP | into | ETH | IP | TCP | + * through **bpf_skb_adjust_room**\ () helper with passing in + * **BPF_F_ADJ_ROOM_NO_CSUM_RESET** flag would require one call + * to **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_DEC** since + * the UDP header is removed. Similarly, an encap of the latter + * into the former could be accompanied by a helper call to + * **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_INC** if the + * skb is still intended to be processed in higher layers of the + * stack instead of just egressing at tc. + * + * There are three supported level settings at this time: + * + * * **BPF_CSUM_LEVEL_INC**: Increases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_DEC**: Decreases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_RESET**: Resets skb->csum_level to 0 and + * sets CHECKSUM_NONE to force checksum validation by the stack. + * * **BPF_CSUM_LEVEL_QUERY**: No-op, returns the current + * skb->csum_level. + * Return + * 0 on success, or a negative error in case of failure. In the + * case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level + * is returned or the error code -EACCES in case the skb is not + * subject to CHECKSUM_UNNECESSARY. + * + * struct tcp6_sock *bpf_skc_to_tcp6_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp6_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct tcp_sock *bpf_skc_to_tcp_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct tcp_timewait_sock *bpf_skc_to_tcp_timewait_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct tcp_request_sock *bpf_skc_to_tcp_request_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct udp6_sock *bpf_skc_to_udp6_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *udp6_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_get_task_stack(struct task_struct *task, void *buf, u32 size, u64 flags) + * Description + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *task*, which is a valid + * pointer to **struct task_struct**. To store the stacktrace, the + * bpf program provides *buf* with a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect buildid+offset instead of ips for user stack, + * only valid if **BPF_F_USER_STACK** is also specified. + * + * **bpf_get_task_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * Return + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + * + * long bpf_load_hdr_opt(struct bpf_sock_ops *skops, void *searchby_res, u32 len, u64 flags) + * Description + * Load header option. Support reading a particular TCP header + * option for bpf program (**BPF_PROG_TYPE_SOCK_OPS**). + * + * If *flags* is 0, it will search the option from the + * *skops*\ **->skb_data**. The comment in **struct bpf_sock_ops** + * has details on what skb_data contains under different + * *skops*\ **->op**. + * + * The first byte of the *searchby_res* specifies the + * kind that it wants to search. + * + * If the searching kind is an experimental kind + * (i.e. 253 or 254 according to RFC6994). It also + * needs to specify the "magic" which is either + * 2 bytes or 4 bytes. It then also needs to + * specify the size of the magic by using + * the 2nd byte which is "kind-length" of a TCP + * header option and the "kind-length" also + * includes the first 2 bytes "kind" and "kind-length" + * itself as a normal TCP header option also does. + * + * For example, to search experimental kind 254 with + * 2 byte magic 0xeB9F, the searchby_res should be + * [ 254, 4, 0xeB, 0x9F, 0, 0, .... 0 ]. + * + * To search for the standard window scale option (3), + * the *searchby_res* should be [ 3, 0, 0, .... 0 ]. + * Note, kind-length must be 0 for regular option. + * + * Searching for No-Op (0) and End-of-Option-List (1) are + * not supported. + * + * *len* must be at least 2 bytes which is the minimal size + * of a header option. + * + * Supported flags: + * + * * **BPF_LOAD_HDR_OPT_TCP_SYN** to search from the + * saved_syn packet or the just-received syn packet. + * + * Return + * > 0 when found, the header option is copied to *searchby_res*. + * The return value is the total length copied. On failure, a + * negative error code is returned: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOMSG** if the option is not found. + * + * **-ENOENT** if no syn packet is available when + * **BPF_LOAD_HDR_OPT_TCP_SYN** is used. + * + * **-ENOSPC** if there is not enough space. Only *len* number of + * bytes are copied. + * + * **-EFAULT** on failure to parse the header options in the + * packet. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + * + * long bpf_store_hdr_opt(struct bpf_sock_ops *skops, const void *from, u32 len, u64 flags) + * Description + * Store header option. The data will be copied + * from buffer *from* with length *len* to the TCP header. + * + * The buffer *from* should have the whole option that + * includes the kind, kind-length, and the actual + * option data. The *len* must be at least kind-length + * long. The kind-length does not have to be 4 byte + * aligned. The kernel will take care of the padding + * and setting the 4 bytes aligned value to th->doff. + * + * This helper will check for duplicated option + * by searching the same option in the outgoing skb. + * + * This helper can only be called during + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * Return + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** If param is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * Nothing has been written + * + * **-EEXIST** if the option already exists. + * + * **-EFAULT** on failure to parse the existing header options. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + * + * long bpf_reserve_hdr_opt(struct bpf_sock_ops *skops, u32 len, u64 flags) + * Description + * Reserve *len* bytes for the bpf header option. The + * space will be used by **bpf_store_hdr_opt**\ () later in + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * If **bpf_reserve_hdr_opt**\ () is called multiple times, + * the total number of bytes will be reserved. + * + * This helper can only be called during + * **BPF_SOCK_OPS_HDR_OPT_LEN_CB**. + * + * Return + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + * + * void *bpf_inode_storage_get(struct bpf_map *map, void *inode, void *value, u64 flags) + * Description + * Get a bpf_local_storage from an *inode*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *inode* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *inode*) except this + * helper enforces the key must be an inode and the map must also + * be a **BPF_MAP_TYPE_INODE_STORAGE**. + * + * Underneath, the value is stored locally at *inode* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *inode*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * Return + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + * + * int bpf_inode_storage_delete(struct bpf_map *map, void *inode) + * Description + * Delete a bpf_local_storage from an *inode*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + * + * long bpf_d_path(struct path *path, char *buf, u32 sz) + * Description + * Return full path for given **struct path** object, which + * needs to be the kernel BTF *path* object. The path is + * returned in the provided buffer *buf* of size *sz* and + * is zero terminated. + * + * Return + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + * + * long bpf_copy_from_user(void *dst, u32 size, const void *user_ptr) + * Description + * Read *size* bytes from user space address *user_ptr* and store + * the data in *dst*. This is a wrapper of **copy_from_user**\ (). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_snprintf_btf(char *str, u32 str_size, struct btf_ptr *ptr, u32 btf_ptr_size, u64 flags) + * Description + * Use BTF to store a string representation of *ptr*->ptr in *str*, + * using *ptr*->type_id. This value should specify the type + * that *ptr*->ptr points to. LLVM __builtin_btf_type_id(type, 1) + * can be used to look up vmlinux BTF type ids. Traversing the + * data structure using BTF, the type information and values are + * stored in the first *str_size* - 1 bytes of *str*. Safe copy of + * the pointer data is carried out to avoid kernel crashes during + * operation. Smaller types can use string space on the stack; + * larger programs can use map data to store the string + * representation. + * + * The string can be subsequently shared with userspace via + * bpf_perf_event_output() or ring buffer interfaces. + * bpf_trace_printk() is to be avoided as it places too small + * a limit on string size to be useful. + * + * *flags* is a combination of + * + * **BTF_F_COMPACT** + * no formatting around type information + * **BTF_F_NONAME** + * no struct/union member names/types + * **BTF_F_PTR_RAW** + * show raw (unobfuscated) pointer values; + * equivalent to printk specifier %px. + * **BTF_F_ZERO** + * show zero-valued struct/union members; they + * are not displayed by default + * + * Return + * The number of bytes that were written (or would have been + * written if output had to be truncated due to string size), + * or a negative error in cases of failure. + * + * long bpf_seq_printf_btf(struct seq_file *m, struct btf_ptr *ptr, u32 ptr_size, u64 flags) + * Description + * Use BTF to write to seq_write a string representation of + * *ptr*->ptr, using *ptr*->type_id as per bpf_snprintf_btf(). + * *flags* are identical to those used for bpf_snprintf_btf. + * Return + * 0 on success or a negative error in case of failure. + * + * u64 bpf_skb_cgroup_classid(struct sk_buff *skb) + * Description + * See **bpf_get_cgroup_classid**\ () for the main description. + * This helper differs from **bpf_get_cgroup_classid**\ () in that + * the cgroup v1 net_cls class is retrieved only from the *skb*'s + * associated socket instead of the current process. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * long bpf_redirect_neigh(u32 ifindex, struct bpf_redir_neigh *params, int plen, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex* + * and fill in L2 addresses from neighboring subsystem. This helper + * is somewhat similar to **bpf_redirect**\ (), except that it + * populates L2 addresses as well, meaning, internally, the helper + * relies on the neighbor lookup for the L2 address of the nexthop. + * + * The helper will perform a FIB lookup based on the skb's + * networking header to get the address of the next hop, unless + * this is supplied by the caller in the *params* argument. The + * *plen* argument indicates the len of *params* and should be set + * to 0 if *params* is NULL. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types, and enabled + * for IPv4 and IPv6 protocols. + * Return + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + * + * void *bpf_per_cpu_ptr(const void *percpu_ptr, u32 cpu) + * Description + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on *cpu*. A ksym is an + * extern variable decorated with '__ksym'. For ksym, there is a + * global var (either static or global) defined of the same name + * in the kernel. The ksym is percpu if the global var is percpu. + * The returned pointer points to the global percpu var on *cpu*. + * + * bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the + * kernel, except that bpf_per_cpu_ptr() may return NULL. This + * happens if *cpu* is larger than nr_cpu_ids. The caller of + * bpf_per_cpu_ptr() must check the returned value. + * Return + * A pointer pointing to the kernel percpu variable on *cpu*, or + * NULL, if *cpu* is invalid. + * + * void *bpf_this_cpu_ptr(const void *percpu_ptr) + * Description + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on this cpu. See the + * description of 'ksym' in **bpf_per_cpu_ptr**\ (). + * + * bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in + * the kernel. Different from **bpf_per_cpu_ptr**\ (), it would + * never return NULL. + * Return + * A pointer pointing to the kernel percpu variable on this cpu. + * + * long bpf_redirect_peer(u32 ifindex, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_redirect**\ (), except + * that the redirection happens to the *ifindex*' peer device and + * the netns switch takes place from ingress to ingress without + * going through the CPU's backlog queue. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types at the ingress + * hook and for veth device types. The peer device must reside in a + * different network namespace. + * Return + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + * + * void *bpf_task_storage_get(struct bpf_map *map, struct task_struct *task, void *value, u64 flags) + * Description + * Get a bpf_local_storage from the *task*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *task* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *task*) except this + * helper enforces the key must be a task_struct and the map must also + * be a **BPF_MAP_TYPE_TASK_STORAGE**. + * + * Underneath, the value is stored locally at *task* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *task*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * Return + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + * + * long bpf_task_storage_delete(struct bpf_map *map, struct task_struct *task) + * Description + * Delete a bpf_local_storage from a *task*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + * + * struct task_struct *bpf_get_current_task_btf(void) + * Description + * Return a BTF pointer to the "current" task. + * This pointer can also be used in helpers that accept an + * *ARG_PTR_TO_BTF_ID* of type *task_struct*. + * Return + * Pointer to the current task. + * + * long bpf_bprm_opts_set(struct linux_binprm *bprm, u64 flags) + * Description + * Set or clear certain options on *bprm*: + * + * **BPF_F_BPRM_SECUREEXEC** Set the secureexec bit + * which sets the **AT_SECURE** auxv for glibc. The bit + * is cleared if the flag is not specified. + * Return + * **-EINVAL** if invalid *flags* are passed, zero otherwise. + * + * u64 bpf_ktime_get_coarse_ns(void) + * Description + * Return a coarse-grained version of the time elapsed since + * system boot, in nanoseconds. Does not include time the system + * was suspended. + * + * See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**) + * Return + * Current *ktime*. + * + * long bpf_ima_inode_hash(struct inode *inode, void *dst, u32 size) + * Description + * Returns the stored IMA hash of the *inode* (if it's available). + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * Return + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if + * invalid arguments are passed. + * + * struct socket *bpf_sock_from_file(struct file *file) + * Description + * If the given file represents a socket, returns the associated + * socket. + * Return + * A pointer to a struct socket on success or NULL if the file is + * not a socket. + * + * long bpf_check_mtu(void *ctx, u32 ifindex, u32 *mtu_len, s32 len_diff, u64 flags) + * Description + * Check packet size against exceeding MTU of net device (based + * on *ifindex*). This helper will likely be used in combination + * with helpers that adjust/change the packet size. + * + * The argument *len_diff* can be used for querying with a planned + * size change. This allows to check MTU prior to changing packet + * ctx. Providing a *len_diff* adjustment that is larger than the + * actual packet size (resulting in negative packet size) will in + * principle not exceed the MTU, which is why it is not considered + * a failure. Other BPF helpers are needed for performing the + * planned size change; therefore the responsibility for catching + * a negative packet size belongs in those helpers. + * + * Specifying *ifindex* zero means the MTU check is performed + * against the current net device. This is practical if this isn't + * used prior to redirect. + * + * On input *mtu_len* must be a valid pointer, else verifier will + * reject BPF program. If the value *mtu_len* is initialized to + * zero then the ctx packet size is use. When value *mtu_len* is + * provided as input this specify the L3 length that the MTU check + * is done against. Remember XDP and TC length operate at L2, but + * this value is L3 as this correlate to MTU and IP-header tot_len + * values which are L3 (similar behavior as bpf_fib_lookup). + * + * The Linux kernel route table can configure MTUs on a more + * specific per route level, which is not provided by this helper. + * For route level MTU checks use the **bpf_fib_lookup**\ () + * helper. + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** for tc cls_act programs. + * + * The *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_MTU_CHK_SEGS** + * This flag will only works for *ctx* **struct sk_buff**. + * If packet context contains extra packet segment buffers + * (often knows as GSO skb), then MTU check is harder to + * check at this point, because in transmit path it is + * possible for the skb packet to get re-segmented + * (depending on net device features). This could still be + * a MTU violation, so this flag enables performing MTU + * check against segments, with a different violation + * return code to tell it apart. Check cannot use len_diff. + * + * On return *mtu_len* pointer contains the MTU value of the net + * device. Remember the net device configured MTU is the L3 size, + * which is returned here and XDP and TC length operate at L2. + * Helper take this into account for you, but remember when using + * MTU value in your BPF-code. + * + * Return + * * 0 on success, and populate MTU value in *mtu_len* pointer. + * + * * < 0 if any input argument is invalid (*mtu_len* not updated) + * + * MTU violations return positive values, but also populate MTU + * value in *mtu_len* pointer, as this can be needed for + * implementing PMTU handing: + * + * * **BPF_MTU_CHK_RET_FRAG_NEEDED** + * * **BPF_MTU_CHK_RET_SEGS_TOOBIG** + * + * long bpf_for_each_map_elem(struct bpf_map *map, void *callback_fn, void *callback_ctx, u64 flags) + * Description + * For each element in **map**, call **callback_fn** function with + * **map**, **callback_ctx** and other map-specific parameters. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. + * + * The following are a list of supported map types and their + * respective expected callback signatures: + * + * BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_PERCPU_HASH, + * BPF_MAP_TYPE_LRU_HASH, BPF_MAP_TYPE_LRU_PERCPU_HASH, + * BPF_MAP_TYPE_ARRAY, BPF_MAP_TYPE_PERCPU_ARRAY + * + * long (\*callback_fn)(struct bpf_map \*map, const void \*key, void \*value, void \*ctx); + * + * For per_cpu maps, the map_value is the value on the cpu where the + * bpf_prog is running. + * + * If **callback_fn** return 0, the helper will continue to the next + * element. If return value is 1, the helper will skip the rest of + * elements and return. Other return values are not used now. + * + * Return + * The number of traversed map elements for success, **-EINVAL** for + * invalid **flags**. + * + * long bpf_snprintf(char *str, u32 str_size, const char *fmt, u64 *data, u32 data_len) + * Description + * Outputs a string into the **str** buffer of size **str_size** + * based on a format string stored in a read-only map pointed by + * **fmt**. + * + * Each format specifier in **fmt** corresponds to one u64 element + * in the **data** array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* + * array. The *data_len* is the size of *data* in bytes - must be + * a multiple of 8. + * + * Formats **%s** and **%p{i,I}{4,6}** require to read kernel + * memory. Reading kernel memory may fail due to either invalid + * address or valid address but requiring a major memory fault. If + * reading kernel memory fails, the string for **%s** will be an + * empty string, and the ip address for **%p{i,I}{4,6}** will be 0. + * Not returning error to bpf program is consistent with what + * **bpf_trace_printk**\ () does for now. + * + * Return + * The strictly positive length of the formatted string, including + * the trailing zero character. If the return value is greater than + * **str_size**, **str** contains a truncated string, guaranteed to + * be zero-terminated except when **str_size** is 0. + * + * Or **-EBUSY** if the per-CPU memory copy buffer is busy. + * + * long bpf_sys_bpf(u32 cmd, void *attr, u32 attr_size) + * Description + * Execute bpf syscall with given arguments. + * Return + * A syscall result. + * + * long bpf_btf_find_by_name_kind(char *name, int name_sz, u32 kind, int flags) + * Description + * Find BTF type with given name and kind in vmlinux BTF or in module's BTFs. + * Return + * Returns btf_id and btf_obj_fd in lower and upper 32 bits. + * + * long bpf_sys_close(u32 fd) + * Description + * Execute close syscall for given FD. + * Return + * A syscall result. + * + * long bpf_timer_init(struct bpf_timer *timer, struct bpf_map *map, u64 flags) + * Description + * Initialize the timer. + * First 4 bits of *flags* specify clockid. + * Only CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME are allowed. + * All other bits of *flags* are reserved. + * The verifier will reject the program if *timer* is not from + * the same *map*. + * Return + * 0 on success. + * **-EBUSY** if *timer* is already initialized. + * **-EINVAL** if invalid *flags* are passed. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + * + * long bpf_timer_set_callback(struct bpf_timer *timer, void *callback_fn) + * Description + * Configure the timer to call *callback_fn* static function. + * Return + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + * + * long bpf_timer_start(struct bpf_timer *timer, u64 nsecs, u64 flags) + * Description + * Set timer expiration N nanoseconds from the current time. The + * configured callback will be invoked in soft irq context on some cpu + * and will not repeat unless another bpf_timer_start() is made. + * In such case the next invocation can migrate to a different cpu. + * Since struct bpf_timer is a field inside map element the map + * owns the timer. The bpf_timer_set_callback() will increment refcnt + * of BPF program to make sure that callback_fn code stays valid. + * When user space reference to a map reaches zero all timers + * in a map are cancelled and corresponding program's refcnts are + * decremented. This is done to make sure that Ctrl-C of a user + * process doesn't leave any timers running. If map is pinned in + * bpffs the callback_fn can re-arm itself indefinitely. + * bpf_map_update/delete_elem() helpers and user space sys_bpf commands + * cancel and free the timer in the given map element. + * The map can contain timers that invoke callback_fn-s from different + * programs. The same callback_fn can serve different timers from + * different maps if key/value layout matches across maps. + * Every bpf_timer_set_callback() can have different callback_fn. + * + * Return + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier + * or invalid *flags* are passed. + * + * long bpf_timer_cancel(struct bpf_timer *timer) + * Description + * Cancel the timer and wait for callback_fn to finish if it was running. + * Return + * 0 if the timer was not active. + * 1 if the timer was active. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its + * own timer which would have led to a deadlock otherwise. + * + * u64 bpf_get_func_ip(void *ctx) + * Description + * Get address of the traced function (for tracing and kprobe programs). + * Return + * Address of the traced function. + * 0 for kprobes placed within the function (not at the entry). + * + * u64 bpf_get_attach_cookie(void *ctx) + * Description + * Get bpf_cookie value provided (optionally) during the program + * attachment. It might be different for each individual + * attachment, even if BPF program itself is the same. + * Expects BPF program context *ctx* as a first argument. + * + * Supported for the following program types: + * - kprobe/uprobe; + * - tracepoint; + * - perf_event. + * Return + * Value specified by user at BPF link creation/attachment time + * or 0, if it was not specified. + * + * long bpf_task_pt_regs(struct task_struct *task) + * Description + * Get the struct pt_regs associated with **task**. + * Return + * A pointer to struct pt_regs. + * + * long bpf_get_branch_snapshot(void *entries, u32 size, u64 flags) + * Description + * Get branch trace from hardware engines like Intel LBR. The + * hardware engine is stopped shortly after the helper is + * called. Therefore, the user need to filter branch entries + * based on the actual use case. To capture branch trace + * before the trigger point of the BPF program, the helper + * should be called at the beginning of the BPF program. + * + * The data is stored as struct perf_branch_entry into output + * buffer *entries*. *size* is the size of *entries* in bytes. + * *flags* is reserved for now and must be zero. + * + * Return + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-ENOENT** if architecture does not support branch records. + * + * long bpf_trace_vprintk(const char *fmt, u32 fmt_size, const void *data, u32 data_len) + * Description + * Behaves like **bpf_trace_printk**\ () helper, but takes an array of u64 + * to format and can handle more format args as a result. + * + * Arguments are to be used as in **bpf_seq_printf**\ () helper. + * Return + * The number of bytes written to the buffer, or a negative error + * in case of failure. + * + * struct unix_sock *bpf_skc_to_unix_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *unix_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_kallsyms_lookup_name(const char *name, int name_sz, int flags, u64 *res) + * Description + * Get the address of a kernel symbol, returned in *res*. *res* is + * set to 0 if the symbol is not found. + * Return + * On success, zero. On error, a negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-EINVAL** if string *name* is not the same size as *name_sz*. + * + * **-ENOENT** if symbol is not found. + * + * **-EPERM** if caller does not have permission to obtain kernel address. + * + * long bpf_find_vma(struct task_struct *task, u64 addr, void *callback_fn, void *callback_ctx, u64 flags) + * Description + * Find vma of *task* that contains *addr*, call *callback_fn* + * function with *task*, *vma*, and *callback_ctx*. + * The *callback_fn* should be a static function and + * the *callback_ctx* should be a pointer to the stack. + * The *flags* is used to control certain aspects of the helper. + * Currently, the *flags* must be 0. + * + * The expected callback signature is + * + * long (\*callback_fn)(struct task_struct \*task, struct vm_area_struct \*vma, void \*callback_ctx); + * + * Return + * 0 on success. + * **-ENOENT** if *task->mm* is NULL, or no vma contains *addr*. + * **-EBUSY** if failed to try lock mmap_lock. + * **-EINVAL** for invalid **flags**. + * + * long bpf_loop(u32 nr_loops, void *callback_fn, void *callback_ctx, u64 flags) + * Description + * For **nr_loops**, call **callback_fn** function + * with **callback_ctx** as the context parameter. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. Currently, nr_loops is + * limited to 1 << 23 (~8 million) loops. + * + * long (\*callback_fn)(u32 index, void \*ctx); + * + * where **index** is the current index in the loop. The index + * is zero-indexed. + * + * If **callback_fn** returns 0, the helper will continue to the next + * loop. If return value is 1, the helper will skip the rest of + * the loops and return. Other return values are not used now, + * and will be rejected by the verifier. + * + * Return + * The number of loops performed, **-EINVAL** for invalid **flags**, + * **-E2BIG** if **nr_loops** exceeds the maximum number of loops. + * + * long bpf_strncmp(const char *s1, u32 s1_sz, const char *s2) + * Description + * Do strncmp() between **s1** and **s2**. **s1** doesn't need + * to be null-terminated and **s1_sz** is the maximum storage + * size of **s1**. **s2** must be a read-only string. + * Return + * An integer less than, equal to, or greater than zero + * if the first **s1_sz** bytes of **s1** is found to be + * less than, to match, or be greater than **s2**. + * + * long bpf_get_func_arg(void *ctx, u32 n, u64 *value) + * Description + * Get **n**-th argument register (zero based) of the traced function (for tracing programs) + * returned in **value**. + * + * Return + * 0 on success. + * **-EINVAL** if n >= argument register count of traced function. + * + * long bpf_get_func_ret(void *ctx, u64 *value) + * Description + * Get return value of the traced function (for tracing programs) + * in **value**. + * + * Return + * 0 on success. + * **-EOPNOTSUPP** for tracing programs other than BPF_TRACE_FEXIT or BPF_MODIFY_RETURN. + * + * long bpf_get_func_arg_cnt(void *ctx) + * Description + * Get number of registers of the traced function (for tracing programs) where + * function arguments are stored in these registers. + * + * Return + * The number of argument registers of the traced function. + * + * int bpf_get_retval(void) + * Description + * Get the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * Return + * The BPF program's return value. + * + * int bpf_set_retval(int retval) + * Description + * Set the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * + * Note that there is the following corner case where the program exports an error + * via bpf_set_retval but signals success via 'return 1': + * + * bpf_set_retval(-EPERM); + * return 1; + * + * In this case, the BPF program's return value will use helper's -EPERM. This + * still holds true for cgroup/bind{4,6} which supports extra 'return 3' success case. + * + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_xdp_get_buff_len(struct xdp_buff *xdp_md) + * Description + * Get the total size of a given xdp buff (linear and paged area) + * Return + * The total size of a given xdp buffer. + * + * long bpf_xdp_load_bytes(struct xdp_buff *xdp_md, u32 offset, void *buf, u32 len) + * Description + * This helper is provided as an easy way to load data from a + * xdp buffer. It can be used to load *len* bytes from *offset* from + * the frame associated to *xdp_md*, into the buffer pointed by + * *buf*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_store_bytes(struct xdp_buff *xdp_md, u32 offset, void *buf, u32 len) + * Description + * Store *len* bytes from buffer *buf* into the frame + * associated to *xdp_md*, at *offset*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_copy_from_user_task(void *dst, u32 size, const void *user_ptr, struct task_struct *tsk, u64 flags) + * Description + * Read *size* bytes from user space address *user_ptr* in *tsk*'s + * address space, and stores the data in *dst*. *flags* is not + * used yet and is provided for future extensibility. This helper + * can only be used by sleepable programs. + * Return + * 0 on success, or a negative error in case of failure. On error + * *dst* buffer is zeroed out. + * + * long bpf_skb_set_tstamp(struct sk_buff *skb, u64 tstamp, u32 tstamp_type) + * Description + * Change the __sk_buff->tstamp_type to *tstamp_type* + * and set *tstamp* to the __sk_buff->tstamp together. + * + * If there is no need to change the __sk_buff->tstamp_type, + * the tstamp value can be directly written to __sk_buff->tstamp + * instead. + * + * BPF_SKB_TSTAMP_DELIVERY_MONO is the only tstamp that + * will be kept during bpf_redirect_*(). A non zero + * *tstamp* must be used with the BPF_SKB_TSTAMP_DELIVERY_MONO + * *tstamp_type*. + * + * A BPF_SKB_TSTAMP_UNSPEC *tstamp_type* can only be used + * with a zero *tstamp*. + * + * Only IPv4 and IPv6 skb->protocol are supported. + * + * This function is most useful when it needs to set a + * mono delivery time to __sk_buff->tstamp and then + * bpf_redirect_*() to the egress of an iface. For example, + * changing the (rcv) timestamp in __sk_buff->tstamp at + * ingress to a mono delivery time and then bpf_redirect_*() + * to sch_fq@phy-dev. + * Return + * 0 on success. + * **-EINVAL** for invalid input + * **-EOPNOTSUPP** for unsupported protocol + * + * long bpf_ima_file_hash(struct file *file, void *dst, u32 size) + * Description + * Returns a calculated IMA hash of the *file*. + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * Return + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if + * invalid arguments are passed. + * + * void *bpf_kptr_xchg(void *map_value, void *ptr) + * Description + * Exchange kptr at pointer *map_value* with *ptr*, and return the + * old value. *ptr* can be NULL, otherwise it must be a referenced + * pointer which will be released when this helper is called. + * Return + * The old value of kptr (which can be NULL). The returned pointer + * if not NULL, is a reference which must be released using its + * corresponding release function, or moved into a BPF map before + * program exit. + * + * void *bpf_map_lookup_percpu_elem(struct bpf_map *map, const void *key, u32 cpu) + * Description + * Perform a lookup in *percpu map* for an entry associated to + * *key* on *cpu*. + * Return + * Map value associated to *key* on *cpu*, or **NULL** if no entry + * was found or *cpu* is invalid. + * + * struct mptcp_sock *bpf_skc_to_mptcp_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_dynptr_from_mem(void *data, u32 size, u64 flags, struct bpf_dynptr *ptr) + * Description + * Get a dynptr to local memory *data*. + * + * *data* must be a ptr to a map value. + * The maximum *size* supported is DYNPTR_MAX_SIZE. + * *flags* is currently unused. + * Return + * 0 on success, -E2BIG if the size exceeds DYNPTR_MAX_SIZE, + * -EINVAL if flags is not 0. + * + * long bpf_ringbuf_reserve_dynptr(void *ringbuf, u32 size, u64 flags, struct bpf_dynptr *ptr) + * Description + * Reserve *size* bytes of payload in a ring buffer *ringbuf* + * through the dynptr interface. *flags* must be 0. + * + * Please note that a corresponding bpf_ringbuf_submit_dynptr or + * bpf_ringbuf_discard_dynptr must be called on *ptr*, even if the + * reservation fails. This is enforced by the verifier. + * Return + * 0 on success, or a negative error in case of failure. + * + * void bpf_ringbuf_submit_dynptr(struct bpf_dynptr *ptr, u64 flags) + * Description + * Submit reserved ring buffer sample, pointed to by *data*, + * through the dynptr interface. This is a no-op if the dynptr is + * invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_submit'. + * Return + * Nothing. Always succeeds. + * + * void bpf_ringbuf_discard_dynptr(struct bpf_dynptr *ptr, u64 flags) + * Description + * Discard reserved ring buffer sample through the dynptr + * interface. This is a no-op if the dynptr is invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_discard'. + * Return + * Nothing. Always succeeds. + * + * long bpf_dynptr_read(void *dst, u32 len, const struct bpf_dynptr *src, u32 offset, u64 flags) + * Description + * Read *len* bytes from *src* into *dst*, starting from *offset* + * into *src*. + * *flags* is currently unused. + * Return + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *src*'s data, -EINVAL if *src* is an invalid dynptr or if + * *flags* is not 0. + * + * long bpf_dynptr_write(const struct bpf_dynptr *dst, u32 offset, void *src, u32 len, u64 flags) + * Description + * Write *len* bytes from *src* into *dst*, starting from *offset* + * into *dst*. + * *flags* is currently unused. + * Return + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *dst*'s data, -EINVAL if *dst* is an invalid dynptr or if *dst* + * is a read-only dynptr or if *flags* is not 0. + * + * void *bpf_dynptr_data(const struct bpf_dynptr *ptr, u32 offset, u32 len) + * Description + * Get a pointer to the underlying dynptr data. + * + * *len* must be a statically known value. The returned data slice + * is invalidated whenever the dynptr is invalidated. + * Return + * Pointer to the underlying dynptr data, NULL if the dynptr is + * read-only, if the dynptr is invalid, or if the offset and length + * is out of bounds. + * + * s64 bpf_tcp_raw_gen_syncookie_ipv4(struct iphdr *iph, struct tcphdr *th, u32 th_len) + * Description + * Try to issue a SYN cookie for the packet with corresponding + * IPv4/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + * + * s64 bpf_tcp_raw_gen_syncookie_ipv6(struct ipv6hdr *iph, struct tcphdr *th, u32 th_len) + * Description + * Try to issue a SYN cookie for the packet with corresponding + * IPv6/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + * + * long bpf_tcp_raw_check_syncookie_ipv4(struct iphdr *iph, struct tcphdr *th) + * Description + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the TCP header. + * Return + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + * + * long bpf_tcp_raw_check_syncookie_ipv6(struct ipv6hdr *iph, struct tcphdr *th) + * Description + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the TCP header. + * Return + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + * + * u64 bpf_ktime_get_tai_ns(void) + * Description + * A nonsettable system-wide clock derived from wall-clock time but + * ignoring leap seconds. This clock does not experience + * discontinuities and backwards jumps caused by NTP inserting leap + * seconds as CLOCK_REALTIME does. + * + * See: **clock_gettime**\ (**CLOCK_TAI**) + * Return + * Current *ktime*. + * + * long bpf_user_ringbuf_drain(struct bpf_map *map, void *callback_fn, void *ctx, u64 flags) + * Description + * Drain samples from the specified user ring buffer, and invoke + * the provided callback for each such sample: + * + * long (\*callback_fn)(const struct bpf_dynptr \*dynptr, void \*ctx); + * + * If **callback_fn** returns 0, the helper will continue to try + * and drain the next sample, up to a maximum of + * BPF_MAX_USER_RINGBUF_SAMPLES samples. If the return value is 1, + * the helper will skip the rest of the samples and return. Other + * return values are not used now, and will be rejected by the + * verifier. + * Return + * The number of drained samples if no error was encountered while + * draining samples, or 0 if no samples were present in the ring + * buffer. If a user-space producer was epoll-waiting on this map, + * and at least one sample was drained, they will receive an event + * notification notifying them of available space in the ring + * buffer. If the BPF_RB_NO_WAKEUP flag is passed to this + * function, no wakeup notification will be sent. If the + * BPF_RB_FORCE_WAKEUP flag is passed, a wakeup notification will + * be sent even if no sample was drained. + * + * On failure, the returned value is one of the following: + * + * **-EBUSY** if the ring buffer is contended, and another calling + * context was concurrently draining the ring buffer. + * + * **-EINVAL** if user-space is not properly tracking the ring + * buffer due to the producer position not being aligned to 8 + * bytes, a sample not being aligned to 8 bytes, or the producer + * position not matching the advertised length of a sample. + * + * **-E2BIG** if user-space has tried to publish a sample which is + * larger than the size of the ring buffer, or which cannot fit + * within a struct bpf_dynptr. + * + * void *bpf_cgrp_storage_get(struct bpf_map *map, struct cgroup *cgroup, void *value, u64 flags) + * Description + * Get a bpf_local_storage from the *cgroup*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *cgroup* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *cgroup*) except this + * helper enforces the key must be a cgroup struct and the map must also + * be a **BPF_MAP_TYPE_CGRP_STORAGE**. + * + * In reality, the local-storage value is embedded directly inside of the + * *cgroup* object itself, rather than being located in the + * **BPF_MAP_TYPE_CGRP_STORAGE** map. When the local-storage value is + * queried for some *map* on a *cgroup* object, the kernel will perform an + * O(n) iteration over all of the live local-storage values for that + * *cgroup* object until the local-storage value for the *map* is found. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * Return + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + * + * long bpf_cgrp_storage_delete(struct bpf_map *map, struct cgroup *cgroup) + * Description + * Delete a bpf_local_storage from a *cgroup*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +#define ___BPF_FUNC_MAPPER(FN, ctx...) \ + FN(unspec, 0, ##ctx) \ + FN(map_lookup_elem, 1, ##ctx) \ + FN(map_update_elem, 2, ##ctx) \ + FN(map_delete_elem, 3, ##ctx) \ + FN(probe_read, 4, ##ctx) \ + FN(ktime_get_ns, 5, ##ctx) \ + FN(trace_printk, 6, ##ctx) \ + FN(get_prandom_u32, 7, ##ctx) \ + FN(get_smp_processor_id, 8, ##ctx) \ + FN(skb_store_bytes, 9, ##ctx) \ + FN(l3_csum_replace, 10, ##ctx) \ + FN(l4_csum_replace, 11, ##ctx) \ + FN(tail_call, 12, ##ctx) \ + FN(clone_redirect, 13, ##ctx) \ + FN(get_current_pid_tgid, 14, ##ctx) \ + FN(get_current_uid_gid, 15, ##ctx) \ + FN(get_current_comm, 16, ##ctx) \ + FN(get_cgroup_classid, 17, ##ctx) \ + FN(skb_vlan_push, 18, ##ctx) \ + FN(skb_vlan_pop, 19, ##ctx) \ + FN(skb_get_tunnel_key, 20, ##ctx) \ + FN(skb_set_tunnel_key, 21, ##ctx) \ + FN(perf_event_read, 22, ##ctx) \ + FN(redirect, 23, ##ctx) \ + FN(get_route_realm, 24, ##ctx) \ + FN(perf_event_output, 25, ##ctx) \ + FN(skb_load_bytes, 26, ##ctx) \ + FN(get_stackid, 27, ##ctx) \ + FN(csum_diff, 28, ##ctx) \ + FN(skb_get_tunnel_opt, 29, ##ctx) \ + FN(skb_set_tunnel_opt, 30, ##ctx) \ + FN(skb_change_proto, 31, ##ctx) \ + FN(skb_change_type, 32, ##ctx) \ + FN(skb_under_cgroup, 33, ##ctx) \ + FN(get_hash_recalc, 34, ##ctx) \ + FN(get_current_task, 35, ##ctx) \ + FN(probe_write_user, 36, ##ctx) \ + FN(current_task_under_cgroup, 37, ##ctx) \ + FN(skb_change_tail, 38, ##ctx) \ + FN(skb_pull_data, 39, ##ctx) \ + FN(csum_update, 40, ##ctx) \ + FN(set_hash_invalid, 41, ##ctx) \ + FN(get_numa_node_id, 42, ##ctx) \ + FN(skb_change_head, 43, ##ctx) \ + FN(xdp_adjust_head, 44, ##ctx) \ + FN(probe_read_str, 45, ##ctx) \ + FN(get_socket_cookie, 46, ##ctx) \ + FN(get_socket_uid, 47, ##ctx) \ + FN(set_hash, 48, ##ctx) \ + FN(setsockopt, 49, ##ctx) \ + FN(skb_adjust_room, 50, ##ctx) \ + FN(redirect_map, 51, ##ctx) \ + FN(sk_redirect_map, 52, ##ctx) \ + FN(sock_map_update, 53, ##ctx) \ + FN(xdp_adjust_meta, 54, ##ctx) \ + FN(perf_event_read_value, 55, ##ctx) \ + FN(perf_prog_read_value, 56, ##ctx) \ + FN(getsockopt, 57, ##ctx) \ + FN(override_return, 58, ##ctx) \ + FN(sock_ops_cb_flags_set, 59, ##ctx) \ + FN(msg_redirect_map, 60, ##ctx) \ + FN(msg_apply_bytes, 61, ##ctx) \ + FN(msg_cork_bytes, 62, ##ctx) \ + FN(msg_pull_data, 63, ##ctx) \ + FN(bind, 64, ##ctx) \ + FN(xdp_adjust_tail, 65, ##ctx) \ + FN(skb_get_xfrm_state, 66, ##ctx) \ + FN(get_stack, 67, ##ctx) \ + FN(skb_load_bytes_relative, 68, ##ctx) \ + FN(fib_lookup, 69, ##ctx) \ + FN(sock_hash_update, 70, ##ctx) \ + FN(msg_redirect_hash, 71, ##ctx) \ + FN(sk_redirect_hash, 72, ##ctx) \ + FN(lwt_push_encap, 73, ##ctx) \ + FN(lwt_seg6_store_bytes, 74, ##ctx) \ + FN(lwt_seg6_adjust_srh, 75, ##ctx) \ + FN(lwt_seg6_action, 76, ##ctx) \ + FN(rc_repeat, 77, ##ctx) \ + FN(rc_keydown, 78, ##ctx) \ + FN(skb_cgroup_id, 79, ##ctx) \ + FN(get_current_cgroup_id, 80, ##ctx) \ + FN(get_local_storage, 81, ##ctx) \ + FN(sk_select_reuseport, 82, ##ctx) \ + FN(skb_ancestor_cgroup_id, 83, ##ctx) \ + FN(sk_lookup_tcp, 84, ##ctx) \ + FN(sk_lookup_udp, 85, ##ctx) \ + FN(sk_release, 86, ##ctx) \ + FN(map_push_elem, 87, ##ctx) \ + FN(map_pop_elem, 88, ##ctx) \ + FN(map_peek_elem, 89, ##ctx) \ + FN(msg_push_data, 90, ##ctx) \ + FN(msg_pop_data, 91, ##ctx) \ + FN(rc_pointer_rel, 92, ##ctx) \ + FN(spin_lock, 93, ##ctx) \ + FN(spin_unlock, 94, ##ctx) \ + FN(sk_fullsock, 95, ##ctx) \ + FN(tcp_sock, 96, ##ctx) \ + FN(skb_ecn_set_ce, 97, ##ctx) \ + FN(get_listener_sock, 98, ##ctx) \ + FN(skc_lookup_tcp, 99, ##ctx) \ + FN(tcp_check_syncookie, 100, ##ctx) \ + FN(sysctl_get_name, 101, ##ctx) \ + FN(sysctl_get_current_value, 102, ##ctx) \ + FN(sysctl_get_new_value, 103, ##ctx) \ + FN(sysctl_set_new_value, 104, ##ctx) \ + FN(strtol, 105, ##ctx) \ + FN(strtoul, 106, ##ctx) \ + FN(sk_storage_get, 107, ##ctx) \ + FN(sk_storage_delete, 108, ##ctx) \ + FN(send_signal, 109, ##ctx) \ + FN(tcp_gen_syncookie, 110, ##ctx) \ + FN(skb_output, 111, ##ctx) \ + FN(probe_read_user, 112, ##ctx) \ + FN(probe_read_kernel, 113, ##ctx) \ + FN(probe_read_user_str, 114, ##ctx) \ + FN(probe_read_kernel_str, 115, ##ctx) \ + FN(tcp_send_ack, 116, ##ctx) \ + FN(send_signal_thread, 117, ##ctx) \ + FN(jiffies64, 118, ##ctx) \ + FN(read_branch_records, 119, ##ctx) \ + FN(get_ns_current_pid_tgid, 120, ##ctx) \ + FN(xdp_output, 121, ##ctx) \ + FN(get_netns_cookie, 122, ##ctx) \ + FN(get_current_ancestor_cgroup_id, 123, ##ctx) \ + FN(sk_assign, 124, ##ctx) \ + FN(ktime_get_boot_ns, 125, ##ctx) \ + FN(seq_printf, 126, ##ctx) \ + FN(seq_write, 127, ##ctx) \ + FN(sk_cgroup_id, 128, ##ctx) \ + FN(sk_ancestor_cgroup_id, 129, ##ctx) \ + FN(ringbuf_output, 130, ##ctx) \ + FN(ringbuf_reserve, 131, ##ctx) \ + FN(ringbuf_submit, 132, ##ctx) \ + FN(ringbuf_discard, 133, ##ctx) \ + FN(ringbuf_query, 134, ##ctx) \ + FN(csum_level, 135, ##ctx) \ + FN(skc_to_tcp6_sock, 136, ##ctx) \ + FN(skc_to_tcp_sock, 137, ##ctx) \ + FN(skc_to_tcp_timewait_sock, 138, ##ctx) \ + FN(skc_to_tcp_request_sock, 139, ##ctx) \ + FN(skc_to_udp6_sock, 140, ##ctx) \ + FN(get_task_stack, 141, ##ctx) \ + FN(load_hdr_opt, 142, ##ctx) \ + FN(store_hdr_opt, 143, ##ctx) \ + FN(reserve_hdr_opt, 144, ##ctx) \ + FN(inode_storage_get, 145, ##ctx) \ + FN(inode_storage_delete, 146, ##ctx) \ + FN(d_path, 147, ##ctx) \ + FN(copy_from_user, 148, ##ctx) \ + FN(snprintf_btf, 149, ##ctx) \ + FN(seq_printf_btf, 150, ##ctx) \ + FN(skb_cgroup_classid, 151, ##ctx) \ + FN(redirect_neigh, 152, ##ctx) \ + FN(per_cpu_ptr, 153, ##ctx) \ + FN(this_cpu_ptr, 154, ##ctx) \ + FN(redirect_peer, 155, ##ctx) \ + FN(task_storage_get, 156, ##ctx) \ + FN(task_storage_delete, 157, ##ctx) \ + FN(get_current_task_btf, 158, ##ctx) \ + FN(bprm_opts_set, 159, ##ctx) \ + FN(ktime_get_coarse_ns, 160, ##ctx) \ + FN(ima_inode_hash, 161, ##ctx) \ + FN(sock_from_file, 162, ##ctx) \ + FN(check_mtu, 163, ##ctx) \ + FN(for_each_map_elem, 164, ##ctx) \ + FN(snprintf, 165, ##ctx) \ + FN(sys_bpf, 166, ##ctx) \ + FN(btf_find_by_name_kind, 167, ##ctx) \ + FN(sys_close, 168, ##ctx) \ + FN(timer_init, 169, ##ctx) \ + FN(timer_set_callback, 170, ##ctx) \ + FN(timer_start, 171, ##ctx) \ + FN(timer_cancel, 172, ##ctx) \ + FN(get_func_ip, 173, ##ctx) \ + FN(get_attach_cookie, 174, ##ctx) \ + FN(task_pt_regs, 175, ##ctx) \ + FN(get_branch_snapshot, 176, ##ctx) \ + FN(trace_vprintk, 177, ##ctx) \ + FN(skc_to_unix_sock, 178, ##ctx) \ + FN(kallsyms_lookup_name, 179, ##ctx) \ + FN(find_vma, 180, ##ctx) \ + FN(loop, 181, ##ctx) \ + FN(strncmp, 182, ##ctx) \ + FN(get_func_arg, 183, ##ctx) \ + FN(get_func_ret, 184, ##ctx) \ + FN(get_func_arg_cnt, 185, ##ctx) \ + FN(get_retval, 186, ##ctx) \ + FN(set_retval, 187, ##ctx) \ + FN(xdp_get_buff_len, 188, ##ctx) \ + FN(xdp_load_bytes, 189, ##ctx) \ + FN(xdp_store_bytes, 190, ##ctx) \ + FN(copy_from_user_task, 191, ##ctx) \ + FN(skb_set_tstamp, 192, ##ctx) \ + FN(ima_file_hash, 193, ##ctx) \ + FN(kptr_xchg, 194, ##ctx) \ + FN(map_lookup_percpu_elem, 195, ##ctx) \ + FN(skc_to_mptcp_sock, 196, ##ctx) \ + FN(dynptr_from_mem, 197, ##ctx) \ + FN(ringbuf_reserve_dynptr, 198, ##ctx) \ + FN(ringbuf_submit_dynptr, 199, ##ctx) \ + FN(ringbuf_discard_dynptr, 200, ##ctx) \ + FN(dynptr_read, 201, ##ctx) \ + FN(dynptr_write, 202, ##ctx) \ + FN(dynptr_data, 203, ##ctx) \ + FN(tcp_raw_gen_syncookie_ipv4, 204, ##ctx) \ + FN(tcp_raw_gen_syncookie_ipv6, 205, ##ctx) \ + FN(tcp_raw_check_syncookie_ipv4, 206, ##ctx) \ + FN(tcp_raw_check_syncookie_ipv6, 207, ##ctx) \ + FN(ktime_get_tai_ns, 208, ##ctx) \ + FN(user_ringbuf_drain, 209, ##ctx) \ + FN(cgrp_storage_get, 210, ##ctx) \ + FN(cgrp_storage_delete, 211, ##ctx) \ + /* */ + +/* backwards-compatibility macros for users of __BPF_FUNC_MAPPER that don't + * know or care about integer value that is now passed as second argument + */ +#define __BPF_FUNC_MAPPER_APPLY(name, value, FN) FN(name), +#define __BPF_FUNC_MAPPER(FN) ___BPF_FUNC_MAPPER(__BPF_FUNC_MAPPER_APPLY, FN) + +/* integer value in 'imm' field of BPF_CALL instruction selects which helper + * function eBPF program intends to call + */ +#define __BPF_ENUM_FN(x, y) BPF_FUNC_ ## x = y, +enum bpf_func_id { + ___BPF_FUNC_MAPPER(__BPF_ENUM_FN) + __BPF_FUNC_MAX_ID, +}; +#undef __BPF_ENUM_FN + +/* All flags used by eBPF helper functions, placed here. */ + +/* BPF_FUNC_skb_store_bytes flags. */ +enum { + BPF_F_RECOMPUTE_CSUM = (1ULL << 0), + BPF_F_INVALIDATE_HASH = (1ULL << 1), +}; + +/* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags. + * First 4 bits are for passing the header field size. + */ +enum { + BPF_F_HDR_FIELD_MASK = 0xfULL, +}; + +/* BPF_FUNC_l4_csum_replace flags. */ +enum { + BPF_F_PSEUDO_HDR = (1ULL << 4), + BPF_F_MARK_MANGLED_0 = (1ULL << 5), + BPF_F_MARK_ENFORCE = (1ULL << 6), +}; + +/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ +enum { + BPF_F_INGRESS = (1ULL << 0), +}; + +/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ +enum { + BPF_F_TUNINFO_IPV6 = (1ULL << 0), +}; + +/* flags for both BPF_FUNC_get_stackid and BPF_FUNC_get_stack. */ +enum { + BPF_F_SKIP_FIELD_MASK = 0xffULL, + BPF_F_USER_STACK = (1ULL << 8), +/* flags used by BPF_FUNC_get_stackid only. */ + BPF_F_FAST_STACK_CMP = (1ULL << 9), + BPF_F_REUSE_STACKID = (1ULL << 10), +/* flags used by BPF_FUNC_get_stack only. */ + BPF_F_USER_BUILD_ID = (1ULL << 11), +}; + +/* BPF_FUNC_skb_set_tunnel_key flags. */ +enum { + BPF_F_ZERO_CSUM_TX = (1ULL << 1), + BPF_F_DONT_FRAGMENT = (1ULL << 2), + BPF_F_SEQ_NUMBER = (1ULL << 3), + BPF_F_NO_TUNNEL_KEY = (1ULL << 4), +}; + +/* BPF_FUNC_skb_get_tunnel_key flags. */ +enum { + BPF_F_TUNINFO_FLAGS = (1ULL << 4), +}; + +/* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and + * BPF_FUNC_perf_event_read_value flags. + */ +enum { + BPF_F_INDEX_MASK = 0xffffffffULL, + BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK, +/* BPF_FUNC_perf_event_output for sk_buff input context. */ + BPF_F_CTXLEN_MASK = (0xfffffULL << 32), +}; + +/* Current network namespace */ +enum { + BPF_F_CURRENT_NETNS = (-1L), +}; + +/* BPF_FUNC_csum_level level values. */ +enum { + BPF_CSUM_LEVEL_QUERY, + BPF_CSUM_LEVEL_INC, + BPF_CSUM_LEVEL_DEC, + BPF_CSUM_LEVEL_RESET, +}; + +/* BPF_FUNC_skb_adjust_room flags. */ +enum { + BPF_F_ADJ_ROOM_FIXED_GSO = (1ULL << 0), + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = (1ULL << 1), + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = (1ULL << 2), + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = (1ULL << 3), + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = (1ULL << 4), + BPF_F_ADJ_ROOM_NO_CSUM_RESET = (1ULL << 5), + BPF_F_ADJ_ROOM_ENCAP_L2_ETH = (1ULL << 6), + BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = (1ULL << 7), + BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = (1ULL << 8), +}; + +enum { + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff, + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, +}; + +#define BPF_F_ADJ_ROOM_ENCAP_L2(len) (((__u64)len & \ + BPF_ADJ_ROOM_ENCAP_L2_MASK) \ + << BPF_ADJ_ROOM_ENCAP_L2_SHIFT) + +/* BPF_FUNC_sysctl_get_name flags. */ +enum { + BPF_F_SYSCTL_BASE_NAME = (1ULL << 0), +}; + +/* BPF_FUNC__storage_get flags */ +enum { + BPF_LOCAL_STORAGE_GET_F_CREATE = (1ULL << 0), + /* BPF_SK_STORAGE_GET_F_CREATE is only kept for backward compatibility + * and BPF_LOCAL_STORAGE_GET_F_CREATE must be used instead. + */ + BPF_SK_STORAGE_GET_F_CREATE = BPF_LOCAL_STORAGE_GET_F_CREATE, +}; + +/* BPF_FUNC_read_branch_records flags. */ +enum { + BPF_F_GET_BRANCH_RECORDS_SIZE = (1ULL << 0), +}; + +/* BPF_FUNC_bpf_ringbuf_commit, BPF_FUNC_bpf_ringbuf_discard, and + * BPF_FUNC_bpf_ringbuf_output flags. + */ +enum { + BPF_RB_NO_WAKEUP = (1ULL << 0), + BPF_RB_FORCE_WAKEUP = (1ULL << 1), +}; + +/* BPF_FUNC_bpf_ringbuf_query flags */ +enum { + BPF_RB_AVAIL_DATA = 0, + BPF_RB_RING_SIZE = 1, + BPF_RB_CONS_POS = 2, + BPF_RB_PROD_POS = 3, +}; + +/* BPF ring buffer constants */ +enum { + BPF_RINGBUF_BUSY_BIT = (1U << 31), + BPF_RINGBUF_DISCARD_BIT = (1U << 30), + BPF_RINGBUF_HDR_SZ = 8, +}; + +/* BPF_FUNC_sk_assign flags in bpf_sk_lookup context. */ +enum { + BPF_SK_LOOKUP_F_REPLACE = (1ULL << 0), + BPF_SK_LOOKUP_F_NO_REUSEPORT = (1ULL << 1), +}; + +/* Mode for BPF_FUNC_skb_adjust_room helper. */ +enum bpf_adj_room_mode { + BPF_ADJ_ROOM_NET, + BPF_ADJ_ROOM_MAC, +}; + +/* Mode for BPF_FUNC_skb_load_bytes_relative helper. */ +enum bpf_hdr_start_off { + BPF_HDR_START_MAC, + BPF_HDR_START_NET, +}; + +/* Encapsulation type for BPF_FUNC_lwt_push_encap helper. */ +enum bpf_lwt_encap_mode { + BPF_LWT_ENCAP_SEG6, + BPF_LWT_ENCAP_SEG6_INLINE, + BPF_LWT_ENCAP_IP, +}; + +/* Flags for bpf_bprm_opts_set helper */ +enum { + BPF_F_BPRM_SECUREEXEC = (1ULL << 0), +}; + +/* Flags for bpf_redirect_map helper */ +enum { + BPF_F_BROADCAST = (1ULL << 3), + BPF_F_EXCLUDE_INGRESS = (1ULL << 4), +}; + +#define __bpf_md_ptr(type, name) \ +union { \ + type name; \ + __u64 :64; \ +} __attribute__((aligned(8))) + +enum { + BPF_SKB_TSTAMP_UNSPEC, + BPF_SKB_TSTAMP_DELIVERY_MONO, /* tstamp has mono delivery time */ + /* For any BPF_SKB_TSTAMP_* that the bpf prog cannot handle, + * the bpf prog should handle it like BPF_SKB_TSTAMP_UNSPEC + * and try to deduce it by ingress, egress or skb->sk->sk_clockid. + */ +}; + +/* user accessible mirror of in-kernel sk_buff. + * new fields can only be added to the end of this structure + */ +struct __sk_buff { + __u32 len; + __u32 pkt_type; + __u32 mark; + __u32 queue_mapping; + __u32 protocol; + __u32 vlan_present; + __u32 vlan_tci; + __u32 vlan_proto; + __u32 priority; + __u32 ingress_ifindex; + __u32 ifindex; + __u32 tc_index; + __u32 cb[5]; + __u32 hash; + __u32 tc_classid; + __u32 data; + __u32 data_end; + __u32 napi_id; + + /* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */ + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + /* ... here. */ + + __u32 data_meta; + __bpf_md_ptr(struct bpf_flow_keys *, flow_keys); + __u64 tstamp; + __u32 wire_len; + __u32 gso_segs; + __bpf_md_ptr(struct bpf_sock *, sk); + __u32 gso_size; + __u8 tstamp_type; + __u32 :24; /* Padding, future use. */ + __u64 hwtstamp; +}; + +struct bpf_tunnel_key { + __u32 tunnel_id; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; + union { + __u16 tunnel_ext; /* compat */ + __be16 tunnel_flags; + }; + __u32 tunnel_label; + union { + __u32 local_ipv4; + __u32 local_ipv6[4]; + }; +}; + +/* user accessible mirror of in-kernel xfrm_state. + * new fields can only be added to the end of this structure + */ +struct bpf_xfrm_state { + __u32 reqid; + __u32 spi; /* Stored in network byte order */ + __u16 family; + __u16 ext; /* Padding, future use. */ + union { + __u32 remote_ipv4; /* Stored in network byte order */ + __u32 remote_ipv6[4]; /* Stored in network byte order */ + }; +}; + +/* Generic BPF return codes which all BPF program types may support. + * The values are binary compatible with their TC_ACT_* counter-part to + * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT + * programs. + * + * XDP is handled seprately, see XDP_*. + */ +enum bpf_ret_code { + BPF_OK = 0, + /* 1 reserved */ + BPF_DROP = 2, + /* 3-6 reserved */ + BPF_REDIRECT = 7, + /* >127 are reserved for prog type specific return codes. + * + * BPF_LWT_REROUTE: used by BPF_PROG_TYPE_LWT_IN and + * BPF_PROG_TYPE_LWT_XMIT to indicate that skb had been + * changed and should be routed based on its new L3 header. + * (This is an L3 redirect, as opposed to L2 redirect + * represented by BPF_REDIRECT above). + */ + BPF_LWT_REROUTE = 128, + /* BPF_FLOW_DISSECTOR_CONTINUE: used by BPF_PROG_TYPE_FLOW_DISSECTOR + * to indicate that no custom dissection was performed, and + * fallback to standard dissector is requested. + */ + BPF_FLOW_DISSECTOR_CONTINUE = 129, +}; + +struct bpf_sock { + __u32 bound_dev_if; + __u32 family; + __u32 type; + __u32 protocol; + __u32 mark; + __u32 priority; + /* IP address also allows 1 and 2 bytes access */ + __u32 src_ip4; + __u32 src_ip6[4]; + __u32 src_port; /* host byte order */ + __be16 dst_port; /* network byte order */ + __u16 :16; /* zero padding */ + __u32 dst_ip4; + __u32 dst_ip6[4]; + __u32 state; + __s32 rx_queue_mapping; +}; + +struct bpf_tcp_sock { + __u32 snd_cwnd; /* Sending congestion window */ + __u32 srtt_us; /* smoothed round trip time << 3 in usecs */ + __u32 rtt_min; + __u32 snd_ssthresh; /* Slow start size threshold */ + __u32 rcv_nxt; /* What we want to receive next */ + __u32 snd_nxt; /* Next sequence we send */ + __u32 snd_una; /* First byte we want an ack for */ + __u32 mss_cache; /* Cached effective mss, not including SACKS */ + __u32 ecn_flags; /* ECN status bits. */ + __u32 rate_delivered; /* saved rate sample: packets delivered */ + __u32 rate_interval_us; /* saved rate sample: time elapsed */ + __u32 packets_out; /* Packets which are "in flight" */ + __u32 retrans_out; /* Retransmitted packets out */ + __u32 total_retrans; /* Total retransmits for entire connection */ + __u32 segs_in; /* RFC4898 tcpEStatsPerfSegsIn + * total number of segments in. + */ + __u32 data_segs_in; /* RFC4898 tcpEStatsPerfDataSegsIn + * total number of data segments in. + */ + __u32 segs_out; /* RFC4898 tcpEStatsPerfSegsOut + * The total number of segments sent. + */ + __u32 data_segs_out; /* RFC4898 tcpEStatsPerfDataSegsOut + * total number of data segments sent. + */ + __u32 lost_out; /* Lost packets */ + __u32 sacked_out; /* SACK'd packets */ + __u64 bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived + * sum(delta(rcv_nxt)), or how many bytes + * were acked. + */ + __u64 bytes_acked; /* RFC4898 tcpEStatsAppHCThruOctetsAcked + * sum(delta(snd_una)), or how many bytes + * were acked. + */ + __u32 dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups + * total number of DSACK blocks received + */ + __u32 delivered; /* Total data packets delivered incl. rexmits */ + __u32 delivered_ce; /* Like the above but only ECE marked packets */ + __u32 icsk_retransmits; /* Number of unrecovered [RTO] timeouts */ +}; + +struct bpf_sock_tuple { + union { + struct { + __be32 saddr; + __be32 daddr; + __be16 sport; + __be16 dport; + } ipv4; + struct { + __be32 saddr[4]; + __be32 daddr[4]; + __be16 sport; + __be16 dport; + } ipv6; + }; +}; + +struct bpf_xdp_sock { + __u32 queue_id; +}; + +#define XDP_PACKET_HEADROOM 256 + +/* User return codes for XDP prog type. + * A valid XDP program must return one of these defined values. All other + * return codes are reserved for future use. Unknown return codes will + * result in packet drops and a warning via bpf_warn_invalid_xdp_action(). + */ +enum xdp_action { + XDP_ABORTED = 0, + XDP_DROP, + XDP_PASS, + XDP_TX, + XDP_REDIRECT, +}; + +/* user accessible metadata for XDP packet hook + * new fields must be added to the end of this structure + */ +struct xdp_md { + __u32 data; + __u32 data_end; + __u32 data_meta; + /* Below access go through struct xdp_rxq_info */ + __u32 ingress_ifindex; /* rxq->dev->ifindex */ + __u32 rx_queue_index; /* rxq->queue_index */ + + __u32 egress_ifindex; /* txq->dev->ifindex */ +}; + +/* DEVMAP map-value layout + * + * The struct data-layout of map-value is a configuration interface. + * New members can only be added to the end of this structure. + */ +struct bpf_devmap_val { + __u32 ifindex; /* device index */ + union { + int fd; /* prog fd on map write */ + __u32 id; /* prog id on map read */ + } bpf_prog; +}; + +/* CPUMAP map-value layout + * + * The struct data-layout of map-value is a configuration interface. + * New members can only be added to the end of this structure. + */ +struct bpf_cpumap_val { + __u32 qsize; /* queue size to remote target CPU */ + union { + int fd; /* prog fd on map write */ + __u32 id; /* prog id on map read */ + } bpf_prog; +}; + +enum sk_action { + SK_DROP = 0, + SK_PASS, +}; + +/* user accessible metadata for SK_MSG packet hook, new fields must + * be added to the end of this structure + */ +struct sk_msg_md { + __bpf_md_ptr(void *, data); + __bpf_md_ptr(void *, data_end); + + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + __u32 size; /* Total size of sk_msg */ + + __bpf_md_ptr(struct bpf_sock *, sk); /* current socket */ +}; + +struct sk_reuseport_md { + /* + * Start of directly accessible data. It begins from + * the tcp/udp header. + */ + __bpf_md_ptr(void *, data); + /* End of directly accessible data */ + __bpf_md_ptr(void *, data_end); + /* + * Total length of packet (starting from the tcp/udp header). + * Note that the directly accessible bytes (data_end - data) + * could be less than this "len". Those bytes could be + * indirectly read by a helper "bpf_skb_load_bytes()". + */ + __u32 len; + /* + * Eth protocol in the mac header (network byte order). e.g. + * ETH_P_IP(0x0800) and ETH_P_IPV6(0x86DD) + */ + __u32 eth_protocol; + __u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */ + __u32 bind_inany; /* Is sock bound to an INANY address? */ + __u32 hash; /* A hash of the packet 4 tuples */ + /* When reuse->migrating_sk is NULL, it is selecting a sk for the + * new incoming connection request (e.g. selecting a listen sk for + * the received SYN in the TCP case). reuse->sk is one of the sk + * in the reuseport group. The bpf prog can use reuse->sk to learn + * the local listening ip/port without looking into the skb. + * + * When reuse->migrating_sk is not NULL, reuse->sk is closed and + * reuse->migrating_sk is the socket that needs to be migrated + * to another listening socket. migrating_sk could be a fullsock + * sk that is fully established or a reqsk that is in-the-middle + * of 3-way handshake. + */ + __bpf_md_ptr(struct bpf_sock *, sk); + __bpf_md_ptr(struct bpf_sock *, migrating_sk); +}; + +#define BPF_TAG_SIZE 8 + +struct bpf_prog_info { + __u32 type; + __u32 id; + __u8 tag[BPF_TAG_SIZE]; + __u32 jited_prog_len; + __u32 xlated_prog_len; + __aligned_u64 jited_prog_insns; + __aligned_u64 xlated_prog_insns; + __u64 load_time; /* ns since boottime */ + __u32 created_by_uid; + __u32 nr_map_ids; + __aligned_u64 map_ids; + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 gpl_compatible:1; + __u32 :31; /* alignment pad */ + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; + __u32 nr_jited_func_lens; + __aligned_u64 jited_ksyms; + __aligned_u64 jited_func_lens; + __u32 btf_id; + __u32 func_info_rec_size; + __aligned_u64 func_info; + __u32 nr_func_info; + __u32 nr_line_info; + __aligned_u64 line_info; + __aligned_u64 jited_line_info; + __u32 nr_jited_line_info; + __u32 line_info_rec_size; + __u32 jited_line_info_rec_size; + __u32 nr_prog_tags; + __aligned_u64 prog_tags; + __u64 run_time_ns; + __u64 run_cnt; + __u64 recursion_misses; + __u32 verified_insns; + __u32 attach_btf_obj_id; + __u32 attach_btf_id; +} __attribute__((aligned(8))); + +struct bpf_map_info { + __u32 type; + __u32 id; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 btf_vmlinux_value_type_id; + __u64 netns_dev; + __u64 netns_ino; + __u32 btf_id; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 :32; /* alignment pad */ + __u64 map_extra; +} __attribute__((aligned(8))); + +struct bpf_btf_info { + __aligned_u64 btf; + __u32 btf_size; + __u32 id; + __aligned_u64 name; + __u32 name_len; + __u32 kernel_btf; +} __attribute__((aligned(8))); + +struct bpf_link_info { + __u32 type; + __u32 id; + __u32 prog_id; + union { + struct { + __aligned_u64 tp_name; /* in/out: tp_name buffer ptr */ + __u32 tp_name_len; /* in/out: tp_name buffer len */ + } raw_tracepoint; + struct { + __u32 attach_type; + __u32 target_obj_id; /* prog_id for PROG_EXT, otherwise btf object id */ + __u32 target_btf_id; /* BTF type id inside the object */ + } tracing; + struct { + __u64 cgroup_id; + __u32 attach_type; + } cgroup; + struct { + __aligned_u64 target_name; /* in/out: target_name buffer ptr */ + __u32 target_name_len; /* in/out: target_name buffer len */ + + /* If the iter specific field is 32 bits, it can be put + * in the first or second union. Otherwise it should be + * put in the second union. + */ + union { + struct { + __u32 map_id; + } map; + }; + union { + struct { + __u64 cgroup_id; + __u32 order; + } cgroup; + struct { + __u32 tid; + __u32 pid; + } task; + }; + } iter; + struct { + __u32 netns_ino; + __u32 attach_type; + } netns; + struct { + __u32 ifindex; + } xdp; + }; +} __attribute__((aligned(8))); + +/* User bpf_sock_addr struct to access socket fields and sockaddr struct passed + * by user and intended to be used by socket (e.g. to bind to, depends on + * attach type). + */ +struct bpf_sock_addr { + __u32 user_family; /* Allows 4-byte read, but no write. */ + __u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order. + */ + __u32 user_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. + * Stored in network byte order. + */ + __u32 user_port; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order + */ + __u32 family; /* Allows 4-byte read, but no write */ + __u32 type; /* Allows 4-byte read, but no write */ + __u32 protocol; /* Allows 4-byte read, but no write */ + __u32 msg_src_ip4; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order. + */ + __u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. + * Stored in network byte order. + */ + __bpf_md_ptr(struct bpf_sock *, sk); +}; + +/* User bpf_sock_ops struct to access socket values and specify request ops + * and their replies. + * Some of this fields are in network (bigendian) byte order and may need + * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h). + * New fields can only be added at the end of this structure + */ +struct bpf_sock_ops { + __u32 op; + union { + __u32 args[4]; /* Optionally passed to bpf program */ + __u32 reply; /* Returned by bpf program */ + __u32 replylong[4]; /* Optionally returned by bpf prog */ + }; + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + __u32 is_fullsock; /* Some TCP fields are only valid if + * there is a full socket. If not, the + * fields read as zero. + */ + __u32 snd_cwnd; + __u32 srtt_us; /* Averaged RTT << 3 in usecs */ + __u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */ + __u32 state; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u32 sk_txhash; + __u64 bytes_received; + __u64 bytes_acked; + __bpf_md_ptr(struct bpf_sock *, sk); + /* [skb_data, skb_data_end) covers the whole TCP header. + * + * BPF_SOCK_OPS_PARSE_HDR_OPT_CB: The packet received + * BPF_SOCK_OPS_HDR_OPT_LEN_CB: Not useful because the + * header has not been written. + * BPF_SOCK_OPS_WRITE_HDR_OPT_CB: The header and options have + * been written so far. + * BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: The SYNACK that concludes + * the 3WHS. + * BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: The ACK that concludes + * the 3WHS. + * + * bpf_load_hdr_opt() can also be used to read a particular option. + */ + __bpf_md_ptr(void *, skb_data); + __bpf_md_ptr(void *, skb_data_end); + __u32 skb_len; /* The total length of a packet. + * It includes the header, options, + * and payload. + */ + __u32 skb_tcp_flags; /* tcp_flags of the header. It provides + * an easy way to check for tcp_flags + * without parsing skb_data. + * + * In particular, the skb_tcp_flags + * will still be available in + * BPF_SOCK_OPS_HDR_OPT_LEN even though + * the outgoing header has not + * been written yet. + */ + __u64 skb_hwtstamp; +}; + +/* Definitions for bpf_sock_ops_cb_flags */ +enum { + BPF_SOCK_OPS_RTO_CB_FLAG = (1<<0), + BPF_SOCK_OPS_RETRANS_CB_FLAG = (1<<1), + BPF_SOCK_OPS_STATE_CB_FLAG = (1<<2), + BPF_SOCK_OPS_RTT_CB_FLAG = (1<<3), + /* Call bpf for all received TCP headers. The bpf prog will be + * called under sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB + * + * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB + * for the header option related helpers that will be useful + * to the bpf programs. + * + * It could be used at the client/active side (i.e. connect() side) + * when the server told it that the server was in syncookie + * mode and required the active side to resend the bpf-written + * options. The active side can keep writing the bpf-options until + * it received a valid packet from the server side to confirm + * the earlier packet (and options) has been received. The later + * example patch is using it like this at the active side when the + * server is in syncookie mode. + * + * The bpf prog will usually turn this off in the common cases. + */ + BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = (1<<4), + /* Call bpf when kernel has received a header option that + * the kernel cannot handle. The bpf prog will be called under + * sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB. + * + * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB + * for the header option related helpers that will be useful + * to the bpf programs. + */ + BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = (1<<5), + /* Call bpf when the kernel is writing header options for the + * outgoing packet. The bpf prog will first be called + * to reserve space in a skb under + * sock_ops->op == BPF_SOCK_OPS_HDR_OPT_LEN_CB. Then + * the bpf prog will be called to write the header option(s) + * under sock_ops->op == BPF_SOCK_OPS_WRITE_HDR_OPT_CB. + * + * Please refer to the comment in BPF_SOCK_OPS_HDR_OPT_LEN_CB + * and BPF_SOCK_OPS_WRITE_HDR_OPT_CB for the header option + * related helpers that will be useful to the bpf programs. + * + * The kernel gets its chance to reserve space and write + * options first before the BPF program does. + */ + BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = (1<<6), +/* Mask of all currently supported cb flags */ + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7F, +}; + +/* List of known BPF sock_ops operators. + * New entries can only be added at the end + */ +enum { + BPF_SOCK_OPS_VOID, + BPF_SOCK_OPS_TIMEOUT_INIT, /* Should return SYN-RTO value to use or + * -1 if default value should be used + */ + BPF_SOCK_OPS_RWND_INIT, /* Should return initial advertized + * window (in packets) or -1 if default + * value should be used + */ + BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an + * active connection is initialized + */ + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an + * active connection is + * established + */ + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a + * passive connection is + * established + */ + BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control + * needs ECN + */ + BPF_SOCK_OPS_BASE_RTT, /* Get base RTT. The correct value is + * based on the path and may be + * dependent on the congestion control + * algorithm. In general it indicates + * a congestion threshold. RTTs above + * this indicate congestion + */ + BPF_SOCK_OPS_RTO_CB, /* Called when an RTO has triggered. + * Arg1: value of icsk_retransmits + * Arg2: value of icsk_rto + * Arg3: whether RTO has expired + */ + BPF_SOCK_OPS_RETRANS_CB, /* Called when skb is retransmitted. + * Arg1: sequence number of 1st byte + * Arg2: # segments + * Arg3: return value of + * tcp_transmit_skb (0 => success) + */ + BPF_SOCK_OPS_STATE_CB, /* Called when TCP changes state. + * Arg1: old_state + * Arg2: new_state + */ + BPF_SOCK_OPS_TCP_LISTEN_CB, /* Called on listen(2), right after + * socket transition to LISTEN state. + */ + BPF_SOCK_OPS_RTT_CB, /* Called on every RTT. + */ + BPF_SOCK_OPS_PARSE_HDR_OPT_CB, /* Parse the header option. + * It will be called to handle + * the packets received at + * an already established + * connection. + * + * sock_ops->skb_data: + * Referring to the received skb. + * It covers the TCP header only. + * + * bpf_load_hdr_opt() can also + * be used to search for a + * particular option. + */ + BPF_SOCK_OPS_HDR_OPT_LEN_CB, /* Reserve space for writing the + * header option later in + * BPF_SOCK_OPS_WRITE_HDR_OPT_CB. + * Arg1: bool want_cookie. (in + * writing SYNACK only) + * + * sock_ops->skb_data: + * Not available because no header has + * been written yet. + * + * sock_ops->skb_tcp_flags: + * The tcp_flags of the + * outgoing skb. (e.g. SYN, ACK, FIN). + * + * bpf_reserve_hdr_opt() should + * be used to reserve space. + */ + BPF_SOCK_OPS_WRITE_HDR_OPT_CB, /* Write the header options + * Arg1: bool want_cookie. (in + * writing SYNACK only) + * + * sock_ops->skb_data: + * Referring to the outgoing skb. + * It covers the TCP header + * that has already been written + * by the kernel and the + * earlier bpf-progs. + * + * sock_ops->skb_tcp_flags: + * The tcp_flags of the outgoing + * skb. (e.g. SYN, ACK, FIN). + * + * bpf_store_hdr_opt() should + * be used to write the + * option. + * + * bpf_load_hdr_opt() can also + * be used to search for a + * particular option that + * has already been written + * by the kernel or the + * earlier bpf-progs. + */ +}; + +/* List of TCP states. There is a build check in net/ipv4/tcp.c to detect + * changes between the TCP and BPF versions. Ideally this should never happen. + * If it does, we need to add code to convert them before calling + * the BPF sock_ops function. + */ +enum { + BPF_TCP_ESTABLISHED = 1, + BPF_TCP_SYN_SENT, + BPF_TCP_SYN_RECV, + BPF_TCP_FIN_WAIT1, + BPF_TCP_FIN_WAIT2, + BPF_TCP_TIME_WAIT, + BPF_TCP_CLOSE, + BPF_TCP_CLOSE_WAIT, + BPF_TCP_LAST_ACK, + BPF_TCP_LISTEN, + BPF_TCP_CLOSING, /* Now a valid state */ + BPF_TCP_NEW_SYN_RECV, + + BPF_TCP_MAX_STATES /* Leave at the end! */ +}; + +enum { + TCP_BPF_IW = 1001, /* Set TCP initial congestion window */ + TCP_BPF_SNDCWND_CLAMP = 1002, /* Set sndcwnd_clamp */ + TCP_BPF_DELACK_MAX = 1003, /* Max delay ack in usecs */ + TCP_BPF_RTO_MIN = 1004, /* Min delay ack in usecs */ + /* Copy the SYN pkt to optval + * + * BPF_PROG_TYPE_SOCK_OPS only. It is similar to the + * bpf_getsockopt(TCP_SAVED_SYN) but it does not limit + * to only getting from the saved_syn. It can either get the + * syn packet from: + * + * 1. the just-received SYN packet (only available when writing the + * SYNACK). It will be useful when it is not necessary to + * save the SYN packet for latter use. It is also the only way + * to get the SYN during syncookie mode because the syn + * packet cannot be saved during syncookie. + * + * OR + * + * 2. the earlier saved syn which was done by + * bpf_setsockopt(TCP_SAVE_SYN). + * + * The bpf_getsockopt(TCP_BPF_SYN*) option will hide where the + * SYN packet is obtained. + * + * If the bpf-prog does not need the IP[46] header, the + * bpf-prog can avoid parsing the IP header by using + * TCP_BPF_SYN. Otherwise, the bpf-prog can get both + * IP[46] and TCP header by using TCP_BPF_SYN_IP. + * + * >0: Total number of bytes copied + * -ENOSPC: Not enough space in optval. Only optlen number of + * bytes is copied. + * -ENOENT: The SYN skb is not available now and the earlier SYN pkt + * is not saved by setsockopt(TCP_SAVE_SYN). + */ + TCP_BPF_SYN = 1005, /* Copy the TCP header */ + TCP_BPF_SYN_IP = 1006, /* Copy the IP[46] and TCP header */ + TCP_BPF_SYN_MAC = 1007, /* Copy the MAC, IP[46], and TCP header */ +}; + +enum { + BPF_LOAD_HDR_OPT_TCP_SYN = (1ULL << 0), +}; + +/* args[0] value during BPF_SOCK_OPS_HDR_OPT_LEN_CB and + * BPF_SOCK_OPS_WRITE_HDR_OPT_CB. + */ +enum { + BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, /* Kernel is finding the + * total option spaces + * required for an established + * sk in order to calculate the + * MSS. No skb is actually + * sent. + */ + BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, /* Kernel is in syncookie mode + * when sending a SYN. + */ +}; + +struct bpf_perf_event_value { + __u64 counter; + __u64 enabled; + __u64 running; +}; + +enum { + BPF_DEVCG_ACC_MKNOD = (1ULL << 0), + BPF_DEVCG_ACC_READ = (1ULL << 1), + BPF_DEVCG_ACC_WRITE = (1ULL << 2), +}; + +enum { + BPF_DEVCG_DEV_BLOCK = (1ULL << 0), + BPF_DEVCG_DEV_CHAR = (1ULL << 1), +}; + +struct bpf_cgroup_dev_ctx { + /* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */ + __u32 access_type; + __u32 major; + __u32 minor; +}; + +struct bpf_raw_tracepoint_args { + __u64 args[0]; +}; + +/* DIRECT: Skip the FIB rules and go to FIB table associated with device + * OUTPUT: Do lookup from egress perspective; default is ingress + */ +enum { + BPF_FIB_LOOKUP_DIRECT = (1U << 0), + BPF_FIB_LOOKUP_OUTPUT = (1U << 1), + BPF_FIB_LOOKUP_SKIP_NEIGH = (1U << 2), +}; + +enum { + BPF_FIB_LKUP_RET_SUCCESS, /* lookup successful */ + BPF_FIB_LKUP_RET_BLACKHOLE, /* dest is blackholed; can be dropped */ + BPF_FIB_LKUP_RET_UNREACHABLE, /* dest is unreachable; can be dropped */ + BPF_FIB_LKUP_RET_PROHIBIT, /* dest not allowed; can be dropped */ + BPF_FIB_LKUP_RET_NOT_FWDED, /* packet is not forwarded */ + BPF_FIB_LKUP_RET_FWD_DISABLED, /* fwding is not enabled on ingress */ + BPF_FIB_LKUP_RET_UNSUPP_LWT, /* fwd requires encapsulation */ + BPF_FIB_LKUP_RET_NO_NEIGH, /* no neighbor entry for nh */ + BPF_FIB_LKUP_RET_FRAG_NEEDED, /* fragmentation required to fwd */ +}; + +struct bpf_fib_lookup { + /* input: network family for lookup (AF_INET, AF_INET6) + * output: network family of egress nexthop + */ + __u8 family; + + /* set if lookup is to consider L4 data - e.g., FIB rules */ + __u8 l4_protocol; + __be16 sport; + __be16 dport; + + union { /* used for MTU check */ + /* input to lookup */ + __u16 tot_len; /* L3 length from network hdr (iph->tot_len) */ + + /* output: MTU value */ + __u16 mtu_result; + }; + /* input: L3 device index for lookup + * output: device index from FIB lookup + */ + __u32 ifindex; + + union { + /* inputs to lookup */ + __u8 tos; /* AF_INET */ + __be32 flowinfo; /* AF_INET6, flow_label + priority */ + + /* output: metric of fib result (IPv4/IPv6 only) */ + __u32 rt_metric; + }; + + union { + __be32 ipv4_src; + __u32 ipv6_src[4]; /* in6_addr; network order */ + }; + + /* input to bpf_fib_lookup, ipv{4,6}_dst is destination address in + * network header. output: bpf_fib_lookup sets to gateway address + * if FIB lookup returns gateway route + */ + union { + __be32 ipv4_dst; + __u32 ipv6_dst[4]; /* in6_addr; network order */ + }; + + /* output */ + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __u8 smac[6]; /* ETH_ALEN */ + __u8 dmac[6]; /* ETH_ALEN */ +}; + +struct bpf_redir_neigh { + /* network family for lookup (AF_INET, AF_INET6) */ + __u32 nh_family; + /* network address of nexthop; skips fib lookup to find gateway */ + union { + __be32 ipv4_nh; + __u32 ipv6_nh[4]; /* in6_addr; network order */ + }; +}; + +/* bpf_check_mtu flags*/ +enum bpf_check_mtu_flags { + BPF_MTU_CHK_SEGS = (1U << 0), +}; + +enum bpf_check_mtu_ret { + BPF_MTU_CHK_RET_SUCCESS, /* check and lookup successful */ + BPF_MTU_CHK_RET_FRAG_NEEDED, /* fragmentation required to fwd */ + BPF_MTU_CHK_RET_SEGS_TOOBIG, /* GSO re-segmentation needed to fwd */ +}; + +enum bpf_task_fd_type { + BPF_FD_TYPE_RAW_TRACEPOINT, /* tp name */ + BPF_FD_TYPE_TRACEPOINT, /* tp name */ + BPF_FD_TYPE_KPROBE, /* (symbol + offset) or addr */ + BPF_FD_TYPE_KRETPROBE, /* (symbol + offset) or addr */ + BPF_FD_TYPE_UPROBE, /* filename + offset */ + BPF_FD_TYPE_URETPROBE, /* filename + offset */ +}; + +enum { + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = (1U << 0), + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = (1U << 1), + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = (1U << 2), +}; + +struct bpf_flow_keys { + __u16 nhoff; + __u16 thoff; + __u16 addr_proto; /* ETH_P_* of valid addrs */ + __u8 is_frag; + __u8 is_first_frag; + __u8 is_encap; + __u8 ip_proto; + __be16 n_proto; + __be16 sport; + __be16 dport; + union { + struct { + __be32 ipv4_src; + __be32 ipv4_dst; + }; + struct { + __u32 ipv6_src[4]; /* in6_addr; network order */ + __u32 ipv6_dst[4]; /* in6_addr; network order */ + }; + }; + __u32 flags; + __be32 flow_label; +}; + +struct bpf_func_info { + __u32 insn_off; + __u32 type_id; +}; + +#define BPF_LINE_INFO_LINE_NUM(line_col) ((line_col) >> 10) +#define BPF_LINE_INFO_LINE_COL(line_col) ((line_col) & 0x3ff) + +struct bpf_line_info { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + +struct bpf_spin_lock { + __u32 val; +}; + +struct bpf_timer { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_dynptr { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_list_head { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_list_node { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_rb_root { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_rb_node { + __u64 :64; + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_sysctl { + __u32 write; /* Sysctl is being read (= 0) or written (= 1). + * Allows 1,2,4-byte read, but no write. + */ + __u32 file_pos; /* Sysctl file position to read from, write to. + * Allows 1,2,4-byte read an 4-byte write. + */ +}; + +struct bpf_sockopt { + __bpf_md_ptr(struct bpf_sock *, sk); + __bpf_md_ptr(void *, optval); + __bpf_md_ptr(void *, optval_end); + + __s32 level; + __s32 optname; + __s32 optlen; + __s32 retval; +}; + +struct bpf_pidns_info { + __u32 pid; + __u32 tgid; +}; + +/* User accessible data for SK_LOOKUP programs. Add new fields at the end. */ +struct bpf_sk_lookup { + union { + __bpf_md_ptr(struct bpf_sock *, sk); /* Selected socket */ + __u64 cookie; /* Non-zero if socket was selected in PROG_TEST_RUN */ + }; + + __u32 family; /* Protocol family (AF_INET, AF_INET6) */ + __u32 protocol; /* IP protocol (IPPROTO_TCP, IPPROTO_UDP) */ + __u32 remote_ip4; /* Network byte order */ + __u32 remote_ip6[4]; /* Network byte order */ + __be16 remote_port; /* Network byte order */ + __u16 :16; /* Zero padding */ + __u32 local_ip4; /* Network byte order */ + __u32 local_ip6[4]; /* Network byte order */ + __u32 local_port; /* Host byte order */ + __u32 ingress_ifindex; /* The arriving interface. Determined by inet_iif. */ +}; + +/* + * struct btf_ptr is used for typed pointer representation; the + * type id is used to render the pointer data as the appropriate type + * via the bpf_snprintf_btf() helper described above. A flags field - + * potentially to specify additional details about the BTF pointer + * (rather than its mode of display) - is included for future use. + * Display flags - BTF_F_* - are passed to bpf_snprintf_btf separately. + */ +struct btf_ptr { + void *ptr; + __u32 type_id; + __u32 flags; /* BTF ptr flags; unused at present. */ +}; + +/* + * Flags to control bpf_snprintf_btf() behaviour. + * - BTF_F_COMPACT: no formatting around type information + * - BTF_F_NONAME: no struct/union member names/types + * - BTF_F_PTR_RAW: show raw (unobfuscated) pointer values; + * equivalent to %px. + * - BTF_F_ZERO: show zero-valued struct/union members; they + * are not displayed by default + */ +enum { + BTF_F_COMPACT = (1ULL << 0), + BTF_F_NONAME = (1ULL << 1), + BTF_F_PTR_RAW = (1ULL << 2), + BTF_F_ZERO = (1ULL << 3), +}; + +/* bpf_core_relo_kind encodes which aspect of captured field/type/enum value + * has to be adjusted by relocations. It is emitted by llvm and passed to + * libbpf and later to the kernel. + */ +enum bpf_core_relo_kind { + BPF_CORE_FIELD_BYTE_OFFSET = 0, /* field byte offset */ + BPF_CORE_FIELD_BYTE_SIZE = 1, /* field size in bytes */ + BPF_CORE_FIELD_EXISTS = 2, /* field existence in target kernel */ + BPF_CORE_FIELD_SIGNED = 3, /* field signedness (0 - unsigned, 1 - signed) */ + BPF_CORE_FIELD_LSHIFT_U64 = 4, /* bitfield-specific left bitshift */ + BPF_CORE_FIELD_RSHIFT_U64 = 5, /* bitfield-specific right bitshift */ + BPF_CORE_TYPE_ID_LOCAL = 6, /* type ID in local BPF object */ + BPF_CORE_TYPE_ID_TARGET = 7, /* type ID in target kernel */ + BPF_CORE_TYPE_EXISTS = 8, /* type existence in target kernel */ + BPF_CORE_TYPE_SIZE = 9, /* type size in bytes */ + BPF_CORE_ENUMVAL_EXISTS = 10, /* enum value existence in target kernel */ + BPF_CORE_ENUMVAL_VALUE = 11, /* enum value integer value */ + BPF_CORE_TYPE_MATCHES = 12, /* type match in target kernel */ +}; + +/* + * "struct bpf_core_relo" is used to pass relocation data form LLVM to libbpf + * and from libbpf to the kernel. + * + * CO-RE relocation captures the following data: + * - insn_off - instruction offset (in bytes) within a BPF program that needs + * its insn->imm field to be relocated with actual field info; + * - type_id - BTF type ID of the "root" (containing) entity of a relocatable + * type or field; + * - access_str_off - offset into corresponding .BTF string section. String + * interpretation depends on specific relocation kind: + * - for field-based relocations, string encodes an accessed field using + * a sequence of field and array indices, separated by colon (:). It's + * conceptually very close to LLVM's getelementptr ([0]) instruction's + * arguments for identifying offset to a field. + * - for type-based relocations, strings is expected to be just "0"; + * - for enum value-based relocations, string contains an index of enum + * value within its enum type; + * - kind - one of enum bpf_core_relo_kind; + * + * Example: + * struct sample { + * int a; + * struct { + * int b[10]; + * }; + * }; + * + * struct sample *s = ...; + * int *x = &s->a; // encoded as "0:0" (a is field #0) + * int *y = &s->b[5]; // encoded as "0:1:0:5" (anon struct is field #1, + * // b is field #0 inside anon struct, accessing elem #5) + * int *z = &s[10]->b; // encoded as "10:1" (ptr is used as an array) + * + * type_id for all relocs in this example will capture BTF type id of + * `struct sample`. + * + * Such relocation is emitted when using __builtin_preserve_access_index() + * Clang built-in, passing expression that captures field address, e.g.: + * + * bpf_probe_read(&dst, sizeof(dst), + * __builtin_preserve_access_index(&src->a.b.c)); + * + * In this case Clang will emit field relocation recording necessary data to + * be able to find offset of embedded `a.b.c` field within `src` struct. + * + * [0] https://llvm.org/docs/LangRef.html#getelementptr-instruction + */ +struct bpf_core_relo { + __u32 insn_off; + __u32 type_id; + __u32 access_str_off; + enum bpf_core_relo_kind kind; +}; + +#endif /* _UAPI__LINUX_BPF_H__ */ diff --git a/bpftool/include/uapi/linux/bpf_common.h b/bpftool/include/uapi/linux/bpf_common.h new file mode 100644 index 0000000..ee97668 --- /dev/null +++ b/bpftool/include/uapi/linux/bpf_common.h @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__LINUX_BPF_COMMON_H__ +#define _UAPI__LINUX_BPF_COMMON_H__ + +/* Instruction classes */ +#define BPF_CLASS(code) ((code) & 0x07) +#define BPF_LD 0x00 +#define BPF_LDX 0x01 +#define BPF_ST 0x02 +#define BPF_STX 0x03 +#define BPF_ALU 0x04 +#define BPF_JMP 0x05 +#define BPF_RET 0x06 +#define BPF_MISC 0x07 + +/* ld/ldx fields */ +#define BPF_SIZE(code) ((code) & 0x18) +#define BPF_W 0x00 /* 32-bit */ +#define BPF_H 0x08 /* 16-bit */ +#define BPF_B 0x10 /* 8-bit */ +/* eBPF BPF_DW 0x18 64-bit */ +#define BPF_MODE(code) ((code) & 0xe0) +#define BPF_IMM 0x00 +#define BPF_ABS 0x20 +#define BPF_IND 0x40 +#define BPF_MEM 0x60 +#define BPF_LEN 0x80 +#define BPF_MSH 0xa0 + +/* alu/jmp fields */ +#define BPF_OP(code) ((code) & 0xf0) +#define BPF_ADD 0x00 +#define BPF_SUB 0x10 +#define BPF_MUL 0x20 +#define BPF_DIV 0x30 +#define BPF_OR 0x40 +#define BPF_AND 0x50 +#define BPF_LSH 0x60 +#define BPF_RSH 0x70 +#define BPF_NEG 0x80 +#define BPF_MOD 0x90 +#define BPF_XOR 0xa0 + +#define BPF_JA 0x00 +#define BPF_JEQ 0x10 +#define BPF_JGT 0x20 +#define BPF_JGE 0x30 +#define BPF_JSET 0x40 +#define BPF_SRC(code) ((code) & 0x08) +#define BPF_K 0x00 +#define BPF_X 0x08 + +#ifndef BPF_MAXINSNS +#define BPF_MAXINSNS 4096 +#endif + +#endif /* _UAPI__LINUX_BPF_COMMON_H__ */ diff --git a/bpftool/include/uapi/linux/btf.h b/bpftool/include/uapi/linux/btf.h new file mode 100644 index 0000000..ec1798b --- /dev/null +++ b/bpftool/include/uapi/linux/btf.h @@ -0,0 +1,200 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* Copyright (c) 2018 Facebook */ +#ifndef _UAPI__LINUX_BTF_H__ +#define _UAPI__LINUX_BTF_H__ + +#include + +#define BTF_MAGIC 0xeB9F +#define BTF_VERSION 1 + +struct btf_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + + /* All offsets are in bytes relative to the end of this header */ + __u32 type_off; /* offset of type section */ + __u32 type_len; /* length of type section */ + __u32 str_off; /* offset of string section */ + __u32 str_len; /* length of string section */ +}; + +/* Max # of type identifier */ +#define BTF_MAX_TYPE 0x000fffff +/* Max offset into the string section */ +#define BTF_MAX_NAME_OFFSET 0x00ffffff +/* Max # of struct/union/enum members or func args */ +#define BTF_MAX_VLEN 0xffff + +struct btf_type { + __u32 name_off; + /* "info" bits arrangement + * bits 0-15: vlen (e.g. # of struct's members) + * bits 16-23: unused + * bits 24-28: kind (e.g. int, ptr, array...etc) + * bits 29-30: unused + * bit 31: kind_flag, currently used by + * struct, union, enum, fwd and enum64 + */ + __u32 info; + /* "size" is used by INT, ENUM, STRUCT, UNION, DATASEC and ENUM64. + * "size" tells the size of the type it is describing. + * + * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, + * FUNC, FUNC_PROTO, VAR, DECL_TAG and TYPE_TAG. + * "type" is a type_id referring to another type. + */ + union { + __u32 size; + __u32 type; + }; +}; + +#define BTF_INFO_KIND(info) (((info) >> 24) & 0x1f) +#define BTF_INFO_VLEN(info) ((info) & 0xffff) +#define BTF_INFO_KFLAG(info) ((info) >> 31) + +enum { + BTF_KIND_UNKN = 0, /* Unknown */ + BTF_KIND_INT = 1, /* Integer */ + BTF_KIND_PTR = 2, /* Pointer */ + BTF_KIND_ARRAY = 3, /* Array */ + BTF_KIND_STRUCT = 4, /* Struct */ + BTF_KIND_UNION = 5, /* Union */ + BTF_KIND_ENUM = 6, /* Enumeration up to 32-bit values */ + BTF_KIND_FWD = 7, /* Forward */ + BTF_KIND_TYPEDEF = 8, /* Typedef */ + BTF_KIND_VOLATILE = 9, /* Volatile */ + BTF_KIND_CONST = 10, /* Const */ + BTF_KIND_RESTRICT = 11, /* Restrict */ + BTF_KIND_FUNC = 12, /* Function */ + BTF_KIND_FUNC_PROTO = 13, /* Function Proto */ + BTF_KIND_VAR = 14, /* Variable */ + BTF_KIND_DATASEC = 15, /* Section */ + BTF_KIND_FLOAT = 16, /* Floating point */ + BTF_KIND_DECL_TAG = 17, /* Decl Tag */ + BTF_KIND_TYPE_TAG = 18, /* Type Tag */ + BTF_KIND_ENUM64 = 19, /* Enumeration up to 64-bit values */ + + NR_BTF_KINDS, + BTF_KIND_MAX = NR_BTF_KINDS - 1, +}; + +/* For some specific BTF_KIND, "struct btf_type" is immediately + * followed by extra data. + */ + +/* BTF_KIND_INT is followed by a u32 and the following + * is the 32 bits arrangement: + */ +#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24) +#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16) +#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff) + +/* Attributes stored in the BTF_INT_ENCODING */ +#define BTF_INT_SIGNED (1 << 0) +#define BTF_INT_CHAR (1 << 1) +#define BTF_INT_BOOL (1 << 2) + +/* BTF_KIND_ENUM is followed by multiple "struct btf_enum". + * The exact number of btf_enum is stored in the vlen (of the + * info in "struct btf_type"). + */ +struct btf_enum { + __u32 name_off; + __s32 val; +}; + +/* BTF_KIND_ARRAY is followed by one "struct btf_array" */ +struct btf_array { + __u32 type; + __u32 index_type; + __u32 nelems; +}; + +/* BTF_KIND_STRUCT and BTF_KIND_UNION are followed + * by multiple "struct btf_member". The exact number + * of btf_member is stored in the vlen (of the info in + * "struct btf_type"). + */ +struct btf_member { + __u32 name_off; + __u32 type; + /* If the type info kind_flag is set, the btf_member offset + * contains both member bitfield size and bit offset. The + * bitfield size is set for bitfield members. If the type + * info kind_flag is not set, the offset contains only bit + * offset. + */ + __u32 offset; +}; + +/* If the struct/union type info kind_flag is set, the + * following two macros are used to access bitfield_size + * and bit_offset from btf_member.offset. + */ +#define BTF_MEMBER_BITFIELD_SIZE(val) ((val) >> 24) +#define BTF_MEMBER_BIT_OFFSET(val) ((val) & 0xffffff) + +/* BTF_KIND_FUNC_PROTO is followed by multiple "struct btf_param". + * The exact number of btf_param is stored in the vlen (of the + * info in "struct btf_type"). + */ +struct btf_param { + __u32 name_off; + __u32 type; +}; + +enum { + BTF_VAR_STATIC = 0, + BTF_VAR_GLOBAL_ALLOCATED = 1, + BTF_VAR_GLOBAL_EXTERN = 2, +}; + +enum btf_func_linkage { + BTF_FUNC_STATIC = 0, + BTF_FUNC_GLOBAL = 1, + BTF_FUNC_EXTERN = 2, +}; + +/* BTF_KIND_VAR is followed by a single "struct btf_var" to describe + * additional information related to the variable such as its linkage. + */ +struct btf_var { + __u32 linkage; +}; + +/* BTF_KIND_DATASEC is followed by multiple "struct btf_var_secinfo" + * to describe all BTF_KIND_VAR types it contains along with it's + * in-section offset as well as size. + */ +struct btf_var_secinfo { + __u32 type; + __u32 offset; + __u32 size; +}; + +/* BTF_KIND_DECL_TAG is followed by a single "struct btf_decl_tag" to describe + * additional information related to the tag applied location. + * If component_idx == -1, the tag is applied to a struct, union, + * variable or function. Otherwise, it is applied to a struct/union + * member or a func argument, and component_idx indicates which member + * or argument (0 ... vlen-1). + */ +struct btf_decl_tag { + __s32 component_idx; +}; + +/* BTF_KIND_ENUM64 is followed by multiple "struct btf_enum64". + * The exact number of btf_enum64 is stored in the vlen (of the + * info in "struct btf_type"). + */ +struct btf_enum64 { + __u32 name_off; + __u32 val_lo32; + __u32 val_hi32; +}; + +#endif /* _UAPI__LINUX_BTF_H__ */ diff --git a/bpftool/include/uapi/linux/const.h b/bpftool/include/uapi/linux/const.h new file mode 100644 index 0000000..af2a44c --- /dev/null +++ b/bpftool/include/uapi/linux/const.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* const.h: Macros for dealing with constants. */ + +#ifndef _UAPI_LINUX_CONST_H +#define _UAPI_LINUX_CONST_H + +/* Some constant macros are used in both assembler and + * C code. Therefore we cannot annotate them always with + * 'UL' and other type specifiers unilaterally. We + * use the following macros to deal with this. + * + * Similarly, _AT() will cast an expression with a type in C, but + * leave it unchanged in asm. + */ + +#ifdef __ASSEMBLY__ +#define _AC(X,Y) X +#define _AT(T,X) X +#else +#define __AC(X,Y) (X##Y) +#define _AC(X,Y) __AC(X,Y) +#define _AT(T,X) ((T)(X)) +#endif + +#define _UL(x) (_AC(x, UL)) +#define _ULL(x) (_AC(x, ULL)) + +#define _BITUL(x) (_UL(1) << (x)) +#define _BITULL(x) (_ULL(1) << (x)) + +#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) + +#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) + +#endif /* _UAPI_LINUX_CONST_H */ diff --git a/bpftool/include/uapi/linux/if_link.h b/bpftool/include/uapi/linux/if_link.h new file mode 100644 index 0000000..901d98b --- /dev/null +++ b/bpftool/include/uapi/linux/if_link.h @@ -0,0 +1,1283 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_IF_LINK_H +#define _UAPI_LINUX_IF_LINK_H + +#include +#include + +/* This struct should be in sync with struct rtnl_link_stats64 */ +struct rtnl_link_stats { + __u32 rx_packets; + __u32 tx_packets; + __u32 rx_bytes; + __u32 tx_bytes; + __u32 rx_errors; + __u32 tx_errors; + __u32 rx_dropped; + __u32 tx_dropped; + __u32 multicast; + __u32 collisions; + /* detailed rx_errors: */ + __u32 rx_length_errors; + __u32 rx_over_errors; + __u32 rx_crc_errors; + __u32 rx_frame_errors; + __u32 rx_fifo_errors; + __u32 rx_missed_errors; + + /* detailed tx_errors */ + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + + /* for cslip etc */ + __u32 rx_compressed; + __u32 tx_compressed; + + __u32 rx_nohandler; +}; + +/** + * struct rtnl_link_stats64 - The main device statistics structure. + * + * @rx_packets: Number of good packets received by the interface. + * For hardware interfaces counts all good packets received from the device + * by the host, including packets which host had to drop at various stages + * of processing (even in the driver). + * + * @tx_packets: Number of packets successfully transmitted. + * For hardware interfaces counts packets which host was able to successfully + * hand over to the device, which does not necessarily mean that packets + * had been successfully transmitted out of the device, only that device + * acknowledged it copied them out of host memory. + * + * @rx_bytes: Number of good received bytes, corresponding to @rx_packets. + * + * For IEEE 802.3 devices should count the length of Ethernet Frames + * excluding the FCS. + * + * @tx_bytes: Number of good transmitted bytes, corresponding to @tx_packets. + * + * For IEEE 802.3 devices should count the length of Ethernet Frames + * excluding the FCS. + * + * @rx_errors: Total number of bad packets received on this network device. + * This counter must include events counted by @rx_length_errors, + * @rx_crc_errors, @rx_frame_errors and other errors not otherwise + * counted. + * + * @tx_errors: Total number of transmit problems. + * This counter must include events counter by @tx_aborted_errors, + * @tx_carrier_errors, @tx_fifo_errors, @tx_heartbeat_errors, + * @tx_window_errors and other errors not otherwise counted. + * + * @rx_dropped: Number of packets received but not processed, + * e.g. due to lack of resources or unsupported protocol. + * For hardware interfaces this counter may include packets discarded + * due to L2 address filtering but should not include packets dropped + * by the device due to buffer exhaustion which are counted separately in + * @rx_missed_errors (since procfs folds those two counters together). + * + * @tx_dropped: Number of packets dropped on their way to transmission, + * e.g. due to lack of resources. + * + * @multicast: Multicast packets received. + * For hardware interfaces this statistic is commonly calculated + * at the device level (unlike @rx_packets) and therefore may include + * packets which did not reach the host. + * + * For IEEE 802.3 devices this counter may be equivalent to: + * + * - 30.3.1.1.21 aMulticastFramesReceivedOK + * + * @collisions: Number of collisions during packet transmissions. + * + * @rx_length_errors: Number of packets dropped due to invalid length. + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter should be equivalent to a sum + * of the following attributes: + * + * - 30.3.1.1.23 aInRangeLengthErrors + * - 30.3.1.1.24 aOutOfRangeLengthField + * - 30.3.1.1.25 aFrameTooLongErrors + * + * @rx_over_errors: Receiver FIFO overflow event counter. + * + * Historically the count of overflow events. Such events may be + * reported in the receive descriptors or via interrupts, and may + * not correspond one-to-one with dropped packets. + * + * The recommended interpretation for high speed interfaces is - + * number of packets dropped because they did not fit into buffers + * provided by the host, e.g. packets larger than MTU or next buffer + * in the ring was not available for a scatter transfer. + * + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * This statistics was historically used interchangeably with + * @rx_fifo_errors. + * + * This statistic corresponds to hardware events and is not commonly used + * on software devices. + * + * @rx_crc_errors: Number of packets received with a CRC error. + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter must be equivalent to: + * + * - 30.3.1.1.6 aFrameCheckSequenceErrors + * + * @rx_frame_errors: Receiver frame alignment errors. + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter should be equivalent to: + * + * - 30.3.1.1.7 aAlignmentErrors + * + * @rx_fifo_errors: Receiver FIFO error counter. + * + * Historically the count of overflow events. Those events may be + * reported in the receive descriptors or via interrupts, and may + * not correspond one-to-one with dropped packets. + * + * This statistics was used interchangeably with @rx_over_errors. + * Not recommended for use in drivers for high speed interfaces. + * + * This statistic is used on software devices, e.g. to count software + * packet queue overflow (can) or sequencing errors (GRE). + * + * @rx_missed_errors: Count of packets missed by the host. + * Folded into the "drop" counter in `/proc/net/dev`. + * + * Counts number of packets dropped by the device due to lack + * of buffer space. This usually indicates that the host interface + * is slower than the network interface, or host is not keeping up + * with the receive packet rate. + * + * This statistic corresponds to hardware events and is not used + * on software devices. + * + * @tx_aborted_errors: + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * For IEEE 802.3 devices capable of half-duplex operation this counter + * must be equivalent to: + * + * - 30.3.1.1.11 aFramesAbortedDueToXSColls + * + * High speed interfaces may use this counter as a general device + * discard counter. + * + * @tx_carrier_errors: Number of frame transmission errors due to loss + * of carrier during transmission. + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter must be equivalent to: + * + * - 30.3.1.1.13 aCarrierSenseErrors + * + * @tx_fifo_errors: Number of frame transmission errors due to device + * FIFO underrun / underflow. This condition occurs when the device + * begins transmission of a frame but is unable to deliver the + * entire frame to the transmitter in time for transmission. + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * @tx_heartbeat_errors: Number of Heartbeat / SQE Test errors for + * old half-duplex Ethernet. + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices possibly equivalent to: + * + * - 30.3.2.1.4 aSQETestErrors + * + * @tx_window_errors: Number of frame transmission errors due + * to late collisions (for Ethernet - after the first 64B of transmission). + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter must be equivalent to: + * + * - 30.3.1.1.10 aLateCollisions + * + * @rx_compressed: Number of correctly received compressed packets. + * This counters is only meaningful for interfaces which support + * packet compression (e.g. CSLIP, PPP). + * + * @tx_compressed: Number of transmitted compressed packets. + * This counters is only meaningful for interfaces which support + * packet compression (e.g. CSLIP, PPP). + * + * @rx_nohandler: Number of packets received on the interface + * but dropped by the networking stack because the device is + * not designated to receive packets (e.g. backup link in a bond). + */ +struct rtnl_link_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; + __u64 collisions; + + /* detailed rx_errors: */ + __u64 rx_length_errors; + __u64 rx_over_errors; + __u64 rx_crc_errors; + __u64 rx_frame_errors; + __u64 rx_fifo_errors; + __u64 rx_missed_errors; + + /* detailed tx_errors */ + __u64 tx_aborted_errors; + __u64 tx_carrier_errors; + __u64 tx_fifo_errors; + __u64 tx_heartbeat_errors; + __u64 tx_window_errors; + + /* for cslip etc */ + __u64 rx_compressed; + __u64 tx_compressed; + __u64 rx_nohandler; +}; + +/* The struct should be in sync with struct ifmap */ +struct rtnl_link_ifmap { + __u64 mem_start; + __u64 mem_end; + __u64 base_addr; + __u16 irq; + __u8 dma; + __u8 port; +}; + +/* + * IFLA_AF_SPEC + * Contains nested attributes for address family specific attributes. + * Each address family may create a attribute with the address family + * number as type and create its own attribute structure in it. + * + * Example: + * [IFLA_AF_SPEC] = { + * [AF_INET] = { + * [IFLA_INET_CONF] = ..., + * }, + * [AF_INET6] = { + * [IFLA_INET6_FLAGS] = ..., + * [IFLA_INET6_CONF] = ..., + * } + * } + */ + +enum { + IFLA_UNSPEC, + IFLA_ADDRESS, + IFLA_BROADCAST, + IFLA_IFNAME, + IFLA_MTU, + IFLA_LINK, + IFLA_QDISC, + IFLA_STATS, + IFLA_COST, +#define IFLA_COST IFLA_COST + IFLA_PRIORITY, +#define IFLA_PRIORITY IFLA_PRIORITY + IFLA_MASTER, +#define IFLA_MASTER IFLA_MASTER + IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */ +#define IFLA_WIRELESS IFLA_WIRELESS + IFLA_PROTINFO, /* Protocol specific information for a link */ +#define IFLA_PROTINFO IFLA_PROTINFO + IFLA_TXQLEN, +#define IFLA_TXQLEN IFLA_TXQLEN + IFLA_MAP, +#define IFLA_MAP IFLA_MAP + IFLA_WEIGHT, +#define IFLA_WEIGHT IFLA_WEIGHT + IFLA_OPERSTATE, + IFLA_LINKMODE, + IFLA_LINKINFO, +#define IFLA_LINKINFO IFLA_LINKINFO + IFLA_NET_NS_PID, + IFLA_IFALIAS, + IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ + IFLA_VFINFO_LIST, + IFLA_STATS64, + IFLA_VF_PORTS, + IFLA_PORT_SELF, + IFLA_AF_SPEC, + IFLA_GROUP, /* Group the device belongs to */ + IFLA_NET_NS_FD, + IFLA_EXT_MASK, /* Extended info mask, VFs, etc */ + IFLA_PROMISCUITY, /* Promiscuity count: > 0 means acts PROMISC */ +#define IFLA_PROMISCUITY IFLA_PROMISCUITY + IFLA_NUM_TX_QUEUES, + IFLA_NUM_RX_QUEUES, + IFLA_CARRIER, + IFLA_PHYS_PORT_ID, + IFLA_CARRIER_CHANGES, + IFLA_PHYS_SWITCH_ID, + IFLA_LINK_NETNSID, + IFLA_PHYS_PORT_NAME, + IFLA_PROTO_DOWN, + IFLA_GSO_MAX_SEGS, + IFLA_GSO_MAX_SIZE, + IFLA_PAD, + IFLA_XDP, + IFLA_EVENT, + IFLA_NEW_NETNSID, + IFLA_IF_NETNSID, + IFLA_TARGET_NETNSID = IFLA_IF_NETNSID, /* new alias */ + IFLA_CARRIER_UP_COUNT, + IFLA_CARRIER_DOWN_COUNT, + IFLA_NEW_IFINDEX, + IFLA_MIN_MTU, + IFLA_MAX_MTU, + IFLA_PROP_LIST, + IFLA_ALT_IFNAME, /* Alternative ifname */ + IFLA_PERM_ADDRESS, + IFLA_PROTO_DOWN_REASON, + + /* device (sysfs) name as parent, used instead + * of IFLA_LINK where there's no parent netdev + */ + IFLA_PARENT_DEV_NAME, + IFLA_PARENT_DEV_BUS_NAME, + IFLA_GRO_MAX_SIZE, + IFLA_TSO_MAX_SIZE, + IFLA_TSO_MAX_SEGS, + + __IFLA_MAX +}; + + +#define IFLA_MAX (__IFLA_MAX - 1) + +enum { + IFLA_PROTO_DOWN_REASON_UNSPEC, + IFLA_PROTO_DOWN_REASON_MASK, /* u32, mask for reason bits */ + IFLA_PROTO_DOWN_REASON_VALUE, /* u32, reason bit value */ + + __IFLA_PROTO_DOWN_REASON_CNT, + IFLA_PROTO_DOWN_REASON_MAX = __IFLA_PROTO_DOWN_REASON_CNT - 1 +}; + +/* backwards compatibility for userspace */ +#ifndef __KERNEL__ +#define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) +#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) +#endif + +enum { + IFLA_INET_UNSPEC, + IFLA_INET_CONF, + __IFLA_INET_MAX, +}; + +#define IFLA_INET_MAX (__IFLA_INET_MAX - 1) + +/* ifi_flags. + + IFF_* flags. + + The only change is: + IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are + more not changeable by user. They describe link media + characteristics and set by device driver. + + Comments: + - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid + - If neither of these three flags are set; + the interface is NBMA. + + - IFF_MULTICAST does not mean anything special: + multicasts can be used on all not-NBMA links. + IFF_MULTICAST means that this media uses special encapsulation + for multicast frames. Apparently, all IFF_POINTOPOINT and + IFF_BROADCAST devices are able to use multicasts too. + */ + +/* IFLA_LINK. + For usual devices it is equal ifi_index. + If it is a "virtual interface" (f.e. tunnel), ifi_link + can point to real physical interface (f.e. for bandwidth calculations), + or maybe 0, what means, that real media is unknown (usual + for IPIP tunnels, when route to endpoint is allowed to change) + */ + +/* Subtype attributes for IFLA_PROTINFO */ +enum { + IFLA_INET6_UNSPEC, + IFLA_INET6_FLAGS, /* link flags */ + IFLA_INET6_CONF, /* sysctl parameters */ + IFLA_INET6_STATS, /* statistics */ + IFLA_INET6_MCAST, /* MC things. What of them? */ + IFLA_INET6_CACHEINFO, /* time values and max reasm size */ + IFLA_INET6_ICMP6STATS, /* statistics (icmpv6) */ + IFLA_INET6_TOKEN, /* device token */ + IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */ + IFLA_INET6_RA_MTU, /* mtu carried in the RA message */ + __IFLA_INET6_MAX +}; + +#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) + +enum in6_addr_gen_mode { + IN6_ADDR_GEN_MODE_EUI64, + IN6_ADDR_GEN_MODE_NONE, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY, + IN6_ADDR_GEN_MODE_RANDOM, +}; + +/* Bridge section */ + +enum { + IFLA_BR_UNSPEC, + IFLA_BR_FORWARD_DELAY, + IFLA_BR_HELLO_TIME, + IFLA_BR_MAX_AGE, + IFLA_BR_AGEING_TIME, + IFLA_BR_STP_STATE, + IFLA_BR_PRIORITY, + IFLA_BR_VLAN_FILTERING, + IFLA_BR_VLAN_PROTOCOL, + IFLA_BR_GROUP_FWD_MASK, + IFLA_BR_ROOT_ID, + IFLA_BR_BRIDGE_ID, + IFLA_BR_ROOT_PORT, + IFLA_BR_ROOT_PATH_COST, + IFLA_BR_TOPOLOGY_CHANGE, + IFLA_BR_TOPOLOGY_CHANGE_DETECTED, + IFLA_BR_HELLO_TIMER, + IFLA_BR_TCN_TIMER, + IFLA_BR_TOPOLOGY_CHANGE_TIMER, + IFLA_BR_GC_TIMER, + IFLA_BR_GROUP_ADDR, + IFLA_BR_FDB_FLUSH, + IFLA_BR_MCAST_ROUTER, + IFLA_BR_MCAST_SNOOPING, + IFLA_BR_MCAST_QUERY_USE_IFADDR, + IFLA_BR_MCAST_QUERIER, + IFLA_BR_MCAST_HASH_ELASTICITY, + IFLA_BR_MCAST_HASH_MAX, + IFLA_BR_MCAST_LAST_MEMBER_CNT, + IFLA_BR_MCAST_STARTUP_QUERY_CNT, + IFLA_BR_MCAST_LAST_MEMBER_INTVL, + IFLA_BR_MCAST_MEMBERSHIP_INTVL, + IFLA_BR_MCAST_QUERIER_INTVL, + IFLA_BR_MCAST_QUERY_INTVL, + IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, + IFLA_BR_MCAST_STARTUP_QUERY_INTVL, + IFLA_BR_NF_CALL_IPTABLES, + IFLA_BR_NF_CALL_IP6TABLES, + IFLA_BR_NF_CALL_ARPTABLES, + IFLA_BR_VLAN_DEFAULT_PVID, + IFLA_BR_PAD, + IFLA_BR_VLAN_STATS_ENABLED, + IFLA_BR_MCAST_STATS_ENABLED, + IFLA_BR_MCAST_IGMP_VERSION, + IFLA_BR_MCAST_MLD_VERSION, + IFLA_BR_VLAN_STATS_PER_PORT, + IFLA_BR_MULTI_BOOLOPT, + IFLA_BR_MCAST_QUERIER_STATE, + __IFLA_BR_MAX, +}; + +#define IFLA_BR_MAX (__IFLA_BR_MAX - 1) + +struct ifla_bridge_id { + __u8 prio[2]; + __u8 addr[6]; /* ETH_ALEN */ +}; + +enum { + BRIDGE_MODE_UNSPEC, + BRIDGE_MODE_HAIRPIN, +}; + +enum { + IFLA_BRPORT_UNSPEC, + IFLA_BRPORT_STATE, /* Spanning tree state */ + IFLA_BRPORT_PRIORITY, /* " priority */ + IFLA_BRPORT_COST, /* " cost */ + IFLA_BRPORT_MODE, /* mode (hairpin) */ + IFLA_BRPORT_GUARD, /* bpdu guard */ + IFLA_BRPORT_PROTECT, /* root port protection */ + IFLA_BRPORT_FAST_LEAVE, /* multicast fast leave */ + IFLA_BRPORT_LEARNING, /* mac learning */ + IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */ + IFLA_BRPORT_PROXYARP, /* proxy ARP */ + IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */ + IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */ + IFLA_BRPORT_ROOT_ID, /* designated root */ + IFLA_BRPORT_BRIDGE_ID, /* designated bridge */ + IFLA_BRPORT_DESIGNATED_PORT, + IFLA_BRPORT_DESIGNATED_COST, + IFLA_BRPORT_ID, + IFLA_BRPORT_NO, + IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, + IFLA_BRPORT_CONFIG_PENDING, + IFLA_BRPORT_MESSAGE_AGE_TIMER, + IFLA_BRPORT_FORWARD_DELAY_TIMER, + IFLA_BRPORT_HOLD_TIMER, + IFLA_BRPORT_FLUSH, + IFLA_BRPORT_MULTICAST_ROUTER, + IFLA_BRPORT_PAD, + IFLA_BRPORT_MCAST_FLOOD, + IFLA_BRPORT_MCAST_TO_UCAST, + IFLA_BRPORT_VLAN_TUNNEL, + IFLA_BRPORT_BCAST_FLOOD, + IFLA_BRPORT_GROUP_FWD_MASK, + IFLA_BRPORT_NEIGH_SUPPRESS, + IFLA_BRPORT_ISOLATED, + IFLA_BRPORT_BACKUP_PORT, + IFLA_BRPORT_MRP_RING_OPEN, + IFLA_BRPORT_MRP_IN_OPEN, + IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT, + IFLA_BRPORT_MCAST_EHT_HOSTS_CNT, + __IFLA_BRPORT_MAX +}; +#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) + +struct ifla_cacheinfo { + __u32 max_reasm_len; + __u32 tstamp; /* ipv6InterfaceTable updated timestamp */ + __u32 reachable_time; + __u32 retrans_time; +}; + +enum { + IFLA_INFO_UNSPEC, + IFLA_INFO_KIND, + IFLA_INFO_DATA, + IFLA_INFO_XSTATS, + IFLA_INFO_SLAVE_KIND, + IFLA_INFO_SLAVE_DATA, + __IFLA_INFO_MAX, +}; + +#define IFLA_INFO_MAX (__IFLA_INFO_MAX - 1) + +/* VLAN section */ + +enum { + IFLA_VLAN_UNSPEC, + IFLA_VLAN_ID, + IFLA_VLAN_FLAGS, + IFLA_VLAN_EGRESS_QOS, + IFLA_VLAN_INGRESS_QOS, + IFLA_VLAN_PROTOCOL, + __IFLA_VLAN_MAX, +}; + +#define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1) + +struct ifla_vlan_flags { + __u32 flags; + __u32 mask; +}; + +enum { + IFLA_VLAN_QOS_UNSPEC, + IFLA_VLAN_QOS_MAPPING, + __IFLA_VLAN_QOS_MAX +}; + +#define IFLA_VLAN_QOS_MAX (__IFLA_VLAN_QOS_MAX - 1) + +struct ifla_vlan_qos_mapping { + __u32 from; + __u32 to; +}; + +/* MACVLAN section */ +enum { + IFLA_MACVLAN_UNSPEC, + IFLA_MACVLAN_MODE, + IFLA_MACVLAN_FLAGS, + IFLA_MACVLAN_MACADDR_MODE, + IFLA_MACVLAN_MACADDR, + IFLA_MACVLAN_MACADDR_DATA, + IFLA_MACVLAN_MACADDR_COUNT, + IFLA_MACVLAN_BC_QUEUE_LEN, + IFLA_MACVLAN_BC_QUEUE_LEN_USED, + __IFLA_MACVLAN_MAX, +}; + +#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1) + +enum macvlan_mode { + MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */ + MACVLAN_MODE_VEPA = 2, /* talk to other ports through ext bridge */ + MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ + MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */ + MACVLAN_MODE_SOURCE = 16,/* use source MAC address list to assign */ +}; + +enum macvlan_macaddr_mode { + MACVLAN_MACADDR_ADD, + MACVLAN_MACADDR_DEL, + MACVLAN_MACADDR_FLUSH, + MACVLAN_MACADDR_SET, +}; + +#define MACVLAN_FLAG_NOPROMISC 1 +#define MACVLAN_FLAG_NODST 2 /* skip dst macvlan if matching src macvlan */ + +/* VRF section */ +enum { + IFLA_VRF_UNSPEC, + IFLA_VRF_TABLE, + __IFLA_VRF_MAX +}; + +#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) + +enum { + IFLA_VRF_PORT_UNSPEC, + IFLA_VRF_PORT_TABLE, + __IFLA_VRF_PORT_MAX +}; + +#define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1) + +/* MACSEC section */ +enum { + IFLA_MACSEC_UNSPEC, + IFLA_MACSEC_SCI, + IFLA_MACSEC_PORT, + IFLA_MACSEC_ICV_LEN, + IFLA_MACSEC_CIPHER_SUITE, + IFLA_MACSEC_WINDOW, + IFLA_MACSEC_ENCODING_SA, + IFLA_MACSEC_ENCRYPT, + IFLA_MACSEC_PROTECT, + IFLA_MACSEC_INC_SCI, + IFLA_MACSEC_ES, + IFLA_MACSEC_SCB, + IFLA_MACSEC_REPLAY_PROTECT, + IFLA_MACSEC_VALIDATION, + IFLA_MACSEC_PAD, + IFLA_MACSEC_OFFLOAD, + __IFLA_MACSEC_MAX, +}; + +#define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1) + +/* XFRM section */ +enum { + IFLA_XFRM_UNSPEC, + IFLA_XFRM_LINK, + IFLA_XFRM_IF_ID, + IFLA_XFRM_COLLECT_METADATA, + __IFLA_XFRM_MAX +}; + +#define IFLA_XFRM_MAX (__IFLA_XFRM_MAX - 1) + +enum macsec_validation_type { + MACSEC_VALIDATE_DISABLED = 0, + MACSEC_VALIDATE_CHECK = 1, + MACSEC_VALIDATE_STRICT = 2, + __MACSEC_VALIDATE_END, + MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1, +}; + +enum macsec_offload { + MACSEC_OFFLOAD_OFF = 0, + MACSEC_OFFLOAD_PHY = 1, + MACSEC_OFFLOAD_MAC = 2, + __MACSEC_OFFLOAD_END, + MACSEC_OFFLOAD_MAX = __MACSEC_OFFLOAD_END - 1, +}; + +/* IPVLAN section */ +enum { + IFLA_IPVLAN_UNSPEC, + IFLA_IPVLAN_MODE, + IFLA_IPVLAN_FLAGS, + __IFLA_IPVLAN_MAX +}; + +#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1) + +enum ipvlan_mode { + IPVLAN_MODE_L2 = 0, + IPVLAN_MODE_L3, + IPVLAN_MODE_L3S, + IPVLAN_MODE_MAX +}; + +#define IPVLAN_F_PRIVATE 0x01 +#define IPVLAN_F_VEPA 0x02 + +/* VXLAN section */ +enum { + IFLA_VXLAN_UNSPEC, + IFLA_VXLAN_ID, + IFLA_VXLAN_GROUP, /* group or remote address */ + IFLA_VXLAN_LINK, + IFLA_VXLAN_LOCAL, + IFLA_VXLAN_TTL, + IFLA_VXLAN_TOS, + IFLA_VXLAN_LEARNING, + IFLA_VXLAN_AGEING, + IFLA_VXLAN_LIMIT, + IFLA_VXLAN_PORT_RANGE, /* source port */ + IFLA_VXLAN_PROXY, + IFLA_VXLAN_RSC, + IFLA_VXLAN_L2MISS, + IFLA_VXLAN_L3MISS, + IFLA_VXLAN_PORT, /* destination port */ + IFLA_VXLAN_GROUP6, + IFLA_VXLAN_LOCAL6, + IFLA_VXLAN_UDP_CSUM, + IFLA_VXLAN_UDP_ZERO_CSUM6_TX, + IFLA_VXLAN_UDP_ZERO_CSUM6_RX, + IFLA_VXLAN_REMCSUM_TX, + IFLA_VXLAN_REMCSUM_RX, + IFLA_VXLAN_GBP, + IFLA_VXLAN_REMCSUM_NOPARTIAL, + IFLA_VXLAN_COLLECT_METADATA, + IFLA_VXLAN_LABEL, + IFLA_VXLAN_GPE, + IFLA_VXLAN_TTL_INHERIT, + IFLA_VXLAN_DF, + __IFLA_VXLAN_MAX +}; +#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) + +struct ifla_vxlan_port_range { + __be16 low; + __be16 high; +}; + +enum ifla_vxlan_df { + VXLAN_DF_UNSET = 0, + VXLAN_DF_SET, + VXLAN_DF_INHERIT, + __VXLAN_DF_END, + VXLAN_DF_MAX = __VXLAN_DF_END - 1, +}; + +/* GENEVE section */ +enum { + IFLA_GENEVE_UNSPEC, + IFLA_GENEVE_ID, + IFLA_GENEVE_REMOTE, + IFLA_GENEVE_TTL, + IFLA_GENEVE_TOS, + IFLA_GENEVE_PORT, /* destination port */ + IFLA_GENEVE_COLLECT_METADATA, + IFLA_GENEVE_REMOTE6, + IFLA_GENEVE_UDP_CSUM, + IFLA_GENEVE_UDP_ZERO_CSUM6_TX, + IFLA_GENEVE_UDP_ZERO_CSUM6_RX, + IFLA_GENEVE_LABEL, + IFLA_GENEVE_TTL_INHERIT, + IFLA_GENEVE_DF, + __IFLA_GENEVE_MAX +}; +#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) + +enum ifla_geneve_df { + GENEVE_DF_UNSET = 0, + GENEVE_DF_SET, + GENEVE_DF_INHERIT, + __GENEVE_DF_END, + GENEVE_DF_MAX = __GENEVE_DF_END - 1, +}; + +/* Bareudp section */ +enum { + IFLA_BAREUDP_UNSPEC, + IFLA_BAREUDP_PORT, + IFLA_BAREUDP_ETHERTYPE, + IFLA_BAREUDP_SRCPORT_MIN, + IFLA_BAREUDP_MULTIPROTO_MODE, + __IFLA_BAREUDP_MAX +}; + +#define IFLA_BAREUDP_MAX (__IFLA_BAREUDP_MAX - 1) + +/* PPP section */ +enum { + IFLA_PPP_UNSPEC, + IFLA_PPP_DEV_FD, + __IFLA_PPP_MAX +}; +#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1) + +/* GTP section */ + +enum ifla_gtp_role { + GTP_ROLE_GGSN = 0, + GTP_ROLE_SGSN, +}; + +enum { + IFLA_GTP_UNSPEC, + IFLA_GTP_FD0, + IFLA_GTP_FD1, + IFLA_GTP_PDP_HASHSIZE, + IFLA_GTP_ROLE, + __IFLA_GTP_MAX, +}; +#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1) + +/* Bonding section */ + +enum { + IFLA_BOND_UNSPEC, + IFLA_BOND_MODE, + IFLA_BOND_ACTIVE_SLAVE, + IFLA_BOND_MIIMON, + IFLA_BOND_UPDELAY, + IFLA_BOND_DOWNDELAY, + IFLA_BOND_USE_CARRIER, + IFLA_BOND_ARP_INTERVAL, + IFLA_BOND_ARP_IP_TARGET, + IFLA_BOND_ARP_VALIDATE, + IFLA_BOND_ARP_ALL_TARGETS, + IFLA_BOND_PRIMARY, + IFLA_BOND_PRIMARY_RESELECT, + IFLA_BOND_FAIL_OVER_MAC, + IFLA_BOND_XMIT_HASH_POLICY, + IFLA_BOND_RESEND_IGMP, + IFLA_BOND_NUM_PEER_NOTIF, + IFLA_BOND_ALL_SLAVES_ACTIVE, + IFLA_BOND_MIN_LINKS, + IFLA_BOND_LP_INTERVAL, + IFLA_BOND_PACKETS_PER_SLAVE, + IFLA_BOND_AD_LACP_RATE, + IFLA_BOND_AD_SELECT, + IFLA_BOND_AD_INFO, + IFLA_BOND_AD_ACTOR_SYS_PRIO, + IFLA_BOND_AD_USER_PORT_KEY, + IFLA_BOND_AD_ACTOR_SYSTEM, + IFLA_BOND_TLB_DYNAMIC_LB, + IFLA_BOND_PEER_NOTIF_DELAY, + IFLA_BOND_AD_LACP_ACTIVE, + IFLA_BOND_MISSED_MAX, + IFLA_BOND_NS_IP6_TARGET, + __IFLA_BOND_MAX, +}; + +#define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1) + +enum { + IFLA_BOND_AD_INFO_UNSPEC, + IFLA_BOND_AD_INFO_AGGREGATOR, + IFLA_BOND_AD_INFO_NUM_PORTS, + IFLA_BOND_AD_INFO_ACTOR_KEY, + IFLA_BOND_AD_INFO_PARTNER_KEY, + IFLA_BOND_AD_INFO_PARTNER_MAC, + __IFLA_BOND_AD_INFO_MAX, +}; + +#define IFLA_BOND_AD_INFO_MAX (__IFLA_BOND_AD_INFO_MAX - 1) + +enum { + IFLA_BOND_SLAVE_UNSPEC, + IFLA_BOND_SLAVE_STATE, + IFLA_BOND_SLAVE_MII_STATUS, + IFLA_BOND_SLAVE_LINK_FAILURE_COUNT, + IFLA_BOND_SLAVE_PERM_HWADDR, + IFLA_BOND_SLAVE_QUEUE_ID, + IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, + IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, + IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, + IFLA_BOND_SLAVE_PRIO, + __IFLA_BOND_SLAVE_MAX, +}; + +#define IFLA_BOND_SLAVE_MAX (__IFLA_BOND_SLAVE_MAX - 1) + +/* SR-IOV virtual function management section */ + +enum { + IFLA_VF_INFO_UNSPEC, + IFLA_VF_INFO, + __IFLA_VF_INFO_MAX, +}; + +#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1) + +enum { + IFLA_VF_UNSPEC, + IFLA_VF_MAC, /* Hardware queue specific attributes */ + IFLA_VF_VLAN, /* VLAN ID and QoS */ + IFLA_VF_TX_RATE, /* Max TX Bandwidth Allocation */ + IFLA_VF_SPOOFCHK, /* Spoof Checking on/off switch */ + IFLA_VF_LINK_STATE, /* link state enable/disable/auto switch */ + IFLA_VF_RATE, /* Min and Max TX Bandwidth Allocation */ + IFLA_VF_RSS_QUERY_EN, /* RSS Redirection Table and Hash Key query + * on/off switch + */ + IFLA_VF_STATS, /* network device statistics */ + IFLA_VF_TRUST, /* Trust VF */ + IFLA_VF_IB_NODE_GUID, /* VF Infiniband node GUID */ + IFLA_VF_IB_PORT_GUID, /* VF Infiniband port GUID */ + IFLA_VF_VLAN_LIST, /* nested list of vlans, option for QinQ */ + IFLA_VF_BROADCAST, /* VF broadcast */ + __IFLA_VF_MAX, +}; + +#define IFLA_VF_MAX (__IFLA_VF_MAX - 1) + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; /* MAX_ADDR_LEN */ +}; + +struct ifla_vf_broadcast { + __u8 broadcast[32]; +}; + +struct ifla_vf_vlan { + __u32 vf; + __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ + __u32 qos; +}; + +enum { + IFLA_VF_VLAN_INFO_UNSPEC, + IFLA_VF_VLAN_INFO, /* VLAN ID, QoS and VLAN protocol */ + __IFLA_VF_VLAN_INFO_MAX, +}; + +#define IFLA_VF_VLAN_INFO_MAX (__IFLA_VF_VLAN_INFO_MAX - 1) +#define MAX_VLAN_LIST_LEN 1 + +struct ifla_vf_vlan_info { + __u32 vf; + __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ + __u32 qos; + __be16 vlan_proto; /* VLAN protocol either 802.1Q or 802.1ad */ +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ +}; + +struct ifla_vf_rate { + __u32 vf; + __u32 min_tx_rate; /* Min Bandwidth in Mbps */ + __u32 max_tx_rate; /* Max Bandwidth in Mbps */ +}; + +struct ifla_vf_spoofchk { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_guid { + __u32 vf; + __u64 guid; +}; + +enum { + IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ + IFLA_VF_LINK_STATE_ENABLE, /* link always up */ + IFLA_VF_LINK_STATE_DISABLE, /* link always down */ + __IFLA_VF_LINK_STATE_MAX, +}; + +struct ifla_vf_link_state { + __u32 vf; + __u32 link_state; +}; + +struct ifla_vf_rss_query_en { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_STATS_RX_PACKETS, + IFLA_VF_STATS_TX_PACKETS, + IFLA_VF_STATS_RX_BYTES, + IFLA_VF_STATS_TX_BYTES, + IFLA_VF_STATS_BROADCAST, + IFLA_VF_STATS_MULTICAST, + IFLA_VF_STATS_PAD, + IFLA_VF_STATS_RX_DROPPED, + IFLA_VF_STATS_TX_DROPPED, + __IFLA_VF_STATS_MAX, +}; + +#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1) + +struct ifla_vf_trust { + __u32 vf; + __u32 setting; +}; + +/* VF ports management section + * + * Nested layout of set/get msg is: + * + * [IFLA_NUM_VF] + * [IFLA_VF_PORTS] + * [IFLA_VF_PORT] + * [IFLA_PORT_*], ... + * [IFLA_VF_PORT] + * [IFLA_PORT_*], ... + * ... + * [IFLA_PORT_SELF] + * [IFLA_PORT_*], ... + */ + +enum { + IFLA_VF_PORT_UNSPEC, + IFLA_VF_PORT, /* nest */ + __IFLA_VF_PORT_MAX, +}; + +#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1) + +enum { + IFLA_PORT_UNSPEC, + IFLA_PORT_VF, /* __u32 */ + IFLA_PORT_PROFILE, /* string */ + IFLA_PORT_VSI_TYPE, /* 802.1Qbg (pre-)standard VDP */ + IFLA_PORT_INSTANCE_UUID, /* binary UUID */ + IFLA_PORT_HOST_UUID, /* binary UUID */ + IFLA_PORT_REQUEST, /* __u8 */ + IFLA_PORT_RESPONSE, /* __u16, output only */ + __IFLA_PORT_MAX, +}; + +#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1) + +#define PORT_PROFILE_MAX 40 +#define PORT_UUID_MAX 16 +#define PORT_SELF_VF -1 + +enum { + PORT_REQUEST_PREASSOCIATE = 0, + PORT_REQUEST_PREASSOCIATE_RR, + PORT_REQUEST_ASSOCIATE, + PORT_REQUEST_DISASSOCIATE, +}; + +enum { + PORT_VDP_RESPONSE_SUCCESS = 0, + PORT_VDP_RESPONSE_INVALID_FORMAT, + PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES, + PORT_VDP_RESPONSE_UNUSED_VTID, + PORT_VDP_RESPONSE_VTID_VIOLATION, + PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION, + PORT_VDP_RESPONSE_OUT_OF_SYNC, + /* 0x08-0xFF reserved for future VDP use */ + PORT_PROFILE_RESPONSE_SUCCESS = 0x100, + PORT_PROFILE_RESPONSE_INPROGRESS, + PORT_PROFILE_RESPONSE_INVALID, + PORT_PROFILE_RESPONSE_BADSTATE, + PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES, + PORT_PROFILE_RESPONSE_ERROR, +}; + +struct ifla_port_vsi { + __u8 vsi_mgr_id; + __u8 vsi_type_id[3]; + __u8 vsi_type_version; + __u8 pad[3]; +}; + + +/* IPoIB section */ + +enum { + IFLA_IPOIB_UNSPEC, + IFLA_IPOIB_PKEY, + IFLA_IPOIB_MODE, + IFLA_IPOIB_UMCAST, + __IFLA_IPOIB_MAX +}; + +enum { + IPOIB_MODE_DATAGRAM = 0, /* using unreliable datagram QPs */ + IPOIB_MODE_CONNECTED = 1, /* using connected QPs */ +}; + +#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1) + + +/* HSR/PRP section, both uses same interface */ + +/* Different redundancy protocols for hsr device */ +enum { + HSR_PROTOCOL_HSR, + HSR_PROTOCOL_PRP, + HSR_PROTOCOL_MAX, +}; + +enum { + IFLA_HSR_UNSPEC, + IFLA_HSR_SLAVE1, + IFLA_HSR_SLAVE2, + IFLA_HSR_MULTICAST_SPEC, /* Last byte of supervision addr */ + IFLA_HSR_SUPERVISION_ADDR, /* Supervision frame multicast addr */ + IFLA_HSR_SEQ_NR, + IFLA_HSR_VERSION, /* HSR version */ + IFLA_HSR_PROTOCOL, /* Indicate different protocol than + * HSR. For example PRP. + */ + __IFLA_HSR_MAX, +}; + +#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1) + +/* STATS section */ + +struct if_stats_msg { + __u8 family; + __u8 pad1; + __u16 pad2; + __u32 ifindex; + __u32 filter_mask; +}; + +/* A stats attribute can be netdev specific or a global stat. + * For netdev stats, lets use the prefix IFLA_STATS_LINK_* + */ +enum { + IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */ + IFLA_STATS_LINK_64, + IFLA_STATS_LINK_XSTATS, + IFLA_STATS_LINK_XSTATS_SLAVE, + IFLA_STATS_LINK_OFFLOAD_XSTATS, + IFLA_STATS_AF_SPEC, + __IFLA_STATS_MAX, +}; + +#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1) + +#define IFLA_STATS_FILTER_BIT(ATTR) (1 << (ATTR - 1)) + +/* These are embedded into IFLA_STATS_LINK_XSTATS: + * [IFLA_STATS_LINK_XSTATS] + * -> [LINK_XSTATS_TYPE_xxx] + * -> [rtnl link type specific attributes] + */ +enum { + LINK_XSTATS_TYPE_UNSPEC, + LINK_XSTATS_TYPE_BRIDGE, + LINK_XSTATS_TYPE_BOND, + __LINK_XSTATS_TYPE_MAX +}; +#define LINK_XSTATS_TYPE_MAX (__LINK_XSTATS_TYPE_MAX - 1) + +/* These are stats embedded into IFLA_STATS_LINK_OFFLOAD_XSTATS */ +enum { + IFLA_OFFLOAD_XSTATS_UNSPEC, + IFLA_OFFLOAD_XSTATS_CPU_HIT, /* struct rtnl_link_stats64 */ + __IFLA_OFFLOAD_XSTATS_MAX +}; +#define IFLA_OFFLOAD_XSTATS_MAX (__IFLA_OFFLOAD_XSTATS_MAX - 1) + +/* XDP section */ + +#define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) +#define XDP_FLAGS_SKB_MODE (1U << 1) +#define XDP_FLAGS_DRV_MODE (1U << 2) +#define XDP_FLAGS_HW_MODE (1U << 3) +#define XDP_FLAGS_REPLACE (1U << 4) +#define XDP_FLAGS_MODES (XDP_FLAGS_SKB_MODE | \ + XDP_FLAGS_DRV_MODE | \ + XDP_FLAGS_HW_MODE) +#define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST | \ + XDP_FLAGS_MODES | XDP_FLAGS_REPLACE) + +/* These are stored into IFLA_XDP_ATTACHED on dump. */ +enum { + XDP_ATTACHED_NONE = 0, + XDP_ATTACHED_DRV, + XDP_ATTACHED_SKB, + XDP_ATTACHED_HW, + XDP_ATTACHED_MULTI, +}; + +enum { + IFLA_XDP_UNSPEC, + IFLA_XDP_FD, + IFLA_XDP_ATTACHED, + IFLA_XDP_FLAGS, + IFLA_XDP_PROG_ID, + IFLA_XDP_DRV_PROG_ID, + IFLA_XDP_SKB_PROG_ID, + IFLA_XDP_HW_PROG_ID, + IFLA_XDP_EXPECTED_FD, + __IFLA_XDP_MAX, +}; + +#define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1) + +enum { + IFLA_EVENT_NONE, + IFLA_EVENT_REBOOT, /* internal reset / reboot */ + IFLA_EVENT_FEATURES, /* change in offload features */ + IFLA_EVENT_BONDING_FAILOVER, /* change in active slave */ + IFLA_EVENT_NOTIFY_PEERS, /* re-sent grat. arp/ndisc */ + IFLA_EVENT_IGMP_RESEND, /* re-sent IGMP JOIN */ + IFLA_EVENT_BONDING_OPTIONS, /* change in bonding options */ +}; + +/* tun section */ + +enum { + IFLA_TUN_UNSPEC, + IFLA_TUN_OWNER, + IFLA_TUN_GROUP, + IFLA_TUN_TYPE, + IFLA_TUN_PI, + IFLA_TUN_VNET_HDR, + IFLA_TUN_PERSIST, + IFLA_TUN_MULTI_QUEUE, + IFLA_TUN_NUM_QUEUES, + IFLA_TUN_NUM_DISABLED_QUEUES, + __IFLA_TUN_MAX, +}; + +#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1) + +/* rmnet section */ + +#define RMNET_FLAGS_INGRESS_DEAGGREGATION (1U << 0) +#define RMNET_FLAGS_INGRESS_MAP_COMMANDS (1U << 1) +#define RMNET_FLAGS_INGRESS_MAP_CKSUMV4 (1U << 2) +#define RMNET_FLAGS_EGRESS_MAP_CKSUMV4 (1U << 3) +#define RMNET_FLAGS_INGRESS_MAP_CKSUMV5 (1U << 4) +#define RMNET_FLAGS_EGRESS_MAP_CKSUMV5 (1U << 5) + +enum { + IFLA_RMNET_UNSPEC, + IFLA_RMNET_MUX_ID, + IFLA_RMNET_FLAGS, + __IFLA_RMNET_MAX, +}; + +#define IFLA_RMNET_MAX (__IFLA_RMNET_MAX - 1) + +struct ifla_rmnet_flags { + __u32 flags; + __u32 mask; +}; + +/* MCTP section */ + +enum { + IFLA_MCTP_UNSPEC, + IFLA_MCTP_NET, + __IFLA_MCTP_MAX, +}; + +#define IFLA_MCTP_MAX (__IFLA_MCTP_MAX - 1) + +#endif /* _UAPI_LINUX_IF_LINK_H */ diff --git a/bpftool/include/uapi/linux/netlink.h b/bpftool/include/uapi/linux/netlink.h new file mode 100644 index 0000000..0a4d733 --- /dev/null +++ b/bpftool/include/uapi/linux/netlink.h @@ -0,0 +1,252 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__LINUX_NETLINK_H +#define _UAPI__LINUX_NETLINK_H + +#include +#include /* for __kernel_sa_family_t */ +#include + +#define NETLINK_ROUTE 0 /* Routing/device hook */ +#define NETLINK_UNUSED 1 /* Unused number */ +#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ +#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */ +#define NETLINK_SOCK_DIAG 4 /* socket monitoring */ +#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ +#define NETLINK_XFRM 6 /* ipsec */ +#define NETLINK_SELINUX 7 /* SELinux event notifications */ +#define NETLINK_ISCSI 8 /* Open-iSCSI */ +#define NETLINK_AUDIT 9 /* auditing */ +#define NETLINK_FIB_LOOKUP 10 +#define NETLINK_CONNECTOR 11 +#define NETLINK_NETFILTER 12 /* netfilter subsystem */ +#define NETLINK_IP6_FW 13 +#define NETLINK_DNRTMSG 14 /* DECnet routing messages */ +#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ +#define NETLINK_GENERIC 16 +/* leave room for NETLINK_DM (DM Events) */ +#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */ +#define NETLINK_ECRYPTFS 19 +#define NETLINK_RDMA 20 +#define NETLINK_CRYPTO 21 /* Crypto layer */ +#define NETLINK_SMC 22 /* SMC monitoring */ + +#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG + +#define MAX_LINKS 32 + +struct sockaddr_nl { + __kernel_sa_family_t nl_family; /* AF_NETLINK */ + unsigned short nl_pad; /* zero */ + __u32 nl_pid; /* port ID */ + __u32 nl_groups; /* multicast groups mask */ +}; + +struct nlmsghdr { + __u32 nlmsg_len; /* Length of message including header */ + __u16 nlmsg_type; /* Message content */ + __u16 nlmsg_flags; /* Additional flags */ + __u32 nlmsg_seq; /* Sequence number */ + __u32 nlmsg_pid; /* Sending process port ID */ +}; + +/* Flags values */ + +#define NLM_F_REQUEST 0x01 /* It is request message. */ +#define NLM_F_MULTI 0x02 /* Multipart message, terminated by NLMSG_DONE */ +#define NLM_F_ACK 0x04 /* Reply with ack, with zero or error code */ +#define NLM_F_ECHO 0x08 /* Echo this request */ +#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to sequence change */ +#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ + +/* Modifiers to GET request */ +#define NLM_F_ROOT 0x100 /* specify tree root */ +#define NLM_F_MATCH 0x200 /* return all matching */ +#define NLM_F_ATOMIC 0x400 /* atomic GET */ +#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) + +/* Modifiers to NEW request */ +#define NLM_F_REPLACE 0x100 /* Override existing */ +#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */ +#define NLM_F_CREATE 0x400 /* Create, if it does not exist */ +#define NLM_F_APPEND 0x800 /* Add to end of list */ + +/* Modifiers to DELETE request */ +#define NLM_F_NONREC 0x100 /* Do not delete recursively */ + +/* Flags for ACK message */ +#define NLM_F_CAPPED 0x100 /* request was capped */ +#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ + +/* + 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL + 4.4BSD CHANGE NLM_F_REPLACE + + True CHANGE NLM_F_CREATE|NLM_F_REPLACE + Append NLM_F_CREATE + Check NLM_F_EXCL + */ + +#define NLMSG_ALIGNTO 4U +#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) +#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) +#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN) +#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) +#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) +#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ + (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) +#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ + (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ + (nlh)->nlmsg_len <= (len)) +#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) + +#define NLMSG_NOOP 0x1 /* Nothing. */ +#define NLMSG_ERROR 0x2 /* Error */ +#define NLMSG_DONE 0x3 /* End of a dump */ +#define NLMSG_OVERRUN 0x4 /* Data lost */ + +#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ + +struct nlmsgerr { + int error; + struct nlmsghdr msg; + /* + * followed by the message contents unless NETLINK_CAP_ACK was set + * or the ACK indicates success (error == 0) + * message length is aligned with NLMSG_ALIGN() + */ + /* + * followed by TLVs defined in enum nlmsgerr_attrs + * if NETLINK_EXT_ACK was set + */ +}; + +/** + * enum nlmsgerr_attrs - nlmsgerr attributes + * @NLMSGERR_ATTR_UNUSED: unused + * @NLMSGERR_ATTR_MSG: error message string (string) + * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original + * message, counting from the beginning of the header (u32) + * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to + * be used - in the success case - to identify a created + * object or operation or similar (binary) + * @__NLMSGERR_ATTR_MAX: number of attributes + * @NLMSGERR_ATTR_MAX: highest attribute number + */ +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED, + NLMSGERR_ATTR_MSG, + NLMSGERR_ATTR_OFFS, + NLMSGERR_ATTR_COOKIE, + + __NLMSGERR_ATTR_MAX, + NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1 +}; + +#define NETLINK_ADD_MEMBERSHIP 1 +#define NETLINK_DROP_MEMBERSHIP 2 +#define NETLINK_PKTINFO 3 +#define NETLINK_BROADCAST_ERROR 4 +#define NETLINK_NO_ENOBUFS 5 +#ifndef __KERNEL__ +#define NETLINK_RX_RING 6 +#define NETLINK_TX_RING 7 +#endif +#define NETLINK_LISTEN_ALL_NSID 8 +#define NETLINK_LIST_MEMBERSHIPS 9 +#define NETLINK_CAP_ACK 10 +#define NETLINK_EXT_ACK 11 +#define NETLINK_GET_STRICT_CHK 12 + +struct nl_pktinfo { + __u32 group; +}; + +struct nl_mmap_req { + unsigned int nm_block_size; + unsigned int nm_block_nr; + unsigned int nm_frame_size; + unsigned int nm_frame_nr; +}; + +struct nl_mmap_hdr { + unsigned int nm_status; + unsigned int nm_len; + __u32 nm_group; + /* credentials */ + __u32 nm_pid; + __u32 nm_uid; + __u32 nm_gid; +}; + +#ifndef __KERNEL__ +enum nl_mmap_status { + NL_MMAP_STATUS_UNUSED, + NL_MMAP_STATUS_RESERVED, + NL_MMAP_STATUS_VALID, + NL_MMAP_STATUS_COPY, + NL_MMAP_STATUS_SKIP, +}; + +#define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO +#define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) +#define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) +#endif + +#define NET_MAJOR 36 /* Major 36 is reserved for networking */ + +enum { + NETLINK_UNCONNECTED = 0, + NETLINK_CONNECTED, +}; + +/* + * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> + * +---------------------+- - -+- - - - - - - - - -+- - -+ + * | Header | Pad | Payload | Pad | + * | (struct nlattr) | ing | | ing | + * +---------------------+- - -+- - - - - - - - - -+- - -+ + * <-------------- nlattr->nla_len --------------> + */ + +struct nlattr { + __u16 nla_len; + __u16 nla_type; +}; + +/* + * nla_type (16 bits) + * +---+---+-------------------------------+ + * | N | O | Attribute Type | + * +---+---+-------------------------------+ + * N := Carries nested attributes + * O := Payload stored in network byte order + * + * Note: The N and O flag are mutually exclusive. + */ +#define NLA_F_NESTED (1 << 15) +#define NLA_F_NET_BYTEORDER (1 << 14) +#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) + +#define NLA_ALIGNTO 4 +#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) +#define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) + +/* Generic 32 bitflags attribute content sent to the kernel. + * + * The value is a bitmap that defines the values being set + * The selector is a bitmask that defines which value is legit + * + * Examples: + * value = 0x0, and selector = 0x1 + * implies we are selecting bit 1 and we want to set its value to 0. + * + * value = 0x2, and selector = 0x2 + * implies we are selecting bit 2 and we want to set its value to 1. + * + */ +struct nla_bitfield32 { + __u32 value; + __u32 selector; +}; + +#endif /* _UAPI__LINUX_NETLINK_H */ diff --git a/bpftool/include/uapi/linux/perf_event.h b/bpftool/include/uapi/linux/perf_event.h new file mode 100644 index 0000000..ccb7f5d --- /dev/null +++ b/bpftool/include/uapi/linux/perf_event.h @@ -0,0 +1,1445 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Performance events: + * + * Copyright (C) 2008-2009, Thomas Gleixner + * Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar + * Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra + * + * Data type definitions, declarations, prototypes. + * + * Started by: Thomas Gleixner and Ingo Molnar + * + * For licencing details see kernel-base/COPYING + */ +#ifndef _UAPI_LINUX_PERF_EVENT_H +#define _UAPI_LINUX_PERF_EVENT_H + +#include +#include +#include + +/* + * User-space ABI bits: + */ + +/* + * attr.type + */ +enum perf_type_id { + PERF_TYPE_HARDWARE = 0, + PERF_TYPE_SOFTWARE = 1, + PERF_TYPE_TRACEPOINT = 2, + PERF_TYPE_HW_CACHE = 3, + PERF_TYPE_RAW = 4, + PERF_TYPE_BREAKPOINT = 5, + + PERF_TYPE_MAX, /* non-ABI */ +}; + +/* + * attr.config layout for type PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE + * PERF_TYPE_HARDWARE: 0xEEEEEEEE000000AA + * AA: hardware event ID + * EEEEEEEE: PMU type ID + * PERF_TYPE_HW_CACHE: 0xEEEEEEEE00DDCCBB + * BB: hardware cache ID + * CC: hardware cache op ID + * DD: hardware cache op result ID + * EEEEEEEE: PMU type ID + * If the PMU type ID is 0, the PERF_TYPE_RAW will be applied. + */ +#define PERF_PMU_TYPE_SHIFT 32 +#define PERF_HW_EVENT_MASK 0xffffffff + +/* + * Generalized performance event event_id types, used by the + * attr.event_id parameter of the sys_perf_event_open() + * syscall: + */ +enum perf_hw_id { + /* + * Common hardware events, generalized by the kernel: + */ + PERF_COUNT_HW_CPU_CYCLES = 0, + PERF_COUNT_HW_INSTRUCTIONS = 1, + PERF_COUNT_HW_CACHE_REFERENCES = 2, + PERF_COUNT_HW_CACHE_MISSES = 3, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, + PERF_COUNT_HW_BRANCH_MISSES = 5, + PERF_COUNT_HW_BUS_CYCLES = 6, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, + PERF_COUNT_HW_REF_CPU_CYCLES = 9, + + PERF_COUNT_HW_MAX, /* non-ABI */ +}; + +/* + * Generalized hardware cache events: + * + * { L1-D, L1-I, LLC, ITLB, DTLB, BPU, NODE } x + * { read, write, prefetch } x + * { accesses, misses } + */ +enum perf_hw_cache_id { + PERF_COUNT_HW_CACHE_L1D = 0, + PERF_COUNT_HW_CACHE_L1I = 1, + PERF_COUNT_HW_CACHE_LL = 2, + PERF_COUNT_HW_CACHE_DTLB = 3, + PERF_COUNT_HW_CACHE_ITLB = 4, + PERF_COUNT_HW_CACHE_BPU = 5, + PERF_COUNT_HW_CACHE_NODE = 6, + + PERF_COUNT_HW_CACHE_MAX, /* non-ABI */ +}; + +enum perf_hw_cache_op_id { + PERF_COUNT_HW_CACHE_OP_READ = 0, + PERF_COUNT_HW_CACHE_OP_WRITE = 1, + PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, + + PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */ +}; + +enum perf_hw_cache_op_result_id { + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, + PERF_COUNT_HW_CACHE_RESULT_MISS = 1, + + PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */ +}; + +/* + * Special "software" events provided by the kernel, even if the hardware + * does not support performance events. These events measure various + * physical and sw events of the kernel (and allow the profiling of them as + * well): + */ +enum perf_sw_ids { + PERF_COUNT_SW_CPU_CLOCK = 0, + PERF_COUNT_SW_TASK_CLOCK = 1, + PERF_COUNT_SW_PAGE_FAULTS = 2, + PERF_COUNT_SW_CONTEXT_SWITCHES = 3, + PERF_COUNT_SW_CPU_MIGRATIONS = 4, + PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, + PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, + PERF_COUNT_SW_EMULATION_FAULTS = 8, + PERF_COUNT_SW_DUMMY = 9, + PERF_COUNT_SW_BPF_OUTPUT = 10, + PERF_COUNT_SW_CGROUP_SWITCHES = 11, + + PERF_COUNT_SW_MAX, /* non-ABI */ +}; + +/* + * Bits that can be set in attr.sample_type to request information + * in the overflow packets. + */ +enum perf_event_sample_format { + PERF_SAMPLE_IP = 1U << 0, + PERF_SAMPLE_TID = 1U << 1, + PERF_SAMPLE_TIME = 1U << 2, + PERF_SAMPLE_ADDR = 1U << 3, + PERF_SAMPLE_READ = 1U << 4, + PERF_SAMPLE_CALLCHAIN = 1U << 5, + PERF_SAMPLE_ID = 1U << 6, + PERF_SAMPLE_CPU = 1U << 7, + PERF_SAMPLE_PERIOD = 1U << 8, + PERF_SAMPLE_STREAM_ID = 1U << 9, + PERF_SAMPLE_RAW = 1U << 10, + PERF_SAMPLE_BRANCH_STACK = 1U << 11, + PERF_SAMPLE_REGS_USER = 1U << 12, + PERF_SAMPLE_STACK_USER = 1U << 13, + PERF_SAMPLE_WEIGHT = 1U << 14, + PERF_SAMPLE_DATA_SRC = 1U << 15, + PERF_SAMPLE_IDENTIFIER = 1U << 16, + PERF_SAMPLE_TRANSACTION = 1U << 17, + PERF_SAMPLE_REGS_INTR = 1U << 18, + PERF_SAMPLE_PHYS_ADDR = 1U << 19, + PERF_SAMPLE_AUX = 1U << 20, + PERF_SAMPLE_CGROUP = 1U << 21, + PERF_SAMPLE_DATA_PAGE_SIZE = 1U << 22, + PERF_SAMPLE_CODE_PAGE_SIZE = 1U << 23, + PERF_SAMPLE_WEIGHT_STRUCT = 1U << 24, + + PERF_SAMPLE_MAX = 1U << 25, /* non-ABI */ +}; + +#define PERF_SAMPLE_WEIGHT_TYPE (PERF_SAMPLE_WEIGHT | PERF_SAMPLE_WEIGHT_STRUCT) +/* + * values to program into branch_sample_type when PERF_SAMPLE_BRANCH is set + * + * If the user does not pass priv level information via branch_sample_type, + * the kernel uses the event's priv level. Branch and event priv levels do + * not have to match. Branch priv level is checked for permissions. + * + * The branch types can be combined, however BRANCH_ANY covers all types + * of branches and therefore it supersedes all the other types. + */ +enum perf_branch_sample_type_shift { + PERF_SAMPLE_BRANCH_USER_SHIFT = 0, /* user branches */ + PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, /* kernel branches */ + PERF_SAMPLE_BRANCH_HV_SHIFT = 2, /* hypervisor branches */ + + PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, /* any branch types */ + PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, /* any call branch */ + PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, /* any return branch */ + PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, /* indirect calls */ + PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, /* transaction aborts */ + PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, /* in transaction */ + PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, /* not in transaction */ + PERF_SAMPLE_BRANCH_COND_SHIFT = 10, /* conditional branches */ + + PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, /* call/ret stack */ + PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, /* indirect jumps */ + PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, /* direct call */ + + PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, /* no flags */ + PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, /* no cycles */ + + PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, /* save branch type */ + + PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, /* save low level index of raw branch records */ + + PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18, /* save privilege mode */ + + PERF_SAMPLE_BRANCH_MAX_SHIFT /* non-ABI */ +}; + +enum perf_branch_sample_type { + PERF_SAMPLE_BRANCH_USER = 1U << PERF_SAMPLE_BRANCH_USER_SHIFT, + PERF_SAMPLE_BRANCH_KERNEL = 1U << PERF_SAMPLE_BRANCH_KERNEL_SHIFT, + PERF_SAMPLE_BRANCH_HV = 1U << PERF_SAMPLE_BRANCH_HV_SHIFT, + + PERF_SAMPLE_BRANCH_ANY = 1U << PERF_SAMPLE_BRANCH_ANY_SHIFT, + PERF_SAMPLE_BRANCH_ANY_CALL = 1U << PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT, + PERF_SAMPLE_BRANCH_ANY_RETURN = 1U << PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT, + PERF_SAMPLE_BRANCH_IND_CALL = 1U << PERF_SAMPLE_BRANCH_IND_CALL_SHIFT, + PERF_SAMPLE_BRANCH_ABORT_TX = 1U << PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT, + PERF_SAMPLE_BRANCH_IN_TX = 1U << PERF_SAMPLE_BRANCH_IN_TX_SHIFT, + PERF_SAMPLE_BRANCH_NO_TX = 1U << PERF_SAMPLE_BRANCH_NO_TX_SHIFT, + PERF_SAMPLE_BRANCH_COND = 1U << PERF_SAMPLE_BRANCH_COND_SHIFT, + + PERF_SAMPLE_BRANCH_CALL_STACK = 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT, + PERF_SAMPLE_BRANCH_IND_JUMP = 1U << PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT, + PERF_SAMPLE_BRANCH_CALL = 1U << PERF_SAMPLE_BRANCH_CALL_SHIFT, + + PERF_SAMPLE_BRANCH_NO_FLAGS = 1U << PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT, + PERF_SAMPLE_BRANCH_NO_CYCLES = 1U << PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT, + + PERF_SAMPLE_BRANCH_TYPE_SAVE = + 1U << PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT, + + PERF_SAMPLE_BRANCH_HW_INDEX = 1U << PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT, + + PERF_SAMPLE_BRANCH_PRIV_SAVE = 1U << PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT, + + PERF_SAMPLE_BRANCH_MAX = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT, +}; + +/* + * Common flow change classification + */ +enum { + PERF_BR_UNKNOWN = 0, /* unknown */ + PERF_BR_COND = 1, /* conditional */ + PERF_BR_UNCOND = 2, /* unconditional */ + PERF_BR_IND = 3, /* indirect */ + PERF_BR_CALL = 4, /* function call */ + PERF_BR_IND_CALL = 5, /* indirect function call */ + PERF_BR_RET = 6, /* function return */ + PERF_BR_SYSCALL = 7, /* syscall */ + PERF_BR_SYSRET = 8, /* syscall return */ + PERF_BR_COND_CALL = 9, /* conditional function call */ + PERF_BR_COND_RET = 10, /* conditional function return */ + PERF_BR_ERET = 11, /* exception return */ + PERF_BR_IRQ = 12, /* irq */ + PERF_BR_SERROR = 13, /* system error */ + PERF_BR_NO_TX = 14, /* not in transaction */ + PERF_BR_EXTEND_ABI = 15, /* extend ABI */ + PERF_BR_MAX, +}; + +/* + * Common branch speculation outcome classification + */ +enum { + PERF_BR_SPEC_NA = 0, /* Not available */ + PERF_BR_SPEC_WRONG_PATH = 1, /* Speculative but on wrong path */ + PERF_BR_NON_SPEC_CORRECT_PATH = 2, /* Non-speculative but on correct path */ + PERF_BR_SPEC_CORRECT_PATH = 3, /* Speculative and on correct path */ + PERF_BR_SPEC_MAX, +}; + +enum { + PERF_BR_NEW_FAULT_ALGN = 0, /* Alignment fault */ + PERF_BR_NEW_FAULT_DATA = 1, /* Data fault */ + PERF_BR_NEW_FAULT_INST = 2, /* Inst fault */ + PERF_BR_NEW_ARCH_1 = 3, /* Architecture specific */ + PERF_BR_NEW_ARCH_2 = 4, /* Architecture specific */ + PERF_BR_NEW_ARCH_3 = 5, /* Architecture specific */ + PERF_BR_NEW_ARCH_4 = 6, /* Architecture specific */ + PERF_BR_NEW_ARCH_5 = 7, /* Architecture specific */ + PERF_BR_NEW_MAX, +}; + +enum { + PERF_BR_PRIV_UNKNOWN = 0, + PERF_BR_PRIV_USER = 1, + PERF_BR_PRIV_KERNEL = 2, + PERF_BR_PRIV_HV = 3, +}; + +#define PERF_BR_ARM64_FIQ PERF_BR_NEW_ARCH_1 +#define PERF_BR_ARM64_DEBUG_HALT PERF_BR_NEW_ARCH_2 +#define PERF_BR_ARM64_DEBUG_EXIT PERF_BR_NEW_ARCH_3 +#define PERF_BR_ARM64_DEBUG_INST PERF_BR_NEW_ARCH_4 +#define PERF_BR_ARM64_DEBUG_DATA PERF_BR_NEW_ARCH_5 + +#define PERF_SAMPLE_BRANCH_PLM_ALL \ + (PERF_SAMPLE_BRANCH_USER|\ + PERF_SAMPLE_BRANCH_KERNEL|\ + PERF_SAMPLE_BRANCH_HV) + +/* + * Values to determine ABI of the registers dump. + */ +enum perf_sample_regs_abi { + PERF_SAMPLE_REGS_ABI_NONE = 0, + PERF_SAMPLE_REGS_ABI_32 = 1, + PERF_SAMPLE_REGS_ABI_64 = 2, +}; + +/* + * Values for the memory transaction event qualifier, mostly for + * abort events. Multiple bits can be set. + */ +enum { + PERF_TXN_ELISION = (1 << 0), /* From elision */ + PERF_TXN_TRANSACTION = (1 << 1), /* From transaction */ + PERF_TXN_SYNC = (1 << 2), /* Instruction is related */ + PERF_TXN_ASYNC = (1 << 3), /* Instruction not related */ + PERF_TXN_RETRY = (1 << 4), /* Retry possible */ + PERF_TXN_CONFLICT = (1 << 5), /* Conflict abort */ + PERF_TXN_CAPACITY_WRITE = (1 << 6), /* Capacity write abort */ + PERF_TXN_CAPACITY_READ = (1 << 7), /* Capacity read abort */ + + PERF_TXN_MAX = (1 << 8), /* non-ABI */ + + /* bits 32..63 are reserved for the abort code */ + + PERF_TXN_ABORT_MASK = (0xffffffffULL << 32), + PERF_TXN_ABORT_SHIFT = 32, +}; + +/* + * The format of the data returned by read() on a perf event fd, + * as specified by attr.read_format: + * + * struct read_format { + * { u64 value; + * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED + * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING + * { u64 id; } && PERF_FORMAT_ID + * { u64 lost; } && PERF_FORMAT_LOST + * } && !PERF_FORMAT_GROUP + * + * { u64 nr; + * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED + * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING + * { u64 value; + * { u64 id; } && PERF_FORMAT_ID + * { u64 lost; } && PERF_FORMAT_LOST + * } cntr[nr]; + * } && PERF_FORMAT_GROUP + * }; + */ +enum perf_event_read_format { + PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0, + PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1, + PERF_FORMAT_ID = 1U << 2, + PERF_FORMAT_GROUP = 1U << 3, + PERF_FORMAT_LOST = 1U << 4, + + PERF_FORMAT_MAX = 1U << 5, /* non-ABI */ +}; + +#define PERF_ATTR_SIZE_VER0 64 /* sizeof first published struct */ +#define PERF_ATTR_SIZE_VER1 72 /* add: config2 */ +#define PERF_ATTR_SIZE_VER2 80 /* add: branch_sample_type */ +#define PERF_ATTR_SIZE_VER3 96 /* add: sample_regs_user */ + /* add: sample_stack_user */ +#define PERF_ATTR_SIZE_VER4 104 /* add: sample_regs_intr */ +#define PERF_ATTR_SIZE_VER5 112 /* add: aux_watermark */ +#define PERF_ATTR_SIZE_VER6 120 /* add: aux_sample_size */ +#define PERF_ATTR_SIZE_VER7 128 /* add: sig_data */ + +/* + * Hardware event_id to monitor via a performance monitoring event: + * + * @sample_max_stack: Max number of frame pointers in a callchain, + * should be < /proc/sys/kernel/perf_event_max_stack + */ +struct perf_event_attr { + + /* + * Major type: hardware/software/tracepoint/etc. + */ + __u32 type; + + /* + * Size of the attr structure, for fwd/bwd compat. + */ + __u32 size; + + /* + * Type specific configuration information. + */ + __u64 config; + + union { + __u64 sample_period; + __u64 sample_freq; + }; + + __u64 sample_type; + __u64 read_format; + + __u64 disabled : 1, /* off by default */ + inherit : 1, /* children inherit it */ + pinned : 1, /* must always be on PMU */ + exclusive : 1, /* only group on PMU */ + exclude_user : 1, /* don't count user */ + exclude_kernel : 1, /* ditto kernel */ + exclude_hv : 1, /* ditto hypervisor */ + exclude_idle : 1, /* don't count when idle */ + mmap : 1, /* include mmap data */ + comm : 1, /* include comm data */ + freq : 1, /* use freq, not period */ + inherit_stat : 1, /* per task counts */ + enable_on_exec : 1, /* next exec enables */ + task : 1, /* trace fork/exit */ + watermark : 1, /* wakeup_watermark */ + /* + * precise_ip: + * + * 0 - SAMPLE_IP can have arbitrary skid + * 1 - SAMPLE_IP must have constant skid + * 2 - SAMPLE_IP requested to have 0 skid + * 3 - SAMPLE_IP must have 0 skid + * + * See also PERF_RECORD_MISC_EXACT_IP + */ + precise_ip : 2, /* skid constraint */ + mmap_data : 1, /* non-exec mmap data */ + sample_id_all : 1, /* sample_type all events */ + + exclude_host : 1, /* don't count in host */ + exclude_guest : 1, /* don't count in guest */ + + exclude_callchain_kernel : 1, /* exclude kernel callchains */ + exclude_callchain_user : 1, /* exclude user callchains */ + mmap2 : 1, /* include mmap with inode data */ + comm_exec : 1, /* flag comm events that are due to an exec */ + use_clockid : 1, /* use @clockid for time fields */ + context_switch : 1, /* context switch data */ + write_backward : 1, /* Write ring buffer from end to beginning */ + namespaces : 1, /* include namespaces data */ + ksymbol : 1, /* include ksymbol events */ + bpf_event : 1, /* include bpf events */ + aux_output : 1, /* generate AUX records instead of events */ + cgroup : 1, /* include cgroup events */ + text_poke : 1, /* include text poke events */ + build_id : 1, /* use build id in mmap2 events */ + inherit_thread : 1, /* children only inherit if cloned with CLONE_THREAD */ + remove_on_exec : 1, /* event is removed from task on exec */ + sigtrap : 1, /* send synchronous SIGTRAP on event */ + __reserved_1 : 26; + + union { + __u32 wakeup_events; /* wakeup every n events */ + __u32 wakeup_watermark; /* bytes before wakeup */ + }; + + __u32 bp_type; + union { + __u64 bp_addr; + __u64 kprobe_func; /* for perf_kprobe */ + __u64 uprobe_path; /* for perf_uprobe */ + __u64 config1; /* extension of config */ + }; + union { + __u64 bp_len; + __u64 kprobe_addr; /* when kprobe_func == NULL */ + __u64 probe_offset; /* for perf_[k,u]probe */ + __u64 config2; /* extension of config1 */ + }; + __u64 branch_sample_type; /* enum perf_branch_sample_type */ + + /* + * Defines set of user regs to dump on samples. + * See asm/perf_regs.h for details. + */ + __u64 sample_regs_user; + + /* + * Defines size of the user stack to dump on samples. + */ + __u32 sample_stack_user; + + __s32 clockid; + /* + * Defines set of regs to dump for each sample + * state captured on: + * - precise = 0: PMU interrupt + * - precise > 0: sampled instruction + * + * See asm/perf_regs.h for details. + */ + __u64 sample_regs_intr; + + /* + * Wakeup watermark for AUX area + */ + __u32 aux_watermark; + __u16 sample_max_stack; + __u16 __reserved_2; + __u32 aux_sample_size; + __u32 __reserved_3; + + /* + * User provided data if sigtrap=1, passed back to user via + * siginfo_t::si_perf_data, e.g. to permit user to identify the event. + * Note, siginfo_t::si_perf_data is long-sized, and sig_data will be + * truncated accordingly on 32 bit architectures. + */ + __u64 sig_data; +}; + +/* + * Structure used by below PERF_EVENT_IOC_QUERY_BPF command + * to query bpf programs attached to the same perf tracepoint + * as the given perf event. + */ +struct perf_event_query_bpf { + /* + * The below ids array length + */ + __u32 ids_len; + /* + * Set by the kernel to indicate the number of + * available programs + */ + __u32 prog_cnt; + /* + * User provided buffer to store program ids + */ + __u32 ids[]; +}; + +/* + * Ioctls that can be done on a perf event fd: + */ +#define PERF_EVENT_IOC_ENABLE _IO ('$', 0) +#define PERF_EVENT_IOC_DISABLE _IO ('$', 1) +#define PERF_EVENT_IOC_REFRESH _IO ('$', 2) +#define PERF_EVENT_IOC_RESET _IO ('$', 3) +#define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64) +#define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5) +#define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) +#define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) +#define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32) +#define PERF_EVENT_IOC_PAUSE_OUTPUT _IOW('$', 9, __u32) +#define PERF_EVENT_IOC_QUERY_BPF _IOWR('$', 10, struct perf_event_query_bpf *) +#define PERF_EVENT_IOC_MODIFY_ATTRIBUTES _IOW('$', 11, struct perf_event_attr *) + +enum perf_event_ioc_flags { + PERF_IOC_FLAG_GROUP = 1U << 0, +}; + +/* + * Structure of the page that can be mapped via mmap + */ +struct perf_event_mmap_page { + __u32 version; /* version number of this structure */ + __u32 compat_version; /* lowest version this is compat with */ + + /* + * Bits needed to read the hw events in user-space. + * + * u32 seq, time_mult, time_shift, index, width; + * u64 count, enabled, running; + * u64 cyc, time_offset; + * s64 pmc = 0; + * + * do { + * seq = pc->lock; + * barrier() + * + * enabled = pc->time_enabled; + * running = pc->time_running; + * + * if (pc->cap_usr_time && enabled != running) { + * cyc = rdtsc(); + * time_offset = pc->time_offset; + * time_mult = pc->time_mult; + * time_shift = pc->time_shift; + * } + * + * index = pc->index; + * count = pc->offset; + * if (pc->cap_user_rdpmc && index) { + * width = pc->pmc_width; + * pmc = rdpmc(index - 1); + * } + * + * barrier(); + * } while (pc->lock != seq); + * + * NOTE: for obvious reason this only works on self-monitoring + * processes. + */ + __u32 lock; /* seqlock for synchronization */ + __u32 index; /* hardware event identifier */ + __s64 offset; /* add to hardware event value */ + __u64 time_enabled; /* time event active */ + __u64 time_running; /* time event on cpu */ + union { + __u64 capabilities; + struct { + __u64 cap_bit0 : 1, /* Always 0, deprecated, see commit 860f085b74e9 */ + cap_bit0_is_deprecated : 1, /* Always 1, signals that bit 0 is zero */ + + cap_user_rdpmc : 1, /* The RDPMC instruction can be used to read counts */ + cap_user_time : 1, /* The time_{shift,mult,offset} fields are used */ + cap_user_time_zero : 1, /* The time_zero field is used */ + cap_user_time_short : 1, /* the time_{cycle,mask} fields are used */ + cap_____res : 58; + }; + }; + + /* + * If cap_user_rdpmc this field provides the bit-width of the value + * read using the rdpmc() or equivalent instruction. This can be used + * to sign extend the result like: + * + * pmc <<= 64 - width; + * pmc >>= 64 - width; // signed shift right + * count += pmc; + */ + __u16 pmc_width; + + /* + * If cap_usr_time the below fields can be used to compute the time + * delta since time_enabled (in ns) using rdtsc or similar. + * + * u64 quot, rem; + * u64 delta; + * + * quot = (cyc >> time_shift); + * rem = cyc & (((u64)1 << time_shift) - 1); + * delta = time_offset + quot * time_mult + + * ((rem * time_mult) >> time_shift); + * + * Where time_offset,time_mult,time_shift and cyc are read in the + * seqcount loop described above. This delta can then be added to + * enabled and possible running (if index), improving the scaling: + * + * enabled += delta; + * if (index) + * running += delta; + * + * quot = count / running; + * rem = count % running; + * count = quot * enabled + (rem * enabled) / running; + */ + __u16 time_shift; + __u32 time_mult; + __u64 time_offset; + /* + * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated + * from sample timestamps. + * + * time = timestamp - time_zero; + * quot = time / time_mult; + * rem = time % time_mult; + * cyc = (quot << time_shift) + (rem << time_shift) / time_mult; + * + * And vice versa: + * + * quot = cyc >> time_shift; + * rem = cyc & (((u64)1 << time_shift) - 1); + * timestamp = time_zero + quot * time_mult + + * ((rem * time_mult) >> time_shift); + */ + __u64 time_zero; + + __u32 size; /* Header size up to __reserved[] fields. */ + __u32 __reserved_1; + + /* + * If cap_usr_time_short, the hardware clock is less than 64bit wide + * and we must compute the 'cyc' value, as used by cap_usr_time, as: + * + * cyc = time_cycles + ((cyc - time_cycles) & time_mask) + * + * NOTE: this form is explicitly chosen such that cap_usr_time_short + * is a correction on top of cap_usr_time, and code that doesn't + * know about cap_usr_time_short still works under the assumption + * the counter doesn't wrap. + */ + __u64 time_cycles; + __u64 time_mask; + + /* + * Hole for extension of the self monitor capabilities + */ + + __u8 __reserved[116*8]; /* align to 1k. */ + + /* + * Control data for the mmap() data buffer. + * + * User-space reading the @data_head value should issue an smp_rmb(), + * after reading this value. + * + * When the mapping is PROT_WRITE the @data_tail value should be + * written by userspace to reflect the last read data, after issueing + * an smp_mb() to separate the data read from the ->data_tail store. + * In this case the kernel will not over-write unread data. + * + * See perf_output_put_handle() for the data ordering. + * + * data_{offset,size} indicate the location and size of the perf record + * buffer within the mmapped area. + */ + __u64 data_head; /* head in the data section */ + __u64 data_tail; /* user-space written tail */ + __u64 data_offset; /* where the buffer starts */ + __u64 data_size; /* data buffer size */ + + /* + * AUX area is defined by aux_{offset,size} fields that should be set + * by the userspace, so that + * + * aux_offset >= data_offset + data_size + * + * prior to mmap()ing it. Size of the mmap()ed area should be aux_size. + * + * Ring buffer pointers aux_{head,tail} have the same semantics as + * data_{head,tail} and same ordering rules apply. + */ + __u64 aux_head; + __u64 aux_tail; + __u64 aux_offset; + __u64 aux_size; +}; + +/* + * The current state of perf_event_header::misc bits usage: + * ('|' used bit, '-' unused bit) + * + * 012 CDEF + * |||---------|||| + * + * Where: + * 0-2 CPUMODE_MASK + * + * C PROC_MAP_PARSE_TIMEOUT + * D MMAP_DATA / COMM_EXEC / FORK_EXEC / SWITCH_OUT + * E MMAP_BUILD_ID / EXACT_IP / SCHED_OUT_PREEMPT + * F (reserved) + */ + +#define PERF_RECORD_MISC_CPUMODE_MASK (7 << 0) +#define PERF_RECORD_MISC_CPUMODE_UNKNOWN (0 << 0) +#define PERF_RECORD_MISC_KERNEL (1 << 0) +#define PERF_RECORD_MISC_USER (2 << 0) +#define PERF_RECORD_MISC_HYPERVISOR (3 << 0) +#define PERF_RECORD_MISC_GUEST_KERNEL (4 << 0) +#define PERF_RECORD_MISC_GUEST_USER (5 << 0) + +/* + * Indicates that /proc/PID/maps parsing are truncated by time out. + */ +#define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT (1 << 12) +/* + * Following PERF_RECORD_MISC_* are used on different + * events, so can reuse the same bit position: + * + * PERF_RECORD_MISC_MMAP_DATA - PERF_RECORD_MMAP* events + * PERF_RECORD_MISC_COMM_EXEC - PERF_RECORD_COMM event + * PERF_RECORD_MISC_FORK_EXEC - PERF_RECORD_FORK event (perf internal) + * PERF_RECORD_MISC_SWITCH_OUT - PERF_RECORD_SWITCH* events + */ +#define PERF_RECORD_MISC_MMAP_DATA (1 << 13) +#define PERF_RECORD_MISC_COMM_EXEC (1 << 13) +#define PERF_RECORD_MISC_FORK_EXEC (1 << 13) +#define PERF_RECORD_MISC_SWITCH_OUT (1 << 13) +/* + * These PERF_RECORD_MISC_* flags below are safely reused + * for the following events: + * + * PERF_RECORD_MISC_EXACT_IP - PERF_RECORD_SAMPLE of precise events + * PERF_RECORD_MISC_SWITCH_OUT_PREEMPT - PERF_RECORD_SWITCH* events + * PERF_RECORD_MISC_MMAP_BUILD_ID - PERF_RECORD_MMAP2 event + * + * + * PERF_RECORD_MISC_EXACT_IP: + * Indicates that the content of PERF_SAMPLE_IP points to + * the actual instruction that triggered the event. See also + * perf_event_attr::precise_ip. + * + * PERF_RECORD_MISC_SWITCH_OUT_PREEMPT: + * Indicates that thread was preempted in TASK_RUNNING state. + * + * PERF_RECORD_MISC_MMAP_BUILD_ID: + * Indicates that mmap2 event carries build id data. + */ +#define PERF_RECORD_MISC_EXACT_IP (1 << 14) +#define PERF_RECORD_MISC_SWITCH_OUT_PREEMPT (1 << 14) +#define PERF_RECORD_MISC_MMAP_BUILD_ID (1 << 14) +/* + * Reserve the last bit to indicate some extended misc field + */ +#define PERF_RECORD_MISC_EXT_RESERVED (1 << 15) + +struct perf_event_header { + __u32 type; + __u16 misc; + __u16 size; +}; + +struct perf_ns_link_info { + __u64 dev; + __u64 ino; +}; + +enum { + NET_NS_INDEX = 0, + UTS_NS_INDEX = 1, + IPC_NS_INDEX = 2, + PID_NS_INDEX = 3, + USER_NS_INDEX = 4, + MNT_NS_INDEX = 5, + CGROUP_NS_INDEX = 6, + + NR_NAMESPACES, /* number of available namespaces */ +}; + +enum perf_event_type { + + /* + * If perf_event_attr.sample_id_all is set then all event types will + * have the sample_type selected fields related to where/when + * (identity) an event took place (TID, TIME, ID, STREAM_ID, CPU, + * IDENTIFIER) described in PERF_RECORD_SAMPLE below, it will be stashed + * just after the perf_event_header and the fields already present for + * the existing fields, i.e. at the end of the payload. That way a newer + * perf.data file will be supported by older perf tools, with these new + * optional fields being ignored. + * + * struct sample_id { + * { u32 pid, tid; } && PERF_SAMPLE_TID + * { u64 time; } && PERF_SAMPLE_TIME + * { u64 id; } && PERF_SAMPLE_ID + * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID + * { u32 cpu, res; } && PERF_SAMPLE_CPU + * { u64 id; } && PERF_SAMPLE_IDENTIFIER + * } && perf_event_attr::sample_id_all + * + * Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. The + * advantage of PERF_SAMPLE_IDENTIFIER is that its position is fixed + * relative to header.size. + */ + + /* + * The MMAP events record the PROT_EXEC mappings so that we can + * correlate userspace IPs to code. They have the following structure: + * + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * u64 addr; + * u64 len; + * u64 pgoff; + * char filename[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_MMAP = 1, + + /* + * struct { + * struct perf_event_header header; + * u64 id; + * u64 lost; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_LOST = 2, + + /* + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * char comm[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_COMM = 3, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, ppid; + * u32 tid, ptid; + * u64 time; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_EXIT = 4, + + /* + * struct { + * struct perf_event_header header; + * u64 time; + * u64 id; + * u64 stream_id; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_THROTTLE = 5, + PERF_RECORD_UNTHROTTLE = 6, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, ppid; + * u32 tid, ptid; + * u64 time; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_FORK = 7, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, tid; + * + * struct read_format values; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_READ = 8, + + /* + * struct { + * struct perf_event_header header; + * + * # + * # Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. + * # The advantage of PERF_SAMPLE_IDENTIFIER is that its position + * # is fixed relative to header. + * # + * + * { u64 id; } && PERF_SAMPLE_IDENTIFIER + * { u64 ip; } && PERF_SAMPLE_IP + * { u32 pid, tid; } && PERF_SAMPLE_TID + * { u64 time; } && PERF_SAMPLE_TIME + * { u64 addr; } && PERF_SAMPLE_ADDR + * { u64 id; } && PERF_SAMPLE_ID + * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID + * { u32 cpu, res; } && PERF_SAMPLE_CPU + * { u64 period; } && PERF_SAMPLE_PERIOD + * + * { struct read_format values; } && PERF_SAMPLE_READ + * + * { u64 nr, + * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN + * + * # + * # The RAW record below is opaque data wrt the ABI + * # + * # That is, the ABI doesn't make any promises wrt to + * # the stability of its content, it may vary depending + * # on event, hardware, kernel version and phase of + * # the moon. + * # + * # In other words, PERF_SAMPLE_RAW contents are not an ABI. + * # + * + * { u32 size; + * char data[size];}&& PERF_SAMPLE_RAW + * + * { u64 nr; + * { u64 hw_idx; } && PERF_SAMPLE_BRANCH_HW_INDEX + * { u64 from, to, flags } lbr[nr]; + * } && PERF_SAMPLE_BRANCH_STACK + * + * { u64 abi; # enum perf_sample_regs_abi + * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER + * + * { u64 size; + * char data[size]; + * u64 dyn_size; } && PERF_SAMPLE_STACK_USER + * + * { union perf_sample_weight + * { + * u64 full; && PERF_SAMPLE_WEIGHT + * #if defined(__LITTLE_ENDIAN_BITFIELD) + * struct { + * u32 var1_dw; + * u16 var2_w; + * u16 var3_w; + * } && PERF_SAMPLE_WEIGHT_STRUCT + * #elif defined(__BIG_ENDIAN_BITFIELD) + * struct { + * u16 var3_w; + * u16 var2_w; + * u32 var1_dw; + * } && PERF_SAMPLE_WEIGHT_STRUCT + * #endif + * } + * } + * { u64 data_src; } && PERF_SAMPLE_DATA_SRC + * { u64 transaction; } && PERF_SAMPLE_TRANSACTION + * { u64 abi; # enum perf_sample_regs_abi + * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR + * { u64 phys_addr;} && PERF_SAMPLE_PHYS_ADDR + * { u64 size; + * char data[size]; } && PERF_SAMPLE_AUX + * { u64 data_page_size;} && PERF_SAMPLE_DATA_PAGE_SIZE + * { u64 code_page_size;} && PERF_SAMPLE_CODE_PAGE_SIZE + * }; + */ + PERF_RECORD_SAMPLE = 9, + + /* + * The MMAP2 records are an augmented version of MMAP, they add + * maj, min, ino numbers to be used to uniquely identify each mapping + * + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * u64 addr; + * u64 len; + * u64 pgoff; + * union { + * struct { + * u32 maj; + * u32 min; + * u64 ino; + * u64 ino_generation; + * }; + * struct { + * u8 build_id_size; + * u8 __reserved_1; + * u16 __reserved_2; + * u8 build_id[20]; + * }; + * }; + * u32 prot, flags; + * char filename[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_MMAP2 = 10, + + /* + * Records that new data landed in the AUX buffer part. + * + * struct { + * struct perf_event_header header; + * + * u64 aux_offset; + * u64 aux_size; + * u64 flags; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_AUX = 11, + + /* + * Indicates that instruction trace has started + * + * struct { + * struct perf_event_header header; + * u32 pid; + * u32 tid; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_ITRACE_START = 12, + + /* + * Records the dropped/lost sample number. + * + * struct { + * struct perf_event_header header; + * + * u64 lost; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_LOST_SAMPLES = 13, + + /* + * Records a context switch in or out (flagged by + * PERF_RECORD_MISC_SWITCH_OUT). See also + * PERF_RECORD_SWITCH_CPU_WIDE. + * + * struct { + * struct perf_event_header header; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_SWITCH = 14, + + /* + * CPU-wide version of PERF_RECORD_SWITCH with next_prev_pid and + * next_prev_tid that are the next (switching out) or previous + * (switching in) pid/tid. + * + * struct { + * struct perf_event_header header; + * u32 next_prev_pid; + * u32 next_prev_tid; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_SWITCH_CPU_WIDE = 15, + + /* + * struct { + * struct perf_event_header header; + * u32 pid; + * u32 tid; + * u64 nr_namespaces; + * { u64 dev, inode; } [nr_namespaces]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_NAMESPACES = 16, + + /* + * Record ksymbol register/unregister events: + * + * struct { + * struct perf_event_header header; + * u64 addr; + * u32 len; + * u16 ksym_type; + * u16 flags; + * char name[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_KSYMBOL = 17, + + /* + * Record bpf events: + * enum perf_bpf_event_type { + * PERF_BPF_EVENT_UNKNOWN = 0, + * PERF_BPF_EVENT_PROG_LOAD = 1, + * PERF_BPF_EVENT_PROG_UNLOAD = 2, + * }; + * + * struct { + * struct perf_event_header header; + * u16 type; + * u16 flags; + * u32 id; + * u8 tag[BPF_TAG_SIZE]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_BPF_EVENT = 18, + + /* + * struct { + * struct perf_event_header header; + * u64 id; + * char path[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_CGROUP = 19, + + /* + * Records changes to kernel text i.e. self-modified code. 'old_len' is + * the number of old bytes, 'new_len' is the number of new bytes. Either + * 'old_len' or 'new_len' may be zero to indicate, for example, the + * addition or removal of a trampoline. 'bytes' contains the old bytes + * followed immediately by the new bytes. + * + * struct { + * struct perf_event_header header; + * u64 addr; + * u16 old_len; + * u16 new_len; + * u8 bytes[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_TEXT_POKE = 20, + + /* + * Data written to the AUX area by hardware due to aux_output, may need + * to be matched to the event by an architecture-specific hardware ID. + * This records the hardware ID, but requires sample_id to provide the + * event ID. e.g. Intel PT uses this record to disambiguate PEBS-via-PT + * records from multiple events. + * + * struct { + * struct perf_event_header header; + * u64 hw_id; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_AUX_OUTPUT_HW_ID = 21, + + PERF_RECORD_MAX, /* non-ABI */ +}; + +enum perf_record_ksymbol_type { + PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, + PERF_RECORD_KSYMBOL_TYPE_BPF = 1, + /* + * Out of line code such as kprobe-replaced instructions or optimized + * kprobes or ftrace trampolines. + */ + PERF_RECORD_KSYMBOL_TYPE_OOL = 2, + PERF_RECORD_KSYMBOL_TYPE_MAX /* non-ABI */ +}; + +#define PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER (1 << 0) + +enum perf_bpf_event_type { + PERF_BPF_EVENT_UNKNOWN = 0, + PERF_BPF_EVENT_PROG_LOAD = 1, + PERF_BPF_EVENT_PROG_UNLOAD = 2, + PERF_BPF_EVENT_MAX, /* non-ABI */ +}; + +#define PERF_MAX_STACK_DEPTH 127 +#define PERF_MAX_CONTEXTS_PER_STACK 8 + +enum perf_callchain_context { + PERF_CONTEXT_HV = (__u64)-32, + PERF_CONTEXT_KERNEL = (__u64)-128, + PERF_CONTEXT_USER = (__u64)-512, + + PERF_CONTEXT_GUEST = (__u64)-2048, + PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176, + PERF_CONTEXT_GUEST_USER = (__u64)-2560, + + PERF_CONTEXT_MAX = (__u64)-4095, +}; + +/** + * PERF_RECORD_AUX::flags bits + */ +#define PERF_AUX_FLAG_TRUNCATED 0x01 /* record was truncated to fit */ +#define PERF_AUX_FLAG_OVERWRITE 0x02 /* snapshot from overwrite mode */ +#define PERF_AUX_FLAG_PARTIAL 0x04 /* record contains gaps */ +#define PERF_AUX_FLAG_COLLISION 0x08 /* sample collided with another */ +#define PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK 0xff00 /* PMU specific trace format type */ + +/* CoreSight PMU AUX buffer formats */ +#define PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT 0x0000 /* Default for backward compatibility */ +#define PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW 0x0100 /* Raw format of the source */ + +#define PERF_FLAG_FD_NO_GROUP (1UL << 0) +#define PERF_FLAG_FD_OUTPUT (1UL << 1) +#define PERF_FLAG_PID_CGROUP (1UL << 2) /* pid=cgroup id, per-cpu mode only */ +#define PERF_FLAG_FD_CLOEXEC (1UL << 3) /* O_CLOEXEC */ + +#if defined(__LITTLE_ENDIAN_BITFIELD) +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_op:5, /* type of opcode */ + mem_lvl:14, /* memory hierarchy level */ + mem_snoop:5, /* snoop mode */ + mem_lock:2, /* lock instr */ + mem_dtlb:7, /* tlb access */ + mem_lvl_num:4, /* memory hierarchy level number */ + mem_remote:1, /* remote */ + mem_snoopx:2, /* snoop mode, ext */ + mem_blk:3, /* access blocked */ + mem_hops:3, /* hop level */ + mem_rsvd:18; + }; +}; +#elif defined(__BIG_ENDIAN_BITFIELD) +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_rsvd:18, + mem_hops:3, /* hop level */ + mem_blk:3, /* access blocked */ + mem_snoopx:2, /* snoop mode, ext */ + mem_remote:1, /* remote */ + mem_lvl_num:4, /* memory hierarchy level number */ + mem_dtlb:7, /* tlb access */ + mem_lock:2, /* lock instr */ + mem_snoop:5, /* snoop mode */ + mem_lvl:14, /* memory hierarchy level */ + mem_op:5; /* type of opcode */ + }; +}; +#else +#error "Unknown endianness" +#endif + +/* type of opcode (load/store/prefetch,code) */ +#define PERF_MEM_OP_NA 0x01 /* not available */ +#define PERF_MEM_OP_LOAD 0x02 /* load instruction */ +#define PERF_MEM_OP_STORE 0x04 /* store instruction */ +#define PERF_MEM_OP_PFETCH 0x08 /* prefetch */ +#define PERF_MEM_OP_EXEC 0x10 /* code (execution) */ +#define PERF_MEM_OP_SHIFT 0 + +/* + * PERF_MEM_LVL_* namespace being depricated to some extent in the + * favour of newer composite PERF_MEM_{LVLNUM_,REMOTE_,SNOOPX_} fields. + * Supporting this namespace inorder to not break defined ABIs. + * + * memory hierarchy (memory level, hit or miss) + */ +#define PERF_MEM_LVL_NA 0x01 /* not available */ +#define PERF_MEM_LVL_HIT 0x02 /* hit level */ +#define PERF_MEM_LVL_MISS 0x04 /* miss level */ +#define PERF_MEM_LVL_L1 0x08 /* L1 */ +#define PERF_MEM_LVL_LFB 0x10 /* Line Fill Buffer */ +#define PERF_MEM_LVL_L2 0x20 /* L2 */ +#define PERF_MEM_LVL_L3 0x40 /* L3 */ +#define PERF_MEM_LVL_LOC_RAM 0x80 /* Local DRAM */ +#define PERF_MEM_LVL_REM_RAM1 0x100 /* Remote DRAM (1 hop) */ +#define PERF_MEM_LVL_REM_RAM2 0x200 /* Remote DRAM (2 hops) */ +#define PERF_MEM_LVL_REM_CCE1 0x400 /* Remote Cache (1 hop) */ +#define PERF_MEM_LVL_REM_CCE2 0x800 /* Remote Cache (2 hops) */ +#define PERF_MEM_LVL_IO 0x1000 /* I/O memory */ +#define PERF_MEM_LVL_UNC 0x2000 /* Uncached memory */ +#define PERF_MEM_LVL_SHIFT 5 + +#define PERF_MEM_REMOTE_REMOTE 0x01 /* Remote */ +#define PERF_MEM_REMOTE_SHIFT 37 + +#define PERF_MEM_LVLNUM_L1 0x01 /* L1 */ +#define PERF_MEM_LVLNUM_L2 0x02 /* L2 */ +#define PERF_MEM_LVLNUM_L3 0x03 /* L3 */ +#define PERF_MEM_LVLNUM_L4 0x04 /* L4 */ +/* 5-0x8 available */ +#define PERF_MEM_LVLNUM_CXL 0x09 /* CXL */ +#define PERF_MEM_LVLNUM_IO 0x0a /* I/O */ +#define PERF_MEM_LVLNUM_ANY_CACHE 0x0b /* Any cache */ +#define PERF_MEM_LVLNUM_LFB 0x0c /* LFB */ +#define PERF_MEM_LVLNUM_RAM 0x0d /* RAM */ +#define PERF_MEM_LVLNUM_PMEM 0x0e /* PMEM */ +#define PERF_MEM_LVLNUM_NA 0x0f /* N/A */ + +#define PERF_MEM_LVLNUM_SHIFT 33 + +/* snoop mode */ +#define PERF_MEM_SNOOP_NA 0x01 /* not available */ +#define PERF_MEM_SNOOP_NONE 0x02 /* no snoop */ +#define PERF_MEM_SNOOP_HIT 0x04 /* snoop hit */ +#define PERF_MEM_SNOOP_MISS 0x08 /* snoop miss */ +#define PERF_MEM_SNOOP_HITM 0x10 /* snoop hit modified */ +#define PERF_MEM_SNOOP_SHIFT 19 + +#define PERF_MEM_SNOOPX_FWD 0x01 /* forward */ +#define PERF_MEM_SNOOPX_PEER 0x02 /* xfer from peer */ +#define PERF_MEM_SNOOPX_SHIFT 38 + +/* locked instruction */ +#define PERF_MEM_LOCK_NA 0x01 /* not available */ +#define PERF_MEM_LOCK_LOCKED 0x02 /* locked transaction */ +#define PERF_MEM_LOCK_SHIFT 24 + +/* TLB access */ +#define PERF_MEM_TLB_NA 0x01 /* not available */ +#define PERF_MEM_TLB_HIT 0x02 /* hit level */ +#define PERF_MEM_TLB_MISS 0x04 /* miss level */ +#define PERF_MEM_TLB_L1 0x08 /* L1 */ +#define PERF_MEM_TLB_L2 0x10 /* L2 */ +#define PERF_MEM_TLB_WK 0x20 /* Hardware Walker*/ +#define PERF_MEM_TLB_OS 0x40 /* OS fault handler */ +#define PERF_MEM_TLB_SHIFT 26 + +/* Access blocked */ +#define PERF_MEM_BLK_NA 0x01 /* not available */ +#define PERF_MEM_BLK_DATA 0x02 /* data could not be forwarded */ +#define PERF_MEM_BLK_ADDR 0x04 /* address conflict */ +#define PERF_MEM_BLK_SHIFT 40 + +/* hop level */ +#define PERF_MEM_HOPS_0 0x01 /* remote core, same node */ +#define PERF_MEM_HOPS_1 0x02 /* remote node, same socket */ +#define PERF_MEM_HOPS_2 0x03 /* remote socket, same board */ +#define PERF_MEM_HOPS_3 0x04 /* remote board */ +/* 5-7 available */ +#define PERF_MEM_HOPS_SHIFT 43 + +#define PERF_MEM_S(a, s) \ + (((__u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT) + +/* + * single taken branch record layout: + * + * from: source instruction (may not always be a branch insn) + * to: branch target + * mispred: branch target was mispredicted + * predicted: branch target was predicted + * + * support for mispred, predicted is optional. In case it + * is not supported mispred = predicted = 0. + * + * in_tx: running in a hardware transaction + * abort: aborting a hardware transaction + * cycles: cycles from last branch (or 0 if not supported) + * type: branch type + * spec: branch speculation info (or 0 if not supported) + */ +struct perf_branch_entry { + __u64 from; + __u64 to; + __u64 mispred:1, /* target mispredicted */ + predicted:1,/* target predicted */ + in_tx:1, /* in transaction */ + abort:1, /* transaction abort */ + cycles:16, /* cycle count to last branch */ + type:4, /* branch type */ + spec:2, /* branch speculation info */ + new_type:4, /* additional branch type */ + priv:3, /* privilege level */ + reserved:31; +}; + +union perf_sample_weight { + __u64 full; +#if defined(__LITTLE_ENDIAN_BITFIELD) + struct { + __u32 var1_dw; + __u16 var2_w; + __u16 var3_w; + }; +#elif defined(__BIG_ENDIAN_BITFIELD) + struct { + __u16 var3_w; + __u16 var2_w; + __u32 var1_dw; + }; +#else +#error "Unknown endianness" +#endif +}; + +#endif /* _UAPI_LINUX_PERF_EVENT_H */ diff --git a/bpftool/include/uapi/linux/pkt_cls.h b/bpftool/include/uapi/linux/pkt_cls.h new file mode 100644 index 0000000..3faee01 --- /dev/null +++ b/bpftool/include/uapi/linux/pkt_cls.h @@ -0,0 +1,612 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __LINUX_PKT_CLS_H +#define __LINUX_PKT_CLS_H + +#include +#include + +#define TC_COOKIE_MAX_SIZE 16 + +/* Action attributes */ +enum { + TCA_ACT_UNSPEC, + TCA_ACT_KIND, + TCA_ACT_OPTIONS, + TCA_ACT_INDEX, + TCA_ACT_STATS, + TCA_ACT_PAD, + TCA_ACT_COOKIE, + __TCA_ACT_MAX +}; + +#define TCA_ACT_MAX __TCA_ACT_MAX +#define TCA_OLD_COMPAT (TCA_ACT_MAX+1) +#define TCA_ACT_MAX_PRIO 32 +#define TCA_ACT_BIND 1 +#define TCA_ACT_NOBIND 0 +#define TCA_ACT_UNBIND 1 +#define TCA_ACT_NOUNBIND 0 +#define TCA_ACT_REPLACE 1 +#define TCA_ACT_NOREPLACE 0 + +#define TC_ACT_UNSPEC (-1) +#define TC_ACT_OK 0 +#define TC_ACT_RECLASSIFY 1 +#define TC_ACT_SHOT 2 +#define TC_ACT_PIPE 3 +#define TC_ACT_STOLEN 4 +#define TC_ACT_QUEUED 5 +#define TC_ACT_REPEAT 6 +#define TC_ACT_REDIRECT 7 +#define TC_ACT_TRAP 8 /* For hw path, this means "trap to cpu" + * and don't further process the frame + * in hardware. For sw path, this is + * equivalent of TC_ACT_STOLEN - drop + * the skb and act like everything + * is alright. + */ +#define TC_ACT_VALUE_MAX TC_ACT_TRAP + +/* There is a special kind of actions called "extended actions", + * which need a value parameter. These have a local opcode located in + * the highest nibble, starting from 1. The rest of the bits + * are used to carry the value. These two parts together make + * a combined opcode. + */ +#define __TC_ACT_EXT_SHIFT 28 +#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT) +#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1) +#define TC_ACT_EXT_OPCODE(combined) ((combined) & (~TC_ACT_EXT_VAL_MASK)) +#define TC_ACT_EXT_CMP(combined, opcode) (TC_ACT_EXT_OPCODE(combined) == opcode) + +#define TC_ACT_JUMP __TC_ACT_EXT(1) +#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2) +#define TC_ACT_EXT_OPCODE_MAX TC_ACT_GOTO_CHAIN + +/* Action type identifiers*/ +enum { + TCA_ID_UNSPEC=0, + TCA_ID_POLICE=1, + /* other actions go here */ + __TCA_ID_MAX=255 +}; + +#define TCA_ID_MAX __TCA_ID_MAX + +struct tc_police { + __u32 index; + int action; +#define TC_POLICE_UNSPEC TC_ACT_UNSPEC +#define TC_POLICE_OK TC_ACT_OK +#define TC_POLICE_RECLASSIFY TC_ACT_RECLASSIFY +#define TC_POLICE_SHOT TC_ACT_SHOT +#define TC_POLICE_PIPE TC_ACT_PIPE + + __u32 limit; + __u32 burst; + __u32 mtu; + struct tc_ratespec rate; + struct tc_ratespec peakrate; + int refcnt; + int bindcnt; + __u32 capab; +}; + +struct tcf_t { + __u64 install; + __u64 lastuse; + __u64 expires; + __u64 firstuse; +}; + +struct tc_cnt { + int refcnt; + int bindcnt; +}; + +#define tc_gen \ + __u32 index; \ + __u32 capab; \ + int action; \ + int refcnt; \ + int bindcnt + +enum { + TCA_POLICE_UNSPEC, + TCA_POLICE_TBF, + TCA_POLICE_RATE, + TCA_POLICE_PEAKRATE, + TCA_POLICE_AVRATE, + TCA_POLICE_RESULT, + TCA_POLICE_TM, + TCA_POLICE_PAD, + __TCA_POLICE_MAX +#define TCA_POLICE_RESULT TCA_POLICE_RESULT +}; + +#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1) + +/* tca flags definitions */ +#define TCA_CLS_FLAGS_SKIP_HW (1 << 0) /* don't offload filter to HW */ +#define TCA_CLS_FLAGS_SKIP_SW (1 << 1) /* don't use filter in SW */ +#define TCA_CLS_FLAGS_IN_HW (1 << 2) /* filter is offloaded to HW */ +#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */ +#define TCA_CLS_FLAGS_VERBOSE (1 << 4) /* verbose logging */ + +/* U32 filters */ + +#define TC_U32_HTID(h) ((h)&0xFFF00000) +#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20) +#define TC_U32_HASH(h) (((h)>>12)&0xFF) +#define TC_U32_NODE(h) ((h)&0xFFF) +#define TC_U32_KEY(h) ((h)&0xFFFFF) +#define TC_U32_UNSPEC 0 +#define TC_U32_ROOT (0xFFF00000) + +enum { + TCA_U32_UNSPEC, + TCA_U32_CLASSID, + TCA_U32_HASH, + TCA_U32_LINK, + TCA_U32_DIVISOR, + TCA_U32_SEL, + TCA_U32_POLICE, + TCA_U32_ACT, + TCA_U32_INDEV, + TCA_U32_PCNT, + TCA_U32_MARK, + TCA_U32_FLAGS, + TCA_U32_PAD, + __TCA_U32_MAX +}; + +#define TCA_U32_MAX (__TCA_U32_MAX - 1) + +struct tc_u32_key { + __be32 mask; + __be32 val; + int off; + int offmask; +}; + +struct tc_u32_sel { + unsigned char flags; + unsigned char offshift; + unsigned char nkeys; + + __be16 offmask; + __u16 off; + short offoff; + + short hoff; + __be32 hmask; + struct tc_u32_key keys[]; +}; + +struct tc_u32_mark { + __u32 val; + __u32 mask; + __u32 success; +}; + +struct tc_u32_pcnt { + __u64 rcnt; + __u64 rhit; + __u64 kcnts[]; +}; + +/* Flags */ + +#define TC_U32_TERMINAL 1 +#define TC_U32_OFFSET 2 +#define TC_U32_VAROFFSET 4 +#define TC_U32_EAT 8 + +#define TC_U32_MAXDEPTH 8 + + +/* RSVP filter */ + +enum { + TCA_RSVP_UNSPEC, + TCA_RSVP_CLASSID, + TCA_RSVP_DST, + TCA_RSVP_SRC, + TCA_RSVP_PINFO, + TCA_RSVP_POLICE, + TCA_RSVP_ACT, + __TCA_RSVP_MAX +}; + +#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 ) + +struct tc_rsvp_gpi { + __u32 key; + __u32 mask; + int offset; +}; + +struct tc_rsvp_pinfo { + struct tc_rsvp_gpi dpi; + struct tc_rsvp_gpi spi; + __u8 protocol; + __u8 tunnelid; + __u8 tunnelhdr; + __u8 pad; +}; + +/* ROUTE filter */ + +enum { + TCA_ROUTE4_UNSPEC, + TCA_ROUTE4_CLASSID, + TCA_ROUTE4_TO, + TCA_ROUTE4_FROM, + TCA_ROUTE4_IIF, + TCA_ROUTE4_POLICE, + TCA_ROUTE4_ACT, + __TCA_ROUTE4_MAX +}; + +#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1) + + +/* FW filter */ + +enum { + TCA_FW_UNSPEC, + TCA_FW_CLASSID, + TCA_FW_POLICE, + TCA_FW_INDEV, + TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */ + TCA_FW_MASK, + __TCA_FW_MAX +}; + +#define TCA_FW_MAX (__TCA_FW_MAX - 1) + +/* TC index filter */ + +enum { + TCA_TCINDEX_UNSPEC, + TCA_TCINDEX_HASH, + TCA_TCINDEX_MASK, + TCA_TCINDEX_SHIFT, + TCA_TCINDEX_FALL_THROUGH, + TCA_TCINDEX_CLASSID, + TCA_TCINDEX_POLICE, + TCA_TCINDEX_ACT, + __TCA_TCINDEX_MAX +}; + +#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1) + +/* Flow filter */ + +enum { + FLOW_KEY_SRC, + FLOW_KEY_DST, + FLOW_KEY_PROTO, + FLOW_KEY_PROTO_SRC, + FLOW_KEY_PROTO_DST, + FLOW_KEY_IIF, + FLOW_KEY_PRIORITY, + FLOW_KEY_MARK, + FLOW_KEY_NFCT, + FLOW_KEY_NFCT_SRC, + FLOW_KEY_NFCT_DST, + FLOW_KEY_NFCT_PROTO_SRC, + FLOW_KEY_NFCT_PROTO_DST, + FLOW_KEY_RTCLASSID, + FLOW_KEY_SKUID, + FLOW_KEY_SKGID, + FLOW_KEY_VLAN_TAG, + FLOW_KEY_RXHASH, + __FLOW_KEY_MAX, +}; + +#define FLOW_KEY_MAX (__FLOW_KEY_MAX - 1) + +enum { + FLOW_MODE_MAP, + FLOW_MODE_HASH, +}; + +enum { + TCA_FLOW_UNSPEC, + TCA_FLOW_KEYS, + TCA_FLOW_MODE, + TCA_FLOW_BASECLASS, + TCA_FLOW_RSHIFT, + TCA_FLOW_ADDEND, + TCA_FLOW_MASK, + TCA_FLOW_XOR, + TCA_FLOW_DIVISOR, + TCA_FLOW_ACT, + TCA_FLOW_POLICE, + TCA_FLOW_EMATCHES, + TCA_FLOW_PERTURB, + __TCA_FLOW_MAX +}; + +#define TCA_FLOW_MAX (__TCA_FLOW_MAX - 1) + +/* Basic filter */ + +enum { + TCA_BASIC_UNSPEC, + TCA_BASIC_CLASSID, + TCA_BASIC_EMATCHES, + TCA_BASIC_ACT, + TCA_BASIC_POLICE, + __TCA_BASIC_MAX +}; + +#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1) + + +/* Cgroup classifier */ + +enum { + TCA_CGROUP_UNSPEC, + TCA_CGROUP_ACT, + TCA_CGROUP_POLICE, + TCA_CGROUP_EMATCHES, + __TCA_CGROUP_MAX, +}; + +#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1) + +/* BPF classifier */ + +#define TCA_BPF_FLAG_ACT_DIRECT (1 << 0) + +enum { + TCA_BPF_UNSPEC, + TCA_BPF_ACT, + TCA_BPF_POLICE, + TCA_BPF_CLASSID, + TCA_BPF_OPS_LEN, + TCA_BPF_OPS, + TCA_BPF_FD, + TCA_BPF_NAME, + TCA_BPF_FLAGS, + TCA_BPF_FLAGS_GEN, + TCA_BPF_TAG, + TCA_BPF_ID, + __TCA_BPF_MAX, +}; + +#define TCA_BPF_MAX (__TCA_BPF_MAX - 1) + +/* Flower classifier */ + +enum { + TCA_FLOWER_UNSPEC, + TCA_FLOWER_CLASSID, + TCA_FLOWER_INDEV, + TCA_FLOWER_ACT, + TCA_FLOWER_KEY_ETH_DST, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_DST_MASK, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_SRC, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_SRC_MASK, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_TYPE, /* be16 */ + TCA_FLOWER_KEY_IP_PROTO, /* u8 */ + TCA_FLOWER_KEY_IPV4_SRC, /* be32 */ + TCA_FLOWER_KEY_IPV4_SRC_MASK, /* be32 */ + TCA_FLOWER_KEY_IPV4_DST, /* be32 */ + TCA_FLOWER_KEY_IPV4_DST_MASK, /* be32 */ + TCA_FLOWER_KEY_IPV6_SRC, /* struct in6_addr */ + TCA_FLOWER_KEY_IPV6_SRC_MASK, /* struct in6_addr */ + TCA_FLOWER_KEY_IPV6_DST, /* struct in6_addr */ + TCA_FLOWER_KEY_IPV6_DST_MASK, /* struct in6_addr */ + TCA_FLOWER_KEY_TCP_SRC, /* be16 */ + TCA_FLOWER_KEY_TCP_DST, /* be16 */ + TCA_FLOWER_KEY_UDP_SRC, /* be16 */ + TCA_FLOWER_KEY_UDP_DST, /* be16 */ + + TCA_FLOWER_FLAGS, + TCA_FLOWER_KEY_VLAN_ID, /* be16 */ + TCA_FLOWER_KEY_VLAN_PRIO, /* u8 */ + TCA_FLOWER_KEY_VLAN_ETH_TYPE, /* be16 */ + + TCA_FLOWER_KEY_ENC_KEY_ID, /* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_SRC, /* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK,/* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_DST, /* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_DST_MASK,/* be32 */ + TCA_FLOWER_KEY_ENC_IPV6_SRC, /* struct in6_addr */ + TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK,/* struct in6_addr */ + TCA_FLOWER_KEY_ENC_IPV6_DST, /* struct in6_addr */ + TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */ + + TCA_FLOWER_KEY_TCP_SRC_MASK, /* be16 */ + TCA_FLOWER_KEY_TCP_DST_MASK, /* be16 */ + TCA_FLOWER_KEY_UDP_SRC_MASK, /* be16 */ + TCA_FLOWER_KEY_UDP_DST_MASK, /* be16 */ + TCA_FLOWER_KEY_SCTP_SRC_MASK, /* be16 */ + TCA_FLOWER_KEY_SCTP_DST_MASK, /* be16 */ + + TCA_FLOWER_KEY_SCTP_SRC, /* be16 */ + TCA_FLOWER_KEY_SCTP_DST, /* be16 */ + + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT, /* be16 */ + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */ + TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */ + TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */ + + TCA_FLOWER_KEY_FLAGS, /* be32 */ + TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */ + + TCA_FLOWER_KEY_ICMPV4_CODE, /* u8 */ + TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */ + TCA_FLOWER_KEY_ICMPV4_TYPE, /* u8 */ + TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */ + TCA_FLOWER_KEY_ICMPV6_CODE, /* u8 */ + TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */ + TCA_FLOWER_KEY_ICMPV6_TYPE, /* u8 */ + TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */ + + TCA_FLOWER_KEY_ARP_SIP, /* be32 */ + TCA_FLOWER_KEY_ARP_SIP_MASK, /* be32 */ + TCA_FLOWER_KEY_ARP_TIP, /* be32 */ + TCA_FLOWER_KEY_ARP_TIP_MASK, /* be32 */ + TCA_FLOWER_KEY_ARP_OP, /* u8 */ + TCA_FLOWER_KEY_ARP_OP_MASK, /* u8 */ + TCA_FLOWER_KEY_ARP_SHA, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_SHA_MASK, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_THA, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_THA_MASK, /* ETH_ALEN */ + + TCA_FLOWER_KEY_MPLS_TTL, /* u8 - 8 bits */ + TCA_FLOWER_KEY_MPLS_BOS, /* u8 - 1 bit */ + TCA_FLOWER_KEY_MPLS_TC, /* u8 - 3 bits */ + TCA_FLOWER_KEY_MPLS_LABEL, /* be32 - 20 bits */ + + TCA_FLOWER_KEY_TCP_FLAGS, /* be16 */ + TCA_FLOWER_KEY_TCP_FLAGS_MASK, /* be16 */ + + TCA_FLOWER_KEY_IP_TOS, /* u8 */ + TCA_FLOWER_KEY_IP_TOS_MASK, /* u8 */ + TCA_FLOWER_KEY_IP_TTL, /* u8 */ + TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */ + + TCA_FLOWER_KEY_CVLAN_ID, /* be16 */ + TCA_FLOWER_KEY_CVLAN_PRIO, /* u8 */ + TCA_FLOWER_KEY_CVLAN_ETH_TYPE, /* be16 */ + + TCA_FLOWER_KEY_ENC_IP_TOS, /* u8 */ + TCA_FLOWER_KEY_ENC_IP_TOS_MASK, /* u8 */ + TCA_FLOWER_KEY_ENC_IP_TTL, /* u8 */ + TCA_FLOWER_KEY_ENC_IP_TTL_MASK, /* u8 */ + + TCA_FLOWER_KEY_ENC_OPTS, + TCA_FLOWER_KEY_ENC_OPTS_MASK, + + TCA_FLOWER_IN_HW_COUNT, + + __TCA_FLOWER_MAX, +}; + +#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1) + +enum { + TCA_FLOWER_KEY_ENC_OPTS_UNSPEC, + TCA_FLOWER_KEY_ENC_OPTS_GENEVE, /* Nested + * TCA_FLOWER_KEY_ENC_OPT_GENEVE_ + * attributes + */ + __TCA_FLOWER_KEY_ENC_OPTS_MAX, +}; + +#define TCA_FLOWER_KEY_ENC_OPTS_MAX (__TCA_FLOWER_KEY_ENC_OPTS_MAX - 1) + +enum { + TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS, /* u16 */ + TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE, /* u8 */ + TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA, /* 4 to 128 bytes */ + + __TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX, +}; + +#define TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX \ + (__TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX - 1) + +enum { + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0), + TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1), +}; + +/* Match-all classifier */ + +enum { + TCA_MATCHALL_UNSPEC, + TCA_MATCHALL_CLASSID, + TCA_MATCHALL_ACT, + TCA_MATCHALL_FLAGS, + __TCA_MATCHALL_MAX, +}; + +#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1) + +/* Extended Matches */ + +struct tcf_ematch_tree_hdr { + __u16 nmatches; + __u16 progid; +}; + +enum { + TCA_EMATCH_TREE_UNSPEC, + TCA_EMATCH_TREE_HDR, + TCA_EMATCH_TREE_LIST, + __TCA_EMATCH_TREE_MAX +}; +#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1) + +struct tcf_ematch_hdr { + __u16 matchid; + __u16 kind; + __u16 flags; + __u16 pad; /* currently unused */ +}; + +/* 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-----------------------+-+-+---+ + * | Unused |S|I| R | + * +-----------------------+-+-+---+ + * + * R(2) ::= relation to next ematch + * where: 0 0 END (last ematch) + * 0 1 AND + * 1 0 OR + * 1 1 Unused (invalid) + * I(1) ::= invert result + * S(1) ::= simple payload + */ +#define TCF_EM_REL_END 0 +#define TCF_EM_REL_AND (1<<0) +#define TCF_EM_REL_OR (1<<1) +#define TCF_EM_INVERT (1<<2) +#define TCF_EM_SIMPLE (1<<3) + +#define TCF_EM_REL_MASK 3 +#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK) + +enum { + TCF_LAYER_LINK, + TCF_LAYER_NETWORK, + TCF_LAYER_TRANSPORT, + __TCF_LAYER_MAX +}; +#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1) + +/* Ematch type assignments + * 1..32767 Reserved for ematches inside kernel tree + * 32768..65535 Free to use, not reliable + */ +#define TCF_EM_CONTAINER 0 +#define TCF_EM_CMP 1 +#define TCF_EM_NBYTE 2 +#define TCF_EM_U32 3 +#define TCF_EM_META 4 +#define TCF_EM_TEXT 5 +#define TCF_EM_VLAN 6 +#define TCF_EM_CANID 7 +#define TCF_EM_IPSET 8 +#define TCF_EM_IPT 9 +#define TCF_EM_MAX 9 + +enum { + TCF_EM_PROG_TC +}; + +enum { + TCF_EM_OPND_EQ, + TCF_EM_OPND_GT, + TCF_EM_OPND_LT +}; + +#endif diff --git a/bpftool/include/uapi/linux/pkt_sched.h b/bpftool/include/uapi/linux/pkt_sched.h new file mode 100644 index 0000000..5c903ab --- /dev/null +++ b/bpftool/include/uapi/linux/pkt_sched.h @@ -0,0 +1,1164 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __LINUX_PKT_SCHED_H +#define __LINUX_PKT_SCHED_H + +#include + +/* Logical priority bands not depending on specific packet scheduler. + Every scheduler will map them to real traffic classes, if it has + no more precise mechanism to classify packets. + + These numbers have no special meaning, though their coincidence + with obsolete IPv6 values is not occasional :-). New IPv6 drafts + preferred full anarchy inspired by diffserv group. + + Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy + class, actually, as rule it will be handled with more care than + filler or even bulk. + */ + +#define TC_PRIO_BESTEFFORT 0 +#define TC_PRIO_FILLER 1 +#define TC_PRIO_BULK 2 +#define TC_PRIO_INTERACTIVE_BULK 4 +#define TC_PRIO_INTERACTIVE 6 +#define TC_PRIO_CONTROL 7 + +#define TC_PRIO_MAX 15 + +/* Generic queue statistics, available for all the elements. + Particular schedulers may have also their private records. + */ + +struct tc_stats { + __u64 bytes; /* Number of enqueued bytes */ + __u32 packets; /* Number of enqueued packets */ + __u32 drops; /* Packets dropped because of lack of resources */ + __u32 overlimits; /* Number of throttle events when this + * flow goes out of allocated bandwidth */ + __u32 bps; /* Current flow byte rate */ + __u32 pps; /* Current flow packet rate */ + __u32 qlen; + __u32 backlog; +}; + +struct tc_estimator { + signed char interval; + unsigned char ewma_log; +}; + +/* "Handles" + --------- + + All the traffic control objects have 32bit identifiers, or "handles". + + They can be considered as opaque numbers from user API viewpoint, + but actually they always consist of two fields: major and + minor numbers, which are interpreted by kernel specially, + that may be used by applications, though not recommended. + + F.e. qdisc handles always have minor number equal to zero, + classes (or flows) have major equal to parent qdisc major, and + minor uniquely identifying class inside qdisc. + + Macros to manipulate handles: + */ + +#define TC_H_MAJ_MASK (0xFFFF0000U) +#define TC_H_MIN_MASK (0x0000FFFFU) +#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK) +#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK) +#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK)) + +#define TC_H_UNSPEC (0U) +#define TC_H_ROOT (0xFFFFFFFFU) +#define TC_H_INGRESS (0xFFFFFFF1U) +#define TC_H_CLSACT TC_H_INGRESS + +#define TC_H_MIN_PRIORITY 0xFFE0U +#define TC_H_MIN_INGRESS 0xFFF2U +#define TC_H_MIN_EGRESS 0xFFF3U + +/* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */ +enum tc_link_layer { + TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */ + TC_LINKLAYER_ETHERNET, + TC_LINKLAYER_ATM, +}; +#define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */ + +struct tc_ratespec { + unsigned char cell_log; + __u8 linklayer; /* lower 4 bits */ + unsigned short overhead; + short cell_align; + unsigned short mpu; + __u32 rate; +}; + +#define TC_RTAB_SIZE 1024 + +struct tc_sizespec { + unsigned char cell_log; + unsigned char size_log; + short cell_align; + int overhead; + unsigned int linklayer; + unsigned int mpu; + unsigned int mtu; + unsigned int tsize; +}; + +enum { + TCA_STAB_UNSPEC, + TCA_STAB_BASE, + TCA_STAB_DATA, + __TCA_STAB_MAX +}; + +#define TCA_STAB_MAX (__TCA_STAB_MAX - 1) + +/* FIFO section */ + +struct tc_fifo_qopt { + __u32 limit; /* Queue length: bytes for bfifo, packets for pfifo */ +}; + +/* SKBPRIO section */ + +/* + * Priorities go from zero to (SKBPRIO_MAX_PRIORITY - 1). + * SKBPRIO_MAX_PRIORITY should be at least 64 in order for skbprio to be able + * to map one to one the DS field of IPV4 and IPV6 headers. + * Memory allocation grows linearly with SKBPRIO_MAX_PRIORITY. + */ + +#define SKBPRIO_MAX_PRIORITY 64 + +struct tc_skbprio_qopt { + __u32 limit; /* Queue length in packets. */ +}; + +/* PRIO section */ + +#define TCQ_PRIO_BANDS 16 +#define TCQ_MIN_PRIO_BANDS 2 + +struct tc_prio_qopt { + int bands; /* Number of bands */ + __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ +}; + +/* MULTIQ section */ + +struct tc_multiq_qopt { + __u16 bands; /* Number of bands */ + __u16 max_bands; /* Maximum number of queues */ +}; + +/* PLUG section */ + +#define TCQ_PLUG_BUFFER 0 +#define TCQ_PLUG_RELEASE_ONE 1 +#define TCQ_PLUG_RELEASE_INDEFINITE 2 +#define TCQ_PLUG_LIMIT 3 + +struct tc_plug_qopt { + /* TCQ_PLUG_BUFFER: Inset a plug into the queue and + * buffer any incoming packets + * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head + * to beginning of the next plug. + * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue. + * Stop buffering packets until the next TCQ_PLUG_BUFFER + * command is received (just act as a pass-thru queue). + * TCQ_PLUG_LIMIT: Increase/decrease queue size + */ + int action; + __u32 limit; +}; + +/* TBF section */ + +struct tc_tbf_qopt { + struct tc_ratespec rate; + struct tc_ratespec peakrate; + __u32 limit; + __u32 buffer; + __u32 mtu; +}; + +enum { + TCA_TBF_UNSPEC, + TCA_TBF_PARMS, + TCA_TBF_RTAB, + TCA_TBF_PTAB, + TCA_TBF_RATE64, + TCA_TBF_PRATE64, + TCA_TBF_BURST, + TCA_TBF_PBURST, + TCA_TBF_PAD, + __TCA_TBF_MAX, +}; + +#define TCA_TBF_MAX (__TCA_TBF_MAX - 1) + + +/* TEQL section */ + +/* TEQL does not require any parameters */ + +/* SFQ section */ + +struct tc_sfq_qopt { + unsigned quantum; /* Bytes per round allocated to flow */ + int perturb_period; /* Period of hash perturbation */ + __u32 limit; /* Maximal packets in queue */ + unsigned divisor; /* Hash divisor */ + unsigned flows; /* Maximal number of flows */ +}; + +struct tc_sfqred_stats { + __u32 prob_drop; /* Early drops, below max threshold */ + __u32 forced_drop; /* Early drops, after max threshold */ + __u32 prob_mark; /* Marked packets, below max threshold */ + __u32 forced_mark; /* Marked packets, after max threshold */ + __u32 prob_mark_head; /* Marked packets, below max threshold */ + __u32 forced_mark_head;/* Marked packets, after max threshold */ +}; + +struct tc_sfq_qopt_v1 { + struct tc_sfq_qopt v0; + unsigned int depth; /* max number of packets per flow */ + unsigned int headdrop; +/* SFQRED parameters */ + __u32 limit; /* HARD maximal flow queue length (bytes) */ + __u32 qth_min; /* Min average length threshold (bytes) */ + __u32 qth_max; /* Max average length threshold (bytes) */ + unsigned char Wlog; /* log(W) */ + unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ + unsigned char Scell_log; /* cell size for idle damping */ + unsigned char flags; + __u32 max_P; /* probability, high resolution */ +/* SFQRED stats */ + struct tc_sfqred_stats stats; +}; + + +struct tc_sfq_xstats { + __s32 allot; +}; + +/* RED section */ + +enum { + TCA_RED_UNSPEC, + TCA_RED_PARMS, + TCA_RED_STAB, + TCA_RED_MAX_P, + __TCA_RED_MAX, +}; + +#define TCA_RED_MAX (__TCA_RED_MAX - 1) + +struct tc_red_qopt { + __u32 limit; /* HARD maximal queue length (bytes) */ + __u32 qth_min; /* Min average length threshold (bytes) */ + __u32 qth_max; /* Max average length threshold (bytes) */ + unsigned char Wlog; /* log(W) */ + unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ + unsigned char Scell_log; /* cell size for idle damping */ + unsigned char flags; +#define TC_RED_ECN 1 +#define TC_RED_HARDDROP 2 +#define TC_RED_ADAPTATIVE 4 +}; + +struct tc_red_xstats { + __u32 early; /* Early drops */ + __u32 pdrop; /* Drops due to queue limits */ + __u32 other; /* Drops due to drop() calls */ + __u32 marked; /* Marked packets */ +}; + +/* GRED section */ + +#define MAX_DPs 16 + +enum { + TCA_GRED_UNSPEC, + TCA_GRED_PARMS, + TCA_GRED_STAB, + TCA_GRED_DPS, + TCA_GRED_MAX_P, + TCA_GRED_LIMIT, + TCA_GRED_VQ_LIST, /* nested TCA_GRED_VQ_ENTRY */ + __TCA_GRED_MAX, +}; + +#define TCA_GRED_MAX (__TCA_GRED_MAX - 1) + +enum { + TCA_GRED_VQ_ENTRY_UNSPEC, + TCA_GRED_VQ_ENTRY, /* nested TCA_GRED_VQ_* */ + __TCA_GRED_VQ_ENTRY_MAX, +}; +#define TCA_GRED_VQ_ENTRY_MAX (__TCA_GRED_VQ_ENTRY_MAX - 1) + +enum { + TCA_GRED_VQ_UNSPEC, + TCA_GRED_VQ_PAD, + TCA_GRED_VQ_DP, /* u32 */ + TCA_GRED_VQ_STAT_BYTES, /* u64 */ + TCA_GRED_VQ_STAT_PACKETS, /* u32 */ + TCA_GRED_VQ_STAT_BACKLOG, /* u32 */ + TCA_GRED_VQ_STAT_PROB_DROP, /* u32 */ + TCA_GRED_VQ_STAT_PROB_MARK, /* u32 */ + TCA_GRED_VQ_STAT_FORCED_DROP, /* u32 */ + TCA_GRED_VQ_STAT_FORCED_MARK, /* u32 */ + TCA_GRED_VQ_STAT_PDROP, /* u32 */ + TCA_GRED_VQ_STAT_OTHER, /* u32 */ + TCA_GRED_VQ_FLAGS, /* u32 */ + __TCA_GRED_VQ_MAX +}; + +#define TCA_GRED_VQ_MAX (__TCA_GRED_VQ_MAX - 1) + +struct tc_gred_qopt { + __u32 limit; /* HARD maximal queue length (bytes) */ + __u32 qth_min; /* Min average length threshold (bytes) */ + __u32 qth_max; /* Max average length threshold (bytes) */ + __u32 DP; /* up to 2^32 DPs */ + __u32 backlog; + __u32 qave; + __u32 forced; + __u32 early; + __u32 other; + __u32 pdrop; + __u8 Wlog; /* log(W) */ + __u8 Plog; /* log(P_max/(qth_max-qth_min)) */ + __u8 Scell_log; /* cell size for idle damping */ + __u8 prio; /* prio of this VQ */ + __u32 packets; + __u32 bytesin; +}; + +/* gred setup */ +struct tc_gred_sopt { + __u32 DPs; + __u32 def_DP; + __u8 grio; + __u8 flags; + __u16 pad1; +}; + +/* CHOKe section */ + +enum { + TCA_CHOKE_UNSPEC, + TCA_CHOKE_PARMS, + TCA_CHOKE_STAB, + TCA_CHOKE_MAX_P, + __TCA_CHOKE_MAX, +}; + +#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1) + +struct tc_choke_qopt { + __u32 limit; /* Hard queue length (packets) */ + __u32 qth_min; /* Min average threshold (packets) */ + __u32 qth_max; /* Max average threshold (packets) */ + unsigned char Wlog; /* log(W) */ + unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ + unsigned char Scell_log; /* cell size for idle damping */ + unsigned char flags; /* see RED flags */ +}; + +struct tc_choke_xstats { + __u32 early; /* Early drops */ + __u32 pdrop; /* Drops due to queue limits */ + __u32 other; /* Drops due to drop() calls */ + __u32 marked; /* Marked packets */ + __u32 matched; /* Drops due to flow match */ +}; + +/* HTB section */ +#define TC_HTB_NUMPRIO 8 +#define TC_HTB_MAXDEPTH 8 +#define TC_HTB_PROTOVER 3 /* the same as HTB and TC's major */ + +struct tc_htb_opt { + struct tc_ratespec rate; + struct tc_ratespec ceil; + __u32 buffer; + __u32 cbuffer; + __u32 quantum; + __u32 level; /* out only */ + __u32 prio; +}; +struct tc_htb_glob { + __u32 version; /* to match HTB/TC */ + __u32 rate2quantum; /* bps->quantum divisor */ + __u32 defcls; /* default class number */ + __u32 debug; /* debug flags */ + + /* stats */ + __u32 direct_pkts; /* count of non shaped packets */ +}; +enum { + TCA_HTB_UNSPEC, + TCA_HTB_PARMS, + TCA_HTB_INIT, + TCA_HTB_CTAB, + TCA_HTB_RTAB, + TCA_HTB_DIRECT_QLEN, + TCA_HTB_RATE64, + TCA_HTB_CEIL64, + TCA_HTB_PAD, + TCA_HTB_OFFLOAD, + __TCA_HTB_MAX, +}; + +#define TCA_HTB_MAX (__TCA_HTB_MAX - 1) + +struct tc_htb_xstats { + __u32 lends; + __u32 borrows; + __u32 giants; /* unused since 'Make HTB scheduler work with TSO.' */ + __s32 tokens; + __s32 ctokens; +}; + +/* HFSC section */ + +struct tc_hfsc_qopt { + __u16 defcls; /* default class */ +}; + +struct tc_service_curve { + __u32 m1; /* slope of the first segment in bps */ + __u32 d; /* x-projection of the first segment in us */ + __u32 m2; /* slope of the second segment in bps */ +}; + +struct tc_hfsc_stats { + __u64 work; /* total work done */ + __u64 rtwork; /* work done by real-time criteria */ + __u32 period; /* current period */ + __u32 level; /* class level in hierarchy */ +}; + +enum { + TCA_HFSC_UNSPEC, + TCA_HFSC_RSC, + TCA_HFSC_FSC, + TCA_HFSC_USC, + __TCA_HFSC_MAX, +}; + +#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1) + + +/* CBQ section */ + +#define TC_CBQ_MAXPRIO 8 +#define TC_CBQ_MAXLEVEL 8 +#define TC_CBQ_DEF_EWMA 5 + +struct tc_cbq_lssopt { + unsigned char change; + unsigned char flags; +#define TCF_CBQ_LSS_BOUNDED 1 +#define TCF_CBQ_LSS_ISOLATED 2 + unsigned char ewma_log; + unsigned char level; +#define TCF_CBQ_LSS_FLAGS 1 +#define TCF_CBQ_LSS_EWMA 2 +#define TCF_CBQ_LSS_MAXIDLE 4 +#define TCF_CBQ_LSS_MINIDLE 8 +#define TCF_CBQ_LSS_OFFTIME 0x10 +#define TCF_CBQ_LSS_AVPKT 0x20 + __u32 maxidle; + __u32 minidle; + __u32 offtime; + __u32 avpkt; +}; + +struct tc_cbq_wrropt { + unsigned char flags; + unsigned char priority; + unsigned char cpriority; + unsigned char __reserved; + __u32 allot; + __u32 weight; +}; + +struct tc_cbq_ovl { + unsigned char strategy; +#define TC_CBQ_OVL_CLASSIC 0 +#define TC_CBQ_OVL_DELAY 1 +#define TC_CBQ_OVL_LOWPRIO 2 +#define TC_CBQ_OVL_DROP 3 +#define TC_CBQ_OVL_RCLASSIC 4 + unsigned char priority2; + __u16 pad; + __u32 penalty; +}; + +struct tc_cbq_police { + unsigned char police; + unsigned char __res1; + unsigned short __res2; +}; + +struct tc_cbq_fopt { + __u32 split; + __u32 defmap; + __u32 defchange; +}; + +struct tc_cbq_xstats { + __u32 borrows; + __u32 overactions; + __s32 avgidle; + __s32 undertime; +}; + +enum { + TCA_CBQ_UNSPEC, + TCA_CBQ_LSSOPT, + TCA_CBQ_WRROPT, + TCA_CBQ_FOPT, + TCA_CBQ_OVL_STRATEGY, + TCA_CBQ_RATE, + TCA_CBQ_RTAB, + TCA_CBQ_POLICE, + __TCA_CBQ_MAX, +}; + +#define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1) + +/* dsmark section */ + +enum { + TCA_DSMARK_UNSPEC, + TCA_DSMARK_INDICES, + TCA_DSMARK_DEFAULT_INDEX, + TCA_DSMARK_SET_TC_INDEX, + TCA_DSMARK_MASK, + TCA_DSMARK_VALUE, + __TCA_DSMARK_MAX, +}; + +#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1) + +/* ATM section */ + +enum { + TCA_ATM_UNSPEC, + TCA_ATM_FD, /* file/socket descriptor */ + TCA_ATM_PTR, /* pointer to descriptor - later */ + TCA_ATM_HDR, /* LL header */ + TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ + TCA_ATM_ADDR, /* PVC address (for output only) */ + TCA_ATM_STATE, /* VC state (ATM_VS_*; for output only) */ + __TCA_ATM_MAX, +}; + +#define TCA_ATM_MAX (__TCA_ATM_MAX - 1) + +/* Network emulator */ + +enum { + TCA_NETEM_UNSPEC, + TCA_NETEM_CORR, + TCA_NETEM_DELAY_DIST, + TCA_NETEM_REORDER, + TCA_NETEM_CORRUPT, + TCA_NETEM_LOSS, + TCA_NETEM_RATE, + TCA_NETEM_ECN, + TCA_NETEM_RATE64, + TCA_NETEM_PAD, + TCA_NETEM_LATENCY64, + TCA_NETEM_JITTER64, + TCA_NETEM_SLOT, + TCA_NETEM_SLOT_DIST, + __TCA_NETEM_MAX, +}; + +#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1) + +struct tc_netem_qopt { + __u32 latency; /* added delay (us) */ + __u32 limit; /* fifo limit (packets) */ + __u32 loss; /* random packet loss (0=none ~0=100%) */ + __u32 gap; /* re-ordering gap (0 for none) */ + __u32 duplicate; /* random packet dup (0=none ~0=100%) */ + __u32 jitter; /* random jitter in latency (us) */ +}; + +struct tc_netem_corr { + __u32 delay_corr; /* delay correlation */ + __u32 loss_corr; /* packet loss correlation */ + __u32 dup_corr; /* duplicate correlation */ +}; + +struct tc_netem_reorder { + __u32 probability; + __u32 correlation; +}; + +struct tc_netem_corrupt { + __u32 probability; + __u32 correlation; +}; + +struct tc_netem_rate { + __u32 rate; /* byte/s */ + __s32 packet_overhead; + __u32 cell_size; + __s32 cell_overhead; +}; + +struct tc_netem_slot { + __s64 min_delay; /* nsec */ + __s64 max_delay; + __s32 max_packets; + __s32 max_bytes; + __s64 dist_delay; /* nsec */ + __s64 dist_jitter; /* nsec */ +}; + +enum { + NETEM_LOSS_UNSPEC, + NETEM_LOSS_GI, /* General Intuitive - 4 state model */ + NETEM_LOSS_GE, /* Gilbert Elliot models */ + __NETEM_LOSS_MAX +}; +#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1) + +/* State transition probabilities for 4 state model */ +struct tc_netem_gimodel { + __u32 p13; + __u32 p31; + __u32 p32; + __u32 p14; + __u32 p23; +}; + +/* Gilbert-Elliot models */ +struct tc_netem_gemodel { + __u32 p; + __u32 r; + __u32 h; + __u32 k1; +}; + +#define NETEM_DIST_SCALE 8192 +#define NETEM_DIST_MAX 16384 + +/* DRR */ + +enum { + TCA_DRR_UNSPEC, + TCA_DRR_QUANTUM, + __TCA_DRR_MAX +}; + +#define TCA_DRR_MAX (__TCA_DRR_MAX - 1) + +struct tc_drr_stats { + __u32 deficit; +}; + +/* MQPRIO */ +#define TC_QOPT_BITMASK 15 +#define TC_QOPT_MAX_QUEUE 16 + +enum { + TC_MQPRIO_HW_OFFLOAD_NONE, /* no offload requested */ + TC_MQPRIO_HW_OFFLOAD_TCS, /* offload TCs, no queue counts */ + __TC_MQPRIO_HW_OFFLOAD_MAX +}; + +#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1) + +enum { + TC_MQPRIO_MODE_DCB, + TC_MQPRIO_MODE_CHANNEL, + __TC_MQPRIO_MODE_MAX +}; + +#define __TC_MQPRIO_MODE_MAX (__TC_MQPRIO_MODE_MAX - 1) + +enum { + TC_MQPRIO_SHAPER_DCB, + TC_MQPRIO_SHAPER_BW_RATE, /* Add new shapers below */ + __TC_MQPRIO_SHAPER_MAX +}; + +#define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1) + +struct tc_mqprio_qopt { + __u8 num_tc; + __u8 prio_tc_map[TC_QOPT_BITMASK + 1]; + __u8 hw; + __u16 count[TC_QOPT_MAX_QUEUE]; + __u16 offset[TC_QOPT_MAX_QUEUE]; +}; + +#define TC_MQPRIO_F_MODE 0x1 +#define TC_MQPRIO_F_SHAPER 0x2 +#define TC_MQPRIO_F_MIN_RATE 0x4 +#define TC_MQPRIO_F_MAX_RATE 0x8 + +enum { + TCA_MQPRIO_UNSPEC, + TCA_MQPRIO_MODE, + TCA_MQPRIO_SHAPER, + TCA_MQPRIO_MIN_RATE64, + TCA_MQPRIO_MAX_RATE64, + __TCA_MQPRIO_MAX, +}; + +#define TCA_MQPRIO_MAX (__TCA_MQPRIO_MAX - 1) + +/* SFB */ + +enum { + TCA_SFB_UNSPEC, + TCA_SFB_PARMS, + __TCA_SFB_MAX, +}; + +#define TCA_SFB_MAX (__TCA_SFB_MAX - 1) + +/* + * Note: increment, decrement are Q0.16 fixed-point values. + */ +struct tc_sfb_qopt { + __u32 rehash_interval; /* delay between hash move, in ms */ + __u32 warmup_time; /* double buffering warmup time in ms (warmup_time < rehash_interval) */ + __u32 max; /* max len of qlen_min */ + __u32 bin_size; /* maximum queue length per bin */ + __u32 increment; /* probability increment, (d1 in Blue) */ + __u32 decrement; /* probability decrement, (d2 in Blue) */ + __u32 limit; /* max SFB queue length */ + __u32 penalty_rate; /* inelastic flows are rate limited to 'rate' pps */ + __u32 penalty_burst; +}; + +struct tc_sfb_xstats { + __u32 earlydrop; + __u32 penaltydrop; + __u32 bucketdrop; + __u32 queuedrop; + __u32 childdrop; /* drops in child qdisc */ + __u32 marked; + __u32 maxqlen; + __u32 maxprob; + __u32 avgprob; +}; + +#define SFB_MAX_PROB 0xFFFF + +/* QFQ */ +enum { + TCA_QFQ_UNSPEC, + TCA_QFQ_WEIGHT, + TCA_QFQ_LMAX, + __TCA_QFQ_MAX +}; + +#define TCA_QFQ_MAX (__TCA_QFQ_MAX - 1) + +struct tc_qfq_stats { + __u32 weight; + __u32 lmax; +}; + +/* CODEL */ + +enum { + TCA_CODEL_UNSPEC, + TCA_CODEL_TARGET, + TCA_CODEL_LIMIT, + TCA_CODEL_INTERVAL, + TCA_CODEL_ECN, + TCA_CODEL_CE_THRESHOLD, + __TCA_CODEL_MAX +}; + +#define TCA_CODEL_MAX (__TCA_CODEL_MAX - 1) + +struct tc_codel_xstats { + __u32 maxpacket; /* largest packet we've seen so far */ + __u32 count; /* how many drops we've done since the last time we + * entered dropping state + */ + __u32 lastcount; /* count at entry to dropping state */ + __u32 ldelay; /* in-queue delay seen by most recently dequeued packet */ + __s32 drop_next; /* time to drop next packet */ + __u32 drop_overlimit; /* number of time max qdisc packet limit was hit */ + __u32 ecn_mark; /* number of packets we ECN marked instead of dropped */ + __u32 dropping; /* are we in dropping state ? */ + __u32 ce_mark; /* number of CE marked packets because of ce_threshold */ +}; + +/* FQ_CODEL */ + +enum { + TCA_FQ_CODEL_UNSPEC, + TCA_FQ_CODEL_TARGET, + TCA_FQ_CODEL_LIMIT, + TCA_FQ_CODEL_INTERVAL, + TCA_FQ_CODEL_ECN, + TCA_FQ_CODEL_FLOWS, + TCA_FQ_CODEL_QUANTUM, + TCA_FQ_CODEL_CE_THRESHOLD, + TCA_FQ_CODEL_DROP_BATCH_SIZE, + TCA_FQ_CODEL_MEMORY_LIMIT, + __TCA_FQ_CODEL_MAX +}; + +#define TCA_FQ_CODEL_MAX (__TCA_FQ_CODEL_MAX - 1) + +enum { + TCA_FQ_CODEL_XSTATS_QDISC, + TCA_FQ_CODEL_XSTATS_CLASS, +}; + +struct tc_fq_codel_qd_stats { + __u32 maxpacket; /* largest packet we've seen so far */ + __u32 drop_overlimit; /* number of time max qdisc + * packet limit was hit + */ + __u32 ecn_mark; /* number of packets we ECN marked + * instead of being dropped + */ + __u32 new_flow_count; /* number of time packets + * created a 'new flow' + */ + __u32 new_flows_len; /* count of flows in new list */ + __u32 old_flows_len; /* count of flows in old list */ + __u32 ce_mark; /* packets above ce_threshold */ + __u32 memory_usage; /* in bytes */ + __u32 drop_overmemory; +}; + +struct tc_fq_codel_cl_stats { + __s32 deficit; + __u32 ldelay; /* in-queue delay seen by most recently + * dequeued packet + */ + __u32 count; + __u32 lastcount; + __u32 dropping; + __s32 drop_next; +}; + +struct tc_fq_codel_xstats { + __u32 type; + union { + struct tc_fq_codel_qd_stats qdisc_stats; + struct tc_fq_codel_cl_stats class_stats; + }; +}; + +/* FQ */ + +enum { + TCA_FQ_UNSPEC, + + TCA_FQ_PLIMIT, /* limit of total number of packets in queue */ + + TCA_FQ_FLOW_PLIMIT, /* limit of packets per flow */ + + TCA_FQ_QUANTUM, /* RR quantum */ + + TCA_FQ_INITIAL_QUANTUM, /* RR quantum for new flow */ + + TCA_FQ_RATE_ENABLE, /* enable/disable rate limiting */ + + TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */ + + TCA_FQ_FLOW_MAX_RATE, /* per flow max rate */ + + TCA_FQ_BUCKETS_LOG, /* log2(number of buckets) */ + + TCA_FQ_FLOW_REFILL_DELAY, /* flow credit refill delay in usec */ + + TCA_FQ_ORPHAN_MASK, /* mask applied to orphaned skb hashes */ + + TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */ + + TCA_FQ_CE_THRESHOLD, /* DCTCP-like CE-marking threshold */ + + __TCA_FQ_MAX +}; + +#define TCA_FQ_MAX (__TCA_FQ_MAX - 1) + +struct tc_fq_qd_stats { + __u64 gc_flows; + __u64 highprio_packets; + __u64 tcp_retrans; + __u64 throttled; + __u64 flows_plimit; + __u64 pkts_too_long; + __u64 allocation_errors; + __s64 time_next_delayed_flow; + __u32 flows; + __u32 inactive_flows; + __u32 throttled_flows; + __u32 unthrottle_latency_ns; + __u64 ce_mark; /* packets above ce_threshold */ +}; + +/* Heavy-Hitter Filter */ + +enum { + TCA_HHF_UNSPEC, + TCA_HHF_BACKLOG_LIMIT, + TCA_HHF_QUANTUM, + TCA_HHF_HH_FLOWS_LIMIT, + TCA_HHF_RESET_TIMEOUT, + TCA_HHF_ADMIT_BYTES, + TCA_HHF_EVICT_TIMEOUT, + TCA_HHF_NON_HH_WEIGHT, + __TCA_HHF_MAX +}; + +#define TCA_HHF_MAX (__TCA_HHF_MAX - 1) + +struct tc_hhf_xstats { + __u32 drop_overlimit; /* number of times max qdisc packet limit + * was hit + */ + __u32 hh_overlimit; /* number of times max heavy-hitters was hit */ + __u32 hh_tot_count; /* number of captured heavy-hitters so far */ + __u32 hh_cur_count; /* number of current heavy-hitters */ +}; + +/* PIE */ +enum { + TCA_PIE_UNSPEC, + TCA_PIE_TARGET, + TCA_PIE_LIMIT, + TCA_PIE_TUPDATE, + TCA_PIE_ALPHA, + TCA_PIE_BETA, + TCA_PIE_ECN, + TCA_PIE_BYTEMODE, + __TCA_PIE_MAX +}; +#define TCA_PIE_MAX (__TCA_PIE_MAX - 1) + +struct tc_pie_xstats { + __u32 prob; /* current probability */ + __u32 delay; /* current delay in ms */ + __u32 avg_dq_rate; /* current average dq_rate in bits/pie_time */ + __u32 packets_in; /* total number of packets enqueued */ + __u32 dropped; /* packets dropped due to pie_action */ + __u32 overlimit; /* dropped due to lack of space in queue */ + __u32 maxq; /* maximum queue size */ + __u32 ecn_mark; /* packets marked with ecn*/ +}; + +/* CBS */ +struct tc_cbs_qopt { + __u8 offload; + __u8 _pad[3]; + __s32 hicredit; + __s32 locredit; + __s32 idleslope; + __s32 sendslope; +}; + +enum { + TCA_CBS_UNSPEC, + TCA_CBS_PARMS, + __TCA_CBS_MAX, +}; + +#define TCA_CBS_MAX (__TCA_CBS_MAX - 1) + + +/* ETF */ +struct tc_etf_qopt { + __s32 delta; + __s32 clockid; + __u32 flags; +#define TC_ETF_DEADLINE_MODE_ON BIT(0) +#define TC_ETF_OFFLOAD_ON BIT(1) +}; + +enum { + TCA_ETF_UNSPEC, + TCA_ETF_PARMS, + __TCA_ETF_MAX, +}; + +#define TCA_ETF_MAX (__TCA_ETF_MAX - 1) + + +/* CAKE */ +enum { + TCA_CAKE_UNSPEC, + TCA_CAKE_PAD, + TCA_CAKE_BASE_RATE64, + TCA_CAKE_DIFFSERV_MODE, + TCA_CAKE_ATM, + TCA_CAKE_FLOW_MODE, + TCA_CAKE_OVERHEAD, + TCA_CAKE_RTT, + TCA_CAKE_TARGET, + TCA_CAKE_AUTORATE, + TCA_CAKE_MEMORY, + TCA_CAKE_NAT, + TCA_CAKE_RAW, + TCA_CAKE_WASH, + TCA_CAKE_MPU, + TCA_CAKE_INGRESS, + TCA_CAKE_ACK_FILTER, + TCA_CAKE_SPLIT_GSO, + __TCA_CAKE_MAX +}; +#define TCA_CAKE_MAX (__TCA_CAKE_MAX - 1) + +enum { + __TCA_CAKE_STATS_INVALID, + TCA_CAKE_STATS_PAD, + TCA_CAKE_STATS_CAPACITY_ESTIMATE64, + TCA_CAKE_STATS_MEMORY_LIMIT, + TCA_CAKE_STATS_MEMORY_USED, + TCA_CAKE_STATS_AVG_NETOFF, + TCA_CAKE_STATS_MIN_NETLEN, + TCA_CAKE_STATS_MAX_NETLEN, + TCA_CAKE_STATS_MIN_ADJLEN, + TCA_CAKE_STATS_MAX_ADJLEN, + TCA_CAKE_STATS_TIN_STATS, + TCA_CAKE_STATS_DEFICIT, + TCA_CAKE_STATS_COBALT_COUNT, + TCA_CAKE_STATS_DROPPING, + TCA_CAKE_STATS_DROP_NEXT_US, + TCA_CAKE_STATS_P_DROP, + TCA_CAKE_STATS_BLUE_TIMER_US, + __TCA_CAKE_STATS_MAX +}; +#define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1) + +enum { + __TCA_CAKE_TIN_STATS_INVALID, + TCA_CAKE_TIN_STATS_PAD, + TCA_CAKE_TIN_STATS_SENT_PACKETS, + TCA_CAKE_TIN_STATS_SENT_BYTES64, + TCA_CAKE_TIN_STATS_DROPPED_PACKETS, + TCA_CAKE_TIN_STATS_DROPPED_BYTES64, + TCA_CAKE_TIN_STATS_ACKS_DROPPED_PACKETS, + TCA_CAKE_TIN_STATS_ACKS_DROPPED_BYTES64, + TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS, + TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64, + TCA_CAKE_TIN_STATS_BACKLOG_PACKETS, + TCA_CAKE_TIN_STATS_BACKLOG_BYTES, + TCA_CAKE_TIN_STATS_THRESHOLD_RATE64, + TCA_CAKE_TIN_STATS_TARGET_US, + TCA_CAKE_TIN_STATS_INTERVAL_US, + TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS, + TCA_CAKE_TIN_STATS_WAY_MISSES, + TCA_CAKE_TIN_STATS_WAY_COLLISIONS, + TCA_CAKE_TIN_STATS_PEAK_DELAY_US, + TCA_CAKE_TIN_STATS_AVG_DELAY_US, + TCA_CAKE_TIN_STATS_BASE_DELAY_US, + TCA_CAKE_TIN_STATS_SPARSE_FLOWS, + TCA_CAKE_TIN_STATS_BULK_FLOWS, + TCA_CAKE_TIN_STATS_UNRESPONSIVE_FLOWS, + TCA_CAKE_TIN_STATS_MAX_SKBLEN, + TCA_CAKE_TIN_STATS_FLOW_QUANTUM, + __TCA_CAKE_TIN_STATS_MAX +}; +#define TCA_CAKE_TIN_STATS_MAX (__TCA_CAKE_TIN_STATS_MAX - 1) +#define TC_CAKE_MAX_TINS (8) + +enum { + CAKE_FLOW_NONE = 0, + CAKE_FLOW_SRC_IP, + CAKE_FLOW_DST_IP, + CAKE_FLOW_HOSTS, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_DST_IP */ + CAKE_FLOW_FLOWS, + CAKE_FLOW_DUAL_SRC, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_FLOWS */ + CAKE_FLOW_DUAL_DST, /* = CAKE_FLOW_DST_IP | CAKE_FLOW_FLOWS */ + CAKE_FLOW_TRIPLE, /* = CAKE_FLOW_HOSTS | CAKE_FLOW_FLOWS */ + CAKE_FLOW_MAX, +}; + +enum { + CAKE_DIFFSERV_DIFFSERV3 = 0, + CAKE_DIFFSERV_DIFFSERV4, + CAKE_DIFFSERV_DIFFSERV8, + CAKE_DIFFSERV_BESTEFFORT, + CAKE_DIFFSERV_PRECEDENCE, + CAKE_DIFFSERV_MAX +}; + +enum { + CAKE_ACK_NONE = 0, + CAKE_ACK_FILTER, + CAKE_ACK_AGGRESSIVE, + CAKE_ACK_MAX +}; + +enum { + CAKE_ATM_NONE = 0, + CAKE_ATM_ATM, + CAKE_ATM_PTM, + CAKE_ATM_MAX +}; + + +/* TAPRIO */ +enum { + TC_TAPRIO_CMD_SET_GATES = 0x00, + TC_TAPRIO_CMD_SET_AND_HOLD = 0x01, + TC_TAPRIO_CMD_SET_AND_RELEASE = 0x02, +}; + +enum { + TCA_TAPRIO_SCHED_ENTRY_UNSPEC, + TCA_TAPRIO_SCHED_ENTRY_INDEX, /* u32 */ + TCA_TAPRIO_SCHED_ENTRY_CMD, /* u8 */ + TCA_TAPRIO_SCHED_ENTRY_GATE_MASK, /* u32 */ + TCA_TAPRIO_SCHED_ENTRY_INTERVAL, /* u32 */ + __TCA_TAPRIO_SCHED_ENTRY_MAX, +}; +#define TCA_TAPRIO_SCHED_ENTRY_MAX (__TCA_TAPRIO_SCHED_ENTRY_MAX - 1) + +/* The format for schedule entry list is: + * [TCA_TAPRIO_SCHED_ENTRY_LIST] + * [TCA_TAPRIO_SCHED_ENTRY] + * [TCA_TAPRIO_SCHED_ENTRY_CMD] + * [TCA_TAPRIO_SCHED_ENTRY_GATES] + * [TCA_TAPRIO_SCHED_ENTRY_INTERVAL] + */ +enum { + TCA_TAPRIO_SCHED_UNSPEC, + TCA_TAPRIO_SCHED_ENTRY, + __TCA_TAPRIO_SCHED_MAX, +}; + +#define TCA_TAPRIO_SCHED_MAX (__TCA_TAPRIO_SCHED_MAX - 1) + +enum { + TCA_TAPRIO_ATTR_UNSPEC, + TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */ + TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST, /* nested of entry */ + TCA_TAPRIO_ATTR_SCHED_BASE_TIME, /* s64 */ + TCA_TAPRIO_ATTR_SCHED_SINGLE_ENTRY, /* single entry */ + TCA_TAPRIO_ATTR_SCHED_CLOCKID, /* s32 */ + TCA_TAPRIO_PAD, + __TCA_TAPRIO_ATTR_MAX, +}; + +#define TCA_TAPRIO_ATTR_MAX (__TCA_TAPRIO_ATTR_MAX - 1) + +#endif diff --git a/bpftool/include/uapi/linux/tc_act/tc_bpf.h b/bpftool/include/uapi/linux/tc_act/tc_bpf.h new file mode 100644 index 0000000..fe6c8f8 --- /dev/null +++ b/bpftool/include/uapi/linux/tc_act/tc_bpf.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ +/* + * Copyright (c) 2015 Jiri Pirko + */ + +#ifndef __LINUX_TC_BPF_H +#define __LINUX_TC_BPF_H + +#include + +struct tc_act_bpf { + tc_gen; +}; + +enum { + TCA_ACT_BPF_UNSPEC, + TCA_ACT_BPF_TM, + TCA_ACT_BPF_PARMS, + TCA_ACT_BPF_OPS_LEN, + TCA_ACT_BPF_OPS, + TCA_ACT_BPF_FD, + TCA_ACT_BPF_NAME, + TCA_ACT_BPF_PAD, + TCA_ACT_BPF_TAG, + TCA_ACT_BPF_ID, + __TCA_ACT_BPF_MAX, +}; +#define TCA_ACT_BPF_MAX (__TCA_ACT_BPF_MAX - 1) + +#endif diff --git a/bpftool/libbpf/.readthedocs.yaml b/bpftool/libbpf/.readthedocs.yaml new file mode 100644 index 0000000..803dfa2 --- /dev/null +++ b/bpftool/libbpf/.readthedocs.yaml @@ -0,0 +1,22 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Build documentation in the docs/ directory with Sphinx +sphinx: + builder: html + configuration: docs/conf.py + +formats: + - htmlzip + - pdf + - epub + +# Optionally set the version of Python and requirements required to build your docs +python: + version: 3.7 + install: + - requirements: docs/sphinx/requirements.txt \ No newline at end of file diff --git a/bpftool/libbpf/BPF-CHECKPOINT-COMMIT b/bpftool/libbpf/BPF-CHECKPOINT-COMMIT new file mode 100644 index 0000000..7ff5325 --- /dev/null +++ b/bpftool/libbpf/BPF-CHECKPOINT-COMMIT @@ -0,0 +1 @@ +3a70e0d4c9d74cb00f7c0ec022f5599f9f7ba07d diff --git a/bpftool/libbpf/CHECKPOINT-COMMIT b/bpftool/libbpf/CHECKPOINT-COMMIT new file mode 100644 index 0000000..d9cb47c --- /dev/null +++ b/bpftool/libbpf/CHECKPOINT-COMMIT @@ -0,0 +1 @@ +951bce29c8988209cc359e1fa35a4aaa35542fd5 diff --git a/bpftool/libbpf/LICENSE b/bpftool/libbpf/LICENSE new file mode 100644 index 0000000..d38fed3 --- /dev/null +++ b/bpftool/libbpf/LICENSE @@ -0,0 +1 @@ +LGPL-2.1 OR BSD-2-Clause diff --git a/bpftool/libbpf/LICENSE.BSD-2-Clause b/bpftool/libbpf/LICENSE.BSD-2-Clause new file mode 100644 index 0000000..bce40aa --- /dev/null +++ b/bpftool/libbpf/LICENSE.BSD-2-Clause @@ -0,0 +1,32 @@ +Valid-License-Identifier: BSD-2-Clause +SPDX-URL: https://spdx.org/licenses/BSD-2-Clause.html +Usage-Guide: + To use the BSD 2-clause "Simplified" License put the following SPDX + tag/value pair into a comment according to the placement guidelines in + the licensing rules documentation: + SPDX-License-Identifier: BSD-2-Clause +License-Text: + +Copyright (c) 2015 The Libbpf Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/bpftool/libbpf/LICENSE.LGPL-2.1 b/bpftool/libbpf/LICENSE.LGPL-2.1 new file mode 100644 index 0000000..27bb434 --- /dev/null +++ b/bpftool/libbpf/LICENSE.LGPL-2.1 @@ -0,0 +1,503 @@ +Valid-License-Identifier: LGPL-2.1 +Valid-License-Identifier: LGPL-2.1+ +SPDX-URL: https://spdx.org/licenses/LGPL-2.1.html +Usage-Guide: + To use this license in source code, put one of the following SPDX + tag/value pairs into a comment according to the placement + guidelines in the licensing rules documentation. + For 'GNU Lesser General Public License (LGPL) version 2.1 only' use: + SPDX-License-Identifier: LGPL-2.1 + For 'GNU Lesser General Public License (LGPL) version 2.1 or any later + version' use: + SPDX-License-Identifier: LGPL-2.1+ +License-Text: + +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts as +the successor of the GNU Library Public License, version 2, hence the +version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public Licenses are +intended to guarantee your freedom to share and change free software--to +make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially +designated software packages--typically libraries--of the Free Software +Foundation and other authors who decide to use it. You can use it too, but +we suggest you first think carefully about whether this license or the +ordinary General Public License is the better strategy to use in any +particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not +price. Our General Public Licenses are designed to make sure that you have +the freedom to distribute copies of free software (and charge for this +service if you wish); that you receive source code or can get it if you +want it; that you can change the software and use pieces of it in new free +programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for you if +you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for +a fee, you must give the recipients all the rights that we gave you. You +must make sure that they, too, receive or can get the source code. If you +link other code with the library, you must provide complete object files to +the recipients, so that they can relink them with the library after making +changes to the library and recompiling it. And you must show them these +terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no +warranty for the free library. Also, if the library is modified by someone +else and passed on, the recipients should know that what they have is not +the original version, so that the original author's reputation will not be +affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any +free program. We wish to make sure that a company cannot effectively +restrict the users of a free program by obtaining a restrictive license +from a patent holder. Therefore, we insist that any patent license obtained +for a version of the library must be consistent with the full freedom of +use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU +General Public License. This license, the GNU Lesser General Public +License, applies to certain designated libraries, and is quite different +from the ordinary General Public License. We use this license for certain +libraries in order to permit linking those libraries into non-free +programs. + +When a program is linked with a library, whether statically or using a +shared library, the combination of the two is legally speaking a combined +work, a derivative of the original library. The ordinary General Public +License therefore permits such linking only if the entire combination fits +its criteria of freedom. The Lesser General Public License permits more lax +criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does +Less to protect the user's freedom than the ordinary General Public +License. It also provides other free software developers Less of an +advantage over competing non-free programs. These disadvantages are the +reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + +For example, on rare occasions, there may be a special need to encourage +the widest possible use of a certain library, so that it becomes a de-facto +standard. To achieve this, non-free programs must be allowed to use the +library. A more frequent case is that a free library does the same job as +widely used non-free libraries. In this case, there is little to gain by +limiting the free library to free software only, so we use the Lesser +General Public License. + +In other cases, permission to use a particular library in non-free programs +enables a greater number of people to use a large body of free +software. For example, permission to use the GNU C Library in non-free +programs enables many more people to use the whole GNU operating system, as +well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' +freedom, it does ensure that the user of a program that is linked with the +Library has the freedom and the wherewithal to run that program using a +modified version of the Library. + +The precise terms and conditions for copying, distribution and modification +follow. Pay close attention to the difference between a "work based on the +library" and a "work that uses the library". The former contains code +derived from the library, whereas the latter must be combined with the +library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program + which contains a notice placed by the copyright holder or other + authorized party saying it may be distributed under the terms of this + Lesser General Public License (also called "this License"). Each + licensee is addressed as "you". + + A "library" means a collection of software functions and/or data + prepared so as to be conveniently linked with application programs + (which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work which + has been distributed under these terms. A "work based on the Library" + means either the Library or any derivative work under copyright law: + that is to say, a work containing the Library or a portion of it, either + verbatim or with modifications and/or translated straightforwardly into + another language. (Hereinafter, translation is included without + limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for making + modifications to it. For a library, complete source code means all the + source code for all modules it contains, plus any associated interface + definition files, plus the scripts used to control compilation and + installation of the library. + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of running + a program using the Library is not restricted, and output from such a + program is covered only if its contents constitute a work based on the + Library (independent of the use of the Library in a tool for writing + it). Whether that is true depends on what the Library does and what the + program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the notices + that refer to this License and to the absence of any warranty; and + distribute a copy of this License along with the Library. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, + thus forming a work based on the Library, and copy and distribute such + modifications or work under the terms of Section 1 above, provided that + you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices stating + that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no charge to + all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a table + of data to be supplied by an application program that uses the + facility, other than as an argument passed when the facility is + invoked, then you must make a good faith effort to ensure that, in + the event an application does not supply such function or table, the + facility still operates, and performs whatever part of its purpose + remains meaningful. + + (For example, a function in a library to compute square roots has a + purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must be + optional: if the application does not supply it, the square root + function must still compute square roots.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Library, and + can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based on + the Library, the distribution of the whole must be on the terms of this + License, whose permissions for other licensees extend to the entire + whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Library. + + In addition, mere aggregation of another work not based on the Library + with the Library (or with a work based on the Library) on a volume of a + storage or distribution medium does not bring the other work under the + scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public + License instead of this License to a given copy of the Library. To do + this, you must alter all the notices that refer to this License, so that + they refer to the ordinary GNU General Public License, version 2, + instead of to this License. (If a newer version than version 2 of the + ordinary GNU General Public License has appeared, then you can specify + that version instead if you wish.) Do not make any other change in these + notices. + + Once this change is made in a given copy, it is irreversible for that + copy, so the ordinary GNU General Public License applies to all + subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of the + Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of + it, under Section 2) in object code or executable form under the terms + of Sections 1 and 2 above provided that you accompany it with the + complete corresponding machine-readable source code, which must be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange. + + If distribution of object code is made by offering access to copy from a + designated place, then offering equivalent access to copy the source + code from the same place satisfies the requirement to distribute the + source code, even though third parties are not compelled to copy the + source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but + is designed to work with the Library by being compiled or linked with + it, is called a "work that uses the Library". Such a work, in isolation, + is not a derivative work of the Library, and therefore falls outside the + scope of this License. + + However, linking a "work that uses the Library" with the Library creates + an executable that is a derivative of the Library (because it contains + portions of the Library), rather than a "work that uses the + library". The executable is therefore covered by this License. Section 6 + states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file + that is part of the Library, the object code for the work may be a + derivative work of the Library even though the source code is + not. Whether this is true is especially significant if the work can be + linked without the Library, or if the work is itself a library. The + threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data structure + layouts and accessors, and small macros and small inline functions (ten + lines or less in length), then the use of the object file is + unrestricted, regardless of whether it is legally a derivative + work. (Executables containing this object code plus portions of the + Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may + distribute the object code for the work under the terms of Section + 6. Any executables containing that work also fall under Section 6, + whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a + "work that uses the Library" with the Library to produce a work + containing portions of the Library, and distribute that work under terms + of your choice, provided that the terms permit modification of the work + for the customer's own use and reverse engineering for debugging such + modifications. + + You must give prominent notice with each copy of the work that the + Library is used in it and that the Library and its use are covered by + this License. You must supply a copy of this License. If the work during + execution displays copyright notices, you must include the copyright + notice for the Library among them, as well as a reference directing the + user to the copy of this License. Also, you must do one of these things: + + a) Accompany the work with the complete corresponding machine-readable + source code for the Library including whatever changes were used in + the work (which must be distributed under Sections 1 and 2 above); + and, if the work is an executable linked with the Library, with the + complete machine-readable "work that uses the Library", as object + code and/or source code, so that the user can modify the Library and + then relink to produce a modified executable containing the modified + Library. (It is understood that the user who changes the contents of + definitions files in the Library will not necessarily be able to + recompile the application to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a copy + of the library already present on the user's computer system, rather + than copying library functions into the executable, and (2) will + operate properly with a modified version of the library, if the user + installs one, as long as the modified version is interface-compatible + with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at least three + years, to give the same user the materials specified in Subsection + 6a, above, for a charge no more than the cost of performing this + distribution. + + d) If distribution of the work is made by offering access to copy from a + designated place, offer equivalent access to copy the above specified + materials from the same place. + + e) Verify that the user has already received a copy of these materials + or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the Library" + must include any data and utility programs needed for reproducing the + executable from it. However, as a special exception, the materials to be + distributed need not include anything that is normally distributed (in + either source or binary form) with the major components (compiler, + kernel, and so on) of the operating system on which the executable runs, + unless that component itself accompanies the executable. + + It may happen that this requirement contradicts the license restrictions + of other proprietary libraries that do not normally accompany the + operating system. Such a contradiction means you cannot use both them + and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library + side-by-side in a single library together with other library facilities + not covered by this License, and distribute such a combined library, + provided that the separate distribution of the work based on the Library + and of the other library facilities is otherwise permitted, and provided + that you do these two things: + + a) Accompany the combined library with a copy of the same work based on + the Library, uncombined with any other library facilities. This must + be distributed under the terms of the Sections above. + + b) Give prominent notice with the combined library of the fact that part + of it is a work based on the Library, and explaining where to find + the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the + Library except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, link with, or distribute the + Library is void, and will automatically terminate your rights under this + License. However, parties who have received copies, or rights, from you + under this License will not have their licenses terminated so long as + such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed + it. However, nothing else grants you permission to modify or distribute + the Library or its derivative works. These actions are prohibited by law + if you do not accept this License. Therefore, by modifying or + distributing the Library (or any work based on the Library), you + indicate your acceptance of this License to do so, and all its terms and + conditions for copying, distributing or modifying the Library or works + based on it. + +10. Each time you redistribute the Library (or any work based on the + Library), the recipient automatically receives a license from the + original licensor to copy, distribute, link with or modify the Library + subject to these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted + herein. You are not responsible for enforcing compliance by third + parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Library at all. For example, if a patent license + would not permit royalty-free redistribution of the Library by all + those who receive copies directly or indirectly through you, then the + only way you could satisfy both it and this License would be to refrain + entirely from distribution of the Library. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply, and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system which is implemented + by public license practices. Many people have made generous + contributions to the wide range of software distributed through that + system in reliance on consistent application of that system; it is up + to the author/donor to decide if he or she is willing to distribute + software through any other system and a licensee cannot impose that + choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain + countries either by patents or by copyrighted interfaces, the original + copyright holder who places the Library under this License may add an + explicit geographical distribution limitation excluding those + countries, so that distribution is permitted only in or among countries + not thus excluded. In such case, this License incorporates the + limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of + the Lesser General Public License from time to time. Such new versions + will be similar in spirit to the present version, but may differ in + detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the Library + specifies a version number of this License which applies to it and "any + later version", you have the option of following the terms and + conditions either of that version or of any later version published by + the Free Software Foundation. If the Library does not specify a license + version number, you may choose any version ever published by the Free + Software Foundation. + +14. If you wish to incorporate parts of the Library into other free + programs whose distribution conditions are incompatible with these, + write to the author to ask for permission. For software which is + copyrighted by the Free Software Foundation, write to the Free Software + Foundation; we sometimes make exceptions for this. Our decision will be + guided by the two goals of preserving the free status of all + derivatives of our free software and of promoting the sharing and reuse + of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE + ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH + YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL + NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR + DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL + DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY + (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED + INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF + THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR + OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + +To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + +one line to give the library's name and an idea of what it does. +Copyright (C) year name of author + +This library is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at +your option) any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License +for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add +information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in +the library `Frob' (a library for tweaking knobs) written +by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice +That's all there is to it! diff --git a/bpftool/libbpf/README.md b/bpftool/libbpf/README.md new file mode 100644 index 0000000..9861b16 --- /dev/null +++ b/bpftool/libbpf/README.md @@ -0,0 +1,189 @@ + + + + + +libbpf +[![Github Actions Builds & Tests](https://github.com/libbpf/libbpf/actions/workflows/test.yml/badge.svg)](https://github.com/libbpf/libbpf/actions/workflows/test.yml) +[![Coverity](https://img.shields.io/coverity/scan/18195.svg)](https://scan.coverity.com/projects/libbpf) +[![CodeQL](https://github.com/libbpf/libbpf/workflows/CodeQL/badge.svg?branch=master)](https://github.com/libbpf/libbpf/actions?query=workflow%3ACodeQL+branch%3Amaster) +[![OSS-Fuzz Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/libbpf.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html#libbpf) +[![Read the Docs](https://readthedocs.org/projects/libbpf/badge/?version=latest)](https://libbpf.readthedocs.io/en/latest/) +====== + +**This is the official home of the libbpf library.** + +*Please use this Github repository for building and packaging libbpf +and when using it in your projects through Git submodule.* + +Libbpf *authoritative source code* is developed as part of [bpf-next Linux source +tree](https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next) under +`tools/lib/bpf` subdirectory and is periodically synced to Github. As such, all the +libbpf changes should be sent to [BPF mailing list](http://vger.kernel.org/vger-lists.html#bpf), +please don't open PRs here unless you are changing Github-specific parts of libbpf +(e.g., Github-specific Makefile). + +Libbpf and general BPF usage questions +====================================== + +Libbpf documentation can be found [here](https://libbpf.readthedocs.io/en/latest/api.html). +It's an ongoing effort and has ways to go, but please take a look and consider contributing as well. + +Please check out [libbpf-bootstrap](https://github.com/libbpf/libbpf-bootstrap) +and [the companion blog post](https://nakryiko.com/posts/libbpf-bootstrap/) for +the examples of building BPF applications with libbpf. +[libbpf-tools](https://github.com/iovisor/bcc/tree/master/libbpf-tools) are also +a good source of the real-world libbpf-based tracing tools. + +See also ["BPF CO-RE reference guide"](https://nakryiko.com/posts/bpf-core-reference-guide/) +for the coverage of practical aspects of building BPF CO-RE applications and +["BPF CO-RE"](https://nakryiko.com/posts/bpf-portability-and-co-re/) for +general introduction into BPF portability issues and BPF CO-RE origins. + +All general BPF questions, including kernel functionality, libbpf APIs and +their application, should be sent to bpf@vger.kernel.org mailing list. You can +subscribe to it [here](http://vger.kernel.org/vger-lists.html#bpf) and search +its archive [here](https://lore.kernel.org/bpf/). Please search the archive +before asking new questions. It very well might be that this was already +addressed or answered before. + +bpf@vger.kernel.org is monitored by many more people and they will happily try +to help you with whatever issue you have. This repository's PRs and issues +should be opened only for dealing with issues pertaining to specific way this +libbpf mirror repo is set up and organized. + +Building libbpf +=============== +libelf is an internal dependency of libbpf and thus it is required to link +against and must be installed on the system for applications to work. +pkg-config is used by default to find libelf, and the program called can be +overridden with `PKG_CONFIG`. + +If using `pkg-config` at build time is not desired, it can be disabled by +setting `NO_PKG_CONFIG=1` when calling make. + +To build both static libbpf.a and shared libbpf.so: +```bash +$ cd src +$ make +``` + +To build only static libbpf.a library in directory +build/ and install them together with libbpf headers in a staging directory +root/: +```bash +$ cd src +$ mkdir build root +$ BUILD_STATIC_ONLY=y OBJDIR=build DESTDIR=root make install +``` + +To build both static libbpf.a and shared libbpf.so against a custom libelf +dependency installed in /build/root/ and install them together with libbpf +headers in a build directory /build/root/: +```bash +$ cd src +$ PKG_CONFIG_PATH=/build/root/lib64/pkgconfig DESTDIR=/build/root make install +``` + +BPF CO-RE (Compile Once – Run Everywhere) +========================================= + +Libbpf supports building BPF CO-RE-enabled applications, which, in contrast to +[BCC](https://github.com/iovisor/bcc/), do not require Clang/LLVM runtime +being deployed to target servers and doesn't rely on kernel-devel headers +being available. + +It does rely on kernel to be built with [BTF type +information](https://www.kernel.org/doc/html/latest/bpf/btf.html), though. +Some major Linux distributions come with kernel BTF already built in: + - Fedora 31+ + - RHEL 8.2+ + - OpenSUSE Tumbleweed (in the next release, as of 2020-06-04) + - Arch Linux (from kernel 5.7.1.arch1-1) + - Manjaro (from kernel 5.4 if compiled after 2021-06-18) + - Ubuntu 20.10 + - Debian 11 (amd64/arm64) + +If your kernel doesn't come with BTF built-in, you'll need to build custom +kernel. You'll need: + - `pahole` 1.16+ tool (part of `dwarves` package), which performs DWARF to + BTF conversion; + - kernel built with `CONFIG_DEBUG_INFO_BTF=y` option; + - you can check if your kernel has BTF built-in by looking for + `/sys/kernel/btf/vmlinux` file: + +```shell +$ ls -la /sys/kernel/btf/vmlinux +-r--r--r--. 1 root root 3541561 Jun 2 18:16 /sys/kernel/btf/vmlinux +``` + +To develop and build BPF programs, you'll need Clang/LLVM 10+. The following +distributions have Clang/LLVM 10+ packaged by default: + - Fedora 32+ + - Ubuntu 20.04+ + - Arch Linux + - Ubuntu 20.10 (LLVM 11) + - Debian 11 (LLVM 11) + - Alpine 3.13+ + +Otherwise, please make sure to update it on your system. + +The following resources are useful to understand what BPF CO-RE is and how to +use it: +- [BPF CO-RE reference guide](https://nakryiko.com/posts/bpf-core-reference-guide/) +- [BPF Portability and CO-RE](https://nakryiko.com/posts/bpf-portability-and-co-re/) +- [HOWTO: BCC to libbpf conversion](https://nakryiko.com/posts/bcc-to-libbpf-howto-guide/) +- [libbpf-tools in BCC repo](https://github.com/iovisor/bcc/tree/master/libbpf-tools) + contain lots of real-world tools converted from BCC to BPF CO-RE. Consider + converting some more to both contribute to the BPF community and gain some + more experience with it. + +Distributions +============= + +Distributions packaging libbpf from this mirror: + - [Fedora](https://src.fedoraproject.org/rpms/libbpf) + - [Gentoo](https://packages.gentoo.org/packages/dev-libs/libbpf) + - [Debian](https://packages.debian.org/source/sid/libbpf) + - [Arch](https://archlinux.org/packages/core/x86_64/libbpf/) + - [Ubuntu](https://packages.ubuntu.com/source/impish/libbpf) + - [Alpine](https://pkgs.alpinelinux.org/packages?name=libbpf) + +Benefits of packaging from the mirror over packaging from kernel sources: + - Consistent versioning across distributions. + - No ties to any specific kernel, transparent handling of older kernels. + Libbpf is designed to be kernel-agnostic and work across multitude of + kernel versions. It has built-in mechanisms to gracefully handle older + kernels, that are missing some of the features, by working around or + gracefully degrading functionality. Thus libbpf is not tied to a specific + kernel version and can/should be packaged and versioned independently. + - Continuous integration testing via + [GitHub Actions](https://github.com/libbpf/libbpf/actions). + - Static code analysis via [LGTM](https://lgtm.com/projects/g/libbpf/libbpf) + and [Coverity](https://scan.coverity.com/projects/libbpf). + +Package dependencies of libbpf, package names may vary across distros: + - zlib + - libelf + +[![libbpf distro packaging status](https://repology.org/badge/vertical-allrepos/libbpf.svg)](https://repology.org/project/libbpf/versions) + + +bpf-next to Github sync +======================= + +All the gory details of syncing can be found in `scripts/sync-kernel.sh` +script. + +Some header files in this repo (`include/linux/*.h`) are reduced versions of +their counterpart files at +[bpf-next](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/)'s +`tools/include/linux/*.h` to make compilation successful. + +License +======= + +This work is dual-licensed under BSD 2-clause license and GNU LGPL v2.1 license. +You can choose between one of them if you use this work. + +`SPDX-License-Identifier: BSD-2-Clause OR LGPL-2.1` diff --git a/bpftool/libbpf/assets/libbpf-logo-compact-darkbg.png b/bpftool/libbpf/assets/libbpf-logo-compact-darkbg.png new file mode 100644 index 0000000..aaef60e Binary files /dev/null and b/bpftool/libbpf/assets/libbpf-logo-compact-darkbg.png differ diff --git a/bpftool/libbpf/assets/libbpf-logo-compact-mono.png b/bpftool/libbpf/assets/libbpf-logo-compact-mono.png new file mode 100644 index 0000000..51daed1 Binary files /dev/null and b/bpftool/libbpf/assets/libbpf-logo-compact-mono.png differ diff --git a/bpftool/libbpf/assets/libbpf-logo-compact.png b/bpftool/libbpf/assets/libbpf-logo-compact.png new file mode 100644 index 0000000..99ae3ab Binary files /dev/null and b/bpftool/libbpf/assets/libbpf-logo-compact.png differ diff --git a/bpftool/libbpf/assets/libbpf-logo-sideways-darkbg.png b/bpftool/libbpf/assets/libbpf-logo-sideways-darkbg.png new file mode 100644 index 0000000..00d6d83 Binary files /dev/null and b/bpftool/libbpf/assets/libbpf-logo-sideways-darkbg.png differ diff --git a/bpftool/libbpf/assets/libbpf-logo-sideways-mono.png b/bpftool/libbpf/assets/libbpf-logo-sideways-mono.png new file mode 100644 index 0000000..82f1ce5 Binary files /dev/null and b/bpftool/libbpf/assets/libbpf-logo-sideways-mono.png differ diff --git a/bpftool/libbpf/assets/libbpf-logo-sideways.png b/bpftool/libbpf/assets/libbpf-logo-sideways.png new file mode 100644 index 0000000..48186c3 Binary files /dev/null and b/bpftool/libbpf/assets/libbpf-logo-sideways.png differ diff --git a/bpftool/libbpf/assets/libbpf-logo-sparse-darkbg.png b/bpftool/libbpf/assets/libbpf-logo-sparse-darkbg.png new file mode 100644 index 0000000..5e57430 Binary files /dev/null and b/bpftool/libbpf/assets/libbpf-logo-sparse-darkbg.png differ diff --git a/bpftool/libbpf/assets/libbpf-logo-sparse-mono.png b/bpftool/libbpf/assets/libbpf-logo-sparse-mono.png new file mode 100644 index 0000000..b02d432 Binary files /dev/null and b/bpftool/libbpf/assets/libbpf-logo-sparse-mono.png differ diff --git a/bpftool/libbpf/assets/libbpf-logo-sparse.png b/bpftool/libbpf/assets/libbpf-logo-sparse.png new file mode 100644 index 0000000..a306588 Binary files /dev/null and b/bpftool/libbpf/assets/libbpf-logo-sparse.png differ diff --git a/bpftool/libbpf/ci/diffs/.keep b/bpftool/libbpf/ci/diffs/.keep new file mode 100644 index 0000000..e69de29 diff --git a/bpftool/libbpf/ci/diffs/0001-s390-define-RUNTIME_DISCARD_EXIT-to-fix-link-error-w.patch b/bpftool/libbpf/ci/diffs/0001-s390-define-RUNTIME_DISCARD_EXIT-to-fix-link-error-w.patch new file mode 100644 index 0000000..2f8d84f --- /dev/null +++ b/bpftool/libbpf/ci/diffs/0001-s390-define-RUNTIME_DISCARD_EXIT-to-fix-link-error-w.patch @@ -0,0 +1,70 @@ +From 6fba14e2ed9d159f76b23fa5c16f3ea99acbc003 Mon Sep 17 00:00:00 2001 +From: Masahiro Yamada +Date: Thu, 5 Jan 2023 12:13:06 +0900 +Subject: [PATCH] s390: define RUNTIME_DISCARD_EXIT to fix link error with GNU + ld < 2.36 + +Nathan Chancellor reports that the s390 vmlinux fails to link with +GNU ld < 2.36 since commit 99cb0d917ffa ("arch: fix broken BuildID +for arm64 and riscv"). + +It happens for defconfig, or more specifically for CONFIG_EXPOLINE=y. + + $ s390x-linux-gnu-ld --version | head -n1 + GNU ld (GNU Binutils for Debian) 2.35.2 + $ make -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- allnoconfig + $ ./scripts/config -e CONFIG_EXPOLINE + $ make -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- olddefconfig + $ make -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- + `.exit.text' referenced in section `.s390_return_reg' of drivers/base/dd.o: defined in discarded section `.exit.text' of drivers/base/dd.o + make[1]: *** [scripts/Makefile.vmlinux:34: vmlinux] Error 1 + make: *** [Makefile:1252: vmlinux] Error 2 + +arch/s390/kernel/vmlinux.lds.S wants to keep EXIT_TEXT: + + .exit.text : { + EXIT_TEXT + } + +But, at the same time, EXIT_TEXT is thrown away by DISCARD because +s390 does not define RUNTIME_DISCARD_EXIT. + +I still do not understand why the latter wins after 99cb0d917ffa, +but defining RUNTIME_DISCARD_EXIT seems correct because the comment +line in arch/s390/kernel/vmlinux.lds.S says: + + /* + * .exit.text is discarded at runtime, not link time, + * to deal with references from __bug_table + */ + +Nathan also found that binutils commit 21401fc7bf67 ("Duplicate output +sections in scripts") cured this issue, so we cannot reproduce it with +binutils 2.36+, but it is better to not rely on it. + +Fixes: 99cb0d917ffa ("arch: fix broken BuildID for arm64 and riscv") +Link: https://lore.kernel.org/all/Y7Jal56f6UBh1abE@dev-arch.thelio-3990X/ +Reported-by: Nathan Chancellor +Signed-off-by: Masahiro Yamada +Link: https://lore.kernel.org/r/20230105031306.1455409-1-masahiroy@kernel.org +Signed-off-by: Heiko Carstens +--- + arch/s390/kernel/vmlinux.lds.S | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S +index 5ea3830af0cc..6e101e6f499d 100644 +--- a/arch/s390/kernel/vmlinux.lds.S ++++ b/arch/s390/kernel/vmlinux.lds.S +@@ -17,6 +17,8 @@ + /* Handle ro_after_init data on our own. */ + #define RO_AFTER_INIT_DATA + ++#define RUNTIME_DISCARD_EXIT ++ + #define EMITS_PT_NOTE + + #include +-- +2.30.2 + diff --git a/bpftool/libbpf/ci/diffs/0001-selftests-bpf-Select-CONFIG_FUNCTION_ERROR_INJECTION.patch b/bpftool/libbpf/ci/diffs/0001-selftests-bpf-Select-CONFIG_FUNCTION_ERROR_INJECTION.patch new file mode 100644 index 0000000..3ee42c6 --- /dev/null +++ b/bpftool/libbpf/ci/diffs/0001-selftests-bpf-Select-CONFIG_FUNCTION_ERROR_INJECTION.patch @@ -0,0 +1,46 @@ +From a8dfde09c90109e3a98af54847e91bde7dc2d5c2 Mon Sep 17 00:00:00 2001 +From: Song Liu +Date: Tue, 13 Dec 2022 14:05:00 -0800 +Subject: [PATCH] selftests/bpf: Select CONFIG_FUNCTION_ERROR_INJECTION +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +BPF selftests require CONFIG_FUNCTION_ERROR_INJECTION to work. However, +CONFIG_FUNCTION_ERROR_INJECTION is no longer 'y' by default after recent +changes. As a result, we are seeing errors like the following from BPF CI: + + bpf_testmod_test_read() is not modifiable + __x64_sys_setdomainname is not sleepable + __x64_sys_getpgid is not sleepable + +Fix this by explicitly selecting CONFIG_FUNCTION_ERROR_INJECTION in the +selftest config. + +Fixes: a4412fdd49dc ("error-injection: Add prompt for function error injection") +Reported-by: Daniel Müller +Signed-off-by: Song Liu +Signed-off-by: Andrii Nakryiko +Signed-off-by: Daniel Borkmann +Acked-by: Daniel Müller +Link: https://lore.kernel.org/bpf/20221213220500.3427947-1-song@kernel.org +Signed-off-by: Daniel Müller +--- + tools/testing/selftests/bpf/config | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tools/testing/selftests/bpf/config b/tools/testing/selftests/bpf/config +index 612f69..63cd4a 100644 +--- a/tools/testing/selftests/bpf/config ++++ b/tools/testing/selftests/bpf/config +@@ -16,6 +16,7 @@ CONFIG_CRYPTO_USER_API_HASH=y + CONFIG_DYNAMIC_FTRACE=y + CONFIG_FPROBE=y + CONFIG_FTRACE_SYSCALLS=y ++CONFIG_FUNCTION_ERROR_INJECTION=y + CONFIG_FUNCTION_TRACER=y + CONFIG_GENEVE=y + CONFIG_IKCONFIG=y +-- +2.30.2 + diff --git a/bpftool/libbpf/ci/managers/debian.sh b/bpftool/libbpf/ci/managers/debian.sh new file mode 100755 index 0000000..3d3f860 --- /dev/null +++ b/bpftool/libbpf/ci/managers/debian.sh @@ -0,0 +1,95 @@ +#!/bin/bash + +PHASES=(${@:-SETUP RUN RUN_ASAN CLEANUP}) +DEBIAN_RELEASE="${DEBIAN_RELEASE:-testing}" +CONT_NAME="${CONT_NAME:-libbpf-debian-$DEBIAN_RELEASE}" +ENV_VARS="${ENV_VARS:-}" +DOCKER_RUN="${DOCKER_RUN:-docker run}" +REPO_ROOT="${REPO_ROOT:-$PWD}" +ADDITIONAL_DEPS=(pkgconf) +EXTRA_CFLAGS="" +EXTRA_LDFLAGS="" + +function info() { + echo -e "\033[33;1m$1\033[0m" +} + +function error() { + echo -e "\033[31;1m$1\033[0m" +} + +function docker_exec() { + docker exec $ENV_VARS $CONT_NAME "$@" +} + +set -eu + +source "$(dirname $0)/travis_wait.bash" + +for phase in "${PHASES[@]}"; do + case $phase in + SETUP) + info "Setup phase" + info "Using Debian $DEBIAN_RELEASE" + + docker --version + + docker pull debian:$DEBIAN_RELEASE + info "Starting container $CONT_NAME" + $DOCKER_RUN -v $REPO_ROOT:/build:rw \ + -w /build --privileged=true --name $CONT_NAME \ + -dit --net=host debian:$DEBIAN_RELEASE /bin/bash + echo -e "::group::Build Env Setup" + docker_exec bash -c "echo deb-src http://deb.debian.org/debian $DEBIAN_RELEASE main >>/etc/apt/sources.list" + docker_exec apt-get -y update + docker_exec apt-get -y install aptitude + docker_exec aptitude -y install make libz-dev libelf-dev + docker_exec aptitude -y install "${ADDITIONAL_DEPS[@]}" + echo -e "::endgroup::" + ;; + RUN|RUN_CLANG|RUN_CLANG14|RUN_CLANG15|RUN_CLANG16|RUN_GCC10|RUN_GCC11|RUN_GCC12|RUN_ASAN|RUN_CLANG_ASAN|RUN_GCC10_ASAN) + CC="cc" + if [[ "$phase" =~ "RUN_CLANG(\d+)(_ASAN)?" ]]; then + ENV_VARS="-e CC=clang-${BASH_REMATCH[1]} -e CXX=clang++-${BASH_REMATCH[1]}" + CC="clang-${BASH_REMATCH[1]}" + elif [[ "$phase" = *"CLANG"* ]]; then + ENV_VARS="-e CC=clang -e CXX=clang++" + CC="clang" + elif [[ "$phase" =~ "RUN_GCC(\d+)(_ASAN)?" ]]; then + ENV_VARS="-e CC=gcc-${BASH_REMATCH[1]} -e CXX=g++-${BASH_REMATCH[1]}" + CC="gcc-${BASH_REMATCH[1]}" + fi + if [[ "$phase" = *"ASAN"* ]]; then + EXTRA_CFLAGS="${EXTRA_CFLAGS} -fsanitize=address,undefined" + EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -fsanitize=address,undefined" + fi + if [[ "$CC" != "cc" ]]; then + docker_exec aptitude -y install "$CC" + else + docker_exec aptitude -y install gcc + fi + docker_exec mkdir build install + docker_exec ${CC} --version + info "build" + docker_exec make -j$((4*$(nproc))) EXTRA_CFLAGS="${EXTRA_CFLAGS}" EXTRA_LDFLAGS="${EXTRA_LDFLAGS}" -C ./src -B OBJDIR=../build + info "ldd build/libbpf.so:" + docker_exec ldd build/libbpf.so + if ! docker_exec ldd build/libbpf.so | grep -q libelf; then + error "No reference to libelf.so in libbpf.so!" + exit 1 + fi + info "install" + docker_exec make -j$((4*$(nproc))) -C src OBJDIR=../build DESTDIR=../install install + info "link binary" + docker_exec bash -c "EXTRA_CFLAGS=\"${EXTRA_CFLAGS}\" EXTRA_LDFLAGS=\"${EXTRA_LDFLAGS}\" ./ci/managers/test_compile.sh" + ;; + CLEANUP) + info "Cleanup phase" + docker stop $CONT_NAME + docker rm -f $CONT_NAME + ;; + *) + echo >&2 "Unknown phase '$phase'" + exit 1 + esac +done diff --git a/bpftool/libbpf/ci/managers/test_compile.sh b/bpftool/libbpf/ci/managers/test_compile.sh new file mode 100755 index 0000000..094ba3e --- /dev/null +++ b/bpftool/libbpf/ci/managers/test_compile.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euox pipefail + +EXTRA_CFLAGS=${EXTRA_CFLAGS:-} +EXTRA_LDFLAGS=${EXTRA_LDFLAGS:-} + +cat << EOF > main.c +#include +int main() { + return bpf_object__open(0) < 0; +} +EOF + +# static linking +${CC:-cc} ${EXTRA_CFLAGS} ${EXTRA_LDFLAGS} -o main -I./include/uapi -I./install/usr/include main.c ./build/libbpf.a -lelf -lz diff --git a/bpftool/libbpf/ci/managers/travis_wait.bash b/bpftool/libbpf/ci/managers/travis_wait.bash new file mode 100644 index 0000000..acf6ad1 --- /dev/null +++ b/bpftool/libbpf/ci/managers/travis_wait.bash @@ -0,0 +1,61 @@ +# This was borrowed from https://github.com/travis-ci/travis-build/tree/master/lib/travis/build/bash +# to get around https://github.com/travis-ci/travis-ci/issues/9979. It should probably be removed +# as soon as Travis CI has started to provide an easy way to export the functions to bash scripts. + +travis_jigger() { + local cmd_pid="${1}" + shift + local timeout="${1}" + shift + local count=0 + + echo -e "\\n" + + while [[ "${count}" -lt "${timeout}" ]]; do + count="$((count + 1))" + echo -ne "Still running (${count} of ${timeout}): ${*}\\r" + sleep 60 + done + + echo -e "\\n${ANSI_RED}Timeout (${timeout} minutes) reached. Terminating \"${*}\"${ANSI_RESET}\\n" + kill -9 "${cmd_pid}" +} + +travis_wait() { + local timeout="${1}" + + if [[ "${timeout}" =~ ^[0-9]+$ ]]; then + shift + else + timeout=20 + fi + + local cmd=("${@}") + local log_file="travis_wait_${$}.log" + + "${cmd[@]}" &>"${log_file}" & + local cmd_pid="${!}" + + travis_jigger "${!}" "${timeout}" "${cmd[@]}" & + local jigger_pid="${!}" + local result + + { + set +e + wait "${cmd_pid}" 2>/dev/null + result="${?}" + ps -p"${jigger_pid}" &>/dev/null && kill "${jigger_pid}" + set -e + } + + if [[ "${result}" -eq 0 ]]; then + echo -e "\\n${ANSI_GREEN}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}" + else + echo -e "\\n${ANSI_RED}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}" + fi + + echo -e "\\n${ANSI_GREEN}Log:${ANSI_RESET}\\n" + cat "${log_file}" + + return "${result}" +} diff --git a/bpftool/libbpf/ci/managers/ubuntu.sh b/bpftool/libbpf/ci/managers/ubuntu.sh new file mode 100755 index 0000000..7fe1b3f --- /dev/null +++ b/bpftool/libbpf/ci/managers/ubuntu.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -eux + +RELEASE="focal" + +apt-get update +apt-get install -y pkg-config + +source "$(dirname $0)/travis_wait.bash" + +cd $REPO_ROOT + +EXTRA_CFLAGS="-Werror -Wall -fsanitize=address,undefined" +EXTRA_LDFLAGS="-Werror -Wall -fsanitize=address,undefined" +mkdir build install +cc --version +make -j$((4*$(nproc))) EXTRA_CFLAGS="${EXTRA_CFLAGS}" EXTRA_LDFLAGS="${EXTRA_LDFLAGS}" -C ./src -B OBJDIR=../build +ldd build/libbpf.so +if ! ldd build/libbpf.so | grep -q libelf; then + echo "FAIL: No reference to libelf.so in libbpf.so!" + exit 1 +fi +make -j$((4*$(nproc))) -C src OBJDIR=../build DESTDIR=../install install +EXTRA_CFLAGS=${EXTRA_CFLAGS} EXTRA_LDFLAGS=${EXTRA_LDFLAGS} $(dirname $0)/test_compile.sh diff --git a/bpftool/libbpf/ci/vmtest/configs/ALLOWLIST-4.9.0 b/bpftool/libbpf/ci/vmtest/configs/ALLOWLIST-4.9.0 new file mode 100644 index 0000000..ee0d3db --- /dev/null +++ b/bpftool/libbpf/ci/vmtest/configs/ALLOWLIST-4.9.0 @@ -0,0 +1,8 @@ +# btf_dump -- need to disable data dump sub-tests +core_retro +cpu_mask +hashmap +legacy_printk +perf_buffer +section_names + diff --git a/bpftool/libbpf/ci/vmtest/configs/ALLOWLIST-5.5.0 b/bpftool/libbpf/ci/vmtest/configs/ALLOWLIST-5.5.0 new file mode 100644 index 0000000..b8a2b46 --- /dev/null +++ b/bpftool/libbpf/ci/vmtest/configs/ALLOWLIST-5.5.0 @@ -0,0 +1,54 @@ +# attach_probe +autoload +bpf_verif_scale +cgroup_attach_autodetach +cgroup_attach_override +core_autosize +core_extern +core_read_macros +core_reloc +core_retro +cpu_mask +endian +get_branch_snapshot +get_stackid_cannot_attach +global_data +global_data_init +global_func_args +hashmap +l4lb_all +legacy_printk +linked_funcs +linked_maps +map_lock +obj_name +perf_buffer +perf_event_stackmap +pinning +pkt_md_access +probe_user +queue_stack_map +raw_tp_writable_reject_nbd_invalid +raw_tp_writable_test_run +rdonly_maps +section_names +signal_pending +skeleton +sockmap_ktls +sockopt +sockopt_inherit +sockopt_multi +spinlock +stacktrace_map +stacktrace_map_raw_tp +static_linked +task_fd_query_rawtp +task_fd_query_tp +tc_bpf +tcp_estats +tcp_rtt +tp_attach_query +usdt/urand_pid_attach +xdp +xdp_noinline +xdp_perf diff --git a/bpftool/libbpf/ci/vmtest/configs/DENYLIST-5.5.0 b/bpftool/libbpf/ci/vmtest/configs/DENYLIST-5.5.0 new file mode 100644 index 0000000..d732bed --- /dev/null +++ b/bpftool/libbpf/ci/vmtest/configs/DENYLIST-5.5.0 @@ -0,0 +1,118 @@ +# This file is not used and is there for historic purposes only. +# See ALLOWLIST-5.5.0 instead. + +# PERMANENTLY DISABLED +align # verifier output format changed +atomics # new atomic operations (v5.12+) +atomic_bounds # new atomic operations (v5.12+) +bind_perm # changed semantics of return values (v5.12+) +bpf_cookie # 5.15+ +bpf_iter # bpf_iter support is missing +bpf_obj_id # bpf_link support missing for GET_OBJ_INFO, GET_FD_BY_ID, etc +bpf_tcp_ca # STRUCT_OPS is missing +btf_map_in_map # inner map leak fixed in 5.8 +btf_skc_cls_ingress # v5.10+ functionality +cg_storage_multi # v5.9+ functionality +cgroup_attach_multi # BPF_F_REPLACE_PROG missing +cgroup_link # LINK_CREATE is missing +cgroup_skb_sk_lookup # bpf_sk_lookup_tcp() helper is missing +check_mtu # missing BPF helper (v5.12+) +cls_redirect # bpf_csum_level() helper is missing +connect_force_port # cgroup/get{peer,sock}name{4,6} support is missing +d_path # v5.10+ feature +enable_stats # BPF_ENABLE_STATS support is missing +fentry_fexit # bpf_prog_test_tracing missing +fentry_test # bpf_prog_test_tracing missing +fexit_bpf2bpf # freplace is missing +fexit_sleep # relies on bpf_trampoline fix in 5.12+ +fexit_test # bpf_prog_test_tracing missing +flow_dissector # bpf_link-based flow dissector is in 5.8+ +flow_dissector_reattach +for_each # v5.12+ +get_func_ip_test # v5.15+ +get_stack_raw_tp # exercising BPF verifier bug causing infinite loop +hash_large_key # v5.11+ +ima # v5.11+ +kfree_skb # 32-bit pointer arith in test_pkt_access +ksyms # __start_BTF has different name +kfunc_call # v5.13+ +link_pinning # bpf_link is missing +linked_vars # v5.13+ +load_bytes_relative # new functionality in 5.8 +lookup_and_delete # v5.14+ +map_init # per-CPU LRU missing +map_ptr # test uses BPF_MAP_TYPE_RINGBUF, added in 5.8 +metadata # v5.10+ +migrate_reuseport # v5.14+ +mmap # 5.5 kernel is too permissive with re-mmaping +modify_return # fmod_ret support is missing +module_attach # module BTF support missing (v5.11+) +netcnt +netns_cookie # v5.15+ +ns_current_pid_tgid # bpf_get_ns_current_pid_tgid() helper is missing +pe_preserve_elems # v5.10+ +perf_branches # bpf_read_branch_records() helper is missing +perf_link # v5.15+ +pkt_access # 32-bit pointer arith in test_pkt_access +probe_read_user_str # kernel bug with garbage bytes at the end +prog_run_xattr # 32-bit pointer arith in test_pkt_access +raw_tp_test_run # v5.10+ +recursion # v5.12+ +ringbuf # BPF_MAP_TYPE_RINGBUF is supported in 5.8+ + +# bug in verifier w/ tracking references +#reference_tracking/classifier/sk_lookup_success +reference_tracking + +select_reuseport # UDP support is missing +send_signal # bpf_send_signal_thread() helper is missing +sk_assign # bpf_sk_assign helper missing +sk_lookup # v5.9+ +sk_storage_tracing # missing bpf_sk_storage_get() helper +skb_ctx # ctx_{size, }_{in, out} in BPF_PROG_TEST_RUN is missing +skb_helpers # helpers added in 5.8+ +skeleton # creates too big ARRAY map +snprintf # v5.13+ +snprintf_btf # v5.10+ +sock_fields # v5.10+ +socket_cookie # v5.12+ +sockmap_basic # uses new socket fields, 5.8+ +sockmap_listen # no listen socket supportin SOCKMAP +sockopt_sk +sockopt_qos_to_cc # v5.15+ +stacktrace_build_id # v5.9+ +stack_var_off # v5.12+ +syscall # v5.14+ +task_local_storage # v5.12+ +task_pt_regs # v5.15+ +tcp_hdr_options # v5.10+, new TCP header options feature in BPF +tcpbpf_user # LINK_CREATE is missing +tc_redirect # v5.14+ +test_bpffs # v5.10+, new CONFIG_BPF_PRELOAD=y and CONFIG_BPF_PRELOAD_UMG=y|m +test_bprm_opts # v5.11+ +test_global_funcs # kernel doesn't support BTF linkage=global on FUNCs +test_local_storage # v5.10+ feature +test_lsm # no BPF_LSM support +test_overhead # no fmod_ret support +test_profiler # needs verifier logic improvements from v5.10+ +test_skb_pkt_end # v5.11+ +timer # v5.15+ +timer_mim # v5.15+ +trace_ext # v5.10+ +trace_printk # v5.14+ +trampoline_count # v5.12+ have lower allowed limits +udp_limit # no cgroup/sock_release BPF program type (5.9+) +varlen # verifier bug fixed in later kernels +vmlinux # hrtimer_nanosleep() signature changed incompatibly +xdp_adjust_tail # new XDP functionality added in 5.8 +xdp_attach # IFLA_XDP_EXPECTED_FD support is missing +xdp_bonding # v5.15+ +xdp_bpf2bpf # freplace is missing +xdp_context_test_run # v5.15+ +xdp_cpumap_attach # v5.9+ +xdp_devmap_attach # new feature in 5.8 +xdp_link # v5.9+ + +# SUBTESTS FAILING (block entire test until blocking subtests works properly) +btf # "size check test", "func (Non zero vlen)" +tailcalls # tailcall_bpf2bpf_1, tailcall_bpf2bpf_2, tailcall_bpf2bpf_3 diff --git a/bpftool/libbpf/ci/vmtest/configs/DENYLIST-latest b/bpftool/libbpf/ci/vmtest/configs/DENYLIST-latest new file mode 100644 index 0000000..ebebe9f --- /dev/null +++ b/bpftool/libbpf/ci/vmtest/configs/DENYLIST-latest @@ -0,0 +1 @@ +decap_sanity # weird failure with decap_sanity_ns netns already existing, TBD diff --git a/bpftool/libbpf/ci/vmtest/configs/DENYLIST-latest.s390x b/bpftool/libbpf/ci/vmtest/configs/DENYLIST-latest.s390x new file mode 100644 index 0000000..3684f49 --- /dev/null +++ b/bpftool/libbpf/ci/vmtest/configs/DENYLIST-latest.s390x @@ -0,0 +1,3 @@ +# TEMPORARY +usdt/basic # failing verifier due to bounds check after LLVM update +usdt/multispec # same as above diff --git a/bpftool/libbpf/ci/vmtest/helpers.sh b/bpftool/libbpf/ci/vmtest/helpers.sh new file mode 100755 index 0000000..c44d098 --- /dev/null +++ b/bpftool/libbpf/ci/vmtest/helpers.sh @@ -0,0 +1,38 @@ +# shellcheck shell=bash + +# $1 - start or end +# $2 - fold identifier, no spaces +# $3 - fold section description +foldable() { + local YELLOW='\033[1;33m' + local NOCOLOR='\033[0m' + if [ $1 = "start" ]; then + line="::group::$2" + if [ ! -z "${3:-}" ]; then + line="$line - ${YELLOW}$3${NOCOLOR}" + fi + else + line="::endgroup::" + fi + echo -e "$line" +} + +__print() { + local TITLE="" + if [[ -n $2 ]]; then + TITLE=" title=$2" + fi + echo "::$1${TITLE}::$3" +} + +# $1 - title +# $2 - message +print_error() { + __print error $1 $2 +} + +# $1 - title +# $2 - message +print_notice() { + __print notice $1 $2 +} diff --git a/bpftool/libbpf/ci/vmtest/run_selftests.sh b/bpftool/libbpf/ci/vmtest/run_selftests.sh new file mode 100755 index 0000000..1dcde76 --- /dev/null +++ b/bpftool/libbpf/ci/vmtest/run_selftests.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +set -euo pipefail + +source $(cd $(dirname $0) && pwd)/helpers.sh + +ARCH=$(uname -m) + +STATUS_FILE=/exitstatus + +read_lists() { + (for path in "$@"; do + if [[ -s "$path" ]]; then + cat "$path" + fi; + done) | cut -d'#' -f1 | tr -s ' \t\n' ',' +} + +test_progs() { + if [[ "${KERNEL}" != '4.9.0' ]]; then + foldable start test_progs "Testing test_progs" + # "&& true" does not change the return code (it is not executed + # if the Python script fails), but it prevents exiting on a + # failure due to the "set -e". + ./test_progs ${DENYLIST:+-d$DENYLIST} ${ALLOWLIST:+-a$ALLOWLIST} && true + echo "test_progs:$?" >> "${STATUS_FILE}" + foldable end test_progs + fi +} + +test_progs_no_alu32() { + foldable start test_progs-no_alu32 "Testing test_progs-no_alu32" + ./test_progs-no_alu32 ${DENYLIST:+-d$DENYLIST} ${ALLOWLIST:+-a$ALLOWLIST} && true + echo "test_progs-no_alu32:$?" >> "${STATUS_FILE}" + foldable end test_progs-no_alu32 +} + +test_maps() { + if [[ "${KERNEL}" == 'latest' ]]; then + foldable start test_maps "Testing test_maps" + ./test_maps && true + echo "test_maps:$?" >> "${STATUS_FILE}" + foldable end test_maps + fi +} + +test_verifier() { + if [[ "${KERNEL}" == 'latest' ]]; then + foldable start test_verifier "Testing test_verifier" + ./test_verifier && true + echo "test_verifier:$?" >> "${STATUS_FILE}" + foldable end test_verifier + fi +} + +foldable end vm_init + +configs_path=/${PROJECT_NAME}/selftests/bpf +local_configs_path=${PROJECT_NAME}/vmtest/configs +DENYLIST=$(read_lists \ + "$configs_path/DENYLIST" \ + "$configs_path/DENYLIST.${ARCH}" \ + "$local_configs_path/DENYLIST-${KERNEL}" \ + "$local_configs_path/DENYLIST-${KERNEL}.${ARCH}" \ +) +ALLOWLIST=$(read_lists \ + "$configs_path/ALLOWLIST" \ + "$configs_path/ALLOWLIST.${ARCH}" \ + "$local_configs_path/ALLOWLIST-${KERNEL}" \ + "$local_configs_path/ALLOWLIST-${KERNEL}.${ARCH}" \ +) + +echo "DENYLIST: ${DENYLIST}" +echo "ALLOWLIST: ${ALLOWLIST}" + +cd ${PROJECT_NAME}/selftests/bpf + +if [ $# -eq 0 ]; then + test_progs + test_progs_no_alu32 + # test_maps + test_verifier +else + for test_name in "$@"; do + "${test_name}" + done +fi diff --git a/bpftool/libbpf/docs/.gitignore b/bpftool/libbpf/docs/.gitignore new file mode 100644 index 0000000..dd08fae --- /dev/null +++ b/bpftool/libbpf/docs/.gitignore @@ -0,0 +1,2 @@ +sphinx/build +sphinx/doxygen/build \ No newline at end of file diff --git a/bpftool/libbpf/docs/api.rst b/bpftool/libbpf/docs/api.rst new file mode 100644 index 0000000..7a8e709 --- /dev/null +++ b/bpftool/libbpf/docs/api.rst @@ -0,0 +1,93 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +.. _api: + +.. toctree:: Table of Contents + + +LIBBPF API +========== + +Error Handling +-------------- + +When libbpf is used in "libbpf 1.0 mode", API functions can return errors in one of two ways. + +You can set "libbpf 1.0" mode with the following line: + +.. code-block:: + + libbpf_set_strict_mode(LIBBPF_STRICT_DIRECT_ERRS | LIBBPF_STRICT_CLEAN_PTRS); + +If the function returns an error code directly, it uses 0 to indicate success +and a negative error code to indicate what caused the error. In this case the +error code should be checked directly from the return, you do not need to check +errno. + +For example: + +.. code-block:: + + err = some_libbpf_api_with_error_return(...); + if (err < 0) { + /* Handle error accordingly */ + } + +If the function returns a pointer, it will return NULL to indicate there was +an error. In this case errno should be checked for the error code. + +For example: + +.. code-block:: + + ptr = some_libbpf_api_returning_ptr(); + if (!ptr) { + /* note no minus sign for EINVAL and E2BIG below */ + if (errno == EINVAL) { + /* handle EINVAL error */ + } else if (errno == E2BIG) { + /* handle E2BIG error */ + } + } + +libbpf.h +-------- +.. doxygenfile:: libbpf.h + :project: libbpf + :sections: func define public-type enum + +bpf.h +----- +.. doxygenfile:: bpf.h + :project: libbpf + :sections: func define public-type enum + +btf.h +----- +.. doxygenfile:: btf.h + :project: libbpf + :sections: func define public-type enum + +xsk.h +----- +.. doxygenfile:: xsk.h + :project: libbpf + :sections: func define public-type enum + +bpf_tracing.h +------------- +.. doxygenfile:: bpf_tracing.h + :project: libbpf + :sections: func define public-type enum + +bpf_core_read.h +--------------- +.. doxygenfile:: bpf_core_read.h + :project: libbpf + :sections: func define public-type enum + +bpf_endian.h +------------ +.. doxygenfile:: bpf_endian.h + :project: libbpf + :sections: func define public-type enum diff --git a/bpftool/libbpf/docs/conf.py b/bpftool/libbpf/docs/conf.py new file mode 100644 index 0000000..1d8714e --- /dev/null +++ b/bpftool/libbpf/docs/conf.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +import os +import subprocess + +project = "libbpf" + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.doctest', + 'sphinx.ext.mathjax', + 'sphinx.ext.viewcode', + 'sphinx.ext.imgmath', + 'sphinx.ext.todo', + 'breathe', +] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True' + +if read_the_docs_build: + subprocess.call('cd sphinx ; make clean', shell=True) + subprocess.call('cd sphinx/doxygen ; doxygen', shell=True) + +html_theme = 'sphinx_rtd_theme' + +breathe_projects = { "libbpf": "./sphinx/doxygen/build/xml/" } +breathe_default_project = "libbpf" +breathe_show_define_initializer = True +breathe_show_enumvalue_initializer = True diff --git a/bpftool/libbpf/docs/index.rst b/bpftool/libbpf/docs/index.rst new file mode 100644 index 0000000..f9b3b25 --- /dev/null +++ b/bpftool/libbpf/docs/index.rst @@ -0,0 +1,24 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +.. _libbpf: + +libbpf +====== + +.. toctree:: + :maxdepth: 1 + + API Documentation + program_types + libbpf_naming_convention + libbpf_build + +This is documentation for libbpf, a userspace library for loading and +interacting with bpf programs. + +All general BPF questions, including kernel functionality, libbpf APIs and +their application, should be sent to bpf@vger.kernel.org mailing list. +You can `subscribe `_ to the +mailing list search its `archive `_. +Please search the archive before asking new questions. It very well might +be that this was already addressed or answered before. diff --git a/bpftool/libbpf/docs/libbpf_build.rst b/bpftool/libbpf/docs/libbpf_build.rst new file mode 100644 index 0000000..8e8c23e --- /dev/null +++ b/bpftool/libbpf/docs/libbpf_build.rst @@ -0,0 +1,37 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +Building libbpf +=============== + +libelf and zlib are internal dependencies of libbpf and thus are required to link +against and must be installed on the system for applications to work. +pkg-config is used by default to find libelf, and the program called +can be overridden with PKG_CONFIG. + +If using pkg-config at build time is not desired, it can be disabled by +setting NO_PKG_CONFIG=1 when calling make. + +To build both static libbpf.a and shared libbpf.so: + +.. code-block:: bash + + $ cd src + $ make + +To build only static libbpf.a library in directory build/ and install them +together with libbpf headers in a staging directory root/: + +.. code-block:: bash + + $ cd src + $ mkdir build root + $ BUILD_STATIC_ONLY=y OBJDIR=build DESTDIR=root make install + +To build both static libbpf.a and shared libbpf.so against a custom libelf +dependency installed in /build/root/ and install them together with libbpf +headers in a build directory /build/root/: + +.. code-block:: bash + + $ cd src + $ PKG_CONFIG_PATH=/build/root/lib64/pkgconfig DESTDIR=/build/root make \ No newline at end of file diff --git a/bpftool/libbpf/docs/libbpf_naming_convention.rst b/bpftool/libbpf/docs/libbpf_naming_convention.rst new file mode 100644 index 0000000..b5b41b6 --- /dev/null +++ b/bpftool/libbpf/docs/libbpf_naming_convention.rst @@ -0,0 +1,193 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +API naming convention +===================== + +libbpf API provides access to a few logically separated groups of +functions and types. Every group has its own naming convention +described here. It's recommended to follow these conventions whenever a +new function or type is added to keep libbpf API clean and consistent. + +All types and functions provided by libbpf API should have one of the +following prefixes: ``bpf_``, ``btf_``, ``libbpf_``, ``btf_dump_``, +``ring_buffer_``, ``perf_buffer_``. + +System call wrappers +-------------------- + +System call wrappers are simple wrappers for commands supported by +sys_bpf system call. These wrappers should go to ``bpf.h`` header file +and map one to one to corresponding commands. + +For example ``bpf_map_lookup_elem`` wraps ``BPF_MAP_LOOKUP_ELEM`` +command of sys_bpf, ``bpf_prog_attach`` wraps ``BPF_PROG_ATTACH``, etc. + +Objects +------- + +Another class of types and functions provided by libbpf API is "objects" +and functions to work with them. Objects are high-level abstractions +such as BPF program or BPF map. They're represented by corresponding +structures such as ``struct bpf_object``, ``struct bpf_program``, +``struct bpf_map``, etc. + +Structures are forward declared and access to their fields should be +provided via corresponding getters and setters rather than directly. + +These objects are associated with corresponding parts of ELF object that +contains compiled BPF programs. + +For example ``struct bpf_object`` represents ELF object itself created +from an ELF file or from a buffer, ``struct bpf_program`` represents a +program in ELF object and ``struct bpf_map`` is a map. + +Functions that work with an object have names built from object name, +double underscore and part that describes function purpose. + +For example ``bpf_object__open`` consists of the name of corresponding +object, ``bpf_object``, double underscore and ``open`` that defines the +purpose of the function to open ELF file and create ``bpf_object`` from +it. + +All objects and corresponding functions other than BTF related should go +to ``libbpf.h``. BTF types and functions should go to ``btf.h``. + +Auxiliary functions +------------------- + +Auxiliary functions and types that don't fit well in any of categories +described above should have ``libbpf_`` prefix, e.g. +``libbpf_get_error`` or ``libbpf_prog_type_by_name``. + +ABI +--- + +libbpf can be both linked statically or used as DSO. To avoid possible +conflicts with other libraries an application is linked with, all +non-static libbpf symbols should have one of the prefixes mentioned in +API documentation above. See API naming convention to choose the right +name for a new symbol. + +Symbol visibility +----------------- + +libbpf follow the model when all global symbols have visibility "hidden" +by default and to make a symbol visible it has to be explicitly +attributed with ``LIBBPF_API`` macro. For example: + +.. code-block:: c + + LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id); + +This prevents from accidentally exporting a symbol, that is not supposed +to be a part of ABI what, in turn, improves both libbpf developer- and +user-experiences. + +ABI versioning +-------------- + +To make future ABI extensions possible libbpf ABI is versioned. +Versioning is implemented by ``libbpf.map`` version script that is +passed to linker. + +Version name is ``LIBBPF_`` prefix + three-component numeric version, +starting from ``0.0.1``. + +Every time ABI is being changed, e.g. because a new symbol is added or +semantic of existing symbol is changed, ABI version should be bumped. +This bump in ABI version is at most once per kernel development cycle. + +For example, if current state of ``libbpf.map`` is: + +.. code-block:: none + + LIBBPF_0.0.1 { + global: + bpf_func_a; + bpf_func_b; + local: + \*; + }; + +, and a new symbol ``bpf_func_c`` is being introduced, then +``libbpf.map`` should be changed like this: + +.. code-block:: none + + LIBBPF_0.0.1 { + global: + bpf_func_a; + bpf_func_b; + local: + \*; + }; + LIBBPF_0.0.2 { + global: + bpf_func_c; + } LIBBPF_0.0.1; + +, where new version ``LIBBPF_0.0.2`` depends on the previous +``LIBBPF_0.0.1``. + +Format of version script and ways to handle ABI changes, including +incompatible ones, described in details in [1]. + +Stand-alone build +------------------- + +Under https://github.com/libbpf/libbpf there is a (semi-)automated +mirror of the mainline's version of libbpf for a stand-alone build. + +However, all changes to libbpf's code base must be upstreamed through +the mainline kernel tree. + + +API documentation convention +============================ + +The libbpf API is documented via comments above definitions in +header files. These comments can be rendered by doxygen and sphinx +for well organized html output. This section describes the +convention in which these comments should be formatted. + +Here is an example from btf.h: + +.. code-block:: c + + /** + * @brief **btf__new()** creates a new instance of a BTF object from the raw + * bytes of an ELF's BTF section + * @param data raw bytes + * @param size number of bytes passed in `data` + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ + +The comment must start with a block comment of the form '/\*\*'. + +The documentation always starts with a @brief directive. This line is a short +description about this API. It starts with the name of the API, denoted in bold +like so: **api_name**. Please include an open and close parenthesis if this is a +function. Follow with the short description of the API. A longer form description +can be added below the last directive, at the bottom of the comment. + +Parameters are denoted with the @param directive, there should be one for each +parameter. If this is a function with a non-void return, use the @return directive +to document it. + +License +------------------- + +libbpf is dual-licensed under LGPL 2.1 and BSD 2-Clause. + +Links +------------------- + +[1] https://www.akkadia.org/drepper/dsohowto.pdf + (Chapter 3. Maintaining APIs and ABIs). diff --git a/bpftool/libbpf/docs/program_types.rst b/bpftool/libbpf/docs/program_types.rst new file mode 100644 index 0000000..ad4d4d5 --- /dev/null +++ b/bpftool/libbpf/docs/program_types.rst @@ -0,0 +1,203 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +.. _program_types_and_elf: + +Program Types and ELF Sections +============================== + +The table below lists the program types, their attach types where relevant and the ELF section +names supported by libbpf for them. The ELF section names follow these rules: + +- ``type`` is an exact match, e.g. ``SEC("socket")`` +- ``type+`` means it can be either exact ``SEC("type")`` or well-formed ``SEC("type/extras")`` + with a '``/``' separator between ``type`` and ``extras``. + +When ``extras`` are specified, they provide details of how to auto-attach the BPF program. The +format of ``extras`` depends on the program type, e.g. ``SEC("tracepoint//")`` +for tracepoints or ``SEC("usdt/::")`` for USDT probes. The extras are +described in more detail in the footnotes. + + ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| Program Type | Attach Type | ELF Section Name | Sleepable | ++===========================================+========================================+==================================+===========+ +| ``BPF_PROG_TYPE_CGROUP_DEVICE`` | ``BPF_CGROUP_DEVICE`` | ``cgroup/dev`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SKB`` | | ``cgroup/skb`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET_EGRESS`` | ``cgroup_skb/egress`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET_INGRESS`` | ``cgroup_skb/ingress`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SOCKOPT`` | ``BPF_CGROUP_GETSOCKOPT`` | ``cgroup/getsockopt`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_SETSOCKOPT`` | ``cgroup/setsockopt`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SOCK_ADDR`` | ``BPF_CGROUP_INET4_BIND`` | ``cgroup/bind4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET4_CONNECT`` | ``cgroup/connect4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET4_GETPEERNAME`` | ``cgroup/getpeername4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET4_GETSOCKNAME`` | ``cgroup/getsockname4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_BIND`` | ``cgroup/bind6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_CONNECT`` | ``cgroup/connect6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_GETPEERNAME`` | ``cgroup/getpeername6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_GETSOCKNAME`` | ``cgroup/getsockname6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_UDP4_RECVMSG`` | ``cgroup/recvmsg4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_UDP4_SENDMSG`` | ``cgroup/sendmsg4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_UDP6_RECVMSG`` | ``cgroup/recvmsg6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_UDP6_SENDMSG`` | ``cgroup/sendmsg6`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SOCK`` | ``BPF_CGROUP_INET4_POST_BIND`` | ``cgroup/post_bind4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_POST_BIND`` | ``cgroup/post_bind6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET_SOCK_CREATE`` | ``cgroup/sock_create`` | | ++ + +----------------------------------+-----------+ +| | | ``cgroup/sock`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET_SOCK_RELEASE`` | ``cgroup/sock_release`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SYSCTL`` | ``BPF_CGROUP_SYSCTL`` | ``cgroup/sysctl`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_EXT`` | | ``freplace+`` [#fentry]_ | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_FLOW_DISSECTOR`` | ``BPF_FLOW_DISSECTOR`` | ``flow_dissector`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_KPROBE`` | | ``kprobe+`` [#kprobe]_ | | ++ + +----------------------------------+-----------+ +| | | ``kretprobe+`` [#kprobe]_ | | ++ + +----------------------------------+-----------+ +| | | ``ksyscall+`` [#ksyscall]_ | | ++ + +----------------------------------+-----------+ +| | | ``kretsyscall+`` [#ksyscall]_ | | ++ + +----------------------------------+-----------+ +| | | ``uprobe+`` [#uprobe]_ | | ++ + +----------------------------------+-----------+ +| | | ``uprobe.s+`` [#uprobe]_ | Yes | ++ + +----------------------------------+-----------+ +| | | ``uretprobe+`` [#uprobe]_ | | ++ + +----------------------------------+-----------+ +| | | ``uretprobe.s+`` [#uprobe]_ | Yes | ++ + +----------------------------------+-----------+ +| | | ``usdt+`` [#usdt]_ | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_KPROBE_MULTI`` | ``kprobe.multi+`` [#kpmulti]_ | | ++ + +----------------------------------+-----------+ +| | | ``kretprobe.multi+`` [#kpmulti]_ | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LIRC_MODE2`` | ``BPF_LIRC_MODE2`` | ``lirc_mode2`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LSM`` | ``BPF_LSM_CGROUP`` | ``lsm_cgroup+`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_LSM_MAC`` | ``lsm+`` [#lsm]_ | | ++ + +----------------------------------+-----------+ +| | | ``lsm.s+`` [#lsm]_ | Yes | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LWT_IN`` | | ``lwt_in`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LWT_OUT`` | | ``lwt_out`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LWT_SEG6LOCAL`` | | ``lwt_seg6local`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LWT_XMIT`` | | ``lwt_xmit`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_PERF_EVENT`` | | ``perf_event`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE`` | | ``raw_tp.w+`` [#rawtp]_ | | ++ + +----------------------------------+-----------+ +| | | ``raw_tracepoint.w+`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_RAW_TRACEPOINT`` | | ``raw_tp+`` [#rawtp]_ | | ++ + +----------------------------------+-----------+ +| | | ``raw_tracepoint+`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SCHED_ACT`` | | ``action`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SCHED_CLS`` | | ``classifier`` | | ++ + +----------------------------------+-----------+ +| | | ``tc`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SK_LOOKUP`` | ``BPF_SK_LOOKUP`` | ``sk_lookup`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SK_MSG`` | ``BPF_SK_MSG_VERDICT`` | ``sk_msg`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SK_REUSEPORT`` | ``BPF_SK_REUSEPORT_SELECT_OR_MIGRATE`` | ``sk_reuseport/migrate`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_SK_REUSEPORT_SELECT`` | ``sk_reuseport`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SK_SKB`` | | ``sk_skb`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_SK_SKB_STREAM_PARSER`` | ``sk_skb/stream_parser`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_SK_SKB_STREAM_VERDICT`` | ``sk_skb/stream_verdict`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SOCKET_FILTER`` | | ``socket`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SOCK_OPS`` | ``BPF_CGROUP_SOCK_OPS`` | ``sockops`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_STRUCT_OPS`` | | ``struct_ops+`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SYSCALL`` | | ``syscall`` | Yes | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_TRACEPOINT`` | | ``tp+`` [#tp]_ | | ++ + +----------------------------------+-----------+ +| | | ``tracepoint+`` [#tp]_ | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_TRACING`` | ``BPF_MODIFY_RETURN`` | ``fmod_ret+`` [#fentry]_ | | ++ + +----------------------------------+-----------+ +| | | ``fmod_ret.s+`` [#fentry]_ | Yes | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_FENTRY`` | ``fentry+`` [#fentry]_ | | ++ + +----------------------------------+-----------+ +| | | ``fentry.s+`` [#fentry]_ | Yes | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_FEXIT`` | ``fexit+`` [#fentry]_ | | ++ + +----------------------------------+-----------+ +| | | ``fexit.s+`` [#fentry]_ | Yes | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_ITER`` | ``iter+`` [#iter]_ | | ++ + +----------------------------------+-----------+ +| | | ``iter.s+`` [#iter]_ | Yes | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_RAW_TP`` | ``tp_btf+`` [#fentry]_ | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_XDP`` | ``BPF_XDP_CPUMAP`` | ``xdp.frags/cpumap`` | | ++ + +----------------------------------+-----------+ +| | | ``xdp/cpumap`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_XDP_DEVMAP`` | ``xdp.frags/devmap`` | | ++ + +----------------------------------+-----------+ +| | | ``xdp/devmap`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_XDP`` | ``xdp.frags`` | | ++ + +----------------------------------+-----------+ +| | | ``xdp`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ + + +.. rubric:: Footnotes + +.. [#fentry] The ``fentry`` attach format is ``fentry[.s]/``. +.. [#kprobe] The ``kprobe`` attach format is ``kprobe/[+]``. Valid + characters for ``function`` are ``a-zA-Z0-9_.`` and ``offset`` must be a valid + non-negative integer. +.. [#ksyscall] The ``ksyscall`` attach format is ``ksyscall/``. +.. [#uprobe] The ``uprobe`` attach format is ``uprobe[.s]/:[+]``. +.. [#usdt] The ``usdt`` attach format is ``usdt/::``. +.. [#kpmulti] The ``kprobe.multi`` attach format is ``kprobe.multi/`` where ``pattern`` + supports ``*`` and ``?`` wildcards. Valid characters for pattern are + ``a-zA-Z0-9_.*?``. +.. [#lsm] The ``lsm`` attachment format is ``lsm[.s]/``. +.. [#rawtp] The ``raw_tp`` attach format is ``raw_tracepoint[.w]/``. +.. [#tp] The ``tracepoint`` attach format is ``tracepoint//``. +.. [#iter] The ``iter`` attach format is ``iter[.s]/``. diff --git a/bpftool/libbpf/docs/sphinx/Makefile b/bpftool/libbpf/docs/sphinx/Makefile new file mode 100644 index 0000000..5dc39c5 --- /dev/null +++ b/bpftool/libbpf/docs/sphinx/Makefile @@ -0,0 +1,9 @@ +SPHINXBUILD ?= sphinx-build +SOURCEDIR = ../src +BUILDDIR = build + +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" + +%: + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" diff --git a/bpftool/libbpf/docs/sphinx/doxygen/Doxyfile b/bpftool/libbpf/docs/sphinx/doxygen/Doxyfile new file mode 100644 index 0000000..b04c115 --- /dev/null +++ b/bpftool/libbpf/docs/sphinx/doxygen/Doxyfile @@ -0,0 +1,277 @@ +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "libbpf" +PROJECT_NUMBER = +PROJECT_BRIEF = +PROJECT_LOGO = +OUTPUT_DIRECTORY = ./build +CREATE_SUBDIRS = NO +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English +OUTPUT_TEXT_DIRECTION = None +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +JAVADOC_BANNER = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +PYTHON_DOCSTRING = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +OPTIMIZE_OUTPUT_SLICE = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +TOC_INCLUDE_HEADINGS = 5 +AUTOLINK_SUPPORT = YES +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 +NUM_PROC_THREADS = 1 +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +RESOLVE_UNNAMED_PARAMS = YES +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +HIDE_COMPOUND_REFERENCE= NO +SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +CITE_BIB_FILES = +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +INPUT = ../../../src +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.c \ + *.h +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = ___* +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = YES +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +ALPHABETICAL_INDEX = YES +IGNORE_PREFIX = +GENERATE_HTML = NO +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_TIMESTAMP = NO +HTML_DYNAMIC_MENUS = YES +HTML_DYNAMIC_SECTIONS = NO +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = NO +ENUM_VALUES_PER_LINE = 4 +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +HTML_FORMULA_FORMAT = png +FORMULA_FONTSIZE = 10 +FORMULA_TRANSPARENT = YES +FORMULA_MACROFILE = +USE_MATHJAX = NO +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = +MAKEINDEX_CMD_NAME = makeindex +LATEX_MAKEINDEX_CMD = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = +LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_FILES = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +LATEX_SOURCE_CODE = NO +LATEX_BIB_STYLE = plain +LATEX_TIMESTAMP = NO +LATEX_EMOJI_DIRECTORY = +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +RTF_SOURCE_CODE = NO +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_SUBDIR = +MAN_LINKS = NO +GENERATE_XML = YES +XML_OUTPUT = xml +XML_PROGRAMLISTING = YES +XML_NS_MEMB_FILE_SCOPE = NO +GENERATE_DOCBOOK = NO +DOCBOOK_OUTPUT = docbook +DOCBOOK_PROGRAMLISTING = NO +GENERATE_AUTOGEN_DEF = NO +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = YES +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = NO +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +EXTERNAL_PAGES = YES +CLASS_DIAGRAMS = YES +DIA_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +DOT_NUM_THREADS = 0 +DOT_FONTNAME = Helvetica +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +UML_LIMIT_NUM_FIELDS = 10 +DOT_UML_DETAILS = NO +DOT_WRAP_THRESHOLD = 17 +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = +DOTFILE_DIRS = +MSCFILE_DIRS = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = +PLANTUML_CFG_FILE = +PLANTUML_INCLUDE_PATH = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES diff --git a/bpftool/libbpf/docs/sphinx/requirements.txt b/bpftool/libbpf/docs/sphinx/requirements.txt new file mode 100644 index 0000000..188f51e --- /dev/null +++ b/bpftool/libbpf/docs/sphinx/requirements.txt @@ -0,0 +1 @@ +breathe \ No newline at end of file diff --git a/bpftool/libbpf/fuzz/bpf-object-fuzzer.c b/bpftool/libbpf/fuzz/bpf-object-fuzzer.c new file mode 100644 index 0000000..89286e2 --- /dev/null +++ b/bpftool/libbpf/fuzz/bpf-object-fuzzer.c @@ -0,0 +1,23 @@ +#include "libbpf.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return 0; +} + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + struct bpf_object *obj = NULL; + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts); + int err; + + libbpf_set_print(libbpf_print_fn); + + opts.object_name = "fuzz-object"; + obj = bpf_object__open_mem(data, size, &opts); + err = libbpf_get_error(obj); + if (err) + return 0; + + bpf_object__close(obj); + return 0; +} diff --git a/bpftool/libbpf/fuzz/bpf-object-fuzzer_seed_corpus.zip b/bpftool/libbpf/fuzz/bpf-object-fuzzer_seed_corpus.zip new file mode 100644 index 0000000..602b381 Binary files /dev/null and b/bpftool/libbpf/fuzz/bpf-object-fuzzer_seed_corpus.zip differ diff --git a/bpftool/libbpf/include/asm/barrier.h b/bpftool/libbpf/include/asm/barrier.h new file mode 100644 index 0000000..1fc6aee --- /dev/null +++ b/bpftool/libbpf/include/asm/barrier.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __ASM_BARRIER_H +#define __ASM_BARRIER_H + +#include + +#endif diff --git a/bpftool/libbpf/include/linux/compiler.h b/bpftool/libbpf/include/linux/compiler.h new file mode 100644 index 0000000..26336dc --- /dev/null +++ b/bpftool/libbpf/include/linux/compiler.h @@ -0,0 +1,70 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_COMPILER_H +#define __LINUX_COMPILER_H + +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + +#define READ_ONCE(x) (*(volatile typeof(x) *)&x) +#define WRITE_ONCE(x, v) (*(volatile typeof(x) *)&x) = (v) + +#define barrier() asm volatile("" ::: "memory") + +#if defined(__x86_64__) + +# define smp_rmb() barrier() +# define smp_wmb() barrier() +# define smp_mb() asm volatile("lock; addl $0,-132(%%rsp)" ::: "memory", "cc") + +# define smp_store_release(p, v) \ +do { \ + barrier(); \ + WRITE_ONCE(*p, v); \ +} while (0) + +# define smp_load_acquire(p) \ +({ \ + typeof(*p) ___p = READ_ONCE(*p); \ + barrier(); \ + ___p; \ +}) + +#elif defined(__aarch64__) + +# define smp_rmb() asm volatile("dmb ishld" ::: "memory") +# define smp_wmb() asm volatile("dmb ishst" ::: "memory") +# define smp_mb() asm volatile("dmb ish" ::: "memory") + +#endif + +#ifndef smp_mb +# define smp_mb() __sync_synchronize() +#endif + +#ifndef smp_rmb +# define smp_rmb() smp_mb() +#endif + +#ifndef smp_wmb +# define smp_wmb() smp_mb() +#endif + +#ifndef smp_store_release +# define smp_store_release(p, v) \ +do { \ + smp_mb(); \ + WRITE_ONCE(*p, v); \ +} while (0) +#endif + +#ifndef smp_load_acquire +# define smp_load_acquire(p) \ +({ \ + typeof(*p) ___p = READ_ONCE(*p); \ + smp_mb(); \ + ___p; \ +}) +#endif + +#endif /* __LINUX_COMPILER_H */ diff --git a/bpftool/libbpf/include/linux/err.h b/bpftool/libbpf/include/linux/err.h new file mode 100644 index 0000000..1b1dafb --- /dev/null +++ b/bpftool/libbpf/include/linux/err.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_ERR_H +#define __LINUX_ERR_H + +#include +#include + +#define MAX_ERRNO 4095 + +#define IS_ERR_VALUE(x) ((x) >= (unsigned long)-MAX_ERRNO) + +static inline void * ERR_PTR(long error_) +{ + return (void *) error_; +} + +static inline long PTR_ERR(const void *ptr) +{ + return (long) ptr; +} + +static inline bool IS_ERR(const void *ptr) +{ + return IS_ERR_VALUE((unsigned long)ptr); +} + +static inline bool IS_ERR_OR_NULL(const void *ptr) +{ + return (!ptr) || IS_ERR_VALUE((unsigned long)ptr); +} + +static inline long PTR_ERR_OR_ZERO(const void *ptr) +{ + return IS_ERR(ptr) ? PTR_ERR(ptr) : 0; +} + +#endif diff --git a/bpftool/libbpf/include/linux/filter.h b/bpftool/libbpf/include/linux/filter.h new file mode 100644 index 0000000..e7e3373 --- /dev/null +++ b/bpftool/libbpf/include/linux/filter.h @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_FILTER_H +#define __LINUX_FILTER_H + +#include + +#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \ + ((struct bpf_insn) { \ + .code = CODE, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = IMM }) + +#define BPF_ALU32_IMM(OP, DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_ALU64_IMM(OP, DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_MOV64_IMM(DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_MOV | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_EXIT_INSN() \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_EXIT, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = 0 }) + +#define BPF_EMIT_CALL(FUNC) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_CALL, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = ((FUNC) - BPF_FUNC_unspec) }) + +#define BPF_LDX_MEM(SIZE, DST, SRC, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = 0 }) + +#define BPF_STX_MEM(SIZE, DST, SRC, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = 0 }) + +#define BPF_ST_MEM(SIZE, DST, OFF, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +#define BPF_MOV64_REG(DST, SRC) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_MOV | BPF_X, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = 0, \ + .imm = 0 }) + +#define BPF_MOV32_IMM(DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU | BPF_MOV | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_LD_IMM64_RAW_FULL(DST, SRC, OFF1, OFF2, IMM1, IMM2) \ + ((struct bpf_insn) { \ + .code = BPF_LD | BPF_DW | BPF_IMM, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF1, \ + .imm = IMM1 }), \ + ((struct bpf_insn) { \ + .code = 0, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = OFF2, \ + .imm = IMM2 }) + +#define BPF_LD_MAP_FD(DST, MAP_FD) \ + BPF_LD_IMM64_RAW_FULL(DST, BPF_PSEUDO_MAP_FD, 0, 0, \ + MAP_FD, 0) + +#define BPF_LD_MAP_VALUE(DST, MAP_FD, VALUE_OFF) \ + BPF_LD_IMM64_RAW_FULL(DST, BPF_PSEUDO_MAP_VALUE, 0, 0, \ + MAP_FD, VALUE_OFF) + +#define BPF_JMP_IMM(OP, DST, IMM, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +#define BPF_JMP32_IMM(OP, DST, IMM, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP32 | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +#endif diff --git a/bpftool/libbpf/include/linux/kernel.h b/bpftool/libbpf/include/linux/kernel.h new file mode 100644 index 0000000..a4a7a9d --- /dev/null +++ b/bpftool/libbpf/include/linux/kernel.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_KERNEL_H +#define __LINUX_KERNEL_H + +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif + +#ifndef container_of +#define container_of(ptr, type, member) ({ \ + const typeof(((type *)0)->member) * __mptr = (ptr); \ + (type *)((char *)__mptr - offsetof(type, member)); }) +#endif + +#ifndef max +#define max(x, y) ({ \ + typeof(x) _max1 = (x); \ + typeof(y) _max2 = (y); \ + (void) (&_max1 == &_max2); \ + _max1 > _max2 ? _max1 : _max2; }) +#endif + +#ifndef min +#define min(x, y) ({ \ + typeof(x) _min1 = (x); \ + typeof(y) _min2 = (y); \ + (void) (&_min1 == &_min2); \ + _min1 < _min2 ? _min1 : _min2; }) +#endif + +#ifndef roundup +#define roundup(x, y) ( \ +{ \ + const typeof(y) __y = y; \ + (((x) + (__y - 1)) / __y) * __y; \ +} \ +) +#endif + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) + +#endif diff --git a/bpftool/libbpf/include/linux/list.h b/bpftool/libbpf/include/linux/list.h new file mode 100644 index 0000000..fc91c34 --- /dev/null +++ b/bpftool/libbpf/include/linux/list.h @@ -0,0 +1,91 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_LIST_H +#define __LINUX_LIST_H + +#define LIST_HEAD_INIT(name) { &(name), &(name) } +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define POISON_POINTER_DELTA 0 +#define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA) +#define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA) + + +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} + +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty() on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void __list_del_entry(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} + +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) +#define list_next_entry(pos, member) \ + list_entry((pos)->member.next, typeof(*(pos)), member) +#define list_for_each_entry(pos, head, member) \ + for (pos = list_first_entry(head, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_next_entry(pos, member)) + +#endif diff --git a/bpftool/libbpf/include/linux/overflow.h b/bpftool/libbpf/include/linux/overflow.h new file mode 100644 index 0000000..53d7580 --- /dev/null +++ b/bpftool/libbpf/include/linux/overflow.h @@ -0,0 +1,90 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_OVERFLOW_H +#define __LINUX_OVERFLOW_H + +#define is_signed_type(type) (((type)(-1)) < (type)1) +#define __type_half_max(type) ((type)1 << (8*sizeof(type) - 1 - is_signed_type(type))) +#define type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T))) +#define type_min(T) ((T)((T)-type_max(T)-(T)1)) + +#ifndef unlikely +#define unlikely(x) __builtin_expect(!!(x), 0) +#endif + +#ifdef __GNUC__ +#define GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +#if GCC_VERSION >= 50100 +#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1 +#endif +#endif + +#ifdef COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW + +#define check_mul_overflow(a, b, d) ({ \ + typeof(a) __a = (a); \ + typeof(b) __b = (b); \ + typeof(d) __d = (d); \ + (void) (&__a == &__b); \ + (void) (&__a == __d); \ + __builtin_mul_overflow(__a, __b, __d); \ +}) + +#else + +/* + * If one of a or b is a compile-time constant, this avoids a division. + */ +#define __unsigned_mul_overflow(a, b, d) ({ \ + typeof(a) __a = (a); \ + typeof(b) __b = (b); \ + typeof(d) __d = (d); \ + (void) (&__a == &__b); \ + (void) (&__a == __d); \ + *__d = __a * __b; \ + __builtin_constant_p(__b) ? \ + __b > 0 && __a > type_max(typeof(__a)) / __b : \ + __a > 0 && __b > type_max(typeof(__b)) / __a; \ +}) + +/* + * Signed multiplication is rather hard. gcc always follows C99, so + * division is truncated towards 0. This means that we can write the + * overflow check like this: + * + * (a > 0 && (b > MAX/a || b < MIN/a)) || + * (a < -1 && (b > MIN/a || b < MAX/a) || + * (a == -1 && b == MIN) + * + * The redundant casts of -1 are to silence an annoying -Wtype-limits + * (included in -Wextra) warning: When the type is u8 or u16, the + * __b_c_e in check_mul_overflow obviously selects + * __unsigned_mul_overflow, but unfortunately gcc still parses this + * code and warns about the limited range of __b. + */ + +#define __signed_mul_overflow(a, b, d) ({ \ + typeof(a) __a = (a); \ + typeof(b) __b = (b); \ + typeof(d) __d = (d); \ + typeof(a) __tmax = type_max(typeof(a)); \ + typeof(a) __tmin = type_min(typeof(a)); \ + (void) (&__a == &__b); \ + (void) (&__a == __d); \ + *__d = (__u64)__a * (__u64)__b; \ + (__b > 0 && (__a > __tmax/__b || __a < __tmin/__b)) || \ + (__b < (typeof(__b))-1 && (__a > __tmin/__b || __a < __tmax/__b)) || \ + (__b == (typeof(__b))-1 && __a == __tmin); \ +}) + +#define check_mul_overflow(a, b, d) \ + __builtin_choose_expr(is_signed_type(typeof(a)), \ + __signed_mul_overflow(a, b, d), \ + __unsigned_mul_overflow(a, b, d)) + + +#endif /* COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW */ + +#endif diff --git a/bpftool/libbpf/include/linux/ring_buffer.h b/bpftool/libbpf/include/linux/ring_buffer.h new file mode 100644 index 0000000..fc4677b --- /dev/null +++ b/bpftool/libbpf/include/linux/ring_buffer.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef _TOOLS_LINUX_RING_BUFFER_H_ +#define _TOOLS_LINUX_RING_BUFFER_H_ + +#include + +static inline __u64 ring_buffer_read_head(struct perf_event_mmap_page *base) +{ + return smp_load_acquire(&base->data_head); +} + +static inline void ring_buffer_write_tail(struct perf_event_mmap_page *base, + __u64 tail) +{ + smp_store_release(&base->data_tail, tail); +} + +#endif /* _TOOLS_LINUX_RING_BUFFER_H_ */ diff --git a/bpftool/libbpf/include/linux/types.h b/bpftool/libbpf/include/linux/types.h new file mode 100644 index 0000000..b15252a --- /dev/null +++ b/bpftool/libbpf/include/linux/types.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_TYPES_H +#define __LINUX_TYPES_H + +#include +#include +#include + +#include + +#include +#include + +#define __bitwise__ +#define __bitwise __bitwise__ + +typedef __u16 __bitwise __le16; +typedef __u16 __bitwise __be16; +typedef __u32 __bitwise __le32; +typedef __u32 __bitwise __be32; +typedef __u64 __bitwise __le64; +typedef __u64 __bitwise __be64; + +#ifndef __aligned_u64 +# define __aligned_u64 __u64 __attribute__((aligned(8))) +#endif + +struct list_head { + struct list_head *next, *prev; +}; + +#endif diff --git a/bpftool/libbpf/include/uapi/linux/bpf.h b/bpftool/libbpf/include/uapi/linux/bpf.h new file mode 100644 index 0000000..62ce1f5 --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/bpf.h @@ -0,0 +1,7086 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + */ +#ifndef _UAPI__LINUX_BPF_H__ +#define _UAPI__LINUX_BPF_H__ + +#include +#include + +/* Extended instruction set based on top of classic BPF */ + +/* instruction classes */ +#define BPF_JMP32 0x06 /* jmp mode in word width */ +#define BPF_ALU64 0x07 /* alu mode in double word width */ + +/* ld/ldx fields */ +#define BPF_DW 0x18 /* double word (64-bit) */ +#define BPF_ATOMIC 0xc0 /* atomic memory ops - op type in immediate */ +#define BPF_XADD 0xc0 /* exclusive add - legacy name */ + +/* alu/jmp fields */ +#define BPF_MOV 0xb0 /* mov reg to reg */ +#define BPF_ARSH 0xc0 /* sign extending arithmetic shift right */ + +/* change endianness of a register */ +#define BPF_END 0xd0 /* flags for endianness conversion: */ +#define BPF_TO_LE 0x00 /* convert to little-endian */ +#define BPF_TO_BE 0x08 /* convert to big-endian */ +#define BPF_FROM_LE BPF_TO_LE +#define BPF_FROM_BE BPF_TO_BE + +/* jmp encodings */ +#define BPF_JNE 0x50 /* jump != */ +#define BPF_JLT 0xa0 /* LT is unsigned, '<' */ +#define BPF_JLE 0xb0 /* LE is unsigned, '<=' */ +#define BPF_JSGT 0x60 /* SGT is signed '>', GT in x86 */ +#define BPF_JSGE 0x70 /* SGE is signed '>=', GE in x86 */ +#define BPF_JSLT 0xc0 /* SLT is signed, '<' */ +#define BPF_JSLE 0xd0 /* SLE is signed, '<=' */ +#define BPF_CALL 0x80 /* function call */ +#define BPF_EXIT 0x90 /* function return */ + +/* atomic op type fields (stored in immediate) */ +#define BPF_FETCH 0x01 /* not an opcode on its own, used to build others */ +#define BPF_XCHG (0xe0 | BPF_FETCH) /* atomic exchange */ +#define BPF_CMPXCHG (0xf0 | BPF_FETCH) /* atomic compare-and-write */ + +/* Register numbers */ +enum { + BPF_REG_0 = 0, + BPF_REG_1, + BPF_REG_2, + BPF_REG_3, + BPF_REG_4, + BPF_REG_5, + BPF_REG_6, + BPF_REG_7, + BPF_REG_8, + BPF_REG_9, + BPF_REG_10, + __MAX_BPF_REG, +}; + +/* BPF has 10 general purpose 64-bit registers and stack frame. */ +#define MAX_BPF_REG __MAX_BPF_REG + +struct bpf_insn { + __u8 code; /* opcode */ + __u8 dst_reg:4; /* dest register */ + __u8 src_reg:4; /* source register */ + __s16 off; /* signed offset */ + __s32 imm; /* signed immediate constant */ +}; + +/* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */ +struct bpf_lpm_trie_key { + __u32 prefixlen; /* up to 32 for AF_INET, 128 for AF_INET6 */ + __u8 data[0]; /* Arbitrary size */ +}; + +struct bpf_cgroup_storage_key { + __u64 cgroup_inode_id; /* cgroup inode id */ + __u32 attach_type; /* program attach type (enum bpf_attach_type) */ +}; + +enum bpf_cgroup_iter_order { + BPF_CGROUP_ITER_ORDER_UNSPEC = 0, + BPF_CGROUP_ITER_SELF_ONLY, /* process only a single object. */ + BPF_CGROUP_ITER_DESCENDANTS_PRE, /* walk descendants in pre-order. */ + BPF_CGROUP_ITER_DESCENDANTS_POST, /* walk descendants in post-order. */ + BPF_CGROUP_ITER_ANCESTORS_UP, /* walk ancestors upward. */ +}; + +union bpf_iter_link_info { + struct { + __u32 map_fd; + } map; + struct { + enum bpf_cgroup_iter_order order; + + /* At most one of cgroup_fd and cgroup_id can be non-zero. If + * both are zero, the walk starts from the default cgroup v2 + * root. For walking v1 hierarchy, one should always explicitly + * specify cgroup_fd. + */ + __u32 cgroup_fd; + __u64 cgroup_id; + } cgroup; + /* Parameters of task iterators. */ + struct { + __u32 tid; + __u32 pid; + __u32 pid_fd; + } task; +}; + +/* BPF syscall commands, see bpf(2) man-page for more details. */ +/** + * DOC: eBPF Syscall Preamble + * + * The operation to be performed by the **bpf**\ () system call is determined + * by the *cmd* argument. Each operation takes an accompanying argument, + * provided via *attr*, which is a pointer to a union of type *bpf_attr* (see + * below). The size argument is the size of the union pointed to by *attr*. + */ +/** + * DOC: eBPF Syscall Commands + * + * BPF_MAP_CREATE + * Description + * Create a map and return a file descriptor that refers to the + * map. The close-on-exec file descriptor flag (see **fcntl**\ (2)) + * is automatically enabled for the new file descriptor. + * + * Applying **close**\ (2) to the file descriptor returned by + * **BPF_MAP_CREATE** will delete the map (but see NOTES). + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_MAP_LOOKUP_ELEM + * Description + * Look up an element with a given *key* in the map referred to + * by the file descriptor *map_fd*. + * + * The *flags* argument may be specified as one of the + * following: + * + * **BPF_F_LOCK** + * Look up the value of a spin-locked map without + * returning the lock. This must be specified if the + * elements contain a spinlock. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_UPDATE_ELEM + * Description + * Create or update an element (key/value pair) in a specified map. + * + * The *flags* argument should be specified as one of the + * following: + * + * **BPF_ANY** + * Create a new element or update an existing element. + * **BPF_NOEXIST** + * Create a new element only if it did not exist. + * **BPF_EXIST** + * Update an existing element. + * **BPF_F_LOCK** + * Update a spin_lock-ed map element. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * May set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, + * **E2BIG**, **EEXIST**, or **ENOENT**. + * + * **E2BIG** + * The number of elements in the map reached the + * *max_entries* limit specified at map creation time. + * **EEXIST** + * If *flags* specifies **BPF_NOEXIST** and the element + * with *key* already exists in the map. + * **ENOENT** + * If *flags* specifies **BPF_EXIST** and the element with + * *key* does not exist in the map. + * + * BPF_MAP_DELETE_ELEM + * Description + * Look up and delete an element by key in a specified map. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_GET_NEXT_KEY + * Description + * Look up an element by key in a specified map and return the key + * of the next element. Can be used to iterate over all elements + * in the map. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * The following cases can be used to iterate over all elements of + * the map: + * + * * If *key* is not found, the operation returns zero and sets + * the *next_key* pointer to the key of the first element. + * * If *key* is found, the operation returns zero and sets the + * *next_key* pointer to the key of the next element. + * * If *key* is the last element, returns -1 and *errno* is set + * to **ENOENT**. + * + * May set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or + * **EINVAL** on error. + * + * BPF_PROG_LOAD + * Description + * Verify and load an eBPF program, returning a new file + * descriptor associated with the program. + * + * Applying **close**\ (2) to the file descriptor returned by + * **BPF_PROG_LOAD** will unload the eBPF program (but see NOTES). + * + * The close-on-exec file descriptor flag (see **fcntl**\ (2)) is + * automatically enabled for the new file descriptor. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_OBJ_PIN + * Description + * Pin an eBPF program or map referred by the specified *bpf_fd* + * to the provided *pathname* on the filesystem. + * + * The *pathname* argument must not contain a dot ("."). + * + * On success, *pathname* retains a reference to the eBPF object, + * preventing deallocation of the object when the original + * *bpf_fd* is closed. This allow the eBPF object to live beyond + * **close**\ (\ *bpf_fd*\ ), and hence the lifetime of the parent + * process. + * + * Applying **unlink**\ (2) or similar calls to the *pathname* + * unpins the object from the filesystem, removing the reference. + * If no other file descriptors or filesystem nodes refer to the + * same object, it will be deallocated (see NOTES). + * + * The filesystem type for the parent directory of *pathname* must + * be **BPF_FS_MAGIC**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_OBJ_GET + * Description + * Open a file descriptor for the eBPF object pinned to the + * specified *pathname*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_PROG_ATTACH + * Description + * Attach an eBPF program to a *target_fd* at the specified + * *attach_type* hook. + * + * The *attach_type* specifies the eBPF attachment point to + * attach the program to, and must be one of *bpf_attach_type* + * (see below). + * + * The *attach_bpf_fd* must be a valid file descriptor for a + * loaded eBPF program of a cgroup, flow dissector, LIRC, sockmap + * or sock_ops type corresponding to the specified *attach_type*. + * + * The *target_fd* must be a valid file descriptor for a kernel + * object which depends on the attach type of *attach_bpf_fd*: + * + * **BPF_PROG_TYPE_CGROUP_DEVICE**, + * **BPF_PROG_TYPE_CGROUP_SKB**, + * **BPF_PROG_TYPE_CGROUP_SOCK**, + * **BPF_PROG_TYPE_CGROUP_SOCK_ADDR**, + * **BPF_PROG_TYPE_CGROUP_SOCKOPT**, + * **BPF_PROG_TYPE_CGROUP_SYSCTL**, + * **BPF_PROG_TYPE_SOCK_OPS** + * + * Control Group v2 hierarchy with the eBPF controller + * enabled. Requires the kernel to be compiled with + * **CONFIG_CGROUP_BPF**. + * + * **BPF_PROG_TYPE_FLOW_DISSECTOR** + * + * Network namespace (eg /proc/self/ns/net). + * + * **BPF_PROG_TYPE_LIRC_MODE2** + * + * LIRC device path (eg /dev/lircN). Requires the kernel + * to be compiled with **CONFIG_BPF_LIRC_MODE2**. + * + * **BPF_PROG_TYPE_SK_SKB**, + * **BPF_PROG_TYPE_SK_MSG** + * + * eBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**). + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_DETACH + * Description + * Detach the eBPF program associated with the *target_fd* at the + * hook specified by *attach_type*. The program must have been + * previously attached using **BPF_PROG_ATTACH**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_TEST_RUN + * Description + * Run the eBPF program associated with the *prog_fd* a *repeat* + * number of times against a provided program context *ctx_in* and + * data *data_in*, and return the modified program context + * *ctx_out*, *data_out* (for example, packet data), result of the + * execution *retval*, and *duration* of the test run. + * + * The sizes of the buffers provided as input and output + * parameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must + * be provided in the corresponding variables *ctx_size_in*, + * *ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any + * of these parameters are not provided (ie set to NULL), the + * corresponding size field must be zero. + * + * Some program types have particular requirements: + * + * **BPF_PROG_TYPE_SK_LOOKUP** + * *data_in* and *data_out* must be NULL. + * + * **BPF_PROG_TYPE_RAW_TRACEPOINT**, + * **BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE** + * + * *ctx_out*, *data_in* and *data_out* must be NULL. + * *repeat* must be zero. + * + * BPF_PROG_RUN is an alias for BPF_PROG_TEST_RUN. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * **ENOSPC** + * Either *data_size_out* or *ctx_size_out* is too small. + * **ENOTSUPP** + * This command is not supported by the program type of + * the program referred to by *prog_fd*. + * + * BPF_PROG_GET_NEXT_ID + * Description + * Fetch the next eBPF program currently loaded into the kernel. + * + * Looks for the eBPF program with an id greater than *start_id* + * and updates *next_id* on success. If no other eBPF programs + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_MAP_GET_NEXT_ID + * Description + * Fetch the next eBPF map currently loaded into the kernel. + * + * Looks for the eBPF map with an id greater than *start_id* + * and updates *next_id* on success. If no other eBPF maps + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_PROG_GET_FD_BY_ID + * Description + * Open a file descriptor for the eBPF program corresponding to + * *prog_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_MAP_GET_FD_BY_ID + * Description + * Open a file descriptor for the eBPF map corresponding to + * *map_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_OBJ_GET_INFO_BY_FD + * Description + * Obtain information about the eBPF object corresponding to + * *bpf_fd*. + * + * Populates up to *info_len* bytes of *info*, which will be in + * one of the following formats depending on the eBPF object type + * of *bpf_fd*: + * + * * **struct bpf_prog_info** + * * **struct bpf_map_info** + * * **struct bpf_btf_info** + * * **struct bpf_link_info** + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_QUERY + * Description + * Obtain information about eBPF programs associated with the + * specified *attach_type* hook. + * + * The *target_fd* must be a valid file descriptor for a kernel + * object which depends on the attach type of *attach_bpf_fd*: + * + * **BPF_PROG_TYPE_CGROUP_DEVICE**, + * **BPF_PROG_TYPE_CGROUP_SKB**, + * **BPF_PROG_TYPE_CGROUP_SOCK**, + * **BPF_PROG_TYPE_CGROUP_SOCK_ADDR**, + * **BPF_PROG_TYPE_CGROUP_SOCKOPT**, + * **BPF_PROG_TYPE_CGROUP_SYSCTL**, + * **BPF_PROG_TYPE_SOCK_OPS** + * + * Control Group v2 hierarchy with the eBPF controller + * enabled. Requires the kernel to be compiled with + * **CONFIG_CGROUP_BPF**. + * + * **BPF_PROG_TYPE_FLOW_DISSECTOR** + * + * Network namespace (eg /proc/self/ns/net). + * + * **BPF_PROG_TYPE_LIRC_MODE2** + * + * LIRC device path (eg /dev/lircN). Requires the kernel + * to be compiled with **CONFIG_BPF_LIRC_MODE2**. + * + * **BPF_PROG_QUERY** always fetches the number of programs + * attached and the *attach_flags* which were used to attach those + * programs. Additionally, if *prog_ids* is nonzero and the number + * of attached programs is less than *prog_cnt*, populates + * *prog_ids* with the eBPF program ids of the programs attached + * at *target_fd*. + * + * The following flags may alter the result: + * + * **BPF_F_QUERY_EFFECTIVE** + * Only return information regarding programs which are + * currently effective at the specified *target_fd*. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_RAW_TRACEPOINT_OPEN + * Description + * Attach an eBPF program to a tracepoint *name* to access kernel + * internal arguments of the tracepoint in their raw form. + * + * The *prog_fd* must be a valid file descriptor associated with + * a loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**. + * + * No ABI guarantees are made about the content of tracepoint + * arguments exposed to the corresponding eBPF program. + * + * Applying **close**\ (2) to the file descriptor returned by + * **BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES). + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_BTF_LOAD + * Description + * Verify and load BPF Type Format (BTF) metadata into the kernel, + * returning a new file descriptor associated with the metadata. + * BTF is described in more detail at + * https://www.kernel.org/doc/html/latest/bpf/btf.html. + * + * The *btf* parameter must point to valid memory providing + * *btf_size* bytes of BTF binary metadata. + * + * The returned file descriptor can be passed to other **bpf**\ () + * subcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to + * associate the BTF with those objects. + * + * Similar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional + * parameters to specify a *btf_log_buf*, *btf_log_size* and + * *btf_log_level* which allow the kernel to return freeform log + * output regarding the BTF verification process. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_BTF_GET_FD_BY_ID + * Description + * Open a file descriptor for the BPF Type Format (BTF) + * corresponding to *btf_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_TASK_FD_QUERY + * Description + * Obtain information about eBPF programs associated with the + * target process identified by *pid* and *fd*. + * + * If the *pid* and *fd* are associated with a tracepoint, kprobe + * or uprobe perf event, then the *prog_id* and *fd_type* will + * be populated with the eBPF program id and file descriptor type + * of type **bpf_task_fd_type**. If associated with a kprobe or + * uprobe, the *probe_offset* and *probe_addr* will also be + * populated. Optionally, if *buf* is provided, then up to + * *buf_len* bytes of *buf* will be populated with the name of + * the tracepoint, kprobe or uprobe. + * + * The resulting *prog_id* may be introspected in deeper detail + * using **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_LOOKUP_AND_DELETE_ELEM + * Description + * Look up an element with the given *key* in the map referred to + * by the file descriptor *fd*, and if found, delete the element. + * + * For **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map + * types, the *flags* argument needs to be set to 0, but for other + * map types, it may be specified as: + * + * **BPF_F_LOCK** + * Look up and delete the value of a spin-locked map + * without returning the lock. This must be specified if + * the elements contain a spinlock. + * + * The **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types + * implement this command as a "pop" operation, deleting the top + * element rather than one corresponding to *key*. + * The *key* and *key_len* parameters should be zeroed when + * issuing this operation for these map types. + * + * This command is only valid for the following map types: + * * **BPF_MAP_TYPE_QUEUE** + * * **BPF_MAP_TYPE_STACK** + * * **BPF_MAP_TYPE_HASH** + * * **BPF_MAP_TYPE_PERCPU_HASH** + * * **BPF_MAP_TYPE_LRU_HASH** + * * **BPF_MAP_TYPE_LRU_PERCPU_HASH** + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_FREEZE + * Description + * Freeze the permissions of the specified map. + * + * Write permissions may be frozen by passing zero *flags*. + * Upon success, no future syscall invocations may alter the + * map state of *map_fd*. Write operations from eBPF programs + * are still possible for a frozen map. + * + * Not supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_BTF_GET_NEXT_ID + * Description + * Fetch the next BPF Type Format (BTF) object currently loaded + * into the kernel. + * + * Looks for the BTF object with an id greater than *start_id* + * and updates *next_id* on success. If no other BTF objects + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_MAP_LOOKUP_BATCH + * Description + * Iterate and fetch multiple elements in a map. + * + * Two opaque values are used to manage batch operations, + * *in_batch* and *out_batch*. Initially, *in_batch* must be set + * to NULL to begin the batched operation. After each subsequent + * **BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant + * *out_batch* as the *in_batch* for the next operation to + * continue iteration from the current point. + * + * The *keys* and *values* are output parameters which must point + * to memory large enough to hold *count* items based on the key + * and value size of the map *map_fd*. The *keys* buffer must be + * of *key_size* * *count*. The *values* buffer must be of + * *value_size* * *count*. + * + * The *elem_flags* argument may be specified as one of the + * following: + * + * **BPF_F_LOCK** + * Look up the value of a spin-locked map without + * returning the lock. This must be specified if the + * elements contain a spinlock. + * + * On success, *count* elements from the map are copied into the + * user buffer, with the keys copied into *keys* and the values + * copied into the corresponding indices in *values*. + * + * If an error is returned and *errno* is not **EFAULT**, *count* + * is set to the number of successfully processed elements. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * May set *errno* to **ENOSPC** to indicate that *keys* or + * *values* is too small to dump an entire bucket during + * iteration of a hash-based map type. + * + * BPF_MAP_LOOKUP_AND_DELETE_BATCH + * Description + * Iterate and delete all elements in a map. + * + * This operation has the same behavior as + * **BPF_MAP_LOOKUP_BATCH** with two exceptions: + * + * * Every element that is successfully returned is also deleted + * from the map. This is at least *count* elements. Note that + * *count* is both an input and an output parameter. + * * Upon returning with *errno* set to **EFAULT**, up to + * *count* elements may be deleted without returning the keys + * and values of the deleted elements. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_UPDATE_BATCH + * Description + * Update multiple elements in a map by *key*. + * + * The *keys* and *values* are input parameters which must point + * to memory large enough to hold *count* items based on the key + * and value size of the map *map_fd*. The *keys* buffer must be + * of *key_size* * *count*. The *values* buffer must be of + * *value_size* * *count*. + * + * Each element specified in *keys* is sequentially updated to the + * value in the corresponding index in *values*. The *in_batch* + * and *out_batch* parameters are ignored and should be zeroed. + * + * The *elem_flags* argument should be specified as one of the + * following: + * + * **BPF_ANY** + * Create new elements or update a existing elements. + * **BPF_NOEXIST** + * Create new elements only if they do not exist. + * **BPF_EXIST** + * Update existing elements. + * **BPF_F_LOCK** + * Update spin_lock-ed map elements. This must be + * specified if the map value contains a spinlock. + * + * On success, *count* elements from the map are updated. + * + * If an error is returned and *errno* is not **EFAULT**, *count* + * is set to the number of successfully processed elements. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * May set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or + * **E2BIG**. **E2BIG** indicates that the number of elements in + * the map reached the *max_entries* limit specified at map + * creation time. + * + * May set *errno* to one of the following error codes under + * specific circumstances: + * + * **EEXIST** + * If *flags* specifies **BPF_NOEXIST** and the element + * with *key* already exists in the map. + * **ENOENT** + * If *flags* specifies **BPF_EXIST** and the element with + * *key* does not exist in the map. + * + * BPF_MAP_DELETE_BATCH + * Description + * Delete multiple elements in a map by *key*. + * + * The *keys* parameter is an input parameter which must point + * to memory large enough to hold *count* items based on the key + * size of the map *map_fd*, that is, *key_size* * *count*. + * + * Each element specified in *keys* is sequentially deleted. The + * *in_batch*, *out_batch*, and *values* parameters are ignored + * and should be zeroed. + * + * The *elem_flags* argument may be specified as one of the + * following: + * + * **BPF_F_LOCK** + * Look up the value of a spin-locked map without + * returning the lock. This must be specified if the + * elements contain a spinlock. + * + * On success, *count* elements from the map are updated. + * + * If an error is returned and *errno* is not **EFAULT**, *count* + * is set to the number of successfully processed elements. If + * *errno* is **EFAULT**, up to *count* elements may be been + * deleted. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_LINK_CREATE + * Description + * Attach an eBPF program to a *target_fd* at the specified + * *attach_type* hook and return a file descriptor handle for + * managing the link. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_LINK_UPDATE + * Description + * Update the eBPF program in the specified *link_fd* to + * *new_prog_fd*. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_LINK_GET_FD_BY_ID + * Description + * Open a file descriptor for the eBPF Link corresponding to + * *link_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_LINK_GET_NEXT_ID + * Description + * Fetch the next eBPF link currently loaded into the kernel. + * + * Looks for the eBPF link with an id greater than *start_id* + * and updates *next_id* on success. If no other eBPF links + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_ENABLE_STATS + * Description + * Enable eBPF runtime statistics gathering. + * + * Runtime statistics gathering for the eBPF runtime is disabled + * by default to minimize the corresponding performance overhead. + * This command enables statistics globally. + * + * Multiple programs may independently enable statistics. + * After gathering the desired statistics, eBPF runtime statistics + * may be disabled again by calling **close**\ (2) for the file + * descriptor returned by this function. Statistics will only be + * disabled system-wide when all outstanding file descriptors + * returned by prior calls for this subcommand are closed. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_ITER_CREATE + * Description + * Create an iterator on top of the specified *link_fd* (as + * previously created using **BPF_LINK_CREATE**) and return a + * file descriptor that can be used to trigger the iteration. + * + * If the resulting file descriptor is pinned to the filesystem + * using **BPF_OBJ_PIN**, then subsequent **read**\ (2) syscalls + * for that path will trigger the iterator to read kernel state + * using the eBPF program attached to *link_fd*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_LINK_DETACH + * Description + * Forcefully detach the specified *link_fd* from its + * corresponding attachment point. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_BIND_MAP + * Description + * Bind a map to the lifetime of an eBPF program. + * + * The map identified by *map_fd* is bound to the program + * identified by *prog_fd* and only released when *prog_fd* is + * released. This may be used in cases where metadata should be + * associated with a program which otherwise does not contain any + * references to the map (for example, embedded in the eBPF + * program instructions). + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * NOTES + * eBPF objects (maps and programs) can be shared between processes. + * + * * After **fork**\ (2), the child inherits file descriptors + * referring to the same eBPF objects. + * * File descriptors referring to eBPF objects can be transferred over + * **unix**\ (7) domain sockets. + * * File descriptors referring to eBPF objects can be duplicated in the + * usual way, using **dup**\ (2) and similar calls. + * * File descriptors referring to eBPF objects can be pinned to the + * filesystem using the **BPF_OBJ_PIN** command of **bpf**\ (2). + * + * An eBPF object is deallocated only after all file descriptors referring + * to the object have been closed and no references remain pinned to the + * filesystem or attached (for example, bound to a program or device). + */ +enum bpf_cmd { + BPF_MAP_CREATE, + BPF_MAP_LOOKUP_ELEM, + BPF_MAP_UPDATE_ELEM, + BPF_MAP_DELETE_ELEM, + BPF_MAP_GET_NEXT_KEY, + BPF_PROG_LOAD, + BPF_OBJ_PIN, + BPF_OBJ_GET, + BPF_PROG_ATTACH, + BPF_PROG_DETACH, + BPF_PROG_TEST_RUN, + BPF_PROG_RUN = BPF_PROG_TEST_RUN, + BPF_PROG_GET_NEXT_ID, + BPF_MAP_GET_NEXT_ID, + BPF_PROG_GET_FD_BY_ID, + BPF_MAP_GET_FD_BY_ID, + BPF_OBJ_GET_INFO_BY_FD, + BPF_PROG_QUERY, + BPF_RAW_TRACEPOINT_OPEN, + BPF_BTF_LOAD, + BPF_BTF_GET_FD_BY_ID, + BPF_TASK_FD_QUERY, + BPF_MAP_LOOKUP_AND_DELETE_ELEM, + BPF_MAP_FREEZE, + BPF_BTF_GET_NEXT_ID, + BPF_MAP_LOOKUP_BATCH, + BPF_MAP_LOOKUP_AND_DELETE_BATCH, + BPF_MAP_UPDATE_BATCH, + BPF_MAP_DELETE_BATCH, + BPF_LINK_CREATE, + BPF_LINK_UPDATE, + BPF_LINK_GET_FD_BY_ID, + BPF_LINK_GET_NEXT_ID, + BPF_ENABLE_STATS, + BPF_ITER_CREATE, + BPF_LINK_DETACH, + BPF_PROG_BIND_MAP, +}; + +enum bpf_map_type { + BPF_MAP_TYPE_UNSPEC, + BPF_MAP_TYPE_HASH, + BPF_MAP_TYPE_ARRAY, + BPF_MAP_TYPE_PROG_ARRAY, + BPF_MAP_TYPE_PERF_EVENT_ARRAY, + BPF_MAP_TYPE_PERCPU_HASH, + BPF_MAP_TYPE_PERCPU_ARRAY, + BPF_MAP_TYPE_STACK_TRACE, + BPF_MAP_TYPE_CGROUP_ARRAY, + BPF_MAP_TYPE_LRU_HASH, + BPF_MAP_TYPE_LRU_PERCPU_HASH, + BPF_MAP_TYPE_LPM_TRIE, + BPF_MAP_TYPE_ARRAY_OF_MAPS, + BPF_MAP_TYPE_HASH_OF_MAPS, + BPF_MAP_TYPE_DEVMAP, + BPF_MAP_TYPE_SOCKMAP, + BPF_MAP_TYPE_CPUMAP, + BPF_MAP_TYPE_XSKMAP, + BPF_MAP_TYPE_SOCKHASH, + BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED, + /* BPF_MAP_TYPE_CGROUP_STORAGE is available to bpf programs attaching + * to a cgroup. The newer BPF_MAP_TYPE_CGRP_STORAGE is available to + * both cgroup-attached and other progs and supports all functionality + * provided by BPF_MAP_TYPE_CGROUP_STORAGE. So mark + * BPF_MAP_TYPE_CGROUP_STORAGE deprecated. + */ + BPF_MAP_TYPE_CGROUP_STORAGE = BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED, + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE, + BPF_MAP_TYPE_QUEUE, + BPF_MAP_TYPE_STACK, + BPF_MAP_TYPE_SK_STORAGE, + BPF_MAP_TYPE_DEVMAP_HASH, + BPF_MAP_TYPE_STRUCT_OPS, + BPF_MAP_TYPE_RINGBUF, + BPF_MAP_TYPE_INODE_STORAGE, + BPF_MAP_TYPE_TASK_STORAGE, + BPF_MAP_TYPE_BLOOM_FILTER, + BPF_MAP_TYPE_USER_RINGBUF, + BPF_MAP_TYPE_CGRP_STORAGE, +}; + +/* Note that tracing related programs such as + * BPF_PROG_TYPE_{KPROBE,TRACEPOINT,PERF_EVENT,RAW_TRACEPOINT} + * are not subject to a stable API since kernel internal data + * structures can change from release to release and may + * therefore break existing tracing BPF programs. Tracing BPF + * programs correspond to /a/ specific kernel which is to be + * analyzed, and not /a/ specific kernel /and/ all future ones. + */ +enum bpf_prog_type { + BPF_PROG_TYPE_UNSPEC, + BPF_PROG_TYPE_SOCKET_FILTER, + BPF_PROG_TYPE_KPROBE, + BPF_PROG_TYPE_SCHED_CLS, + BPF_PROG_TYPE_SCHED_ACT, + BPF_PROG_TYPE_TRACEPOINT, + BPF_PROG_TYPE_XDP, + BPF_PROG_TYPE_PERF_EVENT, + BPF_PROG_TYPE_CGROUP_SKB, + BPF_PROG_TYPE_CGROUP_SOCK, + BPF_PROG_TYPE_LWT_IN, + BPF_PROG_TYPE_LWT_OUT, + BPF_PROG_TYPE_LWT_XMIT, + BPF_PROG_TYPE_SOCK_OPS, + BPF_PROG_TYPE_SK_SKB, + BPF_PROG_TYPE_CGROUP_DEVICE, + BPF_PROG_TYPE_SK_MSG, + BPF_PROG_TYPE_RAW_TRACEPOINT, + BPF_PROG_TYPE_CGROUP_SOCK_ADDR, + BPF_PROG_TYPE_LWT_SEG6LOCAL, + BPF_PROG_TYPE_LIRC_MODE2, + BPF_PROG_TYPE_SK_REUSEPORT, + BPF_PROG_TYPE_FLOW_DISSECTOR, + BPF_PROG_TYPE_CGROUP_SYSCTL, + BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, + BPF_PROG_TYPE_CGROUP_SOCKOPT, + BPF_PROG_TYPE_TRACING, + BPF_PROG_TYPE_STRUCT_OPS, + BPF_PROG_TYPE_EXT, + BPF_PROG_TYPE_LSM, + BPF_PROG_TYPE_SK_LOOKUP, + BPF_PROG_TYPE_SYSCALL, /* a program that can execute syscalls */ +}; + +enum bpf_attach_type { + BPF_CGROUP_INET_INGRESS, + BPF_CGROUP_INET_EGRESS, + BPF_CGROUP_INET_SOCK_CREATE, + BPF_CGROUP_SOCK_OPS, + BPF_SK_SKB_STREAM_PARSER, + BPF_SK_SKB_STREAM_VERDICT, + BPF_CGROUP_DEVICE, + BPF_SK_MSG_VERDICT, + BPF_CGROUP_INET4_BIND, + BPF_CGROUP_INET6_BIND, + BPF_CGROUP_INET4_CONNECT, + BPF_CGROUP_INET6_CONNECT, + BPF_CGROUP_INET4_POST_BIND, + BPF_CGROUP_INET6_POST_BIND, + BPF_CGROUP_UDP4_SENDMSG, + BPF_CGROUP_UDP6_SENDMSG, + BPF_LIRC_MODE2, + BPF_FLOW_DISSECTOR, + BPF_CGROUP_SYSCTL, + BPF_CGROUP_UDP4_RECVMSG, + BPF_CGROUP_UDP6_RECVMSG, + BPF_CGROUP_GETSOCKOPT, + BPF_CGROUP_SETSOCKOPT, + BPF_TRACE_RAW_TP, + BPF_TRACE_FENTRY, + BPF_TRACE_FEXIT, + BPF_MODIFY_RETURN, + BPF_LSM_MAC, + BPF_TRACE_ITER, + BPF_CGROUP_INET4_GETPEERNAME, + BPF_CGROUP_INET6_GETPEERNAME, + BPF_CGROUP_INET4_GETSOCKNAME, + BPF_CGROUP_INET6_GETSOCKNAME, + BPF_XDP_DEVMAP, + BPF_CGROUP_INET_SOCK_RELEASE, + BPF_XDP_CPUMAP, + BPF_SK_LOOKUP, + BPF_XDP, + BPF_SK_SKB_VERDICT, + BPF_SK_REUSEPORT_SELECT, + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE, + BPF_PERF_EVENT, + BPF_TRACE_KPROBE_MULTI, + BPF_LSM_CGROUP, + __MAX_BPF_ATTACH_TYPE +}; + +#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE + +enum bpf_link_type { + BPF_LINK_TYPE_UNSPEC = 0, + BPF_LINK_TYPE_RAW_TRACEPOINT = 1, + BPF_LINK_TYPE_TRACING = 2, + BPF_LINK_TYPE_CGROUP = 3, + BPF_LINK_TYPE_ITER = 4, + BPF_LINK_TYPE_NETNS = 5, + BPF_LINK_TYPE_XDP = 6, + BPF_LINK_TYPE_PERF_EVENT = 7, + BPF_LINK_TYPE_KPROBE_MULTI = 8, + BPF_LINK_TYPE_STRUCT_OPS = 9, + + MAX_BPF_LINK_TYPE, +}; + +/* cgroup-bpf attach flags used in BPF_PROG_ATTACH command + * + * NONE(default): No further bpf programs allowed in the subtree. + * + * BPF_F_ALLOW_OVERRIDE: If a sub-cgroup installs some bpf program, + * the program in this cgroup yields to sub-cgroup program. + * + * BPF_F_ALLOW_MULTI: If a sub-cgroup installs some bpf program, + * that cgroup program gets run in addition to the program in this cgroup. + * + * Only one program is allowed to be attached to a cgroup with + * NONE or BPF_F_ALLOW_OVERRIDE flag. + * Attaching another program on top of NONE or BPF_F_ALLOW_OVERRIDE will + * release old program and attach the new one. Attach flags has to match. + * + * Multiple programs are allowed to be attached to a cgroup with + * BPF_F_ALLOW_MULTI flag. They are executed in FIFO order + * (those that were attached first, run first) + * The programs of sub-cgroup are executed first, then programs of + * this cgroup and then programs of parent cgroup. + * When children program makes decision (like picking TCP CA or sock bind) + * parent program has a chance to override it. + * + * With BPF_F_ALLOW_MULTI a new program is added to the end of the list of + * programs for a cgroup. Though it's possible to replace an old program at + * any position by also specifying BPF_F_REPLACE flag and position itself in + * replace_bpf_fd attribute. Old program at this position will be released. + * + * A cgroup with MULTI or OVERRIDE flag allows any attach flags in sub-cgroups. + * A cgroup with NONE doesn't allow any programs in sub-cgroups. + * Ex1: + * cgrp1 (MULTI progs A, B) -> + * cgrp2 (OVERRIDE prog C) -> + * cgrp3 (MULTI prog D) -> + * cgrp4 (OVERRIDE prog E) -> + * cgrp5 (NONE prog F) + * the event in cgrp5 triggers execution of F,D,A,B in that order. + * if prog F is detached, the execution is E,D,A,B + * if prog F and D are detached, the execution is E,A,B + * if prog F, E and D are detached, the execution is C,A,B + * + * All eligible programs are executed regardless of return code from + * earlier programs. + */ +#define BPF_F_ALLOW_OVERRIDE (1U << 0) +#define BPF_F_ALLOW_MULTI (1U << 1) +#define BPF_F_REPLACE (1U << 2) + +/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the + * verifier will perform strict alignment checking as if the kernel + * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set, + * and NET_IP_ALIGN defined to 2. + */ +#define BPF_F_STRICT_ALIGNMENT (1U << 0) + +/* If BPF_F_ANY_ALIGNMENT is used in BPF_PROF_LOAD command, the + * verifier will allow any alignment whatsoever. On platforms + * with strict alignment requirements for loads ands stores (such + * as sparc and mips) the verifier validates that all loads and + * stores provably follow this requirement. This flag turns that + * checking and enforcement off. + * + * It is mostly used for testing when we want to validate the + * context and memory access aspects of the verifier, but because + * of an unaligned access the alignment check would trigger before + * the one we are interested in. + */ +#define BPF_F_ANY_ALIGNMENT (1U << 1) + +/* BPF_F_TEST_RND_HI32 is used in BPF_PROG_LOAD command for testing purpose. + * Verifier does sub-register def/use analysis and identifies instructions whose + * def only matters for low 32-bit, high 32-bit is never referenced later + * through implicit zero extension. Therefore verifier notifies JIT back-ends + * that it is safe to ignore clearing high 32-bit for these instructions. This + * saves some back-ends a lot of code-gen. However such optimization is not + * necessary on some arches, for example x86_64, arm64 etc, whose JIT back-ends + * hence hasn't used verifier's analysis result. But, we really want to have a + * way to be able to verify the correctness of the described optimization on + * x86_64 on which testsuites are frequently exercised. + * + * So, this flag is introduced. Once it is set, verifier will randomize high + * 32-bit for those instructions who has been identified as safe to ignore them. + * Then, if verifier is not doing correct analysis, such randomization will + * regress tests to expose bugs. + */ +#define BPF_F_TEST_RND_HI32 (1U << 2) + +/* The verifier internal test flag. Behavior is undefined */ +#define BPF_F_TEST_STATE_FREQ (1U << 3) + +/* If BPF_F_SLEEPABLE is used in BPF_PROG_LOAD command, the verifier will + * restrict map and helper usage for such programs. Sleepable BPF programs can + * only be attached to hooks where kernel execution context allows sleeping. + * Such programs are allowed to use helpers that may sleep like + * bpf_copy_from_user(). + */ +#define BPF_F_SLEEPABLE (1U << 4) + +/* If BPF_F_XDP_HAS_FRAGS is used in BPF_PROG_LOAD command, the loaded program + * fully support xdp frags. + */ +#define BPF_F_XDP_HAS_FRAGS (1U << 5) + +/* If BPF_F_XDP_DEV_BOUND_ONLY is used in BPF_PROG_LOAD command, the loaded + * program becomes device-bound but can access XDP metadata. + */ +#define BPF_F_XDP_DEV_BOUND_ONLY (1U << 6) + +/* link_create.kprobe_multi.flags used in LINK_CREATE command for + * BPF_TRACE_KPROBE_MULTI attach type to create return probe. + */ +#define BPF_F_KPROBE_MULTI_RETURN (1U << 0) + +/* When BPF ldimm64's insn[0].src_reg != 0 then this can have + * the following extensions: + * + * insn[0].src_reg: BPF_PSEUDO_MAP_[FD|IDX] + * insn[0].imm: map fd or fd_idx + * insn[1].imm: 0 + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of map + * verifier type: CONST_PTR_TO_MAP + */ +#define BPF_PSEUDO_MAP_FD 1 +#define BPF_PSEUDO_MAP_IDX 5 + +/* insn[0].src_reg: BPF_PSEUDO_MAP_[IDX_]VALUE + * insn[0].imm: map fd or fd_idx + * insn[1].imm: offset into value + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of map[0]+offset + * verifier type: PTR_TO_MAP_VALUE + */ +#define BPF_PSEUDO_MAP_VALUE 2 +#define BPF_PSEUDO_MAP_IDX_VALUE 6 + +/* insn[0].src_reg: BPF_PSEUDO_BTF_ID + * insn[0].imm: kernel btd id of VAR + * insn[1].imm: 0 + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of the kernel variable + * verifier type: PTR_TO_BTF_ID or PTR_TO_MEM, depending on whether the var + * is struct/union. + */ +#define BPF_PSEUDO_BTF_ID 3 +/* insn[0].src_reg: BPF_PSEUDO_FUNC + * insn[0].imm: insn offset to the func + * insn[1].imm: 0 + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of the function + * verifier type: PTR_TO_FUNC. + */ +#define BPF_PSEUDO_FUNC 4 + +/* when bpf_call->src_reg == BPF_PSEUDO_CALL, bpf_call->imm == pc-relative + * offset to another bpf function + */ +#define BPF_PSEUDO_CALL 1 +/* when bpf_call->src_reg == BPF_PSEUDO_KFUNC_CALL, + * bpf_call->imm == btf_id of a BTF_KIND_FUNC in the running kernel + */ +#define BPF_PSEUDO_KFUNC_CALL 2 + +/* flags for BPF_MAP_UPDATE_ELEM command */ +enum { + BPF_ANY = 0, /* create new element or update existing */ + BPF_NOEXIST = 1, /* create new element if it didn't exist */ + BPF_EXIST = 2, /* update existing element */ + BPF_F_LOCK = 4, /* spin_lock-ed map_lookup/map_update */ +}; + +/* flags for BPF_MAP_CREATE command */ +enum { + BPF_F_NO_PREALLOC = (1U << 0), +/* Instead of having one common LRU list in the + * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list + * which can scale and perform better. + * Note, the LRU nodes (including free nodes) cannot be moved + * across different LRU lists. + */ + BPF_F_NO_COMMON_LRU = (1U << 1), +/* Specify numa node during map creation */ + BPF_F_NUMA_NODE = (1U << 2), + +/* Flags for accessing BPF object from syscall side. */ + BPF_F_RDONLY = (1U << 3), + BPF_F_WRONLY = (1U << 4), + +/* Flag for stack_map, store build_id+offset instead of pointer */ + BPF_F_STACK_BUILD_ID = (1U << 5), + +/* Zero-initialize hash function seed. This should only be used for testing. */ + BPF_F_ZERO_SEED = (1U << 6), + +/* Flags for accessing BPF object from program side. */ + BPF_F_RDONLY_PROG = (1U << 7), + BPF_F_WRONLY_PROG = (1U << 8), + +/* Clone map from listener for newly accepted socket */ + BPF_F_CLONE = (1U << 9), + +/* Enable memory-mapping BPF map */ + BPF_F_MMAPABLE = (1U << 10), + +/* Share perf_event among processes */ + BPF_F_PRESERVE_ELEMS = (1U << 11), + +/* Create a map that is suitable to be an inner map with dynamic max entries */ + BPF_F_INNER_MAP = (1U << 12), +}; + +/* Flags for BPF_PROG_QUERY. */ + +/* Query effective (directly attached + inherited from ancestor cgroups) + * programs that will be executed for events within a cgroup. + * attach_flags with this flag are always returned 0. + */ +#define BPF_F_QUERY_EFFECTIVE (1U << 0) + +/* Flags for BPF_PROG_TEST_RUN */ + +/* If set, run the test on the cpu specified by bpf_attr.test.cpu */ +#define BPF_F_TEST_RUN_ON_CPU (1U << 0) +/* If set, XDP frames will be transmitted after processing */ +#define BPF_F_TEST_XDP_LIVE_FRAMES (1U << 1) + +/* type for BPF_ENABLE_STATS */ +enum bpf_stats_type { + /* enabled run_time_ns and run_cnt */ + BPF_STATS_RUN_TIME = 0, +}; + +enum bpf_stack_build_id_status { + /* user space need an empty entry to identify end of a trace */ + BPF_STACK_BUILD_ID_EMPTY = 0, + /* with valid build_id and offset */ + BPF_STACK_BUILD_ID_VALID = 1, + /* couldn't get build_id, fallback to ip */ + BPF_STACK_BUILD_ID_IP = 2, +}; + +#define BPF_BUILD_ID_SIZE 20 +struct bpf_stack_build_id { + __s32 status; + unsigned char build_id[BPF_BUILD_ID_SIZE]; + union { + __u64 offset; + __u64 ip; + }; +}; + +#define BPF_OBJ_NAME_LEN 16U + +union bpf_attr { + struct { /* anonymous struct used by BPF_MAP_CREATE command */ + __u32 map_type; /* one of enum bpf_map_type */ + __u32 key_size; /* size of key in bytes */ + __u32 value_size; /* size of value in bytes */ + __u32 max_entries; /* max number of entries in a map */ + __u32 map_flags; /* BPF_MAP_CREATE related + * flags defined above. + */ + __u32 inner_map_fd; /* fd pointing to the inner map */ + __u32 numa_node; /* numa node (effective only if + * BPF_F_NUMA_NODE is set). + */ + char map_name[BPF_OBJ_NAME_LEN]; + __u32 map_ifindex; /* ifindex of netdev to create on */ + __u32 btf_fd; /* fd pointing to a BTF type data */ + __u32 btf_key_type_id; /* BTF type_id of the key */ + __u32 btf_value_type_id; /* BTF type_id of the value */ + __u32 btf_vmlinux_value_type_id;/* BTF type_id of a kernel- + * struct stored as the + * map value + */ + /* Any per-map-type extra fields + * + * BPF_MAP_TYPE_BLOOM_FILTER - the lowest 4 bits indicate the + * number of hash functions (if 0, the bloom filter will default + * to using 5 hash functions). + */ + __u64 map_extra; + }; + + struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ + __u32 map_fd; + __aligned_u64 key; + union { + __aligned_u64 value; + __aligned_u64 next_key; + }; + __u64 flags; + }; + + struct { /* struct used by BPF_MAP_*_BATCH commands */ + __aligned_u64 in_batch; /* start batch, + * NULL to start from beginning + */ + __aligned_u64 out_batch; /* output: next start batch */ + __aligned_u64 keys; + __aligned_u64 values; + __u32 count; /* input/output: + * input: # of key/value + * elements + * output: # of filled elements + */ + __u32 map_fd; + __u64 elem_flags; + __u64 flags; + } batch; + + struct { /* anonymous struct used by BPF_PROG_LOAD command */ + __u32 prog_type; /* one of enum bpf_prog_type */ + __u32 insn_cnt; + __aligned_u64 insns; + __aligned_u64 license; + __u32 log_level; /* verbosity level of verifier */ + __u32 log_size; /* size of user buffer */ + __aligned_u64 log_buf; /* user supplied buffer */ + __u32 kern_version; /* not used */ + __u32 prog_flags; + char prog_name[BPF_OBJ_NAME_LEN]; + __u32 prog_ifindex; /* ifindex of netdev to prep for */ + /* For some prog types expected attach type must be known at + * load time to verify attach type specific parts of prog + * (context accesses, allowed helpers, etc). + */ + __u32 expected_attach_type; + __u32 prog_btf_fd; /* fd pointing to BTF type data */ + __u32 func_info_rec_size; /* userspace bpf_func_info size */ + __aligned_u64 func_info; /* func info */ + __u32 func_info_cnt; /* number of bpf_func_info records */ + __u32 line_info_rec_size; /* userspace bpf_line_info size */ + __aligned_u64 line_info; /* line info */ + __u32 line_info_cnt; /* number of bpf_line_info records */ + __u32 attach_btf_id; /* in-kernel BTF type id to attach to */ + union { + /* valid prog_fd to attach to bpf prog */ + __u32 attach_prog_fd; + /* or valid module BTF object fd or 0 to attach to vmlinux */ + __u32 attach_btf_obj_fd; + }; + __u32 core_relo_cnt; /* number of bpf_core_relo */ + __aligned_u64 fd_array; /* array of FDs */ + __aligned_u64 core_relos; + __u32 core_relo_rec_size; /* sizeof(struct bpf_core_relo) */ + }; + + struct { /* anonymous struct used by BPF_OBJ_* commands */ + __aligned_u64 pathname; + __u32 bpf_fd; + __u32 file_flags; + }; + + struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ + __u32 target_fd; /* container object to attach to */ + __u32 attach_bpf_fd; /* eBPF program to attach */ + __u32 attach_type; + __u32 attach_flags; + __u32 replace_bpf_fd; /* previously attached eBPF + * program to replace if + * BPF_F_REPLACE is used + */ + }; + + struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */ + __u32 prog_fd; + __u32 retval; + __u32 data_size_in; /* input: len of data_in */ + __u32 data_size_out; /* input/output: len of data_out + * returns ENOSPC if data_out + * is too small. + */ + __aligned_u64 data_in; + __aligned_u64 data_out; + __u32 repeat; + __u32 duration; + __u32 ctx_size_in; /* input: len of ctx_in */ + __u32 ctx_size_out; /* input/output: len of ctx_out + * returns ENOSPC if ctx_out + * is too small. + */ + __aligned_u64 ctx_in; + __aligned_u64 ctx_out; + __u32 flags; + __u32 cpu; + __u32 batch_size; + } test; + + struct { /* anonymous struct used by BPF_*_GET_*_ID */ + union { + __u32 start_id; + __u32 prog_id; + __u32 map_id; + __u32 btf_id; + __u32 link_id; + }; + __u32 next_id; + __u32 open_flags; + }; + + struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ + __u32 bpf_fd; + __u32 info_len; + __aligned_u64 info; + } info; + + struct { /* anonymous struct used by BPF_PROG_QUERY command */ + __u32 target_fd; /* container object to query */ + __u32 attach_type; + __u32 query_flags; + __u32 attach_flags; + __aligned_u64 prog_ids; + __u32 prog_cnt; + /* output: per-program attach_flags. + * not allowed to be set during effective query. + */ + __aligned_u64 prog_attach_flags; + } query; + + struct { /* anonymous struct used by BPF_RAW_TRACEPOINT_OPEN command */ + __u64 name; + __u32 prog_fd; + } raw_tracepoint; + + struct { /* anonymous struct for BPF_BTF_LOAD */ + __aligned_u64 btf; + __aligned_u64 btf_log_buf; + __u32 btf_size; + __u32 btf_log_size; + __u32 btf_log_level; + }; + + struct { + __u32 pid; /* input: pid */ + __u32 fd; /* input: fd */ + __u32 flags; /* input: flags */ + __u32 buf_len; /* input/output: buf len */ + __aligned_u64 buf; /* input/output: + * tp_name for tracepoint + * symbol for kprobe + * filename for uprobe + */ + __u32 prog_id; /* output: prod_id */ + __u32 fd_type; /* output: BPF_FD_TYPE_* */ + __u64 probe_offset; /* output: probe_offset */ + __u64 probe_addr; /* output: probe_addr */ + } task_fd_query; + + struct { /* struct used by BPF_LINK_CREATE command */ + __u32 prog_fd; /* eBPF program to attach */ + union { + __u32 target_fd; /* object to attach to */ + __u32 target_ifindex; /* target ifindex */ + }; + __u32 attach_type; /* attach type */ + __u32 flags; /* extra flags */ + union { + __u32 target_btf_id; /* btf_id of target to attach to */ + struct { + __aligned_u64 iter_info; /* extra bpf_iter_link_info */ + __u32 iter_info_len; /* iter_info length */ + }; + struct { + /* black box user-provided value passed through + * to BPF program at the execution time and + * accessible through bpf_get_attach_cookie() BPF helper + */ + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + __aligned_u64 syms; + __aligned_u64 addrs; + __aligned_u64 cookies; + } kprobe_multi; + struct { + /* this is overlaid with the target_btf_id above. */ + __u32 target_btf_id; + /* black box user-provided value passed through + * to BPF program at the execution time and + * accessible through bpf_get_attach_cookie() BPF helper + */ + __u64 cookie; + } tracing; + }; + } link_create; + + struct { /* struct used by BPF_LINK_UPDATE command */ + __u32 link_fd; /* link fd */ + /* new program fd to update link with */ + __u32 new_prog_fd; + __u32 flags; /* extra flags */ + /* expected link's program fd; is specified only if + * BPF_F_REPLACE flag is set in flags */ + __u32 old_prog_fd; + } link_update; + + struct { + __u32 link_fd; + } link_detach; + + struct { /* struct used by BPF_ENABLE_STATS command */ + __u32 type; + } enable_stats; + + struct { /* struct used by BPF_ITER_CREATE command */ + __u32 link_fd; + __u32 flags; + } iter_create; + + struct { /* struct used by BPF_PROG_BIND_MAP command */ + __u32 prog_fd; + __u32 map_fd; + __u32 flags; /* extra flags */ + } prog_bind_map; + +} __attribute__((aligned(8))); + +/* The description below is an attempt at providing documentation to eBPF + * developers about the multiple available eBPF helper functions. It can be + * parsed and used to produce a manual page. The workflow is the following, + * and requires the rst2man utility: + * + * $ ./scripts/bpf_doc.py \ + * --filename include/uapi/linux/bpf.h > /tmp/bpf-helpers.rst + * $ rst2man /tmp/bpf-helpers.rst > /tmp/bpf-helpers.7 + * $ man /tmp/bpf-helpers.7 + * + * Note that in order to produce this external documentation, some RST + * formatting is used in the descriptions to get "bold" and "italics" in + * manual pages. Also note that the few trailing white spaces are + * intentional, removing them would break paragraphs for rst2man. + * + * Start of BPF helper function descriptions: + * + * void *bpf_map_lookup_elem(struct bpf_map *map, const void *key) + * Description + * Perform a lookup in *map* for an entry associated to *key*. + * Return + * Map value associated to *key*, or **NULL** if no entry was + * found. + * + * long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags) + * Description + * Add or update the value of the entry associated to *key* in + * *map* with *value*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * Flag value **BPF_NOEXIST** cannot be used for maps of types + * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all + * elements always exist), the helper would return an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_delete_elem(struct bpf_map *map, const void *key) + * Description + * Delete entry with *key* from *map*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read(void *dst, u32 size, const void *unsafe_ptr) + * Description + * For tracing programs, safely attempt to read *size* bytes from + * kernel space address *unsafe_ptr* and store the data in *dst*. + * + * Generally, use **bpf_probe_read_user**\ () or + * **bpf_probe_read_kernel**\ () instead. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_ktime_get_ns(void) + * Description + * Return the time elapsed since system boot, in nanoseconds. + * Does not include time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_MONOTONIC**) + * Return + * Current *ktime*. + * + * long bpf_trace_printk(const char *fmt, u32 fmt_size, ...) + * Description + * This helper is a "printk()-like" facility for debugging. It + * prints a message defined by format *fmt* (of size *fmt_size*) + * to file *\/sys/kernel/debug/tracing/trace* from DebugFS, if + * available. It can take up to three additional **u64** + * arguments (as an eBPF helpers, the total number of arguments is + * limited to five). + * + * Each time the helper is called, it appends a line to the trace. + * Lines are discarded while *\/sys/kernel/debug/tracing/trace* is + * open, use *\/sys/kernel/debug/tracing/trace_pipe* to avoid this. + * The format of the trace is customizable, and the exact output + * one will get depends on the options set in + * *\/sys/kernel/debug/tracing/trace_options* (see also the + * *README* file under the same directory). However, it usually + * defaults to something like: + * + * :: + * + * telnet-470 [001] .N.. 419421.045894: 0x00000001: + * + * In the above: + * + * * ``telnet`` is the name of the current task. + * * ``470`` is the PID of the current task. + * * ``001`` is the CPU number on which the task is + * running. + * * In ``.N..``, each character refers to a set of + * options (whether irqs are enabled, scheduling + * options, whether hard/softirqs are running, level of + * preempt_disabled respectively). **N** means that + * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** + * are set. + * * ``419421.045894`` is a timestamp. + * * ``0x00000001`` is a fake value used by BPF for the + * instruction pointer register. + * * ```` is the message formatted with + * *fmt*. + * + * The conversion specifiers supported by *fmt* are similar, but + * more limited than for printk(). They are **%d**, **%i**, + * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, + * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size + * of field, padding with zeroes, etc.) is available, and the + * helper will return **-EINVAL** (but print nothing) if it + * encounters an unknown specifier. + * + * Also, note that **bpf_trace_printk**\ () is slow, and should + * only be used for debugging purposes. For this reason, a notice + * block (spanning several lines) is printed to kernel logs and + * states that the helper should not be used "for production use" + * the first time this helper is used (or more precisely, when + * **trace_printk**\ () buffers are allocated). For passing values + * to user space, perf events should be preferred. + * Return + * The number of bytes written to the buffer, or a negative error + * in case of failure. + * + * u32 bpf_get_prandom_u32(void) + * Description + * Get a pseudo-random number. + * + * From a security point of view, this helper uses its own + * pseudo-random internal state, and cannot be used to infer the + * seed of other random functions in the kernel. However, it is + * essential to note that the generator used by the helper is not + * cryptographically secure. + * Return + * A random 32-bit unsigned value. + * + * u32 bpf_get_smp_processor_id(void) + * Description + * Get the SMP (symmetric multiprocessing) processor id. Note that + * all programs run with migration disabled, which means that the + * SMP processor id is stable during all the execution of the + * program. + * Return + * The SMP id of the processor running the program. + * + * long bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags) + * Description + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. *flags* are a combination of + * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the + * checksum for the packet after storing the bytes) and + * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ + * **->swhash** and *skb*\ **->l4hash** to 0). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size) + * Description + * Recompute the layer 3 (e.g. IP) checksum for the packet + * associated to *skb*. Computation is incremental, so the helper + * must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored in *size*. + * Alternatively, it is possible to store the difference between + * the previous and the new values of the header field in *to*, by + * setting *from* and *size* to 0. For both methods, *offset* + * indicates the location of the IP checksum within the packet. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags) + * Description + * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the + * packet associated to *skb*. Computation is incremental, so the + * helper must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored on the lowest + * four bits of *flags*. Alternatively, it is possible to store + * the difference between the previous and the new values of the + * header field in *to*, by setting *from* and the four lowest + * bits of *flags* to 0. For both methods, *offset* indicates the + * location of the IP checksum within the packet. In addition to + * the size of the field, *flags* can be added (bitwise OR) actual + * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left + * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and + * for updates resulting in a null checksum the value is set to + * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates + * the checksum is to be computed against a pseudo-header. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index) + * Description + * This special helper is used to trigger a "tail call", or in + * other words, to jump into another eBPF program. The same stack + * frame is used (but values on stack and in registers for the + * caller are not accessible to the callee). This mechanism allows + * for program chaining, either for raising the maximum number of + * available eBPF instructions, or to execute given programs in + * conditional blocks. For security reasons, there is an upper + * limit to the number of successive tail calls that can be + * performed. + * + * Upon call of this helper, the program attempts to jump into a + * program referenced at index *index* in *prog_array_map*, a + * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes + * *ctx*, a pointer to the context. + * + * If the call succeeds, the kernel immediately runs the first + * instruction of the new program. This is not a function call, + * and it never returns to the previous program. If the call + * fails, then the helper has no effect, and the caller continues + * to run its subsequent instructions. A call can fail if the + * destination program for the jump does not exist (i.e. *index* + * is superior to the number of entries in *prog_array_map*), or + * if the maximum number of tail calls has been reached for this + * chain of programs. This limit is defined in the kernel by the + * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), + * which is currently set to 33. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags) + * Description + * Clone and redirect the packet associated to *skb* to another + * net device of index *ifindex*. Both ingress and egress + * interfaces can be used for redirection. The **BPF_F_INGRESS** + * value in *flags* is used to make the distinction (ingress path + * is selected if the flag is present, egress path otherwise). + * This is the only flag supported for now. + * + * In comparison with **bpf_redirect**\ () helper, + * **bpf_clone_redirect**\ () has the associated cost of + * duplicating the packet buffer, but this can be executed out of + * the eBPF program. Conversely, **bpf_redirect**\ () is more + * efficient, but it is handled through an action code where the + * redirection happens only after the eBPF program has returned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_get_current_pid_tgid(void) + * Description + * Get the current pid and tgid. + * Return + * A 64-bit integer containing the current tgid and pid, and + * created as such: + * *current_task*\ **->tgid << 32 \|** + * *current_task*\ **->pid**. + * + * u64 bpf_get_current_uid_gid(void) + * Description + * Get the current uid and gid. + * Return + * A 64-bit integer containing the current GID and UID, and + * created as such: *current_gid* **<< 32 \|** *current_uid*. + * + * long bpf_get_current_comm(void *buf, u32 size_of_buf) + * Description + * Copy the **comm** attribute of the current task into *buf* of + * *size_of_buf*. The **comm** attribute contains the name of + * the executable (excluding the path) for the current task. The + * *size_of_buf* must be strictly positive. On success, the + * helper makes sure that the *buf* is NUL-terminated. On failure, + * it is filled with zeroes. + * Return + * 0 on success, or a negative error in case of failure. + * + * u32 bpf_get_cgroup_classid(struct sk_buff *skb) + * Description + * Retrieve the classid for the current task, i.e. for the net_cls + * cgroup to which *skb* belongs. + * + * This helper can be used on TC egress path, but not on ingress. + * + * The net_cls cgroup provides an interface to tag network packets + * based on a user-provided identifier for all traffic coming from + * the tasks belonging to the related cgroup. See also the related + * kernel documentation, available from the Linux sources in file + * *Documentation/admin-guide/cgroup-v1/net_cls.rst*. + * + * The Linux kernel has two versions for cgroups: there are + * cgroups v1 and cgroups v2. Both are available to users, who can + * use a mixture of them, but note that the net_cls cgroup is for + * cgroup v1 only. This makes it incompatible with BPF programs + * run on cgroups, which is a cgroup-v2-only feature (a socket can + * only hold data for one version of cgroups at a time). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to + * "**y**" or to "**m**". + * Return + * The classid, or 0 for the default unconfigured classid. + * + * long bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci) + * Description + * Push a *vlan_tci* (VLAN tag control information) of protocol + * *vlan_proto* to the packet associated to *skb*, then update + * the checksum. Note that if *vlan_proto* is different from + * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to + * be **ETH_P_8021Q**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_vlan_pop(struct sk_buff *skb) + * Description + * Pop a VLAN header from the packet associated to *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) + * Description + * Get tunnel metadata. This helper takes a pointer *key* to an + * empty **struct bpf_tunnel_key** of **size**, that will be + * filled with tunnel metadata for the packet associated to *skb*. + * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which + * indicates that the tunnel is based on IPv6 protocol instead of + * IPv4. + * + * The **struct bpf_tunnel_key** is an object that generalizes the + * principal parameters used by various tunneling protocols into a + * single struct. This way, it can be used to easily make a + * decision based on the contents of the encapsulation header, + * "summarized" in this struct. In particular, it holds the IP + * address of the remote end (IPv4 or IPv6, depending on the case) + * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, + * this struct exposes the *key*\ **->tunnel_id**, which is + * generally mapped to a VNI (Virtual Network Identifier), making + * it programmable together with the **bpf_skb_set_tunnel_key**\ + * () helper. + * + * Let's imagine that the following code is part of a program + * attached to the TC ingress interface, on one end of a GRE + * tunnel, and is supposed to filter out all messages coming from + * remote ends with IPv4 address other than 10.0.0.1: + * + * :: + * + * int ret; + * struct bpf_tunnel_key key = {}; + * + * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); + * if (ret < 0) + * return TC_ACT_SHOT; // drop packet + * + * if (key.remote_ipv4 != 0x0a000001) + * return TC_ACT_SHOT; // drop packet + * + * return TC_ACT_OK; // accept packet + * + * This interface can also be used with all encapsulation devices + * that can operate in "collect metadata" mode: instead of having + * one network device per specific configuration, the "collect + * metadata" mode only requires a single device where the + * configuration can be extracted from this helper. + * + * This can be used together with various tunnels such as VXLan, + * Geneve, GRE or IP in IP (IPIP). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) + * Description + * Populate tunnel metadata for packet associated to *skb.* The + * tunnel metadata is set to the contents of *key*, of *size*. The + * *flags* can be set to a combination of the following values: + * + * **BPF_F_TUNINFO_IPV6** + * Indicate that the tunnel is based on IPv6 protocol + * instead of IPv4. + * **BPF_F_ZERO_CSUM_TX** + * For IPv4 packets, add a flag to tunnel metadata + * indicating that checksum computation should be skipped + * and checksum set to zeroes. + * **BPF_F_DONT_FRAGMENT** + * Add a flag to tunnel metadata indicating that the + * packet should not be fragmented. + * **BPF_F_SEQ_NUMBER** + * Add a flag to tunnel metadata indicating that a + * sequence number should be added to tunnel header before + * sending the packet. This flag was added for GRE + * encapsulation, but might be used with other protocols + * as well in the future. + * **BPF_F_NO_TUNNEL_KEY** + * Add a flag to tunnel metadata indicating that no tunnel + * key should be set in the resulting tunnel header. + * + * Here is a typical usage on the transmit path: + * + * :: + * + * struct bpf_tunnel_key key; + * populate key ... + * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); + * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); + * + * See also the description of the **bpf_skb_get_tunnel_key**\ () + * helper for additional information. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_perf_event_read(struct bpf_map *map, u64 flags) + * Description + * Read the value of a perf event counter. This helper relies on a + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of + * the perf event counter is selected when *map* is updated with + * perf event file descriptors. The *map* is an array whose size + * is the number of available CPUs, and each cell contains a value + * relative to one CPU. The value to retrieve is indicated by + * *flags*, that contains the index of the CPU to look up, masked + * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * Note that before Linux 4.13, only hardware perf event can be + * retrieved. + * + * Also, be aware that the newer helper + * **bpf_perf_event_read_value**\ () is recommended over + * **bpf_perf_event_read**\ () in general. The latter has some ABI + * quirks where error and counter value are used as a return code + * (which is wrong to do since ranges may overlap). This issue is + * fixed with **bpf_perf_event_read_value**\ (), which at the same + * time provides more features over the **bpf_perf_event_read**\ + * () interface. Please refer to the description of + * **bpf_perf_event_read_value**\ () for details. + * Return + * The value of the perf event counter read from the map, or a + * negative error code in case of failure. + * + * long bpf_redirect(u32 ifindex, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_clone_redirect**\ + * (), except that the packet is not cloned, which provides + * increased performance. + * + * Except for XDP, both ingress and egress interfaces can be used + * for redirection. The **BPF_F_INGRESS** value in *flags* is used + * to make the distinction (ingress path is selected if the flag + * is present, egress path otherwise). Currently, XDP only + * supports redirection to the egress interface, and accepts no + * flag at all. + * + * The same effect can also be attained with the more generic + * **bpf_redirect_map**\ (), which uses a BPF map to store the + * redirect target instead of providing it directly to the helper. + * Return + * For XDP, the helper returns **XDP_REDIRECT** on success or + * **XDP_ABORTED** on error. For other program types, the values + * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on + * error. + * + * u32 bpf_get_route_realm(struct sk_buff *skb) + * Description + * Retrieve the realm or the route, that is to say the + * **tclassid** field of the destination for the *skb*. The + * identifier retrieved is a user-provided tag, similar to the + * one used with the net_cls cgroup (see description for + * **bpf_get_cgroup_classid**\ () helper), but here this tag is + * held by a route (a destination entry), not by a task. + * + * Retrieving this identifier works with the clsact TC egress hook + * (see also **tc-bpf(8)**), or alternatively on conventional + * classful egress qdiscs, but not on TC ingress path. In case of + * clsact TC egress hook, this has the advantage that, internally, + * the destination entry has not been dropped yet in the transmit + * path. Therefore, the destination entry does not need to be + * artificially held via **netif_keep_dst**\ () for a classful + * qdisc until the *skb* is freed. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_IP_ROUTE_CLASSID** configuration option. + * Return + * The realm of the route for the packet associated to *skb*, or 0 + * if none was found. + * + * long bpf_perf_event_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * The context of the program *ctx* needs also be passed to the + * helper. + * + * On user space, a program willing to read the values needs to + * call **perf_event_open**\ () on the perf event (either for + * one or for all CPUs) and to store the file descriptor into the + * *map*. This must be done before the eBPF program can send data + * into it. An example is available in file + * *samples/bpf/trace_output_user.c* in the Linux kernel source + * tree (the eBPF program counterpart is in + * *samples/bpf/trace_output_kern.c*). + * + * **bpf_perf_event_output**\ () achieves better performance + * than **bpf_trace_printk**\ () for sharing data with user + * space, and is much better suitable for streaming data from eBPF + * programs. + * + * Note that this helper is not restricted to tracing use cases + * and can be used with programs attached to TC or XDP as well, + * where it allows for passing data to user space listeners. Data + * can be: + * + * * Only custom structs, + * * Only the packet payload, or + * * A combination of both. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_load_bytes(const void *skb, u32 offset, void *to, u32 len) + * Description + * This helper was provided as an easy way to load data from a + * packet. It can be used to load *len* bytes from *offset* from + * the packet associated to *skb*, into the buffer pointed by + * *to*. + * + * Since Linux 4.7, usage of this helper has mostly been replaced + * by "direct packet access", enabling packet data to be + * manipulated with *skb*\ **->data** and *skb*\ **->data_end** + * pointing respectively to the first byte of packet data and to + * the byte after the last byte of packet data. However, it + * remains useful if one wishes to read large quantities of data + * at once from a packet into the eBPF stack. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_get_stackid(void *ctx, struct bpf_map *map, u64 flags) + * Description + * Walk a user or a kernel stack and return its id. To achieve + * this, the helper needs *ctx*, which is a pointer to the context + * on which the tracing program is executed, and a pointer to a + * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * a combination of the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_FAST_STACK_CMP** + * Compare stacks by hash only. + * **BPF_F_REUSE_STACKID** + * If two different stacks hash into the same *stackid*, + * discard the old one. + * + * The stack id retrieved is a 32 bit long integer handle which + * can be further combined with other data (including other stack + * ids) and used as a key into maps. This can be useful for + * generating a variety of graphs (such as flame graphs or off-cpu + * graphs). + * + * For walking a stack, this helper is an improvement over + * **bpf_probe_read**\ (), which can be used with unrolled loops + * but is not efficient and consumes a lot of eBPF instructions. + * Instead, **bpf_get_stackid**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * Return + * The positive or null stack id on success, or a negative error + * in case of failure. + * + * s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed) + * Description + * Compute a checksum difference, from the raw buffer pointed by + * *from*, of length *from_size* (that must be a multiple of 4), + * towards the raw buffer pointed by *to*, of size *to_size* + * (same remark). An optional *seed* can be added to the value + * (this can be cascaded, the seed may come from a previous call + * to the helper). + * + * This is flexible enough to be used in several ways: + * + * * With *from_size* == 0, *to_size* > 0 and *seed* set to + * checksum, it can be used when pushing new data. + * * With *from_size* > 0, *to_size* == 0 and *seed* set to + * checksum, it can be used when removing data from a packet. + * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it + * can be used to compute a diff. Note that *from_size* and + * *to_size* do not need to be equal. + * + * This helper can be used in combination with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to + * which one can feed in the difference computed with + * **bpf_csum_diff**\ (). + * Return + * The checksum result, or a negative error code in case of + * failure. + * + * long bpf_skb_get_tunnel_opt(struct sk_buff *skb, void *opt, u32 size) + * Description + * Retrieve tunnel options metadata for the packet associated to + * *skb*, and store the raw tunnel option data to the buffer *opt* + * of *size*. + * + * This helper can be used with encapsulation devices that can + * operate in "collect metadata" mode (please refer to the related + * note in the description of **bpf_skb_get_tunnel_key**\ () for + * more details). A particular example where this can be used is + * in combination with the Geneve encapsulation protocol, where it + * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) + * and retrieving arbitrary TLVs (Type-Length-Value headers) from + * the eBPF program. This allows for full customization of these + * headers. + * Return + * The size of the option data retrieved. + * + * long bpf_skb_set_tunnel_opt(struct sk_buff *skb, void *opt, u32 size) + * Description + * Set tunnel options metadata for the packet associated to *skb* + * to the option data contained in the raw buffer *opt* of *size*. + * + * See also the description of the **bpf_skb_get_tunnel_opt**\ () + * helper for additional information. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_change_proto(struct sk_buff *skb, __be16 proto, u64 flags) + * Description + * Change the protocol of the *skb* to *proto*. Currently + * supported are transition from IPv4 to IPv6, and from IPv6 to + * IPv4. The helper takes care of the groundwork for the + * transition, including resizing the socket buffer. The eBPF + * program is expected to fill the new headers, if any, via + * **skb_store_bytes**\ () and to recompute the checksums with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ + * (). The main case for this helper is to perform NAT64 + * operations out of an eBPF program. + * + * Internally, the GSO type is marked as dodgy so that headers are + * checked and segments are recalculated by the GSO/GRO engine. + * The size for GSO target is adapted as well. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_change_type(struct sk_buff *skb, u32 type) + * Description + * Change the packet type for the packet associated to *skb*. This + * comes down to setting *skb*\ **->pkt_type** to *type*, except + * the eBPF program does not have a write access to *skb*\ + * **->pkt_type** beside this helper. Using a helper here allows + * for graceful handling of errors. + * + * The major use case is to change incoming *skb*s to + * **PACKET_HOST** in a programmatic way instead of having to + * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for + * example. + * + * Note that *type* only allows certain values. At this time, they + * are: + * + * **PACKET_HOST** + * Packet is for us. + * **PACKET_BROADCAST** + * Send packet to all. + * **PACKET_MULTICAST** + * Send packet to group. + * **PACKET_OTHERHOST** + * Send packet to someone else. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index) + * Description + * Check whether *skb* is a descendant of the cgroup2 held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * Return + * The return value depends on the result of the test, and can be: + * + * * 0, if the *skb* failed the cgroup2 descendant test. + * * 1, if the *skb* succeeded the cgroup2 descendant test. + * * A negative error code, if an error occurred. + * + * u32 bpf_get_hash_recalc(struct sk_buff *skb) + * Description + * Retrieve the hash of the packet, *skb*\ **->hash**. If it is + * not set, in particular if the hash was cleared due to mangling, + * recompute this hash. Later accesses to the hash can be done + * directly with *skb*\ **->hash**. + * + * Calling **bpf_set_hash_invalid**\ (), changing a packet + * prototype with **bpf_skb_change_proto**\ (), or calling + * **bpf_skb_store_bytes**\ () with the + * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear + * the hash and to trigger a new computation for the next call to + * **bpf_get_hash_recalc**\ (). + * Return + * The 32-bit hash. + * + * u64 bpf_get_current_task(void) + * Description + * Get the current task. + * Return + * A pointer to the current task struct. + * + * long bpf_probe_write_user(void *dst, const void *src, u32 len) + * Description + * Attempt in a safe way to write *len* bytes from the buffer + * *src* to *dst* in memory. It only works for threads that are in + * user context, and *dst* must be a valid user space address. + * + * This helper should not be used to implement any kind of + * security mechanism because of TOC-TOU attacks, but rather to + * debug, divert, and manipulate execution of semi-cooperative + * processes. + * + * Keep in mind that this feature is meant for experiments, and it + * has a risk of crashing the system and running programs. + * Therefore, when an eBPF program using this helper is attached, + * a warning including PID and process name is printed to kernel + * logs. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_current_task_under_cgroup(struct bpf_map *map, u32 index) + * Description + * Check whether the probe is being run is the context of a given + * subset of the cgroup2 hierarchy. The cgroup2 to test is held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * Return + * The return value depends on the result of the test, and can be: + * + * * 1, if current task belongs to the cgroup2. + * * 0, if current task does not belong to the cgroup2. + * * A negative error code, if an error occurred. + * + * long bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags) + * Description + * Resize (trim or grow) the packet associated to *skb* to the + * new *len*. The *flags* are reserved for future usage, and must + * be left at zero. + * + * The basic idea is that the helper performs the needed work to + * change the size of the packet, then the eBPF program rewrites + * the rest via helpers like **bpf_skb_store_bytes**\ (), + * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () + * and others. This helper is a slow path utility intended for + * replies with control messages. And because it is targeted for + * slow path, the helper itself can afford to be slow: it + * implicitly linearizes, unclones and drops offloads from the + * *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_pull_data(struct sk_buff *skb, u32 len) + * Description + * Pull in non-linear data in case the *skb* is non-linear and not + * all of *len* are part of the linear section. Make *len* bytes + * from *skb* readable and writable. If a zero value is passed for + * *len*, then all bytes in the linear part of *skb* will be made + * readable and writable. + * + * This helper is only needed for reading and writing with direct + * packet access. + * + * For direct packet access, testing that offsets to access + * are within packet boundaries (test on *skb*\ **->data_end**) is + * susceptible to fail if offsets are invalid, or if the requested + * data is in non-linear parts of the *skb*. On failure the + * program can just bail out, or in the case of a non-linear + * buffer, use a helper to make the data available. The + * **bpf_skb_load_bytes**\ () helper is a first solution to access + * the data. Another one consists in using **bpf_skb_pull_data** + * to pull in once the non-linear parts, then retesting and + * eventually access the data. + * + * At the same time, this also makes sure the *skb* is uncloned, + * which is a necessary condition for direct write. As this needs + * to be an invariant for the write part only, the verifier + * detects writes and adds a prologue that is calling + * **bpf_skb_pull_data()** to effectively unclone the *skb* from + * the very beginning in case it is indeed cloned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * s64 bpf_csum_update(struct sk_buff *skb, __wsum csum) + * Description + * Add the checksum *csum* into *skb*\ **->csum** in case the + * driver has supplied a checksum for the entire packet into that + * field. Return an error otherwise. This helper is intended to be + * used in combination with **bpf_csum_diff**\ (), in particular + * when the checksum needs to be updated after data has been + * written into the packet through direct packet access. + * Return + * The checksum on success, or a negative error code in case of + * failure. + * + * void bpf_set_hash_invalid(struct sk_buff *skb) + * Description + * Invalidate the current *skb*\ **->hash**. It can be used after + * mangling on headers through direct packet access, in order to + * indicate that the hash is outdated and to trigger a + * recalculation the next time the kernel tries to access this + * hash or when the **bpf_get_hash_recalc**\ () helper is called. + * Return + * void. + * + * long bpf_get_numa_node_id(void) + * Description + * Return the id of the current NUMA node. The primary use case + * for this helper is the selection of sockets for the local NUMA + * node, when the program is attached to sockets using the + * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), + * but the helper is also available to other eBPF program types, + * similarly to **bpf_get_smp_processor_id**\ (). + * Return + * The id of current NUMA node. + * + * long bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags) + * Description + * Grows headroom of packet associated to *skb* and adjusts the + * offset of the MAC header accordingly, adding *len* bytes of + * space. It automatically extends and reallocates memory as + * required. + * + * This helper can be used on a layer 3 *skb* to push a MAC header + * for redirection into a layer 2 device. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that + * it is possible to use a negative value for *delta*. This helper + * can be used to prepare the packet for pushing or popping + * headers. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_str(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Copy a NUL terminated string from an unsafe kernel address + * *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for + * more details. + * + * Generally, use **bpf_probe_read_user_str**\ () or + * **bpf_probe_read_kernel_str**\ () instead. + * Return + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + * + * u64 bpf_get_socket_cookie(struct sk_buff *skb) + * Description + * If the **struct sk_buff** pointed by *skb* has a known socket, + * retrieve the cookie (generated by the kernel) of this socket. + * If no cookie has been set yet, generate a new cookie. Once + * generated, the socket cookie remains stable for the life of the + * socket. This helper can be useful for monitoring per socket + * networking traffic statistics as it provides a global socket + * identifier that can be assumed unique. + * Return + * A 8-byte long unique number on success, or 0 if the socket + * field is missing inside *skb*. + * + * u64 bpf_get_socket_cookie(struct bpf_sock_addr *ctx) + * Description + * Equivalent to bpf_get_socket_cookie() helper that accepts + * *skb*, but gets socket from **struct bpf_sock_addr** context. + * Return + * A 8-byte long unique number. + * + * u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx) + * Description + * Equivalent to **bpf_get_socket_cookie**\ () helper that accepts + * *skb*, but gets socket from **struct bpf_sock_ops** context. + * Return + * A 8-byte long unique number. + * + * u64 bpf_get_socket_cookie(struct sock *sk) + * Description + * Equivalent to **bpf_get_socket_cookie**\ () helper that accepts + * *sk*, but gets socket from a BTF **struct sock**. This helper + * also works for sleepable programs. + * Return + * A 8-byte long unique number or 0 if *sk* is NULL. + * + * u32 bpf_get_socket_uid(struct sk_buff *skb) + * Description + * Get the owner UID of the socked associated to *skb*. + * Return + * The owner UID of the socket associated to *skb*. If the socket + * is **NULL**, or if it is not a full socket (i.e. if it is a + * time-wait or a request socket instead), **overflowuid** value + * is returned (note that **overflowuid** might also be the actual + * UID value for the socket). + * + * long bpf_set_hash(struct sk_buff *skb, u32 hash) + * Description + * Set the full hash for *skb* (set the field *skb*\ **->hash**) + * to value *hash*. + * Return + * 0 + * + * long bpf_setsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen) + * Description + * Emulate a call to **setsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **setsockopt(2)** for more information. + * The option value of length *optlen* is pointed by *optval*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **setsockopt()**. + * It supports the following *level*\ s: + * + * * **SOL_SOCKET**, which supports the following *optname*\ s: + * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, + * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**, + * **SO_BINDTODEVICE**, **SO_KEEPALIVE**, **SO_REUSEADDR**, + * **SO_REUSEPORT**, **SO_BINDTOIFINDEX**, **SO_TXREHASH**. + * * **IPPROTO_TCP**, which supports the following *optname*\ s: + * **TCP_CONGESTION**, **TCP_BPF_IW**, + * **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, + * **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, + * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**, + * **TCP_NODELAY**, **TCP_MAXSEG**, **TCP_WINDOW_CLAMP**, + * **TCP_THIN_LINEAR_TIMEOUTS**, **TCP_BPF_DELACK_MAX**, + * **TCP_BPF_RTO_MIN**. + * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. + * * **IPPROTO_IPV6**, which supports the following *optname*\ s: + * **IPV6_TCLASS**, **IPV6_AUTOFLOWLABEL**. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_adjust_room(struct sk_buff *skb, s32 len_diff, u32 mode, u64 flags) + * Description + * Grow or shrink the room for data in the packet associated to + * *skb* by *len_diff*, and according to the selected *mode*. + * + * By default, the helper will reset any offloaded checksum + * indicator of the skb to CHECKSUM_NONE. This can be avoided + * by the following flag: + * + * * **BPF_F_ADJ_ROOM_NO_CSUM_RESET**: Do not reset offloaded + * checksum data of the skb to CHECKSUM_NONE. + * + * There are two supported modes at this time: + * + * * **BPF_ADJ_ROOM_MAC**: Adjust room at the mac layer + * (room space is added or removed between the layer 2 and + * layer 3 headers). + * + * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer + * (room space is added or removed between the layer 3 and + * layer 4 headers). + * + * The following flags are supported at this time: + * + * * **BPF_F_ADJ_ROOM_FIXED_GSO**: Do not adjust gso_size. + * Adjusting mss in this way is not allowed for datagrams. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV6**: + * Any new space is reserved to hold a tunnel header. + * Configure skb offsets and other fields accordingly. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L4_GRE**, + * **BPF_F_ADJ_ROOM_ENCAP_L4_UDP**: + * Use with ENCAP_L3 flags to further specify the tunnel type. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2**\ (*len*): + * Use with ENCAP_L3/L4 flags to further specify the tunnel + * type; *len* is the length of the inner MAC header. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2_ETH**: + * Use with BPF_F_ADJ_ROOM_ENCAP_L2 flag to further specify the + * L2 type as Ethernet. + * + * * **BPF_F_ADJ_ROOM_DECAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_DECAP_L3_IPV6**: + * Indicate the new IP header version after decapsulating the outer + * IP header. Used when the inner and outer IP versions are different. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_redirect_map(struct bpf_map *map, u64 key, u64 flags) + * Description + * Redirect the packet to the endpoint referenced by *map* at + * index *key*. Depending on its type, this *map* can contain + * references to net devices (for forwarding packets through other + * ports), or to CPUs (for redirecting XDP frames to another CPU; + * but this is only implemented for native XDP (with driver + * support) as of this writing). + * + * The lower two bits of *flags* are used as the return code if + * the map lookup fails. This is so that the return value can be + * one of the XDP program return codes up to **XDP_TX**, as chosen + * by the caller. The higher bits of *flags* can be set to + * BPF_F_BROADCAST or BPF_F_EXCLUDE_INGRESS as defined below. + * + * With BPF_F_BROADCAST the packet will be broadcasted to all the + * interfaces in the map, with BPF_F_EXCLUDE_INGRESS the ingress + * interface will be excluded when do broadcasting. + * + * See also **bpf_redirect**\ (), which only supports redirecting + * to an ifindex, but doesn't require a map to do so. + * Return + * **XDP_REDIRECT** on success, or the value of the two lower bits + * of the *flags* argument on error. + * + * long bpf_sk_redirect_map(struct sk_buff *skb, struct bpf_map *map, u32 key, u64 flags) + * Description + * Redirect the packet to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) + * Description + * Add an entry to, or update a *map* referencing sockets. The + * *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust the address pointed by *xdp_md*\ **->data_meta** by + * *delta* (which can be positive or negative). Note that this + * operation modifies the address stored in *xdp_md*\ **->data**, + * so the latter must be loaded only after the helper has been + * called. + * + * The use of *xdp_md*\ **->data_meta** is optional and programs + * are not required to use it. The rationale is that when the + * packet is processed with XDP (e.g. as DoS filter), it is + * possible to push further meta data along with it before passing + * to the stack, and to give the guarantee that an ingress eBPF + * program attached as a TC classifier on the same device can pick + * this up for further post-processing. Since TC works with socket + * buffers, it remains possible to set from XDP the **mark** or + * **priority** pointers, or other pointers for the socket buffer. + * Having this scratch space generic and programmable allows for + * more flexibility as the user is free to store whatever meta + * data they need. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size) + * Description + * Read the value of a perf event counter, and store it into *buf* + * of size *buf_size*. This helper relies on a *map* of type + * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event + * counter is selected when *map* is updated with perf event file + * descriptors. The *map* is an array whose size is the number of + * available CPUs, and each cell contains a value relative to one + * CPU. The value to retrieve is indicated by *flags*, that + * contains the index of the CPU to look up, masked with + * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * This helper behaves in a way close to + * **bpf_perf_event_read**\ () helper, save that instead of + * just returning the value observed, it fills the *buf* + * structure. This allows for additional data to be retrieved: in + * particular, the enabled and running times (in *buf*\ + * **->enabled** and *buf*\ **->running**, respectively) are + * copied. In general, **bpf_perf_event_read_value**\ () is + * recommended over **bpf_perf_event_read**\ (), which has some + * ABI issues and provides fewer functionalities. + * + * These values are interesting, because hardware PMU (Performance + * Monitoring Unit) counters are limited resources. When there are + * more PMU based perf events opened than available counters, + * kernel will multiplex these events so each event gets certain + * percentage (but not all) of the PMU time. In case that + * multiplexing happens, the number of samples or counter value + * will not reflect the case compared to when no multiplexing + * occurs. This makes comparison between different runs difficult. + * Typically, the counter value should be normalized before + * comparing to other experiments. The usual normalization is done + * as follows. + * + * :: + * + * normalized_counter = counter * t_enabled / t_running + * + * Where t_enabled is the time enabled for event and t_running is + * the time running for event since last normalization. The + * enabled and running times are accumulated since the perf event + * open. To achieve scaling factor between two invocations of an + * eBPF program, users can use CPU id as the key (which is + * typical for perf array usage model) to remember the previous + * value and do the calculation inside the eBPF program. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size) + * Description + * For an eBPF program attached to a perf event, retrieve the + * value of the event counter associated to *ctx* and store it in + * the structure pointed by *buf* and of size *buf_size*. Enabled + * and running times are also stored in the structure (see + * description of helper **bpf_perf_event_read_value**\ () for + * more details). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_getsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen) + * Description + * Emulate a call to **getsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **getsockopt(2)** for more information. + * The retrieved value is stored in the structure pointed by + * *opval* and of length *optlen*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **getsockopt()**. + * It supports the same set of *optname*\ s that is supported by + * the **bpf_setsockopt**\ () helper. The exceptions are + * **TCP_BPF_*** is **bpf_setsockopt**\ () only and + * **TCP_SAVED_SYN** is **bpf_getsockopt**\ () only. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_override_return(struct pt_regs *regs, u64 rc) + * Description + * Used for error injection, this helper uses kprobes to override + * the return value of the probed function, and to set it to *rc*. + * The first argument is the context *regs* on which the kprobe + * works. + * + * This helper works by setting the PC (program counter) + * to an override function which is run in place of the original + * probed function. This means the probed function is not run at + * all. The replacement function just returns with the required + * value. + * + * This helper has security implications, and thus is subject to + * restrictions. It is only available if the kernel was compiled + * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration + * option, and in this case it only works on functions tagged with + * **ALLOW_ERROR_INJECTION** in the kernel code. + * + * Also, the helper is only available for the architectures having + * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, + * x86 architecture is the only one to support this feature. + * Return + * 0 + * + * long bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval) + * Description + * Attempt to set the value of the **bpf_sock_ops_cb_flags** field + * for the full TCP socket associated to *bpf_sock_ops* to + * *argval*. + * + * The primary use of this field is to determine if there should + * be calls to eBPF programs of type + * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP + * code. A program of the same type can change its value, per + * connection and as necessary, when the connection is + * established. This field is directly accessible for reading, but + * this helper must be used for updates in order to return an + * error if an eBPF program tries to set a callback that is not + * supported in the current kernel. + * + * *argval* is a flag array which can combine these flags: + * + * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) + * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) + * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) + * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) + * + * Therefore, this function can be used to clear a callback flag by + * setting the appropriate bit to zero. e.g. to disable the RTO + * callback: + * + * **bpf_sock_ops_cb_flags_set(bpf_sock,** + * **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)** + * + * Here are some examples of where one could call such eBPF + * program: + * + * * When RTO fires. + * * When a packet is retransmitted. + * * When the connection terminates. + * * When a packet is sent. + * * When a packet is received. + * Return + * Code **-EINVAL** if the socket is not a full TCP socket; + * otherwise, a positive number containing the bits that could not + * be set is returned (which comes down to 0 if all bits were set + * as required). + * + * long bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes) + * Description + * For socket policies, apply the verdict of the eBPF program to + * the next *bytes* (number of bytes) of message *msg*. + * + * For example, this helper can be used in the following cases: + * + * * A single **sendmsg**\ () or **sendfile**\ () system call + * contains multiple logical messages that the eBPF program is + * supposed to read and for which it should apply a verdict. + * * An eBPF program only cares to read the first *bytes* of a + * *msg*. If the message has a large payload, then setting up + * and calling the eBPF program repeatedly for all bytes, even + * though the verdict is already known, would create unnecessary + * overhead. + * + * When called from within an eBPF program, the helper sets a + * counter internal to the BPF infrastructure, that is used to + * apply the last verdict to the next *bytes*. If *bytes* is + * smaller than the current data being processed from a + * **sendmsg**\ () or **sendfile**\ () system call, the first + * *bytes* will be sent and the eBPF program will be re-run with + * the pointer for start of data pointing to byte number *bytes* + * **+ 1**. If *bytes* is larger than the current data being + * processed, then the eBPF verdict will be applied to multiple + * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are + * consumed. + * + * Note that if a socket closes with the internal counter holding + * a non-zero value, this is not a problem because data is not + * being buffered for *bytes* and is sent as it is received. + * Return + * 0 + * + * long bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes) + * Description + * For socket policies, prevent the execution of the verdict eBPF + * program for message *msg* until *bytes* (byte number) have been + * accumulated. + * + * This can be used when one needs a specific number of bytes + * before a verdict can be assigned, even if the data spans + * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme + * case would be a user calling **sendmsg**\ () repeatedly with + * 1-byte long message segments. Obviously, this is bad for + * performance, but it is still valid. If the eBPF program needs + * *bytes* bytes to validate a header, this helper can be used to + * prevent the eBPF program to be called again until *bytes* have + * been accumulated. + * Return + * 0 + * + * long bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags) + * Description + * For socket policies, pull in non-linear data from user space + * for *msg* and set pointers *msg*\ **->data** and *msg*\ + * **->data_end** to *start* and *end* bytes offsets into *msg*, + * respectively. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it can only parse data that the (**data**, **data_end**) + * pointers have already consumed. For **sendmsg**\ () hooks this + * is likely the first scatterlist element. But for calls relying + * on the **sendpage** handler (e.g. **sendfile**\ ()) this will + * be the range (**0**, **0**) because the data is shared with + * user space and by default the objective is to avoid allowing + * user space to modify data while (or after) eBPF verdict is + * being decided. This helper can be used to pull in data and to + * set the start and end pointer to given values. Data will be + * copied if necessary (i.e. if data was not linear and if start + * and end pointers do not point to the same chunk). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) + * Description + * Bind the socket associated to *ctx* to the address pointed by + * *addr*, of length *addr_len*. This allows for making outgoing + * connection from the desired IP address, which can be useful for + * example when all processes inside a cgroup should use one + * single IP address on a host that has multiple IP configured. + * + * This helper works for IPv4 and IPv6, TCP and UDP sockets. The + * domain (*addr*\ **->sa_family**) must be **AF_INET** (or + * **AF_INET6**). It's advised to pass zero port (**sin_port** + * or **sin6_port**) which triggers IP_BIND_ADDRESS_NO_PORT-like + * behavior and lets the kernel efficiently pick up an unused + * port as long as 4-tuple is unique. Passing non-zero port might + * lead to degraded performance. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is + * possible to both shrink and grow the packet tail. + * Shrink done via *delta* being a negative integer. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags) + * Description + * Retrieve the XFRM state (IP transform framework, see also + * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. + * + * The retrieved value is stored in the **struct bpf_xfrm_state** + * pointed by *xfrm_state* and of length *size*. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_XFRM** configuration option. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_get_stack(void *ctx, void *buf, u32 size, u64 flags) + * Description + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *ctx*, which is a pointer + * to the context on which the tracing program is executed. + * To store the stacktrace, the bpf program provides *buf* with + * a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect (build_id, file_offset) instead of ips for user + * stack, only valid if **BPF_F_USER_STACK** is also + * specified. + * + * *file_offset* is an offset relative to the beginning + * of the executable or shared object file backing the vma + * which the *ip* falls in. It is *not* an offset relative + * to that object's base address. Accordingly, it must be + * adjusted by adding (sh_addr - sh_offset), where + * sh_{addr,offset} correspond to the executable section + * containing *file_offset* in the object, for comparisons + * to symbols' st_value to be valid. + * + * **bpf_get_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * Return + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + * + * long bpf_skb_load_bytes_relative(const void *skb, u32 offset, void *to, u32 len, u32 start_header) + * Description + * This helper is similar to **bpf_skb_load_bytes**\ () in that + * it provides an easy way to load *len* bytes from *offset* + * from the packet associated to *skb*, into the buffer pointed + * by *to*. The difference to **bpf_skb_load_bytes**\ () is that + * a fifth argument *start_header* exists in order to select a + * base offset to start from. *start_header* can be one of: + * + * **BPF_HDR_START_MAC** + * Base offset to load data from is *skb*'s mac header. + * **BPF_HDR_START_NET** + * Base offset to load data from is *skb*'s network header. + * + * In general, "direct packet access" is the preferred method to + * access packet data, however, this helper is in particular useful + * in socket filters where *skb*\ **->data** does not always point + * to the start of the mac header and where "direct packet access" + * is not available. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags) + * Description + * Do FIB lookup in kernel tables using parameters in *params*. + * If lookup is successful and result shows packet is to be + * forwarded, the neighbor tables are searched for the nexthop. + * If successful (ie., FIB lookup shows forwarding and nexthop + * is resolved), the nexthop address is returned in ipv4_dst + * or ipv6_dst based on family, smac is set to mac address of + * egress device, dmac is set to nexthop mac address, rt_metric + * is set to metric from route (IPv4/IPv6 only), and ifindex + * is set to the device index of the nexthop from the FIB lookup. + * + * *plen* argument is the size of the passed in struct. + * *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_FIB_LOOKUP_DIRECT** + * Do a direct table lookup vs full lookup using FIB + * rules. + * **BPF_FIB_LOOKUP_OUTPUT** + * Perform lookup from an egress perspective (default is + * ingress). + * **BPF_FIB_LOOKUP_SKIP_NEIGH** + * Skip the neighbour table lookup. *params*->dmac + * and *params*->smac will not be set as output. A common + * use case is to call **bpf_redirect_neigh**\ () after + * doing **bpf_fib_lookup**\ (). + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** tc cls_act programs. + * Return + * * < 0 if any input argument is invalid + * * 0 on success (packet is forwarded, nexthop neighbor exists) + * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the + * packet is not forwarded or needs assist from full stack + * + * If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU + * was exceeded and output params->mtu_result contains the MTU. + * + * long bpf_sock_hash_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) + * Description + * Add an entry to, or update a sockhash *map* referencing sockets. + * The *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. + * if the verdict eBPF program returns **SK_PASS**), redirect it + * to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len) + * Description + * Encapsulate the packet associated to *skb* within a Layer 3 + * protocol header. This header is provided in the buffer at + * address *hdr*, with *len* its size in bytes. *type* indicates + * the protocol of the header and can be one of: + * + * **BPF_LWT_ENCAP_SEG6** + * IPv6 encapsulation with Segment Routing Header + * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, + * the IPv6 header is computed by the kernel. + * **BPF_LWT_ENCAP_SEG6_INLINE** + * Only works if *skb* contains an IPv6 packet. Insert a + * Segment Routing Header (**struct ipv6_sr_hdr**) inside + * the IPv6 header. + * **BPF_LWT_ENCAP_IP** + * IP encapsulation (GRE/GUE/IPIP/etc). The outer header + * must be IPv4 or IPv6, followed by zero or more + * additional headers, up to **LWT_BPF_MAX_HEADROOM** + * total bytes in all prepended headers. Please note that + * if **skb_is_gso**\ (*skb*) is true, no more than two + * headers can be prepended, and the inner header, if + * present, should be either GRE or UDP/GUE. + * + * **BPF_LWT_ENCAP_SEG6**\ \* types can be called by BPF programs + * of type **BPF_PROG_TYPE_LWT_IN**; **BPF_LWT_ENCAP_IP** type can + * be called by bpf programs of types **BPF_PROG_TYPE_LWT_IN** and + * **BPF_PROG_TYPE_LWT_XMIT**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len) + * Description + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. Only the flags, tag and TLVs + * inside the outermost IPv6 Segment Routing Header can be + * modified through this helper. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta) + * Description + * Adjust the size allocated to TLVs in the outermost IPv6 + * Segment Routing Header contained in the packet associated to + * *skb*, at position *offset* by *delta* bytes. Only offsets + * after the segments are accepted. *delta* can be as well + * positive (growing) as negative (shrinking). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len) + * Description + * Apply an IPv6 Segment Routing action of type *action* to the + * packet associated to *skb*. Each action takes a parameter + * contained at address *param*, and of length *param_len* bytes. + * *action* can be one of: + * + * **SEG6_LOCAL_ACTION_END_X** + * End.X action: Endpoint with Layer-3 cross-connect. + * Type of *param*: **struct in6_addr**. + * **SEG6_LOCAL_ACTION_END_T** + * End.T action: Endpoint with specific IPv6 table lookup. + * Type of *param*: **int**. + * **SEG6_LOCAL_ACTION_END_B6** + * End.B6 action: Endpoint bound to an SRv6 policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * **SEG6_LOCAL_ACTION_END_B6_ENCAP** + * End.B6.Encap action: Endpoint bound to an SRv6 + * encapsulation policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_rc_repeat(void *ctx) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded repeat key message. This delays + * the generation of a key up event for previously generated + * key down event. + * + * Some IR protocols like NEC have a special IR message for + * repeating last button, for when a button is held down. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * long bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded key press with *scancode*, + * *toggle* value in the given *protocol*. The scancode will be + * translated to a keycode using the rc keymap, and reported as + * an input key down event. After a period a key up event is + * generated. This period can be extended by calling either + * **bpf_rc_keydown**\ () again with the same values, or calling + * **bpf_rc_repeat**\ (). + * + * Some protocols include a toggle bit, in case the button was + * released and pressed again between consecutive scancodes. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * The *protocol* is the decoded protocol number (see + * **enum rc_proto** for some predefined values). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * u64 bpf_skb_cgroup_id(struct sk_buff *skb) + * Description + * Return the cgroup v2 id of the socket associated with the *skb*. + * This is roughly similar to the **bpf_get_cgroup_classid**\ () + * helper for cgroup v1 by providing a tag resp. identifier that + * can be matched on or used for map lookups e.g. to implement + * policy. The cgroup v2 id of a given path in the hierarchy is + * exposed in user space through the f_handle API in order to get + * to the same 64-bit id. + * + * This helper can be used on TC egress path, but not on ingress, + * and is available only if the kernel was compiled with the + * **CONFIG_SOCK_CGROUP_DATA** configuration option. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * u64 bpf_get_current_cgroup_id(void) + * Description + * Get the current cgroup id based on the cgroup within which + * the current task is running. + * Return + * A 64-bit integer containing the current cgroup id based + * on the cgroup within which the current task is running. + * + * void *bpf_get_local_storage(void *map, u64 flags) + * Description + * Get the pointer to the local storage area. + * The type and the size of the local storage is defined + * by the *map* argument. + * The *flags* meaning is specific for each map type, + * and has to be 0 for cgroup local storage. + * + * Depending on the BPF program type, a local storage area + * can be shared between multiple instances of the BPF program, + * running simultaneously. + * + * A user should care about the synchronization by himself. + * For example, by using the **BPF_ATOMIC** instructions to alter + * the shared data. + * Return + * A pointer to the local storage area. + * + * long bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags) + * Description + * Select a **SO_REUSEPORT** socket from a + * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*. + * It checks the selected socket is matching the incoming + * request in the socket buffer. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *skb* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *skb*, then return value will be same as that + * of **bpf_skb_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *skb*. + * + * The format of returned id and helper limitations are same as in + * **bpf_skb_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * struct bpf_sock *bpf_sk_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + * + * struct bpf_sock *bpf_sk_lookup_udp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for UDP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + * + * long bpf_sk_release(void *sock) + * Description + * Release the reference held by *sock*. *sock* must be a + * non-**NULL** pointer that was returned from + * **bpf_sk_lookup_xxx**\ (). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags) + * Description + * Push an element *value* in *map*. *flags* is one of: + * + * **BPF_EXIST** + * If the queue/stack is full, the oldest element is + * removed to make room for this. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_pop_elem(struct bpf_map *map, void *value) + * Description + * Pop an element from *map*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_peek_elem(struct bpf_map *map, void *value) + * Description + * Get an element from *map* without removing it. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_msg_push_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags) + * Description + * For socket policies, insert *len* bytes into *msg* at offset + * *start*. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it may want to insert metadata or options into the *msg*. + * This can later be read and used by any of the lower layer BPF + * hooks. + * + * This helper may fail if under memory pressure (a malloc + * fails) in these cases BPF programs will get an appropriate + * error and BPF programs will need to handle them. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_msg_pop_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags) + * Description + * Will remove *len* bytes from a *msg* starting at byte *start*. + * This may result in **ENOMEM** errors under certain situations if + * an allocation and copy are required due to a full ring buffer. + * However, the helper will try to avoid doing the allocation + * if possible. Other errors can occur if input parameters are + * invalid either due to *start* byte not being valid part of *msg* + * payload and/or *pop* value being to large. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded pointer movement. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * long bpf_spin_lock(struct bpf_spin_lock *lock) + * Description + * Acquire a spinlock represented by the pointer *lock*, which is + * stored as part of a value of a map. Taking the lock allows to + * safely update the rest of the fields in that value. The + * spinlock can (and must) later be released with a call to + * **bpf_spin_unlock**\ (\ *lock*\ ). + * + * Spinlocks in BPF programs come with a number of restrictions + * and constraints: + * + * * **bpf_spin_lock** objects are only allowed inside maps of + * types **BPF_MAP_TYPE_HASH** and **BPF_MAP_TYPE_ARRAY** (this + * list could be extended in the future). + * * BTF description of the map is mandatory. + * * The BPF program can take ONE lock at a time, since taking two + * or more could cause dead locks. + * * Only one **struct bpf_spin_lock** is allowed per map element. + * * When the lock is taken, calls (either BPF to BPF or helpers) + * are not allowed. + * * The **BPF_LD_ABS** and **BPF_LD_IND** instructions are not + * allowed inside a spinlock-ed region. + * * The BPF program MUST call **bpf_spin_unlock**\ () to release + * the lock, on all execution paths, before it returns. + * * The BPF program can access **struct bpf_spin_lock** only via + * the **bpf_spin_lock**\ () and **bpf_spin_unlock**\ () + * helpers. Loading or storing data into the **struct + * bpf_spin_lock** *lock*\ **;** field of a map is not allowed. + * * To use the **bpf_spin_lock**\ () helper, the BTF description + * of the map value must be a struct and have **struct + * bpf_spin_lock** *anyname*\ **;** field at the top level. + * Nested lock inside another struct is not allowed. + * * The **struct bpf_spin_lock** *lock* field in a map value must + * be aligned on a multiple of 4 bytes in that value. + * * Syscall with command **BPF_MAP_LOOKUP_ELEM** does not copy + * the **bpf_spin_lock** field to user space. + * * Syscall with command **BPF_MAP_UPDATE_ELEM**, or update from + * a BPF program, do not update the **bpf_spin_lock** field. + * * **bpf_spin_lock** cannot be on the stack or inside a + * networking packet (it can only be inside of a map values). + * * **bpf_spin_lock** is available to root only. + * * Tracing programs and socket filter programs cannot use + * **bpf_spin_lock**\ () due to insufficient preemption checks + * (but this may change in the future). + * * **bpf_spin_lock** is not allowed in inner maps of map-in-map. + * Return + * 0 + * + * long bpf_spin_unlock(struct bpf_spin_lock *lock) + * Description + * Release the *lock* previously locked by a call to + * **bpf_spin_lock**\ (\ *lock*\ ). + * Return + * 0 + * + * struct bpf_sock *bpf_sk_fullsock(struct bpf_sock *sk) + * Description + * This helper gets a **struct bpf_sock** pointer such + * that all the fields in this **bpf_sock** can be accessed. + * Return + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + * + * struct bpf_tcp_sock *bpf_tcp_sock(struct bpf_sock *sk) + * Description + * This helper gets a **struct bpf_tcp_sock** pointer from a + * **struct bpf_sock** pointer. + * Return + * A **struct bpf_tcp_sock** pointer on success, or **NULL** in + * case of failure. + * + * long bpf_skb_ecn_set_ce(struct sk_buff *skb) + * Description + * Set ECN (Explicit Congestion Notification) field of IP header + * to **CE** (Congestion Encountered) if current value is **ECT** + * (ECN Capable Transport). Otherwise, do nothing. Works with IPv6 + * and IPv4. + * Return + * 1 if the **CE** flag is set (either by the current helper call + * or because it was already present), 0 if it is not set. + * + * struct bpf_sock *bpf_get_listener_sock(struct bpf_sock *sk) + * Description + * Return a **struct bpf_sock** pointer in **TCP_LISTEN** state. + * **bpf_sk_release**\ () is unnecessary and not allowed. + * Return + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + * + * struct bpf_sock *bpf_skc_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * This function is identical to **bpf_sk_lookup_tcp**\ (), except + * that it also returns timewait or request sockets. Use + * **bpf_sk_fullsock**\ () or **bpf_tcp_sock**\ () to access the + * full structure. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + * + * long bpf_tcp_check_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len) + * Description + * Check whether *iph* and *th* contain a valid SYN cookie ACK for + * the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative + * error otherwise. + * + * long bpf_sysctl_get_name(struct bpf_sysctl *ctx, char *buf, size_t buf_len, u64 flags) + * Description + * Get name of sysctl in /proc/sys/ and copy it into provided by + * program buffer *buf* of size *buf_len*. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * If *flags* is zero, full name (e.g. "net/ipv4/tcp_mem") is + * copied. Use **BPF_F_SYSCTL_BASE_NAME** flag to copy base name + * only (e.g. "tcp_mem"). + * Return + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * long bpf_sysctl_get_current_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len) + * Description + * Get current value of sysctl as it is presented in /proc/sys + * (incl. newline, etc), and copy it as a string into provided + * by program buffer *buf* of size *buf_len*. + * + * The whole value is copied, no matter what file position user + * space issued e.g. sys_read at. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * Return + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if current value was unavailable, e.g. because + * sysctl is uninitialized and read returns -EIO for it. + * + * long bpf_sysctl_get_new_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len) + * Description + * Get new value being written by user space to sysctl (before + * the actual write happens) and copy it as a string into + * provided by program buffer *buf* of size *buf_len*. + * + * User space may write new value at file position > 0. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * Return + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if sysctl is being read. + * + * long bpf_sysctl_set_new_value(struct bpf_sysctl *ctx, const char *buf, size_t buf_len) + * Description + * Override new value being written by user space to sysctl with + * value provided by program in buffer *buf* of size *buf_len*. + * + * *buf* should contain a string in same form as provided by user + * space on sysctl write. + * + * User space may write new value at file position > 0. To override + * the whole sysctl value file position should be set to zero. + * Return + * 0 on success. + * + * **-E2BIG** if the *buf_len* is too big. + * + * **-EINVAL** if sysctl is being read. + * + * long bpf_strtol(const char *buf, size_t buf_len, u64 flags, long *res) + * Description + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to a long integer according to the given base + * and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)) followed by a single + * optional '**-**' sign. + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtol**\ (3). + * Return + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + * + * long bpf_strtoul(const char *buf, size_t buf_len, u64 flags, unsigned long *res) + * Description + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to an unsigned long integer according to the + * given base and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)). + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtoul**\ (3). + * Return + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + * + * void *bpf_sk_storage_get(struct bpf_map *map, void *sk, void *value, u64 flags) + * Description + * Get a bpf-local-storage from a *sk*. + * + * Logically, it could be thought of getting the value from + * a *map* with *sk* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *sk*) except this + * helper enforces the key must be a full socket and the map must + * be a **BPF_MAP_TYPE_SK_STORAGE** also. + * + * Underneath, the value is stored locally at *sk* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf-local-storages residing at *sk*. + * + * *sk* is a kernel **struct sock** pointer for LSM program. + * *sk* is a **struct bpf_sock** pointer for other program types. + * + * An optional *flags* (**BPF_SK_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf-local-storage will be + * created if one does not exist. *value* can be used + * together with **BPF_SK_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf-local-storage. If *value* is + * **NULL**, the new bpf-local-storage will be zero initialized. + * Return + * A bpf-local-storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf-local-storage. + * + * long bpf_sk_storage_delete(struct bpf_map *map, void *sk) + * Description + * Delete a bpf-local-storage from a *sk*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf-local-storage cannot be found. + * **-EINVAL** if sk is not a fullsock (e.g. a request_sock). + * + * long bpf_send_signal(u32 sig) + * Description + * Send signal *sig* to the process of the current task. + * The signal may be delivered to any of this process's threads. + * Return + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + * + * s64 bpf_tcp_gen_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len) + * Description + * Try to issue a SYN cookie for the packet with corresponding + * IP/TCP headers, *iph* and *th*, on the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header with options (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** SYN cookie cannot be issued due to error + * + * **-ENOENT** SYN cookie should not be issued (no SYN flood) + * + * **-EOPNOTSUPP** kernel configuration does not enable SYN cookies + * + * **-EPROTONOSUPPORT** IP packet version is not 4 or 6 + * + * long bpf_skb_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct sk_buff. + * + * This helper is similar to **bpf_perf_event_output**\ () but + * restricted to raw_tracepoint bpf programs. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_user(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Safely attempt to read *size* bytes from user space address + * *unsafe_ptr* and store the data in *dst*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Safely attempt to read *size* bytes from kernel space address + * *unsafe_ptr* and store the data in *dst*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_user_str(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Copy a NUL terminated string from an unsafe user address + * *unsafe_ptr* to *dst*. The *size* should include the + * terminating NUL byte. In case the string length is smaller than + * *size*, the target is not padded with further NUL bytes. If the + * string length is larger than *size*, just *size*-1 bytes are + * copied and the last byte is set to NUL. + * + * On success, returns the number of bytes that were written, + * including the terminal NUL. This makes this helper useful in + * tracing programs for reading strings, and more importantly to + * get its length at runtime. See the following snippet: + * + * :: + * + * SEC("kprobe/sys_open") + * void bpf_sys_open(struct pt_regs *ctx) + * { + * char buf[PATHLEN]; // PATHLEN is defined to 256 + * int res = bpf_probe_read_user_str(buf, sizeof(buf), + * ctx->di); + * + * // Consume buf, for example push it to + * // userspace via bpf_perf_event_output(); we + * // can use res (the string length) as event + * // size, after checking its boundaries. + * } + * + * In comparison, using **bpf_probe_read_user**\ () helper here + * instead to read the string would require to estimate the length + * at compile time, and would often result in copying more memory + * than necessary. + * + * Another useful use case is when parsing individual process + * arguments or individual environment variables navigating + * *current*\ **->mm->arg_start** and *current*\ + * **->mm->env_start**: using this helper and the return value, + * one can quickly iterate at the right offset of the memory area. + * Return + * On success, the strictly positive length of the output string, + * including the trailing NUL character. On error, a negative + * value. + * + * long bpf_probe_read_kernel_str(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr* + * to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply. + * Return + * On success, the strictly positive length of the string, including + * the trailing NUL character. On error, a negative value. + * + * long bpf_tcp_send_ack(void *tp, u32 rcv_nxt) + * Description + * Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**. + * *rcv_nxt* is the ack_seq to be sent out. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_send_signal_thread(u32 sig) + * Description + * Send signal *sig* to the thread corresponding to the current task. + * Return + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + * + * u64 bpf_jiffies64(void) + * Description + * Obtain the 64bit jiffies + * Return + * The 64 bit jiffies + * + * long bpf_read_branch_records(struct bpf_perf_event_data *ctx, void *buf, u32 size, u64 flags) + * Description + * For an eBPF program attached to a perf event, retrieve the + * branch records (**struct perf_branch_entry**) associated to *ctx* + * and store it in the buffer pointed by *buf* up to size + * *size* bytes. + * Return + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to + * instead return the number of bytes required to store all the + * branch entries. If this flag is set, *buf* may be NULL. + * + * **-EINVAL** if arguments invalid or **size** not a multiple + * of **sizeof**\ (**struct perf_branch_entry**\ ). + * + * **-ENOENT** if architecture does not support branch records. + * + * long bpf_get_ns_current_pid_tgid(u64 dev, u64 ino, struct bpf_pidns_info *nsdata, u32 size) + * Description + * Returns 0 on success, values for *pid* and *tgid* as seen from the current + * *namespace* will be returned in *nsdata*. + * Return + * 0 on success, or one of the following in case of failure: + * + * **-EINVAL** if dev and inum supplied don't match dev_t and inode number + * with nsfs of current task, or if dev conversion to dev_t lost high bits. + * + * **-ENOENT** if pidns does not exists for the current task. + * + * long bpf_xdp_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct xdp_buff. + * + * This helper is similar to **bpf_perf_eventoutput**\ () but + * restricted to raw_tracepoint bpf programs. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_get_netns_cookie(void *ctx) + * Description + * Retrieve the cookie (generated by the kernel) of the network + * namespace the input *ctx* is associated with. The network + * namespace cookie remains stable for its lifetime and provides + * a global identifier that can be assumed unique. If *ctx* is + * NULL, then the helper returns the cookie for the initial + * network namespace. The cookie itself is very similar to that + * of **bpf_get_socket_cookie**\ () helper, but for network + * namespaces instead of sockets. + * Return + * A 8-byte long opaque number. + * + * u64 bpf_get_current_ancestor_cgroup_id(int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of the cgroup associated + * with the current task at the *ancestor_level*. The root cgroup + * is at *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with the current task, then return value will be the + * same as that of **bpf_get_current_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with the current task. + * + * The format of returned id and helper limitations are same as in + * **bpf_get_current_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * long bpf_sk_assign(struct sk_buff *skb, void *sk, u64 flags) + * Description + * Helper is overloaded depending on BPF program type. This + * description applies to **BPF_PROG_TYPE_SCHED_CLS** and + * **BPF_PROG_TYPE_SCHED_ACT** programs. + * + * Assign the *sk* to the *skb*. When combined with appropriate + * routing configuration to receive the packet towards the socket, + * will cause *skb* to be delivered to the specified socket. + * Subsequent redirection of *skb* via **bpf_redirect**\ (), + * **bpf_clone_redirect**\ () or other methods outside of BPF may + * interfere with successful delivery to the socket. + * + * This operation is only valid from TC ingress path. + * + * The *flags* argument must be zero. + * Return + * 0 on success, or a negative error in case of failure: + * + * **-EINVAL** if specified *flags* are not supported. + * + * **-ENOENT** if the socket is unavailable for assignment. + * + * **-ENETUNREACH** if the socket is unreachable (wrong netns). + * + * **-EOPNOTSUPP** if the operation is not supported, for example + * a call from outside of TC ingress. + * + * **-ESOCKTNOSUPPORT** if the socket type is not supported + * (reuseport). + * + * long bpf_sk_assign(struct bpf_sk_lookup *ctx, struct bpf_sock *sk, u64 flags) + * Description + * Helper is overloaded depending on BPF program type. This + * description applies to **BPF_PROG_TYPE_SK_LOOKUP** programs. + * + * Select the *sk* as a result of a socket lookup. + * + * For the operation to succeed passed socket must be compatible + * with the packet description provided by the *ctx* object. + * + * L4 protocol (**IPPROTO_TCP** or **IPPROTO_UDP**) must + * be an exact match. While IP family (**AF_INET** or + * **AF_INET6**) must be compatible, that is IPv6 sockets + * that are not v6-only can be selected for IPv4 packets. + * + * Only TCP listeners and UDP unconnected sockets can be + * selected. *sk* can also be NULL to reset any previous + * selection. + * + * *flags* argument can combination of following values: + * + * * **BPF_SK_LOOKUP_F_REPLACE** to override the previous + * socket selection, potentially done by a BPF program + * that ran before us. + * + * * **BPF_SK_LOOKUP_F_NO_REUSEPORT** to skip + * load-balancing within reuseport group for the socket + * being selected. + * + * On success *ctx->sk* will point to the selected socket. + * + * Return + * 0 on success, or a negative errno in case of failure. + * + * * **-EAFNOSUPPORT** if socket family (*sk->family*) is + * not compatible with packet family (*ctx->family*). + * + * * **-EEXIST** if socket has been already selected, + * potentially by another program, and + * **BPF_SK_LOOKUP_F_REPLACE** flag was not specified. + * + * * **-EINVAL** if unsupported flags were specified. + * + * * **-EPROTOTYPE** if socket L4 protocol + * (*sk->protocol*) doesn't match packet protocol + * (*ctx->protocol*). + * + * * **-ESOCKTNOSUPPORT** if socket is not in allowed + * state (TCP listening or UDP unconnected). + * + * u64 bpf_ktime_get_boot_ns(void) + * Description + * Return the time elapsed since system boot, in nanoseconds. + * Does include the time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_BOOTTIME**) + * Return + * Current *ktime*. + * + * long bpf_seq_printf(struct seq_file *m, const char *fmt, u32 fmt_size, const void *data, u32 data_len) + * Description + * **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print + * out the format string. + * The *m* represents the seq_file. The *fmt* and *fmt_size* are for + * the format string itself. The *data* and *data_len* are format string + * arguments. The *data* are a **u64** array and corresponding format string + * values are stored in the array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* array. + * The *data_len* is the size of *data* in bytes - must be a multiple of 8. + * + * Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory. + * Reading kernel memory may fail due to either invalid address or + * valid address but requiring a major memory fault. If reading kernel memory + * fails, the string for **%s** will be an empty string, and the ip + * address for **%p{i,I}{4,6}** will be 0. Not returning error to + * bpf program is consistent with what **bpf_trace_printk**\ () does for now. + * Return + * 0 on success, or a negative error in case of failure: + * + * **-EBUSY** if per-CPU memory copy buffer is busy, can try again + * by returning 1 from bpf program. + * + * **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported. + * + * **-E2BIG** if *fmt* contains too many format specifiers. + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + * + * long bpf_seq_write(struct seq_file *m, const void *data, u32 len) + * Description + * **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data. + * The *m* represents the seq_file. The *data* and *len* represent the + * data to write in bytes. + * Return + * 0 on success, or a negative error in case of failure: + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + * + * u64 bpf_sk_cgroup_id(void *sk) + * Description + * Return the cgroup v2 id of the socket *sk*. + * + * *sk* must be a non-**NULL** pointer to a socket, e.g. one + * returned from **bpf_sk_lookup_xxx**\ (), + * **bpf_sk_fullsock**\ (), etc. The format of returned id is + * same as in **bpf_skb_cgroup_id**\ (). + * + * This helper is available only if the kernel was compiled with + * the **CONFIG_SOCK_CGROUP_DATA** configuration option. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * u64 bpf_sk_ancestor_cgroup_id(void *sk, int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *sk* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *sk*, then return value will be same as that + * of **bpf_sk_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *sk*. + * + * The format of returned id and helper limitations are same as in + * **bpf_sk_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * long bpf_ringbuf_output(void *ringbuf, void *data, u64 size, u64 flags) + * Description + * Copy *size* bytes from *data* into a ring buffer *ringbuf*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * An adaptive notification is a notification sent whenever the user-space + * process has caught up and consumed all available payloads. In case the user-space + * process is still processing a previous payload, then no notification is needed + * as it will process the newly added payload automatically. + * Return + * 0 on success, or a negative error in case of failure. + * + * void *bpf_ringbuf_reserve(void *ringbuf, u64 size, u64 flags) + * Description + * Reserve *size* bytes of payload in a ring buffer *ringbuf*. + * *flags* must be 0. + * Return + * Valid pointer with *size* bytes of memory available; NULL, + * otherwise. + * + * void bpf_ringbuf_submit(void *data, u64 flags) + * Description + * Submit reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * Return + * Nothing. Always succeeds. + * + * void bpf_ringbuf_discard(void *data, u64 flags) + * Description + * Discard reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * Return + * Nothing. Always succeeds. + * + * u64 bpf_ringbuf_query(void *ringbuf, u64 flags) + * Description + * Query various characteristics of provided ring buffer. What + * exactly is queries is determined by *flags*: + * + * * **BPF_RB_AVAIL_DATA**: Amount of data not yet consumed. + * * **BPF_RB_RING_SIZE**: The size of ring buffer. + * * **BPF_RB_CONS_POS**: Consumer position (can wrap around). + * * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around). + * + * Data returned is just a momentary snapshot of actual values + * and could be inaccurate, so this facility should be used to + * power heuristics and for reporting, not to make 100% correct + * calculation. + * Return + * Requested value, or 0, if *flags* are not recognized. + * + * long bpf_csum_level(struct sk_buff *skb, u64 level) + * Description + * Change the skbs checksum level by one layer up or down, or + * reset it entirely to none in order to have the stack perform + * checksum validation. The level is applicable to the following + * protocols: TCP, UDP, GRE, SCTP, FCOE. For example, a decap of + * | ETH | IP | UDP | GUE | IP | TCP | into | ETH | IP | TCP | + * through **bpf_skb_adjust_room**\ () helper with passing in + * **BPF_F_ADJ_ROOM_NO_CSUM_RESET** flag would require one call + * to **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_DEC** since + * the UDP header is removed. Similarly, an encap of the latter + * into the former could be accompanied by a helper call to + * **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_INC** if the + * skb is still intended to be processed in higher layers of the + * stack instead of just egressing at tc. + * + * There are three supported level settings at this time: + * + * * **BPF_CSUM_LEVEL_INC**: Increases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_DEC**: Decreases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_RESET**: Resets skb->csum_level to 0 and + * sets CHECKSUM_NONE to force checksum validation by the stack. + * * **BPF_CSUM_LEVEL_QUERY**: No-op, returns the current + * skb->csum_level. + * Return + * 0 on success, or a negative error in case of failure. In the + * case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level + * is returned or the error code -EACCES in case the skb is not + * subject to CHECKSUM_UNNECESSARY. + * + * struct tcp6_sock *bpf_skc_to_tcp6_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp6_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct tcp_sock *bpf_skc_to_tcp_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct tcp_timewait_sock *bpf_skc_to_tcp_timewait_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct tcp_request_sock *bpf_skc_to_tcp_request_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct udp6_sock *bpf_skc_to_udp6_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *udp6_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_get_task_stack(struct task_struct *task, void *buf, u32 size, u64 flags) + * Description + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *task*, which is a valid + * pointer to **struct task_struct**. To store the stacktrace, the + * bpf program provides *buf* with a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect buildid+offset instead of ips for user stack, + * only valid if **BPF_F_USER_STACK** is also specified. + * + * **bpf_get_task_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * Return + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + * + * long bpf_load_hdr_opt(struct bpf_sock_ops *skops, void *searchby_res, u32 len, u64 flags) + * Description + * Load header option. Support reading a particular TCP header + * option for bpf program (**BPF_PROG_TYPE_SOCK_OPS**). + * + * If *flags* is 0, it will search the option from the + * *skops*\ **->skb_data**. The comment in **struct bpf_sock_ops** + * has details on what skb_data contains under different + * *skops*\ **->op**. + * + * The first byte of the *searchby_res* specifies the + * kind that it wants to search. + * + * If the searching kind is an experimental kind + * (i.e. 253 or 254 according to RFC6994). It also + * needs to specify the "magic" which is either + * 2 bytes or 4 bytes. It then also needs to + * specify the size of the magic by using + * the 2nd byte which is "kind-length" of a TCP + * header option and the "kind-length" also + * includes the first 2 bytes "kind" and "kind-length" + * itself as a normal TCP header option also does. + * + * For example, to search experimental kind 254 with + * 2 byte magic 0xeB9F, the searchby_res should be + * [ 254, 4, 0xeB, 0x9F, 0, 0, .... 0 ]. + * + * To search for the standard window scale option (3), + * the *searchby_res* should be [ 3, 0, 0, .... 0 ]. + * Note, kind-length must be 0 for regular option. + * + * Searching for No-Op (0) and End-of-Option-List (1) are + * not supported. + * + * *len* must be at least 2 bytes which is the minimal size + * of a header option. + * + * Supported flags: + * + * * **BPF_LOAD_HDR_OPT_TCP_SYN** to search from the + * saved_syn packet or the just-received syn packet. + * + * Return + * > 0 when found, the header option is copied to *searchby_res*. + * The return value is the total length copied. On failure, a + * negative error code is returned: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOMSG** if the option is not found. + * + * **-ENOENT** if no syn packet is available when + * **BPF_LOAD_HDR_OPT_TCP_SYN** is used. + * + * **-ENOSPC** if there is not enough space. Only *len* number of + * bytes are copied. + * + * **-EFAULT** on failure to parse the header options in the + * packet. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + * + * long bpf_store_hdr_opt(struct bpf_sock_ops *skops, const void *from, u32 len, u64 flags) + * Description + * Store header option. The data will be copied + * from buffer *from* with length *len* to the TCP header. + * + * The buffer *from* should have the whole option that + * includes the kind, kind-length, and the actual + * option data. The *len* must be at least kind-length + * long. The kind-length does not have to be 4 byte + * aligned. The kernel will take care of the padding + * and setting the 4 bytes aligned value to th->doff. + * + * This helper will check for duplicated option + * by searching the same option in the outgoing skb. + * + * This helper can only be called during + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * Return + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** If param is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * Nothing has been written + * + * **-EEXIST** if the option already exists. + * + * **-EFAULT** on failure to parse the existing header options. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + * + * long bpf_reserve_hdr_opt(struct bpf_sock_ops *skops, u32 len, u64 flags) + * Description + * Reserve *len* bytes for the bpf header option. The + * space will be used by **bpf_store_hdr_opt**\ () later in + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * If **bpf_reserve_hdr_opt**\ () is called multiple times, + * the total number of bytes will be reserved. + * + * This helper can only be called during + * **BPF_SOCK_OPS_HDR_OPT_LEN_CB**. + * + * Return + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + * + * void *bpf_inode_storage_get(struct bpf_map *map, void *inode, void *value, u64 flags) + * Description + * Get a bpf_local_storage from an *inode*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *inode* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *inode*) except this + * helper enforces the key must be an inode and the map must also + * be a **BPF_MAP_TYPE_INODE_STORAGE**. + * + * Underneath, the value is stored locally at *inode* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *inode*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * Return + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + * + * int bpf_inode_storage_delete(struct bpf_map *map, void *inode) + * Description + * Delete a bpf_local_storage from an *inode*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + * + * long bpf_d_path(struct path *path, char *buf, u32 sz) + * Description + * Return full path for given **struct path** object, which + * needs to be the kernel BTF *path* object. The path is + * returned in the provided buffer *buf* of size *sz* and + * is zero terminated. + * + * Return + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + * + * long bpf_copy_from_user(void *dst, u32 size, const void *user_ptr) + * Description + * Read *size* bytes from user space address *user_ptr* and store + * the data in *dst*. This is a wrapper of **copy_from_user**\ (). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_snprintf_btf(char *str, u32 str_size, struct btf_ptr *ptr, u32 btf_ptr_size, u64 flags) + * Description + * Use BTF to store a string representation of *ptr*->ptr in *str*, + * using *ptr*->type_id. This value should specify the type + * that *ptr*->ptr points to. LLVM __builtin_btf_type_id(type, 1) + * can be used to look up vmlinux BTF type ids. Traversing the + * data structure using BTF, the type information and values are + * stored in the first *str_size* - 1 bytes of *str*. Safe copy of + * the pointer data is carried out to avoid kernel crashes during + * operation. Smaller types can use string space on the stack; + * larger programs can use map data to store the string + * representation. + * + * The string can be subsequently shared with userspace via + * bpf_perf_event_output() or ring buffer interfaces. + * bpf_trace_printk() is to be avoided as it places too small + * a limit on string size to be useful. + * + * *flags* is a combination of + * + * **BTF_F_COMPACT** + * no formatting around type information + * **BTF_F_NONAME** + * no struct/union member names/types + * **BTF_F_PTR_RAW** + * show raw (unobfuscated) pointer values; + * equivalent to printk specifier %px. + * **BTF_F_ZERO** + * show zero-valued struct/union members; they + * are not displayed by default + * + * Return + * The number of bytes that were written (or would have been + * written if output had to be truncated due to string size), + * or a negative error in cases of failure. + * + * long bpf_seq_printf_btf(struct seq_file *m, struct btf_ptr *ptr, u32 ptr_size, u64 flags) + * Description + * Use BTF to write to seq_write a string representation of + * *ptr*->ptr, using *ptr*->type_id as per bpf_snprintf_btf(). + * *flags* are identical to those used for bpf_snprintf_btf. + * Return + * 0 on success or a negative error in case of failure. + * + * u64 bpf_skb_cgroup_classid(struct sk_buff *skb) + * Description + * See **bpf_get_cgroup_classid**\ () for the main description. + * This helper differs from **bpf_get_cgroup_classid**\ () in that + * the cgroup v1 net_cls class is retrieved only from the *skb*'s + * associated socket instead of the current process. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * long bpf_redirect_neigh(u32 ifindex, struct bpf_redir_neigh *params, int plen, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex* + * and fill in L2 addresses from neighboring subsystem. This helper + * is somewhat similar to **bpf_redirect**\ (), except that it + * populates L2 addresses as well, meaning, internally, the helper + * relies on the neighbor lookup for the L2 address of the nexthop. + * + * The helper will perform a FIB lookup based on the skb's + * networking header to get the address of the next hop, unless + * this is supplied by the caller in the *params* argument. The + * *plen* argument indicates the len of *params* and should be set + * to 0 if *params* is NULL. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types, and enabled + * for IPv4 and IPv6 protocols. + * Return + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + * + * void *bpf_per_cpu_ptr(const void *percpu_ptr, u32 cpu) + * Description + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on *cpu*. A ksym is an + * extern variable decorated with '__ksym'. For ksym, there is a + * global var (either static or global) defined of the same name + * in the kernel. The ksym is percpu if the global var is percpu. + * The returned pointer points to the global percpu var on *cpu*. + * + * bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the + * kernel, except that bpf_per_cpu_ptr() may return NULL. This + * happens if *cpu* is larger than nr_cpu_ids. The caller of + * bpf_per_cpu_ptr() must check the returned value. + * Return + * A pointer pointing to the kernel percpu variable on *cpu*, or + * NULL, if *cpu* is invalid. + * + * void *bpf_this_cpu_ptr(const void *percpu_ptr) + * Description + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on this cpu. See the + * description of 'ksym' in **bpf_per_cpu_ptr**\ (). + * + * bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in + * the kernel. Different from **bpf_per_cpu_ptr**\ (), it would + * never return NULL. + * Return + * A pointer pointing to the kernel percpu variable on this cpu. + * + * long bpf_redirect_peer(u32 ifindex, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_redirect**\ (), except + * that the redirection happens to the *ifindex*' peer device and + * the netns switch takes place from ingress to ingress without + * going through the CPU's backlog queue. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types at the ingress + * hook and for veth device types. The peer device must reside in a + * different network namespace. + * Return + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + * + * void *bpf_task_storage_get(struct bpf_map *map, struct task_struct *task, void *value, u64 flags) + * Description + * Get a bpf_local_storage from the *task*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *task* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *task*) except this + * helper enforces the key must be a task_struct and the map must also + * be a **BPF_MAP_TYPE_TASK_STORAGE**. + * + * Underneath, the value is stored locally at *task* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *task*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * Return + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + * + * long bpf_task_storage_delete(struct bpf_map *map, struct task_struct *task) + * Description + * Delete a bpf_local_storage from a *task*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + * + * struct task_struct *bpf_get_current_task_btf(void) + * Description + * Return a BTF pointer to the "current" task. + * This pointer can also be used in helpers that accept an + * *ARG_PTR_TO_BTF_ID* of type *task_struct*. + * Return + * Pointer to the current task. + * + * long bpf_bprm_opts_set(struct linux_binprm *bprm, u64 flags) + * Description + * Set or clear certain options on *bprm*: + * + * **BPF_F_BPRM_SECUREEXEC** Set the secureexec bit + * which sets the **AT_SECURE** auxv for glibc. The bit + * is cleared if the flag is not specified. + * Return + * **-EINVAL** if invalid *flags* are passed, zero otherwise. + * + * u64 bpf_ktime_get_coarse_ns(void) + * Description + * Return a coarse-grained version of the time elapsed since + * system boot, in nanoseconds. Does not include time the system + * was suspended. + * + * See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**) + * Return + * Current *ktime*. + * + * long bpf_ima_inode_hash(struct inode *inode, void *dst, u32 size) + * Description + * Returns the stored IMA hash of the *inode* (if it's available). + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * Return + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if + * invalid arguments are passed. + * + * struct socket *bpf_sock_from_file(struct file *file) + * Description + * If the given file represents a socket, returns the associated + * socket. + * Return + * A pointer to a struct socket on success or NULL if the file is + * not a socket. + * + * long bpf_check_mtu(void *ctx, u32 ifindex, u32 *mtu_len, s32 len_diff, u64 flags) + * Description + * Check packet size against exceeding MTU of net device (based + * on *ifindex*). This helper will likely be used in combination + * with helpers that adjust/change the packet size. + * + * The argument *len_diff* can be used for querying with a planned + * size change. This allows to check MTU prior to changing packet + * ctx. Providing a *len_diff* adjustment that is larger than the + * actual packet size (resulting in negative packet size) will in + * principle not exceed the MTU, which is why it is not considered + * a failure. Other BPF helpers are needed for performing the + * planned size change; therefore the responsibility for catching + * a negative packet size belongs in those helpers. + * + * Specifying *ifindex* zero means the MTU check is performed + * against the current net device. This is practical if this isn't + * used prior to redirect. + * + * On input *mtu_len* must be a valid pointer, else verifier will + * reject BPF program. If the value *mtu_len* is initialized to + * zero then the ctx packet size is use. When value *mtu_len* is + * provided as input this specify the L3 length that the MTU check + * is done against. Remember XDP and TC length operate at L2, but + * this value is L3 as this correlate to MTU and IP-header tot_len + * values which are L3 (similar behavior as bpf_fib_lookup). + * + * The Linux kernel route table can configure MTUs on a more + * specific per route level, which is not provided by this helper. + * For route level MTU checks use the **bpf_fib_lookup**\ () + * helper. + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** for tc cls_act programs. + * + * The *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_MTU_CHK_SEGS** + * This flag will only works for *ctx* **struct sk_buff**. + * If packet context contains extra packet segment buffers + * (often knows as GSO skb), then MTU check is harder to + * check at this point, because in transmit path it is + * possible for the skb packet to get re-segmented + * (depending on net device features). This could still be + * a MTU violation, so this flag enables performing MTU + * check against segments, with a different violation + * return code to tell it apart. Check cannot use len_diff. + * + * On return *mtu_len* pointer contains the MTU value of the net + * device. Remember the net device configured MTU is the L3 size, + * which is returned here and XDP and TC length operate at L2. + * Helper take this into account for you, but remember when using + * MTU value in your BPF-code. + * + * Return + * * 0 on success, and populate MTU value in *mtu_len* pointer. + * + * * < 0 if any input argument is invalid (*mtu_len* not updated) + * + * MTU violations return positive values, but also populate MTU + * value in *mtu_len* pointer, as this can be needed for + * implementing PMTU handing: + * + * * **BPF_MTU_CHK_RET_FRAG_NEEDED** + * * **BPF_MTU_CHK_RET_SEGS_TOOBIG** + * + * long bpf_for_each_map_elem(struct bpf_map *map, void *callback_fn, void *callback_ctx, u64 flags) + * Description + * For each element in **map**, call **callback_fn** function with + * **map**, **callback_ctx** and other map-specific parameters. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. + * + * The following are a list of supported map types and their + * respective expected callback signatures: + * + * BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_PERCPU_HASH, + * BPF_MAP_TYPE_LRU_HASH, BPF_MAP_TYPE_LRU_PERCPU_HASH, + * BPF_MAP_TYPE_ARRAY, BPF_MAP_TYPE_PERCPU_ARRAY + * + * long (\*callback_fn)(struct bpf_map \*map, const void \*key, void \*value, void \*ctx); + * + * For per_cpu maps, the map_value is the value on the cpu where the + * bpf_prog is running. + * + * If **callback_fn** return 0, the helper will continue to the next + * element. If return value is 1, the helper will skip the rest of + * elements and return. Other return values are not used now. + * + * Return + * The number of traversed map elements for success, **-EINVAL** for + * invalid **flags**. + * + * long bpf_snprintf(char *str, u32 str_size, const char *fmt, u64 *data, u32 data_len) + * Description + * Outputs a string into the **str** buffer of size **str_size** + * based on a format string stored in a read-only map pointed by + * **fmt**. + * + * Each format specifier in **fmt** corresponds to one u64 element + * in the **data** array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* + * array. The *data_len* is the size of *data* in bytes - must be + * a multiple of 8. + * + * Formats **%s** and **%p{i,I}{4,6}** require to read kernel + * memory. Reading kernel memory may fail due to either invalid + * address or valid address but requiring a major memory fault. If + * reading kernel memory fails, the string for **%s** will be an + * empty string, and the ip address for **%p{i,I}{4,6}** will be 0. + * Not returning error to bpf program is consistent with what + * **bpf_trace_printk**\ () does for now. + * + * Return + * The strictly positive length of the formatted string, including + * the trailing zero character. If the return value is greater than + * **str_size**, **str** contains a truncated string, guaranteed to + * be zero-terminated except when **str_size** is 0. + * + * Or **-EBUSY** if the per-CPU memory copy buffer is busy. + * + * long bpf_sys_bpf(u32 cmd, void *attr, u32 attr_size) + * Description + * Execute bpf syscall with given arguments. + * Return + * A syscall result. + * + * long bpf_btf_find_by_name_kind(char *name, int name_sz, u32 kind, int flags) + * Description + * Find BTF type with given name and kind in vmlinux BTF or in module's BTFs. + * Return + * Returns btf_id and btf_obj_fd in lower and upper 32 bits. + * + * long bpf_sys_close(u32 fd) + * Description + * Execute close syscall for given FD. + * Return + * A syscall result. + * + * long bpf_timer_init(struct bpf_timer *timer, struct bpf_map *map, u64 flags) + * Description + * Initialize the timer. + * First 4 bits of *flags* specify clockid. + * Only CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME are allowed. + * All other bits of *flags* are reserved. + * The verifier will reject the program if *timer* is not from + * the same *map*. + * Return + * 0 on success. + * **-EBUSY** if *timer* is already initialized. + * **-EINVAL** if invalid *flags* are passed. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + * + * long bpf_timer_set_callback(struct bpf_timer *timer, void *callback_fn) + * Description + * Configure the timer to call *callback_fn* static function. + * Return + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + * + * long bpf_timer_start(struct bpf_timer *timer, u64 nsecs, u64 flags) + * Description + * Set timer expiration N nanoseconds from the current time. The + * configured callback will be invoked in soft irq context on some cpu + * and will not repeat unless another bpf_timer_start() is made. + * In such case the next invocation can migrate to a different cpu. + * Since struct bpf_timer is a field inside map element the map + * owns the timer. The bpf_timer_set_callback() will increment refcnt + * of BPF program to make sure that callback_fn code stays valid. + * When user space reference to a map reaches zero all timers + * in a map are cancelled and corresponding program's refcnts are + * decremented. This is done to make sure that Ctrl-C of a user + * process doesn't leave any timers running. If map is pinned in + * bpffs the callback_fn can re-arm itself indefinitely. + * bpf_map_update/delete_elem() helpers and user space sys_bpf commands + * cancel and free the timer in the given map element. + * The map can contain timers that invoke callback_fn-s from different + * programs. The same callback_fn can serve different timers from + * different maps if key/value layout matches across maps. + * Every bpf_timer_set_callback() can have different callback_fn. + * + * Return + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier + * or invalid *flags* are passed. + * + * long bpf_timer_cancel(struct bpf_timer *timer) + * Description + * Cancel the timer and wait for callback_fn to finish if it was running. + * Return + * 0 if the timer was not active. + * 1 if the timer was active. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its + * own timer which would have led to a deadlock otherwise. + * + * u64 bpf_get_func_ip(void *ctx) + * Description + * Get address of the traced function (for tracing and kprobe programs). + * Return + * Address of the traced function. + * 0 for kprobes placed within the function (not at the entry). + * + * u64 bpf_get_attach_cookie(void *ctx) + * Description + * Get bpf_cookie value provided (optionally) during the program + * attachment. It might be different for each individual + * attachment, even if BPF program itself is the same. + * Expects BPF program context *ctx* as a first argument. + * + * Supported for the following program types: + * - kprobe/uprobe; + * - tracepoint; + * - perf_event. + * Return + * Value specified by user at BPF link creation/attachment time + * or 0, if it was not specified. + * + * long bpf_task_pt_regs(struct task_struct *task) + * Description + * Get the struct pt_regs associated with **task**. + * Return + * A pointer to struct pt_regs. + * + * long bpf_get_branch_snapshot(void *entries, u32 size, u64 flags) + * Description + * Get branch trace from hardware engines like Intel LBR. The + * hardware engine is stopped shortly after the helper is + * called. Therefore, the user need to filter branch entries + * based on the actual use case. To capture branch trace + * before the trigger point of the BPF program, the helper + * should be called at the beginning of the BPF program. + * + * The data is stored as struct perf_branch_entry into output + * buffer *entries*. *size* is the size of *entries* in bytes. + * *flags* is reserved for now and must be zero. + * + * Return + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-ENOENT** if architecture does not support branch records. + * + * long bpf_trace_vprintk(const char *fmt, u32 fmt_size, const void *data, u32 data_len) + * Description + * Behaves like **bpf_trace_printk**\ () helper, but takes an array of u64 + * to format and can handle more format args as a result. + * + * Arguments are to be used as in **bpf_seq_printf**\ () helper. + * Return + * The number of bytes written to the buffer, or a negative error + * in case of failure. + * + * struct unix_sock *bpf_skc_to_unix_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *unix_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_kallsyms_lookup_name(const char *name, int name_sz, int flags, u64 *res) + * Description + * Get the address of a kernel symbol, returned in *res*. *res* is + * set to 0 if the symbol is not found. + * Return + * On success, zero. On error, a negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-EINVAL** if string *name* is not the same size as *name_sz*. + * + * **-ENOENT** if symbol is not found. + * + * **-EPERM** if caller does not have permission to obtain kernel address. + * + * long bpf_find_vma(struct task_struct *task, u64 addr, void *callback_fn, void *callback_ctx, u64 flags) + * Description + * Find vma of *task* that contains *addr*, call *callback_fn* + * function with *task*, *vma*, and *callback_ctx*. + * The *callback_fn* should be a static function and + * the *callback_ctx* should be a pointer to the stack. + * The *flags* is used to control certain aspects of the helper. + * Currently, the *flags* must be 0. + * + * The expected callback signature is + * + * long (\*callback_fn)(struct task_struct \*task, struct vm_area_struct \*vma, void \*callback_ctx); + * + * Return + * 0 on success. + * **-ENOENT** if *task->mm* is NULL, or no vma contains *addr*. + * **-EBUSY** if failed to try lock mmap_lock. + * **-EINVAL** for invalid **flags**. + * + * long bpf_loop(u32 nr_loops, void *callback_fn, void *callback_ctx, u64 flags) + * Description + * For **nr_loops**, call **callback_fn** function + * with **callback_ctx** as the context parameter. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. Currently, nr_loops is + * limited to 1 << 23 (~8 million) loops. + * + * long (\*callback_fn)(u32 index, void \*ctx); + * + * where **index** is the current index in the loop. The index + * is zero-indexed. + * + * If **callback_fn** returns 0, the helper will continue to the next + * loop. If return value is 1, the helper will skip the rest of + * the loops and return. Other return values are not used now, + * and will be rejected by the verifier. + * + * Return + * The number of loops performed, **-EINVAL** for invalid **flags**, + * **-E2BIG** if **nr_loops** exceeds the maximum number of loops. + * + * long bpf_strncmp(const char *s1, u32 s1_sz, const char *s2) + * Description + * Do strncmp() between **s1** and **s2**. **s1** doesn't need + * to be null-terminated and **s1_sz** is the maximum storage + * size of **s1**. **s2** must be a read-only string. + * Return + * An integer less than, equal to, or greater than zero + * if the first **s1_sz** bytes of **s1** is found to be + * less than, to match, or be greater than **s2**. + * + * long bpf_get_func_arg(void *ctx, u32 n, u64 *value) + * Description + * Get **n**-th argument register (zero based) of the traced function (for tracing programs) + * returned in **value**. + * + * Return + * 0 on success. + * **-EINVAL** if n >= argument register count of traced function. + * + * long bpf_get_func_ret(void *ctx, u64 *value) + * Description + * Get return value of the traced function (for tracing programs) + * in **value**. + * + * Return + * 0 on success. + * **-EOPNOTSUPP** for tracing programs other than BPF_TRACE_FEXIT or BPF_MODIFY_RETURN. + * + * long bpf_get_func_arg_cnt(void *ctx) + * Description + * Get number of registers of the traced function (for tracing programs) where + * function arguments are stored in these registers. + * + * Return + * The number of argument registers of the traced function. + * + * int bpf_get_retval(void) + * Description + * Get the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * Return + * The BPF program's return value. + * + * int bpf_set_retval(int retval) + * Description + * Set the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * + * Note that there is the following corner case where the program exports an error + * via bpf_set_retval but signals success via 'return 1': + * + * bpf_set_retval(-EPERM); + * return 1; + * + * In this case, the BPF program's return value will use helper's -EPERM. This + * still holds true for cgroup/bind{4,6} which supports extra 'return 3' success case. + * + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_xdp_get_buff_len(struct xdp_buff *xdp_md) + * Description + * Get the total size of a given xdp buff (linear and paged area) + * Return + * The total size of a given xdp buffer. + * + * long bpf_xdp_load_bytes(struct xdp_buff *xdp_md, u32 offset, void *buf, u32 len) + * Description + * This helper is provided as an easy way to load data from a + * xdp buffer. It can be used to load *len* bytes from *offset* from + * the frame associated to *xdp_md*, into the buffer pointed by + * *buf*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_store_bytes(struct xdp_buff *xdp_md, u32 offset, void *buf, u32 len) + * Description + * Store *len* bytes from buffer *buf* into the frame + * associated to *xdp_md*, at *offset*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_copy_from_user_task(void *dst, u32 size, const void *user_ptr, struct task_struct *tsk, u64 flags) + * Description + * Read *size* bytes from user space address *user_ptr* in *tsk*'s + * address space, and stores the data in *dst*. *flags* is not + * used yet and is provided for future extensibility. This helper + * can only be used by sleepable programs. + * Return + * 0 on success, or a negative error in case of failure. On error + * *dst* buffer is zeroed out. + * + * long bpf_skb_set_tstamp(struct sk_buff *skb, u64 tstamp, u32 tstamp_type) + * Description + * Change the __sk_buff->tstamp_type to *tstamp_type* + * and set *tstamp* to the __sk_buff->tstamp together. + * + * If there is no need to change the __sk_buff->tstamp_type, + * the tstamp value can be directly written to __sk_buff->tstamp + * instead. + * + * BPF_SKB_TSTAMP_DELIVERY_MONO is the only tstamp that + * will be kept during bpf_redirect_*(). A non zero + * *tstamp* must be used with the BPF_SKB_TSTAMP_DELIVERY_MONO + * *tstamp_type*. + * + * A BPF_SKB_TSTAMP_UNSPEC *tstamp_type* can only be used + * with a zero *tstamp*. + * + * Only IPv4 and IPv6 skb->protocol are supported. + * + * This function is most useful when it needs to set a + * mono delivery time to __sk_buff->tstamp and then + * bpf_redirect_*() to the egress of an iface. For example, + * changing the (rcv) timestamp in __sk_buff->tstamp at + * ingress to a mono delivery time and then bpf_redirect_*() + * to sch_fq@phy-dev. + * Return + * 0 on success. + * **-EINVAL** for invalid input + * **-EOPNOTSUPP** for unsupported protocol + * + * long bpf_ima_file_hash(struct file *file, void *dst, u32 size) + * Description + * Returns a calculated IMA hash of the *file*. + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * Return + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if + * invalid arguments are passed. + * + * void *bpf_kptr_xchg(void *map_value, void *ptr) + * Description + * Exchange kptr at pointer *map_value* with *ptr*, and return the + * old value. *ptr* can be NULL, otherwise it must be a referenced + * pointer which will be released when this helper is called. + * Return + * The old value of kptr (which can be NULL). The returned pointer + * if not NULL, is a reference which must be released using its + * corresponding release function, or moved into a BPF map before + * program exit. + * + * void *bpf_map_lookup_percpu_elem(struct bpf_map *map, const void *key, u32 cpu) + * Description + * Perform a lookup in *percpu map* for an entry associated to + * *key* on *cpu*. + * Return + * Map value associated to *key* on *cpu*, or **NULL** if no entry + * was found or *cpu* is invalid. + * + * struct mptcp_sock *bpf_skc_to_mptcp_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_dynptr_from_mem(void *data, u32 size, u64 flags, struct bpf_dynptr *ptr) + * Description + * Get a dynptr to local memory *data*. + * + * *data* must be a ptr to a map value. + * The maximum *size* supported is DYNPTR_MAX_SIZE. + * *flags* is currently unused. + * Return + * 0 on success, -E2BIG if the size exceeds DYNPTR_MAX_SIZE, + * -EINVAL if flags is not 0. + * + * long bpf_ringbuf_reserve_dynptr(void *ringbuf, u32 size, u64 flags, struct bpf_dynptr *ptr) + * Description + * Reserve *size* bytes of payload in a ring buffer *ringbuf* + * through the dynptr interface. *flags* must be 0. + * + * Please note that a corresponding bpf_ringbuf_submit_dynptr or + * bpf_ringbuf_discard_dynptr must be called on *ptr*, even if the + * reservation fails. This is enforced by the verifier. + * Return + * 0 on success, or a negative error in case of failure. + * + * void bpf_ringbuf_submit_dynptr(struct bpf_dynptr *ptr, u64 flags) + * Description + * Submit reserved ring buffer sample, pointed to by *data*, + * through the dynptr interface. This is a no-op if the dynptr is + * invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_submit'. + * Return + * Nothing. Always succeeds. + * + * void bpf_ringbuf_discard_dynptr(struct bpf_dynptr *ptr, u64 flags) + * Description + * Discard reserved ring buffer sample through the dynptr + * interface. This is a no-op if the dynptr is invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_discard'. + * Return + * Nothing. Always succeeds. + * + * long bpf_dynptr_read(void *dst, u32 len, const struct bpf_dynptr *src, u32 offset, u64 flags) + * Description + * Read *len* bytes from *src* into *dst*, starting from *offset* + * into *src*. + * *flags* is currently unused. + * Return + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *src*'s data, -EINVAL if *src* is an invalid dynptr or if + * *flags* is not 0. + * + * long bpf_dynptr_write(const struct bpf_dynptr *dst, u32 offset, void *src, u32 len, u64 flags) + * Description + * Write *len* bytes from *src* into *dst*, starting from *offset* + * into *dst*. + * *flags* is currently unused. + * Return + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *dst*'s data, -EINVAL if *dst* is an invalid dynptr or if *dst* + * is a read-only dynptr or if *flags* is not 0. + * + * void *bpf_dynptr_data(const struct bpf_dynptr *ptr, u32 offset, u32 len) + * Description + * Get a pointer to the underlying dynptr data. + * + * *len* must be a statically known value. The returned data slice + * is invalidated whenever the dynptr is invalidated. + * Return + * Pointer to the underlying dynptr data, NULL if the dynptr is + * read-only, if the dynptr is invalid, or if the offset and length + * is out of bounds. + * + * s64 bpf_tcp_raw_gen_syncookie_ipv4(struct iphdr *iph, struct tcphdr *th, u32 th_len) + * Description + * Try to issue a SYN cookie for the packet with corresponding + * IPv4/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + * + * s64 bpf_tcp_raw_gen_syncookie_ipv6(struct ipv6hdr *iph, struct tcphdr *th, u32 th_len) + * Description + * Try to issue a SYN cookie for the packet with corresponding + * IPv6/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + * + * long bpf_tcp_raw_check_syncookie_ipv4(struct iphdr *iph, struct tcphdr *th) + * Description + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the TCP header. + * Return + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + * + * long bpf_tcp_raw_check_syncookie_ipv6(struct ipv6hdr *iph, struct tcphdr *th) + * Description + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the TCP header. + * Return + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + * + * u64 bpf_ktime_get_tai_ns(void) + * Description + * A nonsettable system-wide clock derived from wall-clock time but + * ignoring leap seconds. This clock does not experience + * discontinuities and backwards jumps caused by NTP inserting leap + * seconds as CLOCK_REALTIME does. + * + * See: **clock_gettime**\ (**CLOCK_TAI**) + * Return + * Current *ktime*. + * + * long bpf_user_ringbuf_drain(struct bpf_map *map, void *callback_fn, void *ctx, u64 flags) + * Description + * Drain samples from the specified user ring buffer, and invoke + * the provided callback for each such sample: + * + * long (\*callback_fn)(const struct bpf_dynptr \*dynptr, void \*ctx); + * + * If **callback_fn** returns 0, the helper will continue to try + * and drain the next sample, up to a maximum of + * BPF_MAX_USER_RINGBUF_SAMPLES samples. If the return value is 1, + * the helper will skip the rest of the samples and return. Other + * return values are not used now, and will be rejected by the + * verifier. + * Return + * The number of drained samples if no error was encountered while + * draining samples, or 0 if no samples were present in the ring + * buffer. If a user-space producer was epoll-waiting on this map, + * and at least one sample was drained, they will receive an event + * notification notifying them of available space in the ring + * buffer. If the BPF_RB_NO_WAKEUP flag is passed to this + * function, no wakeup notification will be sent. If the + * BPF_RB_FORCE_WAKEUP flag is passed, a wakeup notification will + * be sent even if no sample was drained. + * + * On failure, the returned value is one of the following: + * + * **-EBUSY** if the ring buffer is contended, and another calling + * context was concurrently draining the ring buffer. + * + * **-EINVAL** if user-space is not properly tracking the ring + * buffer due to the producer position not being aligned to 8 + * bytes, a sample not being aligned to 8 bytes, or the producer + * position not matching the advertised length of a sample. + * + * **-E2BIG** if user-space has tried to publish a sample which is + * larger than the size of the ring buffer, or which cannot fit + * within a struct bpf_dynptr. + * + * void *bpf_cgrp_storage_get(struct bpf_map *map, struct cgroup *cgroup, void *value, u64 flags) + * Description + * Get a bpf_local_storage from the *cgroup*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *cgroup* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *cgroup*) except this + * helper enforces the key must be a cgroup struct and the map must also + * be a **BPF_MAP_TYPE_CGRP_STORAGE**. + * + * In reality, the local-storage value is embedded directly inside of the + * *cgroup* object itself, rather than being located in the + * **BPF_MAP_TYPE_CGRP_STORAGE** map. When the local-storage value is + * queried for some *map* on a *cgroup* object, the kernel will perform an + * O(n) iteration over all of the live local-storage values for that + * *cgroup* object until the local-storage value for the *map* is found. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * Return + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + * + * long bpf_cgrp_storage_delete(struct bpf_map *map, struct cgroup *cgroup) + * Description + * Delete a bpf_local_storage from a *cgroup*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +#define ___BPF_FUNC_MAPPER(FN, ctx...) \ + FN(unspec, 0, ##ctx) \ + FN(map_lookup_elem, 1, ##ctx) \ + FN(map_update_elem, 2, ##ctx) \ + FN(map_delete_elem, 3, ##ctx) \ + FN(probe_read, 4, ##ctx) \ + FN(ktime_get_ns, 5, ##ctx) \ + FN(trace_printk, 6, ##ctx) \ + FN(get_prandom_u32, 7, ##ctx) \ + FN(get_smp_processor_id, 8, ##ctx) \ + FN(skb_store_bytes, 9, ##ctx) \ + FN(l3_csum_replace, 10, ##ctx) \ + FN(l4_csum_replace, 11, ##ctx) \ + FN(tail_call, 12, ##ctx) \ + FN(clone_redirect, 13, ##ctx) \ + FN(get_current_pid_tgid, 14, ##ctx) \ + FN(get_current_uid_gid, 15, ##ctx) \ + FN(get_current_comm, 16, ##ctx) \ + FN(get_cgroup_classid, 17, ##ctx) \ + FN(skb_vlan_push, 18, ##ctx) \ + FN(skb_vlan_pop, 19, ##ctx) \ + FN(skb_get_tunnel_key, 20, ##ctx) \ + FN(skb_set_tunnel_key, 21, ##ctx) \ + FN(perf_event_read, 22, ##ctx) \ + FN(redirect, 23, ##ctx) \ + FN(get_route_realm, 24, ##ctx) \ + FN(perf_event_output, 25, ##ctx) \ + FN(skb_load_bytes, 26, ##ctx) \ + FN(get_stackid, 27, ##ctx) \ + FN(csum_diff, 28, ##ctx) \ + FN(skb_get_tunnel_opt, 29, ##ctx) \ + FN(skb_set_tunnel_opt, 30, ##ctx) \ + FN(skb_change_proto, 31, ##ctx) \ + FN(skb_change_type, 32, ##ctx) \ + FN(skb_under_cgroup, 33, ##ctx) \ + FN(get_hash_recalc, 34, ##ctx) \ + FN(get_current_task, 35, ##ctx) \ + FN(probe_write_user, 36, ##ctx) \ + FN(current_task_under_cgroup, 37, ##ctx) \ + FN(skb_change_tail, 38, ##ctx) \ + FN(skb_pull_data, 39, ##ctx) \ + FN(csum_update, 40, ##ctx) \ + FN(set_hash_invalid, 41, ##ctx) \ + FN(get_numa_node_id, 42, ##ctx) \ + FN(skb_change_head, 43, ##ctx) \ + FN(xdp_adjust_head, 44, ##ctx) \ + FN(probe_read_str, 45, ##ctx) \ + FN(get_socket_cookie, 46, ##ctx) \ + FN(get_socket_uid, 47, ##ctx) \ + FN(set_hash, 48, ##ctx) \ + FN(setsockopt, 49, ##ctx) \ + FN(skb_adjust_room, 50, ##ctx) \ + FN(redirect_map, 51, ##ctx) \ + FN(sk_redirect_map, 52, ##ctx) \ + FN(sock_map_update, 53, ##ctx) \ + FN(xdp_adjust_meta, 54, ##ctx) \ + FN(perf_event_read_value, 55, ##ctx) \ + FN(perf_prog_read_value, 56, ##ctx) \ + FN(getsockopt, 57, ##ctx) \ + FN(override_return, 58, ##ctx) \ + FN(sock_ops_cb_flags_set, 59, ##ctx) \ + FN(msg_redirect_map, 60, ##ctx) \ + FN(msg_apply_bytes, 61, ##ctx) \ + FN(msg_cork_bytes, 62, ##ctx) \ + FN(msg_pull_data, 63, ##ctx) \ + FN(bind, 64, ##ctx) \ + FN(xdp_adjust_tail, 65, ##ctx) \ + FN(skb_get_xfrm_state, 66, ##ctx) \ + FN(get_stack, 67, ##ctx) \ + FN(skb_load_bytes_relative, 68, ##ctx) \ + FN(fib_lookup, 69, ##ctx) \ + FN(sock_hash_update, 70, ##ctx) \ + FN(msg_redirect_hash, 71, ##ctx) \ + FN(sk_redirect_hash, 72, ##ctx) \ + FN(lwt_push_encap, 73, ##ctx) \ + FN(lwt_seg6_store_bytes, 74, ##ctx) \ + FN(lwt_seg6_adjust_srh, 75, ##ctx) \ + FN(lwt_seg6_action, 76, ##ctx) \ + FN(rc_repeat, 77, ##ctx) \ + FN(rc_keydown, 78, ##ctx) \ + FN(skb_cgroup_id, 79, ##ctx) \ + FN(get_current_cgroup_id, 80, ##ctx) \ + FN(get_local_storage, 81, ##ctx) \ + FN(sk_select_reuseport, 82, ##ctx) \ + FN(skb_ancestor_cgroup_id, 83, ##ctx) \ + FN(sk_lookup_tcp, 84, ##ctx) \ + FN(sk_lookup_udp, 85, ##ctx) \ + FN(sk_release, 86, ##ctx) \ + FN(map_push_elem, 87, ##ctx) \ + FN(map_pop_elem, 88, ##ctx) \ + FN(map_peek_elem, 89, ##ctx) \ + FN(msg_push_data, 90, ##ctx) \ + FN(msg_pop_data, 91, ##ctx) \ + FN(rc_pointer_rel, 92, ##ctx) \ + FN(spin_lock, 93, ##ctx) \ + FN(spin_unlock, 94, ##ctx) \ + FN(sk_fullsock, 95, ##ctx) \ + FN(tcp_sock, 96, ##ctx) \ + FN(skb_ecn_set_ce, 97, ##ctx) \ + FN(get_listener_sock, 98, ##ctx) \ + FN(skc_lookup_tcp, 99, ##ctx) \ + FN(tcp_check_syncookie, 100, ##ctx) \ + FN(sysctl_get_name, 101, ##ctx) \ + FN(sysctl_get_current_value, 102, ##ctx) \ + FN(sysctl_get_new_value, 103, ##ctx) \ + FN(sysctl_set_new_value, 104, ##ctx) \ + FN(strtol, 105, ##ctx) \ + FN(strtoul, 106, ##ctx) \ + FN(sk_storage_get, 107, ##ctx) \ + FN(sk_storage_delete, 108, ##ctx) \ + FN(send_signal, 109, ##ctx) \ + FN(tcp_gen_syncookie, 110, ##ctx) \ + FN(skb_output, 111, ##ctx) \ + FN(probe_read_user, 112, ##ctx) \ + FN(probe_read_kernel, 113, ##ctx) \ + FN(probe_read_user_str, 114, ##ctx) \ + FN(probe_read_kernel_str, 115, ##ctx) \ + FN(tcp_send_ack, 116, ##ctx) \ + FN(send_signal_thread, 117, ##ctx) \ + FN(jiffies64, 118, ##ctx) \ + FN(read_branch_records, 119, ##ctx) \ + FN(get_ns_current_pid_tgid, 120, ##ctx) \ + FN(xdp_output, 121, ##ctx) \ + FN(get_netns_cookie, 122, ##ctx) \ + FN(get_current_ancestor_cgroup_id, 123, ##ctx) \ + FN(sk_assign, 124, ##ctx) \ + FN(ktime_get_boot_ns, 125, ##ctx) \ + FN(seq_printf, 126, ##ctx) \ + FN(seq_write, 127, ##ctx) \ + FN(sk_cgroup_id, 128, ##ctx) \ + FN(sk_ancestor_cgroup_id, 129, ##ctx) \ + FN(ringbuf_output, 130, ##ctx) \ + FN(ringbuf_reserve, 131, ##ctx) \ + FN(ringbuf_submit, 132, ##ctx) \ + FN(ringbuf_discard, 133, ##ctx) \ + FN(ringbuf_query, 134, ##ctx) \ + FN(csum_level, 135, ##ctx) \ + FN(skc_to_tcp6_sock, 136, ##ctx) \ + FN(skc_to_tcp_sock, 137, ##ctx) \ + FN(skc_to_tcp_timewait_sock, 138, ##ctx) \ + FN(skc_to_tcp_request_sock, 139, ##ctx) \ + FN(skc_to_udp6_sock, 140, ##ctx) \ + FN(get_task_stack, 141, ##ctx) \ + FN(load_hdr_opt, 142, ##ctx) \ + FN(store_hdr_opt, 143, ##ctx) \ + FN(reserve_hdr_opt, 144, ##ctx) \ + FN(inode_storage_get, 145, ##ctx) \ + FN(inode_storage_delete, 146, ##ctx) \ + FN(d_path, 147, ##ctx) \ + FN(copy_from_user, 148, ##ctx) \ + FN(snprintf_btf, 149, ##ctx) \ + FN(seq_printf_btf, 150, ##ctx) \ + FN(skb_cgroup_classid, 151, ##ctx) \ + FN(redirect_neigh, 152, ##ctx) \ + FN(per_cpu_ptr, 153, ##ctx) \ + FN(this_cpu_ptr, 154, ##ctx) \ + FN(redirect_peer, 155, ##ctx) \ + FN(task_storage_get, 156, ##ctx) \ + FN(task_storage_delete, 157, ##ctx) \ + FN(get_current_task_btf, 158, ##ctx) \ + FN(bprm_opts_set, 159, ##ctx) \ + FN(ktime_get_coarse_ns, 160, ##ctx) \ + FN(ima_inode_hash, 161, ##ctx) \ + FN(sock_from_file, 162, ##ctx) \ + FN(check_mtu, 163, ##ctx) \ + FN(for_each_map_elem, 164, ##ctx) \ + FN(snprintf, 165, ##ctx) \ + FN(sys_bpf, 166, ##ctx) \ + FN(btf_find_by_name_kind, 167, ##ctx) \ + FN(sys_close, 168, ##ctx) \ + FN(timer_init, 169, ##ctx) \ + FN(timer_set_callback, 170, ##ctx) \ + FN(timer_start, 171, ##ctx) \ + FN(timer_cancel, 172, ##ctx) \ + FN(get_func_ip, 173, ##ctx) \ + FN(get_attach_cookie, 174, ##ctx) \ + FN(task_pt_regs, 175, ##ctx) \ + FN(get_branch_snapshot, 176, ##ctx) \ + FN(trace_vprintk, 177, ##ctx) \ + FN(skc_to_unix_sock, 178, ##ctx) \ + FN(kallsyms_lookup_name, 179, ##ctx) \ + FN(find_vma, 180, ##ctx) \ + FN(loop, 181, ##ctx) \ + FN(strncmp, 182, ##ctx) \ + FN(get_func_arg, 183, ##ctx) \ + FN(get_func_ret, 184, ##ctx) \ + FN(get_func_arg_cnt, 185, ##ctx) \ + FN(get_retval, 186, ##ctx) \ + FN(set_retval, 187, ##ctx) \ + FN(xdp_get_buff_len, 188, ##ctx) \ + FN(xdp_load_bytes, 189, ##ctx) \ + FN(xdp_store_bytes, 190, ##ctx) \ + FN(copy_from_user_task, 191, ##ctx) \ + FN(skb_set_tstamp, 192, ##ctx) \ + FN(ima_file_hash, 193, ##ctx) \ + FN(kptr_xchg, 194, ##ctx) \ + FN(map_lookup_percpu_elem, 195, ##ctx) \ + FN(skc_to_mptcp_sock, 196, ##ctx) \ + FN(dynptr_from_mem, 197, ##ctx) \ + FN(ringbuf_reserve_dynptr, 198, ##ctx) \ + FN(ringbuf_submit_dynptr, 199, ##ctx) \ + FN(ringbuf_discard_dynptr, 200, ##ctx) \ + FN(dynptr_read, 201, ##ctx) \ + FN(dynptr_write, 202, ##ctx) \ + FN(dynptr_data, 203, ##ctx) \ + FN(tcp_raw_gen_syncookie_ipv4, 204, ##ctx) \ + FN(tcp_raw_gen_syncookie_ipv6, 205, ##ctx) \ + FN(tcp_raw_check_syncookie_ipv4, 206, ##ctx) \ + FN(tcp_raw_check_syncookie_ipv6, 207, ##ctx) \ + FN(ktime_get_tai_ns, 208, ##ctx) \ + FN(user_ringbuf_drain, 209, ##ctx) \ + FN(cgrp_storage_get, 210, ##ctx) \ + FN(cgrp_storage_delete, 211, ##ctx) \ + /* */ + +/* backwards-compatibility macros for users of __BPF_FUNC_MAPPER that don't + * know or care about integer value that is now passed as second argument + */ +#define __BPF_FUNC_MAPPER_APPLY(name, value, FN) FN(name), +#define __BPF_FUNC_MAPPER(FN) ___BPF_FUNC_MAPPER(__BPF_FUNC_MAPPER_APPLY, FN) + +/* integer value in 'imm' field of BPF_CALL instruction selects which helper + * function eBPF program intends to call + */ +#define __BPF_ENUM_FN(x, y) BPF_FUNC_ ## x = y, +enum bpf_func_id { + ___BPF_FUNC_MAPPER(__BPF_ENUM_FN) + __BPF_FUNC_MAX_ID, +}; +#undef __BPF_ENUM_FN + +/* All flags used by eBPF helper functions, placed here. */ + +/* BPF_FUNC_skb_store_bytes flags. */ +enum { + BPF_F_RECOMPUTE_CSUM = (1ULL << 0), + BPF_F_INVALIDATE_HASH = (1ULL << 1), +}; + +/* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags. + * First 4 bits are for passing the header field size. + */ +enum { + BPF_F_HDR_FIELD_MASK = 0xfULL, +}; + +/* BPF_FUNC_l4_csum_replace flags. */ +enum { + BPF_F_PSEUDO_HDR = (1ULL << 4), + BPF_F_MARK_MANGLED_0 = (1ULL << 5), + BPF_F_MARK_ENFORCE = (1ULL << 6), +}; + +/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ +enum { + BPF_F_INGRESS = (1ULL << 0), +}; + +/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ +enum { + BPF_F_TUNINFO_IPV6 = (1ULL << 0), +}; + +/* flags for both BPF_FUNC_get_stackid and BPF_FUNC_get_stack. */ +enum { + BPF_F_SKIP_FIELD_MASK = 0xffULL, + BPF_F_USER_STACK = (1ULL << 8), +/* flags used by BPF_FUNC_get_stackid only. */ + BPF_F_FAST_STACK_CMP = (1ULL << 9), + BPF_F_REUSE_STACKID = (1ULL << 10), +/* flags used by BPF_FUNC_get_stack only. */ + BPF_F_USER_BUILD_ID = (1ULL << 11), +}; + +/* BPF_FUNC_skb_set_tunnel_key flags. */ +enum { + BPF_F_ZERO_CSUM_TX = (1ULL << 1), + BPF_F_DONT_FRAGMENT = (1ULL << 2), + BPF_F_SEQ_NUMBER = (1ULL << 3), + BPF_F_NO_TUNNEL_KEY = (1ULL << 4), +}; + +/* BPF_FUNC_skb_get_tunnel_key flags. */ +enum { + BPF_F_TUNINFO_FLAGS = (1ULL << 4), +}; + +/* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and + * BPF_FUNC_perf_event_read_value flags. + */ +enum { + BPF_F_INDEX_MASK = 0xffffffffULL, + BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK, +/* BPF_FUNC_perf_event_output for sk_buff input context. */ + BPF_F_CTXLEN_MASK = (0xfffffULL << 32), +}; + +/* Current network namespace */ +enum { + BPF_F_CURRENT_NETNS = (-1L), +}; + +/* BPF_FUNC_csum_level level values. */ +enum { + BPF_CSUM_LEVEL_QUERY, + BPF_CSUM_LEVEL_INC, + BPF_CSUM_LEVEL_DEC, + BPF_CSUM_LEVEL_RESET, +}; + +/* BPF_FUNC_skb_adjust_room flags. */ +enum { + BPF_F_ADJ_ROOM_FIXED_GSO = (1ULL << 0), + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = (1ULL << 1), + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = (1ULL << 2), + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = (1ULL << 3), + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = (1ULL << 4), + BPF_F_ADJ_ROOM_NO_CSUM_RESET = (1ULL << 5), + BPF_F_ADJ_ROOM_ENCAP_L2_ETH = (1ULL << 6), + BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = (1ULL << 7), + BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = (1ULL << 8), +}; + +enum { + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff, + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, +}; + +#define BPF_F_ADJ_ROOM_ENCAP_L2(len) (((__u64)len & \ + BPF_ADJ_ROOM_ENCAP_L2_MASK) \ + << BPF_ADJ_ROOM_ENCAP_L2_SHIFT) + +/* BPF_FUNC_sysctl_get_name flags. */ +enum { + BPF_F_SYSCTL_BASE_NAME = (1ULL << 0), +}; + +/* BPF_FUNC__storage_get flags */ +enum { + BPF_LOCAL_STORAGE_GET_F_CREATE = (1ULL << 0), + /* BPF_SK_STORAGE_GET_F_CREATE is only kept for backward compatibility + * and BPF_LOCAL_STORAGE_GET_F_CREATE must be used instead. + */ + BPF_SK_STORAGE_GET_F_CREATE = BPF_LOCAL_STORAGE_GET_F_CREATE, +}; + +/* BPF_FUNC_read_branch_records flags. */ +enum { + BPF_F_GET_BRANCH_RECORDS_SIZE = (1ULL << 0), +}; + +/* BPF_FUNC_bpf_ringbuf_commit, BPF_FUNC_bpf_ringbuf_discard, and + * BPF_FUNC_bpf_ringbuf_output flags. + */ +enum { + BPF_RB_NO_WAKEUP = (1ULL << 0), + BPF_RB_FORCE_WAKEUP = (1ULL << 1), +}; + +/* BPF_FUNC_bpf_ringbuf_query flags */ +enum { + BPF_RB_AVAIL_DATA = 0, + BPF_RB_RING_SIZE = 1, + BPF_RB_CONS_POS = 2, + BPF_RB_PROD_POS = 3, +}; + +/* BPF ring buffer constants */ +enum { + BPF_RINGBUF_BUSY_BIT = (1U << 31), + BPF_RINGBUF_DISCARD_BIT = (1U << 30), + BPF_RINGBUF_HDR_SZ = 8, +}; + +/* BPF_FUNC_sk_assign flags in bpf_sk_lookup context. */ +enum { + BPF_SK_LOOKUP_F_REPLACE = (1ULL << 0), + BPF_SK_LOOKUP_F_NO_REUSEPORT = (1ULL << 1), +}; + +/* Mode for BPF_FUNC_skb_adjust_room helper. */ +enum bpf_adj_room_mode { + BPF_ADJ_ROOM_NET, + BPF_ADJ_ROOM_MAC, +}; + +/* Mode for BPF_FUNC_skb_load_bytes_relative helper. */ +enum bpf_hdr_start_off { + BPF_HDR_START_MAC, + BPF_HDR_START_NET, +}; + +/* Encapsulation type for BPF_FUNC_lwt_push_encap helper. */ +enum bpf_lwt_encap_mode { + BPF_LWT_ENCAP_SEG6, + BPF_LWT_ENCAP_SEG6_INLINE, + BPF_LWT_ENCAP_IP, +}; + +/* Flags for bpf_bprm_opts_set helper */ +enum { + BPF_F_BPRM_SECUREEXEC = (1ULL << 0), +}; + +/* Flags for bpf_redirect_map helper */ +enum { + BPF_F_BROADCAST = (1ULL << 3), + BPF_F_EXCLUDE_INGRESS = (1ULL << 4), +}; + +#define __bpf_md_ptr(type, name) \ +union { \ + type name; \ + __u64 :64; \ +} __attribute__((aligned(8))) + +enum { + BPF_SKB_TSTAMP_UNSPEC, + BPF_SKB_TSTAMP_DELIVERY_MONO, /* tstamp has mono delivery time */ + /* For any BPF_SKB_TSTAMP_* that the bpf prog cannot handle, + * the bpf prog should handle it like BPF_SKB_TSTAMP_UNSPEC + * and try to deduce it by ingress, egress or skb->sk->sk_clockid. + */ +}; + +/* user accessible mirror of in-kernel sk_buff. + * new fields can only be added to the end of this structure + */ +struct __sk_buff { + __u32 len; + __u32 pkt_type; + __u32 mark; + __u32 queue_mapping; + __u32 protocol; + __u32 vlan_present; + __u32 vlan_tci; + __u32 vlan_proto; + __u32 priority; + __u32 ingress_ifindex; + __u32 ifindex; + __u32 tc_index; + __u32 cb[5]; + __u32 hash; + __u32 tc_classid; + __u32 data; + __u32 data_end; + __u32 napi_id; + + /* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */ + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + /* ... here. */ + + __u32 data_meta; + __bpf_md_ptr(struct bpf_flow_keys *, flow_keys); + __u64 tstamp; + __u32 wire_len; + __u32 gso_segs; + __bpf_md_ptr(struct bpf_sock *, sk); + __u32 gso_size; + __u8 tstamp_type; + __u32 :24; /* Padding, future use. */ + __u64 hwtstamp; +}; + +struct bpf_tunnel_key { + __u32 tunnel_id; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; + union { + __u16 tunnel_ext; /* compat */ + __be16 tunnel_flags; + }; + __u32 tunnel_label; + union { + __u32 local_ipv4; + __u32 local_ipv6[4]; + }; +}; + +/* user accessible mirror of in-kernel xfrm_state. + * new fields can only be added to the end of this structure + */ +struct bpf_xfrm_state { + __u32 reqid; + __u32 spi; /* Stored in network byte order */ + __u16 family; + __u16 ext; /* Padding, future use. */ + union { + __u32 remote_ipv4; /* Stored in network byte order */ + __u32 remote_ipv6[4]; /* Stored in network byte order */ + }; +}; + +/* Generic BPF return codes which all BPF program types may support. + * The values are binary compatible with their TC_ACT_* counter-part to + * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT + * programs. + * + * XDP is handled seprately, see XDP_*. + */ +enum bpf_ret_code { + BPF_OK = 0, + /* 1 reserved */ + BPF_DROP = 2, + /* 3-6 reserved */ + BPF_REDIRECT = 7, + /* >127 are reserved for prog type specific return codes. + * + * BPF_LWT_REROUTE: used by BPF_PROG_TYPE_LWT_IN and + * BPF_PROG_TYPE_LWT_XMIT to indicate that skb had been + * changed and should be routed based on its new L3 header. + * (This is an L3 redirect, as opposed to L2 redirect + * represented by BPF_REDIRECT above). + */ + BPF_LWT_REROUTE = 128, + /* BPF_FLOW_DISSECTOR_CONTINUE: used by BPF_PROG_TYPE_FLOW_DISSECTOR + * to indicate that no custom dissection was performed, and + * fallback to standard dissector is requested. + */ + BPF_FLOW_DISSECTOR_CONTINUE = 129, +}; + +struct bpf_sock { + __u32 bound_dev_if; + __u32 family; + __u32 type; + __u32 protocol; + __u32 mark; + __u32 priority; + /* IP address also allows 1 and 2 bytes access */ + __u32 src_ip4; + __u32 src_ip6[4]; + __u32 src_port; /* host byte order */ + __be16 dst_port; /* network byte order */ + __u16 :16; /* zero padding */ + __u32 dst_ip4; + __u32 dst_ip6[4]; + __u32 state; + __s32 rx_queue_mapping; +}; + +struct bpf_tcp_sock { + __u32 snd_cwnd; /* Sending congestion window */ + __u32 srtt_us; /* smoothed round trip time << 3 in usecs */ + __u32 rtt_min; + __u32 snd_ssthresh; /* Slow start size threshold */ + __u32 rcv_nxt; /* What we want to receive next */ + __u32 snd_nxt; /* Next sequence we send */ + __u32 snd_una; /* First byte we want an ack for */ + __u32 mss_cache; /* Cached effective mss, not including SACKS */ + __u32 ecn_flags; /* ECN status bits. */ + __u32 rate_delivered; /* saved rate sample: packets delivered */ + __u32 rate_interval_us; /* saved rate sample: time elapsed */ + __u32 packets_out; /* Packets which are "in flight" */ + __u32 retrans_out; /* Retransmitted packets out */ + __u32 total_retrans; /* Total retransmits for entire connection */ + __u32 segs_in; /* RFC4898 tcpEStatsPerfSegsIn + * total number of segments in. + */ + __u32 data_segs_in; /* RFC4898 tcpEStatsPerfDataSegsIn + * total number of data segments in. + */ + __u32 segs_out; /* RFC4898 tcpEStatsPerfSegsOut + * The total number of segments sent. + */ + __u32 data_segs_out; /* RFC4898 tcpEStatsPerfDataSegsOut + * total number of data segments sent. + */ + __u32 lost_out; /* Lost packets */ + __u32 sacked_out; /* SACK'd packets */ + __u64 bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived + * sum(delta(rcv_nxt)), or how many bytes + * were acked. + */ + __u64 bytes_acked; /* RFC4898 tcpEStatsAppHCThruOctetsAcked + * sum(delta(snd_una)), or how many bytes + * were acked. + */ + __u32 dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups + * total number of DSACK blocks received + */ + __u32 delivered; /* Total data packets delivered incl. rexmits */ + __u32 delivered_ce; /* Like the above but only ECE marked packets */ + __u32 icsk_retransmits; /* Number of unrecovered [RTO] timeouts */ +}; + +struct bpf_sock_tuple { + union { + struct { + __be32 saddr; + __be32 daddr; + __be16 sport; + __be16 dport; + } ipv4; + struct { + __be32 saddr[4]; + __be32 daddr[4]; + __be16 sport; + __be16 dport; + } ipv6; + }; +}; + +struct bpf_xdp_sock { + __u32 queue_id; +}; + +#define XDP_PACKET_HEADROOM 256 + +/* User return codes for XDP prog type. + * A valid XDP program must return one of these defined values. All other + * return codes are reserved for future use. Unknown return codes will + * result in packet drops and a warning via bpf_warn_invalid_xdp_action(). + */ +enum xdp_action { + XDP_ABORTED = 0, + XDP_DROP, + XDP_PASS, + XDP_TX, + XDP_REDIRECT, +}; + +/* user accessible metadata for XDP packet hook + * new fields must be added to the end of this structure + */ +struct xdp_md { + __u32 data; + __u32 data_end; + __u32 data_meta; + /* Below access go through struct xdp_rxq_info */ + __u32 ingress_ifindex; /* rxq->dev->ifindex */ + __u32 rx_queue_index; /* rxq->queue_index */ + + __u32 egress_ifindex; /* txq->dev->ifindex */ +}; + +/* DEVMAP map-value layout + * + * The struct data-layout of map-value is a configuration interface. + * New members can only be added to the end of this structure. + */ +struct bpf_devmap_val { + __u32 ifindex; /* device index */ + union { + int fd; /* prog fd on map write */ + __u32 id; /* prog id on map read */ + } bpf_prog; +}; + +/* CPUMAP map-value layout + * + * The struct data-layout of map-value is a configuration interface. + * New members can only be added to the end of this structure. + */ +struct bpf_cpumap_val { + __u32 qsize; /* queue size to remote target CPU */ + union { + int fd; /* prog fd on map write */ + __u32 id; /* prog id on map read */ + } bpf_prog; +}; + +enum sk_action { + SK_DROP = 0, + SK_PASS, +}; + +/* user accessible metadata for SK_MSG packet hook, new fields must + * be added to the end of this structure + */ +struct sk_msg_md { + __bpf_md_ptr(void *, data); + __bpf_md_ptr(void *, data_end); + + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + __u32 size; /* Total size of sk_msg */ + + __bpf_md_ptr(struct bpf_sock *, sk); /* current socket */ +}; + +struct sk_reuseport_md { + /* + * Start of directly accessible data. It begins from + * the tcp/udp header. + */ + __bpf_md_ptr(void *, data); + /* End of directly accessible data */ + __bpf_md_ptr(void *, data_end); + /* + * Total length of packet (starting from the tcp/udp header). + * Note that the directly accessible bytes (data_end - data) + * could be less than this "len". Those bytes could be + * indirectly read by a helper "bpf_skb_load_bytes()". + */ + __u32 len; + /* + * Eth protocol in the mac header (network byte order). e.g. + * ETH_P_IP(0x0800) and ETH_P_IPV6(0x86DD) + */ + __u32 eth_protocol; + __u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */ + __u32 bind_inany; /* Is sock bound to an INANY address? */ + __u32 hash; /* A hash of the packet 4 tuples */ + /* When reuse->migrating_sk is NULL, it is selecting a sk for the + * new incoming connection request (e.g. selecting a listen sk for + * the received SYN in the TCP case). reuse->sk is one of the sk + * in the reuseport group. The bpf prog can use reuse->sk to learn + * the local listening ip/port without looking into the skb. + * + * When reuse->migrating_sk is not NULL, reuse->sk is closed and + * reuse->migrating_sk is the socket that needs to be migrated + * to another listening socket. migrating_sk could be a fullsock + * sk that is fully established or a reqsk that is in-the-middle + * of 3-way handshake. + */ + __bpf_md_ptr(struct bpf_sock *, sk); + __bpf_md_ptr(struct bpf_sock *, migrating_sk); +}; + +#define BPF_TAG_SIZE 8 + +struct bpf_prog_info { + __u32 type; + __u32 id; + __u8 tag[BPF_TAG_SIZE]; + __u32 jited_prog_len; + __u32 xlated_prog_len; + __aligned_u64 jited_prog_insns; + __aligned_u64 xlated_prog_insns; + __u64 load_time; /* ns since boottime */ + __u32 created_by_uid; + __u32 nr_map_ids; + __aligned_u64 map_ids; + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 gpl_compatible:1; + __u32 :31; /* alignment pad */ + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; + __u32 nr_jited_func_lens; + __aligned_u64 jited_ksyms; + __aligned_u64 jited_func_lens; + __u32 btf_id; + __u32 func_info_rec_size; + __aligned_u64 func_info; + __u32 nr_func_info; + __u32 nr_line_info; + __aligned_u64 line_info; + __aligned_u64 jited_line_info; + __u32 nr_jited_line_info; + __u32 line_info_rec_size; + __u32 jited_line_info_rec_size; + __u32 nr_prog_tags; + __aligned_u64 prog_tags; + __u64 run_time_ns; + __u64 run_cnt; + __u64 recursion_misses; + __u32 verified_insns; + __u32 attach_btf_obj_id; + __u32 attach_btf_id; +} __attribute__((aligned(8))); + +struct bpf_map_info { + __u32 type; + __u32 id; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 btf_vmlinux_value_type_id; + __u64 netns_dev; + __u64 netns_ino; + __u32 btf_id; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 :32; /* alignment pad */ + __u64 map_extra; +} __attribute__((aligned(8))); + +struct bpf_btf_info { + __aligned_u64 btf; + __u32 btf_size; + __u32 id; + __aligned_u64 name; + __u32 name_len; + __u32 kernel_btf; +} __attribute__((aligned(8))); + +struct bpf_link_info { + __u32 type; + __u32 id; + __u32 prog_id; + union { + struct { + __aligned_u64 tp_name; /* in/out: tp_name buffer ptr */ + __u32 tp_name_len; /* in/out: tp_name buffer len */ + } raw_tracepoint; + struct { + __u32 attach_type; + __u32 target_obj_id; /* prog_id for PROG_EXT, otherwise btf object id */ + __u32 target_btf_id; /* BTF type id inside the object */ + } tracing; + struct { + __u64 cgroup_id; + __u32 attach_type; + } cgroup; + struct { + __aligned_u64 target_name; /* in/out: target_name buffer ptr */ + __u32 target_name_len; /* in/out: target_name buffer len */ + + /* If the iter specific field is 32 bits, it can be put + * in the first or second union. Otherwise it should be + * put in the second union. + */ + union { + struct { + __u32 map_id; + } map; + }; + union { + struct { + __u64 cgroup_id; + __u32 order; + } cgroup; + struct { + __u32 tid; + __u32 pid; + } task; + }; + } iter; + struct { + __u32 netns_ino; + __u32 attach_type; + } netns; + struct { + __u32 ifindex; + } xdp; + }; +} __attribute__((aligned(8))); + +/* User bpf_sock_addr struct to access socket fields and sockaddr struct passed + * by user and intended to be used by socket (e.g. to bind to, depends on + * attach type). + */ +struct bpf_sock_addr { + __u32 user_family; /* Allows 4-byte read, but no write. */ + __u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order. + */ + __u32 user_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. + * Stored in network byte order. + */ + __u32 user_port; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order + */ + __u32 family; /* Allows 4-byte read, but no write */ + __u32 type; /* Allows 4-byte read, but no write */ + __u32 protocol; /* Allows 4-byte read, but no write */ + __u32 msg_src_ip4; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order. + */ + __u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. + * Stored in network byte order. + */ + __bpf_md_ptr(struct bpf_sock *, sk); +}; + +/* User bpf_sock_ops struct to access socket values and specify request ops + * and their replies. + * Some of this fields are in network (bigendian) byte order and may need + * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h). + * New fields can only be added at the end of this structure + */ +struct bpf_sock_ops { + __u32 op; + union { + __u32 args[4]; /* Optionally passed to bpf program */ + __u32 reply; /* Returned by bpf program */ + __u32 replylong[4]; /* Optionally returned by bpf prog */ + }; + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + __u32 is_fullsock; /* Some TCP fields are only valid if + * there is a full socket. If not, the + * fields read as zero. + */ + __u32 snd_cwnd; + __u32 srtt_us; /* Averaged RTT << 3 in usecs */ + __u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */ + __u32 state; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u32 sk_txhash; + __u64 bytes_received; + __u64 bytes_acked; + __bpf_md_ptr(struct bpf_sock *, sk); + /* [skb_data, skb_data_end) covers the whole TCP header. + * + * BPF_SOCK_OPS_PARSE_HDR_OPT_CB: The packet received + * BPF_SOCK_OPS_HDR_OPT_LEN_CB: Not useful because the + * header has not been written. + * BPF_SOCK_OPS_WRITE_HDR_OPT_CB: The header and options have + * been written so far. + * BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: The SYNACK that concludes + * the 3WHS. + * BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: The ACK that concludes + * the 3WHS. + * + * bpf_load_hdr_opt() can also be used to read a particular option. + */ + __bpf_md_ptr(void *, skb_data); + __bpf_md_ptr(void *, skb_data_end); + __u32 skb_len; /* The total length of a packet. + * It includes the header, options, + * and payload. + */ + __u32 skb_tcp_flags; /* tcp_flags of the header. It provides + * an easy way to check for tcp_flags + * without parsing skb_data. + * + * In particular, the skb_tcp_flags + * will still be available in + * BPF_SOCK_OPS_HDR_OPT_LEN even though + * the outgoing header has not + * been written yet. + */ + __u64 skb_hwtstamp; +}; + +/* Definitions for bpf_sock_ops_cb_flags */ +enum { + BPF_SOCK_OPS_RTO_CB_FLAG = (1<<0), + BPF_SOCK_OPS_RETRANS_CB_FLAG = (1<<1), + BPF_SOCK_OPS_STATE_CB_FLAG = (1<<2), + BPF_SOCK_OPS_RTT_CB_FLAG = (1<<3), + /* Call bpf for all received TCP headers. The bpf prog will be + * called under sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB + * + * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB + * for the header option related helpers that will be useful + * to the bpf programs. + * + * It could be used at the client/active side (i.e. connect() side) + * when the server told it that the server was in syncookie + * mode and required the active side to resend the bpf-written + * options. The active side can keep writing the bpf-options until + * it received a valid packet from the server side to confirm + * the earlier packet (and options) has been received. The later + * example patch is using it like this at the active side when the + * server is in syncookie mode. + * + * The bpf prog will usually turn this off in the common cases. + */ + BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = (1<<4), + /* Call bpf when kernel has received a header option that + * the kernel cannot handle. The bpf prog will be called under + * sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB. + * + * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB + * for the header option related helpers that will be useful + * to the bpf programs. + */ + BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = (1<<5), + /* Call bpf when the kernel is writing header options for the + * outgoing packet. The bpf prog will first be called + * to reserve space in a skb under + * sock_ops->op == BPF_SOCK_OPS_HDR_OPT_LEN_CB. Then + * the bpf prog will be called to write the header option(s) + * under sock_ops->op == BPF_SOCK_OPS_WRITE_HDR_OPT_CB. + * + * Please refer to the comment in BPF_SOCK_OPS_HDR_OPT_LEN_CB + * and BPF_SOCK_OPS_WRITE_HDR_OPT_CB for the header option + * related helpers that will be useful to the bpf programs. + * + * The kernel gets its chance to reserve space and write + * options first before the BPF program does. + */ + BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = (1<<6), +/* Mask of all currently supported cb flags */ + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7F, +}; + +/* List of known BPF sock_ops operators. + * New entries can only be added at the end + */ +enum { + BPF_SOCK_OPS_VOID, + BPF_SOCK_OPS_TIMEOUT_INIT, /* Should return SYN-RTO value to use or + * -1 if default value should be used + */ + BPF_SOCK_OPS_RWND_INIT, /* Should return initial advertized + * window (in packets) or -1 if default + * value should be used + */ + BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an + * active connection is initialized + */ + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an + * active connection is + * established + */ + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a + * passive connection is + * established + */ + BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control + * needs ECN + */ + BPF_SOCK_OPS_BASE_RTT, /* Get base RTT. The correct value is + * based on the path and may be + * dependent on the congestion control + * algorithm. In general it indicates + * a congestion threshold. RTTs above + * this indicate congestion + */ + BPF_SOCK_OPS_RTO_CB, /* Called when an RTO has triggered. + * Arg1: value of icsk_retransmits + * Arg2: value of icsk_rto + * Arg3: whether RTO has expired + */ + BPF_SOCK_OPS_RETRANS_CB, /* Called when skb is retransmitted. + * Arg1: sequence number of 1st byte + * Arg2: # segments + * Arg3: return value of + * tcp_transmit_skb (0 => success) + */ + BPF_SOCK_OPS_STATE_CB, /* Called when TCP changes state. + * Arg1: old_state + * Arg2: new_state + */ + BPF_SOCK_OPS_TCP_LISTEN_CB, /* Called on listen(2), right after + * socket transition to LISTEN state. + */ + BPF_SOCK_OPS_RTT_CB, /* Called on every RTT. + */ + BPF_SOCK_OPS_PARSE_HDR_OPT_CB, /* Parse the header option. + * It will be called to handle + * the packets received at + * an already established + * connection. + * + * sock_ops->skb_data: + * Referring to the received skb. + * It covers the TCP header only. + * + * bpf_load_hdr_opt() can also + * be used to search for a + * particular option. + */ + BPF_SOCK_OPS_HDR_OPT_LEN_CB, /* Reserve space for writing the + * header option later in + * BPF_SOCK_OPS_WRITE_HDR_OPT_CB. + * Arg1: bool want_cookie. (in + * writing SYNACK only) + * + * sock_ops->skb_data: + * Not available because no header has + * been written yet. + * + * sock_ops->skb_tcp_flags: + * The tcp_flags of the + * outgoing skb. (e.g. SYN, ACK, FIN). + * + * bpf_reserve_hdr_opt() should + * be used to reserve space. + */ + BPF_SOCK_OPS_WRITE_HDR_OPT_CB, /* Write the header options + * Arg1: bool want_cookie. (in + * writing SYNACK only) + * + * sock_ops->skb_data: + * Referring to the outgoing skb. + * It covers the TCP header + * that has already been written + * by the kernel and the + * earlier bpf-progs. + * + * sock_ops->skb_tcp_flags: + * The tcp_flags of the outgoing + * skb. (e.g. SYN, ACK, FIN). + * + * bpf_store_hdr_opt() should + * be used to write the + * option. + * + * bpf_load_hdr_opt() can also + * be used to search for a + * particular option that + * has already been written + * by the kernel or the + * earlier bpf-progs. + */ +}; + +/* List of TCP states. There is a build check in net/ipv4/tcp.c to detect + * changes between the TCP and BPF versions. Ideally this should never happen. + * If it does, we need to add code to convert them before calling + * the BPF sock_ops function. + */ +enum { + BPF_TCP_ESTABLISHED = 1, + BPF_TCP_SYN_SENT, + BPF_TCP_SYN_RECV, + BPF_TCP_FIN_WAIT1, + BPF_TCP_FIN_WAIT2, + BPF_TCP_TIME_WAIT, + BPF_TCP_CLOSE, + BPF_TCP_CLOSE_WAIT, + BPF_TCP_LAST_ACK, + BPF_TCP_LISTEN, + BPF_TCP_CLOSING, /* Now a valid state */ + BPF_TCP_NEW_SYN_RECV, + + BPF_TCP_MAX_STATES /* Leave at the end! */ +}; + +enum { + TCP_BPF_IW = 1001, /* Set TCP initial congestion window */ + TCP_BPF_SNDCWND_CLAMP = 1002, /* Set sndcwnd_clamp */ + TCP_BPF_DELACK_MAX = 1003, /* Max delay ack in usecs */ + TCP_BPF_RTO_MIN = 1004, /* Min delay ack in usecs */ + /* Copy the SYN pkt to optval + * + * BPF_PROG_TYPE_SOCK_OPS only. It is similar to the + * bpf_getsockopt(TCP_SAVED_SYN) but it does not limit + * to only getting from the saved_syn. It can either get the + * syn packet from: + * + * 1. the just-received SYN packet (only available when writing the + * SYNACK). It will be useful when it is not necessary to + * save the SYN packet for latter use. It is also the only way + * to get the SYN during syncookie mode because the syn + * packet cannot be saved during syncookie. + * + * OR + * + * 2. the earlier saved syn which was done by + * bpf_setsockopt(TCP_SAVE_SYN). + * + * The bpf_getsockopt(TCP_BPF_SYN*) option will hide where the + * SYN packet is obtained. + * + * If the bpf-prog does not need the IP[46] header, the + * bpf-prog can avoid parsing the IP header by using + * TCP_BPF_SYN. Otherwise, the bpf-prog can get both + * IP[46] and TCP header by using TCP_BPF_SYN_IP. + * + * >0: Total number of bytes copied + * -ENOSPC: Not enough space in optval. Only optlen number of + * bytes is copied. + * -ENOENT: The SYN skb is not available now and the earlier SYN pkt + * is not saved by setsockopt(TCP_SAVE_SYN). + */ + TCP_BPF_SYN = 1005, /* Copy the TCP header */ + TCP_BPF_SYN_IP = 1006, /* Copy the IP[46] and TCP header */ + TCP_BPF_SYN_MAC = 1007, /* Copy the MAC, IP[46], and TCP header */ +}; + +enum { + BPF_LOAD_HDR_OPT_TCP_SYN = (1ULL << 0), +}; + +/* args[0] value during BPF_SOCK_OPS_HDR_OPT_LEN_CB and + * BPF_SOCK_OPS_WRITE_HDR_OPT_CB. + */ +enum { + BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, /* Kernel is finding the + * total option spaces + * required for an established + * sk in order to calculate the + * MSS. No skb is actually + * sent. + */ + BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, /* Kernel is in syncookie mode + * when sending a SYN. + */ +}; + +struct bpf_perf_event_value { + __u64 counter; + __u64 enabled; + __u64 running; +}; + +enum { + BPF_DEVCG_ACC_MKNOD = (1ULL << 0), + BPF_DEVCG_ACC_READ = (1ULL << 1), + BPF_DEVCG_ACC_WRITE = (1ULL << 2), +}; + +enum { + BPF_DEVCG_DEV_BLOCK = (1ULL << 0), + BPF_DEVCG_DEV_CHAR = (1ULL << 1), +}; + +struct bpf_cgroup_dev_ctx { + /* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */ + __u32 access_type; + __u32 major; + __u32 minor; +}; + +struct bpf_raw_tracepoint_args { + __u64 args[0]; +}; + +/* DIRECT: Skip the FIB rules and go to FIB table associated with device + * OUTPUT: Do lookup from egress perspective; default is ingress + */ +enum { + BPF_FIB_LOOKUP_DIRECT = (1U << 0), + BPF_FIB_LOOKUP_OUTPUT = (1U << 1), + BPF_FIB_LOOKUP_SKIP_NEIGH = (1U << 2), +}; + +enum { + BPF_FIB_LKUP_RET_SUCCESS, /* lookup successful */ + BPF_FIB_LKUP_RET_BLACKHOLE, /* dest is blackholed; can be dropped */ + BPF_FIB_LKUP_RET_UNREACHABLE, /* dest is unreachable; can be dropped */ + BPF_FIB_LKUP_RET_PROHIBIT, /* dest not allowed; can be dropped */ + BPF_FIB_LKUP_RET_NOT_FWDED, /* packet is not forwarded */ + BPF_FIB_LKUP_RET_FWD_DISABLED, /* fwding is not enabled on ingress */ + BPF_FIB_LKUP_RET_UNSUPP_LWT, /* fwd requires encapsulation */ + BPF_FIB_LKUP_RET_NO_NEIGH, /* no neighbor entry for nh */ + BPF_FIB_LKUP_RET_FRAG_NEEDED, /* fragmentation required to fwd */ +}; + +struct bpf_fib_lookup { + /* input: network family for lookup (AF_INET, AF_INET6) + * output: network family of egress nexthop + */ + __u8 family; + + /* set if lookup is to consider L4 data - e.g., FIB rules */ + __u8 l4_protocol; + __be16 sport; + __be16 dport; + + union { /* used for MTU check */ + /* input to lookup */ + __u16 tot_len; /* L3 length from network hdr (iph->tot_len) */ + + /* output: MTU value */ + __u16 mtu_result; + }; + /* input: L3 device index for lookup + * output: device index from FIB lookup + */ + __u32 ifindex; + + union { + /* inputs to lookup */ + __u8 tos; /* AF_INET */ + __be32 flowinfo; /* AF_INET6, flow_label + priority */ + + /* output: metric of fib result (IPv4/IPv6 only) */ + __u32 rt_metric; + }; + + union { + __be32 ipv4_src; + __u32 ipv6_src[4]; /* in6_addr; network order */ + }; + + /* input to bpf_fib_lookup, ipv{4,6}_dst is destination address in + * network header. output: bpf_fib_lookup sets to gateway address + * if FIB lookup returns gateway route + */ + union { + __be32 ipv4_dst; + __u32 ipv6_dst[4]; /* in6_addr; network order */ + }; + + /* output */ + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __u8 smac[6]; /* ETH_ALEN */ + __u8 dmac[6]; /* ETH_ALEN */ +}; + +struct bpf_redir_neigh { + /* network family for lookup (AF_INET, AF_INET6) */ + __u32 nh_family; + /* network address of nexthop; skips fib lookup to find gateway */ + union { + __be32 ipv4_nh; + __u32 ipv6_nh[4]; /* in6_addr; network order */ + }; +}; + +/* bpf_check_mtu flags*/ +enum bpf_check_mtu_flags { + BPF_MTU_CHK_SEGS = (1U << 0), +}; + +enum bpf_check_mtu_ret { + BPF_MTU_CHK_RET_SUCCESS, /* check and lookup successful */ + BPF_MTU_CHK_RET_FRAG_NEEDED, /* fragmentation required to fwd */ + BPF_MTU_CHK_RET_SEGS_TOOBIG, /* GSO re-segmentation needed to fwd */ +}; + +enum bpf_task_fd_type { + BPF_FD_TYPE_RAW_TRACEPOINT, /* tp name */ + BPF_FD_TYPE_TRACEPOINT, /* tp name */ + BPF_FD_TYPE_KPROBE, /* (symbol + offset) or addr */ + BPF_FD_TYPE_KRETPROBE, /* (symbol + offset) or addr */ + BPF_FD_TYPE_UPROBE, /* filename + offset */ + BPF_FD_TYPE_URETPROBE, /* filename + offset */ +}; + +enum { + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = (1U << 0), + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = (1U << 1), + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = (1U << 2), +}; + +struct bpf_flow_keys { + __u16 nhoff; + __u16 thoff; + __u16 addr_proto; /* ETH_P_* of valid addrs */ + __u8 is_frag; + __u8 is_first_frag; + __u8 is_encap; + __u8 ip_proto; + __be16 n_proto; + __be16 sport; + __be16 dport; + union { + struct { + __be32 ipv4_src; + __be32 ipv4_dst; + }; + struct { + __u32 ipv6_src[4]; /* in6_addr; network order */ + __u32 ipv6_dst[4]; /* in6_addr; network order */ + }; + }; + __u32 flags; + __be32 flow_label; +}; + +struct bpf_func_info { + __u32 insn_off; + __u32 type_id; +}; + +#define BPF_LINE_INFO_LINE_NUM(line_col) ((line_col) >> 10) +#define BPF_LINE_INFO_LINE_COL(line_col) ((line_col) & 0x3ff) + +struct bpf_line_info { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + +struct bpf_spin_lock { + __u32 val; +}; + +struct bpf_timer { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_dynptr { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_list_head { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_list_node { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_rb_root { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_rb_node { + __u64 :64; + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_sysctl { + __u32 write; /* Sysctl is being read (= 0) or written (= 1). + * Allows 1,2,4-byte read, but no write. + */ + __u32 file_pos; /* Sysctl file position to read from, write to. + * Allows 1,2,4-byte read an 4-byte write. + */ +}; + +struct bpf_sockopt { + __bpf_md_ptr(struct bpf_sock *, sk); + __bpf_md_ptr(void *, optval); + __bpf_md_ptr(void *, optval_end); + + __s32 level; + __s32 optname; + __s32 optlen; + __s32 retval; +}; + +struct bpf_pidns_info { + __u32 pid; + __u32 tgid; +}; + +/* User accessible data for SK_LOOKUP programs. Add new fields at the end. */ +struct bpf_sk_lookup { + union { + __bpf_md_ptr(struct bpf_sock *, sk); /* Selected socket */ + __u64 cookie; /* Non-zero if socket was selected in PROG_TEST_RUN */ + }; + + __u32 family; /* Protocol family (AF_INET, AF_INET6) */ + __u32 protocol; /* IP protocol (IPPROTO_TCP, IPPROTO_UDP) */ + __u32 remote_ip4; /* Network byte order */ + __u32 remote_ip6[4]; /* Network byte order */ + __be16 remote_port; /* Network byte order */ + __u16 :16; /* Zero padding */ + __u32 local_ip4; /* Network byte order */ + __u32 local_ip6[4]; /* Network byte order */ + __u32 local_port; /* Host byte order */ + __u32 ingress_ifindex; /* The arriving interface. Determined by inet_iif. */ +}; + +/* + * struct btf_ptr is used for typed pointer representation; the + * type id is used to render the pointer data as the appropriate type + * via the bpf_snprintf_btf() helper described above. A flags field - + * potentially to specify additional details about the BTF pointer + * (rather than its mode of display) - is included for future use. + * Display flags - BTF_F_* - are passed to bpf_snprintf_btf separately. + */ +struct btf_ptr { + void *ptr; + __u32 type_id; + __u32 flags; /* BTF ptr flags; unused at present. */ +}; + +/* + * Flags to control bpf_snprintf_btf() behaviour. + * - BTF_F_COMPACT: no formatting around type information + * - BTF_F_NONAME: no struct/union member names/types + * - BTF_F_PTR_RAW: show raw (unobfuscated) pointer values; + * equivalent to %px. + * - BTF_F_ZERO: show zero-valued struct/union members; they + * are not displayed by default + */ +enum { + BTF_F_COMPACT = (1ULL << 0), + BTF_F_NONAME = (1ULL << 1), + BTF_F_PTR_RAW = (1ULL << 2), + BTF_F_ZERO = (1ULL << 3), +}; + +/* bpf_core_relo_kind encodes which aspect of captured field/type/enum value + * has to be adjusted by relocations. It is emitted by llvm and passed to + * libbpf and later to the kernel. + */ +enum bpf_core_relo_kind { + BPF_CORE_FIELD_BYTE_OFFSET = 0, /* field byte offset */ + BPF_CORE_FIELD_BYTE_SIZE = 1, /* field size in bytes */ + BPF_CORE_FIELD_EXISTS = 2, /* field existence in target kernel */ + BPF_CORE_FIELD_SIGNED = 3, /* field signedness (0 - unsigned, 1 - signed) */ + BPF_CORE_FIELD_LSHIFT_U64 = 4, /* bitfield-specific left bitshift */ + BPF_CORE_FIELD_RSHIFT_U64 = 5, /* bitfield-specific right bitshift */ + BPF_CORE_TYPE_ID_LOCAL = 6, /* type ID in local BPF object */ + BPF_CORE_TYPE_ID_TARGET = 7, /* type ID in target kernel */ + BPF_CORE_TYPE_EXISTS = 8, /* type existence in target kernel */ + BPF_CORE_TYPE_SIZE = 9, /* type size in bytes */ + BPF_CORE_ENUMVAL_EXISTS = 10, /* enum value existence in target kernel */ + BPF_CORE_ENUMVAL_VALUE = 11, /* enum value integer value */ + BPF_CORE_TYPE_MATCHES = 12, /* type match in target kernel */ +}; + +/* + * "struct bpf_core_relo" is used to pass relocation data form LLVM to libbpf + * and from libbpf to the kernel. + * + * CO-RE relocation captures the following data: + * - insn_off - instruction offset (in bytes) within a BPF program that needs + * its insn->imm field to be relocated with actual field info; + * - type_id - BTF type ID of the "root" (containing) entity of a relocatable + * type or field; + * - access_str_off - offset into corresponding .BTF string section. String + * interpretation depends on specific relocation kind: + * - for field-based relocations, string encodes an accessed field using + * a sequence of field and array indices, separated by colon (:). It's + * conceptually very close to LLVM's getelementptr ([0]) instruction's + * arguments for identifying offset to a field. + * - for type-based relocations, strings is expected to be just "0"; + * - for enum value-based relocations, string contains an index of enum + * value within its enum type; + * - kind - one of enum bpf_core_relo_kind; + * + * Example: + * struct sample { + * int a; + * struct { + * int b[10]; + * }; + * }; + * + * struct sample *s = ...; + * int *x = &s->a; // encoded as "0:0" (a is field #0) + * int *y = &s->b[5]; // encoded as "0:1:0:5" (anon struct is field #1, + * // b is field #0 inside anon struct, accessing elem #5) + * int *z = &s[10]->b; // encoded as "10:1" (ptr is used as an array) + * + * type_id for all relocs in this example will capture BTF type id of + * `struct sample`. + * + * Such relocation is emitted when using __builtin_preserve_access_index() + * Clang built-in, passing expression that captures field address, e.g.: + * + * bpf_probe_read(&dst, sizeof(dst), + * __builtin_preserve_access_index(&src->a.b.c)); + * + * In this case Clang will emit field relocation recording necessary data to + * be able to find offset of embedded `a.b.c` field within `src` struct. + * + * [0] https://llvm.org/docs/LangRef.html#getelementptr-instruction + */ +struct bpf_core_relo { + __u32 insn_off; + __u32 type_id; + __u32 access_str_off; + enum bpf_core_relo_kind kind; +}; + +#endif /* _UAPI__LINUX_BPF_H__ */ diff --git a/bpftool/libbpf/include/uapi/linux/bpf_common.h b/bpftool/libbpf/include/uapi/linux/bpf_common.h new file mode 100644 index 0000000..ee97668 --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/bpf_common.h @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__LINUX_BPF_COMMON_H__ +#define _UAPI__LINUX_BPF_COMMON_H__ + +/* Instruction classes */ +#define BPF_CLASS(code) ((code) & 0x07) +#define BPF_LD 0x00 +#define BPF_LDX 0x01 +#define BPF_ST 0x02 +#define BPF_STX 0x03 +#define BPF_ALU 0x04 +#define BPF_JMP 0x05 +#define BPF_RET 0x06 +#define BPF_MISC 0x07 + +/* ld/ldx fields */ +#define BPF_SIZE(code) ((code) & 0x18) +#define BPF_W 0x00 /* 32-bit */ +#define BPF_H 0x08 /* 16-bit */ +#define BPF_B 0x10 /* 8-bit */ +/* eBPF BPF_DW 0x18 64-bit */ +#define BPF_MODE(code) ((code) & 0xe0) +#define BPF_IMM 0x00 +#define BPF_ABS 0x20 +#define BPF_IND 0x40 +#define BPF_MEM 0x60 +#define BPF_LEN 0x80 +#define BPF_MSH 0xa0 + +/* alu/jmp fields */ +#define BPF_OP(code) ((code) & 0xf0) +#define BPF_ADD 0x00 +#define BPF_SUB 0x10 +#define BPF_MUL 0x20 +#define BPF_DIV 0x30 +#define BPF_OR 0x40 +#define BPF_AND 0x50 +#define BPF_LSH 0x60 +#define BPF_RSH 0x70 +#define BPF_NEG 0x80 +#define BPF_MOD 0x90 +#define BPF_XOR 0xa0 + +#define BPF_JA 0x00 +#define BPF_JEQ 0x10 +#define BPF_JGT 0x20 +#define BPF_JGE 0x30 +#define BPF_JSET 0x40 +#define BPF_SRC(code) ((code) & 0x08) +#define BPF_K 0x00 +#define BPF_X 0x08 + +#ifndef BPF_MAXINSNS +#define BPF_MAXINSNS 4096 +#endif + +#endif /* _UAPI__LINUX_BPF_COMMON_H__ */ diff --git a/bpftool/libbpf/include/uapi/linux/btf.h b/bpftool/libbpf/include/uapi/linux/btf.h new file mode 100644 index 0000000..ec1798b --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/btf.h @@ -0,0 +1,200 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* Copyright (c) 2018 Facebook */ +#ifndef _UAPI__LINUX_BTF_H__ +#define _UAPI__LINUX_BTF_H__ + +#include + +#define BTF_MAGIC 0xeB9F +#define BTF_VERSION 1 + +struct btf_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + + /* All offsets are in bytes relative to the end of this header */ + __u32 type_off; /* offset of type section */ + __u32 type_len; /* length of type section */ + __u32 str_off; /* offset of string section */ + __u32 str_len; /* length of string section */ +}; + +/* Max # of type identifier */ +#define BTF_MAX_TYPE 0x000fffff +/* Max offset into the string section */ +#define BTF_MAX_NAME_OFFSET 0x00ffffff +/* Max # of struct/union/enum members or func args */ +#define BTF_MAX_VLEN 0xffff + +struct btf_type { + __u32 name_off; + /* "info" bits arrangement + * bits 0-15: vlen (e.g. # of struct's members) + * bits 16-23: unused + * bits 24-28: kind (e.g. int, ptr, array...etc) + * bits 29-30: unused + * bit 31: kind_flag, currently used by + * struct, union, enum, fwd and enum64 + */ + __u32 info; + /* "size" is used by INT, ENUM, STRUCT, UNION, DATASEC and ENUM64. + * "size" tells the size of the type it is describing. + * + * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, + * FUNC, FUNC_PROTO, VAR, DECL_TAG and TYPE_TAG. + * "type" is a type_id referring to another type. + */ + union { + __u32 size; + __u32 type; + }; +}; + +#define BTF_INFO_KIND(info) (((info) >> 24) & 0x1f) +#define BTF_INFO_VLEN(info) ((info) & 0xffff) +#define BTF_INFO_KFLAG(info) ((info) >> 31) + +enum { + BTF_KIND_UNKN = 0, /* Unknown */ + BTF_KIND_INT = 1, /* Integer */ + BTF_KIND_PTR = 2, /* Pointer */ + BTF_KIND_ARRAY = 3, /* Array */ + BTF_KIND_STRUCT = 4, /* Struct */ + BTF_KIND_UNION = 5, /* Union */ + BTF_KIND_ENUM = 6, /* Enumeration up to 32-bit values */ + BTF_KIND_FWD = 7, /* Forward */ + BTF_KIND_TYPEDEF = 8, /* Typedef */ + BTF_KIND_VOLATILE = 9, /* Volatile */ + BTF_KIND_CONST = 10, /* Const */ + BTF_KIND_RESTRICT = 11, /* Restrict */ + BTF_KIND_FUNC = 12, /* Function */ + BTF_KIND_FUNC_PROTO = 13, /* Function Proto */ + BTF_KIND_VAR = 14, /* Variable */ + BTF_KIND_DATASEC = 15, /* Section */ + BTF_KIND_FLOAT = 16, /* Floating point */ + BTF_KIND_DECL_TAG = 17, /* Decl Tag */ + BTF_KIND_TYPE_TAG = 18, /* Type Tag */ + BTF_KIND_ENUM64 = 19, /* Enumeration up to 64-bit values */ + + NR_BTF_KINDS, + BTF_KIND_MAX = NR_BTF_KINDS - 1, +}; + +/* For some specific BTF_KIND, "struct btf_type" is immediately + * followed by extra data. + */ + +/* BTF_KIND_INT is followed by a u32 and the following + * is the 32 bits arrangement: + */ +#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24) +#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16) +#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff) + +/* Attributes stored in the BTF_INT_ENCODING */ +#define BTF_INT_SIGNED (1 << 0) +#define BTF_INT_CHAR (1 << 1) +#define BTF_INT_BOOL (1 << 2) + +/* BTF_KIND_ENUM is followed by multiple "struct btf_enum". + * The exact number of btf_enum is stored in the vlen (of the + * info in "struct btf_type"). + */ +struct btf_enum { + __u32 name_off; + __s32 val; +}; + +/* BTF_KIND_ARRAY is followed by one "struct btf_array" */ +struct btf_array { + __u32 type; + __u32 index_type; + __u32 nelems; +}; + +/* BTF_KIND_STRUCT and BTF_KIND_UNION are followed + * by multiple "struct btf_member". The exact number + * of btf_member is stored in the vlen (of the info in + * "struct btf_type"). + */ +struct btf_member { + __u32 name_off; + __u32 type; + /* If the type info kind_flag is set, the btf_member offset + * contains both member bitfield size and bit offset. The + * bitfield size is set for bitfield members. If the type + * info kind_flag is not set, the offset contains only bit + * offset. + */ + __u32 offset; +}; + +/* If the struct/union type info kind_flag is set, the + * following two macros are used to access bitfield_size + * and bit_offset from btf_member.offset. + */ +#define BTF_MEMBER_BITFIELD_SIZE(val) ((val) >> 24) +#define BTF_MEMBER_BIT_OFFSET(val) ((val) & 0xffffff) + +/* BTF_KIND_FUNC_PROTO is followed by multiple "struct btf_param". + * The exact number of btf_param is stored in the vlen (of the + * info in "struct btf_type"). + */ +struct btf_param { + __u32 name_off; + __u32 type; +}; + +enum { + BTF_VAR_STATIC = 0, + BTF_VAR_GLOBAL_ALLOCATED = 1, + BTF_VAR_GLOBAL_EXTERN = 2, +}; + +enum btf_func_linkage { + BTF_FUNC_STATIC = 0, + BTF_FUNC_GLOBAL = 1, + BTF_FUNC_EXTERN = 2, +}; + +/* BTF_KIND_VAR is followed by a single "struct btf_var" to describe + * additional information related to the variable such as its linkage. + */ +struct btf_var { + __u32 linkage; +}; + +/* BTF_KIND_DATASEC is followed by multiple "struct btf_var_secinfo" + * to describe all BTF_KIND_VAR types it contains along with it's + * in-section offset as well as size. + */ +struct btf_var_secinfo { + __u32 type; + __u32 offset; + __u32 size; +}; + +/* BTF_KIND_DECL_TAG is followed by a single "struct btf_decl_tag" to describe + * additional information related to the tag applied location. + * If component_idx == -1, the tag is applied to a struct, union, + * variable or function. Otherwise, it is applied to a struct/union + * member or a func argument, and component_idx indicates which member + * or argument (0 ... vlen-1). + */ +struct btf_decl_tag { + __s32 component_idx; +}; + +/* BTF_KIND_ENUM64 is followed by multiple "struct btf_enum64". + * The exact number of btf_enum64 is stored in the vlen (of the + * info in "struct btf_type"). + */ +struct btf_enum64 { + __u32 name_off; + __u32 val_lo32; + __u32 val_hi32; +}; + +#endif /* _UAPI__LINUX_BTF_H__ */ diff --git a/bpftool/libbpf/include/uapi/linux/fcntl.h b/bpftool/libbpf/include/uapi/linux/fcntl.h new file mode 100644 index 0000000..2f86b2a --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/fcntl.h @@ -0,0 +1,114 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_FCNTL_H +#define _UAPI_LINUX_FCNTL_H + +#include +#include + +#define F_SETLEASE (F_LINUX_SPECIFIC_BASE + 0) +#define F_GETLEASE (F_LINUX_SPECIFIC_BASE + 1) + +/* + * Cancel a blocking posix lock; internal use only until we expose an + * asynchronous lock api to userspace: + */ +#define F_CANCELLK (F_LINUX_SPECIFIC_BASE + 5) + +/* Create a file descriptor with FD_CLOEXEC set. */ +#define F_DUPFD_CLOEXEC (F_LINUX_SPECIFIC_BASE + 6) + +/* + * Request nofications on a directory. + * See below for events that may be notified. + */ +#define F_NOTIFY (F_LINUX_SPECIFIC_BASE+2) + +/* + * Set and get of pipe page size array + */ +#define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7) +#define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8) + +/* + * Set/Get seals + */ +#define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9) +#define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10) + +/* + * Types of seals + */ +#define F_SEAL_SEAL 0x0001 /* prevent further seals from being set */ +#define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */ +#define F_SEAL_GROW 0x0004 /* prevent file from growing */ +#define F_SEAL_WRITE 0x0008 /* prevent writes */ +#define F_SEAL_FUTURE_WRITE 0x0010 /* prevent future writes while mapped */ +/* (1U << 31) is reserved for signed error codes */ + +/* + * Set/Get write life time hints. {GET,SET}_RW_HINT operate on the + * underlying inode, while {GET,SET}_FILE_RW_HINT operate only on + * the specific file. + */ +#define F_GET_RW_HINT (F_LINUX_SPECIFIC_BASE + 11) +#define F_SET_RW_HINT (F_LINUX_SPECIFIC_BASE + 12) +#define F_GET_FILE_RW_HINT (F_LINUX_SPECIFIC_BASE + 13) +#define F_SET_FILE_RW_HINT (F_LINUX_SPECIFIC_BASE + 14) + +/* + * Valid hint values for F_{GET,SET}_RW_HINT. 0 is "not set", or can be + * used to clear any hints previously set. + */ +#define RWH_WRITE_LIFE_NOT_SET 0 +#define RWH_WRITE_LIFE_NONE 1 +#define RWH_WRITE_LIFE_SHORT 2 +#define RWH_WRITE_LIFE_MEDIUM 3 +#define RWH_WRITE_LIFE_LONG 4 +#define RWH_WRITE_LIFE_EXTREME 5 + +/* + * The originally introduced spelling is remained from the first + * versions of the patch set that introduced the feature, see commit + * v4.13-rc1~212^2~51. + */ +#define RWF_WRITE_LIFE_NOT_SET RWH_WRITE_LIFE_NOT_SET + +/* + * Types of directory notifications that may be requested. + */ +#define DN_ACCESS 0x00000001 /* File accessed */ +#define DN_MODIFY 0x00000002 /* File modified */ +#define DN_CREATE 0x00000004 /* File created */ +#define DN_DELETE 0x00000008 /* File removed */ +#define DN_RENAME 0x00000010 /* File renamed */ +#define DN_ATTRIB 0x00000020 /* File changed attibutes */ +#define DN_MULTISHOT 0x80000000 /* Don't remove notifier */ + +/* + * The constants AT_REMOVEDIR and AT_EACCESS have the same value. AT_EACCESS is + * meaningful only to faccessat, while AT_REMOVEDIR is meaningful only to + * unlinkat. The two functions do completely different things and therefore, + * the flags can be allowed to overlap. For example, passing AT_REMOVEDIR to + * faccessat would be undefined behavior and thus treating it equivalent to + * AT_EACCESS is valid undefined behavior. + */ +#define AT_FDCWD -100 /* Special value used to indicate + openat should use the current + working directory. */ +#define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +#define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +#define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +#define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount traversal */ +#define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname */ + +#define AT_STATX_SYNC_TYPE 0x6000 /* Type of synchronisation required from statx() */ +#define AT_STATX_SYNC_AS_STAT 0x0000 /* - Do whatever stat() does */ +#define AT_STATX_FORCE_SYNC 0x2000 /* - Force the attributes to be sync'd with the server */ +#define AT_STATX_DONT_SYNC 0x4000 /* - Don't sync attributes with the server */ + +#define AT_RECURSIVE 0x8000 /* Apply to the entire subtree */ + +#endif /* _UAPI_LINUX_FCNTL_H */ diff --git a/bpftool/libbpf/include/uapi/linux/if_link.h b/bpftool/libbpf/include/uapi/linux/if_link.h new file mode 100644 index 0000000..901d98b --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/if_link.h @@ -0,0 +1,1283 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_IF_LINK_H +#define _UAPI_LINUX_IF_LINK_H + +#include +#include + +/* This struct should be in sync with struct rtnl_link_stats64 */ +struct rtnl_link_stats { + __u32 rx_packets; + __u32 tx_packets; + __u32 rx_bytes; + __u32 tx_bytes; + __u32 rx_errors; + __u32 tx_errors; + __u32 rx_dropped; + __u32 tx_dropped; + __u32 multicast; + __u32 collisions; + /* detailed rx_errors: */ + __u32 rx_length_errors; + __u32 rx_over_errors; + __u32 rx_crc_errors; + __u32 rx_frame_errors; + __u32 rx_fifo_errors; + __u32 rx_missed_errors; + + /* detailed tx_errors */ + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + + /* for cslip etc */ + __u32 rx_compressed; + __u32 tx_compressed; + + __u32 rx_nohandler; +}; + +/** + * struct rtnl_link_stats64 - The main device statistics structure. + * + * @rx_packets: Number of good packets received by the interface. + * For hardware interfaces counts all good packets received from the device + * by the host, including packets which host had to drop at various stages + * of processing (even in the driver). + * + * @tx_packets: Number of packets successfully transmitted. + * For hardware interfaces counts packets which host was able to successfully + * hand over to the device, which does not necessarily mean that packets + * had been successfully transmitted out of the device, only that device + * acknowledged it copied them out of host memory. + * + * @rx_bytes: Number of good received bytes, corresponding to @rx_packets. + * + * For IEEE 802.3 devices should count the length of Ethernet Frames + * excluding the FCS. + * + * @tx_bytes: Number of good transmitted bytes, corresponding to @tx_packets. + * + * For IEEE 802.3 devices should count the length of Ethernet Frames + * excluding the FCS. + * + * @rx_errors: Total number of bad packets received on this network device. + * This counter must include events counted by @rx_length_errors, + * @rx_crc_errors, @rx_frame_errors and other errors not otherwise + * counted. + * + * @tx_errors: Total number of transmit problems. + * This counter must include events counter by @tx_aborted_errors, + * @tx_carrier_errors, @tx_fifo_errors, @tx_heartbeat_errors, + * @tx_window_errors and other errors not otherwise counted. + * + * @rx_dropped: Number of packets received but not processed, + * e.g. due to lack of resources or unsupported protocol. + * For hardware interfaces this counter may include packets discarded + * due to L2 address filtering but should not include packets dropped + * by the device due to buffer exhaustion which are counted separately in + * @rx_missed_errors (since procfs folds those two counters together). + * + * @tx_dropped: Number of packets dropped on their way to transmission, + * e.g. due to lack of resources. + * + * @multicast: Multicast packets received. + * For hardware interfaces this statistic is commonly calculated + * at the device level (unlike @rx_packets) and therefore may include + * packets which did not reach the host. + * + * For IEEE 802.3 devices this counter may be equivalent to: + * + * - 30.3.1.1.21 aMulticastFramesReceivedOK + * + * @collisions: Number of collisions during packet transmissions. + * + * @rx_length_errors: Number of packets dropped due to invalid length. + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter should be equivalent to a sum + * of the following attributes: + * + * - 30.3.1.1.23 aInRangeLengthErrors + * - 30.3.1.1.24 aOutOfRangeLengthField + * - 30.3.1.1.25 aFrameTooLongErrors + * + * @rx_over_errors: Receiver FIFO overflow event counter. + * + * Historically the count of overflow events. Such events may be + * reported in the receive descriptors or via interrupts, and may + * not correspond one-to-one with dropped packets. + * + * The recommended interpretation for high speed interfaces is - + * number of packets dropped because they did not fit into buffers + * provided by the host, e.g. packets larger than MTU or next buffer + * in the ring was not available for a scatter transfer. + * + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * This statistics was historically used interchangeably with + * @rx_fifo_errors. + * + * This statistic corresponds to hardware events and is not commonly used + * on software devices. + * + * @rx_crc_errors: Number of packets received with a CRC error. + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter must be equivalent to: + * + * - 30.3.1.1.6 aFrameCheckSequenceErrors + * + * @rx_frame_errors: Receiver frame alignment errors. + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter should be equivalent to: + * + * - 30.3.1.1.7 aAlignmentErrors + * + * @rx_fifo_errors: Receiver FIFO error counter. + * + * Historically the count of overflow events. Those events may be + * reported in the receive descriptors or via interrupts, and may + * not correspond one-to-one with dropped packets. + * + * This statistics was used interchangeably with @rx_over_errors. + * Not recommended for use in drivers for high speed interfaces. + * + * This statistic is used on software devices, e.g. to count software + * packet queue overflow (can) or sequencing errors (GRE). + * + * @rx_missed_errors: Count of packets missed by the host. + * Folded into the "drop" counter in `/proc/net/dev`. + * + * Counts number of packets dropped by the device due to lack + * of buffer space. This usually indicates that the host interface + * is slower than the network interface, or host is not keeping up + * with the receive packet rate. + * + * This statistic corresponds to hardware events and is not used + * on software devices. + * + * @tx_aborted_errors: + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * For IEEE 802.3 devices capable of half-duplex operation this counter + * must be equivalent to: + * + * - 30.3.1.1.11 aFramesAbortedDueToXSColls + * + * High speed interfaces may use this counter as a general device + * discard counter. + * + * @tx_carrier_errors: Number of frame transmission errors due to loss + * of carrier during transmission. + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter must be equivalent to: + * + * - 30.3.1.1.13 aCarrierSenseErrors + * + * @tx_fifo_errors: Number of frame transmission errors due to device + * FIFO underrun / underflow. This condition occurs when the device + * begins transmission of a frame but is unable to deliver the + * entire frame to the transmitter in time for transmission. + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * @tx_heartbeat_errors: Number of Heartbeat / SQE Test errors for + * old half-duplex Ethernet. + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices possibly equivalent to: + * + * - 30.3.2.1.4 aSQETestErrors + * + * @tx_window_errors: Number of frame transmission errors due + * to late collisions (for Ethernet - after the first 64B of transmission). + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter must be equivalent to: + * + * - 30.3.1.1.10 aLateCollisions + * + * @rx_compressed: Number of correctly received compressed packets. + * This counters is only meaningful for interfaces which support + * packet compression (e.g. CSLIP, PPP). + * + * @tx_compressed: Number of transmitted compressed packets. + * This counters is only meaningful for interfaces which support + * packet compression (e.g. CSLIP, PPP). + * + * @rx_nohandler: Number of packets received on the interface + * but dropped by the networking stack because the device is + * not designated to receive packets (e.g. backup link in a bond). + */ +struct rtnl_link_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; + __u64 collisions; + + /* detailed rx_errors: */ + __u64 rx_length_errors; + __u64 rx_over_errors; + __u64 rx_crc_errors; + __u64 rx_frame_errors; + __u64 rx_fifo_errors; + __u64 rx_missed_errors; + + /* detailed tx_errors */ + __u64 tx_aborted_errors; + __u64 tx_carrier_errors; + __u64 tx_fifo_errors; + __u64 tx_heartbeat_errors; + __u64 tx_window_errors; + + /* for cslip etc */ + __u64 rx_compressed; + __u64 tx_compressed; + __u64 rx_nohandler; +}; + +/* The struct should be in sync with struct ifmap */ +struct rtnl_link_ifmap { + __u64 mem_start; + __u64 mem_end; + __u64 base_addr; + __u16 irq; + __u8 dma; + __u8 port; +}; + +/* + * IFLA_AF_SPEC + * Contains nested attributes for address family specific attributes. + * Each address family may create a attribute with the address family + * number as type and create its own attribute structure in it. + * + * Example: + * [IFLA_AF_SPEC] = { + * [AF_INET] = { + * [IFLA_INET_CONF] = ..., + * }, + * [AF_INET6] = { + * [IFLA_INET6_FLAGS] = ..., + * [IFLA_INET6_CONF] = ..., + * } + * } + */ + +enum { + IFLA_UNSPEC, + IFLA_ADDRESS, + IFLA_BROADCAST, + IFLA_IFNAME, + IFLA_MTU, + IFLA_LINK, + IFLA_QDISC, + IFLA_STATS, + IFLA_COST, +#define IFLA_COST IFLA_COST + IFLA_PRIORITY, +#define IFLA_PRIORITY IFLA_PRIORITY + IFLA_MASTER, +#define IFLA_MASTER IFLA_MASTER + IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */ +#define IFLA_WIRELESS IFLA_WIRELESS + IFLA_PROTINFO, /* Protocol specific information for a link */ +#define IFLA_PROTINFO IFLA_PROTINFO + IFLA_TXQLEN, +#define IFLA_TXQLEN IFLA_TXQLEN + IFLA_MAP, +#define IFLA_MAP IFLA_MAP + IFLA_WEIGHT, +#define IFLA_WEIGHT IFLA_WEIGHT + IFLA_OPERSTATE, + IFLA_LINKMODE, + IFLA_LINKINFO, +#define IFLA_LINKINFO IFLA_LINKINFO + IFLA_NET_NS_PID, + IFLA_IFALIAS, + IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ + IFLA_VFINFO_LIST, + IFLA_STATS64, + IFLA_VF_PORTS, + IFLA_PORT_SELF, + IFLA_AF_SPEC, + IFLA_GROUP, /* Group the device belongs to */ + IFLA_NET_NS_FD, + IFLA_EXT_MASK, /* Extended info mask, VFs, etc */ + IFLA_PROMISCUITY, /* Promiscuity count: > 0 means acts PROMISC */ +#define IFLA_PROMISCUITY IFLA_PROMISCUITY + IFLA_NUM_TX_QUEUES, + IFLA_NUM_RX_QUEUES, + IFLA_CARRIER, + IFLA_PHYS_PORT_ID, + IFLA_CARRIER_CHANGES, + IFLA_PHYS_SWITCH_ID, + IFLA_LINK_NETNSID, + IFLA_PHYS_PORT_NAME, + IFLA_PROTO_DOWN, + IFLA_GSO_MAX_SEGS, + IFLA_GSO_MAX_SIZE, + IFLA_PAD, + IFLA_XDP, + IFLA_EVENT, + IFLA_NEW_NETNSID, + IFLA_IF_NETNSID, + IFLA_TARGET_NETNSID = IFLA_IF_NETNSID, /* new alias */ + IFLA_CARRIER_UP_COUNT, + IFLA_CARRIER_DOWN_COUNT, + IFLA_NEW_IFINDEX, + IFLA_MIN_MTU, + IFLA_MAX_MTU, + IFLA_PROP_LIST, + IFLA_ALT_IFNAME, /* Alternative ifname */ + IFLA_PERM_ADDRESS, + IFLA_PROTO_DOWN_REASON, + + /* device (sysfs) name as parent, used instead + * of IFLA_LINK where there's no parent netdev + */ + IFLA_PARENT_DEV_NAME, + IFLA_PARENT_DEV_BUS_NAME, + IFLA_GRO_MAX_SIZE, + IFLA_TSO_MAX_SIZE, + IFLA_TSO_MAX_SEGS, + + __IFLA_MAX +}; + + +#define IFLA_MAX (__IFLA_MAX - 1) + +enum { + IFLA_PROTO_DOWN_REASON_UNSPEC, + IFLA_PROTO_DOWN_REASON_MASK, /* u32, mask for reason bits */ + IFLA_PROTO_DOWN_REASON_VALUE, /* u32, reason bit value */ + + __IFLA_PROTO_DOWN_REASON_CNT, + IFLA_PROTO_DOWN_REASON_MAX = __IFLA_PROTO_DOWN_REASON_CNT - 1 +}; + +/* backwards compatibility for userspace */ +#ifndef __KERNEL__ +#define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) +#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) +#endif + +enum { + IFLA_INET_UNSPEC, + IFLA_INET_CONF, + __IFLA_INET_MAX, +}; + +#define IFLA_INET_MAX (__IFLA_INET_MAX - 1) + +/* ifi_flags. + + IFF_* flags. + + The only change is: + IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are + more not changeable by user. They describe link media + characteristics and set by device driver. + + Comments: + - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid + - If neither of these three flags are set; + the interface is NBMA. + + - IFF_MULTICAST does not mean anything special: + multicasts can be used on all not-NBMA links. + IFF_MULTICAST means that this media uses special encapsulation + for multicast frames. Apparently, all IFF_POINTOPOINT and + IFF_BROADCAST devices are able to use multicasts too. + */ + +/* IFLA_LINK. + For usual devices it is equal ifi_index. + If it is a "virtual interface" (f.e. tunnel), ifi_link + can point to real physical interface (f.e. for bandwidth calculations), + or maybe 0, what means, that real media is unknown (usual + for IPIP tunnels, when route to endpoint is allowed to change) + */ + +/* Subtype attributes for IFLA_PROTINFO */ +enum { + IFLA_INET6_UNSPEC, + IFLA_INET6_FLAGS, /* link flags */ + IFLA_INET6_CONF, /* sysctl parameters */ + IFLA_INET6_STATS, /* statistics */ + IFLA_INET6_MCAST, /* MC things. What of them? */ + IFLA_INET6_CACHEINFO, /* time values and max reasm size */ + IFLA_INET6_ICMP6STATS, /* statistics (icmpv6) */ + IFLA_INET6_TOKEN, /* device token */ + IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */ + IFLA_INET6_RA_MTU, /* mtu carried in the RA message */ + __IFLA_INET6_MAX +}; + +#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) + +enum in6_addr_gen_mode { + IN6_ADDR_GEN_MODE_EUI64, + IN6_ADDR_GEN_MODE_NONE, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY, + IN6_ADDR_GEN_MODE_RANDOM, +}; + +/* Bridge section */ + +enum { + IFLA_BR_UNSPEC, + IFLA_BR_FORWARD_DELAY, + IFLA_BR_HELLO_TIME, + IFLA_BR_MAX_AGE, + IFLA_BR_AGEING_TIME, + IFLA_BR_STP_STATE, + IFLA_BR_PRIORITY, + IFLA_BR_VLAN_FILTERING, + IFLA_BR_VLAN_PROTOCOL, + IFLA_BR_GROUP_FWD_MASK, + IFLA_BR_ROOT_ID, + IFLA_BR_BRIDGE_ID, + IFLA_BR_ROOT_PORT, + IFLA_BR_ROOT_PATH_COST, + IFLA_BR_TOPOLOGY_CHANGE, + IFLA_BR_TOPOLOGY_CHANGE_DETECTED, + IFLA_BR_HELLO_TIMER, + IFLA_BR_TCN_TIMER, + IFLA_BR_TOPOLOGY_CHANGE_TIMER, + IFLA_BR_GC_TIMER, + IFLA_BR_GROUP_ADDR, + IFLA_BR_FDB_FLUSH, + IFLA_BR_MCAST_ROUTER, + IFLA_BR_MCAST_SNOOPING, + IFLA_BR_MCAST_QUERY_USE_IFADDR, + IFLA_BR_MCAST_QUERIER, + IFLA_BR_MCAST_HASH_ELASTICITY, + IFLA_BR_MCAST_HASH_MAX, + IFLA_BR_MCAST_LAST_MEMBER_CNT, + IFLA_BR_MCAST_STARTUP_QUERY_CNT, + IFLA_BR_MCAST_LAST_MEMBER_INTVL, + IFLA_BR_MCAST_MEMBERSHIP_INTVL, + IFLA_BR_MCAST_QUERIER_INTVL, + IFLA_BR_MCAST_QUERY_INTVL, + IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, + IFLA_BR_MCAST_STARTUP_QUERY_INTVL, + IFLA_BR_NF_CALL_IPTABLES, + IFLA_BR_NF_CALL_IP6TABLES, + IFLA_BR_NF_CALL_ARPTABLES, + IFLA_BR_VLAN_DEFAULT_PVID, + IFLA_BR_PAD, + IFLA_BR_VLAN_STATS_ENABLED, + IFLA_BR_MCAST_STATS_ENABLED, + IFLA_BR_MCAST_IGMP_VERSION, + IFLA_BR_MCAST_MLD_VERSION, + IFLA_BR_VLAN_STATS_PER_PORT, + IFLA_BR_MULTI_BOOLOPT, + IFLA_BR_MCAST_QUERIER_STATE, + __IFLA_BR_MAX, +}; + +#define IFLA_BR_MAX (__IFLA_BR_MAX - 1) + +struct ifla_bridge_id { + __u8 prio[2]; + __u8 addr[6]; /* ETH_ALEN */ +}; + +enum { + BRIDGE_MODE_UNSPEC, + BRIDGE_MODE_HAIRPIN, +}; + +enum { + IFLA_BRPORT_UNSPEC, + IFLA_BRPORT_STATE, /* Spanning tree state */ + IFLA_BRPORT_PRIORITY, /* " priority */ + IFLA_BRPORT_COST, /* " cost */ + IFLA_BRPORT_MODE, /* mode (hairpin) */ + IFLA_BRPORT_GUARD, /* bpdu guard */ + IFLA_BRPORT_PROTECT, /* root port protection */ + IFLA_BRPORT_FAST_LEAVE, /* multicast fast leave */ + IFLA_BRPORT_LEARNING, /* mac learning */ + IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */ + IFLA_BRPORT_PROXYARP, /* proxy ARP */ + IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */ + IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */ + IFLA_BRPORT_ROOT_ID, /* designated root */ + IFLA_BRPORT_BRIDGE_ID, /* designated bridge */ + IFLA_BRPORT_DESIGNATED_PORT, + IFLA_BRPORT_DESIGNATED_COST, + IFLA_BRPORT_ID, + IFLA_BRPORT_NO, + IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, + IFLA_BRPORT_CONFIG_PENDING, + IFLA_BRPORT_MESSAGE_AGE_TIMER, + IFLA_BRPORT_FORWARD_DELAY_TIMER, + IFLA_BRPORT_HOLD_TIMER, + IFLA_BRPORT_FLUSH, + IFLA_BRPORT_MULTICAST_ROUTER, + IFLA_BRPORT_PAD, + IFLA_BRPORT_MCAST_FLOOD, + IFLA_BRPORT_MCAST_TO_UCAST, + IFLA_BRPORT_VLAN_TUNNEL, + IFLA_BRPORT_BCAST_FLOOD, + IFLA_BRPORT_GROUP_FWD_MASK, + IFLA_BRPORT_NEIGH_SUPPRESS, + IFLA_BRPORT_ISOLATED, + IFLA_BRPORT_BACKUP_PORT, + IFLA_BRPORT_MRP_RING_OPEN, + IFLA_BRPORT_MRP_IN_OPEN, + IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT, + IFLA_BRPORT_MCAST_EHT_HOSTS_CNT, + __IFLA_BRPORT_MAX +}; +#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) + +struct ifla_cacheinfo { + __u32 max_reasm_len; + __u32 tstamp; /* ipv6InterfaceTable updated timestamp */ + __u32 reachable_time; + __u32 retrans_time; +}; + +enum { + IFLA_INFO_UNSPEC, + IFLA_INFO_KIND, + IFLA_INFO_DATA, + IFLA_INFO_XSTATS, + IFLA_INFO_SLAVE_KIND, + IFLA_INFO_SLAVE_DATA, + __IFLA_INFO_MAX, +}; + +#define IFLA_INFO_MAX (__IFLA_INFO_MAX - 1) + +/* VLAN section */ + +enum { + IFLA_VLAN_UNSPEC, + IFLA_VLAN_ID, + IFLA_VLAN_FLAGS, + IFLA_VLAN_EGRESS_QOS, + IFLA_VLAN_INGRESS_QOS, + IFLA_VLAN_PROTOCOL, + __IFLA_VLAN_MAX, +}; + +#define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1) + +struct ifla_vlan_flags { + __u32 flags; + __u32 mask; +}; + +enum { + IFLA_VLAN_QOS_UNSPEC, + IFLA_VLAN_QOS_MAPPING, + __IFLA_VLAN_QOS_MAX +}; + +#define IFLA_VLAN_QOS_MAX (__IFLA_VLAN_QOS_MAX - 1) + +struct ifla_vlan_qos_mapping { + __u32 from; + __u32 to; +}; + +/* MACVLAN section */ +enum { + IFLA_MACVLAN_UNSPEC, + IFLA_MACVLAN_MODE, + IFLA_MACVLAN_FLAGS, + IFLA_MACVLAN_MACADDR_MODE, + IFLA_MACVLAN_MACADDR, + IFLA_MACVLAN_MACADDR_DATA, + IFLA_MACVLAN_MACADDR_COUNT, + IFLA_MACVLAN_BC_QUEUE_LEN, + IFLA_MACVLAN_BC_QUEUE_LEN_USED, + __IFLA_MACVLAN_MAX, +}; + +#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1) + +enum macvlan_mode { + MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */ + MACVLAN_MODE_VEPA = 2, /* talk to other ports through ext bridge */ + MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ + MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */ + MACVLAN_MODE_SOURCE = 16,/* use source MAC address list to assign */ +}; + +enum macvlan_macaddr_mode { + MACVLAN_MACADDR_ADD, + MACVLAN_MACADDR_DEL, + MACVLAN_MACADDR_FLUSH, + MACVLAN_MACADDR_SET, +}; + +#define MACVLAN_FLAG_NOPROMISC 1 +#define MACVLAN_FLAG_NODST 2 /* skip dst macvlan if matching src macvlan */ + +/* VRF section */ +enum { + IFLA_VRF_UNSPEC, + IFLA_VRF_TABLE, + __IFLA_VRF_MAX +}; + +#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) + +enum { + IFLA_VRF_PORT_UNSPEC, + IFLA_VRF_PORT_TABLE, + __IFLA_VRF_PORT_MAX +}; + +#define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1) + +/* MACSEC section */ +enum { + IFLA_MACSEC_UNSPEC, + IFLA_MACSEC_SCI, + IFLA_MACSEC_PORT, + IFLA_MACSEC_ICV_LEN, + IFLA_MACSEC_CIPHER_SUITE, + IFLA_MACSEC_WINDOW, + IFLA_MACSEC_ENCODING_SA, + IFLA_MACSEC_ENCRYPT, + IFLA_MACSEC_PROTECT, + IFLA_MACSEC_INC_SCI, + IFLA_MACSEC_ES, + IFLA_MACSEC_SCB, + IFLA_MACSEC_REPLAY_PROTECT, + IFLA_MACSEC_VALIDATION, + IFLA_MACSEC_PAD, + IFLA_MACSEC_OFFLOAD, + __IFLA_MACSEC_MAX, +}; + +#define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1) + +/* XFRM section */ +enum { + IFLA_XFRM_UNSPEC, + IFLA_XFRM_LINK, + IFLA_XFRM_IF_ID, + IFLA_XFRM_COLLECT_METADATA, + __IFLA_XFRM_MAX +}; + +#define IFLA_XFRM_MAX (__IFLA_XFRM_MAX - 1) + +enum macsec_validation_type { + MACSEC_VALIDATE_DISABLED = 0, + MACSEC_VALIDATE_CHECK = 1, + MACSEC_VALIDATE_STRICT = 2, + __MACSEC_VALIDATE_END, + MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1, +}; + +enum macsec_offload { + MACSEC_OFFLOAD_OFF = 0, + MACSEC_OFFLOAD_PHY = 1, + MACSEC_OFFLOAD_MAC = 2, + __MACSEC_OFFLOAD_END, + MACSEC_OFFLOAD_MAX = __MACSEC_OFFLOAD_END - 1, +}; + +/* IPVLAN section */ +enum { + IFLA_IPVLAN_UNSPEC, + IFLA_IPVLAN_MODE, + IFLA_IPVLAN_FLAGS, + __IFLA_IPVLAN_MAX +}; + +#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1) + +enum ipvlan_mode { + IPVLAN_MODE_L2 = 0, + IPVLAN_MODE_L3, + IPVLAN_MODE_L3S, + IPVLAN_MODE_MAX +}; + +#define IPVLAN_F_PRIVATE 0x01 +#define IPVLAN_F_VEPA 0x02 + +/* VXLAN section */ +enum { + IFLA_VXLAN_UNSPEC, + IFLA_VXLAN_ID, + IFLA_VXLAN_GROUP, /* group or remote address */ + IFLA_VXLAN_LINK, + IFLA_VXLAN_LOCAL, + IFLA_VXLAN_TTL, + IFLA_VXLAN_TOS, + IFLA_VXLAN_LEARNING, + IFLA_VXLAN_AGEING, + IFLA_VXLAN_LIMIT, + IFLA_VXLAN_PORT_RANGE, /* source port */ + IFLA_VXLAN_PROXY, + IFLA_VXLAN_RSC, + IFLA_VXLAN_L2MISS, + IFLA_VXLAN_L3MISS, + IFLA_VXLAN_PORT, /* destination port */ + IFLA_VXLAN_GROUP6, + IFLA_VXLAN_LOCAL6, + IFLA_VXLAN_UDP_CSUM, + IFLA_VXLAN_UDP_ZERO_CSUM6_TX, + IFLA_VXLAN_UDP_ZERO_CSUM6_RX, + IFLA_VXLAN_REMCSUM_TX, + IFLA_VXLAN_REMCSUM_RX, + IFLA_VXLAN_GBP, + IFLA_VXLAN_REMCSUM_NOPARTIAL, + IFLA_VXLAN_COLLECT_METADATA, + IFLA_VXLAN_LABEL, + IFLA_VXLAN_GPE, + IFLA_VXLAN_TTL_INHERIT, + IFLA_VXLAN_DF, + __IFLA_VXLAN_MAX +}; +#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) + +struct ifla_vxlan_port_range { + __be16 low; + __be16 high; +}; + +enum ifla_vxlan_df { + VXLAN_DF_UNSET = 0, + VXLAN_DF_SET, + VXLAN_DF_INHERIT, + __VXLAN_DF_END, + VXLAN_DF_MAX = __VXLAN_DF_END - 1, +}; + +/* GENEVE section */ +enum { + IFLA_GENEVE_UNSPEC, + IFLA_GENEVE_ID, + IFLA_GENEVE_REMOTE, + IFLA_GENEVE_TTL, + IFLA_GENEVE_TOS, + IFLA_GENEVE_PORT, /* destination port */ + IFLA_GENEVE_COLLECT_METADATA, + IFLA_GENEVE_REMOTE6, + IFLA_GENEVE_UDP_CSUM, + IFLA_GENEVE_UDP_ZERO_CSUM6_TX, + IFLA_GENEVE_UDP_ZERO_CSUM6_RX, + IFLA_GENEVE_LABEL, + IFLA_GENEVE_TTL_INHERIT, + IFLA_GENEVE_DF, + __IFLA_GENEVE_MAX +}; +#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) + +enum ifla_geneve_df { + GENEVE_DF_UNSET = 0, + GENEVE_DF_SET, + GENEVE_DF_INHERIT, + __GENEVE_DF_END, + GENEVE_DF_MAX = __GENEVE_DF_END - 1, +}; + +/* Bareudp section */ +enum { + IFLA_BAREUDP_UNSPEC, + IFLA_BAREUDP_PORT, + IFLA_BAREUDP_ETHERTYPE, + IFLA_BAREUDP_SRCPORT_MIN, + IFLA_BAREUDP_MULTIPROTO_MODE, + __IFLA_BAREUDP_MAX +}; + +#define IFLA_BAREUDP_MAX (__IFLA_BAREUDP_MAX - 1) + +/* PPP section */ +enum { + IFLA_PPP_UNSPEC, + IFLA_PPP_DEV_FD, + __IFLA_PPP_MAX +}; +#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1) + +/* GTP section */ + +enum ifla_gtp_role { + GTP_ROLE_GGSN = 0, + GTP_ROLE_SGSN, +}; + +enum { + IFLA_GTP_UNSPEC, + IFLA_GTP_FD0, + IFLA_GTP_FD1, + IFLA_GTP_PDP_HASHSIZE, + IFLA_GTP_ROLE, + __IFLA_GTP_MAX, +}; +#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1) + +/* Bonding section */ + +enum { + IFLA_BOND_UNSPEC, + IFLA_BOND_MODE, + IFLA_BOND_ACTIVE_SLAVE, + IFLA_BOND_MIIMON, + IFLA_BOND_UPDELAY, + IFLA_BOND_DOWNDELAY, + IFLA_BOND_USE_CARRIER, + IFLA_BOND_ARP_INTERVAL, + IFLA_BOND_ARP_IP_TARGET, + IFLA_BOND_ARP_VALIDATE, + IFLA_BOND_ARP_ALL_TARGETS, + IFLA_BOND_PRIMARY, + IFLA_BOND_PRIMARY_RESELECT, + IFLA_BOND_FAIL_OVER_MAC, + IFLA_BOND_XMIT_HASH_POLICY, + IFLA_BOND_RESEND_IGMP, + IFLA_BOND_NUM_PEER_NOTIF, + IFLA_BOND_ALL_SLAVES_ACTIVE, + IFLA_BOND_MIN_LINKS, + IFLA_BOND_LP_INTERVAL, + IFLA_BOND_PACKETS_PER_SLAVE, + IFLA_BOND_AD_LACP_RATE, + IFLA_BOND_AD_SELECT, + IFLA_BOND_AD_INFO, + IFLA_BOND_AD_ACTOR_SYS_PRIO, + IFLA_BOND_AD_USER_PORT_KEY, + IFLA_BOND_AD_ACTOR_SYSTEM, + IFLA_BOND_TLB_DYNAMIC_LB, + IFLA_BOND_PEER_NOTIF_DELAY, + IFLA_BOND_AD_LACP_ACTIVE, + IFLA_BOND_MISSED_MAX, + IFLA_BOND_NS_IP6_TARGET, + __IFLA_BOND_MAX, +}; + +#define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1) + +enum { + IFLA_BOND_AD_INFO_UNSPEC, + IFLA_BOND_AD_INFO_AGGREGATOR, + IFLA_BOND_AD_INFO_NUM_PORTS, + IFLA_BOND_AD_INFO_ACTOR_KEY, + IFLA_BOND_AD_INFO_PARTNER_KEY, + IFLA_BOND_AD_INFO_PARTNER_MAC, + __IFLA_BOND_AD_INFO_MAX, +}; + +#define IFLA_BOND_AD_INFO_MAX (__IFLA_BOND_AD_INFO_MAX - 1) + +enum { + IFLA_BOND_SLAVE_UNSPEC, + IFLA_BOND_SLAVE_STATE, + IFLA_BOND_SLAVE_MII_STATUS, + IFLA_BOND_SLAVE_LINK_FAILURE_COUNT, + IFLA_BOND_SLAVE_PERM_HWADDR, + IFLA_BOND_SLAVE_QUEUE_ID, + IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, + IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, + IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, + IFLA_BOND_SLAVE_PRIO, + __IFLA_BOND_SLAVE_MAX, +}; + +#define IFLA_BOND_SLAVE_MAX (__IFLA_BOND_SLAVE_MAX - 1) + +/* SR-IOV virtual function management section */ + +enum { + IFLA_VF_INFO_UNSPEC, + IFLA_VF_INFO, + __IFLA_VF_INFO_MAX, +}; + +#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1) + +enum { + IFLA_VF_UNSPEC, + IFLA_VF_MAC, /* Hardware queue specific attributes */ + IFLA_VF_VLAN, /* VLAN ID and QoS */ + IFLA_VF_TX_RATE, /* Max TX Bandwidth Allocation */ + IFLA_VF_SPOOFCHK, /* Spoof Checking on/off switch */ + IFLA_VF_LINK_STATE, /* link state enable/disable/auto switch */ + IFLA_VF_RATE, /* Min and Max TX Bandwidth Allocation */ + IFLA_VF_RSS_QUERY_EN, /* RSS Redirection Table and Hash Key query + * on/off switch + */ + IFLA_VF_STATS, /* network device statistics */ + IFLA_VF_TRUST, /* Trust VF */ + IFLA_VF_IB_NODE_GUID, /* VF Infiniband node GUID */ + IFLA_VF_IB_PORT_GUID, /* VF Infiniband port GUID */ + IFLA_VF_VLAN_LIST, /* nested list of vlans, option for QinQ */ + IFLA_VF_BROADCAST, /* VF broadcast */ + __IFLA_VF_MAX, +}; + +#define IFLA_VF_MAX (__IFLA_VF_MAX - 1) + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; /* MAX_ADDR_LEN */ +}; + +struct ifla_vf_broadcast { + __u8 broadcast[32]; +}; + +struct ifla_vf_vlan { + __u32 vf; + __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ + __u32 qos; +}; + +enum { + IFLA_VF_VLAN_INFO_UNSPEC, + IFLA_VF_VLAN_INFO, /* VLAN ID, QoS and VLAN protocol */ + __IFLA_VF_VLAN_INFO_MAX, +}; + +#define IFLA_VF_VLAN_INFO_MAX (__IFLA_VF_VLAN_INFO_MAX - 1) +#define MAX_VLAN_LIST_LEN 1 + +struct ifla_vf_vlan_info { + __u32 vf; + __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ + __u32 qos; + __be16 vlan_proto; /* VLAN protocol either 802.1Q or 802.1ad */ +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ +}; + +struct ifla_vf_rate { + __u32 vf; + __u32 min_tx_rate; /* Min Bandwidth in Mbps */ + __u32 max_tx_rate; /* Max Bandwidth in Mbps */ +}; + +struct ifla_vf_spoofchk { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_guid { + __u32 vf; + __u64 guid; +}; + +enum { + IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ + IFLA_VF_LINK_STATE_ENABLE, /* link always up */ + IFLA_VF_LINK_STATE_DISABLE, /* link always down */ + __IFLA_VF_LINK_STATE_MAX, +}; + +struct ifla_vf_link_state { + __u32 vf; + __u32 link_state; +}; + +struct ifla_vf_rss_query_en { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_STATS_RX_PACKETS, + IFLA_VF_STATS_TX_PACKETS, + IFLA_VF_STATS_RX_BYTES, + IFLA_VF_STATS_TX_BYTES, + IFLA_VF_STATS_BROADCAST, + IFLA_VF_STATS_MULTICAST, + IFLA_VF_STATS_PAD, + IFLA_VF_STATS_RX_DROPPED, + IFLA_VF_STATS_TX_DROPPED, + __IFLA_VF_STATS_MAX, +}; + +#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1) + +struct ifla_vf_trust { + __u32 vf; + __u32 setting; +}; + +/* VF ports management section + * + * Nested layout of set/get msg is: + * + * [IFLA_NUM_VF] + * [IFLA_VF_PORTS] + * [IFLA_VF_PORT] + * [IFLA_PORT_*], ... + * [IFLA_VF_PORT] + * [IFLA_PORT_*], ... + * ... + * [IFLA_PORT_SELF] + * [IFLA_PORT_*], ... + */ + +enum { + IFLA_VF_PORT_UNSPEC, + IFLA_VF_PORT, /* nest */ + __IFLA_VF_PORT_MAX, +}; + +#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1) + +enum { + IFLA_PORT_UNSPEC, + IFLA_PORT_VF, /* __u32 */ + IFLA_PORT_PROFILE, /* string */ + IFLA_PORT_VSI_TYPE, /* 802.1Qbg (pre-)standard VDP */ + IFLA_PORT_INSTANCE_UUID, /* binary UUID */ + IFLA_PORT_HOST_UUID, /* binary UUID */ + IFLA_PORT_REQUEST, /* __u8 */ + IFLA_PORT_RESPONSE, /* __u16, output only */ + __IFLA_PORT_MAX, +}; + +#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1) + +#define PORT_PROFILE_MAX 40 +#define PORT_UUID_MAX 16 +#define PORT_SELF_VF -1 + +enum { + PORT_REQUEST_PREASSOCIATE = 0, + PORT_REQUEST_PREASSOCIATE_RR, + PORT_REQUEST_ASSOCIATE, + PORT_REQUEST_DISASSOCIATE, +}; + +enum { + PORT_VDP_RESPONSE_SUCCESS = 0, + PORT_VDP_RESPONSE_INVALID_FORMAT, + PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES, + PORT_VDP_RESPONSE_UNUSED_VTID, + PORT_VDP_RESPONSE_VTID_VIOLATION, + PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION, + PORT_VDP_RESPONSE_OUT_OF_SYNC, + /* 0x08-0xFF reserved for future VDP use */ + PORT_PROFILE_RESPONSE_SUCCESS = 0x100, + PORT_PROFILE_RESPONSE_INPROGRESS, + PORT_PROFILE_RESPONSE_INVALID, + PORT_PROFILE_RESPONSE_BADSTATE, + PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES, + PORT_PROFILE_RESPONSE_ERROR, +}; + +struct ifla_port_vsi { + __u8 vsi_mgr_id; + __u8 vsi_type_id[3]; + __u8 vsi_type_version; + __u8 pad[3]; +}; + + +/* IPoIB section */ + +enum { + IFLA_IPOIB_UNSPEC, + IFLA_IPOIB_PKEY, + IFLA_IPOIB_MODE, + IFLA_IPOIB_UMCAST, + __IFLA_IPOIB_MAX +}; + +enum { + IPOIB_MODE_DATAGRAM = 0, /* using unreliable datagram QPs */ + IPOIB_MODE_CONNECTED = 1, /* using connected QPs */ +}; + +#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1) + + +/* HSR/PRP section, both uses same interface */ + +/* Different redundancy protocols for hsr device */ +enum { + HSR_PROTOCOL_HSR, + HSR_PROTOCOL_PRP, + HSR_PROTOCOL_MAX, +}; + +enum { + IFLA_HSR_UNSPEC, + IFLA_HSR_SLAVE1, + IFLA_HSR_SLAVE2, + IFLA_HSR_MULTICAST_SPEC, /* Last byte of supervision addr */ + IFLA_HSR_SUPERVISION_ADDR, /* Supervision frame multicast addr */ + IFLA_HSR_SEQ_NR, + IFLA_HSR_VERSION, /* HSR version */ + IFLA_HSR_PROTOCOL, /* Indicate different protocol than + * HSR. For example PRP. + */ + __IFLA_HSR_MAX, +}; + +#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1) + +/* STATS section */ + +struct if_stats_msg { + __u8 family; + __u8 pad1; + __u16 pad2; + __u32 ifindex; + __u32 filter_mask; +}; + +/* A stats attribute can be netdev specific or a global stat. + * For netdev stats, lets use the prefix IFLA_STATS_LINK_* + */ +enum { + IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */ + IFLA_STATS_LINK_64, + IFLA_STATS_LINK_XSTATS, + IFLA_STATS_LINK_XSTATS_SLAVE, + IFLA_STATS_LINK_OFFLOAD_XSTATS, + IFLA_STATS_AF_SPEC, + __IFLA_STATS_MAX, +}; + +#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1) + +#define IFLA_STATS_FILTER_BIT(ATTR) (1 << (ATTR - 1)) + +/* These are embedded into IFLA_STATS_LINK_XSTATS: + * [IFLA_STATS_LINK_XSTATS] + * -> [LINK_XSTATS_TYPE_xxx] + * -> [rtnl link type specific attributes] + */ +enum { + LINK_XSTATS_TYPE_UNSPEC, + LINK_XSTATS_TYPE_BRIDGE, + LINK_XSTATS_TYPE_BOND, + __LINK_XSTATS_TYPE_MAX +}; +#define LINK_XSTATS_TYPE_MAX (__LINK_XSTATS_TYPE_MAX - 1) + +/* These are stats embedded into IFLA_STATS_LINK_OFFLOAD_XSTATS */ +enum { + IFLA_OFFLOAD_XSTATS_UNSPEC, + IFLA_OFFLOAD_XSTATS_CPU_HIT, /* struct rtnl_link_stats64 */ + __IFLA_OFFLOAD_XSTATS_MAX +}; +#define IFLA_OFFLOAD_XSTATS_MAX (__IFLA_OFFLOAD_XSTATS_MAX - 1) + +/* XDP section */ + +#define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) +#define XDP_FLAGS_SKB_MODE (1U << 1) +#define XDP_FLAGS_DRV_MODE (1U << 2) +#define XDP_FLAGS_HW_MODE (1U << 3) +#define XDP_FLAGS_REPLACE (1U << 4) +#define XDP_FLAGS_MODES (XDP_FLAGS_SKB_MODE | \ + XDP_FLAGS_DRV_MODE | \ + XDP_FLAGS_HW_MODE) +#define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST | \ + XDP_FLAGS_MODES | XDP_FLAGS_REPLACE) + +/* These are stored into IFLA_XDP_ATTACHED on dump. */ +enum { + XDP_ATTACHED_NONE = 0, + XDP_ATTACHED_DRV, + XDP_ATTACHED_SKB, + XDP_ATTACHED_HW, + XDP_ATTACHED_MULTI, +}; + +enum { + IFLA_XDP_UNSPEC, + IFLA_XDP_FD, + IFLA_XDP_ATTACHED, + IFLA_XDP_FLAGS, + IFLA_XDP_PROG_ID, + IFLA_XDP_DRV_PROG_ID, + IFLA_XDP_SKB_PROG_ID, + IFLA_XDP_HW_PROG_ID, + IFLA_XDP_EXPECTED_FD, + __IFLA_XDP_MAX, +}; + +#define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1) + +enum { + IFLA_EVENT_NONE, + IFLA_EVENT_REBOOT, /* internal reset / reboot */ + IFLA_EVENT_FEATURES, /* change in offload features */ + IFLA_EVENT_BONDING_FAILOVER, /* change in active slave */ + IFLA_EVENT_NOTIFY_PEERS, /* re-sent grat. arp/ndisc */ + IFLA_EVENT_IGMP_RESEND, /* re-sent IGMP JOIN */ + IFLA_EVENT_BONDING_OPTIONS, /* change in bonding options */ +}; + +/* tun section */ + +enum { + IFLA_TUN_UNSPEC, + IFLA_TUN_OWNER, + IFLA_TUN_GROUP, + IFLA_TUN_TYPE, + IFLA_TUN_PI, + IFLA_TUN_VNET_HDR, + IFLA_TUN_PERSIST, + IFLA_TUN_MULTI_QUEUE, + IFLA_TUN_NUM_QUEUES, + IFLA_TUN_NUM_DISABLED_QUEUES, + __IFLA_TUN_MAX, +}; + +#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1) + +/* rmnet section */ + +#define RMNET_FLAGS_INGRESS_DEAGGREGATION (1U << 0) +#define RMNET_FLAGS_INGRESS_MAP_COMMANDS (1U << 1) +#define RMNET_FLAGS_INGRESS_MAP_CKSUMV4 (1U << 2) +#define RMNET_FLAGS_EGRESS_MAP_CKSUMV4 (1U << 3) +#define RMNET_FLAGS_INGRESS_MAP_CKSUMV5 (1U << 4) +#define RMNET_FLAGS_EGRESS_MAP_CKSUMV5 (1U << 5) + +enum { + IFLA_RMNET_UNSPEC, + IFLA_RMNET_MUX_ID, + IFLA_RMNET_FLAGS, + __IFLA_RMNET_MAX, +}; + +#define IFLA_RMNET_MAX (__IFLA_RMNET_MAX - 1) + +struct ifla_rmnet_flags { + __u32 flags; + __u32 mask; +}; + +/* MCTP section */ + +enum { + IFLA_MCTP_UNSPEC, + IFLA_MCTP_NET, + __IFLA_MCTP_MAX, +}; + +#define IFLA_MCTP_MAX (__IFLA_MCTP_MAX - 1) + +#endif /* _UAPI_LINUX_IF_LINK_H */ diff --git a/bpftool/libbpf/include/uapi/linux/if_xdp.h b/bpftool/libbpf/include/uapi/linux/if_xdp.h new file mode 100644 index 0000000..a78a809 --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/if_xdp.h @@ -0,0 +1,111 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * if_xdp: XDP socket user-space interface + * Copyright(c) 2018 Intel Corporation. + * + * Author(s): Björn Töpel + * Magnus Karlsson + */ + +#ifndef _LINUX_IF_XDP_H +#define _LINUX_IF_XDP_H + +#include + +/* Options for the sxdp_flags field */ +#define XDP_SHARED_UMEM (1 << 0) +#define XDP_COPY (1 << 1) /* Force copy-mode */ +#define XDP_ZEROCOPY (1 << 2) /* Force zero-copy mode */ +/* If this option is set, the driver might go sleep and in that case + * the XDP_RING_NEED_WAKEUP flag in the fill and/or Tx rings will be + * set. If it is set, the application need to explicitly wake up the + * driver with a poll() (Rx and Tx) or sendto() (Tx only). If you are + * running the driver and the application on the same core, you should + * use this option so that the kernel will yield to the user space + * application. + */ +#define XDP_USE_NEED_WAKEUP (1 << 3) + +/* Flags for xsk_umem_config flags */ +#define XDP_UMEM_UNALIGNED_CHUNK_FLAG (1 << 0) + +struct sockaddr_xdp { + __u16 sxdp_family; + __u16 sxdp_flags; + __u32 sxdp_ifindex; + __u32 sxdp_queue_id; + __u32 sxdp_shared_umem_fd; +}; + +/* XDP_RING flags */ +#define XDP_RING_NEED_WAKEUP (1 << 0) + +struct xdp_ring_offset { + __u64 producer; + __u64 consumer; + __u64 desc; + __u64 flags; +}; + +struct xdp_mmap_offsets { + struct xdp_ring_offset rx; + struct xdp_ring_offset tx; + struct xdp_ring_offset fr; /* Fill */ + struct xdp_ring_offset cr; /* Completion */ +}; + +/* XDP socket options */ +#define XDP_MMAP_OFFSETS 1 +#define XDP_RX_RING 2 +#define XDP_TX_RING 3 +#define XDP_UMEM_REG 4 +#define XDP_UMEM_FILL_RING 5 +#define XDP_UMEM_COMPLETION_RING 6 +#define XDP_STATISTICS 7 +#define XDP_OPTIONS 8 + +struct xdp_umem_reg { + __u64 addr; /* Start of packet data area */ + __u64 len; /* Length of packet data area */ + __u32 chunk_size; + __u32 headroom; + __u32 flags; +}; + +struct xdp_statistics { + __u64 rx_dropped; /* Dropped for other reasons */ + __u64 rx_invalid_descs; /* Dropped due to invalid descriptor */ + __u64 tx_invalid_descs; /* Dropped due to invalid descriptor */ + __u64 rx_ring_full; /* Dropped due to rx ring being full */ + __u64 rx_fill_ring_empty_descs; /* Failed to retrieve item from fill ring */ + __u64 tx_ring_empty_descs; /* Failed to retrieve item from tx ring */ +}; + +struct xdp_options { + __u32 flags; +}; + +/* Flags for the flags field of struct xdp_options */ +#define XDP_OPTIONS_ZEROCOPY (1 << 0) + +/* Pgoff for mmaping the rings */ +#define XDP_PGOFF_RX_RING 0 +#define XDP_PGOFF_TX_RING 0x80000000 +#define XDP_UMEM_PGOFF_FILL_RING 0x100000000ULL +#define XDP_UMEM_PGOFF_COMPLETION_RING 0x180000000ULL + +/* Masks for unaligned chunks mode */ +#define XSK_UNALIGNED_BUF_OFFSET_SHIFT 48 +#define XSK_UNALIGNED_BUF_ADDR_MASK \ + ((1ULL << XSK_UNALIGNED_BUF_OFFSET_SHIFT) - 1) + +/* Rx/Tx descriptor */ +struct xdp_desc { + __u64 addr; + __u32 len; + __u32 options; +}; + +/* UMEM descriptor is __u64 */ + +#endif /* _LINUX_IF_XDP_H */ diff --git a/bpftool/libbpf/include/uapi/linux/netdev.h b/bpftool/libbpf/include/uapi/linux/netdev.h new file mode 100644 index 0000000..9ee4598 --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/netdev.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/netdev.yaml */ +/* YNL-GEN uapi header */ + +#ifndef _UAPI_LINUX_NETDEV_H +#define _UAPI_LINUX_NETDEV_H + +#define NETDEV_FAMILY_NAME "netdev" +#define NETDEV_FAMILY_VERSION 1 + +/** + * enum netdev_xdp_act + * @NETDEV_XDP_ACT_BASIC: XDP feautues set supported by all drivers + * (XDP_ABORTED, XDP_DROP, XDP_PASS, XDP_TX) + * @NETDEV_XDP_ACT_REDIRECT: The netdev supports XDP_REDIRECT + * @NETDEV_XDP_ACT_NDO_XMIT: This feature informs if netdev implements + * ndo_xdp_xmit callback. + * @NETDEV_XDP_ACT_XSK_ZEROCOPY: This feature informs if netdev supports AF_XDP + * in zero copy mode. + * @NETDEV_XDP_ACT_HW_OFFLOAD: This feature informs if netdev supports XDP hw + * oflloading. + * @NETDEV_XDP_ACT_RX_SG: This feature informs if netdev implements non-linear + * XDP buffer support in the driver napi callback. + * @NETDEV_XDP_ACT_NDO_XMIT_SG: This feature informs if netdev implements + * non-linear XDP buffer support in ndo_xdp_xmit callback. + */ +enum netdev_xdp_act { + NETDEV_XDP_ACT_BASIC = 1, + NETDEV_XDP_ACT_REDIRECT = 2, + NETDEV_XDP_ACT_NDO_XMIT = 4, + NETDEV_XDP_ACT_XSK_ZEROCOPY = 8, + NETDEV_XDP_ACT_HW_OFFLOAD = 16, + NETDEV_XDP_ACT_RX_SG = 32, + NETDEV_XDP_ACT_NDO_XMIT_SG = 64, +}; + +enum { + NETDEV_A_DEV_IFINDEX = 1, + NETDEV_A_DEV_PAD, + NETDEV_A_DEV_XDP_FEATURES, + + __NETDEV_A_DEV_MAX, + NETDEV_A_DEV_MAX = (__NETDEV_A_DEV_MAX - 1) +}; + +enum { + NETDEV_CMD_DEV_GET = 1, + NETDEV_CMD_DEV_ADD_NTF, + NETDEV_CMD_DEV_DEL_NTF, + NETDEV_CMD_DEV_CHANGE_NTF, + + __NETDEV_CMD_MAX, + NETDEV_CMD_MAX = (__NETDEV_CMD_MAX - 1) +}; + +#define NETDEV_MCGRP_MGMT "mgmt" + +#endif /* _UAPI_LINUX_NETDEV_H */ diff --git a/bpftool/libbpf/include/uapi/linux/netlink.h b/bpftool/libbpf/include/uapi/linux/netlink.h new file mode 100644 index 0000000..0a4d733 --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/netlink.h @@ -0,0 +1,252 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__LINUX_NETLINK_H +#define _UAPI__LINUX_NETLINK_H + +#include +#include /* for __kernel_sa_family_t */ +#include + +#define NETLINK_ROUTE 0 /* Routing/device hook */ +#define NETLINK_UNUSED 1 /* Unused number */ +#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ +#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */ +#define NETLINK_SOCK_DIAG 4 /* socket monitoring */ +#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ +#define NETLINK_XFRM 6 /* ipsec */ +#define NETLINK_SELINUX 7 /* SELinux event notifications */ +#define NETLINK_ISCSI 8 /* Open-iSCSI */ +#define NETLINK_AUDIT 9 /* auditing */ +#define NETLINK_FIB_LOOKUP 10 +#define NETLINK_CONNECTOR 11 +#define NETLINK_NETFILTER 12 /* netfilter subsystem */ +#define NETLINK_IP6_FW 13 +#define NETLINK_DNRTMSG 14 /* DECnet routing messages */ +#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ +#define NETLINK_GENERIC 16 +/* leave room for NETLINK_DM (DM Events) */ +#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */ +#define NETLINK_ECRYPTFS 19 +#define NETLINK_RDMA 20 +#define NETLINK_CRYPTO 21 /* Crypto layer */ +#define NETLINK_SMC 22 /* SMC monitoring */ + +#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG + +#define MAX_LINKS 32 + +struct sockaddr_nl { + __kernel_sa_family_t nl_family; /* AF_NETLINK */ + unsigned short nl_pad; /* zero */ + __u32 nl_pid; /* port ID */ + __u32 nl_groups; /* multicast groups mask */ +}; + +struct nlmsghdr { + __u32 nlmsg_len; /* Length of message including header */ + __u16 nlmsg_type; /* Message content */ + __u16 nlmsg_flags; /* Additional flags */ + __u32 nlmsg_seq; /* Sequence number */ + __u32 nlmsg_pid; /* Sending process port ID */ +}; + +/* Flags values */ + +#define NLM_F_REQUEST 0x01 /* It is request message. */ +#define NLM_F_MULTI 0x02 /* Multipart message, terminated by NLMSG_DONE */ +#define NLM_F_ACK 0x04 /* Reply with ack, with zero or error code */ +#define NLM_F_ECHO 0x08 /* Echo this request */ +#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to sequence change */ +#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ + +/* Modifiers to GET request */ +#define NLM_F_ROOT 0x100 /* specify tree root */ +#define NLM_F_MATCH 0x200 /* return all matching */ +#define NLM_F_ATOMIC 0x400 /* atomic GET */ +#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) + +/* Modifiers to NEW request */ +#define NLM_F_REPLACE 0x100 /* Override existing */ +#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */ +#define NLM_F_CREATE 0x400 /* Create, if it does not exist */ +#define NLM_F_APPEND 0x800 /* Add to end of list */ + +/* Modifiers to DELETE request */ +#define NLM_F_NONREC 0x100 /* Do not delete recursively */ + +/* Flags for ACK message */ +#define NLM_F_CAPPED 0x100 /* request was capped */ +#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ + +/* + 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL + 4.4BSD CHANGE NLM_F_REPLACE + + True CHANGE NLM_F_CREATE|NLM_F_REPLACE + Append NLM_F_CREATE + Check NLM_F_EXCL + */ + +#define NLMSG_ALIGNTO 4U +#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) +#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) +#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN) +#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) +#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) +#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ + (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) +#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ + (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ + (nlh)->nlmsg_len <= (len)) +#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) + +#define NLMSG_NOOP 0x1 /* Nothing. */ +#define NLMSG_ERROR 0x2 /* Error */ +#define NLMSG_DONE 0x3 /* End of a dump */ +#define NLMSG_OVERRUN 0x4 /* Data lost */ + +#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ + +struct nlmsgerr { + int error; + struct nlmsghdr msg; + /* + * followed by the message contents unless NETLINK_CAP_ACK was set + * or the ACK indicates success (error == 0) + * message length is aligned with NLMSG_ALIGN() + */ + /* + * followed by TLVs defined in enum nlmsgerr_attrs + * if NETLINK_EXT_ACK was set + */ +}; + +/** + * enum nlmsgerr_attrs - nlmsgerr attributes + * @NLMSGERR_ATTR_UNUSED: unused + * @NLMSGERR_ATTR_MSG: error message string (string) + * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original + * message, counting from the beginning of the header (u32) + * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to + * be used - in the success case - to identify a created + * object or operation or similar (binary) + * @__NLMSGERR_ATTR_MAX: number of attributes + * @NLMSGERR_ATTR_MAX: highest attribute number + */ +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED, + NLMSGERR_ATTR_MSG, + NLMSGERR_ATTR_OFFS, + NLMSGERR_ATTR_COOKIE, + + __NLMSGERR_ATTR_MAX, + NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1 +}; + +#define NETLINK_ADD_MEMBERSHIP 1 +#define NETLINK_DROP_MEMBERSHIP 2 +#define NETLINK_PKTINFO 3 +#define NETLINK_BROADCAST_ERROR 4 +#define NETLINK_NO_ENOBUFS 5 +#ifndef __KERNEL__ +#define NETLINK_RX_RING 6 +#define NETLINK_TX_RING 7 +#endif +#define NETLINK_LISTEN_ALL_NSID 8 +#define NETLINK_LIST_MEMBERSHIPS 9 +#define NETLINK_CAP_ACK 10 +#define NETLINK_EXT_ACK 11 +#define NETLINK_GET_STRICT_CHK 12 + +struct nl_pktinfo { + __u32 group; +}; + +struct nl_mmap_req { + unsigned int nm_block_size; + unsigned int nm_block_nr; + unsigned int nm_frame_size; + unsigned int nm_frame_nr; +}; + +struct nl_mmap_hdr { + unsigned int nm_status; + unsigned int nm_len; + __u32 nm_group; + /* credentials */ + __u32 nm_pid; + __u32 nm_uid; + __u32 nm_gid; +}; + +#ifndef __KERNEL__ +enum nl_mmap_status { + NL_MMAP_STATUS_UNUSED, + NL_MMAP_STATUS_RESERVED, + NL_MMAP_STATUS_VALID, + NL_MMAP_STATUS_COPY, + NL_MMAP_STATUS_SKIP, +}; + +#define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO +#define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) +#define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) +#endif + +#define NET_MAJOR 36 /* Major 36 is reserved for networking */ + +enum { + NETLINK_UNCONNECTED = 0, + NETLINK_CONNECTED, +}; + +/* + * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> + * +---------------------+- - -+- - - - - - - - - -+- - -+ + * | Header | Pad | Payload | Pad | + * | (struct nlattr) | ing | | ing | + * +---------------------+- - -+- - - - - - - - - -+- - -+ + * <-------------- nlattr->nla_len --------------> + */ + +struct nlattr { + __u16 nla_len; + __u16 nla_type; +}; + +/* + * nla_type (16 bits) + * +---+---+-------------------------------+ + * | N | O | Attribute Type | + * +---+---+-------------------------------+ + * N := Carries nested attributes + * O := Payload stored in network byte order + * + * Note: The N and O flag are mutually exclusive. + */ +#define NLA_F_NESTED (1 << 15) +#define NLA_F_NET_BYTEORDER (1 << 14) +#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) + +#define NLA_ALIGNTO 4 +#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) +#define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) + +/* Generic 32 bitflags attribute content sent to the kernel. + * + * The value is a bitmap that defines the values being set + * The selector is a bitmask that defines which value is legit + * + * Examples: + * value = 0x0, and selector = 0x1 + * implies we are selecting bit 1 and we want to set its value to 0. + * + * value = 0x2, and selector = 0x2 + * implies we are selecting bit 2 and we want to set its value to 1. + * + */ +struct nla_bitfield32 { + __u32 value; + __u32 selector; +}; + +#endif /* _UAPI__LINUX_NETLINK_H */ diff --git a/bpftool/libbpf/include/uapi/linux/openat2.h b/bpftool/libbpf/include/uapi/linux/openat2.h new file mode 100644 index 0000000..a5feb76 --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/openat2.h @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_OPENAT2_H +#define _UAPI_LINUX_OPENAT2_H + +#include + +/* + * Arguments for how openat2(2) should open the target path. If only @flags and + * @mode are non-zero, then openat2(2) operates very similarly to openat(2). + * + * However, unlike openat(2), unknown or invalid bits in @flags result in + * -EINVAL rather than being silently ignored. @mode must be zero unless one of + * {O_CREAT, O_TMPFILE} are set. + * + * @flags: O_* flags. + * @mode: O_CREAT/O_TMPFILE file mode. + * @resolve: RESOLVE_* flags. + */ +struct open_how { + __u64 flags; + __u64 mode; + __u64 resolve; +}; + +/* how->resolve flags for openat2(2). */ +#define RESOLVE_NO_XDEV 0x01 /* Block mount-point crossings + (includes bind-mounts). */ +#define RESOLVE_NO_MAGICLINKS 0x02 /* Block traversal through procfs-style + "magic-links". */ +#define RESOLVE_NO_SYMLINKS 0x04 /* Block traversal through all symlinks + (implies OEXT_NO_MAGICLINKS) */ +#define RESOLVE_BENEATH 0x08 /* Block "lexical" trickery like + "..", symlinks, and absolute + paths which escape the dirfd. */ +#define RESOLVE_IN_ROOT 0x10 /* Make all jumps to "/" and ".." + be scoped inside the dirfd + (similar to chroot(2)). */ +#define RESOLVE_CACHED 0x20 /* Only complete if resolution can be + completed through cached lookup. May + return -EAGAIN if that's not + possible. */ + +#endif /* _UAPI_LINUX_OPENAT2_H */ diff --git a/bpftool/libbpf/include/uapi/linux/perf_event.h b/bpftool/libbpf/include/uapi/linux/perf_event.h new file mode 100644 index 0000000..ccb7f5d --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/perf_event.h @@ -0,0 +1,1445 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Performance events: + * + * Copyright (C) 2008-2009, Thomas Gleixner + * Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar + * Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra + * + * Data type definitions, declarations, prototypes. + * + * Started by: Thomas Gleixner and Ingo Molnar + * + * For licencing details see kernel-base/COPYING + */ +#ifndef _UAPI_LINUX_PERF_EVENT_H +#define _UAPI_LINUX_PERF_EVENT_H + +#include +#include +#include + +/* + * User-space ABI bits: + */ + +/* + * attr.type + */ +enum perf_type_id { + PERF_TYPE_HARDWARE = 0, + PERF_TYPE_SOFTWARE = 1, + PERF_TYPE_TRACEPOINT = 2, + PERF_TYPE_HW_CACHE = 3, + PERF_TYPE_RAW = 4, + PERF_TYPE_BREAKPOINT = 5, + + PERF_TYPE_MAX, /* non-ABI */ +}; + +/* + * attr.config layout for type PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE + * PERF_TYPE_HARDWARE: 0xEEEEEEEE000000AA + * AA: hardware event ID + * EEEEEEEE: PMU type ID + * PERF_TYPE_HW_CACHE: 0xEEEEEEEE00DDCCBB + * BB: hardware cache ID + * CC: hardware cache op ID + * DD: hardware cache op result ID + * EEEEEEEE: PMU type ID + * If the PMU type ID is 0, the PERF_TYPE_RAW will be applied. + */ +#define PERF_PMU_TYPE_SHIFT 32 +#define PERF_HW_EVENT_MASK 0xffffffff + +/* + * Generalized performance event event_id types, used by the + * attr.event_id parameter of the sys_perf_event_open() + * syscall: + */ +enum perf_hw_id { + /* + * Common hardware events, generalized by the kernel: + */ + PERF_COUNT_HW_CPU_CYCLES = 0, + PERF_COUNT_HW_INSTRUCTIONS = 1, + PERF_COUNT_HW_CACHE_REFERENCES = 2, + PERF_COUNT_HW_CACHE_MISSES = 3, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, + PERF_COUNT_HW_BRANCH_MISSES = 5, + PERF_COUNT_HW_BUS_CYCLES = 6, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, + PERF_COUNT_HW_REF_CPU_CYCLES = 9, + + PERF_COUNT_HW_MAX, /* non-ABI */ +}; + +/* + * Generalized hardware cache events: + * + * { L1-D, L1-I, LLC, ITLB, DTLB, BPU, NODE } x + * { read, write, prefetch } x + * { accesses, misses } + */ +enum perf_hw_cache_id { + PERF_COUNT_HW_CACHE_L1D = 0, + PERF_COUNT_HW_CACHE_L1I = 1, + PERF_COUNT_HW_CACHE_LL = 2, + PERF_COUNT_HW_CACHE_DTLB = 3, + PERF_COUNT_HW_CACHE_ITLB = 4, + PERF_COUNT_HW_CACHE_BPU = 5, + PERF_COUNT_HW_CACHE_NODE = 6, + + PERF_COUNT_HW_CACHE_MAX, /* non-ABI */ +}; + +enum perf_hw_cache_op_id { + PERF_COUNT_HW_CACHE_OP_READ = 0, + PERF_COUNT_HW_CACHE_OP_WRITE = 1, + PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, + + PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */ +}; + +enum perf_hw_cache_op_result_id { + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, + PERF_COUNT_HW_CACHE_RESULT_MISS = 1, + + PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */ +}; + +/* + * Special "software" events provided by the kernel, even if the hardware + * does not support performance events. These events measure various + * physical and sw events of the kernel (and allow the profiling of them as + * well): + */ +enum perf_sw_ids { + PERF_COUNT_SW_CPU_CLOCK = 0, + PERF_COUNT_SW_TASK_CLOCK = 1, + PERF_COUNT_SW_PAGE_FAULTS = 2, + PERF_COUNT_SW_CONTEXT_SWITCHES = 3, + PERF_COUNT_SW_CPU_MIGRATIONS = 4, + PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, + PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, + PERF_COUNT_SW_EMULATION_FAULTS = 8, + PERF_COUNT_SW_DUMMY = 9, + PERF_COUNT_SW_BPF_OUTPUT = 10, + PERF_COUNT_SW_CGROUP_SWITCHES = 11, + + PERF_COUNT_SW_MAX, /* non-ABI */ +}; + +/* + * Bits that can be set in attr.sample_type to request information + * in the overflow packets. + */ +enum perf_event_sample_format { + PERF_SAMPLE_IP = 1U << 0, + PERF_SAMPLE_TID = 1U << 1, + PERF_SAMPLE_TIME = 1U << 2, + PERF_SAMPLE_ADDR = 1U << 3, + PERF_SAMPLE_READ = 1U << 4, + PERF_SAMPLE_CALLCHAIN = 1U << 5, + PERF_SAMPLE_ID = 1U << 6, + PERF_SAMPLE_CPU = 1U << 7, + PERF_SAMPLE_PERIOD = 1U << 8, + PERF_SAMPLE_STREAM_ID = 1U << 9, + PERF_SAMPLE_RAW = 1U << 10, + PERF_SAMPLE_BRANCH_STACK = 1U << 11, + PERF_SAMPLE_REGS_USER = 1U << 12, + PERF_SAMPLE_STACK_USER = 1U << 13, + PERF_SAMPLE_WEIGHT = 1U << 14, + PERF_SAMPLE_DATA_SRC = 1U << 15, + PERF_SAMPLE_IDENTIFIER = 1U << 16, + PERF_SAMPLE_TRANSACTION = 1U << 17, + PERF_SAMPLE_REGS_INTR = 1U << 18, + PERF_SAMPLE_PHYS_ADDR = 1U << 19, + PERF_SAMPLE_AUX = 1U << 20, + PERF_SAMPLE_CGROUP = 1U << 21, + PERF_SAMPLE_DATA_PAGE_SIZE = 1U << 22, + PERF_SAMPLE_CODE_PAGE_SIZE = 1U << 23, + PERF_SAMPLE_WEIGHT_STRUCT = 1U << 24, + + PERF_SAMPLE_MAX = 1U << 25, /* non-ABI */ +}; + +#define PERF_SAMPLE_WEIGHT_TYPE (PERF_SAMPLE_WEIGHT | PERF_SAMPLE_WEIGHT_STRUCT) +/* + * values to program into branch_sample_type when PERF_SAMPLE_BRANCH is set + * + * If the user does not pass priv level information via branch_sample_type, + * the kernel uses the event's priv level. Branch and event priv levels do + * not have to match. Branch priv level is checked for permissions. + * + * The branch types can be combined, however BRANCH_ANY covers all types + * of branches and therefore it supersedes all the other types. + */ +enum perf_branch_sample_type_shift { + PERF_SAMPLE_BRANCH_USER_SHIFT = 0, /* user branches */ + PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, /* kernel branches */ + PERF_SAMPLE_BRANCH_HV_SHIFT = 2, /* hypervisor branches */ + + PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, /* any branch types */ + PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, /* any call branch */ + PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, /* any return branch */ + PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, /* indirect calls */ + PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, /* transaction aborts */ + PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, /* in transaction */ + PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, /* not in transaction */ + PERF_SAMPLE_BRANCH_COND_SHIFT = 10, /* conditional branches */ + + PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, /* call/ret stack */ + PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, /* indirect jumps */ + PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, /* direct call */ + + PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, /* no flags */ + PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, /* no cycles */ + + PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, /* save branch type */ + + PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, /* save low level index of raw branch records */ + + PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18, /* save privilege mode */ + + PERF_SAMPLE_BRANCH_MAX_SHIFT /* non-ABI */ +}; + +enum perf_branch_sample_type { + PERF_SAMPLE_BRANCH_USER = 1U << PERF_SAMPLE_BRANCH_USER_SHIFT, + PERF_SAMPLE_BRANCH_KERNEL = 1U << PERF_SAMPLE_BRANCH_KERNEL_SHIFT, + PERF_SAMPLE_BRANCH_HV = 1U << PERF_SAMPLE_BRANCH_HV_SHIFT, + + PERF_SAMPLE_BRANCH_ANY = 1U << PERF_SAMPLE_BRANCH_ANY_SHIFT, + PERF_SAMPLE_BRANCH_ANY_CALL = 1U << PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT, + PERF_SAMPLE_BRANCH_ANY_RETURN = 1U << PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT, + PERF_SAMPLE_BRANCH_IND_CALL = 1U << PERF_SAMPLE_BRANCH_IND_CALL_SHIFT, + PERF_SAMPLE_BRANCH_ABORT_TX = 1U << PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT, + PERF_SAMPLE_BRANCH_IN_TX = 1U << PERF_SAMPLE_BRANCH_IN_TX_SHIFT, + PERF_SAMPLE_BRANCH_NO_TX = 1U << PERF_SAMPLE_BRANCH_NO_TX_SHIFT, + PERF_SAMPLE_BRANCH_COND = 1U << PERF_SAMPLE_BRANCH_COND_SHIFT, + + PERF_SAMPLE_BRANCH_CALL_STACK = 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT, + PERF_SAMPLE_BRANCH_IND_JUMP = 1U << PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT, + PERF_SAMPLE_BRANCH_CALL = 1U << PERF_SAMPLE_BRANCH_CALL_SHIFT, + + PERF_SAMPLE_BRANCH_NO_FLAGS = 1U << PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT, + PERF_SAMPLE_BRANCH_NO_CYCLES = 1U << PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT, + + PERF_SAMPLE_BRANCH_TYPE_SAVE = + 1U << PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT, + + PERF_SAMPLE_BRANCH_HW_INDEX = 1U << PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT, + + PERF_SAMPLE_BRANCH_PRIV_SAVE = 1U << PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT, + + PERF_SAMPLE_BRANCH_MAX = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT, +}; + +/* + * Common flow change classification + */ +enum { + PERF_BR_UNKNOWN = 0, /* unknown */ + PERF_BR_COND = 1, /* conditional */ + PERF_BR_UNCOND = 2, /* unconditional */ + PERF_BR_IND = 3, /* indirect */ + PERF_BR_CALL = 4, /* function call */ + PERF_BR_IND_CALL = 5, /* indirect function call */ + PERF_BR_RET = 6, /* function return */ + PERF_BR_SYSCALL = 7, /* syscall */ + PERF_BR_SYSRET = 8, /* syscall return */ + PERF_BR_COND_CALL = 9, /* conditional function call */ + PERF_BR_COND_RET = 10, /* conditional function return */ + PERF_BR_ERET = 11, /* exception return */ + PERF_BR_IRQ = 12, /* irq */ + PERF_BR_SERROR = 13, /* system error */ + PERF_BR_NO_TX = 14, /* not in transaction */ + PERF_BR_EXTEND_ABI = 15, /* extend ABI */ + PERF_BR_MAX, +}; + +/* + * Common branch speculation outcome classification + */ +enum { + PERF_BR_SPEC_NA = 0, /* Not available */ + PERF_BR_SPEC_WRONG_PATH = 1, /* Speculative but on wrong path */ + PERF_BR_NON_SPEC_CORRECT_PATH = 2, /* Non-speculative but on correct path */ + PERF_BR_SPEC_CORRECT_PATH = 3, /* Speculative and on correct path */ + PERF_BR_SPEC_MAX, +}; + +enum { + PERF_BR_NEW_FAULT_ALGN = 0, /* Alignment fault */ + PERF_BR_NEW_FAULT_DATA = 1, /* Data fault */ + PERF_BR_NEW_FAULT_INST = 2, /* Inst fault */ + PERF_BR_NEW_ARCH_1 = 3, /* Architecture specific */ + PERF_BR_NEW_ARCH_2 = 4, /* Architecture specific */ + PERF_BR_NEW_ARCH_3 = 5, /* Architecture specific */ + PERF_BR_NEW_ARCH_4 = 6, /* Architecture specific */ + PERF_BR_NEW_ARCH_5 = 7, /* Architecture specific */ + PERF_BR_NEW_MAX, +}; + +enum { + PERF_BR_PRIV_UNKNOWN = 0, + PERF_BR_PRIV_USER = 1, + PERF_BR_PRIV_KERNEL = 2, + PERF_BR_PRIV_HV = 3, +}; + +#define PERF_BR_ARM64_FIQ PERF_BR_NEW_ARCH_1 +#define PERF_BR_ARM64_DEBUG_HALT PERF_BR_NEW_ARCH_2 +#define PERF_BR_ARM64_DEBUG_EXIT PERF_BR_NEW_ARCH_3 +#define PERF_BR_ARM64_DEBUG_INST PERF_BR_NEW_ARCH_4 +#define PERF_BR_ARM64_DEBUG_DATA PERF_BR_NEW_ARCH_5 + +#define PERF_SAMPLE_BRANCH_PLM_ALL \ + (PERF_SAMPLE_BRANCH_USER|\ + PERF_SAMPLE_BRANCH_KERNEL|\ + PERF_SAMPLE_BRANCH_HV) + +/* + * Values to determine ABI of the registers dump. + */ +enum perf_sample_regs_abi { + PERF_SAMPLE_REGS_ABI_NONE = 0, + PERF_SAMPLE_REGS_ABI_32 = 1, + PERF_SAMPLE_REGS_ABI_64 = 2, +}; + +/* + * Values for the memory transaction event qualifier, mostly for + * abort events. Multiple bits can be set. + */ +enum { + PERF_TXN_ELISION = (1 << 0), /* From elision */ + PERF_TXN_TRANSACTION = (1 << 1), /* From transaction */ + PERF_TXN_SYNC = (1 << 2), /* Instruction is related */ + PERF_TXN_ASYNC = (1 << 3), /* Instruction not related */ + PERF_TXN_RETRY = (1 << 4), /* Retry possible */ + PERF_TXN_CONFLICT = (1 << 5), /* Conflict abort */ + PERF_TXN_CAPACITY_WRITE = (1 << 6), /* Capacity write abort */ + PERF_TXN_CAPACITY_READ = (1 << 7), /* Capacity read abort */ + + PERF_TXN_MAX = (1 << 8), /* non-ABI */ + + /* bits 32..63 are reserved for the abort code */ + + PERF_TXN_ABORT_MASK = (0xffffffffULL << 32), + PERF_TXN_ABORT_SHIFT = 32, +}; + +/* + * The format of the data returned by read() on a perf event fd, + * as specified by attr.read_format: + * + * struct read_format { + * { u64 value; + * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED + * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING + * { u64 id; } && PERF_FORMAT_ID + * { u64 lost; } && PERF_FORMAT_LOST + * } && !PERF_FORMAT_GROUP + * + * { u64 nr; + * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED + * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING + * { u64 value; + * { u64 id; } && PERF_FORMAT_ID + * { u64 lost; } && PERF_FORMAT_LOST + * } cntr[nr]; + * } && PERF_FORMAT_GROUP + * }; + */ +enum perf_event_read_format { + PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0, + PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1, + PERF_FORMAT_ID = 1U << 2, + PERF_FORMAT_GROUP = 1U << 3, + PERF_FORMAT_LOST = 1U << 4, + + PERF_FORMAT_MAX = 1U << 5, /* non-ABI */ +}; + +#define PERF_ATTR_SIZE_VER0 64 /* sizeof first published struct */ +#define PERF_ATTR_SIZE_VER1 72 /* add: config2 */ +#define PERF_ATTR_SIZE_VER2 80 /* add: branch_sample_type */ +#define PERF_ATTR_SIZE_VER3 96 /* add: sample_regs_user */ + /* add: sample_stack_user */ +#define PERF_ATTR_SIZE_VER4 104 /* add: sample_regs_intr */ +#define PERF_ATTR_SIZE_VER5 112 /* add: aux_watermark */ +#define PERF_ATTR_SIZE_VER6 120 /* add: aux_sample_size */ +#define PERF_ATTR_SIZE_VER7 128 /* add: sig_data */ + +/* + * Hardware event_id to monitor via a performance monitoring event: + * + * @sample_max_stack: Max number of frame pointers in a callchain, + * should be < /proc/sys/kernel/perf_event_max_stack + */ +struct perf_event_attr { + + /* + * Major type: hardware/software/tracepoint/etc. + */ + __u32 type; + + /* + * Size of the attr structure, for fwd/bwd compat. + */ + __u32 size; + + /* + * Type specific configuration information. + */ + __u64 config; + + union { + __u64 sample_period; + __u64 sample_freq; + }; + + __u64 sample_type; + __u64 read_format; + + __u64 disabled : 1, /* off by default */ + inherit : 1, /* children inherit it */ + pinned : 1, /* must always be on PMU */ + exclusive : 1, /* only group on PMU */ + exclude_user : 1, /* don't count user */ + exclude_kernel : 1, /* ditto kernel */ + exclude_hv : 1, /* ditto hypervisor */ + exclude_idle : 1, /* don't count when idle */ + mmap : 1, /* include mmap data */ + comm : 1, /* include comm data */ + freq : 1, /* use freq, not period */ + inherit_stat : 1, /* per task counts */ + enable_on_exec : 1, /* next exec enables */ + task : 1, /* trace fork/exit */ + watermark : 1, /* wakeup_watermark */ + /* + * precise_ip: + * + * 0 - SAMPLE_IP can have arbitrary skid + * 1 - SAMPLE_IP must have constant skid + * 2 - SAMPLE_IP requested to have 0 skid + * 3 - SAMPLE_IP must have 0 skid + * + * See also PERF_RECORD_MISC_EXACT_IP + */ + precise_ip : 2, /* skid constraint */ + mmap_data : 1, /* non-exec mmap data */ + sample_id_all : 1, /* sample_type all events */ + + exclude_host : 1, /* don't count in host */ + exclude_guest : 1, /* don't count in guest */ + + exclude_callchain_kernel : 1, /* exclude kernel callchains */ + exclude_callchain_user : 1, /* exclude user callchains */ + mmap2 : 1, /* include mmap with inode data */ + comm_exec : 1, /* flag comm events that are due to an exec */ + use_clockid : 1, /* use @clockid for time fields */ + context_switch : 1, /* context switch data */ + write_backward : 1, /* Write ring buffer from end to beginning */ + namespaces : 1, /* include namespaces data */ + ksymbol : 1, /* include ksymbol events */ + bpf_event : 1, /* include bpf events */ + aux_output : 1, /* generate AUX records instead of events */ + cgroup : 1, /* include cgroup events */ + text_poke : 1, /* include text poke events */ + build_id : 1, /* use build id in mmap2 events */ + inherit_thread : 1, /* children only inherit if cloned with CLONE_THREAD */ + remove_on_exec : 1, /* event is removed from task on exec */ + sigtrap : 1, /* send synchronous SIGTRAP on event */ + __reserved_1 : 26; + + union { + __u32 wakeup_events; /* wakeup every n events */ + __u32 wakeup_watermark; /* bytes before wakeup */ + }; + + __u32 bp_type; + union { + __u64 bp_addr; + __u64 kprobe_func; /* for perf_kprobe */ + __u64 uprobe_path; /* for perf_uprobe */ + __u64 config1; /* extension of config */ + }; + union { + __u64 bp_len; + __u64 kprobe_addr; /* when kprobe_func == NULL */ + __u64 probe_offset; /* for perf_[k,u]probe */ + __u64 config2; /* extension of config1 */ + }; + __u64 branch_sample_type; /* enum perf_branch_sample_type */ + + /* + * Defines set of user regs to dump on samples. + * See asm/perf_regs.h for details. + */ + __u64 sample_regs_user; + + /* + * Defines size of the user stack to dump on samples. + */ + __u32 sample_stack_user; + + __s32 clockid; + /* + * Defines set of regs to dump for each sample + * state captured on: + * - precise = 0: PMU interrupt + * - precise > 0: sampled instruction + * + * See asm/perf_regs.h for details. + */ + __u64 sample_regs_intr; + + /* + * Wakeup watermark for AUX area + */ + __u32 aux_watermark; + __u16 sample_max_stack; + __u16 __reserved_2; + __u32 aux_sample_size; + __u32 __reserved_3; + + /* + * User provided data if sigtrap=1, passed back to user via + * siginfo_t::si_perf_data, e.g. to permit user to identify the event. + * Note, siginfo_t::si_perf_data is long-sized, and sig_data will be + * truncated accordingly on 32 bit architectures. + */ + __u64 sig_data; +}; + +/* + * Structure used by below PERF_EVENT_IOC_QUERY_BPF command + * to query bpf programs attached to the same perf tracepoint + * as the given perf event. + */ +struct perf_event_query_bpf { + /* + * The below ids array length + */ + __u32 ids_len; + /* + * Set by the kernel to indicate the number of + * available programs + */ + __u32 prog_cnt; + /* + * User provided buffer to store program ids + */ + __u32 ids[]; +}; + +/* + * Ioctls that can be done on a perf event fd: + */ +#define PERF_EVENT_IOC_ENABLE _IO ('$', 0) +#define PERF_EVENT_IOC_DISABLE _IO ('$', 1) +#define PERF_EVENT_IOC_REFRESH _IO ('$', 2) +#define PERF_EVENT_IOC_RESET _IO ('$', 3) +#define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64) +#define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5) +#define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) +#define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) +#define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32) +#define PERF_EVENT_IOC_PAUSE_OUTPUT _IOW('$', 9, __u32) +#define PERF_EVENT_IOC_QUERY_BPF _IOWR('$', 10, struct perf_event_query_bpf *) +#define PERF_EVENT_IOC_MODIFY_ATTRIBUTES _IOW('$', 11, struct perf_event_attr *) + +enum perf_event_ioc_flags { + PERF_IOC_FLAG_GROUP = 1U << 0, +}; + +/* + * Structure of the page that can be mapped via mmap + */ +struct perf_event_mmap_page { + __u32 version; /* version number of this structure */ + __u32 compat_version; /* lowest version this is compat with */ + + /* + * Bits needed to read the hw events in user-space. + * + * u32 seq, time_mult, time_shift, index, width; + * u64 count, enabled, running; + * u64 cyc, time_offset; + * s64 pmc = 0; + * + * do { + * seq = pc->lock; + * barrier() + * + * enabled = pc->time_enabled; + * running = pc->time_running; + * + * if (pc->cap_usr_time && enabled != running) { + * cyc = rdtsc(); + * time_offset = pc->time_offset; + * time_mult = pc->time_mult; + * time_shift = pc->time_shift; + * } + * + * index = pc->index; + * count = pc->offset; + * if (pc->cap_user_rdpmc && index) { + * width = pc->pmc_width; + * pmc = rdpmc(index - 1); + * } + * + * barrier(); + * } while (pc->lock != seq); + * + * NOTE: for obvious reason this only works on self-monitoring + * processes. + */ + __u32 lock; /* seqlock for synchronization */ + __u32 index; /* hardware event identifier */ + __s64 offset; /* add to hardware event value */ + __u64 time_enabled; /* time event active */ + __u64 time_running; /* time event on cpu */ + union { + __u64 capabilities; + struct { + __u64 cap_bit0 : 1, /* Always 0, deprecated, see commit 860f085b74e9 */ + cap_bit0_is_deprecated : 1, /* Always 1, signals that bit 0 is zero */ + + cap_user_rdpmc : 1, /* The RDPMC instruction can be used to read counts */ + cap_user_time : 1, /* The time_{shift,mult,offset} fields are used */ + cap_user_time_zero : 1, /* The time_zero field is used */ + cap_user_time_short : 1, /* the time_{cycle,mask} fields are used */ + cap_____res : 58; + }; + }; + + /* + * If cap_user_rdpmc this field provides the bit-width of the value + * read using the rdpmc() or equivalent instruction. This can be used + * to sign extend the result like: + * + * pmc <<= 64 - width; + * pmc >>= 64 - width; // signed shift right + * count += pmc; + */ + __u16 pmc_width; + + /* + * If cap_usr_time the below fields can be used to compute the time + * delta since time_enabled (in ns) using rdtsc or similar. + * + * u64 quot, rem; + * u64 delta; + * + * quot = (cyc >> time_shift); + * rem = cyc & (((u64)1 << time_shift) - 1); + * delta = time_offset + quot * time_mult + + * ((rem * time_mult) >> time_shift); + * + * Where time_offset,time_mult,time_shift and cyc are read in the + * seqcount loop described above. This delta can then be added to + * enabled and possible running (if index), improving the scaling: + * + * enabled += delta; + * if (index) + * running += delta; + * + * quot = count / running; + * rem = count % running; + * count = quot * enabled + (rem * enabled) / running; + */ + __u16 time_shift; + __u32 time_mult; + __u64 time_offset; + /* + * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated + * from sample timestamps. + * + * time = timestamp - time_zero; + * quot = time / time_mult; + * rem = time % time_mult; + * cyc = (quot << time_shift) + (rem << time_shift) / time_mult; + * + * And vice versa: + * + * quot = cyc >> time_shift; + * rem = cyc & (((u64)1 << time_shift) - 1); + * timestamp = time_zero + quot * time_mult + + * ((rem * time_mult) >> time_shift); + */ + __u64 time_zero; + + __u32 size; /* Header size up to __reserved[] fields. */ + __u32 __reserved_1; + + /* + * If cap_usr_time_short, the hardware clock is less than 64bit wide + * and we must compute the 'cyc' value, as used by cap_usr_time, as: + * + * cyc = time_cycles + ((cyc - time_cycles) & time_mask) + * + * NOTE: this form is explicitly chosen such that cap_usr_time_short + * is a correction on top of cap_usr_time, and code that doesn't + * know about cap_usr_time_short still works under the assumption + * the counter doesn't wrap. + */ + __u64 time_cycles; + __u64 time_mask; + + /* + * Hole for extension of the self monitor capabilities + */ + + __u8 __reserved[116*8]; /* align to 1k. */ + + /* + * Control data for the mmap() data buffer. + * + * User-space reading the @data_head value should issue an smp_rmb(), + * after reading this value. + * + * When the mapping is PROT_WRITE the @data_tail value should be + * written by userspace to reflect the last read data, after issueing + * an smp_mb() to separate the data read from the ->data_tail store. + * In this case the kernel will not over-write unread data. + * + * See perf_output_put_handle() for the data ordering. + * + * data_{offset,size} indicate the location and size of the perf record + * buffer within the mmapped area. + */ + __u64 data_head; /* head in the data section */ + __u64 data_tail; /* user-space written tail */ + __u64 data_offset; /* where the buffer starts */ + __u64 data_size; /* data buffer size */ + + /* + * AUX area is defined by aux_{offset,size} fields that should be set + * by the userspace, so that + * + * aux_offset >= data_offset + data_size + * + * prior to mmap()ing it. Size of the mmap()ed area should be aux_size. + * + * Ring buffer pointers aux_{head,tail} have the same semantics as + * data_{head,tail} and same ordering rules apply. + */ + __u64 aux_head; + __u64 aux_tail; + __u64 aux_offset; + __u64 aux_size; +}; + +/* + * The current state of perf_event_header::misc bits usage: + * ('|' used bit, '-' unused bit) + * + * 012 CDEF + * |||---------|||| + * + * Where: + * 0-2 CPUMODE_MASK + * + * C PROC_MAP_PARSE_TIMEOUT + * D MMAP_DATA / COMM_EXEC / FORK_EXEC / SWITCH_OUT + * E MMAP_BUILD_ID / EXACT_IP / SCHED_OUT_PREEMPT + * F (reserved) + */ + +#define PERF_RECORD_MISC_CPUMODE_MASK (7 << 0) +#define PERF_RECORD_MISC_CPUMODE_UNKNOWN (0 << 0) +#define PERF_RECORD_MISC_KERNEL (1 << 0) +#define PERF_RECORD_MISC_USER (2 << 0) +#define PERF_RECORD_MISC_HYPERVISOR (3 << 0) +#define PERF_RECORD_MISC_GUEST_KERNEL (4 << 0) +#define PERF_RECORD_MISC_GUEST_USER (5 << 0) + +/* + * Indicates that /proc/PID/maps parsing are truncated by time out. + */ +#define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT (1 << 12) +/* + * Following PERF_RECORD_MISC_* are used on different + * events, so can reuse the same bit position: + * + * PERF_RECORD_MISC_MMAP_DATA - PERF_RECORD_MMAP* events + * PERF_RECORD_MISC_COMM_EXEC - PERF_RECORD_COMM event + * PERF_RECORD_MISC_FORK_EXEC - PERF_RECORD_FORK event (perf internal) + * PERF_RECORD_MISC_SWITCH_OUT - PERF_RECORD_SWITCH* events + */ +#define PERF_RECORD_MISC_MMAP_DATA (1 << 13) +#define PERF_RECORD_MISC_COMM_EXEC (1 << 13) +#define PERF_RECORD_MISC_FORK_EXEC (1 << 13) +#define PERF_RECORD_MISC_SWITCH_OUT (1 << 13) +/* + * These PERF_RECORD_MISC_* flags below are safely reused + * for the following events: + * + * PERF_RECORD_MISC_EXACT_IP - PERF_RECORD_SAMPLE of precise events + * PERF_RECORD_MISC_SWITCH_OUT_PREEMPT - PERF_RECORD_SWITCH* events + * PERF_RECORD_MISC_MMAP_BUILD_ID - PERF_RECORD_MMAP2 event + * + * + * PERF_RECORD_MISC_EXACT_IP: + * Indicates that the content of PERF_SAMPLE_IP points to + * the actual instruction that triggered the event. See also + * perf_event_attr::precise_ip. + * + * PERF_RECORD_MISC_SWITCH_OUT_PREEMPT: + * Indicates that thread was preempted in TASK_RUNNING state. + * + * PERF_RECORD_MISC_MMAP_BUILD_ID: + * Indicates that mmap2 event carries build id data. + */ +#define PERF_RECORD_MISC_EXACT_IP (1 << 14) +#define PERF_RECORD_MISC_SWITCH_OUT_PREEMPT (1 << 14) +#define PERF_RECORD_MISC_MMAP_BUILD_ID (1 << 14) +/* + * Reserve the last bit to indicate some extended misc field + */ +#define PERF_RECORD_MISC_EXT_RESERVED (1 << 15) + +struct perf_event_header { + __u32 type; + __u16 misc; + __u16 size; +}; + +struct perf_ns_link_info { + __u64 dev; + __u64 ino; +}; + +enum { + NET_NS_INDEX = 0, + UTS_NS_INDEX = 1, + IPC_NS_INDEX = 2, + PID_NS_INDEX = 3, + USER_NS_INDEX = 4, + MNT_NS_INDEX = 5, + CGROUP_NS_INDEX = 6, + + NR_NAMESPACES, /* number of available namespaces */ +}; + +enum perf_event_type { + + /* + * If perf_event_attr.sample_id_all is set then all event types will + * have the sample_type selected fields related to where/when + * (identity) an event took place (TID, TIME, ID, STREAM_ID, CPU, + * IDENTIFIER) described in PERF_RECORD_SAMPLE below, it will be stashed + * just after the perf_event_header and the fields already present for + * the existing fields, i.e. at the end of the payload. That way a newer + * perf.data file will be supported by older perf tools, with these new + * optional fields being ignored. + * + * struct sample_id { + * { u32 pid, tid; } && PERF_SAMPLE_TID + * { u64 time; } && PERF_SAMPLE_TIME + * { u64 id; } && PERF_SAMPLE_ID + * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID + * { u32 cpu, res; } && PERF_SAMPLE_CPU + * { u64 id; } && PERF_SAMPLE_IDENTIFIER + * } && perf_event_attr::sample_id_all + * + * Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. The + * advantage of PERF_SAMPLE_IDENTIFIER is that its position is fixed + * relative to header.size. + */ + + /* + * The MMAP events record the PROT_EXEC mappings so that we can + * correlate userspace IPs to code. They have the following structure: + * + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * u64 addr; + * u64 len; + * u64 pgoff; + * char filename[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_MMAP = 1, + + /* + * struct { + * struct perf_event_header header; + * u64 id; + * u64 lost; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_LOST = 2, + + /* + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * char comm[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_COMM = 3, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, ppid; + * u32 tid, ptid; + * u64 time; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_EXIT = 4, + + /* + * struct { + * struct perf_event_header header; + * u64 time; + * u64 id; + * u64 stream_id; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_THROTTLE = 5, + PERF_RECORD_UNTHROTTLE = 6, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, ppid; + * u32 tid, ptid; + * u64 time; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_FORK = 7, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, tid; + * + * struct read_format values; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_READ = 8, + + /* + * struct { + * struct perf_event_header header; + * + * # + * # Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. + * # The advantage of PERF_SAMPLE_IDENTIFIER is that its position + * # is fixed relative to header. + * # + * + * { u64 id; } && PERF_SAMPLE_IDENTIFIER + * { u64 ip; } && PERF_SAMPLE_IP + * { u32 pid, tid; } && PERF_SAMPLE_TID + * { u64 time; } && PERF_SAMPLE_TIME + * { u64 addr; } && PERF_SAMPLE_ADDR + * { u64 id; } && PERF_SAMPLE_ID + * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID + * { u32 cpu, res; } && PERF_SAMPLE_CPU + * { u64 period; } && PERF_SAMPLE_PERIOD + * + * { struct read_format values; } && PERF_SAMPLE_READ + * + * { u64 nr, + * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN + * + * # + * # The RAW record below is opaque data wrt the ABI + * # + * # That is, the ABI doesn't make any promises wrt to + * # the stability of its content, it may vary depending + * # on event, hardware, kernel version and phase of + * # the moon. + * # + * # In other words, PERF_SAMPLE_RAW contents are not an ABI. + * # + * + * { u32 size; + * char data[size];}&& PERF_SAMPLE_RAW + * + * { u64 nr; + * { u64 hw_idx; } && PERF_SAMPLE_BRANCH_HW_INDEX + * { u64 from, to, flags } lbr[nr]; + * } && PERF_SAMPLE_BRANCH_STACK + * + * { u64 abi; # enum perf_sample_regs_abi + * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER + * + * { u64 size; + * char data[size]; + * u64 dyn_size; } && PERF_SAMPLE_STACK_USER + * + * { union perf_sample_weight + * { + * u64 full; && PERF_SAMPLE_WEIGHT + * #if defined(__LITTLE_ENDIAN_BITFIELD) + * struct { + * u32 var1_dw; + * u16 var2_w; + * u16 var3_w; + * } && PERF_SAMPLE_WEIGHT_STRUCT + * #elif defined(__BIG_ENDIAN_BITFIELD) + * struct { + * u16 var3_w; + * u16 var2_w; + * u32 var1_dw; + * } && PERF_SAMPLE_WEIGHT_STRUCT + * #endif + * } + * } + * { u64 data_src; } && PERF_SAMPLE_DATA_SRC + * { u64 transaction; } && PERF_SAMPLE_TRANSACTION + * { u64 abi; # enum perf_sample_regs_abi + * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR + * { u64 phys_addr;} && PERF_SAMPLE_PHYS_ADDR + * { u64 size; + * char data[size]; } && PERF_SAMPLE_AUX + * { u64 data_page_size;} && PERF_SAMPLE_DATA_PAGE_SIZE + * { u64 code_page_size;} && PERF_SAMPLE_CODE_PAGE_SIZE + * }; + */ + PERF_RECORD_SAMPLE = 9, + + /* + * The MMAP2 records are an augmented version of MMAP, they add + * maj, min, ino numbers to be used to uniquely identify each mapping + * + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * u64 addr; + * u64 len; + * u64 pgoff; + * union { + * struct { + * u32 maj; + * u32 min; + * u64 ino; + * u64 ino_generation; + * }; + * struct { + * u8 build_id_size; + * u8 __reserved_1; + * u16 __reserved_2; + * u8 build_id[20]; + * }; + * }; + * u32 prot, flags; + * char filename[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_MMAP2 = 10, + + /* + * Records that new data landed in the AUX buffer part. + * + * struct { + * struct perf_event_header header; + * + * u64 aux_offset; + * u64 aux_size; + * u64 flags; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_AUX = 11, + + /* + * Indicates that instruction trace has started + * + * struct { + * struct perf_event_header header; + * u32 pid; + * u32 tid; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_ITRACE_START = 12, + + /* + * Records the dropped/lost sample number. + * + * struct { + * struct perf_event_header header; + * + * u64 lost; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_LOST_SAMPLES = 13, + + /* + * Records a context switch in or out (flagged by + * PERF_RECORD_MISC_SWITCH_OUT). See also + * PERF_RECORD_SWITCH_CPU_WIDE. + * + * struct { + * struct perf_event_header header; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_SWITCH = 14, + + /* + * CPU-wide version of PERF_RECORD_SWITCH with next_prev_pid and + * next_prev_tid that are the next (switching out) or previous + * (switching in) pid/tid. + * + * struct { + * struct perf_event_header header; + * u32 next_prev_pid; + * u32 next_prev_tid; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_SWITCH_CPU_WIDE = 15, + + /* + * struct { + * struct perf_event_header header; + * u32 pid; + * u32 tid; + * u64 nr_namespaces; + * { u64 dev, inode; } [nr_namespaces]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_NAMESPACES = 16, + + /* + * Record ksymbol register/unregister events: + * + * struct { + * struct perf_event_header header; + * u64 addr; + * u32 len; + * u16 ksym_type; + * u16 flags; + * char name[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_KSYMBOL = 17, + + /* + * Record bpf events: + * enum perf_bpf_event_type { + * PERF_BPF_EVENT_UNKNOWN = 0, + * PERF_BPF_EVENT_PROG_LOAD = 1, + * PERF_BPF_EVENT_PROG_UNLOAD = 2, + * }; + * + * struct { + * struct perf_event_header header; + * u16 type; + * u16 flags; + * u32 id; + * u8 tag[BPF_TAG_SIZE]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_BPF_EVENT = 18, + + /* + * struct { + * struct perf_event_header header; + * u64 id; + * char path[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_CGROUP = 19, + + /* + * Records changes to kernel text i.e. self-modified code. 'old_len' is + * the number of old bytes, 'new_len' is the number of new bytes. Either + * 'old_len' or 'new_len' may be zero to indicate, for example, the + * addition or removal of a trampoline. 'bytes' contains the old bytes + * followed immediately by the new bytes. + * + * struct { + * struct perf_event_header header; + * u64 addr; + * u16 old_len; + * u16 new_len; + * u8 bytes[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_TEXT_POKE = 20, + + /* + * Data written to the AUX area by hardware due to aux_output, may need + * to be matched to the event by an architecture-specific hardware ID. + * This records the hardware ID, but requires sample_id to provide the + * event ID. e.g. Intel PT uses this record to disambiguate PEBS-via-PT + * records from multiple events. + * + * struct { + * struct perf_event_header header; + * u64 hw_id; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_AUX_OUTPUT_HW_ID = 21, + + PERF_RECORD_MAX, /* non-ABI */ +}; + +enum perf_record_ksymbol_type { + PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, + PERF_RECORD_KSYMBOL_TYPE_BPF = 1, + /* + * Out of line code such as kprobe-replaced instructions or optimized + * kprobes or ftrace trampolines. + */ + PERF_RECORD_KSYMBOL_TYPE_OOL = 2, + PERF_RECORD_KSYMBOL_TYPE_MAX /* non-ABI */ +}; + +#define PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER (1 << 0) + +enum perf_bpf_event_type { + PERF_BPF_EVENT_UNKNOWN = 0, + PERF_BPF_EVENT_PROG_LOAD = 1, + PERF_BPF_EVENT_PROG_UNLOAD = 2, + PERF_BPF_EVENT_MAX, /* non-ABI */ +}; + +#define PERF_MAX_STACK_DEPTH 127 +#define PERF_MAX_CONTEXTS_PER_STACK 8 + +enum perf_callchain_context { + PERF_CONTEXT_HV = (__u64)-32, + PERF_CONTEXT_KERNEL = (__u64)-128, + PERF_CONTEXT_USER = (__u64)-512, + + PERF_CONTEXT_GUEST = (__u64)-2048, + PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176, + PERF_CONTEXT_GUEST_USER = (__u64)-2560, + + PERF_CONTEXT_MAX = (__u64)-4095, +}; + +/** + * PERF_RECORD_AUX::flags bits + */ +#define PERF_AUX_FLAG_TRUNCATED 0x01 /* record was truncated to fit */ +#define PERF_AUX_FLAG_OVERWRITE 0x02 /* snapshot from overwrite mode */ +#define PERF_AUX_FLAG_PARTIAL 0x04 /* record contains gaps */ +#define PERF_AUX_FLAG_COLLISION 0x08 /* sample collided with another */ +#define PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK 0xff00 /* PMU specific trace format type */ + +/* CoreSight PMU AUX buffer formats */ +#define PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT 0x0000 /* Default for backward compatibility */ +#define PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW 0x0100 /* Raw format of the source */ + +#define PERF_FLAG_FD_NO_GROUP (1UL << 0) +#define PERF_FLAG_FD_OUTPUT (1UL << 1) +#define PERF_FLAG_PID_CGROUP (1UL << 2) /* pid=cgroup id, per-cpu mode only */ +#define PERF_FLAG_FD_CLOEXEC (1UL << 3) /* O_CLOEXEC */ + +#if defined(__LITTLE_ENDIAN_BITFIELD) +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_op:5, /* type of opcode */ + mem_lvl:14, /* memory hierarchy level */ + mem_snoop:5, /* snoop mode */ + mem_lock:2, /* lock instr */ + mem_dtlb:7, /* tlb access */ + mem_lvl_num:4, /* memory hierarchy level number */ + mem_remote:1, /* remote */ + mem_snoopx:2, /* snoop mode, ext */ + mem_blk:3, /* access blocked */ + mem_hops:3, /* hop level */ + mem_rsvd:18; + }; +}; +#elif defined(__BIG_ENDIAN_BITFIELD) +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_rsvd:18, + mem_hops:3, /* hop level */ + mem_blk:3, /* access blocked */ + mem_snoopx:2, /* snoop mode, ext */ + mem_remote:1, /* remote */ + mem_lvl_num:4, /* memory hierarchy level number */ + mem_dtlb:7, /* tlb access */ + mem_lock:2, /* lock instr */ + mem_snoop:5, /* snoop mode */ + mem_lvl:14, /* memory hierarchy level */ + mem_op:5; /* type of opcode */ + }; +}; +#else +#error "Unknown endianness" +#endif + +/* type of opcode (load/store/prefetch,code) */ +#define PERF_MEM_OP_NA 0x01 /* not available */ +#define PERF_MEM_OP_LOAD 0x02 /* load instruction */ +#define PERF_MEM_OP_STORE 0x04 /* store instruction */ +#define PERF_MEM_OP_PFETCH 0x08 /* prefetch */ +#define PERF_MEM_OP_EXEC 0x10 /* code (execution) */ +#define PERF_MEM_OP_SHIFT 0 + +/* + * PERF_MEM_LVL_* namespace being depricated to some extent in the + * favour of newer composite PERF_MEM_{LVLNUM_,REMOTE_,SNOOPX_} fields. + * Supporting this namespace inorder to not break defined ABIs. + * + * memory hierarchy (memory level, hit or miss) + */ +#define PERF_MEM_LVL_NA 0x01 /* not available */ +#define PERF_MEM_LVL_HIT 0x02 /* hit level */ +#define PERF_MEM_LVL_MISS 0x04 /* miss level */ +#define PERF_MEM_LVL_L1 0x08 /* L1 */ +#define PERF_MEM_LVL_LFB 0x10 /* Line Fill Buffer */ +#define PERF_MEM_LVL_L2 0x20 /* L2 */ +#define PERF_MEM_LVL_L3 0x40 /* L3 */ +#define PERF_MEM_LVL_LOC_RAM 0x80 /* Local DRAM */ +#define PERF_MEM_LVL_REM_RAM1 0x100 /* Remote DRAM (1 hop) */ +#define PERF_MEM_LVL_REM_RAM2 0x200 /* Remote DRAM (2 hops) */ +#define PERF_MEM_LVL_REM_CCE1 0x400 /* Remote Cache (1 hop) */ +#define PERF_MEM_LVL_REM_CCE2 0x800 /* Remote Cache (2 hops) */ +#define PERF_MEM_LVL_IO 0x1000 /* I/O memory */ +#define PERF_MEM_LVL_UNC 0x2000 /* Uncached memory */ +#define PERF_MEM_LVL_SHIFT 5 + +#define PERF_MEM_REMOTE_REMOTE 0x01 /* Remote */ +#define PERF_MEM_REMOTE_SHIFT 37 + +#define PERF_MEM_LVLNUM_L1 0x01 /* L1 */ +#define PERF_MEM_LVLNUM_L2 0x02 /* L2 */ +#define PERF_MEM_LVLNUM_L3 0x03 /* L3 */ +#define PERF_MEM_LVLNUM_L4 0x04 /* L4 */ +/* 5-0x8 available */ +#define PERF_MEM_LVLNUM_CXL 0x09 /* CXL */ +#define PERF_MEM_LVLNUM_IO 0x0a /* I/O */ +#define PERF_MEM_LVLNUM_ANY_CACHE 0x0b /* Any cache */ +#define PERF_MEM_LVLNUM_LFB 0x0c /* LFB */ +#define PERF_MEM_LVLNUM_RAM 0x0d /* RAM */ +#define PERF_MEM_LVLNUM_PMEM 0x0e /* PMEM */ +#define PERF_MEM_LVLNUM_NA 0x0f /* N/A */ + +#define PERF_MEM_LVLNUM_SHIFT 33 + +/* snoop mode */ +#define PERF_MEM_SNOOP_NA 0x01 /* not available */ +#define PERF_MEM_SNOOP_NONE 0x02 /* no snoop */ +#define PERF_MEM_SNOOP_HIT 0x04 /* snoop hit */ +#define PERF_MEM_SNOOP_MISS 0x08 /* snoop miss */ +#define PERF_MEM_SNOOP_HITM 0x10 /* snoop hit modified */ +#define PERF_MEM_SNOOP_SHIFT 19 + +#define PERF_MEM_SNOOPX_FWD 0x01 /* forward */ +#define PERF_MEM_SNOOPX_PEER 0x02 /* xfer from peer */ +#define PERF_MEM_SNOOPX_SHIFT 38 + +/* locked instruction */ +#define PERF_MEM_LOCK_NA 0x01 /* not available */ +#define PERF_MEM_LOCK_LOCKED 0x02 /* locked transaction */ +#define PERF_MEM_LOCK_SHIFT 24 + +/* TLB access */ +#define PERF_MEM_TLB_NA 0x01 /* not available */ +#define PERF_MEM_TLB_HIT 0x02 /* hit level */ +#define PERF_MEM_TLB_MISS 0x04 /* miss level */ +#define PERF_MEM_TLB_L1 0x08 /* L1 */ +#define PERF_MEM_TLB_L2 0x10 /* L2 */ +#define PERF_MEM_TLB_WK 0x20 /* Hardware Walker*/ +#define PERF_MEM_TLB_OS 0x40 /* OS fault handler */ +#define PERF_MEM_TLB_SHIFT 26 + +/* Access blocked */ +#define PERF_MEM_BLK_NA 0x01 /* not available */ +#define PERF_MEM_BLK_DATA 0x02 /* data could not be forwarded */ +#define PERF_MEM_BLK_ADDR 0x04 /* address conflict */ +#define PERF_MEM_BLK_SHIFT 40 + +/* hop level */ +#define PERF_MEM_HOPS_0 0x01 /* remote core, same node */ +#define PERF_MEM_HOPS_1 0x02 /* remote node, same socket */ +#define PERF_MEM_HOPS_2 0x03 /* remote socket, same board */ +#define PERF_MEM_HOPS_3 0x04 /* remote board */ +/* 5-7 available */ +#define PERF_MEM_HOPS_SHIFT 43 + +#define PERF_MEM_S(a, s) \ + (((__u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT) + +/* + * single taken branch record layout: + * + * from: source instruction (may not always be a branch insn) + * to: branch target + * mispred: branch target was mispredicted + * predicted: branch target was predicted + * + * support for mispred, predicted is optional. In case it + * is not supported mispred = predicted = 0. + * + * in_tx: running in a hardware transaction + * abort: aborting a hardware transaction + * cycles: cycles from last branch (or 0 if not supported) + * type: branch type + * spec: branch speculation info (or 0 if not supported) + */ +struct perf_branch_entry { + __u64 from; + __u64 to; + __u64 mispred:1, /* target mispredicted */ + predicted:1,/* target predicted */ + in_tx:1, /* in transaction */ + abort:1, /* transaction abort */ + cycles:16, /* cycle count to last branch */ + type:4, /* branch type */ + spec:2, /* branch speculation info */ + new_type:4, /* additional branch type */ + priv:3, /* privilege level */ + reserved:31; +}; + +union perf_sample_weight { + __u64 full; +#if defined(__LITTLE_ENDIAN_BITFIELD) + struct { + __u32 var1_dw; + __u16 var2_w; + __u16 var3_w; + }; +#elif defined(__BIG_ENDIAN_BITFIELD) + struct { + __u16 var3_w; + __u16 var2_w; + __u32 var1_dw; + }; +#else +#error "Unknown endianness" +#endif +}; + +#endif /* _UAPI_LINUX_PERF_EVENT_H */ diff --git a/bpftool/libbpf/include/uapi/linux/pkt_cls.h b/bpftool/libbpf/include/uapi/linux/pkt_cls.h new file mode 100644 index 0000000..3faee01 --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/pkt_cls.h @@ -0,0 +1,612 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __LINUX_PKT_CLS_H +#define __LINUX_PKT_CLS_H + +#include +#include + +#define TC_COOKIE_MAX_SIZE 16 + +/* Action attributes */ +enum { + TCA_ACT_UNSPEC, + TCA_ACT_KIND, + TCA_ACT_OPTIONS, + TCA_ACT_INDEX, + TCA_ACT_STATS, + TCA_ACT_PAD, + TCA_ACT_COOKIE, + __TCA_ACT_MAX +}; + +#define TCA_ACT_MAX __TCA_ACT_MAX +#define TCA_OLD_COMPAT (TCA_ACT_MAX+1) +#define TCA_ACT_MAX_PRIO 32 +#define TCA_ACT_BIND 1 +#define TCA_ACT_NOBIND 0 +#define TCA_ACT_UNBIND 1 +#define TCA_ACT_NOUNBIND 0 +#define TCA_ACT_REPLACE 1 +#define TCA_ACT_NOREPLACE 0 + +#define TC_ACT_UNSPEC (-1) +#define TC_ACT_OK 0 +#define TC_ACT_RECLASSIFY 1 +#define TC_ACT_SHOT 2 +#define TC_ACT_PIPE 3 +#define TC_ACT_STOLEN 4 +#define TC_ACT_QUEUED 5 +#define TC_ACT_REPEAT 6 +#define TC_ACT_REDIRECT 7 +#define TC_ACT_TRAP 8 /* For hw path, this means "trap to cpu" + * and don't further process the frame + * in hardware. For sw path, this is + * equivalent of TC_ACT_STOLEN - drop + * the skb and act like everything + * is alright. + */ +#define TC_ACT_VALUE_MAX TC_ACT_TRAP + +/* There is a special kind of actions called "extended actions", + * which need a value parameter. These have a local opcode located in + * the highest nibble, starting from 1. The rest of the bits + * are used to carry the value. These two parts together make + * a combined opcode. + */ +#define __TC_ACT_EXT_SHIFT 28 +#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT) +#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1) +#define TC_ACT_EXT_OPCODE(combined) ((combined) & (~TC_ACT_EXT_VAL_MASK)) +#define TC_ACT_EXT_CMP(combined, opcode) (TC_ACT_EXT_OPCODE(combined) == opcode) + +#define TC_ACT_JUMP __TC_ACT_EXT(1) +#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2) +#define TC_ACT_EXT_OPCODE_MAX TC_ACT_GOTO_CHAIN + +/* Action type identifiers*/ +enum { + TCA_ID_UNSPEC=0, + TCA_ID_POLICE=1, + /* other actions go here */ + __TCA_ID_MAX=255 +}; + +#define TCA_ID_MAX __TCA_ID_MAX + +struct tc_police { + __u32 index; + int action; +#define TC_POLICE_UNSPEC TC_ACT_UNSPEC +#define TC_POLICE_OK TC_ACT_OK +#define TC_POLICE_RECLASSIFY TC_ACT_RECLASSIFY +#define TC_POLICE_SHOT TC_ACT_SHOT +#define TC_POLICE_PIPE TC_ACT_PIPE + + __u32 limit; + __u32 burst; + __u32 mtu; + struct tc_ratespec rate; + struct tc_ratespec peakrate; + int refcnt; + int bindcnt; + __u32 capab; +}; + +struct tcf_t { + __u64 install; + __u64 lastuse; + __u64 expires; + __u64 firstuse; +}; + +struct tc_cnt { + int refcnt; + int bindcnt; +}; + +#define tc_gen \ + __u32 index; \ + __u32 capab; \ + int action; \ + int refcnt; \ + int bindcnt + +enum { + TCA_POLICE_UNSPEC, + TCA_POLICE_TBF, + TCA_POLICE_RATE, + TCA_POLICE_PEAKRATE, + TCA_POLICE_AVRATE, + TCA_POLICE_RESULT, + TCA_POLICE_TM, + TCA_POLICE_PAD, + __TCA_POLICE_MAX +#define TCA_POLICE_RESULT TCA_POLICE_RESULT +}; + +#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1) + +/* tca flags definitions */ +#define TCA_CLS_FLAGS_SKIP_HW (1 << 0) /* don't offload filter to HW */ +#define TCA_CLS_FLAGS_SKIP_SW (1 << 1) /* don't use filter in SW */ +#define TCA_CLS_FLAGS_IN_HW (1 << 2) /* filter is offloaded to HW */ +#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */ +#define TCA_CLS_FLAGS_VERBOSE (1 << 4) /* verbose logging */ + +/* U32 filters */ + +#define TC_U32_HTID(h) ((h)&0xFFF00000) +#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20) +#define TC_U32_HASH(h) (((h)>>12)&0xFF) +#define TC_U32_NODE(h) ((h)&0xFFF) +#define TC_U32_KEY(h) ((h)&0xFFFFF) +#define TC_U32_UNSPEC 0 +#define TC_U32_ROOT (0xFFF00000) + +enum { + TCA_U32_UNSPEC, + TCA_U32_CLASSID, + TCA_U32_HASH, + TCA_U32_LINK, + TCA_U32_DIVISOR, + TCA_U32_SEL, + TCA_U32_POLICE, + TCA_U32_ACT, + TCA_U32_INDEV, + TCA_U32_PCNT, + TCA_U32_MARK, + TCA_U32_FLAGS, + TCA_U32_PAD, + __TCA_U32_MAX +}; + +#define TCA_U32_MAX (__TCA_U32_MAX - 1) + +struct tc_u32_key { + __be32 mask; + __be32 val; + int off; + int offmask; +}; + +struct tc_u32_sel { + unsigned char flags; + unsigned char offshift; + unsigned char nkeys; + + __be16 offmask; + __u16 off; + short offoff; + + short hoff; + __be32 hmask; + struct tc_u32_key keys[]; +}; + +struct tc_u32_mark { + __u32 val; + __u32 mask; + __u32 success; +}; + +struct tc_u32_pcnt { + __u64 rcnt; + __u64 rhit; + __u64 kcnts[]; +}; + +/* Flags */ + +#define TC_U32_TERMINAL 1 +#define TC_U32_OFFSET 2 +#define TC_U32_VAROFFSET 4 +#define TC_U32_EAT 8 + +#define TC_U32_MAXDEPTH 8 + + +/* RSVP filter */ + +enum { + TCA_RSVP_UNSPEC, + TCA_RSVP_CLASSID, + TCA_RSVP_DST, + TCA_RSVP_SRC, + TCA_RSVP_PINFO, + TCA_RSVP_POLICE, + TCA_RSVP_ACT, + __TCA_RSVP_MAX +}; + +#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 ) + +struct tc_rsvp_gpi { + __u32 key; + __u32 mask; + int offset; +}; + +struct tc_rsvp_pinfo { + struct tc_rsvp_gpi dpi; + struct tc_rsvp_gpi spi; + __u8 protocol; + __u8 tunnelid; + __u8 tunnelhdr; + __u8 pad; +}; + +/* ROUTE filter */ + +enum { + TCA_ROUTE4_UNSPEC, + TCA_ROUTE4_CLASSID, + TCA_ROUTE4_TO, + TCA_ROUTE4_FROM, + TCA_ROUTE4_IIF, + TCA_ROUTE4_POLICE, + TCA_ROUTE4_ACT, + __TCA_ROUTE4_MAX +}; + +#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1) + + +/* FW filter */ + +enum { + TCA_FW_UNSPEC, + TCA_FW_CLASSID, + TCA_FW_POLICE, + TCA_FW_INDEV, + TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */ + TCA_FW_MASK, + __TCA_FW_MAX +}; + +#define TCA_FW_MAX (__TCA_FW_MAX - 1) + +/* TC index filter */ + +enum { + TCA_TCINDEX_UNSPEC, + TCA_TCINDEX_HASH, + TCA_TCINDEX_MASK, + TCA_TCINDEX_SHIFT, + TCA_TCINDEX_FALL_THROUGH, + TCA_TCINDEX_CLASSID, + TCA_TCINDEX_POLICE, + TCA_TCINDEX_ACT, + __TCA_TCINDEX_MAX +}; + +#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1) + +/* Flow filter */ + +enum { + FLOW_KEY_SRC, + FLOW_KEY_DST, + FLOW_KEY_PROTO, + FLOW_KEY_PROTO_SRC, + FLOW_KEY_PROTO_DST, + FLOW_KEY_IIF, + FLOW_KEY_PRIORITY, + FLOW_KEY_MARK, + FLOW_KEY_NFCT, + FLOW_KEY_NFCT_SRC, + FLOW_KEY_NFCT_DST, + FLOW_KEY_NFCT_PROTO_SRC, + FLOW_KEY_NFCT_PROTO_DST, + FLOW_KEY_RTCLASSID, + FLOW_KEY_SKUID, + FLOW_KEY_SKGID, + FLOW_KEY_VLAN_TAG, + FLOW_KEY_RXHASH, + __FLOW_KEY_MAX, +}; + +#define FLOW_KEY_MAX (__FLOW_KEY_MAX - 1) + +enum { + FLOW_MODE_MAP, + FLOW_MODE_HASH, +}; + +enum { + TCA_FLOW_UNSPEC, + TCA_FLOW_KEYS, + TCA_FLOW_MODE, + TCA_FLOW_BASECLASS, + TCA_FLOW_RSHIFT, + TCA_FLOW_ADDEND, + TCA_FLOW_MASK, + TCA_FLOW_XOR, + TCA_FLOW_DIVISOR, + TCA_FLOW_ACT, + TCA_FLOW_POLICE, + TCA_FLOW_EMATCHES, + TCA_FLOW_PERTURB, + __TCA_FLOW_MAX +}; + +#define TCA_FLOW_MAX (__TCA_FLOW_MAX - 1) + +/* Basic filter */ + +enum { + TCA_BASIC_UNSPEC, + TCA_BASIC_CLASSID, + TCA_BASIC_EMATCHES, + TCA_BASIC_ACT, + TCA_BASIC_POLICE, + __TCA_BASIC_MAX +}; + +#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1) + + +/* Cgroup classifier */ + +enum { + TCA_CGROUP_UNSPEC, + TCA_CGROUP_ACT, + TCA_CGROUP_POLICE, + TCA_CGROUP_EMATCHES, + __TCA_CGROUP_MAX, +}; + +#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1) + +/* BPF classifier */ + +#define TCA_BPF_FLAG_ACT_DIRECT (1 << 0) + +enum { + TCA_BPF_UNSPEC, + TCA_BPF_ACT, + TCA_BPF_POLICE, + TCA_BPF_CLASSID, + TCA_BPF_OPS_LEN, + TCA_BPF_OPS, + TCA_BPF_FD, + TCA_BPF_NAME, + TCA_BPF_FLAGS, + TCA_BPF_FLAGS_GEN, + TCA_BPF_TAG, + TCA_BPF_ID, + __TCA_BPF_MAX, +}; + +#define TCA_BPF_MAX (__TCA_BPF_MAX - 1) + +/* Flower classifier */ + +enum { + TCA_FLOWER_UNSPEC, + TCA_FLOWER_CLASSID, + TCA_FLOWER_INDEV, + TCA_FLOWER_ACT, + TCA_FLOWER_KEY_ETH_DST, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_DST_MASK, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_SRC, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_SRC_MASK, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_TYPE, /* be16 */ + TCA_FLOWER_KEY_IP_PROTO, /* u8 */ + TCA_FLOWER_KEY_IPV4_SRC, /* be32 */ + TCA_FLOWER_KEY_IPV4_SRC_MASK, /* be32 */ + TCA_FLOWER_KEY_IPV4_DST, /* be32 */ + TCA_FLOWER_KEY_IPV4_DST_MASK, /* be32 */ + TCA_FLOWER_KEY_IPV6_SRC, /* struct in6_addr */ + TCA_FLOWER_KEY_IPV6_SRC_MASK, /* struct in6_addr */ + TCA_FLOWER_KEY_IPV6_DST, /* struct in6_addr */ + TCA_FLOWER_KEY_IPV6_DST_MASK, /* struct in6_addr */ + TCA_FLOWER_KEY_TCP_SRC, /* be16 */ + TCA_FLOWER_KEY_TCP_DST, /* be16 */ + TCA_FLOWER_KEY_UDP_SRC, /* be16 */ + TCA_FLOWER_KEY_UDP_DST, /* be16 */ + + TCA_FLOWER_FLAGS, + TCA_FLOWER_KEY_VLAN_ID, /* be16 */ + TCA_FLOWER_KEY_VLAN_PRIO, /* u8 */ + TCA_FLOWER_KEY_VLAN_ETH_TYPE, /* be16 */ + + TCA_FLOWER_KEY_ENC_KEY_ID, /* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_SRC, /* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK,/* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_DST, /* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_DST_MASK,/* be32 */ + TCA_FLOWER_KEY_ENC_IPV6_SRC, /* struct in6_addr */ + TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK,/* struct in6_addr */ + TCA_FLOWER_KEY_ENC_IPV6_DST, /* struct in6_addr */ + TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */ + + TCA_FLOWER_KEY_TCP_SRC_MASK, /* be16 */ + TCA_FLOWER_KEY_TCP_DST_MASK, /* be16 */ + TCA_FLOWER_KEY_UDP_SRC_MASK, /* be16 */ + TCA_FLOWER_KEY_UDP_DST_MASK, /* be16 */ + TCA_FLOWER_KEY_SCTP_SRC_MASK, /* be16 */ + TCA_FLOWER_KEY_SCTP_DST_MASK, /* be16 */ + + TCA_FLOWER_KEY_SCTP_SRC, /* be16 */ + TCA_FLOWER_KEY_SCTP_DST, /* be16 */ + + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT, /* be16 */ + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */ + TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */ + TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */ + + TCA_FLOWER_KEY_FLAGS, /* be32 */ + TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */ + + TCA_FLOWER_KEY_ICMPV4_CODE, /* u8 */ + TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */ + TCA_FLOWER_KEY_ICMPV4_TYPE, /* u8 */ + TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */ + TCA_FLOWER_KEY_ICMPV6_CODE, /* u8 */ + TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */ + TCA_FLOWER_KEY_ICMPV6_TYPE, /* u8 */ + TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */ + + TCA_FLOWER_KEY_ARP_SIP, /* be32 */ + TCA_FLOWER_KEY_ARP_SIP_MASK, /* be32 */ + TCA_FLOWER_KEY_ARP_TIP, /* be32 */ + TCA_FLOWER_KEY_ARP_TIP_MASK, /* be32 */ + TCA_FLOWER_KEY_ARP_OP, /* u8 */ + TCA_FLOWER_KEY_ARP_OP_MASK, /* u8 */ + TCA_FLOWER_KEY_ARP_SHA, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_SHA_MASK, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_THA, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_THA_MASK, /* ETH_ALEN */ + + TCA_FLOWER_KEY_MPLS_TTL, /* u8 - 8 bits */ + TCA_FLOWER_KEY_MPLS_BOS, /* u8 - 1 bit */ + TCA_FLOWER_KEY_MPLS_TC, /* u8 - 3 bits */ + TCA_FLOWER_KEY_MPLS_LABEL, /* be32 - 20 bits */ + + TCA_FLOWER_KEY_TCP_FLAGS, /* be16 */ + TCA_FLOWER_KEY_TCP_FLAGS_MASK, /* be16 */ + + TCA_FLOWER_KEY_IP_TOS, /* u8 */ + TCA_FLOWER_KEY_IP_TOS_MASK, /* u8 */ + TCA_FLOWER_KEY_IP_TTL, /* u8 */ + TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */ + + TCA_FLOWER_KEY_CVLAN_ID, /* be16 */ + TCA_FLOWER_KEY_CVLAN_PRIO, /* u8 */ + TCA_FLOWER_KEY_CVLAN_ETH_TYPE, /* be16 */ + + TCA_FLOWER_KEY_ENC_IP_TOS, /* u8 */ + TCA_FLOWER_KEY_ENC_IP_TOS_MASK, /* u8 */ + TCA_FLOWER_KEY_ENC_IP_TTL, /* u8 */ + TCA_FLOWER_KEY_ENC_IP_TTL_MASK, /* u8 */ + + TCA_FLOWER_KEY_ENC_OPTS, + TCA_FLOWER_KEY_ENC_OPTS_MASK, + + TCA_FLOWER_IN_HW_COUNT, + + __TCA_FLOWER_MAX, +}; + +#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1) + +enum { + TCA_FLOWER_KEY_ENC_OPTS_UNSPEC, + TCA_FLOWER_KEY_ENC_OPTS_GENEVE, /* Nested + * TCA_FLOWER_KEY_ENC_OPT_GENEVE_ + * attributes + */ + __TCA_FLOWER_KEY_ENC_OPTS_MAX, +}; + +#define TCA_FLOWER_KEY_ENC_OPTS_MAX (__TCA_FLOWER_KEY_ENC_OPTS_MAX - 1) + +enum { + TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS, /* u16 */ + TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE, /* u8 */ + TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA, /* 4 to 128 bytes */ + + __TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX, +}; + +#define TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX \ + (__TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX - 1) + +enum { + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0), + TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1), +}; + +/* Match-all classifier */ + +enum { + TCA_MATCHALL_UNSPEC, + TCA_MATCHALL_CLASSID, + TCA_MATCHALL_ACT, + TCA_MATCHALL_FLAGS, + __TCA_MATCHALL_MAX, +}; + +#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1) + +/* Extended Matches */ + +struct tcf_ematch_tree_hdr { + __u16 nmatches; + __u16 progid; +}; + +enum { + TCA_EMATCH_TREE_UNSPEC, + TCA_EMATCH_TREE_HDR, + TCA_EMATCH_TREE_LIST, + __TCA_EMATCH_TREE_MAX +}; +#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1) + +struct tcf_ematch_hdr { + __u16 matchid; + __u16 kind; + __u16 flags; + __u16 pad; /* currently unused */ +}; + +/* 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-----------------------+-+-+---+ + * | Unused |S|I| R | + * +-----------------------+-+-+---+ + * + * R(2) ::= relation to next ematch + * where: 0 0 END (last ematch) + * 0 1 AND + * 1 0 OR + * 1 1 Unused (invalid) + * I(1) ::= invert result + * S(1) ::= simple payload + */ +#define TCF_EM_REL_END 0 +#define TCF_EM_REL_AND (1<<0) +#define TCF_EM_REL_OR (1<<1) +#define TCF_EM_INVERT (1<<2) +#define TCF_EM_SIMPLE (1<<3) + +#define TCF_EM_REL_MASK 3 +#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK) + +enum { + TCF_LAYER_LINK, + TCF_LAYER_NETWORK, + TCF_LAYER_TRANSPORT, + __TCF_LAYER_MAX +}; +#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1) + +/* Ematch type assignments + * 1..32767 Reserved for ematches inside kernel tree + * 32768..65535 Free to use, not reliable + */ +#define TCF_EM_CONTAINER 0 +#define TCF_EM_CMP 1 +#define TCF_EM_NBYTE 2 +#define TCF_EM_U32 3 +#define TCF_EM_META 4 +#define TCF_EM_TEXT 5 +#define TCF_EM_VLAN 6 +#define TCF_EM_CANID 7 +#define TCF_EM_IPSET 8 +#define TCF_EM_IPT 9 +#define TCF_EM_MAX 9 + +enum { + TCF_EM_PROG_TC +}; + +enum { + TCF_EM_OPND_EQ, + TCF_EM_OPND_GT, + TCF_EM_OPND_LT +}; + +#endif diff --git a/bpftool/libbpf/include/uapi/linux/pkt_sched.h b/bpftool/libbpf/include/uapi/linux/pkt_sched.h new file mode 100644 index 0000000..5c903ab --- /dev/null +++ b/bpftool/libbpf/include/uapi/linux/pkt_sched.h @@ -0,0 +1,1164 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __LINUX_PKT_SCHED_H +#define __LINUX_PKT_SCHED_H + +#include + +/* Logical priority bands not depending on specific packet scheduler. + Every scheduler will map them to real traffic classes, if it has + no more precise mechanism to classify packets. + + These numbers have no special meaning, though their coincidence + with obsolete IPv6 values is not occasional :-). New IPv6 drafts + preferred full anarchy inspired by diffserv group. + + Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy + class, actually, as rule it will be handled with more care than + filler or even bulk. + */ + +#define TC_PRIO_BESTEFFORT 0 +#define TC_PRIO_FILLER 1 +#define TC_PRIO_BULK 2 +#define TC_PRIO_INTERACTIVE_BULK 4 +#define TC_PRIO_INTERACTIVE 6 +#define TC_PRIO_CONTROL 7 + +#define TC_PRIO_MAX 15 + +/* Generic queue statistics, available for all the elements. + Particular schedulers may have also their private records. + */ + +struct tc_stats { + __u64 bytes; /* Number of enqueued bytes */ + __u32 packets; /* Number of enqueued packets */ + __u32 drops; /* Packets dropped because of lack of resources */ + __u32 overlimits; /* Number of throttle events when this + * flow goes out of allocated bandwidth */ + __u32 bps; /* Current flow byte rate */ + __u32 pps; /* Current flow packet rate */ + __u32 qlen; + __u32 backlog; +}; + +struct tc_estimator { + signed char interval; + unsigned char ewma_log; +}; + +/* "Handles" + --------- + + All the traffic control objects have 32bit identifiers, or "handles". + + They can be considered as opaque numbers from user API viewpoint, + but actually they always consist of two fields: major and + minor numbers, which are interpreted by kernel specially, + that may be used by applications, though not recommended. + + F.e. qdisc handles always have minor number equal to zero, + classes (or flows) have major equal to parent qdisc major, and + minor uniquely identifying class inside qdisc. + + Macros to manipulate handles: + */ + +#define TC_H_MAJ_MASK (0xFFFF0000U) +#define TC_H_MIN_MASK (0x0000FFFFU) +#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK) +#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK) +#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK)) + +#define TC_H_UNSPEC (0U) +#define TC_H_ROOT (0xFFFFFFFFU) +#define TC_H_INGRESS (0xFFFFFFF1U) +#define TC_H_CLSACT TC_H_INGRESS + +#define TC_H_MIN_PRIORITY 0xFFE0U +#define TC_H_MIN_INGRESS 0xFFF2U +#define TC_H_MIN_EGRESS 0xFFF3U + +/* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */ +enum tc_link_layer { + TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */ + TC_LINKLAYER_ETHERNET, + TC_LINKLAYER_ATM, +}; +#define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */ + +struct tc_ratespec { + unsigned char cell_log; + __u8 linklayer; /* lower 4 bits */ + unsigned short overhead; + short cell_align; + unsigned short mpu; + __u32 rate; +}; + +#define TC_RTAB_SIZE 1024 + +struct tc_sizespec { + unsigned char cell_log; + unsigned char size_log; + short cell_align; + int overhead; + unsigned int linklayer; + unsigned int mpu; + unsigned int mtu; + unsigned int tsize; +}; + +enum { + TCA_STAB_UNSPEC, + TCA_STAB_BASE, + TCA_STAB_DATA, + __TCA_STAB_MAX +}; + +#define TCA_STAB_MAX (__TCA_STAB_MAX - 1) + +/* FIFO section */ + +struct tc_fifo_qopt { + __u32 limit; /* Queue length: bytes for bfifo, packets for pfifo */ +}; + +/* SKBPRIO section */ + +/* + * Priorities go from zero to (SKBPRIO_MAX_PRIORITY - 1). + * SKBPRIO_MAX_PRIORITY should be at least 64 in order for skbprio to be able + * to map one to one the DS field of IPV4 and IPV6 headers. + * Memory allocation grows linearly with SKBPRIO_MAX_PRIORITY. + */ + +#define SKBPRIO_MAX_PRIORITY 64 + +struct tc_skbprio_qopt { + __u32 limit; /* Queue length in packets. */ +}; + +/* PRIO section */ + +#define TCQ_PRIO_BANDS 16 +#define TCQ_MIN_PRIO_BANDS 2 + +struct tc_prio_qopt { + int bands; /* Number of bands */ + __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ +}; + +/* MULTIQ section */ + +struct tc_multiq_qopt { + __u16 bands; /* Number of bands */ + __u16 max_bands; /* Maximum number of queues */ +}; + +/* PLUG section */ + +#define TCQ_PLUG_BUFFER 0 +#define TCQ_PLUG_RELEASE_ONE 1 +#define TCQ_PLUG_RELEASE_INDEFINITE 2 +#define TCQ_PLUG_LIMIT 3 + +struct tc_plug_qopt { + /* TCQ_PLUG_BUFFER: Inset a plug into the queue and + * buffer any incoming packets + * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head + * to beginning of the next plug. + * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue. + * Stop buffering packets until the next TCQ_PLUG_BUFFER + * command is received (just act as a pass-thru queue). + * TCQ_PLUG_LIMIT: Increase/decrease queue size + */ + int action; + __u32 limit; +}; + +/* TBF section */ + +struct tc_tbf_qopt { + struct tc_ratespec rate; + struct tc_ratespec peakrate; + __u32 limit; + __u32 buffer; + __u32 mtu; +}; + +enum { + TCA_TBF_UNSPEC, + TCA_TBF_PARMS, + TCA_TBF_RTAB, + TCA_TBF_PTAB, + TCA_TBF_RATE64, + TCA_TBF_PRATE64, + TCA_TBF_BURST, + TCA_TBF_PBURST, + TCA_TBF_PAD, + __TCA_TBF_MAX, +}; + +#define TCA_TBF_MAX (__TCA_TBF_MAX - 1) + + +/* TEQL section */ + +/* TEQL does not require any parameters */ + +/* SFQ section */ + +struct tc_sfq_qopt { + unsigned quantum; /* Bytes per round allocated to flow */ + int perturb_period; /* Period of hash perturbation */ + __u32 limit; /* Maximal packets in queue */ + unsigned divisor; /* Hash divisor */ + unsigned flows; /* Maximal number of flows */ +}; + +struct tc_sfqred_stats { + __u32 prob_drop; /* Early drops, below max threshold */ + __u32 forced_drop; /* Early drops, after max threshold */ + __u32 prob_mark; /* Marked packets, below max threshold */ + __u32 forced_mark; /* Marked packets, after max threshold */ + __u32 prob_mark_head; /* Marked packets, below max threshold */ + __u32 forced_mark_head;/* Marked packets, after max threshold */ +}; + +struct tc_sfq_qopt_v1 { + struct tc_sfq_qopt v0; + unsigned int depth; /* max number of packets per flow */ + unsigned int headdrop; +/* SFQRED parameters */ + __u32 limit; /* HARD maximal flow queue length (bytes) */ + __u32 qth_min; /* Min average length threshold (bytes) */ + __u32 qth_max; /* Max average length threshold (bytes) */ + unsigned char Wlog; /* log(W) */ + unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ + unsigned char Scell_log; /* cell size for idle damping */ + unsigned char flags; + __u32 max_P; /* probability, high resolution */ +/* SFQRED stats */ + struct tc_sfqred_stats stats; +}; + + +struct tc_sfq_xstats { + __s32 allot; +}; + +/* RED section */ + +enum { + TCA_RED_UNSPEC, + TCA_RED_PARMS, + TCA_RED_STAB, + TCA_RED_MAX_P, + __TCA_RED_MAX, +}; + +#define TCA_RED_MAX (__TCA_RED_MAX - 1) + +struct tc_red_qopt { + __u32 limit; /* HARD maximal queue length (bytes) */ + __u32 qth_min; /* Min average length threshold (bytes) */ + __u32 qth_max; /* Max average length threshold (bytes) */ + unsigned char Wlog; /* log(W) */ + unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ + unsigned char Scell_log; /* cell size for idle damping */ + unsigned char flags; +#define TC_RED_ECN 1 +#define TC_RED_HARDDROP 2 +#define TC_RED_ADAPTATIVE 4 +}; + +struct tc_red_xstats { + __u32 early; /* Early drops */ + __u32 pdrop; /* Drops due to queue limits */ + __u32 other; /* Drops due to drop() calls */ + __u32 marked; /* Marked packets */ +}; + +/* GRED section */ + +#define MAX_DPs 16 + +enum { + TCA_GRED_UNSPEC, + TCA_GRED_PARMS, + TCA_GRED_STAB, + TCA_GRED_DPS, + TCA_GRED_MAX_P, + TCA_GRED_LIMIT, + TCA_GRED_VQ_LIST, /* nested TCA_GRED_VQ_ENTRY */ + __TCA_GRED_MAX, +}; + +#define TCA_GRED_MAX (__TCA_GRED_MAX - 1) + +enum { + TCA_GRED_VQ_ENTRY_UNSPEC, + TCA_GRED_VQ_ENTRY, /* nested TCA_GRED_VQ_* */ + __TCA_GRED_VQ_ENTRY_MAX, +}; +#define TCA_GRED_VQ_ENTRY_MAX (__TCA_GRED_VQ_ENTRY_MAX - 1) + +enum { + TCA_GRED_VQ_UNSPEC, + TCA_GRED_VQ_PAD, + TCA_GRED_VQ_DP, /* u32 */ + TCA_GRED_VQ_STAT_BYTES, /* u64 */ + TCA_GRED_VQ_STAT_PACKETS, /* u32 */ + TCA_GRED_VQ_STAT_BACKLOG, /* u32 */ + TCA_GRED_VQ_STAT_PROB_DROP, /* u32 */ + TCA_GRED_VQ_STAT_PROB_MARK, /* u32 */ + TCA_GRED_VQ_STAT_FORCED_DROP, /* u32 */ + TCA_GRED_VQ_STAT_FORCED_MARK, /* u32 */ + TCA_GRED_VQ_STAT_PDROP, /* u32 */ + TCA_GRED_VQ_STAT_OTHER, /* u32 */ + TCA_GRED_VQ_FLAGS, /* u32 */ + __TCA_GRED_VQ_MAX +}; + +#define TCA_GRED_VQ_MAX (__TCA_GRED_VQ_MAX - 1) + +struct tc_gred_qopt { + __u32 limit; /* HARD maximal queue length (bytes) */ + __u32 qth_min; /* Min average length threshold (bytes) */ + __u32 qth_max; /* Max average length threshold (bytes) */ + __u32 DP; /* up to 2^32 DPs */ + __u32 backlog; + __u32 qave; + __u32 forced; + __u32 early; + __u32 other; + __u32 pdrop; + __u8 Wlog; /* log(W) */ + __u8 Plog; /* log(P_max/(qth_max-qth_min)) */ + __u8 Scell_log; /* cell size for idle damping */ + __u8 prio; /* prio of this VQ */ + __u32 packets; + __u32 bytesin; +}; + +/* gred setup */ +struct tc_gred_sopt { + __u32 DPs; + __u32 def_DP; + __u8 grio; + __u8 flags; + __u16 pad1; +}; + +/* CHOKe section */ + +enum { + TCA_CHOKE_UNSPEC, + TCA_CHOKE_PARMS, + TCA_CHOKE_STAB, + TCA_CHOKE_MAX_P, + __TCA_CHOKE_MAX, +}; + +#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1) + +struct tc_choke_qopt { + __u32 limit; /* Hard queue length (packets) */ + __u32 qth_min; /* Min average threshold (packets) */ + __u32 qth_max; /* Max average threshold (packets) */ + unsigned char Wlog; /* log(W) */ + unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ + unsigned char Scell_log; /* cell size for idle damping */ + unsigned char flags; /* see RED flags */ +}; + +struct tc_choke_xstats { + __u32 early; /* Early drops */ + __u32 pdrop; /* Drops due to queue limits */ + __u32 other; /* Drops due to drop() calls */ + __u32 marked; /* Marked packets */ + __u32 matched; /* Drops due to flow match */ +}; + +/* HTB section */ +#define TC_HTB_NUMPRIO 8 +#define TC_HTB_MAXDEPTH 8 +#define TC_HTB_PROTOVER 3 /* the same as HTB and TC's major */ + +struct tc_htb_opt { + struct tc_ratespec rate; + struct tc_ratespec ceil; + __u32 buffer; + __u32 cbuffer; + __u32 quantum; + __u32 level; /* out only */ + __u32 prio; +}; +struct tc_htb_glob { + __u32 version; /* to match HTB/TC */ + __u32 rate2quantum; /* bps->quantum divisor */ + __u32 defcls; /* default class number */ + __u32 debug; /* debug flags */ + + /* stats */ + __u32 direct_pkts; /* count of non shaped packets */ +}; +enum { + TCA_HTB_UNSPEC, + TCA_HTB_PARMS, + TCA_HTB_INIT, + TCA_HTB_CTAB, + TCA_HTB_RTAB, + TCA_HTB_DIRECT_QLEN, + TCA_HTB_RATE64, + TCA_HTB_CEIL64, + TCA_HTB_PAD, + TCA_HTB_OFFLOAD, + __TCA_HTB_MAX, +}; + +#define TCA_HTB_MAX (__TCA_HTB_MAX - 1) + +struct tc_htb_xstats { + __u32 lends; + __u32 borrows; + __u32 giants; /* unused since 'Make HTB scheduler work with TSO.' */ + __s32 tokens; + __s32 ctokens; +}; + +/* HFSC section */ + +struct tc_hfsc_qopt { + __u16 defcls; /* default class */ +}; + +struct tc_service_curve { + __u32 m1; /* slope of the first segment in bps */ + __u32 d; /* x-projection of the first segment in us */ + __u32 m2; /* slope of the second segment in bps */ +}; + +struct tc_hfsc_stats { + __u64 work; /* total work done */ + __u64 rtwork; /* work done by real-time criteria */ + __u32 period; /* current period */ + __u32 level; /* class level in hierarchy */ +}; + +enum { + TCA_HFSC_UNSPEC, + TCA_HFSC_RSC, + TCA_HFSC_FSC, + TCA_HFSC_USC, + __TCA_HFSC_MAX, +}; + +#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1) + + +/* CBQ section */ + +#define TC_CBQ_MAXPRIO 8 +#define TC_CBQ_MAXLEVEL 8 +#define TC_CBQ_DEF_EWMA 5 + +struct tc_cbq_lssopt { + unsigned char change; + unsigned char flags; +#define TCF_CBQ_LSS_BOUNDED 1 +#define TCF_CBQ_LSS_ISOLATED 2 + unsigned char ewma_log; + unsigned char level; +#define TCF_CBQ_LSS_FLAGS 1 +#define TCF_CBQ_LSS_EWMA 2 +#define TCF_CBQ_LSS_MAXIDLE 4 +#define TCF_CBQ_LSS_MINIDLE 8 +#define TCF_CBQ_LSS_OFFTIME 0x10 +#define TCF_CBQ_LSS_AVPKT 0x20 + __u32 maxidle; + __u32 minidle; + __u32 offtime; + __u32 avpkt; +}; + +struct tc_cbq_wrropt { + unsigned char flags; + unsigned char priority; + unsigned char cpriority; + unsigned char __reserved; + __u32 allot; + __u32 weight; +}; + +struct tc_cbq_ovl { + unsigned char strategy; +#define TC_CBQ_OVL_CLASSIC 0 +#define TC_CBQ_OVL_DELAY 1 +#define TC_CBQ_OVL_LOWPRIO 2 +#define TC_CBQ_OVL_DROP 3 +#define TC_CBQ_OVL_RCLASSIC 4 + unsigned char priority2; + __u16 pad; + __u32 penalty; +}; + +struct tc_cbq_police { + unsigned char police; + unsigned char __res1; + unsigned short __res2; +}; + +struct tc_cbq_fopt { + __u32 split; + __u32 defmap; + __u32 defchange; +}; + +struct tc_cbq_xstats { + __u32 borrows; + __u32 overactions; + __s32 avgidle; + __s32 undertime; +}; + +enum { + TCA_CBQ_UNSPEC, + TCA_CBQ_LSSOPT, + TCA_CBQ_WRROPT, + TCA_CBQ_FOPT, + TCA_CBQ_OVL_STRATEGY, + TCA_CBQ_RATE, + TCA_CBQ_RTAB, + TCA_CBQ_POLICE, + __TCA_CBQ_MAX, +}; + +#define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1) + +/* dsmark section */ + +enum { + TCA_DSMARK_UNSPEC, + TCA_DSMARK_INDICES, + TCA_DSMARK_DEFAULT_INDEX, + TCA_DSMARK_SET_TC_INDEX, + TCA_DSMARK_MASK, + TCA_DSMARK_VALUE, + __TCA_DSMARK_MAX, +}; + +#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1) + +/* ATM section */ + +enum { + TCA_ATM_UNSPEC, + TCA_ATM_FD, /* file/socket descriptor */ + TCA_ATM_PTR, /* pointer to descriptor - later */ + TCA_ATM_HDR, /* LL header */ + TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ + TCA_ATM_ADDR, /* PVC address (for output only) */ + TCA_ATM_STATE, /* VC state (ATM_VS_*; for output only) */ + __TCA_ATM_MAX, +}; + +#define TCA_ATM_MAX (__TCA_ATM_MAX - 1) + +/* Network emulator */ + +enum { + TCA_NETEM_UNSPEC, + TCA_NETEM_CORR, + TCA_NETEM_DELAY_DIST, + TCA_NETEM_REORDER, + TCA_NETEM_CORRUPT, + TCA_NETEM_LOSS, + TCA_NETEM_RATE, + TCA_NETEM_ECN, + TCA_NETEM_RATE64, + TCA_NETEM_PAD, + TCA_NETEM_LATENCY64, + TCA_NETEM_JITTER64, + TCA_NETEM_SLOT, + TCA_NETEM_SLOT_DIST, + __TCA_NETEM_MAX, +}; + +#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1) + +struct tc_netem_qopt { + __u32 latency; /* added delay (us) */ + __u32 limit; /* fifo limit (packets) */ + __u32 loss; /* random packet loss (0=none ~0=100%) */ + __u32 gap; /* re-ordering gap (0 for none) */ + __u32 duplicate; /* random packet dup (0=none ~0=100%) */ + __u32 jitter; /* random jitter in latency (us) */ +}; + +struct tc_netem_corr { + __u32 delay_corr; /* delay correlation */ + __u32 loss_corr; /* packet loss correlation */ + __u32 dup_corr; /* duplicate correlation */ +}; + +struct tc_netem_reorder { + __u32 probability; + __u32 correlation; +}; + +struct tc_netem_corrupt { + __u32 probability; + __u32 correlation; +}; + +struct tc_netem_rate { + __u32 rate; /* byte/s */ + __s32 packet_overhead; + __u32 cell_size; + __s32 cell_overhead; +}; + +struct tc_netem_slot { + __s64 min_delay; /* nsec */ + __s64 max_delay; + __s32 max_packets; + __s32 max_bytes; + __s64 dist_delay; /* nsec */ + __s64 dist_jitter; /* nsec */ +}; + +enum { + NETEM_LOSS_UNSPEC, + NETEM_LOSS_GI, /* General Intuitive - 4 state model */ + NETEM_LOSS_GE, /* Gilbert Elliot models */ + __NETEM_LOSS_MAX +}; +#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1) + +/* State transition probabilities for 4 state model */ +struct tc_netem_gimodel { + __u32 p13; + __u32 p31; + __u32 p32; + __u32 p14; + __u32 p23; +}; + +/* Gilbert-Elliot models */ +struct tc_netem_gemodel { + __u32 p; + __u32 r; + __u32 h; + __u32 k1; +}; + +#define NETEM_DIST_SCALE 8192 +#define NETEM_DIST_MAX 16384 + +/* DRR */ + +enum { + TCA_DRR_UNSPEC, + TCA_DRR_QUANTUM, + __TCA_DRR_MAX +}; + +#define TCA_DRR_MAX (__TCA_DRR_MAX - 1) + +struct tc_drr_stats { + __u32 deficit; +}; + +/* MQPRIO */ +#define TC_QOPT_BITMASK 15 +#define TC_QOPT_MAX_QUEUE 16 + +enum { + TC_MQPRIO_HW_OFFLOAD_NONE, /* no offload requested */ + TC_MQPRIO_HW_OFFLOAD_TCS, /* offload TCs, no queue counts */ + __TC_MQPRIO_HW_OFFLOAD_MAX +}; + +#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1) + +enum { + TC_MQPRIO_MODE_DCB, + TC_MQPRIO_MODE_CHANNEL, + __TC_MQPRIO_MODE_MAX +}; + +#define __TC_MQPRIO_MODE_MAX (__TC_MQPRIO_MODE_MAX - 1) + +enum { + TC_MQPRIO_SHAPER_DCB, + TC_MQPRIO_SHAPER_BW_RATE, /* Add new shapers below */ + __TC_MQPRIO_SHAPER_MAX +}; + +#define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1) + +struct tc_mqprio_qopt { + __u8 num_tc; + __u8 prio_tc_map[TC_QOPT_BITMASK + 1]; + __u8 hw; + __u16 count[TC_QOPT_MAX_QUEUE]; + __u16 offset[TC_QOPT_MAX_QUEUE]; +}; + +#define TC_MQPRIO_F_MODE 0x1 +#define TC_MQPRIO_F_SHAPER 0x2 +#define TC_MQPRIO_F_MIN_RATE 0x4 +#define TC_MQPRIO_F_MAX_RATE 0x8 + +enum { + TCA_MQPRIO_UNSPEC, + TCA_MQPRIO_MODE, + TCA_MQPRIO_SHAPER, + TCA_MQPRIO_MIN_RATE64, + TCA_MQPRIO_MAX_RATE64, + __TCA_MQPRIO_MAX, +}; + +#define TCA_MQPRIO_MAX (__TCA_MQPRIO_MAX - 1) + +/* SFB */ + +enum { + TCA_SFB_UNSPEC, + TCA_SFB_PARMS, + __TCA_SFB_MAX, +}; + +#define TCA_SFB_MAX (__TCA_SFB_MAX - 1) + +/* + * Note: increment, decrement are Q0.16 fixed-point values. + */ +struct tc_sfb_qopt { + __u32 rehash_interval; /* delay between hash move, in ms */ + __u32 warmup_time; /* double buffering warmup time in ms (warmup_time < rehash_interval) */ + __u32 max; /* max len of qlen_min */ + __u32 bin_size; /* maximum queue length per bin */ + __u32 increment; /* probability increment, (d1 in Blue) */ + __u32 decrement; /* probability decrement, (d2 in Blue) */ + __u32 limit; /* max SFB queue length */ + __u32 penalty_rate; /* inelastic flows are rate limited to 'rate' pps */ + __u32 penalty_burst; +}; + +struct tc_sfb_xstats { + __u32 earlydrop; + __u32 penaltydrop; + __u32 bucketdrop; + __u32 queuedrop; + __u32 childdrop; /* drops in child qdisc */ + __u32 marked; + __u32 maxqlen; + __u32 maxprob; + __u32 avgprob; +}; + +#define SFB_MAX_PROB 0xFFFF + +/* QFQ */ +enum { + TCA_QFQ_UNSPEC, + TCA_QFQ_WEIGHT, + TCA_QFQ_LMAX, + __TCA_QFQ_MAX +}; + +#define TCA_QFQ_MAX (__TCA_QFQ_MAX - 1) + +struct tc_qfq_stats { + __u32 weight; + __u32 lmax; +}; + +/* CODEL */ + +enum { + TCA_CODEL_UNSPEC, + TCA_CODEL_TARGET, + TCA_CODEL_LIMIT, + TCA_CODEL_INTERVAL, + TCA_CODEL_ECN, + TCA_CODEL_CE_THRESHOLD, + __TCA_CODEL_MAX +}; + +#define TCA_CODEL_MAX (__TCA_CODEL_MAX - 1) + +struct tc_codel_xstats { + __u32 maxpacket; /* largest packet we've seen so far */ + __u32 count; /* how many drops we've done since the last time we + * entered dropping state + */ + __u32 lastcount; /* count at entry to dropping state */ + __u32 ldelay; /* in-queue delay seen by most recently dequeued packet */ + __s32 drop_next; /* time to drop next packet */ + __u32 drop_overlimit; /* number of time max qdisc packet limit was hit */ + __u32 ecn_mark; /* number of packets we ECN marked instead of dropped */ + __u32 dropping; /* are we in dropping state ? */ + __u32 ce_mark; /* number of CE marked packets because of ce_threshold */ +}; + +/* FQ_CODEL */ + +enum { + TCA_FQ_CODEL_UNSPEC, + TCA_FQ_CODEL_TARGET, + TCA_FQ_CODEL_LIMIT, + TCA_FQ_CODEL_INTERVAL, + TCA_FQ_CODEL_ECN, + TCA_FQ_CODEL_FLOWS, + TCA_FQ_CODEL_QUANTUM, + TCA_FQ_CODEL_CE_THRESHOLD, + TCA_FQ_CODEL_DROP_BATCH_SIZE, + TCA_FQ_CODEL_MEMORY_LIMIT, + __TCA_FQ_CODEL_MAX +}; + +#define TCA_FQ_CODEL_MAX (__TCA_FQ_CODEL_MAX - 1) + +enum { + TCA_FQ_CODEL_XSTATS_QDISC, + TCA_FQ_CODEL_XSTATS_CLASS, +}; + +struct tc_fq_codel_qd_stats { + __u32 maxpacket; /* largest packet we've seen so far */ + __u32 drop_overlimit; /* number of time max qdisc + * packet limit was hit + */ + __u32 ecn_mark; /* number of packets we ECN marked + * instead of being dropped + */ + __u32 new_flow_count; /* number of time packets + * created a 'new flow' + */ + __u32 new_flows_len; /* count of flows in new list */ + __u32 old_flows_len; /* count of flows in old list */ + __u32 ce_mark; /* packets above ce_threshold */ + __u32 memory_usage; /* in bytes */ + __u32 drop_overmemory; +}; + +struct tc_fq_codel_cl_stats { + __s32 deficit; + __u32 ldelay; /* in-queue delay seen by most recently + * dequeued packet + */ + __u32 count; + __u32 lastcount; + __u32 dropping; + __s32 drop_next; +}; + +struct tc_fq_codel_xstats { + __u32 type; + union { + struct tc_fq_codel_qd_stats qdisc_stats; + struct tc_fq_codel_cl_stats class_stats; + }; +}; + +/* FQ */ + +enum { + TCA_FQ_UNSPEC, + + TCA_FQ_PLIMIT, /* limit of total number of packets in queue */ + + TCA_FQ_FLOW_PLIMIT, /* limit of packets per flow */ + + TCA_FQ_QUANTUM, /* RR quantum */ + + TCA_FQ_INITIAL_QUANTUM, /* RR quantum for new flow */ + + TCA_FQ_RATE_ENABLE, /* enable/disable rate limiting */ + + TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */ + + TCA_FQ_FLOW_MAX_RATE, /* per flow max rate */ + + TCA_FQ_BUCKETS_LOG, /* log2(number of buckets) */ + + TCA_FQ_FLOW_REFILL_DELAY, /* flow credit refill delay in usec */ + + TCA_FQ_ORPHAN_MASK, /* mask applied to orphaned skb hashes */ + + TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */ + + TCA_FQ_CE_THRESHOLD, /* DCTCP-like CE-marking threshold */ + + __TCA_FQ_MAX +}; + +#define TCA_FQ_MAX (__TCA_FQ_MAX - 1) + +struct tc_fq_qd_stats { + __u64 gc_flows; + __u64 highprio_packets; + __u64 tcp_retrans; + __u64 throttled; + __u64 flows_plimit; + __u64 pkts_too_long; + __u64 allocation_errors; + __s64 time_next_delayed_flow; + __u32 flows; + __u32 inactive_flows; + __u32 throttled_flows; + __u32 unthrottle_latency_ns; + __u64 ce_mark; /* packets above ce_threshold */ +}; + +/* Heavy-Hitter Filter */ + +enum { + TCA_HHF_UNSPEC, + TCA_HHF_BACKLOG_LIMIT, + TCA_HHF_QUANTUM, + TCA_HHF_HH_FLOWS_LIMIT, + TCA_HHF_RESET_TIMEOUT, + TCA_HHF_ADMIT_BYTES, + TCA_HHF_EVICT_TIMEOUT, + TCA_HHF_NON_HH_WEIGHT, + __TCA_HHF_MAX +}; + +#define TCA_HHF_MAX (__TCA_HHF_MAX - 1) + +struct tc_hhf_xstats { + __u32 drop_overlimit; /* number of times max qdisc packet limit + * was hit + */ + __u32 hh_overlimit; /* number of times max heavy-hitters was hit */ + __u32 hh_tot_count; /* number of captured heavy-hitters so far */ + __u32 hh_cur_count; /* number of current heavy-hitters */ +}; + +/* PIE */ +enum { + TCA_PIE_UNSPEC, + TCA_PIE_TARGET, + TCA_PIE_LIMIT, + TCA_PIE_TUPDATE, + TCA_PIE_ALPHA, + TCA_PIE_BETA, + TCA_PIE_ECN, + TCA_PIE_BYTEMODE, + __TCA_PIE_MAX +}; +#define TCA_PIE_MAX (__TCA_PIE_MAX - 1) + +struct tc_pie_xstats { + __u32 prob; /* current probability */ + __u32 delay; /* current delay in ms */ + __u32 avg_dq_rate; /* current average dq_rate in bits/pie_time */ + __u32 packets_in; /* total number of packets enqueued */ + __u32 dropped; /* packets dropped due to pie_action */ + __u32 overlimit; /* dropped due to lack of space in queue */ + __u32 maxq; /* maximum queue size */ + __u32 ecn_mark; /* packets marked with ecn*/ +}; + +/* CBS */ +struct tc_cbs_qopt { + __u8 offload; + __u8 _pad[3]; + __s32 hicredit; + __s32 locredit; + __s32 idleslope; + __s32 sendslope; +}; + +enum { + TCA_CBS_UNSPEC, + TCA_CBS_PARMS, + __TCA_CBS_MAX, +}; + +#define TCA_CBS_MAX (__TCA_CBS_MAX - 1) + + +/* ETF */ +struct tc_etf_qopt { + __s32 delta; + __s32 clockid; + __u32 flags; +#define TC_ETF_DEADLINE_MODE_ON BIT(0) +#define TC_ETF_OFFLOAD_ON BIT(1) +}; + +enum { + TCA_ETF_UNSPEC, + TCA_ETF_PARMS, + __TCA_ETF_MAX, +}; + +#define TCA_ETF_MAX (__TCA_ETF_MAX - 1) + + +/* CAKE */ +enum { + TCA_CAKE_UNSPEC, + TCA_CAKE_PAD, + TCA_CAKE_BASE_RATE64, + TCA_CAKE_DIFFSERV_MODE, + TCA_CAKE_ATM, + TCA_CAKE_FLOW_MODE, + TCA_CAKE_OVERHEAD, + TCA_CAKE_RTT, + TCA_CAKE_TARGET, + TCA_CAKE_AUTORATE, + TCA_CAKE_MEMORY, + TCA_CAKE_NAT, + TCA_CAKE_RAW, + TCA_CAKE_WASH, + TCA_CAKE_MPU, + TCA_CAKE_INGRESS, + TCA_CAKE_ACK_FILTER, + TCA_CAKE_SPLIT_GSO, + __TCA_CAKE_MAX +}; +#define TCA_CAKE_MAX (__TCA_CAKE_MAX - 1) + +enum { + __TCA_CAKE_STATS_INVALID, + TCA_CAKE_STATS_PAD, + TCA_CAKE_STATS_CAPACITY_ESTIMATE64, + TCA_CAKE_STATS_MEMORY_LIMIT, + TCA_CAKE_STATS_MEMORY_USED, + TCA_CAKE_STATS_AVG_NETOFF, + TCA_CAKE_STATS_MIN_NETLEN, + TCA_CAKE_STATS_MAX_NETLEN, + TCA_CAKE_STATS_MIN_ADJLEN, + TCA_CAKE_STATS_MAX_ADJLEN, + TCA_CAKE_STATS_TIN_STATS, + TCA_CAKE_STATS_DEFICIT, + TCA_CAKE_STATS_COBALT_COUNT, + TCA_CAKE_STATS_DROPPING, + TCA_CAKE_STATS_DROP_NEXT_US, + TCA_CAKE_STATS_P_DROP, + TCA_CAKE_STATS_BLUE_TIMER_US, + __TCA_CAKE_STATS_MAX +}; +#define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1) + +enum { + __TCA_CAKE_TIN_STATS_INVALID, + TCA_CAKE_TIN_STATS_PAD, + TCA_CAKE_TIN_STATS_SENT_PACKETS, + TCA_CAKE_TIN_STATS_SENT_BYTES64, + TCA_CAKE_TIN_STATS_DROPPED_PACKETS, + TCA_CAKE_TIN_STATS_DROPPED_BYTES64, + TCA_CAKE_TIN_STATS_ACKS_DROPPED_PACKETS, + TCA_CAKE_TIN_STATS_ACKS_DROPPED_BYTES64, + TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS, + TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64, + TCA_CAKE_TIN_STATS_BACKLOG_PACKETS, + TCA_CAKE_TIN_STATS_BACKLOG_BYTES, + TCA_CAKE_TIN_STATS_THRESHOLD_RATE64, + TCA_CAKE_TIN_STATS_TARGET_US, + TCA_CAKE_TIN_STATS_INTERVAL_US, + TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS, + TCA_CAKE_TIN_STATS_WAY_MISSES, + TCA_CAKE_TIN_STATS_WAY_COLLISIONS, + TCA_CAKE_TIN_STATS_PEAK_DELAY_US, + TCA_CAKE_TIN_STATS_AVG_DELAY_US, + TCA_CAKE_TIN_STATS_BASE_DELAY_US, + TCA_CAKE_TIN_STATS_SPARSE_FLOWS, + TCA_CAKE_TIN_STATS_BULK_FLOWS, + TCA_CAKE_TIN_STATS_UNRESPONSIVE_FLOWS, + TCA_CAKE_TIN_STATS_MAX_SKBLEN, + TCA_CAKE_TIN_STATS_FLOW_QUANTUM, + __TCA_CAKE_TIN_STATS_MAX +}; +#define TCA_CAKE_TIN_STATS_MAX (__TCA_CAKE_TIN_STATS_MAX - 1) +#define TC_CAKE_MAX_TINS (8) + +enum { + CAKE_FLOW_NONE = 0, + CAKE_FLOW_SRC_IP, + CAKE_FLOW_DST_IP, + CAKE_FLOW_HOSTS, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_DST_IP */ + CAKE_FLOW_FLOWS, + CAKE_FLOW_DUAL_SRC, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_FLOWS */ + CAKE_FLOW_DUAL_DST, /* = CAKE_FLOW_DST_IP | CAKE_FLOW_FLOWS */ + CAKE_FLOW_TRIPLE, /* = CAKE_FLOW_HOSTS | CAKE_FLOW_FLOWS */ + CAKE_FLOW_MAX, +}; + +enum { + CAKE_DIFFSERV_DIFFSERV3 = 0, + CAKE_DIFFSERV_DIFFSERV4, + CAKE_DIFFSERV_DIFFSERV8, + CAKE_DIFFSERV_BESTEFFORT, + CAKE_DIFFSERV_PRECEDENCE, + CAKE_DIFFSERV_MAX +}; + +enum { + CAKE_ACK_NONE = 0, + CAKE_ACK_FILTER, + CAKE_ACK_AGGRESSIVE, + CAKE_ACK_MAX +}; + +enum { + CAKE_ATM_NONE = 0, + CAKE_ATM_ATM, + CAKE_ATM_PTM, + CAKE_ATM_MAX +}; + + +/* TAPRIO */ +enum { + TC_TAPRIO_CMD_SET_GATES = 0x00, + TC_TAPRIO_CMD_SET_AND_HOLD = 0x01, + TC_TAPRIO_CMD_SET_AND_RELEASE = 0x02, +}; + +enum { + TCA_TAPRIO_SCHED_ENTRY_UNSPEC, + TCA_TAPRIO_SCHED_ENTRY_INDEX, /* u32 */ + TCA_TAPRIO_SCHED_ENTRY_CMD, /* u8 */ + TCA_TAPRIO_SCHED_ENTRY_GATE_MASK, /* u32 */ + TCA_TAPRIO_SCHED_ENTRY_INTERVAL, /* u32 */ + __TCA_TAPRIO_SCHED_ENTRY_MAX, +}; +#define TCA_TAPRIO_SCHED_ENTRY_MAX (__TCA_TAPRIO_SCHED_ENTRY_MAX - 1) + +/* The format for schedule entry list is: + * [TCA_TAPRIO_SCHED_ENTRY_LIST] + * [TCA_TAPRIO_SCHED_ENTRY] + * [TCA_TAPRIO_SCHED_ENTRY_CMD] + * [TCA_TAPRIO_SCHED_ENTRY_GATES] + * [TCA_TAPRIO_SCHED_ENTRY_INTERVAL] + */ +enum { + TCA_TAPRIO_SCHED_UNSPEC, + TCA_TAPRIO_SCHED_ENTRY, + __TCA_TAPRIO_SCHED_MAX, +}; + +#define TCA_TAPRIO_SCHED_MAX (__TCA_TAPRIO_SCHED_MAX - 1) + +enum { + TCA_TAPRIO_ATTR_UNSPEC, + TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */ + TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST, /* nested of entry */ + TCA_TAPRIO_ATTR_SCHED_BASE_TIME, /* s64 */ + TCA_TAPRIO_ATTR_SCHED_SINGLE_ENTRY, /* single entry */ + TCA_TAPRIO_ATTR_SCHED_CLOCKID, /* s32 */ + TCA_TAPRIO_PAD, + __TCA_TAPRIO_ATTR_MAX, +}; + +#define TCA_TAPRIO_ATTR_MAX (__TCA_TAPRIO_ATTR_MAX - 1) + +#endif diff --git a/bpftool/libbpf/scripts/build-fuzzers.sh b/bpftool/libbpf/scripts/build-fuzzers.sh new file mode 100755 index 0000000..a704f47 --- /dev/null +++ b/bpftool/libbpf/scripts/build-fuzzers.sh @@ -0,0 +1,81 @@ +#!/bin/bash +set -eux + +SANITIZER=${SANITIZER:-address} +flags="-O1 -fno-omit-frame-pointer -g -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=$SANITIZER -fsanitize=fuzzer-no-link" + +export CC=${CC:-clang} +export CFLAGS=${CFLAGS:-$flags} + +export CXX=${CXX:-clang++} +export CXXFLAGS=${CXXFLAGS:-$flags} + +cd "$(dirname -- "$0")/.." + +export OUT=${OUT:-"$(pwd)/out"} +mkdir -p "$OUT" + +export LIB_FUZZING_ENGINE=${LIB_FUZZING_ENGINE:--fsanitize=fuzzer} + +# libelf is compiled with _FORTIFY_SOURCE by default and it +# isn't compatible with MSan. It was borrowed +# from https://github.com/google/oss-fuzz/pull/7422 +if [[ "$SANITIZER" == memory ]]; then + CFLAGS+=" -U_FORTIFY_SOURCE" + CXXFLAGS+=" -U_FORTIFY_SOURCE" +fi + +# The alignment check is turned off by default on OSS-Fuzz/CFLite so it should be +# turned on explicitly there. It was borrowed from +# https://github.com/google/oss-fuzz/pull/7092 +if [[ "$SANITIZER" == undefined ]]; then + additional_ubsan_checks=alignment + UBSAN_FLAGS="-fsanitize=$additional_ubsan_checks -fno-sanitize-recover=$additional_ubsan_checks" + CFLAGS+=" $UBSAN_FLAGS" + CXXFLAGS+=" $UBSAN_FLAGS" +fi + +# Ideally libbelf should be built using release tarballs available +# at https://sourceware.org/elfutils/ftp/. Unfortunately sometimes they +# fail to compile (for example, elfutils-0.185 fails to compile with LDFLAGS enabled +# due to https://bugs.gentoo.org/794601) so let's just point the script to +# commits referring to versions of libelf that actually can be built +rm -rf elfutils +git clone git://sourceware.org/git/elfutils.git +( +cd elfutils +git checkout e9f3045caa5c4498f371383e5519151942d48b6d +git log --oneline -1 + +# ASan isn't compatible with -Wl,--no-undefined: https://github.com/google/sanitizers/issues/380 +find -name Makefile.am | xargs sed -i 's/,--no-undefined//' + +# ASan isn't compatible with -Wl,-z,defs either: +# https://clang.llvm.org/docs/AddressSanitizer.html#usage +sed -i 's/^\(ZDEFS_LDFLAGS=\).*/\1/' configure.ac + +if [[ "$SANITIZER" == undefined ]]; then + # That's basicaly what --enable-sanitize-undefined does to turn off unaligned access + # elfutils heavily relies on on i386/x86_64 but without changing compiler flags along the way + sed -i 's/\(check_undefined_val\)=[0-9]/\1=1/' configure.ac +fi + +autoreconf -i -f +if ! ./configure --enable-maintainer-mode --disable-debuginfod --disable-libdebuginfod \ + CC="$CC" CFLAGS="-Wno-error $CFLAGS" CXX="$CXX" CXXFLAGS="-Wno-error $CXXFLAGS" LDFLAGS="$CFLAGS"; then + cat config.log + exit 1 +fi + +make -C config -j$(nproc) V=1 +make -C lib -j$(nproc) V=1 +make -C libelf -j$(nproc) V=1 +) + +make -C src BUILD_STATIC_ONLY=y V=1 clean +make -C src -j$(nproc) CFLAGS="-I$(pwd)/elfutils/libelf $CFLAGS" BUILD_STATIC_ONLY=y V=1 + +$CC $CFLAGS -Isrc -Iinclude -Iinclude/uapi -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c fuzz/bpf-object-fuzzer.c -o bpf-object-fuzzer.o +$CXX $CXXFLAGS $LIB_FUZZING_ENGINE bpf-object-fuzzer.o src/libbpf.a "$(pwd)/elfutils/libelf/libelf.a" -l:libz.a -o "$OUT/bpf-object-fuzzer" + +cp fuzz/bpf-object-fuzzer_seed_corpus.zip "$OUT" diff --git a/bpftool/libbpf/scripts/coverity.sh b/bpftool/libbpf/scripts/coverity.sh new file mode 100755 index 0000000..99e4809 --- /dev/null +++ b/bpftool/libbpf/scripts/coverity.sh @@ -0,0 +1,105 @@ +#!/bin/bash +# Taken from: https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh +# Local changes are annotated with "#[local]" + +set -e + +# Environment check +echo -e "\033[33;1mNote: COVERITY_SCAN_PROJECT_NAME and COVERITY_SCAN_TOKEN are available on Project Settings page on scan.coverity.com\033[0m" +[ -z "$COVERITY_SCAN_PROJECT_NAME" ] && echo "ERROR: COVERITY_SCAN_PROJECT_NAME must be set" && exit 1 +[ -z "$COVERITY_SCAN_NOTIFICATION_EMAIL" ] && echo "ERROR: COVERITY_SCAN_NOTIFICATION_EMAIL must be set" && exit 1 +[ -z "$COVERITY_SCAN_BRANCH_PATTERN" ] && echo "ERROR: COVERITY_SCAN_BRANCH_PATTERN must be set" && exit 1 +[ -z "$COVERITY_SCAN_BUILD_COMMAND" ] && echo "ERROR: COVERITY_SCAN_BUILD_COMMAND must be set" && exit 1 +[ -z "$COVERITY_SCAN_TOKEN" ] && echo "ERROR: COVERITY_SCAN_TOKEN must be set" && exit 1 + +PLATFORM=`uname` +#[local] Use /var/tmp for TOOL_ARCHIVE and TOOL_BASE, as on certain systems +# /tmp is tmpfs and is sometimes too small to handle all necessary tooling +TOOL_ARCHIVE=/var//tmp/cov-analysis-${PLATFORM}.tgz +TOOL_URL=https://scan.coverity.com/download/${PLATFORM} +TOOL_BASE=/var/tmp/coverity-scan-analysis +UPLOAD_URL="https://scan.coverity.com/builds" +SCAN_URL="https://scan.coverity.com" + +# Do not run on pull requests +if [ "${TRAVIS_PULL_REQUEST}" = "true" ]; then + echo -e "\033[33;1mINFO: Skipping Coverity Analysis: branch is a pull request.\033[0m" + exit 0 +fi + +# Verify this branch should run +IS_COVERITY_SCAN_BRANCH=`ruby -e "puts '${TRAVIS_BRANCH}' =~ /\\A$COVERITY_SCAN_BRANCH_PATTERN\\z/ ? 1 : 0"` +if [ "$IS_COVERITY_SCAN_BRANCH" = "1" ]; then + echo -e "\033[33;1mCoverity Scan configured to run on branch ${TRAVIS_BRANCH}\033[0m" +else + echo -e "\033[33;1mCoverity Scan NOT configured to run on branch ${TRAVIS_BRANCH}\033[0m" + exit 1 +fi + +# Verify upload is permitted +AUTH_RES=`curl -s --form project="$COVERITY_SCAN_PROJECT_NAME" --form token="$COVERITY_SCAN_TOKEN" $SCAN_URL/api/upload_permitted` +if [ "$AUTH_RES" = "Access denied" ]; then + echo -e "\033[33;1mCoverity Scan API access denied. Check COVERITY_SCAN_PROJECT_NAME and COVERITY_SCAN_TOKEN.\033[0m" + exit 1 +else + AUTH=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['upload_permitted']"` + if [ "$AUTH" = "true" ]; then + echo -e "\033[33;1mCoverity Scan analysis authorized per quota.\033[0m" + else + WHEN=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['next_upload_permitted_at']"` + echo -e "\033[33;1mCoverity Scan analysis NOT authorized until $WHEN.\033[0m" + exit 0 + fi +fi + +if [ ! -d $TOOL_BASE ]; then + # Download Coverity Scan Analysis Tool + if [ ! -e $TOOL_ARCHIVE ]; then + echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m" + wget -nv -O $TOOL_ARCHIVE $TOOL_URL --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=$COVERITY_SCAN_TOKEN" + fi + + # Extract Coverity Scan Analysis Tool + echo -e "\033[33;1mExtracting Coverity Scan Analysis Tool...\033[0m" + mkdir -p $TOOL_BASE + pushd $TOOL_BASE + tar xzf $TOOL_ARCHIVE + popd +fi + +TOOL_DIR=`find $TOOL_BASE -type d -name 'cov-analysis*'` +export PATH=$TOOL_DIR/bin:$PATH + +# Build +echo -e "\033[33;1mRunning Coverity Scan Analysis Tool...\033[0m" +COV_BUILD_OPTIONS="" +#COV_BUILD_OPTIONS="--return-emit-failures 8 --parse-error-threshold 85" +RESULTS_DIR="cov-int" +eval "${COVERITY_SCAN_BUILD_COMMAND_PREPEND}" +COVERITY_UNSUPPORTED=1 cov-build --dir $RESULTS_DIR $COV_BUILD_OPTIONS $COVERITY_SCAN_BUILD_COMMAND +cov-import-scm --dir $RESULTS_DIR --scm git --log $RESULTS_DIR/scm_log.txt 2>&1 + +# Upload results +echo -e "\033[33;1mTarring Coverity Scan Analysis results...\033[0m" +RESULTS_ARCHIVE=analysis-results.tgz +tar czf $RESULTS_ARCHIVE $RESULTS_DIR +SHA=`git rev-parse --short HEAD` + +echo -e "\033[33;1mUploading Coverity Scan Analysis results...\033[0m" +response=$(curl \ + --silent --write-out "\n%{http_code}\n" \ + --form project=$COVERITY_SCAN_PROJECT_NAME \ + --form token=$COVERITY_SCAN_TOKEN \ + --form email=$COVERITY_SCAN_NOTIFICATION_EMAIL \ + --form file=@$RESULTS_ARCHIVE \ + --form version=$SHA \ + --form description="Travis CI build" \ + $UPLOAD_URL) +status_code=$(echo "$response" | sed -n '$p') +#[local] Coverity used to return 201 on success, but it's 200 now +# See https://github.com/systemd/systemd/blob/master/tools/coverity.sh#L145 +if [ "$status_code" != "200" ]; then + TEXT=$(echo "$response" | sed '$d') + echo -e "\033[33;1mCoverity Scan upload failed: $TEXT.\033[0m" + exit 1 +fi diff --git a/bpftool/libbpf/scripts/sync-kernel.sh b/bpftool/libbpf/scripts/sync-kernel.sh new file mode 100755 index 0000000..55ffcd1 --- /dev/null +++ b/bpftool/libbpf/scripts/sync-kernel.sh @@ -0,0 +1,355 @@ +#!/bin/bash + +usage () { + echo "USAGE: ./sync-kernel.sh " + echo "" + echo "Set BPF_NEXT_BASELINE to override bpf-next tree commit, otherwise read from /CHECKPOINT-COMMIT." + echo "Set BPF_BASELINE to override bpf tree commit, otherwise read from /BPF-CHECKPOINT-COMMIT." + echo "Set MANUAL_MODE to 1 to manually control every cherry-picked commits." + exit 1 +} + +set -eu + +LIBBPF_REPO=${1-""} +LINUX_REPO=${2-""} +BPF_BRANCH=${3-""} +BASELINE_COMMIT=${BPF_NEXT_BASELINE:-$(cat ${LIBBPF_REPO}/CHECKPOINT-COMMIT)} +BPF_BASELINE_COMMIT=${BPF_BASELINE:-$(cat ${LIBBPF_REPO}/BPF-CHECKPOINT-COMMIT)} + +if [ -z "${LIBBPF_REPO}" ] || [ -z "${LINUX_REPO}" ]; then + echo "Error: libbpf or linux repos are not specified" + usage +fi +if [ -z "${BPF_BRANCH}" ]; then + echo "Error: linux's bpf tree branch is not specified" + usage +fi +if [ -z "${BASELINE_COMMIT}" ] || [ -z "${BPF_BASELINE_COMMIT}" ]; then + echo "Error: bpf or bpf-next baseline commits are not provided" + usage +fi + +SUFFIX=$(date --utc +%Y-%m-%dT%H-%M-%S.%3NZ) +WORKDIR=$(pwd) +TMP_DIR=$(mktemp -d) + +trap "cd ${WORKDIR}; exit" INT TERM EXIT + +declare -A PATH_MAP +PATH_MAP=( \ + [tools/lib/bpf]=src \ + [tools/include/uapi/linux/bpf_common.h]=include/uapi/linux/bpf_common.h \ + [tools/include/uapi/linux/bpf.h]=include/uapi/linux/bpf.h \ + [tools/include/uapi/linux/btf.h]=include/uapi/linux/btf.h \ + [tools/include/uapi/linux/fcntl.h]=include/uapi/linux/fcntl.h \ + [tools/include/uapi/linux/openat2.h]=include/uapi/linux/openat2.h \ + [tools/include/uapi/linux/if_link.h]=include/uapi/linux/if_link.h \ + [tools/include/uapi/linux/if_xdp.h]=include/uapi/linux/if_xdp.h \ + [tools/include/uapi/linux/netdev.h]=include/uapi/linux/netdev.h \ + [tools/include/uapi/linux/netlink.h]=include/uapi/linux/netlink.h \ + [tools/include/uapi/linux/pkt_cls.h]=include/uapi/linux/pkt_cls.h \ + [tools/include/uapi/linux/pkt_sched.h]=include/uapi/linux/pkt_sched.h \ + [include/uapi/linux/perf_event.h]=include/uapi/linux/perf_event.h \ + [Documentation/bpf/libbpf]=docs \ +) + +LIBBPF_PATHS=("${!PATH_MAP[@]}" ":^tools/lib/bpf/Makefile" ":^tools/lib/bpf/Build" ":^tools/lib/bpf/.gitignore" ":^tools/include/tools/libc_compat.h") +LIBBPF_VIEW_PATHS=("${PATH_MAP[@]}") +LIBBPF_VIEW_EXCLUDE_REGEX='^src/(Makefile|Build|test_libbpf\.c|bpf_helper_defs\.h|\.gitignore)$|^docs/(\.gitignore|api\.rst|conf\.py)$|^docs/sphinx/.*' +LINUX_VIEW_EXCLUDE_REGEX='^include/tools/libc_compat.h$' + +LIBBPF_TREE_FILTER="mkdir -p __libbpf/include/uapi/linux __libbpf/include/tools && "$'\\\n' +for p in "${!PATH_MAP[@]}"; do + LIBBPF_TREE_FILTER+="git mv -kf ${p} __libbpf/${PATH_MAP[${p}]} && "$'\\\n' +done +LIBBPF_TREE_FILTER+="git rm --ignore-unmatch -f __libbpf/src/{Makefile,Build,test_libbpf.c,.gitignore} >/dev/null" + +cd_to() +{ + cd ${WORKDIR} && cd "$1" +} + +# Output brief single-line commit description +# $1 - commit ref +commit_desc() +{ + git log -n1 --pretty='%h ("%s")' $1 +} + +# Create commit single-line signature, which consists of: +# - full commit subject +# - author date in ISO8601 format +# - full commit body with newlines replaced with vertical bars (|) +# - shortstat appended at the end +# The idea is that this single-line signature is good enough to make final +# decision about whether two commits are the same, across different repos. +# $1 - commit ref +# $2 - paths filter +commit_signature() +{ + local ref=$1 + shift + git show --pretty='("%s")|%aI|%b' --shortstat $ref -- "${@-.}" | tr '\n' '|' +} + +# Cherry-pick commits touching libbpf-related files +# $1 - baseline_tag +# $2 - tip_tag +cherry_pick_commits() +{ + local manual_mode=${MANUAL_MODE:-0} + local baseline_tag=$1 + local tip_tag=$2 + local new_commits + local signature + local should_skip + local synced_cnt + local manual_check + local libbpf_conflict_cnt + local desc + + new_commits=$(git rev-list --no-merges --topo-order --reverse ${baseline_tag}..${tip_tag} -- "${LIBBPF_PATHS[@]}") + for new_commit in ${new_commits}; do + desc="$(commit_desc ${new_commit})" + signature="$(commit_signature ${new_commit} "${LIBBPF_PATHS[@]}")" + synced_cnt=$(grep -F "${signature}" ${TMP_DIR}/libbpf_commits.txt | wc -l) + manual_check=0 + if ((${synced_cnt} > 0)); then + # commit with the same subject is already in libbpf, but it's + # not 100% the same commit, so check with user + echo "Commit '${desc}' is synced into libbpf as:" + grep -F "${signature}" ${TMP_DIR}/libbpf_commits.txt | \ + cut -d'|' -f1 | sed -e 's/^/- /' + if ((${manual_mode} != 1 && ${synced_cnt} == 1)); then + echo "Skipping '${desc}' due to unique match..." + continue + fi + if ((${synced_cnt} > 1)); then + echo "'${desc} matches multiple commits, please, double-check!" + manual_check=1 + fi + fi + if ((${manual_mode} == 1 || ${manual_check} == 1)); then + read -p "Do you want to skip '${desc}'? [y/N]: " should_skip + case "${should_skip}" in + "y" | "Y") + echo "Skipping '${desc}'..." + continue + ;; + esac + fi + # commit hasn't been synced into libbpf yet + echo "Picking '${desc}'..." + if ! git cherry-pick ${new_commit} &>/dev/null; then + echo "Warning! Cherry-picking '${desc} failed, checking if it's non-libbpf files causing problems..." + libbpf_conflict_cnt=$(git diff --name-only --diff-filter=U -- "${LIBBPF_PATHS[@]}" | wc -l) + conflict_cnt=$(git diff --name-only | wc -l) + prompt_resolution=1 + + if ((${libbpf_conflict_cnt} == 0)); then + echo "Looks like only non-libbpf files have conflicts, ignoring..." + if ((${conflict_cnt} == 0)); then + echo "Empty cherry-pick, skipping it..." + git cherry-pick --abort + continue + fi + + git add . + # GIT_EDITOR=true to avoid editor popping up to edit commit message + if ! GIT_EDITOR=true git cherry-pick --continue &>/dev/null; then + echo "Error! That still failed! Please resolve manually." + else + echo "Success! All cherry-pick conflicts were resolved for '${desc}'!" + prompt_resolution=0 + fi + fi + + if ((${prompt_resolution} == 1)); then + read -p "Error! Cherry-picking '${desc}' failed, please fix manually and press to proceed..." + fi + fi + # Append signature of just cherry-picked commit to avoid + # potentially cherry-picking the same commit twice later when + # processing bpf tree commits. At this point we don't know yet + # the final commit sha in libbpf repo, so we record Linux SHA + # instead as LINUX_. + echo LINUX_$(git log --pretty='%h' -n1) "${signature}" >> ${TMP_DIR}/libbpf_commits.txt + done +} + +cleanup() +{ + echo "Cleaning up..." + rm -r ${TMP_DIR} + cd_to ${LINUX_REPO} + git checkout ${TIP_SYM_REF} + git branch -D ${BASELINE_TAG} ${TIP_TAG} ${BPF_BASELINE_TAG} ${BPF_TIP_TAG} \ + ${SQUASH_BASE_TAG} ${SQUASH_TIP_TAG} ${VIEW_TAG} || true + + cd_to . + echo "DONE." +} + + +cd_to ${LIBBPF_REPO} +GITHUB_ABS_DIR=$(pwd) +echo "Dumping existing libbpf commit signatures..." +for h in $(git log --pretty='%h' -n500); do + echo $h "$(commit_signature $h)" >> ${TMP_DIR}/libbpf_commits.txt +done + +# Use current kernel repo HEAD as a source of patches +cd_to ${LINUX_REPO} +LINUX_ABS_DIR=$(pwd) +TIP_SYM_REF=$(git symbolic-ref -q --short HEAD || git rev-parse HEAD) +TIP_COMMIT=$(git rev-parse HEAD) +BPF_TIP_COMMIT=$(git rev-parse ${BPF_BRANCH}) +BASELINE_TAG=libbpf-baseline-${SUFFIX} +TIP_TAG=libbpf-tip-${SUFFIX} +BPF_BASELINE_TAG=libbpf-bpf-baseline-${SUFFIX} +BPF_TIP_TAG=libbpf-bpf-tip-${SUFFIX} +VIEW_TAG=libbpf-view-${SUFFIX} +LIBBPF_SYNC_TAG=libbpf-sync-${SUFFIX} + +# Squash state of kernel repo at baseline into single commit +SQUASH_BASE_TAG=libbpf-squash-base-${SUFFIX} +SQUASH_TIP_TAG=libbpf-squash-tip-${SUFFIX} +SQUASH_COMMIT=$(git commit-tree ${BASELINE_COMMIT}^{tree} -m "BASELINE SQUASH ${BASELINE_COMMIT}") + +echo "WORKDIR: ${WORKDIR}" +echo "LINUX REPO: ${LINUX_REPO}" +echo "LIBBPF REPO: ${LIBBPF_REPO}" +echo "TEMP DIR: ${TMP_DIR}" +echo "SUFFIX: ${SUFFIX}" +echo "BASE COMMIT: '$(commit_desc ${BASELINE_COMMIT})'" +echo "TIP COMMIT: '$(commit_desc ${TIP_COMMIT})'" +echo "BPF BASE COMMIT: '$(commit_desc ${BPF_BASELINE_COMMIT})'" +echo "BPF TIP COMMIT: '$(commit_desc ${BPF_TIP_COMMIT})'" +echo "SQUASH COMMIT: ${SQUASH_COMMIT}" +echo "BASELINE TAG: ${BASELINE_TAG}" +echo "TIP TAG: ${TIP_TAG}" +echo "BPF BASELINE TAG: ${BPF_BASELINE_TAG}" +echo "BPF TIP TAG: ${BPF_TIP_TAG}" +echo "SQUASH BASE TAG: ${SQUASH_BASE_TAG}" +echo "SQUASH TIP TAG: ${SQUASH_TIP_TAG}" +echo "VIEW TAG: ${VIEW_TAG}" +echo "LIBBPF SYNC TAG: ${LIBBPF_SYNC_TAG}" +echo "PATCHES: ${TMP_DIR}/patches" + +git branch ${BASELINE_TAG} ${BASELINE_COMMIT} +git branch ${TIP_TAG} ${TIP_COMMIT} +git branch ${BPF_BASELINE_TAG} ${BPF_BASELINE_COMMIT} +git branch ${BPF_TIP_TAG} ${BPF_TIP_COMMIT} +git branch ${SQUASH_BASE_TAG} ${SQUASH_COMMIT} +git checkout -b ${SQUASH_TIP_TAG} ${SQUASH_COMMIT} + +# Cherry-pick new commits onto squashed baseline commit +cherry_pick_commits ${BASELINE_TAG} ${TIP_TAG} +cherry_pick_commits ${BPF_BASELINE_TAG} ${BPF_TIP_TAG} + +# Move all libbpf files into __libbpf directory. +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch --prune-empty -f --tree-filter "${LIBBPF_TREE_FILTER}" ${SQUASH_TIP_TAG} ${SQUASH_BASE_TAG} +# Make __libbpf a new root directory +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch --prune-empty -f --subdirectory-filter __libbpf ${SQUASH_TIP_TAG} ${SQUASH_BASE_TAG} + +# If there are no new commits with libbpf-related changes, bail out +COMMIT_CNT=$(git rev-list --count ${SQUASH_BASE_TAG}..${SQUASH_TIP_TAG}) +if ((${COMMIT_CNT} <= 0)); then + echo "No new changes to apply, we are done!" + cleanup + exit 2 +fi + +# Exclude baseline commit and generate nice cover letter with summary +git format-patch --no-signature ${SQUASH_BASE_TAG}..${SQUASH_TIP_TAG} --cover-letter -o ${TMP_DIR}/patches + +# Now is time to re-apply libbpf-related linux patches to libbpf repo +cd_to ${LIBBPF_REPO} +git checkout -b ${LIBBPF_SYNC_TAG} + +for patch in $(ls -1 ${TMP_DIR}/patches | tail -n +2); do + if ! git am -3 --committer-date-is-author-date "${TMP_DIR}/patches/${patch}"; then + if ! patch -p1 --merge < "${TMP_DIR}/patches/${patch}"; then + read -p "Applying ${TMP_DIR}/patches/${patch} failed, please resolve manually and press to proceed..." + fi + git am --continue + fi +done + +# Generate bpf_helper_defs.h and commit, if anything changed +# restore Linux tip to use bpf_doc.py +cd_to ${LINUX_REPO} +git checkout ${TIP_TAG} +# re-generate bpf_helper_defs.h +cd_to ${LIBBPF_REPO} +"${LINUX_ABS_DIR}/scripts/bpf_doc.py" --header \ + --file include/uapi/linux/bpf.h > src/bpf_helper_defs.h +# if anything changed, commit it +helpers_changes=$(git status --porcelain src/bpf_helper_defs.h | wc -l) +if ((${helpers_changes} == 1)); then + git add src/bpf_helper_defs.h + git commit -s -m "sync: auto-generate latest BPF helpers + +Latest changes to BPF helper definitions. +" -- src/bpf_helper_defs.h +fi + +# Use generated cover-letter as a template for "sync commit" with +# baseline and checkpoint commits from kernel repo (and leave summary +# from cover letter intact, of course) +echo ${TIP_COMMIT} > CHECKPOINT-COMMIT && \ +echo ${BPF_TIP_COMMIT} > BPF-CHECKPOINT-COMMIT && \ +git add CHECKPOINT-COMMIT && \ +git add BPF-CHECKPOINT-COMMIT && \ +awk '/\*\*\* BLURB HERE \*\*\*/ {p=1} p' ${TMP_DIR}/patches/0000-cover-letter.patch | \ +sed "s/\*\*\* BLURB HERE \*\*\*/\ +sync: latest libbpf changes from kernel\n\ +\n\ +Syncing latest libbpf commits from kernel repository.\n\ +Baseline bpf-next commit: ${BASELINE_COMMIT}\n\ +Checkpoint bpf-next commit: ${TIP_COMMIT}\n\ +Baseline bpf commit: ${BPF_BASELINE_COMMIT}\n\ +Checkpoint bpf commit: ${BPF_TIP_COMMIT}/" | \ +git commit -s --file=- + +echo "SUCCESS! ${COMMIT_CNT} commits synced." + +echo "Verifying Linux's and Github's libbpf state" + +cd_to ${LINUX_REPO} +git checkout -b ${VIEW_TAG} ${TIP_COMMIT} +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --tree-filter "${LIBBPF_TREE_FILTER}" ${VIEW_TAG}^..${VIEW_TAG} +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --subdirectory-filter __libbpf ${VIEW_TAG}^..${VIEW_TAG} +git ls-files -- "${LIBBPF_VIEW_PATHS[@]}" | grep -v -E "${LINUX_VIEW_EXCLUDE_REGEX}" > ${TMP_DIR}/linux-view.ls + +cd_to ${LIBBPF_REPO} +git ls-files -- "${LIBBPF_VIEW_PATHS[@]}" | grep -v -E "${LIBBPF_VIEW_EXCLUDE_REGEX}" > ${TMP_DIR}/github-view.ls + +echo "Comparing list of files..." +diff -u ${TMP_DIR}/linux-view.ls ${TMP_DIR}/github-view.ls +echo "Comparing file contents..." +CONSISTENT=1 +for F in $(cat ${TMP_DIR}/linux-view.ls); do + if ! diff -u "${LINUX_ABS_DIR}/${F}" "${GITHUB_ABS_DIR}/${F}"; then + echo "${LINUX_ABS_DIR}/${F} and ${GITHUB_ABS_DIR}/${F} are different!" + CONSISTENT=0 + fi +done +if ((${CONSISTENT} == 1)); then + echo "Great! Content is identical!" +else + ignore_inconsistency=n + echo "Unfortunately, there are some inconsistencies, please double check." + read -p "Does everything look good? [y/N]: " ignore_inconsistency + case "${ignore_inconsistency}" in + "y" | "Y") + echo "Ok, proceeding..." + ;; + *) + echo "Oops, exiting with error..." + exit 4 + esac +fi + +cleanup diff --git a/bpftool/libbpf/src/.gitignore b/bpftool/libbpf/src/.gitignore new file mode 100644 index 0000000..0473afb --- /dev/null +++ b/bpftool/libbpf/src/.gitignore @@ -0,0 +1,6 @@ +*.o +*.a +/libbpf.pc +/libbpf.so* +/staticobjs +/sharedobjs diff --git a/bpftool/libbpf/src/Makefile b/bpftool/libbpf/src/Makefile new file mode 100644 index 0000000..4a9af82 --- /dev/null +++ b/bpftool/libbpf/src/Makefile @@ -0,0 +1,183 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' "$(1)" "$(2)" "$(if $(3), $(3))"; +endif + +LIBBPF_MAJOR_VERSION := 1 +LIBBPF_MINOR_VERSION := 2 +LIBBPF_PATCH_VERSION := 0 +LIBBPF_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).$(LIBBPF_PATCH_VERSION) +LIBBPF_MAJMIN_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).0 +LIBBPF_MAP_VERSION := $(shell grep -oE '^LIBBPF_([0-9.]+)' libbpf.map | sort -rV | head -n1 | cut -d'_' -f2) +ifneq ($(LIBBPF_MAJMIN_VERSION), $(LIBBPF_MAP_VERSION)) +$(error Libbpf release ($(LIBBPF_VERSION)) and map ($(LIBBPF_MAP_VERSION)) versions are out of sync!) +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,$(CROSS_COMPILE)cc) +$(call allow-override,LD,$(CROSS_COMPILE)ld) + +TOPDIR = .. + +INCLUDES := -I. -I$(TOPDIR)/include -I$(TOPDIR)/include/uapi +ALL_CFLAGS := $(INCLUDES) + +SHARED_CFLAGS += -fPIC -fvisibility=hidden -DSHARED + +CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89 +ALL_CFLAGS += $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $(EXTRA_CFLAGS) +ALL_LDFLAGS += $(LDFLAGS) $(EXTRA_LDFLAGS) + +# ifdef NO_PKG_CONFIG +ALL_LDFLAGS += -L/home/jiahuan/libelf-aarch64/usr/lib/ -lelf -L/home/jiahuan/zlib-1.2.10 -lz +# else +# PKG_CONFIG ?= pkg-config +# ALL_CFLAGS += $(shell $(PKG_CONFIG) --cflags libelf zlib) +# ALL_LDFLAGS += $(shell $(PKG_CONFIG) --libs libelf zlib) +# endif + +OBJDIR ?= . +SHARED_OBJDIR := $(OBJDIR)/sharedobjs +STATIC_OBJDIR := $(OBJDIR)/staticobjs +OBJS := bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \ + nlattr.o str_error.o libbpf_probes.o bpf_prog_linfo.o \ + btf_dump.o hashmap.o ringbuf.o strset.o linker.o gen_loader.o \ + relo_core.o usdt.o +SHARED_OBJS := $(addprefix $(SHARED_OBJDIR)/,$(OBJS)) +STATIC_OBJS := $(addprefix $(STATIC_OBJDIR)/,$(OBJS)) + +STATIC_LIBS := $(OBJDIR)/libbpf.a +ifndef BUILD_STATIC_ONLY + SHARED_LIBS := $(OBJDIR)/libbpf.so \ + $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION) \ + $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) + VERSION_SCRIPT := libbpf.map +endif + +HEADERS := bpf.h libbpf.h btf.h libbpf_common.h libbpf_legacy.h \ + bpf_helpers.h bpf_helper_defs.h bpf_tracing.h \ + bpf_endian.h bpf_core_read.h skel_internal.h libbpf_version.h \ + usdt.bpf.h +UAPI_HEADERS := $(addprefix $(TOPDIR)/include/uapi/linux/,\ + bpf.h bpf_common.h btf.h) + +PC_FILE := $(OBJDIR)/libbpf.pc + +INSTALL = install + +DESTDIR ?= + +HOSTARCH = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine))) +ifeq ($(filter-out %64 %64be %64eb %64le %64el s390x, $(HOSTARCH)),) + LIBSUBDIR := lib64 +else + LIBSUBDIR := lib +endif + +# By default let the pc file itself use ${prefix} in includedir/libdir so that +# the prefix can be overridden at runtime (eg: --define-prefix) +ifndef LIBDIR + LIBDIR_PC := $$\{prefix\}/$(LIBSUBDIR) +else + LIBDIR_PC := $(LIBDIR) +endif +PREFIX ?= /usr +LIBDIR ?= $(PREFIX)/$(LIBSUBDIR) +INCLUDEDIR ?= $(PREFIX)/include +UAPIDIR ?= $(PREFIX)/include + +TAGS_PROG := $(if $(shell which etags 2>/dev/null),etags,ctags) +all: $(STATIC_LIBS) +# all: $(STATIC_LIBS) $(SHARED_LIBS) $(PC_FILE) + +$(OBJDIR)/libbpf.a: $(STATIC_OBJS) + $(call msg,AR,$@) + $(Q)$(AR) rcs $@ $^ + +$(OBJDIR)/libbpf.so: $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION) + $(Q)ln -sf $(^F) $@ + +$(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION): $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) + $(Q)ln -sf $(^F) $@ + +$(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(SHARED_OBJS) + $(call msg,CC,$@) + $(Q)$(CC) -shared -Wl,--version-script=$(VERSION_SCRIPT) \ + -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \ + $^ $(ALL_LDFLAGS) -o $@ + +$(OBJDIR)/libbpf.pc: force + $(Q)sed -e "s|@PREFIX@|$(PREFIX)|" \ + -e "s|@LIBDIR@|$(LIBDIR_PC)|" \ + -e "s|@VERSION@|$(LIBBPF_VERSION)|" \ + < libbpf.pc.template > $@ + +$(STATIC_OBJDIR) $(SHARED_OBJDIR): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +$(STATIC_OBJDIR)/%.o: %.c | $(STATIC_OBJDIR) + $(call msg,CC,$@) + $(Q)$(CC) $(ALL_CFLAGS) $(CPPFLAGS) -c $< -o $@ + +$(SHARED_OBJDIR)/%.o: %.c | $(SHARED_OBJDIR) + $(call msg,CC,$@) + $(Q)$(CC) $(ALL_CFLAGS) $(SHARED_CFLAGS) $(CPPFLAGS) -c $< -o $@ + +define do_install + $(call msg,INSTALL,$1) + $(Q)if [ ! -d '$(DESTDIR)$2' ]; then \ + $(INSTALL) -d -m 755 '$(DESTDIR)$2'; \ + fi; + $(Q)$(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR)$2' +endef + +# Preserve symlinks at installation. +define do_s_install + $(call msg,INSTALL,$1) + $(Q)if [ ! -d '$(DESTDIR)$2' ]; then \ + $(INSTALL) -d -m 755 '$(DESTDIR)$2'; \ + fi; + $(Q)cp -fR $1 '$(DESTDIR)$2' +endef + +install: all install_headers install_pkgconfig + $(call do_s_install,$(STATIC_LIBS) $(SHARED_LIBS),$(LIBDIR)) + +install_headers: + $(call do_install,$(HEADERS),$(INCLUDEDIR)/bpf,644) + +# UAPI headers can be installed by a different package so they're not installed +# in by install rule. +install_uapi_headers: + $(call do_install,$(UAPI_HEADERS),$(UAPIDIR)/linux,644) + +install_pkgconfig: $(PC_FILE) + $(call do_install,$(PC_FILE),$(LIBDIR)/pkgconfig,644) + +clean: + $(call msg,CLEAN) + $(Q)rm -rf *.o *.a *.so *.so.* *.pc $(SHARED_OBJDIR) $(STATIC_OBJDIR) + +.PHONY: cscope tags force +cscope: + $(call msg,CSCOPE) + $(Q)ls *.c *.h > cscope.files + $(Q)cscope -b -q -f cscope.out + +tags: + $(call msg,CTAGS) + $(Q)rm -f TAGS tags + $(Q)ls *.c *.h | xargs $(TAGS_PROG) -a + +force: diff --git a/bpftool/libbpf/src/bpf.c b/bpftool/libbpf/src/bpf.c new file mode 100644 index 0000000..e750b6f --- /dev/null +++ b/bpftool/libbpf/src/bpf.c @@ -0,0 +1,1185 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * common eBPF ELF operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" + +/* + * When building perf, unistd.h is overridden. __NR_bpf is + * required to be defined explicitly. + */ +#ifndef __NR_bpf +# if defined(__i386__) +# define __NR_bpf 357 +# elif defined(__x86_64__) +# define __NR_bpf 321 +# elif defined(__aarch64__) +# define __NR_bpf 280 +# elif defined(__sparc__) +# define __NR_bpf 349 +# elif defined(__s390__) +# define __NR_bpf 351 +# elif defined(__arc__) +# define __NR_bpf 280 +# elif defined(__mips__) && defined(_ABIO32) +# define __NR_bpf 4355 +# elif defined(__mips__) && defined(_ABIN32) +# define __NR_bpf 6319 +# elif defined(__mips__) && defined(_ABI64) +# define __NR_bpf 5315 +# else +# error __NR_bpf not defined. libbpf does not support your arch. +# endif +#endif + +static inline __u64 ptr_to_u64(const void *ptr) +{ + return (__u64) (unsigned long) ptr; +} + +static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, + unsigned int size) +{ + return syscall(__NR_bpf, cmd, attr, size); +} + +static inline int sys_bpf_fd(enum bpf_cmd cmd, union bpf_attr *attr, + unsigned int size) +{ + int fd; + + fd = sys_bpf(cmd, attr, size); + return ensure_good_fd(fd); +} + +int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts) +{ + int fd; + + do { + fd = sys_bpf_fd(BPF_PROG_LOAD, attr, size); + } while (fd < 0 && errno == EAGAIN && --attempts > 0); + + return fd; +} + +/* Probe whether kernel switched from memlock-based (RLIMIT_MEMLOCK) to + * memcg-based memory accounting for BPF maps and progs. This was done in [0]. + * We use the support for bpf_ktime_get_coarse_ns() helper, which was added in + * the same 5.11 Linux release ([1]), to detect memcg-based accounting for BPF. + * + * [0] https://lore.kernel.org/bpf/20201201215900.3569844-1-guro@fb.com/ + * [1] d05512618056 ("bpf: Add bpf_ktime_get_coarse_ns helper") + */ +int probe_memcg_account(void) +{ + const size_t attr_sz = offsetofend(union bpf_attr, attach_btf_obj_fd); + struct bpf_insn insns[] = { + BPF_EMIT_CALL(BPF_FUNC_ktime_get_coarse_ns), + BPF_EXIT_INSN(), + }; + size_t insn_cnt = ARRAY_SIZE(insns); + union bpf_attr attr; + int prog_fd; + + /* attempt loading freplace trying to use custom BTF */ + memset(&attr, 0, attr_sz); + attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER; + attr.insns = ptr_to_u64(insns); + attr.insn_cnt = insn_cnt; + attr.license = ptr_to_u64("GPL"); + + prog_fd = sys_bpf_fd(BPF_PROG_LOAD, &attr, attr_sz); + if (prog_fd >= 0) { + close(prog_fd); + return 1; + } + return 0; +} + +static bool memlock_bumped; +static rlim_t memlock_rlim = RLIM_INFINITY; + +int libbpf_set_memlock_rlim(size_t memlock_bytes) +{ + if (memlock_bumped) + return libbpf_err(-EBUSY); + + memlock_rlim = memlock_bytes; + return 0; +} + +int bump_rlimit_memlock(void) +{ + struct rlimit rlim; + + /* if kernel supports memcg-based accounting, skip bumping RLIMIT_MEMLOCK */ + if (memlock_bumped || kernel_supports(NULL, FEAT_MEMCG_ACCOUNT)) + return 0; + + memlock_bumped = true; + + /* zero memlock_rlim_max disables auto-bumping RLIMIT_MEMLOCK */ + if (memlock_rlim == 0) + return 0; + + rlim.rlim_cur = rlim.rlim_max = memlock_rlim; + if (setrlimit(RLIMIT_MEMLOCK, &rlim)) + return -errno; + + return 0; +} + +int bpf_map_create(enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, + __u32 value_size, + __u32 max_entries, + const struct bpf_map_create_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, map_extra); + union bpf_attr attr; + int fd; + + bump_rlimit_memlock(); + + memset(&attr, 0, attr_sz); + + if (!OPTS_VALID(opts, bpf_map_create_opts)) + return libbpf_err(-EINVAL); + + attr.map_type = map_type; + if (map_name && kernel_supports(NULL, FEAT_PROG_NAME)) + libbpf_strlcpy(attr.map_name, map_name, sizeof(attr.map_name)); + attr.key_size = key_size; + attr.value_size = value_size; + attr.max_entries = max_entries; + + attr.btf_fd = OPTS_GET(opts, btf_fd, 0); + attr.btf_key_type_id = OPTS_GET(opts, btf_key_type_id, 0); + attr.btf_value_type_id = OPTS_GET(opts, btf_value_type_id, 0); + attr.btf_vmlinux_value_type_id = OPTS_GET(opts, btf_vmlinux_value_type_id, 0); + + attr.inner_map_fd = OPTS_GET(opts, inner_map_fd, 0); + attr.map_flags = OPTS_GET(opts, map_flags, 0); + attr.map_extra = OPTS_GET(opts, map_extra, 0); + attr.numa_node = OPTS_GET(opts, numa_node, 0); + attr.map_ifindex = OPTS_GET(opts, map_ifindex, 0); + + fd = sys_bpf_fd(BPF_MAP_CREATE, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +static void * +alloc_zero_tailing_info(const void *orecord, __u32 cnt, + __u32 actual_rec_size, __u32 expected_rec_size) +{ + __u64 info_len = (__u64)actual_rec_size * cnt; + void *info, *nrecord; + int i; + + info = malloc(info_len); + if (!info) + return NULL; + + /* zero out bytes kernel does not understand */ + nrecord = info; + for (i = 0; i < cnt; i++) { + memcpy(nrecord, orecord, expected_rec_size); + memset(nrecord + expected_rec_size, 0, + actual_rec_size - expected_rec_size); + orecord += actual_rec_size; + nrecord += actual_rec_size; + } + + return info; +} + +int bpf_prog_load(enum bpf_prog_type prog_type, + const char *prog_name, const char *license, + const struct bpf_insn *insns, size_t insn_cnt, + const struct bpf_prog_load_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, fd_array); + void *finfo = NULL, *linfo = NULL; + const char *func_info, *line_info; + __u32 log_size, log_level, attach_prog_fd, attach_btf_obj_fd; + __u32 func_info_rec_size, line_info_rec_size; + int fd, attempts; + union bpf_attr attr; + char *log_buf; + + bump_rlimit_memlock(); + + if (!OPTS_VALID(opts, bpf_prog_load_opts)) + return libbpf_err(-EINVAL); + + attempts = OPTS_GET(opts, attempts, 0); + if (attempts < 0) + return libbpf_err(-EINVAL); + if (attempts == 0) + attempts = PROG_LOAD_ATTEMPTS; + + memset(&attr, 0, attr_sz); + + attr.prog_type = prog_type; + attr.expected_attach_type = OPTS_GET(opts, expected_attach_type, 0); + + attr.prog_btf_fd = OPTS_GET(opts, prog_btf_fd, 0); + attr.prog_flags = OPTS_GET(opts, prog_flags, 0); + attr.prog_ifindex = OPTS_GET(opts, prog_ifindex, 0); + attr.kern_version = OPTS_GET(opts, kern_version, 0); + + if (prog_name && kernel_supports(NULL, FEAT_PROG_NAME)) + libbpf_strlcpy(attr.prog_name, prog_name, sizeof(attr.prog_name)); + attr.license = ptr_to_u64(license); + + if (insn_cnt > UINT_MAX) + return libbpf_err(-E2BIG); + + attr.insns = ptr_to_u64(insns); + attr.insn_cnt = (__u32)insn_cnt; + + attach_prog_fd = OPTS_GET(opts, attach_prog_fd, 0); + attach_btf_obj_fd = OPTS_GET(opts, attach_btf_obj_fd, 0); + + if (attach_prog_fd && attach_btf_obj_fd) + return libbpf_err(-EINVAL); + + attr.attach_btf_id = OPTS_GET(opts, attach_btf_id, 0); + if (attach_prog_fd) + attr.attach_prog_fd = attach_prog_fd; + else + attr.attach_btf_obj_fd = attach_btf_obj_fd; + + log_buf = OPTS_GET(opts, log_buf, NULL); + log_size = OPTS_GET(opts, log_size, 0); + log_level = OPTS_GET(opts, log_level, 0); + + if (!!log_buf != !!log_size) + return libbpf_err(-EINVAL); + if (log_level > (4 | 2 | 1)) + return libbpf_err(-EINVAL); + if (log_level && !log_buf) + return libbpf_err(-EINVAL); + + func_info_rec_size = OPTS_GET(opts, func_info_rec_size, 0); + func_info = OPTS_GET(opts, func_info, NULL); + attr.func_info_rec_size = func_info_rec_size; + attr.func_info = ptr_to_u64(func_info); + attr.func_info_cnt = OPTS_GET(opts, func_info_cnt, 0); + + line_info_rec_size = OPTS_GET(opts, line_info_rec_size, 0); + line_info = OPTS_GET(opts, line_info, NULL); + attr.line_info_rec_size = line_info_rec_size; + attr.line_info = ptr_to_u64(line_info); + attr.line_info_cnt = OPTS_GET(opts, line_info_cnt, 0); + + attr.fd_array = ptr_to_u64(OPTS_GET(opts, fd_array, NULL)); + + if (log_level) { + attr.log_buf = ptr_to_u64(log_buf); + attr.log_size = log_size; + attr.log_level = log_level; + } + + fd = sys_bpf_prog_load(&attr, attr_sz, attempts); + if (fd >= 0) + return fd; + + /* After bpf_prog_load, the kernel may modify certain attributes + * to give user space a hint how to deal with loading failure. + * Check to see whether we can make some changes and load again. + */ + while (errno == E2BIG && (!finfo || !linfo)) { + if (!finfo && attr.func_info_cnt && + attr.func_info_rec_size < func_info_rec_size) { + /* try with corrected func info records */ + finfo = alloc_zero_tailing_info(func_info, + attr.func_info_cnt, + func_info_rec_size, + attr.func_info_rec_size); + if (!finfo) { + errno = E2BIG; + goto done; + } + + attr.func_info = ptr_to_u64(finfo); + attr.func_info_rec_size = func_info_rec_size; + } else if (!linfo && attr.line_info_cnt && + attr.line_info_rec_size < line_info_rec_size) { + linfo = alloc_zero_tailing_info(line_info, + attr.line_info_cnt, + line_info_rec_size, + attr.line_info_rec_size); + if (!linfo) { + errno = E2BIG; + goto done; + } + + attr.line_info = ptr_to_u64(linfo); + attr.line_info_rec_size = line_info_rec_size; + } else { + break; + } + + fd = sys_bpf_prog_load(&attr, attr_sz, attempts); + if (fd >= 0) + goto done; + } + + if (log_level == 0 && log_buf) { + /* log_level == 0 with non-NULL log_buf requires retrying on error + * with log_level == 1 and log_buf/log_buf_size set, to get details of + * failure + */ + attr.log_buf = ptr_to_u64(log_buf); + attr.log_size = log_size; + attr.log_level = 1; + + fd = sys_bpf_prog_load(&attr, attr_sz, attempts); + } +done: + /* free() doesn't affect errno, so we don't need to restore it */ + free(finfo); + free(linfo); + return libbpf_err_errno(fd); +} + +int bpf_map_update_elem(int fd, const void *key, const void *value, + __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + attr.flags = flags; + + ret = sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_lookup_elem(int fd, const void *key, void *value) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + + ret = sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + attr.flags = flags; + + ret = sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_lookup_and_delete_elem(int fd, const void *key, void *value) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + + ret = sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, void *value, __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + attr.flags = flags; + + ret = sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_delete_elem(int fd, const void *key) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + + ret = sys_bpf(BPF_MAP_DELETE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_delete_elem_flags(int fd, const void *key, __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.flags = flags; + + ret = sys_bpf(BPF_MAP_DELETE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_get_next_key(int fd, const void *key, void *next_key) +{ + const size_t attr_sz = offsetofend(union bpf_attr, next_key); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.next_key = ptr_to_u64(next_key); + + ret = sys_bpf(BPF_MAP_GET_NEXT_KEY, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_freeze(int fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, map_fd); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + + ret = sys_bpf(BPF_MAP_FREEZE, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +static int bpf_map_batch_common(int cmd, int fd, void *in_batch, + void *out_batch, void *keys, void *values, + __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, batch); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_map_batch_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.batch.map_fd = fd; + attr.batch.in_batch = ptr_to_u64(in_batch); + attr.batch.out_batch = ptr_to_u64(out_batch); + attr.batch.keys = ptr_to_u64(keys); + attr.batch.values = ptr_to_u64(values); + attr.batch.count = *count; + attr.batch.elem_flags = OPTS_GET(opts, elem_flags, 0); + attr.batch.flags = OPTS_GET(opts, flags, 0); + + ret = sys_bpf(cmd, &attr, attr_sz); + *count = attr.batch.count; + + return libbpf_err_errno(ret); +} + +int bpf_map_delete_batch(int fd, const void *keys, __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + return bpf_map_batch_common(BPF_MAP_DELETE_BATCH, fd, NULL, + NULL, (void *)keys, NULL, count, opts); +} + +int bpf_map_lookup_batch(int fd, void *in_batch, void *out_batch, void *keys, + void *values, __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + return bpf_map_batch_common(BPF_MAP_LOOKUP_BATCH, fd, in_batch, + out_batch, keys, values, count, opts); +} + +int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, + void *keys, void *values, __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + return bpf_map_batch_common(BPF_MAP_LOOKUP_AND_DELETE_BATCH, + fd, in_batch, out_batch, keys, values, + count, opts); +} + +int bpf_map_update_batch(int fd, const void *keys, const void *values, __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + return bpf_map_batch_common(BPF_MAP_UPDATE_BATCH, fd, NULL, NULL, + (void *)keys, (void *)values, count, opts); +} + +int bpf_obj_pin(int fd, const char *pathname) +{ + const size_t attr_sz = offsetofend(union bpf_attr, file_flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.pathname = ptr_to_u64((void *)pathname); + attr.bpf_fd = fd; + + ret = sys_bpf(BPF_OBJ_PIN, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_obj_get(const char *pathname) +{ + return bpf_obj_get_opts(pathname, NULL); +} + +int bpf_obj_get_opts(const char *pathname, const struct bpf_obj_get_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, file_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_obj_get_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.pathname = ptr_to_u64((void *)pathname); + attr.file_flags = OPTS_GET(opts, file_flags, 0); + + fd = sys_bpf_fd(BPF_OBJ_GET, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_prog_attach(int prog_fd, int target_fd, enum bpf_attach_type type, + unsigned int flags) +{ + DECLARE_LIBBPF_OPTS(bpf_prog_attach_opts, opts, + .flags = flags, + ); + + return bpf_prog_attach_opts(prog_fd, target_fd, type, &opts); +} + +int bpf_prog_attach_opts(int prog_fd, int target_fd, + enum bpf_attach_type type, + const struct bpf_prog_attach_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, replace_bpf_fd); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_prog_attach_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.target_fd = target_fd; + attr.attach_bpf_fd = prog_fd; + attr.attach_type = type; + attr.attach_flags = OPTS_GET(opts, flags, 0); + attr.replace_bpf_fd = OPTS_GET(opts, replace_prog_fd, 0); + + ret = sys_bpf(BPF_PROG_ATTACH, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_prog_detach(int target_fd, enum bpf_attach_type type) +{ + const size_t attr_sz = offsetofend(union bpf_attr, replace_bpf_fd); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.target_fd = target_fd; + attr.attach_type = type; + + ret = sys_bpf(BPF_PROG_DETACH, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_prog_detach2(int prog_fd, int target_fd, enum bpf_attach_type type) +{ + const size_t attr_sz = offsetofend(union bpf_attr, replace_bpf_fd); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.target_fd = target_fd; + attr.attach_bpf_fd = prog_fd; + attr.attach_type = type; + + ret = sys_bpf(BPF_PROG_DETACH, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_link_create(int prog_fd, int target_fd, + enum bpf_attach_type attach_type, + const struct bpf_link_create_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, link_create); + __u32 target_btf_id, iter_info_len; + union bpf_attr attr; + int fd, err; + + if (!OPTS_VALID(opts, bpf_link_create_opts)) + return libbpf_err(-EINVAL); + + iter_info_len = OPTS_GET(opts, iter_info_len, 0); + target_btf_id = OPTS_GET(opts, target_btf_id, 0); + + /* validate we don't have unexpected combinations of non-zero fields */ + if (iter_info_len || target_btf_id) { + if (iter_info_len && target_btf_id) + return libbpf_err(-EINVAL); + if (!OPTS_ZEROED(opts, target_btf_id)) + return libbpf_err(-EINVAL); + } + + memset(&attr, 0, attr_sz); + attr.link_create.prog_fd = prog_fd; + attr.link_create.target_fd = target_fd; + attr.link_create.attach_type = attach_type; + attr.link_create.flags = OPTS_GET(opts, flags, 0); + + if (target_btf_id) { + attr.link_create.target_btf_id = target_btf_id; + goto proceed; + } + + switch (attach_type) { + case BPF_TRACE_ITER: + attr.link_create.iter_info = ptr_to_u64(OPTS_GET(opts, iter_info, (void *)0)); + attr.link_create.iter_info_len = iter_info_len; + break; + case BPF_PERF_EVENT: + attr.link_create.perf_event.bpf_cookie = OPTS_GET(opts, perf_event.bpf_cookie, 0); + if (!OPTS_ZEROED(opts, perf_event)) + return libbpf_err(-EINVAL); + break; + case BPF_TRACE_KPROBE_MULTI: + attr.link_create.kprobe_multi.flags = OPTS_GET(opts, kprobe_multi.flags, 0); + attr.link_create.kprobe_multi.cnt = OPTS_GET(opts, kprobe_multi.cnt, 0); + attr.link_create.kprobe_multi.syms = ptr_to_u64(OPTS_GET(opts, kprobe_multi.syms, 0)); + attr.link_create.kprobe_multi.addrs = ptr_to_u64(OPTS_GET(opts, kprobe_multi.addrs, 0)); + attr.link_create.kprobe_multi.cookies = ptr_to_u64(OPTS_GET(opts, kprobe_multi.cookies, 0)); + if (!OPTS_ZEROED(opts, kprobe_multi)) + return libbpf_err(-EINVAL); + break; + case BPF_TRACE_FENTRY: + case BPF_TRACE_FEXIT: + case BPF_MODIFY_RETURN: + case BPF_LSM_MAC: + attr.link_create.tracing.cookie = OPTS_GET(opts, tracing.cookie, 0); + if (!OPTS_ZEROED(opts, tracing)) + return libbpf_err(-EINVAL); + break; + default: + if (!OPTS_ZEROED(opts, flags)) + return libbpf_err(-EINVAL); + break; + } +proceed: + fd = sys_bpf_fd(BPF_LINK_CREATE, &attr, attr_sz); + if (fd >= 0) + return fd; + /* we'll get EINVAL if LINK_CREATE doesn't support attaching fentry + * and other similar programs + */ + err = -errno; + if (err != -EINVAL) + return libbpf_err(err); + + /* if user used features not supported by + * BPF_RAW_TRACEPOINT_OPEN command, then just give up immediately + */ + if (attr.link_create.target_fd || attr.link_create.target_btf_id) + return libbpf_err(err); + if (!OPTS_ZEROED(opts, sz)) + return libbpf_err(err); + + /* otherwise, for few select kinds of programs that can be + * attached using BPF_RAW_TRACEPOINT_OPEN command, try that as + * a fallback for older kernels + */ + switch (attach_type) { + case BPF_TRACE_RAW_TP: + case BPF_LSM_MAC: + case BPF_TRACE_FENTRY: + case BPF_TRACE_FEXIT: + case BPF_MODIFY_RETURN: + return bpf_raw_tracepoint_open(NULL, prog_fd); + default: + return libbpf_err(err); + } +} + +int bpf_link_detach(int link_fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, link_detach); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.link_detach.link_fd = link_fd; + + ret = sys_bpf(BPF_LINK_DETACH, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_link_update(int link_fd, int new_prog_fd, + const struct bpf_link_update_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, link_update); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_link_update_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.link_update.link_fd = link_fd; + attr.link_update.new_prog_fd = new_prog_fd; + attr.link_update.flags = OPTS_GET(opts, flags, 0); + attr.link_update.old_prog_fd = OPTS_GET(opts, old_prog_fd, 0); + + ret = sys_bpf(BPF_LINK_UPDATE, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_iter_create(int link_fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, iter_create); + union bpf_attr attr; + int fd; + + memset(&attr, 0, attr_sz); + attr.iter_create.link_fd = link_fd; + + fd = sys_bpf_fd(BPF_ITER_CREATE, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_prog_query_opts(int target_fd, + enum bpf_attach_type type, + struct bpf_prog_query_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, query); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_prog_query_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + + attr.query.target_fd = target_fd; + attr.query.attach_type = type; + attr.query.query_flags = OPTS_GET(opts, query_flags, 0); + attr.query.prog_cnt = OPTS_GET(opts, prog_cnt, 0); + attr.query.prog_ids = ptr_to_u64(OPTS_GET(opts, prog_ids, NULL)); + attr.query.prog_attach_flags = ptr_to_u64(OPTS_GET(opts, prog_attach_flags, NULL)); + + ret = sys_bpf(BPF_PROG_QUERY, &attr, attr_sz); + + OPTS_SET(opts, attach_flags, attr.query.attach_flags); + OPTS_SET(opts, prog_cnt, attr.query.prog_cnt); + + return libbpf_err_errno(ret); +} + +int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags, + __u32 *attach_flags, __u32 *prog_ids, __u32 *prog_cnt) +{ + LIBBPF_OPTS(bpf_prog_query_opts, opts); + int ret; + + opts.query_flags = query_flags; + opts.prog_ids = prog_ids; + opts.prog_cnt = *prog_cnt; + + ret = bpf_prog_query_opts(target_fd, type, &opts); + + if (attach_flags) + *attach_flags = opts.attach_flags; + *prog_cnt = opts.prog_cnt; + + return libbpf_err_errno(ret); +} + +int bpf_prog_test_run_opts(int prog_fd, struct bpf_test_run_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, test); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_test_run_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.test.prog_fd = prog_fd; + attr.test.batch_size = OPTS_GET(opts, batch_size, 0); + attr.test.cpu = OPTS_GET(opts, cpu, 0); + attr.test.flags = OPTS_GET(opts, flags, 0); + attr.test.repeat = OPTS_GET(opts, repeat, 0); + attr.test.duration = OPTS_GET(opts, duration, 0); + attr.test.ctx_size_in = OPTS_GET(opts, ctx_size_in, 0); + attr.test.ctx_size_out = OPTS_GET(opts, ctx_size_out, 0); + attr.test.data_size_in = OPTS_GET(opts, data_size_in, 0); + attr.test.data_size_out = OPTS_GET(opts, data_size_out, 0); + attr.test.ctx_in = ptr_to_u64(OPTS_GET(opts, ctx_in, NULL)); + attr.test.ctx_out = ptr_to_u64(OPTS_GET(opts, ctx_out, NULL)); + attr.test.data_in = ptr_to_u64(OPTS_GET(opts, data_in, NULL)); + attr.test.data_out = ptr_to_u64(OPTS_GET(opts, data_out, NULL)); + + ret = sys_bpf(BPF_PROG_TEST_RUN, &attr, attr_sz); + + OPTS_SET(opts, data_size_out, attr.test.data_size_out); + OPTS_SET(opts, ctx_size_out, attr.test.ctx_size_out); + OPTS_SET(opts, duration, attr.test.duration); + OPTS_SET(opts, retval, attr.test.retval); + + return libbpf_err_errno(ret); +} + +static int bpf_obj_get_next_id(__u32 start_id, __u32 *next_id, int cmd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int err; + + memset(&attr, 0, attr_sz); + attr.start_id = start_id; + + err = sys_bpf(cmd, &attr, attr_sz); + if (!err) + *next_id = attr.next_id; + + return libbpf_err_errno(err); +} + +int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id) +{ + return bpf_obj_get_next_id(start_id, next_id, BPF_PROG_GET_NEXT_ID); +} + +int bpf_map_get_next_id(__u32 start_id, __u32 *next_id) +{ + return bpf_obj_get_next_id(start_id, next_id, BPF_MAP_GET_NEXT_ID); +} + +int bpf_btf_get_next_id(__u32 start_id, __u32 *next_id) +{ + return bpf_obj_get_next_id(start_id, next_id, BPF_BTF_GET_NEXT_ID); +} + +int bpf_link_get_next_id(__u32 start_id, __u32 *next_id) +{ + return bpf_obj_get_next_id(start_id, next_id, BPF_LINK_GET_NEXT_ID); +} + +int bpf_prog_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_get_fd_by_id_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.prog_id = id; + attr.open_flags = OPTS_GET(opts, open_flags, 0); + + fd = sys_bpf_fd(BPF_PROG_GET_FD_BY_ID, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_prog_get_fd_by_id(__u32 id) +{ + return bpf_prog_get_fd_by_id_opts(id, NULL); +} + +int bpf_map_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_get_fd_by_id_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.map_id = id; + attr.open_flags = OPTS_GET(opts, open_flags, 0); + + fd = sys_bpf_fd(BPF_MAP_GET_FD_BY_ID, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_map_get_fd_by_id(__u32 id) +{ + return bpf_map_get_fd_by_id_opts(id, NULL); +} + +int bpf_btf_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_get_fd_by_id_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.btf_id = id; + attr.open_flags = OPTS_GET(opts, open_flags, 0); + + fd = sys_bpf_fd(BPF_BTF_GET_FD_BY_ID, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_btf_get_fd_by_id(__u32 id) +{ + return bpf_btf_get_fd_by_id_opts(id, NULL); +} + +int bpf_link_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_get_fd_by_id_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.link_id = id; + attr.open_flags = OPTS_GET(opts, open_flags, 0); + + fd = sys_bpf_fd(BPF_LINK_GET_FD_BY_ID, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_link_get_fd_by_id(__u32 id) +{ + return bpf_link_get_fd_by_id_opts(id, NULL); +} + +int bpf_obj_get_info_by_fd(int bpf_fd, void *info, __u32 *info_len) +{ + const size_t attr_sz = offsetofend(union bpf_attr, info); + union bpf_attr attr; + int err; + + memset(&attr, 0, attr_sz); + attr.info.bpf_fd = bpf_fd; + attr.info.info_len = *info_len; + attr.info.info = ptr_to_u64(info); + + err = sys_bpf(BPF_OBJ_GET_INFO_BY_FD, &attr, attr_sz); + if (!err) + *info_len = attr.info.info_len; + return libbpf_err_errno(err); +} + +int bpf_prog_get_info_by_fd(int prog_fd, struct bpf_prog_info *info, __u32 *info_len) +{ + return bpf_obj_get_info_by_fd(prog_fd, info, info_len); +} + +int bpf_map_get_info_by_fd(int map_fd, struct bpf_map_info *info, __u32 *info_len) +{ + return bpf_obj_get_info_by_fd(map_fd, info, info_len); +} + +int bpf_btf_get_info_by_fd(int btf_fd, struct bpf_btf_info *info, __u32 *info_len) +{ + return bpf_obj_get_info_by_fd(btf_fd, info, info_len); +} + +int bpf_link_get_info_by_fd(int link_fd, struct bpf_link_info *info, __u32 *info_len) +{ + return bpf_obj_get_info_by_fd(link_fd, info, info_len); +} + +int bpf_raw_tracepoint_open(const char *name, int prog_fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, raw_tracepoint); + union bpf_attr attr; + int fd; + + memset(&attr, 0, attr_sz); + attr.raw_tracepoint.name = ptr_to_u64(name); + attr.raw_tracepoint.prog_fd = prog_fd; + + fd = sys_bpf_fd(BPF_RAW_TRACEPOINT_OPEN, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_btf_load(const void *btf_data, size_t btf_size, const struct bpf_btf_load_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, btf_log_level); + union bpf_attr attr; + char *log_buf; + size_t log_size; + __u32 log_level; + int fd; + + bump_rlimit_memlock(); + + memset(&attr, 0, attr_sz); + + if (!OPTS_VALID(opts, bpf_btf_load_opts)) + return libbpf_err(-EINVAL); + + log_buf = OPTS_GET(opts, log_buf, NULL); + log_size = OPTS_GET(opts, log_size, 0); + log_level = OPTS_GET(opts, log_level, 0); + + if (log_size > UINT_MAX) + return libbpf_err(-EINVAL); + if (log_size && !log_buf) + return libbpf_err(-EINVAL); + + attr.btf = ptr_to_u64(btf_data); + attr.btf_size = btf_size; + /* log_level == 0 and log_buf != NULL means "try loading without + * log_buf, but retry with log_buf and log_level=1 on error", which is + * consistent across low-level and high-level BTF and program loading + * APIs within libbpf and provides a sensible behavior in practice + */ + if (log_level) { + attr.btf_log_buf = ptr_to_u64(log_buf); + attr.btf_log_size = (__u32)log_size; + attr.btf_log_level = log_level; + } + + fd = sys_bpf_fd(BPF_BTF_LOAD, &attr, attr_sz); + if (fd < 0 && log_buf && log_level == 0) { + attr.btf_log_buf = ptr_to_u64(log_buf); + attr.btf_log_size = (__u32)log_size; + attr.btf_log_level = 1; + fd = sys_bpf_fd(BPF_BTF_LOAD, &attr, attr_sz); + } + return libbpf_err_errno(fd); +} + +int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, __u32 *buf_len, + __u32 *prog_id, __u32 *fd_type, __u64 *probe_offset, + __u64 *probe_addr) +{ + const size_t attr_sz = offsetofend(union bpf_attr, task_fd_query); + union bpf_attr attr; + int err; + + memset(&attr, 0, attr_sz); + attr.task_fd_query.pid = pid; + attr.task_fd_query.fd = fd; + attr.task_fd_query.flags = flags; + attr.task_fd_query.buf = ptr_to_u64(buf); + attr.task_fd_query.buf_len = *buf_len; + + err = sys_bpf(BPF_TASK_FD_QUERY, &attr, attr_sz); + + *buf_len = attr.task_fd_query.buf_len; + *prog_id = attr.task_fd_query.prog_id; + *fd_type = attr.task_fd_query.fd_type; + *probe_offset = attr.task_fd_query.probe_offset; + *probe_addr = attr.task_fd_query.probe_addr; + + return libbpf_err_errno(err); +} + +int bpf_enable_stats(enum bpf_stats_type type) +{ + const size_t attr_sz = offsetofend(union bpf_attr, enable_stats); + union bpf_attr attr; + int fd; + + memset(&attr, 0, attr_sz); + attr.enable_stats.type = type; + + fd = sys_bpf_fd(BPF_ENABLE_STATS, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_prog_bind_map(int prog_fd, int map_fd, + const struct bpf_prog_bind_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, prog_bind_map); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_prog_bind_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.prog_bind_map.prog_fd = prog_fd; + attr.prog_bind_map.map_fd = map_fd; + attr.prog_bind_map.flags = OPTS_GET(opts, flags, 0); + + ret = sys_bpf(BPF_PROG_BIND_MAP, &attr, attr_sz); + return libbpf_err_errno(ret); +} diff --git a/bpftool/libbpf/src/bpf.h b/bpftool/libbpf/src/bpf.h new file mode 100644 index 0000000..9ed9bce --- /dev/null +++ b/bpftool/libbpf/src/bpf.h @@ -0,0 +1,470 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * common eBPF ELF operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + */ +#ifndef __LIBBPF_BPF_H +#define __LIBBPF_BPF_H + +#include +#include +#include +#include + +#include "libbpf_common.h" +#include "libbpf_legacy.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int libbpf_set_memlock_rlim(size_t memlock_bytes); + +struct bpf_map_create_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + __u32 btf_fd; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + + __u32 inner_map_fd; + __u32 map_flags; + __u64 map_extra; + + __u32 numa_node; + __u32 map_ifindex; +}; +#define bpf_map_create_opts__last_field map_ifindex + +LIBBPF_API int bpf_map_create(enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, + __u32 value_size, + __u32 max_entries, + const struct bpf_map_create_opts *opts); + +struct bpf_prog_load_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + /* libbpf can retry BPF_PROG_LOAD command if bpf() syscall returns + * -EAGAIN. This field determines how many attempts libbpf has to + * make. If not specified, libbpf will use default value of 5. + */ + int attempts; + + enum bpf_attach_type expected_attach_type; + __u32 prog_btf_fd; + __u32 prog_flags; + __u32 prog_ifindex; + __u32 kern_version; + + __u32 attach_btf_id; + __u32 attach_prog_fd; + __u32 attach_btf_obj_fd; + + const int *fd_array; + + /* .BTF.ext func info data */ + const void *func_info; + __u32 func_info_cnt; + __u32 func_info_rec_size; + + /* .BTF.ext line info data */ + const void *line_info; + __u32 line_info_cnt; + __u32 line_info_rec_size; + + /* verifier log options */ + __u32 log_level; + __u32 log_size; + char *log_buf; +}; +#define bpf_prog_load_opts__last_field log_buf + +LIBBPF_API int bpf_prog_load(enum bpf_prog_type prog_type, + const char *prog_name, const char *license, + const struct bpf_insn *insns, size_t insn_cnt, + const struct bpf_prog_load_opts *opts); + +/* Flags to direct loading requirements */ +#define MAPS_RELAX_COMPAT 0x01 + +/* Recommended log buffer size */ +#define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */ + +struct bpf_btf_load_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + /* kernel log options */ + char *log_buf; + __u32 log_level; + __u32 log_size; +}; +#define bpf_btf_load_opts__last_field log_size + +LIBBPF_API int bpf_btf_load(const void *btf_data, size_t btf_size, + const struct bpf_btf_load_opts *opts); + +LIBBPF_API int bpf_map_update_elem(int fd, const void *key, const void *value, + __u64 flags); + +LIBBPF_API int bpf_map_lookup_elem(int fd, const void *key, void *value); +LIBBPF_API int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, + __u64 flags); +LIBBPF_API int bpf_map_lookup_and_delete_elem(int fd, const void *key, + void *value); +LIBBPF_API int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, + void *value, __u64 flags); +LIBBPF_API int bpf_map_delete_elem(int fd, const void *key); +LIBBPF_API int bpf_map_delete_elem_flags(int fd, const void *key, __u64 flags); +LIBBPF_API int bpf_map_get_next_key(int fd, const void *key, void *next_key); +LIBBPF_API int bpf_map_freeze(int fd); + +struct bpf_map_batch_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u64 elem_flags; + __u64 flags; +}; +#define bpf_map_batch_opts__last_field flags + + +/** + * @brief **bpf_map_delete_batch()** allows for batch deletion of multiple + * elements in a BPF map. + * + * @param fd BPF map file descriptor + * @param keys pointer to an array of *count* keys + * @param count input and output parameter; on input **count** represents the + * number of elements in the map to delete in batch; + * on output if a non-EFAULT error is returned, **count** represents the number of deleted + * elements if the output **count** value is not equal to the input **count** value + * If EFAULT is returned, **count** should not be trusted to be correct. + * @param opts options for configuring the way the batch deletion works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_delete_batch(int fd, const void *keys, + __u32 *count, + const struct bpf_map_batch_opts *opts); + +/** + * @brief **bpf_map_lookup_batch()** allows for batch lookup of BPF map elements. + * + * The parameter *in_batch* is the address of the first element in the batch to read. + * *out_batch* is an output parameter that should be passed as *in_batch* to subsequent + * calls to **bpf_map_lookup_batch()**. NULL can be passed for *in_batch* to indicate + * that the batched lookup starts from the beginning of the map. + * + * The *keys* and *values* are output parameters which must point to memory large enough to + * hold *count* items based on the key and value size of the map *map_fd*. The *keys* + * buffer must be of *key_size* * *count*. The *values* buffer must be of + * *value_size* * *count*. + * + * @param fd BPF map file descriptor + * @param in_batch address of the first element in batch to read, can pass NULL to + * indicate that the batched lookup starts from the beginning of the map. + * @param out_batch output parameter that should be passed to next call as *in_batch* + * @param keys pointer to an array large enough for *count* keys + * @param values pointer to an array large enough for *count* values + * @param count input and output parameter; on input it's the number of elements + * in the map to read in batch; on output it's the number of elements that were + * successfully read. + * If a non-EFAULT error is returned, count will be set as the number of elements + * that were read before the error occurred. + * If EFAULT is returned, **count** should not be trusted to be correct. + * @param opts options for configuring the way the batch lookup works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_lookup_batch(int fd, void *in_batch, void *out_batch, + void *keys, void *values, __u32 *count, + const struct bpf_map_batch_opts *opts); + +/** + * @brief **bpf_map_lookup_and_delete_batch()** allows for batch lookup and deletion + * of BPF map elements where each element is deleted after being retrieved. + * + * @param fd BPF map file descriptor + * @param in_batch address of the first element in batch to read, can pass NULL to + * get address of the first element in *out_batch* + * @param out_batch output parameter that should be passed to next call as *in_batch* + * @param keys pointer to an array of *count* keys + * @param values pointer to an array large enough for *count* values + * @param count input and output parameter; on input it's the number of elements + * in the map to read and delete in batch; on output it represents the number of + * elements that were successfully read and deleted + * If a non-**EFAULT** error code is returned and if the output **count** value + * is not equal to the input **count** value, up to **count** elements may + * have been deleted. + * if **EFAULT** is returned up to *count* elements may have been deleted without + * being returned via the *keys* and *values* output parameters. + * @param opts options for configuring the way the batch lookup and delete works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, + void *out_batch, void *keys, + void *values, __u32 *count, + const struct bpf_map_batch_opts *opts); + +/** + * @brief **bpf_map_update_batch()** updates multiple elements in a map + * by specifying keys and their corresponding values. + * + * The *keys* and *values* parameters must point to memory large enough + * to hold *count* items based on the key and value size of the map. + * + * The *opts* parameter can be used to control how *bpf_map_update_batch()* + * should handle keys that either do or do not already exist in the map. + * In particular the *flags* parameter of *bpf_map_batch_opts* can be + * one of the following: + * + * Note that *count* is an input and output parameter, where on output it + * represents how many elements were successfully updated. Also note that if + * **EFAULT** then *count* should not be trusted to be correct. + * + * **BPF_ANY** + * Create new elements or update existing. + * + * **BPF_NOEXIST** + * Create new elements only if they do not exist. + * + * **BPF_EXIST** + * Update existing elements. + * + * **BPF_F_LOCK** + * Update spin_lock-ed map elements. This must be + * specified if the map value contains a spinlock. + * + * @param fd BPF map file descriptor + * @param keys pointer to an array of *count* keys + * @param values pointer to an array of *count* values + * @param count input and output parameter; on input it's the number of elements + * in the map to update in batch; on output if a non-EFAULT error is returned, + * **count** represents the number of updated elements if the output **count** + * value is not equal to the input **count** value. + * If EFAULT is returned, **count** should not be trusted to be correct. + * @param opts options for configuring the way the batch update works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_update_batch(int fd, const void *keys, const void *values, + __u32 *count, + const struct bpf_map_batch_opts *opts); + +struct bpf_obj_get_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + __u32 file_flags; + + size_t :0; +}; +#define bpf_obj_get_opts__last_field file_flags + +LIBBPF_API int bpf_obj_pin(int fd, const char *pathname); +LIBBPF_API int bpf_obj_get(const char *pathname); +LIBBPF_API int bpf_obj_get_opts(const char *pathname, + const struct bpf_obj_get_opts *opts); + +struct bpf_prog_attach_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + unsigned int flags; + int replace_prog_fd; +}; +#define bpf_prog_attach_opts__last_field replace_prog_fd + +LIBBPF_API int bpf_prog_attach(int prog_fd, int attachable_fd, + enum bpf_attach_type type, unsigned int flags); +LIBBPF_API int bpf_prog_attach_opts(int prog_fd, int attachable_fd, + enum bpf_attach_type type, + const struct bpf_prog_attach_opts *opts); +LIBBPF_API int bpf_prog_detach(int attachable_fd, enum bpf_attach_type type); +LIBBPF_API int bpf_prog_detach2(int prog_fd, int attachable_fd, + enum bpf_attach_type type); + +union bpf_iter_link_info; /* defined in up-to-date linux/bpf.h */ +struct bpf_link_create_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 flags; + union bpf_iter_link_info *iter_info; + __u32 iter_info_len; + __u32 target_btf_id; + union { + struct { + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + const char **syms; + const unsigned long *addrs; + const __u64 *cookies; + } kprobe_multi; + struct { + __u64 cookie; + } tracing; + }; + size_t :0; +}; +#define bpf_link_create_opts__last_field kprobe_multi.cookies + +LIBBPF_API int bpf_link_create(int prog_fd, int target_fd, + enum bpf_attach_type attach_type, + const struct bpf_link_create_opts *opts); + +LIBBPF_API int bpf_link_detach(int link_fd); + +struct bpf_link_update_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 flags; /* extra flags */ + __u32 old_prog_fd; /* expected old program FD */ +}; +#define bpf_link_update_opts__last_field old_prog_fd + +LIBBPF_API int bpf_link_update(int link_fd, int new_prog_fd, + const struct bpf_link_update_opts *opts); + +LIBBPF_API int bpf_iter_create(int link_fd); + +struct bpf_prog_test_run_attr { + int prog_fd; + int repeat; + const void *data_in; + __u32 data_size_in; + void *data_out; /* optional */ + __u32 data_size_out; /* in: max length of data_out + * out: length of data_out */ + __u32 retval; /* out: return code of the BPF program */ + __u32 duration; /* out: average per repetition in ns */ + const void *ctx_in; /* optional */ + __u32 ctx_size_in; + void *ctx_out; /* optional */ + __u32 ctx_size_out; /* in: max length of ctx_out + * out: length of cxt_out */ +}; + +LIBBPF_API int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id); +LIBBPF_API int bpf_map_get_next_id(__u32 start_id, __u32 *next_id); +LIBBPF_API int bpf_btf_get_next_id(__u32 start_id, __u32 *next_id); +LIBBPF_API int bpf_link_get_next_id(__u32 start_id, __u32 *next_id); + +struct bpf_get_fd_by_id_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 open_flags; /* permissions requested for the operation on fd */ + size_t :0; +}; +#define bpf_get_fd_by_id_opts__last_field open_flags + +LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_prog_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_map_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_map_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_btf_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_btf_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_link_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_link_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_obj_get_info_by_fd(int bpf_fd, void *info, __u32 *info_len); +/* Type-safe variants of bpf_obj_get_info_by_fd(). The callers still needs to + * pass info_len, which should normally be + * sizeof(struct bpf_{prog,map,btf,link}_info), in order to be compatible with + * different libbpf and kernel versions. + */ +LIBBPF_API int bpf_prog_get_info_by_fd(int prog_fd, struct bpf_prog_info *info, __u32 *info_len); +LIBBPF_API int bpf_map_get_info_by_fd(int map_fd, struct bpf_map_info *info, __u32 *info_len); +LIBBPF_API int bpf_btf_get_info_by_fd(int btf_fd, struct bpf_btf_info *info, __u32 *info_len); +LIBBPF_API int bpf_link_get_info_by_fd(int link_fd, struct bpf_link_info *info, __u32 *info_len); + +struct bpf_prog_query_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 query_flags; + __u32 attach_flags; /* output argument */ + __u32 *prog_ids; + __u32 prog_cnt; /* input+output argument */ + __u32 *prog_attach_flags; +}; +#define bpf_prog_query_opts__last_field prog_attach_flags + +LIBBPF_API int bpf_prog_query_opts(int target_fd, + enum bpf_attach_type type, + struct bpf_prog_query_opts *opts); +LIBBPF_API int bpf_prog_query(int target_fd, enum bpf_attach_type type, + __u32 query_flags, __u32 *attach_flags, + __u32 *prog_ids, __u32 *prog_cnt); + +LIBBPF_API int bpf_raw_tracepoint_open(const char *name, int prog_fd); +LIBBPF_API int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, + __u32 *buf_len, __u32 *prog_id, __u32 *fd_type, + __u64 *probe_offset, __u64 *probe_addr); + +#ifdef __cplusplus +/* forward-declaring enums in C++ isn't compatible with pure C enums, so + * instead define bpf_enable_stats() as accepting int as an input + */ +LIBBPF_API int bpf_enable_stats(int type); +#else +enum bpf_stats_type; /* defined in up-to-date linux/bpf.h */ +LIBBPF_API int bpf_enable_stats(enum bpf_stats_type type); +#endif + +struct bpf_prog_bind_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 flags; +}; +#define bpf_prog_bind_opts__last_field flags + +LIBBPF_API int bpf_prog_bind_map(int prog_fd, int map_fd, + const struct bpf_prog_bind_opts *opts); + +struct bpf_test_run_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + const void *data_in; /* optional */ + void *data_out; /* optional */ + __u32 data_size_in; + __u32 data_size_out; /* in: max length of data_out + * out: length of data_out + */ + const void *ctx_in; /* optional */ + void *ctx_out; /* optional */ + __u32 ctx_size_in; + __u32 ctx_size_out; /* in: max length of ctx_out + * out: length of cxt_out + */ + __u32 retval; /* out: return code of the BPF program */ + int repeat; + __u32 duration; /* out: average per repetition in ns */ + __u32 flags; + __u32 cpu; + __u32 batch_size; +}; +#define bpf_test_run_opts__last_field batch_size + +LIBBPF_API int bpf_prog_test_run_opts(int prog_fd, + struct bpf_test_run_opts *opts); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_BPF_H */ diff --git a/bpftool/libbpf/src/bpf_core_read.h b/bpftool/libbpf/src/bpf_core_read.h new file mode 100644 index 0000000..1ac57bb --- /dev/null +++ b/bpftool/libbpf/src/bpf_core_read.h @@ -0,0 +1,484 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_CORE_READ_H__ +#define __BPF_CORE_READ_H__ + +/* + * enum bpf_field_info_kind is passed as a second argument into + * __builtin_preserve_field_info() built-in to get a specific aspect of + * a field, captured as a first argument. __builtin_preserve_field_info(field, + * info_kind) returns __u32 integer and produces BTF field relocation, which + * is understood and processed by libbpf during BPF object loading. See + * selftests/bpf for examples. + */ +enum bpf_field_info_kind { + BPF_FIELD_BYTE_OFFSET = 0, /* field byte offset */ + BPF_FIELD_BYTE_SIZE = 1, + BPF_FIELD_EXISTS = 2, /* field existence in target kernel */ + BPF_FIELD_SIGNED = 3, + BPF_FIELD_LSHIFT_U64 = 4, + BPF_FIELD_RSHIFT_U64 = 5, +}; + +/* second argument to __builtin_btf_type_id() built-in */ +enum bpf_type_id_kind { + BPF_TYPE_ID_LOCAL = 0, /* BTF type ID in local program */ + BPF_TYPE_ID_TARGET = 1, /* BTF type ID in target kernel */ +}; + +/* second argument to __builtin_preserve_type_info() built-in */ +enum bpf_type_info_kind { + BPF_TYPE_EXISTS = 0, /* type existence in target kernel */ + BPF_TYPE_SIZE = 1, /* type size in target kernel */ + BPF_TYPE_MATCHES = 2, /* type match in target kernel */ +}; + +/* second argument to __builtin_preserve_enum_value() built-in */ +enum bpf_enum_value_kind { + BPF_ENUMVAL_EXISTS = 0, /* enum value existence in kernel */ + BPF_ENUMVAL_VALUE = 1, /* enum value value relocation */ +}; + +#define __CORE_RELO(src, field, info) \ + __builtin_preserve_field_info((src)->field, BPF_FIELD_##info) + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define __CORE_BITFIELD_PROBE_READ(dst, src, fld) \ + bpf_probe_read_kernel( \ + (void *)dst, \ + __CORE_RELO(src, fld, BYTE_SIZE), \ + (const void *)src + __CORE_RELO(src, fld, BYTE_OFFSET)) +#else +/* semantics of LSHIFT_64 assumes loading values into low-ordered bytes, so + * for big-endian we need to adjust destination pointer accordingly, based on + * field byte size + */ +#define __CORE_BITFIELD_PROBE_READ(dst, src, fld) \ + bpf_probe_read_kernel( \ + (void *)dst + (8 - __CORE_RELO(src, fld, BYTE_SIZE)), \ + __CORE_RELO(src, fld, BYTE_SIZE), \ + (const void *)src + __CORE_RELO(src, fld, BYTE_OFFSET)) +#endif + +/* + * Extract bitfield, identified by s->field, and return its value as u64. + * All this is done in relocatable manner, so bitfield changes such as + * signedness, bit size, offset changes, this will be handled automatically. + * This version of macro is using bpf_probe_read_kernel() to read underlying + * integer storage. Macro functions as an expression and its return type is + * bpf_probe_read_kernel()'s return value: 0, on success, <0 on error. + */ +#define BPF_CORE_READ_BITFIELD_PROBED(s, field) ({ \ + unsigned long long val = 0; \ + \ + __CORE_BITFIELD_PROBE_READ(&val, s, field); \ + val <<= __CORE_RELO(s, field, LSHIFT_U64); \ + if (__CORE_RELO(s, field, SIGNED)) \ + val = ((long long)val) >> __CORE_RELO(s, field, RSHIFT_U64); \ + else \ + val = val >> __CORE_RELO(s, field, RSHIFT_U64); \ + val; \ +}) + +/* + * Extract bitfield, identified by s->field, and return its value as u64. + * This version of macro is using direct memory reads and should be used from + * BPF program types that support such functionality (e.g., typed raw + * tracepoints). + */ +#define BPF_CORE_READ_BITFIELD(s, field) ({ \ + const void *p = (const void *)s + __CORE_RELO(s, field, BYTE_OFFSET); \ + unsigned long long val; \ + \ + /* This is a so-called barrier_var() operation that makes specified \ + * variable "a black box" for optimizing compiler. \ + * It forces compiler to perform BYTE_OFFSET relocation on p and use \ + * its calculated value in the switch below, instead of applying \ + * the same relocation 4 times for each individual memory load. \ + */ \ + asm volatile("" : "=r"(p) : "0"(p)); \ + \ + switch (__CORE_RELO(s, field, BYTE_SIZE)) { \ + case 1: val = *(const unsigned char *)p; break; \ + case 2: val = *(const unsigned short *)p; break; \ + case 4: val = *(const unsigned int *)p; break; \ + case 8: val = *(const unsigned long long *)p; break; \ + } \ + val <<= __CORE_RELO(s, field, LSHIFT_U64); \ + if (__CORE_RELO(s, field, SIGNED)) \ + val = ((long long)val) >> __CORE_RELO(s, field, RSHIFT_U64); \ + else \ + val = val >> __CORE_RELO(s, field, RSHIFT_U64); \ + val; \ +}) + +#define ___bpf_field_ref1(field) (field) +#define ___bpf_field_ref2(type, field) (((typeof(type) *)0)->field) +#define ___bpf_field_ref(args...) \ + ___bpf_apply(___bpf_field_ref, ___bpf_narg(args))(args) + +/* + * Convenience macro to check that field actually exists in target kernel's. + * Returns: + * 1, if matching field is present in target kernel; + * 0, if no matching field found. + * + * Supports two forms: + * - field reference through variable access: + * bpf_core_field_exists(p->my_field); + * - field reference through type and field names: + * bpf_core_field_exists(struct my_type, my_field). + */ +#define bpf_core_field_exists(field...) \ + __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_EXISTS) + +/* + * Convenience macro to get the byte size of a field. Works for integers, + * struct/unions, pointers, arrays, and enums. + * + * Supports two forms: + * - field reference through variable access: + * bpf_core_field_size(p->my_field); + * - field reference through type and field names: + * bpf_core_field_size(struct my_type, my_field). + */ +#define bpf_core_field_size(field...) \ + __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_BYTE_SIZE) + +/* + * Convenience macro to get field's byte offset. + * + * Supports two forms: + * - field reference through variable access: + * bpf_core_field_offset(p->my_field); + * - field reference through type and field names: + * bpf_core_field_offset(struct my_type, my_field). + */ +#define bpf_core_field_offset(field...) \ + __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_BYTE_OFFSET) + +/* + * Convenience macro to get BTF type ID of a specified type, using a local BTF + * information. Return 32-bit unsigned integer with type ID from program's own + * BTF. Always succeeds. + */ +#define bpf_core_type_id_local(type) \ + __builtin_btf_type_id(*(typeof(type) *)0, BPF_TYPE_ID_LOCAL) + +/* + * Convenience macro to get BTF type ID of a target kernel's type that matches + * specified local type. + * Returns: + * - valid 32-bit unsigned type ID in kernel BTF; + * - 0, if no matching type was found in a target kernel BTF. + */ +#define bpf_core_type_id_kernel(type) \ + __builtin_btf_type_id(*(typeof(type) *)0, BPF_TYPE_ID_TARGET) + +/* + * Convenience macro to check that provided named type + * (struct/union/enum/typedef) exists in a target kernel. + * Returns: + * 1, if such type is present in target kernel's BTF; + * 0, if no matching type is found. + */ +#define bpf_core_type_exists(type) \ + __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_EXISTS) + +/* + * Convenience macro to check that provided named type + * (struct/union/enum/typedef) "matches" that in a target kernel. + * Returns: + * 1, if the type matches in the target kernel's BTF; + * 0, if the type does not match any in the target kernel + */ +#define bpf_core_type_matches(type) \ + __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_MATCHES) + +/* + * Convenience macro to get the byte size of a provided named type + * (struct/union/enum/typedef) in a target kernel. + * Returns: + * >= 0 size (in bytes), if type is present in target kernel's BTF; + * 0, if no matching type is found. + */ +#define bpf_core_type_size(type) \ + __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_SIZE) + +/* + * Convenience macro to check that provided enumerator value is defined in + * a target kernel. + * Returns: + * 1, if specified enum type and its enumerator value are present in target + * kernel's BTF; + * 0, if no matching enum and/or enum value within that enum is found. + */ +#define bpf_core_enum_value_exists(enum_type, enum_value) \ + __builtin_preserve_enum_value(*(typeof(enum_type) *)enum_value, BPF_ENUMVAL_EXISTS) + +/* + * Convenience macro to get the integer value of an enumerator value in + * a target kernel. + * Returns: + * 64-bit value, if specified enum type and its enumerator value are + * present in target kernel's BTF; + * 0, if no matching enum and/or enum value within that enum is found. + */ +#define bpf_core_enum_value(enum_type, enum_value) \ + __builtin_preserve_enum_value(*(typeof(enum_type) *)enum_value, BPF_ENUMVAL_VALUE) + +/* + * bpf_core_read() abstracts away bpf_probe_read_kernel() call and captures + * offset relocation for source address using __builtin_preserve_access_index() + * built-in, provided by Clang. + * + * __builtin_preserve_access_index() takes as an argument an expression of + * taking an address of a field within struct/union. It makes compiler emit + * a relocation, which records BTF type ID describing root struct/union and an + * accessor string which describes exact embedded field that was used to take + * an address. See detailed description of this relocation format and + * semantics in comments to struct bpf_field_reloc in libbpf_internal.h. + * + * This relocation allows libbpf to adjust BPF instruction to use correct + * actual field offset, based on target kernel BTF type that matches original + * (local) BTF, used to record relocation. + */ +#define bpf_core_read(dst, sz, src) \ + bpf_probe_read_kernel(dst, sz, (const void *)__builtin_preserve_access_index(src)) + +/* NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. */ +#define bpf_core_read_user(dst, sz, src) \ + bpf_probe_read_user(dst, sz, (const void *)__builtin_preserve_access_index(src)) +/* + * bpf_core_read_str() is a thin wrapper around bpf_probe_read_str() + * additionally emitting BPF CO-RE field relocation for specified source + * argument. + */ +#define bpf_core_read_str(dst, sz, src) \ + bpf_probe_read_kernel_str(dst, sz, (const void *)__builtin_preserve_access_index(src)) + +/* NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. */ +#define bpf_core_read_user_str(dst, sz, src) \ + bpf_probe_read_user_str(dst, sz, (const void *)__builtin_preserve_access_index(src)) + +#define ___concat(a, b) a ## b +#define ___apply(fn, n) ___concat(fn, n) +#define ___nth(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, __11, N, ...) N + +/* + * return number of provided arguments; used for switch-based variadic macro + * definitions (see ___last, ___arrow, etc below) + */ +#define ___narg(...) ___nth(_, ##__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +/* + * return 0 if no arguments are passed, N - otherwise; used for + * recursively-defined macros to specify termination (0) case, and generic + * (N) case (e.g., ___read_ptrs, ___core_read) + */ +#define ___empty(...) ___nth(_, ##__VA_ARGS__, N, N, N, N, N, N, N, N, N, N, 0) + +#define ___last1(x) x +#define ___last2(a, x) x +#define ___last3(a, b, x) x +#define ___last4(a, b, c, x) x +#define ___last5(a, b, c, d, x) x +#define ___last6(a, b, c, d, e, x) x +#define ___last7(a, b, c, d, e, f, x) x +#define ___last8(a, b, c, d, e, f, g, x) x +#define ___last9(a, b, c, d, e, f, g, h, x) x +#define ___last10(a, b, c, d, e, f, g, h, i, x) x +#define ___last(...) ___apply(___last, ___narg(__VA_ARGS__))(__VA_ARGS__) + +#define ___nolast2(a, _) a +#define ___nolast3(a, b, _) a, b +#define ___nolast4(a, b, c, _) a, b, c +#define ___nolast5(a, b, c, d, _) a, b, c, d +#define ___nolast6(a, b, c, d, e, _) a, b, c, d, e +#define ___nolast7(a, b, c, d, e, f, _) a, b, c, d, e, f +#define ___nolast8(a, b, c, d, e, f, g, _) a, b, c, d, e, f, g +#define ___nolast9(a, b, c, d, e, f, g, h, _) a, b, c, d, e, f, g, h +#define ___nolast10(a, b, c, d, e, f, g, h, i, _) a, b, c, d, e, f, g, h, i +#define ___nolast(...) ___apply(___nolast, ___narg(__VA_ARGS__))(__VA_ARGS__) + +#define ___arrow1(a) a +#define ___arrow2(a, b) a->b +#define ___arrow3(a, b, c) a->b->c +#define ___arrow4(a, b, c, d) a->b->c->d +#define ___arrow5(a, b, c, d, e) a->b->c->d->e +#define ___arrow6(a, b, c, d, e, f) a->b->c->d->e->f +#define ___arrow7(a, b, c, d, e, f, g) a->b->c->d->e->f->g +#define ___arrow8(a, b, c, d, e, f, g, h) a->b->c->d->e->f->g->h +#define ___arrow9(a, b, c, d, e, f, g, h, i) a->b->c->d->e->f->g->h->i +#define ___arrow10(a, b, c, d, e, f, g, h, i, j) a->b->c->d->e->f->g->h->i->j +#define ___arrow(...) ___apply(___arrow, ___narg(__VA_ARGS__))(__VA_ARGS__) + +#define ___type(...) typeof(___arrow(__VA_ARGS__)) + +#define ___read(read_fn, dst, src_type, src, accessor) \ + read_fn((void *)(dst), sizeof(*(dst)), &((src_type)(src))->accessor) + +/* "recursively" read a sequence of inner pointers using local __t var */ +#define ___rd_first(fn, src, a) ___read(fn, &__t, ___type(src), src, a); +#define ___rd_last(fn, ...) \ + ___read(fn, &__t, ___type(___nolast(__VA_ARGS__)), __t, ___last(__VA_ARGS__)); +#define ___rd_p1(fn, ...) const void *__t; ___rd_first(fn, __VA_ARGS__) +#define ___rd_p2(fn, ...) ___rd_p1(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p3(fn, ...) ___rd_p2(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p4(fn, ...) ___rd_p3(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p5(fn, ...) ___rd_p4(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p6(fn, ...) ___rd_p5(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p7(fn, ...) ___rd_p6(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p8(fn, ...) ___rd_p7(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p9(fn, ...) ___rd_p8(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___read_ptrs(fn, src, ...) \ + ___apply(___rd_p, ___narg(__VA_ARGS__))(fn, src, __VA_ARGS__) + +#define ___core_read0(fn, fn_ptr, dst, src, a) \ + ___read(fn, dst, ___type(src), src, a); +#define ___core_readN(fn, fn_ptr, dst, src, ...) \ + ___read_ptrs(fn_ptr, src, ___nolast(__VA_ARGS__)) \ + ___read(fn, dst, ___type(src, ___nolast(__VA_ARGS__)), __t, \ + ___last(__VA_ARGS__)); +#define ___core_read(fn, fn_ptr, dst, src, a, ...) \ + ___apply(___core_read, ___empty(__VA_ARGS__))(fn, fn_ptr, dst, \ + src, a, ##__VA_ARGS__) + +/* + * BPF_CORE_READ_INTO() is a more performance-conscious variant of + * BPF_CORE_READ(), in which final field is read into user-provided storage. + * See BPF_CORE_READ() below for more details on general usage. + */ +#define BPF_CORE_READ_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read, bpf_core_read, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * Variant of BPF_CORE_READ_INTO() for reading from user-space memory. + * + * NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. + */ +#define BPF_CORE_READ_USER_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read_user, bpf_core_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ_INTO() */ +#define BPF_PROBE_READ_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_kernel, bpf_probe_read_kernel, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ_USER_INTO(). + * + * As no CO-RE relocations are emitted, source types can be arbitrary and are + * not restricted to kernel types only. + */ +#define BPF_PROBE_READ_USER_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_user, bpf_probe_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * BPF_CORE_READ_STR_INTO() does same "pointer chasing" as + * BPF_CORE_READ() for intermediate pointers, but then executes (and returns + * corresponding error code) bpf_core_read_str() for final string read. + */ +#define BPF_CORE_READ_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read_str, bpf_core_read, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * Variant of BPF_CORE_READ_STR_INTO() for reading from user-space memory. + * + * NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. + */ +#define BPF_CORE_READ_USER_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read_user_str, bpf_core_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ_STR_INTO() */ +#define BPF_PROBE_READ_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_kernel_str, bpf_probe_read_kernel, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * Non-CO-RE variant of BPF_CORE_READ_USER_STR_INTO(). + * + * As no CO-RE relocations are emitted, source types can be arbitrary and are + * not restricted to kernel types only. + */ +#define BPF_PROBE_READ_USER_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_user_str, bpf_probe_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * BPF_CORE_READ() is used to simplify BPF CO-RE relocatable read, especially + * when there are few pointer chasing steps. + * E.g., what in non-BPF world (or in BPF w/ BCC) would be something like: + * int x = s->a.b.c->d.e->f->g; + * can be succinctly achieved using BPF_CORE_READ as: + * int x = BPF_CORE_READ(s, a.b.c, d.e, f, g); + * + * BPF_CORE_READ will decompose above statement into 4 bpf_core_read (BPF + * CO-RE relocatable bpf_probe_read_kernel() wrapper) calls, logically + * equivalent to: + * 1. const void *__t = s->a.b.c; + * 2. __t = __t->d.e; + * 3. __t = __t->f; + * 4. return __t->g; + * + * Equivalence is logical, because there is a heavy type casting/preservation + * involved, as well as all the reads are happening through + * bpf_probe_read_kernel() calls using __builtin_preserve_access_index() to + * emit CO-RE relocations. + * + * N.B. Only up to 9 "field accessors" are supported, which should be more + * than enough for any practical purpose. + */ +#define BPF_CORE_READ(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_CORE_READ_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +/* + * Variant of BPF_CORE_READ() for reading from user-space memory. + * + * NOTE: all the source types involved are still *kernel types* and need to + * exist in kernel (or kernel module) BTF, otherwise CO-RE relocation will + * fail. Custom user types are not relocatable with CO-RE. + * The typical situation in which BPF_CORE_READ_USER() might be used is to + * read kernel UAPI types from the user-space memory passed in as a syscall + * input argument. + */ +#define BPF_CORE_READ_USER(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_CORE_READ_USER_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ() */ +#define BPF_PROBE_READ(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_PROBE_READ_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +/* + * Non-CO-RE variant of BPF_CORE_READ_USER(). + * + * As no CO-RE relocations are emitted, source types can be arbitrary and are + * not restricted to kernel types only. + */ +#define BPF_PROBE_READ_USER(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_PROBE_READ_USER_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +#endif + diff --git a/bpftool/libbpf/src/bpf_endian.h b/bpftool/libbpf/src/bpf_endian.h new file mode 100644 index 0000000..ec9db4f --- /dev/null +++ b/bpftool/libbpf/src/bpf_endian.h @@ -0,0 +1,99 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_ENDIAN__ +#define __BPF_ENDIAN__ + +/* + * Isolate byte #n and put it into byte #m, for __u##b type. + * E.g., moving byte #6 (nnnnnnnn) into byte #1 (mmmmmmmm) for __u64: + * 1) xxxxxxxx nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx + * 2) nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx 00000000 + * 3) 00000000 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn + * 4) 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn 00000000 + */ +#define ___bpf_mvb(x, b, n, m) ((__u##b)(x) << (b-(n+1)*8) >> (b-8) << (m*8)) + +#define ___bpf_swab16(x) ((__u16)( \ + ___bpf_mvb(x, 16, 0, 1) | \ + ___bpf_mvb(x, 16, 1, 0))) + +#define ___bpf_swab32(x) ((__u32)( \ + ___bpf_mvb(x, 32, 0, 3) | \ + ___bpf_mvb(x, 32, 1, 2) | \ + ___bpf_mvb(x, 32, 2, 1) | \ + ___bpf_mvb(x, 32, 3, 0))) + +#define ___bpf_swab64(x) ((__u64)( \ + ___bpf_mvb(x, 64, 0, 7) | \ + ___bpf_mvb(x, 64, 1, 6) | \ + ___bpf_mvb(x, 64, 2, 5) | \ + ___bpf_mvb(x, 64, 3, 4) | \ + ___bpf_mvb(x, 64, 4, 3) | \ + ___bpf_mvb(x, 64, 5, 2) | \ + ___bpf_mvb(x, 64, 6, 1) | \ + ___bpf_mvb(x, 64, 7, 0))) + +/* LLVM's BPF target selects the endianness of the CPU + * it compiles on, or the user specifies (bpfel/bpfeb), + * respectively. The used __BYTE_ORDER__ is defined by + * the compiler, we cannot rely on __BYTE_ORDER from + * libc headers, since it doesn't reflect the actual + * requested byte order. + * + * Note, LLVM's BPF target has different __builtin_bswapX() + * semantics. It does map to BPF_ALU | BPF_END | BPF_TO_BE + * in bpfel and bpfeb case, which means below, that we map + * to cpu_to_be16(). We could use it unconditionally in BPF + * case, but better not rely on it, so that this header here + * can be used from application and BPF program side, which + * use different targets. + */ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define __bpf_ntohs(x) __builtin_bswap16(x) +# define __bpf_htons(x) __builtin_bswap16(x) +# define __bpf_constant_ntohs(x) ___bpf_swab16(x) +# define __bpf_constant_htons(x) ___bpf_swab16(x) +# define __bpf_ntohl(x) __builtin_bswap32(x) +# define __bpf_htonl(x) __builtin_bswap32(x) +# define __bpf_constant_ntohl(x) ___bpf_swab32(x) +# define __bpf_constant_htonl(x) ___bpf_swab32(x) +# define __bpf_be64_to_cpu(x) __builtin_bswap64(x) +# define __bpf_cpu_to_be64(x) __builtin_bswap64(x) +# define __bpf_constant_be64_to_cpu(x) ___bpf_swab64(x) +# define __bpf_constant_cpu_to_be64(x) ___bpf_swab64(x) +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define __bpf_ntohs(x) (x) +# define __bpf_htons(x) (x) +# define __bpf_constant_ntohs(x) (x) +# define __bpf_constant_htons(x) (x) +# define __bpf_ntohl(x) (x) +# define __bpf_htonl(x) (x) +# define __bpf_constant_ntohl(x) (x) +# define __bpf_constant_htonl(x) (x) +# define __bpf_be64_to_cpu(x) (x) +# define __bpf_cpu_to_be64(x) (x) +# define __bpf_constant_be64_to_cpu(x) (x) +# define __bpf_constant_cpu_to_be64(x) (x) +#else +# error "Fix your compiler's __BYTE_ORDER__?!" +#endif + +#define bpf_htons(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_htons(x) : __bpf_htons(x)) +#define bpf_ntohs(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_ntohs(x) : __bpf_ntohs(x)) +#define bpf_htonl(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_htonl(x) : __bpf_htonl(x)) +#define bpf_ntohl(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_ntohl(x) : __bpf_ntohl(x)) +#define bpf_cpu_to_be64(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_cpu_to_be64(x) : __bpf_cpu_to_be64(x)) +#define bpf_be64_to_cpu(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_be64_to_cpu(x) : __bpf_be64_to_cpu(x)) + +#endif /* __BPF_ENDIAN__ */ diff --git a/bpftool/libbpf/src/bpf_gen_internal.h b/bpftool/libbpf/src/bpf_gen_internal.h new file mode 100644 index 0000000..2233089 --- /dev/null +++ b/bpftool/libbpf/src/bpf_gen_internal.h @@ -0,0 +1,72 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2021 Facebook */ +#ifndef __BPF_GEN_INTERNAL_H +#define __BPF_GEN_INTERNAL_H + +#include "bpf.h" + +struct ksym_relo_desc { + const char *name; + int kind; + int insn_idx; + bool is_weak; + bool is_typeless; +}; + +struct ksym_desc { + const char *name; + int ref; + int kind; + union { + /* used for kfunc */ + int off; + /* used for typeless ksym */ + bool typeless; + }; + int insn; +}; + +struct bpf_gen { + struct gen_loader_opts *opts; + void *data_start; + void *data_cur; + void *insn_start; + void *insn_cur; + ssize_t cleanup_label; + __u32 nr_progs; + __u32 nr_maps; + int log_level; + int error; + struct ksym_relo_desc *relos; + int relo_cnt; + struct bpf_core_relo *core_relos; + int core_relo_cnt; + char attach_target[128]; + int attach_kind; + struct ksym_desc *ksyms; + __u32 nr_ksyms; + int fd_array; + int nr_fd_array; +}; + +void bpf_gen__init(struct bpf_gen *gen, int log_level, int nr_progs, int nr_maps); +int bpf_gen__finish(struct bpf_gen *gen, int nr_progs, int nr_maps); +void bpf_gen__free(struct bpf_gen *gen); +void bpf_gen__load_btf(struct bpf_gen *gen, const void *raw_data, __u32 raw_size); +void bpf_gen__map_create(struct bpf_gen *gen, + enum bpf_map_type map_type, const char *map_name, + __u32 key_size, __u32 value_size, __u32 max_entries, + struct bpf_map_create_opts *map_attr, int map_idx); +void bpf_gen__prog_load(struct bpf_gen *gen, + enum bpf_prog_type prog_type, const char *prog_name, + const char *license, struct bpf_insn *insns, size_t insn_cnt, + struct bpf_prog_load_opts *load_attr, int prog_idx); +void bpf_gen__map_update_elem(struct bpf_gen *gen, int map_idx, void *value, __u32 value_size); +void bpf_gen__map_freeze(struct bpf_gen *gen, int map_idx); +void bpf_gen__record_attach_target(struct bpf_gen *gen, const char *name, enum bpf_attach_type type); +void bpf_gen__record_extern(struct bpf_gen *gen, const char *name, bool is_weak, + bool is_typeless, int kind, int insn_idx); +void bpf_gen__record_relo_core(struct bpf_gen *gen, const struct bpf_core_relo *core_relo); +void bpf_gen__populate_outer_map(struct bpf_gen *gen, int outer_map_idx, int key, int inner_map_idx); + +#endif diff --git a/bpftool/libbpf/src/bpf_helper_defs.h b/bpftool/libbpf/src/bpf_helper_defs.h new file mode 100644 index 0000000..54ab197 --- /dev/null +++ b/bpftool/libbpf/src/bpf_helper_defs.h @@ -0,0 +1,4728 @@ +/* This is auto-generated file. See bpf_doc.py for details. */ + +/* Forward declarations of BPF structs */ +struct bpf_fib_lookup; +struct bpf_sk_lookup; +struct bpf_perf_event_data; +struct bpf_perf_event_value; +struct bpf_pidns_info; +struct bpf_redir_neigh; +struct bpf_sock; +struct bpf_sock_addr; +struct bpf_sock_ops; +struct bpf_sock_tuple; +struct bpf_spin_lock; +struct bpf_sysctl; +struct bpf_tcp_sock; +struct bpf_tunnel_key; +struct bpf_xfrm_state; +struct linux_binprm; +struct pt_regs; +struct sk_reuseport_md; +struct sockaddr; +struct tcphdr; +struct seq_file; +struct tcp6_sock; +struct tcp_sock; +struct tcp_timewait_sock; +struct tcp_request_sock; +struct udp6_sock; +struct unix_sock; +struct task_struct; +struct cgroup; +struct __sk_buff; +struct sk_msg_md; +struct xdp_md; +struct path; +struct btf_ptr; +struct inode; +struct socket; +struct file; +struct bpf_timer; +struct mptcp_sock; +struct bpf_dynptr; +struct iphdr; +struct ipv6hdr; + +/* + * bpf_map_lookup_elem + * + * Perform a lookup in *map* for an entry associated to *key*. + * + * Returns + * Map value associated to *key*, or **NULL** if no entry was + * found. + */ +static void *(*bpf_map_lookup_elem)(void *map, const void *key) = (void *) 1; + +/* + * bpf_map_update_elem + * + * Add or update the value of the entry associated to *key* in + * *map* with *value*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * Flag value **BPF_NOEXIST** cannot be used for maps of types + * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all + * elements always exist), the helper would return an error. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_update_elem)(void *map, const void *key, const void *value, __u64 flags) = (void *) 2; + +/* + * bpf_map_delete_elem + * + * Delete entry with *key* from *map*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_delete_elem)(void *map, const void *key) = (void *) 3; + +/* + * bpf_probe_read + * + * For tracing programs, safely attempt to read *size* bytes from + * kernel space address *unsafe_ptr* and store the data in *dst*. + * + * Generally, use **bpf_probe_read_user**\ () or + * **bpf_probe_read_kernel**\ () instead. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_read)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 4; + +/* + * bpf_ktime_get_ns + * + * Return the time elapsed since system boot, in nanoseconds. + * Does not include time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_MONOTONIC**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_ns)(void) = (void *) 5; + +/* + * bpf_trace_printk + * + * This helper is a "printk()-like" facility for debugging. It + * prints a message defined by format *fmt* (of size *fmt_size*) + * to file *\/sys/kernel/debug/tracing/trace* from DebugFS, if + * available. It can take up to three additional **u64** + * arguments (as an eBPF helpers, the total number of arguments is + * limited to five). + * + * Each time the helper is called, it appends a line to the trace. + * Lines are discarded while *\/sys/kernel/debug/tracing/trace* is + * open, use *\/sys/kernel/debug/tracing/trace_pipe* to avoid this. + * The format of the trace is customizable, and the exact output + * one will get depends on the options set in + * *\/sys/kernel/debug/tracing/trace_options* (see also the + * *README* file under the same directory). However, it usually + * defaults to something like: + * + * :: + * + * telnet-470 [001] .N.. 419421.045894: 0x00000001: + * + * In the above: + * + * * ``telnet`` is the name of the current task. + * * ``470`` is the PID of the current task. + * * ``001`` is the CPU number on which the task is + * running. + * * In ``.N..``, each character refers to a set of + * options (whether irqs are enabled, scheduling + * options, whether hard/softirqs are running, level of + * preempt_disabled respectively). **N** means that + * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** + * are set. + * * ``419421.045894`` is a timestamp. + * * ``0x00000001`` is a fake value used by BPF for the + * instruction pointer register. + * * ```` is the message formatted with + * *fmt*. + * + * The conversion specifiers supported by *fmt* are similar, but + * more limited than for printk(). They are **%d**, **%i**, + * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, + * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size + * of field, padding with zeroes, etc.) is available, and the + * helper will return **-EINVAL** (but print nothing) if it + * encounters an unknown specifier. + * + * Also, note that **bpf_trace_printk**\ () is slow, and should + * only be used for debugging purposes. For this reason, a notice + * block (spanning several lines) is printed to kernel logs and + * states that the helper should not be used "for production use" + * the first time this helper is used (or more precisely, when + * **trace_printk**\ () buffers are allocated). For passing values + * to user space, perf events should be preferred. + * + * Returns + * The number of bytes written to the buffer, or a negative error + * in case of failure. + */ +static long (*bpf_trace_printk)(const char *fmt, __u32 fmt_size, ...) = (void *) 6; + +/* + * bpf_get_prandom_u32 + * + * Get a pseudo-random number. + * + * From a security point of view, this helper uses its own + * pseudo-random internal state, and cannot be used to infer the + * seed of other random functions in the kernel. However, it is + * essential to note that the generator used by the helper is not + * cryptographically secure. + * + * Returns + * A random 32-bit unsigned value. + */ +static __u32 (*bpf_get_prandom_u32)(void) = (void *) 7; + +/* + * bpf_get_smp_processor_id + * + * Get the SMP (symmetric multiprocessing) processor id. Note that + * all programs run with migration disabled, which means that the + * SMP processor id is stable during all the execution of the + * program. + * + * Returns + * The SMP id of the processor running the program. + */ +static __u32 (*bpf_get_smp_processor_id)(void) = (void *) 8; + +/* + * bpf_skb_store_bytes + * + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. *flags* are a combination of + * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the + * checksum for the packet after storing the bytes) and + * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ + * **->swhash** and *skb*\ **->l4hash** to 0). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_store_bytes)(struct __sk_buff *skb, __u32 offset, const void *from, __u32 len, __u64 flags) = (void *) 9; + +/* + * bpf_l3_csum_replace + * + * Recompute the layer 3 (e.g. IP) checksum for the packet + * associated to *skb*. Computation is incremental, so the helper + * must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored in *size*. + * Alternatively, it is possible to store the difference between + * the previous and the new values of the header field in *to*, by + * setting *from* and *size* to 0. For both methods, *offset* + * indicates the location of the IP checksum within the packet. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_l3_csum_replace)(struct __sk_buff *skb, __u32 offset, __u64 from, __u64 to, __u64 size) = (void *) 10; + +/* + * bpf_l4_csum_replace + * + * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the + * packet associated to *skb*. Computation is incremental, so the + * helper must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored on the lowest + * four bits of *flags*. Alternatively, it is possible to store + * the difference between the previous and the new values of the + * header field in *to*, by setting *from* and the four lowest + * bits of *flags* to 0. For both methods, *offset* indicates the + * location of the IP checksum within the packet. In addition to + * the size of the field, *flags* can be added (bitwise OR) actual + * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left + * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and + * for updates resulting in a null checksum the value is set to + * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates + * the checksum is to be computed against a pseudo-header. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_l4_csum_replace)(struct __sk_buff *skb, __u32 offset, __u64 from, __u64 to, __u64 flags) = (void *) 11; + +/* + * bpf_tail_call + * + * This special helper is used to trigger a "tail call", or in + * other words, to jump into another eBPF program. The same stack + * frame is used (but values on stack and in registers for the + * caller are not accessible to the callee). This mechanism allows + * for program chaining, either for raising the maximum number of + * available eBPF instructions, or to execute given programs in + * conditional blocks. For security reasons, there is an upper + * limit to the number of successive tail calls that can be + * performed. + * + * Upon call of this helper, the program attempts to jump into a + * program referenced at index *index* in *prog_array_map*, a + * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes + * *ctx*, a pointer to the context. + * + * If the call succeeds, the kernel immediately runs the first + * instruction of the new program. This is not a function call, + * and it never returns to the previous program. If the call + * fails, then the helper has no effect, and the caller continues + * to run its subsequent instructions. A call can fail if the + * destination program for the jump does not exist (i.e. *index* + * is superior to the number of entries in *prog_array_map*), or + * if the maximum number of tail calls has been reached for this + * chain of programs. This limit is defined in the kernel by the + * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), + * which is currently set to 33. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_tail_call)(void *ctx, void *prog_array_map, __u32 index) = (void *) 12; + +/* + * bpf_clone_redirect + * + * Clone and redirect the packet associated to *skb* to another + * net device of index *ifindex*. Both ingress and egress + * interfaces can be used for redirection. The **BPF_F_INGRESS** + * value in *flags* is used to make the distinction (ingress path + * is selected if the flag is present, egress path otherwise). + * This is the only flag supported for now. + * + * In comparison with **bpf_redirect**\ () helper, + * **bpf_clone_redirect**\ () has the associated cost of + * duplicating the packet buffer, but this can be executed out of + * the eBPF program. Conversely, **bpf_redirect**\ () is more + * efficient, but it is handled through an action code where the + * redirection happens only after the eBPF program has returned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_clone_redirect)(struct __sk_buff *skb, __u32 ifindex, __u64 flags) = (void *) 13; + +/* + * bpf_get_current_pid_tgid + * + * Get the current pid and tgid. + * + * Returns + * A 64-bit integer containing the current tgid and pid, and + * created as such: + * *current_task*\ **->tgid << 32 \|** + * *current_task*\ **->pid**. + */ +static __u64 (*bpf_get_current_pid_tgid)(void) = (void *) 14; + +/* + * bpf_get_current_uid_gid + * + * Get the current uid and gid. + * + * Returns + * A 64-bit integer containing the current GID and UID, and + * created as such: *current_gid* **<< 32 \|** *current_uid*. + */ +static __u64 (*bpf_get_current_uid_gid)(void) = (void *) 15; + +/* + * bpf_get_current_comm + * + * Copy the **comm** attribute of the current task into *buf* of + * *size_of_buf*. The **comm** attribute contains the name of + * the executable (excluding the path) for the current task. The + * *size_of_buf* must be strictly positive. On success, the + * helper makes sure that the *buf* is NUL-terminated. On failure, + * it is filled with zeroes. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_get_current_comm)(void *buf, __u32 size_of_buf) = (void *) 16; + +/* + * bpf_get_cgroup_classid + * + * Retrieve the classid for the current task, i.e. for the net_cls + * cgroup to which *skb* belongs. + * + * This helper can be used on TC egress path, but not on ingress. + * + * The net_cls cgroup provides an interface to tag network packets + * based on a user-provided identifier for all traffic coming from + * the tasks belonging to the related cgroup. See also the related + * kernel documentation, available from the Linux sources in file + * *Documentation/admin-guide/cgroup-v1/net_cls.rst*. + * + * The Linux kernel has two versions for cgroups: there are + * cgroups v1 and cgroups v2. Both are available to users, who can + * use a mixture of them, but note that the net_cls cgroup is for + * cgroup v1 only. This makes it incompatible with BPF programs + * run on cgroups, which is a cgroup-v2-only feature (a socket can + * only hold data for one version of cgroups at a time). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to + * "**y**" or to "**m**". + * + * Returns + * The classid, or 0 for the default unconfigured classid. + */ +static __u32 (*bpf_get_cgroup_classid)(struct __sk_buff *skb) = (void *) 17; + +/* + * bpf_skb_vlan_push + * + * Push a *vlan_tci* (VLAN tag control information) of protocol + * *vlan_proto* to the packet associated to *skb*, then update + * the checksum. Note that if *vlan_proto* is different from + * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to + * be **ETH_P_8021Q**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_vlan_push)(struct __sk_buff *skb, __be16 vlan_proto, __u16 vlan_tci) = (void *) 18; + +/* + * bpf_skb_vlan_pop + * + * Pop a VLAN header from the packet associated to *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_vlan_pop)(struct __sk_buff *skb) = (void *) 19; + +/* + * bpf_skb_get_tunnel_key + * + * Get tunnel metadata. This helper takes a pointer *key* to an + * empty **struct bpf_tunnel_key** of **size**, that will be + * filled with tunnel metadata for the packet associated to *skb*. + * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which + * indicates that the tunnel is based on IPv6 protocol instead of + * IPv4. + * + * The **struct bpf_tunnel_key** is an object that generalizes the + * principal parameters used by various tunneling protocols into a + * single struct. This way, it can be used to easily make a + * decision based on the contents of the encapsulation header, + * "summarized" in this struct. In particular, it holds the IP + * address of the remote end (IPv4 or IPv6, depending on the case) + * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, + * this struct exposes the *key*\ **->tunnel_id**, which is + * generally mapped to a VNI (Virtual Network Identifier), making + * it programmable together with the **bpf_skb_set_tunnel_key**\ + * () helper. + * + * Let's imagine that the following code is part of a program + * attached to the TC ingress interface, on one end of a GRE + * tunnel, and is supposed to filter out all messages coming from + * remote ends with IPv4 address other than 10.0.0.1: + * + * :: + * + * int ret; + * struct bpf_tunnel_key key = {}; + * + * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); + * if (ret < 0) + * return TC_ACT_SHOT; // drop packet + * + * if (key.remote_ipv4 != 0x0a000001) + * return TC_ACT_SHOT; // drop packet + * + * return TC_ACT_OK; // accept packet + * + * This interface can also be used with all encapsulation devices + * that can operate in "collect metadata" mode: instead of having + * one network device per specific configuration, the "collect + * metadata" mode only requires a single device where the + * configuration can be extracted from this helper. + * + * This can be used together with various tunnels such as VXLan, + * Geneve, GRE or IP in IP (IPIP). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_get_tunnel_key)(struct __sk_buff *skb, struct bpf_tunnel_key *key, __u32 size, __u64 flags) = (void *) 20; + +/* + * bpf_skb_set_tunnel_key + * + * Populate tunnel metadata for packet associated to *skb.* The + * tunnel metadata is set to the contents of *key*, of *size*. The + * *flags* can be set to a combination of the following values: + * + * **BPF_F_TUNINFO_IPV6** + * Indicate that the tunnel is based on IPv6 protocol + * instead of IPv4. + * **BPF_F_ZERO_CSUM_TX** + * For IPv4 packets, add a flag to tunnel metadata + * indicating that checksum computation should be skipped + * and checksum set to zeroes. + * **BPF_F_DONT_FRAGMENT** + * Add a flag to tunnel metadata indicating that the + * packet should not be fragmented. + * **BPF_F_SEQ_NUMBER** + * Add a flag to tunnel metadata indicating that a + * sequence number should be added to tunnel header before + * sending the packet. This flag was added for GRE + * encapsulation, but might be used with other protocols + * as well in the future. + * **BPF_F_NO_TUNNEL_KEY** + * Add a flag to tunnel metadata indicating that no tunnel + * key should be set in the resulting tunnel header. + * + * Here is a typical usage on the transmit path: + * + * :: + * + * struct bpf_tunnel_key key; + * populate key ... + * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); + * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); + * + * See also the description of the **bpf_skb_get_tunnel_key**\ () + * helper for additional information. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_set_tunnel_key)(struct __sk_buff *skb, struct bpf_tunnel_key *key, __u32 size, __u64 flags) = (void *) 21; + +/* + * bpf_perf_event_read + * + * Read the value of a perf event counter. This helper relies on a + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of + * the perf event counter is selected when *map* is updated with + * perf event file descriptors. The *map* is an array whose size + * is the number of available CPUs, and each cell contains a value + * relative to one CPU. The value to retrieve is indicated by + * *flags*, that contains the index of the CPU to look up, masked + * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * Note that before Linux 4.13, only hardware perf event can be + * retrieved. + * + * Also, be aware that the newer helper + * **bpf_perf_event_read_value**\ () is recommended over + * **bpf_perf_event_read**\ () in general. The latter has some ABI + * quirks where error and counter value are used as a return code + * (which is wrong to do since ranges may overlap). This issue is + * fixed with **bpf_perf_event_read_value**\ (), which at the same + * time provides more features over the **bpf_perf_event_read**\ + * () interface. Please refer to the description of + * **bpf_perf_event_read_value**\ () for details. + * + * Returns + * The value of the perf event counter read from the map, or a + * negative error code in case of failure. + */ +static __u64 (*bpf_perf_event_read)(void *map, __u64 flags) = (void *) 22; + +/* + * bpf_redirect + * + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_clone_redirect**\ + * (), except that the packet is not cloned, which provides + * increased performance. + * + * Except for XDP, both ingress and egress interfaces can be used + * for redirection. The **BPF_F_INGRESS** value in *flags* is used + * to make the distinction (ingress path is selected if the flag + * is present, egress path otherwise). Currently, XDP only + * supports redirection to the egress interface, and accepts no + * flag at all. + * + * The same effect can also be attained with the more generic + * **bpf_redirect_map**\ (), which uses a BPF map to store the + * redirect target instead of providing it directly to the helper. + * + * Returns + * For XDP, the helper returns **XDP_REDIRECT** on success or + * **XDP_ABORTED** on error. For other program types, the values + * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on + * error. + */ +static long (*bpf_redirect)(__u32 ifindex, __u64 flags) = (void *) 23; + +/* + * bpf_get_route_realm + * + * Retrieve the realm or the route, that is to say the + * **tclassid** field of the destination for the *skb*. The + * identifier retrieved is a user-provided tag, similar to the + * one used with the net_cls cgroup (see description for + * **bpf_get_cgroup_classid**\ () helper), but here this tag is + * held by a route (a destination entry), not by a task. + * + * Retrieving this identifier works with the clsact TC egress hook + * (see also **tc-bpf(8)**), or alternatively on conventional + * classful egress qdiscs, but not on TC ingress path. In case of + * clsact TC egress hook, this has the advantage that, internally, + * the destination entry has not been dropped yet in the transmit + * path. Therefore, the destination entry does not need to be + * artificially held via **netif_keep_dst**\ () for a classful + * qdisc until the *skb* is freed. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_IP_ROUTE_CLASSID** configuration option. + * + * Returns + * The realm of the route for the packet associated to *skb*, or 0 + * if none was found. + */ +static __u32 (*bpf_get_route_realm)(struct __sk_buff *skb) = (void *) 24; + +/* + * bpf_perf_event_output + * + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * The context of the program *ctx* needs also be passed to the + * helper. + * + * On user space, a program willing to read the values needs to + * call **perf_event_open**\ () on the perf event (either for + * one or for all CPUs) and to store the file descriptor into the + * *map*. This must be done before the eBPF program can send data + * into it. An example is available in file + * *samples/bpf/trace_output_user.c* in the Linux kernel source + * tree (the eBPF program counterpart is in + * *samples/bpf/trace_output_kern.c*). + * + * **bpf_perf_event_output**\ () achieves better performance + * than **bpf_trace_printk**\ () for sharing data with user + * space, and is much better suitable for streaming data from eBPF + * programs. + * + * Note that this helper is not restricted to tracing use cases + * and can be used with programs attached to TC or XDP as well, + * where it allows for passing data to user space listeners. Data + * can be: + * + * * Only custom structs, + * * Only the packet payload, or + * * A combination of both. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_perf_event_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 25; + +/* + * bpf_skb_load_bytes + * + * This helper was provided as an easy way to load data from a + * packet. It can be used to load *len* bytes from *offset* from + * the packet associated to *skb*, into the buffer pointed by + * *to*. + * + * Since Linux 4.7, usage of this helper has mostly been replaced + * by "direct packet access", enabling packet data to be + * manipulated with *skb*\ **->data** and *skb*\ **->data_end** + * pointing respectively to the first byte of packet data and to + * the byte after the last byte of packet data. However, it + * remains useful if one wishes to read large quantities of data + * at once from a packet into the eBPF stack. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_load_bytes)(const void *skb, __u32 offset, void *to, __u32 len) = (void *) 26; + +/* + * bpf_get_stackid + * + * Walk a user or a kernel stack and return its id. To achieve + * this, the helper needs *ctx*, which is a pointer to the context + * on which the tracing program is executed, and a pointer to a + * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * a combination of the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_FAST_STACK_CMP** + * Compare stacks by hash only. + * **BPF_F_REUSE_STACKID** + * If two different stacks hash into the same *stackid*, + * discard the old one. + * + * The stack id retrieved is a 32 bit long integer handle which + * can be further combined with other data (including other stack + * ids) and used as a key into maps. This can be useful for + * generating a variety of graphs (such as flame graphs or off-cpu + * graphs). + * + * For walking a stack, this helper is an improvement over + * **bpf_probe_read**\ (), which can be used with unrolled loops + * but is not efficient and consumes a lot of eBPF instructions. + * Instead, **bpf_get_stackid**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * + * Returns + * The positive or null stack id on success, or a negative error + * in case of failure. + */ +static long (*bpf_get_stackid)(void *ctx, void *map, __u64 flags) = (void *) 27; + +/* + * bpf_csum_diff + * + * Compute a checksum difference, from the raw buffer pointed by + * *from*, of length *from_size* (that must be a multiple of 4), + * towards the raw buffer pointed by *to*, of size *to_size* + * (same remark). An optional *seed* can be added to the value + * (this can be cascaded, the seed may come from a previous call + * to the helper). + * + * This is flexible enough to be used in several ways: + * + * * With *from_size* == 0, *to_size* > 0 and *seed* set to + * checksum, it can be used when pushing new data. + * * With *from_size* > 0, *to_size* == 0 and *seed* set to + * checksum, it can be used when removing data from a packet. + * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it + * can be used to compute a diff. Note that *from_size* and + * *to_size* do not need to be equal. + * + * This helper can be used in combination with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to + * which one can feed in the difference computed with + * **bpf_csum_diff**\ (). + * + * Returns + * The checksum result, or a negative error code in case of + * failure. + */ +static __s64 (*bpf_csum_diff)(__be32 *from, __u32 from_size, __be32 *to, __u32 to_size, __wsum seed) = (void *) 28; + +/* + * bpf_skb_get_tunnel_opt + * + * Retrieve tunnel options metadata for the packet associated to + * *skb*, and store the raw tunnel option data to the buffer *opt* + * of *size*. + * + * This helper can be used with encapsulation devices that can + * operate in "collect metadata" mode (please refer to the related + * note in the description of **bpf_skb_get_tunnel_key**\ () for + * more details). A particular example where this can be used is + * in combination with the Geneve encapsulation protocol, where it + * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) + * and retrieving arbitrary TLVs (Type-Length-Value headers) from + * the eBPF program. This allows for full customization of these + * headers. + * + * Returns + * The size of the option data retrieved. + */ +static long (*bpf_skb_get_tunnel_opt)(struct __sk_buff *skb, void *opt, __u32 size) = (void *) 29; + +/* + * bpf_skb_set_tunnel_opt + * + * Set tunnel options metadata for the packet associated to *skb* + * to the option data contained in the raw buffer *opt* of *size*. + * + * See also the description of the **bpf_skb_get_tunnel_opt**\ () + * helper for additional information. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_set_tunnel_opt)(struct __sk_buff *skb, void *opt, __u32 size) = (void *) 30; + +/* + * bpf_skb_change_proto + * + * Change the protocol of the *skb* to *proto*. Currently + * supported are transition from IPv4 to IPv6, and from IPv6 to + * IPv4. The helper takes care of the groundwork for the + * transition, including resizing the socket buffer. The eBPF + * program is expected to fill the new headers, if any, via + * **skb_store_bytes**\ () and to recompute the checksums with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ + * (). The main case for this helper is to perform NAT64 + * operations out of an eBPF program. + * + * Internally, the GSO type is marked as dodgy so that headers are + * checked and segments are recalculated by the GSO/GRO engine. + * The size for GSO target is adapted as well. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_proto)(struct __sk_buff *skb, __be16 proto, __u64 flags) = (void *) 31; + +/* + * bpf_skb_change_type + * + * Change the packet type for the packet associated to *skb*. This + * comes down to setting *skb*\ **->pkt_type** to *type*, except + * the eBPF program does not have a write access to *skb*\ + * **->pkt_type** beside this helper. Using a helper here allows + * for graceful handling of errors. + * + * The major use case is to change incoming *skb*s to + * **PACKET_HOST** in a programmatic way instead of having to + * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for + * example. + * + * Note that *type* only allows certain values. At this time, they + * are: + * + * **PACKET_HOST** + * Packet is for us. + * **PACKET_BROADCAST** + * Send packet to all. + * **PACKET_MULTICAST** + * Send packet to group. + * **PACKET_OTHERHOST** + * Send packet to someone else. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_type)(struct __sk_buff *skb, __u32 type) = (void *) 32; + +/* + * bpf_skb_under_cgroup + * + * Check whether *skb* is a descendant of the cgroup2 held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * + * Returns + * The return value depends on the result of the test, and can be: + * + * * 0, if the *skb* failed the cgroup2 descendant test. + * * 1, if the *skb* succeeded the cgroup2 descendant test. + * * A negative error code, if an error occurred. + */ +static long (*bpf_skb_under_cgroup)(struct __sk_buff *skb, void *map, __u32 index) = (void *) 33; + +/* + * bpf_get_hash_recalc + * + * Retrieve the hash of the packet, *skb*\ **->hash**. If it is + * not set, in particular if the hash was cleared due to mangling, + * recompute this hash. Later accesses to the hash can be done + * directly with *skb*\ **->hash**. + * + * Calling **bpf_set_hash_invalid**\ (), changing a packet + * prototype with **bpf_skb_change_proto**\ (), or calling + * **bpf_skb_store_bytes**\ () with the + * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear + * the hash and to trigger a new computation for the next call to + * **bpf_get_hash_recalc**\ (). + * + * Returns + * The 32-bit hash. + */ +static __u32 (*bpf_get_hash_recalc)(struct __sk_buff *skb) = (void *) 34; + +/* + * bpf_get_current_task + * + * Get the current task. + * + * Returns + * A pointer to the current task struct. + */ +static __u64 (*bpf_get_current_task)(void) = (void *) 35; + +/* + * bpf_probe_write_user + * + * Attempt in a safe way to write *len* bytes from the buffer + * *src* to *dst* in memory. It only works for threads that are in + * user context, and *dst* must be a valid user space address. + * + * This helper should not be used to implement any kind of + * security mechanism because of TOC-TOU attacks, but rather to + * debug, divert, and manipulate execution of semi-cooperative + * processes. + * + * Keep in mind that this feature is meant for experiments, and it + * has a risk of crashing the system and running programs. + * Therefore, when an eBPF program using this helper is attached, + * a warning including PID and process name is printed to kernel + * logs. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_write_user)(void *dst, const void *src, __u32 len) = (void *) 36; + +/* + * bpf_current_task_under_cgroup + * + * Check whether the probe is being run is the context of a given + * subset of the cgroup2 hierarchy. The cgroup2 to test is held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * + * Returns + * The return value depends on the result of the test, and can be: + * + * * 1, if current task belongs to the cgroup2. + * * 0, if current task does not belong to the cgroup2. + * * A negative error code, if an error occurred. + */ +static long (*bpf_current_task_under_cgroup)(void *map, __u32 index) = (void *) 37; + +/* + * bpf_skb_change_tail + * + * Resize (trim or grow) the packet associated to *skb* to the + * new *len*. The *flags* are reserved for future usage, and must + * be left at zero. + * + * The basic idea is that the helper performs the needed work to + * change the size of the packet, then the eBPF program rewrites + * the rest via helpers like **bpf_skb_store_bytes**\ (), + * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () + * and others. This helper is a slow path utility intended for + * replies with control messages. And because it is targeted for + * slow path, the helper itself can afford to be slow: it + * implicitly linearizes, unclones and drops offloads from the + * *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_tail)(struct __sk_buff *skb, __u32 len, __u64 flags) = (void *) 38; + +/* + * bpf_skb_pull_data + * + * Pull in non-linear data in case the *skb* is non-linear and not + * all of *len* are part of the linear section. Make *len* bytes + * from *skb* readable and writable. If a zero value is passed for + * *len*, then all bytes in the linear part of *skb* will be made + * readable and writable. + * + * This helper is only needed for reading and writing with direct + * packet access. + * + * For direct packet access, testing that offsets to access + * are within packet boundaries (test on *skb*\ **->data_end**) is + * susceptible to fail if offsets are invalid, or if the requested + * data is in non-linear parts of the *skb*. On failure the + * program can just bail out, or in the case of a non-linear + * buffer, use a helper to make the data available. The + * **bpf_skb_load_bytes**\ () helper is a first solution to access + * the data. Another one consists in using **bpf_skb_pull_data** + * to pull in once the non-linear parts, then retesting and + * eventually access the data. + * + * At the same time, this also makes sure the *skb* is uncloned, + * which is a necessary condition for direct write. As this needs + * to be an invariant for the write part only, the verifier + * detects writes and adds a prologue that is calling + * **bpf_skb_pull_data()** to effectively unclone the *skb* from + * the very beginning in case it is indeed cloned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_pull_data)(struct __sk_buff *skb, __u32 len) = (void *) 39; + +/* + * bpf_csum_update + * + * Add the checksum *csum* into *skb*\ **->csum** in case the + * driver has supplied a checksum for the entire packet into that + * field. Return an error otherwise. This helper is intended to be + * used in combination with **bpf_csum_diff**\ (), in particular + * when the checksum needs to be updated after data has been + * written into the packet through direct packet access. + * + * Returns + * The checksum on success, or a negative error code in case of + * failure. + */ +static __s64 (*bpf_csum_update)(struct __sk_buff *skb, __wsum csum) = (void *) 40; + +/* + * bpf_set_hash_invalid + * + * Invalidate the current *skb*\ **->hash**. It can be used after + * mangling on headers through direct packet access, in order to + * indicate that the hash is outdated and to trigger a + * recalculation the next time the kernel tries to access this + * hash or when the **bpf_get_hash_recalc**\ () helper is called. + * + * Returns + * void. + */ +static void (*bpf_set_hash_invalid)(struct __sk_buff *skb) = (void *) 41; + +/* + * bpf_get_numa_node_id + * + * Return the id of the current NUMA node. The primary use case + * for this helper is the selection of sockets for the local NUMA + * node, when the program is attached to sockets using the + * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), + * but the helper is also available to other eBPF program types, + * similarly to **bpf_get_smp_processor_id**\ (). + * + * Returns + * The id of current NUMA node. + */ +static long (*bpf_get_numa_node_id)(void) = (void *) 42; + +/* + * bpf_skb_change_head + * + * Grows headroom of packet associated to *skb* and adjusts the + * offset of the MAC header accordingly, adding *len* bytes of + * space. It automatically extends and reallocates memory as + * required. + * + * This helper can be used on a layer 3 *skb* to push a MAC header + * for redirection into a layer 2 device. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_head)(struct __sk_buff *skb, __u32 len, __u64 flags) = (void *) 43; + +/* + * bpf_xdp_adjust_head + * + * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that + * it is possible to use a negative value for *delta*. This helper + * can be used to prepare the packet for pushing or popping + * headers. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_adjust_head)(struct xdp_md *xdp_md, int delta) = (void *) 44; + +/* + * bpf_probe_read_str + * + * Copy a NUL terminated string from an unsafe kernel address + * *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for + * more details. + * + * Generally, use **bpf_probe_read_user_str**\ () or + * **bpf_probe_read_kernel_str**\ () instead. + * + * Returns + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + */ +static long (*bpf_probe_read_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 45; + +/* + * bpf_get_socket_cookie + * + * If the **struct sk_buff** pointed by *skb* has a known socket, + * retrieve the cookie (generated by the kernel) of this socket. + * If no cookie has been set yet, generate a new cookie. Once + * generated, the socket cookie remains stable for the life of the + * socket. This helper can be useful for monitoring per socket + * networking traffic statistics as it provides a global socket + * identifier that can be assumed unique. + * + * Returns + * A 8-byte long unique number on success, or 0 if the socket + * field is missing inside *skb*. + */ +static __u64 (*bpf_get_socket_cookie)(void *ctx) = (void *) 46; + +/* + * bpf_get_socket_uid + * + * Get the owner UID of the socked associated to *skb*. + * + * Returns + * The owner UID of the socket associated to *skb*. If the socket + * is **NULL**, or if it is not a full socket (i.e. if it is a + * time-wait or a request socket instead), **overflowuid** value + * is returned (note that **overflowuid** might also be the actual + * UID value for the socket). + */ +static __u32 (*bpf_get_socket_uid)(struct __sk_buff *skb) = (void *) 47; + +/* + * bpf_set_hash + * + * Set the full hash for *skb* (set the field *skb*\ **->hash**) + * to value *hash*. + * + * Returns + * 0 + */ +static long (*bpf_set_hash)(struct __sk_buff *skb, __u32 hash) = (void *) 48; + +/* + * bpf_setsockopt + * + * Emulate a call to **setsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **setsockopt(2)** for more information. + * The option value of length *optlen* is pointed by *optval*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **setsockopt()**. + * It supports the following *level*\ s: + * + * * **SOL_SOCKET**, which supports the following *optname*\ s: + * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, + * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**, + * **SO_BINDTODEVICE**, **SO_KEEPALIVE**, **SO_REUSEADDR**, + * **SO_REUSEPORT**, **SO_BINDTOIFINDEX**, **SO_TXREHASH**. + * * **IPPROTO_TCP**, which supports the following *optname*\ s: + * **TCP_CONGESTION**, **TCP_BPF_IW**, + * **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, + * **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, + * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**, + * **TCP_NODELAY**, **TCP_MAXSEG**, **TCP_WINDOW_CLAMP**, + * **TCP_THIN_LINEAR_TIMEOUTS**, **TCP_BPF_DELACK_MAX**, + * **TCP_BPF_RTO_MIN**. + * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. + * * **IPPROTO_IPV6**, which supports the following *optname*\ s: + * **IPV6_TCLASS**, **IPV6_AUTOFLOWLABEL**. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_setsockopt)(void *bpf_socket, int level, int optname, void *optval, int optlen) = (void *) 49; + +/* + * bpf_skb_adjust_room + * + * Grow or shrink the room for data in the packet associated to + * *skb* by *len_diff*, and according to the selected *mode*. + * + * By default, the helper will reset any offloaded checksum + * indicator of the skb to CHECKSUM_NONE. This can be avoided + * by the following flag: + * + * * **BPF_F_ADJ_ROOM_NO_CSUM_RESET**: Do not reset offloaded + * checksum data of the skb to CHECKSUM_NONE. + * + * There are two supported modes at this time: + * + * * **BPF_ADJ_ROOM_MAC**: Adjust room at the mac layer + * (room space is added or removed between the layer 2 and + * layer 3 headers). + * + * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer + * (room space is added or removed between the layer 3 and + * layer 4 headers). + * + * The following flags are supported at this time: + * + * * **BPF_F_ADJ_ROOM_FIXED_GSO**: Do not adjust gso_size. + * Adjusting mss in this way is not allowed for datagrams. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV6**: + * Any new space is reserved to hold a tunnel header. + * Configure skb offsets and other fields accordingly. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L4_GRE**, + * **BPF_F_ADJ_ROOM_ENCAP_L4_UDP**: + * Use with ENCAP_L3 flags to further specify the tunnel type. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2**\ (*len*): + * Use with ENCAP_L3/L4 flags to further specify the tunnel + * type; *len* is the length of the inner MAC header. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2_ETH**: + * Use with BPF_F_ADJ_ROOM_ENCAP_L2 flag to further specify the + * L2 type as Ethernet. + * + * * **BPF_F_ADJ_ROOM_DECAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_DECAP_L3_IPV6**: + * Indicate the new IP header version after decapsulating the outer + * IP header. Used when the inner and outer IP versions are different. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_adjust_room)(struct __sk_buff *skb, __s32 len_diff, __u32 mode, __u64 flags) = (void *) 50; + +/* + * bpf_redirect_map + * + * Redirect the packet to the endpoint referenced by *map* at + * index *key*. Depending on its type, this *map* can contain + * references to net devices (for forwarding packets through other + * ports), or to CPUs (for redirecting XDP frames to another CPU; + * but this is only implemented for native XDP (with driver + * support) as of this writing). + * + * The lower two bits of *flags* are used as the return code if + * the map lookup fails. This is so that the return value can be + * one of the XDP program return codes up to **XDP_TX**, as chosen + * by the caller. The higher bits of *flags* can be set to + * BPF_F_BROADCAST or BPF_F_EXCLUDE_INGRESS as defined below. + * + * With BPF_F_BROADCAST the packet will be broadcasted to all the + * interfaces in the map, with BPF_F_EXCLUDE_INGRESS the ingress + * interface will be excluded when do broadcasting. + * + * See also **bpf_redirect**\ (), which only supports redirecting + * to an ifindex, but doesn't require a map to do so. + * + * Returns + * **XDP_REDIRECT** on success, or the value of the two lower bits + * of the *flags* argument on error. + */ +static long (*bpf_redirect_map)(void *map, __u64 key, __u64 flags) = (void *) 51; + +/* + * bpf_sk_redirect_map + * + * Redirect the packet to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_sk_redirect_map)(struct __sk_buff *skb, void *map, __u32 key, __u64 flags) = (void *) 52; + +/* + * bpf_sock_map_update + * + * Add an entry to, or update a *map* referencing sockets. The + * *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sock_map_update)(struct bpf_sock_ops *skops, void *map, void *key, __u64 flags) = (void *) 53; + +/* + * bpf_xdp_adjust_meta + * + * Adjust the address pointed by *xdp_md*\ **->data_meta** by + * *delta* (which can be positive or negative). Note that this + * operation modifies the address stored in *xdp_md*\ **->data**, + * so the latter must be loaded only after the helper has been + * called. + * + * The use of *xdp_md*\ **->data_meta** is optional and programs + * are not required to use it. The rationale is that when the + * packet is processed with XDP (e.g. as DoS filter), it is + * possible to push further meta data along with it before passing + * to the stack, and to give the guarantee that an ingress eBPF + * program attached as a TC classifier on the same device can pick + * this up for further post-processing. Since TC works with socket + * buffers, it remains possible to set from XDP the **mark** or + * **priority** pointers, or other pointers for the socket buffer. + * Having this scratch space generic and programmable allows for + * more flexibility as the user is free to store whatever meta + * data they need. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_adjust_meta)(struct xdp_md *xdp_md, int delta) = (void *) 54; + +/* + * bpf_perf_event_read_value + * + * Read the value of a perf event counter, and store it into *buf* + * of size *buf_size*. This helper relies on a *map* of type + * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event + * counter is selected when *map* is updated with perf event file + * descriptors. The *map* is an array whose size is the number of + * available CPUs, and each cell contains a value relative to one + * CPU. The value to retrieve is indicated by *flags*, that + * contains the index of the CPU to look up, masked with + * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * This helper behaves in a way close to + * **bpf_perf_event_read**\ () helper, save that instead of + * just returning the value observed, it fills the *buf* + * structure. This allows for additional data to be retrieved: in + * particular, the enabled and running times (in *buf*\ + * **->enabled** and *buf*\ **->running**, respectively) are + * copied. In general, **bpf_perf_event_read_value**\ () is + * recommended over **bpf_perf_event_read**\ (), which has some + * ABI issues and provides fewer functionalities. + * + * These values are interesting, because hardware PMU (Performance + * Monitoring Unit) counters are limited resources. When there are + * more PMU based perf events opened than available counters, + * kernel will multiplex these events so each event gets certain + * percentage (but not all) of the PMU time. In case that + * multiplexing happens, the number of samples or counter value + * will not reflect the case compared to when no multiplexing + * occurs. This makes comparison between different runs difficult. + * Typically, the counter value should be normalized before + * comparing to other experiments. The usual normalization is done + * as follows. + * + * :: + * + * normalized_counter = counter * t_enabled / t_running + * + * Where t_enabled is the time enabled for event and t_running is + * the time running for event since last normalization. The + * enabled and running times are accumulated since the perf event + * open. To achieve scaling factor between two invocations of an + * eBPF program, users can use CPU id as the key (which is + * typical for perf array usage model) to remember the previous + * value and do the calculation inside the eBPF program. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_perf_event_read_value)(void *map, __u64 flags, struct bpf_perf_event_value *buf, __u32 buf_size) = (void *) 55; + +/* + * bpf_perf_prog_read_value + * + * For an eBPF program attached to a perf event, retrieve the + * value of the event counter associated to *ctx* and store it in + * the structure pointed by *buf* and of size *buf_size*. Enabled + * and running times are also stored in the structure (see + * description of helper **bpf_perf_event_read_value**\ () for + * more details). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_perf_prog_read_value)(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, __u32 buf_size) = (void *) 56; + +/* + * bpf_getsockopt + * + * Emulate a call to **getsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **getsockopt(2)** for more information. + * The retrieved value is stored in the structure pointed by + * *opval* and of length *optlen*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **getsockopt()**. + * It supports the same set of *optname*\ s that is supported by + * the **bpf_setsockopt**\ () helper. The exceptions are + * **TCP_BPF_*** is **bpf_setsockopt**\ () only and + * **TCP_SAVED_SYN** is **bpf_getsockopt**\ () only. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_getsockopt)(void *bpf_socket, int level, int optname, void *optval, int optlen) = (void *) 57; + +/* + * bpf_override_return + * + * Used for error injection, this helper uses kprobes to override + * the return value of the probed function, and to set it to *rc*. + * The first argument is the context *regs* on which the kprobe + * works. + * + * This helper works by setting the PC (program counter) + * to an override function which is run in place of the original + * probed function. This means the probed function is not run at + * all. The replacement function just returns with the required + * value. + * + * This helper has security implications, and thus is subject to + * restrictions. It is only available if the kernel was compiled + * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration + * option, and in this case it only works on functions tagged with + * **ALLOW_ERROR_INJECTION** in the kernel code. + * + * Also, the helper is only available for the architectures having + * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, + * x86 architecture is the only one to support this feature. + * + * Returns + * 0 + */ +static long (*bpf_override_return)(struct pt_regs *regs, __u64 rc) = (void *) 58; + +/* + * bpf_sock_ops_cb_flags_set + * + * Attempt to set the value of the **bpf_sock_ops_cb_flags** field + * for the full TCP socket associated to *bpf_sock_ops* to + * *argval*. + * + * The primary use of this field is to determine if there should + * be calls to eBPF programs of type + * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP + * code. A program of the same type can change its value, per + * connection and as necessary, when the connection is + * established. This field is directly accessible for reading, but + * this helper must be used for updates in order to return an + * error if an eBPF program tries to set a callback that is not + * supported in the current kernel. + * + * *argval* is a flag array which can combine these flags: + * + * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) + * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) + * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) + * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) + * + * Therefore, this function can be used to clear a callback flag by + * setting the appropriate bit to zero. e.g. to disable the RTO + * callback: + * + * **bpf_sock_ops_cb_flags_set(bpf_sock,** + * **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)** + * + * Here are some examples of where one could call such eBPF + * program: + * + * * When RTO fires. + * * When a packet is retransmitted. + * * When the connection terminates. + * * When a packet is sent. + * * When a packet is received. + * + * Returns + * Code **-EINVAL** if the socket is not a full TCP socket; + * otherwise, a positive number containing the bits that could not + * be set is returned (which comes down to 0 if all bits were set + * as required). + */ +static long (*bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops *bpf_sock, int argval) = (void *) 59; + +/* + * bpf_msg_redirect_map + * + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_msg_redirect_map)(struct sk_msg_md *msg, void *map, __u32 key, __u64 flags) = (void *) 60; + +/* + * bpf_msg_apply_bytes + * + * For socket policies, apply the verdict of the eBPF program to + * the next *bytes* (number of bytes) of message *msg*. + * + * For example, this helper can be used in the following cases: + * + * * A single **sendmsg**\ () or **sendfile**\ () system call + * contains multiple logical messages that the eBPF program is + * supposed to read and for which it should apply a verdict. + * * An eBPF program only cares to read the first *bytes* of a + * *msg*. If the message has a large payload, then setting up + * and calling the eBPF program repeatedly for all bytes, even + * though the verdict is already known, would create unnecessary + * overhead. + * + * When called from within an eBPF program, the helper sets a + * counter internal to the BPF infrastructure, that is used to + * apply the last verdict to the next *bytes*. If *bytes* is + * smaller than the current data being processed from a + * **sendmsg**\ () or **sendfile**\ () system call, the first + * *bytes* will be sent and the eBPF program will be re-run with + * the pointer for start of data pointing to byte number *bytes* + * **+ 1**. If *bytes* is larger than the current data being + * processed, then the eBPF verdict will be applied to multiple + * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are + * consumed. + * + * Note that if a socket closes with the internal counter holding + * a non-zero value, this is not a problem because data is not + * being buffered for *bytes* and is sent as it is received. + * + * Returns + * 0 + */ +static long (*bpf_msg_apply_bytes)(struct sk_msg_md *msg, __u32 bytes) = (void *) 61; + +/* + * bpf_msg_cork_bytes + * + * For socket policies, prevent the execution of the verdict eBPF + * program for message *msg* until *bytes* (byte number) have been + * accumulated. + * + * This can be used when one needs a specific number of bytes + * before a verdict can be assigned, even if the data spans + * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme + * case would be a user calling **sendmsg**\ () repeatedly with + * 1-byte long message segments. Obviously, this is bad for + * performance, but it is still valid. If the eBPF program needs + * *bytes* bytes to validate a header, this helper can be used to + * prevent the eBPF program to be called again until *bytes* have + * been accumulated. + * + * Returns + * 0 + */ +static long (*bpf_msg_cork_bytes)(struct sk_msg_md *msg, __u32 bytes) = (void *) 62; + +/* + * bpf_msg_pull_data + * + * For socket policies, pull in non-linear data from user space + * for *msg* and set pointers *msg*\ **->data** and *msg*\ + * **->data_end** to *start* and *end* bytes offsets into *msg*, + * respectively. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it can only parse data that the (**data**, **data_end**) + * pointers have already consumed. For **sendmsg**\ () hooks this + * is likely the first scatterlist element. But for calls relying + * on the **sendpage** handler (e.g. **sendfile**\ ()) this will + * be the range (**0**, **0**) because the data is shared with + * user space and by default the objective is to avoid allowing + * user space to modify data while (or after) eBPF verdict is + * being decided. This helper can be used to pull in data and to + * set the start and end pointer to given values. Data will be + * copied if necessary (i.e. if data was not linear and if start + * and end pointers do not point to the same chunk). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_msg_pull_data)(struct sk_msg_md *msg, __u32 start, __u32 end, __u64 flags) = (void *) 63; + +/* + * bpf_bind + * + * Bind the socket associated to *ctx* to the address pointed by + * *addr*, of length *addr_len*. This allows for making outgoing + * connection from the desired IP address, which can be useful for + * example when all processes inside a cgroup should use one + * single IP address on a host that has multiple IP configured. + * + * This helper works for IPv4 and IPv6, TCP and UDP sockets. The + * domain (*addr*\ **->sa_family**) must be **AF_INET** (or + * **AF_INET6**). It's advised to pass zero port (**sin_port** + * or **sin6_port**) which triggers IP_BIND_ADDRESS_NO_PORT-like + * behavior and lets the kernel efficiently pick up an unused + * port as long as 4-tuple is unique. Passing non-zero port might + * lead to degraded performance. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_bind)(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) = (void *) 64; + +/* + * bpf_xdp_adjust_tail + * + * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is + * possible to both shrink and grow the packet tail. + * Shrink done via *delta* being a negative integer. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_adjust_tail)(struct xdp_md *xdp_md, int delta) = (void *) 65; + +/* + * bpf_skb_get_xfrm_state + * + * Retrieve the XFRM state (IP transform framework, see also + * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. + * + * The retrieved value is stored in the **struct bpf_xfrm_state** + * pointed by *xfrm_state* and of length *size*. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_XFRM** configuration option. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_get_xfrm_state)(struct __sk_buff *skb, __u32 index, struct bpf_xfrm_state *xfrm_state, __u32 size, __u64 flags) = (void *) 66; + +/* + * bpf_get_stack + * + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *ctx*, which is a pointer + * to the context on which the tracing program is executed. + * To store the stacktrace, the bpf program provides *buf* with + * a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect (build_id, file_offset) instead of ips for user + * stack, only valid if **BPF_F_USER_STACK** is also + * specified. + * + * *file_offset* is an offset relative to the beginning + * of the executable or shared object file backing the vma + * which the *ip* falls in. It is *not* an offset relative + * to that object's base address. Accordingly, it must be + * adjusted by adding (sh_addr - sh_offset), where + * sh_{addr,offset} correspond to the executable section + * containing *file_offset* in the object, for comparisons + * to symbols' st_value to be valid. + * + * **bpf_get_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * + * Returns + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + */ +static long (*bpf_get_stack)(void *ctx, void *buf, __u32 size, __u64 flags) = (void *) 67; + +/* + * bpf_skb_load_bytes_relative + * + * This helper is similar to **bpf_skb_load_bytes**\ () in that + * it provides an easy way to load *len* bytes from *offset* + * from the packet associated to *skb*, into the buffer pointed + * by *to*. The difference to **bpf_skb_load_bytes**\ () is that + * a fifth argument *start_header* exists in order to select a + * base offset to start from. *start_header* can be one of: + * + * **BPF_HDR_START_MAC** + * Base offset to load data from is *skb*'s mac header. + * **BPF_HDR_START_NET** + * Base offset to load data from is *skb*'s network header. + * + * In general, "direct packet access" is the preferred method to + * access packet data, however, this helper is in particular useful + * in socket filters where *skb*\ **->data** does not always point + * to the start of the mac header and where "direct packet access" + * is not available. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_load_bytes_relative)(const void *skb, __u32 offset, void *to, __u32 len, __u32 start_header) = (void *) 68; + +/* + * bpf_fib_lookup + * + * Do FIB lookup in kernel tables using parameters in *params*. + * If lookup is successful and result shows packet is to be + * forwarded, the neighbor tables are searched for the nexthop. + * If successful (ie., FIB lookup shows forwarding and nexthop + * is resolved), the nexthop address is returned in ipv4_dst + * or ipv6_dst based on family, smac is set to mac address of + * egress device, dmac is set to nexthop mac address, rt_metric + * is set to metric from route (IPv4/IPv6 only), and ifindex + * is set to the device index of the nexthop from the FIB lookup. + * + * *plen* argument is the size of the passed in struct. + * *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_FIB_LOOKUP_DIRECT** + * Do a direct table lookup vs full lookup using FIB + * rules. + * **BPF_FIB_LOOKUP_OUTPUT** + * Perform lookup from an egress perspective (default is + * ingress). + * **BPF_FIB_LOOKUP_SKIP_NEIGH** + * Skip the neighbour table lookup. *params*->dmac + * and *params*->smac will not be set as output. A common + * use case is to call **bpf_redirect_neigh**\ () after + * doing **bpf_fib_lookup**\ (). + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** tc cls_act programs. + * + * Returns + * * < 0 if any input argument is invalid + * * 0 on success (packet is forwarded, nexthop neighbor exists) + * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the + * packet is not forwarded or needs assist from full stack + * + * If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU + * was exceeded and output params->mtu_result contains the MTU. + */ +static long (*bpf_fib_lookup)(void *ctx, struct bpf_fib_lookup *params, int plen, __u32 flags) = (void *) 69; + +/* + * bpf_sock_hash_update + * + * Add an entry to, or update a sockhash *map* referencing sockets. + * The *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sock_hash_update)(struct bpf_sock_ops *skops, void *map, void *key, __u64 flags) = (void *) 70; + +/* + * bpf_msg_redirect_hash + * + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_msg_redirect_hash)(struct sk_msg_md *msg, void *map, void *key, __u64 flags) = (void *) 71; + +/* + * bpf_sk_redirect_hash + * + * This helper is used in programs implementing policies at the + * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. + * if the verdict eBPF program returns **SK_PASS**), redirect it + * to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_sk_redirect_hash)(struct __sk_buff *skb, void *map, void *key, __u64 flags) = (void *) 72; + +/* + * bpf_lwt_push_encap + * + * Encapsulate the packet associated to *skb* within a Layer 3 + * protocol header. This header is provided in the buffer at + * address *hdr*, with *len* its size in bytes. *type* indicates + * the protocol of the header and can be one of: + * + * **BPF_LWT_ENCAP_SEG6** + * IPv6 encapsulation with Segment Routing Header + * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, + * the IPv6 header is computed by the kernel. + * **BPF_LWT_ENCAP_SEG6_INLINE** + * Only works if *skb* contains an IPv6 packet. Insert a + * Segment Routing Header (**struct ipv6_sr_hdr**) inside + * the IPv6 header. + * **BPF_LWT_ENCAP_IP** + * IP encapsulation (GRE/GUE/IPIP/etc). The outer header + * must be IPv4 or IPv6, followed by zero or more + * additional headers, up to **LWT_BPF_MAX_HEADROOM** + * total bytes in all prepended headers. Please note that + * if **skb_is_gso**\ (*skb*) is true, no more than two + * headers can be prepended, and the inner header, if + * present, should be either GRE or UDP/GUE. + * + * **BPF_LWT_ENCAP_SEG6**\ \* types can be called by BPF programs + * of type **BPF_PROG_TYPE_LWT_IN**; **BPF_LWT_ENCAP_IP** type can + * be called by bpf programs of types **BPF_PROG_TYPE_LWT_IN** and + * **BPF_PROG_TYPE_LWT_XMIT**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_push_encap)(struct __sk_buff *skb, __u32 type, void *hdr, __u32 len) = (void *) 73; + +/* + * bpf_lwt_seg6_store_bytes + * + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. Only the flags, tag and TLVs + * inside the outermost IPv6 Segment Routing Header can be + * modified through this helper. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_seg6_store_bytes)(struct __sk_buff *skb, __u32 offset, const void *from, __u32 len) = (void *) 74; + +/* + * bpf_lwt_seg6_adjust_srh + * + * Adjust the size allocated to TLVs in the outermost IPv6 + * Segment Routing Header contained in the packet associated to + * *skb*, at position *offset* by *delta* bytes. Only offsets + * after the segments are accepted. *delta* can be as well + * positive (growing) as negative (shrinking). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_seg6_adjust_srh)(struct __sk_buff *skb, __u32 offset, __s32 delta) = (void *) 75; + +/* + * bpf_lwt_seg6_action + * + * Apply an IPv6 Segment Routing action of type *action* to the + * packet associated to *skb*. Each action takes a parameter + * contained at address *param*, and of length *param_len* bytes. + * *action* can be one of: + * + * **SEG6_LOCAL_ACTION_END_X** + * End.X action: Endpoint with Layer-3 cross-connect. + * Type of *param*: **struct in6_addr**. + * **SEG6_LOCAL_ACTION_END_T** + * End.T action: Endpoint with specific IPv6 table lookup. + * Type of *param*: **int**. + * **SEG6_LOCAL_ACTION_END_B6** + * End.B6 action: Endpoint bound to an SRv6 policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * **SEG6_LOCAL_ACTION_END_B6_ENCAP** + * End.B6.Encap action: Endpoint bound to an SRv6 + * encapsulation policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_seg6_action)(struct __sk_buff *skb, __u32 action, void *param, __u32 param_len) = (void *) 76; + +/* + * bpf_rc_repeat + * + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded repeat key message. This delays + * the generation of a key up event for previously generated + * key down event. + * + * Some IR protocols like NEC have a special IR message for + * repeating last button, for when a button is held down. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * + * Returns + * 0 + */ +static long (*bpf_rc_repeat)(void *ctx) = (void *) 77; + +/* + * bpf_rc_keydown + * + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded key press with *scancode*, + * *toggle* value in the given *protocol*. The scancode will be + * translated to a keycode using the rc keymap, and reported as + * an input key down event. After a period a key up event is + * generated. This period can be extended by calling either + * **bpf_rc_keydown**\ () again with the same values, or calling + * **bpf_rc_repeat**\ (). + * + * Some protocols include a toggle bit, in case the button was + * released and pressed again between consecutive scancodes. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * The *protocol* is the decoded protocol number (see + * **enum rc_proto** for some predefined values). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * + * Returns + * 0 + */ +static long (*bpf_rc_keydown)(void *ctx, __u32 protocol, __u64 scancode, __u32 toggle) = (void *) 78; + +/* + * bpf_skb_cgroup_id + * + * Return the cgroup v2 id of the socket associated with the *skb*. + * This is roughly similar to the **bpf_get_cgroup_classid**\ () + * helper for cgroup v1 by providing a tag resp. identifier that + * can be matched on or used for map lookups e.g. to implement + * policy. The cgroup v2 id of a given path in the hierarchy is + * exposed in user space through the f_handle API in order to get + * to the same 64-bit id. + * + * This helper can be used on TC egress path, but not on ingress, + * and is available only if the kernel was compiled with the + * **CONFIG_SOCK_CGROUP_DATA** configuration option. + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_skb_cgroup_id)(struct __sk_buff *skb) = (void *) 79; + +/* + * bpf_get_current_cgroup_id + * + * Get the current cgroup id based on the cgroup within which + * the current task is running. + * + * Returns + * A 64-bit integer containing the current cgroup id based + * on the cgroup within which the current task is running. + */ +static __u64 (*bpf_get_current_cgroup_id)(void) = (void *) 80; + +/* + * bpf_get_local_storage + * + * Get the pointer to the local storage area. + * The type and the size of the local storage is defined + * by the *map* argument. + * The *flags* meaning is specific for each map type, + * and has to be 0 for cgroup local storage. + * + * Depending on the BPF program type, a local storage area + * can be shared between multiple instances of the BPF program, + * running simultaneously. + * + * A user should care about the synchronization by himself. + * For example, by using the **BPF_ATOMIC** instructions to alter + * the shared data. + * + * Returns + * A pointer to the local storage area. + */ +static void *(*bpf_get_local_storage)(void *map, __u64 flags) = (void *) 81; + +/* + * bpf_sk_select_reuseport + * + * Select a **SO_REUSEPORT** socket from a + * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*. + * It checks the selected socket is matching the incoming + * request in the socket buffer. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sk_select_reuseport)(struct sk_reuseport_md *reuse, void *map, void *key, __u64 flags) = (void *) 82; + +/* + * bpf_skb_ancestor_cgroup_id + * + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *skb* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *skb*, then return value will be same as that + * of **bpf_skb_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *skb*. + * + * The format of returned id and helper limitations are same as in + * **bpf_skb_cgroup_id**\ (). + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_skb_ancestor_cgroup_id)(struct __sk_buff *skb, int ancestor_level) = (void *) 83; + +/* + * bpf_sk_lookup_tcp + * + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * + * Returns + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + */ +static struct bpf_sock *(*bpf_sk_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 84; + +/* + * bpf_sk_lookup_udp + * + * Look for UDP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * + * Returns + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + */ +static struct bpf_sock *(*bpf_sk_lookup_udp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 85; + +/* + * bpf_sk_release + * + * Release the reference held by *sock*. *sock* must be a + * non-**NULL** pointer that was returned from + * **bpf_sk_lookup_xxx**\ (). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sk_release)(void *sock) = (void *) 86; + +/* + * bpf_map_push_elem + * + * Push an element *value* in *map*. *flags* is one of: + * + * **BPF_EXIST** + * If the queue/stack is full, the oldest element is + * removed to make room for this. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_push_elem)(void *map, const void *value, __u64 flags) = (void *) 87; + +/* + * bpf_map_pop_elem + * + * Pop an element from *map*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_pop_elem)(void *map, void *value) = (void *) 88; + +/* + * bpf_map_peek_elem + * + * Get an element from *map* without removing it. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_peek_elem)(void *map, void *value) = (void *) 89; + +/* + * bpf_msg_push_data + * + * For socket policies, insert *len* bytes into *msg* at offset + * *start*. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it may want to insert metadata or options into the *msg*. + * This can later be read and used by any of the lower layer BPF + * hooks. + * + * This helper may fail if under memory pressure (a malloc + * fails) in these cases BPF programs will get an appropriate + * error and BPF programs will need to handle them. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_msg_push_data)(struct sk_msg_md *msg, __u32 start, __u32 len, __u64 flags) = (void *) 90; + +/* + * bpf_msg_pop_data + * + * Will remove *len* bytes from a *msg* starting at byte *start*. + * This may result in **ENOMEM** errors under certain situations if + * an allocation and copy are required due to a full ring buffer. + * However, the helper will try to avoid doing the allocation + * if possible. Other errors can occur if input parameters are + * invalid either due to *start* byte not being valid part of *msg* + * payload and/or *pop* value being to large. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_msg_pop_data)(struct sk_msg_md *msg, __u32 start, __u32 len, __u64 flags) = (void *) 91; + +/* + * bpf_rc_pointer_rel + * + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded pointer movement. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * + * Returns + * 0 + */ +static long (*bpf_rc_pointer_rel)(void *ctx, __s32 rel_x, __s32 rel_y) = (void *) 92; + +/* + * bpf_spin_lock + * + * Acquire a spinlock represented by the pointer *lock*, which is + * stored as part of a value of a map. Taking the lock allows to + * safely update the rest of the fields in that value. The + * spinlock can (and must) later be released with a call to + * **bpf_spin_unlock**\ (\ *lock*\ ). + * + * Spinlocks in BPF programs come with a number of restrictions + * and constraints: + * + * * **bpf_spin_lock** objects are only allowed inside maps of + * types **BPF_MAP_TYPE_HASH** and **BPF_MAP_TYPE_ARRAY** (this + * list could be extended in the future). + * * BTF description of the map is mandatory. + * * The BPF program can take ONE lock at a time, since taking two + * or more could cause dead locks. + * * Only one **struct bpf_spin_lock** is allowed per map element. + * * When the lock is taken, calls (either BPF to BPF or helpers) + * are not allowed. + * * The **BPF_LD_ABS** and **BPF_LD_IND** instructions are not + * allowed inside a spinlock-ed region. + * * The BPF program MUST call **bpf_spin_unlock**\ () to release + * the lock, on all execution paths, before it returns. + * * The BPF program can access **struct bpf_spin_lock** only via + * the **bpf_spin_lock**\ () and **bpf_spin_unlock**\ () + * helpers. Loading or storing data into the **struct + * bpf_spin_lock** *lock*\ **;** field of a map is not allowed. + * * To use the **bpf_spin_lock**\ () helper, the BTF description + * of the map value must be a struct and have **struct + * bpf_spin_lock** *anyname*\ **;** field at the top level. + * Nested lock inside another struct is not allowed. + * * The **struct bpf_spin_lock** *lock* field in a map value must + * be aligned on a multiple of 4 bytes in that value. + * * Syscall with command **BPF_MAP_LOOKUP_ELEM** does not copy + * the **bpf_spin_lock** field to user space. + * * Syscall with command **BPF_MAP_UPDATE_ELEM**, or update from + * a BPF program, do not update the **bpf_spin_lock** field. + * * **bpf_spin_lock** cannot be on the stack or inside a + * networking packet (it can only be inside of a map values). + * * **bpf_spin_lock** is available to root only. + * * Tracing programs and socket filter programs cannot use + * **bpf_spin_lock**\ () due to insufficient preemption checks + * (but this may change in the future). + * * **bpf_spin_lock** is not allowed in inner maps of map-in-map. + * + * Returns + * 0 + */ +static long (*bpf_spin_lock)(struct bpf_spin_lock *lock) = (void *) 93; + +/* + * bpf_spin_unlock + * + * Release the *lock* previously locked by a call to + * **bpf_spin_lock**\ (\ *lock*\ ). + * + * Returns + * 0 + */ +static long (*bpf_spin_unlock)(struct bpf_spin_lock *lock) = (void *) 94; + +/* + * bpf_sk_fullsock + * + * This helper gets a **struct bpf_sock** pointer such + * that all the fields in this **bpf_sock** can be accessed. + * + * Returns + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + */ +static struct bpf_sock *(*bpf_sk_fullsock)(struct bpf_sock *sk) = (void *) 95; + +/* + * bpf_tcp_sock + * + * This helper gets a **struct bpf_tcp_sock** pointer from a + * **struct bpf_sock** pointer. + * + * Returns + * A **struct bpf_tcp_sock** pointer on success, or **NULL** in + * case of failure. + */ +static struct bpf_tcp_sock *(*bpf_tcp_sock)(struct bpf_sock *sk) = (void *) 96; + +/* + * bpf_skb_ecn_set_ce + * + * Set ECN (Explicit Congestion Notification) field of IP header + * to **CE** (Congestion Encountered) if current value is **ECT** + * (ECN Capable Transport). Otherwise, do nothing. Works with IPv6 + * and IPv4. + * + * Returns + * 1 if the **CE** flag is set (either by the current helper call + * or because it was already present), 0 if it is not set. + */ +static long (*bpf_skb_ecn_set_ce)(struct __sk_buff *skb) = (void *) 97; + +/* + * bpf_get_listener_sock + * + * Return a **struct bpf_sock** pointer in **TCP_LISTEN** state. + * **bpf_sk_release**\ () is unnecessary and not allowed. + * + * Returns + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + */ +static struct bpf_sock *(*bpf_get_listener_sock)(struct bpf_sock *sk) = (void *) 98; + +/* + * bpf_skc_lookup_tcp + * + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * This function is identical to **bpf_sk_lookup_tcp**\ (), except + * that it also returns timewait or request sockets. Use + * **bpf_sk_fullsock**\ () or **bpf_tcp_sock**\ () to access the + * full structure. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * + * Returns + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + */ +static struct bpf_sock *(*bpf_skc_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 99; + +/* + * bpf_tcp_check_syncookie + * + * Check whether *iph* and *th* contain a valid SYN cookie ACK for + * the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative + * error otherwise. + */ +static long (*bpf_tcp_check_syncookie)(void *sk, void *iph, __u32 iph_len, struct tcphdr *th, __u32 th_len) = (void *) 100; + +/* + * bpf_sysctl_get_name + * + * Get name of sysctl in /proc/sys/ and copy it into provided by + * program buffer *buf* of size *buf_len*. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * If *flags* is zero, full name (e.g. "net/ipv4/tcp_mem") is + * copied. Use **BPF_F_SYSCTL_BASE_NAME** flag to copy base name + * only (e.g. "tcp_mem"). + * + * Returns + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + */ +static long (*bpf_sysctl_get_name)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len, __u64 flags) = (void *) 101; + +/* + * bpf_sysctl_get_current_value + * + * Get current value of sysctl as it is presented in /proc/sys + * (incl. newline, etc), and copy it as a string into provided + * by program buffer *buf* of size *buf_len*. + * + * The whole value is copied, no matter what file position user + * space issued e.g. sys_read at. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * Returns + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if current value was unavailable, e.g. because + * sysctl is uninitialized and read returns -EIO for it. + */ +static long (*bpf_sysctl_get_current_value)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len) = (void *) 102; + +/* + * bpf_sysctl_get_new_value + * + * Get new value being written by user space to sysctl (before + * the actual write happens) and copy it as a string into + * provided by program buffer *buf* of size *buf_len*. + * + * User space may write new value at file position > 0. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * Returns + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if sysctl is being read. + */ +static long (*bpf_sysctl_get_new_value)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len) = (void *) 103; + +/* + * bpf_sysctl_set_new_value + * + * Override new value being written by user space to sysctl with + * value provided by program in buffer *buf* of size *buf_len*. + * + * *buf* should contain a string in same form as provided by user + * space on sysctl write. + * + * User space may write new value at file position > 0. To override + * the whole sysctl value file position should be set to zero. + * + * Returns + * 0 on success. + * + * **-E2BIG** if the *buf_len* is too big. + * + * **-EINVAL** if sysctl is being read. + */ +static long (*bpf_sysctl_set_new_value)(struct bpf_sysctl *ctx, const char *buf, unsigned long buf_len) = (void *) 104; + +/* + * bpf_strtol + * + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to a long integer according to the given base + * and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)) followed by a single + * optional '**-**' sign. + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtol**\ (3). + * + * Returns + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + */ +static long (*bpf_strtol)(const char *buf, unsigned long buf_len, __u64 flags, long *res) = (void *) 105; + +/* + * bpf_strtoul + * + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to an unsigned long integer according to the + * given base and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)). + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtoul**\ (3). + * + * Returns + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + */ +static long (*bpf_strtoul)(const char *buf, unsigned long buf_len, __u64 flags, unsigned long *res) = (void *) 106; + +/* + * bpf_sk_storage_get + * + * Get a bpf-local-storage from a *sk*. + * + * Logically, it could be thought of getting the value from + * a *map* with *sk* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *sk*) except this + * helper enforces the key must be a full socket and the map must + * be a **BPF_MAP_TYPE_SK_STORAGE** also. + * + * Underneath, the value is stored locally at *sk* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf-local-storages residing at *sk*. + * + * *sk* is a kernel **struct sock** pointer for LSM program. + * *sk* is a **struct bpf_sock** pointer for other program types. + * + * An optional *flags* (**BPF_SK_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf-local-storage will be + * created if one does not exist. *value* can be used + * together with **BPF_SK_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf-local-storage. If *value* is + * **NULL**, the new bpf-local-storage will be zero initialized. + * + * Returns + * A bpf-local-storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf-local-storage. + */ +static void *(*bpf_sk_storage_get)(void *map, void *sk, void *value, __u64 flags) = (void *) 107; + +/* + * bpf_sk_storage_delete + * + * Delete a bpf-local-storage from a *sk*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf-local-storage cannot be found. + * **-EINVAL** if sk is not a fullsock (e.g. a request_sock). + */ +static long (*bpf_sk_storage_delete)(void *map, void *sk) = (void *) 108; + +/* + * bpf_send_signal + * + * Send signal *sig* to the process of the current task. + * The signal may be delivered to any of this process's threads. + * + * Returns + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + */ +static long (*bpf_send_signal)(__u32 sig) = (void *) 109; + +/* + * bpf_tcp_gen_syncookie + * + * Try to issue a SYN cookie for the packet with corresponding + * IP/TCP headers, *iph* and *th*, on the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header with options (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** SYN cookie cannot be issued due to error + * + * **-ENOENT** SYN cookie should not be issued (no SYN flood) + * + * **-EOPNOTSUPP** kernel configuration does not enable SYN cookies + * + * **-EPROTONOSUPPORT** IP packet version is not 4 or 6 + */ +static __s64 (*bpf_tcp_gen_syncookie)(void *sk, void *iph, __u32 iph_len, struct tcphdr *th, __u32 th_len) = (void *) 110; + +/* + * bpf_skb_output + * + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct sk_buff. + * + * This helper is similar to **bpf_perf_event_output**\ () but + * restricted to raw_tracepoint bpf programs. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 111; + +/* + * bpf_probe_read_user + * + * Safely attempt to read *size* bytes from user space address + * *unsafe_ptr* and store the data in *dst*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_read_user)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 112; + +/* + * bpf_probe_read_kernel + * + * Safely attempt to read *size* bytes from kernel space address + * *unsafe_ptr* and store the data in *dst*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_read_kernel)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 113; + +/* + * bpf_probe_read_user_str + * + * Copy a NUL terminated string from an unsafe user address + * *unsafe_ptr* to *dst*. The *size* should include the + * terminating NUL byte. In case the string length is smaller than + * *size*, the target is not padded with further NUL bytes. If the + * string length is larger than *size*, just *size*-1 bytes are + * copied and the last byte is set to NUL. + * + * On success, returns the number of bytes that were written, + * including the terminal NUL. This makes this helper useful in + * tracing programs for reading strings, and more importantly to + * get its length at runtime. See the following snippet: + * + * :: + * + * SEC("kprobe/sys_open") + * void bpf_sys_open(struct pt_regs *ctx) + * { + * char buf[PATHLEN]; // PATHLEN is defined to 256 + * int res = bpf_probe_read_user_str(buf, sizeof(buf), + * ctx->di); + * + * // Consume buf, for example push it to + * // userspace via bpf_perf_event_output(); we + * // can use res (the string length) as event + * // size, after checking its boundaries. + * } + * + * In comparison, using **bpf_probe_read_user**\ () helper here + * instead to read the string would require to estimate the length + * at compile time, and would often result in copying more memory + * than necessary. + * + * Another useful use case is when parsing individual process + * arguments or individual environment variables navigating + * *current*\ **->mm->arg_start** and *current*\ + * **->mm->env_start**: using this helper and the return value, + * one can quickly iterate at the right offset of the memory area. + * + * Returns + * On success, the strictly positive length of the output string, + * including the trailing NUL character. On error, a negative + * value. + */ +static long (*bpf_probe_read_user_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 114; + +/* + * bpf_probe_read_kernel_str + * + * Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr* + * to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply. + * + * Returns + * On success, the strictly positive length of the string, including + * the trailing NUL character. On error, a negative value. + */ +static long (*bpf_probe_read_kernel_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 115; + +/* + * bpf_tcp_send_ack + * + * Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**. + * *rcv_nxt* is the ack_seq to be sent out. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_tcp_send_ack)(void *tp, __u32 rcv_nxt) = (void *) 116; + +/* + * bpf_send_signal_thread + * + * Send signal *sig* to the thread corresponding to the current task. + * + * Returns + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + */ +static long (*bpf_send_signal_thread)(__u32 sig) = (void *) 117; + +/* + * bpf_jiffies64 + * + * Obtain the 64bit jiffies + * + * Returns + * The 64 bit jiffies + */ +static __u64 (*bpf_jiffies64)(void) = (void *) 118; + +/* + * bpf_read_branch_records + * + * For an eBPF program attached to a perf event, retrieve the + * branch records (**struct perf_branch_entry**) associated to *ctx* + * and store it in the buffer pointed by *buf* up to size + * *size* bytes. + * + * Returns + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to + * instead return the number of bytes required to store all the + * branch entries. If this flag is set, *buf* may be NULL. + * + * **-EINVAL** if arguments invalid or **size** not a multiple + * of **sizeof**\ (**struct perf_branch_entry**\ ). + * + * **-ENOENT** if architecture does not support branch records. + */ +static long (*bpf_read_branch_records)(struct bpf_perf_event_data *ctx, void *buf, __u32 size, __u64 flags) = (void *) 119; + +/* + * bpf_get_ns_current_pid_tgid + * + * Returns 0 on success, values for *pid* and *tgid* as seen from the current + * *namespace* will be returned in *nsdata*. + * + * Returns + * 0 on success, or one of the following in case of failure: + * + * **-EINVAL** if dev and inum supplied don't match dev_t and inode number + * with nsfs of current task, or if dev conversion to dev_t lost high bits. + * + * **-ENOENT** if pidns does not exists for the current task. + */ +static long (*bpf_get_ns_current_pid_tgid)(__u64 dev, __u64 ino, struct bpf_pidns_info *nsdata, __u32 size) = (void *) 120; + +/* + * bpf_xdp_output + * + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct xdp_buff. + * + * This helper is similar to **bpf_perf_eventoutput**\ () but + * restricted to raw_tracepoint bpf programs. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 121; + +/* + * bpf_get_netns_cookie + * + * Retrieve the cookie (generated by the kernel) of the network + * namespace the input *ctx* is associated with. The network + * namespace cookie remains stable for its lifetime and provides + * a global identifier that can be assumed unique. If *ctx* is + * NULL, then the helper returns the cookie for the initial + * network namespace. The cookie itself is very similar to that + * of **bpf_get_socket_cookie**\ () helper, but for network + * namespaces instead of sockets. + * + * Returns + * A 8-byte long opaque number. + */ +static __u64 (*bpf_get_netns_cookie)(void *ctx) = (void *) 122; + +/* + * bpf_get_current_ancestor_cgroup_id + * + * Return id of cgroup v2 that is ancestor of the cgroup associated + * with the current task at the *ancestor_level*. The root cgroup + * is at *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with the current task, then return value will be the + * same as that of **bpf_get_current_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with the current task. + * + * The format of returned id and helper limitations are same as in + * **bpf_get_current_cgroup_id**\ (). + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_get_current_ancestor_cgroup_id)(int ancestor_level) = (void *) 123; + +/* + * bpf_sk_assign + * + * Helper is overloaded depending on BPF program type. This + * description applies to **BPF_PROG_TYPE_SCHED_CLS** and + * **BPF_PROG_TYPE_SCHED_ACT** programs. + * + * Assign the *sk* to the *skb*. When combined with appropriate + * routing configuration to receive the packet towards the socket, + * will cause *skb* to be delivered to the specified socket. + * Subsequent redirection of *skb* via **bpf_redirect**\ (), + * **bpf_clone_redirect**\ () or other methods outside of BPF may + * interfere with successful delivery to the socket. + * + * This operation is only valid from TC ingress path. + * + * The *flags* argument must be zero. + * + * Returns + * 0 on success, or a negative error in case of failure: + * + * **-EINVAL** if specified *flags* are not supported. + * + * **-ENOENT** if the socket is unavailable for assignment. + * + * **-ENETUNREACH** if the socket is unreachable (wrong netns). + * + * **-EOPNOTSUPP** if the operation is not supported, for example + * a call from outside of TC ingress. + * + * **-ESOCKTNOSUPPORT** if the socket type is not supported + * (reuseport). + */ +static long (*bpf_sk_assign)(void *ctx, void *sk, __u64 flags) = (void *) 124; + +/* + * bpf_ktime_get_boot_ns + * + * Return the time elapsed since system boot, in nanoseconds. + * Does include the time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_BOOTTIME**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_boot_ns)(void) = (void *) 125; + +/* + * bpf_seq_printf + * + * **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print + * out the format string. + * The *m* represents the seq_file. The *fmt* and *fmt_size* are for + * the format string itself. The *data* and *data_len* are format string + * arguments. The *data* are a **u64** array and corresponding format string + * values are stored in the array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* array. + * The *data_len* is the size of *data* in bytes - must be a multiple of 8. + * + * Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory. + * Reading kernel memory may fail due to either invalid address or + * valid address but requiring a major memory fault. If reading kernel memory + * fails, the string for **%s** will be an empty string, and the ip + * address for **%p{i,I}{4,6}** will be 0. Not returning error to + * bpf program is consistent with what **bpf_trace_printk**\ () does for now. + * + * Returns + * 0 on success, or a negative error in case of failure: + * + * **-EBUSY** if per-CPU memory copy buffer is busy, can try again + * by returning 1 from bpf program. + * + * **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported. + * + * **-E2BIG** if *fmt* contains too many format specifiers. + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + */ +static long (*bpf_seq_printf)(struct seq_file *m, const char *fmt, __u32 fmt_size, const void *data, __u32 data_len) = (void *) 126; + +/* + * bpf_seq_write + * + * **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data. + * The *m* represents the seq_file. The *data* and *len* represent the + * data to write in bytes. + * + * Returns + * 0 on success, or a negative error in case of failure: + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + */ +static long (*bpf_seq_write)(struct seq_file *m, const void *data, __u32 len) = (void *) 127; + +/* + * bpf_sk_cgroup_id + * + * Return the cgroup v2 id of the socket *sk*. + * + * *sk* must be a non-**NULL** pointer to a socket, e.g. one + * returned from **bpf_sk_lookup_xxx**\ (), + * **bpf_sk_fullsock**\ (), etc. The format of returned id is + * same as in **bpf_skb_cgroup_id**\ (). + * + * This helper is available only if the kernel was compiled with + * the **CONFIG_SOCK_CGROUP_DATA** configuration option. + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_sk_cgroup_id)(void *sk) = (void *) 128; + +/* + * bpf_sk_ancestor_cgroup_id + * + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *sk* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *sk*, then return value will be same as that + * of **bpf_sk_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *sk*. + * + * The format of returned id and helper limitations are same as in + * **bpf_sk_cgroup_id**\ (). + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_sk_ancestor_cgroup_id)(void *sk, int ancestor_level) = (void *) 129; + +/* + * bpf_ringbuf_output + * + * Copy *size* bytes from *data* into a ring buffer *ringbuf*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * An adaptive notification is a notification sent whenever the user-space + * process has caught up and consumed all available payloads. In case the user-space + * process is still processing a previous payload, then no notification is needed + * as it will process the newly added payload automatically. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_ringbuf_output)(void *ringbuf, void *data, __u64 size, __u64 flags) = (void *) 130; + +/* + * bpf_ringbuf_reserve + * + * Reserve *size* bytes of payload in a ring buffer *ringbuf*. + * *flags* must be 0. + * + * Returns + * Valid pointer with *size* bytes of memory available; NULL, + * otherwise. + */ +static void *(*bpf_ringbuf_reserve)(void *ringbuf, __u64 size, __u64 flags) = (void *) 131; + +/* + * bpf_ringbuf_submit + * + * Submit reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_submit)(void *data, __u64 flags) = (void *) 132; + +/* + * bpf_ringbuf_discard + * + * Discard reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_discard)(void *data, __u64 flags) = (void *) 133; + +/* + * bpf_ringbuf_query + * + * Query various characteristics of provided ring buffer. What + * exactly is queries is determined by *flags*: + * + * * **BPF_RB_AVAIL_DATA**: Amount of data not yet consumed. + * * **BPF_RB_RING_SIZE**: The size of ring buffer. + * * **BPF_RB_CONS_POS**: Consumer position (can wrap around). + * * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around). + * + * Data returned is just a momentary snapshot of actual values + * and could be inaccurate, so this facility should be used to + * power heuristics and for reporting, not to make 100% correct + * calculation. + * + * Returns + * Requested value, or 0, if *flags* are not recognized. + */ +static __u64 (*bpf_ringbuf_query)(void *ringbuf, __u64 flags) = (void *) 134; + +/* + * bpf_csum_level + * + * Change the skbs checksum level by one layer up or down, or + * reset it entirely to none in order to have the stack perform + * checksum validation. The level is applicable to the following + * protocols: TCP, UDP, GRE, SCTP, FCOE. For example, a decap of + * | ETH | IP | UDP | GUE | IP | TCP | into | ETH | IP | TCP | + * through **bpf_skb_adjust_room**\ () helper with passing in + * **BPF_F_ADJ_ROOM_NO_CSUM_RESET** flag would require one call + * to **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_DEC** since + * the UDP header is removed. Similarly, an encap of the latter + * into the former could be accompanied by a helper call to + * **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_INC** if the + * skb is still intended to be processed in higher layers of the + * stack instead of just egressing at tc. + * + * There are three supported level settings at this time: + * + * * **BPF_CSUM_LEVEL_INC**: Increases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_DEC**: Decreases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_RESET**: Resets skb->csum_level to 0 and + * sets CHECKSUM_NONE to force checksum validation by the stack. + * * **BPF_CSUM_LEVEL_QUERY**: No-op, returns the current + * skb->csum_level. + * + * Returns + * 0 on success, or a negative error in case of failure. In the + * case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level + * is returned or the error code -EACCES in case the skb is not + * subject to CHECKSUM_UNNECESSARY. + */ +static long (*bpf_csum_level)(struct __sk_buff *skb, __u64 level) = (void *) 135; + +/* + * bpf_skc_to_tcp6_sock + * + * Dynamically cast a *sk* pointer to a *tcp6_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp6_sock *(*bpf_skc_to_tcp6_sock)(void *sk) = (void *) 136; + +/* + * bpf_skc_to_tcp_sock + * + * Dynamically cast a *sk* pointer to a *tcp_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp_sock *(*bpf_skc_to_tcp_sock)(void *sk) = (void *) 137; + +/* + * bpf_skc_to_tcp_timewait_sock + * + * Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp_timewait_sock *(*bpf_skc_to_tcp_timewait_sock)(void *sk) = (void *) 138; + +/* + * bpf_skc_to_tcp_request_sock + * + * Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp_request_sock *(*bpf_skc_to_tcp_request_sock)(void *sk) = (void *) 139; + +/* + * bpf_skc_to_udp6_sock + * + * Dynamically cast a *sk* pointer to a *udp6_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct udp6_sock *(*bpf_skc_to_udp6_sock)(void *sk) = (void *) 140; + +/* + * bpf_get_task_stack + * + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *task*, which is a valid + * pointer to **struct task_struct**. To store the stacktrace, the + * bpf program provides *buf* with a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect buildid+offset instead of ips for user stack, + * only valid if **BPF_F_USER_STACK** is also specified. + * + * **bpf_get_task_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * + * Returns + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + */ +static long (*bpf_get_task_stack)(struct task_struct *task, void *buf, __u32 size, __u64 flags) = (void *) 141; + +/* + * bpf_load_hdr_opt + * + * Load header option. Support reading a particular TCP header + * option for bpf program (**BPF_PROG_TYPE_SOCK_OPS**). + * + * If *flags* is 0, it will search the option from the + * *skops*\ **->skb_data**. The comment in **struct bpf_sock_ops** + * has details on what skb_data contains under different + * *skops*\ **->op**. + * + * The first byte of the *searchby_res* specifies the + * kind that it wants to search. + * + * If the searching kind is an experimental kind + * (i.e. 253 or 254 according to RFC6994). It also + * needs to specify the "magic" which is either + * 2 bytes or 4 bytes. It then also needs to + * specify the size of the magic by using + * the 2nd byte which is "kind-length" of a TCP + * header option and the "kind-length" also + * includes the first 2 bytes "kind" and "kind-length" + * itself as a normal TCP header option also does. + * + * For example, to search experimental kind 254 with + * 2 byte magic 0xeB9F, the searchby_res should be + * [ 254, 4, 0xeB, 0x9F, 0, 0, .... 0 ]. + * + * To search for the standard window scale option (3), + * the *searchby_res* should be [ 3, 0, 0, .... 0 ]. + * Note, kind-length must be 0 for regular option. + * + * Searching for No-Op (0) and End-of-Option-List (1) are + * not supported. + * + * *len* must be at least 2 bytes which is the minimal size + * of a header option. + * + * Supported flags: + * + * * **BPF_LOAD_HDR_OPT_TCP_SYN** to search from the + * saved_syn packet or the just-received syn packet. + * + * + * Returns + * > 0 when found, the header option is copied to *searchby_res*. + * The return value is the total length copied. On failure, a + * negative error code is returned: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOMSG** if the option is not found. + * + * **-ENOENT** if no syn packet is available when + * **BPF_LOAD_HDR_OPT_TCP_SYN** is used. + * + * **-ENOSPC** if there is not enough space. Only *len* number of + * bytes are copied. + * + * **-EFAULT** on failure to parse the header options in the + * packet. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + */ +static long (*bpf_load_hdr_opt)(struct bpf_sock_ops *skops, void *searchby_res, __u32 len, __u64 flags) = (void *) 142; + +/* + * bpf_store_hdr_opt + * + * Store header option. The data will be copied + * from buffer *from* with length *len* to the TCP header. + * + * The buffer *from* should have the whole option that + * includes the kind, kind-length, and the actual + * option data. The *len* must be at least kind-length + * long. The kind-length does not have to be 4 byte + * aligned. The kernel will take care of the padding + * and setting the 4 bytes aligned value to th->doff. + * + * This helper will check for duplicated option + * by searching the same option in the outgoing skb. + * + * This helper can only be called during + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * + * Returns + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** If param is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * Nothing has been written + * + * **-EEXIST** if the option already exists. + * + * **-EFAULT** on failure to parse the existing header options. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + */ +static long (*bpf_store_hdr_opt)(struct bpf_sock_ops *skops, const void *from, __u32 len, __u64 flags) = (void *) 143; + +/* + * bpf_reserve_hdr_opt + * + * Reserve *len* bytes for the bpf header option. The + * space will be used by **bpf_store_hdr_opt**\ () later in + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * If **bpf_reserve_hdr_opt**\ () is called multiple times, + * the total number of bytes will be reserved. + * + * This helper can only be called during + * **BPF_SOCK_OPS_HDR_OPT_LEN_CB**. + * + * + * Returns + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + */ +static long (*bpf_reserve_hdr_opt)(struct bpf_sock_ops *skops, __u32 len, __u64 flags) = (void *) 144; + +/* + * bpf_inode_storage_get + * + * Get a bpf_local_storage from an *inode*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *inode* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *inode*) except this + * helper enforces the key must be an inode and the map must also + * be a **BPF_MAP_TYPE_INODE_STORAGE**. + * + * Underneath, the value is stored locally at *inode* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *inode*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * + * Returns + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + */ +static void *(*bpf_inode_storage_get)(void *map, void *inode, void *value, __u64 flags) = (void *) 145; + +/* + * bpf_inode_storage_delete + * + * Delete a bpf_local_storage from an *inode*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +static int (*bpf_inode_storage_delete)(void *map, void *inode) = (void *) 146; + +/* + * bpf_d_path + * + * Return full path for given **struct path** object, which + * needs to be the kernel BTF *path* object. The path is + * returned in the provided buffer *buf* of size *sz* and + * is zero terminated. + * + * + * Returns + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + */ +static long (*bpf_d_path)(struct path *path, char *buf, __u32 sz) = (void *) 147; + +/* + * bpf_copy_from_user + * + * Read *size* bytes from user space address *user_ptr* and store + * the data in *dst*. This is a wrapper of **copy_from_user**\ (). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_copy_from_user)(void *dst, __u32 size, const void *user_ptr) = (void *) 148; + +/* + * bpf_snprintf_btf + * + * Use BTF to store a string representation of *ptr*->ptr in *str*, + * using *ptr*->type_id. This value should specify the type + * that *ptr*->ptr points to. LLVM __builtin_btf_type_id(type, 1) + * can be used to look up vmlinux BTF type ids. Traversing the + * data structure using BTF, the type information and values are + * stored in the first *str_size* - 1 bytes of *str*. Safe copy of + * the pointer data is carried out to avoid kernel crashes during + * operation. Smaller types can use string space on the stack; + * larger programs can use map data to store the string + * representation. + * + * The string can be subsequently shared with userspace via + * bpf_perf_event_output() or ring buffer interfaces. + * bpf_trace_printk() is to be avoided as it places too small + * a limit on string size to be useful. + * + * *flags* is a combination of + * + * **BTF_F_COMPACT** + * no formatting around type information + * **BTF_F_NONAME** + * no struct/union member names/types + * **BTF_F_PTR_RAW** + * show raw (unobfuscated) pointer values; + * equivalent to printk specifier %px. + * **BTF_F_ZERO** + * show zero-valued struct/union members; they + * are not displayed by default + * + * + * Returns + * The number of bytes that were written (or would have been + * written if output had to be truncated due to string size), + * or a negative error in cases of failure. + */ +static long (*bpf_snprintf_btf)(char *str, __u32 str_size, struct btf_ptr *ptr, __u32 btf_ptr_size, __u64 flags) = (void *) 149; + +/* + * bpf_seq_printf_btf + * + * Use BTF to write to seq_write a string representation of + * *ptr*->ptr, using *ptr*->type_id as per bpf_snprintf_btf(). + * *flags* are identical to those used for bpf_snprintf_btf. + * + * Returns + * 0 on success or a negative error in case of failure. + */ +static long (*bpf_seq_printf_btf)(struct seq_file *m, struct btf_ptr *ptr, __u32 ptr_size, __u64 flags) = (void *) 150; + +/* + * bpf_skb_cgroup_classid + * + * See **bpf_get_cgroup_classid**\ () for the main description. + * This helper differs from **bpf_get_cgroup_classid**\ () in that + * the cgroup v1 net_cls class is retrieved only from the *skb*'s + * associated socket instead of the current process. + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_skb_cgroup_classid)(struct __sk_buff *skb) = (void *) 151; + +/* + * bpf_redirect_neigh + * + * Redirect the packet to another net device of index *ifindex* + * and fill in L2 addresses from neighboring subsystem. This helper + * is somewhat similar to **bpf_redirect**\ (), except that it + * populates L2 addresses as well, meaning, internally, the helper + * relies on the neighbor lookup for the L2 address of the nexthop. + * + * The helper will perform a FIB lookup based on the skb's + * networking header to get the address of the next hop, unless + * this is supplied by the caller in the *params* argument. The + * *plen* argument indicates the len of *params* and should be set + * to 0 if *params* is NULL. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types, and enabled + * for IPv4 and IPv6 protocols. + * + * Returns + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + */ +static long (*bpf_redirect_neigh)(__u32 ifindex, struct bpf_redir_neigh *params, int plen, __u64 flags) = (void *) 152; + +/* + * bpf_per_cpu_ptr + * + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on *cpu*. A ksym is an + * extern variable decorated with '__ksym'. For ksym, there is a + * global var (either static or global) defined of the same name + * in the kernel. The ksym is percpu if the global var is percpu. + * The returned pointer points to the global percpu var on *cpu*. + * + * bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the + * kernel, except that bpf_per_cpu_ptr() may return NULL. This + * happens if *cpu* is larger than nr_cpu_ids. The caller of + * bpf_per_cpu_ptr() must check the returned value. + * + * Returns + * A pointer pointing to the kernel percpu variable on *cpu*, or + * NULL, if *cpu* is invalid. + */ +static void *(*bpf_per_cpu_ptr)(const void *percpu_ptr, __u32 cpu) = (void *) 153; + +/* + * bpf_this_cpu_ptr + * + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on this cpu. See the + * description of 'ksym' in **bpf_per_cpu_ptr**\ (). + * + * bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in + * the kernel. Different from **bpf_per_cpu_ptr**\ (), it would + * never return NULL. + * + * Returns + * A pointer pointing to the kernel percpu variable on this cpu. + */ +static void *(*bpf_this_cpu_ptr)(const void *percpu_ptr) = (void *) 154; + +/* + * bpf_redirect_peer + * + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_redirect**\ (), except + * that the redirection happens to the *ifindex*' peer device and + * the netns switch takes place from ingress to ingress without + * going through the CPU's backlog queue. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types at the ingress + * hook and for veth device types. The peer device must reside in a + * different network namespace. + * + * Returns + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + */ +static long (*bpf_redirect_peer)(__u32 ifindex, __u64 flags) = (void *) 155; + +/* + * bpf_task_storage_get + * + * Get a bpf_local_storage from the *task*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *task* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *task*) except this + * helper enforces the key must be a task_struct and the map must also + * be a **BPF_MAP_TYPE_TASK_STORAGE**. + * + * Underneath, the value is stored locally at *task* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *task*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * + * Returns + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + */ +static void *(*bpf_task_storage_get)(void *map, struct task_struct *task, void *value, __u64 flags) = (void *) 156; + +/* + * bpf_task_storage_delete + * + * Delete a bpf_local_storage from a *task*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +static long (*bpf_task_storage_delete)(void *map, struct task_struct *task) = (void *) 157; + +/* + * bpf_get_current_task_btf + * + * Return a BTF pointer to the "current" task. + * This pointer can also be used in helpers that accept an + * *ARG_PTR_TO_BTF_ID* of type *task_struct*. + * + * Returns + * Pointer to the current task. + */ +static struct task_struct *(*bpf_get_current_task_btf)(void) = (void *) 158; + +/* + * bpf_bprm_opts_set + * + * Set or clear certain options on *bprm*: + * + * **BPF_F_BPRM_SECUREEXEC** Set the secureexec bit + * which sets the **AT_SECURE** auxv for glibc. The bit + * is cleared if the flag is not specified. + * + * Returns + * **-EINVAL** if invalid *flags* are passed, zero otherwise. + */ +static long (*bpf_bprm_opts_set)(struct linux_binprm *bprm, __u64 flags) = (void *) 159; + +/* + * bpf_ktime_get_coarse_ns + * + * Return a coarse-grained version of the time elapsed since + * system boot, in nanoseconds. Does not include time the system + * was suspended. + * + * See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_coarse_ns)(void) = (void *) 160; + +/* + * bpf_ima_inode_hash + * + * Returns the stored IMA hash of the *inode* (if it's available). + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * + * Returns + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if + * invalid arguments are passed. + */ +static long (*bpf_ima_inode_hash)(struct inode *inode, void *dst, __u32 size) = (void *) 161; + +/* + * bpf_sock_from_file + * + * If the given file represents a socket, returns the associated + * socket. + * + * Returns + * A pointer to a struct socket on success or NULL if the file is + * not a socket. + */ +static struct socket *(*bpf_sock_from_file)(struct file *file) = (void *) 162; + +/* + * bpf_check_mtu + * + * Check packet size against exceeding MTU of net device (based + * on *ifindex*). This helper will likely be used in combination + * with helpers that adjust/change the packet size. + * + * The argument *len_diff* can be used for querying with a planned + * size change. This allows to check MTU prior to changing packet + * ctx. Providing a *len_diff* adjustment that is larger than the + * actual packet size (resulting in negative packet size) will in + * principle not exceed the MTU, which is why it is not considered + * a failure. Other BPF helpers are needed for performing the + * planned size change; therefore the responsibility for catching + * a negative packet size belongs in those helpers. + * + * Specifying *ifindex* zero means the MTU check is performed + * against the current net device. This is practical if this isn't + * used prior to redirect. + * + * On input *mtu_len* must be a valid pointer, else verifier will + * reject BPF program. If the value *mtu_len* is initialized to + * zero then the ctx packet size is use. When value *mtu_len* is + * provided as input this specify the L3 length that the MTU check + * is done against. Remember XDP and TC length operate at L2, but + * this value is L3 as this correlate to MTU and IP-header tot_len + * values which are L3 (similar behavior as bpf_fib_lookup). + * + * The Linux kernel route table can configure MTUs on a more + * specific per route level, which is not provided by this helper. + * For route level MTU checks use the **bpf_fib_lookup**\ () + * helper. + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** for tc cls_act programs. + * + * The *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_MTU_CHK_SEGS** + * This flag will only works for *ctx* **struct sk_buff**. + * If packet context contains extra packet segment buffers + * (often knows as GSO skb), then MTU check is harder to + * check at this point, because in transmit path it is + * possible for the skb packet to get re-segmented + * (depending on net device features). This could still be + * a MTU violation, so this flag enables performing MTU + * check against segments, with a different violation + * return code to tell it apart. Check cannot use len_diff. + * + * On return *mtu_len* pointer contains the MTU value of the net + * device. Remember the net device configured MTU is the L3 size, + * which is returned here and XDP and TC length operate at L2. + * Helper take this into account for you, but remember when using + * MTU value in your BPF-code. + * + * + * Returns + * * 0 on success, and populate MTU value in *mtu_len* pointer. + * + * * < 0 if any input argument is invalid (*mtu_len* not updated) + * + * MTU violations return positive values, but also populate MTU + * value in *mtu_len* pointer, as this can be needed for + * implementing PMTU handing: + * + * * **BPF_MTU_CHK_RET_FRAG_NEEDED** + * * **BPF_MTU_CHK_RET_SEGS_TOOBIG** + */ +static long (*bpf_check_mtu)(void *ctx, __u32 ifindex, __u32 *mtu_len, __s32 len_diff, __u64 flags) = (void *) 163; + +/* + * bpf_for_each_map_elem + * + * For each element in **map**, call **callback_fn** function with + * **map**, **callback_ctx** and other map-specific parameters. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. + * + * The following are a list of supported map types and their + * respective expected callback signatures: + * + * BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_PERCPU_HASH, + * BPF_MAP_TYPE_LRU_HASH, BPF_MAP_TYPE_LRU_PERCPU_HASH, + * BPF_MAP_TYPE_ARRAY, BPF_MAP_TYPE_PERCPU_ARRAY + * + * long (\*callback_fn)(struct bpf_map \*map, const void \*key, void \*value, void \*ctx); + * + * For per_cpu maps, the map_value is the value on the cpu where the + * bpf_prog is running. + * + * If **callback_fn** return 0, the helper will continue to the next + * element. If return value is 1, the helper will skip the rest of + * elements and return. Other return values are not used now. + * + * + * Returns + * The number of traversed map elements for success, **-EINVAL** for + * invalid **flags**. + */ +static long (*bpf_for_each_map_elem)(void *map, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 164; + +/* + * bpf_snprintf + * + * Outputs a string into the **str** buffer of size **str_size** + * based on a format string stored in a read-only map pointed by + * **fmt**. + * + * Each format specifier in **fmt** corresponds to one u64 element + * in the **data** array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* + * array. The *data_len* is the size of *data* in bytes - must be + * a multiple of 8. + * + * Formats **%s** and **%p{i,I}{4,6}** require to read kernel + * memory. Reading kernel memory may fail due to either invalid + * address or valid address but requiring a major memory fault. If + * reading kernel memory fails, the string for **%s** will be an + * empty string, and the ip address for **%p{i,I}{4,6}** will be 0. + * Not returning error to bpf program is consistent with what + * **bpf_trace_printk**\ () does for now. + * + * + * Returns + * The strictly positive length of the formatted string, including + * the trailing zero character. If the return value is greater than + * **str_size**, **str** contains a truncated string, guaranteed to + * be zero-terminated except when **str_size** is 0. + * + * Or **-EBUSY** if the per-CPU memory copy buffer is busy. + */ +static long (*bpf_snprintf)(char *str, __u32 str_size, const char *fmt, __u64 *data, __u32 data_len) = (void *) 165; + +/* + * bpf_sys_bpf + * + * Execute bpf syscall with given arguments. + * + * Returns + * A syscall result. + */ +static long (*bpf_sys_bpf)(__u32 cmd, void *attr, __u32 attr_size) = (void *) 166; + +/* + * bpf_btf_find_by_name_kind + * + * Find BTF type with given name and kind in vmlinux BTF or in module's BTFs. + * + * Returns + * Returns btf_id and btf_obj_fd in lower and upper 32 bits. + */ +static long (*bpf_btf_find_by_name_kind)(char *name, int name_sz, __u32 kind, int flags) = (void *) 167; + +/* + * bpf_sys_close + * + * Execute close syscall for given FD. + * + * Returns + * A syscall result. + */ +static long (*bpf_sys_close)(__u32 fd) = (void *) 168; + +/* + * bpf_timer_init + * + * Initialize the timer. + * First 4 bits of *flags* specify clockid. + * Only CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME are allowed. + * All other bits of *flags* are reserved. + * The verifier will reject the program if *timer* is not from + * the same *map*. + * + * Returns + * 0 on success. + * **-EBUSY** if *timer* is already initialized. + * **-EINVAL** if invalid *flags* are passed. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + */ +static long (*bpf_timer_init)(struct bpf_timer *timer, void *map, __u64 flags) = (void *) 169; + +/* + * bpf_timer_set_callback + * + * Configure the timer to call *callback_fn* static function. + * + * Returns + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + */ +static long (*bpf_timer_set_callback)(struct bpf_timer *timer, void *callback_fn) = (void *) 170; + +/* + * bpf_timer_start + * + * Set timer expiration N nanoseconds from the current time. The + * configured callback will be invoked in soft irq context on some cpu + * and will not repeat unless another bpf_timer_start() is made. + * In such case the next invocation can migrate to a different cpu. + * Since struct bpf_timer is a field inside map element the map + * owns the timer. The bpf_timer_set_callback() will increment refcnt + * of BPF program to make sure that callback_fn code stays valid. + * When user space reference to a map reaches zero all timers + * in a map are cancelled and corresponding program's refcnts are + * decremented. This is done to make sure that Ctrl-C of a user + * process doesn't leave any timers running. If map is pinned in + * bpffs the callback_fn can re-arm itself indefinitely. + * bpf_map_update/delete_elem() helpers and user space sys_bpf commands + * cancel and free the timer in the given map element. + * The map can contain timers that invoke callback_fn-s from different + * programs. The same callback_fn can serve different timers from + * different maps if key/value layout matches across maps. + * Every bpf_timer_set_callback() can have different callback_fn. + * + * + * Returns + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier + * or invalid *flags* are passed. + */ +static long (*bpf_timer_start)(struct bpf_timer *timer, __u64 nsecs, __u64 flags) = (void *) 171; + +/* + * bpf_timer_cancel + * + * Cancel the timer and wait for callback_fn to finish if it was running. + * + * Returns + * 0 if the timer was not active. + * 1 if the timer was active. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its + * own timer which would have led to a deadlock otherwise. + */ +static long (*bpf_timer_cancel)(struct bpf_timer *timer) = (void *) 172; + +/* + * bpf_get_func_ip + * + * Get address of the traced function (for tracing and kprobe programs). + * + * Returns + * Address of the traced function. + * 0 for kprobes placed within the function (not at the entry). + */ +static __u64 (*bpf_get_func_ip)(void *ctx) = (void *) 173; + +/* + * bpf_get_attach_cookie + * + * Get bpf_cookie value provided (optionally) during the program + * attachment. It might be different for each individual + * attachment, even if BPF program itself is the same. + * Expects BPF program context *ctx* as a first argument. + * + * Supported for the following program types: + * - kprobe/uprobe; + * - tracepoint; + * - perf_event. + * + * Returns + * Value specified by user at BPF link creation/attachment time + * or 0, if it was not specified. + */ +static __u64 (*bpf_get_attach_cookie)(void *ctx) = (void *) 174; + +/* + * bpf_task_pt_regs + * + * Get the struct pt_regs associated with **task**. + * + * Returns + * A pointer to struct pt_regs. + */ +static long (*bpf_task_pt_regs)(struct task_struct *task) = (void *) 175; + +/* + * bpf_get_branch_snapshot + * + * Get branch trace from hardware engines like Intel LBR. The + * hardware engine is stopped shortly after the helper is + * called. Therefore, the user need to filter branch entries + * based on the actual use case. To capture branch trace + * before the trigger point of the BPF program, the helper + * should be called at the beginning of the BPF program. + * + * The data is stored as struct perf_branch_entry into output + * buffer *entries*. *size* is the size of *entries* in bytes. + * *flags* is reserved for now and must be zero. + * + * + * Returns + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-ENOENT** if architecture does not support branch records. + */ +static long (*bpf_get_branch_snapshot)(void *entries, __u32 size, __u64 flags) = (void *) 176; + +/* + * bpf_trace_vprintk + * + * Behaves like **bpf_trace_printk**\ () helper, but takes an array of u64 + * to format and can handle more format args as a result. + * + * Arguments are to be used as in **bpf_seq_printf**\ () helper. + * + * Returns + * The number of bytes written to the buffer, or a negative error + * in case of failure. + */ +static long (*bpf_trace_vprintk)(const char *fmt, __u32 fmt_size, const void *data, __u32 data_len) = (void *) 177; + +/* + * bpf_skc_to_unix_sock + * + * Dynamically cast a *sk* pointer to a *unix_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct unix_sock *(*bpf_skc_to_unix_sock)(void *sk) = (void *) 178; + +/* + * bpf_kallsyms_lookup_name + * + * Get the address of a kernel symbol, returned in *res*. *res* is + * set to 0 if the symbol is not found. + * + * Returns + * On success, zero. On error, a negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-EINVAL** if string *name* is not the same size as *name_sz*. + * + * **-ENOENT** if symbol is not found. + * + * **-EPERM** if caller does not have permission to obtain kernel address. + */ +static long (*bpf_kallsyms_lookup_name)(const char *name, int name_sz, int flags, __u64 *res) = (void *) 179; + +/* + * bpf_find_vma + * + * Find vma of *task* that contains *addr*, call *callback_fn* + * function with *task*, *vma*, and *callback_ctx*. + * The *callback_fn* should be a static function and + * the *callback_ctx* should be a pointer to the stack. + * The *flags* is used to control certain aspects of the helper. + * Currently, the *flags* must be 0. + * + * The expected callback signature is + * + * long (\*callback_fn)(struct task_struct \*task, struct vm_area_struct \*vma, void \*callback_ctx); + * + * + * Returns + * 0 on success. + * **-ENOENT** if *task->mm* is NULL, or no vma contains *addr*. + * **-EBUSY** if failed to try lock mmap_lock. + * **-EINVAL** for invalid **flags**. + */ +static long (*bpf_find_vma)(struct task_struct *task, __u64 addr, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 180; + +/* + * bpf_loop + * + * For **nr_loops**, call **callback_fn** function + * with **callback_ctx** as the context parameter. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. Currently, nr_loops is + * limited to 1 << 23 (~8 million) loops. + * + * long (\*callback_fn)(u32 index, void \*ctx); + * + * where **index** is the current index in the loop. The index + * is zero-indexed. + * + * If **callback_fn** returns 0, the helper will continue to the next + * loop. If return value is 1, the helper will skip the rest of + * the loops and return. Other return values are not used now, + * and will be rejected by the verifier. + * + * + * Returns + * The number of loops performed, **-EINVAL** for invalid **flags**, + * **-E2BIG** if **nr_loops** exceeds the maximum number of loops. + */ +static long (*bpf_loop)(__u32 nr_loops, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 181; + +/* + * bpf_strncmp + * + * Do strncmp() between **s1** and **s2**. **s1** doesn't need + * to be null-terminated and **s1_sz** is the maximum storage + * size of **s1**. **s2** must be a read-only string. + * + * Returns + * An integer less than, equal to, or greater than zero + * if the first **s1_sz** bytes of **s1** is found to be + * less than, to match, or be greater than **s2**. + */ +static long (*bpf_strncmp)(const char *s1, __u32 s1_sz, const char *s2) = (void *) 182; + +/* + * bpf_get_func_arg + * + * Get **n**-th argument register (zero based) of the traced function (for tracing programs) + * returned in **value**. + * + * + * Returns + * 0 on success. + * **-EINVAL** if n >= argument register count of traced function. + */ +static long (*bpf_get_func_arg)(void *ctx, __u32 n, __u64 *value) = (void *) 183; + +/* + * bpf_get_func_ret + * + * Get return value of the traced function (for tracing programs) + * in **value**. + * + * + * Returns + * 0 on success. + * **-EOPNOTSUPP** for tracing programs other than BPF_TRACE_FEXIT or BPF_MODIFY_RETURN. + */ +static long (*bpf_get_func_ret)(void *ctx, __u64 *value) = (void *) 184; + +/* + * bpf_get_func_arg_cnt + * + * Get number of registers of the traced function (for tracing programs) where + * function arguments are stored in these registers. + * + * + * Returns + * The number of argument registers of the traced function. + */ +static long (*bpf_get_func_arg_cnt)(void *ctx) = (void *) 185; + +/* + * bpf_get_retval + * + * Get the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * + * Returns + * The BPF program's return value. + */ +static int (*bpf_get_retval)(void) = (void *) 186; + +/* + * bpf_set_retval + * + * Set the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * + * Note that there is the following corner case where the program exports an error + * via bpf_set_retval but signals success via 'return 1': + * + * bpf_set_retval(-EPERM); + * return 1; + * + * In this case, the BPF program's return value will use helper's -EPERM. This + * still holds true for cgroup/bind{4,6} which supports extra 'return 3' success case. + * + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static int (*bpf_set_retval)(int retval) = (void *) 187; + +/* + * bpf_xdp_get_buff_len + * + * Get the total size of a given xdp buff (linear and paged area) + * + * Returns + * The total size of a given xdp buffer. + */ +static __u64 (*bpf_xdp_get_buff_len)(struct xdp_md *xdp_md) = (void *) 188; + +/* + * bpf_xdp_load_bytes + * + * This helper is provided as an easy way to load data from a + * xdp buffer. It can be used to load *len* bytes from *offset* from + * the frame associated to *xdp_md*, into the buffer pointed by + * *buf*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_load_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = (void *) 189; + +/* + * bpf_xdp_store_bytes + * + * Store *len* bytes from buffer *buf* into the frame + * associated to *xdp_md*, at *offset*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_store_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = (void *) 190; + +/* + * bpf_copy_from_user_task + * + * Read *size* bytes from user space address *user_ptr* in *tsk*'s + * address space, and stores the data in *dst*. *flags* is not + * used yet and is provided for future extensibility. This helper + * can only be used by sleepable programs. + * + * Returns + * 0 on success, or a negative error in case of failure. On error + * *dst* buffer is zeroed out. + */ +static long (*bpf_copy_from_user_task)(void *dst, __u32 size, const void *user_ptr, struct task_struct *tsk, __u64 flags) = (void *) 191; + +/* + * bpf_skb_set_tstamp + * + * Change the __sk_buff->tstamp_type to *tstamp_type* + * and set *tstamp* to the __sk_buff->tstamp together. + * + * If there is no need to change the __sk_buff->tstamp_type, + * the tstamp value can be directly written to __sk_buff->tstamp + * instead. + * + * BPF_SKB_TSTAMP_DELIVERY_MONO is the only tstamp that + * will be kept during bpf_redirect_*(). A non zero + * *tstamp* must be used with the BPF_SKB_TSTAMP_DELIVERY_MONO + * *tstamp_type*. + * + * A BPF_SKB_TSTAMP_UNSPEC *tstamp_type* can only be used + * with a zero *tstamp*. + * + * Only IPv4 and IPv6 skb->protocol are supported. + * + * This function is most useful when it needs to set a + * mono delivery time to __sk_buff->tstamp and then + * bpf_redirect_*() to the egress of an iface. For example, + * changing the (rcv) timestamp in __sk_buff->tstamp at + * ingress to a mono delivery time and then bpf_redirect_*() + * to sch_fq@phy-dev. + * + * Returns + * 0 on success. + * **-EINVAL** for invalid input + * **-EOPNOTSUPP** for unsupported protocol + */ +static long (*bpf_skb_set_tstamp)(struct __sk_buff *skb, __u64 tstamp, __u32 tstamp_type) = (void *) 192; + +/* + * bpf_ima_file_hash + * + * Returns a calculated IMA hash of the *file*. + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * + * Returns + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if + * invalid arguments are passed. + */ +static long (*bpf_ima_file_hash)(struct file *file, void *dst, __u32 size) = (void *) 193; + +/* + * bpf_kptr_xchg + * + * Exchange kptr at pointer *map_value* with *ptr*, and return the + * old value. *ptr* can be NULL, otherwise it must be a referenced + * pointer which will be released when this helper is called. + * + * Returns + * The old value of kptr (which can be NULL). The returned pointer + * if not NULL, is a reference which must be released using its + * corresponding release function, or moved into a BPF map before + * program exit. + */ +static void *(*bpf_kptr_xchg)(void *map_value, void *ptr) = (void *) 194; + +/* + * bpf_map_lookup_percpu_elem + * + * Perform a lookup in *percpu map* for an entry associated to + * *key* on *cpu*. + * + * Returns + * Map value associated to *key* on *cpu*, or **NULL** if no entry + * was found or *cpu* is invalid. + */ +static void *(*bpf_map_lookup_percpu_elem)(void *map, const void *key, __u32 cpu) = (void *) 195; + +/* + * bpf_skc_to_mptcp_sock + * + * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct mptcp_sock *(*bpf_skc_to_mptcp_sock)(void *sk) = (void *) 196; + +/* + * bpf_dynptr_from_mem + * + * Get a dynptr to local memory *data*. + * + * *data* must be a ptr to a map value. + * The maximum *size* supported is DYNPTR_MAX_SIZE. + * *flags* is currently unused. + * + * Returns + * 0 on success, -E2BIG if the size exceeds DYNPTR_MAX_SIZE, + * -EINVAL if flags is not 0. + */ +static long (*bpf_dynptr_from_mem)(void *data, __u32 size, __u64 flags, struct bpf_dynptr *ptr) = (void *) 197; + +/* + * bpf_ringbuf_reserve_dynptr + * + * Reserve *size* bytes of payload in a ring buffer *ringbuf* + * through the dynptr interface. *flags* must be 0. + * + * Please note that a corresponding bpf_ringbuf_submit_dynptr or + * bpf_ringbuf_discard_dynptr must be called on *ptr*, even if the + * reservation fails. This is enforced by the verifier. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_ringbuf_reserve_dynptr)(void *ringbuf, __u32 size, __u64 flags, struct bpf_dynptr *ptr) = (void *) 198; + +/* + * bpf_ringbuf_submit_dynptr + * + * Submit reserved ring buffer sample, pointed to by *data*, + * through the dynptr interface. This is a no-op if the dynptr is + * invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_submit'. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_submit_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = (void *) 199; + +/* + * bpf_ringbuf_discard_dynptr + * + * Discard reserved ring buffer sample through the dynptr + * interface. This is a no-op if the dynptr is invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_discard'. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_discard_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = (void *) 200; + +/* + * bpf_dynptr_read + * + * Read *len* bytes from *src* into *dst*, starting from *offset* + * into *src*. + * *flags* is currently unused. + * + * Returns + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *src*'s data, -EINVAL if *src* is an invalid dynptr or if + * *flags* is not 0. + */ +static long (*bpf_dynptr_read)(void *dst, __u32 len, const struct bpf_dynptr *src, __u32 offset, __u64 flags) = (void *) 201; + +/* + * bpf_dynptr_write + * + * Write *len* bytes from *src* into *dst*, starting from *offset* + * into *dst*. + * *flags* is currently unused. + * + * Returns + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *dst*'s data, -EINVAL if *dst* is an invalid dynptr or if *dst* + * is a read-only dynptr or if *flags* is not 0. + */ +static long (*bpf_dynptr_write)(const struct bpf_dynptr *dst, __u32 offset, void *src, __u32 len, __u64 flags) = (void *) 202; + +/* + * bpf_dynptr_data + * + * Get a pointer to the underlying dynptr data. + * + * *len* must be a statically known value. The returned data slice + * is invalidated whenever the dynptr is invalidated. + * + * Returns + * Pointer to the underlying dynptr data, NULL if the dynptr is + * read-only, if the dynptr is invalid, or if the offset and length + * is out of bounds. + */ +static void *(*bpf_dynptr_data)(const struct bpf_dynptr *ptr, __u32 offset, __u32 len) = (void *) 203; + +/* + * bpf_tcp_raw_gen_syncookie_ipv4 + * + * Try to issue a SYN cookie for the packet with corresponding + * IPv4/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + */ +static __s64 (*bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th, __u32 th_len) = (void *) 204; + +/* + * bpf_tcp_raw_gen_syncookie_ipv6 + * + * Try to issue a SYN cookie for the packet with corresponding + * IPv6/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + */ +static __s64 (*bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th, __u32 th_len) = (void *) 205; + +/* + * bpf_tcp_raw_check_syncookie_ipv4 + * + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the TCP header. + * + * Returns + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + */ +static long (*bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th) = (void *) 206; + +/* + * bpf_tcp_raw_check_syncookie_ipv6 + * + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the TCP header. + * + * Returns + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + */ +static long (*bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th) = (void *) 207; + +/* + * bpf_ktime_get_tai_ns + * + * A nonsettable system-wide clock derived from wall-clock time but + * ignoring leap seconds. This clock does not experience + * discontinuities and backwards jumps caused by NTP inserting leap + * seconds as CLOCK_REALTIME does. + * + * See: **clock_gettime**\ (**CLOCK_TAI**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_tai_ns)(void) = (void *) 208; + +/* + * bpf_user_ringbuf_drain + * + * Drain samples from the specified user ring buffer, and invoke + * the provided callback for each such sample: + * + * long (\*callback_fn)(const struct bpf_dynptr \*dynptr, void \*ctx); + * + * If **callback_fn** returns 0, the helper will continue to try + * and drain the next sample, up to a maximum of + * BPF_MAX_USER_RINGBUF_SAMPLES samples. If the return value is 1, + * the helper will skip the rest of the samples and return. Other + * return values are not used now, and will be rejected by the + * verifier. + * + * Returns + * The number of drained samples if no error was encountered while + * draining samples, or 0 if no samples were present in the ring + * buffer. If a user-space producer was epoll-waiting on this map, + * and at least one sample was drained, they will receive an event + * notification notifying them of available space in the ring + * buffer. If the BPF_RB_NO_WAKEUP flag is passed to this + * function, no wakeup notification will be sent. If the + * BPF_RB_FORCE_WAKEUP flag is passed, a wakeup notification will + * be sent even if no sample was drained. + * + * On failure, the returned value is one of the following: + * + * **-EBUSY** if the ring buffer is contended, and another calling + * context was concurrently draining the ring buffer. + * + * **-EINVAL** if user-space is not properly tracking the ring + * buffer due to the producer position not being aligned to 8 + * bytes, a sample not being aligned to 8 bytes, or the producer + * position not matching the advertised length of a sample. + * + * **-E2BIG** if user-space has tried to publish a sample which is + * larger than the size of the ring buffer, or which cannot fit + * within a struct bpf_dynptr. + */ +static long (*bpf_user_ringbuf_drain)(void *map, void *callback_fn, void *ctx, __u64 flags) = (void *) 209; + +/* + * bpf_cgrp_storage_get + * + * Get a bpf_local_storage from the *cgroup*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *cgroup* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *cgroup*) except this + * helper enforces the key must be a cgroup struct and the map must also + * be a **BPF_MAP_TYPE_CGRP_STORAGE**. + * + * In reality, the local-storage value is embedded directly inside of the + * *cgroup* object itself, rather than being located in the + * **BPF_MAP_TYPE_CGRP_STORAGE** map. When the local-storage value is + * queried for some *map* on a *cgroup* object, the kernel will perform an + * O(n) iteration over all of the live local-storage values for that + * *cgroup* object until the local-storage value for the *map* is found. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * + * Returns + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + */ +static void *(*bpf_cgrp_storage_get)(void *map, struct cgroup *cgroup, void *value, __u64 flags) = (void *) 210; + +/* + * bpf_cgrp_storage_delete + * + * Delete a bpf_local_storage from a *cgroup*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +static long (*bpf_cgrp_storage_delete)(void *map, struct cgroup *cgroup) = (void *) 211; + + diff --git a/bpftool/libbpf/src/bpf_helpers.h b/bpftool/libbpf/src/bpf_helpers.h new file mode 100644 index 0000000..5ec1871 --- /dev/null +++ b/bpftool/libbpf/src/bpf_helpers.h @@ -0,0 +1,289 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_HELPERS__ +#define __BPF_HELPERS__ + +/* + * Note that bpf programs need to include either + * vmlinux.h (auto-generated from BTF) or linux/types.h + * in advance since bpf_helper_defs.h uses such types + * as __u64. + */ +#include "bpf_helper_defs.h" + +#define __uint(name, val) int (*name)[val] +#define __type(name, val) typeof(val) *name +#define __array(name, val) typeof(val) *name[] + +/* + * Helper macro to place programs, maps, license in + * different sections in elf_bpf file. Section names + * are interpreted by libbpf depending on the context (BPF programs, BPF maps, + * extern variables, etc). + * To allow use of SEC() with externs (e.g., for extern .maps declarations), + * make sure __attribute__((unused)) doesn't trigger compilation warning. + */ +#if __GNUC__ && !__clang__ + +/* + * Pragma macros are broken on GCC + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55578 + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90400 + */ +#define SEC(name) __attribute__((section(name), used)) + +#else + +#define SEC(name) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wignored-attributes\"") \ + __attribute__((section(name), used)) \ + _Pragma("GCC diagnostic pop") \ + +#endif + +/* Avoid 'linux/stddef.h' definition of '__always_inline'. */ +#undef __always_inline +#define __always_inline inline __attribute__((always_inline)) + +#ifndef __noinline +#define __noinline __attribute__((noinline)) +#endif +#ifndef __weak +#define __weak __attribute__((weak)) +#endif + +/* + * Use __hidden attribute to mark a non-static BPF subprogram effectively + * static for BPF verifier's verification algorithm purposes, allowing more + * extensive and permissive BPF verification process, taking into account + * subprogram's caller context. + */ +#define __hidden __attribute__((visibility("hidden"))) + +/* When utilizing vmlinux.h with BPF CO-RE, user BPF programs can't include + * any system-level headers (such as stddef.h, linux/version.h, etc), and + * commonly-used macros like NULL and KERNEL_VERSION aren't available through + * vmlinux.h. This just adds unnecessary hurdles and forces users to re-define + * them on their own. So as a convenience, provide such definitions here. + */ +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef KERNEL_VERSION +#define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c))) +#endif + +/* + * Helper macros to manipulate data structures + */ +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((unsigned long)&((TYPE *)0)->MEMBER) +#endif +#ifndef container_of +#define container_of(ptr, type, member) \ + ({ \ + void *__mptr = (void *)(ptr); \ + ((type *)(__mptr - offsetof(type, member))); \ + }) +#endif + +/* + * Compiler (optimization) barrier. + */ +#ifndef barrier +#define barrier() asm volatile("" ::: "memory") +#endif + +/* Variable-specific compiler (optimization) barrier. It's a no-op which makes + * compiler believe that there is some black box modification of a given + * variable and thus prevents compiler from making extra assumption about its + * value and potential simplifications and optimizations on this variable. + * + * E.g., compiler might often delay or even omit 32-bit to 64-bit casting of + * a variable, making some code patterns unverifiable. Putting barrier_var() + * in place will ensure that cast is performed before the barrier_var() + * invocation, because compiler has to pessimistically assume that embedded + * asm section might perform some extra operations on that variable. + * + * This is a variable-specific variant of more global barrier(). + */ +#ifndef barrier_var +#define barrier_var(var) asm volatile("" : "+r"(var)) +#endif + +/* + * Helper macro to throw a compilation error if __bpf_unreachable() gets + * built into the resulting code. This works given BPF back end does not + * implement __builtin_trap(). This is useful to assert that certain paths + * of the program code are never used and hence eliminated by the compiler. + * + * For example, consider a switch statement that covers known cases used by + * the program. __bpf_unreachable() can then reside in the default case. If + * the program gets extended such that a case is not covered in the switch + * statement, then it will throw a build error due to the default case not + * being compiled out. + */ +#ifndef __bpf_unreachable +# define __bpf_unreachable() __builtin_trap() +#endif + +/* + * Helper function to perform a tail call with a constant/immediate map slot. + */ +#if __clang_major__ >= 8 && defined(__bpf__) +static __always_inline void +bpf_tail_call_static(void *ctx, const void *map, const __u32 slot) +{ + if (!__builtin_constant_p(slot)) + __bpf_unreachable(); + + /* + * Provide a hard guarantee that LLVM won't optimize setting r2 (map + * pointer) and r3 (constant map index) from _different paths_ ending + * up at the _same_ call insn as otherwise we won't be able to use the + * jmpq/nopl retpoline-free patching by the x86-64 JIT in the kernel + * given they mismatch. See also d2e4c1e6c294 ("bpf: Constant map key + * tracking for prog array pokes") for details on verifier tracking. + * + * Note on clobber list: we need to stay in-line with BPF calling + * convention, so even if we don't end up using r0, r4, r5, we need + * to mark them as clobber so that LLVM doesn't end up using them + * before / after the call. + */ + asm volatile("r1 = %[ctx]\n\t" + "r2 = %[map]\n\t" + "r3 = %[slot]\n\t" + "call 12" + :: [ctx]"r"(ctx), [map]"r"(map), [slot]"i"(slot) + : "r0", "r1", "r2", "r3", "r4", "r5"); +} +#endif + +enum libbpf_pin_type { + LIBBPF_PIN_NONE, + /* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */ + LIBBPF_PIN_BY_NAME, +}; + +enum libbpf_tristate { + TRI_NO = 0, + TRI_YES = 1, + TRI_MODULE = 2, +}; + +#define __kconfig __attribute__((section(".kconfig"))) +#define __ksym __attribute__((section(".ksyms"))) +#define __kptr __attribute__((btf_type_tag("kptr"))) +#define __kptr_ref __attribute__((btf_type_tag("kptr_ref"))) + +#ifndef ___bpf_concat +#define ___bpf_concat(a, b) a ## b +#endif +#ifndef ___bpf_apply +#define ___bpf_apply(fn, n) ___bpf_concat(fn, n) +#endif +#ifndef ___bpf_nth +#define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N +#endif +#ifndef ___bpf_narg +#define ___bpf_narg(...) \ + ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#endif + +#define ___bpf_fill0(arr, p, x) do {} while (0) +#define ___bpf_fill1(arr, p, x) arr[p] = x +#define ___bpf_fill2(arr, p, x, args...) arr[p] = x; ___bpf_fill1(arr, p + 1, args) +#define ___bpf_fill3(arr, p, x, args...) arr[p] = x; ___bpf_fill2(arr, p + 1, args) +#define ___bpf_fill4(arr, p, x, args...) arr[p] = x; ___bpf_fill3(arr, p + 1, args) +#define ___bpf_fill5(arr, p, x, args...) arr[p] = x; ___bpf_fill4(arr, p + 1, args) +#define ___bpf_fill6(arr, p, x, args...) arr[p] = x; ___bpf_fill5(arr, p + 1, args) +#define ___bpf_fill7(arr, p, x, args...) arr[p] = x; ___bpf_fill6(arr, p + 1, args) +#define ___bpf_fill8(arr, p, x, args...) arr[p] = x; ___bpf_fill7(arr, p + 1, args) +#define ___bpf_fill9(arr, p, x, args...) arr[p] = x; ___bpf_fill8(arr, p + 1, args) +#define ___bpf_fill10(arr, p, x, args...) arr[p] = x; ___bpf_fill9(arr, p + 1, args) +#define ___bpf_fill11(arr, p, x, args...) arr[p] = x; ___bpf_fill10(arr, p + 1, args) +#define ___bpf_fill12(arr, p, x, args...) arr[p] = x; ___bpf_fill11(arr, p + 1, args) +#define ___bpf_fill(arr, args...) \ + ___bpf_apply(___bpf_fill, ___bpf_narg(args))(arr, 0, args) + +/* + * BPF_SEQ_PRINTF to wrap bpf_seq_printf to-be-printed values + * in a structure. + */ +#define BPF_SEQ_PRINTF(seq, fmt, args...) \ +({ \ + static const char ___fmt[] = fmt; \ + unsigned long long ___param[___bpf_narg(args)]; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + \ + bpf_seq_printf(seq, ___fmt, sizeof(___fmt), \ + ___param, sizeof(___param)); \ +}) + +/* + * BPF_SNPRINTF wraps the bpf_snprintf helper with variadic arguments instead of + * an array of u64. + */ +#define BPF_SNPRINTF(out, out_size, fmt, args...) \ +({ \ + static const char ___fmt[] = fmt; \ + unsigned long long ___param[___bpf_narg(args)]; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + \ + bpf_snprintf(out, out_size, ___fmt, \ + ___param, sizeof(___param)); \ +}) + +#ifdef BPF_NO_GLOBAL_DATA +#define BPF_PRINTK_FMT_MOD +#else +#define BPF_PRINTK_FMT_MOD static const +#endif + +#define __bpf_printk(fmt, ...) \ +({ \ + BPF_PRINTK_FMT_MOD char ____fmt[] = fmt; \ + bpf_trace_printk(____fmt, sizeof(____fmt), \ + ##__VA_ARGS__); \ +}) + +/* + * __bpf_vprintk wraps the bpf_trace_vprintk helper with variadic arguments + * instead of an array of u64. + */ +#define __bpf_vprintk(fmt, args...) \ +({ \ + static const char ___fmt[] = fmt; \ + unsigned long long ___param[___bpf_narg(args)]; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + \ + bpf_trace_vprintk(___fmt, sizeof(___fmt), \ + ___param, sizeof(___param)); \ +}) + +/* Use __bpf_printk when bpf_printk call has 3 or fewer fmt args + * Otherwise use __bpf_vprintk + */ +#define ___bpf_pick_printk(...) \ + ___bpf_nth(_, ##__VA_ARGS__, __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, \ + __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, \ + __bpf_vprintk, __bpf_vprintk, __bpf_printk /*3*/, __bpf_printk /*2*/,\ + __bpf_printk /*1*/, __bpf_printk /*0*/) + +/* Helper macro to print out debug messages */ +#define bpf_printk(fmt, args...) ___bpf_pick_printk(args)(fmt, ##args) + +#endif diff --git a/bpftool/libbpf/src/bpf_prog_linfo.c b/bpftool/libbpf/src/bpf_prog_linfo.c new file mode 100644 index 0000000..5c50309 --- /dev/null +++ b/bpftool/libbpf/src/bpf_prog_linfo.c @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2018 Facebook */ + +#include +#include +#include +#include +#include "libbpf.h" +#include "libbpf_internal.h" + +struct bpf_prog_linfo { + void *raw_linfo; + void *raw_jited_linfo; + __u32 *nr_jited_linfo_per_func; + __u32 *jited_linfo_func_idx; + __u32 nr_linfo; + __u32 nr_jited_func; + __u32 rec_size; + __u32 jited_rec_size; +}; + +static int dissect_jited_func(struct bpf_prog_linfo *prog_linfo, + const __u64 *ksym_func, const __u32 *ksym_len) +{ + __u32 nr_jited_func, nr_linfo; + const void *raw_jited_linfo; + const __u64 *jited_linfo; + __u64 last_jited_linfo; + /* + * Index to raw_jited_linfo: + * i: Index for searching the next ksym_func + * prev_i: Index to the last found ksym_func + */ + __u32 i, prev_i; + __u32 f; /* Index to ksym_func */ + + raw_jited_linfo = prog_linfo->raw_jited_linfo; + jited_linfo = raw_jited_linfo; + if (ksym_func[0] != *jited_linfo) + goto errout; + + prog_linfo->jited_linfo_func_idx[0] = 0; + nr_jited_func = prog_linfo->nr_jited_func; + nr_linfo = prog_linfo->nr_linfo; + + for (prev_i = 0, i = 1, f = 1; + i < nr_linfo && f < nr_jited_func; + i++) { + raw_jited_linfo += prog_linfo->jited_rec_size; + last_jited_linfo = *jited_linfo; + jited_linfo = raw_jited_linfo; + + if (ksym_func[f] == *jited_linfo) { + prog_linfo->jited_linfo_func_idx[f] = i; + + /* Sanity check */ + if (last_jited_linfo - ksym_func[f - 1] + 1 > + ksym_len[f - 1]) + goto errout; + + prog_linfo->nr_jited_linfo_per_func[f - 1] = + i - prev_i; + prev_i = i; + + /* + * The ksym_func[f] is found in jited_linfo. + * Look for the next one. + */ + f++; + } else if (*jited_linfo <= last_jited_linfo) { + /* Ensure the addr is increasing _within_ a func */ + goto errout; + } + } + + if (f != nr_jited_func) + goto errout; + + prog_linfo->nr_jited_linfo_per_func[nr_jited_func - 1] = + nr_linfo - prev_i; + + return 0; + +errout: + return -EINVAL; +} + +void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo) +{ + if (!prog_linfo) + return; + + free(prog_linfo->raw_linfo); + free(prog_linfo->raw_jited_linfo); + free(prog_linfo->nr_jited_linfo_per_func); + free(prog_linfo->jited_linfo_func_idx); + free(prog_linfo); +} + +struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info) +{ + struct bpf_prog_linfo *prog_linfo; + __u32 nr_linfo, nr_jited_func; + __u64 data_sz; + + nr_linfo = info->nr_line_info; + + if (!nr_linfo) + return errno = EINVAL, NULL; + + /* + * The min size that bpf_prog_linfo has to access for + * searching purpose. + */ + if (info->line_info_rec_size < + offsetof(struct bpf_line_info, file_name_off)) + return errno = EINVAL, NULL; + + prog_linfo = calloc(1, sizeof(*prog_linfo)); + if (!prog_linfo) + return errno = ENOMEM, NULL; + + /* Copy xlated line_info */ + prog_linfo->nr_linfo = nr_linfo; + prog_linfo->rec_size = info->line_info_rec_size; + data_sz = (__u64)nr_linfo * prog_linfo->rec_size; + prog_linfo->raw_linfo = malloc(data_sz); + if (!prog_linfo->raw_linfo) + goto err_free; + memcpy(prog_linfo->raw_linfo, (void *)(long)info->line_info, data_sz); + + nr_jited_func = info->nr_jited_ksyms; + if (!nr_jited_func || + !info->jited_line_info || + info->nr_jited_line_info != nr_linfo || + info->jited_line_info_rec_size < sizeof(__u64) || + info->nr_jited_func_lens != nr_jited_func || + !info->jited_ksyms || + !info->jited_func_lens) + /* Not enough info to provide jited_line_info */ + return prog_linfo; + + /* Copy jited_line_info */ + prog_linfo->nr_jited_func = nr_jited_func; + prog_linfo->jited_rec_size = info->jited_line_info_rec_size; + data_sz = (__u64)nr_linfo * prog_linfo->jited_rec_size; + prog_linfo->raw_jited_linfo = malloc(data_sz); + if (!prog_linfo->raw_jited_linfo) + goto err_free; + memcpy(prog_linfo->raw_jited_linfo, + (void *)(long)info->jited_line_info, data_sz); + + /* Number of jited_line_info per jited func */ + prog_linfo->nr_jited_linfo_per_func = malloc(nr_jited_func * + sizeof(__u32)); + if (!prog_linfo->nr_jited_linfo_per_func) + goto err_free; + + /* + * For each jited func, + * the start idx to the "linfo" and "jited_linfo" array, + */ + prog_linfo->jited_linfo_func_idx = malloc(nr_jited_func * + sizeof(__u32)); + if (!prog_linfo->jited_linfo_func_idx) + goto err_free; + + if (dissect_jited_func(prog_linfo, + (__u64 *)(long)info->jited_ksyms, + (__u32 *)(long)info->jited_func_lens)) + goto err_free; + + return prog_linfo; + +err_free: + bpf_prog_linfo__free(prog_linfo); + return errno = EINVAL, NULL; +} + +const struct bpf_line_info * +bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo, + __u64 addr, __u32 func_idx, __u32 nr_skip) +{ + __u32 jited_rec_size, rec_size, nr_linfo, start, i; + const void *raw_jited_linfo, *raw_linfo; + const __u64 *jited_linfo; + + if (func_idx >= prog_linfo->nr_jited_func) + return errno = ENOENT, NULL; + + nr_linfo = prog_linfo->nr_jited_linfo_per_func[func_idx]; + if (nr_skip >= nr_linfo) + return errno = ENOENT, NULL; + + start = prog_linfo->jited_linfo_func_idx[func_idx] + nr_skip; + jited_rec_size = prog_linfo->jited_rec_size; + raw_jited_linfo = prog_linfo->raw_jited_linfo + + (start * jited_rec_size); + jited_linfo = raw_jited_linfo; + if (addr < *jited_linfo) + return errno = ENOENT, NULL; + + nr_linfo -= nr_skip; + rec_size = prog_linfo->rec_size; + raw_linfo = prog_linfo->raw_linfo + (start * rec_size); + for (i = 0; i < nr_linfo; i++) { + if (addr < *jited_linfo) + break; + + raw_linfo += rec_size; + raw_jited_linfo += jited_rec_size; + jited_linfo = raw_jited_linfo; + } + + return raw_linfo - rec_size; +} + +const struct bpf_line_info * +bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo, + __u32 insn_off, __u32 nr_skip) +{ + const struct bpf_line_info *linfo; + __u32 rec_size, nr_linfo, i; + const void *raw_linfo; + + nr_linfo = prog_linfo->nr_linfo; + if (nr_skip >= nr_linfo) + return errno = ENOENT, NULL; + + rec_size = prog_linfo->rec_size; + raw_linfo = prog_linfo->raw_linfo + (nr_skip * rec_size); + linfo = raw_linfo; + if (insn_off < linfo->insn_off) + return errno = ENOENT, NULL; + + nr_linfo -= nr_skip; + for (i = 0; i < nr_linfo; i++) { + if (insn_off < linfo->insn_off) + break; + + raw_linfo += rec_size; + linfo = raw_linfo; + } + + return raw_linfo - rec_size; +} diff --git a/bpftool/libbpf/src/bpf_tracing.h b/bpftool/libbpf/src/bpf_tracing.h new file mode 100644 index 0000000..6db88f4 --- /dev/null +++ b/bpftool/libbpf/src/bpf_tracing.h @@ -0,0 +1,920 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_TRACING_H__ +#define __BPF_TRACING_H__ + +#include + +/* Scan the ARCH passed in from ARCH env variable (see Makefile) */ +#if defined(__TARGET_ARCH_x86) + #define bpf_target_x86 + #define bpf_target_defined +#elif defined(__TARGET_ARCH_s390) + #define bpf_target_s390 + #define bpf_target_defined +#elif defined(__TARGET_ARCH_arm) + #define bpf_target_arm + #define bpf_target_defined +#elif defined(__TARGET_ARCH_arm64) + #define bpf_target_arm64 + #define bpf_target_defined +#elif defined(__TARGET_ARCH_mips) + #define bpf_target_mips + #define bpf_target_defined +#elif defined(__TARGET_ARCH_powerpc) + #define bpf_target_powerpc + #define bpf_target_defined +#elif defined(__TARGET_ARCH_sparc) + #define bpf_target_sparc + #define bpf_target_defined +#elif defined(__TARGET_ARCH_riscv) + #define bpf_target_riscv + #define bpf_target_defined +#elif defined(__TARGET_ARCH_arc) + #define bpf_target_arc + #define bpf_target_defined +#elif defined(__TARGET_ARCH_loongarch) + #define bpf_target_loongarch + #define bpf_target_defined +#else + +/* Fall back to what the compiler says */ +#if defined(__x86_64__) + #define bpf_target_x86 + #define bpf_target_defined +#elif defined(__s390__) + #define bpf_target_s390 + #define bpf_target_defined +#elif defined(__arm__) + #define bpf_target_arm + #define bpf_target_defined +#elif defined(__aarch64__) + #define bpf_target_arm64 + #define bpf_target_defined +#elif defined(__mips__) + #define bpf_target_mips + #define bpf_target_defined +#elif defined(__powerpc__) + #define bpf_target_powerpc + #define bpf_target_defined +#elif defined(__sparc__) + #define bpf_target_sparc + #define bpf_target_defined +#elif defined(__riscv) && __riscv_xlen == 64 + #define bpf_target_riscv + #define bpf_target_defined +#elif defined(__arc__) + #define bpf_target_arc + #define bpf_target_defined +#elif defined(__loongarch__) + #define bpf_target_loongarch + #define bpf_target_defined +#endif /* no compiler target */ + +#endif + +#ifndef __BPF_TARGET_MISSING +#define __BPF_TARGET_MISSING "GCC error \"Must specify a BPF target arch via __TARGET_ARCH_xxx\"" +#endif + +#if defined(bpf_target_x86) + +/* + * https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI + */ + +#if defined(__KERNEL__) || defined(__VMLINUX_H__) + +#define __PT_PARM1_REG di +#define __PT_PARM2_REG si +#define __PT_PARM3_REG dx +#define __PT_PARM4_REG cx +#define __PT_PARM5_REG r8 +#define __PT_PARM6_REG r9 +/* + * Syscall uses r10 for PARM4. See arch/x86/entry/entry_64.S:entry_SYSCALL_64 + * comments in Linux sources. And refer to syscall(2) manpage. + */ +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG r10 +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG sp +#define __PT_FP_REG bp +#define __PT_RC_REG ax +#define __PT_SP_REG sp +#define __PT_IP_REG ip + +#else + +#ifdef __i386__ + +/* i386 kernel is built with -mregparm=3 */ +#define __PT_PARM1_REG eax +#define __PT_PARM2_REG edx +#define __PT_PARM3_REG ecx +/* i386 syscall ABI is very different, refer to syscall(2) manpage */ +#define __PT_PARM1_SYSCALL_REG ebx +#define __PT_PARM2_SYSCALL_REG ecx +#define __PT_PARM3_SYSCALL_REG edx +#define __PT_PARM4_SYSCALL_REG esi +#define __PT_PARM5_SYSCALL_REG edi +#define __PT_PARM6_SYSCALL_REG ebp + +#define __PT_RET_REG esp +#define __PT_FP_REG ebp +#define __PT_RC_REG eax +#define __PT_SP_REG esp +#define __PT_IP_REG eip + +#else /* __i386__ */ + +#define __PT_PARM1_REG rdi +#define __PT_PARM2_REG rsi +#define __PT_PARM3_REG rdx +#define __PT_PARM4_REG rcx +#define __PT_PARM5_REG r8 +#define __PT_PARM6_REG r9 + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG r10 +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG rsp +#define __PT_FP_REG rbp +#define __PT_RC_REG rax +#define __PT_SP_REG rsp +#define __PT_IP_REG rip + +#endif /* __i386__ */ + +#endif /* __KERNEL__ || __VMLINUX_H__ */ + +#elif defined(bpf_target_s390) + +/* + * https://github.com/IBM/s390x-abi/releases/download/v1.6/lzsabi_s390x.pdf + */ + +struct pt_regs___s390 { + unsigned long orig_gpr2; +}; + +/* s390 provides user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x)) +#define __PT_PARM1_REG gprs[2] +#define __PT_PARM2_REG gprs[3] +#define __PT_PARM3_REG gprs[4] +#define __PT_PARM4_REG gprs[5] +#define __PT_PARM5_REG gprs[6] + +#define __PT_PARM1_SYSCALL_REG orig_gpr2 +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG gprs[7] +#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x) +#define PT_REGS_PARM1_CORE_SYSCALL(x) \ + BPF_CORE_READ((const struct pt_regs___s390 *)(x), __PT_PARM1_SYSCALL_REG) + +#define __PT_RET_REG gprs[14] +#define __PT_FP_REG gprs[11] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG gprs[2] +#define __PT_SP_REG gprs[15] +#define __PT_IP_REG psw.addr + +#elif defined(bpf_target_arm) + +/* + * https://github.com/ARM-software/abi-aa/blob/main/aapcs32/aapcs32.rst#machine-registers + */ + +#define __PT_PARM1_REG uregs[0] +#define __PT_PARM2_REG uregs[1] +#define __PT_PARM3_REG uregs[2] +#define __PT_PARM4_REG uregs[3] + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM6_SYSCALL_REG uregs[5] +#define __PT_PARM7_SYSCALL_REG uregs[6] + +#define __PT_RET_REG uregs[14] +#define __PT_FP_REG uregs[11] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG uregs[0] +#define __PT_SP_REG uregs[13] +#define __PT_IP_REG uregs[12] + +#elif defined(bpf_target_arm64) + +/* + * https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#machine-registers + */ + +struct pt_regs___arm64 { + unsigned long orig_x0; +}; + +/* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x)) +#define __PT_PARM1_REG regs[0] +#define __PT_PARM2_REG regs[1] +#define __PT_PARM3_REG regs[2] +#define __PT_PARM4_REG regs[3] +#define __PT_PARM5_REG regs[4] +#define __PT_PARM6_REG regs[5] +#define __PT_PARM7_REG regs[6] +#define __PT_PARM8_REG regs[7] + +#define __PT_PARM1_SYSCALL_REG orig_x0 +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG +#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x) +#define PT_REGS_PARM1_CORE_SYSCALL(x) \ + BPF_CORE_READ((const struct pt_regs___arm64 *)(x), __PT_PARM1_SYSCALL_REG) + +#define __PT_RET_REG regs[30] +#define __PT_FP_REG regs[29] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG regs[0] +#define __PT_SP_REG sp +#define __PT_IP_REG pc + +#elif defined(bpf_target_mips) + +/* + * N64 ABI is assumed right now. + * https://en.wikipedia.org/wiki/MIPS_architecture#Calling_conventions + */ + +#define __PT_PARM1_REG regs[4] +#define __PT_PARM2_REG regs[5] +#define __PT_PARM3_REG regs[6] +#define __PT_PARM4_REG regs[7] +#define __PT_PARM5_REG regs[8] +#define __PT_PARM6_REG regs[9] +#define __PT_PARM7_REG regs[10] +#define __PT_PARM8_REG regs[11] + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG /* only N32/N64 */ +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG /* only N32/N64 */ + +#define __PT_RET_REG regs[31] +#define __PT_FP_REG regs[30] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG regs[2] +#define __PT_SP_REG regs[29] +#define __PT_IP_REG cp0_epc + +#elif defined(bpf_target_powerpc) + +/* + * http://refspecs.linux-foundation.org/elf/elfspec_ppc.pdf (page 3-14, + * section "Function Calling Sequence") + */ + +#define __PT_PARM1_REG gpr[3] +#define __PT_PARM2_REG gpr[4] +#define __PT_PARM3_REG gpr[5] +#define __PT_PARM4_REG gpr[6] +#define __PT_PARM5_REG gpr[7] +#define __PT_PARM6_REG gpr[8] +#define __PT_PARM7_REG gpr[9] +#define __PT_PARM8_REG gpr[10] + +/* powerpc does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG orig_gpr3 +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG +#if !defined(__arch64__) +#define __PT_PARM7_SYSCALL_REG __PT_PARM7_REG /* only powerpc (not powerpc64) */ +#endif + +#define __PT_RET_REG regs[31] +#define __PT_FP_REG __unsupported__ +#define __PT_RC_REG gpr[3] +#define __PT_SP_REG sp +#define __PT_IP_REG nip + +#elif defined(bpf_target_sparc) + +/* + * https://en.wikipedia.org/wiki/Calling_convention#SPARC + */ + +#define __PT_PARM1_REG u_regs[UREG_I0] +#define __PT_PARM2_REG u_regs[UREG_I1] +#define __PT_PARM3_REG u_regs[UREG_I2] +#define __PT_PARM4_REG u_regs[UREG_I3] +#define __PT_PARM5_REG u_regs[UREG_I4] +#define __PT_PARM6_REG u_regs[UREG_I5] + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG u_regs[UREG_I7] +#define __PT_FP_REG __unsupported__ +#define __PT_RC_REG u_regs[UREG_I0] +#define __PT_SP_REG u_regs[UREG_FP] +/* Should this also be a bpf_target check for the sparc case? */ +#if defined(__arch64__) +#define __PT_IP_REG tpc +#else +#define __PT_IP_REG pc +#endif + +#elif defined(bpf_target_riscv) + +/* + * https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc#risc-v-calling-conventions + */ + +#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) +#define __PT_PARM1_REG a0 +#define __PT_PARM2_REG a1 +#define __PT_PARM3_REG a2 +#define __PT_PARM4_REG a3 +#define __PT_PARM5_REG a4 +#define __PT_PARM6_REG a5 +#define __PT_PARM7_REG a6 +#define __PT_PARM8_REG a7 + +/* riscv does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG ra +#define __PT_FP_REG s0 +#define __PT_RC_REG a0 +#define __PT_SP_REG sp +#define __PT_IP_REG pc + +#elif defined(bpf_target_arc) + +/* + * Section "Function Calling Sequence" (page 24): + * https://raw.githubusercontent.com/wiki/foss-for-synopsys-dwc-arc-processors/toolchain/files/ARCv2_ABI.pdf + */ + +/* arc provides struct user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) +#define __PT_PARM1_REG scratch.r0 +#define __PT_PARM2_REG scratch.r1 +#define __PT_PARM3_REG scratch.r2 +#define __PT_PARM4_REG scratch.r3 +#define __PT_PARM5_REG scratch.r4 +#define __PT_PARM6_REG scratch.r5 +#define __PT_PARM7_REG scratch.r6 +#define __PT_PARM8_REG scratch.r7 + +/* arc does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG scratch.blink +#define __PT_FP_REG scratch.fp +#define __PT_RC_REG scratch.r0 +#define __PT_SP_REG scratch.sp +#define __PT_IP_REG scratch.ret + +#elif defined(bpf_target_loongarch) + +/* + * https://docs.kernel.org/loongarch/introduction.html + * https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html + */ + +#define __PT_PARM1_REG regs[4] +#define __PT_PARM2_REG regs[5] +#define __PT_PARM3_REG regs[6] +#define __PT_PARM4_REG regs[7] +#define __PT_PARM5_REG regs[8] +#define __PT_PARM6_REG regs[9] +#define __PT_PARM7_REG regs[10] +#define __PT_PARM8_REG regs[11] + +/* loongarch does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG regs[1] +#define __PT_FP_REG regs[22] +#define __PT_RC_REG regs[4] +#define __PT_SP_REG regs[3] +#define __PT_IP_REG csr_era + +#endif + +#if defined(bpf_target_defined) + +struct pt_regs; + +/* allow some architectures to override `struct pt_regs` */ +#ifndef __PT_REGS_CAST +#define __PT_REGS_CAST(x) (x) +#endif + +/* + * Different architectures support different number of arguments passed + * through registers. i386 supports just 3, some arches support up to 8. + */ +#ifndef __PT_PARM4_REG +#define __PT_PARM4_REG __unsupported__ +#endif +#ifndef __PT_PARM5_REG +#define __PT_PARM5_REG __unsupported__ +#endif +#ifndef __PT_PARM6_REG +#define __PT_PARM6_REG __unsupported__ +#endif +#ifndef __PT_PARM7_REG +#define __PT_PARM7_REG __unsupported__ +#endif +#ifndef __PT_PARM8_REG +#define __PT_PARM8_REG __unsupported__ +#endif +/* + * Similarly, syscall-specific conventions might differ between function call + * conventions within each architecutre. All supported architectures pass + * either 6 or 7 syscall arguments in registers. + * + * See syscall(2) manpage for succinct table with information on each arch. + */ +#ifndef __PT_PARM7_SYSCALL_REG +#define __PT_PARM7_SYSCALL_REG __unsupported__ +#endif + +#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG) +#define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->__PT_PARM2_REG) +#define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->__PT_PARM3_REG) +#define PT_REGS_PARM4(x) (__PT_REGS_CAST(x)->__PT_PARM4_REG) +#define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->__PT_PARM5_REG) +#define PT_REGS_PARM6(x) (__PT_REGS_CAST(x)->__PT_PARM6_REG) +#define PT_REGS_PARM7(x) (__PT_REGS_CAST(x)->__PT_PARM7_REG) +#define PT_REGS_PARM8(x) (__PT_REGS_CAST(x)->__PT_PARM8_REG) +#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->__PT_RET_REG) +#define PT_REGS_FP(x) (__PT_REGS_CAST(x)->__PT_FP_REG) +#define PT_REGS_RC(x) (__PT_REGS_CAST(x)->__PT_RC_REG) +#define PT_REGS_SP(x) (__PT_REGS_CAST(x)->__PT_SP_REG) +#define PT_REGS_IP(x) (__PT_REGS_CAST(x)->__PT_IP_REG) + +#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM1_REG) +#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM2_REG) +#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM3_REG) +#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM4_REG) +#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM5_REG) +#define PT_REGS_PARM6_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM6_REG) +#define PT_REGS_PARM7_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM7_REG) +#define PT_REGS_PARM8_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM8_REG) +#define PT_REGS_RET_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RET_REG) +#define PT_REGS_FP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_FP_REG) +#define PT_REGS_RC_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RC_REG) +#define PT_REGS_SP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_SP_REG) +#define PT_REGS_IP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_IP_REG) + +#if defined(bpf_target_powerpc) + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; }) +#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP + +#elif defined(bpf_target_sparc) + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); }) +#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP + +#else + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) \ + ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); }) +#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) \ + ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)(PT_REGS_FP(ctx) + sizeof(ip))); }) + +#endif + +#ifndef PT_REGS_PARM1_SYSCALL +#define PT_REGS_PARM1_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM1_SYSCALL_REG) +#define PT_REGS_PARM1_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM1_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM2_SYSCALL +#define PT_REGS_PARM2_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM2_SYSCALL_REG) +#define PT_REGS_PARM2_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM2_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM3_SYSCALL +#define PT_REGS_PARM3_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM3_SYSCALL_REG) +#define PT_REGS_PARM3_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM3_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM4_SYSCALL +#define PT_REGS_PARM4_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM4_SYSCALL_REG) +#define PT_REGS_PARM4_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM4_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM5_SYSCALL +#define PT_REGS_PARM5_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM5_SYSCALL_REG) +#define PT_REGS_PARM5_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM5_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM6_SYSCALL +#define PT_REGS_PARM6_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM6_SYSCALL_REG) +#define PT_REGS_PARM6_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM6_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM7_SYSCALL +#define PT_REGS_PARM7_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM7_SYSCALL_REG) +#define PT_REGS_PARM7_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM7_SYSCALL_REG) +#endif + +#else /* defined(bpf_target_defined) */ + +#define PT_REGS_PARM1(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM8(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RET(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_FP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RC(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_SP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_IP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define PT_REGS_PARM1_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM8_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RET_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_FP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RC_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_SP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_IP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define PT_REGS_PARM1_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define PT_REGS_PARM1_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#endif /* defined(bpf_target_defined) */ + +/* + * When invoked from a syscall handler kprobe, returns a pointer to a + * struct pt_regs containing syscall arguments and suitable for passing to + * PT_REGS_PARMn_SYSCALL() and PT_REGS_PARMn_CORE_SYSCALL(). + */ +#ifndef PT_REGS_SYSCALL_REGS +/* By default, assume that the arch selects ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ((struct pt_regs *)PT_REGS_PARM1(ctx)) +#endif + +#ifndef ___bpf_concat +#define ___bpf_concat(a, b) a ## b +#endif +#ifndef ___bpf_apply +#define ___bpf_apply(fn, n) ___bpf_concat(fn, n) +#endif +#ifndef ___bpf_nth +#define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N +#endif +#ifndef ___bpf_narg +#define ___bpf_narg(...) ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#endif + +#define ___bpf_ctx_cast0() ctx +#define ___bpf_ctx_cast1(x) ___bpf_ctx_cast0(), (void *)ctx[0] +#define ___bpf_ctx_cast2(x, args...) ___bpf_ctx_cast1(args), (void *)ctx[1] +#define ___bpf_ctx_cast3(x, args...) ___bpf_ctx_cast2(args), (void *)ctx[2] +#define ___bpf_ctx_cast4(x, args...) ___bpf_ctx_cast3(args), (void *)ctx[3] +#define ___bpf_ctx_cast5(x, args...) ___bpf_ctx_cast4(args), (void *)ctx[4] +#define ___bpf_ctx_cast6(x, args...) ___bpf_ctx_cast5(args), (void *)ctx[5] +#define ___bpf_ctx_cast7(x, args...) ___bpf_ctx_cast6(args), (void *)ctx[6] +#define ___bpf_ctx_cast8(x, args...) ___bpf_ctx_cast7(args), (void *)ctx[7] +#define ___bpf_ctx_cast9(x, args...) ___bpf_ctx_cast8(args), (void *)ctx[8] +#define ___bpf_ctx_cast10(x, args...) ___bpf_ctx_cast9(args), (void *)ctx[9] +#define ___bpf_ctx_cast11(x, args...) ___bpf_ctx_cast10(args), (void *)ctx[10] +#define ___bpf_ctx_cast12(x, args...) ___bpf_ctx_cast11(args), (void *)ctx[11] +#define ___bpf_ctx_cast(args...) ___bpf_apply(___bpf_ctx_cast, ___bpf_narg(args))(args) + +/* + * BPF_PROG is a convenience wrapper for generic tp_btf/fentry/fexit and + * similar kinds of BPF programs, that accept input arguments as a single + * pointer to untyped u64 array, where each u64 can actually be a typed + * pointer or integer of different size. Instead of requring user to write + * manual casts and work with array elements by index, BPF_PROG macro + * allows user to declare a list of named and typed input arguments in the + * same syntax as for normal C function. All the casting is hidden and + * performed transparently, while user code can just assume working with + * function arguments of specified type and name. + * + * Original raw context argument is preserved as well as 'ctx' argument. + * This is useful when using BPF helpers that expect original context + * as one of the parameters (e.g., for bpf_perf_event_output()). + */ +#define BPF_PROG(name, args...) \ +name(unsigned long long *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx, ##args); \ +typeof(name(0)) name(unsigned long long *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_ctx_cast(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx, ##args) + +#ifndef ___bpf_nth2 +#define ___bpf_nth2(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, \ + _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, N, ...) N +#endif +#ifndef ___bpf_narg2 +#define ___bpf_narg2(...) \ + ___bpf_nth2(_, ##__VA_ARGS__, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, \ + 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0) +#endif + +#define ___bpf_treg_cnt(t) \ + __builtin_choose_expr(sizeof(t) == 1, 1, \ + __builtin_choose_expr(sizeof(t) == 2, 1, \ + __builtin_choose_expr(sizeof(t) == 4, 1, \ + __builtin_choose_expr(sizeof(t) == 8, 1, \ + __builtin_choose_expr(sizeof(t) == 16, 2, \ + (void)0))))) + +#define ___bpf_reg_cnt0() (0) +#define ___bpf_reg_cnt1(t, x) (___bpf_reg_cnt0() + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt2(t, x, args...) (___bpf_reg_cnt1(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt3(t, x, args...) (___bpf_reg_cnt2(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt4(t, x, args...) (___bpf_reg_cnt3(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt5(t, x, args...) (___bpf_reg_cnt4(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt6(t, x, args...) (___bpf_reg_cnt5(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt7(t, x, args...) (___bpf_reg_cnt6(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt8(t, x, args...) (___bpf_reg_cnt7(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt9(t, x, args...) (___bpf_reg_cnt8(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt10(t, x, args...) (___bpf_reg_cnt9(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt11(t, x, args...) (___bpf_reg_cnt10(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt12(t, x, args...) (___bpf_reg_cnt11(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt(args...) ___bpf_apply(___bpf_reg_cnt, ___bpf_narg2(args))(args) + +#define ___bpf_union_arg(t, x, n) \ + __builtin_choose_expr(sizeof(t) == 1, ({ union { __u8 z[1]; t x; } ___t = { .z = {ctx[n]}}; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 2, ({ union { __u16 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 4, ({ union { __u32 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 8, ({ union { __u64 z[1]; t x; } ___t = {.z = {ctx[n]} }; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 16, ({ union { __u64 z[2]; t x; } ___t = {.z = {ctx[n], ctx[n + 1]} }; ___t.x; }), \ + (void)0))))) + +#define ___bpf_ctx_arg0(n, args...) +#define ___bpf_ctx_arg1(n, t, x) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt1(t, x)) +#define ___bpf_ctx_arg2(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt2(t, x, args)) ___bpf_ctx_arg1(n, args) +#define ___bpf_ctx_arg3(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt3(t, x, args)) ___bpf_ctx_arg2(n, args) +#define ___bpf_ctx_arg4(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt4(t, x, args)) ___bpf_ctx_arg3(n, args) +#define ___bpf_ctx_arg5(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt5(t, x, args)) ___bpf_ctx_arg4(n, args) +#define ___bpf_ctx_arg6(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt6(t, x, args)) ___bpf_ctx_arg5(n, args) +#define ___bpf_ctx_arg7(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt7(t, x, args)) ___bpf_ctx_arg6(n, args) +#define ___bpf_ctx_arg8(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt8(t, x, args)) ___bpf_ctx_arg7(n, args) +#define ___bpf_ctx_arg9(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt9(t, x, args)) ___bpf_ctx_arg8(n, args) +#define ___bpf_ctx_arg10(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt10(t, x, args)) ___bpf_ctx_arg9(n, args) +#define ___bpf_ctx_arg11(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt11(t, x, args)) ___bpf_ctx_arg10(n, args) +#define ___bpf_ctx_arg12(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt12(t, x, args)) ___bpf_ctx_arg11(n, args) +#define ___bpf_ctx_arg(args...) ___bpf_apply(___bpf_ctx_arg, ___bpf_narg2(args))(___bpf_reg_cnt(args), args) + +#define ___bpf_ctx_decl0() +#define ___bpf_ctx_decl1(t, x) , t x +#define ___bpf_ctx_decl2(t, x, args...) , t x ___bpf_ctx_decl1(args) +#define ___bpf_ctx_decl3(t, x, args...) , t x ___bpf_ctx_decl2(args) +#define ___bpf_ctx_decl4(t, x, args...) , t x ___bpf_ctx_decl3(args) +#define ___bpf_ctx_decl5(t, x, args...) , t x ___bpf_ctx_decl4(args) +#define ___bpf_ctx_decl6(t, x, args...) , t x ___bpf_ctx_decl5(args) +#define ___bpf_ctx_decl7(t, x, args...) , t x ___bpf_ctx_decl6(args) +#define ___bpf_ctx_decl8(t, x, args...) , t x ___bpf_ctx_decl7(args) +#define ___bpf_ctx_decl9(t, x, args...) , t x ___bpf_ctx_decl8(args) +#define ___bpf_ctx_decl10(t, x, args...) , t x ___bpf_ctx_decl9(args) +#define ___bpf_ctx_decl11(t, x, args...) , t x ___bpf_ctx_decl10(args) +#define ___bpf_ctx_decl12(t, x, args...) , t x ___bpf_ctx_decl11(args) +#define ___bpf_ctx_decl(args...) ___bpf_apply(___bpf_ctx_decl, ___bpf_narg2(args))(args) + +/* + * BPF_PROG2 is an enhanced version of BPF_PROG in order to handle struct + * arguments. Since each struct argument might take one or two u64 values + * in the trampoline stack, argument type size is needed to place proper number + * of u64 values for each argument. Therefore, BPF_PROG2 has different + * syntax from BPF_PROG. For example, for the following BPF_PROG syntax: + * + * int BPF_PROG(test2, int a, int b) { ... } + * + * the corresponding BPF_PROG2 syntax is: + * + * int BPF_PROG2(test2, int, a, int, b) { ... } + * + * where type and the corresponding argument name are separated by comma. + * + * Use BPF_PROG2 macro if one of the arguments might be a struct/union larger + * than 8 bytes: + * + * int BPF_PROG2(test_struct_arg, struct bpf_testmod_struct_arg_1, a, int, b, + * int, c, int, d, struct bpf_testmod_struct_arg_2, e, int, ret) + * { + * // access a, b, c, d, e, and ret directly + * ... + * } + */ +#define BPF_PROG2(name, args...) \ +name(unsigned long long *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx ___bpf_ctx_decl(args)); \ +typeof(name(0)) name(unsigned long long *ctx) \ +{ \ + return ____##name(ctx ___bpf_ctx_arg(args)); \ +} \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx ___bpf_ctx_decl(args)) + +struct pt_regs; + +#define ___bpf_kprobe_args0() ctx +#define ___bpf_kprobe_args1(x) ___bpf_kprobe_args0(), (void *)PT_REGS_PARM1(ctx) +#define ___bpf_kprobe_args2(x, args...) ___bpf_kprobe_args1(args), (void *)PT_REGS_PARM2(ctx) +#define ___bpf_kprobe_args3(x, args...) ___bpf_kprobe_args2(args), (void *)PT_REGS_PARM3(ctx) +#define ___bpf_kprobe_args4(x, args...) ___bpf_kprobe_args3(args), (void *)PT_REGS_PARM4(ctx) +#define ___bpf_kprobe_args5(x, args...) ___bpf_kprobe_args4(args), (void *)PT_REGS_PARM5(ctx) +#define ___bpf_kprobe_args6(x, args...) ___bpf_kprobe_args5(args), (void *)PT_REGS_PARM6(ctx) +#define ___bpf_kprobe_args7(x, args...) ___bpf_kprobe_args6(args), (void *)PT_REGS_PARM7(ctx) +#define ___bpf_kprobe_args8(x, args...) ___bpf_kprobe_args7(args), (void *)PT_REGS_PARM8(ctx) +#define ___bpf_kprobe_args(args...) ___bpf_apply(___bpf_kprobe_args, ___bpf_narg(args))(args) + +/* + * BPF_KPROBE serves the same purpose for kprobes as BPF_PROG for + * tp_btf/fentry/fexit BPF programs. It hides the underlying platform-specific + * low-level way of getting kprobe input arguments from struct pt_regs, and + * provides a familiar typed and named function arguments syntax and + * semantics of accessing kprobe input paremeters. + * + * Original struct pt_regs* context is preserved as 'ctx' argument. This might + * be necessary when using BPF helpers like bpf_perf_event_output(). + */ +#define BPF_KPROBE(name, args...) \ +name(struct pt_regs *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_kprobe_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args) + +#define ___bpf_kretprobe_args0() ctx +#define ___bpf_kretprobe_args1(x) ___bpf_kretprobe_args0(), (void *)PT_REGS_RC(ctx) +#define ___bpf_kretprobe_args(args...) ___bpf_apply(___bpf_kretprobe_args, ___bpf_narg(args))(args) + +/* + * BPF_KRETPROBE is similar to BPF_KPROBE, except, it only provides optional + * return value (in addition to `struct pt_regs *ctx`), but no input + * arguments, because they will be clobbered by the time probed function + * returns. + */ +#define BPF_KRETPROBE(name, args...) \ +name(struct pt_regs *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_kretprobe_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) ____##name(struct pt_regs *ctx, ##args) + +/* If kernel has CONFIG_ARCH_HAS_SYSCALL_WRAPPER, read pt_regs directly */ +#define ___bpf_syscall_args0() ctx +#define ___bpf_syscall_args1(x) ___bpf_syscall_args0(), (void *)PT_REGS_PARM1_SYSCALL(regs) +#define ___bpf_syscall_args2(x, args...) ___bpf_syscall_args1(args), (void *)PT_REGS_PARM2_SYSCALL(regs) +#define ___bpf_syscall_args3(x, args...) ___bpf_syscall_args2(args), (void *)PT_REGS_PARM3_SYSCALL(regs) +#define ___bpf_syscall_args4(x, args...) ___bpf_syscall_args3(args), (void *)PT_REGS_PARM4_SYSCALL(regs) +#define ___bpf_syscall_args5(x, args...) ___bpf_syscall_args4(args), (void *)PT_REGS_PARM5_SYSCALL(regs) +#define ___bpf_syscall_args6(x, args...) ___bpf_syscall_args5(args), (void *)PT_REGS_PARM6_SYSCALL(regs) +#define ___bpf_syscall_args7(x, args...) ___bpf_syscall_args6(args), (void *)PT_REGS_PARM7_SYSCALL(regs) +#define ___bpf_syscall_args(args...) ___bpf_apply(___bpf_syscall_args, ___bpf_narg(args))(args) + +/* If kernel doesn't have CONFIG_ARCH_HAS_SYSCALL_WRAPPER, we have to BPF_CORE_READ from pt_regs */ +#define ___bpf_syswrap_args0() ctx +#define ___bpf_syswrap_args1(x) ___bpf_syswrap_args0(), (void *)PT_REGS_PARM1_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args2(x, args...) ___bpf_syswrap_args1(args), (void *)PT_REGS_PARM2_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args3(x, args...) ___bpf_syswrap_args2(args), (void *)PT_REGS_PARM3_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args4(x, args...) ___bpf_syswrap_args3(args), (void *)PT_REGS_PARM4_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args5(x, args...) ___bpf_syswrap_args4(args), (void *)PT_REGS_PARM5_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args6(x, args...) ___bpf_syswrap_args5(args), (void *)PT_REGS_PARM6_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args7(x, args...) ___bpf_syswrap_args6(args), (void *)PT_REGS_PARM7_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args(args...) ___bpf_apply(___bpf_syswrap_args, ___bpf_narg(args))(args) + +/* + * BPF_KSYSCALL is a variant of BPF_KPROBE, which is intended for + * tracing syscall functions, like __x64_sys_close. It hides the underlying + * platform-specific low-level way of getting syscall input arguments from + * struct pt_regs, and provides a familiar typed and named function arguments + * syntax and semantics of accessing syscall input parameters. + * + * Original struct pt_regs * context is preserved as 'ctx' argument. This might + * be necessary when using BPF helpers like bpf_perf_event_output(). + * + * At the moment BPF_KSYSCALL does not transparently handle all the calling + * convention quirks for the following syscalls: + * + * - mmap(): __ARCH_WANT_SYS_OLD_MMAP. + * - clone(): CONFIG_CLONE_BACKWARDS, CONFIG_CLONE_BACKWARDS2 and + * CONFIG_CLONE_BACKWARDS3. + * - socket-related syscalls: __ARCH_WANT_SYS_SOCKETCALL. + * - compat syscalls. + * + * This may or may not change in the future. User needs to take extra measures + * to handle such quirks explicitly, if necessary. + * + * This macro relies on BPF CO-RE support and virtual __kconfig externs. + */ +#define BPF_KSYSCALL(name, args...) \ +name(struct pt_regs *ctx); \ +extern _Bool LINUX_HAS_SYSCALL_WRAPPER __kconfig; \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + struct pt_regs *regs = LINUX_HAS_SYSCALL_WRAPPER \ + ? (struct pt_regs *)PT_REGS_PARM1(ctx) \ + : ctx; \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + if (LINUX_HAS_SYSCALL_WRAPPER) \ + return ____##name(___bpf_syswrap_args(args)); \ + else \ + return ____##name(___bpf_syscall_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args) + +#define BPF_KPROBE_SYSCALL BPF_KSYSCALL + +/* BPF_UPROBE and BPF_URETPROBE are identical to BPF_KPROBE and BPF_KRETPROBE, + * but are named way less confusingly for SEC("uprobe") and SEC("uretprobe") + * use cases. + */ +#define BPF_UPROBE(name, args...) BPF_KPROBE(name, ##args) +#define BPF_URETPROBE(name, args...) BPF_KRETPROBE(name, ##args) + +#endif diff --git a/bpftool/libbpf/src/btf.c b/bpftool/libbpf/src/btf.c new file mode 100644 index 0000000..4913345 --- /dev/null +++ b/bpftool/libbpf/src/btf.c @@ -0,0 +1,5028 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2018 Facebook */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "btf.h" +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" +#include "hashmap.h" +#include "strset.h" + +#define BTF_MAX_NR_TYPES 0x7fffffffU +#define BTF_MAX_STR_OFFSET 0x7fffffffU + +static struct btf_type btf_void; + +struct btf { + /* raw BTF data in native endianness */ + void *raw_data; + /* raw BTF data in non-native endianness */ + void *raw_data_swapped; + __u32 raw_size; + /* whether target endianness differs from the native one */ + bool swapped_endian; + + /* + * When BTF is loaded from an ELF or raw memory it is stored + * in a contiguous memory block. The hdr, type_data, and, strs_data + * point inside that memory region to their respective parts of BTF + * representation: + * + * +--------------------------------+ + * | Header | Types | Strings | + * +--------------------------------+ + * ^ ^ ^ + * | | | + * hdr | | + * types_data-+ | + * strs_data------------+ + * + * If BTF data is later modified, e.g., due to types added or + * removed, BTF deduplication performed, etc, this contiguous + * representation is broken up into three independently allocated + * memory regions to be able to modify them independently. + * raw_data is nulled out at that point, but can be later allocated + * and cached again if user calls btf__raw_data(), at which point + * raw_data will contain a contiguous copy of header, types, and + * strings: + * + * +----------+ +---------+ +-----------+ + * | Header | | Types | | Strings | + * +----------+ +---------+ +-----------+ + * ^ ^ ^ + * | | | + * hdr | | + * types_data----+ | + * strset__data(strs_set)-----+ + * + * +----------+---------+-----------+ + * | Header | Types | Strings | + * raw_data----->+----------+---------+-----------+ + */ + struct btf_header *hdr; + + void *types_data; + size_t types_data_cap; /* used size stored in hdr->type_len */ + + /* type ID to `struct btf_type *` lookup index + * type_offs[0] corresponds to the first non-VOID type: + * - for base BTF it's type [1]; + * - for split BTF it's the first non-base BTF type. + */ + __u32 *type_offs; + size_t type_offs_cap; + /* number of types in this BTF instance: + * - doesn't include special [0] void type; + * - for split BTF counts number of types added on top of base BTF. + */ + __u32 nr_types; + /* if not NULL, points to the base BTF on top of which the current + * split BTF is based + */ + struct btf *base_btf; + /* BTF type ID of the first type in this BTF instance: + * - for base BTF it's equal to 1; + * - for split BTF it's equal to biggest type ID of base BTF plus 1. + */ + int start_id; + /* logical string offset of this BTF instance: + * - for base BTF it's equal to 0; + * - for split BTF it's equal to total size of base BTF's string section size. + */ + int start_str_off; + + /* only one of strs_data or strs_set can be non-NULL, depending on + * whether BTF is in a modifiable state (strs_set is used) or not + * (strs_data points inside raw_data) + */ + void *strs_data; + /* a set of unique strings */ + struct strset *strs_set; + /* whether strings are already deduplicated */ + bool strs_deduped; + + /* BTF object FD, if loaded into kernel */ + int fd; + + /* Pointer size (in bytes) for a target architecture of this BTF */ + int ptr_sz; +}; + +static inline __u64 ptr_to_u64(const void *ptr) +{ + return (__u64) (unsigned long) ptr; +} + +/* Ensure given dynamically allocated memory region pointed to by *data* with + * capacity of *cap_cnt* elements each taking *elem_sz* bytes has enough + * memory to accommodate *add_cnt* new elements, assuming *cur_cnt* elements + * are already used. At most *max_cnt* elements can be ever allocated. + * If necessary, memory is reallocated and all existing data is copied over, + * new pointer to the memory region is stored at *data, new memory region + * capacity (in number of elements) is stored in *cap. + * On success, memory pointer to the beginning of unused memory is returned. + * On error, NULL is returned. + */ +void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz, + size_t cur_cnt, size_t max_cnt, size_t add_cnt) +{ + size_t new_cnt; + void *new_data; + + if (cur_cnt + add_cnt <= *cap_cnt) + return *data + cur_cnt * elem_sz; + + /* requested more than the set limit */ + if (cur_cnt + add_cnt > max_cnt) + return NULL; + + new_cnt = *cap_cnt; + new_cnt += new_cnt / 4; /* expand by 25% */ + if (new_cnt < 16) /* but at least 16 elements */ + new_cnt = 16; + if (new_cnt > max_cnt) /* but not exceeding a set limit */ + new_cnt = max_cnt; + if (new_cnt < cur_cnt + add_cnt) /* also ensure we have enough memory */ + new_cnt = cur_cnt + add_cnt; + + new_data = libbpf_reallocarray(*data, new_cnt, elem_sz); + if (!new_data) + return NULL; + + /* zero out newly allocated portion of memory */ + memset(new_data + (*cap_cnt) * elem_sz, 0, (new_cnt - *cap_cnt) * elem_sz); + + *data = new_data; + *cap_cnt = new_cnt; + return new_data + cur_cnt * elem_sz; +} + +/* Ensure given dynamically allocated memory region has enough allocated space + * to accommodate *need_cnt* elements of size *elem_sz* bytes each + */ +int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt) +{ + void *p; + + if (need_cnt <= *cap_cnt) + return 0; + + p = libbpf_add_mem(data, cap_cnt, elem_sz, *cap_cnt, SIZE_MAX, need_cnt - *cap_cnt); + if (!p) + return -ENOMEM; + + return 0; +} + +static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt) +{ + return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32), + btf->nr_types, BTF_MAX_NR_TYPES, add_cnt); +} + +static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off) +{ + __u32 *p; + + p = btf_add_type_offs_mem(btf, 1); + if (!p) + return -ENOMEM; + + *p = type_off; + return 0; +} + +static void btf_bswap_hdr(struct btf_header *h) +{ + h->magic = bswap_16(h->magic); + h->hdr_len = bswap_32(h->hdr_len); + h->type_off = bswap_32(h->type_off); + h->type_len = bswap_32(h->type_len); + h->str_off = bswap_32(h->str_off); + h->str_len = bswap_32(h->str_len); +} + +static int btf_parse_hdr(struct btf *btf) +{ + struct btf_header *hdr = btf->hdr; + __u32 meta_left; + + if (btf->raw_size < sizeof(struct btf_header)) { + pr_debug("BTF header not found\n"); + return -EINVAL; + } + + if (hdr->magic == bswap_16(BTF_MAGIC)) { + btf->swapped_endian = true; + if (bswap_32(hdr->hdr_len) != sizeof(struct btf_header)) { + pr_warn("Can't load BTF with non-native endianness due to unsupported header length %u\n", + bswap_32(hdr->hdr_len)); + return -ENOTSUP; + } + btf_bswap_hdr(hdr); + } else if (hdr->magic != BTF_MAGIC) { + pr_debug("Invalid BTF magic: %x\n", hdr->magic); + return -EINVAL; + } + + if (btf->raw_size < hdr->hdr_len) { + pr_debug("BTF header len %u larger than data size %u\n", + hdr->hdr_len, btf->raw_size); + return -EINVAL; + } + + meta_left = btf->raw_size - hdr->hdr_len; + if (meta_left < (long long)hdr->str_off + hdr->str_len) { + pr_debug("Invalid BTF total size: %u\n", btf->raw_size); + return -EINVAL; + } + + if ((long long)hdr->type_off + hdr->type_len > hdr->str_off) { + pr_debug("Invalid BTF data sections layout: type data at %u + %u, strings data at %u + %u\n", + hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len); + return -EINVAL; + } + + if (hdr->type_off % 4) { + pr_debug("BTF type section is not aligned to 4 bytes\n"); + return -EINVAL; + } + + return 0; +} + +static int btf_parse_str_sec(struct btf *btf) +{ + const struct btf_header *hdr = btf->hdr; + const char *start = btf->strs_data; + const char *end = start + btf->hdr->str_len; + + if (btf->base_btf && hdr->str_len == 0) + return 0; + if (!hdr->str_len || hdr->str_len - 1 > BTF_MAX_STR_OFFSET || end[-1]) { + pr_debug("Invalid BTF string section\n"); + return -EINVAL; + } + if (!btf->base_btf && start[0]) { + pr_debug("Invalid BTF string section\n"); + return -EINVAL; + } + return 0; +} + +static int btf_type_size(const struct btf_type *t) +{ + const int base_size = sizeof(struct btf_type); + __u16 vlen = btf_vlen(t); + + switch (btf_kind(t)) { + case BTF_KIND_FWD: + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_FLOAT: + case BTF_KIND_TYPE_TAG: + return base_size; + case BTF_KIND_INT: + return base_size + sizeof(__u32); + case BTF_KIND_ENUM: + return base_size + vlen * sizeof(struct btf_enum); + case BTF_KIND_ENUM64: + return base_size + vlen * sizeof(struct btf_enum64); + case BTF_KIND_ARRAY: + return base_size + sizeof(struct btf_array); + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + return base_size + vlen * sizeof(struct btf_member); + case BTF_KIND_FUNC_PROTO: + return base_size + vlen * sizeof(struct btf_param); + case BTF_KIND_VAR: + return base_size + sizeof(struct btf_var); + case BTF_KIND_DATASEC: + return base_size + vlen * sizeof(struct btf_var_secinfo); + case BTF_KIND_DECL_TAG: + return base_size + sizeof(struct btf_decl_tag); + default: + pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t)); + return -EINVAL; + } +} + +static void btf_bswap_type_base(struct btf_type *t) +{ + t->name_off = bswap_32(t->name_off); + t->info = bswap_32(t->info); + t->type = bswap_32(t->type); +} + +static int btf_bswap_type_rest(struct btf_type *t) +{ + struct btf_var_secinfo *v; + struct btf_enum64 *e64; + struct btf_member *m; + struct btf_array *a; + struct btf_param *p; + struct btf_enum *e; + __u16 vlen = btf_vlen(t); + int i; + + switch (btf_kind(t)) { + case BTF_KIND_FWD: + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_FLOAT: + case BTF_KIND_TYPE_TAG: + return 0; + case BTF_KIND_INT: + *(__u32 *)(t + 1) = bswap_32(*(__u32 *)(t + 1)); + return 0; + case BTF_KIND_ENUM: + for (i = 0, e = btf_enum(t); i < vlen; i++, e++) { + e->name_off = bswap_32(e->name_off); + e->val = bswap_32(e->val); + } + return 0; + case BTF_KIND_ENUM64: + for (i = 0, e64 = btf_enum64(t); i < vlen; i++, e64++) { + e64->name_off = bswap_32(e64->name_off); + e64->val_lo32 = bswap_32(e64->val_lo32); + e64->val_hi32 = bswap_32(e64->val_hi32); + } + return 0; + case BTF_KIND_ARRAY: + a = btf_array(t); + a->type = bswap_32(a->type); + a->index_type = bswap_32(a->index_type); + a->nelems = bswap_32(a->nelems); + return 0; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + for (i = 0, m = btf_members(t); i < vlen; i++, m++) { + m->name_off = bswap_32(m->name_off); + m->type = bswap_32(m->type); + m->offset = bswap_32(m->offset); + } + return 0; + case BTF_KIND_FUNC_PROTO: + for (i = 0, p = btf_params(t); i < vlen; i++, p++) { + p->name_off = bswap_32(p->name_off); + p->type = bswap_32(p->type); + } + return 0; + case BTF_KIND_VAR: + btf_var(t)->linkage = bswap_32(btf_var(t)->linkage); + return 0; + case BTF_KIND_DATASEC: + for (i = 0, v = btf_var_secinfos(t); i < vlen; i++, v++) { + v->type = bswap_32(v->type); + v->offset = bswap_32(v->offset); + v->size = bswap_32(v->size); + } + return 0; + case BTF_KIND_DECL_TAG: + btf_decl_tag(t)->component_idx = bswap_32(btf_decl_tag(t)->component_idx); + return 0; + default: + pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t)); + return -EINVAL; + } +} + +static int btf_parse_type_sec(struct btf *btf) +{ + struct btf_header *hdr = btf->hdr; + void *next_type = btf->types_data; + void *end_type = next_type + hdr->type_len; + int err, type_size; + + while (next_type + sizeof(struct btf_type) <= end_type) { + if (btf->swapped_endian) + btf_bswap_type_base(next_type); + + type_size = btf_type_size(next_type); + if (type_size < 0) + return type_size; + if (next_type + type_size > end_type) { + pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types); + return -EINVAL; + } + + if (btf->swapped_endian && btf_bswap_type_rest(next_type)) + return -EINVAL; + + err = btf_add_type_idx_entry(btf, next_type - btf->types_data); + if (err) + return err; + + next_type += type_size; + btf->nr_types++; + } + + if (next_type != end_type) { + pr_warn("BTF types data is malformed\n"); + return -EINVAL; + } + + return 0; +} + +__u32 btf__type_cnt(const struct btf *btf) +{ + return btf->start_id + btf->nr_types; +} + +const struct btf *btf__base_btf(const struct btf *btf) +{ + return btf->base_btf; +} + +/* internal helper returning non-const pointer to a type */ +struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id) +{ + if (type_id == 0) + return &btf_void; + if (type_id < btf->start_id) + return btf_type_by_id(btf->base_btf, type_id); + return btf->types_data + btf->type_offs[type_id - btf->start_id]; +} + +const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id) +{ + if (type_id >= btf->start_id + btf->nr_types) + return errno = EINVAL, NULL; + return btf_type_by_id((struct btf *)btf, type_id); +} + +static int determine_ptr_size(const struct btf *btf) +{ + static const char * const long_aliases[] = { + "long", + "long int", + "int long", + "unsigned long", + "long unsigned", + "unsigned long int", + "unsigned int long", + "long unsigned int", + "long int unsigned", + "int unsigned long", + "int long unsigned", + }; + const struct btf_type *t; + const char *name; + int i, j, n; + + if (btf->base_btf && btf->base_btf->ptr_sz > 0) + return btf->base_btf->ptr_sz; + + n = btf__type_cnt(btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(btf, i); + if (!btf_is_int(t)) + continue; + + if (t->size != 4 && t->size != 8) + continue; + + name = btf__name_by_offset(btf, t->name_off); + if (!name) + continue; + + for (j = 0; j < ARRAY_SIZE(long_aliases); j++) { + if (strcmp(name, long_aliases[j]) == 0) + return t->size; + } + } + + return -1; +} + +static size_t btf_ptr_sz(const struct btf *btf) +{ + if (!btf->ptr_sz) + ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); + return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz; +} + +/* Return pointer size this BTF instance assumes. The size is heuristically + * determined by looking for 'long' or 'unsigned long' integer type and + * recording its size in bytes. If BTF type information doesn't have any such + * type, this function returns 0. In the latter case, native architecture's + * pointer size is assumed, so will be either 4 or 8, depending on + * architecture that libbpf was compiled for. It's possible to override + * guessed value by using btf__set_pointer_size() API. + */ +size_t btf__pointer_size(const struct btf *btf) +{ + if (!btf->ptr_sz) + ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); + + if (btf->ptr_sz < 0) + /* not enough BTF type info to guess */ + return 0; + + return btf->ptr_sz; +} + +/* Override or set pointer size in bytes. Only values of 4 and 8 are + * supported. + */ +int btf__set_pointer_size(struct btf *btf, size_t ptr_sz) +{ + if (ptr_sz != 4 && ptr_sz != 8) + return libbpf_err(-EINVAL); + btf->ptr_sz = ptr_sz; + return 0; +} + +static bool is_host_big_endian(void) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return false; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + return true; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif +} + +enum btf_endianness btf__endianness(const struct btf *btf) +{ + if (is_host_big_endian()) + return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN; + else + return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN; +} + +int btf__set_endianness(struct btf *btf, enum btf_endianness endian) +{ + if (endian != BTF_LITTLE_ENDIAN && endian != BTF_BIG_ENDIAN) + return libbpf_err(-EINVAL); + + btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN); + if (!btf->swapped_endian) { + free(btf->raw_data_swapped); + btf->raw_data_swapped = NULL; + } + return 0; +} + +static bool btf_type_is_void(const struct btf_type *t) +{ + return t == &btf_void || btf_is_fwd(t); +} + +static bool btf_type_is_void_or_null(const struct btf_type *t) +{ + return !t || btf_type_is_void(t); +} + +#define MAX_RESOLVE_DEPTH 32 + +__s64 btf__resolve_size(const struct btf *btf, __u32 type_id) +{ + const struct btf_array *array; + const struct btf_type *t; + __u32 nelems = 1; + __s64 size = -1; + int i; + + t = btf__type_by_id(btf, type_id); + for (i = 0; i < MAX_RESOLVE_DEPTH && !btf_type_is_void_or_null(t); i++) { + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_DATASEC: + case BTF_KIND_FLOAT: + size = t->size; + goto done; + case BTF_KIND_PTR: + size = btf_ptr_sz(btf); + goto done; + case BTF_KIND_TYPEDEF: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_VAR: + case BTF_KIND_DECL_TAG: + case BTF_KIND_TYPE_TAG: + type_id = t->type; + break; + case BTF_KIND_ARRAY: + array = btf_array(t); + if (nelems && array->nelems > UINT32_MAX / nelems) + return libbpf_err(-E2BIG); + nelems *= array->nelems; + type_id = array->type; + break; + default: + return libbpf_err(-EINVAL); + } + + t = btf__type_by_id(btf, type_id); + } + +done: + if (size < 0) + return libbpf_err(-EINVAL); + if (nelems && size > UINT32_MAX / nelems) + return libbpf_err(-E2BIG); + + return nelems * size; +} + +int btf__align_of(const struct btf *btf, __u32 id) +{ + const struct btf_type *t = btf__type_by_id(btf, id); + __u16 kind = btf_kind(t); + + switch (kind) { + case BTF_KIND_INT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FLOAT: + return min(btf_ptr_sz(btf), (size_t)t->size); + case BTF_KIND_PTR: + return btf_ptr_sz(btf); + case BTF_KIND_TYPEDEF: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_TYPE_TAG: + return btf__align_of(btf, t->type); + case BTF_KIND_ARRAY: + return btf__align_of(btf, btf_array(t)->type); + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m = btf_members(t); + __u16 vlen = btf_vlen(t); + int i, max_align = 1, align; + + for (i = 0; i < vlen; i++, m++) { + align = btf__align_of(btf, m->type); + if (align <= 0) + return libbpf_err(align); + max_align = max(max_align, align); + + /* if field offset isn't aligned according to field + * type's alignment, then struct must be packed + */ + if (btf_member_bitfield_size(t, i) == 0 && + (m->offset % (8 * align)) != 0) + return 1; + } + + /* if struct/union size isn't a multiple of its alignment, + * then struct must be packed + */ + if ((t->size % max_align) != 0) + return 1; + + return max_align; + } + default: + pr_warn("unsupported BTF_KIND:%u\n", btf_kind(t)); + return errno = EINVAL, 0; + } +} + +int btf__resolve_type(const struct btf *btf, __u32 type_id) +{ + const struct btf_type *t; + int depth = 0; + + t = btf__type_by_id(btf, type_id); + while (depth < MAX_RESOLVE_DEPTH && + !btf_type_is_void_or_null(t) && + (btf_is_mod(t) || btf_is_typedef(t) || btf_is_var(t))) { + type_id = t->type; + t = btf__type_by_id(btf, type_id); + depth++; + } + + if (depth == MAX_RESOLVE_DEPTH || btf_type_is_void_or_null(t)) + return libbpf_err(-EINVAL); + + return type_id; +} + +__s32 btf__find_by_name(const struct btf *btf, const char *type_name) +{ + __u32 i, nr_types = btf__type_cnt(btf); + + if (!strcmp(type_name, "void")) + return 0; + + for (i = 1; i < nr_types; i++) { + const struct btf_type *t = btf__type_by_id(btf, i); + const char *name = btf__name_by_offset(btf, t->name_off); + + if (name && !strcmp(type_name, name)) + return i; + } + + return libbpf_err(-ENOENT); +} + +static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id, + const char *type_name, __u32 kind) +{ + __u32 i, nr_types = btf__type_cnt(btf); + + if (kind == BTF_KIND_UNKN || !strcmp(type_name, "void")) + return 0; + + for (i = start_id; i < nr_types; i++) { + const struct btf_type *t = btf__type_by_id(btf, i); + const char *name; + + if (btf_kind(t) != kind) + continue; + name = btf__name_by_offset(btf, t->name_off); + if (name && !strcmp(type_name, name)) + return i; + } + + return libbpf_err(-ENOENT); +} + +__s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, + __u32 kind) +{ + return btf_find_by_name_kind(btf, btf->start_id, type_name, kind); +} + +__s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name, + __u32 kind) +{ + return btf_find_by_name_kind(btf, 1, type_name, kind); +} + +static bool btf_is_modifiable(const struct btf *btf) +{ + return (void *)btf->hdr != btf->raw_data; +} + +void btf__free(struct btf *btf) +{ + if (IS_ERR_OR_NULL(btf)) + return; + + if (btf->fd >= 0) + close(btf->fd); + + if (btf_is_modifiable(btf)) { + /* if BTF was modified after loading, it will have a split + * in-memory representation for header, types, and strings + * sections, so we need to free all of them individually. It + * might still have a cached contiguous raw data present, + * which will be unconditionally freed below. + */ + free(btf->hdr); + free(btf->types_data); + strset__free(btf->strs_set); + } + free(btf->raw_data); + free(btf->raw_data_swapped); + free(btf->type_offs); + free(btf); +} + +static struct btf *btf_new_empty(struct btf *base_btf) +{ + struct btf *btf; + + btf = calloc(1, sizeof(*btf)); + if (!btf) + return ERR_PTR(-ENOMEM); + + btf->nr_types = 0; + btf->start_id = 1; + btf->start_str_off = 0; + btf->fd = -1; + btf->ptr_sz = sizeof(void *); + btf->swapped_endian = false; + + if (base_btf) { + btf->base_btf = base_btf; + btf->start_id = btf__type_cnt(base_btf); + btf->start_str_off = base_btf->hdr->str_len; + } + + /* +1 for empty string at offset 0 */ + btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1); + btf->raw_data = calloc(1, btf->raw_size); + if (!btf->raw_data) { + free(btf); + return ERR_PTR(-ENOMEM); + } + + btf->hdr = btf->raw_data; + btf->hdr->hdr_len = sizeof(struct btf_header); + btf->hdr->magic = BTF_MAGIC; + btf->hdr->version = BTF_VERSION; + + btf->types_data = btf->raw_data + btf->hdr->hdr_len; + btf->strs_data = btf->raw_data + btf->hdr->hdr_len; + btf->hdr->str_len = base_btf ? 0 : 1; /* empty string at offset 0 */ + + return btf; +} + +struct btf *btf__new_empty(void) +{ + return libbpf_ptr(btf_new_empty(NULL)); +} + +struct btf *btf__new_empty_split(struct btf *base_btf) +{ + return libbpf_ptr(btf_new_empty(base_btf)); +} + +static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf) +{ + struct btf *btf; + int err; + + btf = calloc(1, sizeof(struct btf)); + if (!btf) + return ERR_PTR(-ENOMEM); + + btf->nr_types = 0; + btf->start_id = 1; + btf->start_str_off = 0; + btf->fd = -1; + + if (base_btf) { + btf->base_btf = base_btf; + btf->start_id = btf__type_cnt(base_btf); + btf->start_str_off = base_btf->hdr->str_len; + } + + btf->raw_data = malloc(size); + if (!btf->raw_data) { + err = -ENOMEM; + goto done; + } + memcpy(btf->raw_data, data, size); + btf->raw_size = size; + + btf->hdr = btf->raw_data; + err = btf_parse_hdr(btf); + if (err) + goto done; + + btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off; + btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off; + + err = btf_parse_str_sec(btf); + err = err ?: btf_parse_type_sec(btf); + if (err) + goto done; + +done: + if (err) { + btf__free(btf); + return ERR_PTR(err); + } + + return btf; +} + +struct btf *btf__new(const void *data, __u32 size) +{ + return libbpf_ptr(btf_new(data, size, NULL)); +} + +static struct btf *btf_parse_elf(const char *path, struct btf *base_btf, + struct btf_ext **btf_ext) +{ + Elf_Data *btf_data = NULL, *btf_ext_data = NULL; + int err = 0, fd = -1, idx = 0; + struct btf *btf = NULL; + Elf_Scn *scn = NULL; + Elf *elf = NULL; + GElf_Ehdr ehdr; + size_t shstrndx; + + if (elf_version(EV_CURRENT) == EV_NONE) { + pr_warn("failed to init libelf for %s\n", path); + return ERR_PTR(-LIBBPF_ERRNO__LIBELF); + } + + fd = open(path, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + err = -errno; + pr_warn("failed to open %s: %s\n", path, strerror(errno)); + return ERR_PTR(err); + } + + err = -LIBBPF_ERRNO__FORMAT; + + elf = elf_begin(fd, ELF_C_READ, NULL); + if (!elf) { + pr_warn("failed to open %s as ELF file\n", path); + goto done; + } + if (!gelf_getehdr(elf, &ehdr)) { + pr_warn("failed to get EHDR from %s\n", path); + goto done; + } + + if (elf_getshdrstrndx(elf, &shstrndx)) { + pr_warn("failed to get section names section index for %s\n", + path); + goto done; + } + + if (!elf_rawdata(elf_getscn(elf, shstrndx), NULL)) { + pr_warn("failed to get e_shstrndx from %s\n", path); + goto done; + } + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + GElf_Shdr sh; + char *name; + + idx++; + if (gelf_getshdr(scn, &sh) != &sh) { + pr_warn("failed to get section(%d) header from %s\n", + idx, path); + goto done; + } + name = elf_strptr(elf, shstrndx, sh.sh_name); + if (!name) { + pr_warn("failed to get section(%d) name from %s\n", + idx, path); + goto done; + } + if (strcmp(name, BTF_ELF_SEC) == 0) { + btf_data = elf_getdata(scn, 0); + if (!btf_data) { + pr_warn("failed to get section(%d, %s) data from %s\n", + idx, name, path); + goto done; + } + continue; + } else if (btf_ext && strcmp(name, BTF_EXT_ELF_SEC) == 0) { + btf_ext_data = elf_getdata(scn, 0); + if (!btf_ext_data) { + pr_warn("failed to get section(%d, %s) data from %s\n", + idx, name, path); + goto done; + } + continue; + } + } + + err = 0; + + if (!btf_data) { + pr_warn("failed to find '%s' ELF section in %s\n", BTF_ELF_SEC, path); + err = -ENODATA; + goto done; + } + btf = btf_new(btf_data->d_buf, btf_data->d_size, base_btf); + err = libbpf_get_error(btf); + if (err) + goto done; + + switch (gelf_getclass(elf)) { + case ELFCLASS32: + btf__set_pointer_size(btf, 4); + break; + case ELFCLASS64: + btf__set_pointer_size(btf, 8); + break; + default: + pr_warn("failed to get ELF class (bitness) for %s\n", path); + break; + } + + if (btf_ext && btf_ext_data) { + *btf_ext = btf_ext__new(btf_ext_data->d_buf, btf_ext_data->d_size); + err = libbpf_get_error(*btf_ext); + if (err) + goto done; + } else if (btf_ext) { + *btf_ext = NULL; + } +done: + if (elf) + elf_end(elf); + close(fd); + + if (!err) + return btf; + + if (btf_ext) + btf_ext__free(*btf_ext); + btf__free(btf); + + return ERR_PTR(err); +} + +struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext) +{ + return libbpf_ptr(btf_parse_elf(path, NULL, btf_ext)); +} + +struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf) +{ + return libbpf_ptr(btf_parse_elf(path, base_btf, NULL)); +} + +static struct btf *btf_parse_raw(const char *path, struct btf *base_btf) +{ + struct btf *btf = NULL; + void *data = NULL; + FILE *f = NULL; + __u16 magic; + int err = 0; + long sz; + + f = fopen(path, "rb"); + if (!f) { + err = -errno; + goto err_out; + } + + /* check BTF magic */ + if (fread(&magic, 1, sizeof(magic), f) < sizeof(magic)) { + err = -EIO; + goto err_out; + } + if (magic != BTF_MAGIC && magic != bswap_16(BTF_MAGIC)) { + /* definitely not a raw BTF */ + err = -EPROTO; + goto err_out; + } + + /* get file size */ + if (fseek(f, 0, SEEK_END)) { + err = -errno; + goto err_out; + } + sz = ftell(f); + if (sz < 0) { + err = -errno; + goto err_out; + } + /* rewind to the start */ + if (fseek(f, 0, SEEK_SET)) { + err = -errno; + goto err_out; + } + + /* pre-alloc memory and read all of BTF data */ + data = malloc(sz); + if (!data) { + err = -ENOMEM; + goto err_out; + } + if (fread(data, 1, sz, f) < sz) { + err = -EIO; + goto err_out; + } + + /* finally parse BTF data */ + btf = btf_new(data, sz, base_btf); + +err_out: + free(data); + if (f) + fclose(f); + return err ? ERR_PTR(err) : btf; +} + +struct btf *btf__parse_raw(const char *path) +{ + return libbpf_ptr(btf_parse_raw(path, NULL)); +} + +struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf) +{ + return libbpf_ptr(btf_parse_raw(path, base_btf)); +} + +static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext) +{ + struct btf *btf; + int err; + + if (btf_ext) + *btf_ext = NULL; + + btf = btf_parse_raw(path, base_btf); + err = libbpf_get_error(btf); + if (!err) + return btf; + if (err != -EPROTO) + return ERR_PTR(err); + return btf_parse_elf(path, base_btf, btf_ext); +} + +struct btf *btf__parse(const char *path, struct btf_ext **btf_ext) +{ + return libbpf_ptr(btf_parse(path, NULL, btf_ext)); +} + +struct btf *btf__parse_split(const char *path, struct btf *base_btf) +{ + return libbpf_ptr(btf_parse(path, base_btf, NULL)); +} + +static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian); + +int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level) +{ + LIBBPF_OPTS(bpf_btf_load_opts, opts); + __u32 buf_sz = 0, raw_size; + char *buf = NULL, *tmp; + void *raw_data; + int err = 0; + + if (btf->fd >= 0) + return libbpf_err(-EEXIST); + if (log_sz && !log_buf) + return libbpf_err(-EINVAL); + + /* cache native raw data representation */ + raw_data = btf_get_raw_data(btf, &raw_size, false); + if (!raw_data) { + err = -ENOMEM; + goto done; + } + btf->raw_size = raw_size; + btf->raw_data = raw_data; + +retry_load: + /* if log_level is 0, we won't provide log_buf/log_size to the kernel, + * initially. Only if BTF loading fails, we bump log_level to 1 and + * retry, using either auto-allocated or custom log_buf. This way + * non-NULL custom log_buf provides a buffer just in case, but hopes + * for successful load and no need for log_buf. + */ + if (log_level) { + /* if caller didn't provide custom log_buf, we'll keep + * allocating our own progressively bigger buffers for BTF + * verification log + */ + if (!log_buf) { + buf_sz = max((__u32)BPF_LOG_BUF_SIZE, buf_sz * 2); + tmp = realloc(buf, buf_sz); + if (!tmp) { + err = -ENOMEM; + goto done; + } + buf = tmp; + buf[0] = '\0'; + } + + opts.log_buf = log_buf ? log_buf : buf; + opts.log_size = log_buf ? log_sz : buf_sz; + opts.log_level = log_level; + } + + btf->fd = bpf_btf_load(raw_data, raw_size, &opts); + if (btf->fd < 0) { + /* time to turn on verbose mode and try again */ + if (log_level == 0) { + log_level = 1; + goto retry_load; + } + /* only retry if caller didn't provide custom log_buf, but + * make sure we can never overflow buf_sz + */ + if (!log_buf && errno == ENOSPC && buf_sz <= UINT_MAX / 2) + goto retry_load; + + err = -errno; + pr_warn("BTF loading error: %d\n", err); + /* don't print out contents of custom log_buf */ + if (!log_buf && buf[0]) + pr_warn("-- BEGIN BTF LOAD LOG ---\n%s\n-- END BTF LOAD LOG --\n", buf); + } + +done: + free(buf); + return libbpf_err(err); +} + +int btf__load_into_kernel(struct btf *btf) +{ + return btf_load_into_kernel(btf, NULL, 0, 0); +} + +int btf__fd(const struct btf *btf) +{ + return btf->fd; +} + +void btf__set_fd(struct btf *btf, int fd) +{ + btf->fd = fd; +} + +static const void *btf_strs_data(const struct btf *btf) +{ + return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set); +} + +static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian) +{ + struct btf_header *hdr = btf->hdr; + struct btf_type *t; + void *data, *p; + __u32 data_sz; + int i; + + data = swap_endian ? btf->raw_data_swapped : btf->raw_data; + if (data) { + *size = btf->raw_size; + return data; + } + + data_sz = hdr->hdr_len + hdr->type_len + hdr->str_len; + data = calloc(1, data_sz); + if (!data) + return NULL; + p = data; + + memcpy(p, hdr, hdr->hdr_len); + if (swap_endian) + btf_bswap_hdr(p); + p += hdr->hdr_len; + + memcpy(p, btf->types_data, hdr->type_len); + if (swap_endian) { + for (i = 0; i < btf->nr_types; i++) { + t = p + btf->type_offs[i]; + /* btf_bswap_type_rest() relies on native t->info, so + * we swap base type info after we swapped all the + * additional information + */ + if (btf_bswap_type_rest(t)) + goto err_out; + btf_bswap_type_base(t); + } + } + p += hdr->type_len; + + memcpy(p, btf_strs_data(btf), hdr->str_len); + p += hdr->str_len; + + *size = data_sz; + return data; +err_out: + free(data); + return NULL; +} + +const void *btf__raw_data(const struct btf *btf_ro, __u32 *size) +{ + struct btf *btf = (struct btf *)btf_ro; + __u32 data_sz; + void *data; + + data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian); + if (!data) + return errno = ENOMEM, NULL; + + btf->raw_size = data_sz; + if (btf->swapped_endian) + btf->raw_data_swapped = data; + else + btf->raw_data = data; + *size = data_sz; + return data; +} + +__attribute__((alias("btf__raw_data"))) +const void *btf__get_raw_data(const struct btf *btf, __u32 *size); + +const char *btf__str_by_offset(const struct btf *btf, __u32 offset) +{ + if (offset < btf->start_str_off) + return btf__str_by_offset(btf->base_btf, offset); + else if (offset - btf->start_str_off < btf->hdr->str_len) + return btf_strs_data(btf) + (offset - btf->start_str_off); + else + return errno = EINVAL, NULL; +} + +const char *btf__name_by_offset(const struct btf *btf, __u32 offset) +{ + return btf__str_by_offset(btf, offset); +} + +struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf) +{ + struct bpf_btf_info btf_info; + __u32 len = sizeof(btf_info); + __u32 last_size; + struct btf *btf; + void *ptr; + int err; + + /* we won't know btf_size until we call bpf_btf_get_info_by_fd(). so + * let's start with a sane default - 4KiB here - and resize it only if + * bpf_btf_get_info_by_fd() needs a bigger buffer. + */ + last_size = 4096; + ptr = malloc(last_size); + if (!ptr) + return ERR_PTR(-ENOMEM); + + memset(&btf_info, 0, sizeof(btf_info)); + btf_info.btf = ptr_to_u64(ptr); + btf_info.btf_size = last_size; + err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len); + + if (!err && btf_info.btf_size > last_size) { + void *temp_ptr; + + last_size = btf_info.btf_size; + temp_ptr = realloc(ptr, last_size); + if (!temp_ptr) { + btf = ERR_PTR(-ENOMEM); + goto exit_free; + } + ptr = temp_ptr; + + len = sizeof(btf_info); + memset(&btf_info, 0, sizeof(btf_info)); + btf_info.btf = ptr_to_u64(ptr); + btf_info.btf_size = last_size; + + err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len); + } + + if (err || btf_info.btf_size > last_size) { + btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG); + goto exit_free; + } + + btf = btf_new(ptr, btf_info.btf_size, base_btf); + +exit_free: + free(ptr); + return btf; +} + +struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf) +{ + struct btf *btf; + int btf_fd; + + btf_fd = bpf_btf_get_fd_by_id(id); + if (btf_fd < 0) + return libbpf_err_ptr(-errno); + + btf = btf_get_from_fd(btf_fd, base_btf); + close(btf_fd); + + return libbpf_ptr(btf); +} + +struct btf *btf__load_from_kernel_by_id(__u32 id) +{ + return btf__load_from_kernel_by_id_split(id, NULL); +} + +static void btf_invalidate_raw_data(struct btf *btf) +{ + if (btf->raw_data) { + free(btf->raw_data); + btf->raw_data = NULL; + } + if (btf->raw_data_swapped) { + free(btf->raw_data_swapped); + btf->raw_data_swapped = NULL; + } +} + +/* Ensure BTF is ready to be modified (by splitting into a three memory + * regions for header, types, and strings). Also invalidate cached + * raw_data, if any. + */ +static int btf_ensure_modifiable(struct btf *btf) +{ + void *hdr, *types; + struct strset *set = NULL; + int err = -ENOMEM; + + if (btf_is_modifiable(btf)) { + /* any BTF modification invalidates raw_data */ + btf_invalidate_raw_data(btf); + return 0; + } + + /* split raw data into three memory regions */ + hdr = malloc(btf->hdr->hdr_len); + types = malloc(btf->hdr->type_len); + if (!hdr || !types) + goto err_out; + + memcpy(hdr, btf->hdr, btf->hdr->hdr_len); + memcpy(types, btf->types_data, btf->hdr->type_len); + + /* build lookup index for all strings */ + set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len); + if (IS_ERR(set)) { + err = PTR_ERR(set); + goto err_out; + } + + /* only when everything was successful, update internal state */ + btf->hdr = hdr; + btf->types_data = types; + btf->types_data_cap = btf->hdr->type_len; + btf->strs_data = NULL; + btf->strs_set = set; + /* if BTF was created from scratch, all strings are guaranteed to be + * unique and deduplicated + */ + if (btf->hdr->str_len == 0) + btf->strs_deduped = true; + if (!btf->base_btf && btf->hdr->str_len == 1) + btf->strs_deduped = true; + + /* invalidate raw_data representation */ + btf_invalidate_raw_data(btf); + + return 0; + +err_out: + strset__free(set); + free(hdr); + free(types); + return err; +} + +/* Find an offset in BTF string section that corresponds to a given string *s*. + * Returns: + * - >0 offset into string section, if string is found; + * - -ENOENT, if string is not in the string section; + * - <0, on any other error. + */ +int btf__find_str(struct btf *btf, const char *s) +{ + int off; + + if (btf->base_btf) { + off = btf__find_str(btf->base_btf, s); + if (off != -ENOENT) + return off; + } + + /* BTF needs to be in a modifiable state to build string lookup index */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + off = strset__find_str(btf->strs_set, s); + if (off < 0) + return libbpf_err(off); + + return btf->start_str_off + off; +} + +/* Add a string s to the BTF string section. + * Returns: + * - > 0 offset into string section, on success; + * - < 0, on error. + */ +int btf__add_str(struct btf *btf, const char *s) +{ + int off; + + if (btf->base_btf) { + off = btf__find_str(btf->base_btf, s); + if (off != -ENOENT) + return off; + } + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + off = strset__add_str(btf->strs_set, s); + if (off < 0) + return libbpf_err(off); + + btf->hdr->str_len = strset__data_size(btf->strs_set); + + return btf->start_str_off + off; +} + +static void *btf_add_type_mem(struct btf *btf, size_t add_sz) +{ + return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1, + btf->hdr->type_len, UINT_MAX, add_sz); +} + +static void btf_type_inc_vlen(struct btf_type *t) +{ + t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, btf_kflag(t)); +} + +static int btf_commit_type(struct btf *btf, int data_sz) +{ + int err; + + err = btf_add_type_idx_entry(btf, btf->hdr->type_len); + if (err) + return libbpf_err(err); + + btf->hdr->type_len += data_sz; + btf->hdr->str_off += data_sz; + btf->nr_types++; + return btf->start_id + btf->nr_types - 1; +} + +struct btf_pipe { + const struct btf *src; + struct btf *dst; + struct hashmap *str_off_map; /* map string offsets from src to dst */ +}; + +static int btf_rewrite_str(__u32 *str_off, void *ctx) +{ + struct btf_pipe *p = ctx; + long mapped_off; + int off, err; + + if (!*str_off) /* nothing to do for empty strings */ + return 0; + + if (p->str_off_map && + hashmap__find(p->str_off_map, *str_off, &mapped_off)) { + *str_off = mapped_off; + return 0; + } + + off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off)); + if (off < 0) + return off; + + /* Remember string mapping from src to dst. It avoids + * performing expensive string comparisons. + */ + if (p->str_off_map) { + err = hashmap__append(p->str_off_map, *str_off, off); + if (err) + return err; + } + + *str_off = off; + return 0; +} + +int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type) +{ + struct btf_pipe p = { .src = src_btf, .dst = btf }; + struct btf_type *t; + int sz, err; + + sz = btf_type_size(src_type); + if (sz < 0) + return libbpf_err(sz); + + /* deconstruct BTF, if necessary, and invalidate raw_data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + memcpy(t, src_type, sz); + + err = btf_type_visit_str_offs(t, btf_rewrite_str, &p); + if (err) + return libbpf_err(err); + + return btf_commit_type(btf, sz); +} + +static int btf_rewrite_type_ids(__u32 *type_id, void *ctx) +{ + struct btf *btf = ctx; + + if (!*type_id) /* nothing to do for VOID references */ + return 0; + + /* we haven't updated btf's type count yet, so + * btf->start_id + btf->nr_types - 1 is the type ID offset we should + * add to all newly added BTF types + */ + *type_id += btf->start_id + btf->nr_types - 1; + return 0; +} + +static size_t btf_dedup_identity_hash_fn(long key, void *ctx); +static bool btf_dedup_equal_fn(long k1, long k2, void *ctx); + +int btf__add_btf(struct btf *btf, const struct btf *src_btf) +{ + struct btf_pipe p = { .src = src_btf, .dst = btf }; + int data_sz, sz, cnt, i, err, old_strs_len; + __u32 *off; + void *t; + + /* appending split BTF isn't supported yet */ + if (src_btf->base_btf) + return libbpf_err(-ENOTSUP); + + /* deconstruct BTF, if necessary, and invalidate raw_data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + /* remember original strings section size if we have to roll back + * partial strings section changes + */ + old_strs_len = btf->hdr->str_len; + + data_sz = src_btf->hdr->type_len; + cnt = btf__type_cnt(src_btf) - 1; + + /* pre-allocate enough memory for new types */ + t = btf_add_type_mem(btf, data_sz); + if (!t) + return libbpf_err(-ENOMEM); + + /* pre-allocate enough memory for type offset index for new types */ + off = btf_add_type_offs_mem(btf, cnt); + if (!off) + return libbpf_err(-ENOMEM); + + /* Map the string offsets from src_btf to the offsets from btf to improve performance */ + p.str_off_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL); + if (IS_ERR(p.str_off_map)) + return libbpf_err(-ENOMEM); + + /* bulk copy types data for all types from src_btf */ + memcpy(t, src_btf->types_data, data_sz); + + for (i = 0; i < cnt; i++) { + sz = btf_type_size(t); + if (sz < 0) { + /* unlikely, has to be corrupted src_btf */ + err = sz; + goto err_out; + } + + /* fill out type ID to type offset mapping for lookups by type ID */ + *off = t - btf->types_data; + + /* add, dedup, and remap strings referenced by this BTF type */ + err = btf_type_visit_str_offs(t, btf_rewrite_str, &p); + if (err) + goto err_out; + + /* remap all type IDs referenced from this BTF type */ + err = btf_type_visit_type_ids(t, btf_rewrite_type_ids, btf); + if (err) + goto err_out; + + /* go to next type data and type offset index entry */ + t += sz; + off++; + } + + /* Up until now any of the copied type data was effectively invisible, + * so if we exited early before this point due to error, BTF would be + * effectively unmodified. There would be extra internal memory + * pre-allocated, but it would not be available for querying. But now + * that we've copied and rewritten all the data successfully, we can + * update type count and various internal offsets and sizes to + * "commit" the changes and made them visible to the outside world. + */ + btf->hdr->type_len += data_sz; + btf->hdr->str_off += data_sz; + btf->nr_types += cnt; + + hashmap__free(p.str_off_map); + + /* return type ID of the first added BTF type */ + return btf->start_id + btf->nr_types - cnt; +err_out: + /* zero out preallocated memory as if it was just allocated with + * libbpf_add_mem() + */ + memset(btf->types_data + btf->hdr->type_len, 0, data_sz); + memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len); + + /* and now restore original strings section size; types data size + * wasn't modified, so doesn't need restoring, see big comment above + */ + btf->hdr->str_len = old_strs_len; + + hashmap__free(p.str_off_map); + + return libbpf_err(err); +} + +/* + * Append new BTF_KIND_INT type with: + * - *name* - non-empty, non-NULL type name; + * - *sz* - power-of-2 (1, 2, 4, ..) size of the type, in bytes; + * - encoding is a combination of BTF_INT_SIGNED, BTF_INT_CHAR, BTF_INT_BOOL. + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding) +{ + struct btf_type *t; + int sz, name_off; + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + /* byte_sz must be power of 2 */ + if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 16) + return libbpf_err(-EINVAL); + if (encoding & ~(BTF_INT_SIGNED | BTF_INT_CHAR | BTF_INT_BOOL)) + return libbpf_err(-EINVAL); + + /* deconstruct BTF, if necessary, and invalidate raw_data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type) + sizeof(int); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + /* if something goes wrong later, we might end up with an extra string, + * but that shouldn't be a problem, because BTF can't be constructed + * completely anyway and will most probably be just discarded + */ + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + t->name_off = name_off; + t->info = btf_type_info(BTF_KIND_INT, 0, 0); + t->size = byte_sz; + /* set INT info, we don't allow setting legacy bit offset/size */ + *(__u32 *)(t + 1) = (encoding << 24) | (byte_sz * 8); + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_FLOAT type with: + * - *name* - non-empty, non-NULL type name; + * - *sz* - size of the type, in bytes; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_float(struct btf *btf, const char *name, size_t byte_sz) +{ + struct btf_type *t; + int sz, name_off; + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + /* byte_sz must be one of the explicitly allowed values */ + if (byte_sz != 2 && byte_sz != 4 && byte_sz != 8 && byte_sz != 12 && + byte_sz != 16) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + t->name_off = name_off; + t->info = btf_type_info(BTF_KIND_FLOAT, 0, 0); + t->size = byte_sz; + + return btf_commit_type(btf, sz); +} + +/* it's completely legal to append BTF types with type IDs pointing forward to + * types that haven't been appended yet, so we only make sure that id looks + * sane, we can't guarantee that ID will always be valid + */ +static int validate_type_id(int id) +{ + if (id < 0 || id > BTF_MAX_NR_TYPES) + return -EINVAL; + return 0; +} + +/* generic append function for PTR, TYPEDEF, CONST/VOLATILE/RESTRICT */ +static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id) +{ + struct btf_type *t; + int sz, name_off = 0; + + if (validate_type_id(ref_type_id)) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + t->name_off = name_off; + t->info = btf_type_info(kind, 0, 0); + t->type = ref_type_id; + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_PTR type with: + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_ptr(struct btf *btf, int ref_type_id) +{ + return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id); +} + +/* + * Append new BTF_KIND_ARRAY type with: + * - *index_type_id* - type ID of the type describing array index; + * - *elem_type_id* - type ID of the type describing array element; + * - *nr_elems* - the size of the array; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems) +{ + struct btf_type *t; + struct btf_array *a; + int sz; + + if (validate_type_id(index_type_id) || validate_type_id(elem_type_id)) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type) + sizeof(struct btf_array); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + t->name_off = 0; + t->info = btf_type_info(BTF_KIND_ARRAY, 0, 0); + t->size = 0; + + a = btf_array(t); + a->type = elem_type_id; + a->index_type = index_type_id; + a->nelems = nr_elems; + + return btf_commit_type(btf, sz); +} + +/* generic STRUCT/UNION append function */ +static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz) +{ + struct btf_type *t; + int sz, name_off = 0; + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + /* start out with vlen=0 and no kflag; this will be adjusted when + * adding each member + */ + t->name_off = name_off; + t->info = btf_type_info(kind, 0, 0); + t->size = bytes_sz; + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_STRUCT type with: + * - *name* - name of the struct, can be NULL or empty for anonymous structs; + * - *byte_sz* - size of the struct, in bytes; + * + * Struct initially has no fields in it. Fields can be added by + * btf__add_field() right after btf__add_struct() succeeds. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz) +{ + return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz); +} + +/* + * Append new BTF_KIND_UNION type with: + * - *name* - name of the union, can be NULL or empty for anonymous union; + * - *byte_sz* - size of the union, in bytes; + * + * Union initially has no fields in it. Fields can be added by + * btf__add_field() right after btf__add_union() succeeds. All fields + * should have *bit_offset* of 0. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz) +{ + return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz); +} + +static struct btf_type *btf_last_type(struct btf *btf) +{ + return btf_type_by_id(btf, btf__type_cnt(btf) - 1); +} + +/* + * Append new field for the current STRUCT/UNION type with: + * - *name* - name of the field, can be NULL or empty for anonymous field; + * - *type_id* - type ID for the type describing field type; + * - *bit_offset* - bit offset of the start of the field within struct/union; + * - *bit_size* - bit size of a bitfield, 0 for non-bitfield fields; + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_field(struct btf *btf, const char *name, int type_id, + __u32 bit_offset, __u32 bit_size) +{ + struct btf_type *t; + struct btf_member *m; + bool is_bitfield; + int sz, name_off = 0; + + /* last type should be union/struct */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_composite(t)) + return libbpf_err(-EINVAL); + + if (validate_type_id(type_id)) + return libbpf_err(-EINVAL); + /* best-effort bit field offset/size enforcement */ + is_bitfield = bit_size || (bit_offset % 8 != 0); + if (is_bitfield && (bit_size == 0 || bit_size > 255 || bit_offset > 0xffffff)) + return libbpf_err(-EINVAL); + + /* only offset 0 is allowed for unions */ + if (btf_is_union(t) && bit_offset) + return libbpf_err(-EINVAL); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_member); + m = btf_add_type_mem(btf, sz); + if (!m) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + m->name_off = name_off; + m->type = type_id; + m->offset = bit_offset | (bit_size << 24); + + /* btf_add_type_mem can invalidate t pointer */ + t = btf_last_type(btf); + /* update parent type's vlen and kflag */ + t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, is_bitfield || btf_kflag(t)); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz, + bool is_signed, __u8 kind) +{ + struct btf_type *t; + int sz, name_off = 0; + + /* byte_sz must be power of 2 */ + if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 8) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + /* start out with vlen=0; it will be adjusted when adding enum values */ + t->name_off = name_off; + t->info = btf_type_info(kind, 0, is_signed); + t->size = byte_sz; + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_ENUM type with: + * - *name* - name of the enum, can be NULL or empty for anonymous enums; + * - *byte_sz* - size of the enum, in bytes. + * + * Enum initially has no enum values in it (and corresponds to enum forward + * declaration). Enumerator values can be added by btf__add_enum_value() + * immediately after btf__add_enum() succeeds. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz) +{ + /* + * set the signedness to be unsigned, it will change to signed + * if any later enumerator is negative. + */ + return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM); +} + +/* + * Append new enum value for the current ENUM type with: + * - *name* - name of the enumerator value, can't be NULL or empty; + * - *value* - integer value corresponding to enum value *name*; + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_enum_value(struct btf *btf, const char *name, __s64 value) +{ + struct btf_type *t; + struct btf_enum *v; + int sz, name_off; + + /* last type should be BTF_KIND_ENUM */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_enum(t)) + return libbpf_err(-EINVAL); + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + if (value < INT_MIN || value > UINT_MAX) + return libbpf_err(-E2BIG); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_enum); + v = btf_add_type_mem(btf, sz); + if (!v) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + v->name_off = name_off; + v->val = value; + + /* update parent type's vlen */ + t = btf_last_type(btf); + btf_type_inc_vlen(t); + + /* if negative value, set signedness to signed */ + if (value < 0) + t->info = btf_type_info(btf_kind(t), btf_vlen(t), true); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +/* + * Append new BTF_KIND_ENUM64 type with: + * - *name* - name of the enum, can be NULL or empty for anonymous enums; + * - *byte_sz* - size of the enum, in bytes. + * - *is_signed* - whether the enum values are signed or not; + * + * Enum initially has no enum values in it (and corresponds to enum forward + * declaration). Enumerator values can be added by btf__add_enum64_value() + * immediately after btf__add_enum64() succeeds. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz, + bool is_signed) +{ + return btf_add_enum_common(btf, name, byte_sz, is_signed, + BTF_KIND_ENUM64); +} + +/* + * Append new enum value for the current ENUM64 type with: + * - *name* - name of the enumerator value, can't be NULL or empty; + * - *value* - integer value corresponding to enum value *name*; + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value) +{ + struct btf_enum64 *v; + struct btf_type *t; + int sz, name_off; + + /* last type should be BTF_KIND_ENUM64 */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_enum64(t)) + return libbpf_err(-EINVAL); + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_enum64); + v = btf_add_type_mem(btf, sz); + if (!v) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + v->name_off = name_off; + v->val_lo32 = (__u32)value; + v->val_hi32 = value >> 32; + + /* update parent type's vlen */ + t = btf_last_type(btf); + btf_type_inc_vlen(t); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +/* + * Append new BTF_KIND_FWD type with: + * - *name*, non-empty/non-NULL name; + * - *fwd_kind*, kind of forward declaration, one of BTF_FWD_STRUCT, + * BTF_FWD_UNION, or BTF_FWD_ENUM; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind) +{ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + switch (fwd_kind) { + case BTF_FWD_STRUCT: + case BTF_FWD_UNION: { + struct btf_type *t; + int id; + + id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0); + if (id <= 0) + return id; + t = btf_type_by_id(btf, id); + t->info = btf_type_info(BTF_KIND_FWD, 0, fwd_kind == BTF_FWD_UNION); + return id; + } + case BTF_FWD_ENUM: + /* enum forward in BTF currently is just an enum with no enum + * values; we also assume a standard 4-byte size for it + */ + return btf__add_enum(btf, name, sizeof(int)); + default: + return libbpf_err(-EINVAL); + } +} + +/* + * Append new BTF_KING_TYPEDEF type with: + * - *name*, non-empty/non-NULL name; + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id) +{ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id); +} + +/* + * Append new BTF_KIND_VOLATILE type with: + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_volatile(struct btf *btf, int ref_type_id) +{ + return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id); +} + +/* + * Append new BTF_KIND_CONST type with: + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_const(struct btf *btf, int ref_type_id) +{ + return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id); +} + +/* + * Append new BTF_KIND_RESTRICT type with: + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_restrict(struct btf *btf, int ref_type_id) +{ + return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id); +} + +/* + * Append new BTF_KIND_TYPE_TAG type with: + * - *value*, non-empty/non-NULL tag value; + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id) +{ + if (!value || !value[0]) + return libbpf_err(-EINVAL); + + return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id); +} + +/* + * Append new BTF_KIND_FUNC type with: + * - *name*, non-empty/non-NULL name; + * - *proto_type_id* - FUNC_PROTO's type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_func(struct btf *btf, const char *name, + enum btf_func_linkage linkage, int proto_type_id) +{ + int id; + + if (!name || !name[0]) + return libbpf_err(-EINVAL); + if (linkage != BTF_FUNC_STATIC && linkage != BTF_FUNC_GLOBAL && + linkage != BTF_FUNC_EXTERN) + return libbpf_err(-EINVAL); + + id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id); + if (id > 0) { + struct btf_type *t = btf_type_by_id(btf, id); + + t->info = btf_type_info(BTF_KIND_FUNC, linkage, 0); + } + return libbpf_err(id); +} + +/* + * Append new BTF_KIND_FUNC_PROTO with: + * - *ret_type_id* - type ID for return result of a function. + * + * Function prototype initially has no arguments, but they can be added by + * btf__add_func_param() one by one, immediately after + * btf__add_func_proto() succeeded. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_func_proto(struct btf *btf, int ret_type_id) +{ + struct btf_type *t; + int sz; + + if (validate_type_id(ret_type_id)) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + /* start out with vlen=0; this will be adjusted when adding enum + * values, if necessary + */ + t->name_off = 0; + t->info = btf_type_info(BTF_KIND_FUNC_PROTO, 0, 0); + t->type = ret_type_id; + + return btf_commit_type(btf, sz); +} + +/* + * Append new function parameter for current FUNC_PROTO type with: + * - *name* - parameter name, can be NULL or empty; + * - *type_id* - type ID describing the type of the parameter. + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_func_param(struct btf *btf, const char *name, int type_id) +{ + struct btf_type *t; + struct btf_param *p; + int sz, name_off = 0; + + if (validate_type_id(type_id)) + return libbpf_err(-EINVAL); + + /* last type should be BTF_KIND_FUNC_PROTO */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_func_proto(t)) + return libbpf_err(-EINVAL); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_param); + p = btf_add_type_mem(btf, sz); + if (!p) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + p->name_off = name_off; + p->type = type_id; + + /* update parent type's vlen */ + t = btf_last_type(btf); + btf_type_inc_vlen(t); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +/* + * Append new BTF_KIND_VAR type with: + * - *name* - non-empty/non-NULL name; + * - *linkage* - variable linkage, one of BTF_VAR_STATIC, + * BTF_VAR_GLOBAL_ALLOCATED, or BTF_VAR_GLOBAL_EXTERN; + * - *type_id* - type ID of the type describing the type of the variable. + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id) +{ + struct btf_type *t; + struct btf_var *v; + int sz, name_off; + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + if (linkage != BTF_VAR_STATIC && linkage != BTF_VAR_GLOBAL_ALLOCATED && + linkage != BTF_VAR_GLOBAL_EXTERN) + return libbpf_err(-EINVAL); + if (validate_type_id(type_id)) + return libbpf_err(-EINVAL); + + /* deconstruct BTF, if necessary, and invalidate raw_data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type) + sizeof(struct btf_var); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + t->name_off = name_off; + t->info = btf_type_info(BTF_KIND_VAR, 0, 0); + t->type = type_id; + + v = btf_var(t); + v->linkage = linkage; + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_DATASEC type with: + * - *name* - non-empty/non-NULL name; + * - *byte_sz* - data section size, in bytes. + * + * Data section is initially empty. Variables info can be added with + * btf__add_datasec_var_info() calls, after btf__add_datasec() succeeds. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz) +{ + struct btf_type *t; + int sz, name_off; + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + /* start with vlen=0, which will be update as var_secinfos are added */ + t->name_off = name_off; + t->info = btf_type_info(BTF_KIND_DATASEC, 0, 0); + t->size = byte_sz; + + return btf_commit_type(btf, sz); +} + +/* + * Append new data section variable information entry for current DATASEC type: + * - *var_type_id* - type ID, describing type of the variable; + * - *offset* - variable offset within data section, in bytes; + * - *byte_sz* - variable size, in bytes. + * + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __u32 byte_sz) +{ + struct btf_type *t; + struct btf_var_secinfo *v; + int sz; + + /* last type should be BTF_KIND_DATASEC */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_datasec(t)) + return libbpf_err(-EINVAL); + + if (validate_type_id(var_type_id)) + return libbpf_err(-EINVAL); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_var_secinfo); + v = btf_add_type_mem(btf, sz); + if (!v) + return libbpf_err(-ENOMEM); + + v->type = var_type_id; + v->offset = offset; + v->size = byte_sz; + + /* update parent type's vlen */ + t = btf_last_type(btf); + btf_type_inc_vlen(t); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +/* + * Append new BTF_KIND_DECL_TAG type with: + * - *value* - non-empty/non-NULL string; + * - *ref_type_id* - referenced type ID, it might not exist yet; + * - *component_idx* - -1 for tagging reference type, otherwise struct/union + * member or function argument index; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, + int component_idx) +{ + struct btf_type *t; + int sz, value_off; + + if (!value || !value[0] || component_idx < -1) + return libbpf_err(-EINVAL); + + if (validate_type_id(ref_type_id)) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type) + sizeof(struct btf_decl_tag); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + value_off = btf__add_str(btf, value); + if (value_off < 0) + return value_off; + + t->name_off = value_off; + t->info = btf_type_info(BTF_KIND_DECL_TAG, 0, false); + t->type = ref_type_id; + btf_decl_tag(t)->component_idx = component_idx; + + return btf_commit_type(btf, sz); +} + +struct btf_ext_sec_setup_param { + __u32 off; + __u32 len; + __u32 min_rec_size; + struct btf_ext_info *ext_info; + const char *desc; +}; + +static int btf_ext_setup_info(struct btf_ext *btf_ext, + struct btf_ext_sec_setup_param *ext_sec) +{ + const struct btf_ext_info_sec *sinfo; + struct btf_ext_info *ext_info; + __u32 info_left, record_size; + size_t sec_cnt = 0; + /* The start of the info sec (including the __u32 record_size). */ + void *info; + + if (ext_sec->len == 0) + return 0; + + if (ext_sec->off & 0x03) { + pr_debug(".BTF.ext %s section is not aligned to 4 bytes\n", + ext_sec->desc); + return -EINVAL; + } + + info = btf_ext->data + btf_ext->hdr->hdr_len + ext_sec->off; + info_left = ext_sec->len; + + if (btf_ext->data + btf_ext->data_size < info + ext_sec->len) { + pr_debug("%s section (off:%u len:%u) is beyond the end of the ELF section .BTF.ext\n", + ext_sec->desc, ext_sec->off, ext_sec->len); + return -EINVAL; + } + + /* At least a record size */ + if (info_left < sizeof(__u32)) { + pr_debug(".BTF.ext %s record size not found\n", ext_sec->desc); + return -EINVAL; + } + + /* The record size needs to meet the minimum standard */ + record_size = *(__u32 *)info; + if (record_size < ext_sec->min_rec_size || + record_size & 0x03) { + pr_debug("%s section in .BTF.ext has invalid record size %u\n", + ext_sec->desc, record_size); + return -EINVAL; + } + + sinfo = info + sizeof(__u32); + info_left -= sizeof(__u32); + + /* If no records, return failure now so .BTF.ext won't be used. */ + if (!info_left) { + pr_debug("%s section in .BTF.ext has no records", ext_sec->desc); + return -EINVAL; + } + + while (info_left) { + unsigned int sec_hdrlen = sizeof(struct btf_ext_info_sec); + __u64 total_record_size; + __u32 num_records; + + if (info_left < sec_hdrlen) { + pr_debug("%s section header is not found in .BTF.ext\n", + ext_sec->desc); + return -EINVAL; + } + + num_records = sinfo->num_info; + if (num_records == 0) { + pr_debug("%s section has incorrect num_records in .BTF.ext\n", + ext_sec->desc); + return -EINVAL; + } + + total_record_size = sec_hdrlen + (__u64)num_records * record_size; + if (info_left < total_record_size) { + pr_debug("%s section has incorrect num_records in .BTF.ext\n", + ext_sec->desc); + return -EINVAL; + } + + info_left -= total_record_size; + sinfo = (void *)sinfo + total_record_size; + sec_cnt++; + } + + ext_info = ext_sec->ext_info; + ext_info->len = ext_sec->len - sizeof(__u32); + ext_info->rec_size = record_size; + ext_info->info = info + sizeof(__u32); + ext_info->sec_cnt = sec_cnt; + + return 0; +} + +static int btf_ext_setup_func_info(struct btf_ext *btf_ext) +{ + struct btf_ext_sec_setup_param param = { + .off = btf_ext->hdr->func_info_off, + .len = btf_ext->hdr->func_info_len, + .min_rec_size = sizeof(struct bpf_func_info_min), + .ext_info = &btf_ext->func_info, + .desc = "func_info" + }; + + return btf_ext_setup_info(btf_ext, ¶m); +} + +static int btf_ext_setup_line_info(struct btf_ext *btf_ext) +{ + struct btf_ext_sec_setup_param param = { + .off = btf_ext->hdr->line_info_off, + .len = btf_ext->hdr->line_info_len, + .min_rec_size = sizeof(struct bpf_line_info_min), + .ext_info = &btf_ext->line_info, + .desc = "line_info", + }; + + return btf_ext_setup_info(btf_ext, ¶m); +} + +static int btf_ext_setup_core_relos(struct btf_ext *btf_ext) +{ + struct btf_ext_sec_setup_param param = { + .off = btf_ext->hdr->core_relo_off, + .len = btf_ext->hdr->core_relo_len, + .min_rec_size = sizeof(struct bpf_core_relo), + .ext_info = &btf_ext->core_relo_info, + .desc = "core_relo", + }; + + return btf_ext_setup_info(btf_ext, ¶m); +} + +static int btf_ext_parse_hdr(__u8 *data, __u32 data_size) +{ + const struct btf_ext_header *hdr = (struct btf_ext_header *)data; + + if (data_size < offsetofend(struct btf_ext_header, hdr_len) || + data_size < hdr->hdr_len) { + pr_debug("BTF.ext header not found"); + return -EINVAL; + } + + if (hdr->magic == bswap_16(BTF_MAGIC)) { + pr_warn("BTF.ext in non-native endianness is not supported\n"); + return -ENOTSUP; + } else if (hdr->magic != BTF_MAGIC) { + pr_debug("Invalid BTF.ext magic:%x\n", hdr->magic); + return -EINVAL; + } + + if (hdr->version != BTF_VERSION) { + pr_debug("Unsupported BTF.ext version:%u\n", hdr->version); + return -ENOTSUP; + } + + if (hdr->flags) { + pr_debug("Unsupported BTF.ext flags:%x\n", hdr->flags); + return -ENOTSUP; + } + + if (data_size == hdr->hdr_len) { + pr_debug("BTF.ext has no data\n"); + return -EINVAL; + } + + return 0; +} + +void btf_ext__free(struct btf_ext *btf_ext) +{ + if (IS_ERR_OR_NULL(btf_ext)) + return; + free(btf_ext->func_info.sec_idxs); + free(btf_ext->line_info.sec_idxs); + free(btf_ext->core_relo_info.sec_idxs); + free(btf_ext->data); + free(btf_ext); +} + +struct btf_ext *btf_ext__new(const __u8 *data, __u32 size) +{ + struct btf_ext *btf_ext; + int err; + + btf_ext = calloc(1, sizeof(struct btf_ext)); + if (!btf_ext) + return libbpf_err_ptr(-ENOMEM); + + btf_ext->data_size = size; + btf_ext->data = malloc(size); + if (!btf_ext->data) { + err = -ENOMEM; + goto done; + } + memcpy(btf_ext->data, data, size); + + err = btf_ext_parse_hdr(btf_ext->data, size); + if (err) + goto done; + + if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, line_info_len)) { + err = -EINVAL; + goto done; + } + + err = btf_ext_setup_func_info(btf_ext); + if (err) + goto done; + + err = btf_ext_setup_line_info(btf_ext); + if (err) + goto done; + + if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, core_relo_len)) + goto done; /* skip core relos parsing */ + + err = btf_ext_setup_core_relos(btf_ext); + if (err) + goto done; + +done: + if (err) { + btf_ext__free(btf_ext); + return libbpf_err_ptr(err); + } + + return btf_ext; +} + +const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size) +{ + *size = btf_ext->data_size; + return btf_ext->data; +} + +struct btf_dedup; + +static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts); +static void btf_dedup_free(struct btf_dedup *d); +static int btf_dedup_prep(struct btf_dedup *d); +static int btf_dedup_strings(struct btf_dedup *d); +static int btf_dedup_prim_types(struct btf_dedup *d); +static int btf_dedup_struct_types(struct btf_dedup *d); +static int btf_dedup_ref_types(struct btf_dedup *d); +static int btf_dedup_resolve_fwds(struct btf_dedup *d); +static int btf_dedup_compact_types(struct btf_dedup *d); +static int btf_dedup_remap_types(struct btf_dedup *d); + +/* + * Deduplicate BTF types and strings. + * + * BTF dedup algorithm takes as an input `struct btf` representing `.BTF` ELF + * section with all BTF type descriptors and string data. It overwrites that + * memory in-place with deduplicated types and strings without any loss of + * information. If optional `struct btf_ext` representing '.BTF.ext' ELF section + * is provided, all the strings referenced from .BTF.ext section are honored + * and updated to point to the right offsets after deduplication. + * + * If function returns with error, type/string data might be garbled and should + * be discarded. + * + * More verbose and detailed description of both problem btf_dedup is solving, + * as well as solution could be found at: + * https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html + * + * Problem description and justification + * ===================================== + * + * BTF type information is typically emitted either as a result of conversion + * from DWARF to BTF or directly by compiler. In both cases, each compilation + * unit contains information about a subset of all the types that are used + * in an application. These subsets are frequently overlapping and contain a lot + * of duplicated information when later concatenated together into a single + * binary. This algorithm ensures that each unique type is represented by single + * BTF type descriptor, greatly reducing resulting size of BTF data. + * + * Compilation unit isolation and subsequent duplication of data is not the only + * problem. The same type hierarchy (e.g., struct and all the type that struct + * references) in different compilation units can be represented in BTF to + * various degrees of completeness (or, rather, incompleteness) due to + * struct/union forward declarations. + * + * Let's take a look at an example, that we'll use to better understand the + * problem (and solution). Suppose we have two compilation units, each using + * same `struct S`, but each of them having incomplete type information about + * struct's fields: + * + * // CU #1: + * struct S; + * struct A { + * int a; + * struct A* self; + * struct S* parent; + * }; + * struct B; + * struct S { + * struct A* a_ptr; + * struct B* b_ptr; + * }; + * + * // CU #2: + * struct S; + * struct A; + * struct B { + * int b; + * struct B* self; + * struct S* parent; + * }; + * struct S { + * struct A* a_ptr; + * struct B* b_ptr; + * }; + * + * In case of CU #1, BTF data will know only that `struct B` exist (but no + * more), but will know the complete type information about `struct A`. While + * for CU #2, it will know full type information about `struct B`, but will + * only know about forward declaration of `struct A` (in BTF terms, it will + * have `BTF_KIND_FWD` type descriptor with name `B`). + * + * This compilation unit isolation means that it's possible that there is no + * single CU with complete type information describing structs `S`, `A`, and + * `B`. Also, we might get tons of duplicated and redundant type information. + * + * Additional complication we need to keep in mind comes from the fact that + * types, in general, can form graphs containing cycles, not just DAGs. + * + * While algorithm does deduplication, it also merges and resolves type + * information (unless disabled throught `struct btf_opts`), whenever possible. + * E.g., in the example above with two compilation units having partial type + * information for structs `A` and `B`, the output of algorithm will emit + * a single copy of each BTF type that describes structs `A`, `B`, and `S` + * (as well as type information for `int` and pointers), as if they were defined + * in a single compilation unit as: + * + * struct A { + * int a; + * struct A* self; + * struct S* parent; + * }; + * struct B { + * int b; + * struct B* self; + * struct S* parent; + * }; + * struct S { + * struct A* a_ptr; + * struct B* b_ptr; + * }; + * + * Algorithm summary + * ================= + * + * Algorithm completes its work in 7 separate passes: + * + * 1. Strings deduplication. + * 2. Primitive types deduplication (int, enum, fwd). + * 3. Struct/union types deduplication. + * 4. Resolve unambiguous forward declarations. + * 5. Reference types deduplication (pointers, typedefs, arrays, funcs, func + * protos, and const/volatile/restrict modifiers). + * 6. Types compaction. + * 7. Types remapping. + * + * Algorithm determines canonical type descriptor, which is a single + * representative type for each truly unique type. This canonical type is the + * one that will go into final deduplicated BTF type information. For + * struct/unions, it is also the type that algorithm will merge additional type + * information into (while resolving FWDs), as it discovers it from data in + * other CUs. Each input BTF type eventually gets either mapped to itself, if + * that type is canonical, or to some other type, if that type is equivalent + * and was chosen as canonical representative. This mapping is stored in + * `btf_dedup->map` array. This map is also used to record STRUCT/UNION that + * FWD type got resolved to. + * + * To facilitate fast discovery of canonical types, we also maintain canonical + * index (`btf_dedup->dedup_table`), which maps type descriptor's signature hash + * (i.e., hashed kind, name, size, fields, etc) into a list of canonical types + * that match that signature. With sufficiently good choice of type signature + * hashing function, we can limit number of canonical types for each unique type + * signature to a very small number, allowing to find canonical type for any + * duplicated type very quickly. + * + * Struct/union deduplication is the most critical part and algorithm for + * deduplicating structs/unions is described in greater details in comments for + * `btf_dedup_is_equiv` function. + */ +int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts) +{ + struct btf_dedup *d; + int err; + + if (!OPTS_VALID(opts, btf_dedup_opts)) + return libbpf_err(-EINVAL); + + d = btf_dedup_new(btf, opts); + if (IS_ERR(d)) { + pr_debug("btf_dedup_new failed: %ld", PTR_ERR(d)); + return libbpf_err(-EINVAL); + } + + if (btf_ensure_modifiable(btf)) { + err = -ENOMEM; + goto done; + } + + err = btf_dedup_prep(d); + if (err) { + pr_debug("btf_dedup_prep failed:%d\n", err); + goto done; + } + err = btf_dedup_strings(d); + if (err < 0) { + pr_debug("btf_dedup_strings failed:%d\n", err); + goto done; + } + err = btf_dedup_prim_types(d); + if (err < 0) { + pr_debug("btf_dedup_prim_types failed:%d\n", err); + goto done; + } + err = btf_dedup_struct_types(d); + if (err < 0) { + pr_debug("btf_dedup_struct_types failed:%d\n", err); + goto done; + } + err = btf_dedup_resolve_fwds(d); + if (err < 0) { + pr_debug("btf_dedup_resolve_fwds failed:%d\n", err); + goto done; + } + err = btf_dedup_ref_types(d); + if (err < 0) { + pr_debug("btf_dedup_ref_types failed:%d\n", err); + goto done; + } + err = btf_dedup_compact_types(d); + if (err < 0) { + pr_debug("btf_dedup_compact_types failed:%d\n", err); + goto done; + } + err = btf_dedup_remap_types(d); + if (err < 0) { + pr_debug("btf_dedup_remap_types failed:%d\n", err); + goto done; + } + +done: + btf_dedup_free(d); + return libbpf_err(err); +} + +#define BTF_UNPROCESSED_ID ((__u32)-1) +#define BTF_IN_PROGRESS_ID ((__u32)-2) + +struct btf_dedup { + /* .BTF section to be deduped in-place */ + struct btf *btf; + /* + * Optional .BTF.ext section. When provided, any strings referenced + * from it will be taken into account when deduping strings + */ + struct btf_ext *btf_ext; + /* + * This is a map from any type's signature hash to a list of possible + * canonical representative type candidates. Hash collisions are + * ignored, so even types of various kinds can share same list of + * candidates, which is fine because we rely on subsequent + * btf_xxx_equal() checks to authoritatively verify type equality. + */ + struct hashmap *dedup_table; + /* Canonical types map */ + __u32 *map; + /* Hypothetical mapping, used during type graph equivalence checks */ + __u32 *hypot_map; + __u32 *hypot_list; + size_t hypot_cnt; + size_t hypot_cap; + /* Whether hypothetical mapping, if successful, would need to adjust + * already canonicalized types (due to a new forward declaration to + * concrete type resolution). In such case, during split BTF dedup + * candidate type would still be considered as different, because base + * BTF is considered to be immutable. + */ + bool hypot_adjust_canon; + /* Various option modifying behavior of algorithm */ + struct btf_dedup_opts opts; + /* temporary strings deduplication state */ + struct strset *strs_set; +}; + +static long hash_combine(long h, long value) +{ + return h * 31 + value; +} + +#define for_each_dedup_cand(d, node, hash) \ + hashmap__for_each_key_entry(d->dedup_table, node, hash) + +static int btf_dedup_table_add(struct btf_dedup *d, long hash, __u32 type_id) +{ + return hashmap__append(d->dedup_table, hash, type_id); +} + +static int btf_dedup_hypot_map_add(struct btf_dedup *d, + __u32 from_id, __u32 to_id) +{ + if (d->hypot_cnt == d->hypot_cap) { + __u32 *new_list; + + d->hypot_cap += max((size_t)16, d->hypot_cap / 2); + new_list = libbpf_reallocarray(d->hypot_list, d->hypot_cap, sizeof(__u32)); + if (!new_list) + return -ENOMEM; + d->hypot_list = new_list; + } + d->hypot_list[d->hypot_cnt++] = from_id; + d->hypot_map[from_id] = to_id; + return 0; +} + +static void btf_dedup_clear_hypot_map(struct btf_dedup *d) +{ + int i; + + for (i = 0; i < d->hypot_cnt; i++) + d->hypot_map[d->hypot_list[i]] = BTF_UNPROCESSED_ID; + d->hypot_cnt = 0; + d->hypot_adjust_canon = false; +} + +static void btf_dedup_free(struct btf_dedup *d) +{ + hashmap__free(d->dedup_table); + d->dedup_table = NULL; + + free(d->map); + d->map = NULL; + + free(d->hypot_map); + d->hypot_map = NULL; + + free(d->hypot_list); + d->hypot_list = NULL; + + free(d); +} + +static size_t btf_dedup_identity_hash_fn(long key, void *ctx) +{ + return key; +} + +static size_t btf_dedup_collision_hash_fn(long key, void *ctx) +{ + return 0; +} + +static bool btf_dedup_equal_fn(long k1, long k2, void *ctx) +{ + return k1 == k2; +} + +static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts) +{ + struct btf_dedup *d = calloc(1, sizeof(struct btf_dedup)); + hashmap_hash_fn hash_fn = btf_dedup_identity_hash_fn; + int i, err = 0, type_cnt; + + if (!d) + return ERR_PTR(-ENOMEM); + + if (OPTS_GET(opts, force_collisions, false)) + hash_fn = btf_dedup_collision_hash_fn; + + d->btf = btf; + d->btf_ext = OPTS_GET(opts, btf_ext, NULL); + + d->dedup_table = hashmap__new(hash_fn, btf_dedup_equal_fn, NULL); + if (IS_ERR(d->dedup_table)) { + err = PTR_ERR(d->dedup_table); + d->dedup_table = NULL; + goto done; + } + + type_cnt = btf__type_cnt(btf); + d->map = malloc(sizeof(__u32) * type_cnt); + if (!d->map) { + err = -ENOMEM; + goto done; + } + /* special BTF "void" type is made canonical immediately */ + d->map[0] = 0; + for (i = 1; i < type_cnt; i++) { + struct btf_type *t = btf_type_by_id(d->btf, i); + + /* VAR and DATASEC are never deduped and are self-canonical */ + if (btf_is_var(t) || btf_is_datasec(t)) + d->map[i] = i; + else + d->map[i] = BTF_UNPROCESSED_ID; + } + + d->hypot_map = malloc(sizeof(__u32) * type_cnt); + if (!d->hypot_map) { + err = -ENOMEM; + goto done; + } + for (i = 0; i < type_cnt; i++) + d->hypot_map[i] = BTF_UNPROCESSED_ID; + +done: + if (err) { + btf_dedup_free(d); + return ERR_PTR(err); + } + + return d; +} + +/* + * Iterate over all possible places in .BTF and .BTF.ext that can reference + * string and pass pointer to it to a provided callback `fn`. + */ +static int btf_for_each_str_off(struct btf_dedup *d, str_off_visit_fn fn, void *ctx) +{ + int i, r; + + for (i = 0; i < d->btf->nr_types; i++) { + struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); + + r = btf_type_visit_str_offs(t, fn, ctx); + if (r) + return r; + } + + if (!d->btf_ext) + return 0; + + r = btf_ext_visit_str_offs(d->btf_ext, fn, ctx); + if (r) + return r; + + return 0; +} + +static int strs_dedup_remap_str_off(__u32 *str_off_ptr, void *ctx) +{ + struct btf_dedup *d = ctx; + __u32 str_off = *str_off_ptr; + const char *s; + int off, err; + + /* don't touch empty string or string in main BTF */ + if (str_off == 0 || str_off < d->btf->start_str_off) + return 0; + + s = btf__str_by_offset(d->btf, str_off); + if (d->btf->base_btf) { + err = btf__find_str(d->btf->base_btf, s); + if (err >= 0) { + *str_off_ptr = err; + return 0; + } + if (err != -ENOENT) + return err; + } + + off = strset__add_str(d->strs_set, s); + if (off < 0) + return off; + + *str_off_ptr = d->btf->start_str_off + off; + return 0; +} + +/* + * Dedup string and filter out those that are not referenced from either .BTF + * or .BTF.ext (if provided) sections. + * + * This is done by building index of all strings in BTF's string section, + * then iterating over all entities that can reference strings (e.g., type + * names, struct field names, .BTF.ext line info, etc) and marking corresponding + * strings as used. After that all used strings are deduped and compacted into + * sequential blob of memory and new offsets are calculated. Then all the string + * references are iterated again and rewritten using new offsets. + */ +static int btf_dedup_strings(struct btf_dedup *d) +{ + int err; + + if (d->btf->strs_deduped) + return 0; + + d->strs_set = strset__new(BTF_MAX_STR_OFFSET, NULL, 0); + if (IS_ERR(d->strs_set)) { + err = PTR_ERR(d->strs_set); + goto err_out; + } + + if (!d->btf->base_btf) { + /* insert empty string; we won't be looking it up during strings + * dedup, but it's good to have it for generic BTF string lookups + */ + err = strset__add_str(d->strs_set, ""); + if (err < 0) + goto err_out; + } + + /* remap string offsets */ + err = btf_for_each_str_off(d, strs_dedup_remap_str_off, d); + if (err) + goto err_out; + + /* replace BTF string data and hash with deduped ones */ + strset__free(d->btf->strs_set); + d->btf->hdr->str_len = strset__data_size(d->strs_set); + d->btf->strs_set = d->strs_set; + d->strs_set = NULL; + d->btf->strs_deduped = true; + return 0; + +err_out: + strset__free(d->strs_set); + d->strs_set = NULL; + + return err; +} + +static long btf_hash_common(struct btf_type *t) +{ + long h; + + h = hash_combine(0, t->name_off); + h = hash_combine(h, t->info); + h = hash_combine(h, t->size); + return h; +} + +static bool btf_equal_common(struct btf_type *t1, struct btf_type *t2) +{ + return t1->name_off == t2->name_off && + t1->info == t2->info && + t1->size == t2->size; +} + +/* Calculate type signature hash of INT or TAG. */ +static long btf_hash_int_decl_tag(struct btf_type *t) +{ + __u32 info = *(__u32 *)(t + 1); + long h; + + h = btf_hash_common(t); + h = hash_combine(h, info); + return h; +} + +/* Check structural equality of two INTs or TAGs. */ +static bool btf_equal_int_tag(struct btf_type *t1, struct btf_type *t2) +{ + __u32 info1, info2; + + if (!btf_equal_common(t1, t2)) + return false; + info1 = *(__u32 *)(t1 + 1); + info2 = *(__u32 *)(t2 + 1); + return info1 == info2; +} + +/* Calculate type signature hash of ENUM/ENUM64. */ +static long btf_hash_enum(struct btf_type *t) +{ + long h; + + /* don't hash vlen, enum members and size to support enum fwd resolving */ + h = hash_combine(0, t->name_off); + return h; +} + +static bool btf_equal_enum_members(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_enum *m1, *m2; + __u16 vlen; + int i; + + vlen = btf_vlen(t1); + m1 = btf_enum(t1); + m2 = btf_enum(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off || m1->val != m2->val) + return false; + m1++; + m2++; + } + return true; +} + +static bool btf_equal_enum64_members(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_enum64 *m1, *m2; + __u16 vlen; + int i; + + vlen = btf_vlen(t1); + m1 = btf_enum64(t1); + m2 = btf_enum64(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off || m1->val_lo32 != m2->val_lo32 || + m1->val_hi32 != m2->val_hi32) + return false; + m1++; + m2++; + } + return true; +} + +/* Check structural equality of two ENUMs or ENUM64s. */ +static bool btf_equal_enum(struct btf_type *t1, struct btf_type *t2) +{ + if (!btf_equal_common(t1, t2)) + return false; + + /* t1 & t2 kinds are identical because of btf_equal_common */ + if (btf_kind(t1) == BTF_KIND_ENUM) + return btf_equal_enum_members(t1, t2); + else + return btf_equal_enum64_members(t1, t2); +} + +static inline bool btf_is_enum_fwd(struct btf_type *t) +{ + return btf_is_any_enum(t) && btf_vlen(t) == 0; +} + +static bool btf_compat_enum(struct btf_type *t1, struct btf_type *t2) +{ + if (!btf_is_enum_fwd(t1) && !btf_is_enum_fwd(t2)) + return btf_equal_enum(t1, t2); + /* At this point either t1 or t2 or both are forward declarations, thus: + * - skip comparing vlen because it is zero for forward declarations; + * - skip comparing size to allow enum forward declarations + * to be compatible with enum64 full declarations; + * - skip comparing kind for the same reason. + */ + return t1->name_off == t2->name_off && + btf_is_any_enum(t1) && btf_is_any_enum(t2); +} + +/* + * Calculate type signature hash of STRUCT/UNION, ignoring referenced type IDs, + * as referenced type IDs equivalence is established separately during type + * graph equivalence check algorithm. + */ +static long btf_hash_struct(struct btf_type *t) +{ + const struct btf_member *member = btf_members(t); + __u32 vlen = btf_vlen(t); + long h = btf_hash_common(t); + int i; + + for (i = 0; i < vlen; i++) { + h = hash_combine(h, member->name_off); + h = hash_combine(h, member->offset); + /* no hashing of referenced type ID, it can be unresolved yet */ + member++; + } + return h; +} + +/* + * Check structural compatibility of two STRUCTs/UNIONs, ignoring referenced + * type IDs. This check is performed during type graph equivalence check and + * referenced types equivalence is checked separately. + */ +static bool btf_shallow_equal_struct(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_member *m1, *m2; + __u16 vlen; + int i; + + if (!btf_equal_common(t1, t2)) + return false; + + vlen = btf_vlen(t1); + m1 = btf_members(t1); + m2 = btf_members(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off || m1->offset != m2->offset) + return false; + m1++; + m2++; + } + return true; +} + +/* + * Calculate type signature hash of ARRAY, including referenced type IDs, + * under assumption that they were already resolved to canonical type IDs and + * are not going to change. + */ +static long btf_hash_array(struct btf_type *t) +{ + const struct btf_array *info = btf_array(t); + long h = btf_hash_common(t); + + h = hash_combine(h, info->type); + h = hash_combine(h, info->index_type); + h = hash_combine(h, info->nelems); + return h; +} + +/* + * Check exact equality of two ARRAYs, taking into account referenced + * type IDs, under assumption that they were already resolved to canonical + * type IDs and are not going to change. + * This function is called during reference types deduplication to compare + * ARRAY to potential canonical representative. + */ +static bool btf_equal_array(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_array *info1, *info2; + + if (!btf_equal_common(t1, t2)) + return false; + + info1 = btf_array(t1); + info2 = btf_array(t2); + return info1->type == info2->type && + info1->index_type == info2->index_type && + info1->nelems == info2->nelems; +} + +/* + * Check structural compatibility of two ARRAYs, ignoring referenced type + * IDs. This check is performed during type graph equivalence check and + * referenced types equivalence is checked separately. + */ +static bool btf_compat_array(struct btf_type *t1, struct btf_type *t2) +{ + if (!btf_equal_common(t1, t2)) + return false; + + return btf_array(t1)->nelems == btf_array(t2)->nelems; +} + +/* + * Calculate type signature hash of FUNC_PROTO, including referenced type IDs, + * under assumption that they were already resolved to canonical type IDs and + * are not going to change. + */ +static long btf_hash_fnproto(struct btf_type *t) +{ + const struct btf_param *member = btf_params(t); + __u16 vlen = btf_vlen(t); + long h = btf_hash_common(t); + int i; + + for (i = 0; i < vlen; i++) { + h = hash_combine(h, member->name_off); + h = hash_combine(h, member->type); + member++; + } + return h; +} + +/* + * Check exact equality of two FUNC_PROTOs, taking into account referenced + * type IDs, under assumption that they were already resolved to canonical + * type IDs and are not going to change. + * This function is called during reference types deduplication to compare + * FUNC_PROTO to potential canonical representative. + */ +static bool btf_equal_fnproto(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_param *m1, *m2; + __u16 vlen; + int i; + + if (!btf_equal_common(t1, t2)) + return false; + + vlen = btf_vlen(t1); + m1 = btf_params(t1); + m2 = btf_params(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off || m1->type != m2->type) + return false; + m1++; + m2++; + } + return true; +} + +/* + * Check structural compatibility of two FUNC_PROTOs, ignoring referenced type + * IDs. This check is performed during type graph equivalence check and + * referenced types equivalence is checked separately. + */ +static bool btf_compat_fnproto(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_param *m1, *m2; + __u16 vlen; + int i; + + /* skip return type ID */ + if (t1->name_off != t2->name_off || t1->info != t2->info) + return false; + + vlen = btf_vlen(t1); + m1 = btf_params(t1); + m2 = btf_params(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off) + return false; + m1++; + m2++; + } + return true; +} + +/* Prepare split BTF for deduplication by calculating hashes of base BTF's + * types and initializing the rest of the state (canonical type mapping) for + * the fixed base BTF part. + */ +static int btf_dedup_prep(struct btf_dedup *d) +{ + struct btf_type *t; + int type_id; + long h; + + if (!d->btf->base_btf) + return 0; + + for (type_id = 1; type_id < d->btf->start_id; type_id++) { + t = btf_type_by_id(d->btf, type_id); + + /* all base BTF types are self-canonical by definition */ + d->map[type_id] = type_id; + + switch (btf_kind(t)) { + case BTF_KIND_VAR: + case BTF_KIND_DATASEC: + /* VAR and DATASEC are never hash/deduplicated */ + continue; + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_FWD: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_FLOAT: + case BTF_KIND_TYPE_TAG: + h = btf_hash_common(t); + break; + case BTF_KIND_INT: + case BTF_KIND_DECL_TAG: + h = btf_hash_int_decl_tag(t); + break; + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + h = btf_hash_enum(t); + break; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + h = btf_hash_struct(t); + break; + case BTF_KIND_ARRAY: + h = btf_hash_array(t); + break; + case BTF_KIND_FUNC_PROTO: + h = btf_hash_fnproto(t); + break; + default: + pr_debug("unknown kind %d for type [%d]\n", btf_kind(t), type_id); + return -EINVAL; + } + if (btf_dedup_table_add(d, h, type_id)) + return -ENOMEM; + } + + return 0; +} + +/* + * Deduplicate primitive types, that can't reference other types, by calculating + * their type signature hash and comparing them with any possible canonical + * candidate. If no canonical candidate matches, type itself is marked as + * canonical and is added into `btf_dedup->dedup_table` as another candidate. + */ +static int btf_dedup_prim_type(struct btf_dedup *d, __u32 type_id) +{ + struct btf_type *t = btf_type_by_id(d->btf, type_id); + struct hashmap_entry *hash_entry; + struct btf_type *cand; + /* if we don't find equivalent type, then we are canonical */ + __u32 new_id = type_id; + __u32 cand_id; + long h; + + switch (btf_kind(t)) { + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_ARRAY: + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_FUNC: + case BTF_KIND_FUNC_PROTO: + case BTF_KIND_VAR: + case BTF_KIND_DATASEC: + case BTF_KIND_DECL_TAG: + case BTF_KIND_TYPE_TAG: + return 0; + + case BTF_KIND_INT: + h = btf_hash_int_decl_tag(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_int_tag(t, cand)) { + new_id = cand_id; + break; + } + } + break; + + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + h = btf_hash_enum(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_enum(t, cand)) { + new_id = cand_id; + break; + } + if (btf_compat_enum(t, cand)) { + if (btf_is_enum_fwd(t)) { + /* resolve fwd to full enum */ + new_id = cand_id; + break; + } + /* resolve canonical enum fwd to full enum */ + d->map[cand_id] = type_id; + } + } + break; + + case BTF_KIND_FWD: + case BTF_KIND_FLOAT: + h = btf_hash_common(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_common(t, cand)) { + new_id = cand_id; + break; + } + } + break; + + default: + return -EINVAL; + } + + d->map[type_id] = new_id; + if (type_id == new_id && btf_dedup_table_add(d, h, type_id)) + return -ENOMEM; + + return 0; +} + +static int btf_dedup_prim_types(struct btf_dedup *d) +{ + int i, err; + + for (i = 0; i < d->btf->nr_types; i++) { + err = btf_dedup_prim_type(d, d->btf->start_id + i); + if (err) + return err; + } + return 0; +} + +/* + * Check whether type is already mapped into canonical one (could be to itself). + */ +static inline bool is_type_mapped(struct btf_dedup *d, uint32_t type_id) +{ + return d->map[type_id] <= BTF_MAX_NR_TYPES; +} + +/* + * Resolve type ID into its canonical type ID, if any; otherwise return original + * type ID. If type is FWD and is resolved into STRUCT/UNION already, follow + * STRUCT/UNION link and resolve it into canonical type ID as well. + */ +static inline __u32 resolve_type_id(struct btf_dedup *d, __u32 type_id) +{ + while (is_type_mapped(d, type_id) && d->map[type_id] != type_id) + type_id = d->map[type_id]; + return type_id; +} + +/* + * Resolve FWD to underlying STRUCT/UNION, if any; otherwise return original + * type ID. + */ +static uint32_t resolve_fwd_id(struct btf_dedup *d, uint32_t type_id) +{ + __u32 orig_type_id = type_id; + + if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) + return type_id; + + while (is_type_mapped(d, type_id) && d->map[type_id] != type_id) + type_id = d->map[type_id]; + + if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) + return type_id; + + return orig_type_id; +} + + +static inline __u16 btf_fwd_kind(struct btf_type *t) +{ + return btf_kflag(t) ? BTF_KIND_UNION : BTF_KIND_STRUCT; +} + +/* Check if given two types are identical ARRAY definitions */ +static bool btf_dedup_identical_arrays(struct btf_dedup *d, __u32 id1, __u32 id2) +{ + struct btf_type *t1, *t2; + + t1 = btf_type_by_id(d->btf, id1); + t2 = btf_type_by_id(d->btf, id2); + if (!btf_is_array(t1) || !btf_is_array(t2)) + return false; + + return btf_equal_array(t1, t2); +} + +/* Check if given two types are identical STRUCT/UNION definitions */ +static bool btf_dedup_identical_structs(struct btf_dedup *d, __u32 id1, __u32 id2) +{ + const struct btf_member *m1, *m2; + struct btf_type *t1, *t2; + int n, i; + + t1 = btf_type_by_id(d->btf, id1); + t2 = btf_type_by_id(d->btf, id2); + + if (!btf_is_composite(t1) || btf_kind(t1) != btf_kind(t2)) + return false; + + if (!btf_shallow_equal_struct(t1, t2)) + return false; + + m1 = btf_members(t1); + m2 = btf_members(t2); + for (i = 0, n = btf_vlen(t1); i < n; i++, m1++, m2++) { + if (m1->type != m2->type && + !btf_dedup_identical_arrays(d, m1->type, m2->type) && + !btf_dedup_identical_structs(d, m1->type, m2->type)) + return false; + } + return true; +} + +/* + * Check equivalence of BTF type graph formed by candidate struct/union (we'll + * call it "candidate graph" in this description for brevity) to a type graph + * formed by (potential) canonical struct/union ("canonical graph" for brevity + * here, though keep in mind that not all types in canonical graph are + * necessarily canonical representatives themselves, some of them might be + * duplicates or its uniqueness might not have been established yet). + * Returns: + * - >0, if type graphs are equivalent; + * - 0, if not equivalent; + * - <0, on error. + * + * Algorithm performs side-by-side DFS traversal of both type graphs and checks + * equivalence of BTF types at each step. If at any point BTF types in candidate + * and canonical graphs are not compatible structurally, whole graphs are + * incompatible. If types are structurally equivalent (i.e., all information + * except referenced type IDs is exactly the same), a mapping from `canon_id` to + * a `cand_id` is recored in hypothetical mapping (`btf_dedup->hypot_map`). + * If a type references other types, then those referenced types are checked + * for equivalence recursively. + * + * During DFS traversal, if we find that for current `canon_id` type we + * already have some mapping in hypothetical map, we check for two possible + * situations: + * - `canon_id` is mapped to exactly the same type as `cand_id`. This will + * happen when type graphs have cycles. In this case we assume those two + * types are equivalent. + * - `canon_id` is mapped to different type. This is contradiction in our + * hypothetical mapping, because same graph in canonical graph corresponds + * to two different types in candidate graph, which for equivalent type + * graphs shouldn't happen. This condition terminates equivalence check + * with negative result. + * + * If type graphs traversal exhausts types to check and find no contradiction, + * then type graphs are equivalent. + * + * When checking types for equivalence, there is one special case: FWD types. + * If FWD type resolution is allowed and one of the types (either from canonical + * or candidate graph) is FWD and other is STRUCT/UNION (depending on FWD's kind + * flag) and their names match, hypothetical mapping is updated to point from + * FWD to STRUCT/UNION. If graphs will be determined as equivalent successfully, + * this mapping will be used to record FWD -> STRUCT/UNION mapping permanently. + * + * Technically, this could lead to incorrect FWD to STRUCT/UNION resolution, + * if there are two exactly named (or anonymous) structs/unions that are + * compatible structurally, one of which has FWD field, while other is concrete + * STRUCT/UNION, but according to C sources they are different structs/unions + * that are referencing different types with the same name. This is extremely + * unlikely to happen, but btf_dedup API allows to disable FWD resolution if + * this logic is causing problems. + * + * Doing FWD resolution means that both candidate and/or canonical graphs can + * consists of portions of the graph that come from multiple compilation units. + * This is due to the fact that types within single compilation unit are always + * deduplicated and FWDs are already resolved, if referenced struct/union + * definiton is available. So, if we had unresolved FWD and found corresponding + * STRUCT/UNION, they will be from different compilation units. This + * consequently means that when we "link" FWD to corresponding STRUCT/UNION, + * type graph will likely have at least two different BTF types that describe + * same type (e.g., most probably there will be two different BTF types for the + * same 'int' primitive type) and could even have "overlapping" parts of type + * graph that describe same subset of types. + * + * This in turn means that our assumption that each type in canonical graph + * must correspond to exactly one type in candidate graph might not hold + * anymore and will make it harder to detect contradictions using hypothetical + * map. To handle this problem, we allow to follow FWD -> STRUCT/UNION + * resolution only in canonical graph. FWDs in candidate graphs are never + * resolved. To see why it's OK, let's check all possible situations w.r.t. FWDs + * that can occur: + * - Both types in canonical and candidate graphs are FWDs. If they are + * structurally equivalent, then they can either be both resolved to the + * same STRUCT/UNION or not resolved at all. In both cases they are + * equivalent and there is no need to resolve FWD on candidate side. + * - Both types in canonical and candidate graphs are concrete STRUCT/UNION, + * so nothing to resolve as well, algorithm will check equivalence anyway. + * - Type in canonical graph is FWD, while type in candidate is concrete + * STRUCT/UNION. In this case candidate graph comes from single compilation + * unit, so there is exactly one BTF type for each unique C type. After + * resolving FWD into STRUCT/UNION, there might be more than one BTF type + * in canonical graph mapping to single BTF type in candidate graph, but + * because hypothetical mapping maps from canonical to candidate types, it's + * alright, and we still maintain the property of having single `canon_id` + * mapping to single `cand_id` (there could be two different `canon_id` + * mapped to the same `cand_id`, but it's not contradictory). + * - Type in canonical graph is concrete STRUCT/UNION, while type in candidate + * graph is FWD. In this case we are just going to check compatibility of + * STRUCT/UNION and corresponding FWD, and if they are compatible, we'll + * assume that whatever STRUCT/UNION FWD resolves to must be equivalent to + * a concrete STRUCT/UNION from canonical graph. If the rest of type graphs + * turn out equivalent, we'll re-resolve FWD to concrete STRUCT/UNION from + * canonical graph. + */ +static int btf_dedup_is_equiv(struct btf_dedup *d, __u32 cand_id, + __u32 canon_id) +{ + struct btf_type *cand_type; + struct btf_type *canon_type; + __u32 hypot_type_id; + __u16 cand_kind; + __u16 canon_kind; + int i, eq; + + /* if both resolve to the same canonical, they must be equivalent */ + if (resolve_type_id(d, cand_id) == resolve_type_id(d, canon_id)) + return 1; + + canon_id = resolve_fwd_id(d, canon_id); + + hypot_type_id = d->hypot_map[canon_id]; + if (hypot_type_id <= BTF_MAX_NR_TYPES) { + if (hypot_type_id == cand_id) + return 1; + /* In some cases compiler will generate different DWARF types + * for *identical* array type definitions and use them for + * different fields within the *same* struct. This breaks type + * equivalence check, which makes an assumption that candidate + * types sub-graph has a consistent and deduped-by-compiler + * types within a single CU. So work around that by explicitly + * allowing identical array types here. + */ + if (btf_dedup_identical_arrays(d, hypot_type_id, cand_id)) + return 1; + /* It turns out that similar situation can happen with + * struct/union sometimes, sigh... Handle the case where + * structs/unions are exactly the same, down to the referenced + * type IDs. Anything more complicated (e.g., if referenced + * types are different, but equivalent) is *way more* + * complicated and requires a many-to-many equivalence mapping. + */ + if (btf_dedup_identical_structs(d, hypot_type_id, cand_id)) + return 1; + return 0; + } + + if (btf_dedup_hypot_map_add(d, canon_id, cand_id)) + return -ENOMEM; + + cand_type = btf_type_by_id(d->btf, cand_id); + canon_type = btf_type_by_id(d->btf, canon_id); + cand_kind = btf_kind(cand_type); + canon_kind = btf_kind(canon_type); + + if (cand_type->name_off != canon_type->name_off) + return 0; + + /* FWD <--> STRUCT/UNION equivalence check, if enabled */ + if ((cand_kind == BTF_KIND_FWD || canon_kind == BTF_KIND_FWD) + && cand_kind != canon_kind) { + __u16 real_kind; + __u16 fwd_kind; + + if (cand_kind == BTF_KIND_FWD) { + real_kind = canon_kind; + fwd_kind = btf_fwd_kind(cand_type); + } else { + real_kind = cand_kind; + fwd_kind = btf_fwd_kind(canon_type); + /* we'd need to resolve base FWD to STRUCT/UNION */ + if (fwd_kind == real_kind && canon_id < d->btf->start_id) + d->hypot_adjust_canon = true; + } + return fwd_kind == real_kind; + } + + if (cand_kind != canon_kind) + return 0; + + switch (cand_kind) { + case BTF_KIND_INT: + return btf_equal_int_tag(cand_type, canon_type); + + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + return btf_compat_enum(cand_type, canon_type); + + case BTF_KIND_FWD: + case BTF_KIND_FLOAT: + return btf_equal_common(cand_type, canon_type); + + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_TYPE_TAG: + if (cand_type->info != canon_type->info) + return 0; + return btf_dedup_is_equiv(d, cand_type->type, canon_type->type); + + case BTF_KIND_ARRAY: { + const struct btf_array *cand_arr, *canon_arr; + + if (!btf_compat_array(cand_type, canon_type)) + return 0; + cand_arr = btf_array(cand_type); + canon_arr = btf_array(canon_type); + eq = btf_dedup_is_equiv(d, cand_arr->index_type, canon_arr->index_type); + if (eq <= 0) + return eq; + return btf_dedup_is_equiv(d, cand_arr->type, canon_arr->type); + } + + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *cand_m, *canon_m; + __u16 vlen; + + if (!btf_shallow_equal_struct(cand_type, canon_type)) + return 0; + vlen = btf_vlen(cand_type); + cand_m = btf_members(cand_type); + canon_m = btf_members(canon_type); + for (i = 0; i < vlen; i++) { + eq = btf_dedup_is_equiv(d, cand_m->type, canon_m->type); + if (eq <= 0) + return eq; + cand_m++; + canon_m++; + } + + return 1; + } + + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *cand_p, *canon_p; + __u16 vlen; + + if (!btf_compat_fnproto(cand_type, canon_type)) + return 0; + eq = btf_dedup_is_equiv(d, cand_type->type, canon_type->type); + if (eq <= 0) + return eq; + vlen = btf_vlen(cand_type); + cand_p = btf_params(cand_type); + canon_p = btf_params(canon_type); + for (i = 0; i < vlen; i++) { + eq = btf_dedup_is_equiv(d, cand_p->type, canon_p->type); + if (eq <= 0) + return eq; + cand_p++; + canon_p++; + } + return 1; + } + + default: + return -EINVAL; + } + return 0; +} + +/* + * Use hypothetical mapping, produced by successful type graph equivalence + * check, to augment existing struct/union canonical mapping, where possible. + * + * If BTF_KIND_FWD resolution is allowed, this mapping is also used to record + * FWD -> STRUCT/UNION correspondence as well. FWD resolution is bidirectional: + * it doesn't matter if FWD type was part of canonical graph or candidate one, + * we are recording the mapping anyway. As opposed to carefulness required + * for struct/union correspondence mapping (described below), for FWD resolution + * it's not important, as by the time that FWD type (reference type) will be + * deduplicated all structs/unions will be deduped already anyway. + * + * Recording STRUCT/UNION mapping is purely a performance optimization and is + * not required for correctness. It needs to be done carefully to ensure that + * struct/union from candidate's type graph is not mapped into corresponding + * struct/union from canonical type graph that itself hasn't been resolved into + * canonical representative. The only guarantee we have is that canonical + * struct/union was determined as canonical and that won't change. But any + * types referenced through that struct/union fields could have been not yet + * resolved, so in case like that it's too early to establish any kind of + * correspondence between structs/unions. + * + * No canonical correspondence is derived for primitive types (they are already + * deduplicated completely already anyway) or reference types (they rely on + * stability of struct/union canonical relationship for equivalence checks). + */ +static void btf_dedup_merge_hypot_map(struct btf_dedup *d) +{ + __u32 canon_type_id, targ_type_id; + __u16 t_kind, c_kind; + __u32 t_id, c_id; + int i; + + for (i = 0; i < d->hypot_cnt; i++) { + canon_type_id = d->hypot_list[i]; + targ_type_id = d->hypot_map[canon_type_id]; + t_id = resolve_type_id(d, targ_type_id); + c_id = resolve_type_id(d, canon_type_id); + t_kind = btf_kind(btf__type_by_id(d->btf, t_id)); + c_kind = btf_kind(btf__type_by_id(d->btf, c_id)); + /* + * Resolve FWD into STRUCT/UNION. + * It's ok to resolve FWD into STRUCT/UNION that's not yet + * mapped to canonical representative (as opposed to + * STRUCT/UNION <--> STRUCT/UNION mapping logic below), because + * eventually that struct is going to be mapped and all resolved + * FWDs will automatically resolve to correct canonical + * representative. This will happen before ref type deduping, + * which critically depends on stability of these mapping. This + * stability is not a requirement for STRUCT/UNION equivalence + * checks, though. + */ + + /* if it's the split BTF case, we still need to point base FWD + * to STRUCT/UNION in a split BTF, because FWDs from split BTF + * will be resolved against base FWD. If we don't point base + * canonical FWD to the resolved STRUCT/UNION, then all the + * FWDs in split BTF won't be correctly resolved to a proper + * STRUCT/UNION. + */ + if (t_kind != BTF_KIND_FWD && c_kind == BTF_KIND_FWD) + d->map[c_id] = t_id; + + /* if graph equivalence determined that we'd need to adjust + * base canonical types, then we need to only point base FWDs + * to STRUCTs/UNIONs and do no more modifications. For all + * other purposes the type graphs were not equivalent. + */ + if (d->hypot_adjust_canon) + continue; + + if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD) + d->map[t_id] = c_id; + + if ((t_kind == BTF_KIND_STRUCT || t_kind == BTF_KIND_UNION) && + c_kind != BTF_KIND_FWD && + is_type_mapped(d, c_id) && + !is_type_mapped(d, t_id)) { + /* + * as a perf optimization, we can map struct/union + * that's part of type graph we just verified for + * equivalence. We can do that for struct/union that has + * canonical representative only, though. + */ + d->map[t_id] = c_id; + } + } +} + +/* + * Deduplicate struct/union types. + * + * For each struct/union type its type signature hash is calculated, taking + * into account type's name, size, number, order and names of fields, but + * ignoring type ID's referenced from fields, because they might not be deduped + * completely until after reference types deduplication phase. This type hash + * is used to iterate over all potential canonical types, sharing same hash. + * For each canonical candidate we check whether type graphs that they form + * (through referenced types in fields and so on) are equivalent using algorithm + * implemented in `btf_dedup_is_equiv`. If such equivalence is found and + * BTF_KIND_FWD resolution is allowed, then hypothetical mapping + * (btf_dedup->hypot_map) produced by aforementioned type graph equivalence + * algorithm is used to record FWD -> STRUCT/UNION mapping. It's also used to + * potentially map other structs/unions to their canonical representatives, + * if such relationship hasn't yet been established. This speeds up algorithm + * by eliminating some of the duplicate work. + * + * If no matching canonical representative was found, struct/union is marked + * as canonical for itself and is added into btf_dedup->dedup_table hash map + * for further look ups. + */ +static int btf_dedup_struct_type(struct btf_dedup *d, __u32 type_id) +{ + struct btf_type *cand_type, *t; + struct hashmap_entry *hash_entry; + /* if we don't find equivalent type, then we are canonical */ + __u32 new_id = type_id; + __u16 kind; + long h; + + /* already deduped or is in process of deduping (loop detected) */ + if (d->map[type_id] <= BTF_MAX_NR_TYPES) + return 0; + + t = btf_type_by_id(d->btf, type_id); + kind = btf_kind(t); + + if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION) + return 0; + + h = btf_hash_struct(t); + for_each_dedup_cand(d, hash_entry, h) { + __u32 cand_id = hash_entry->value; + int eq; + + /* + * Even though btf_dedup_is_equiv() checks for + * btf_shallow_equal_struct() internally when checking two + * structs (unions) for equivalence, we need to guard here + * from picking matching FWD type as a dedup candidate. + * This can happen due to hash collision. In such case just + * relying on btf_dedup_is_equiv() would lead to potentially + * creating a loop (FWD -> STRUCT and STRUCT -> FWD), because + * FWD and compatible STRUCT/UNION are considered equivalent. + */ + cand_type = btf_type_by_id(d->btf, cand_id); + if (!btf_shallow_equal_struct(t, cand_type)) + continue; + + btf_dedup_clear_hypot_map(d); + eq = btf_dedup_is_equiv(d, type_id, cand_id); + if (eq < 0) + return eq; + if (!eq) + continue; + btf_dedup_merge_hypot_map(d); + if (d->hypot_adjust_canon) /* not really equivalent */ + continue; + new_id = cand_id; + break; + } + + d->map[type_id] = new_id; + if (type_id == new_id && btf_dedup_table_add(d, h, type_id)) + return -ENOMEM; + + return 0; +} + +static int btf_dedup_struct_types(struct btf_dedup *d) +{ + int i, err; + + for (i = 0; i < d->btf->nr_types; i++) { + err = btf_dedup_struct_type(d, d->btf->start_id + i); + if (err) + return err; + } + return 0; +} + +/* + * Deduplicate reference type. + * + * Once all primitive and struct/union types got deduplicated, we can easily + * deduplicate all other (reference) BTF types. This is done in two steps: + * + * 1. Resolve all referenced type IDs into their canonical type IDs. This + * resolution can be done either immediately for primitive or struct/union types + * (because they were deduped in previous two phases) or recursively for + * reference types. Recursion will always terminate at either primitive or + * struct/union type, at which point we can "unwind" chain of reference types + * one by one. There is no danger of encountering cycles because in C type + * system the only way to form type cycle is through struct/union, so any chain + * of reference types, even those taking part in a type cycle, will inevitably + * reach struct/union at some point. + * + * 2. Once all referenced type IDs are resolved into canonical ones, BTF type + * becomes "stable", in the sense that no further deduplication will cause + * any changes to it. With that, it's now possible to calculate type's signature + * hash (this time taking into account referenced type IDs) and loop over all + * potential canonical representatives. If no match was found, current type + * will become canonical representative of itself and will be added into + * btf_dedup->dedup_table as another possible canonical representative. + */ +static int btf_dedup_ref_type(struct btf_dedup *d, __u32 type_id) +{ + struct hashmap_entry *hash_entry; + __u32 new_id = type_id, cand_id; + struct btf_type *t, *cand; + /* if we don't find equivalent type, then we are representative type */ + int ref_type_id; + long h; + + if (d->map[type_id] == BTF_IN_PROGRESS_ID) + return -ELOOP; + if (d->map[type_id] <= BTF_MAX_NR_TYPES) + return resolve_type_id(d, type_id); + + t = btf_type_by_id(d->btf, type_id); + d->map[type_id] = BTF_IN_PROGRESS_ID; + + switch (btf_kind(t)) { + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_TYPE_TAG: + ref_type_id = btf_dedup_ref_type(d, t->type); + if (ref_type_id < 0) + return ref_type_id; + t->type = ref_type_id; + + h = btf_hash_common(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_common(t, cand)) { + new_id = cand_id; + break; + } + } + break; + + case BTF_KIND_DECL_TAG: + ref_type_id = btf_dedup_ref_type(d, t->type); + if (ref_type_id < 0) + return ref_type_id; + t->type = ref_type_id; + + h = btf_hash_int_decl_tag(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_int_tag(t, cand)) { + new_id = cand_id; + break; + } + } + break; + + case BTF_KIND_ARRAY: { + struct btf_array *info = btf_array(t); + + ref_type_id = btf_dedup_ref_type(d, info->type); + if (ref_type_id < 0) + return ref_type_id; + info->type = ref_type_id; + + ref_type_id = btf_dedup_ref_type(d, info->index_type); + if (ref_type_id < 0) + return ref_type_id; + info->index_type = ref_type_id; + + h = btf_hash_array(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_array(t, cand)) { + new_id = cand_id; + break; + } + } + break; + } + + case BTF_KIND_FUNC_PROTO: { + struct btf_param *param; + __u16 vlen; + int i; + + ref_type_id = btf_dedup_ref_type(d, t->type); + if (ref_type_id < 0) + return ref_type_id; + t->type = ref_type_id; + + vlen = btf_vlen(t); + param = btf_params(t); + for (i = 0; i < vlen; i++) { + ref_type_id = btf_dedup_ref_type(d, param->type); + if (ref_type_id < 0) + return ref_type_id; + param->type = ref_type_id; + param++; + } + + h = btf_hash_fnproto(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_fnproto(t, cand)) { + new_id = cand_id; + break; + } + } + break; + } + + default: + return -EINVAL; + } + + d->map[type_id] = new_id; + if (type_id == new_id && btf_dedup_table_add(d, h, type_id)) + return -ENOMEM; + + return new_id; +} + +static int btf_dedup_ref_types(struct btf_dedup *d) +{ + int i, err; + + for (i = 0; i < d->btf->nr_types; i++) { + err = btf_dedup_ref_type(d, d->btf->start_id + i); + if (err < 0) + return err; + } + /* we won't need d->dedup_table anymore */ + hashmap__free(d->dedup_table); + d->dedup_table = NULL; + return 0; +} + +/* + * Collect a map from type names to type ids for all canonical structs + * and unions. If the same name is shared by several canonical types + * use a special value 0 to indicate this fact. + */ +static int btf_dedup_fill_unique_names_map(struct btf_dedup *d, struct hashmap *names_map) +{ + __u32 nr_types = btf__type_cnt(d->btf); + struct btf_type *t; + __u32 type_id; + __u16 kind; + int err; + + /* + * Iterate over base and split module ids in order to get all + * available structs in the map. + */ + for (type_id = 1; type_id < nr_types; ++type_id) { + t = btf_type_by_id(d->btf, type_id); + kind = btf_kind(t); + + if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION) + continue; + + /* Skip non-canonical types */ + if (type_id != d->map[type_id]) + continue; + + err = hashmap__add(names_map, t->name_off, type_id); + if (err == -EEXIST) + err = hashmap__set(names_map, t->name_off, 0, NULL, NULL); + + if (err) + return err; + } + + return 0; +} + +static int btf_dedup_resolve_fwd(struct btf_dedup *d, struct hashmap *names_map, __u32 type_id) +{ + struct btf_type *t = btf_type_by_id(d->btf, type_id); + enum btf_fwd_kind fwd_kind = btf_kflag(t); + __u16 cand_kind, kind = btf_kind(t); + struct btf_type *cand_t; + uintptr_t cand_id; + + if (kind != BTF_KIND_FWD) + return 0; + + /* Skip if this FWD already has a mapping */ + if (type_id != d->map[type_id]) + return 0; + + if (!hashmap__find(names_map, t->name_off, &cand_id)) + return 0; + + /* Zero is a special value indicating that name is not unique */ + if (!cand_id) + return 0; + + cand_t = btf_type_by_id(d->btf, cand_id); + cand_kind = btf_kind(cand_t); + if ((cand_kind == BTF_KIND_STRUCT && fwd_kind != BTF_FWD_STRUCT) || + (cand_kind == BTF_KIND_UNION && fwd_kind != BTF_FWD_UNION)) + return 0; + + d->map[type_id] = cand_id; + + return 0; +} + +/* + * Resolve unambiguous forward declarations. + * + * The lion's share of all FWD declarations is resolved during + * `btf_dedup_struct_types` phase when different type graphs are + * compared against each other. However, if in some compilation unit a + * FWD declaration is not a part of a type graph compared against + * another type graph that declaration's canonical type would not be + * changed. Example: + * + * CU #1: + * + * struct foo; + * struct foo *some_global; + * + * CU #2: + * + * struct foo { int u; }; + * struct foo *another_global; + * + * After `btf_dedup_struct_types` the BTF looks as follows: + * + * [1] STRUCT 'foo' size=4 vlen=1 ... + * [2] INT 'int' size=4 ... + * [3] PTR '(anon)' type_id=1 + * [4] FWD 'foo' fwd_kind=struct + * [5] PTR '(anon)' type_id=4 + * + * This pass assumes that such FWD declarations should be mapped to + * structs or unions with identical name in case if the name is not + * ambiguous. + */ +static int btf_dedup_resolve_fwds(struct btf_dedup *d) +{ + int i, err; + struct hashmap *names_map; + + names_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL); + if (IS_ERR(names_map)) + return PTR_ERR(names_map); + + err = btf_dedup_fill_unique_names_map(d, names_map); + if (err < 0) + goto exit; + + for (i = 0; i < d->btf->nr_types; i++) { + err = btf_dedup_resolve_fwd(d, names_map, d->btf->start_id + i); + if (err < 0) + break; + } + +exit: + hashmap__free(names_map); + return err; +} + +/* + * Compact types. + * + * After we established for each type its corresponding canonical representative + * type, we now can eliminate types that are not canonical and leave only + * canonical ones layed out sequentially in memory by copying them over + * duplicates. During compaction btf_dedup->hypot_map array is reused to store + * a map from original type ID to a new compacted type ID, which will be used + * during next phase to "fix up" type IDs, referenced from struct/union and + * reference types. + */ +static int btf_dedup_compact_types(struct btf_dedup *d) +{ + __u32 *new_offs; + __u32 next_type_id = d->btf->start_id; + const struct btf_type *t; + void *p; + int i, id, len; + + /* we are going to reuse hypot_map to store compaction remapping */ + d->hypot_map[0] = 0; + /* base BTF types are not renumbered */ + for (id = 1; id < d->btf->start_id; id++) + d->hypot_map[id] = id; + for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) + d->hypot_map[id] = BTF_UNPROCESSED_ID; + + p = d->btf->types_data; + + for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) { + if (d->map[id] != id) + continue; + + t = btf__type_by_id(d->btf, id); + len = btf_type_size(t); + if (len < 0) + return len; + + memmove(p, t, len); + d->hypot_map[id] = next_type_id; + d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data; + p += len; + next_type_id++; + } + + /* shrink struct btf's internal types index and update btf_header */ + d->btf->nr_types = next_type_id - d->btf->start_id; + d->btf->type_offs_cap = d->btf->nr_types; + d->btf->hdr->type_len = p - d->btf->types_data; + new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap, + sizeof(*new_offs)); + if (d->btf->type_offs_cap && !new_offs) + return -ENOMEM; + d->btf->type_offs = new_offs; + d->btf->hdr->str_off = d->btf->hdr->type_len; + d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len; + return 0; +} + +/* + * Figure out final (deduplicated and compacted) type ID for provided original + * `type_id` by first resolving it into corresponding canonical type ID and + * then mapping it to a deduplicated type ID, stored in btf_dedup->hypot_map, + * which is populated during compaction phase. + */ +static int btf_dedup_remap_type_id(__u32 *type_id, void *ctx) +{ + struct btf_dedup *d = ctx; + __u32 resolved_type_id, new_type_id; + + resolved_type_id = resolve_type_id(d, *type_id); + new_type_id = d->hypot_map[resolved_type_id]; + if (new_type_id > BTF_MAX_NR_TYPES) + return -EINVAL; + + *type_id = new_type_id; + return 0; +} + +/* + * Remap referenced type IDs into deduped type IDs. + * + * After BTF types are deduplicated and compacted, their final type IDs may + * differ from original ones. The map from original to a corresponding + * deduped type ID is stored in btf_dedup->hypot_map and is populated during + * compaction phase. During remapping phase we are rewriting all type IDs + * referenced from any BTF type (e.g., struct fields, func proto args, etc) to + * their final deduped type IDs. + */ +static int btf_dedup_remap_types(struct btf_dedup *d) +{ + int i, r; + + for (i = 0; i < d->btf->nr_types; i++) { + struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); + + r = btf_type_visit_type_ids(t, btf_dedup_remap_type_id, d); + if (r) + return r; + } + + if (!d->btf_ext) + return 0; + + r = btf_ext_visit_type_ids(d->btf_ext, btf_dedup_remap_type_id, d); + if (r) + return r; + + return 0; +} + +/* + * Probe few well-known locations for vmlinux kernel image and try to load BTF + * data out of it to use for target BTF. + */ +struct btf *btf__load_vmlinux_btf(void) +{ + const char *locations[] = { + /* try canonical vmlinux BTF through sysfs first */ + "/sys/kernel/btf/vmlinux", + /* fall back to trying to find vmlinux on disk otherwise */ + "/boot/vmlinux-%1$s", + "/lib/modules/%1$s/vmlinux-%1$s", + "/lib/modules/%1$s/build/vmlinux", + "/usr/lib/modules/%1$s/kernel/vmlinux", + "/usr/lib/debug/boot/vmlinux-%1$s", + "/usr/lib/debug/boot/vmlinux-%1$s.debug", + "/usr/lib/debug/lib/modules/%1$s/vmlinux", + "/data/local/tmp/a13-5.10-2022-06-arm64.btf", + }; + char path[PATH_MAX + 1]; + struct utsname buf; + struct btf *btf; + int i, err; + + uname(&buf); + + for (i = 0; i < ARRAY_SIZE(locations); i++) { + snprintf(path, PATH_MAX, locations[i], buf.release); + + if (faccessat(AT_FDCWD, path, R_OK, AT_EACCESS)) + continue; + + btf = btf__parse(path, NULL); + err = libbpf_get_error(btf); + pr_debug("loading kernel BTF '%s': %d\n", path, err); + if (err) + continue; + + return btf; + } + + pr_warn("failed to find valid kernel BTF\n"); + return libbpf_err_ptr(-ESRCH); +} + +struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf"))); + +struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf) +{ + char path[80]; + + snprintf(path, sizeof(path), "/sys/kernel/btf/%s", module_name); + return btf__parse_split(path, vmlinux_btf); +} + +int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx) +{ + int i, n, err; + + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + return 0; + + case BTF_KIND_FWD: + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_VAR: + case BTF_KIND_DECL_TAG: + case BTF_KIND_TYPE_TAG: + return visit(&t->type, ctx); + + case BTF_KIND_ARRAY: { + struct btf_array *a = btf_array(t); + + err = visit(&a->type, ctx); + err = err ?: visit(&a->index_type, ctx); + return err; + } + + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + struct btf_member *m = btf_members(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->type, ctx); + if (err) + return err; + } + return 0; + } + + case BTF_KIND_FUNC_PROTO: { + struct btf_param *m = btf_params(t); + + err = visit(&t->type, ctx); + if (err) + return err; + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->type, ctx); + if (err) + return err; + } + return 0; + } + + case BTF_KIND_DATASEC: { + struct btf_var_secinfo *m = btf_var_secinfos(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->type, ctx); + if (err) + return err; + } + return 0; + } + + default: + return -EINVAL; + } +} + +int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx) +{ + int i, n, err; + + err = visit(&t->name_off, ctx); + if (err) + return err; + + switch (btf_kind(t)) { + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + struct btf_member *m = btf_members(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->name_off, ctx); + if (err) + return err; + } + break; + } + case BTF_KIND_ENUM: { + struct btf_enum *m = btf_enum(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->name_off, ctx); + if (err) + return err; + } + break; + } + case BTF_KIND_ENUM64: { + struct btf_enum64 *m = btf_enum64(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->name_off, ctx); + if (err) + return err; + } + break; + } + case BTF_KIND_FUNC_PROTO: { + struct btf_param *m = btf_params(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->name_off, ctx); + if (err) + return err; + } + break; + } + default: + break; + } + + return 0; +} + +int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx) +{ + const struct btf_ext_info *seg; + struct btf_ext_info_sec *sec; + int i, err; + + seg = &btf_ext->func_info; + for_each_btf_ext_sec(seg, sec) { + struct bpf_func_info_min *rec; + + for_each_btf_ext_rec(seg, sec, i, rec) { + err = visit(&rec->type_id, ctx); + if (err < 0) + return err; + } + } + + seg = &btf_ext->core_relo_info; + for_each_btf_ext_sec(seg, sec) { + struct bpf_core_relo *rec; + + for_each_btf_ext_rec(seg, sec, i, rec) { + err = visit(&rec->type_id, ctx); + if (err < 0) + return err; + } + } + + return 0; +} + +int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx) +{ + const struct btf_ext_info *seg; + struct btf_ext_info_sec *sec; + int i, err; + + seg = &btf_ext->func_info; + for_each_btf_ext_sec(seg, sec) { + err = visit(&sec->sec_name_off, ctx); + if (err) + return err; + } + + seg = &btf_ext->line_info; + for_each_btf_ext_sec(seg, sec) { + struct bpf_line_info_min *rec; + + err = visit(&sec->sec_name_off, ctx); + if (err) + return err; + + for_each_btf_ext_rec(seg, sec, i, rec) { + err = visit(&rec->file_name_off, ctx); + if (err) + return err; + err = visit(&rec->line_off, ctx); + if (err) + return err; + } + } + + seg = &btf_ext->core_relo_info; + for_each_btf_ext_sec(seg, sec) { + struct bpf_core_relo *rec; + + err = visit(&sec->sec_name_off, ctx); + if (err) + return err; + + for_each_btf_ext_rec(seg, sec, i, rec) { + err = visit(&rec->access_str_off, ctx); + if (err) + return err; + } + } + + return 0; +} diff --git a/bpftool/libbpf/src/btf.h b/bpftool/libbpf/src/btf.h new file mode 100644 index 0000000..8e6880d --- /dev/null +++ b/bpftool/libbpf/src/btf.h @@ -0,0 +1,575 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2018 Facebook */ +/*! \file */ + +#ifndef __LIBBPF_BTF_H +#define __LIBBPF_BTF_H + +#include +#include +#include +#include + +#include "libbpf_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define BTF_ELF_SEC ".BTF" +#define BTF_EXT_ELF_SEC ".BTF.ext" +#define MAPS_ELF_SEC ".maps" + +struct btf; +struct btf_ext; +struct btf_type; + +struct bpf_object; + +enum btf_endianness { + BTF_LITTLE_ENDIAN = 0, + BTF_BIG_ENDIAN = 1, +}; + +/** + * @brief **btf__free()** frees all data of a BTF object + * @param btf BTF object to free + */ +LIBBPF_API void btf__free(struct btf *btf); + +/** + * @brief **btf__new()** creates a new instance of a BTF object from the raw + * bytes of an ELF's BTF section + * @param data raw bytes + * @param size number of bytes passed in `data` + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new(const void *data, __u32 size); + +/** + * @brief **btf__new_split()** create a new instance of a BTF object from the + * provided raw data bytes. It takes another BTF instance, **base_btf**, which + * serves as a base BTF, which is extended by types in a newly created BTF + * instance + * @param data raw bytes + * @param size length of raw bytes + * @param base_btf the base BTF object + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * If *base_btf* is NULL, `btf__new_split()` is equivalent to `btf__new()` and + * creates non-split BTF. + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new_split(const void *data, __u32 size, struct btf *base_btf); + +/** + * @brief **btf__new_empty()** creates an empty BTF object. Use + * `btf__add_*()` to populate such BTF object. + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new_empty(void); + +/** + * @brief **btf__new_empty_split()** creates an unpopulated BTF object from an + * ELF BTF section except with a base BTF on top of which split BTF should be + * based + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * If *base_btf* is NULL, `btf__new_empty_split()` is equivalent to + * `btf__new_empty()` and creates non-split BTF. + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new_empty_split(struct btf *base_btf); + +LIBBPF_API struct btf *btf__parse(const char *path, struct btf_ext **btf_ext); +LIBBPF_API struct btf *btf__parse_split(const char *path, struct btf *base_btf); +LIBBPF_API struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext); +LIBBPF_API struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf); +LIBBPF_API struct btf *btf__parse_raw(const char *path); +LIBBPF_API struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf); + +LIBBPF_API struct btf *btf__load_vmlinux_btf(void); +LIBBPF_API struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf); + +LIBBPF_API struct btf *btf__load_from_kernel_by_id(__u32 id); +LIBBPF_API struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf); + +LIBBPF_API int btf__load_into_kernel(struct btf *btf); +LIBBPF_API __s32 btf__find_by_name(const struct btf *btf, + const char *type_name); +LIBBPF_API __s32 btf__find_by_name_kind(const struct btf *btf, + const char *type_name, __u32 kind); +LIBBPF_API __u32 btf__type_cnt(const struct btf *btf); +LIBBPF_API const struct btf *btf__base_btf(const struct btf *btf); +LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf, + __u32 id); +LIBBPF_API size_t btf__pointer_size(const struct btf *btf); +LIBBPF_API int btf__set_pointer_size(struct btf *btf, size_t ptr_sz); +LIBBPF_API enum btf_endianness btf__endianness(const struct btf *btf); +LIBBPF_API int btf__set_endianness(struct btf *btf, enum btf_endianness endian); +LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id); +LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id); +LIBBPF_API int btf__align_of(const struct btf *btf, __u32 id); +LIBBPF_API int btf__fd(const struct btf *btf); +LIBBPF_API void btf__set_fd(struct btf *btf, int fd); +LIBBPF_API const void *btf__raw_data(const struct btf *btf, __u32 *size); +LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset); +LIBBPF_API const char *btf__str_by_offset(const struct btf *btf, __u32 offset); + +LIBBPF_API struct btf_ext *btf_ext__new(const __u8 *data, __u32 size); +LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext); +LIBBPF_API const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size); + +LIBBPF_API int btf__find_str(struct btf *btf, const char *s); +LIBBPF_API int btf__add_str(struct btf *btf, const char *s); +LIBBPF_API int btf__add_type(struct btf *btf, const struct btf *src_btf, + const struct btf_type *src_type); +/** + * @brief **btf__add_btf()** appends all the BTF types from *src_btf* into *btf* + * @param btf BTF object which all the BTF types and strings are added to + * @param src_btf BTF object which all BTF types and referenced strings are copied from + * @return BTF type ID of the first appended BTF type, or negative error code + * + * **btf__add_btf()** can be used to simply and efficiently append the entire + * contents of one BTF object to another one. All the BTF type data is copied + * over, all referenced type IDs are adjusted by adding a necessary ID offset. + * Only strings referenced from BTF types are copied over and deduplicated, so + * if there were some unused strings in *src_btf*, those won't be copied over, + * which is consistent with the general string deduplication semantics of BTF + * writing APIs. + * + * If any error is encountered during this process, the contents of *btf* is + * left intact, which means that **btf__add_btf()** follows the transactional + * semantics and the operation as a whole is all-or-nothing. + * + * *src_btf* has to be non-split BTF, as of now copying types from split BTF + * is not supported and will result in -ENOTSUP error code returned. + */ +LIBBPF_API int btf__add_btf(struct btf *btf, const struct btf *src_btf); + +LIBBPF_API int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding); +LIBBPF_API int btf__add_float(struct btf *btf, const char *name, size_t byte_sz); +LIBBPF_API int btf__add_ptr(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_array(struct btf *btf, + int index_type_id, int elem_type_id, __u32 nr_elems); +/* struct/union construction APIs */ +LIBBPF_API int btf__add_struct(struct btf *btf, const char *name, __u32 sz); +LIBBPF_API int btf__add_union(struct btf *btf, const char *name, __u32 sz); +LIBBPF_API int btf__add_field(struct btf *btf, const char *name, int field_type_id, + __u32 bit_offset, __u32 bit_size); + +/* enum construction APIs */ +LIBBPF_API int btf__add_enum(struct btf *btf, const char *name, __u32 bytes_sz); +LIBBPF_API int btf__add_enum_value(struct btf *btf, const char *name, __s64 value); +LIBBPF_API int btf__add_enum64(struct btf *btf, const char *name, __u32 bytes_sz, bool is_signed); +LIBBPF_API int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value); + +enum btf_fwd_kind { + BTF_FWD_STRUCT = 0, + BTF_FWD_UNION = 1, + BTF_FWD_ENUM = 2, +}; + +LIBBPF_API int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind); +LIBBPF_API int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id); +LIBBPF_API int btf__add_volatile(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_const(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_restrict(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id); + +/* func and func_proto construction APIs */ +LIBBPF_API int btf__add_func(struct btf *btf, const char *name, + enum btf_func_linkage linkage, int proto_type_id); +LIBBPF_API int btf__add_func_proto(struct btf *btf, int ret_type_id); +LIBBPF_API int btf__add_func_param(struct btf *btf, const char *name, int type_id); + +/* var & datasec construction APIs */ +LIBBPF_API int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id); +LIBBPF_API int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz); +LIBBPF_API int btf__add_datasec_var_info(struct btf *btf, int var_type_id, + __u32 offset, __u32 byte_sz); + +/* tag construction API */ +LIBBPF_API int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, + int component_idx); + +struct btf_dedup_opts { + size_t sz; + /* optional .BTF.ext info to dedup along the main BTF info */ + struct btf_ext *btf_ext; + /* force hash collisions (used for testing) */ + bool force_collisions; + size_t :0; +}; +#define btf_dedup_opts__last_field force_collisions + +LIBBPF_API int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts); + +struct btf_dump; + +struct btf_dump_opts { + size_t sz; +}; +#define btf_dump_opts__last_field sz + +typedef void (*btf_dump_printf_fn_t)(void *ctx, const char *fmt, va_list args); + +LIBBPF_API struct btf_dump *btf_dump__new(const struct btf *btf, + btf_dump_printf_fn_t printf_fn, + void *ctx, + const struct btf_dump_opts *opts); + +LIBBPF_API void btf_dump__free(struct btf_dump *d); + +LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id); + +struct btf_dump_emit_type_decl_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* optional field name for type declaration, e.g.: + * - struct my_struct + * - void (*)(int) + * - char (*)[123] + */ + const char *field_name; + /* extra indentation level (in number of tabs) to emit for multi-line + * type declarations (e.g., anonymous struct); applies for lines + * starting from the second one (first line is assumed to have + * necessary indentation already + */ + int indent_level; + /* strip all the const/volatile/restrict mods */ + bool strip_mods; + size_t :0; +}; +#define btf_dump_emit_type_decl_opts__last_field strip_mods + +LIBBPF_API int +btf_dump__emit_type_decl(struct btf_dump *d, __u32 id, + const struct btf_dump_emit_type_decl_opts *opts); + + +struct btf_dump_type_data_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + const char *indent_str; + int indent_level; + /* below match "show" flags for bpf_show_snprintf() */ + bool compact; /* no newlines/indentation */ + bool skip_names; /* skip member/type names */ + bool emit_zeroes; /* show 0-valued fields */ + size_t :0; +}; +#define btf_dump_type_data_opts__last_field emit_zeroes + +LIBBPF_API int +btf_dump__dump_type_data(struct btf_dump *d, __u32 id, + const void *data, size_t data_sz, + const struct btf_dump_type_data_opts *opts); + +/* + * A set of helpers for easier BTF types handling. + * + * The inline functions below rely on constants from the kernel headers which + * may not be available for applications including this header file. To avoid + * compilation errors, we define all the constants here that were added after + * the initial introduction of the BTF_KIND* constants. + */ +#ifndef BTF_KIND_FUNC +#define BTF_KIND_FUNC 12 /* Function */ +#define BTF_KIND_FUNC_PROTO 13 /* Function Proto */ +#endif +#ifndef BTF_KIND_VAR +#define BTF_KIND_VAR 14 /* Variable */ +#define BTF_KIND_DATASEC 15 /* Section */ +#endif +#ifndef BTF_KIND_FLOAT +#define BTF_KIND_FLOAT 16 /* Floating point */ +#endif +/* The kernel header switched to enums, so the following were never #defined */ +#define BTF_KIND_DECL_TAG 17 /* Decl Tag */ +#define BTF_KIND_TYPE_TAG 18 /* Type Tag */ +#define BTF_KIND_ENUM64 19 /* Enum for up-to 64bit values */ + +static inline __u16 btf_kind(const struct btf_type *t) +{ + return BTF_INFO_KIND(t->info); +} + +static inline __u16 btf_vlen(const struct btf_type *t) +{ + return BTF_INFO_VLEN(t->info); +} + +static inline bool btf_kflag(const struct btf_type *t) +{ + return BTF_INFO_KFLAG(t->info); +} + +static inline bool btf_is_void(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_UNKN; +} + +static inline bool btf_is_int(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_INT; +} + +static inline bool btf_is_ptr(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_PTR; +} + +static inline bool btf_is_array(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_ARRAY; +} + +static inline bool btf_is_struct(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_STRUCT; +} + +static inline bool btf_is_union(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_UNION; +} + +static inline bool btf_is_composite(const struct btf_type *t) +{ + __u16 kind = btf_kind(t); + + return kind == BTF_KIND_STRUCT || kind == BTF_KIND_UNION; +} + +static inline bool btf_is_enum(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_ENUM; +} + +static inline bool btf_is_enum64(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_ENUM64; +} + +static inline bool btf_is_fwd(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FWD; +} + +static inline bool btf_is_typedef(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_TYPEDEF; +} + +static inline bool btf_is_volatile(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_VOLATILE; +} + +static inline bool btf_is_const(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_CONST; +} + +static inline bool btf_is_restrict(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_RESTRICT; +} + +static inline bool btf_is_mod(const struct btf_type *t) +{ + __u16 kind = btf_kind(t); + + return kind == BTF_KIND_VOLATILE || + kind == BTF_KIND_CONST || + kind == BTF_KIND_RESTRICT || + kind == BTF_KIND_TYPE_TAG; +} + +static inline bool btf_is_func(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FUNC; +} + +static inline bool btf_is_func_proto(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FUNC_PROTO; +} + +static inline bool btf_is_var(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_VAR; +} + +static inline bool btf_is_datasec(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_DATASEC; +} + +static inline bool btf_is_float(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FLOAT; +} + +static inline bool btf_is_decl_tag(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_DECL_TAG; +} + +static inline bool btf_is_type_tag(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_TYPE_TAG; +} + +static inline bool btf_is_any_enum(const struct btf_type *t) +{ + return btf_is_enum(t) || btf_is_enum64(t); +} + +static inline bool btf_kind_core_compat(const struct btf_type *t1, + const struct btf_type *t2) +{ + return btf_kind(t1) == btf_kind(t2) || + (btf_is_any_enum(t1) && btf_is_any_enum(t2)); +} + +static inline __u8 btf_int_encoding(const struct btf_type *t) +{ + return BTF_INT_ENCODING(*(__u32 *)(t + 1)); +} + +static inline __u8 btf_int_offset(const struct btf_type *t) +{ + return BTF_INT_OFFSET(*(__u32 *)(t + 1)); +} + +static inline __u8 btf_int_bits(const struct btf_type *t) +{ + return BTF_INT_BITS(*(__u32 *)(t + 1)); +} + +static inline struct btf_array *btf_array(const struct btf_type *t) +{ + return (struct btf_array *)(t + 1); +} + +static inline struct btf_enum *btf_enum(const struct btf_type *t) +{ + return (struct btf_enum *)(t + 1); +} + +struct btf_enum64; + +static inline struct btf_enum64 *btf_enum64(const struct btf_type *t) +{ + return (struct btf_enum64 *)(t + 1); +} + +static inline __u64 btf_enum64_value(const struct btf_enum64 *e) +{ + /* struct btf_enum64 is introduced in Linux 6.0, which is very + * bleeding-edge. Here we are avoiding relying on struct btf_enum64 + * definition coming from kernel UAPI headers to support wider range + * of system-wide kernel headers. + * + * Given this header can be also included from C++ applications, that + * further restricts C tricks we can use (like using compatible + * anonymous struct). So just treat struct btf_enum64 as + * a three-element array of u32 and access second (lo32) and third + * (hi32) elements directly. + * + * For reference, here is a struct btf_enum64 definition: + * + * const struct btf_enum64 { + * __u32 name_off; + * __u32 val_lo32; + * __u32 val_hi32; + * }; + */ + const __u32 *e64 = (const __u32 *)e; + + return ((__u64)e64[2] << 32) | e64[1]; +} + +static inline struct btf_member *btf_members(const struct btf_type *t) +{ + return (struct btf_member *)(t + 1); +} + +/* Get bit offset of a member with specified index. */ +static inline __u32 btf_member_bit_offset(const struct btf_type *t, + __u32 member_idx) +{ + const struct btf_member *m = btf_members(t) + member_idx; + bool kflag = btf_kflag(t); + + return kflag ? BTF_MEMBER_BIT_OFFSET(m->offset) : m->offset; +} +/* + * Get bitfield size of a member, assuming t is BTF_KIND_STRUCT or + * BTF_KIND_UNION. If member is not a bitfield, zero is returned. + */ +static inline __u32 btf_member_bitfield_size(const struct btf_type *t, + __u32 member_idx) +{ + const struct btf_member *m = btf_members(t) + member_idx; + bool kflag = btf_kflag(t); + + return kflag ? BTF_MEMBER_BITFIELD_SIZE(m->offset) : 0; +} + +static inline struct btf_param *btf_params(const struct btf_type *t) +{ + return (struct btf_param *)(t + 1); +} + +static inline struct btf_var *btf_var(const struct btf_type *t) +{ + return (struct btf_var *)(t + 1); +} + +static inline struct btf_var_secinfo * +btf_var_secinfos(const struct btf_type *t) +{ + return (struct btf_var_secinfo *)(t + 1); +} + +struct btf_decl_tag; +static inline struct btf_decl_tag *btf_decl_tag(const struct btf_type *t) +{ + return (struct btf_decl_tag *)(t + 1); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_BTF_H */ diff --git a/bpftool/libbpf/src/btf_dump.c b/bpftool/libbpf/src/btf_dump.c new file mode 100644 index 0000000..580985e --- /dev/null +++ b/bpftool/libbpf/src/btf_dump.c @@ -0,0 +1,2526 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * BTF-to-C type converter. + * + * Copyright (c) 2019 Facebook + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "btf.h" +#include "hashmap.h" +#include "libbpf.h" +#include "libbpf_internal.h" + +static const char PREFIXES[] = "\t\t\t\t\t\t\t\t\t\t\t\t\t"; +static const size_t PREFIX_CNT = sizeof(PREFIXES) - 1; + +static const char *pfx(int lvl) +{ + return lvl >= PREFIX_CNT ? PREFIXES : &PREFIXES[PREFIX_CNT - lvl]; +} + +enum btf_dump_type_order_state { + NOT_ORDERED, + ORDERING, + ORDERED, +}; + +enum btf_dump_type_emit_state { + NOT_EMITTED, + EMITTING, + EMITTED, +}; + +/* per-type auxiliary state */ +struct btf_dump_type_aux_state { + /* topological sorting state */ + enum btf_dump_type_order_state order_state: 2; + /* emitting state used to determine the need for forward declaration */ + enum btf_dump_type_emit_state emit_state: 2; + /* whether forward declaration was already emitted */ + __u8 fwd_emitted: 1; + /* whether unique non-duplicate name was already assigned */ + __u8 name_resolved: 1; + /* whether type is referenced from any other type */ + __u8 referenced: 1; +}; + +/* indent string length; one indent string is added for each indent level */ +#define BTF_DATA_INDENT_STR_LEN 32 + +/* + * Common internal data for BTF type data dump operations. + */ +struct btf_dump_data { + const void *data_end; /* end of valid data to show */ + bool compact; + bool skip_names; + bool emit_zeroes; + __u8 indent_lvl; /* base indent level */ + char indent_str[BTF_DATA_INDENT_STR_LEN]; + /* below are used during iteration */ + int depth; + bool is_array_member; + bool is_array_terminated; + bool is_array_char; +}; + +struct btf_dump { + const struct btf *btf; + btf_dump_printf_fn_t printf_fn; + void *cb_ctx; + int ptr_sz; + bool strip_mods; + bool skip_anon_defs; + int last_id; + + /* per-type auxiliary state */ + struct btf_dump_type_aux_state *type_states; + size_t type_states_cap; + /* per-type optional cached unique name, must be freed, if present */ + const char **cached_names; + size_t cached_names_cap; + + /* topo-sorted list of dependent type definitions */ + __u32 *emit_queue; + int emit_queue_cap; + int emit_queue_cnt; + + /* + * stack of type declarations (e.g., chain of modifiers, arrays, + * funcs, etc) + */ + __u32 *decl_stack; + int decl_stack_cap; + int decl_stack_cnt; + + /* maps struct/union/enum name to a number of name occurrences */ + struct hashmap *type_names; + /* + * maps typedef identifiers and enum value names to a number of such + * name occurrences + */ + struct hashmap *ident_names; + /* + * data for typed display; allocated if needed. + */ + struct btf_dump_data *typed_dump; +}; + +static size_t str_hash_fn(long key, void *ctx) +{ + return str_hash((void *)key); +} + +static bool str_equal_fn(long a, long b, void *ctx) +{ + return strcmp((void *)a, (void *)b) == 0; +} + +static const char *btf_name_of(const struct btf_dump *d, __u32 name_off) +{ + return btf__name_by_offset(d->btf, name_off); +} + +static void btf_dump_printf(const struct btf_dump *d, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + d->printf_fn(d->cb_ctx, fmt, args); + va_end(args); +} + +static int btf_dump_mark_referenced(struct btf_dump *d); +static int btf_dump_resize(struct btf_dump *d); + +struct btf_dump *btf_dump__new(const struct btf *btf, + btf_dump_printf_fn_t printf_fn, + void *ctx, + const struct btf_dump_opts *opts) +{ + struct btf_dump *d; + int err; + + if (!OPTS_VALID(opts, btf_dump_opts)) + return libbpf_err_ptr(-EINVAL); + + if (!printf_fn) + return libbpf_err_ptr(-EINVAL); + + d = calloc(1, sizeof(struct btf_dump)); + if (!d) + return libbpf_err_ptr(-ENOMEM); + + d->btf = btf; + d->printf_fn = printf_fn; + d->cb_ctx = ctx; + d->ptr_sz = btf__pointer_size(btf) ? : sizeof(void *); + + d->type_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); + if (IS_ERR(d->type_names)) { + err = PTR_ERR(d->type_names); + d->type_names = NULL; + goto err; + } + d->ident_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); + if (IS_ERR(d->ident_names)) { + err = PTR_ERR(d->ident_names); + d->ident_names = NULL; + goto err; + } + + err = btf_dump_resize(d); + if (err) + goto err; + + return d; +err: + btf_dump__free(d); + return libbpf_err_ptr(err); +} + +static int btf_dump_resize(struct btf_dump *d) +{ + int err, last_id = btf__type_cnt(d->btf) - 1; + + if (last_id <= d->last_id) + return 0; + + if (libbpf_ensure_mem((void **)&d->type_states, &d->type_states_cap, + sizeof(*d->type_states), last_id + 1)) + return -ENOMEM; + if (libbpf_ensure_mem((void **)&d->cached_names, &d->cached_names_cap, + sizeof(*d->cached_names), last_id + 1)) + return -ENOMEM; + + if (d->last_id == 0) { + /* VOID is special */ + d->type_states[0].order_state = ORDERED; + d->type_states[0].emit_state = EMITTED; + } + + /* eagerly determine referenced types for anon enums */ + err = btf_dump_mark_referenced(d); + if (err) + return err; + + d->last_id = last_id; + return 0; +} + +static void btf_dump_free_names(struct hashmap *map) +{ + size_t bkt; + struct hashmap_entry *cur; + + hashmap__for_each_entry(map, cur, bkt) + free((void *)cur->pkey); + + hashmap__free(map); +} + +void btf_dump__free(struct btf_dump *d) +{ + int i; + + if (IS_ERR_OR_NULL(d)) + return; + + free(d->type_states); + if (d->cached_names) { + /* any set cached name is owned by us and should be freed */ + for (i = 0; i <= d->last_id; i++) { + if (d->cached_names[i]) + free((void *)d->cached_names[i]); + } + } + free(d->cached_names); + free(d->emit_queue); + free(d->decl_stack); + btf_dump_free_names(d->type_names); + btf_dump_free_names(d->ident_names); + + free(d); +} + +static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr); +static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id); + +/* + * Dump BTF type in a compilable C syntax, including all the necessary + * dependent types, necessary for compilation. If some of the dependent types + * were already emitted as part of previous btf_dump__dump_type() invocation + * for another type, they won't be emitted again. This API allows callers to + * filter out BTF types according to user-defined criterias and emitted only + * minimal subset of types, necessary to compile everything. Full struct/union + * definitions will still be emitted, even if the only usage is through + * pointer and could be satisfied with just a forward declaration. + * + * Dumping is done in two high-level passes: + * 1. Topologically sort type definitions to satisfy C rules of compilation. + * 2. Emit type definitions in C syntax. + * + * Returns 0 on success; <0, otherwise. + */ +int btf_dump__dump_type(struct btf_dump *d, __u32 id) +{ + int err, i; + + if (id >= btf__type_cnt(d->btf)) + return libbpf_err(-EINVAL); + + err = btf_dump_resize(d); + if (err) + return libbpf_err(err); + + d->emit_queue_cnt = 0; + err = btf_dump_order_type(d, id, false); + if (err < 0) + return libbpf_err(err); + + for (i = 0; i < d->emit_queue_cnt; i++) + btf_dump_emit_type(d, d->emit_queue[i], 0 /*top-level*/); + + return 0; +} + +/* + * Mark all types that are referenced from any other type. This is used to + * determine top-level anonymous enums that need to be emitted as an + * independent type declarations. + * Anonymous enums come in two flavors: either embedded in a struct's field + * definition, in which case they have to be declared inline as part of field + * type declaration; or as a top-level anonymous enum, typically used for + * declaring global constants. It's impossible to distinguish between two + * without knowning whether given enum type was referenced from other type: + * top-level anonymous enum won't be referenced by anything, while embedded + * one will. + */ +static int btf_dump_mark_referenced(struct btf_dump *d) +{ + int i, j, n = btf__type_cnt(d->btf); + const struct btf_type *t; + __u16 vlen; + + for (i = d->last_id + 1; i < n; i++) { + t = btf__type_by_id(d->btf, i); + vlen = btf_vlen(t); + + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FWD: + case BTF_KIND_FLOAT: + break; + + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_VAR: + case BTF_KIND_DECL_TAG: + case BTF_KIND_TYPE_TAG: + d->type_states[t->type].referenced = 1; + break; + + case BTF_KIND_ARRAY: { + const struct btf_array *a = btf_array(t); + + d->type_states[a->index_type].referenced = 1; + d->type_states[a->type].referenced = 1; + break; + } + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m = btf_members(t); + + for (j = 0; j < vlen; j++, m++) + d->type_states[m->type].referenced = 1; + break; + } + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *p = btf_params(t); + + for (j = 0; j < vlen; j++, p++) + d->type_states[p->type].referenced = 1; + break; + } + case BTF_KIND_DATASEC: { + const struct btf_var_secinfo *v = btf_var_secinfos(t); + + for (j = 0; j < vlen; j++, v++) + d->type_states[v->type].referenced = 1; + break; + } + default: + return -EINVAL; + } + } + return 0; +} + +static int btf_dump_add_emit_queue_id(struct btf_dump *d, __u32 id) +{ + __u32 *new_queue; + size_t new_cap; + + if (d->emit_queue_cnt >= d->emit_queue_cap) { + new_cap = max(16, d->emit_queue_cap * 3 / 2); + new_queue = libbpf_reallocarray(d->emit_queue, new_cap, sizeof(new_queue[0])); + if (!new_queue) + return -ENOMEM; + d->emit_queue = new_queue; + d->emit_queue_cap = new_cap; + } + + d->emit_queue[d->emit_queue_cnt++] = id; + return 0; +} + +/* + * Determine order of emitting dependent types and specified type to satisfy + * C compilation rules. This is done through topological sorting with an + * additional complication which comes from C rules. The main idea for C is + * that if some type is "embedded" into a struct/union, it's size needs to be + * known at the time of definition of containing type. E.g., for: + * + * struct A {}; + * struct B { struct A x; } + * + * struct A *HAS* to be defined before struct B, because it's "embedded", + * i.e., it is part of struct B layout. But in the following case: + * + * struct A; + * struct B { struct A *x; } + * struct A {}; + * + * it's enough to just have a forward declaration of struct A at the time of + * struct B definition, as struct B has a pointer to struct A, so the size of + * field x is known without knowing struct A size: it's sizeof(void *). + * + * Unfortunately, there are some trickier cases we need to handle, e.g.: + * + * struct A {}; // if this was forward-declaration: compilation error + * struct B { + * struct { // anonymous struct + * struct A y; + * } *x; + * }; + * + * In this case, struct B's field x is a pointer, so it's size is known + * regardless of the size of (anonymous) struct it points to. But because this + * struct is anonymous and thus defined inline inside struct B, *and* it + * embeds struct A, compiler requires full definition of struct A to be known + * before struct B can be defined. This creates a transitive dependency + * between struct A and struct B. If struct A was forward-declared before + * struct B definition and fully defined after struct B definition, that would + * trigger compilation error. + * + * All this means that while we are doing topological sorting on BTF type + * graph, we need to determine relationships between different types (graph + * nodes): + * - weak link (relationship) between X and Y, if Y *CAN* be + * forward-declared at the point of X definition; + * - strong link, if Y *HAS* to be fully-defined before X can be defined. + * + * The rule is as follows. Given a chain of BTF types from X to Y, if there is + * BTF_KIND_PTR type in the chain and at least one non-anonymous type + * Z (excluding X, including Y), then link is weak. Otherwise, it's strong. + * Weak/strong relationship is determined recursively during DFS traversal and + * is returned as a result from btf_dump_order_type(). + * + * btf_dump_order_type() is trying to avoid unnecessary forward declarations, + * but it is not guaranteeing that no extraneous forward declarations will be + * emitted. + * + * To avoid extra work, algorithm marks some of BTF types as ORDERED, when + * it's done with them, but not for all (e.g., VOLATILE, CONST, RESTRICT, + * ARRAY, FUNC_PROTO), as weak/strong semantics for those depends on the + * entire graph path, so depending where from one came to that BTF type, it + * might cause weak or strong ordering. For types like STRUCT/UNION/INT/ENUM, + * once they are processed, there is no need to do it again, so they are + * marked as ORDERED. We can mark PTR as ORDERED as well, as it semi-forces + * weak link, unless subsequent referenced STRUCT/UNION/ENUM is anonymous. But + * in any case, once those are processed, no need to do it again, as the + * result won't change. + * + * Returns: + * - 1, if type is part of strong link (so there is strong topological + * ordering requirements); + * - 0, if type is part of weak link (so can be satisfied through forward + * declaration); + * - <0, on error (e.g., unsatisfiable type loop detected). + */ +static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr) +{ + /* + * Order state is used to detect strong link cycles, but only for BTF + * kinds that are or could be an independent definition (i.e., + * stand-alone fwd decl, enum, typedef, struct, union). Ptrs, arrays, + * func_protos, modifiers are just means to get to these definitions. + * Int/void don't need definitions, they are assumed to be always + * properly defined. We also ignore datasec, var, and funcs for now. + * So for all non-defining kinds, we never even set ordering state, + * for defining kinds we set ORDERING and subsequently ORDERED if it + * forms a strong link. + */ + struct btf_dump_type_aux_state *tstate = &d->type_states[id]; + const struct btf_type *t; + __u16 vlen; + int err, i; + + /* return true, letting typedefs know that it's ok to be emitted */ + if (tstate->order_state == ORDERED) + return 1; + + t = btf__type_by_id(d->btf, id); + + if (tstate->order_state == ORDERING) { + /* type loop, but resolvable through fwd declaration */ + if (btf_is_composite(t) && through_ptr && t->name_off != 0) + return 0; + pr_warn("unsatisfiable type cycle, id:[%u]\n", id); + return -ELOOP; + } + + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + tstate->order_state = ORDERED; + return 0; + + case BTF_KIND_PTR: + err = btf_dump_order_type(d, t->type, true); + tstate->order_state = ORDERED; + return err; + + case BTF_KIND_ARRAY: + return btf_dump_order_type(d, btf_array(t)->type, false); + + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m = btf_members(t); + /* + * struct/union is part of strong link, only if it's embedded + * (so no ptr in a path) or it's anonymous (so has to be + * defined inline, even if declared through ptr) + */ + if (through_ptr && t->name_off != 0) + return 0; + + tstate->order_state = ORDERING; + + vlen = btf_vlen(t); + for (i = 0; i < vlen; i++, m++) { + err = btf_dump_order_type(d, m->type, false); + if (err < 0) + return err; + } + + if (t->name_off != 0) { + err = btf_dump_add_emit_queue_id(d, id); + if (err < 0) + return err; + } + + tstate->order_state = ORDERED; + return 1; + } + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FWD: + /* + * non-anonymous or non-referenced enums are top-level + * declarations and should be emitted. Same logic can be + * applied to FWDs, it won't hurt anyways. + */ + if (t->name_off != 0 || !tstate->referenced) { + err = btf_dump_add_emit_queue_id(d, id); + if (err) + return err; + } + tstate->order_state = ORDERED; + return 1; + + case BTF_KIND_TYPEDEF: { + int is_strong; + + is_strong = btf_dump_order_type(d, t->type, through_ptr); + if (is_strong < 0) + return is_strong; + + /* typedef is similar to struct/union w.r.t. fwd-decls */ + if (through_ptr && !is_strong) + return 0; + + /* typedef is always a named definition */ + err = btf_dump_add_emit_queue_id(d, id); + if (err) + return err; + + d->type_states[id].order_state = ORDERED; + return 1; + } + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_TYPE_TAG: + return btf_dump_order_type(d, t->type, through_ptr); + + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *p = btf_params(t); + bool is_strong; + + err = btf_dump_order_type(d, t->type, through_ptr); + if (err < 0) + return err; + is_strong = err > 0; + + vlen = btf_vlen(t); + for (i = 0; i < vlen; i++, p++) { + err = btf_dump_order_type(d, p->type, through_ptr); + if (err < 0) + return err; + if (err > 0) + is_strong = true; + } + return is_strong; + } + case BTF_KIND_FUNC: + case BTF_KIND_VAR: + case BTF_KIND_DATASEC: + case BTF_KIND_DECL_TAG: + d->type_states[id].order_state = ORDERED; + return 0; + + default: + return -EINVAL; + } +} + +static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id, + const struct btf_type *t); + +static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id, + const struct btf_type *t); +static void btf_dump_emit_struct_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, int lvl); + +static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id, + const struct btf_type *t); +static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, int lvl); + +static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id, + const struct btf_type *t); + +static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, int lvl); + +/* a local view into a shared stack */ +struct id_stack { + const __u32 *ids; + int cnt; +}; + +static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id, + const char *fname, int lvl); +static void btf_dump_emit_type_chain(struct btf_dump *d, + struct id_stack *decl_stack, + const char *fname, int lvl); + +static const char *btf_dump_type_name(struct btf_dump *d, __u32 id); +static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id); +static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map, + const char *orig_name); + +static bool btf_dump_is_blacklisted(struct btf_dump *d, __u32 id) +{ + const struct btf_type *t = btf__type_by_id(d->btf, id); + + /* __builtin_va_list is a compiler built-in, which causes compilation + * errors, when compiling w/ different compiler, then used to compile + * original code (e.g., GCC to compile kernel, Clang to use generated + * C header from BTF). As it is built-in, it should be already defined + * properly internally in compiler. + */ + if (t->name_off == 0) + return false; + return strcmp(btf_name_of(d, t->name_off), "__builtin_va_list") == 0; +} + +/* + * Emit C-syntax definitions of types from chains of BTF types. + * + * High-level handling of determining necessary forward declarations are handled + * by btf_dump_emit_type() itself, but all nitty-gritty details of emitting type + * declarations/definitions in C syntax are handled by a combo of + * btf_dump_emit_type_decl()/btf_dump_emit_type_chain() w/ delegation to + * corresponding btf_dump_emit_*_{def,fwd}() functions. + * + * We also keep track of "containing struct/union type ID" to determine when + * we reference it from inside and thus can avoid emitting unnecessary forward + * declaration. + * + * This algorithm is designed in such a way, that even if some error occurs + * (either technical, e.g., out of memory, or logical, i.e., malformed BTF + * that doesn't comply to C rules completely), algorithm will try to proceed + * and produce as much meaningful output as possible. + */ +static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id) +{ + struct btf_dump_type_aux_state *tstate = &d->type_states[id]; + bool top_level_def = cont_id == 0; + const struct btf_type *t; + __u16 kind; + + if (tstate->emit_state == EMITTED) + return; + + t = btf__type_by_id(d->btf, id); + kind = btf_kind(t); + + if (tstate->emit_state == EMITTING) { + if (tstate->fwd_emitted) + return; + + switch (kind) { + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + /* + * if we are referencing a struct/union that we are + * part of - then no need for fwd declaration + */ + if (id == cont_id) + return; + if (t->name_off == 0) { + pr_warn("anonymous struct/union loop, id:[%u]\n", + id); + return; + } + btf_dump_emit_struct_fwd(d, id, t); + btf_dump_printf(d, ";\n\n"); + tstate->fwd_emitted = 1; + break; + case BTF_KIND_TYPEDEF: + /* + * for typedef fwd_emitted means typedef definition + * was emitted, but it can be used only for "weak" + * references through pointer only, not for embedding + */ + if (!btf_dump_is_blacklisted(d, id)) { + btf_dump_emit_typedef_def(d, id, t, 0); + btf_dump_printf(d, ";\n\n"); + } + tstate->fwd_emitted = 1; + break; + default: + break; + } + + return; + } + + switch (kind) { + case BTF_KIND_INT: + /* Emit type alias definitions if necessary */ + btf_dump_emit_missing_aliases(d, id, t); + + tstate->emit_state = EMITTED; + break; + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + if (top_level_def) { + btf_dump_emit_enum_def(d, id, t, 0); + btf_dump_printf(d, ";\n\n"); + } + tstate->emit_state = EMITTED; + break; + case BTF_KIND_PTR: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_TYPE_TAG: + btf_dump_emit_type(d, t->type, cont_id); + break; + case BTF_KIND_ARRAY: + btf_dump_emit_type(d, btf_array(t)->type, cont_id); + break; + case BTF_KIND_FWD: + btf_dump_emit_fwd_def(d, id, t); + btf_dump_printf(d, ";\n\n"); + tstate->emit_state = EMITTED; + break; + case BTF_KIND_TYPEDEF: + tstate->emit_state = EMITTING; + btf_dump_emit_type(d, t->type, id); + /* + * typedef can server as both definition and forward + * declaration; at this stage someone depends on + * typedef as a forward declaration (refers to it + * through pointer), so unless we already did it, + * emit typedef as a forward declaration + */ + if (!tstate->fwd_emitted && !btf_dump_is_blacklisted(d, id)) { + btf_dump_emit_typedef_def(d, id, t, 0); + btf_dump_printf(d, ";\n\n"); + } + tstate->emit_state = EMITTED; + break; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + tstate->emit_state = EMITTING; + /* if it's a top-level struct/union definition or struct/union + * is anonymous, then in C we'll be emitting all fields and + * their types (as opposed to just `struct X`), so we need to + * make sure that all types, referenced from struct/union + * members have necessary forward-declarations, where + * applicable + */ + if (top_level_def || t->name_off == 0) { + const struct btf_member *m = btf_members(t); + __u16 vlen = btf_vlen(t); + int i, new_cont_id; + + new_cont_id = t->name_off == 0 ? cont_id : id; + for (i = 0; i < vlen; i++, m++) + btf_dump_emit_type(d, m->type, new_cont_id); + } else if (!tstate->fwd_emitted && id != cont_id) { + btf_dump_emit_struct_fwd(d, id, t); + btf_dump_printf(d, ";\n\n"); + tstate->fwd_emitted = 1; + } + + if (top_level_def) { + btf_dump_emit_struct_def(d, id, t, 0); + btf_dump_printf(d, ";\n\n"); + tstate->emit_state = EMITTED; + } else { + tstate->emit_state = NOT_EMITTED; + } + break; + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *p = btf_params(t); + __u16 n = btf_vlen(t); + int i; + + btf_dump_emit_type(d, t->type, cont_id); + for (i = 0; i < n; i++, p++) + btf_dump_emit_type(d, p->type, cont_id); + + break; + } + default: + break; + } +} + +static bool btf_is_struct_packed(const struct btf *btf, __u32 id, + const struct btf_type *t) +{ + const struct btf_member *m; + int max_align = 1, align, i, bit_sz; + __u16 vlen; + + m = btf_members(t); + vlen = btf_vlen(t); + /* all non-bitfield fields have to be naturally aligned */ + for (i = 0; i < vlen; i++, m++) { + align = btf__align_of(btf, m->type); + bit_sz = btf_member_bitfield_size(t, i); + if (align && bit_sz == 0 && m->offset % (8 * align) != 0) + return true; + max_align = max(align, max_align); + } + /* size of a non-packed struct has to be a multiple of its alignment */ + if (t->size % max_align != 0) + return true; + /* + * if original struct was marked as packed, but its layout is + * naturally aligned, we'll detect that it's not packed + */ + return false; +} + +static void btf_dump_emit_bit_padding(const struct btf_dump *d, + int cur_off, int next_off, int next_align, + bool in_bitfield, int lvl) +{ + const struct { + const char *name; + int bits; + } pads[] = { + {"long", d->ptr_sz * 8}, {"int", 32}, {"short", 16}, {"char", 8} + }; + int new_off, pad_bits, bits, i; + const char *pad_type; + + if (cur_off >= next_off) + return; /* no gap */ + + /* For filling out padding we want to take advantage of + * natural alignment rules to minimize unnecessary explicit + * padding. First, we find the largest type (among long, int, + * short, or char) that can be used to force naturally aligned + * boundary. Once determined, we'll use such type to fill in + * the remaining padding gap. In some cases we can rely on + * compiler filling some gaps, but sometimes we need to force + * alignment to close natural alignment with markers like + * `long: 0` (this is always the case for bitfields). Note + * that even if struct itself has, let's say 4-byte alignment + * (i.e., it only uses up to int-aligned types), using `long: + * X;` explicit padding doesn't actually change struct's + * overall alignment requirements, but compiler does take into + * account that type's (long, in this example) natural + * alignment requirements when adding implicit padding. We use + * this fact heavily and don't worry about ruining correct + * struct alignment requirement. + */ + for (i = 0; i < ARRAY_SIZE(pads); i++) { + pad_bits = pads[i].bits; + pad_type = pads[i].name; + + new_off = roundup(cur_off, pad_bits); + if (new_off <= next_off) + break; + } + + if (new_off > cur_off && new_off <= next_off) { + /* We need explicit `: 0` aligning mark if next + * field is right on alignment offset and its + * alignment requirement is less strict than 's + * alignment (so compiler won't naturally align to the + * offset we expect), or if subsequent `: X`, + * will actually completely fit in the remaining hole, + * making compiler basically ignore `: X` + * completely. + */ + if (in_bitfield || + (new_off == next_off && roundup(cur_off, next_align * 8) != new_off) || + (new_off != next_off && next_off - new_off <= new_off - cur_off)) + /* but for bitfields we'll emit explicit bit count */ + btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, + in_bitfield ? new_off - cur_off : 0); + cur_off = new_off; + } + + /* Now we know we start at naturally aligned offset for a chosen + * padding type (long, int, short, or char), and so the rest is just + * a straightforward filling of remaining padding gap with full + * `: sizeof();` markers, except for the last one, which + * might need smaller than sizeof() padding. + */ + while (cur_off != next_off) { + bits = min(next_off - cur_off, pad_bits); + if (bits == pad_bits) { + btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, pad_bits); + cur_off += bits; + continue; + } + /* For the remainder padding that doesn't cover entire + * pad_type bit length, we pick the smallest necessary type. + * This is pure aesthetics, we could have just used `long`, + * but having smallest necessary one communicates better the + * scale of the padding gap. + */ + for (i = ARRAY_SIZE(pads) - 1; i >= 0; i--) { + pad_type = pads[i].name; + pad_bits = pads[i].bits; + if (pad_bits < bits) + continue; + + btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, bits); + cur_off += bits; + break; + } + } +} + +static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id, + const struct btf_type *t) +{ + btf_dump_printf(d, "%s%s%s", + btf_is_struct(t) ? "struct" : "union", + t->name_off ? " " : "", + btf_dump_type_name(d, id)); +} + +static void btf_dump_emit_struct_def(struct btf_dump *d, + __u32 id, + const struct btf_type *t, + int lvl) +{ + const struct btf_member *m = btf_members(t); + bool is_struct = btf_is_struct(t); + bool packed, prev_bitfield = false; + int align, i, off = 0; + __u16 vlen = btf_vlen(t); + + align = btf__align_of(d->btf, id); + packed = is_struct ? btf_is_struct_packed(d->btf, id, t) : 0; + + btf_dump_printf(d, "%s%s%s {", + is_struct ? "struct" : "union", + t->name_off ? " " : "", + btf_dump_type_name(d, id)); + + for (i = 0; i < vlen; i++, m++) { + const char *fname; + int m_off, m_sz, m_align; + bool in_bitfield; + + fname = btf_name_of(d, m->name_off); + m_sz = btf_member_bitfield_size(t, i); + m_off = btf_member_bit_offset(t, i); + m_align = packed ? 1 : btf__align_of(d->btf, m->type); + + in_bitfield = prev_bitfield && m_sz != 0; + + btf_dump_emit_bit_padding(d, off, m_off, m_align, in_bitfield, lvl + 1); + btf_dump_printf(d, "\n%s", pfx(lvl + 1)); + btf_dump_emit_type_decl(d, m->type, fname, lvl + 1); + + if (m_sz) { + btf_dump_printf(d, ": %d", m_sz); + off = m_off + m_sz; + prev_bitfield = true; + } else { + m_sz = max((__s64)0, btf__resolve_size(d->btf, m->type)); + off = m_off + m_sz * 8; + prev_bitfield = false; + } + + btf_dump_printf(d, ";"); + } + + /* pad at the end, if necessary */ + if (is_struct) + btf_dump_emit_bit_padding(d, off, t->size * 8, align, false, lvl + 1); + + /* + * Keep `struct empty {}` on a single line, + * only print newline when there are regular or padding fields. + */ + if (vlen || t->size) { + btf_dump_printf(d, "\n"); + btf_dump_printf(d, "%s}", pfx(lvl)); + } else { + btf_dump_printf(d, "}"); + } + if (packed) + btf_dump_printf(d, " __attribute__((packed))"); +} + +static const char *missing_base_types[][2] = { + /* + * GCC emits typedefs to its internal __PolyX_t types when compiling Arm + * SIMD intrinsics. Alias them to standard base types. + */ + { "__Poly8_t", "unsigned char" }, + { "__Poly16_t", "unsigned short" }, + { "__Poly64_t", "unsigned long long" }, + { "__Poly128_t", "unsigned __int128" }, +}; + +static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id, + const struct btf_type *t) +{ + const char *name = btf_dump_type_name(d, id); + int i; + + for (i = 0; i < ARRAY_SIZE(missing_base_types); i++) { + if (strcmp(name, missing_base_types[i][0]) == 0) { + btf_dump_printf(d, "typedef %s %s;\n\n", + missing_base_types[i][1], name); + break; + } + } +} + +static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id, + const struct btf_type *t) +{ + btf_dump_printf(d, "enum %s", btf_dump_type_name(d, id)); +} + +static void btf_dump_emit_enum32_val(struct btf_dump *d, + const struct btf_type *t, + int lvl, __u16 vlen) +{ + const struct btf_enum *v = btf_enum(t); + bool is_signed = btf_kflag(t); + const char *fmt_str; + const char *name; + size_t dup_cnt; + int i; + + for (i = 0; i < vlen; i++, v++) { + name = btf_name_of(d, v->name_off); + /* enumerators share namespace with typedef idents */ + dup_cnt = btf_dump_name_dups(d, d->ident_names, name); + if (dup_cnt > 1) { + fmt_str = is_signed ? "\n%s%s___%zd = %d," : "\n%s%s___%zd = %u,"; + btf_dump_printf(d, fmt_str, pfx(lvl + 1), name, dup_cnt, v->val); + } else { + fmt_str = is_signed ? "\n%s%s = %d," : "\n%s%s = %u,"; + btf_dump_printf(d, fmt_str, pfx(lvl + 1), name, v->val); + } + } +} + +static void btf_dump_emit_enum64_val(struct btf_dump *d, + const struct btf_type *t, + int lvl, __u16 vlen) +{ + const struct btf_enum64 *v = btf_enum64(t); + bool is_signed = btf_kflag(t); + const char *fmt_str; + const char *name; + size_t dup_cnt; + __u64 val; + int i; + + for (i = 0; i < vlen; i++, v++) { + name = btf_name_of(d, v->name_off); + dup_cnt = btf_dump_name_dups(d, d->ident_names, name); + val = btf_enum64_value(v); + if (dup_cnt > 1) { + fmt_str = is_signed ? "\n%s%s___%zd = %lldLL," + : "\n%s%s___%zd = %lluULL,"; + btf_dump_printf(d, fmt_str, + pfx(lvl + 1), name, dup_cnt, + (unsigned long long)val); + } else { + fmt_str = is_signed ? "\n%s%s = %lldLL," + : "\n%s%s = %lluULL,"; + btf_dump_printf(d, fmt_str, + pfx(lvl + 1), name, + (unsigned long long)val); + } + } +} +static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, + int lvl) +{ + __u16 vlen = btf_vlen(t); + + btf_dump_printf(d, "enum%s%s", + t->name_off ? " " : "", + btf_dump_type_name(d, id)); + + if (!vlen) + return; + + btf_dump_printf(d, " {"); + if (btf_is_enum(t)) + btf_dump_emit_enum32_val(d, t, lvl, vlen); + else + btf_dump_emit_enum64_val(d, t, lvl, vlen); + btf_dump_printf(d, "\n%s}", pfx(lvl)); + + /* special case enums with special sizes */ + if (t->size == 1) { + /* one-byte enums can be forced with mode(byte) attribute */ + btf_dump_printf(d, " __attribute__((mode(byte)))"); + } else if (t->size == 8 && d->ptr_sz == 8) { + /* enum can be 8-byte sized if one of the enumerator values + * doesn't fit in 32-bit integer, or by adding mode(word) + * attribute (but probably only on 64-bit architectures); do + * our best here to try to satisfy the contract without adding + * unnecessary attributes + */ + bool needs_word_mode; + + if (btf_is_enum(t)) { + /* enum can't represent 64-bit values, so we need word mode */ + needs_word_mode = true; + } else { + /* enum64 needs mode(word) if none of its values has + * non-zero upper 32-bits (which means that all values + * fit in 32-bit integers and won't cause compiler to + * bump enum to be 64-bit naturally + */ + int i; + + needs_word_mode = true; + for (i = 0; i < vlen; i++) { + if (btf_enum64(t)[i].val_hi32 != 0) { + needs_word_mode = false; + break; + } + } + } + if (needs_word_mode) + btf_dump_printf(d, " __attribute__((mode(word)))"); + } + +} + +static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id, + const struct btf_type *t) +{ + const char *name = btf_dump_type_name(d, id); + + if (btf_kflag(t)) + btf_dump_printf(d, "union %s", name); + else + btf_dump_printf(d, "struct %s", name); +} + +static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, int lvl) +{ + const char *name = btf_dump_ident_name(d, id); + + /* + * Old GCC versions are emitting invalid typedef for __gnuc_va_list + * pointing to VOID. This generates warnings from btf_dump() and + * results in uncompilable header file, so we are fixing it up here + * with valid typedef into __builtin_va_list. + */ + if (t->type == 0 && strcmp(name, "__gnuc_va_list") == 0) { + btf_dump_printf(d, "typedef __builtin_va_list __gnuc_va_list"); + return; + } + + btf_dump_printf(d, "typedef "); + btf_dump_emit_type_decl(d, t->type, name, lvl); +} + +static int btf_dump_push_decl_stack_id(struct btf_dump *d, __u32 id) +{ + __u32 *new_stack; + size_t new_cap; + + if (d->decl_stack_cnt >= d->decl_stack_cap) { + new_cap = max(16, d->decl_stack_cap * 3 / 2); + new_stack = libbpf_reallocarray(d->decl_stack, new_cap, sizeof(new_stack[0])); + if (!new_stack) + return -ENOMEM; + d->decl_stack = new_stack; + d->decl_stack_cap = new_cap; + } + + d->decl_stack[d->decl_stack_cnt++] = id; + + return 0; +} + +/* + * Emit type declaration (e.g., field type declaration in a struct or argument + * declaration in function prototype) in correct C syntax. + * + * For most types it's trivial, but there are few quirky type declaration + * cases worth mentioning: + * - function prototypes (especially nesting of function prototypes); + * - arrays; + * - const/volatile/restrict for pointers vs other types. + * + * For a good discussion of *PARSING* C syntax (as a human), see + * Peter van der Linden's "Expert C Programming: Deep C Secrets", + * Ch.3 "Unscrambling Declarations in C". + * + * It won't help with BTF to C conversion much, though, as it's an opposite + * problem. So we came up with this algorithm in reverse to van der Linden's + * parsing algorithm. It goes from structured BTF representation of type + * declaration to a valid compilable C syntax. + * + * For instance, consider this C typedef: + * typedef const int * const * arr[10] arr_t; + * It will be represented in BTF with this chain of BTF types: + * [typedef] -> [array] -> [ptr] -> [const] -> [ptr] -> [const] -> [int] + * + * Notice how [const] modifier always goes before type it modifies in BTF type + * graph, but in C syntax, const/volatile/restrict modifiers are written to + * the right of pointers, but to the left of other types. There are also other + * quirks, like function pointers, arrays of them, functions returning other + * functions, etc. + * + * We handle that by pushing all the types to a stack, until we hit "terminal" + * type (int/enum/struct/union/fwd). Then depending on the kind of a type on + * top of a stack, modifiers are handled differently. Array/function pointers + * have also wildly different syntax and how nesting of them are done. See + * code for authoritative definition. + * + * To avoid allocating new stack for each independent chain of BTF types, we + * share one bigger stack, with each chain working only on its own local view + * of a stack frame. Some care is required to "pop" stack frames after + * processing type declaration chain. + */ +int btf_dump__emit_type_decl(struct btf_dump *d, __u32 id, + const struct btf_dump_emit_type_decl_opts *opts) +{ + const char *fname; + int lvl, err; + + if (!OPTS_VALID(opts, btf_dump_emit_type_decl_opts)) + return libbpf_err(-EINVAL); + + err = btf_dump_resize(d); + if (err) + return libbpf_err(err); + + fname = OPTS_GET(opts, field_name, ""); + lvl = OPTS_GET(opts, indent_level, 0); + d->strip_mods = OPTS_GET(opts, strip_mods, false); + btf_dump_emit_type_decl(d, id, fname, lvl); + d->strip_mods = false; + return 0; +} + +static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id, + const char *fname, int lvl) +{ + struct id_stack decl_stack; + const struct btf_type *t; + int err, stack_start; + + stack_start = d->decl_stack_cnt; + for (;;) { + t = btf__type_by_id(d->btf, id); + if (d->strip_mods && btf_is_mod(t)) + goto skip_mod; + + err = btf_dump_push_decl_stack_id(d, id); + if (err < 0) { + /* + * if we don't have enough memory for entire type decl + * chain, restore stack, emit warning, and try to + * proceed nevertheless + */ + pr_warn("not enough memory for decl stack:%d", err); + d->decl_stack_cnt = stack_start; + return; + } +skip_mod: + /* VOID */ + if (id == 0) + break; + + switch (btf_kind(t)) { + case BTF_KIND_PTR: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_FUNC_PROTO: + case BTF_KIND_TYPE_TAG: + id = t->type; + break; + case BTF_KIND_ARRAY: + id = btf_array(t)->type; + break; + case BTF_KIND_INT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FWD: + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FLOAT: + goto done; + default: + pr_warn("unexpected type in decl chain, kind:%u, id:[%u]\n", + btf_kind(t), id); + goto done; + } + } +done: + /* + * We might be inside a chain of declarations (e.g., array of function + * pointers returning anonymous (so inlined) structs, having another + * array field). Each of those needs its own "stack frame" to handle + * emitting of declarations. Those stack frames are non-overlapping + * portions of shared btf_dump->decl_stack. To make it a bit nicer to + * handle this set of nested stacks, we create a view corresponding to + * our own "stack frame" and work with it as an independent stack. + * We'll need to clean up after emit_type_chain() returns, though. + */ + decl_stack.ids = d->decl_stack + stack_start; + decl_stack.cnt = d->decl_stack_cnt - stack_start; + btf_dump_emit_type_chain(d, &decl_stack, fname, lvl); + /* + * emit_type_chain() guarantees that it will pop its entire decl_stack + * frame before returning. But it works with a read-only view into + * decl_stack, so it doesn't actually pop anything from the + * perspective of shared btf_dump->decl_stack, per se. We need to + * reset decl_stack state to how it was before us to avoid it growing + * all the time. + */ + d->decl_stack_cnt = stack_start; +} + +static void btf_dump_emit_mods(struct btf_dump *d, struct id_stack *decl_stack) +{ + const struct btf_type *t; + __u32 id; + + while (decl_stack->cnt) { + id = decl_stack->ids[decl_stack->cnt - 1]; + t = btf__type_by_id(d->btf, id); + + switch (btf_kind(t)) { + case BTF_KIND_VOLATILE: + btf_dump_printf(d, "volatile "); + break; + case BTF_KIND_CONST: + btf_dump_printf(d, "const "); + break; + case BTF_KIND_RESTRICT: + btf_dump_printf(d, "restrict "); + break; + default: + return; + } + decl_stack->cnt--; + } +} + +static void btf_dump_drop_mods(struct btf_dump *d, struct id_stack *decl_stack) +{ + const struct btf_type *t; + __u32 id; + + while (decl_stack->cnt) { + id = decl_stack->ids[decl_stack->cnt - 1]; + t = btf__type_by_id(d->btf, id); + if (!btf_is_mod(t)) + return; + decl_stack->cnt--; + } +} + +static void btf_dump_emit_name(const struct btf_dump *d, + const char *name, bool last_was_ptr) +{ + bool separate = name[0] && !last_was_ptr; + + btf_dump_printf(d, "%s%s", separate ? " " : "", name); +} + +static void btf_dump_emit_type_chain(struct btf_dump *d, + struct id_stack *decls, + const char *fname, int lvl) +{ + /* + * last_was_ptr is used to determine if we need to separate pointer + * asterisk (*) from previous part of type signature with space, so + * that we get `int ***`, instead of `int * * *`. We default to true + * for cases where we have single pointer in a chain. E.g., in ptr -> + * func_proto case. func_proto will start a new emit_type_chain call + * with just ptr, which should be emitted as (*) or (*), so we + * don't want to prepend space for that last pointer. + */ + bool last_was_ptr = true; + const struct btf_type *t; + const char *name; + __u16 kind; + __u32 id; + + while (decls->cnt) { + id = decls->ids[--decls->cnt]; + if (id == 0) { + /* VOID is a special snowflake */ + btf_dump_emit_mods(d, decls); + btf_dump_printf(d, "void"); + last_was_ptr = false; + continue; + } + + t = btf__type_by_id(d->btf, id); + kind = btf_kind(t); + + switch (kind) { + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + btf_dump_emit_mods(d, decls); + name = btf_name_of(d, t->name_off); + btf_dump_printf(d, "%s", name); + break; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + btf_dump_emit_mods(d, decls); + /* inline anonymous struct/union */ + if (t->name_off == 0 && !d->skip_anon_defs) + btf_dump_emit_struct_def(d, id, t, lvl); + else + btf_dump_emit_struct_fwd(d, id, t); + break; + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + btf_dump_emit_mods(d, decls); + /* inline anonymous enum */ + if (t->name_off == 0 && !d->skip_anon_defs) + btf_dump_emit_enum_def(d, id, t, lvl); + else + btf_dump_emit_enum_fwd(d, id, t); + break; + case BTF_KIND_FWD: + btf_dump_emit_mods(d, decls); + btf_dump_emit_fwd_def(d, id, t); + break; + case BTF_KIND_TYPEDEF: + btf_dump_emit_mods(d, decls); + btf_dump_printf(d, "%s", btf_dump_ident_name(d, id)); + break; + case BTF_KIND_PTR: + btf_dump_printf(d, "%s", last_was_ptr ? "*" : " *"); + break; + case BTF_KIND_VOLATILE: + btf_dump_printf(d, " volatile"); + break; + case BTF_KIND_CONST: + btf_dump_printf(d, " const"); + break; + case BTF_KIND_RESTRICT: + btf_dump_printf(d, " restrict"); + break; + case BTF_KIND_TYPE_TAG: + btf_dump_emit_mods(d, decls); + name = btf_name_of(d, t->name_off); + btf_dump_printf(d, " __attribute__((btf_type_tag(\"%s\")))", name); + break; + case BTF_KIND_ARRAY: { + const struct btf_array *a = btf_array(t); + const struct btf_type *next_t; + __u32 next_id; + bool multidim; + /* + * GCC has a bug + * (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=8354) + * which causes it to emit extra const/volatile + * modifiers for an array, if array's element type has + * const/volatile modifiers. Clang doesn't do that. + * In general, it doesn't seem very meaningful to have + * a const/volatile modifier for array, so we are + * going to silently skip them here. + */ + btf_dump_drop_mods(d, decls); + + if (decls->cnt == 0) { + btf_dump_emit_name(d, fname, last_was_ptr); + btf_dump_printf(d, "[%u]", a->nelems); + return; + } + + next_id = decls->ids[decls->cnt - 1]; + next_t = btf__type_by_id(d->btf, next_id); + multidim = btf_is_array(next_t); + /* we need space if we have named non-pointer */ + if (fname[0] && !last_was_ptr) + btf_dump_printf(d, " "); + /* no parentheses for multi-dimensional array */ + if (!multidim) + btf_dump_printf(d, "("); + btf_dump_emit_type_chain(d, decls, fname, lvl); + if (!multidim) + btf_dump_printf(d, ")"); + btf_dump_printf(d, "[%u]", a->nelems); + return; + } + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *p = btf_params(t); + __u16 vlen = btf_vlen(t); + int i; + + /* + * GCC emits extra volatile qualifier for + * __attribute__((noreturn)) function pointers. Clang + * doesn't do it. It's a GCC quirk for backwards + * compatibility with code written for GCC <2.5. So, + * similarly to extra qualifiers for array, just drop + * them, instead of handling them. + */ + btf_dump_drop_mods(d, decls); + if (decls->cnt) { + btf_dump_printf(d, " ("); + btf_dump_emit_type_chain(d, decls, fname, lvl); + btf_dump_printf(d, ")"); + } else { + btf_dump_emit_name(d, fname, last_was_ptr); + } + btf_dump_printf(d, "("); + /* + * Clang for BPF target generates func_proto with no + * args as a func_proto with a single void arg (e.g., + * `int (*f)(void)` vs just `int (*f)()`). We are + * going to pretend there are no args for such case. + */ + if (vlen == 1 && p->type == 0) { + btf_dump_printf(d, ")"); + return; + } + + for (i = 0; i < vlen; i++, p++) { + if (i > 0) + btf_dump_printf(d, ", "); + + /* last arg of type void is vararg */ + if (i == vlen - 1 && p->type == 0) { + btf_dump_printf(d, "..."); + break; + } + + name = btf_name_of(d, p->name_off); + btf_dump_emit_type_decl(d, p->type, name, lvl); + } + + btf_dump_printf(d, ")"); + return; + } + default: + pr_warn("unexpected type in decl chain, kind:%u, id:[%u]\n", + kind, id); + return; + } + + last_was_ptr = kind == BTF_KIND_PTR; + } + + btf_dump_emit_name(d, fname, last_was_ptr); +} + +/* show type name as (type_name) */ +static void btf_dump_emit_type_cast(struct btf_dump *d, __u32 id, + bool top_level) +{ + const struct btf_type *t; + + /* for array members, we don't bother emitting type name for each + * member to avoid the redundancy of + * .name = (char[4])[(char)'f',(char)'o',(char)'o',] + */ + if (d->typed_dump->is_array_member) + return; + + /* avoid type name specification for variable/section; it will be done + * for the associated variable value(s). + */ + t = btf__type_by_id(d->btf, id); + if (btf_is_var(t) || btf_is_datasec(t)) + return; + + if (top_level) + btf_dump_printf(d, "("); + + d->skip_anon_defs = true; + d->strip_mods = true; + btf_dump_emit_type_decl(d, id, "", 0); + d->strip_mods = false; + d->skip_anon_defs = false; + + if (top_level) + btf_dump_printf(d, ")"); +} + +/* return number of duplicates (occurrences) of a given name */ +static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map, + const char *orig_name) +{ + char *old_name, *new_name; + size_t dup_cnt = 0; + int err; + + new_name = strdup(orig_name); + if (!new_name) + return 1; + + (void)hashmap__find(name_map, orig_name, &dup_cnt); + dup_cnt++; + + err = hashmap__set(name_map, new_name, dup_cnt, &old_name, NULL); + if (err) + free(new_name); + + free(old_name); + + return dup_cnt; +} + +static const char *btf_dump_resolve_name(struct btf_dump *d, __u32 id, + struct hashmap *name_map) +{ + struct btf_dump_type_aux_state *s = &d->type_states[id]; + const struct btf_type *t = btf__type_by_id(d->btf, id); + const char *orig_name = btf_name_of(d, t->name_off); + const char **cached_name = &d->cached_names[id]; + size_t dup_cnt; + + if (t->name_off == 0) + return ""; + + if (s->name_resolved) + return *cached_name ? *cached_name : orig_name; + + if (btf_is_fwd(t) || (btf_is_enum(t) && btf_vlen(t) == 0)) { + s->name_resolved = 1; + return orig_name; + } + + dup_cnt = btf_dump_name_dups(d, name_map, orig_name); + if (dup_cnt > 1) { + const size_t max_len = 256; + char new_name[max_len]; + + snprintf(new_name, max_len, "%s___%zu", orig_name, dup_cnt); + *cached_name = strdup(new_name); + } + + s->name_resolved = 1; + return *cached_name ? *cached_name : orig_name; +} + +static const char *btf_dump_type_name(struct btf_dump *d, __u32 id) +{ + return btf_dump_resolve_name(d, id, d->type_names); +} + +static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id) +{ + return btf_dump_resolve_name(d, id, d->ident_names); +} + +static int btf_dump_dump_type_data(struct btf_dump *d, + const char *fname, + const struct btf_type *t, + __u32 id, + const void *data, + __u8 bits_offset, + __u8 bit_sz); + +static const char *btf_dump_data_newline(struct btf_dump *d) +{ + return d->typed_dump->compact || d->typed_dump->depth == 0 ? "" : "\n"; +} + +static const char *btf_dump_data_delim(struct btf_dump *d) +{ + return d->typed_dump->depth == 0 ? "" : ","; +} + +static void btf_dump_data_pfx(struct btf_dump *d) +{ + int i, lvl = d->typed_dump->indent_lvl + d->typed_dump->depth; + + if (d->typed_dump->compact) + return; + + for (i = 0; i < lvl; i++) + btf_dump_printf(d, "%s", d->typed_dump->indent_str); +} + +/* A macro is used here as btf_type_value[s]() appends format specifiers + * to the format specifier passed in; these do the work of appending + * delimiters etc while the caller simply has to specify the type values + * in the format specifier + value(s). + */ +#define btf_dump_type_values(d, fmt, ...) \ + btf_dump_printf(d, fmt "%s%s", \ + ##__VA_ARGS__, \ + btf_dump_data_delim(d), \ + btf_dump_data_newline(d)) + +static int btf_dump_unsupported_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id) +{ + btf_dump_printf(d, "", btf_kind(t)); + return -ENOTSUP; +} + +static int btf_dump_get_bitfield_value(struct btf_dump *d, + const struct btf_type *t, + const void *data, + __u8 bits_offset, + __u8 bit_sz, + __u64 *value) +{ + __u16 left_shift_bits, right_shift_bits; + const __u8 *bytes = data; + __u8 nr_copy_bits; + __u64 num = 0; + int i; + + /* Maximum supported bitfield size is 64 bits */ + if (t->size > 8) { + pr_warn("unexpected bitfield size %d\n", t->size); + return -EINVAL; + } + + /* Bitfield value retrieval is done in two steps; first relevant bytes are + * stored in num, then we left/right shift num to eliminate irrelevant bits. + */ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + for (i = t->size - 1; i >= 0; i--) + num = num * 256 + bytes[i]; + nr_copy_bits = bit_sz + bits_offset; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + for (i = 0; i < t->size; i++) + num = num * 256 + bytes[i]; + nr_copy_bits = t->size * 8 - bits_offset; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif + left_shift_bits = 64 - nr_copy_bits; + right_shift_bits = 64 - bit_sz; + + *value = (num << left_shift_bits) >> right_shift_bits; + + return 0; +} + +static int btf_dump_bitfield_check_zero(struct btf_dump *d, + const struct btf_type *t, + const void *data, + __u8 bits_offset, + __u8 bit_sz) +{ + __u64 check_num; + int err; + + err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, &check_num); + if (err) + return err; + if (check_num == 0) + return -ENODATA; + return 0; +} + +static int btf_dump_bitfield_data(struct btf_dump *d, + const struct btf_type *t, + const void *data, + __u8 bits_offset, + __u8 bit_sz) +{ + __u64 print_num; + int err; + + err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, &print_num); + if (err) + return err; + + btf_dump_type_values(d, "0x%llx", (unsigned long long)print_num); + + return 0; +} + +/* ints, floats and ptrs */ +static int btf_dump_base_type_check_zero(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + static __u8 bytecmp[16] = {}; + int nr_bytes; + + /* For pointer types, pointer size is not defined on a per-type basis. + * On dump creation however, we store the pointer size. + */ + if (btf_kind(t) == BTF_KIND_PTR) + nr_bytes = d->ptr_sz; + else + nr_bytes = t->size; + + if (nr_bytes < 1 || nr_bytes > 16) { + pr_warn("unexpected size %d for id [%u]\n", nr_bytes, id); + return -EINVAL; + } + + if (memcmp(data, bytecmp, nr_bytes) == 0) + return -ENODATA; + return 0; +} + +static bool ptr_is_aligned(const struct btf *btf, __u32 type_id, + const void *data) +{ + int alignment = btf__align_of(btf, type_id); + + if (alignment == 0) + return false; + + return ((uintptr_t)data) % alignment == 0; +} + +static int btf_dump_int_data(struct btf_dump *d, + const struct btf_type *t, + __u32 type_id, + const void *data, + __u8 bits_offset) +{ + __u8 encoding = btf_int_encoding(t); + bool sign = encoding & BTF_INT_SIGNED; + char buf[16] __attribute__((aligned(16))); + int sz = t->size; + + if (sz == 0 || sz > sizeof(buf)) { + pr_warn("unexpected size %d for id [%u]\n", sz, type_id); + return -EINVAL; + } + + /* handle packed int data - accesses of integers not aligned on + * int boundaries can cause problems on some platforms. + */ + if (!ptr_is_aligned(d->btf, type_id, data)) { + memcpy(buf, data, sz); + data = buf; + } + + switch (sz) { + case 16: { + const __u64 *ints = data; + __u64 lsi, msi; + + /* avoid use of __int128 as some 32-bit platforms do not + * support it. + */ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + lsi = ints[0]; + msi = ints[1]; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + lsi = ints[1]; + msi = ints[0]; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif + if (msi == 0) + btf_dump_type_values(d, "0x%llx", (unsigned long long)lsi); + else + btf_dump_type_values(d, "0x%llx%016llx", (unsigned long long)msi, + (unsigned long long)lsi); + break; + } + case 8: + if (sign) + btf_dump_type_values(d, "%lld", *(long long *)data); + else + btf_dump_type_values(d, "%llu", *(unsigned long long *)data); + break; + case 4: + if (sign) + btf_dump_type_values(d, "%d", *(__s32 *)data); + else + btf_dump_type_values(d, "%u", *(__u32 *)data); + break; + case 2: + if (sign) + btf_dump_type_values(d, "%d", *(__s16 *)data); + else + btf_dump_type_values(d, "%u", *(__u16 *)data); + break; + case 1: + if (d->typed_dump->is_array_char) { + /* check for null terminator */ + if (d->typed_dump->is_array_terminated) + break; + if (*(char *)data == '\0') { + d->typed_dump->is_array_terminated = true; + break; + } + if (isprint(*(char *)data)) { + btf_dump_type_values(d, "'%c'", *(char *)data); + break; + } + } + if (sign) + btf_dump_type_values(d, "%d", *(__s8 *)data); + else + btf_dump_type_values(d, "%u", *(__u8 *)data); + break; + default: + pr_warn("unexpected sz %d for id [%u]\n", sz, type_id); + return -EINVAL; + } + return 0; +} + +union float_data { + long double ld; + double d; + float f; +}; + +static int btf_dump_float_data(struct btf_dump *d, + const struct btf_type *t, + __u32 type_id, + const void *data) +{ + const union float_data *flp = data; + union float_data fl; + int sz = t->size; + + /* handle unaligned data; copy to local union */ + if (!ptr_is_aligned(d->btf, type_id, data)) { + memcpy(&fl, data, sz); + flp = &fl; + } + + switch (sz) { + case 16: + btf_dump_type_values(d, "%Lf", flp->ld); + break; + case 8: + btf_dump_type_values(d, "%lf", flp->d); + break; + case 4: + btf_dump_type_values(d, "%f", flp->f); + break; + default: + pr_warn("unexpected size %d for id [%u]\n", sz, type_id); + return -EINVAL; + } + return 0; +} + +static int btf_dump_var_data(struct btf_dump *d, + const struct btf_type *v, + __u32 id, + const void *data) +{ + enum btf_func_linkage linkage = btf_var(v)->linkage; + const struct btf_type *t; + const char *l; + __u32 type_id; + + switch (linkage) { + case BTF_FUNC_STATIC: + l = "static "; + break; + case BTF_FUNC_EXTERN: + l = "extern "; + break; + case BTF_FUNC_GLOBAL: + default: + l = ""; + break; + } + + /* format of output here is [linkage] [type] [varname] = (type)value, + * for example "static int cpu_profile_flip = (int)1" + */ + btf_dump_printf(d, "%s", l); + type_id = v->type; + t = btf__type_by_id(d->btf, type_id); + btf_dump_emit_type_cast(d, type_id, false); + btf_dump_printf(d, " %s = ", btf_name_of(d, v->name_off)); + return btf_dump_dump_type_data(d, NULL, t, type_id, data, 0, 0); +} + +static int btf_dump_array_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + const struct btf_array *array = btf_array(t); + const struct btf_type *elem_type; + __u32 i, elem_type_id; + __s64 elem_size; + bool is_array_member; + + elem_type_id = array->type; + elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL); + elem_size = btf__resolve_size(d->btf, elem_type_id); + if (elem_size <= 0) { + pr_warn("unexpected elem size %zd for array type [%u]\n", + (ssize_t)elem_size, id); + return -EINVAL; + } + + if (btf_is_int(elem_type)) { + /* + * BTF_INT_CHAR encoding never seems to be set for + * char arrays, so if size is 1 and element is + * printable as a char, we'll do that. + */ + if (elem_size == 1) + d->typed_dump->is_array_char = true; + } + + /* note that we increment depth before calling btf_dump_print() below; + * this is intentional. btf_dump_data_newline() will not print a + * newline for depth 0 (since this leaves us with trailing newlines + * at the end of typed display), so depth is incremented first. + * For similar reasons, we decrement depth before showing the closing + * parenthesis. + */ + d->typed_dump->depth++; + btf_dump_printf(d, "[%s", btf_dump_data_newline(d)); + + /* may be a multidimensional array, so store current "is array member" + * status so we can restore it correctly later. + */ + is_array_member = d->typed_dump->is_array_member; + d->typed_dump->is_array_member = true; + for (i = 0; i < array->nelems; i++, data += elem_size) { + if (d->typed_dump->is_array_terminated) + break; + btf_dump_dump_type_data(d, NULL, elem_type, elem_type_id, data, 0, 0); + } + d->typed_dump->is_array_member = is_array_member; + d->typed_dump->depth--; + btf_dump_data_pfx(d); + btf_dump_type_values(d, "]"); + + return 0; +} + +static int btf_dump_struct_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + const struct btf_member *m = btf_members(t); + __u16 n = btf_vlen(t); + int i, err = 0; + + /* note that we increment depth before calling btf_dump_print() below; + * this is intentional. btf_dump_data_newline() will not print a + * newline for depth 0 (since this leaves us with trailing newlines + * at the end of typed display), so depth is incremented first. + * For similar reasons, we decrement depth before showing the closing + * parenthesis. + */ + d->typed_dump->depth++; + btf_dump_printf(d, "{%s", btf_dump_data_newline(d)); + + for (i = 0; i < n; i++, m++) { + const struct btf_type *mtype; + const char *mname; + __u32 moffset; + __u8 bit_sz; + + mtype = btf__type_by_id(d->btf, m->type); + mname = btf_name_of(d, m->name_off); + moffset = btf_member_bit_offset(t, i); + + bit_sz = btf_member_bitfield_size(t, i); + err = btf_dump_dump_type_data(d, mname, mtype, m->type, data + moffset / 8, + moffset % 8, bit_sz); + if (err < 0) + return err; + } + d->typed_dump->depth--; + btf_dump_data_pfx(d); + btf_dump_type_values(d, "}"); + return err; +} + +union ptr_data { + unsigned int p; + unsigned long long lp; +}; + +static int btf_dump_ptr_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + if (ptr_is_aligned(d->btf, id, data) && d->ptr_sz == sizeof(void *)) { + btf_dump_type_values(d, "%p", *(void **)data); + } else { + union ptr_data pt; + + memcpy(&pt, data, d->ptr_sz); + if (d->ptr_sz == 4) + btf_dump_type_values(d, "0x%x", pt.p); + else + btf_dump_type_values(d, "0x%llx", pt.lp); + } + return 0; +} + +static int btf_dump_get_enum_value(struct btf_dump *d, + const struct btf_type *t, + const void *data, + __u32 id, + __s64 *value) +{ + bool is_signed = btf_kflag(t); + + if (!ptr_is_aligned(d->btf, id, data)) { + __u64 val; + int err; + + err = btf_dump_get_bitfield_value(d, t, data, 0, 0, &val); + if (err) + return err; + *value = (__s64)val; + return 0; + } + + switch (t->size) { + case 8: + *value = *(__s64 *)data; + return 0; + case 4: + *value = is_signed ? (__s64)*(__s32 *)data : *(__u32 *)data; + return 0; + case 2: + *value = is_signed ? *(__s16 *)data : *(__u16 *)data; + return 0; + case 1: + *value = is_signed ? *(__s8 *)data : *(__u8 *)data; + return 0; + default: + pr_warn("unexpected size %d for enum, id:[%u]\n", t->size, id); + return -EINVAL; + } +} + +static int btf_dump_enum_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + bool is_signed; + __s64 value; + int i, err; + + err = btf_dump_get_enum_value(d, t, data, id, &value); + if (err) + return err; + + is_signed = btf_kflag(t); + if (btf_is_enum(t)) { + const struct btf_enum *e; + + for (i = 0, e = btf_enum(t); i < btf_vlen(t); i++, e++) { + if (value != e->val) + continue; + btf_dump_type_values(d, "%s", btf_name_of(d, e->name_off)); + return 0; + } + + btf_dump_type_values(d, is_signed ? "%d" : "%u", value); + } else { + const struct btf_enum64 *e; + + for (i = 0, e = btf_enum64(t); i < btf_vlen(t); i++, e++) { + if (value != btf_enum64_value(e)) + continue; + btf_dump_type_values(d, "%s", btf_name_of(d, e->name_off)); + return 0; + } + + btf_dump_type_values(d, is_signed ? "%lldLL" : "%lluULL", + (unsigned long long)value); + } + return 0; +} + +static int btf_dump_datasec_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + const struct btf_var_secinfo *vsi; + const struct btf_type *var; + __u32 i; + int err; + + btf_dump_type_values(d, "SEC(\"%s\") ", btf_name_of(d, t->name_off)); + + for (i = 0, vsi = btf_var_secinfos(t); i < btf_vlen(t); i++, vsi++) { + var = btf__type_by_id(d->btf, vsi->type); + err = btf_dump_dump_type_data(d, NULL, var, vsi->type, data + vsi->offset, 0, 0); + if (err < 0) + return err; + btf_dump_printf(d, ";"); + } + return 0; +} + +/* return size of type, or if base type overflows, return -E2BIG. */ +static int btf_dump_type_data_check_overflow(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data, + __u8 bits_offset) +{ + __s64 size = btf__resolve_size(d->btf, id); + + if (size < 0 || size >= INT_MAX) { + pr_warn("unexpected size [%zu] for id [%u]\n", + (size_t)size, id); + return -EINVAL; + } + + /* Only do overflow checking for base types; we do not want to + * avoid showing part of a struct, union or array, even if we + * do not have enough data to show the full object. By + * restricting overflow checking to base types we can ensure + * that partial display succeeds, while avoiding overflowing + * and using bogus data for display. + */ + t = skip_mods_and_typedefs(d->btf, id, NULL); + if (!t) { + pr_warn("unexpected error skipping mods/typedefs for id [%u]\n", + id); + return -EINVAL; + } + + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + case BTF_KIND_PTR: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + if (data + bits_offset / 8 + size > d->typed_dump->data_end) + return -E2BIG; + break; + default: + break; + } + return (int)size; +} + +static int btf_dump_type_data_check_zero(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data, + __u8 bits_offset, + __u8 bit_sz) +{ + __s64 value; + int i, err; + + /* toplevel exceptions; we show zero values if + * - we ask for them (emit_zeros) + * - if we are at top-level so we see "struct empty { }" + * - or if we are an array member and the array is non-empty and + * not a char array; we don't want to be in a situation where we + * have an integer array 0, 1, 0, 1 and only show non-zero values. + * If the array contains zeroes only, or is a char array starting + * with a '\0', the array-level check_zero() will prevent showing it; + * we are concerned with determining zero value at the array member + * level here. + */ + if (d->typed_dump->emit_zeroes || d->typed_dump->depth == 0 || + (d->typed_dump->is_array_member && + !d->typed_dump->is_array_char)) + return 0; + + t = skip_mods_and_typedefs(d->btf, id, NULL); + + switch (btf_kind(t)) { + case BTF_KIND_INT: + if (bit_sz) + return btf_dump_bitfield_check_zero(d, t, data, bits_offset, bit_sz); + return btf_dump_base_type_check_zero(d, t, id, data); + case BTF_KIND_FLOAT: + case BTF_KIND_PTR: + return btf_dump_base_type_check_zero(d, t, id, data); + case BTF_KIND_ARRAY: { + const struct btf_array *array = btf_array(t); + const struct btf_type *elem_type; + __u32 elem_type_id, elem_size; + bool ischar; + + elem_type_id = array->type; + elem_size = btf__resolve_size(d->btf, elem_type_id); + elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL); + + ischar = btf_is_int(elem_type) && elem_size == 1; + + /* check all elements; if _any_ element is nonzero, all + * of array is displayed. We make an exception however + * for char arrays where the first element is 0; these + * are considered zeroed also, even if later elements are + * non-zero because the string is terminated. + */ + for (i = 0; i < array->nelems; i++) { + if (i == 0 && ischar && *(char *)data == 0) + return -ENODATA; + err = btf_dump_type_data_check_zero(d, elem_type, + elem_type_id, + data + + (i * elem_size), + bits_offset, 0); + if (err != -ENODATA) + return err; + } + return -ENODATA; + } + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m = btf_members(t); + __u16 n = btf_vlen(t); + + /* if any struct/union member is non-zero, the struct/union + * is considered non-zero and dumped. + */ + for (i = 0; i < n; i++, m++) { + const struct btf_type *mtype; + __u32 moffset; + + mtype = btf__type_by_id(d->btf, m->type); + moffset = btf_member_bit_offset(t, i); + + /* btf_int_bits() does not store member bitfield size; + * bitfield size needs to be stored here so int display + * of member can retrieve it. + */ + bit_sz = btf_member_bitfield_size(t, i); + err = btf_dump_type_data_check_zero(d, mtype, m->type, data + moffset / 8, + moffset % 8, bit_sz); + if (err != ENODATA) + return err; + } + return -ENODATA; + } + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + err = btf_dump_get_enum_value(d, t, data, id, &value); + if (err) + return err; + if (value == 0) + return -ENODATA; + return 0; + default: + return 0; + } +} + +/* returns size of data dumped, or error. */ +static int btf_dump_dump_type_data(struct btf_dump *d, + const char *fname, + const struct btf_type *t, + __u32 id, + const void *data, + __u8 bits_offset, + __u8 bit_sz) +{ + int size, err = 0; + + size = btf_dump_type_data_check_overflow(d, t, id, data, bits_offset); + if (size < 0) + return size; + err = btf_dump_type_data_check_zero(d, t, id, data, bits_offset, bit_sz); + if (err) { + /* zeroed data is expected and not an error, so simply skip + * dumping such data. Record other errors however. + */ + if (err == -ENODATA) + return size; + return err; + } + btf_dump_data_pfx(d); + + if (!d->typed_dump->skip_names) { + if (fname && strlen(fname) > 0) + btf_dump_printf(d, ".%s = ", fname); + btf_dump_emit_type_cast(d, id, true); + } + + t = skip_mods_and_typedefs(d->btf, id, NULL); + + switch (btf_kind(t)) { + case BTF_KIND_UNKN: + case BTF_KIND_FWD: + case BTF_KIND_FUNC: + case BTF_KIND_FUNC_PROTO: + case BTF_KIND_DECL_TAG: + err = btf_dump_unsupported_data(d, t, id); + break; + case BTF_KIND_INT: + if (bit_sz) + err = btf_dump_bitfield_data(d, t, data, bits_offset, bit_sz); + else + err = btf_dump_int_data(d, t, id, data, bits_offset); + break; + case BTF_KIND_FLOAT: + err = btf_dump_float_data(d, t, id, data); + break; + case BTF_KIND_PTR: + err = btf_dump_ptr_data(d, t, id, data); + break; + case BTF_KIND_ARRAY: + err = btf_dump_array_data(d, t, id, data); + break; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + err = btf_dump_struct_data(d, t, id, data); + break; + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + /* handle bitfield and int enum values */ + if (bit_sz) { + __u64 print_num; + __s64 enum_val; + + err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, + &print_num); + if (err) + break; + enum_val = (__s64)print_num; + err = btf_dump_enum_data(d, t, id, &enum_val); + } else + err = btf_dump_enum_data(d, t, id, data); + break; + case BTF_KIND_VAR: + err = btf_dump_var_data(d, t, id, data); + break; + case BTF_KIND_DATASEC: + err = btf_dump_datasec_data(d, t, id, data); + break; + default: + pr_warn("unexpected kind [%u] for id [%u]\n", + BTF_INFO_KIND(t->info), id); + return -EINVAL; + } + if (err < 0) + return err; + return size; +} + +int btf_dump__dump_type_data(struct btf_dump *d, __u32 id, + const void *data, size_t data_sz, + const struct btf_dump_type_data_opts *opts) +{ + struct btf_dump_data typed_dump = {}; + const struct btf_type *t; + int ret; + + if (!OPTS_VALID(opts, btf_dump_type_data_opts)) + return libbpf_err(-EINVAL); + + t = btf__type_by_id(d->btf, id); + if (!t) + return libbpf_err(-ENOENT); + + d->typed_dump = &typed_dump; + d->typed_dump->data_end = data + data_sz; + d->typed_dump->indent_lvl = OPTS_GET(opts, indent_level, 0); + + /* default indent string is a tab */ + if (!OPTS_GET(opts, indent_str, NULL)) + d->typed_dump->indent_str[0] = '\t'; + else + libbpf_strlcpy(d->typed_dump->indent_str, opts->indent_str, + sizeof(d->typed_dump->indent_str)); + + d->typed_dump->compact = OPTS_GET(opts, compact, false); + d->typed_dump->skip_names = OPTS_GET(opts, skip_names, false); + d->typed_dump->emit_zeroes = OPTS_GET(opts, emit_zeroes, false); + + ret = btf_dump_dump_type_data(d, NULL, t, id, data, 0, 0); + + d->typed_dump = NULL; + + return libbpf_err(ret); +} diff --git a/bpftool/libbpf/src/gen_loader.c b/bpftool/libbpf/src/gen_loader.c new file mode 100644 index 0000000..23f5c46 --- /dev/null +++ b/bpftool/libbpf/src/gen_loader.c @@ -0,0 +1,1121 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2021 Facebook */ +#include +#include +#include +#include +#include +#include +#include "btf.h" +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" +#include "hashmap.h" +#include "bpf_gen_internal.h" +#include "skel_internal.h" +#include + +#define MAX_USED_MAPS 64 +#define MAX_USED_PROGS 32 +#define MAX_KFUNC_DESCS 256 +#define MAX_FD_ARRAY_SZ (MAX_USED_MAPS + MAX_KFUNC_DESCS) + +/* The following structure describes the stack layout of the loader program. + * In addition R6 contains the pointer to context. + * R7 contains the result of the last sys_bpf command (typically error or FD). + * R9 contains the result of the last sys_close command. + * + * Naming convention: + * ctx - bpf program context + * stack - bpf program stack + * blob - bpf_attr-s, strings, insns, map data. + * All the bytes that loader prog will use for read/write. + */ +struct loader_stack { + __u32 btf_fd; + __u32 inner_map_fd; + __u32 prog_fd[MAX_USED_PROGS]; +}; + +#define stack_off(field) \ + (__s16)(-sizeof(struct loader_stack) + offsetof(struct loader_stack, field)) + +#define attr_field(attr, field) (attr + offsetof(union bpf_attr, field)) + +static int blob_fd_array_off(struct bpf_gen *gen, int index) +{ + return gen->fd_array + index * sizeof(int); +} + +static int realloc_insn_buf(struct bpf_gen *gen, __u32 size) +{ + size_t off = gen->insn_cur - gen->insn_start; + void *insn_start; + + if (gen->error) + return gen->error; + if (size > INT32_MAX || off + size > INT32_MAX) { + gen->error = -ERANGE; + return -ERANGE; + } + insn_start = realloc(gen->insn_start, off + size); + if (!insn_start) { + gen->error = -ENOMEM; + free(gen->insn_start); + gen->insn_start = NULL; + return -ENOMEM; + } + gen->insn_start = insn_start; + gen->insn_cur = insn_start + off; + return 0; +} + +static int realloc_data_buf(struct bpf_gen *gen, __u32 size) +{ + size_t off = gen->data_cur - gen->data_start; + void *data_start; + + if (gen->error) + return gen->error; + if (size > INT32_MAX || off + size > INT32_MAX) { + gen->error = -ERANGE; + return -ERANGE; + } + data_start = realloc(gen->data_start, off + size); + if (!data_start) { + gen->error = -ENOMEM; + free(gen->data_start); + gen->data_start = NULL; + return -ENOMEM; + } + gen->data_start = data_start; + gen->data_cur = data_start + off; + return 0; +} + +static void emit(struct bpf_gen *gen, struct bpf_insn insn) +{ + if (realloc_insn_buf(gen, sizeof(insn))) + return; + memcpy(gen->insn_cur, &insn, sizeof(insn)); + gen->insn_cur += sizeof(insn); +} + +static void emit2(struct bpf_gen *gen, struct bpf_insn insn1, struct bpf_insn insn2) +{ + emit(gen, insn1); + emit(gen, insn2); +} + +static int add_data(struct bpf_gen *gen, const void *data, __u32 size); +static void emit_sys_close_blob(struct bpf_gen *gen, int blob_off); + +void bpf_gen__init(struct bpf_gen *gen, int log_level, int nr_progs, int nr_maps) +{ + size_t stack_sz = sizeof(struct loader_stack), nr_progs_sz; + int i; + + gen->fd_array = add_data(gen, NULL, MAX_FD_ARRAY_SZ * sizeof(int)); + gen->log_level = log_level; + /* save ctx pointer into R6 */ + emit(gen, BPF_MOV64_REG(BPF_REG_6, BPF_REG_1)); + + /* bzero stack */ + emit(gen, BPF_MOV64_REG(BPF_REG_1, BPF_REG_10)); + emit(gen, BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -stack_sz)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, stack_sz)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, 0)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel)); + + /* amount of stack actually used, only used to calculate iterations, not stack offset */ + nr_progs_sz = offsetof(struct loader_stack, prog_fd[nr_progs]); + /* jump over cleanup code */ + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, + /* size of cleanup code below (including map fd cleanup) */ + (nr_progs_sz / 4) * 3 + 2 + + /* 6 insns for emit_sys_close_blob, + * 6 insns for debug_regs in emit_sys_close_blob + */ + nr_maps * (6 + (gen->log_level ? 6 : 0)))); + + /* remember the label where all error branches will jump to */ + gen->cleanup_label = gen->insn_cur - gen->insn_start; + /* emit cleanup code: close all temp FDs */ + for (i = 0; i < nr_progs_sz; i += 4) { + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_10, -stack_sz + i)); + emit(gen, BPF_JMP_IMM(BPF_JSLE, BPF_REG_1, 0, 1)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_sys_close)); + } + for (i = 0; i < nr_maps; i++) + emit_sys_close_blob(gen, blob_fd_array_off(gen, i)); + /* R7 contains the error code from sys_bpf. Copy it into R0 and exit. */ + emit(gen, BPF_MOV64_REG(BPF_REG_0, BPF_REG_7)); + emit(gen, BPF_EXIT_INSN()); +} + +static int add_data(struct bpf_gen *gen, const void *data, __u32 size) +{ + __u32 size8 = roundup(size, 8); + __u64 zero = 0; + void *prev; + + if (realloc_data_buf(gen, size8)) + return 0; + prev = gen->data_cur; + if (data) { + memcpy(gen->data_cur, data, size); + memcpy(gen->data_cur + size, &zero, size8 - size); + } else { + memset(gen->data_cur, 0, size8); + } + gen->data_cur += size8; + return prev - gen->data_start; +} + +/* Get index for map_fd/btf_fd slot in reserved fd_array, or in data relative + * to start of fd_array. Caller can decide if it is usable or not. + */ +static int add_map_fd(struct bpf_gen *gen) +{ + if (gen->nr_maps == MAX_USED_MAPS) { + pr_warn("Total maps exceeds %d\n", MAX_USED_MAPS); + gen->error = -E2BIG; + return 0; + } + return gen->nr_maps++; +} + +static int add_kfunc_btf_fd(struct bpf_gen *gen) +{ + int cur; + + if (gen->nr_fd_array == MAX_KFUNC_DESCS) { + cur = add_data(gen, NULL, sizeof(int)); + return (cur - gen->fd_array) / sizeof(int); + } + return MAX_USED_MAPS + gen->nr_fd_array++; +} + +static int insn_bytes_to_bpf_size(__u32 sz) +{ + switch (sz) { + case 8: return BPF_DW; + case 4: return BPF_W; + case 2: return BPF_H; + case 1: return BPF_B; + default: return -1; + } +} + +/* *(u64 *)(blob + off) = (u64)(void *)(blob + data) */ +static void emit_rel_store(struct bpf_gen *gen, int off, int data) +{ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, data)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, off)); + emit(gen, BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0)); +} + +static void move_blob2blob(struct bpf_gen *gen, int off, int size, int blob_off) +{ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_2, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_off)); + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_2, 0)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, off)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_1, BPF_REG_0, 0)); +} + +static void move_blob2ctx(struct bpf_gen *gen, int ctx_off, int size, int blob_off) +{ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_off)); + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_1, 0)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_6, BPF_REG_0, ctx_off)); +} + +static void move_ctx2blob(struct bpf_gen *gen, int off, int size, int ctx_off, + bool check_non_zero) +{ + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_6, ctx_off)); + if (check_non_zero) + /* If value in ctx is zero don't update the blob. + * For example: when ctx->map.max_entries == 0, keep default max_entries from bpf.c + */ + emit(gen, BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, off)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_1, BPF_REG_0, 0)); +} + +static void move_stack2blob(struct bpf_gen *gen, int off, int size, int stack_off) +{ + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_10, stack_off)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, off)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_1, BPF_REG_0, 0)); +} + +static void move_stack2ctx(struct bpf_gen *gen, int ctx_off, int size, int stack_off) +{ + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_10, stack_off)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_6, BPF_REG_0, ctx_off)); +} + +static void emit_sys_bpf(struct bpf_gen *gen, int cmd, int attr, int attr_size) +{ + emit(gen, BPF_MOV64_IMM(BPF_REG_1, cmd)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_2, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, attr)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, attr_size)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_sys_bpf)); + /* remember the result in R7 */ + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_0)); +} + +static bool is_simm16(__s64 value) +{ + return value == (__s64)(__s16)value; +} + +static void emit_check_err(struct bpf_gen *gen) +{ + __s64 off = -(gen->insn_cur - gen->insn_start - gen->cleanup_label) / 8 - 1; + + /* R7 contains result of last sys_bpf command. + * if (R7 < 0) goto cleanup; + */ + if (is_simm16(off)) { + emit(gen, BPF_JMP_IMM(BPF_JSLT, BPF_REG_7, 0, off)); + } else { + gen->error = -ERANGE; + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, -1)); + } +} + +/* reg1 and reg2 should not be R1 - R5. They can be R0, R6 - R10 */ +static void emit_debug(struct bpf_gen *gen, int reg1, int reg2, + const char *fmt, va_list args) +{ + char buf[1024]; + int addr, len, ret; + + if (!gen->log_level) + return; + ret = vsnprintf(buf, sizeof(buf), fmt, args); + if (ret < 1024 - 7 && reg1 >= 0 && reg2 < 0) + /* The special case to accommodate common debug_ret(): + * to avoid specifying BPF_REG_7 and adding " r=%%d" to + * prints explicitly. + */ + strcat(buf, " r=%d"); + len = strlen(buf) + 1; + addr = add_data(gen, buf, len); + + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, addr)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, len)); + if (reg1 >= 0) + emit(gen, BPF_MOV64_REG(BPF_REG_3, reg1)); + if (reg2 >= 0) + emit(gen, BPF_MOV64_REG(BPF_REG_4, reg2)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_trace_printk)); +} + +static void debug_regs(struct bpf_gen *gen, int reg1, int reg2, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + emit_debug(gen, reg1, reg2, fmt, args); + va_end(args); +} + +static void debug_ret(struct bpf_gen *gen, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + emit_debug(gen, BPF_REG_7, -1, fmt, args); + va_end(args); +} + +static void __emit_sys_close(struct bpf_gen *gen) +{ + emit(gen, BPF_JMP_IMM(BPF_JSLE, BPF_REG_1, 0, + /* 2 is the number of the following insns + * * 6 is additional insns in debug_regs + */ + 2 + (gen->log_level ? 6 : 0))); + emit(gen, BPF_MOV64_REG(BPF_REG_9, BPF_REG_1)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_sys_close)); + debug_regs(gen, BPF_REG_9, BPF_REG_0, "close(%%d) = %%d"); +} + +static void emit_sys_close_stack(struct bpf_gen *gen, int stack_off) +{ + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_10, stack_off)); + __emit_sys_close(gen); +} + +static void emit_sys_close_blob(struct bpf_gen *gen, int blob_off) +{ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_off)); + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0)); + __emit_sys_close(gen); +} + +int bpf_gen__finish(struct bpf_gen *gen, int nr_progs, int nr_maps) +{ + int i; + + if (nr_progs < gen->nr_progs || nr_maps != gen->nr_maps) { + pr_warn("nr_progs %d/%d nr_maps %d/%d mismatch\n", + nr_progs, gen->nr_progs, nr_maps, gen->nr_maps); + gen->error = -EFAULT; + return gen->error; + } + emit_sys_close_stack(gen, stack_off(btf_fd)); + for (i = 0; i < gen->nr_progs; i++) + move_stack2ctx(gen, + sizeof(struct bpf_loader_ctx) + + sizeof(struct bpf_map_desc) * gen->nr_maps + + sizeof(struct bpf_prog_desc) * i + + offsetof(struct bpf_prog_desc, prog_fd), 4, + stack_off(prog_fd[i])); + for (i = 0; i < gen->nr_maps; i++) + move_blob2ctx(gen, + sizeof(struct bpf_loader_ctx) + + sizeof(struct bpf_map_desc) * i + + offsetof(struct bpf_map_desc, map_fd), 4, + blob_fd_array_off(gen, i)); + emit(gen, BPF_MOV64_IMM(BPF_REG_0, 0)); + emit(gen, BPF_EXIT_INSN()); + pr_debug("gen: finish %d\n", gen->error); + if (!gen->error) { + struct gen_loader_opts *opts = gen->opts; + + opts->insns = gen->insn_start; + opts->insns_sz = gen->insn_cur - gen->insn_start; + opts->data = gen->data_start; + opts->data_sz = gen->data_cur - gen->data_start; + } + return gen->error; +} + +void bpf_gen__free(struct bpf_gen *gen) +{ + if (!gen) + return; + free(gen->data_start); + free(gen->insn_start); + free(gen); +} + +void bpf_gen__load_btf(struct bpf_gen *gen, const void *btf_raw_data, + __u32 btf_raw_size) +{ + int attr_size = offsetofend(union bpf_attr, btf_log_level); + int btf_data, btf_load_attr; + union bpf_attr attr; + + memset(&attr, 0, attr_size); + pr_debug("gen: load_btf: size %d\n", btf_raw_size); + btf_data = add_data(gen, btf_raw_data, btf_raw_size); + + attr.btf_size = btf_raw_size; + btf_load_attr = add_data(gen, &attr, attr_size); + + /* populate union bpf_attr with user provided log details */ + move_ctx2blob(gen, attr_field(btf_load_attr, btf_log_level), 4, + offsetof(struct bpf_loader_ctx, log_level), false); + move_ctx2blob(gen, attr_field(btf_load_attr, btf_log_size), 4, + offsetof(struct bpf_loader_ctx, log_size), false); + move_ctx2blob(gen, attr_field(btf_load_attr, btf_log_buf), 8, + offsetof(struct bpf_loader_ctx, log_buf), false); + /* populate union bpf_attr with a pointer to the BTF data */ + emit_rel_store(gen, attr_field(btf_load_attr, btf), btf_data); + /* emit BTF_LOAD command */ + emit_sys_bpf(gen, BPF_BTF_LOAD, btf_load_attr, attr_size); + debug_ret(gen, "btf_load size %d", btf_raw_size); + emit_check_err(gen); + /* remember btf_fd in the stack, if successful */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_7, stack_off(btf_fd))); +} + +void bpf_gen__map_create(struct bpf_gen *gen, + enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, __u32 value_size, __u32 max_entries, + struct bpf_map_create_opts *map_attr, int map_idx) +{ + int attr_size = offsetofend(union bpf_attr, map_extra); + bool close_inner_map_fd = false; + int map_create_attr, idx; + union bpf_attr attr; + + memset(&attr, 0, attr_size); + attr.map_type = map_type; + attr.key_size = key_size; + attr.value_size = value_size; + attr.map_flags = map_attr->map_flags; + attr.map_extra = map_attr->map_extra; + if (map_name) + libbpf_strlcpy(attr.map_name, map_name, sizeof(attr.map_name)); + attr.numa_node = map_attr->numa_node; + attr.map_ifindex = map_attr->map_ifindex; + attr.max_entries = max_entries; + attr.btf_key_type_id = map_attr->btf_key_type_id; + attr.btf_value_type_id = map_attr->btf_value_type_id; + + pr_debug("gen: map_create: %s idx %d type %d value_type_id %d\n", + attr.map_name, map_idx, map_type, attr.btf_value_type_id); + + map_create_attr = add_data(gen, &attr, attr_size); + if (attr.btf_value_type_id) + /* populate union bpf_attr with btf_fd saved in the stack earlier */ + move_stack2blob(gen, attr_field(map_create_attr, btf_fd), 4, + stack_off(btf_fd)); + switch (attr.map_type) { + case BPF_MAP_TYPE_ARRAY_OF_MAPS: + case BPF_MAP_TYPE_HASH_OF_MAPS: + move_stack2blob(gen, attr_field(map_create_attr, inner_map_fd), 4, + stack_off(inner_map_fd)); + close_inner_map_fd = true; + break; + default: + break; + } + /* conditionally update max_entries */ + if (map_idx >= 0) + move_ctx2blob(gen, attr_field(map_create_attr, max_entries), 4, + sizeof(struct bpf_loader_ctx) + + sizeof(struct bpf_map_desc) * map_idx + + offsetof(struct bpf_map_desc, max_entries), + true /* check that max_entries != 0 */); + /* emit MAP_CREATE command */ + emit_sys_bpf(gen, BPF_MAP_CREATE, map_create_attr, attr_size); + debug_ret(gen, "map_create %s idx %d type %d value_size %d value_btf_id %d", + attr.map_name, map_idx, map_type, value_size, + attr.btf_value_type_id); + emit_check_err(gen); + /* remember map_fd in the stack, if successful */ + if (map_idx < 0) { + /* This bpf_gen__map_create() function is called with map_idx >= 0 + * for all maps that libbpf loading logic tracks. + * It's called with -1 to create an inner map. + */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_7, + stack_off(inner_map_fd))); + } else if (map_idx != gen->nr_maps) { + gen->error = -EDOM; /* internal bug */ + return; + } else { + /* add_map_fd does gen->nr_maps++ */ + idx = add_map_fd(gen); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_fd_array_off(gen, idx))); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_7, 0)); + } + if (close_inner_map_fd) + emit_sys_close_stack(gen, stack_off(inner_map_fd)); +} + +void bpf_gen__record_attach_target(struct bpf_gen *gen, const char *attach_name, + enum bpf_attach_type type) +{ + const char *prefix; + int kind, ret; + + btf_get_kernel_prefix_kind(type, &prefix, &kind); + gen->attach_kind = kind; + ret = snprintf(gen->attach_target, sizeof(gen->attach_target), "%s%s", + prefix, attach_name); + if (ret >= sizeof(gen->attach_target)) + gen->error = -ENOSPC; +} + +static void emit_find_attach_target(struct bpf_gen *gen) +{ + int name, len = strlen(gen->attach_target) + 1; + + pr_debug("gen: find_attach_tgt %s %d\n", gen->attach_target, gen->attach_kind); + name = add_data(gen, gen->attach_target, len); + + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, name)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, len)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, gen->attach_kind)); + emit(gen, BPF_MOV64_IMM(BPF_REG_4, 0)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_btf_find_by_name_kind)); + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_0)); + debug_ret(gen, "find_by_name_kind(%s,%d)", + gen->attach_target, gen->attach_kind); + emit_check_err(gen); + /* if successful, btf_id is in lower 32-bit of R7 and + * btf_obj_fd is in upper 32-bit + */ +} + +void bpf_gen__record_extern(struct bpf_gen *gen, const char *name, bool is_weak, + bool is_typeless, int kind, int insn_idx) +{ + struct ksym_relo_desc *relo; + + relo = libbpf_reallocarray(gen->relos, gen->relo_cnt + 1, sizeof(*relo)); + if (!relo) { + gen->error = -ENOMEM; + return; + } + gen->relos = relo; + relo += gen->relo_cnt; + relo->name = name; + relo->is_weak = is_weak; + relo->is_typeless = is_typeless; + relo->kind = kind; + relo->insn_idx = insn_idx; + gen->relo_cnt++; +} + +/* returns existing ksym_desc with ref incremented, or inserts a new one */ +static struct ksym_desc *get_ksym_desc(struct bpf_gen *gen, struct ksym_relo_desc *relo) +{ + struct ksym_desc *kdesc; + int i; + + for (i = 0; i < gen->nr_ksyms; i++) { + if (!strcmp(gen->ksyms[i].name, relo->name)) { + gen->ksyms[i].ref++; + return &gen->ksyms[i]; + } + } + kdesc = libbpf_reallocarray(gen->ksyms, gen->nr_ksyms + 1, sizeof(*kdesc)); + if (!kdesc) { + gen->error = -ENOMEM; + return NULL; + } + gen->ksyms = kdesc; + kdesc = &gen->ksyms[gen->nr_ksyms++]; + kdesc->name = relo->name; + kdesc->kind = relo->kind; + kdesc->ref = 1; + kdesc->off = 0; + kdesc->insn = 0; + return kdesc; +} + +/* Overwrites BPF_REG_{0, 1, 2, 3, 4, 7} + * Returns result in BPF_REG_7 + */ +static void emit_bpf_find_by_name_kind(struct bpf_gen *gen, struct ksym_relo_desc *relo) +{ + int name_off, len = strlen(relo->name) + 1; + + name_off = add_data(gen, relo->name, len); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, name_off)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, len)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, relo->kind)); + emit(gen, BPF_MOV64_IMM(BPF_REG_4, 0)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_btf_find_by_name_kind)); + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_0)); + debug_ret(gen, "find_by_name_kind(%s,%d)", relo->name, relo->kind); +} + +/* Overwrites BPF_REG_{0, 1, 2, 3, 4, 7} + * Returns result in BPF_REG_7 + * Returns u64 symbol addr in BPF_REG_9 + */ +static void emit_bpf_kallsyms_lookup_name(struct bpf_gen *gen, struct ksym_relo_desc *relo) +{ + int name_off, len = strlen(relo->name) + 1, res_off; + + name_off = add_data(gen, relo->name, len); + res_off = add_data(gen, NULL, 8); /* res is u64 */ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, name_off)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, len)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, 0)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_4, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, res_off)); + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_4)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_kallsyms_lookup_name)); + emit(gen, BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0)); + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_0)); + debug_ret(gen, "kallsyms_lookup_name(%s,%d)", relo->name, relo->kind); +} + +/* Expects: + * BPF_REG_8 - pointer to instruction + * + * We need to reuse BTF fd for same symbol otherwise each relocation takes a new + * index, while kernel limits total kfunc BTFs to 256. For duplicate symbols, + * this would mean a new BTF fd index for each entry. By pairing symbol name + * with index, we get the insn->imm, insn->off pairing that kernel uses for + * kfunc_tab, which becomes the effective limit even though all of them may + * share same index in fd_array (such that kfunc_btf_tab has 1 element). + */ +static void emit_relo_kfunc_btf(struct bpf_gen *gen, struct ksym_relo_desc *relo, int insn) +{ + struct ksym_desc *kdesc; + int btf_fd_idx; + + kdesc = get_ksym_desc(gen, relo); + if (!kdesc) + return; + /* try to copy from existing bpf_insn */ + if (kdesc->ref > 1) { + move_blob2blob(gen, insn + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + offsetof(struct bpf_insn, imm)); + move_blob2blob(gen, insn + offsetof(struct bpf_insn, off), 2, + kdesc->insn + offsetof(struct bpf_insn, off)); + goto log; + } + /* remember insn offset, so we can copy BTF ID and FD later */ + kdesc->insn = insn; + emit_bpf_find_by_name_kind(gen, relo); + if (!relo->is_weak) + emit_check_err(gen); + /* get index in fd_array to store BTF FD at */ + btf_fd_idx = add_kfunc_btf_fd(gen); + if (btf_fd_idx > INT16_MAX) { + pr_warn("BTF fd off %d for kfunc %s exceeds INT16_MAX, cannot process relocation\n", + btf_fd_idx, relo->name); + gen->error = -E2BIG; + return; + } + kdesc->off = btf_fd_idx; + /* jump to success case */ + emit(gen, BPF_JMP_IMM(BPF_JSGE, BPF_REG_7, 0, 3)); + /* set value for imm, off as 0 */ + emit(gen, BPF_ST_MEM(BPF_W, BPF_REG_8, offsetof(struct bpf_insn, imm), 0)); + emit(gen, BPF_ST_MEM(BPF_H, BPF_REG_8, offsetof(struct bpf_insn, off), 0)); + /* skip success case for ret < 0 */ + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, 10)); + /* store btf_id into insn[insn_idx].imm */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_7, offsetof(struct bpf_insn, imm))); + /* obtain fd in BPF_REG_9 */ + emit(gen, BPF_MOV64_REG(BPF_REG_9, BPF_REG_7)); + emit(gen, BPF_ALU64_IMM(BPF_RSH, BPF_REG_9, 32)); + /* jump to fd_array store if fd denotes module BTF */ + emit(gen, BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 0, 2)); + /* set the default value for off */ + emit(gen, BPF_ST_MEM(BPF_H, BPF_REG_8, offsetof(struct bpf_insn, off), 0)); + /* skip BTF fd store for vmlinux BTF */ + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, 4)); + /* load fd_array slot pointer */ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_fd_array_off(gen, btf_fd_idx))); + /* store BTF fd in slot */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_9, 0)); + /* store index into insn[insn_idx].off */ + emit(gen, BPF_ST_MEM(BPF_H, BPF_REG_8, offsetof(struct bpf_insn, off), btf_fd_idx)); +log: + if (!gen->log_level) + return; + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_8, + offsetof(struct bpf_insn, imm))); + emit(gen, BPF_LDX_MEM(BPF_H, BPF_REG_9, BPF_REG_8, + offsetof(struct bpf_insn, off))); + debug_regs(gen, BPF_REG_7, BPF_REG_9, " func (%s:count=%d): imm: %%d, off: %%d", + relo->name, kdesc->ref); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_fd_array_off(gen, kdesc->off))); + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_0, 0)); + debug_regs(gen, BPF_REG_9, -1, " func (%s:count=%d): btf_fd", + relo->name, kdesc->ref); +} + +static void emit_ksym_relo_log(struct bpf_gen *gen, struct ksym_relo_desc *relo, + int ref) +{ + if (!gen->log_level) + return; + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_8, + offsetof(struct bpf_insn, imm))); + emit(gen, BPF_LDX_MEM(BPF_H, BPF_REG_9, BPF_REG_8, sizeof(struct bpf_insn) + + offsetof(struct bpf_insn, imm))); + debug_regs(gen, BPF_REG_7, BPF_REG_9, " var t=%d w=%d (%s:count=%d): imm[0]: %%d, imm[1]: %%d", + relo->is_typeless, relo->is_weak, relo->name, ref); + emit(gen, BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_8, offsetofend(struct bpf_insn, code))); + debug_regs(gen, BPF_REG_9, -1, " var t=%d w=%d (%s:count=%d): insn.reg", + relo->is_typeless, relo->is_weak, relo->name, ref); +} + +/* Expects: + * BPF_REG_8 - pointer to instruction + */ +static void emit_relo_ksym_typeless(struct bpf_gen *gen, + struct ksym_relo_desc *relo, int insn) +{ + struct ksym_desc *kdesc; + + kdesc = get_ksym_desc(gen, relo); + if (!kdesc) + return; + /* try to copy from existing ldimm64 insn */ + if (kdesc->ref > 1) { + move_blob2blob(gen, insn + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + offsetof(struct bpf_insn, imm)); + move_blob2blob(gen, insn + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm)); + goto log; + } + /* remember insn offset, so we can copy ksym addr later */ + kdesc->insn = insn; + /* skip typeless ksym_desc in fd closing loop in cleanup_relos */ + kdesc->typeless = true; + emit_bpf_kallsyms_lookup_name(gen, relo); + emit(gen, BPF_JMP_IMM(BPF_JEQ, BPF_REG_7, -ENOENT, 1)); + emit_check_err(gen); + /* store lower half of addr into insn[insn_idx].imm */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_9, offsetof(struct bpf_insn, imm))); + /* store upper half of addr into insn[insn_idx + 1].imm */ + emit(gen, BPF_ALU64_IMM(BPF_RSH, BPF_REG_9, 32)); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_9, + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm))); +log: + emit_ksym_relo_log(gen, relo, kdesc->ref); +} + +static __u32 src_reg_mask(void) +{ +#if defined(__LITTLE_ENDIAN_BITFIELD) + return 0x0f; /* src_reg,dst_reg,... */ +#elif defined(__BIG_ENDIAN_BITFIELD) + return 0xf0; /* dst_reg,src_reg,... */ +#else +#error "Unsupported bit endianness, cannot proceed" +#endif +} + +/* Expects: + * BPF_REG_8 - pointer to instruction + */ +static void emit_relo_ksym_btf(struct bpf_gen *gen, struct ksym_relo_desc *relo, int insn) +{ + struct ksym_desc *kdesc; + __u32 reg_mask; + + kdesc = get_ksym_desc(gen, relo); + if (!kdesc) + return; + /* try to copy from existing ldimm64 insn */ + if (kdesc->ref > 1) { + move_blob2blob(gen, insn + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + offsetof(struct bpf_insn, imm)); + move_blob2blob(gen, insn + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm)); + /* jump over src_reg adjustment if imm is not 0, reuse BPF_REG_0 from move_blob2blob */ + emit(gen, BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 3)); + goto clear_src_reg; + } + /* remember insn offset, so we can copy BTF ID and FD later */ + kdesc->insn = insn; + emit_bpf_find_by_name_kind(gen, relo); + if (!relo->is_weak) + emit_check_err(gen); + /* jump to success case */ + emit(gen, BPF_JMP_IMM(BPF_JSGE, BPF_REG_7, 0, 3)); + /* set values for insn[insn_idx].imm, insn[insn_idx + 1].imm as 0 */ + emit(gen, BPF_ST_MEM(BPF_W, BPF_REG_8, offsetof(struct bpf_insn, imm), 0)); + emit(gen, BPF_ST_MEM(BPF_W, BPF_REG_8, sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm), 0)); + /* skip success case for ret < 0 */ + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, 4)); + /* store btf_id into insn[insn_idx].imm */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_7, offsetof(struct bpf_insn, imm))); + /* store btf_obj_fd into insn[insn_idx + 1].imm */ + emit(gen, BPF_ALU64_IMM(BPF_RSH, BPF_REG_7, 32)); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_7, + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm))); + /* skip src_reg adjustment */ + emit(gen, BPF_JMP_IMM(BPF_JSGE, BPF_REG_7, 0, 3)); +clear_src_reg: + /* clear bpf_object__relocate_data's src_reg assignment, otherwise we get a verifier failure */ + reg_mask = src_reg_mask(); + emit(gen, BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_8, offsetofend(struct bpf_insn, code))); + emit(gen, BPF_ALU32_IMM(BPF_AND, BPF_REG_9, reg_mask)); + emit(gen, BPF_STX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, offsetofend(struct bpf_insn, code))); + + emit_ksym_relo_log(gen, relo, kdesc->ref); +} + +void bpf_gen__record_relo_core(struct bpf_gen *gen, + const struct bpf_core_relo *core_relo) +{ + struct bpf_core_relo *relos; + + relos = libbpf_reallocarray(gen->core_relos, gen->core_relo_cnt + 1, sizeof(*relos)); + if (!relos) { + gen->error = -ENOMEM; + return; + } + gen->core_relos = relos; + relos += gen->core_relo_cnt; + memcpy(relos, core_relo, sizeof(*relos)); + gen->core_relo_cnt++; +} + +static void emit_relo(struct bpf_gen *gen, struct ksym_relo_desc *relo, int insns) +{ + int insn; + + pr_debug("gen: emit_relo (%d): %s at %d\n", relo->kind, relo->name, relo->insn_idx); + insn = insns + sizeof(struct bpf_insn) * relo->insn_idx; + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_8, BPF_PSEUDO_MAP_IDX_VALUE, 0, 0, 0, insn)); + switch (relo->kind) { + case BTF_KIND_VAR: + if (relo->is_typeless) + emit_relo_ksym_typeless(gen, relo, insn); + else + emit_relo_ksym_btf(gen, relo, insn); + break; + case BTF_KIND_FUNC: + emit_relo_kfunc_btf(gen, relo, insn); + break; + default: + pr_warn("Unknown relocation kind '%d'\n", relo->kind); + gen->error = -EDOM; + return; + } +} + +static void emit_relos(struct bpf_gen *gen, int insns) +{ + int i; + + for (i = 0; i < gen->relo_cnt; i++) + emit_relo(gen, gen->relos + i, insns); +} + +static void cleanup_core_relo(struct bpf_gen *gen) +{ + if (!gen->core_relo_cnt) + return; + free(gen->core_relos); + gen->core_relo_cnt = 0; + gen->core_relos = NULL; +} + +static void cleanup_relos(struct bpf_gen *gen, int insns) +{ + int i, insn; + + for (i = 0; i < gen->nr_ksyms; i++) { + /* only close fds for typed ksyms and kfuncs */ + if (gen->ksyms[i].kind == BTF_KIND_VAR && !gen->ksyms[i].typeless) { + /* close fd recorded in insn[insn_idx + 1].imm */ + insn = gen->ksyms[i].insn; + insn += sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm); + emit_sys_close_blob(gen, insn); + } else if (gen->ksyms[i].kind == BTF_KIND_FUNC) { + emit_sys_close_blob(gen, blob_fd_array_off(gen, gen->ksyms[i].off)); + if (gen->ksyms[i].off < MAX_FD_ARRAY_SZ) + gen->nr_fd_array--; + } + } + if (gen->nr_ksyms) { + free(gen->ksyms); + gen->nr_ksyms = 0; + gen->ksyms = NULL; + } + if (gen->relo_cnt) { + free(gen->relos); + gen->relo_cnt = 0; + gen->relos = NULL; + } + cleanup_core_relo(gen); +} + +void bpf_gen__prog_load(struct bpf_gen *gen, + enum bpf_prog_type prog_type, const char *prog_name, + const char *license, struct bpf_insn *insns, size_t insn_cnt, + struct bpf_prog_load_opts *load_attr, int prog_idx) +{ + int prog_load_attr, license_off, insns_off, func_info, line_info, core_relos; + int attr_size = offsetofend(union bpf_attr, core_relo_rec_size); + union bpf_attr attr; + + memset(&attr, 0, attr_size); + pr_debug("gen: prog_load: type %d insns_cnt %zd progi_idx %d\n", + prog_type, insn_cnt, prog_idx); + /* add license string to blob of bytes */ + license_off = add_data(gen, license, strlen(license) + 1); + /* add insns to blob of bytes */ + insns_off = add_data(gen, insns, insn_cnt * sizeof(struct bpf_insn)); + + attr.prog_type = prog_type; + attr.expected_attach_type = load_attr->expected_attach_type; + attr.attach_btf_id = load_attr->attach_btf_id; + attr.prog_ifindex = load_attr->prog_ifindex; + attr.kern_version = 0; + attr.insn_cnt = (__u32)insn_cnt; + attr.prog_flags = load_attr->prog_flags; + + attr.func_info_rec_size = load_attr->func_info_rec_size; + attr.func_info_cnt = load_attr->func_info_cnt; + func_info = add_data(gen, load_attr->func_info, + attr.func_info_cnt * attr.func_info_rec_size); + + attr.line_info_rec_size = load_attr->line_info_rec_size; + attr.line_info_cnt = load_attr->line_info_cnt; + line_info = add_data(gen, load_attr->line_info, + attr.line_info_cnt * attr.line_info_rec_size); + + attr.core_relo_rec_size = sizeof(struct bpf_core_relo); + attr.core_relo_cnt = gen->core_relo_cnt; + core_relos = add_data(gen, gen->core_relos, + attr.core_relo_cnt * attr.core_relo_rec_size); + + libbpf_strlcpy(attr.prog_name, prog_name, sizeof(attr.prog_name)); + prog_load_attr = add_data(gen, &attr, attr_size); + + /* populate union bpf_attr with a pointer to license */ + emit_rel_store(gen, attr_field(prog_load_attr, license), license_off); + + /* populate union bpf_attr with a pointer to instructions */ + emit_rel_store(gen, attr_field(prog_load_attr, insns), insns_off); + + /* populate union bpf_attr with a pointer to func_info */ + emit_rel_store(gen, attr_field(prog_load_attr, func_info), func_info); + + /* populate union bpf_attr with a pointer to line_info */ + emit_rel_store(gen, attr_field(prog_load_attr, line_info), line_info); + + /* populate union bpf_attr with a pointer to core_relos */ + emit_rel_store(gen, attr_field(prog_load_attr, core_relos), core_relos); + + /* populate union bpf_attr fd_array with a pointer to data where map_fds are saved */ + emit_rel_store(gen, attr_field(prog_load_attr, fd_array), gen->fd_array); + + /* populate union bpf_attr with user provided log details */ + move_ctx2blob(gen, attr_field(prog_load_attr, log_level), 4, + offsetof(struct bpf_loader_ctx, log_level), false); + move_ctx2blob(gen, attr_field(prog_load_attr, log_size), 4, + offsetof(struct bpf_loader_ctx, log_size), false); + move_ctx2blob(gen, attr_field(prog_load_attr, log_buf), 8, + offsetof(struct bpf_loader_ctx, log_buf), false); + /* populate union bpf_attr with btf_fd saved in the stack earlier */ + move_stack2blob(gen, attr_field(prog_load_attr, prog_btf_fd), 4, + stack_off(btf_fd)); + if (gen->attach_kind) { + emit_find_attach_target(gen); + /* populate union bpf_attr with btf_id and btf_obj_fd found by helper */ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, prog_load_attr)); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_7, + offsetof(union bpf_attr, attach_btf_id))); + emit(gen, BPF_ALU64_IMM(BPF_RSH, BPF_REG_7, 32)); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_7, + offsetof(union bpf_attr, attach_btf_obj_fd))); + } + emit_relos(gen, insns_off); + /* emit PROG_LOAD command */ + emit_sys_bpf(gen, BPF_PROG_LOAD, prog_load_attr, attr_size); + debug_ret(gen, "prog_load %s insn_cnt %d", attr.prog_name, attr.insn_cnt); + /* successful or not, close btf module FDs used in extern ksyms and attach_btf_obj_fd */ + cleanup_relos(gen, insns_off); + if (gen->attach_kind) { + emit_sys_close_blob(gen, + attr_field(prog_load_attr, attach_btf_obj_fd)); + gen->attach_kind = 0; + } + emit_check_err(gen); + /* remember prog_fd in the stack, if successful */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_7, + stack_off(prog_fd[gen->nr_progs]))); + gen->nr_progs++; +} + +void bpf_gen__map_update_elem(struct bpf_gen *gen, int map_idx, void *pvalue, + __u32 value_size) +{ + int attr_size = offsetofend(union bpf_attr, flags); + int map_update_attr, value, key; + union bpf_attr attr; + int zero = 0; + + memset(&attr, 0, attr_size); + pr_debug("gen: map_update_elem: idx %d\n", map_idx); + + value = add_data(gen, pvalue, value_size); + key = add_data(gen, &zero, sizeof(zero)); + + /* if (map_desc[map_idx].initial_value) { + * if (ctx->flags & BPF_SKEL_KERNEL) + * bpf_probe_read_kernel(value, value_size, initial_value); + * else + * bpf_copy_from_user(value, value_size, initial_value); + * } + */ + emit(gen, BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, + sizeof(struct bpf_loader_ctx) + + sizeof(struct bpf_map_desc) * map_idx + + offsetof(struct bpf_map_desc, initial_value))); + emit(gen, BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0, 8)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, value)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, value_size)); + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, + offsetof(struct bpf_loader_ctx, flags))); + emit(gen, BPF_JMP_IMM(BPF_JSET, BPF_REG_0, BPF_SKEL_KERNEL, 2)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_copy_from_user)); + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, 1)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel)); + + map_update_attr = add_data(gen, &attr, attr_size); + move_blob2blob(gen, attr_field(map_update_attr, map_fd), 4, + blob_fd_array_off(gen, map_idx)); + emit_rel_store(gen, attr_field(map_update_attr, key), key); + emit_rel_store(gen, attr_field(map_update_attr, value), value); + /* emit MAP_UPDATE_ELEM command */ + emit_sys_bpf(gen, BPF_MAP_UPDATE_ELEM, map_update_attr, attr_size); + debug_ret(gen, "update_elem idx %d value_size %d", map_idx, value_size); + emit_check_err(gen); +} + +void bpf_gen__populate_outer_map(struct bpf_gen *gen, int outer_map_idx, int slot, + int inner_map_idx) +{ + int attr_size = offsetofend(union bpf_attr, flags); + int map_update_attr, key; + union bpf_attr attr; + + memset(&attr, 0, attr_size); + pr_debug("gen: populate_outer_map: outer %d key %d inner %d\n", + outer_map_idx, slot, inner_map_idx); + + key = add_data(gen, &slot, sizeof(slot)); + + map_update_attr = add_data(gen, &attr, attr_size); + move_blob2blob(gen, attr_field(map_update_attr, map_fd), 4, + blob_fd_array_off(gen, outer_map_idx)); + emit_rel_store(gen, attr_field(map_update_attr, key), key); + emit_rel_store(gen, attr_field(map_update_attr, value), + blob_fd_array_off(gen, inner_map_idx)); + + /* emit MAP_UPDATE_ELEM command */ + emit_sys_bpf(gen, BPF_MAP_UPDATE_ELEM, map_update_attr, attr_size); + debug_ret(gen, "populate_outer_map outer %d key %d inner %d", + outer_map_idx, slot, inner_map_idx); + emit_check_err(gen); +} + +void bpf_gen__map_freeze(struct bpf_gen *gen, int map_idx) +{ + int attr_size = offsetofend(union bpf_attr, map_fd); + int map_freeze_attr; + union bpf_attr attr; + + memset(&attr, 0, attr_size); + pr_debug("gen: map_freeze: idx %d\n", map_idx); + map_freeze_attr = add_data(gen, &attr, attr_size); + move_blob2blob(gen, attr_field(map_freeze_attr, map_fd), 4, + blob_fd_array_off(gen, map_idx)); + /* emit MAP_FREEZE command */ + emit_sys_bpf(gen, BPF_MAP_FREEZE, map_freeze_attr, attr_size); + debug_ret(gen, "map_freeze"); + emit_check_err(gen); +} diff --git a/bpftool/libbpf/src/hashmap.c b/bpftool/libbpf/src/hashmap.c new file mode 100644 index 0000000..140ee40 --- /dev/null +++ b/bpftool/libbpf/src/hashmap.c @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * Generic non-thread safe hash map implementation. + * + * Copyright (c) 2019 Facebook + */ +#include +#include +#include +#include +#include +#include "hashmap.h" + +/* make sure libbpf doesn't use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +/* prevent accidental re-addition of reallocarray() */ +#pragma GCC poison reallocarray + +/* start with 4 buckets */ +#define HASHMAP_MIN_CAP_BITS 2 + +static void hashmap_add_entry(struct hashmap_entry **pprev, + struct hashmap_entry *entry) +{ + entry->next = *pprev; + *pprev = entry; +} + +static void hashmap_del_entry(struct hashmap_entry **pprev, + struct hashmap_entry *entry) +{ + *pprev = entry->next; + entry->next = NULL; +} + +void hashmap__init(struct hashmap *map, hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, void *ctx) +{ + map->hash_fn = hash_fn; + map->equal_fn = equal_fn; + map->ctx = ctx; + + map->buckets = NULL; + map->cap = 0; + map->cap_bits = 0; + map->sz = 0; +} + +struct hashmap *hashmap__new(hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, + void *ctx) +{ + struct hashmap *map = malloc(sizeof(struct hashmap)); + + if (!map) + return ERR_PTR(-ENOMEM); + hashmap__init(map, hash_fn, equal_fn, ctx); + return map; +} + +void hashmap__clear(struct hashmap *map) +{ + struct hashmap_entry *cur, *tmp; + size_t bkt; + + hashmap__for_each_entry_safe(map, cur, tmp, bkt) { + free(cur); + } + free(map->buckets); + map->buckets = NULL; + map->cap = map->cap_bits = map->sz = 0; +} + +void hashmap__free(struct hashmap *map) +{ + if (IS_ERR_OR_NULL(map)) + return; + + hashmap__clear(map); + free(map); +} + +size_t hashmap__size(const struct hashmap *map) +{ + return map->sz; +} + +size_t hashmap__capacity(const struct hashmap *map) +{ + return map->cap; +} + +static bool hashmap_needs_to_grow(struct hashmap *map) +{ + /* grow if empty or more than 75% filled */ + return (map->cap == 0) || ((map->sz + 1) * 4 / 3 > map->cap); +} + +static int hashmap_grow(struct hashmap *map) +{ + struct hashmap_entry **new_buckets; + struct hashmap_entry *cur, *tmp; + size_t new_cap_bits, new_cap; + size_t h, bkt; + + new_cap_bits = map->cap_bits + 1; + if (new_cap_bits < HASHMAP_MIN_CAP_BITS) + new_cap_bits = HASHMAP_MIN_CAP_BITS; + + new_cap = 1UL << new_cap_bits; + new_buckets = calloc(new_cap, sizeof(new_buckets[0])); + if (!new_buckets) + return -ENOMEM; + + hashmap__for_each_entry_safe(map, cur, tmp, bkt) { + h = hash_bits(map->hash_fn(cur->key, map->ctx), new_cap_bits); + hashmap_add_entry(&new_buckets[h], cur); + } + + map->cap = new_cap; + map->cap_bits = new_cap_bits; + free(map->buckets); + map->buckets = new_buckets; + + return 0; +} + +static bool hashmap_find_entry(const struct hashmap *map, + const long key, size_t hash, + struct hashmap_entry ***pprev, + struct hashmap_entry **entry) +{ + struct hashmap_entry *cur, **prev_ptr; + + if (!map->buckets) + return false; + + for (prev_ptr = &map->buckets[hash], cur = *prev_ptr; + cur; + prev_ptr = &cur->next, cur = cur->next) { + if (map->equal_fn(cur->key, key, map->ctx)) { + if (pprev) + *pprev = prev_ptr; + *entry = cur; + return true; + } + } + + return false; +} + +int hashmap_insert(struct hashmap *map, long key, long value, + enum hashmap_insert_strategy strategy, + long *old_key, long *old_value) +{ + struct hashmap_entry *entry; + size_t h; + int err; + + if (old_key) + *old_key = 0; + if (old_value) + *old_value = 0; + + h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits); + if (strategy != HASHMAP_APPEND && + hashmap_find_entry(map, key, h, NULL, &entry)) { + if (old_key) + *old_key = entry->key; + if (old_value) + *old_value = entry->value; + + if (strategy == HASHMAP_SET || strategy == HASHMAP_UPDATE) { + entry->key = key; + entry->value = value; + return 0; + } else if (strategy == HASHMAP_ADD) { + return -EEXIST; + } + } + + if (strategy == HASHMAP_UPDATE) + return -ENOENT; + + if (hashmap_needs_to_grow(map)) { + err = hashmap_grow(map); + if (err) + return err; + h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits); + } + + entry = malloc(sizeof(struct hashmap_entry)); + if (!entry) + return -ENOMEM; + + entry->key = key; + entry->value = value; + hashmap_add_entry(&map->buckets[h], entry); + map->sz++; + + return 0; +} + +bool hashmap_find(const struct hashmap *map, long key, long *value) +{ + struct hashmap_entry *entry; + size_t h; + + h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits); + if (!hashmap_find_entry(map, key, h, NULL, &entry)) + return false; + + if (value) + *value = entry->value; + return true; +} + +bool hashmap_delete(struct hashmap *map, long key, + long *old_key, long *old_value) +{ + struct hashmap_entry **pprev, *entry; + size_t h; + + h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits); + if (!hashmap_find_entry(map, key, h, &pprev, &entry)) + return false; + + if (old_key) + *old_key = entry->key; + if (old_value) + *old_value = entry->value; + + hashmap_del_entry(pprev, entry); + free(entry); + map->sz--; + + return true; +} diff --git a/bpftool/libbpf/src/hashmap.h b/bpftool/libbpf/src/hashmap.h new file mode 100644 index 0000000..0a5bf19 --- /dev/null +++ b/bpftool/libbpf/src/hashmap.h @@ -0,0 +1,218 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Generic non-thread safe hash map implementation. + * + * Copyright (c) 2019 Facebook + */ +#ifndef __LIBBPF_HASHMAP_H +#define __LIBBPF_HASHMAP_H + +#include +#include +#include + +static inline size_t hash_bits(size_t h, int bits) +{ + /* shuffle bits and return requested number of upper bits */ + if (bits == 0) + return 0; + +#if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__) + /* LP64 case */ + return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits); +#elif (__SIZEOF_SIZE_T__ <= __SIZEOF_LONG__) + return (h * 2654435769lu) >> (__SIZEOF_LONG__ * 8 - bits); +#else +# error "Unsupported size_t size" +#endif +} + +/* generic C-string hashing function */ +static inline size_t str_hash(const char *s) +{ + size_t h = 0; + + while (*s) { + h = h * 31 + *s; + s++; + } + return h; +} + +typedef size_t (*hashmap_hash_fn)(long key, void *ctx); +typedef bool (*hashmap_equal_fn)(long key1, long key2, void *ctx); + +/* + * Hashmap interface is polymorphic, keys and values could be either + * long-sized integers or pointers, this is achieved as follows: + * - interface functions that operate on keys and values are hidden + * behind auxiliary macros, e.g. hashmap_insert <-> hashmap__insert; + * - these auxiliary macros cast the key and value parameters as + * long or long *, so the user does not have to specify the casts explicitly; + * - for pointer parameters (e.g. old_key) the size of the pointed + * type is verified by hashmap_cast_ptr using _Static_assert; + * - when iterating using hashmap__for_each_* forms + * hasmap_entry->key should be used for integer keys and + * hasmap_entry->pkey should be used for pointer keys, + * same goes for values. + */ +struct hashmap_entry { + union { + long key; + const void *pkey; + }; + union { + long value; + void *pvalue; + }; + struct hashmap_entry *next; +}; + +struct hashmap { + hashmap_hash_fn hash_fn; + hashmap_equal_fn equal_fn; + void *ctx; + + struct hashmap_entry **buckets; + size_t cap; + size_t cap_bits; + size_t sz; +}; + +#define HASHMAP_INIT(hash_fn, equal_fn, ctx) { \ + .hash_fn = (hash_fn), \ + .equal_fn = (equal_fn), \ + .ctx = (ctx), \ + .buckets = NULL, \ + .cap = 0, \ + .cap_bits = 0, \ + .sz = 0, \ +} + +void hashmap__init(struct hashmap *map, hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, void *ctx); +struct hashmap *hashmap__new(hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, + void *ctx); +void hashmap__clear(struct hashmap *map); +void hashmap__free(struct hashmap *map); + +size_t hashmap__size(const struct hashmap *map); +size_t hashmap__capacity(const struct hashmap *map); + +/* + * Hashmap insertion strategy: + * - HASHMAP_ADD - only add key/value if key doesn't exist yet; + * - HASHMAP_SET - add key/value pair if key doesn't exist yet; otherwise, + * update value; + * - HASHMAP_UPDATE - update value, if key already exists; otherwise, do + * nothing and return -ENOENT; + * - HASHMAP_APPEND - always add key/value pair, even if key already exists. + * This turns hashmap into a multimap by allowing multiple values to be + * associated with the same key. Most useful read API for such hashmap is + * hashmap__for_each_key_entry() iteration. If hashmap__find() is still + * used, it will return last inserted key/value entry (first in a bucket + * chain). + */ +enum hashmap_insert_strategy { + HASHMAP_ADD, + HASHMAP_SET, + HASHMAP_UPDATE, + HASHMAP_APPEND, +}; + +#define hashmap_cast_ptr(p) ({ \ + _Static_assert((__builtin_constant_p((p)) ? (p) == NULL : 0) || \ + sizeof(*(p)) == sizeof(long), \ + #p " pointee should be a long-sized integer or a pointer"); \ + (long *)(p); \ +}) + +/* + * hashmap__insert() adds key/value entry w/ various semantics, depending on + * provided strategy value. If a given key/value pair replaced already + * existing key/value pair, both old key and old value will be returned + * through old_key and old_value to allow calling code do proper memory + * management. + */ +int hashmap_insert(struct hashmap *map, long key, long value, + enum hashmap_insert_strategy strategy, + long *old_key, long *old_value); + +#define hashmap__insert(map, key, value, strategy, old_key, old_value) \ + hashmap_insert((map), (long)(key), (long)(value), (strategy), \ + hashmap_cast_ptr(old_key), \ + hashmap_cast_ptr(old_value)) + +#define hashmap__add(map, key, value) \ + hashmap__insert((map), (key), (value), HASHMAP_ADD, NULL, NULL) + +#define hashmap__set(map, key, value, old_key, old_value) \ + hashmap__insert((map), (key), (value), HASHMAP_SET, (old_key), (old_value)) + +#define hashmap__update(map, key, value, old_key, old_value) \ + hashmap__insert((map), (key), (value), HASHMAP_UPDATE, (old_key), (old_value)) + +#define hashmap__append(map, key, value) \ + hashmap__insert((map), (key), (value), HASHMAP_APPEND, NULL, NULL) + +bool hashmap_delete(struct hashmap *map, long key, long *old_key, long *old_value); + +#define hashmap__delete(map, key, old_key, old_value) \ + hashmap_delete((map), (long)(key), \ + hashmap_cast_ptr(old_key), \ + hashmap_cast_ptr(old_value)) + +bool hashmap_find(const struct hashmap *map, long key, long *value); + +#define hashmap__find(map, key, value) \ + hashmap_find((map), (long)(key), hashmap_cast_ptr(value)) + +/* + * hashmap__for_each_entry - iterate over all entries in hashmap + * @map: hashmap to iterate + * @cur: struct hashmap_entry * used as a loop cursor + * @bkt: integer used as a bucket loop cursor + */ +#define hashmap__for_each_entry(map, cur, bkt) \ + for (bkt = 0; bkt < map->cap; bkt++) \ + for (cur = map->buckets[bkt]; cur; cur = cur->next) + +/* + * hashmap__for_each_entry_safe - iterate over all entries in hashmap, safe + * against removals + * @map: hashmap to iterate + * @cur: struct hashmap_entry * used as a loop cursor + * @tmp: struct hashmap_entry * used as a temporary next cursor storage + * @bkt: integer used as a bucket loop cursor + */ +#define hashmap__for_each_entry_safe(map, cur, tmp, bkt) \ + for (bkt = 0; bkt < map->cap; bkt++) \ + for (cur = map->buckets[bkt]; \ + cur && ({tmp = cur->next; true; }); \ + cur = tmp) + +/* + * hashmap__for_each_key_entry - iterate over entries associated with given key + * @map: hashmap to iterate + * @cur: struct hashmap_entry * used as a loop cursor + * @key: key to iterate entries for + */ +#define hashmap__for_each_key_entry(map, cur, _key) \ + for (cur = map->buckets \ + ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \ + : NULL; \ + cur; \ + cur = cur->next) \ + if (map->equal_fn(cur->key, (_key), map->ctx)) + +#define hashmap__for_each_key_entry_safe(map, cur, tmp, _key) \ + for (cur = map->buckets \ + ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \ + : NULL; \ + cur && ({ tmp = cur->next; true; }); \ + cur = tmp) \ + if (map->equal_fn(cur->key, (_key), map->ctx)) + +#endif /* __LIBBPF_HASHMAP_H */ diff --git a/bpftool/libbpf/src/libbpf.c b/bpftool/libbpf/src/libbpf.c new file mode 100644 index 0000000..05c4db3 --- /dev/null +++ b/bpftool/libbpf/src/libbpf.c @@ -0,0 +1,12466 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * Common eBPF ELF object loading operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + * Copyright (C) 2017 Nicira, Inc. + * Copyright (C) 2019 Isovalent, Inc. + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libbpf.h" +#include "bpf.h" +#include "btf.h" +#include "str_error.h" +#include "libbpf_internal.h" +#include "hashmap.h" +#include "bpf_gen_internal.h" + +#ifndef BPF_FS_MAGIC +#define BPF_FS_MAGIC 0xcafe4a11 +#endif + +#define BPF_INSN_SZ (sizeof(struct bpf_insn)) + +/* vsprintf() in __base_pr() uses nonliteral format string. It may break + * compilation if user enables corresponding warning. Disable it explicitly. + */ +#pragma GCC diagnostic ignored "-Wformat-nonliteral" + +#define __printf(a, b) __attribute__((format(printf, a, b))) + +static struct bpf_map *bpf_object__add_map(struct bpf_object *obj); +static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog); + +static const char * const attach_type_name[] = { + [BPF_CGROUP_INET_INGRESS] = "cgroup_inet_ingress", + [BPF_CGROUP_INET_EGRESS] = "cgroup_inet_egress", + [BPF_CGROUP_INET_SOCK_CREATE] = "cgroup_inet_sock_create", + [BPF_CGROUP_INET_SOCK_RELEASE] = "cgroup_inet_sock_release", + [BPF_CGROUP_SOCK_OPS] = "cgroup_sock_ops", + [BPF_CGROUP_DEVICE] = "cgroup_device", + [BPF_CGROUP_INET4_BIND] = "cgroup_inet4_bind", + [BPF_CGROUP_INET6_BIND] = "cgroup_inet6_bind", + [BPF_CGROUP_INET4_CONNECT] = "cgroup_inet4_connect", + [BPF_CGROUP_INET6_CONNECT] = "cgroup_inet6_connect", + [BPF_CGROUP_INET4_POST_BIND] = "cgroup_inet4_post_bind", + [BPF_CGROUP_INET6_POST_BIND] = "cgroup_inet6_post_bind", + [BPF_CGROUP_INET4_GETPEERNAME] = "cgroup_inet4_getpeername", + [BPF_CGROUP_INET6_GETPEERNAME] = "cgroup_inet6_getpeername", + [BPF_CGROUP_INET4_GETSOCKNAME] = "cgroup_inet4_getsockname", + [BPF_CGROUP_INET6_GETSOCKNAME] = "cgroup_inet6_getsockname", + [BPF_CGROUP_UDP4_SENDMSG] = "cgroup_udp4_sendmsg", + [BPF_CGROUP_UDP6_SENDMSG] = "cgroup_udp6_sendmsg", + [BPF_CGROUP_SYSCTL] = "cgroup_sysctl", + [BPF_CGROUP_UDP4_RECVMSG] = "cgroup_udp4_recvmsg", + [BPF_CGROUP_UDP6_RECVMSG] = "cgroup_udp6_recvmsg", + [BPF_CGROUP_GETSOCKOPT] = "cgroup_getsockopt", + [BPF_CGROUP_SETSOCKOPT] = "cgroup_setsockopt", + [BPF_SK_SKB_STREAM_PARSER] = "sk_skb_stream_parser", + [BPF_SK_SKB_STREAM_VERDICT] = "sk_skb_stream_verdict", + [BPF_SK_SKB_VERDICT] = "sk_skb_verdict", + [BPF_SK_MSG_VERDICT] = "sk_msg_verdict", + [BPF_LIRC_MODE2] = "lirc_mode2", + [BPF_FLOW_DISSECTOR] = "flow_dissector", + [BPF_TRACE_RAW_TP] = "trace_raw_tp", + [BPF_TRACE_FENTRY] = "trace_fentry", + [BPF_TRACE_FEXIT] = "trace_fexit", + [BPF_MODIFY_RETURN] = "modify_return", + [BPF_LSM_MAC] = "lsm_mac", + [BPF_LSM_CGROUP] = "lsm_cgroup", + [BPF_SK_LOOKUP] = "sk_lookup", + [BPF_TRACE_ITER] = "trace_iter", + [BPF_XDP_DEVMAP] = "xdp_devmap", + [BPF_XDP_CPUMAP] = "xdp_cpumap", + [BPF_XDP] = "xdp", + [BPF_SK_REUSEPORT_SELECT] = "sk_reuseport_select", + [BPF_SK_REUSEPORT_SELECT_OR_MIGRATE] = "sk_reuseport_select_or_migrate", + [BPF_PERF_EVENT] = "perf_event", + [BPF_TRACE_KPROBE_MULTI] = "trace_kprobe_multi", +}; + +static const char * const link_type_name[] = { + [BPF_LINK_TYPE_UNSPEC] = "unspec", + [BPF_LINK_TYPE_RAW_TRACEPOINT] = "raw_tracepoint", + [BPF_LINK_TYPE_TRACING] = "tracing", + [BPF_LINK_TYPE_CGROUP] = "cgroup", + [BPF_LINK_TYPE_ITER] = "iter", + [BPF_LINK_TYPE_NETNS] = "netns", + [BPF_LINK_TYPE_XDP] = "xdp", + [BPF_LINK_TYPE_PERF_EVENT] = "perf_event", + [BPF_LINK_TYPE_KPROBE_MULTI] = "kprobe_multi", + [BPF_LINK_TYPE_STRUCT_OPS] = "struct_ops", +}; + +static const char * const map_type_name[] = { + [BPF_MAP_TYPE_UNSPEC] = "unspec", + [BPF_MAP_TYPE_HASH] = "hash", + [BPF_MAP_TYPE_ARRAY] = "array", + [BPF_MAP_TYPE_PROG_ARRAY] = "prog_array", + [BPF_MAP_TYPE_PERF_EVENT_ARRAY] = "perf_event_array", + [BPF_MAP_TYPE_PERCPU_HASH] = "percpu_hash", + [BPF_MAP_TYPE_PERCPU_ARRAY] = "percpu_array", + [BPF_MAP_TYPE_STACK_TRACE] = "stack_trace", + [BPF_MAP_TYPE_CGROUP_ARRAY] = "cgroup_array", + [BPF_MAP_TYPE_LRU_HASH] = "lru_hash", + [BPF_MAP_TYPE_LRU_PERCPU_HASH] = "lru_percpu_hash", + [BPF_MAP_TYPE_LPM_TRIE] = "lpm_trie", + [BPF_MAP_TYPE_ARRAY_OF_MAPS] = "array_of_maps", + [BPF_MAP_TYPE_HASH_OF_MAPS] = "hash_of_maps", + [BPF_MAP_TYPE_DEVMAP] = "devmap", + [BPF_MAP_TYPE_DEVMAP_HASH] = "devmap_hash", + [BPF_MAP_TYPE_SOCKMAP] = "sockmap", + [BPF_MAP_TYPE_CPUMAP] = "cpumap", + [BPF_MAP_TYPE_XSKMAP] = "xskmap", + [BPF_MAP_TYPE_SOCKHASH] = "sockhash", + [BPF_MAP_TYPE_CGROUP_STORAGE] = "cgroup_storage", + [BPF_MAP_TYPE_REUSEPORT_SOCKARRAY] = "reuseport_sockarray", + [BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE] = "percpu_cgroup_storage", + [BPF_MAP_TYPE_QUEUE] = "queue", + [BPF_MAP_TYPE_STACK] = "stack", + [BPF_MAP_TYPE_SK_STORAGE] = "sk_storage", + [BPF_MAP_TYPE_STRUCT_OPS] = "struct_ops", + [BPF_MAP_TYPE_RINGBUF] = "ringbuf", + [BPF_MAP_TYPE_INODE_STORAGE] = "inode_storage", + [BPF_MAP_TYPE_TASK_STORAGE] = "task_storage", + [BPF_MAP_TYPE_BLOOM_FILTER] = "bloom_filter", + [BPF_MAP_TYPE_USER_RINGBUF] = "user_ringbuf", + [BPF_MAP_TYPE_CGRP_STORAGE] = "cgrp_storage", +}; + +static const char * const prog_type_name[] = { + [BPF_PROG_TYPE_UNSPEC] = "unspec", + [BPF_PROG_TYPE_SOCKET_FILTER] = "socket_filter", + [BPF_PROG_TYPE_KPROBE] = "kprobe", + [BPF_PROG_TYPE_SCHED_CLS] = "sched_cls", + [BPF_PROG_TYPE_SCHED_ACT] = "sched_act", + [BPF_PROG_TYPE_TRACEPOINT] = "tracepoint", + [BPF_PROG_TYPE_XDP] = "xdp", + [BPF_PROG_TYPE_PERF_EVENT] = "perf_event", + [BPF_PROG_TYPE_CGROUP_SKB] = "cgroup_skb", + [BPF_PROG_TYPE_CGROUP_SOCK] = "cgroup_sock", + [BPF_PROG_TYPE_LWT_IN] = "lwt_in", + [BPF_PROG_TYPE_LWT_OUT] = "lwt_out", + [BPF_PROG_TYPE_LWT_XMIT] = "lwt_xmit", + [BPF_PROG_TYPE_SOCK_OPS] = "sock_ops", + [BPF_PROG_TYPE_SK_SKB] = "sk_skb", + [BPF_PROG_TYPE_CGROUP_DEVICE] = "cgroup_device", + [BPF_PROG_TYPE_SK_MSG] = "sk_msg", + [BPF_PROG_TYPE_RAW_TRACEPOINT] = "raw_tracepoint", + [BPF_PROG_TYPE_CGROUP_SOCK_ADDR] = "cgroup_sock_addr", + [BPF_PROG_TYPE_LWT_SEG6LOCAL] = "lwt_seg6local", + [BPF_PROG_TYPE_LIRC_MODE2] = "lirc_mode2", + [BPF_PROG_TYPE_SK_REUSEPORT] = "sk_reuseport", + [BPF_PROG_TYPE_FLOW_DISSECTOR] = "flow_dissector", + [BPF_PROG_TYPE_CGROUP_SYSCTL] = "cgroup_sysctl", + [BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE] = "raw_tracepoint_writable", + [BPF_PROG_TYPE_CGROUP_SOCKOPT] = "cgroup_sockopt", + [BPF_PROG_TYPE_TRACING] = "tracing", + [BPF_PROG_TYPE_STRUCT_OPS] = "struct_ops", + [BPF_PROG_TYPE_EXT] = "ext", + [BPF_PROG_TYPE_LSM] = "lsm", + [BPF_PROG_TYPE_SK_LOOKUP] = "sk_lookup", + [BPF_PROG_TYPE_SYSCALL] = "syscall", +}; + +static int __base_pr(enum libbpf_print_level level, const char *format, + va_list args) +{ + if (level == LIBBPF_DEBUG) + return 0; + + return vfprintf(stderr, format, args); +} + +static libbpf_print_fn_t __libbpf_pr = __base_pr; + +libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn) +{ + libbpf_print_fn_t old_print_fn = __libbpf_pr; + + __libbpf_pr = fn; + return old_print_fn; +} + +__printf(2, 3) +void libbpf_print(enum libbpf_print_level level, const char *format, ...) +{ + va_list args; + int old_errno; + + if (!__libbpf_pr) + return; + + old_errno = errno; + + va_start(args, format); + __libbpf_pr(level, format, args); + va_end(args); + + errno = old_errno; +} + +static void pr_perm_msg(int err) +{ + struct rlimit limit; + char buf[100]; + + if (err != -EPERM || geteuid() != 0) + return; + + err = getrlimit(RLIMIT_MEMLOCK, &limit); + if (err) + return; + + if (limit.rlim_cur == RLIM_INFINITY) + return; + + if (limit.rlim_cur < 1024) + snprintf(buf, sizeof(buf), "%zu bytes", (size_t)limit.rlim_cur); + else if (limit.rlim_cur < 1024*1024) + snprintf(buf, sizeof(buf), "%.1f KiB", (double)limit.rlim_cur / 1024); + else + snprintf(buf, sizeof(buf), "%.1f MiB", (double)limit.rlim_cur / (1024*1024)); + + pr_warn("permission error while running as root; try raising 'ulimit -l'? current value: %s\n", + buf); +} + +#define STRERR_BUFSIZE 128 + +/* Copied from tools/perf/util/util.h */ +#ifndef zfree +# define zfree(ptr) ({ free(*ptr); *ptr = NULL; }) +#endif + +#ifndef zclose +# define zclose(fd) ({ \ + int ___err = 0; \ + if ((fd) >= 0) \ + ___err = close((fd)); \ + fd = -1; \ + ___err; }) +#endif + +static inline __u64 ptr_to_u64(const void *ptr) +{ + return (__u64) (unsigned long) ptr; +} + +int libbpf_set_strict_mode(enum libbpf_strict_mode mode) +{ + /* as of v1.0 libbpf_set_strict_mode() is a no-op */ + return 0; +} + +__u32 libbpf_major_version(void) +{ + return LIBBPF_MAJOR_VERSION; +} + +__u32 libbpf_minor_version(void) +{ + return LIBBPF_MINOR_VERSION; +} + +const char *libbpf_version_string(void) +{ +#define __S(X) #X +#define _S(X) __S(X) + return "v" _S(LIBBPF_MAJOR_VERSION) "." _S(LIBBPF_MINOR_VERSION); +#undef _S +#undef __S +} + +enum reloc_type { + RELO_LD64, + RELO_CALL, + RELO_DATA, + RELO_EXTERN_VAR, + RELO_EXTERN_FUNC, + RELO_SUBPROG_ADDR, + RELO_CORE, +}; + +struct reloc_desc { + enum reloc_type type; + int insn_idx; + union { + const struct bpf_core_relo *core_relo; /* used when type == RELO_CORE */ + struct { + int map_idx; + int sym_off; + }; + }; +}; + +/* stored as sec_def->cookie for all libbpf-supported SEC()s */ +enum sec_def_flags { + SEC_NONE = 0, + /* expected_attach_type is optional, if kernel doesn't support that */ + SEC_EXP_ATTACH_OPT = 1, + /* legacy, only used by libbpf_get_type_names() and + * libbpf_attach_type_by_name(), not used by libbpf itself at all. + * This used to be associated with cgroup (and few other) BPF programs + * that were attachable through BPF_PROG_ATTACH command. Pretty + * meaningless nowadays, though. + */ + SEC_ATTACHABLE = 2, + SEC_ATTACHABLE_OPT = SEC_ATTACHABLE | SEC_EXP_ATTACH_OPT, + /* attachment target is specified through BTF ID in either kernel or + * other BPF program's BTF object + */ + SEC_ATTACH_BTF = 4, + /* BPF program type allows sleeping/blocking in kernel */ + SEC_SLEEPABLE = 8, + /* BPF program support non-linear XDP buffer */ + SEC_XDP_FRAGS = 16, +}; + +struct bpf_sec_def { + char *sec; + enum bpf_prog_type prog_type; + enum bpf_attach_type expected_attach_type; + long cookie; + int handler_id; + + libbpf_prog_setup_fn_t prog_setup_fn; + libbpf_prog_prepare_load_fn_t prog_prepare_load_fn; + libbpf_prog_attach_fn_t prog_attach_fn; +}; + +/* + * bpf_prog should be a better name but it has been used in + * linux/filter.h. + */ +struct bpf_program { + char *name; + char *sec_name; + size_t sec_idx; + const struct bpf_sec_def *sec_def; + /* this program's instruction offset (in number of instructions) + * within its containing ELF section + */ + size_t sec_insn_off; + /* number of original instructions in ELF section belonging to this + * program, not taking into account subprogram instructions possible + * appended later during relocation + */ + size_t sec_insn_cnt; + /* Offset (in number of instructions) of the start of instruction + * belonging to this BPF program within its containing main BPF + * program. For the entry-point (main) BPF program, this is always + * zero. For a sub-program, this gets reset before each of main BPF + * programs are processed and relocated and is used to determined + * whether sub-program was already appended to the main program, and + * if yes, at which instruction offset. + */ + size_t sub_insn_off; + + /* instructions that belong to BPF program; insns[0] is located at + * sec_insn_off instruction within its ELF section in ELF file, so + * when mapping ELF file instruction index to the local instruction, + * one needs to subtract sec_insn_off; and vice versa. + */ + struct bpf_insn *insns; + /* actual number of instruction in this BPF program's image; for + * entry-point BPF programs this includes the size of main program + * itself plus all the used sub-programs, appended at the end + */ + size_t insns_cnt; + + struct reloc_desc *reloc_desc; + int nr_reloc; + + /* BPF verifier log settings */ + char *log_buf; + size_t log_size; + __u32 log_level; + + struct bpf_object *obj; + + int fd; + bool autoload; + bool autoattach; + bool mark_btf_static; + enum bpf_prog_type type; + enum bpf_attach_type expected_attach_type; + + int prog_ifindex; + __u32 attach_btf_obj_fd; + __u32 attach_btf_id; + __u32 attach_prog_fd; + + void *func_info; + __u32 func_info_rec_size; + __u32 func_info_cnt; + + void *line_info; + __u32 line_info_rec_size; + __u32 line_info_cnt; + __u32 prog_flags; +}; + +struct bpf_struct_ops { + const char *tname; + const struct btf_type *type; + struct bpf_program **progs; + __u32 *kern_func_off; + /* e.g. struct tcp_congestion_ops in bpf_prog's btf format */ + void *data; + /* e.g. struct bpf_struct_ops_tcp_congestion_ops in + * btf_vmlinux's format. + * struct bpf_struct_ops_tcp_congestion_ops { + * [... some other kernel fields ...] + * struct tcp_congestion_ops data; + * } + * kern_vdata-size == sizeof(struct bpf_struct_ops_tcp_congestion_ops) + * bpf_map__init_kern_struct_ops() will populate the "kern_vdata" + * from "data". + */ + void *kern_vdata; + __u32 type_id; +}; + +#define DATA_SEC ".data" +#define BSS_SEC ".bss" +#define RODATA_SEC ".rodata" +#define KCONFIG_SEC ".kconfig" +#define KSYMS_SEC ".ksyms" +#define STRUCT_OPS_SEC ".struct_ops" + +enum libbpf_map_type { + LIBBPF_MAP_UNSPEC, + LIBBPF_MAP_DATA, + LIBBPF_MAP_BSS, + LIBBPF_MAP_RODATA, + LIBBPF_MAP_KCONFIG, +}; + +struct bpf_map_def { + unsigned int type; + unsigned int key_size; + unsigned int value_size; + unsigned int max_entries; + unsigned int map_flags; +}; + +struct bpf_map { + struct bpf_object *obj; + char *name; + /* real_name is defined for special internal maps (.rodata*, + * .data*, .bss, .kconfig) and preserves their original ELF section + * name. This is important to be able to find corresponding BTF + * DATASEC information. + */ + char *real_name; + int fd; + int sec_idx; + size_t sec_offset; + int map_ifindex; + int inner_map_fd; + struct bpf_map_def def; + __u32 numa_node; + __u32 btf_var_idx; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + enum libbpf_map_type libbpf_type; + void *mmaped; + struct bpf_struct_ops *st_ops; + struct bpf_map *inner_map; + void **init_slots; + int init_slots_sz; + char *pin_path; + bool pinned; + bool reused; + bool autocreate; + __u64 map_extra; +}; + +enum extern_type { + EXT_UNKNOWN, + EXT_KCFG, + EXT_KSYM, +}; + +enum kcfg_type { + KCFG_UNKNOWN, + KCFG_CHAR, + KCFG_BOOL, + KCFG_INT, + KCFG_TRISTATE, + KCFG_CHAR_ARR, +}; + +struct extern_desc { + enum extern_type type; + int sym_idx; + int btf_id; + int sec_btf_id; + const char *name; + bool is_set; + bool is_weak; + union { + struct { + enum kcfg_type type; + int sz; + int align; + int data_off; + bool is_signed; + } kcfg; + struct { + unsigned long long addr; + + /* target btf_id of the corresponding kernel var. */ + int kernel_btf_obj_fd; + int kernel_btf_id; + + /* local btf_id of the ksym extern's type. */ + __u32 type_id; + /* BTF fd index to be patched in for insn->off, this is + * 0 for vmlinux BTF, index in obj->fd_array for module + * BTF + */ + __s16 btf_fd_idx; + } ksym; + }; +}; + +struct module_btf { + struct btf *btf; + char *name; + __u32 id; + int fd; + int fd_array_idx; +}; + +enum sec_type { + SEC_UNUSED = 0, + SEC_RELO, + SEC_BSS, + SEC_DATA, + SEC_RODATA, +}; + +struct elf_sec_desc { + enum sec_type sec_type; + Elf64_Shdr *shdr; + Elf_Data *data; +}; + +struct elf_state { + int fd; + const void *obj_buf; + size_t obj_buf_sz; + Elf *elf; + Elf64_Ehdr *ehdr; + Elf_Data *symbols; + Elf_Data *st_ops_data; + size_t shstrndx; /* section index for section name strings */ + size_t strtabidx; + struct elf_sec_desc *secs; + size_t sec_cnt; + int btf_maps_shndx; + __u32 btf_maps_sec_btf_id; + int text_shndx; + int symbols_shndx; + int st_ops_shndx; +}; + +struct usdt_manager; + +struct bpf_object { + char name[BPF_OBJ_NAME_LEN]; + char license[64]; + __u32 kern_version; + + struct bpf_program *programs; + size_t nr_programs; + struct bpf_map *maps; + size_t nr_maps; + size_t maps_cap; + + char *kconfig; + struct extern_desc *externs; + int nr_extern; + int kconfig_map_idx; + + bool loaded; + bool has_subcalls; + bool has_rodata; + + struct bpf_gen *gen_loader; + + /* Information when doing ELF related work. Only valid if efile.elf is not NULL */ + struct elf_state efile; + + struct btf *btf; + struct btf_ext *btf_ext; + + /* Parse and load BTF vmlinux if any of the programs in the object need + * it at load time. + */ + struct btf *btf_vmlinux; + /* Path to the custom BTF to be used for BPF CO-RE relocations as an + * override for vmlinux BTF. + */ + char *btf_custom_path; + /* vmlinux BTF override for CO-RE relocations */ + struct btf *btf_vmlinux_override; + /* Lazily initialized kernel module BTFs */ + struct module_btf *btf_modules; + bool btf_modules_loaded; + size_t btf_module_cnt; + size_t btf_module_cap; + + /* optional log settings passed to BPF_BTF_LOAD and BPF_PROG_LOAD commands */ + char *log_buf; + size_t log_size; + __u32 log_level; + + int *fd_array; + size_t fd_array_cap; + size_t fd_array_cnt; + + struct usdt_manager *usdt_man; + + char path[]; +}; + +static const char *elf_sym_str(const struct bpf_object *obj, size_t off); +static const char *elf_sec_str(const struct bpf_object *obj, size_t off); +static Elf_Scn *elf_sec_by_idx(const struct bpf_object *obj, size_t idx); +static Elf_Scn *elf_sec_by_name(const struct bpf_object *obj, const char *name); +static Elf64_Shdr *elf_sec_hdr(const struct bpf_object *obj, Elf_Scn *scn); +static const char *elf_sec_name(const struct bpf_object *obj, Elf_Scn *scn); +static Elf_Data *elf_sec_data(const struct bpf_object *obj, Elf_Scn *scn); +static Elf64_Sym *elf_sym_by_idx(const struct bpf_object *obj, size_t idx); +static Elf64_Rel *elf_rel_by_idx(Elf_Data *data, size_t idx); + +void bpf_program__unload(struct bpf_program *prog) +{ + if (!prog) + return; + + zclose(prog->fd); + + zfree(&prog->func_info); + zfree(&prog->line_info); +} + +static void bpf_program__exit(struct bpf_program *prog) +{ + if (!prog) + return; + + bpf_program__unload(prog); + zfree(&prog->name); + zfree(&prog->sec_name); + zfree(&prog->insns); + zfree(&prog->reloc_desc); + + prog->nr_reloc = 0; + prog->insns_cnt = 0; + prog->sec_idx = -1; +} + +static bool insn_is_subprog_call(const struct bpf_insn *insn) +{ + return BPF_CLASS(insn->code) == BPF_JMP && + BPF_OP(insn->code) == BPF_CALL && + BPF_SRC(insn->code) == BPF_K && + insn->src_reg == BPF_PSEUDO_CALL && + insn->dst_reg == 0 && + insn->off == 0; +} + +static bool is_call_insn(const struct bpf_insn *insn) +{ + return insn->code == (BPF_JMP | BPF_CALL); +} + +static bool insn_is_pseudo_func(struct bpf_insn *insn) +{ + return is_ldimm64_insn(insn) && insn->src_reg == BPF_PSEUDO_FUNC; +} + +static int +bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog, + const char *name, size_t sec_idx, const char *sec_name, + size_t sec_off, void *insn_data, size_t insn_data_sz) +{ + if (insn_data_sz == 0 || insn_data_sz % BPF_INSN_SZ || sec_off % BPF_INSN_SZ) { + pr_warn("sec '%s': corrupted program '%s', offset %zu, size %zu\n", + sec_name, name, sec_off, insn_data_sz); + return -EINVAL; + } + + memset(prog, 0, sizeof(*prog)); + prog->obj = obj; + + prog->sec_idx = sec_idx; + prog->sec_insn_off = sec_off / BPF_INSN_SZ; + prog->sec_insn_cnt = insn_data_sz / BPF_INSN_SZ; + /* insns_cnt can later be increased by appending used subprograms */ + prog->insns_cnt = prog->sec_insn_cnt; + + prog->type = BPF_PROG_TYPE_UNSPEC; + prog->fd = -1; + + /* libbpf's convention for SEC("?abc...") is that it's just like + * SEC("abc...") but the corresponding bpf_program starts out with + * autoload set to false. + */ + if (sec_name[0] == '?') { + prog->autoload = false; + /* from now on forget there was ? in section name */ + sec_name++; + } else { + prog->autoload = true; + } + + prog->autoattach = true; + + /* inherit object's log_level */ + prog->log_level = obj->log_level; + + prog->sec_name = strdup(sec_name); + if (!prog->sec_name) + goto errout; + + prog->name = strdup(name); + if (!prog->name) + goto errout; + + prog->insns = malloc(insn_data_sz); + if (!prog->insns) + goto errout; + memcpy(prog->insns, insn_data, insn_data_sz); + + return 0; +errout: + pr_warn("sec '%s': failed to allocate memory for prog '%s'\n", sec_name, name); + bpf_program__exit(prog); + return -ENOMEM; +} + +static int +bpf_object__add_programs(struct bpf_object *obj, Elf_Data *sec_data, + const char *sec_name, int sec_idx) +{ + Elf_Data *symbols = obj->efile.symbols; + struct bpf_program *prog, *progs; + void *data = sec_data->d_buf; + size_t sec_sz = sec_data->d_size, sec_off, prog_sz, nr_syms; + int nr_progs, err, i; + const char *name; + Elf64_Sym *sym; + + progs = obj->programs; + nr_progs = obj->nr_programs; + nr_syms = symbols->d_size / sizeof(Elf64_Sym); + sec_off = 0; + + for (i = 0; i < nr_syms; i++) { + sym = elf_sym_by_idx(obj, i); + + if (sym->st_shndx != sec_idx) + continue; + if (ELF64_ST_TYPE(sym->st_info) != STT_FUNC) + continue; + + prog_sz = sym->st_size; + sec_off = sym->st_value; + + name = elf_sym_str(obj, sym->st_name); + if (!name) { + pr_warn("sec '%s': failed to get symbol name for offset %zu\n", + sec_name, sec_off); + return -LIBBPF_ERRNO__FORMAT; + } + + if (sec_off + prog_sz > sec_sz) { + pr_warn("sec '%s': program at offset %zu crosses section boundary\n", + sec_name, sec_off); + return -LIBBPF_ERRNO__FORMAT; + } + + if (sec_idx != obj->efile.text_shndx && ELF64_ST_BIND(sym->st_info) == STB_LOCAL) { + pr_warn("sec '%s': program '%s' is static and not supported\n", sec_name, name); + return -ENOTSUP; + } + + pr_debug("sec '%s': found program '%s' at insn offset %zu (%zu bytes), code size %zu insns (%zu bytes)\n", + sec_name, name, sec_off / BPF_INSN_SZ, sec_off, prog_sz / BPF_INSN_SZ, prog_sz); + + progs = libbpf_reallocarray(progs, nr_progs + 1, sizeof(*progs)); + if (!progs) { + /* + * In this case the original obj->programs + * is still valid, so don't need special treat for + * bpf_close_object(). + */ + pr_warn("sec '%s': failed to alloc memory for new program '%s'\n", + sec_name, name); + return -ENOMEM; + } + obj->programs = progs; + + prog = &progs[nr_progs]; + + err = bpf_object__init_prog(obj, prog, name, sec_idx, sec_name, + sec_off, data + sec_off, prog_sz); + if (err) + return err; + + /* if function is a global/weak symbol, but has restricted + * (STV_HIDDEN or STV_INTERNAL) visibility, mark its BTF FUNC + * as static to enable more permissive BPF verification mode + * with more outside context available to BPF verifier + */ + if (ELF64_ST_BIND(sym->st_info) != STB_LOCAL + && (ELF64_ST_VISIBILITY(sym->st_other) == STV_HIDDEN + || ELF64_ST_VISIBILITY(sym->st_other) == STV_INTERNAL)) + prog->mark_btf_static = true; + + nr_progs++; + obj->nr_programs = nr_progs; + } + + return 0; +} + +static const struct btf_member * +find_member_by_offset(const struct btf_type *t, __u32 bit_offset) +{ + struct btf_member *m; + int i; + + for (i = 0, m = btf_members(t); i < btf_vlen(t); i++, m++) { + if (btf_member_bit_offset(t, i) == bit_offset) + return m; + } + + return NULL; +} + +static const struct btf_member * +find_member_by_name(const struct btf *btf, const struct btf_type *t, + const char *name) +{ + struct btf_member *m; + int i; + + for (i = 0, m = btf_members(t); i < btf_vlen(t); i++, m++) { + if (!strcmp(btf__name_by_offset(btf, m->name_off), name)) + return m; + } + + return NULL; +} + +#define STRUCT_OPS_VALUE_PREFIX "bpf_struct_ops_" +static int find_btf_by_prefix_kind(const struct btf *btf, const char *prefix, + const char *name, __u32 kind); + +static int +find_struct_ops_kern_types(const struct btf *btf, const char *tname, + const struct btf_type **type, __u32 *type_id, + const struct btf_type **vtype, __u32 *vtype_id, + const struct btf_member **data_member) +{ + const struct btf_type *kern_type, *kern_vtype; + const struct btf_member *kern_data_member; + __s32 kern_vtype_id, kern_type_id; + __u32 i; + + kern_type_id = btf__find_by_name_kind(btf, tname, BTF_KIND_STRUCT); + if (kern_type_id < 0) { + pr_warn("struct_ops init_kern: struct %s is not found in kernel BTF\n", + tname); + return kern_type_id; + } + kern_type = btf__type_by_id(btf, kern_type_id); + + /* Find the corresponding "map_value" type that will be used + * in map_update(BPF_MAP_TYPE_STRUCT_OPS). For example, + * find "struct bpf_struct_ops_tcp_congestion_ops" from the + * btf_vmlinux. + */ + kern_vtype_id = find_btf_by_prefix_kind(btf, STRUCT_OPS_VALUE_PREFIX, + tname, BTF_KIND_STRUCT); + if (kern_vtype_id < 0) { + pr_warn("struct_ops init_kern: struct %s%s is not found in kernel BTF\n", + STRUCT_OPS_VALUE_PREFIX, tname); + return kern_vtype_id; + } + kern_vtype = btf__type_by_id(btf, kern_vtype_id); + + /* Find "struct tcp_congestion_ops" from + * struct bpf_struct_ops_tcp_congestion_ops { + * [ ... ] + * struct tcp_congestion_ops data; + * } + */ + kern_data_member = btf_members(kern_vtype); + for (i = 0; i < btf_vlen(kern_vtype); i++, kern_data_member++) { + if (kern_data_member->type == kern_type_id) + break; + } + if (i == btf_vlen(kern_vtype)) { + pr_warn("struct_ops init_kern: struct %s data is not found in struct %s%s\n", + tname, STRUCT_OPS_VALUE_PREFIX, tname); + return -EINVAL; + } + + *type = kern_type; + *type_id = kern_type_id; + *vtype = kern_vtype; + *vtype_id = kern_vtype_id; + *data_member = kern_data_member; + + return 0; +} + +static bool bpf_map__is_struct_ops(const struct bpf_map *map) +{ + return map->def.type == BPF_MAP_TYPE_STRUCT_OPS; +} + +/* Init the map's fields that depend on kern_btf */ +static int bpf_map__init_kern_struct_ops(struct bpf_map *map, + const struct btf *btf, + const struct btf *kern_btf) +{ + const struct btf_member *member, *kern_member, *kern_data_member; + const struct btf_type *type, *kern_type, *kern_vtype; + __u32 i, kern_type_id, kern_vtype_id, kern_data_off; + struct bpf_struct_ops *st_ops; + void *data, *kern_data; + const char *tname; + int err; + + st_ops = map->st_ops; + type = st_ops->type; + tname = st_ops->tname; + err = find_struct_ops_kern_types(kern_btf, tname, + &kern_type, &kern_type_id, + &kern_vtype, &kern_vtype_id, + &kern_data_member); + if (err) + return err; + + pr_debug("struct_ops init_kern %s: type_id:%u kern_type_id:%u kern_vtype_id:%u\n", + map->name, st_ops->type_id, kern_type_id, kern_vtype_id); + + map->def.value_size = kern_vtype->size; + map->btf_vmlinux_value_type_id = kern_vtype_id; + + st_ops->kern_vdata = calloc(1, kern_vtype->size); + if (!st_ops->kern_vdata) + return -ENOMEM; + + data = st_ops->data; + kern_data_off = kern_data_member->offset / 8; + kern_data = st_ops->kern_vdata + kern_data_off; + + member = btf_members(type); + for (i = 0; i < btf_vlen(type); i++, member++) { + const struct btf_type *mtype, *kern_mtype; + __u32 mtype_id, kern_mtype_id; + void *mdata, *kern_mdata; + __s64 msize, kern_msize; + __u32 moff, kern_moff; + __u32 kern_member_idx; + const char *mname; + + mname = btf__name_by_offset(btf, member->name_off); + kern_member = find_member_by_name(kern_btf, kern_type, mname); + if (!kern_member) { + pr_warn("struct_ops init_kern %s: Cannot find member %s in kernel BTF\n", + map->name, mname); + return -ENOTSUP; + } + + kern_member_idx = kern_member - btf_members(kern_type); + if (btf_member_bitfield_size(type, i) || + btf_member_bitfield_size(kern_type, kern_member_idx)) { + pr_warn("struct_ops init_kern %s: bitfield %s is not supported\n", + map->name, mname); + return -ENOTSUP; + } + + moff = member->offset / 8; + kern_moff = kern_member->offset / 8; + + mdata = data + moff; + kern_mdata = kern_data + kern_moff; + + mtype = skip_mods_and_typedefs(btf, member->type, &mtype_id); + kern_mtype = skip_mods_and_typedefs(kern_btf, kern_member->type, + &kern_mtype_id); + if (BTF_INFO_KIND(mtype->info) != + BTF_INFO_KIND(kern_mtype->info)) { + pr_warn("struct_ops init_kern %s: Unmatched member type %s %u != %u(kernel)\n", + map->name, mname, BTF_INFO_KIND(mtype->info), + BTF_INFO_KIND(kern_mtype->info)); + return -ENOTSUP; + } + + if (btf_is_ptr(mtype)) { + struct bpf_program *prog; + + prog = st_ops->progs[i]; + if (!prog) + continue; + + kern_mtype = skip_mods_and_typedefs(kern_btf, + kern_mtype->type, + &kern_mtype_id); + + /* mtype->type must be a func_proto which was + * guaranteed in bpf_object__collect_st_ops_relos(), + * so only check kern_mtype for func_proto here. + */ + if (!btf_is_func_proto(kern_mtype)) { + pr_warn("struct_ops init_kern %s: kernel member %s is not a func ptr\n", + map->name, mname); + return -ENOTSUP; + } + + prog->attach_btf_id = kern_type_id; + prog->expected_attach_type = kern_member_idx; + + st_ops->kern_func_off[i] = kern_data_off + kern_moff; + + pr_debug("struct_ops init_kern %s: func ptr %s is set to prog %s from data(+%u) to kern_data(+%u)\n", + map->name, mname, prog->name, moff, + kern_moff); + + continue; + } + + msize = btf__resolve_size(btf, mtype_id); + kern_msize = btf__resolve_size(kern_btf, kern_mtype_id); + if (msize < 0 || kern_msize < 0 || msize != kern_msize) { + pr_warn("struct_ops init_kern %s: Error in size of member %s: %zd != %zd(kernel)\n", + map->name, mname, (ssize_t)msize, + (ssize_t)kern_msize); + return -ENOTSUP; + } + + pr_debug("struct_ops init_kern %s: copy %s %u bytes from data(+%u) to kern_data(+%u)\n", + map->name, mname, (unsigned int)msize, + moff, kern_moff); + memcpy(kern_mdata, mdata, msize); + } + + return 0; +} + +static int bpf_object__init_kern_struct_ops_maps(struct bpf_object *obj) +{ + struct bpf_map *map; + size_t i; + int err; + + for (i = 0; i < obj->nr_maps; i++) { + map = &obj->maps[i]; + + if (!bpf_map__is_struct_ops(map)) + continue; + + err = bpf_map__init_kern_struct_ops(map, obj->btf, + obj->btf_vmlinux); + if (err) + return err; + } + + return 0; +} + +static int bpf_object__init_struct_ops_maps(struct bpf_object *obj) +{ + const struct btf_type *type, *datasec; + const struct btf_var_secinfo *vsi; + struct bpf_struct_ops *st_ops; + const char *tname, *var_name; + __s32 type_id, datasec_id; + const struct btf *btf; + struct bpf_map *map; + __u32 i; + + if (obj->efile.st_ops_shndx == -1) + return 0; + + btf = obj->btf; + datasec_id = btf__find_by_name_kind(btf, STRUCT_OPS_SEC, + BTF_KIND_DATASEC); + if (datasec_id < 0) { + pr_warn("struct_ops init: DATASEC %s not found\n", + STRUCT_OPS_SEC); + return -EINVAL; + } + + datasec = btf__type_by_id(btf, datasec_id); + vsi = btf_var_secinfos(datasec); + for (i = 0; i < btf_vlen(datasec); i++, vsi++) { + type = btf__type_by_id(obj->btf, vsi->type); + var_name = btf__name_by_offset(obj->btf, type->name_off); + + type_id = btf__resolve_type(obj->btf, vsi->type); + if (type_id < 0) { + pr_warn("struct_ops init: Cannot resolve var type_id %u in DATASEC %s\n", + vsi->type, STRUCT_OPS_SEC); + return -EINVAL; + } + + type = btf__type_by_id(obj->btf, type_id); + tname = btf__name_by_offset(obj->btf, type->name_off); + if (!tname[0]) { + pr_warn("struct_ops init: anonymous type is not supported\n"); + return -ENOTSUP; + } + if (!btf_is_struct(type)) { + pr_warn("struct_ops init: %s is not a struct\n", tname); + return -EINVAL; + } + + map = bpf_object__add_map(obj); + if (IS_ERR(map)) + return PTR_ERR(map); + + map->sec_idx = obj->efile.st_ops_shndx; + map->sec_offset = vsi->offset; + map->name = strdup(var_name); + if (!map->name) + return -ENOMEM; + + map->def.type = BPF_MAP_TYPE_STRUCT_OPS; + map->def.key_size = sizeof(int); + map->def.value_size = type->size; + map->def.max_entries = 1; + + map->st_ops = calloc(1, sizeof(*map->st_ops)); + if (!map->st_ops) + return -ENOMEM; + st_ops = map->st_ops; + st_ops->data = malloc(type->size); + st_ops->progs = calloc(btf_vlen(type), sizeof(*st_ops->progs)); + st_ops->kern_func_off = malloc(btf_vlen(type) * + sizeof(*st_ops->kern_func_off)); + if (!st_ops->data || !st_ops->progs || !st_ops->kern_func_off) + return -ENOMEM; + + if (vsi->offset + type->size > obj->efile.st_ops_data->d_size) { + pr_warn("struct_ops init: var %s is beyond the end of DATASEC %s\n", + var_name, STRUCT_OPS_SEC); + return -EINVAL; + } + + memcpy(st_ops->data, + obj->efile.st_ops_data->d_buf + vsi->offset, + type->size); + st_ops->tname = tname; + st_ops->type = type; + st_ops->type_id = type_id; + + pr_debug("struct_ops init: struct %s(type_id=%u) %s found at offset %u\n", + tname, type_id, var_name, vsi->offset); + } + + return 0; +} + +static struct bpf_object *bpf_object__new(const char *path, + const void *obj_buf, + size_t obj_buf_sz, + const char *obj_name) +{ + struct bpf_object *obj; + char *end; + + obj = calloc(1, sizeof(struct bpf_object) + strlen(path) + 1); + if (!obj) { + pr_warn("alloc memory failed for %s\n", path); + return ERR_PTR(-ENOMEM); + } + + strcpy(obj->path, path); + if (obj_name) { + libbpf_strlcpy(obj->name, obj_name, sizeof(obj->name)); + } else { + /* Using basename() GNU version which doesn't modify arg. */ + libbpf_strlcpy(obj->name, basename((void *)path), sizeof(obj->name)); + end = strchr(obj->name, '.'); + if (end) + *end = 0; + } + + obj->efile.fd = -1; + /* + * Caller of this function should also call + * bpf_object__elf_finish() after data collection to return + * obj_buf to user. If not, we should duplicate the buffer to + * avoid user freeing them before elf finish. + */ + obj->efile.obj_buf = obj_buf; + obj->efile.obj_buf_sz = obj_buf_sz; + obj->efile.btf_maps_shndx = -1; + obj->efile.st_ops_shndx = -1; + obj->kconfig_map_idx = -1; + + obj->kern_version = get_kernel_version(); + obj->loaded = false; + + return obj; +} + +static void bpf_object__elf_finish(struct bpf_object *obj) +{ + if (!obj->efile.elf) + return; + + elf_end(obj->efile.elf); + obj->efile.elf = NULL; + obj->efile.symbols = NULL; + obj->efile.st_ops_data = NULL; + + zfree(&obj->efile.secs); + obj->efile.sec_cnt = 0; + zclose(obj->efile.fd); + obj->efile.obj_buf = NULL; + obj->efile.obj_buf_sz = 0; +} + +static int bpf_object__elf_init(struct bpf_object *obj) +{ + Elf64_Ehdr *ehdr; + int err = 0; + Elf *elf; + + if (obj->efile.elf) { + pr_warn("elf: init internal error\n"); + return -LIBBPF_ERRNO__LIBELF; + } + + if (obj->efile.obj_buf_sz > 0) { + /* obj_buf should have been validated by bpf_object__open_mem(). */ + elf = elf_memory((char *)obj->efile.obj_buf, obj->efile.obj_buf_sz); + } else { + obj->efile.fd = open(obj->path, O_RDONLY | O_CLOEXEC); + if (obj->efile.fd < 0) { + char errmsg[STRERR_BUFSIZE], *cp; + + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("elf: failed to open %s: %s\n", obj->path, cp); + return err; + } + + elf = elf_begin(obj->efile.fd, ELF_C_READ_MMAP, NULL); + } + + if (!elf) { + pr_warn("elf: failed to open %s as ELF file: %s\n", obj->path, elf_errmsg(-1)); + err = -LIBBPF_ERRNO__LIBELF; + goto errout; + } + + obj->efile.elf = elf; + + if (elf_kind(elf) != ELF_K_ELF) { + err = -LIBBPF_ERRNO__FORMAT; + pr_warn("elf: '%s' is not a proper ELF object\n", obj->path); + goto errout; + } + + if (gelf_getclass(elf) != ELFCLASS64) { + err = -LIBBPF_ERRNO__FORMAT; + pr_warn("elf: '%s' is not a 64-bit ELF object\n", obj->path); + goto errout; + } + + obj->efile.ehdr = ehdr = elf64_getehdr(elf); + if (!obj->efile.ehdr) { + pr_warn("elf: failed to get ELF header from %s: %s\n", obj->path, elf_errmsg(-1)); + err = -LIBBPF_ERRNO__FORMAT; + goto errout; + } + + if (elf_getshdrstrndx(elf, &obj->efile.shstrndx)) { + pr_warn("elf: failed to get section names section index for %s: %s\n", + obj->path, elf_errmsg(-1)); + err = -LIBBPF_ERRNO__FORMAT; + goto errout; + } + + /* Elf is corrupted/truncated, avoid calling elf_strptr. */ + if (!elf_rawdata(elf_getscn(elf, obj->efile.shstrndx), NULL)) { + pr_warn("elf: failed to get section names strings from %s: %s\n", + obj->path, elf_errmsg(-1)); + err = -LIBBPF_ERRNO__FORMAT; + goto errout; + } + + /* Old LLVM set e_machine to EM_NONE */ + if (ehdr->e_type != ET_REL || (ehdr->e_machine && ehdr->e_machine != EM_BPF)) { + pr_warn("elf: %s is not a valid eBPF object file\n", obj->path); + err = -LIBBPF_ERRNO__FORMAT; + goto errout; + } + + return 0; +errout: + bpf_object__elf_finish(obj); + return err; +} + +static int bpf_object__check_endianness(struct bpf_object *obj) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + if (obj->efile.ehdr->e_ident[EI_DATA] == ELFDATA2LSB) + return 0; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + if (obj->efile.ehdr->e_ident[EI_DATA] == ELFDATA2MSB) + return 0; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif + pr_warn("elf: endianness mismatch in %s.\n", obj->path); + return -LIBBPF_ERRNO__ENDIAN; +} + +static int +bpf_object__init_license(struct bpf_object *obj, void *data, size_t size) +{ + if (!data) { + pr_warn("invalid license section in %s\n", obj->path); + return -LIBBPF_ERRNO__FORMAT; + } + /* libbpf_strlcpy() only copies first N - 1 bytes, so size + 1 won't + * go over allowed ELF data section buffer + */ + libbpf_strlcpy(obj->license, data, min(size + 1, sizeof(obj->license))); + pr_debug("license of %s is %s\n", obj->path, obj->license); + return 0; +} + +static int +bpf_object__init_kversion(struct bpf_object *obj, void *data, size_t size) +{ + __u32 kver; + + if (!data || size != sizeof(kver)) { + pr_warn("invalid kver section in %s\n", obj->path); + return -LIBBPF_ERRNO__FORMAT; + } + memcpy(&kver, data, sizeof(kver)); + obj->kern_version = kver; + pr_debug("kernel version of %s is %x\n", obj->path, obj->kern_version); + return 0; +} + +static bool bpf_map_type__is_map_in_map(enum bpf_map_type type) +{ + if (type == BPF_MAP_TYPE_ARRAY_OF_MAPS || + type == BPF_MAP_TYPE_HASH_OF_MAPS) + return true; + return false; +} + +static int find_elf_sec_sz(const struct bpf_object *obj, const char *name, __u32 *size) +{ + Elf_Data *data; + Elf_Scn *scn; + + if (!name) + return -EINVAL; + + scn = elf_sec_by_name(obj, name); + data = elf_sec_data(obj, scn); + if (data) { + *size = data->d_size; + return 0; /* found it */ + } + + return -ENOENT; +} + +static Elf64_Sym *find_elf_var_sym(const struct bpf_object *obj, const char *name) +{ + Elf_Data *symbols = obj->efile.symbols; + const char *sname; + size_t si; + + for (si = 0; si < symbols->d_size / sizeof(Elf64_Sym); si++) { + Elf64_Sym *sym = elf_sym_by_idx(obj, si); + + if (ELF64_ST_TYPE(sym->st_info) != STT_OBJECT) + continue; + + if (ELF64_ST_BIND(sym->st_info) != STB_GLOBAL && + ELF64_ST_BIND(sym->st_info) != STB_WEAK) + continue; + + sname = elf_sym_str(obj, sym->st_name); + if (!sname) { + pr_warn("failed to get sym name string for var %s\n", name); + return ERR_PTR(-EIO); + } + if (strcmp(name, sname) == 0) + return sym; + } + + return ERR_PTR(-ENOENT); +} + +static struct bpf_map *bpf_object__add_map(struct bpf_object *obj) +{ + struct bpf_map *map; + int err; + + err = libbpf_ensure_mem((void **)&obj->maps, &obj->maps_cap, + sizeof(*obj->maps), obj->nr_maps + 1); + if (err) + return ERR_PTR(err); + + map = &obj->maps[obj->nr_maps++]; + map->obj = obj; + map->fd = -1; + map->inner_map_fd = -1; + map->autocreate = true; + + return map; +} + +static size_t bpf_map_mmap_sz(const struct bpf_map *map) +{ + long page_sz = sysconf(_SC_PAGE_SIZE); + size_t map_sz; + + map_sz = (size_t)roundup(map->def.value_size, 8) * map->def.max_entries; + map_sz = roundup(map_sz, page_sz); + return map_sz; +} + +static char *internal_map_name(struct bpf_object *obj, const char *real_name) +{ + char map_name[BPF_OBJ_NAME_LEN], *p; + int pfx_len, sfx_len = max((size_t)7, strlen(real_name)); + + /* This is one of the more confusing parts of libbpf for various + * reasons, some of which are historical. The original idea for naming + * internal names was to include as much of BPF object name prefix as + * possible, so that it can be distinguished from similar internal + * maps of a different BPF object. + * As an example, let's say we have bpf_object named 'my_object_name' + * and internal map corresponding to '.rodata' ELF section. The final + * map name advertised to user and to the kernel will be + * 'my_objec.rodata', taking first 8 characters of object name and + * entire 7 characters of '.rodata'. + * Somewhat confusingly, if internal map ELF section name is shorter + * than 7 characters, e.g., '.bss', we still reserve 7 characters + * for the suffix, even though we only have 4 actual characters, and + * resulting map will be called 'my_objec.bss', not even using all 15 + * characters allowed by the kernel. Oh well, at least the truncated + * object name is somewhat consistent in this case. But if the map + * name is '.kconfig', we'll still have entirety of '.kconfig' added + * (8 chars) and thus will be left with only first 7 characters of the + * object name ('my_obje'). Happy guessing, user, that the final map + * name will be "my_obje.kconfig". + * Now, with libbpf starting to support arbitrarily named .rodata.* + * and .data.* data sections, it's possible that ELF section name is + * longer than allowed 15 chars, so we now need to be careful to take + * only up to 15 first characters of ELF name, taking no BPF object + * name characters at all. So '.rodata.abracadabra' will result in + * '.rodata.abracad' kernel and user-visible name. + * We need to keep this convoluted logic intact for .data, .bss and + * .rodata maps, but for new custom .data.custom and .rodata.custom + * maps we use their ELF names as is, not prepending bpf_object name + * in front. We still need to truncate them to 15 characters for the + * kernel. Full name can be recovered for such maps by using DATASEC + * BTF type associated with such map's value type, though. + */ + if (sfx_len >= BPF_OBJ_NAME_LEN) + sfx_len = BPF_OBJ_NAME_LEN - 1; + + /* if there are two or more dots in map name, it's a custom dot map */ + if (strchr(real_name + 1, '.') != NULL) + pfx_len = 0; + else + pfx_len = min((size_t)BPF_OBJ_NAME_LEN - sfx_len - 1, strlen(obj->name)); + + snprintf(map_name, sizeof(map_name), "%.*s%.*s", pfx_len, obj->name, + sfx_len, real_name); + + /* sanitise map name to characters allowed by kernel */ + for (p = map_name; *p && p < map_name + sizeof(map_name); p++) + if (!isalnum(*p) && *p != '_' && *p != '.') + *p = '_'; + + return strdup(map_name); +} + +static int +map_fill_btf_type_info(struct bpf_object *obj, struct bpf_map *map); + +/* Internal BPF map is mmap()'able only if at least one of corresponding + * DATASEC's VARs are to be exposed through BPF skeleton. I.e., it's a GLOBAL + * variable and it's not marked as __hidden (which turns it into, effectively, + * a STATIC variable). + */ +static bool map_is_mmapable(struct bpf_object *obj, struct bpf_map *map) +{ + const struct btf_type *t, *vt; + struct btf_var_secinfo *vsi; + int i, n; + + if (!map->btf_value_type_id) + return false; + + t = btf__type_by_id(obj->btf, map->btf_value_type_id); + if (!btf_is_datasec(t)) + return false; + + vsi = btf_var_secinfos(t); + for (i = 0, n = btf_vlen(t); i < n; i++, vsi++) { + vt = btf__type_by_id(obj->btf, vsi->type); + if (!btf_is_var(vt)) + continue; + + if (btf_var(vt)->linkage != BTF_VAR_STATIC) + return true; + } + + return false; +} + +static int +bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type, + const char *real_name, int sec_idx, void *data, size_t data_sz) +{ + struct bpf_map_def *def; + struct bpf_map *map; + int err; + + map = bpf_object__add_map(obj); + if (IS_ERR(map)) + return PTR_ERR(map); + + map->libbpf_type = type; + map->sec_idx = sec_idx; + map->sec_offset = 0; + map->real_name = strdup(real_name); + map->name = internal_map_name(obj, real_name); + if (!map->real_name || !map->name) { + zfree(&map->real_name); + zfree(&map->name); + return -ENOMEM; + } + + def = &map->def; + def->type = BPF_MAP_TYPE_ARRAY; + def->key_size = sizeof(int); + def->value_size = data_sz; + def->max_entries = 1; + def->map_flags = type == LIBBPF_MAP_RODATA || type == LIBBPF_MAP_KCONFIG + ? BPF_F_RDONLY_PROG : 0; + + /* failures are fine because of maps like .rodata.str1.1 */ + (void) map_fill_btf_type_info(obj, map); + + if (map_is_mmapable(obj, map)) + def->map_flags |= BPF_F_MMAPABLE; + + pr_debug("map '%s' (global data): at sec_idx %d, offset %zu, flags %x.\n", + map->name, map->sec_idx, map->sec_offset, def->map_flags); + + map->mmaped = mmap(NULL, bpf_map_mmap_sz(map), PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (map->mmaped == MAP_FAILED) { + err = -errno; + map->mmaped = NULL; + pr_warn("failed to alloc map '%s' content buffer: %d\n", + map->name, err); + zfree(&map->real_name); + zfree(&map->name); + return err; + } + + if (data) + memcpy(map->mmaped, data, data_sz); + + pr_debug("map %td is \"%s\"\n", map - obj->maps, map->name); + return 0; +} + +static int bpf_object__init_global_data_maps(struct bpf_object *obj) +{ + struct elf_sec_desc *sec_desc; + const char *sec_name; + int err = 0, sec_idx; + + /* + * Populate obj->maps with libbpf internal maps. + */ + for (sec_idx = 1; sec_idx < obj->efile.sec_cnt; sec_idx++) { + sec_desc = &obj->efile.secs[sec_idx]; + + /* Skip recognized sections with size 0. */ + if (!sec_desc->data || sec_desc->data->d_size == 0) + continue; + + switch (sec_desc->sec_type) { + case SEC_DATA: + sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, sec_idx)); + err = bpf_object__init_internal_map(obj, LIBBPF_MAP_DATA, + sec_name, sec_idx, + sec_desc->data->d_buf, + sec_desc->data->d_size); + break; + case SEC_RODATA: + obj->has_rodata = true; + sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, sec_idx)); + err = bpf_object__init_internal_map(obj, LIBBPF_MAP_RODATA, + sec_name, sec_idx, + sec_desc->data->d_buf, + sec_desc->data->d_size); + break; + case SEC_BSS: + sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, sec_idx)); + err = bpf_object__init_internal_map(obj, LIBBPF_MAP_BSS, + sec_name, sec_idx, + NULL, + sec_desc->data->d_size); + break; + default: + /* skip */ + break; + } + if (err) + return err; + } + return 0; +} + + +static struct extern_desc *find_extern_by_name(const struct bpf_object *obj, + const void *name) +{ + int i; + + for (i = 0; i < obj->nr_extern; i++) { + if (strcmp(obj->externs[i].name, name) == 0) + return &obj->externs[i]; + } + return NULL; +} + +static int set_kcfg_value_tri(struct extern_desc *ext, void *ext_val, + char value) +{ + switch (ext->kcfg.type) { + case KCFG_BOOL: + if (value == 'm') { + pr_warn("extern (kcfg) '%s': value '%c' implies tristate or char type\n", + ext->name, value); + return -EINVAL; + } + *(bool *)ext_val = value == 'y' ? true : false; + break; + case KCFG_TRISTATE: + if (value == 'y') + *(enum libbpf_tristate *)ext_val = TRI_YES; + else if (value == 'm') + *(enum libbpf_tristate *)ext_val = TRI_MODULE; + else /* value == 'n' */ + *(enum libbpf_tristate *)ext_val = TRI_NO; + break; + case KCFG_CHAR: + *(char *)ext_val = value; + break; + case KCFG_UNKNOWN: + case KCFG_INT: + case KCFG_CHAR_ARR: + default: + pr_warn("extern (kcfg) '%s': value '%c' implies bool, tristate, or char type\n", + ext->name, value); + return -EINVAL; + } + ext->is_set = true; + return 0; +} + +static int set_kcfg_value_str(struct extern_desc *ext, char *ext_val, + const char *value) +{ + size_t len; + + if (ext->kcfg.type != KCFG_CHAR_ARR) { + pr_warn("extern (kcfg) '%s': value '%s' implies char array type\n", + ext->name, value); + return -EINVAL; + } + + len = strlen(value); + if (value[len - 1] != '"') { + pr_warn("extern (kcfg) '%s': invalid string config '%s'\n", + ext->name, value); + return -EINVAL; + } + + /* strip quotes */ + len -= 2; + if (len >= ext->kcfg.sz) { + pr_warn("extern (kcfg) '%s': long string '%s' of (%zu bytes) truncated to %d bytes\n", + ext->name, value, len, ext->kcfg.sz - 1); + len = ext->kcfg.sz - 1; + } + memcpy(ext_val, value + 1, len); + ext_val[len] = '\0'; + ext->is_set = true; + return 0; +} + +static int parse_u64(const char *value, __u64 *res) +{ + char *value_end; + int err; + + errno = 0; + *res = strtoull(value, &value_end, 0); + if (errno) { + err = -errno; + pr_warn("failed to parse '%s' as integer: %d\n", value, err); + return err; + } + if (*value_end) { + pr_warn("failed to parse '%s' as integer completely\n", value); + return -EINVAL; + } + return 0; +} + +static bool is_kcfg_value_in_range(const struct extern_desc *ext, __u64 v) +{ + int bit_sz = ext->kcfg.sz * 8; + + if (ext->kcfg.sz == 8) + return true; + + /* Validate that value stored in u64 fits in integer of `ext->sz` + * bytes size without any loss of information. If the target integer + * is signed, we rely on the following limits of integer type of + * Y bits and subsequent transformation: + * + * -2^(Y-1) <= X <= 2^(Y-1) - 1 + * 0 <= X + 2^(Y-1) <= 2^Y - 1 + * 0 <= X + 2^(Y-1) < 2^Y + * + * For unsigned target integer, check that all the (64 - Y) bits are + * zero. + */ + if (ext->kcfg.is_signed) + return v + (1ULL << (bit_sz - 1)) < (1ULL << bit_sz); + else + return (v >> bit_sz) == 0; +} + +static int set_kcfg_value_num(struct extern_desc *ext, void *ext_val, + __u64 value) +{ + if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR && + ext->kcfg.type != KCFG_BOOL) { + pr_warn("extern (kcfg) '%s': value '%llu' implies integer, char, or boolean type\n", + ext->name, (unsigned long long)value); + return -EINVAL; + } + if (ext->kcfg.type == KCFG_BOOL && value > 1) { + pr_warn("extern (kcfg) '%s': value '%llu' isn't boolean compatible\n", + ext->name, (unsigned long long)value); + return -EINVAL; + + } + if (!is_kcfg_value_in_range(ext, value)) { + pr_warn("extern (kcfg) '%s': value '%llu' doesn't fit in %d bytes\n", + ext->name, (unsigned long long)value, ext->kcfg.sz); + return -ERANGE; + } + switch (ext->kcfg.sz) { + case 1: + *(__u8 *)ext_val = value; + break; + case 2: + *(__u16 *)ext_val = value; + break; + case 4: + *(__u32 *)ext_val = value; + break; + case 8: + *(__u64 *)ext_val = value; + break; + default: + return -EINVAL; + } + ext->is_set = true; + return 0; +} + +static int bpf_object__process_kconfig_line(struct bpf_object *obj, + char *buf, void *data) +{ + struct extern_desc *ext; + char *sep, *value; + int len, err = 0; + void *ext_val; + __u64 num; + + if (!str_has_pfx(buf, "CONFIG_")) + return 0; + + sep = strchr(buf, '='); + if (!sep) { + pr_warn("failed to parse '%s': no separator\n", buf); + return -EINVAL; + } + + /* Trim ending '\n' */ + len = strlen(buf); + if (buf[len - 1] == '\n') + buf[len - 1] = '\0'; + /* Split on '=' and ensure that a value is present. */ + *sep = '\0'; + if (!sep[1]) { + *sep = '='; + pr_warn("failed to parse '%s': no value\n", buf); + return -EINVAL; + } + + ext = find_extern_by_name(obj, buf); + if (!ext || ext->is_set) + return 0; + + ext_val = data + ext->kcfg.data_off; + value = sep + 1; + + switch (*value) { + case 'y': case 'n': case 'm': + err = set_kcfg_value_tri(ext, ext_val, *value); + break; + case '"': + err = set_kcfg_value_str(ext, ext_val, value); + break; + default: + /* assume integer */ + err = parse_u64(value, &num); + if (err) { + pr_warn("extern (kcfg) '%s': value '%s' isn't a valid integer\n", ext->name, value); + return err; + } + if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR) { + pr_warn("extern (kcfg) '%s': value '%s' implies integer type\n", ext->name, value); + return -EINVAL; + } + err = set_kcfg_value_num(ext, ext_val, num); + break; + } + if (err) + return err; + pr_debug("extern (kcfg) '%s': set to %s\n", ext->name, value); + return 0; +} + +static int bpf_object__read_kconfig_file(struct bpf_object *obj, void *data) +{ + char buf[PATH_MAX]; + struct utsname uts; + int len, err = 0; + gzFile file; + + uname(&uts); + len = snprintf(buf, PATH_MAX, "/boot/config-%s", uts.release); + if (len < 0) + return -EINVAL; + else if (len >= PATH_MAX) + return -ENAMETOOLONG; + + /* gzopen also accepts uncompressed files. */ + file = gzopen(buf, "r"); + if (!file) + file = gzopen("/proc/config.gz", "r"); + + if (!file) { + pr_warn("failed to open system Kconfig\n"); + return -ENOENT; + } + + while (gzgets(file, buf, sizeof(buf))) { + err = bpf_object__process_kconfig_line(obj, buf, data); + if (err) { + pr_warn("error parsing system Kconfig line '%s': %d\n", + buf, err); + goto out; + } + } + +out: + gzclose(file); + return err; +} + +static int bpf_object__read_kconfig_mem(struct bpf_object *obj, + const char *config, void *data) +{ + char buf[PATH_MAX]; + int err = 0; + FILE *file; + + file = fmemopen((void *)config, strlen(config), "r"); + if (!file) { + err = -errno; + pr_warn("failed to open in-memory Kconfig: %d\n", err); + return err; + } + + while (fgets(buf, sizeof(buf), file)) { + err = bpf_object__process_kconfig_line(obj, buf, data); + if (err) { + pr_warn("error parsing in-memory Kconfig line '%s': %d\n", + buf, err); + break; + } + } + + fclose(file); + return err; +} + +static int bpf_object__init_kconfig_map(struct bpf_object *obj) +{ + struct extern_desc *last_ext = NULL, *ext; + size_t map_sz; + int i, err; + + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type == EXT_KCFG) + last_ext = ext; + } + + if (!last_ext) + return 0; + + map_sz = last_ext->kcfg.data_off + last_ext->kcfg.sz; + err = bpf_object__init_internal_map(obj, LIBBPF_MAP_KCONFIG, + ".kconfig", obj->efile.symbols_shndx, + NULL, map_sz); + if (err) + return err; + + obj->kconfig_map_idx = obj->nr_maps - 1; + + return 0; +} + +const struct btf_type * +skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id) +{ + const struct btf_type *t = btf__type_by_id(btf, id); + + if (res_id) + *res_id = id; + + while (btf_is_mod(t) || btf_is_typedef(t)) { + if (res_id) + *res_id = t->type; + t = btf__type_by_id(btf, t->type); + } + + return t; +} + +static const struct btf_type * +resolve_func_ptr(const struct btf *btf, __u32 id, __u32 *res_id) +{ + const struct btf_type *t; + + t = skip_mods_and_typedefs(btf, id, NULL); + if (!btf_is_ptr(t)) + return NULL; + + t = skip_mods_and_typedefs(btf, t->type, res_id); + + return btf_is_func_proto(t) ? t : NULL; +} + +static const char *__btf_kind_str(__u16 kind) +{ + switch (kind) { + case BTF_KIND_UNKN: return "void"; + case BTF_KIND_INT: return "int"; + case BTF_KIND_PTR: return "ptr"; + case BTF_KIND_ARRAY: return "array"; + case BTF_KIND_STRUCT: return "struct"; + case BTF_KIND_UNION: return "union"; + case BTF_KIND_ENUM: return "enum"; + case BTF_KIND_FWD: return "fwd"; + case BTF_KIND_TYPEDEF: return "typedef"; + case BTF_KIND_VOLATILE: return "volatile"; + case BTF_KIND_CONST: return "const"; + case BTF_KIND_RESTRICT: return "restrict"; + case BTF_KIND_FUNC: return "func"; + case BTF_KIND_FUNC_PROTO: return "func_proto"; + case BTF_KIND_VAR: return "var"; + case BTF_KIND_DATASEC: return "datasec"; + case BTF_KIND_FLOAT: return "float"; + case BTF_KIND_DECL_TAG: return "decl_tag"; + case BTF_KIND_TYPE_TAG: return "type_tag"; + case BTF_KIND_ENUM64: return "enum64"; + default: return "unknown"; + } +} + +const char *btf_kind_str(const struct btf_type *t) +{ + return __btf_kind_str(btf_kind(t)); +} + +/* + * Fetch integer attribute of BTF map definition. Such attributes are + * represented using a pointer to an array, in which dimensionality of array + * encodes specified integer value. E.g., int (*type)[BPF_MAP_TYPE_ARRAY]; + * encodes `type => BPF_MAP_TYPE_ARRAY` key/value pair completely using BTF + * type definition, while using only sizeof(void *) space in ELF data section. + */ +static bool get_map_field_int(const char *map_name, const struct btf *btf, + const struct btf_member *m, __u32 *res) +{ + const struct btf_type *t = skip_mods_and_typedefs(btf, m->type, NULL); + const char *name = btf__name_by_offset(btf, m->name_off); + const struct btf_array *arr_info; + const struct btf_type *arr_t; + + if (!btf_is_ptr(t)) { + pr_warn("map '%s': attr '%s': expected PTR, got %s.\n", + map_name, name, btf_kind_str(t)); + return false; + } + + arr_t = btf__type_by_id(btf, t->type); + if (!arr_t) { + pr_warn("map '%s': attr '%s': type [%u] not found.\n", + map_name, name, t->type); + return false; + } + if (!btf_is_array(arr_t)) { + pr_warn("map '%s': attr '%s': expected ARRAY, got %s.\n", + map_name, name, btf_kind_str(arr_t)); + return false; + } + arr_info = btf_array(arr_t); + *res = arr_info->nelems; + return true; +} + +static int pathname_concat(char *buf, size_t buf_sz, const char *path, const char *name) +{ + int len; + + len = snprintf(buf, buf_sz, "%s/%s", path, name); + if (len < 0) + return -EINVAL; + if (len >= buf_sz) + return -ENAMETOOLONG; + + return 0; +} + +static int build_map_pin_path(struct bpf_map *map, const char *path) +{ + char buf[PATH_MAX]; + int err; + + if (!path) + path = "/sys/fs/bpf"; + + err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map)); + if (err) + return err; + + return bpf_map__set_pin_path(map, buf); +} + +/* should match definition in bpf_helpers.h */ +enum libbpf_pin_type { + LIBBPF_PIN_NONE, + /* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */ + LIBBPF_PIN_BY_NAME, +}; + +int parse_btf_map_def(const char *map_name, struct btf *btf, + const struct btf_type *def_t, bool strict, + struct btf_map_def *map_def, struct btf_map_def *inner_def) +{ + const struct btf_type *t; + const struct btf_member *m; + bool is_inner = inner_def == NULL; + int vlen, i; + + vlen = btf_vlen(def_t); + m = btf_members(def_t); + for (i = 0; i < vlen; i++, m++) { + const char *name = btf__name_by_offset(btf, m->name_off); + + if (!name) { + pr_warn("map '%s': invalid field #%d.\n", map_name, i); + return -EINVAL; + } + if (strcmp(name, "type") == 0) { + if (!get_map_field_int(map_name, btf, m, &map_def->map_type)) + return -EINVAL; + map_def->parts |= MAP_DEF_MAP_TYPE; + } else if (strcmp(name, "max_entries") == 0) { + if (!get_map_field_int(map_name, btf, m, &map_def->max_entries)) + return -EINVAL; + map_def->parts |= MAP_DEF_MAX_ENTRIES; + } else if (strcmp(name, "map_flags") == 0) { + if (!get_map_field_int(map_name, btf, m, &map_def->map_flags)) + return -EINVAL; + map_def->parts |= MAP_DEF_MAP_FLAGS; + } else if (strcmp(name, "numa_node") == 0) { + if (!get_map_field_int(map_name, btf, m, &map_def->numa_node)) + return -EINVAL; + map_def->parts |= MAP_DEF_NUMA_NODE; + } else if (strcmp(name, "key_size") == 0) { + __u32 sz; + + if (!get_map_field_int(map_name, btf, m, &sz)) + return -EINVAL; + if (map_def->key_size && map_def->key_size != sz) { + pr_warn("map '%s': conflicting key size %u != %u.\n", + map_name, map_def->key_size, sz); + return -EINVAL; + } + map_def->key_size = sz; + map_def->parts |= MAP_DEF_KEY_SIZE; + } else if (strcmp(name, "key") == 0) { + __s64 sz; + + t = btf__type_by_id(btf, m->type); + if (!t) { + pr_warn("map '%s': key type [%d] not found.\n", + map_name, m->type); + return -EINVAL; + } + if (!btf_is_ptr(t)) { + pr_warn("map '%s': key spec is not PTR: %s.\n", + map_name, btf_kind_str(t)); + return -EINVAL; + } + sz = btf__resolve_size(btf, t->type); + if (sz < 0) { + pr_warn("map '%s': can't determine key size for type [%u]: %zd.\n", + map_name, t->type, (ssize_t)sz); + return sz; + } + if (map_def->key_size && map_def->key_size != sz) { + pr_warn("map '%s': conflicting key size %u != %zd.\n", + map_name, map_def->key_size, (ssize_t)sz); + return -EINVAL; + } + map_def->key_size = sz; + map_def->key_type_id = t->type; + map_def->parts |= MAP_DEF_KEY_SIZE | MAP_DEF_KEY_TYPE; + } else if (strcmp(name, "value_size") == 0) { + __u32 sz; + + if (!get_map_field_int(map_name, btf, m, &sz)) + return -EINVAL; + if (map_def->value_size && map_def->value_size != sz) { + pr_warn("map '%s': conflicting value size %u != %u.\n", + map_name, map_def->value_size, sz); + return -EINVAL; + } + map_def->value_size = sz; + map_def->parts |= MAP_DEF_VALUE_SIZE; + } else if (strcmp(name, "value") == 0) { + __s64 sz; + + t = btf__type_by_id(btf, m->type); + if (!t) { + pr_warn("map '%s': value type [%d] not found.\n", + map_name, m->type); + return -EINVAL; + } + if (!btf_is_ptr(t)) { + pr_warn("map '%s': value spec is not PTR: %s.\n", + map_name, btf_kind_str(t)); + return -EINVAL; + } + sz = btf__resolve_size(btf, t->type); + if (sz < 0) { + pr_warn("map '%s': can't determine value size for type [%u]: %zd.\n", + map_name, t->type, (ssize_t)sz); + return sz; + } + if (map_def->value_size && map_def->value_size != sz) { + pr_warn("map '%s': conflicting value size %u != %zd.\n", + map_name, map_def->value_size, (ssize_t)sz); + return -EINVAL; + } + map_def->value_size = sz; + map_def->value_type_id = t->type; + map_def->parts |= MAP_DEF_VALUE_SIZE | MAP_DEF_VALUE_TYPE; + } + else if (strcmp(name, "values") == 0) { + bool is_map_in_map = bpf_map_type__is_map_in_map(map_def->map_type); + bool is_prog_array = map_def->map_type == BPF_MAP_TYPE_PROG_ARRAY; + const char *desc = is_map_in_map ? "map-in-map inner" : "prog-array value"; + char inner_map_name[128]; + int err; + + if (is_inner) { + pr_warn("map '%s': multi-level inner maps not supported.\n", + map_name); + return -ENOTSUP; + } + if (i != vlen - 1) { + pr_warn("map '%s': '%s' member should be last.\n", + map_name, name); + return -EINVAL; + } + if (!is_map_in_map && !is_prog_array) { + pr_warn("map '%s': should be map-in-map or prog-array.\n", + map_name); + return -ENOTSUP; + } + if (map_def->value_size && map_def->value_size != 4) { + pr_warn("map '%s': conflicting value size %u != 4.\n", + map_name, map_def->value_size); + return -EINVAL; + } + map_def->value_size = 4; + t = btf__type_by_id(btf, m->type); + if (!t) { + pr_warn("map '%s': %s type [%d] not found.\n", + map_name, desc, m->type); + return -EINVAL; + } + if (!btf_is_array(t) || btf_array(t)->nelems) { + pr_warn("map '%s': %s spec is not a zero-sized array.\n", + map_name, desc); + return -EINVAL; + } + t = skip_mods_and_typedefs(btf, btf_array(t)->type, NULL); + if (!btf_is_ptr(t)) { + pr_warn("map '%s': %s def is of unexpected kind %s.\n", + map_name, desc, btf_kind_str(t)); + return -EINVAL; + } + t = skip_mods_and_typedefs(btf, t->type, NULL); + if (is_prog_array) { + if (!btf_is_func_proto(t)) { + pr_warn("map '%s': prog-array value def is of unexpected kind %s.\n", + map_name, btf_kind_str(t)); + return -EINVAL; + } + continue; + } + if (!btf_is_struct(t)) { + pr_warn("map '%s': map-in-map inner def is of unexpected kind %s.\n", + map_name, btf_kind_str(t)); + return -EINVAL; + } + + snprintf(inner_map_name, sizeof(inner_map_name), "%s.inner", map_name); + err = parse_btf_map_def(inner_map_name, btf, t, strict, inner_def, NULL); + if (err) + return err; + + map_def->parts |= MAP_DEF_INNER_MAP; + } else if (strcmp(name, "pinning") == 0) { + __u32 val; + + if (is_inner) { + pr_warn("map '%s': inner def can't be pinned.\n", map_name); + return -EINVAL; + } + if (!get_map_field_int(map_name, btf, m, &val)) + return -EINVAL; + if (val != LIBBPF_PIN_NONE && val != LIBBPF_PIN_BY_NAME) { + pr_warn("map '%s': invalid pinning value %u.\n", + map_name, val); + return -EINVAL; + } + map_def->pinning = val; + map_def->parts |= MAP_DEF_PINNING; + } else if (strcmp(name, "map_extra") == 0) { + __u32 map_extra; + + if (!get_map_field_int(map_name, btf, m, &map_extra)) + return -EINVAL; + map_def->map_extra = map_extra; + map_def->parts |= MAP_DEF_MAP_EXTRA; + } else { + if (strict) { + pr_warn("map '%s': unknown field '%s'.\n", map_name, name); + return -ENOTSUP; + } + pr_debug("map '%s': ignoring unknown field '%s'.\n", map_name, name); + } + } + + if (map_def->map_type == BPF_MAP_TYPE_UNSPEC) { + pr_warn("map '%s': map type isn't specified.\n", map_name); + return -EINVAL; + } + + return 0; +} + +static size_t adjust_ringbuf_sz(size_t sz) +{ + __u32 page_sz = sysconf(_SC_PAGE_SIZE); + __u32 mul; + + /* if user forgot to set any size, make sure they see error */ + if (sz == 0) + return 0; + /* Kernel expects BPF_MAP_TYPE_RINGBUF's max_entries to be + * a power-of-2 multiple of kernel's page size. If user diligently + * satisified these conditions, pass the size through. + */ + if ((sz % page_sz) == 0 && is_pow_of_2(sz / page_sz)) + return sz; + + /* Otherwise find closest (page_sz * power_of_2) product bigger than + * user-set size to satisfy both user size request and kernel + * requirements and substitute correct max_entries for map creation. + */ + for (mul = 1; mul <= UINT_MAX / page_sz; mul <<= 1) { + if (mul * page_sz > sz) + return mul * page_sz; + } + + /* if it's impossible to satisfy the conditions (i.e., user size is + * very close to UINT_MAX but is not a power-of-2 multiple of + * page_size) then just return original size and let kernel reject it + */ + return sz; +} + +static bool map_is_ringbuf(const struct bpf_map *map) +{ + return map->def.type == BPF_MAP_TYPE_RINGBUF || + map->def.type == BPF_MAP_TYPE_USER_RINGBUF; +} + +static void fill_map_from_def(struct bpf_map *map, const struct btf_map_def *def) +{ + map->def.type = def->map_type; + map->def.key_size = def->key_size; + map->def.value_size = def->value_size; + map->def.max_entries = def->max_entries; + map->def.map_flags = def->map_flags; + map->map_extra = def->map_extra; + + map->numa_node = def->numa_node; + map->btf_key_type_id = def->key_type_id; + map->btf_value_type_id = def->value_type_id; + + /* auto-adjust BPF ringbuf map max_entries to be a multiple of page size */ + if (map_is_ringbuf(map)) + map->def.max_entries = adjust_ringbuf_sz(map->def.max_entries); + + if (def->parts & MAP_DEF_MAP_TYPE) + pr_debug("map '%s': found type = %u.\n", map->name, def->map_type); + + if (def->parts & MAP_DEF_KEY_TYPE) + pr_debug("map '%s': found key [%u], sz = %u.\n", + map->name, def->key_type_id, def->key_size); + else if (def->parts & MAP_DEF_KEY_SIZE) + pr_debug("map '%s': found key_size = %u.\n", map->name, def->key_size); + + if (def->parts & MAP_DEF_VALUE_TYPE) + pr_debug("map '%s': found value [%u], sz = %u.\n", + map->name, def->value_type_id, def->value_size); + else if (def->parts & MAP_DEF_VALUE_SIZE) + pr_debug("map '%s': found value_size = %u.\n", map->name, def->value_size); + + if (def->parts & MAP_DEF_MAX_ENTRIES) + pr_debug("map '%s': found max_entries = %u.\n", map->name, def->max_entries); + if (def->parts & MAP_DEF_MAP_FLAGS) + pr_debug("map '%s': found map_flags = 0x%x.\n", map->name, def->map_flags); + if (def->parts & MAP_DEF_MAP_EXTRA) + pr_debug("map '%s': found map_extra = 0x%llx.\n", map->name, + (unsigned long long)def->map_extra); + if (def->parts & MAP_DEF_PINNING) + pr_debug("map '%s': found pinning = %u.\n", map->name, def->pinning); + if (def->parts & MAP_DEF_NUMA_NODE) + pr_debug("map '%s': found numa_node = %u.\n", map->name, def->numa_node); + + if (def->parts & MAP_DEF_INNER_MAP) + pr_debug("map '%s': found inner map definition.\n", map->name); +} + +static const char *btf_var_linkage_str(__u32 linkage) +{ + switch (linkage) { + case BTF_VAR_STATIC: return "static"; + case BTF_VAR_GLOBAL_ALLOCATED: return "global"; + case BTF_VAR_GLOBAL_EXTERN: return "extern"; + default: return "unknown"; + } +} + +static int bpf_object__init_user_btf_map(struct bpf_object *obj, + const struct btf_type *sec, + int var_idx, int sec_idx, + const Elf_Data *data, bool strict, + const char *pin_root_path) +{ + struct btf_map_def map_def = {}, inner_def = {}; + const struct btf_type *var, *def; + const struct btf_var_secinfo *vi; + const struct btf_var *var_extra; + const char *map_name; + struct bpf_map *map; + int err; + + vi = btf_var_secinfos(sec) + var_idx; + var = btf__type_by_id(obj->btf, vi->type); + var_extra = btf_var(var); + map_name = btf__name_by_offset(obj->btf, var->name_off); + + if (map_name == NULL || map_name[0] == '\0') { + pr_warn("map #%d: empty name.\n", var_idx); + return -EINVAL; + } + if ((__u64)vi->offset + vi->size > data->d_size) { + pr_warn("map '%s' BTF data is corrupted.\n", map_name); + return -EINVAL; + } + if (!btf_is_var(var)) { + pr_warn("map '%s': unexpected var kind %s.\n", + map_name, btf_kind_str(var)); + return -EINVAL; + } + if (var_extra->linkage != BTF_VAR_GLOBAL_ALLOCATED) { + pr_warn("map '%s': unsupported map linkage %s.\n", + map_name, btf_var_linkage_str(var_extra->linkage)); + return -EOPNOTSUPP; + } + + def = skip_mods_and_typedefs(obj->btf, var->type, NULL); + if (!btf_is_struct(def)) { + pr_warn("map '%s': unexpected def kind %s.\n", + map_name, btf_kind_str(var)); + return -EINVAL; + } + if (def->size > vi->size) { + pr_warn("map '%s': invalid def size.\n", map_name); + return -EINVAL; + } + + map = bpf_object__add_map(obj); + if (IS_ERR(map)) + return PTR_ERR(map); + map->name = strdup(map_name); + if (!map->name) { + pr_warn("map '%s': failed to alloc map name.\n", map_name); + return -ENOMEM; + } + map->libbpf_type = LIBBPF_MAP_UNSPEC; + map->def.type = BPF_MAP_TYPE_UNSPEC; + map->sec_idx = sec_idx; + map->sec_offset = vi->offset; + map->btf_var_idx = var_idx; + pr_debug("map '%s': at sec_idx %d, offset %zu.\n", + map_name, map->sec_idx, map->sec_offset); + + err = parse_btf_map_def(map->name, obj->btf, def, strict, &map_def, &inner_def); + if (err) + return err; + + fill_map_from_def(map, &map_def); + + if (map_def.pinning == LIBBPF_PIN_BY_NAME) { + err = build_map_pin_path(map, pin_root_path); + if (err) { + pr_warn("map '%s': couldn't build pin path.\n", map->name); + return err; + } + } + + if (map_def.parts & MAP_DEF_INNER_MAP) { + map->inner_map = calloc(1, sizeof(*map->inner_map)); + if (!map->inner_map) + return -ENOMEM; + map->inner_map->fd = -1; + map->inner_map->sec_idx = sec_idx; + map->inner_map->name = malloc(strlen(map_name) + sizeof(".inner") + 1); + if (!map->inner_map->name) + return -ENOMEM; + sprintf(map->inner_map->name, "%s.inner", map_name); + + fill_map_from_def(map->inner_map, &inner_def); + } + + err = map_fill_btf_type_info(obj, map); + if (err) + return err; + + return 0; +} + +static int bpf_object__init_user_btf_maps(struct bpf_object *obj, bool strict, + const char *pin_root_path) +{ + const struct btf_type *sec = NULL; + int nr_types, i, vlen, err; + const struct btf_type *t; + const char *name; + Elf_Data *data; + Elf_Scn *scn; + + if (obj->efile.btf_maps_shndx < 0) + return 0; + + scn = elf_sec_by_idx(obj, obj->efile.btf_maps_shndx); + data = elf_sec_data(obj, scn); + if (!scn || !data) { + pr_warn("elf: failed to get %s map definitions for %s\n", + MAPS_ELF_SEC, obj->path); + return -EINVAL; + } + + nr_types = btf__type_cnt(obj->btf); + for (i = 1; i < nr_types; i++) { + t = btf__type_by_id(obj->btf, i); + if (!btf_is_datasec(t)) + continue; + name = btf__name_by_offset(obj->btf, t->name_off); + if (strcmp(name, MAPS_ELF_SEC) == 0) { + sec = t; + obj->efile.btf_maps_sec_btf_id = i; + break; + } + } + + if (!sec) { + pr_warn("DATASEC '%s' not found.\n", MAPS_ELF_SEC); + return -ENOENT; + } + + vlen = btf_vlen(sec); + for (i = 0; i < vlen; i++) { + err = bpf_object__init_user_btf_map(obj, sec, i, + obj->efile.btf_maps_shndx, + data, strict, + pin_root_path); + if (err) + return err; + } + + return 0; +} + +static int bpf_object__init_maps(struct bpf_object *obj, + const struct bpf_object_open_opts *opts) +{ + const char *pin_root_path; + bool strict; + int err = 0; + + strict = !OPTS_GET(opts, relaxed_maps, false); + pin_root_path = OPTS_GET(opts, pin_root_path, NULL); + + err = err ?: bpf_object__init_user_btf_maps(obj, strict, pin_root_path); + err = err ?: bpf_object__init_global_data_maps(obj); + err = err ?: bpf_object__init_kconfig_map(obj); + err = err ?: bpf_object__init_struct_ops_maps(obj); + + return err; +} + +static bool section_have_execinstr(struct bpf_object *obj, int idx) +{ + Elf64_Shdr *sh; + + sh = elf_sec_hdr(obj, elf_sec_by_idx(obj, idx)); + if (!sh) + return false; + + return sh->sh_flags & SHF_EXECINSTR; +} + +static bool btf_needs_sanitization(struct bpf_object *obj) +{ + bool has_func_global = kernel_supports(obj, FEAT_BTF_GLOBAL_FUNC); + bool has_datasec = kernel_supports(obj, FEAT_BTF_DATASEC); + bool has_float = kernel_supports(obj, FEAT_BTF_FLOAT); + bool has_func = kernel_supports(obj, FEAT_BTF_FUNC); + bool has_decl_tag = kernel_supports(obj, FEAT_BTF_DECL_TAG); + bool has_type_tag = kernel_supports(obj, FEAT_BTF_TYPE_TAG); + bool has_enum64 = kernel_supports(obj, FEAT_BTF_ENUM64); + + return !has_func || !has_datasec || !has_func_global || !has_float || + !has_decl_tag || !has_type_tag || !has_enum64; +} + +static int bpf_object__sanitize_btf(struct bpf_object *obj, struct btf *btf) +{ + bool has_func_global = kernel_supports(obj, FEAT_BTF_GLOBAL_FUNC); + bool has_datasec = kernel_supports(obj, FEAT_BTF_DATASEC); + bool has_float = kernel_supports(obj, FEAT_BTF_FLOAT); + bool has_func = kernel_supports(obj, FEAT_BTF_FUNC); + bool has_decl_tag = kernel_supports(obj, FEAT_BTF_DECL_TAG); + bool has_type_tag = kernel_supports(obj, FEAT_BTF_TYPE_TAG); + bool has_enum64 = kernel_supports(obj, FEAT_BTF_ENUM64); + int enum64_placeholder_id = 0; + struct btf_type *t; + int i, j, vlen; + + for (i = 1; i < btf__type_cnt(btf); i++) { + t = (struct btf_type *)btf__type_by_id(btf, i); + + if ((!has_datasec && btf_is_var(t)) || (!has_decl_tag && btf_is_decl_tag(t))) { + /* replace VAR/DECL_TAG with INT */ + t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0); + /* + * using size = 1 is the safest choice, 4 will be too + * big and cause kernel BTF validation failure if + * original variable took less than 4 bytes + */ + t->size = 1; + *(int *)(t + 1) = BTF_INT_ENC(0, 0, 8); + } else if (!has_datasec && btf_is_datasec(t)) { + /* replace DATASEC with STRUCT */ + const struct btf_var_secinfo *v = btf_var_secinfos(t); + struct btf_member *m = btf_members(t); + struct btf_type *vt; + char *name; + + name = (char *)btf__name_by_offset(btf, t->name_off); + while (*name) { + if (*name == '.') + *name = '_'; + name++; + } + + vlen = btf_vlen(t); + t->info = BTF_INFO_ENC(BTF_KIND_STRUCT, 0, vlen); + for (j = 0; j < vlen; j++, v++, m++) { + /* order of field assignments is important */ + m->offset = v->offset * 8; + m->type = v->type; + /* preserve variable name as member name */ + vt = (void *)btf__type_by_id(btf, v->type); + m->name_off = vt->name_off; + } + } else if (!has_func && btf_is_func_proto(t)) { + /* replace FUNC_PROTO with ENUM */ + vlen = btf_vlen(t); + t->info = BTF_INFO_ENC(BTF_KIND_ENUM, 0, vlen); + t->size = sizeof(__u32); /* kernel enforced */ + } else if (!has_func && btf_is_func(t)) { + /* replace FUNC with TYPEDEF */ + t->info = BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0); + } else if (!has_func_global && btf_is_func(t)) { + /* replace BTF_FUNC_GLOBAL with BTF_FUNC_STATIC */ + t->info = BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0); + } else if (!has_float && btf_is_float(t)) { + /* replace FLOAT with an equally-sized empty STRUCT; + * since C compilers do not accept e.g. "float" as a + * valid struct name, make it anonymous + */ + t->name_off = 0; + t->info = BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 0); + } else if (!has_type_tag && btf_is_type_tag(t)) { + /* replace TYPE_TAG with a CONST */ + t->name_off = 0; + t->info = BTF_INFO_ENC(BTF_KIND_CONST, 0, 0); + } else if (!has_enum64 && btf_is_enum(t)) { + /* clear the kflag */ + t->info = btf_type_info(btf_kind(t), btf_vlen(t), false); + } else if (!has_enum64 && btf_is_enum64(t)) { + /* replace ENUM64 with a union */ + struct btf_member *m; + + if (enum64_placeholder_id == 0) { + enum64_placeholder_id = btf__add_int(btf, "enum64_placeholder", 1, 0); + if (enum64_placeholder_id < 0) + return enum64_placeholder_id; + + t = (struct btf_type *)btf__type_by_id(btf, i); + } + + m = btf_members(t); + vlen = btf_vlen(t); + t->info = BTF_INFO_ENC(BTF_KIND_UNION, 0, vlen); + for (j = 0; j < vlen; j++, m++) { + m->type = enum64_placeholder_id; + m->offset = 0; + } + } + } + + return 0; +} + +static bool libbpf_needs_btf(const struct bpf_object *obj) +{ + return obj->efile.btf_maps_shndx >= 0 || + obj->efile.st_ops_shndx >= 0 || + obj->nr_extern > 0; +} + +static bool kernel_needs_btf(const struct bpf_object *obj) +{ + return obj->efile.st_ops_shndx >= 0; +} + +static int bpf_object__init_btf(struct bpf_object *obj, + Elf_Data *btf_data, + Elf_Data *btf_ext_data) +{ + int err = -ENOENT; + + if (btf_data) { + obj->btf = btf__new(btf_data->d_buf, btf_data->d_size); + err = libbpf_get_error(obj->btf); + if (err) { + obj->btf = NULL; + pr_warn("Error loading ELF section %s: %d.\n", BTF_ELF_SEC, err); + goto out; + } + /* enforce 8-byte pointers for BPF-targeted BTFs */ + btf__set_pointer_size(obj->btf, 8); + } + if (btf_ext_data) { + struct btf_ext_info *ext_segs[3]; + int seg_num, sec_num; + + if (!obj->btf) { + pr_debug("Ignore ELF section %s because its depending ELF section %s is not found.\n", + BTF_EXT_ELF_SEC, BTF_ELF_SEC); + goto out; + } + obj->btf_ext = btf_ext__new(btf_ext_data->d_buf, btf_ext_data->d_size); + err = libbpf_get_error(obj->btf_ext); + if (err) { + pr_warn("Error loading ELF section %s: %d. Ignored and continue.\n", + BTF_EXT_ELF_SEC, err); + obj->btf_ext = NULL; + goto out; + } + + /* setup .BTF.ext to ELF section mapping */ + ext_segs[0] = &obj->btf_ext->func_info; + ext_segs[1] = &obj->btf_ext->line_info; + ext_segs[2] = &obj->btf_ext->core_relo_info; + for (seg_num = 0; seg_num < ARRAY_SIZE(ext_segs); seg_num++) { + struct btf_ext_info *seg = ext_segs[seg_num]; + const struct btf_ext_info_sec *sec; + const char *sec_name; + Elf_Scn *scn; + + if (seg->sec_cnt == 0) + continue; + + seg->sec_idxs = calloc(seg->sec_cnt, sizeof(*seg->sec_idxs)); + if (!seg->sec_idxs) { + err = -ENOMEM; + goto out; + } + + sec_num = 0; + for_each_btf_ext_sec(seg, sec) { + /* preventively increment index to avoid doing + * this before every continue below + */ + sec_num++; + + sec_name = btf__name_by_offset(obj->btf, sec->sec_name_off); + if (str_is_empty(sec_name)) + continue; + scn = elf_sec_by_name(obj, sec_name); + if (!scn) + continue; + + seg->sec_idxs[sec_num - 1] = elf_ndxscn(scn); + } + } + } +out: + if (err && libbpf_needs_btf(obj)) { + pr_warn("BTF is required, but is missing or corrupted.\n"); + return err; + } + return 0; +} + +static int compare_vsi_off(const void *_a, const void *_b) +{ + const struct btf_var_secinfo *a = _a; + const struct btf_var_secinfo *b = _b; + + return a->offset - b->offset; +} + +static int btf_fixup_datasec(struct bpf_object *obj, struct btf *btf, + struct btf_type *t) +{ + __u32 size = 0, i, vars = btf_vlen(t); + const char *sec_name = btf__name_by_offset(btf, t->name_off); + struct btf_var_secinfo *vsi; + bool fixup_offsets = false; + int err; + + if (!sec_name) { + pr_debug("No name found in string section for DATASEC kind.\n"); + return -ENOENT; + } + + /* Extern-backing datasecs (.ksyms, .kconfig) have their size and + * variable offsets set at the previous step. Further, not every + * extern BTF VAR has corresponding ELF symbol preserved, so we skip + * all fixups altogether for such sections and go straight to sorting + * VARs within their DATASEC. + */ + if (strcmp(sec_name, KCONFIG_SEC) == 0 || strcmp(sec_name, KSYMS_SEC) == 0) + goto sort_vars; + + /* Clang leaves DATASEC size and VAR offsets as zeroes, so we need to + * fix this up. But BPF static linker already fixes this up and fills + * all the sizes and offsets during static linking. So this step has + * to be optional. But the STV_HIDDEN handling is non-optional for any + * non-extern DATASEC, so the variable fixup loop below handles both + * functions at the same time, paying the cost of BTF VAR <-> ELF + * symbol matching just once. + */ + if (t->size == 0) { + err = find_elf_sec_sz(obj, sec_name, &size); + if (err || !size) { + pr_debug("sec '%s': failed to determine size from ELF: size %u, err %d\n", + sec_name, size, err); + return -ENOENT; + } + + t->size = size; + fixup_offsets = true; + } + + for (i = 0, vsi = btf_var_secinfos(t); i < vars; i++, vsi++) { + const struct btf_type *t_var; + struct btf_var *var; + const char *var_name; + Elf64_Sym *sym; + + t_var = btf__type_by_id(btf, vsi->type); + if (!t_var || !btf_is_var(t_var)) { + pr_debug("sec '%s': unexpected non-VAR type found\n", sec_name); + return -EINVAL; + } + + var = btf_var(t_var); + if (var->linkage == BTF_VAR_STATIC || var->linkage == BTF_VAR_GLOBAL_EXTERN) + continue; + + var_name = btf__name_by_offset(btf, t_var->name_off); + if (!var_name) { + pr_debug("sec '%s': failed to find name of DATASEC's member #%d\n", + sec_name, i); + return -ENOENT; + } + + sym = find_elf_var_sym(obj, var_name); + if (IS_ERR(sym)) { + pr_debug("sec '%s': failed to find ELF symbol for VAR '%s'\n", + sec_name, var_name); + return -ENOENT; + } + + if (fixup_offsets) + vsi->offset = sym->st_value; + + /* if variable is a global/weak symbol, but has restricted + * (STV_HIDDEN or STV_INTERNAL) visibility, mark its BTF VAR + * as static. This follows similar logic for functions (BPF + * subprogs) and influences libbpf's further decisions about + * whether to make global data BPF array maps as + * BPF_F_MMAPABLE. + */ + if (ELF64_ST_VISIBILITY(sym->st_other) == STV_HIDDEN + || ELF64_ST_VISIBILITY(sym->st_other) == STV_INTERNAL) + var->linkage = BTF_VAR_STATIC; + } + +sort_vars: + qsort(btf_var_secinfos(t), vars, sizeof(*vsi), compare_vsi_off); + return 0; +} + +static int bpf_object_fixup_btf(struct bpf_object *obj) +{ + int i, n, err = 0; + + if (!obj->btf) + return 0; + + n = btf__type_cnt(obj->btf); + for (i = 1; i < n; i++) { + struct btf_type *t = btf_type_by_id(obj->btf, i); + + /* Loader needs to fix up some of the things compiler + * couldn't get its hands on while emitting BTF. This + * is section size and global variable offset. We use + * the info from the ELF itself for this purpose. + */ + if (btf_is_datasec(t)) { + err = btf_fixup_datasec(obj, obj->btf, t); + if (err) + return err; + } + } + + return 0; +} + +static bool prog_needs_vmlinux_btf(struct bpf_program *prog) +{ + if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || + prog->type == BPF_PROG_TYPE_LSM) + return true; + + /* BPF_PROG_TYPE_TRACING programs which do not attach to other programs + * also need vmlinux BTF + */ + if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd) + return true; + + return false; +} + +static bool obj_needs_vmlinux_btf(const struct bpf_object *obj) +{ + struct bpf_program *prog; + int i; + + /* CO-RE relocations need kernel BTF, only when btf_custom_path + * is not specified + */ + if (obj->btf_ext && obj->btf_ext->core_relo_info.len && !obj->btf_custom_path) + return true; + + /* Support for typed ksyms needs kernel BTF */ + for (i = 0; i < obj->nr_extern; i++) { + const struct extern_desc *ext; + + ext = &obj->externs[i]; + if (ext->type == EXT_KSYM && ext->ksym.type_id) + return true; + } + + bpf_object__for_each_program(prog, obj) { + if (!prog->autoload) + continue; + if (prog_needs_vmlinux_btf(prog)) + return true; + } + + return false; +} + +static int bpf_object__load_vmlinux_btf(struct bpf_object *obj, bool force) +{ + int err; + + /* btf_vmlinux could be loaded earlier */ + if (obj->btf_vmlinux || obj->gen_loader) + return 0; + + if (!force && !obj_needs_vmlinux_btf(obj)) + return 0; + + obj->btf_vmlinux = btf__load_vmlinux_btf(); + err = libbpf_get_error(obj->btf_vmlinux); + if (err) { + pr_warn("Error loading vmlinux BTF: %d\n", err); + obj->btf_vmlinux = NULL; + return err; + } + return 0; +} + +static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj) +{ + struct btf *kern_btf = obj->btf; + bool btf_mandatory, sanitize; + int i, err = 0; + + if (!obj->btf) + return 0; + + if (!kernel_supports(obj, FEAT_BTF)) { + if (kernel_needs_btf(obj)) { + err = -EOPNOTSUPP; + goto report; + } + pr_debug("Kernel doesn't support BTF, skipping uploading it.\n"); + return 0; + } + + /* Even though some subprogs are global/weak, user might prefer more + * permissive BPF verification process that BPF verifier performs for + * static functions, taking into account more context from the caller + * functions. In such case, they need to mark such subprogs with + * __attribute__((visibility("hidden"))) and libbpf will adjust + * corresponding FUNC BTF type to be marked as static and trigger more + * involved BPF verification process. + */ + for (i = 0; i < obj->nr_programs; i++) { + struct bpf_program *prog = &obj->programs[i]; + struct btf_type *t; + const char *name; + int j, n; + + if (!prog->mark_btf_static || !prog_is_subprog(obj, prog)) + continue; + + n = btf__type_cnt(obj->btf); + for (j = 1; j < n; j++) { + t = btf_type_by_id(obj->btf, j); + if (!btf_is_func(t) || btf_func_linkage(t) != BTF_FUNC_GLOBAL) + continue; + + name = btf__str_by_offset(obj->btf, t->name_off); + if (strcmp(name, prog->name) != 0) + continue; + + t->info = btf_type_info(BTF_KIND_FUNC, BTF_FUNC_STATIC, 0); + break; + } + } + + sanitize = btf_needs_sanitization(obj); + if (sanitize) { + const void *raw_data; + __u32 sz; + + /* clone BTF to sanitize a copy and leave the original intact */ + raw_data = btf__raw_data(obj->btf, &sz); + kern_btf = btf__new(raw_data, sz); + err = libbpf_get_error(kern_btf); + if (err) + return err; + + /* enforce 8-byte pointers for BPF-targeted BTFs */ + btf__set_pointer_size(obj->btf, 8); + err = bpf_object__sanitize_btf(obj, kern_btf); + if (err) + return err; + } + + if (obj->gen_loader) { + __u32 raw_size = 0; + const void *raw_data = btf__raw_data(kern_btf, &raw_size); + + if (!raw_data) + return -ENOMEM; + bpf_gen__load_btf(obj->gen_loader, raw_data, raw_size); + /* Pretend to have valid FD to pass various fd >= 0 checks. + * This fd == 0 will not be used with any syscall and will be reset to -1 eventually. + */ + btf__set_fd(kern_btf, 0); + } else { + /* currently BPF_BTF_LOAD only supports log_level 1 */ + err = btf_load_into_kernel(kern_btf, obj->log_buf, obj->log_size, + obj->log_level ? 1 : 0); + } + if (sanitize) { + if (!err) { + /* move fd to libbpf's BTF */ + btf__set_fd(obj->btf, btf__fd(kern_btf)); + btf__set_fd(kern_btf, -1); + } + btf__free(kern_btf); + } +report: + if (err) { + btf_mandatory = kernel_needs_btf(obj); + pr_warn("Error loading .BTF into kernel: %d. %s\n", err, + btf_mandatory ? "BTF is mandatory, can't proceed." + : "BTF is optional, ignoring."); + if (!btf_mandatory) + err = 0; + } + return err; +} + +static const char *elf_sym_str(const struct bpf_object *obj, size_t off) +{ + const char *name; + + name = elf_strptr(obj->efile.elf, obj->efile.strtabidx, off); + if (!name) { + pr_warn("elf: failed to get section name string at offset %zu from %s: %s\n", + off, obj->path, elf_errmsg(-1)); + return NULL; + } + + return name; +} + +static const char *elf_sec_str(const struct bpf_object *obj, size_t off) +{ + const char *name; + + name = elf_strptr(obj->efile.elf, obj->efile.shstrndx, off); + if (!name) { + pr_warn("elf: failed to get section name string at offset %zu from %s: %s\n", + off, obj->path, elf_errmsg(-1)); + return NULL; + } + + return name; +} + +static Elf_Scn *elf_sec_by_idx(const struct bpf_object *obj, size_t idx) +{ + Elf_Scn *scn; + + scn = elf_getscn(obj->efile.elf, idx); + if (!scn) { + pr_warn("elf: failed to get section(%zu) from %s: %s\n", + idx, obj->path, elf_errmsg(-1)); + return NULL; + } + return scn; +} + +static Elf_Scn *elf_sec_by_name(const struct bpf_object *obj, const char *name) +{ + Elf_Scn *scn = NULL; + Elf *elf = obj->efile.elf; + const char *sec_name; + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + sec_name = elf_sec_name(obj, scn); + if (!sec_name) + return NULL; + + if (strcmp(sec_name, name) != 0) + continue; + + return scn; + } + return NULL; +} + +static Elf64_Shdr *elf_sec_hdr(const struct bpf_object *obj, Elf_Scn *scn) +{ + Elf64_Shdr *shdr; + + if (!scn) + return NULL; + + shdr = elf64_getshdr(scn); + if (!shdr) { + pr_warn("elf: failed to get section(%zu) header from %s: %s\n", + elf_ndxscn(scn), obj->path, elf_errmsg(-1)); + return NULL; + } + + return shdr; +} + +static const char *elf_sec_name(const struct bpf_object *obj, Elf_Scn *scn) +{ + const char *name; + Elf64_Shdr *sh; + + if (!scn) + return NULL; + + sh = elf_sec_hdr(obj, scn); + if (!sh) + return NULL; + + name = elf_sec_str(obj, sh->sh_name); + if (!name) { + pr_warn("elf: failed to get section(%zu) name from %s: %s\n", + elf_ndxscn(scn), obj->path, elf_errmsg(-1)); + return NULL; + } + + return name; +} + +static Elf_Data *elf_sec_data(const struct bpf_object *obj, Elf_Scn *scn) +{ + Elf_Data *data; + + if (!scn) + return NULL; + + data = elf_getdata(scn, 0); + if (!data) { + pr_warn("elf: failed to get section(%zu) %s data from %s: %s\n", + elf_ndxscn(scn), elf_sec_name(obj, scn) ?: "", + obj->path, elf_errmsg(-1)); + return NULL; + } + + return data; +} + +static Elf64_Sym *elf_sym_by_idx(const struct bpf_object *obj, size_t idx) +{ + if (idx >= obj->efile.symbols->d_size / sizeof(Elf64_Sym)) + return NULL; + + return (Elf64_Sym *)obj->efile.symbols->d_buf + idx; +} + +static Elf64_Rel *elf_rel_by_idx(Elf_Data *data, size_t idx) +{ + if (idx >= data->d_size / sizeof(Elf64_Rel)) + return NULL; + + return (Elf64_Rel *)data->d_buf + idx; +} + +static bool is_sec_name_dwarf(const char *name) +{ + /* approximation, but the actual list is too long */ + return str_has_pfx(name, ".debug_"); +} + +static bool ignore_elf_section(Elf64_Shdr *hdr, const char *name) +{ + /* no special handling of .strtab */ + if (hdr->sh_type == SHT_STRTAB) + return true; + + /* ignore .llvm_addrsig section as well */ + if (hdr->sh_type == SHT_LLVM_ADDRSIG) + return true; + + /* no subprograms will lead to an empty .text section, ignore it */ + if (hdr->sh_type == SHT_PROGBITS && hdr->sh_size == 0 && + strcmp(name, ".text") == 0) + return true; + + /* DWARF sections */ + if (is_sec_name_dwarf(name)) + return true; + + if (str_has_pfx(name, ".rel")) { + name += sizeof(".rel") - 1; + /* DWARF section relocations */ + if (is_sec_name_dwarf(name)) + return true; + + /* .BTF and .BTF.ext don't need relocations */ + if (strcmp(name, BTF_ELF_SEC) == 0 || + strcmp(name, BTF_EXT_ELF_SEC) == 0) + return true; + } + + return false; +} + +static int cmp_progs(const void *_a, const void *_b) +{ + const struct bpf_program *a = _a; + const struct bpf_program *b = _b; + + if (a->sec_idx != b->sec_idx) + return a->sec_idx < b->sec_idx ? -1 : 1; + + /* sec_insn_off can't be the same within the section */ + return a->sec_insn_off < b->sec_insn_off ? -1 : 1; +} + +static int bpf_object__elf_collect(struct bpf_object *obj) +{ + struct elf_sec_desc *sec_desc; + Elf *elf = obj->efile.elf; + Elf_Data *btf_ext_data = NULL; + Elf_Data *btf_data = NULL; + int idx = 0, err = 0; + const char *name; + Elf_Data *data; + Elf_Scn *scn; + Elf64_Shdr *sh; + + /* ELF section indices are 0-based, but sec #0 is special "invalid" + * section. Since section count retrieved by elf_getshdrnum() does + * include sec #0, it is already the necessary size of an array to keep + * all the sections. + */ + if (elf_getshdrnum(obj->efile.elf, &obj->efile.sec_cnt)) { + pr_warn("elf: failed to get the number of sections for %s: %s\n", + obj->path, elf_errmsg(-1)); + return -LIBBPF_ERRNO__FORMAT; + } + obj->efile.secs = calloc(obj->efile.sec_cnt, sizeof(*obj->efile.secs)); + if (!obj->efile.secs) + return -ENOMEM; + + /* a bunch of ELF parsing functionality depends on processing symbols, + * so do the first pass and find the symbol table + */ + scn = NULL; + while ((scn = elf_nextscn(elf, scn)) != NULL) { + sh = elf_sec_hdr(obj, scn); + if (!sh) + return -LIBBPF_ERRNO__FORMAT; + + if (sh->sh_type == SHT_SYMTAB) { + if (obj->efile.symbols) { + pr_warn("elf: multiple symbol tables in %s\n", obj->path); + return -LIBBPF_ERRNO__FORMAT; + } + + data = elf_sec_data(obj, scn); + if (!data) + return -LIBBPF_ERRNO__FORMAT; + + idx = elf_ndxscn(scn); + + obj->efile.symbols = data; + obj->efile.symbols_shndx = idx; + obj->efile.strtabidx = sh->sh_link; + } + } + + if (!obj->efile.symbols) { + pr_warn("elf: couldn't find symbol table in %s, stripped object file?\n", + obj->path); + return -ENOENT; + } + + scn = NULL; + while ((scn = elf_nextscn(elf, scn)) != NULL) { + idx = elf_ndxscn(scn); + sec_desc = &obj->efile.secs[idx]; + + sh = elf_sec_hdr(obj, scn); + if (!sh) + return -LIBBPF_ERRNO__FORMAT; + + name = elf_sec_str(obj, sh->sh_name); + if (!name) + return -LIBBPF_ERRNO__FORMAT; + + if (ignore_elf_section(sh, name)) + continue; + + data = elf_sec_data(obj, scn); + if (!data) + return -LIBBPF_ERRNO__FORMAT; + + pr_debug("elf: section(%d) %s, size %ld, link %d, flags %lx, type=%d\n", + idx, name, (unsigned long)data->d_size, + (int)sh->sh_link, (unsigned long)sh->sh_flags, + (int)sh->sh_type); + + if (strcmp(name, "license") == 0) { + err = bpf_object__init_license(obj, data->d_buf, data->d_size); + if (err) + return err; + } else if (strcmp(name, "version") == 0) { + err = bpf_object__init_kversion(obj, data->d_buf, data->d_size); + if (err) + return err; + } else if (strcmp(name, "maps") == 0) { + pr_warn("elf: legacy map definitions in 'maps' section are not supported by libbpf v1.0+\n"); + return -ENOTSUP; + } else if (strcmp(name, MAPS_ELF_SEC) == 0) { + obj->efile.btf_maps_shndx = idx; + } else if (strcmp(name, BTF_ELF_SEC) == 0) { + if (sh->sh_type != SHT_PROGBITS) + return -LIBBPF_ERRNO__FORMAT; + btf_data = data; + } else if (strcmp(name, BTF_EXT_ELF_SEC) == 0) { + if (sh->sh_type != SHT_PROGBITS) + return -LIBBPF_ERRNO__FORMAT; + btf_ext_data = data; + } else if (sh->sh_type == SHT_SYMTAB) { + /* already processed during the first pass above */ + } else if (sh->sh_type == SHT_PROGBITS && data->d_size > 0) { + if (sh->sh_flags & SHF_EXECINSTR) { + if (strcmp(name, ".text") == 0) + obj->efile.text_shndx = idx; + err = bpf_object__add_programs(obj, data, name, idx); + if (err) + return err; + } else if (strcmp(name, DATA_SEC) == 0 || + str_has_pfx(name, DATA_SEC ".")) { + sec_desc->sec_type = SEC_DATA; + sec_desc->shdr = sh; + sec_desc->data = data; + } else if (strcmp(name, RODATA_SEC) == 0 || + str_has_pfx(name, RODATA_SEC ".")) { + sec_desc->sec_type = SEC_RODATA; + sec_desc->shdr = sh; + sec_desc->data = data; + } else if (strcmp(name, STRUCT_OPS_SEC) == 0) { + obj->efile.st_ops_data = data; + obj->efile.st_ops_shndx = idx; + } else { + pr_info("elf: skipping unrecognized data section(%d) %s\n", + idx, name); + } + } else if (sh->sh_type == SHT_REL) { + int targ_sec_idx = sh->sh_info; /* points to other section */ + + if (sh->sh_entsize != sizeof(Elf64_Rel) || + targ_sec_idx >= obj->efile.sec_cnt) + return -LIBBPF_ERRNO__FORMAT; + + /* Only do relo for section with exec instructions */ + if (!section_have_execinstr(obj, targ_sec_idx) && + strcmp(name, ".rel" STRUCT_OPS_SEC) && + strcmp(name, ".rel" MAPS_ELF_SEC)) { + pr_info("elf: skipping relo section(%d) %s for section(%d) %s\n", + idx, name, targ_sec_idx, + elf_sec_name(obj, elf_sec_by_idx(obj, targ_sec_idx)) ?: ""); + continue; + } + + sec_desc->sec_type = SEC_RELO; + sec_desc->shdr = sh; + sec_desc->data = data; + } else if (sh->sh_type == SHT_NOBITS && (strcmp(name, BSS_SEC) == 0 || + str_has_pfx(name, BSS_SEC "."))) { + sec_desc->sec_type = SEC_BSS; + sec_desc->shdr = sh; + sec_desc->data = data; + } else { + pr_info("elf: skipping section(%d) %s (size %zu)\n", idx, name, + (size_t)sh->sh_size); + } + } + + if (!obj->efile.strtabidx || obj->efile.strtabidx > idx) { + pr_warn("elf: symbol strings section missing or invalid in %s\n", obj->path); + return -LIBBPF_ERRNO__FORMAT; + } + + /* sort BPF programs by section name and in-section instruction offset + * for faster search + */ + if (obj->nr_programs) + qsort(obj->programs, obj->nr_programs, sizeof(*obj->programs), cmp_progs); + + return bpf_object__init_btf(obj, btf_data, btf_ext_data); +} + +static bool sym_is_extern(const Elf64_Sym *sym) +{ + int bind = ELF64_ST_BIND(sym->st_info); + /* externs are symbols w/ type=NOTYPE, bind=GLOBAL|WEAK, section=UND */ + return sym->st_shndx == SHN_UNDEF && + (bind == STB_GLOBAL || bind == STB_WEAK) && + ELF64_ST_TYPE(sym->st_info) == STT_NOTYPE; +} + +static bool sym_is_subprog(const Elf64_Sym *sym, int text_shndx) +{ + int bind = ELF64_ST_BIND(sym->st_info); + int type = ELF64_ST_TYPE(sym->st_info); + + /* in .text section */ + if (sym->st_shndx != text_shndx) + return false; + + /* local function */ + if (bind == STB_LOCAL && type == STT_SECTION) + return true; + + /* global function */ + return bind == STB_GLOBAL && type == STT_FUNC; +} + +static int find_extern_btf_id(const struct btf *btf, const char *ext_name) +{ + const struct btf_type *t; + const char *tname; + int i, n; + + if (!btf) + return -ESRCH; + + n = btf__type_cnt(btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(btf, i); + + if (!btf_is_var(t) && !btf_is_func(t)) + continue; + + tname = btf__name_by_offset(btf, t->name_off); + if (strcmp(tname, ext_name)) + continue; + + if (btf_is_var(t) && + btf_var(t)->linkage != BTF_VAR_GLOBAL_EXTERN) + return -EINVAL; + + if (btf_is_func(t) && btf_func_linkage(t) != BTF_FUNC_EXTERN) + return -EINVAL; + + return i; + } + + return -ENOENT; +} + +static int find_extern_sec_btf_id(struct btf *btf, int ext_btf_id) { + const struct btf_var_secinfo *vs; + const struct btf_type *t; + int i, j, n; + + if (!btf) + return -ESRCH; + + n = btf__type_cnt(btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(btf, i); + + if (!btf_is_datasec(t)) + continue; + + vs = btf_var_secinfos(t); + for (j = 0; j < btf_vlen(t); j++, vs++) { + if (vs->type == ext_btf_id) + return i; + } + } + + return -ENOENT; +} + +static enum kcfg_type find_kcfg_type(const struct btf *btf, int id, + bool *is_signed) +{ + const struct btf_type *t; + const char *name; + + t = skip_mods_and_typedefs(btf, id, NULL); + name = btf__name_by_offset(btf, t->name_off); + + if (is_signed) + *is_signed = false; + switch (btf_kind(t)) { + case BTF_KIND_INT: { + int enc = btf_int_encoding(t); + + if (enc & BTF_INT_BOOL) + return t->size == 1 ? KCFG_BOOL : KCFG_UNKNOWN; + if (is_signed) + *is_signed = enc & BTF_INT_SIGNED; + if (t->size == 1) + return KCFG_CHAR; + if (t->size < 1 || t->size > 8 || (t->size & (t->size - 1))) + return KCFG_UNKNOWN; + return KCFG_INT; + } + case BTF_KIND_ENUM: + if (t->size != 4) + return KCFG_UNKNOWN; + if (strcmp(name, "libbpf_tristate")) + return KCFG_UNKNOWN; + return KCFG_TRISTATE; + case BTF_KIND_ENUM64: + if (strcmp(name, "libbpf_tristate")) + return KCFG_UNKNOWN; + return KCFG_TRISTATE; + case BTF_KIND_ARRAY: + if (btf_array(t)->nelems == 0) + return KCFG_UNKNOWN; + if (find_kcfg_type(btf, btf_array(t)->type, NULL) != KCFG_CHAR) + return KCFG_UNKNOWN; + return KCFG_CHAR_ARR; + default: + return KCFG_UNKNOWN; + } +} + +static int cmp_externs(const void *_a, const void *_b) +{ + const struct extern_desc *a = _a; + const struct extern_desc *b = _b; + + if (a->type != b->type) + return a->type < b->type ? -1 : 1; + + if (a->type == EXT_KCFG) { + /* descending order by alignment requirements */ + if (a->kcfg.align != b->kcfg.align) + return a->kcfg.align > b->kcfg.align ? -1 : 1; + /* ascending order by size, within same alignment class */ + if (a->kcfg.sz != b->kcfg.sz) + return a->kcfg.sz < b->kcfg.sz ? -1 : 1; + } + + /* resolve ties by name */ + return strcmp(a->name, b->name); +} + +static int find_int_btf_id(const struct btf *btf) +{ + const struct btf_type *t; + int i, n; + + n = btf__type_cnt(btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(btf, i); + + if (btf_is_int(t) && btf_int_bits(t) == 32) + return i; + } + + return 0; +} + +static int add_dummy_ksym_var(struct btf *btf) +{ + int i, int_btf_id, sec_btf_id, dummy_var_btf_id; + const struct btf_var_secinfo *vs; + const struct btf_type *sec; + + if (!btf) + return 0; + + sec_btf_id = btf__find_by_name_kind(btf, KSYMS_SEC, + BTF_KIND_DATASEC); + if (sec_btf_id < 0) + return 0; + + sec = btf__type_by_id(btf, sec_btf_id); + vs = btf_var_secinfos(sec); + for (i = 0; i < btf_vlen(sec); i++, vs++) { + const struct btf_type *vt; + + vt = btf__type_by_id(btf, vs->type); + if (btf_is_func(vt)) + break; + } + + /* No func in ksyms sec. No need to add dummy var. */ + if (i == btf_vlen(sec)) + return 0; + + int_btf_id = find_int_btf_id(btf); + dummy_var_btf_id = btf__add_var(btf, + "dummy_ksym", + BTF_VAR_GLOBAL_ALLOCATED, + int_btf_id); + if (dummy_var_btf_id < 0) + pr_warn("cannot create a dummy_ksym var\n"); + + return dummy_var_btf_id; +} + +static int bpf_object__collect_externs(struct bpf_object *obj) +{ + struct btf_type *sec, *kcfg_sec = NULL, *ksym_sec = NULL; + const struct btf_type *t; + struct extern_desc *ext; + int i, n, off, dummy_var_btf_id; + const char *ext_name, *sec_name; + Elf_Scn *scn; + Elf64_Shdr *sh; + + if (!obj->efile.symbols) + return 0; + + scn = elf_sec_by_idx(obj, obj->efile.symbols_shndx); + sh = elf_sec_hdr(obj, scn); + if (!sh || sh->sh_entsize != sizeof(Elf64_Sym)) + return -LIBBPF_ERRNO__FORMAT; + + dummy_var_btf_id = add_dummy_ksym_var(obj->btf); + if (dummy_var_btf_id < 0) + return dummy_var_btf_id; + + n = sh->sh_size / sh->sh_entsize; + pr_debug("looking for externs among %d symbols...\n", n); + + for (i = 0; i < n; i++) { + Elf64_Sym *sym = elf_sym_by_idx(obj, i); + + if (!sym) + return -LIBBPF_ERRNO__FORMAT; + if (!sym_is_extern(sym)) + continue; + ext_name = elf_sym_str(obj, sym->st_name); + if (!ext_name || !ext_name[0]) + continue; + + ext = obj->externs; + ext = libbpf_reallocarray(ext, obj->nr_extern + 1, sizeof(*ext)); + if (!ext) + return -ENOMEM; + obj->externs = ext; + ext = &ext[obj->nr_extern]; + memset(ext, 0, sizeof(*ext)); + obj->nr_extern++; + + ext->btf_id = find_extern_btf_id(obj->btf, ext_name); + if (ext->btf_id <= 0) { + pr_warn("failed to find BTF for extern '%s': %d\n", + ext_name, ext->btf_id); + return ext->btf_id; + } + t = btf__type_by_id(obj->btf, ext->btf_id); + ext->name = btf__name_by_offset(obj->btf, t->name_off); + ext->sym_idx = i; + ext->is_weak = ELF64_ST_BIND(sym->st_info) == STB_WEAK; + + ext->sec_btf_id = find_extern_sec_btf_id(obj->btf, ext->btf_id); + if (ext->sec_btf_id <= 0) { + pr_warn("failed to find BTF for extern '%s' [%d] section: %d\n", + ext_name, ext->btf_id, ext->sec_btf_id); + return ext->sec_btf_id; + } + sec = (void *)btf__type_by_id(obj->btf, ext->sec_btf_id); + sec_name = btf__name_by_offset(obj->btf, sec->name_off); + + if (strcmp(sec_name, KCONFIG_SEC) == 0) { + if (btf_is_func(t)) { + pr_warn("extern function %s is unsupported under %s section\n", + ext->name, KCONFIG_SEC); + return -ENOTSUP; + } + kcfg_sec = sec; + ext->type = EXT_KCFG; + ext->kcfg.sz = btf__resolve_size(obj->btf, t->type); + if (ext->kcfg.sz <= 0) { + pr_warn("failed to resolve size of extern (kcfg) '%s': %d\n", + ext_name, ext->kcfg.sz); + return ext->kcfg.sz; + } + ext->kcfg.align = btf__align_of(obj->btf, t->type); + if (ext->kcfg.align <= 0) { + pr_warn("failed to determine alignment of extern (kcfg) '%s': %d\n", + ext_name, ext->kcfg.align); + return -EINVAL; + } + ext->kcfg.type = find_kcfg_type(obj->btf, t->type, + &ext->kcfg.is_signed); + if (ext->kcfg.type == KCFG_UNKNOWN) { + pr_warn("extern (kcfg) '%s': type is unsupported\n", ext_name); + return -ENOTSUP; + } + } else if (strcmp(sec_name, KSYMS_SEC) == 0) { + ksym_sec = sec; + ext->type = EXT_KSYM; + skip_mods_and_typedefs(obj->btf, t->type, + &ext->ksym.type_id); + } else { + pr_warn("unrecognized extern section '%s'\n", sec_name); + return -ENOTSUP; + } + } + pr_debug("collected %d externs total\n", obj->nr_extern); + + if (!obj->nr_extern) + return 0; + + /* sort externs by type, for kcfg ones also by (align, size, name) */ + qsort(obj->externs, obj->nr_extern, sizeof(*ext), cmp_externs); + + /* for .ksyms section, we need to turn all externs into allocated + * variables in BTF to pass kernel verification; we do this by + * pretending that each extern is a 8-byte variable + */ + if (ksym_sec) { + /* find existing 4-byte integer type in BTF to use for fake + * extern variables in DATASEC + */ + int int_btf_id = find_int_btf_id(obj->btf); + /* For extern function, a dummy_var added earlier + * will be used to replace the vs->type and + * its name string will be used to refill + * the missing param's name. + */ + const struct btf_type *dummy_var; + + dummy_var = btf__type_by_id(obj->btf, dummy_var_btf_id); + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type != EXT_KSYM) + continue; + pr_debug("extern (ksym) #%d: symbol %d, name %s\n", + i, ext->sym_idx, ext->name); + } + + sec = ksym_sec; + n = btf_vlen(sec); + for (i = 0, off = 0; i < n; i++, off += sizeof(int)) { + struct btf_var_secinfo *vs = btf_var_secinfos(sec) + i; + struct btf_type *vt; + + vt = (void *)btf__type_by_id(obj->btf, vs->type); + ext_name = btf__name_by_offset(obj->btf, vt->name_off); + ext = find_extern_by_name(obj, ext_name); + if (!ext) { + pr_warn("failed to find extern definition for BTF %s '%s'\n", + btf_kind_str(vt), ext_name); + return -ESRCH; + } + if (btf_is_func(vt)) { + const struct btf_type *func_proto; + struct btf_param *param; + int j; + + func_proto = btf__type_by_id(obj->btf, + vt->type); + param = btf_params(func_proto); + /* Reuse the dummy_var string if the + * func proto does not have param name. + */ + for (j = 0; j < btf_vlen(func_proto); j++) + if (param[j].type && !param[j].name_off) + param[j].name_off = + dummy_var->name_off; + vs->type = dummy_var_btf_id; + vt->info &= ~0xffff; + vt->info |= BTF_FUNC_GLOBAL; + } else { + btf_var(vt)->linkage = BTF_VAR_GLOBAL_ALLOCATED; + vt->type = int_btf_id; + } + vs->offset = off; + vs->size = sizeof(int); + } + sec->size = off; + } + + if (kcfg_sec) { + sec = kcfg_sec; + /* for kcfg externs calculate their offsets within a .kconfig map */ + off = 0; + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type != EXT_KCFG) + continue; + + ext->kcfg.data_off = roundup(off, ext->kcfg.align); + off = ext->kcfg.data_off + ext->kcfg.sz; + pr_debug("extern (kcfg) #%d: symbol %d, off %u, name %s\n", + i, ext->sym_idx, ext->kcfg.data_off, ext->name); + } + sec->size = off; + n = btf_vlen(sec); + for (i = 0; i < n; i++) { + struct btf_var_secinfo *vs = btf_var_secinfos(sec) + i; + + t = btf__type_by_id(obj->btf, vs->type); + ext_name = btf__name_by_offset(obj->btf, t->name_off); + ext = find_extern_by_name(obj, ext_name); + if (!ext) { + pr_warn("failed to find extern definition for BTF var '%s'\n", + ext_name); + return -ESRCH; + } + btf_var(t)->linkage = BTF_VAR_GLOBAL_ALLOCATED; + vs->offset = ext->kcfg.data_off; + } + } + return 0; +} + +static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog) +{ + return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1; +} + +struct bpf_program * +bpf_object__find_program_by_name(const struct bpf_object *obj, + const char *name) +{ + struct bpf_program *prog; + + bpf_object__for_each_program(prog, obj) { + if (prog_is_subprog(obj, prog)) + continue; + if (!strcmp(prog->name, name)) + return prog; + } + return errno = ENOENT, NULL; +} + +static bool bpf_object__shndx_is_data(const struct bpf_object *obj, + int shndx) +{ + switch (obj->efile.secs[shndx].sec_type) { + case SEC_BSS: + case SEC_DATA: + case SEC_RODATA: + return true; + default: + return false; + } +} + +static bool bpf_object__shndx_is_maps(const struct bpf_object *obj, + int shndx) +{ + return shndx == obj->efile.btf_maps_shndx; +} + +static enum libbpf_map_type +bpf_object__section_to_libbpf_map_type(const struct bpf_object *obj, int shndx) +{ + if (shndx == obj->efile.symbols_shndx) + return LIBBPF_MAP_KCONFIG; + + switch (obj->efile.secs[shndx].sec_type) { + case SEC_BSS: + return LIBBPF_MAP_BSS; + case SEC_DATA: + return LIBBPF_MAP_DATA; + case SEC_RODATA: + return LIBBPF_MAP_RODATA; + default: + return LIBBPF_MAP_UNSPEC; + } +} + +static int bpf_program__record_reloc(struct bpf_program *prog, + struct reloc_desc *reloc_desc, + __u32 insn_idx, const char *sym_name, + const Elf64_Sym *sym, const Elf64_Rel *rel) +{ + struct bpf_insn *insn = &prog->insns[insn_idx]; + size_t map_idx, nr_maps = prog->obj->nr_maps; + struct bpf_object *obj = prog->obj; + __u32 shdr_idx = sym->st_shndx; + enum libbpf_map_type type; + const char *sym_sec_name; + struct bpf_map *map; + + if (!is_call_insn(insn) && !is_ldimm64_insn(insn)) { + pr_warn("prog '%s': invalid relo against '%s' for insns[%d].code 0x%x\n", + prog->name, sym_name, insn_idx, insn->code); + return -LIBBPF_ERRNO__RELOC; + } + + if (sym_is_extern(sym)) { + int sym_idx = ELF64_R_SYM(rel->r_info); + int i, n = obj->nr_extern; + struct extern_desc *ext; + + for (i = 0; i < n; i++) { + ext = &obj->externs[i]; + if (ext->sym_idx == sym_idx) + break; + } + if (i >= n) { + pr_warn("prog '%s': extern relo failed to find extern for '%s' (%d)\n", + prog->name, sym_name, sym_idx); + return -LIBBPF_ERRNO__RELOC; + } + pr_debug("prog '%s': found extern #%d '%s' (sym %d) for insn #%u\n", + prog->name, i, ext->name, ext->sym_idx, insn_idx); + if (insn->code == (BPF_JMP | BPF_CALL)) + reloc_desc->type = RELO_EXTERN_FUNC; + else + reloc_desc->type = RELO_EXTERN_VAR; + reloc_desc->insn_idx = insn_idx; + reloc_desc->sym_off = i; /* sym_off stores extern index */ + return 0; + } + + /* sub-program call relocation */ + if (is_call_insn(insn)) { + if (insn->src_reg != BPF_PSEUDO_CALL) { + pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name); + return -LIBBPF_ERRNO__RELOC; + } + /* text_shndx can be 0, if no default "main" program exists */ + if (!shdr_idx || shdr_idx != obj->efile.text_shndx) { + sym_sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, shdr_idx)); + pr_warn("prog '%s': bad call relo against '%s' in section '%s'\n", + prog->name, sym_name, sym_sec_name); + return -LIBBPF_ERRNO__RELOC; + } + if (sym->st_value % BPF_INSN_SZ) { + pr_warn("prog '%s': bad call relo against '%s' at offset %zu\n", + prog->name, sym_name, (size_t)sym->st_value); + return -LIBBPF_ERRNO__RELOC; + } + reloc_desc->type = RELO_CALL; + reloc_desc->insn_idx = insn_idx; + reloc_desc->sym_off = sym->st_value; + return 0; + } + + if (!shdr_idx || shdr_idx >= SHN_LORESERVE) { + pr_warn("prog '%s': invalid relo against '%s' in special section 0x%x; forgot to initialize global var?..\n", + prog->name, sym_name, shdr_idx); + return -LIBBPF_ERRNO__RELOC; + } + + /* loading subprog addresses */ + if (sym_is_subprog(sym, obj->efile.text_shndx)) { + /* global_func: sym->st_value = offset in the section, insn->imm = 0. + * local_func: sym->st_value = 0, insn->imm = offset in the section. + */ + if ((sym->st_value % BPF_INSN_SZ) || (insn->imm % BPF_INSN_SZ)) { + pr_warn("prog '%s': bad subprog addr relo against '%s' at offset %zu+%d\n", + prog->name, sym_name, (size_t)sym->st_value, insn->imm); + return -LIBBPF_ERRNO__RELOC; + } + + reloc_desc->type = RELO_SUBPROG_ADDR; + reloc_desc->insn_idx = insn_idx; + reloc_desc->sym_off = sym->st_value; + return 0; + } + + type = bpf_object__section_to_libbpf_map_type(obj, shdr_idx); + sym_sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, shdr_idx)); + + /* generic map reference relocation */ + if (type == LIBBPF_MAP_UNSPEC) { + if (!bpf_object__shndx_is_maps(obj, shdr_idx)) { + pr_warn("prog '%s': bad map relo against '%s' in section '%s'\n", + prog->name, sym_name, sym_sec_name); + return -LIBBPF_ERRNO__RELOC; + } + for (map_idx = 0; map_idx < nr_maps; map_idx++) { + map = &obj->maps[map_idx]; + if (map->libbpf_type != type || + map->sec_idx != sym->st_shndx || + map->sec_offset != sym->st_value) + continue; + pr_debug("prog '%s': found map %zd (%s, sec %d, off %zu) for insn #%u\n", + prog->name, map_idx, map->name, map->sec_idx, + map->sec_offset, insn_idx); + break; + } + if (map_idx >= nr_maps) { + pr_warn("prog '%s': map relo failed to find map for section '%s', off %zu\n", + prog->name, sym_sec_name, (size_t)sym->st_value); + return -LIBBPF_ERRNO__RELOC; + } + reloc_desc->type = RELO_LD64; + reloc_desc->insn_idx = insn_idx; + reloc_desc->map_idx = map_idx; + reloc_desc->sym_off = 0; /* sym->st_value determines map_idx */ + return 0; + } + + /* global data map relocation */ + if (!bpf_object__shndx_is_data(obj, shdr_idx)) { + pr_warn("prog '%s': bad data relo against section '%s'\n", + prog->name, sym_sec_name); + return -LIBBPF_ERRNO__RELOC; + } + for (map_idx = 0; map_idx < nr_maps; map_idx++) { + map = &obj->maps[map_idx]; + if (map->libbpf_type != type || map->sec_idx != sym->st_shndx) + continue; + pr_debug("prog '%s': found data map %zd (%s, sec %d, off %zu) for insn %u\n", + prog->name, map_idx, map->name, map->sec_idx, + map->sec_offset, insn_idx); + break; + } + if (map_idx >= nr_maps) { + pr_warn("prog '%s': data relo failed to find map for section '%s'\n", + prog->name, sym_sec_name); + return -LIBBPF_ERRNO__RELOC; + } + + reloc_desc->type = RELO_DATA; + reloc_desc->insn_idx = insn_idx; + reloc_desc->map_idx = map_idx; + reloc_desc->sym_off = sym->st_value; + return 0; +} + +static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) +{ + return insn_idx >= prog->sec_insn_off && + insn_idx < prog->sec_insn_off + prog->sec_insn_cnt; +} + +static struct bpf_program *find_prog_by_sec_insn(const struct bpf_object *obj, + size_t sec_idx, size_t insn_idx) +{ + int l = 0, r = obj->nr_programs - 1, m; + struct bpf_program *prog; + + if (!obj->nr_programs) + return NULL; + + while (l < r) { + m = l + (r - l + 1) / 2; + prog = &obj->programs[m]; + + if (prog->sec_idx < sec_idx || + (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx)) + l = m; + else + r = m - 1; + } + /* matching program could be at index l, but it still might be the + * wrong one, so we need to double check conditions for the last time + */ + prog = &obj->programs[l]; + if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx)) + return prog; + return NULL; +} + +static int +bpf_object__collect_prog_relos(struct bpf_object *obj, Elf64_Shdr *shdr, Elf_Data *data) +{ + const char *relo_sec_name, *sec_name; + size_t sec_idx = shdr->sh_info, sym_idx; + struct bpf_program *prog; + struct reloc_desc *relos; + int err, i, nrels; + const char *sym_name; + __u32 insn_idx; + Elf_Scn *scn; + Elf_Data *scn_data; + Elf64_Sym *sym; + Elf64_Rel *rel; + + if (sec_idx >= obj->efile.sec_cnt) + return -EINVAL; + + scn = elf_sec_by_idx(obj, sec_idx); + scn_data = elf_sec_data(obj, scn); + + relo_sec_name = elf_sec_str(obj, shdr->sh_name); + sec_name = elf_sec_name(obj, scn); + if (!relo_sec_name || !sec_name) + return -EINVAL; + + pr_debug("sec '%s': collecting relocation for section(%zu) '%s'\n", + relo_sec_name, sec_idx, sec_name); + nrels = shdr->sh_size / shdr->sh_entsize; + + for (i = 0; i < nrels; i++) { + rel = elf_rel_by_idx(data, i); + if (!rel) { + pr_warn("sec '%s': failed to get relo #%d\n", relo_sec_name, i); + return -LIBBPF_ERRNO__FORMAT; + } + + sym_idx = ELF64_R_SYM(rel->r_info); + sym = elf_sym_by_idx(obj, sym_idx); + if (!sym) { + pr_warn("sec '%s': symbol #%zu not found for relo #%d\n", + relo_sec_name, sym_idx, i); + return -LIBBPF_ERRNO__FORMAT; + } + + if (sym->st_shndx >= obj->efile.sec_cnt) { + pr_warn("sec '%s': corrupted symbol #%zu pointing to invalid section #%zu for relo #%d\n", + relo_sec_name, sym_idx, (size_t)sym->st_shndx, i); + return -LIBBPF_ERRNO__FORMAT; + } + + if (rel->r_offset % BPF_INSN_SZ || rel->r_offset >= scn_data->d_size) { + pr_warn("sec '%s': invalid offset 0x%zx for relo #%d\n", + relo_sec_name, (size_t)rel->r_offset, i); + return -LIBBPF_ERRNO__FORMAT; + } + + insn_idx = rel->r_offset / BPF_INSN_SZ; + /* relocations against static functions are recorded as + * relocations against the section that contains a function; + * in such case, symbol will be STT_SECTION and sym.st_name + * will point to empty string (0), so fetch section name + * instead + */ + if (ELF64_ST_TYPE(sym->st_info) == STT_SECTION && sym->st_name == 0) + sym_name = elf_sec_name(obj, elf_sec_by_idx(obj, sym->st_shndx)); + else + sym_name = elf_sym_str(obj, sym->st_name); + sym_name = sym_name ?: "reloc_desc, + prog->nr_reloc + 1, sizeof(*relos)); + if (!relos) + return -ENOMEM; + prog->reloc_desc = relos; + + /* adjust insn_idx to local BPF program frame of reference */ + insn_idx -= prog->sec_insn_off; + err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc], + insn_idx, sym_name, sym, rel); + if (err) + return err; + + prog->nr_reloc++; + } + return 0; +} + +static int map_fill_btf_type_info(struct bpf_object *obj, struct bpf_map *map) +{ + int id; + + if (!obj->btf) + return -ENOENT; + + /* if it's BTF-defined map, we don't need to search for type IDs. + * For struct_ops map, it does not need btf_key_type_id and + * btf_value_type_id. + */ + if (map->sec_idx == obj->efile.btf_maps_shndx || bpf_map__is_struct_ops(map)) + return 0; + + /* + * LLVM annotates global data differently in BTF, that is, + * only as '.data', '.bss' or '.rodata'. + */ + if (!bpf_map__is_internal(map)) + return -ENOENT; + + id = btf__find_by_name(obj->btf, map->real_name); + if (id < 0) + return id; + + map->btf_key_type_id = 0; + map->btf_value_type_id = id; + return 0; +} + +static int bpf_get_map_info_from_fdinfo(int fd, struct bpf_map_info *info) +{ + char file[PATH_MAX], buff[4096]; + FILE *fp; + __u32 val; + int err; + + snprintf(file, sizeof(file), "/proc/%d/fdinfo/%d", getpid(), fd); + memset(info, 0, sizeof(*info)); + + fp = fopen(file, "r"); + if (!fp) { + err = -errno; + pr_warn("failed to open %s: %d. No procfs support?\n", file, + err); + return err; + } + + while (fgets(buff, sizeof(buff), fp)) { + if (sscanf(buff, "map_type:\t%u", &val) == 1) + info->type = val; + else if (sscanf(buff, "key_size:\t%u", &val) == 1) + info->key_size = val; + else if (sscanf(buff, "value_size:\t%u", &val) == 1) + info->value_size = val; + else if (sscanf(buff, "max_entries:\t%u", &val) == 1) + info->max_entries = val; + else if (sscanf(buff, "map_flags:\t%i", &val) == 1) + info->map_flags = val; + } + + fclose(fp); + + return 0; +} + +bool bpf_map__autocreate(const struct bpf_map *map) +{ + return map->autocreate; +} + +int bpf_map__set_autocreate(struct bpf_map *map, bool autocreate) +{ + if (map->obj->loaded) + return libbpf_err(-EBUSY); + + map->autocreate = autocreate; + return 0; +} + +int bpf_map__reuse_fd(struct bpf_map *map, int fd) +{ + struct bpf_map_info info; + __u32 len = sizeof(info), name_len; + int new_fd, err; + char *new_name; + + memset(&info, 0, len); + err = bpf_map_get_info_by_fd(fd, &info, &len); + if (err && errno == EINVAL) + err = bpf_get_map_info_from_fdinfo(fd, &info); + if (err) + return libbpf_err(err); + + name_len = strlen(info.name); + if (name_len == BPF_OBJ_NAME_LEN - 1 && strncmp(map->name, info.name, name_len) == 0) + new_name = strdup(map->name); + else + new_name = strdup(info.name); + + if (!new_name) + return libbpf_err(-errno); + + new_fd = open("/", O_RDONLY | O_CLOEXEC); + if (new_fd < 0) { + err = -errno; + goto err_free_new_name; + } + + new_fd = dup3(fd, new_fd, O_CLOEXEC); + if (new_fd < 0) { + err = -errno; + goto err_close_new_fd; + } + + err = zclose(map->fd); + if (err) { + err = -errno; + goto err_close_new_fd; + } + free(map->name); + + map->fd = new_fd; + map->name = new_name; + map->def.type = info.type; + map->def.key_size = info.key_size; + map->def.value_size = info.value_size; + map->def.max_entries = info.max_entries; + map->def.map_flags = info.map_flags; + map->btf_key_type_id = info.btf_key_type_id; + map->btf_value_type_id = info.btf_value_type_id; + map->reused = true; + map->map_extra = info.map_extra; + + return 0; + +err_close_new_fd: + close(new_fd); +err_free_new_name: + free(new_name); + return libbpf_err(err); +} + +__u32 bpf_map__max_entries(const struct bpf_map *map) +{ + return map->def.max_entries; +} + +struct bpf_map *bpf_map__inner_map(struct bpf_map *map) +{ + if (!bpf_map_type__is_map_in_map(map->def.type)) + return errno = EINVAL, NULL; + + return map->inner_map; +} + +int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries) +{ + if (map->obj->loaded) + return libbpf_err(-EBUSY); + + map->def.max_entries = max_entries; + + /* auto-adjust BPF ringbuf map max_entries to be a multiple of page size */ + if (map_is_ringbuf(map)) + map->def.max_entries = adjust_ringbuf_sz(map->def.max_entries); + + return 0; +} + +static int +bpf_object__probe_loading(struct bpf_object *obj) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int ret, insn_cnt = ARRAY_SIZE(insns); + + if (obj->gen_loader) + return 0; + + ret = bump_rlimit_memlock(); + if (ret) + pr_warn("Failed to bump RLIMIT_MEMLOCK (err = %d), you might need to do it explicitly!\n", ret); + + /* make sure basic loading works */ + ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL); + if (ret < 0) + ret = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", insns, insn_cnt, NULL); + if (ret < 0) { + ret = errno; + cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg)); + pr_warn("Error in %s():%s(%d). Couldn't load trivial BPF " + "program. Make sure your kernel supports BPF " + "(CONFIG_BPF_SYSCALL=y) and/or that RLIMIT_MEMLOCK is " + "set to big enough value.\n", __func__, cp, ret); + return -ret; + } + close(ret); + + return 0; +} + +static int probe_fd(int fd) +{ + if (fd >= 0) + close(fd); + return fd >= 0; +} + +static int probe_kern_prog_name(void) +{ + const size_t attr_sz = offsetofend(union bpf_attr, prog_name); + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER; + attr.license = ptr_to_u64("GPL"); + attr.insns = ptr_to_u64(insns); + attr.insn_cnt = (__u32)ARRAY_SIZE(insns); + libbpf_strlcpy(attr.prog_name, "libbpf_nametest", sizeof(attr.prog_name)); + + /* make sure loading with name works */ + ret = sys_bpf_prog_load(&attr, attr_sz, PROG_LOAD_ATTEMPTS); + return probe_fd(ret); +} + +static int probe_kern_global_data(void) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + struct bpf_insn insns[] = { + BPF_LD_MAP_VALUE(BPF_REG_1, 0, 16), + BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42), + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int ret, map, insn_cnt = ARRAY_SIZE(insns); + + map = bpf_map_create(BPF_MAP_TYPE_ARRAY, "libbpf_global", sizeof(int), 32, 1, NULL); + if (map < 0) { + ret = -errno; + cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg)); + pr_warn("Error in %s():%s(%d). Couldn't create simple array map.\n", + __func__, cp, -ret); + return ret; + } + + insns[0].imm = map; + + ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL); + close(map); + return probe_fd(ret); +} + +static int probe_kern_btf(void) +{ + static const char strs[] = "\0int"; + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_func(void) +{ + static const char strs[] = "\0int\0x\0a"; + /* void x(int a) {} */ + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* FUNC_PROTO */ /* [2] */ + BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 1), 0), + BTF_PARAM_ENC(7, 1), + /* FUNC x */ /* [3] */ + BTF_TYPE_ENC(5, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0), 2), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_func_global(void) +{ + static const char strs[] = "\0int\0x\0a"; + /* static void x(int a) {} */ + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* FUNC_PROTO */ /* [2] */ + BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 1), 0), + BTF_PARAM_ENC(7, 1), + /* FUNC x BTF_FUNC_GLOBAL */ /* [3] */ + BTF_TYPE_ENC(5, BTF_INFO_ENC(BTF_KIND_FUNC, 0, BTF_FUNC_GLOBAL), 2), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_datasec(void) +{ + static const char strs[] = "\0x\0.data"; + /* static int a; */ + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* VAR x */ /* [2] */ + BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_VAR, 0, 0), 1), + BTF_VAR_STATIC, + /* DATASEC val */ /* [3] */ + BTF_TYPE_ENC(3, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), + BTF_VAR_SECINFO_ENC(2, 0, 4), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_float(void) +{ + static const char strs[] = "\0float"; + __u32 types[] = { + /* float */ + BTF_TYPE_FLOAT_ENC(1, 4), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_decl_tag(void) +{ + static const char strs[] = "\0tag"; + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* VAR x */ /* [2] */ + BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_VAR, 0, 0), 1), + BTF_VAR_STATIC, + /* attr */ + BTF_TYPE_DECL_TAG_ENC(1, 2, -1), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_type_tag(void) +{ + static const char strs[] = "\0tag"; + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* attr */ + BTF_TYPE_TYPE_TAG_ENC(1, 1), /* [2] */ + /* ptr */ + BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2), /* [3] */ + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_array_mmap(void) +{ + LIBBPF_OPTS(bpf_map_create_opts, opts, .map_flags = BPF_F_MMAPABLE); + int fd; + + fd = bpf_map_create(BPF_MAP_TYPE_ARRAY, "libbpf_mmap", sizeof(int), sizeof(int), 1, &opts); + return probe_fd(fd); +} + +static int probe_kern_exp_attach_type(void) +{ + LIBBPF_OPTS(bpf_prog_load_opts, opts, .expected_attach_type = BPF_CGROUP_INET_SOCK_CREATE); + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int fd, insn_cnt = ARRAY_SIZE(insns); + + /* use any valid combination of program type and (optional) + * non-zero expected attach type (i.e., not a BPF_CGROUP_INET_INGRESS) + * to see if kernel supports expected_attach_type field for + * BPF_PROG_LOAD command + */ + fd = bpf_prog_load(BPF_PROG_TYPE_CGROUP_SOCK, NULL, "GPL", insns, insn_cnt, &opts); + return probe_fd(fd); +} + +static int probe_kern_probe_read_kernel(void) +{ + struct bpf_insn insns[] = { + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), /* r1 = r10 (fp) */ + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), /* r1 += -8 */ + BPF_MOV64_IMM(BPF_REG_2, 8), /* r2 = 8 */ + BPF_MOV64_IMM(BPF_REG_3, 0), /* r3 = 0 */ + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_probe_read_kernel), + BPF_EXIT_INSN(), + }; + int fd, insn_cnt = ARRAY_SIZE(insns); + + fd = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", insns, insn_cnt, NULL); + return probe_fd(fd); +} + +static int probe_prog_bind_map(void) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int ret, map, prog, insn_cnt = ARRAY_SIZE(insns); + + map = bpf_map_create(BPF_MAP_TYPE_ARRAY, "libbpf_det_bind", sizeof(int), 32, 1, NULL); + if (map < 0) { + ret = -errno; + cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg)); + pr_warn("Error in %s():%s(%d). Couldn't create simple array map.\n", + __func__, cp, -ret); + return ret; + } + + prog = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL); + if (prog < 0) { + close(map); + return 0; + } + + ret = bpf_prog_bind_map(prog, map, NULL); + + close(map); + close(prog); + + return ret >= 0; +} + +static int probe_module_btf(void) +{ + static const char strs[] = "\0int"; + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), + }; + struct bpf_btf_info info; + __u32 len = sizeof(info); + char name[16]; + int fd, err; + + fd = libbpf__load_raw_btf((char *)types, sizeof(types), strs, sizeof(strs)); + if (fd < 0) + return 0; /* BTF not supported at all */ + + memset(&info, 0, sizeof(info)); + info.name = ptr_to_u64(name); + info.name_len = sizeof(name); + + /* check that BPF_OBJ_GET_INFO_BY_FD supports specifying name pointer; + * kernel's module BTF support coincides with support for + * name/name_len fields in struct bpf_btf_info. + */ + err = bpf_btf_get_info_by_fd(fd, &info, &len); + close(fd); + return !err; +} + +static int probe_perf_link(void) +{ + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int prog_fd, link_fd, err; + + prog_fd = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", + insns, ARRAY_SIZE(insns), NULL); + if (prog_fd < 0) + return -errno; + + /* use invalid perf_event FD to get EBADF, if link is supported; + * otherwise EINVAL should be returned + */ + link_fd = bpf_link_create(prog_fd, -1, BPF_PERF_EVENT, NULL); + err = -errno; /* close() can clobber errno */ + + if (link_fd >= 0) + close(link_fd); + close(prog_fd); + + return link_fd < 0 && err == -EBADF; +} + +static int probe_kern_bpf_cookie(void) +{ + struct bpf_insn insns[] = { + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_attach_cookie), + BPF_EXIT_INSN(), + }; + int ret, insn_cnt = ARRAY_SIZE(insns); + + ret = bpf_prog_load(BPF_PROG_TYPE_KPROBE, NULL, "GPL", insns, insn_cnt, NULL); + return probe_fd(ret); +} + +static int probe_kern_btf_enum64(void) +{ + static const char strs[] = "\0enum64"; + __u32 types[] = { + BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_syscall_wrapper(void); + +enum kern_feature_result { + FEAT_UNKNOWN = 0, + FEAT_SUPPORTED = 1, + FEAT_MISSING = 2, +}; + +typedef int (*feature_probe_fn)(void); + +static struct kern_feature_desc { + const char *desc; + feature_probe_fn probe; + enum kern_feature_result res; +} feature_probes[__FEAT_CNT] = { + [FEAT_PROG_NAME] = { + "BPF program name", probe_kern_prog_name, + }, + [FEAT_GLOBAL_DATA] = { + "global variables", probe_kern_global_data, + }, + [FEAT_BTF] = { + "minimal BTF", probe_kern_btf, + }, + [FEAT_BTF_FUNC] = { + "BTF functions", probe_kern_btf_func, + }, + [FEAT_BTF_GLOBAL_FUNC] = { + "BTF global function", probe_kern_btf_func_global, + }, + [FEAT_BTF_DATASEC] = { + "BTF data section and variable", probe_kern_btf_datasec, + }, + [FEAT_ARRAY_MMAP] = { + "ARRAY map mmap()", probe_kern_array_mmap, + }, + [FEAT_EXP_ATTACH_TYPE] = { + "BPF_PROG_LOAD expected_attach_type attribute", + probe_kern_exp_attach_type, + }, + [FEAT_PROBE_READ_KERN] = { + "bpf_probe_read_kernel() helper", probe_kern_probe_read_kernel, + }, + [FEAT_PROG_BIND_MAP] = { + "BPF_PROG_BIND_MAP support", probe_prog_bind_map, + }, + [FEAT_MODULE_BTF] = { + "module BTF support", probe_module_btf, + }, + [FEAT_BTF_FLOAT] = { + "BTF_KIND_FLOAT support", probe_kern_btf_float, + }, + [FEAT_PERF_LINK] = { + "BPF perf link support", probe_perf_link, + }, + [FEAT_BTF_DECL_TAG] = { + "BTF_KIND_DECL_TAG support", probe_kern_btf_decl_tag, + }, + [FEAT_BTF_TYPE_TAG] = { + "BTF_KIND_TYPE_TAG support", probe_kern_btf_type_tag, + }, + [FEAT_MEMCG_ACCOUNT] = { + "memcg-based memory accounting", probe_memcg_account, + }, + [FEAT_BPF_COOKIE] = { + "BPF cookie support", probe_kern_bpf_cookie, + }, + [FEAT_BTF_ENUM64] = { + "BTF_KIND_ENUM64 support", probe_kern_btf_enum64, + }, + [FEAT_SYSCALL_WRAPPER] = { + "Kernel using syscall wrapper", probe_kern_syscall_wrapper, + }, +}; + +bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id) +{ + struct kern_feature_desc *feat = &feature_probes[feat_id]; + int ret; + + if (obj && obj->gen_loader) + /* To generate loader program assume the latest kernel + * to avoid doing extra prog_load, map_create syscalls. + */ + return true; + + if (READ_ONCE(feat->res) == FEAT_UNKNOWN) { + ret = feat->probe(); + if (ret > 0) { + WRITE_ONCE(feat->res, FEAT_SUPPORTED); + } else if (ret == 0) { + WRITE_ONCE(feat->res, FEAT_MISSING); + } else { + pr_warn("Detection of kernel %s support failed: %d\n", feat->desc, ret); + WRITE_ONCE(feat->res, FEAT_MISSING); + } + } + + return READ_ONCE(feat->res) == FEAT_SUPPORTED; +} + +static bool map_is_reuse_compat(const struct bpf_map *map, int map_fd) +{ + struct bpf_map_info map_info; + char msg[STRERR_BUFSIZE]; + __u32 map_info_len = sizeof(map_info); + int err; + + memset(&map_info, 0, map_info_len); + err = bpf_map_get_info_by_fd(map_fd, &map_info, &map_info_len); + if (err && errno == EINVAL) + err = bpf_get_map_info_from_fdinfo(map_fd, &map_info); + if (err) { + pr_warn("failed to get map info for map FD %d: %s\n", map_fd, + libbpf_strerror_r(errno, msg, sizeof(msg))); + return false; + } + + return (map_info.type == map->def.type && + map_info.key_size == map->def.key_size && + map_info.value_size == map->def.value_size && + map_info.max_entries == map->def.max_entries && + map_info.map_flags == map->def.map_flags && + map_info.map_extra == map->map_extra); +} + +static int +bpf_object__reuse_map(struct bpf_map *map) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + int err, pin_fd; + + pin_fd = bpf_obj_get(map->pin_path); + if (pin_fd < 0) { + err = -errno; + if (err == -ENOENT) { + pr_debug("found no pinned map to reuse at '%s'\n", + map->pin_path); + return 0; + } + + cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg)); + pr_warn("couldn't retrieve pinned map '%s': %s\n", + map->pin_path, cp); + return err; + } + + if (!map_is_reuse_compat(map, pin_fd)) { + pr_warn("couldn't reuse pinned map at '%s': parameter mismatch\n", + map->pin_path); + close(pin_fd); + return -EINVAL; + } + + err = bpf_map__reuse_fd(map, pin_fd); + close(pin_fd); + if (err) + return err; + + map->pinned = true; + pr_debug("reused pinned map at '%s'\n", map->pin_path); + + return 0; +} + +static int +bpf_object__populate_internal_map(struct bpf_object *obj, struct bpf_map *map) +{ + enum libbpf_map_type map_type = map->libbpf_type; + char *cp, errmsg[STRERR_BUFSIZE]; + int err, zero = 0; + + if (obj->gen_loader) { + bpf_gen__map_update_elem(obj->gen_loader, map - obj->maps, + map->mmaped, map->def.value_size); + if (map_type == LIBBPF_MAP_RODATA || map_type == LIBBPF_MAP_KCONFIG) + bpf_gen__map_freeze(obj->gen_loader, map - obj->maps); + return 0; + } + err = bpf_map_update_elem(map->fd, &zero, map->mmaped, 0); + if (err) { + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("Error setting initial map(%s) contents: %s\n", + map->name, cp); + return err; + } + + /* Freeze .rodata and .kconfig map as read-only from syscall side. */ + if (map_type == LIBBPF_MAP_RODATA || map_type == LIBBPF_MAP_KCONFIG) { + err = bpf_map_freeze(map->fd); + if (err) { + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("Error freezing map(%s) as read-only: %s\n", + map->name, cp); + return err; + } + } + return 0; +} + +static void bpf_map__destroy(struct bpf_map *map); + +static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map, bool is_inner) +{ + LIBBPF_OPTS(bpf_map_create_opts, create_attr); + struct bpf_map_def *def = &map->def; + const char *map_name = NULL; + int err = 0; + + if (kernel_supports(obj, FEAT_PROG_NAME)) + map_name = map->name; + create_attr.map_ifindex = map->map_ifindex; + create_attr.map_flags = def->map_flags; + create_attr.numa_node = map->numa_node; + create_attr.map_extra = map->map_extra; + + if (bpf_map__is_struct_ops(map)) + create_attr.btf_vmlinux_value_type_id = map->btf_vmlinux_value_type_id; + + if (obj->btf && btf__fd(obj->btf) >= 0) { + create_attr.btf_fd = btf__fd(obj->btf); + create_attr.btf_key_type_id = map->btf_key_type_id; + create_attr.btf_value_type_id = map->btf_value_type_id; + } + + if (bpf_map_type__is_map_in_map(def->type)) { + if (map->inner_map) { + err = bpf_object__create_map(obj, map->inner_map, true); + if (err) { + pr_warn("map '%s': failed to create inner map: %d\n", + map->name, err); + return err; + } + map->inner_map_fd = bpf_map__fd(map->inner_map); + } + if (map->inner_map_fd >= 0) + create_attr.inner_map_fd = map->inner_map_fd; + } + + switch (def->type) { + case BPF_MAP_TYPE_PERF_EVENT_ARRAY: + case BPF_MAP_TYPE_CGROUP_ARRAY: + case BPF_MAP_TYPE_STACK_TRACE: + case BPF_MAP_TYPE_ARRAY_OF_MAPS: + case BPF_MAP_TYPE_HASH_OF_MAPS: + case BPF_MAP_TYPE_DEVMAP: + case BPF_MAP_TYPE_DEVMAP_HASH: + case BPF_MAP_TYPE_CPUMAP: + case BPF_MAP_TYPE_XSKMAP: + case BPF_MAP_TYPE_SOCKMAP: + case BPF_MAP_TYPE_SOCKHASH: + case BPF_MAP_TYPE_QUEUE: + case BPF_MAP_TYPE_STACK: + create_attr.btf_fd = 0; + create_attr.btf_key_type_id = 0; + create_attr.btf_value_type_id = 0; + map->btf_key_type_id = 0; + map->btf_value_type_id = 0; + default: + break; + } + + if (obj->gen_loader) { + bpf_gen__map_create(obj->gen_loader, def->type, map_name, + def->key_size, def->value_size, def->max_entries, + &create_attr, is_inner ? -1 : map - obj->maps); + /* Pretend to have valid FD to pass various fd >= 0 checks. + * This fd == 0 will not be used with any syscall and will be reset to -1 eventually. + */ + map->fd = 0; + } else { + map->fd = bpf_map_create(def->type, map_name, + def->key_size, def->value_size, + def->max_entries, &create_attr); + } + if (map->fd < 0 && (create_attr.btf_key_type_id || + create_attr.btf_value_type_id)) { + char *cp, errmsg[STRERR_BUFSIZE]; + + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n", + map->name, cp, err); + create_attr.btf_fd = 0; + create_attr.btf_key_type_id = 0; + create_attr.btf_value_type_id = 0; + map->btf_key_type_id = 0; + map->btf_value_type_id = 0; + map->fd = bpf_map_create(def->type, map_name, + def->key_size, def->value_size, + def->max_entries, &create_attr); + } + + err = map->fd < 0 ? -errno : 0; + + if (bpf_map_type__is_map_in_map(def->type) && map->inner_map) { + if (obj->gen_loader) + map->inner_map->fd = -1; + bpf_map__destroy(map->inner_map); + zfree(&map->inner_map); + } + + return err; +} + +static int init_map_in_map_slots(struct bpf_object *obj, struct bpf_map *map) +{ + const struct bpf_map *targ_map; + unsigned int i; + int fd, err = 0; + + for (i = 0; i < map->init_slots_sz; i++) { + if (!map->init_slots[i]) + continue; + + targ_map = map->init_slots[i]; + fd = bpf_map__fd(targ_map); + + if (obj->gen_loader) { + bpf_gen__populate_outer_map(obj->gen_loader, + map - obj->maps, i, + targ_map - obj->maps); + } else { + err = bpf_map_update_elem(map->fd, &i, &fd, 0); + } + if (err) { + err = -errno; + pr_warn("map '%s': failed to initialize slot [%d] to map '%s' fd=%d: %d\n", + map->name, i, targ_map->name, fd, err); + return err; + } + pr_debug("map '%s': slot [%d] set to map '%s' fd=%d\n", + map->name, i, targ_map->name, fd); + } + + zfree(&map->init_slots); + map->init_slots_sz = 0; + + return 0; +} + +static int init_prog_array_slots(struct bpf_object *obj, struct bpf_map *map) +{ + const struct bpf_program *targ_prog; + unsigned int i; + int fd, err; + + if (obj->gen_loader) + return -ENOTSUP; + + for (i = 0; i < map->init_slots_sz; i++) { + if (!map->init_slots[i]) + continue; + + targ_prog = map->init_slots[i]; + fd = bpf_program__fd(targ_prog); + + err = bpf_map_update_elem(map->fd, &i, &fd, 0); + if (err) { + err = -errno; + pr_warn("map '%s': failed to initialize slot [%d] to prog '%s' fd=%d: %d\n", + map->name, i, targ_prog->name, fd, err); + return err; + } + pr_debug("map '%s': slot [%d] set to prog '%s' fd=%d\n", + map->name, i, targ_prog->name, fd); + } + + zfree(&map->init_slots); + map->init_slots_sz = 0; + + return 0; +} + +static int bpf_object_init_prog_arrays(struct bpf_object *obj) +{ + struct bpf_map *map; + int i, err; + + for (i = 0; i < obj->nr_maps; i++) { + map = &obj->maps[i]; + + if (!map->init_slots_sz || map->def.type != BPF_MAP_TYPE_PROG_ARRAY) + continue; + + err = init_prog_array_slots(obj, map); + if (err < 0) { + zclose(map->fd); + return err; + } + } + return 0; +} + +static int map_set_def_max_entries(struct bpf_map *map) +{ + if (map->def.type == BPF_MAP_TYPE_PERF_EVENT_ARRAY && !map->def.max_entries) { + int nr_cpus; + + nr_cpus = libbpf_num_possible_cpus(); + if (nr_cpus < 0) { + pr_warn("map '%s': failed to determine number of system CPUs: %d\n", + map->name, nr_cpus); + return nr_cpus; + } + pr_debug("map '%s': setting size to %d\n", map->name, nr_cpus); + map->def.max_entries = nr_cpus; + } + + return 0; +} + +static int +bpf_object__create_maps(struct bpf_object *obj) +{ + struct bpf_map *map; + char *cp, errmsg[STRERR_BUFSIZE]; + unsigned int i, j; + int err; + bool retried; + + for (i = 0; i < obj->nr_maps; i++) { + map = &obj->maps[i]; + + /* To support old kernels, we skip creating global data maps + * (.rodata, .data, .kconfig, etc); later on, during program + * loading, if we detect that at least one of the to-be-loaded + * programs is referencing any global data map, we'll error + * out with program name and relocation index logged. + * This approach allows to accommodate Clang emitting + * unnecessary .rodata.str1.1 sections for string literals, + * but also it allows to have CO-RE applications that use + * global variables in some of BPF programs, but not others. + * If those global variable-using programs are not loaded at + * runtime due to bpf_program__set_autoload(prog, false), + * bpf_object loading will succeed just fine even on old + * kernels. + */ + if (bpf_map__is_internal(map) && !kernel_supports(obj, FEAT_GLOBAL_DATA)) + map->autocreate = false; + + if (!map->autocreate) { + pr_debug("map '%s': skipped auto-creating...\n", map->name); + continue; + } + + err = map_set_def_max_entries(map); + if (err) + goto err_out; + + retried = false; +retry: + if (map->pin_path) { + err = bpf_object__reuse_map(map); + if (err) { + pr_warn("map '%s': error reusing pinned map\n", + map->name); + goto err_out; + } + if (retried && map->fd < 0) { + pr_warn("map '%s': cannot find pinned map\n", + map->name); + err = -ENOENT; + goto err_out; + } + } + + if (map->fd >= 0) { + pr_debug("map '%s': skipping creation (preset fd=%d)\n", + map->name, map->fd); + } else { + err = bpf_object__create_map(obj, map, false); + if (err) + goto err_out; + + pr_debug("map '%s': created successfully, fd=%d\n", + map->name, map->fd); + + if (bpf_map__is_internal(map)) { + err = bpf_object__populate_internal_map(obj, map); + if (err < 0) { + zclose(map->fd); + goto err_out; + } + } + + if (map->init_slots_sz && map->def.type != BPF_MAP_TYPE_PROG_ARRAY) { + err = init_map_in_map_slots(obj, map); + if (err < 0) { + zclose(map->fd); + goto err_out; + } + } + } + + if (map->pin_path && !map->pinned) { + err = bpf_map__pin(map, NULL); + if (err) { + zclose(map->fd); + if (!retried && err == -EEXIST) { + retried = true; + goto retry; + } + pr_warn("map '%s': failed to auto-pin at '%s': %d\n", + map->name, map->pin_path, err); + goto err_out; + } + } + } + + return 0; + +err_out: + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("map '%s': failed to create: %s(%d)\n", map->name, cp, err); + pr_perm_msg(err); + for (j = 0; j < i; j++) + zclose(obj->maps[j].fd); + return err; +} + +static bool bpf_core_is_flavor_sep(const char *s) +{ + /* check X___Y name pattern, where X and Y are not underscores */ + return s[0] != '_' && /* X */ + s[1] == '_' && s[2] == '_' && s[3] == '_' && /* ___ */ + s[4] != '_'; /* Y */ +} + +/* Given 'some_struct_name___with_flavor' return the length of a name prefix + * before last triple underscore. Struct name part after last triple + * underscore is ignored by BPF CO-RE relocation during relocation matching. + */ +size_t bpf_core_essential_name_len(const char *name) +{ + size_t n = strlen(name); + int i; + + for (i = n - 5; i >= 0; i--) { + if (bpf_core_is_flavor_sep(name + i)) + return i + 1; + } + return n; +} + +void bpf_core_free_cands(struct bpf_core_cand_list *cands) +{ + if (!cands) + return; + + free(cands->cands); + free(cands); +} + +int bpf_core_add_cands(struct bpf_core_cand *local_cand, + size_t local_essent_len, + const struct btf *targ_btf, + const char *targ_btf_name, + int targ_start_id, + struct bpf_core_cand_list *cands) +{ + struct bpf_core_cand *new_cands, *cand; + const struct btf_type *t, *local_t; + const char *targ_name, *local_name; + size_t targ_essent_len; + int n, i; + + local_t = btf__type_by_id(local_cand->btf, local_cand->id); + local_name = btf__str_by_offset(local_cand->btf, local_t->name_off); + + n = btf__type_cnt(targ_btf); + for (i = targ_start_id; i < n; i++) { + t = btf__type_by_id(targ_btf, i); + if (!btf_kind_core_compat(t, local_t)) + continue; + + targ_name = btf__name_by_offset(targ_btf, t->name_off); + if (str_is_empty(targ_name)) + continue; + + targ_essent_len = bpf_core_essential_name_len(targ_name); + if (targ_essent_len != local_essent_len) + continue; + + if (strncmp(local_name, targ_name, local_essent_len) != 0) + continue; + + pr_debug("CO-RE relocating [%d] %s %s: found target candidate [%d] %s %s in [%s]\n", + local_cand->id, btf_kind_str(local_t), + local_name, i, btf_kind_str(t), targ_name, + targ_btf_name); + new_cands = libbpf_reallocarray(cands->cands, cands->len + 1, + sizeof(*cands->cands)); + if (!new_cands) + return -ENOMEM; + + cand = &new_cands[cands->len]; + cand->btf = targ_btf; + cand->id = i; + + cands->cands = new_cands; + cands->len++; + } + return 0; +} + +static int load_module_btfs(struct bpf_object *obj) +{ + struct bpf_btf_info info; + struct module_btf *mod_btf; + struct btf *btf; + char name[64]; + __u32 id = 0, len; + int err, fd; + + if (obj->btf_modules_loaded) + return 0; + + if (obj->gen_loader) + return 0; + + /* don't do this again, even if we find no module BTFs */ + obj->btf_modules_loaded = true; + + /* kernel too old to support module BTFs */ + if (!kernel_supports(obj, FEAT_MODULE_BTF)) + return 0; + + while (true) { + err = bpf_btf_get_next_id(id, &id); + if (err && errno == ENOENT) + return 0; + if (err) { + err = -errno; + pr_warn("failed to iterate BTF objects: %d\n", err); + return err; + } + + fd = bpf_btf_get_fd_by_id(id); + if (fd < 0) { + if (errno == ENOENT) + continue; /* expected race: BTF was unloaded */ + err = -errno; + pr_warn("failed to get BTF object #%d FD: %d\n", id, err); + return err; + } + + len = sizeof(info); + memset(&info, 0, sizeof(info)); + info.name = ptr_to_u64(name); + info.name_len = sizeof(name); + + err = bpf_btf_get_info_by_fd(fd, &info, &len); + if (err) { + err = -errno; + pr_warn("failed to get BTF object #%d info: %d\n", id, err); + goto err_out; + } + + /* ignore non-module BTFs */ + if (!info.kernel_btf || strcmp(name, "vmlinux") == 0) { + close(fd); + continue; + } + + btf = btf_get_from_fd(fd, obj->btf_vmlinux); + err = libbpf_get_error(btf); + if (err) { + pr_warn("failed to load module [%s]'s BTF object #%d: %d\n", + name, id, err); + goto err_out; + } + + err = libbpf_ensure_mem((void **)&obj->btf_modules, &obj->btf_module_cap, + sizeof(*obj->btf_modules), obj->btf_module_cnt + 1); + if (err) + goto err_out; + + mod_btf = &obj->btf_modules[obj->btf_module_cnt++]; + + mod_btf->btf = btf; + mod_btf->id = id; + mod_btf->fd = fd; + mod_btf->name = strdup(name); + if (!mod_btf->name) { + err = -ENOMEM; + goto err_out; + } + continue; + +err_out: + close(fd); + return err; + } + + return 0; +} + +static struct bpf_core_cand_list * +bpf_core_find_cands(struct bpf_object *obj, const struct btf *local_btf, __u32 local_type_id) +{ + struct bpf_core_cand local_cand = {}; + struct bpf_core_cand_list *cands; + const struct btf *main_btf; + const struct btf_type *local_t; + const char *local_name; + size_t local_essent_len; + int err, i; + + local_cand.btf = local_btf; + local_cand.id = local_type_id; + local_t = btf__type_by_id(local_btf, local_type_id); + if (!local_t) + return ERR_PTR(-EINVAL); + + local_name = btf__name_by_offset(local_btf, local_t->name_off); + if (str_is_empty(local_name)) + return ERR_PTR(-EINVAL); + local_essent_len = bpf_core_essential_name_len(local_name); + + cands = calloc(1, sizeof(*cands)); + if (!cands) + return ERR_PTR(-ENOMEM); + + /* Attempt to find target candidates in vmlinux BTF first */ + main_btf = obj->btf_vmlinux_override ?: obj->btf_vmlinux; + err = bpf_core_add_cands(&local_cand, local_essent_len, main_btf, "vmlinux", 1, cands); + if (err) + goto err_out; + + /* if vmlinux BTF has any candidate, don't got for module BTFs */ + if (cands->len) + return cands; + + /* if vmlinux BTF was overridden, don't attempt to load module BTFs */ + if (obj->btf_vmlinux_override) + return cands; + + /* now look through module BTFs, trying to still find candidates */ + err = load_module_btfs(obj); + if (err) + goto err_out; + + for (i = 0; i < obj->btf_module_cnt; i++) { + err = bpf_core_add_cands(&local_cand, local_essent_len, + obj->btf_modules[i].btf, + obj->btf_modules[i].name, + btf__type_cnt(obj->btf_vmlinux), + cands); + if (err) + goto err_out; + } + + return cands; +err_out: + bpf_core_free_cands(cands); + return ERR_PTR(err); +} + +/* Check local and target types for compatibility. This check is used for + * type-based CO-RE relocations and follow slightly different rules than + * field-based relocations. This function assumes that root types were already + * checked for name match. Beyond that initial root-level name check, names + * are completely ignored. Compatibility rules are as follows: + * - any two STRUCTs/UNIONs/FWDs/ENUMs/INTs are considered compatible, but + * kind should match for local and target types (i.e., STRUCT is not + * compatible with UNION); + * - for ENUMs, the size is ignored; + * - for INT, size and signedness are ignored; + * - for ARRAY, dimensionality is ignored, element types are checked for + * compatibility recursively; + * - CONST/VOLATILE/RESTRICT modifiers are ignored; + * - TYPEDEFs/PTRs are compatible if types they pointing to are compatible; + * - FUNC_PROTOs are compatible if they have compatible signature: same + * number of input args and compatible return and argument types. + * These rules are not set in stone and probably will be adjusted as we get + * more experience with using BPF CO-RE relocations. + */ +int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id) +{ + return __bpf_core_types_are_compat(local_btf, local_id, targ_btf, targ_id, 32); +} + +int bpf_core_types_match(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id) +{ + return __bpf_core_types_match(local_btf, local_id, targ_btf, targ_id, false, 32); +} + +static size_t bpf_core_hash_fn(const long key, void *ctx) +{ + return key; +} + +static bool bpf_core_equal_fn(const long k1, const long k2, void *ctx) +{ + return k1 == k2; +} + +static int record_relo_core(struct bpf_program *prog, + const struct bpf_core_relo *core_relo, int insn_idx) +{ + struct reloc_desc *relos, *relo; + + relos = libbpf_reallocarray(prog->reloc_desc, + prog->nr_reloc + 1, sizeof(*relos)); + if (!relos) + return -ENOMEM; + relo = &relos[prog->nr_reloc]; + relo->type = RELO_CORE; + relo->insn_idx = insn_idx; + relo->core_relo = core_relo; + prog->reloc_desc = relos; + prog->nr_reloc++; + return 0; +} + +static const struct bpf_core_relo *find_relo_core(struct bpf_program *prog, int insn_idx) +{ + struct reloc_desc *relo; + int i; + + for (i = 0; i < prog->nr_reloc; i++) { + relo = &prog->reloc_desc[i]; + if (relo->type != RELO_CORE || relo->insn_idx != insn_idx) + continue; + + return relo->core_relo; + } + + return NULL; +} + +static int bpf_core_resolve_relo(struct bpf_program *prog, + const struct bpf_core_relo *relo, + int relo_idx, + const struct btf *local_btf, + struct hashmap *cand_cache, + struct bpf_core_relo_res *targ_res) +{ + struct bpf_core_spec specs_scratch[3] = {}; + struct bpf_core_cand_list *cands = NULL; + const char *prog_name = prog->name; + const struct btf_type *local_type; + const char *local_name; + __u32 local_id = relo->type_id; + int err; + + local_type = btf__type_by_id(local_btf, local_id); + if (!local_type) + return -EINVAL; + + local_name = btf__name_by_offset(local_btf, local_type->name_off); + if (!local_name) + return -EINVAL; + + if (relo->kind != BPF_CORE_TYPE_ID_LOCAL && + !hashmap__find(cand_cache, local_id, &cands)) { + cands = bpf_core_find_cands(prog->obj, local_btf, local_id); + if (IS_ERR(cands)) { + pr_warn("prog '%s': relo #%d: target candidate search failed for [%d] %s %s: %ld\n", + prog_name, relo_idx, local_id, btf_kind_str(local_type), + local_name, PTR_ERR(cands)); + return PTR_ERR(cands); + } + err = hashmap__set(cand_cache, local_id, cands, NULL, NULL); + if (err) { + bpf_core_free_cands(cands); + return err; + } + } + + return bpf_core_calc_relo_insn(prog_name, relo, relo_idx, local_btf, cands, specs_scratch, + targ_res); +} + +static int +bpf_object__relocate_core(struct bpf_object *obj, const char *targ_btf_path) +{ + const struct btf_ext_info_sec *sec; + struct bpf_core_relo_res targ_res; + const struct bpf_core_relo *rec; + const struct btf_ext_info *seg; + struct hashmap_entry *entry; + struct hashmap *cand_cache = NULL; + struct bpf_program *prog; + struct bpf_insn *insn; + const char *sec_name; + int i, err = 0, insn_idx, sec_idx, sec_num; + + if (obj->btf_ext->core_relo_info.len == 0) + return 0; + + if (targ_btf_path) { + obj->btf_vmlinux_override = btf__parse(targ_btf_path, NULL); + err = libbpf_get_error(obj->btf_vmlinux_override); + if (err) { + pr_warn("failed to parse target BTF: %d\n", err); + return err; + } + } + + cand_cache = hashmap__new(bpf_core_hash_fn, bpf_core_equal_fn, NULL); + if (IS_ERR(cand_cache)) { + err = PTR_ERR(cand_cache); + goto out; + } + + seg = &obj->btf_ext->core_relo_info; + sec_num = 0; + for_each_btf_ext_sec(seg, sec) { + sec_idx = seg->sec_idxs[sec_num]; + sec_num++; + + sec_name = btf__name_by_offset(obj->btf, sec->sec_name_off); + if (str_is_empty(sec_name)) { + err = -EINVAL; + goto out; + } + + pr_debug("sec '%s': found %d CO-RE relocations\n", sec_name, sec->num_info); + + for_each_btf_ext_rec(seg, sec, i, rec) { + if (rec->insn_off % BPF_INSN_SZ) + return -EINVAL; + insn_idx = rec->insn_off / BPF_INSN_SZ; + prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); + if (!prog) { + /* When __weak subprog is "overridden" by another instance + * of the subprog from a different object file, linker still + * appends all the .BTF.ext info that used to belong to that + * eliminated subprogram. + * This is similar to what x86-64 linker does for relocations. + * So just ignore such relocations just like we ignore + * subprog instructions when discovering subprograms. + */ + pr_debug("sec '%s': skipping CO-RE relocation #%d for insn #%d belonging to eliminated weak subprogram\n", + sec_name, i, insn_idx); + continue; + } + /* no need to apply CO-RE relocation if the program is + * not going to be loaded + */ + if (!prog->autoload) + continue; + + /* adjust insn_idx from section frame of reference to the local + * program's frame of reference; (sub-)program code is not yet + * relocated, so it's enough to just subtract in-section offset + */ + insn_idx = insn_idx - prog->sec_insn_off; + if (insn_idx >= prog->insns_cnt) + return -EINVAL; + insn = &prog->insns[insn_idx]; + + err = record_relo_core(prog, rec, insn_idx); + if (err) { + pr_warn("prog '%s': relo #%d: failed to record relocation: %d\n", + prog->name, i, err); + goto out; + } + + if (prog->obj->gen_loader) + continue; + + err = bpf_core_resolve_relo(prog, rec, i, obj->btf, cand_cache, &targ_res); + if (err) { + pr_warn("prog '%s': relo #%d: failed to relocate: %d\n", + prog->name, i, err); + goto out; + } + + err = bpf_core_patch_insn(prog->name, insn, insn_idx, rec, i, &targ_res); + if (err) { + pr_warn("prog '%s': relo #%d: failed to patch insn #%u: %d\n", + prog->name, i, insn_idx, err); + goto out; + } + } + } + +out: + /* obj->btf_vmlinux and module BTFs are freed after object load */ + btf__free(obj->btf_vmlinux_override); + obj->btf_vmlinux_override = NULL; + + if (!IS_ERR_OR_NULL(cand_cache)) { + hashmap__for_each_entry(cand_cache, entry, i) { + bpf_core_free_cands(entry->pvalue); + } + hashmap__free(cand_cache); + } + return err; +} + +/* base map load ldimm64 special constant, used also for log fixup logic */ +#define MAP_LDIMM64_POISON_BASE 2001000000 +#define MAP_LDIMM64_POISON_PFX "200100" + +static void poison_map_ldimm64(struct bpf_program *prog, int relo_idx, + int insn_idx, struct bpf_insn *insn, + int map_idx, const struct bpf_map *map) +{ + int i; + + pr_debug("prog '%s': relo #%d: poisoning insn #%d that loads map #%d '%s'\n", + prog->name, relo_idx, insn_idx, map_idx, map->name); + + /* we turn single ldimm64 into two identical invalid calls */ + for (i = 0; i < 2; i++) { + insn->code = BPF_JMP | BPF_CALL; + insn->dst_reg = 0; + insn->src_reg = 0; + insn->off = 0; + /* if this instruction is reachable (not a dead code), + * verifier will complain with something like: + * invalid func unknown#2001000123 + * where lower 123 is map index into obj->maps[] array + */ + insn->imm = MAP_LDIMM64_POISON_BASE + map_idx; + + insn++; + } +} + +/* Relocate data references within program code: + * - map references; + * - global variable references; + * - extern references. + */ +static int +bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog) +{ + int i; + + for (i = 0; i < prog->nr_reloc; i++) { + struct reloc_desc *relo = &prog->reloc_desc[i]; + struct bpf_insn *insn = &prog->insns[relo->insn_idx]; + const struct bpf_map *map; + struct extern_desc *ext; + + switch (relo->type) { + case RELO_LD64: + map = &obj->maps[relo->map_idx]; + if (obj->gen_loader) { + insn[0].src_reg = BPF_PSEUDO_MAP_IDX; + insn[0].imm = relo->map_idx; + } else if (map->autocreate) { + insn[0].src_reg = BPF_PSEUDO_MAP_FD; + insn[0].imm = map->fd; + } else { + poison_map_ldimm64(prog, i, relo->insn_idx, insn, + relo->map_idx, map); + } + break; + case RELO_DATA: + map = &obj->maps[relo->map_idx]; + insn[1].imm = insn[0].imm + relo->sym_off; + if (obj->gen_loader) { + insn[0].src_reg = BPF_PSEUDO_MAP_IDX_VALUE; + insn[0].imm = relo->map_idx; + } else if (map->autocreate) { + insn[0].src_reg = BPF_PSEUDO_MAP_VALUE; + insn[0].imm = map->fd; + } else { + poison_map_ldimm64(prog, i, relo->insn_idx, insn, + relo->map_idx, map); + } + break; + case RELO_EXTERN_VAR: + ext = &obj->externs[relo->sym_off]; + if (ext->type == EXT_KCFG) { + if (obj->gen_loader) { + insn[0].src_reg = BPF_PSEUDO_MAP_IDX_VALUE; + insn[0].imm = obj->kconfig_map_idx; + } else { + insn[0].src_reg = BPF_PSEUDO_MAP_VALUE; + insn[0].imm = obj->maps[obj->kconfig_map_idx].fd; + } + insn[1].imm = ext->kcfg.data_off; + } else /* EXT_KSYM */ { + if (ext->ksym.type_id && ext->is_set) { /* typed ksyms */ + insn[0].src_reg = BPF_PSEUDO_BTF_ID; + insn[0].imm = ext->ksym.kernel_btf_id; + insn[1].imm = ext->ksym.kernel_btf_obj_fd; + } else { /* typeless ksyms or unresolved typed ksyms */ + insn[0].imm = (__u32)ext->ksym.addr; + insn[1].imm = ext->ksym.addr >> 32; + } + } + break; + case RELO_EXTERN_FUNC: + ext = &obj->externs[relo->sym_off]; + insn[0].src_reg = BPF_PSEUDO_KFUNC_CALL; + if (ext->is_set) { + insn[0].imm = ext->ksym.kernel_btf_id; + insn[0].off = ext->ksym.btf_fd_idx; + } else { /* unresolved weak kfunc */ + insn[0].imm = 0; + insn[0].off = 0; + } + break; + case RELO_SUBPROG_ADDR: + if (insn[0].src_reg != BPF_PSEUDO_FUNC) { + pr_warn("prog '%s': relo #%d: bad insn\n", + prog->name, i); + return -EINVAL; + } + /* handled already */ + break; + case RELO_CALL: + /* handled already */ + break; + case RELO_CORE: + /* will be handled by bpf_program_record_relos() */ + break; + default: + pr_warn("prog '%s': relo #%d: bad relo type %d\n", + prog->name, i, relo->type); + return -EINVAL; + } + } + + return 0; +} + +static int adjust_prog_btf_ext_info(const struct bpf_object *obj, + const struct bpf_program *prog, + const struct btf_ext_info *ext_info, + void **prog_info, __u32 *prog_rec_cnt, + __u32 *prog_rec_sz) +{ + void *copy_start = NULL, *copy_end = NULL; + void *rec, *rec_end, *new_prog_info; + const struct btf_ext_info_sec *sec; + size_t old_sz, new_sz; + int i, sec_num, sec_idx, off_adj; + + sec_num = 0; + for_each_btf_ext_sec(ext_info, sec) { + sec_idx = ext_info->sec_idxs[sec_num]; + sec_num++; + if (prog->sec_idx != sec_idx) + continue; + + for_each_btf_ext_rec(ext_info, sec, i, rec) { + __u32 insn_off = *(__u32 *)rec / BPF_INSN_SZ; + + if (insn_off < prog->sec_insn_off) + continue; + if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt) + break; + + if (!copy_start) + copy_start = rec; + copy_end = rec + ext_info->rec_size; + } + + if (!copy_start) + return -ENOENT; + + /* append func/line info of a given (sub-)program to the main + * program func/line info + */ + old_sz = (size_t)(*prog_rec_cnt) * ext_info->rec_size; + new_sz = old_sz + (copy_end - copy_start); + new_prog_info = realloc(*prog_info, new_sz); + if (!new_prog_info) + return -ENOMEM; + *prog_info = new_prog_info; + *prog_rec_cnt = new_sz / ext_info->rec_size; + memcpy(new_prog_info + old_sz, copy_start, copy_end - copy_start); + + /* Kernel instruction offsets are in units of 8-byte + * instructions, while .BTF.ext instruction offsets generated + * by Clang are in units of bytes. So convert Clang offsets + * into kernel offsets and adjust offset according to program + * relocated position. + */ + off_adj = prog->sub_insn_off - prog->sec_insn_off; + rec = new_prog_info + old_sz; + rec_end = new_prog_info + new_sz; + for (; rec < rec_end; rec += ext_info->rec_size) { + __u32 *insn_off = rec; + + *insn_off = *insn_off / BPF_INSN_SZ + off_adj; + } + *prog_rec_sz = ext_info->rec_size; + return 0; + } + + return -ENOENT; +} + +static int +reloc_prog_func_and_line_info(const struct bpf_object *obj, + struct bpf_program *main_prog, + const struct bpf_program *prog) +{ + int err; + + /* no .BTF.ext relocation if .BTF.ext is missing or kernel doesn't + * supprot func/line info + */ + if (!obj->btf_ext || !kernel_supports(obj, FEAT_BTF_FUNC)) + return 0; + + /* only attempt func info relocation if main program's func_info + * relocation was successful + */ + if (main_prog != prog && !main_prog->func_info) + goto line_info; + + err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info, + &main_prog->func_info, + &main_prog->func_info_cnt, + &main_prog->func_info_rec_size); + if (err) { + if (err != -ENOENT) { + pr_warn("prog '%s': error relocating .BTF.ext function info: %d\n", + prog->name, err); + return err; + } + if (main_prog->func_info) { + /* + * Some info has already been found but has problem + * in the last btf_ext reloc. Must have to error out. + */ + pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name); + return err; + } + /* Have problem loading the very first info. Ignore the rest. */ + pr_warn("prog '%s': missing .BTF.ext function info for the main program, skipping all of .BTF.ext func info.\n", + prog->name); + } + +line_info: + /* don't relocate line info if main program's relocation failed */ + if (main_prog != prog && !main_prog->line_info) + return 0; + + err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info, + &main_prog->line_info, + &main_prog->line_info_cnt, + &main_prog->line_info_rec_size); + if (err) { + if (err != -ENOENT) { + pr_warn("prog '%s': error relocating .BTF.ext line info: %d\n", + prog->name, err); + return err; + } + if (main_prog->line_info) { + /* + * Some info has already been found but has problem + * in the last btf_ext reloc. Must have to error out. + */ + pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name); + return err; + } + /* Have problem loading the very first info. Ignore the rest. */ + pr_warn("prog '%s': missing .BTF.ext line info for the main program, skipping all of .BTF.ext line info.\n", + prog->name); + } + return 0; +} + +static int cmp_relo_by_insn_idx(const void *key, const void *elem) +{ + size_t insn_idx = *(const size_t *)key; + const struct reloc_desc *relo = elem; + + if (insn_idx == relo->insn_idx) + return 0; + return insn_idx < relo->insn_idx ? -1 : 1; +} + +static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) +{ + if (!prog->nr_reloc) + return NULL; + return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc, + sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx); +} + +static int append_subprog_relos(struct bpf_program *main_prog, struct bpf_program *subprog) +{ + int new_cnt = main_prog->nr_reloc + subprog->nr_reloc; + struct reloc_desc *relos; + int i; + + if (main_prog == subprog) + return 0; + relos = libbpf_reallocarray(main_prog->reloc_desc, new_cnt, sizeof(*relos)); + if (!relos) + return -ENOMEM; + if (subprog->nr_reloc) + memcpy(relos + main_prog->nr_reloc, subprog->reloc_desc, + sizeof(*relos) * subprog->nr_reloc); + + for (i = main_prog->nr_reloc; i < new_cnt; i++) + relos[i].insn_idx += subprog->sub_insn_off; + /* After insn_idx adjustment the 'relos' array is still sorted + * by insn_idx and doesn't break bsearch. + */ + main_prog->reloc_desc = relos; + main_prog->nr_reloc = new_cnt; + return 0; +} + +static int +bpf_object__reloc_code(struct bpf_object *obj, struct bpf_program *main_prog, + struct bpf_program *prog) +{ + size_t sub_insn_idx, insn_idx, new_cnt; + struct bpf_program *subprog; + struct bpf_insn *insns, *insn; + struct reloc_desc *relo; + int err; + + err = reloc_prog_func_and_line_info(obj, main_prog, prog); + if (err) + return err; + + for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) { + insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; + if (!insn_is_subprog_call(insn) && !insn_is_pseudo_func(insn)) + continue; + + relo = find_prog_insn_relo(prog, insn_idx); + if (relo && relo->type == RELO_EXTERN_FUNC) + /* kfunc relocations will be handled later + * in bpf_object__relocate_data() + */ + continue; + if (relo && relo->type != RELO_CALL && relo->type != RELO_SUBPROG_ADDR) { + pr_warn("prog '%s': unexpected relo for insn #%zu, type %d\n", + prog->name, insn_idx, relo->type); + return -LIBBPF_ERRNO__RELOC; + } + if (relo) { + /* sub-program instruction index is a combination of + * an offset of a symbol pointed to by relocation and + * call instruction's imm field; for global functions, + * call always has imm = -1, but for static functions + * relocation is against STT_SECTION and insn->imm + * points to a start of a static function + * + * for subprog addr relocation, the relo->sym_off + insn->imm is + * the byte offset in the corresponding section. + */ + if (relo->type == RELO_CALL) + sub_insn_idx = relo->sym_off / BPF_INSN_SZ + insn->imm + 1; + else + sub_insn_idx = (relo->sym_off + insn->imm) / BPF_INSN_SZ; + } else if (insn_is_pseudo_func(insn)) { + /* + * RELO_SUBPROG_ADDR relo is always emitted even if both + * functions are in the same section, so it shouldn't reach here. + */ + pr_warn("prog '%s': missing subprog addr relo for insn #%zu\n", + prog->name, insn_idx); + return -LIBBPF_ERRNO__RELOC; + } else { + /* if subprogram call is to a static function within + * the same ELF section, there won't be any relocation + * emitted, but it also means there is no additional + * offset necessary, insns->imm is relative to + * instruction's original position within the section + */ + sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1; + } + + /* we enforce that sub-programs should be in .text section */ + subprog = find_prog_by_sec_insn(obj, obj->efile.text_shndx, sub_insn_idx); + if (!subprog) { + pr_warn("prog '%s': no .text section found yet sub-program call exists\n", + prog->name); + return -LIBBPF_ERRNO__RELOC; + } + + /* if it's the first call instruction calling into this + * subprogram (meaning this subprog hasn't been processed + * yet) within the context of current main program: + * - append it at the end of main program's instructions blog; + * - process is recursively, while current program is put on hold; + * - if that subprogram calls some other not yet processes + * subprogram, same thing will happen recursively until + * there are no more unprocesses subprograms left to append + * and relocate. + */ + if (subprog->sub_insn_off == 0) { + subprog->sub_insn_off = main_prog->insns_cnt; + + new_cnt = main_prog->insns_cnt + subprog->insns_cnt; + insns = libbpf_reallocarray(main_prog->insns, new_cnt, sizeof(*insns)); + if (!insns) { + pr_warn("prog '%s': failed to realloc prog code\n", main_prog->name); + return -ENOMEM; + } + main_prog->insns = insns; + main_prog->insns_cnt = new_cnt; + + memcpy(main_prog->insns + subprog->sub_insn_off, subprog->insns, + subprog->insns_cnt * sizeof(*insns)); + + pr_debug("prog '%s': added %zu insns from sub-prog '%s'\n", + main_prog->name, subprog->insns_cnt, subprog->name); + + /* The subprog insns are now appended. Append its relos too. */ + err = append_subprog_relos(main_prog, subprog); + if (err) + return err; + err = bpf_object__reloc_code(obj, main_prog, subprog); + if (err) + return err; + } + + /* main_prog->insns memory could have been re-allocated, so + * calculate pointer again + */ + insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; + /* calculate correct instruction position within current main + * prog; each main prog can have a different set of + * subprograms appended (potentially in different order as + * well), so position of any subprog can be different for + * different main programs + */ + insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1; + + pr_debug("prog '%s': insn #%zu relocated, imm %d points to subprog '%s' (now at %zu offset)\n", + prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off); + } + + return 0; +} + +/* + * Relocate sub-program calls. + * + * Algorithm operates as follows. Each entry-point BPF program (referred to as + * main prog) is processed separately. For each subprog (non-entry functions, + * that can be called from either entry progs or other subprogs) gets their + * sub_insn_off reset to zero. This serves as indicator that this subprogram + * hasn't been yet appended and relocated within current main prog. Once its + * relocated, sub_insn_off will point at the position within current main prog + * where given subprog was appended. This will further be used to relocate all + * the call instructions jumping into this subprog. + * + * We start with main program and process all call instructions. If the call + * is into a subprog that hasn't been processed (i.e., subprog->sub_insn_off + * is zero), subprog instructions are appended at the end of main program's + * instruction array. Then main program is "put on hold" while we recursively + * process newly appended subprogram. If that subprogram calls into another + * subprogram that hasn't been appended, new subprogram is appended again to + * the *main* prog's instructions (subprog's instructions are always left + * untouched, as they need to be in unmodified state for subsequent main progs + * and subprog instructions are always sent only as part of a main prog) and + * the process continues recursively. Once all the subprogs called from a main + * prog or any of its subprogs are appended (and relocated), all their + * positions within finalized instructions array are known, so it's easy to + * rewrite call instructions with correct relative offsets, corresponding to + * desired target subprog. + * + * Its important to realize that some subprogs might not be called from some + * main prog and any of its called/used subprogs. Those will keep their + * subprog->sub_insn_off as zero at all times and won't be appended to current + * main prog and won't be relocated within the context of current main prog. + * They might still be used from other main progs later. + * + * Visually this process can be shown as below. Suppose we have two main + * programs mainA and mainB and BPF object contains three subprogs: subA, + * subB, and subC. mainA calls only subA, mainB calls only subC, but subA and + * subC both call subB: + * + * +--------+ +-------+ + * | v v | + * +--+---+ +--+-+-+ +---+--+ + * | subA | | subB | | subC | + * +--+---+ +------+ +---+--+ + * ^ ^ + * | | + * +---+-------+ +------+----+ + * | mainA | | mainB | + * +-----------+ +-----------+ + * + * We'll start relocating mainA, will find subA, append it and start + * processing sub A recursively: + * + * +-----------+------+ + * | mainA | subA | + * +-----------+------+ + * + * At this point we notice that subB is used from subA, so we append it and + * relocate (there are no further subcalls from subB): + * + * +-----------+------+------+ + * | mainA | subA | subB | + * +-----------+------+------+ + * + * At this point, we relocate subA calls, then go one level up and finish with + * relocatin mainA calls. mainA is done. + * + * For mainB process is similar but results in different order. We start with + * mainB and skip subA and subB, as mainB never calls them (at least + * directly), but we see subC is needed, so we append and start processing it: + * + * +-----------+------+ + * | mainB | subC | + * +-----------+------+ + * Now we see subC needs subB, so we go back to it, append and relocate it: + * + * +-----------+------+------+ + * | mainB | subC | subB | + * +-----------+------+------+ + * + * At this point we unwind recursion, relocate calls in subC, then in mainB. + */ +static int +bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog) +{ + struct bpf_program *subprog; + int i, err; + + /* mark all subprogs as not relocated (yet) within the context of + * current main program + */ + for (i = 0; i < obj->nr_programs; i++) { + subprog = &obj->programs[i]; + if (!prog_is_subprog(obj, subprog)) + continue; + + subprog->sub_insn_off = 0; + } + + err = bpf_object__reloc_code(obj, prog, prog); + if (err) + return err; + + return 0; +} + +static void +bpf_object__free_relocs(struct bpf_object *obj) +{ + struct bpf_program *prog; + int i; + + /* free up relocation descriptors */ + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + zfree(&prog->reloc_desc); + prog->nr_reloc = 0; + } +} + +static int cmp_relocs(const void *_a, const void *_b) +{ + const struct reloc_desc *a = _a; + const struct reloc_desc *b = _b; + + if (a->insn_idx != b->insn_idx) + return a->insn_idx < b->insn_idx ? -1 : 1; + + /* no two relocations should have the same insn_idx, but ... */ + if (a->type != b->type) + return a->type < b->type ? -1 : 1; + + return 0; +} + +static void bpf_object__sort_relos(struct bpf_object *obj) +{ + int i; + + for (i = 0; i < obj->nr_programs; i++) { + struct bpf_program *p = &obj->programs[i]; + + if (!p->nr_reloc) + continue; + + qsort(p->reloc_desc, p->nr_reloc, sizeof(*p->reloc_desc), cmp_relocs); + } +} + +static int +bpf_object__relocate(struct bpf_object *obj, const char *targ_btf_path) +{ + struct bpf_program *prog; + size_t i, j; + int err; + + if (obj->btf_ext) { + err = bpf_object__relocate_core(obj, targ_btf_path); + if (err) { + pr_warn("failed to perform CO-RE relocations: %d\n", + err); + return err; + } + bpf_object__sort_relos(obj); + } + + /* Before relocating calls pre-process relocations and mark + * few ld_imm64 instructions that points to subprogs. + * Otherwise bpf_object__reloc_code() later would have to consider + * all ld_imm64 insns as relocation candidates. That would + * reduce relocation speed, since amount of find_prog_insn_relo() + * would increase and most of them will fail to find a relo. + */ + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + for (j = 0; j < prog->nr_reloc; j++) { + struct reloc_desc *relo = &prog->reloc_desc[j]; + struct bpf_insn *insn = &prog->insns[relo->insn_idx]; + + /* mark the insn, so it's recognized by insn_is_pseudo_func() */ + if (relo->type == RELO_SUBPROG_ADDR) + insn[0].src_reg = BPF_PSEUDO_FUNC; + } + } + + /* relocate subprogram calls and append used subprograms to main + * programs; each copy of subprogram code needs to be relocated + * differently for each main program, because its code location might + * have changed. + * Append subprog relos to main programs to allow data relos to be + * processed after text is completely relocated. + */ + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + /* sub-program's sub-calls are relocated within the context of + * its main program only + */ + if (prog_is_subprog(obj, prog)) + continue; + if (!prog->autoload) + continue; + + err = bpf_object__relocate_calls(obj, prog); + if (err) { + pr_warn("prog '%s': failed to relocate calls: %d\n", + prog->name, err); + return err; + } + } + /* Process data relos for main programs */ + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + if (prog_is_subprog(obj, prog)) + continue; + if (!prog->autoload) + continue; + err = bpf_object__relocate_data(obj, prog); + if (err) { + pr_warn("prog '%s': failed to relocate data references: %d\n", + prog->name, err); + return err; + } + } + + return 0; +} + +static int bpf_object__collect_st_ops_relos(struct bpf_object *obj, + Elf64_Shdr *shdr, Elf_Data *data); + +static int bpf_object__collect_map_relos(struct bpf_object *obj, + Elf64_Shdr *shdr, Elf_Data *data) +{ + const int bpf_ptr_sz = 8, host_ptr_sz = sizeof(void *); + int i, j, nrels, new_sz; + const struct btf_var_secinfo *vi = NULL; + const struct btf_type *sec, *var, *def; + struct bpf_map *map = NULL, *targ_map = NULL; + struct bpf_program *targ_prog = NULL; + bool is_prog_array, is_map_in_map; + const struct btf_member *member; + const char *name, *mname, *type; + unsigned int moff; + Elf64_Sym *sym; + Elf64_Rel *rel; + void *tmp; + + if (!obj->efile.btf_maps_sec_btf_id || !obj->btf) + return -EINVAL; + sec = btf__type_by_id(obj->btf, obj->efile.btf_maps_sec_btf_id); + if (!sec) + return -EINVAL; + + nrels = shdr->sh_size / shdr->sh_entsize; + for (i = 0; i < nrels; i++) { + rel = elf_rel_by_idx(data, i); + if (!rel) { + pr_warn(".maps relo #%d: failed to get ELF relo\n", i); + return -LIBBPF_ERRNO__FORMAT; + } + + sym = elf_sym_by_idx(obj, ELF64_R_SYM(rel->r_info)); + if (!sym) { + pr_warn(".maps relo #%d: symbol %zx not found\n", + i, (size_t)ELF64_R_SYM(rel->r_info)); + return -LIBBPF_ERRNO__FORMAT; + } + name = elf_sym_str(obj, sym->st_name) ?: ""; + + pr_debug(".maps relo #%d: for %zd value %zd rel->r_offset %zu name %d ('%s')\n", + i, (ssize_t)(rel->r_info >> 32), (size_t)sym->st_value, + (size_t)rel->r_offset, sym->st_name, name); + + for (j = 0; j < obj->nr_maps; j++) { + map = &obj->maps[j]; + if (map->sec_idx != obj->efile.btf_maps_shndx) + continue; + + vi = btf_var_secinfos(sec) + map->btf_var_idx; + if (vi->offset <= rel->r_offset && + rel->r_offset + bpf_ptr_sz <= vi->offset + vi->size) + break; + } + if (j == obj->nr_maps) { + pr_warn(".maps relo #%d: cannot find map '%s' at rel->r_offset %zu\n", + i, name, (size_t)rel->r_offset); + return -EINVAL; + } + + is_map_in_map = bpf_map_type__is_map_in_map(map->def.type); + is_prog_array = map->def.type == BPF_MAP_TYPE_PROG_ARRAY; + type = is_map_in_map ? "map" : "prog"; + if (is_map_in_map) { + if (sym->st_shndx != obj->efile.btf_maps_shndx) { + pr_warn(".maps relo #%d: '%s' isn't a BTF-defined map\n", + i, name); + return -LIBBPF_ERRNO__RELOC; + } + if (map->def.type == BPF_MAP_TYPE_HASH_OF_MAPS && + map->def.key_size != sizeof(int)) { + pr_warn(".maps relo #%d: hash-of-maps '%s' should have key size %zu.\n", + i, map->name, sizeof(int)); + return -EINVAL; + } + targ_map = bpf_object__find_map_by_name(obj, name); + if (!targ_map) { + pr_warn(".maps relo #%d: '%s' isn't a valid map reference\n", + i, name); + return -ESRCH; + } + } else if (is_prog_array) { + targ_prog = bpf_object__find_program_by_name(obj, name); + if (!targ_prog) { + pr_warn(".maps relo #%d: '%s' isn't a valid program reference\n", + i, name); + return -ESRCH; + } + if (targ_prog->sec_idx != sym->st_shndx || + targ_prog->sec_insn_off * 8 != sym->st_value || + prog_is_subprog(obj, targ_prog)) { + pr_warn(".maps relo #%d: '%s' isn't an entry-point program\n", + i, name); + return -LIBBPF_ERRNO__RELOC; + } + } else { + return -EINVAL; + } + + var = btf__type_by_id(obj->btf, vi->type); + def = skip_mods_and_typedefs(obj->btf, var->type, NULL); + if (btf_vlen(def) == 0) + return -EINVAL; + member = btf_members(def) + btf_vlen(def) - 1; + mname = btf__name_by_offset(obj->btf, member->name_off); + if (strcmp(mname, "values")) + return -EINVAL; + + moff = btf_member_bit_offset(def, btf_vlen(def) - 1) / 8; + if (rel->r_offset - vi->offset < moff) + return -EINVAL; + + moff = rel->r_offset - vi->offset - moff; + /* here we use BPF pointer size, which is always 64 bit, as we + * are parsing ELF that was built for BPF target + */ + if (moff % bpf_ptr_sz) + return -EINVAL; + moff /= bpf_ptr_sz; + if (moff >= map->init_slots_sz) { + new_sz = moff + 1; + tmp = libbpf_reallocarray(map->init_slots, new_sz, host_ptr_sz); + if (!tmp) + return -ENOMEM; + map->init_slots = tmp; + memset(map->init_slots + map->init_slots_sz, 0, + (new_sz - map->init_slots_sz) * host_ptr_sz); + map->init_slots_sz = new_sz; + } + map->init_slots[moff] = is_map_in_map ? (void *)targ_map : (void *)targ_prog; + + pr_debug(".maps relo #%d: map '%s' slot [%d] points to %s '%s'\n", + i, map->name, moff, type, name); + } + + return 0; +} + +static int bpf_object__collect_relos(struct bpf_object *obj) +{ + int i, err; + + for (i = 0; i < obj->efile.sec_cnt; i++) { + struct elf_sec_desc *sec_desc = &obj->efile.secs[i]; + Elf64_Shdr *shdr; + Elf_Data *data; + int idx; + + if (sec_desc->sec_type != SEC_RELO) + continue; + + shdr = sec_desc->shdr; + data = sec_desc->data; + idx = shdr->sh_info; + + if (shdr->sh_type != SHT_REL) { + pr_warn("internal error at %d\n", __LINE__); + return -LIBBPF_ERRNO__INTERNAL; + } + + if (idx == obj->efile.st_ops_shndx) + err = bpf_object__collect_st_ops_relos(obj, shdr, data); + else if (idx == obj->efile.btf_maps_shndx) + err = bpf_object__collect_map_relos(obj, shdr, data); + else + err = bpf_object__collect_prog_relos(obj, shdr, data); + if (err) + return err; + } + + bpf_object__sort_relos(obj); + return 0; +} + +static bool insn_is_helper_call(struct bpf_insn *insn, enum bpf_func_id *func_id) +{ + if (BPF_CLASS(insn->code) == BPF_JMP && + BPF_OP(insn->code) == BPF_CALL && + BPF_SRC(insn->code) == BPF_K && + insn->src_reg == 0 && + insn->dst_reg == 0) { + *func_id = insn->imm; + return true; + } + return false; +} + +static int bpf_object__sanitize_prog(struct bpf_object *obj, struct bpf_program *prog) +{ + struct bpf_insn *insn = prog->insns; + enum bpf_func_id func_id; + int i; + + if (obj->gen_loader) + return 0; + + for (i = 0; i < prog->insns_cnt; i++, insn++) { + if (!insn_is_helper_call(insn, &func_id)) + continue; + + /* on kernels that don't yet support + * bpf_probe_read_{kernel,user}[_str] helpers, fall back + * to bpf_probe_read() which works well for old kernels + */ + switch (func_id) { + case BPF_FUNC_probe_read_kernel: + case BPF_FUNC_probe_read_user: + if (!kernel_supports(obj, FEAT_PROBE_READ_KERN)) + insn->imm = BPF_FUNC_probe_read; + break; + case BPF_FUNC_probe_read_kernel_str: + case BPF_FUNC_probe_read_user_str: + if (!kernel_supports(obj, FEAT_PROBE_READ_KERN)) + insn->imm = BPF_FUNC_probe_read_str; + break; + default: + break; + } + } + return 0; +} + +static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name, + int *btf_obj_fd, int *btf_type_id); + +/* this is called as prog->sec_def->prog_prepare_load_fn for libbpf-supported sec_defs */ +static int libbpf_prepare_prog_load(struct bpf_program *prog, + struct bpf_prog_load_opts *opts, long cookie) +{ + enum sec_def_flags def = cookie; + + /* old kernels might not support specifying expected_attach_type */ + if ((def & SEC_EXP_ATTACH_OPT) && !kernel_supports(prog->obj, FEAT_EXP_ATTACH_TYPE)) + opts->expected_attach_type = 0; + + if (def & SEC_SLEEPABLE) + opts->prog_flags |= BPF_F_SLEEPABLE; + + if (prog->type == BPF_PROG_TYPE_XDP && (def & SEC_XDP_FRAGS)) + opts->prog_flags |= BPF_F_XDP_HAS_FRAGS; + + if ((def & SEC_ATTACH_BTF) && !prog->attach_btf_id) { + int btf_obj_fd = 0, btf_type_id = 0, err; + const char *attach_name; + + attach_name = strchr(prog->sec_name, '/'); + if (!attach_name) { + /* if BPF program is annotated with just SEC("fentry") + * (or similar) without declaratively specifying + * target, then it is expected that target will be + * specified with bpf_program__set_attach_target() at + * runtime before BPF object load step. If not, then + * there is nothing to load into the kernel as BPF + * verifier won't be able to validate BPF program + * correctness anyways. + */ + pr_warn("prog '%s': no BTF-based attach target is specified, use bpf_program__set_attach_target()\n", + prog->name); + return -EINVAL; + } + attach_name++; /* skip over / */ + + err = libbpf_find_attach_btf_id(prog, attach_name, &btf_obj_fd, &btf_type_id); + if (err) + return err; + + /* cache resolved BTF FD and BTF type ID in the prog */ + prog->attach_btf_obj_fd = btf_obj_fd; + prog->attach_btf_id = btf_type_id; + + /* but by now libbpf common logic is not utilizing + * prog->atach_btf_obj_fd/prog->attach_btf_id anymore because + * this callback is called after opts were populated by + * libbpf, so this callback has to update opts explicitly here + */ + opts->attach_btf_obj_fd = btf_obj_fd; + opts->attach_btf_id = btf_type_id; + } + return 0; +} + +static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz); + +static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog, + struct bpf_insn *insns, int insns_cnt, + const char *license, __u32 kern_version, int *prog_fd) +{ + LIBBPF_OPTS(bpf_prog_load_opts, load_attr); + const char *prog_name = NULL; + char *cp, errmsg[STRERR_BUFSIZE]; + size_t log_buf_size = 0; + char *log_buf = NULL, *tmp; + int btf_fd, ret, err; + bool own_log_buf = true; + __u32 log_level = prog->log_level; + + if (prog->type == BPF_PROG_TYPE_UNSPEC) { + /* + * The program type must be set. Most likely we couldn't find a proper + * section definition at load time, and thus we didn't infer the type. + */ + pr_warn("prog '%s': missing BPF prog type, check ELF section name '%s'\n", + prog->name, prog->sec_name); + return -EINVAL; + } + + if (!insns || !insns_cnt) + return -EINVAL; + + load_attr.expected_attach_type = prog->expected_attach_type; + if (kernel_supports(obj, FEAT_PROG_NAME)) + prog_name = prog->name; + load_attr.attach_prog_fd = prog->attach_prog_fd; + load_attr.attach_btf_obj_fd = prog->attach_btf_obj_fd; + load_attr.attach_btf_id = prog->attach_btf_id; + load_attr.kern_version = kern_version; + load_attr.prog_ifindex = prog->prog_ifindex; + + /* specify func_info/line_info only if kernel supports them */ + btf_fd = bpf_object__btf_fd(obj); + if (btf_fd >= 0 && kernel_supports(obj, FEAT_BTF_FUNC)) { + load_attr.prog_btf_fd = btf_fd; + load_attr.func_info = prog->func_info; + load_attr.func_info_rec_size = prog->func_info_rec_size; + load_attr.func_info_cnt = prog->func_info_cnt; + load_attr.line_info = prog->line_info; + load_attr.line_info_rec_size = prog->line_info_rec_size; + load_attr.line_info_cnt = prog->line_info_cnt; + } + load_attr.log_level = log_level; + load_attr.prog_flags = prog->prog_flags; + load_attr.fd_array = obj->fd_array; + + /* adjust load_attr if sec_def provides custom preload callback */ + if (prog->sec_def && prog->sec_def->prog_prepare_load_fn) { + err = prog->sec_def->prog_prepare_load_fn(prog, &load_attr, prog->sec_def->cookie); + if (err < 0) { + pr_warn("prog '%s': failed to prepare load attributes: %d\n", + prog->name, err); + return err; + } + insns = prog->insns; + insns_cnt = prog->insns_cnt; + } + + if (obj->gen_loader) { + bpf_gen__prog_load(obj->gen_loader, prog->type, prog->name, + license, insns, insns_cnt, &load_attr, + prog - obj->programs); + *prog_fd = -1; + return 0; + } + +retry_load: + /* if log_level is zero, we don't request logs initially even if + * custom log_buf is specified; if the program load fails, then we'll + * bump log_level to 1 and use either custom log_buf or we'll allocate + * our own and retry the load to get details on what failed + */ + if (log_level) { + if (prog->log_buf) { + log_buf = prog->log_buf; + log_buf_size = prog->log_size; + own_log_buf = false; + } else if (obj->log_buf) { + log_buf = obj->log_buf; + log_buf_size = obj->log_size; + own_log_buf = false; + } else { + log_buf_size = max((size_t)BPF_LOG_BUF_SIZE, log_buf_size * 2); + tmp = realloc(log_buf, log_buf_size); + if (!tmp) { + ret = -ENOMEM; + goto out; + } + log_buf = tmp; + log_buf[0] = '\0'; + own_log_buf = true; + } + } + + load_attr.log_buf = log_buf; + load_attr.log_size = log_buf_size; + load_attr.log_level = log_level; + + ret = bpf_prog_load(prog->type, prog_name, license, insns, insns_cnt, &load_attr); + if (ret >= 0) { + if (log_level && own_log_buf) { + pr_debug("prog '%s': -- BEGIN PROG LOAD LOG --\n%s-- END PROG LOAD LOG --\n", + prog->name, log_buf); + } + + if (obj->has_rodata && kernel_supports(obj, FEAT_PROG_BIND_MAP)) { + struct bpf_map *map; + int i; + + for (i = 0; i < obj->nr_maps; i++) { + map = &prog->obj->maps[i]; + if (map->libbpf_type != LIBBPF_MAP_RODATA) + continue; + + if (bpf_prog_bind_map(ret, bpf_map__fd(map), NULL)) { + cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); + pr_warn("prog '%s': failed to bind map '%s': %s\n", + prog->name, map->real_name, cp); + /* Don't fail hard if can't bind rodata. */ + } + } + } + + *prog_fd = ret; + ret = 0; + goto out; + } + + if (log_level == 0) { + log_level = 1; + goto retry_load; + } + /* On ENOSPC, increase log buffer size and retry, unless custom + * log_buf is specified. + * Be careful to not overflow u32, though. Kernel's log buf size limit + * isn't part of UAPI so it can always be bumped to full 4GB. So don't + * multiply by 2 unless we are sure we'll fit within 32 bits. + * Currently, we'll get -EINVAL when we reach (UINT_MAX >> 2). + */ + if (own_log_buf && errno == ENOSPC && log_buf_size <= UINT_MAX / 2) + goto retry_load; + + ret = -errno; + + /* post-process verifier log to improve error descriptions */ + fixup_verifier_log(prog, log_buf, log_buf_size); + + cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); + pr_warn("prog '%s': BPF program load failed: %s\n", prog->name, cp); + pr_perm_msg(ret); + + if (own_log_buf && log_buf && log_buf[0] != '\0') { + pr_warn("prog '%s': -- BEGIN PROG LOAD LOG --\n%s-- END PROG LOAD LOG --\n", + prog->name, log_buf); + } + +out: + if (own_log_buf) + free(log_buf); + return ret; +} + +static char *find_prev_line(char *buf, char *cur) +{ + char *p; + + if (cur == buf) /* end of a log buf */ + return NULL; + + p = cur - 1; + while (p - 1 >= buf && *(p - 1) != '\n') + p--; + + return p; +} + +static void patch_log(char *buf, size_t buf_sz, size_t log_sz, + char *orig, size_t orig_sz, const char *patch) +{ + /* size of the remaining log content to the right from the to-be-replaced part */ + size_t rem_sz = (buf + log_sz) - (orig + orig_sz); + size_t patch_sz = strlen(patch); + + if (patch_sz != orig_sz) { + /* If patch line(s) are longer than original piece of verifier log, + * shift log contents by (patch_sz - orig_sz) bytes to the right + * starting from after to-be-replaced part of the log. + * + * If patch line(s) are shorter than original piece of verifier log, + * shift log contents by (orig_sz - patch_sz) bytes to the left + * starting from after to-be-replaced part of the log + * + * We need to be careful about not overflowing available + * buf_sz capacity. If that's the case, we'll truncate the end + * of the original log, as necessary. + */ + if (patch_sz > orig_sz) { + if (orig + patch_sz >= buf + buf_sz) { + /* patch is big enough to cover remaining space completely */ + patch_sz -= (orig + patch_sz) - (buf + buf_sz) + 1; + rem_sz = 0; + } else if (patch_sz - orig_sz > buf_sz - log_sz) { + /* patch causes part of remaining log to be truncated */ + rem_sz -= (patch_sz - orig_sz) - (buf_sz - log_sz); + } + } + /* shift remaining log to the right by calculated amount */ + memmove(orig + patch_sz, orig + orig_sz, rem_sz); + } + + memcpy(orig, patch, patch_sz); +} + +static void fixup_log_failed_core_relo(struct bpf_program *prog, + char *buf, size_t buf_sz, size_t log_sz, + char *line1, char *line2, char *line3) +{ + /* Expected log for failed and not properly guarded CO-RE relocation: + * line1 -> 123: (85) call unknown#195896080 + * line2 -> invalid func unknown#195896080 + * line3 -> + * + * "123" is the index of the instruction that was poisoned. We extract + * instruction index to find corresponding CO-RE relocation and + * replace this part of the log with more relevant information about + * failed CO-RE relocation. + */ + const struct bpf_core_relo *relo; + struct bpf_core_spec spec; + char patch[512], spec_buf[256]; + int insn_idx, err, spec_len; + + if (sscanf(line1, "%d: (%*d) call unknown#195896080\n", &insn_idx) != 1) + return; + + relo = find_relo_core(prog, insn_idx); + if (!relo) + return; + + err = bpf_core_parse_spec(prog->name, prog->obj->btf, relo, &spec); + if (err) + return; + + spec_len = bpf_core_format_spec(spec_buf, sizeof(spec_buf), &spec); + snprintf(patch, sizeof(patch), + "%d: \n" + "failed to resolve CO-RE relocation %s%s\n", + insn_idx, spec_buf, spec_len >= sizeof(spec_buf) ? "..." : ""); + + patch_log(buf, buf_sz, log_sz, line1, line3 - line1, patch); +} + +static void fixup_log_missing_map_load(struct bpf_program *prog, + char *buf, size_t buf_sz, size_t log_sz, + char *line1, char *line2, char *line3) +{ + /* Expected log for failed and not properly guarded CO-RE relocation: + * line1 -> 123: (85) call unknown#2001000345 + * line2 -> invalid func unknown#2001000345 + * line3 -> + * + * "123" is the index of the instruction that was poisoned. + * "345" in "2001000345" are map index in obj->maps to fetch map name. + */ + struct bpf_object *obj = prog->obj; + const struct bpf_map *map; + int insn_idx, map_idx; + char patch[128]; + + if (sscanf(line1, "%d: (%*d) call unknown#%d\n", &insn_idx, &map_idx) != 2) + return; + + map_idx -= MAP_LDIMM64_POISON_BASE; + if (map_idx < 0 || map_idx >= obj->nr_maps) + return; + map = &obj->maps[map_idx]; + + snprintf(patch, sizeof(patch), + "%d: \n" + "BPF map '%s' is referenced but wasn't created\n", + insn_idx, map->name); + + patch_log(buf, buf_sz, log_sz, line1, line3 - line1, patch); +} + +static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz) +{ + /* look for familiar error patterns in last N lines of the log */ + const size_t max_last_line_cnt = 10; + char *prev_line, *cur_line, *next_line; + size_t log_sz; + int i; + + if (!buf) + return; + + log_sz = strlen(buf) + 1; + next_line = buf + log_sz - 1; + + for (i = 0; i < max_last_line_cnt; i++, next_line = cur_line) { + cur_line = find_prev_line(buf, next_line); + if (!cur_line) + return; + + /* failed CO-RE relocation case */ + if (str_has_pfx(cur_line, "invalid func unknown#195896080\n")) { + prev_line = find_prev_line(buf, cur_line); + if (!prev_line) + continue; + + fixup_log_failed_core_relo(prog, buf, buf_sz, log_sz, + prev_line, cur_line, next_line); + return; + } else if (str_has_pfx(cur_line, "invalid func unknown#"MAP_LDIMM64_POISON_PFX)) { + prev_line = find_prev_line(buf, cur_line); + if (!prev_line) + continue; + + fixup_log_missing_map_load(prog, buf, buf_sz, log_sz, + prev_line, cur_line, next_line); + return; + } + } +} + +static int bpf_program_record_relos(struct bpf_program *prog) +{ + struct bpf_object *obj = prog->obj; + int i; + + for (i = 0; i < prog->nr_reloc; i++) { + struct reloc_desc *relo = &prog->reloc_desc[i]; + struct extern_desc *ext = &obj->externs[relo->sym_off]; + + switch (relo->type) { + case RELO_EXTERN_VAR: + if (ext->type != EXT_KSYM) + continue; + bpf_gen__record_extern(obj->gen_loader, ext->name, + ext->is_weak, !ext->ksym.type_id, + BTF_KIND_VAR, relo->insn_idx); + break; + case RELO_EXTERN_FUNC: + bpf_gen__record_extern(obj->gen_loader, ext->name, + ext->is_weak, false, BTF_KIND_FUNC, + relo->insn_idx); + break; + case RELO_CORE: { + struct bpf_core_relo cr = { + .insn_off = relo->insn_idx * 8, + .type_id = relo->core_relo->type_id, + .access_str_off = relo->core_relo->access_str_off, + .kind = relo->core_relo->kind, + }; + + bpf_gen__record_relo_core(obj->gen_loader, &cr); + break; + } + default: + continue; + } + } + return 0; +} + +static int +bpf_object__load_progs(struct bpf_object *obj, int log_level) +{ + struct bpf_program *prog; + size_t i; + int err; + + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + err = bpf_object__sanitize_prog(obj, prog); + if (err) + return err; + } + + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + if (prog_is_subprog(obj, prog)) + continue; + if (!prog->autoload) { + pr_debug("prog '%s': skipped loading\n", prog->name); + continue; + } + prog->log_level |= log_level; + + if (obj->gen_loader) + bpf_program_record_relos(prog); + + err = bpf_object_load_prog(obj, prog, prog->insns, prog->insns_cnt, + obj->license, obj->kern_version, &prog->fd); + if (err) { + pr_warn("prog '%s': failed to load: %d\n", prog->name, err); + return err; + } + } + + bpf_object__free_relocs(obj); + return 0; +} + +static const struct bpf_sec_def *find_sec_def(const char *sec_name); + +static int bpf_object_init_progs(struct bpf_object *obj, const struct bpf_object_open_opts *opts) +{ + struct bpf_program *prog; + int err; + + bpf_object__for_each_program(prog, obj) { + prog->sec_def = find_sec_def(prog->sec_name); + if (!prog->sec_def) { + /* couldn't guess, but user might manually specify */ + pr_debug("prog '%s': unrecognized ELF section name '%s'\n", + prog->name, prog->sec_name); + continue; + } + + prog->type = prog->sec_def->prog_type; + prog->expected_attach_type = prog->sec_def->expected_attach_type; + + /* sec_def can have custom callback which should be called + * after bpf_program is initialized to adjust its properties + */ + if (prog->sec_def->prog_setup_fn) { + err = prog->sec_def->prog_setup_fn(prog, prog->sec_def->cookie); + if (err < 0) { + pr_warn("prog '%s': failed to initialize: %d\n", + prog->name, err); + return err; + } + } + } + + return 0; +} + +static struct bpf_object *bpf_object_open(const char *path, const void *obj_buf, size_t obj_buf_sz, + const struct bpf_object_open_opts *opts) +{ + const char *obj_name, *kconfig, *btf_tmp_path; + struct bpf_object *obj; + char tmp_name[64]; + int err; + char *log_buf; + size_t log_size; + __u32 log_level; + + if (elf_version(EV_CURRENT) == EV_NONE) { + pr_warn("failed to init libelf for %s\n", + path ? : "(mem buf)"); + return ERR_PTR(-LIBBPF_ERRNO__LIBELF); + } + + if (!OPTS_VALID(opts, bpf_object_open_opts)) + return ERR_PTR(-EINVAL); + + obj_name = OPTS_GET(opts, object_name, NULL); + if (obj_buf) { + if (!obj_name) { + snprintf(tmp_name, sizeof(tmp_name), "%lx-%lx", + (unsigned long)obj_buf, + (unsigned long)obj_buf_sz); + obj_name = tmp_name; + } + path = obj_name; + pr_debug("loading object '%s' from buffer\n", obj_name); + } + + log_buf = OPTS_GET(opts, kernel_log_buf, NULL); + log_size = OPTS_GET(opts, kernel_log_size, 0); + log_level = OPTS_GET(opts, kernel_log_level, 0); + if (log_size > UINT_MAX) + return ERR_PTR(-EINVAL); + if (log_size && !log_buf) + return ERR_PTR(-EINVAL); + + obj = bpf_object__new(path, obj_buf, obj_buf_sz, obj_name); + if (IS_ERR(obj)) + return obj; + + obj->log_buf = log_buf; + obj->log_size = log_size; + obj->log_level = log_level; + + btf_tmp_path = OPTS_GET(opts, btf_custom_path, NULL); + if (btf_tmp_path) { + if (strlen(btf_tmp_path) >= PATH_MAX) { + err = -ENAMETOOLONG; + goto out; + } + obj->btf_custom_path = strdup(btf_tmp_path); + if (!obj->btf_custom_path) { + err = -ENOMEM; + goto out; + } + } + + kconfig = OPTS_GET(opts, kconfig, NULL); + if (kconfig) { + obj->kconfig = strdup(kconfig); + if (!obj->kconfig) { + err = -ENOMEM; + goto out; + } + } + + err = bpf_object__elf_init(obj); + err = err ? : bpf_object__check_endianness(obj); + err = err ? : bpf_object__elf_collect(obj); + err = err ? : bpf_object__collect_externs(obj); + err = err ? : bpf_object_fixup_btf(obj); + err = err ? : bpf_object__init_maps(obj, opts); + err = err ? : bpf_object_init_progs(obj, opts); + err = err ? : bpf_object__collect_relos(obj); + if (err) + goto out; + + bpf_object__elf_finish(obj); + + return obj; +out: + bpf_object__close(obj); + return ERR_PTR(err); +} + +struct bpf_object * +bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts) +{ + if (!path) + return libbpf_err_ptr(-EINVAL); + + pr_debug("loading %s\n", path); + + return libbpf_ptr(bpf_object_open(path, NULL, 0, opts)); +} + +struct bpf_object *bpf_object__open(const char *path) +{ + return bpf_object__open_file(path, NULL); +} + +struct bpf_object * +bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, + const struct bpf_object_open_opts *opts) +{ + if (!obj_buf || obj_buf_sz == 0) + return libbpf_err_ptr(-EINVAL); + + return libbpf_ptr(bpf_object_open(NULL, obj_buf, obj_buf_sz, opts)); +} + +static int bpf_object_unload(struct bpf_object *obj) +{ + size_t i; + + if (!obj) + return libbpf_err(-EINVAL); + + for (i = 0; i < obj->nr_maps; i++) { + zclose(obj->maps[i].fd); + if (obj->maps[i].st_ops) + zfree(&obj->maps[i].st_ops->kern_vdata); + } + + for (i = 0; i < obj->nr_programs; i++) + bpf_program__unload(&obj->programs[i]); + + return 0; +} + +static int bpf_object__sanitize_maps(struct bpf_object *obj) +{ + struct bpf_map *m; + + bpf_object__for_each_map(m, obj) { + if (!bpf_map__is_internal(m)) + continue; + if (!kernel_supports(obj, FEAT_ARRAY_MMAP)) + m->def.map_flags &= ~BPF_F_MMAPABLE; + } + + return 0; +} + +int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *ctx) +{ + char sym_type, sym_name[500]; + unsigned long long sym_addr; + int ret, err = 0; + FILE *f; + + f = fopen("/proc/kallsyms", "r"); + if (!f) { + err = -errno; + pr_warn("failed to open /proc/kallsyms: %d\n", err); + return err; + } + + while (true) { + ret = fscanf(f, "%llx %c %499s%*[^\n]\n", + &sym_addr, &sym_type, sym_name); + if (ret == EOF && feof(f)) + break; + if (ret != 3) { + pr_warn("failed to read kallsyms entry: %d\n", ret); + err = -EINVAL; + break; + } + + err = cb(sym_addr, sym_type, sym_name, ctx); + if (err) + break; + } + + fclose(f); + return err; +} + +static int kallsyms_cb(unsigned long long sym_addr, char sym_type, + const char *sym_name, void *ctx) +{ + struct bpf_object *obj = ctx; + const struct btf_type *t; + struct extern_desc *ext; + + ext = find_extern_by_name(obj, sym_name); + if (!ext || ext->type != EXT_KSYM) + return 0; + + t = btf__type_by_id(obj->btf, ext->btf_id); + if (!btf_is_var(t)) + return 0; + + if (ext->is_set && ext->ksym.addr != sym_addr) { + pr_warn("extern (ksym) '%s': resolution is ambiguous: 0x%llx or 0x%llx\n", + sym_name, ext->ksym.addr, sym_addr); + return -EINVAL; + } + if (!ext->is_set) { + ext->is_set = true; + ext->ksym.addr = sym_addr; + pr_debug("extern (ksym) '%s': set to 0x%llx\n", sym_name, sym_addr); + } + return 0; +} + +static int bpf_object__read_kallsyms_file(struct bpf_object *obj) +{ + return libbpf_kallsyms_parse(kallsyms_cb, obj); +} + +static int find_ksym_btf_id(struct bpf_object *obj, const char *ksym_name, + __u16 kind, struct btf **res_btf, + struct module_btf **res_mod_btf) +{ + struct module_btf *mod_btf; + struct btf *btf; + int i, id, err; + + btf = obj->btf_vmlinux; + mod_btf = NULL; + id = btf__find_by_name_kind(btf, ksym_name, kind); + + if (id == -ENOENT) { + err = load_module_btfs(obj); + if (err) + return err; + + for (i = 0; i < obj->btf_module_cnt; i++) { + /* we assume module_btf's BTF FD is always >0 */ + mod_btf = &obj->btf_modules[i]; + btf = mod_btf->btf; + id = btf__find_by_name_kind_own(btf, ksym_name, kind); + if (id != -ENOENT) + break; + } + } + if (id <= 0) + return -ESRCH; + + *res_btf = btf; + *res_mod_btf = mod_btf; + return id; +} + +static int bpf_object__resolve_ksym_var_btf_id(struct bpf_object *obj, + struct extern_desc *ext) +{ + const struct btf_type *targ_var, *targ_type; + __u32 targ_type_id, local_type_id; + struct module_btf *mod_btf = NULL; + const char *targ_var_name; + struct btf *btf = NULL; + int id, err; + + id = find_ksym_btf_id(obj, ext->name, BTF_KIND_VAR, &btf, &mod_btf); + if (id < 0) { + if (id == -ESRCH && ext->is_weak) + return 0; + pr_warn("extern (var ksym) '%s': not found in kernel BTF\n", + ext->name); + return id; + } + + /* find local type_id */ + local_type_id = ext->ksym.type_id; + + /* find target type_id */ + targ_var = btf__type_by_id(btf, id); + targ_var_name = btf__name_by_offset(btf, targ_var->name_off); + targ_type = skip_mods_and_typedefs(btf, targ_var->type, &targ_type_id); + + err = bpf_core_types_are_compat(obj->btf, local_type_id, + btf, targ_type_id); + if (err <= 0) { + const struct btf_type *local_type; + const char *targ_name, *local_name; + + local_type = btf__type_by_id(obj->btf, local_type_id); + local_name = btf__name_by_offset(obj->btf, local_type->name_off); + targ_name = btf__name_by_offset(btf, targ_type->name_off); + + pr_warn("extern (var ksym) '%s': incompatible types, expected [%d] %s %s, but kernel has [%d] %s %s\n", + ext->name, local_type_id, + btf_kind_str(local_type), local_name, targ_type_id, + btf_kind_str(targ_type), targ_name); + return -EINVAL; + } + + ext->is_set = true; + ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0; + ext->ksym.kernel_btf_id = id; + pr_debug("extern (var ksym) '%s': resolved to [%d] %s %s\n", + ext->name, id, btf_kind_str(targ_var), targ_var_name); + + return 0; +} + +static int bpf_object__resolve_ksym_func_btf_id(struct bpf_object *obj, + struct extern_desc *ext) +{ + int local_func_proto_id, kfunc_proto_id, kfunc_id; + struct module_btf *mod_btf = NULL; + const struct btf_type *kern_func; + struct btf *kern_btf = NULL; + int ret; + + local_func_proto_id = ext->ksym.type_id; + + kfunc_id = find_ksym_btf_id(obj, ext->name, BTF_KIND_FUNC, &kern_btf, &mod_btf); + if (kfunc_id < 0) { + if (kfunc_id == -ESRCH && ext->is_weak) + return 0; + pr_warn("extern (func ksym) '%s': not found in kernel or module BTFs\n", + ext->name); + return kfunc_id; + } + + kern_func = btf__type_by_id(kern_btf, kfunc_id); + kfunc_proto_id = kern_func->type; + + ret = bpf_core_types_are_compat(obj->btf, local_func_proto_id, + kern_btf, kfunc_proto_id); + if (ret <= 0) { + pr_warn("extern (func ksym) '%s': func_proto [%d] incompatible with kernel [%d]\n", + ext->name, local_func_proto_id, kfunc_proto_id); + return -EINVAL; + } + + /* set index for module BTF fd in fd_array, if unset */ + if (mod_btf && !mod_btf->fd_array_idx) { + /* insn->off is s16 */ + if (obj->fd_array_cnt == INT16_MAX) { + pr_warn("extern (func ksym) '%s': module BTF fd index %d too big to fit in bpf_insn offset\n", + ext->name, mod_btf->fd_array_idx); + return -E2BIG; + } + /* Cannot use index 0 for module BTF fd */ + if (!obj->fd_array_cnt) + obj->fd_array_cnt = 1; + + ret = libbpf_ensure_mem((void **)&obj->fd_array, &obj->fd_array_cap, sizeof(int), + obj->fd_array_cnt + 1); + if (ret) + return ret; + mod_btf->fd_array_idx = obj->fd_array_cnt; + /* we assume module BTF FD is always >0 */ + obj->fd_array[obj->fd_array_cnt++] = mod_btf->fd; + } + + ext->is_set = true; + ext->ksym.kernel_btf_id = kfunc_id; + ext->ksym.btf_fd_idx = mod_btf ? mod_btf->fd_array_idx : 0; + pr_debug("extern (func ksym) '%s': resolved to kernel [%d]\n", + ext->name, kfunc_id); + + return 0; +} + +static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj) +{ + const struct btf_type *t; + struct extern_desc *ext; + int i, err; + + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type != EXT_KSYM || !ext->ksym.type_id) + continue; + + if (obj->gen_loader) { + ext->is_set = true; + ext->ksym.kernel_btf_obj_fd = 0; + ext->ksym.kernel_btf_id = 0; + continue; + } + t = btf__type_by_id(obj->btf, ext->btf_id); + if (btf_is_var(t)) + err = bpf_object__resolve_ksym_var_btf_id(obj, ext); + else + err = bpf_object__resolve_ksym_func_btf_id(obj, ext); + if (err) + return err; + } + return 0; +} + +static int bpf_object__resolve_externs(struct bpf_object *obj, + const char *extra_kconfig) +{ + bool need_config = false, need_kallsyms = false; + bool need_vmlinux_btf = false; + struct extern_desc *ext; + void *kcfg_data = NULL; + int err, i; + + if (obj->nr_extern == 0) + return 0; + + if (obj->kconfig_map_idx >= 0) + kcfg_data = obj->maps[obj->kconfig_map_idx].mmaped; + + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + + if (ext->type == EXT_KSYM) { + if (ext->ksym.type_id) + need_vmlinux_btf = true; + else + need_kallsyms = true; + continue; + } else if (ext->type == EXT_KCFG) { + void *ext_ptr = kcfg_data + ext->kcfg.data_off; + __u64 value = 0; + + /* Kconfig externs need actual /proc/config.gz */ + if (str_has_pfx(ext->name, "CONFIG_")) { + need_config = true; + continue; + } + + /* Virtual kcfg externs are customly handled by libbpf */ + if (strcmp(ext->name, "LINUX_KERNEL_VERSION") == 0) { + value = get_kernel_version(); + if (!value) { + pr_warn("extern (kcfg) '%s': failed to get kernel version\n", ext->name); + return -EINVAL; + } + } else if (strcmp(ext->name, "LINUX_HAS_BPF_COOKIE") == 0) { + value = kernel_supports(obj, FEAT_BPF_COOKIE); + } else if (strcmp(ext->name, "LINUX_HAS_SYSCALL_WRAPPER") == 0) { + value = kernel_supports(obj, FEAT_SYSCALL_WRAPPER); + } else if (!str_has_pfx(ext->name, "LINUX_") || !ext->is_weak) { + /* Currently libbpf supports only CONFIG_ and LINUX_ prefixed + * __kconfig externs, where LINUX_ ones are virtual and filled out + * customly by libbpf (their values don't come from Kconfig). + * If LINUX_xxx variable is not recognized by libbpf, but is marked + * __weak, it defaults to zero value, just like for CONFIG_xxx + * externs. + */ + pr_warn("extern (kcfg) '%s': unrecognized virtual extern\n", ext->name); + return -EINVAL; + } + + err = set_kcfg_value_num(ext, ext_ptr, value); + if (err) + return err; + pr_debug("extern (kcfg) '%s': set to 0x%llx\n", + ext->name, (long long)value); + } else { + pr_warn("extern '%s': unrecognized extern kind\n", ext->name); + return -EINVAL; + } + } + if (need_config && extra_kconfig) { + err = bpf_object__read_kconfig_mem(obj, extra_kconfig, kcfg_data); + if (err) + return -EINVAL; + need_config = false; + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type == EXT_KCFG && !ext->is_set) { + need_config = true; + break; + } + } + } + if (need_config) { + err = bpf_object__read_kconfig_file(obj, kcfg_data); + if (err) + return -EINVAL; + } + if (need_kallsyms) { + err = bpf_object__read_kallsyms_file(obj); + if (err) + return -EINVAL; + } + if (need_vmlinux_btf) { + err = bpf_object__resolve_ksyms_btf_id(obj); + if (err) + return -EINVAL; + } + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + + if (!ext->is_set && !ext->is_weak) { + pr_warn("extern '%s' (strong): not resolved\n", ext->name); + return -ESRCH; + } else if (!ext->is_set) { + pr_debug("extern '%s' (weak): not resolved, defaulting to zero\n", + ext->name); + } + } + + return 0; +} + +static int bpf_object_load(struct bpf_object *obj, int extra_log_level, const char *target_btf_path) +{ + int err, i; + + if (!obj) + return libbpf_err(-EINVAL); + + if (obj->loaded) { + pr_warn("object '%s': load can't be attempted twice\n", obj->name); + return libbpf_err(-EINVAL); + } + + if (obj->gen_loader) + bpf_gen__init(obj->gen_loader, extra_log_level, obj->nr_programs, obj->nr_maps); + + err = bpf_object__probe_loading(obj); + err = err ? : bpf_object__load_vmlinux_btf(obj, false); + err = err ? : bpf_object__resolve_externs(obj, obj->kconfig); + err = err ? : bpf_object__sanitize_and_load_btf(obj); + err = err ? : bpf_object__sanitize_maps(obj); + err = err ? : bpf_object__init_kern_struct_ops_maps(obj); + err = err ? : bpf_object__create_maps(obj); + err = err ? : bpf_object__relocate(obj, obj->btf_custom_path ? : target_btf_path); + err = err ? : bpf_object__load_progs(obj, extra_log_level); + err = err ? : bpf_object_init_prog_arrays(obj); + + if (obj->gen_loader) { + /* reset FDs */ + if (obj->btf) + btf__set_fd(obj->btf, -1); + for (i = 0; i < obj->nr_maps; i++) + obj->maps[i].fd = -1; + if (!err) + err = bpf_gen__finish(obj->gen_loader, obj->nr_programs, obj->nr_maps); + } + + /* clean up fd_array */ + zfree(&obj->fd_array); + + /* clean up module BTFs */ + for (i = 0; i < obj->btf_module_cnt; i++) { + close(obj->btf_modules[i].fd); + btf__free(obj->btf_modules[i].btf); + free(obj->btf_modules[i].name); + } + free(obj->btf_modules); + + /* clean up vmlinux BTF */ + btf__free(obj->btf_vmlinux); + obj->btf_vmlinux = NULL; + + obj->loaded = true; /* doesn't matter if successfully or not */ + + if (err) + goto out; + + return 0; +out: + /* unpin any maps that were auto-pinned during load */ + for (i = 0; i < obj->nr_maps; i++) + if (obj->maps[i].pinned && !obj->maps[i].reused) + bpf_map__unpin(&obj->maps[i], NULL); + + bpf_object_unload(obj); + pr_warn("failed to load object '%s'\n", obj->path); + return libbpf_err(err); +} + +int bpf_object__load(struct bpf_object *obj) +{ + return bpf_object_load(obj, 0, NULL); +} + +static int make_parent_dir(const char *path) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + char *dname, *dir; + int err = 0; + + dname = strdup(path); + if (dname == NULL) + return -ENOMEM; + + dir = dirname(dname); + if (mkdir(dir, 0700) && errno != EEXIST) + err = -errno; + + free(dname); + if (err) { + cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg)); + pr_warn("failed to mkdir %s: %s\n", path, cp); + } + return err; +} + +static int check_path(const char *path) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + struct statfs st_fs; + char *dname, *dir; + int err = 0; + + if (path == NULL) + return -EINVAL; + + dname = strdup(path); + if (dname == NULL) + return -ENOMEM; + + dir = dirname(dname); + if (statfs(dir, &st_fs)) { + cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); + pr_warn("failed to statfs %s: %s\n", dir, cp); + err = -errno; + } + free(dname); + + if (!err && st_fs.f_type != BPF_FS_MAGIC) { + pr_warn("specified path %s is not on BPF FS\n", path); + err = -EINVAL; + } + + return err; +} + +int bpf_program__pin(struct bpf_program *prog, const char *path) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + int err; + + if (prog->fd < 0) { + pr_warn("prog '%s': can't pin program that wasn't loaded\n", prog->name); + return libbpf_err(-EINVAL); + } + + err = make_parent_dir(path); + if (err) + return libbpf_err(err); + + err = check_path(path); + if (err) + return libbpf_err(err); + + if (bpf_obj_pin(prog->fd, path)) { + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("prog '%s': failed to pin at '%s': %s\n", prog->name, path, cp); + return libbpf_err(err); + } + + pr_debug("prog '%s': pinned at '%s'\n", prog->name, path); + return 0; +} + +int bpf_program__unpin(struct bpf_program *prog, const char *path) +{ + int err; + + if (prog->fd < 0) { + pr_warn("prog '%s': can't unpin program that wasn't loaded\n", prog->name); + return libbpf_err(-EINVAL); + } + + err = check_path(path); + if (err) + return libbpf_err(err); + + err = unlink(path); + if (err) + return libbpf_err(-errno); + + pr_debug("prog '%s': unpinned from '%s'\n", prog->name, path); + return 0; +} + +int bpf_map__pin(struct bpf_map *map, const char *path) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + int err; + + if (map == NULL) { + pr_warn("invalid map pointer\n"); + return libbpf_err(-EINVAL); + } + + if (map->pin_path) { + if (path && strcmp(path, map->pin_path)) { + pr_warn("map '%s' already has pin path '%s' different from '%s'\n", + bpf_map__name(map), map->pin_path, path); + return libbpf_err(-EINVAL); + } else if (map->pinned) { + pr_debug("map '%s' already pinned at '%s'; not re-pinning\n", + bpf_map__name(map), map->pin_path); + return 0; + } + } else { + if (!path) { + pr_warn("missing a path to pin map '%s' at\n", + bpf_map__name(map)); + return libbpf_err(-EINVAL); + } else if (map->pinned) { + pr_warn("map '%s' already pinned\n", bpf_map__name(map)); + return libbpf_err(-EEXIST); + } + + map->pin_path = strdup(path); + if (!map->pin_path) { + err = -errno; + goto out_err; + } + } + + err = make_parent_dir(map->pin_path); + if (err) + return libbpf_err(err); + + err = check_path(map->pin_path); + if (err) + return libbpf_err(err); + + if (bpf_obj_pin(map->fd, map->pin_path)) { + err = -errno; + goto out_err; + } + + map->pinned = true; + pr_debug("pinned map '%s'\n", map->pin_path); + + return 0; + +out_err: + cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg)); + pr_warn("failed to pin map: %s\n", cp); + return libbpf_err(err); +} + +int bpf_map__unpin(struct bpf_map *map, const char *path) +{ + int err; + + if (map == NULL) { + pr_warn("invalid map pointer\n"); + return libbpf_err(-EINVAL); + } + + if (map->pin_path) { + if (path && strcmp(path, map->pin_path)) { + pr_warn("map '%s' already has pin path '%s' different from '%s'\n", + bpf_map__name(map), map->pin_path, path); + return libbpf_err(-EINVAL); + } + path = map->pin_path; + } else if (!path) { + pr_warn("no path to unpin map '%s' from\n", + bpf_map__name(map)); + return libbpf_err(-EINVAL); + } + + err = check_path(path); + if (err) + return libbpf_err(err); + + err = unlink(path); + if (err != 0) + return libbpf_err(-errno); + + map->pinned = false; + pr_debug("unpinned map '%s' from '%s'\n", bpf_map__name(map), path); + + return 0; +} + +int bpf_map__set_pin_path(struct bpf_map *map, const char *path) +{ + char *new = NULL; + + if (path) { + new = strdup(path); + if (!new) + return libbpf_err(-errno); + } + + free(map->pin_path); + map->pin_path = new; + return 0; +} + +__alias(bpf_map__pin_path) +const char *bpf_map__get_pin_path(const struct bpf_map *map); + +const char *bpf_map__pin_path(const struct bpf_map *map) +{ + return map->pin_path; +} + +bool bpf_map__is_pinned(const struct bpf_map *map) +{ + return map->pinned; +} + +static void sanitize_pin_path(char *s) +{ + /* bpffs disallows periods in path names */ + while (*s) { + if (*s == '.') + *s = '_'; + s++; + } +} + +int bpf_object__pin_maps(struct bpf_object *obj, const char *path) +{ + struct bpf_map *map; + int err; + + if (!obj) + return libbpf_err(-ENOENT); + + if (!obj->loaded) { + pr_warn("object not yet loaded; load it first\n"); + return libbpf_err(-ENOENT); + } + + bpf_object__for_each_map(map, obj) { + char *pin_path = NULL; + char buf[PATH_MAX]; + + if (!map->autocreate) + continue; + + if (path) { + err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map)); + if (err) + goto err_unpin_maps; + sanitize_pin_path(buf); + pin_path = buf; + } else if (!map->pin_path) { + continue; + } + + err = bpf_map__pin(map, pin_path); + if (err) + goto err_unpin_maps; + } + + return 0; + +err_unpin_maps: + while ((map = bpf_object__prev_map(obj, map))) { + if (!map->pin_path) + continue; + + bpf_map__unpin(map, NULL); + } + + return libbpf_err(err); +} + +int bpf_object__unpin_maps(struct bpf_object *obj, const char *path) +{ + struct bpf_map *map; + int err; + + if (!obj) + return libbpf_err(-ENOENT); + + bpf_object__for_each_map(map, obj) { + char *pin_path = NULL; + char buf[PATH_MAX]; + + if (path) { + err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map)); + if (err) + return libbpf_err(err); + sanitize_pin_path(buf); + pin_path = buf; + } else if (!map->pin_path) { + continue; + } + + err = bpf_map__unpin(map, pin_path); + if (err) + return libbpf_err(err); + } + + return 0; +} + +int bpf_object__pin_programs(struct bpf_object *obj, const char *path) +{ + struct bpf_program *prog; + char buf[PATH_MAX]; + int err; + + if (!obj) + return libbpf_err(-ENOENT); + + if (!obj->loaded) { + pr_warn("object not yet loaded; load it first\n"); + return libbpf_err(-ENOENT); + } + + bpf_object__for_each_program(prog, obj) { + err = pathname_concat(buf, sizeof(buf), path, prog->name); + if (err) + goto err_unpin_programs; + + err = bpf_program__pin(prog, buf); + if (err) + goto err_unpin_programs; + } + + return 0; + +err_unpin_programs: + while ((prog = bpf_object__prev_program(obj, prog))) { + if (pathname_concat(buf, sizeof(buf), path, prog->name)) + continue; + + bpf_program__unpin(prog, buf); + } + + return libbpf_err(err); +} + +int bpf_object__unpin_programs(struct bpf_object *obj, const char *path) +{ + struct bpf_program *prog; + int err; + + if (!obj) + return libbpf_err(-ENOENT); + + bpf_object__for_each_program(prog, obj) { + char buf[PATH_MAX]; + + err = pathname_concat(buf, sizeof(buf), path, prog->name); + if (err) + return libbpf_err(err); + + err = bpf_program__unpin(prog, buf); + if (err) + return libbpf_err(err); + } + + return 0; +} + +int bpf_object__pin(struct bpf_object *obj, const char *path) +{ + int err; + + err = bpf_object__pin_maps(obj, path); + if (err) + return libbpf_err(err); + + err = bpf_object__pin_programs(obj, path); + if (err) { + bpf_object__unpin_maps(obj, path); + return libbpf_err(err); + } + + return 0; +} + +static void bpf_map__destroy(struct bpf_map *map) +{ + if (map->inner_map) { + bpf_map__destroy(map->inner_map); + zfree(&map->inner_map); + } + + zfree(&map->init_slots); + map->init_slots_sz = 0; + + if (map->mmaped) { + munmap(map->mmaped, bpf_map_mmap_sz(map)); + map->mmaped = NULL; + } + + if (map->st_ops) { + zfree(&map->st_ops->data); + zfree(&map->st_ops->progs); + zfree(&map->st_ops->kern_func_off); + zfree(&map->st_ops); + } + + zfree(&map->name); + zfree(&map->real_name); + zfree(&map->pin_path); + + if (map->fd >= 0) + zclose(map->fd); +} + +void bpf_object__close(struct bpf_object *obj) +{ + size_t i; + + if (IS_ERR_OR_NULL(obj)) + return; + + usdt_manager_free(obj->usdt_man); + obj->usdt_man = NULL; + + bpf_gen__free(obj->gen_loader); + bpf_object__elf_finish(obj); + bpf_object_unload(obj); + btf__free(obj->btf); + btf_ext__free(obj->btf_ext); + + for (i = 0; i < obj->nr_maps; i++) + bpf_map__destroy(&obj->maps[i]); + + zfree(&obj->btf_custom_path); + zfree(&obj->kconfig); + zfree(&obj->externs); + obj->nr_extern = 0; + + zfree(&obj->maps); + obj->nr_maps = 0; + + if (obj->programs && obj->nr_programs) { + for (i = 0; i < obj->nr_programs; i++) + bpf_program__exit(&obj->programs[i]); + } + zfree(&obj->programs); + + free(obj); +} + +const char *bpf_object__name(const struct bpf_object *obj) +{ + return obj ? obj->name : libbpf_err_ptr(-EINVAL); +} + +unsigned int bpf_object__kversion(const struct bpf_object *obj) +{ + return obj ? obj->kern_version : 0; +} + +struct btf *bpf_object__btf(const struct bpf_object *obj) +{ + return obj ? obj->btf : NULL; +} + +int bpf_object__btf_fd(const struct bpf_object *obj) +{ + return obj->btf ? btf__fd(obj->btf) : -1; +} + +int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version) +{ + if (obj->loaded) + return libbpf_err(-EINVAL); + + obj->kern_version = kern_version; + + return 0; +} + +int bpf_object__gen_loader(struct bpf_object *obj, struct gen_loader_opts *opts) +{ + struct bpf_gen *gen; + + if (!opts) + return -EFAULT; + if (!OPTS_VALID(opts, gen_loader_opts)) + return -EINVAL; + gen = calloc(sizeof(*gen), 1); + if (!gen) + return -ENOMEM; + gen->opts = opts; + obj->gen_loader = gen; + return 0; +} + +static struct bpf_program * +__bpf_program__iter(const struct bpf_program *p, const struct bpf_object *obj, + bool forward) +{ + size_t nr_programs = obj->nr_programs; + ssize_t idx; + + if (!nr_programs) + return NULL; + + if (!p) + /* Iter from the beginning */ + return forward ? &obj->programs[0] : + &obj->programs[nr_programs - 1]; + + if (p->obj != obj) { + pr_warn("error: program handler doesn't match object\n"); + return errno = EINVAL, NULL; + } + + idx = (p - obj->programs) + (forward ? 1 : -1); + if (idx >= obj->nr_programs || idx < 0) + return NULL; + return &obj->programs[idx]; +} + +struct bpf_program * +bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prev) +{ + struct bpf_program *prog = prev; + + do { + prog = __bpf_program__iter(prog, obj, true); + } while (prog && prog_is_subprog(obj, prog)); + + return prog; +} + +struct bpf_program * +bpf_object__prev_program(const struct bpf_object *obj, struct bpf_program *next) +{ + struct bpf_program *prog = next; + + do { + prog = __bpf_program__iter(prog, obj, false); + } while (prog && prog_is_subprog(obj, prog)); + + return prog; +} + +void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) +{ + prog->prog_ifindex = ifindex; +} + +const char *bpf_program__name(const struct bpf_program *prog) +{ + return prog->name; +} + +const char *bpf_program__section_name(const struct bpf_program *prog) +{ + return prog->sec_name; +} + +bool bpf_program__autoload(const struct bpf_program *prog) +{ + return prog->autoload; +} + +int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) +{ + if (prog->obj->loaded) + return libbpf_err(-EINVAL); + + prog->autoload = autoload; + return 0; +} + +bool bpf_program__autoattach(const struct bpf_program *prog) +{ + return prog->autoattach; +} + +void bpf_program__set_autoattach(struct bpf_program *prog, bool autoattach) +{ + prog->autoattach = autoattach; +} + +const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog) +{ + return prog->insns; +} + +size_t bpf_program__insn_cnt(const struct bpf_program *prog) +{ + return prog->insns_cnt; +} + +int bpf_program__set_insns(struct bpf_program *prog, + struct bpf_insn *new_insns, size_t new_insn_cnt) +{ + struct bpf_insn *insns; + + if (prog->obj->loaded) + return -EBUSY; + + insns = libbpf_reallocarray(prog->insns, new_insn_cnt, sizeof(*insns)); + if (!insns) { + pr_warn("prog '%s': failed to realloc prog code\n", prog->name); + return -ENOMEM; + } + memcpy(insns, new_insns, new_insn_cnt * sizeof(*insns)); + + prog->insns = insns; + prog->insns_cnt = new_insn_cnt; + return 0; +} + +int bpf_program__fd(const struct bpf_program *prog) +{ + if (!prog) + return libbpf_err(-EINVAL); + + if (prog->fd < 0) + return libbpf_err(-ENOENT); + + return prog->fd; +} + +__alias(bpf_program__type) +enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog); + +enum bpf_prog_type bpf_program__type(const struct bpf_program *prog) +{ + return prog->type; +} + +int bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) +{ + if (prog->obj->loaded) + return libbpf_err(-EBUSY); + + prog->type = type; + return 0; +} + +__alias(bpf_program__expected_attach_type) +enum bpf_attach_type bpf_program__get_expected_attach_type(const struct bpf_program *prog); + +enum bpf_attach_type bpf_program__expected_attach_type(const struct bpf_program *prog) +{ + return prog->expected_attach_type; +} + +int bpf_program__set_expected_attach_type(struct bpf_program *prog, + enum bpf_attach_type type) +{ + if (prog->obj->loaded) + return libbpf_err(-EBUSY); + + prog->expected_attach_type = type; + return 0; +} + +__u32 bpf_program__flags(const struct bpf_program *prog) +{ + return prog->prog_flags; +} + +int bpf_program__set_flags(struct bpf_program *prog, __u32 flags) +{ + if (prog->obj->loaded) + return libbpf_err(-EBUSY); + + prog->prog_flags = flags; + return 0; +} + +__u32 bpf_program__log_level(const struct bpf_program *prog) +{ + return prog->log_level; +} + +int bpf_program__set_log_level(struct bpf_program *prog, __u32 log_level) +{ + if (prog->obj->loaded) + return libbpf_err(-EBUSY); + + prog->log_level = log_level; + return 0; +} + +const char *bpf_program__log_buf(const struct bpf_program *prog, size_t *log_size) +{ + *log_size = prog->log_size; + return prog->log_buf; +} + +int bpf_program__set_log_buf(struct bpf_program *prog, char *log_buf, size_t log_size) +{ + if (log_size && !log_buf) + return -EINVAL; + if (prog->log_size > UINT_MAX) + return -EINVAL; + if (prog->obj->loaded) + return -EBUSY; + + prog->log_buf = log_buf; + prog->log_size = log_size; + return 0; +} + +#define SEC_DEF(sec_pfx, ptype, atype, flags, ...) { \ + .sec = (char *)sec_pfx, \ + .prog_type = BPF_PROG_TYPE_##ptype, \ + .expected_attach_type = atype, \ + .cookie = (long)(flags), \ + .prog_prepare_load_fn = libbpf_prepare_prog_load, \ + __VA_ARGS__ \ +} + +static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_ksyscall(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link); + +static const struct bpf_sec_def section_defs[] = { + SEC_DEF("socket", SOCKET_FILTER, 0, SEC_NONE), + SEC_DEF("sk_reuseport/migrate", SK_REUSEPORT, BPF_SK_REUSEPORT_SELECT_OR_MIGRATE, SEC_ATTACHABLE), + SEC_DEF("sk_reuseport", SK_REUSEPORT, BPF_SK_REUSEPORT_SELECT, SEC_ATTACHABLE), + SEC_DEF("kprobe+", KPROBE, 0, SEC_NONE, attach_kprobe), + SEC_DEF("uprobe+", KPROBE, 0, SEC_NONE, attach_uprobe), + SEC_DEF("uprobe.s+", KPROBE, 0, SEC_SLEEPABLE, attach_uprobe), + SEC_DEF("kretprobe+", KPROBE, 0, SEC_NONE, attach_kprobe), + SEC_DEF("uretprobe+", KPROBE, 0, SEC_NONE, attach_uprobe), + SEC_DEF("uretprobe.s+", KPROBE, 0, SEC_SLEEPABLE, attach_uprobe), + SEC_DEF("kprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi), + SEC_DEF("kretprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi), + SEC_DEF("ksyscall+", KPROBE, 0, SEC_NONE, attach_ksyscall), + SEC_DEF("kretsyscall+", KPROBE, 0, SEC_NONE, attach_ksyscall), + SEC_DEF("usdt+", KPROBE, 0, SEC_NONE, attach_usdt), + SEC_DEF("tc", SCHED_CLS, 0, SEC_NONE), + SEC_DEF("classifier", SCHED_CLS, 0, SEC_NONE), + SEC_DEF("action", SCHED_ACT, 0, SEC_NONE), + SEC_DEF("tracepoint+", TRACEPOINT, 0, SEC_NONE, attach_tp), + SEC_DEF("tp+", TRACEPOINT, 0, SEC_NONE, attach_tp), + SEC_DEF("raw_tracepoint+", RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp), + SEC_DEF("raw_tp+", RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp), + SEC_DEF("raw_tracepoint.w+", RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp), + SEC_DEF("raw_tp.w+", RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp), + SEC_DEF("tp_btf+", TRACING, BPF_TRACE_RAW_TP, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("fentry+", TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("fmod_ret+", TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("fexit+", TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("fentry.s+", TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace), + SEC_DEF("fmod_ret.s+", TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace), + SEC_DEF("fexit.s+", TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace), + SEC_DEF("freplace+", EXT, 0, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("lsm+", LSM, BPF_LSM_MAC, SEC_ATTACH_BTF, attach_lsm), + SEC_DEF("lsm.s+", LSM, BPF_LSM_MAC, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_lsm), + SEC_DEF("lsm_cgroup+", LSM, BPF_LSM_CGROUP, SEC_ATTACH_BTF), + SEC_DEF("iter+", TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF, attach_iter), + SEC_DEF("iter.s+", TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_iter), + SEC_DEF("syscall", SYSCALL, 0, SEC_SLEEPABLE), + SEC_DEF("xdp.frags/devmap", XDP, BPF_XDP_DEVMAP, SEC_XDP_FRAGS), + SEC_DEF("xdp/devmap", XDP, BPF_XDP_DEVMAP, SEC_ATTACHABLE), + SEC_DEF("xdp.frags/cpumap", XDP, BPF_XDP_CPUMAP, SEC_XDP_FRAGS), + SEC_DEF("xdp/cpumap", XDP, BPF_XDP_CPUMAP, SEC_ATTACHABLE), + SEC_DEF("xdp.frags", XDP, BPF_XDP, SEC_XDP_FRAGS), + SEC_DEF("xdp", XDP, BPF_XDP, SEC_ATTACHABLE_OPT), + SEC_DEF("perf_event", PERF_EVENT, 0, SEC_NONE), + SEC_DEF("lwt_in", LWT_IN, 0, SEC_NONE), + SEC_DEF("lwt_out", LWT_OUT, 0, SEC_NONE), + SEC_DEF("lwt_xmit", LWT_XMIT, 0, SEC_NONE), + SEC_DEF("lwt_seg6local", LWT_SEG6LOCAL, 0, SEC_NONE), + SEC_DEF("sockops", SOCK_OPS, BPF_CGROUP_SOCK_OPS, SEC_ATTACHABLE_OPT), + SEC_DEF("sk_skb/stream_parser", SK_SKB, BPF_SK_SKB_STREAM_PARSER, SEC_ATTACHABLE_OPT), + SEC_DEF("sk_skb/stream_verdict",SK_SKB, BPF_SK_SKB_STREAM_VERDICT, SEC_ATTACHABLE_OPT), + SEC_DEF("sk_skb", SK_SKB, 0, SEC_NONE), + SEC_DEF("sk_msg", SK_MSG, BPF_SK_MSG_VERDICT, SEC_ATTACHABLE_OPT), + SEC_DEF("lirc_mode2", LIRC_MODE2, BPF_LIRC_MODE2, SEC_ATTACHABLE_OPT), + SEC_DEF("flow_dissector", FLOW_DISSECTOR, BPF_FLOW_DISSECTOR, SEC_ATTACHABLE_OPT), + SEC_DEF("cgroup_skb/ingress", CGROUP_SKB, BPF_CGROUP_INET_INGRESS, SEC_ATTACHABLE_OPT), + SEC_DEF("cgroup_skb/egress", CGROUP_SKB, BPF_CGROUP_INET_EGRESS, SEC_ATTACHABLE_OPT), + SEC_DEF("cgroup/skb", CGROUP_SKB, 0, SEC_NONE), + SEC_DEF("cgroup/sock_create", CGROUP_SOCK, BPF_CGROUP_INET_SOCK_CREATE, SEC_ATTACHABLE), + SEC_DEF("cgroup/sock_release", CGROUP_SOCK, BPF_CGROUP_INET_SOCK_RELEASE, SEC_ATTACHABLE), + SEC_DEF("cgroup/sock", CGROUP_SOCK, BPF_CGROUP_INET_SOCK_CREATE, SEC_ATTACHABLE_OPT), + SEC_DEF("cgroup/post_bind4", CGROUP_SOCK, BPF_CGROUP_INET4_POST_BIND, SEC_ATTACHABLE), + SEC_DEF("cgroup/post_bind6", CGROUP_SOCK, BPF_CGROUP_INET6_POST_BIND, SEC_ATTACHABLE), + SEC_DEF("cgroup/bind4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_BIND, SEC_ATTACHABLE), + SEC_DEF("cgroup/bind6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_BIND, SEC_ATTACHABLE), + SEC_DEF("cgroup/connect4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_CONNECT, SEC_ATTACHABLE), + SEC_DEF("cgroup/connect6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_CONNECT, SEC_ATTACHABLE), + SEC_DEF("cgroup/sendmsg4", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_SENDMSG, SEC_ATTACHABLE), + SEC_DEF("cgroup/sendmsg6", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_SENDMSG, SEC_ATTACHABLE), + SEC_DEF("cgroup/recvmsg4", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_RECVMSG, SEC_ATTACHABLE), + SEC_DEF("cgroup/recvmsg6", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_RECVMSG, SEC_ATTACHABLE), + SEC_DEF("cgroup/getpeername4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETPEERNAME, SEC_ATTACHABLE), + SEC_DEF("cgroup/getpeername6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETPEERNAME, SEC_ATTACHABLE), + SEC_DEF("cgroup/getsockname4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETSOCKNAME, SEC_ATTACHABLE), + SEC_DEF("cgroup/getsockname6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETSOCKNAME, SEC_ATTACHABLE), + SEC_DEF("cgroup/sysctl", CGROUP_SYSCTL, BPF_CGROUP_SYSCTL, SEC_ATTACHABLE), + SEC_DEF("cgroup/getsockopt", CGROUP_SOCKOPT, BPF_CGROUP_GETSOCKOPT, SEC_ATTACHABLE), + SEC_DEF("cgroup/setsockopt", CGROUP_SOCKOPT, BPF_CGROUP_SETSOCKOPT, SEC_ATTACHABLE), + SEC_DEF("cgroup/dev", CGROUP_DEVICE, BPF_CGROUP_DEVICE, SEC_ATTACHABLE_OPT), + SEC_DEF("struct_ops+", STRUCT_OPS, 0, SEC_NONE), + SEC_DEF("struct_ops.s+", STRUCT_OPS, 0, SEC_SLEEPABLE), + SEC_DEF("sk_lookup", SK_LOOKUP, BPF_SK_LOOKUP, SEC_ATTACHABLE), +}; + +static size_t custom_sec_def_cnt; +static struct bpf_sec_def *custom_sec_defs; +static struct bpf_sec_def custom_fallback_def; +static bool has_custom_fallback_def; + +static int last_custom_sec_def_handler_id; + +int libbpf_register_prog_handler(const char *sec, + enum bpf_prog_type prog_type, + enum bpf_attach_type exp_attach_type, + const struct libbpf_prog_handler_opts *opts) +{ + struct bpf_sec_def *sec_def; + + if (!OPTS_VALID(opts, libbpf_prog_handler_opts)) + return libbpf_err(-EINVAL); + + if (last_custom_sec_def_handler_id == INT_MAX) /* prevent overflow */ + return libbpf_err(-E2BIG); + + if (sec) { + sec_def = libbpf_reallocarray(custom_sec_defs, custom_sec_def_cnt + 1, + sizeof(*sec_def)); + if (!sec_def) + return libbpf_err(-ENOMEM); + + custom_sec_defs = sec_def; + sec_def = &custom_sec_defs[custom_sec_def_cnt]; + } else { + if (has_custom_fallback_def) + return libbpf_err(-EBUSY); + + sec_def = &custom_fallback_def; + } + + sec_def->sec = sec ? strdup(sec) : NULL; + if (sec && !sec_def->sec) + return libbpf_err(-ENOMEM); + + sec_def->prog_type = prog_type; + sec_def->expected_attach_type = exp_attach_type; + sec_def->cookie = OPTS_GET(opts, cookie, 0); + + sec_def->prog_setup_fn = OPTS_GET(opts, prog_setup_fn, NULL); + sec_def->prog_prepare_load_fn = OPTS_GET(opts, prog_prepare_load_fn, NULL); + sec_def->prog_attach_fn = OPTS_GET(opts, prog_attach_fn, NULL); + + sec_def->handler_id = ++last_custom_sec_def_handler_id; + + if (sec) + custom_sec_def_cnt++; + else + has_custom_fallback_def = true; + + return sec_def->handler_id; +} + +int libbpf_unregister_prog_handler(int handler_id) +{ + struct bpf_sec_def *sec_defs; + int i; + + if (handler_id <= 0) + return libbpf_err(-EINVAL); + + if (has_custom_fallback_def && custom_fallback_def.handler_id == handler_id) { + memset(&custom_fallback_def, 0, sizeof(custom_fallback_def)); + has_custom_fallback_def = false; + return 0; + } + + for (i = 0; i < custom_sec_def_cnt; i++) { + if (custom_sec_defs[i].handler_id == handler_id) + break; + } + + if (i == custom_sec_def_cnt) + return libbpf_err(-ENOENT); + + free(custom_sec_defs[i].sec); + for (i = i + 1; i < custom_sec_def_cnt; i++) + custom_sec_defs[i - 1] = custom_sec_defs[i]; + custom_sec_def_cnt--; + + /* try to shrink the array, but it's ok if we couldn't */ + sec_defs = libbpf_reallocarray(custom_sec_defs, custom_sec_def_cnt, sizeof(*sec_defs)); + if (sec_defs) + custom_sec_defs = sec_defs; + + return 0; +} + +static bool sec_def_matches(const struct bpf_sec_def *sec_def, const char *sec_name) +{ + size_t len = strlen(sec_def->sec); + + /* "type/" always has to have proper SEC("type/extras") form */ + if (sec_def->sec[len - 1] == '/') { + if (str_has_pfx(sec_name, sec_def->sec)) + return true; + return false; + } + + /* "type+" means it can be either exact SEC("type") or + * well-formed SEC("type/extras") with proper '/' separator + */ + if (sec_def->sec[len - 1] == '+') { + len--; + /* not even a prefix */ + if (strncmp(sec_name, sec_def->sec, len) != 0) + return false; + /* exact match or has '/' separator */ + if (sec_name[len] == '\0' || sec_name[len] == '/') + return true; + return false; + } + + return strcmp(sec_name, sec_def->sec) == 0; +} + +static const struct bpf_sec_def *find_sec_def(const char *sec_name) +{ + const struct bpf_sec_def *sec_def; + int i, n; + + n = custom_sec_def_cnt; + for (i = 0; i < n; i++) { + sec_def = &custom_sec_defs[i]; + if (sec_def_matches(sec_def, sec_name)) + return sec_def; + } + + n = ARRAY_SIZE(section_defs); + for (i = 0; i < n; i++) { + sec_def = §ion_defs[i]; + if (sec_def_matches(sec_def, sec_name)) + return sec_def; + } + + if (has_custom_fallback_def) + return &custom_fallback_def; + + return NULL; +} + +#define MAX_TYPE_NAME_SIZE 32 + +static char *libbpf_get_type_names(bool attach_type) +{ + int i, len = ARRAY_SIZE(section_defs) * MAX_TYPE_NAME_SIZE; + char *buf; + + buf = malloc(len); + if (!buf) + return NULL; + + buf[0] = '\0'; + /* Forge string buf with all available names */ + for (i = 0; i < ARRAY_SIZE(section_defs); i++) { + const struct bpf_sec_def *sec_def = §ion_defs[i]; + + if (attach_type) { + if (sec_def->prog_prepare_load_fn != libbpf_prepare_prog_load) + continue; + + if (!(sec_def->cookie & SEC_ATTACHABLE)) + continue; + } + + if (strlen(buf) + strlen(section_defs[i].sec) + 2 > len) { + free(buf); + return NULL; + } + strcat(buf, " "); + strcat(buf, section_defs[i].sec); + } + + return buf; +} + +int libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, + enum bpf_attach_type *expected_attach_type) +{ + const struct bpf_sec_def *sec_def; + char *type_names; + + if (!name) + return libbpf_err(-EINVAL); + + sec_def = find_sec_def(name); + if (sec_def) { + *prog_type = sec_def->prog_type; + *expected_attach_type = sec_def->expected_attach_type; + return 0; + } + + pr_debug("failed to guess program type from ELF section '%s'\n", name); + type_names = libbpf_get_type_names(false); + if (type_names != NULL) { + pr_debug("supported section(type) names are:%s\n", type_names); + free(type_names); + } + + return libbpf_err(-ESRCH); +} + +const char *libbpf_bpf_attach_type_str(enum bpf_attach_type t) +{ + if (t < 0 || t >= ARRAY_SIZE(attach_type_name)) + return NULL; + + return attach_type_name[t]; +} + +const char *libbpf_bpf_link_type_str(enum bpf_link_type t) +{ + if (t < 0 || t >= ARRAY_SIZE(link_type_name)) + return NULL; + + return link_type_name[t]; +} + +const char *libbpf_bpf_map_type_str(enum bpf_map_type t) +{ + if (t < 0 || t >= ARRAY_SIZE(map_type_name)) + return NULL; + + return map_type_name[t]; +} + +const char *libbpf_bpf_prog_type_str(enum bpf_prog_type t) +{ + if (t < 0 || t >= ARRAY_SIZE(prog_type_name)) + return NULL; + + return prog_type_name[t]; +} + +static struct bpf_map *find_struct_ops_map_by_offset(struct bpf_object *obj, + size_t offset) +{ + struct bpf_map *map; + size_t i; + + for (i = 0; i < obj->nr_maps; i++) { + map = &obj->maps[i]; + if (!bpf_map__is_struct_ops(map)) + continue; + if (map->sec_offset <= offset && + offset - map->sec_offset < map->def.value_size) + return map; + } + + return NULL; +} + +/* Collect the reloc from ELF and populate the st_ops->progs[] */ +static int bpf_object__collect_st_ops_relos(struct bpf_object *obj, + Elf64_Shdr *shdr, Elf_Data *data) +{ + const struct btf_member *member; + struct bpf_struct_ops *st_ops; + struct bpf_program *prog; + unsigned int shdr_idx; + const struct btf *btf; + struct bpf_map *map; + unsigned int moff, insn_idx; + const char *name; + __u32 member_idx; + Elf64_Sym *sym; + Elf64_Rel *rel; + int i, nrels; + + btf = obj->btf; + nrels = shdr->sh_size / shdr->sh_entsize; + for (i = 0; i < nrels; i++) { + rel = elf_rel_by_idx(data, i); + if (!rel) { + pr_warn("struct_ops reloc: failed to get %d reloc\n", i); + return -LIBBPF_ERRNO__FORMAT; + } + + sym = elf_sym_by_idx(obj, ELF64_R_SYM(rel->r_info)); + if (!sym) { + pr_warn("struct_ops reloc: symbol %zx not found\n", + (size_t)ELF64_R_SYM(rel->r_info)); + return -LIBBPF_ERRNO__FORMAT; + } + + name = elf_sym_str(obj, sym->st_name) ?: ""; + map = find_struct_ops_map_by_offset(obj, rel->r_offset); + if (!map) { + pr_warn("struct_ops reloc: cannot find map at rel->r_offset %zu\n", + (size_t)rel->r_offset); + return -EINVAL; + } + + moff = rel->r_offset - map->sec_offset; + shdr_idx = sym->st_shndx; + st_ops = map->st_ops; + pr_debug("struct_ops reloc %s: for %lld value %lld shdr_idx %u rel->r_offset %zu map->sec_offset %zu name %d (\'%s\')\n", + map->name, + (long long)(rel->r_info >> 32), + (long long)sym->st_value, + shdr_idx, (size_t)rel->r_offset, + map->sec_offset, sym->st_name, name); + + if (shdr_idx >= SHN_LORESERVE) { + pr_warn("struct_ops reloc %s: rel->r_offset %zu shdr_idx %u unsupported non-static function\n", + map->name, (size_t)rel->r_offset, shdr_idx); + return -LIBBPF_ERRNO__RELOC; + } + if (sym->st_value % BPF_INSN_SZ) { + pr_warn("struct_ops reloc %s: invalid target program offset %llu\n", + map->name, (unsigned long long)sym->st_value); + return -LIBBPF_ERRNO__FORMAT; + } + insn_idx = sym->st_value / BPF_INSN_SZ; + + member = find_member_by_offset(st_ops->type, moff * 8); + if (!member) { + pr_warn("struct_ops reloc %s: cannot find member at moff %u\n", + map->name, moff); + return -EINVAL; + } + member_idx = member - btf_members(st_ops->type); + name = btf__name_by_offset(btf, member->name_off); + + if (!resolve_func_ptr(btf, member->type, NULL)) { + pr_warn("struct_ops reloc %s: cannot relocate non func ptr %s\n", + map->name, name); + return -EINVAL; + } + + prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx); + if (!prog) { + pr_warn("struct_ops reloc %s: cannot find prog at shdr_idx %u to relocate func ptr %s\n", + map->name, shdr_idx, name); + return -EINVAL; + } + + /* prevent the use of BPF prog with invalid type */ + if (prog->type != BPF_PROG_TYPE_STRUCT_OPS) { + pr_warn("struct_ops reloc %s: prog %s is not struct_ops BPF program\n", + map->name, prog->name); + return -EINVAL; + } + + /* if we haven't yet processed this BPF program, record proper + * attach_btf_id and member_idx + */ + if (!prog->attach_btf_id) { + prog->attach_btf_id = st_ops->type_id; + prog->expected_attach_type = member_idx; + } + + /* struct_ops BPF prog can be re-used between multiple + * .struct_ops as long as it's the same struct_ops struct + * definition and the same function pointer field + */ + if (prog->attach_btf_id != st_ops->type_id || + prog->expected_attach_type != member_idx) { + pr_warn("struct_ops reloc %s: cannot use prog %s in sec %s with type %u attach_btf_id %u expected_attach_type %u for func ptr %s\n", + map->name, prog->name, prog->sec_name, prog->type, + prog->attach_btf_id, prog->expected_attach_type, name); + return -EINVAL; + } + + st_ops->progs[member_idx] = prog; + } + + return 0; +} + +#define BTF_TRACE_PREFIX "btf_trace_" +#define BTF_LSM_PREFIX "bpf_lsm_" +#define BTF_ITER_PREFIX "bpf_iter_" +#define BTF_MAX_NAME_SIZE 128 + +void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type, + const char **prefix, int *kind) +{ + switch (attach_type) { + case BPF_TRACE_RAW_TP: + *prefix = BTF_TRACE_PREFIX; + *kind = BTF_KIND_TYPEDEF; + break; + case BPF_LSM_MAC: + case BPF_LSM_CGROUP: + *prefix = BTF_LSM_PREFIX; + *kind = BTF_KIND_FUNC; + break; + case BPF_TRACE_ITER: + *prefix = BTF_ITER_PREFIX; + *kind = BTF_KIND_FUNC; + break; + default: + *prefix = ""; + *kind = BTF_KIND_FUNC; + } +} + +static int find_btf_by_prefix_kind(const struct btf *btf, const char *prefix, + const char *name, __u32 kind) +{ + char btf_type_name[BTF_MAX_NAME_SIZE]; + int ret; + + ret = snprintf(btf_type_name, sizeof(btf_type_name), + "%s%s", prefix, name); + /* snprintf returns the number of characters written excluding the + * terminating null. So, if >= BTF_MAX_NAME_SIZE are written, it + * indicates truncation. + */ + if (ret < 0 || ret >= sizeof(btf_type_name)) + return -ENAMETOOLONG; + return btf__find_by_name_kind(btf, btf_type_name, kind); +} + +static inline int find_attach_btf_id(struct btf *btf, const char *name, + enum bpf_attach_type attach_type) +{ + const char *prefix; + int kind; + + btf_get_kernel_prefix_kind(attach_type, &prefix, &kind); + return find_btf_by_prefix_kind(btf, prefix, name, kind); +} + +int libbpf_find_vmlinux_btf_id(const char *name, + enum bpf_attach_type attach_type) +{ + struct btf *btf; + int err; + + btf = btf__load_vmlinux_btf(); + err = libbpf_get_error(btf); + if (err) { + pr_warn("vmlinux BTF is not found\n"); + return libbpf_err(err); + } + + err = find_attach_btf_id(btf, name, attach_type); + if (err <= 0) + pr_warn("%s is not found in vmlinux BTF\n", name); + + btf__free(btf); + return libbpf_err(err); +} + +static int libbpf_find_prog_btf_id(const char *name, __u32 attach_prog_fd) +{ + struct bpf_prog_info info; + __u32 info_len = sizeof(info); + struct btf *btf; + int err; + + memset(&info, 0, info_len); + err = bpf_prog_get_info_by_fd(attach_prog_fd, &info, &info_len); + if (err) { + pr_warn("failed bpf_prog_get_info_by_fd for FD %d: %d\n", + attach_prog_fd, err); + return err; + } + + err = -EINVAL; + if (!info.btf_id) { + pr_warn("The target program doesn't have BTF\n"); + goto out; + } + btf = btf__load_from_kernel_by_id(info.btf_id); + err = libbpf_get_error(btf); + if (err) { + pr_warn("Failed to get BTF %d of the program: %d\n", info.btf_id, err); + goto out; + } + err = btf__find_by_name_kind(btf, name, BTF_KIND_FUNC); + btf__free(btf); + if (err <= 0) { + pr_warn("%s is not found in prog's BTF\n", name); + goto out; + } +out: + return err; +} + +static int find_kernel_btf_id(struct bpf_object *obj, const char *attach_name, + enum bpf_attach_type attach_type, + int *btf_obj_fd, int *btf_type_id) +{ + int ret, i; + + ret = find_attach_btf_id(obj->btf_vmlinux, attach_name, attach_type); + if (ret > 0) { + *btf_obj_fd = 0; /* vmlinux BTF */ + *btf_type_id = ret; + return 0; + } + if (ret != -ENOENT) + return ret; + + ret = load_module_btfs(obj); + if (ret) + return ret; + + for (i = 0; i < obj->btf_module_cnt; i++) { + const struct module_btf *mod = &obj->btf_modules[i]; + + ret = find_attach_btf_id(mod->btf, attach_name, attach_type); + if (ret > 0) { + *btf_obj_fd = mod->fd; + *btf_type_id = ret; + return 0; + } + if (ret == -ENOENT) + continue; + + return ret; + } + + return -ESRCH; +} + +static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name, + int *btf_obj_fd, int *btf_type_id) +{ + enum bpf_attach_type attach_type = prog->expected_attach_type; + __u32 attach_prog_fd = prog->attach_prog_fd; + int err = 0; + + /* BPF program's BTF ID */ + if (prog->type == BPF_PROG_TYPE_EXT || attach_prog_fd) { + if (!attach_prog_fd) { + pr_warn("prog '%s': attach program FD is not set\n", prog->name); + return -EINVAL; + } + err = libbpf_find_prog_btf_id(attach_name, attach_prog_fd); + if (err < 0) { + pr_warn("prog '%s': failed to find BPF program (FD %d) BTF ID for '%s': %d\n", + prog->name, attach_prog_fd, attach_name, err); + return err; + } + *btf_obj_fd = 0; + *btf_type_id = err; + return 0; + } + + /* kernel/module BTF ID */ + if (prog->obj->gen_loader) { + bpf_gen__record_attach_target(prog->obj->gen_loader, attach_name, attach_type); + *btf_obj_fd = 0; + *btf_type_id = 1; + } else { + err = find_kernel_btf_id(prog->obj, attach_name, attach_type, btf_obj_fd, btf_type_id); + } + if (err) { + pr_warn("prog '%s': failed to find kernel BTF type ID of '%s': %d\n", + prog->name, attach_name, err); + return err; + } + return 0; +} + +int libbpf_attach_type_by_name(const char *name, + enum bpf_attach_type *attach_type) +{ + char *type_names; + const struct bpf_sec_def *sec_def; + + if (!name) + return libbpf_err(-EINVAL); + + sec_def = find_sec_def(name); + if (!sec_def) { + pr_debug("failed to guess attach type based on ELF section name '%s'\n", name); + type_names = libbpf_get_type_names(true); + if (type_names != NULL) { + pr_debug("attachable section(type) names are:%s\n", type_names); + free(type_names); + } + + return libbpf_err(-EINVAL); + } + + if (sec_def->prog_prepare_load_fn != libbpf_prepare_prog_load) + return libbpf_err(-EINVAL); + if (!(sec_def->cookie & SEC_ATTACHABLE)) + return libbpf_err(-EINVAL); + + *attach_type = sec_def->expected_attach_type; + return 0; +} + +int bpf_map__fd(const struct bpf_map *map) +{ + return map ? map->fd : libbpf_err(-EINVAL); +} + +static bool map_uses_real_name(const struct bpf_map *map) +{ + /* Since libbpf started to support custom .data.* and .rodata.* maps, + * their user-visible name differs from kernel-visible name. Users see + * such map's corresponding ELF section name as a map name. + * This check distinguishes .data/.rodata from .data.* and .rodata.* + * maps to know which name has to be returned to the user. + */ + if (map->libbpf_type == LIBBPF_MAP_DATA && strcmp(map->real_name, DATA_SEC) != 0) + return true; + if (map->libbpf_type == LIBBPF_MAP_RODATA && strcmp(map->real_name, RODATA_SEC) != 0) + return true; + return false; +} + +const char *bpf_map__name(const struct bpf_map *map) +{ + if (!map) + return NULL; + + if (map_uses_real_name(map)) + return map->real_name; + + return map->name; +} + +enum bpf_map_type bpf_map__type(const struct bpf_map *map) +{ + return map->def.type; +} + +int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->def.type = type; + return 0; +} + +__u32 bpf_map__map_flags(const struct bpf_map *map) +{ + return map->def.map_flags; +} + +int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->def.map_flags = flags; + return 0; +} + +__u64 bpf_map__map_extra(const struct bpf_map *map) +{ + return map->map_extra; +} + +int bpf_map__set_map_extra(struct bpf_map *map, __u64 map_extra) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->map_extra = map_extra; + return 0; +} + +__u32 bpf_map__numa_node(const struct bpf_map *map) +{ + return map->numa_node; +} + +int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->numa_node = numa_node; + return 0; +} + +__u32 bpf_map__key_size(const struct bpf_map *map) +{ + return map->def.key_size; +} + +int bpf_map__set_key_size(struct bpf_map *map, __u32 size) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->def.key_size = size; + return 0; +} + +__u32 bpf_map__value_size(const struct bpf_map *map) +{ + return map->def.value_size; +} + +int bpf_map__set_value_size(struct bpf_map *map, __u32 size) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->def.value_size = size; + return 0; +} + +__u32 bpf_map__btf_key_type_id(const struct bpf_map *map) +{ + return map ? map->btf_key_type_id : 0; +} + +__u32 bpf_map__btf_value_type_id(const struct bpf_map *map) +{ + return map ? map->btf_value_type_id : 0; +} + +int bpf_map__set_initial_value(struct bpf_map *map, + const void *data, size_t size) +{ + if (!map->mmaped || map->libbpf_type == LIBBPF_MAP_KCONFIG || + size != map->def.value_size || map->fd >= 0) + return libbpf_err(-EINVAL); + + memcpy(map->mmaped, data, size); + return 0; +} + +const void *bpf_map__initial_value(struct bpf_map *map, size_t *psize) +{ + if (!map->mmaped) + return NULL; + *psize = map->def.value_size; + return map->mmaped; +} + +bool bpf_map__is_internal(const struct bpf_map *map) +{ + return map->libbpf_type != LIBBPF_MAP_UNSPEC; +} + +__u32 bpf_map__ifindex(const struct bpf_map *map) +{ + return map->map_ifindex; +} + +int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->map_ifindex = ifindex; + return 0; +} + +int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd) +{ + if (!bpf_map_type__is_map_in_map(map->def.type)) { + pr_warn("error: unsupported map type\n"); + return libbpf_err(-EINVAL); + } + if (map->inner_map_fd != -1) { + pr_warn("error: inner_map_fd already specified\n"); + return libbpf_err(-EINVAL); + } + if (map->inner_map) { + bpf_map__destroy(map->inner_map); + zfree(&map->inner_map); + } + map->inner_map_fd = fd; + return 0; +} + +static struct bpf_map * +__bpf_map__iter(const struct bpf_map *m, const struct bpf_object *obj, int i) +{ + ssize_t idx; + struct bpf_map *s, *e; + + if (!obj || !obj->maps) + return errno = EINVAL, NULL; + + s = obj->maps; + e = obj->maps + obj->nr_maps; + + if ((m < s) || (m >= e)) { + pr_warn("error in %s: map handler doesn't belong to object\n", + __func__); + return errno = EINVAL, NULL; + } + + idx = (m - obj->maps) + i; + if (idx >= obj->nr_maps || idx < 0) + return NULL; + return &obj->maps[idx]; +} + +struct bpf_map * +bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *prev) +{ + if (prev == NULL) + return obj->maps; + + return __bpf_map__iter(prev, obj, 1); +} + +struct bpf_map * +bpf_object__prev_map(const struct bpf_object *obj, const struct bpf_map *next) +{ + if (next == NULL) { + if (!obj->nr_maps) + return NULL; + return obj->maps + obj->nr_maps - 1; + } + + return __bpf_map__iter(next, obj, -1); +} + +struct bpf_map * +bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name) +{ + struct bpf_map *pos; + + bpf_object__for_each_map(pos, obj) { + /* if it's a special internal map name (which always starts + * with dot) then check if that special name matches the + * real map name (ELF section name) + */ + if (name[0] == '.') { + if (pos->real_name && strcmp(pos->real_name, name) == 0) + return pos; + continue; + } + /* otherwise map name has to be an exact match */ + if (map_uses_real_name(pos)) { + if (strcmp(pos->real_name, name) == 0) + return pos; + continue; + } + if (strcmp(pos->name, name) == 0) + return pos; + } + return errno = ENOENT, NULL; +} + +int +bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name) +{ + return bpf_map__fd(bpf_object__find_map_by_name(obj, name)); +} + +static int validate_map_op(const struct bpf_map *map, size_t key_sz, + size_t value_sz, bool check_value_sz) +{ + if (map->fd <= 0) + return -ENOENT; + + if (map->def.key_size != key_sz) { + pr_warn("map '%s': unexpected key size %zu provided, expected %u\n", + map->name, key_sz, map->def.key_size); + return -EINVAL; + } + + if (!check_value_sz) + return 0; + + switch (map->def.type) { + case BPF_MAP_TYPE_PERCPU_ARRAY: + case BPF_MAP_TYPE_PERCPU_HASH: + case BPF_MAP_TYPE_LRU_PERCPU_HASH: + case BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: { + int num_cpu = libbpf_num_possible_cpus(); + size_t elem_sz = roundup(map->def.value_size, 8); + + if (value_sz != num_cpu * elem_sz) { + pr_warn("map '%s': unexpected value size %zu provided for per-CPU map, expected %d * %zu = %zd\n", + map->name, value_sz, num_cpu, elem_sz, num_cpu * elem_sz); + return -EINVAL; + } + break; + } + default: + if (map->def.value_size != value_sz) { + pr_warn("map '%s': unexpected value size %zu provided, expected %u\n", + map->name, value_sz, map->def.value_size); + return -EINVAL; + } + break; + } + return 0; +} + +int bpf_map__lookup_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags) +{ + int err; + + err = validate_map_op(map, key_sz, value_sz, true); + if (err) + return libbpf_err(err); + + return bpf_map_lookup_elem_flags(map->fd, key, value, flags); +} + +int bpf_map__update_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + const void *value, size_t value_sz, __u64 flags) +{ + int err; + + err = validate_map_op(map, key_sz, value_sz, true); + if (err) + return libbpf_err(err); + + return bpf_map_update_elem(map->fd, key, value, flags); +} + +int bpf_map__delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, __u64 flags) +{ + int err; + + err = validate_map_op(map, key_sz, 0, false /* check_value_sz */); + if (err) + return libbpf_err(err); + + return bpf_map_delete_elem_flags(map->fd, key, flags); +} + +int bpf_map__lookup_and_delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags) +{ + int err; + + err = validate_map_op(map, key_sz, value_sz, true); + if (err) + return libbpf_err(err); + + return bpf_map_lookup_and_delete_elem_flags(map->fd, key, value, flags); +} + +int bpf_map__get_next_key(const struct bpf_map *map, + const void *cur_key, void *next_key, size_t key_sz) +{ + int err; + + err = validate_map_op(map, key_sz, 0, false /* check_value_sz */); + if (err) + return libbpf_err(err); + + return bpf_map_get_next_key(map->fd, cur_key, next_key); +} + +long libbpf_get_error(const void *ptr) +{ + if (!IS_ERR_OR_NULL(ptr)) + return 0; + + if (IS_ERR(ptr)) + errno = -PTR_ERR(ptr); + + /* If ptr == NULL, then errno should be already set by the failing + * API, because libbpf never returns NULL on success and it now always + * sets errno on error. So no extra errno handling for ptr == NULL + * case. + */ + return -errno; +} + +/* Replace link's underlying BPF program with the new one */ +int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog) +{ + int ret; + + ret = bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL); + return libbpf_err_errno(ret); +} + +/* Release "ownership" of underlying BPF resource (typically, BPF program + * attached to some BPF hook, e.g., tracepoint, kprobe, etc). Disconnected + * link, when destructed through bpf_link__destroy() call won't attempt to + * detach/unregisted that BPF resource. This is useful in situations where, + * say, attached BPF program has to outlive userspace program that attached it + * in the system. Depending on type of BPF program, though, there might be + * additional steps (like pinning BPF program in BPF FS) necessary to ensure + * exit of userspace program doesn't trigger automatic detachment and clean up + * inside the kernel. + */ +void bpf_link__disconnect(struct bpf_link *link) +{ + link->disconnected = true; +} + +int bpf_link__destroy(struct bpf_link *link) +{ + int err = 0; + + if (IS_ERR_OR_NULL(link)) + return 0; + + if (!link->disconnected && link->detach) + err = link->detach(link); + if (link->pin_path) + free(link->pin_path); + if (link->dealloc) + link->dealloc(link); + else + free(link); + + return libbpf_err(err); +} + +int bpf_link__fd(const struct bpf_link *link) +{ + return link->fd; +} + +const char *bpf_link__pin_path(const struct bpf_link *link) +{ + return link->pin_path; +} + +static int bpf_link__detach_fd(struct bpf_link *link) +{ + return libbpf_err_errno(close(link->fd)); +} + +struct bpf_link *bpf_link__open(const char *path) +{ + struct bpf_link *link; + int fd; + + fd = bpf_obj_get(path); + if (fd < 0) { + fd = -errno; + pr_warn("failed to open link at %s: %d\n", path, fd); + return libbpf_err_ptr(fd); + } + + link = calloc(1, sizeof(*link)); + if (!link) { + close(fd); + return libbpf_err_ptr(-ENOMEM); + } + link->detach = &bpf_link__detach_fd; + link->fd = fd; + + link->pin_path = strdup(path); + if (!link->pin_path) { + bpf_link__destroy(link); + return libbpf_err_ptr(-ENOMEM); + } + + return link; +} + +int bpf_link__detach(struct bpf_link *link) +{ + return bpf_link_detach(link->fd) ? -errno : 0; +} + +int bpf_link__pin(struct bpf_link *link, const char *path) +{ + int err; + + if (link->pin_path) + return libbpf_err(-EBUSY); + err = make_parent_dir(path); + if (err) + return libbpf_err(err); + err = check_path(path); + if (err) + return libbpf_err(err); + + link->pin_path = strdup(path); + if (!link->pin_path) + return libbpf_err(-ENOMEM); + + if (bpf_obj_pin(link->fd, link->pin_path)) { + err = -errno; + zfree(&link->pin_path); + return libbpf_err(err); + } + + pr_debug("link fd=%d: pinned at %s\n", link->fd, link->pin_path); + return 0; +} + +int bpf_link__unpin(struct bpf_link *link) +{ + int err; + + if (!link->pin_path) + return libbpf_err(-EINVAL); + + err = unlink(link->pin_path); + if (err != 0) + return -errno; + + pr_debug("link fd=%d: unpinned from %s\n", link->fd, link->pin_path); + zfree(&link->pin_path); + return 0; +} + +struct bpf_link_perf { + struct bpf_link link; + int perf_event_fd; + /* legacy kprobe support: keep track of probe identifier and type */ + char *legacy_probe_name; + bool legacy_is_kprobe; + bool legacy_is_retprobe; +}; + +static int remove_kprobe_event_legacy(const char *probe_name, bool retprobe); +static int remove_uprobe_event_legacy(const char *probe_name, bool retprobe); + +static int bpf_link_perf_detach(struct bpf_link *link) +{ + struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link); + int err = 0; + + if (ioctl(perf_link->perf_event_fd, PERF_EVENT_IOC_DISABLE, 0) < 0) + err = -errno; + + if (perf_link->perf_event_fd != link->fd) + close(perf_link->perf_event_fd); + close(link->fd); + + /* legacy uprobe/kprobe needs to be removed after perf event fd closure */ + if (perf_link->legacy_probe_name) { + if (perf_link->legacy_is_kprobe) { + err = remove_kprobe_event_legacy(perf_link->legacy_probe_name, + perf_link->legacy_is_retprobe); + } else { + err = remove_uprobe_event_legacy(perf_link->legacy_probe_name, + perf_link->legacy_is_retprobe); + } + } + + return err; +} + +static void bpf_link_perf_dealloc(struct bpf_link *link) +{ + struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link); + + free(perf_link->legacy_probe_name); + free(perf_link); +} + +struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd, + const struct bpf_perf_event_opts *opts) +{ + char errmsg[STRERR_BUFSIZE]; + struct bpf_link_perf *link; + int prog_fd, link_fd = -1, err; + + if (!OPTS_VALID(opts, bpf_perf_event_opts)) + return libbpf_err_ptr(-EINVAL); + + if (pfd < 0) { + pr_warn("prog '%s': invalid perf event FD %d\n", + prog->name, pfd); + return libbpf_err_ptr(-EINVAL); + } + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach BPF program w/o FD (did you load it?)\n", + prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->link.detach = &bpf_link_perf_detach; + link->link.dealloc = &bpf_link_perf_dealloc; + link->perf_event_fd = pfd; + + if (kernel_supports(prog->obj, FEAT_PERF_LINK)) { + DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_opts, + .perf_event.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0)); + + link_fd = bpf_link_create(prog_fd, pfd, BPF_PERF_EVENT, &link_opts); + if (link_fd < 0) { + err = -errno; + pr_warn("prog '%s': failed to create BPF link for perf_event FD %d: %d (%s)\n", + prog->name, pfd, + err, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_out; + } + link->link.fd = link_fd; + } else { + if (OPTS_GET(opts, bpf_cookie, 0)) { + pr_warn("prog '%s': user context value is not supported\n", prog->name); + err = -EOPNOTSUPP; + goto err_out; + } + + if (ioctl(pfd, PERF_EVENT_IOC_SET_BPF, prog_fd) < 0) { + err = -errno; + pr_warn("prog '%s': failed to attach to perf_event FD %d: %s\n", + prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + if (err == -EPROTO) + pr_warn("prog '%s': try add PERF_SAMPLE_CALLCHAIN to or remove exclude_callchain_[kernel|user] from pfd %d\n", + prog->name, pfd); + goto err_out; + } + link->link.fd = pfd; + } + if (ioctl(pfd, PERF_EVENT_IOC_ENABLE, 0) < 0) { + err = -errno; + pr_warn("prog '%s': failed to enable perf_event FD %d: %s\n", + prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_out; + } + + return &link->link; +err_out: + if (link_fd >= 0) + close(link_fd); + free(link); + return libbpf_err_ptr(err); +} + +struct bpf_link *bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd) +{ + return bpf_program__attach_perf_event_opts(prog, pfd, NULL); +} + +/* + * this function is expected to parse integer in the range of [0, 2^31-1] from + * given file using scanf format string fmt. If actual parsed value is + * negative, the result might be indistinguishable from error + */ +static int parse_uint_from_file(const char *file, const char *fmt) +{ + char buf[STRERR_BUFSIZE]; + int err, ret; + FILE *f; + + f = fopen(file, "r"); + if (!f) { + err = -errno; + pr_debug("failed to open '%s': %s\n", file, + libbpf_strerror_r(err, buf, sizeof(buf))); + return err; + } + err = fscanf(f, fmt, &ret); + if (err != 1) { + err = err == EOF ? -EIO : -errno; + pr_debug("failed to parse '%s': %s\n", file, + libbpf_strerror_r(err, buf, sizeof(buf))); + fclose(f); + return err; + } + fclose(f); + return ret; +} + +static int determine_kprobe_perf_type(void) +{ + const char *file = "/sys/bus/event_source/devices/kprobe/type"; + + return parse_uint_from_file(file, "%d\n"); +} + +static int determine_uprobe_perf_type(void) +{ + const char *file = "/sys/bus/event_source/devices/uprobe/type"; + + return parse_uint_from_file(file, "%d\n"); +} + +static int determine_kprobe_retprobe_bit(void) +{ + const char *file = "/sys/bus/event_source/devices/kprobe/format/retprobe"; + + return parse_uint_from_file(file, "config:%d\n"); +} + +static int determine_uprobe_retprobe_bit(void) +{ + const char *file = "/sys/bus/event_source/devices/uprobe/format/retprobe"; + + return parse_uint_from_file(file, "config:%d\n"); +} + +#define PERF_UPROBE_REF_CTR_OFFSET_BITS 32 +#define PERF_UPROBE_REF_CTR_OFFSET_SHIFT 32 + +static int perf_event_open_probe(bool uprobe, bool retprobe, const char *name, + uint64_t offset, int pid, size_t ref_ctr_off) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_event_attr attr; + char errmsg[STRERR_BUFSIZE]; + int type, pfd; + + if ((__u64)ref_ctr_off >= (1ULL << PERF_UPROBE_REF_CTR_OFFSET_BITS)) + return -EINVAL; + + memset(&attr, 0, attr_sz); + + type = uprobe ? determine_uprobe_perf_type() + : determine_kprobe_perf_type(); + if (type < 0) { + pr_warn("failed to determine %s perf type: %s\n", + uprobe ? "uprobe" : "kprobe", + libbpf_strerror_r(type, errmsg, sizeof(errmsg))); + return type; + } + if (retprobe) { + int bit = uprobe ? determine_uprobe_retprobe_bit() + : determine_kprobe_retprobe_bit(); + + if (bit < 0) { + pr_warn("failed to determine %s retprobe bit: %s\n", + uprobe ? "uprobe" : "kprobe", + libbpf_strerror_r(bit, errmsg, sizeof(errmsg))); + return bit; + } + attr.config |= 1 << bit; + } + attr.size = attr_sz; + attr.type = type; + attr.config |= (__u64)ref_ctr_off << PERF_UPROBE_REF_CTR_OFFSET_SHIFT; + attr.config1 = ptr_to_u64(name); /* kprobe_func or uprobe_path */ + attr.config2 = offset; /* kprobe_addr or probe_offset */ + + /* pid filter is meaningful only for uprobes */ + pfd = syscall(__NR_perf_event_open, &attr, + pid < 0 ? -1 : pid /* pid */, + pid == -1 ? 0 : -1 /* cpu */, + -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC); + return pfd >= 0 ? pfd : -errno; +} + +static int append_to_file(const char *file, const char *fmt, ...) +{ + int fd, n, err = 0; + va_list ap; + + fd = open(file, O_WRONLY | O_APPEND | O_CLOEXEC, 0); + if (fd < 0) + return -errno; + + va_start(ap, fmt); + n = vdprintf(fd, fmt, ap); + va_end(ap); + + if (n < 0) + err = -errno; + + close(fd); + return err; +} + +#define DEBUGFS "/sys/kernel/debug/tracing" +#define TRACEFS "/sys/kernel/tracing" + +static bool use_debugfs(void) +{ + static int has_debugfs = -1; + + if (has_debugfs < 0) + has_debugfs = faccessat(AT_FDCWD, DEBUGFS, F_OK, AT_EACCESS) == 0; + + return has_debugfs == 1; +} + +static const char *tracefs_path(void) +{ + return use_debugfs() ? DEBUGFS : TRACEFS; +} + +static const char *tracefs_kprobe_events(void) +{ + return use_debugfs() ? DEBUGFS"/kprobe_events" : TRACEFS"/kprobe_events"; +} + +static const char *tracefs_uprobe_events(void) +{ + return use_debugfs() ? DEBUGFS"/uprobe_events" : TRACEFS"/uprobe_events"; +} + +static void gen_kprobe_legacy_event_name(char *buf, size_t buf_sz, + const char *kfunc_name, size_t offset) +{ + static int index = 0; + int i; + + snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx_%d", getpid(), kfunc_name, offset, + __sync_fetch_and_add(&index, 1)); + + /* sanitize binary_path in the probe name */ + for (i = 0; buf[i]; i++) { + if (!isalnum(buf[i])) + buf[i] = '_'; + } +} + +static int add_kprobe_event_legacy(const char *probe_name, bool retprobe, + const char *kfunc_name, size_t offset) +{ + return append_to_file(tracefs_kprobe_events(), "%c:%s/%s %s+0x%zx", + retprobe ? 'r' : 'p', + retprobe ? "kretprobes" : "kprobes", + probe_name, kfunc_name, offset); +} + +static int remove_kprobe_event_legacy(const char *probe_name, bool retprobe) +{ + return append_to_file(tracefs_kprobe_events(), "-:%s/%s", + retprobe ? "kretprobes" : "kprobes", probe_name); +} + +static int determine_kprobe_perf_type_legacy(const char *probe_name, bool retprobe) +{ + char file[256]; + + snprintf(file, sizeof(file), "%s/events/%s/%s/id", + tracefs_path(), retprobe ? "kretprobes" : "kprobes", probe_name); + + return parse_uint_from_file(file, "%d\n"); +} + +static int perf_event_kprobe_open_legacy(const char *probe_name, bool retprobe, + const char *kfunc_name, size_t offset, int pid) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_event_attr attr; + char errmsg[STRERR_BUFSIZE]; + int type, pfd, err; + + err = add_kprobe_event_legacy(probe_name, retprobe, kfunc_name, offset); + if (err < 0) { + pr_warn("failed to add legacy kprobe event for '%s+0x%zx': %s\n", + kfunc_name, offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + return err; + } + type = determine_kprobe_perf_type_legacy(probe_name, retprobe); + if (type < 0) { + err = type; + pr_warn("failed to determine legacy kprobe event id for '%s+0x%zx': %s\n", + kfunc_name, offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_clean_legacy; + } + + memset(&attr, 0, attr_sz); + attr.size = attr_sz; + attr.config = type; + attr.type = PERF_TYPE_TRACEPOINT; + + pfd = syscall(__NR_perf_event_open, &attr, + pid < 0 ? -1 : pid, /* pid */ + pid == -1 ? 0 : -1, /* cpu */ + -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC); + if (pfd < 0) { + err = -errno; + pr_warn("legacy kprobe perf_event_open() failed: %s\n", + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_clean_legacy; + } + return pfd; + +err_clean_legacy: + /* Clear the newly added legacy kprobe_event */ + remove_kprobe_event_legacy(probe_name, retprobe); + return err; +} + +static const char *arch_specific_syscall_pfx(void) +{ +#if defined(__x86_64__) + return "x64"; +#elif defined(__i386__) + return "ia32"; +#elif defined(__s390x__) + return "s390x"; +#elif defined(__s390__) + return "s390"; +#elif defined(__arm__) + return "arm"; +#elif defined(__aarch64__) + return "arm64"; +#elif defined(__mips__) + return "mips"; +#elif defined(__riscv) + return "riscv"; +#elif defined(__powerpc__) + return "powerpc"; +#elif defined(__powerpc64__) + return "powerpc64"; +#else + return NULL; +#endif +} + +static int probe_kern_syscall_wrapper(void) +{ + char syscall_name[64]; + const char *ksys_pfx; + + ksys_pfx = arch_specific_syscall_pfx(); + if (!ksys_pfx) + return 0; + + snprintf(syscall_name, sizeof(syscall_name), "__%s_sys_bpf", ksys_pfx); + + if (determine_kprobe_perf_type() >= 0) { + int pfd; + + pfd = perf_event_open_probe(false, false, syscall_name, 0, getpid(), 0); + if (pfd >= 0) + close(pfd); + + return pfd >= 0 ? 1 : 0; + } else { /* legacy mode */ + char probe_name[128]; + + gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0); + if (add_kprobe_event_legacy(probe_name, false, syscall_name, 0) < 0) + return 0; + + (void)remove_kprobe_event_legacy(probe_name, false); + return 1; + } +} + +struct bpf_link * +bpf_program__attach_kprobe_opts(const struct bpf_program *prog, + const char *func_name, + const struct bpf_kprobe_opts *opts) +{ + DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts); + char errmsg[STRERR_BUFSIZE]; + char *legacy_probe = NULL; + struct bpf_link *link; + size_t offset; + bool retprobe, legacy; + int pfd, err; + + if (!OPTS_VALID(opts, bpf_kprobe_opts)) + return libbpf_err_ptr(-EINVAL); + + retprobe = OPTS_GET(opts, retprobe, false); + offset = OPTS_GET(opts, offset, 0); + pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + + legacy = determine_kprobe_perf_type() < 0; + if (!legacy) { + pfd = perf_event_open_probe(false /* uprobe */, retprobe, + func_name, offset, + -1 /* pid */, 0 /* ref_ctr_off */); + } else { + char probe_name[256]; + + gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), + func_name, offset); + + legacy_probe = strdup(probe_name); + if (!legacy_probe) + return libbpf_err_ptr(-ENOMEM); + + pfd = perf_event_kprobe_open_legacy(legacy_probe, retprobe, func_name, + offset, -1 /* pid */); + } + if (pfd < 0) { + err = -errno; + pr_warn("prog '%s': failed to create %s '%s+0x%zx' perf event: %s\n", + prog->name, retprobe ? "kretprobe" : "kprobe", + func_name, offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_out; + } + link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); + err = libbpf_get_error(link); + if (err) { + close(pfd); + pr_warn("prog '%s': failed to attach to %s '%s+0x%zx': %s\n", + prog->name, retprobe ? "kretprobe" : "kprobe", + func_name, offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_clean_legacy; + } + if (legacy) { + struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link); + + perf_link->legacy_probe_name = legacy_probe; + perf_link->legacy_is_kprobe = true; + perf_link->legacy_is_retprobe = retprobe; + } + + return link; + +err_clean_legacy: + if (legacy) + remove_kprobe_event_legacy(legacy_probe, retprobe); +err_out: + free(legacy_probe); + return libbpf_err_ptr(err); +} + +struct bpf_link *bpf_program__attach_kprobe(const struct bpf_program *prog, + bool retprobe, + const char *func_name) +{ + DECLARE_LIBBPF_OPTS(bpf_kprobe_opts, opts, + .retprobe = retprobe, + ); + + return bpf_program__attach_kprobe_opts(prog, func_name, &opts); +} + +struct bpf_link *bpf_program__attach_ksyscall(const struct bpf_program *prog, + const char *syscall_name, + const struct bpf_ksyscall_opts *opts) +{ + LIBBPF_OPTS(bpf_kprobe_opts, kprobe_opts); + char func_name[128]; + + if (!OPTS_VALID(opts, bpf_ksyscall_opts)) + return libbpf_err_ptr(-EINVAL); + + if (kernel_supports(prog->obj, FEAT_SYSCALL_WRAPPER)) { + /* arch_specific_syscall_pfx() should never return NULL here + * because it is guarded by kernel_supports(). However, since + * compiler does not know that we have an explicit conditional + * as well. + */ + snprintf(func_name, sizeof(func_name), "__%s_sys_%s", + arch_specific_syscall_pfx() ? : "", syscall_name); + } else { + snprintf(func_name, sizeof(func_name), "__se_sys_%s", syscall_name); + } + + kprobe_opts.retprobe = OPTS_GET(opts, retprobe, false); + kprobe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + + return bpf_program__attach_kprobe_opts(prog, func_name, &kprobe_opts); +} + +/* Adapted from perf/util/string.c */ +static bool glob_match(const char *str, const char *pat) +{ + while (*str && *pat && *pat != '*') { + if (*pat == '?') { /* Matches any single character */ + str++; + pat++; + continue; + } + if (*str != *pat) + return false; + str++; + pat++; + } + /* Check wild card */ + if (*pat == '*') { + while (*pat == '*') + pat++; + if (!*pat) /* Tail wild card matches all */ + return true; + while (*str) + if (glob_match(str++, pat)) + return true; + } + return !*str && !*pat; +} + +struct kprobe_multi_resolve { + const char *pattern; + unsigned long *addrs; + size_t cap; + size_t cnt; +}; + +static int +resolve_kprobe_multi_cb(unsigned long long sym_addr, char sym_type, + const char *sym_name, void *ctx) +{ + struct kprobe_multi_resolve *res = ctx; + int err; + + if (!glob_match(sym_name, res->pattern)) + return 0; + + err = libbpf_ensure_mem((void **) &res->addrs, &res->cap, sizeof(unsigned long), + res->cnt + 1); + if (err) + return err; + + res->addrs[res->cnt++] = (unsigned long) sym_addr; + return 0; +} + +struct bpf_link * +bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, + const char *pattern, + const struct bpf_kprobe_multi_opts *opts) +{ + LIBBPF_OPTS(bpf_link_create_opts, lopts); + struct kprobe_multi_resolve res = { + .pattern = pattern, + }; + struct bpf_link *link = NULL; + char errmsg[STRERR_BUFSIZE]; + const unsigned long *addrs; + int err, link_fd, prog_fd; + const __u64 *cookies; + const char **syms; + bool retprobe; + size_t cnt; + + if (!OPTS_VALID(opts, bpf_kprobe_multi_opts)) + return libbpf_err_ptr(-EINVAL); + + syms = OPTS_GET(opts, syms, false); + addrs = OPTS_GET(opts, addrs, false); + cnt = OPTS_GET(opts, cnt, false); + cookies = OPTS_GET(opts, cookies, false); + + if (!pattern && !addrs && !syms) + return libbpf_err_ptr(-EINVAL); + if (pattern && (addrs || syms || cookies || cnt)) + return libbpf_err_ptr(-EINVAL); + if (!pattern && !cnt) + return libbpf_err_ptr(-EINVAL); + if (addrs && syms) + return libbpf_err_ptr(-EINVAL); + + if (pattern) { + err = libbpf_kallsyms_parse(resolve_kprobe_multi_cb, &res); + if (err) + goto error; + if (!res.cnt) { + err = -ENOENT; + goto error; + } + addrs = res.addrs; + cnt = res.cnt; + } + + retprobe = OPTS_GET(opts, retprobe, false); + + lopts.kprobe_multi.syms = syms; + lopts.kprobe_multi.addrs = addrs; + lopts.kprobe_multi.cookies = cookies; + lopts.kprobe_multi.cnt = cnt; + lopts.kprobe_multi.flags = retprobe ? BPF_F_KPROBE_MULTI_RETURN : 0; + + link = calloc(1, sizeof(*link)); + if (!link) { + err = -ENOMEM; + goto error; + } + link->detach = &bpf_link__detach_fd; + + prog_fd = bpf_program__fd(prog); + link_fd = bpf_link_create(prog_fd, 0, BPF_TRACE_KPROBE_MULTI, &lopts); + if (link_fd < 0) { + err = -errno; + pr_warn("prog '%s': failed to attach: %s\n", + prog->name, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto error; + } + link->fd = link_fd; + free(res.addrs); + return link; + +error: + free(link); + free(res.addrs); + return libbpf_err_ptr(err); +} + +static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + DECLARE_LIBBPF_OPTS(bpf_kprobe_opts, opts); + unsigned long offset = 0; + const char *func_name; + char *func; + int n; + + *link = NULL; + + /* no auto-attach for SEC("kprobe") and SEC("kretprobe") */ + if (strcmp(prog->sec_name, "kprobe") == 0 || strcmp(prog->sec_name, "kretprobe") == 0) + return 0; + + opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe/"); + if (opts.retprobe) + func_name = prog->sec_name + sizeof("kretprobe/") - 1; + else + func_name = prog->sec_name + sizeof("kprobe/") - 1; + + n = sscanf(func_name, "%m[a-zA-Z0-9_.]+%li", &func, &offset); + if (n < 1) { + pr_warn("kprobe name is invalid: %s\n", func_name); + return -EINVAL; + } + if (opts.retprobe && offset != 0) { + free(func); + pr_warn("kretprobes do not support offset specification\n"); + return -EINVAL; + } + + opts.offset = offset; + *link = bpf_program__attach_kprobe_opts(prog, func, &opts); + free(func); + return libbpf_get_error(*link); +} + +static int attach_ksyscall(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + LIBBPF_OPTS(bpf_ksyscall_opts, opts); + const char *syscall_name; + + *link = NULL; + + /* no auto-attach for SEC("ksyscall") and SEC("kretsyscall") */ + if (strcmp(prog->sec_name, "ksyscall") == 0 || strcmp(prog->sec_name, "kretsyscall") == 0) + return 0; + + opts.retprobe = str_has_pfx(prog->sec_name, "kretsyscall/"); + if (opts.retprobe) + syscall_name = prog->sec_name + sizeof("kretsyscall/") - 1; + else + syscall_name = prog->sec_name + sizeof("ksyscall/") - 1; + + *link = bpf_program__attach_ksyscall(prog, syscall_name, &opts); + return *link ? 0 : -errno; +} + +static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + LIBBPF_OPTS(bpf_kprobe_multi_opts, opts); + const char *spec; + char *pattern; + int n; + + *link = NULL; + + /* no auto-attach for SEC("kprobe.multi") and SEC("kretprobe.multi") */ + if (strcmp(prog->sec_name, "kprobe.multi") == 0 || + strcmp(prog->sec_name, "kretprobe.multi") == 0) + return 0; + + opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe.multi/"); + if (opts.retprobe) + spec = prog->sec_name + sizeof("kretprobe.multi/") - 1; + else + spec = prog->sec_name + sizeof("kprobe.multi/") - 1; + + n = sscanf(spec, "%m[a-zA-Z0-9_.*?]", &pattern); + if (n < 1) { + pr_warn("kprobe multi pattern is invalid: %s\n", pattern); + return -EINVAL; + } + + *link = bpf_program__attach_kprobe_multi_opts(prog, pattern, &opts); + free(pattern); + return libbpf_get_error(*link); +} + +static void gen_uprobe_legacy_event_name(char *buf, size_t buf_sz, + const char *binary_path, uint64_t offset) +{ + int i; + + snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx", getpid(), binary_path, (size_t)offset); + + /* sanitize binary_path in the probe name */ + for (i = 0; buf[i]; i++) { + if (!isalnum(buf[i])) + buf[i] = '_'; + } +} + +static inline int add_uprobe_event_legacy(const char *probe_name, bool retprobe, + const char *binary_path, size_t offset) +{ + return append_to_file(tracefs_uprobe_events(), "%c:%s/%s %s:0x%zx", + retprobe ? 'r' : 'p', + retprobe ? "uretprobes" : "uprobes", + probe_name, binary_path, offset); +} + +static inline int remove_uprobe_event_legacy(const char *probe_name, bool retprobe) +{ + return append_to_file(tracefs_uprobe_events(), "-:%s/%s", + retprobe ? "uretprobes" : "uprobes", probe_name); +} + +static int determine_uprobe_perf_type_legacy(const char *probe_name, bool retprobe) +{ + char file[512]; + + snprintf(file, sizeof(file), "%s/events/%s/%s/id", + tracefs_path(), retprobe ? "uretprobes" : "uprobes", probe_name); + + return parse_uint_from_file(file, "%d\n"); +} + +static int perf_event_uprobe_open_legacy(const char *probe_name, bool retprobe, + const char *binary_path, size_t offset, int pid) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_event_attr attr; + int type, pfd, err; + + err = add_uprobe_event_legacy(probe_name, retprobe, binary_path, offset); + if (err < 0) { + pr_warn("failed to add legacy uprobe event for %s:0x%zx: %d\n", + binary_path, (size_t)offset, err); + return err; + } + type = determine_uprobe_perf_type_legacy(probe_name, retprobe); + if (type < 0) { + err = type; + pr_warn("failed to determine legacy uprobe event id for %s:0x%zx: %d\n", + binary_path, offset, err); + goto err_clean_legacy; + } + + memset(&attr, 0, attr_sz); + attr.size = attr_sz; + attr.config = type; + attr.type = PERF_TYPE_TRACEPOINT; + + pfd = syscall(__NR_perf_event_open, &attr, + pid < 0 ? -1 : pid, /* pid */ + pid == -1 ? 0 : -1, /* cpu */ + -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC); + if (pfd < 0) { + err = -errno; + pr_warn("legacy uprobe perf_event_open() failed: %d\n", err); + goto err_clean_legacy; + } + return pfd; + +err_clean_legacy: + /* Clear the newly added legacy uprobe_event */ + remove_uprobe_event_legacy(probe_name, retprobe); + return err; +} + +/* Return next ELF section of sh_type after scn, or first of that type if scn is NULL. */ +static Elf_Scn *elf_find_next_scn_by_type(Elf *elf, int sh_type, Elf_Scn *scn) +{ + while ((scn = elf_nextscn(elf, scn)) != NULL) { + GElf_Shdr sh; + + if (!gelf_getshdr(scn, &sh)) + continue; + if (sh.sh_type == sh_type) + return scn; + } + return NULL; +} + +/* Find offset of function name in object specified by path. "name" matches + * symbol name or name@@LIB for library functions. + */ +static long elf_find_func_offset(const char *binary_path, const char *name) +{ + int fd, i, sh_types[2] = { SHT_DYNSYM, SHT_SYMTAB }; + bool is_shared_lib, is_name_qualified; + char errmsg[STRERR_BUFSIZE]; + long ret = -ENOENT; + size_t name_len; + GElf_Ehdr ehdr; + Elf *elf; + + fd = open(binary_path, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + ret = -errno; + pr_warn("failed to open %s: %s\n", binary_path, + libbpf_strerror_r(ret, errmsg, sizeof(errmsg))); + return ret; + } + elf = elf_begin(fd, ELF_C_READ_MMAP, NULL); + if (!elf) { + pr_warn("elf: could not read elf from %s: %s\n", binary_path, elf_errmsg(-1)); + close(fd); + return -LIBBPF_ERRNO__FORMAT; + } + if (!gelf_getehdr(elf, &ehdr)) { + pr_warn("elf: failed to get ehdr from %s: %s\n", binary_path, elf_errmsg(-1)); + ret = -LIBBPF_ERRNO__FORMAT; + goto out; + } + /* for shared lib case, we do not need to calculate relative offset */ + is_shared_lib = ehdr.e_type == ET_DYN; + + name_len = strlen(name); + /* Does name specify "@@LIB"? */ + is_name_qualified = strstr(name, "@@") != NULL; + + /* Search SHT_DYNSYM, SHT_SYMTAB for symbol. This search order is used because if + * a binary is stripped, it may only have SHT_DYNSYM, and a fully-statically + * linked binary may not have SHT_DYMSYM, so absence of a section should not be + * reported as a warning/error. + */ + for (i = 0; i < ARRAY_SIZE(sh_types); i++) { + size_t nr_syms, strtabidx, idx; + Elf_Data *symbols = NULL; + Elf_Scn *scn = NULL; + int last_bind = -1; + const char *sname; + GElf_Shdr sh; + + scn = elf_find_next_scn_by_type(elf, sh_types[i], NULL); + if (!scn) { + pr_debug("elf: failed to find symbol table ELF sections in '%s'\n", + binary_path); + continue; + } + if (!gelf_getshdr(scn, &sh)) + continue; + strtabidx = sh.sh_link; + symbols = elf_getdata(scn, 0); + if (!symbols) { + pr_warn("elf: failed to get symbols for symtab section in '%s': %s\n", + binary_path, elf_errmsg(-1)); + ret = -LIBBPF_ERRNO__FORMAT; + goto out; + } + nr_syms = symbols->d_size / sh.sh_entsize; + + for (idx = 0; idx < nr_syms; idx++) { + int curr_bind; + GElf_Sym sym; + Elf_Scn *sym_scn; + GElf_Shdr sym_sh; + + if (!gelf_getsym(symbols, idx, &sym)) + continue; + + if (GELF_ST_TYPE(sym.st_info) != STT_FUNC) + continue; + + sname = elf_strptr(elf, strtabidx, sym.st_name); + if (!sname) + continue; + + curr_bind = GELF_ST_BIND(sym.st_info); + + /* User can specify func, func@@LIB or func@@LIB_VERSION. */ + if (strncmp(sname, name, name_len) != 0) + continue; + /* ...but we don't want a search for "foo" to match 'foo2" also, so any + * additional characters in sname should be of the form "@@LIB". + */ + if (!is_name_qualified && sname[name_len] != '\0' && sname[name_len] != '@') + continue; + + if (ret >= 0) { + /* handle multiple matches */ + if (last_bind != STB_WEAK && curr_bind != STB_WEAK) { + /* Only accept one non-weak bind. */ + pr_warn("elf: ambiguous match for '%s', '%s' in '%s'\n", + sname, name, binary_path); + ret = -LIBBPF_ERRNO__FORMAT; + goto out; + } else if (curr_bind == STB_WEAK) { + /* already have a non-weak bind, and + * this is a weak bind, so ignore. + */ + continue; + } + } + + /* Transform symbol's virtual address (absolute for + * binaries and relative for shared libs) into file + * offset, which is what kernel is expecting for + * uprobe/uretprobe attachment. + * See Documentation/trace/uprobetracer.rst for more + * details. + * This is done by looking up symbol's containing + * section's header and using it's virtual address + * (sh_addr) and corresponding file offset (sh_offset) + * to transform sym.st_value (virtual address) into + * desired final file offset. + */ + sym_scn = elf_getscn(elf, sym.st_shndx); + if (!sym_scn) + continue; + if (!gelf_getshdr(sym_scn, &sym_sh)) + continue; + + ret = sym.st_value - sym_sh.sh_addr + sym_sh.sh_offset; + last_bind = curr_bind; + } + if (ret > 0) + break; + } + + if (ret > 0) { + pr_debug("elf: symbol address match for '%s' in '%s': 0x%lx\n", name, binary_path, + ret); + } else { + if (ret == 0) { + pr_warn("elf: '%s' is 0 in symtab for '%s': %s\n", name, binary_path, + is_shared_lib ? "should not be 0 in a shared library" : + "try using shared library path instead"); + ret = -ENOENT; + } else { + pr_warn("elf: failed to find symbol '%s' in '%s'\n", name, binary_path); + } + } +out: + elf_end(elf); + close(fd); + return ret; +} + +static const char *arch_specific_lib_paths(void) +{ + /* + * Based on https://packages.debian.org/sid/libc6. + * + * Assume that the traced program is built for the same architecture + * as libbpf, which should cover the vast majority of cases. + */ +#if defined(__x86_64__) + return "/lib/x86_64-linux-gnu"; +#elif defined(__i386__) + return "/lib/i386-linux-gnu"; +#elif defined(__s390x__) + return "/lib/s390x-linux-gnu"; +#elif defined(__s390__) + return "/lib/s390-linux-gnu"; +#elif defined(__arm__) && defined(__SOFTFP__) + return "/lib/arm-linux-gnueabi"; +#elif defined(__arm__) && !defined(__SOFTFP__) + return "/lib/arm-linux-gnueabihf"; +#elif defined(__aarch64__) + return "/lib/aarch64-linux-gnu"; +#elif defined(__mips__) && defined(__MIPSEL__) && _MIPS_SZLONG == 64 + return "/lib/mips64el-linux-gnuabi64"; +#elif defined(__mips__) && defined(__MIPSEL__) && _MIPS_SZLONG == 32 + return "/lib/mipsel-linux-gnu"; +#elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return "/lib/powerpc64le-linux-gnu"; +#elif defined(__sparc__) && defined(__arch64__) + return "/lib/sparc64-linux-gnu"; +#elif defined(__riscv) && __riscv_xlen == 64 + return "/lib/riscv64-linux-gnu"; +#else + return NULL; +#endif +} + +/* Get full path to program/shared library. */ +static int resolve_full_path(const char *file, char *result, size_t result_sz) +{ + const char *search_paths[3] = {}; + int i, perm; + + if (str_has_sfx(file, ".so") || strstr(file, ".so.")) { + search_paths[0] = getenv("LD_LIBRARY_PATH"); + search_paths[1] = "/usr/lib64:/usr/lib"; + search_paths[2] = arch_specific_lib_paths(); + perm = R_OK; + } else { + search_paths[0] = getenv("PATH"); + search_paths[1] = "/usr/bin:/usr/sbin"; + perm = R_OK | X_OK; + } + + for (i = 0; i < ARRAY_SIZE(search_paths); i++) { + const char *s; + + if (!search_paths[i]) + continue; + for (s = search_paths[i]; s != NULL; s = strchr(s, ':')) { + char *next_path; + int seg_len; + + if (s[0] == ':') + s++; + next_path = strchr(s, ':'); + seg_len = next_path ? next_path - s : strlen(s); + if (!seg_len) + continue; + snprintf(result, result_sz, "%.*s/%s", seg_len, s, file); + /* ensure it has required permissions */ + if (faccessat(AT_FDCWD, result, perm, AT_EACCESS) < 0) + continue; + pr_debug("resolved '%s' to '%s'\n", file, result); + return 0; + } + } + return -ENOENT; +} + +LIBBPF_API struct bpf_link * +bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, + const char *binary_path, size_t func_offset, + const struct bpf_uprobe_opts *opts) +{ + DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts); + char errmsg[STRERR_BUFSIZE], *legacy_probe = NULL; + char full_binary_path[PATH_MAX]; + struct bpf_link *link; + size_t ref_ctr_off; + int pfd, err; + bool retprobe, legacy; + const char *func_name; + + if (!OPTS_VALID(opts, bpf_uprobe_opts)) + return libbpf_err_ptr(-EINVAL); + + retprobe = OPTS_GET(opts, retprobe, false); + ref_ctr_off = OPTS_GET(opts, ref_ctr_offset, 0); + pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + + if (!binary_path) + return libbpf_err_ptr(-EINVAL); + + if (!strchr(binary_path, '/')) { + err = resolve_full_path(binary_path, full_binary_path, + sizeof(full_binary_path)); + if (err) { + pr_warn("prog '%s': failed to resolve full path for '%s': %d\n", + prog->name, binary_path, err); + return libbpf_err_ptr(err); + } + binary_path = full_binary_path; + } + func_name = OPTS_GET(opts, func_name, NULL); + if (func_name) { + long sym_off; + + sym_off = elf_find_func_offset(binary_path, func_name); + if (sym_off < 0) + return libbpf_err_ptr(sym_off); + func_offset += sym_off; + } + + legacy = determine_uprobe_perf_type() < 0; + if (!legacy) { + pfd = perf_event_open_probe(true /* uprobe */, retprobe, binary_path, + func_offset, pid, ref_ctr_off); + } else { + char probe_name[PATH_MAX + 64]; + + if (ref_ctr_off) + return libbpf_err_ptr(-EINVAL); + + gen_uprobe_legacy_event_name(probe_name, sizeof(probe_name), + binary_path, func_offset); + + legacy_probe = strdup(probe_name); + if (!legacy_probe) + return libbpf_err_ptr(-ENOMEM); + + pfd = perf_event_uprobe_open_legacy(legacy_probe, retprobe, + binary_path, func_offset, pid); + } + if (pfd < 0) { + err = -errno; + pr_warn("prog '%s': failed to create %s '%s:0x%zx' perf event: %s\n", + prog->name, retprobe ? "uretprobe" : "uprobe", + binary_path, func_offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_out; + } + + link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); + err = libbpf_get_error(link); + if (err) { + close(pfd); + pr_warn("prog '%s': failed to attach to %s '%s:0x%zx': %s\n", + prog->name, retprobe ? "uretprobe" : "uprobe", + binary_path, func_offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_clean_legacy; + } + if (legacy) { + struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link); + + perf_link->legacy_probe_name = legacy_probe; + perf_link->legacy_is_kprobe = false; + perf_link->legacy_is_retprobe = retprobe; + } + return link; + +err_clean_legacy: + if (legacy) + remove_uprobe_event_legacy(legacy_probe, retprobe); +err_out: + free(legacy_probe); + return libbpf_err_ptr(err); +} + +/* Format of u[ret]probe section definition supporting auto-attach: + * u[ret]probe/binary:function[+offset] + * + * binary can be an absolute/relative path or a filename; the latter is resolved to a + * full binary path via bpf_program__attach_uprobe_opts. + * + * Specifying uprobe+ ensures we carry out strict matching; either "uprobe" must be + * specified (and auto-attach is not possible) or the above format is specified for + * auto-attach. + */ +static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + DECLARE_LIBBPF_OPTS(bpf_uprobe_opts, opts); + char *probe_type = NULL, *binary_path = NULL, *func_name = NULL; + int n, ret = -EINVAL; + long offset = 0; + + *link = NULL; + + n = sscanf(prog->sec_name, "%m[^/]/%m[^:]:%m[a-zA-Z0-9_.]+%li", + &probe_type, &binary_path, &func_name, &offset); + switch (n) { + case 1: + /* handle SEC("u[ret]probe") - format is valid, but auto-attach is impossible. */ + ret = 0; + break; + case 2: + pr_warn("prog '%s': section '%s' missing ':function[+offset]' specification\n", + prog->name, prog->sec_name); + break; + case 3: + case 4: + opts.retprobe = strcmp(probe_type, "uretprobe") == 0 || + strcmp(probe_type, "uretprobe.s") == 0; + if (opts.retprobe && offset != 0) { + pr_warn("prog '%s': uretprobes do not support offset specification\n", + prog->name); + break; + } + opts.func_name = func_name; + *link = bpf_program__attach_uprobe_opts(prog, -1, binary_path, offset, &opts); + ret = libbpf_get_error(*link); + break; + default: + pr_warn("prog '%s': invalid format of section definition '%s'\n", prog->name, + prog->sec_name); + break; + } + free(probe_type); + free(binary_path); + free(func_name); + + return ret; +} + +struct bpf_link *bpf_program__attach_uprobe(const struct bpf_program *prog, + bool retprobe, pid_t pid, + const char *binary_path, + size_t func_offset) +{ + DECLARE_LIBBPF_OPTS(bpf_uprobe_opts, opts, .retprobe = retprobe); + + return bpf_program__attach_uprobe_opts(prog, pid, binary_path, func_offset, &opts); +} + +struct bpf_link *bpf_program__attach_usdt(const struct bpf_program *prog, + pid_t pid, const char *binary_path, + const char *usdt_provider, const char *usdt_name, + const struct bpf_usdt_opts *opts) +{ + char resolved_path[512]; + struct bpf_object *obj = prog->obj; + struct bpf_link *link; + __u64 usdt_cookie; + int err; + + if (!OPTS_VALID(opts, bpf_uprobe_opts)) + return libbpf_err_ptr(-EINVAL); + + if (bpf_program__fd(prog) < 0) { + pr_warn("prog '%s': can't attach BPF program w/o FD (did you load it?)\n", + prog->name); + return libbpf_err_ptr(-EINVAL); + } + + if (!binary_path) + return libbpf_err_ptr(-EINVAL); + + if (!strchr(binary_path, '/')) { + err = resolve_full_path(binary_path, resolved_path, sizeof(resolved_path)); + if (err) { + pr_warn("prog '%s': failed to resolve full path for '%s': %d\n", + prog->name, binary_path, err); + return libbpf_err_ptr(err); + } + binary_path = resolved_path; + } + + /* USDT manager is instantiated lazily on first USDT attach. It will + * be destroyed together with BPF object in bpf_object__close(). + */ + if (IS_ERR(obj->usdt_man)) + return libbpf_ptr(obj->usdt_man); + if (!obj->usdt_man) { + obj->usdt_man = usdt_manager_new(obj); + if (IS_ERR(obj->usdt_man)) + return libbpf_ptr(obj->usdt_man); + } + + usdt_cookie = OPTS_GET(opts, usdt_cookie, 0); + link = usdt_manager_attach_usdt(obj->usdt_man, prog, pid, binary_path, + usdt_provider, usdt_name, usdt_cookie); + err = libbpf_get_error(link); + if (err) + return libbpf_err_ptr(err); + return link; +} + +static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + char *path = NULL, *provider = NULL, *name = NULL; + const char *sec_name; + int n, err; + + sec_name = bpf_program__section_name(prog); + if (strcmp(sec_name, "usdt") == 0) { + /* no auto-attach for just SEC("usdt") */ + *link = NULL; + return 0; + } + + n = sscanf(sec_name, "usdt/%m[^:]:%m[^:]:%m[^:]", &path, &provider, &name); + if (n != 3) { + pr_warn("invalid section '%s', expected SEC(\"usdt/::\")\n", + sec_name); + err = -EINVAL; + } else { + *link = bpf_program__attach_usdt(prog, -1 /* any process */, path, + provider, name, NULL); + err = libbpf_get_error(*link); + } + free(path); + free(provider); + free(name); + return err; +} + +static int determine_tracepoint_id(const char *tp_category, + const char *tp_name) +{ + char file[PATH_MAX]; + int ret; + + ret = snprintf(file, sizeof(file), "%s/events/%s/%s/id", + tracefs_path(), tp_category, tp_name); + if (ret < 0) + return -errno; + if (ret >= sizeof(file)) { + pr_debug("tracepoint %s/%s path is too long\n", + tp_category, tp_name); + return -E2BIG; + } + return parse_uint_from_file(file, "%d\n"); +} + +static int perf_event_open_tracepoint(const char *tp_category, + const char *tp_name) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_event_attr attr; + char errmsg[STRERR_BUFSIZE]; + int tp_id, pfd, err; + + tp_id = determine_tracepoint_id(tp_category, tp_name); + if (tp_id < 0) { + pr_warn("failed to determine tracepoint '%s/%s' perf event ID: %s\n", + tp_category, tp_name, + libbpf_strerror_r(tp_id, errmsg, sizeof(errmsg))); + return tp_id; + } + + memset(&attr, 0, attr_sz); + attr.type = PERF_TYPE_TRACEPOINT; + attr.size = attr_sz; + attr.config = tp_id; + + pfd = syscall(__NR_perf_event_open, &attr, -1 /* pid */, 0 /* cpu */, + -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC); + if (pfd < 0) { + err = -errno; + pr_warn("tracepoint '%s/%s' perf_event_open() failed: %s\n", + tp_category, tp_name, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + return err; + } + return pfd; +} + +struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name, + const struct bpf_tracepoint_opts *opts) +{ + DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts); + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int pfd, err; + + if (!OPTS_VALID(opts, bpf_tracepoint_opts)) + return libbpf_err_ptr(-EINVAL); + + pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + + pfd = perf_event_open_tracepoint(tp_category, tp_name); + if (pfd < 0) { + pr_warn("prog '%s': failed to create tracepoint '%s/%s' perf event: %s\n", + prog->name, tp_category, tp_name, + libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(pfd); + } + link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); + err = libbpf_get_error(link); + if (err) { + close(pfd); + pr_warn("prog '%s': failed to attach to tracepoint '%s/%s': %s\n", + prog->name, tp_category, tp_name, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(err); + } + return link; +} + +struct bpf_link *bpf_program__attach_tracepoint(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name) +{ + return bpf_program__attach_tracepoint_opts(prog, tp_category, tp_name, NULL); +} + +static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + char *sec_name, *tp_cat, *tp_name; + + *link = NULL; + + /* no auto-attach for SEC("tp") or SEC("tracepoint") */ + if (strcmp(prog->sec_name, "tp") == 0 || strcmp(prog->sec_name, "tracepoint") == 0) + return 0; + + sec_name = strdup(prog->sec_name); + if (!sec_name) + return -ENOMEM; + + /* extract "tp//" or "tracepoint//" */ + if (str_has_pfx(prog->sec_name, "tp/")) + tp_cat = sec_name + sizeof("tp/") - 1; + else + tp_cat = sec_name + sizeof("tracepoint/") - 1; + tp_name = strchr(tp_cat, '/'); + if (!tp_name) { + free(sec_name); + return -EINVAL; + } + *tp_name = '\0'; + tp_name++; + + *link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name); + free(sec_name); + return libbpf_get_error(*link); +} + +struct bpf_link *bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, + const char *tp_name) +{ + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int prog_fd, pfd; + + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach before loaded\n", prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->detach = &bpf_link__detach_fd; + + pfd = bpf_raw_tracepoint_open(tp_name, prog_fd); + if (pfd < 0) { + pfd = -errno; + free(link); + pr_warn("prog '%s': failed to attach to raw tracepoint '%s': %s\n", + prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(pfd); + } + link->fd = pfd; + return link; +} + +static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + static const char *const prefixes[] = { + "raw_tp", + "raw_tracepoint", + "raw_tp.w", + "raw_tracepoint.w", + }; + size_t i; + const char *tp_name = NULL; + + *link = NULL; + + for (i = 0; i < ARRAY_SIZE(prefixes); i++) { + size_t pfx_len; + + if (!str_has_pfx(prog->sec_name, prefixes[i])) + continue; + + pfx_len = strlen(prefixes[i]); + /* no auto-attach case of, e.g., SEC("raw_tp") */ + if (prog->sec_name[pfx_len] == '\0') + return 0; + + if (prog->sec_name[pfx_len] != '/') + continue; + + tp_name = prog->sec_name + pfx_len + 1; + break; + } + + if (!tp_name) { + pr_warn("prog '%s': invalid section name '%s'\n", + prog->name, prog->sec_name); + return -EINVAL; + } + + *link = bpf_program__attach_raw_tracepoint(prog, tp_name); + return libbpf_get_error(*link); +} + +/* Common logic for all BPF program types that attach to a btf_id */ +static struct bpf_link *bpf_program__attach_btf_id(const struct bpf_program *prog, + const struct bpf_trace_opts *opts) +{ + LIBBPF_OPTS(bpf_link_create_opts, link_opts); + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int prog_fd, pfd; + + if (!OPTS_VALID(opts, bpf_trace_opts)) + return libbpf_err_ptr(-EINVAL); + + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach before loaded\n", prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->detach = &bpf_link__detach_fd; + + /* libbpf is smart enough to redirect to BPF_RAW_TRACEPOINT_OPEN on old kernels */ + link_opts.tracing.cookie = OPTS_GET(opts, cookie, 0); + pfd = bpf_link_create(prog_fd, 0, bpf_program__expected_attach_type(prog), &link_opts); + if (pfd < 0) { + pfd = -errno; + free(link); + pr_warn("prog '%s': failed to attach: %s\n", + prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(pfd); + } + link->fd = pfd; + return link; +} + +struct bpf_link *bpf_program__attach_trace(const struct bpf_program *prog) +{ + return bpf_program__attach_btf_id(prog, NULL); +} + +struct bpf_link *bpf_program__attach_trace_opts(const struct bpf_program *prog, + const struct bpf_trace_opts *opts) +{ + return bpf_program__attach_btf_id(prog, opts); +} + +struct bpf_link *bpf_program__attach_lsm(const struct bpf_program *prog) +{ + return bpf_program__attach_btf_id(prog, NULL); +} + +static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + *link = bpf_program__attach_trace(prog); + return libbpf_get_error(*link); +} + +static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + *link = bpf_program__attach_lsm(prog); + return libbpf_get_error(*link); +} + +static struct bpf_link * +bpf_program__attach_fd(const struct bpf_program *prog, int target_fd, int btf_id, + const char *target_name) +{ + DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts, + .target_btf_id = btf_id); + enum bpf_attach_type attach_type; + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int prog_fd, link_fd; + + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach before loaded\n", prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->detach = &bpf_link__detach_fd; + + attach_type = bpf_program__expected_attach_type(prog); + link_fd = bpf_link_create(prog_fd, target_fd, attach_type, &opts); + if (link_fd < 0) { + link_fd = -errno; + free(link); + pr_warn("prog '%s': failed to attach to %s: %s\n", + prog->name, target_name, + libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(link_fd); + } + link->fd = link_fd; + return link; +} + +struct bpf_link * +bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd) +{ + return bpf_program__attach_fd(prog, cgroup_fd, 0, "cgroup"); +} + +struct bpf_link * +bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd) +{ + return bpf_program__attach_fd(prog, netns_fd, 0, "netns"); +} + +struct bpf_link *bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex) +{ + /* target_fd/target_ifindex use the same field in LINK_CREATE */ + return bpf_program__attach_fd(prog, ifindex, 0, "xdp"); +} + +struct bpf_link *bpf_program__attach_freplace(const struct bpf_program *prog, + int target_fd, + const char *attach_func_name) +{ + int btf_id; + + if (!!target_fd != !!attach_func_name) { + pr_warn("prog '%s': supply none or both of target_fd and attach_func_name\n", + prog->name); + return libbpf_err_ptr(-EINVAL); + } + + if (prog->type != BPF_PROG_TYPE_EXT) { + pr_warn("prog '%s': only BPF_PROG_TYPE_EXT can attach as freplace", + prog->name); + return libbpf_err_ptr(-EINVAL); + } + + if (target_fd) { + btf_id = libbpf_find_prog_btf_id(attach_func_name, target_fd); + if (btf_id < 0) + return libbpf_err_ptr(btf_id); + + return bpf_program__attach_fd(prog, target_fd, btf_id, "freplace"); + } else { + /* no target, so use raw_tracepoint_open for compatibility + * with old kernels + */ + return bpf_program__attach_trace(prog); + } +} + +struct bpf_link * +bpf_program__attach_iter(const struct bpf_program *prog, + const struct bpf_iter_attach_opts *opts) +{ + DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_create_opts); + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int prog_fd, link_fd; + __u32 target_fd = 0; + + if (!OPTS_VALID(opts, bpf_iter_attach_opts)) + return libbpf_err_ptr(-EINVAL); + + link_create_opts.iter_info = OPTS_GET(opts, link_info, (void *)0); + link_create_opts.iter_info_len = OPTS_GET(opts, link_info_len, 0); + + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach before loaded\n", prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->detach = &bpf_link__detach_fd; + + link_fd = bpf_link_create(prog_fd, target_fd, BPF_TRACE_ITER, + &link_create_opts); + if (link_fd < 0) { + link_fd = -errno; + free(link); + pr_warn("prog '%s': failed to attach to iterator: %s\n", + prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(link_fd); + } + link->fd = link_fd; + return link; +} + +static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + *link = bpf_program__attach_iter(prog, NULL); + return libbpf_get_error(*link); +} + +struct bpf_link *bpf_program__attach(const struct bpf_program *prog) +{ + struct bpf_link *link = NULL; + int err; + + if (!prog->sec_def || !prog->sec_def->prog_attach_fn) + return libbpf_err_ptr(-EOPNOTSUPP); + + err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, &link); + if (err) + return libbpf_err_ptr(err); + + /* When calling bpf_program__attach() explicitly, auto-attach support + * is expected to work, so NULL returned link is considered an error. + * This is different for skeleton's attach, see comment in + * bpf_object__attach_skeleton(). + */ + if (!link) + return libbpf_err_ptr(-EOPNOTSUPP); + + return link; +} + +static int bpf_link__detach_struct_ops(struct bpf_link *link) +{ + __u32 zero = 0; + + if (bpf_map_delete_elem(link->fd, &zero)) + return -errno; + + return 0; +} + +struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map) +{ + struct bpf_struct_ops *st_ops; + struct bpf_link *link; + __u32 i, zero = 0; + int err; + + if (!bpf_map__is_struct_ops(map) || map->fd == -1) + return libbpf_err_ptr(-EINVAL); + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-EINVAL); + + st_ops = map->st_ops; + for (i = 0; i < btf_vlen(st_ops->type); i++) { + struct bpf_program *prog = st_ops->progs[i]; + void *kern_data; + int prog_fd; + + if (!prog) + continue; + + prog_fd = bpf_program__fd(prog); + kern_data = st_ops->kern_vdata + st_ops->kern_func_off[i]; + *(unsigned long *)kern_data = prog_fd; + } + + err = bpf_map_update_elem(map->fd, &zero, st_ops->kern_vdata, 0); + if (err) { + err = -errno; + free(link); + return libbpf_err_ptr(err); + } + + link->detach = bpf_link__detach_struct_ops; + link->fd = map->fd; + + return link; +} + +typedef enum bpf_perf_event_ret (*bpf_perf_event_print_t)(struct perf_event_header *hdr, + void *private_data); + +static enum bpf_perf_event_ret +perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size, + void **copy_mem, size_t *copy_size, + bpf_perf_event_print_t fn, void *private_data) +{ + struct perf_event_mmap_page *header = mmap_mem; + __u64 data_head = ring_buffer_read_head(header); + __u64 data_tail = header->data_tail; + void *base = ((__u8 *)header) + page_size; + int ret = LIBBPF_PERF_EVENT_CONT; + struct perf_event_header *ehdr; + size_t ehdr_size; + + while (data_head != data_tail) { + ehdr = base + (data_tail & (mmap_size - 1)); + ehdr_size = ehdr->size; + + if (((void *)ehdr) + ehdr_size > base + mmap_size) { + void *copy_start = ehdr; + size_t len_first = base + mmap_size - copy_start; + size_t len_secnd = ehdr_size - len_first; + + if (*copy_size < ehdr_size) { + free(*copy_mem); + *copy_mem = malloc(ehdr_size); + if (!*copy_mem) { + *copy_size = 0; + ret = LIBBPF_PERF_EVENT_ERROR; + break; + } + *copy_size = ehdr_size; + } + + memcpy(*copy_mem, copy_start, len_first); + memcpy(*copy_mem + len_first, base, len_secnd); + ehdr = *copy_mem; + } + + ret = fn(ehdr, private_data); + data_tail += ehdr_size; + if (ret != LIBBPF_PERF_EVENT_CONT) + break; + } + + ring_buffer_write_tail(header, data_tail); + return libbpf_err(ret); +} + +struct perf_buffer; + +struct perf_buffer_params { + struct perf_event_attr *attr; + /* if event_cb is specified, it takes precendence */ + perf_buffer_event_fn event_cb; + /* sample_cb and lost_cb are higher-level common-case callbacks */ + perf_buffer_sample_fn sample_cb; + perf_buffer_lost_fn lost_cb; + void *ctx; + int cpu_cnt; + int *cpus; + int *map_keys; +}; + +struct perf_cpu_buf { + struct perf_buffer *pb; + void *base; /* mmap()'ed memory */ + void *buf; /* for reconstructing segmented data */ + size_t buf_size; + int fd; + int cpu; + int map_key; +}; + +struct perf_buffer { + perf_buffer_event_fn event_cb; + perf_buffer_sample_fn sample_cb; + perf_buffer_lost_fn lost_cb; + void *ctx; /* passed into callbacks */ + + size_t page_size; + size_t mmap_size; + struct perf_cpu_buf **cpu_bufs; + struct epoll_event *events; + int cpu_cnt; /* number of allocated CPU buffers */ + int epoll_fd; /* perf event FD */ + int map_fd; /* BPF_MAP_TYPE_PERF_EVENT_ARRAY BPF map FD */ +}; + +static void perf_buffer__free_cpu_buf(struct perf_buffer *pb, + struct perf_cpu_buf *cpu_buf) +{ + if (!cpu_buf) + return; + if (cpu_buf->base && + munmap(cpu_buf->base, pb->mmap_size + pb->page_size)) + pr_warn("failed to munmap cpu_buf #%d\n", cpu_buf->cpu); + if (cpu_buf->fd >= 0) { + ioctl(cpu_buf->fd, PERF_EVENT_IOC_DISABLE, 0); + close(cpu_buf->fd); + } + free(cpu_buf->buf); + free(cpu_buf); +} + +void perf_buffer__free(struct perf_buffer *pb) +{ + int i; + + if (IS_ERR_OR_NULL(pb)) + return; + if (pb->cpu_bufs) { + for (i = 0; i < pb->cpu_cnt; i++) { + struct perf_cpu_buf *cpu_buf = pb->cpu_bufs[i]; + + if (!cpu_buf) + continue; + + bpf_map_delete_elem(pb->map_fd, &cpu_buf->map_key); + perf_buffer__free_cpu_buf(pb, cpu_buf); + } + free(pb->cpu_bufs); + } + if (pb->epoll_fd >= 0) + close(pb->epoll_fd); + free(pb->events); + free(pb); +} + +static struct perf_cpu_buf * +perf_buffer__open_cpu_buf(struct perf_buffer *pb, struct perf_event_attr *attr, + int cpu, int map_key) +{ + struct perf_cpu_buf *cpu_buf; + char msg[STRERR_BUFSIZE]; + int err; + + cpu_buf = calloc(1, sizeof(*cpu_buf)); + if (!cpu_buf) + return ERR_PTR(-ENOMEM); + + cpu_buf->pb = pb; + cpu_buf->cpu = cpu; + cpu_buf->map_key = map_key; + + cpu_buf->fd = syscall(__NR_perf_event_open, attr, -1 /* pid */, cpu, + -1, PERF_FLAG_FD_CLOEXEC); + if (cpu_buf->fd < 0) { + err = -errno; + pr_warn("failed to open perf buffer event on cpu #%d: %s\n", + cpu, libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + cpu_buf->base = mmap(NULL, pb->mmap_size + pb->page_size, + PROT_READ | PROT_WRITE, MAP_SHARED, + cpu_buf->fd, 0); + if (cpu_buf->base == MAP_FAILED) { + cpu_buf->base = NULL; + err = -errno; + pr_warn("failed to mmap perf buffer on cpu #%d: %s\n", + cpu, libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + if (ioctl(cpu_buf->fd, PERF_EVENT_IOC_ENABLE, 0) < 0) { + err = -errno; + pr_warn("failed to enable perf buffer event on cpu #%d: %s\n", + cpu, libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + return cpu_buf; + +error: + perf_buffer__free_cpu_buf(pb, cpu_buf); + return (struct perf_cpu_buf *)ERR_PTR(err); +} + +static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt, + struct perf_buffer_params *p); + +struct perf_buffer *perf_buffer__new(int map_fd, size_t page_cnt, + perf_buffer_sample_fn sample_cb, + perf_buffer_lost_fn lost_cb, + void *ctx, + const struct perf_buffer_opts *opts) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_buffer_params p = {}; + struct perf_event_attr attr; + __u32 sample_period; + + if (!OPTS_VALID(opts, perf_buffer_opts)) + return libbpf_err_ptr(-EINVAL); + + sample_period = OPTS_GET(opts, sample_period, 1); + if (!sample_period) + sample_period = 1; + + memset(&attr, 0, attr_sz); + attr.size = attr_sz; + attr.config = PERF_COUNT_SW_BPF_OUTPUT; + attr.type = PERF_TYPE_SOFTWARE; + attr.sample_type = PERF_SAMPLE_RAW; + attr.sample_period = sample_period; + attr.wakeup_events = sample_period; + + p.attr = &attr; + p.sample_cb = sample_cb; + p.lost_cb = lost_cb; + p.ctx = ctx; + + return libbpf_ptr(__perf_buffer__new(map_fd, page_cnt, &p)); +} + +struct perf_buffer *perf_buffer__new_raw(int map_fd, size_t page_cnt, + struct perf_event_attr *attr, + perf_buffer_event_fn event_cb, void *ctx, + const struct perf_buffer_raw_opts *opts) +{ + struct perf_buffer_params p = {}; + + if (!attr) + return libbpf_err_ptr(-EINVAL); + + if (!OPTS_VALID(opts, perf_buffer_raw_opts)) + return libbpf_err_ptr(-EINVAL); + + p.attr = attr; + p.event_cb = event_cb; + p.ctx = ctx; + p.cpu_cnt = OPTS_GET(opts, cpu_cnt, 0); + p.cpus = OPTS_GET(opts, cpus, NULL); + p.map_keys = OPTS_GET(opts, map_keys, NULL); + + return libbpf_ptr(__perf_buffer__new(map_fd, page_cnt, &p)); +} + +static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt, + struct perf_buffer_params *p) +{ + const char *online_cpus_file = "/sys/devices/system/cpu/online"; + struct bpf_map_info map; + char msg[STRERR_BUFSIZE]; + struct perf_buffer *pb; + bool *online = NULL; + __u32 map_info_len; + int err, i, j, n; + + if (page_cnt == 0 || (page_cnt & (page_cnt - 1))) { + pr_warn("page count should be power of two, but is %zu\n", + page_cnt); + return ERR_PTR(-EINVAL); + } + + /* best-effort sanity checks */ + memset(&map, 0, sizeof(map)); + map_info_len = sizeof(map); + err = bpf_map_get_info_by_fd(map_fd, &map, &map_info_len); + if (err) { + err = -errno; + /* if BPF_OBJ_GET_INFO_BY_FD is supported, will return + * -EBADFD, -EFAULT, or -E2BIG on real error + */ + if (err != -EINVAL) { + pr_warn("failed to get map info for map FD %d: %s\n", + map_fd, libbpf_strerror_r(err, msg, sizeof(msg))); + return ERR_PTR(err); + } + pr_debug("failed to get map info for FD %d; API not supported? Ignoring...\n", + map_fd); + } else { + if (map.type != BPF_MAP_TYPE_PERF_EVENT_ARRAY) { + pr_warn("map '%s' should be BPF_MAP_TYPE_PERF_EVENT_ARRAY\n", + map.name); + return ERR_PTR(-EINVAL); + } + } + + pb = calloc(1, sizeof(*pb)); + if (!pb) + return ERR_PTR(-ENOMEM); + + pb->event_cb = p->event_cb; + pb->sample_cb = p->sample_cb; + pb->lost_cb = p->lost_cb; + pb->ctx = p->ctx; + + pb->page_size = getpagesize(); + pb->mmap_size = pb->page_size * page_cnt; + pb->map_fd = map_fd; + + pb->epoll_fd = epoll_create1(EPOLL_CLOEXEC); + if (pb->epoll_fd < 0) { + err = -errno; + pr_warn("failed to create epoll instance: %s\n", + libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + if (p->cpu_cnt > 0) { + pb->cpu_cnt = p->cpu_cnt; + } else { + pb->cpu_cnt = libbpf_num_possible_cpus(); + if (pb->cpu_cnt < 0) { + err = pb->cpu_cnt; + goto error; + } + if (map.max_entries && map.max_entries < pb->cpu_cnt) + pb->cpu_cnt = map.max_entries; + } + + pb->events = calloc(pb->cpu_cnt, sizeof(*pb->events)); + if (!pb->events) { + err = -ENOMEM; + pr_warn("failed to allocate events: out of memory\n"); + goto error; + } + pb->cpu_bufs = calloc(pb->cpu_cnt, sizeof(*pb->cpu_bufs)); + if (!pb->cpu_bufs) { + err = -ENOMEM; + pr_warn("failed to allocate buffers: out of memory\n"); + goto error; + } + + err = parse_cpu_mask_file(online_cpus_file, &online, &n); + if (err) { + pr_warn("failed to get online CPU mask: %d\n", err); + goto error; + } + + for (i = 0, j = 0; i < pb->cpu_cnt; i++) { + struct perf_cpu_buf *cpu_buf; + int cpu, map_key; + + cpu = p->cpu_cnt > 0 ? p->cpus[i] : i; + map_key = p->cpu_cnt > 0 ? p->map_keys[i] : i; + + /* in case user didn't explicitly requested particular CPUs to + * be attached to, skip offline/not present CPUs + */ + if (p->cpu_cnt <= 0 && (cpu >= n || !online[cpu])) + continue; + + cpu_buf = perf_buffer__open_cpu_buf(pb, p->attr, cpu, map_key); + if (IS_ERR(cpu_buf)) { + err = PTR_ERR(cpu_buf); + goto error; + } + + pb->cpu_bufs[j] = cpu_buf; + + err = bpf_map_update_elem(pb->map_fd, &map_key, + &cpu_buf->fd, 0); + if (err) { + err = -errno; + pr_warn("failed to set cpu #%d, key %d -> perf FD %d: %s\n", + cpu, map_key, cpu_buf->fd, + libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + pb->events[j].events = EPOLLIN; + pb->events[j].data.ptr = cpu_buf; + if (epoll_ctl(pb->epoll_fd, EPOLL_CTL_ADD, cpu_buf->fd, + &pb->events[j]) < 0) { + err = -errno; + pr_warn("failed to epoll_ctl cpu #%d perf FD %d: %s\n", + cpu, cpu_buf->fd, + libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + j++; + } + pb->cpu_cnt = j; + free(online); + + return pb; + +error: + free(online); + if (pb) + perf_buffer__free(pb); + return ERR_PTR(err); +} + +struct perf_sample_raw { + struct perf_event_header header; + uint32_t size; + char data[]; +}; + +struct perf_sample_lost { + struct perf_event_header header; + uint64_t id; + uint64_t lost; + uint64_t sample_id; +}; + +static enum bpf_perf_event_ret +perf_buffer__process_record(struct perf_event_header *e, void *ctx) +{ + struct perf_cpu_buf *cpu_buf = ctx; + struct perf_buffer *pb = cpu_buf->pb; + void *data = e; + + /* user wants full control over parsing perf event */ + if (pb->event_cb) + return pb->event_cb(pb->ctx, cpu_buf->cpu, e); + + switch (e->type) { + case PERF_RECORD_SAMPLE: { + struct perf_sample_raw *s = data; + + if (pb->sample_cb) + pb->sample_cb(pb->ctx, cpu_buf->cpu, s->data, s->size); + break; + } + case PERF_RECORD_LOST: { + struct perf_sample_lost *s = data; + + if (pb->lost_cb) + pb->lost_cb(pb->ctx, cpu_buf->cpu, s->lost); + break; + } + default: + pr_warn("unknown perf sample type %d\n", e->type); + return LIBBPF_PERF_EVENT_ERROR; + } + return LIBBPF_PERF_EVENT_CONT; +} + +static int perf_buffer__process_records(struct perf_buffer *pb, + struct perf_cpu_buf *cpu_buf) +{ + enum bpf_perf_event_ret ret; + + ret = perf_event_read_simple(cpu_buf->base, pb->mmap_size, + pb->page_size, &cpu_buf->buf, + &cpu_buf->buf_size, + perf_buffer__process_record, cpu_buf); + if (ret != LIBBPF_PERF_EVENT_CONT) + return ret; + return 0; +} + +int perf_buffer__epoll_fd(const struct perf_buffer *pb) +{ + return pb->epoll_fd; +} + +int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms) +{ + int i, cnt, err; + + cnt = epoll_wait(pb->epoll_fd, pb->events, pb->cpu_cnt, timeout_ms); + if (cnt < 0) + return -errno; + + for (i = 0; i < cnt; i++) { + struct perf_cpu_buf *cpu_buf = pb->events[i].data.ptr; + + err = perf_buffer__process_records(pb, cpu_buf); + if (err) { + pr_warn("error while processing records: %d\n", err); + return libbpf_err(err); + } + } + return cnt; +} + +/* Return number of PERF_EVENT_ARRAY map slots set up by this perf_buffer + * manager. + */ +size_t perf_buffer__buffer_cnt(const struct perf_buffer *pb) +{ + return pb->cpu_cnt; +} + +/* + * Return perf_event FD of a ring buffer in *buf_idx* slot of + * PERF_EVENT_ARRAY BPF map. This FD can be polled for new data using + * select()/poll()/epoll() Linux syscalls. + */ +int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_idx) +{ + struct perf_cpu_buf *cpu_buf; + + if (buf_idx >= pb->cpu_cnt) + return libbpf_err(-EINVAL); + + cpu_buf = pb->cpu_bufs[buf_idx]; + if (!cpu_buf) + return libbpf_err(-ENOENT); + + return cpu_buf->fd; +} + +int perf_buffer__buffer(struct perf_buffer *pb, int buf_idx, void **buf, size_t *buf_size) +{ + struct perf_cpu_buf *cpu_buf; + + if (buf_idx >= pb->cpu_cnt) + return libbpf_err(-EINVAL); + + cpu_buf = pb->cpu_bufs[buf_idx]; + if (!cpu_buf) + return libbpf_err(-ENOENT); + + *buf = cpu_buf->base; + *buf_size = pb->mmap_size; + return 0; +} + +/* + * Consume data from perf ring buffer corresponding to slot *buf_idx* in + * PERF_EVENT_ARRAY BPF map without waiting/polling. If there is no data to + * consume, do nothing and return success. + * Returns: + * - 0 on success; + * - <0 on failure. + */ +int perf_buffer__consume_buffer(struct perf_buffer *pb, size_t buf_idx) +{ + struct perf_cpu_buf *cpu_buf; + + if (buf_idx >= pb->cpu_cnt) + return libbpf_err(-EINVAL); + + cpu_buf = pb->cpu_bufs[buf_idx]; + if (!cpu_buf) + return libbpf_err(-ENOENT); + + return perf_buffer__process_records(pb, cpu_buf); +} + +int perf_buffer__consume(struct perf_buffer *pb) +{ + int i, err; + + for (i = 0; i < pb->cpu_cnt; i++) { + struct perf_cpu_buf *cpu_buf = pb->cpu_bufs[i]; + + if (!cpu_buf) + continue; + + err = perf_buffer__process_records(pb, cpu_buf); + if (err) { + pr_warn("perf_buffer: failed to process records in buffer #%d: %d\n", i, err); + return libbpf_err(err); + } + } + return 0; +} + +int bpf_program__set_attach_target(struct bpf_program *prog, + int attach_prog_fd, + const char *attach_func_name) +{ + int btf_obj_fd = 0, btf_id = 0, err; + + if (!prog || attach_prog_fd < 0) + return libbpf_err(-EINVAL); + + if (prog->obj->loaded) + return libbpf_err(-EINVAL); + + if (attach_prog_fd && !attach_func_name) { + /* remember attach_prog_fd and let bpf_program__load() find + * BTF ID during the program load + */ + prog->attach_prog_fd = attach_prog_fd; + return 0; + } + + if (attach_prog_fd) { + btf_id = libbpf_find_prog_btf_id(attach_func_name, + attach_prog_fd); + if (btf_id < 0) + return libbpf_err(btf_id); + } else { + if (!attach_func_name) + return libbpf_err(-EINVAL); + + /* load btf_vmlinux, if not yet */ + err = bpf_object__load_vmlinux_btf(prog->obj, true); + if (err) + return libbpf_err(err); + err = find_kernel_btf_id(prog->obj, attach_func_name, + prog->expected_attach_type, + &btf_obj_fd, &btf_id); + if (err) + return libbpf_err(err); + } + + prog->attach_btf_id = btf_id; + prog->attach_btf_obj_fd = btf_obj_fd; + prog->attach_prog_fd = attach_prog_fd; + return 0; +} + +int parse_cpu_mask_str(const char *s, bool **mask, int *mask_sz) +{ + int err = 0, n, len, start, end = -1; + bool *tmp; + + *mask = NULL; + *mask_sz = 0; + + /* Each sub string separated by ',' has format \d+-\d+ or \d+ */ + while (*s) { + if (*s == ',' || *s == '\n') { + s++; + continue; + } + n = sscanf(s, "%d%n-%d%n", &start, &len, &end, &len); + if (n <= 0 || n > 2) { + pr_warn("Failed to get CPU range %s: %d\n", s, n); + err = -EINVAL; + goto cleanup; + } else if (n == 1) { + end = start; + } + if (start < 0 || start > end) { + pr_warn("Invalid CPU range [%d,%d] in %s\n", + start, end, s); + err = -EINVAL; + goto cleanup; + } + tmp = realloc(*mask, end + 1); + if (!tmp) { + err = -ENOMEM; + goto cleanup; + } + *mask = tmp; + memset(tmp + *mask_sz, 0, start - *mask_sz); + memset(tmp + start, 1, end - start + 1); + *mask_sz = end + 1; + s += len; + } + if (!*mask_sz) { + pr_warn("Empty CPU range\n"); + return -EINVAL; + } + return 0; +cleanup: + free(*mask); + *mask = NULL; + return err; +} + +int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz) +{ + int fd, err = 0, len; + char buf[128]; + + fd = open(fcpu, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + err = -errno; + pr_warn("Failed to open cpu mask file %s: %d\n", fcpu, err); + return err; + } + len = read(fd, buf, sizeof(buf)); + close(fd); + if (len <= 0) { + err = len ? -errno : -EINVAL; + pr_warn("Failed to read cpu mask from %s: %d\n", fcpu, err); + return err; + } + if (len >= sizeof(buf)) { + pr_warn("CPU mask is too big in file %s\n", fcpu); + return -E2BIG; + } + buf[len] = '\0'; + + return parse_cpu_mask_str(buf, mask, mask_sz); +} + +int libbpf_num_possible_cpus(void) +{ + static const char *fcpu = "/sys/devices/system/cpu/possible"; + static int cpus; + int err, n, i, tmp_cpus; + bool *mask; + + tmp_cpus = READ_ONCE(cpus); + if (tmp_cpus > 0) + return tmp_cpus; + + err = parse_cpu_mask_file(fcpu, &mask, &n); + if (err) + return libbpf_err(err); + + tmp_cpus = 0; + for (i = 0; i < n; i++) { + if (mask[i]) + tmp_cpus++; + } + free(mask); + + WRITE_ONCE(cpus, tmp_cpus); + return tmp_cpus; +} + +static int populate_skeleton_maps(const struct bpf_object *obj, + struct bpf_map_skeleton *maps, + size_t map_cnt) +{ + int i; + + for (i = 0; i < map_cnt; i++) { + struct bpf_map **map = maps[i].map; + const char *name = maps[i].name; + void **mmaped = maps[i].mmaped; + + *map = bpf_object__find_map_by_name(obj, name); + if (!*map) { + pr_warn("failed to find skeleton map '%s'\n", name); + return -ESRCH; + } + + /* externs shouldn't be pre-setup from user code */ + if (mmaped && (*map)->libbpf_type != LIBBPF_MAP_KCONFIG) + *mmaped = (*map)->mmaped; + } + return 0; +} + +static int populate_skeleton_progs(const struct bpf_object *obj, + struct bpf_prog_skeleton *progs, + size_t prog_cnt) +{ + int i; + + for (i = 0; i < prog_cnt; i++) { + struct bpf_program **prog = progs[i].prog; + const char *name = progs[i].name; + + *prog = bpf_object__find_program_by_name(obj, name); + if (!*prog) { + pr_warn("failed to find skeleton program '%s'\n", name); + return -ESRCH; + } + } + return 0; +} + +int bpf_object__open_skeleton(struct bpf_object_skeleton *s, + const struct bpf_object_open_opts *opts) +{ + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, skel_opts, + .object_name = s->name, + ); + struct bpf_object *obj; + int err; + + /* Attempt to preserve opts->object_name, unless overriden by user + * explicitly. Overwriting object name for skeletons is discouraged, + * as it breaks global data maps, because they contain object name + * prefix as their own map name prefix. When skeleton is generated, + * bpftool is making an assumption that this name will stay the same. + */ + if (opts) { + memcpy(&skel_opts, opts, sizeof(*opts)); + if (!opts->object_name) + skel_opts.object_name = s->name; + } + + obj = bpf_object__open_mem(s->data, s->data_sz, &skel_opts); + err = libbpf_get_error(obj); + if (err) { + pr_warn("failed to initialize skeleton BPF object '%s': %d\n", + s->name, err); + return libbpf_err(err); + } + + *s->obj = obj; + err = populate_skeleton_maps(obj, s->maps, s->map_cnt); + if (err) { + pr_warn("failed to populate skeleton maps for '%s': %d\n", s->name, err); + return libbpf_err(err); + } + + err = populate_skeleton_progs(obj, s->progs, s->prog_cnt); + if (err) { + pr_warn("failed to populate skeleton progs for '%s': %d\n", s->name, err); + return libbpf_err(err); + } + + return 0; +} + +int bpf_object__open_subskeleton(struct bpf_object_subskeleton *s) +{ + int err, len, var_idx, i; + const char *var_name; + const struct bpf_map *map; + struct btf *btf; + __u32 map_type_id; + const struct btf_type *map_type, *var_type; + const struct bpf_var_skeleton *var_skel; + struct btf_var_secinfo *var; + + if (!s->obj) + return libbpf_err(-EINVAL); + + btf = bpf_object__btf(s->obj); + if (!btf) { + pr_warn("subskeletons require BTF at runtime (object %s)\n", + bpf_object__name(s->obj)); + return libbpf_err(-errno); + } + + err = populate_skeleton_maps(s->obj, s->maps, s->map_cnt); + if (err) { + pr_warn("failed to populate subskeleton maps: %d\n", err); + return libbpf_err(err); + } + + err = populate_skeleton_progs(s->obj, s->progs, s->prog_cnt); + if (err) { + pr_warn("failed to populate subskeleton maps: %d\n", err); + return libbpf_err(err); + } + + for (var_idx = 0; var_idx < s->var_cnt; var_idx++) { + var_skel = &s->vars[var_idx]; + map = *var_skel->map; + map_type_id = bpf_map__btf_value_type_id(map); + map_type = btf__type_by_id(btf, map_type_id); + + if (!btf_is_datasec(map_type)) { + pr_warn("type for map '%1$s' is not a datasec: %2$s", + bpf_map__name(map), + __btf_kind_str(btf_kind(map_type))); + return libbpf_err(-EINVAL); + } + + len = btf_vlen(map_type); + var = btf_var_secinfos(map_type); + for (i = 0; i < len; i++, var++) { + var_type = btf__type_by_id(btf, var->type); + var_name = btf__name_by_offset(btf, var_type->name_off); + if (strcmp(var_name, var_skel->name) == 0) { + *var_skel->addr = map->mmaped + var->offset; + break; + } + } + } + return 0; +} + +void bpf_object__destroy_subskeleton(struct bpf_object_subskeleton *s) +{ + if (!s) + return; + free(s->maps); + free(s->progs); + free(s->vars); + free(s); +} + +int bpf_object__load_skeleton(struct bpf_object_skeleton *s) +{ + int i, err; + + err = bpf_object__load(*s->obj); + if (err) { + pr_warn("failed to load BPF skeleton '%s': %d\n", s->name, err); + return libbpf_err(err); + } + + for (i = 0; i < s->map_cnt; i++) { + struct bpf_map *map = *s->maps[i].map; + size_t mmap_sz = bpf_map_mmap_sz(map); + int prot, map_fd = bpf_map__fd(map); + void **mmaped = s->maps[i].mmaped; + + if (!mmaped) + continue; + + if (!(map->def.map_flags & BPF_F_MMAPABLE)) { + *mmaped = NULL; + continue; + } + + if (map->def.map_flags & BPF_F_RDONLY_PROG) + prot = PROT_READ; + else + prot = PROT_READ | PROT_WRITE; + + /* Remap anonymous mmap()-ed "map initialization image" as + * a BPF map-backed mmap()-ed memory, but preserving the same + * memory address. This will cause kernel to change process' + * page table to point to a different piece of kernel memory, + * but from userspace point of view memory address (and its + * contents, being identical at this point) will stay the + * same. This mapping will be released by bpf_object__close() + * as per normal clean up procedure, so we don't need to worry + * about it from skeleton's clean up perspective. + */ + *mmaped = mmap(map->mmaped, mmap_sz, prot, + MAP_SHARED | MAP_FIXED, map_fd, 0); + if (*mmaped == MAP_FAILED) { + err = -errno; + *mmaped = NULL; + pr_warn("failed to re-mmap() map '%s': %d\n", + bpf_map__name(map), err); + return libbpf_err(err); + } + } + + return 0; +} + +int bpf_object__attach_skeleton(struct bpf_object_skeleton *s) +{ + int i, err; + + for (i = 0; i < s->prog_cnt; i++) { + struct bpf_program *prog = *s->progs[i].prog; + struct bpf_link **link = s->progs[i].link; + + if (!prog->autoload || !prog->autoattach) + continue; + + /* auto-attaching not supported for this program */ + if (!prog->sec_def || !prog->sec_def->prog_attach_fn) + continue; + + /* if user already set the link manually, don't attempt auto-attach */ + if (*link) + continue; + + err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, link); + if (err) { + pr_warn("prog '%s': failed to auto-attach: %d\n", + bpf_program__name(prog), err); + return libbpf_err(err); + } + + /* It's possible that for some SEC() definitions auto-attach + * is supported in some cases (e.g., if definition completely + * specifies target information), but is not in other cases. + * SEC("uprobe") is one such case. If user specified target + * binary and function name, such BPF program can be + * auto-attached. But if not, it shouldn't trigger skeleton's + * attach to fail. It should just be skipped. + * attach_fn signals such case with returning 0 (no error) and + * setting link to NULL. + */ + } + + return 0; +} + +void bpf_object__detach_skeleton(struct bpf_object_skeleton *s) +{ + int i; + + for (i = 0; i < s->prog_cnt; i++) { + struct bpf_link **link = s->progs[i].link; + + bpf_link__destroy(*link); + *link = NULL; + } +} + +void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s) +{ + if (!s) + return; + + if (s->progs) + bpf_object__detach_skeleton(s); + if (s->obj) + bpf_object__close(*s->obj); + free(s->maps); + free(s->progs); + free(s); +} diff --git a/bpftool/libbpf/src/libbpf.h b/bpftool/libbpf/src/libbpf.h new file mode 100644 index 0000000..2efd80f --- /dev/null +++ b/bpftool/libbpf/src/libbpf.h @@ -0,0 +1,1629 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Common eBPF ELF object loading operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + */ +#ifndef __LIBBPF_LIBBPF_H +#define __LIBBPF_LIBBPF_H + +#include +#include +#include +#include +#include // for size_t +#include + +#include "libbpf_common.h" +#include "libbpf_legacy.h" + +#ifdef __cplusplus +extern "C" { +#endif + +LIBBPF_API __u32 libbpf_major_version(void); +LIBBPF_API __u32 libbpf_minor_version(void); +LIBBPF_API const char *libbpf_version_string(void); + +enum libbpf_errno { + __LIBBPF_ERRNO__START = 4000, + + /* Something wrong in libelf */ + LIBBPF_ERRNO__LIBELF = __LIBBPF_ERRNO__START, + LIBBPF_ERRNO__FORMAT, /* BPF object format invalid */ + LIBBPF_ERRNO__KVERSION, /* Incorrect or no 'version' section */ + LIBBPF_ERRNO__ENDIAN, /* Endian mismatch */ + LIBBPF_ERRNO__INTERNAL, /* Internal error in libbpf */ + LIBBPF_ERRNO__RELOC, /* Relocation failed */ + LIBBPF_ERRNO__LOAD, /* Load program failure for unknown reason */ + LIBBPF_ERRNO__VERIFY, /* Kernel verifier blocks program loading */ + LIBBPF_ERRNO__PROG2BIG, /* Program too big */ + LIBBPF_ERRNO__KVER, /* Incorrect kernel version */ + LIBBPF_ERRNO__PROGTYPE, /* Kernel doesn't support this program type */ + LIBBPF_ERRNO__WRNGPID, /* Wrong pid in netlink message */ + LIBBPF_ERRNO__INVSEQ, /* Invalid netlink sequence */ + LIBBPF_ERRNO__NLPARSE, /* netlink parsing error */ + __LIBBPF_ERRNO__END, +}; + +LIBBPF_API int libbpf_strerror(int err, char *buf, size_t size); + +/** + * @brief **libbpf_bpf_attach_type_str()** converts the provided attach type + * value into a textual representation. + * @param t The attach type. + * @return Pointer to a static string identifying the attach type. NULL is + * returned for unknown **bpf_attach_type** values. + */ +LIBBPF_API const char *libbpf_bpf_attach_type_str(enum bpf_attach_type t); + +/** + * @brief **libbpf_bpf_link_type_str()** converts the provided link type value + * into a textual representation. + * @param t The link type. + * @return Pointer to a static string identifying the link type. NULL is + * returned for unknown **bpf_link_type** values. + */ +LIBBPF_API const char *libbpf_bpf_link_type_str(enum bpf_link_type t); + +/** + * @brief **libbpf_bpf_map_type_str()** converts the provided map type value + * into a textual representation. + * @param t The map type. + * @return Pointer to a static string identifying the map type. NULL is + * returned for unknown **bpf_map_type** values. + */ +LIBBPF_API const char *libbpf_bpf_map_type_str(enum bpf_map_type t); + +/** + * @brief **libbpf_bpf_prog_type_str()** converts the provided program type + * value into a textual representation. + * @param t The program type. + * @return Pointer to a static string identifying the program type. NULL is + * returned for unknown **bpf_prog_type** values. + */ +LIBBPF_API const char *libbpf_bpf_prog_type_str(enum bpf_prog_type t); + +enum libbpf_print_level { + LIBBPF_WARN, + LIBBPF_INFO, + LIBBPF_DEBUG, +}; + +typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level, + const char *, va_list ap); + +/** + * @brief **libbpf_set_print()** sets user-provided log callback function to + * be used for libbpf warnings and informational messages. + * @param fn The log print function. If NULL, libbpf won't print anything. + * @return Pointer to old print function. + */ +LIBBPF_API libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn); + +/* Hide internal to user */ +struct bpf_object; + +struct bpf_object_open_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* object name override, if provided: + * - for object open from file, this will override setting object + * name from file path's base name; + * - for object open from memory buffer, this will specify an object + * name and will override default "-" name; + */ + const char *object_name; + /* parse map definitions non-strictly, allowing extra attributes/data */ + bool relaxed_maps; + /* maps that set the 'pinning' attribute in their definition will have + * their pin_path attribute set to a file in this directory, and be + * auto-pinned to that path on load; defaults to "/sys/fs/bpf". + */ + const char *pin_root_path; + + __u32 :32; /* stub out now removed attach_prog_fd */ + + /* Additional kernel config content that augments and overrides + * system Kconfig for CONFIG_xxx externs. + */ + const char *kconfig; + /* Path to the custom BTF to be used for BPF CO-RE relocations. + * This custom BTF completely replaces the use of vmlinux BTF + * for the purpose of CO-RE relocations. + * NOTE: any other BPF feature (e.g., fentry/fexit programs, + * struct_ops, etc) will need actual kernel BTF at /sys/kernel/btf/vmlinux. + */ + const char *btf_custom_path; + /* Pointer to a buffer for storing kernel logs for applicable BPF + * commands. Valid kernel_log_size has to be specified as well and are + * passed-through to bpf() syscall. Keep in mind that kernel might + * fail operation with -ENOSPC error if provided buffer is too small + * to contain entire log output. + * See the comment below for kernel_log_level for interaction between + * log_buf and log_level settings. + * + * If specified, this log buffer will be passed for: + * - each BPF progral load (BPF_PROG_LOAD) attempt, unless overriden + * with bpf_program__set_log() on per-program level, to get + * BPF verifier log output. + * - during BPF object's BTF load into kernel (BPF_BTF_LOAD) to get + * BTF sanity checking log. + * + * Each BPF command (BPF_BTF_LOAD or BPF_PROG_LOAD) will overwrite + * previous contents, so if you need more fine-grained control, set + * per-program buffer with bpf_program__set_log_buf() to preserve each + * individual program's verification log. Keep using kernel_log_buf + * for BTF verification log, if necessary. + */ + char *kernel_log_buf; + size_t kernel_log_size; + /* + * Log level can be set independently from log buffer. Log_level=0 + * means that libbpf will attempt loading BTF or program without any + * logging requested, but will retry with either its own or custom log + * buffer, if provided, and log_level=1 on any error. + * And vice versa, setting log_level>0 will request BTF or prog + * loading with verbose log from the first attempt (and as such also + * for successfully loaded BTF or program), and the actual log buffer + * could be either libbpf's own auto-allocated log buffer, if + * kernel_log_buffer is NULL, or user-provided custom kernel_log_buf. + * If user didn't provide custom log buffer, libbpf will emit captured + * logs through its print callback. + */ + __u32 kernel_log_level; + + size_t :0; +}; +#define bpf_object_open_opts__last_field kernel_log_level + +/** + * @brief **bpf_object__open()** creates a bpf_object by opening + * the BPF ELF object file pointed to by the passed path and loading it + * into memory. + * @param path BPF object file path. + * @return pointer to the new bpf_object; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_object *bpf_object__open(const char *path); + +/** + * @brief **bpf_object__open_file()** creates a bpf_object by opening + * the BPF ELF object file pointed to by the passed path and loading it + * into memory. + * @param path BPF object file path + * @param opts options for how to load the bpf object, this parameter is + * optional and can be set to NULL + * @return pointer to the new bpf_object; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_object * +bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts); + +/** + * @brief **bpf_object__open_mem()** creates a bpf_object by reading + * the BPF objects raw bytes from a memory buffer containing a valid + * BPF ELF object file. + * @param obj_buf pointer to the buffer containing ELF file bytes + * @param obj_buf_sz number of bytes in the buffer + * @param opts options for how to load the bpf object + * @return pointer to the new bpf_object; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_object * +bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, + const struct bpf_object_open_opts *opts); + +/** + * @brief **bpf_object__load()** loads BPF object into kernel. + * @param obj Pointer to a valid BPF object instance returned by + * **bpf_object__open*()** APIs + * @return 0, on success; negative error code, otherwise, error code is + * stored in errno + */ +LIBBPF_API int bpf_object__load(struct bpf_object *obj); + +/** + * @brief **bpf_object__close()** closes a BPF object and releases all + * resources. + * @param obj Pointer to a valid BPF object + */ +LIBBPF_API void bpf_object__close(struct bpf_object *obj); + +/** + * @brief **bpf_object__pin_maps()** pins each map contained within + * the BPF object at the passed directory. + * @param obj Pointer to a valid BPF object + * @param path A directory where maps should be pinned. + * @return 0, on success; negative error code, otherwise + * + * If `path` is NULL `bpf_map__pin` (which is being used on each map) + * will use the pin_path attribute of each map. In this case, maps that + * don't have a pin_path set will be ignored. + */ +LIBBPF_API int bpf_object__pin_maps(struct bpf_object *obj, const char *path); + +/** + * @brief **bpf_object__unpin_maps()** unpins each map contained within + * the BPF object found in the passed directory. + * @param obj Pointer to a valid BPF object + * @param path A directory where pinned maps should be searched for. + * @return 0, on success; negative error code, otherwise + * + * If `path` is NULL `bpf_map__unpin` (which is being used on each map) + * will use the pin_path attribute of each map. In this case, maps that + * don't have a pin_path set will be ignored. + */ +LIBBPF_API int bpf_object__unpin_maps(struct bpf_object *obj, + const char *path); +LIBBPF_API int bpf_object__pin_programs(struct bpf_object *obj, + const char *path); +LIBBPF_API int bpf_object__unpin_programs(struct bpf_object *obj, + const char *path); +LIBBPF_API int bpf_object__pin(struct bpf_object *object, const char *path); + +LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj); +LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj); +LIBBPF_API int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version); + +struct btf; +LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj); +LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj); + +LIBBPF_API struct bpf_program * +bpf_object__find_program_by_name(const struct bpf_object *obj, + const char *name); + +LIBBPF_API int +libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, + enum bpf_attach_type *expected_attach_type); +LIBBPF_API int libbpf_attach_type_by_name(const char *name, + enum bpf_attach_type *attach_type); +LIBBPF_API int libbpf_find_vmlinux_btf_id(const char *name, + enum bpf_attach_type attach_type); + +/* Accessors of bpf_program */ +struct bpf_program; + +LIBBPF_API struct bpf_program * +bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prog); + +#define bpf_object__for_each_program(pos, obj) \ + for ((pos) = bpf_object__next_program((obj), NULL); \ + (pos) != NULL; \ + (pos) = bpf_object__next_program((obj), (pos))) + +LIBBPF_API struct bpf_program * +bpf_object__prev_program(const struct bpf_object *obj, struct bpf_program *prog); + +LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog, + __u32 ifindex); + +LIBBPF_API const char *bpf_program__name(const struct bpf_program *prog); +LIBBPF_API const char *bpf_program__section_name(const struct bpf_program *prog); +LIBBPF_API bool bpf_program__autoload(const struct bpf_program *prog); +LIBBPF_API int bpf_program__set_autoload(struct bpf_program *prog, bool autoload); +LIBBPF_API bool bpf_program__autoattach(const struct bpf_program *prog); +LIBBPF_API void bpf_program__set_autoattach(struct bpf_program *prog, bool autoattach); + +struct bpf_insn; + +/** + * @brief **bpf_program__insns()** gives read-only access to BPF program's + * underlying BPF instructions. + * @param prog BPF program for which to return instructions + * @return a pointer to an array of BPF instructions that belong to the + * specified BPF program + * + * Returned pointer is always valid and not NULL. Number of `struct bpf_insn` + * pointed to can be fetched using **bpf_program__insn_cnt()** API. + * + * Keep in mind, libbpf can modify and append/delete BPF program's + * instructions as it processes BPF object file and prepares everything for + * uploading into the kernel. So depending on the point in BPF object + * lifetime, **bpf_program__insns()** can return different sets of + * instructions. As an example, during BPF object load phase BPF program + * instructions will be CO-RE-relocated, BPF subprograms instructions will be + * appended, ldimm64 instructions will have FDs embedded, etc. So instructions + * returned before **bpf_object__load()** and after it might be quite + * different. + */ +LIBBPF_API const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog); + +/** + * @brief **bpf_program__set_insns()** can set BPF program's underlying + * BPF instructions. + * + * WARNING: This is a very advanced libbpf API and users need to know + * what they are doing. This should be used from prog_prepare_load_fn + * callback only. + * + * @param prog BPF program for which to return instructions + * @param new_insns a pointer to an array of BPF instructions + * @param new_insn_cnt number of `struct bpf_insn`'s that form + * specified BPF program + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_program__set_insns(struct bpf_program *prog, + struct bpf_insn *new_insns, size_t new_insn_cnt); + +/** + * @brief **bpf_program__insn_cnt()** returns number of `struct bpf_insn`'s + * that form specified BPF program. + * @param prog BPF program for which to return number of BPF instructions + * + * See **bpf_program__insns()** documentation for notes on how libbpf can + * change instructions and their count during different phases of + * **bpf_object** lifetime. + */ +LIBBPF_API size_t bpf_program__insn_cnt(const struct bpf_program *prog); + +LIBBPF_API int bpf_program__fd(const struct bpf_program *prog); + +/** + * @brief **bpf_program__pin()** pins the BPF program to a file + * in the BPF FS specified by a path. This increments the programs + * reference count, allowing it to stay loaded after the process + * which loaded it has exited. + * + * @param prog BPF program to pin, must already be loaded + * @param path file path in a BPF file system + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_program__pin(struct bpf_program *prog, const char *path); + +/** + * @brief **bpf_program__unpin()** unpins the BPF program from a file + * in the BPFFS specified by a path. This decrements the programs + * reference count. + * + * The file pinning the BPF program can also be unlinked by a different + * process in which case this function will return an error. + * + * @param prog BPF program to unpin + * @param path file path to the pin in a BPF file system + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_program__unpin(struct bpf_program *prog, const char *path); +LIBBPF_API void bpf_program__unload(struct bpf_program *prog); + +struct bpf_link; + +LIBBPF_API struct bpf_link *bpf_link__open(const char *path); +LIBBPF_API int bpf_link__fd(const struct bpf_link *link); +LIBBPF_API const char *bpf_link__pin_path(const struct bpf_link *link); +/** + * @brief **bpf_link__pin()** pins the BPF link to a file + * in the BPF FS specified by a path. This increments the links + * reference count, allowing it to stay loaded after the process + * which loaded it has exited. + * + * @param link BPF link to pin, must already be loaded + * @param path file path in a BPF file system + * @return 0, on success; negative error code, otherwise + */ + +LIBBPF_API int bpf_link__pin(struct bpf_link *link, const char *path); + +/** + * @brief **bpf_link__unpin()** unpins the BPF link from a file + * in the BPFFS specified by a path. This decrements the links + * reference count. + * + * The file pinning the BPF link can also be unlinked by a different + * process in which case this function will return an error. + * + * @param prog BPF program to unpin + * @param path file path to the pin in a BPF file system + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_link__unpin(struct bpf_link *link); +LIBBPF_API int bpf_link__update_program(struct bpf_link *link, + struct bpf_program *prog); +LIBBPF_API void bpf_link__disconnect(struct bpf_link *link); +LIBBPF_API int bpf_link__detach(struct bpf_link *link); +LIBBPF_API int bpf_link__destroy(struct bpf_link *link); + +/** + * @brief **bpf_program__attach()** is a generic function for attaching + * a BPF program based on auto-detection of program type, attach type, + * and extra paremeters, where applicable. + * + * @param prog BPF program to attach + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + * + * This is supported for: + * - kprobe/kretprobe (depends on SEC() definition) + * - uprobe/uretprobe (depends on SEC() definition) + * - tracepoint + * - raw tracepoint + * - tracing programs (typed raw TP/fentry/fexit/fmod_ret) + */ +LIBBPF_API struct bpf_link * +bpf_program__attach(const struct bpf_program *prog); + +struct bpf_perf_event_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; +}; +#define bpf_perf_event_opts__last_field bpf_cookie + +LIBBPF_API struct bpf_link * +bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd); + +LIBBPF_API struct bpf_link * +bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd, + const struct bpf_perf_event_opts *opts); + +struct bpf_kprobe_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* function's offset to install kprobe to */ + size_t offset; + /* kprobe is return probe */ + bool retprobe; + size_t :0; +}; +#define bpf_kprobe_opts__last_field retprobe + +LIBBPF_API struct bpf_link * +bpf_program__attach_kprobe(const struct bpf_program *prog, bool retprobe, + const char *func_name); +LIBBPF_API struct bpf_link * +bpf_program__attach_kprobe_opts(const struct bpf_program *prog, + const char *func_name, + const struct bpf_kprobe_opts *opts); + +struct bpf_kprobe_multi_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* array of function symbols to attach */ + const char **syms; + /* array of function addresses to attach */ + const unsigned long *addrs; + /* array of user-provided values fetchable through bpf_get_attach_cookie */ + const __u64 *cookies; + /* number of elements in syms/addrs/cookies arrays */ + size_t cnt; + /* create return kprobes */ + bool retprobe; + size_t :0; +}; + +#define bpf_kprobe_multi_opts__last_field retprobe + +LIBBPF_API struct bpf_link * +bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, + const char *pattern, + const struct bpf_kprobe_multi_opts *opts); + +struct bpf_ksyscall_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* attach as return probe? */ + bool retprobe; + size_t :0; +}; +#define bpf_ksyscall_opts__last_field retprobe + +/** + * @brief **bpf_program__attach_ksyscall()** attaches a BPF program + * to kernel syscall handler of a specified syscall. Optionally it's possible + * to request to install retprobe that will be triggered at syscall exit. It's + * also possible to associate BPF cookie (though options). + * + * Libbpf automatically will determine correct full kernel function name, + * which depending on system architecture and kernel version/configuration + * could be of the form ___sys_ or __se_sys_, and will + * attach specified program using kprobe/kretprobe mechanism. + * + * **bpf_program__attach_ksyscall()** is an API counterpart of declarative + * **SEC("ksyscall/")** annotation of BPF programs. + * + * At the moment **SEC("ksyscall")** and **bpf_program__attach_ksyscall()** do + * not handle all the calling convention quirks for mmap(), clone() and compat + * syscalls. It also only attaches to "native" syscall interfaces. If host + * system supports compat syscalls or defines 32-bit syscalls in 64-bit + * kernel, such syscall interfaces won't be attached to by libbpf. + * + * These limitations may or may not change in the future. Therefore it is + * recommended to use SEC("kprobe") for these syscalls or if working with + * compat and 32-bit interfaces is required. + * + * @param prog BPF program to attach + * @param syscall_name Symbolic name of the syscall (e.g., "bpf") + * @param opts Additional options (see **struct bpf_ksyscall_opts**) + * @return Reference to the newly created BPF link; or NULL is returned on + * error, error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_ksyscall(const struct bpf_program *prog, + const char *syscall_name, + const struct bpf_ksyscall_opts *opts); + +struct bpf_uprobe_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* offset of kernel reference counted USDT semaphore, added in + * a6ca88b241d5 ("trace_uprobe: support reference counter in fd-based uprobe") + */ + size_t ref_ctr_offset; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* uprobe is return probe, invoked at function return time */ + bool retprobe; + /* Function name to attach to. Could be an unqualified ("abc") or library-qualified + * "abc@LIBXYZ" name. To specify function entry, func_name should be set while + * func_offset argument to bpf_prog__attach_uprobe_opts() should be 0. To trace an + * offset within a function, specify func_name and use func_offset argument to specify + * offset within the function. Shared library functions must specify the shared library + * binary_path. + */ + const char *func_name; + size_t :0; +}; +#define bpf_uprobe_opts__last_field func_name + +/** + * @brief **bpf_program__attach_uprobe()** attaches a BPF program + * to the userspace function which is found by binary path and + * offset. You can optionally specify a particular proccess to attach + * to. You can also optionally attach the program to the function + * exit instead of entry. + * + * @param prog BPF program to attach + * @param retprobe Attach to function exit + * @param pid Process ID to attach the uprobe to, 0 for self (own process), + * -1 for all processes + * @param binary_path Path to binary that contains the function symbol + * @param func_offset Offset within the binary of the function symbol + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_uprobe(const struct bpf_program *prog, bool retprobe, + pid_t pid, const char *binary_path, + size_t func_offset); + +/** + * @brief **bpf_program__attach_uprobe_opts()** is just like + * bpf_program__attach_uprobe() except with a options struct + * for various configurations. + * + * @param prog BPF program to attach + * @param pid Process ID to attach the uprobe to, 0 for self (own process), + * -1 for all processes + * @param binary_path Path to binary that contains the function symbol + * @param func_offset Offset within the binary of the function symbol + * @param opts Options for altering program attachment + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, + const char *binary_path, size_t func_offset, + const struct bpf_uprobe_opts *opts); + +struct bpf_usdt_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value accessible through usdt_cookie() */ + __u64 usdt_cookie; + size_t :0; +}; +#define bpf_usdt_opts__last_field usdt_cookie + +/** + * @brief **bpf_program__attach_usdt()** is just like + * bpf_program__attach_uprobe_opts() except it covers USDT (User-space + * Statically Defined Tracepoint) attachment, instead of attaching to + * user-space function entry or exit. + * + * @param prog BPF program to attach + * @param pid Process ID to attach the uprobe to, 0 for self (own process), + * -1 for all processes + * @param binary_path Path to binary that contains provided USDT probe + * @param usdt_provider USDT provider name + * @param usdt_name USDT probe name + * @param opts Options for altering program attachment + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_usdt(const struct bpf_program *prog, + pid_t pid, const char *binary_path, + const char *usdt_provider, const char *usdt_name, + const struct bpf_usdt_opts *opts); + +struct bpf_tracepoint_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; +}; +#define bpf_tracepoint_opts__last_field bpf_cookie + +LIBBPF_API struct bpf_link * +bpf_program__attach_tracepoint(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name); +LIBBPF_API struct bpf_link * +bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name, + const struct bpf_tracepoint_opts *opts); + +LIBBPF_API struct bpf_link * +bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, + const char *tp_name); + +struct bpf_trace_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 cookie; +}; +#define bpf_trace_opts__last_field cookie + +LIBBPF_API struct bpf_link * +bpf_program__attach_trace(const struct bpf_program *prog); +LIBBPF_API struct bpf_link * +bpf_program__attach_trace_opts(const struct bpf_program *prog, const struct bpf_trace_opts *opts); + +LIBBPF_API struct bpf_link * +bpf_program__attach_lsm(const struct bpf_program *prog); +LIBBPF_API struct bpf_link * +bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd); +LIBBPF_API struct bpf_link * +bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd); +LIBBPF_API struct bpf_link * +bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex); +LIBBPF_API struct bpf_link * +bpf_program__attach_freplace(const struct bpf_program *prog, + int target_fd, const char *attach_func_name); + +struct bpf_map; + +LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map); + +struct bpf_iter_attach_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + union bpf_iter_link_info *link_info; + __u32 link_info_len; +}; +#define bpf_iter_attach_opts__last_field link_info_len + +LIBBPF_API struct bpf_link * +bpf_program__attach_iter(const struct bpf_program *prog, + const struct bpf_iter_attach_opts *opts); + +LIBBPF_API enum bpf_prog_type bpf_program__type(const struct bpf_program *prog); + +/** + * @brief **bpf_program__set_type()** sets the program + * type of the passed BPF program. + * @param prog BPF program to set the program type for + * @param type program type to set the BPF map to have + * @return error code; or 0 if no error. An error occurs + * if the object is already loaded. + * + * This must be called before the BPF object is loaded, + * otherwise it has no effect and an error is returned. + */ +LIBBPF_API int bpf_program__set_type(struct bpf_program *prog, + enum bpf_prog_type type); + +LIBBPF_API enum bpf_attach_type +bpf_program__expected_attach_type(const struct bpf_program *prog); + +/** + * @brief **bpf_program__set_expected_attach_type()** sets the + * attach type of the passed BPF program. This is used for + * auto-detection of attachment when programs are loaded. + * @param prog BPF program to set the attach type for + * @param type attach type to set the BPF map to have + * @return error code; or 0 if no error. An error occurs + * if the object is already loaded. + * + * This must be called before the BPF object is loaded, + * otherwise it has no effect and an error is returned. + */ +LIBBPF_API int +bpf_program__set_expected_attach_type(struct bpf_program *prog, + enum bpf_attach_type type); + +LIBBPF_API __u32 bpf_program__flags(const struct bpf_program *prog); +LIBBPF_API int bpf_program__set_flags(struct bpf_program *prog, __u32 flags); + +/* Per-program log level and log buffer getters/setters. + * See bpf_object_open_opts comments regarding log_level and log_buf + * interactions. + */ +LIBBPF_API __u32 bpf_program__log_level(const struct bpf_program *prog); +LIBBPF_API int bpf_program__set_log_level(struct bpf_program *prog, __u32 log_level); +LIBBPF_API const char *bpf_program__log_buf(const struct bpf_program *prog, size_t *log_size); +LIBBPF_API int bpf_program__set_log_buf(struct bpf_program *prog, char *log_buf, size_t log_size); + +/** + * @brief **bpf_program__set_attach_target()** sets BTF-based attach target + * for supported BPF program types: + * - BTF-aware raw tracepoints (tp_btf); + * - fentry/fexit/fmod_ret; + * - lsm; + * - freplace. + * @param prog BPF program to set the attach type for + * @param type attach type to set the BPF map to have + * @return error code; or 0 if no error occurred. + */ +LIBBPF_API int +bpf_program__set_attach_target(struct bpf_program *prog, int attach_prog_fd, + const char *attach_func_name); + +/** + * @brief **bpf_object__find_map_by_name()** returns BPF map of + * the given name, if it exists within the passed BPF object + * @param obj BPF object + * @param name name of the BPF map + * @return BPF map instance, if such map exists within the BPF object; + * or NULL otherwise. + */ +LIBBPF_API struct bpf_map * +bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name); + +LIBBPF_API int +bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name); + +LIBBPF_API struct bpf_map * +bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *map); + +#define bpf_object__for_each_map(pos, obj) \ + for ((pos) = bpf_object__next_map((obj), NULL); \ + (pos) != NULL; \ + (pos) = bpf_object__next_map((obj), (pos))) +#define bpf_map__for_each bpf_object__for_each_map + +LIBBPF_API struct bpf_map * +bpf_object__prev_map(const struct bpf_object *obj, const struct bpf_map *map); + +/** + * @brief **bpf_map__set_autocreate()** sets whether libbpf has to auto-create + * BPF map during BPF object load phase. + * @param map the BPF map instance + * @param autocreate whether to create BPF map during BPF object load + * @return 0 on success; -EBUSY if BPF object was already loaded + * + * **bpf_map__set_autocreate()** allows to opt-out from libbpf auto-creating + * BPF map. By default, libbpf will attempt to create every single BPF map + * defined in BPF object file using BPF_MAP_CREATE command of bpf() syscall + * and fill in map FD in BPF instructions. + * + * This API allows to opt-out of this process for specific map instance. This + * can be useful if host kernel doesn't support such BPF map type or used + * combination of flags and user application wants to avoid creating such + * a map in the first place. User is still responsible to make sure that their + * BPF-side code that expects to use such missing BPF map is recognized by BPF + * verifier as dead code, otherwise BPF verifier will reject such BPF program. + */ +LIBBPF_API int bpf_map__set_autocreate(struct bpf_map *map, bool autocreate); +LIBBPF_API bool bpf_map__autocreate(const struct bpf_map *map); + +/** + * @brief **bpf_map__fd()** gets the file descriptor of the passed + * BPF map + * @param map the BPF map instance + * @return the file descriptor; or -EINVAL in case of an error + */ +LIBBPF_API int bpf_map__fd(const struct bpf_map *map); +LIBBPF_API int bpf_map__reuse_fd(struct bpf_map *map, int fd); +/* get map name */ +LIBBPF_API const char *bpf_map__name(const struct bpf_map *map); +/* get/set map type */ +LIBBPF_API enum bpf_map_type bpf_map__type(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type); +/* get/set map size (max_entries) */ +LIBBPF_API __u32 bpf_map__max_entries(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries); +/* get/set map flags */ +LIBBPF_API __u32 bpf_map__map_flags(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags); +/* get/set map NUMA node */ +LIBBPF_API __u32 bpf_map__numa_node(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node); +/* get/set map key size */ +LIBBPF_API __u32 bpf_map__key_size(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_key_size(struct bpf_map *map, __u32 size); +/* get/set map value size */ +LIBBPF_API __u32 bpf_map__value_size(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_value_size(struct bpf_map *map, __u32 size); +/* get map key/value BTF type IDs */ +LIBBPF_API __u32 bpf_map__btf_key_type_id(const struct bpf_map *map); +LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map); +/* get/set map if_index */ +LIBBPF_API __u32 bpf_map__ifindex(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex); +/* get/set map map_extra flags */ +LIBBPF_API __u64 bpf_map__map_extra(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_map_extra(struct bpf_map *map, __u64 map_extra); + +LIBBPF_API int bpf_map__set_initial_value(struct bpf_map *map, + const void *data, size_t size); +LIBBPF_API const void *bpf_map__initial_value(struct bpf_map *map, size_t *psize); + +/** + * @brief **bpf_map__is_internal()** tells the caller whether or not the + * passed map is a special map created by libbpf automatically for things like + * global variables, __ksym externs, Kconfig values, etc + * @param map the bpf_map + * @return true, if the map is an internal map; false, otherwise + */ +LIBBPF_API bool bpf_map__is_internal(const struct bpf_map *map); + +/** + * @brief **bpf_map__set_pin_path()** sets the path attribute that tells where the + * BPF map should be pinned. This does not actually create the 'pin'. + * @param map The bpf_map + * @param path The path + * @return 0, on success; negative error, otherwise + */ +LIBBPF_API int bpf_map__set_pin_path(struct bpf_map *map, const char *path); + +/** + * @brief **bpf_map__pin_path()** gets the path attribute that tells where the + * BPF map should be pinned. + * @param map The bpf_map + * @return The path string; which can be NULL + */ +LIBBPF_API const char *bpf_map__pin_path(const struct bpf_map *map); + +/** + * @brief **bpf_map__is_pinned()** tells the caller whether or not the + * passed map has been pinned via a 'pin' file. + * @param map The bpf_map + * @return true, if the map is pinned; false, otherwise + */ +LIBBPF_API bool bpf_map__is_pinned(const struct bpf_map *map); + +/** + * @brief **bpf_map__pin()** creates a file that serves as a 'pin' + * for the BPF map. This increments the reference count on the + * BPF map which will keep the BPF map loaded even after the + * userspace process which loaded it has exited. + * @param map The bpf_map to pin + * @param path A file path for the 'pin' + * @return 0, on success; negative error, otherwise + * + * If `path` is NULL the maps `pin_path` attribute will be used. If this is + * also NULL, an error will be returned and the map will not be pinned. + */ +LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path); + +/** + * @brief **bpf_map__unpin()** removes the file that serves as a + * 'pin' for the BPF map. + * @param map The bpf_map to unpin + * @param path A file path for the 'pin' + * @return 0, on success; negative error, otherwise + * + * The `path` parameter can be NULL, in which case the `pin_path` + * map attribute is unpinned. If both the `path` parameter and + * `pin_path` map attribute are set, they must be equal. + */ +LIBBPF_API int bpf_map__unpin(struct bpf_map *map, const char *path); + +LIBBPF_API int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd); +LIBBPF_API struct bpf_map *bpf_map__inner_map(struct bpf_map *map); + +/** + * @brief **bpf_map__lookup_elem()** allows to lookup BPF map value + * corresponding to provided key. + * @param map BPF map to lookup element in + * @param key pointer to memory containing bytes of the key used for lookup + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @param value pointer to memory in which looked up value will be stored + * @param value_sz size in byte of value data memory; it has to match BPF map + * definition's **value_size**. For per-CPU BPF maps value size has to be + * a product of BPF map value size and number of possible CPUs in the system + * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for + * per-CPU values value size has to be aligned up to closest 8 bytes for + * alignment reasons, so expected size is: `round_up(value_size, 8) + * * libbpf_num_possible_cpus()`. + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__lookup_elem()** is high-level equivalent of + * **bpf_map_lookup_elem()** API with added check for key and value size. + */ +LIBBPF_API int bpf_map__lookup_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags); + +/** + * @brief **bpf_map__update_elem()** allows to insert or update value in BPF + * map that corresponds to provided key. + * @param map BPF map to insert to or update element in + * @param key pointer to memory containing bytes of the key + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @param value pointer to memory containing bytes of the value + * @param value_sz size in byte of value data memory; it has to match BPF map + * definition's **value_size**. For per-CPU BPF maps value size has to be + * a product of BPF map value size and number of possible CPUs in the system + * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for + * per-CPU values value size has to be aligned up to closest 8 bytes for + * alignment reasons, so expected size is: `round_up(value_size, 8) + * * libbpf_num_possible_cpus()`. + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__update_elem()** is high-level equivalent of + * **bpf_map_update_elem()** API with added check for key and value size. + */ +LIBBPF_API int bpf_map__update_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + const void *value, size_t value_sz, __u64 flags); + +/** + * @brief **bpf_map__delete_elem()** allows to delete element in BPF map that + * corresponds to provided key. + * @param map BPF map to delete element from + * @param key pointer to memory containing bytes of the key + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__delete_elem()** is high-level equivalent of + * **bpf_map_delete_elem()** API with added check for key size. + */ +LIBBPF_API int bpf_map__delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, __u64 flags); + +/** + * @brief **bpf_map__lookup_and_delete_elem()** allows to lookup BPF map value + * corresponding to provided key and atomically delete it afterwards. + * @param map BPF map to lookup element in + * @param key pointer to memory containing bytes of the key used for lookup + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @param value pointer to memory in which looked up value will be stored + * @param value_sz size in byte of value data memory; it has to match BPF map + * definition's **value_size**. For per-CPU BPF maps value size has to be + * a product of BPF map value size and number of possible CPUs in the system + * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for + * per-CPU values value size has to be aligned up to closest 8 bytes for + * alignment reasons, so expected size is: `round_up(value_size, 8) + * * libbpf_num_possible_cpus()`. + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__lookup_and_delete_elem()** is high-level equivalent of + * **bpf_map_lookup_and_delete_elem()** API with added check for key and value size. + */ +LIBBPF_API int bpf_map__lookup_and_delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags); + +/** + * @brief **bpf_map__get_next_key()** allows to iterate BPF map keys by + * fetching next key that follows current key. + * @param map BPF map to fetch next key from + * @param cur_key pointer to memory containing bytes of current key or NULL to + * fetch the first key + * @param next_key pointer to memory to write next key into + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @return 0, on success; -ENOENT if **cur_key** is the last key in BPF map; + * negative error, otherwise + * + * **bpf_map__get_next_key()** is high-level equivalent of + * **bpf_map_get_next_key()** API with added check for key size. + */ +LIBBPF_API int bpf_map__get_next_key(const struct bpf_map *map, + const void *cur_key, void *next_key, size_t key_sz); + +struct bpf_xdp_set_link_opts { + size_t sz; + int old_fd; + size_t :0; +}; +#define bpf_xdp_set_link_opts__last_field old_fd + +struct bpf_xdp_attach_opts { + size_t sz; + int old_prog_fd; + size_t :0; +}; +#define bpf_xdp_attach_opts__last_field old_prog_fd + +struct bpf_xdp_query_opts { + size_t sz; + __u32 prog_id; /* output */ + __u32 drv_prog_id; /* output */ + __u32 hw_prog_id; /* output */ + __u32 skb_prog_id; /* output */ + __u8 attach_mode; /* output */ + __u64 feature_flags; /* output */ + size_t :0; +}; +#define bpf_xdp_query_opts__last_field feature_flags + +LIBBPF_API int bpf_xdp_attach(int ifindex, int prog_fd, __u32 flags, + const struct bpf_xdp_attach_opts *opts); +LIBBPF_API int bpf_xdp_detach(int ifindex, __u32 flags, + const struct bpf_xdp_attach_opts *opts); +LIBBPF_API int bpf_xdp_query(int ifindex, int flags, struct bpf_xdp_query_opts *opts); +LIBBPF_API int bpf_xdp_query_id(int ifindex, int flags, __u32 *prog_id); + +/* TC related API */ +enum bpf_tc_attach_point { + BPF_TC_INGRESS = 1 << 0, + BPF_TC_EGRESS = 1 << 1, + BPF_TC_CUSTOM = 1 << 2, +}; + +#define BPF_TC_PARENT(a, b) \ + ((((a) << 16) & 0xFFFF0000U) | ((b) & 0x0000FFFFU)) + +enum bpf_tc_flags { + BPF_TC_F_REPLACE = 1 << 0, +}; + +struct bpf_tc_hook { + size_t sz; + int ifindex; + enum bpf_tc_attach_point attach_point; + __u32 parent; + size_t :0; +}; +#define bpf_tc_hook__last_field parent + +struct bpf_tc_opts { + size_t sz; + int prog_fd; + __u32 flags; + __u32 prog_id; + __u32 handle; + __u32 priority; + size_t :0; +}; +#define bpf_tc_opts__last_field priority + +LIBBPF_API int bpf_tc_hook_create(struct bpf_tc_hook *hook); +LIBBPF_API int bpf_tc_hook_destroy(struct bpf_tc_hook *hook); +LIBBPF_API int bpf_tc_attach(const struct bpf_tc_hook *hook, + struct bpf_tc_opts *opts); +LIBBPF_API int bpf_tc_detach(const struct bpf_tc_hook *hook, + const struct bpf_tc_opts *opts); +LIBBPF_API int bpf_tc_query(const struct bpf_tc_hook *hook, + struct bpf_tc_opts *opts); + +/* Ring buffer APIs */ +struct ring_buffer; +struct user_ring_buffer; + +typedef int (*ring_buffer_sample_fn)(void *ctx, void *data, size_t size); + +struct ring_buffer_opts { + size_t sz; /* size of this struct, for forward/backward compatiblity */ +}; + +#define ring_buffer_opts__last_field sz + +LIBBPF_API struct ring_buffer * +ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx, + const struct ring_buffer_opts *opts); +LIBBPF_API void ring_buffer__free(struct ring_buffer *rb); +LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd, + ring_buffer_sample_fn sample_cb, void *ctx); +LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms); +LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb); +LIBBPF_API int ring_buffer__epoll_fd(const struct ring_buffer *rb); + +struct user_ring_buffer_opts { + size_t sz; /* size of this struct, for forward/backward compatibility */ +}; + +#define user_ring_buffer_opts__last_field sz + +/** + * @brief **user_ring_buffer__new()** creates a new instance of a user ring + * buffer. + * + * @param map_fd A file descriptor to a BPF_MAP_TYPE_USER_RINGBUF map. + * @param opts Options for how the ring buffer should be created. + * @return A user ring buffer on success; NULL and errno being set on a + * failure. + */ +LIBBPF_API struct user_ring_buffer * +user_ring_buffer__new(int map_fd, const struct user_ring_buffer_opts *opts); + +/** + * @brief **user_ring_buffer__reserve()** reserves a pointer to a sample in the + * user ring buffer. + * @param rb A pointer to a user ring buffer. + * @param size The size of the sample, in bytes. + * @return A pointer to an 8-byte aligned reserved region of the user ring + * buffer; NULL, and errno being set if a sample could not be reserved. + * + * This function is *not* thread safe, and callers must synchronize accessing + * this function if there are multiple producers. If a size is requested that + * is larger than the size of the entire ring buffer, errno will be set to + * E2BIG and NULL is returned. If the ring buffer could accommodate the size, + * but currently does not have enough space, errno is set to ENOSPC and NULL is + * returned. + * + * After initializing the sample, callers must invoke + * **user_ring_buffer__submit()** to post the sample to the kernel. Otherwise, + * the sample must be freed with **user_ring_buffer__discard()**. + */ +LIBBPF_API void *user_ring_buffer__reserve(struct user_ring_buffer *rb, __u32 size); + +/** + * @brief **user_ring_buffer__reserve_blocking()** reserves a record in the + * ring buffer, possibly blocking for up to @timeout_ms until a sample becomes + * available. + * @param rb The user ring buffer. + * @param size The size of the sample, in bytes. + * @param timeout_ms The amount of time, in milliseconds, for which the caller + * should block when waiting for a sample. -1 causes the caller to block + * indefinitely. + * @return A pointer to an 8-byte aligned reserved region of the user ring + * buffer; NULL, and errno being set if a sample could not be reserved. + * + * This function is *not* thread safe, and callers must synchronize + * accessing this function if there are multiple producers + * + * If **timeout_ms** is -1, the function will block indefinitely until a sample + * becomes available. Otherwise, **timeout_ms** must be non-negative, or errno + * is set to EINVAL, and NULL is returned. If **timeout_ms** is 0, no blocking + * will occur and the function will return immediately after attempting to + * reserve a sample. + * + * If **size** is larger than the size of the entire ring buffer, errno is set + * to E2BIG and NULL is returned. If the ring buffer could accommodate + * **size**, but currently does not have enough space, the caller will block + * until at most **timeout_ms** has elapsed. If insufficient space is available + * at that time, errno is set to ENOSPC, and NULL is returned. + * + * The kernel guarantees that it will wake up this thread to check if + * sufficient space is available in the ring buffer at least once per + * invocation of the **bpf_ringbuf_drain()** helper function, provided that at + * least one sample is consumed, and the BPF program did not invoke the + * function with BPF_RB_NO_WAKEUP. A wakeup may occur sooner than that, but the + * kernel does not guarantee this. If the helper function is invoked with + * BPF_RB_FORCE_WAKEUP, a wakeup event will be sent even if no sample is + * consumed. + * + * When a sample of size **size** is found within **timeout_ms**, a pointer to + * the sample is returned. After initializing the sample, callers must invoke + * **user_ring_buffer__submit()** to post the sample to the ring buffer. + * Otherwise, the sample must be freed with **user_ring_buffer__discard()**. + */ +LIBBPF_API void *user_ring_buffer__reserve_blocking(struct user_ring_buffer *rb, + __u32 size, + int timeout_ms); + +/** + * @brief **user_ring_buffer__submit()** submits a previously reserved sample + * into the ring buffer. + * @param rb The user ring buffer. + * @param sample A reserved sample. + * + * It is not necessary to synchronize amongst multiple producers when invoking + * this function. + */ +LIBBPF_API void user_ring_buffer__submit(struct user_ring_buffer *rb, void *sample); + +/** + * @brief **user_ring_buffer__discard()** discards a previously reserved sample. + * @param rb The user ring buffer. + * @param sample A reserved sample. + * + * It is not necessary to synchronize amongst multiple producers when invoking + * this function. + */ +LIBBPF_API void user_ring_buffer__discard(struct user_ring_buffer *rb, void *sample); + +/** + * @brief **user_ring_buffer__free()** frees a ring buffer that was previously + * created with **user_ring_buffer__new()**. + * @param rb The user ring buffer being freed. + */ +LIBBPF_API void user_ring_buffer__free(struct user_ring_buffer *rb); + +/* Perf buffer APIs */ +struct perf_buffer; + +typedef void (*perf_buffer_sample_fn)(void *ctx, int cpu, + void *data, __u32 size); +typedef void (*perf_buffer_lost_fn)(void *ctx, int cpu, __u64 cnt); + +/* common use perf buffer options */ +struct perf_buffer_opts { + size_t sz; + __u32 sample_period; + size_t :0; +}; +#define perf_buffer_opts__last_field sample_period + +/** + * @brief **perf_buffer__new()** creates BPF perfbuf manager for a specified + * BPF_PERF_EVENT_ARRAY map + * @param map_fd FD of BPF_PERF_EVENT_ARRAY BPF map that will be used by BPF + * code to send data over to user-space + * @param page_cnt number of memory pages allocated for each per-CPU buffer + * @param sample_cb function called on each received data record + * @param lost_cb function called when record loss has occurred + * @param ctx user-provided extra context passed into *sample_cb* and *lost_cb* + * @return a new instance of struct perf_buffer on success, NULL on error with + * *errno* containing an error code + */ +LIBBPF_API struct perf_buffer * +perf_buffer__new(int map_fd, size_t page_cnt, + perf_buffer_sample_fn sample_cb, perf_buffer_lost_fn lost_cb, void *ctx, + const struct perf_buffer_opts *opts); + +enum bpf_perf_event_ret { + LIBBPF_PERF_EVENT_DONE = 0, + LIBBPF_PERF_EVENT_ERROR = -1, + LIBBPF_PERF_EVENT_CONT = -2, +}; + +struct perf_event_header; + +typedef enum bpf_perf_event_ret +(*perf_buffer_event_fn)(void *ctx, int cpu, struct perf_event_header *event); + +/* raw perf buffer options, giving most power and control */ +struct perf_buffer_raw_opts { + size_t sz; + long :0; + long :0; + /* if cpu_cnt == 0, open all on all possible CPUs (up to the number of + * max_entries of given PERF_EVENT_ARRAY map) + */ + int cpu_cnt; + /* if cpu_cnt > 0, cpus is an array of CPUs to open ring buffers on */ + int *cpus; + /* if cpu_cnt > 0, map_keys specify map keys to set per-CPU FDs for */ + int *map_keys; +}; +#define perf_buffer_raw_opts__last_field map_keys + +struct perf_event_attr; + +LIBBPF_API struct perf_buffer * +perf_buffer__new_raw(int map_fd, size_t page_cnt, struct perf_event_attr *attr, + perf_buffer_event_fn event_cb, void *ctx, + const struct perf_buffer_raw_opts *opts); + +LIBBPF_API void perf_buffer__free(struct perf_buffer *pb); +LIBBPF_API int perf_buffer__epoll_fd(const struct perf_buffer *pb); +LIBBPF_API int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms); +LIBBPF_API int perf_buffer__consume(struct perf_buffer *pb); +LIBBPF_API int perf_buffer__consume_buffer(struct perf_buffer *pb, size_t buf_idx); +LIBBPF_API size_t perf_buffer__buffer_cnt(const struct perf_buffer *pb); +LIBBPF_API int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_idx); +/** + * @brief **perf_buffer__buffer()** returns the per-cpu raw mmap()'ed underlying + * memory region of the ring buffer. + * This ring buffer can be used to implement a custom events consumer. + * The ring buffer starts with the *struct perf_event_mmap_page*, which + * holds the ring buffer managment fields, when accessing the header + * structure it's important to be SMP aware. + * You can refer to *perf_event_read_simple* for a simple example. + * @param pb the perf buffer structure + * @param buf_idx the buffer index to retreive + * @param buf (out) gets the base pointer of the mmap()'ed memory + * @param buf_size (out) gets the size of the mmap()'ed region + * @return 0 on success, negative error code for failure + */ +LIBBPF_API int perf_buffer__buffer(struct perf_buffer *pb, int buf_idx, void **buf, + size_t *buf_size); + +struct bpf_prog_linfo; +struct bpf_prog_info; + +LIBBPF_API void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo); +LIBBPF_API struct bpf_prog_linfo * +bpf_prog_linfo__new(const struct bpf_prog_info *info); +LIBBPF_API const struct bpf_line_info * +bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo, + __u64 addr, __u32 func_idx, __u32 nr_skip); +LIBBPF_API const struct bpf_line_info * +bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo, + __u32 insn_off, __u32 nr_skip); + +/* + * Probe for supported system features + * + * Note that running many of these probes in a short amount of time can cause + * the kernel to reach the maximal size of lockable memory allowed for the + * user, causing subsequent probes to fail. In this case, the caller may want + * to adjust that limit with setrlimit(). + */ + +/** + * @brief **libbpf_probe_bpf_prog_type()** detects if host kernel supports + * BPF programs of a given type. + * @param prog_type BPF program type to detect kernel support for + * @param opts reserved for future extensibility, should be NULL + * @return 1, if given program type is supported; 0, if given program type is + * not supported; negative error code if feature detection failed or can't be + * performed + * + * Make sure the process has required set of CAP_* permissions (or runs as + * root) when performing feature checking. + */ +LIBBPF_API int libbpf_probe_bpf_prog_type(enum bpf_prog_type prog_type, const void *opts); +/** + * @brief **libbpf_probe_bpf_map_type()** detects if host kernel supports + * BPF maps of a given type. + * @param map_type BPF map type to detect kernel support for + * @param opts reserved for future extensibility, should be NULL + * @return 1, if given map type is supported; 0, if given map type is + * not supported; negative error code if feature detection failed or can't be + * performed + * + * Make sure the process has required set of CAP_* permissions (or runs as + * root) when performing feature checking. + */ +LIBBPF_API int libbpf_probe_bpf_map_type(enum bpf_map_type map_type, const void *opts); +/** + * @brief **libbpf_probe_bpf_helper()** detects if host kernel supports the + * use of a given BPF helper from specified BPF program type. + * @param prog_type BPF program type used to check the support of BPF helper + * @param helper_id BPF helper ID (enum bpf_func_id) to check support for + * @param opts reserved for future extensibility, should be NULL + * @return 1, if given combination of program type and helper is supported; 0, + * if the combination is not supported; negative error code if feature + * detection for provided input arguments failed or can't be performed + * + * Make sure the process has required set of CAP_* permissions (or runs as + * root) when performing feature checking. + */ +LIBBPF_API int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, + enum bpf_func_id helper_id, const void *opts); + +/** + * @brief **libbpf_num_possible_cpus()** is a helper function to get the + * number of possible CPUs that the host kernel supports and expects. + * @return number of possible CPUs; or error code on failure + * + * Example usage: + * + * int ncpus = libbpf_num_possible_cpus(); + * if (ncpus < 0) { + * // error handling + * } + * long values[ncpus]; + * bpf_map_lookup_elem(per_cpu_map_fd, key, values); + */ +LIBBPF_API int libbpf_num_possible_cpus(void); + +struct bpf_map_skeleton { + const char *name; + struct bpf_map **map; + void **mmaped; +}; + +struct bpf_prog_skeleton { + const char *name; + struct bpf_program **prog; + struct bpf_link **link; +}; + +struct bpf_object_skeleton { + size_t sz; /* size of this struct, for forward/backward compatibility */ + + const char *name; + const void *data; + size_t data_sz; + + struct bpf_object **obj; + + int map_cnt; + int map_skel_sz; /* sizeof(struct bpf_map_skeleton) */ + struct bpf_map_skeleton *maps; + + int prog_cnt; + int prog_skel_sz; /* sizeof(struct bpf_prog_skeleton) */ + struct bpf_prog_skeleton *progs; +}; + +LIBBPF_API int +bpf_object__open_skeleton(struct bpf_object_skeleton *s, + const struct bpf_object_open_opts *opts); +LIBBPF_API int bpf_object__load_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API int bpf_object__attach_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API void bpf_object__detach_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s); + +struct bpf_var_skeleton { + const char *name; + struct bpf_map **map; + void **addr; +}; + +struct bpf_object_subskeleton { + size_t sz; /* size of this struct, for forward/backward compatibility */ + + const struct bpf_object *obj; + + int map_cnt; + int map_skel_sz; /* sizeof(struct bpf_map_skeleton) */ + struct bpf_map_skeleton *maps; + + int prog_cnt; + int prog_skel_sz; /* sizeof(struct bpf_prog_skeleton) */ + struct bpf_prog_skeleton *progs; + + int var_cnt; + int var_skel_sz; /* sizeof(struct bpf_var_skeleton) */ + struct bpf_var_skeleton *vars; +}; + +LIBBPF_API int +bpf_object__open_subskeleton(struct bpf_object_subskeleton *s); +LIBBPF_API void +bpf_object__destroy_subskeleton(struct bpf_object_subskeleton *s); + +struct gen_loader_opts { + size_t sz; /* size of this struct, for forward/backward compatiblity */ + const char *data; + const char *insns; + __u32 data_sz; + __u32 insns_sz; +}; + +#define gen_loader_opts__last_field insns_sz +LIBBPF_API int bpf_object__gen_loader(struct bpf_object *obj, + struct gen_loader_opts *opts); + +enum libbpf_tristate { + TRI_NO = 0, + TRI_YES = 1, + TRI_MODULE = 2, +}; + +struct bpf_linker_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; +}; +#define bpf_linker_opts__last_field sz + +struct bpf_linker_file_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; +}; +#define bpf_linker_file_opts__last_field sz + +struct bpf_linker; + +LIBBPF_API struct bpf_linker *bpf_linker__new(const char *filename, struct bpf_linker_opts *opts); +LIBBPF_API int bpf_linker__add_file(struct bpf_linker *linker, + const char *filename, + const struct bpf_linker_file_opts *opts); +LIBBPF_API int bpf_linker__finalize(struct bpf_linker *linker); +LIBBPF_API void bpf_linker__free(struct bpf_linker *linker); + +/* + * Custom handling of BPF program's SEC() definitions + */ + +struct bpf_prog_load_opts; /* defined in bpf.h */ + +/* Called during bpf_object__open() for each recognized BPF program. Callback + * can use various bpf_program__set_*() setters to adjust whatever properties + * are necessary. + */ +typedef int (*libbpf_prog_setup_fn_t)(struct bpf_program *prog, long cookie); + +/* Called right before libbpf performs bpf_prog_load() to load BPF program + * into the kernel. Callback can adjust opts as necessary. + */ +typedef int (*libbpf_prog_prepare_load_fn_t)(struct bpf_program *prog, + struct bpf_prog_load_opts *opts, long cookie); + +/* Called during skeleton attach or through bpf_program__attach(). If + * auto-attach is not supported, callback should return 0 and set link to + * NULL (it's not considered an error during skeleton attach, but it will be + * an error for bpf_program__attach() calls). On error, error should be + * returned directly and link set to NULL. On success, return 0 and set link + * to a valid struct bpf_link. + */ +typedef int (*libbpf_prog_attach_fn_t)(const struct bpf_program *prog, long cookie, + struct bpf_link **link); + +struct libbpf_prog_handler_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* User-provided value that is passed to prog_setup_fn, + * prog_prepare_load_fn, and prog_attach_fn callbacks. Allows user to + * register one set of callbacks for multiple SEC() definitions and + * still be able to distinguish them, if necessary. For example, + * libbpf itself is using this to pass necessary flags (e.g., + * sleepable flag) to a common internal SEC() handler. + */ + long cookie; + /* BPF program initialization callback (see libbpf_prog_setup_fn_t). + * Callback is optional, pass NULL if it's not necessary. + */ + libbpf_prog_setup_fn_t prog_setup_fn; + /* BPF program loading callback (see libbpf_prog_prepare_load_fn_t). + * Callback is optional, pass NULL if it's not necessary. + */ + libbpf_prog_prepare_load_fn_t prog_prepare_load_fn; + /* BPF program attach callback (see libbpf_prog_attach_fn_t). + * Callback is optional, pass NULL if it's not necessary. + */ + libbpf_prog_attach_fn_t prog_attach_fn; +}; +#define libbpf_prog_handler_opts__last_field prog_attach_fn + +/** + * @brief **libbpf_register_prog_handler()** registers a custom BPF program + * SEC() handler. + * @param sec section prefix for which custom handler is registered + * @param prog_type BPF program type associated with specified section + * @param exp_attach_type Expected BPF attach type associated with specified section + * @param opts optional cookie, callbacks, and other extra options + * @return Non-negative handler ID is returned on success. This handler ID has + * to be passed to *libbpf_unregister_prog_handler()* to unregister such + * custom handler. Negative error code is returned on error. + * + * *sec* defines which SEC() definitions are handled by this custom handler + * registration. *sec* can have few different forms: + * - if *sec* is just a plain string (e.g., "abc"), it will match only + * SEC("abc"). If BPF program specifies SEC("abc/whatever") it will result + * in an error; + * - if *sec* is of the form "abc/", proper SEC() form is + * SEC("abc/something"), where acceptable "something" should be checked by + * *prog_init_fn* callback, if there are additional restrictions; + * - if *sec* is of the form "abc+", it will successfully match both + * SEC("abc") and SEC("abc/whatever") forms; + * - if *sec* is NULL, custom handler is registered for any BPF program that + * doesn't match any of the registered (custom or libbpf's own) SEC() + * handlers. There could be only one such generic custom handler registered + * at any given time. + * + * All custom handlers (except the one with *sec* == NULL) are processed + * before libbpf's own SEC() handlers. It is allowed to "override" libbpf's + * SEC() handlers by registering custom ones for the same section prefix + * (i.e., it's possible to have custom SEC("perf_event/LLC-load-misses") + * handler). + * + * Note, like much of global libbpf APIs (e.g., libbpf_set_print(), + * libbpf_set_strict_mode(), etc)) these APIs are not thread-safe. User needs + * to ensure synchronization if there is a risk of running this API from + * multiple threads simultaneously. + */ +LIBBPF_API int libbpf_register_prog_handler(const char *sec, + enum bpf_prog_type prog_type, + enum bpf_attach_type exp_attach_type, + const struct libbpf_prog_handler_opts *opts); +/** + * @brief *libbpf_unregister_prog_handler()* unregisters previously registered + * custom BPF program SEC() handler. + * @param handler_id handler ID returned by *libbpf_register_prog_handler()* + * after successful registration + * @return 0 on success, negative error code if handler isn't found + * + * Note, like much of global libbpf APIs (e.g., libbpf_set_print(), + * libbpf_set_strict_mode(), etc)) these APIs are not thread-safe. User needs + * to ensure synchronization if there is a risk of running this API from + * multiple threads simultaneously. + */ +LIBBPF_API int libbpf_unregister_prog_handler(int handler_id); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_LIBBPF_H */ diff --git a/bpftool/libbpf/src/libbpf.map b/bpftool/libbpf/src/libbpf.map new file mode 100644 index 0000000..50dde1f --- /dev/null +++ b/bpftool/libbpf/src/libbpf.map @@ -0,0 +1,392 @@ +LIBBPF_0.0.1 { + global: + bpf_btf_get_fd_by_id; + bpf_map__btf_key_type_id; + bpf_map__btf_value_type_id; + bpf_map__fd; + bpf_map__name; + bpf_map__pin; + bpf_map__reuse_fd; + bpf_map__set_ifindex; + bpf_map__set_inner_map_fd; + bpf_map__unpin; + bpf_map_delete_elem; + bpf_map_get_fd_by_id; + bpf_map_get_next_id; + bpf_map_get_next_key; + bpf_map_lookup_and_delete_elem; + bpf_map_lookup_elem; + bpf_map_update_elem; + bpf_obj_get; + bpf_obj_get_info_by_fd; + bpf_obj_pin; + bpf_object__btf_fd; + bpf_object__close; + bpf_object__find_map_by_name; + bpf_object__kversion; + bpf_object__load; + bpf_object__name; + bpf_object__open; + bpf_object__pin; + bpf_object__pin_maps; + bpf_object__pin_programs; + bpf_object__unpin_maps; + bpf_object__unpin_programs; + bpf_prog_attach; + bpf_prog_detach; + bpf_prog_detach2; + bpf_prog_get_fd_by_id; + bpf_prog_get_next_id; + bpf_prog_query; + bpf_program__fd; + bpf_program__pin; + bpf_program__set_expected_attach_type; + bpf_program__set_ifindex; + bpf_program__set_type; + bpf_program__unload; + bpf_program__unpin; + bpf_prog_linfo__free; + bpf_prog_linfo__new; + bpf_prog_linfo__lfind_addr_func; + bpf_prog_linfo__lfind; + bpf_raw_tracepoint_open; + bpf_task_fd_query; + btf__fd; + btf__find_by_name; + btf__free; + btf__name_by_offset; + btf__new; + btf__resolve_size; + btf__resolve_type; + btf__type_by_id; + libbpf_attach_type_by_name; + libbpf_get_error; + libbpf_prog_type_by_name; + libbpf_set_print; + libbpf_strerror; + local: + *; +}; + +LIBBPF_0.0.2 { + global: + bpf_map_lookup_elem_flags; + bpf_object__btf; + bpf_object__find_map_fd_by_name; + btf__get_raw_data; + btf_ext__free; + btf_ext__get_raw_data; + btf_ext__new; +} LIBBPF_0.0.1; + +LIBBPF_0.0.3 { + global: + bpf_map__is_internal; + bpf_map_freeze; +} LIBBPF_0.0.2; + +LIBBPF_0.0.4 { + global: + bpf_link__destroy; + bpf_program__attach_kprobe; + bpf_program__attach_perf_event; + bpf_program__attach_raw_tracepoint; + bpf_program__attach_tracepoint; + bpf_program__attach_uprobe; + btf_dump__dump_type; + btf_dump__free; + btf__parse_elf; + libbpf_num_possible_cpus; + perf_buffer__free; + perf_buffer__poll; +} LIBBPF_0.0.3; + +LIBBPF_0.0.5 { + global: + bpf_btf_get_next_id; +} LIBBPF_0.0.4; + +LIBBPF_0.0.6 { + global: + bpf_map__get_pin_path; + bpf_map__is_pinned; + bpf_map__set_pin_path; + bpf_object__open_file; + bpf_object__open_mem; + bpf_program__attach_trace; + bpf_program__get_expected_attach_type; + bpf_program__get_type; + btf__find_by_name_kind; + libbpf_find_vmlinux_btf_id; +} LIBBPF_0.0.5; + +LIBBPF_0.0.7 { + global: + btf_dump__emit_type_decl; + bpf_link__disconnect; + bpf_map__attach_struct_ops; + bpf_map_delete_batch; + bpf_map_lookup_and_delete_batch; + bpf_map_lookup_batch; + bpf_map_update_batch; + bpf_object__find_program_by_name; + bpf_object__attach_skeleton; + bpf_object__destroy_skeleton; + bpf_object__detach_skeleton; + bpf_object__load_skeleton; + bpf_object__open_skeleton; + bpf_program__attach; + bpf_program__name; + btf__align_of; + libbpf_find_kernel_btf; +} LIBBPF_0.0.6; + +LIBBPF_0.0.8 { + global: + bpf_link__fd; + bpf_link__open; + bpf_link__pin; + bpf_link__pin_path; + bpf_link__unpin; + bpf_link__update_program; + bpf_link_create; + bpf_link_update; + bpf_map__set_initial_value; + bpf_prog_attach_opts; + bpf_program__attach_cgroup; + bpf_program__attach_lsm; + bpf_program__set_attach_target; +} LIBBPF_0.0.7; + +LIBBPF_0.0.9 { + global: + bpf_enable_stats; + bpf_iter_create; + bpf_link_get_fd_by_id; + bpf_link_get_next_id; + bpf_program__attach_iter; + bpf_program__attach_netns; + perf_buffer__consume; + ring_buffer__add; + ring_buffer__consume; + ring_buffer__free; + ring_buffer__new; + ring_buffer__poll; +} LIBBPF_0.0.8; + +LIBBPF_0.1.0 { + global: + bpf_link__detach; + bpf_link_detach; + bpf_map__ifindex; + bpf_map__key_size; + bpf_map__map_flags; + bpf_map__max_entries; + bpf_map__numa_node; + bpf_map__set_key_size; + bpf_map__set_map_flags; + bpf_map__set_max_entries; + bpf_map__set_numa_node; + bpf_map__set_type; + bpf_map__set_value_size; + bpf_map__type; + bpf_map__value_size; + bpf_program__attach_xdp; + bpf_program__autoload; + bpf_program__set_autoload; + btf__parse; + btf__parse_raw; + btf__pointer_size; + btf__set_fd; + btf__set_pointer_size; +} LIBBPF_0.0.9; + +LIBBPF_0.2.0 { + global: + bpf_prog_bind_map; + bpf_prog_test_run_opts; + bpf_program__attach_freplace; + bpf_program__section_name; + btf__add_array; + btf__add_const; + btf__add_enum; + btf__add_enum_value; + btf__add_datasec; + btf__add_datasec_var_info; + btf__add_field; + btf__add_func; + btf__add_func_param; + btf__add_func_proto; + btf__add_fwd; + btf__add_int; + btf__add_ptr; + btf__add_restrict; + btf__add_str; + btf__add_struct; + btf__add_typedef; + btf__add_union; + btf__add_var; + btf__add_volatile; + btf__endianness; + btf__find_str; + btf__new_empty; + btf__set_endianness; + btf__str_by_offset; + perf_buffer__buffer_cnt; + perf_buffer__buffer_fd; + perf_buffer__epoll_fd; + perf_buffer__consume_buffer; +} LIBBPF_0.1.0; + +LIBBPF_0.3.0 { + global: + btf__base_btf; + btf__parse_elf_split; + btf__parse_raw_split; + btf__parse_split; + btf__new_empty_split; + btf__new_split; + ring_buffer__epoll_fd; +} LIBBPF_0.2.0; + +LIBBPF_0.4.0 { + global: + btf__add_float; + btf__add_type; + bpf_linker__add_file; + bpf_linker__finalize; + bpf_linker__free; + bpf_linker__new; + bpf_map__inner_map; + bpf_object__set_kversion; + bpf_tc_attach; + bpf_tc_detach; + bpf_tc_hook_create; + bpf_tc_hook_destroy; + bpf_tc_query; +} LIBBPF_0.3.0; + +LIBBPF_0.5.0 { + global: + bpf_map__initial_value; + bpf_map__pin_path; + bpf_map_lookup_and_delete_elem_flags; + bpf_program__attach_kprobe_opts; + bpf_program__attach_perf_event_opts; + bpf_program__attach_tracepoint_opts; + bpf_program__attach_uprobe_opts; + bpf_object__gen_loader; + btf__load_from_kernel_by_id; + btf__load_from_kernel_by_id_split; + btf__load_into_kernel; + btf__load_module_btf; + btf__load_vmlinux_btf; + btf_dump__dump_type_data; + libbpf_set_strict_mode; +} LIBBPF_0.4.0; + +LIBBPF_0.6.0 { + global: + bpf_map__map_extra; + bpf_map__set_map_extra; + bpf_map_create; + bpf_object__next_map; + bpf_object__next_program; + bpf_object__prev_map; + bpf_object__prev_program; + bpf_prog_load; + bpf_program__flags; + bpf_program__insn_cnt; + bpf_program__insns; + bpf_program__set_flags; + btf__add_btf; + btf__add_decl_tag; + btf__add_type_tag; + btf__dedup; + btf__raw_data; + btf__type_cnt; + btf_dump__new; + libbpf_major_version; + libbpf_minor_version; + libbpf_version_string; + perf_buffer__new; + perf_buffer__new_raw; +} LIBBPF_0.5.0; + +LIBBPF_0.7.0 { + global: + bpf_btf_load; + bpf_program__expected_attach_type; + bpf_program__log_buf; + bpf_program__log_level; + bpf_program__set_log_buf; + bpf_program__set_log_level; + bpf_program__type; + bpf_xdp_attach; + bpf_xdp_detach; + bpf_xdp_query; + bpf_xdp_query_id; + btf_ext__raw_data; + libbpf_probe_bpf_helper; + libbpf_probe_bpf_map_type; + libbpf_probe_bpf_prog_type; + libbpf_set_memlock_rlim; +} LIBBPF_0.6.0; + +LIBBPF_0.8.0 { + global: + bpf_map__autocreate; + bpf_map__get_next_key; + bpf_map__delete_elem; + bpf_map__lookup_and_delete_elem; + bpf_map__lookup_elem; + bpf_map__set_autocreate; + bpf_map__update_elem; + bpf_map_delete_elem_flags; + bpf_object__destroy_subskeleton; + bpf_object__open_subskeleton; + bpf_program__attach_kprobe_multi_opts; + bpf_program__attach_trace_opts; + bpf_program__attach_usdt; + bpf_program__set_insns; + libbpf_register_prog_handler; + libbpf_unregister_prog_handler; +} LIBBPF_0.7.0; + +LIBBPF_1.0.0 { + global: + bpf_obj_get_opts; + bpf_prog_query_opts; + bpf_program__attach_ksyscall; + bpf_program__autoattach; + bpf_program__set_autoattach; + btf__add_enum64; + btf__add_enum64_value; + libbpf_bpf_attach_type_str; + libbpf_bpf_link_type_str; + libbpf_bpf_map_type_str; + libbpf_bpf_prog_type_str; + perf_buffer__buffer; +} LIBBPF_0.8.0; + +LIBBPF_1.1.0 { + global: + bpf_btf_get_fd_by_id_opts; + bpf_link_get_fd_by_id_opts; + bpf_map_get_fd_by_id_opts; + bpf_prog_get_fd_by_id_opts; + user_ring_buffer__discard; + user_ring_buffer__free; + user_ring_buffer__new; + user_ring_buffer__reserve; + user_ring_buffer__reserve_blocking; + user_ring_buffer__submit; +} LIBBPF_1.0.0; + +LIBBPF_1.2.0 { + global: + bpf_btf_get_info_by_fd; + bpf_link_get_info_by_fd; + bpf_map_get_info_by_fd; + bpf_prog_get_info_by_fd; +} LIBBPF_1.1.0; diff --git a/bpftool/libbpf/src/libbpf.pc.template b/bpftool/libbpf/src/libbpf.pc.template new file mode 100644 index 0000000..b45ed53 --- /dev/null +++ b/bpftool/libbpf/src/libbpf.pc.template @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +prefix=@PREFIX@ +libdir=@LIBDIR@ +includedir=${prefix}/include + +Name: libbpf +Description: BPF library +Version: @VERSION@ +Libs: -L${libdir} -lbpf +Requires.private: libelf zlib +Cflags: -I${includedir} diff --git a/bpftool/libbpf/src/libbpf_common.h b/bpftool/libbpf/src/libbpf_common.h new file mode 100644 index 0000000..9a7937f --- /dev/null +++ b/bpftool/libbpf/src/libbpf_common.h @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Common user-facing libbpf helpers. + * + * Copyright (c) 2019 Facebook + */ + +#ifndef __LIBBPF_LIBBPF_COMMON_H +#define __LIBBPF_LIBBPF_COMMON_H + +#include +#include "libbpf_version.h" + +#ifndef LIBBPF_API +#define LIBBPF_API __attribute__((visibility("default"))) +#endif + +#define LIBBPF_DEPRECATED(msg) __attribute__((deprecated(msg))) + +/* Mark a symbol as deprecated when libbpf version is >= {major}.{minor} */ +#define LIBBPF_DEPRECATED_SINCE(major, minor, msg) \ + __LIBBPF_MARK_DEPRECATED_ ## major ## _ ## minor \ + (LIBBPF_DEPRECATED("libbpf v" # major "." # minor "+: " msg)) + +#define __LIBBPF_CURRENT_VERSION_GEQ(major, minor) \ + (LIBBPF_MAJOR_VERSION > (major) || \ + (LIBBPF_MAJOR_VERSION == (major) && LIBBPF_MINOR_VERSION >= (minor))) + +/* Add checks for other versions below when planning deprecation of API symbols + * with the LIBBPF_DEPRECATED_SINCE macro. + */ +#if __LIBBPF_CURRENT_VERSION_GEQ(1, 0) +#define __LIBBPF_MARK_DEPRECATED_1_0(X) X +#else +#define __LIBBPF_MARK_DEPRECATED_1_0(X) +#endif + +/* This set of internal macros allows to do "function overloading" based on + * number of arguments provided by used in backwards-compatible way during the + * transition to libbpf 1.0 + * It's ugly but necessary evil that will be cleaned up when we get to 1.0. + * See bpf_prog_load() overload for example. + */ +#define ___libbpf_cat(A, B) A ## B +#define ___libbpf_select(NAME, NUM) ___libbpf_cat(NAME, NUM) +#define ___libbpf_nth(_1, _2, _3, _4, _5, _6, N, ...) N +#define ___libbpf_cnt(...) ___libbpf_nth(__VA_ARGS__, 6, 5, 4, 3, 2, 1) +#define ___libbpf_overload(NAME, ...) ___libbpf_select(NAME, ___libbpf_cnt(__VA_ARGS__))(__VA_ARGS__) + +/* Helper macro to declare and initialize libbpf options struct + * + * This dance with uninitialized declaration, followed by memset to zero, + * followed by assignment using compound literal syntax is done to preserve + * ability to use a nice struct field initialization syntax and **hopefully** + * have all the padding bytes initialized to zero. It's not guaranteed though, + * when copying literal, that compiler won't copy garbage in literal's padding + * bytes, but that's the best way I've found and it seems to work in practice. + * + * Macro declares opts struct of given type and name, zero-initializes, + * including any extra padding, it with memset() and then assigns initial + * values provided by users in struct initializer-syntax as varargs. + */ +#define LIBBPF_OPTS(TYPE, NAME, ...) \ + struct TYPE NAME = ({ \ + memset(&NAME, 0, sizeof(struct TYPE)); \ + (struct TYPE) { \ + .sz = sizeof(struct TYPE), \ + __VA_ARGS__ \ + }; \ + }) + +#endif /* __LIBBPF_LIBBPF_COMMON_H */ diff --git a/bpftool/libbpf/src/libbpf_errno.c b/bpftool/libbpf/src/libbpf_errno.c new file mode 100644 index 0000000..6b18017 --- /dev/null +++ b/bpftool/libbpf/src/libbpf_errno.c @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + * Copyright (C) 2017 Nicira, Inc. + */ + +#undef _GNU_SOURCE +#include +#include + +#include "libbpf.h" +#include "libbpf_internal.h" + +/* make sure libbpf doesn't use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +#define ERRNO_OFFSET(e) ((e) - __LIBBPF_ERRNO__START) +#define ERRCODE_OFFSET(c) ERRNO_OFFSET(LIBBPF_ERRNO__##c) +#define NR_ERRNO (__LIBBPF_ERRNO__END - __LIBBPF_ERRNO__START) + +static const char *libbpf_strerror_table[NR_ERRNO] = { + [ERRCODE_OFFSET(LIBELF)] = "Something wrong in libelf", + [ERRCODE_OFFSET(FORMAT)] = "BPF object format invalid", + [ERRCODE_OFFSET(KVERSION)] = "'version' section incorrect or lost", + [ERRCODE_OFFSET(ENDIAN)] = "Endian mismatch", + [ERRCODE_OFFSET(INTERNAL)] = "Internal error in libbpf", + [ERRCODE_OFFSET(RELOC)] = "Relocation failed", + [ERRCODE_OFFSET(VERIFY)] = "Kernel verifier blocks program loading", + [ERRCODE_OFFSET(PROG2BIG)] = "Program too big", + [ERRCODE_OFFSET(KVER)] = "Incorrect kernel version", + [ERRCODE_OFFSET(PROGTYPE)] = "Kernel doesn't support this program type", + [ERRCODE_OFFSET(WRNGPID)] = "Wrong pid in netlink message", + [ERRCODE_OFFSET(INVSEQ)] = "Invalid netlink sequence", + [ERRCODE_OFFSET(NLPARSE)] = "Incorrect netlink message parsing", +}; + +int libbpf_strerror(int err, char *buf, size_t size) +{ + int ret; + + if (!buf || !size) + return libbpf_err(-EINVAL); + + err = err > 0 ? err : -err; + + if (err < __LIBBPF_ERRNO__START) { + ret = strerror_r(err, buf, size); + buf[size - 1] = '\0'; + return libbpf_err_errno(ret); + } + + if (err < __LIBBPF_ERRNO__END) { + const char *msg; + + msg = libbpf_strerror_table[ERRNO_OFFSET(err)]; + ret = snprintf(buf, size, "%s", msg); + buf[size - 1] = '\0'; + /* The length of the buf and msg is positive. + * A negative number may be returned only when the + * size exceeds INT_MAX. Not likely to appear. + */ + if (ret >= size) + return libbpf_err(-ERANGE); + return 0; + } + + ret = snprintf(buf, size, "Unknown libbpf error %d", err); + buf[size - 1] = '\0'; + if (ret >= size) + return libbpf_err(-ERANGE); + return libbpf_err(-ENOENT); +} diff --git a/bpftool/libbpf/src/libbpf_internal.h b/bpftool/libbpf/src/libbpf_internal.h new file mode 100644 index 0000000..fbaf683 --- /dev/null +++ b/bpftool/libbpf/src/libbpf_internal.h @@ -0,0 +1,580 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Internal libbpf helpers. + * + * Copyright (c) 2019 Facebook + */ + +#ifndef __LIBBPF_LIBBPF_INTERNAL_H +#define __LIBBPF_LIBBPF_INTERNAL_H + +#include +#include +#include +#include +#include +#include +#include "relo_core.h" + +/* make sure libbpf doesn't use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +/* prevent accidental re-addition of reallocarray()/strlcpy() */ +#pragma GCC poison reallocarray strlcpy + +#include "libbpf.h" +#include "btf.h" + +#ifndef EM_BPF +#define EM_BPF 247 +#endif + +#ifndef R_BPF_64_64 +#define R_BPF_64_64 1 +#endif +#ifndef R_BPF_64_ABS64 +#define R_BPF_64_ABS64 2 +#endif +#ifndef R_BPF_64_ABS32 +#define R_BPF_64_ABS32 3 +#endif +#ifndef R_BPF_64_32 +#define R_BPF_64_32 10 +#endif + +#ifndef SHT_LLVM_ADDRSIG +#define SHT_LLVM_ADDRSIG 0x6FFF4C03 +#endif + +/* if libelf is old and doesn't support mmap(), fall back to read() */ +#ifndef ELF_C_READ_MMAP +#define ELF_C_READ_MMAP ELF_C_READ +#endif + +/* Older libelf all end up in this expression, for both 32 and 64 bit */ +#ifndef ELF64_ST_VISIBILITY +#define ELF64_ST_VISIBILITY(o) ((o) & 0x03) +#endif + +#define BTF_INFO_ENC(kind, kind_flag, vlen) \ + ((!!(kind_flag) << 31) | ((kind) << 24) | ((vlen) & BTF_MAX_VLEN)) +#define BTF_TYPE_ENC(name, info, size_or_type) (name), (info), (size_or_type) +#define BTF_INT_ENC(encoding, bits_offset, nr_bits) \ + ((encoding) << 24 | (bits_offset) << 16 | (nr_bits)) +#define BTF_TYPE_INT_ENC(name, encoding, bits_offset, bits, sz) \ + BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_INT, 0, 0), sz), \ + BTF_INT_ENC(encoding, bits_offset, bits) +#define BTF_MEMBER_ENC(name, type, bits_offset) (name), (type), (bits_offset) +#define BTF_PARAM_ENC(name, type) (name), (type) +#define BTF_VAR_SECINFO_ENC(type, offset, size) (type), (offset), (size) +#define BTF_TYPE_FLOAT_ENC(name, sz) \ + BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_FLOAT, 0, 0), sz) +#define BTF_TYPE_DECL_TAG_ENC(value, type, component_idx) \ + BTF_TYPE_ENC(value, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 0), type), (component_idx) +#define BTF_TYPE_TYPE_TAG_ENC(value, type) \ + BTF_TYPE_ENC(value, BTF_INFO_ENC(BTF_KIND_TYPE_TAG, 0, 0), type) + +#ifndef likely +#define likely(x) __builtin_expect(!!(x), 1) +#endif +#ifndef unlikely +#define unlikely(x) __builtin_expect(!!(x), 0) +#endif +#ifndef min +# define min(x, y) ((x) < (y) ? (x) : (y)) +#endif +#ifndef max +# define max(x, y) ((x) < (y) ? (y) : (x)) +#endif +#ifndef offsetofend +# define offsetofend(TYPE, FIELD) \ + (offsetof(TYPE, FIELD) + sizeof(((TYPE *)0)->FIELD)) +#endif +#ifndef __alias +#define __alias(symbol) __attribute__((alias(#symbol))) +#endif + +/* Check whether a string `str` has prefix `pfx`, regardless if `pfx` is + * a string literal known at compilation time or char * pointer known only at + * runtime. + */ +#define str_has_pfx(str, pfx) \ + (strncmp(str, pfx, __builtin_constant_p(pfx) ? sizeof(pfx) - 1 : strlen(pfx)) == 0) + +/* suffix check */ +static inline bool str_has_sfx(const char *str, const char *sfx) +{ + size_t str_len = strlen(str); + size_t sfx_len = strlen(sfx); + + if (sfx_len > str_len) + return false; + return strcmp(str + str_len - sfx_len, sfx) == 0; +} + +/* Symbol versioning is different between static and shared library. + * Properly versioned symbols are needed for shared library, but + * only the symbol of the new version is needed for static library. + * Starting with GNU C 10, use symver attribute instead of .symver assembler + * directive, which works better with GCC LTO builds. + */ +#if defined(SHARED) && defined(__GNUC__) && __GNUC__ >= 10 + +#define DEFAULT_VERSION(internal_name, api_name, version) \ + __attribute__((symver(#api_name "@@" #version))) +#define COMPAT_VERSION(internal_name, api_name, version) \ + __attribute__((symver(#api_name "@" #version))) + +#elif defined(SHARED) + +#define COMPAT_VERSION(internal_name, api_name, version) \ + asm(".symver " #internal_name "," #api_name "@" #version); +#define DEFAULT_VERSION(internal_name, api_name, version) \ + asm(".symver " #internal_name "," #api_name "@@" #version); + +#else /* !SHARED */ + +#define COMPAT_VERSION(internal_name, api_name, version) +#define DEFAULT_VERSION(internal_name, api_name, version) \ + extern typeof(internal_name) api_name \ + __attribute__((alias(#internal_name))); + +#endif + +extern void libbpf_print(enum libbpf_print_level level, + const char *format, ...) + __attribute__((format(printf, 2, 3))); + +#define __pr(level, fmt, ...) \ +do { \ + libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \ +} while (0) + +#define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__) +#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__) +#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__) + +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +struct bpf_link { + int (*detach)(struct bpf_link *link); + void (*dealloc)(struct bpf_link *link); + char *pin_path; /* NULL, if not pinned */ + int fd; /* hook FD, -1 if not applicable */ + bool disconnected; +}; + +/* + * Re-implement glibc's reallocarray() for libbpf internal-only use. + * reallocarray(), unfortunately, is not available in all versions of glibc, + * so requires extra feature detection and using reallocarray() stub from + * and COMPAT_NEED_REALLOCARRAY. All this complicates + * build of libbpf unnecessarily and is just a maintenance burden. Instead, + * it's trivial to implement libbpf-specific internal version and use it + * throughout libbpf. + */ +static inline void *libbpf_reallocarray(void *ptr, size_t nmemb, size_t size) +{ + size_t total; + +#if __has_builtin(__builtin_mul_overflow) + if (unlikely(__builtin_mul_overflow(nmemb, size, &total))) + return NULL; +#else + if (size == 0 || nmemb > ULONG_MAX / size) + return NULL; + total = nmemb * size; +#endif + return realloc(ptr, total); +} + +/* Copy up to sz - 1 bytes from zero-terminated src string and ensure that dst + * is zero-terminated string no matter what (unless sz == 0, in which case + * it's a no-op). It's conceptually close to FreeBSD's strlcpy(), but differs + * in what is returned. Given this is internal helper, it's trivial to extend + * this, when necessary. Use this instead of strncpy inside libbpf source code. + */ +static inline void libbpf_strlcpy(char *dst, const char *src, size_t sz) +{ + size_t i; + + if (sz == 0) + return; + + sz--; + for (i = 0; i < sz && src[i]; i++) + dst[i] = src[i]; + dst[i] = '\0'; +} + +__u32 get_kernel_version(void); + +struct btf; +struct btf_type; + +struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id); +const char *btf_kind_str(const struct btf_type *t); +const struct btf_type *skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id); + +static inline enum btf_func_linkage btf_func_linkage(const struct btf_type *t) +{ + return (enum btf_func_linkage)(int)btf_vlen(t); +} + +static inline __u32 btf_type_info(int kind, int vlen, int kflag) +{ + return (kflag << 31) | (kind << 24) | vlen; +} + +enum map_def_parts { + MAP_DEF_MAP_TYPE = 0x001, + MAP_DEF_KEY_TYPE = 0x002, + MAP_DEF_KEY_SIZE = 0x004, + MAP_DEF_VALUE_TYPE = 0x008, + MAP_DEF_VALUE_SIZE = 0x010, + MAP_DEF_MAX_ENTRIES = 0x020, + MAP_DEF_MAP_FLAGS = 0x040, + MAP_DEF_NUMA_NODE = 0x080, + MAP_DEF_PINNING = 0x100, + MAP_DEF_INNER_MAP = 0x200, + MAP_DEF_MAP_EXTRA = 0x400, + + MAP_DEF_ALL = 0x7ff, /* combination of all above */ +}; + +struct btf_map_def { + enum map_def_parts parts; + __u32 map_type; + __u32 key_type_id; + __u32 key_size; + __u32 value_type_id; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + __u32 numa_node; + __u32 pinning; + __u64 map_extra; +}; + +int parse_btf_map_def(const char *map_name, struct btf *btf, + const struct btf_type *def_t, bool strict, + struct btf_map_def *map_def, struct btf_map_def *inner_def); + +void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz, + size_t cur_cnt, size_t max_cnt, size_t add_cnt); +int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt); + +static inline bool libbpf_is_mem_zeroed(const char *p, ssize_t len) +{ + while (len > 0) { + if (*p) + return false; + p++; + len--; + } + return true; +} + +static inline bool libbpf_validate_opts(const char *opts, + size_t opts_sz, size_t user_sz, + const char *type_name) +{ + if (user_sz < sizeof(size_t)) { + pr_warn("%s size (%zu) is too small\n", type_name, user_sz); + return false; + } + if (!libbpf_is_mem_zeroed(opts + opts_sz, (ssize_t)user_sz - opts_sz)) { + pr_warn("%s has non-zero extra bytes\n", type_name); + return false; + } + return true; +} + +#define OPTS_VALID(opts, type) \ + (!(opts) || libbpf_validate_opts((const char *)opts, \ + offsetofend(struct type, \ + type##__last_field), \ + (opts)->sz, #type)) +#define OPTS_HAS(opts, field) \ + ((opts) && opts->sz >= offsetofend(typeof(*(opts)), field)) +#define OPTS_GET(opts, field, fallback_value) \ + (OPTS_HAS(opts, field) ? (opts)->field : fallback_value) +#define OPTS_SET(opts, field, value) \ + do { \ + if (OPTS_HAS(opts, field)) \ + (opts)->field = value; \ + } while (0) + +#define OPTS_ZEROED(opts, last_nonzero_field) \ +({ \ + ssize_t __off = offsetofend(typeof(*(opts)), last_nonzero_field); \ + !(opts) || libbpf_is_mem_zeroed((const void *)opts + __off, \ + (opts)->sz - __off); \ +}) + +enum kern_feature_id { + /* v4.14: kernel support for program & map names. */ + FEAT_PROG_NAME, + /* v5.2: kernel support for global data sections. */ + FEAT_GLOBAL_DATA, + /* BTF support */ + FEAT_BTF, + /* BTF_KIND_FUNC and BTF_KIND_FUNC_PROTO support */ + FEAT_BTF_FUNC, + /* BTF_KIND_VAR and BTF_KIND_DATASEC support */ + FEAT_BTF_DATASEC, + /* BTF_FUNC_GLOBAL is supported */ + FEAT_BTF_GLOBAL_FUNC, + /* BPF_F_MMAPABLE is supported for arrays */ + FEAT_ARRAY_MMAP, + /* kernel support for expected_attach_type in BPF_PROG_LOAD */ + FEAT_EXP_ATTACH_TYPE, + /* bpf_probe_read_{kernel,user}[_str] helpers */ + FEAT_PROBE_READ_KERN, + /* BPF_PROG_BIND_MAP is supported */ + FEAT_PROG_BIND_MAP, + /* Kernel support for module BTFs */ + FEAT_MODULE_BTF, + /* BTF_KIND_FLOAT support */ + FEAT_BTF_FLOAT, + /* BPF perf link support */ + FEAT_PERF_LINK, + /* BTF_KIND_DECL_TAG support */ + FEAT_BTF_DECL_TAG, + /* BTF_KIND_TYPE_TAG support */ + FEAT_BTF_TYPE_TAG, + /* memcg-based accounting for BPF maps and progs */ + FEAT_MEMCG_ACCOUNT, + /* BPF cookie (bpf_get_attach_cookie() BPF helper) support */ + FEAT_BPF_COOKIE, + /* BTF_KIND_ENUM64 support and BTF_KIND_ENUM kflag support */ + FEAT_BTF_ENUM64, + /* Kernel uses syscall wrapper (CONFIG_ARCH_HAS_SYSCALL_WRAPPER) */ + FEAT_SYSCALL_WRAPPER, + __FEAT_CNT, +}; + +int probe_memcg_account(void); +bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id); +int bump_rlimit_memlock(void); + +int parse_cpu_mask_str(const char *s, bool **mask, int *mask_sz); +int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz); +int libbpf__load_raw_btf(const char *raw_types, size_t types_len, + const char *str_sec, size_t str_len); +int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level); + +struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf); +void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type, + const char **prefix, int *kind); + +struct btf_ext_info { + /* + * info points to the individual info section (e.g. func_info and + * line_info) from the .BTF.ext. It does not include the __u32 rec_size. + */ + void *info; + __u32 rec_size; + __u32 len; + /* optional (maintained internally by libbpf) mapping between .BTF.ext + * section and corresponding ELF section. This is used to join + * information like CO-RE relocation records with corresponding BPF + * programs defined in ELF sections + */ + __u32 *sec_idxs; + int sec_cnt; +}; + +#define for_each_btf_ext_sec(seg, sec) \ + for (sec = (seg)->info; \ + (void *)sec < (seg)->info + (seg)->len; \ + sec = (void *)sec + sizeof(struct btf_ext_info_sec) + \ + (seg)->rec_size * sec->num_info) + +#define for_each_btf_ext_rec(seg, sec, i, rec) \ + for (i = 0, rec = (void *)&(sec)->data; \ + i < (sec)->num_info; \ + i++, rec = (void *)rec + (seg)->rec_size) + +/* + * The .BTF.ext ELF section layout defined as + * struct btf_ext_header + * func_info subsection + * + * The func_info subsection layout: + * record size for struct bpf_func_info in the func_info subsection + * struct btf_sec_func_info for section #1 + * a list of bpf_func_info records for section #1 + * where struct bpf_func_info mimics one in include/uapi/linux/bpf.h + * but may not be identical + * struct btf_sec_func_info for section #2 + * a list of bpf_func_info records for section #2 + * ...... + * + * Note that the bpf_func_info record size in .BTF.ext may not + * be the same as the one defined in include/uapi/linux/bpf.h. + * The loader should ensure that record_size meets minimum + * requirement and pass the record as is to the kernel. The + * kernel will handle the func_info properly based on its contents. + */ +struct btf_ext_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + + /* All offsets are in bytes relative to the end of this header */ + __u32 func_info_off; + __u32 func_info_len; + __u32 line_info_off; + __u32 line_info_len; + + /* optional part of .BTF.ext header */ + __u32 core_relo_off; + __u32 core_relo_len; +}; + +struct btf_ext { + union { + struct btf_ext_header *hdr; + void *data; + }; + struct btf_ext_info func_info; + struct btf_ext_info line_info; + struct btf_ext_info core_relo_info; + __u32 data_size; +}; + +struct btf_ext_info_sec { + __u32 sec_name_off; + __u32 num_info; + /* Followed by num_info * record_size number of bytes */ + __u8 data[]; +}; + +/* The minimum bpf_func_info checked by the loader */ +struct bpf_func_info_min { + __u32 insn_off; + __u32 type_id; +}; + +/* The minimum bpf_line_info checked by the loader */ +struct bpf_line_info_min { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + + +typedef int (*type_id_visit_fn)(__u32 *type_id, void *ctx); +typedef int (*str_off_visit_fn)(__u32 *str_off, void *ctx); +int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx); +int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx); +int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx); +int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx); +__s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, + __u32 kind); + +typedef int (*kallsyms_cb_t)(unsigned long long sym_addr, char sym_type, + const char *sym_name, void *ctx); + +int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *arg); + +/* handle direct returned errors */ +static inline int libbpf_err(int ret) +{ + if (ret < 0) + errno = -ret; + return ret; +} + +/* handle errno-based (e.g., syscall or libc) errors according to libbpf's + * strict mode settings + */ +static inline int libbpf_err_errno(int ret) +{ + /* errno is already assumed to be set on error */ + return ret < 0 ? -errno : ret; +} + +/* handle error for pointer-returning APIs, err is assumed to be < 0 always */ +static inline void *libbpf_err_ptr(int err) +{ + /* set errno on error, this doesn't break anything */ + errno = -err; + return NULL; +} + +/* handle pointer-returning APIs' error handling */ +static inline void *libbpf_ptr(void *ret) +{ + /* set errno on error, this doesn't break anything */ + if (IS_ERR(ret)) + errno = -PTR_ERR(ret); + + return IS_ERR(ret) ? NULL : ret; +} + +static inline bool str_is_empty(const char *s) +{ + return !s || !s[0]; +} + +static inline bool is_ldimm64_insn(struct bpf_insn *insn) +{ + return insn->code == (BPF_LD | BPF_IMM | BPF_DW); +} + +/* if fd is stdin, stdout, or stderr, dup to a fd greater than 2 + * Takes ownership of the fd passed in, and closes it if calling + * fcntl(fd, F_DUPFD_CLOEXEC, 3). + */ +static inline int ensure_good_fd(int fd) +{ + int old_fd = fd, saved_errno; + + if (fd < 0) + return fd; + if (fd < 3) { + fd = fcntl(fd, F_DUPFD_CLOEXEC, 3); + saved_errno = errno; + close(old_fd); + errno = saved_errno; + if (fd < 0) { + pr_warn("failed to dup FD %d to FD > 2: %d\n", old_fd, -saved_errno); + errno = saved_errno; + } + } + return fd; +} + +/* The following two functions are exposed to bpftool */ +int bpf_core_add_cands(struct bpf_core_cand *local_cand, + size_t local_essent_len, + const struct btf *targ_btf, + const char *targ_btf_name, + int targ_start_id, + struct bpf_core_cand_list *cands); +void bpf_core_free_cands(struct bpf_core_cand_list *cands); + +struct usdt_manager *usdt_manager_new(struct bpf_object *obj); +void usdt_manager_free(struct usdt_manager *man); +struct bpf_link * usdt_manager_attach_usdt(struct usdt_manager *man, + const struct bpf_program *prog, + pid_t pid, const char *path, + const char *usdt_provider, const char *usdt_name, + __u64 usdt_cookie); + +static inline bool is_pow_of_2(size_t x) +{ + return x && (x & (x - 1)) == 0; +} + +#define PROG_LOAD_ATTEMPTS 5 +int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts); + +#endif /* __LIBBPF_LIBBPF_INTERNAL_H */ diff --git a/bpftool/libbpf/src/libbpf_legacy.h b/bpftool/libbpf/src/libbpf_legacy.h new file mode 100644 index 0000000..1e1be46 --- /dev/null +++ b/bpftool/libbpf/src/libbpf_legacy.h @@ -0,0 +1,140 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Libbpf legacy APIs (either discouraged or deprecated, as mentioned in [0]) + * + * [0] https://docs.google.com/document/d/1UyjTZuPFWiPFyKk1tV5an11_iaRuec6U-ZESZ54nNTY + * + * Copyright (C) 2021 Facebook + */ +#ifndef __LIBBPF_LEGACY_BPF_H +#define __LIBBPF_LEGACY_BPF_H + +#include +#include +#include +#include +#include "libbpf_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* As of libbpf 1.0 libbpf_set_strict_mode() and enum libbpf_struct_mode have + * no effect. But they are left in libbpf_legacy.h so that applications that + * prepared for libbpf 1.0 before final release by using + * libbpf_set_strict_mode() still work with libbpf 1.0+ without any changes. + */ +enum libbpf_strict_mode { + /* Turn on all supported strict features of libbpf to simulate libbpf + * v1.0 behavior. + * This will be the default behavior in libbpf v1.0. + */ + LIBBPF_STRICT_ALL = 0xffffffff, + + /* + * Disable any libbpf 1.0 behaviors. This is the default before libbpf + * v1.0. It won't be supported anymore in v1.0, please update your + * code so that it handles LIBBPF_STRICT_ALL mode before libbpf v1.0. + */ + LIBBPF_STRICT_NONE = 0x00, + /* + * Return NULL pointers on error, not ERR_PTR(err). + * Additionally, libbpf also always sets errno to corresponding Exx + * (positive) error code. + */ + LIBBPF_STRICT_CLEAN_PTRS = 0x01, + /* + * Return actual error codes from low-level APIs directly, not just -1. + * Additionally, libbpf also always sets errno to corresponding Exx + * (positive) error code. + */ + LIBBPF_STRICT_DIRECT_ERRS = 0x02, + /* + * Enforce strict BPF program section (SEC()) names. + * E.g., while prefiously SEC("xdp_whatever") or SEC("perf_event_blah") were + * allowed, with LIBBPF_STRICT_SEC_PREFIX this will become + * unrecognized by libbpf and would have to be just SEC("xdp") and + * SEC("xdp") and SEC("perf_event"). + * + * Note, in this mode the program pin path will be based on the + * function name instead of section name. + * + * Additionally, routines in the .text section are always considered + * sub-programs. Legacy behavior allows for a single routine in .text + * to be a program. + */ + LIBBPF_STRICT_SEC_NAME = 0x04, + /* + * Disable the global 'bpf_objects_list'. Maintaining this list adds + * a race condition to bpf_object__open() and bpf_object__close(). + * Clients can maintain it on their own if it is valuable for them. + */ + LIBBPF_STRICT_NO_OBJECT_LIST = 0x08, + /* + * Automatically bump RLIMIT_MEMLOCK using setrlimit() before the + * first BPF program or map creation operation. This is done only if + * kernel is too old to support memcg-based memory accounting for BPF + * subsystem. By default, RLIMIT_MEMLOCK limit is set to RLIM_INFINITY, + * but it can be overriden with libbpf_set_memlock_rlim() API. + * Note that libbpf_set_memlock_rlim() needs to be called before + * the very first bpf_prog_load(), bpf_map_create() or bpf_object__load() + * operation. + */ + LIBBPF_STRICT_AUTO_RLIMIT_MEMLOCK = 0x10, + /* + * Error out on any SEC("maps") map definition, which are deprecated + * in favor of BTF-defined map definitions in SEC(".maps"). + */ + LIBBPF_STRICT_MAP_DEFINITIONS = 0x20, + + __LIBBPF_STRICT_LAST, +}; + +LIBBPF_API int libbpf_set_strict_mode(enum libbpf_strict_mode mode); + +/** + * @brief **libbpf_get_error()** extracts the error code from the passed + * pointer + * @param ptr pointer returned from libbpf API function + * @return error code; or 0 if no error occured + * + * Note, as of libbpf 1.0 this function is not necessary and not recommended + * to be used. Libbpf doesn't return error code embedded into the pointer + * itself. Instead, NULL is returned on error and error code is passed through + * thread-local errno variable. **libbpf_get_error()** is just returning -errno + * value if it receives NULL, which is correct only if errno hasn't been + * modified between libbpf API call and corresponding **libbpf_get_error()** + * call. Prefer to check return for NULL and use errno directly. + * + * This API is left in libbpf 1.0 to allow applications that were 1.0-ready + * before final libbpf 1.0 without needing to change them. + */ +LIBBPF_API long libbpf_get_error(const void *ptr); + +#define DECLARE_LIBBPF_OPTS LIBBPF_OPTS + +/* "Discouraged" APIs which don't follow consistent libbpf naming patterns. + * They are normally a trivial aliases or wrappers for proper APIs and are + * left to minimize unnecessary disruption for users of libbpf. But they + * shouldn't be used going forward. + */ + +struct bpf_program; +struct bpf_map; +struct btf; +struct btf_ext; + +LIBBPF_API struct btf *libbpf_find_kernel_btf(void); + +LIBBPF_API enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog); +LIBBPF_API enum bpf_attach_type bpf_program__get_expected_attach_type(const struct bpf_program *prog); +LIBBPF_API const char *bpf_map__get_pin_path(const struct bpf_map *map); +LIBBPF_API const void *btf__get_raw_data(const struct btf *btf, __u32 *size); +LIBBPF_API const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_LEGACY_BPF_H */ diff --git a/bpftool/libbpf/src/libbpf_probes.c b/bpftool/libbpf/src/libbpf_probes.c new file mode 100644 index 0000000..4f3bc96 --- /dev/null +++ b/bpftool/libbpf/src/libbpf_probes.c @@ -0,0 +1,447 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2019 Netronome Systems, Inc. */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" + +/* On Ubuntu LINUX_VERSION_CODE doesn't correspond to info.release, + * but Ubuntu provides /proc/version_signature file, as described at + * https://ubuntu.com/kernel, with an example contents below, which we + * can use to get a proper LINUX_VERSION_CODE. + * + * Ubuntu 5.4.0-12.15-generic 5.4.8 + * + * In the above, 5.4.8 is what kernel is actually expecting, while + * uname() call will return 5.4.0 in info.release. + */ +static __u32 get_ubuntu_kernel_version(void) +{ + const char *ubuntu_kver_file = "/proc/version_signature"; + __u32 major, minor, patch; + int ret; + FILE *f; + + if (faccessat(AT_FDCWD, ubuntu_kver_file, R_OK, AT_EACCESS) != 0) + return 0; + + f = fopen(ubuntu_kver_file, "r"); + if (!f) + return 0; + + ret = fscanf(f, "%*s %*s %u.%u.%u\n", &major, &minor, &patch); + fclose(f); + if (ret != 3) + return 0; + + return KERNEL_VERSION(major, minor, patch); +} + +/* On Debian LINUX_VERSION_CODE doesn't correspond to info.release. + * Instead, it is provided in info.version. An example content of + * Debian 10 looks like the below. + * + * utsname::release 4.19.0-22-amd64 + * utsname::version #1 SMP Debian 4.19.260-1 (2022-09-29) + * + * In the above, 4.19.260 is what kernel is actually expecting, while + * uname() call will return 4.19.0 in info.release. + */ +static __u32 get_debian_kernel_version(struct utsname *info) +{ + __u32 major, minor, patch; + char *p; + + p = strstr(info->version, "Debian "); + if (!p) { + /* This is not a Debian kernel. */ + return 0; + } + + if (sscanf(p, "Debian %u.%u.%u", &major, &minor, &patch) != 3) + return 0; + + return KERNEL_VERSION(major, minor, patch); +} + +__u32 get_kernel_version(void) +{ + __u32 major, minor, patch, version; + struct utsname info; + + /* Check if this is an Ubuntu kernel. */ + version = get_ubuntu_kernel_version(); + if (version != 0) + return version; + + uname(&info); + + /* Check if this is a Debian kernel. */ + version = get_debian_kernel_version(&info); + if (version != 0) + return version; + + if (sscanf(info.release, "%u.%u.%u", &major, &minor, &patch) != 3) + return 0; + + return KERNEL_VERSION(major, minor, patch); +} + +static int probe_prog_load(enum bpf_prog_type prog_type, + const struct bpf_insn *insns, size_t insns_cnt, + char *log_buf, size_t log_buf_sz) +{ + LIBBPF_OPTS(bpf_prog_load_opts, opts, + .log_buf = log_buf, + .log_size = log_buf_sz, + .log_level = log_buf ? 1 : 0, + ); + int fd, err, exp_err = 0; + const char *exp_msg = NULL; + char buf[4096]; + + switch (prog_type) { + case BPF_PROG_TYPE_CGROUP_SOCK_ADDR: + opts.expected_attach_type = BPF_CGROUP_INET4_CONNECT; + break; + case BPF_PROG_TYPE_CGROUP_SOCKOPT: + opts.expected_attach_type = BPF_CGROUP_GETSOCKOPT; + break; + case BPF_PROG_TYPE_SK_LOOKUP: + opts.expected_attach_type = BPF_SK_LOOKUP; + break; + case BPF_PROG_TYPE_KPROBE: + opts.kern_version = get_kernel_version(); + break; + case BPF_PROG_TYPE_LIRC_MODE2: + opts.expected_attach_type = BPF_LIRC_MODE2; + break; + case BPF_PROG_TYPE_TRACING: + case BPF_PROG_TYPE_LSM: + opts.log_buf = buf; + opts.log_size = sizeof(buf); + opts.log_level = 1; + if (prog_type == BPF_PROG_TYPE_TRACING) + opts.expected_attach_type = BPF_TRACE_FENTRY; + else + opts.expected_attach_type = BPF_MODIFY_RETURN; + opts.attach_btf_id = 1; + + exp_err = -EINVAL; + exp_msg = "attach_btf_id 1 is not a function"; + break; + case BPF_PROG_TYPE_EXT: + opts.log_buf = buf; + opts.log_size = sizeof(buf); + opts.log_level = 1; + opts.attach_btf_id = 1; + + exp_err = -EINVAL; + exp_msg = "Cannot replace kernel functions"; + break; + case BPF_PROG_TYPE_SYSCALL: + opts.prog_flags = BPF_F_SLEEPABLE; + break; + case BPF_PROG_TYPE_STRUCT_OPS: + exp_err = -524; /* -ENOTSUPP */ + break; + case BPF_PROG_TYPE_UNSPEC: + case BPF_PROG_TYPE_SOCKET_FILTER: + case BPF_PROG_TYPE_SCHED_CLS: + case BPF_PROG_TYPE_SCHED_ACT: + case BPF_PROG_TYPE_TRACEPOINT: + case BPF_PROG_TYPE_XDP: + case BPF_PROG_TYPE_PERF_EVENT: + case BPF_PROG_TYPE_CGROUP_SKB: + case BPF_PROG_TYPE_CGROUP_SOCK: + case BPF_PROG_TYPE_LWT_IN: + case BPF_PROG_TYPE_LWT_OUT: + case BPF_PROG_TYPE_LWT_XMIT: + case BPF_PROG_TYPE_SOCK_OPS: + case BPF_PROG_TYPE_SK_SKB: + case BPF_PROG_TYPE_CGROUP_DEVICE: + case BPF_PROG_TYPE_SK_MSG: + case BPF_PROG_TYPE_RAW_TRACEPOINT: + case BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE: + case BPF_PROG_TYPE_LWT_SEG6LOCAL: + case BPF_PROG_TYPE_SK_REUSEPORT: + case BPF_PROG_TYPE_FLOW_DISSECTOR: + case BPF_PROG_TYPE_CGROUP_SYSCTL: + break; + default: + return -EOPNOTSUPP; + } + + fd = bpf_prog_load(prog_type, NULL, "GPL", insns, insns_cnt, &opts); + err = -errno; + if (fd >= 0) + close(fd); + if (exp_err) { + if (fd >= 0 || err != exp_err) + return 0; + if (exp_msg && !strstr(buf, exp_msg)) + return 0; + return 1; + } + return fd >= 0 ? 1 : 0; +} + +int libbpf_probe_bpf_prog_type(enum bpf_prog_type prog_type, const void *opts) +{ + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN() + }; + const size_t insn_cnt = ARRAY_SIZE(insns); + int ret; + + if (opts) + return libbpf_err(-EINVAL); + + ret = probe_prog_load(prog_type, insns, insn_cnt, NULL, 0); + return libbpf_err(ret); +} + +int libbpf__load_raw_btf(const char *raw_types, size_t types_len, + const char *str_sec, size_t str_len) +{ + struct btf_header hdr = { + .magic = BTF_MAGIC, + .version = BTF_VERSION, + .hdr_len = sizeof(struct btf_header), + .type_len = types_len, + .str_off = types_len, + .str_len = str_len, + }; + int btf_fd, btf_len; + __u8 *raw_btf; + + btf_len = hdr.hdr_len + hdr.type_len + hdr.str_len; + raw_btf = malloc(btf_len); + if (!raw_btf) + return -ENOMEM; + + memcpy(raw_btf, &hdr, sizeof(hdr)); + memcpy(raw_btf + hdr.hdr_len, raw_types, hdr.type_len); + memcpy(raw_btf + hdr.hdr_len + hdr.type_len, str_sec, hdr.str_len); + + btf_fd = bpf_btf_load(raw_btf, btf_len, NULL); + + free(raw_btf); + return btf_fd; +} + +static int load_local_storage_btf(void) +{ + const char strs[] = "\0bpf_spin_lock\0val\0cnt\0l"; + /* struct bpf_spin_lock { + * int val; + * }; + * struct val { + * int cnt; + * struct bpf_spin_lock l; + * }; + */ + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* struct bpf_spin_lock */ /* [2] */ + BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), + BTF_MEMBER_ENC(15, 1, 0), /* int val; */ + /* struct val */ /* [3] */ + BTF_TYPE_ENC(15, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8), + BTF_MEMBER_ENC(19, 1, 0), /* int cnt; */ + BTF_MEMBER_ENC(23, 2, 32),/* struct bpf_spin_lock l; */ + }; + + return libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs)); +} + +static int probe_map_create(enum bpf_map_type map_type) +{ + LIBBPF_OPTS(bpf_map_create_opts, opts); + int key_size, value_size, max_entries; + __u32 btf_key_type_id = 0, btf_value_type_id = 0; + int fd = -1, btf_fd = -1, fd_inner = -1, exp_err = 0, err = 0; + + key_size = sizeof(__u32); + value_size = sizeof(__u32); + max_entries = 1; + + switch (map_type) { + case BPF_MAP_TYPE_STACK_TRACE: + value_size = sizeof(__u64); + break; + case BPF_MAP_TYPE_LPM_TRIE: + key_size = sizeof(__u64); + value_size = sizeof(__u64); + opts.map_flags = BPF_F_NO_PREALLOC; + break; + case BPF_MAP_TYPE_CGROUP_STORAGE: + case BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: + key_size = sizeof(struct bpf_cgroup_storage_key); + value_size = sizeof(__u64); + max_entries = 0; + break; + case BPF_MAP_TYPE_QUEUE: + case BPF_MAP_TYPE_STACK: + key_size = 0; + break; + case BPF_MAP_TYPE_SK_STORAGE: + case BPF_MAP_TYPE_INODE_STORAGE: + case BPF_MAP_TYPE_TASK_STORAGE: + case BPF_MAP_TYPE_CGRP_STORAGE: + btf_key_type_id = 1; + btf_value_type_id = 3; + value_size = 8; + max_entries = 0; + opts.map_flags = BPF_F_NO_PREALLOC; + btf_fd = load_local_storage_btf(); + if (btf_fd < 0) + return btf_fd; + break; + case BPF_MAP_TYPE_RINGBUF: + case BPF_MAP_TYPE_USER_RINGBUF: + key_size = 0; + value_size = 0; + max_entries = sysconf(_SC_PAGE_SIZE); + break; + case BPF_MAP_TYPE_STRUCT_OPS: + /* we'll get -ENOTSUPP for invalid BTF type ID for struct_ops */ + opts.btf_vmlinux_value_type_id = 1; + exp_err = -524; /* -ENOTSUPP */ + break; + case BPF_MAP_TYPE_BLOOM_FILTER: + key_size = 0; + max_entries = 1; + break; + case BPF_MAP_TYPE_HASH: + case BPF_MAP_TYPE_ARRAY: + case BPF_MAP_TYPE_PROG_ARRAY: + case BPF_MAP_TYPE_PERF_EVENT_ARRAY: + case BPF_MAP_TYPE_PERCPU_HASH: + case BPF_MAP_TYPE_PERCPU_ARRAY: + case BPF_MAP_TYPE_CGROUP_ARRAY: + case BPF_MAP_TYPE_LRU_HASH: + case BPF_MAP_TYPE_LRU_PERCPU_HASH: + case BPF_MAP_TYPE_ARRAY_OF_MAPS: + case BPF_MAP_TYPE_HASH_OF_MAPS: + case BPF_MAP_TYPE_DEVMAP: + case BPF_MAP_TYPE_DEVMAP_HASH: + case BPF_MAP_TYPE_SOCKMAP: + case BPF_MAP_TYPE_CPUMAP: + case BPF_MAP_TYPE_XSKMAP: + case BPF_MAP_TYPE_SOCKHASH: + case BPF_MAP_TYPE_REUSEPORT_SOCKARRAY: + break; + case BPF_MAP_TYPE_UNSPEC: + default: + return -EOPNOTSUPP; + } + + if (map_type == BPF_MAP_TYPE_ARRAY_OF_MAPS || + map_type == BPF_MAP_TYPE_HASH_OF_MAPS) { + fd_inner = bpf_map_create(BPF_MAP_TYPE_HASH, NULL, + sizeof(__u32), sizeof(__u32), 1, NULL); + if (fd_inner < 0) + goto cleanup; + + opts.inner_map_fd = fd_inner; + } + + if (btf_fd >= 0) { + opts.btf_fd = btf_fd; + opts.btf_key_type_id = btf_key_type_id; + opts.btf_value_type_id = btf_value_type_id; + } + + fd = bpf_map_create(map_type, NULL, key_size, value_size, max_entries, &opts); + err = -errno; + +cleanup: + if (fd >= 0) + close(fd); + if (fd_inner >= 0) + close(fd_inner); + if (btf_fd >= 0) + close(btf_fd); + + if (exp_err) + return fd < 0 && err == exp_err ? 1 : 0; + else + return fd >= 0 ? 1 : 0; +} + +int libbpf_probe_bpf_map_type(enum bpf_map_type map_type, const void *opts) +{ + int ret; + + if (opts) + return libbpf_err(-EINVAL); + + ret = probe_map_create(map_type); + return libbpf_err(ret); +} + +int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, enum bpf_func_id helper_id, + const void *opts) +{ + struct bpf_insn insns[] = { + BPF_EMIT_CALL((__u32)helper_id), + BPF_EXIT_INSN(), + }; + const size_t insn_cnt = ARRAY_SIZE(insns); + char buf[4096]; + int ret; + + if (opts) + return libbpf_err(-EINVAL); + + /* we can't successfully load all prog types to check for BPF helper + * support, so bail out with -EOPNOTSUPP error + */ + switch (prog_type) { + case BPF_PROG_TYPE_TRACING: + case BPF_PROG_TYPE_EXT: + case BPF_PROG_TYPE_LSM: + case BPF_PROG_TYPE_STRUCT_OPS: + return -EOPNOTSUPP; + default: + break; + } + + buf[0] = '\0'; + ret = probe_prog_load(prog_type, insns, insn_cnt, buf, sizeof(buf)); + if (ret < 0) + return libbpf_err(ret); + + /* If BPF verifier doesn't recognize BPF helper ID (enum bpf_func_id) + * at all, it will emit something like "invalid func unknown#181". + * If BPF verifier recognizes BPF helper but it's not supported for + * given BPF program type, it will emit "unknown func bpf_sys_bpf#166". + * In both cases, provided combination of BPF program type and BPF + * helper is not supported by the kernel. + * In all other cases, probe_prog_load() above will either succeed (e.g., + * because BPF helper happens to accept no input arguments or it + * accepts one input argument and initial PTR_TO_CTX is fine for + * that), or we'll get some more specific BPF verifier error about + * some unsatisfied conditions. + */ + if (ret == 0 && (strstr(buf, "invalid func ") || strstr(buf, "unknown func "))) + return 0; + return 1; /* assume supported */ +} diff --git a/bpftool/libbpf/src/libbpf_version.h b/bpftool/libbpf/src/libbpf_version.h new file mode 100644 index 0000000..1fd2eea --- /dev/null +++ b/bpftool/libbpf/src/libbpf_version.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (C) 2021 Facebook */ +#ifndef __LIBBPF_VERSION_H +#define __LIBBPF_VERSION_H + +#define LIBBPF_MAJOR_VERSION 1 +#define LIBBPF_MINOR_VERSION 2 + +#endif /* __LIBBPF_VERSION_H */ diff --git a/bpftool/libbpf/src/linker.c b/bpftool/libbpf/src/linker.c new file mode 100644 index 0000000..4ac02c2 --- /dev/null +++ b/bpftool/libbpf/src/linker.c @@ -0,0 +1,2900 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* + * BPF static linker + * + * Copyright (c) 2021 Facebook + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "libbpf.h" +#include "btf.h" +#include "libbpf_internal.h" +#include "strset.h" + +#define BTF_EXTERN_SEC ".extern" + +struct src_sec { + const char *sec_name; + /* positional (not necessarily ELF) index in an array of sections */ + int id; + /* positional (not necessarily ELF) index of a matching section in a final object file */ + int dst_id; + /* section data offset in a matching output section */ + int dst_off; + /* whether section is omitted from the final ELF file */ + bool skipped; + /* whether section is an ephemeral section, not mapped to an ELF section */ + bool ephemeral; + + /* ELF info */ + size_t sec_idx; + Elf_Scn *scn; + Elf64_Shdr *shdr; + Elf_Data *data; + + /* corresponding BTF DATASEC type ID */ + int sec_type_id; +}; + +struct src_obj { + const char *filename; + int fd; + Elf *elf; + /* Section header strings section index */ + size_t shstrs_sec_idx; + /* SYMTAB section index */ + size_t symtab_sec_idx; + + struct btf *btf; + struct btf_ext *btf_ext; + + /* List of sections (including ephemeral). Slot zero is unused. */ + struct src_sec *secs; + int sec_cnt; + + /* mapping of symbol indices from src to dst ELF */ + int *sym_map; + /* mapping from the src BTF type IDs to dst ones */ + int *btf_type_map; +}; + +/* single .BTF.ext data section */ +struct btf_ext_sec_data { + size_t rec_cnt; + __u32 rec_sz; + void *recs; +}; + +struct glob_sym { + /* ELF symbol index */ + int sym_idx; + /* associated section id for .ksyms, .kconfig, etc, but not .extern */ + int sec_id; + /* extern name offset in STRTAB */ + int name_off; + /* optional associated BTF type ID */ + int btf_id; + /* BTF type ID to which VAR/FUNC type is pointing to; used for + * rewriting types when extern VAR/FUNC is resolved to a concrete + * definition + */ + int underlying_btf_id; + /* sec_var index in the corresponding dst_sec, if exists */ + int var_idx; + + /* extern or resolved/global symbol */ + bool is_extern; + /* weak or strong symbol, never goes back from strong to weak */ + bool is_weak; +}; + +struct dst_sec { + char *sec_name; + /* positional (not necessarily ELF) index in an array of sections */ + int id; + + bool ephemeral; + + /* ELF info */ + size_t sec_idx; + Elf_Scn *scn; + Elf64_Shdr *shdr; + Elf_Data *data; + + /* final output section size */ + int sec_sz; + /* final output contents of the section */ + void *raw_data; + + /* corresponding STT_SECTION symbol index in SYMTAB */ + int sec_sym_idx; + + /* section's DATASEC variable info, emitted on BTF finalization */ + bool has_btf; + int sec_var_cnt; + struct btf_var_secinfo *sec_vars; + + /* section's .BTF.ext data */ + struct btf_ext_sec_data func_info; + struct btf_ext_sec_data line_info; + struct btf_ext_sec_data core_relo_info; +}; + +struct bpf_linker { + char *filename; + int fd; + Elf *elf; + Elf64_Ehdr *elf_hdr; + + /* Output sections metadata */ + struct dst_sec *secs; + int sec_cnt; + + struct strset *strtab_strs; /* STRTAB unique strings */ + size_t strtab_sec_idx; /* STRTAB section index */ + size_t symtab_sec_idx; /* SYMTAB section index */ + + struct btf *btf; + struct btf_ext *btf_ext; + + /* global (including extern) ELF symbols */ + int glob_sym_cnt; + struct glob_sym *glob_syms; +}; + +#define pr_warn_elf(fmt, ...) \ + libbpf_print(LIBBPF_WARN, "libbpf: " fmt ": %s\n", ##__VA_ARGS__, elf_errmsg(-1)) + +static int init_output_elf(struct bpf_linker *linker, const char *file); + +static int linker_load_obj_file(struct bpf_linker *linker, const char *filename, + const struct bpf_linker_file_opts *opts, + struct src_obj *obj); +static int linker_sanity_check_elf(struct src_obj *obj); +static int linker_sanity_check_elf_symtab(struct src_obj *obj, struct src_sec *sec); +static int linker_sanity_check_elf_relos(struct src_obj *obj, struct src_sec *sec); +static int linker_sanity_check_btf(struct src_obj *obj); +static int linker_sanity_check_btf_ext(struct src_obj *obj); +static int linker_fixup_btf(struct src_obj *obj); +static int linker_append_sec_data(struct bpf_linker *linker, struct src_obj *obj); +static int linker_append_elf_syms(struct bpf_linker *linker, struct src_obj *obj); +static int linker_append_elf_sym(struct bpf_linker *linker, struct src_obj *obj, + Elf64_Sym *sym, const char *sym_name, int src_sym_idx); +static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *obj); +static int linker_append_btf(struct bpf_linker *linker, struct src_obj *obj); +static int linker_append_btf_ext(struct bpf_linker *linker, struct src_obj *obj); + +static int finalize_btf(struct bpf_linker *linker); +static int finalize_btf_ext(struct bpf_linker *linker); + +void bpf_linker__free(struct bpf_linker *linker) +{ + int i; + + if (!linker) + return; + + free(linker->filename); + + if (linker->elf) + elf_end(linker->elf); + + if (linker->fd >= 0) + close(linker->fd); + + strset__free(linker->strtab_strs); + + btf__free(linker->btf); + btf_ext__free(linker->btf_ext); + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + free(sec->sec_name); + free(sec->raw_data); + free(sec->sec_vars); + + free(sec->func_info.recs); + free(sec->line_info.recs); + free(sec->core_relo_info.recs); + } + free(linker->secs); + + free(linker->glob_syms); + free(linker); +} + +struct bpf_linker *bpf_linker__new(const char *filename, struct bpf_linker_opts *opts) +{ + struct bpf_linker *linker; + int err; + + if (!OPTS_VALID(opts, bpf_linker_opts)) + return errno = EINVAL, NULL; + + if (elf_version(EV_CURRENT) == EV_NONE) { + pr_warn_elf("libelf initialization failed"); + return errno = EINVAL, NULL; + } + + linker = calloc(1, sizeof(*linker)); + if (!linker) + return errno = ENOMEM, NULL; + + linker->fd = -1; + + err = init_output_elf(linker, filename); + if (err) + goto err_out; + + return linker; + +err_out: + bpf_linker__free(linker); + return errno = -err, NULL; +} + +static struct dst_sec *add_dst_sec(struct bpf_linker *linker, const char *sec_name) +{ + struct dst_sec *secs = linker->secs, *sec; + size_t new_cnt = linker->sec_cnt ? linker->sec_cnt + 1 : 2; + + secs = libbpf_reallocarray(secs, new_cnt, sizeof(*secs)); + if (!secs) + return NULL; + + /* zero out newly allocated memory */ + memset(secs + linker->sec_cnt, 0, (new_cnt - linker->sec_cnt) * sizeof(*secs)); + + linker->secs = secs; + linker->sec_cnt = new_cnt; + + sec = &linker->secs[new_cnt - 1]; + sec->id = new_cnt - 1; + sec->sec_name = strdup(sec_name); + if (!sec->sec_name) + return NULL; + + return sec; +} + +static Elf64_Sym *add_new_sym(struct bpf_linker *linker, size_t *sym_idx) +{ + struct dst_sec *symtab = &linker->secs[linker->symtab_sec_idx]; + Elf64_Sym *syms, *sym; + size_t sym_cnt = symtab->sec_sz / sizeof(*sym); + + syms = libbpf_reallocarray(symtab->raw_data, sym_cnt + 1, sizeof(*sym)); + if (!syms) + return NULL; + + sym = &syms[sym_cnt]; + memset(sym, 0, sizeof(*sym)); + + symtab->raw_data = syms; + symtab->sec_sz += sizeof(*sym); + symtab->shdr->sh_size += sizeof(*sym); + symtab->data->d_size += sizeof(*sym); + + if (sym_idx) + *sym_idx = sym_cnt; + + return sym; +} + +static int init_output_elf(struct bpf_linker *linker, const char *file) +{ + int err, str_off; + Elf64_Sym *init_sym; + struct dst_sec *sec; + + linker->filename = strdup(file); + if (!linker->filename) + return -ENOMEM; + + linker->fd = open(file, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644); + if (linker->fd < 0) { + err = -errno; + pr_warn("failed to create '%s': %d\n", file, err); + return err; + } + + linker->elf = elf_begin(linker->fd, ELF_C_WRITE, NULL); + if (!linker->elf) { + pr_warn_elf("failed to create ELF object"); + return -EINVAL; + } + + /* ELF header */ + linker->elf_hdr = elf64_newehdr(linker->elf); + if (!linker->elf_hdr) { + pr_warn_elf("failed to create ELF header"); + return -EINVAL; + } + + linker->elf_hdr->e_machine = EM_BPF; + linker->elf_hdr->e_type = ET_REL; +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + linker->elf_hdr->e_ident[EI_DATA] = ELFDATA2LSB; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + linker->elf_hdr->e_ident[EI_DATA] = ELFDATA2MSB; +#else +#error "Unknown __BYTE_ORDER__" +#endif + + /* STRTAB */ + /* initialize strset with an empty string to conform to ELF */ + linker->strtab_strs = strset__new(INT_MAX, "", sizeof("")); + if (libbpf_get_error(linker->strtab_strs)) + return libbpf_get_error(linker->strtab_strs); + + sec = add_dst_sec(linker, ".strtab"); + if (!sec) + return -ENOMEM; + + sec->scn = elf_newscn(linker->elf); + if (!sec->scn) { + pr_warn_elf("failed to create STRTAB section"); + return -EINVAL; + } + + sec->shdr = elf64_getshdr(sec->scn); + if (!sec->shdr) + return -EINVAL; + + sec->data = elf_newdata(sec->scn); + if (!sec->data) { + pr_warn_elf("failed to create STRTAB data"); + return -EINVAL; + } + + str_off = strset__add_str(linker->strtab_strs, sec->sec_name); + if (str_off < 0) + return str_off; + + sec->sec_idx = elf_ndxscn(sec->scn); + linker->elf_hdr->e_shstrndx = sec->sec_idx; + linker->strtab_sec_idx = sec->sec_idx; + + sec->shdr->sh_name = str_off; + sec->shdr->sh_type = SHT_STRTAB; + sec->shdr->sh_flags = SHF_STRINGS; + sec->shdr->sh_offset = 0; + sec->shdr->sh_link = 0; + sec->shdr->sh_info = 0; + sec->shdr->sh_addralign = 1; + sec->shdr->sh_size = sec->sec_sz = 0; + sec->shdr->sh_entsize = 0; + + /* SYMTAB */ + sec = add_dst_sec(linker, ".symtab"); + if (!sec) + return -ENOMEM; + + sec->scn = elf_newscn(linker->elf); + if (!sec->scn) { + pr_warn_elf("failed to create SYMTAB section"); + return -EINVAL; + } + + sec->shdr = elf64_getshdr(sec->scn); + if (!sec->shdr) + return -EINVAL; + + sec->data = elf_newdata(sec->scn); + if (!sec->data) { + pr_warn_elf("failed to create SYMTAB data"); + return -EINVAL; + } + + str_off = strset__add_str(linker->strtab_strs, sec->sec_name); + if (str_off < 0) + return str_off; + + sec->sec_idx = elf_ndxscn(sec->scn); + linker->symtab_sec_idx = sec->sec_idx; + + sec->shdr->sh_name = str_off; + sec->shdr->sh_type = SHT_SYMTAB; + sec->shdr->sh_flags = 0; + sec->shdr->sh_offset = 0; + sec->shdr->sh_link = linker->strtab_sec_idx; + /* sh_info should be one greater than the index of the last local + * symbol (i.e., binding is STB_LOCAL). But why and who cares? + */ + sec->shdr->sh_info = 0; + sec->shdr->sh_addralign = 8; + sec->shdr->sh_entsize = sizeof(Elf64_Sym); + + /* .BTF */ + linker->btf = btf__new_empty(); + err = libbpf_get_error(linker->btf); + if (err) + return err; + + /* add the special all-zero symbol */ + init_sym = add_new_sym(linker, NULL); + if (!init_sym) + return -EINVAL; + + init_sym->st_name = 0; + init_sym->st_info = 0; + init_sym->st_other = 0; + init_sym->st_shndx = SHN_UNDEF; + init_sym->st_value = 0; + init_sym->st_size = 0; + + return 0; +} + +int bpf_linker__add_file(struct bpf_linker *linker, const char *filename, + const struct bpf_linker_file_opts *opts) +{ + struct src_obj obj = {}; + int err = 0; + + if (!OPTS_VALID(opts, bpf_linker_file_opts)) + return libbpf_err(-EINVAL); + + if (!linker->elf) + return libbpf_err(-EINVAL); + + err = err ?: linker_load_obj_file(linker, filename, opts, &obj); + err = err ?: linker_append_sec_data(linker, &obj); + err = err ?: linker_append_elf_syms(linker, &obj); + err = err ?: linker_append_elf_relos(linker, &obj); + err = err ?: linker_append_btf(linker, &obj); + err = err ?: linker_append_btf_ext(linker, &obj); + + /* free up src_obj resources */ + free(obj.btf_type_map); + btf__free(obj.btf); + btf_ext__free(obj.btf_ext); + free(obj.secs); + free(obj.sym_map); + if (obj.elf) + elf_end(obj.elf); + if (obj.fd >= 0) + close(obj.fd); + + return libbpf_err(err); +} + +static bool is_dwarf_sec_name(const char *name) +{ + /* approximation, but the actual list is too long */ + return strncmp(name, ".debug_", sizeof(".debug_") - 1) == 0; +} + +static bool is_ignored_sec(struct src_sec *sec) +{ + Elf64_Shdr *shdr = sec->shdr; + const char *name = sec->sec_name; + + /* no special handling of .strtab */ + if (shdr->sh_type == SHT_STRTAB) + return true; + + /* ignore .llvm_addrsig section as well */ + if (shdr->sh_type == SHT_LLVM_ADDRSIG) + return true; + + /* no subprograms will lead to an empty .text section, ignore it */ + if (shdr->sh_type == SHT_PROGBITS && shdr->sh_size == 0 && + strcmp(sec->sec_name, ".text") == 0) + return true; + + /* DWARF sections */ + if (is_dwarf_sec_name(sec->sec_name)) + return true; + + if (strncmp(name, ".rel", sizeof(".rel") - 1) == 0) { + name += sizeof(".rel") - 1; + /* DWARF section relocations */ + if (is_dwarf_sec_name(name)) + return true; + + /* .BTF and .BTF.ext don't need relocations */ + if (strcmp(name, BTF_ELF_SEC) == 0 || + strcmp(name, BTF_EXT_ELF_SEC) == 0) + return true; + } + + return false; +} + +static struct src_sec *add_src_sec(struct src_obj *obj, const char *sec_name) +{ + struct src_sec *secs = obj->secs, *sec; + size_t new_cnt = obj->sec_cnt ? obj->sec_cnt + 1 : 2; + + secs = libbpf_reallocarray(secs, new_cnt, sizeof(*secs)); + if (!secs) + return NULL; + + /* zero out newly allocated memory */ + memset(secs + obj->sec_cnt, 0, (new_cnt - obj->sec_cnt) * sizeof(*secs)); + + obj->secs = secs; + obj->sec_cnt = new_cnt; + + sec = &obj->secs[new_cnt - 1]; + sec->id = new_cnt - 1; + sec->sec_name = sec_name; + + return sec; +} + +static int linker_load_obj_file(struct bpf_linker *linker, const char *filename, + const struct bpf_linker_file_opts *opts, + struct src_obj *obj) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + const int host_endianness = ELFDATA2LSB; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + const int host_endianness = ELFDATA2MSB; +#else +#error "Unknown __BYTE_ORDER__" +#endif + int err = 0; + Elf_Scn *scn; + Elf_Data *data; + Elf64_Ehdr *ehdr; + Elf64_Shdr *shdr; + struct src_sec *sec; + + pr_debug("linker: adding object file '%s'...\n", filename); + + obj->filename = filename; + + obj->fd = open(filename, O_RDONLY | O_CLOEXEC); + if (obj->fd < 0) { + err = -errno; + pr_warn("failed to open file '%s': %d\n", filename, err); + return err; + } + obj->elf = elf_begin(obj->fd, ELF_C_READ_MMAP, NULL); + if (!obj->elf) { + err = -errno; + pr_warn_elf("failed to parse ELF file '%s'", filename); + return err; + } + + /* Sanity check ELF file high-level properties */ + ehdr = elf64_getehdr(obj->elf); + if (!ehdr) { + err = -errno; + pr_warn_elf("failed to get ELF header for %s", filename); + return err; + } + if (ehdr->e_ident[EI_DATA] != host_endianness) { + err = -EOPNOTSUPP; + pr_warn_elf("unsupported byte order of ELF file %s", filename); + return err; + } + if (ehdr->e_type != ET_REL + || ehdr->e_machine != EM_BPF + || ehdr->e_ident[EI_CLASS] != ELFCLASS64) { + err = -EOPNOTSUPP; + pr_warn_elf("unsupported kind of ELF file %s", filename); + return err; + } + + if (elf_getshdrstrndx(obj->elf, &obj->shstrs_sec_idx)) { + err = -errno; + pr_warn_elf("failed to get SHSTRTAB section index for %s", filename); + return err; + } + + scn = NULL; + while ((scn = elf_nextscn(obj->elf, scn)) != NULL) { + size_t sec_idx = elf_ndxscn(scn); + const char *sec_name; + + shdr = elf64_getshdr(scn); + if (!shdr) { + err = -errno; + pr_warn_elf("failed to get section #%zu header for %s", + sec_idx, filename); + return err; + } + + sec_name = elf_strptr(obj->elf, obj->shstrs_sec_idx, shdr->sh_name); + if (!sec_name) { + err = -errno; + pr_warn_elf("failed to get section #%zu name for %s", + sec_idx, filename); + return err; + } + + data = elf_getdata(scn, 0); + if (!data) { + err = -errno; + pr_warn_elf("failed to get section #%zu (%s) data from %s", + sec_idx, sec_name, filename); + return err; + } + + sec = add_src_sec(obj, sec_name); + if (!sec) + return -ENOMEM; + + sec->scn = scn; + sec->shdr = shdr; + sec->data = data; + sec->sec_idx = elf_ndxscn(scn); + + if (is_ignored_sec(sec)) { + sec->skipped = true; + continue; + } + + switch (shdr->sh_type) { + case SHT_SYMTAB: + if (obj->symtab_sec_idx) { + err = -EOPNOTSUPP; + pr_warn("multiple SYMTAB sections found, not supported\n"); + return err; + } + obj->symtab_sec_idx = sec_idx; + break; + case SHT_STRTAB: + /* we'll construct our own string table */ + break; + case SHT_PROGBITS: + if (strcmp(sec_name, BTF_ELF_SEC) == 0) { + obj->btf = btf__new(data->d_buf, shdr->sh_size); + err = libbpf_get_error(obj->btf); + if (err) { + pr_warn("failed to parse .BTF from %s: %d\n", filename, err); + return err; + } + sec->skipped = true; + continue; + } + if (strcmp(sec_name, BTF_EXT_ELF_SEC) == 0) { + obj->btf_ext = btf_ext__new(data->d_buf, shdr->sh_size); + err = libbpf_get_error(obj->btf_ext); + if (err) { + pr_warn("failed to parse .BTF.ext from '%s': %d\n", filename, err); + return err; + } + sec->skipped = true; + continue; + } + + /* data & code */ + break; + case SHT_NOBITS: + /* BSS */ + break; + case SHT_REL: + /* relocations */ + break; + default: + pr_warn("unrecognized section #%zu (%s) in %s\n", + sec_idx, sec_name, filename); + err = -EINVAL; + return err; + } + } + + err = err ?: linker_sanity_check_elf(obj); + err = err ?: linker_sanity_check_btf(obj); + err = err ?: linker_sanity_check_btf_ext(obj); + err = err ?: linker_fixup_btf(obj); + + return err; +} + +static int linker_sanity_check_elf(struct src_obj *obj) +{ + struct src_sec *sec; + int i, err; + + if (!obj->symtab_sec_idx) { + pr_warn("ELF is missing SYMTAB section in %s\n", obj->filename); + return -EINVAL; + } + if (!obj->shstrs_sec_idx) { + pr_warn("ELF is missing section headers STRTAB section in %s\n", obj->filename); + return -EINVAL; + } + + for (i = 1; i < obj->sec_cnt; i++) { + sec = &obj->secs[i]; + + if (sec->sec_name[0] == '\0') { + pr_warn("ELF section #%zu has empty name in %s\n", sec->sec_idx, obj->filename); + return -EINVAL; + } + + if (sec->shdr->sh_addralign && !is_pow_of_2(sec->shdr->sh_addralign)) + return -EINVAL; + if (sec->shdr->sh_addralign != sec->data->d_align) + return -EINVAL; + + if (sec->shdr->sh_size != sec->data->d_size) + return -EINVAL; + + switch (sec->shdr->sh_type) { + case SHT_SYMTAB: + err = linker_sanity_check_elf_symtab(obj, sec); + if (err) + return err; + break; + case SHT_STRTAB: + break; + case SHT_PROGBITS: + if (sec->shdr->sh_flags & SHF_EXECINSTR) { + if (sec->shdr->sh_size % sizeof(struct bpf_insn) != 0) + return -EINVAL; + } + break; + case SHT_NOBITS: + break; + case SHT_REL: + err = linker_sanity_check_elf_relos(obj, sec); + if (err) + return err; + break; + case SHT_LLVM_ADDRSIG: + break; + default: + pr_warn("ELF section #%zu (%s) has unrecognized type %zu in %s\n", + sec->sec_idx, sec->sec_name, (size_t)sec->shdr->sh_type, obj->filename); + return -EINVAL; + } + } + + return 0; +} + +static int linker_sanity_check_elf_symtab(struct src_obj *obj, struct src_sec *sec) +{ + struct src_sec *link_sec; + Elf64_Sym *sym; + int i, n; + + if (sec->shdr->sh_entsize != sizeof(Elf64_Sym)) + return -EINVAL; + if (sec->shdr->sh_size % sec->shdr->sh_entsize != 0) + return -EINVAL; + + if (!sec->shdr->sh_link || sec->shdr->sh_link >= obj->sec_cnt) { + pr_warn("ELF SYMTAB section #%zu points to missing STRTAB section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_link, obj->filename); + return -EINVAL; + } + link_sec = &obj->secs[sec->shdr->sh_link]; + if (link_sec->shdr->sh_type != SHT_STRTAB) { + pr_warn("ELF SYMTAB section #%zu points to invalid STRTAB section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_link, obj->filename); + return -EINVAL; + } + + n = sec->shdr->sh_size / sec->shdr->sh_entsize; + sym = sec->data->d_buf; + for (i = 0; i < n; i++, sym++) { + int sym_type = ELF64_ST_TYPE(sym->st_info); + int sym_bind = ELF64_ST_BIND(sym->st_info); + int sym_vis = ELF64_ST_VISIBILITY(sym->st_other); + + if (i == 0) { + if (sym->st_name != 0 || sym->st_info != 0 + || sym->st_other != 0 || sym->st_shndx != 0 + || sym->st_value != 0 || sym->st_size != 0) { + pr_warn("ELF sym #0 is invalid in %s\n", obj->filename); + return -EINVAL; + } + continue; + } + if (sym_bind != STB_LOCAL && sym_bind != STB_GLOBAL && sym_bind != STB_WEAK) { + pr_warn("ELF sym #%d in section #%zu has unsupported symbol binding %d\n", + i, sec->sec_idx, sym_bind); + return -EINVAL; + } + if (sym_vis != STV_DEFAULT && sym_vis != STV_HIDDEN) { + pr_warn("ELF sym #%d in section #%zu has unsupported symbol visibility %d\n", + i, sec->sec_idx, sym_vis); + return -EINVAL; + } + if (sym->st_shndx == 0) { + if (sym_type != STT_NOTYPE || sym_bind == STB_LOCAL + || sym->st_value != 0 || sym->st_size != 0) { + pr_warn("ELF sym #%d is invalid extern symbol in %s\n", + i, obj->filename); + + return -EINVAL; + } + continue; + } + if (sym->st_shndx < SHN_LORESERVE && sym->st_shndx >= obj->sec_cnt) { + pr_warn("ELF sym #%d in section #%zu points to missing section #%zu in %s\n", + i, sec->sec_idx, (size_t)sym->st_shndx, obj->filename); + return -EINVAL; + } + if (sym_type == STT_SECTION) { + if (sym->st_value != 0) + return -EINVAL; + continue; + } + } + + return 0; +} + +static int linker_sanity_check_elf_relos(struct src_obj *obj, struct src_sec *sec) +{ + struct src_sec *link_sec, *sym_sec; + Elf64_Rel *relo; + int i, n; + + if (sec->shdr->sh_entsize != sizeof(Elf64_Rel)) + return -EINVAL; + if (sec->shdr->sh_size % sec->shdr->sh_entsize != 0) + return -EINVAL; + + /* SHT_REL's sh_link should point to SYMTAB */ + if (sec->shdr->sh_link != obj->symtab_sec_idx) { + pr_warn("ELF relo section #%zu points to invalid SYMTAB section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_link, obj->filename); + return -EINVAL; + } + + /* SHT_REL's sh_info points to relocated section */ + if (!sec->shdr->sh_info || sec->shdr->sh_info >= obj->sec_cnt) { + pr_warn("ELF relo section #%zu points to missing section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_info, obj->filename); + return -EINVAL; + } + link_sec = &obj->secs[sec->shdr->sh_info]; + + /* .rel -> pattern is followed */ + if (strncmp(sec->sec_name, ".rel", sizeof(".rel") - 1) != 0 + || strcmp(sec->sec_name + sizeof(".rel") - 1, link_sec->sec_name) != 0) { + pr_warn("ELF relo section #%zu name has invalid name in %s\n", + sec->sec_idx, obj->filename); + return -EINVAL; + } + + /* don't further validate relocations for ignored sections */ + if (link_sec->skipped) + return 0; + + /* relocatable section is data or instructions */ + if (link_sec->shdr->sh_type != SHT_PROGBITS && link_sec->shdr->sh_type != SHT_NOBITS) { + pr_warn("ELF relo section #%zu points to invalid section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_info, obj->filename); + return -EINVAL; + } + + /* check sanity of each relocation */ + n = sec->shdr->sh_size / sec->shdr->sh_entsize; + relo = sec->data->d_buf; + sym_sec = &obj->secs[obj->symtab_sec_idx]; + for (i = 0; i < n; i++, relo++) { + size_t sym_idx = ELF64_R_SYM(relo->r_info); + size_t sym_type = ELF64_R_TYPE(relo->r_info); + + if (sym_type != R_BPF_64_64 && sym_type != R_BPF_64_32 && + sym_type != R_BPF_64_ABS64 && sym_type != R_BPF_64_ABS32) { + pr_warn("ELF relo #%d in section #%zu has unexpected type %zu in %s\n", + i, sec->sec_idx, sym_type, obj->filename); + return -EINVAL; + } + + if (!sym_idx || sym_idx * sizeof(Elf64_Sym) >= sym_sec->shdr->sh_size) { + pr_warn("ELF relo #%d in section #%zu points to invalid symbol #%zu in %s\n", + i, sec->sec_idx, sym_idx, obj->filename); + return -EINVAL; + } + + if (link_sec->shdr->sh_flags & SHF_EXECINSTR) { + if (relo->r_offset % sizeof(struct bpf_insn) != 0) { + pr_warn("ELF relo #%d in section #%zu points to missing symbol #%zu in %s\n", + i, sec->sec_idx, sym_idx, obj->filename); + return -EINVAL; + } + } + } + + return 0; +} + +static int check_btf_type_id(__u32 *type_id, void *ctx) +{ + struct btf *btf = ctx; + + if (*type_id >= btf__type_cnt(btf)) + return -EINVAL; + + return 0; +} + +static int check_btf_str_off(__u32 *str_off, void *ctx) +{ + struct btf *btf = ctx; + const char *s; + + s = btf__str_by_offset(btf, *str_off); + + if (!s) + return -EINVAL; + + return 0; +} + +static int linker_sanity_check_btf(struct src_obj *obj) +{ + struct btf_type *t; + int i, n, err = 0; + + if (!obj->btf) + return 0; + + n = btf__type_cnt(obj->btf); + for (i = 1; i < n; i++) { + t = btf_type_by_id(obj->btf, i); + + err = err ?: btf_type_visit_type_ids(t, check_btf_type_id, obj->btf); + err = err ?: btf_type_visit_str_offs(t, check_btf_str_off, obj->btf); + if (err) + return err; + } + + return 0; +} + +static int linker_sanity_check_btf_ext(struct src_obj *obj) +{ + int err = 0; + + if (!obj->btf_ext) + return 0; + + /* can't use .BTF.ext without .BTF */ + if (!obj->btf) + return -EINVAL; + + err = err ?: btf_ext_visit_type_ids(obj->btf_ext, check_btf_type_id, obj->btf); + err = err ?: btf_ext_visit_str_offs(obj->btf_ext, check_btf_str_off, obj->btf); + if (err) + return err; + + return 0; +} + +static int init_sec(struct bpf_linker *linker, struct dst_sec *dst_sec, struct src_sec *src_sec) +{ + Elf_Scn *scn; + Elf_Data *data; + Elf64_Shdr *shdr; + int name_off; + + dst_sec->sec_sz = 0; + dst_sec->sec_idx = 0; + dst_sec->ephemeral = src_sec->ephemeral; + + /* ephemeral sections are just thin section shells lacking most parts */ + if (src_sec->ephemeral) + return 0; + + scn = elf_newscn(linker->elf); + if (!scn) + return -ENOMEM; + data = elf_newdata(scn); + if (!data) + return -ENOMEM; + shdr = elf64_getshdr(scn); + if (!shdr) + return -ENOMEM; + + dst_sec->scn = scn; + dst_sec->shdr = shdr; + dst_sec->data = data; + dst_sec->sec_idx = elf_ndxscn(scn); + + name_off = strset__add_str(linker->strtab_strs, src_sec->sec_name); + if (name_off < 0) + return name_off; + + shdr->sh_name = name_off; + shdr->sh_type = src_sec->shdr->sh_type; + shdr->sh_flags = src_sec->shdr->sh_flags; + shdr->sh_size = 0; + /* sh_link and sh_info have different meaning for different types of + * sections, so we leave it up to the caller code to fill them in, if + * necessary + */ + shdr->sh_link = 0; + shdr->sh_info = 0; + shdr->sh_addralign = src_sec->shdr->sh_addralign; + shdr->sh_entsize = src_sec->shdr->sh_entsize; + + data->d_type = src_sec->data->d_type; + data->d_size = 0; + data->d_buf = NULL; + data->d_align = src_sec->data->d_align; + data->d_off = 0; + + return 0; +} + +static struct dst_sec *find_dst_sec_by_name(struct bpf_linker *linker, const char *sec_name) +{ + struct dst_sec *sec; + int i; + + for (i = 1; i < linker->sec_cnt; i++) { + sec = &linker->secs[i]; + + if (strcmp(sec->sec_name, sec_name) == 0) + return sec; + } + + return NULL; +} + +static bool secs_match(struct dst_sec *dst, struct src_sec *src) +{ + if (dst->ephemeral || src->ephemeral) + return true; + + if (dst->shdr->sh_type != src->shdr->sh_type) { + pr_warn("sec %s types mismatch\n", dst->sec_name); + return false; + } + if (dst->shdr->sh_flags != src->shdr->sh_flags) { + pr_warn("sec %s flags mismatch\n", dst->sec_name); + return false; + } + if (dst->shdr->sh_entsize != src->shdr->sh_entsize) { + pr_warn("sec %s entsize mismatch\n", dst->sec_name); + return false; + } + + return true; +} + +static bool sec_content_is_same(struct dst_sec *dst_sec, struct src_sec *src_sec) +{ + if (dst_sec->sec_sz != src_sec->shdr->sh_size) + return false; + if (memcmp(dst_sec->raw_data, src_sec->data->d_buf, dst_sec->sec_sz) != 0) + return false; + return true; +} + +static int extend_sec(struct bpf_linker *linker, struct dst_sec *dst, struct src_sec *src) +{ + void *tmp; + size_t dst_align, src_align; + size_t dst_align_sz, dst_final_sz; + int err; + + /* Ephemeral source section doesn't contribute anything to ELF + * section data. + */ + if (src->ephemeral) + return 0; + + /* Some sections (like .maps) can contain both externs (and thus be + * ephemeral) and non-externs (map definitions). So it's possible that + * it has to be "upgraded" from ephemeral to non-ephemeral when the + * first non-ephemeral entity appears. In such case, we add ELF + * section, data, etc. + */ + if (dst->ephemeral) { + err = init_sec(linker, dst, src); + if (err) + return err; + } + + dst_align = dst->shdr->sh_addralign; + src_align = src->shdr->sh_addralign; + if (dst_align == 0) + dst_align = 1; + if (dst_align < src_align) + dst_align = src_align; + + dst_align_sz = (dst->sec_sz + dst_align - 1) / dst_align * dst_align; + + /* no need to re-align final size */ + dst_final_sz = dst_align_sz + src->shdr->sh_size; + + if (src->shdr->sh_type != SHT_NOBITS) { + tmp = realloc(dst->raw_data, dst_final_sz); + if (!tmp) + return -ENOMEM; + dst->raw_data = tmp; + + /* pad dst section, if it's alignment forced size increase */ + memset(dst->raw_data + dst->sec_sz, 0, dst_align_sz - dst->sec_sz); + /* now copy src data at a properly aligned offset */ + memcpy(dst->raw_data + dst_align_sz, src->data->d_buf, src->shdr->sh_size); + } + + dst->sec_sz = dst_final_sz; + dst->shdr->sh_size = dst_final_sz; + dst->data->d_size = dst_final_sz; + + dst->shdr->sh_addralign = dst_align; + dst->data->d_align = dst_align; + + src->dst_off = dst_align_sz; + + return 0; +} + +static bool is_data_sec(struct src_sec *sec) +{ + if (!sec || sec->skipped) + return false; + /* ephemeral sections are data sections, e.g., .kconfig, .ksyms */ + if (sec->ephemeral) + return true; + return sec->shdr->sh_type == SHT_PROGBITS || sec->shdr->sh_type == SHT_NOBITS; +} + +static bool is_relo_sec(struct src_sec *sec) +{ + if (!sec || sec->skipped || sec->ephemeral) + return false; + return sec->shdr->sh_type == SHT_REL; +} + +static int linker_append_sec_data(struct bpf_linker *linker, struct src_obj *obj) +{ + int i, err; + + for (i = 1; i < obj->sec_cnt; i++) { + struct src_sec *src_sec; + struct dst_sec *dst_sec; + + src_sec = &obj->secs[i]; + if (!is_data_sec(src_sec)) + continue; + + dst_sec = find_dst_sec_by_name(linker, src_sec->sec_name); + if (!dst_sec) { + dst_sec = add_dst_sec(linker, src_sec->sec_name); + if (!dst_sec) + return -ENOMEM; + err = init_sec(linker, dst_sec, src_sec); + if (err) { + pr_warn("failed to init section '%s'\n", src_sec->sec_name); + return err; + } + } else { + if (!secs_match(dst_sec, src_sec)) { + pr_warn("ELF sections %s are incompatible\n", src_sec->sec_name); + return -1; + } + + /* "license" and "version" sections are deduped */ + if (strcmp(src_sec->sec_name, "license") == 0 + || strcmp(src_sec->sec_name, "version") == 0) { + if (!sec_content_is_same(dst_sec, src_sec)) { + pr_warn("non-identical contents of section '%s' are not supported\n", src_sec->sec_name); + return -EINVAL; + } + src_sec->skipped = true; + src_sec->dst_id = dst_sec->id; + continue; + } + } + + /* record mapped section index */ + src_sec->dst_id = dst_sec->id; + + err = extend_sec(linker, dst_sec, src_sec); + if (err) + return err; + } + + return 0; +} + +static int linker_append_elf_syms(struct bpf_linker *linker, struct src_obj *obj) +{ + struct src_sec *symtab = &obj->secs[obj->symtab_sec_idx]; + Elf64_Sym *sym = symtab->data->d_buf; + int i, n = symtab->shdr->sh_size / symtab->shdr->sh_entsize, err; + int str_sec_idx = symtab->shdr->sh_link; + const char *sym_name; + + obj->sym_map = calloc(n + 1, sizeof(*obj->sym_map)); + if (!obj->sym_map) + return -ENOMEM; + + for (i = 0; i < n; i++, sym++) { + /* We already validated all-zero symbol #0 and we already + * appended it preventively to the final SYMTAB, so skip it. + */ + if (i == 0) + continue; + + sym_name = elf_strptr(obj->elf, str_sec_idx, sym->st_name); + if (!sym_name) { + pr_warn("can't fetch symbol name for symbol #%d in '%s'\n", i, obj->filename); + return -EINVAL; + } + + err = linker_append_elf_sym(linker, obj, sym, sym_name, i); + if (err) + return err; + } + + return 0; +} + +static Elf64_Sym *get_sym_by_idx(struct bpf_linker *linker, size_t sym_idx) +{ + struct dst_sec *symtab = &linker->secs[linker->symtab_sec_idx]; + Elf64_Sym *syms = symtab->raw_data; + + return &syms[sym_idx]; +} + +static struct glob_sym *find_glob_sym(struct bpf_linker *linker, const char *sym_name) +{ + struct glob_sym *glob_sym; + const char *name; + int i; + + for (i = 0; i < linker->glob_sym_cnt; i++) { + glob_sym = &linker->glob_syms[i]; + name = strset__data(linker->strtab_strs) + glob_sym->name_off; + + if (strcmp(name, sym_name) == 0) + return glob_sym; + } + + return NULL; +} + +static struct glob_sym *add_glob_sym(struct bpf_linker *linker) +{ + struct glob_sym *syms, *sym; + + syms = libbpf_reallocarray(linker->glob_syms, linker->glob_sym_cnt + 1, + sizeof(*linker->glob_syms)); + if (!syms) + return NULL; + + sym = &syms[linker->glob_sym_cnt]; + memset(sym, 0, sizeof(*sym)); + sym->var_idx = -1; + + linker->glob_syms = syms; + linker->glob_sym_cnt++; + + return sym; +} + +static bool glob_sym_btf_matches(const char *sym_name, bool exact, + const struct btf *btf1, __u32 id1, + const struct btf *btf2, __u32 id2) +{ + const struct btf_type *t1, *t2; + bool is_static1, is_static2; + const char *n1, *n2; + int i, n; + +recur: + n1 = n2 = NULL; + t1 = skip_mods_and_typedefs(btf1, id1, &id1); + t2 = skip_mods_and_typedefs(btf2, id2, &id2); + + /* check if only one side is FWD, otherwise handle with common logic */ + if (!exact && btf_is_fwd(t1) != btf_is_fwd(t2)) { + n1 = btf__str_by_offset(btf1, t1->name_off); + n2 = btf__str_by_offset(btf2, t2->name_off); + if (strcmp(n1, n2) != 0) { + pr_warn("global '%s': incompatible forward declaration names '%s' and '%s'\n", + sym_name, n1, n2); + return false; + } + /* validate if FWD kind matches concrete kind */ + if (btf_is_fwd(t1)) { + if (btf_kflag(t1) && btf_is_union(t2)) + return true; + if (!btf_kflag(t1) && btf_is_struct(t2)) + return true; + pr_warn("global '%s': incompatible %s forward declaration and concrete kind %s\n", + sym_name, btf_kflag(t1) ? "union" : "struct", btf_kind_str(t2)); + } else { + if (btf_kflag(t2) && btf_is_union(t1)) + return true; + if (!btf_kflag(t2) && btf_is_struct(t1)) + return true; + pr_warn("global '%s': incompatible %s forward declaration and concrete kind %s\n", + sym_name, btf_kflag(t2) ? "union" : "struct", btf_kind_str(t1)); + } + return false; + } + + if (btf_kind(t1) != btf_kind(t2)) { + pr_warn("global '%s': incompatible BTF kinds %s and %s\n", + sym_name, btf_kind_str(t1), btf_kind_str(t2)); + return false; + } + + switch (btf_kind(t1)) { + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FWD: + case BTF_KIND_FUNC: + case BTF_KIND_VAR: + n1 = btf__str_by_offset(btf1, t1->name_off); + n2 = btf__str_by_offset(btf2, t2->name_off); + if (strcmp(n1, n2) != 0) { + pr_warn("global '%s': incompatible %s names '%s' and '%s'\n", + sym_name, btf_kind_str(t1), n1, n2); + return false; + } + break; + default: + break; + } + + switch (btf_kind(t1)) { + case BTF_KIND_UNKN: /* void */ + case BTF_KIND_FWD: + return true; + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + /* ignore encoding for int and enum values for enum */ + if (t1->size != t2->size) { + pr_warn("global '%s': incompatible %s '%s' size %u and %u\n", + sym_name, btf_kind_str(t1), n1, t1->size, t2->size); + return false; + } + return true; + case BTF_KIND_PTR: + /* just validate overall shape of the referenced type, so no + * contents comparison for struct/union, and allowd fwd vs + * struct/union + */ + exact = false; + id1 = t1->type; + id2 = t2->type; + goto recur; + case BTF_KIND_ARRAY: + /* ignore index type and array size */ + id1 = btf_array(t1)->type; + id2 = btf_array(t2)->type; + goto recur; + case BTF_KIND_FUNC: + /* extern and global linkages are compatible */ + is_static1 = btf_func_linkage(t1) == BTF_FUNC_STATIC; + is_static2 = btf_func_linkage(t2) == BTF_FUNC_STATIC; + if (is_static1 != is_static2) { + pr_warn("global '%s': incompatible func '%s' linkage\n", sym_name, n1); + return false; + } + + id1 = t1->type; + id2 = t2->type; + goto recur; + case BTF_KIND_VAR: + /* extern and global linkages are compatible */ + is_static1 = btf_var(t1)->linkage == BTF_VAR_STATIC; + is_static2 = btf_var(t2)->linkage == BTF_VAR_STATIC; + if (is_static1 != is_static2) { + pr_warn("global '%s': incompatible var '%s' linkage\n", sym_name, n1); + return false; + } + + id1 = t1->type; + id2 = t2->type; + goto recur; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m1, *m2; + + if (!exact) + return true; + + if (btf_vlen(t1) != btf_vlen(t2)) { + pr_warn("global '%s': incompatible number of %s fields %u and %u\n", + sym_name, btf_kind_str(t1), btf_vlen(t1), btf_vlen(t2)); + return false; + } + + n = btf_vlen(t1); + m1 = btf_members(t1); + m2 = btf_members(t2); + for (i = 0; i < n; i++, m1++, m2++) { + n1 = btf__str_by_offset(btf1, m1->name_off); + n2 = btf__str_by_offset(btf2, m2->name_off); + if (strcmp(n1, n2) != 0) { + pr_warn("global '%s': incompatible field #%d names '%s' and '%s'\n", + sym_name, i, n1, n2); + return false; + } + if (m1->offset != m2->offset) { + pr_warn("global '%s': incompatible field #%d ('%s') offsets\n", + sym_name, i, n1); + return false; + } + if (!glob_sym_btf_matches(sym_name, exact, btf1, m1->type, btf2, m2->type)) + return false; + } + + return true; + } + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *m1, *m2; + + if (btf_vlen(t1) != btf_vlen(t2)) { + pr_warn("global '%s': incompatible number of %s params %u and %u\n", + sym_name, btf_kind_str(t1), btf_vlen(t1), btf_vlen(t2)); + return false; + } + + n = btf_vlen(t1); + m1 = btf_params(t1); + m2 = btf_params(t2); + for (i = 0; i < n; i++, m1++, m2++) { + /* ignore func arg names */ + if (!glob_sym_btf_matches(sym_name, exact, btf1, m1->type, btf2, m2->type)) + return false; + } + + /* now check return type as well */ + id1 = t1->type; + id2 = t2->type; + goto recur; + } + + /* skip_mods_and_typedefs() make this impossible */ + case BTF_KIND_TYPEDEF: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + /* DATASECs are never compared with each other */ + case BTF_KIND_DATASEC: + default: + pr_warn("global '%s': unsupported BTF kind %s\n", + sym_name, btf_kind_str(t1)); + return false; + } +} + +static bool map_defs_match(const char *sym_name, + const struct btf *main_btf, + const struct btf_map_def *main_def, + const struct btf_map_def *main_inner_def, + const struct btf *extra_btf, + const struct btf_map_def *extra_def, + const struct btf_map_def *extra_inner_def) +{ + const char *reason; + + if (main_def->map_type != extra_def->map_type) { + reason = "type"; + goto mismatch; + } + + /* check key type/size match */ + if (main_def->key_size != extra_def->key_size) { + reason = "key_size"; + goto mismatch; + } + if (!!main_def->key_type_id != !!extra_def->key_type_id) { + reason = "key type"; + goto mismatch; + } + if ((main_def->parts & MAP_DEF_KEY_TYPE) + && !glob_sym_btf_matches(sym_name, true /*exact*/, + main_btf, main_def->key_type_id, + extra_btf, extra_def->key_type_id)) { + reason = "key type"; + goto mismatch; + } + + /* validate value type/size match */ + if (main_def->value_size != extra_def->value_size) { + reason = "value_size"; + goto mismatch; + } + if (!!main_def->value_type_id != !!extra_def->value_type_id) { + reason = "value type"; + goto mismatch; + } + if ((main_def->parts & MAP_DEF_VALUE_TYPE) + && !glob_sym_btf_matches(sym_name, true /*exact*/, + main_btf, main_def->value_type_id, + extra_btf, extra_def->value_type_id)) { + reason = "key type"; + goto mismatch; + } + + if (main_def->max_entries != extra_def->max_entries) { + reason = "max_entries"; + goto mismatch; + } + if (main_def->map_flags != extra_def->map_flags) { + reason = "map_flags"; + goto mismatch; + } + if (main_def->numa_node != extra_def->numa_node) { + reason = "numa_node"; + goto mismatch; + } + if (main_def->pinning != extra_def->pinning) { + reason = "pinning"; + goto mismatch; + } + + if ((main_def->parts & MAP_DEF_INNER_MAP) != (extra_def->parts & MAP_DEF_INNER_MAP)) { + reason = "inner map"; + goto mismatch; + } + + if (main_def->parts & MAP_DEF_INNER_MAP) { + char inner_map_name[128]; + + snprintf(inner_map_name, sizeof(inner_map_name), "%s.inner", sym_name); + + return map_defs_match(inner_map_name, + main_btf, main_inner_def, NULL, + extra_btf, extra_inner_def, NULL); + } + + return true; + +mismatch: + pr_warn("global '%s': map %s mismatch\n", sym_name, reason); + return false; +} + +static bool glob_map_defs_match(const char *sym_name, + struct bpf_linker *linker, struct glob_sym *glob_sym, + struct src_obj *obj, Elf64_Sym *sym, int btf_id) +{ + struct btf_map_def dst_def = {}, dst_inner_def = {}; + struct btf_map_def src_def = {}, src_inner_def = {}; + const struct btf_type *t; + int err; + + t = btf__type_by_id(obj->btf, btf_id); + if (!btf_is_var(t)) { + pr_warn("global '%s': invalid map definition type [%d]\n", sym_name, btf_id); + return false; + } + t = skip_mods_and_typedefs(obj->btf, t->type, NULL); + + err = parse_btf_map_def(sym_name, obj->btf, t, true /*strict*/, &src_def, &src_inner_def); + if (err) { + pr_warn("global '%s': invalid map definition\n", sym_name); + return false; + } + + /* re-parse existing map definition */ + t = btf__type_by_id(linker->btf, glob_sym->btf_id); + t = skip_mods_and_typedefs(linker->btf, t->type, NULL); + err = parse_btf_map_def(sym_name, linker->btf, t, true /*strict*/, &dst_def, &dst_inner_def); + if (err) { + /* this should not happen, because we already validated it */ + pr_warn("global '%s': invalid dst map definition\n", sym_name); + return false; + } + + /* Currently extern map definition has to be complete and match + * concrete map definition exactly. This restriction might be lifted + * in the future. + */ + return map_defs_match(sym_name, linker->btf, &dst_def, &dst_inner_def, + obj->btf, &src_def, &src_inner_def); +} + +static bool glob_syms_match(const char *sym_name, + struct bpf_linker *linker, struct glob_sym *glob_sym, + struct src_obj *obj, Elf64_Sym *sym, size_t sym_idx, int btf_id) +{ + const struct btf_type *src_t; + + /* if we are dealing with externs, BTF types describing both global + * and extern VARs/FUNCs should be completely present in all files + */ + if (!glob_sym->btf_id || !btf_id) { + pr_warn("BTF info is missing for global symbol '%s'\n", sym_name); + return false; + } + + src_t = btf__type_by_id(obj->btf, btf_id); + if (!btf_is_var(src_t) && !btf_is_func(src_t)) { + pr_warn("only extern variables and functions are supported, but got '%s' for '%s'\n", + btf_kind_str(src_t), sym_name); + return false; + } + + /* deal with .maps definitions specially */ + if (glob_sym->sec_id && strcmp(linker->secs[glob_sym->sec_id].sec_name, MAPS_ELF_SEC) == 0) + return glob_map_defs_match(sym_name, linker, glob_sym, obj, sym, btf_id); + + if (!glob_sym_btf_matches(sym_name, true /*exact*/, + linker->btf, glob_sym->btf_id, obj->btf, btf_id)) + return false; + + return true; +} + +static bool btf_is_non_static(const struct btf_type *t) +{ + return (btf_is_var(t) && btf_var(t)->linkage != BTF_VAR_STATIC) + || (btf_is_func(t) && btf_func_linkage(t) != BTF_FUNC_STATIC); +} + +static int find_glob_sym_btf(struct src_obj *obj, Elf64_Sym *sym, const char *sym_name, + int *out_btf_sec_id, int *out_btf_id) +{ + int i, j, n, m, btf_id = 0; + const struct btf_type *t; + const struct btf_var_secinfo *vi; + const char *name; + + if (!obj->btf) { + pr_warn("failed to find BTF info for object '%s'\n", obj->filename); + return -EINVAL; + } + + n = btf__type_cnt(obj->btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(obj->btf, i); + + /* some global and extern FUNCs and VARs might not be associated with any + * DATASEC, so try to detect them in the same pass + */ + if (btf_is_non_static(t)) { + name = btf__str_by_offset(obj->btf, t->name_off); + if (strcmp(name, sym_name) != 0) + continue; + + /* remember and still try to find DATASEC */ + btf_id = i; + continue; + } + + if (!btf_is_datasec(t)) + continue; + + vi = btf_var_secinfos(t); + for (j = 0, m = btf_vlen(t); j < m; j++, vi++) { + t = btf__type_by_id(obj->btf, vi->type); + name = btf__str_by_offset(obj->btf, t->name_off); + + if (strcmp(name, sym_name) != 0) + continue; + if (btf_is_var(t) && btf_var(t)->linkage == BTF_VAR_STATIC) + continue; + if (btf_is_func(t) && btf_func_linkage(t) == BTF_FUNC_STATIC) + continue; + + if (btf_id && btf_id != vi->type) { + pr_warn("global/extern '%s' BTF is ambiguous: both types #%d and #%u match\n", + sym_name, btf_id, vi->type); + return -EINVAL; + } + + *out_btf_sec_id = i; + *out_btf_id = vi->type; + + return 0; + } + } + + /* free-floating extern or global FUNC */ + if (btf_id) { + *out_btf_sec_id = 0; + *out_btf_id = btf_id; + return 0; + } + + pr_warn("failed to find BTF info for global/extern symbol '%s'\n", sym_name); + return -ENOENT; +} + +static struct src_sec *find_src_sec_by_name(struct src_obj *obj, const char *sec_name) +{ + struct src_sec *sec; + int i; + + for (i = 1; i < obj->sec_cnt; i++) { + sec = &obj->secs[i]; + + if (strcmp(sec->sec_name, sec_name) == 0) + return sec; + } + + return NULL; +} + +static int complete_extern_btf_info(struct btf *dst_btf, int dst_id, + struct btf *src_btf, int src_id) +{ + struct btf_type *dst_t = btf_type_by_id(dst_btf, dst_id); + struct btf_type *src_t = btf_type_by_id(src_btf, src_id); + struct btf_param *src_p, *dst_p; + const char *s; + int i, n, off; + + /* We already made sure that source and destination types (FUNC or + * VAR) match in terms of types and argument names. + */ + if (btf_is_var(dst_t)) { + btf_var(dst_t)->linkage = BTF_VAR_GLOBAL_ALLOCATED; + return 0; + } + + dst_t->info = btf_type_info(BTF_KIND_FUNC, BTF_FUNC_GLOBAL, 0); + + /* now onto FUNC_PROTO types */ + src_t = btf_type_by_id(src_btf, src_t->type); + dst_t = btf_type_by_id(dst_btf, dst_t->type); + + /* Fill in all the argument names, which for extern FUNCs are missing. + * We'll end up with two copies of FUNCs/VARs for externs, but that + * will be taken care of by BTF dedup at the very end. + * It might be that BTF types for extern in one file has less/more BTF + * information (e.g., FWD instead of full STRUCT/UNION information), + * but that should be (in most cases, subject to BTF dedup rules) + * handled and resolved by BTF dedup algorithm as well, so we won't + * worry about it. Our only job is to make sure that argument names + * are populated on both sides, otherwise BTF dedup will pedantically + * consider them different. + */ + src_p = btf_params(src_t); + dst_p = btf_params(dst_t); + for (i = 0, n = btf_vlen(dst_t); i < n; i++, src_p++, dst_p++) { + if (!src_p->name_off) + continue; + + /* src_btf has more complete info, so add name to dst_btf */ + s = btf__str_by_offset(src_btf, src_p->name_off); + off = btf__add_str(dst_btf, s); + if (off < 0) + return off; + dst_p->name_off = off; + } + return 0; +} + +static void sym_update_bind(Elf64_Sym *sym, int sym_bind) +{ + sym->st_info = ELF64_ST_INFO(sym_bind, ELF64_ST_TYPE(sym->st_info)); +} + +static void sym_update_type(Elf64_Sym *sym, int sym_type) +{ + sym->st_info = ELF64_ST_INFO(ELF64_ST_BIND(sym->st_info), sym_type); +} + +static void sym_update_visibility(Elf64_Sym *sym, int sym_vis) +{ + /* libelf doesn't provide setters for ST_VISIBILITY, + * but it is stored in the lower 2 bits of st_other + */ + sym->st_other &= ~0x03; + sym->st_other |= sym_vis; +} + +static int linker_append_elf_sym(struct bpf_linker *linker, struct src_obj *obj, + Elf64_Sym *sym, const char *sym_name, int src_sym_idx) +{ + struct src_sec *src_sec = NULL; + struct dst_sec *dst_sec = NULL; + struct glob_sym *glob_sym = NULL; + int name_off, sym_type, sym_bind, sym_vis, err; + int btf_sec_id = 0, btf_id = 0; + size_t dst_sym_idx; + Elf64_Sym *dst_sym; + bool sym_is_extern; + + sym_type = ELF64_ST_TYPE(sym->st_info); + sym_bind = ELF64_ST_BIND(sym->st_info); + sym_vis = ELF64_ST_VISIBILITY(sym->st_other); + sym_is_extern = sym->st_shndx == SHN_UNDEF; + + if (sym_is_extern) { + if (!obj->btf) { + pr_warn("externs without BTF info are not supported\n"); + return -ENOTSUP; + } + } else if (sym->st_shndx < SHN_LORESERVE) { + src_sec = &obj->secs[sym->st_shndx]; + if (src_sec->skipped) + return 0; + dst_sec = &linker->secs[src_sec->dst_id]; + + /* allow only one STT_SECTION symbol per section */ + if (sym_type == STT_SECTION && dst_sec->sec_sym_idx) { + obj->sym_map[src_sym_idx] = dst_sec->sec_sym_idx; + return 0; + } + } + + if (sym_bind == STB_LOCAL) + goto add_sym; + + /* find matching BTF info */ + err = find_glob_sym_btf(obj, sym, sym_name, &btf_sec_id, &btf_id); + if (err) + return err; + + if (sym_is_extern && btf_sec_id) { + const char *sec_name = NULL; + const struct btf_type *t; + + t = btf__type_by_id(obj->btf, btf_sec_id); + sec_name = btf__str_by_offset(obj->btf, t->name_off); + + /* Clang puts unannotated extern vars into + * '.extern' BTF DATASEC. Treat them the same + * as unannotated extern funcs (which are + * currently not put into any DATASECs). + * Those don't have associated src_sec/dst_sec. + */ + if (strcmp(sec_name, BTF_EXTERN_SEC) != 0) { + src_sec = find_src_sec_by_name(obj, sec_name); + if (!src_sec) { + pr_warn("failed to find matching ELF sec '%s'\n", sec_name); + return -ENOENT; + } + dst_sec = &linker->secs[src_sec->dst_id]; + } + } + + glob_sym = find_glob_sym(linker, sym_name); + if (glob_sym) { + /* Preventively resolve to existing symbol. This is + * needed for further relocation symbol remapping in + * the next step of linking. + */ + obj->sym_map[src_sym_idx] = glob_sym->sym_idx; + + /* If both symbols are non-externs, at least one of + * them has to be STB_WEAK, otherwise they are in + * a conflict with each other. + */ + if (!sym_is_extern && !glob_sym->is_extern + && !glob_sym->is_weak && sym_bind != STB_WEAK) { + pr_warn("conflicting non-weak symbol #%d (%s) definition in '%s'\n", + src_sym_idx, sym_name, obj->filename); + return -EINVAL; + } + + if (!glob_syms_match(sym_name, linker, glob_sym, obj, sym, src_sym_idx, btf_id)) + return -EINVAL; + + dst_sym = get_sym_by_idx(linker, glob_sym->sym_idx); + + /* If new symbol is strong, then force dst_sym to be strong as + * well; this way a mix of weak and non-weak extern + * definitions will end up being strong. + */ + if (sym_bind == STB_GLOBAL) { + /* We still need to preserve type (NOTYPE or + * OBJECT/FUNC, depending on whether the symbol is + * extern or not) + */ + sym_update_bind(dst_sym, STB_GLOBAL); + glob_sym->is_weak = false; + } + + /* Non-default visibility is "contaminating", with stricter + * visibility overwriting more permissive ones, even if more + * permissive visibility comes from just an extern definition. + * Currently only STV_DEFAULT and STV_HIDDEN are allowed and + * ensured by ELF symbol sanity checks above. + */ + if (sym_vis > ELF64_ST_VISIBILITY(dst_sym->st_other)) + sym_update_visibility(dst_sym, sym_vis); + + /* If the new symbol is extern, then regardless if + * existing symbol is extern or resolved global, just + * keep the existing one untouched. + */ + if (sym_is_extern) + return 0; + + /* If existing symbol is a strong resolved symbol, bail out, + * because we lost resolution battle have nothing to + * contribute. We already checked abover that there is no + * strong-strong conflict. We also already tightened binding + * and visibility, so nothing else to contribute at that point. + */ + if (!glob_sym->is_extern && sym_bind == STB_WEAK) + return 0; + + /* At this point, new symbol is strong non-extern, + * so overwrite glob_sym with new symbol information. + * Preserve binding and visibility. + */ + sym_update_type(dst_sym, sym_type); + dst_sym->st_shndx = dst_sec->sec_idx; + dst_sym->st_value = src_sec->dst_off + sym->st_value; + dst_sym->st_size = sym->st_size; + + /* see comment below about dst_sec->id vs dst_sec->sec_idx */ + glob_sym->sec_id = dst_sec->id; + glob_sym->is_extern = false; + + if (complete_extern_btf_info(linker->btf, glob_sym->btf_id, + obj->btf, btf_id)) + return -EINVAL; + + /* request updating VAR's/FUNC's underlying BTF type when appending BTF type */ + glob_sym->underlying_btf_id = 0; + + obj->sym_map[src_sym_idx] = glob_sym->sym_idx; + return 0; + } + +add_sym: + name_off = strset__add_str(linker->strtab_strs, sym_name); + if (name_off < 0) + return name_off; + + dst_sym = add_new_sym(linker, &dst_sym_idx); + if (!dst_sym) + return -ENOMEM; + + dst_sym->st_name = name_off; + dst_sym->st_info = sym->st_info; + dst_sym->st_other = sym->st_other; + dst_sym->st_shndx = dst_sec ? dst_sec->sec_idx : sym->st_shndx; + dst_sym->st_value = (src_sec ? src_sec->dst_off : 0) + sym->st_value; + dst_sym->st_size = sym->st_size; + + obj->sym_map[src_sym_idx] = dst_sym_idx; + + if (sym_type == STT_SECTION && dst_sym) { + dst_sec->sec_sym_idx = dst_sym_idx; + dst_sym->st_value = 0; + } + + if (sym_bind != STB_LOCAL) { + glob_sym = add_glob_sym(linker); + if (!glob_sym) + return -ENOMEM; + + glob_sym->sym_idx = dst_sym_idx; + /* we use dst_sec->id (and not dst_sec->sec_idx), because + * ephemeral sections (.kconfig, .ksyms, etc) don't have + * sec_idx (as they don't have corresponding ELF section), but + * still have id. .extern doesn't have even ephemeral section + * associated with it, so dst_sec->id == dst_sec->sec_idx == 0. + */ + glob_sym->sec_id = dst_sec ? dst_sec->id : 0; + glob_sym->name_off = name_off; + /* we will fill btf_id in during BTF merging step */ + glob_sym->btf_id = 0; + glob_sym->is_extern = sym_is_extern; + glob_sym->is_weak = sym_bind == STB_WEAK; + } + + return 0; +} + +static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *obj) +{ + struct src_sec *src_symtab = &obj->secs[obj->symtab_sec_idx]; + struct dst_sec *dst_symtab; + int i, err; + + for (i = 1; i < obj->sec_cnt; i++) { + struct src_sec *src_sec, *src_linked_sec; + struct dst_sec *dst_sec, *dst_linked_sec; + Elf64_Rel *src_rel, *dst_rel; + int j, n; + + src_sec = &obj->secs[i]; + if (!is_relo_sec(src_sec)) + continue; + + /* shdr->sh_info points to relocatable section */ + src_linked_sec = &obj->secs[src_sec->shdr->sh_info]; + if (src_linked_sec->skipped) + continue; + + dst_sec = find_dst_sec_by_name(linker, src_sec->sec_name); + if (!dst_sec) { + dst_sec = add_dst_sec(linker, src_sec->sec_name); + if (!dst_sec) + return -ENOMEM; + err = init_sec(linker, dst_sec, src_sec); + if (err) { + pr_warn("failed to init section '%s'\n", src_sec->sec_name); + return err; + } + } else if (!secs_match(dst_sec, src_sec)) { + pr_warn("sections %s are not compatible\n", src_sec->sec_name); + return -1; + } + + /* add_dst_sec() above could have invalidated linker->secs */ + dst_symtab = &linker->secs[linker->symtab_sec_idx]; + + /* shdr->sh_link points to SYMTAB */ + dst_sec->shdr->sh_link = linker->symtab_sec_idx; + + /* shdr->sh_info points to relocated section */ + dst_linked_sec = &linker->secs[src_linked_sec->dst_id]; + dst_sec->shdr->sh_info = dst_linked_sec->sec_idx; + + src_sec->dst_id = dst_sec->id; + err = extend_sec(linker, dst_sec, src_sec); + if (err) + return err; + + src_rel = src_sec->data->d_buf; + dst_rel = dst_sec->raw_data + src_sec->dst_off; + n = src_sec->shdr->sh_size / src_sec->shdr->sh_entsize; + for (j = 0; j < n; j++, src_rel++, dst_rel++) { + size_t src_sym_idx = ELF64_R_SYM(src_rel->r_info); + size_t sym_type = ELF64_R_TYPE(src_rel->r_info); + Elf64_Sym *src_sym, *dst_sym; + size_t dst_sym_idx; + + src_sym_idx = ELF64_R_SYM(src_rel->r_info); + src_sym = src_symtab->data->d_buf + sizeof(*src_sym) * src_sym_idx; + + dst_sym_idx = obj->sym_map[src_sym_idx]; + dst_sym = dst_symtab->raw_data + sizeof(*dst_sym) * dst_sym_idx; + dst_rel->r_offset += src_linked_sec->dst_off; + sym_type = ELF64_R_TYPE(src_rel->r_info); + dst_rel->r_info = ELF64_R_INFO(dst_sym_idx, sym_type); + + if (ELF64_ST_TYPE(src_sym->st_info) == STT_SECTION) { + struct src_sec *sec = &obj->secs[src_sym->st_shndx]; + struct bpf_insn *insn; + + if (src_linked_sec->shdr->sh_flags & SHF_EXECINSTR) { + /* calls to the very first static function inside + * .text section at offset 0 will + * reference section symbol, not the + * function symbol. Fix that up, + * otherwise it won't be possible to + * relocate calls to two different + * static functions with the same name + * (rom two different object files) + */ + insn = dst_linked_sec->raw_data + dst_rel->r_offset; + if (insn->code == (BPF_JMP | BPF_CALL)) + insn->imm += sec->dst_off / sizeof(struct bpf_insn); + else + insn->imm += sec->dst_off; + } else { + pr_warn("relocation against STT_SECTION in non-exec section is not supported!\n"); + return -EINVAL; + } + } + + } + } + + return 0; +} + +static Elf64_Sym *find_sym_by_name(struct src_obj *obj, size_t sec_idx, + int sym_type, const char *sym_name) +{ + struct src_sec *symtab = &obj->secs[obj->symtab_sec_idx]; + Elf64_Sym *sym = symtab->data->d_buf; + int i, n = symtab->shdr->sh_size / symtab->shdr->sh_entsize; + int str_sec_idx = symtab->shdr->sh_link; + const char *name; + + for (i = 0; i < n; i++, sym++) { + if (sym->st_shndx != sec_idx) + continue; + if (ELF64_ST_TYPE(sym->st_info) != sym_type) + continue; + + name = elf_strptr(obj->elf, str_sec_idx, sym->st_name); + if (!name) + return NULL; + + if (strcmp(sym_name, name) != 0) + continue; + + return sym; + } + + return NULL; +} + +static int linker_fixup_btf(struct src_obj *obj) +{ + const char *sec_name; + struct src_sec *sec; + int i, j, n, m; + + if (!obj->btf) + return 0; + + n = btf__type_cnt(obj->btf); + for (i = 1; i < n; i++) { + struct btf_var_secinfo *vi; + struct btf_type *t; + + t = btf_type_by_id(obj->btf, i); + if (btf_kind(t) != BTF_KIND_DATASEC) + continue; + + sec_name = btf__str_by_offset(obj->btf, t->name_off); + sec = find_src_sec_by_name(obj, sec_name); + if (sec) { + /* record actual section size, unless ephemeral */ + if (sec->shdr) + t->size = sec->shdr->sh_size; + } else { + /* BTF can have some sections that are not represented + * in ELF, e.g., .kconfig, .ksyms, .extern, which are used + * for special extern variables. + * + * For all but one such special (ephemeral) + * sections, we pre-create "section shells" to be able + * to keep track of extra per-section metadata later + * (e.g., those BTF extern variables). + * + * .extern is even more special, though, because it + * contains extern variables that need to be resolved + * by static linker, not libbpf and kernel. When such + * externs are resolved, we are going to remove them + * from .extern BTF section and might end up not + * needing it at all. Each resolved extern should have + * matching non-extern VAR/FUNC in other sections. + * + * We do support leaving some of the externs + * unresolved, though, to support cases of building + * libraries, which will later be linked against final + * BPF applications. So if at finalization we still + * see unresolved externs, we'll create .extern + * section on our own. + */ + if (strcmp(sec_name, BTF_EXTERN_SEC) == 0) + continue; + + sec = add_src_sec(obj, sec_name); + if (!sec) + return -ENOMEM; + + sec->ephemeral = true; + sec->sec_idx = 0; /* will match UNDEF shndx in ELF */ + } + + /* remember ELF section and its BTF type ID match */ + sec->sec_type_id = i; + + /* fix up variable offsets */ + vi = btf_var_secinfos(t); + for (j = 0, m = btf_vlen(t); j < m; j++, vi++) { + const struct btf_type *vt = btf__type_by_id(obj->btf, vi->type); + const char *var_name = btf__str_by_offset(obj->btf, vt->name_off); + int var_linkage = btf_var(vt)->linkage; + Elf64_Sym *sym; + + /* no need to patch up static or extern vars */ + if (var_linkage != BTF_VAR_GLOBAL_ALLOCATED) + continue; + + sym = find_sym_by_name(obj, sec->sec_idx, STT_OBJECT, var_name); + if (!sym) { + pr_warn("failed to find symbol for variable '%s' in section '%s'\n", var_name, sec_name); + return -ENOENT; + } + + vi->offset = sym->st_value; + } + } + + return 0; +} + +static int remap_type_id(__u32 *type_id, void *ctx) +{ + int *id_map = ctx; + int new_id = id_map[*type_id]; + + /* Error out if the type wasn't remapped. Ignore VOID which stays VOID. */ + if (new_id == 0 && *type_id != 0) { + pr_warn("failed to find new ID mapping for original BTF type ID %u\n", *type_id); + return -EINVAL; + } + + *type_id = id_map[*type_id]; + + return 0; +} + +static int linker_append_btf(struct bpf_linker *linker, struct src_obj *obj) +{ + const struct btf_type *t; + int i, j, n, start_id, id; + const char *name; + + if (!obj->btf) + return 0; + + start_id = btf__type_cnt(linker->btf); + n = btf__type_cnt(obj->btf); + + obj->btf_type_map = calloc(n + 1, sizeof(int)); + if (!obj->btf_type_map) + return -ENOMEM; + + for (i = 1; i < n; i++) { + struct glob_sym *glob_sym = NULL; + + t = btf__type_by_id(obj->btf, i); + + /* DATASECs are handled specially below */ + if (btf_kind(t) == BTF_KIND_DATASEC) + continue; + + if (btf_is_non_static(t)) { + /* there should be glob_sym already */ + name = btf__str_by_offset(obj->btf, t->name_off); + glob_sym = find_glob_sym(linker, name); + + /* VARs without corresponding glob_sym are those that + * belong to skipped/deduplicated sections (i.e., + * license and version), so just skip them + */ + if (!glob_sym) + continue; + + /* linker_append_elf_sym() might have requested + * updating underlying type ID, if extern was resolved + * to strong symbol or weak got upgraded to non-weak + */ + if (glob_sym->underlying_btf_id == 0) + glob_sym->underlying_btf_id = -t->type; + + /* globals from previous object files that match our + * VAR/FUNC already have a corresponding associated + * BTF type, so just make sure to use it + */ + if (glob_sym->btf_id) { + /* reuse existing BTF type for global var/func */ + obj->btf_type_map[i] = glob_sym->btf_id; + continue; + } + } + + id = btf__add_type(linker->btf, obj->btf, t); + if (id < 0) { + pr_warn("failed to append BTF type #%d from file '%s'\n", i, obj->filename); + return id; + } + + obj->btf_type_map[i] = id; + + /* record just appended BTF type for var/func */ + if (glob_sym) { + glob_sym->btf_id = id; + glob_sym->underlying_btf_id = -t->type; + } + } + + /* remap all the types except DATASECs */ + n = btf__type_cnt(linker->btf); + for (i = start_id; i < n; i++) { + struct btf_type *dst_t = btf_type_by_id(linker->btf, i); + + if (btf_type_visit_type_ids(dst_t, remap_type_id, obj->btf_type_map)) + return -EINVAL; + } + + /* Rewrite VAR/FUNC underlying types (i.e., FUNC's FUNC_PROTO and VAR's + * actual type), if necessary + */ + for (i = 0; i < linker->glob_sym_cnt; i++) { + struct glob_sym *glob_sym = &linker->glob_syms[i]; + struct btf_type *glob_t; + + if (glob_sym->underlying_btf_id >= 0) + continue; + + glob_sym->underlying_btf_id = obj->btf_type_map[-glob_sym->underlying_btf_id]; + + glob_t = btf_type_by_id(linker->btf, glob_sym->btf_id); + glob_t->type = glob_sym->underlying_btf_id; + } + + /* append DATASEC info */ + for (i = 1; i < obj->sec_cnt; i++) { + struct src_sec *src_sec; + struct dst_sec *dst_sec; + const struct btf_var_secinfo *src_var; + struct btf_var_secinfo *dst_var; + + src_sec = &obj->secs[i]; + if (!src_sec->sec_type_id || src_sec->skipped) + continue; + dst_sec = &linker->secs[src_sec->dst_id]; + + /* Mark section as having BTF regardless of the presence of + * variables. In some cases compiler might generate empty BTF + * with no variables information. E.g., when promoting local + * array/structure variable initial values and BPF object + * file otherwise has no read-only static variables in + * .rodata. We need to preserve such empty BTF and just set + * correct section size. + */ + dst_sec->has_btf = true; + + t = btf__type_by_id(obj->btf, src_sec->sec_type_id); + src_var = btf_var_secinfos(t); + n = btf_vlen(t); + for (j = 0; j < n; j++, src_var++) { + void *sec_vars = dst_sec->sec_vars; + int new_id = obj->btf_type_map[src_var->type]; + struct glob_sym *glob_sym = NULL; + + t = btf_type_by_id(linker->btf, new_id); + if (btf_is_non_static(t)) { + name = btf__str_by_offset(linker->btf, t->name_off); + glob_sym = find_glob_sym(linker, name); + if (glob_sym->sec_id != dst_sec->id) { + pr_warn("global '%s': section mismatch %d vs %d\n", + name, glob_sym->sec_id, dst_sec->id); + return -EINVAL; + } + } + + /* If there is already a member (VAR or FUNC) mapped + * to the same type, don't add a duplicate entry. + * This will happen when multiple object files define + * the same extern VARs/FUNCs. + */ + if (glob_sym && glob_sym->var_idx >= 0) { + __s64 sz; + + dst_var = &dst_sec->sec_vars[glob_sym->var_idx]; + /* Because underlying BTF type might have + * changed, so might its size have changed, so + * re-calculate and update it in sec_var. + */ + sz = btf__resolve_size(linker->btf, glob_sym->underlying_btf_id); + if (sz < 0) { + pr_warn("global '%s': failed to resolve size of underlying type: %d\n", + name, (int)sz); + return -EINVAL; + } + dst_var->size = sz; + continue; + } + + sec_vars = libbpf_reallocarray(sec_vars, + dst_sec->sec_var_cnt + 1, + sizeof(*dst_sec->sec_vars)); + if (!sec_vars) + return -ENOMEM; + + dst_sec->sec_vars = sec_vars; + dst_sec->sec_var_cnt++; + + dst_var = &dst_sec->sec_vars[dst_sec->sec_var_cnt - 1]; + dst_var->type = obj->btf_type_map[src_var->type]; + dst_var->size = src_var->size; + dst_var->offset = src_sec->dst_off + src_var->offset; + + if (glob_sym) + glob_sym->var_idx = dst_sec->sec_var_cnt - 1; + } + } + + return 0; +} + +static void *add_btf_ext_rec(struct btf_ext_sec_data *ext_data, const void *src_rec) +{ + void *tmp; + + tmp = libbpf_reallocarray(ext_data->recs, ext_data->rec_cnt + 1, ext_data->rec_sz); + if (!tmp) + return NULL; + ext_data->recs = tmp; + + tmp += ext_data->rec_cnt * ext_data->rec_sz; + memcpy(tmp, src_rec, ext_data->rec_sz); + + ext_data->rec_cnt++; + + return tmp; +} + +static int linker_append_btf_ext(struct bpf_linker *linker, struct src_obj *obj) +{ + const struct btf_ext_info_sec *ext_sec; + const char *sec_name, *s; + struct src_sec *src_sec; + struct dst_sec *dst_sec; + int rec_sz, str_off, i; + + if (!obj->btf_ext) + return 0; + + rec_sz = obj->btf_ext->func_info.rec_size; + for_each_btf_ext_sec(&obj->btf_ext->func_info, ext_sec) { + struct bpf_func_info_min *src_rec, *dst_rec; + + sec_name = btf__name_by_offset(obj->btf, ext_sec->sec_name_off); + src_sec = find_src_sec_by_name(obj, sec_name); + if (!src_sec) { + pr_warn("can't find section '%s' referenced from .BTF.ext\n", sec_name); + return -EINVAL; + } + dst_sec = &linker->secs[src_sec->dst_id]; + + if (dst_sec->func_info.rec_sz == 0) + dst_sec->func_info.rec_sz = rec_sz; + if (dst_sec->func_info.rec_sz != rec_sz) { + pr_warn("incompatible .BTF.ext record sizes for section '%s'\n", sec_name); + return -EINVAL; + } + + for_each_btf_ext_rec(&obj->btf_ext->func_info, ext_sec, i, src_rec) { + dst_rec = add_btf_ext_rec(&dst_sec->func_info, src_rec); + if (!dst_rec) + return -ENOMEM; + + dst_rec->insn_off += src_sec->dst_off; + dst_rec->type_id = obj->btf_type_map[dst_rec->type_id]; + } + } + + rec_sz = obj->btf_ext->line_info.rec_size; + for_each_btf_ext_sec(&obj->btf_ext->line_info, ext_sec) { + struct bpf_line_info_min *src_rec, *dst_rec; + + sec_name = btf__name_by_offset(obj->btf, ext_sec->sec_name_off); + src_sec = find_src_sec_by_name(obj, sec_name); + if (!src_sec) { + pr_warn("can't find section '%s' referenced from .BTF.ext\n", sec_name); + return -EINVAL; + } + dst_sec = &linker->secs[src_sec->dst_id]; + + if (dst_sec->line_info.rec_sz == 0) + dst_sec->line_info.rec_sz = rec_sz; + if (dst_sec->line_info.rec_sz != rec_sz) { + pr_warn("incompatible .BTF.ext record sizes for section '%s'\n", sec_name); + return -EINVAL; + } + + for_each_btf_ext_rec(&obj->btf_ext->line_info, ext_sec, i, src_rec) { + dst_rec = add_btf_ext_rec(&dst_sec->line_info, src_rec); + if (!dst_rec) + return -ENOMEM; + + dst_rec->insn_off += src_sec->dst_off; + + s = btf__str_by_offset(obj->btf, src_rec->file_name_off); + str_off = btf__add_str(linker->btf, s); + if (str_off < 0) + return -ENOMEM; + dst_rec->file_name_off = str_off; + + s = btf__str_by_offset(obj->btf, src_rec->line_off); + str_off = btf__add_str(linker->btf, s); + if (str_off < 0) + return -ENOMEM; + dst_rec->line_off = str_off; + + /* dst_rec->line_col is fine */ + } + } + + rec_sz = obj->btf_ext->core_relo_info.rec_size; + for_each_btf_ext_sec(&obj->btf_ext->core_relo_info, ext_sec) { + struct bpf_core_relo *src_rec, *dst_rec; + + sec_name = btf__name_by_offset(obj->btf, ext_sec->sec_name_off); + src_sec = find_src_sec_by_name(obj, sec_name); + if (!src_sec) { + pr_warn("can't find section '%s' referenced from .BTF.ext\n", sec_name); + return -EINVAL; + } + dst_sec = &linker->secs[src_sec->dst_id]; + + if (dst_sec->core_relo_info.rec_sz == 0) + dst_sec->core_relo_info.rec_sz = rec_sz; + if (dst_sec->core_relo_info.rec_sz != rec_sz) { + pr_warn("incompatible .BTF.ext record sizes for section '%s'\n", sec_name); + return -EINVAL; + } + + for_each_btf_ext_rec(&obj->btf_ext->core_relo_info, ext_sec, i, src_rec) { + dst_rec = add_btf_ext_rec(&dst_sec->core_relo_info, src_rec); + if (!dst_rec) + return -ENOMEM; + + dst_rec->insn_off += src_sec->dst_off; + dst_rec->type_id = obj->btf_type_map[dst_rec->type_id]; + + s = btf__str_by_offset(obj->btf, src_rec->access_str_off); + str_off = btf__add_str(linker->btf, s); + if (str_off < 0) + return -ENOMEM; + dst_rec->access_str_off = str_off; + + /* dst_rec->kind is fine */ + } + } + + return 0; +} + +int bpf_linker__finalize(struct bpf_linker *linker) +{ + struct dst_sec *sec; + size_t strs_sz; + const void *strs; + int err, i; + + if (!linker->elf) + return libbpf_err(-EINVAL); + + err = finalize_btf(linker); + if (err) + return libbpf_err(err); + + /* Finalize strings */ + strs_sz = strset__data_size(linker->strtab_strs); + strs = strset__data(linker->strtab_strs); + + sec = &linker->secs[linker->strtab_sec_idx]; + sec->data->d_align = 1; + sec->data->d_off = 0LL; + sec->data->d_buf = (void *)strs; + sec->data->d_type = ELF_T_BYTE; + sec->data->d_size = strs_sz; + sec->shdr->sh_size = strs_sz; + + for (i = 1; i < linker->sec_cnt; i++) { + sec = &linker->secs[i]; + + /* STRTAB is handled specially above */ + if (sec->sec_idx == linker->strtab_sec_idx) + continue; + + /* special ephemeral sections (.ksyms, .kconfig, etc) */ + if (!sec->scn) + continue; + + sec->data->d_buf = sec->raw_data; + } + + /* Finalize ELF layout */ + if (elf_update(linker->elf, ELF_C_NULL) < 0) { + err = -errno; + pr_warn_elf("failed to finalize ELF layout"); + return libbpf_err(err); + } + + /* Write out final ELF contents */ + if (elf_update(linker->elf, ELF_C_WRITE) < 0) { + err = -errno; + pr_warn_elf("failed to write ELF contents"); + return libbpf_err(err); + } + + elf_end(linker->elf); + close(linker->fd); + + linker->elf = NULL; + linker->fd = -1; + + return 0; +} + +static int emit_elf_data_sec(struct bpf_linker *linker, const char *sec_name, + size_t align, const void *raw_data, size_t raw_sz) +{ + Elf_Scn *scn; + Elf_Data *data; + Elf64_Shdr *shdr; + int name_off; + + name_off = strset__add_str(linker->strtab_strs, sec_name); + if (name_off < 0) + return name_off; + + scn = elf_newscn(linker->elf); + if (!scn) + return -ENOMEM; + data = elf_newdata(scn); + if (!data) + return -ENOMEM; + shdr = elf64_getshdr(scn); + if (!shdr) + return -EINVAL; + + shdr->sh_name = name_off; + shdr->sh_type = SHT_PROGBITS; + shdr->sh_flags = 0; + shdr->sh_size = raw_sz; + shdr->sh_link = 0; + shdr->sh_info = 0; + shdr->sh_addralign = align; + shdr->sh_entsize = 0; + + data->d_type = ELF_T_BYTE; + data->d_size = raw_sz; + data->d_buf = (void *)raw_data; + data->d_align = align; + data->d_off = 0; + + return 0; +} + +static int finalize_btf(struct bpf_linker *linker) +{ + LIBBPF_OPTS(btf_dedup_opts, opts); + struct btf *btf = linker->btf; + const void *raw_data; + int i, j, id, err; + __u32 raw_sz; + + /* bail out if no BTF data was produced */ + if (btf__type_cnt(linker->btf) == 1) + return 0; + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + if (!sec->has_btf) + continue; + + id = btf__add_datasec(btf, sec->sec_name, sec->sec_sz); + if (id < 0) { + pr_warn("failed to add consolidated BTF type for datasec '%s': %d\n", + sec->sec_name, id); + return id; + } + + for (j = 0; j < sec->sec_var_cnt; j++) { + struct btf_var_secinfo *vi = &sec->sec_vars[j]; + + if (btf__add_datasec_var_info(btf, vi->type, vi->offset, vi->size)) + return -EINVAL; + } + } + + err = finalize_btf_ext(linker); + if (err) { + pr_warn(".BTF.ext generation failed: %d\n", err); + return err; + } + + opts.btf_ext = linker->btf_ext; + err = btf__dedup(linker->btf, &opts); + if (err) { + pr_warn("BTF dedup failed: %d\n", err); + return err; + } + + /* Emit .BTF section */ + raw_data = btf__raw_data(linker->btf, &raw_sz); + if (!raw_data) + return -ENOMEM; + + err = emit_elf_data_sec(linker, BTF_ELF_SEC, 8, raw_data, raw_sz); + if (err) { + pr_warn("failed to write out .BTF ELF section: %d\n", err); + return err; + } + + /* Emit .BTF.ext section */ + if (linker->btf_ext) { + raw_data = btf_ext__get_raw_data(linker->btf_ext, &raw_sz); + if (!raw_data) + return -ENOMEM; + + err = emit_elf_data_sec(linker, BTF_EXT_ELF_SEC, 8, raw_data, raw_sz); + if (err) { + pr_warn("failed to write out .BTF.ext ELF section: %d\n", err); + return err; + } + } + + return 0; +} + +static int emit_btf_ext_data(struct bpf_linker *linker, void *output, + const char *sec_name, struct btf_ext_sec_data *sec_data) +{ + struct btf_ext_info_sec *sec_info; + void *cur = output; + int str_off; + size_t sz; + + if (!sec_data->rec_cnt) + return 0; + + str_off = btf__add_str(linker->btf, sec_name); + if (str_off < 0) + return -ENOMEM; + + sec_info = cur; + sec_info->sec_name_off = str_off; + sec_info->num_info = sec_data->rec_cnt; + cur += sizeof(struct btf_ext_info_sec); + + sz = sec_data->rec_cnt * sec_data->rec_sz; + memcpy(cur, sec_data->recs, sz); + cur += sz; + + return cur - output; +} + +static int finalize_btf_ext(struct bpf_linker *linker) +{ + size_t funcs_sz = 0, lines_sz = 0, core_relos_sz = 0, total_sz = 0; + size_t func_rec_sz = 0, line_rec_sz = 0, core_relo_rec_sz = 0; + struct btf_ext_header *hdr; + void *data, *cur; + int i, err, sz; + + /* validate that all sections have the same .BTF.ext record sizes + * and calculate total data size for each type of data (func info, + * line info, core relos) + */ + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + if (sec->func_info.rec_cnt) { + if (func_rec_sz == 0) + func_rec_sz = sec->func_info.rec_sz; + if (func_rec_sz != sec->func_info.rec_sz) { + pr_warn("mismatch in func_info record size %zu != %u\n", + func_rec_sz, sec->func_info.rec_sz); + return -EINVAL; + } + + funcs_sz += sizeof(struct btf_ext_info_sec) + func_rec_sz * sec->func_info.rec_cnt; + } + if (sec->line_info.rec_cnt) { + if (line_rec_sz == 0) + line_rec_sz = sec->line_info.rec_sz; + if (line_rec_sz != sec->line_info.rec_sz) { + pr_warn("mismatch in line_info record size %zu != %u\n", + line_rec_sz, sec->line_info.rec_sz); + return -EINVAL; + } + + lines_sz += sizeof(struct btf_ext_info_sec) + line_rec_sz * sec->line_info.rec_cnt; + } + if (sec->core_relo_info.rec_cnt) { + if (core_relo_rec_sz == 0) + core_relo_rec_sz = sec->core_relo_info.rec_sz; + if (core_relo_rec_sz != sec->core_relo_info.rec_sz) { + pr_warn("mismatch in core_relo_info record size %zu != %u\n", + core_relo_rec_sz, sec->core_relo_info.rec_sz); + return -EINVAL; + } + + core_relos_sz += sizeof(struct btf_ext_info_sec) + core_relo_rec_sz * sec->core_relo_info.rec_cnt; + } + } + + if (!funcs_sz && !lines_sz && !core_relos_sz) + return 0; + + total_sz += sizeof(struct btf_ext_header); + if (funcs_sz) { + funcs_sz += sizeof(__u32); /* record size prefix */ + total_sz += funcs_sz; + } + if (lines_sz) { + lines_sz += sizeof(__u32); /* record size prefix */ + total_sz += lines_sz; + } + if (core_relos_sz) { + core_relos_sz += sizeof(__u32); /* record size prefix */ + total_sz += core_relos_sz; + } + + cur = data = calloc(1, total_sz); + if (!data) + return -ENOMEM; + + hdr = cur; + hdr->magic = BTF_MAGIC; + hdr->version = BTF_VERSION; + hdr->flags = 0; + hdr->hdr_len = sizeof(struct btf_ext_header); + cur += sizeof(struct btf_ext_header); + + /* All offsets are in bytes relative to the end of this header */ + hdr->func_info_off = 0; + hdr->func_info_len = funcs_sz; + hdr->line_info_off = funcs_sz; + hdr->line_info_len = lines_sz; + hdr->core_relo_off = funcs_sz + lines_sz; + hdr->core_relo_len = core_relos_sz; + + if (funcs_sz) { + *(__u32 *)cur = func_rec_sz; + cur += sizeof(__u32); + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->func_info); + if (sz < 0) { + err = sz; + goto out; + } + + cur += sz; + } + } + + if (lines_sz) { + *(__u32 *)cur = line_rec_sz; + cur += sizeof(__u32); + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->line_info); + if (sz < 0) { + err = sz; + goto out; + } + + cur += sz; + } + } + + if (core_relos_sz) { + *(__u32 *)cur = core_relo_rec_sz; + cur += sizeof(__u32); + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->core_relo_info); + if (sz < 0) { + err = sz; + goto out; + } + + cur += sz; + } + } + + linker->btf_ext = btf_ext__new(data, total_sz); + err = libbpf_get_error(linker->btf_ext); + if (err) { + linker->btf_ext = NULL; + pr_warn("failed to parse final .BTF.ext data: %d\n", err); + goto out; + } + +out: + free(data); + return err; +} diff --git a/bpftool/libbpf/src/netlink.c b/bpftool/libbpf/src/netlink.c new file mode 100644 index 0000000..1653e7a --- /dev/null +++ b/bpftool/libbpf/src/netlink.c @@ -0,0 +1,911 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2018 Facebook */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" +#include "nlattr.h" + +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + +typedef int (*libbpf_dump_nlmsg_t)(void *cookie, void *msg, struct nlattr **tb); + +typedef int (*__dump_nlmsg_t)(struct nlmsghdr *nlmsg, libbpf_dump_nlmsg_t, + void *cookie); + +struct xdp_link_info { + __u32 prog_id; + __u32 drv_prog_id; + __u32 hw_prog_id; + __u32 skb_prog_id; + __u8 attach_mode; +}; + +struct xdp_id_md { + int ifindex; + __u32 flags; + struct xdp_link_info info; + __u64 feature_flags; +}; + +struct xdp_features_md { + int ifindex; + __u64 flags; +}; + +static int libbpf_netlink_open(__u32 *nl_pid, int proto) +{ + struct sockaddr_nl sa; + socklen_t addrlen; + int one = 1, ret; + int sock; + + memset(&sa, 0, sizeof(sa)); + sa.nl_family = AF_NETLINK; + + sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, proto); + if (sock < 0) + return -errno; + + if (setsockopt(sock, SOL_NETLINK, NETLINK_EXT_ACK, + &one, sizeof(one)) < 0) { + pr_warn("Netlink error reporting not supported\n"); + } + + if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) { + ret = -errno; + goto cleanup; + } + + addrlen = sizeof(sa); + if (getsockname(sock, (struct sockaddr *)&sa, &addrlen) < 0) { + ret = -errno; + goto cleanup; + } + + if (addrlen != sizeof(sa)) { + ret = -LIBBPF_ERRNO__INTERNAL; + goto cleanup; + } + + *nl_pid = sa.nl_pid; + return sock; + +cleanup: + close(sock); + return ret; +} + +static void libbpf_netlink_close(int sock) +{ + close(sock); +} + +enum { + NL_CONT, + NL_NEXT, + NL_DONE, +}; + +static int netlink_recvmsg(int sock, struct msghdr *mhdr, int flags) +{ + int len; + + do { + len = recvmsg(sock, mhdr, flags); + } while (len < 0 && (errno == EINTR || errno == EAGAIN)); + + if (len < 0) + return -errno; + return len; +} + +static int alloc_iov(struct iovec *iov, int len) +{ + void *nbuf; + + nbuf = realloc(iov->iov_base, len); + if (!nbuf) + return -ENOMEM; + + iov->iov_base = nbuf; + iov->iov_len = len; + return 0; +} + +static int libbpf_netlink_recv(int sock, __u32 nl_pid, int seq, + __dump_nlmsg_t _fn, libbpf_dump_nlmsg_t fn, + void *cookie) +{ + struct iovec iov = {}; + struct msghdr mhdr = { + .msg_iov = &iov, + .msg_iovlen = 1, + }; + bool multipart = true; + struct nlmsgerr *err; + struct nlmsghdr *nh; + int len, ret; + + ret = alloc_iov(&iov, 4096); + if (ret) + goto done; + + while (multipart) { +start: + multipart = false; + len = netlink_recvmsg(sock, &mhdr, MSG_PEEK | MSG_TRUNC); + if (len < 0) { + ret = len; + goto done; + } + + if (len > iov.iov_len) { + ret = alloc_iov(&iov, len); + if (ret) + goto done; + } + + len = netlink_recvmsg(sock, &mhdr, 0); + if (len < 0) { + ret = len; + goto done; + } + + if (len == 0) + break; + + for (nh = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(nh, len); + nh = NLMSG_NEXT(nh, len)) { + if (nh->nlmsg_pid != nl_pid) { + ret = -LIBBPF_ERRNO__WRNGPID; + goto done; + } + if (nh->nlmsg_seq != seq) { + ret = -LIBBPF_ERRNO__INVSEQ; + goto done; + } + if (nh->nlmsg_flags & NLM_F_MULTI) + multipart = true; + switch (nh->nlmsg_type) { + case NLMSG_ERROR: + err = (struct nlmsgerr *)NLMSG_DATA(nh); + if (!err->error) + continue; + ret = err->error; + libbpf_nla_dump_errormsg(nh); + goto done; + case NLMSG_DONE: + ret = 0; + goto done; + default: + break; + } + if (_fn) { + ret = _fn(nh, fn, cookie); + switch (ret) { + case NL_CONT: + break; + case NL_NEXT: + goto start; + case NL_DONE: + ret = 0; + goto done; + default: + goto done; + } + } + } + } + ret = 0; +done: + free(iov.iov_base); + return ret; +} + +static int libbpf_netlink_send_recv(struct libbpf_nla_req *req, + int proto, __dump_nlmsg_t parse_msg, + libbpf_dump_nlmsg_t parse_attr, + void *cookie) +{ + __u32 nl_pid = 0; + int sock, ret; + + sock = libbpf_netlink_open(&nl_pid, proto); + if (sock < 0) + return sock; + + req->nh.nlmsg_pid = 0; + req->nh.nlmsg_seq = time(NULL); + + if (send(sock, req, req->nh.nlmsg_len, 0) < 0) { + ret = -errno; + goto out; + } + + ret = libbpf_netlink_recv(sock, nl_pid, req->nh.nlmsg_seq, + parse_msg, parse_attr, cookie); +out: + libbpf_netlink_close(sock); + return ret; +} + +static int parse_genl_family_id(struct nlmsghdr *nh, libbpf_dump_nlmsg_t fn, + void *cookie) +{ + struct genlmsghdr *gnl = NLMSG_DATA(nh); + struct nlattr *na = (struct nlattr *)((void *)gnl + GENL_HDRLEN); + struct nlattr *tb[CTRL_ATTR_FAMILY_ID + 1]; + __u16 *id = cookie; + + libbpf_nla_parse(tb, CTRL_ATTR_FAMILY_ID, na, + NLMSG_PAYLOAD(nh, sizeof(*gnl)), NULL); + if (!tb[CTRL_ATTR_FAMILY_ID]) + return NL_CONT; + + *id = libbpf_nla_getattr_u16(tb[CTRL_ATTR_FAMILY_ID]); + return NL_DONE; +} + +static int libbpf_netlink_resolve_genl_family_id(const char *name, + __u16 len, __u16 *id) +{ + struct libbpf_nla_req req = { + .nh.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN), + .nh.nlmsg_type = GENL_ID_CTRL, + .nh.nlmsg_flags = NLM_F_REQUEST, + .gnl.cmd = CTRL_CMD_GETFAMILY, + .gnl.version = 2, + }; + int err; + + err = nlattr_add(&req, CTRL_ATTR_FAMILY_NAME, name, len); + if (err < 0) + return err; + + return libbpf_netlink_send_recv(&req, NETLINK_GENERIC, + parse_genl_family_id, NULL, id); +} + +static int __bpf_set_link_xdp_fd_replace(int ifindex, int fd, int old_fd, + __u32 flags) +{ + struct nlattr *nla; + int ret; + struct libbpf_nla_req req; + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; + req.nh.nlmsg_type = RTM_SETLINK; + req.ifinfo.ifi_family = AF_UNSPEC; + req.ifinfo.ifi_index = ifindex; + + nla = nlattr_begin_nested(&req, IFLA_XDP); + if (!nla) + return -EMSGSIZE; + ret = nlattr_add(&req, IFLA_XDP_FD, &fd, sizeof(fd)); + if (ret < 0) + return ret; + if (flags) { + ret = nlattr_add(&req, IFLA_XDP_FLAGS, &flags, sizeof(flags)); + if (ret < 0) + return ret; + } + if (flags & XDP_FLAGS_REPLACE) { + ret = nlattr_add(&req, IFLA_XDP_EXPECTED_FD, &old_fd, + sizeof(old_fd)); + if (ret < 0) + return ret; + } + nlattr_end_nested(&req, nla); + + return libbpf_netlink_send_recv(&req, NETLINK_ROUTE, NULL, NULL, NULL); +} + +int bpf_xdp_attach(int ifindex, int prog_fd, __u32 flags, const struct bpf_xdp_attach_opts *opts) +{ + int old_prog_fd, err; + + if (!OPTS_VALID(opts, bpf_xdp_attach_opts)) + return libbpf_err(-EINVAL); + + old_prog_fd = OPTS_GET(opts, old_prog_fd, 0); + if (old_prog_fd) + flags |= XDP_FLAGS_REPLACE; + else + old_prog_fd = -1; + + err = __bpf_set_link_xdp_fd_replace(ifindex, prog_fd, old_prog_fd, flags); + return libbpf_err(err); +} + +int bpf_xdp_detach(int ifindex, __u32 flags, const struct bpf_xdp_attach_opts *opts) +{ + return bpf_xdp_attach(ifindex, -1, flags, opts); +} + +static int __dump_link_nlmsg(struct nlmsghdr *nlh, + libbpf_dump_nlmsg_t dump_link_nlmsg, void *cookie) +{ + struct nlattr *tb[IFLA_MAX + 1], *attr; + struct ifinfomsg *ifi = NLMSG_DATA(nlh); + int len; + + len = nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); + attr = (struct nlattr *) ((void *) ifi + NLMSG_ALIGN(sizeof(*ifi))); + + if (libbpf_nla_parse(tb, IFLA_MAX, attr, len, NULL) != 0) + return -LIBBPF_ERRNO__NLPARSE; + + return dump_link_nlmsg(cookie, ifi, tb); +} + +static int get_xdp_info(void *cookie, void *msg, struct nlattr **tb) +{ + struct nlattr *xdp_tb[IFLA_XDP_MAX + 1]; + struct xdp_id_md *xdp_id = cookie; + struct ifinfomsg *ifinfo = msg; + int ret; + + if (xdp_id->ifindex && xdp_id->ifindex != ifinfo->ifi_index) + return 0; + + if (!tb[IFLA_XDP]) + return 0; + + ret = libbpf_nla_parse_nested(xdp_tb, IFLA_XDP_MAX, tb[IFLA_XDP], NULL); + if (ret) + return ret; + + if (!xdp_tb[IFLA_XDP_ATTACHED]) + return 0; + + xdp_id->info.attach_mode = libbpf_nla_getattr_u8( + xdp_tb[IFLA_XDP_ATTACHED]); + + if (xdp_id->info.attach_mode == XDP_ATTACHED_NONE) + return 0; + + if (xdp_tb[IFLA_XDP_PROG_ID]) + xdp_id->info.prog_id = libbpf_nla_getattr_u32( + xdp_tb[IFLA_XDP_PROG_ID]); + + if (xdp_tb[IFLA_XDP_SKB_PROG_ID]) + xdp_id->info.skb_prog_id = libbpf_nla_getattr_u32( + xdp_tb[IFLA_XDP_SKB_PROG_ID]); + + if (xdp_tb[IFLA_XDP_DRV_PROG_ID]) + xdp_id->info.drv_prog_id = libbpf_nla_getattr_u32( + xdp_tb[IFLA_XDP_DRV_PROG_ID]); + + if (xdp_tb[IFLA_XDP_HW_PROG_ID]) + xdp_id->info.hw_prog_id = libbpf_nla_getattr_u32( + xdp_tb[IFLA_XDP_HW_PROG_ID]); + + return 0; +} + +static int parse_xdp_features(struct nlmsghdr *nh, libbpf_dump_nlmsg_t fn, + void *cookie) +{ + struct genlmsghdr *gnl = NLMSG_DATA(nh); + struct nlattr *na = (struct nlattr *)((void *)gnl + GENL_HDRLEN); + struct nlattr *tb[NETDEV_CMD_MAX + 1]; + struct xdp_features_md *md = cookie; + __u32 ifindex; + + libbpf_nla_parse(tb, NETDEV_CMD_MAX, na, + NLMSG_PAYLOAD(nh, sizeof(*gnl)), NULL); + + if (!tb[NETDEV_A_DEV_IFINDEX] || !tb[NETDEV_A_DEV_XDP_FEATURES]) + return NL_CONT; + + ifindex = libbpf_nla_getattr_u32(tb[NETDEV_A_DEV_IFINDEX]); + if (ifindex != md->ifindex) + return NL_CONT; + + md->flags = libbpf_nla_getattr_u64(tb[NETDEV_A_DEV_XDP_FEATURES]); + return NL_DONE; +} + +int bpf_xdp_query(int ifindex, int xdp_flags, struct bpf_xdp_query_opts *opts) +{ + struct libbpf_nla_req req = { + .nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)), + .nh.nlmsg_type = RTM_GETLINK, + .nh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, + .ifinfo.ifi_family = AF_PACKET, + }; + struct xdp_id_md xdp_id = {}; + struct xdp_features_md md = { + .ifindex = ifindex, + }; + __u16 id; + int err; + + if (!OPTS_VALID(opts, bpf_xdp_query_opts)) + return libbpf_err(-EINVAL); + + if (xdp_flags & ~XDP_FLAGS_MASK) + return libbpf_err(-EINVAL); + + /* Check whether the single {HW,DRV,SKB} mode is set */ + xdp_flags &= XDP_FLAGS_SKB_MODE | XDP_FLAGS_DRV_MODE | XDP_FLAGS_HW_MODE; + if (xdp_flags & (xdp_flags - 1)) + return libbpf_err(-EINVAL); + + xdp_id.ifindex = ifindex; + xdp_id.flags = xdp_flags; + + err = libbpf_netlink_send_recv(&req, NETLINK_ROUTE, __dump_link_nlmsg, + get_xdp_info, &xdp_id); + if (err) + return libbpf_err(err); + + OPTS_SET(opts, prog_id, xdp_id.info.prog_id); + OPTS_SET(opts, drv_prog_id, xdp_id.info.drv_prog_id); + OPTS_SET(opts, hw_prog_id, xdp_id.info.hw_prog_id); + OPTS_SET(opts, skb_prog_id, xdp_id.info.skb_prog_id); + OPTS_SET(opts, attach_mode, xdp_id.info.attach_mode); + + if (!OPTS_HAS(opts, feature_flags)) + return 0; + + err = libbpf_netlink_resolve_genl_family_id("netdev", sizeof("netdev"), &id); + if (err < 0) + return libbpf_err(err); + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN); + req.nh.nlmsg_flags = NLM_F_REQUEST; + req.nh.nlmsg_type = id; + req.gnl.cmd = NETDEV_CMD_DEV_GET; + req.gnl.version = 2; + + err = nlattr_add(&req, NETDEV_A_DEV_IFINDEX, &ifindex, sizeof(ifindex)); + if (err < 0) + return libbpf_err(err); + + err = libbpf_netlink_send_recv(&req, NETLINK_GENERIC, + parse_xdp_features, NULL, &md); + if (err) + return libbpf_err(err); + + opts->feature_flags = md.flags; + + return 0; +} + +int bpf_xdp_query_id(int ifindex, int flags, __u32 *prog_id) +{ + LIBBPF_OPTS(bpf_xdp_query_opts, opts); + int ret; + + ret = bpf_xdp_query(ifindex, flags, &opts); + if (ret) + return libbpf_err(ret); + + flags &= XDP_FLAGS_MODES; + + if (opts.attach_mode != XDP_ATTACHED_MULTI && !flags) + *prog_id = opts.prog_id; + else if (flags & XDP_FLAGS_DRV_MODE) + *prog_id = opts.drv_prog_id; + else if (flags & XDP_FLAGS_HW_MODE) + *prog_id = opts.hw_prog_id; + else if (flags & XDP_FLAGS_SKB_MODE) + *prog_id = opts.skb_prog_id; + else + *prog_id = 0; + + return 0; +} + + +typedef int (*qdisc_config_t)(struct libbpf_nla_req *req); + +static int clsact_config(struct libbpf_nla_req *req) +{ + req->tc.tcm_parent = TC_H_CLSACT; + req->tc.tcm_handle = TC_H_MAKE(TC_H_CLSACT, 0); + + return nlattr_add(req, TCA_KIND, "clsact", sizeof("clsact")); +} + +static int attach_point_to_config(struct bpf_tc_hook *hook, + qdisc_config_t *config) +{ + switch (OPTS_GET(hook, attach_point, 0)) { + case BPF_TC_INGRESS: + case BPF_TC_EGRESS: + case BPF_TC_INGRESS | BPF_TC_EGRESS: + if (OPTS_GET(hook, parent, 0)) + return -EINVAL; + *config = &clsact_config; + return 0; + case BPF_TC_CUSTOM: + return -EOPNOTSUPP; + default: + return -EINVAL; + } +} + +static int tc_get_tcm_parent(enum bpf_tc_attach_point attach_point, + __u32 *parent) +{ + switch (attach_point) { + case BPF_TC_INGRESS: + case BPF_TC_EGRESS: + if (*parent) + return -EINVAL; + *parent = TC_H_MAKE(TC_H_CLSACT, + attach_point == BPF_TC_INGRESS ? + TC_H_MIN_INGRESS : TC_H_MIN_EGRESS); + break; + case BPF_TC_CUSTOM: + if (!*parent) + return -EINVAL; + break; + default: + return -EINVAL; + } + return 0; +} + +static int tc_qdisc_modify(struct bpf_tc_hook *hook, int cmd, int flags) +{ + qdisc_config_t config; + int ret; + struct libbpf_nla_req req; + + ret = attach_point_to_config(hook, &config); + if (ret < 0) + return ret; + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | flags; + req.nh.nlmsg_type = cmd; + req.tc.tcm_family = AF_UNSPEC; + req.tc.tcm_ifindex = OPTS_GET(hook, ifindex, 0); + + ret = config(&req); + if (ret < 0) + return ret; + + return libbpf_netlink_send_recv(&req, NETLINK_ROUTE, NULL, NULL, NULL); +} + +static int tc_qdisc_create_excl(struct bpf_tc_hook *hook) +{ + return tc_qdisc_modify(hook, RTM_NEWQDISC, NLM_F_CREATE | NLM_F_EXCL); +} + +static int tc_qdisc_delete(struct bpf_tc_hook *hook) +{ + return tc_qdisc_modify(hook, RTM_DELQDISC, 0); +} + +int bpf_tc_hook_create(struct bpf_tc_hook *hook) +{ + int ret; + + if (!hook || !OPTS_VALID(hook, bpf_tc_hook) || + OPTS_GET(hook, ifindex, 0) <= 0) + return libbpf_err(-EINVAL); + + ret = tc_qdisc_create_excl(hook); + return libbpf_err(ret); +} + +static int __bpf_tc_detach(const struct bpf_tc_hook *hook, + const struct bpf_tc_opts *opts, + const bool flush); + +int bpf_tc_hook_destroy(struct bpf_tc_hook *hook) +{ + if (!hook || !OPTS_VALID(hook, bpf_tc_hook) || + OPTS_GET(hook, ifindex, 0) <= 0) + return libbpf_err(-EINVAL); + + switch (OPTS_GET(hook, attach_point, 0)) { + case BPF_TC_INGRESS: + case BPF_TC_EGRESS: + return libbpf_err(__bpf_tc_detach(hook, NULL, true)); + case BPF_TC_INGRESS | BPF_TC_EGRESS: + return libbpf_err(tc_qdisc_delete(hook)); + case BPF_TC_CUSTOM: + return libbpf_err(-EOPNOTSUPP); + default: + return libbpf_err(-EINVAL); + } +} + +struct bpf_cb_ctx { + struct bpf_tc_opts *opts; + bool processed; +}; + +static int __get_tc_info(void *cookie, struct tcmsg *tc, struct nlattr **tb, + bool unicast) +{ + struct nlattr *tbb[TCA_BPF_MAX + 1]; + struct bpf_cb_ctx *info = cookie; + + if (!info || !info->opts) + return -EINVAL; + if (unicast && info->processed) + return -EINVAL; + if (!tb[TCA_OPTIONS]) + return NL_CONT; + + libbpf_nla_parse_nested(tbb, TCA_BPF_MAX, tb[TCA_OPTIONS], NULL); + if (!tbb[TCA_BPF_ID]) + return -EINVAL; + + OPTS_SET(info->opts, prog_id, libbpf_nla_getattr_u32(tbb[TCA_BPF_ID])); + OPTS_SET(info->opts, handle, tc->tcm_handle); + OPTS_SET(info->opts, priority, TC_H_MAJ(tc->tcm_info) >> 16); + + info->processed = true; + return unicast ? NL_NEXT : NL_DONE; +} + +static int get_tc_info(struct nlmsghdr *nh, libbpf_dump_nlmsg_t fn, + void *cookie) +{ + struct tcmsg *tc = NLMSG_DATA(nh); + struct nlattr *tb[TCA_MAX + 1]; + + libbpf_nla_parse(tb, TCA_MAX, + (struct nlattr *)((void *)tc + NLMSG_ALIGN(sizeof(*tc))), + NLMSG_PAYLOAD(nh, sizeof(*tc)), NULL); + if (!tb[TCA_KIND]) + return NL_CONT; + return __get_tc_info(cookie, tc, tb, nh->nlmsg_flags & NLM_F_ECHO); +} + +static int tc_add_fd_and_name(struct libbpf_nla_req *req, int fd) +{ + struct bpf_prog_info info; + __u32 info_len = sizeof(info); + char name[256]; + int len, ret; + + memset(&info, 0, info_len); + ret = bpf_prog_get_info_by_fd(fd, &info, &info_len); + if (ret < 0) + return ret; + + ret = nlattr_add(req, TCA_BPF_FD, &fd, sizeof(fd)); + if (ret < 0) + return ret; + len = snprintf(name, sizeof(name), "%s:[%u]", info.name, info.id); + if (len < 0) + return -errno; + if (len >= sizeof(name)) + return -ENAMETOOLONG; + return nlattr_add(req, TCA_BPF_NAME, name, len + 1); +} + +int bpf_tc_attach(const struct bpf_tc_hook *hook, struct bpf_tc_opts *opts) +{ + __u32 protocol, bpf_flags, handle, priority, parent, prog_id, flags; + int ret, ifindex, attach_point, prog_fd; + struct bpf_cb_ctx info = {}; + struct libbpf_nla_req req; + struct nlattr *nla; + + if (!hook || !opts || + !OPTS_VALID(hook, bpf_tc_hook) || + !OPTS_VALID(opts, bpf_tc_opts)) + return libbpf_err(-EINVAL); + + ifindex = OPTS_GET(hook, ifindex, 0); + parent = OPTS_GET(hook, parent, 0); + attach_point = OPTS_GET(hook, attach_point, 0); + + handle = OPTS_GET(opts, handle, 0); + priority = OPTS_GET(opts, priority, 0); + prog_fd = OPTS_GET(opts, prog_fd, 0); + prog_id = OPTS_GET(opts, prog_id, 0); + flags = OPTS_GET(opts, flags, 0); + + if (ifindex <= 0 || !prog_fd || prog_id) + return libbpf_err(-EINVAL); + if (priority > UINT16_MAX) + return libbpf_err(-EINVAL); + if (flags & ~BPF_TC_F_REPLACE) + return libbpf_err(-EINVAL); + + flags = (flags & BPF_TC_F_REPLACE) ? NLM_F_REPLACE : NLM_F_EXCL; + protocol = ETH_P_ALL; + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_CREATE | + NLM_F_ECHO | flags; + req.nh.nlmsg_type = RTM_NEWTFILTER; + req.tc.tcm_family = AF_UNSPEC; + req.tc.tcm_ifindex = ifindex; + req.tc.tcm_handle = handle; + req.tc.tcm_info = TC_H_MAKE(priority << 16, htons(protocol)); + + ret = tc_get_tcm_parent(attach_point, &parent); + if (ret < 0) + return libbpf_err(ret); + req.tc.tcm_parent = parent; + + ret = nlattr_add(&req, TCA_KIND, "bpf", sizeof("bpf")); + if (ret < 0) + return libbpf_err(ret); + nla = nlattr_begin_nested(&req, TCA_OPTIONS); + if (!nla) + return libbpf_err(-EMSGSIZE); + ret = tc_add_fd_and_name(&req, prog_fd); + if (ret < 0) + return libbpf_err(ret); + bpf_flags = TCA_BPF_FLAG_ACT_DIRECT; + ret = nlattr_add(&req, TCA_BPF_FLAGS, &bpf_flags, sizeof(bpf_flags)); + if (ret < 0) + return libbpf_err(ret); + nlattr_end_nested(&req, nla); + + info.opts = opts; + + ret = libbpf_netlink_send_recv(&req, NETLINK_ROUTE, get_tc_info, NULL, + &info); + if (ret < 0) + return libbpf_err(ret); + if (!info.processed) + return libbpf_err(-ENOENT); + return ret; +} + +static int __bpf_tc_detach(const struct bpf_tc_hook *hook, + const struct bpf_tc_opts *opts, + const bool flush) +{ + __u32 protocol = 0, handle, priority, parent, prog_id, flags; + int ret, ifindex, attach_point, prog_fd; + struct libbpf_nla_req req; + + if (!hook || + !OPTS_VALID(hook, bpf_tc_hook) || + !OPTS_VALID(opts, bpf_tc_opts)) + return -EINVAL; + + ifindex = OPTS_GET(hook, ifindex, 0); + parent = OPTS_GET(hook, parent, 0); + attach_point = OPTS_GET(hook, attach_point, 0); + + handle = OPTS_GET(opts, handle, 0); + priority = OPTS_GET(opts, priority, 0); + prog_fd = OPTS_GET(opts, prog_fd, 0); + prog_id = OPTS_GET(opts, prog_id, 0); + flags = OPTS_GET(opts, flags, 0); + + if (ifindex <= 0 || flags || prog_fd || prog_id) + return -EINVAL; + if (priority > UINT16_MAX) + return -EINVAL; + if (!flush) { + if (!handle || !priority) + return -EINVAL; + protocol = ETH_P_ALL; + } else { + if (handle || priority) + return -EINVAL; + } + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; + req.nh.nlmsg_type = RTM_DELTFILTER; + req.tc.tcm_family = AF_UNSPEC; + req.tc.tcm_ifindex = ifindex; + if (!flush) { + req.tc.tcm_handle = handle; + req.tc.tcm_info = TC_H_MAKE(priority << 16, htons(protocol)); + } + + ret = tc_get_tcm_parent(attach_point, &parent); + if (ret < 0) + return ret; + req.tc.tcm_parent = parent; + + if (!flush) { + ret = nlattr_add(&req, TCA_KIND, "bpf", sizeof("bpf")); + if (ret < 0) + return ret; + } + + return libbpf_netlink_send_recv(&req, NETLINK_ROUTE, NULL, NULL, NULL); +} + +int bpf_tc_detach(const struct bpf_tc_hook *hook, + const struct bpf_tc_opts *opts) +{ + int ret; + + if (!opts) + return libbpf_err(-EINVAL); + + ret = __bpf_tc_detach(hook, opts, false); + return libbpf_err(ret); +} + +int bpf_tc_query(const struct bpf_tc_hook *hook, struct bpf_tc_opts *opts) +{ + __u32 protocol, handle, priority, parent, prog_id, flags; + int ret, ifindex, attach_point, prog_fd; + struct bpf_cb_ctx info = {}; + struct libbpf_nla_req req; + + if (!hook || !opts || + !OPTS_VALID(hook, bpf_tc_hook) || + !OPTS_VALID(opts, bpf_tc_opts)) + return libbpf_err(-EINVAL); + + ifindex = OPTS_GET(hook, ifindex, 0); + parent = OPTS_GET(hook, parent, 0); + attach_point = OPTS_GET(hook, attach_point, 0); + + handle = OPTS_GET(opts, handle, 0); + priority = OPTS_GET(opts, priority, 0); + prog_fd = OPTS_GET(opts, prog_fd, 0); + prog_id = OPTS_GET(opts, prog_id, 0); + flags = OPTS_GET(opts, flags, 0); + + if (ifindex <= 0 || flags || prog_fd || prog_id || + !handle || !priority) + return libbpf_err(-EINVAL); + if (priority > UINT16_MAX) + return libbpf_err(-EINVAL); + + protocol = ETH_P_ALL; + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST; + req.nh.nlmsg_type = RTM_GETTFILTER; + req.tc.tcm_family = AF_UNSPEC; + req.tc.tcm_ifindex = ifindex; + req.tc.tcm_handle = handle; + req.tc.tcm_info = TC_H_MAKE(priority << 16, htons(protocol)); + + ret = tc_get_tcm_parent(attach_point, &parent); + if (ret < 0) + return libbpf_err(ret); + req.tc.tcm_parent = parent; + + ret = nlattr_add(&req, TCA_KIND, "bpf", sizeof("bpf")); + if (ret < 0) + return libbpf_err(ret); + + info.opts = opts; + + ret = libbpf_netlink_send_recv(&req, NETLINK_ROUTE, get_tc_info, NULL, + &info); + if (ret < 0) + return libbpf_err(ret); + if (!info.processed) + return libbpf_err(-ENOENT); + return ret; +} diff --git a/bpftool/libbpf/src/nlattr.c b/bpftool/libbpf/src/nlattr.c new file mode 100644 index 0000000..975e265 --- /dev/null +++ b/bpftool/libbpf/src/nlattr.c @@ -0,0 +1,195 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * NETLINK Netlink attributes + * + * Copyright (c) 2003-2013 Thomas Graf + */ + +#include +#include +#include +#include +#include "nlattr.h" +#include "libbpf_internal.h" + +static uint16_t nla_attr_minlen[LIBBPF_NLA_TYPE_MAX+1] = { + [LIBBPF_NLA_U8] = sizeof(uint8_t), + [LIBBPF_NLA_U16] = sizeof(uint16_t), + [LIBBPF_NLA_U32] = sizeof(uint32_t), + [LIBBPF_NLA_U64] = sizeof(uint64_t), + [LIBBPF_NLA_STRING] = 1, + [LIBBPF_NLA_FLAG] = 0, +}; + +static struct nlattr *nla_next(const struct nlattr *nla, int *remaining) +{ + int totlen = NLA_ALIGN(nla->nla_len); + + *remaining -= totlen; + return (struct nlattr *)((void *)nla + totlen); +} + +static int nla_ok(const struct nlattr *nla, int remaining) +{ + return remaining >= (int)sizeof(*nla) && + nla->nla_len >= sizeof(*nla) && + nla->nla_len <= remaining; +} + +static int nla_type(const struct nlattr *nla) +{ + return nla->nla_type & NLA_TYPE_MASK; +} + +static int validate_nla(struct nlattr *nla, int maxtype, + struct libbpf_nla_policy *policy) +{ + struct libbpf_nla_policy *pt; + unsigned int minlen = 0; + int type = nla_type(nla); + + if (type < 0 || type > maxtype) + return 0; + + pt = &policy[type]; + + if (pt->type > LIBBPF_NLA_TYPE_MAX) + return 0; + + if (pt->minlen) + minlen = pt->minlen; + else if (pt->type != LIBBPF_NLA_UNSPEC) + minlen = nla_attr_minlen[pt->type]; + + if (libbpf_nla_len(nla) < minlen) + return -1; + + if (pt->maxlen && libbpf_nla_len(nla) > pt->maxlen) + return -1; + + if (pt->type == LIBBPF_NLA_STRING) { + char *data = libbpf_nla_data(nla); + + if (data[libbpf_nla_len(nla) - 1] != '\0') + return -1; + } + + return 0; +} + +static inline int nlmsg_len(const struct nlmsghdr *nlh) +{ + return nlh->nlmsg_len - NLMSG_HDRLEN; +} + +/** + * Create attribute index based on a stream of attributes. + * @arg tb Index array to be filled (maxtype+1 elements). + * @arg maxtype Maximum attribute type expected and accepted. + * @arg head Head of attribute stream. + * @arg len Length of attribute stream. + * @arg policy Attribute validation policy. + * + * Iterates over the stream of attributes and stores a pointer to each + * attribute in the index array using the attribute type as index to + * the array. Attribute with a type greater than the maximum type + * specified will be silently ignored in order to maintain backwards + * compatibility. If \a policy is not NULL, the attribute will be + * validated using the specified policy. + * + * @see nla_validate + * @return 0 on success or a negative error code. + */ +int libbpf_nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, + int len, struct libbpf_nla_policy *policy) +{ + struct nlattr *nla; + int rem, err; + + memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1)); + + libbpf_nla_for_each_attr(nla, head, len, rem) { + int type = nla_type(nla); + + if (type > maxtype) + continue; + + if (policy) { + err = validate_nla(nla, maxtype, policy); + if (err < 0) + goto errout; + } + + if (tb[type]) + pr_warn("Attribute of type %#x found multiple times in message, " + "previous attribute is being ignored.\n", type); + + tb[type] = nla; + } + + err = 0; +errout: + return err; +} + +/** + * Create attribute index based on nested attribute + * @arg tb Index array to be filled (maxtype+1 elements). + * @arg maxtype Maximum attribute type expected and accepted. + * @arg nla Nested Attribute. + * @arg policy Attribute validation policy. + * + * Feeds the stream of attributes nested into the specified attribute + * to libbpf_nla_parse(). + * + * @see libbpf_nla_parse + * @return 0 on success or a negative error code. + */ +int libbpf_nla_parse_nested(struct nlattr *tb[], int maxtype, + struct nlattr *nla, + struct libbpf_nla_policy *policy) +{ + return libbpf_nla_parse(tb, maxtype, libbpf_nla_data(nla), + libbpf_nla_len(nla), policy); +} + +/* dump netlink extended ack error message */ +int libbpf_nla_dump_errormsg(struct nlmsghdr *nlh) +{ + struct libbpf_nla_policy extack_policy[NLMSGERR_ATTR_MAX + 1] = { + [NLMSGERR_ATTR_MSG] = { .type = LIBBPF_NLA_STRING }, + [NLMSGERR_ATTR_OFFS] = { .type = LIBBPF_NLA_U32 }, + }; + struct nlattr *tb[NLMSGERR_ATTR_MAX + 1], *attr; + struct nlmsgerr *err; + char *errmsg = NULL; + int hlen, alen; + + /* no TLVs, nothing to do here */ + if (!(nlh->nlmsg_flags & NLM_F_ACK_TLVS)) + return 0; + + err = (struct nlmsgerr *)NLMSG_DATA(nlh); + hlen = sizeof(*err); + + /* if NLM_F_CAPPED is set then the inner err msg was capped */ + if (!(nlh->nlmsg_flags & NLM_F_CAPPED)) + hlen += nlmsg_len(&err->msg); + + attr = (struct nlattr *) ((void *) err + hlen); + alen = (void *)nlh + nlh->nlmsg_len - (void *)attr; + + if (libbpf_nla_parse(tb, NLMSGERR_ATTR_MAX, attr, alen, + extack_policy) != 0) { + pr_warn("Failed to parse extended error attributes\n"); + return 0; + } + + if (tb[NLMSGERR_ATTR_MSG]) + errmsg = (char *) libbpf_nla_data(tb[NLMSGERR_ATTR_MSG]); + + pr_warn("Kernel error message: %s\n", errmsg); + + return 0; +} diff --git a/bpftool/libbpf/src/nlattr.h b/bpftool/libbpf/src/nlattr.h new file mode 100644 index 0000000..d92d1c1 --- /dev/null +++ b/bpftool/libbpf/src/nlattr.h @@ -0,0 +1,176 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * NETLINK Netlink attributes + * + * Copyright (c) 2003-2013 Thomas Graf + */ + +#ifndef __LIBBPF_NLATTR_H +#define __LIBBPF_NLATTR_H + +#include +#include +#include +#include +#include +#include + +/* avoid multiple definition of netlink features */ +#define __LINUX_NETLINK_H + +/** + * Standard attribute types to specify validation policy + */ +enum { + LIBBPF_NLA_UNSPEC, /**< Unspecified type, binary data chunk */ + LIBBPF_NLA_U8, /**< 8 bit integer */ + LIBBPF_NLA_U16, /**< 16 bit integer */ + LIBBPF_NLA_U32, /**< 32 bit integer */ + LIBBPF_NLA_U64, /**< 64 bit integer */ + LIBBPF_NLA_STRING, /**< NUL terminated character string */ + LIBBPF_NLA_FLAG, /**< Flag */ + LIBBPF_NLA_MSECS, /**< Micro seconds (64bit) */ + LIBBPF_NLA_NESTED, /**< Nested attributes */ + __LIBBPF_NLA_TYPE_MAX, +}; + +#define LIBBPF_NLA_TYPE_MAX (__LIBBPF_NLA_TYPE_MAX - 1) + +/** + * @ingroup attr + * Attribute validation policy. + * + * See section @core_doc{core_attr_parse,Attribute Parsing} for more details. + */ +struct libbpf_nla_policy { + /** Type of attribute or LIBBPF_NLA_UNSPEC */ + uint16_t type; + + /** Minimal length of payload required */ + uint16_t minlen; + + /** Maximal length of payload allowed */ + uint16_t maxlen; +}; + +struct libbpf_nla_req { + struct nlmsghdr nh; + union { + struct ifinfomsg ifinfo; + struct tcmsg tc; + struct genlmsghdr gnl; + }; + char buf[128]; +}; + +/** + * @ingroup attr + * Iterate over a stream of attributes + * @arg pos loop counter, set to current attribute + * @arg head head of attribute stream + * @arg len length of attribute stream + * @arg rem initialized to len, holds bytes currently remaining in stream + */ +#define libbpf_nla_for_each_attr(pos, head, len, rem) \ + for (pos = head, rem = len; \ + nla_ok(pos, rem); \ + pos = nla_next(pos, &(rem))) + +/** + * libbpf_nla_data - head of payload + * @nla: netlink attribute + */ +static inline void *libbpf_nla_data(const struct nlattr *nla) +{ + return (void *)nla + NLA_HDRLEN; +} + +static inline uint8_t libbpf_nla_getattr_u8(const struct nlattr *nla) +{ + return *(uint8_t *)libbpf_nla_data(nla); +} + +static inline uint16_t libbpf_nla_getattr_u16(const struct nlattr *nla) +{ + return *(uint16_t *)libbpf_nla_data(nla); +} + +static inline uint32_t libbpf_nla_getattr_u32(const struct nlattr *nla) +{ + return *(uint32_t *)libbpf_nla_data(nla); +} + +static inline uint64_t libbpf_nla_getattr_u64(const struct nlattr *nla) +{ + return *(uint64_t *)libbpf_nla_data(nla); +} + +static inline const char *libbpf_nla_getattr_str(const struct nlattr *nla) +{ + return (const char *)libbpf_nla_data(nla); +} + +/** + * libbpf_nla_len - length of payload + * @nla: netlink attribute + */ +static inline int libbpf_nla_len(const struct nlattr *nla) +{ + return nla->nla_len - NLA_HDRLEN; +} + +int libbpf_nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, + int len, struct libbpf_nla_policy *policy); +int libbpf_nla_parse_nested(struct nlattr *tb[], int maxtype, + struct nlattr *nla, + struct libbpf_nla_policy *policy); + +int libbpf_nla_dump_errormsg(struct nlmsghdr *nlh); + +static inline struct nlattr *nla_data(struct nlattr *nla) +{ + return (struct nlattr *)((void *)nla + NLA_HDRLEN); +} + +static inline struct nlattr *req_tail(struct libbpf_nla_req *req) +{ + return (struct nlattr *)((void *)req + NLMSG_ALIGN(req->nh.nlmsg_len)); +} + +static inline int nlattr_add(struct libbpf_nla_req *req, int type, + const void *data, int len) +{ + struct nlattr *nla; + + if (NLMSG_ALIGN(req->nh.nlmsg_len) + NLA_ALIGN(NLA_HDRLEN + len) > sizeof(*req)) + return -EMSGSIZE; + if (!!data != !!len) + return -EINVAL; + + nla = req_tail(req); + nla->nla_type = type; + nla->nla_len = NLA_HDRLEN + len; + if (data) + memcpy(nla_data(nla), data, len); + req->nh.nlmsg_len = NLMSG_ALIGN(req->nh.nlmsg_len) + NLA_ALIGN(nla->nla_len); + return 0; +} + +static inline struct nlattr *nlattr_begin_nested(struct libbpf_nla_req *req, int type) +{ + struct nlattr *tail; + + tail = req_tail(req); + if (nlattr_add(req, type | NLA_F_NESTED, NULL, 0)) + return NULL; + return tail; +} + +static inline void nlattr_end_nested(struct libbpf_nla_req *req, + struct nlattr *tail) +{ + tail->nla_len = (void *)req_tail(req) - (void *)tail; +} + +#endif /* __LIBBPF_NLATTR_H */ diff --git a/bpftool/libbpf/src/relo_core.c b/bpftool/libbpf/src/relo_core.c new file mode 100644 index 0000000..c4b0e81 --- /dev/null +++ b/bpftool/libbpf/src/relo_core.c @@ -0,0 +1,1690 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2019 Facebook */ + +#ifdef __KERNEL__ +#include +#include +#include +#include +#include "relo_core.h" + +static const char *btf_kind_str(const struct btf_type *t) +{ + return btf_type_str(t); +} + +static bool is_ldimm64_insn(struct bpf_insn *insn) +{ + return insn->code == (BPF_LD | BPF_IMM | BPF_DW); +} + +static const struct btf_type * +skip_mods_and_typedefs(const struct btf *btf, u32 id, u32 *res_id) +{ + return btf_type_skip_modifiers(btf, id, res_id); +} + +static const char *btf__name_by_offset(const struct btf *btf, u32 offset) +{ + return btf_name_by_offset(btf, offset); +} + +static s64 btf__resolve_size(const struct btf *btf, u32 type_id) +{ + const struct btf_type *t; + int size; + + t = btf_type_by_id(btf, type_id); + t = btf_resolve_size(btf, t, &size); + if (IS_ERR(t)) + return PTR_ERR(t); + return size; +} + +enum libbpf_print_level { + LIBBPF_WARN, + LIBBPF_INFO, + LIBBPF_DEBUG, +}; + +#undef pr_warn +#undef pr_info +#undef pr_debug +#define pr_warn(fmt, log, ...) bpf_log((void *)log, fmt, "", ##__VA_ARGS__) +#define pr_info(fmt, log, ...) bpf_log((void *)log, fmt, "", ##__VA_ARGS__) +#define pr_debug(fmt, log, ...) bpf_log((void *)log, fmt, "", ##__VA_ARGS__) +#define libbpf_print(level, fmt, ...) bpf_log((void *)prog_name, fmt, ##__VA_ARGS__) +#else +#include +#include +#include +#include +#include + +#include "libbpf.h" +#include "bpf.h" +#include "btf.h" +#include "str_error.h" +#include "libbpf_internal.h" +#endif + +static bool is_flex_arr(const struct btf *btf, + const struct bpf_core_accessor *acc, + const struct btf_array *arr) +{ + const struct btf_type *t; + + /* not a flexible array, if not inside a struct or has non-zero size */ + if (!acc->name || arr->nelems > 0) + return false; + + /* has to be the last member of enclosing struct */ + t = btf_type_by_id(btf, acc->type_id); + return acc->idx == btf_vlen(t) - 1; +} + +static const char *core_relo_kind_str(enum bpf_core_relo_kind kind) +{ + switch (kind) { + case BPF_CORE_FIELD_BYTE_OFFSET: return "byte_off"; + case BPF_CORE_FIELD_BYTE_SIZE: return "byte_sz"; + case BPF_CORE_FIELD_EXISTS: return "field_exists"; + case BPF_CORE_FIELD_SIGNED: return "signed"; + case BPF_CORE_FIELD_LSHIFT_U64: return "lshift_u64"; + case BPF_CORE_FIELD_RSHIFT_U64: return "rshift_u64"; + case BPF_CORE_TYPE_ID_LOCAL: return "local_type_id"; + case BPF_CORE_TYPE_ID_TARGET: return "target_type_id"; + case BPF_CORE_TYPE_EXISTS: return "type_exists"; + case BPF_CORE_TYPE_MATCHES: return "type_matches"; + case BPF_CORE_TYPE_SIZE: return "type_size"; + case BPF_CORE_ENUMVAL_EXISTS: return "enumval_exists"; + case BPF_CORE_ENUMVAL_VALUE: return "enumval_value"; + default: return "unknown"; + } +} + +static bool core_relo_is_field_based(enum bpf_core_relo_kind kind) +{ + switch (kind) { + case BPF_CORE_FIELD_BYTE_OFFSET: + case BPF_CORE_FIELD_BYTE_SIZE: + case BPF_CORE_FIELD_EXISTS: + case BPF_CORE_FIELD_SIGNED: + case BPF_CORE_FIELD_LSHIFT_U64: + case BPF_CORE_FIELD_RSHIFT_U64: + return true; + default: + return false; + } +} + +static bool core_relo_is_type_based(enum bpf_core_relo_kind kind) +{ + switch (kind) { + case BPF_CORE_TYPE_ID_LOCAL: + case BPF_CORE_TYPE_ID_TARGET: + case BPF_CORE_TYPE_EXISTS: + case BPF_CORE_TYPE_MATCHES: + case BPF_CORE_TYPE_SIZE: + return true; + default: + return false; + } +} + +static bool core_relo_is_enumval_based(enum bpf_core_relo_kind kind) +{ + switch (kind) { + case BPF_CORE_ENUMVAL_EXISTS: + case BPF_CORE_ENUMVAL_VALUE: + return true; + default: + return false; + } +} + +int __bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id, int level) +{ + const struct btf_type *local_type, *targ_type; + int depth = 32; /* max recursion depth */ + + /* caller made sure that names match (ignoring flavor suffix) */ + local_type = btf_type_by_id(local_btf, local_id); + targ_type = btf_type_by_id(targ_btf, targ_id); + if (!btf_kind_core_compat(local_type, targ_type)) + return 0; + +recur: + depth--; + if (depth < 0) + return -EINVAL; + + local_type = skip_mods_and_typedefs(local_btf, local_id, &local_id); + targ_type = skip_mods_and_typedefs(targ_btf, targ_id, &targ_id); + if (!local_type || !targ_type) + return -EINVAL; + + if (!btf_kind_core_compat(local_type, targ_type)) + return 0; + + switch (btf_kind(local_type)) { + case BTF_KIND_UNKN: + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_ENUM: + case BTF_KIND_FWD: + case BTF_KIND_ENUM64: + return 1; + case BTF_KIND_INT: + /* just reject deprecated bitfield-like integers; all other + * integers are by default compatible between each other + */ + return btf_int_offset(local_type) == 0 && btf_int_offset(targ_type) == 0; + case BTF_KIND_PTR: + local_id = local_type->type; + targ_id = targ_type->type; + goto recur; + case BTF_KIND_ARRAY: + local_id = btf_array(local_type)->type; + targ_id = btf_array(targ_type)->type; + goto recur; + case BTF_KIND_FUNC_PROTO: { + struct btf_param *local_p = btf_params(local_type); + struct btf_param *targ_p = btf_params(targ_type); + __u16 local_vlen = btf_vlen(local_type); + __u16 targ_vlen = btf_vlen(targ_type); + int i, err; + + if (local_vlen != targ_vlen) + return 0; + + for (i = 0; i < local_vlen; i++, local_p++, targ_p++) { + if (level <= 0) + return -EINVAL; + + skip_mods_and_typedefs(local_btf, local_p->type, &local_id); + skip_mods_and_typedefs(targ_btf, targ_p->type, &targ_id); + err = __bpf_core_types_are_compat(local_btf, local_id, targ_btf, targ_id, + level - 1); + if (err <= 0) + return err; + } + + /* tail recurse for return type check */ + skip_mods_and_typedefs(local_btf, local_type->type, &local_id); + skip_mods_and_typedefs(targ_btf, targ_type->type, &targ_id); + goto recur; + } + default: + pr_warn("unexpected kind %s relocated, local [%d], target [%d]\n", + btf_kind_str(local_type), local_id, targ_id); + return 0; + } +} + +/* + * Turn bpf_core_relo into a low- and high-level spec representation, + * validating correctness along the way, as well as calculating resulting + * field bit offset, specified by accessor string. Low-level spec captures + * every single level of nestedness, including traversing anonymous + * struct/union members. High-level one only captures semantically meaningful + * "turning points": named fields and array indicies. + * E.g., for this case: + * + * struct sample { + * int __unimportant; + * struct { + * int __1; + * int __2; + * int a[7]; + * }; + * }; + * + * struct sample *s = ...; + * + * int x = &s->a[3]; // access string = '0:1:2:3' + * + * Low-level spec has 1:1 mapping with each element of access string (it's + * just a parsed access string representation): [0, 1, 2, 3]. + * + * High-level spec will capture only 3 points: + * - initial zero-index access by pointer (&s->... is the same as &s[0]...); + * - field 'a' access (corresponds to '2' in low-level spec); + * - array element #3 access (corresponds to '3' in low-level spec). + * + * Type-based relocations (TYPE_EXISTS/TYPE_MATCHES/TYPE_SIZE, + * TYPE_ID_LOCAL/TYPE_ID_TARGET) don't capture any field information. Their + * spec and raw_spec are kept empty. + * + * Enum value-based relocations (ENUMVAL_EXISTS/ENUMVAL_VALUE) use access + * string to specify enumerator's value index that need to be relocated. + */ +int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, + const struct bpf_core_relo *relo, + struct bpf_core_spec *spec) +{ + int access_idx, parsed_len, i; + struct bpf_core_accessor *acc; + const struct btf_type *t; + const char *name, *spec_str; + __u32 id, name_off; + __s64 sz; + + spec_str = btf__name_by_offset(btf, relo->access_str_off); + if (str_is_empty(spec_str) || *spec_str == ':') + return -EINVAL; + + memset(spec, 0, sizeof(*spec)); + spec->btf = btf; + spec->root_type_id = relo->type_id; + spec->relo_kind = relo->kind; + + /* type-based relocations don't have a field access string */ + if (core_relo_is_type_based(relo->kind)) { + if (strcmp(spec_str, "0")) + return -EINVAL; + return 0; + } + + /* parse spec_str="0:1:2:3:4" into array raw_spec=[0, 1, 2, 3, 4] */ + while (*spec_str) { + if (*spec_str == ':') + ++spec_str; + if (sscanf(spec_str, "%d%n", &access_idx, &parsed_len) != 1) + return -EINVAL; + if (spec->raw_len == BPF_CORE_SPEC_MAX_LEN) + return -E2BIG; + spec_str += parsed_len; + spec->raw_spec[spec->raw_len++] = access_idx; + } + + if (spec->raw_len == 0) + return -EINVAL; + + t = skip_mods_and_typedefs(btf, relo->type_id, &id); + if (!t) + return -EINVAL; + + access_idx = spec->raw_spec[0]; + acc = &spec->spec[0]; + acc->type_id = id; + acc->idx = access_idx; + spec->len++; + + if (core_relo_is_enumval_based(relo->kind)) { + if (!btf_is_any_enum(t) || spec->raw_len > 1 || access_idx >= btf_vlen(t)) + return -EINVAL; + + /* record enumerator name in a first accessor */ + name_off = btf_is_enum(t) ? btf_enum(t)[access_idx].name_off + : btf_enum64(t)[access_idx].name_off; + acc->name = btf__name_by_offset(btf, name_off); + return 0; + } + + if (!core_relo_is_field_based(relo->kind)) + return -EINVAL; + + sz = btf__resolve_size(btf, id); + if (sz < 0) + return sz; + spec->bit_offset = access_idx * sz * 8; + + for (i = 1; i < spec->raw_len; i++) { + t = skip_mods_and_typedefs(btf, id, &id); + if (!t) + return -EINVAL; + + access_idx = spec->raw_spec[i]; + acc = &spec->spec[spec->len]; + + if (btf_is_composite(t)) { + const struct btf_member *m; + __u32 bit_offset; + + if (access_idx >= btf_vlen(t)) + return -EINVAL; + + bit_offset = btf_member_bit_offset(t, access_idx); + spec->bit_offset += bit_offset; + + m = btf_members(t) + access_idx; + if (m->name_off) { + name = btf__name_by_offset(btf, m->name_off); + if (str_is_empty(name)) + return -EINVAL; + + acc->type_id = id; + acc->idx = access_idx; + acc->name = name; + spec->len++; + } + + id = m->type; + } else if (btf_is_array(t)) { + const struct btf_array *a = btf_array(t); + bool flex; + + t = skip_mods_and_typedefs(btf, a->type, &id); + if (!t) + return -EINVAL; + + flex = is_flex_arr(btf, acc - 1, a); + if (!flex && access_idx >= a->nelems) + return -EINVAL; + + spec->spec[spec->len].type_id = id; + spec->spec[spec->len].idx = access_idx; + spec->len++; + + sz = btf__resolve_size(btf, id); + if (sz < 0) + return sz; + spec->bit_offset += access_idx * sz * 8; + } else { + pr_warn("prog '%s': relo for [%u] %s (at idx %d) captures type [%d] of unexpected kind %s\n", + prog_name, relo->type_id, spec_str, i, id, btf_kind_str(t)); + return -EINVAL; + } + } + + return 0; +} + +/* Check two types for compatibility for the purpose of field access + * relocation. const/volatile/restrict and typedefs are skipped to ensure we + * are relocating semantically compatible entities: + * - any two STRUCTs/UNIONs are compatible and can be mixed; + * - any two FWDs are compatible, if their names match (modulo flavor suffix); + * - any two PTRs are always compatible; + * - for ENUMs, names should be the same (ignoring flavor suffix) or at + * least one of enums should be anonymous; + * - for ENUMs, check sizes, names are ignored; + * - for INT, size and signedness are ignored; + * - any two FLOATs are always compatible; + * - for ARRAY, dimensionality is ignored, element types are checked for + * compatibility recursively; + * - everything else shouldn't be ever a target of relocation. + * These rules are not set in stone and probably will be adjusted as we get + * more experience with using BPF CO-RE relocations. + */ +static int bpf_core_fields_are_compat(const struct btf *local_btf, + __u32 local_id, + const struct btf *targ_btf, + __u32 targ_id) +{ + const struct btf_type *local_type, *targ_type; + +recur: + local_type = skip_mods_and_typedefs(local_btf, local_id, &local_id); + targ_type = skip_mods_and_typedefs(targ_btf, targ_id, &targ_id); + if (!local_type || !targ_type) + return -EINVAL; + + if (btf_is_composite(local_type) && btf_is_composite(targ_type)) + return 1; + if (!btf_kind_core_compat(local_type, targ_type)) + return 0; + + switch (btf_kind(local_type)) { + case BTF_KIND_PTR: + case BTF_KIND_FLOAT: + return 1; + case BTF_KIND_FWD: + case BTF_KIND_ENUM64: + case BTF_KIND_ENUM: { + const char *local_name, *targ_name; + size_t local_len, targ_len; + + local_name = btf__name_by_offset(local_btf, + local_type->name_off); + targ_name = btf__name_by_offset(targ_btf, targ_type->name_off); + local_len = bpf_core_essential_name_len(local_name); + targ_len = bpf_core_essential_name_len(targ_name); + /* one of them is anonymous or both w/ same flavor-less names */ + return local_len == 0 || targ_len == 0 || + (local_len == targ_len && + strncmp(local_name, targ_name, local_len) == 0); + } + case BTF_KIND_INT: + /* just reject deprecated bitfield-like integers; all other + * integers are by default compatible between each other + */ + return btf_int_offset(local_type) == 0 && + btf_int_offset(targ_type) == 0; + case BTF_KIND_ARRAY: + local_id = btf_array(local_type)->type; + targ_id = btf_array(targ_type)->type; + goto recur; + default: + return 0; + } +} + +/* + * Given single high-level named field accessor in local type, find + * corresponding high-level accessor for a target type. Along the way, + * maintain low-level spec for target as well. Also keep updating target + * bit offset. + * + * Searching is performed through recursive exhaustive enumeration of all + * fields of a struct/union. If there are any anonymous (embedded) + * structs/unions, they are recursively searched as well. If field with + * desired name is found, check compatibility between local and target types, + * before returning result. + * + * 1 is returned, if field is found. + * 0 is returned if no compatible field is found. + * <0 is returned on error. + */ +static int bpf_core_match_member(const struct btf *local_btf, + const struct bpf_core_accessor *local_acc, + const struct btf *targ_btf, + __u32 targ_id, + struct bpf_core_spec *spec, + __u32 *next_targ_id) +{ + const struct btf_type *local_type, *targ_type; + const struct btf_member *local_member, *m; + const char *local_name, *targ_name; + __u32 local_id; + int i, n, found; + + targ_type = skip_mods_and_typedefs(targ_btf, targ_id, &targ_id); + if (!targ_type) + return -EINVAL; + if (!btf_is_composite(targ_type)) + return 0; + + local_id = local_acc->type_id; + local_type = btf_type_by_id(local_btf, local_id); + local_member = btf_members(local_type) + local_acc->idx; + local_name = btf__name_by_offset(local_btf, local_member->name_off); + + n = btf_vlen(targ_type); + m = btf_members(targ_type); + for (i = 0; i < n; i++, m++) { + __u32 bit_offset; + + bit_offset = btf_member_bit_offset(targ_type, i); + + /* too deep struct/union/array nesting */ + if (spec->raw_len == BPF_CORE_SPEC_MAX_LEN) + return -E2BIG; + + /* speculate this member will be the good one */ + spec->bit_offset += bit_offset; + spec->raw_spec[spec->raw_len++] = i; + + targ_name = btf__name_by_offset(targ_btf, m->name_off); + if (str_is_empty(targ_name)) { + /* embedded struct/union, we need to go deeper */ + found = bpf_core_match_member(local_btf, local_acc, + targ_btf, m->type, + spec, next_targ_id); + if (found) /* either found or error */ + return found; + } else if (strcmp(local_name, targ_name) == 0) { + /* matching named field */ + struct bpf_core_accessor *targ_acc; + + targ_acc = &spec->spec[spec->len++]; + targ_acc->type_id = targ_id; + targ_acc->idx = i; + targ_acc->name = targ_name; + + *next_targ_id = m->type; + found = bpf_core_fields_are_compat(local_btf, + local_member->type, + targ_btf, m->type); + if (!found) + spec->len--; /* pop accessor */ + return found; + } + /* member turned out not to be what we looked for */ + spec->bit_offset -= bit_offset; + spec->raw_len--; + } + + return 0; +} + +/* + * Try to match local spec to a target type and, if successful, produce full + * target spec (high-level, low-level + bit offset). + */ +static int bpf_core_spec_match(struct bpf_core_spec *local_spec, + const struct btf *targ_btf, __u32 targ_id, + struct bpf_core_spec *targ_spec) +{ + const struct btf_type *targ_type; + const struct bpf_core_accessor *local_acc; + struct bpf_core_accessor *targ_acc; + int i, sz, matched; + __u32 name_off; + + memset(targ_spec, 0, sizeof(*targ_spec)); + targ_spec->btf = targ_btf; + targ_spec->root_type_id = targ_id; + targ_spec->relo_kind = local_spec->relo_kind; + + if (core_relo_is_type_based(local_spec->relo_kind)) { + if (local_spec->relo_kind == BPF_CORE_TYPE_MATCHES) + return bpf_core_types_match(local_spec->btf, + local_spec->root_type_id, + targ_btf, targ_id); + else + return bpf_core_types_are_compat(local_spec->btf, + local_spec->root_type_id, + targ_btf, targ_id); + } + + local_acc = &local_spec->spec[0]; + targ_acc = &targ_spec->spec[0]; + + if (core_relo_is_enumval_based(local_spec->relo_kind)) { + size_t local_essent_len, targ_essent_len; + const char *targ_name; + + /* has to resolve to an enum */ + targ_type = skip_mods_and_typedefs(targ_spec->btf, targ_id, &targ_id); + if (!btf_is_any_enum(targ_type)) + return 0; + + local_essent_len = bpf_core_essential_name_len(local_acc->name); + + for (i = 0; i < btf_vlen(targ_type); i++) { + if (btf_is_enum(targ_type)) + name_off = btf_enum(targ_type)[i].name_off; + else + name_off = btf_enum64(targ_type)[i].name_off; + + targ_name = btf__name_by_offset(targ_spec->btf, name_off); + targ_essent_len = bpf_core_essential_name_len(targ_name); + if (targ_essent_len != local_essent_len) + continue; + if (strncmp(local_acc->name, targ_name, local_essent_len) == 0) { + targ_acc->type_id = targ_id; + targ_acc->idx = i; + targ_acc->name = targ_name; + targ_spec->len++; + targ_spec->raw_spec[targ_spec->raw_len] = targ_acc->idx; + targ_spec->raw_len++; + return 1; + } + } + return 0; + } + + if (!core_relo_is_field_based(local_spec->relo_kind)) + return -EINVAL; + + for (i = 0; i < local_spec->len; i++, local_acc++, targ_acc++) { + targ_type = skip_mods_and_typedefs(targ_spec->btf, targ_id, + &targ_id); + if (!targ_type) + return -EINVAL; + + if (local_acc->name) { + matched = bpf_core_match_member(local_spec->btf, + local_acc, + targ_btf, targ_id, + targ_spec, &targ_id); + if (matched <= 0) + return matched; + } else { + /* for i=0, targ_id is already treated as array element + * type (because it's the original struct), for others + * we should find array element type first + */ + if (i > 0) { + const struct btf_array *a; + bool flex; + + if (!btf_is_array(targ_type)) + return 0; + + a = btf_array(targ_type); + flex = is_flex_arr(targ_btf, targ_acc - 1, a); + if (!flex && local_acc->idx >= a->nelems) + return 0; + if (!skip_mods_and_typedefs(targ_btf, a->type, + &targ_id)) + return -EINVAL; + } + + /* too deep struct/union/array nesting */ + if (targ_spec->raw_len == BPF_CORE_SPEC_MAX_LEN) + return -E2BIG; + + targ_acc->type_id = targ_id; + targ_acc->idx = local_acc->idx; + targ_acc->name = NULL; + targ_spec->len++; + targ_spec->raw_spec[targ_spec->raw_len] = targ_acc->idx; + targ_spec->raw_len++; + + sz = btf__resolve_size(targ_btf, targ_id); + if (sz < 0) + return sz; + targ_spec->bit_offset += local_acc->idx * sz * 8; + } + } + + return 1; +} + +static int bpf_core_calc_field_relo(const char *prog_name, + const struct bpf_core_relo *relo, + const struct bpf_core_spec *spec, + __u64 *val, __u32 *field_sz, __u32 *type_id, + bool *validate) +{ + const struct bpf_core_accessor *acc; + const struct btf_type *t; + __u32 byte_off, byte_sz, bit_off, bit_sz, field_type_id; + const struct btf_member *m; + const struct btf_type *mt; + bool bitfield; + __s64 sz; + + *field_sz = 0; + + if (relo->kind == BPF_CORE_FIELD_EXISTS) { + *val = spec ? 1 : 0; + return 0; + } + + if (!spec) + return -EUCLEAN; /* request instruction poisoning */ + + acc = &spec->spec[spec->len - 1]; + t = btf_type_by_id(spec->btf, acc->type_id); + + /* a[n] accessor needs special handling */ + if (!acc->name) { + if (relo->kind == BPF_CORE_FIELD_BYTE_OFFSET) { + *val = spec->bit_offset / 8; + /* remember field size for load/store mem size */ + sz = btf__resolve_size(spec->btf, acc->type_id); + if (sz < 0) + return -EINVAL; + *field_sz = sz; + *type_id = acc->type_id; + } else if (relo->kind == BPF_CORE_FIELD_BYTE_SIZE) { + sz = btf__resolve_size(spec->btf, acc->type_id); + if (sz < 0) + return -EINVAL; + *val = sz; + } else { + pr_warn("prog '%s': relo %d at insn #%d can't be applied to array access\n", + prog_name, relo->kind, relo->insn_off / 8); + return -EINVAL; + } + if (validate) + *validate = true; + return 0; + } + + m = btf_members(t) + acc->idx; + mt = skip_mods_and_typedefs(spec->btf, m->type, &field_type_id); + bit_off = spec->bit_offset; + bit_sz = btf_member_bitfield_size(t, acc->idx); + + bitfield = bit_sz > 0; + if (bitfield) { + byte_sz = mt->size; + byte_off = bit_off / 8 / byte_sz * byte_sz; + /* figure out smallest int size necessary for bitfield load */ + while (bit_off + bit_sz - byte_off * 8 > byte_sz * 8) { + if (byte_sz >= 8) { + /* bitfield can't be read with 64-bit read */ + pr_warn("prog '%s': relo %d at insn #%d can't be satisfied for bitfield\n", + prog_name, relo->kind, relo->insn_off / 8); + return -E2BIG; + } + byte_sz *= 2; + byte_off = bit_off / 8 / byte_sz * byte_sz; + } + } else { + sz = btf__resolve_size(spec->btf, field_type_id); + if (sz < 0) + return -EINVAL; + byte_sz = sz; + byte_off = spec->bit_offset / 8; + bit_sz = byte_sz * 8; + } + + /* for bitfields, all the relocatable aspects are ambiguous and we + * might disagree with compiler, so turn off validation of expected + * value, except for signedness + */ + if (validate) + *validate = !bitfield; + + switch (relo->kind) { + case BPF_CORE_FIELD_BYTE_OFFSET: + *val = byte_off; + if (!bitfield) { + *field_sz = byte_sz; + *type_id = field_type_id; + } + break; + case BPF_CORE_FIELD_BYTE_SIZE: + *val = byte_sz; + break; + case BPF_CORE_FIELD_SIGNED: + *val = (btf_is_any_enum(mt) && BTF_INFO_KFLAG(mt->info)) || + (btf_int_encoding(mt) & BTF_INT_SIGNED); + if (validate) + *validate = true; /* signedness is never ambiguous */ + break; + case BPF_CORE_FIELD_LSHIFT_U64: +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + *val = 64 - (bit_off + bit_sz - byte_off * 8); +#else + *val = (8 - byte_sz) * 8 + (bit_off - byte_off * 8); +#endif + break; + case BPF_CORE_FIELD_RSHIFT_U64: + *val = 64 - bit_sz; + if (validate) + *validate = true; /* right shift is never ambiguous */ + break; + case BPF_CORE_FIELD_EXISTS: + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static int bpf_core_calc_type_relo(const struct bpf_core_relo *relo, + const struct bpf_core_spec *spec, + __u64 *val, bool *validate) +{ + __s64 sz; + + /* by default, always check expected value in bpf_insn */ + if (validate) + *validate = true; + + /* type-based relos return zero when target type is not found */ + if (!spec) { + *val = 0; + return 0; + } + + switch (relo->kind) { + case BPF_CORE_TYPE_ID_TARGET: + *val = spec->root_type_id; + /* type ID, embedded in bpf_insn, might change during linking, + * so enforcing it is pointless + */ + if (validate) + *validate = false; + break; + case BPF_CORE_TYPE_EXISTS: + case BPF_CORE_TYPE_MATCHES: + *val = 1; + break; + case BPF_CORE_TYPE_SIZE: + sz = btf__resolve_size(spec->btf, spec->root_type_id); + if (sz < 0) + return -EINVAL; + *val = sz; + break; + case BPF_CORE_TYPE_ID_LOCAL: + /* BPF_CORE_TYPE_ID_LOCAL is handled specially and shouldn't get here */ + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static int bpf_core_calc_enumval_relo(const struct bpf_core_relo *relo, + const struct bpf_core_spec *spec, + __u64 *val) +{ + const struct btf_type *t; + + switch (relo->kind) { + case BPF_CORE_ENUMVAL_EXISTS: + *val = spec ? 1 : 0; + break; + case BPF_CORE_ENUMVAL_VALUE: + if (!spec) + return -EUCLEAN; /* request instruction poisoning */ + t = btf_type_by_id(spec->btf, spec->spec[0].type_id); + if (btf_is_enum(t)) + *val = btf_enum(t)[spec->spec[0].idx].val; + else + *val = btf_enum64_value(btf_enum64(t) + spec->spec[0].idx); + break; + default: + return -EOPNOTSUPP; + } + + return 0; +} + +/* Calculate original and target relocation values, given local and target + * specs and relocation kind. These values are calculated for each candidate. + * If there are multiple candidates, resulting values should all be consistent + * with each other. Otherwise, libbpf will refuse to proceed due to ambiguity. + * If instruction has to be poisoned, *poison will be set to true. + */ +static int bpf_core_calc_relo(const char *prog_name, + const struct bpf_core_relo *relo, + int relo_idx, + const struct bpf_core_spec *local_spec, + const struct bpf_core_spec *targ_spec, + struct bpf_core_relo_res *res) +{ + int err = -EOPNOTSUPP; + + res->orig_val = 0; + res->new_val = 0; + res->poison = false; + res->validate = true; + res->fail_memsz_adjust = false; + res->orig_sz = res->new_sz = 0; + res->orig_type_id = res->new_type_id = 0; + + if (core_relo_is_field_based(relo->kind)) { + err = bpf_core_calc_field_relo(prog_name, relo, local_spec, + &res->orig_val, &res->orig_sz, + &res->orig_type_id, &res->validate); + err = err ?: bpf_core_calc_field_relo(prog_name, relo, targ_spec, + &res->new_val, &res->new_sz, + &res->new_type_id, NULL); + if (err) + goto done; + /* Validate if it's safe to adjust load/store memory size. + * Adjustments are performed only if original and new memory + * sizes differ. + */ + res->fail_memsz_adjust = false; + if (res->orig_sz != res->new_sz) { + const struct btf_type *orig_t, *new_t; + + orig_t = btf_type_by_id(local_spec->btf, res->orig_type_id); + new_t = btf_type_by_id(targ_spec->btf, res->new_type_id); + + /* There are two use cases in which it's safe to + * adjust load/store's mem size: + * - reading a 32-bit kernel pointer, while on BPF + * size pointers are always 64-bit; in this case + * it's safe to "downsize" instruction size due to + * pointer being treated as unsigned integer with + * zero-extended upper 32-bits; + * - reading unsigned integers, again due to + * zero-extension is preserving the value correctly. + * + * In all other cases it's incorrect to attempt to + * load/store field because read value will be + * incorrect, so we poison relocated instruction. + */ + if (btf_is_ptr(orig_t) && btf_is_ptr(new_t)) + goto done; + if (btf_is_int(orig_t) && btf_is_int(new_t) && + btf_int_encoding(orig_t) != BTF_INT_SIGNED && + btf_int_encoding(new_t) != BTF_INT_SIGNED) + goto done; + + /* mark as invalid mem size adjustment, but this will + * only be checked for LDX/STX/ST insns + */ + res->fail_memsz_adjust = true; + } + } else if (core_relo_is_type_based(relo->kind)) { + err = bpf_core_calc_type_relo(relo, local_spec, &res->orig_val, &res->validate); + err = err ?: bpf_core_calc_type_relo(relo, targ_spec, &res->new_val, NULL); + } else if (core_relo_is_enumval_based(relo->kind)) { + err = bpf_core_calc_enumval_relo(relo, local_spec, &res->orig_val); + err = err ?: bpf_core_calc_enumval_relo(relo, targ_spec, &res->new_val); + } + +done: + if (err == -EUCLEAN) { + /* EUCLEAN is used to signal instruction poisoning request */ + res->poison = true; + err = 0; + } else if (err == -EOPNOTSUPP) { + /* EOPNOTSUPP means unknown/unsupported relocation */ + pr_warn("prog '%s': relo #%d: unrecognized CO-RE relocation %s (%d) at insn #%d\n", + prog_name, relo_idx, core_relo_kind_str(relo->kind), + relo->kind, relo->insn_off / 8); + } + + return err; +} + +/* + * Turn instruction for which CO_RE relocation failed into invalid one with + * distinct signature. + */ +static void bpf_core_poison_insn(const char *prog_name, int relo_idx, + int insn_idx, struct bpf_insn *insn) +{ + pr_debug("prog '%s': relo #%d: substituting insn #%d w/ invalid insn\n", + prog_name, relo_idx, insn_idx); + insn->code = BPF_JMP | BPF_CALL; + insn->dst_reg = 0; + insn->src_reg = 0; + insn->off = 0; + /* if this instruction is reachable (not a dead code), + * verifier will complain with the following message: + * invalid func unknown#195896080 + */ + insn->imm = 195896080; /* => 0xbad2310 => "bad relo" */ +} + +static int insn_bpf_size_to_bytes(struct bpf_insn *insn) +{ + switch (BPF_SIZE(insn->code)) { + case BPF_DW: return 8; + case BPF_W: return 4; + case BPF_H: return 2; + case BPF_B: return 1; + default: return -1; + } +} + +static int insn_bytes_to_bpf_size(__u32 sz) +{ + switch (sz) { + case 8: return BPF_DW; + case 4: return BPF_W; + case 2: return BPF_H; + case 1: return BPF_B; + default: return -1; + } +} + +/* + * Patch relocatable BPF instruction. + * + * Patched value is determined by relocation kind and target specification. + * For existence relocations target spec will be NULL if field/type is not found. + * Expected insn->imm value is determined using relocation kind and local + * spec, and is checked before patching instruction. If actual insn->imm value + * is wrong, bail out with error. + * + * Currently supported classes of BPF instruction are: + * 1. rX = (assignment with immediate operand); + * 2. rX += (arithmetic operations with immediate operand); + * 3. rX = (load with 64-bit immediate value); + * 4. rX = *(T *)(rY + ), where T is one of {u8, u16, u32, u64}; + * 5. *(T *)(rX + ) = rY, where T is one of {u8, u16, u32, u64}; + * 6. *(T *)(rX + ) = , where T is one of {u8, u16, u32, u64}. + */ +int bpf_core_patch_insn(const char *prog_name, struct bpf_insn *insn, + int insn_idx, const struct bpf_core_relo *relo, + int relo_idx, const struct bpf_core_relo_res *res) +{ + __u64 orig_val, new_val; + __u8 class; + + class = BPF_CLASS(insn->code); + + if (res->poison) { +poison: + /* poison second part of ldimm64 to avoid confusing error from + * verifier about "unknown opcode 00" + */ + if (is_ldimm64_insn(insn)) + bpf_core_poison_insn(prog_name, relo_idx, insn_idx + 1, insn + 1); + bpf_core_poison_insn(prog_name, relo_idx, insn_idx, insn); + return 0; + } + + orig_val = res->orig_val; + new_val = res->new_val; + + switch (class) { + case BPF_ALU: + case BPF_ALU64: + if (BPF_SRC(insn->code) != BPF_K) + return -EINVAL; + if (res->validate && insn->imm != orig_val) { + pr_warn("prog '%s': relo #%d: unexpected insn #%d (ALU/ALU64) value: got %u, exp %llu -> %llu\n", + prog_name, relo_idx, + insn_idx, insn->imm, (unsigned long long)orig_val, + (unsigned long long)new_val); + return -EINVAL; + } + orig_val = insn->imm; + insn->imm = new_val; + pr_debug("prog '%s': relo #%d: patched insn #%d (ALU/ALU64) imm %llu -> %llu\n", + prog_name, relo_idx, insn_idx, + (unsigned long long)orig_val, (unsigned long long)new_val); + break; + case BPF_LDX: + case BPF_ST: + case BPF_STX: + if (res->validate && insn->off != orig_val) { + pr_warn("prog '%s': relo #%d: unexpected insn #%d (LDX/ST/STX) value: got %u, exp %llu -> %llu\n", + prog_name, relo_idx, insn_idx, insn->off, (unsigned long long)orig_val, + (unsigned long long)new_val); + return -EINVAL; + } + if (new_val > SHRT_MAX) { + pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) value too big: %llu\n", + prog_name, relo_idx, insn_idx, (unsigned long long)new_val); + return -ERANGE; + } + if (res->fail_memsz_adjust) { + pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) accesses field incorrectly. " + "Make sure you are accessing pointers, unsigned integers, or fields of matching type and size.\n", + prog_name, relo_idx, insn_idx); + goto poison; + } + + orig_val = insn->off; + insn->off = new_val; + pr_debug("prog '%s': relo #%d: patched insn #%d (LDX/ST/STX) off %llu -> %llu\n", + prog_name, relo_idx, insn_idx, (unsigned long long)orig_val, + (unsigned long long)new_val); + + if (res->new_sz != res->orig_sz) { + int insn_bytes_sz, insn_bpf_sz; + + insn_bytes_sz = insn_bpf_size_to_bytes(insn); + if (insn_bytes_sz != res->orig_sz) { + pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) unexpected mem size: got %d, exp %u\n", + prog_name, relo_idx, insn_idx, insn_bytes_sz, res->orig_sz); + return -EINVAL; + } + + insn_bpf_sz = insn_bytes_to_bpf_size(res->new_sz); + if (insn_bpf_sz < 0) { + pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) invalid new mem size: %u\n", + prog_name, relo_idx, insn_idx, res->new_sz); + return -EINVAL; + } + + insn->code = BPF_MODE(insn->code) | insn_bpf_sz | BPF_CLASS(insn->code); + pr_debug("prog '%s': relo #%d: patched insn #%d (LDX/ST/STX) mem_sz %u -> %u\n", + prog_name, relo_idx, insn_idx, res->orig_sz, res->new_sz); + } + break; + case BPF_LD: { + __u64 imm; + + if (!is_ldimm64_insn(insn) || + insn[0].src_reg != 0 || insn[0].off != 0 || + insn[1].code != 0 || insn[1].dst_reg != 0 || + insn[1].src_reg != 0 || insn[1].off != 0) { + pr_warn("prog '%s': relo #%d: insn #%d (LDIMM64) has unexpected form\n", + prog_name, relo_idx, insn_idx); + return -EINVAL; + } + + imm = (__u32)insn[0].imm | ((__u64)insn[1].imm << 32); + if (res->validate && imm != orig_val) { + pr_warn("prog '%s': relo #%d: unexpected insn #%d (LDIMM64) value: got %llu, exp %llu -> %llu\n", + prog_name, relo_idx, + insn_idx, (unsigned long long)imm, + (unsigned long long)orig_val, (unsigned long long)new_val); + return -EINVAL; + } + + insn[0].imm = new_val; + insn[1].imm = new_val >> 32; + pr_debug("prog '%s': relo #%d: patched insn #%d (LDIMM64) imm64 %llu -> %llu\n", + prog_name, relo_idx, insn_idx, + (unsigned long long)imm, (unsigned long long)new_val); + break; + } + default: + pr_warn("prog '%s': relo #%d: trying to relocate unrecognized insn #%d, code:0x%x, src:0x%x, dst:0x%x, off:0x%x, imm:0x%x\n", + prog_name, relo_idx, insn_idx, insn->code, + insn->src_reg, insn->dst_reg, insn->off, insn->imm); + return -EINVAL; + } + + return 0; +} + +/* Output spec definition in the format: + * [] () + => @, + * where is a C-syntax view of recorded field access, e.g.: x.a[3].b + */ +int bpf_core_format_spec(char *buf, size_t buf_sz, const struct bpf_core_spec *spec) +{ + const struct btf_type *t; + const char *s; + __u32 type_id; + int i, len = 0; + +#define append_buf(fmt, args...) \ + ({ \ + int r; \ + r = snprintf(buf, buf_sz, fmt, ##args); \ + len += r; \ + if (r >= buf_sz) \ + r = buf_sz; \ + buf += r; \ + buf_sz -= r; \ + }) + + type_id = spec->root_type_id; + t = btf_type_by_id(spec->btf, type_id); + s = btf__name_by_offset(spec->btf, t->name_off); + + append_buf("<%s> [%u] %s %s", + core_relo_kind_str(spec->relo_kind), + type_id, btf_kind_str(t), str_is_empty(s) ? "" : s); + + if (core_relo_is_type_based(spec->relo_kind)) + return len; + + if (core_relo_is_enumval_based(spec->relo_kind)) { + t = skip_mods_and_typedefs(spec->btf, type_id, NULL); + if (btf_is_enum(t)) { + const struct btf_enum *e; + const char *fmt_str; + + e = btf_enum(t) + spec->raw_spec[0]; + s = btf__name_by_offset(spec->btf, e->name_off); + fmt_str = BTF_INFO_KFLAG(t->info) ? "::%s = %d" : "::%s = %u"; + append_buf(fmt_str, s, e->val); + } else { + const struct btf_enum64 *e; + const char *fmt_str; + + e = btf_enum64(t) + spec->raw_spec[0]; + s = btf__name_by_offset(spec->btf, e->name_off); + fmt_str = BTF_INFO_KFLAG(t->info) ? "::%s = %lld" : "::%s = %llu"; + append_buf(fmt_str, s, (unsigned long long)btf_enum64_value(e)); + } + return len; + } + + if (core_relo_is_field_based(spec->relo_kind)) { + for (i = 0; i < spec->len; i++) { + if (spec->spec[i].name) + append_buf(".%s", spec->spec[i].name); + else if (i > 0 || spec->spec[i].idx > 0) + append_buf("[%u]", spec->spec[i].idx); + } + + append_buf(" ("); + for (i = 0; i < spec->raw_len; i++) + append_buf("%s%d", i == 0 ? "" : ":", spec->raw_spec[i]); + + if (spec->bit_offset % 8) + append_buf(" @ offset %u.%u)", spec->bit_offset / 8, spec->bit_offset % 8); + else + append_buf(" @ offset %u)", spec->bit_offset / 8); + return len; + } + + return len; +#undef append_buf +} + +/* + * Calculate CO-RE relocation target result. + * + * The outline and important points of the algorithm: + * 1. For given local type, find corresponding candidate target types. + * Candidate type is a type with the same "essential" name, ignoring + * everything after last triple underscore (___). E.g., `sample`, + * `sample___flavor_one`, `sample___flavor_another_one`, are all candidates + * for each other. Names with triple underscore are referred to as + * "flavors" and are useful, among other things, to allow to + * specify/support incompatible variations of the same kernel struct, which + * might differ between different kernel versions and/or build + * configurations. + * + * N.B. Struct "flavors" could be generated by bpftool's BTF-to-C + * converter, when deduplicated BTF of a kernel still contains more than + * one different types with the same name. In that case, ___2, ___3, etc + * are appended starting from second name conflict. But start flavors are + * also useful to be defined "locally", in BPF program, to extract same + * data from incompatible changes between different kernel + * versions/configurations. For instance, to handle field renames between + * kernel versions, one can use two flavors of the struct name with the + * same common name and use conditional relocations to extract that field, + * depending on target kernel version. + * 2. For each candidate type, try to match local specification to this + * candidate target type. Matching involves finding corresponding + * high-level spec accessors, meaning that all named fields should match, + * as well as all array accesses should be within the actual bounds. Also, + * types should be compatible (see bpf_core_fields_are_compat for details). + * 3. It is supported and expected that there might be multiple flavors + * matching the spec. As long as all the specs resolve to the same set of + * offsets across all candidates, there is no error. If there is any + * ambiguity, CO-RE relocation will fail. This is necessary to accommodate + * imperfection of BTF deduplication, which can cause slight duplication of + * the same BTF type, if some directly or indirectly referenced (by + * pointer) type gets resolved to different actual types in different + * object files. If such a situation occurs, deduplicated BTF will end up + * with two (or more) structurally identical types, which differ only in + * types they refer to through pointer. This should be OK in most cases and + * is not an error. + * 4. Candidate types search is performed by linearly scanning through all + * types in target BTF. It is anticipated that this is overall more + * efficient memory-wise and not significantly worse (if not better) + * CPU-wise compared to prebuilding a map from all local type names to + * a list of candidate type names. It's also sped up by caching resolved + * list of matching candidates per each local "root" type ID, that has at + * least one bpf_core_relo associated with it. This list is shared + * between multiple relocations for the same type ID and is updated as some + * of the candidates are pruned due to structural incompatibility. + */ +int bpf_core_calc_relo_insn(const char *prog_name, + const struct bpf_core_relo *relo, + int relo_idx, + const struct btf *local_btf, + struct bpf_core_cand_list *cands, + struct bpf_core_spec *specs_scratch, + struct bpf_core_relo_res *targ_res) +{ + struct bpf_core_spec *local_spec = &specs_scratch[0]; + struct bpf_core_spec *cand_spec = &specs_scratch[1]; + struct bpf_core_spec *targ_spec = &specs_scratch[2]; + struct bpf_core_relo_res cand_res; + const struct btf_type *local_type; + const char *local_name; + __u32 local_id; + char spec_buf[256]; + int i, j, err; + + local_id = relo->type_id; + local_type = btf_type_by_id(local_btf, local_id); + local_name = btf__name_by_offset(local_btf, local_type->name_off); + if (!local_name) + return -EINVAL; + + err = bpf_core_parse_spec(prog_name, local_btf, relo, local_spec); + if (err) { + const char *spec_str; + + spec_str = btf__name_by_offset(local_btf, relo->access_str_off); + pr_warn("prog '%s': relo #%d: parsing [%d] %s %s + %s failed: %d\n", + prog_name, relo_idx, local_id, btf_kind_str(local_type), + str_is_empty(local_name) ? "" : local_name, + spec_str ?: "", err); + return -EINVAL; + } + + bpf_core_format_spec(spec_buf, sizeof(spec_buf), local_spec); + pr_debug("prog '%s': relo #%d: %s\n", prog_name, relo_idx, spec_buf); + + /* TYPE_ID_LOCAL relo is special and doesn't need candidate search */ + if (relo->kind == BPF_CORE_TYPE_ID_LOCAL) { + /* bpf_insn's imm value could get out of sync during linking */ + memset(targ_res, 0, sizeof(*targ_res)); + targ_res->validate = false; + targ_res->poison = false; + targ_res->orig_val = local_spec->root_type_id; + targ_res->new_val = local_spec->root_type_id; + return 0; + } + + /* libbpf doesn't support candidate search for anonymous types */ + if (str_is_empty(local_name)) { + pr_warn("prog '%s': relo #%d: <%s> (%d) relocation doesn't support anonymous types\n", + prog_name, relo_idx, core_relo_kind_str(relo->kind), relo->kind); + return -EOPNOTSUPP; + } + + for (i = 0, j = 0; i < cands->len; i++) { + err = bpf_core_spec_match(local_spec, cands->cands[i].btf, + cands->cands[i].id, cand_spec); + if (err < 0) { + bpf_core_format_spec(spec_buf, sizeof(spec_buf), cand_spec); + pr_warn("prog '%s': relo #%d: error matching candidate #%d %s: %d\n ", + prog_name, relo_idx, i, spec_buf, err); + return err; + } + + bpf_core_format_spec(spec_buf, sizeof(spec_buf), cand_spec); + pr_debug("prog '%s': relo #%d: %s candidate #%d %s\n", prog_name, + relo_idx, err == 0 ? "non-matching" : "matching", i, spec_buf); + + if (err == 0) + continue; + + err = bpf_core_calc_relo(prog_name, relo, relo_idx, local_spec, cand_spec, &cand_res); + if (err) + return err; + + if (j == 0) { + *targ_res = cand_res; + *targ_spec = *cand_spec; + } else if (cand_spec->bit_offset != targ_spec->bit_offset) { + /* if there are many field relo candidates, they + * should all resolve to the same bit offset + */ + pr_warn("prog '%s': relo #%d: field offset ambiguity: %u != %u\n", + prog_name, relo_idx, cand_spec->bit_offset, + targ_spec->bit_offset); + return -EINVAL; + } else if (cand_res.poison != targ_res->poison || + cand_res.new_val != targ_res->new_val) { + /* all candidates should result in the same relocation + * decision and value, otherwise it's dangerous to + * proceed due to ambiguity + */ + pr_warn("prog '%s': relo #%d: relocation decision ambiguity: %s %llu != %s %llu\n", + prog_name, relo_idx, + cand_res.poison ? "failure" : "success", + (unsigned long long)cand_res.new_val, + targ_res->poison ? "failure" : "success", + (unsigned long long)targ_res->new_val); + return -EINVAL; + } + + cands->cands[j++] = cands->cands[i]; + } + + /* + * For BPF_CORE_FIELD_EXISTS relo or when used BPF program has field + * existence checks or kernel version/config checks, it's expected + * that we might not find any candidates. In this case, if field + * wasn't found in any candidate, the list of candidates shouldn't + * change at all, we'll just handle relocating appropriately, + * depending on relo's kind. + */ + if (j > 0) + cands->len = j; + + /* + * If no candidates were found, it might be both a programmer error, + * as well as expected case, depending whether instruction w/ + * relocation is guarded in some way that makes it unreachable (dead + * code) if relocation can't be resolved. This is handled in + * bpf_core_patch_insn() uniformly by replacing that instruction with + * BPF helper call insn (using invalid helper ID). If that instruction + * is indeed unreachable, then it will be ignored and eliminated by + * verifier. If it was an error, then verifier will complain and point + * to a specific instruction number in its log. + */ + if (j == 0) { + pr_debug("prog '%s': relo #%d: no matching targets found\n", + prog_name, relo_idx); + + /* calculate single target relo result explicitly */ + err = bpf_core_calc_relo(prog_name, relo, relo_idx, local_spec, NULL, targ_res); + if (err) + return err; + } + + return 0; +} + +static bool bpf_core_names_match(const struct btf *local_btf, size_t local_name_off, + const struct btf *targ_btf, size_t targ_name_off) +{ + const char *local_n, *targ_n; + size_t local_len, targ_len; + + local_n = btf__name_by_offset(local_btf, local_name_off); + targ_n = btf__name_by_offset(targ_btf, targ_name_off); + + if (str_is_empty(targ_n)) + return str_is_empty(local_n); + + targ_len = bpf_core_essential_name_len(targ_n); + local_len = bpf_core_essential_name_len(local_n); + + return targ_len == local_len && strncmp(local_n, targ_n, local_len) == 0; +} + +static int bpf_core_enums_match(const struct btf *local_btf, const struct btf_type *local_t, + const struct btf *targ_btf, const struct btf_type *targ_t) +{ + __u16 local_vlen = btf_vlen(local_t); + __u16 targ_vlen = btf_vlen(targ_t); + int i, j; + + if (local_t->size != targ_t->size) + return 0; + + if (local_vlen > targ_vlen) + return 0; + + /* iterate over the local enum's variants and make sure each has + * a symbolic name correspondent in the target + */ + for (i = 0; i < local_vlen; i++) { + bool matched = false; + __u32 local_n_off, targ_n_off; + + local_n_off = btf_is_enum(local_t) ? btf_enum(local_t)[i].name_off : + btf_enum64(local_t)[i].name_off; + + for (j = 0; j < targ_vlen; j++) { + targ_n_off = btf_is_enum(targ_t) ? btf_enum(targ_t)[j].name_off : + btf_enum64(targ_t)[j].name_off; + + if (bpf_core_names_match(local_btf, local_n_off, targ_btf, targ_n_off)) { + matched = true; + break; + } + } + + if (!matched) + return 0; + } + return 1; +} + +static int bpf_core_composites_match(const struct btf *local_btf, const struct btf_type *local_t, + const struct btf *targ_btf, const struct btf_type *targ_t, + bool behind_ptr, int level) +{ + const struct btf_member *local_m = btf_members(local_t); + __u16 local_vlen = btf_vlen(local_t); + __u16 targ_vlen = btf_vlen(targ_t); + int i, j, err; + + if (local_vlen > targ_vlen) + return 0; + + /* check that all local members have a match in the target */ + for (i = 0; i < local_vlen; i++, local_m++) { + const struct btf_member *targ_m = btf_members(targ_t); + bool matched = false; + + for (j = 0; j < targ_vlen; j++, targ_m++) { + if (!bpf_core_names_match(local_btf, local_m->name_off, + targ_btf, targ_m->name_off)) + continue; + + err = __bpf_core_types_match(local_btf, local_m->type, targ_btf, + targ_m->type, behind_ptr, level - 1); + if (err < 0) + return err; + if (err > 0) { + matched = true; + break; + } + } + + if (!matched) + return 0; + } + return 1; +} + +/* Check that two types "match". This function assumes that root types were + * already checked for name match. + * + * The matching relation is defined as follows: + * - modifiers and typedefs are stripped (and, hence, effectively ignored) + * - generally speaking types need to be of same kind (struct vs. struct, union + * vs. union, etc.) + * - exceptions are struct/union behind a pointer which could also match a + * forward declaration of a struct or union, respectively, and enum vs. + * enum64 (see below) + * Then, depending on type: + * - integers: + * - match if size and signedness match + * - arrays & pointers: + * - target types are recursively matched + * - structs & unions: + * - local members need to exist in target with the same name + * - for each member we recursively check match unless it is already behind a + * pointer, in which case we only check matching names and compatible kind + * - enums: + * - local variants have to have a match in target by symbolic name (but not + * numeric value) + * - size has to match (but enum may match enum64 and vice versa) + * - function pointers: + * - number and position of arguments in local type has to match target + * - for each argument and the return value we recursively check match + */ +int __bpf_core_types_match(const struct btf *local_btf, __u32 local_id, const struct btf *targ_btf, + __u32 targ_id, bool behind_ptr, int level) +{ + const struct btf_type *local_t, *targ_t; + int depth = 32; /* max recursion depth */ + __u16 local_k, targ_k; + + if (level <= 0) + return -EINVAL; + + local_t = btf_type_by_id(local_btf, local_id); + targ_t = btf_type_by_id(targ_btf, targ_id); + +recur: + depth--; + if (depth < 0) + return -EINVAL; + + local_t = skip_mods_and_typedefs(local_btf, local_id, &local_id); + targ_t = skip_mods_and_typedefs(targ_btf, targ_id, &targ_id); + if (!local_t || !targ_t) + return -EINVAL; + + /* While the name check happens after typedefs are skipped, root-level + * typedefs would still be name-matched as that's the contract with + * callers. + */ + if (!bpf_core_names_match(local_btf, local_t->name_off, targ_btf, targ_t->name_off)) + return 0; + + local_k = btf_kind(local_t); + targ_k = btf_kind(targ_t); + + switch (local_k) { + case BTF_KIND_UNKN: + return local_k == targ_k; + case BTF_KIND_FWD: { + bool local_f = BTF_INFO_KFLAG(local_t->info); + + if (behind_ptr) { + if (local_k == targ_k) + return local_f == BTF_INFO_KFLAG(targ_t->info); + + /* for forward declarations kflag dictates whether the + * target is a struct (0) or union (1) + */ + return (targ_k == BTF_KIND_STRUCT && !local_f) || + (targ_k == BTF_KIND_UNION && local_f); + } else { + if (local_k != targ_k) + return 0; + + /* match if the forward declaration is for the same kind */ + return local_f == BTF_INFO_KFLAG(targ_t->info); + } + } + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + if (!btf_is_any_enum(targ_t)) + return 0; + + return bpf_core_enums_match(local_btf, local_t, targ_btf, targ_t); + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + if (behind_ptr) { + bool targ_f = BTF_INFO_KFLAG(targ_t->info); + + if (local_k == targ_k) + return 1; + + if (targ_k != BTF_KIND_FWD) + return 0; + + return (local_k == BTF_KIND_UNION) == targ_f; + } else { + if (local_k != targ_k) + return 0; + + return bpf_core_composites_match(local_btf, local_t, targ_btf, targ_t, + behind_ptr, level); + } + case BTF_KIND_INT: { + __u8 local_sgn; + __u8 targ_sgn; + + if (local_k != targ_k) + return 0; + + local_sgn = btf_int_encoding(local_t) & BTF_INT_SIGNED; + targ_sgn = btf_int_encoding(targ_t) & BTF_INT_SIGNED; + + return local_t->size == targ_t->size && local_sgn == targ_sgn; + } + case BTF_KIND_PTR: + if (local_k != targ_k) + return 0; + + behind_ptr = true; + + local_id = local_t->type; + targ_id = targ_t->type; + goto recur; + case BTF_KIND_ARRAY: { + const struct btf_array *local_array = btf_array(local_t); + const struct btf_array *targ_array = btf_array(targ_t); + + if (local_k != targ_k) + return 0; + + if (local_array->nelems != targ_array->nelems) + return 0; + + local_id = local_array->type; + targ_id = targ_array->type; + goto recur; + } + case BTF_KIND_FUNC_PROTO: { + struct btf_param *local_p = btf_params(local_t); + struct btf_param *targ_p = btf_params(targ_t); + __u16 local_vlen = btf_vlen(local_t); + __u16 targ_vlen = btf_vlen(targ_t); + int i, err; + + if (local_k != targ_k) + return 0; + + if (local_vlen != targ_vlen) + return 0; + + for (i = 0; i < local_vlen; i++, local_p++, targ_p++) { + err = __bpf_core_types_match(local_btf, local_p->type, targ_btf, + targ_p->type, behind_ptr, level - 1); + if (err <= 0) + return err; + } + + /* tail recurse for return type check */ + local_id = local_t->type; + targ_id = targ_t->type; + goto recur; + } + default: + pr_warn("unexpected kind %s relocated, local [%d], target [%d]\n", + btf_kind_str(local_t), local_id, targ_id); + return 0; + } +} diff --git a/bpftool/libbpf/src/relo_core.h b/bpftool/libbpf/src/relo_core.h new file mode 100644 index 0000000..1c0566d --- /dev/null +++ b/bpftool/libbpf/src/relo_core.h @@ -0,0 +1,99 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2019 Facebook */ + +#ifndef __RELO_CORE_H +#define __RELO_CORE_H + +#include + +struct bpf_core_cand { + const struct btf *btf; + __u32 id; +}; + +/* dynamically sized list of type IDs and its associated struct btf */ +struct bpf_core_cand_list { + struct bpf_core_cand *cands; + int len; +}; + +#define BPF_CORE_SPEC_MAX_LEN 64 + +/* represents BPF CO-RE field or array element accessor */ +struct bpf_core_accessor { + __u32 type_id; /* struct/union type or array element type */ + __u32 idx; /* field index or array index */ + const char *name; /* field name or NULL for array accessor */ +}; + +struct bpf_core_spec { + const struct btf *btf; + /* high-level spec: named fields and array indices only */ + struct bpf_core_accessor spec[BPF_CORE_SPEC_MAX_LEN]; + /* original unresolved (no skip_mods_or_typedefs) root type ID */ + __u32 root_type_id; + /* CO-RE relocation kind */ + enum bpf_core_relo_kind relo_kind; + /* high-level spec length */ + int len; + /* raw, low-level spec: 1-to-1 with accessor spec string */ + int raw_spec[BPF_CORE_SPEC_MAX_LEN]; + /* raw spec length */ + int raw_len; + /* field bit offset represented by spec */ + __u32 bit_offset; +}; + +struct bpf_core_relo_res { + /* expected value in the instruction, unless validate == false */ + __u64 orig_val; + /* new value that needs to be patched up to */ + __u64 new_val; + /* relocation unsuccessful, poison instruction, but don't fail load */ + bool poison; + /* some relocations can't be validated against orig_val */ + bool validate; + /* for field byte offset relocations or the forms: + * *(T *)(rX + ) = rY + * rX = *(T *)(rY + ), + * we remember original and resolved field size to adjust direct + * memory loads of pointers and integers; this is necessary for 32-bit + * host kernel architectures, but also allows to automatically + * relocate fields that were resized from, e.g., u32 to u64, etc. + */ + bool fail_memsz_adjust; + __u32 orig_sz; + __u32 orig_type_id; + __u32 new_sz; + __u32 new_type_id; +}; + +int __bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id, int level); +int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id); +int __bpf_core_types_match(const struct btf *local_btf, __u32 local_id, const struct btf *targ_btf, + __u32 targ_id, bool behind_ptr, int level); +int bpf_core_types_match(const struct btf *local_btf, __u32 local_id, const struct btf *targ_btf, + __u32 targ_id); + +size_t bpf_core_essential_name_len(const char *name); + +int bpf_core_calc_relo_insn(const char *prog_name, + const struct bpf_core_relo *relo, int relo_idx, + const struct btf *local_btf, + struct bpf_core_cand_list *cands, + struct bpf_core_spec *specs_scratch, + struct bpf_core_relo_res *targ_res); + +int bpf_core_patch_insn(const char *prog_name, struct bpf_insn *insn, + int insn_idx, const struct bpf_core_relo *relo, + int relo_idx, const struct bpf_core_relo_res *res); + +int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, + const struct bpf_core_relo *relo, + struct bpf_core_spec *spec); + +int bpf_core_format_spec(char *buf, size_t buf_sz, const struct bpf_core_spec *spec); + +#endif diff --git a/bpftool/libbpf/src/ringbuf.c b/bpftool/libbpf/src/ringbuf.c new file mode 100644 index 0000000..0219936 --- /dev/null +++ b/bpftool/libbpf/src/ringbuf.c @@ -0,0 +1,587 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* + * Ring buffer operations. + * + * Copyright (C) 2020 Facebook, Inc. + */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libbpf.h" +#include "libbpf_internal.h" +#include "bpf.h" + +struct ring { + ring_buffer_sample_fn sample_cb; + void *ctx; + void *data; + unsigned long *consumer_pos; + unsigned long *producer_pos; + unsigned long mask; + int map_fd; +}; + +struct ring_buffer { + struct epoll_event *events; + struct ring *rings; + size_t page_size; + int epoll_fd; + int ring_cnt; +}; + +struct user_ring_buffer { + struct epoll_event event; + unsigned long *consumer_pos; + unsigned long *producer_pos; + void *data; + unsigned long mask; + size_t page_size; + int map_fd; + int epoll_fd; +}; + +/* 8-byte ring buffer header structure */ +struct ringbuf_hdr { + __u32 len; + __u32 pad; +}; + +static void ringbuf_unmap_ring(struct ring_buffer *rb, struct ring *r) +{ + if (r->consumer_pos) { + munmap(r->consumer_pos, rb->page_size); + r->consumer_pos = NULL; + } + if (r->producer_pos) { + munmap(r->producer_pos, rb->page_size + 2 * (r->mask + 1)); + r->producer_pos = NULL; + } +} + +/* Add extra RINGBUF maps to this ring buffer manager */ +int ring_buffer__add(struct ring_buffer *rb, int map_fd, + ring_buffer_sample_fn sample_cb, void *ctx) +{ + struct bpf_map_info info; + __u32 len = sizeof(info); + struct epoll_event *e; + struct ring *r; + __u64 mmap_sz; + void *tmp; + int err; + + memset(&info, 0, sizeof(info)); + + err = bpf_map_get_info_by_fd(map_fd, &info, &len); + if (err) { + err = -errno; + pr_warn("ringbuf: failed to get map info for fd=%d: %d\n", + map_fd, err); + return libbpf_err(err); + } + + if (info.type != BPF_MAP_TYPE_RINGBUF) { + pr_warn("ringbuf: map fd=%d is not BPF_MAP_TYPE_RINGBUF\n", + map_fd); + return libbpf_err(-EINVAL); + } + + tmp = libbpf_reallocarray(rb->rings, rb->ring_cnt + 1, sizeof(*rb->rings)); + if (!tmp) + return libbpf_err(-ENOMEM); + rb->rings = tmp; + + tmp = libbpf_reallocarray(rb->events, rb->ring_cnt + 1, sizeof(*rb->events)); + if (!tmp) + return libbpf_err(-ENOMEM); + rb->events = tmp; + + r = &rb->rings[rb->ring_cnt]; + memset(r, 0, sizeof(*r)); + + r->map_fd = map_fd; + r->sample_cb = sample_cb; + r->ctx = ctx; + r->mask = info.max_entries - 1; + + /* Map writable consumer page */ + tmp = mmap(NULL, rb->page_size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); + if (tmp == MAP_FAILED) { + err = -errno; + pr_warn("ringbuf: failed to mmap consumer page for map fd=%d: %d\n", + map_fd, err); + return libbpf_err(err); + } + r->consumer_pos = tmp; + + /* Map read-only producer page and data pages. We map twice as big + * data size to allow simple reading of samples that wrap around the + * end of a ring buffer. See kernel implementation for details. + */ + mmap_sz = rb->page_size + 2 * (__u64)info.max_entries; + if (mmap_sz != (__u64)(size_t)mmap_sz) { + pr_warn("ringbuf: ring buffer size (%u) is too big\n", info.max_entries); + return libbpf_err(-E2BIG); + } + tmp = mmap(NULL, (size_t)mmap_sz, PROT_READ, MAP_SHARED, map_fd, rb->page_size); + if (tmp == MAP_FAILED) { + err = -errno; + ringbuf_unmap_ring(rb, r); + pr_warn("ringbuf: failed to mmap data pages for map fd=%d: %d\n", + map_fd, err); + return libbpf_err(err); + } + r->producer_pos = tmp; + r->data = tmp + rb->page_size; + + e = &rb->events[rb->ring_cnt]; + memset(e, 0, sizeof(*e)); + + e->events = EPOLLIN; + e->data.fd = rb->ring_cnt; + if (epoll_ctl(rb->epoll_fd, EPOLL_CTL_ADD, map_fd, e) < 0) { + err = -errno; + ringbuf_unmap_ring(rb, r); + pr_warn("ringbuf: failed to epoll add map fd=%d: %d\n", + map_fd, err); + return libbpf_err(err); + } + + rb->ring_cnt++; + return 0; +} + +void ring_buffer__free(struct ring_buffer *rb) +{ + int i; + + if (!rb) + return; + + for (i = 0; i < rb->ring_cnt; ++i) + ringbuf_unmap_ring(rb, &rb->rings[i]); + if (rb->epoll_fd >= 0) + close(rb->epoll_fd); + + free(rb->events); + free(rb->rings); + free(rb); +} + +struct ring_buffer * +ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx, + const struct ring_buffer_opts *opts) +{ + struct ring_buffer *rb; + int err; + + if (!OPTS_VALID(opts, ring_buffer_opts)) + return errno = EINVAL, NULL; + + rb = calloc(1, sizeof(*rb)); + if (!rb) + return errno = ENOMEM, NULL; + + rb->page_size = getpagesize(); + + rb->epoll_fd = epoll_create1(EPOLL_CLOEXEC); + if (rb->epoll_fd < 0) { + err = -errno; + pr_warn("ringbuf: failed to create epoll instance: %d\n", err); + goto err_out; + } + + err = ring_buffer__add(rb, map_fd, sample_cb, ctx); + if (err) + goto err_out; + + return rb; + +err_out: + ring_buffer__free(rb); + return errno = -err, NULL; +} + +static inline int roundup_len(__u32 len) +{ + /* clear out top 2 bits (discard and busy, if set) */ + len <<= 2; + len >>= 2; + /* add length prefix */ + len += BPF_RINGBUF_HDR_SZ; + /* round up to 8 byte alignment */ + return (len + 7) / 8 * 8; +} + +static int64_t ringbuf_process_ring(struct ring *r) +{ + int *len_ptr, len, err; + /* 64-bit to avoid overflow in case of extreme application behavior */ + int64_t cnt = 0; + unsigned long cons_pos, prod_pos; + bool got_new_data; + void *sample; + + cons_pos = smp_load_acquire(r->consumer_pos); + do { + got_new_data = false; + prod_pos = smp_load_acquire(r->producer_pos); + while (cons_pos < prod_pos) { + len_ptr = r->data + (cons_pos & r->mask); + len = smp_load_acquire(len_ptr); + + /* sample not committed yet, bail out for now */ + if (len & BPF_RINGBUF_BUSY_BIT) + goto done; + + got_new_data = true; + cons_pos += roundup_len(len); + + if ((len & BPF_RINGBUF_DISCARD_BIT) == 0) { + sample = (void *)len_ptr + BPF_RINGBUF_HDR_SZ; + err = r->sample_cb(r->ctx, sample, len); + if (err < 0) { + /* update consumer pos and bail out */ + smp_store_release(r->consumer_pos, + cons_pos); + return err; + } + cnt++; + } + + smp_store_release(r->consumer_pos, cons_pos); + } + } while (got_new_data); +done: + return cnt; +} + +/* Consume available ring buffer(s) data without event polling. + * Returns number of records consumed across all registered ring buffers (or + * INT_MAX, whichever is less), or negative number if any of the callbacks + * return error. + */ +int ring_buffer__consume(struct ring_buffer *rb) +{ + int64_t err, res = 0; + int i; + + for (i = 0; i < rb->ring_cnt; i++) { + struct ring *ring = &rb->rings[i]; + + err = ringbuf_process_ring(ring); + if (err < 0) + return libbpf_err(err); + res += err; + } + if (res > INT_MAX) + return INT_MAX; + return res; +} + +/* Poll for available data and consume records, if any are available. + * Returns number of records consumed (or INT_MAX, whichever is less), or + * negative number, if any of the registered callbacks returned error. + */ +int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms) +{ + int i, cnt; + int64_t err, res = 0; + + cnt = epoll_wait(rb->epoll_fd, rb->events, rb->ring_cnt, timeout_ms); + if (cnt < 0) + return libbpf_err(-errno); + + for (i = 0; i < cnt; i++) { + __u32 ring_id = rb->events[i].data.fd; + struct ring *ring = &rb->rings[ring_id]; + + err = ringbuf_process_ring(ring); + if (err < 0) + return libbpf_err(err); + res += err; + } + if (res > INT_MAX) + return INT_MAX; + return res; +} + +/* Get an fd that can be used to sleep until data is available in the ring(s) */ +int ring_buffer__epoll_fd(const struct ring_buffer *rb) +{ + return rb->epoll_fd; +} + +static void user_ringbuf_unmap_ring(struct user_ring_buffer *rb) +{ + if (rb->consumer_pos) { + munmap(rb->consumer_pos, rb->page_size); + rb->consumer_pos = NULL; + } + if (rb->producer_pos) { + munmap(rb->producer_pos, rb->page_size + 2 * (rb->mask + 1)); + rb->producer_pos = NULL; + } +} + +void user_ring_buffer__free(struct user_ring_buffer *rb) +{ + if (!rb) + return; + + user_ringbuf_unmap_ring(rb); + + if (rb->epoll_fd >= 0) + close(rb->epoll_fd); + + free(rb); +} + +static int user_ringbuf_map(struct user_ring_buffer *rb, int map_fd) +{ + struct bpf_map_info info; + __u32 len = sizeof(info); + __u64 mmap_sz; + void *tmp; + struct epoll_event *rb_epoll; + int err; + + memset(&info, 0, sizeof(info)); + + err = bpf_map_get_info_by_fd(map_fd, &info, &len); + if (err) { + err = -errno; + pr_warn("user ringbuf: failed to get map info for fd=%d: %d\n", map_fd, err); + return err; + } + + if (info.type != BPF_MAP_TYPE_USER_RINGBUF) { + pr_warn("user ringbuf: map fd=%d is not BPF_MAP_TYPE_USER_RINGBUF\n", map_fd); + return -EINVAL; + } + + rb->map_fd = map_fd; + rb->mask = info.max_entries - 1; + + /* Map read-only consumer page */ + tmp = mmap(NULL, rb->page_size, PROT_READ, MAP_SHARED, map_fd, 0); + if (tmp == MAP_FAILED) { + err = -errno; + pr_warn("user ringbuf: failed to mmap consumer page for map fd=%d: %d\n", + map_fd, err); + return err; + } + rb->consumer_pos = tmp; + + /* Map read-write the producer page and data pages. We map the data + * region as twice the total size of the ring buffer to allow the + * simple reading and writing of samples that wrap around the end of + * the buffer. See the kernel implementation for details. + */ + mmap_sz = rb->page_size + 2 * (__u64)info.max_entries; + if (mmap_sz != (__u64)(size_t)mmap_sz) { + pr_warn("user ringbuf: ring buf size (%u) is too big\n", info.max_entries); + return -E2BIG; + } + tmp = mmap(NULL, (size_t)mmap_sz, PROT_READ | PROT_WRITE, MAP_SHARED, + map_fd, rb->page_size); + if (tmp == MAP_FAILED) { + err = -errno; + pr_warn("user ringbuf: failed to mmap data pages for map fd=%d: %d\n", + map_fd, err); + return err; + } + + rb->producer_pos = tmp; + rb->data = tmp + rb->page_size; + + rb_epoll = &rb->event; + rb_epoll->events = EPOLLOUT; + if (epoll_ctl(rb->epoll_fd, EPOLL_CTL_ADD, map_fd, rb_epoll) < 0) { + err = -errno; + pr_warn("user ringbuf: failed to epoll add map fd=%d: %d\n", map_fd, err); + return err; + } + + return 0; +} + +struct user_ring_buffer * +user_ring_buffer__new(int map_fd, const struct user_ring_buffer_opts *opts) +{ + struct user_ring_buffer *rb; + int err; + + if (!OPTS_VALID(opts, user_ring_buffer_opts)) + return errno = EINVAL, NULL; + + rb = calloc(1, sizeof(*rb)); + if (!rb) + return errno = ENOMEM, NULL; + + rb->page_size = getpagesize(); + + rb->epoll_fd = epoll_create1(EPOLL_CLOEXEC); + if (rb->epoll_fd < 0) { + err = -errno; + pr_warn("user ringbuf: failed to create epoll instance: %d\n", err); + goto err_out; + } + + err = user_ringbuf_map(rb, map_fd); + if (err) + goto err_out; + + return rb; + +err_out: + user_ring_buffer__free(rb); + return errno = -err, NULL; +} + +static void user_ringbuf_commit(struct user_ring_buffer *rb, void *sample, bool discard) +{ + __u32 new_len; + struct ringbuf_hdr *hdr; + uintptr_t hdr_offset; + + hdr_offset = rb->mask + 1 + (sample - rb->data) - BPF_RINGBUF_HDR_SZ; + hdr = rb->data + (hdr_offset & rb->mask); + + new_len = hdr->len & ~BPF_RINGBUF_BUSY_BIT; + if (discard) + new_len |= BPF_RINGBUF_DISCARD_BIT; + + /* Synchronizes with smp_load_acquire() in __bpf_user_ringbuf_peek() in + * the kernel. + */ + __atomic_exchange_n(&hdr->len, new_len, __ATOMIC_ACQ_REL); +} + +void user_ring_buffer__discard(struct user_ring_buffer *rb, void *sample) +{ + user_ringbuf_commit(rb, sample, true); +} + +void user_ring_buffer__submit(struct user_ring_buffer *rb, void *sample) +{ + user_ringbuf_commit(rb, sample, false); +} + +void *user_ring_buffer__reserve(struct user_ring_buffer *rb, __u32 size) +{ + __u32 avail_size, total_size, max_size; + /* 64-bit to avoid overflow in case of extreme application behavior */ + __u64 cons_pos, prod_pos; + struct ringbuf_hdr *hdr; + + /* The top two bits are used as special flags */ + if (size & (BPF_RINGBUF_BUSY_BIT | BPF_RINGBUF_DISCARD_BIT)) + return errno = E2BIG, NULL; + + /* Synchronizes with smp_store_release() in __bpf_user_ringbuf_peek() in + * the kernel. + */ + cons_pos = smp_load_acquire(rb->consumer_pos); + /* Synchronizes with smp_store_release() in user_ringbuf_commit() */ + prod_pos = smp_load_acquire(rb->producer_pos); + + max_size = rb->mask + 1; + avail_size = max_size - (prod_pos - cons_pos); + /* Round up total size to a multiple of 8. */ + total_size = (size + BPF_RINGBUF_HDR_SZ + 7) / 8 * 8; + + if (total_size > max_size) + return errno = E2BIG, NULL; + + if (avail_size < total_size) + return errno = ENOSPC, NULL; + + hdr = rb->data + (prod_pos & rb->mask); + hdr->len = size | BPF_RINGBUF_BUSY_BIT; + hdr->pad = 0; + + /* Synchronizes with smp_load_acquire() in __bpf_user_ringbuf_peek() in + * the kernel. + */ + smp_store_release(rb->producer_pos, prod_pos + total_size); + + return (void *)rb->data + ((prod_pos + BPF_RINGBUF_HDR_SZ) & rb->mask); +} + +static __u64 ns_elapsed_timespec(const struct timespec *start, const struct timespec *end) +{ + __u64 start_ns, end_ns, ns_per_s = 1000000000; + + start_ns = (__u64)start->tv_sec * ns_per_s + start->tv_nsec; + end_ns = (__u64)end->tv_sec * ns_per_s + end->tv_nsec; + + return end_ns - start_ns; +} + +void *user_ring_buffer__reserve_blocking(struct user_ring_buffer *rb, __u32 size, int timeout_ms) +{ + void *sample; + int err, ms_remaining = timeout_ms; + struct timespec start; + + if (timeout_ms < 0 && timeout_ms != -1) + return errno = EINVAL, NULL; + + if (timeout_ms != -1) { + err = clock_gettime(CLOCK_MONOTONIC, &start); + if (err) + return NULL; + } + + do { + int cnt, ms_elapsed; + struct timespec curr; + __u64 ns_per_ms = 1000000; + + sample = user_ring_buffer__reserve(rb, size); + if (sample) + return sample; + else if (errno != ENOSPC) + return NULL; + + /* The kernel guarantees at least one event notification + * delivery whenever at least one sample is drained from the + * ring buffer in an invocation to bpf_ringbuf_drain(). Other + * additional events may be delivered at any time, but only one + * event is guaranteed per bpf_ringbuf_drain() invocation, + * provided that a sample is drained, and the BPF program did + * not pass BPF_RB_NO_WAKEUP to bpf_ringbuf_drain(). If + * BPF_RB_FORCE_WAKEUP is passed to bpf_ringbuf_drain(), a + * wakeup event will be delivered even if no samples are + * drained. + */ + cnt = epoll_wait(rb->epoll_fd, &rb->event, 1, ms_remaining); + if (cnt < 0) + return NULL; + + if (timeout_ms == -1) + continue; + + err = clock_gettime(CLOCK_MONOTONIC, &curr); + if (err) + return NULL; + + ms_elapsed = ns_elapsed_timespec(&start, &curr) / ns_per_ms; + ms_remaining = timeout_ms - ms_elapsed; + } while (ms_remaining > 0); + + /* Try one more time to reserve a sample after the specified timeout has elapsed. */ + return user_ring_buffer__reserve(rb, size); +} diff --git a/bpftool/libbpf/src/skel_internal.h b/bpftool/libbpf/src/skel_internal.h new file mode 100644 index 0000000..1e82ab0 --- /dev/null +++ b/bpftool/libbpf/src/skel_internal.h @@ -0,0 +1,374 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2021 Facebook */ +#ifndef __SKEL_INTERNAL_H +#define __SKEL_INTERNAL_H + +#ifdef __KERNEL__ +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include "bpf.h" +#endif + +#ifndef __NR_bpf +# if defined(__mips__) && defined(_ABIO32) +# define __NR_bpf 4355 +# elif defined(__mips__) && defined(_ABIN32) +# define __NR_bpf 6319 +# elif defined(__mips__) && defined(_ABI64) +# define __NR_bpf 5315 +# endif +#endif + +/* This file is a base header for auto-generated *.lskel.h files. + * Its contents will change and may become part of auto-generation in the future. + * + * The layout of bpf_[map|prog]_desc and bpf_loader_ctx is feature dependent + * and will change from one version of libbpf to another and features + * requested during loader program generation. + */ +struct bpf_map_desc { + /* output of the loader prog */ + int map_fd; + /* input for the loader prog */ + __u32 max_entries; + __aligned_u64 initial_value; +}; +struct bpf_prog_desc { + int prog_fd; +}; + +enum { + BPF_SKEL_KERNEL = (1ULL << 0), +}; + +struct bpf_loader_ctx { + __u32 sz; + __u32 flags; + __u32 log_level; + __u32 log_size; + __u64 log_buf; +}; + +struct bpf_load_and_run_opts { + struct bpf_loader_ctx *ctx; + const void *data; + const void *insns; + __u32 data_sz; + __u32 insns_sz; + const char *errstr; +}; + +long kern_sys_bpf(__u32 cmd, void *attr, __u32 attr_size); + +static inline int skel_sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, + unsigned int size) +{ +#ifdef __KERNEL__ + return kern_sys_bpf(cmd, attr, size); +#else + return syscall(__NR_bpf, cmd, attr, size); +#endif +} + +#ifdef __KERNEL__ +static inline int close(int fd) +{ + return close_fd(fd); +} + +static inline void *skel_alloc(size_t size) +{ + struct bpf_loader_ctx *ctx = kzalloc(size, GFP_KERNEL); + + if (!ctx) + return NULL; + ctx->flags |= BPF_SKEL_KERNEL; + return ctx; +} + +static inline void skel_free(const void *p) +{ + kfree(p); +} + +/* skel->bss/rodata maps are populated the following way: + * + * For kernel use: + * skel_prep_map_data() allocates kernel memory that kernel module can directly access. + * Generated lskel stores the pointer in skel->rodata and in skel->maps.rodata.initial_value. + * The loader program will perform probe_read_kernel() from maps.rodata.initial_value. + * skel_finalize_map_data() sets skel->rodata to point to actual value in a bpf map and + * does maps.rodata.initial_value = ~0ULL to signal skel_free_map_data() that kvfree + * is not nessary. + * + * For user space: + * skel_prep_map_data() mmaps anon memory into skel->rodata that can be accessed directly. + * Generated lskel stores the pointer in skel->rodata and in skel->maps.rodata.initial_value. + * The loader program will perform copy_from_user() from maps.rodata.initial_value. + * skel_finalize_map_data() remaps bpf array map value from the kernel memory into + * skel->rodata address. + * + * The "bpftool gen skeleton -L" command generates lskel.h that is suitable for + * both kernel and user space. The generated loader program does + * either bpf_probe_read_kernel() or bpf_copy_from_user() from initial_value + * depending on bpf_loader_ctx->flags. + */ +static inline void skel_free_map_data(void *p, __u64 addr, size_t sz) +{ + if (addr != ~0ULL) + kvfree(p); + /* When addr == ~0ULL the 'p' points to + * ((struct bpf_array *)map)->value. See skel_finalize_map_data. + */ +} + +static inline void *skel_prep_map_data(const void *val, size_t mmap_sz, size_t val_sz) +{ + void *addr; + + addr = kvmalloc(val_sz, GFP_KERNEL); + if (!addr) + return NULL; + memcpy(addr, val, val_sz); + return addr; +} + +static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int flags, int fd) +{ + struct bpf_map *map; + void *addr = NULL; + + kvfree((void *) (long) *init_val); + *init_val = ~0ULL; + + /* At this point bpf_load_and_run() finished without error and + * 'fd' is a valid bpf map FD. All sanity checks below should succeed. + */ + map = bpf_map_get(fd); + if (IS_ERR(map)) + return NULL; + if (map->map_type != BPF_MAP_TYPE_ARRAY) + goto out; + addr = ((struct bpf_array *)map)->value; + /* the addr stays valid, since FD is not closed */ +out: + bpf_map_put(map); + return addr; +} + +#else + +static inline void *skel_alloc(size_t size) +{ + return calloc(1, size); +} + +static inline void skel_free(void *p) +{ + free(p); +} + +static inline void skel_free_map_data(void *p, __u64 addr, size_t sz) +{ + munmap(p, sz); +} + +static inline void *skel_prep_map_data(const void *val, size_t mmap_sz, size_t val_sz) +{ + void *addr; + + addr = mmap(NULL, mmap_sz, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (addr == (void *) -1) + return NULL; + memcpy(addr, val, val_sz); + return addr; +} + +static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int flags, int fd) +{ + void *addr; + + addr = mmap((void *) (long) *init_val, mmap_sz, flags, MAP_SHARED | MAP_FIXED, fd, 0); + if (addr == (void *) -1) + return NULL; + return addr; +} +#endif + +static inline int skel_closenz(int fd) +{ + if (fd > 0) + return close(fd); + return -EINVAL; +} + +#ifndef offsetofend +#define offsetofend(TYPE, MEMBER) \ + (offsetof(TYPE, MEMBER) + sizeof((((TYPE *)0)->MEMBER))) +#endif + +static inline int skel_map_create(enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, + __u32 value_size, + __u32 max_entries) +{ + const size_t attr_sz = offsetofend(union bpf_attr, map_extra); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + + attr.map_type = map_type; + strncpy(attr.map_name, map_name, sizeof(attr.map_name)); + attr.key_size = key_size; + attr.value_size = value_size; + attr.max_entries = max_entries; + + return skel_sys_bpf(BPF_MAP_CREATE, &attr, attr_sz); +} + +static inline int skel_map_update_elem(int fd, const void *key, + const void *value, __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = (long) key; + attr.value = (long) value; + attr.flags = flags; + + return skel_sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, attr_sz); +} + +static inline int skel_map_delete_elem(int fd, const void *key) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = (long)key; + + return skel_sys_bpf(BPF_MAP_DELETE_ELEM, &attr, attr_sz); +} + +static inline int skel_map_get_fd_by_id(__u32 id) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.map_id = id; + + return skel_sys_bpf(BPF_MAP_GET_FD_BY_ID, &attr, attr_sz); +} + +static inline int skel_raw_tracepoint_open(const char *name, int prog_fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, raw_tracepoint.prog_fd); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.raw_tracepoint.name = (long) name; + attr.raw_tracepoint.prog_fd = prog_fd; + + return skel_sys_bpf(BPF_RAW_TRACEPOINT_OPEN, &attr, attr_sz); +} + +static inline int skel_link_create(int prog_fd, int target_fd, + enum bpf_attach_type attach_type) +{ + const size_t attr_sz = offsetofend(union bpf_attr, link_create.iter_info_len); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.link_create.prog_fd = prog_fd; + attr.link_create.target_fd = target_fd; + attr.link_create.attach_type = attach_type; + + return skel_sys_bpf(BPF_LINK_CREATE, &attr, attr_sz); +} + +#ifdef __KERNEL__ +#define set_err +#else +#define set_err err = -errno +#endif + +static inline int bpf_load_and_run(struct bpf_load_and_run_opts *opts) +{ + const size_t prog_load_attr_sz = offsetofend(union bpf_attr, fd_array); + const size_t test_run_attr_sz = offsetofend(union bpf_attr, test); + int map_fd = -1, prog_fd = -1, key = 0, err; + union bpf_attr attr; + + err = map_fd = skel_map_create(BPF_MAP_TYPE_ARRAY, "__loader.map", 4, opts->data_sz, 1); + if (map_fd < 0) { + opts->errstr = "failed to create loader map"; + set_err; + goto out; + } + + err = skel_map_update_elem(map_fd, &key, opts->data, 0); + if (err < 0) { + opts->errstr = "failed to update loader map"; + set_err; + goto out; + } + + memset(&attr, 0, prog_load_attr_sz); + attr.prog_type = BPF_PROG_TYPE_SYSCALL; + attr.insns = (long) opts->insns; + attr.insn_cnt = opts->insns_sz / sizeof(struct bpf_insn); + attr.license = (long) "Dual BSD/GPL"; + memcpy(attr.prog_name, "__loader.prog", sizeof("__loader.prog")); + attr.fd_array = (long) &map_fd; + attr.log_level = opts->ctx->log_level; + attr.log_size = opts->ctx->log_size; + attr.log_buf = opts->ctx->log_buf; + attr.prog_flags = BPF_F_SLEEPABLE; + err = prog_fd = skel_sys_bpf(BPF_PROG_LOAD, &attr, prog_load_attr_sz); + if (prog_fd < 0) { + opts->errstr = "failed to load loader prog"; + set_err; + goto out; + } + + memset(&attr, 0, test_run_attr_sz); + attr.test.prog_fd = prog_fd; + attr.test.ctx_in = (long) opts->ctx; + attr.test.ctx_size_in = opts->ctx->sz; + err = skel_sys_bpf(BPF_PROG_RUN, &attr, test_run_attr_sz); + if (err < 0 || (int)attr.test.retval < 0) { + opts->errstr = "failed to execute loader prog"; + if (err < 0) { + set_err; + } else { + err = (int)attr.test.retval; +#ifndef __KERNEL__ + errno = -err; +#endif + } + goto out; + } + err = 0; +out: + if (map_fd >= 0) + close(map_fd); + if (prog_fd >= 0) + close(prog_fd); + return err; +} + +#endif diff --git a/bpftool/libbpf/src/str_error.c b/bpftool/libbpf/src/str_error.c new file mode 100644 index 0000000..146da01 --- /dev/null +++ b/bpftool/libbpf/src/str_error.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +#undef _GNU_SOURCE +#include +#include +#include "str_error.h" + +/* make sure libbpf doesn't use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +/* + * Wrapper to allow for building in non-GNU systems such as Alpine Linux's musl + * libc, while checking strerror_r() return to avoid having to check this in + * all places calling it. + */ +char *libbpf_strerror_r(int err, char *dst, int len) +{ + int ret = strerror_r(err < 0 ? -err : err, dst, len); + if (ret) + snprintf(dst, len, "ERROR: strerror_r(%d)=%d", err, ret); + return dst; +} diff --git a/bpftool/libbpf/src/str_error.h b/bpftool/libbpf/src/str_error.h new file mode 100644 index 0000000..a139334 --- /dev/null +++ b/bpftool/libbpf/src/str_error.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __LIBBPF_STR_ERROR_H +#define __LIBBPF_STR_ERROR_H + +char *libbpf_strerror_r(int err, char *dst, int len); +#endif /* __LIBBPF_STR_ERROR_H */ diff --git a/bpftool/libbpf/src/strset.c b/bpftool/libbpf/src/strset.c new file mode 100644 index 0000000..2464bcb --- /dev/null +++ b/bpftool/libbpf/src/strset.c @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2021 Facebook */ +#include +#include +#include +#include +#include +#include "hashmap.h" +#include "libbpf_internal.h" +#include "strset.h" + +struct strset { + void *strs_data; + size_t strs_data_len; + size_t strs_data_cap; + size_t strs_data_max_len; + + /* lookup index for each unique string in strings set */ + struct hashmap *strs_hash; +}; + +static size_t strset_hash_fn(long key, void *ctx) +{ + const struct strset *s = ctx; + const char *str = s->strs_data + key; + + return str_hash(str); +} + +static bool strset_equal_fn(long key1, long key2, void *ctx) +{ + const struct strset *s = ctx; + const char *str1 = s->strs_data + key1; + const char *str2 = s->strs_data + key2; + + return strcmp(str1, str2) == 0; +} + +struct strset *strset__new(size_t max_data_sz, const char *init_data, size_t init_data_sz) +{ + struct strset *set = calloc(1, sizeof(*set)); + struct hashmap *hash; + int err = -ENOMEM; + + if (!set) + return ERR_PTR(-ENOMEM); + + hash = hashmap__new(strset_hash_fn, strset_equal_fn, set); + if (IS_ERR(hash)) + goto err_out; + + set->strs_data_max_len = max_data_sz; + set->strs_hash = hash; + + if (init_data) { + long off; + + set->strs_data = malloc(init_data_sz); + if (!set->strs_data) + goto err_out; + + memcpy(set->strs_data, init_data, init_data_sz); + set->strs_data_len = init_data_sz; + set->strs_data_cap = init_data_sz; + + for (off = 0; off < set->strs_data_len; off += strlen(set->strs_data + off) + 1) { + /* hashmap__add() returns EEXIST if string with the same + * content already is in the hash map + */ + err = hashmap__add(hash, off, off); + if (err == -EEXIST) + continue; /* duplicate */ + if (err) + goto err_out; + } + } + + return set; +err_out: + strset__free(set); + return ERR_PTR(err); +} + +void strset__free(struct strset *set) +{ + if (IS_ERR_OR_NULL(set)) + return; + + hashmap__free(set->strs_hash); + free(set->strs_data); + free(set); +} + +size_t strset__data_size(const struct strset *set) +{ + return set->strs_data_len; +} + +const char *strset__data(const struct strset *set) +{ + return set->strs_data; +} + +static void *strset_add_str_mem(struct strset *set, size_t add_sz) +{ + return libbpf_add_mem(&set->strs_data, &set->strs_data_cap, 1, + set->strs_data_len, set->strs_data_max_len, add_sz); +} + +/* Find string offset that corresponds to a given string *s*. + * Returns: + * - >0 offset into string data, if string is found; + * - -ENOENT, if string is not in the string data; + * - <0, on any other error. + */ +int strset__find_str(struct strset *set, const char *s) +{ + long old_off, new_off, len; + void *p; + + /* see strset__add_str() for why we do this */ + len = strlen(s) + 1; + p = strset_add_str_mem(set, len); + if (!p) + return -ENOMEM; + + new_off = set->strs_data_len; + memcpy(p, s, len); + + if (hashmap__find(set->strs_hash, new_off, &old_off)) + return old_off; + + return -ENOENT; +} + +/* Add a string s to the string data. If the string already exists, return its + * offset within string data. + * Returns: + * - > 0 offset into string data, on success; + * - < 0, on error. + */ +int strset__add_str(struct strset *set, const char *s) +{ + long old_off, new_off, len; + void *p; + int err; + + /* Hashmap keys are always offsets within set->strs_data, so to even + * look up some string from the "outside", we need to first append it + * at the end, so that it can be addressed with an offset. Luckily, + * until set->strs_data_len is incremented, that string is just a piece + * of garbage for the rest of the code, so no harm, no foul. On the + * other hand, if the string is unique, it's already appended and + * ready to be used, only a simple set->strs_data_len increment away. + */ + len = strlen(s) + 1; + p = strset_add_str_mem(set, len); + if (!p) + return -ENOMEM; + + new_off = set->strs_data_len; + memcpy(p, s, len); + + /* Now attempt to add the string, but only if the string with the same + * contents doesn't exist already (HASHMAP_ADD strategy). If such + * string exists, we'll get its offset in old_off (that's old_key). + */ + err = hashmap__insert(set->strs_hash, new_off, new_off, + HASHMAP_ADD, &old_off, NULL); + if (err == -EEXIST) + return old_off; /* duplicated string, return existing offset */ + if (err) + return err; + + set->strs_data_len += len; /* new unique string, adjust data length */ + return new_off; +} diff --git a/bpftool/libbpf/src/strset.h b/bpftool/libbpf/src/strset.h new file mode 100644 index 0000000..b6ddf77 --- /dev/null +++ b/bpftool/libbpf/src/strset.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* Copyright (c) 2021 Facebook */ +#ifndef __LIBBPF_STRSET_H +#define __LIBBPF_STRSET_H + +#include +#include + +struct strset; + +struct strset *strset__new(size_t max_data_sz, const char *init_data, size_t init_data_sz); +void strset__free(struct strset *set); + +const char *strset__data(const struct strset *set); +size_t strset__data_size(const struct strset *set); + +int strset__find_str(struct strset *set, const char *s); +int strset__add_str(struct strset *set, const char *s); + +#endif /* __LIBBPF_STRSET_H */ diff --git a/bpftool/libbpf/src/usdt.bpf.h b/bpftool/libbpf/src/usdt.bpf.h new file mode 100644 index 0000000..0bd4c13 --- /dev/null +++ b/bpftool/libbpf/src/usdt.bpf.h @@ -0,0 +1,250 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */ +#ifndef __USDT_BPF_H__ +#define __USDT_BPF_H__ + +#include +#include +#include + +/* Below types and maps are internal implementation details of libbpf's USDT + * support and are subjects to change. Also, bpf_usdt_xxx() API helpers should + * be considered an unstable API as well and might be adjusted based on user + * feedback from using libbpf's USDT support in production. + */ + +/* User can override BPF_USDT_MAX_SPEC_CNT to change default size of internal + * map that keeps track of USDT argument specifications. This might be + * necessary if there are a lot of USDT attachments. + */ +#ifndef BPF_USDT_MAX_SPEC_CNT +#define BPF_USDT_MAX_SPEC_CNT 256 +#endif +/* User can override BPF_USDT_MAX_IP_CNT to change default size of internal + * map that keeps track of IP (memory address) mapping to USDT argument + * specification. + * Note, if kernel supports BPF cookies, this map is not used and could be + * resized all the way to 1 to save a bit of memory. + */ +#ifndef BPF_USDT_MAX_IP_CNT +#define BPF_USDT_MAX_IP_CNT (4 * BPF_USDT_MAX_SPEC_CNT) +#endif + +enum __bpf_usdt_arg_type { + BPF_USDT_ARG_CONST, + BPF_USDT_ARG_REG, + BPF_USDT_ARG_REG_DEREF, +}; + +struct __bpf_usdt_arg_spec { + /* u64 scalar interpreted depending on arg_type, see below */ + __u64 val_off; + /* arg location case, see bpf_udst_arg() for details */ + enum __bpf_usdt_arg_type arg_type; + /* offset of referenced register within struct pt_regs */ + short reg_off; + /* whether arg should be interpreted as signed value */ + bool arg_signed; + /* number of bits that need to be cleared and, optionally, + * sign-extended to cast arguments that are 1, 2, or 4 bytes + * long into final 8-byte u64/s64 value returned to user + */ + char arg_bitshift; +}; + +/* should match USDT_MAX_ARG_CNT in usdt.c exactly */ +#define BPF_USDT_MAX_ARG_CNT 12 +struct __bpf_usdt_spec { + struct __bpf_usdt_arg_spec args[BPF_USDT_MAX_ARG_CNT]; + __u64 usdt_cookie; + short arg_cnt; +}; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, BPF_USDT_MAX_SPEC_CNT); + __type(key, int); + __type(value, struct __bpf_usdt_spec); +} __bpf_usdt_specs SEC(".maps") __weak; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, BPF_USDT_MAX_IP_CNT); + __type(key, long); + __type(value, __u32); +} __bpf_usdt_ip_to_spec_id SEC(".maps") __weak; + +extern const _Bool LINUX_HAS_BPF_COOKIE __kconfig; + +static __always_inline +int __bpf_usdt_spec_id(struct pt_regs *ctx) +{ + if (!LINUX_HAS_BPF_COOKIE) { + long ip = PT_REGS_IP(ctx); + int *spec_id_ptr; + + spec_id_ptr = bpf_map_lookup_elem(&__bpf_usdt_ip_to_spec_id, &ip); + return spec_id_ptr ? *spec_id_ptr : -ESRCH; + } + + return bpf_get_attach_cookie(ctx); +} + +/* Return number of USDT arguments defined for currently traced USDT. */ +__weak __hidden +int bpf_usdt_arg_cnt(struct pt_regs *ctx) +{ + struct __bpf_usdt_spec *spec; + int spec_id; + + spec_id = __bpf_usdt_spec_id(ctx); + if (spec_id < 0) + return -ESRCH; + + spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); + if (!spec) + return -ESRCH; + + return spec->arg_cnt; +} + +/* Fetch USDT argument #*arg_num* (zero-indexed) and put its value into *res. + * Returns 0 on success; negative error, otherwise. + * On error *res is guaranteed to be set to zero. + */ +__weak __hidden +int bpf_usdt_arg(struct pt_regs *ctx, __u64 arg_num, long *res) +{ + struct __bpf_usdt_spec *spec; + struct __bpf_usdt_arg_spec *arg_spec; + unsigned long val; + int err, spec_id; + + *res = 0; + + spec_id = __bpf_usdt_spec_id(ctx); + if (spec_id < 0) + return -ESRCH; + + spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); + if (!spec) + return -ESRCH; + + if (arg_num >= BPF_USDT_MAX_ARG_CNT) + return -ENOENT; + barrier_var(arg_num); + if (arg_num >= spec->arg_cnt) + return -ENOENT; + + arg_spec = &spec->args[arg_num]; + switch (arg_spec->arg_type) { + case BPF_USDT_ARG_CONST: + /* Arg is just a constant ("-4@$-9" in USDT arg spec). + * value is recorded in arg_spec->val_off directly. + */ + val = arg_spec->val_off; + break; + case BPF_USDT_ARG_REG: + /* Arg is in a register (e.g, "8@%rax" in USDT arg spec), + * so we read the contents of that register directly from + * struct pt_regs. To keep things simple user-space parts + * record offsetof(struct pt_regs, ) in arg_spec->reg_off. + */ + err = bpf_probe_read_kernel(&val, sizeof(val), (void *)ctx + arg_spec->reg_off); + if (err) + return err; + break; + case BPF_USDT_ARG_REG_DEREF: + /* Arg is in memory addressed by register, plus some offset + * (e.g., "-4@-1204(%rbp)" in USDT arg spec). Register is + * identified like with BPF_USDT_ARG_REG case, and the offset + * is in arg_spec->val_off. We first fetch register contents + * from pt_regs, then do another user-space probe read to + * fetch argument value itself. + */ + err = bpf_probe_read_kernel(&val, sizeof(val), (void *)ctx + arg_spec->reg_off); + if (err) + return err; + err = bpf_probe_read_user(&val, sizeof(val), (void *)val + arg_spec->val_off); + if (err) + return err; +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + val >>= arg_spec->arg_bitshift; +#endif + break; + default: + return -EINVAL; + } + + /* cast arg from 1, 2, or 4 bytes to final 8 byte size clearing + * necessary upper arg_bitshift bits, with sign extension if argument + * is signed + */ + val <<= arg_spec->arg_bitshift; + if (arg_spec->arg_signed) + val = ((long)val) >> arg_spec->arg_bitshift; + else + val = val >> arg_spec->arg_bitshift; + *res = val; + return 0; +} + +/* Retrieve user-specified cookie value provided during attach as + * bpf_usdt_opts.usdt_cookie. This serves the same purpose as BPF cookie + * returned by bpf_get_attach_cookie(). Libbpf's support for USDT is itself + * utilizing BPF cookies internally, so user can't use BPF cookie directly + * for USDT programs and has to use bpf_usdt_cookie() API instead. + */ +__weak __hidden +long bpf_usdt_cookie(struct pt_regs *ctx) +{ + struct __bpf_usdt_spec *spec; + int spec_id; + + spec_id = __bpf_usdt_spec_id(ctx); + if (spec_id < 0) + return 0; + + spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); + if (!spec) + return 0; + + return spec->usdt_cookie; +} + +/* we rely on ___bpf_apply() and ___bpf_narg() macros already defined in bpf_tracing.h */ +#define ___bpf_usdt_args0() ctx +#define ___bpf_usdt_args1(x) ___bpf_usdt_args0(), ({ long _x; bpf_usdt_arg(ctx, 0, &_x); (void *)_x; }) +#define ___bpf_usdt_args2(x, args...) ___bpf_usdt_args1(args), ({ long _x; bpf_usdt_arg(ctx, 1, &_x); (void *)_x; }) +#define ___bpf_usdt_args3(x, args...) ___bpf_usdt_args2(args), ({ long _x; bpf_usdt_arg(ctx, 2, &_x); (void *)_x; }) +#define ___bpf_usdt_args4(x, args...) ___bpf_usdt_args3(args), ({ long _x; bpf_usdt_arg(ctx, 3, &_x); (void *)_x; }) +#define ___bpf_usdt_args5(x, args...) ___bpf_usdt_args4(args), ({ long _x; bpf_usdt_arg(ctx, 4, &_x); (void *)_x; }) +#define ___bpf_usdt_args6(x, args...) ___bpf_usdt_args5(args), ({ long _x; bpf_usdt_arg(ctx, 5, &_x); (void *)_x; }) +#define ___bpf_usdt_args7(x, args...) ___bpf_usdt_args6(args), ({ long _x; bpf_usdt_arg(ctx, 6, &_x); (void *)_x; }) +#define ___bpf_usdt_args8(x, args...) ___bpf_usdt_args7(args), ({ long _x; bpf_usdt_arg(ctx, 7, &_x); (void *)_x; }) +#define ___bpf_usdt_args9(x, args...) ___bpf_usdt_args8(args), ({ long _x; bpf_usdt_arg(ctx, 8, &_x); (void *)_x; }) +#define ___bpf_usdt_args10(x, args...) ___bpf_usdt_args9(args), ({ long _x; bpf_usdt_arg(ctx, 9, &_x); (void *)_x; }) +#define ___bpf_usdt_args11(x, args...) ___bpf_usdt_args10(args), ({ long _x; bpf_usdt_arg(ctx, 10, &_x); (void *)_x; }) +#define ___bpf_usdt_args12(x, args...) ___bpf_usdt_args11(args), ({ long _x; bpf_usdt_arg(ctx, 11, &_x); (void *)_x; }) +#define ___bpf_usdt_args(args...) ___bpf_apply(___bpf_usdt_args, ___bpf_narg(args))(args) + +/* + * BPF_USDT serves the same purpose for USDT handlers as BPF_PROG for + * tp_btf/fentry/fexit BPF programs and BPF_KPROBE for kprobes. + * Original struct pt_regs * context is preserved as 'ctx' argument. + */ +#define BPF_USDT(name, args...) \ +name(struct pt_regs *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_usdt_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args) + +#endif /* __USDT_BPF_H__ */ diff --git a/bpftool/libbpf/src/usdt.c b/bpftool/libbpf/src/usdt.c new file mode 100644 index 0000000..75b411f --- /dev/null +++ b/bpftool/libbpf/src/usdt.c @@ -0,0 +1,1516 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* s8 will be marked as poison while it's a reg of riscv */ +#if defined(__riscv) +#define rv_s8 s8 +#endif + +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_common.h" +#include "libbpf_internal.h" +#include "hashmap.h" + +/* libbpf's USDT support consists of BPF-side state/code and user-space + * state/code working together in concert. BPF-side parts are defined in + * usdt.bpf.h header library. User-space state is encapsulated by struct + * usdt_manager and all the supporting code centered around usdt_manager. + * + * usdt.bpf.h defines two BPF maps that usdt_manager expects: USDT spec map + * and IP-to-spec-ID map, which is auxiliary map necessary for kernels that + * don't support BPF cookie (see below). These two maps are implicitly + * embedded into user's end BPF object file when user's code included + * usdt.bpf.h. This means that libbpf doesn't do anything special to create + * these USDT support maps. They are created by normal libbpf logic of + * instantiating BPF maps when opening and loading BPF object. + * + * As such, libbpf is basically unaware of the need to do anything + * USDT-related until the very first call to bpf_program__attach_usdt(), which + * can be called by user explicitly or happen automatically during skeleton + * attach (or, equivalently, through generic bpf_program__attach() call). At + * this point, libbpf will instantiate and initialize struct usdt_manager and + * store it in bpf_object. USDT manager is per-BPF object construct, as each + * independent BPF object might or might not have USDT programs, and thus all + * the expected USDT-related state. There is no coordination between two + * bpf_object in parts of USDT attachment, they are oblivious of each other's + * existence and libbpf is just oblivious, dealing with bpf_object-specific + * USDT state. + * + * Quick crash course on USDTs. + * + * From user-space application's point of view, USDT is essentially just + * a slightly special function call that normally has zero overhead, unless it + * is being traced by some external entity (e.g, BPF-based tool). Here's how + * a typical application can trigger USDT probe: + * + * #include // provided by systemtap-sdt-devel package + * // folly also provide similar functionality in folly/tracing/StaticTracepoint.h + * + * STAP_PROBE3(my_usdt_provider, my_usdt_probe_name, 123, x, &y); + * + * USDT is identified by it's : pair of names. Each + * individual USDT has a fixed number of arguments (3 in the above example) + * and specifies values of each argument as if it was a function call. + * + * USDT call is actually not a function call, but is instead replaced by + * a single NOP instruction (thus zero overhead, effectively). But in addition + * to that, those USDT macros generate special SHT_NOTE ELF records in + * .note.stapsdt ELF section. Here's an example USDT definition as emitted by + * `readelf -n `: + * + * stapsdt 0x00000089 NT_STAPSDT (SystemTap probe descriptors) + * Provider: test + * Name: usdt12 + * Location: 0x0000000000549df3, Base: 0x00000000008effa4, Semaphore: 0x0000000000a4606e + * Arguments: -4@-1204(%rbp) -4@%edi -8@-1216(%rbp) -8@%r8 -4@$5 -8@%r9 8@%rdx 8@%r10 -4@$-9 -2@%cx -2@%ax -1@%sil + * + * In this case we have USDT test:usdt12 with 12 arguments. + * + * Location and base are offsets used to calculate absolute IP address of that + * NOP instruction that kernel can replace with an interrupt instruction to + * trigger instrumentation code (BPF program for all that we care about). + * + * Semaphore above is and optional feature. It records an address of a 2-byte + * refcount variable (normally in '.probes' ELF section) used for signaling if + * there is anything that is attached to USDT. This is useful for user + * applications if, for example, they need to prepare some arguments that are + * passed only to USDTs and preparation is expensive. By checking if USDT is + * "activated", an application can avoid paying those costs unnecessarily. + * Recent enough kernel has built-in support for automatically managing this + * refcount, which libbpf expects and relies on. If USDT is defined without + * associated semaphore, this value will be zero. See selftests for semaphore + * examples. + * + * Arguments is the most interesting part. This USDT specification string is + * providing information about all the USDT arguments and their locations. The + * part before @ sign defined byte size of the argument (1, 2, 4, or 8) and + * whether the argument is signed or unsigned (negative size means signed). + * The part after @ sign is assembly-like definition of argument location + * (see [0] for more details). Technically, assembler can provide some pretty + * advanced definitions, but libbpf is currently supporting three most common + * cases: + * 1) immediate constant, see 5th and 9th args above (-4@$5 and -4@-9); + * 2) register value, e.g., 8@%rdx, which means "unsigned 8-byte integer + * whose value is in register %rdx"; + * 3) memory dereference addressed by register, e.g., -4@-1204(%rbp), which + * specifies signed 32-bit integer stored at offset -1204 bytes from + * memory address stored in %rbp. + * + * [0] https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation + * + * During attachment, libbpf parses all the relevant USDT specifications and + * prepares `struct usdt_spec` (USDT spec), which is then provided to BPF-side + * code through spec map. This allows BPF applications to quickly fetch the + * actual value at runtime using a simple BPF-side code. + * + * With basics out of the way, let's go over less immediately obvious aspects + * of supporting USDTs. + * + * First, there is no special USDT BPF program type. It is actually just + * a uprobe BPF program (which for kernel, at least currently, is just a kprobe + * program, so BPF_PROG_TYPE_KPROBE program type). With the only difference + * that uprobe is usually attached at the function entry, while USDT will + * normally will be somewhere inside the function. But it should always be + * pointing to NOP instruction, which makes such uprobes the fastest uprobe + * kind. + * + * Second, it's important to realize that such STAP_PROBEn(provider, name, ...) + * macro invocations can end up being inlined many-many times, depending on + * specifics of each individual user application. So single conceptual USDT + * (identified by provider:name pair of identifiers) is, generally speaking, + * multiple uprobe locations (USDT call sites) in different places in user + * application. Further, again due to inlining, each USDT call site might end + * up having the same argument #N be located in a different place. In one call + * site it could be a constant, in another will end up in a register, and in + * yet another could be some other register or even somewhere on the stack. + * + * As such, "attaching to USDT" means (in general case) attaching the same + * uprobe BPF program to multiple target locations in user application, each + * potentially having a completely different USDT spec associated with it. + * To wire all this up together libbpf allocates a unique integer spec ID for + * each unique USDT spec. Spec IDs are allocated as sequential small integers + * so that they can be used as keys in array BPF map (for performance reasons). + * Spec ID allocation and accounting is big part of what usdt_manager is + * about. This state has to be maintained per-BPF object and coordinate + * between different USDT attachments within the same BPF object. + * + * Spec ID is the key in spec BPF map, value is the actual USDT spec layed out + * as struct usdt_spec. Each invocation of BPF program at runtime needs to + * know its associated spec ID. It gets it either through BPF cookie, which + * libbpf sets to spec ID during attach time, or, if kernel is too old to + * support BPF cookie, through IP-to-spec-ID map that libbpf maintains in such + * case. The latter means that some modes of operation can't be supported + * without BPF cookie. Such mode is attaching to shared library "generically", + * without specifying target process. In such case, it's impossible to + * calculate absolute IP addresses for IP-to-spec-ID map, and thus such mode + * is not supported without BPF cookie support. + * + * Note that libbpf is using BPF cookie functionality for its own internal + * needs, so user itself can't rely on BPF cookie feature. To that end, libbpf + * provides conceptually equivalent USDT cookie support. It's still u64 + * user-provided value that can be associated with USDT attachment. Note that + * this will be the same value for all USDT call sites within the same single + * *logical* USDT attachment. This makes sense because to user attaching to + * USDT is a single BPF program triggered for singular USDT probe. The fact + * that this is done at multiple actual locations is a mostly hidden + * implementation details. This USDT cookie value can be fetched with + * bpf_usdt_cookie(ctx) API provided by usdt.bpf.h + * + * Lastly, while single USDT can have tons of USDT call sites, it doesn't + * necessarily have that many different USDT specs. It very well might be + * that 1000 USDT call sites only need 5 different USDT specs, because all the + * arguments are typically contained in a small set of registers or stack + * locations. As such, it's wasteful to allocate as many USDT spec IDs as + * there are USDT call sites. So libbpf tries to be frugal and performs + * on-the-fly deduplication during a single USDT attachment to only allocate + * the minimal required amount of unique USDT specs (and thus spec IDs). This + * is trivially achieved by using USDT spec string (Arguments string from USDT + * note) as a lookup key in a hashmap. USDT spec string uniquely defines + * everything about how to fetch USDT arguments, so two USDT call sites + * sharing USDT spec string can safely share the same USDT spec and spec ID. + * Note, this spec string deduplication is happening only during the same USDT + * attachment, so each USDT spec shares the same USDT cookie value. This is + * not generally true for other USDT attachments within the same BPF object, + * as even if USDT spec string is the same, USDT cookie value can be + * different. It was deemed excessive to try to deduplicate across independent + * USDT attachments by taking into account USDT spec string *and* USDT cookie + * value, which would complicated spec ID accounting significantly for little + * gain. + */ + +#define USDT_BASE_SEC ".stapsdt.base" +#define USDT_SEMA_SEC ".probes" +#define USDT_NOTE_SEC ".note.stapsdt" +#define USDT_NOTE_TYPE 3 +#define USDT_NOTE_NAME "stapsdt" + +/* should match exactly enum __bpf_usdt_arg_type from usdt.bpf.h */ +enum usdt_arg_type { + USDT_ARG_CONST, + USDT_ARG_REG, + USDT_ARG_REG_DEREF, +}; + +/* should match exactly struct __bpf_usdt_arg_spec from usdt.bpf.h */ +struct usdt_arg_spec { + __u64 val_off; + enum usdt_arg_type arg_type; + short reg_off; + bool arg_signed; + char arg_bitshift; +}; + +/* should match BPF_USDT_MAX_ARG_CNT in usdt.bpf.h */ +#define USDT_MAX_ARG_CNT 12 + +/* should match struct __bpf_usdt_spec from usdt.bpf.h */ +struct usdt_spec { + struct usdt_arg_spec args[USDT_MAX_ARG_CNT]; + __u64 usdt_cookie; + short arg_cnt; +}; + +struct usdt_note { + const char *provider; + const char *name; + /* USDT args specification string, e.g.: + * "-4@%esi -4@-24(%rbp) -4@%ecx 2@%ax 8@%rdx" + */ + const char *args; + long loc_addr; + long base_addr; + long sema_addr; +}; + +struct usdt_target { + long abs_ip; + long rel_ip; + long sema_off; + struct usdt_spec spec; + const char *spec_str; +}; + +struct usdt_manager { + struct bpf_map *specs_map; + struct bpf_map *ip_to_spec_id_map; + + int *free_spec_ids; + size_t free_spec_cnt; + size_t next_free_spec_id; + + bool has_bpf_cookie; + bool has_sema_refcnt; +}; + +struct usdt_manager *usdt_manager_new(struct bpf_object *obj) +{ + static const char *ref_ctr_sysfs_path = "/sys/bus/event_source/devices/uprobe/format/ref_ctr_offset"; + struct usdt_manager *man; + struct bpf_map *specs_map, *ip_to_spec_id_map; + + specs_map = bpf_object__find_map_by_name(obj, "__bpf_usdt_specs"); + ip_to_spec_id_map = bpf_object__find_map_by_name(obj, "__bpf_usdt_ip_to_spec_id"); + if (!specs_map || !ip_to_spec_id_map) { + pr_warn("usdt: failed to find USDT support BPF maps, did you forget to include bpf/usdt.bpf.h?\n"); + return ERR_PTR(-ESRCH); + } + + man = calloc(1, sizeof(*man)); + if (!man) + return ERR_PTR(-ENOMEM); + + man->specs_map = specs_map; + man->ip_to_spec_id_map = ip_to_spec_id_map; + + /* Detect if BPF cookie is supported for kprobes. + * We don't need IP-to-ID mapping if we can use BPF cookies. + * Added in: 7adfc6c9b315 ("bpf: Add bpf_get_attach_cookie() BPF helper to access bpf_cookie value") + */ + man->has_bpf_cookie = kernel_supports(obj, FEAT_BPF_COOKIE); + + /* Detect kernel support for automatic refcounting of USDT semaphore. + * If this is not supported, USDTs with semaphores will not be supported. + * Added in: a6ca88b241d5 ("trace_uprobe: support reference counter in fd-based uprobe") + */ + man->has_sema_refcnt = faccessat(AT_FDCWD, ref_ctr_sysfs_path, F_OK, AT_EACCESS) == 0; + + return man; +} + +void usdt_manager_free(struct usdt_manager *man) +{ + if (IS_ERR_OR_NULL(man)) + return; + + free(man->free_spec_ids); + free(man); +} + +static int sanity_check_usdt_elf(Elf *elf, const char *path) +{ + GElf_Ehdr ehdr; + int endianness; + + if (elf_kind(elf) != ELF_K_ELF) { + pr_warn("usdt: unrecognized ELF kind %d for '%s'\n", elf_kind(elf), path); + return -EBADF; + } + + switch (gelf_getclass(elf)) { + case ELFCLASS64: + if (sizeof(void *) != 8) { + pr_warn("usdt: attaching to 64-bit ELF binary '%s' is not supported\n", path); + return -EBADF; + } + break; + case ELFCLASS32: + if (sizeof(void *) != 4) { + pr_warn("usdt: attaching to 32-bit ELF binary '%s' is not supported\n", path); + return -EBADF; + } + break; + default: + pr_warn("usdt: unsupported ELF class for '%s'\n", path); + return -EBADF; + } + + if (!gelf_getehdr(elf, &ehdr)) + return -EINVAL; + + if (ehdr.e_type != ET_EXEC && ehdr.e_type != ET_DYN) { + pr_warn("usdt: unsupported type of ELF binary '%s' (%d), only ET_EXEC and ET_DYN are supported\n", + path, ehdr.e_type); + return -EBADF; + } + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + endianness = ELFDATA2LSB; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + endianness = ELFDATA2MSB; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif + if (endianness != ehdr.e_ident[EI_DATA]) { + pr_warn("usdt: ELF endianness mismatch for '%s'\n", path); + return -EBADF; + } + + return 0; +} + +static int find_elf_sec_by_name(Elf *elf, const char *sec_name, GElf_Shdr *shdr, Elf_Scn **scn) +{ + Elf_Scn *sec = NULL; + size_t shstrndx; + + if (elf_getshdrstrndx(elf, &shstrndx)) + return -EINVAL; + + /* check if ELF is corrupted and avoid calling elf_strptr if yes */ + if (!elf_rawdata(elf_getscn(elf, shstrndx), NULL)) + return -EINVAL; + + while ((sec = elf_nextscn(elf, sec)) != NULL) { + char *name; + + if (!gelf_getshdr(sec, shdr)) + return -EINVAL; + + name = elf_strptr(elf, shstrndx, shdr->sh_name); + if (name && strcmp(sec_name, name) == 0) { + *scn = sec; + return 0; + } + } + + return -ENOENT; +} + +struct elf_seg { + long start; + long end; + long offset; + bool is_exec; +}; + +static int cmp_elf_segs(const void *_a, const void *_b) +{ + const struct elf_seg *a = _a; + const struct elf_seg *b = _b; + + return a->start < b->start ? -1 : 1; +} + +static int parse_elf_segs(Elf *elf, const char *path, struct elf_seg **segs, size_t *seg_cnt) +{ + GElf_Phdr phdr; + size_t n; + int i, err; + struct elf_seg *seg; + void *tmp; + + *seg_cnt = 0; + + if (elf_getphdrnum(elf, &n)) { + err = -errno; + return err; + } + + for (i = 0; i < n; i++) { + if (!gelf_getphdr(elf, i, &phdr)) { + err = -errno; + return err; + } + + pr_debug("usdt: discovered PHDR #%d in '%s': vaddr 0x%lx memsz 0x%lx offset 0x%lx type 0x%lx flags 0x%lx\n", + i, path, (long)phdr.p_vaddr, (long)phdr.p_memsz, (long)phdr.p_offset, + (long)phdr.p_type, (long)phdr.p_flags); + if (phdr.p_type != PT_LOAD) + continue; + + tmp = libbpf_reallocarray(*segs, *seg_cnt + 1, sizeof(**segs)); + if (!tmp) + return -ENOMEM; + + *segs = tmp; + seg = *segs + *seg_cnt; + (*seg_cnt)++; + + seg->start = phdr.p_vaddr; + seg->end = phdr.p_vaddr + phdr.p_memsz; + seg->offset = phdr.p_offset; + seg->is_exec = phdr.p_flags & PF_X; + } + + if (*seg_cnt == 0) { + pr_warn("usdt: failed to find PT_LOAD program headers in '%s'\n", path); + return -ESRCH; + } + + qsort(*segs, *seg_cnt, sizeof(**segs), cmp_elf_segs); + return 0; +} + +static int parse_vma_segs(int pid, const char *lib_path, struct elf_seg **segs, size_t *seg_cnt) +{ + char path[PATH_MAX], line[PATH_MAX], mode[16]; + size_t seg_start, seg_end, seg_off; + struct elf_seg *seg; + int tmp_pid, i, err; + FILE *f; + + *seg_cnt = 0; + + /* Handle containerized binaries only accessible from + * /proc//root/. They will be reported as just / in + * /proc//maps. + */ + if (sscanf(lib_path, "/proc/%d/root%s", &tmp_pid, path) == 2 && pid == tmp_pid) + goto proceed; + + if (!realpath(lib_path, path)) { + pr_warn("usdt: failed to get absolute path of '%s' (err %d), using path as is...\n", + lib_path, -errno); + libbpf_strlcpy(path, lib_path, sizeof(path)); + } + +proceed: + sprintf(line, "/proc/%d/maps", pid); + f = fopen(line, "r"); + if (!f) { + err = -errno; + pr_warn("usdt: failed to open '%s' to get base addr of '%s': %d\n", + line, lib_path, err); + return err; + } + + /* We need to handle lines with no path at the end: + * + * 7f5c6f5d1000-7f5c6f5d3000 rw-p 001c7000 08:04 21238613 /usr/lib64/libc-2.17.so + * 7f5c6f5d3000-7f5c6f5d8000 rw-p 00000000 00:00 0 + * 7f5c6f5d8000-7f5c6f5d9000 r-xp 00000000 103:01 362990598 /data/users/andriin/linux/tools/bpf/usdt/libhello_usdt.so + */ + while (fscanf(f, "%zx-%zx %s %zx %*s %*d%[^\n]\n", + &seg_start, &seg_end, mode, &seg_off, line) == 5) { + void *tmp; + + /* to handle no path case (see above) we need to capture line + * without skipping any whitespaces. So we need to strip + * leading whitespaces manually here + */ + i = 0; + while (isblank(line[i])) + i++; + if (strcmp(line + i, path) != 0) + continue; + + pr_debug("usdt: discovered segment for lib '%s': addrs %zx-%zx mode %s offset %zx\n", + path, seg_start, seg_end, mode, seg_off); + + /* ignore non-executable sections for shared libs */ + if (mode[2] != 'x') + continue; + + tmp = libbpf_reallocarray(*segs, *seg_cnt + 1, sizeof(**segs)); + if (!tmp) { + err = -ENOMEM; + goto err_out; + } + + *segs = tmp; + seg = *segs + *seg_cnt; + *seg_cnt += 1; + + seg->start = seg_start; + seg->end = seg_end; + seg->offset = seg_off; + seg->is_exec = true; + } + + if (*seg_cnt == 0) { + pr_warn("usdt: failed to find '%s' (resolved to '%s') within PID %d memory mappings\n", + lib_path, path, pid); + err = -ESRCH; + goto err_out; + } + + qsort(*segs, *seg_cnt, sizeof(**segs), cmp_elf_segs); + err = 0; +err_out: + fclose(f); + return err; +} + +static struct elf_seg *find_elf_seg(struct elf_seg *segs, size_t seg_cnt, long virtaddr) +{ + struct elf_seg *seg; + int i; + + /* for ELF binaries (both executables and shared libraries), we are + * given virtual address (absolute for executables, relative for + * libraries) which should match address range of [seg_start, seg_end) + */ + for (i = 0, seg = segs; i < seg_cnt; i++, seg++) { + if (seg->start <= virtaddr && virtaddr < seg->end) + return seg; + } + return NULL; +} + +static struct elf_seg *find_vma_seg(struct elf_seg *segs, size_t seg_cnt, long offset) +{ + struct elf_seg *seg; + int i; + + /* for VMA segments from /proc//maps file, provided "address" is + * actually a file offset, so should be fall within logical + * offset-based range of [offset_start, offset_end) + */ + for (i = 0, seg = segs; i < seg_cnt; i++, seg++) { + if (seg->offset <= offset && offset < seg->offset + (seg->end - seg->start)) + return seg; + } + return NULL; +} + +static int parse_usdt_note(Elf *elf, const char *path, GElf_Nhdr *nhdr, + const char *data, size_t name_off, size_t desc_off, + struct usdt_note *usdt_note); + +static int parse_usdt_spec(struct usdt_spec *spec, const struct usdt_note *note, __u64 usdt_cookie); + +static int collect_usdt_targets(struct usdt_manager *man, Elf *elf, const char *path, pid_t pid, + const char *usdt_provider, const char *usdt_name, __u64 usdt_cookie, + struct usdt_target **out_targets, size_t *out_target_cnt) +{ + size_t off, name_off, desc_off, seg_cnt = 0, vma_seg_cnt = 0, target_cnt = 0; + struct elf_seg *segs = NULL, *vma_segs = NULL; + struct usdt_target *targets = NULL, *target; + long base_addr = 0; + Elf_Scn *notes_scn, *base_scn; + GElf_Shdr base_shdr, notes_shdr; + GElf_Ehdr ehdr; + GElf_Nhdr nhdr; + Elf_Data *data; + int err; + + *out_targets = NULL; + *out_target_cnt = 0; + + err = find_elf_sec_by_name(elf, USDT_NOTE_SEC, ¬es_shdr, ¬es_scn); + if (err) { + pr_warn("usdt: no USDT notes section (%s) found in '%s'\n", USDT_NOTE_SEC, path); + return err; + } + + if (notes_shdr.sh_type != SHT_NOTE || !gelf_getehdr(elf, &ehdr)) { + pr_warn("usdt: invalid USDT notes section (%s) in '%s'\n", USDT_NOTE_SEC, path); + return -EINVAL; + } + + err = parse_elf_segs(elf, path, &segs, &seg_cnt); + if (err) { + pr_warn("usdt: failed to process ELF program segments for '%s': %d\n", path, err); + goto err_out; + } + + /* .stapsdt.base ELF section is optional, but is used for prelink + * offset compensation (see a big comment further below) + */ + if (find_elf_sec_by_name(elf, USDT_BASE_SEC, &base_shdr, &base_scn) == 0) + base_addr = base_shdr.sh_addr; + + data = elf_getdata(notes_scn, 0); + off = 0; + while ((off = gelf_getnote(data, off, &nhdr, &name_off, &desc_off)) > 0) { + long usdt_abs_ip, usdt_rel_ip, usdt_sema_off = 0; + struct usdt_note note; + struct elf_seg *seg = NULL; + void *tmp; + + err = parse_usdt_note(elf, path, &nhdr, data->d_buf, name_off, desc_off, ¬e); + if (err) + goto err_out; + + if (strcmp(note.provider, usdt_provider) != 0 || strcmp(note.name, usdt_name) != 0) + continue; + + /* We need to compensate "prelink effect". See [0] for details, + * relevant parts quoted here: + * + * Each SDT probe also expands into a non-allocated ELF note. You can + * find this by looking at SHT_NOTE sections and decoding the format; + * see below for details. Because the note is non-allocated, it means + * there is no runtime cost, and also preserved in both stripped files + * and .debug files. + * + * However, this means that prelink won't adjust the note's contents + * for address offsets. Instead, this is done via the .stapsdt.base + * section. This is a special section that is added to the text. We + * will only ever have one of these sections in a final link and it + * will only ever be one byte long. Nothing about this section itself + * matters, we just use it as a marker to detect prelink address + * adjustments. + * + * Each probe note records the link-time address of the .stapsdt.base + * section alongside the probe PC address. The decoder compares the + * base address stored in the note with the .stapsdt.base section's + * sh_addr. Initially these are the same, but the section header will + * be adjusted by prelink. So the decoder applies the difference to + * the probe PC address to get the correct prelinked PC address; the + * same adjustment is applied to the semaphore address, if any. + * + * [0] https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation + */ + usdt_abs_ip = note.loc_addr; + if (base_addr) + usdt_abs_ip += base_addr - note.base_addr; + + /* When attaching uprobes (which is what USDTs basically are) + * kernel expects file offset to be specified, not a relative + * virtual address, so we need to translate virtual address to + * file offset, for both ET_EXEC and ET_DYN binaries. + */ + seg = find_elf_seg(segs, seg_cnt, usdt_abs_ip); + if (!seg) { + err = -ESRCH; + pr_warn("usdt: failed to find ELF program segment for '%s:%s' in '%s' at IP 0x%lx\n", + usdt_provider, usdt_name, path, usdt_abs_ip); + goto err_out; + } + if (!seg->is_exec) { + err = -ESRCH; + pr_warn("usdt: matched ELF binary '%s' segment [0x%lx, 0x%lx) for '%s:%s' at IP 0x%lx is not executable\n", + path, seg->start, seg->end, usdt_provider, usdt_name, + usdt_abs_ip); + goto err_out; + } + /* translate from virtual address to file offset */ + usdt_rel_ip = usdt_abs_ip - seg->start + seg->offset; + + if (ehdr.e_type == ET_DYN && !man->has_bpf_cookie) { + /* If we don't have BPF cookie support but need to + * attach to a shared library, we'll need to know and + * record absolute addresses of attach points due to + * the need to lookup USDT spec by absolute IP of + * triggered uprobe. Doing this resolution is only + * possible when we have a specific PID of the process + * that's using specified shared library. BPF cookie + * removes the absolute address limitation as we don't + * need to do this lookup (we just use BPF cookie as + * an index of USDT spec), so for newer kernels with + * BPF cookie support libbpf supports USDT attachment + * to shared libraries with no PID filter. + */ + if (pid < 0) { + pr_warn("usdt: attaching to shared libraries without specific PID is not supported on current kernel\n"); + err = -ENOTSUP; + goto err_out; + } + + /* vma_segs are lazily initialized only if necessary */ + if (vma_seg_cnt == 0) { + err = parse_vma_segs(pid, path, &vma_segs, &vma_seg_cnt); + if (err) { + pr_warn("usdt: failed to get memory segments in PID %d for shared library '%s': %d\n", + pid, path, err); + goto err_out; + } + } + + seg = find_vma_seg(vma_segs, vma_seg_cnt, usdt_rel_ip); + if (!seg) { + err = -ESRCH; + pr_warn("usdt: failed to find shared lib memory segment for '%s:%s' in '%s' at relative IP 0x%lx\n", + usdt_provider, usdt_name, path, usdt_rel_ip); + goto err_out; + } + + usdt_abs_ip = seg->start - seg->offset + usdt_rel_ip; + } + + pr_debug("usdt: probe for '%s:%s' in %s '%s': addr 0x%lx base 0x%lx (resolved abs_ip 0x%lx rel_ip 0x%lx) args '%s' in segment [0x%lx, 0x%lx) at offset 0x%lx\n", + usdt_provider, usdt_name, ehdr.e_type == ET_EXEC ? "exec" : "lib ", path, + note.loc_addr, note.base_addr, usdt_abs_ip, usdt_rel_ip, note.args, + seg ? seg->start : 0, seg ? seg->end : 0, seg ? seg->offset : 0); + + /* Adjust semaphore address to be a file offset */ + if (note.sema_addr) { + if (!man->has_sema_refcnt) { + pr_warn("usdt: kernel doesn't support USDT semaphore refcounting for '%s:%s' in '%s'\n", + usdt_provider, usdt_name, path); + err = -ENOTSUP; + goto err_out; + } + + seg = find_elf_seg(segs, seg_cnt, note.sema_addr); + if (!seg) { + err = -ESRCH; + pr_warn("usdt: failed to find ELF loadable segment with semaphore of '%s:%s' in '%s' at 0x%lx\n", + usdt_provider, usdt_name, path, note.sema_addr); + goto err_out; + } + if (seg->is_exec) { + err = -ESRCH; + pr_warn("usdt: matched ELF binary '%s' segment [0x%lx, 0x%lx] for semaphore of '%s:%s' at 0x%lx is executable\n", + path, seg->start, seg->end, usdt_provider, usdt_name, + note.sema_addr); + goto err_out; + } + + usdt_sema_off = note.sema_addr - seg->start + seg->offset; + + pr_debug("usdt: sema for '%s:%s' in %s '%s': addr 0x%lx base 0x%lx (resolved 0x%lx) in segment [0x%lx, 0x%lx] at offset 0x%lx\n", + usdt_provider, usdt_name, ehdr.e_type == ET_EXEC ? "exec" : "lib ", + path, note.sema_addr, note.base_addr, usdt_sema_off, + seg->start, seg->end, seg->offset); + } + + /* Record adjusted addresses and offsets and parse USDT spec */ + tmp = libbpf_reallocarray(targets, target_cnt + 1, sizeof(*targets)); + if (!tmp) { + err = -ENOMEM; + goto err_out; + } + targets = tmp; + + target = &targets[target_cnt]; + memset(target, 0, sizeof(*target)); + + target->abs_ip = usdt_abs_ip; + target->rel_ip = usdt_rel_ip; + target->sema_off = usdt_sema_off; + + /* notes.args references strings from Elf itself, so they can + * be referenced safely until elf_end() call + */ + target->spec_str = note.args; + + err = parse_usdt_spec(&target->spec, ¬e, usdt_cookie); + if (err) + goto err_out; + + target_cnt++; + } + + *out_targets = targets; + *out_target_cnt = target_cnt; + err = target_cnt; + +err_out: + free(segs); + free(vma_segs); + if (err < 0) + free(targets); + return err; +} + +struct bpf_link_usdt { + struct bpf_link link; + + struct usdt_manager *usdt_man; + + size_t spec_cnt; + int *spec_ids; + + size_t uprobe_cnt; + struct { + long abs_ip; + struct bpf_link *link; + } *uprobes; +}; + +static int bpf_link_usdt_detach(struct bpf_link *link) +{ + struct bpf_link_usdt *usdt_link = container_of(link, struct bpf_link_usdt, link); + struct usdt_manager *man = usdt_link->usdt_man; + int i; + + for (i = 0; i < usdt_link->uprobe_cnt; i++) { + /* detach underlying uprobe link */ + bpf_link__destroy(usdt_link->uprobes[i].link); + /* there is no need to update specs map because it will be + * unconditionally overwritten on subsequent USDT attaches, + * but if BPF cookies are not used we need to remove entry + * from ip_to_spec_id map, otherwise we'll run into false + * conflicting IP errors + */ + if (!man->has_bpf_cookie) { + /* not much we can do about errors here */ + (void)bpf_map_delete_elem(bpf_map__fd(man->ip_to_spec_id_map), + &usdt_link->uprobes[i].abs_ip); + } + } + + /* try to return the list of previously used spec IDs to usdt_manager + * for future reuse for subsequent USDT attaches + */ + if (!man->free_spec_ids) { + /* if there were no free spec IDs yet, just transfer our IDs */ + man->free_spec_ids = usdt_link->spec_ids; + man->free_spec_cnt = usdt_link->spec_cnt; + usdt_link->spec_ids = NULL; + } else { + /* otherwise concat IDs */ + size_t new_cnt = man->free_spec_cnt + usdt_link->spec_cnt; + int *new_free_ids; + + new_free_ids = libbpf_reallocarray(man->free_spec_ids, new_cnt, + sizeof(*new_free_ids)); + /* If we couldn't resize free_spec_ids, we'll just leak + * a bunch of free IDs; this is very unlikely to happen and if + * system is so exhausted on memory, it's the least of user's + * concerns, probably. + * So just do our best here to return those IDs to usdt_manager. + */ + if (new_free_ids) { + memcpy(new_free_ids + man->free_spec_cnt, usdt_link->spec_ids, + usdt_link->spec_cnt * sizeof(*usdt_link->spec_ids)); + man->free_spec_ids = new_free_ids; + man->free_spec_cnt = new_cnt; + } + } + + return 0; +} + +static void bpf_link_usdt_dealloc(struct bpf_link *link) +{ + struct bpf_link_usdt *usdt_link = container_of(link, struct bpf_link_usdt, link); + + free(usdt_link->spec_ids); + free(usdt_link->uprobes); + free(usdt_link); +} + +static size_t specs_hash_fn(long key, void *ctx) +{ + return str_hash((char *)key); +} + +static bool specs_equal_fn(long key1, long key2, void *ctx) +{ + return strcmp((char *)key1, (char *)key2) == 0; +} + +static int allocate_spec_id(struct usdt_manager *man, struct hashmap *specs_hash, + struct bpf_link_usdt *link, struct usdt_target *target, + int *spec_id, bool *is_new) +{ + long tmp; + void *new_ids; + int err; + + /* check if we already allocated spec ID for this spec string */ + if (hashmap__find(specs_hash, target->spec_str, &tmp)) { + *spec_id = tmp; + *is_new = false; + return 0; + } + + /* otherwise it's a new ID that needs to be set up in specs map and + * returned back to usdt_manager when USDT link is detached + */ + new_ids = libbpf_reallocarray(link->spec_ids, link->spec_cnt + 1, sizeof(*link->spec_ids)); + if (!new_ids) + return -ENOMEM; + link->spec_ids = new_ids; + + /* get next free spec ID, giving preference to free list, if not empty */ + if (man->free_spec_cnt) { + *spec_id = man->free_spec_ids[man->free_spec_cnt - 1]; + + /* cache spec ID for current spec string for future lookups */ + err = hashmap__add(specs_hash, target->spec_str, *spec_id); + if (err) + return err; + + man->free_spec_cnt--; + } else { + /* don't allocate spec ID bigger than what fits in specs map */ + if (man->next_free_spec_id >= bpf_map__max_entries(man->specs_map)) + return -E2BIG; + + *spec_id = man->next_free_spec_id; + + /* cache spec ID for current spec string for future lookups */ + err = hashmap__add(specs_hash, target->spec_str, *spec_id); + if (err) + return err; + + man->next_free_spec_id++; + } + + /* remember new spec ID in the link for later return back to free list on detach */ + link->spec_ids[link->spec_cnt] = *spec_id; + link->spec_cnt++; + *is_new = true; + return 0; +} + +struct bpf_link *usdt_manager_attach_usdt(struct usdt_manager *man, const struct bpf_program *prog, + pid_t pid, const char *path, + const char *usdt_provider, const char *usdt_name, + __u64 usdt_cookie) +{ + int i, fd, err, spec_map_fd, ip_map_fd; + LIBBPF_OPTS(bpf_uprobe_opts, opts); + struct hashmap *specs_hash = NULL; + struct bpf_link_usdt *link = NULL; + struct usdt_target *targets = NULL; + size_t target_cnt; + Elf *elf; + + spec_map_fd = bpf_map__fd(man->specs_map); + ip_map_fd = bpf_map__fd(man->ip_to_spec_id_map); + + /* TODO: perform path resolution similar to uprobe's */ + fd = open(path, O_RDONLY); + if (fd < 0) { + err = -errno; + pr_warn("usdt: failed to open ELF binary '%s': %d\n", path, err); + return libbpf_err_ptr(err); + } + + elf = elf_begin(fd, ELF_C_READ_MMAP, NULL); + if (!elf) { + err = -EBADF; + pr_warn("usdt: failed to parse ELF binary '%s': %s\n", path, elf_errmsg(-1)); + goto err_out; + } + + err = sanity_check_usdt_elf(elf, path); + if (err) + goto err_out; + + /* normalize PID filter */ + if (pid < 0) + pid = -1; + else if (pid == 0) + pid = getpid(); + + /* discover USDT in given binary, optionally limiting + * activations to a given PID, if pid > 0 + */ + err = collect_usdt_targets(man, elf, path, pid, usdt_provider, usdt_name, + usdt_cookie, &targets, &target_cnt); + if (err <= 0) { + err = (err == 0) ? -ENOENT : err; + goto err_out; + } + + specs_hash = hashmap__new(specs_hash_fn, specs_equal_fn, NULL); + if (IS_ERR(specs_hash)) { + err = PTR_ERR(specs_hash); + goto err_out; + } + + link = calloc(1, sizeof(*link)); + if (!link) { + err = -ENOMEM; + goto err_out; + } + + link->usdt_man = man; + link->link.detach = &bpf_link_usdt_detach; + link->link.dealloc = &bpf_link_usdt_dealloc; + + link->uprobes = calloc(target_cnt, sizeof(*link->uprobes)); + if (!link->uprobes) { + err = -ENOMEM; + goto err_out; + } + + for (i = 0; i < target_cnt; i++) { + struct usdt_target *target = &targets[i]; + struct bpf_link *uprobe_link; + bool is_new; + int spec_id; + + /* Spec ID can be either reused or newly allocated. If it is + * newly allocated, we'll need to fill out spec map, otherwise + * entire spec should be valid and can be just used by a new + * uprobe. We reuse spec when USDT arg spec is identical. We + * also never share specs between two different USDT + * attachments ("links"), so all the reused specs already + * share USDT cookie value implicitly. + */ + err = allocate_spec_id(man, specs_hash, link, target, &spec_id, &is_new); + if (err) + goto err_out; + + if (is_new && bpf_map_update_elem(spec_map_fd, &spec_id, &target->spec, BPF_ANY)) { + err = -errno; + pr_warn("usdt: failed to set USDT spec #%d for '%s:%s' in '%s': %d\n", + spec_id, usdt_provider, usdt_name, path, err); + goto err_out; + } + if (!man->has_bpf_cookie && + bpf_map_update_elem(ip_map_fd, &target->abs_ip, &spec_id, BPF_NOEXIST)) { + err = -errno; + if (err == -EEXIST) { + pr_warn("usdt: IP collision detected for spec #%d for '%s:%s' in '%s'\n", + spec_id, usdt_provider, usdt_name, path); + } else { + pr_warn("usdt: failed to map IP 0x%lx to spec #%d for '%s:%s' in '%s': %d\n", + target->abs_ip, spec_id, usdt_provider, usdt_name, + path, err); + } + goto err_out; + } + + opts.ref_ctr_offset = target->sema_off; + opts.bpf_cookie = man->has_bpf_cookie ? spec_id : 0; + uprobe_link = bpf_program__attach_uprobe_opts(prog, pid, path, + target->rel_ip, &opts); + err = libbpf_get_error(uprobe_link); + if (err) { + pr_warn("usdt: failed to attach uprobe #%d for '%s:%s' in '%s': %d\n", + i, usdt_provider, usdt_name, path, err); + goto err_out; + } + + link->uprobes[i].link = uprobe_link; + link->uprobes[i].abs_ip = target->abs_ip; + link->uprobe_cnt++; + } + + free(targets); + hashmap__free(specs_hash); + elf_end(elf); + close(fd); + + return &link->link; + +err_out: + if (link) + bpf_link__destroy(&link->link); + free(targets); + hashmap__free(specs_hash); + if (elf) + elf_end(elf); + close(fd); + return libbpf_err_ptr(err); +} + +/* Parse out USDT ELF note from '.note.stapsdt' section. + * Logic inspired by perf's code. + */ +static int parse_usdt_note(Elf *elf, const char *path, GElf_Nhdr *nhdr, + const char *data, size_t name_off, size_t desc_off, + struct usdt_note *note) +{ + const char *provider, *name, *args; + long addrs[3]; + size_t len; + + /* sanity check USDT note name and type first */ + if (strncmp(data + name_off, USDT_NOTE_NAME, nhdr->n_namesz) != 0) + return -EINVAL; + if (nhdr->n_type != USDT_NOTE_TYPE) + return -EINVAL; + + /* sanity check USDT note contents ("description" in ELF terminology) */ + len = nhdr->n_descsz; + data = data + desc_off; + + /* +3 is the very minimum required to store three empty strings */ + if (len < sizeof(addrs) + 3) + return -EINVAL; + + /* get location, base, and semaphore addrs */ + memcpy(&addrs, data, sizeof(addrs)); + + /* parse string fields: provider, name, args */ + provider = data + sizeof(addrs); + + name = (const char *)memchr(provider, '\0', data + len - provider); + if (!name) /* non-zero-terminated provider */ + return -EINVAL; + name++; + if (name >= data + len || *name == '\0') /* missing or empty name */ + return -EINVAL; + + args = memchr(name, '\0', data + len - name); + if (!args) /* non-zero-terminated name */ + return -EINVAL; + ++args; + if (args >= data + len) /* missing arguments spec */ + return -EINVAL; + + note->provider = provider; + note->name = name; + if (*args == '\0' || *args == ':') + note->args = ""; + else + note->args = args; + note->loc_addr = addrs[0]; + note->base_addr = addrs[1]; + note->sema_addr = addrs[2]; + + return 0; +} + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg); + +static int parse_usdt_spec(struct usdt_spec *spec, const struct usdt_note *note, __u64 usdt_cookie) +{ + const char *s; + int len; + + spec->usdt_cookie = usdt_cookie; + spec->arg_cnt = 0; + + s = note->args; + while (s[0]) { + if (spec->arg_cnt >= USDT_MAX_ARG_CNT) { + pr_warn("usdt: too many USDT arguments (> %d) for '%s:%s' with args spec '%s'\n", + USDT_MAX_ARG_CNT, note->provider, note->name, note->args); + return -E2BIG; + } + + len = parse_usdt_arg(s, spec->arg_cnt, &spec->args[spec->arg_cnt]); + if (len < 0) + return len; + + s += len; + spec->arg_cnt++; + } + + return 0; +} + +/* Architecture-specific logic for parsing USDT argument location specs */ + +#if defined(__x86_64__) || defined(__i386__) + +static int calc_pt_regs_off(const char *reg_name) +{ + static struct { + const char *names[4]; + size_t pt_regs_off; + } reg_map[] = { +#ifdef __x86_64__ +#define reg_off(reg64, reg32) offsetof(struct pt_regs, reg64) +#else +#define reg_off(reg64, reg32) offsetof(struct pt_regs, reg32) +#endif + { {"rip", "eip", "", ""}, reg_off(rip, eip) }, + { {"rax", "eax", "ax", "al"}, reg_off(rax, eax) }, + { {"rbx", "ebx", "bx", "bl"}, reg_off(rbx, ebx) }, + { {"rcx", "ecx", "cx", "cl"}, reg_off(rcx, ecx) }, + { {"rdx", "edx", "dx", "dl"}, reg_off(rdx, edx) }, + { {"rsi", "esi", "si", "sil"}, reg_off(rsi, esi) }, + { {"rdi", "edi", "di", "dil"}, reg_off(rdi, edi) }, + { {"rbp", "ebp", "bp", "bpl"}, reg_off(rbp, ebp) }, + { {"rsp", "esp", "sp", "spl"}, reg_off(rsp, esp) }, +#undef reg_off +#ifdef __x86_64__ + { {"r8", "r8d", "r8w", "r8b"}, offsetof(struct pt_regs, r8) }, + { {"r9", "r9d", "r9w", "r9b"}, offsetof(struct pt_regs, r9) }, + { {"r10", "r10d", "r10w", "r10b"}, offsetof(struct pt_regs, r10) }, + { {"r11", "r11d", "r11w", "r11b"}, offsetof(struct pt_regs, r11) }, + { {"r12", "r12d", "r12w", "r12b"}, offsetof(struct pt_regs, r12) }, + { {"r13", "r13d", "r13w", "r13b"}, offsetof(struct pt_regs, r13) }, + { {"r14", "r14d", "r14w", "r14b"}, offsetof(struct pt_regs, r14) }, + { {"r15", "r15d", "r15w", "r15b"}, offsetof(struct pt_regs, r15) }, +#endif + }; + int i, j; + + for (i = 0; i < ARRAY_SIZE(reg_map); i++) { + for (j = 0; j < ARRAY_SIZE(reg_map[i].names); j++) { + if (strcmp(reg_name, reg_map[i].names[j]) == 0) + return reg_map[i].pt_regs_off; + } + } + + pr_warn("usdt: unrecognized register '%s'\n", reg_name); + return -ENOENT; +} + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg) +{ + char reg_name[16]; + int arg_sz, len, reg_off; + long off; + + if (sscanf(arg_str, " %d @ %ld ( %%%15[^)] ) %n", &arg_sz, &off, reg_name, &len) == 3) { + /* Memory dereference case, e.g., -4@-20(%rbp) */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = off; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ ( %%%15[^)] ) %n", &arg_sz, reg_name, &len) == 2) { + /* Memory dereference case without offset, e.g., 8@(%rsp) */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ %%%15s %n", &arg_sz, reg_name, &len) == 2) { + /* Register read case, e.g., -4@%eax */ + arg->arg_type = USDT_ARG_REG; + arg->val_off = 0; + + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ $%ld %n", &arg_sz, &off, &len) == 2) { + /* Constant value case, e.g., 4@$71 */ + arg->arg_type = USDT_ARG_CONST; + arg->val_off = off; + arg->reg_off = 0; + } else { + pr_warn("usdt: unrecognized arg #%d spec '%s'\n", arg_num, arg_str); + return -EINVAL; + } + + arg->arg_signed = arg_sz < 0; + if (arg_sz < 0) + arg_sz = -arg_sz; + + switch (arg_sz) { + case 1: case 2: case 4: case 8: + arg->arg_bitshift = 64 - arg_sz * 8; + break; + default: + pr_warn("usdt: unsupported arg #%d (spec '%s') size: %d\n", + arg_num, arg_str, arg_sz); + return -EINVAL; + } + + return len; +} + +#elif defined(__s390x__) + +/* Do not support __s390__ for now, since user_pt_regs is broken with -m31. */ + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg) +{ + unsigned int reg; + int arg_sz, len; + long off; + + if (sscanf(arg_str, " %d @ %ld ( %%r%u ) %n", &arg_sz, &off, ®, &len) == 3) { + /* Memory dereference case, e.g., -2@-28(%r15) */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = off; + if (reg > 15) { + pr_warn("usdt: unrecognized register '%%r%u'\n", reg); + return -EINVAL; + } + arg->reg_off = offsetof(user_pt_regs, gprs[reg]); + } else if (sscanf(arg_str, " %d @ %%r%u %n", &arg_sz, ®, &len) == 2) { + /* Register read case, e.g., -8@%r0 */ + arg->arg_type = USDT_ARG_REG; + arg->val_off = 0; + if (reg > 15) { + pr_warn("usdt: unrecognized register '%%r%u'\n", reg); + return -EINVAL; + } + arg->reg_off = offsetof(user_pt_regs, gprs[reg]); + } else if (sscanf(arg_str, " %d @ %ld %n", &arg_sz, &off, &len) == 2) { + /* Constant value case, e.g., 4@71 */ + arg->arg_type = USDT_ARG_CONST; + arg->val_off = off; + arg->reg_off = 0; + } else { + pr_warn("usdt: unrecognized arg #%d spec '%s'\n", arg_num, arg_str); + return -EINVAL; + } + + arg->arg_signed = arg_sz < 0; + if (arg_sz < 0) + arg_sz = -arg_sz; + + switch (arg_sz) { + case 1: case 2: case 4: case 8: + arg->arg_bitshift = 64 - arg_sz * 8; + break; + default: + pr_warn("usdt: unsupported arg #%d (spec '%s') size: %d\n", + arg_num, arg_str, arg_sz); + return -EINVAL; + } + + return len; +} + +#elif defined(__aarch64__) + +static int calc_pt_regs_off(const char *reg_name) +{ + int reg_num; + + if (sscanf(reg_name, "x%d", ®_num) == 1) { + if (reg_num >= 0 && reg_num < 31) + return offsetof(struct user_pt_regs, regs[reg_num]); + } else if (strcmp(reg_name, "sp") == 0) { + return offsetof(struct user_pt_regs, sp); + } + pr_warn("usdt: unrecognized register '%s'\n", reg_name); + return -ENOENT; +} + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg) +{ + char reg_name[16]; + int arg_sz, len, reg_off; + long off; + + if (sscanf(arg_str, " %d @ \[ %15[a-z0-9], %ld ] %n", &arg_sz, reg_name, &off, &len) == 3) { + /* Memory dereference case, e.g., -4@[sp, 96] */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = off; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ \[ %15[a-z0-9] ] %n", &arg_sz, reg_name, &len) == 2) { + /* Memory dereference case, e.g., -4@[sp] */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ %ld %n", &arg_sz, &off, &len) == 2) { + /* Constant value case, e.g., 4@5 */ + arg->arg_type = USDT_ARG_CONST; + arg->val_off = off; + arg->reg_off = 0; + } else if (sscanf(arg_str, " %d @ %15[a-z0-9] %n", &arg_sz, reg_name, &len) == 2) { + /* Register read case, e.g., -8@x4 */ + arg->arg_type = USDT_ARG_REG; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else { + pr_warn("usdt: unrecognized arg #%d spec '%s'\n", arg_num, arg_str); + return -EINVAL; + } + + arg->arg_signed = arg_sz < 0; + if (arg_sz < 0) + arg_sz = -arg_sz; + + switch (arg_sz) { + case 1: case 2: case 4: case 8: + arg->arg_bitshift = 64 - arg_sz * 8; + break; + default: + pr_warn("usdt: unsupported arg #%d (spec '%s') size: %d\n", + arg_num, arg_str, arg_sz); + return -EINVAL; + } + + return len; +} + +#elif defined(__riscv) + +static int calc_pt_regs_off(const char *reg_name) +{ + static struct { + const char *name; + size_t pt_regs_off; + } reg_map[] = { + { "ra", offsetof(struct user_regs_struct, ra) }, + { "sp", offsetof(struct user_regs_struct, sp) }, + { "gp", offsetof(struct user_regs_struct, gp) }, + { "tp", offsetof(struct user_regs_struct, tp) }, + { "a0", offsetof(struct user_regs_struct, a0) }, + { "a1", offsetof(struct user_regs_struct, a1) }, + { "a2", offsetof(struct user_regs_struct, a2) }, + { "a3", offsetof(struct user_regs_struct, a3) }, + { "a4", offsetof(struct user_regs_struct, a4) }, + { "a5", offsetof(struct user_regs_struct, a5) }, + { "a6", offsetof(struct user_regs_struct, a6) }, + { "a7", offsetof(struct user_regs_struct, a7) }, + { "s0", offsetof(struct user_regs_struct, s0) }, + { "s1", offsetof(struct user_regs_struct, s1) }, + { "s2", offsetof(struct user_regs_struct, s2) }, + { "s3", offsetof(struct user_regs_struct, s3) }, + { "s4", offsetof(struct user_regs_struct, s4) }, + { "s5", offsetof(struct user_regs_struct, s5) }, + { "s6", offsetof(struct user_regs_struct, s6) }, + { "s7", offsetof(struct user_regs_struct, s7) }, + { "s8", offsetof(struct user_regs_struct, rv_s8) }, + { "s9", offsetof(struct user_regs_struct, s9) }, + { "s10", offsetof(struct user_regs_struct, s10) }, + { "s11", offsetof(struct user_regs_struct, s11) }, + { "t0", offsetof(struct user_regs_struct, t0) }, + { "t1", offsetof(struct user_regs_struct, t1) }, + { "t2", offsetof(struct user_regs_struct, t2) }, + { "t3", offsetof(struct user_regs_struct, t3) }, + { "t4", offsetof(struct user_regs_struct, t4) }, + { "t5", offsetof(struct user_regs_struct, t5) }, + { "t6", offsetof(struct user_regs_struct, t6) }, + }; + int i; + + for (i = 0; i < ARRAY_SIZE(reg_map); i++) { + if (strcmp(reg_name, reg_map[i].name) == 0) + return reg_map[i].pt_regs_off; + } + + pr_warn("usdt: unrecognized register '%s'\n", reg_name); + return -ENOENT; +} + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg) +{ + char reg_name[16]; + int arg_sz, len, reg_off; + long off; + + if (sscanf(arg_str, " %d @ %ld ( %15[a-z0-9] ) %n", &arg_sz, &off, reg_name, &len) == 3) { + /* Memory dereference case, e.g., -8@-88(s0) */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = off; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ %ld %n", &arg_sz, &off, &len) == 2) { + /* Constant value case, e.g., 4@5 */ + arg->arg_type = USDT_ARG_CONST; + arg->val_off = off; + arg->reg_off = 0; + } else if (sscanf(arg_str, " %d @ %15[a-z0-9] %n", &arg_sz, reg_name, &len) == 2) { + /* Register read case, e.g., -8@a1 */ + arg->arg_type = USDT_ARG_REG; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else { + pr_warn("usdt: unrecognized arg #%d spec '%s'\n", arg_num, arg_str); + return -EINVAL; + } + + arg->arg_signed = arg_sz < 0; + if (arg_sz < 0) + arg_sz = -arg_sz; + + switch (arg_sz) { + case 1: case 2: case 4: case 8: + arg->arg_bitshift = 64 - arg_sz * 8; + break; + default: + pr_warn("usdt: unsupported arg #%d (spec '%s') size: %d\n", + arg_num, arg_str, arg_sz); + return -EINVAL; + } + + return len; +} + +#else + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg) +{ + pr_warn("usdt: libbpf doesn't support USDTs on current architecture\n"); + return -ENOTSUP; +} + +#endif diff --git a/bpftool/scripts/README.md b/bpftool/scripts/README.md new file mode 100644 index 0000000..41793f0 --- /dev/null +++ b/bpftool/scripts/README.md @@ -0,0 +1,147 @@ +# Scripts + +This directory contains scripts for maintaining bpftool's GitHub mirror. + +## sync-kernel.sh + +### Synchronize Linux and bpftool mirror + +This script synchronizes the bpftool mirror with the bpftool sources (and +related files) from the Linux kernel repository. + +Synchronization is usually performed against the `bpf-next` and `bpf` trees, +because this is where most bpftool updates are merged. + +By default, the script does not pick the very latest commits in these trees, +but instead it uses the commits referenced in the libbpf submodule. This is +because bpftool strongly relies on libbpf, and the libbpf GitHub mirror is used +here as a submodule dependency. This libbpf mirror is also periodically updated +to the latest `bpf-next` and `bpf` tree, and records to what kernel commits it +was brought up-to-date. To ensure optimal compatibility between the bpftool +sources and the libbpf dependency, we want to update them to the same point of +reference. + +### Prerequisites + +There is no particular tool required for running the script, except `git` of +course. + +However, you need a local copy of the Linux Git repository on your system +in order to successfully run the script. You can set it up as follows: + +```console +$ git clone 'https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git' linux +$ cd linux +$ git remote rename origin bpf-next +$ git branch --move master bpf-next +$ git remote add bpf 'https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git' +$ git fetch bpf +$ git checkout bpf/master +$ git switch --create bpf +$ git branch --set-upstream-to bpf/master +$ git switch bpf-next +``` + +At the end of the process, the repository should contain two branches +`bpf-next` and `bpf`, pointing to the `master` branches of the `bpf-next` and +`bpf` remote repositories, respectively. These two branches are required to +synchronize the mirror correctly. + +You can later update this repository with the following commands: + +```console +$ git switch bpf +$ git pull --set-upstream bpf master +$ git switch bpf-next +$ git pull --set-upstream bpf-next master +``` + +Also make sure you have cloned the bpftool mirror recursively, to check out the +libbpf submodule. If you have not, run the following: + +```console +$ git submodule update --init +``` + +### Usage + +As preliminary steps: + +- Make sure that you have a Linux Git repository installed (see above), with + two branches `bpf-next` and `bpf` up-to-date. +- Make sure your mirror repository is clean. + +Then run the script: + +```console +$ ./sync-kernel.sh +``` + +If working from within the bpftool repository, the path to the `` +is typically the current working directory (`.`). The second argument, +``, is the path to the Linux Git repository mentioned earlier. + +Several environment variables can modify some internal parameters of the +script: + +- Set `BPF_NEXT_BASELINE `to override the `bpf-next` tree commit to use (the + commit from the `bpf-next` branch with which the bpftool repository is + currently synchronized, prior to running the script). If unset, use the hash + from `/CHECKPOINT-COMMIT` is used. +- Set `BPF_BASELINE `to override the `bpf` tree commit to use (the commit from + the `bpf` branch with which the bpftool repository is currently synchronized, + prior to running the script). If unset, use the hash from + `/BPF-CHECKPOINT-COMMIT` is used. +- Set `BPF_NEXT_TIP_COMMIT` to override the `bpf-next` tree target commit (the + commit in `bpf-next` up to which the bpftool mirror should be synchronized). + If unset, use the hash from `/libbpf/CHECKPOINT-COMMIT`, after + the libbpf repository update that takes place at the beginning of the update + process. +- Set `BPF_TIP_COMMIT` to override the `bpf` tree target commit (the commit in + `bpf` up to which the bpftool mirror should be synchronized). If unset, use + the hash from `/libbpf/BPF-CHECKPOINT-COMMIT`, after the libbpf + repository update that takes place at the beginning of the update process. +- Set `SKIP_LIBBPF_UPDATE` to `1` to avoid updating libbpf automatically. +- Set `MANUAL_MODE` to `1` to manually control every cherry-picked commit. + +### How it works + +This script synchronizes the bpftool mirror with upstream bpftool sources from +the Linux kernel repository. + +It performs the following steps: + +- First, the script updates the libbpf submodule, commits the change, and (by + default) picks up libbpf's latest checkpoints to use them as target commits + for the bpftool mirror. + +- In the Linux repository, from the `bpf-next` branch, it creates new branches, + filters out all non-bpftool-related files, and reworks the layout to + replicate the layout from the bpftool mirror. + +- It generates patches for each commit touching `bpftool` or the required UAPI + files, up to the target commit, and exports these patches to a temporary + repository. + +- In a new branch in the bpftool mirror, the script applies (`git am`) each of + these patches to the mirror. + +- Then the script checks out the `bpf` branch in the Linux repository, and + repeats the same operations. + +- On top of the new patches applied to the mirror, the script creates a last + commit with the updated checkpoints, using a cover letter summarizing the + changes as the commit description. + +- The next step is verification. The script applies to the Linux repository + (`bpf-next` branch) a patch containing known differences between the Linux + repository and the bpftool mirror. Then it looks for remaining differences + between the two repositories, and warn the user if it finds any. Patches + picked up from the `bpf` tree are usually a source of differences at this + step. If the patch containing the known differneces is to be updated after + the synchronization in progress, the user should do it at this time, before + the temporary files from the script are deleted. + +- At last, the script cleans up the temporary files and branches in the Linux + repository. Note that these temporary files and branches are not cleaned up + if the script fails during execution. diff --git a/bpftool/scripts/sync-kernel-expected-diff.patch b/bpftool/scripts/sync-kernel-expected-diff.patch new file mode 100644 index 0000000..769801a --- /dev/null +++ b/bpftool/scripts/sync-kernel-expected-diff.patch @@ -0,0 +1,152 @@ +--- docs/Makefile ++++ docs/Makefile +@@ -1,5 +1,5 @@ + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +-include ../../../scripts/Makefile.include ++include ../src/Makefile.include + + INSTALL ?= install + RM ?= rm -f +--- src/.gitignore ++++ src/.gitignore +@@ -1,8 +1,8 @@ + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++*.o + *.d + /bootstrap/ + /bpftool +-bpftool*.8 + FEATURE-DUMP.bpftool + feature + libbpf +--- src/Makefile ++++ src/Makefile +@@ -1,10 +1,8 @@ + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +-include ../../scripts/Makefile.include ++include Makefile.include + + ifeq ($(srctree),) + srctree := $(patsubst %/,%,$(dir $(CURDIR))) +-srctree := $(patsubst %/,%,$(dir $(srctree))) +-srctree := $(patsubst %/,%,$(dir $(srctree))) + endif + + ifeq ($(V),1) +@@ -13,7 +11,7 @@ + Q = @ + endif + +-BPF_DIR = $(srctree)/tools/lib/bpf ++BPF_DIR = $(srctree)/libbpf/src + + ifneq ($(OUTPUT),) + _OUTPUT := $(OUTPUT) +@@ -43,16 +41,16 @@ + $(QUIET_MKDIR)mkdir -p $@ + + $(LIBBPF): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_OUTPUT) +- $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) \ +- DESTDIR=$(LIBBPF_DESTDIR:/=) prefix= $(LIBBPF) install_headers ++ $(Q)$(MAKE) -C $(BPF_DIR) OBJDIR=$(patsubst %/,%,$(LIBBPF_OUTPUT)) \ ++ PREFIX=$(LIBBPF_DESTDIR:/=) $(LIBBPF) install_headers + + $(LIBBPF_INTERNAL_HDRS): $(LIBBPF_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_HDRS_DIR) + $(call QUIET_INSTALL, $@) + $(Q)install -m 644 -t $(LIBBPF_HDRS_DIR) $< + + $(LIBBPF_BOOTSTRAP): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_BOOTSTRAP_OUTPUT) +- $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) \ +- DESTDIR=$(LIBBPF_BOOTSTRAP_DESTDIR:/=) prefix= \ ++ $(Q)$(MAKE) -C $(BPF_DIR) OBJDIR=$(patsubst %/,%,$(LIBBPF_BOOTSTRAP_OUTPUT)) \ ++ PREFIX=$(LIBBPF_BOOTSTRAP_DESTDIR:/=) \ + ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)" $@ install_headers + + $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS): $(LIBBPF_BOOTSTRAP_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_BOOTSTRAP_HDRS_DIR) +@@ -76,9 +74,9 @@ + CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \ + -I$(or $(OUTPUT),.) \ + -I$(LIBBPF_INCLUDE) \ +- -I$(srctree)/kernel/bpf/ \ +- -I$(srctree)/tools/include \ +- -I$(srctree)/tools/include/uapi ++ -I$(srctree)/src/kernel/bpf/ \ ++ -I$(srctree)/include \ ++ -I$(srctree)/include/uapi + ifneq ($(BPFTOOL_VERSION),) + CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' + endif +@@ -119,11 +117,7 @@ + endif + + ifeq ($(check_feat),1) +-ifeq ($(FEATURES_DUMP),) +-include $(srctree)/tools/build/Makefile.feature +-else +-include $(FEATURES_DUMP) +-endif ++include Makefile.feature + endif + + LIBS = $(LIBBPF) -lelf -lz +@@ -213,7 +207,7 @@ + $(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF_BOOTSTRAP) + $(QUIET_CLANG)$(CLANG) \ + -I$(or $(OUTPUT),.) \ +- -I$(srctree)/tools/include/uapi/ \ ++ -I$(srctree)/include/uapi/ \ + -I$(LIBBPF_BOOTSTRAP_INCLUDE) \ + -g -O2 -Wall -fno-stack-protector \ + -target bpf -c $< -o $@ +@@ -231,10 +225,10 @@ + + CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS) + +-$(BOOTSTRAP_OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c ++$(BOOTSTRAP_OUTPUT)disasm.o: $(srctree)/src/kernel/bpf/disasm.c + $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@ + +-$(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c ++$(OUTPUT)disasm.o: $(srctree)/src/kernel/bpf/disasm.c + $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@ + + $(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF_BOOTSTRAP) +@@ -253,7 +247,7 @@ + $(call QUIET_CLEAN, feature-detect) + $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null + +-clean: $(LIBBPF)-clean $(LIBBPF_BOOTSTRAP)-clean feature-detect-clean ++clean: $(LIBBPF)-clean $(LIBBPF_BOOTSTRAP)-clean + $(call QUIET_CLEAN, bpftool) + $(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d + $(Q)$(RM) -- $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h +@@ -269,7 +263,7 @@ + + install: install-bin + $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bash_compdir) +- $(Q)$(INSTALL) -m 0644 bash-completion/bpftool $(DESTDIR)$(bash_compdir) ++ $(Q)$(INSTALL) -m 0644 $(srctree)/bash-completion/bpftool $(DESTDIR)$(bash_compdir) + + uninstall: + $(call QUIET_UNINST, bpftool) +@@ -277,16 +271,16 @@ + $(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool + + doc: +- $(call descend,Documentation) ++ $(call descend,$(srctree)/docs) + + doc-clean: +- $(call descend,Documentation,clean) ++ $(call descend,$(srctree)/docs,clean) + + doc-install: +- $(call descend,Documentation,install) ++ $(call descend,$(srctree)/docs,install) + + doc-uninstall: +- $(call descend,Documentation,uninstall) ++ $(call descend,$(srctree)/docs,uninstall) + + FORCE: + diff --git a/bpftool/scripts/sync-kernel.sh b/bpftool/scripts/sync-kernel.sh new file mode 100755 index 0000000..086b60b --- /dev/null +++ b/bpftool/scripts/sync-kernel.sh @@ -0,0 +1,423 @@ +#!/usr/bin/env bash + +usage () { + echo "USAGE: ./sync-kernel.sh " + echo "" + echo "This script synchronizes the mirror with upstream bpftool sources from the kernel repository." + echo "It performs the following steps:" + echo " - Update the libbpf submodule, commit, and use its new checkpoints as target commits for bpftool." + echo " - Cherry-pick commits from the bpf-next branch, up to the bpf-next target commit." + echo " - Cherry-pick commits from the bpf branch, up to the bpf target commit." + echo " - Create a new commit with the updated version and checkpoints." + echo " - Check consistency." + echo "" + echo "Set BPF_NEXT_BASELINE to override bpf-next tree commit, otherwise read from /CHECKPOINT-COMMIT." + echo "Set BPF_BASELINE to override bpf tree commit, otherwise read from /BPF-CHECKPOINT-COMMIT." + echo "Set BPF_NEXT_TIP_COMMIT to override bpf-next tree target commit, otherwise read from /libbpf/CHECKPOINT-COMMIT, after libbpf update." + echo "Set BPF_TIP_COMMIT to override bpf tree target commit, otherwise read from /libbpf/BPF-CHECKPOINT-COMMIT, after libbpf update." + echo "Set SKIP_LIBBPF_UPDATE to 1 to avoid updating libbpf automatically." + echo "Set MANUAL_MODE to 1 to manually control every cherry-picked commit." + exit 1 +} + +set -eu + +BPFTOOL_REPO=${1-""} +LINUX_REPO=${2-""} + +if [ -z "${BPFTOOL_REPO}" ] || [ -z "${LINUX_REPO}" ]; then + echo "Error: bpftool or linux repos are not specified" + usage +fi + +BASELINE_COMMIT=${BPF_NEXT_BASELINE:-$(cat "${BPFTOOL_REPO}"/CHECKPOINT-COMMIT)} +BPF_BASELINE_COMMIT=${BPF_BASELINE:-$(cat "${BPFTOOL_REPO}"/BPF-CHECKPOINT-COMMIT)} + +if [ -z "${BASELINE_COMMIT}" ] || [ -z "${BPF_BASELINE_COMMIT}" ]; then + echo "Error: bpf or bpf-next baseline commits are not provided" + usage +fi + +SUFFIX=$(date --utc +%Y-%m-%dT%H-%M-%S.%3NZ) +WORKDIR=$(pwd) +TMP_DIR=$(mktemp -d) + +# shellcheck disable=SC2064 +trap "cd ${WORKDIR}; exit" INT TERM EXIT + +BPFTOOL_SRC_DIR="tools/bpf/bpftool" + +declare -A PATH_MAP +PATH_MAP=( \ + [${BPFTOOL_SRC_DIR}]=src \ + [${BPFTOOL_SRC_DIR}/bash-completion]=bash-completion \ + [${BPFTOOL_SRC_DIR}/Documentation]=docs \ + [kernel/bpf/disasm.c]=src/kernel/bpf/disasm.c \ + [kernel/bpf/disasm.h]=src/kernel/bpf/disasm.h \ + [tools/include/tools/dis-asm-compat.h]=include/tools/dis-asm-compat.h \ + [tools/include/uapi/asm-generic/bitsperlong.h]=include/uapi/asm-generic/bitsperlong.h \ + [tools/include/uapi/linux/bpf_common.h]=include/uapi/linux/bpf_common.h \ + [tools/include/uapi/linux/bpf.h]=include/uapi/linux/bpf.h \ + [tools/include/uapi/linux/btf.h]=include/uapi/linux/btf.h \ + [tools/include/uapi/linux/const.h]=include/uapi/linux/const.h \ + [tools/include/uapi/linux/if_link.h]=include/uapi/linux/if_link.h \ + [tools/include/uapi/linux/netlink.h]=include/uapi/linux/netlink.h \ + [tools/include/uapi/linux/perf_event.h]=include/uapi/linux/perf_event.h \ + [tools/include/uapi/linux/pkt_cls.h]=include/uapi/linux/pkt_cls.h \ + [tools/include/uapi/linux/pkt_sched.h]=include/uapi/linux/pkt_sched.h \ + [tools/include/uapi/linux/tc_act/tc_bpf.h]=include/uapi/linux/tc_act/tc_bpf.h \ +) + +BPFTOOL_PATHS=( "${!PATH_MAP[@]}" ) +BPFTOOL_VIEW_PATHS=( "${PATH_MAP[@]}" ) +BPFTOOL_VIEW_EXCLUDE_REGEX='^(docs/\.gitignore|src/Makefile\.(feature|include))$' +LINUX_VIEW_EXCLUDE_REGEX='^$' + +# Deal with tools/bpf/bpftool first, because once we've mkdir-ed src/, command +# "git mv" doesn't move bpftool _as_ src but _into_ src/. +BPFTOOL_TREE_FILTER="mkdir __bpftool && "$'\\\n' +BPFTOOL_TREE_FILTER+="git mv -kf ${BPFTOOL_SRC_DIR} __bpftool/${PATH_MAP[${BPFTOOL_SRC_DIR}]} && "$'\\\n' + +# Extract bash-completion and Documentation from src/. +BPFTOOL_TREE_FILTER+="git mv -kf __bpftool/src/bash-completion __bpftool/bash-completion && "$'\\\n' +BPFTOOL_TREE_FILTER+="git mv -kf __bpftool/src/Documentation __bpftool/docs && "$'\\\n' + +BPFTOOL_TREE_FILTER+="mkdir -p __bpftool/include/tools __bpftool/include/uapi/asm-generic __bpftool/include/uapi/linux/tc_act __bpftool/src/kernel/bpf && "$'\\\n' +for p in "${!PATH_MAP[@]}"; do + case ${p} in + ${BPFTOOL_SRC_DIR}*) + continue;; + esac + BPFTOOL_TREE_FILTER+="git mv -kf ${p} __bpftool/${PATH_MAP[${p}]} && "$'\\\n' +done +BPFTOOL_TREE_FILTER+="true >/dev/null" + +cd_to() +{ + cd "${WORKDIR}" && cd "$1" +} + +# Output brief single-line commit description +# $1 - commit ref +commit_desc() +{ + git log -n1 --pretty='%h ("%s")' "$1" +} + +# Create commit single-line signature, which consists of: +# - full commit subject +# - author date in ISO8601 format +# - full commit body with newlines replaced with vertical bars (|) +# - shortstat appended at the end +# The idea is that this single-line signature is good enough to make final +# decision about whether two commits are the same, across different repos. +# $1 - commit ref +# $2 - paths filter +commit_signature() +{ + # shellcheck disable=SC2086 + git show --pretty='("%s")|%aI|%b' --shortstat "$1" -- ${2-.} | tr '\n' '|' +} + +# Cherry-pick commits touching bpftool-related files +# $1 - baseline_tag +# $2 - tip_tag +cherry_pick_commits() +{ + local manual_mode=${MANUAL_MODE:-0} + local baseline_tag=$1 + local tip_tag=$2 + local new_commits + local signature + local should_skip + local synced_cnt + local manual_check + local bpftool_conflict_cnt + local desc + + # shellcheck disable=SC2068 + new_commits=$(git rev-list --no-merges --topo-order --reverse "${baseline_tag}".."${tip_tag}" ${BPFTOOL_PATHS[@]}) + for new_commit in ${new_commits}; do + if [[ "${baseline_tag}" == "${BPF_BASELINE_TAG}" ]]; then + if git merge-base --is-ancestor "${new_commit}" "${BASELINE_COMMIT}"; then + echo "Commit ${new_commit::12} from bpf is already in bpf-next branch, skipping." + continue + fi + fi + desc="$(commit_desc "${new_commit}")" + signature="$(commit_signature "${new_commit}" "${BPFTOOL_PATHS[*]}")" + # shellcheck disable=SC2126 + synced_cnt=$(grep -F "${signature}" "${TMP_DIR}"/bpftool_commits.txt | wc -l) + manual_check=0 + if (("${synced_cnt}" > 0)); then + # commit with the same subject is already in bpftool, but it's + # not 100% the same commit, so check with user + echo "Commit '${desc}' is synced into bpftool as:" + grep -F "${signature}" "${TMP_DIR}"/bpftool_commits.txt | \ + cut -d'|' -f1 | sed -e 's/^/- /' + if (("${manual_mode}" != 1 && "${synced_cnt}" == 1)); then + echo "Skipping '${desc}' due to unique match..." + continue + fi + if (("${synced_cnt}" > 1)); then + echo "'${desc} matches multiple commits, please, double-check!" + manual_check=1 + fi + fi + if (("${manual_mode}" == 1 || "${manual_check}" == 1)); then + read -rp "Do you want to skip '${desc}'? [y/N]: " should_skip + case "${should_skip}" in + "y" | "Y") + echo "Skipping '${desc}'..." + continue + ;; + esac + fi + # commit hasn't been synced into bpftool yet + echo "Picking '${desc}'..." + if ! git cherry-pick "${new_commit}" &>/dev/null; then + echo "Warning! Cherry-picking '${desc} failed, checking if it's non-bpftool files causing problems..." + # shellcheck disable=SC2068 + bpftool_conflict_cnt=$(git diff --name-only --diff-filter=U -- ${BPFTOOL_PATHS[@]} | wc -l) + conflict_cnt=$(git diff --name-only | wc -l) + prompt_resolution=1 + + if (("${bpftool_conflict_cnt}" == 0)); then + echo "Looks like only non-bpftool files have conflicts, ignoring..." + if (("${conflict_cnt}" == 0)); then + echo "Empty cherry-pick, skipping it..." + git cherry-pick --abort + continue + fi + + git add . + # GIT_EDITOR=true to avoid editor popping up to edit commit message + if ! GIT_EDITOR=true git cherry-pick --continue &>/dev/null; then + echo "Error! That still failed! Please resolve manually." + else + echo "Success! All cherry-pick conflicts were resolved for '${desc}'!" + prompt_resolution=0 + fi + fi + + if (("${prompt_resolution}" == 1)); then + read -rp "Error! Cherry-picking '${desc}' failed, please fix manually and press to proceed..." + fi + fi + # Append signature of just cherry-picked commit to avoid + # potentially cherry-picking the same commit twice later when + # processing bpf tree commits. At this point we don't know yet + # the final commit sha in bpftool repo, so we record Linux SHA + # instead as LINUX_. + echo "LINUX_$(git log --pretty='%h' -n1) ${signature}" >> "${TMP_DIR}"/bpftool_commits.txt + done +} + +cleanup() +{ + echo "Cleaning up..." + rm -r -- "${TMP_DIR}" + cd_to "${LINUX_REPO}" + git checkout "${TIP_SYM_REF}" + git branch -D "${BASELINE_TAG}" "${TIP_TAG}" "${BPF_BASELINE_TAG}" "${BPF_TIP_TAG}" \ + "${SQUASH_BASE_TAG}" "${SQUASH_TIP_TAG}" || true + # shellcheck disable=SC2015 + git show-ref --verify --quiet refs/heads/"${VIEW_TAG}" && \ + git branch -D "${VIEW_TAG}" || true + + cd_to . + echo "DONE." +} + +cd_to "${BPFTOOL_REPO}" +BPFTOOL_SYNC_TAG="bpftool-sync-${SUFFIX}" +git checkout -b "${BPFTOOL_SYNC_TAG}" + +# Update libbpf +if [[ "${SKIP_LIBBPF_UPDATE:-0}" -ne 1 ]]; then + cd_to "${BPFTOOL_REPO}"/libbpf + git pull origin master + LIBBPF_VERSION=$(grep -oE '^LIBBPF_([0-9.]+)' src/libbpf.map | sort -rV | head -n1 | cut -d'_' -f2) + LIBBPF_COMMIT=$(git rev-parse HEAD) + cd_to "${BPFTOOL_REPO}" + if [[ -n "$(git status --porcelain --untracked-files=no)" ]]; then + git add libbpf + git commit --signoff -m 'sync: Update libbpf submodule' \ + -m "\ +Pull latest libbpf from mirror. +Libbpf version: ${LIBBPF_VERSION} +Libbpf commit: ${LIBBPF_COMMIT}" \ + -- libbpf + fi +fi + +# Use libbpf's new checkpoints as tips +TIP_COMMIT=${BPF_NEXT_TIP_COMMIT:-$(cat "${BPFTOOL_REPO}"/libbpf/CHECKPOINT-COMMIT)} +BPF_TIP_COMMIT=${BPF_TIP_COMMIT:-$(cat "${BPFTOOL_REPO}"/libbpf/BPF-CHECKPOINT-COMMIT)} +if [ -z "${TIP_COMMIT}" ] || [ -z "${BPF_TIP_COMMIT}" ]; then + echo "Error: bpf or bpf-next tip commits are not provided" + usage +fi + +cd_to "${BPFTOOL_REPO}" +GITHUB_ABS_DIR=$(pwd) +echo "Dumping existing bpftool commit signatures..." +for h in $(git log --pretty='%h' -n500); do + echo "$h" "$(commit_signature "$h")" >> "${TMP_DIR}"/bpftool_commits.txt +done + +# Use current kernel repo HEAD as a source of patches +cd_to "${LINUX_REPO}" +LINUX_ABS_DIR=$(pwd) +TIP_SYM_REF=$(git symbolic-ref -q --short HEAD || git rev-parse HEAD) +BASELINE_TAG="bpftool-baseline-${SUFFIX}" +TIP_TAG="bpftool-tip-${SUFFIX}" +BPF_BASELINE_TAG="bpftool-bpf-baseline-${SUFFIX}" +BPF_TIP_TAG="bpftool-bpf-tip-${SUFFIX}" +VIEW_TAG="bpftool-view-${SUFFIX}" + +# Squash state of kernel repo at baseline into single commit +SQUASH_BASE_TAG="bpftool-squash-base-${SUFFIX}" +SQUASH_TIP_TAG="bpftool-squash-tip-${SUFFIX}" +SQUASH_COMMIT=$(git commit-tree "${BASELINE_COMMIT}^{tree}" -m "BASELINE SQUASH ${BASELINE_COMMIT}") + +echo "WORKDIR: ${WORKDIR}" +echo "LINUX REPO: ${LINUX_REPO}" +echo "BPFTOOL REPO: ${BPFTOOL_REPO}" +echo "TEMP DIR: ${TMP_DIR}" +echo "SUFFIX: ${SUFFIX}" +echo "BASE COMMIT: '$(commit_desc "${BASELINE_COMMIT}")'" +echo "TIP COMMIT: '$(commit_desc "${TIP_COMMIT}")'" +echo "BPF BASE COMMIT: '$(commit_desc "${BPF_BASELINE_COMMIT}")'" +echo "BPF TIP COMMIT: '$(commit_desc "${BPF_TIP_COMMIT}")'" +echo "SQUASH COMMIT: ${SQUASH_COMMIT}" +echo "BASELINE TAG: ${BASELINE_TAG}" +echo "TIP TAG: ${TIP_TAG}" +echo "BPF BASELINE TAG: ${BPF_BASELINE_TAG}" +echo "BPF TIP TAG: ${BPF_TIP_TAG}" +echo "SQUASH BASE TAG: ${SQUASH_BASE_TAG}" +echo "SQUASH TIP TAG: ${SQUASH_TIP_TAG}" +echo "VIEW TAG: ${VIEW_TAG}" +echo "BPFTOOL SYNC TAG: ${BPFTOOL_SYNC_TAG}" +echo "PATCHES: ${TMP_DIR}/patches" + +git branch "${BASELINE_TAG}" "${BASELINE_COMMIT}" +git branch "${TIP_TAG}" "${TIP_COMMIT}" +git branch "${BPF_BASELINE_TAG}" "${BPF_BASELINE_COMMIT}" +git branch "${BPF_TIP_TAG}" "${BPF_TIP_COMMIT}" +git branch "${SQUASH_BASE_TAG}" "${SQUASH_COMMIT}" +git checkout -b "${SQUASH_TIP_TAG}" "${SQUASH_COMMIT}" + +# Cherry-pick new commits onto squashed baseline commit +echo "Cherry-pick for bpf-next..." +cherry_pick_commits "${BASELINE_TAG}" "${TIP_TAG}" +echo "Cherry-pick for bpf..." +cherry_pick_commits "${BPF_BASELINE_TAG}" "${BPF_TIP_TAG}" + +# Move all bpftool files into __bpftool directory. +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch --prune-empty -f --tree-filter "${BPFTOOL_TREE_FILTER}" "${SQUASH_TIP_TAG}" "${SQUASH_BASE_TAG}" +# Make __bpftool a new root directory +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch --prune-empty -f --subdirectory-filter __bpftool "${SQUASH_TIP_TAG}" "${SQUASH_BASE_TAG}" + +# If there are no new commits with bpftool-related changes, bail out +COMMIT_CNT=$(git rev-list --count "${SQUASH_BASE_TAG}".."${SQUASH_TIP_TAG}") +if (("${COMMIT_CNT}" <= 0)); then + echo "No new changes to apply, we are done!" + cleanup + exit 2 +fi + +# Exclude baseline commit and generate nice cover letter with summary +git format-patch --no-signature "${SQUASH_BASE_TAG}".."${SQUASH_TIP_TAG}" --cover-letter -o "${TMP_DIR}"/patches + +# Now is time to re-apply bpftool-related linux patches to bpftool repo +cd_to "${BPFTOOL_REPO}" + +# shellcheck disable=SC2012 +for patch in $(ls -1 "${TMP_DIR}"/patches | tail -n +2); do + if ! git am --3way --committer-date-is-author-date "${TMP_DIR}/patches/${patch}"; then + read -rp "Applying ${TMP_DIR}/patches/${patch} failed, please resolve manually and press to proceed..." + fi +done + +# Use generated cover-letter as a template for "sync commit" with +# baseline and checkpoint commits from kernel repo (and leave summary +# from cover letter intact, of course) +echo "${TIP_COMMIT}" > CHECKPOINT-COMMIT && \ +echo "${BPF_TIP_COMMIT}" > BPF-CHECKPOINT-COMMIT && \ +git add CHECKPOINT-COMMIT && \ +git add BPF-CHECKPOINT-COMMIT && \ +awk '/\*\*\* BLURB HERE \*\*\*/ {p=1} p' "${TMP_DIR}"/patches/0000-cover-letter.patch | \ +sed "s/\*\*\* BLURB HERE \*\*\*/\ +sync: Pull latest bpftool changes from kernel\n\ +\n\ +Syncing latest bpftool commits from kernel repository.\n\ +Baseline bpf-next commit: ${BASELINE_COMMIT}\n\ +Checkpoint bpf-next commit: ${TIP_COMMIT}\n\ +Baseline bpf commit: ${BPF_BASELINE_COMMIT}\n\ +Checkpoint bpf commit: ${BPF_TIP_COMMIT}/" | \ +git commit --signoff --file=- + +echo "SUCCESS! ${COMMIT_CNT} commits synced." + +echo "Verifying Linux's and Github's bpftool state" + +cd_to "${LINUX_REPO}" +git checkout -b "${VIEW_TAG}" "${TIP_COMMIT}" +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --tree-filter "${BPFTOOL_TREE_FILTER}" "${VIEW_TAG}"^.."${VIEW_TAG}" +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --subdirectory-filter __bpftool "${VIEW_TAG}"^.."${VIEW_TAG}" +# shellcheck disable=SC2068 +git ls-files -- ${BPFTOOL_VIEW_PATHS[@]} | grep -v -E "${LINUX_VIEW_EXCLUDE_REGEX}" > "${TMP_DIR}"/linux-view.ls +# Before we compare each file, try to apply to the mirror a patch containing the +# expected differences between the two repositories; this is to avoid checking +# "known" differences visually and taking the risk of missing a new, relevant +# differences. +echo "Patching to account for expected differences..." +patch -d "${LINUX_ABS_DIR}" -p0 -f --reject-file=- --no-backup-if-mismatch < "${GITHUB_ABS_DIR}/scripts/sync-kernel-expected-diff.patch" || true +git add -u +git commit -m 'tmp: apply expected differences to compare github/kernel repos' || true + +cd_to "${BPFTOOL_REPO}" +# shellcheck disable=SC2068 +git ls-files -- ${BPFTOOL_VIEW_PATHS[@]} | grep -v -E "${BPFTOOL_VIEW_EXCLUDE_REGEX}" > "${TMP_DIR}"/github-view.ls + +echo "Comparing list of files..." +diff -u "${TMP_DIR}"/linux-view.ls "${TMP_DIR}"/github-view.ls +echo "Comparing file contents..." +CONSISTENT=1 +while IFS= read -r F; do + if ! diff -u --color "${LINUX_ABS_DIR}/${F}" "${GITHUB_ABS_DIR}/${F}"; then + echo "${LINUX_ABS_DIR}/${F} and ${GITHUB_ABS_DIR}/${F} are different!" + CONSISTENT=0 + fi +done < "${TMP_DIR}"/linux-view.ls +echo "" +if (("${CONSISTENT}" == 1)); then + echo "Great! Content is identical!" +else + ignore_inconsistency=n + echo "Unfortunately, there are some inconsistencies, please double check." + echo "Some of them may come from patches in bpf tree but absent from bpf-next." + echo "Note: I applied scripts/sync-kernel-expected-diff.patch before checking," + echo "to account for expected changes. If this patch needs an update," + echo "you can do it now with:" + echo "------" + echo " (cd \"${LINUX_ABS_DIR}\" && git -c advice.detachedHead=false checkout HEAD~)" + echo " for f in \$(cat \"${TMP_DIR}/linux-view.ls\"); do" + echo " diff -u --label \"\${f}\" --label \"\${f}\" \\" + echo " \"${LINUX_ABS_DIR}/\${f}\" \\" + echo " \"${GITHUB_ABS_DIR}/\${f}\"" + echo " done > \"${GITHUB_ABS_DIR}/scripts/sync-kernel-expected-diff.patch\"" + echo "------" + read -rp "Does everything look good? [y/N]: " ignore_inconsistency + case "${ignore_inconsistency}" in + "y" | "Y") + echo "Ok, proceeding..." + ;; + *) + echo "Oops, exiting with error..." + exit 4 + esac +fi + +cleanup diff --git a/bpftool/src/.gitignore b/bpftool/src/.gitignore new file mode 100644 index 0000000..712adf5 --- /dev/null +++ b/bpftool/src/.gitignore @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +*.o +*.d +/bootstrap/ +/bpftool +FEATURE-DUMP.bpftool +feature +libbpf +/*.skel.h +/vmlinux.h diff --git a/bpftool/src/Makefile b/bpftool/src/Makefile new file mode 100644 index 0000000..b83bf5a --- /dev/null +++ b/bpftool/src/Makefile @@ -0,0 +1,293 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +include Makefile.include + +ifeq ($(srctree),) +srctree := $(patsubst %/,%,$(dir $(CURDIR))) +endif + +ifeq ($(V),1) + Q = +else + Q = @ +endif + +BPF_DIR = $(srctree)/libbpf/src + +ifneq ($(OUTPUT),) + _OUTPUT := $(OUTPUT) +else + _OUTPUT := $(CURDIR)/ +endif +BOOTSTRAP_OUTPUT := $(_OUTPUT)bootstrap/ + +LIBBPF_OUTPUT := $(_OUTPUT)libbpf/ +LIBBPF_DESTDIR := $(LIBBPF_OUTPUT) +LIBBPF_INCLUDE := $(LIBBPF_DESTDIR)include +LIBBPF_HDRS_DIR := $(LIBBPF_INCLUDE)/bpf +LIBBPF := $(LIBBPF_OUTPUT)libbpf.a + +LIBBPF_BOOTSTRAP_OUTPUT := $(BOOTSTRAP_OUTPUT)libbpf/ +LIBBPF_BOOTSTRAP_DESTDIR := $(LIBBPF_BOOTSTRAP_OUTPUT) +LIBBPF_BOOTSTRAP_INCLUDE := $(LIBBPF_BOOTSTRAP_DESTDIR)include +LIBBPF_BOOTSTRAP_HDRS_DIR := $(LIBBPF_BOOTSTRAP_INCLUDE)/bpf +LIBBPF_BOOTSTRAP := $(LIBBPF_BOOTSTRAP_OUTPUT)libbpf.a + +# We need to copy hashmap.h, nlattr.h, relo_core.h and libbpf_internal.h +# which are not otherwise exported by libbpf, but still required by bpftool. +LIBBPF_INTERNAL_HDRS := $(addprefix $(LIBBPF_HDRS_DIR)/,hashmap.h nlattr.h relo_core.h libbpf_internal.h) +LIBBPF_BOOTSTRAP_INTERNAL_HDRS := $(addprefix $(LIBBPF_BOOTSTRAP_HDRS_DIR)/,hashmap.h relo_core.h libbpf_internal.h) + +$(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) $(LIBBPF_BOOTSTRAP_OUTPUT) $(LIBBPF_HDRS_DIR) $(LIBBPF_BOOTSTRAP_HDRS_DIR): + $(QUIET_MKDIR)mkdir -p $@ + +$(LIBBPF): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_OUTPUT) + $(Q)$(MAKE) -C $(BPF_DIR) OBJDIR=$(patsubst %/,%,$(LIBBPF_OUTPUT)) \ + PREFIX=$(LIBBPF_DESTDIR:/=) $(LIBBPF) install_headers + +$(LIBBPF_INTERNAL_HDRS): $(LIBBPF_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_HDRS_DIR) + $(call QUIET_INSTALL, $@) + $(Q)install -m 644 -t $(LIBBPF_HDRS_DIR) $< + +$(LIBBPF_BOOTSTRAP): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_BOOTSTRAP_OUTPUT) + $(Q)$(MAKE) -C $(BPF_DIR) OBJDIR=$(patsubst %/,%,$(LIBBPF_BOOTSTRAP_OUTPUT)) \ + PREFIX=$(LIBBPF_BOOTSTRAP_DESTDIR:/=) \ + ARCH= CROSS_COMPILE= CC="$(HOSTCC)" LD="$(HOSTLD)" AR="$(HOSTAR)" $@ install_headers + +$(LIBBPF_BOOTSTRAP_INTERNAL_HDRS): $(LIBBPF_BOOTSTRAP_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_BOOTSTRAP_HDRS_DIR) + $(call QUIET_INSTALL, $@) + $(Q)install -m 644 -t $(LIBBPF_BOOTSTRAP_HDRS_DIR) $< + +$(LIBBPF)-clean: FORCE | $(LIBBPF_OUTPUT) + $(call QUIET_CLEAN, libbpf) + $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) clean >/dev/null + +$(LIBBPF_BOOTSTRAP)-clean: FORCE | $(LIBBPF_BOOTSTRAP_OUTPUT) + $(call QUIET_CLEAN, libbpf-bootstrap) + $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) clean >/dev/null + +prefix ?= /usr/local +bash_compdir ?= /usr/share/bash-completion/completions + +CFLAGS += -O2 +CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers +CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS)) +CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \ + -I$(or $(OUTPUT),.) \ + -I$(LIBBPF_INCLUDE) \ + -I$(srctree)/src/kernel/bpf/ \ + -I$(srctree)/include \ + -I$(srctree)/include/uapi +ifneq ($(BPFTOOL_VERSION),) +CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"' +endif +ifneq ($(EXTRA_CFLAGS),) +CFLAGS += $(EXTRA_CFLAGS) +endif +ifneq ($(EXTRA_LDFLAGS),) +LDFLAGS += $(EXTRA_LDFLAGS) +endif + +INSTALL ?= install +RM ?= rm -f + +FEATURE_USER = .bpftool + +FEATURE_TESTS := clang-bpf-co-re +FEATURE_TESTS += llvm +FEATURE_TESTS += libcap +FEATURE_TESTS += libbfd +FEATURE_TESTS += libbfd-liberty +FEATURE_TESTS += libbfd-liberty-z +FEATURE_TESTS += disassembler-four-args +FEATURE_TESTS += disassembler-init-styled + +FEATURE_DISPLAY := clang-bpf-co-re +FEATURE_DISPLAY += llvm +FEATURE_DISPLAY += libcap +FEATURE_DISPLAY += libbfd +FEATURE_DISPLAY += libbfd-liberty +FEATURE_DISPLAY += libbfd-liberty-z + +check_feat := 1 +NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall +ifdef MAKECMDGOALS +ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),) + check_feat := 0 +endif +endif + +ifeq ($(check_feat),1) +include Makefile.feature +endif + +LIBS = $(LIBBPF) -lelf -lz +LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz +ifeq ($(feature-libcap), 1) +CFLAGS += -DUSE_LIBCAP +LIBS += -lcap +endif + +include $(wildcard $(OUTPUT)*.d) + +all: $(OUTPUT)bpftool + +SRCS := $(wildcard *.c) + +ifeq ($(feature-llvm),1) + # If LLVM is available, use it for JIT disassembly + CFLAGS += -DHAVE_LLVM_SUPPORT + LLVM_CONFIG_LIB_COMPONENTS := mcdisassembler all-targets + CFLAGS += $(shell $(LLVM_CONFIG) --cflags --libs $(LLVM_CONFIG_LIB_COMPONENTS)) + LIBS += $(shell $(LLVM_CONFIG) --libs $(LLVM_CONFIG_LIB_COMPONENTS)) + ifeq ($(shell $(LLVM_CONFIG) --shared-mode),static) + LIBS += $(shell $(LLVM_CONFIG) --system-libs $(LLVM_CONFIG_LIB_COMPONENTS)) + LIBS += -lstdc++ + endif + LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags) +else + # Fall back on libbfd + ifeq ($(feature-libbfd),1) + LIBS += -lbfd -ldl -lopcodes + else ifeq ($(feature-libbfd-liberty),1) + LIBS += -lbfd -ldl -lopcodes -liberty + else ifeq ($(feature-libbfd-liberty-z),1) + LIBS += -lbfd -ldl -lopcodes -liberty -lz + endif + + # If one of the above feature combinations is set, we support libbfd + ifneq ($(filter -lbfd,$(LIBS)),) + CFLAGS += -DHAVE_LIBBFD_SUPPORT + + # Libbfd interface changed over time, figure out what we need + ifeq ($(feature-disassembler-four-args), 1) + CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE + endif + ifeq ($(feature-disassembler-init-styled), 1) + CFLAGS += -DDISASM_INIT_STYLED + endif + endif +endif +ifeq ($(filter -DHAVE_LLVM_SUPPORT -DHAVE_LIBBFD_SUPPORT,$(CFLAGS)),) + # No support for JIT disassembly + SRCS := $(filter-out jit_disasm.c,$(SRCS)) +endif + +HOST_CFLAGS = $(subst -I$(LIBBPF_INCLUDE),-I$(LIBBPF_BOOTSTRAP_INCLUDE),\ + $(subst $(CLANG_CROSS_FLAGS),,$(CFLAGS))) + +BPFTOOL_BOOTSTRAP := $(BOOTSTRAP_OUTPUT)bpftool + +BOOTSTRAP_OBJS = $(addprefix $(BOOTSTRAP_OUTPUT),main.o common.o json_writer.o gen.o btf.o xlated_dumper.o btf_dumper.o disasm.o) +$(BOOTSTRAP_OBJS): $(LIBBPF_BOOTSTRAP) + +OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o +$(OBJS): $(LIBBPF) $(LIBBPF_INTERNAL_HDRS) + +VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \ + $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ + ../../../vmlinux \ + /sys/kernel/btf/vmlinux \ + /boot/vmlinux-$(shell uname -r) +VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS)))) + +bootstrap: $(BPFTOOL_BOOTSTRAP) + +ifneq ($(VMLINUX_BTF)$(VMLINUX_H),) +ifeq ($(feature-clang-bpf-co-re),1) + +BUILD_BPF_SKELS := 1 + +$(OUTPUT)vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL_BOOTSTRAP) +ifeq ($(VMLINUX_H),) + $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) btf dump file $< format c > $@ +else + $(Q)cp "$(VMLINUX_H)" $@ +endif + +$(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF_BOOTSTRAP) + $(QUIET_CLANG)$(CLANG) \ + -I$(or $(OUTPUT),.) \ + -I$(srctree)/include/uapi/ \ + -I$(LIBBPF_BOOTSTRAP_INCLUDE) \ + -g -O2 -Wall -fno-stack-protector \ + -target bpf -c $< -o $@ + $(Q)$(LLVM_STRIP) -g $@ + +$(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP) + $(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton $< > $@ + +$(OUTPUT)prog.o: $(OUTPUT)profiler.skel.h + +$(OUTPUT)pids.o: $(OUTPUT)pid_iter.skel.h + +endif +endif + +CFLAGS += $(if $(BUILD_BPF_SKELS),,-DBPFTOOL_WITHOUT_SKELETONS) + +$(BOOTSTRAP_OUTPUT)disasm.o: $(srctree)/src/kernel/bpf/disasm.c + $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@ + +$(OUTPUT)disasm.o: $(srctree)/src/kernel/bpf/disasm.c + $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@ + +$(BPFTOOL_BOOTSTRAP): $(BOOTSTRAP_OBJS) $(LIBBPF_BOOTSTRAP) + $(QUIET_LINK)$(HOSTCC) $(HOST_CFLAGS) $(LDFLAGS) $(BOOTSTRAP_OBJS) $(LIBS_BOOTSTRAP) -o $@ + +$(OUTPUT)bpftool: $(OBJS) $(LIBBPF) + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ + +$(BOOTSTRAP_OUTPUT)%.o: %.c $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS) | $(BOOTSTRAP_OUTPUT) + $(QUIET_CC)$(HOSTCC) $(HOST_CFLAGS) -c -MMD $< -o $@ + +$(OUTPUT)%.o: %.c + $(QUIET_CC)$(CC) $(CFLAGS) -c -MMD $< -o $@ + +feature-detect-clean: + $(call QUIET_CLEAN, feature-detect) + $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null + +clean: $(LIBBPF)-clean $(LIBBPF_BOOTSTRAP)-clean + $(call QUIET_CLEAN, bpftool) + $(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d + $(Q)$(RM) -- $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h + $(Q)$(RM) -r -- $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) + $(call QUIET_CLEAN, core-gen) + $(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool + $(Q)$(RM) -r -- $(OUTPUT)feature/ + +install-bin: $(OUTPUT)bpftool + $(call QUIET_INSTALL, bpftool) + $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(prefix)/sbin + $(Q)$(INSTALL) $(OUTPUT)bpftool $(DESTDIR)$(prefix)/sbin/bpftool + +install: install-bin + $(Q)$(INSTALL) -m 0755 -d $(DESTDIR)$(bash_compdir) + $(Q)$(INSTALL) -m 0644 $(srctree)/bash-completion/bpftool $(DESTDIR)$(bash_compdir) + +uninstall: + $(call QUIET_UNINST, bpftool) + $(Q)$(RM) -- $(DESTDIR)$(prefix)/sbin/bpftool + $(Q)$(RM) -- $(DESTDIR)$(bash_compdir)/bpftool + +doc: + $(call descend,$(srctree)/docs) + +doc-clean: + $(call descend,$(srctree)/docs,clean) + +doc-install: + $(call descend,$(srctree)/docs,install) + +doc-uninstall: + $(call descend,$(srctree)/docs,uninstall) + +FORCE: + +.SECONDARY: +.PHONY: all FORCE bootstrap clean install-bin install uninstall +.PHONY: doc doc-clean doc-install doc-uninstall +.DEFAULT_GOAL := all + +# Delete partially updated (corrupted) files on error +.DELETE_ON_ERROR: diff --git a/bpftool/src/Makefile.feature b/bpftool/src/Makefile.feature new file mode 100644 index 0000000..bc0ed35 --- /dev/null +++ b/bpftool/src/Makefile.feature @@ -0,0 +1,178 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +pound := \# + +CFLAGS_BACKUP := $(CFLAGS) +CFLAGS := $(EXTRA_CFLAGS) +ifneq ($(LLVM),) + CFLAGS += -Wno-unused-command-line-argument +endif + +ifeq ($(V),1) + LOG=$(warning $(1)) + LOG_RES = (echo $(1) && >&2 echo result: $(1)) + define detect + $(warning $(1) && $(call LOG_RES,1) || $(call LOG_RES,0)) + $(shell $(1) && $(call LOG_RES,1) || $(call LOG_RES,0)) + endef +else + LOG= + LOG_RES = (echo $(1)) + define detect + $(shell $(1) && $(call LOG_RES,1) || $(call LOG_RES,0)) + endef +endif + +### feature-clang-bpf-co-re + +CLANG_BPF_CO_RE_PROBE_CMD = \ + printf '%s\n' 'struct s { int i; } __attribute__((preserve_access_index)); struct s foo;' | \ + $(CLANG) -g -target bpf -S -o - -x c - 2>/dev/null | grep -q BTF_KIND_VAR + +ifneq ($(findstring clang-bpf-co-re,$(FEATURE_TESTS)),) +$(call LOG,Probing: feature-clang-bpf-co-re) +feature-clang-bpf-co-re := \ + $(findstring 1,$(call detect,$(CLANG_BPF_CO_RE_PROBE_CMD))) +endif # clang-bpf-co-re + +### feature-libbfd + +ifneq ($(findstring libbfd,$(FEATURE_TESTS)),) +LIBBFD_PROBE := '$(pound)include \n' +LIBBFD_PROBE += 'int main(void) {' +LIBBFD_PROBE += ' bfd_demangle(0, 0, 0);' +LIBBFD_PROBE += ' return 0;' +LIBBFD_PROBE += '}' +LIBBFD_PROBE_CMD = printf '%b\n' $(LIBBFD_PROBE) | \ + $(CC) $(CFLAGS) -Wall -Werror -x c - $(1) -o /dev/null >/dev/null 2>&1 + +define libbfd_build + $(call detect,$(LIBBFD_PROBE_CMD)) +endef + +$(call LOG,Probing: feature-libbfd) +feature-libbfd := \ + $(findstring 1,$(call libbfd_build,-lbfd -ldl)) +ifneq ($(feature-libbfd),1) + $(call LOG,Probing: feature-libbfd-liberty) + feature-libbfd-liberty := \ + $(findstring 1,$(call libbfd_build,-lbfd -ldl -liberty)) + ifneq ($(feature-libbfd-liberty),1) + $(call LOG,Probing: feature-libbfd-liberty-z) + feature-libbfd-liberty-z := \ + $(findstring 1,$(call libbfd_build,-lbfd -ldl -liberty -lz)) + endif +endif +HAS_LIBBFD := $(findstring 1, \ + $(feature-libbfd)$(feature-libbfd-liberty)$(feature-libbfd-liberty-z)) +endif # libbfd + +### feature-disassembler-four-args + +ifneq ($(findstring disassembler-four-args,$(FEATURE_TESTS)),) +DISASSEMBLER_PROBE := '$(pound)include \n' +DISASSEMBLER_PROBE += 'int main(void) {' +DISASSEMBLER_PROBE += ' disassembler((enum bfd_architecture)0, 0, 0, NULL);' +DISASSEMBLER_PROBE += ' return 0;' +DISASSEMBLER_PROBE += '}' + +DISASSEMBLER_PROBE_CMD = printf '%b\n' $(1) | \ + $(CC) $(CFLAGS) -Wall -Werror -x c - -lbfd -lopcodes -S -o - >/dev/null 2>&1 +define disassembler_build + $(call detect,$(DISASSEMBLER_PROBE_CMD)) +endef + +$(call LOG,Probing: feature-disassembler-four-args) +feature-disassembler-four-args := \ + $(findstring 1, $(call disassembler_build,$(DISASSEMBLER_PROBE))) +endif # disassembler-four-args + +### feature-disassembler-init-styled + +ifneq ($(findstring disassembler-init-styled,$(FEATURE_TESTS)),) +DISASSEMBLER_STYLED_PROBE := '$(pound)include \n' +DISASSEMBLER_STYLED_PROBE += 'int main(void) {' +DISASSEMBLER_STYLED_PROBE += ' init_disassemble_info(NULL, 0, NULL, NULL);' +DISASSEMBLER_STYLED_PROBE += ' return 0;' +DISASSEMBLER_STYLED_PROBE += '}' + +$(call LOG,Probing: feature-disassembler-styled) +feature-disassembler-init-styled := \ + $(findstring 1, $(call disassembler_build,$(DISASSEMBLER_STYLED_PROBE))) +endif # disassembler-init-styled + +### feature-libcap + +ifneq ($(findstring libcap,$(FEATURE_TESTS)),) +LIBCAP_PROBE := '$(pound)include \n' +LIBCAP_PROBE += 'int main(void) {' +LIBCAP_PROBE += ' cap_free(0);' +LIBCAP_PROBE += ' return 0;' +LIBCAP_PROBE += '}' +LIBCAP_PROBE_CMD = printf '%b\n' $(LIBCAP_PROBE) | \ + $(CC) $(CFLAGS) -Wall -Werror -x c - -lcap -S -o - >/dev/null 2>&1 + +define libcap_build + $(call detect,$(LIBCAP_PROBE_CMD)) +endef + +$(call LOG,Probing: feature-libcap) +feature-libcap := $(findstring 1, $(call libcap_build)) +endif # libcap + +### feature-llvm + +ifneq ($(findstring llvm,$(FEATURE_TESTS)),) +LLVM_PROBE := '$(pound)include \n' +LLVM_PROBE += '$(pound)include \n' +LLVM_PROBE += 'int main(void) {' +LLVM_PROBE += ' char *triple = LLVMNormalizeTargetTriple("");' +LLVM_PROBE += ' LLVMDisposeMessage(triple);' +LLVM_PROBE += ' return 0;' +LLVM_PROBE += '}' + +# We need some adjustments for the flags. +# - $(CFLAGS) was set to parent $(EXTRA_CFLAGS) at the beginning of this file. +# - $(EXTRA_LDFLAGS) from parent Makefile should be kept as well. +# - Libraries to use depend on whether we have a static or shared version of +# LLVM, pass the llvm-config flag and adjust the list of libraries +# accordingly. +FEATURE_LLVM_CFLAGS := $(CFLAGS) $(shell $(LLVM_CONFIG) --cflags 2>/dev/null) +FEATURE_LLVM_LIBS := $(shell $(LLVM_CONFIG) --libs target 2>/dev/null) +ifeq ($(shell $(LLVM_CONFIG) --shared-mode 2>/dev/null),static) + FEATURE_LLVM_LIBS += $(shell $(LLVM_CONFIG) --system-libs target 2>/dev/null) + FEATURE_LLVM_LIBS += -lstdc++ +endif +FEATURE_LDFLAGS := $(EXTRA_LDFLAGS) $(shell $(LLVM_CONFIG) --ldflags 2>/dev/null) + +LLVM_PROBE_CMD = printf '%b\n' $(LLVM_PROBE) | \ + $(CC) $(FEATURE_LLVM_CFLAGS) $(FEATURE_LDFLAGS) \ + -Wall -Werror -x c - $(FEATURE_LLVM_LIBS) \ + -o /dev/null >/dev/null 2>&1 + +define llvm_build + $(call detect,$(LLVM_PROBE_CMD)) +endef + +$(call LOG,Probing: feature-llvm) +feature-llvm := $(findstring 1, $(call llvm_build)) +endif # llvm + +### Print detection results + +define print_status + ifeq ($(1), 1) + MSG = $(shell printf '...%30s: [ \033[32mon\033[m ]' $(2)) + else + MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(2)) + endif +endef +feature_print_status = $(eval $(print_status)) $(info $(MSG)) + +$(call feature_print_status,$(HAS_LIBBFD),libbfd) + +$(foreach feature,$(filter-out libbfd%,$(FEATURE_DISPLAY)), \ + $(call feature_print_status,$(feature-$(feature)),$(feature))) + +CFLAGS := $(CFLAGS_BACKUP) +undefine LOG LOG_RES diff --git a/bpftool/src/Makefile.include b/bpftool/src/Makefile.include new file mode 100644 index 0000000..d01b7d1 --- /dev/null +++ b/bpftool/src/Makefile.include @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) + +ifneq ($(OUTPUT),) +$(if $(shell [ -d "$(OUTPUT)" -a -x "$(OUTPUT)" ] && echo 1),, \ + $(error output directory "$(OUTPUT)" does not exist)) +endif + +LLVM_VERSION ?= +CLANG ?= clang$(LLVM_VERSION) +LLVM_CONFIG ?= llvm-config$(LLVM_VERSION) +LLVM_STRIP ?= llvm-strip$(LLVM_VERSION) + +ifneq ($(LLVM),) + $(if $(findstring default,$(origin AR)),$(eval AR := llvm-ar$(LLVM_VERSION))) + $(if $(findstring default,$(origin CC)),$(eval CC := clang$(LLVM_VERSION))) + $(if $(findstring default,$(origin LD)),$(eval LD := ld.lld$(LLVM_VERSION))) + HOSTAR ?= llvm-ar + HOSTCC ?= clang + HOSTLD ?= ld.lld +else + $(if $(findstring default,$(origin AR)),$(eval AR = $(CROSS_COMPILE)$(AR))) + $(if $(findstring default,$(origin CC)),$(eval CC = $(CROSS_COMPILE)$(CC))) + $(if $(findstring default,$(origin LD)),$(eval LD = $(CROSS_COMPILE)$(LD))) + HOSTAR ?= ar + HOSTCC ?= gcc + HOSTLD ?= ld +endif + +EXTRA_WARNINGS := \ + -Wbad-function-cast \ + -Wdeclaration-after-statement \ + -Wformat-security \ + -Wformat-y2k \ + -Winit-self \ + -Wmissing-declarations \ + -Wmissing-prototypes \ + -Wold-style-definition \ + -Wpacked \ + -Wredundant-decls \ + -Wshadow \ + -Wstrict-prototypes \ + -Wswitch-default \ + -Wundef \ + -Wwrite-strings \ + +ifeq ($(findstring s,$(filter-out --%,$(MAKEFLAGS))),) + ifneq ($(V),1) + + define def_quiet_msg + $(eval QUIET_$(1) = @printf ' %-9s%s\n' $(1) $$@;) + endef + $(foreach action,CC CLANG LINK MKDIR GEN,$(call def_quiet_msg,$(action))) + + define def_quiet_msg_subdir + $(eval QUIET_$(1) = @printf ' %-9s%s\n' $(1) $$1;) + endef + $(foreach action,CLEAN INSTALL UNINST,$(call def_quiet_msg_subdir,$(action))) + + define descend + @printf ' DESCEND %s\n' $(1); mkdir -p $(OUTPUT)$(1) && \ + $(MAKE) --no-print-directory -C $(1) $(2) + endef + + endif +endif diff --git a/bpftool/src/btf.c b/bpftool/src/btf.c new file mode 100644 index 0000000..91fcb75 --- /dev/null +++ b/bpftool/src/btf.c @@ -0,0 +1,1088 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2019 Facebook */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "json_writer.h" +#include "main.h" + +static const char * const btf_kind_str[NR_BTF_KINDS] = { + [BTF_KIND_UNKN] = "UNKNOWN", + [BTF_KIND_INT] = "INT", + [BTF_KIND_PTR] = "PTR", + [BTF_KIND_ARRAY] = "ARRAY", + [BTF_KIND_STRUCT] = "STRUCT", + [BTF_KIND_UNION] = "UNION", + [BTF_KIND_ENUM] = "ENUM", + [BTF_KIND_FWD] = "FWD", + [BTF_KIND_TYPEDEF] = "TYPEDEF", + [BTF_KIND_VOLATILE] = "VOLATILE", + [BTF_KIND_CONST] = "CONST", + [BTF_KIND_RESTRICT] = "RESTRICT", + [BTF_KIND_FUNC] = "FUNC", + [BTF_KIND_FUNC_PROTO] = "FUNC_PROTO", + [BTF_KIND_VAR] = "VAR", + [BTF_KIND_DATASEC] = "DATASEC", + [BTF_KIND_FLOAT] = "FLOAT", + [BTF_KIND_DECL_TAG] = "DECL_TAG", + [BTF_KIND_TYPE_TAG] = "TYPE_TAG", + [BTF_KIND_ENUM64] = "ENUM64", +}; + +static const char *btf_int_enc_str(__u8 encoding) +{ + switch (encoding) { + case 0: + return "(none)"; + case BTF_INT_SIGNED: + return "SIGNED"; + case BTF_INT_CHAR: + return "CHAR"; + case BTF_INT_BOOL: + return "BOOL"; + default: + return "UNKN"; + } +} + +static const char *btf_var_linkage_str(__u32 linkage) +{ + switch (linkage) { + case BTF_VAR_STATIC: + return "static"; + case BTF_VAR_GLOBAL_ALLOCATED: + return "global"; + case BTF_VAR_GLOBAL_EXTERN: + return "extern"; + default: + return "(unknown)"; + } +} + +static const char *btf_func_linkage_str(const struct btf_type *t) +{ + switch (btf_vlen(t)) { + case BTF_FUNC_STATIC: + return "static"; + case BTF_FUNC_GLOBAL: + return "global"; + case BTF_FUNC_EXTERN: + return "extern"; + default: + return "(unknown)"; + } +} + +static const char *btf_str(const struct btf *btf, __u32 off) +{ + if (!off) + return "(anon)"; + return btf__name_by_offset(btf, off) ? : "(invalid)"; +} + +static int btf_kind_safe(int kind) +{ + return kind <= BTF_KIND_MAX ? kind : BTF_KIND_UNKN; +} + +static int dump_btf_type(const struct btf *btf, __u32 id, + const struct btf_type *t) +{ + json_writer_t *w = json_wtr; + int kind = btf_kind(t); + + if (json_output) { + jsonw_start_object(w); + jsonw_uint_field(w, "id", id); + jsonw_string_field(w, "kind", btf_kind_str[btf_kind_safe(kind)]); + jsonw_string_field(w, "name", btf_str(btf, t->name_off)); + } else { + printf("[%u] %s '%s'", id, btf_kind_str[btf_kind_safe(kind)], + btf_str(btf, t->name_off)); + } + + switch (kind) { + case BTF_KIND_INT: { + __u32 v = *(__u32 *)(t + 1); + const char *enc; + + enc = btf_int_enc_str(BTF_INT_ENCODING(v)); + + if (json_output) { + jsonw_uint_field(w, "size", t->size); + jsonw_uint_field(w, "bits_offset", BTF_INT_OFFSET(v)); + jsonw_uint_field(w, "nr_bits", BTF_INT_BITS(v)); + jsonw_string_field(w, "encoding", enc); + } else { + printf(" size=%u bits_offset=%u nr_bits=%u encoding=%s", + t->size, BTF_INT_OFFSET(v), BTF_INT_BITS(v), + enc); + } + break; + } + case BTF_KIND_PTR: + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_TYPEDEF: + case BTF_KIND_TYPE_TAG: + if (json_output) + jsonw_uint_field(w, "type_id", t->type); + else + printf(" type_id=%u", t->type); + break; + case BTF_KIND_ARRAY: { + const struct btf_array *arr = (const void *)(t + 1); + + if (json_output) { + jsonw_uint_field(w, "type_id", arr->type); + jsonw_uint_field(w, "index_type_id", arr->index_type); + jsonw_uint_field(w, "nr_elems", arr->nelems); + } else { + printf(" type_id=%u index_type_id=%u nr_elems=%u", + arr->type, arr->index_type, arr->nelems); + } + break; + } + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m = (const void *)(t + 1); + __u16 vlen = BTF_INFO_VLEN(t->info); + int i; + + if (json_output) { + jsonw_uint_field(w, "size", t->size); + jsonw_uint_field(w, "vlen", vlen); + jsonw_name(w, "members"); + jsonw_start_array(w); + } else { + printf(" size=%u vlen=%u", t->size, vlen); + } + for (i = 0; i < vlen; i++, m++) { + const char *name = btf_str(btf, m->name_off); + __u32 bit_off, bit_sz; + + if (BTF_INFO_KFLAG(t->info)) { + bit_off = BTF_MEMBER_BIT_OFFSET(m->offset); + bit_sz = BTF_MEMBER_BITFIELD_SIZE(m->offset); + } else { + bit_off = m->offset; + bit_sz = 0; + } + + if (json_output) { + jsonw_start_object(w); + jsonw_string_field(w, "name", name); + jsonw_uint_field(w, "type_id", m->type); + jsonw_uint_field(w, "bits_offset", bit_off); + if (bit_sz) { + jsonw_uint_field(w, "bitfield_size", + bit_sz); + } + jsonw_end_object(w); + } else { + printf("\n\t'%s' type_id=%u bits_offset=%u", + name, m->type, bit_off); + if (bit_sz) + printf(" bitfield_size=%u", bit_sz); + } + } + if (json_output) + jsonw_end_array(w); + break; + } + case BTF_KIND_ENUM: { + const struct btf_enum *v = (const void *)(t + 1); + __u16 vlen = BTF_INFO_VLEN(t->info); + const char *encoding; + int i; + + encoding = btf_kflag(t) ? "SIGNED" : "UNSIGNED"; + if (json_output) { + jsonw_string_field(w, "encoding", encoding); + jsonw_uint_field(w, "size", t->size); + jsonw_uint_field(w, "vlen", vlen); + jsonw_name(w, "values"); + jsonw_start_array(w); + } else { + printf(" encoding=%s size=%u vlen=%u", encoding, t->size, vlen); + } + for (i = 0; i < vlen; i++, v++) { + const char *name = btf_str(btf, v->name_off); + + if (json_output) { + jsonw_start_object(w); + jsonw_string_field(w, "name", name); + if (btf_kflag(t)) + jsonw_int_field(w, "val", v->val); + else + jsonw_uint_field(w, "val", v->val); + jsonw_end_object(w); + } else { + if (btf_kflag(t)) + printf("\n\t'%s' val=%d", name, v->val); + else + printf("\n\t'%s' val=%u", name, v->val); + } + } + if (json_output) + jsonw_end_array(w); + break; + } + case BTF_KIND_ENUM64: { + const struct btf_enum64 *v = btf_enum64(t); + __u16 vlen = btf_vlen(t); + const char *encoding; + int i; + + encoding = btf_kflag(t) ? "SIGNED" : "UNSIGNED"; + if (json_output) { + jsonw_string_field(w, "encoding", encoding); + jsonw_uint_field(w, "size", t->size); + jsonw_uint_field(w, "vlen", vlen); + jsonw_name(w, "values"); + jsonw_start_array(w); + } else { + printf(" encoding=%s size=%u vlen=%u", encoding, t->size, vlen); + } + for (i = 0; i < vlen; i++, v++) { + const char *name = btf_str(btf, v->name_off); + __u64 val = ((__u64)v->val_hi32 << 32) | v->val_lo32; + + if (json_output) { + jsonw_start_object(w); + jsonw_string_field(w, "name", name); + if (btf_kflag(t)) + jsonw_int_field(w, "val", val); + else + jsonw_uint_field(w, "val", val); + jsonw_end_object(w); + } else { + if (btf_kflag(t)) + printf("\n\t'%s' val=%lldLL", name, + (unsigned long long)val); + else + printf("\n\t'%s' val=%lluULL", name, + (unsigned long long)val); + } + } + if (json_output) + jsonw_end_array(w); + break; + } + case BTF_KIND_FWD: { + const char *fwd_kind = BTF_INFO_KFLAG(t->info) ? "union" + : "struct"; + + if (json_output) + jsonw_string_field(w, "fwd_kind", fwd_kind); + else + printf(" fwd_kind=%s", fwd_kind); + break; + } + case BTF_KIND_FUNC: { + const char *linkage = btf_func_linkage_str(t); + + if (json_output) { + jsonw_uint_field(w, "type_id", t->type); + jsonw_string_field(w, "linkage", linkage); + } else { + printf(" type_id=%u linkage=%s", t->type, linkage); + } + break; + } + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *p = (const void *)(t + 1); + __u16 vlen = BTF_INFO_VLEN(t->info); + int i; + + if (json_output) { + jsonw_uint_field(w, "ret_type_id", t->type); + jsonw_uint_field(w, "vlen", vlen); + jsonw_name(w, "params"); + jsonw_start_array(w); + } else { + printf(" ret_type_id=%u vlen=%u", t->type, vlen); + } + for (i = 0; i < vlen; i++, p++) { + const char *name = btf_str(btf, p->name_off); + + if (json_output) { + jsonw_start_object(w); + jsonw_string_field(w, "name", name); + jsonw_uint_field(w, "type_id", p->type); + jsonw_end_object(w); + } else { + printf("\n\t'%s' type_id=%u", name, p->type); + } + } + if (json_output) + jsonw_end_array(w); + break; + } + case BTF_KIND_VAR: { + const struct btf_var *v = (const void *)(t + 1); + const char *linkage; + + linkage = btf_var_linkage_str(v->linkage); + + if (json_output) { + jsonw_uint_field(w, "type_id", t->type); + jsonw_string_field(w, "linkage", linkage); + } else { + printf(" type_id=%u, linkage=%s", t->type, linkage); + } + break; + } + case BTF_KIND_DATASEC: { + const struct btf_var_secinfo *v = (const void *)(t + 1); + const struct btf_type *vt; + __u16 vlen = BTF_INFO_VLEN(t->info); + int i; + + if (json_output) { + jsonw_uint_field(w, "size", t->size); + jsonw_uint_field(w, "vlen", vlen); + jsonw_name(w, "vars"); + jsonw_start_array(w); + } else { + printf(" size=%u vlen=%u", t->size, vlen); + } + for (i = 0; i < vlen; i++, v++) { + if (json_output) { + jsonw_start_object(w); + jsonw_uint_field(w, "type_id", v->type); + jsonw_uint_field(w, "offset", v->offset); + jsonw_uint_field(w, "size", v->size); + jsonw_end_object(w); + } else { + printf("\n\ttype_id=%u offset=%u size=%u", + v->type, v->offset, v->size); + + if (v->type < btf__type_cnt(btf)) { + vt = btf__type_by_id(btf, v->type); + printf(" (%s '%s')", + btf_kind_str[btf_kind_safe(btf_kind(vt))], + btf_str(btf, vt->name_off)); + } + } + } + if (json_output) + jsonw_end_array(w); + break; + } + case BTF_KIND_FLOAT: { + if (json_output) + jsonw_uint_field(w, "size", t->size); + else + printf(" size=%u", t->size); + break; + } + case BTF_KIND_DECL_TAG: { + const struct btf_decl_tag *tag = (const void *)(t + 1); + + if (json_output) { + jsonw_uint_field(w, "type_id", t->type); + jsonw_int_field(w, "component_idx", tag->component_idx); + } else { + printf(" type_id=%u component_idx=%d", t->type, tag->component_idx); + } + break; + } + default: + break; + } + + if (json_output) + jsonw_end_object(json_wtr); + else + printf("\n"); + + return 0; +} + +static int dump_btf_raw(const struct btf *btf, + __u32 *root_type_ids, int root_type_cnt) +{ + const struct btf_type *t; + int i; + + if (json_output) { + jsonw_start_object(json_wtr); + jsonw_name(json_wtr, "types"); + jsonw_start_array(json_wtr); + } + + if (root_type_cnt) { + for (i = 0; i < root_type_cnt; i++) { + t = btf__type_by_id(btf, root_type_ids[i]); + dump_btf_type(btf, root_type_ids[i], t); + } + } else { + const struct btf *base; + int cnt = btf__type_cnt(btf); + int start_id = 1; + + base = btf__base_btf(btf); + if (base) + start_id = btf__type_cnt(base); + + for (i = start_id; i < cnt; i++) { + t = btf__type_by_id(btf, i); + dump_btf_type(btf, i, t); + } + } + + if (json_output) { + jsonw_end_array(json_wtr); + jsonw_end_object(json_wtr); + } + return 0; +} + +static void __printf(2, 0) btf_dump_printf(void *ctx, + const char *fmt, va_list args) +{ + vfprintf(stdout, fmt, args); +} + +static int dump_btf_c(const struct btf *btf, + __u32 *root_type_ids, int root_type_cnt) +{ + struct btf_dump *d; + int err = 0, i; + + d = btf_dump__new(btf, btf_dump_printf, NULL, NULL); + if (!d) + return -errno; + + printf("#ifndef __VMLINUX_H__\n"); + printf("#define __VMLINUX_H__\n"); + printf("\n"); + printf("#ifndef BPF_NO_PRESERVE_ACCESS_INDEX\n"); + printf("#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)\n"); + printf("#endif\n\n"); + + if (root_type_cnt) { + for (i = 0; i < root_type_cnt; i++) { + err = btf_dump__dump_type(d, root_type_ids[i]); + if (err) + goto done; + } + } else { + int cnt = btf__type_cnt(btf); + + for (i = 1; i < cnt; i++) { + err = btf_dump__dump_type(d, i); + if (err) + goto done; + } + } + + printf("#ifndef BPF_NO_PRESERVE_ACCESS_INDEX\n"); + printf("#pragma clang attribute pop\n"); + printf("#endif\n"); + printf("\n"); + printf("#endif /* __VMLINUX_H__ */\n"); + +done: + btf_dump__free(d); + return err; +} + +static const char sysfs_vmlinux[] = "/sys/kernel/btf/vmlinux"; + +static struct btf *get_vmlinux_btf_from_sysfs(void) +{ + struct btf *base; + + base = btf__parse(sysfs_vmlinux, NULL); + if (!base) + p_err("failed to parse vmlinux BTF at '%s': %d\n", + sysfs_vmlinux, -errno); + + return base; +} + +#define BTF_NAME_BUFF_LEN 64 + +static bool btf_is_kernel_module(__u32 btf_id) +{ + struct bpf_btf_info btf_info = {}; + char btf_name[BTF_NAME_BUFF_LEN]; + int btf_fd; + __u32 len; + int err; + + btf_fd = bpf_btf_get_fd_by_id(btf_id); + if (btf_fd < 0) { + p_err("can't get BTF object by id (%u): %s", btf_id, strerror(errno)); + return false; + } + + len = sizeof(btf_info); + btf_info.name = ptr_to_u64(btf_name); + btf_info.name_len = sizeof(btf_name); + err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len); + close(btf_fd); + if (err) { + p_err("can't get BTF (ID %u) object info: %s", btf_id, strerror(errno)); + return false; + } + + return btf_info.kernel_btf && strncmp(btf_name, "vmlinux", sizeof(btf_name)) != 0; +} + +static int do_dump(int argc, char **argv) +{ + struct btf *btf = NULL, *base = NULL; + __u32 root_type_ids[2]; + int root_type_cnt = 0; + bool dump_c = false; + __u32 btf_id = -1; + const char *src; + int fd = -1; + int err = 0; + + if (!REQ_ARGS(2)) { + usage(); + return -1; + } + src = GET_ARG(); + if (is_prefix(src, "map")) { + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + + if (!REQ_ARGS(2)) { + usage(); + return -1; + } + + fd = map_parse_fd_and_info(&argc, &argv, &info, &len); + if (fd < 0) + return -1; + + btf_id = info.btf_id; + if (argc && is_prefix(*argv, "key")) { + root_type_ids[root_type_cnt++] = info.btf_key_type_id; + NEXT_ARG(); + } else if (argc && is_prefix(*argv, "value")) { + root_type_ids[root_type_cnt++] = info.btf_value_type_id; + NEXT_ARG(); + } else if (argc && is_prefix(*argv, "all")) { + NEXT_ARG(); + } else if (argc && is_prefix(*argv, "kv")) { + root_type_ids[root_type_cnt++] = info.btf_key_type_id; + root_type_ids[root_type_cnt++] = info.btf_value_type_id; + NEXT_ARG(); + } else { + root_type_ids[root_type_cnt++] = info.btf_key_type_id; + root_type_ids[root_type_cnt++] = info.btf_value_type_id; + } + } else if (is_prefix(src, "prog")) { + struct bpf_prog_info info = {}; + __u32 len = sizeof(info); + + if (!REQ_ARGS(2)) { + usage(); + return -1; + } + + fd = prog_parse_fd(&argc, &argv); + if (fd < 0) + return -1; + + err = bpf_prog_get_info_by_fd(fd, &info, &len); + if (err) { + p_err("can't get prog info: %s", strerror(errno)); + goto done; + } + + btf_id = info.btf_id; + } else if (is_prefix(src, "id")) { + char *endptr; + + btf_id = strtoul(*argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as ID", *argv); + return -1; + } + NEXT_ARG(); + } else if (is_prefix(src, "file")) { + const char sysfs_prefix[] = "/sys/kernel/btf/"; + + if (!base_btf && + strncmp(*argv, sysfs_prefix, sizeof(sysfs_prefix) - 1) == 0 && + strcmp(*argv, sysfs_vmlinux) != 0) + base = get_vmlinux_btf_from_sysfs(); + + btf = btf__parse_split(*argv, base ?: base_btf); + if (!btf) { + err = -errno; + p_err("failed to load BTF from %s: %s", + *argv, strerror(errno)); + goto done; + } + NEXT_ARG(); + } else { + err = -1; + p_err("unrecognized BTF source specifier: '%s'", src); + goto done; + } + + while (argc) { + if (is_prefix(*argv, "format")) { + NEXT_ARG(); + if (argc < 1) { + p_err("expecting value for 'format' option\n"); + err = -EINVAL; + goto done; + } + if (strcmp(*argv, "c") == 0) { + dump_c = true; + } else if (strcmp(*argv, "raw") == 0) { + dump_c = false; + } else { + p_err("unrecognized format specifier: '%s', possible values: raw, c", + *argv); + err = -EINVAL; + goto done; + } + NEXT_ARG(); + } else { + p_err("unrecognized option: '%s'", *argv); + err = -EINVAL; + goto done; + } + } + + if (!btf) { + if (!base_btf && btf_is_kernel_module(btf_id)) { + p_info("Warning: valid base BTF was not specified with -B option, falling back to standard base BTF (%s)", + sysfs_vmlinux); + base_btf = get_vmlinux_btf_from_sysfs(); + } + + btf = btf__load_from_kernel_by_id_split(btf_id, base_btf); + if (!btf) { + err = -errno; + p_err("get btf by id (%u): %s", btf_id, strerror(errno)); + goto done; + } + } + + if (dump_c) { + if (json_output) { + p_err("JSON output for C-syntax dump is not supported"); + err = -ENOTSUP; + goto done; + } + err = dump_btf_c(btf, root_type_ids, root_type_cnt); + } else { + err = dump_btf_raw(btf, root_type_ids, root_type_cnt); + } + +done: + close(fd); + btf__free(btf); + btf__free(base); + return err; +} + +static int btf_parse_fd(int *argc, char ***argv) +{ + unsigned int id; + char *endptr; + int fd; + + if (!is_prefix(*argv[0], "id")) { + p_err("expected 'id', got: '%s'?", **argv); + return -1; + } + NEXT_ARGP(); + + id = strtoul(**argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as ID", **argv); + return -1; + } + NEXT_ARGP(); + + fd = bpf_btf_get_fd_by_id(id); + if (fd < 0) + p_err("can't get BTF object by id (%u): %s", + id, strerror(errno)); + + return fd; +} + +static int +build_btf_type_table(struct hashmap *tab, enum bpf_obj_type type, + void *info, __u32 *len) +{ + static const char * const names[] = { + [BPF_OBJ_UNKNOWN] = "unknown", + [BPF_OBJ_PROG] = "prog", + [BPF_OBJ_MAP] = "map", + }; + __u32 btf_id, id = 0; + int err; + int fd; + + while (true) { + switch (type) { + case BPF_OBJ_PROG: + err = bpf_prog_get_next_id(id, &id); + break; + case BPF_OBJ_MAP: + err = bpf_map_get_next_id(id, &id); + break; + default: + err = -1; + p_err("unexpected object type: %d", type); + goto err_free; + } + if (err) { + if (errno == ENOENT) { + err = 0; + break; + } + p_err("can't get next %s: %s%s", names[type], + strerror(errno), + errno == EINVAL ? " -- kernel too old?" : ""); + goto err_free; + } + + switch (type) { + case BPF_OBJ_PROG: + fd = bpf_prog_get_fd_by_id(id); + break; + case BPF_OBJ_MAP: + fd = bpf_map_get_fd_by_id(id); + break; + default: + err = -1; + p_err("unexpected object type: %d", type); + goto err_free; + } + if (fd < 0) { + if (errno == ENOENT) + continue; + p_err("can't get %s by id (%u): %s", names[type], id, + strerror(errno)); + err = -1; + goto err_free; + } + + memset(info, 0, *len); + if (type == BPF_OBJ_PROG) + err = bpf_prog_get_info_by_fd(fd, info, len); + else + err = bpf_map_get_info_by_fd(fd, info, len); + close(fd); + if (err) { + p_err("can't get %s info: %s", names[type], + strerror(errno)); + goto err_free; + } + + switch (type) { + case BPF_OBJ_PROG: + btf_id = ((struct bpf_prog_info *)info)->btf_id; + break; + case BPF_OBJ_MAP: + btf_id = ((struct bpf_map_info *)info)->btf_id; + break; + default: + err = -1; + p_err("unexpected object type: %d", type); + goto err_free; + } + if (!btf_id) + continue; + + err = hashmap__append(tab, btf_id, id); + if (err) { + p_err("failed to append entry to hashmap for BTF ID %u, object ID %u: %s", + btf_id, id, strerror(-err)); + goto err_free; + } + } + + return 0; + +err_free: + hashmap__free(tab); + return err; +} + +static int +build_btf_tables(struct hashmap *btf_prog_table, + struct hashmap *btf_map_table) +{ + struct bpf_prog_info prog_info; + __u32 prog_len = sizeof(prog_info); + struct bpf_map_info map_info; + __u32 map_len = sizeof(map_info); + int err = 0; + + err = build_btf_type_table(btf_prog_table, BPF_OBJ_PROG, &prog_info, + &prog_len); + if (err) + return err; + + err = build_btf_type_table(btf_map_table, BPF_OBJ_MAP, &map_info, + &map_len); + if (err) { + hashmap__free(btf_prog_table); + return err; + } + + return 0; +} + +static void +show_btf_plain(struct bpf_btf_info *info, int fd, + struct hashmap *btf_prog_table, + struct hashmap *btf_map_table) +{ + struct hashmap_entry *entry; + const char *name = u64_to_ptr(info->name); + int n; + + printf("%u: ", info->id); + if (info->kernel_btf) + printf("name [%s] ", name); + else if (name && name[0]) + printf("name %s ", name); + else + printf("name "); + printf("size %uB", info->btf_size); + + n = 0; + hashmap__for_each_key_entry(btf_prog_table, entry, info->id) { + printf("%s%lu", n++ == 0 ? " prog_ids " : ",", entry->value); + } + + n = 0; + hashmap__for_each_key_entry(btf_map_table, entry, info->id) { + printf("%s%lu", n++ == 0 ? " map_ids " : ",", entry->value); + } + + emit_obj_refs_plain(refs_table, info->id, "\n\tpids "); + + printf("\n"); +} + +static void +show_btf_json(struct bpf_btf_info *info, int fd, + struct hashmap *btf_prog_table, + struct hashmap *btf_map_table) +{ + struct hashmap_entry *entry; + const char *name = u64_to_ptr(info->name); + + jsonw_start_object(json_wtr); /* btf object */ + jsonw_uint_field(json_wtr, "id", info->id); + jsonw_uint_field(json_wtr, "size", info->btf_size); + + jsonw_name(json_wtr, "prog_ids"); + jsonw_start_array(json_wtr); /* prog_ids */ + hashmap__for_each_key_entry(btf_prog_table, entry, info->id) { + jsonw_uint(json_wtr, entry->value); + } + jsonw_end_array(json_wtr); /* prog_ids */ + + jsonw_name(json_wtr, "map_ids"); + jsonw_start_array(json_wtr); /* map_ids */ + hashmap__for_each_key_entry(btf_map_table, entry, info->id) { + jsonw_uint(json_wtr, entry->value); + } + jsonw_end_array(json_wtr); /* map_ids */ + + emit_obj_refs_json(refs_table, info->id, json_wtr); /* pids */ + + jsonw_bool_field(json_wtr, "kernel", info->kernel_btf); + + if (name && name[0]) + jsonw_string_field(json_wtr, "name", name); + + jsonw_end_object(json_wtr); /* btf object */ +} + +static int +show_btf(int fd, struct hashmap *btf_prog_table, + struct hashmap *btf_map_table) +{ + struct bpf_btf_info info; + __u32 len = sizeof(info); + char name[64]; + int err; + + memset(&info, 0, sizeof(info)); + err = bpf_btf_get_info_by_fd(fd, &info, &len); + if (err) { + p_err("can't get BTF object info: %s", strerror(errno)); + return -1; + } + /* if kernel support emitting BTF object name, pass name pointer */ + if (info.name_len) { + memset(&info, 0, sizeof(info)); + info.name_len = sizeof(name); + info.name = ptr_to_u64(name); + len = sizeof(info); + + err = bpf_btf_get_info_by_fd(fd, &info, &len); + if (err) { + p_err("can't get BTF object info: %s", strerror(errno)); + return -1; + } + } + + if (json_output) + show_btf_json(&info, fd, btf_prog_table, btf_map_table); + else + show_btf_plain(&info, fd, btf_prog_table, btf_map_table); + + return 0; +} + +static int do_show(int argc, char **argv) +{ + struct hashmap *btf_prog_table; + struct hashmap *btf_map_table; + int err, fd = -1; + __u32 id = 0; + + if (argc == 2) { + fd = btf_parse_fd(&argc, &argv); + if (fd < 0) + return -1; + } + + if (argc) { + if (fd >= 0) + close(fd); + return BAD_ARG(); + } + + btf_prog_table = hashmap__new(hash_fn_for_key_as_id, + equal_fn_for_key_as_id, NULL); + btf_map_table = hashmap__new(hash_fn_for_key_as_id, + equal_fn_for_key_as_id, NULL); + if (IS_ERR(btf_prog_table) || IS_ERR(btf_map_table)) { + hashmap__free(btf_prog_table); + hashmap__free(btf_map_table); + if (fd >= 0) + close(fd); + p_err("failed to create hashmap for object references"); + return -1; + } + err = build_btf_tables(btf_prog_table, btf_map_table); + if (err) { + if (fd >= 0) + close(fd); + return err; + } + build_obj_refs_table(&refs_table, BPF_OBJ_BTF); + + if (fd >= 0) { + err = show_btf(fd, btf_prog_table, btf_map_table); + close(fd); + goto exit_free; + } + + if (json_output) + jsonw_start_array(json_wtr); /* root array */ + + while (true) { + err = bpf_btf_get_next_id(id, &id); + if (err) { + if (errno == ENOENT) { + err = 0; + break; + } + p_err("can't get next BTF object: %s%s", + strerror(errno), + errno == EINVAL ? " -- kernel too old?" : ""); + err = -1; + break; + } + + fd = bpf_btf_get_fd_by_id(id); + if (fd < 0) { + if (errno == ENOENT) + continue; + p_err("can't get BTF object by id (%u): %s", + id, strerror(errno)); + err = -1; + break; + } + + err = show_btf(fd, btf_prog_table, btf_map_table); + close(fd); + if (err) + break; + } + + if (json_output) + jsonw_end_array(json_wtr); /* root array */ + +exit_free: + hashmap__free(btf_prog_table); + hashmap__free(btf_map_table); + delete_obj_refs_table(refs_table); + + return err; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %1$s %2$s { show | list } [id BTF_ID]\n" + " %1$s %2$s dump BTF_SRC [format FORMAT]\n" + " %1$s %2$s help\n" + "\n" + " BTF_SRC := { id BTF_ID | prog PROG | map MAP [{key | value | kv | all}] | file FILE }\n" + " FORMAT := { raw | c }\n" + " " HELP_SPEC_MAP "\n" + " " HELP_SPEC_PROGRAM "\n" + " " HELP_SPEC_OPTIONS " |\n" + " {-B|--base-btf} }\n" + "", + bin_name, "btf"); + + return 0; +} + +static const struct cmd cmds[] = { + { "show", do_show }, + { "list", do_show }, + { "help", do_help }, + { "dump", do_dump }, + { 0 } +}; + +int do_btf(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/btf_dumper.c b/bpftool/src/btf_dumper.c new file mode 100644 index 0000000..e7f6ec3 --- /dev/null +++ b/bpftool/src/btf_dumper.c @@ -0,0 +1,823 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (c) 2018 Facebook */ + +#include +#include /* for (FILE *) used by json_writer */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "json_writer.h" +#include "main.h" + +#define BITS_PER_BYTE_MASK (BITS_PER_BYTE - 1) +#define BITS_PER_BYTE_MASKED(bits) ((bits) & BITS_PER_BYTE_MASK) +#define BITS_ROUNDDOWN_BYTES(bits) ((bits) >> 3) +#define BITS_ROUNDUP_BYTES(bits) \ + (BITS_ROUNDDOWN_BYTES(bits) + !!BITS_PER_BYTE_MASKED(bits)) + +static int btf_dumper_do_type(const struct btf_dumper *d, __u32 type_id, + __u8 bit_offset, const void *data); + +static int btf_dump_func(const struct btf *btf, char *func_sig, + const struct btf_type *func_proto, + const struct btf_type *func, int pos, int size); + +static int dump_prog_id_as_func_ptr(const struct btf_dumper *d, + const struct btf_type *func_proto, + __u32 prog_id) +{ + const struct btf_type *func_type; + int prog_fd = -1, func_sig_len; + struct bpf_prog_info info = {}; + __u32 info_len = sizeof(info); + const char *prog_name = NULL; + struct btf *prog_btf = NULL; + struct bpf_func_info finfo; + __u32 finfo_rec_size; + char prog_str[1024]; + int err; + + /* Get the ptr's func_proto */ + func_sig_len = btf_dump_func(d->btf, prog_str, func_proto, NULL, 0, + sizeof(prog_str)); + if (func_sig_len == -1) + return -1; + + if (!prog_id) + goto print; + + /* Get the bpf_prog's name. Obtain from func_info. */ + prog_fd = bpf_prog_get_fd_by_id(prog_id); + if (prog_fd < 0) + goto print; + + err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len); + if (err) + goto print; + + if (!info.btf_id || !info.nr_func_info) + goto print; + + finfo_rec_size = info.func_info_rec_size; + memset(&info, 0, sizeof(info)); + info.nr_func_info = 1; + info.func_info_rec_size = finfo_rec_size; + info.func_info = ptr_to_u64(&finfo); + + err = bpf_prog_get_info_by_fd(prog_fd, &info, &info_len); + if (err) + goto print; + + prog_btf = btf__load_from_kernel_by_id(info.btf_id); + if (!prog_btf) + goto print; + func_type = btf__type_by_id(prog_btf, finfo.type_id); + if (!func_type || !btf_is_func(func_type)) + goto print; + + prog_name = btf__name_by_offset(prog_btf, func_type->name_off); + +print: + if (!prog_id) + snprintf(&prog_str[func_sig_len], + sizeof(prog_str) - func_sig_len, " 0"); + else if (prog_name) + snprintf(&prog_str[func_sig_len], + sizeof(prog_str) - func_sig_len, + " %s/prog_id:%u", prog_name, prog_id); + else + snprintf(&prog_str[func_sig_len], + sizeof(prog_str) - func_sig_len, + " /prog_id:%u", prog_id); + + prog_str[sizeof(prog_str) - 1] = '\0'; + jsonw_string(d->jw, prog_str); + btf__free(prog_btf); + if (prog_fd >= 0) + close(prog_fd); + return 0; +} + +static void btf_dumper_ptr(const struct btf_dumper *d, + const struct btf_type *t, + const void *data) +{ + unsigned long value = *(unsigned long *)data; + const struct btf_type *ptr_type; + __s32 ptr_type_id; + + if (!d->prog_id_as_func_ptr || value > UINT32_MAX) + goto print_ptr_value; + + ptr_type_id = btf__resolve_type(d->btf, t->type); + if (ptr_type_id < 0) + goto print_ptr_value; + ptr_type = btf__type_by_id(d->btf, ptr_type_id); + if (!ptr_type || !btf_is_func_proto(ptr_type)) + goto print_ptr_value; + + if (!dump_prog_id_as_func_ptr(d, ptr_type, value)) + return; + +print_ptr_value: + if (d->is_plain_text) + jsonw_printf(d->jw, "%p", (void *)value); + else + jsonw_printf(d->jw, "%lu", value); +} + +static int btf_dumper_modifier(const struct btf_dumper *d, __u32 type_id, + __u8 bit_offset, const void *data) +{ + int actual_type_id; + + actual_type_id = btf__resolve_type(d->btf, type_id); + if (actual_type_id < 0) + return actual_type_id; + + return btf_dumper_do_type(d, actual_type_id, bit_offset, data); +} + +static int btf_dumper_enum(const struct btf_dumper *d, + const struct btf_type *t, + const void *data) +{ + const struct btf_enum *enums = btf_enum(t); + __s64 value; + __u16 i; + + switch (t->size) { + case 8: + value = *(__s64 *)data; + break; + case 4: + value = *(__s32 *)data; + break; + case 2: + value = *(__s16 *)data; + break; + case 1: + value = *(__s8 *)data; + break; + default: + return -EINVAL; + } + + for (i = 0; i < btf_vlen(t); i++) { + if (value == enums[i].val) { + jsonw_string(d->jw, + btf__name_by_offset(d->btf, + enums[i].name_off)); + return 0; + } + } + + jsonw_int(d->jw, value); + return 0; +} + +static int btf_dumper_enum64(const struct btf_dumper *d, + const struct btf_type *t, + const void *data) +{ + const struct btf_enum64 *enums = btf_enum64(t); + __u32 val_lo32, val_hi32; + __u64 value; + __u16 i; + + value = *(__u64 *)data; + val_lo32 = (__u32)value; + val_hi32 = value >> 32; + + for (i = 0; i < btf_vlen(t); i++) { + if (val_lo32 == enums[i].val_lo32 && val_hi32 == enums[i].val_hi32) { + jsonw_string(d->jw, + btf__name_by_offset(d->btf, + enums[i].name_off)); + return 0; + } + } + + jsonw_int(d->jw, value); + return 0; +} + +static bool is_str_array(const struct btf *btf, const struct btf_array *arr, + const char *s) +{ + const struct btf_type *elem_type; + const char *end_s; + + if (!arr->nelems) + return false; + + elem_type = btf__type_by_id(btf, arr->type); + /* Not skipping typedef. typedef to char does not count as + * a string now. + */ + while (elem_type && btf_is_mod(elem_type)) + elem_type = btf__type_by_id(btf, elem_type->type); + + if (!elem_type || !btf_is_int(elem_type) || elem_type->size != 1) + return false; + + if (btf_int_encoding(elem_type) != BTF_INT_CHAR && + strcmp("char", btf__name_by_offset(btf, elem_type->name_off))) + return false; + + end_s = s + arr->nelems; + while (s < end_s) { + if (!*s) + return true; + if (*s <= 0x1f || *s >= 0x7f) + return false; + s++; + } + + /* '\0' is not found */ + return false; +} + +static int btf_dumper_array(const struct btf_dumper *d, __u32 type_id, + const void *data) +{ + const struct btf_type *t = btf__type_by_id(d->btf, type_id); + struct btf_array *arr = (struct btf_array *)(t + 1); + long long elem_size; + int ret = 0; + __u32 i; + + if (is_str_array(d->btf, arr, data)) { + jsonw_string(d->jw, data); + return 0; + } + + elem_size = btf__resolve_size(d->btf, arr->type); + if (elem_size < 0) + return elem_size; + + jsonw_start_array(d->jw); + for (i = 0; i < arr->nelems; i++) { + ret = btf_dumper_do_type(d, arr->type, 0, + data + i * elem_size); + if (ret) + break; + } + + jsonw_end_array(d->jw); + return ret; +} + +static void btf_int128_print(json_writer_t *jw, const void *data, + bool is_plain_text) +{ + /* data points to a __int128 number. + * Suppose + * int128_num = *(__int128 *)data; + * The below formulas shows what upper_num and lower_num represents: + * upper_num = int128_num >> 64; + * lower_num = int128_num & 0xffffffffFFFFFFFFULL; + */ + __u64 upper_num, lower_num; + +#ifdef __BIG_ENDIAN_BITFIELD + upper_num = *(__u64 *)data; + lower_num = *(__u64 *)(data + 8); +#else + upper_num = *(__u64 *)(data + 8); + lower_num = *(__u64 *)data; +#endif + + if (is_plain_text) { + if (upper_num == 0) + jsonw_printf(jw, "0x%llx", lower_num); + else + jsonw_printf(jw, "0x%llx%016llx", upper_num, lower_num); + } else { + if (upper_num == 0) + jsonw_printf(jw, "\"0x%llx\"", lower_num); + else + jsonw_printf(jw, "\"0x%llx%016llx\"", upper_num, lower_num); + } +} + +static void btf_int128_shift(__u64 *print_num, __u16 left_shift_bits, + __u16 right_shift_bits) +{ + __u64 upper_num, lower_num; + +#ifdef __BIG_ENDIAN_BITFIELD + upper_num = print_num[0]; + lower_num = print_num[1]; +#else + upper_num = print_num[1]; + lower_num = print_num[0]; +#endif + + /* shake out un-needed bits by shift/or operations */ + if (left_shift_bits >= 64) { + upper_num = lower_num << (left_shift_bits - 64); + lower_num = 0; + } else { + upper_num = (upper_num << left_shift_bits) | + (lower_num >> (64 - left_shift_bits)); + lower_num = lower_num << left_shift_bits; + } + + if (right_shift_bits >= 64) { + lower_num = upper_num >> (right_shift_bits - 64); + upper_num = 0; + } else { + lower_num = (lower_num >> right_shift_bits) | + (upper_num << (64 - right_shift_bits)); + upper_num = upper_num >> right_shift_bits; + } + +#ifdef __BIG_ENDIAN_BITFIELD + print_num[0] = upper_num; + print_num[1] = lower_num; +#else + print_num[0] = lower_num; + print_num[1] = upper_num; +#endif +} + +static void btf_dumper_bitfield(__u32 nr_bits, __u8 bit_offset, + const void *data, json_writer_t *jw, + bool is_plain_text) +{ + int left_shift_bits, right_shift_bits; + __u64 print_num[2] = {}; + int bytes_to_copy; + int bits_to_copy; + + bits_to_copy = bit_offset + nr_bits; + bytes_to_copy = BITS_ROUNDUP_BYTES(bits_to_copy); + + memcpy(print_num, data, bytes_to_copy); +#if defined(__BIG_ENDIAN_BITFIELD) + left_shift_bits = bit_offset; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + left_shift_bits = 128 - bits_to_copy; +#else +#error neither big nor little endian +#endif + right_shift_bits = 128 - nr_bits; + + btf_int128_shift(print_num, left_shift_bits, right_shift_bits); + btf_int128_print(jw, print_num, is_plain_text); +} + + +static void btf_dumper_int_bits(__u32 int_type, __u8 bit_offset, + const void *data, json_writer_t *jw, + bool is_plain_text) +{ + int nr_bits = BTF_INT_BITS(int_type); + int total_bits_offset; + + /* bits_offset is at most 7. + * BTF_INT_OFFSET() cannot exceed 128 bits. + */ + total_bits_offset = bit_offset + BTF_INT_OFFSET(int_type); + data += BITS_ROUNDDOWN_BYTES(total_bits_offset); + bit_offset = BITS_PER_BYTE_MASKED(total_bits_offset); + btf_dumper_bitfield(nr_bits, bit_offset, data, jw, + is_plain_text); +} + +static int btf_dumper_int(const struct btf_type *t, __u8 bit_offset, + const void *data, json_writer_t *jw, + bool is_plain_text) +{ + __u32 *int_type; + __u32 nr_bits; + + int_type = (__u32 *)(t + 1); + nr_bits = BTF_INT_BITS(*int_type); + /* if this is bit field */ + if (bit_offset || BTF_INT_OFFSET(*int_type) || + BITS_PER_BYTE_MASKED(nr_bits)) { + btf_dumper_int_bits(*int_type, bit_offset, data, jw, + is_plain_text); + return 0; + } + + if (nr_bits == 128) { + btf_int128_print(jw, data, is_plain_text); + return 0; + } + + switch (BTF_INT_ENCODING(*int_type)) { + case 0: + if (BTF_INT_BITS(*int_type) == 64) + jsonw_printf(jw, "%llu", *(__u64 *)data); + else if (BTF_INT_BITS(*int_type) == 32) + jsonw_printf(jw, "%u", *(__u32 *)data); + else if (BTF_INT_BITS(*int_type) == 16) + jsonw_printf(jw, "%hu", *(__u16 *)data); + else if (BTF_INT_BITS(*int_type) == 8) + jsonw_printf(jw, "%hhu", *(__u8 *)data); + else + btf_dumper_int_bits(*int_type, bit_offset, data, jw, + is_plain_text); + break; + case BTF_INT_SIGNED: + if (BTF_INT_BITS(*int_type) == 64) + jsonw_printf(jw, "%lld", *(long long *)data); + else if (BTF_INT_BITS(*int_type) == 32) + jsonw_printf(jw, "%d", *(int *)data); + else if (BTF_INT_BITS(*int_type) == 16) + jsonw_printf(jw, "%hd", *(short *)data); + else if (BTF_INT_BITS(*int_type) == 8) + jsonw_printf(jw, "%hhd", *(char *)data); + else + btf_dumper_int_bits(*int_type, bit_offset, data, jw, + is_plain_text); + break; + case BTF_INT_CHAR: + if (isprint(*(char *)data)) + jsonw_printf(jw, "\"%c\"", *(char *)data); + else + if (is_plain_text) + jsonw_printf(jw, "0x%hhx", *(char *)data); + else + jsonw_printf(jw, "\"\\u00%02hhx\"", + *(char *)data); + break; + case BTF_INT_BOOL: + jsonw_bool(jw, *(bool *)data); + break; + default: + /* shouldn't happen */ + return -EINVAL; + } + + return 0; +} + +static int btf_dumper_struct(const struct btf_dumper *d, __u32 type_id, + const void *data) +{ + const struct btf_type *t; + struct btf_member *m; + const void *data_off; + int kind_flag; + int ret = 0; + int i, vlen; + + t = btf__type_by_id(d->btf, type_id); + if (!t) + return -EINVAL; + + kind_flag = BTF_INFO_KFLAG(t->info); + vlen = BTF_INFO_VLEN(t->info); + jsonw_start_object(d->jw); + m = (struct btf_member *)(t + 1); + + for (i = 0; i < vlen; i++) { + __u32 bit_offset = m[i].offset; + __u32 bitfield_size = 0; + + if (kind_flag) { + bitfield_size = BTF_MEMBER_BITFIELD_SIZE(bit_offset); + bit_offset = BTF_MEMBER_BIT_OFFSET(bit_offset); + } + + jsonw_name(d->jw, btf__name_by_offset(d->btf, m[i].name_off)); + data_off = data + BITS_ROUNDDOWN_BYTES(bit_offset); + if (bitfield_size) { + btf_dumper_bitfield(bitfield_size, + BITS_PER_BYTE_MASKED(bit_offset), + data_off, d->jw, d->is_plain_text); + } else { + ret = btf_dumper_do_type(d, m[i].type, + BITS_PER_BYTE_MASKED(bit_offset), + data_off); + if (ret) + break; + } + } + + jsonw_end_object(d->jw); + + return ret; +} + +static int btf_dumper_var(const struct btf_dumper *d, __u32 type_id, + __u8 bit_offset, const void *data) +{ + const struct btf_type *t = btf__type_by_id(d->btf, type_id); + int ret; + + jsonw_start_object(d->jw); + jsonw_name(d->jw, btf__name_by_offset(d->btf, t->name_off)); + ret = btf_dumper_do_type(d, t->type, bit_offset, data); + jsonw_end_object(d->jw); + + return ret; +} + +static int btf_dumper_datasec(const struct btf_dumper *d, __u32 type_id, + const void *data) +{ + struct btf_var_secinfo *vsi; + const struct btf_type *t; + int ret = 0, i, vlen; + + t = btf__type_by_id(d->btf, type_id); + if (!t) + return -EINVAL; + + vlen = BTF_INFO_VLEN(t->info); + vsi = (struct btf_var_secinfo *)(t + 1); + + jsonw_start_object(d->jw); + jsonw_name(d->jw, btf__name_by_offset(d->btf, t->name_off)); + jsonw_start_array(d->jw); + for (i = 0; i < vlen; i++) { + ret = btf_dumper_do_type(d, vsi[i].type, 0, data + vsi[i].offset); + if (ret) + break; + } + jsonw_end_array(d->jw); + jsonw_end_object(d->jw); + + return ret; +} + +static int btf_dumper_do_type(const struct btf_dumper *d, __u32 type_id, + __u8 bit_offset, const void *data) +{ + const struct btf_type *t = btf__type_by_id(d->btf, type_id); + + switch (BTF_INFO_KIND(t->info)) { + case BTF_KIND_INT: + return btf_dumper_int(t, bit_offset, data, d->jw, + d->is_plain_text); + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + return btf_dumper_struct(d, type_id, data); + case BTF_KIND_ARRAY: + return btf_dumper_array(d, type_id, data); + case BTF_KIND_ENUM: + return btf_dumper_enum(d, t, data); + case BTF_KIND_ENUM64: + return btf_dumper_enum64(d, t, data); + case BTF_KIND_PTR: + btf_dumper_ptr(d, t, data); + return 0; + case BTF_KIND_UNKN: + jsonw_printf(d->jw, "(unknown)"); + return 0; + case BTF_KIND_FWD: + /* map key or value can't be forward */ + jsonw_printf(d->jw, "(fwd-kind-invalid)"); + return -EINVAL; + case BTF_KIND_TYPEDEF: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + return btf_dumper_modifier(d, type_id, bit_offset, data); + case BTF_KIND_VAR: + return btf_dumper_var(d, type_id, bit_offset, data); + case BTF_KIND_DATASEC: + return btf_dumper_datasec(d, type_id, data); + default: + jsonw_printf(d->jw, "(unsupported-kind"); + return -EINVAL; + } +} + +int btf_dumper_type(const struct btf_dumper *d, __u32 type_id, + const void *data) +{ + return btf_dumper_do_type(d, type_id, 0, data); +} + +#define BTF_PRINT_ARG(...) \ + do { \ + pos += snprintf(func_sig + pos, size - pos, \ + __VA_ARGS__); \ + if (pos >= size) \ + return -1; \ + } while (0) +#define BTF_PRINT_TYPE(type) \ + do { \ + pos = __btf_dumper_type_only(btf, type, func_sig, \ + pos, size); \ + if (pos == -1) \ + return -1; \ + } while (0) + +static int __btf_dumper_type_only(const struct btf *btf, __u32 type_id, + char *func_sig, int pos, int size) +{ + const struct btf_type *proto_type; + const struct btf_array *array; + const struct btf_var *var; + const struct btf_type *t; + + if (!type_id) { + BTF_PRINT_ARG("void "); + return pos; + } + + t = btf__type_by_id(btf, type_id); + + switch (BTF_INFO_KIND(t->info)) { + case BTF_KIND_INT: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FLOAT: + BTF_PRINT_ARG("%s ", btf__name_by_offset(btf, t->name_off)); + break; + case BTF_KIND_STRUCT: + BTF_PRINT_ARG("struct %s ", + btf__name_by_offset(btf, t->name_off)); + break; + case BTF_KIND_UNION: + BTF_PRINT_ARG("union %s ", + btf__name_by_offset(btf, t->name_off)); + break; + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + BTF_PRINT_ARG("enum %s ", + btf__name_by_offset(btf, t->name_off)); + break; + case BTF_KIND_ARRAY: + array = (struct btf_array *)(t + 1); + BTF_PRINT_TYPE(array->type); + BTF_PRINT_ARG("[%d]", array->nelems); + break; + case BTF_KIND_PTR: + BTF_PRINT_TYPE(t->type); + BTF_PRINT_ARG("* "); + break; + case BTF_KIND_FWD: + BTF_PRINT_ARG("%s %s ", + BTF_INFO_KFLAG(t->info) ? "union" : "struct", + btf__name_by_offset(btf, t->name_off)); + break; + case BTF_KIND_VOLATILE: + BTF_PRINT_ARG("volatile "); + BTF_PRINT_TYPE(t->type); + break; + case BTF_KIND_CONST: + BTF_PRINT_ARG("const "); + BTF_PRINT_TYPE(t->type); + break; + case BTF_KIND_RESTRICT: + BTF_PRINT_ARG("restrict "); + BTF_PRINT_TYPE(t->type); + break; + case BTF_KIND_FUNC_PROTO: + pos = btf_dump_func(btf, func_sig, t, NULL, pos, size); + if (pos == -1) + return -1; + break; + case BTF_KIND_FUNC: + proto_type = btf__type_by_id(btf, t->type); + pos = btf_dump_func(btf, func_sig, proto_type, t, pos, size); + if (pos == -1) + return -1; + break; + case BTF_KIND_VAR: + var = (struct btf_var *)(t + 1); + if (var->linkage == BTF_VAR_STATIC) + BTF_PRINT_ARG("static "); + BTF_PRINT_TYPE(t->type); + BTF_PRINT_ARG(" %s", + btf__name_by_offset(btf, t->name_off)); + break; + case BTF_KIND_DATASEC: + BTF_PRINT_ARG("section (\"%s\") ", + btf__name_by_offset(btf, t->name_off)); + break; + case BTF_KIND_UNKN: + default: + return -1; + } + + return pos; +} + +static int btf_dump_func(const struct btf *btf, char *func_sig, + const struct btf_type *func_proto, + const struct btf_type *func, int pos, int size) +{ + int i, vlen; + + BTF_PRINT_TYPE(func_proto->type); + if (func) + BTF_PRINT_ARG("%s(", btf__name_by_offset(btf, func->name_off)); + else + BTF_PRINT_ARG("("); + vlen = BTF_INFO_VLEN(func_proto->info); + for (i = 0; i < vlen; i++) { + struct btf_param *arg = &((struct btf_param *)(func_proto + 1))[i]; + + if (i) + BTF_PRINT_ARG(", "); + if (arg->type) { + BTF_PRINT_TYPE(arg->type); + if (arg->name_off) + BTF_PRINT_ARG("%s", + btf__name_by_offset(btf, arg->name_off)); + else if (pos && func_sig[pos - 1] == ' ') + /* Remove unnecessary space for + * FUNC_PROTO that does not have + * arg->name_off + */ + func_sig[--pos] = '\0'; + } else { + BTF_PRINT_ARG("..."); + } + } + BTF_PRINT_ARG(")"); + + return pos; +} + +void btf_dumper_type_only(const struct btf *btf, __u32 type_id, char *func_sig, + int size) +{ + int err; + + func_sig[0] = '\0'; + if (!btf) + return; + + err = __btf_dumper_type_only(btf, type_id, func_sig, 0, size); + if (err < 0) + func_sig[0] = '\0'; +} + +static const char *ltrim(const char *s) +{ + while (isspace(*s)) + s++; + + return s; +} + +void btf_dump_linfo_plain(const struct btf *btf, + const struct bpf_line_info *linfo, + const char *prefix, bool linum) +{ + const char *line = btf__name_by_offset(btf, linfo->line_off); + + if (!line) + return; + line = ltrim(line); + + if (!prefix) + prefix = ""; + + if (linum) { + const char *file = btf__name_by_offset(btf, linfo->file_name_off); + + /* More forgiving on file because linum option is + * expected to provide more info than the already + * available src line. + */ + if (!file) + file = ""; + + printf("%s%s [file:%s line_num:%u line_col:%u]\n", + prefix, line, file, + BPF_LINE_INFO_LINE_NUM(linfo->line_col), + BPF_LINE_INFO_LINE_COL(linfo->line_col)); + } else { + printf("%s%s\n", prefix, line); + } +} + +void btf_dump_linfo_json(const struct btf *btf, + const struct bpf_line_info *linfo, bool linum) +{ + const char *line = btf__name_by_offset(btf, linfo->line_off); + + if (line) + jsonw_string_field(json_wtr, "src", ltrim(line)); + + if (linum) { + const char *file = btf__name_by_offset(btf, linfo->file_name_off); + + if (file) + jsonw_string_field(json_wtr, "file", file); + + if (BPF_LINE_INFO_LINE_NUM(linfo->line_col)) + jsonw_int_field(json_wtr, "line_num", + BPF_LINE_INFO_LINE_NUM(linfo->line_col)); + + if (BPF_LINE_INFO_LINE_COL(linfo->line_col)) + jsonw_int_field(json_wtr, "line_col", + BPF_LINE_INFO_LINE_COL(linfo->line_col)); + } +} diff --git a/bpftool/src/cfg.c b/bpftool/src/cfg.c new file mode 100644 index 0000000..1951219 --- /dev/null +++ b/bpftool/src/cfg.c @@ -0,0 +1,485 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2018 Netronome Systems, Inc. */ + +#include +#include +#include + +#include "cfg.h" +#include "main.h" +#include "xlated_dumper.h" + +struct cfg { + struct list_head funcs; + int func_num; +}; + +struct func_node { + struct list_head l; + struct list_head bbs; + struct bpf_insn *start; + struct bpf_insn *end; + int idx; + int bb_num; +}; + +struct bb_node { + struct list_head l; + struct list_head e_prevs; + struct list_head e_succs; + struct bpf_insn *head; + struct bpf_insn *tail; + int idx; +}; + +#define EDGE_FLAG_EMPTY 0x0 +#define EDGE_FLAG_FALLTHROUGH 0x1 +#define EDGE_FLAG_JUMP 0x2 +struct edge_node { + struct list_head l; + struct bb_node *src; + struct bb_node *dst; + int flags; +}; + +#define ENTRY_BLOCK_INDEX 0 +#define EXIT_BLOCK_INDEX 1 +#define NUM_FIXED_BLOCKS 2 +#define func_prev(func) list_prev_entry(func, l) +#define func_next(func) list_next_entry(func, l) +#define bb_prev(bb) list_prev_entry(bb, l) +#define bb_next(bb) list_next_entry(bb, l) +#define entry_bb(func) func_first_bb(func) +#define exit_bb(func) func_last_bb(func) +#define cfg_first_func(cfg) \ + list_first_entry(&cfg->funcs, struct func_node, l) +#define cfg_last_func(cfg) \ + list_last_entry(&cfg->funcs, struct func_node, l) +#define func_first_bb(func) \ + list_first_entry(&func->bbs, struct bb_node, l) +#define func_last_bb(func) \ + list_last_entry(&func->bbs, struct bb_node, l) + +static struct func_node *cfg_append_func(struct cfg *cfg, struct bpf_insn *insn) +{ + struct func_node *new_func, *func; + + list_for_each_entry(func, &cfg->funcs, l) { + if (func->start == insn) + return func; + else if (func->start > insn) + break; + } + + func = func_prev(func); + new_func = calloc(1, sizeof(*new_func)); + if (!new_func) { + p_err("OOM when allocating FUNC node"); + return NULL; + } + new_func->start = insn; + new_func->idx = cfg->func_num; + list_add(&new_func->l, &func->l); + cfg->func_num++; + + return new_func; +} + +static struct bb_node *func_append_bb(struct func_node *func, + struct bpf_insn *insn) +{ + struct bb_node *new_bb, *bb; + + list_for_each_entry(bb, &func->bbs, l) { + if (bb->head == insn) + return bb; + else if (bb->head > insn) + break; + } + + bb = bb_prev(bb); + new_bb = calloc(1, sizeof(*new_bb)); + if (!new_bb) { + p_err("OOM when allocating BB node"); + return NULL; + } + new_bb->head = insn; + INIT_LIST_HEAD(&new_bb->e_prevs); + INIT_LIST_HEAD(&new_bb->e_succs); + list_add(&new_bb->l, &bb->l); + + return new_bb; +} + +static struct bb_node *func_insert_dummy_bb(struct list_head *after) +{ + struct bb_node *bb; + + bb = calloc(1, sizeof(*bb)); + if (!bb) { + p_err("OOM when allocating BB node"); + return NULL; + } + + INIT_LIST_HEAD(&bb->e_prevs); + INIT_LIST_HEAD(&bb->e_succs); + list_add(&bb->l, after); + + return bb; +} + +static bool cfg_partition_funcs(struct cfg *cfg, struct bpf_insn *cur, + struct bpf_insn *end) +{ + struct func_node *func, *last_func; + + func = cfg_append_func(cfg, cur); + if (!func) + return true; + + for (; cur < end; cur++) { + if (cur->code != (BPF_JMP | BPF_CALL)) + continue; + if (cur->src_reg != BPF_PSEUDO_CALL) + continue; + func = cfg_append_func(cfg, cur + cur->off + 1); + if (!func) + return true; + } + + last_func = cfg_last_func(cfg); + last_func->end = end - 1; + func = cfg_first_func(cfg); + list_for_each_entry_from(func, &last_func->l, l) { + func->end = func_next(func)->start - 1; + } + + return false; +} + +static bool is_jmp_insn(__u8 code) +{ + return BPF_CLASS(code) == BPF_JMP || BPF_CLASS(code) == BPF_JMP32; +} + +static bool func_partition_bb_head(struct func_node *func) +{ + struct bpf_insn *cur, *end; + struct bb_node *bb; + + cur = func->start; + end = func->end; + INIT_LIST_HEAD(&func->bbs); + bb = func_append_bb(func, cur); + if (!bb) + return true; + + for (; cur <= end; cur++) { + if (is_jmp_insn(cur->code)) { + __u8 opcode = BPF_OP(cur->code); + + if (opcode == BPF_EXIT || opcode == BPF_CALL) + continue; + + bb = func_append_bb(func, cur + cur->off + 1); + if (!bb) + return true; + + if (opcode != BPF_JA) { + bb = func_append_bb(func, cur + 1); + if (!bb) + return true; + } + } + } + + return false; +} + +static void func_partition_bb_tail(struct func_node *func) +{ + unsigned int bb_idx = NUM_FIXED_BLOCKS; + struct bb_node *bb, *last; + + last = func_last_bb(func); + last->tail = func->end; + bb = func_first_bb(func); + list_for_each_entry_from(bb, &last->l, l) { + bb->tail = bb_next(bb)->head - 1; + bb->idx = bb_idx++; + } + + last->idx = bb_idx++; + func->bb_num = bb_idx; +} + +static bool func_add_special_bb(struct func_node *func) +{ + struct bb_node *bb; + + bb = func_insert_dummy_bb(&func->bbs); + if (!bb) + return true; + bb->idx = ENTRY_BLOCK_INDEX; + + bb = func_insert_dummy_bb(&func_last_bb(func)->l); + if (!bb) + return true; + bb->idx = EXIT_BLOCK_INDEX; + + return false; +} + +static bool func_partition_bb(struct func_node *func) +{ + if (func_partition_bb_head(func)) + return true; + + func_partition_bb_tail(func); + + return false; +} + +static struct bb_node *func_search_bb_with_head(struct func_node *func, + struct bpf_insn *insn) +{ + struct bb_node *bb; + + list_for_each_entry(bb, &func->bbs, l) { + if (bb->head == insn) + return bb; + } + + return NULL; +} + +static struct edge_node *new_edge(struct bb_node *src, struct bb_node *dst, + int flags) +{ + struct edge_node *e; + + e = calloc(1, sizeof(*e)); + if (!e) { + p_err("OOM when allocating edge node"); + return NULL; + } + + if (src) + e->src = src; + if (dst) + e->dst = dst; + + e->flags |= flags; + + return e; +} + +static bool func_add_bb_edges(struct func_node *func) +{ + struct bpf_insn *insn; + struct edge_node *e; + struct bb_node *bb; + + bb = entry_bb(func); + e = new_edge(bb, bb_next(bb), EDGE_FLAG_FALLTHROUGH); + if (!e) + return true; + list_add_tail(&e->l, &bb->e_succs); + + bb = exit_bb(func); + e = new_edge(bb_prev(bb), bb, EDGE_FLAG_FALLTHROUGH); + if (!e) + return true; + list_add_tail(&e->l, &bb->e_prevs); + + bb = entry_bb(func); + bb = bb_next(bb); + list_for_each_entry_from(bb, &exit_bb(func)->l, l) { + e = new_edge(bb, NULL, EDGE_FLAG_EMPTY); + if (!e) + return true; + e->src = bb; + + insn = bb->tail; + if (!is_jmp_insn(insn->code) || + BPF_OP(insn->code) == BPF_EXIT) { + e->dst = bb_next(bb); + e->flags |= EDGE_FLAG_FALLTHROUGH; + list_add_tail(&e->l, &bb->e_succs); + continue; + } else if (BPF_OP(insn->code) == BPF_JA) { + e->dst = func_search_bb_with_head(func, + insn + insn->off + 1); + e->flags |= EDGE_FLAG_JUMP; + list_add_tail(&e->l, &bb->e_succs); + continue; + } + + e->dst = bb_next(bb); + e->flags |= EDGE_FLAG_FALLTHROUGH; + list_add_tail(&e->l, &bb->e_succs); + + e = new_edge(bb, NULL, EDGE_FLAG_JUMP); + if (!e) + return true; + e->src = bb; + e->dst = func_search_bb_with_head(func, insn + insn->off + 1); + list_add_tail(&e->l, &bb->e_succs); + } + + return false; +} + +static bool cfg_build(struct cfg *cfg, struct bpf_insn *insn, unsigned int len) +{ + int cnt = len / sizeof(*insn); + struct func_node *func; + + INIT_LIST_HEAD(&cfg->funcs); + + if (cfg_partition_funcs(cfg, insn, insn + cnt)) + return true; + + list_for_each_entry(func, &cfg->funcs, l) { + if (func_partition_bb(func) || func_add_special_bb(func)) + return true; + + if (func_add_bb_edges(func)) + return true; + } + + return false; +} + +static void cfg_destroy(struct cfg *cfg) +{ + struct func_node *func, *func2; + + list_for_each_entry_safe(func, func2, &cfg->funcs, l) { + struct bb_node *bb, *bb2; + + list_for_each_entry_safe(bb, bb2, &func->bbs, l) { + struct edge_node *e, *e2; + + list_for_each_entry_safe(e, e2, &bb->e_prevs, l) { + list_del(&e->l); + free(e); + } + + list_for_each_entry_safe(e, e2, &bb->e_succs, l) { + list_del(&e->l); + free(e); + } + + list_del(&bb->l); + free(bb); + } + + list_del(&func->l); + free(func); + } +} + +static void draw_bb_node(struct func_node *func, struct bb_node *bb) +{ + const char *shape; + + if (bb->idx == ENTRY_BLOCK_INDEX || bb->idx == EXIT_BLOCK_INDEX) + shape = "Mdiamond"; + else + shape = "record"; + + printf("\tfn_%d_bb_%d [shape=%s,style=filled,label=\"", + func->idx, bb->idx, shape); + + if (bb->idx == ENTRY_BLOCK_INDEX) { + printf("ENTRY"); + } else if (bb->idx == EXIT_BLOCK_INDEX) { + printf("EXIT"); + } else { + unsigned int start_idx; + struct dump_data dd = {}; + + printf("{"); + kernel_syms_load(&dd); + start_idx = bb->head - func->start; + dump_xlated_for_graph(&dd, bb->head, bb->tail, start_idx); + kernel_syms_destroy(&dd); + printf("}"); + } + + printf("\"];\n\n"); +} + +static void draw_bb_succ_edges(struct func_node *func, struct bb_node *bb) +{ + const char *style = "\"solid,bold\""; + const char *color = "black"; + int func_idx = func->idx; + struct edge_node *e; + int weight = 10; + + if (list_empty(&bb->e_succs)) + return; + + list_for_each_entry(e, &bb->e_succs, l) { + printf("\tfn_%d_bb_%d:s -> fn_%d_bb_%d:n [style=%s, color=%s, weight=%d, constraint=true", + func_idx, e->src->idx, func_idx, e->dst->idx, + style, color, weight); + printf("];\n"); + } +} + +static void func_output_bb_def(struct func_node *func) +{ + struct bb_node *bb; + + list_for_each_entry(bb, &func->bbs, l) { + draw_bb_node(func, bb); + } +} + +static void func_output_edges(struct func_node *func) +{ + int func_idx = func->idx; + struct bb_node *bb; + + list_for_each_entry(bb, &func->bbs, l) { + draw_bb_succ_edges(func, bb); + } + + /* Add an invisible edge from ENTRY to EXIT, this is to + * improve the graph layout. + */ + printf("\tfn_%d_bb_%d:s -> fn_%d_bb_%d:n [style=\"invis\", constraint=true];\n", + func_idx, ENTRY_BLOCK_INDEX, func_idx, EXIT_BLOCK_INDEX); +} + +static void cfg_dump(struct cfg *cfg) +{ + struct func_node *func; + + printf("digraph \"DOT graph for eBPF program\" {\n"); + list_for_each_entry(func, &cfg->funcs, l) { + printf("subgraph \"cluster_%d\" {\n\tstyle=\"dashed\";\n\tcolor=\"black\";\n\tlabel=\"func_%d ()\";\n", + func->idx, func->idx); + func_output_bb_def(func); + func_output_edges(func); + printf("}\n"); + } + printf("}\n"); +} + +void dump_xlated_cfg(void *buf, unsigned int len) +{ + struct bpf_insn *insn = buf; + struct cfg cfg; + + memset(&cfg, 0, sizeof(cfg)); + if (cfg_build(&cfg, insn, len)) + return; + + cfg_dump(&cfg); + + cfg_destroy(&cfg); +} diff --git a/bpftool/src/cfg.h b/bpftool/src/cfg.h new file mode 100644 index 0000000..e144257 --- /dev/null +++ b/bpftool/src/cfg.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Copyright (C) 2018 Netronome Systems, Inc. */ + +#ifndef __BPF_TOOL_CFG_H +#define __BPF_TOOL_CFG_H + +void dump_xlated_cfg(void *buf, unsigned int len); + +#endif /* __BPF_TOOL_CFG_H */ diff --git a/bpftool/src/cgroup.c b/bpftool/src/cgroup.c new file mode 100644 index 0000000..ac846b0 --- /dev/null +++ b/bpftool/src/cgroup.c @@ -0,0 +1,655 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +// Copyright (C) 2017 Facebook +// Author: Roman Gushchin + +#define _XOPEN_SOURCE 500 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "main.h" + +#define HELP_SPEC_ATTACH_FLAGS \ + "ATTACH_FLAGS := { multi | override }" + +#define HELP_SPEC_ATTACH_TYPES \ + " ATTACH_TYPE := { cgroup_inet_ingress | cgroup_inet_egress |\n" \ + " cgroup_inet_sock_create | cgroup_sock_ops |\n" \ + " cgroup_device | cgroup_inet4_bind |\n" \ + " cgroup_inet6_bind | cgroup_inet4_post_bind |\n" \ + " cgroup_inet6_post_bind | cgroup_inet4_connect |\n" \ + " cgroup_inet6_connect | cgroup_inet4_getpeername |\n" \ + " cgroup_inet6_getpeername | cgroup_inet4_getsockname |\n" \ + " cgroup_inet6_getsockname | cgroup_udp4_sendmsg |\n" \ + " cgroup_udp6_sendmsg | cgroup_udp4_recvmsg |\n" \ + " cgroup_udp6_recvmsg | cgroup_sysctl |\n" \ + " cgroup_getsockopt | cgroup_setsockopt |\n" \ + " cgroup_inet_sock_release }" + +static unsigned int query_flags; +static struct btf *btf_vmlinux; +static __u32 btf_vmlinux_id; + +static enum bpf_attach_type parse_attach_type(const char *str) +{ + const char *attach_type_str; + enum bpf_attach_type type; + + for (type = 0; ; type++) { + attach_type_str = libbpf_bpf_attach_type_str(type); + if (!attach_type_str) + break; + if (!strcmp(str, attach_type_str)) + return type; + } + + /* Also check traditionally used attach type strings. For these we keep + * allowing prefixed usage. + */ + for (type = 0; ; type++) { + attach_type_str = bpf_attach_type_input_str(type); + if (!attach_type_str) + break; + if (is_prefix(str, attach_type_str)) + return type; + } + + return __MAX_BPF_ATTACH_TYPE; +} + +static void guess_vmlinux_btf_id(__u32 attach_btf_obj_id) +{ + struct bpf_btf_info btf_info = {}; + __u32 btf_len = sizeof(btf_info); + char name[16] = {}; + int err; + int fd; + + btf_info.name = ptr_to_u64(name); + btf_info.name_len = sizeof(name); + + fd = bpf_btf_get_fd_by_id(attach_btf_obj_id); + if (fd < 0) + return; + + err = bpf_btf_get_info_by_fd(fd, &btf_info, &btf_len); + if (err) + goto out; + + if (btf_info.kernel_btf && strncmp(name, "vmlinux", sizeof(name)) == 0) + btf_vmlinux_id = btf_info.id; + +out: + close(fd); +} + +static int show_bpf_prog(int id, enum bpf_attach_type attach_type, + const char *attach_flags_str, + int level) +{ + char prog_name[MAX_PROG_FULL_NAME]; + const char *attach_btf_name = NULL; + struct bpf_prog_info info = {}; + const char *attach_type_str; + __u32 info_len = sizeof(info); + int prog_fd; + + prog_fd = bpf_prog_get_fd_by_id(id); + if (prog_fd < 0) + return -1; + + if (bpf_prog_get_info_by_fd(prog_fd, &info, &info_len)) { + close(prog_fd); + return -1; + } + + attach_type_str = libbpf_bpf_attach_type_str(attach_type); + + if (btf_vmlinux) { + if (!btf_vmlinux_id) + guess_vmlinux_btf_id(info.attach_btf_obj_id); + + if (btf_vmlinux_id == info.attach_btf_obj_id && + info.attach_btf_id < btf__type_cnt(btf_vmlinux)) { + const struct btf_type *t = + btf__type_by_id(btf_vmlinux, info.attach_btf_id); + attach_btf_name = + btf__name_by_offset(btf_vmlinux, t->name_off); + } + } + + get_prog_full_name(&info, prog_fd, prog_name, sizeof(prog_name)); + if (json_output) { + jsonw_start_object(json_wtr); + jsonw_uint_field(json_wtr, "id", info.id); + if (attach_type_str) + jsonw_string_field(json_wtr, "attach_type", attach_type_str); + else + jsonw_uint_field(json_wtr, "attach_type", attach_type); + if (!(query_flags & BPF_F_QUERY_EFFECTIVE)) + jsonw_string_field(json_wtr, "attach_flags", attach_flags_str); + jsonw_string_field(json_wtr, "name", prog_name); + if (attach_btf_name) + jsonw_string_field(json_wtr, "attach_btf_name", attach_btf_name); + jsonw_uint_field(json_wtr, "attach_btf_obj_id", info.attach_btf_obj_id); + jsonw_uint_field(json_wtr, "attach_btf_id", info.attach_btf_id); + jsonw_end_object(json_wtr); + } else { + printf("%s%-8u ", level ? " " : "", info.id); + if (attach_type_str) + printf("%-15s", attach_type_str); + else + printf("type %-10u", attach_type); + if (query_flags & BPF_F_QUERY_EFFECTIVE) + printf(" %-15s", prog_name); + else + printf(" %-15s %-15s", attach_flags_str, prog_name); + if (attach_btf_name) + printf(" %-15s", attach_btf_name); + else if (info.attach_btf_id) + printf(" attach_btf_obj_id=%d attach_btf_id=%d", + info.attach_btf_obj_id, info.attach_btf_id); + printf("\n"); + } + + close(prog_fd); + return 0; +} + +static int count_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type) +{ + __u32 prog_cnt = 0; + int ret; + + ret = bpf_prog_query(cgroup_fd, type, query_flags, NULL, + NULL, &prog_cnt); + if (ret) + return -1; + + return prog_cnt; +} + +static int cgroup_has_attached_progs(int cgroup_fd) +{ + enum bpf_attach_type type; + bool no_prog = true; + + for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { + int count = count_attached_bpf_progs(cgroup_fd, type); + + if (count < 0 && errno != EINVAL) + return -1; + + if (count > 0) { + no_prog = false; + break; + } + } + + return no_prog ? 0 : 1; +} + +static int show_effective_bpf_progs(int cgroup_fd, enum bpf_attach_type type, + int level) +{ + LIBBPF_OPTS(bpf_prog_query_opts, p); + __u32 prog_ids[1024] = {0}; + __u32 iter; + int ret; + + p.query_flags = query_flags; + p.prog_cnt = ARRAY_SIZE(prog_ids); + p.prog_ids = prog_ids; + + ret = bpf_prog_query_opts(cgroup_fd, type, &p); + if (ret) + return ret; + + if (p.prog_cnt == 0) + return 0; + + for (iter = 0; iter < p.prog_cnt; iter++) + show_bpf_prog(prog_ids[iter], type, NULL, level); + + return 0; +} + +static int show_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type, + int level) +{ + LIBBPF_OPTS(bpf_prog_query_opts, p); + __u32 prog_attach_flags[1024] = {0}; + const char *attach_flags_str; + __u32 prog_ids[1024] = {0}; + char buf[32]; + __u32 iter; + int ret; + + p.query_flags = query_flags; + p.prog_cnt = ARRAY_SIZE(prog_ids); + p.prog_ids = prog_ids; + p.prog_attach_flags = prog_attach_flags; + + ret = bpf_prog_query_opts(cgroup_fd, type, &p); + if (ret) + return ret; + + if (p.prog_cnt == 0) + return 0; + + for (iter = 0; iter < p.prog_cnt; iter++) { + __u32 attach_flags; + + attach_flags = prog_attach_flags[iter] ?: p.attach_flags; + + switch (attach_flags) { + case BPF_F_ALLOW_MULTI: + attach_flags_str = "multi"; + break; + case BPF_F_ALLOW_OVERRIDE: + attach_flags_str = "override"; + break; + case 0: + attach_flags_str = ""; + break; + default: + snprintf(buf, sizeof(buf), "unknown(%x)", attach_flags); + attach_flags_str = buf; + } + + show_bpf_prog(prog_ids[iter], type, + attach_flags_str, level); + } + + return 0; +} + +static int show_bpf_progs(int cgroup_fd, enum bpf_attach_type type, + int level) +{ + return query_flags & BPF_F_QUERY_EFFECTIVE ? + show_effective_bpf_progs(cgroup_fd, type, level) : + show_attached_bpf_progs(cgroup_fd, type, level); +} + +static int do_show(int argc, char **argv) +{ + enum bpf_attach_type type; + int has_attached_progs; + const char *path; + int cgroup_fd; + int ret = -1; + + query_flags = 0; + + if (!REQ_ARGS(1)) + return -1; + path = GET_ARG(); + + while (argc) { + if (is_prefix(*argv, "effective")) { + if (query_flags & BPF_F_QUERY_EFFECTIVE) { + p_err("duplicated argument: %s", *argv); + return -1; + } + query_flags |= BPF_F_QUERY_EFFECTIVE; + NEXT_ARG(); + } else { + p_err("expected no more arguments, 'effective', got: '%s'?", + *argv); + return -1; + } + } + + cgroup_fd = open(path, O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s", path); + goto exit; + } + + has_attached_progs = cgroup_has_attached_progs(cgroup_fd); + if (has_attached_progs < 0) { + p_err("can't query bpf programs attached to %s: %s", + path, strerror(errno)); + goto exit_cgroup; + } else if (!has_attached_progs) { + ret = 0; + goto exit_cgroup; + } + + if (json_output) + jsonw_start_array(json_wtr); + else if (query_flags & BPF_F_QUERY_EFFECTIVE) + printf("%-8s %-15s %-15s\n", "ID", "AttachType", "Name"); + else + printf("%-8s %-15s %-15s %-15s\n", "ID", "AttachType", + "AttachFlags", "Name"); + + btf_vmlinux = libbpf_find_kernel_btf(); + for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { + /* + * Not all attach types may be supported, so it's expected, + * that some requests will fail. + * If we were able to get the show for at least one + * attach type, let's return 0. + */ + if (show_bpf_progs(cgroup_fd, type, 0) == 0) + ret = 0; + } + + if (json_output) + jsonw_end_array(json_wtr); + +exit_cgroup: + close(cgroup_fd); +exit: + return ret; +} + +/* + * To distinguish nftw() errors and do_show_tree_fn() errors + * and avoid duplicating error messages, let's return -2 + * from do_show_tree_fn() in case of error. + */ +#define NFTW_ERR -1 +#define SHOW_TREE_FN_ERR -2 +static int do_show_tree_fn(const char *fpath, const struct stat *sb, + int typeflag, struct FTW *ftw) +{ + enum bpf_attach_type type; + int has_attached_progs; + int cgroup_fd; + + if (typeflag != FTW_D) + return 0; + + cgroup_fd = open(fpath, O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s: %s", fpath, strerror(errno)); + return SHOW_TREE_FN_ERR; + } + + has_attached_progs = cgroup_has_attached_progs(cgroup_fd); + if (has_attached_progs < 0) { + p_err("can't query bpf programs attached to %s: %s", + fpath, strerror(errno)); + close(cgroup_fd); + return SHOW_TREE_FN_ERR; + } else if (!has_attached_progs) { + close(cgroup_fd); + return 0; + } + + if (json_output) { + jsonw_start_object(json_wtr); + jsonw_string_field(json_wtr, "cgroup", fpath); + jsonw_name(json_wtr, "programs"); + jsonw_start_array(json_wtr); + } else { + printf("%s\n", fpath); + } + + btf_vmlinux = libbpf_find_kernel_btf(); + for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) + show_bpf_progs(cgroup_fd, type, ftw->level); + + if (errno == EINVAL) + /* Last attach type does not support query. + * Do not report an error for this, especially because batch + * mode would stop processing commands. + */ + errno = 0; + + if (json_output) { + jsonw_end_array(json_wtr); + jsonw_end_object(json_wtr); + } + + close(cgroup_fd); + + return 0; +} + +static char *find_cgroup_root(void) +{ + struct mntent *mnt; + FILE *f; + + f = fopen("/proc/mounts", "r"); + if (f == NULL) + return NULL; + + while ((mnt = getmntent(f))) { + if (strcmp(mnt->mnt_type, "cgroup2") == 0) { + fclose(f); + return strdup(mnt->mnt_dir); + } + } + + fclose(f); + return NULL; +} + +static int do_show_tree(int argc, char **argv) +{ + char *cgroup_root, *cgroup_alloced = NULL; + int ret; + + query_flags = 0; + + if (!argc) { + cgroup_alloced = find_cgroup_root(); + if (!cgroup_alloced) { + p_err("cgroup v2 isn't mounted"); + return -1; + } + cgroup_root = cgroup_alloced; + } else { + cgroup_root = GET_ARG(); + + while (argc) { + if (is_prefix(*argv, "effective")) { + if (query_flags & BPF_F_QUERY_EFFECTIVE) { + p_err("duplicated argument: %s", *argv); + return -1; + } + query_flags |= BPF_F_QUERY_EFFECTIVE; + NEXT_ARG(); + } else { + p_err("expected no more arguments, 'effective', got: '%s'?", + *argv); + return -1; + } + } + } + + if (json_output) + jsonw_start_array(json_wtr); + else if (query_flags & BPF_F_QUERY_EFFECTIVE) + printf("%s\n" + "%-8s %-15s %-15s\n", + "CgroupPath", + "ID", "AttachType", "Name"); + else + printf("%s\n" + "%-8s %-15s %-15s %-15s\n", + "CgroupPath", + "ID", "AttachType", "AttachFlags", "Name"); + + switch (nftw(cgroup_root, do_show_tree_fn, 1024, FTW_MOUNT)) { + case NFTW_ERR: + p_err("can't iterate over %s: %s", cgroup_root, + strerror(errno)); + ret = -1; + break; + case SHOW_TREE_FN_ERR: + ret = -1; + break; + default: + ret = 0; + } + + if (json_output) + jsonw_end_array(json_wtr); + + free(cgroup_alloced); + + return ret; +} + +static int do_attach(int argc, char **argv) +{ + enum bpf_attach_type attach_type; + int cgroup_fd, prog_fd; + int attach_flags = 0; + int ret = -1; + int i; + + if (argc < 4) { + p_err("too few parameters for cgroup attach"); + goto exit; + } + + cgroup_fd = open(argv[0], O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s", argv[0]); + goto exit; + } + + attach_type = parse_attach_type(argv[1]); + if (attach_type == __MAX_BPF_ATTACH_TYPE) { + p_err("invalid attach type"); + goto exit_cgroup; + } + + argc -= 2; + argv = &argv[2]; + prog_fd = prog_parse_fd(&argc, &argv); + if (prog_fd < 0) + goto exit_cgroup; + + for (i = 0; i < argc; i++) { + if (is_prefix(argv[i], "multi")) { + attach_flags |= BPF_F_ALLOW_MULTI; + } else if (is_prefix(argv[i], "override")) { + attach_flags |= BPF_F_ALLOW_OVERRIDE; + } else { + p_err("unknown option: %s", argv[i]); + goto exit_cgroup; + } + } + + if (bpf_prog_attach(prog_fd, cgroup_fd, attach_type, attach_flags)) { + p_err("failed to attach program"); + goto exit_prog; + } + + if (json_output) + jsonw_null(json_wtr); + + ret = 0; + +exit_prog: + close(prog_fd); +exit_cgroup: + close(cgroup_fd); +exit: + return ret; +} + +static int do_detach(int argc, char **argv) +{ + enum bpf_attach_type attach_type; + int prog_fd, cgroup_fd; + int ret = -1; + + if (argc < 4) { + p_err("too few parameters for cgroup detach"); + goto exit; + } + + cgroup_fd = open(argv[0], O_RDONLY); + if (cgroup_fd < 0) { + p_err("can't open cgroup %s", argv[0]); + goto exit; + } + + attach_type = parse_attach_type(argv[1]); + if (attach_type == __MAX_BPF_ATTACH_TYPE) { + p_err("invalid attach type"); + goto exit_cgroup; + } + + argc -= 2; + argv = &argv[2]; + prog_fd = prog_parse_fd(&argc, &argv); + if (prog_fd < 0) + goto exit_cgroup; + + if (bpf_prog_detach2(prog_fd, cgroup_fd, attach_type)) { + p_err("failed to detach program"); + goto exit_prog; + } + + if (json_output) + jsonw_null(json_wtr); + + ret = 0; + +exit_prog: + close(prog_fd); +exit_cgroup: + close(cgroup_fd); +exit: + return ret; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %1$s %2$s { show | list } CGROUP [**effective**]\n" + " %1$s %2$s tree [CGROUP_ROOT] [**effective**]\n" + " %1$s %2$s attach CGROUP ATTACH_TYPE PROG [ATTACH_FLAGS]\n" + " %1$s %2$s detach CGROUP ATTACH_TYPE PROG\n" + " %1$s %2$s help\n" + "\n" + HELP_SPEC_ATTACH_TYPES "\n" + " " HELP_SPEC_ATTACH_FLAGS "\n" + " " HELP_SPEC_PROGRAM "\n" + " " HELP_SPEC_OPTIONS " |\n" + " {-f|--bpffs} }\n" + "", + bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "show", do_show }, + { "list", do_show }, + { "tree", do_show_tree }, + { "attach", do_attach }, + { "detach", do_detach }, + { "help", do_help }, + { 0 } +}; + +int do_cgroup(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/common.c b/bpftool/src/common.c new file mode 100644 index 0000000..5a73ccf --- /dev/null +++ b/bpftool/src/common.c @@ -0,0 +1,1093 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2017-2018 Netronome Systems, Inc. */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include /* libbpf_num_possible_cpus */ +#include + +#include "main.h" + +#ifndef BPF_FS_MAGIC +#define BPF_FS_MAGIC 0xcafe4a11 +#endif + +void p_err(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + if (json_output) { + jsonw_start_object(json_wtr); + jsonw_name(json_wtr, "error"); + jsonw_vprintf_enquote(json_wtr, fmt, ap); + jsonw_end_object(json_wtr); + } else { + fprintf(stderr, "Error: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + } + va_end(ap); +} + +void p_info(const char *fmt, ...) +{ + va_list ap; + + if (json_output) + return; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +static bool is_bpffs(char *path) +{ + struct statfs st_fs; + + if (statfs(path, &st_fs) < 0) + return false; + + return (unsigned long)st_fs.f_type == BPF_FS_MAGIC; +} + +/* Probe whether kernel switched from memlock-based (RLIMIT_MEMLOCK) to + * memcg-based memory accounting for BPF maps and programs. This was done in + * commit 97306be45fbe ("Merge branch 'switch to memcg-based memory + * accounting'"), in Linux 5.11. + * + * Libbpf also offers to probe for memcg-based accounting vs rlimit, but does + * so by checking for the availability of a given BPF helper and this has + * failed on some kernels with backports in the past, see commit 6b4384ff1088 + * ("Revert "bpftool: Use libbpf 1.0 API mode instead of RLIMIT_MEMLOCK""). + * Instead, we can probe by lowering the process-based rlimit to 0, trying to + * load a BPF object, and resetting the rlimit. If the load succeeds then + * memcg-based accounting is supported. + * + * This would be too dangerous to do in the library, because multithreaded + * applications might attempt to load items while the rlimit is at 0. Given + * that bpftool is single-threaded, this is fine to do here. + */ +static bool known_to_need_rlimit(void) +{ + struct rlimit rlim_init, rlim_cur_zero = {}; + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + size_t insn_cnt = ARRAY_SIZE(insns); + union bpf_attr attr; + int prog_fd, err; + + memset(&attr, 0, sizeof(attr)); + attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER; + attr.insns = ptr_to_u64(insns); + attr.insn_cnt = insn_cnt; + attr.license = ptr_to_u64("GPL"); + + if (getrlimit(RLIMIT_MEMLOCK, &rlim_init)) + return false; + + /* Drop the soft limit to zero. We maintain the hard limit to its + * current value, because lowering it would be a permanent operation + * for unprivileged users. + */ + rlim_cur_zero.rlim_max = rlim_init.rlim_max; + if (setrlimit(RLIMIT_MEMLOCK, &rlim_cur_zero)) + return false; + + /* Do not use bpf_prog_load() from libbpf here, because it calls + * bump_rlimit_memlock(), interfering with the current probe. + */ + prog_fd = syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr)); + err = errno; + + /* reset soft rlimit to its initial value */ + setrlimit(RLIMIT_MEMLOCK, &rlim_init); + + if (prog_fd < 0) + return err == EPERM; + + close(prog_fd); + return false; +} + +void set_max_rlimit(void) +{ + struct rlimit rinf = { RLIM_INFINITY, RLIM_INFINITY }; + + if (known_to_need_rlimit()) + setrlimit(RLIMIT_MEMLOCK, &rinf); +} + +static int +mnt_fs(const char *target, const char *type, char *buff, size_t bufflen) +{ + bool bind_done = false; + + while (mount("", target, "none", MS_PRIVATE | MS_REC, NULL)) { + if (errno != EINVAL || bind_done) { + snprintf(buff, bufflen, + "mount --make-private %s failed: %s", + target, strerror(errno)); + return -1; + } + + if (mount(target, target, "none", MS_BIND, NULL)) { + snprintf(buff, bufflen, + "mount --bind %s %s failed: %s", + target, target, strerror(errno)); + return -1; + } + + bind_done = true; + } + + if (mount(type, target, type, 0, "mode=0700")) { + snprintf(buff, bufflen, "mount -t %s %s %s failed: %s", + type, type, target, strerror(errno)); + return -1; + } + + return 0; +} + +int mount_tracefs(const char *target) +{ + char err_str[ERR_MAX_LEN]; + int err; + + err = mnt_fs(target, "tracefs", err_str, ERR_MAX_LEN); + if (err) { + err_str[ERR_MAX_LEN - 1] = '\0'; + p_err("can't mount tracefs: %s", err_str); + } + + return err; +} + +int open_obj_pinned(const char *path, bool quiet) +{ + char *pname; + int fd = -1; + + pname = strdup(path); + if (!pname) { + if (!quiet) + p_err("mem alloc failed"); + goto out_ret; + } + + fd = bpf_obj_get(pname); + if (fd < 0) { + if (!quiet) + p_err("bpf obj get (%s): %s", pname, + errno == EACCES && !is_bpffs(dirname(pname)) ? + "directory not in bpf file system (bpffs)" : + strerror(errno)); + goto out_free; + } + +out_free: + free(pname); +out_ret: + return fd; +} + +int open_obj_pinned_any(const char *path, enum bpf_obj_type exp_type) +{ + enum bpf_obj_type type; + int fd; + + fd = open_obj_pinned(path, false); + if (fd < 0) + return -1; + + type = get_fd_type(fd); + if (type < 0) { + close(fd); + return type; + } + if (type != exp_type) { + p_err("incorrect object type: %s", get_fd_type_name(type)); + close(fd); + return -1; + } + + return fd; +} + +int mount_bpffs_for_pin(const char *name) +{ + char err_str[ERR_MAX_LEN]; + char *file; + char *dir; + int err = 0; + + file = malloc(strlen(name) + 1); + if (!file) { + p_err("mem alloc failed"); + return -1; + } + + strcpy(file, name); + dir = dirname(file); + + if (is_bpffs(dir)) + /* nothing to do if already mounted */ + goto out_free; + + if (block_mount) { + p_err("no BPF file system found, not mounting it due to --nomount option"); + err = -1; + goto out_free; + } + + err = mnt_fs(dir, "bpf", err_str, ERR_MAX_LEN); + if (err) { + err_str[ERR_MAX_LEN - 1] = '\0'; + p_err("can't mount BPF file system to pin the object (%s): %s", + name, err_str); + } + +out_free: + free(file); + return err; +} + +int do_pin_fd(int fd, const char *name) +{ + int err; + + err = mount_bpffs_for_pin(name); + if (err) + return err; + + err = bpf_obj_pin(fd, name); + if (err) + p_err("can't pin the object (%s): %s", name, strerror(errno)); + + return err; +} + +int do_pin_any(int argc, char **argv, int (*get_fd)(int *, char ***)) +{ + int err; + int fd; + + if (!REQ_ARGS(3)) + return -EINVAL; + + fd = get_fd(&argc, &argv); + if (fd < 0) + return fd; + + err = do_pin_fd(fd, *argv); + + close(fd); + return err; +} + +const char *get_fd_type_name(enum bpf_obj_type type) +{ + static const char * const names[] = { + [BPF_OBJ_UNKNOWN] = "unknown", + [BPF_OBJ_PROG] = "prog", + [BPF_OBJ_MAP] = "map", + [BPF_OBJ_LINK] = "link", + }; + + if (type < 0 || type >= ARRAY_SIZE(names) || !names[type]) + return names[BPF_OBJ_UNKNOWN]; + + return names[type]; +} + +void get_prog_full_name(const struct bpf_prog_info *prog_info, int prog_fd, + char *name_buff, size_t buff_len) +{ + const char *prog_name = prog_info->name; + const struct btf_type *func_type; + const struct bpf_func_info finfo = {}; + struct bpf_prog_info info = {}; + __u32 info_len = sizeof(info); + struct btf *prog_btf = NULL; + + if (buff_len <= BPF_OBJ_NAME_LEN || + strlen(prog_info->name) < BPF_OBJ_NAME_LEN - 1) + goto copy_name; + + if (!prog_info->btf_id || prog_info->nr_func_info == 0) + goto copy_name; + + info.nr_func_info = 1; + info.func_info_rec_size = prog_info->func_info_rec_size; + if (info.func_info_rec_size > sizeof(finfo)) + info.func_info_rec_size = sizeof(finfo); + info.func_info = ptr_to_u64(&finfo); + + if (bpf_prog_get_info_by_fd(prog_fd, &info, &info_len)) + goto copy_name; + + prog_btf = btf__load_from_kernel_by_id(info.btf_id); + if (!prog_btf) + goto copy_name; + + func_type = btf__type_by_id(prog_btf, finfo.type_id); + if (!func_type || !btf_is_func(func_type)) + goto copy_name; + + prog_name = btf__name_by_offset(prog_btf, func_type->name_off); + +copy_name: + snprintf(name_buff, buff_len, "%s", prog_name); + + if (prog_btf) + btf__free(prog_btf); +} + +int get_fd_type(int fd) +{ + char path[PATH_MAX]; + char buf[512]; + ssize_t n; + + snprintf(path, sizeof(path), "/proc/self/fd/%d", fd); + + n = readlink(path, buf, sizeof(buf)); + if (n < 0) { + p_err("can't read link type: %s", strerror(errno)); + return -1; + } + if (n == sizeof(path)) { + p_err("can't read link type: path too long!"); + return -1; + } + + if (strstr(buf, "bpf-map")) + return BPF_OBJ_MAP; + else if (strstr(buf, "bpf-prog")) + return BPF_OBJ_PROG; + else if (strstr(buf, "bpf-link")) + return BPF_OBJ_LINK; + + return BPF_OBJ_UNKNOWN; +} + +char *get_fdinfo(int fd, const char *key) +{ + char path[PATH_MAX]; + char *line = NULL; + size_t line_n = 0; + ssize_t n; + FILE *fdi; + + snprintf(path, sizeof(path), "/proc/self/fdinfo/%d", fd); + + fdi = fopen(path, "r"); + if (!fdi) + return NULL; + + while ((n = getline(&line, &line_n, fdi)) > 0) { + char *value; + int len; + + if (!strstr(line, key)) + continue; + + fclose(fdi); + + value = strchr(line, '\t'); + if (!value || !value[1]) { + free(line); + return NULL; + } + value++; + + len = strlen(value); + memmove(line, value, len); + line[len - 1] = '\0'; + + return line; + } + + free(line); + fclose(fdi); + return NULL; +} + +void print_data_json(uint8_t *data, size_t len) +{ + unsigned int i; + + jsonw_start_array(json_wtr); + for (i = 0; i < len; i++) + jsonw_printf(json_wtr, "%d", data[i]); + jsonw_end_array(json_wtr); +} + +void print_hex_data_json(uint8_t *data, size_t len) +{ + unsigned int i; + + jsonw_start_array(json_wtr); + for (i = 0; i < len; i++) + jsonw_printf(json_wtr, "\"0x%02hhx\"", data[i]); + jsonw_end_array(json_wtr); +} + +/* extra params for nftw cb */ +static struct hashmap *build_fn_table; +static enum bpf_obj_type build_fn_type; + +static int do_build_table_cb(const char *fpath, const struct stat *sb, + int typeflag, struct FTW *ftwbuf) +{ + struct bpf_prog_info pinned_info; + __u32 len = sizeof(pinned_info); + enum bpf_obj_type objtype; + int fd, err = 0; + char *path; + + if (typeflag != FTW_F) + goto out_ret; + + fd = open_obj_pinned(fpath, true); + if (fd < 0) + goto out_ret; + + objtype = get_fd_type(fd); + if (objtype != build_fn_type) + goto out_close; + + memset(&pinned_info, 0, sizeof(pinned_info)); + if (bpf_prog_get_info_by_fd(fd, &pinned_info, &len)) + goto out_close; + + path = strdup(fpath); + if (!path) { + err = -1; + goto out_close; + } + + err = hashmap__append(build_fn_table, pinned_info.id, path); + if (err) { + p_err("failed to append entry to hashmap for ID %u, path '%s': %s", + pinned_info.id, path, strerror(errno)); + free(path); + goto out_close; + } + +out_close: + close(fd); +out_ret: + return err; +} + +int build_pinned_obj_table(struct hashmap *tab, + enum bpf_obj_type type) +{ + struct mntent *mntent = NULL; + FILE *mntfile = NULL; + int flags = FTW_PHYS; + int nopenfd = 16; + int err = 0; + + mntfile = setmntent("/proc/mounts", "r"); + if (!mntfile) + return -1; + + build_fn_table = tab; + build_fn_type = type; + + while ((mntent = getmntent(mntfile))) { + char *path = mntent->mnt_dir; + + if (strncmp(mntent->mnt_type, "bpf", 3) != 0) + continue; + err = nftw(path, do_build_table_cb, nopenfd, flags); + if (err) + break; + } + fclose(mntfile); + return err; +} + +void delete_pinned_obj_table(struct hashmap *map) +{ + struct hashmap_entry *entry; + size_t bkt; + + if (!map) + return; + + hashmap__for_each_entry(map, entry, bkt) + free(entry->pvalue); + + hashmap__free(map); +} + +unsigned int get_page_size(void) +{ + static int result; + + if (!result) + result = getpagesize(); + return result; +} + +unsigned int get_possible_cpus(void) +{ + int cpus = libbpf_num_possible_cpus(); + + if (cpus < 0) { + p_err("Can't get # of possible cpus: %s", strerror(-cpus)); + exit(-1); + } + return cpus; +} + +static char * +ifindex_to_name_ns(__u32 ifindex, __u32 ns_dev, __u32 ns_ino, char *buf) +{ + struct stat st; + int err; + + err = stat("/proc/self/ns/net", &st); + if (err) { + p_err("Can't stat /proc/self: %s", strerror(errno)); + return NULL; + } + + if (st.st_dev != ns_dev || st.st_ino != ns_ino) + return NULL; + + return if_indextoname(ifindex, buf); +} + +static int read_sysfs_hex_int(char *path) +{ + char vendor_id_buf[8]; + int len; + int fd; + + fd = open(path, O_RDONLY); + if (fd < 0) { + p_err("Can't open %s: %s", path, strerror(errno)); + return -1; + } + + len = read(fd, vendor_id_buf, sizeof(vendor_id_buf)); + close(fd); + if (len < 0) { + p_err("Can't read %s: %s", path, strerror(errno)); + return -1; + } + if (len >= (int)sizeof(vendor_id_buf)) { + p_err("Value in %s too long", path); + return -1; + } + + vendor_id_buf[len] = 0; + + return strtol(vendor_id_buf, NULL, 0); +} + +static int read_sysfs_netdev_hex_int(char *devname, const char *entry_name) +{ + char full_path[64]; + + snprintf(full_path, sizeof(full_path), "/sys/class/net/%s/device/%s", + devname, entry_name); + + return read_sysfs_hex_int(full_path); +} + +const char * +ifindex_to_arch(__u32 ifindex, __u64 ns_dev, __u64 ns_ino, const char **opt) +{ + __maybe_unused int device_id; + char devname[IF_NAMESIZE]; + int vendor_id; + + if (!ifindex_to_name_ns(ifindex, ns_dev, ns_ino, devname)) { + p_err("Can't get net device name for ifindex %d: %s", ifindex, + strerror(errno)); + return NULL; + } + + vendor_id = read_sysfs_netdev_hex_int(devname, "vendor"); + if (vendor_id < 0) { + p_err("Can't get device vendor id for %s", devname); + return NULL; + } + + switch (vendor_id) { +#ifdef HAVE_LIBBFD_SUPPORT + case 0x19ee: + device_id = read_sysfs_netdev_hex_int(devname, "device"); + if (device_id != 0x4000 && + device_id != 0x6000 && + device_id != 0x6003) + p_info("Unknown NFP device ID, assuming it is NFP-6xxx arch"); + *opt = "ctx4"; + return "NFP-6xxx"; +#endif /* HAVE_LIBBFD_SUPPORT */ + /* No NFP support in LLVM, we have no valid triple to return. */ + default: + p_err("Can't get arch name for device vendor id 0x%04x", + vendor_id); + return NULL; + } +} + +void print_dev_plain(__u32 ifindex, __u64 ns_dev, __u64 ns_inode) +{ + char name[IF_NAMESIZE]; + + if (!ifindex) + return; + + printf(" offloaded_to "); + if (ifindex_to_name_ns(ifindex, ns_dev, ns_inode, name)) + printf("%s", name); + else + printf("ifindex %u ns_dev %llu ns_ino %llu", + ifindex, ns_dev, ns_inode); +} + +void print_dev_json(__u32 ifindex, __u64 ns_dev, __u64 ns_inode) +{ + char name[IF_NAMESIZE]; + + if (!ifindex) + return; + + jsonw_name(json_wtr, "dev"); + jsonw_start_object(json_wtr); + jsonw_uint_field(json_wtr, "ifindex", ifindex); + jsonw_uint_field(json_wtr, "ns_dev", ns_dev); + jsonw_uint_field(json_wtr, "ns_inode", ns_inode); + if (ifindex_to_name_ns(ifindex, ns_dev, ns_inode, name)) + jsonw_string_field(json_wtr, "ifname", name); + jsonw_end_object(json_wtr); +} + +int parse_u32_arg(int *argc, char ***argv, __u32 *val, const char *what) +{ + char *endptr; + + NEXT_ARGP(); + + if (*val) { + p_err("%s already specified", what); + return -1; + } + + *val = strtoul(**argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as %s", **argv, what); + return -1; + } + NEXT_ARGP(); + + return 0; +} + +int __printf(2, 0) +print_all_levels(__maybe_unused enum libbpf_print_level level, + const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static int prog_fd_by_nametag(void *nametag, int **fds, bool tag) +{ + char prog_name[MAX_PROG_FULL_NAME]; + unsigned int id = 0; + int fd, nb_fds = 0; + void *tmp; + int err; + + while (true) { + struct bpf_prog_info info = {}; + __u32 len = sizeof(info); + + err = bpf_prog_get_next_id(id, &id); + if (err) { + if (errno != ENOENT) { + p_err("%s", strerror(errno)); + goto err_close_fds; + } + return nb_fds; + } + + fd = bpf_prog_get_fd_by_id(id); + if (fd < 0) { + p_err("can't get prog by id (%u): %s", + id, strerror(errno)); + goto err_close_fds; + } + + err = bpf_prog_get_info_by_fd(fd, &info, &len); + if (err) { + p_err("can't get prog info (%u): %s", + id, strerror(errno)); + goto err_close_fd; + } + + if (tag && memcmp(nametag, info.tag, BPF_TAG_SIZE)) { + close(fd); + continue; + } + + if (!tag) { + get_prog_full_name(&info, fd, prog_name, + sizeof(prog_name)); + if (strncmp(nametag, prog_name, sizeof(prog_name))) { + close(fd); + continue; + } + } + + if (nb_fds > 0) { + tmp = realloc(*fds, (nb_fds + 1) * sizeof(int)); + if (!tmp) { + p_err("failed to realloc"); + goto err_close_fd; + } + *fds = tmp; + } + (*fds)[nb_fds++] = fd; + } + +err_close_fd: + close(fd); +err_close_fds: + while (--nb_fds >= 0) + close((*fds)[nb_fds]); + return -1; +} + +int prog_parse_fds(int *argc, char ***argv, int **fds) +{ + if (is_prefix(**argv, "id")) { + unsigned int id; + char *endptr; + + NEXT_ARGP(); + + id = strtoul(**argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as ID", **argv); + return -1; + } + NEXT_ARGP(); + + (*fds)[0] = bpf_prog_get_fd_by_id(id); + if ((*fds)[0] < 0) { + p_err("get by id (%u): %s", id, strerror(errno)); + return -1; + } + return 1; + } else if (is_prefix(**argv, "tag")) { + unsigned char tag[BPF_TAG_SIZE]; + + NEXT_ARGP(); + + if (sscanf(**argv, BPF_TAG_FMT, tag, tag + 1, tag + 2, + tag + 3, tag + 4, tag + 5, tag + 6, tag + 7) + != BPF_TAG_SIZE) { + p_err("can't parse tag"); + return -1; + } + NEXT_ARGP(); + + return prog_fd_by_nametag(tag, fds, true); + } else if (is_prefix(**argv, "name")) { + char *name; + + NEXT_ARGP(); + + name = **argv; + if (strlen(name) > MAX_PROG_FULL_NAME - 1) { + p_err("can't parse name"); + return -1; + } + NEXT_ARGP(); + + return prog_fd_by_nametag(name, fds, false); + } else if (is_prefix(**argv, "pinned")) { + char *path; + + NEXT_ARGP(); + + path = **argv; + NEXT_ARGP(); + + (*fds)[0] = open_obj_pinned_any(path, BPF_OBJ_PROG); + if ((*fds)[0] < 0) + return -1; + return 1; + } + + p_err("expected 'id', 'tag', 'name' or 'pinned', got: '%s'?", **argv); + return -1; +} + +int prog_parse_fd(int *argc, char ***argv) +{ + int *fds = NULL; + int nb_fds, fd; + + fds = malloc(sizeof(int)); + if (!fds) { + p_err("mem alloc failed"); + return -1; + } + nb_fds = prog_parse_fds(argc, argv, &fds); + if (nb_fds != 1) { + if (nb_fds > 1) { + p_err("several programs match this handle"); + while (nb_fds--) + close(fds[nb_fds]); + } + fd = -1; + goto exit_free; + } + + fd = fds[0]; +exit_free: + free(fds); + return fd; +} + +static int map_fd_by_name(char *name, int **fds) +{ + unsigned int id = 0; + int fd, nb_fds = 0; + void *tmp; + int err; + + while (true) { + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + + err = bpf_map_get_next_id(id, &id); + if (err) { + if (errno != ENOENT) { + p_err("%s", strerror(errno)); + goto err_close_fds; + } + return nb_fds; + } + + fd = bpf_map_get_fd_by_id(id); + if (fd < 0) { + p_err("can't get map by id (%u): %s", + id, strerror(errno)); + goto err_close_fds; + } + + err = bpf_map_get_info_by_fd(fd, &info, &len); + if (err) { + p_err("can't get map info (%u): %s", + id, strerror(errno)); + goto err_close_fd; + } + + if (strncmp(name, info.name, BPF_OBJ_NAME_LEN)) { + close(fd); + continue; + } + + if (nb_fds > 0) { + tmp = realloc(*fds, (nb_fds + 1) * sizeof(int)); + if (!tmp) { + p_err("failed to realloc"); + goto err_close_fd; + } + *fds = tmp; + } + (*fds)[nb_fds++] = fd; + } + +err_close_fd: + close(fd); +err_close_fds: + while (--nb_fds >= 0) + close((*fds)[nb_fds]); + return -1; +} + +int map_parse_fds(int *argc, char ***argv, int **fds) +{ + if (is_prefix(**argv, "id")) { + unsigned int id; + char *endptr; + + NEXT_ARGP(); + + id = strtoul(**argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as ID", **argv); + return -1; + } + NEXT_ARGP(); + + (*fds)[0] = bpf_map_get_fd_by_id(id); + if ((*fds)[0] < 0) { + p_err("get map by id (%u): %s", id, strerror(errno)); + return -1; + } + return 1; + } else if (is_prefix(**argv, "name")) { + char *name; + + NEXT_ARGP(); + + name = **argv; + if (strlen(name) > BPF_OBJ_NAME_LEN - 1) { + p_err("can't parse name"); + return -1; + } + NEXT_ARGP(); + + return map_fd_by_name(name, fds); + } else if (is_prefix(**argv, "pinned")) { + char *path; + + NEXT_ARGP(); + + path = **argv; + NEXT_ARGP(); + + (*fds)[0] = open_obj_pinned_any(path, BPF_OBJ_MAP); + if ((*fds)[0] < 0) + return -1; + return 1; + } + + p_err("expected 'id', 'name' or 'pinned', got: '%s'?", **argv); + return -1; +} + +int map_parse_fd(int *argc, char ***argv) +{ + int *fds = NULL; + int nb_fds, fd; + + fds = malloc(sizeof(int)); + if (!fds) { + p_err("mem alloc failed"); + return -1; + } + nb_fds = map_parse_fds(argc, argv, &fds); + if (nb_fds != 1) { + if (nb_fds > 1) { + p_err("several maps match this handle"); + while (nb_fds--) + close(fds[nb_fds]); + } + fd = -1; + goto exit_free; + } + + fd = fds[0]; +exit_free: + free(fds); + return fd; +} + +int map_parse_fd_and_info(int *argc, char ***argv, struct bpf_map_info *info, + __u32 *info_len) +{ + int err; + int fd; + + fd = map_parse_fd(argc, argv); + if (fd < 0) + return -1; + + err = bpf_map_get_info_by_fd(fd, info, info_len); + if (err) { + p_err("can't get map info: %s", strerror(errno)); + close(fd); + return err; + } + + return fd; +} + +size_t hash_fn_for_key_as_id(long key, void *ctx) +{ + return key; +} + +bool equal_fn_for_key_as_id(long k1, long k2, void *ctx) +{ + return k1 == k2; +} + +const char *bpf_attach_type_input_str(enum bpf_attach_type t) +{ + switch (t) { + case BPF_CGROUP_INET_INGRESS: return "ingress"; + case BPF_CGROUP_INET_EGRESS: return "egress"; + case BPF_CGROUP_INET_SOCK_CREATE: return "sock_create"; + case BPF_CGROUP_INET_SOCK_RELEASE: return "sock_release"; + case BPF_CGROUP_SOCK_OPS: return "sock_ops"; + case BPF_CGROUP_DEVICE: return "device"; + case BPF_CGROUP_INET4_BIND: return "bind4"; + case BPF_CGROUP_INET6_BIND: return "bind6"; + case BPF_CGROUP_INET4_CONNECT: return "connect4"; + case BPF_CGROUP_INET6_CONNECT: return "connect6"; + case BPF_CGROUP_INET4_POST_BIND: return "post_bind4"; + case BPF_CGROUP_INET6_POST_BIND: return "post_bind6"; + case BPF_CGROUP_INET4_GETPEERNAME: return "getpeername4"; + case BPF_CGROUP_INET6_GETPEERNAME: return "getpeername6"; + case BPF_CGROUP_INET4_GETSOCKNAME: return "getsockname4"; + case BPF_CGROUP_INET6_GETSOCKNAME: return "getsockname6"; + case BPF_CGROUP_UDP4_SENDMSG: return "sendmsg4"; + case BPF_CGROUP_UDP6_SENDMSG: return "sendmsg6"; + case BPF_CGROUP_SYSCTL: return "sysctl"; + case BPF_CGROUP_UDP4_RECVMSG: return "recvmsg4"; + case BPF_CGROUP_UDP6_RECVMSG: return "recvmsg6"; + case BPF_CGROUP_GETSOCKOPT: return "getsockopt"; + case BPF_CGROUP_SETSOCKOPT: return "setsockopt"; + case BPF_TRACE_RAW_TP: return "raw_tp"; + case BPF_TRACE_FENTRY: return "fentry"; + case BPF_TRACE_FEXIT: return "fexit"; + case BPF_MODIFY_RETURN: return "mod_ret"; + case BPF_SK_REUSEPORT_SELECT: return "sk_skb_reuseport_select"; + case BPF_SK_REUSEPORT_SELECT_OR_MIGRATE: return "sk_skb_reuseport_select_or_migrate"; + default: return libbpf_bpf_attach_type_str(t); + } +} diff --git a/bpftool/src/feature.c b/bpftool/src/feature.c new file mode 100644 index 0000000..da16e6a --- /dev/null +++ b/bpftool/src/feature.c @@ -0,0 +1,1344 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (c) 2019 Netronome Systems, Inc. */ + +#include +#include +#include +#include +#include +#include +#ifdef USE_LIBCAP +#include +#endif +#include +#include + +#include +#include + +#include +#include +#include + +#include "main.h" + +#ifndef PROC_SUPER_MAGIC +# define PROC_SUPER_MAGIC 0x9fa0 +#endif + +enum probe_component { + COMPONENT_UNSPEC, + COMPONENT_KERNEL, + COMPONENT_DEVICE, +}; + +#define BPF_HELPER_MAKE_ENTRY(name) [BPF_FUNC_ ## name] = "bpf_" # name +static const char * const helper_name[] = { + __BPF_FUNC_MAPPER(BPF_HELPER_MAKE_ENTRY) +}; + +#undef BPF_HELPER_MAKE_ENTRY + +static bool full_mode; +#ifdef USE_LIBCAP +static bool run_as_unprivileged; +#endif + +/* Miscellaneous utility functions */ + +static bool grep(const char *buffer, const char *pattern) +{ + return !!strstr(buffer, pattern); +} + +static bool check_procfs(void) +{ + struct statfs st_fs; + + if (statfs("/proc", &st_fs) < 0) + return false; + if ((unsigned long)st_fs.f_type != PROC_SUPER_MAGIC) + return false; + + return true; +} + +static void uppercase(char *str, size_t len) +{ + size_t i; + + for (i = 0; i < len && str[i] != '\0'; i++) + str[i] = toupper(str[i]); +} + +/* Printing utility functions */ + +static void +print_bool_feature(const char *feat_name, const char *plain_name, + const char *define_name, bool res, const char *define_prefix) +{ + if (json_output) + jsonw_bool_field(json_wtr, feat_name, res); + else if (define_prefix) + printf("#define %s%sHAVE_%s\n", define_prefix, + res ? "" : "NO_", define_name); + else + printf("%s is %savailable\n", plain_name, res ? "" : "NOT "); +} + +static void print_kernel_option(const char *name, const char *value, + const char *define_prefix) +{ + char *endptr; + int res; + + if (json_output) { + if (!value) { + jsonw_null_field(json_wtr, name); + return; + } + errno = 0; + res = strtol(value, &endptr, 0); + if (!errno && *endptr == '\n') + jsonw_int_field(json_wtr, name, res); + else + jsonw_string_field(json_wtr, name, value); + } else if (define_prefix) { + if (value) + printf("#define %s%s %s\n", define_prefix, + name, value); + else + printf("/* %s%s is not set */\n", define_prefix, name); + } else { + if (value) + printf("%s is set to %s\n", name, value); + else + printf("%s is not set\n", name); + } +} + +static void +print_start_section(const char *json_title, const char *plain_title, + const char *define_comment, const char *define_prefix) +{ + if (json_output) { + jsonw_name(json_wtr, json_title); + jsonw_start_object(json_wtr); + } else if (define_prefix) { + printf("%s\n", define_comment); + } else { + printf("%s\n", plain_title); + } +} + +static void print_end_section(void) +{ + if (json_output) + jsonw_end_object(json_wtr); + else + printf("\n"); +} + +/* Probing functions */ + +static int get_vendor_id(int ifindex) +{ + char ifname[IF_NAMESIZE], path[64], buf[8]; + ssize_t len; + int fd; + + if (!if_indextoname(ifindex, ifname)) + return -1; + + snprintf(path, sizeof(path), "/sys/class/net/%s/device/vendor", ifname); + + fd = open(path, O_RDONLY | O_CLOEXEC); + if (fd < 0) + return -1; + + len = read(fd, buf, sizeof(buf)); + close(fd); + if (len < 0) + return -1; + if (len >= (ssize_t)sizeof(buf)) + return -1; + buf[len] = '\0'; + + return strtol(buf, NULL, 0); +} + +static int read_procfs(const char *path) +{ + char *endptr, *line = NULL; + size_t len = 0; + FILE *fd; + int res; + + fd = fopen(path, "r"); + if (!fd) + return -1; + + res = getline(&line, &len, fd); + fclose(fd); + if (res < 0) + return -1; + + errno = 0; + res = strtol(line, &endptr, 10); + if (errno || *line == '\0' || *endptr != '\n') + res = -1; + free(line); + + return res; +} + +static void probe_unprivileged_disabled(void) +{ + int res; + + /* No support for C-style ouptut */ + + res = read_procfs("/proc/sys/kernel/unprivileged_bpf_disabled"); + if (json_output) { + jsonw_int_field(json_wtr, "unprivileged_bpf_disabled", res); + } else { + switch (res) { + case 0: + printf("bpf() syscall for unprivileged users is enabled\n"); + break; + case 1: + printf("bpf() syscall restricted to privileged users (without recovery)\n"); + break; + case 2: + printf("bpf() syscall restricted to privileged users (admin can change)\n"); + break; + case -1: + printf("Unable to retrieve required privileges for bpf() syscall\n"); + break; + default: + printf("bpf() syscall restriction has unknown value %d\n", res); + } + } +} + +static void probe_jit_enable(void) +{ + int res; + + /* No support for C-style ouptut */ + + res = read_procfs("/proc/sys/net/core/bpf_jit_enable"); + if (json_output) { + jsonw_int_field(json_wtr, "bpf_jit_enable", res); + } else { + switch (res) { + case 0: + printf("JIT compiler is disabled\n"); + break; + case 1: + printf("JIT compiler is enabled\n"); + break; + case 2: + printf("JIT compiler is enabled with debugging traces in kernel logs\n"); + break; + case -1: + printf("Unable to retrieve JIT-compiler status\n"); + break; + default: + printf("JIT-compiler status has unknown value %d\n", + res); + } + } +} + +static void probe_jit_harden(void) +{ + int res; + + /* No support for C-style ouptut */ + + res = read_procfs("/proc/sys/net/core/bpf_jit_harden"); + if (json_output) { + jsonw_int_field(json_wtr, "bpf_jit_harden", res); + } else { + switch (res) { + case 0: + printf("JIT compiler hardening is disabled\n"); + break; + case 1: + printf("JIT compiler hardening is enabled for unprivileged users\n"); + break; + case 2: + printf("JIT compiler hardening is enabled for all users\n"); + break; + case -1: + printf("Unable to retrieve JIT hardening status\n"); + break; + default: + printf("JIT hardening status has unknown value %d\n", + res); + } + } +} + +static void probe_jit_kallsyms(void) +{ + int res; + + /* No support for C-style ouptut */ + + res = read_procfs("/proc/sys/net/core/bpf_jit_kallsyms"); + if (json_output) { + jsonw_int_field(json_wtr, "bpf_jit_kallsyms", res); + } else { + switch (res) { + case 0: + printf("JIT compiler kallsyms exports are disabled\n"); + break; + case 1: + printf("JIT compiler kallsyms exports are enabled for root\n"); + break; + case -1: + printf("Unable to retrieve JIT kallsyms export status\n"); + break; + default: + printf("JIT kallsyms exports status has unknown value %d\n", res); + } + } +} + +static void probe_jit_limit(void) +{ + int res; + + /* No support for C-style ouptut */ + + res = read_procfs("/proc/sys/net/core/bpf_jit_limit"); + if (json_output) { + jsonw_int_field(json_wtr, "bpf_jit_limit", res); + } else { + switch (res) { + case -1: + printf("Unable to retrieve global memory limit for JIT compiler for unprivileged users\n"); + break; + default: + printf("Global memory limit for JIT compiler for unprivileged users is %d bytes\n", res); + } + } +} + +static bool read_next_kernel_config_option(gzFile file, char *buf, size_t n, + char **value) +{ + char *sep; + + while (gzgets(file, buf, n)) { + if (strncmp(buf, "CONFIG_", 7)) + continue; + + sep = strchr(buf, '='); + if (!sep) + continue; + + /* Trim ending '\n' */ + buf[strlen(buf) - 1] = '\0'; + + /* Split on '=' and ensure that a value is present. */ + *sep = '\0'; + if (!sep[1]) + continue; + + *value = sep + 1; + return true; + } + + return false; +} + +static void probe_kernel_image_config(const char *define_prefix) +{ + static const struct { + const char * const name; + bool macro_dump; + } options[] = { + /* Enable BPF */ + { "CONFIG_BPF", }, + /* Enable bpf() syscall */ + { "CONFIG_BPF_SYSCALL", }, + /* Does selected architecture support eBPF JIT compiler */ + { "CONFIG_HAVE_EBPF_JIT", }, + /* Compile eBPF JIT compiler */ + { "CONFIG_BPF_JIT", }, + /* Avoid compiling eBPF interpreter (use JIT only) */ + { "CONFIG_BPF_JIT_ALWAYS_ON", }, + /* Kernel BTF debug information available */ + { "CONFIG_DEBUG_INFO_BTF", }, + /* Kernel module BTF debug information available */ + { "CONFIG_DEBUG_INFO_BTF_MODULES", }, + + /* cgroups */ + { "CONFIG_CGROUPS", }, + /* BPF programs attached to cgroups */ + { "CONFIG_CGROUP_BPF", }, + /* bpf_get_cgroup_classid() helper */ + { "CONFIG_CGROUP_NET_CLASSID", }, + /* bpf_skb_{,ancestor_}cgroup_id() helpers */ + { "CONFIG_SOCK_CGROUP_DATA", }, + + /* Tracing: attach BPF to kprobes, tracepoints, etc. */ + { "CONFIG_BPF_EVENTS", }, + /* Kprobes */ + { "CONFIG_KPROBE_EVENTS", }, + /* Uprobes */ + { "CONFIG_UPROBE_EVENTS", }, + /* Tracepoints */ + { "CONFIG_TRACING", }, + /* Syscall tracepoints */ + { "CONFIG_FTRACE_SYSCALLS", }, + /* bpf_override_return() helper support for selected arch */ + { "CONFIG_FUNCTION_ERROR_INJECTION", }, + /* bpf_override_return() helper */ + { "CONFIG_BPF_KPROBE_OVERRIDE", }, + + /* Network */ + { "CONFIG_NET", }, + /* AF_XDP sockets */ + { "CONFIG_XDP_SOCKETS", }, + /* BPF_PROG_TYPE_LWT_* and related helpers */ + { "CONFIG_LWTUNNEL_BPF", }, + /* BPF_PROG_TYPE_SCHED_ACT, TC (traffic control) actions */ + { "CONFIG_NET_ACT_BPF", }, + /* BPF_PROG_TYPE_SCHED_CLS, TC filters */ + { "CONFIG_NET_CLS_BPF", }, + /* TC clsact qdisc */ + { "CONFIG_NET_CLS_ACT", }, + /* Ingress filtering with TC */ + { "CONFIG_NET_SCH_INGRESS", }, + /* bpf_skb_get_xfrm_state() helper */ + { "CONFIG_XFRM", }, + /* bpf_get_route_realm() helper */ + { "CONFIG_IP_ROUTE_CLASSID", }, + /* BPF_PROG_TYPE_LWT_SEG6_LOCAL and related helpers */ + { "CONFIG_IPV6_SEG6_BPF", }, + /* BPF_PROG_TYPE_LIRC_MODE2 and related helpers */ + { "CONFIG_BPF_LIRC_MODE2", }, + /* BPF stream parser and BPF socket maps */ + { "CONFIG_BPF_STREAM_PARSER", }, + /* xt_bpf module for passing BPF programs to netfilter */ + { "CONFIG_NETFILTER_XT_MATCH_BPF", }, + /* bpfilter back-end for iptables */ + { "CONFIG_BPFILTER", }, + /* bpftilter module with "user mode helper" */ + { "CONFIG_BPFILTER_UMH", }, + + /* test_bpf module for BPF tests */ + { "CONFIG_TEST_BPF", }, + + /* Misc configs useful in BPF C programs */ + /* jiffies <-> sec conversion for bpf_jiffies64() helper */ + { "CONFIG_HZ", true, } + }; + char *values[ARRAY_SIZE(options)] = { }; + struct utsname utsn; + char path[PATH_MAX]; + gzFile file = NULL; + char buf[4096]; + char *value; + size_t i; + + if (!uname(&utsn)) { + snprintf(path, sizeof(path), "/boot/config-%s", utsn.release); + + /* gzopen also accepts uncompressed files. */ + file = gzopen(path, "r"); + } + + if (!file) { + /* Some distributions build with CONFIG_IKCONFIG=y and put the + * config file at /proc/config.gz. + */ + file = gzopen("/proc/config.gz", "r"); + } + if (!file) { + p_info("skipping kernel config, can't open file: %s", + strerror(errno)); + goto end_parse; + } + /* Sanity checks */ + if (!gzgets(file, buf, sizeof(buf)) || + !gzgets(file, buf, sizeof(buf))) { + p_info("skipping kernel config, can't read from file: %s", + strerror(errno)); + goto end_parse; + } + if (strcmp(buf, "# Automatically generated file; DO NOT EDIT.\n")) { + p_info("skipping kernel config, can't find correct file"); + goto end_parse; + } + + while (read_next_kernel_config_option(file, buf, sizeof(buf), &value)) { + for (i = 0; i < ARRAY_SIZE(options); i++) { + if ((define_prefix && !options[i].macro_dump) || + values[i] || strcmp(buf, options[i].name)) + continue; + + values[i] = strdup(value); + } + } + + for (i = 0; i < ARRAY_SIZE(options); i++) { + if (define_prefix && !options[i].macro_dump) + continue; + print_kernel_option(options[i].name, values[i], define_prefix); + free(values[i]); + } + +end_parse: + if (file) + gzclose(file); +} + +static bool probe_bpf_syscall(const char *define_prefix) +{ + bool res; + + bpf_prog_load(BPF_PROG_TYPE_UNSPEC, NULL, NULL, NULL, 0, NULL); + res = (errno != ENOSYS); + + print_bool_feature("have_bpf_syscall", + "bpf() syscall", + "BPF_SYSCALL", + res, define_prefix); + + return res; +} + +static bool +probe_prog_load_ifindex(enum bpf_prog_type prog_type, + const struct bpf_insn *insns, size_t insns_cnt, + char *log_buf, size_t log_buf_sz, + __u32 ifindex) +{ + LIBBPF_OPTS(bpf_prog_load_opts, opts, + .log_buf = log_buf, + .log_size = log_buf_sz, + .log_level = log_buf ? 1 : 0, + .prog_ifindex = ifindex, + ); + int fd; + + errno = 0; + fd = bpf_prog_load(prog_type, NULL, "GPL", insns, insns_cnt, &opts); + if (fd >= 0) + close(fd); + + return fd >= 0 && errno != EINVAL && errno != EOPNOTSUPP; +} + +static bool probe_prog_type_ifindex(enum bpf_prog_type prog_type, __u32 ifindex) +{ + /* nfp returns -EINVAL on exit(0) with TC offload */ + struct bpf_insn insns[2] = { + BPF_MOV64_IMM(BPF_REG_0, 2), + BPF_EXIT_INSN() + }; + + return probe_prog_load_ifindex(prog_type, insns, ARRAY_SIZE(insns), + NULL, 0, ifindex); +} + +static void +probe_prog_type(enum bpf_prog_type prog_type, const char *prog_type_str, + bool *supported_types, const char *define_prefix, __u32 ifindex) +{ + char feat_name[128], plain_desc[128], define_name[128]; + const char *plain_comment = "eBPF program_type "; + size_t maxlen; + bool res; + + if (ifindex) { + switch (prog_type) { + case BPF_PROG_TYPE_SCHED_CLS: + case BPF_PROG_TYPE_XDP: + break; + default: + return; + } + + res = probe_prog_type_ifindex(prog_type, ifindex); + } else { + res = libbpf_probe_bpf_prog_type(prog_type, NULL) > 0; + } + +#ifdef USE_LIBCAP + /* Probe may succeed even if program load fails, for unprivileged users + * check that we did not fail because of insufficient permissions + */ + if (run_as_unprivileged && errno == EPERM) + res = false; +#endif + + supported_types[prog_type] |= res; + + maxlen = sizeof(plain_desc) - strlen(plain_comment) - 1; + if (strlen(prog_type_str) > maxlen) { + p_info("program type name too long"); + return; + } + + sprintf(feat_name, "have_%s_prog_type", prog_type_str); + sprintf(define_name, "%s_prog_type", prog_type_str); + uppercase(define_name, sizeof(define_name)); + sprintf(plain_desc, "%s%s", plain_comment, prog_type_str); + print_bool_feature(feat_name, plain_desc, define_name, res, + define_prefix); +} + +static bool probe_map_type_ifindex(enum bpf_map_type map_type, __u32 ifindex) +{ + LIBBPF_OPTS(bpf_map_create_opts, opts); + int key_size, value_size, max_entries; + int fd; + + opts.map_ifindex = ifindex; + + key_size = sizeof(__u32); + value_size = sizeof(__u32); + max_entries = 1; + + fd = bpf_map_create(map_type, NULL, key_size, value_size, max_entries, + &opts); + if (fd >= 0) + close(fd); + + return fd >= 0; +} + +static void +probe_map_type(enum bpf_map_type map_type, char const *map_type_str, + const char *define_prefix, __u32 ifindex) +{ + char feat_name[128], plain_desc[128], define_name[128]; + const char *plain_comment = "eBPF map_type "; + size_t maxlen; + bool res; + + if (ifindex) { + switch (map_type) { + case BPF_MAP_TYPE_HASH: + case BPF_MAP_TYPE_ARRAY: + break; + default: + return; + } + + res = probe_map_type_ifindex(map_type, ifindex); + } else { + res = libbpf_probe_bpf_map_type(map_type, NULL) > 0; + } + + /* Probe result depends on the success of map creation, no additional + * check required for unprivileged users + */ + + maxlen = sizeof(plain_desc) - strlen(plain_comment) - 1; + if (strlen(map_type_str) > maxlen) { + p_info("map type name too long"); + return; + } + + sprintf(feat_name, "have_%s_map_type", map_type_str); + sprintf(define_name, "%s_map_type", map_type_str); + uppercase(define_name, sizeof(define_name)); + sprintf(plain_desc, "%s%s", plain_comment, map_type_str); + print_bool_feature(feat_name, plain_desc, define_name, res, + define_prefix); +} + +static bool +probe_helper_ifindex(enum bpf_func_id id, enum bpf_prog_type prog_type, + __u32 ifindex) +{ + struct bpf_insn insns[2] = { + BPF_EMIT_CALL(id), + BPF_EXIT_INSN() + }; + char buf[4096] = {}; + bool res; + + probe_prog_load_ifindex(prog_type, insns, ARRAY_SIZE(insns), buf, + sizeof(buf), ifindex); + res = !grep(buf, "invalid func ") && !grep(buf, "unknown func "); + + switch (get_vendor_id(ifindex)) { + case 0x19ee: /* Netronome specific */ + res = res && !grep(buf, "not supported by FW") && + !grep(buf, "unsupported function id"); + break; + default: + break; + } + + return res; +} + +static bool +probe_helper_for_progtype(enum bpf_prog_type prog_type, bool supported_type, + const char *define_prefix, unsigned int id, + const char *ptype_name, __u32 ifindex) +{ + bool res = false; + + if (supported_type) { + if (ifindex) + res = probe_helper_ifindex(id, prog_type, ifindex); + else + res = libbpf_probe_bpf_helper(prog_type, id, NULL) > 0; +#ifdef USE_LIBCAP + /* Probe may succeed even if program load fails, for + * unprivileged users check that we did not fail because of + * insufficient permissions + */ + if (run_as_unprivileged && errno == EPERM) + res = false; +#endif + } + + if (json_output) { + if (res) + jsonw_string(json_wtr, helper_name[id]); + } else if (define_prefix) { + printf("#define %sBPF__PROG_TYPE_%s__HELPER_%s %s\n", + define_prefix, ptype_name, helper_name[id], + res ? "1" : "0"); + } else { + if (res) + printf("\n\t- %s", helper_name[id]); + } + + return res; +} + +static void +probe_helpers_for_progtype(enum bpf_prog_type prog_type, + const char *prog_type_str, bool supported_type, + const char *define_prefix, __u32 ifindex) +{ + char feat_name[128]; + unsigned int id; + bool probe_res = false; + + if (ifindex) + /* Only test helpers for offload-able program types */ + switch (prog_type) { + case BPF_PROG_TYPE_SCHED_CLS: + case BPF_PROG_TYPE_XDP: + break; + default: + return; + } + + if (json_output) { + sprintf(feat_name, "%s_available_helpers", prog_type_str); + jsonw_name(json_wtr, feat_name); + jsonw_start_array(json_wtr); + } else if (!define_prefix) { + printf("eBPF helpers supported for program type %s:", + prog_type_str); + } + + for (id = 1; id < ARRAY_SIZE(helper_name); id++) { + /* Skip helper functions which emit dmesg messages when not in + * the full mode. + */ + switch (id) { + case BPF_FUNC_trace_printk: + case BPF_FUNC_trace_vprintk: + case BPF_FUNC_probe_write_user: + if (!full_mode) + continue; + /* fallthrough */ + default: + probe_res |= probe_helper_for_progtype(prog_type, supported_type, + define_prefix, id, prog_type_str, + ifindex); + } + } + + if (json_output) + jsonw_end_array(json_wtr); + else if (!define_prefix) { + printf("\n"); + if (!probe_res) { + if (!supported_type) + printf("\tProgram type not supported\n"); + else + printf("\tCould not determine which helpers are available\n"); + } + } + + +} + +static void +probe_misc_feature(struct bpf_insn *insns, size_t len, + const char *define_prefix, __u32 ifindex, + const char *feat_name, const char *plain_name, + const char *define_name) +{ + LIBBPF_OPTS(bpf_prog_load_opts, opts, + .prog_ifindex = ifindex, + ); + bool res; + int fd; + + errno = 0; + fd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", + insns, len, &opts); + res = fd >= 0 || !errno; + + if (fd >= 0) + close(fd); + + print_bool_feature(feat_name, plain_name, define_name, res, + define_prefix); +} + +/* + * Probe for availability of kernel commit (5.3): + * + * c04c0d2b968a ("bpf: increase complexity limit and maximum program size") + */ +static void probe_large_insn_limit(const char *define_prefix, __u32 ifindex) +{ + struct bpf_insn insns[BPF_MAXINSNS + 1]; + int i; + + for (i = 0; i < BPF_MAXINSNS; i++) + insns[i] = BPF_MOV64_IMM(BPF_REG_0, 1); + insns[BPF_MAXINSNS] = BPF_EXIT_INSN(); + + probe_misc_feature(insns, ARRAY_SIZE(insns), + define_prefix, ifindex, + "have_large_insn_limit", + "Large program size limit", + "LARGE_INSN_LIMIT"); +} + +/* + * Probe for bounded loop support introduced in commit 2589726d12a1 + * ("bpf: introduce bounded loops"). + */ +static void +probe_bounded_loops(const char *define_prefix, __u32 ifindex) +{ + struct bpf_insn insns[4] = { + BPF_MOV64_IMM(BPF_REG_0, 10), + BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 1), + BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, -2), + BPF_EXIT_INSN() + }; + + probe_misc_feature(insns, ARRAY_SIZE(insns), + define_prefix, ifindex, + "have_bounded_loops", + "Bounded loop support", + "BOUNDED_LOOPS"); +} + +/* + * Probe for the v2 instruction set extension introduced in commit 92b31a9af73b + * ("bpf: add BPF_J{LT,LE,SLT,SLE} instructions"). + */ +static void +probe_v2_isa_extension(const char *define_prefix, __u32 ifindex) +{ + struct bpf_insn insns[4] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 0, 1), + BPF_MOV64_IMM(BPF_REG_0, 1), + BPF_EXIT_INSN() + }; + + probe_misc_feature(insns, ARRAY_SIZE(insns), + define_prefix, ifindex, + "have_v2_isa_extension", + "ISA extension v2", + "V2_ISA_EXTENSION"); +} + +/* + * Probe for the v3 instruction set extension introduced in commit 092ed0968bb6 + * ("bpf: verifier support JMP32"). + */ +static void +probe_v3_isa_extension(const char *define_prefix, __u32 ifindex) +{ + struct bpf_insn insns[4] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_JMP32_IMM(BPF_JLT, BPF_REG_0, 0, 1), + BPF_MOV64_IMM(BPF_REG_0, 1), + BPF_EXIT_INSN() + }; + + probe_misc_feature(insns, ARRAY_SIZE(insns), + define_prefix, ifindex, + "have_v3_isa_extension", + "ISA extension v3", + "V3_ISA_EXTENSION"); +} + +static void +section_system_config(enum probe_component target, const char *define_prefix) +{ + switch (target) { + case COMPONENT_KERNEL: + case COMPONENT_UNSPEC: + print_start_section("system_config", + "Scanning system configuration...", + "/*** Misc kernel config items ***/", + define_prefix); + if (!define_prefix) { + if (check_procfs()) { + probe_unprivileged_disabled(); + probe_jit_enable(); + probe_jit_harden(); + probe_jit_kallsyms(); + probe_jit_limit(); + } else { + p_info("/* procfs not mounted, skipping related probes */"); + } + } + probe_kernel_image_config(define_prefix); + print_end_section(); + break; + default: + break; + } +} + +static bool section_syscall_config(const char *define_prefix) +{ + bool res; + + print_start_section("syscall_config", + "Scanning system call availability...", + "/*** System call availability ***/", + define_prefix); + res = probe_bpf_syscall(define_prefix); + print_end_section(); + + return res; +} + +static void +section_program_types(bool *supported_types, const char *define_prefix, + __u32 ifindex) +{ + unsigned int prog_type = BPF_PROG_TYPE_UNSPEC; + const char *prog_type_str; + + print_start_section("program_types", + "Scanning eBPF program types...", + "/*** eBPF program types ***/", + define_prefix); + + while (true) { + prog_type++; + prog_type_str = libbpf_bpf_prog_type_str(prog_type); + /* libbpf will return NULL for variants unknown to it. */ + if (!prog_type_str) + break; + + probe_prog_type(prog_type, prog_type_str, supported_types, define_prefix, + ifindex); + } + + print_end_section(); +} + +static void section_map_types(const char *define_prefix, __u32 ifindex) +{ + unsigned int map_type = BPF_MAP_TYPE_UNSPEC; + const char *map_type_str; + + print_start_section("map_types", + "Scanning eBPF map types...", + "/*** eBPF map types ***/", + define_prefix); + + while (true) { + map_type++; + map_type_str = libbpf_bpf_map_type_str(map_type); + /* libbpf will return NULL for variants unknown to it. */ + if (!map_type_str) + break; + + probe_map_type(map_type, map_type_str, define_prefix, ifindex); + } + + print_end_section(); +} + +static void +section_helpers(bool *supported_types, const char *define_prefix, __u32 ifindex) +{ + unsigned int prog_type = BPF_PROG_TYPE_UNSPEC; + const char *prog_type_str; + + print_start_section("helpers", + "Scanning eBPF helper functions...", + "/*** eBPF helper functions ***/", + define_prefix); + + if (define_prefix) + printf("/*\n" + " * Use %sHAVE_PROG_TYPE_HELPER(prog_type_name, helper_name)\n" + " * to determine if is available for ,\n" + " * e.g.\n" + " * #if %sHAVE_PROG_TYPE_HELPER(xdp, bpf_redirect)\n" + " * // do stuff with this helper\n" + " * #elif\n" + " * // use a workaround\n" + " * #endif\n" + " */\n" + "#define %sHAVE_PROG_TYPE_HELPER(prog_type, helper) \\\n" + " %sBPF__PROG_TYPE_ ## prog_type ## __HELPER_ ## helper\n", + define_prefix, define_prefix, define_prefix, + define_prefix); + while (true) { + prog_type++; + prog_type_str = libbpf_bpf_prog_type_str(prog_type); + /* libbpf will return NULL for variants unknown to it. */ + if (!prog_type_str) + break; + + probe_helpers_for_progtype(prog_type, prog_type_str, + supported_types[prog_type], + define_prefix, + ifindex); + } + + print_end_section(); +} + +static void section_misc(const char *define_prefix, __u32 ifindex) +{ + print_start_section("misc", + "Scanning miscellaneous eBPF features...", + "/*** eBPF misc features ***/", + define_prefix); + probe_large_insn_limit(define_prefix, ifindex); + probe_bounded_loops(define_prefix, ifindex); + probe_v2_isa_extension(define_prefix, ifindex); + probe_v3_isa_extension(define_prefix, ifindex); + print_end_section(); +} + +#ifdef USE_LIBCAP +#define capability(c) { c, false, #c } +#define capability_msg(a, i) a[i].set ? "" : a[i].name, a[i].set ? "" : ", " +#endif + +static int handle_perms(void) +{ +#ifdef USE_LIBCAP + struct { + cap_value_t cap; + bool set; + char name[14]; /* strlen("CAP_SYS_ADMIN") */ + } bpf_caps[] = { + capability(CAP_SYS_ADMIN), +#ifdef CAP_BPF + capability(CAP_BPF), + capability(CAP_NET_ADMIN), + capability(CAP_PERFMON), +#endif + }; + cap_value_t cap_list[ARRAY_SIZE(bpf_caps)]; + unsigned int i, nb_bpf_caps = 0; + bool cap_sys_admin_only = true; + cap_flag_value_t val; + int res = -1; + cap_t caps; + + caps = cap_get_proc(); + if (!caps) { + p_err("failed to get capabilities for process: %s", + strerror(errno)); + return -1; + } + +#ifdef CAP_BPF + if (CAP_IS_SUPPORTED(CAP_BPF)) + cap_sys_admin_only = false; +#endif + + for (i = 0; i < ARRAY_SIZE(bpf_caps); i++) { + const char *cap_name = bpf_caps[i].name; + cap_value_t cap = bpf_caps[i].cap; + + if (cap_get_flag(caps, cap, CAP_EFFECTIVE, &val)) { + p_err("bug: failed to retrieve %s status: %s", cap_name, + strerror(errno)); + goto exit_free; + } + + if (val == CAP_SET) { + bpf_caps[i].set = true; + cap_list[nb_bpf_caps++] = cap; + } + + if (cap_sys_admin_only) + /* System does not know about CAP_BPF, meaning that + * CAP_SYS_ADMIN is the only capability required. We + * just checked it, break. + */ + break; + } + + if ((run_as_unprivileged && !nb_bpf_caps) || + (!run_as_unprivileged && nb_bpf_caps == ARRAY_SIZE(bpf_caps)) || + (!run_as_unprivileged && cap_sys_admin_only && nb_bpf_caps)) { + /* We are all good, exit now */ + res = 0; + goto exit_free; + } + + if (!run_as_unprivileged) { + if (cap_sys_admin_only) + p_err("missing %s, required for full feature probing; run as root or use 'unprivileged'", + bpf_caps[0].name); + else + p_err("missing %s%s%s%s%s%s%s%srequired for full feature probing; run as root or use 'unprivileged'", + capability_msg(bpf_caps, 0), +#ifdef CAP_BPF + capability_msg(bpf_caps, 1), + capability_msg(bpf_caps, 2), + capability_msg(bpf_caps, 3) +#else + "", "", "", "", "", "" +#endif /* CAP_BPF */ + ); + goto exit_free; + } + + /* if (run_as_unprivileged && nb_bpf_caps > 0), drop capabilities. */ + if (cap_set_flag(caps, CAP_EFFECTIVE, nb_bpf_caps, cap_list, + CAP_CLEAR)) { + p_err("bug: failed to clear capabilities: %s", strerror(errno)); + goto exit_free; + } + + if (cap_set_proc(caps)) { + p_err("failed to drop capabilities: %s", strerror(errno)); + goto exit_free; + } + + res = 0; + +exit_free: + if (cap_free(caps) && !res) { + p_err("failed to clear storage object for capabilities: %s", + strerror(errno)); + res = -1; + } + + return res; +#else + /* Detection assumes user has specific privileges. + * We do not use libcap so let's approximate, and restrict usage to + * root user only. + */ + if (geteuid()) { + p_err("full feature probing requires root privileges"); + return -1; + } + + return 0; +#endif /* USE_LIBCAP */ +} + +static int do_probe(int argc, char **argv) +{ + enum probe_component target = COMPONENT_UNSPEC; + const char *define_prefix = NULL; + bool supported_types[128] = {}; + __u32 ifindex = 0; + char *ifname; + + set_max_rlimit(); + + while (argc) { + if (is_prefix(*argv, "kernel")) { + if (target != COMPONENT_UNSPEC) { + p_err("component to probe already specified"); + return -1; + } + target = COMPONENT_KERNEL; + NEXT_ARG(); + } else if (is_prefix(*argv, "dev")) { + NEXT_ARG(); + + if (target != COMPONENT_UNSPEC || ifindex) { + p_err("component to probe already specified"); + return -1; + } + if (!REQ_ARGS(1)) + return -1; + + target = COMPONENT_DEVICE; + ifname = GET_ARG(); + ifindex = if_nametoindex(ifname); + if (!ifindex) { + p_err("unrecognized netdevice '%s': %s", ifname, + strerror(errno)); + return -1; + } + } else if (is_prefix(*argv, "full")) { + full_mode = true; + NEXT_ARG(); + } else if (is_prefix(*argv, "macros") && !define_prefix) { + define_prefix = ""; + NEXT_ARG(); + } else if (is_prefix(*argv, "prefix")) { + if (!define_prefix) { + p_err("'prefix' argument can only be use after 'macros'"); + return -1; + } + if (strcmp(define_prefix, "")) { + p_err("'prefix' already defined"); + return -1; + } + NEXT_ARG(); + + if (!REQ_ARGS(1)) + return -1; + define_prefix = GET_ARG(); + } else if (is_prefix(*argv, "unprivileged")) { +#ifdef USE_LIBCAP + run_as_unprivileged = true; + NEXT_ARG(); +#else + p_err("unprivileged run not supported, recompile bpftool with libcap"); + return -1; +#endif + } else { + p_err("expected no more arguments, 'kernel', 'dev', 'macros' or 'prefix', got: '%s'?", + *argv); + return -1; + } + } + + /* Full feature detection requires specific privileges. + * Let's approximate, and warn if user is not root. + */ + if (handle_perms()) + return -1; + + if (json_output) { + define_prefix = NULL; + jsonw_start_object(json_wtr); + } + + section_system_config(target, define_prefix); + if (!section_syscall_config(define_prefix)) + /* bpf() syscall unavailable, don't probe other BPF features */ + goto exit_close_json; + section_program_types(supported_types, define_prefix, ifindex); + section_map_types(define_prefix, ifindex); + section_helpers(supported_types, define_prefix, ifindex); + section_misc(define_prefix, ifindex); + +exit_close_json: + if (json_output) + /* End root object */ + jsonw_end_object(json_wtr); + + return 0; +} + +static const char *get_helper_name(unsigned int id) +{ + if (id >= ARRAY_SIZE(helper_name)) + return NULL; + + return helper_name[id]; +} + +static int do_list_builtins(int argc, char **argv) +{ + const char *(*get_name)(unsigned int id); + unsigned int id = 0; + + if (argc < 1) + usage(); + + if (is_prefix(*argv, "prog_types")) { + get_name = (const char *(*)(unsigned int))libbpf_bpf_prog_type_str; + } else if (is_prefix(*argv, "map_types")) { + get_name = (const char *(*)(unsigned int))libbpf_bpf_map_type_str; + } else if (is_prefix(*argv, "attach_types")) { + get_name = (const char *(*)(unsigned int))libbpf_bpf_attach_type_str; + } else if (is_prefix(*argv, "link_types")) { + get_name = (const char *(*)(unsigned int))libbpf_bpf_link_type_str; + } else if (is_prefix(*argv, "helpers")) { + get_name = get_helper_name; + } else { + p_err("expected 'prog_types', 'map_types', 'attach_types', 'link_types' or 'helpers', got: %s", *argv); + return -1; + } + + if (json_output) + jsonw_start_array(json_wtr); /* root array */ + + while (true) { + const char *name; + + name = get_name(id++); + if (!name) + break; + if (json_output) + jsonw_string(json_wtr, name); + else + printf("%s\n", name); + } + + if (json_output) + jsonw_end_array(json_wtr); /* root array */ + + return 0; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %1$s %2$s probe [COMPONENT] [full] [unprivileged] [macros [prefix PREFIX]]\n" + " %1$s %2$s list_builtins GROUP\n" + " %1$s %2$s help\n" + "\n" + " COMPONENT := { kernel | dev NAME }\n" + " GROUP := { prog_types | map_types | attach_types | link_types | helpers }\n" + " " HELP_SPEC_OPTIONS " }\n" + "", + bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "probe", do_probe }, + { "list_builtins", do_list_builtins }, + { "help", do_help }, + { 0 } +}; + +int do_feature(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/gen.c b/bpftool/src/gen.c new file mode 100644 index 0000000..2883660 --- /dev/null +++ b/bpftool/src/gen.c @@ -0,0 +1,2333 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2019 Facebook */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "json_writer.h" +#include "main.h" + +#define MAX_OBJ_NAME_LEN 64 + +static void sanitize_identifier(char *name) +{ + int i; + + for (i = 0; name[i]; i++) + if (!isalnum(name[i]) && name[i] != '_') + name[i] = '_'; +} + +static bool str_has_prefix(const char *str, const char *prefix) +{ + return strncmp(str, prefix, strlen(prefix)) == 0; +} + +static bool str_has_suffix(const char *str, const char *suffix) +{ + size_t i, n1 = strlen(str), n2 = strlen(suffix); + + if (n1 < n2) + return false; + + for (i = 0; i < n2; i++) { + if (str[n1 - i - 1] != suffix[n2 - i - 1]) + return false; + } + + return true; +} + +static void get_obj_name(char *name, const char *file) +{ + /* Using basename() GNU version which doesn't modify arg. */ + strncpy(name, basename(file), MAX_OBJ_NAME_LEN - 1); + name[MAX_OBJ_NAME_LEN - 1] = '\0'; + if (str_has_suffix(name, ".o")) + name[strlen(name) - 2] = '\0'; + sanitize_identifier(name); +} + +static void get_header_guard(char *guard, const char *obj_name, const char *suffix) +{ + int i; + + sprintf(guard, "__%s_%s__", obj_name, suffix); + for (i = 0; guard[i]; i++) + guard[i] = toupper(guard[i]); +} + +static bool get_map_ident(const struct bpf_map *map, char *buf, size_t buf_sz) +{ + static const char *sfxs[] = { ".data", ".rodata", ".bss", ".kconfig" }; + const char *name = bpf_map__name(map); + int i, n; + + if (!bpf_map__is_internal(map)) { + snprintf(buf, buf_sz, "%s", name); + return true; + } + + for (i = 0, n = ARRAY_SIZE(sfxs); i < n; i++) { + const char *sfx = sfxs[i], *p; + + p = strstr(name, sfx); + if (p) { + snprintf(buf, buf_sz, "%s", p + 1); + sanitize_identifier(buf); + return true; + } + } + + return false; +} + +static bool get_datasec_ident(const char *sec_name, char *buf, size_t buf_sz) +{ + static const char *pfxs[] = { ".data", ".rodata", ".bss", ".kconfig" }; + int i, n; + + for (i = 0, n = ARRAY_SIZE(pfxs); i < n; i++) { + const char *pfx = pfxs[i]; + + if (str_has_prefix(sec_name, pfx)) { + snprintf(buf, buf_sz, "%s", sec_name + 1); + sanitize_identifier(buf); + return true; + } + } + + return false; +} + +static void codegen_btf_dump_printf(void *ctx, const char *fmt, va_list args) +{ + vprintf(fmt, args); +} + +static int codegen_datasec_def(struct bpf_object *obj, + struct btf *btf, + struct btf_dump *d, + const struct btf_type *sec, + const char *obj_name) +{ + const char *sec_name = btf__name_by_offset(btf, sec->name_off); + const struct btf_var_secinfo *sec_var = btf_var_secinfos(sec); + int i, err, off = 0, pad_cnt = 0, vlen = btf_vlen(sec); + char var_ident[256], sec_ident[256]; + bool strip_mods = false; + + if (!get_datasec_ident(sec_name, sec_ident, sizeof(sec_ident))) + return 0; + + if (strcmp(sec_name, ".kconfig") != 0) + strip_mods = true; + + printf(" struct %s__%s {\n", obj_name, sec_ident); + for (i = 0; i < vlen; i++, sec_var++) { + const struct btf_type *var = btf__type_by_id(btf, sec_var->type); + const char *var_name = btf__name_by_offset(btf, var->name_off); + DECLARE_LIBBPF_OPTS(btf_dump_emit_type_decl_opts, opts, + .field_name = var_ident, + .indent_level = 2, + .strip_mods = strip_mods, + ); + int need_off = sec_var->offset, align_off, align; + __u32 var_type_id = var->type; + + /* static variables are not exposed through BPF skeleton */ + if (btf_var(var)->linkage == BTF_VAR_STATIC) + continue; + + if (off > need_off) { + p_err("Something is wrong for %s's variable #%d: need offset %d, already at %d.\n", + sec_name, i, need_off, off); + return -EINVAL; + } + + align = btf__align_of(btf, var->type); + if (align <= 0) { + p_err("Failed to determine alignment of variable '%s': %d", + var_name, align); + return -EINVAL; + } + /* Assume 32-bit architectures when generating data section + * struct memory layout. Given bpftool can't know which target + * host architecture it's emitting skeleton for, we need to be + * conservative and assume 32-bit one to ensure enough padding + * bytes are generated for pointer and long types. This will + * still work correctly for 64-bit architectures, because in + * the worst case we'll generate unnecessary padding field, + * which on 64-bit architectures is not strictly necessary and + * would be handled by natural 8-byte alignment. But it still + * will be a correct memory layout, based on recorded offsets + * in BTF. + */ + if (align > 4) + align = 4; + + align_off = (off + align - 1) / align * align; + if (align_off != need_off) { + printf("\t\tchar __pad%d[%d];\n", + pad_cnt, need_off - off); + pad_cnt++; + } + + /* sanitize variable name, e.g., for static vars inside + * a function, it's name is '.', + * which we'll turn into a '_' + */ + var_ident[0] = '\0'; + strncat(var_ident, var_name, sizeof(var_ident) - 1); + sanitize_identifier(var_ident); + + printf("\t\t"); + err = btf_dump__emit_type_decl(d, var_type_id, &opts); + if (err) + return err; + printf(";\n"); + + off = sec_var->offset + sec_var->size; + } + printf(" } *%s;\n", sec_ident); + return 0; +} + +static const struct btf_type *find_type_for_map(struct btf *btf, const char *map_ident) +{ + int n = btf__type_cnt(btf), i; + char sec_ident[256]; + + for (i = 1; i < n; i++) { + const struct btf_type *t = btf__type_by_id(btf, i); + const char *name; + + if (!btf_is_datasec(t)) + continue; + + name = btf__str_by_offset(btf, t->name_off); + if (!get_datasec_ident(name, sec_ident, sizeof(sec_ident))) + continue; + + if (strcmp(sec_ident, map_ident) == 0) + return t; + } + return NULL; +} + +static bool is_internal_mmapable_map(const struct bpf_map *map, char *buf, size_t sz) +{ + if (!bpf_map__is_internal(map) || !(bpf_map__map_flags(map) & BPF_F_MMAPABLE)) + return false; + + if (!get_map_ident(map, buf, sz)) + return false; + + return true; +} + +static int codegen_datasecs(struct bpf_object *obj, const char *obj_name) +{ + struct btf *btf = bpf_object__btf(obj); + struct btf_dump *d; + struct bpf_map *map; + const struct btf_type *sec; + char map_ident[256]; + int err = 0; + + d = btf_dump__new(btf, codegen_btf_dump_printf, NULL, NULL); + if (!d) + return -errno; + + bpf_object__for_each_map(map, obj) { + /* only generate definitions for memory-mapped internal maps */ + if (!is_internal_mmapable_map(map, map_ident, sizeof(map_ident))) + continue; + + sec = find_type_for_map(btf, map_ident); + + /* In some cases (e.g., sections like .rodata.cst16 containing + * compiler allocated string constants only) there will be + * special internal maps with no corresponding DATASEC BTF + * type. In such case, generate empty structs for each such + * map. It will still be memory-mapped and its contents + * accessible from user-space through BPF skeleton. + */ + if (!sec) { + printf(" struct %s__%s {\n", obj_name, map_ident); + printf(" } *%s;\n", map_ident); + } else { + err = codegen_datasec_def(obj, btf, d, sec, obj_name); + if (err) + goto out; + } + } + + +out: + btf_dump__free(d); + return err; +} + +static bool btf_is_ptr_to_func_proto(const struct btf *btf, + const struct btf_type *v) +{ + return btf_is_ptr(v) && btf_is_func_proto(btf__type_by_id(btf, v->type)); +} + +static int codegen_subskel_datasecs(struct bpf_object *obj, const char *obj_name) +{ + struct btf *btf = bpf_object__btf(obj); + struct btf_dump *d; + struct bpf_map *map; + const struct btf_type *sec, *var; + const struct btf_var_secinfo *sec_var; + int i, err = 0, vlen; + char map_ident[256], sec_ident[256]; + bool strip_mods = false, needs_typeof = false; + const char *sec_name, *var_name; + __u32 var_type_id; + + d = btf_dump__new(btf, codegen_btf_dump_printf, NULL, NULL); + if (!d) + return -errno; + + bpf_object__for_each_map(map, obj) { + /* only generate definitions for memory-mapped internal maps */ + if (!is_internal_mmapable_map(map, map_ident, sizeof(map_ident))) + continue; + + sec = find_type_for_map(btf, map_ident); + if (!sec) + continue; + + sec_name = btf__name_by_offset(btf, sec->name_off); + if (!get_datasec_ident(sec_name, sec_ident, sizeof(sec_ident))) + continue; + + strip_mods = strcmp(sec_name, ".kconfig") != 0; + printf(" struct %s__%s {\n", obj_name, sec_ident); + + sec_var = btf_var_secinfos(sec); + vlen = btf_vlen(sec); + for (i = 0; i < vlen; i++, sec_var++) { + DECLARE_LIBBPF_OPTS(btf_dump_emit_type_decl_opts, opts, + .indent_level = 2, + .strip_mods = strip_mods, + /* we'll print the name separately */ + .field_name = "", + ); + + var = btf__type_by_id(btf, sec_var->type); + var_name = btf__name_by_offset(btf, var->name_off); + var_type_id = var->type; + + /* static variables are not exposed through BPF skeleton */ + if (btf_var(var)->linkage == BTF_VAR_STATIC) + continue; + + /* The datasec member has KIND_VAR but we want the + * underlying type of the variable (e.g. KIND_INT). + */ + var = skip_mods_and_typedefs(btf, var->type, NULL); + + printf("\t\t"); + /* Func and array members require special handling. + * Instead of producing `typename *var`, they produce + * `typeof(typename) *var`. This allows us to keep a + * similar syntax where the identifier is just prefixed + * by *, allowing us to ignore C declaration minutiae. + */ + needs_typeof = btf_is_array(var) || btf_is_ptr_to_func_proto(btf, var); + if (needs_typeof) + printf("typeof("); + + err = btf_dump__emit_type_decl(d, var_type_id, &opts); + if (err) + goto out; + + if (needs_typeof) + printf(")"); + + printf(" *%s;\n", var_name); + } + printf(" } %s;\n", sec_ident); + } + +out: + btf_dump__free(d); + return err; +} + +static void codegen(const char *template, ...) +{ + const char *src, *end; + int skip_tabs = 0, n; + char *s, *dst; + va_list args; + char c; + + n = strlen(template); + s = malloc(n + 1); + if (!s) + exit(-1); + src = template; + dst = s; + + /* find out "baseline" indentation to skip */ + while ((c = *src++)) { + if (c == '\t') { + skip_tabs++; + } else if (c == '\n') { + break; + } else { + p_err("unrecognized character at pos %td in template '%s': '%c'", + src - template - 1, template, c); + free(s); + exit(-1); + } + } + + while (*src) { + /* skip baseline indentation tabs */ + for (n = skip_tabs; n > 0; n--, src++) { + if (*src != '\t') { + p_err("not enough tabs at pos %td in template '%s'", + src - template - 1, template); + free(s); + exit(-1); + } + } + /* trim trailing whitespace */ + end = strchrnul(src, '\n'); + for (n = end - src; n > 0 && isspace(src[n - 1]); n--) + ; + memcpy(dst, src, n); + dst += n; + if (*end) + *dst++ = '\n'; + src = *end ? end + 1 : end; + } + *dst++ = '\0'; + + /* print out using adjusted template */ + va_start(args, template); + n = vprintf(s, args); + va_end(args); + + free(s); +} + +static void print_hex(const char *data, int data_sz) +{ + int i, len; + + for (i = 0, len = 0; i < data_sz; i++) { + int w = data[i] ? 4 : 2; + + len += w; + if (len > 78) { + printf("\\\n"); + len = w; + } + if (!data[i]) + printf("\\0"); + else + printf("\\x%02x", (unsigned char)data[i]); + } +} + +static size_t bpf_map_mmap_sz(const struct bpf_map *map) +{ + long page_sz = sysconf(_SC_PAGE_SIZE); + size_t map_sz; + + map_sz = (size_t)roundup(bpf_map__value_size(map), 8) * bpf_map__max_entries(map); + map_sz = roundup(map_sz, page_sz); + return map_sz; +} + +/* Emit type size asserts for all top-level fields in memory-mapped internal maps. */ +static void codegen_asserts(struct bpf_object *obj, const char *obj_name) +{ + struct btf *btf = bpf_object__btf(obj); + struct bpf_map *map; + struct btf_var_secinfo *sec_var; + int i, vlen; + const struct btf_type *sec; + char map_ident[256], var_ident[256]; + + if (!btf) + return; + + codegen("\ + \n\ + __attribute__((unused)) static void \n\ + %1$s__assert(struct %1$s *s __attribute__((unused))) \n\ + { \n\ + #ifdef __cplusplus \n\ + #define _Static_assert static_assert \n\ + #endif \n\ + ", obj_name); + + bpf_object__for_each_map(map, obj) { + if (!is_internal_mmapable_map(map, map_ident, sizeof(map_ident))) + continue; + + sec = find_type_for_map(btf, map_ident); + if (!sec) { + /* best effort, couldn't find the type for this map */ + continue; + } + + sec_var = btf_var_secinfos(sec); + vlen = btf_vlen(sec); + + for (i = 0; i < vlen; i++, sec_var++) { + const struct btf_type *var = btf__type_by_id(btf, sec_var->type); + const char *var_name = btf__name_by_offset(btf, var->name_off); + long var_size; + + /* static variables are not exposed through BPF skeleton */ + if (btf_var(var)->linkage == BTF_VAR_STATIC) + continue; + + var_size = btf__resolve_size(btf, var->type); + if (var_size < 0) + continue; + + var_ident[0] = '\0'; + strncat(var_ident, var_name, sizeof(var_ident) - 1); + sanitize_identifier(var_ident); + + printf("\t_Static_assert(sizeof(s->%s->%s) == %ld, \"unexpected size of '%s'\");\n", + map_ident, var_ident, var_size, var_ident); + } + } + codegen("\ + \n\ + #ifdef __cplusplus \n\ + #undef _Static_assert \n\ + #endif \n\ + } \n\ + "); +} + +static void codegen_attach_detach(struct bpf_object *obj, const char *obj_name) +{ + struct bpf_program *prog; + + bpf_object__for_each_program(prog, obj) { + const char *tp_name; + + codegen("\ + \n\ + \n\ + static inline int \n\ + %1$s__%2$s__attach(struct %1$s *skel) \n\ + { \n\ + int prog_fd = skel->progs.%2$s.prog_fd; \n\ + ", obj_name, bpf_program__name(prog)); + + switch (bpf_program__type(prog)) { + case BPF_PROG_TYPE_RAW_TRACEPOINT: + tp_name = strchr(bpf_program__section_name(prog), '/') + 1; + printf("\tint fd = skel_raw_tracepoint_open(\"%s\", prog_fd);\n", tp_name); + break; + case BPF_PROG_TYPE_TRACING: + case BPF_PROG_TYPE_LSM: + if (bpf_program__expected_attach_type(prog) == BPF_TRACE_ITER) + printf("\tint fd = skel_link_create(prog_fd, 0, BPF_TRACE_ITER);\n"); + else + printf("\tint fd = skel_raw_tracepoint_open(NULL, prog_fd);\n"); + break; + default: + printf("\tint fd = ((void)prog_fd, 0); /* auto-attach not supported */\n"); + break; + } + codegen("\ + \n\ + \n\ + if (fd > 0) \n\ + skel->links.%1$s_fd = fd; \n\ + return fd; \n\ + } \n\ + ", bpf_program__name(prog)); + } + + codegen("\ + \n\ + \n\ + static inline int \n\ + %1$s__attach(struct %1$s *skel) \n\ + { \n\ + int ret = 0; \n\ + \n\ + ", obj_name); + + bpf_object__for_each_program(prog, obj) { + codegen("\ + \n\ + ret = ret < 0 ? ret : %1$s__%2$s__attach(skel); \n\ + ", obj_name, bpf_program__name(prog)); + } + + codegen("\ + \n\ + return ret < 0 ? ret : 0; \n\ + } \n\ + \n\ + static inline void \n\ + %1$s__detach(struct %1$s *skel) \n\ + { \n\ + ", obj_name); + + bpf_object__for_each_program(prog, obj) { + codegen("\ + \n\ + skel_closenz(skel->links.%1$s_fd); \n\ + ", bpf_program__name(prog)); + } + + codegen("\ + \n\ + } \n\ + "); +} + +static void codegen_destroy(struct bpf_object *obj, const char *obj_name) +{ + struct bpf_program *prog; + struct bpf_map *map; + char ident[256]; + + codegen("\ + \n\ + static void \n\ + %1$s__destroy(struct %1$s *skel) \n\ + { \n\ + if (!skel) \n\ + return; \n\ + %1$s__detach(skel); \n\ + ", + obj_name); + + bpf_object__for_each_program(prog, obj) { + codegen("\ + \n\ + skel_closenz(skel->progs.%1$s.prog_fd); \n\ + ", bpf_program__name(prog)); + } + + bpf_object__for_each_map(map, obj) { + if (!get_map_ident(map, ident, sizeof(ident))) + continue; + if (bpf_map__is_internal(map) && + (bpf_map__map_flags(map) & BPF_F_MMAPABLE)) + printf("\tskel_free_map_data(skel->%1$s, skel->maps.%1$s.initial_value, %2$zd);\n", + ident, bpf_map_mmap_sz(map)); + codegen("\ + \n\ + skel_closenz(skel->maps.%1$s.map_fd); \n\ + ", ident); + } + codegen("\ + \n\ + skel_free(skel); \n\ + } \n\ + ", + obj_name); +} + +static int gen_trace(struct bpf_object *obj, const char *obj_name, const char *header_guard) +{ + DECLARE_LIBBPF_OPTS(gen_loader_opts, opts); + struct bpf_map *map; + char ident[256]; + int err = 0; + + err = bpf_object__gen_loader(obj, &opts); + if (err) + return err; + + err = bpf_object__load(obj); + if (err) { + p_err("failed to load object file"); + goto out; + } + /* If there was no error during load then gen_loader_opts + * are populated with the loader program. + */ + + /* finish generating 'struct skel' */ + codegen("\ + \n\ + }; \n\ + ", obj_name); + + + codegen_attach_detach(obj, obj_name); + + codegen_destroy(obj, obj_name); + + codegen("\ + \n\ + static inline struct %1$s * \n\ + %1$s__open(void) \n\ + { \n\ + struct %1$s *skel; \n\ + \n\ + skel = skel_alloc(sizeof(*skel)); \n\ + if (!skel) \n\ + goto cleanup; \n\ + skel->ctx.sz = (void *)&skel->links - (void *)skel; \n\ + ", + obj_name, opts.data_sz); + bpf_object__for_each_map(map, obj) { + const void *mmap_data = NULL; + size_t mmap_size = 0; + + if (!is_internal_mmapable_map(map, ident, sizeof(ident))) + continue; + + codegen("\ + \n\ + skel->%1$s = skel_prep_map_data((void *)\"\\ \n\ + ", ident); + mmap_data = bpf_map__initial_value(map, &mmap_size); + print_hex(mmap_data, mmap_size); + codegen("\ + \n\ + \", %1$zd, %2$zd); \n\ + if (!skel->%3$s) \n\ + goto cleanup; \n\ + skel->maps.%3$s.initial_value = (__u64) (long) skel->%3$s;\n\ + ", bpf_map_mmap_sz(map), mmap_size, ident); + } + codegen("\ + \n\ + return skel; \n\ + cleanup: \n\ + %1$s__destroy(skel); \n\ + return NULL; \n\ + } \n\ + \n\ + static inline int \n\ + %1$s__load(struct %1$s *skel) \n\ + { \n\ + struct bpf_load_and_run_opts opts = {}; \n\ + int err; \n\ + \n\ + opts.ctx = (struct bpf_loader_ctx *)skel; \n\ + opts.data_sz = %2$d; \n\ + opts.data = (void *)\"\\ \n\ + ", + obj_name, opts.data_sz); + print_hex(opts.data, opts.data_sz); + codegen("\ + \n\ + \"; \n\ + "); + + codegen("\ + \n\ + opts.insns_sz = %d; \n\ + opts.insns = (void *)\"\\ \n\ + ", + opts.insns_sz); + print_hex(opts.insns, opts.insns_sz); + codegen("\ + \n\ + \"; \n\ + err = bpf_load_and_run(&opts); \n\ + if (err < 0) \n\ + return err; \n\ + ", obj_name); + bpf_object__for_each_map(map, obj) { + const char *mmap_flags; + + if (!is_internal_mmapable_map(map, ident, sizeof(ident))) + continue; + + if (bpf_map__map_flags(map) & BPF_F_RDONLY_PROG) + mmap_flags = "PROT_READ"; + else + mmap_flags = "PROT_READ | PROT_WRITE"; + + codegen("\ + \n\ + skel->%1$s = skel_finalize_map_data(&skel->maps.%1$s.initial_value, \n\ + %2$zd, %3$s, skel->maps.%1$s.map_fd);\n\ + if (!skel->%1$s) \n\ + return -ENOMEM; \n\ + ", + ident, bpf_map_mmap_sz(map), mmap_flags); + } + codegen("\ + \n\ + return 0; \n\ + } \n\ + \n\ + static inline struct %1$s * \n\ + %1$s__open_and_load(void) \n\ + { \n\ + struct %1$s *skel; \n\ + \n\ + skel = %1$s__open(); \n\ + if (!skel) \n\ + return NULL; \n\ + if (%1$s__load(skel)) { \n\ + %1$s__destroy(skel); \n\ + return NULL; \n\ + } \n\ + return skel; \n\ + } \n\ + \n\ + ", obj_name); + + codegen_asserts(obj, obj_name); + + codegen("\ + \n\ + \n\ + #endif /* %s */ \n\ + ", + header_guard); + err = 0; +out: + return err; +} + +static void +codegen_maps_skeleton(struct bpf_object *obj, size_t map_cnt, bool mmaped) +{ + struct bpf_map *map; + char ident[256]; + size_t i; + + if (!map_cnt) + return; + + codegen("\ + \n\ + \n\ + /* maps */ \n\ + s->map_cnt = %zu; \n\ + s->map_skel_sz = sizeof(*s->maps); \n\ + s->maps = (struct bpf_map_skeleton *)calloc(s->map_cnt, s->map_skel_sz);\n\ + if (!s->maps) { \n\ + err = -ENOMEM; \n\ + goto err; \n\ + } \n\ + ", + map_cnt + ); + i = 0; + bpf_object__for_each_map(map, obj) { + if (!get_map_ident(map, ident, sizeof(ident))) + continue; + + codegen("\ + \n\ + \n\ + s->maps[%zu].name = \"%s\"; \n\ + s->maps[%zu].map = &obj->maps.%s; \n\ + ", + i, bpf_map__name(map), i, ident); + /* memory-mapped internal maps */ + if (mmaped && is_internal_mmapable_map(map, ident, sizeof(ident))) { + printf("\ts->maps[%zu].mmaped = (void **)&obj->%s;\n", + i, ident); + } + i++; + } +} + +static void +codegen_progs_skeleton(struct bpf_object *obj, size_t prog_cnt, bool populate_links) +{ + struct bpf_program *prog; + int i; + + if (!prog_cnt) + return; + + codegen("\ + \n\ + \n\ + /* programs */ \n\ + s->prog_cnt = %zu; \n\ + s->prog_skel_sz = sizeof(*s->progs); \n\ + s->progs = (struct bpf_prog_skeleton *)calloc(s->prog_cnt, s->prog_skel_sz);\n\ + if (!s->progs) { \n\ + err = -ENOMEM; \n\ + goto err; \n\ + } \n\ + ", + prog_cnt + ); + i = 0; + bpf_object__for_each_program(prog, obj) { + codegen("\ + \n\ + \n\ + s->progs[%1$zu].name = \"%2$s\"; \n\ + s->progs[%1$zu].prog = &obj->progs.%2$s;\n\ + ", + i, bpf_program__name(prog)); + + if (populate_links) { + codegen("\ + \n\ + s->progs[%1$zu].link = &obj->links.%2$s;\n\ + ", + i, bpf_program__name(prog)); + } + i++; + } +} + +static int do_skeleton(int argc, char **argv) +{ + char header_guard[MAX_OBJ_NAME_LEN + sizeof("__SKEL_H__")]; + size_t map_cnt = 0, prog_cnt = 0, file_sz, mmap_sz; + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts); + char obj_name[MAX_OBJ_NAME_LEN] = "", *obj_data; + struct bpf_object *obj = NULL; + const char *file; + char ident[256]; + struct bpf_program *prog; + int fd, err = -1; + struct bpf_map *map; + struct btf *btf; + struct stat st; + + if (!REQ_ARGS(1)) { + usage(); + return -1; + } + file = GET_ARG(); + + while (argc) { + if (!REQ_ARGS(2)) + return -1; + + if (is_prefix(*argv, "name")) { + NEXT_ARG(); + + if (obj_name[0] != '\0') { + p_err("object name already specified"); + return -1; + } + + strncpy(obj_name, *argv, MAX_OBJ_NAME_LEN - 1); + obj_name[MAX_OBJ_NAME_LEN - 1] = '\0'; + } else { + p_err("unknown arg %s", *argv); + return -1; + } + + NEXT_ARG(); + } + + if (argc) { + p_err("extra unknown arguments"); + return -1; + } + + if (stat(file, &st)) { + p_err("failed to stat() %s: %s", file, strerror(errno)); + return -1; + } + file_sz = st.st_size; + mmap_sz = roundup(file_sz, sysconf(_SC_PAGE_SIZE)); + fd = open(file, O_RDONLY); + if (fd < 0) { + p_err("failed to open() %s: %s", file, strerror(errno)); + return -1; + } + obj_data = mmap(NULL, mmap_sz, PROT_READ, MAP_PRIVATE, fd, 0); + if (obj_data == MAP_FAILED) { + obj_data = NULL; + p_err("failed to mmap() %s: %s", file, strerror(errno)); + goto out; + } + if (obj_name[0] == '\0') + get_obj_name(obj_name, file); + opts.object_name = obj_name; + if (verifier_logs) + /* log_level1 + log_level2 + stats, but not stable UAPI */ + opts.kernel_log_level = 1 + 2 + 4; + obj = bpf_object__open_mem(obj_data, file_sz, &opts); + if (!obj) { + char err_buf[256]; + + err = -errno; + libbpf_strerror(err, err_buf, sizeof(err_buf)); + p_err("failed to open BPF object file: %s", err_buf); + goto out; + } + + bpf_object__for_each_map(map, obj) { + if (!get_map_ident(map, ident, sizeof(ident))) { + p_err("ignoring unrecognized internal map '%s'...", + bpf_map__name(map)); + continue; + } + map_cnt++; + } + bpf_object__for_each_program(prog, obj) { + prog_cnt++; + } + + get_header_guard(header_guard, obj_name, "SKEL_H"); + if (use_loader) { + codegen("\ + \n\ + /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ \n\ + /* THIS FILE IS AUTOGENERATED BY BPFTOOL! */ \n\ + #ifndef %2$s \n\ + #define %2$s \n\ + \n\ + #include \n\ + \n\ + struct %1$s { \n\ + struct bpf_loader_ctx ctx; \n\ + ", + obj_name, header_guard + ); + } else { + codegen("\ + \n\ + /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ \n\ + \n\ + /* THIS FILE IS AUTOGENERATED BY BPFTOOL! */ \n\ + #ifndef %2$s \n\ + #define %2$s \n\ + \n\ + #include \n\ + #include \n\ + #include \n\ + \n\ + struct %1$s { \n\ + struct bpf_object_skeleton *skeleton; \n\ + struct bpf_object *obj; \n\ + ", + obj_name, header_guard + ); + } + + if (map_cnt) { + printf("\tstruct {\n"); + bpf_object__for_each_map(map, obj) { + if (!get_map_ident(map, ident, sizeof(ident))) + continue; + if (use_loader) + printf("\t\tstruct bpf_map_desc %s;\n", ident); + else + printf("\t\tstruct bpf_map *%s;\n", ident); + } + printf("\t} maps;\n"); + } + + if (prog_cnt) { + printf("\tstruct {\n"); + bpf_object__for_each_program(prog, obj) { + if (use_loader) + printf("\t\tstruct bpf_prog_desc %s;\n", + bpf_program__name(prog)); + else + printf("\t\tstruct bpf_program *%s;\n", + bpf_program__name(prog)); + } + printf("\t} progs;\n"); + printf("\tstruct {\n"); + bpf_object__for_each_program(prog, obj) { + if (use_loader) + printf("\t\tint %s_fd;\n", + bpf_program__name(prog)); + else + printf("\t\tstruct bpf_link *%s;\n", + bpf_program__name(prog)); + } + printf("\t} links;\n"); + } + + btf = bpf_object__btf(obj); + if (btf) { + err = codegen_datasecs(obj, obj_name); + if (err) + goto out; + } + if (use_loader) { + err = gen_trace(obj, obj_name, header_guard); + goto out; + } + + codegen("\ + \n\ + \n\ + #ifdef __cplusplus \n\ + static inline struct %1$s *open(const struct bpf_object_open_opts *opts = nullptr);\n\ + static inline struct %1$s *open_and_load(); \n\ + static inline int load(struct %1$s *skel); \n\ + static inline int attach(struct %1$s *skel); \n\ + static inline void detach(struct %1$s *skel); \n\ + static inline void destroy(struct %1$s *skel); \n\ + static inline const void *elf_bytes(size_t *sz); \n\ + #endif /* __cplusplus */ \n\ + }; \n\ + \n\ + static void \n\ + %1$s__destroy(struct %1$s *obj) \n\ + { \n\ + if (!obj) \n\ + return; \n\ + if (obj->skeleton) \n\ + bpf_object__destroy_skeleton(obj->skeleton);\n\ + free(obj); \n\ + } \n\ + \n\ + static inline int \n\ + %1$s__create_skeleton(struct %1$s *obj); \n\ + \n\ + static inline struct %1$s * \n\ + %1$s__open_opts(const struct bpf_object_open_opts *opts) \n\ + { \n\ + struct %1$s *obj; \n\ + int err; \n\ + \n\ + obj = (struct %1$s *)calloc(1, sizeof(*obj)); \n\ + if (!obj) { \n\ + errno = ENOMEM; \n\ + return NULL; \n\ + } \n\ + \n\ + err = %1$s__create_skeleton(obj); \n\ + if (err) \n\ + goto err_out; \n\ + \n\ + err = bpf_object__open_skeleton(obj->skeleton, opts);\n\ + if (err) \n\ + goto err_out; \n\ + \n\ + return obj; \n\ + err_out: \n\ + %1$s__destroy(obj); \n\ + errno = -err; \n\ + return NULL; \n\ + } \n\ + \n\ + static inline struct %1$s * \n\ + %1$s__open(void) \n\ + { \n\ + return %1$s__open_opts(NULL); \n\ + } \n\ + \n\ + static inline int \n\ + %1$s__load(struct %1$s *obj) \n\ + { \n\ + return bpf_object__load_skeleton(obj->skeleton); \n\ + } \n\ + \n\ + static inline struct %1$s * \n\ + %1$s__open_and_load(void) \n\ + { \n\ + struct %1$s *obj; \n\ + int err; \n\ + \n\ + obj = %1$s__open(); \n\ + if (!obj) \n\ + return NULL; \n\ + err = %1$s__load(obj); \n\ + if (err) { \n\ + %1$s__destroy(obj); \n\ + errno = -err; \n\ + return NULL; \n\ + } \n\ + return obj; \n\ + } \n\ + \n\ + static inline int \n\ + %1$s__attach(struct %1$s *obj) \n\ + { \n\ + return bpf_object__attach_skeleton(obj->skeleton); \n\ + } \n\ + \n\ + static inline void \n\ + %1$s__detach(struct %1$s *obj) \n\ + { \n\ + bpf_object__detach_skeleton(obj->skeleton); \n\ + } \n\ + ", + obj_name + ); + + codegen("\ + \n\ + \n\ + static inline const void *%1$s__elf_bytes(size_t *sz); \n\ + \n\ + static inline int \n\ + %1$s__create_skeleton(struct %1$s *obj) \n\ + { \n\ + struct bpf_object_skeleton *s; \n\ + int err; \n\ + \n\ + s = (struct bpf_object_skeleton *)calloc(1, sizeof(*s));\n\ + if (!s) { \n\ + err = -ENOMEM; \n\ + goto err; \n\ + } \n\ + \n\ + s->sz = sizeof(*s); \n\ + s->name = \"%1$s\"; \n\ + s->obj = &obj->obj; \n\ + ", + obj_name + ); + + codegen_maps_skeleton(obj, map_cnt, true /*mmaped*/); + codegen_progs_skeleton(obj, prog_cnt, true /*populate_links*/); + + codegen("\ + \n\ + \n\ + s->data = (void *)%2$s__elf_bytes(&s->data_sz); \n\ + \n\ + obj->skeleton = s; \n\ + return 0; \n\ + err: \n\ + bpf_object__destroy_skeleton(s); \n\ + return err; \n\ + } \n\ + \n\ + static inline const void *%2$s__elf_bytes(size_t *sz) \n\ + { \n\ + *sz = %1$d; \n\ + return (const void *)\"\\ \n\ + " + , file_sz, obj_name); + + /* embed contents of BPF object file */ + print_hex(obj_data, file_sz); + + codegen("\ + \n\ + \"; \n\ + } \n\ + \n\ + #ifdef __cplusplus \n\ + struct %1$s *%1$s::open(const struct bpf_object_open_opts *opts) { return %1$s__open_opts(opts); }\n\ + struct %1$s *%1$s::open_and_load() { return %1$s__open_and_load(); } \n\ + int %1$s::load(struct %1$s *skel) { return %1$s__load(skel); } \n\ + int %1$s::attach(struct %1$s *skel) { return %1$s__attach(skel); } \n\ + void %1$s::detach(struct %1$s *skel) { %1$s__detach(skel); } \n\ + void %1$s::destroy(struct %1$s *skel) { %1$s__destroy(skel); } \n\ + const void *%1$s::elf_bytes(size_t *sz) { return %1$s__elf_bytes(sz); } \n\ + #endif /* __cplusplus */ \n\ + \n\ + ", + obj_name); + + codegen_asserts(obj, obj_name); + + codegen("\ + \n\ + \n\ + #endif /* %1$s */ \n\ + ", + header_guard); + err = 0; +out: + bpf_object__close(obj); + if (obj_data) + munmap(obj_data, mmap_sz); + close(fd); + return err; +} + +/* Subskeletons are like skeletons, except they don't own the bpf_object, + * associated maps, links, etc. Instead, they know about the existence of + * variables, maps, programs and are able to find their locations + * _at runtime_ from an already loaded bpf_object. + * + * This allows for library-like BPF objects to have userspace counterparts + * with access to their own items without having to know anything about the + * final BPF object that the library was linked into. + */ +static int do_subskeleton(int argc, char **argv) +{ + char header_guard[MAX_OBJ_NAME_LEN + sizeof("__SUBSKEL_H__")]; + size_t i, len, file_sz, map_cnt = 0, prog_cnt = 0, mmap_sz, var_cnt = 0, var_idx = 0; + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts); + char obj_name[MAX_OBJ_NAME_LEN] = "", *obj_data; + struct bpf_object *obj = NULL; + const char *file, *var_name; + char ident[256]; + int fd, err = -1, map_type_id; + const struct bpf_map *map; + struct bpf_program *prog; + struct btf *btf; + const struct btf_type *map_type, *var_type; + const struct btf_var_secinfo *var; + struct stat st; + + if (!REQ_ARGS(1)) { + usage(); + return -1; + } + file = GET_ARG(); + + while (argc) { + if (!REQ_ARGS(2)) + return -1; + + if (is_prefix(*argv, "name")) { + NEXT_ARG(); + + if (obj_name[0] != '\0') { + p_err("object name already specified"); + return -1; + } + + strncpy(obj_name, *argv, MAX_OBJ_NAME_LEN - 1); + obj_name[MAX_OBJ_NAME_LEN - 1] = '\0'; + } else { + p_err("unknown arg %s", *argv); + return -1; + } + + NEXT_ARG(); + } + + if (argc) { + p_err("extra unknown arguments"); + return -1; + } + + if (use_loader) { + p_err("cannot use loader for subskeletons"); + return -1; + } + + if (stat(file, &st)) { + p_err("failed to stat() %s: %s", file, strerror(errno)); + return -1; + } + file_sz = st.st_size; + mmap_sz = roundup(file_sz, sysconf(_SC_PAGE_SIZE)); + fd = open(file, O_RDONLY); + if (fd < 0) { + p_err("failed to open() %s: %s", file, strerror(errno)); + return -1; + } + obj_data = mmap(NULL, mmap_sz, PROT_READ, MAP_PRIVATE, fd, 0); + if (obj_data == MAP_FAILED) { + obj_data = NULL; + p_err("failed to mmap() %s: %s", file, strerror(errno)); + goto out; + } + if (obj_name[0] == '\0') + get_obj_name(obj_name, file); + + /* The empty object name allows us to use bpf_map__name and produce + * ELF section names out of it. (".data" instead of "obj.data") + */ + opts.object_name = ""; + obj = bpf_object__open_mem(obj_data, file_sz, &opts); + if (!obj) { + char err_buf[256]; + + libbpf_strerror(errno, err_buf, sizeof(err_buf)); + p_err("failed to open BPF object file: %s", err_buf); + obj = NULL; + goto out; + } + + btf = bpf_object__btf(obj); + if (!btf) { + err = -1; + p_err("need btf type information for %s", obj_name); + goto out; + } + + bpf_object__for_each_program(prog, obj) { + prog_cnt++; + } + + /* First, count how many variables we have to find. + * We need this in advance so the subskel can allocate the right + * amount of storage. + */ + bpf_object__for_each_map(map, obj) { + if (!get_map_ident(map, ident, sizeof(ident))) + continue; + + /* Also count all maps that have a name */ + map_cnt++; + + if (!is_internal_mmapable_map(map, ident, sizeof(ident))) + continue; + + map_type_id = bpf_map__btf_value_type_id(map); + if (map_type_id <= 0) { + err = map_type_id; + goto out; + } + map_type = btf__type_by_id(btf, map_type_id); + + var = btf_var_secinfos(map_type); + len = btf_vlen(map_type); + for (i = 0; i < len; i++, var++) { + var_type = btf__type_by_id(btf, var->type); + + if (btf_var(var_type)->linkage == BTF_VAR_STATIC) + continue; + + var_cnt++; + } + } + + get_header_guard(header_guard, obj_name, "SUBSKEL_H"); + codegen("\ + \n\ + /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ \n\ + \n\ + /* THIS FILE IS AUTOGENERATED! */ \n\ + #ifndef %2$s \n\ + #define %2$s \n\ + \n\ + #include \n\ + #include \n\ + #include \n\ + \n\ + struct %1$s { \n\ + struct bpf_object *obj; \n\ + struct bpf_object_subskeleton *subskel; \n\ + ", obj_name, header_guard); + + if (map_cnt) { + printf("\tstruct {\n"); + bpf_object__for_each_map(map, obj) { + if (!get_map_ident(map, ident, sizeof(ident))) + continue; + printf("\t\tstruct bpf_map *%s;\n", ident); + } + printf("\t} maps;\n"); + } + + if (prog_cnt) { + printf("\tstruct {\n"); + bpf_object__for_each_program(prog, obj) { + printf("\t\tstruct bpf_program *%s;\n", + bpf_program__name(prog)); + } + printf("\t} progs;\n"); + } + + err = codegen_subskel_datasecs(obj, obj_name); + if (err) + goto out; + + /* emit code that will allocate enough storage for all symbols */ + codegen("\ + \n\ + \n\ + #ifdef __cplusplus \n\ + static inline struct %1$s *open(const struct bpf_object *src);\n\ + static inline void destroy(struct %1$s *skel); \n\ + #endif /* __cplusplus */ \n\ + }; \n\ + \n\ + static inline void \n\ + %1$s__destroy(struct %1$s *skel) \n\ + { \n\ + if (!skel) \n\ + return; \n\ + if (skel->subskel) \n\ + bpf_object__destroy_subskeleton(skel->subskel);\n\ + free(skel); \n\ + } \n\ + \n\ + static inline struct %1$s * \n\ + %1$s__open(const struct bpf_object *src) \n\ + { \n\ + struct %1$s *obj; \n\ + struct bpf_object_subskeleton *s; \n\ + int err; \n\ + \n\ + obj = (struct %1$s *)calloc(1, sizeof(*obj)); \n\ + if (!obj) { \n\ + err = -ENOMEM; \n\ + goto err; \n\ + } \n\ + s = (struct bpf_object_subskeleton *)calloc(1, sizeof(*s));\n\ + if (!s) { \n\ + err = -ENOMEM; \n\ + goto err; \n\ + } \n\ + s->sz = sizeof(*s); \n\ + s->obj = src; \n\ + s->var_skel_sz = sizeof(*s->vars); \n\ + obj->subskel = s; \n\ + \n\ + /* vars */ \n\ + s->var_cnt = %2$d; \n\ + s->vars = (struct bpf_var_skeleton *)calloc(%2$d, sizeof(*s->vars));\n\ + if (!s->vars) { \n\ + err = -ENOMEM; \n\ + goto err; \n\ + } \n\ + ", + obj_name, var_cnt + ); + + /* walk through each symbol and emit the runtime representation */ + bpf_object__for_each_map(map, obj) { + if (!is_internal_mmapable_map(map, ident, sizeof(ident))) + continue; + + map_type_id = bpf_map__btf_value_type_id(map); + if (map_type_id <= 0) + /* skip over internal maps with no type*/ + continue; + + map_type = btf__type_by_id(btf, map_type_id); + var = btf_var_secinfos(map_type); + len = btf_vlen(map_type); + for (i = 0; i < len; i++, var++) { + var_type = btf__type_by_id(btf, var->type); + var_name = btf__name_by_offset(btf, var_type->name_off); + + if (btf_var(var_type)->linkage == BTF_VAR_STATIC) + continue; + + /* Note that we use the dot prefix in .data as the + * field access operator i.e. maps%s becomes maps.data + */ + codegen("\ + \n\ + \n\ + s->vars[%3$d].name = \"%1$s\"; \n\ + s->vars[%3$d].map = &obj->maps.%2$s; \n\ + s->vars[%3$d].addr = (void **) &obj->%2$s.%1$s;\n\ + ", var_name, ident, var_idx); + + var_idx++; + } + } + + codegen_maps_skeleton(obj, map_cnt, false /*mmaped*/); + codegen_progs_skeleton(obj, prog_cnt, false /*links*/); + + codegen("\ + \n\ + \n\ + err = bpf_object__open_subskeleton(s); \n\ + if (err) \n\ + goto err; \n\ + \n\ + return obj; \n\ + err: \n\ + %1$s__destroy(obj); \n\ + errno = -err; \n\ + return NULL; \n\ + } \n\ + \n\ + #ifdef __cplusplus \n\ + struct %1$s *%1$s::open(const struct bpf_object *src) { return %1$s__open(src); }\n\ + void %1$s::destroy(struct %1$s *skel) { %1$s__destroy(skel); }\n\ + #endif /* __cplusplus */ \n\ + \n\ + #endif /* %2$s */ \n\ + ", + obj_name, header_guard); + err = 0; +out: + bpf_object__close(obj); + if (obj_data) + munmap(obj_data, mmap_sz); + close(fd); + return err; +} + +static int do_object(int argc, char **argv) +{ + struct bpf_linker *linker; + const char *output_file, *file; + int err = 0; + + if (!REQ_ARGS(2)) { + usage(); + return -1; + } + + output_file = GET_ARG(); + + linker = bpf_linker__new(output_file, NULL); + if (!linker) { + p_err("failed to create BPF linker instance"); + return -1; + } + + while (argc) { + file = GET_ARG(); + + err = bpf_linker__add_file(linker, file, NULL); + if (err) { + p_err("failed to link '%s': %s (%d)", file, strerror(errno), errno); + goto out; + } + } + + err = bpf_linker__finalize(linker); + if (err) { + p_err("failed to finalize ELF file: %s (%d)", strerror(errno), errno); + goto out; + } + + err = 0; +out: + bpf_linker__free(linker); + return err; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %1$s %2$s object OUTPUT_FILE INPUT_FILE [INPUT_FILE...]\n" + " %1$s %2$s skeleton FILE [name OBJECT_NAME]\n" + " %1$s %2$s subskeleton FILE [name OBJECT_NAME]\n" + " %1$s %2$s min_core_btf INPUT OUTPUT OBJECT [OBJECT...]\n" + " %1$s %2$s help\n" + "\n" + " " HELP_SPEC_OPTIONS " |\n" + " {-L|--use-loader} }\n" + "", + bin_name, "gen"); + + return 0; +} + +static int btf_save_raw(const struct btf *btf, const char *path) +{ + const void *data; + FILE *f = NULL; + __u32 data_sz; + int err = 0; + + data = btf__raw_data(btf, &data_sz); + if (!data) + return -ENOMEM; + + f = fopen(path, "wb"); + if (!f) + return -errno; + + if (fwrite(data, 1, data_sz, f) != data_sz) + err = -errno; + + fclose(f); + return err; +} + +struct btfgen_info { + struct btf *src_btf; + struct btf *marked_btf; /* btf structure used to mark used types */ +}; + +static size_t btfgen_hash_fn(long key, void *ctx) +{ + return key; +} + +static bool btfgen_equal_fn(long k1, long k2, void *ctx) +{ + return k1 == k2; +} + +static void btfgen_free_info(struct btfgen_info *info) +{ + if (!info) + return; + + btf__free(info->src_btf); + btf__free(info->marked_btf); + + free(info); +} + +static struct btfgen_info * +btfgen_new_info(const char *targ_btf_path) +{ + struct btfgen_info *info; + int err; + + info = calloc(1, sizeof(*info)); + if (!info) + return NULL; + + info->src_btf = btf__parse(targ_btf_path, NULL); + if (!info->src_btf) { + err = -errno; + p_err("failed parsing '%s' BTF file: %s", targ_btf_path, strerror(errno)); + goto err_out; + } + + info->marked_btf = btf__parse(targ_btf_path, NULL); + if (!info->marked_btf) { + err = -errno; + p_err("failed parsing '%s' BTF file: %s", targ_btf_path, strerror(errno)); + goto err_out; + } + + return info; + +err_out: + btfgen_free_info(info); + errno = -err; + return NULL; +} + +#define MARKED UINT32_MAX + +static void btfgen_mark_member(struct btfgen_info *info, int type_id, int idx) +{ + const struct btf_type *t = btf__type_by_id(info->marked_btf, type_id); + struct btf_member *m = btf_members(t) + idx; + + m->name_off = MARKED; +} + +static int +btfgen_mark_type(struct btfgen_info *info, unsigned int type_id, bool follow_pointers) +{ + const struct btf_type *btf_type = btf__type_by_id(info->src_btf, type_id); + struct btf_type *cloned_type; + struct btf_param *param; + struct btf_array *array; + int err, i; + + if (type_id == 0) + return 0; + + /* mark type on cloned BTF as used */ + cloned_type = (struct btf_type *) btf__type_by_id(info->marked_btf, type_id); + cloned_type->name_off = MARKED; + + /* recursively mark other types needed by it */ + switch (btf_kind(btf_type)) { + case BTF_KIND_UNKN: + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + break; + case BTF_KIND_PTR: + if (follow_pointers) { + err = btfgen_mark_type(info, btf_type->type, follow_pointers); + if (err) + return err; + } + break; + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_VOLATILE: + case BTF_KIND_TYPEDEF: + err = btfgen_mark_type(info, btf_type->type, follow_pointers); + if (err) + return err; + break; + case BTF_KIND_ARRAY: + array = btf_array(btf_type); + + /* mark array type */ + err = btfgen_mark_type(info, array->type, follow_pointers); + /* mark array's index type */ + err = err ? : btfgen_mark_type(info, array->index_type, follow_pointers); + if (err) + return err; + break; + case BTF_KIND_FUNC_PROTO: + /* mark ret type */ + err = btfgen_mark_type(info, btf_type->type, follow_pointers); + if (err) + return err; + + /* mark parameters types */ + param = btf_params(btf_type); + for (i = 0; i < btf_vlen(btf_type); i++) { + err = btfgen_mark_type(info, param->type, follow_pointers); + if (err) + return err; + param++; + } + break; + /* tells if some other type needs to be handled */ + default: + p_err("unsupported kind: %s (%d)", btf_kind_str(btf_type), type_id); + return -EINVAL; + } + + return 0; +} + +static int btfgen_record_field_relo(struct btfgen_info *info, struct bpf_core_spec *targ_spec) +{ + struct btf *btf = info->src_btf; + const struct btf_type *btf_type; + struct btf_member *btf_member; + struct btf_array *array; + unsigned int type_id = targ_spec->root_type_id; + int idx, err; + + /* mark root type */ + btf_type = btf__type_by_id(btf, type_id); + err = btfgen_mark_type(info, type_id, false); + if (err) + return err; + + /* mark types for complex types (arrays, unions, structures) */ + for (int i = 1; i < targ_spec->raw_len; i++) { + /* skip typedefs and mods */ + while (btf_is_mod(btf_type) || btf_is_typedef(btf_type)) { + type_id = btf_type->type; + btf_type = btf__type_by_id(btf, type_id); + } + + switch (btf_kind(btf_type)) { + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + idx = targ_spec->raw_spec[i]; + btf_member = btf_members(btf_type) + idx; + + /* mark member */ + btfgen_mark_member(info, type_id, idx); + + /* mark member's type */ + type_id = btf_member->type; + btf_type = btf__type_by_id(btf, type_id); + err = btfgen_mark_type(info, type_id, false); + if (err) + return err; + break; + case BTF_KIND_ARRAY: + array = btf_array(btf_type); + type_id = array->type; + btf_type = btf__type_by_id(btf, type_id); + break; + default: + p_err("unsupported kind: %s (%d)", + btf_kind_str(btf_type), btf_type->type); + return -EINVAL; + } + } + + return 0; +} + +/* Mark types, members, and member types. Compared to btfgen_record_field_relo, + * this function does not rely on the target spec for inferring members, but + * uses the associated BTF. + * + * The `behind_ptr` argument is used to stop marking of composite types reached + * through a pointer. This way, we can keep BTF size in check while providing + * reasonable match semantics. + */ +static int btfgen_mark_type_match(struct btfgen_info *info, __u32 type_id, bool behind_ptr) +{ + const struct btf_type *btf_type; + struct btf *btf = info->src_btf; + struct btf_type *cloned_type; + int i, err; + + if (type_id == 0) + return 0; + + btf_type = btf__type_by_id(btf, type_id); + /* mark type on cloned BTF as used */ + cloned_type = (struct btf_type *)btf__type_by_id(info->marked_btf, type_id); + cloned_type->name_off = MARKED; + + switch (btf_kind(btf_type)) { + case BTF_KIND_UNKN: + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + break; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + struct btf_member *m = btf_members(btf_type); + __u16 vlen = btf_vlen(btf_type); + + if (behind_ptr) + break; + + for (i = 0; i < vlen; i++, m++) { + /* mark member */ + btfgen_mark_member(info, type_id, i); + + /* mark member's type */ + err = btfgen_mark_type_match(info, m->type, false); + if (err) + return err; + } + break; + } + case BTF_KIND_CONST: + case BTF_KIND_FWD: + case BTF_KIND_RESTRICT: + case BTF_KIND_TYPEDEF: + case BTF_KIND_VOLATILE: + return btfgen_mark_type_match(info, btf_type->type, behind_ptr); + case BTF_KIND_PTR: + return btfgen_mark_type_match(info, btf_type->type, true); + case BTF_KIND_ARRAY: { + struct btf_array *array; + + array = btf_array(btf_type); + /* mark array type */ + err = btfgen_mark_type_match(info, array->type, false); + /* mark array's index type */ + err = err ? : btfgen_mark_type_match(info, array->index_type, false); + if (err) + return err; + break; + } + case BTF_KIND_FUNC_PROTO: { + __u16 vlen = btf_vlen(btf_type); + struct btf_param *param; + + /* mark ret type */ + err = btfgen_mark_type_match(info, btf_type->type, false); + if (err) + return err; + + /* mark parameters types */ + param = btf_params(btf_type); + for (i = 0; i < vlen; i++) { + err = btfgen_mark_type_match(info, param->type, false); + if (err) + return err; + param++; + } + break; + } + /* tells if some other type needs to be handled */ + default: + p_err("unsupported kind: %s (%d)", btf_kind_str(btf_type), type_id); + return -EINVAL; + } + + return 0; +} + +/* Mark types, members, and member types. Compared to btfgen_record_field_relo, + * this function does not rely on the target spec for inferring members, but + * uses the associated BTF. + */ +static int btfgen_record_type_match_relo(struct btfgen_info *info, struct bpf_core_spec *targ_spec) +{ + return btfgen_mark_type_match(info, targ_spec->root_type_id, false); +} + +static int btfgen_record_type_relo(struct btfgen_info *info, struct bpf_core_spec *targ_spec) +{ + return btfgen_mark_type(info, targ_spec->root_type_id, true); +} + +static int btfgen_record_enumval_relo(struct btfgen_info *info, struct bpf_core_spec *targ_spec) +{ + return btfgen_mark_type(info, targ_spec->root_type_id, false); +} + +static int btfgen_record_reloc(struct btfgen_info *info, struct bpf_core_spec *res) +{ + switch (res->relo_kind) { + case BPF_CORE_FIELD_BYTE_OFFSET: + case BPF_CORE_FIELD_BYTE_SIZE: + case BPF_CORE_FIELD_EXISTS: + case BPF_CORE_FIELD_SIGNED: + case BPF_CORE_FIELD_LSHIFT_U64: + case BPF_CORE_FIELD_RSHIFT_U64: + return btfgen_record_field_relo(info, res); + case BPF_CORE_TYPE_ID_LOCAL: /* BPF_CORE_TYPE_ID_LOCAL doesn't require kernel BTF */ + return 0; + case BPF_CORE_TYPE_ID_TARGET: + case BPF_CORE_TYPE_EXISTS: + case BPF_CORE_TYPE_SIZE: + return btfgen_record_type_relo(info, res); + case BPF_CORE_TYPE_MATCHES: + return btfgen_record_type_match_relo(info, res); + case BPF_CORE_ENUMVAL_EXISTS: + case BPF_CORE_ENUMVAL_VALUE: + return btfgen_record_enumval_relo(info, res); + default: + return -EINVAL; + } +} + +static struct bpf_core_cand_list * +btfgen_find_cands(const struct btf *local_btf, const struct btf *targ_btf, __u32 local_id) +{ + const struct btf_type *local_type; + struct bpf_core_cand_list *cands = NULL; + struct bpf_core_cand local_cand = {}; + size_t local_essent_len; + const char *local_name; + int err; + + local_cand.btf = local_btf; + local_cand.id = local_id; + + local_type = btf__type_by_id(local_btf, local_id); + if (!local_type) { + err = -EINVAL; + goto err_out; + } + + local_name = btf__name_by_offset(local_btf, local_type->name_off); + if (!local_name) { + err = -EINVAL; + goto err_out; + } + local_essent_len = bpf_core_essential_name_len(local_name); + + cands = calloc(1, sizeof(*cands)); + if (!cands) + return NULL; + + err = bpf_core_add_cands(&local_cand, local_essent_len, targ_btf, "vmlinux", 1, cands); + if (err) + goto err_out; + + return cands; + +err_out: + bpf_core_free_cands(cands); + errno = -err; + return NULL; +} + +/* Record relocation information for a single BPF object */ +static int btfgen_record_obj(struct btfgen_info *info, const char *obj_path) +{ + const struct btf_ext_info_sec *sec; + const struct bpf_core_relo *relo; + const struct btf_ext_info *seg; + struct hashmap_entry *entry; + struct hashmap *cand_cache = NULL; + struct btf_ext *btf_ext = NULL; + unsigned int relo_idx; + struct btf *btf = NULL; + size_t i; + int err; + + btf = btf__parse(obj_path, &btf_ext); + if (!btf) { + err = -errno; + p_err("failed to parse BPF object '%s': %s", obj_path, strerror(errno)); + return err; + } + + if (!btf_ext) { + p_err("failed to parse BPF object '%s': section %s not found", + obj_path, BTF_EXT_ELF_SEC); + err = -EINVAL; + goto out; + } + + if (btf_ext->core_relo_info.len == 0) { + err = 0; + goto out; + } + + cand_cache = hashmap__new(btfgen_hash_fn, btfgen_equal_fn, NULL); + if (IS_ERR(cand_cache)) { + err = PTR_ERR(cand_cache); + goto out; + } + + seg = &btf_ext->core_relo_info; + for_each_btf_ext_sec(seg, sec) { + for_each_btf_ext_rec(seg, sec, relo_idx, relo) { + struct bpf_core_spec specs_scratch[3] = {}; + struct bpf_core_relo_res targ_res = {}; + struct bpf_core_cand_list *cands = NULL; + const char *sec_name = btf__name_by_offset(btf, sec->sec_name_off); + + if (relo->kind != BPF_CORE_TYPE_ID_LOCAL && + !hashmap__find(cand_cache, relo->type_id, &cands)) { + cands = btfgen_find_cands(btf, info->src_btf, relo->type_id); + if (!cands) { + err = -errno; + goto out; + } + + err = hashmap__set(cand_cache, relo->type_id, cands, + NULL, NULL); + if (err) + goto out; + } + + err = bpf_core_calc_relo_insn(sec_name, relo, relo_idx, btf, cands, + specs_scratch, &targ_res); + if (err) + goto out; + + /* specs_scratch[2] is the target spec */ + err = btfgen_record_reloc(info, &specs_scratch[2]); + if (err) + goto out; + } + } + +out: + btf__free(btf); + btf_ext__free(btf_ext); + + if (!IS_ERR_OR_NULL(cand_cache)) { + hashmap__for_each_entry(cand_cache, entry, i) { + bpf_core_free_cands(entry->pvalue); + } + hashmap__free(cand_cache); + } + + return err; +} + +static int btfgen_remap_id(__u32 *type_id, void *ctx) +{ + unsigned int *ids = ctx; + + *type_id = ids[*type_id]; + + return 0; +} + +/* Generate BTF from relocation information previously recorded */ +static struct btf *btfgen_get_btf(struct btfgen_info *info) +{ + struct btf *btf_new = NULL; + unsigned int *ids = NULL; + unsigned int i, n = btf__type_cnt(info->marked_btf); + int err = 0; + + btf_new = btf__new_empty(); + if (!btf_new) { + err = -errno; + goto err_out; + } + + ids = calloc(n, sizeof(*ids)); + if (!ids) { + err = -errno; + goto err_out; + } + + /* first pass: add all marked types to btf_new and add their new ids to the ids map */ + for (i = 1; i < n; i++) { + const struct btf_type *cloned_type, *type; + const char *name; + int new_id; + + cloned_type = btf__type_by_id(info->marked_btf, i); + + if (cloned_type->name_off != MARKED) + continue; + + type = btf__type_by_id(info->src_btf, i); + + /* add members for struct and union */ + if (btf_is_composite(type)) { + struct btf_member *cloned_m, *m; + unsigned short vlen; + int idx_src; + + name = btf__str_by_offset(info->src_btf, type->name_off); + + if (btf_is_struct(type)) + err = btf__add_struct(btf_new, name, type->size); + else + err = btf__add_union(btf_new, name, type->size); + + if (err < 0) + goto err_out; + new_id = err; + + cloned_m = btf_members(cloned_type); + m = btf_members(type); + vlen = btf_vlen(cloned_type); + for (idx_src = 0; idx_src < vlen; idx_src++, cloned_m++, m++) { + /* add only members that are marked as used */ + if (cloned_m->name_off != MARKED) + continue; + + name = btf__str_by_offset(info->src_btf, m->name_off); + err = btf__add_field(btf_new, name, m->type, + btf_member_bit_offset(cloned_type, idx_src), + btf_member_bitfield_size(cloned_type, idx_src)); + if (err < 0) + goto err_out; + } + } else { + err = btf__add_type(btf_new, info->src_btf, type); + if (err < 0) + goto err_out; + new_id = err; + } + + /* add ID mapping */ + ids[i] = new_id; + } + + /* second pass: fix up type ids */ + for (i = 1; i < btf__type_cnt(btf_new); i++) { + struct btf_type *btf_type = (struct btf_type *) btf__type_by_id(btf_new, i); + + err = btf_type_visit_type_ids(btf_type, btfgen_remap_id, ids); + if (err) + goto err_out; + } + + free(ids); + return btf_new; + +err_out: + btf__free(btf_new); + free(ids); + errno = -err; + return NULL; +} + +/* Create minimized BTF file for a set of BPF objects. + * + * The BTFGen algorithm is divided in two main parts: (1) collect the + * BTF types that are involved in relocations and (2) generate the BTF + * object using the collected types. + * + * In order to collect the types involved in the relocations, we parse + * the BTF and BTF.ext sections of the BPF objects and use + * bpf_core_calc_relo_insn() to get the target specification, this + * indicates how the types and fields are used in a relocation. + * + * Types are recorded in different ways according to the kind of the + * relocation. For field-based relocations only the members that are + * actually used are saved in order to reduce the size of the generated + * BTF file. For type-based relocations empty struct / unions are + * generated and for enum-based relocations the whole type is saved. + * + * The second part of the algorithm generates the BTF object. It creates + * an empty BTF object and fills it with the types recorded in the + * previous step. This function takes care of only adding the structure + * and union members that were marked as used and it also fixes up the + * type IDs on the generated BTF object. + */ +static int minimize_btf(const char *src_btf, const char *dst_btf, const char *objspaths[]) +{ + struct btfgen_info *info; + struct btf *btf_new = NULL; + int err, i; + + info = btfgen_new_info(src_btf); + if (!info) { + err = -errno; + p_err("failed to allocate info structure: %s", strerror(errno)); + goto out; + } + + for (i = 0; objspaths[i] != NULL; i++) { + err = btfgen_record_obj(info, objspaths[i]); + if (err) { + p_err("error recording relocations for %s: %s", objspaths[i], + strerror(errno)); + goto out; + } + } + + btf_new = btfgen_get_btf(info); + if (!btf_new) { + err = -errno; + p_err("error generating BTF: %s", strerror(errno)); + goto out; + } + + err = btf_save_raw(btf_new, dst_btf); + if (err) { + p_err("error saving btf file: %s", strerror(errno)); + goto out; + } + +out: + btf__free(btf_new); + btfgen_free_info(info); + + return err; +} + +static int do_min_core_btf(int argc, char **argv) +{ + const char *input, *output, **objs; + int i, err; + + if (!REQ_ARGS(3)) { + usage(); + return -1; + } + + input = GET_ARG(); + output = GET_ARG(); + + objs = (const char **) calloc(argc + 1, sizeof(*objs)); + if (!objs) { + p_err("failed to allocate array for object names"); + return -ENOMEM; + } + + i = 0; + while (argc) + objs[i++] = GET_ARG(); + + err = minimize_btf(input, output, objs); + free(objs); + return err; +} + +static const struct cmd cmds[] = { + { "object", do_object }, + { "skeleton", do_skeleton }, + { "subskeleton", do_subskeleton }, + { "min_core_btf", do_min_core_btf}, + { "help", do_help }, + { 0 } +}; + +int do_gen(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/iter.c b/bpftool/src/iter.c new file mode 100644 index 0000000..9a1d236 --- /dev/null +++ b/bpftool/src/iter.c @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +// Copyright (C) 2020 Facebook + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include + +#include "main.h" + +static int do_pin(int argc, char **argv) +{ + DECLARE_LIBBPF_OPTS(bpf_iter_attach_opts, iter_opts); + union bpf_iter_link_info linfo; + const char *objfile, *path; + struct bpf_program *prog; + struct bpf_object *obj; + struct bpf_link *link; + int err = -1, map_fd = -1; + + if (!REQ_ARGS(2)) + usage(); + + objfile = GET_ARG(); + path = GET_ARG(); + + /* optional arguments */ + if (argc) { + if (is_prefix(*argv, "map")) { + NEXT_ARG(); + + if (!REQ_ARGS(2)) { + p_err("incorrect map spec"); + return -1; + } + + map_fd = map_parse_fd(&argc, &argv); + if (map_fd < 0) + return -1; + + memset(&linfo, 0, sizeof(linfo)); + linfo.map.map_fd = map_fd; + iter_opts.link_info = &linfo; + iter_opts.link_info_len = sizeof(linfo); + } + } + + obj = bpf_object__open(objfile); + if (!obj) { + err = -errno; + p_err("can't open objfile %s", objfile); + goto close_map_fd; + } + + err = bpf_object__load(obj); + if (err) { + p_err("can't load objfile %s", objfile); + goto close_obj; + } + + prog = bpf_object__next_program(obj, NULL); + if (!prog) { + err = -errno; + p_err("can't find bpf program in objfile %s", objfile); + goto close_obj; + } + + link = bpf_program__attach_iter(prog, &iter_opts); + if (!link) { + err = -errno; + p_err("attach_iter failed for program %s", + bpf_program__name(prog)); + goto close_obj; + } + + err = mount_bpffs_for_pin(path); + if (err) + goto close_link; + + err = bpf_link__pin(link, path); + if (err) { + p_err("pin_iter failed for program %s to path %s", + bpf_program__name(prog), path); + goto close_link; + } + +close_link: + bpf_link__destroy(link); +close_obj: + bpf_object__close(obj); +close_map_fd: + if (map_fd >= 0) + close(map_fd); + return err; +} + +static int do_help(int argc, char **argv) +{ + fprintf(stderr, + "Usage: %1$s %2$s pin OBJ PATH [map MAP]\n" + " %1$s %2$s help\n" + "\n" + " " HELP_SPEC_MAP "\n" + " " HELP_SPEC_OPTIONS " }\n" + "", + bin_name, "iter"); + + return 0; +} + +static const struct cmd cmds[] = { + { "help", do_help }, + { "pin", do_pin }, + { 0 } +}; + +int do_iter(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/jit_disasm.c b/bpftool/src/jit_disasm.c new file mode 100644 index 0000000..7b8d9ec --- /dev/null +++ b/bpftool/src/jit_disasm.c @@ -0,0 +1,403 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* + * Based on: + * + * Minimal BPF JIT image disassembler + * + * Disassembles BPF JIT compiler emitted opcodes back to asm insn's for + * debugging or verification purposes. + * + * Copyright 2013 Daniel Borkmann + * Licensed under the GNU General Public License, version 2.0 (GPLv2) + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_LLVM_SUPPORT +#include +#include +#include +#include +#endif + +#ifdef HAVE_LIBBFD_SUPPORT +#include +#include +#include +#endif + +#include "json_writer.h" +#include "main.h" + +static int oper_count; + +#ifdef HAVE_LLVM_SUPPORT +#define DISASM_SPACER + +typedef LLVMDisasmContextRef disasm_ctx_t; + +static int printf_json(char *s) +{ + s = strtok(s, " \t"); + jsonw_string_field(json_wtr, "operation", s); + + jsonw_name(json_wtr, "operands"); + jsonw_start_array(json_wtr); + oper_count = 1; + + while ((s = strtok(NULL, " \t,()")) != 0) { + jsonw_string(json_wtr, s); + oper_count++; + } + return 0; +} + +/* This callback to set the ref_type is necessary to have the LLVM disassembler + * print PC-relative addresses instead of byte offsets for branch instruction + * targets. + */ +static const char * +symbol_lookup_callback(__maybe_unused void *disasm_info, + __maybe_unused uint64_t ref_value, + uint64_t *ref_type, __maybe_unused uint64_t ref_PC, + __maybe_unused const char **ref_name) +{ + *ref_type = LLVMDisassembler_ReferenceType_InOut_None; + return NULL; +} + +static int +init_context(disasm_ctx_t *ctx, const char *arch, + __maybe_unused const char *disassembler_options, + __maybe_unused unsigned char *image, __maybe_unused ssize_t len) +{ + char *triple; + + if (arch) + triple = LLVMNormalizeTargetTriple(arch); + else + triple = LLVMGetDefaultTargetTriple(); + if (!triple) { + p_err("Failed to retrieve triple"); + return -1; + } + *ctx = LLVMCreateDisasm(triple, NULL, 0, NULL, symbol_lookup_callback); + LLVMDisposeMessage(triple); + + if (!*ctx) { + p_err("Failed to create disassembler"); + return -1; + } + + return 0; +} + +static void destroy_context(disasm_ctx_t *ctx) +{ + LLVMDisposeMessage(*ctx); +} + +static int +disassemble_insn(disasm_ctx_t *ctx, unsigned char *image, ssize_t len, int pc) +{ + char buf[256]; + int count; + + count = LLVMDisasmInstruction(*ctx, image + pc, len - pc, pc, + buf, sizeof(buf)); + if (json_output) + printf_json(buf); + else + printf("%s", buf); + + return count; +} + +int disasm_init(void) +{ + LLVMInitializeAllTargetInfos(); + LLVMInitializeAllTargetMCs(); + LLVMInitializeAllDisassemblers(); + return 0; +} +#endif /* HAVE_LLVM_SUPPORT */ + +#ifdef HAVE_LIBBFD_SUPPORT +#define DISASM_SPACER "\t" + +typedef struct { + struct disassemble_info *info; + disassembler_ftype disassemble; + bfd *bfdf; +} disasm_ctx_t; + +static int get_exec_path(char *tpath, size_t size) +{ + const char *path = "/proc/self/exe"; + ssize_t len; + + len = readlink(path, tpath, size - 1); + if (len <= 0) + return -1; + + tpath[len] = 0; + + return 0; +} + +static int printf_json(void *out, const char *fmt, va_list ap) +{ + char *s; + int err; + + err = vasprintf(&s, fmt, ap); + if (err < 0) + return -1; + + if (!oper_count) { + int i; + + /* Strip trailing spaces */ + i = strlen(s) - 1; + while (s[i] == ' ') + s[i--] = '\0'; + + jsonw_string_field(json_wtr, "operation", s); + jsonw_name(json_wtr, "operands"); + jsonw_start_array(json_wtr); + oper_count++; + } else if (!strcmp(fmt, ",")) { + /* Skip */ + } else { + jsonw_string(json_wtr, s); + oper_count++; + } + free(s); + return 0; +} + +static int fprintf_json(void *out, const char *fmt, ...) +{ + va_list ap; + int r; + + va_start(ap, fmt); + r = printf_json(out, fmt, ap); + va_end(ap); + + return r; +} + +static int fprintf_json_styled(void *out, + enum disassembler_style style __maybe_unused, + const char *fmt, ...) +{ + va_list ap; + int r; + + va_start(ap, fmt); + r = printf_json(out, fmt, ap); + va_end(ap); + + return r; +} + +static int init_context(disasm_ctx_t *ctx, const char *arch, + const char *disassembler_options, + unsigned char *image, ssize_t len) +{ + struct disassemble_info *info; + char tpath[PATH_MAX]; + bfd *bfdf; + + memset(tpath, 0, sizeof(tpath)); + if (get_exec_path(tpath, sizeof(tpath))) { + p_err("failed to create disassembler (get_exec_path)"); + return -1; + } + + ctx->bfdf = bfd_openr(tpath, NULL); + if (!ctx->bfdf) { + p_err("failed to create disassembler (bfd_openr)"); + return -1; + } + if (!bfd_check_format(ctx->bfdf, bfd_object)) { + p_err("failed to create disassembler (bfd_check_format)"); + goto err_close; + } + bfdf = ctx->bfdf; + + ctx->info = malloc(sizeof(struct disassemble_info)); + if (!ctx->info) { + p_err("mem alloc failed"); + goto err_close; + } + info = ctx->info; + + if (json_output) + init_disassemble_info_compat(info, stdout, + (fprintf_ftype) fprintf_json, + fprintf_json_styled); + else + init_disassemble_info_compat(info, stdout, + (fprintf_ftype) fprintf, + fprintf_styled); + + /* Update architecture info for offload. */ + if (arch) { + const bfd_arch_info_type *inf = bfd_scan_arch(arch); + + if (inf) { + bfdf->arch_info = inf; + } else { + p_err("No libbfd support for %s", arch); + goto err_free; + } + } + + info->arch = bfd_get_arch(bfdf); + info->mach = bfd_get_mach(bfdf); + if (disassembler_options) + info->disassembler_options = disassembler_options; + info->buffer = image; + info->buffer_length = len; + + disassemble_init_for_target(info); + +#ifdef DISASM_FOUR_ARGS_SIGNATURE + ctx->disassemble = disassembler(info->arch, + bfd_big_endian(bfdf), + info->mach, + bfdf); +#else + ctx->disassemble = disassembler(bfdf); +#endif + if (!ctx->disassemble) { + p_err("failed to create disassembler"); + goto err_free; + } + return 0; + +err_free: + free(info); +err_close: + bfd_close(ctx->bfdf); + return -1; +} + +static void destroy_context(disasm_ctx_t *ctx) +{ + free(ctx->info); + bfd_close(ctx->bfdf); +} + +static int +disassemble_insn(disasm_ctx_t *ctx, __maybe_unused unsigned char *image, + __maybe_unused ssize_t len, int pc) +{ + return ctx->disassemble(pc, ctx->info); +} + +int disasm_init(void) +{ + bfd_init(); + return 0; +} +#endif /* HAVE_LIBBPFD_SUPPORT */ + +int disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, + const char *arch, const char *disassembler_options, + const struct btf *btf, + const struct bpf_prog_linfo *prog_linfo, + __u64 func_ksym, unsigned int func_idx, + bool linum) +{ + const struct bpf_line_info *linfo = NULL; + unsigned int nr_skip = 0; + int count, i, pc = 0; + disasm_ctx_t ctx; + + if (!len) + return -1; + + if (init_context(&ctx, arch, disassembler_options, image, len)) + return -1; + + if (json_output) + jsonw_start_array(json_wtr); + do { + if (prog_linfo) { + linfo = bpf_prog_linfo__lfind_addr_func(prog_linfo, + func_ksym + pc, + func_idx, + nr_skip); + if (linfo) + nr_skip++; + } + + if (json_output) { + jsonw_start_object(json_wtr); + oper_count = 0; + if (linfo) + btf_dump_linfo_json(btf, linfo, linum); + jsonw_name(json_wtr, "pc"); + jsonw_printf(json_wtr, "\"0x%x\"", pc); + } else { + if (linfo) + btf_dump_linfo_plain(btf, linfo, "; ", + linum); + printf("%4x:" DISASM_SPACER, pc); + } + + count = disassemble_insn(&ctx, image, len, pc); + + if (json_output) { + /* Operand array, was started in fprintf_json. Before + * that, make sure we have a _null_ value if no operand + * other than operation code was present. + */ + if (oper_count == 1) + jsonw_null(json_wtr); + jsonw_end_array(json_wtr); + } + + if (opcodes) { + if (json_output) { + jsonw_name(json_wtr, "opcodes"); + jsonw_start_array(json_wtr); + for (i = 0; i < count; ++i) + jsonw_printf(json_wtr, "\"0x%02hhx\"", + (uint8_t)image[pc + i]); + jsonw_end_array(json_wtr); + } else { + printf("\n\t"); + for (i = 0; i < count; ++i) + printf("%02x ", + (uint8_t)image[pc + i]); + } + } + if (json_output) + jsonw_end_object(json_wtr); + else + printf("\n"); + + pc += count; + } while (count > 0 && pc < len); + if (json_output) + jsonw_end_array(json_wtr); + + destroy_context(&ctx); + + return 0; +} diff --git a/bpftool/src/json_writer.c b/bpftool/src/json_writer.c new file mode 100644 index 0000000..7fea83b --- /dev/null +++ b/bpftool/src/json_writer.c @@ -0,0 +1,358 @@ +// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) +/* + * Simple streaming JSON writer + * + * This takes care of the annoying bits of JSON syntax like the commas + * after elements + * + * Authors: Stephen Hemminger + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "json_writer.h" + +struct json_writer { + FILE *out; /* output file */ + unsigned depth; /* nesting */ + bool pretty; /* optional whitepace */ + char sep; /* either nul or comma */ +}; + +/* indentation for pretty print */ +static void jsonw_indent(json_writer_t *self) +{ + unsigned i; + for (i = 0; i < self->depth; ++i) + fputs(" ", self->out); +} + +/* end current line and indent if pretty printing */ +static void jsonw_eol(json_writer_t *self) +{ + if (!self->pretty) + return; + + putc('\n', self->out); + jsonw_indent(self); +} + +/* If current object is not empty print a comma */ +static void jsonw_eor(json_writer_t *self) +{ + if (self->sep != '\0') + putc(self->sep, self->out); + self->sep = ','; +} + + +/* Output JSON encoded string */ +/* Handles C escapes, does not do Unicode */ +static void jsonw_puts(json_writer_t *self, const char *str) +{ + putc('"', self->out); + for (; *str; ++str) + switch (*str) { + case '\t': + fputs("\\t", self->out); + break; + case '\n': + fputs("\\n", self->out); + break; + case '\r': + fputs("\\r", self->out); + break; + case '\f': + fputs("\\f", self->out); + break; + case '\b': + fputs("\\b", self->out); + break; + case '\\': + fputs("\\n", self->out); + break; + case '"': + fputs("\\\"", self->out); + break; + case '\'': + fputs("\\\'", self->out); + break; + default: + putc(*str, self->out); + } + putc('"', self->out); +} + +/* Create a new JSON stream */ +json_writer_t *jsonw_new(FILE *f) +{ + json_writer_t *self = malloc(sizeof(*self)); + if (self) { + self->out = f; + self->depth = 0; + self->pretty = false; + self->sep = '\0'; + } + return self; +} + +/* End output to JSON stream */ +void jsonw_destroy(json_writer_t **self_p) +{ + json_writer_t *self = *self_p; + + assert(self->depth == 0); + fputs("\n", self->out); + fflush(self->out); + free(self); + *self_p = NULL; +} + +void jsonw_pretty(json_writer_t *self, bool on) +{ + self->pretty = on; +} + +void jsonw_reset(json_writer_t *self) +{ + assert(self->depth == 0); + self->sep = '\0'; +} + +/* Basic blocks */ +static void jsonw_begin(json_writer_t *self, int c) +{ + jsonw_eor(self); + putc(c, self->out); + ++self->depth; + self->sep = '\0'; +} + +static void jsonw_end(json_writer_t *self, int c) +{ + assert(self->depth > 0); + + --self->depth; + if (self->sep != '\0') + jsonw_eol(self); + putc(c, self->out); + self->sep = ','; +} + + +/* Add a JSON property name */ +void jsonw_name(json_writer_t *self, const char *name) +{ + jsonw_eor(self); + jsonw_eol(self); + self->sep = '\0'; + jsonw_puts(self, name); + putc(':', self->out); + if (self->pretty) + putc(' ', self->out); +} + +void jsonw_vprintf_enquote(json_writer_t *self, const char *fmt, va_list ap) +{ + jsonw_eor(self); + putc('"', self->out); + vfprintf(self->out, fmt, ap); + putc('"', self->out); +} + +void jsonw_printf(json_writer_t *self, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + jsonw_eor(self); + vfprintf(self->out, fmt, ap); + va_end(ap); +} + +/* Collections */ +void jsonw_start_object(json_writer_t *self) +{ + jsonw_begin(self, '{'); +} + +void jsonw_end_object(json_writer_t *self) +{ + jsonw_end(self, '}'); +} + +void jsonw_start_array(json_writer_t *self) +{ + jsonw_begin(self, '['); +} + +void jsonw_end_array(json_writer_t *self) +{ + jsonw_end(self, ']'); +} + +/* JSON value types */ +void jsonw_string(json_writer_t *self, const char *value) +{ + jsonw_eor(self); + jsonw_puts(self, value); +} + +void jsonw_bool(json_writer_t *self, bool val) +{ + jsonw_printf(self, "%s", val ? "true" : "false"); +} + +void jsonw_null(json_writer_t *self) +{ + jsonw_printf(self, "null"); +} + +void jsonw_float_fmt(json_writer_t *self, const char *fmt, double num) +{ + jsonw_printf(self, fmt, num); +} + +#ifdef notused +void jsonw_float(json_writer_t *self, double num) +{ + jsonw_printf(self, "%g", num); +} +#endif + +void jsonw_hu(json_writer_t *self, unsigned short num) +{ + jsonw_printf(self, "%hu", num); +} + +void jsonw_uint(json_writer_t *self, uint64_t num) +{ + jsonw_printf(self, "%"PRIu64, num); +} + +void jsonw_lluint(json_writer_t *self, unsigned long long int num) +{ + jsonw_printf(self, "%llu", num); +} + +void jsonw_int(json_writer_t *self, int64_t num) +{ + jsonw_printf(self, "%"PRId64, num); +} + +/* Basic name/value objects */ +void jsonw_string_field(json_writer_t *self, const char *prop, const char *val) +{ + jsonw_name(self, prop); + jsonw_string(self, val); +} + +void jsonw_bool_field(json_writer_t *self, const char *prop, bool val) +{ + jsonw_name(self, prop); + jsonw_bool(self, val); +} + +#ifdef notused +void jsonw_float_field(json_writer_t *self, const char *prop, double val) +{ + jsonw_name(self, prop); + jsonw_float(self, val); +} +#endif + +void jsonw_float_field_fmt(json_writer_t *self, + const char *prop, + const char *fmt, + double val) +{ + jsonw_name(self, prop); + jsonw_float_fmt(self, fmt, val); +} + +void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num) +{ + jsonw_name(self, prop); + jsonw_uint(self, num); +} + +void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num) +{ + jsonw_name(self, prop); + jsonw_hu(self, num); +} + +void jsonw_lluint_field(json_writer_t *self, + const char *prop, + unsigned long long int num) +{ + jsonw_name(self, prop); + jsonw_lluint(self, num); +} + +void jsonw_int_field(json_writer_t *self, const char *prop, int64_t num) +{ + jsonw_name(self, prop); + jsonw_int(self, num); +} + +void jsonw_null_field(json_writer_t *self, const char *prop) +{ + jsonw_name(self, prop); + jsonw_null(self); +} + +#ifdef TEST +int main(int argc, char **argv) +{ + json_writer_t *wr = jsonw_new(stdout); + + jsonw_start_object(wr); + jsonw_pretty(wr, true); + jsonw_name(wr, "Vyatta"); + jsonw_start_object(wr); + jsonw_string_field(wr, "url", "http://vyatta.com"); + jsonw_uint_field(wr, "downloads", 2000000ul); + jsonw_float_field(wr, "stock", 8.16); + + jsonw_name(wr, "ARGV"); + jsonw_start_array(wr); + while (--argc) + jsonw_string(wr, *++argv); + jsonw_end_array(wr); + + jsonw_name(wr, "empty"); + jsonw_start_array(wr); + jsonw_end_array(wr); + + jsonw_name(wr, "NIL"); + jsonw_start_object(wr); + jsonw_end_object(wr); + + jsonw_null_field(wr, "my_null"); + + jsonw_name(wr, "special chars"); + jsonw_start_array(wr); + jsonw_string_field(wr, "slash", "/"); + jsonw_string_field(wr, "newline", "\n"); + jsonw_string_field(wr, "tab", "\t"); + jsonw_string_field(wr, "ff", "\f"); + jsonw_string_field(wr, "quote", "\""); + jsonw_string_field(wr, "tick", "\'"); + jsonw_string_field(wr, "backslash", "\\"); + jsonw_end_array(wr); + + jsonw_end_object(wr); + + jsonw_end_object(wr); + jsonw_destroy(&wr); + return 0; +} + +#endif diff --git a/bpftool/src/json_writer.h b/bpftool/src/json_writer.h new file mode 100644 index 0000000..8ace65c --- /dev/null +++ b/bpftool/src/json_writer.h @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* + * Simple streaming JSON writer + * + * This takes care of the annoying bits of JSON syntax like the commas + * after elements + * + * Authors: Stephen Hemminger + */ + +#ifndef _JSON_WRITER_H_ +#define _JSON_WRITER_H_ + +#include +#include +#include +#include + +/* Opaque class structure */ +typedef struct json_writer json_writer_t; + +/* Create a new JSON stream */ +json_writer_t *jsonw_new(FILE *f); +/* End output to JSON stream */ +void jsonw_destroy(json_writer_t **self_p); + +/* Cause output to have pretty whitespace */ +void jsonw_pretty(json_writer_t *self, bool on); + +/* Reset separator to create new JSON */ +void jsonw_reset(json_writer_t *self); + +/* Add property name */ +void jsonw_name(json_writer_t *self, const char *name); + +/* Add value */ +void __printf(2, 0) jsonw_vprintf_enquote(json_writer_t *self, const char *fmt, + va_list ap); +void __printf(2, 3) jsonw_printf(json_writer_t *self, const char *fmt, ...); +void jsonw_string(json_writer_t *self, const char *value); +void jsonw_bool(json_writer_t *self, bool value); +void jsonw_float(json_writer_t *self, double number); +void jsonw_float_fmt(json_writer_t *self, const char *fmt, double num); +void jsonw_uint(json_writer_t *self, uint64_t number); +void jsonw_hu(json_writer_t *self, unsigned short number); +void jsonw_int(json_writer_t *self, int64_t number); +void jsonw_null(json_writer_t *self); +void jsonw_lluint(json_writer_t *self, unsigned long long int num); + +/* Useful Combinations of name and value */ +void jsonw_string_field(json_writer_t *self, const char *prop, const char *val); +void jsonw_bool_field(json_writer_t *self, const char *prop, bool value); +void jsonw_float_field(json_writer_t *self, const char *prop, double num); +void jsonw_uint_field(json_writer_t *self, const char *prop, uint64_t num); +void jsonw_hu_field(json_writer_t *self, const char *prop, unsigned short num); +void jsonw_int_field(json_writer_t *self, const char *prop, int64_t num); +void jsonw_null_field(json_writer_t *self, const char *prop); +void jsonw_lluint_field(json_writer_t *self, const char *prop, + unsigned long long int num); +void jsonw_float_field_fmt(json_writer_t *self, const char *prop, + const char *fmt, double val); + +/* Collections */ +void jsonw_start_object(json_writer_t *self); +void jsonw_end_object(json_writer_t *self); + +void jsonw_start_array(json_writer_t *self); +void jsonw_end_array(json_writer_t *self); + +/* Override default exception handling */ +typedef void (jsonw_err_handler_fn)(const char *); + +#endif /* _JSON_WRITER_H_ */ diff --git a/bpftool/src/kernel/bpf/disasm.c b/bpftool/src/kernel/bpf/disasm.c new file mode 100644 index 0000000..7b4afb7 --- /dev/null +++ b/bpftool/src/kernel/bpf/disasm.c @@ -0,0 +1,304 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com + * Copyright (c) 2016 Facebook + */ + +#include + +#include "disasm.h" + +#define __BPF_FUNC_STR_FN(x) [BPF_FUNC_ ## x] = __stringify(bpf_ ## x) +static const char * const func_id_str[] = { + __BPF_FUNC_MAPPER(__BPF_FUNC_STR_FN) +}; +#undef __BPF_FUNC_STR_FN + +static const char *__func_get_name(const struct bpf_insn_cbs *cbs, + const struct bpf_insn *insn, + char *buff, size_t len) +{ + BUILD_BUG_ON(ARRAY_SIZE(func_id_str) != __BPF_FUNC_MAX_ID); + + if (!insn->src_reg && + insn->imm >= 0 && insn->imm < __BPF_FUNC_MAX_ID && + func_id_str[insn->imm]) + return func_id_str[insn->imm]; + + if (cbs && cbs->cb_call) { + const char *res; + + res = cbs->cb_call(cbs->private_data, insn); + if (res) + return res; + } + + if (insn->src_reg == BPF_PSEUDO_CALL) + snprintf(buff, len, "%+d", insn->imm); + else if (insn->src_reg == BPF_PSEUDO_KFUNC_CALL) + snprintf(buff, len, "kernel-function"); + + return buff; +} + +static const char *__func_imm_name(const struct bpf_insn_cbs *cbs, + const struct bpf_insn *insn, + u64 full_imm, char *buff, size_t len) +{ + if (cbs && cbs->cb_imm) + return cbs->cb_imm(cbs->private_data, insn, full_imm); + + snprintf(buff, len, "0x%llx", (unsigned long long)full_imm); + return buff; +} + +const char *func_id_name(int id) +{ + if (id >= 0 && id < __BPF_FUNC_MAX_ID && func_id_str[id]) + return func_id_str[id]; + else + return "unknown"; +} + +const char *const bpf_class_string[8] = { + [BPF_LD] = "ld", + [BPF_LDX] = "ldx", + [BPF_ST] = "st", + [BPF_STX] = "stx", + [BPF_ALU] = "alu", + [BPF_JMP] = "jmp", + [BPF_JMP32] = "jmp32", + [BPF_ALU64] = "alu64", +}; + +const char *const bpf_alu_string[16] = { + [BPF_ADD >> 4] = "+=", + [BPF_SUB >> 4] = "-=", + [BPF_MUL >> 4] = "*=", + [BPF_DIV >> 4] = "/=", + [BPF_OR >> 4] = "|=", + [BPF_AND >> 4] = "&=", + [BPF_LSH >> 4] = "<<=", + [BPF_RSH >> 4] = ">>=", + [BPF_NEG >> 4] = "neg", + [BPF_MOD >> 4] = "%=", + [BPF_XOR >> 4] = "^=", + [BPF_MOV >> 4] = "=", + [BPF_ARSH >> 4] = "s>>=", + [BPF_END >> 4] = "endian", +}; + +static const char *const bpf_atomic_alu_string[16] = { + [BPF_ADD >> 4] = "add", + [BPF_AND >> 4] = "and", + [BPF_OR >> 4] = "or", + [BPF_XOR >> 4] = "xor", +}; + +static const char *const bpf_ldst_string[] = { + [BPF_W >> 3] = "u32", + [BPF_H >> 3] = "u16", + [BPF_B >> 3] = "u8", + [BPF_DW >> 3] = "u64", +}; + +static const char *const bpf_jmp_string[16] = { + [BPF_JA >> 4] = "jmp", + [BPF_JEQ >> 4] = "==", + [BPF_JGT >> 4] = ">", + [BPF_JLT >> 4] = "<", + [BPF_JGE >> 4] = ">=", + [BPF_JLE >> 4] = "<=", + [BPF_JSET >> 4] = "&", + [BPF_JNE >> 4] = "!=", + [BPF_JSGT >> 4] = "s>", + [BPF_JSLT >> 4] = "s<", + [BPF_JSGE >> 4] = "s>=", + [BPF_JSLE >> 4] = "s<=", + [BPF_CALL >> 4] = "call", + [BPF_EXIT >> 4] = "exit", +}; + +static void print_bpf_end_insn(bpf_insn_print_t verbose, + void *private_data, + const struct bpf_insn *insn) +{ + verbose(private_data, "(%02x) r%d = %s%d r%d\n", + insn->code, insn->dst_reg, + BPF_SRC(insn->code) == BPF_TO_BE ? "be" : "le", + insn->imm, insn->dst_reg); +} + +void print_bpf_insn(const struct bpf_insn_cbs *cbs, + const struct bpf_insn *insn, + bool allow_ptr_leaks) +{ + const bpf_insn_print_t verbose = cbs->cb_print; + u8 class = BPF_CLASS(insn->code); + + if (class == BPF_ALU || class == BPF_ALU64) { + if (BPF_OP(insn->code) == BPF_END) { + if (class == BPF_ALU64) + verbose(cbs->private_data, "BUG_alu64_%02x\n", insn->code); + else + print_bpf_end_insn(verbose, cbs->private_data, insn); + } else if (BPF_OP(insn->code) == BPF_NEG) { + verbose(cbs->private_data, "(%02x) %c%d = -%c%d\n", + insn->code, class == BPF_ALU ? 'w' : 'r', + insn->dst_reg, class == BPF_ALU ? 'w' : 'r', + insn->dst_reg); + } else if (BPF_SRC(insn->code) == BPF_X) { + verbose(cbs->private_data, "(%02x) %c%d %s %c%d\n", + insn->code, class == BPF_ALU ? 'w' : 'r', + insn->dst_reg, + bpf_alu_string[BPF_OP(insn->code) >> 4], + class == BPF_ALU ? 'w' : 'r', + insn->src_reg); + } else { + verbose(cbs->private_data, "(%02x) %c%d %s %d\n", + insn->code, class == BPF_ALU ? 'w' : 'r', + insn->dst_reg, + bpf_alu_string[BPF_OP(insn->code) >> 4], + insn->imm); + } + } else if (class == BPF_STX) { + if (BPF_MODE(insn->code) == BPF_MEM) + verbose(cbs->private_data, "(%02x) *(%s *)(r%d %+d) = r%d\n", + insn->code, + bpf_ldst_string[BPF_SIZE(insn->code) >> 3], + insn->dst_reg, + insn->off, insn->src_reg); + else if (BPF_MODE(insn->code) == BPF_ATOMIC && + (insn->imm == BPF_ADD || insn->imm == BPF_AND || + insn->imm == BPF_OR || insn->imm == BPF_XOR)) { + verbose(cbs->private_data, "(%02x) lock *(%s *)(r%d %+d) %s r%d\n", + insn->code, + bpf_ldst_string[BPF_SIZE(insn->code) >> 3], + insn->dst_reg, insn->off, + bpf_alu_string[BPF_OP(insn->imm) >> 4], + insn->src_reg); + } else if (BPF_MODE(insn->code) == BPF_ATOMIC && + (insn->imm == (BPF_ADD | BPF_FETCH) || + insn->imm == (BPF_AND | BPF_FETCH) || + insn->imm == (BPF_OR | BPF_FETCH) || + insn->imm == (BPF_XOR | BPF_FETCH))) { + verbose(cbs->private_data, "(%02x) r%d = atomic%s_fetch_%s((%s *)(r%d %+d), r%d)\n", + insn->code, insn->src_reg, + BPF_SIZE(insn->code) == BPF_DW ? "64" : "", + bpf_atomic_alu_string[BPF_OP(insn->imm) >> 4], + bpf_ldst_string[BPF_SIZE(insn->code) >> 3], + insn->dst_reg, insn->off, insn->src_reg); + } else if (BPF_MODE(insn->code) == BPF_ATOMIC && + insn->imm == BPF_CMPXCHG) { + verbose(cbs->private_data, "(%02x) r0 = atomic%s_cmpxchg((%s *)(r%d %+d), r0, r%d)\n", + insn->code, + BPF_SIZE(insn->code) == BPF_DW ? "64" : "", + bpf_ldst_string[BPF_SIZE(insn->code) >> 3], + insn->dst_reg, insn->off, + insn->src_reg); + } else if (BPF_MODE(insn->code) == BPF_ATOMIC && + insn->imm == BPF_XCHG) { + verbose(cbs->private_data, "(%02x) r%d = atomic%s_xchg((%s *)(r%d %+d), r%d)\n", + insn->code, insn->src_reg, + BPF_SIZE(insn->code) == BPF_DW ? "64" : "", + bpf_ldst_string[BPF_SIZE(insn->code) >> 3], + insn->dst_reg, insn->off, insn->src_reg); + } else { + verbose(cbs->private_data, "BUG_%02x\n", insn->code); + } + } else if (class == BPF_ST) { + if (BPF_MODE(insn->code) == BPF_MEM) { + verbose(cbs->private_data, "(%02x) *(%s *)(r%d %+d) = %d\n", + insn->code, + bpf_ldst_string[BPF_SIZE(insn->code) >> 3], + insn->dst_reg, + insn->off, insn->imm); + } else if (BPF_MODE(insn->code) == 0xc0 /* BPF_NOSPEC, no UAPI */) { + verbose(cbs->private_data, "(%02x) nospec\n", insn->code); + } else { + verbose(cbs->private_data, "BUG_st_%02x\n", insn->code); + } + } else if (class == BPF_LDX) { + if (BPF_MODE(insn->code) != BPF_MEM) { + verbose(cbs->private_data, "BUG_ldx_%02x\n", insn->code); + return; + } + verbose(cbs->private_data, "(%02x) r%d = *(%s *)(r%d %+d)\n", + insn->code, insn->dst_reg, + bpf_ldst_string[BPF_SIZE(insn->code) >> 3], + insn->src_reg, insn->off); + } else if (class == BPF_LD) { + if (BPF_MODE(insn->code) == BPF_ABS) { + verbose(cbs->private_data, "(%02x) r0 = *(%s *)skb[%d]\n", + insn->code, + bpf_ldst_string[BPF_SIZE(insn->code) >> 3], + insn->imm); + } else if (BPF_MODE(insn->code) == BPF_IND) { + verbose(cbs->private_data, "(%02x) r0 = *(%s *)skb[r%d + %d]\n", + insn->code, + bpf_ldst_string[BPF_SIZE(insn->code) >> 3], + insn->src_reg, insn->imm); + } else if (BPF_MODE(insn->code) == BPF_IMM && + BPF_SIZE(insn->code) == BPF_DW) { + /* At this point, we already made sure that the second + * part of the ldimm64 insn is accessible. + */ + u64 imm = ((u64)(insn + 1)->imm << 32) | (u32)insn->imm; + bool is_ptr = insn->src_reg == BPF_PSEUDO_MAP_FD || + insn->src_reg == BPF_PSEUDO_MAP_VALUE; + char tmp[64]; + + if (is_ptr && !allow_ptr_leaks) + imm = 0; + + verbose(cbs->private_data, "(%02x) r%d = %s\n", + insn->code, insn->dst_reg, + __func_imm_name(cbs, insn, imm, + tmp, sizeof(tmp))); + } else { + verbose(cbs->private_data, "BUG_ld_%02x\n", insn->code); + return; + } + } else if (class == BPF_JMP32 || class == BPF_JMP) { + u8 opcode = BPF_OP(insn->code); + + if (opcode == BPF_CALL) { + char tmp[64]; + + if (insn->src_reg == BPF_PSEUDO_CALL) { + verbose(cbs->private_data, "(%02x) call pc%s\n", + insn->code, + __func_get_name(cbs, insn, + tmp, sizeof(tmp))); + } else { + strcpy(tmp, "unknown"); + verbose(cbs->private_data, "(%02x) call %s#%d\n", insn->code, + __func_get_name(cbs, insn, + tmp, sizeof(tmp)), + insn->imm); + } + } else if (insn->code == (BPF_JMP | BPF_JA)) { + verbose(cbs->private_data, "(%02x) goto pc%+d\n", + insn->code, insn->off); + } else if (insn->code == (BPF_JMP | BPF_EXIT)) { + verbose(cbs->private_data, "(%02x) exit\n", insn->code); + } else if (BPF_SRC(insn->code) == BPF_X) { + verbose(cbs->private_data, + "(%02x) if %c%d %s %c%d goto pc%+d\n", + insn->code, class == BPF_JMP32 ? 'w' : 'r', + insn->dst_reg, + bpf_jmp_string[BPF_OP(insn->code) >> 4], + class == BPF_JMP32 ? 'w' : 'r', + insn->src_reg, insn->off); + } else { + verbose(cbs->private_data, + "(%02x) if %c%d %s 0x%x goto pc%+d\n", + insn->code, class == BPF_JMP32 ? 'w' : 'r', + insn->dst_reg, + bpf_jmp_string[BPF_OP(insn->code) >> 4], + insn->imm, insn->off); + } + } else { + verbose(cbs->private_data, "(%02x) %s\n", + insn->code, bpf_class_string[class]); + } +} diff --git a/bpftool/src/kernel/bpf/disasm.h b/bpftool/src/kernel/bpf/disasm.h new file mode 100644 index 0000000..a4b0407 --- /dev/null +++ b/bpftool/src/kernel/bpf/disasm.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com + * Copyright (c) 2016 Facebook + */ + +#ifndef __BPF_DISASM_H__ +#define __BPF_DISASM_H__ + +#include +#include +#include +#ifndef __KERNEL__ +#include +#include +#endif + +extern const char *const bpf_alu_string[16]; +extern const char *const bpf_class_string[8]; + +const char *func_id_name(int id); + +typedef __printf(2, 3) void (*bpf_insn_print_t)(void *private_data, + const char *, ...); +typedef const char *(*bpf_insn_revmap_call_t)(void *private_data, + const struct bpf_insn *insn); +typedef const char *(*bpf_insn_print_imm_t)(void *private_data, + const struct bpf_insn *insn, + __u64 full_imm); + +struct bpf_insn_cbs { + bpf_insn_print_t cb_print; + bpf_insn_revmap_call_t cb_call; + bpf_insn_print_imm_t cb_imm; + void *private_data; +}; + +void print_bpf_insn(const struct bpf_insn_cbs *cbs, + const struct bpf_insn *insn, + bool allow_ptr_leaks); +#endif diff --git a/bpftool/src/link.c b/bpftool/src/link.c new file mode 100644 index 0000000..f985b79 --- /dev/null +++ b/bpftool/src/link.c @@ -0,0 +1,493 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2020 Facebook */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "json_writer.h" +#include "main.h" + +static struct hashmap *link_table; + +static int link_parse_fd(int *argc, char ***argv) +{ + int fd; + + if (is_prefix(**argv, "id")) { + unsigned int id; + char *endptr; + + NEXT_ARGP(); + + id = strtoul(**argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as ID", **argv); + return -1; + } + NEXT_ARGP(); + + fd = bpf_link_get_fd_by_id(id); + if (fd < 0) + p_err("failed to get link with ID %d: %s", id, strerror(errno)); + return fd; + } else if (is_prefix(**argv, "pinned")) { + char *path; + + NEXT_ARGP(); + + path = **argv; + NEXT_ARGP(); + + return open_obj_pinned_any(path, BPF_OBJ_LINK); + } + + p_err("expected 'id' or 'pinned', got: '%s'?", **argv); + return -1; +} + +static void +show_link_header_json(struct bpf_link_info *info, json_writer_t *wtr) +{ + const char *link_type_str; + + jsonw_uint_field(wtr, "id", info->id); + link_type_str = libbpf_bpf_link_type_str(info->type); + if (link_type_str) + jsonw_string_field(wtr, "type", link_type_str); + else + jsonw_uint_field(wtr, "type", info->type); + + jsonw_uint_field(json_wtr, "prog_id", info->prog_id); +} + +static void show_link_attach_type_json(__u32 attach_type, json_writer_t *wtr) +{ + const char *attach_type_str; + + attach_type_str = libbpf_bpf_attach_type_str(attach_type); + if (attach_type_str) + jsonw_string_field(wtr, "attach_type", attach_type_str); + else + jsonw_uint_field(wtr, "attach_type", attach_type); +} + +static bool is_iter_map_target(const char *target_name) +{ + return strcmp(target_name, "bpf_map_elem") == 0 || + strcmp(target_name, "bpf_sk_storage_map") == 0; +} + +static bool is_iter_cgroup_target(const char *target_name) +{ + return strcmp(target_name, "cgroup") == 0; +} + +static const char *cgroup_order_string(__u32 order) +{ + switch (order) { + case BPF_CGROUP_ITER_ORDER_UNSPEC: + return "order_unspec"; + case BPF_CGROUP_ITER_SELF_ONLY: + return "self_only"; + case BPF_CGROUP_ITER_DESCENDANTS_PRE: + return "descendants_pre"; + case BPF_CGROUP_ITER_DESCENDANTS_POST: + return "descendants_post"; + case BPF_CGROUP_ITER_ANCESTORS_UP: + return "ancestors_up"; + default: /* won't happen */ + return "unknown"; + } +} + +static bool is_iter_task_target(const char *target_name) +{ + return strcmp(target_name, "task") == 0 || + strcmp(target_name, "task_file") == 0 || + strcmp(target_name, "task_vma") == 0; +} + +static void show_iter_json(struct bpf_link_info *info, json_writer_t *wtr) +{ + const char *target_name = u64_to_ptr(info->iter.target_name); + + jsonw_string_field(wtr, "target_name", target_name); + + if (is_iter_map_target(target_name)) + jsonw_uint_field(wtr, "map_id", info->iter.map.map_id); + else if (is_iter_task_target(target_name)) { + if (info->iter.task.tid) + jsonw_uint_field(wtr, "tid", info->iter.task.tid); + else if (info->iter.task.pid) + jsonw_uint_field(wtr, "pid", info->iter.task.pid); + } + + if (is_iter_cgroup_target(target_name)) { + jsonw_lluint_field(wtr, "cgroup_id", info->iter.cgroup.cgroup_id); + jsonw_string_field(wtr, "order", + cgroup_order_string(info->iter.cgroup.order)); + } +} + +static int get_prog_info(int prog_id, struct bpf_prog_info *info) +{ + __u32 len = sizeof(*info); + int err, prog_fd; + + prog_fd = bpf_prog_get_fd_by_id(prog_id); + if (prog_fd < 0) + return prog_fd; + + memset(info, 0, sizeof(*info)); + err = bpf_prog_get_info_by_fd(prog_fd, info, &len); + if (err) + p_err("can't get prog info: %s", strerror(errno)); + close(prog_fd); + return err; +} + +static int show_link_close_json(int fd, struct bpf_link_info *info) +{ + struct bpf_prog_info prog_info; + const char *prog_type_str; + int err; + + jsonw_start_object(json_wtr); + + show_link_header_json(info, json_wtr); + + switch (info->type) { + case BPF_LINK_TYPE_RAW_TRACEPOINT: + jsonw_string_field(json_wtr, "tp_name", + u64_to_ptr(info->raw_tracepoint.tp_name)); + break; + case BPF_LINK_TYPE_TRACING: + err = get_prog_info(info->prog_id, &prog_info); + if (err) + return err; + + prog_type_str = libbpf_bpf_prog_type_str(prog_info.type); + /* libbpf will return NULL for variants unknown to it. */ + if (prog_type_str) + jsonw_string_field(json_wtr, "prog_type", prog_type_str); + else + jsonw_uint_field(json_wtr, "prog_type", prog_info.type); + + show_link_attach_type_json(info->tracing.attach_type, + json_wtr); + break; + case BPF_LINK_TYPE_CGROUP: + jsonw_lluint_field(json_wtr, "cgroup_id", + info->cgroup.cgroup_id); + show_link_attach_type_json(info->cgroup.attach_type, json_wtr); + break; + case BPF_LINK_TYPE_ITER: + show_iter_json(info, json_wtr); + break; + case BPF_LINK_TYPE_NETNS: + jsonw_uint_field(json_wtr, "netns_ino", + info->netns.netns_ino); + show_link_attach_type_json(info->netns.attach_type, json_wtr); + break; + default: + break; + } + + if (!hashmap__empty(link_table)) { + struct hashmap_entry *entry; + + jsonw_name(json_wtr, "pinned"); + jsonw_start_array(json_wtr); + hashmap__for_each_key_entry(link_table, entry, info->id) + jsonw_string(json_wtr, entry->pvalue); + jsonw_end_array(json_wtr); + } + + emit_obj_refs_json(refs_table, info->id, json_wtr); + + jsonw_end_object(json_wtr); + + return 0; +} + +static void show_link_header_plain(struct bpf_link_info *info) +{ + const char *link_type_str; + + printf("%u: ", info->id); + link_type_str = libbpf_bpf_link_type_str(info->type); + if (link_type_str) + printf("%s ", link_type_str); + else + printf("type %u ", info->type); + + printf("prog %u ", info->prog_id); +} + +static void show_link_attach_type_plain(__u32 attach_type) +{ + const char *attach_type_str; + + attach_type_str = libbpf_bpf_attach_type_str(attach_type); + if (attach_type_str) + printf("attach_type %s ", attach_type_str); + else + printf("attach_type %u ", attach_type); +} + +static void show_iter_plain(struct bpf_link_info *info) +{ + const char *target_name = u64_to_ptr(info->iter.target_name); + + printf("target_name %s ", target_name); + + if (is_iter_map_target(target_name)) + printf("map_id %u ", info->iter.map.map_id); + else if (is_iter_task_target(target_name)) { + if (info->iter.task.tid) + printf("tid %u ", info->iter.task.tid); + else if (info->iter.task.pid) + printf("pid %u ", info->iter.task.pid); + } + + if (is_iter_cgroup_target(target_name)) { + printf("cgroup_id %llu ", info->iter.cgroup.cgroup_id); + printf("order %s ", + cgroup_order_string(info->iter.cgroup.order)); + } +} + +static int show_link_close_plain(int fd, struct bpf_link_info *info) +{ + struct bpf_prog_info prog_info; + const char *prog_type_str; + int err; + + show_link_header_plain(info); + + switch (info->type) { + case BPF_LINK_TYPE_RAW_TRACEPOINT: + printf("\n\ttp '%s' ", + (const char *)u64_to_ptr(info->raw_tracepoint.tp_name)); + break; + case BPF_LINK_TYPE_TRACING: + err = get_prog_info(info->prog_id, &prog_info); + if (err) + return err; + + prog_type_str = libbpf_bpf_prog_type_str(prog_info.type); + /* libbpf will return NULL for variants unknown to it. */ + if (prog_type_str) + printf("\n\tprog_type %s ", prog_type_str); + else + printf("\n\tprog_type %u ", prog_info.type); + + show_link_attach_type_plain(info->tracing.attach_type); + break; + case BPF_LINK_TYPE_CGROUP: + printf("\n\tcgroup_id %zu ", (size_t)info->cgroup.cgroup_id); + show_link_attach_type_plain(info->cgroup.attach_type); + break; + case BPF_LINK_TYPE_ITER: + show_iter_plain(info); + break; + case BPF_LINK_TYPE_NETNS: + printf("\n\tnetns_ino %u ", info->netns.netns_ino); + show_link_attach_type_plain(info->netns.attach_type); + break; + default: + break; + } + + if (!hashmap__empty(link_table)) { + struct hashmap_entry *entry; + + hashmap__for_each_key_entry(link_table, entry, info->id) + printf("\n\tpinned %s", (char *)entry->pvalue); + } + emit_obj_refs_plain(refs_table, info->id, "\n\tpids "); + + printf("\n"); + + return 0; +} + +static int do_show_link(int fd) +{ + struct bpf_link_info info; + __u32 len = sizeof(info); + char buf[256]; + int err; + + memset(&info, 0, sizeof(info)); +again: + err = bpf_link_get_info_by_fd(fd, &info, &len); + if (err) { + p_err("can't get link info: %s", + strerror(errno)); + close(fd); + return err; + } + if (info.type == BPF_LINK_TYPE_RAW_TRACEPOINT && + !info.raw_tracepoint.tp_name) { + info.raw_tracepoint.tp_name = (unsigned long)&buf; + info.raw_tracepoint.tp_name_len = sizeof(buf); + goto again; + } + if (info.type == BPF_LINK_TYPE_ITER && + !info.iter.target_name) { + info.iter.target_name = (unsigned long)&buf; + info.iter.target_name_len = sizeof(buf); + goto again; + } + + if (json_output) + show_link_close_json(fd, &info); + else + show_link_close_plain(fd, &info); + + close(fd); + return 0; +} + +static int do_show(int argc, char **argv) +{ + __u32 id = 0; + int err, fd; + + if (show_pinned) { + link_table = hashmap__new(hash_fn_for_key_as_id, + equal_fn_for_key_as_id, NULL); + if (IS_ERR(link_table)) { + p_err("failed to create hashmap for pinned paths"); + return -1; + } + build_pinned_obj_table(link_table, BPF_OBJ_LINK); + } + build_obj_refs_table(&refs_table, BPF_OBJ_LINK); + + if (argc == 2) { + fd = link_parse_fd(&argc, &argv); + if (fd < 0) + return fd; + return do_show_link(fd); + } + + if (argc) + return BAD_ARG(); + + if (json_output) + jsonw_start_array(json_wtr); + while (true) { + err = bpf_link_get_next_id(id, &id); + if (err) { + if (errno == ENOENT) + break; + p_err("can't get next link: %s%s", strerror(errno), + errno == EINVAL ? " -- kernel too old?" : ""); + break; + } + + fd = bpf_link_get_fd_by_id(id); + if (fd < 0) { + if (errno == ENOENT) + continue; + p_err("can't get link by id (%u): %s", + id, strerror(errno)); + break; + } + + err = do_show_link(fd); + if (err) + break; + } + if (json_output) + jsonw_end_array(json_wtr); + + delete_obj_refs_table(refs_table); + + if (show_pinned) + delete_pinned_obj_table(link_table); + + return errno == ENOENT ? 0 : -1; +} + +static int do_pin(int argc, char **argv) +{ + int err; + + err = do_pin_any(argc, argv, link_parse_fd); + if (!err && json_output) + jsonw_null(json_wtr); + return err; +} + +static int do_detach(int argc, char **argv) +{ + int err, fd; + + if (argc != 2) { + p_err("link specifier is invalid or missing\n"); + return 1; + } + + fd = link_parse_fd(&argc, &argv); + if (fd < 0) + return 1; + + err = bpf_link_detach(fd); + if (err) + err = -errno; + close(fd); + if (err) { + p_err("failed link detach: %s", strerror(-err)); + return 1; + } + + if (json_output) + jsonw_null(json_wtr); + + return 0; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %1$s %2$s { show | list } [LINK]\n" + " %1$s %2$s pin LINK FILE\n" + " %1$s %2$s detach LINK\n" + " %1$s %2$s help\n" + "\n" + " " HELP_SPEC_LINK "\n" + " " HELP_SPEC_OPTIONS " |\n" + " {-f|--bpffs} | {-n|--nomount} }\n" + "", + bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "show", do_show }, + { "list", do_show }, + { "help", do_help }, + { "pin", do_pin }, + { "detach", do_detach }, + { 0 } +}; + +int do_link(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/main.c b/bpftool/src/main.c new file mode 100644 index 0000000..08d0ac5 --- /dev/null +++ b/bpftool/src/main.c @@ -0,0 +1,547 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2017-2018 Netronome Systems, Inc. */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "main.h" + +#define BATCH_LINE_LEN_MAX 65536 +#define BATCH_ARG_NB_MAX 4096 + +const char *bin_name; +static int last_argc; +static char **last_argv; +static int (*last_do_help)(int argc, char **argv); +json_writer_t *json_wtr; +bool pretty_output; +bool json_output; +bool show_pinned; +bool block_mount; +bool verifier_logs; +bool relaxed_maps; +bool use_loader; +struct btf *base_btf; +struct hashmap *refs_table; + +static void __noreturn clean_and_exit(int i) +{ + if (json_output) + jsonw_destroy(&json_wtr); + + exit(i); +} + +void usage(void) +{ + last_do_help(last_argc - 1, last_argv + 1); + + clean_and_exit(-1); +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %s [OPTIONS] OBJECT { COMMAND | help }\n" + " %s batch file FILE\n" + " %s version\n" + "\n" + " OBJECT := { prog | map | link | cgroup | perf | net | feature | btf | gen | struct_ops | iter }\n" + " " HELP_SPEC_OPTIONS " |\n" + " {-V|--version} }\n" + "", + bin_name, bin_name, bin_name); + + return 0; +} + +static int do_batch(int argc, char **argv); +static int do_version(int argc, char **argv); + +static const struct cmd commands[] = { + { "help", do_help }, + { "batch", do_batch }, + { "prog", do_prog }, + { "map", do_map }, + { "link", do_link }, + { "cgroup", do_cgroup }, + { "perf", do_perf }, + { "net", do_net }, + { "feature", do_feature }, + { "btf", do_btf }, + { "gen", do_gen }, + { "struct_ops", do_struct_ops }, + { "iter", do_iter }, + { "version", do_version }, + { 0 } +}; + +#ifndef BPFTOOL_VERSION +/* bpftool's major and minor version numbers are aligned on libbpf's. There is + * an offset of 6 for the version number, because bpftool's version was higher + * than libbpf's when we adopted this scheme. The patch number remains at 0 + * for now. Set BPFTOOL_VERSION to override. + */ +#define BPFTOOL_MAJOR_VERSION (LIBBPF_MAJOR_VERSION + 6) +#define BPFTOOL_MINOR_VERSION LIBBPF_MINOR_VERSION +#define BPFTOOL_PATCH_VERSION 0 +#endif + +static void +print_feature(const char *feature, bool state, unsigned int *nb_features) +{ + if (state) { + printf("%s %s", *nb_features ? "," : "", feature); + *nb_features = *nb_features + 1; + } +} + +static int do_version(int argc, char **argv) +{ +#ifdef HAVE_LIBBFD_SUPPORT + const bool has_libbfd = true; +#else + const bool has_libbfd = false; +#endif +#ifdef HAVE_LLVM_SUPPORT + const bool has_llvm = true; +#else + const bool has_llvm = false; +#endif +#ifdef BPFTOOL_WITHOUT_SKELETONS + const bool has_skeletons = false; +#else + const bool has_skeletons = true; +#endif + bool bootstrap = false; + int i; + + for (i = 0; commands[i].cmd; i++) { + if (!strcmp(commands[i].cmd, "prog")) { + /* Assume we run a bootstrap version if "bpftool prog" + * is not available. + */ + bootstrap = !commands[i].func; + break; + } + } + + if (json_output) { + jsonw_start_object(json_wtr); /* root object */ + + jsonw_name(json_wtr, "version"); +#ifdef BPFTOOL_VERSION + jsonw_printf(json_wtr, "\"%s\"", BPFTOOL_VERSION); +#else + jsonw_printf(json_wtr, "\"%d.%d.%d\"", BPFTOOL_MAJOR_VERSION, + BPFTOOL_MINOR_VERSION, BPFTOOL_PATCH_VERSION); +#endif + jsonw_name(json_wtr, "libbpf_version"); + jsonw_printf(json_wtr, "\"%d.%d\"", + libbpf_major_version(), libbpf_minor_version()); + + jsonw_name(json_wtr, "features"); + jsonw_start_object(json_wtr); /* features */ + jsonw_bool_field(json_wtr, "libbfd", has_libbfd); + jsonw_bool_field(json_wtr, "llvm", has_llvm); + jsonw_bool_field(json_wtr, "skeletons", has_skeletons); + jsonw_bool_field(json_wtr, "bootstrap", bootstrap); + jsonw_end_object(json_wtr); /* features */ + + jsonw_end_object(json_wtr); /* root object */ + } else { + unsigned int nb_features = 0; + +#ifdef BPFTOOL_VERSION + printf("%s v%s\n", bin_name, BPFTOOL_VERSION); +#else + printf("%s v%d.%d.%d\n", bin_name, BPFTOOL_MAJOR_VERSION, + BPFTOOL_MINOR_VERSION, BPFTOOL_PATCH_VERSION); +#endif + printf("using libbpf %s\n", libbpf_version_string()); + printf("features:"); + print_feature("libbfd", has_libbfd, &nb_features); + print_feature("llvm", has_llvm, &nb_features); + print_feature("skeletons", has_skeletons, &nb_features); + print_feature("bootstrap", bootstrap, &nb_features); + printf("\n"); + } + return 0; +} + +int cmd_select(const struct cmd *cmds, int argc, char **argv, + int (*help)(int argc, char **argv)) +{ + unsigned int i; + + last_argc = argc; + last_argv = argv; + last_do_help = help; + + if (argc < 1 && cmds[0].func) + return cmds[0].func(argc, argv); + + for (i = 0; cmds[i].cmd; i++) { + if (is_prefix(*argv, cmds[i].cmd)) { + if (!cmds[i].func) { + p_err("command '%s' is not supported in bootstrap mode", + cmds[i].cmd); + return -1; + } + return cmds[i].func(argc - 1, argv + 1); + } + } + + help(argc - 1, argv + 1); + + return -1; +} + +bool is_prefix(const char *pfx, const char *str) +{ + if (!pfx) + return false; + if (strlen(str) < strlen(pfx)) + return false; + + return !memcmp(str, pfx, strlen(pfx)); +} + +/* Last argument MUST be NULL pointer */ +int detect_common_prefix(const char *arg, ...) +{ + unsigned int count = 0; + const char *ref; + char msg[256]; + va_list ap; + + snprintf(msg, sizeof(msg), "ambiguous prefix: '%s' could be '", arg); + va_start(ap, arg); + while ((ref = va_arg(ap, const char *))) { + if (!is_prefix(arg, ref)) + continue; + count++; + if (count > 1) + strncat(msg, "' or '", sizeof(msg) - strlen(msg) - 1); + strncat(msg, ref, sizeof(msg) - strlen(msg) - 1); + } + va_end(ap); + strncat(msg, "'", sizeof(msg) - strlen(msg) - 1); + + if (count >= 2) { + p_err("%s", msg); + return -1; + } + + return 0; +} + +void fprint_hex(FILE *f, void *arg, unsigned int n, const char *sep) +{ + unsigned char *data = arg; + unsigned int i; + + for (i = 0; i < n; i++) { + const char *pfx = ""; + + if (!i) + /* nothing */; + else if (!(i % 16)) + fprintf(f, "\n"); + else if (!(i % 8)) + fprintf(f, " "); + else + pfx = sep; + + fprintf(f, "%s%02hhx", i ? pfx : "", data[i]); + } +} + +/* Split command line into argument vector. */ +static int make_args(char *line, char *n_argv[], int maxargs, int cmd_nb) +{ + static const char ws[] = " \t\r\n"; + char *cp = line; + int n_argc = 0; + + while (*cp) { + /* Skip leading whitespace. */ + cp += strspn(cp, ws); + + if (*cp == '\0') + break; + + if (n_argc >= (maxargs - 1)) { + p_err("too many arguments to command %d", cmd_nb); + return -1; + } + + /* Word begins with quote. */ + if (*cp == '\'' || *cp == '"') { + char quote = *cp++; + + n_argv[n_argc++] = cp; + /* Find ending quote. */ + cp = strchr(cp, quote); + if (!cp) { + p_err("unterminated quoted string in command %d", + cmd_nb); + return -1; + } + } else { + n_argv[n_argc++] = cp; + + /* Find end of word. */ + cp += strcspn(cp, ws); + if (*cp == '\0') + break; + } + + /* Separate words. */ + *cp++ = 0; + } + n_argv[n_argc] = NULL; + + return n_argc; +} + +static int do_batch(int argc, char **argv) +{ + char buf[BATCH_LINE_LEN_MAX], contline[BATCH_LINE_LEN_MAX]; + char *n_argv[BATCH_ARG_NB_MAX]; + unsigned int lines = 0; + int n_argc; + FILE *fp; + char *cp; + int err = 0; + int i; + + if (argc < 2) { + p_err("too few parameters for batch"); + return -1; + } else if (argc > 2) { + p_err("too many parameters for batch"); + return -1; + } else if (!is_prefix(*argv, "file")) { + p_err("expected 'file', got: %s", *argv); + return -1; + } + NEXT_ARG(); + + if (!strcmp(*argv, "-")) + fp = stdin; + else + fp = fopen(*argv, "r"); + if (!fp) { + p_err("Can't open file (%s): %s", *argv, strerror(errno)); + return -1; + } + + if (json_output) + jsonw_start_array(json_wtr); + while (fgets(buf, sizeof(buf), fp)) { + cp = strchr(buf, '#'); + if (cp) + *cp = '\0'; + + if (strlen(buf) == sizeof(buf) - 1) { + errno = E2BIG; + break; + } + + /* Append continuation lines if any (coming after a line ending + * with '\' in the batch file). + */ + while ((cp = strstr(buf, "\\\n")) != NULL) { + if (!fgets(contline, sizeof(contline), fp) || + strlen(contline) == 0) { + p_err("missing continuation line on command %d", + lines); + err = -1; + goto err_close; + } + + cp = strchr(contline, '#'); + if (cp) + *cp = '\0'; + + if (strlen(buf) + strlen(contline) + 1 > sizeof(buf)) { + p_err("command %d is too long", lines); + err = -1; + goto err_close; + } + buf[strlen(buf) - 2] = '\0'; + strcat(buf, contline); + } + + n_argc = make_args(buf, n_argv, BATCH_ARG_NB_MAX, lines); + if (!n_argc) + continue; + if (n_argc < 0) { + err = n_argc; + goto err_close; + } + + if (json_output) { + jsonw_start_object(json_wtr); + jsonw_name(json_wtr, "command"); + jsonw_start_array(json_wtr); + for (i = 0; i < n_argc; i++) + jsonw_string(json_wtr, n_argv[i]); + jsonw_end_array(json_wtr); + jsonw_name(json_wtr, "output"); + } + + err = cmd_select(commands, n_argc, n_argv, do_help); + + if (json_output) + jsonw_end_object(json_wtr); + + if (err) + goto err_close; + + lines++; + } + + if (errno && errno != ENOENT) { + p_err("reading batch file failed: %s", strerror(errno)); + err = -1; + } else { + if (!json_output) + printf("processed %d commands\n", lines); + } +err_close: + if (fp != stdin) + fclose(fp); + + if (json_output) + jsonw_end_array(json_wtr); + + return err; +} + +int main(int argc, char **argv) +{ + static const struct option options[] = { + { "json", no_argument, NULL, 'j' }, + { "help", no_argument, NULL, 'h' }, + { "pretty", no_argument, NULL, 'p' }, + { "version", no_argument, NULL, 'V' }, + { "bpffs", no_argument, NULL, 'f' }, + { "mapcompat", no_argument, NULL, 'm' }, + { "nomount", no_argument, NULL, 'n' }, + { "debug", no_argument, NULL, 'd' }, + { "use-loader", no_argument, NULL, 'L' }, + { "base-btf", required_argument, NULL, 'B' }, + { 0 } + }; + bool version_requested = false; + int opt, ret; + + setlinebuf(stdout); + +#ifdef USE_LIBCAP + /* Libcap < 2.63 hooks before main() to compute the number of + * capabilities of the running kernel, and doing so it calls prctl() + * which may fail and set errno to non-zero. + * Let's reset errno to make sure this does not interfere with the + * batch mode. + */ + errno = 0; +#endif + + last_do_help = do_help; + pretty_output = false; + json_output = false; + show_pinned = false; + block_mount = false; + bin_name = "bpftool"; + + opterr = 0; + while ((opt = getopt_long(argc, argv, "VhpjfLmndB:l", + options, NULL)) >= 0) { + switch (opt) { + case 'V': + version_requested = true; + break; + case 'h': + return do_help(argc, argv); + case 'p': + pretty_output = true; + /* fall through */ + case 'j': + if (!json_output) { + json_wtr = jsonw_new(stdout); + if (!json_wtr) { + p_err("failed to create JSON writer"); + return -1; + } + json_output = true; + } + jsonw_pretty(json_wtr, pretty_output); + break; + case 'f': + show_pinned = true; + break; + case 'm': + relaxed_maps = true; + break; + case 'n': + block_mount = true; + break; + case 'd': + libbpf_set_print(print_all_levels); + verifier_logs = true; + break; + case 'B': + base_btf = btf__parse(optarg, NULL); + if (!base_btf) { + p_err("failed to parse base BTF at '%s': %d\n", + optarg, -errno); + return -1; + } + break; + case 'L': + use_loader = true; + break; + default: + p_err("unrecognized option '%s'", argv[optind - 1]); + if (json_output) + clean_and_exit(-1); + else + usage(); + } + } + + argc -= optind; + argv += optind; + if (argc < 0) + usage(); + + if (version_requested) + return do_version(argc, argv); + + ret = cmd_select(commands, argc, argv, do_help); + + if (json_output) + jsonw_destroy(&json_wtr); + + btf__free(base_btf); + + return ret; +} diff --git a/bpftool/src/main.h b/bpftool/src/main.h new file mode 100644 index 0000000..0ef373c --- /dev/null +++ b/bpftool/src/main.h @@ -0,0 +1,265 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Copyright (C) 2017-2018 Netronome Systems, Inc. */ + +#ifndef __BPF_TOOL_H +#define __BPF_TOOL_H + +/* BFD and kernel.h both define GCC_VERSION, differently */ +#undef GCC_VERSION +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "json_writer.h" + +/* Make sure we do not use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +static inline __u64 ptr_to_u64(const void *ptr) +{ + return (__u64)(unsigned long)ptr; +} + +static inline void *u64_to_ptr(__u64 ptr) +{ + return (void *)(unsigned long)ptr; +} + +#define NEXT_ARG() ({ argc--; argv++; if (argc < 0) usage(); }) +#define NEXT_ARGP() ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); }) +#define BAD_ARG() ({ p_err("what is '%s'?", *argv); -1; }) +#define GET_ARG() ({ argc--; *argv++; }) +#define REQ_ARGS(cnt) \ + ({ \ + int _cnt = (cnt); \ + bool _res; \ + \ + if (argc < _cnt) { \ + p_err("'%s' needs at least %d arguments, %d found", \ + argv[-1], _cnt, argc); \ + _res = false; \ + } else { \ + _res = true; \ + } \ + _res; \ + }) + +#define ERR_MAX_LEN 1024 + +#define BPF_TAG_FMT "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx" + +#define HELP_SPEC_PROGRAM \ + "PROG := { id PROG_ID | pinned FILE | tag PROG_TAG | name PROG_NAME }" +#define HELP_SPEC_OPTIONS \ + "OPTIONS := { {-j|--json} [{-p|--pretty}] | {-d|--debug}" +#define HELP_SPEC_MAP \ + "MAP := { id MAP_ID | pinned FILE | name MAP_NAME }" +#define HELP_SPEC_LINK \ + "LINK := { id LINK_ID | pinned FILE }" + +/* keep in sync with the definition in skeleton/pid_iter.bpf.c */ +enum bpf_obj_type { + BPF_OBJ_UNKNOWN, + BPF_OBJ_PROG, + BPF_OBJ_MAP, + BPF_OBJ_LINK, + BPF_OBJ_BTF, +}; + +extern const char *bin_name; + +extern json_writer_t *json_wtr; +extern bool json_output; +extern bool show_pinned; +extern bool show_pids; +extern bool block_mount; +extern bool verifier_logs; +extern bool relaxed_maps; +extern bool use_loader; +extern struct btf *base_btf; +extern struct hashmap *refs_table; + +void __printf(1, 2) p_err(const char *fmt, ...); +void __printf(1, 2) p_info(const char *fmt, ...); + +bool is_prefix(const char *pfx, const char *str); +int detect_common_prefix(const char *arg, ...); +void fprint_hex(FILE *f, void *arg, unsigned int n, const char *sep); +void usage(void) __noreturn; + +void set_max_rlimit(void); + +int mount_tracefs(const char *target); + +struct obj_ref { + int pid; + char comm[16]; +}; + +struct obj_refs { + int ref_cnt; + bool has_bpf_cookie; + struct obj_ref *refs; + __u64 bpf_cookie; +}; + +struct btf; +struct bpf_line_info; + +int build_pinned_obj_table(struct hashmap *table, + enum bpf_obj_type type); +void delete_pinned_obj_table(struct hashmap *table); +__weak int build_obj_refs_table(struct hashmap **table, + enum bpf_obj_type type); +__weak void delete_obj_refs_table(struct hashmap *table); +__weak void emit_obj_refs_json(struct hashmap *table, __u32 id, + json_writer_t *json_wtr); +__weak void emit_obj_refs_plain(struct hashmap *table, __u32 id, + const char *prefix); +void print_dev_plain(__u32 ifindex, __u64 ns_dev, __u64 ns_inode); +void print_dev_json(__u32 ifindex, __u64 ns_dev, __u64 ns_inode); + +struct cmd { + const char *cmd; + int (*func)(int argc, char **argv); +}; + +int cmd_select(const struct cmd *cmds, int argc, char **argv, + int (*help)(int argc, char **argv)); + +#define MAX_PROG_FULL_NAME 128 +void get_prog_full_name(const struct bpf_prog_info *prog_info, int prog_fd, + char *name_buff, size_t buff_len); + +int get_fd_type(int fd); +const char *get_fd_type_name(enum bpf_obj_type type); +char *get_fdinfo(int fd, const char *key); +int open_obj_pinned(const char *path, bool quiet); +int open_obj_pinned_any(const char *path, enum bpf_obj_type exp_type); +int mount_bpffs_for_pin(const char *name); +int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(int *, char ***)); +int do_pin_fd(int fd, const char *name); + +/* commands available in bootstrap mode */ +int do_gen(int argc, char **argv); +int do_btf(int argc, char **argv); + +/* non-bootstrap only commands */ +int do_prog(int argc, char **arg) __weak; +int do_map(int argc, char **arg) __weak; +int do_link(int argc, char **arg) __weak; +int do_event_pipe(int argc, char **argv) __weak; +int do_cgroup(int argc, char **arg) __weak; +int do_perf(int argc, char **arg) __weak; +int do_net(int argc, char **arg) __weak; +int do_tracelog(int argc, char **arg) __weak; +int do_feature(int argc, char **argv) __weak; +int do_struct_ops(int argc, char **argv) __weak; +int do_iter(int argc, char **argv) __weak; + +int parse_u32_arg(int *argc, char ***argv, __u32 *val, const char *what); +int prog_parse_fd(int *argc, char ***argv); +int prog_parse_fds(int *argc, char ***argv, int **fds); +int map_parse_fd(int *argc, char ***argv); +int map_parse_fds(int *argc, char ***argv, int **fds); +int map_parse_fd_and_info(int *argc, char ***argv, struct bpf_map_info *info, + __u32 *info_len); + +struct bpf_prog_linfo; +#if defined(HAVE_LLVM_SUPPORT) || defined(HAVE_LIBBFD_SUPPORT) +int disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, + const char *arch, const char *disassembler_options, + const struct btf *btf, + const struct bpf_prog_linfo *prog_linfo, + __u64 func_ksym, unsigned int func_idx, + bool linum); +int disasm_init(void); +#else +static inline +int disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, + const char *arch, const char *disassembler_options, + const struct btf *btf, + const struct bpf_prog_linfo *prog_linfo, + __u64 func_ksym, unsigned int func_idx, + bool linum) +{ + return 0; +} +static inline int disasm_init(void) +{ + p_err("No JIT disassembly support"); + return -1; +} +#endif +void print_data_json(uint8_t *data, size_t len); +void print_hex_data_json(uint8_t *data, size_t len); + +unsigned int get_page_size(void); +unsigned int get_possible_cpus(void); +const char * +ifindex_to_arch(__u32 ifindex, __u64 ns_dev, __u64 ns_ino, const char **opt); + +struct btf_dumper { + const struct btf *btf; + json_writer_t *jw; + bool is_plain_text; + bool prog_id_as_func_ptr; +}; + +/* btf_dumper_type - print data along with type information + * @d: an instance containing context for dumping types + * @type_id: index in btf->types array. this points to the type to be dumped + * @data: pointer the actual data, i.e. the values to be printed + * + * Returns zero on success and negative error code otherwise + */ +int btf_dumper_type(const struct btf_dumper *d, __u32 type_id, + const void *data); +void btf_dumper_type_only(const struct btf *btf, __u32 func_type_id, + char *func_only, int size); + +void btf_dump_linfo_plain(const struct btf *btf, + const struct bpf_line_info *linfo, + const char *prefix, bool linum); +void btf_dump_linfo_json(const struct btf *btf, + const struct bpf_line_info *linfo, bool linum); + +struct nlattr; +struct ifinfomsg; +struct tcmsg; +int do_xdp_dump(struct ifinfomsg *ifinfo, struct nlattr **tb); +int do_filter_dump(struct tcmsg *ifinfo, struct nlattr **tb, const char *kind, + const char *devname, int ifindex); + +int print_all_levels(__maybe_unused enum libbpf_print_level level, + const char *format, va_list args); + +size_t hash_fn_for_key_as_id(long key, void *ctx); +bool equal_fn_for_key_as_id(long k1, long k2, void *ctx); + +/* bpf_attach_type_input_str - convert the provided attach type value into a + * textual representation that we accept for input purposes. + * + * This function is similar in nature to libbpf_bpf_attach_type_str, but + * recognizes some attach type names that have been used by the program in the + * past and which do not follow the string inference scheme that libbpf uses. + * These textual representations should only be used for user input. + * + * @t: The attach type + * Returns a pointer to a static string identifying the attach type. NULL is + * returned for unknown bpf_attach_type values. + */ +const char *bpf_attach_type_input_str(enum bpf_attach_type t); + +static inline bool hashmap__empty(struct hashmap *map) +{ + return map ? hashmap__size(map) == 0 : true; +} + +#endif diff --git a/bpftool/src/map.c b/bpftool/src/map.c new file mode 100644 index 0000000..aaeb893 --- /dev/null +++ b/bpftool/src/map.c @@ -0,0 +1,1486 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2017-2018 Netronome Systems, Inc. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "json_writer.h" +#include "main.h" + +static struct hashmap *map_table; + +static bool map_is_per_cpu(__u32 type) +{ + return type == BPF_MAP_TYPE_PERCPU_HASH || + type == BPF_MAP_TYPE_PERCPU_ARRAY || + type == BPF_MAP_TYPE_LRU_PERCPU_HASH || + type == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE; +} + +static bool map_is_map_of_maps(__u32 type) +{ + return type == BPF_MAP_TYPE_ARRAY_OF_MAPS || + type == BPF_MAP_TYPE_HASH_OF_MAPS; +} + +static bool map_is_map_of_progs(__u32 type) +{ + return type == BPF_MAP_TYPE_PROG_ARRAY; +} + +static int map_type_from_str(const char *type) +{ + const char *map_type_str; + unsigned int i; + + for (i = 0; ; i++) { + map_type_str = libbpf_bpf_map_type_str(i); + if (!map_type_str) + break; + + /* Don't allow prefixing in case of possible future shadowing */ + if (!strcmp(map_type_str, type)) + return i; + } + return -1; +} + +static void *alloc_value(struct bpf_map_info *info) +{ + if (map_is_per_cpu(info->type)) + return malloc(round_up(info->value_size, 8) * + get_possible_cpus()); + else + return malloc(info->value_size); +} + +static int do_dump_btf(const struct btf_dumper *d, + struct bpf_map_info *map_info, void *key, + void *value) +{ + __u32 value_id; + int ret = 0; + + /* start of key-value pair */ + jsonw_start_object(d->jw); + + if (map_info->btf_key_type_id) { + jsonw_name(d->jw, "key"); + + ret = btf_dumper_type(d, map_info->btf_key_type_id, key); + if (ret) + goto err_end_obj; + } + + value_id = map_info->btf_vmlinux_value_type_id ? + : map_info->btf_value_type_id; + + if (!map_is_per_cpu(map_info->type)) { + jsonw_name(d->jw, "value"); + ret = btf_dumper_type(d, value_id, value); + } else { + unsigned int i, n, step; + + jsonw_name(d->jw, "values"); + jsonw_start_array(d->jw); + n = get_possible_cpus(); + step = round_up(map_info->value_size, 8); + for (i = 0; i < n; i++) { + jsonw_start_object(d->jw); + jsonw_int_field(d->jw, "cpu", i); + jsonw_name(d->jw, "value"); + ret = btf_dumper_type(d, value_id, value + i * step); + jsonw_end_object(d->jw); + if (ret) + break; + } + jsonw_end_array(d->jw); + } + +err_end_obj: + /* end of key-value pair */ + jsonw_end_object(d->jw); + + return ret; +} + +static json_writer_t *get_btf_writer(void) +{ + json_writer_t *jw = jsonw_new(stdout); + + if (!jw) + return NULL; + jsonw_pretty(jw, true); + + return jw; +} + +static void print_entry_json(struct bpf_map_info *info, unsigned char *key, + unsigned char *value, struct btf *btf) +{ + jsonw_start_object(json_wtr); + + if (!map_is_per_cpu(info->type)) { + jsonw_name(json_wtr, "key"); + print_hex_data_json(key, info->key_size); + jsonw_name(json_wtr, "value"); + print_hex_data_json(value, info->value_size); + if (btf) { + struct btf_dumper d = { + .btf = btf, + .jw = json_wtr, + .is_plain_text = false, + }; + + jsonw_name(json_wtr, "formatted"); + do_dump_btf(&d, info, key, value); + } + } else { + unsigned int i, n, step; + + n = get_possible_cpus(); + step = round_up(info->value_size, 8); + + jsonw_name(json_wtr, "key"); + print_hex_data_json(key, info->key_size); + + jsonw_name(json_wtr, "values"); + jsonw_start_array(json_wtr); + for (i = 0; i < n; i++) { + jsonw_start_object(json_wtr); + + jsonw_int_field(json_wtr, "cpu", i); + + jsonw_name(json_wtr, "value"); + print_hex_data_json(value + i * step, + info->value_size); + + jsonw_end_object(json_wtr); + } + jsonw_end_array(json_wtr); + if (btf) { + struct btf_dumper d = { + .btf = btf, + .jw = json_wtr, + .is_plain_text = false, + }; + + jsonw_name(json_wtr, "formatted"); + do_dump_btf(&d, info, key, value); + } + } + + jsonw_end_object(json_wtr); +} + +static void +print_entry_error_msg(struct bpf_map_info *info, unsigned char *key, + const char *error_msg) +{ + int msg_size = strlen(error_msg); + bool single_line, break_names; + + break_names = info->key_size > 16 || msg_size > 16; + single_line = info->key_size + msg_size <= 24 && !break_names; + + printf("key:%c", break_names ? '\n' : ' '); + fprint_hex(stdout, key, info->key_size, " "); + + printf(single_line ? " " : "\n"); + + printf("value:%c%s", break_names ? '\n' : ' ', error_msg); + + printf("\n"); +} + +static void +print_entry_error(struct bpf_map_info *map_info, void *key, int lookup_errno) +{ + /* For prog_array maps or arrays of maps, failure to lookup the value + * means there is no entry for that key. Do not print an error message + * in that case. + */ + if ((map_is_map_of_maps(map_info->type) || + map_is_map_of_progs(map_info->type)) && lookup_errno == ENOENT) + return; + + if (json_output) { + jsonw_start_object(json_wtr); /* entry */ + jsonw_name(json_wtr, "key"); + print_hex_data_json(key, map_info->key_size); + jsonw_name(json_wtr, "value"); + jsonw_start_object(json_wtr); /* error */ + jsonw_string_field(json_wtr, "error", strerror(lookup_errno)); + jsonw_end_object(json_wtr); /* error */ + jsonw_end_object(json_wtr); /* entry */ + } else { + const char *msg = NULL; + + if (lookup_errno == ENOENT) + msg = ""; + else if (lookup_errno == ENOSPC && + map_info->type == BPF_MAP_TYPE_REUSEPORT_SOCKARRAY) + msg = ""; + + print_entry_error_msg(map_info, key, + msg ? : strerror(lookup_errno)); + } +} + +static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, + unsigned char *value) +{ + if (!map_is_per_cpu(info->type)) { + bool single_line, break_names; + + break_names = info->key_size > 16 || info->value_size > 16; + single_line = info->key_size + info->value_size <= 24 && + !break_names; + + if (info->key_size) { + printf("key:%c", break_names ? '\n' : ' '); + fprint_hex(stdout, key, info->key_size, " "); + + printf(single_line ? " " : "\n"); + } + + if (info->value_size) { + printf("value:%c", break_names ? '\n' : ' '); + fprint_hex(stdout, value, info->value_size, " "); + } + + printf("\n"); + } else { + unsigned int i, n, step; + + n = get_possible_cpus(); + step = round_up(info->value_size, 8); + + if (info->key_size) { + printf("key:\n"); + fprint_hex(stdout, key, info->key_size, " "); + printf("\n"); + } + if (info->value_size) { + for (i = 0; i < n; i++) { + printf("value (CPU %02d):%c", + i, info->value_size > 16 ? '\n' : ' '); + fprint_hex(stdout, value + i * step, + info->value_size, " "); + printf("\n"); + } + } + } +} + +static char **parse_bytes(char **argv, const char *name, unsigned char *val, + unsigned int n) +{ + unsigned int i = 0, base = 0; + char *endptr; + + if (is_prefix(*argv, "hex")) { + base = 16; + argv++; + } + + while (i < n && argv[i]) { + val[i] = strtoul(argv[i], &endptr, base); + if (*endptr) { + p_err("error parsing byte: %s", argv[i]); + return NULL; + } + i++; + } + + if (i != n) { + p_err("%s expected %d bytes got %d", name, n, i); + return NULL; + } + + return argv + i; +} + +/* on per cpu maps we must copy the provided value on all value instances */ +static void fill_per_cpu_value(struct bpf_map_info *info, void *value) +{ + unsigned int i, n, step; + + if (!map_is_per_cpu(info->type)) + return; + + n = get_possible_cpus(); + step = round_up(info->value_size, 8); + for (i = 1; i < n; i++) + memcpy(value + i * step, value, info->value_size); +} + +static int parse_elem(char **argv, struct bpf_map_info *info, + void *key, void *value, __u32 key_size, __u32 value_size, + __u32 *flags, __u32 **value_fd) +{ + if (!*argv) { + if (!key && !value) + return 0; + p_err("did not find %s", key ? "key" : "value"); + return -1; + } + + if (is_prefix(*argv, "key")) { + if (!key) { + if (key_size) + p_err("duplicate key"); + else + p_err("unnecessary key"); + return -1; + } + + argv = parse_bytes(argv + 1, "key", key, key_size); + if (!argv) + return -1; + + return parse_elem(argv, info, NULL, value, key_size, value_size, + flags, value_fd); + } else if (is_prefix(*argv, "value")) { + int fd; + + if (!value) { + if (value_size) + p_err("duplicate value"); + else + p_err("unnecessary value"); + return -1; + } + + argv++; + + if (map_is_map_of_maps(info->type)) { + int argc = 2; + + if (value_size != 4) { + p_err("value smaller than 4B for map in map?"); + return -1; + } + if (!argv[0] || !argv[1]) { + p_err("not enough value arguments for map in map"); + return -1; + } + + fd = map_parse_fd(&argc, &argv); + if (fd < 0) + return -1; + + *value_fd = value; + **value_fd = fd; + } else if (map_is_map_of_progs(info->type)) { + int argc = 2; + + if (value_size != 4) { + p_err("value smaller than 4B for map of progs?"); + return -1; + } + if (!argv[0] || !argv[1]) { + p_err("not enough value arguments for map of progs"); + return -1; + } + if (is_prefix(*argv, "id")) + p_info("Warning: updating program array via MAP_ID, make sure this map is kept open\n" + " by some process or pinned otherwise update will be lost"); + + fd = prog_parse_fd(&argc, &argv); + if (fd < 0) + return -1; + + *value_fd = value; + **value_fd = fd; + } else { + argv = parse_bytes(argv, "value", value, value_size); + if (!argv) + return -1; + + fill_per_cpu_value(info, value); + } + + return parse_elem(argv, info, key, NULL, key_size, value_size, + flags, NULL); + } else if (is_prefix(*argv, "any") || is_prefix(*argv, "noexist") || + is_prefix(*argv, "exist")) { + if (!flags) { + p_err("flags specified multiple times: %s", *argv); + return -1; + } + + if (is_prefix(*argv, "any")) + *flags = BPF_ANY; + else if (is_prefix(*argv, "noexist")) + *flags = BPF_NOEXIST; + else if (is_prefix(*argv, "exist")) + *flags = BPF_EXIST; + + return parse_elem(argv + 1, info, key, value, key_size, + value_size, NULL, value_fd); + } + + p_err("expected key or value, got: %s", *argv); + return -1; +} + +static void show_map_header_json(struct bpf_map_info *info, json_writer_t *wtr) +{ + const char *map_type_str; + + jsonw_uint_field(wtr, "id", info->id); + map_type_str = libbpf_bpf_map_type_str(info->type); + if (map_type_str) + jsonw_string_field(wtr, "type", map_type_str); + else + jsonw_uint_field(wtr, "type", info->type); + + if (*info->name) + jsonw_string_field(wtr, "name", info->name); + + jsonw_name(wtr, "flags"); + jsonw_printf(wtr, "%d", info->map_flags); +} + +static int show_map_close_json(int fd, struct bpf_map_info *info) +{ + char *memlock, *frozen_str; + int frozen = 0; + + memlock = get_fdinfo(fd, "memlock"); + frozen_str = get_fdinfo(fd, "frozen"); + + jsonw_start_object(json_wtr); + + show_map_header_json(info, json_wtr); + + print_dev_json(info->ifindex, info->netns_dev, info->netns_ino); + + jsonw_uint_field(json_wtr, "bytes_key", info->key_size); + jsonw_uint_field(json_wtr, "bytes_value", info->value_size); + jsonw_uint_field(json_wtr, "max_entries", info->max_entries); + + if (memlock) + jsonw_int_field(json_wtr, "bytes_memlock", atoll(memlock)); + free(memlock); + + if (info->type == BPF_MAP_TYPE_PROG_ARRAY) { + char *owner_prog_type = get_fdinfo(fd, "owner_prog_type"); + char *owner_jited = get_fdinfo(fd, "owner_jited"); + + if (owner_prog_type) { + unsigned int prog_type = atoi(owner_prog_type); + const char *prog_type_str; + + prog_type_str = libbpf_bpf_prog_type_str(prog_type); + if (prog_type_str) + jsonw_string_field(json_wtr, "owner_prog_type", + prog_type_str); + else + jsonw_uint_field(json_wtr, "owner_prog_type", + prog_type); + } + if (owner_jited) + jsonw_bool_field(json_wtr, "owner_jited", + !!atoi(owner_jited)); + + free(owner_prog_type); + free(owner_jited); + } + close(fd); + + if (frozen_str) { + frozen = atoi(frozen_str); + free(frozen_str); + } + jsonw_int_field(json_wtr, "frozen", frozen); + + if (info->btf_id) + jsonw_int_field(json_wtr, "btf_id", info->btf_id); + + if (!hashmap__empty(map_table)) { + struct hashmap_entry *entry; + + jsonw_name(json_wtr, "pinned"); + jsonw_start_array(json_wtr); + hashmap__for_each_key_entry(map_table, entry, info->id) + jsonw_string(json_wtr, entry->pvalue); + jsonw_end_array(json_wtr); + } + + emit_obj_refs_json(refs_table, info->id, json_wtr); + + jsonw_end_object(json_wtr); + + return 0; +} + +static void show_map_header_plain(struct bpf_map_info *info) +{ + const char *map_type_str; + + printf("%u: ", info->id); + + map_type_str = libbpf_bpf_map_type_str(info->type); + if (map_type_str) + printf("%s ", map_type_str); + else + printf("type %u ", info->type); + + if (*info->name) + printf("name %s ", info->name); + + printf("flags 0x%x", info->map_flags); + print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino); + printf("\n"); +} + +static int show_map_close_plain(int fd, struct bpf_map_info *info) +{ + char *memlock, *frozen_str; + int frozen = 0; + + memlock = get_fdinfo(fd, "memlock"); + frozen_str = get_fdinfo(fd, "frozen"); + + show_map_header_plain(info); + printf("\tkey %uB value %uB max_entries %u", + info->key_size, info->value_size, info->max_entries); + + if (memlock) + printf(" memlock %sB", memlock); + free(memlock); + + if (info->type == BPF_MAP_TYPE_PROG_ARRAY) { + char *owner_prog_type = get_fdinfo(fd, "owner_prog_type"); + char *owner_jited = get_fdinfo(fd, "owner_jited"); + + if (owner_prog_type || owner_jited) + printf("\n\t"); + if (owner_prog_type) { + unsigned int prog_type = atoi(owner_prog_type); + const char *prog_type_str; + + prog_type_str = libbpf_bpf_prog_type_str(prog_type); + if (prog_type_str) + printf("owner_prog_type %s ", prog_type_str); + else + printf("owner_prog_type %d ", prog_type); + } + if (owner_jited) + printf("owner%s jited", + atoi(owner_jited) ? "" : " not"); + + free(owner_prog_type); + free(owner_jited); + } + close(fd); + + if (!hashmap__empty(map_table)) { + struct hashmap_entry *entry; + + hashmap__for_each_key_entry(map_table, entry, info->id) + printf("\n\tpinned %s", (char *)entry->pvalue); + } + + if (frozen_str) { + frozen = atoi(frozen_str); + free(frozen_str); + } + + if (info->btf_id || frozen) + printf("\n\t"); + + if (info->btf_id) + printf("btf_id %d", info->btf_id); + + if (frozen) + printf("%sfrozen", info->btf_id ? " " : ""); + + emit_obj_refs_plain(refs_table, info->id, "\n\tpids "); + + printf("\n"); + return 0; +} + +static int do_show_subset(int argc, char **argv) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + int *fds = NULL; + int nb_fds, i; + int err = -1; + + fds = malloc(sizeof(int)); + if (!fds) { + p_err("mem alloc failed"); + return -1; + } + nb_fds = map_parse_fds(&argc, &argv, &fds); + if (nb_fds < 1) + goto exit_free; + + if (json_output && nb_fds > 1) + jsonw_start_array(json_wtr); /* root array */ + for (i = 0; i < nb_fds; i++) { + err = bpf_map_get_info_by_fd(fds[i], &info, &len); + if (err) { + p_err("can't get map info: %s", + strerror(errno)); + for (; i < nb_fds; i++) + close(fds[i]); + break; + } + + if (json_output) + show_map_close_json(fds[i], &info); + else + show_map_close_plain(fds[i], &info); + + close(fds[i]); + } + if (json_output && nb_fds > 1) + jsonw_end_array(json_wtr); /* root array */ + +exit_free: + free(fds); + return err; +} + +static int do_show(int argc, char **argv) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + __u32 id = 0; + int err; + int fd; + + if (show_pinned) { + map_table = hashmap__new(hash_fn_for_key_as_id, + equal_fn_for_key_as_id, NULL); + if (IS_ERR(map_table)) { + p_err("failed to create hashmap for pinned paths"); + return -1; + } + build_pinned_obj_table(map_table, BPF_OBJ_MAP); + } + build_obj_refs_table(&refs_table, BPF_OBJ_MAP); + + if (argc == 2) + return do_show_subset(argc, argv); + + if (argc) + return BAD_ARG(); + + if (json_output) + jsonw_start_array(json_wtr); + while (true) { + err = bpf_map_get_next_id(id, &id); + if (err) { + if (errno == ENOENT) + break; + p_err("can't get next map: %s%s", strerror(errno), + errno == EINVAL ? " -- kernel too old?" : ""); + break; + } + + fd = bpf_map_get_fd_by_id(id); + if (fd < 0) { + if (errno == ENOENT) + continue; + p_err("can't get map by id (%u): %s", + id, strerror(errno)); + break; + } + + err = bpf_map_get_info_by_fd(fd, &info, &len); + if (err) { + p_err("can't get map info: %s", strerror(errno)); + close(fd); + break; + } + + if (json_output) + show_map_close_json(fd, &info); + else + show_map_close_plain(fd, &info); + } + if (json_output) + jsonw_end_array(json_wtr); + + delete_obj_refs_table(refs_table); + + if (show_pinned) + delete_pinned_obj_table(map_table); + + return errno == ENOENT ? 0 : -1; +} + +static int dump_map_elem(int fd, void *key, void *value, + struct bpf_map_info *map_info, struct btf *btf, + json_writer_t *btf_wtr) +{ + if (bpf_map_lookup_elem(fd, key, value)) { + print_entry_error(map_info, key, errno); + return -1; + } + + if (json_output) { + print_entry_json(map_info, key, value, btf); + } else if (btf) { + struct btf_dumper d = { + .btf = btf, + .jw = btf_wtr, + .is_plain_text = true, + }; + + do_dump_btf(&d, map_info, key, value); + } else { + print_entry_plain(map_info, key, value); + } + + return 0; +} + +static int maps_have_btf(int *fds, int nb_fds) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + int err, i; + + for (i = 0; i < nb_fds; i++) { + err = bpf_map_get_info_by_fd(fds[i], &info, &len); + if (err) { + p_err("can't get map info: %s", strerror(errno)); + return -1; + } + + if (!info.btf_id) + return 0; + } + + return 1; +} + +static struct btf *btf_vmlinux; + +static int get_map_kv_btf(const struct bpf_map_info *info, struct btf **btf) +{ + int err = 0; + + if (info->btf_vmlinux_value_type_id) { + if (!btf_vmlinux) { + btf_vmlinux = libbpf_find_kernel_btf(); + if (!btf_vmlinux) { + p_err("failed to get kernel btf"); + return -errno; + } + } + *btf = btf_vmlinux; + } else if (info->btf_value_type_id) { + *btf = btf__load_from_kernel_by_id(info->btf_id); + if (!*btf) { + err = -errno; + p_err("failed to get btf"); + } + } else { + *btf = NULL; + } + + return err; +} + +static void free_map_kv_btf(struct btf *btf) +{ + if (btf != btf_vmlinux) + btf__free(btf); +} + +static int +map_dump(int fd, struct bpf_map_info *info, json_writer_t *wtr, + bool show_header) +{ + void *key, *value, *prev_key; + unsigned int num_elems = 0; + struct btf *btf = NULL; + int err; + + key = malloc(info->key_size); + value = alloc_value(info); + if (!key || !value) { + p_err("mem alloc failed"); + err = -1; + goto exit_free; + } + + prev_key = NULL; + + if (wtr) { + err = get_map_kv_btf(info, &btf); + if (err) { + goto exit_free; + } + + if (show_header) { + jsonw_start_object(wtr); /* map object */ + show_map_header_json(info, wtr); + jsonw_name(wtr, "elements"); + } + jsonw_start_array(wtr); /* elements */ + } else if (show_header) { + show_map_header_plain(info); + } + + if (info->type == BPF_MAP_TYPE_REUSEPORT_SOCKARRAY && + info->value_size != 8) { + const char *map_type_str; + + map_type_str = libbpf_bpf_map_type_str(info->type); + p_info("Warning: cannot read values from %s map with value_size != 8", + map_type_str); + } + while (true) { + err = bpf_map_get_next_key(fd, prev_key, key); + if (err) { + if (errno == ENOENT) + err = 0; + break; + } + if (!dump_map_elem(fd, key, value, info, btf, wtr)) + num_elems++; + prev_key = key; + } + + if (wtr) { + jsonw_end_array(wtr); /* elements */ + if (show_header) + jsonw_end_object(wtr); /* map object */ + } else { + printf("Found %u element%s\n", num_elems, + num_elems != 1 ? "s" : ""); + } + +exit_free: + free(key); + free(value); + close(fd); + free_map_kv_btf(btf); + + return err; +} + +static int do_dump(int argc, char **argv) +{ + json_writer_t *wtr = NULL, *btf_wtr = NULL; + struct bpf_map_info info = {}; + int nb_fds, i = 0; + __u32 len = sizeof(info); + int *fds = NULL; + int err = -1; + + if (argc != 2) + usage(); + + fds = malloc(sizeof(int)); + if (!fds) { + p_err("mem alloc failed"); + return -1; + } + nb_fds = map_parse_fds(&argc, &argv, &fds); + if (nb_fds < 1) + goto exit_free; + + if (json_output) { + wtr = json_wtr; + } else { + int do_plain_btf; + + do_plain_btf = maps_have_btf(fds, nb_fds); + if (do_plain_btf < 0) + goto exit_close; + + if (do_plain_btf) { + btf_wtr = get_btf_writer(); + wtr = btf_wtr; + if (!btf_wtr) + p_info("failed to create json writer for btf. falling back to plain output"); + } + } + + if (wtr && nb_fds > 1) + jsonw_start_array(wtr); /* root array */ + for (i = 0; i < nb_fds; i++) { + if (bpf_map_get_info_by_fd(fds[i], &info, &len)) { + p_err("can't get map info: %s", strerror(errno)); + break; + } + err = map_dump(fds[i], &info, wtr, nb_fds > 1); + if (!wtr && i != nb_fds - 1) + printf("\n"); + + if (err) + break; + close(fds[i]); + } + if (wtr && nb_fds > 1) + jsonw_end_array(wtr); /* root array */ + + if (btf_wtr) + jsonw_destroy(&btf_wtr); +exit_close: + for (; i < nb_fds; i++) + close(fds[i]); +exit_free: + free(fds); + btf__free(btf_vmlinux); + return err; +} + +static int alloc_key_value(struct bpf_map_info *info, void **key, void **value) +{ + *key = NULL; + *value = NULL; + + if (info->key_size) { + *key = malloc(info->key_size); + if (!*key) { + p_err("key mem alloc failed"); + return -1; + } + } + + if (info->value_size) { + *value = alloc_value(info); + if (!*value) { + p_err("value mem alloc failed"); + free(*key); + *key = NULL; + return -1; + } + } + + return 0; +} + +static int do_update(int argc, char **argv) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + __u32 *value_fd = NULL; + __u32 flags = BPF_ANY; + void *key, *value; + int fd, err; + + if (argc < 2) + usage(); + + fd = map_parse_fd_and_info(&argc, &argv, &info, &len); + if (fd < 0) + return -1; + + err = alloc_key_value(&info, &key, &value); + if (err) + goto exit_free; + + err = parse_elem(argv, &info, key, value, info.key_size, + info.value_size, &flags, &value_fd); + if (err) + goto exit_free; + + err = bpf_map_update_elem(fd, key, value, flags); + if (err) { + p_err("update failed: %s", strerror(errno)); + goto exit_free; + } + +exit_free: + if (value_fd) + close(*value_fd); + free(key); + free(value); + close(fd); + + if (!err && json_output) + jsonw_null(json_wtr); + return err; +} + +static void print_key_value(struct bpf_map_info *info, void *key, + void *value) +{ + json_writer_t *btf_wtr; + struct btf *btf; + + if (get_map_kv_btf(info, &btf)) + return; + + if (json_output) { + print_entry_json(info, key, value, btf); + } else if (btf) { + /* if here json_wtr wouldn't have been initialised, + * so let's create separate writer for btf + */ + btf_wtr = get_btf_writer(); + if (!btf_wtr) { + p_info("failed to create json writer for btf. falling back to plain output"); + btf__free(btf); + btf = NULL; + print_entry_plain(info, key, value); + } else { + struct btf_dumper d = { + .btf = btf, + .jw = btf_wtr, + .is_plain_text = true, + }; + + do_dump_btf(&d, info, key, value); + jsonw_destroy(&btf_wtr); + } + } else { + print_entry_plain(info, key, value); + } + btf__free(btf); +} + +static int do_lookup(int argc, char **argv) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + void *key, *value; + int err; + int fd; + + if (argc < 2) + usage(); + + fd = map_parse_fd_and_info(&argc, &argv, &info, &len); + if (fd < 0) + return -1; + + err = alloc_key_value(&info, &key, &value); + if (err) + goto exit_free; + + err = parse_elem(argv, &info, key, NULL, info.key_size, 0, NULL, NULL); + if (err) + goto exit_free; + + err = bpf_map_lookup_elem(fd, key, value); + if (err) { + if (errno == ENOENT) { + if (json_output) { + jsonw_null(json_wtr); + } else { + printf("key:\n"); + fprint_hex(stdout, key, info.key_size, " "); + printf("\n\nNot found\n"); + } + } else { + p_err("lookup failed: %s", strerror(errno)); + } + + goto exit_free; + } + + /* here means bpf_map_lookup_elem() succeeded */ + print_key_value(&info, key, value); + +exit_free: + free(key); + free(value); + close(fd); + + return err; +} + +static int do_getnext(int argc, char **argv) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + void *key, *nextkey; + int err; + int fd; + + if (argc < 2) + usage(); + + fd = map_parse_fd_and_info(&argc, &argv, &info, &len); + if (fd < 0) + return -1; + + key = malloc(info.key_size); + nextkey = malloc(info.key_size); + if (!key || !nextkey) { + p_err("mem alloc failed"); + err = -1; + goto exit_free; + } + + if (argc) { + err = parse_elem(argv, &info, key, NULL, info.key_size, 0, + NULL, NULL); + if (err) + goto exit_free; + } else { + free(key); + key = NULL; + } + + err = bpf_map_get_next_key(fd, key, nextkey); + if (err) { + p_err("can't get next key: %s", strerror(errno)); + goto exit_free; + } + + if (json_output) { + jsonw_start_object(json_wtr); + if (key) { + jsonw_name(json_wtr, "key"); + print_hex_data_json(key, info.key_size); + } else { + jsonw_null_field(json_wtr, "key"); + } + jsonw_name(json_wtr, "next_key"); + print_hex_data_json(nextkey, info.key_size); + jsonw_end_object(json_wtr); + } else { + if (key) { + printf("key:\n"); + fprint_hex(stdout, key, info.key_size, " "); + printf("\n"); + } else { + printf("key: None\n"); + } + printf("next key:\n"); + fprint_hex(stdout, nextkey, info.key_size, " "); + printf("\n"); + } + +exit_free: + free(nextkey); + free(key); + close(fd); + + return err; +} + +static int do_delete(int argc, char **argv) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + void *key; + int err; + int fd; + + if (argc < 2) + usage(); + + fd = map_parse_fd_and_info(&argc, &argv, &info, &len); + if (fd < 0) + return -1; + + key = malloc(info.key_size); + if (!key) { + p_err("mem alloc failed"); + err = -1; + goto exit_free; + } + + err = parse_elem(argv, &info, key, NULL, info.key_size, 0, NULL, NULL); + if (err) + goto exit_free; + + err = bpf_map_delete_elem(fd, key); + if (err) + p_err("delete failed: %s", strerror(errno)); + +exit_free: + free(key); + close(fd); + + if (!err && json_output) + jsonw_null(json_wtr); + return err; +} + +static int do_pin(int argc, char **argv) +{ + int err; + + err = do_pin_any(argc, argv, map_parse_fd); + if (!err && json_output) + jsonw_null(json_wtr); + return err; +} + +static int do_create(int argc, char **argv) +{ + LIBBPF_OPTS(bpf_map_create_opts, attr); + enum bpf_map_type map_type = BPF_MAP_TYPE_UNSPEC; + __u32 key_size = 0, value_size = 0, max_entries = 0; + const char *map_name = NULL; + const char *pinfile; + int err = -1, fd; + + if (!REQ_ARGS(7)) + return -1; + pinfile = GET_ARG(); + + while (argc) { + if (!REQ_ARGS(2)) + return -1; + + if (is_prefix(*argv, "type")) { + NEXT_ARG(); + + if (map_type) { + p_err("map type already specified"); + goto exit; + } + + map_type = map_type_from_str(*argv); + if ((int)map_type < 0) { + p_err("unrecognized map type: %s", *argv); + goto exit; + } + NEXT_ARG(); + } else if (is_prefix(*argv, "name")) { + NEXT_ARG(); + map_name = GET_ARG(); + } else if (is_prefix(*argv, "key")) { + if (parse_u32_arg(&argc, &argv, &key_size, + "key size")) + goto exit; + } else if (is_prefix(*argv, "value")) { + if (parse_u32_arg(&argc, &argv, &value_size, + "value size")) + goto exit; + } else if (is_prefix(*argv, "entries")) { + if (parse_u32_arg(&argc, &argv, &max_entries, + "max entries")) + goto exit; + } else if (is_prefix(*argv, "flags")) { + if (parse_u32_arg(&argc, &argv, &attr.map_flags, + "flags")) + goto exit; + } else if (is_prefix(*argv, "dev")) { + NEXT_ARG(); + + if (attr.map_ifindex) { + p_err("offload device already specified"); + goto exit; + } + + attr.map_ifindex = if_nametoindex(*argv); + if (!attr.map_ifindex) { + p_err("unrecognized netdevice '%s': %s", + *argv, strerror(errno)); + goto exit; + } + NEXT_ARG(); + } else if (is_prefix(*argv, "inner_map")) { + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + int inner_map_fd; + + NEXT_ARG(); + if (!REQ_ARGS(2)) + usage(); + inner_map_fd = map_parse_fd_and_info(&argc, &argv, + &info, &len); + if (inner_map_fd < 0) + return -1; + attr.inner_map_fd = inner_map_fd; + } else { + p_err("unknown arg %s", *argv); + goto exit; + } + } + + if (!map_name) { + p_err("map name not specified"); + goto exit; + } + + set_max_rlimit(); + + fd = bpf_map_create(map_type, map_name, key_size, value_size, max_entries, &attr); + if (fd < 0) { + p_err("map create failed: %s", strerror(errno)); + goto exit; + } + + err = do_pin_fd(fd, pinfile); + close(fd); + if (err) + goto exit; + + if (json_output) + jsonw_null(json_wtr); + +exit: + if (attr.inner_map_fd > 0) + close(attr.inner_map_fd); + + return err; +} + +static int do_pop_dequeue(int argc, char **argv) +{ + struct bpf_map_info info = {}; + __u32 len = sizeof(info); + void *key, *value; + int err; + int fd; + + if (argc < 2) + usage(); + + fd = map_parse_fd_and_info(&argc, &argv, &info, &len); + if (fd < 0) + return -1; + + err = alloc_key_value(&info, &key, &value); + if (err) + goto exit_free; + + err = bpf_map_lookup_and_delete_elem(fd, key, value); + if (err) { + if (errno == ENOENT) { + if (json_output) + jsonw_null(json_wtr); + else + printf("Error: empty map\n"); + } else { + p_err("pop failed: %s", strerror(errno)); + } + + goto exit_free; + } + + print_key_value(&info, key, value); + +exit_free: + free(key); + free(value); + close(fd); + + return err; +} + +static int do_freeze(int argc, char **argv) +{ + int err, fd; + + if (!REQ_ARGS(2)) + return -1; + + fd = map_parse_fd(&argc, &argv); + if (fd < 0) + return -1; + + if (argc) { + close(fd); + return BAD_ARG(); + } + + err = bpf_map_freeze(fd); + close(fd); + if (err) { + p_err("failed to freeze map: %s", strerror(errno)); + return err; + } + + if (json_output) + jsonw_null(json_wtr); + + return 0; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %1$s %2$s { show | list } [MAP]\n" + " %1$s %2$s create FILE type TYPE key KEY_SIZE value VALUE_SIZE \\\n" + " entries MAX_ENTRIES name NAME [flags FLAGS] \\\n" + " [inner_map MAP] [dev NAME]\n" + " %1$s %2$s dump MAP\n" + " %1$s %2$s update MAP [key DATA] [value VALUE] [UPDATE_FLAGS]\n" + " %1$s %2$s lookup MAP [key DATA]\n" + " %1$s %2$s getnext MAP [key DATA]\n" + " %1$s %2$s delete MAP key DATA\n" + " %1$s %2$s pin MAP FILE\n" + " %1$s %2$s event_pipe MAP [cpu N index M]\n" + " %1$s %2$s peek MAP\n" + " %1$s %2$s push MAP value VALUE\n" + " %1$s %2$s pop MAP\n" + " %1$s %2$s enqueue MAP value VALUE\n" + " %1$s %2$s dequeue MAP\n" + " %1$s %2$s freeze MAP\n" + " %1$s %2$s help\n" + "\n" + " " HELP_SPEC_MAP "\n" + " DATA := { [hex] BYTES }\n" + " " HELP_SPEC_PROGRAM "\n" + " VALUE := { DATA | MAP | PROG }\n" + " UPDATE_FLAGS := { any | exist | noexist }\n" + " TYPE := { hash | array | prog_array | perf_event_array | percpu_hash |\n" + " percpu_array | stack_trace | cgroup_array | lru_hash |\n" + " lru_percpu_hash | lpm_trie | array_of_maps | hash_of_maps |\n" + " devmap | devmap_hash | sockmap | cpumap | xskmap | sockhash |\n" + " cgroup_storage | reuseport_sockarray | percpu_cgroup_storage |\n" + " queue | stack | sk_storage | struct_ops | ringbuf | inode_storage |\n" + " task_storage | bloom_filter | user_ringbuf | cgrp_storage }\n" + " " HELP_SPEC_OPTIONS " |\n" + " {-f|--bpffs} | {-n|--nomount} }\n" + "", + bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "show", do_show }, + { "list", do_show }, + { "help", do_help }, + { "dump", do_dump }, + { "update", do_update }, + { "lookup", do_lookup }, + { "getnext", do_getnext }, + { "delete", do_delete }, + { "pin", do_pin }, + { "event_pipe", do_event_pipe }, + { "create", do_create }, + { "peek", do_lookup }, + { "push", do_update }, + { "enqueue", do_update }, + { "pop", do_pop_dequeue }, + { "dequeue", do_pop_dequeue }, + { "freeze", do_freeze }, + { 0 } +}; + +int do_map(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/map_perf_ring.c b/bpftool/src/map_perf_ring.c new file mode 100644 index 0000000..21d7d44 --- /dev/null +++ b/bpftool/src/map_perf_ring.c @@ -0,0 +1,226 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2018 Netronome Systems, Inc. */ +/* This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "main.h" + +#define MMAP_PAGE_CNT 16 + +static volatile bool stop; + +struct perf_event_sample { + struct perf_event_header header; + __u64 time; + __u32 size; + unsigned char data[]; +}; + +struct perf_event_lost { + struct perf_event_header header; + __u64 id; + __u64 lost; +}; + +static void int_exit(int signo) +{ + fprintf(stderr, "Stopping...\n"); + stop = true; +} + +struct event_pipe_ctx { + bool all_cpus; + int cpu; + int idx; +}; + +static enum bpf_perf_event_ret +print_bpf_output(void *private_data, int cpu, struct perf_event_header *event) +{ + struct perf_event_sample *e = container_of(event, + struct perf_event_sample, + header); + struct perf_event_lost *lost = container_of(event, + struct perf_event_lost, + header); + struct event_pipe_ctx *ctx = private_data; + int idx = ctx->all_cpus ? cpu : ctx->idx; + + if (json_output) { + jsonw_start_object(json_wtr); + jsonw_name(json_wtr, "type"); + jsonw_uint(json_wtr, e->header.type); + jsonw_name(json_wtr, "cpu"); + jsonw_uint(json_wtr, cpu); + jsonw_name(json_wtr, "index"); + jsonw_uint(json_wtr, idx); + if (e->header.type == PERF_RECORD_SAMPLE) { + jsonw_name(json_wtr, "timestamp"); + jsonw_uint(json_wtr, e->time); + jsonw_name(json_wtr, "data"); + print_data_json(e->data, e->size); + } else if (e->header.type == PERF_RECORD_LOST) { + jsonw_name(json_wtr, "lost"); + jsonw_start_object(json_wtr); + jsonw_name(json_wtr, "id"); + jsonw_uint(json_wtr, lost->id); + jsonw_name(json_wtr, "count"); + jsonw_uint(json_wtr, lost->lost); + jsonw_end_object(json_wtr); + } + jsonw_end_object(json_wtr); + } else { + if (e->header.type == PERF_RECORD_SAMPLE) { + printf("== @%lld.%09lld CPU: %d index: %d =====\n", + e->time / 1000000000ULL, e->time % 1000000000ULL, + cpu, idx); + fprint_hex(stdout, e->data, e->size, " "); + printf("\n"); + } else if (e->header.type == PERF_RECORD_LOST) { + printf("lost %lld events\n", lost->lost); + } else { + printf("unknown event type=%d size=%d\n", + e->header.type, e->header.size); + } + } + + return LIBBPF_PERF_EVENT_CONT; +} + +int do_event_pipe(int argc, char **argv) +{ + struct perf_event_attr perf_attr = { + .sample_type = PERF_SAMPLE_RAW | PERF_SAMPLE_TIME, + .type = PERF_TYPE_SOFTWARE, + .config = PERF_COUNT_SW_BPF_OUTPUT, + .sample_period = 1, + .wakeup_events = 1, + }; + struct bpf_map_info map_info = {}; + LIBBPF_OPTS(perf_buffer_raw_opts, opts); + struct event_pipe_ctx ctx = { + .all_cpus = true, + .cpu = -1, + .idx = -1, + }; + struct perf_buffer *pb; + __u32 map_info_len; + int err, map_fd; + + map_info_len = sizeof(map_info); + map_fd = map_parse_fd_and_info(&argc, &argv, &map_info, &map_info_len); + if (map_fd < 0) + return -1; + + if (map_info.type != BPF_MAP_TYPE_PERF_EVENT_ARRAY) { + p_err("map is not a perf event array"); + goto err_close_map; + } + + while (argc) { + if (argc < 2) { + BAD_ARG(); + goto err_close_map; + } + + if (is_prefix(*argv, "cpu")) { + char *endptr; + + NEXT_ARG(); + ctx.cpu = strtoul(*argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as CPU ID", *argv); + goto err_close_map; + } + + NEXT_ARG(); + } else if (is_prefix(*argv, "index")) { + char *endptr; + + NEXT_ARG(); + ctx.idx = strtoul(*argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as index", *argv); + goto err_close_map; + } + + NEXT_ARG(); + } else { + BAD_ARG(); + goto err_close_map; + } + + ctx.all_cpus = false; + } + + if (!ctx.all_cpus) { + if (ctx.idx == -1 || ctx.cpu == -1) { + p_err("cpu and index must be specified together"); + goto err_close_map; + } + } else { + ctx.cpu = 0; + ctx.idx = 0; + } + + opts.cpu_cnt = ctx.all_cpus ? 0 : 1; + opts.cpus = &ctx.cpu; + opts.map_keys = &ctx.idx; + pb = perf_buffer__new_raw(map_fd, MMAP_PAGE_CNT, &perf_attr, + print_bpf_output, &ctx, &opts); + if (!pb) { + p_err("failed to create perf buffer: %s (%d)", + strerror(errno), errno); + goto err_close_map; + } + + signal(SIGINT, int_exit); + signal(SIGHUP, int_exit); + signal(SIGTERM, int_exit); + + if (json_output) + jsonw_start_array(json_wtr); + + while (!stop) { + err = perf_buffer__poll(pb, 200); + if (err < 0 && err != -EINTR) { + p_err("perf buffer polling failed: %s (%d)", + strerror(errno), errno); + goto err_close_pb; + } + } + + if (json_output) + jsonw_end_array(json_wtr); + + perf_buffer__free(pb); + close(map_fd); + + return 0; + +err_close_pb: + perf_buffer__free(pb); +err_close_map: + close(map_fd); + return -1; +} diff --git a/bpftool/src/net.c b/bpftool/src/net.c new file mode 100644 index 0000000..c40e44c --- /dev/null +++ b/bpftool/src/net.c @@ -0,0 +1,759 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +// Copyright (C) 2018 Facebook + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bpf/nlattr.h" +#include "main.h" +#include "netlink_dumper.h" + +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + +struct ip_devname_ifindex { + char devname[64]; + int ifindex; +}; + +struct bpf_netdev_t { + struct ip_devname_ifindex *devices; + int used_len; + int array_len; + int filter_idx; +}; + +struct tc_kind_handle { + char kind[64]; + int handle; +}; + +struct bpf_tcinfo_t { + struct tc_kind_handle *handle_array; + int used_len; + int array_len; + bool is_qdisc; +}; + +struct bpf_filter_t { + const char *kind; + const char *devname; + int ifindex; +}; + +struct bpf_attach_info { + __u32 flow_dissector_id; +}; + +enum net_attach_type { + NET_ATTACH_TYPE_XDP, + NET_ATTACH_TYPE_XDP_GENERIC, + NET_ATTACH_TYPE_XDP_DRIVER, + NET_ATTACH_TYPE_XDP_OFFLOAD, +}; + +static const char * const attach_type_strings[] = { + [NET_ATTACH_TYPE_XDP] = "xdp", + [NET_ATTACH_TYPE_XDP_GENERIC] = "xdpgeneric", + [NET_ATTACH_TYPE_XDP_DRIVER] = "xdpdrv", + [NET_ATTACH_TYPE_XDP_OFFLOAD] = "xdpoffload", +}; + +const size_t net_attach_type_size = ARRAY_SIZE(attach_type_strings); + +static enum net_attach_type parse_attach_type(const char *str) +{ + enum net_attach_type type; + + for (type = 0; type < net_attach_type_size; type++) { + if (attach_type_strings[type] && + is_prefix(str, attach_type_strings[type])) + return type; + } + + return net_attach_type_size; +} + +typedef int (*dump_nlmsg_t)(void *cookie, void *msg, struct nlattr **tb); + +typedef int (*__dump_nlmsg_t)(struct nlmsghdr *nlmsg, dump_nlmsg_t, void *cookie); + +static int netlink_open(__u32 *nl_pid) +{ + struct sockaddr_nl sa; + socklen_t addrlen; + int one = 1, ret; + int sock; + + memset(&sa, 0, sizeof(sa)); + sa.nl_family = AF_NETLINK; + + sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); + if (sock < 0) + return -errno; + + if (setsockopt(sock, SOL_NETLINK, NETLINK_EXT_ACK, + &one, sizeof(one)) < 0) { + p_err("Netlink error reporting not supported"); + } + + if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) { + ret = -errno; + goto cleanup; + } + + addrlen = sizeof(sa); + if (getsockname(sock, (struct sockaddr *)&sa, &addrlen) < 0) { + ret = -errno; + goto cleanup; + } + + if (addrlen != sizeof(sa)) { + ret = -LIBBPF_ERRNO__INTERNAL; + goto cleanup; + } + + *nl_pid = sa.nl_pid; + return sock; + +cleanup: + close(sock); + return ret; +} + +static int netlink_recv(int sock, __u32 nl_pid, __u32 seq, + __dump_nlmsg_t _fn, dump_nlmsg_t fn, + void *cookie) +{ + bool multipart = true; + struct nlmsgerr *err; + struct nlmsghdr *nh; + char buf[4096]; + int len, ret; + + while (multipart) { + multipart = false; + len = recv(sock, buf, sizeof(buf), 0); + if (len < 0) { + ret = -errno; + goto done; + } + + if (len == 0) + break; + + for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, (unsigned int)len); + nh = NLMSG_NEXT(nh, len)) { + if (nh->nlmsg_pid != nl_pid) { + ret = -LIBBPF_ERRNO__WRNGPID; + goto done; + } + if (nh->nlmsg_seq != seq) { + ret = -LIBBPF_ERRNO__INVSEQ; + goto done; + } + if (nh->nlmsg_flags & NLM_F_MULTI) + multipart = true; + switch (nh->nlmsg_type) { + case NLMSG_ERROR: + err = (struct nlmsgerr *)NLMSG_DATA(nh); + if (!err->error) + continue; + ret = err->error; + libbpf_nla_dump_errormsg(nh); + goto done; + case NLMSG_DONE: + return 0; + default: + break; + } + if (_fn) { + ret = _fn(nh, fn, cookie); + if (ret) + return ret; + } + } + } + ret = 0; +done: + return ret; +} + +static int __dump_class_nlmsg(struct nlmsghdr *nlh, + dump_nlmsg_t dump_class_nlmsg, + void *cookie) +{ + struct nlattr *tb[TCA_MAX + 1], *attr; + struct tcmsg *t = NLMSG_DATA(nlh); + int len; + + len = nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*t)); + attr = (struct nlattr *) ((void *) t + NLMSG_ALIGN(sizeof(*t))); + if (libbpf_nla_parse(tb, TCA_MAX, attr, len, NULL) != 0) + return -LIBBPF_ERRNO__NLPARSE; + + return dump_class_nlmsg(cookie, t, tb); +} + +static int netlink_get_class(int sock, unsigned int nl_pid, int ifindex, + dump_nlmsg_t dump_class_nlmsg, void *cookie) +{ + struct { + struct nlmsghdr nlh; + struct tcmsg t; + } req = { + .nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)), + .nlh.nlmsg_type = RTM_GETTCLASS, + .nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, + .t.tcm_family = AF_UNSPEC, + .t.tcm_ifindex = ifindex, + }; + int seq = time(NULL); + + req.nlh.nlmsg_seq = seq; + if (send(sock, &req, req.nlh.nlmsg_len, 0) < 0) + return -errno; + + return netlink_recv(sock, nl_pid, seq, __dump_class_nlmsg, + dump_class_nlmsg, cookie); +} + +static int __dump_qdisc_nlmsg(struct nlmsghdr *nlh, + dump_nlmsg_t dump_qdisc_nlmsg, + void *cookie) +{ + struct nlattr *tb[TCA_MAX + 1], *attr; + struct tcmsg *t = NLMSG_DATA(nlh); + int len; + + len = nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*t)); + attr = (struct nlattr *) ((void *) t + NLMSG_ALIGN(sizeof(*t))); + if (libbpf_nla_parse(tb, TCA_MAX, attr, len, NULL) != 0) + return -LIBBPF_ERRNO__NLPARSE; + + return dump_qdisc_nlmsg(cookie, t, tb); +} + +static int netlink_get_qdisc(int sock, unsigned int nl_pid, int ifindex, + dump_nlmsg_t dump_qdisc_nlmsg, void *cookie) +{ + struct { + struct nlmsghdr nlh; + struct tcmsg t; + } req = { + .nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)), + .nlh.nlmsg_type = RTM_GETQDISC, + .nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, + .t.tcm_family = AF_UNSPEC, + .t.tcm_ifindex = ifindex, + }; + int seq = time(NULL); + + req.nlh.nlmsg_seq = seq; + if (send(sock, &req, req.nlh.nlmsg_len, 0) < 0) + return -errno; + + return netlink_recv(sock, nl_pid, seq, __dump_qdisc_nlmsg, + dump_qdisc_nlmsg, cookie); +} + +static int __dump_filter_nlmsg(struct nlmsghdr *nlh, + dump_nlmsg_t dump_filter_nlmsg, + void *cookie) +{ + struct nlattr *tb[TCA_MAX + 1], *attr; + struct tcmsg *t = NLMSG_DATA(nlh); + int len; + + len = nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*t)); + attr = (struct nlattr *) ((void *) t + NLMSG_ALIGN(sizeof(*t))); + if (libbpf_nla_parse(tb, TCA_MAX, attr, len, NULL) != 0) + return -LIBBPF_ERRNO__NLPARSE; + + return dump_filter_nlmsg(cookie, t, tb); +} + +static int netlink_get_filter(int sock, unsigned int nl_pid, int ifindex, int handle, + dump_nlmsg_t dump_filter_nlmsg, void *cookie) +{ + struct { + struct nlmsghdr nlh; + struct tcmsg t; + } req = { + .nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)), + .nlh.nlmsg_type = RTM_GETTFILTER, + .nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, + .t.tcm_family = AF_UNSPEC, + .t.tcm_ifindex = ifindex, + .t.tcm_parent = handle, + }; + int seq = time(NULL); + + req.nlh.nlmsg_seq = seq; + if (send(sock, &req, req.nlh.nlmsg_len, 0) < 0) + return -errno; + + return netlink_recv(sock, nl_pid, seq, __dump_filter_nlmsg, + dump_filter_nlmsg, cookie); +} + +static int __dump_link_nlmsg(struct nlmsghdr *nlh, + dump_nlmsg_t dump_link_nlmsg, void *cookie) +{ + struct nlattr *tb[IFLA_MAX + 1], *attr; + struct ifinfomsg *ifi = NLMSG_DATA(nlh); + int len; + + len = nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); + attr = (struct nlattr *) ((void *) ifi + NLMSG_ALIGN(sizeof(*ifi))); + if (libbpf_nla_parse(tb, IFLA_MAX, attr, len, NULL) != 0) + return -LIBBPF_ERRNO__NLPARSE; + + return dump_link_nlmsg(cookie, ifi, tb); +} + +static int netlink_get_link(int sock, unsigned int nl_pid, + dump_nlmsg_t dump_link_nlmsg, void *cookie) +{ + struct { + struct nlmsghdr nlh; + struct ifinfomsg ifm; + } req = { + .nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)), + .nlh.nlmsg_type = RTM_GETLINK, + .nlh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, + .ifm.ifi_family = AF_PACKET, + }; + int seq = time(NULL); + + req.nlh.nlmsg_seq = seq; + if (send(sock, &req, req.nlh.nlmsg_len, 0) < 0) + return -errno; + + return netlink_recv(sock, nl_pid, seq, __dump_link_nlmsg, + dump_link_nlmsg, cookie); +} + +static int dump_link_nlmsg(void *cookie, void *msg, struct nlattr **tb) +{ + struct bpf_netdev_t *netinfo = cookie; + struct ifinfomsg *ifinfo = msg; + + if (netinfo->filter_idx > 0 && netinfo->filter_idx != ifinfo->ifi_index) + return 0; + + if (netinfo->used_len == netinfo->array_len) { + netinfo->devices = realloc(netinfo->devices, + (netinfo->array_len + 16) * + sizeof(struct ip_devname_ifindex)); + if (!netinfo->devices) + return -ENOMEM; + + netinfo->array_len += 16; + } + netinfo->devices[netinfo->used_len].ifindex = ifinfo->ifi_index; + snprintf(netinfo->devices[netinfo->used_len].devname, + sizeof(netinfo->devices[netinfo->used_len].devname), + "%s", + tb[IFLA_IFNAME] + ? libbpf_nla_getattr_str(tb[IFLA_IFNAME]) + : ""); + netinfo->used_len++; + + return do_xdp_dump(ifinfo, tb); +} + +static int dump_class_qdisc_nlmsg(void *cookie, void *msg, struct nlattr **tb) +{ + struct bpf_tcinfo_t *tcinfo = cookie; + struct tcmsg *info = msg; + + if (tcinfo->is_qdisc) { + /* skip clsact qdisc */ + if (tb[TCA_KIND] && + strcmp(libbpf_nla_data(tb[TCA_KIND]), "clsact") == 0) + return 0; + if (info->tcm_handle == 0) + return 0; + } + + if (tcinfo->used_len == tcinfo->array_len) { + tcinfo->handle_array = realloc(tcinfo->handle_array, + (tcinfo->array_len + 16) * sizeof(struct tc_kind_handle)); + if (!tcinfo->handle_array) + return -ENOMEM; + + tcinfo->array_len += 16; + } + tcinfo->handle_array[tcinfo->used_len].handle = info->tcm_handle; + snprintf(tcinfo->handle_array[tcinfo->used_len].kind, + sizeof(tcinfo->handle_array[tcinfo->used_len].kind), + "%s", + tb[TCA_KIND] + ? libbpf_nla_getattr_str(tb[TCA_KIND]) + : "unknown"); + tcinfo->used_len++; + + return 0; +} + +static int dump_filter_nlmsg(void *cookie, void *msg, struct nlattr **tb) +{ + const struct bpf_filter_t *filter_info = cookie; + + return do_filter_dump((struct tcmsg *)msg, tb, filter_info->kind, + filter_info->devname, filter_info->ifindex); +} + +static int show_dev_tc_bpf(int sock, unsigned int nl_pid, + struct ip_devname_ifindex *dev) +{ + struct bpf_filter_t filter_info; + struct bpf_tcinfo_t tcinfo; + int i, handle, ret = 0; + + tcinfo.handle_array = NULL; + tcinfo.used_len = 0; + tcinfo.array_len = 0; + + tcinfo.is_qdisc = false; + ret = netlink_get_class(sock, nl_pid, dev->ifindex, + dump_class_qdisc_nlmsg, &tcinfo); + if (ret) + goto out; + + tcinfo.is_qdisc = true; + ret = netlink_get_qdisc(sock, nl_pid, dev->ifindex, + dump_class_qdisc_nlmsg, &tcinfo); + if (ret) + goto out; + + filter_info.devname = dev->devname; + filter_info.ifindex = dev->ifindex; + for (i = 0; i < tcinfo.used_len; i++) { + filter_info.kind = tcinfo.handle_array[i].kind; + ret = netlink_get_filter(sock, nl_pid, dev->ifindex, + tcinfo.handle_array[i].handle, + dump_filter_nlmsg, &filter_info); + if (ret) + goto out; + } + + /* root, ingress and egress handle */ + handle = TC_H_ROOT; + filter_info.kind = "root"; + ret = netlink_get_filter(sock, nl_pid, dev->ifindex, handle, + dump_filter_nlmsg, &filter_info); + if (ret) + goto out; + + handle = TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_INGRESS); + filter_info.kind = "clsact/ingress"; + ret = netlink_get_filter(sock, nl_pid, dev->ifindex, handle, + dump_filter_nlmsg, &filter_info); + if (ret) + goto out; + + handle = TC_H_MAKE(TC_H_CLSACT, TC_H_MIN_EGRESS); + filter_info.kind = "clsact/egress"; + ret = netlink_get_filter(sock, nl_pid, dev->ifindex, handle, + dump_filter_nlmsg, &filter_info); + if (ret) + goto out; + +out: + free(tcinfo.handle_array); + return 0; +} + +static int query_flow_dissector(struct bpf_attach_info *attach_info) +{ + __u32 attach_flags; + __u32 prog_ids[1]; + __u32 prog_cnt; + int err; + int fd; + + fd = open("/proc/self/ns/net", O_RDONLY); + if (fd < 0) { + p_err("can't open /proc/self/ns/net: %s", + strerror(errno)); + return -1; + } + prog_cnt = ARRAY_SIZE(prog_ids); + err = bpf_prog_query(fd, BPF_FLOW_DISSECTOR, 0, + &attach_flags, prog_ids, &prog_cnt); + close(fd); + if (err) { + if (errno == EINVAL) { + /* Older kernel's don't support querying + * flow dissector programs. + */ + errno = 0; + return 0; + } + p_err("can't query prog: %s", strerror(errno)); + return -1; + } + + if (prog_cnt == 1) + attach_info->flow_dissector_id = prog_ids[0]; + + return 0; +} + +static int net_parse_dev(int *argc, char ***argv) +{ + int ifindex; + + if (is_prefix(**argv, "dev")) { + NEXT_ARGP(); + + ifindex = if_nametoindex(**argv); + if (!ifindex) + p_err("invalid devname %s", **argv); + + NEXT_ARGP(); + } else { + p_err("expected 'dev', got: '%s'?", **argv); + return -1; + } + + return ifindex; +} + +static int do_attach_detach_xdp(int progfd, enum net_attach_type attach_type, + int ifindex, bool overwrite) +{ + __u32 flags = 0; + + if (!overwrite) + flags = XDP_FLAGS_UPDATE_IF_NOEXIST; + if (attach_type == NET_ATTACH_TYPE_XDP_GENERIC) + flags |= XDP_FLAGS_SKB_MODE; + if (attach_type == NET_ATTACH_TYPE_XDP_DRIVER) + flags |= XDP_FLAGS_DRV_MODE; + if (attach_type == NET_ATTACH_TYPE_XDP_OFFLOAD) + flags |= XDP_FLAGS_HW_MODE; + + return bpf_xdp_attach(ifindex, progfd, flags, NULL); +} + +static int do_attach(int argc, char **argv) +{ + enum net_attach_type attach_type; + int progfd, ifindex, err = 0; + bool overwrite = false; + + /* parse attach args */ + if (!REQ_ARGS(5)) + return -EINVAL; + + attach_type = parse_attach_type(*argv); + if (attach_type == net_attach_type_size) { + p_err("invalid net attach/detach type: %s", *argv); + return -EINVAL; + } + NEXT_ARG(); + + progfd = prog_parse_fd(&argc, &argv); + if (progfd < 0) + return -EINVAL; + + ifindex = net_parse_dev(&argc, &argv); + if (ifindex < 1) { + err = -EINVAL; + goto cleanup; + } + + if (argc) { + if (is_prefix(*argv, "overwrite")) { + overwrite = true; + } else { + p_err("expected 'overwrite', got: '%s'?", *argv); + err = -EINVAL; + goto cleanup; + } + } + + /* attach xdp prog */ + if (is_prefix("xdp", attach_type_strings[attach_type])) + err = do_attach_detach_xdp(progfd, attach_type, ifindex, + overwrite); + if (err) { + p_err("interface %s attach failed: %s", + attach_type_strings[attach_type], strerror(-err)); + goto cleanup; + } + + if (json_output) + jsonw_null(json_wtr); +cleanup: + close(progfd); + return err; +} + +static int do_detach(int argc, char **argv) +{ + enum net_attach_type attach_type; + int progfd, ifindex, err = 0; + + /* parse detach args */ + if (!REQ_ARGS(3)) + return -EINVAL; + + attach_type = parse_attach_type(*argv); + if (attach_type == net_attach_type_size) { + p_err("invalid net attach/detach type: %s", *argv); + return -EINVAL; + } + NEXT_ARG(); + + ifindex = net_parse_dev(&argc, &argv); + if (ifindex < 1) + return -EINVAL; + + /* detach xdp prog */ + progfd = -1; + if (is_prefix("xdp", attach_type_strings[attach_type])) + err = do_attach_detach_xdp(progfd, attach_type, ifindex, NULL); + + if (err < 0) { + p_err("interface %s detach failed: %s", + attach_type_strings[attach_type], strerror(-err)); + return err; + } + + if (json_output) + jsonw_null(json_wtr); + + return 0; +} + +static int do_show(int argc, char **argv) +{ + struct bpf_attach_info attach_info = {}; + int i, sock, ret, filter_idx = -1; + struct bpf_netdev_t dev_array; + unsigned int nl_pid = 0; + char err_buf[256]; + + if (argc == 2) { + filter_idx = net_parse_dev(&argc, &argv); + if (filter_idx < 1) + return -1; + } else if (argc != 0) { + usage(); + } + + ret = query_flow_dissector(&attach_info); + if (ret) + return -1; + + sock = netlink_open(&nl_pid); + if (sock < 0) { + fprintf(stderr, "failed to open netlink sock\n"); + return -1; + } + + dev_array.devices = NULL; + dev_array.used_len = 0; + dev_array.array_len = 0; + dev_array.filter_idx = filter_idx; + + if (json_output) + jsonw_start_array(json_wtr); + NET_START_OBJECT; + NET_START_ARRAY("xdp", "%s:\n"); + ret = netlink_get_link(sock, nl_pid, dump_link_nlmsg, &dev_array); + NET_END_ARRAY("\n"); + + if (!ret) { + NET_START_ARRAY("tc", "%s:\n"); + for (i = 0; i < dev_array.used_len; i++) { + ret = show_dev_tc_bpf(sock, nl_pid, + &dev_array.devices[i]); + if (ret) + break; + } + NET_END_ARRAY("\n"); + } + + NET_START_ARRAY("flow_dissector", "%s:\n"); + if (attach_info.flow_dissector_id > 0) + NET_DUMP_UINT("id", "id %u", attach_info.flow_dissector_id); + NET_END_ARRAY("\n"); + + NET_END_OBJECT; + if (json_output) + jsonw_end_array(json_wtr); + + if (ret) { + if (json_output) + jsonw_null(json_wtr); + libbpf_strerror(ret, err_buf, sizeof(err_buf)); + fprintf(stderr, "Error: %s\n", err_buf); + } + free(dev_array.devices); + close(sock); + return ret; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %1$s %2$s { show | list } [dev ]\n" + " %1$s %2$s attach ATTACH_TYPE PROG dev [ overwrite ]\n" + " %1$s %2$s detach ATTACH_TYPE dev \n" + " %1$s %2$s help\n" + "\n" + " " HELP_SPEC_PROGRAM "\n" + " ATTACH_TYPE := { xdp | xdpgeneric | xdpdrv | xdpoffload }\n" + " " HELP_SPEC_OPTIONS " }\n" + "\n" + "Note: Only xdp and tc attachments are supported now.\n" + " For progs attached to cgroups, use \"bpftool cgroup\"\n" + " to dump program attachments. For program types\n" + " sk_{filter,skb,msg,reuseport} and lwt/seg6, please\n" + " consult iproute2.\n" + "", + bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "show", do_show }, + { "list", do_show }, + { "attach", do_attach }, + { "detach", do_detach }, + { "help", do_help }, + { 0 } +}; + +int do_net(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/netlink_dumper.c b/bpftool/src/netlink_dumper.c new file mode 100644 index 0000000..5f65140 --- /dev/null +++ b/bpftool/src/netlink_dumper.c @@ -0,0 +1,178 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +// Copyright (C) 2018 Facebook + +#include +#include +#include +#include +#include + +#include "bpf/nlattr.h" +#include "main.h" +#include "netlink_dumper.h" + +static void xdp_dump_prog_id(struct nlattr **tb, int attr, + const char *mode, + bool new_json_object) +{ + if (!tb[attr]) + return; + + if (new_json_object) + NET_START_OBJECT + NET_DUMP_STR("mode", " %s", mode); + NET_DUMP_UINT("id", " id %u", libbpf_nla_getattr_u32(tb[attr])) + if (new_json_object) + NET_END_OBJECT +} + +static int do_xdp_dump_one(struct nlattr *attr, unsigned int ifindex, + const char *name) +{ + struct nlattr *tb[IFLA_XDP_MAX + 1]; + unsigned char mode; + + if (libbpf_nla_parse_nested(tb, IFLA_XDP_MAX, attr, NULL) < 0) + return -1; + + if (!tb[IFLA_XDP_ATTACHED]) + return 0; + + mode = libbpf_nla_getattr_u8(tb[IFLA_XDP_ATTACHED]); + if (mode == XDP_ATTACHED_NONE) + return 0; + + NET_START_OBJECT; + if (name) + NET_DUMP_STR("devname", "%s", name); + NET_DUMP_UINT("ifindex", "(%d)", ifindex); + + if (mode == XDP_ATTACHED_MULTI) { + if (json_output) { + jsonw_name(json_wtr, "multi_attachments"); + jsonw_start_array(json_wtr); + } + xdp_dump_prog_id(tb, IFLA_XDP_SKB_PROG_ID, "generic", true); + xdp_dump_prog_id(tb, IFLA_XDP_DRV_PROG_ID, "driver", true); + xdp_dump_prog_id(tb, IFLA_XDP_HW_PROG_ID, "offload", true); + if (json_output) + jsonw_end_array(json_wtr); + } else if (mode == XDP_ATTACHED_DRV) { + xdp_dump_prog_id(tb, IFLA_XDP_PROG_ID, "driver", false); + } else if (mode == XDP_ATTACHED_SKB) { + xdp_dump_prog_id(tb, IFLA_XDP_PROG_ID, "generic", false); + } else if (mode == XDP_ATTACHED_HW) { + xdp_dump_prog_id(tb, IFLA_XDP_PROG_ID, "offload", false); + } + + NET_END_OBJECT_FINAL; + return 0; +} + +int do_xdp_dump(struct ifinfomsg *ifinfo, struct nlattr **tb) +{ + if (!tb[IFLA_XDP]) + return 0; + + return do_xdp_dump_one(tb[IFLA_XDP], ifinfo->ifi_index, + libbpf_nla_getattr_str(tb[IFLA_IFNAME])); +} + +static int do_bpf_dump_one_act(struct nlattr *attr) +{ + struct nlattr *tb[TCA_ACT_BPF_MAX + 1]; + + if (libbpf_nla_parse_nested(tb, TCA_ACT_BPF_MAX, attr, NULL) < 0) + return -LIBBPF_ERRNO__NLPARSE; + + if (!tb[TCA_ACT_BPF_PARMS]) + return -LIBBPF_ERRNO__NLPARSE; + + NET_START_OBJECT_NESTED2; + if (tb[TCA_ACT_BPF_NAME]) + NET_DUMP_STR("name", "%s", + libbpf_nla_getattr_str(tb[TCA_ACT_BPF_NAME])); + if (tb[TCA_ACT_BPF_ID]) + NET_DUMP_UINT("id", " id %u", + libbpf_nla_getattr_u32(tb[TCA_ACT_BPF_ID])); + NET_END_OBJECT_NESTED; + return 0; +} + +static int do_dump_one_act(struct nlattr *attr) +{ + struct nlattr *tb[TCA_ACT_MAX + 1]; + + if (!attr) + return 0; + + if (libbpf_nla_parse_nested(tb, TCA_ACT_MAX, attr, NULL) < 0) + return -LIBBPF_ERRNO__NLPARSE; + + if (tb[TCA_ACT_KIND] && + strcmp(libbpf_nla_data(tb[TCA_ACT_KIND]), "bpf") == 0) + return do_bpf_dump_one_act(tb[TCA_ACT_OPTIONS]); + + return 0; +} + +static int do_bpf_act_dump(struct nlattr *attr) +{ + struct nlattr *tb[TCA_ACT_MAX_PRIO + 1]; + int act, ret; + + if (libbpf_nla_parse_nested(tb, TCA_ACT_MAX_PRIO, attr, NULL) < 0) + return -LIBBPF_ERRNO__NLPARSE; + + NET_START_ARRAY("act", " %s ["); + for (act = 0; act <= TCA_ACT_MAX_PRIO; act++) { + ret = do_dump_one_act(tb[act]); + if (ret) + break; + } + NET_END_ARRAY("] "); + + return ret; +} + +static int do_bpf_filter_dump(struct nlattr *attr) +{ + struct nlattr *tb[TCA_BPF_MAX + 1]; + int ret; + + if (libbpf_nla_parse_nested(tb, TCA_BPF_MAX, attr, NULL) < 0) + return -LIBBPF_ERRNO__NLPARSE; + + if (tb[TCA_BPF_NAME]) + NET_DUMP_STR("name", " %s", + libbpf_nla_getattr_str(tb[TCA_BPF_NAME])); + if (tb[TCA_BPF_ID]) + NET_DUMP_UINT("id", " id %u", + libbpf_nla_getattr_u32(tb[TCA_BPF_ID])); + if (tb[TCA_BPF_ACT]) { + ret = do_bpf_act_dump(tb[TCA_BPF_ACT]); + if (ret) + return ret; + } + + return 0; +} + +int do_filter_dump(struct tcmsg *info, struct nlattr **tb, const char *kind, + const char *devname, int ifindex) +{ + int ret = 0; + + if (tb[TCA_OPTIONS] && + strcmp(libbpf_nla_data(tb[TCA_KIND]), "bpf") == 0) { + NET_START_OBJECT; + if (devname[0] != '\0') + NET_DUMP_STR("devname", "%s", devname); + NET_DUMP_UINT("ifindex", "(%u)", ifindex); + NET_DUMP_STR("kind", " %s", kind); + ret = do_bpf_filter_dump(tb[TCA_OPTIONS]); + NET_END_OBJECT_FINAL; + } + + return ret; +} diff --git a/bpftool/src/netlink_dumper.h b/bpftool/src/netlink_dumper.h new file mode 100644 index 0000000..774af6c --- /dev/null +++ b/bpftool/src/netlink_dumper.h @@ -0,0 +1,95 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +// Copyright (C) 2018 Facebook + +#ifndef _NETLINK_DUMPER_H_ +#define _NETLINK_DUMPER_H_ + +#define NET_START_OBJECT \ +{ \ + if (json_output) \ + jsonw_start_object(json_wtr); \ +} + +#define NET_START_OBJECT_NESTED(name) \ +{ \ + if (json_output) { \ + jsonw_name(json_wtr, name); \ + jsonw_start_object(json_wtr); \ + } else { \ + fprintf(stdout, "%s {", name); \ + } \ +} + +#define NET_START_OBJECT_NESTED2 \ +{ \ + if (json_output) \ + jsonw_start_object(json_wtr); \ + else \ + fprintf(stdout, "{"); \ +} + +#define NET_END_OBJECT_NESTED \ +{ \ + if (json_output) \ + jsonw_end_object(json_wtr); \ + else \ + fprintf(stdout, "}"); \ +} + +#define NET_END_OBJECT \ +{ \ + if (json_output) \ + jsonw_end_object(json_wtr); \ +} + +#define NET_END_OBJECT_FINAL \ +{ \ + if (json_output) \ + jsonw_end_object(json_wtr); \ + else \ + fprintf(stdout, "\n"); \ +} + +#define NET_START_ARRAY(name, fmt_str) \ +{ \ + if (json_output) { \ + jsonw_name(json_wtr, name); \ + jsonw_start_array(json_wtr); \ + } else { \ + fprintf(stdout, fmt_str, name); \ + } \ +} + +#define NET_END_ARRAY(endstr) \ +{ \ + if (json_output) \ + jsonw_end_array(json_wtr); \ + else \ + fprintf(stdout, "%s", endstr); \ +} + +#define NET_DUMP_UINT(name, fmt_str, val) \ +{ \ + if (json_output) \ + jsonw_uint_field(json_wtr, name, val); \ + else \ + fprintf(stdout, fmt_str, val); \ +} + +#define NET_DUMP_STR(name, fmt_str, str) \ +{ \ + if (json_output) \ + jsonw_string_field(json_wtr, name, str);\ + else \ + fprintf(stdout, fmt_str, str); \ +} + +#define NET_DUMP_STR_ONLY(str) \ +{ \ + if (json_output) \ + jsonw_string(json_wtr, str); \ + else \ + fprintf(stdout, "%s ", str); \ +} + +#endif diff --git a/bpftool/src/perf.c b/bpftool/src/perf.c new file mode 100644 index 0000000..9174344 --- /dev/null +++ b/bpftool/src/perf.c @@ -0,0 +1,258 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +// Copyright (C) 2018 Facebook +// Author: Yonghong Song + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "main.h" + +/* 0: undecided, 1: supported, 2: not supported */ +static int perf_query_supported; +static bool has_perf_query_support(void) +{ + __u64 probe_offset, probe_addr; + __u32 len, prog_id, fd_type; + char buf[256]; + int fd; + + if (perf_query_supported) + goto out; + + fd = open("/", O_RDONLY); + if (fd < 0) { + p_err("perf_query_support: cannot open directory \"/\" (%s)", + strerror(errno)); + goto out; + } + + /* the following query will fail as no bpf attachment, + * the expected errno is ENOTSUPP + */ + errno = 0; + len = sizeof(buf); + bpf_task_fd_query(getpid(), fd, 0, buf, &len, &prog_id, + &fd_type, &probe_offset, &probe_addr); + + if (errno == 524 /* ENOTSUPP */) { + perf_query_supported = 1; + goto close_fd; + } + + perf_query_supported = 2; + p_err("perf_query_support: %s", strerror(errno)); + fprintf(stderr, + "HINT: non root or kernel doesn't support TASK_FD_QUERY\n"); + +close_fd: + close(fd); +out: + return perf_query_supported == 1; +} + +static void print_perf_json(int pid, int fd, __u32 prog_id, __u32 fd_type, + char *buf, __u64 probe_offset, __u64 probe_addr) +{ + jsonw_start_object(json_wtr); + jsonw_int_field(json_wtr, "pid", pid); + jsonw_int_field(json_wtr, "fd", fd); + jsonw_uint_field(json_wtr, "prog_id", prog_id); + switch (fd_type) { + case BPF_FD_TYPE_RAW_TRACEPOINT: + jsonw_string_field(json_wtr, "fd_type", "raw_tracepoint"); + jsonw_string_field(json_wtr, "tracepoint", buf); + break; + case BPF_FD_TYPE_TRACEPOINT: + jsonw_string_field(json_wtr, "fd_type", "tracepoint"); + jsonw_string_field(json_wtr, "tracepoint", buf); + break; + case BPF_FD_TYPE_KPROBE: + jsonw_string_field(json_wtr, "fd_type", "kprobe"); + if (buf[0] != '\0') { + jsonw_string_field(json_wtr, "func", buf); + jsonw_lluint_field(json_wtr, "offset", probe_offset); + } else { + jsonw_lluint_field(json_wtr, "addr", probe_addr); + } + break; + case BPF_FD_TYPE_KRETPROBE: + jsonw_string_field(json_wtr, "fd_type", "kretprobe"); + if (buf[0] != '\0') { + jsonw_string_field(json_wtr, "func", buf); + jsonw_lluint_field(json_wtr, "offset", probe_offset); + } else { + jsonw_lluint_field(json_wtr, "addr", probe_addr); + } + break; + case BPF_FD_TYPE_UPROBE: + jsonw_string_field(json_wtr, "fd_type", "uprobe"); + jsonw_string_field(json_wtr, "filename", buf); + jsonw_lluint_field(json_wtr, "offset", probe_offset); + break; + case BPF_FD_TYPE_URETPROBE: + jsonw_string_field(json_wtr, "fd_type", "uretprobe"); + jsonw_string_field(json_wtr, "filename", buf); + jsonw_lluint_field(json_wtr, "offset", probe_offset); + break; + default: + break; + } + jsonw_end_object(json_wtr); +} + +static void print_perf_plain(int pid, int fd, __u32 prog_id, __u32 fd_type, + char *buf, __u64 probe_offset, __u64 probe_addr) +{ + printf("pid %d fd %d: prog_id %u ", pid, fd, prog_id); + switch (fd_type) { + case BPF_FD_TYPE_RAW_TRACEPOINT: + printf("raw_tracepoint %s\n", buf); + break; + case BPF_FD_TYPE_TRACEPOINT: + printf("tracepoint %s\n", buf); + break; + case BPF_FD_TYPE_KPROBE: + if (buf[0] != '\0') + printf("kprobe func %s offset %llu\n", buf, + probe_offset); + else + printf("kprobe addr %llu\n", probe_addr); + break; + case BPF_FD_TYPE_KRETPROBE: + if (buf[0] != '\0') + printf("kretprobe func %s offset %llu\n", buf, + probe_offset); + else + printf("kretprobe addr %llu\n", probe_addr); + break; + case BPF_FD_TYPE_UPROBE: + printf("uprobe filename %s offset %llu\n", buf, probe_offset); + break; + case BPF_FD_TYPE_URETPROBE: + printf("uretprobe filename %s offset %llu\n", buf, + probe_offset); + break; + default: + break; + } +} + +static int show_proc(void) +{ + struct dirent *proc_de, *pid_fd_de; + __u64 probe_offset, probe_addr; + __u32 len, prog_id, fd_type; + DIR *proc, *pid_fd; + int err, pid, fd; + const char *pch; + char buf[4096]; + + proc = opendir("/proc"); + if (!proc) + return -1; + + while ((proc_de = readdir(proc))) { + pid = 0; + pch = proc_de->d_name; + + /* pid should be all numbers */ + while (isdigit(*pch)) { + pid = pid * 10 + *pch - '0'; + pch++; + } + if (*pch != '\0') + continue; + + err = snprintf(buf, sizeof(buf), "/proc/%s/fd", proc_de->d_name); + if (err < 0 || err >= (int)sizeof(buf)) + continue; + + pid_fd = opendir(buf); + if (!pid_fd) + continue; + + while ((pid_fd_de = readdir(pid_fd))) { + fd = 0; + pch = pid_fd_de->d_name; + + /* fd should be all numbers */ + while (isdigit(*pch)) { + fd = fd * 10 + *pch - '0'; + pch++; + } + if (*pch != '\0') + continue; + + /* query (pid, fd) for potential perf events */ + len = sizeof(buf); + err = bpf_task_fd_query(pid, fd, 0, buf, &len, + &prog_id, &fd_type, + &probe_offset, &probe_addr); + if (err < 0) + continue; + + if (json_output) + print_perf_json(pid, fd, prog_id, fd_type, buf, + probe_offset, probe_addr); + else + print_perf_plain(pid, fd, prog_id, fd_type, buf, + probe_offset, probe_addr); + } + closedir(pid_fd); + } + closedir(proc); + return 0; +} + +static int do_show(int argc, char **argv) +{ + int err; + + if (!has_perf_query_support()) + return -1; + + if (json_output) + jsonw_start_array(json_wtr); + err = show_proc(); + if (json_output) + jsonw_end_array(json_wtr); + + return err; +} + +static int do_help(int argc, char **argv) +{ + fprintf(stderr, + "Usage: %1$s %2$s { show | list }\n" + " %1$s %2$s help }\n" + "\n" + " " HELP_SPEC_OPTIONS " }\n" + "", + bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "show", do_show }, + { "list", do_show }, + { "help", do_help }, + { 0 } +}; + +int do_perf(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/pids.c b/bpftool/src/pids.c new file mode 100644 index 0000000..00c77ed --- /dev/null +++ b/bpftool/src/pids.c @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2020 Facebook */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "main.h" +#include "skeleton/pid_iter.h" + +#ifdef BPFTOOL_WITHOUT_SKELETONS + +int build_obj_refs_table(struct hashmap **map, enum bpf_obj_type type) +{ + return -ENOTSUP; +} +void delete_obj_refs_table(struct hashmap *map) {} +void emit_obj_refs_plain(struct hashmap *map, __u32 id, const char *prefix) {} +void emit_obj_refs_json(struct hashmap *map, __u32 id, json_writer_t *json_writer) {} + +#else /* BPFTOOL_WITHOUT_SKELETONS */ + +#include "pid_iter.skel.h" + +static void add_ref(struct hashmap *map, struct pid_iter_entry *e) +{ + struct hashmap_entry *entry; + struct obj_refs *refs; + struct obj_ref *ref; + int err, i; + void *tmp; + + hashmap__for_each_key_entry(map, entry, e->id) { + refs = entry->pvalue; + + for (i = 0; i < refs->ref_cnt; i++) { + if (refs->refs[i].pid == e->pid) + return; + } + + tmp = realloc(refs->refs, (refs->ref_cnt + 1) * sizeof(*ref)); + if (!tmp) { + p_err("failed to re-alloc memory for ID %u, PID %d, COMM %s...", + e->id, e->pid, e->comm); + return; + } + refs->refs = tmp; + ref = &refs->refs[refs->ref_cnt]; + ref->pid = e->pid; + memcpy(ref->comm, e->comm, sizeof(ref->comm)); + refs->ref_cnt++; + + return; + } + + /* new ref */ + refs = calloc(1, sizeof(*refs)); + if (!refs) { + p_err("failed to alloc memory for ID %u, PID %d, COMM %s...", + e->id, e->pid, e->comm); + return; + } + + refs->refs = malloc(sizeof(*refs->refs)); + if (!refs->refs) { + free(refs); + p_err("failed to alloc memory for ID %u, PID %d, COMM %s...", + e->id, e->pid, e->comm); + return; + } + ref = &refs->refs[0]; + ref->pid = e->pid; + memcpy(ref->comm, e->comm, sizeof(ref->comm)); + refs->ref_cnt = 1; + refs->has_bpf_cookie = e->has_bpf_cookie; + refs->bpf_cookie = e->bpf_cookie; + + err = hashmap__append(map, e->id, refs); + if (err) + p_err("failed to append entry to hashmap for ID %u: %s", + e->id, strerror(errno)); +} + +static int __printf(2, 0) +libbpf_print_none(__maybe_unused enum libbpf_print_level level, + __maybe_unused const char *format, + __maybe_unused va_list args) +{ + return 0; +} + +int build_obj_refs_table(struct hashmap **map, enum bpf_obj_type type) +{ + struct pid_iter_entry *e; + char buf[4096 / sizeof(*e) * sizeof(*e)]; + struct pid_iter_bpf *skel; + int err, ret, fd = -1, i; + libbpf_print_fn_t default_print; + + *map = hashmap__new(hash_fn_for_key_as_id, equal_fn_for_key_as_id, NULL); + if (IS_ERR(*map)) { + p_err("failed to create hashmap for PID references"); + return -1; + } + set_max_rlimit(); + + skel = pid_iter_bpf__open(); + if (!skel) { + p_err("failed to open PID iterator skeleton"); + return -1; + } + + skel->rodata->obj_type = type; + + /* we don't want output polluted with libbpf errors if bpf_iter is not + * supported + */ + default_print = libbpf_set_print(libbpf_print_none); + err = pid_iter_bpf__load(skel); + libbpf_set_print(default_print); + if (err) { + /* too bad, kernel doesn't support BPF iterators yet */ + err = 0; + goto out; + } + err = pid_iter_bpf__attach(skel); + if (err) { + /* if we loaded above successfully, attach has to succeed */ + p_err("failed to attach PID iterator: %d", err); + goto out; + } + + fd = bpf_iter_create(bpf_link__fd(skel->links.iter)); + if (fd < 0) { + err = -errno; + p_err("failed to create PID iterator session: %d", err); + goto out; + } + + while (true) { + ret = read(fd, buf, sizeof(buf)); + if (ret < 0) { + if (errno == EAGAIN) + continue; + err = -errno; + p_err("failed to read PID iterator output: %d", err); + goto out; + } + if (ret == 0) + break; + if (ret % sizeof(*e)) { + err = -EINVAL; + p_err("invalid PID iterator output format"); + goto out; + } + ret /= sizeof(*e); + + e = (void *)buf; + for (i = 0; i < ret; i++, e++) { + add_ref(*map, e); + } + } + err = 0; +out: + if (fd >= 0) + close(fd); + pid_iter_bpf__destroy(skel); + return err; +} + +void delete_obj_refs_table(struct hashmap *map) +{ + struct hashmap_entry *entry; + size_t bkt; + + if (!map) + return; + + hashmap__for_each_entry(map, entry, bkt) { + struct obj_refs *refs = entry->pvalue; + + free(refs->refs); + free(refs); + } + + hashmap__free(map); +} + +void emit_obj_refs_json(struct hashmap *map, __u32 id, + json_writer_t *json_writer) +{ + struct hashmap_entry *entry; + + if (hashmap__empty(map)) + return; + + hashmap__for_each_key_entry(map, entry, id) { + struct obj_refs *refs = entry->pvalue; + int i; + + if (refs->ref_cnt == 0) + break; + + if (refs->has_bpf_cookie) + jsonw_lluint_field(json_writer, "bpf_cookie", refs->bpf_cookie); + + jsonw_name(json_writer, "pids"); + jsonw_start_array(json_writer); + for (i = 0; i < refs->ref_cnt; i++) { + struct obj_ref *ref = &refs->refs[i]; + + jsonw_start_object(json_writer); + jsonw_int_field(json_writer, "pid", ref->pid); + jsonw_string_field(json_writer, "comm", ref->comm); + jsonw_end_object(json_writer); + } + jsonw_end_array(json_writer); + break; + } +} + +void emit_obj_refs_plain(struct hashmap *map, __u32 id, const char *prefix) +{ + struct hashmap_entry *entry; + + if (hashmap__empty(map)) + return; + + hashmap__for_each_key_entry(map, entry, id) { + struct obj_refs *refs = entry->pvalue; + int i; + + if (refs->ref_cnt == 0) + break; + + if (refs->has_bpf_cookie) + printf("\n\tbpf_cookie %llu", (unsigned long long) refs->bpf_cookie); + + printf("%s", prefix); + for (i = 0; i < refs->ref_cnt; i++) { + struct obj_ref *ref = &refs->refs[i]; + + printf("%s%s(%d)", i == 0 ? "" : ", ", ref->comm, ref->pid); + } + break; + } +} + + +#endif diff --git a/bpftool/src/prog.c b/bpftool/src/prog.c new file mode 100644 index 0000000..afbe3ec --- /dev/null +++ b/bpftool/src/prog.c @@ -0,0 +1,2487 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2017-2018 Netronome Systems, Inc. */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "cfg.h" +#include "main.h" +#include "xlated_dumper.h" + +#define BPF_METADATA_PREFIX "bpf_metadata_" +#define BPF_METADATA_PREFIX_LEN (sizeof(BPF_METADATA_PREFIX) - 1) + +enum dump_mode { + DUMP_JITED, + DUMP_XLATED, +}; + +static const bool attach_types[] = { + [BPF_SK_SKB_STREAM_PARSER] = true, + [BPF_SK_SKB_STREAM_VERDICT] = true, + [BPF_SK_SKB_VERDICT] = true, + [BPF_SK_MSG_VERDICT] = true, + [BPF_FLOW_DISSECTOR] = true, + [__MAX_BPF_ATTACH_TYPE] = false, +}; + +/* Textual representations traditionally used by the program and kept around + * for the sake of backwards compatibility. + */ +static const char * const attach_type_strings[] = { + [BPF_SK_SKB_STREAM_PARSER] = "stream_parser", + [BPF_SK_SKB_STREAM_VERDICT] = "stream_verdict", + [BPF_SK_SKB_VERDICT] = "skb_verdict", + [BPF_SK_MSG_VERDICT] = "msg_verdict", + [__MAX_BPF_ATTACH_TYPE] = NULL, +}; + +static struct hashmap *prog_table; + +static enum bpf_attach_type parse_attach_type(const char *str) +{ + enum bpf_attach_type type; + + for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { + if (attach_types[type]) { + const char *attach_type_str; + + attach_type_str = libbpf_bpf_attach_type_str(type); + if (!strcmp(str, attach_type_str)) + return type; + } + + if (attach_type_strings[type] && + is_prefix(str, attach_type_strings[type])) + return type; + } + + return __MAX_BPF_ATTACH_TYPE; +} + +static int prep_prog_info(struct bpf_prog_info *const info, enum dump_mode mode, + void **info_data, size_t *const info_data_sz) +{ + struct bpf_prog_info holder = {}; + size_t needed = 0; + void *ptr; + + if (mode == DUMP_JITED) { + holder.jited_prog_len = info->jited_prog_len; + needed += info->jited_prog_len; + } else { + holder.xlated_prog_len = info->xlated_prog_len; + needed += info->xlated_prog_len; + } + + holder.nr_jited_ksyms = info->nr_jited_ksyms; + needed += info->nr_jited_ksyms * sizeof(__u64); + + holder.nr_jited_func_lens = info->nr_jited_func_lens; + needed += info->nr_jited_func_lens * sizeof(__u32); + + holder.nr_func_info = info->nr_func_info; + holder.func_info_rec_size = info->func_info_rec_size; + needed += info->nr_func_info * info->func_info_rec_size; + + holder.nr_line_info = info->nr_line_info; + holder.line_info_rec_size = info->line_info_rec_size; + needed += info->nr_line_info * info->line_info_rec_size; + + holder.nr_jited_line_info = info->nr_jited_line_info; + holder.jited_line_info_rec_size = info->jited_line_info_rec_size; + needed += info->nr_jited_line_info * info->jited_line_info_rec_size; + + if (needed > *info_data_sz) { + ptr = realloc(*info_data, needed); + if (!ptr) + return -1; + + *info_data = ptr; + *info_data_sz = needed; + } + ptr = *info_data; + + if (mode == DUMP_JITED) { + holder.jited_prog_insns = ptr_to_u64(ptr); + ptr += holder.jited_prog_len; + } else { + holder.xlated_prog_insns = ptr_to_u64(ptr); + ptr += holder.xlated_prog_len; + } + + holder.jited_ksyms = ptr_to_u64(ptr); + ptr += holder.nr_jited_ksyms * sizeof(__u64); + + holder.jited_func_lens = ptr_to_u64(ptr); + ptr += holder.nr_jited_func_lens * sizeof(__u32); + + holder.func_info = ptr_to_u64(ptr); + ptr += holder.nr_func_info * holder.func_info_rec_size; + + holder.line_info = ptr_to_u64(ptr); + ptr += holder.nr_line_info * holder.line_info_rec_size; + + holder.jited_line_info = ptr_to_u64(ptr); + ptr += holder.nr_jited_line_info * holder.jited_line_info_rec_size; + + *info = holder; + return 0; +} + +static void print_boot_time(__u64 nsecs, char *buf, unsigned int size) +{ + struct timespec real_time_ts, boot_time_ts; + time_t wallclock_secs; + struct tm load_tm; + + buf[--size] = '\0'; + + if (clock_gettime(CLOCK_REALTIME, &real_time_ts) || + clock_gettime(CLOCK_BOOTTIME, &boot_time_ts)) { + perror("Can't read clocks"); + snprintf(buf, size, "%llu", nsecs / 1000000000); + return; + } + + wallclock_secs = (real_time_ts.tv_sec - boot_time_ts.tv_sec) + + (real_time_ts.tv_nsec - boot_time_ts.tv_nsec + nsecs) / + 1000000000; + + + if (!localtime_r(&wallclock_secs, &load_tm)) { + snprintf(buf, size, "%llu", nsecs / 1000000000); + return; + } + + if (json_output) + strftime(buf, size, "%s", &load_tm); + else + strftime(buf, size, "%FT%T%z", &load_tm); +} + +static void show_prog_maps(int fd, __u32 num_maps) +{ + struct bpf_prog_info info = {}; + __u32 len = sizeof(info); + __u32 map_ids[num_maps]; + unsigned int i; + int err; + + info.nr_map_ids = num_maps; + info.map_ids = ptr_to_u64(map_ids); + + err = bpf_prog_get_info_by_fd(fd, &info, &len); + if (err || !info.nr_map_ids) + return; + + if (json_output) { + jsonw_name(json_wtr, "map_ids"); + jsonw_start_array(json_wtr); + for (i = 0; i < info.nr_map_ids; i++) + jsonw_uint(json_wtr, map_ids[i]); + jsonw_end_array(json_wtr); + } else { + printf(" map_ids "); + for (i = 0; i < info.nr_map_ids; i++) + printf("%u%s", map_ids[i], + i == info.nr_map_ids - 1 ? "" : ","); + } +} + +static void *find_metadata(int prog_fd, struct bpf_map_info *map_info) +{ + struct bpf_prog_info prog_info; + __u32 prog_info_len; + __u32 map_info_len; + void *value = NULL; + __u32 *map_ids; + int nr_maps; + int key = 0; + int map_fd; + int ret; + __u32 i; + + memset(&prog_info, 0, sizeof(prog_info)); + prog_info_len = sizeof(prog_info); + ret = bpf_prog_get_info_by_fd(prog_fd, &prog_info, &prog_info_len); + if (ret) + return NULL; + + if (!prog_info.nr_map_ids) + return NULL; + + map_ids = calloc(prog_info.nr_map_ids, sizeof(__u32)); + if (!map_ids) + return NULL; + + nr_maps = prog_info.nr_map_ids; + memset(&prog_info, 0, sizeof(prog_info)); + prog_info.nr_map_ids = nr_maps; + prog_info.map_ids = ptr_to_u64(map_ids); + prog_info_len = sizeof(prog_info); + + ret = bpf_prog_get_info_by_fd(prog_fd, &prog_info, &prog_info_len); + if (ret) + goto free_map_ids; + + for (i = 0; i < prog_info.nr_map_ids; i++) { + map_fd = bpf_map_get_fd_by_id(map_ids[i]); + if (map_fd < 0) + goto free_map_ids; + + memset(map_info, 0, sizeof(*map_info)); + map_info_len = sizeof(*map_info); + ret = bpf_map_get_info_by_fd(map_fd, map_info, &map_info_len); + if (ret < 0) { + close(map_fd); + goto free_map_ids; + } + + if (map_info->type != BPF_MAP_TYPE_ARRAY || + map_info->key_size != sizeof(int) || + map_info->max_entries != 1 || + !map_info->btf_value_type_id || + !strstr(map_info->name, ".rodata")) { + close(map_fd); + continue; + } + + value = malloc(map_info->value_size); + if (!value) { + close(map_fd); + goto free_map_ids; + } + + if (bpf_map_lookup_elem(map_fd, &key, value)) { + close(map_fd); + free(value); + value = NULL; + goto free_map_ids; + } + + close(map_fd); + break; + } + +free_map_ids: + free(map_ids); + return value; +} + +static bool has_metadata_prefix(const char *s) +{ + return strncmp(s, BPF_METADATA_PREFIX, BPF_METADATA_PREFIX_LEN) == 0; +} + +static void show_prog_metadata(int fd, __u32 num_maps) +{ + const struct btf_type *t_datasec, *t_var; + struct bpf_map_info map_info; + struct btf_var_secinfo *vsi; + bool printed_header = false; + unsigned int i, vlen; + void *value = NULL; + const char *name; + struct btf *btf; + int err; + + if (!num_maps) + return; + + memset(&map_info, 0, sizeof(map_info)); + value = find_metadata(fd, &map_info); + if (!value) + return; + + btf = btf__load_from_kernel_by_id(map_info.btf_id); + if (!btf) + goto out_free; + + t_datasec = btf__type_by_id(btf, map_info.btf_value_type_id); + if (!btf_is_datasec(t_datasec)) + goto out_free; + + vlen = btf_vlen(t_datasec); + vsi = btf_var_secinfos(t_datasec); + + /* We don't proceed to check the kinds of the elements of the DATASEC. + * The verifier enforces them to be BTF_KIND_VAR. + */ + + if (json_output) { + struct btf_dumper d = { + .btf = btf, + .jw = json_wtr, + .is_plain_text = false, + }; + + for (i = 0; i < vlen; i++, vsi++) { + t_var = btf__type_by_id(btf, vsi->type); + name = btf__name_by_offset(btf, t_var->name_off); + + if (!has_metadata_prefix(name)) + continue; + + if (!printed_header) { + jsonw_name(json_wtr, "metadata"); + jsonw_start_object(json_wtr); + printed_header = true; + } + + jsonw_name(json_wtr, name + BPF_METADATA_PREFIX_LEN); + err = btf_dumper_type(&d, t_var->type, value + vsi->offset); + if (err) { + p_err("btf dump failed: %d", err); + break; + } + } + if (printed_header) + jsonw_end_object(json_wtr); + } else { + json_writer_t *btf_wtr; + struct btf_dumper d = { + .btf = btf, + .is_plain_text = true, + }; + + for (i = 0; i < vlen; i++, vsi++) { + t_var = btf__type_by_id(btf, vsi->type); + name = btf__name_by_offset(btf, t_var->name_off); + + if (!has_metadata_prefix(name)) + continue; + + if (!printed_header) { + printf("\tmetadata:"); + + btf_wtr = jsonw_new(stdout); + if (!btf_wtr) { + p_err("jsonw alloc failed"); + goto out_free; + } + d.jw = btf_wtr, + + printed_header = true; + } + + printf("\n\t\t%s = ", name + BPF_METADATA_PREFIX_LEN); + + jsonw_reset(btf_wtr); + err = btf_dumper_type(&d, t_var->type, value + vsi->offset); + if (err) { + p_err("btf dump failed: %d", err); + break; + } + } + if (printed_header) + jsonw_destroy(&btf_wtr); + } + +out_free: + btf__free(btf); + free(value); +} + +static void print_prog_header_json(struct bpf_prog_info *info, int fd) +{ + const char *prog_type_str; + char prog_name[MAX_PROG_FULL_NAME]; + + jsonw_uint_field(json_wtr, "id", info->id); + prog_type_str = libbpf_bpf_prog_type_str(info->type); + + if (prog_type_str) + jsonw_string_field(json_wtr, "type", prog_type_str); + else + jsonw_uint_field(json_wtr, "type", info->type); + + if (*info->name) { + get_prog_full_name(info, fd, prog_name, sizeof(prog_name)); + jsonw_string_field(json_wtr, "name", prog_name); + } + + jsonw_name(json_wtr, "tag"); + jsonw_printf(json_wtr, "\"" BPF_TAG_FMT "\"", + info->tag[0], info->tag[1], info->tag[2], info->tag[3], + info->tag[4], info->tag[5], info->tag[6], info->tag[7]); + + jsonw_bool_field(json_wtr, "gpl_compatible", info->gpl_compatible); + if (info->run_time_ns) { + jsonw_uint_field(json_wtr, "run_time_ns", info->run_time_ns); + jsonw_uint_field(json_wtr, "run_cnt", info->run_cnt); + } + if (info->recursion_misses) + jsonw_uint_field(json_wtr, "recursion_misses", info->recursion_misses); +} + +static void print_prog_json(struct bpf_prog_info *info, int fd) +{ + char *memlock; + + jsonw_start_object(json_wtr); + print_prog_header_json(info, fd); + print_dev_json(info->ifindex, info->netns_dev, info->netns_ino); + + if (info->load_time) { + char buf[32]; + + print_boot_time(info->load_time, buf, sizeof(buf)); + + /* Piggy back on load_time, since 0 uid is a valid one */ + jsonw_name(json_wtr, "loaded_at"); + jsonw_printf(json_wtr, "%s", buf); + jsonw_uint_field(json_wtr, "uid", info->created_by_uid); + } + + jsonw_uint_field(json_wtr, "bytes_xlated", info->xlated_prog_len); + + if (info->jited_prog_len) { + jsonw_bool_field(json_wtr, "jited", true); + jsonw_uint_field(json_wtr, "bytes_jited", info->jited_prog_len); + } else { + jsonw_bool_field(json_wtr, "jited", false); + } + + memlock = get_fdinfo(fd, "memlock"); + if (memlock) + jsonw_int_field(json_wtr, "bytes_memlock", atoll(memlock)); + free(memlock); + + if (info->nr_map_ids) + show_prog_maps(fd, info->nr_map_ids); + + if (info->btf_id) + jsonw_int_field(json_wtr, "btf_id", info->btf_id); + + if (!hashmap__empty(prog_table)) { + struct hashmap_entry *entry; + + jsonw_name(json_wtr, "pinned"); + jsonw_start_array(json_wtr); + hashmap__for_each_key_entry(prog_table, entry, info->id) + jsonw_string(json_wtr, entry->pvalue); + jsonw_end_array(json_wtr); + } + + emit_obj_refs_json(refs_table, info->id, json_wtr); + + show_prog_metadata(fd, info->nr_map_ids); + + jsonw_end_object(json_wtr); +} + +static void print_prog_header_plain(struct bpf_prog_info *info, int fd) +{ + const char *prog_type_str; + char prog_name[MAX_PROG_FULL_NAME]; + + printf("%u: ", info->id); + prog_type_str = libbpf_bpf_prog_type_str(info->type); + if (prog_type_str) + printf("%s ", prog_type_str); + else + printf("type %u ", info->type); + + if (*info->name) { + get_prog_full_name(info, fd, prog_name, sizeof(prog_name)); + printf("name %s ", prog_name); + } + + printf("tag "); + fprint_hex(stdout, info->tag, BPF_TAG_SIZE, ""); + print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino); + printf("%s", info->gpl_compatible ? " gpl" : ""); + if (info->run_time_ns) + printf(" run_time_ns %lld run_cnt %lld", + info->run_time_ns, info->run_cnt); + if (info->recursion_misses) + printf(" recursion_misses %lld", info->recursion_misses); + printf("\n"); +} + +static void print_prog_plain(struct bpf_prog_info *info, int fd) +{ + char *memlock; + + print_prog_header_plain(info, fd); + + if (info->load_time) { + char buf[32]; + + print_boot_time(info->load_time, buf, sizeof(buf)); + + /* Piggy back on load_time, since 0 uid is a valid one */ + printf("\tloaded_at %s uid %u\n", buf, info->created_by_uid); + } + + printf("\txlated %uB", info->xlated_prog_len); + + if (info->jited_prog_len) + printf(" jited %uB", info->jited_prog_len); + else + printf(" not jited"); + + memlock = get_fdinfo(fd, "memlock"); + if (memlock) + printf(" memlock %sB", memlock); + free(memlock); + + if (info->nr_map_ids) + show_prog_maps(fd, info->nr_map_ids); + + if (!hashmap__empty(prog_table)) { + struct hashmap_entry *entry; + + hashmap__for_each_key_entry(prog_table, entry, info->id) + printf("\n\tpinned %s", (char *)entry->pvalue); + } + + if (info->btf_id) + printf("\n\tbtf_id %d", info->btf_id); + + emit_obj_refs_plain(refs_table, info->id, "\n\tpids "); + + printf("\n"); + + show_prog_metadata(fd, info->nr_map_ids); +} + +static int show_prog(int fd) +{ + struct bpf_prog_info info = {}; + __u32 len = sizeof(info); + int err; + + err = bpf_prog_get_info_by_fd(fd, &info, &len); + if (err) { + p_err("can't get prog info: %s", strerror(errno)); + return -1; + } + + if (json_output) + print_prog_json(&info, fd); + else + print_prog_plain(&info, fd); + + return 0; +} + +static int do_show_subset(int argc, char **argv) +{ + int *fds = NULL; + int nb_fds, i; + int err = -1; + + fds = malloc(sizeof(int)); + if (!fds) { + p_err("mem alloc failed"); + return -1; + } + nb_fds = prog_parse_fds(&argc, &argv, &fds); + if (nb_fds < 1) + goto exit_free; + + if (json_output && nb_fds > 1) + jsonw_start_array(json_wtr); /* root array */ + for (i = 0; i < nb_fds; i++) { + err = show_prog(fds[i]); + if (err) { + for (; i < nb_fds; i++) + close(fds[i]); + break; + } + close(fds[i]); + } + if (json_output && nb_fds > 1) + jsonw_end_array(json_wtr); /* root array */ + +exit_free: + free(fds); + return err; +} + +static int do_show(int argc, char **argv) +{ + __u32 id = 0; + int err; + int fd; + + if (show_pinned) { + prog_table = hashmap__new(hash_fn_for_key_as_id, + equal_fn_for_key_as_id, NULL); + if (IS_ERR(prog_table)) { + p_err("failed to create hashmap for pinned paths"); + return -1; + } + build_pinned_obj_table(prog_table, BPF_OBJ_PROG); + } + build_obj_refs_table(&refs_table, BPF_OBJ_PROG); + + if (argc == 2) + return do_show_subset(argc, argv); + + if (argc) + return BAD_ARG(); + + if (json_output) + jsonw_start_array(json_wtr); + while (true) { + err = bpf_prog_get_next_id(id, &id); + if (err) { + if (errno == ENOENT) { + err = 0; + break; + } + p_err("can't get next program: %s%s", strerror(errno), + errno == EINVAL ? " -- kernel too old?" : ""); + err = -1; + break; + } + + fd = bpf_prog_get_fd_by_id(id); + if (fd < 0) { + if (errno == ENOENT) + continue; + p_err("can't get prog by id (%u): %s", + id, strerror(errno)); + err = -1; + break; + } + + err = show_prog(fd); + close(fd); + if (err) + break; + } + + if (json_output) + jsonw_end_array(json_wtr); + + delete_obj_refs_table(refs_table); + + if (show_pinned) + delete_pinned_obj_table(prog_table); + + return err; +} + +static int +prog_dump(struct bpf_prog_info *info, enum dump_mode mode, + char *filepath, bool opcodes, bool visual, bool linum) +{ + struct bpf_prog_linfo *prog_linfo = NULL; + const char *disasm_opt = NULL; + struct dump_data dd = {}; + void *func_info = NULL; + struct btf *btf = NULL; + char func_sig[1024]; + unsigned char *buf; + __u32 member_len; + int fd, err = -1; + ssize_t n; + + if (mode == DUMP_JITED) { + if (info->jited_prog_len == 0 || !info->jited_prog_insns) { + p_info("no instructions returned"); + return -1; + } + buf = u64_to_ptr(info->jited_prog_insns); + member_len = info->jited_prog_len; + } else { /* DUMP_XLATED */ + if (info->xlated_prog_len == 0 || !info->xlated_prog_insns) { + p_err("error retrieving insn dump: kernel.kptr_restrict set?"); + return -1; + } + buf = u64_to_ptr(info->xlated_prog_insns); + member_len = info->xlated_prog_len; + } + + if (info->btf_id) { + btf = btf__load_from_kernel_by_id(info->btf_id); + if (!btf) { + p_err("failed to get btf"); + return -1; + } + } + + func_info = u64_to_ptr(info->func_info); + + if (info->nr_line_info) { + prog_linfo = bpf_prog_linfo__new(info); + if (!prog_linfo) + p_info("error in processing bpf_line_info. continue without it."); + } + + if (filepath) { + fd = open(filepath, O_WRONLY | O_CREAT | O_TRUNC, 0600); + if (fd < 0) { + p_err("can't open file %s: %s", filepath, + strerror(errno)); + goto exit_free; + } + + n = write(fd, buf, member_len); + close(fd); + if (n != (ssize_t)member_len) { + p_err("error writing output file: %s", + n < 0 ? strerror(errno) : "short write"); + goto exit_free; + } + + if (json_output) + jsonw_null(json_wtr); + } else if (mode == DUMP_JITED) { + const char *name = NULL; + + if (info->ifindex) { + name = ifindex_to_arch(info->ifindex, info->netns_dev, + info->netns_ino, &disasm_opt); + if (!name) + goto exit_free; + } + + if (info->nr_jited_func_lens && info->jited_func_lens) { + struct kernel_sym *sym = NULL; + struct bpf_func_info *record; + char sym_name[SYM_MAX_NAME]; + unsigned char *img = buf; + __u64 *ksyms = NULL; + __u32 *lens; + __u32 i; + if (info->nr_jited_ksyms) { + kernel_syms_load(&dd); + ksyms = u64_to_ptr(info->jited_ksyms); + } + + if (json_output) + jsonw_start_array(json_wtr); + + lens = u64_to_ptr(info->jited_func_lens); + for (i = 0; i < info->nr_jited_func_lens; i++) { + if (ksyms) { + sym = kernel_syms_search(&dd, ksyms[i]); + if (sym) + sprintf(sym_name, "%s", sym->name); + else + sprintf(sym_name, "0x%016llx", ksyms[i]); + } else { + strcpy(sym_name, "unknown"); + } + + if (func_info) { + record = func_info + i * info->func_info_rec_size; + btf_dumper_type_only(btf, record->type_id, + func_sig, + sizeof(func_sig)); + } + + if (json_output) { + jsonw_start_object(json_wtr); + if (func_info && func_sig[0] != '\0') { + jsonw_name(json_wtr, "proto"); + jsonw_string(json_wtr, func_sig); + } + jsonw_name(json_wtr, "name"); + jsonw_string(json_wtr, sym_name); + jsonw_name(json_wtr, "insns"); + } else { + if (func_info && func_sig[0] != '\0') + printf("%s:\n", func_sig); + printf("%s:\n", sym_name); + } + + if (disasm_print_insn(img, lens[i], opcodes, + name, disasm_opt, btf, + prog_linfo, ksyms[i], i, + linum)) + goto exit_free; + + img += lens[i]; + + if (json_output) + jsonw_end_object(json_wtr); + else + printf("\n"); + } + + if (json_output) + jsonw_end_array(json_wtr); + } else { + if (disasm_print_insn(buf, member_len, opcodes, name, + disasm_opt, btf, NULL, 0, 0, + false)) + goto exit_free; + } + } else if (visual) { + if (json_output) + jsonw_null(json_wtr); + else + dump_xlated_cfg(buf, member_len); + } else { + kernel_syms_load(&dd); + dd.nr_jited_ksyms = info->nr_jited_ksyms; + dd.jited_ksyms = u64_to_ptr(info->jited_ksyms); + dd.btf = btf; + dd.func_info = func_info; + dd.finfo_rec_size = info->func_info_rec_size; + dd.prog_linfo = prog_linfo; + + if (json_output) + dump_xlated_json(&dd, buf, member_len, opcodes, + linum); + else + dump_xlated_plain(&dd, buf, member_len, opcodes, + linum); + kernel_syms_destroy(&dd); + } + + err = 0; + +exit_free: + btf__free(btf); + bpf_prog_linfo__free(prog_linfo); + return err; +} + +static int do_dump(int argc, char **argv) +{ + struct bpf_prog_info info; + __u32 info_len = sizeof(info); + size_t info_data_sz = 0; + void *info_data = NULL; + char *filepath = NULL; + bool opcodes = false; + bool visual = false; + enum dump_mode mode; + bool linum = false; + int nb_fds, i = 0; + int *fds = NULL; + int err = -1; + + if (is_prefix(*argv, "jited")) { + if (disasm_init()) + return -1; + mode = DUMP_JITED; + } else if (is_prefix(*argv, "xlated")) { + mode = DUMP_XLATED; + } else { + p_err("expected 'xlated' or 'jited', got: %s", *argv); + return -1; + } + NEXT_ARG(); + + if (argc < 2) + usage(); + + fds = malloc(sizeof(int)); + if (!fds) { + p_err("mem alloc failed"); + return -1; + } + nb_fds = prog_parse_fds(&argc, &argv, &fds); + if (nb_fds < 1) + goto exit_free; + + if (is_prefix(*argv, "file")) { + NEXT_ARG(); + if (!argc) { + p_err("expected file path"); + goto exit_close; + } + if (nb_fds > 1) { + p_err("several programs matched"); + goto exit_close; + } + + filepath = *argv; + NEXT_ARG(); + } else if (is_prefix(*argv, "opcodes")) { + opcodes = true; + NEXT_ARG(); + } else if (is_prefix(*argv, "visual")) { + if (nb_fds > 1) { + p_err("several programs matched"); + goto exit_close; + } + + visual = true; + NEXT_ARG(); + } else if (is_prefix(*argv, "linum")) { + linum = true; + NEXT_ARG(); + } + + if (argc) { + usage(); + goto exit_close; + } + + if (json_output && nb_fds > 1) + jsonw_start_array(json_wtr); /* root array */ + for (i = 0; i < nb_fds; i++) { + memset(&info, 0, sizeof(info)); + + err = bpf_prog_get_info_by_fd(fds[i], &info, &info_len); + if (err) { + p_err("can't get prog info: %s", strerror(errno)); + break; + } + + err = prep_prog_info(&info, mode, &info_data, &info_data_sz); + if (err) { + p_err("can't grow prog info_data"); + break; + } + + err = bpf_prog_get_info_by_fd(fds[i], &info, &info_len); + if (err) { + p_err("can't get prog info: %s", strerror(errno)); + break; + } + + if (json_output && nb_fds > 1) { + jsonw_start_object(json_wtr); /* prog object */ + print_prog_header_json(&info, fds[i]); + jsonw_name(json_wtr, "insns"); + } else if (nb_fds > 1) { + print_prog_header_plain(&info, fds[i]); + } + + err = prog_dump(&info, mode, filepath, opcodes, visual, linum); + + if (json_output && nb_fds > 1) + jsonw_end_object(json_wtr); /* prog object */ + else if (i != nb_fds - 1 && nb_fds > 1) + printf("\n"); + + if (err) + break; + close(fds[i]); + } + if (json_output && nb_fds > 1) + jsonw_end_array(json_wtr); /* root array */ + +exit_close: + for (; i < nb_fds; i++) + close(fds[i]); +exit_free: + free(info_data); + free(fds); + return err; +} + +static int do_pin(int argc, char **argv) +{ + int err; + + err = do_pin_any(argc, argv, prog_parse_fd); + if (!err && json_output) + jsonw_null(json_wtr); + return err; +} + +struct map_replace { + int idx; + int fd; + char *name; +}; + +static int map_replace_compar(const void *p1, const void *p2) +{ + const struct map_replace *a = p1, *b = p2; + + return a->idx - b->idx; +} + +static int parse_attach_detach_args(int argc, char **argv, int *progfd, + enum bpf_attach_type *attach_type, + int *mapfd) +{ + if (!REQ_ARGS(3)) + return -EINVAL; + + *progfd = prog_parse_fd(&argc, &argv); + if (*progfd < 0) + return *progfd; + + *attach_type = parse_attach_type(*argv); + if (*attach_type == __MAX_BPF_ATTACH_TYPE) { + p_err("invalid attach/detach type"); + return -EINVAL; + } + + if (*attach_type == BPF_FLOW_DISSECTOR) { + *mapfd = 0; + return 0; + } + + NEXT_ARG(); + if (!REQ_ARGS(2)) + return -EINVAL; + + *mapfd = map_parse_fd(&argc, &argv); + if (*mapfd < 0) + return *mapfd; + + return 0; +} + +static int do_attach(int argc, char **argv) +{ + enum bpf_attach_type attach_type; + int err, progfd; + int mapfd; + + err = parse_attach_detach_args(argc, argv, + &progfd, &attach_type, &mapfd); + if (err) + return err; + + err = bpf_prog_attach(progfd, mapfd, attach_type, 0); + if (err) { + p_err("failed prog attach to map"); + return -EINVAL; + } + + if (json_output) + jsonw_null(json_wtr); + return 0; +} + +static int do_detach(int argc, char **argv) +{ + enum bpf_attach_type attach_type; + int err, progfd; + int mapfd; + + err = parse_attach_detach_args(argc, argv, + &progfd, &attach_type, &mapfd); + if (err) + return err; + + err = bpf_prog_detach2(progfd, mapfd, attach_type); + if (err) { + p_err("failed prog detach from map"); + return -EINVAL; + } + + if (json_output) + jsonw_null(json_wtr); + return 0; +} + +static int check_single_stdin(char *file_data_in, char *file_ctx_in) +{ + if (file_data_in && file_ctx_in && + !strcmp(file_data_in, "-") && !strcmp(file_ctx_in, "-")) { + p_err("cannot use standard input for both data_in and ctx_in"); + return -1; + } + + return 0; +} + +static int get_run_data(const char *fname, void **data_ptr, unsigned int *size) +{ + size_t block_size = 256; + size_t buf_size = block_size; + size_t nb_read = 0; + void *tmp; + FILE *f; + + if (!fname) { + *data_ptr = NULL; + *size = 0; + return 0; + } + + if (!strcmp(fname, "-")) + f = stdin; + else + f = fopen(fname, "r"); + if (!f) { + p_err("failed to open %s: %s", fname, strerror(errno)); + return -1; + } + + *data_ptr = malloc(block_size); + if (!*data_ptr) { + p_err("failed to allocate memory for data_in/ctx_in: %s", + strerror(errno)); + goto err_fclose; + } + + while ((nb_read += fread(*data_ptr + nb_read, 1, block_size, f))) { + if (feof(f)) + break; + if (ferror(f)) { + p_err("failed to read data_in/ctx_in from %s: %s", + fname, strerror(errno)); + goto err_free; + } + if (nb_read > buf_size - block_size) { + if (buf_size == UINT32_MAX) { + p_err("data_in/ctx_in is too long (max: %d)", + UINT32_MAX); + goto err_free; + } + /* No space for fread()-ing next chunk; realloc() */ + buf_size *= 2; + tmp = realloc(*data_ptr, buf_size); + if (!tmp) { + p_err("failed to reallocate data_in/ctx_in: %s", + strerror(errno)); + goto err_free; + } + *data_ptr = tmp; + } + } + if (f != stdin) + fclose(f); + + *size = nb_read; + return 0; + +err_free: + free(*data_ptr); + *data_ptr = NULL; +err_fclose: + if (f != stdin) + fclose(f); + return -1; +} + +static void hex_print(void *data, unsigned int size, FILE *f) +{ + size_t i, j; + char c; + + for (i = 0; i < size; i += 16) { + /* Row offset */ + fprintf(f, "%07zx\t", i); + + /* Hexadecimal values */ + for (j = i; j < i + 16 && j < size; j++) + fprintf(f, "%02x%s", *(uint8_t *)(data + j), + j % 2 ? " " : ""); + for (; j < i + 16; j++) + fprintf(f, " %s", j % 2 ? " " : ""); + + /* ASCII values (if relevant), '.' otherwise */ + fprintf(f, "| "); + for (j = i; j < i + 16 && j < size; j++) { + c = *(char *)(data + j); + if (c < ' ' || c > '~') + c = '.'; + fprintf(f, "%c%s", c, j == i + 7 ? " " : ""); + } + + fprintf(f, "\n"); + } +} + +static int +print_run_output(void *data, unsigned int size, const char *fname, + const char *json_key) +{ + size_t nb_written; + FILE *f; + + if (!fname) + return 0; + + if (!strcmp(fname, "-")) { + f = stdout; + if (json_output) { + jsonw_name(json_wtr, json_key); + print_data_json(data, size); + } else { + hex_print(data, size, f); + } + return 0; + } + + f = fopen(fname, "w"); + if (!f) { + p_err("failed to open %s: %s", fname, strerror(errno)); + return -1; + } + + nb_written = fwrite(data, 1, size, f); + fclose(f); + if (nb_written != size) { + p_err("failed to write output data/ctx: %s", strerror(errno)); + return -1; + } + + return 0; +} + +static int alloc_run_data(void **data_ptr, unsigned int size_out) +{ + *data_ptr = calloc(size_out, 1); + if (!*data_ptr) { + p_err("failed to allocate memory for output data/ctx: %s", + strerror(errno)); + return -1; + } + + return 0; +} + +static int do_run(int argc, char **argv) +{ + char *data_fname_in = NULL, *data_fname_out = NULL; + char *ctx_fname_in = NULL, *ctx_fname_out = NULL; + const unsigned int default_size = SZ_32K; + void *data_in = NULL, *data_out = NULL; + void *ctx_in = NULL, *ctx_out = NULL; + unsigned int repeat = 1; + int fd, err; + LIBBPF_OPTS(bpf_test_run_opts, test_attr); + + if (!REQ_ARGS(4)) + return -1; + + fd = prog_parse_fd(&argc, &argv); + if (fd < 0) + return -1; + + while (argc) { + if (detect_common_prefix(*argv, "data_in", "data_out", + "data_size_out", NULL)) + return -1; + if (detect_common_prefix(*argv, "ctx_in", "ctx_out", + "ctx_size_out", NULL)) + return -1; + + if (is_prefix(*argv, "data_in")) { + NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; + + data_fname_in = GET_ARG(); + if (check_single_stdin(data_fname_in, ctx_fname_in)) + return -1; + } else if (is_prefix(*argv, "data_out")) { + NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; + + data_fname_out = GET_ARG(); + } else if (is_prefix(*argv, "data_size_out")) { + char *endptr; + + NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; + + test_attr.data_size_out = strtoul(*argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as output data size", + *argv); + return -1; + } + NEXT_ARG(); + } else if (is_prefix(*argv, "ctx_in")) { + NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; + + ctx_fname_in = GET_ARG(); + if (check_single_stdin(data_fname_in, ctx_fname_in)) + return -1; + } else if (is_prefix(*argv, "ctx_out")) { + NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; + + ctx_fname_out = GET_ARG(); + } else if (is_prefix(*argv, "ctx_size_out")) { + char *endptr; + + NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; + + test_attr.ctx_size_out = strtoul(*argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as output context size", + *argv); + return -1; + } + NEXT_ARG(); + } else if (is_prefix(*argv, "repeat")) { + char *endptr; + + NEXT_ARG(); + if (!REQ_ARGS(1)) + return -1; + + repeat = strtoul(*argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as repeat number", + *argv); + return -1; + } + NEXT_ARG(); + } else { + p_err("expected no more arguments, 'data_in', 'data_out', 'data_size_out', 'ctx_in', 'ctx_out', 'ctx_size_out' or 'repeat', got: '%s'?", + *argv); + return -1; + } + } + + err = get_run_data(data_fname_in, &data_in, &test_attr.data_size_in); + if (err) + return -1; + + if (data_in) { + if (!test_attr.data_size_out) + test_attr.data_size_out = default_size; + err = alloc_run_data(&data_out, test_attr.data_size_out); + if (err) + goto free_data_in; + } + + err = get_run_data(ctx_fname_in, &ctx_in, &test_attr.ctx_size_in); + if (err) + goto free_data_out; + + if (ctx_in) { + if (!test_attr.ctx_size_out) + test_attr.ctx_size_out = default_size; + err = alloc_run_data(&ctx_out, test_attr.ctx_size_out); + if (err) + goto free_ctx_in; + } + + test_attr.repeat = repeat; + test_attr.data_in = data_in; + test_attr.data_out = data_out; + test_attr.ctx_in = ctx_in; + test_attr.ctx_out = ctx_out; + + err = bpf_prog_test_run_opts(fd, &test_attr); + if (err) { + p_err("failed to run program: %s", strerror(errno)); + goto free_ctx_out; + } + + err = 0; + + if (json_output) + jsonw_start_object(json_wtr); /* root */ + + /* Do not exit on errors occurring when printing output data/context, + * we still want to print return value and duration for program run. + */ + if (test_attr.data_size_out) + err += print_run_output(test_attr.data_out, + test_attr.data_size_out, + data_fname_out, "data_out"); + if (test_attr.ctx_size_out) + err += print_run_output(test_attr.ctx_out, + test_attr.ctx_size_out, + ctx_fname_out, "ctx_out"); + + if (json_output) { + jsonw_uint_field(json_wtr, "retval", test_attr.retval); + jsonw_uint_field(json_wtr, "duration", test_attr.duration); + jsonw_end_object(json_wtr); /* root */ + } else { + fprintf(stdout, "Return value: %u, duration%s: %uns\n", + test_attr.retval, + repeat > 1 ? " (average)" : "", test_attr.duration); + } + +free_ctx_out: + free(ctx_out); +free_ctx_in: + free(ctx_in); +free_data_out: + free(data_out); +free_data_in: + free(data_in); + + return err; +} + +static int +get_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, + enum bpf_attach_type *expected_attach_type) +{ + libbpf_print_fn_t print_backup; + int ret; + + ret = libbpf_prog_type_by_name(name, prog_type, expected_attach_type); + if (!ret) + return ret; + + /* libbpf_prog_type_by_name() failed, let's re-run with debug level */ + print_backup = libbpf_set_print(print_all_levels); + ret = libbpf_prog_type_by_name(name, prog_type, expected_attach_type); + libbpf_set_print(print_backup); + + return ret; +} + +static int +auto_attach_program(struct bpf_program *prog, const char *path) +{ + struct bpf_link *link; + int err; + + link = bpf_program__attach(prog); + if (!link) { + p_info("Program %s does not support autoattach, falling back to pinning", + bpf_program__name(prog)); + return bpf_obj_pin(bpf_program__fd(prog), path); + } + + err = bpf_link__pin(link, path); + bpf_link__destroy(link); + return err; +} + +static int pathname_concat(char *buf, size_t buf_sz, const char *path, const char *name) +{ + int len; + + len = snprintf(buf, buf_sz, "%s/%s", path, name); + if (len < 0) + return -EINVAL; + if ((size_t)len >= buf_sz) + return -ENAMETOOLONG; + + return 0; +} + +static int +auto_attach_programs(struct bpf_object *obj, const char *path) +{ + struct bpf_program *prog; + char buf[PATH_MAX]; + int err; + + bpf_object__for_each_program(prog, obj) { + err = pathname_concat(buf, sizeof(buf), path, bpf_program__name(prog)); + if (err) + goto err_unpin_programs; + + err = auto_attach_program(prog, buf); + if (err) + goto err_unpin_programs; + } + + return 0; + +err_unpin_programs: + while ((prog = bpf_object__prev_program(obj, prog))) { + if (pathname_concat(buf, sizeof(buf), path, bpf_program__name(prog))) + continue; + + bpf_program__unpin(prog, buf); + } + + return err; +} + +static int load_with_options(int argc, char **argv, bool first_prog_only) +{ + enum bpf_prog_type common_prog_type = BPF_PROG_TYPE_UNSPEC; + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, open_opts, + .relaxed_maps = relaxed_maps, + ); + enum bpf_attach_type expected_attach_type; + struct map_replace *map_replace = NULL; + struct bpf_program *prog = NULL, *pos; + unsigned int old_map_fds = 0; + const char *pinmaps = NULL; + bool auto_attach = false; + struct bpf_object *obj; + struct bpf_map *map; + const char *pinfile; + unsigned int i, j; + __u32 ifindex = 0; + const char *file; + int idx, err; + + + if (!REQ_ARGS(2)) + return -1; + file = GET_ARG(); + pinfile = GET_ARG(); + + while (argc) { + if (is_prefix(*argv, "type")) { + NEXT_ARG(); + + if (common_prog_type != BPF_PROG_TYPE_UNSPEC) { + p_err("program type already specified"); + goto err_free_reuse_maps; + } + if (!REQ_ARGS(1)) + goto err_free_reuse_maps; + + err = libbpf_prog_type_by_name(*argv, &common_prog_type, + &expected_attach_type); + if (err < 0) { + /* Put a '/' at the end of type to appease libbpf */ + char *type = malloc(strlen(*argv) + 2); + + if (!type) { + p_err("mem alloc failed"); + goto err_free_reuse_maps; + } + *type = 0; + strcat(type, *argv); + strcat(type, "/"); + + err = get_prog_type_by_name(type, &common_prog_type, + &expected_attach_type); + free(type); + if (err < 0) + goto err_free_reuse_maps; + } + + NEXT_ARG(); + } else if (is_prefix(*argv, "map")) { + void *new_map_replace; + char *endptr, *name; + int fd; + + NEXT_ARG(); + + if (!REQ_ARGS(4)) + goto err_free_reuse_maps; + + if (is_prefix(*argv, "idx")) { + NEXT_ARG(); + + idx = strtoul(*argv, &endptr, 0); + if (*endptr) { + p_err("can't parse %s as IDX", *argv); + goto err_free_reuse_maps; + } + name = NULL; + } else if (is_prefix(*argv, "name")) { + NEXT_ARG(); + + name = *argv; + idx = -1; + } else { + p_err("expected 'idx' or 'name', got: '%s'?", + *argv); + goto err_free_reuse_maps; + } + NEXT_ARG(); + + fd = map_parse_fd(&argc, &argv); + if (fd < 0) + goto err_free_reuse_maps; + + new_map_replace = libbpf_reallocarray(map_replace, + old_map_fds + 1, + sizeof(*map_replace)); + if (!new_map_replace) { + p_err("mem alloc failed"); + goto err_free_reuse_maps; + } + map_replace = new_map_replace; + + map_replace[old_map_fds].idx = idx; + map_replace[old_map_fds].name = name; + map_replace[old_map_fds].fd = fd; + old_map_fds++; + } else if (is_prefix(*argv, "dev")) { + NEXT_ARG(); + + if (ifindex) { + p_err("offload device already specified"); + goto err_free_reuse_maps; + } + if (!REQ_ARGS(1)) + goto err_free_reuse_maps; + + ifindex = if_nametoindex(*argv); + if (!ifindex) { + p_err("unrecognized netdevice '%s': %s", + *argv, strerror(errno)); + goto err_free_reuse_maps; + } + NEXT_ARG(); + } else if (is_prefix(*argv, "pinmaps")) { + NEXT_ARG(); + + if (!REQ_ARGS(1)) + goto err_free_reuse_maps; + + pinmaps = GET_ARG(); + } else if (is_prefix(*argv, "autoattach")) { + auto_attach = true; + NEXT_ARG(); + } else { + p_err("expected no more arguments, 'type', 'map' or 'dev', got: '%s'?", + *argv); + goto err_free_reuse_maps; + } + } + + set_max_rlimit(); + + if (verifier_logs) + /* log_level1 + log_level2 + stats, but not stable UAPI */ + open_opts.kernel_log_level = 1 + 2 + 4; + + obj = bpf_object__open_file(file, &open_opts); + if (!obj) { + p_err("failed to open object file"); + goto err_free_reuse_maps; + } + + bpf_object__for_each_program(pos, obj) { + enum bpf_prog_type prog_type = common_prog_type; + + if (prog_type == BPF_PROG_TYPE_UNSPEC) { + const char *sec_name = bpf_program__section_name(pos); + + err = get_prog_type_by_name(sec_name, &prog_type, + &expected_attach_type); + if (err < 0) + goto err_close_obj; + } + + bpf_program__set_ifindex(pos, ifindex); + bpf_program__set_type(pos, prog_type); + bpf_program__set_expected_attach_type(pos, expected_attach_type); + } + + qsort(map_replace, old_map_fds, sizeof(*map_replace), + map_replace_compar); + + /* After the sort maps by name will be first on the list, because they + * have idx == -1. Resolve them. + */ + j = 0; + while (j < old_map_fds && map_replace[j].name) { + i = 0; + bpf_object__for_each_map(map, obj) { + if (!strcmp(bpf_map__name(map), map_replace[j].name)) { + map_replace[j].idx = i; + break; + } + i++; + } + if (map_replace[j].idx == -1) { + p_err("unable to find map '%s'", map_replace[j].name); + goto err_close_obj; + } + j++; + } + /* Resort if any names were resolved */ + if (j) + qsort(map_replace, old_map_fds, sizeof(*map_replace), + map_replace_compar); + + /* Set ifindex and name reuse */ + j = 0; + idx = 0; + bpf_object__for_each_map(map, obj) { + if (bpf_map__type(map) != BPF_MAP_TYPE_PERF_EVENT_ARRAY) + bpf_map__set_ifindex(map, ifindex); + + if (j < old_map_fds && idx == map_replace[j].idx) { + err = bpf_map__reuse_fd(map, map_replace[j++].fd); + if (err) { + p_err("unable to set up map reuse: %d", err); + goto err_close_obj; + } + + /* Next reuse wants to apply to the same map */ + if (j < old_map_fds && map_replace[j].idx == idx) { + p_err("replacement for map idx %d specified more than once", + idx); + goto err_close_obj; + } + } + + idx++; + } + if (j < old_map_fds) { + p_err("map idx '%d' not used", map_replace[j].idx); + goto err_close_obj; + } + + err = bpf_object__load(obj); + if (err) { + p_err("failed to load object file"); + goto err_close_obj; + } + + err = mount_bpffs_for_pin(pinfile); + if (err) + goto err_close_obj; + + if (first_prog_only) { + prog = bpf_object__next_program(obj, NULL); + if (!prog) { + p_err("object file doesn't contain any bpf program"); + goto err_close_obj; + } + + if (auto_attach) + err = auto_attach_program(prog, pinfile); + else + err = bpf_obj_pin(bpf_program__fd(prog), pinfile); + if (err) { + p_err("failed to pin program %s", + bpf_program__section_name(prog)); + goto err_close_obj; + } + } else { + if (auto_attach) + err = auto_attach_programs(obj, pinfile); + else + err = bpf_object__pin_programs(obj, pinfile); + if (err) { + p_err("failed to pin all programs"); + goto err_close_obj; + } + } + + if (pinmaps) { + err = bpf_object__pin_maps(obj, pinmaps); + if (err) { + p_err("failed to pin all maps"); + goto err_unpin; + } + } + + if (json_output) + jsonw_null(json_wtr); + + bpf_object__close(obj); + for (i = 0; i < old_map_fds; i++) + close(map_replace[i].fd); + free(map_replace); + + return 0; + +err_unpin: + if (first_prog_only) + unlink(pinfile); + else + bpf_object__unpin_programs(obj, pinfile); +err_close_obj: + bpf_object__close(obj); +err_free_reuse_maps: + for (i = 0; i < old_map_fds; i++) + close(map_replace[i].fd); + free(map_replace); + return -1; +} + +static int count_open_fds(void) +{ + DIR *dp = opendir("/proc/self/fd"); + struct dirent *de; + int cnt = -3; + + if (!dp) + return -1; + + while ((de = readdir(dp))) + cnt++; + + closedir(dp); + return cnt; +} + +static int try_loader(struct gen_loader_opts *gen) +{ + struct bpf_load_and_run_opts opts = {}; + struct bpf_loader_ctx *ctx; + int ctx_sz = sizeof(*ctx) + 64 * max(sizeof(struct bpf_map_desc), + sizeof(struct bpf_prog_desc)); + int log_buf_sz = (1u << 24) - 1; + int err, fds_before, fd_delta; + char *log_buf = NULL; + + ctx = alloca(ctx_sz); + memset(ctx, 0, ctx_sz); + ctx->sz = ctx_sz; + if (verifier_logs) { + ctx->log_level = 1 + 2 + 4; + ctx->log_size = log_buf_sz; + log_buf = malloc(log_buf_sz); + if (!log_buf) + return -ENOMEM; + ctx->log_buf = (long) log_buf; + } + opts.ctx = ctx; + opts.data = gen->data; + opts.data_sz = gen->data_sz; + opts.insns = gen->insns; + opts.insns_sz = gen->insns_sz; + fds_before = count_open_fds(); + err = bpf_load_and_run(&opts); + fd_delta = count_open_fds() - fds_before; + if (err < 0 || verifier_logs) { + fprintf(stderr, "err %d\n%s\n%s", err, opts.errstr, log_buf); + if (fd_delta && err < 0) + fprintf(stderr, "loader prog leaked %d FDs\n", + fd_delta); + } + free(log_buf); + return err; +} + +static int do_loader(int argc, char **argv) +{ + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, open_opts); + DECLARE_LIBBPF_OPTS(gen_loader_opts, gen); + struct bpf_object *obj; + const char *file; + int err = 0; + + if (!REQ_ARGS(1)) + return -1; + file = GET_ARG(); + + if (verifier_logs) + /* log_level1 + log_level2 + stats, but not stable UAPI */ + open_opts.kernel_log_level = 1 + 2 + 4; + + obj = bpf_object__open_file(file, &open_opts); + if (!obj) { + p_err("failed to open object file"); + goto err_close_obj; + } + + err = bpf_object__gen_loader(obj, &gen); + if (err) + goto err_close_obj; + + err = bpf_object__load(obj); + if (err) { + p_err("failed to load object file"); + goto err_close_obj; + } + + if (verifier_logs) { + struct dump_data dd = {}; + + kernel_syms_load(&dd); + dump_xlated_plain(&dd, (void *)gen.insns, gen.insns_sz, false, false); + kernel_syms_destroy(&dd); + } + err = try_loader(&gen); +err_close_obj: + bpf_object__close(obj); + return err; +} + +static int do_load(int argc, char **argv) +{ + if (use_loader) + return do_loader(argc, argv); + return load_with_options(argc, argv, true); +} + +static int do_loadall(int argc, char **argv) +{ + return load_with_options(argc, argv, false); +} + +#ifdef BPFTOOL_WITHOUT_SKELETONS + +static int do_profile(int argc, char **argv) +{ + p_err("bpftool prog profile command is not supported. Please build bpftool with clang >= 10.0.0"); + return 0; +} + +#else /* BPFTOOL_WITHOUT_SKELETONS */ + +#include "profiler.skel.h" + +struct profile_metric { + const char *name; + struct bpf_perf_event_value val; + struct perf_event_attr attr; + bool selected; + + /* calculate ratios like instructions per cycle */ + const int ratio_metric; /* 0 for N/A, 1 for index 0 (cycles) */ + const char *ratio_desc; + const float ratio_mul; +} metrics[] = { + { + .name = "cycles", + .attr = { + .type = PERF_TYPE_HARDWARE, + .config = PERF_COUNT_HW_CPU_CYCLES, + .exclude_user = 1, + }, + }, + { + .name = "instructions", + .attr = { + .type = PERF_TYPE_HARDWARE, + .config = PERF_COUNT_HW_INSTRUCTIONS, + .exclude_user = 1, + }, + .ratio_metric = 1, + .ratio_desc = "insns per cycle", + .ratio_mul = 1.0, + }, + { + .name = "l1d_loads", + .attr = { + .type = PERF_TYPE_HW_CACHE, + .config = + PERF_COUNT_HW_CACHE_L1D | + (PERF_COUNT_HW_CACHE_OP_READ << 8) | + (PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), + .exclude_user = 1, + }, + }, + { + .name = "llc_misses", + .attr = { + .type = PERF_TYPE_HW_CACHE, + .config = + PERF_COUNT_HW_CACHE_LL | + (PERF_COUNT_HW_CACHE_OP_READ << 8) | + (PERF_COUNT_HW_CACHE_RESULT_MISS << 16), + .exclude_user = 1 + }, + .ratio_metric = 2, + .ratio_desc = "LLC misses per million insns", + .ratio_mul = 1e6, + }, + { + .name = "itlb_misses", + .attr = { + .type = PERF_TYPE_HW_CACHE, + .config = + PERF_COUNT_HW_CACHE_ITLB | + (PERF_COUNT_HW_CACHE_OP_READ << 8) | + (PERF_COUNT_HW_CACHE_RESULT_MISS << 16), + .exclude_user = 1 + }, + .ratio_metric = 2, + .ratio_desc = "itlb misses per million insns", + .ratio_mul = 1e6, + }, + { + .name = "dtlb_misses", + .attr = { + .type = PERF_TYPE_HW_CACHE, + .config = + PERF_COUNT_HW_CACHE_DTLB | + (PERF_COUNT_HW_CACHE_OP_READ << 8) | + (PERF_COUNT_HW_CACHE_RESULT_MISS << 16), + .exclude_user = 1 + }, + .ratio_metric = 2, + .ratio_desc = "dtlb misses per million insns", + .ratio_mul = 1e6, + }, +}; + +static __u64 profile_total_count; + +#define MAX_NUM_PROFILE_METRICS 4 + +static int profile_parse_metrics(int argc, char **argv) +{ + unsigned int metric_cnt; + int selected_cnt = 0; + unsigned int i; + + metric_cnt = ARRAY_SIZE(metrics); + + while (argc > 0) { + for (i = 0; i < metric_cnt; i++) { + if (is_prefix(argv[0], metrics[i].name)) { + if (!metrics[i].selected) + selected_cnt++; + metrics[i].selected = true; + break; + } + } + if (i == metric_cnt) { + p_err("unknown metric %s", argv[0]); + return -1; + } + NEXT_ARG(); + } + if (selected_cnt > MAX_NUM_PROFILE_METRICS) { + p_err("too many (%d) metrics, please specify no more than %d metrics at at time", + selected_cnt, MAX_NUM_PROFILE_METRICS); + return -1; + } + return selected_cnt; +} + +static void profile_read_values(struct profiler_bpf *obj) +{ + __u32 m, cpu, num_cpu = obj->rodata->num_cpu; + int reading_map_fd, count_map_fd; + __u64 counts[num_cpu]; + __u32 key = 0; + int err; + + reading_map_fd = bpf_map__fd(obj->maps.accum_readings); + count_map_fd = bpf_map__fd(obj->maps.counts); + if (reading_map_fd < 0 || count_map_fd < 0) { + p_err("failed to get fd for map"); + return; + } + + err = bpf_map_lookup_elem(count_map_fd, &key, counts); + if (err) { + p_err("failed to read count_map: %s", strerror(errno)); + return; + } + + profile_total_count = 0; + for (cpu = 0; cpu < num_cpu; cpu++) + profile_total_count += counts[cpu]; + + for (m = 0; m < ARRAY_SIZE(metrics); m++) { + struct bpf_perf_event_value values[num_cpu]; + + if (!metrics[m].selected) + continue; + + err = bpf_map_lookup_elem(reading_map_fd, &key, values); + if (err) { + p_err("failed to read reading_map: %s", + strerror(errno)); + return; + } + for (cpu = 0; cpu < num_cpu; cpu++) { + metrics[m].val.counter += values[cpu].counter; + metrics[m].val.enabled += values[cpu].enabled; + metrics[m].val.running += values[cpu].running; + } + key++; + } +} + +static void profile_print_readings_json(void) +{ + __u32 m; + + jsonw_start_array(json_wtr); + for (m = 0; m < ARRAY_SIZE(metrics); m++) { + if (!metrics[m].selected) + continue; + jsonw_start_object(json_wtr); + jsonw_string_field(json_wtr, "metric", metrics[m].name); + jsonw_lluint_field(json_wtr, "run_cnt", profile_total_count); + jsonw_lluint_field(json_wtr, "value", metrics[m].val.counter); + jsonw_lluint_field(json_wtr, "enabled", metrics[m].val.enabled); + jsonw_lluint_field(json_wtr, "running", metrics[m].val.running); + + jsonw_end_object(json_wtr); + } + jsonw_end_array(json_wtr); +} + +static void profile_print_readings_plain(void) +{ + __u32 m; + + printf("\n%18llu %-20s\n", profile_total_count, "run_cnt"); + for (m = 0; m < ARRAY_SIZE(metrics); m++) { + struct bpf_perf_event_value *val = &metrics[m].val; + int r; + + if (!metrics[m].selected) + continue; + printf("%18llu %-20s", val->counter, metrics[m].name); + + r = metrics[m].ratio_metric - 1; + if (r >= 0 && metrics[r].selected && + metrics[r].val.counter > 0) { + printf("# %8.2f %-30s", + val->counter * metrics[m].ratio_mul / + metrics[r].val.counter, + metrics[m].ratio_desc); + } else { + printf("%-41s", ""); + } + + if (val->enabled > val->running) + printf("(%4.2f%%)", + val->running * 100.0 / val->enabled); + printf("\n"); + } +} + +static void profile_print_readings(void) +{ + if (json_output) + profile_print_readings_json(); + else + profile_print_readings_plain(); +} + +static char *profile_target_name(int tgt_fd) +{ + struct bpf_func_info func_info; + struct bpf_prog_info info = {}; + __u32 info_len = sizeof(info); + const struct btf_type *t; + __u32 func_info_rec_size; + struct btf *btf = NULL; + char *name = NULL; + int err; + + err = bpf_prog_get_info_by_fd(tgt_fd, &info, &info_len); + if (err) { + p_err("failed to get info for prog FD %d", tgt_fd); + goto out; + } + + if (info.btf_id == 0) { + p_err("prog FD %d doesn't have valid btf", tgt_fd); + goto out; + } + + func_info_rec_size = info.func_info_rec_size; + if (info.nr_func_info == 0) { + p_err("found 0 func_info for prog FD %d", tgt_fd); + goto out; + } + + memset(&info, 0, sizeof(info)); + info.nr_func_info = 1; + info.func_info_rec_size = func_info_rec_size; + info.func_info = ptr_to_u64(&func_info); + + err = bpf_prog_get_info_by_fd(tgt_fd, &info, &info_len); + if (err) { + p_err("failed to get func_info for prog FD %d", tgt_fd); + goto out; + } + + btf = btf__load_from_kernel_by_id(info.btf_id); + if (!btf) { + p_err("failed to load btf for prog FD %d", tgt_fd); + goto out; + } + + t = btf__type_by_id(btf, func_info.type_id); + if (!t) { + p_err("btf %d doesn't have type %d", + info.btf_id, func_info.type_id); + goto out; + } + name = strdup(btf__name_by_offset(btf, t->name_off)); +out: + btf__free(btf); + return name; +} + +static struct profiler_bpf *profile_obj; +static int profile_tgt_fd = -1; +static char *profile_tgt_name; +static int *profile_perf_events; +static int profile_perf_event_cnt; + +static void profile_close_perf_events(struct profiler_bpf *obj) +{ + int i; + + for (i = profile_perf_event_cnt - 1; i >= 0; i--) + close(profile_perf_events[i]); + + free(profile_perf_events); + profile_perf_event_cnt = 0; +} + +static int profile_open_perf_event(int mid, int cpu, int map_fd) +{ + int pmu_fd; + + pmu_fd = syscall(__NR_perf_event_open, &metrics[mid].attr, + -1 /*pid*/, cpu, -1 /*group_fd*/, 0); + if (pmu_fd < 0) { + if (errno == ENODEV) { + p_info("cpu %d may be offline, skip %s profiling.", + cpu, metrics[mid].name); + profile_perf_event_cnt++; + return 0; + } + return -1; + } + + if (bpf_map_update_elem(map_fd, + &profile_perf_event_cnt, + &pmu_fd, BPF_ANY) || + ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0)) { + close(pmu_fd); + return -1; + } + + profile_perf_events[profile_perf_event_cnt++] = pmu_fd; + return 0; +} + +static int profile_open_perf_events(struct profiler_bpf *obj) +{ + unsigned int cpu, m; + int map_fd; + + profile_perf_events = calloc( + sizeof(int), obj->rodata->num_cpu * obj->rodata->num_metric); + if (!profile_perf_events) { + p_err("failed to allocate memory for perf_event array: %s", + strerror(errno)); + return -1; + } + map_fd = bpf_map__fd(obj->maps.events); + if (map_fd < 0) { + p_err("failed to get fd for events map"); + return -1; + } + + for (m = 0; m < ARRAY_SIZE(metrics); m++) { + if (!metrics[m].selected) + continue; + for (cpu = 0; cpu < obj->rodata->num_cpu; cpu++) { + if (profile_open_perf_event(m, cpu, map_fd)) { + p_err("failed to create event %s on cpu %d", + metrics[m].name, cpu); + return -1; + } + } + } + return 0; +} + +static void profile_print_and_cleanup(void) +{ + profile_close_perf_events(profile_obj); + profile_read_values(profile_obj); + profile_print_readings(); + profiler_bpf__destroy(profile_obj); + + close(profile_tgt_fd); + free(profile_tgt_name); +} + +static void int_exit(int signo) +{ + profile_print_and_cleanup(); + exit(0); +} + +static int do_profile(int argc, char **argv) +{ + int num_metric, num_cpu, err = -1; + struct bpf_program *prog; + unsigned long duration; + char *endptr; + + /* we at least need two args for the prog and one metric */ + if (!REQ_ARGS(3)) + return -EINVAL; + + /* parse target fd */ + profile_tgt_fd = prog_parse_fd(&argc, &argv); + if (profile_tgt_fd < 0) { + p_err("failed to parse fd"); + return -1; + } + + /* parse profiling optional duration */ + if (argc > 2 && is_prefix(argv[0], "duration")) { + NEXT_ARG(); + duration = strtoul(*argv, &endptr, 0); + if (*endptr) + usage(); + NEXT_ARG(); + } else { + duration = UINT_MAX; + } + + num_metric = profile_parse_metrics(argc, argv); + if (num_metric <= 0) + goto out; + + num_cpu = libbpf_num_possible_cpus(); + if (num_cpu <= 0) { + p_err("failed to identify number of CPUs"); + goto out; + } + + profile_obj = profiler_bpf__open(); + if (!profile_obj) { + p_err("failed to open and/or load BPF object"); + goto out; + } + + profile_obj->rodata->num_cpu = num_cpu; + profile_obj->rodata->num_metric = num_metric; + + /* adjust map sizes */ + bpf_map__set_max_entries(profile_obj->maps.events, num_metric * num_cpu); + bpf_map__set_max_entries(profile_obj->maps.fentry_readings, num_metric); + bpf_map__set_max_entries(profile_obj->maps.accum_readings, num_metric); + bpf_map__set_max_entries(profile_obj->maps.counts, 1); + + /* change target name */ + profile_tgt_name = profile_target_name(profile_tgt_fd); + if (!profile_tgt_name) + goto out; + + bpf_object__for_each_program(prog, profile_obj->obj) { + err = bpf_program__set_attach_target(prog, profile_tgt_fd, + profile_tgt_name); + if (err) { + p_err("failed to set attach target\n"); + goto out; + } + } + + set_max_rlimit(); + err = profiler_bpf__load(profile_obj); + if (err) { + p_err("failed to load profile_obj"); + goto out; + } + + err = profile_open_perf_events(profile_obj); + if (err) + goto out; + + err = profiler_bpf__attach(profile_obj); + if (err) { + p_err("failed to attach profile_obj"); + goto out; + } + signal(SIGINT, int_exit); + + sleep(duration); + profile_print_and_cleanup(); + return 0; + +out: + profile_close_perf_events(profile_obj); + if (profile_obj) + profiler_bpf__destroy(profile_obj); + close(profile_tgt_fd); + free(profile_tgt_name); + return err; +} + +#endif /* BPFTOOL_WITHOUT_SKELETONS */ + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %1$s %2$s { show | list } [PROG]\n" + " %1$s %2$s dump xlated PROG [{ file FILE | opcodes | visual | linum }]\n" + " %1$s %2$s dump jited PROG [{ file FILE | opcodes | linum }]\n" + " %1$s %2$s pin PROG FILE\n" + " %1$s %2$s { load | loadall } OBJ PATH \\\n" + " [type TYPE] [dev NAME] \\\n" + " [map { idx IDX | name NAME } MAP]\\\n" + " [pinmaps MAP_DIR]\n" + " [autoattach]\n" + " %1$s %2$s attach PROG ATTACH_TYPE [MAP]\n" + " %1$s %2$s detach PROG ATTACH_TYPE [MAP]\n" + " %1$s %2$s run PROG \\\n" + " data_in FILE \\\n" + " [data_out FILE [data_size_out L]] \\\n" + " [ctx_in FILE [ctx_out FILE [ctx_size_out M]]] \\\n" + " [repeat N]\n" + " %1$s %2$s profile PROG [duration DURATION] METRICs\n" + " %1$s %2$s tracelog\n" + " %1$s %2$s help\n" + "\n" + " " HELP_SPEC_MAP "\n" + " " HELP_SPEC_PROGRAM "\n" + " TYPE := { socket | kprobe | kretprobe | classifier | action |\n" + " tracepoint | raw_tracepoint | xdp | perf_event | cgroup/skb |\n" + " cgroup/sock | cgroup/dev | lwt_in | lwt_out | lwt_xmit |\n" + " lwt_seg6local | sockops | sk_skb | sk_msg | lirc_mode2 |\n" + " sk_reuseport | flow_dissector | cgroup/sysctl |\n" + " cgroup/bind4 | cgroup/bind6 | cgroup/post_bind4 |\n" + " cgroup/post_bind6 | cgroup/connect4 | cgroup/connect6 |\n" + " cgroup/getpeername4 | cgroup/getpeername6 |\n" + " cgroup/getsockname4 | cgroup/getsockname6 | cgroup/sendmsg4 |\n" + " cgroup/sendmsg6 | cgroup/recvmsg4 | cgroup/recvmsg6 |\n" + " cgroup/getsockopt | cgroup/setsockopt | cgroup/sock_release |\n" + " struct_ops | fentry | fexit | freplace | sk_lookup }\n" + " ATTACH_TYPE := { sk_msg_verdict | sk_skb_verdict | sk_skb_stream_verdict |\n" + " sk_skb_stream_parser | flow_dissector }\n" + " METRIC := { cycles | instructions | l1d_loads | llc_misses | itlb_misses | dtlb_misses }\n" + " " HELP_SPEC_OPTIONS " |\n" + " {-f|--bpffs} | {-m|--mapcompat} | {-n|--nomount} |\n" + " {-L|--use-loader} }\n" + "", + bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "show", do_show }, + { "list", do_show }, + { "help", do_help }, + { "dump", do_dump }, + { "pin", do_pin }, + { "load", do_load }, + { "loadall", do_loadall }, + { "attach", do_attach }, + { "detach", do_detach }, + { "tracelog", do_tracelog }, + { "run", do_run }, + { "profile", do_profile }, + { 0 } +}; + +int do_prog(int argc, char **argv) +{ + return cmd_select(cmds, argc, argv, do_help); +} diff --git a/bpftool/src/skeleton/pid_iter.bpf.c b/bpftool/src/skeleton/pid_iter.bpf.c new file mode 100644 index 0000000..eb05ea5 --- /dev/null +++ b/bpftool/src/skeleton/pid_iter.bpf.c @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include "pid_iter.h" + +/* keep in sync with the definition in main.h */ +enum bpf_obj_type { + BPF_OBJ_UNKNOWN, + BPF_OBJ_PROG, + BPF_OBJ_MAP, + BPF_OBJ_LINK, + BPF_OBJ_BTF, +}; + +extern const void bpf_link_fops __ksym; +extern const void bpf_map_fops __ksym; +extern const void bpf_prog_fops __ksym; +extern const void btf_fops __ksym; + +const volatile enum bpf_obj_type obj_type = BPF_OBJ_UNKNOWN; + +static __always_inline __u32 get_obj_id(void *ent, enum bpf_obj_type type) +{ + switch (type) { + case BPF_OBJ_PROG: + return BPF_CORE_READ((struct bpf_prog *)ent, aux, id); + case BPF_OBJ_MAP: + return BPF_CORE_READ((struct bpf_map *)ent, id); + case BPF_OBJ_BTF: + return BPF_CORE_READ((struct btf *)ent, id); + case BPF_OBJ_LINK: + return BPF_CORE_READ((struct bpf_link *)ent, id); + default: + return 0; + } +} + +/* could be used only with BPF_LINK_TYPE_PERF_EVENT links */ +static __u64 get_bpf_cookie(struct bpf_link *link) +{ + struct bpf_perf_link *perf_link; + struct perf_event *event; + + perf_link = container_of(link, struct bpf_perf_link, link); + event = BPF_CORE_READ(perf_link, perf_file, private_data); + return BPF_CORE_READ(event, bpf_cookie); +} + +SEC("iter/task_file") +int iter(struct bpf_iter__task_file *ctx) +{ + struct file *file = ctx->file; + struct task_struct *task = ctx->task; + struct pid_iter_entry e; + const void *fops; + + if (!file || !task) + return 0; + + switch (obj_type) { + case BPF_OBJ_PROG: + fops = &bpf_prog_fops; + break; + case BPF_OBJ_MAP: + fops = &bpf_map_fops; + break; + case BPF_OBJ_BTF: + fops = &btf_fops; + break; + case BPF_OBJ_LINK: + fops = &bpf_link_fops; + break; + default: + return 0; + } + + if (file->f_op != fops) + return 0; + + __builtin_memset(&e, 0, sizeof(e)); + e.pid = task->tgid; + e.id = get_obj_id(file->private_data, obj_type); + + if (obj_type == BPF_OBJ_LINK) { + struct bpf_link *link = (struct bpf_link *) file->private_data; + + if (BPF_CORE_READ(link, type) == BPF_LINK_TYPE_PERF_EVENT) { + e.has_bpf_cookie = true; + e.bpf_cookie = get_bpf_cookie(link); + } + } + + bpf_probe_read_kernel_str(&e.comm, sizeof(e.comm), + task->group_leader->comm); + bpf_seq_write(ctx->meta->seq, &e, sizeof(e)); + + return 0; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/bpftool/src/skeleton/pid_iter.h b/bpftool/src/skeleton/pid_iter.h new file mode 100644 index 0000000..bbb570d --- /dev/null +++ b/bpftool/src/skeleton/pid_iter.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Copyright (c) 2020 Facebook */ +#ifndef __PID_ITER_H +#define __PID_ITER_H + +struct pid_iter_entry { + __u32 id; + int pid; + __u64 bpf_cookie; + bool has_bpf_cookie; + char comm[16]; +}; + +#endif diff --git a/bpftool/src/skeleton/profiler.bpf.c b/bpftool/src/skeleton/profiler.bpf.c new file mode 100644 index 0000000..ce5b65e --- /dev/null +++ b/bpftool/src/skeleton/profiler.bpf.c @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +// Copyright (c) 2020 Facebook +#include +#include +#include + +/* map of perf event fds, num_cpu * num_metric entries */ +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(int)); +} events SEC(".maps"); + +/* readings at fentry */ +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(struct bpf_perf_event_value)); +} fentry_readings SEC(".maps"); + +/* accumulated readings */ +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(struct bpf_perf_event_value)); +} accum_readings SEC(".maps"); + +/* sample counts, one per cpu */ +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u64)); +} counts SEC(".maps"); + +const volatile __u32 num_cpu = 1; +const volatile __u32 num_metric = 1; +#define MAX_NUM_MATRICS 4 + +SEC("fentry/XXX") +int BPF_PROG(fentry_XXX) +{ + struct bpf_perf_event_value *ptrs[MAX_NUM_MATRICS]; + u32 key = bpf_get_smp_processor_id(); + u32 i; + + /* look up before reading, to reduce error */ + for (i = 0; i < num_metric && i < MAX_NUM_MATRICS; i++) { + u32 flag = i; + + ptrs[i] = bpf_map_lookup_elem(&fentry_readings, &flag); + if (!ptrs[i]) + return 0; + } + + for (i = 0; i < num_metric && i < MAX_NUM_MATRICS; i++) { + struct bpf_perf_event_value reading; + int err; + + err = bpf_perf_event_read_value(&events, key, &reading, + sizeof(reading)); + if (err) + return 0; + *(ptrs[i]) = reading; + key += num_cpu; + } + + return 0; +} + +static inline void +fexit_update_maps(u32 id, struct bpf_perf_event_value *after) +{ + struct bpf_perf_event_value *before, diff; + + before = bpf_map_lookup_elem(&fentry_readings, &id); + /* only account samples with a valid fentry_reading */ + if (before && before->counter) { + struct bpf_perf_event_value *accum; + + diff.counter = after->counter - before->counter; + diff.enabled = after->enabled - before->enabled; + diff.running = after->running - before->running; + + accum = bpf_map_lookup_elem(&accum_readings, &id); + if (accum) { + accum->counter += diff.counter; + accum->enabled += diff.enabled; + accum->running += diff.running; + } + } +} + +SEC("fexit/XXX") +int BPF_PROG(fexit_XXX) +{ + struct bpf_perf_event_value readings[MAX_NUM_MATRICS]; + u32 cpu = bpf_get_smp_processor_id(); + u32 i, zero = 0; + int err; + u64 *count; + + /* read all events before updating the maps, to reduce error */ + for (i = 0; i < num_metric && i < MAX_NUM_MATRICS; i++) { + err = bpf_perf_event_read_value(&events, cpu + i * num_cpu, + readings + i, sizeof(*readings)); + if (err) + return 0; + } + count = bpf_map_lookup_elem(&counts, &zero); + if (count) { + *count += 1; + for (i = 0; i < num_metric && i < MAX_NUM_MATRICS; i++) + fexit_update_maps(i, &readings[i]); + } + return 0; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/bpftool/src/struct_ops.c b/bpftool/src/struct_ops.c new file mode 100644 index 0000000..b389f48 --- /dev/null +++ b/bpftool/src/struct_ops.c @@ -0,0 +1,596 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2020 Facebook */ + +#include +#include +#include + +#include + +#include +#include +#include + +#include "json_writer.h" +#include "main.h" + +#define STRUCT_OPS_VALUE_PREFIX "bpf_struct_ops_" + +static const struct btf_type *map_info_type; +static __u32 map_info_alloc_len; +static struct btf *btf_vmlinux; +static __s32 map_info_type_id; + +struct res { + unsigned int nr_maps; + unsigned int nr_errs; +}; + +static const struct btf *get_btf_vmlinux(void) +{ + if (btf_vmlinux) + return btf_vmlinux; + + btf_vmlinux = libbpf_find_kernel_btf(); + if (!btf_vmlinux) + p_err("struct_ops requires kernel CONFIG_DEBUG_INFO_BTF=y"); + + return btf_vmlinux; +} + +static const char *get_kern_struct_ops_name(const struct bpf_map_info *info) +{ + const struct btf *kern_btf; + const struct btf_type *t; + const char *st_ops_name; + + kern_btf = get_btf_vmlinux(); + if (!kern_btf) + return ""; + + t = btf__type_by_id(kern_btf, info->btf_vmlinux_value_type_id); + st_ops_name = btf__name_by_offset(kern_btf, t->name_off); + st_ops_name += strlen(STRUCT_OPS_VALUE_PREFIX); + + return st_ops_name; +} + +static __s32 get_map_info_type_id(void) +{ + const struct btf *kern_btf; + + if (map_info_type_id) + return map_info_type_id; + + kern_btf = get_btf_vmlinux(); + if (!kern_btf) + return 0; + + map_info_type_id = btf__find_by_name_kind(kern_btf, "bpf_map_info", + BTF_KIND_STRUCT); + if (map_info_type_id < 0) { + p_err("can't find bpf_map_info from btf_vmlinux"); + return map_info_type_id; + } + map_info_type = btf__type_by_id(kern_btf, map_info_type_id); + + /* Ensure map_info_alloc() has at least what the bpftool needs */ + map_info_alloc_len = map_info_type->size; + if (map_info_alloc_len < sizeof(struct bpf_map_info)) + map_info_alloc_len = sizeof(struct bpf_map_info); + + return map_info_type_id; +} + +/* If the subcmd needs to print out the bpf_map_info, + * it should always call map_info_alloc to allocate + * a bpf_map_info object instead of allocating it + * on the stack. + * + * map_info_alloc() will take the running kernel's btf + * into account. i.e. it will consider the + * sizeof(struct bpf_map_info) of the running kernel. + * + * It will enable the "struct_ops" cmd to print the latest + * "struct bpf_map_info". + * + * [ Recall that "struct_ops" requires the kernel's btf to + * be available ] + */ +static struct bpf_map_info *map_info_alloc(__u32 *alloc_len) +{ + struct bpf_map_info *info; + + if (get_map_info_type_id() < 0) + return NULL; + + info = calloc(1, map_info_alloc_len); + if (!info) + p_err("mem alloc failed"); + else + *alloc_len = map_info_alloc_len; + + return info; +} + +/* It iterates all struct_ops maps of the system. + * It returns the fd in "*res_fd" and map_info in "*info". + * In the very first iteration, info->id should be 0. + * An optional map "*name" filter can be specified. + * The filter can be made more flexible in the future. + * e.g. filter by kernel-struct-ops-name, regex-name, glob-name, ...etc. + * + * Return value: + * 1: A struct_ops map found. It is returned in "*res_fd" and "*info". + * The caller can continue to call get_next in the future. + * 0: No struct_ops map is returned. + * All struct_ops map has been found. + * -1: Error and the caller should abort the iteration. + */ +static int get_next_struct_ops_map(const char *name, int *res_fd, + struct bpf_map_info *info, __u32 info_len) +{ + __u32 id = info->id; + int err, fd; + + while (true) { + err = bpf_map_get_next_id(id, &id); + if (err) { + if (errno == ENOENT) + return 0; + p_err("can't get next map: %s", strerror(errno)); + return -1; + } + + fd = bpf_map_get_fd_by_id(id); + if (fd < 0) { + if (errno == ENOENT) + continue; + p_err("can't get map by id (%u): %s", + id, strerror(errno)); + return -1; + } + + err = bpf_map_get_info_by_fd(fd, info, &info_len); + if (err) { + p_err("can't get map info: %s", strerror(errno)); + close(fd); + return -1; + } + + if (info->type == BPF_MAP_TYPE_STRUCT_OPS && + (!name || !strcmp(name, info->name))) { + *res_fd = fd; + return 1; + } + close(fd); + } +} + +static int cmd_retval(const struct res *res, bool must_have_one_map) +{ + if (res->nr_errs || (!res->nr_maps && must_have_one_map)) + return -1; + + return 0; +} + +/* "data" is the work_func private storage */ +typedef int (*work_func)(int fd, const struct bpf_map_info *info, void *data, + struct json_writer *wtr); + +/* Find all struct_ops map in the system. + * Filter out by "name" (if specified). + * Then call "func(fd, info, data, wtr)" on each struct_ops map found. + */ +static struct res do_search(const char *name, work_func func, void *data, + struct json_writer *wtr) +{ + struct bpf_map_info *info; + struct res res = {}; + __u32 info_len; + int fd, err; + + info = map_info_alloc(&info_len); + if (!info) { + res.nr_errs++; + return res; + } + + if (wtr) + jsonw_start_array(wtr); + while ((err = get_next_struct_ops_map(name, &fd, info, info_len)) == 1) { + res.nr_maps++; + err = func(fd, info, data, wtr); + if (err) + res.nr_errs++; + close(fd); + } + if (wtr) + jsonw_end_array(wtr); + + if (err) + res.nr_errs++; + + if (!wtr && name && !res.nr_errs && !res.nr_maps) + /* It is not printing empty []. + * Thus, needs to specifically say nothing found + * for "name" here. + */ + p_err("no struct_ops found for %s", name); + else if (!wtr && json_output && !res.nr_errs) + /* The "func()" above is not writing any json (i.e. !wtr + * test here). + * + * However, "-j" is enabled and there is no errs here, + * so call json_null() as the current convention of + * other cmds. + */ + jsonw_null(json_wtr); + + free(info); + return res; +} + +static struct res do_one_id(const char *id_str, work_func func, void *data, + struct json_writer *wtr) +{ + struct bpf_map_info *info; + struct res res = {}; + unsigned long id; + __u32 info_len; + char *endptr; + int fd; + + id = strtoul(id_str, &endptr, 0); + if (*endptr || !id || id > UINT32_MAX) { + p_err("invalid id %s", id_str); + res.nr_errs++; + return res; + } + + fd = bpf_map_get_fd_by_id(id); + if (fd < 0) { + p_err("can't get map by id (%lu): %s", id, strerror(errno)); + res.nr_errs++; + return res; + } + + info = map_info_alloc(&info_len); + if (!info) { + res.nr_errs++; + goto done; + } + + if (bpf_map_get_info_by_fd(fd, info, &info_len)) { + p_err("can't get map info: %s", strerror(errno)); + res.nr_errs++; + goto done; + } + + if (info->type != BPF_MAP_TYPE_STRUCT_OPS) { + p_err("%s id %u is not a struct_ops map", info->name, info->id); + res.nr_errs++; + goto done; + } + + res.nr_maps++; + + if (func(fd, info, data, wtr)) + res.nr_errs++; + else if (!wtr && json_output) + /* The "func()" above is not writing any json (i.e. !wtr + * test here). + * + * However, "-j" is enabled and there is no errs here, + * so call json_null() as the current convention of + * other cmds. + */ + jsonw_null(json_wtr); + +done: + free(info); + close(fd); + + return res; +} + +static struct res do_work_on_struct_ops(const char *search_type, + const char *search_term, + work_func func, void *data, + struct json_writer *wtr) +{ + if (search_type) { + if (is_prefix(search_type, "id")) + return do_one_id(search_term, func, data, wtr); + else if (!is_prefix(search_type, "name")) + usage(); + } + + return do_search(search_term, func, data, wtr); +} + +static int __do_show(int fd, const struct bpf_map_info *info, void *data, + struct json_writer *wtr) +{ + if (wtr) { + jsonw_start_object(wtr); + jsonw_uint_field(wtr, "id", info->id); + jsonw_string_field(wtr, "name", info->name); + jsonw_string_field(wtr, "kernel_struct_ops", + get_kern_struct_ops_name(info)); + jsonw_end_object(wtr); + } else { + printf("%u: %-15s %-32s\n", info->id, info->name, + get_kern_struct_ops_name(info)); + } + + return 0; +} + +static int do_show(int argc, char **argv) +{ + const char *search_type = NULL, *search_term = NULL; + struct res res; + + if (argc && argc != 2) + usage(); + + if (argc == 2) { + search_type = GET_ARG(); + search_term = GET_ARG(); + } + + res = do_work_on_struct_ops(search_type, search_term, __do_show, + NULL, json_wtr); + + return cmd_retval(&res, !!search_term); +} + +static int __do_dump(int fd, const struct bpf_map_info *info, void *data, + struct json_writer *wtr) +{ + struct btf_dumper *d = (struct btf_dumper *)data; + const struct btf_type *struct_ops_type; + const struct btf *kern_btf = d->btf; + const char *struct_ops_name; + int zero = 0; + void *value; + + /* note: d->jw == wtr */ + + kern_btf = d->btf; + + /* The kernel supporting BPF_MAP_TYPE_STRUCT_OPS must have + * btf_vmlinux_value_type_id. + */ + struct_ops_type = btf__type_by_id(kern_btf, + info->btf_vmlinux_value_type_id); + struct_ops_name = btf__name_by_offset(kern_btf, + struct_ops_type->name_off); + value = calloc(1, info->value_size); + if (!value) { + p_err("mem alloc failed"); + return -1; + } + + if (bpf_map_lookup_elem(fd, &zero, value)) { + p_err("can't lookup struct_ops map %s id %u", + info->name, info->id); + free(value); + return -1; + } + + jsonw_start_object(wtr); + jsonw_name(wtr, "bpf_map_info"); + btf_dumper_type(d, map_info_type_id, (void *)info); + jsonw_end_object(wtr); + + jsonw_start_object(wtr); + jsonw_name(wtr, struct_ops_name); + btf_dumper_type(d, info->btf_vmlinux_value_type_id, value); + jsonw_end_object(wtr); + + free(value); + + return 0; +} + +static int do_dump(int argc, char **argv) +{ + const char *search_type = NULL, *search_term = NULL; + json_writer_t *wtr = json_wtr; + const struct btf *kern_btf; + struct btf_dumper d = {}; + struct res res; + + if (argc && argc != 2) + usage(); + + if (argc == 2) { + search_type = GET_ARG(); + search_term = GET_ARG(); + } + + kern_btf = get_btf_vmlinux(); + if (!kern_btf) + return -1; + + if (!json_output) { + wtr = jsonw_new(stdout); + if (!wtr) { + p_err("can't create json writer"); + return -1; + } + jsonw_pretty(wtr, true); + } + + d.btf = kern_btf; + d.jw = wtr; + d.is_plain_text = !json_output; + d.prog_id_as_func_ptr = true; + + res = do_work_on_struct_ops(search_type, search_term, __do_dump, &d, + wtr); + + if (!json_output) + jsonw_destroy(&wtr); + + return cmd_retval(&res, !!search_term); +} + +static int __do_unregister(int fd, const struct bpf_map_info *info, void *data, + struct json_writer *wtr) +{ + int zero = 0; + + if (bpf_map_delete_elem(fd, &zero)) { + p_err("can't unload %s %s id %u: %s", + get_kern_struct_ops_name(info), info->name, + info->id, strerror(errno)); + return -1; + } + + p_info("Unregistered %s %s id %u", + get_kern_struct_ops_name(info), info->name, + info->id); + + return 0; +} + +static int do_unregister(int argc, char **argv) +{ + const char *search_type, *search_term; + struct res res; + + if (argc != 2) + usage(); + + search_type = GET_ARG(); + search_term = GET_ARG(); + + res = do_work_on_struct_ops(search_type, search_term, + __do_unregister, NULL, NULL); + + return cmd_retval(&res, true); +} + +static int do_register(int argc, char **argv) +{ + LIBBPF_OPTS(bpf_object_open_opts, open_opts); + struct bpf_map_info info = {}; + __u32 info_len = sizeof(info); + int nr_errs = 0, nr_maps = 0; + struct bpf_object *obj; + struct bpf_link *link; + struct bpf_map *map; + const char *file; + + if (argc != 1) + usage(); + + file = GET_ARG(); + + if (verifier_logs) + /* log_level1 + log_level2 + stats, but not stable UAPI */ + open_opts.kernel_log_level = 1 + 2 + 4; + + obj = bpf_object__open_file(file, &open_opts); + if (!obj) + return -1; + + set_max_rlimit(); + + if (bpf_object__load(obj)) { + bpf_object__close(obj); + return -1; + } + + bpf_object__for_each_map(map, obj) { + if (bpf_map__type(map) != BPF_MAP_TYPE_STRUCT_OPS) + continue; + + link = bpf_map__attach_struct_ops(map); + if (!link) { + p_err("can't register struct_ops %s: %s", + bpf_map__name(map), strerror(errno)); + nr_errs++; + continue; + } + nr_maps++; + + bpf_link__disconnect(link); + bpf_link__destroy(link); + + if (!bpf_map_get_info_by_fd(bpf_map__fd(map), &info, + &info_len)) + p_info("Registered %s %s id %u", + get_kern_struct_ops_name(&info), + bpf_map__name(map), + info.id); + else + /* Not p_err. The struct_ops was attached + * successfully. + */ + p_info("Registered %s but can't find id: %s", + bpf_map__name(map), strerror(errno)); + } + + bpf_object__close(obj); + + if (nr_errs) + return -1; + + if (!nr_maps) { + p_err("no struct_ops found in %s", file); + return -1; + } + + if (json_output) + jsonw_null(json_wtr); + + return 0; +} + +static int do_help(int argc, char **argv) +{ + if (json_output) { + jsonw_null(json_wtr); + return 0; + } + + fprintf(stderr, + "Usage: %1$s %2$s { show | list } [STRUCT_OPS_MAP]\n" + " %1$s %2$s dump [STRUCT_OPS_MAP]\n" + " %1$s %2$s register OBJ\n" + " %1$s %2$s unregister STRUCT_OPS_MAP\n" + " %1$s %2$s help\n" + "\n" + " STRUCT_OPS_MAP := [ id STRUCT_OPS_MAP_ID | name STRUCT_OPS_MAP_NAME ]\n" + " " HELP_SPEC_OPTIONS " }\n" + "", + bin_name, argv[-2]); + + return 0; +} + +static const struct cmd cmds[] = { + { "show", do_show }, + { "list", do_show }, + { "register", do_register }, + { "unregister", do_unregister }, + { "dump", do_dump }, + { "help", do_help }, + { 0 } +}; + +int do_struct_ops(int argc, char **argv) +{ + int err; + + err = cmd_select(cmds, argc, argv, do_help); + + btf__free(btf_vmlinux); + + return err; +} diff --git a/bpftool/src/tracelog.c b/bpftool/src/tracelog.c new file mode 100644 index 0000000..bf1f022 --- /dev/null +++ b/bpftool/src/tracelog.c @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (c) 2015-2017 Daniel Borkmann */ +/* Copyright (c) 2018 Netronome Systems, Inc. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "main.h" + +#ifndef TRACEFS_MAGIC +# define TRACEFS_MAGIC 0x74726163 +#endif + +#define _textify(x) #x +#define textify(x) _textify(x) + +FILE *trace_pipe_fd; +char *buff; + +static int validate_tracefs_mnt(const char *mnt, unsigned long magic) +{ + struct statfs st_fs; + + if (statfs(mnt, &st_fs) < 0) + return -ENOENT; + if ((unsigned long)st_fs.f_type != magic) + return -ENOENT; + + return 0; +} + +static bool +find_tracefs_mnt_single(unsigned long magic, char *mnt, const char *mntpt) +{ + size_t src_len; + + if (validate_tracefs_mnt(mntpt, magic)) + return false; + + src_len = strlen(mntpt); + if (src_len + 1 >= PATH_MAX) { + p_err("tracefs mount point name too long"); + return false; + } + + strcpy(mnt, mntpt); + return true; +} + +static bool get_tracefs_pipe(char *mnt) +{ + static const char * const known_mnts[] = { + "/sys/kernel/debug/tracing", + "/sys/kernel/tracing", + "/tracing", + "/trace", + }; + const char *pipe_name = "/trace_pipe"; + const char *fstype = "tracefs"; + char type[100], format[32]; + const char * const *ptr; + bool found = false; + FILE *fp; + + for (ptr = known_mnts; ptr < known_mnts + ARRAY_SIZE(known_mnts); ptr++) + if (find_tracefs_mnt_single(TRACEFS_MAGIC, mnt, *ptr)) + goto exit_found; + + fp = fopen("/proc/mounts", "r"); + if (!fp) + return false; + + /* Allow room for NULL terminating byte and pipe file name */ + snprintf(format, sizeof(format), "%%*s %%%zds %%99s %%*s %%*d %%*d\\n", + PATH_MAX - strlen(pipe_name) - 1); + while (fscanf(fp, format, mnt, type) == 2) + if (strcmp(type, fstype) == 0) { + found = true; + break; + } + fclose(fp); + + /* The string from fscanf() might be truncated, check mnt is valid */ + if (found && validate_tracefs_mnt(mnt, TRACEFS_MAGIC)) + goto exit_found; + + if (block_mount) + return false; + + p_info("could not find tracefs, attempting to mount it now"); + /* Most of the time, tracefs is automatically mounted by debugfs at + * /sys/kernel/debug/tracing when we try to access it. If we could not + * find it, it is likely that debugfs is not mounted. Let's give one + * attempt at mounting just tracefs at /sys/kernel/tracing. + */ + strcpy(mnt, known_mnts[1]); + if (mount_tracefs(mnt)) + return false; + +exit_found: + strcat(mnt, pipe_name); + return true; +} + +static void exit_tracelog(int signum) +{ + fclose(trace_pipe_fd); + free(buff); + + if (json_output) { + jsonw_end_array(json_wtr); + jsonw_destroy(&json_wtr); + } + + exit(0); +} + +int do_tracelog(int argc, char **argv) +{ + const struct sigaction act = { + .sa_handler = exit_tracelog + }; + char trace_pipe[PATH_MAX]; + size_t buff_len = 0; + + if (json_output) + jsonw_start_array(json_wtr); + + if (!get_tracefs_pipe(trace_pipe)) + return -1; + + trace_pipe_fd = fopen(trace_pipe, "r"); + if (!trace_pipe_fd) { + p_err("could not open trace pipe: %s", strerror(errno)); + return -1; + } + + sigaction(SIGHUP, &act, NULL); + sigaction(SIGINT, &act, NULL); + sigaction(SIGTERM, &act, NULL); + while (1) { + ssize_t ret; + + ret = getline(&buff, &buff_len, trace_pipe_fd); + if (ret <= 0) { + p_err("failed to read content from trace pipe: %s", + strerror(errno)); + break; + } + if (json_output) + jsonw_string(json_wtr, buff); + else + printf("%s", buff); + } + + fclose(trace_pipe_fd); + free(buff); + return -1; +} diff --git a/bpftool/src/xlated_dumper.c b/bpftool/src/xlated_dumper.c new file mode 100644 index 0000000..6fe3134 --- /dev/null +++ b/bpftool/src/xlated_dumper.c @@ -0,0 +1,382 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2018 Netronome Systems, Inc. */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include + +#include "disasm.h" +#include "json_writer.h" +#include "main.h" +#include "xlated_dumper.h" + +static int kernel_syms_cmp(const void *sym_a, const void *sym_b) +{ + return ((struct kernel_sym *)sym_a)->address - + ((struct kernel_sym *)sym_b)->address; +} + +void kernel_syms_load(struct dump_data *dd) +{ + struct kernel_sym *sym; + char buff[256]; + void *tmp, *address; + FILE *fp; + + fp = fopen("/proc/kallsyms", "r"); + if (!fp) + return; + + while (fgets(buff, sizeof(buff), fp)) { + tmp = libbpf_reallocarray(dd->sym_mapping, dd->sym_count + 1, + sizeof(*dd->sym_mapping)); + if (!tmp) { +out: + free(dd->sym_mapping); + dd->sym_mapping = NULL; + fclose(fp); + return; + } + dd->sym_mapping = tmp; + sym = &dd->sym_mapping[dd->sym_count]; + if (sscanf(buff, "%p %*c %s", &address, sym->name) != 2) + continue; + sym->address = (unsigned long)address; + if (!strcmp(sym->name, "__bpf_call_base")) { + dd->address_call_base = sym->address; + /* sysctl kernel.kptr_restrict was set */ + if (!sym->address) + goto out; + } + if (sym->address) + dd->sym_count++; + } + + fclose(fp); + + qsort(dd->sym_mapping, dd->sym_count, + sizeof(*dd->sym_mapping), kernel_syms_cmp); +} + +void kernel_syms_destroy(struct dump_data *dd) +{ + free(dd->sym_mapping); +} + +struct kernel_sym *kernel_syms_search(struct dump_data *dd, + unsigned long key) +{ + struct kernel_sym sym = { + .address = key, + }; + + return dd->sym_mapping ? + bsearch(&sym, dd->sym_mapping, dd->sym_count, + sizeof(*dd->sym_mapping), kernel_syms_cmp) : NULL; +} + +static void __printf(2, 3) print_insn(void *private_data, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); +} + +static void __printf(2, 3) +print_insn_for_graph(void *private_data, const char *fmt, ...) +{ + char buf[64], *p; + va_list args; + + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + p = buf; + while (*p != '\0') { + if (*p == '\n') { + memmove(p + 3, p, strlen(buf) + 1 - (p - buf)); + /* Align each instruction dump row left. */ + *p++ = '\\'; + *p++ = 'l'; + /* Output multiline concatenation. */ + *p++ = '\\'; + } else if (*p == '<' || *p == '>' || *p == '|' || *p == '&') { + memmove(p + 1, p, strlen(buf) + 1 - (p - buf)); + /* Escape special character. */ + *p++ = '\\'; + } + + p++; + } + + printf("%s", buf); +} + +static void __printf(2, 3) +print_insn_json(void *private_data, const char *fmt, ...) +{ + unsigned int l = strlen(fmt); + char chomped_fmt[l]; + va_list args; + + va_start(args, fmt); + if (l > 0) { + strncpy(chomped_fmt, fmt, l - 1); + chomped_fmt[l - 1] = '\0'; + } + jsonw_vprintf_enquote(json_wtr, chomped_fmt, args); + va_end(args); +} + +static const char *print_call_pcrel(struct dump_data *dd, + struct kernel_sym *sym, + unsigned long address, + const struct bpf_insn *insn) +{ + if (!dd->nr_jited_ksyms) + /* Do not show address for interpreted programs */ + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "%+d", insn->off); + else if (sym) + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "%+d#%s", insn->off, sym->name); + else + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "%+d#0x%lx", insn->off, address); + return dd->scratch_buff; +} + +static const char *print_call_helper(struct dump_data *dd, + struct kernel_sym *sym, + unsigned long address) +{ + if (sym) + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "%s", sym->name); + else + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "0x%lx", address); + return dd->scratch_buff; +} + +static const char *print_call(void *private_data, + const struct bpf_insn *insn) +{ + struct dump_data *dd = private_data; + unsigned long address = dd->address_call_base + insn->imm; + struct kernel_sym *sym; + + if (insn->src_reg == BPF_PSEUDO_CALL && + (__u32) insn->imm < dd->nr_jited_ksyms && dd->jited_ksyms) + address = dd->jited_ksyms[insn->imm]; + + sym = kernel_syms_search(dd, address); + if (insn->src_reg == BPF_PSEUDO_CALL) + return print_call_pcrel(dd, sym, address, insn); + else + return print_call_helper(dd, sym, address); +} + +static const char *print_imm(void *private_data, + const struct bpf_insn *insn, + __u64 full_imm) +{ + struct dump_data *dd = private_data; + + if (insn->src_reg == BPF_PSEUDO_MAP_FD) + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "map[id:%u]", insn->imm); + else if (insn->src_reg == BPF_PSEUDO_MAP_VALUE) + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "map[id:%u][0]+%u", insn->imm, (insn + 1)->imm); + else if (insn->src_reg == BPF_PSEUDO_MAP_IDX_VALUE) + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "map[idx:%u]+%u", insn->imm, (insn + 1)->imm); + else if (insn->src_reg == BPF_PSEUDO_FUNC) + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "subprog[%+d]", insn->imm); + else + snprintf(dd->scratch_buff, sizeof(dd->scratch_buff), + "0x%llx", (unsigned long long)full_imm); + return dd->scratch_buff; +} + +void dump_xlated_json(struct dump_data *dd, void *buf, unsigned int len, + bool opcodes, bool linum) +{ + const struct bpf_prog_linfo *prog_linfo = dd->prog_linfo; + const struct bpf_insn_cbs cbs = { + .cb_print = print_insn_json, + .cb_call = print_call, + .cb_imm = print_imm, + .private_data = dd, + }; + struct bpf_func_info *record; + struct bpf_insn *insn = buf; + struct btf *btf = dd->btf; + bool double_insn = false; + unsigned int nr_skip = 0; + char func_sig[1024]; + unsigned int i; + + jsonw_start_array(json_wtr); + record = dd->func_info; + for (i = 0; i < len / sizeof(*insn); i++) { + if (double_insn) { + double_insn = false; + continue; + } + double_insn = insn[i].code == (BPF_LD | BPF_IMM | BPF_DW); + + jsonw_start_object(json_wtr); + + if (btf && record) { + if (record->insn_off == i) { + btf_dumper_type_only(btf, record->type_id, + func_sig, + sizeof(func_sig)); + if (func_sig[0] != '\0') { + jsonw_name(json_wtr, "proto"); + jsonw_string(json_wtr, func_sig); + } + record = (void *)record + dd->finfo_rec_size; + } + } + + if (prog_linfo) { + const struct bpf_line_info *linfo; + + linfo = bpf_prog_linfo__lfind(prog_linfo, i, nr_skip); + if (linfo) { + btf_dump_linfo_json(btf, linfo, linum); + nr_skip++; + } + } + + jsonw_name(json_wtr, "disasm"); + print_bpf_insn(&cbs, insn + i, true); + + if (opcodes) { + jsonw_name(json_wtr, "opcodes"); + jsonw_start_object(json_wtr); + + jsonw_name(json_wtr, "code"); + jsonw_printf(json_wtr, "\"0x%02hhx\"", insn[i].code); + + jsonw_name(json_wtr, "src_reg"); + jsonw_printf(json_wtr, "\"0x%hhx\"", insn[i].src_reg); + + jsonw_name(json_wtr, "dst_reg"); + jsonw_printf(json_wtr, "\"0x%hhx\"", insn[i].dst_reg); + + jsonw_name(json_wtr, "off"); + print_hex_data_json((uint8_t *)(&insn[i].off), 2); + + jsonw_name(json_wtr, "imm"); + if (double_insn && i < len - 1) + print_hex_data_json((uint8_t *)(&insn[i].imm), + 12); + else + print_hex_data_json((uint8_t *)(&insn[i].imm), + 4); + jsonw_end_object(json_wtr); + } + jsonw_end_object(json_wtr); + } + jsonw_end_array(json_wtr); +} + +void dump_xlated_plain(struct dump_data *dd, void *buf, unsigned int len, + bool opcodes, bool linum) +{ + const struct bpf_prog_linfo *prog_linfo = dd->prog_linfo; + const struct bpf_insn_cbs cbs = { + .cb_print = print_insn, + .cb_call = print_call, + .cb_imm = print_imm, + .private_data = dd, + }; + struct bpf_func_info *record; + struct bpf_insn *insn = buf; + struct btf *btf = dd->btf; + unsigned int nr_skip = 0; + bool double_insn = false; + char func_sig[1024]; + unsigned int i; + + record = dd->func_info; + for (i = 0; i < len / sizeof(*insn); i++) { + if (double_insn) { + double_insn = false; + continue; + } + + if (btf && record) { + if (record->insn_off == i) { + btf_dumper_type_only(btf, record->type_id, + func_sig, + sizeof(func_sig)); + if (func_sig[0] != '\0') + printf("%s:\n", func_sig); + record = (void *)record + dd->finfo_rec_size; + } + } + + if (prog_linfo) { + const struct bpf_line_info *linfo; + + linfo = bpf_prog_linfo__lfind(prog_linfo, i, nr_skip); + if (linfo) { + btf_dump_linfo_plain(btf, linfo, "; ", + linum); + nr_skip++; + } + } + + double_insn = insn[i].code == (BPF_LD | BPF_IMM | BPF_DW); + + printf("% 4d: ", i); + print_bpf_insn(&cbs, insn + i, true); + + if (opcodes) { + printf(" "); + fprint_hex(stdout, insn + i, 8, " "); + if (double_insn && i < len - 1) { + printf(" "); + fprint_hex(stdout, insn + i + 1, 8, " "); + } + printf("\n"); + } + } +} + +void dump_xlated_for_graph(struct dump_data *dd, void *buf_start, void *buf_end, + unsigned int start_idx) +{ + const struct bpf_insn_cbs cbs = { + .cb_print = print_insn_for_graph, + .cb_call = print_call, + .cb_imm = print_imm, + .private_data = dd, + }; + struct bpf_insn *insn_start = buf_start; + struct bpf_insn *insn_end = buf_end; + struct bpf_insn *cur = insn_start; + + for (; cur <= insn_end; cur++) { + printf("% 4d: ", (int)(cur - insn_start + start_idx)); + print_bpf_insn(&cbs, cur, true); + if (cur != insn_end) + printf(" | "); + } +} diff --git a/bpftool/src/xlated_dumper.h b/bpftool/src/xlated_dumper.h new file mode 100644 index 0000000..54847e1 --- /dev/null +++ b/bpftool/src/xlated_dumper.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* Copyright (C) 2018 Netronome Systems, Inc. */ + +#ifndef __BPF_TOOL_XLATED_DUMPER_H +#define __BPF_TOOL_XLATED_DUMPER_H + +#define SYM_MAX_NAME 256 + +struct bpf_prog_linfo; + +struct kernel_sym { + unsigned long address; + char name[SYM_MAX_NAME]; +}; + +struct dump_data { + unsigned long address_call_base; + struct kernel_sym *sym_mapping; + __u32 sym_count; + __u64 *jited_ksyms; + __u32 nr_jited_ksyms; + struct btf *btf; + void *func_info; + __u32 finfo_rec_size; + const struct bpf_prog_linfo *prog_linfo; + char scratch_buff[SYM_MAX_NAME + 8]; +}; + +void kernel_syms_load(struct dump_data *dd); +void kernel_syms_destroy(struct dump_data *dd); +struct kernel_sym *kernel_syms_search(struct dump_data *dd, unsigned long key); +void dump_xlated_json(struct dump_data *dd, void *buf, unsigned int len, + bool opcodes, bool linum); +void dump_xlated_plain(struct dump_data *dd, void *buf, unsigned int len, + bool opcodes, bool linum); +void dump_xlated_for_graph(struct dump_data *dd, void *buf, void *buf_end, + unsigned int start_index); + +#endif diff --git a/deps/libelf-aarch64/control.tar.xz b/deps/libelf-aarch64/control.tar.xz new file mode 100644 index 0000000..c8b90fe Binary files /dev/null and b/deps/libelf-aarch64/control.tar.xz differ diff --git a/deps/libelf-aarch64/data.tar.xz b/deps/libelf-aarch64/data.tar.xz new file mode 100644 index 0000000..6319f90 Binary files /dev/null and b/deps/libelf-aarch64/data.tar.xz differ diff --git a/deps/libelf-aarch64/debian-binary b/deps/libelf-aarch64/debian-binary new file mode 100644 index 0000000..cd5ac03 --- /dev/null +++ b/deps/libelf-aarch64/debian-binary @@ -0,0 +1 @@ +2.0 diff --git a/deps/libelf-aarch64/libelf-dev_0.170-0.4_arm64.deb b/deps/libelf-aarch64/libelf-dev_0.170-0.4_arm64.deb new file mode 100644 index 0000000..bf14d35 Binary files /dev/null and b/deps/libelf-aarch64/libelf-dev_0.170-0.4_arm64.deb differ diff --git a/deps/libelf-aarch64/usr/include/elfutils/elf-knowledge.h b/deps/libelf-aarch64/usr/include/elfutils/elf-knowledge.h new file mode 100644 index 0000000..64f5887 --- /dev/null +++ b/deps/libelf-aarch64/usr/include/elfutils/elf-knowledge.h @@ -0,0 +1,80 @@ +/* Accumulation of various pieces of knowledge about ELF. + Copyright (C) 2000-2012, 2014, 2016 Red Hat, Inc. + This file is part of elfutils. + Written by Ulrich Drepper , 2000. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifndef _ELF_KNOWLEDGE_H +#define _ELF_KNOWLEDGE_H 1 + +#include + + +/* Test whether a section can be stripped or not. */ +#define SECTION_STRIP_P(shdr, name, remove_comment) \ + /* Sections which are allocated are not removed. */ \ + (((shdr)->sh_flags & SHF_ALLOC) == 0 \ + /* We never remove .note sections. */ \ + && (shdr)->sh_type != SHT_NOTE \ + && (((shdr)->sh_type) != SHT_PROGBITS \ + /* Never remove .gnu.warning.* sections. */ \ + || (name != NULL \ + && strncmp (name, ".gnu.warning.", sizeof ".gnu.warning." - 1) != 0\ + /* We remove .comment sections only if explicitly told to do so. */\ + && (remove_comment \ + || strcmp (name, ".comment") != 0)))) + + +/* Test whether `sh_info' field in section header contains a section + index. There are two kinds of sections doing this: + + - the sections containing relocation information reference in this + field the section to which the relocations apply; + + - section with the SHF_INFO_LINK flag set to signal that `sh_info' + references a section. This allows correct handling of unknown + sections. */ +#define SH_INFO_LINK_P(Shdr) \ + ((Shdr)->sh_type == SHT_REL || (Shdr)->sh_type == SHT_RELA \ + || ((Shdr)->sh_flags & SHF_INFO_LINK) != 0) + + +/* Size of an entry in the hash table. The ELF specification says all + entries are regardless of platform 32-bits in size. Early 64-bit + ports (namely Alpha for Linux) got this wrong. The wording was not + clear. + + Several years later the ABI for the 64-bit S390s was developed. + Many things were copied from the IA-64 ABI (which uses the correct + 32-bit entry size) but what do these people do? They use 64-bit + entries. It is really shocking to see what kind of morons are out + there. And even worse: they are allowed to design ABIs. */ +#define SH_ENTSIZE_HASH(Ehdr) \ + ((Ehdr)->e_machine == EM_ALPHA \ + || ((Ehdr)->e_machine == EM_S390 \ + && (Ehdr)->e_ident[EI_CLASS] == ELFCLASS64) ? 8 : 4) + +#endif /* elf-knowledge.h */ diff --git a/deps/libelf-aarch64/usr/include/elfutils/version.h b/deps/libelf-aarch64/usr/include/elfutils/version.h new file mode 100644 index 0000000..5d839e5 --- /dev/null +++ b/deps/libelf-aarch64/usr/include/elfutils/version.h @@ -0,0 +1,38 @@ +/* Version information about elfutils development libraries. + Copyright (C) 2008 Red Hat, Inc. + + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifndef _ELFUTILS_VERSION_H +#define _ELFUTILS_VERSION_H 1 + +#define _ELFUTILS_VERSION 170 + +#define _ELFUTILS_PREREQ(major, minor) \ + (_ELFUTILS_VERSION >= ((major) * 1000 + (minor))) + +#endif /* elfutils/version.h */ diff --git a/deps/libelf-aarch64/usr/include/gelf.h b/deps/libelf-aarch64/usr/include/gelf.h new file mode 100644 index 0000000..0619880 --- /dev/null +++ b/deps/libelf-aarch64/usr/include/gelf.h @@ -0,0 +1,342 @@ +/* This file defines generic ELF types, structures, and macros. + Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005, 2007, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifndef _GELF_H +#define _GELF_H 1 + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Class independent type definitions. Correctly speaking this is not + true. We assume that 64-bit binaries are the largest class and + therefore all other classes can be represented without loss. */ + +/* Type for a 16-bit quantity. */ +typedef Elf64_Half GElf_Half; + +/* Types for signed and unsigned 32-bit quantities. */ +typedef Elf64_Word GElf_Word; +typedef Elf64_Sword GElf_Sword; + +/* Types for signed and unsigned 64-bit quantities. */ +typedef Elf64_Xword GElf_Xword; +typedef Elf64_Sxword GElf_Sxword; + +/* Type of addresses. */ +typedef Elf64_Addr GElf_Addr; + +/* Type of file offsets. */ +typedef Elf64_Off GElf_Off; + + +/* The ELF file header. This appears at the start of every ELF file. */ +typedef Elf64_Ehdr GElf_Ehdr; + +/* Section header. */ +typedef Elf64_Shdr GElf_Shdr; + +/* Section index. */ +/* XXX This should probably be a larger type in preparation of times when + regular section indices can be larger. */ +typedef Elf64_Section GElf_Section; + +/* Symbol table entry. */ +typedef Elf64_Sym GElf_Sym; + +/* The syminfo section if available contains additional information about + every dynamic symbol. */ +typedef Elf64_Syminfo GElf_Syminfo; + +/* Relocation table entry without addend (in section of type SHT_REL). */ +typedef Elf64_Rel GElf_Rel; + +/* Relocation table entry with addend (in section of type SHT_RELA). */ +typedef Elf64_Rela GElf_Rela; + +/* Program segment header. */ +typedef Elf64_Phdr GElf_Phdr; + +/* Header of a compressed section. */ +typedef Elf64_Chdr GElf_Chdr; + +/* Dynamic section entry. */ +typedef Elf64_Dyn GElf_Dyn; + + +/* Version definition sections. */ +typedef Elf64_Verdef GElf_Verdef; + +/* Auxialiary version information. */ +typedef Elf64_Verdaux GElf_Verdaux; + +/* Version dependency section. */ +typedef Elf64_Verneed GElf_Verneed; + +/* Auxiliary needed version information. */ +typedef Elf64_Vernaux GElf_Vernaux; + + +/* Type for version symbol information. */ +typedef Elf64_Versym GElf_Versym; + + +/* Auxiliary vector. */ +typedef Elf64_auxv_t GElf_auxv_t; + + +/* Note section contents. */ +typedef Elf64_Nhdr GElf_Nhdr; + + +/* Move structure. */ +typedef Elf64_Move GElf_Move; + + +/* Library list structure. */ +typedef Elf64_Lib GElf_Lib; + + +/* How to extract and insert information held in the st_info field. */ + +#define GELF_ST_BIND(val) ELF64_ST_BIND (val) +#define GELF_ST_TYPE(val) ELF64_ST_TYPE (val) +#define GELF_ST_INFO(bind, type) ELF64_ST_INFO (bind, type) + +/* How to extract information held in the st_other field. */ + +#define GELF_ST_VISIBILITY(val) ELF64_ST_VISIBILITY (val) + + +/* How to extract and insert information held in the r_info field. */ + +#define GELF_R_SYM(info) ELF64_R_SYM (info) +#define GELF_R_TYPE(info) ELF64_R_TYPE (info) +#define GELF_R_INFO(sym, type) ELF64_R_INFO (sym, type) + + +/* How to extract and insert information held in the m_info field. */ +#define GELF_M_SYM(info) ELF64_M_SYM (info) +#define GELF_M_SIZE(info) ELF64_M_SIZE (info) +#define GELF_M_INFO(sym, size) ELF64_M_INFO (sym, size) + + +/* Get class of the file associated with ELF. */ +extern int gelf_getclass (Elf *__elf); + + +/* Return size of array of COUNT elements of the type denoted by TYPE + in the external representation. The binary class is taken from ELF. + The result is based on version VERSION of the ELF standard. */ +extern size_t gelf_fsize (Elf *__elf, Elf_Type __type, size_t __count, + unsigned int __version); + +/* Retrieve object file header. */ +extern GElf_Ehdr *gelf_getehdr (Elf *__elf, GElf_Ehdr *__dest); + +/* Update the ELF header. */ +extern int gelf_update_ehdr (Elf *__elf, GElf_Ehdr *__src); + +/* Create new ELF header if none exists. Creates an Elf32_Ehdr if CLASS + is ELFCLASS32 or an Elf64_Ehdr if CLASS is ELFCLASS64. Returns NULL + on error. */ +extern void *gelf_newehdr (Elf *__elf, int __class); + +/* Get section at OFFSET. */ +extern Elf_Scn *gelf_offscn (Elf *__elf, GElf_Off __offset); + +/* Retrieve section header. */ +extern GElf_Shdr *gelf_getshdr (Elf_Scn *__scn, GElf_Shdr *__dst); + +/* Update section header. */ +extern int gelf_update_shdr (Elf_Scn *__scn, GElf_Shdr *__src); + +/* Retrieve program header table entry. */ +extern GElf_Phdr *gelf_getphdr (Elf *__elf, int __ndx, GElf_Phdr *__dst); + +/* Update the program header. */ +extern int gelf_update_phdr (Elf *__elf, int __ndx, GElf_Phdr *__src); + +/* Create new program header with PHNUM entries. Creates either an + Elf32_Phdr or an Elf64_Phdr depending on whether the given ELF is + ELFCLASS32 or ELFCLASS64. Returns NULL on error. */ +extern void *gelf_newphdr (Elf *__elf, size_t __phnum); + +/* Get compression header of section if any. Returns NULL and sets + elf_errno if the section isn't compressed or an error occurred. */ +extern GElf_Chdr *gelf_getchdr (Elf_Scn *__scn, GElf_Chdr *__dst); + +/* Convert data structure from the representation in the file represented + by ELF to their memory representation. */ +extern Elf_Data *gelf_xlatetom (Elf *__elf, Elf_Data *__dest, + const Elf_Data *__src, unsigned int __encode); + +/* Convert data structure from to the representation in memory + represented by ELF file representation. */ +extern Elf_Data *gelf_xlatetof (Elf *__elf, Elf_Data *__dest, + const Elf_Data *__src, unsigned int __encode); + + +/* Retrieve REL relocation info at the given index. */ +extern GElf_Rel *gelf_getrel (Elf_Data *__data, int __ndx, GElf_Rel *__dst); + +/* Retrieve RELA relocation info at the given index. */ +extern GElf_Rela *gelf_getrela (Elf_Data *__data, int __ndx, GElf_Rela *__dst); + +/* Update REL relocation information at given index. */ +extern int gelf_update_rel (Elf_Data *__dst, int __ndx, GElf_Rel *__src); + +/* Update RELA relocation information at given index. */ +extern int gelf_update_rela (Elf_Data *__dst, int __ndx, GElf_Rela *__src); + + +/* Retrieve symbol information from the symbol table at the given index. */ +extern GElf_Sym *gelf_getsym (Elf_Data *__data, int __ndx, GElf_Sym *__dst); + +/* Update symbol information in the symbol table at the given index. */ +extern int gelf_update_sym (Elf_Data *__data, int __ndx, GElf_Sym *__src); + + +/* Retrieve symbol information and separate section index from the + symbol table at the given index. */ +extern GElf_Sym *gelf_getsymshndx (Elf_Data *__symdata, Elf_Data *__shndxdata, + int __ndx, GElf_Sym *__sym, + Elf32_Word *__xshndx); + +/* Update symbol information and separate section index in the symbol + table at the given index. */ +extern int gelf_update_symshndx (Elf_Data *__symdata, Elf_Data *__shndxdata, + int __ndx, GElf_Sym *__sym, + Elf32_Word __xshndx); + + +/* Retrieve additional symbol information from the symbol table at the + given index. */ +extern GElf_Syminfo *gelf_getsyminfo (Elf_Data *__data, int __ndx, + GElf_Syminfo *__dst); + +/* Update additional symbol information in the symbol table at the + given index. */ +extern int gelf_update_syminfo (Elf_Data *__data, int __ndx, + GElf_Syminfo *__src); + + +/* Get information from dynamic table at the given index. */ +extern GElf_Dyn *gelf_getdyn (Elf_Data *__data, int __ndx, GElf_Dyn *__dst); + +/* Update information in dynamic table at the given index. */ +extern int gelf_update_dyn (Elf_Data *__dst, int __ndx, GElf_Dyn *__src); + + +/* Get move structure at the given index. */ +extern GElf_Move *gelf_getmove (Elf_Data *__data, int __ndx, GElf_Move *__dst); + +/* Update move structure at the given index. */ +extern int gelf_update_move (Elf_Data *__data, int __ndx, + GElf_Move *__src); + + +/* Get library from table at the given index. */ +extern GElf_Lib *gelf_getlib (Elf_Data *__data, int __ndx, GElf_Lib *__dst); + +/* Update library in table at the given index. */ +extern int gelf_update_lib (Elf_Data *__data, int __ndx, GElf_Lib *__src); + + + +/* Retrieve symbol version information at given index. */ +extern GElf_Versym *gelf_getversym (Elf_Data *__data, int __ndx, + GElf_Versym *__dst); + +/* Update symbol version information. */ +extern int gelf_update_versym (Elf_Data *__data, int __ndx, + GElf_Versym *__src); + + +/* Retrieve required symbol version information at given offset. */ +extern GElf_Verneed *gelf_getverneed (Elf_Data *__data, int __offset, + GElf_Verneed *__dst); + +/* Update required symbol version information. */ +extern int gelf_update_verneed (Elf_Data *__data, int __offset, + GElf_Verneed *__src); + +/* Retrieve additional required symbol version information at given offset. */ +extern GElf_Vernaux *gelf_getvernaux (Elf_Data *__data, int __offset, + GElf_Vernaux *__dst); + +/* Update additional required symbol version information. */ +extern int gelf_update_vernaux (Elf_Data *__data, int __offset, + GElf_Vernaux *__src); + + +/* Retrieve symbol version definition information at given offset. */ +extern GElf_Verdef *gelf_getverdef (Elf_Data *__data, int __offset, + GElf_Verdef *__dst); + +/* Update symbol version definition information. */ +extern int gelf_update_verdef (Elf_Data *__data, int __offset, + GElf_Verdef *__src); + +/* Retrieve additional symbol version definition information at given + offset. */ +extern GElf_Verdaux *gelf_getverdaux (Elf_Data *__data, int __offset, + GElf_Verdaux *__dst); + +/* Update additional symbol version definition information. */ +extern int gelf_update_verdaux (Elf_Data *__data, int __offset, + GElf_Verdaux *__src); + + +/* Get auxv entry at the given index. */ +extern GElf_auxv_t *gelf_getauxv (Elf_Data *__data, int __ndx, + GElf_auxv_t *__dst); + +/* Update auxv entry at the given index. */ +extern int gelf_update_auxv (Elf_Data *__data, int __ndx, GElf_auxv_t *__src); + + +/* Get note header at the given offset into the data, and the offsets of + the note's name and descriptor data. Returns the offset of the next + note header, or 0 for an invalid offset or corrupt note header. */ +extern size_t gelf_getnote (Elf_Data *__data, size_t __offset, + GElf_Nhdr *__result, + size_t *__name_offset, size_t *__desc_offset); + + +/* Compute simple checksum from permanent parts of the ELF file. */ +extern long int gelf_checksum (Elf *__elf); + +#ifdef __cplusplus +} +#endif + +#endif /* gelf.h */ diff --git a/deps/libelf-aarch64/usr/include/libelf.h b/deps/libelf-aarch64/usr/include/libelf.h new file mode 100644 index 0000000..547c0f5 --- /dev/null +++ b/deps/libelf-aarch64/usr/include/libelf.h @@ -0,0 +1,515 @@ +/* Interface for libelf. + Copyright (C) 1998-2010, 2015 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifndef _LIBELF_H +#define _LIBELF_H 1 + +#include +#include + +/* Get the ELF types. */ +#include + +#ifndef SHF_COMPRESSED + /* Older glibc elf.h might not yet define the ELF compression types. */ + #define SHF_COMPRESSED (1 << 11) /* Section with compressed data. */ + + /* Section compression header. Used when SHF_COMPRESSED is set. */ + + typedef struct + { + Elf32_Word ch_type; /* Compression format. */ + Elf32_Word ch_size; /* Uncompressed data size. */ + Elf32_Word ch_addralign; /* Uncompressed data alignment. */ + } Elf32_Chdr; + + typedef struct + { + Elf64_Word ch_type; /* Compression format. */ + Elf64_Word ch_reserved; + Elf64_Xword ch_size; /* Uncompressed data size. */ + Elf64_Xword ch_addralign; /* Uncompressed data alignment. */ + } Elf64_Chdr; + + /* Legal values for ch_type (compression algorithm). */ + #define ELFCOMPRESS_ZLIB 1 /* ZLIB/DEFLATE algorithm. */ + #define ELFCOMPRESS_LOOS 0x60000000 /* Start of OS-specific. */ + #define ELFCOMPRESS_HIOS 0x6fffffff /* End of OS-specific. */ + #define ELFCOMPRESS_LOPROC 0x70000000 /* Start of processor-specific. */ + #define ELFCOMPRESS_HIPROC 0x7fffffff /* End of processor-specific. */ +#endif + +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) +# define __nonnull_attribute__(...) __attribute__ ((__nonnull__ (__VA_ARGS__))) +# define __deprecated_attribute__ __attribute__ ((__deprecated__)) +# define __pure_attribute__ __attribute__ ((__pure__)) +# define __const_attribute__ __attribute__ ((__const__)) +#else +# define __nonnull_attribute__(...) +# define __deprecated_attribute__ +# define __pure_attribute__ +# define __const_attribute__ +#endif + +#if __GNUC__ < 4 +#define __noreturn_attribute__ +#else +#define __noreturn_attribute__ __attribute__ ((noreturn)) +#endif + +#ifdef __GNUC_STDC_INLINE__ +# define __libdw_extern_inline extern __inline __attribute__ ((__gnu_inline__)) +#else +# define __libdw_extern_inline extern __inline +#endif + +/* Known translation types. */ +typedef enum +{ + ELF_T_BYTE, /* unsigned char */ + ELF_T_ADDR, /* Elf32_Addr, Elf64_Addr, ... */ + ELF_T_DYN, /* Dynamic section record. */ + ELF_T_EHDR, /* ELF header. */ + ELF_T_HALF, /* Elf32_Half, Elf64_Half, ... */ + ELF_T_OFF, /* Elf32_Off, Elf64_Off, ... */ + ELF_T_PHDR, /* Program header. */ + ELF_T_RELA, /* Relocation entry with addend. */ + ELF_T_REL, /* Relocation entry. */ + ELF_T_SHDR, /* Section header. */ + ELF_T_SWORD, /* Elf32_Sword, Elf64_Sword, ... */ + ELF_T_SYM, /* Symbol record. */ + ELF_T_WORD, /* Elf32_Word, Elf64_Word, ... */ + ELF_T_XWORD, /* Elf32_Xword, Elf64_Xword, ... */ + ELF_T_SXWORD, /* Elf32_Sxword, Elf64_Sxword, ... */ + ELF_T_VDEF, /* Elf32_Verdef, Elf64_Verdef, ... */ + ELF_T_VDAUX, /* Elf32_Verdaux, Elf64_Verdaux, ... */ + ELF_T_VNEED, /* Elf32_Verneed, Elf64_Verneed, ... */ + ELF_T_VNAUX, /* Elf32_Vernaux, Elf64_Vernaux, ... */ + ELF_T_NHDR, /* Elf32_Nhdr, Elf64_Nhdr, ... */ + ELF_T_SYMINFO, /* Elf32_Syminfo, Elf64_Syminfo, ... */ + ELF_T_MOVE, /* Elf32_Move, Elf64_Move, ... */ + ELF_T_LIB, /* Elf32_Lib, Elf64_Lib, ... */ + ELF_T_GNUHASH, /* GNU-style hash section. */ + ELF_T_AUXV, /* Elf32_auxv_t, Elf64_auxv_t, ... */ + ELF_T_CHDR, /* Compressed, Elf32_Chdr, Elf64_Chdr, ... */ + /* Keep this the last entry. */ + ELF_T_NUM +} Elf_Type; + +/* Descriptor for data to be converted to or from memory format. */ +typedef struct +{ + void *d_buf; /* Pointer to the actual data. */ + Elf_Type d_type; /* Type of this piece of data. */ + unsigned int d_version; /* ELF version. */ + size_t d_size; /* Size in bytes. */ + int64_t d_off; /* Offset into section. */ + size_t d_align; /* Alignment in section. */ +} Elf_Data; + + +/* Commands for `...'. */ +typedef enum +{ + ELF_C_NULL, /* Nothing, terminate, or compute only. */ + ELF_C_READ, /* Read .. */ + ELF_C_RDWR, /* Read and write .. */ + ELF_C_WRITE, /* Write .. */ + ELF_C_CLR, /* Clear flag. */ + ELF_C_SET, /* Set flag. */ + ELF_C_FDDONE, /* Signal that file descriptor will not be + used anymore. */ + ELF_C_FDREAD, /* Read rest of data so that file descriptor + is not used anymore. */ + /* The following are extensions. */ + ELF_C_READ_MMAP, /* Read, but mmap the file if possible. */ + ELF_C_RDWR_MMAP, /* Read and write, with mmap. */ + ELF_C_WRITE_MMAP, /* Write, with mmap. */ + ELF_C_READ_MMAP_PRIVATE, /* Read, but memory is writable, results are + not written to the file. */ + ELF_C_EMPTY, /* Copy basic file data but not the content. */ + /* Keep this the last entry. */ + ELF_C_NUM +} Elf_Cmd; + + +/* Flags for the ELF structures. */ +enum +{ + ELF_F_DIRTY = 0x1, +#define ELF_F_DIRTY ELF_F_DIRTY + ELF_F_LAYOUT = 0x4, +#define ELF_F_LAYOUT ELF_F_LAYOUT + ELF_F_PERMISSIVE = 0x8 +#define ELF_F_PERMISSIVE ELF_F_PERMISSIVE +}; + +/* Flags for elf_compress[_gnu]. */ +enum +{ + ELF_CHF_FORCE = 0x1 +#define ELF_CHF_FORCE ELF_CHF_FORCE +}; + +/* Identification values for recognized object files. */ +typedef enum +{ + ELF_K_NONE, /* Unknown. */ + ELF_K_AR, /* Archive. */ + ELF_K_COFF, /* Stupid old COFF. */ + ELF_K_ELF, /* ELF file. */ + /* Keep this the last entry. */ + ELF_K_NUM +} Elf_Kind; + + +/* Archive member header. */ +typedef struct +{ + char *ar_name; /* Name of archive member. */ + time_t ar_date; /* File date. */ + uid_t ar_uid; /* User ID. */ + gid_t ar_gid; /* Group ID. */ + mode_t ar_mode; /* File mode. */ + int64_t ar_size; /* File size. */ + char *ar_rawname; /* Original name of archive member. */ +} Elf_Arhdr; + + +/* Archive symbol table entry. */ +typedef struct +{ + char *as_name; /* Symbol name. */ + size_t as_off; /* Offset for this file in the archive. */ + unsigned long int as_hash; /* Hash value of the name. */ +} Elf_Arsym; + + +/* Descriptor for the ELF file. */ +typedef struct Elf Elf; + +/* Descriptor for ELF file section. */ +typedef struct Elf_Scn Elf_Scn; + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Return descriptor for ELF file to work according to CMD. */ +extern Elf *elf_begin (int __fildes, Elf_Cmd __cmd, Elf *__ref); + +/* Create a clone of an existing ELF descriptor. */ + extern Elf *elf_clone (Elf *__elf, Elf_Cmd __cmd); + +/* Create descriptor for memory region. */ +extern Elf *elf_memory (char *__image, size_t __size); + +/* Advance archive descriptor to next element. */ +extern Elf_Cmd elf_next (Elf *__elf); + +/* Free resources allocated for ELF. */ +extern int elf_end (Elf *__elf); + +/* Update ELF descriptor and write file to disk. */ +extern int64_t elf_update (Elf *__elf, Elf_Cmd __cmd); + +/* Determine what kind of file is associated with ELF. */ +extern Elf_Kind elf_kind (Elf *__elf) __pure_attribute__; + +/* Get the base offset for an object file. */ +extern int64_t elf_getbase (Elf *__elf); + + +/* Retrieve file identification data. */ +extern char *elf_getident (Elf *__elf, size_t *__nbytes); + +/* Retrieve class-dependent object file header. */ +extern Elf32_Ehdr *elf32_getehdr (Elf *__elf); +/* Similar but this time the binary calls is ELFCLASS64. */ +extern Elf64_Ehdr *elf64_getehdr (Elf *__elf); + +/* Create ELF header if none exists. */ +extern Elf32_Ehdr *elf32_newehdr (Elf *__elf); +/* Similar but this time the binary calls is ELFCLASS64. */ +extern Elf64_Ehdr *elf64_newehdr (Elf *__elf); + +/* Get the number of program headers in the ELF file. If the file uses + more headers than can be represented in the e_phnum field of the ELF + header the information from the sh_info field in the zeroth section + header is used. */ +extern int elf_getphdrnum (Elf *__elf, size_t *__dst); + +/* Retrieve class-dependent program header table. */ +extern Elf32_Phdr *elf32_getphdr (Elf *__elf); +/* Similar but this time the binary calls is ELFCLASS64. */ +extern Elf64_Phdr *elf64_getphdr (Elf *__elf); + +/* Create ELF program header. */ +extern Elf32_Phdr *elf32_newphdr (Elf *__elf, size_t __cnt); +/* Similar but this time the binary calls is ELFCLASS64. */ +extern Elf64_Phdr *elf64_newphdr (Elf *__elf, size_t __cnt); + + +/* Get section at INDEX. */ +extern Elf_Scn *elf_getscn (Elf *__elf, size_t __index); + +/* Get section at OFFSET. */ +extern Elf_Scn *elf32_offscn (Elf *__elf, Elf32_Off __offset); +/* Similar bug this time the binary calls is ELFCLASS64. */ +extern Elf_Scn *elf64_offscn (Elf *__elf, Elf64_Off __offset); + +/* Get index of section. */ +extern size_t elf_ndxscn (Elf_Scn *__scn); + +/* Get section with next section index. */ +extern Elf_Scn *elf_nextscn (Elf *__elf, Elf_Scn *__scn); + +/* Create a new section and append it at the end of the table. */ +extern Elf_Scn *elf_newscn (Elf *__elf); + +/* Get the section index of the extended section index table for the + given symbol table. */ +extern int elf_scnshndx (Elf_Scn *__scn); + +/* Get the number of sections in the ELF file. If the file uses more + sections than can be represented in the e_shnum field of the ELF + header the information from the sh_size field in the zeroth section + header is used. */ +extern int elf_getshdrnum (Elf *__elf, size_t *__dst); +/* Sun messed up the implementation of 'elf_getshnum' in their implementation. + It was agreed to make the same functionality available under a different + name and obsolete the old name. */ +extern int elf_getshnum (Elf *__elf, size_t *__dst) + __deprecated_attribute__; + + +/* Get the section index of the section header string table in the ELF + file. If the index cannot be represented in the e_shnum field of + the ELF header the information from the sh_link field in the zeroth + section header is used. */ +extern int elf_getshdrstrndx (Elf *__elf, size_t *__dst); +/* Sun messed up the implementation of 'elf_getshnum' in their implementation. + It was agreed to make the same functionality available under a different + name and obsolete the old name. */ +extern int elf_getshstrndx (Elf *__elf, size_t *__dst) + __deprecated_attribute__; + + +/* Retrieve section header of ELFCLASS32 binary. */ +extern Elf32_Shdr *elf32_getshdr (Elf_Scn *__scn); +/* Similar for ELFCLASS64. */ +extern Elf64_Shdr *elf64_getshdr (Elf_Scn *__scn); + +/* Returns compression header for a section if section data is + compressed. Returns NULL and sets elf_errno if the section isn't + compressed or an error occurred. */ +extern Elf32_Chdr *elf32_getchdr (Elf_Scn *__scn); +extern Elf64_Chdr *elf64_getchdr (Elf_Scn *__scn); + +/* Compress or decompress the data of a section and adjust the section + header. + + elf_compress works by setting or clearing the SHF_COMPRESS flag + from the section Shdr and will encode or decode a Elf32_Chdr or + Elf64_Chdr at the start of the section data. elf_compress_gnu will + encode or decode any section, but is traditionally only used for + sections that have a name starting with ".debug" when + uncompressed or ".zdebug" when compressed and stores just the + uncompressed size. The GNU compression method is deprecated and + should only be used for legacy support. + + elf_compress takes a compression type that should be either zero to + decompress or an ELFCOMPRESS algorithm to use for compression. + Currently only ELFCOMPRESS_ZLIB is supported. elf_compress_gnu + will compress in the traditional GNU compression format when + compress is one and decompress the section data when compress is + zero. + + The FLAGS argument can be zero or ELF_CHF_FORCE. If FLAGS contains + ELF_CHF_FORCE then it will always compress the section, even if + that would not reduce the size of the data section (including the + header). Otherwise elf_compress and elf_compress_gnu will compress + the section only if the total data size is reduced. + + On successful compression or decompression the function returns + one. If (not forced) compression is requested and the data section + would not actually reduce in size, the section is not actually + compressed and zero is returned. Otherwise -1 is returned and + elf_errno is set. + + It is an error to request compression for a section that already + has SHF_COMPRESSED set, or (for elf_compress) to request + decompression for an section that doesn't have SHF_COMPRESSED set. + It is always an error to call these functions on SHT_NOBITS + sections or if the section has the SHF_ALLOC flag set. + elf_compress_gnu will not check whether the section name starts + with ".debug" or .zdebug". It is the responsibilty of the caller + to make sure the deprecated GNU compression method is only called + on correctly named sections (and to change the name of the section + when using elf_compress_gnu). + + All previous returned Shdrs and Elf_Data buffers are invalidated by + this call and should no longer be accessed. + + Note that although this changes the header and data returned it + doesn't mark the section as dirty. To keep the changes when + calling elf_update the section has to be flagged ELF_F_DIRTY. */ +extern int elf_compress (Elf_Scn *scn, int type, unsigned int flags); +extern int elf_compress_gnu (Elf_Scn *scn, int compress, unsigned int flags); + +/* Set or clear flags for ELF file. */ +extern unsigned int elf_flagelf (Elf *__elf, Elf_Cmd __cmd, + unsigned int __flags); +/* Similarly for the ELF header. */ +extern unsigned int elf_flagehdr (Elf *__elf, Elf_Cmd __cmd, + unsigned int __flags); +/* Similarly for the ELF program header. */ +extern unsigned int elf_flagphdr (Elf *__elf, Elf_Cmd __cmd, + unsigned int __flags); +/* Similarly for the given ELF section. */ +extern unsigned int elf_flagscn (Elf_Scn *__scn, Elf_Cmd __cmd, + unsigned int __flags); +/* Similarly for the given ELF data. */ +extern unsigned int elf_flagdata (Elf_Data *__data, Elf_Cmd __cmd, + unsigned int __flags); +/* Similarly for the given ELF section header. */ +extern unsigned int elf_flagshdr (Elf_Scn *__scn, Elf_Cmd __cmd, + unsigned int __flags); + + +/* Get data from section while translating from file representation to + memory representation. The Elf_Data d_type is set based on the + section type if known. Otherwise d_type is set to ELF_T_BYTE. If + the section contains compressed data then d_type is always set to + ELF_T_CHDR. */ +extern Elf_Data *elf_getdata (Elf_Scn *__scn, Elf_Data *__data); + +/* Get uninterpreted section content. */ +extern Elf_Data *elf_rawdata (Elf_Scn *__scn, Elf_Data *__data); + +/* Create new data descriptor for section SCN. */ +extern Elf_Data *elf_newdata (Elf_Scn *__scn); + +/* Get data translated from a chunk of the file contents as section data + would be for TYPE. The resulting Elf_Data pointer is valid until + elf_end (ELF) is called. */ +extern Elf_Data *elf_getdata_rawchunk (Elf *__elf, + int64_t __offset, size_t __size, + Elf_Type __type); + + +/* Return pointer to string at OFFSET in section INDEX. */ +extern char *elf_strptr (Elf *__elf, size_t __index, size_t __offset); + + +/* Return header of archive. */ +extern Elf_Arhdr *elf_getarhdr (Elf *__elf); + +/* Return offset in archive for current file ELF. */ +extern int64_t elf_getaroff (Elf *__elf); + +/* Select archive element at OFFSET. */ +extern size_t elf_rand (Elf *__elf, size_t __offset); + +/* Get symbol table of archive. */ +extern Elf_Arsym *elf_getarsym (Elf *__elf, size_t *__narsyms); + + +/* Control ELF descriptor. */ +extern int elf_cntl (Elf *__elf, Elf_Cmd __cmd); + +/* Retrieve uninterpreted file contents. */ +extern char *elf_rawfile (Elf *__elf, size_t *__nbytes); + + +/* Return size of array of COUNT elements of the type denoted by TYPE + in the external representation. The binary class is taken from ELF. + The result is based on version VERSION of the ELF standard. */ +extern size_t elf32_fsize (Elf_Type __type, size_t __count, + unsigned int __version) + __const_attribute__; +/* Similar but this time the binary calls is ELFCLASS64. */ +extern size_t elf64_fsize (Elf_Type __type, size_t __count, + unsigned int __version) + __const_attribute__; + + +/* Convert data structure from the representation in the file represented + by ELF to their memory representation. */ +extern Elf_Data *elf32_xlatetom (Elf_Data *__dest, const Elf_Data *__src, + unsigned int __encode); +/* Same for 64 bit class. */ +extern Elf_Data *elf64_xlatetom (Elf_Data *__dest, const Elf_Data *__src, + unsigned int __encode); + +/* Convert data structure from to the representation in memory + represented by ELF file representation. */ +extern Elf_Data *elf32_xlatetof (Elf_Data *__dest, const Elf_Data *__src, + unsigned int __encode); +/* Same for 64 bit class. */ +extern Elf_Data *elf64_xlatetof (Elf_Data *__dest, const Elf_Data *__src, + unsigned int __encode); + + +/* Return error code of last failing function call. This value is kept + separately for each thread. */ +extern int elf_errno (void); + +/* Return error string for ERROR. If ERROR is zero, return error string + for most recent error or NULL is none occurred. If ERROR is -1 the + behaviour is similar to the last case except that not NULL but a legal + string is returned. */ +extern const char *elf_errmsg (int __error); + + +/* Coordinate ELF library and application versions. */ +extern unsigned int elf_version (unsigned int __version); + +/* Set fill bytes used to fill holes in data structures. */ +extern void elf_fill (int __fill); + +/* Compute hash value. */ +extern unsigned long int elf_hash (const char *__string) + __pure_attribute__; + +/* Compute hash value using the GNU-specific hash function. */ +extern unsigned long int elf_gnu_hash (const char *__string) + __pure_attribute__; + + +/* Compute simple checksum from permanent parts of the ELF file. */ +extern long int elf32_checksum (Elf *__elf); +/* Similar but this time the binary calls is ELFCLASS64. */ +extern long int elf64_checksum (Elf *__elf); + +#ifdef __cplusplus +} +#endif + +#endif /* libelf.h */ diff --git a/deps/libelf-aarch64/usr/include/nlist.h b/deps/libelf-aarch64/usr/include/nlist.h new file mode 100644 index 0000000..5990918 --- /dev/null +++ b/deps/libelf-aarch64/usr/include/nlist.h @@ -0,0 +1,56 @@ +/* Interface for nlist. + Copyright (C) 1998, 1999, 2000, 2002 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifndef _NLIST_H +#define _NLIST_H 1 + + +/* Symbol list type. */ +struct nlist +{ + char *n_name; /* Symbol name. */ + long int n_value; /* Value of symbol. */ + short int n_scnum; /* Section number found in. */ + unsigned short int n_type; /* Type of symbol. */ + char n_sclass; /* Storage class. */ + char n_numaux; /* Number of auxiliary entries. */ +}; + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Get specified entries from file. */ +extern int nlist (__const char *__filename, struct nlist *__nl); + +#ifdef __cplusplus +} +#endif + +#endif /* nlist.h */ diff --git a/deps/libelf-aarch64/usr/lib/aarch64-linux-gnu/libelf.so b/deps/libelf-aarch64/usr/lib/aarch64-linux-gnu/libelf.so new file mode 120000 index 0000000..92cba5b --- /dev/null +++ b/deps/libelf-aarch64/usr/lib/aarch64-linux-gnu/libelf.so @@ -0,0 +1 @@ +libelf.so.1 \ No newline at end of file diff --git a/deps/libelf-aarch64/usr/lib/aarch64-linux-gnu/pkgconfig/libelf.pc b/deps/libelf-aarch64/usr/lib/aarch64-linux-gnu/pkgconfig/libelf.pc new file mode 100644 index 0000000..3f72a57 --- /dev/null +++ b/deps/libelf-aarch64/usr/lib/aarch64-linux-gnu/pkgconfig/libelf.pc @@ -0,0 +1,14 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=/usr/lib/aarch64-linux-gnu +includedir=${prefix}/include + +Name: libelf +Description: elfutils libelf library to read and write ELF files +Version: 0.170 +URL: http://elfutils.org/ + +Libs: -L${libdir} -lelf +Cflags: -I${includedir} + +Requires.private: zlib diff --git a/deps/libelf-aarch64/usr/lib/libelf.a b/deps/libelf-aarch64/usr/lib/libelf.a new file mode 100644 index 0000000..6b6a8c2 Binary files /dev/null and b/deps/libelf-aarch64/usr/lib/libelf.a differ diff --git a/deps/libelf-aarch64/usr/share/doc/libelf-dev/changelog.Debian.gz b/deps/libelf-aarch64/usr/share/doc/libelf-dev/changelog.Debian.gz new file mode 120000 index 0000000..af50890 --- /dev/null +++ b/deps/libelf-aarch64/usr/share/doc/libelf-dev/changelog.Debian.gz @@ -0,0 +1 @@ +../libelf1/changelog.Debian.gz \ No newline at end of file diff --git a/deps/libelf-aarch64/usr/share/doc/libelf-dev/copyright b/deps/libelf-aarch64/usr/share/doc/libelf-dev/copyright new file mode 100644 index 0000000..a55e6d7 --- /dev/null +++ b/deps/libelf-aarch64/usr/share/doc/libelf-dev/copyright @@ -0,0 +1,71 @@ +This package was debianized by Kurt Roeckx on +Sun, 21 May 2006 15:03:01 +0000. + +It was downloaded from +https://sourceware.org/elfutils/ftp/0.168/ + +It was original a .tar.bz2. It has been decompressed and +recompressed again using gzip. + +Copyright Holder: + Copyright (C) 2000 - 2016 Red Hat, Inc. + + Written by: + Ulrich Drepper + Jeff Johnson + Alexander Larsson + Jakub Jelinek + Roland McGrath + + +License: + +Most of the libraries (lib, libelf, libebl, libdw, libdwfl) have the following license: + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +The other files are covered by the following license: + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License version 2 can be found in +`/usr/share/common-licenses/GPL-2', the complete text of the GNU +General Public License version 3 can be found in +`/usr/share/common-licenses/GPL-3' and the complete text of the GNU +Lesser General Public License version 3 can be found in +`/usr/share/common-licenses/LGPL-'. + diff --git a/deps/zlib-1.2.10/CMakeLists.txt b/deps/zlib-1.2.10/CMakeLists.txt new file mode 100644 index 0000000..1a954a6 --- /dev/null +++ b/deps/zlib-1.2.10/CMakeLists.txt @@ -0,0 +1,249 @@ +cmake_minimum_required(VERSION 2.4.4) +set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) + +project(zlib C) + +set(VERSION "1.2.10") + +option(ASM686 "Enable building i686 assembly implementation") +option(AMD64 "Enable building amd64 assembly implementation") + +set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") +set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") +set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") +set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages") +set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files") + +include(CheckTypeSize) +include(CheckFunctionExists) +include(CheckIncludeFile) +include(CheckCSourceCompiles) +enable_testing() + +check_include_file(sys/types.h HAVE_SYS_TYPES_H) +check_include_file(stdint.h HAVE_STDINT_H) +check_include_file(stddef.h HAVE_STDDEF_H) + +# +# Check to see if we have large file support +# +set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1) +# We add these other definitions here because CheckTypeSize.cmake +# in CMake 2.4.x does not automatically do so and we want +# compatibility with CMake 2.4.x. +if(HAVE_SYS_TYPES_H) + list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H) +endif() +if(HAVE_STDINT_H) + list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H) +endif() +if(HAVE_STDDEF_H) + list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H) +endif() +check_type_size(off64_t OFF64_T) +if(HAVE_OFF64_T) + add_definitions(-D_LARGEFILE64_SOURCE=1) +endif() +set(CMAKE_REQUIRED_DEFINITIONS) # clear variable + +# +# Check for fseeko +# +check_function_exists(fseeko HAVE_FSEEKO) +if(NOT HAVE_FSEEKO) + add_definitions(-DNO_FSEEKO) +endif() + +# +# Check for unistd.h +# +check_include_file(unistd.h Z_HAVE_UNISTD_H) + +if(MSVC) + set(CMAKE_DEBUG_POSTFIX "d") + add_definitions(-D_CRT_SECURE_NO_DEPRECATE) + add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) + include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +endif() + +if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) + # If we're doing an out of source build and the user has a zconf.h + # in their source tree... + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h) + message(STATUS "Renaming") + message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h") + message(STATUS "to 'zconf.h.included' because this file is included with zlib") + message(STATUS "but CMake generates it automatically in the build directory.") + file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included) + endif() +endif() + +set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc) +configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein + ${ZLIB_PC} @ONLY) +configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein + ${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY) +include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}) + + +#============================================================================ +# zlib +#============================================================================ + +set(ZLIB_PUBLIC_HDRS + ${CMAKE_CURRENT_BINARY_DIR}/zconf.h + zlib.h +) +set(ZLIB_PRIVATE_HDRS + crc32.h + deflate.h + gzguts.h + inffast.h + inffixed.h + inflate.h + inftrees.h + trees.h + zutil.h +) +set(ZLIB_SRCS + adler32.c + compress.c + crc32.c + deflate.c + gzclose.c + gzlib.c + gzread.c + gzwrite.c + inflate.c + infback.c + inftrees.c + inffast.c + trees.c + uncompr.c + zutil.c +) + +if(NOT MINGW) + set(ZLIB_DLL_SRCS + win32/zlib1.rc # If present will override custom build rule below. + ) +endif() + +if(CMAKE_COMPILER_IS_GNUCC) + if(ASM686) + set(ZLIB_ASMS contrib/asm686/match.S) + elseif (AMD64) + set(ZLIB_ASMS contrib/amd64/amd64-match.S) + endif () + + if(ZLIB_ASMS) + add_definitions(-DASMV) + set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE) + endif() +endif() + +if(MSVC) + if(ASM686) + ENABLE_LANGUAGE(ASM_MASM) + set(ZLIB_ASMS + contrib/masmx86/inffas32.asm + contrib/masmx86/match686.asm + ) + elseif (AMD64) + ENABLE_LANGUAGE(ASM_MASM) + set(ZLIB_ASMS + contrib/masmx64/gvmat64.asm + contrib/masmx64/inffasx64.asm + ) + endif() + + if(ZLIB_ASMS) + add_definitions(-DASMV -DASMINF) + endif() +endif() + +# parse the full version number from zlib.h and include in ZLIB_FULL_VERSION +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents) +string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*" + "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents}) + +if(MINGW) + # This gets us DLL resource information when compiling on MinGW. + if(NOT CMAKE_RC_COMPILER) + set(CMAKE_RC_COMPILER windres.exe) + endif() + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj + COMMAND ${CMAKE_RC_COMPILER} + -D GCC_WINDRES + -I ${CMAKE_CURRENT_SOURCE_DIR} + -I ${CMAKE_CURRENT_BINARY_DIR} + -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj + -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc) + set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj) +endif(MINGW) + +add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) +set_target_properties(zlib PROPERTIES SOVERSION 1) + +if(NOT CYGWIN) + # This property causes shared libraries on Linux to have the full version + # encoded into their final filename. We disable this on Cygwin because + # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll + # seems to be the default. + # + # This has no effect with MSVC, on that platform the version info for + # the DLL comes from the resource file win32/zlib1.rc + set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION}) +endif() + +if(UNIX) + # On unix-like platforms the library is almost always called libz + set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z) + if(NOT APPLE) + set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"") + endif() +elseif(BUILD_SHARED_LIBS AND WIN32) + # Creates zlib1.dll when building shared library version + set_target_properties(zlib PROPERTIES SUFFIX "1.dll") +endif() + +if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) + install(TARGETS zlib zlibstatic + RUNTIME DESTINATION "${INSTALL_BIN_DIR}" + ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" ) +endif() +if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL ) + install(FILES ${ZLIB_PUBLIC_HDRS} DESTINATION "${INSTALL_INC_DIR}") +endif() +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) + install(FILES zlib.3 DESTINATION "${INSTALL_MAN_DIR}/man3") +endif() +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) + install(FILES ${ZLIB_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}") +endif() + +#============================================================================ +# Example binaries +#============================================================================ + +add_executable(example test/example.c) +target_link_libraries(example zlib) +add_test(example example) + +add_executable(minigzip test/minigzip.c) +target_link_libraries(minigzip zlib) + +if(HAVE_OFF64_T) + add_executable(example64 test/example.c) + target_link_libraries(example64 zlib) + set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") + add_test(example64 example64) + + add_executable(minigzip64 test/minigzip.c) + target_link_libraries(minigzip64 zlib) + set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") +endif() diff --git a/deps/zlib-1.2.10/ChangeLog b/deps/zlib-1.2.10/ChangeLog new file mode 100644 index 0000000..fed9adb --- /dev/null +++ b/deps/zlib-1.2.10/ChangeLog @@ -0,0 +1,1511 @@ + + ChangeLog file for zlib + +Changes in 1.2.10 (2 Jan 2017) +- Avoid warnings on snprintf() return value +- Fix bug in deflate_stored() for zero-length input +- Fix bug in gzwrite.c that produced corrupt gzip files +- Remove files to be installed before copying them in Makefile.in +- Add warnings when compiling with assembler code + +Changes in 1.2.9 (31 Dec 2016) +- Fix contrib/minizip to permit unzipping with desktop API [Zouzou] +- Improve contrib/blast to return unused bytes +- Assure that gzoffset() is correct when appending +- Improve compress() and uncompress() to support large lengths +- Fix bug in test/example.c where error code not saved +- Remedy Coverity warning [Randers-Pehrson] +- Improve speed of gzprintf() in transparent mode +- Fix inflateInit2() bug when windowBits is 16 or 32 +- Change DEBUG macro to ZLIB_DEBUG +- Avoid uninitialized access by gzclose_w() +- Allow building zlib outside of the source directory +- Fix bug that accepted invalid zlib header when windowBits is zero +- Fix gzseek() problem on MinGW due to buggy _lseeki64 there +- Loop on write() calls in gzwrite.c in case of non-blocking I/O +- Add --warn (-w) option to ./configure for more compiler warnings +- Reject a window size of 256 bytes if not using the zlib wrapper +- Fix bug when level 0 used with Z_HUFFMAN or Z_RLE +- Add --debug (-d) option to ./configure to define ZLIB_DEBUG +- Fix bugs in creating a very large gzip header +- Add uncompress2() function, which returns the input size used +- Assure that deflateParams() will not switch functions mid-block +- Dramatically speed up deflation for level 0 (storing) +- Add gzfread(), duplicating the interface of fread() +- Add gzfwrite(), duplicating the interface of fwrite() +- Add deflateGetDictionary() function +- Use snprintf() for later versions of Microsoft C +- Fix *Init macros to use z_ prefix when requested +- Replace as400 with os400 for OS/400 support [Monnerat] +- Add crc32_z() and adler32_z() functions with size_t lengths +- Update Visual Studio project files [AraHaan] + +Changes in 1.2.8 (28 Apr 2013) +- Update contrib/minizip/iowin32.c for Windows RT [Vollant] +- Do not force Z_CONST for C++ +- Clean up contrib/vstudio [Roß] +- Correct spelling error in zlib.h +- Fix mixed line endings in contrib/vstudio + +Changes in 1.2.7.3 (13 Apr 2013) +- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc + +Changes in 1.2.7.2 (13 Apr 2013) +- Change check for a four-byte type back to hexadecimal +- Fix typo in win32/Makefile.msc +- Add casts in gzwrite.c for pointer differences + +Changes in 1.2.7.1 (24 Mar 2013) +- Replace use of unsafe string functions with snprintf if available +- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink] +- Fix gzgetc undefine when Z_PREFIX set [Turk] +- Eliminate use of mktemp in Makefile (not always available) +- Fix bug in 'F' mode for gzopen() +- Add inflateGetDictionary() function +- Correct comment in deflate.h +- Use _snprintf for snprintf in Microsoft C +- On Darwin, only use /usr/bin/libtool if libtool is not Apple +- Delete "--version" file if created by "ar --version" [Richard G.] +- Fix configure check for veracity of compiler error return codes +- Fix CMake compilation of static lib for MSVC2010 x64 +- Remove unused variable in infback9.c +- Fix argument checks in gzlog_compress() and gzlog_write() +- Clean up the usage of z_const and respect const usage within zlib +- Clean up examples/gzlog.[ch] comparisons of different types +- Avoid shift equal to bits in type (caused endless loop) +- Fix uninitialized value bug in gzputc() introduced by const patches +- Fix memory allocation error in examples/zran.c [Nor] +- Fix bug where gzopen(), gzclose() would write an empty file +- Fix bug in gzclose() when gzwrite() runs out of memory +- Check for input buffer malloc failure in examples/gzappend.c +- Add note to contrib/blast to use binary mode in stdio +- Fix comparisons of differently signed integers in contrib/blast +- Check for invalid code length codes in contrib/puff +- Fix serious but very rare decompression bug in inftrees.c +- Update inflateBack() comments, since inflate() can be faster +- Use underscored I/O function names for WINAPI_FAMILY +- Add _tr_flush_bits to the external symbols prefixed by --zprefix +- Add contrib/vstudio/vc10 pre-build step for static only +- Quote --version-script argument in CMakeLists.txt +- Don't specify --version-script on Apple platforms in CMakeLists.txt +- Fix casting error in contrib/testzlib/testzlib.c +- Fix types in contrib/minizip to match result of get_crc_table() +- Simplify contrib/vstudio/vc10 with 'd' suffix +- Add TOP support to win32/Makefile.msc +- Suport i686 and amd64 assembler builds in CMakeLists.txt +- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h +- Add vc11 and vc12 build files to contrib/vstudio +- Add gzvprintf() as an undocumented function in zlib +- Fix configure for Sun shell +- Remove runtime check in configure for four-byte integer type +- Add casts and consts to ease user conversion to C++ +- Add man pages for minizip and miniunzip +- In Makefile uninstall, don't rm if preceding cd fails +- Do not return Z_BUF_ERROR if deflateParam() has nothing to write + +Changes in 1.2.7 (2 May 2012) +- Replace use of memmove() with a simple copy for portability +- Test for existence of strerror +- Restore gzgetc_ for backward compatibility with 1.2.6 +- Fix build with non-GNU make on Solaris +- Require gcc 4.0 or later on Mac OS X to use the hidden attribute +- Include unistd.h for Watcom C +- Use __WATCOMC__ instead of __WATCOM__ +- Do not use the visibility attribute if NO_VIZ defined +- Improve the detection of no hidden visibility attribute +- Avoid using __int64 for gcc or solo compilation +- Cast to char * in gzprintf to avoid warnings [Zinser] +- Fix make_vms.com for VAX [Zinser] +- Don't use library or built-in byte swaps +- Simplify test and use of gcc hidden attribute +- Fix bug in gzclose_w() when gzwrite() fails to allocate memory +- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() +- Fix bug in test/minigzip.c for configure --solo +- Fix contrib/vstudio project link errors [Mohanathas] +- Add ability to choose the builder in make_vms.com [Schweda] +- Add DESTDIR support to mingw32 win32/Makefile.gcc +- Fix comments in win32/Makefile.gcc for proper usage +- Allow overriding the default install locations for cmake +- Generate and install the pkg-config file with cmake +- Build both a static and a shared version of zlib with cmake +- Include version symbols for cmake builds +- If using cmake with MSVC, add the source directory to the includes +- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] +- Move obsolete emx makefile to old [Truta] +- Allow the use of -Wundef when compiling or using zlib +- Avoid the use of the -u option with mktemp +- Improve inflate() documentation on the use of Z_FINISH +- Recognize clang as gcc +- Add gzopen_w() in Windows for wide character path names +- Rename zconf.h in CMakeLists.txt to move it out of the way +- Add source directory in CMakeLists.txt for building examples +- Look in build directory for zlib.pc in CMakeLists.txt +- Remove gzflags from zlibvc.def in vc9 and vc10 +- Fix contrib/minizip compilation in the MinGW environment +- Update ./configure for Solaris, support --64 [Mooney] +- Remove -R. from Solaris shared build (possible security issue) +- Avoid race condition for parallel make (-j) running example +- Fix type mismatch between get_crc_table() and crc_table +- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] +- Fix the path to zlib.map in CMakeLists.txt +- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] +- Add instructions to win32/Makefile.gcc for shared install [Torri] + +Changes in 1.2.6.1 (12 Feb 2012) +- Avoid the use of the Objective-C reserved name "id" +- Include io.h in gzguts.h for Microsoft compilers +- Fix problem with ./configure --prefix and gzgetc macro +- Include gz_header definition when compiling zlib solo +- Put gzflags() functionality back in zutil.c +- Avoid library header include in crc32.c for Z_SOLO +- Use name in GCC_CLASSIC as C compiler for coverage testing, if set +- Minor cleanup in contrib/minizip/zip.c [Vollant] +- Update make_vms.com [Zinser] +- Remove unnecessary gzgetc_ function +- Use optimized byte swap operations for Microsoft and GNU [Snyder] +- Fix minor typo in zlib.h comments [Rzesniowiecki] + +Changes in 1.2.6 (29 Jan 2012) +- Update the Pascal interface in contrib/pascal +- Fix function numbers for gzgetc_ in zlibvc.def files +- Fix configure.ac for contrib/minizip [Schiffer] +- Fix large-entry detection in minizip on 64-bit systems [Schiffer] +- Have ./configure use the compiler return code for error indication +- Fix CMakeLists.txt for cross compilation [McClure] +- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] +- Fix compilation of contrib/minizip on FreeBSD [Marquez] +- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] +- Include io.h for Turbo C / Borland C on all platforms [Truta] +- Make version explicit in contrib/minizip/configure.ac [Bosmans] +- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] +- Minor cleanup up contrib/minizip/unzip.c [Vollant] +- Fix bug when compiling minizip with C++ [Vollant] +- Protect for long name and extra fields in contrib/minizip [Vollant] +- Avoid some warnings in contrib/minizip [Vollant] +- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip +- Add missing libs to minizip linker command +- Add support for VPATH builds in contrib/minizip +- Add an --enable-demos option to contrib/minizip/configure +- Add the generation of configure.log by ./configure +- Exit when required parameters not provided to win32/Makefile.gcc +- Have gzputc return the character written instead of the argument +- Use the -m option on ldconfig for BSD systems [Tobias] +- Correct in zlib.map when deflateResetKeep was added + +Changes in 1.2.5.3 (15 Jan 2012) +- Restore gzgetc function for binary compatibility +- Do not use _lseeki64 under Borland C++ [Truta] +- Update win32/Makefile.msc to build test/*.c [Truta] +- Remove old/visualc6 given CMakefile and other alternatives +- Update AS400 build files and documentation [Monnerat] +- Update win32/Makefile.gcc to build test/*.c [Truta] +- Permit stronger flushes after Z_BLOCK flushes +- Avoid extraneous empty blocks when doing empty flushes +- Permit Z_NULL arguments to deflatePending +- Allow deflatePrime() to insert bits in the middle of a stream +- Remove second empty static block for Z_PARTIAL_FLUSH +- Write out all of the available bits when using Z_BLOCK +- Insert the first two strings in the hash table after a flush + +Changes in 1.2.5.2 (17 Dec 2011) +- fix ld error: unable to find version dependency 'ZLIB_1.2.5' +- use relative symlinks for shared libs +- Avoid searching past window for Z_RLE strategy +- Assure that high-water mark initialization is always applied in deflate +- Add assertions to fill_window() in deflate.c to match comments +- Update python link in README +- Correct spelling error in gzread.c +- Fix bug in gzgets() for a concatenated empty gzip stream +- Correct error in comment for gz_make() +- Change gzread() and related to ignore junk after gzip streams +- Allow gzread() and related to continue after gzclearerr() +- Allow gzrewind() and gzseek() after a premature end-of-file +- Simplify gzseek() now that raw after gzip is ignored +- Change gzgetc() to a macro for speed (~40% speedup in testing) +- Fix gzclose() to return the actual error last encountered +- Always add large file support for windows +- Include zconf.h for windows large file support +- Include zconf.h.cmakein for windows large file support +- Update zconf.h.cmakein on make distclean +- Merge vestigial vsnprintf determination from zutil.h to gzguts.h +- Clarify how gzopen() appends in zlib.h comments +- Correct documentation of gzdirect() since junk at end now ignored +- Add a transparent write mode to gzopen() when 'T' is in the mode +- Update python link in zlib man page +- Get inffixed.h and MAKEFIXED result to match +- Add a ./config --solo option to make zlib subset with no library use +- Add undocumented inflateResetKeep() function for CAB file decoding +- Add --cover option to ./configure for gcc coverage testing +- Add #define ZLIB_CONST option to use const in the z_stream interface +- Add comment to gzdopen() in zlib.h to use dup() when using fileno() +- Note behavior of uncompress() to provide as much data as it can +- Add files in contrib/minizip to aid in building libminizip +- Split off AR options in Makefile.in and configure +- Change ON macro to Z_ARG to avoid application conflicts +- Facilitate compilation with Borland C++ for pragmas and vsnprintf +- Include io.h for Turbo C / Borland C++ +- Move example.c and minigzip.c to test/ +- Simplify incomplete code table filling in inflate_table() +- Remove code from inflate.c and infback.c that is impossible to execute +- Test the inflate code with full coverage +- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) +- Add deflateResetKeep and fix inflateResetKeep to retain dictionary +- Fix gzwrite.c to accommodate reduced memory zlib compilation +- Have inflate() with Z_FINISH avoid the allocation of a window +- Do not set strm->adler when doing raw inflate +- Fix gzeof() to behave just like feof() when read is not past end of file +- Fix bug in gzread.c when end-of-file is reached +- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF +- Document gzread() capability to read concurrently written files +- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] + +Changes in 1.2.5.1 (10 Sep 2011) +- Update FAQ entry on shared builds (#13) +- Avoid symbolic argument to chmod in Makefile.in +- Fix bug and add consts in contrib/puff [Oberhumer] +- Update contrib/puff/zeros.raw test file to have all block types +- Add full coverage test for puff in contrib/puff/Makefile +- Fix static-only-build install in Makefile.in +- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] +- Add libz.a dependency to shared in Makefile.in for parallel builds +- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out +- Replace $(...) with `...` in configure for non-bash sh [Bowler] +- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] +- Add solaris* to Linux* in configure to allow gcc use [Groffen] +- Add *bsd* to Linux* case in configure [Bar-Lev] +- Add inffast.obj to dependencies in win32/Makefile.msc +- Correct spelling error in deflate.h [Kohler] +- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc +- Add test to configure for GNU C looking for gcc in output of $cc -v +- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] +- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not +- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense +- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) +- Make stronger test in zconf.h to include unistd.h for LFS +- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] +- Fix zlib.h LFS support when Z_PREFIX used +- Add updated as400 support (removed from old) [Monnerat] +- Avoid deflate sensitivity to volatile input data +- Avoid division in adler32_combine for NO_DIVIDE +- Clarify the use of Z_FINISH with deflateBound() amount of space +- Set binary for output file in puff.c +- Use u4 type for crc_table to avoid conversion warnings +- Apply casts in zlib.h to avoid conversion warnings +- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] +- Improve inflateSync() documentation to note indeterminancy +- Add deflatePending() function to return the amount of pending output +- Correct the spelling of "specification" in FAQ [Randers-Pehrson] +- Add a check in configure for stdarg.h, use for gzprintf() +- Check that pointers fit in ints when gzprint() compiled old style +- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] +- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] +- Add debug records in assmebler code [Londer] +- Update RFC references to use http://tools.ietf.org/html/... [Li] +- Add --archs option, use of libtool to configure for Mac OS X [Borstel] + +Changes in 1.2.5 (19 Apr 2010) +- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] +- Default to libdir as sharedlibdir in configure [Nieder] +- Update copyright dates on modified source files +- Update trees.c to be able to generate modified trees.h +- Exit configure for MinGW, suggesting win32/Makefile.gcc +- Check for NULL path in gz_open [Homurlu] + +Changes in 1.2.4.5 (18 Apr 2010) +- Set sharedlibdir in configure [Torok] +- Set LDFLAGS in Makefile.in [Bar-Lev] +- Avoid mkdir objs race condition in Makefile.in [Bowler] +- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays +- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C +- Don't use hidden attribute when it is a warning generator (e.g. Solaris) + +Changes in 1.2.4.4 (18 Apr 2010) +- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] +- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty +- Try to use bash or ksh regardless of functionality of /bin/sh +- Fix configure incompatibility with NetBSD sh +- Remove attempt to run under bash or ksh since have better NetBSD fix +- Fix win32/Makefile.gcc for MinGW [Bar-Lev] +- Add diagnostic messages when using CROSS_PREFIX in configure +- Added --sharedlibdir option to configure [Weigelt] +- Use hidden visibility attribute when available [Frysinger] + +Changes in 1.2.4.3 (10 Apr 2010) +- Only use CROSS_PREFIX in configure for ar and ranlib if they exist +- Use CROSS_PREFIX for nm [Bar-Lev] +- Assume _LARGEFILE64_SOURCE defined is equivalent to true +- Avoid use of undefined symbols in #if with && and || +- Make *64 prototypes in gzguts.h consistent with functions +- Add -shared load option for MinGW in configure [Bowler] +- Move z_off64_t to public interface, use instead of off64_t +- Remove ! from shell test in configure (not portable to Solaris) +- Change +0 macro tests to -0 for possibly increased portability + +Changes in 1.2.4.2 (9 Apr 2010) +- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 +- Really provide prototypes for *64 functions when building without LFS +- Only define unlink() in minigzip.c if unistd.h not included +- Update README to point to contrib/vstudio project files +- Move projects/vc6 to old/ and remove projects/ +- Include stdlib.h in minigzip.c for setmode() definition under WinCE +- Clean up assembler builds in win32/Makefile.msc [Rowe] +- Include sys/types.h for Microsoft for off_t definition +- Fix memory leak on error in gz_open() +- Symbolize nm as $NM in configure [Weigelt] +- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] +- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined +- Fix bug in gzeof() to take into account unused input data +- Avoid initialization of structures with variables in puff.c +- Updated win32/README-WIN32.txt [Rowe] + +Changes in 1.2.4.1 (28 Mar 2010) +- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] +- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] +- Restore "for debugging" comment on sprintf() in gzlib.c +- Remove fdopen for MVS from gzguts.h +- Put new README-WIN32.txt in win32 [Rowe] +- Add check for shell to configure and invoke another shell if needed +- Fix big fat stinking bug in gzseek() on uncompressed files +- Remove vestigial F_OPEN64 define in zutil.h +- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE +- Avoid errors on non-LFS systems when applications define LFS macros +- Set EXE to ".exe" in configure for MINGW [Kahle] +- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] +- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] +- Add DLL install in win32/makefile.gcc [Bar-Lev] +- Allow Linux* or linux* from uname in configure [Bar-Lev] +- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] +- Add cross-compilation prefixes to configure [Bar-Lev] +- Match type exactly in gz_load() invocation in gzread.c +- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func +- Provide prototypes for *64 functions when building zlib without LFS +- Don't use -lc when linking shared library on MinGW +- Remove errno.h check in configure and vestigial errno code in zutil.h + +Changes in 1.2.4 (14 Mar 2010) +- Fix VER3 extraction in configure for no fourth subversion +- Update zlib.3, add docs to Makefile.in to make .pdf out of it +- Add zlib.3.pdf to distribution +- Don't set error code in gzerror() if passed pointer is NULL +- Apply destination directory fixes to CMakeLists.txt [Lowman] +- Move #cmakedefine's to a new zconf.in.cmakein +- Restore zconf.h for builds that don't use configure or cmake +- Add distclean to dummy Makefile for convenience +- Update and improve INDEX, README, and FAQ +- Update CMakeLists.txt for the return of zconf.h [Lowman] +- Update contrib/vstudio/vc9 and vc10 [Vollant] +- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc +- Apply license and readme changes to contrib/asm686 [Raiter] +- Check file name lengths and add -c option in minigzip.c [Li] +- Update contrib/amd64 and contrib/masmx86/ [Vollant] +- Avoid use of "eof" parameter in trees.c to not shadow library variable +- Update make_vms.com for removal of zlibdefs.h [Zinser] +- Update assembler code and vstudio projects in contrib [Vollant] +- Remove outdated assembler code contrib/masm686 and contrib/asm586 +- Remove old vc7 and vc8 from contrib/vstudio +- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] +- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() +- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] +- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) +- Fix bug in void-returning vsprintf() case in gzwrite.c +- Fix name change from inflate.h in contrib/inflate86/inffas86.c +- Check if temporary file exists before removing in make_vms.com [Zinser] +- Fix make install and uninstall for --static option +- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] +- Update readme.txt in contrib/masmx64 and masmx86 to assemble + +Changes in 1.2.3.9 (21 Feb 2010) +- Expunge gzio.c +- Move as400 build information to old +- Fix updates in contrib/minizip and contrib/vstudio +- Add const to vsnprintf test in configure to avoid warnings [Weigelt] +- Delete zconf.h (made by configure) [Weigelt] +- Change zconf.in.h to zconf.h.in per convention [Weigelt] +- Check for NULL buf in gzgets() +- Return empty string for gzgets() with len == 1 (like fgets()) +- Fix description of gzgets() in zlib.h for end-of-file, NULL return +- Update minizip to 1.1 [Vollant] +- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c +- Note in zlib.h that gzerror() should be used to distinguish from EOF +- Remove use of snprintf() from gzlib.c +- Fix bug in gzseek() +- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] +- Fix zconf.h generation in CMakeLists.txt [Lowman] +- Improve comments in zconf.h where modified by configure + +Changes in 1.2.3.8 (13 Feb 2010) +- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] +- Use z_off64_t in gz_zero() and gz_skip() to match state->skip +- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) +- Revert to Makefile.in from 1.2.3.6 (live with the clutter) +- Fix missing error return in gzflush(), add zlib.h note +- Add *64 functions to zlib.map [Levin] +- Fix signed/unsigned comparison in gz_comp() +- Use SFLAGS when testing shared linking in configure +- Add --64 option to ./configure to use -m64 with gcc +- Fix ./configure --help to correctly name options +- Have make fail if a test fails [Levin] +- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] +- Remove assembler object files from contrib + +Changes in 1.2.3.7 (24 Jan 2010) +- Always gzopen() with O_LARGEFILE if available +- Fix gzdirect() to work immediately after gzopen() or gzdopen() +- Make gzdirect() more precise when the state changes while reading +- Improve zlib.h documentation in many places +- Catch memory allocation failure in gz_open() +- Complete close operation if seek forward in gzclose_w() fails +- Return Z_ERRNO from gzclose_r() if close() fails +- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL +- Return zero for gzwrite() errors to match zlib.h description +- Return -1 on gzputs() error to match zlib.h description +- Add zconf.in.h to allow recovery from configure modification [Weigelt] +- Fix static library permissions in Makefile.in [Weigelt] +- Avoid warnings in configure tests that hide functionality [Weigelt] +- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] +- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] +- Avoid access of uninitialized data for first inflateReset2 call [Gomes] +- Keep object files in subdirectories to reduce the clutter somewhat +- Remove default Makefile and zlibdefs.h, add dummy Makefile +- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ +- Remove zlibdefs.h completely -- modify zconf.h instead + +Changes in 1.2.3.6 (17 Jan 2010) +- Avoid void * arithmetic in gzread.c and gzwrite.c +- Make compilers happier with const char * for gz_error message +- Avoid unused parameter warning in inflate.c +- Avoid signed-unsigned comparison warning in inflate.c +- Indent #pragma's for traditional C +- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() +- Correct email address in configure for system options +- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] +- Update zlib.map [Brown] +- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] +- Apply various fixes to CMakeLists.txt [Lowman] +- Add checks on len in gzread() and gzwrite() +- Add error message for no more room for gzungetc() +- Remove zlib version check in gzwrite() +- Defer compression of gzprintf() result until need to +- Use snprintf() in gzdopen() if available +- Remove USE_MMAP configuration determination (only used by minigzip) +- Remove examples/pigz.c (available separately) +- Update examples/gun.c to 1.6 + +Changes in 1.2.3.5 (8 Jan 2010) +- Add space after #if in zutil.h for some compilers +- Fix relatively harmless bug in deflate_fast() [Exarevsky] +- Fix same problem in deflate_slow() +- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] +- Add deflate_rle() for faster Z_RLE strategy run-length encoding +- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding +- Change name of "write" variable in inffast.c to avoid library collisions +- Fix premature EOF from gzread() in gzio.c [Brown] +- Use zlib header window size if windowBits is 0 in inflateInit2() +- Remove compressBound() call in deflate.c to avoid linking compress.o +- Replace use of errno in gz* with functions, support WinCE [Alves] +- Provide alternative to perror() in minigzip.c for WinCE [Alves] +- Don't use _vsnprintf on later versions of MSVC [Lowman] +- Add CMake build script and input file [Lowman] +- Update contrib/minizip to 1.1 [Svensson, Vollant] +- Moved nintendods directory from contrib to . +- Replace gzio.c with a new set of routines with the same functionality +- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above +- Update contrib/minizip to 1.1b +- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h + +Changes in 1.2.3.4 (21 Dec 2009) +- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility +- Update comments in configure and Makefile.in for default --shared +- Fix test -z's in configure [Marquess] +- Build examplesh and minigzipsh when not testing +- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h +- Import LDFLAGS from the environment in configure +- Fix configure to populate SFLAGS with discovered CFLAGS options +- Adapt make_vms.com to the new Makefile.in [Zinser] +- Add zlib2ansi script for C++ compilation [Marquess] +- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) +- Add AMD64 assembler code for longest match to contrib [Teterin] +- Include options from $SFLAGS when doing $LDSHARED +- Simplify 64-bit file support by introducing z_off64_t type +- Make shared object files in objs directory to work around old Sun cc +- Use only three-part version number for Darwin shared compiles +- Add rc option to ar in Makefile.in for when ./configure not run +- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* +- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile +- Protect against _FILE_OFFSET_BITS being defined when compiling zlib +- Rename Makefile.in targets allstatic to static and allshared to shared +- Fix static and shared Makefile.in targets to be independent +- Correct error return bug in gz_open() by setting state [Brown] +- Put spaces before ;;'s in configure for better sh compatibility +- Add pigz.c (parallel implementation of gzip) to examples/ +- Correct constant in crc32.c to UL [Leventhal] +- Reject negative lengths in crc32_combine() +- Add inflateReset2() function to work like inflateEnd()/inflateInit2() +- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] +- Correct typo in doc/algorithm.txt [Janik] +- Fix bug in adler32_combine() [Zhu] +- Catch missing-end-of-block-code error in all inflates and in puff + Assures that random input to inflate eventually results in an error +- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ +- Update ENOUGH and its usage to reflect discovered bounds +- Fix gzerror() error report on empty input file [Brown] +- Add ush casts in trees.c to avoid pedantic runtime errors +- Fix typo in zlib.h uncompress() description [Reiss] +- Correct inflate() comments with regard to automatic header detection +- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) +- Put new version of gzlog (2.0) in examples with interruption recovery +- Add puff compile option to permit invalid distance-too-far streams +- Add puff TEST command options, ability to read piped input +- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but + _LARGEFILE64_SOURCE not defined +- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart +- Fix deflateSetDictionary() to use all 32K for output consistency +- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) +- Clear bytes after deflate lookahead to avoid use of uninitialized data +- Change a limit in inftrees.c to be more transparent to Coverity Prevent +- Update win32/zlib.def with exported symbols from zlib.h +- Correct spelling errors in zlib.h [Willem, Sobrado] +- Allow Z_BLOCK for deflate() to force a new block +- Allow negative bits in inflatePrime() to delete existing bit buffer +- Add Z_TREES flush option to inflate() to return at end of trees +- Add inflateMark() to return current state information for random access +- Add Makefile for NintendoDS to contrib [Costa] +- Add -w in configure compile tests to avoid spurious warnings [Beucler] +- Fix typos in zlib.h comments for deflateSetDictionary() +- Fix EOF detection in transparent gzread() [Maier] + +Changes in 1.2.3.3 (2 October 2006) +- Make --shared the default for configure, add a --static option +- Add compile option to permit invalid distance-too-far streams +- Add inflateUndermine() function which is required to enable above +- Remove use of "this" variable name for C++ compatibility [Marquess] +- Add testing of shared library in make test, if shared library built +- Use ftello() and fseeko() if available instead of ftell() and fseek() +- Provide two versions of all functions that use the z_off_t type for + binary compatibility -- a normal version and a 64-bit offset version, + per the Large File Support Extension when _LARGEFILE64_SOURCE is + defined; use the 64-bit versions by default when _FILE_OFFSET_BITS + is defined to be 64 +- Add a --uname= option to configure to perhaps help with cross-compiling + +Changes in 1.2.3.2 (3 September 2006) +- Turn off silly Borland warnings [Hay] +- Use off64_t and define _LARGEFILE64_SOURCE when present +- Fix missing dependency on inffixed.h in Makefile.in +- Rig configure --shared to build both shared and static [Teredesai, Truta] +- Remove zconf.in.h and instead create a new zlibdefs.h file +- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] +- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] + +Changes in 1.2.3.1 (16 August 2006) +- Add watcom directory with OpenWatcom make files [Daniel] +- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] +- Update make_vms.com [Zinser] +- Use -fPIC for shared build in configure [Teredesai, Nicholson] +- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] +- Use fdopen() (not _fdopen()) for Interix in zutil.h [Bäck] +- Add some FAQ entries about the contrib directory +- Update the MVS question in the FAQ +- Avoid extraneous reads after EOF in gzio.c [Brown] +- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] +- Add comments to zlib.h about gzerror() usage [Brown] +- Set extra flags in gzip header in gzopen() like deflate() does +- Make configure options more compatible with double-dash conventions + [Weigelt] +- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] +- Fix uninstall target in Makefile.in [Truta] +- Add pkgconfig support [Weigelt] +- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] +- Replace set_data_type() with a more accurate detect_data_type() in + trees.c, according to the txtvsbin.txt document [Truta] +- Swap the order of #include and #include "zlib.h" in + gzio.c, example.c and minigzip.c [Truta] +- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, + Truta] (where?) +- Fix target "clean" from win32/Makefile.bor [Truta] +- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] +- Update zlib www home address in win32/DLL_FAQ.txt [Truta] +- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] +- Enable browse info in the "Debug" and "ASM Debug" configurations in + the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] +- Add pkgconfig support [Weigelt] +- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, + for use in win32/zlib1.rc [Polushin, Rowe, Truta] +- Add a document that explains the new text detection scheme to + doc/txtvsbin.txt [Truta] +- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] +- Move algorithm.txt into doc/ [Truta] +- Synchronize FAQ with website +- Fix compressBound(), was low for some pathological cases [Fearnley] +- Take into account wrapper variations in deflateBound() +- Set examples/zpipe.c input and output to binary mode for Windows +- Update examples/zlib_how.html with new zpipe.c (also web site) +- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems + that gcc became pickier in 4.0) +- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain + un-versioned, the patch adds versioning only for symbols introduced in + zlib-1.2.0 or later. It also declares as local those symbols which are + not designed to be exported." [Levin] +- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure +- Do not initialize global static by default in trees.c, add a response + NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] +- Don't use strerror() in gzio.c under WinCE [Yakimov] +- Don't use errno.h in zutil.h under WinCE [Yakimov] +- Move arguments for AR to its usage to allow replacing ar [Marot] +- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] +- Improve inflateInit() and inflateInit2() documentation +- Fix structure size comment in inflate.h +- Change configure help option from --h* to --help [Santos] + +Changes in 1.2.3 (18 July 2005) +- Apply security vulnerability fixes to contrib/infback9 as well +- Clean up some text files (carriage returns, trailing space) +- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] + +Changes in 1.2.2.4 (11 July 2005) +- Add inflatePrime() function for starting inflation at bit boundary +- Avoid some Visual C warnings in deflate.c +- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit + compile +- Fix some spelling errors in comments [Betts] +- Correct inflateInit2() error return documentation in zlib.h +- Add zran.c example of compressed data random access to examples + directory, shows use of inflatePrime() +- Fix cast for assignments to strm->state in inflate.c and infback.c +- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] +- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] +- Add cast in trees.c t avoid a warning [Oberhumer] +- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] +- Update make_vms.com [Zinser] +- Initialize state->write in inflateReset() since copied in inflate_fast() +- Be more strict on incomplete code sets in inflate_table() and increase + ENOUGH and MAXD -- this repairs a possible security vulnerability for + invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for + discovering the vulnerability and providing test cases. +- Add ia64 support to configure for HP-UX [Smith] +- Add error return to gzread() for format or i/o error [Levin] +- Use malloc.h for OS/2 [Necasek] + +Changes in 1.2.2.3 (27 May 2005) +- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile +- Typecast fread() return values in gzio.c [Vollant] +- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) +- Fix crc check bug in gzread() after gzungetc() [Heiner] +- Add the deflateTune() function to adjust internal compression parameters +- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) +- Remove an incorrect assertion in examples/zpipe.c +- Add C++ wrapper in infback9.h [Donais] +- Fix bug in inflateCopy() when decoding fixed codes +- Note in zlib.h how much deflateSetDictionary() actually uses +- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) +- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] +- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] +- Add gzdirect() function to indicate transparent reads +- Update contrib/minizip [Vollant] +- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] +- Add casts in crc32.c to avoid warnings [Oberhumer] +- Add contrib/masmx64 [Vollant] +- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] + +Changes in 1.2.2.2 (30 December 2004) +- Replace structure assignments in deflate.c and inflate.c with zmemcpy to + avoid implicit memcpy calls (portability for no-library compilation) +- Increase sprintf() buffer size in gzdopen() to allow for large numbers +- Add INFLATE_STRICT to check distances against zlib header +- Improve WinCE errno handling and comments [Chang] +- Remove comment about no gzip header processing in FAQ +- Add Z_FIXED strategy option to deflateInit2() to force fixed trees +- Add updated make_vms.com [Coghlan], update README +- Create a new "examples" directory, move gzappend.c there, add zpipe.c, + fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. +- Add FAQ entry and comments in deflate.c on uninitialized memory access +- Add Solaris 9 make options in configure [Gilbert] +- Allow strerror() usage in gzio.c for STDC +- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] +- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] +- Use z_off_t for adler32_combine() and crc32_combine() lengths +- Make adler32() much faster for small len +- Use OS_CODE in deflate() default gzip header + +Changes in 1.2.2.1 (31 October 2004) +- Allow inflateSetDictionary() call for raw inflate +- Fix inflate header crc check bug for file names and comments +- Add deflateSetHeader() and gz_header structure for custom gzip headers +- Add inflateGetheader() to retrieve gzip headers +- Add crc32_combine() and adler32_combine() functions +- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list +- Use zstreamp consistently in zlib.h (inflate_back functions) +- Remove GUNZIP condition from definition of inflate_mode in inflate.h + and in contrib/inflate86/inffast.S [Truta, Anderson] +- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] +- Update projects/README.projects and projects/visualc6 [Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] +- Deprecate Z_ASCII; use Z_TEXT instead [Truta] +- Use a new algorithm for setting strm->data_type in trees.c [Truta] +- Do not define an exit() prototype in zutil.c unless DEBUG defined +- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] +- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() +- Fix Darwin build version identification [Peterson] + +Changes in 1.2.2 (3 October 2004) +- Update zlib.h comments on gzip in-memory processing +- Set adler to 1 in inflateReset() to support Java test suite [Walles] +- Add contrib/dotzlib [Ravn] +- Update win32/DLL_FAQ.txt [Truta] +- Update contrib/minizip [Vollant] +- Move contrib/visual-basic.txt to old/ [Truta] +- Fix assembler builds in projects/visualc6/ [Truta] + +Changes in 1.2.1.2 (9 September 2004) +- Update INDEX file +- Fix trees.c to update strm->data_type (no one ever noticed!) +- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] +- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) +- Add limited multitasking protection to DYNAMIC_CRC_TABLE +- Add NO_vsnprintf for VMS in zutil.h [Mozilla] +- Don't declare strerror() under VMS [Mozilla] +- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize +- Update contrib/ada [Anisimkov] +- Update contrib/minizip [Vollant] +- Fix configure to not hardcode directories for Darwin [Peterson] +- Fix gzio.c to not return error on empty files [Brown] +- Fix indentation; update version in contrib/delphi/ZLib.pas and + contrib/pascal/zlibpas.pas [Truta] +- Update mkasm.bat in contrib/masmx86 [Truta] +- Update contrib/untgz [Truta] +- Add projects/README.projects [Truta] +- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] +- Remove an unnecessary assignment to curr in inftrees.c [Truta] +- Add OS/2 to exe builds in configure [Poltorak] +- Remove err dummy parameter in zlib.h [Kientzle] + +Changes in 1.2.1.1 (9 January 2004) +- Update email address in README +- Several FAQ updates +- Fix a big fat bug in inftrees.c that prevented decoding valid + dynamic blocks with only literals and no distance codes -- + Thanks to "Hot Emu" for the bug report and sample file +- Add a note to puff.c on no distance codes case. + +Changes in 1.2.1 (17 November 2003) +- Remove a tab in contrib/gzappend/gzappend.c +- Update some interfaces in contrib for new zlib functions +- Update zlib version number in some contrib entries +- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] +- Support shared libraries on Hurd and KFreeBSD [Brown] +- Fix error in NO_DIVIDE option of adler32.c + +Changes in 1.2.0.8 (4 November 2003) +- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas +- Add experimental NO_DIVIDE #define in adler32.c + - Possibly faster on some processors (let me know if it is) +- Correct Z_BLOCK to not return on first inflate call if no wrap +- Fix strm->data_type on inflate() return to correctly indicate EOB +- Add deflatePrime() function for appending in the middle of a byte +- Add contrib/gzappend for an example of appending to a stream +- Update win32/DLL_FAQ.txt [Truta] +- Delete Turbo C comment in README [Truta] +- Improve some indentation in zconf.h [Truta] +- Fix infinite loop on bad input in configure script [Church] +- Fix gzeof() for concatenated gzip files [Johnson] +- Add example to contrib/visual-basic.txt [Michael B.] +- Add -p to mkdir's in Makefile.in [vda] +- Fix configure to properly detect presence or lack of printf functions +- Add AS400 support [Monnerat] +- Add a little Cygwin support [Wilson] + +Changes in 1.2.0.7 (21 September 2003) +- Correct some debug formats in contrib/infback9 +- Cast a type in a debug statement in trees.c +- Change search and replace delimiter in configure from % to # [Beebe] +- Update contrib/untgz to 0.2 with various fixes [Truta] +- Add build support for Amiga [Nikl] +- Remove some directories in old that have been updated to 1.2 +- Add dylib building for Mac OS X in configure and Makefile.in +- Remove old distribution stuff from Makefile +- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X +- Update links in README + +Changes in 1.2.0.6 (13 September 2003) +- Minor FAQ updates +- Update contrib/minizip to 1.00 [Vollant] +- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] +- Update POSTINC comment for 68060 [Nikl] +- Add contrib/infback9 with deflate64 decoding (unsupported) +- For MVS define NO_vsnprintf and undefine FAR [van Burik] +- Add pragma for fdopen on MVS [van Burik] + +Changes in 1.2.0.5 (8 September 2003) +- Add OF to inflateBackEnd() declaration in zlib.h +- Remember start when using gzdopen in the middle of a file +- Use internal off_t counters in gz* functions to properly handle seeks +- Perform more rigorous check for distance-too-far in inffast.c +- Add Z_BLOCK flush option to return from inflate at block boundary +- Set strm->data_type on return from inflate + - Indicate bits unused, if at block boundary, and if in last block +- Replace size_t with ptrdiff_t in crc32.c, and check for correct size +- Add condition so old NO_DEFLATE define still works for compatibility +- FAQ update regarding the Windows DLL [Truta] +- INDEX update: add qnx entry, remove aix entry [Truta] +- Install zlib.3 into mandir [Wilson] +- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] +- Adapt the zlib interface to the new DLL convention guidelines [Truta] +- Introduce ZLIB_WINAPI macro to allow the export of functions using + the WINAPI calling convention, for Visual Basic [Vollant, Truta] +- Update msdos and win32 scripts and makefiles [Truta] +- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] +- Add contrib/ada [Anisimkov] +- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] +- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] +- Add contrib/masm686 [Truta] +- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm + [Truta, Vollant] +- Update contrib/delphi; rename to contrib/pascal; add example [Truta] +- Remove contrib/delphi2; add a new contrib/delphi [Truta] +- Avoid inclusion of the nonstandard in contrib/iostream, + and fix some method prototypes [Truta] +- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip + [Truta] +- Avoid the use of backslash (\) in contrib/minizip [Vollant] +- Fix file time handling in contrib/untgz; update makefiles [Truta] +- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines + [Vollant] +- Remove contrib/vstudio/vc15_16 [Vollant] +- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] +- Update README.contrib [Truta] +- Invert the assignment order of match_head and s->prev[...] in + INSERT_STRING [Truta] +- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings + [Truta] +- Compare function pointers with 0, not with NULL or Z_NULL [Truta] +- Fix prototype of syncsearch in inflate.c [Truta] +- Introduce ASMINF macro to be enabled when using an ASM implementation + of inflate_fast [Truta] +- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] +- Modify test_gzio in example.c to take a single file name as a + parameter [Truta] +- Exit the example.c program if gzopen fails [Truta] +- Add type casts around strlen in example.c [Truta] +- Remove casting to sizeof in minigzip.c; give a proper type + to the variable compared with SUFFIX_LEN [Truta] +- Update definitions of STDC and STDC99 in zconf.h [Truta] +- Synchronize zconf.h with the new Windows DLL interface [Truta] +- Use SYS16BIT instead of __32BIT__ to distinguish between + 16- and 32-bit platforms [Truta] +- Use far memory allocators in small 16-bit memory models for + Turbo C [Truta] +- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in + zlibCompileFlags [Truta] +- Cygwin has vsnprintf [Wilson] +- In Windows16, OS_CODE is 0, as in MSDOS [Truta] +- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] + +Changes in 1.2.0.4 (10 August 2003) +- Minor FAQ updates +- Be more strict when checking inflateInit2's windowBits parameter +- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well +- Add gzip wrapper option to deflateInit2 using windowBits +- Add updated QNX rule in configure and qnx directory [Bonnefoy] +- Make inflate distance-too-far checks more rigorous +- Clean up FAR usage in inflate +- Add casting to sizeof() in gzio.c and minigzip.c + +Changes in 1.2.0.3 (19 July 2003) +- Fix silly error in gzungetc() implementation [Vollant] +- Update contrib/minizip and contrib/vstudio [Vollant] +- Fix printf format in example.c +- Correct cdecl support in zconf.in.h [Anisimkov] +- Minor FAQ updates + +Changes in 1.2.0.2 (13 July 2003) +- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons +- Attempt to avoid warnings in crc32.c for pointer-int conversion +- Add AIX to configure, remove aix directory [Bakker] +- Add some casts to minigzip.c +- Improve checking after insecure sprintf() or vsprintf() calls +- Remove #elif's from crc32.c +- Change leave label to inf_leave in inflate.c and infback.c to avoid + library conflicts +- Remove inflate gzip decoding by default--only enable gzip decoding by + special request for stricter backward compatibility +- Add zlibCompileFlags() function to return compilation information +- More typecasting in deflate.c to avoid warnings +- Remove leading underscore from _Capital #defines [Truta] +- Fix configure to link shared library when testing +- Add some Windows CE target adjustments [Mai] +- Remove #define ZLIB_DLL in zconf.h [Vollant] +- Add zlib.3 [Rodgers] +- Update RFC URL in deflate.c and algorithm.txt [Mai] +- Add zlib_dll_FAQ.txt to contrib [Truta] +- Add UL to some constants [Truta] +- Update minizip and vstudio [Vollant] +- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h +- Expand use of NO_DUMMY_DECL to avoid all dummy structures +- Added iostream3 to contrib [Schwardt] +- Replace rewind() with fseek() for WinCE [Truta] +- Improve setting of zlib format compression level flags + - Report 0 for huffman and rle strategies and for level == 0 or 1 + - Report 2 only for level == 6 +- Only deal with 64K limit when necessary at compile time [Truta] +- Allow TOO_FAR check to be turned off at compile time [Truta] +- Add gzclearerr() function [Souza] +- Add gzungetc() function + +Changes in 1.2.0.1 (17 March 2003) +- Add Z_RLE strategy for run-length encoding [Truta] + - When Z_RLE requested, restrict matches to distance one + - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE +- Correct FASTEST compilation to allow level == 0 +- Clean up what gets compiled for FASTEST +- Incorporate changes to zconf.in.h [Vollant] + - Refine detection of Turbo C need for dummy returns + - Refine ZLIB_DLL compilation + - Include additional header file on VMS for off_t typedef +- Try to use _vsnprintf where it supplants vsprintf [Vollant] +- Add some casts in inffast.c +- Enchance comments in zlib.h on what happens if gzprintf() tries to + write more than 4095 bytes before compression +- Remove unused state from inflateBackEnd() +- Remove exit(0) from minigzip.c, example.c +- Get rid of all those darn tabs +- Add "check" target to Makefile.in that does the same thing as "test" +- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in +- Update contrib/inflate86 [Anderson] +- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] +- Add msdos and win32 directories with makefiles [Truta] +- More additions and improvements to the FAQ + +Changes in 1.2.0 (9 March 2003) +- New and improved inflate code + - About 20% faster + - Does not allocate 32K window unless and until needed + - Automatically detects and decompresses gzip streams + - Raw inflate no longer needs an extra dummy byte at end + - Added inflateBack functions using a callback interface--even faster + than inflate, useful for file utilities (gzip, zip) + - Added inflateCopy() function to record state for random access on + externally generated deflate streams (e.g. in gzip files) + - More readable code (I hope) +- New and improved crc32() + - About 50% faster, thanks to suggestions from Rodney Brown +- Add deflateBound() and compressBound() functions +- Fix memory leak in deflateInit2() +- Permit setting dictionary for raw deflate (for parallel deflate) +- Fix const declaration for gzwrite() +- Check for some malloc() failures in gzio.c +- Fix bug in gzopen() on single-byte file 0x1f +- Fix bug in gzread() on concatenated file with 0x1f at end of buffer + and next buffer doesn't start with 0x8b +- Fix uncompress() to return Z_DATA_ERROR on truncated input +- Free memory at end of example.c +- Remove MAX #define in trees.c (conflicted with some libraries) +- Fix static const's in deflate.c, gzio.c, and zutil.[ch] +- Declare malloc() and free() in gzio.c if STDC not defined +- Use malloc() instead of calloc() in zutil.c if int big enough +- Define STDC for AIX +- Add aix/ with approach for compiling shared library on AIX +- Add HP-UX support for shared libraries in configure +- Add OpenUNIX support for shared libraries in configure +- Use $cc instead of gcc to build shared library +- Make prefix directory if needed when installing +- Correct Macintosh avoidance of typedef Byte in zconf.h +- Correct Turbo C memory allocation when under Linux +- Use libz.a instead of -lz in Makefile (assure use of compiled library) +- Update configure to check for snprintf or vsnprintf functions and their + return value, warn during make if using an insecure function +- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that + is lost when library is used--resolution is to build new zconf.h +- Documentation improvements (in zlib.h): + - Document raw deflate and inflate + - Update RFCs URL + - Point out that zlib and gzip formats are different + - Note that Z_BUF_ERROR is not fatal + - Document string limit for gzprintf() and possible buffer overflow + - Note requirement on avail_out when flushing + - Note permitted values of flush parameter of inflate() +- Add some FAQs (and even answers) to the FAQ +- Add contrib/inflate86/ for x86 faster inflate +- Add contrib/blast/ for PKWare Data Compression Library decompression +- Add contrib/puff/ simple inflate for deflate format description + +Changes in 1.1.4 (11 March 2002) +- ZFREE was repeated on same allocation on some error conditions. + This creates a security problem described in + http://www.zlib.org/advisory-2002-03-11.txt +- Returned incorrect error (Z_MEM_ERROR) on some invalid data +- Avoid accesses before window for invalid distances with inflate window + less than 32K. +- force windowBits > 8 to avoid a bug in the encoder for a window size + of 256 bytes. (A complete fix will be available in 1.1.5). + +Changes in 1.1.3 (9 July 1998) +- fix "an inflate input buffer bug that shows up on rare but persistent + occasions" (Mark) +- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) +- fix gzseek(..., SEEK_SET) in write mode +- fix crc check after a gzeek (Frank Faubert) +- fix miniunzip when the last entry in a zip file is itself a zip file + (J Lillge) +- add contrib/asm586 and contrib/asm686 (Brian Raiter) + See http://www.muppetlabs.com/~breadbox/software/assembly.html +- add support for Delphi 3 in contrib/delphi (Bob Dellaca) +- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) +- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) +- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) +- added a FAQ file + +- Support gzdopen on Mac with Metrowerks (Jason Linhart) +- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) +- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) +- avoid some warnings with Borland C (Tom Tanner) +- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) +- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) +- allow several arguments to configure (Tim Mooney, Frodo Looijaard) +- use libdir and includedir in Makefile.in (Tim Mooney) +- support shared libraries on OSF1 V4 (Tim Mooney) +- remove so_locations in "make clean" (Tim Mooney) +- fix maketree.c compilation error (Glenn, Mark) +- Python interface to zlib now in Python 1.5 (Jeremy Hylton) +- new Makefile.riscos (Rich Walker) +- initialize static descriptors in trees.c for embedded targets (Nick Smith) +- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) +- add the OS/2 files in Makefile.in too (Andrew Zabolotny) +- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) +- fix maketree.c to allow clean compilation of inffixed.h (Mark) +- fix parameter check in deflateCopy (Gunther Nikl) +- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) +- Many portability patches by Christian Spieler: + . zutil.c, zutil.h: added "const" for zmem* + . Make_vms.com: fixed some typos + . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists + . msdos/Makefile.msc: remove "default rtl link library" info from obj files + . msdos/Makefile.*: use model-dependent name for the built zlib library + . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: + new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) +- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) +- replace __far with _far for better portability (Christian Spieler, Tom Lane) +- fix test for errno.h in configure (Tim Newsham) + +Changes in 1.1.2 (19 March 98) +- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) + See http://www.winimage.com/zLibDll/unzip.html +- preinitialize the inflate tables for fixed codes, to make the code + completely thread safe (Mark) +- some simplifications and slight speed-up to the inflate code (Mark) +- fix gzeof on non-compressed files (Allan Schrum) +- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) +- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) +- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) +- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) +- do not wrap extern "C" around system includes (Tom Lane) +- mention zlib binding for TCL in README (Andreas Kupries) +- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) +- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) +- allow "configure --prefix $HOME" (Tim Mooney) +- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) +- move Makefile.sas to amiga/Makefile.sas + +Changes in 1.1.1 (27 Feb 98) +- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) +- remove block truncation heuristic which had very marginal effect for zlib + (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the + compression ratio on some files. This also allows inlining _tr_tally for + matches in deflate_slow. +- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) + +Changes in 1.1.0 (24 Feb 98) +- do not return STREAM_END prematurely in inflate (John Bowler) +- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) +- compile with -DFASTEST to get compression code optimized for speed only +- in minigzip, try mmap'ing the input file first (Miguel Albrecht) +- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain + on Sun but significant on HP) + +- add a pointer to experimental unzip library in README (Gilles Vollant) +- initialize variable gcc in configure (Chris Herborth) + +Changes in 1.0.9 (17 Feb 1998) +- added gzputs and gzgets functions +- do not clear eof flag in gzseek (Mark Diekhans) +- fix gzseek for files in transparent mode (Mark Diekhans) +- do not assume that vsprintf returns the number of bytes written (Jens Krinke) +- replace EXPORT with ZEXPORT to avoid conflict with other programs +- added compress2 in zconf.h, zlib.def, zlib.dnt +- new asm code from Gilles Vollant in contrib/asm386 +- simplify the inflate code (Mark): + . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() + . ZALLOC the length list in inflate_trees_fixed() instead of using stack + . ZALLOC the value area for huft_build() instead of using stack + . Simplify Z_FINISH check in inflate() + +- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 +- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) +- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with + the declaration of FAR (Gilles VOllant) +- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) +- read_buf buf parameter of type Bytef* instead of charf* +- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) +- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) +- fix check for presence of directories in "make install" (Ian Willis) + +Changes in 1.0.8 (27 Jan 1998) +- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) +- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) +- added compress2() to allow setting the compression level +- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) +- use constant arrays for the static trees in trees.c instead of computing + them at run time (thanks to Ken Raeburn for this suggestion). To create + trees.h, compile with GEN_TREES_H and run "make test". +- check return code of example in "make test" and display result +- pass minigzip command line options to file_compress +- simplifying code of inflateSync to avoid gcc 2.8 bug + +- support CC="gcc -Wall" in configure -s (QingLong) +- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) +- fix test for shared library support to avoid compiler warnings +- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) +- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) +- do not use fdopen for Metrowerks on Mac (Brad Pettit)) +- add checks for gzputc and gzputc in example.c +- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) +- use const for the CRC table (Ken Raeburn) +- fixed "make uninstall" for shared libraries +- use Tracev instead of Trace in infblock.c +- in example.c use correct compressed length for test_sync +- suppress +vnocompatwarnings in configure for HPUX (not always supported) + +Changes in 1.0.7 (20 Jan 1998) +- fix gzseek which was broken in write mode +- return error for gzseek to negative absolute position +- fix configure for Linux (Chun-Chung Chen) +- increase stack space for MSC (Tim Wegner) +- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) +- define EXPORTVA for gzprintf (Gilles Vollant) +- added man page zlib.3 (Rick Rodgers) +- for contrib/untgz, fix makedir() and improve Makefile + +- check gzseek in write mode in example.c +- allocate extra buffer for seeks only if gzseek is actually called +- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) +- add inflateSyncPoint in zconf.h +- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def + +Changes in 1.0.6 (19 Jan 1998) +- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and + gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) +- Fix a deflate bug occurring only with compression level 0 (thanks to + Andy Buckler for finding this one). +- In minigzip, pass transparently also the first byte for .Z files. +- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() +- check Z_FINISH in inflate (thanks to Marc Schluper) +- Implement deflateCopy (thanks to Adam Costello) +- make static libraries by default in configure, add --shared option. +- move MSDOS or Windows specific files to directory msdos +- suppress the notion of partial flush to simplify the interface + (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) +- suppress history buffer provided by application to simplify the interface + (this feature was not implemented anyway in 1.0.4) +- next_in and avail_in must be initialized before calling inflateInit or + inflateInit2 +- add EXPORT in all exported functions (for Windows DLL) +- added Makefile.nt (thanks to Stephen Williams) +- added the unsupported "contrib" directory: + contrib/asm386/ by Gilles Vollant + 386 asm code replacing longest_match(). + contrib/iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + contrib/iostream2/ by Tyge Løvset + Another C++ I/O streams interface + contrib/untgz/ by "Pedro A. Aranda Guti\irrez" + A very simple tar.gz file extractor using zlib + contrib/visual-basic.txt by Carlos Rios + How to use compress(), uncompress() and the gz* functions from VB. +- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression + level) in minigzip (thanks to Tom Lane) + +- use const for rommable constants in deflate +- added test for gzseek and gztell in example.c +- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) +- add undocumented function zError to convert error code to string + (for Tim Smithers) +- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. +- Use default memcpy for Symantec MSDOS compiler. +- Add EXPORT keyword for check_func (needed for Windows DLL) +- add current directory to LD_LIBRARY_PATH for "make test" +- create also a link for libz.so.1 +- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) +- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) +- added -soname for Linux in configure (Chun-Chung Chen, +- assign numbers to the exported functions in zlib.def (for Windows DLL) +- add advice in zlib.h for best usage of deflateSetDictionary +- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) +- allow compilation with ANSI keywords only enabled for TurboC in large model +- avoid "versionString"[0] (Borland bug) +- add NEED_DUMMY_RETURN for Borland +- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). +- allow compilation with CC +- defined STDC for OS/2 (David Charlap) +- limit external names to 8 chars for MVS (Thomas Lund) +- in minigzip.c, use static buffers only for 16-bit systems +- fix suffix check for "minigzip -d foo.gz" +- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) +- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) +- added makelcc.bat for lcc-win32 (Tom St Denis) +- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) +- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. +- check for unistd.h in configure (for off_t) +- remove useless check parameter in inflate_blocks_free +- avoid useless assignment of s->check to itself in inflate_blocks_new +- do not flush twice in gzclose (thanks to Ken Raeburn) +- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h +- use NO_ERRNO_H instead of enumeration of operating systems with errno.h +- work around buggy fclose on pipes for HP/UX +- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) +- fix configure if CC is already equal to gcc + +Changes in 1.0.5 (3 Jan 98) +- Fix inflate to terminate gracefully when fed corrupted or invalid data +- Use const for rommable constants in inflate +- Eliminate memory leaks on error conditions in inflate +- Removed some vestigial code in inflate +- Update web address in README + +Changes in 1.0.4 (24 Jul 96) +- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF + bit, so the decompressor could decompress all the correct data but went + on to attempt decompressing extra garbage data. This affected minigzip too. +- zlibVersion and gzerror return const char* (needed for DLL) +- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) +- use z_error only for DEBUG (avoid problem with DLLs) + +Changes in 1.0.3 (2 Jul 96) +- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS + small and medium models; this makes the library incompatible with previous + versions for these models. (No effect in large model or on other systems.) +- return OK instead of BUF_ERROR if previous deflate call returned with + avail_out as zero but there is nothing to do +- added memcmp for non STDC compilers +- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) +- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) +- better check for 16-bit mode MSC (avoids problem with Symantec) + +Changes in 1.0.2 (23 May 96) +- added Windows DLL support +- added a function zlibVersion (for the DLL support) +- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) +- Bytef is define's instead of typedef'd only for Borland C +- avoid reading uninitialized memory in example.c +- mention in README that the zlib format is now RFC1950 +- updated Makefile.dj2 +- added algorithm.doc + +Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] +- fix array overlay in deflate.c which sometimes caused bad compressed data +- fix inflate bug with empty stored block +- fix MSDOS medium model which was broken in 0.99 +- fix deflateParams() which could generate bad compressed data. +- Bytef is define'd instead of typedef'ed (work around Borland bug) +- added an INDEX file +- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), + Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) +- speed up adler32 for modern machines without auto-increment +- added -ansi for IRIX in configure +- static_init_done in trees.c is an int +- define unlink as delete for VMS +- fix configure for QNX +- add configure branch for SCO and HPUX +- avoid many warnings (unused variables, dead assignments, etc...) +- no fdopen for BeOS +- fix the Watcom fix for 32 bit mode (define FAR as empty) +- removed redefinition of Byte for MKWERKS +- work around an MWKERKS bug (incorrect merge of all .h files) + +Changes in 0.99 (27 Jan 96) +- allow preset dictionary shared between compressor and decompressor +- allow compression level 0 (no compression) +- add deflateParams in zlib.h: allow dynamic change of compression level + and compression strategy. +- test large buffers and deflateParams in example.c +- add optional "configure" to build zlib as a shared library +- suppress Makefile.qnx, use configure instead +- fixed deflate for 64-bit systems (detected on Cray) +- fixed inflate_blocks for 64-bit systems (detected on Alpha) +- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) +- always return Z_BUF_ERROR when deflate() has nothing to do +- deflateInit and inflateInit are now macros to allow version checking +- prefix all global functions and types with z_ with -DZ_PREFIX +- make falloc completely reentrant (inftrees.c) +- fixed very unlikely race condition in ct_static_init +- free in reverse order of allocation to help memory manager +- use zlib-1.0/* instead of zlib/* inside the tar.gz +- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith + -Wconversion -Wstrict-prototypes -Wmissing-prototypes" +- allow gzread on concatenated .gz files +- deflateEnd now returns Z_DATA_ERROR if it was premature +- deflate is finally (?) fully deterministic (no matches beyond end of input) +- Document Z_SYNC_FLUSH +- add uninstall in Makefile +- Check for __cpluplus in zlib.h +- Better test in ct_align for partial flush +- avoid harmless warnings for Borland C++ +- initialize hash_head in deflate.c +- avoid warning on fdopen (gzio.c) for HP cc -Aa +- include stdlib.h for STDC compilers +- include errno.h for Cray +- ignore error if ranlib doesn't exist +- call ranlib twice for NeXTSTEP +- use exec_prefix instead of prefix for libz.a +- renamed ct_* as _tr_* to avoid conflict with applications +- clear z->msg in inflateInit2 before any error return +- initialize opaque in example.c, gzio.c, deflate.c and inflate.c +- fixed typo in zconf.h (_GNUC__ => __GNUC__) +- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) +- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) +- in fcalloc, normalize pointer if size > 65520 bytes +- don't use special fcalloc for 32 bit Borland C++ +- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... +- use Z_BINARY instead of BINARY +- document that gzclose after gzdopen will close the file +- allow "a" as mode in gzopen. +- fix error checking in gzread +- allow skipping .gz extra-field on pipes +- added reference to Perl interface in README +- put the crc table in FAR data (I dislike more and more the medium model :) +- added get_crc_table +- added a dimension to all arrays (Borland C can't count). +- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast +- guard against multiple inclusion of *.h (for precompiled header on Mac) +- Watcom C pretends to be Microsoft C small model even in 32 bit mode. +- don't use unsized arrays to avoid silly warnings by Visual C++: + warning C4746: 'inflate_mask' : unsized array treated as '__far' + (what's wrong with far data in far model?). +- define enum out of inflate_blocks_state to allow compilation with C++ + +Changes in 0.95 (16 Aug 95) +- fix MSDOS small and medium model (now easier to adapt to any compiler) +- inlined send_bits +- fix the final (:-) bug for deflate with flush (output was correct but + not completely flushed in rare occasions). +- default window size is same for compression and decompression + (it's now sufficient to set MAX_WBITS in zconf.h). +- voidp -> voidpf and voidnp -> voidp (for consistency with other + typedefs and because voidnp was not near in large model). + +Changes in 0.94 (13 Aug 95) +- support MSDOS medium model +- fix deflate with flush (could sometimes generate bad output) +- fix deflateReset (zlib header was incorrectly suppressed) +- added support for VMS +- allow a compression level in gzopen() +- gzflush now calls fflush +- For deflate with flush, flush even if no more input is provided. +- rename libgz.a as libz.a +- avoid complex expression in infcodes.c triggering Turbo C bug +- work around a problem with gcc on Alpha (in INSERT_STRING) +- don't use inline functions (problem with some gcc versions) +- allow renaming of Byte, uInt, etc... with #define. +- avoid warning about (unused) pointer before start of array in deflate.c +- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c +- avoid reserved word 'new' in trees.c + +Changes in 0.93 (25 June 95) +- temporarily disable inline functions +- make deflate deterministic +- give enough lookahead for PARTIAL_FLUSH +- Set binary mode for stdin/stdout in minigzip.c for OS/2 +- don't even use signed char in inflate (not portable enough) +- fix inflate memory leak for segmented architectures + +Changes in 0.92 (3 May 95) +- don't assume that char is signed (problem on SGI) +- Clear bit buffer when starting a stored block +- no memcpy on Pyramid +- suppressed inftest.c +- optimized fill_window, put longest_match inline for gcc +- optimized inflate on stored blocks. +- untabify all sources to simplify patches + +Changes in 0.91 (2 May 95) +- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h +- Document the memory requirements in zconf.h +- added "make install" +- fix sync search logic in inflateSync +- deflate(Z_FULL_FLUSH) now works even if output buffer too short +- after inflateSync, don't scare people with just "lo world" +- added support for DJGPP + +Changes in 0.9 (1 May 95) +- don't assume that zalloc clears the allocated memory (the TurboC bug + was Mark's bug after all :) +- let again gzread copy uncompressed data unchanged (was working in 0.71) +- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented +- added a test of inflateSync in example.c +- moved MAX_WBITS to zconf.h because users might want to change that. +- document explicitly that zalloc(64K) on MSDOS must return a normalized + pointer (zero offset) +- added Makefiles for Microsoft C, Turbo C, Borland C++ +- faster crc32() + +Changes in 0.8 (29 April 95) +- added fast inflate (inffast.c) +- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this + is incompatible with previous versions of zlib which returned Z_OK. +- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) + (actually that was not a compiler bug, see 0.81 above) +- gzread no longer reads one extra byte in certain cases +- In gzio destroy(), don't reference a freed structure +- avoid many warnings for MSDOS +- avoid the ERROR symbol which is used by MS Windows + +Changes in 0.71 (14 April 95) +- Fixed more MSDOS compilation problems :( There is still a bug with + TurboC large model. + +Changes in 0.7 (14 April 95) +- Added full inflate support. +- Simplified the crc32() interface. The pre- and post-conditioning + (one's complement) is now done inside crc32(). WARNING: this is + incompatible with previous versions; see zlib.h for the new usage. + +Changes in 0.61 (12 April 95) +- workaround for a bug in TurboC. example and minigzip now work on MSDOS. + +Changes in 0.6 (11 April 95) +- added minigzip.c +- added gzdopen to reopen a file descriptor as gzFile +- added transparent reading of non-gziped files in gzread. +- fixed bug in gzread (don't read crc as data) +- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). +- don't allocate big arrays in the stack (for MSDOS) +- fix some MSDOS compilation problems + +Changes in 0.5: +- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but + not yet Z_FULL_FLUSH. +- support decompression but only in a single step (forced Z_FINISH) +- added opaque object for zalloc and zfree. +- added deflateReset and inflateReset +- added a variable zlib_version for consistency checking. +- renamed the 'filter' parameter of deflateInit2 as 'strategy'. + Added Z_FILTERED and Z_HUFFMAN_ONLY constants. + +Changes in 0.4: +- avoid "zip" everywhere, use zlib instead of ziplib. +- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush + if compression method == 8. +- added adler32 and crc32 +- renamed deflateOptions as deflateInit2, call one or the other but not both +- added the method parameter for deflateInit2. +- added inflateInit2 +- simplied considerably deflateInit and inflateInit by not supporting + user-provided history buffer. This is supported only in deflateInit2 + and inflateInit2. + +Changes in 0.3: +- prefix all macro names with Z_ +- use Z_FINISH instead of deflateEnd to finish compression. +- added Z_HUFFMAN_ONLY +- added gzerror() diff --git a/deps/zlib-1.2.10/FAQ b/deps/zlib-1.2.10/FAQ new file mode 100644 index 0000000..99b7cf9 --- /dev/null +++ b/deps/zlib-1.2.10/FAQ @@ -0,0 +1,368 @@ + + Frequently Asked Questions about zlib + + +If your question is not there, please check the zlib home page +http://zlib.net/ which may have more recent information. +The lastest zlib FAQ is at http://zlib.net/zlib_faq.html + + + 1. Is zlib Y2K-compliant? + + Yes. zlib doesn't handle dates. + + 2. Where can I get a Windows DLL version? + + The zlib sources can be compiled without change to produce a DLL. See the + file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the + precompiled DLL are found in the zlib web site at http://zlib.net/ . + + 3. Where can I get a Visual Basic interface to zlib? + + See + * http://marknelson.us/1997/01/01/zlib-engine/ + * win32/DLL_FAQ.txt in the zlib distribution + + 4. compress() returns Z_BUF_ERROR. + + Make sure that before the call of compress(), the length of the compressed + buffer is equal to the available size of the compressed buffer and not + zero. For Visual Basic, check that this parameter is passed by reference + ("as any"), not by value ("as long"). + + 5. deflate() or inflate() returns Z_BUF_ERROR. + + Before making the call, make sure that avail_in and avail_out are not zero. + When setting the parameter flush equal to Z_FINISH, also make sure that + avail_out is big enough to allow processing all pending input. Note that a + Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be + made with more input or output space. A Z_BUF_ERROR may in fact be + unavoidable depending on how the functions are used, since it is not + possible to tell whether or not there is more output pending when + strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a + heavily annotated example. + + 6. Where's the zlib documentation (man pages, etc.)? + + It's in zlib.h . Examples of zlib usage are in the files test/example.c + and test/minigzip.c, with more in examples/ . + + 7. Why don't you use GNU autoconf or libtool or ...? + + Because we would like to keep zlib as a very small and simple package. + zlib is rather portable and doesn't need much configuration. + + 8. I found a bug in zlib. + + Most of the time, such problems are due to an incorrect usage of zlib. + Please try to reproduce the problem with a small program and send the + corresponding source to us at zlib@gzip.org . Do not send multi-megabyte + data files without prior agreement. + + 9. Why do I get "undefined reference to gzputc"? + + If "make test" produces something like + + example.o(.text+0x154): undefined reference to `gzputc' + + check that you don't have old files libz.* in /usr/lib, /usr/local/lib or + /usr/X11R6/lib. Remove any old versions, then do "make install". + +10. I need a Delphi interface to zlib. + + See the contrib/delphi directory in the zlib distribution. + +11. Can zlib handle .zip archives? + + Not by itself, no. See the directory contrib/minizip in the zlib + distribution. + +12. Can zlib handle .Z files? + + No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt + the code of uncompress on your own. + +13. How can I make a Unix shared library? + + By default a shared (and a static) library is built for Unix. So: + + make distclean + ./configure + make + +14. How do I install a shared zlib library on Unix? + + After the above, then: + + make install + + However, many flavors of Unix come with a shared zlib already installed. + Before going to the trouble of compiling a shared version of zlib and + trying to install it, you may want to check if it's already there! If you + can #include , it's there. The -lz option will probably link to + it. You can check the version at the top of zlib.h or with the + ZLIB_VERSION symbol defined in zlib.h . + +15. I have a question about OttoPDF. + + We are not the authors of OttoPDF. The real author is on the OttoPDF web + site: Joel Hainley, jhainley@myndkryme.com. + +16. Can zlib decode Flate data in an Adobe PDF file? + + Yes. See http://www.pdflib.com/ . To modify PDF forms, see + http://sourceforge.net/projects/acroformtool/ . + +17. Why am I getting this "register_frame_info not found" error on Solaris? + + After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib + generates an error such as: + + ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: + symbol __register_frame_info: referenced symbol not found + + The symbol __register_frame_info is not part of zlib, it is generated by + the C compiler (cc or gcc). You must recompile applications using zlib + which have this problem. This problem is specific to Solaris. See + http://www.sunfreeware.com for Solaris versions of zlib and applications + using zlib. + +18. Why does gzip give an error on a file I make with compress/deflate? + + The compress and deflate functions produce data in the zlib format, which + is different and incompatible with the gzip format. The gz* functions in + zlib on the other hand use the gzip format. Both the zlib and gzip formats + use the same compressed data format internally, but have different headers + and trailers around the compressed data. + +19. Ok, so why are there two different formats? + + The gzip format was designed to retain the directory information about a + single file, such as the name and last modification date. The zlib format + on the other hand was designed for in-memory and communication channel + applications, and has a much more compact header and trailer and uses a + faster integrity check than gzip. + +20. Well that's nice, but how do I make a gzip file in memory? + + You can request that deflate write the gzip format instead of the zlib + format using deflateInit2(). You can also request that inflate decode the + gzip format using inflateInit2(). Read zlib.h for more details. + +21. Is zlib thread-safe? + + Yes. However any library routines that zlib uses and any application- + provided memory allocation routines must also be thread-safe. zlib's gz* + functions use stdio library routines, and most of zlib's functions use the + library memory allocation routines by default. zlib's *Init* functions + allow for the application to provide custom memory allocation routines. + + Of course, you should only operate on any given zlib or gzip stream from a + single thread at a time. + +22. Can I use zlib in my commercial application? + + Yes. Please read the license in zlib.h. + +23. Is zlib under the GNU license? + + No. Please read the license in zlib.h. + +24. The license says that altered source versions must be "plainly marked". So + what exactly do I need to do to meet that requirement? + + You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In + particular, the final version number needs to be changed to "f", and an + identification string should be appended to ZLIB_VERSION. Version numbers + x.x.x.f are reserved for modifications to zlib by others than the zlib + maintainers. For example, if the version of the base zlib you are altering + is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and + ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also + update the version strings in deflate.c and inftrees.c. + + For altered source distributions, you should also note the origin and + nature of the changes in zlib.h, as well as in ChangeLog and README, along + with the dates of the alterations. The origin should include at least your + name (or your company's name), and an email address to contact for help or + issues with the library. + + Note that distributing a compiled zlib library along with zlib.h and + zconf.h is also a source distribution, and so you should change + ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes + in zlib.h as you would for a full source distribution. + +25. Will zlib work on a big-endian or little-endian architecture, and can I + exchange compressed data between them? + + Yes and yes. + +26. Will zlib work on a 64-bit machine? + + Yes. It has been tested on 64-bit machines, and has no dependence on any + data types being limited to 32-bits in length. If you have any + difficulties, please provide a complete problem report to zlib@gzip.org + +27. Will zlib decompress data from the PKWare Data Compression Library? + + No. The PKWare DCL uses a completely different compressed data format than + does PKZIP and zlib. However, you can look in zlib's contrib/blast + directory for a possible solution to your problem. + +28. Can I access data randomly in a compressed stream? + + No, not without some preparation. If when compressing you periodically use + Z_FULL_FLUSH, carefully write all the pending data at those points, and + keep an index of those locations, then you can start decompression at those + points. You have to be careful to not use Z_FULL_FLUSH too often, since it + can significantly degrade compression. Alternatively, you can scan a + deflate stream once to generate an index, and then use that index for + random access. See examples/zran.c . + +29. Does zlib work on MVS, OS/390, CICS, etc.? + + It has in the past, but we have not heard of any recent evidence. There + were working ports of zlib 1.1.4 to MVS, but those links no longer work. + If you know of recent, successful applications of zlib on these operating + systems, please let us know. Thanks. + +30. Is there some simpler, easier to read version of inflate I can look at to + understand the deflate format? + + First off, you should read RFC 1951. Second, yes. Look in zlib's + contrib/puff directory. + +31. Does zlib infringe on any patents? + + As far as we know, no. In fact, that was originally the whole point behind + zlib. Look here for some more information: + + http://www.gzip.org/#faq11 + +32. Can zlib work with greater than 4 GB of data? + + Yes. inflate() and deflate() will process any amount of data correctly. + Each call of inflate() or deflate() is limited to input and output chunks + of the maximum value that can be stored in the compiler's "unsigned int" + type, but there is no limit to the number of chunks. Note however that the + strm.total_in and strm_total_out counters may be limited to 4 GB. These + counters are provided as a convenience and are not used internally by + inflate() or deflate(). The application can easily set up its own counters + updated after each call of inflate() or deflate() to count beyond 4 GB. + compress() and uncompress() may be limited to 4 GB, since they operate in a + single call. gzseek() and gztell() may be limited to 4 GB depending on how + zlib is compiled. See the zlibCompileFlags() function in zlib.h. + + The word "may" appears several times above since there is a 4 GB limit only + if the compiler's "long" type is 32 bits. If the compiler's "long" type is + 64 bits, then the limit is 16 exabytes. + +33. Does zlib have any security vulnerabilities? + + The only one that we are aware of is potentially in gzprintf(). If zlib is + compiled to use sprintf() or vsprintf(), then there is no protection + against a buffer overflow of an 8K string space (or other value as set by + gzbuffer()), other than the caller of gzprintf() assuring that the output + will not exceed 8K. On the other hand, if zlib is compiled to use + snprintf() or vsnprintf(), which should normally be the case, then there is + no vulnerability. The ./configure script will display warnings if an + insecure variation of sprintf() will be used by gzprintf(). Also the + zlibCompileFlags() function will return information on what variant of + sprintf() is used by gzprintf(). + + If you don't have snprintf() or vsnprintf() and would like one, you can + find a portable implementation here: + + http://www.ijs.si/software/snprintf/ + + Note that you should be using the most recent version of zlib. Versions + 1.1.3 and before were subject to a double-free vulnerability, and versions + 1.2.1 and 1.2.2 were subject to an access exception when decompressing + invalid compressed data. + +34. Is there a Java version of zlib? + + Probably what you want is to use zlib in Java. zlib is already included + as part of the Java SDK in the java.util.zip package. If you really want + a version of zlib written in the Java language, look on the zlib home + page for links: http://zlib.net/ . + +35. I get this or that compiler or source-code scanner warning when I crank it + up to maximally-pedantic. Can't you guys write proper code? + + Many years ago, we gave up attempting to avoid warnings on every compiler + in the universe. It just got to be a waste of time, and some compilers + were downright silly as well as contradicted each other. So now, we simply + make sure that the code always works. + +36. Valgrind (or some similar memory access checker) says that deflate is + performing a conditional jump that depends on an uninitialized value. + Isn't that a bug? + + No. That is intentional for performance reasons, and the output of deflate + is not affected. This only started showing up recently since zlib 1.2.x + uses malloc() by default for allocations, whereas earlier versions used + calloc(), which zeros out the allocated memory. Even though the code was + correct, versions 1.2.4 and later was changed to not stimulate these + checkers. + +37. Will zlib read the (insert any ancient or arcane format here) compressed + data format? + + Probably not. Look in the comp.compression FAQ for pointers to various + formats and associated software. + +38. How can I encrypt/decrypt zip files with zlib? + + zlib doesn't support encryption. The original PKZIP encryption is very + weak and can be broken with freely available programs. To get strong + encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib + compression. For PKZIP compatible "encryption", look at + http://www.info-zip.org/ + +39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? + + "gzip" is the gzip format, and "deflate" is the zlib format. They should + probably have called the second one "zlib" instead to avoid confusion with + the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 + correctly points to the zlib specification in RFC 1950 for the "deflate" + transfer encoding, there have been reports of servers and browsers that + incorrectly produce or expect raw deflate data per the deflate + specification in RFC 1951, most notably Microsoft. So even though the + "deflate" transfer encoding using the zlib format would be the more + efficient approach (and in fact exactly what the zlib format was designed + for), using the "gzip" transfer encoding is probably more reliable due to + an unfortunate choice of name on the part of the HTTP 1.1 authors. + + Bottom line: use the gzip format for HTTP 1.1 encoding. + +40. Does zlib support the new "Deflate64" format introduced by PKWare? + + No. PKWare has apparently decided to keep that format proprietary, since + they have not documented it as they have previous compression formats. In + any case, the compression improvements are so modest compared to other more + modern approaches, that it's not worth the effort to implement. + +41. I'm having a problem with the zip functions in zlib, can you help? + + There are no zip functions in zlib. You are probably using minizip by + Giles Vollant, which is found in the contrib directory of zlib. It is not + part of zlib. In fact none of the stuff in contrib is part of zlib. The + files in there are not supported by the zlib authors. You need to contact + the authors of the respective contribution for help. + +42. The match.asm code in contrib is under the GNU General Public License. + Since it's part of zlib, doesn't that mean that all of zlib falls under the + GNU GPL? + + No. The files in contrib are not part of zlib. They were contributed by + other authors and are provided as a convenience to the user within the zlib + distribution. Each item in contrib has its own license. + +43. Is zlib subject to export controls? What is its ECCN? + + zlib is not subject to export controls, and so is classified as EAR99. + +44. Can you please sign these lengthy legal documents and fax them back to us + so that we can use your software in our product? + + No. Go away. Shoo. diff --git a/deps/zlib-1.2.10/INDEX b/deps/zlib-1.2.10/INDEX new file mode 100644 index 0000000..2ba0641 --- /dev/null +++ b/deps/zlib-1.2.10/INDEX @@ -0,0 +1,68 @@ +CMakeLists.txt cmake build file +ChangeLog history of changes +FAQ Frequently Asked Questions about zlib +INDEX this file +Makefile dummy Makefile that tells you to ./configure +Makefile.in template for Unix Makefile +README guess what +configure configure script for Unix +make_vms.com makefile for VMS +test/example.c zlib usages examples for build testing +test/minigzip.c minimal gzip-like functionality for build testing +test/infcover.c inf*.c code coverage for build coverage testing +treebuild.xml XML description of source file dependencies +zconf.h.cmakein zconf.h template for cmake +zconf.h.in zconf.h template for configure +zlib.3 Man page for zlib +zlib.3.pdf Man page in PDF format +zlib.map Linux symbol information +zlib.pc.in Template for pkg-config descriptor +zlib.pc.cmakein zlib.pc template for cmake +zlib2ansi perl script to convert source files for C++ compilation + +amiga/ makefiles for Amiga SAS C +as400/ makefiles for AS/400 +doc/ documentation for formats and algorithms +msdos/ makefiles for MSDOS +nintendods/ makefile for Nintendo DS +old/ makefiles for various architectures and zlib documentation + files that have not yet been updated for zlib 1.2.x +qnx/ makefiles for QNX +watcom/ makefiles for OpenWatcom +win32/ makefiles for Windows + + zlib public header files (required for library use): +zconf.h +zlib.h + + private source files used to build the zlib library: +adler32.c +compress.c +crc32.c +crc32.h +deflate.c +deflate.h +gzclose.c +gzguts.h +gzlib.c +gzread.c +gzwrite.c +infback.c +inffast.c +inffast.h +inffixed.h +inflate.c +inflate.h +inftrees.c +inftrees.h +trees.c +trees.h +uncompr.c +zutil.c +zutil.h + + source files for sample programs +See examples/README.examples + + unsupported contributions by third parties +See contrib/README.contrib diff --git a/deps/zlib-1.2.10/Makefile b/deps/zlib-1.2.10/Makefile new file mode 100644 index 0000000..e49e089 --- /dev/null +++ b/deps/zlib-1.2.10/Makefile @@ -0,0 +1,410 @@ +# Makefile for zlib +# Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile and test, type: +# ./configure; make test +# Normally configure builds both a static and a shared library. +# If you want to build just a static library, use: ./configure --static + +# To use the asm code, type: +# cp contrib/asm?86/match.S ./match.S +# make LOC=-DASMV OBJA=match.o + +# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: +# make install +# To install in $HOME instead of /usr/local, use: +# make install prefix=$HOME + +CC=aarch64-linux-gnu-gcc + +CFLAGS=-O3 -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-g -DZLIB_DEBUG +#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ +# -Wstrict-prototypes -Wmissing-prototypes + +SFLAGS=-O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN +LDFLAGS= +TEST_LDFLAGS=-L. libz.a +LDSHARED=aarch64-linux-gnu-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map +CPP=aarch64-linux-gnu-gcc -E + +STATICLIB=libz.a +SHAREDLIB=libz.so +SHAREDLIBV=libz.so.1.2.10 +SHAREDLIBM=libz.so.1 +LIBS=$(STATICLIB) $(SHAREDLIBV) + +AR=aarch64-linux-gnu-ar +ARFLAGS=rc +RANLIB=aarch64-linux-gnu-gcc-ranlib +LDCONFIG=ldconfig +LDSHAREDLIBC=-lc +TAR=tar +SHELL=/bin/sh +EXE= + +prefix =/opt/files/release/zlib/aarch64/ +exec_prefix =${prefix} +libdir =${exec_prefix}/lib +sharedlibdir =${libdir} +includedir =${prefix}/include +mandir =${prefix}/share/man +man3dir = ${mandir}/man3 +pkgconfigdir = ${libdir}/pkgconfig +SRCDIR= +ZINC= +ZINCOUT=-I. + +OBJZ = adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o +OBJG = compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o +OBJC = $(OBJZ) $(OBJG) + +PIC_OBJZ = adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo +PIC_OBJG = compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo +PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) + +# to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo +OBJA = +PIC_OBJA = + +OBJS = $(OBJC) $(OBJA) + +PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) + +all: static shared all64 + +static: example$(EXE) minigzip$(EXE) + +shared: examplesh$(EXE) minigzipsh$(EXE) + +all64: example64$(EXE) minigzip64$(EXE) + +check: test + +test: all teststatic testshared test64 + +teststatic: static + @TMPST=tmpst_$$; \ + if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; false; \ + fi; \ + rm -f $$TMPST + +testshared: shared + @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \ + DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ + SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ + TMPSH=tmpsh_$$; \ + if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ + echo ' *** zlib shared test OK ***'; \ + else \ + echo ' *** zlib shared test FAILED ***'; false; \ + fi; \ + rm -f $$TMPSH + +test64: all64 + @TMP64=tmp64_$$; \ + if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ + echo ' *** zlib 64-bit test OK ***'; \ + else \ + echo ' *** zlib 64-bit test FAILED ***'; false; \ + fi; \ + rm -f $$TMP64 + +infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c + +infcover: infcover.o libz.a + $(CC) $(CFLAGS) -o $@ infcover.o libz.a + +cover: infcover + rm -f *.gcda + ./infcover + gcov inf*.c + +libz.a: $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +match.o: match.S + $(CPP) match.S > _match.s + $(CC) -c _match.s + mv _match.o match.o + rm -f _match.s + +match.lo: match.S + $(CPP) match.S > _match.s + $(CC) -c -fPIC _match.s + mv _match.o match.lo + rm -f _match.s + +example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c + +minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c + +example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c + +minigzip64.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/minigzip.c + + +adler32.o: $(SRCDIR)adler32.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)adler32.c + +crc32.o: $(SRCDIR)crc32.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c + +deflate.o: $(SRCDIR)deflate.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c + +infback.o: $(SRCDIR)infback.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)infback.c + +inffast.o: $(SRCDIR)inffast.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inffast.c + +inflate.o: $(SRCDIR)inflate.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inflate.c + +inftrees.o: $(SRCDIR)inftrees.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inftrees.c + +trees.o: $(SRCDIR)trees.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)trees.c + +zutil.o: $(SRCDIR)zutil.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)zutil.c + +compress.o: $(SRCDIR)compress.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)compress.c + +uncompr.o: $(SRCDIR)uncompr.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)uncompr.c + +gzclose.o: $(SRCDIR)gzclose.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzclose.c + +gzlib.o: $(SRCDIR)gzlib.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzlib.c + +gzread.o: $(SRCDIR)gzread.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzread.c + +gzwrite.o: $(SRCDIR)gzwrite.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzwrite.c + + +adler32.lo: $(SRCDIR)adler32.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/adler32.o $(SRCDIR)adler32.c + -@mv objs/adler32.o $@ + +crc32.lo: $(SRCDIR)crc32.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c + -@mv objs/crc32.o $@ + +deflate.lo: $(SRCDIR)deflate.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c + -@mv objs/deflate.o $@ + +infback.lo: $(SRCDIR)infback.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/infback.o $(SRCDIR)infback.c + -@mv objs/infback.o $@ + +inffast.lo: $(SRCDIR)inffast.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inffast.o $(SRCDIR)inffast.c + -@mv objs/inffast.o $@ + +inflate.lo: $(SRCDIR)inflate.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inflate.o $(SRCDIR)inflate.c + -@mv objs/inflate.o $@ + +inftrees.lo: $(SRCDIR)inftrees.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inftrees.o $(SRCDIR)inftrees.c + -@mv objs/inftrees.o $@ + +trees.lo: $(SRCDIR)trees.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/trees.o $(SRCDIR)trees.c + -@mv objs/trees.o $@ + +zutil.lo: $(SRCDIR)zutil.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/zutil.o $(SRCDIR)zutil.c + -@mv objs/zutil.o $@ + +compress.lo: $(SRCDIR)compress.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/compress.o $(SRCDIR)compress.c + -@mv objs/compress.o $@ + +uncompr.lo: $(SRCDIR)uncompr.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/uncompr.o $(SRCDIR)uncompr.c + -@mv objs/uncompr.o $@ + +gzclose.lo: $(SRCDIR)gzclose.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzclose.o $(SRCDIR)gzclose.c + -@mv objs/gzclose.o $@ + +gzlib.lo: $(SRCDIR)gzlib.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzlib.o $(SRCDIR)gzlib.c + -@mv objs/gzlib.o $@ + +gzread.lo: $(SRCDIR)gzread.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzread.o $(SRCDIR)gzread.c + -@mv objs/gzread.o $@ + +gzwrite.lo: $(SRCDIR)gzwrite.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzwrite.o $(SRCDIR)gzwrite.c + -@mv objs/gzwrite.o $@ + + +placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a + $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS) + rm -f $(SHAREDLIB) $(SHAREDLIBM) + ln -s $@ $(SHAREDLIB) + ln -s $@ $(SHAREDLIBM) + -@rmdir objs + +example$(EXE): example.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) + +minigzip$(EXE): minigzip.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) + +examplesh$(EXE): example.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) + +minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) + +example64$(EXE): example64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) + +minigzip64$(EXE): minigzip64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS) + +install-libs: $(LIBS) + -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi + -@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi + -@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi + -@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi + -@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi + rm -f $(DESTDIR)$(libdir)/$(STATICLIB) + cp $(STATICLIB) $(DESTDIR)$(libdir) + chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB) + -@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1 + -@if test -n "$(SHAREDLIBV)"; then \ + rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ + cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \ + echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \ + chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ + echo "chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV)"; \ + rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ($(LDCONFIG) || true) >/dev/null 2>&1; \ + fi + rm -f $(DESTDIR)$(man3dir)/zlib.3 + cp $(SRCDIR)zlib.3 $(DESTDIR)$(man3dir) + chmod 644 $(DESTDIR)$(man3dir)/zlib.3 + rm -f $(DESTDIR)$(pkgconfigdir)/zlib.pc + cp zlib.pc $(DESTDIR)$(pkgconfigdir) + chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc +# The ranlib in install is needed on NeXTSTEP which checks file times +# ldconfig is for Linux + +install: install-libs + -@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi + rm -f $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h + cp $(SRCDIR)zlib.h zconf.h $(DESTDIR)$(includedir) + chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h + +uninstall: + cd $(DESTDIR)$(includedir) && rm -f zlib.h zconf.h + cd $(DESTDIR)$(libdir) && rm -f libz.a; \ + if test -n "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ + rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ + fi + cd $(DESTDIR)$(man3dir) && rm -f zlib.3 + cd $(DESTDIR)$(pkgconfigdir) && rm -f zlib.pc + +docs: zlib.3.pdf + +zlib.3.pdf: $(SRCDIR)zlib.3 + groff -mandoc -f H -T ps $(SRCDIR)zlib.3 | ps2pdf - $@ + +zconf.h.cmakein: $(SRCDIR)zconf.h.in + -@ TEMPFILE=zconfh_$$; \ + echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\ + sed -f $$TEMPFILE $(SRCDIR)zconf.h.in > $@ &&\ + touch -r $(SRCDIR)zconf.h.in $@ &&\ + rm $$TEMPFILE + +zconf: $(SRCDIR)zconf.h.in + cp -p $(SRCDIR)zconf.h.in zconf.h + +mostlyclean: clean +clean: + rm -f *.o *.lo *~ \ + example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ + example64$(EXE) minigzip64$(EXE) \ + infcover \ + libz.* foo.gz so_locations \ + _match.s maketree contrib/infback9/*.o + rm -rf objs + rm -f *.gcda *.gcno *.gcov + rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov + +maintainer-clean: distclean +distclean: clean zconf zconf.h.cmakein docs + rm -f Makefile zlib.pc configure.log + -@rm -f .DS_Store + @if [ -f Makefile.in ]; then \ + printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \ + printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \ + touch -r $(SRCDIR)Makefile.in Makefile ; fi + @if [ ! -f zconf.h.in ]; then rm -f zconf.h zconf.h.cmakein ; fi + @if [ ! -f zlib.3 ]; then rm -f zlib.3.pdf ; fi + +tags: + etags $(SRCDIR)*.[ch] + +adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h +compress.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h +crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h +deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h +inffast.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h +inftrees.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h +trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h + +adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h +compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h +crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h +deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h +inffast.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h +inftrees.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h +trees.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h diff --git a/deps/zlib-1.2.10/Makefile.in b/deps/zlib-1.2.10/Makefile.in new file mode 100644 index 0000000..1852192 --- /dev/null +++ b/deps/zlib-1.2.10/Makefile.in @@ -0,0 +1,410 @@ +# Makefile for zlib +# Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile and test, type: +# ./configure; make test +# Normally configure builds both a static and a shared library. +# If you want to build just a static library, use: ./configure --static + +# To use the asm code, type: +# cp contrib/asm?86/match.S ./match.S +# make LOC=-DASMV OBJA=match.o + +# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: +# make install +# To install in $HOME instead of /usr/local, use: +# make install prefix=$HOME + +CC=cc + +CFLAGS=-O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-g -DZLIB_DEBUG +#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ +# -Wstrict-prototypes -Wmissing-prototypes + +SFLAGS=-O +LDFLAGS= +TEST_LDFLAGS=-L. libz.a +LDSHARED=$(CC) +CPP=$(CC) -E + +STATICLIB=libz.a +SHAREDLIB=libz.so +SHAREDLIBV=libz.so.1.2.10 +SHAREDLIBM=libz.so.1 +LIBS=$(STATICLIB) $(SHAREDLIBV) + +AR=ar +ARFLAGS=rc +RANLIB=ranlib +LDCONFIG=ldconfig +LDSHAREDLIBC=-lc +TAR=tar +SHELL=/bin/sh +EXE= + +prefix = /usr/local +exec_prefix = ${prefix} +libdir = ${exec_prefix}/lib +sharedlibdir = ${libdir} +includedir = ${prefix}/include +mandir = ${prefix}/share/man +man3dir = ${mandir}/man3 +pkgconfigdir = ${libdir}/pkgconfig +SRCDIR= +ZINC= +ZINCOUT=-I. + +OBJZ = adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o +OBJG = compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o +OBJC = $(OBJZ) $(OBJG) + +PIC_OBJZ = adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo +PIC_OBJG = compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo +PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) + +# to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo +OBJA = +PIC_OBJA = + +OBJS = $(OBJC) $(OBJA) + +PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) + +all: static shared + +static: example$(EXE) minigzip$(EXE) + +shared: examplesh$(EXE) minigzipsh$(EXE) + +all64: example64$(EXE) minigzip64$(EXE) + +check: test + +test: all teststatic testshared + +teststatic: static + @TMPST=tmpst_$$; \ + if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; false; \ + fi; \ + rm -f $$TMPST + +testshared: shared + @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \ + DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ + SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ + TMPSH=tmpsh_$$; \ + if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ + echo ' *** zlib shared test OK ***'; \ + else \ + echo ' *** zlib shared test FAILED ***'; false; \ + fi; \ + rm -f $$TMPSH + +test64: all64 + @TMP64=tmp64_$$; \ + if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ + echo ' *** zlib 64-bit test OK ***'; \ + else \ + echo ' *** zlib 64-bit test FAILED ***'; false; \ + fi; \ + rm -f $$TMP64 + +infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c + +infcover: infcover.o libz.a + $(CC) $(CFLAGS) -o $@ infcover.o libz.a + +cover: infcover + rm -f *.gcda + ./infcover + gcov inf*.c + +libz.a: $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +match.o: match.S + $(CPP) match.S > _match.s + $(CC) -c _match.s + mv _match.o match.o + rm -f _match.s + +match.lo: match.S + $(CPP) match.S > _match.s + $(CC) -c -fPIC _match.s + mv _match.o match.lo + rm -f _match.s + +example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c + +minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c + +example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c + +minigzip64.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/minigzip.c + + +adler32.o: $(SRCDIR)adler32.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)adler32.c + +crc32.o: $(SRCDIR)crc32.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c + +deflate.o: $(SRCDIR)deflate.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c + +infback.o: $(SRCDIR)infback.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)infback.c + +inffast.o: $(SRCDIR)inffast.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inffast.c + +inflate.o: $(SRCDIR)inflate.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inflate.c + +inftrees.o: $(SRCDIR)inftrees.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inftrees.c + +trees.o: $(SRCDIR)trees.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)trees.c + +zutil.o: $(SRCDIR)zutil.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)zutil.c + +compress.o: $(SRCDIR)compress.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)compress.c + +uncompr.o: $(SRCDIR)uncompr.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)uncompr.c + +gzclose.o: $(SRCDIR)gzclose.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzclose.c + +gzlib.o: $(SRCDIR)gzlib.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzlib.c + +gzread.o: $(SRCDIR)gzread.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzread.c + +gzwrite.o: $(SRCDIR)gzwrite.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzwrite.c + + +adler32.lo: $(SRCDIR)adler32.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/adler32.o $(SRCDIR)adler32.c + -@mv objs/adler32.o $@ + +crc32.lo: $(SRCDIR)crc32.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c + -@mv objs/crc32.o $@ + +deflate.lo: $(SRCDIR)deflate.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c + -@mv objs/deflate.o $@ + +infback.lo: $(SRCDIR)infback.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/infback.o $(SRCDIR)infback.c + -@mv objs/infback.o $@ + +inffast.lo: $(SRCDIR)inffast.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inffast.o $(SRCDIR)inffast.c + -@mv objs/inffast.o $@ + +inflate.lo: $(SRCDIR)inflate.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inflate.o $(SRCDIR)inflate.c + -@mv objs/inflate.o $@ + +inftrees.lo: $(SRCDIR)inftrees.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inftrees.o $(SRCDIR)inftrees.c + -@mv objs/inftrees.o $@ + +trees.lo: $(SRCDIR)trees.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/trees.o $(SRCDIR)trees.c + -@mv objs/trees.o $@ + +zutil.lo: $(SRCDIR)zutil.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/zutil.o $(SRCDIR)zutil.c + -@mv objs/zutil.o $@ + +compress.lo: $(SRCDIR)compress.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/compress.o $(SRCDIR)compress.c + -@mv objs/compress.o $@ + +uncompr.lo: $(SRCDIR)uncompr.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/uncompr.o $(SRCDIR)uncompr.c + -@mv objs/uncompr.o $@ + +gzclose.lo: $(SRCDIR)gzclose.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzclose.o $(SRCDIR)gzclose.c + -@mv objs/gzclose.o $@ + +gzlib.lo: $(SRCDIR)gzlib.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzlib.o $(SRCDIR)gzlib.c + -@mv objs/gzlib.o $@ + +gzread.lo: $(SRCDIR)gzread.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzread.o $(SRCDIR)gzread.c + -@mv objs/gzread.o $@ + +gzwrite.lo: $(SRCDIR)gzwrite.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzwrite.o $(SRCDIR)gzwrite.c + -@mv objs/gzwrite.o $@ + + +placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a + $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS) + rm -f $(SHAREDLIB) $(SHAREDLIBM) + ln -s $@ $(SHAREDLIB) + ln -s $@ $(SHAREDLIBM) + -@rmdir objs + +example$(EXE): example.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) + +minigzip$(EXE): minigzip.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) + +examplesh$(EXE): example.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) + +minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) + +example64$(EXE): example64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) + +minigzip64$(EXE): minigzip64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS) + +install-libs: $(LIBS) + -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi + -@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi + -@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi + -@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi + -@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi + rm -f $(DESTDIR)$(libdir)/$(STATICLIB) + cp $(STATICLIB) $(DESTDIR)$(libdir) + chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB) + -@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1 + -@if test -n "$(SHAREDLIBV)"; then \ + rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ + cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \ + echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \ + chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ + echo "chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV)"; \ + rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ($(LDCONFIG) || true) >/dev/null 2>&1; \ + fi + rm -f $(DESTDIR)$(man3dir)/zlib.3 + cp $(SRCDIR)zlib.3 $(DESTDIR)$(man3dir) + chmod 644 $(DESTDIR)$(man3dir)/zlib.3 + rm -f $(DESTDIR)$(pkgconfigdir)/zlib.pc + cp zlib.pc $(DESTDIR)$(pkgconfigdir) + chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc +# The ranlib in install is needed on NeXTSTEP which checks file times +# ldconfig is for Linux + +install: install-libs + -@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi + rm -f $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h + cp $(SRCDIR)zlib.h zconf.h $(DESTDIR)$(includedir) + chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h + +uninstall: + cd $(DESTDIR)$(includedir) && rm -f zlib.h zconf.h + cd $(DESTDIR)$(libdir) && rm -f libz.a; \ + if test -n "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ + rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ + fi + cd $(DESTDIR)$(man3dir) && rm -f zlib.3 + cd $(DESTDIR)$(pkgconfigdir) && rm -f zlib.pc + +docs: zlib.3.pdf + +zlib.3.pdf: $(SRCDIR)zlib.3 + groff -mandoc -f H -T ps $(SRCDIR)zlib.3 | ps2pdf - $@ + +zconf.h.cmakein: $(SRCDIR)zconf.h.in + -@ TEMPFILE=zconfh_$$; \ + echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\ + sed -f $$TEMPFILE $(SRCDIR)zconf.h.in > $@ &&\ + touch -r $(SRCDIR)zconf.h.in $@ &&\ + rm $$TEMPFILE + +zconf: $(SRCDIR)zconf.h.in + cp -p $(SRCDIR)zconf.h.in zconf.h + +mostlyclean: clean +clean: + rm -f *.o *.lo *~ \ + example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ + example64$(EXE) minigzip64$(EXE) \ + infcover \ + libz.* foo.gz so_locations \ + _match.s maketree contrib/infback9/*.o + rm -rf objs + rm -f *.gcda *.gcno *.gcov + rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov + +maintainer-clean: distclean +distclean: clean zconf zconf.h.cmakein docs + rm -f Makefile zlib.pc configure.log + -@rm -f .DS_Store + @if [ -f Makefile.in ]; then \ + printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \ + printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \ + touch -r $(SRCDIR)Makefile.in Makefile ; fi + @if [ ! -f zconf.h.in ]; then rm -f zconf.h zconf.h.cmakein ; fi + @if [ ! -f zlib.3 ]; then rm -f zlib.3.pdf ; fi + +tags: + etags $(SRCDIR)*.[ch] + +adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h +compress.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h +crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h +deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h +inffast.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h +inftrees.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h +trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h + +adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h +compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h +crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h +deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h +inffast.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h +inftrees.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h +trees.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h diff --git a/deps/zlib-1.2.10/README b/deps/zlib-1.2.10/README new file mode 100644 index 0000000..e2250bd --- /dev/null +++ b/deps/zlib-1.2.10/README @@ -0,0 +1,115 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.10 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and +rfc1952 (gzip format). + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +of the library is given in the file test/example.c which also tests that +the library is working correctly. Another example is given in the file +test/minigzip.c. The compression library itself is composed of all source +files in the root directory. + +To compile all files and run the test program, follow the instructions given at +the top of Makefile.in. In short "./configure; make test", and if that goes +well, "make install" should work for most flavors of Unix. For Windows, use +one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +make_vms.com. + +Questions about zlib should be sent to , or to Gilles Vollant + for the Windows DLL version. The zlib home page is +http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. + +PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. + +Mark Nelson wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available at +http://marknelson.us/1997/01/01/zlib-engine/ . + +The changes made in version 1.2.10 are documented in the file ChangeLog. + +Unsupported third party contributions are provided in directory contrib/ . + +zlib is available in Java using the java.util.zip package, documented at +http://java.sun.com/developer/technicalArticles/Programming/compression/ . + +A Perl interface to zlib written by Paul Marquess is available +at CPAN (Comprehensive Perl Archive Network) sites, including +http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . + +A Python interface to zlib written by A.M. Kuchling is +available in Python 1.5 and later versions, see +http://docs.python.org/library/zlib.html . + +zlib is built into tcl: http://wiki.tcl.tk/4610 . + +An experimental package to read and write files in .zip format, written on top +of zlib by Gilles Vollant , is available in the +contrib/minizip directory of zlib. + + +Notes for some targets: + +- For Windows DLL versions, please see win32/DLL_FAQ.txt + +- For 64-bit Irix, deflate.c must be compiled without any optimization. With + -O, one libpng test fails. The test works in 32 bit mode (with the -n32 + compiler flag). The compiler bug has been reported to SGI. + +- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works + when compiled with cc. + +- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is + necessary to get gzprintf working correctly. This is done by configure. + +- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with + other compilers. Use "make test" to check your compiler. + +- gzdopen is not supported on RISCOS or BEOS. + +- For PalmOs, see http://palmzlib.sourceforge.net/ + + +Acknowledgments: + + The deflate format used by zlib was defined by Phil Katz. The deflate and + zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; they + are too numerous to cite here. + +Copyright notice: + + (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/deps/zlib-1.2.10/adler32.c b/deps/zlib-1.2.10/adler32.c new file mode 100644 index 0000000..d0be438 --- /dev/null +++ b/deps/zlib-1.2.10/adler32.c @@ -0,0 +1,186 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); + +#define BASE 65521U /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ +#ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD(a) \ + do { \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32_z(adler, buf, len) + uLong adler; + const Bytef *buf; + z_size_t len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD28(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + return adler32_z(adler, buf, len); +} + +/* ========================================================================= */ +local uLong adler32_combine_(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + + /* the derivation of this formula is left as an exercise for the reader */ + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/deps/zlib-1.2.10/adler32.lo b/deps/zlib-1.2.10/adler32.lo new file mode 100644 index 0000000..1ecb87d Binary files /dev/null and b/deps/zlib-1.2.10/adler32.lo differ diff --git a/deps/zlib-1.2.10/adler32.o b/deps/zlib-1.2.10/adler32.o new file mode 100644 index 0000000..1ecb87d Binary files /dev/null and b/deps/zlib-1.2.10/adler32.o differ diff --git a/deps/zlib-1.2.10/amiga/Makefile.pup b/deps/zlib-1.2.10/amiga/Makefile.pup new file mode 100644 index 0000000..8940c12 --- /dev/null +++ b/deps/zlib-1.2.10/amiga/Makefile.pup @@ -0,0 +1,69 @@ +# Amiga powerUP (TM) Makefile +# makefile for libpng and SAS C V6.58/7.00 PPC compiler +# Copyright (C) 1998 by Andreas R. Kleinert + +LIBNAME = libzip.a + +CC = scppc +CFLAGS = NOSTKCHK NOSINT OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL \ + OPTLOOP OPTRDEP=8 OPTDEP=8 OPTCOMP=8 NOVER +AR = ppc-amigaos-ar cr +RANLIB = ppc-amigaos-ranlib +LD = ppc-amigaos-ld -r +LDFLAGS = -o +LDLIBS = LIB:scppc.a LIB:end.o +RM = delete quiet + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: example minigzip + +check: test +test: all + example + echo hello world | minigzip | minigzip -d + +$(LIBNAME): $(OBJS) + $(AR) $@ $(OBJS) + -$(RANLIB) $@ + +example: example.o $(LIBNAME) + $(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS) + +minigzip: minigzip.o $(LIBNAME) + $(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS) + +mostlyclean: clean +clean: + $(RM) *.o example minigzip $(LIBNAME) foo.gz + +zip: + zip -ul9 zlib README ChangeLog Makefile Make????.??? Makefile.?? \ + descrip.mms *.[ch] + +tgz: + cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \ + zlib/Make????.??? zlib/Makefile.?? zlib/descrip.mms zlib/*.[ch] + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: crc32.h zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzclose.o: zlib.h zconf.h gzguts.h +gzlib.o: zlib.h zconf.h gzguts.h +gzread.o: zlib.h zconf.h gzguts.h +gzwrite.o: zlib.h zconf.h gzguts.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/deps/zlib-1.2.10/amiga/Makefile.sas b/deps/zlib-1.2.10/amiga/Makefile.sas new file mode 100644 index 0000000..749e291 --- /dev/null +++ b/deps/zlib-1.2.10/amiga/Makefile.sas @@ -0,0 +1,68 @@ +# SMakefile for zlib +# Modified from the standard UNIX Makefile Copyright Jean-loup Gailly +# Osma Ahvenlampi +# Amiga, SAS/C 6.56 & Smake + +CC=sc +CFLAGS=OPT +#CFLAGS=OPT CPU=68030 +#CFLAGS=DEBUG=LINE +LDFLAGS=LIB z.lib + +SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \ + NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX \ + DEF=POSTINC + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: SCOPTIONS example minigzip + +check: test +test: all + example + echo hello world | minigzip | minigzip -d + +install: z.lib + copy clone zlib.h zconf.h INCLUDE: + copy clone z.lib LIB: + +z.lib: $(OBJS) + oml z.lib r $(OBJS) + +example: example.o z.lib + $(CC) $(CFLAGS) LINK TO $@ example.o $(LDFLAGS) + +minigzip: minigzip.o z.lib + $(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS) + +mostlyclean: clean +clean: + -delete force quiet example minigzip *.o z.lib foo.gz *.lnk SCOPTIONS + +SCOPTIONS: Makefile.sas + copy to $@ (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen; + sourceLen -= stream.avail_in; + } + err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH); + } while (err == Z_OK); + + *destLen = stream.total_out; + deflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; +} diff --git a/deps/zlib-1.2.10/compress.lo b/deps/zlib-1.2.10/compress.lo new file mode 100644 index 0000000..ca6c6bf Binary files /dev/null and b/deps/zlib-1.2.10/compress.lo differ diff --git a/deps/zlib-1.2.10/compress.o b/deps/zlib-1.2.10/compress.o new file mode 100644 index 0000000..ca6c6bf Binary files /dev/null and b/deps/zlib-1.2.10/compress.o differ diff --git a/deps/zlib-1.2.10/configure b/deps/zlib-1.2.10/configure new file mode 100755 index 0000000..e974d1f --- /dev/null +++ b/deps/zlib-1.2.10/configure @@ -0,0 +1,921 @@ +#!/bin/sh +# configure script for zlib. +# +# Normally configure builds both a static and a shared library. +# If you want to build just a static library, use: ./configure --static +# +# To impose specific compiler or flags or install directory, use for example: +# prefix=$HOME CC=cc CFLAGS="-O4" ./configure +# or for csh/tcsh users: +# (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure) + +# Incorrect settings of CC or CFLAGS may prevent creating a shared library. +# If you have problems, try without defining CC and CFLAGS before reporting +# an error. + +# start off configure.log +echo -------------------- >> configure.log +echo $0 $* >> configure.log +date >> configure.log + +# get source directory +SRCDIR=`dirname $0` +if test $SRCDIR = "."; then + ZINC="" + ZINCOUT="-I." + SRCDIR="" +else + ZINC='-include zconf.h' + ZINCOUT='-I. -I$(SRCDIR)' + SRCDIR="$SRCDIR/" +fi + +# set command prefix for cross-compilation +if [ -n "${CHOST}" ]; then + uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`" + CROSS_PREFIX="${CHOST}-" +fi + +# destination name for static library +STATICLIB=libz.a + +# extract zlib version numbers from zlib.h +VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < ${SRCDIR}zlib.h` +VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < ${SRCDIR}zlib.h` +VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < ${SRCDIR}zlib.h` +VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < ${SRCDIR}zlib.h` + +# establish commands for library building +if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then + AR=${AR-"${CROSS_PREFIX}ar"} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log +else + AR=${AR-"ar"} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log +fi +ARFLAGS=${ARFLAGS-"rc"} +if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then + RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"} + test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} | tee -a configure.log +else + RANLIB=${RANLIB-"ranlib"} +fi +if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then + NM=${NM-"${CROSS_PREFIX}nm"} + test -n "${CROSS_PREFIX}" && echo Using ${NM} | tee -a configure.log +else + NM=${NM-"nm"} +fi + +# set defaults before processing command line options +LDCONFIG=${LDCONFIG-"ldconfig"} +LDSHAREDLIBC="${LDSHAREDLIBC--lc}" +ARCHS= +prefix=${prefix-/usr/local} +exec_prefix=${exec_prefix-'${prefix}'} +libdir=${libdir-'${exec_prefix}/lib'} +sharedlibdir=${sharedlibdir-'${libdir}'} +includedir=${includedir-'${prefix}/include'} +mandir=${mandir-'${prefix}/share/man'} +shared_ext='.so' +shared=1 +solo=0 +cover=0 +zprefix=0 +zconst=0 +build64=0 +gcc=0 +warn=0 +debug=0 +old_cc="$CC" +old_cflags="$CFLAGS" +OBJC='$(OBJZ) $(OBJG)' +PIC_OBJC='$(PIC_OBJZ) $(PIC_OBJG)' + +# leave this script, optionally in a bad way +leave() +{ + if test "$*" != "0"; then + echo "** $0 aborting." | tee -a configure.log + fi + rm -f $test.[co] $test $test$shared_ext $test.gcno ./--version + echo -------------------- >> configure.log + echo >> configure.log + echo >> configure.log + exit $1 +} + +# process command line options +while test $# -ge 1 +do +case "$1" in + -h* | --help) + echo 'usage:' | tee -a configure.log + echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log + echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log + echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log + exit 0 ;; + -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; + -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; + -l*=* | --libdir=*) libdir=`echo $1 | sed 's/.*=//'`; shift ;; + --sharedlibdir=*) sharedlibdir=`echo $1 | sed 's/.*=//'`; shift ;; + -i*=* | --includedir=*) includedir=`echo $1 | sed 's/.*=//'`;shift ;; + -u*=* | --uname=*) uname=`echo $1 | sed 's/.*=//'`;shift ;; + -p* | --prefix) prefix="$2"; shift; shift ;; + -e* | --eprefix) exec_prefix="$2"; shift; shift ;; + -l* | --libdir) libdir="$2"; shift; shift ;; + -i* | --includedir) includedir="$2"; shift; shift ;; + -s* | --shared | --enable-shared) shared=1; shift ;; + -t | --static) shared=0; shift ;; + --solo) solo=1; shift ;; + --cover) cover=1; shift ;; + -z* | --zprefix) zprefix=1; shift ;; + -6* | --64) build64=1; shift ;; + -a*=* | --archs=*) ARCHS=`echo $1 | sed 's/.*=//'`; shift ;; + --sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;; + --localstatedir=*) echo "ignored option: --localstatedir" | tee -a configure.log; shift ;; + -c* | --const) zconst=1; shift ;; + -w* | --warn) warn=1; shift ;; + -d* | --debug) debug=1; shift ;; + *) + echo "unknown option: $1" | tee -a configure.log + echo "$0 --help for help" | tee -a configure.log + leave 1;; + esac +done + +# temporary file name +test=ztest$$ + +# put arguments in log, also put test file in log if used in arguments +show() +{ + case "$*" in + *$test.c*) + echo === $test.c === >> configure.log + cat $test.c >> configure.log + echo === >> configure.log;; + esac + echo $* >> configure.log +} + +# check for gcc vs. cc and set compile and link flags based on the system identified by uname +cat > $test.c <&1` in + *gcc*) gcc=1 ;; + *clang*) gcc=1 ;; +esac + +show $cc -c $test.c +if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then + echo ... using gcc >> configure.log + CC="$cc" + CFLAGS="${CFLAGS--O3}" + SFLAGS="${CFLAGS--O3} -fPIC" + if test "$ARCHS"; then + CFLAGS="${CFLAGS} ${ARCHS}" + LDFLAGS="${LDFLAGS} ${ARCHS}" + fi + if test $build64 -eq 1; then + CFLAGS="${CFLAGS} -m64" + SFLAGS="${SFLAGS} -m64" + fi + if test "$warn" -eq 1; then + if test "$zconst" -eq 1; then + CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -pedantic -DZLIB_CONST" + else + CFLAGS="${CFLAGS} -Wall -Wextra -pedantic" + fi + fi + if test $debug -eq 1; then + CFLAGS="${CFLAGS} -DZLIB_DEBUG" + SFLAGS="${SFLAGS} -DZLIB_DEBUG" + fi + if test -z "$uname"; then + uname=`(uname -s || echo unknown) 2>/dev/null` + fi + case "$uname" in + Linux* | linux* | GNU | GNU/* | solaris*) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} ;; + *BSD | *bsd* | DragonFly) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} + LDCONFIG="ldconfig -m" ;; + CYGWIN* | Cygwin* | cygwin* | OS/2*) + EXE='.exe' ;; + MINGW* | mingw*) +# temporary bypass + rm -f $test.[co] $test $test$shared_ext + echo "Please use win32/Makefile.gcc instead." | tee -a configure.log + leave 1 + LDSHARED=${LDSHARED-"$cc -shared"} + LDSHAREDLIBC="" + EXE='.exe' ;; + QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 + # (alain.bonnefoy@icbt.com) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;; + HP-UX*) + LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} + case `(uname -m || echo unknown) 2>/dev/null` in + ia64) + shared_ext='.so' + SHAREDLIB='libz.so' ;; + *) + shared_ext='.sl' + SHAREDLIB='libz.sl' ;; + esac ;; + Darwin* | darwin*) + shared_ext='.dylib' + SHAREDLIB=libz$shared_ext + SHAREDLIBV=libz.$VER$shared_ext + SHAREDLIBM=libz.$VER1$shared_ext + LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} + if libtool -V 2>&1 | grep Apple > /dev/null; then + AR="libtool" + else + AR="/usr/bin/libtool" + fi + ARFLAGS="-o" ;; + *) LDSHARED=${LDSHARED-"$cc -shared"} ;; + esac +else + # find system name and corresponding cc options + CC=${CC-cc} + gcc=0 + echo ... using $CC >> configure.log + if test -z "$uname"; then + uname=`(uname -sr || echo unknown) 2>/dev/null` + fi + case "$uname" in + HP-UX*) SFLAGS=${CFLAGS-"-O +z"} + CFLAGS=${CFLAGS-"-O"} +# LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"} + LDSHARED=${LDSHARED-"ld -b"} + case `(uname -m || echo unknown) 2>/dev/null` in + ia64) + shared_ext='.so' + SHAREDLIB='libz.so' ;; + *) + shared_ext='.sl' + SHAREDLIB='libz.sl' ;; + esac ;; + IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."} + CFLAGS=${CFLAGS-"-ansi -O2"} + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;; + OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"} + CFLAGS=${CFLAGS-"-O -std1"} + LDFLAGS="${LDFLAGS} -Wl,-rpath,." + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"} ;; + OSF1*) SFLAGS=${CFLAGS-"-O -std1"} + CFLAGS=${CFLAGS-"-O -std1"} + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;; + QNX*) SFLAGS=${CFLAGS-"-4 -O"} + CFLAGS=${CFLAGS-"-4 -O"} + LDSHARED=${LDSHARED-"cc"} + RANLIB=${RANLIB-"true"} + AR="cc" + ARFLAGS="-A" ;; + SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} + CFLAGS=${CFLAGS-"-O3"} + LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;; + SunOS\ 5* | solaris*) + LDSHARED=${LDSHARED-"cc -G -h libz$shared_ext.$VER1"} + SFLAGS=${CFLAGS-"-fast -KPIC"} + CFLAGS=${CFLAGS-"-fast"} + if test $build64 -eq 1; then + # old versions of SunPRO/Workshop/Studio don't support -m64, + # but newer ones do. Check for it. + flag64=`$CC -flags | egrep -- '^-m64'` + if test x"$flag64" != x"" ; then + CFLAGS="${CFLAGS} -m64" + SFLAGS="${SFLAGS} -m64" + else + case `(uname -m || echo unknown) 2>/dev/null` in + i86*) + SFLAGS="$SFLAGS -xarch=amd64" + CFLAGS="$CFLAGS -xarch=amd64" ;; + *) + SFLAGS="$SFLAGS -xarch=v9" + CFLAGS="$CFLAGS -xarch=v9" ;; + esac + fi + fi + if test -n "$ZINC"; then + ZINC='-I- -I. -I$(SRCDIR)' + fi + ;; + SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} + CFLAGS=${CFLAGS-"-O2"} + LDSHARED=${LDSHARED-"ld"} ;; + SunStudio\ 9*) SFLAGS=${CFLAGS-"-fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"} + CFLAGS=${CFLAGS-"-fast -xtarget=ultra3 -xarch=v9b"} + LDSHARED=${LDSHARED-"cc -xarch=v9b"} ;; + UNIX_System_V\ 4.2.0) + SFLAGS=${CFLAGS-"-KPIC -O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -G"} ;; + UNIX_SV\ 4.2MP) + SFLAGS=${CFLAGS-"-Kconform_pic -O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -G"} ;; + OpenUNIX\ 5) + SFLAGS=${CFLAGS-"-KPIC -O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -G"} ;; + AIX*) # Courtesy of dbakker@arrayasolutions.com + SFLAGS=${CFLAGS-"-O -qmaxmem=8192"} + CFLAGS=${CFLAGS-"-O -qmaxmem=8192"} + LDSHARED=${LDSHARED-"xlc -G"} ;; + # send working options for other systems to zlib@gzip.org + *) SFLAGS=${CFLAGS-"-O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -shared"} ;; + esac +fi + +# destination names for shared library if not defined above +SHAREDLIB=${SHAREDLIB-"libz$shared_ext"} +SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"} +SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"} + +echo >> configure.log + +# define functions for testing compiler and library characteristics and logging the results + +cat > $test.c </dev/null; then + try() + { + show $* + test "`( $* ) 2>&1 | tee -a configure.log`" = "" + } + echo - using any output from compiler to indicate an error >> configure.log +else + try() + { + show $* + ( $* ) >> configure.log 2>&1 + ret=$? + if test $ret -ne 0; then + echo "(exit code "$ret")" >> configure.log + fi + return $ret + } +fi + +tryboth() +{ + show $* + got=`( $* ) 2>&1` + ret=$? + printf %s "$got" >> configure.log + if test $ret -ne 0; then + return $ret + fi + test "$got" = "" +} + +cat > $test.c << EOF +int foo() { return 0; } +EOF +echo "Checking for obsessive-compulsive compiler options..." >> configure.log +if try $CC -c $CFLAGS $test.c; then + : +else + echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log + leave 1 +fi + +echo >> configure.log + +# see if shared library build supported +cat > $test.c <> configure.log + show "$NM $test.o | grep _hello" + if test "`$NM $test.o | grep _hello | tee -a configure.log`" = ""; then + CPP="$CPP -DNO_UNDERLINE" + echo Checking for underline in external names... No. | tee -a configure.log + else + echo Checking for underline in external names... Yes. | tee -a configure.log + fi ;; +esac + +echo >> configure.log + +# check for size_t +cat > $test.c < +#include +size_t dummy = 0; +EOF +if try $CC -c $CFLAGS $test.c; then + echo "Checking for size_t... Yes." | tee -a configure.log + need_sizet=0 +else + echo "Checking for size_t... No." | tee -a configure.log + need_sizet=1 +fi + +echo >> configure.log + +# find the size_t integer type, if needed +if test $need_sizet -eq 1; then + cat > $test.c < $test.c < +int main(void) { + if (sizeof(void *) <= sizeof(int)) puts("int"); + else if (sizeof(void *) <= sizeof(long)) puts("long"); + else puts("z_longlong"); + return 0; +} +EOF + else + echo "Checking for long long... No." | tee -a configure.log + cat > $test.c < +int main(void) { + if (sizeof(void *) <= sizeof(int)) puts("int"); + else puts("long"); + return 0; +} +EOF + fi + if try $CC $CFLAGS -o $test $test.c; then + sizet=`./$test` + echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log + else + echo "Failed to find a pointer-size integer type." | tee -a configure.log + leave 1 + fi +fi + +if test $need_sizet -eq 1; then + CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}" + SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}" +fi + +echo >> configure.log + +# check for large file support, and if none, check for fseeko() +cat > $test.c < +off64_t dummy = 0; +EOF +if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then + CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1" + SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1" + ALL="${ALL} all64" + TEST="${TEST} test64" + echo "Checking for off64_t... Yes." | tee -a configure.log + echo "Checking for fseeko... Yes." | tee -a configure.log +else + echo "Checking for off64_t... No." | tee -a configure.log + echo >> configure.log + cat > $test.c < +int main(void) { + fseeko(NULL, 0, 0); + return 0; +} +EOF + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for fseeko... Yes." | tee -a configure.log + else + CFLAGS="${CFLAGS} -DNO_FSEEKO" + SFLAGS="${SFLAGS} -DNO_FSEEKO" + echo "Checking for fseeko... No." | tee -a configure.log + fi +fi + +echo >> configure.log + +# check for strerror() for use by gz* functions +cat > $test.c < +#include +int main() { return strlen(strerror(errno)); } +EOF +if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for strerror... Yes." | tee -a configure.log +else + CFLAGS="${CFLAGS} -DNO_STRERROR" + SFLAGS="${SFLAGS} -DNO_STRERROR" + echo "Checking for strerror... No." | tee -a configure.log +fi + +# copy clean zconf.h for subsequent edits +cp -p ${SRCDIR}zconf.h.in zconf.h + +echo >> configure.log + +# check for unistd.h and save result in zconf.h +cat > $test.c < +int main() { return 0; } +EOF +if try $CC -c $CFLAGS $test.c; then + sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Checking for unistd.h... Yes." | tee -a configure.log +else + echo "Checking for unistd.h... No." | tee -a configure.log +fi + +echo >> configure.log + +# check for stdarg.h and save result in zconf.h +cat > $test.c < +int main() { return 0; } +EOF +if try $CC -c $CFLAGS $test.c; then + sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/def HAVE_STDARG_H\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Checking for stdarg.h... Yes." | tee -a configure.log +else + echo "Checking for stdarg.h... No." | tee -a configure.log +fi + +# if the z_ prefix was requested, save that in zconf.h +if test $zprefix -eq 1; then + sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo >> configure.log + echo "Using z_ prefix on all symbols." | tee -a configure.log +fi + +# if --solo compilation was requested, save that in zconf.h and remove gz stuff from object lists +if test $solo -eq 1; then + sed '/#define ZCONF_H/a\ +#define Z_SOLO + +' < zconf.h > zconf.temp.h + mv zconf.temp.h zconf.h +OBJC='$(OBJZ)' +PIC_OBJC='$(PIC_OBJZ)' +fi + +# if code coverage testing was requested, use older gcc if defined, e.g. "gcc-4.2" on Mac OS X +if test $cover -eq 1; then + CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage" + if test -n "$GCC_CLASSIC"; then + CC=$GCC_CLASSIC + fi +fi + +echo >> configure.log + +# conduct a series of tests to resolve eight possible cases of using "vs" or "s" printf functions +# (using stdarg or not), with or without "n" (proving size of buffer), and with or without a +# return value. The most secure result is vsnprintf() with a return value. snprintf() with a +# return value is secure as well, but then gzprintf() will be limited to 20 arguments. +cat > $test.c < +#include +#include "zconf.h" +int main() +{ +#ifndef STDC + choke me +#endif + return 0; +} +EOF +if try $CC -c $CFLAGS $test.c; then + echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." | tee -a configure.log + + echo >> configure.log + cat > $test.c < +#include +int mytest(const char *fmt, ...) +{ + char buf[20]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return 0; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +#include +int mytest(const char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return n; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsnprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_vsnprintf_void" + SFLAGS="$SFLAGS -DHAS_vsnprintf_void" + echo "Checking for return value of vsnprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsnprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + else + CFLAGS="$CFLAGS -DNO_vsnprintf" + SFLAGS="$SFLAGS -DNO_vsnprintf" + echo "Checking for vsnprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +#include +int mytest(const char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + va_start(ap, fmt); + n = vsprintf(buf, fmt, ap); + va_end(ap); + return n; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_vsprintf_void" + SFLAGS="$SFLAGS -DHAS_vsprintf_void" + echo "Checking for return value of vsprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + fi +else + echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +int mytest() +{ + char buf[20]; + snprintf(buf, sizeof(buf), "%s", "foo"); + return 0; +} +int main() +{ + return (mytest()); +} +EOF + + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +int mytest() +{ + char buf[20]; + return snprintf(buf, sizeof(buf), "%s", "foo"); +} +int main() +{ + return (mytest()); +} +EOF + + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of snprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_snprintf_void" + SFLAGS="$SFLAGS -DHAS_snprintf_void" + echo "Checking for return value of snprintf()... No." | tee -a configure.log + echo " WARNING: apparently snprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + else + CFLAGS="$CFLAGS -DNO_snprintf" + SFLAGS="$SFLAGS -DNO_snprintf" + echo "Checking for snprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +int mytest() +{ + char buf[20]; + return sprintf(buf, "%s", "foo"); +} +int main() +{ + return (mytest()); +} +EOF + + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of sprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_sprintf_void" + SFLAGS="$SFLAGS -DHAS_sprintf_void" + echo "Checking for return value of sprintf()... No." | tee -a configure.log + echo " WARNING: apparently sprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + fi +fi + +# see if we can hide zlib internal symbols that are linked between separate source files +if test "$gcc" -eq 1; then + echo >> configure.log + cat > $test.c <> configure.log +echo ALL = $ALL >> configure.log +echo AR = $AR >> configure.log +echo ARFLAGS = $ARFLAGS >> configure.log +echo CC = $CC >> configure.log +echo CFLAGS = $CFLAGS >> configure.log +echo CPP = $CPP >> configure.log +echo EXE = $EXE >> configure.log +echo LDCONFIG = $LDCONFIG >> configure.log +echo LDFLAGS = $LDFLAGS >> configure.log +echo LDSHARED = $LDSHARED >> configure.log +echo LDSHAREDLIBC = $LDSHAREDLIBC >> configure.log +echo OBJC = $OBJC >> configure.log +echo PIC_OBJC = $PIC_OBJC >> configure.log +echo RANLIB = $RANLIB >> configure.log +echo SFLAGS = $SFLAGS >> configure.log +echo SHAREDLIB = $SHAREDLIB >> configure.log +echo SHAREDLIBM = $SHAREDLIBM >> configure.log +echo SHAREDLIBV = $SHAREDLIBV >> configure.log +echo STATICLIB = $STATICLIB >> configure.log +echo TEST = $TEST >> configure.log +echo VER = $VER >> configure.log +echo Z_U4 = $Z_U4 >> configure.log +echo SRCDIR = $SRCDIR >> configure.log +echo exec_prefix = $exec_prefix >> configure.log +echo includedir = $includedir >> configure.log +echo libdir = $libdir >> configure.log +echo mandir = $mandir >> configure.log +echo prefix = $prefix >> configure.log +echo sharedlibdir = $sharedlibdir >> configure.log +echo uname = $uname >> configure.log + +# udpate Makefile with the configure results +sed < ${SRCDIR}Makefile.in " +/^CC *=/s#=.*#=$CC# +/^CFLAGS *=/s#=.*#=$CFLAGS# +/^SFLAGS *=/s#=.*#=$SFLAGS# +/^LDFLAGS *=/s#=.*#=$LDFLAGS# +/^LDSHARED *=/s#=.*#=$LDSHARED# +/^CPP *=/s#=.*#=$CPP# +/^STATICLIB *=/s#=.*#=$STATICLIB# +/^SHAREDLIB *=/s#=.*#=$SHAREDLIB# +/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# +/^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# +/^RANLIB *=/s#=.*#=$RANLIB# +/^LDCONFIG *=/s#=.*#=$LDCONFIG# +/^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC# +/^EXE *=/s#=.*#=$EXE# +/^SRCDIR *=/s#=.*#=$SRCDIR# +/^ZINC *=/s#=.*#=$ZINC# +/^ZINCOUT *=/s#=.*#=$ZINCOUT# +/^prefix *=/s#=.*#=$prefix# +/^exec_prefix *=/s#=.*#=$exec_prefix# +/^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# +/^includedir *=/s#=.*#=$includedir# +/^mandir *=/s#=.*#=$mandir# +/^OBJC *=/s#=.*#= $OBJC# +/^PIC_OBJC *=/s#=.*#= $PIC_OBJC# +/^all: */s#:.*#: $ALL# +/^test: */s#:.*#: $TEST# +" > Makefile + +# create zlib.pc with the configure results +sed < ${SRCDIR}zlib.pc.in " +/^CC *=/s#=.*#=$CC# +/^CFLAGS *=/s#=.*#=$CFLAGS# +/^CPP *=/s#=.*#=$CPP# +/^LDSHARED *=/s#=.*#=$LDSHARED# +/^STATICLIB *=/s#=.*#=$STATICLIB# +/^SHAREDLIB *=/s#=.*#=$SHAREDLIB# +/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# +/^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# +/^RANLIB *=/s#=.*#=$RANLIB# +/^EXE *=/s#=.*#=$EXE# +/^prefix *=/s#=.*#=$prefix# +/^exec_prefix *=/s#=.*#=$exec_prefix# +/^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# +/^includedir *=/s#=.*#=$includedir# +/^mandir *=/s#=.*#=$mandir# +/^LDFLAGS *=/s#=.*#=$LDFLAGS# +" | sed -e " +s/\@VERSION\@/$VER/g; +" > zlib.pc + +# done +leave 0 diff --git a/deps/zlib-1.2.10/configure.log b/deps/zlib-1.2.10/configure.log new file mode 100644 index 0000000..3ff3bcb --- /dev/null +++ b/deps/zlib-1.2.10/configure.log @@ -0,0 +1,555 @@ +-------------------- +./configure --prefix=/opt/files/release/zlib/aarch64/ +Mon Aug 21 20:40:35 CST 2023 +=== ztest62828.c === +extern int getchar(); +int hello() {return getchar();} +=== +arm-linux-gnueabi-gcc -c ztest62828.c +... using gcc + +Checking for obsessive-compulsive compiler options... +=== ztest62828.c === +int foo() { return 0; } +=== +arm-linux-gnueabi-gcc -c -O3 ztest62828.c + +Checking for shared library support... +=== ztest62828.c === +extern int getchar(); +int hello() {return getchar();} +=== +arm-linux-gnueabi-gcc -w -c -O3 -fPIC ztest62828.c +arm-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O3 -fPIC -o ztest62828.so ztest62828.o +Building shared library libz.so.1.2.10 with arm-linux-gnueabi-gcc. + +=== ztest62828.c === +#include +#include +size_t dummy = 0; +=== +arm-linux-gnueabi-gcc -c -O3 ztest62828.c +Checking for size_t... Yes. + + +=== ztest62828.c === +#include +off64_t dummy = 0; +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest62828.c +Checking for off64_t... Yes. +Checking for fseeko... Yes. + +=== ztest62828.c === +#include +#include +int main() { return strlen(strerror(errno)); } +=== +arm-linux-gnueabi-gcc -O3 -D_LARGEFILE64_SOURCE=1 -o ztest62828 ztest62828.c +Checking for strerror... Yes. + +=== ztest62828.c === +#include +int main() { return 0; } +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest62828.c +Checking for unistd.h... Yes. + +=== ztest62828.c === +#include +int main() { return 0; } +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest62828.c +Checking for stdarg.h... Yes. + +=== ztest62828.c === +#include +#include +#include "zconf.h" +int main() +{ +#ifndef STDC + choke me +#endif + return 0; +} +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest62828.c +Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf(). + +=== ztest62828.c === +#include +#include +int mytest(const char *fmt, ...) +{ + char buf[20]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return 0; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +=== +arm-linux-gnueabi-gcc -O3 -D_LARGEFILE64_SOURCE=1 -o ztest62828 ztest62828.c +Checking for vsnprintf() in stdio.h... Yes. + +=== ztest62828.c === +#include +#include +int mytest(const char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return n; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest62828.c +Checking for return value of vsnprintf()... Yes. + +=== ztest62828.c === +#define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +int ZLIB_INTERNAL foo; +int main() +{ + return 0; +} +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest62828.c +Checking for attribute(visibility) support... Yes. + +ALL = static shared all64 +AR = arm-linux-gnueabi-ar +ARFLAGS = rc +CC = arm-linux-gnueabi-gcc +CFLAGS = -O3 -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN +CPP = arm-linux-gnueabi-gcc -E +EXE = +LDCONFIG = ldconfig +LDFLAGS = +LDSHARED = arm-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map +LDSHAREDLIBC = -lc +OBJC = $(OBJZ) $(OBJG) +PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) +RANLIB = arm-linux-gnueabi-gcc-ranlib +SFLAGS = -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN +SHAREDLIB = libz.so +SHAREDLIBM = libz.so.1 +SHAREDLIBV = libz.so.1.2.10 +STATICLIB = libz.a +TEST = all teststatic testshared test64 +VER = 1.2.10 +Z_U4 = +SRCDIR = +exec_prefix = ${prefix} +includedir = ${prefix}/include +libdir = ${exec_prefix}/lib +mandir = ${prefix}/share/man +prefix = /opt/files/release/zlib/aarch64/ +sharedlibdir = ${libdir} +uname = Linux +-------------------- + + +-------------------- +./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --prefix=/opt/files/release/elfutils/aarch64/ --disable-debuginfod +Mon Aug 21 20:50:25 CST 2023 +unknown option: --host=arm-none-linux-gnueabi +./configure --help for help +** ./configure aborting. +-------------------- + + +-------------------- +./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --prefix=/opt/files/release/elfutils/aarch64/ --disable-debuginfod +Mon Aug 21 20:50:32 CST 2023 +unknown option: --host=arm-none-linux-gnueabi +./configure --help for help +** ./configure aborting. +-------------------- + + +-------------------- +./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --prefix=/opt/files/release/elfutils/aarch64/ --disable-debuginfod +Mon Aug 21 20:50:49 CST 2023 +unknown option: --host=arm-none-linux-gnueabi +./configure --help for help +** ./configure aborting. +-------------------- + + +-------------------- +./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --prefix=/opt/files/release/elfutils/aarch64/ --disable-debuginfod +Mon Aug 21 20:50:57 CST 2023 +unknown option: --host=arm-none-linux-gnueabi +./configure --help for help +** ./configure aborting. +-------------------- + + +-------------------- +./configure --host=arm-linux-gnueabi-gcc-linux --prefix=/opt/files/release/elfutils/aarch64/ --disable-debuginfod +Mon Aug 21 20:51:07 CST 2023 +unknown option: --host=arm-linux-gnueabi-gcc-linux +./configure --help for help +** ./configure aborting. +-------------------- + + +-------------------- +./configure --prefix=/usr/lib/aarch64/ +Mon Aug 21 21:08:39 CST 2023 +=== ztest79095.c === +extern int getchar(); +int hello() {return getchar();} +=== +arm-linux-gnueabi-gcc -c ztest79095.c +... using gcc + +Checking for obsessive-compulsive compiler options... +=== ztest79095.c === +int foo() { return 0; } +=== +arm-linux-gnueabi-gcc -c -O3 ztest79095.c + +Checking for shared library support... +=== ztest79095.c === +extern int getchar(); +int hello() {return getchar();} +=== +arm-linux-gnueabi-gcc -w -c -O3 -fPIC ztest79095.c +arm-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O3 -fPIC -o ztest79095.so ztest79095.o +Building shared library libz.so.1.2.10 with arm-linux-gnueabi-gcc. + +=== ztest79095.c === +#include +#include +size_t dummy = 0; +=== +arm-linux-gnueabi-gcc -c -O3 ztest79095.c +Checking for size_t... Yes. + + +=== ztest79095.c === +#include +off64_t dummy = 0; +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest79095.c +Checking for off64_t... Yes. +Checking for fseeko... Yes. + +=== ztest79095.c === +#include +#include +int main() { return strlen(strerror(errno)); } +=== +arm-linux-gnueabi-gcc -O3 -D_LARGEFILE64_SOURCE=1 -o ztest79095 ztest79095.c +Checking for strerror... Yes. + +=== ztest79095.c === +#include +int main() { return 0; } +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest79095.c +Checking for unistd.h... Yes. + +=== ztest79095.c === +#include +int main() { return 0; } +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest79095.c +Checking for stdarg.h... Yes. + +=== ztest79095.c === +#include +#include +#include "zconf.h" +int main() +{ +#ifndef STDC + choke me +#endif + return 0; +} +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest79095.c +Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf(). + +=== ztest79095.c === +#include +#include +int mytest(const char *fmt, ...) +{ + char buf[20]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return 0; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +=== +arm-linux-gnueabi-gcc -O3 -D_LARGEFILE64_SOURCE=1 -o ztest79095 ztest79095.c +Checking for vsnprintf() in stdio.h... Yes. + +=== ztest79095.c === +#include +#include +int mytest(const char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return n; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest79095.c +Checking for return value of vsnprintf()... Yes. + +=== ztest79095.c === +#define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +int ZLIB_INTERNAL foo; +int main() +{ + return 0; +} +=== +arm-linux-gnueabi-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest79095.c +Checking for attribute(visibility) support... Yes. + +ALL = static shared all64 +AR = arm-linux-gnueabi-ar +ARFLAGS = rc +CC = arm-linux-gnueabi-gcc +CFLAGS = -O3 -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN +CPP = arm-linux-gnueabi-gcc -E +EXE = +LDCONFIG = ldconfig +LDFLAGS = +LDSHARED = arm-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map +LDSHAREDLIBC = -lc +OBJC = $(OBJZ) $(OBJG) +PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) +RANLIB = arm-linux-gnueabi-gcc-ranlib +SFLAGS = -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN +SHAREDLIB = libz.so +SHAREDLIBM = libz.so.1 +SHAREDLIBV = libz.so.1.2.10 +STATICLIB = libz.a +TEST = all teststatic testshared test64 +VER = 1.2.10 +Z_U4 = +SRCDIR = +exec_prefix = ${prefix} +includedir = ${prefix}/include +libdir = ${exec_prefix}/lib +mandir = ${prefix}/share/man +prefix = /usr/lib/aarch64/ +sharedlibdir = ${libdir} +uname = Linux +-------------------- + + +-------------------- +./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --prefix=/opt/files/release/elfutils/aarch64/ --disable-debuginfod +Mon Aug 21 21:09:51 CST 2023 +unknown option: --host=arm-none-linux-gnueabi +./configure --help for help +** ./configure aborting. +-------------------- + + +-------------------- +./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --prefix=/opt/files/release/elfutils/aarch64/ --disable-debuginfod +Mon Aug 21 21:09:56 CST 2023 +unknown option: --host=arm-none-linux-gnueabi +./configure --help for help +** ./configure aborting. +-------------------- + + +-------------------- +./configure --prefix=/opt/files/release/zlib/aarch64/ +Tue Aug 22 01:35:34 CST 2023 +=== ztest155678.c === +extern int getchar(); +int hello() {return getchar();} +=== +aarch64-linux-gnu-gcc -c ztest155678.c +... using gcc + +Checking for obsessive-compulsive compiler options... +=== ztest155678.c === +int foo() { return 0; } +=== +aarch64-linux-gnu-gcc -c -O3 ztest155678.c + +Checking for shared library support... +=== ztest155678.c === +extern int getchar(); +int hello() {return getchar();} +=== +aarch64-linux-gnu-gcc -w -c -O3 -fPIC ztest155678.c +aarch64-linux-gnu-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O3 -fPIC -o ztest155678.so ztest155678.o +Building shared library libz.so.1.2.10 with aarch64-linux-gnu-gcc. + +=== ztest155678.c === +#include +#include +size_t dummy = 0; +=== +aarch64-linux-gnu-gcc -c -O3 ztest155678.c +Checking for size_t... Yes. + + +=== ztest155678.c === +#include +off64_t dummy = 0; +=== +aarch64-linux-gnu-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest155678.c +Checking for off64_t... Yes. +Checking for fseeko... Yes. + +=== ztest155678.c === +#include +#include +int main() { return strlen(strerror(errno)); } +=== +aarch64-linux-gnu-gcc -O3 -D_LARGEFILE64_SOURCE=1 -o ztest155678 ztest155678.c +Checking for strerror... Yes. + +=== ztest155678.c === +#include +int main() { return 0; } +=== +aarch64-linux-gnu-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest155678.c +Checking for unistd.h... Yes. + +=== ztest155678.c === +#include +int main() { return 0; } +=== +aarch64-linux-gnu-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest155678.c +Checking for stdarg.h... Yes. + +=== ztest155678.c === +#include +#include +#include "zconf.h" +int main() +{ +#ifndef STDC + choke me +#endif + return 0; +} +=== +aarch64-linux-gnu-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest155678.c +Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf(). + +=== ztest155678.c === +#include +#include +int mytest(const char *fmt, ...) +{ + char buf[20]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return 0; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +=== +aarch64-linux-gnu-gcc -O3 -D_LARGEFILE64_SOURCE=1 -o ztest155678 ztest155678.c +Checking for vsnprintf() in stdio.h... Yes. + +=== ztest155678.c === +#include +#include +int mytest(const char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return n; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +=== +aarch64-linux-gnu-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest155678.c +Checking for return value of vsnprintf()... Yes. + +=== ztest155678.c === +#define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +int ZLIB_INTERNAL foo; +int main() +{ + return 0; +} +=== +aarch64-linux-gnu-gcc -c -O3 -D_LARGEFILE64_SOURCE=1 ztest155678.c +Checking for attribute(visibility) support... Yes. + +ALL = static shared all64 +AR = aarch64-linux-gnu-ar +ARFLAGS = rc +CC = aarch64-linux-gnu-gcc +CFLAGS = -O3 -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN +CPP = aarch64-linux-gnu-gcc -E +EXE = +LDCONFIG = ldconfig +LDFLAGS = +LDSHARED = aarch64-linux-gnu-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map +LDSHAREDLIBC = -lc +OBJC = $(OBJZ) $(OBJG) +PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) +RANLIB = aarch64-linux-gnu-gcc-ranlib +SFLAGS = -O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN +SHAREDLIB = libz.so +SHAREDLIBM = libz.so.1 +SHAREDLIBV = libz.so.1.2.10 +STATICLIB = libz.a +TEST = all teststatic testshared test64 +VER = 1.2.10 +Z_U4 = +SRCDIR = +exec_prefix = ${prefix} +includedir = ${prefix}/include +libdir = ${exec_prefix}/lib +mandir = ${prefix}/share/man +prefix = /opt/files/release/zlib/aarch64/ +sharedlibdir = ${libdir} +uname = Linux +-------------------- + + diff --git a/deps/zlib-1.2.10/contrib/README.contrib b/deps/zlib-1.2.10/contrib/README.contrib new file mode 100644 index 0000000..a411d5c --- /dev/null +++ b/deps/zlib-1.2.10/contrib/README.contrib @@ -0,0 +1,78 @@ +All files under this contrib directory are UNSUPPORTED. There were +provided by users of zlib and were not tested by the authors of zlib. +Use at your own risk. Please contact the authors of the contributions +for help about these, not the zlib authors. Thanks. + + +ada/ by Dmitriy Anisimkov + Support for Ada + See http://zlib-ada.sourceforge.net/ + +amd64/ by Mikhail Teterin + asm code for AMD64 + See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393 + +asm686/ by Brian Raiter + asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax + See http://www.muppetlabs.com/~breadbox/software/assembly.html + +blast/ by Mark Adler + Decompressor for output of PKWare Data Compression Library (DCL) + +delphi/ by Cosmin Truta + Support for Delphi and C++ Builder + +dotzlib/ by Henrik Ravn + Support for Microsoft .Net and Visual C++ .Net + +gcc_gvmat64/by Gilles Vollant + GCC Version of x86 64-bit (AMD64 and Intel EM64t) code for x64 + assembler to replace longest_match() and inflate_fast() + +infback9/ by Mark Adler + Unsupported diffs to infback to decode the deflate64 format + +inflate86/ by Chris Anderson + Tuned x86 gcc asm code to replace inflate_fast() + +iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + +iostream2/ by Tyge Løvset + Another C++ I/O streams interface + +iostream3/ by Ludwig Schwardt + and Kevin Ruland + Yet another C++ I/O streams interface + +masmx64/ by Gilles Vollant + x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to + replace longest_match() and inflate_fast(), also masm x86 + 64-bits translation of Chris Anderson inflate_fast() + +masmx86/ by Gilles Vollant + x86 asm code to replace longest_match() and inflate_fast(), + for Visual C++ and MASM (32 bits). + Based on Brian Raiter (asm686) and Chris Anderson (inflate86) + +minizip/ by Gilles Vollant + Mini zip and unzip based on zlib + Includes Zip64 support by Mathias Svensson + See http://www.winimage.com/zLibDll/minizip.html + +pascal/ by Bob Dellaca et al. + Support for Pascal + +puff/ by Mark Adler + Small, low memory usage inflate. Also serves to provide an + unambiguous description of the deflate format. + +testzlib/ by Gilles Vollant + Example of the use of zlib + +untgz/ by Pedro A. Aranda Gutierrez + A very simple tar.gz file extractor using zlib + +vstudio/ by Gilles Vollant + Building a minizip-enhanced zlib with Microsoft Visual Studio + Includes vc11 from kreuzerkrieg and vc12 from davispuh diff --git a/deps/zlib-1.2.10/contrib/ada/buffer_demo.adb b/deps/zlib-1.2.10/contrib/ada/buffer_demo.adb new file mode 100644 index 0000000..46b8638 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/buffer_demo.adb @@ -0,0 +1,106 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- +-- +-- $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $ + +-- This demo program provided by Dr Steve Sangwine +-- +-- Demonstration of a problem with Zlib-Ada (already fixed) when a buffer +-- of exactly the correct size is used for decompressed data, and the last +-- few bytes passed in to Zlib are checksum bytes. + +-- This program compresses a string of text, and then decompresses the +-- compressed text into a buffer of the same size as the original text. + +with Ada.Streams; use Ada.Streams; +with Ada.Text_IO; + +with ZLib; use ZLib; + +procedure Buffer_Demo is + EOL : Character renames ASCII.LF; + Text : constant String + := "Four score and seven years ago our fathers brought forth," & EOL & + "upon this continent, a new nation, conceived in liberty," & EOL & + "and dedicated to the proposition that `all men are created equal'."; + + Source : Stream_Element_Array (1 .. Text'Length); + for Source'Address use Text'Address; + +begin + Ada.Text_IO.Put (Text); + Ada.Text_IO.New_Line; + Ada.Text_IO.Put_Line + ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes"); + + declare + Compressed_Data : Stream_Element_Array (1 .. Text'Length); + L : Stream_Element_Offset; + begin + Compress : declare + Compressor : Filter_Type; + I : Stream_Element_Offset; + begin + Deflate_Init (Compressor); + + -- Compress the whole of T at once. + + Translate (Compressor, Source, I, Compressed_Data, L, Finish); + pragma Assert (I = Source'Last); + + Close (Compressor); + + Ada.Text_IO.Put_Line + ("Compressed size : " + & Stream_Element_Offset'Image (L) & " bytes"); + end Compress; + + -- Now we decompress the data, passing short blocks of data to Zlib + -- (because this demonstrates the problem - the last block passed will + -- contain checksum information and there will be no output, only a + -- check inside Zlib that the checksum is correct). + + Decompress : declare + Decompressor : Filter_Type; + + Uncompressed_Data : Stream_Element_Array (1 .. Text'Length); + + Block_Size : constant := 4; + -- This makes sure that the last block contains + -- only Adler checksum data. + + P : Stream_Element_Offset := Compressed_Data'First - 1; + O : Stream_Element_Offset; + begin + Inflate_Init (Decompressor); + + loop + Translate + (Decompressor, + Compressed_Data + (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)), + P, + Uncompressed_Data + (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last), + O, + No_Flush); + + Ada.Text_IO.Put_Line + ("Total in : " & Count'Image (Total_In (Decompressor)) & + ", out : " & Count'Image (Total_Out (Decompressor))); + + exit when P = L; + end loop; + + Ada.Text_IO.New_Line; + Ada.Text_IO.Put_Line + ("Decompressed text matches original text : " + & Boolean'Image (Uncompressed_Data = Source)); + end Decompress; + end; +end Buffer_Demo; diff --git a/deps/zlib-1.2.10/contrib/ada/mtest.adb b/deps/zlib-1.2.10/contrib/ada/mtest.adb new file mode 100644 index 0000000..c4dfd08 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/mtest.adb @@ -0,0 +1,156 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- +-- Continuous test for ZLib multithreading. If the test would fail +-- we should provide thread safe allocation routines for the Z_Stream. +-- +-- $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $ + +with ZLib; +with Ada.Streams; +with Ada.Numerics.Discrete_Random; +with Ada.Text_IO; +with Ada.Exceptions; +with Ada.Task_Identification; + +procedure MTest is + use Ada.Streams; + use ZLib; + + Stop : Boolean := False; + + pragma Atomic (Stop); + + subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is + new Ada.Numerics.Discrete_Random (Visible_Symbols); + + task type Test_Task; + + task body Test_Task is + Buffer : Stream_Element_Array (1 .. 100_000); + Gen : Random_Elements.Generator; + + Buffer_First : Stream_Element_Offset; + Compare_First : Stream_Element_Offset; + + Deflate : Filter_Type; + Inflate : Filter_Type; + + procedure Further (Item : in Stream_Element_Array); + + procedure Read_Buffer + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + + ------------- + -- Further -- + ------------- + + procedure Further (Item : in Stream_Element_Array) is + + procedure Compare (Item : in Stream_Element_Array); + + ------------- + -- Compare -- + ------------- + + procedure Compare (Item : in Stream_Element_Array) is + Next_First : Stream_Element_Offset := Compare_First + Item'Length; + begin + if Buffer (Compare_First .. Next_First - 1) /= Item then + raise Program_Error; + end if; + + Compare_First := Next_First; + end Compare; + + procedure Compare_Write is new ZLib.Write (Write => Compare); + begin + Compare_Write (Inflate, Item, No_Flush); + end Further; + + ----------------- + -- Read_Buffer -- + ----------------- + + procedure Read_Buffer + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset) + is + Buff_Diff : Stream_Element_Offset := Buffer'Last - Buffer_First; + Next_First : Stream_Element_Offset; + begin + if Item'Length <= Buff_Diff then + Last := Item'Last; + + Next_First := Buffer_First + Item'Length; + + Item := Buffer (Buffer_First .. Next_First - 1); + + Buffer_First := Next_First; + else + Last := Item'First + Buff_Diff; + Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last); + Buffer_First := Buffer'Last + 1; + end if; + end Read_Buffer; + + procedure Translate is new Generic_Translate + (Data_In => Read_Buffer, + Data_Out => Further); + + begin + Random_Elements.Reset (Gen); + + Buffer := (others => 20); + + Main : loop + for J in Buffer'Range loop + Buffer (J) := Random_Elements.Random (Gen); + + Deflate_Init (Deflate); + Inflate_Init (Inflate); + + Buffer_First := Buffer'First; + Compare_First := Buffer'First; + + Translate (Deflate); + + if Compare_First /= Buffer'Last + 1 then + raise Program_Error; + end if; + + Ada.Text_IO.Put_Line + (Ada.Task_Identification.Image + (Ada.Task_Identification.Current_Task) + & Stream_Element_Offset'Image (J) + & ZLib.Count'Image (Total_Out (Deflate))); + + Close (Deflate); + Close (Inflate); + + exit Main when Stop; + end loop; + end loop Main; + exception + when E : others => + Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E)); + Stop := True; + end Test_Task; + + Test : array (1 .. 4) of Test_Task; + + pragma Unreferenced (Test); + + Dummy : Character; + +begin + Ada.Text_IO.Get_Immediate (Dummy); + Stop := True; +end MTest; diff --git a/deps/zlib-1.2.10/contrib/ada/read.adb b/deps/zlib-1.2.10/contrib/ada/read.adb new file mode 100644 index 0000000..1f2efbf --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/read.adb @@ -0,0 +1,156 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $ + +-- Test/demo program for the generic read interface. + +with Ada.Numerics.Discrete_Random; +with Ada.Streams; +with Ada.Text_IO; + +with ZLib; + +procedure Read is + + use Ada.Streams; + + ------------------------------------ + -- Test configuration parameters -- + ------------------------------------ + + File_Size : Stream_Element_Offset := 100_000; + + Continuous : constant Boolean := False; + -- If this constant is True, the test would be repeated again and again, + -- with increment File_Size for every iteration. + + Header : constant ZLib.Header_Type := ZLib.Default; + -- Do not use Header other than Default in ZLib versions 1.1.4 and older. + + Init_Random : constant := 8; + -- We are using the same random sequence, in case of we catch bug, + -- so we would be able to reproduce it. + + -- End -- + + Pack_Size : Stream_Element_Offset; + Offset : Stream_Element_Offset; + + Filter : ZLib.Filter_Type; + + subtype Visible_Symbols + is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is new + Ada.Numerics.Discrete_Random (Visible_Symbols); + + Gen : Random_Elements.Generator; + Period : constant Stream_Element_Offset := 200; + -- Period constant variable for random generator not to be very random. + -- Bigger period, harder random. + + Read_Buffer : Stream_Element_Array (1 .. 2048); + Read_First : Stream_Element_Offset; + Read_Last : Stream_Element_Offset; + + procedure Reset; + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + -- this procedure is for generic instantiation of + -- ZLib.Read + -- reading data from the File_In. + + procedure Read is new ZLib.Read + (Read, + Read_Buffer, + Rest_First => Read_First, + Rest_Last => Read_Last); + + ---------- + -- Read -- + ---------- + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Last := Stream_Element_Offset'Min + (Item'Last, + Item'First + File_Size - Offset); + + for J in Item'First .. Last loop + if J < Item'First + Period then + Item (J) := Random_Elements.Random (Gen); + else + Item (J) := Item (J - Period); + end if; + + Offset := Offset + 1; + end loop; + end Read; + + ----------- + -- Reset -- + ----------- + + procedure Reset is + begin + Random_Elements.Reset (Gen, Init_Random); + Pack_Size := 0; + Offset := 1; + Read_First := Read_Buffer'Last + 1; + Read_Last := Read_Buffer'Last; + end Reset; + +begin + Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); + + loop + for Level in ZLib.Compression_Level'Range loop + + Ada.Text_IO.Put ("Level =" + & ZLib.Compression_Level'Image (Level)); + + -- Deflate using generic instantiation. + + ZLib.Deflate_Init + (Filter, + Level, + Header => Header); + + Reset; + + Ada.Text_IO.Put + (Stream_Element_Offset'Image (File_Size) & " ->"); + + loop + declare + Buffer : Stream_Element_Array (1 .. 1024); + Last : Stream_Element_Offset; + begin + Read (Filter, Buffer, Last); + + Pack_Size := Pack_Size + Last - Buffer'First + 1; + + exit when Last < Buffer'Last; + end; + end loop; + + Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size)); + + ZLib.Close (Filter); + end loop; + + exit when not Continuous; + + File_Size := File_Size + 1; + end loop; +end Read; diff --git a/deps/zlib-1.2.10/contrib/ada/readme.txt b/deps/zlib-1.2.10/contrib/ada/readme.txt new file mode 100644 index 0000000..ce4d2ca --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/readme.txt @@ -0,0 +1,65 @@ + ZLib for Ada thick binding (ZLib.Ada) + Release 1.3 + +ZLib.Ada is a thick binding interface to the popular ZLib data +compression library, available at http://www.gzip.org/zlib/. +It provides Ada-style access to the ZLib C library. + + + Here are the main changes since ZLib.Ada 1.2: + +- Attension: ZLib.Read generic routine have a initialization requirement + for Read_Last parameter now. It is a bit incompartible with previous version, + but extends functionality, we could use new parameters Allow_Read_Some and + Flush now. + +- Added Is_Open routines to ZLib and ZLib.Streams packages. + +- Add pragma Assert to check Stream_Element is 8 bit. + +- Fix extraction to buffer with exact known decompressed size. Error reported by + Steve Sangwine. + +- Fix definition of ULong (changed to unsigned_long), fix regression on 64 bits + computers. Patch provided by Pascal Obry. + +- Add Status_Error exception definition. + +- Add pragma Assertion that Ada.Streams.Stream_Element size is 8 bit. + + + How to build ZLib.Ada under GNAT + +You should have the ZLib library already build on your computer, before +building ZLib.Ada. Make the directory of ZLib.Ada sources current and +issue the command: + + gnatmake test -largs -L -lz + +Or use the GNAT project file build for GNAT 3.15 or later: + + gnatmake -Pzlib.gpr -L + + + How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2 + +1. Make a project with all *.ads and *.adb files from the distribution. +2. Build the libz.a library from the ZLib C sources. +3. Rename libz.a to z.lib. +4. Add the library z.lib to the project. +5. Add the libc.lib library from the ObjectAda distribution to the project. +6. Build the executable using test.adb as a main procedure. + + + How to use ZLib.Ada + +The source files test.adb and read.adb are small demo programs that show +the main functionality of ZLib.Ada. + +The routines from the package specifications are commented. + + +Homepage: http://zlib-ada.sourceforge.net/ +Author: Dmitriy Anisimkov + +Contributors: Pascal Obry , Steve Sangwine diff --git a/deps/zlib-1.2.10/contrib/ada/test.adb b/deps/zlib-1.2.10/contrib/ada/test.adb new file mode 100644 index 0000000..90773ac --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/test.adb @@ -0,0 +1,463 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $ + +-- The program has a few aims. +-- 1. Test ZLib.Ada95 thick binding functionality. +-- 2. Show the example of use main functionality of the ZLib.Ada95 binding. +-- 3. Build this program automatically compile all ZLib.Ada95 packages under +-- GNAT Ada95 compiler. + +with ZLib.Streams; +with Ada.Streams.Stream_IO; +with Ada.Numerics.Discrete_Random; + +with Ada.Text_IO; + +with Ada.Calendar; + +procedure Test is + + use Ada.Streams; + use Stream_IO; + + ------------------------------------ + -- Test configuration parameters -- + ------------------------------------ + + File_Size : Count := 100_000; + Continuous : constant Boolean := False; + + Header : constant ZLib.Header_Type := ZLib.Default; + -- ZLib.None; + -- ZLib.Auto; + -- ZLib.GZip; + -- Do not use Header other then Default in ZLib versions 1.1.4 + -- and older. + + Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy; + Init_Random : constant := 10; + + -- End -- + + In_File_Name : constant String := "testzlib.in"; + -- Name of the input file + + Z_File_Name : constant String := "testzlib.zlb"; + -- Name of the compressed file. + + Out_File_Name : constant String := "testzlib.out"; + -- Name of the decompressed file. + + File_In : File_Type; + File_Out : File_Type; + File_Back : File_Type; + File_Z : ZLib.Streams.Stream_Type; + + Filter : ZLib.Filter_Type; + + Time_Stamp : Ada.Calendar.Time; + + procedure Generate_File; + -- Generate file of spetsified size with some random data. + -- The random data is repeatable, for the good compression. + + procedure Compare_Streams + (Left, Right : in out Root_Stream_Type'Class); + -- The procedure compearing data in 2 streams. + -- It is for compare data before and after compression/decompression. + + procedure Compare_Files (Left, Right : String); + -- Compare files. Based on the Compare_Streams. + + procedure Copy_Streams + (Source, Target : in out Root_Stream_Type'Class; + Buffer_Size : in Stream_Element_Offset := 1024); + -- Copying data from one stream to another. It is for test stream + -- interface of the library. + + procedure Data_In + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + -- this procedure is for generic instantiation of + -- ZLib.Generic_Translate. + -- reading data from the File_In. + + procedure Data_Out (Item : in Stream_Element_Array); + -- this procedure is for generic instantiation of + -- ZLib.Generic_Translate. + -- writing data to the File_Out. + + procedure Stamp; + -- Store the timestamp to the local variable. + + procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count); + -- Print the time statistic with the message. + + procedure Translate is new ZLib.Generic_Translate + (Data_In => Data_In, + Data_Out => Data_Out); + -- This procedure is moving data from File_In to File_Out + -- with compression or decompression, depend on initialization of + -- Filter parameter. + + ------------------- + -- Compare_Files -- + ------------------- + + procedure Compare_Files (Left, Right : String) is + Left_File, Right_File : File_Type; + begin + Open (Left_File, In_File, Left); + Open (Right_File, In_File, Right); + Compare_Streams (Stream (Left_File).all, Stream (Right_File).all); + Close (Left_File); + Close (Right_File); + end Compare_Files; + + --------------------- + -- Compare_Streams -- + --------------------- + + procedure Compare_Streams + (Left, Right : in out Ada.Streams.Root_Stream_Type'Class) + is + Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#); + Left_Last, Right_Last : Stream_Element_Offset; + begin + loop + Read (Left, Left_Buffer, Left_Last); + Read (Right, Right_Buffer, Right_Last); + + if Left_Last /= Right_Last then + Ada.Text_IO.Put_Line ("Compare error :" + & Stream_Element_Offset'Image (Left_Last) + & " /= " + & Stream_Element_Offset'Image (Right_Last)); + + raise Constraint_Error; + + elsif Left_Buffer (0 .. Left_Last) + /= Right_Buffer (0 .. Right_Last) + then + Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal."); + raise Constraint_Error; + + end if; + + exit when Left_Last < Left_Buffer'Last; + end loop; + end Compare_Streams; + + ------------------ + -- Copy_Streams -- + ------------------ + + procedure Copy_Streams + (Source, Target : in out Ada.Streams.Root_Stream_Type'Class; + Buffer_Size : in Stream_Element_Offset := 1024) + is + Buffer : Stream_Element_Array (1 .. Buffer_Size); + Last : Stream_Element_Offset; + begin + loop + Read (Source, Buffer, Last); + Write (Target, Buffer (1 .. Last)); + + exit when Last < Buffer'Last; + end loop; + end Copy_Streams; + + ------------- + -- Data_In -- + ------------- + + procedure Data_In + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Read (File_In, Item, Last); + end Data_In; + + -------------- + -- Data_Out -- + -------------- + + procedure Data_Out (Item : in Stream_Element_Array) is + begin + Write (File_Out, Item); + end Data_Out; + + ------------------- + -- Generate_File -- + ------------------- + + procedure Generate_File is + subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is + new Ada.Numerics.Discrete_Random (Visible_Symbols); + + Gen : Random_Elements.Generator; + Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10; + + Buffer_Count : constant Count := File_Size / Buffer'Length; + -- Number of same buffers in the packet. + + Density : constant Count := 30; -- from 0 to Buffer'Length - 2; + + procedure Fill_Buffer (J, D : in Count); + -- Change the part of the buffer. + + ----------------- + -- Fill_Buffer -- + ----------------- + + procedure Fill_Buffer (J, D : in Count) is + begin + for K in 0 .. D loop + Buffer + (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1)) + := Random_Elements.Random (Gen); + + end loop; + end Fill_Buffer; + + begin + Random_Elements.Reset (Gen, Init_Random); + + Create (File_In, Out_File, In_File_Name); + + Fill_Buffer (1, Buffer'Length - 2); + + for J in 1 .. Buffer_Count loop + Write (File_In, Buffer); + + Fill_Buffer (J, Density); + end loop; + + -- fill remain size. + + Write + (File_In, + Buffer + (1 .. Stream_Element_Offset + (File_Size - Buffer'Length * Buffer_Count))); + + Flush (File_In); + Close (File_In); + end Generate_File; + + --------------------- + -- Print_Statistic -- + --------------------- + + procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is + use Ada.Calendar; + use Ada.Text_IO; + + package Count_IO is new Integer_IO (ZLib.Count); + + Curr_Dur : Duration := Clock - Time_Stamp; + begin + Put (Msg); + + Set_Col (20); + Ada.Text_IO.Put ("size ="); + + Count_IO.Put + (Data_Size, + Width => Stream_IO.Count'Image (File_Size)'Length); + + Put_Line (" duration =" & Duration'Image (Curr_Dur)); + end Print_Statistic; + + ----------- + -- Stamp -- + ----------- + + procedure Stamp is + begin + Time_Stamp := Ada.Calendar.Clock; + end Stamp; + +begin + Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); + + loop + Generate_File; + + for Level in ZLib.Compression_Level'Range loop + + Ada.Text_IO.Put_Line ("Level =" + & ZLib.Compression_Level'Image (Level)); + + -- Test generic interface. + Open (File_In, In_File, In_File_Name); + Create (File_Out, Out_File, Z_File_Name); + + Stamp; + + -- Deflate using generic instantiation. + + ZLib.Deflate_Init + (Filter => Filter, + Level => Level, + Strategy => Strategy, + Header => Header); + + Translate (Filter); + Print_Statistic ("Generic compress", ZLib.Total_Out (Filter)); + ZLib.Close (Filter); + + Close (File_In); + Close (File_Out); + + Open (File_In, In_File, Z_File_Name); + Create (File_Out, Out_File, Out_File_Name); + + Stamp; + + -- Inflate using generic instantiation. + + ZLib.Inflate_Init (Filter, Header => Header); + + Translate (Filter); + Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter)); + + ZLib.Close (Filter); + + Close (File_In); + Close (File_Out); + + Compare_Files (In_File_Name, Out_File_Name); + + -- Test stream interface. + + -- Compress to the back stream. + + Open (File_In, In_File, In_File_Name); + Create (File_Back, Out_File, Z_File_Name); + + Stamp; + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.Out_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => True, + Level => Level, + Strategy => Strategy, + Header => Header); + + Copy_Streams + (Source => Stream (File_In).all, + Target => File_Z); + + -- Flushing internal buffers to the back stream. + + ZLib.Streams.Flush (File_Z, ZLib.Finish); + + Print_Statistic ("Write compress", + ZLib.Streams.Write_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + + Close (File_In); + Close (File_Back); + + -- Compare reading from original file and from + -- decompression stream. + + Open (File_In, In_File, In_File_Name); + Open (File_Back, In_File, Z_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.In_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => True, + Header => Header); + + Stamp; + Compare_Streams (Stream (File_In).all, File_Z); + + Print_Statistic ("Read decompress", + ZLib.Streams.Read_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + Close (File_In); + Close (File_Back); + + -- Compress by reading from compression stream. + + Open (File_Back, In_File, In_File_Name); + Create (File_Out, Out_File, Z_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.In_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => False, + Level => Level, + Strategy => Strategy, + Header => Header); + + Stamp; + Copy_Streams + (Source => File_Z, + Target => Stream (File_Out).all); + + Print_Statistic ("Read compress", + ZLib.Streams.Read_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + + Close (File_Out); + Close (File_Back); + + -- Decompress to decompression stream. + + Open (File_In, In_File, Z_File_Name); + Create (File_Back, Out_File, Out_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.Out_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => False, + Header => Header); + + Stamp; + + Copy_Streams + (Source => Stream (File_In).all, + Target => File_Z); + + Print_Statistic ("Write decompress", + ZLib.Streams.Write_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + Close (File_In); + Close (File_Back); + + Compare_Files (In_File_Name, Out_File_Name); + end loop; + + Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok."); + + exit when not Continuous; + + File_Size := File_Size + 1; + end loop; +end Test; diff --git a/deps/zlib-1.2.10/contrib/ada/zlib-streams.adb b/deps/zlib-1.2.10/contrib/ada/zlib-streams.adb new file mode 100644 index 0000000..b6497ba --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/zlib-streams.adb @@ -0,0 +1,225 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $ + +with Ada.Unchecked_Deallocation; + +package body ZLib.Streams is + + ----------- + -- Close -- + ----------- + + procedure Close (Stream : in out Stream_Type) is + procedure Free is new Ada.Unchecked_Deallocation + (Stream_Element_Array, Buffer_Access); + begin + if Stream.Mode = Out_Stream or Stream.Mode = Duplex then + -- We should flush the data written by the writer. + + Flush (Stream, Finish); + + Close (Stream.Writer); + end if; + + if Stream.Mode = In_Stream or Stream.Mode = Duplex then + Close (Stream.Reader); + Free (Stream.Buffer); + end if; + end Close; + + ------------ + -- Create -- + ------------ + + procedure Create + (Stream : out Stream_Type; + Mode : in Stream_Mode; + Back : in Stream_Access; + Back_Compressed : in Boolean; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Header : in Header_Type := Default; + Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size) + is + + subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); + + procedure Init_Filter + (Filter : in out Filter_Type; + Compress : in Boolean); + + ----------------- + -- Init_Filter -- + ----------------- + + procedure Init_Filter + (Filter : in out Filter_Type; + Compress : in Boolean) is + begin + if Compress then + Deflate_Init + (Filter, Level, Strategy, Header => Header); + else + Inflate_Init (Filter, Header => Header); + end if; + end Init_Filter; + + begin + Stream.Back := Back; + Stream.Mode := Mode; + + if Mode = Out_Stream or Mode = Duplex then + Init_Filter (Stream.Writer, Back_Compressed); + Stream.Buffer_Size := Write_Buffer_Size; + else + Stream.Buffer_Size := 0; + end if; + + if Mode = In_Stream or Mode = Duplex then + Init_Filter (Stream.Reader, not Back_Compressed); + + Stream.Buffer := new Buffer_Subtype; + Stream.Rest_First := Stream.Buffer'Last + 1; + Stream.Rest_Last := Stream.Buffer'Last; + end if; + end Create; + + ----------- + -- Flush -- + ----------- + + procedure Flush + (Stream : in out Stream_Type; + Mode : in Flush_Mode := Sync_Flush) + is + Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); + Last : Stream_Element_Offset; + begin + loop + Flush (Stream.Writer, Buffer, Last, Mode); + + Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); + + exit when Last < Buffer'Last; + end loop; + end Flush; + + ------------- + -- Is_Open -- + ------------- + + function Is_Open (Stream : Stream_Type) return Boolean is + begin + return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); + end Is_Open; + + ---------- + -- Read -- + ---------- + + procedure Read + (Stream : in out Stream_Type; + Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) + is + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + + ---------- + -- Read -- + ---------- + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Ada.Streams.Read (Stream.Back.all, Item, Last); + end Read; + + procedure Read is new ZLib.Read + (Read => Read, + Buffer => Stream.Buffer.all, + Rest_First => Stream.Rest_First, + Rest_Last => Stream.Rest_Last); + + begin + Read (Stream.Reader, Item, Last); + end Read; + + ------------------- + -- Read_Total_In -- + ------------------- + + function Read_Total_In (Stream : in Stream_Type) return Count is + begin + return Total_In (Stream.Reader); + end Read_Total_In; + + -------------------- + -- Read_Total_Out -- + -------------------- + + function Read_Total_Out (Stream : in Stream_Type) return Count is + begin + return Total_Out (Stream.Reader); + end Read_Total_Out; + + ----------- + -- Write -- + ----------- + + procedure Write + (Stream : in out Stream_Type; + Item : in Stream_Element_Array) + is + + procedure Write (Item : in Stream_Element_Array); + + ----------- + -- Write -- + ----------- + + procedure Write (Item : in Stream_Element_Array) is + begin + Ada.Streams.Write (Stream.Back.all, Item); + end Write; + + procedure Write is new ZLib.Write + (Write => Write, + Buffer_Size => Stream.Buffer_Size); + + begin + Write (Stream.Writer, Item, No_Flush); + end Write; + + -------------------- + -- Write_Total_In -- + -------------------- + + function Write_Total_In (Stream : in Stream_Type) return Count is + begin + return Total_In (Stream.Writer); + end Write_Total_In; + + --------------------- + -- Write_Total_Out -- + --------------------- + + function Write_Total_Out (Stream : in Stream_Type) return Count is + begin + return Total_Out (Stream.Writer); + end Write_Total_Out; + +end ZLib.Streams; diff --git a/deps/zlib-1.2.10/contrib/ada/zlib-streams.ads b/deps/zlib-1.2.10/contrib/ada/zlib-streams.ads new file mode 100644 index 0000000..8e26cd4 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/zlib-streams.ads @@ -0,0 +1,114 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-streams.ads,v 1.12 2004/05/31 10:53:40 vagul Exp $ + +package ZLib.Streams is + + type Stream_Mode is (In_Stream, Out_Stream, Duplex); + + type Stream_Access is access all Ada.Streams.Root_Stream_Type'Class; + + type Stream_Type is + new Ada.Streams.Root_Stream_Type with private; + + procedure Read + (Stream : in out Stream_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + + procedure Write + (Stream : in out Stream_Type; + Item : in Ada.Streams.Stream_Element_Array); + + procedure Flush + (Stream : in out Stream_Type; + Mode : in Flush_Mode := Sync_Flush); + -- Flush the written data to the back stream, + -- all data placed to the compressor is flushing to the Back stream. + -- Should not be used until necessary, because it is decreasing + -- compression. + + function Read_Total_In (Stream : in Stream_Type) return Count; + pragma Inline (Read_Total_In); + -- Return total number of bytes read from back stream so far. + + function Read_Total_Out (Stream : in Stream_Type) return Count; + pragma Inline (Read_Total_Out); + -- Return total number of bytes read so far. + + function Write_Total_In (Stream : in Stream_Type) return Count; + pragma Inline (Write_Total_In); + -- Return total number of bytes written so far. + + function Write_Total_Out (Stream : in Stream_Type) return Count; + pragma Inline (Write_Total_Out); + -- Return total number of bytes written to the back stream. + + procedure Create + (Stream : out Stream_Type; + Mode : in Stream_Mode; + Back : in Stream_Access; + Back_Compressed : in Boolean; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Header : in Header_Type := Default; + Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size); + -- Create the Comression/Decompression stream. + -- If mode is In_Stream then Write operation is disabled. + -- If mode is Out_Stream then Read operation is disabled. + + -- If Back_Compressed is true then + -- Data written to the Stream is compressing to the Back stream + -- and data read from the Stream is decompressed data from the Back stream. + + -- If Back_Compressed is false then + -- Data written to the Stream is decompressing to the Back stream + -- and data read from the Stream is compressed data from the Back stream. + + -- !!! When the Need_Header is False ZLib-Ada is using undocumented + -- ZLib 1.1.4 functionality to do not create/wait for ZLib headers. + + function Is_Open (Stream : Stream_Type) return Boolean; + + procedure Close (Stream : in out Stream_Type); + +private + + use Ada.Streams; + + type Buffer_Access is access all Stream_Element_Array; + + type Stream_Type + is new Root_Stream_Type with + record + Mode : Stream_Mode; + + Buffer : Buffer_Access; + Rest_First : Stream_Element_Offset; + Rest_Last : Stream_Element_Offset; + -- Buffer for Read operation. + -- We need to have this buffer in the record + -- because not all read data from back stream + -- could be processed during the read operation. + + Buffer_Size : Stream_Element_Offset; + -- Buffer size for write operation. + -- We do not need to have this buffer + -- in the record because all data could be + -- processed in the write operation. + + Back : Stream_Access; + Reader : Filter_Type; + Writer : Filter_Type; + end record; + +end ZLib.Streams; diff --git a/deps/zlib-1.2.10/contrib/ada/zlib-thin.adb b/deps/zlib-1.2.10/contrib/ada/zlib-thin.adb new file mode 100644 index 0000000..0ca4a71 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/zlib-thin.adb @@ -0,0 +1,141 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-thin.adb,v 1.8 2003/12/14 18:27:31 vagul Exp $ + +package body ZLib.Thin is + + ZLIB_VERSION : constant Chars_Ptr := zlibVersion; + + Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit; + + -------------- + -- Avail_In -- + -------------- + + function Avail_In (Strm : in Z_Stream) return UInt is + begin + return Strm.Avail_In; + end Avail_In; + + --------------- + -- Avail_Out -- + --------------- + + function Avail_Out (Strm : in Z_Stream) return UInt is + begin + return Strm.Avail_Out; + end Avail_Out; + + ------------------ + -- Deflate_Init -- + ------------------ + + function Deflate_Init + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int) + return Int is + begin + return deflateInit2 + (strm, + level, + method, + windowBits, + memLevel, + strategy, + ZLIB_VERSION, + Z_Stream_Size); + end Deflate_Init; + + ------------------ + -- Inflate_Init -- + ------------------ + + function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int is + begin + return inflateInit2 (strm, windowBits, ZLIB_VERSION, Z_Stream_Size); + end Inflate_Init; + + ------------------------ + -- Last_Error_Message -- + ------------------------ + + function Last_Error_Message (Strm : in Z_Stream) return String is + use Interfaces.C.Strings; + begin + if Strm.msg = Null_Ptr then + return ""; + else + return Value (Strm.msg); + end if; + end Last_Error_Message; + + ------------ + -- Set_In -- + ------------ + + procedure Set_In + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt) is + begin + Strm.Next_In := Buffer; + Strm.Avail_In := Size; + end Set_In; + + ------------------ + -- Set_Mem_Func -- + ------------------ + + procedure Set_Mem_Func + (Strm : in out Z_Stream; + Opaque : in Voidp; + Alloc : in alloc_func; + Free : in free_func) is + begin + Strm.opaque := Opaque; + Strm.zalloc := Alloc; + Strm.zfree := Free; + end Set_Mem_Func; + + ------------- + -- Set_Out -- + ------------- + + procedure Set_Out + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt) is + begin + Strm.Next_Out := Buffer; + Strm.Avail_Out := Size; + end Set_Out; + + -------------- + -- Total_In -- + -------------- + + function Total_In (Strm : in Z_Stream) return ULong is + begin + return Strm.Total_In; + end Total_In; + + --------------- + -- Total_Out -- + --------------- + + function Total_Out (Strm : in Z_Stream) return ULong is + begin + return Strm.Total_Out; + end Total_Out; + +end ZLib.Thin; diff --git a/deps/zlib-1.2.10/contrib/ada/zlib-thin.ads b/deps/zlib-1.2.10/contrib/ada/zlib-thin.ads new file mode 100644 index 0000000..810173c --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/zlib-thin.ads @@ -0,0 +1,450 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-thin.ads,v 1.11 2004/07/23 06:33:11 vagul Exp $ + +with Interfaces.C.Strings; + +with System; + +private package ZLib.Thin is + + -- From zconf.h + + MAX_MEM_LEVEL : constant := 9; -- zconf.h:105 + -- zconf.h:105 + MAX_WBITS : constant := 15; -- zconf.h:115 + -- 32K LZ77 window + -- zconf.h:115 + SEEK_SET : constant := 8#0000#; -- zconf.h:244 + -- Seek from beginning of file. + -- zconf.h:244 + SEEK_CUR : constant := 1; -- zconf.h:245 + -- Seek from current position. + -- zconf.h:245 + SEEK_END : constant := 2; -- zconf.h:246 + -- Set file pointer to EOF plus "offset" + -- zconf.h:246 + + type Byte is new Interfaces.C.unsigned_char; -- 8 bits + -- zconf.h:214 + type UInt is new Interfaces.C.unsigned; -- 16 bits or more + -- zconf.h:216 + type Int is new Interfaces.C.int; + + type ULong is new Interfaces.C.unsigned_long; -- 32 bits or more + -- zconf.h:217 + subtype Chars_Ptr is Interfaces.C.Strings.chars_ptr; + + type ULong_Access is access ULong; + type Int_Access is access Int; + + subtype Voidp is System.Address; -- zconf.h:232 + + subtype Byte_Access is Voidp; + + Nul : constant Voidp := System.Null_Address; + -- end from zconf + + Z_NO_FLUSH : constant := 8#0000#; -- zlib.h:125 + -- zlib.h:125 + Z_PARTIAL_FLUSH : constant := 1; -- zlib.h:126 + -- will be removed, use + -- Z_SYNC_FLUSH instead + -- zlib.h:126 + Z_SYNC_FLUSH : constant := 2; -- zlib.h:127 + -- zlib.h:127 + Z_FULL_FLUSH : constant := 3; -- zlib.h:128 + -- zlib.h:128 + Z_FINISH : constant := 4; -- zlib.h:129 + -- zlib.h:129 + Z_OK : constant := 8#0000#; -- zlib.h:132 + -- zlib.h:132 + Z_STREAM_END : constant := 1; -- zlib.h:133 + -- zlib.h:133 + Z_NEED_DICT : constant := 2; -- zlib.h:134 + -- zlib.h:134 + Z_ERRNO : constant := -1; -- zlib.h:135 + -- zlib.h:135 + Z_STREAM_ERROR : constant := -2; -- zlib.h:136 + -- zlib.h:136 + Z_DATA_ERROR : constant := -3; -- zlib.h:137 + -- zlib.h:137 + Z_MEM_ERROR : constant := -4; -- zlib.h:138 + -- zlib.h:138 + Z_BUF_ERROR : constant := -5; -- zlib.h:139 + -- zlib.h:139 + Z_VERSION_ERROR : constant := -6; -- zlib.h:140 + -- zlib.h:140 + Z_NO_COMPRESSION : constant := 8#0000#; -- zlib.h:145 + -- zlib.h:145 + Z_BEST_SPEED : constant := 1; -- zlib.h:146 + -- zlib.h:146 + Z_BEST_COMPRESSION : constant := 9; -- zlib.h:147 + -- zlib.h:147 + Z_DEFAULT_COMPRESSION : constant := -1; -- zlib.h:148 + -- zlib.h:148 + Z_FILTERED : constant := 1; -- zlib.h:151 + -- zlib.h:151 + Z_HUFFMAN_ONLY : constant := 2; -- zlib.h:152 + -- zlib.h:152 + Z_DEFAULT_STRATEGY : constant := 8#0000#; -- zlib.h:153 + -- zlib.h:153 + Z_BINARY : constant := 8#0000#; -- zlib.h:156 + -- zlib.h:156 + Z_ASCII : constant := 1; -- zlib.h:157 + -- zlib.h:157 + Z_UNKNOWN : constant := 2; -- zlib.h:158 + -- zlib.h:158 + Z_DEFLATED : constant := 8; -- zlib.h:161 + -- zlib.h:161 + Z_NULL : constant := 8#0000#; -- zlib.h:164 + -- for initializing zalloc, zfree, opaque + -- zlib.h:164 + type gzFile is new Voidp; -- zlib.h:646 + + type Z_Stream is private; + + type Z_Streamp is access all Z_Stream; -- zlib.h:89 + + type alloc_func is access function + (Opaque : Voidp; + Items : UInt; + Size : UInt) + return Voidp; -- zlib.h:63 + + type free_func is access procedure (opaque : Voidp; address : Voidp); + + function zlibVersion return Chars_Ptr; + + function Deflate (strm : Z_Streamp; flush : Int) return Int; + + function DeflateEnd (strm : Z_Streamp) return Int; + + function Inflate (strm : Z_Streamp; flush : Int) return Int; + + function InflateEnd (strm : Z_Streamp) return Int; + + function deflateSetDictionary + (strm : Z_Streamp; + dictionary : Byte_Access; + dictLength : UInt) + return Int; + + function deflateCopy (dest : Z_Streamp; source : Z_Streamp) return Int; + -- zlib.h:478 + + function deflateReset (strm : Z_Streamp) return Int; -- zlib.h:495 + + function deflateParams + (strm : Z_Streamp; + level : Int; + strategy : Int) + return Int; -- zlib.h:506 + + function inflateSetDictionary + (strm : Z_Streamp; + dictionary : Byte_Access; + dictLength : UInt) + return Int; -- zlib.h:548 + + function inflateSync (strm : Z_Streamp) return Int; -- zlib.h:565 + + function inflateReset (strm : Z_Streamp) return Int; -- zlib.h:580 + + function compress + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong) + return Int; -- zlib.h:601 + + function compress2 + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong; + level : Int) + return Int; -- zlib.h:615 + + function uncompress + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong) + return Int; + + function gzopen (path : Chars_Ptr; mode : Chars_Ptr) return gzFile; + + function gzdopen (fd : Int; mode : Chars_Ptr) return gzFile; + + function gzsetparams + (file : gzFile; + level : Int; + strategy : Int) + return Int; + + function gzread + (file : gzFile; + buf : Voidp; + len : UInt) + return Int; + + function gzwrite + (file : in gzFile; + buf : in Voidp; + len : in UInt) + return Int; + + function gzprintf (file : in gzFile; format : in Chars_Ptr) return Int; + + function gzputs (file : in gzFile; s : in Chars_Ptr) return Int; + + function gzgets + (file : gzFile; + buf : Chars_Ptr; + len : Int) + return Chars_Ptr; + + function gzputc (file : gzFile; char : Int) return Int; + + function gzgetc (file : gzFile) return Int; + + function gzflush (file : gzFile; flush : Int) return Int; + + function gzseek + (file : gzFile; + offset : Int; + whence : Int) + return Int; + + function gzrewind (file : gzFile) return Int; + + function gztell (file : gzFile) return Int; + + function gzeof (file : gzFile) return Int; + + function gzclose (file : gzFile) return Int; + + function gzerror (file : gzFile; errnum : Int_Access) return Chars_Ptr; + + function adler32 + (adler : ULong; + buf : Byte_Access; + len : UInt) + return ULong; + + function crc32 + (crc : ULong; + buf : Byte_Access; + len : UInt) + return ULong; + + function deflateInit + (strm : Z_Streamp; + level : Int; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function deflateInit2 + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function Deflate_Init + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int) + return Int; + pragma Inline (Deflate_Init); + + function inflateInit + (strm : Z_Streamp; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function inflateInit2 + (strm : in Z_Streamp; + windowBits : in Int; + version : in Chars_Ptr; + stream_size : in Int) + return Int; + + function inflateBackInit + (strm : in Z_Streamp; + windowBits : in Int; + window : in Byte_Access; + version : in Chars_Ptr; + stream_size : in Int) + return Int; + -- Size of window have to be 2**windowBits. + + function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int; + pragma Inline (Inflate_Init); + + function zError (err : Int) return Chars_Ptr; + + function inflateSyncPoint (z : Z_Streamp) return Int; + + function get_crc_table return ULong_Access; + + -- Interface to the available fields of the z_stream structure. + -- The application must update next_in and avail_in when avail_in has + -- dropped to zero. It must update next_out and avail_out when avail_out + -- has dropped to zero. The application must initialize zalloc, zfree and + -- opaque before calling the init function. + + procedure Set_In + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt); + pragma Inline (Set_In); + + procedure Set_Out + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt); + pragma Inline (Set_Out); + + procedure Set_Mem_Func + (Strm : in out Z_Stream; + Opaque : in Voidp; + Alloc : in alloc_func; + Free : in free_func); + pragma Inline (Set_Mem_Func); + + function Last_Error_Message (Strm : in Z_Stream) return String; + pragma Inline (Last_Error_Message); + + function Avail_Out (Strm : in Z_Stream) return UInt; + pragma Inline (Avail_Out); + + function Avail_In (Strm : in Z_Stream) return UInt; + pragma Inline (Avail_In); + + function Total_In (Strm : in Z_Stream) return ULong; + pragma Inline (Total_In); + + function Total_Out (Strm : in Z_Stream) return ULong; + pragma Inline (Total_Out); + + function inflateCopy + (dest : in Z_Streamp; + Source : in Z_Streamp) + return Int; + + function compressBound (Source_Len : in ULong) return ULong; + + function deflateBound + (Strm : in Z_Streamp; + Source_Len : in ULong) + return ULong; + + function gzungetc (C : in Int; File : in gzFile) return Int; + + function zlibCompileFlags return ULong; + +private + + type Z_Stream is record -- zlib.h:68 + Next_In : Voidp := Nul; -- next input byte + Avail_In : UInt := 0; -- number of bytes available at next_in + Total_In : ULong := 0; -- total nb of input bytes read so far + Next_Out : Voidp := Nul; -- next output byte should be put there + Avail_Out : UInt := 0; -- remaining free space at next_out + Total_Out : ULong := 0; -- total nb of bytes output so far + msg : Chars_Ptr; -- last error message, NULL if no error + state : Voidp; -- not visible by applications + zalloc : alloc_func := null; -- used to allocate the internal state + zfree : free_func := null; -- used to free the internal state + opaque : Voidp; -- private data object passed to + -- zalloc and zfree + data_type : Int; -- best guess about the data type: + -- ascii or binary + adler : ULong; -- adler32 value of the uncompressed + -- data + reserved : ULong; -- reserved for future use + end record; + + pragma Convention (C, Z_Stream); + + pragma Import (C, zlibVersion, "zlibVersion"); + pragma Import (C, Deflate, "deflate"); + pragma Import (C, DeflateEnd, "deflateEnd"); + pragma Import (C, Inflate, "inflate"); + pragma Import (C, InflateEnd, "inflateEnd"); + pragma Import (C, deflateSetDictionary, "deflateSetDictionary"); + pragma Import (C, deflateCopy, "deflateCopy"); + pragma Import (C, deflateReset, "deflateReset"); + pragma Import (C, deflateParams, "deflateParams"); + pragma Import (C, inflateSetDictionary, "inflateSetDictionary"); + pragma Import (C, inflateSync, "inflateSync"); + pragma Import (C, inflateReset, "inflateReset"); + pragma Import (C, compress, "compress"); + pragma Import (C, compress2, "compress2"); + pragma Import (C, uncompress, "uncompress"); + pragma Import (C, gzopen, "gzopen"); + pragma Import (C, gzdopen, "gzdopen"); + pragma Import (C, gzsetparams, "gzsetparams"); + pragma Import (C, gzread, "gzread"); + pragma Import (C, gzwrite, "gzwrite"); + pragma Import (C, gzprintf, "gzprintf"); + pragma Import (C, gzputs, "gzputs"); + pragma Import (C, gzgets, "gzgets"); + pragma Import (C, gzputc, "gzputc"); + pragma Import (C, gzgetc, "gzgetc"); + pragma Import (C, gzflush, "gzflush"); + pragma Import (C, gzseek, "gzseek"); + pragma Import (C, gzrewind, "gzrewind"); + pragma Import (C, gztell, "gztell"); + pragma Import (C, gzeof, "gzeof"); + pragma Import (C, gzclose, "gzclose"); + pragma Import (C, gzerror, "gzerror"); + pragma Import (C, adler32, "adler32"); + pragma Import (C, crc32, "crc32"); + pragma Import (C, deflateInit, "deflateInit_"); + pragma Import (C, inflateInit, "inflateInit_"); + pragma Import (C, deflateInit2, "deflateInit2_"); + pragma Import (C, inflateInit2, "inflateInit2_"); + pragma Import (C, zError, "zError"); + pragma Import (C, inflateSyncPoint, "inflateSyncPoint"); + pragma Import (C, get_crc_table, "get_crc_table"); + + -- since zlib 1.2.0: + + pragma Import (C, inflateCopy, "inflateCopy"); + pragma Import (C, compressBound, "compressBound"); + pragma Import (C, deflateBound, "deflateBound"); + pragma Import (C, gzungetc, "gzungetc"); + pragma Import (C, zlibCompileFlags, "zlibCompileFlags"); + + pragma Import (C, inflateBackInit, "inflateBackInit_"); + + -- I stopped binding the inflateBack routines, because realize that + -- it does not support zlib and gzip headers for now, and have no + -- symmetric deflateBack routines. + -- ZLib-Ada is symmetric regarding deflate/inflate data transformation + -- and has a similar generic callback interface for the + -- deflate/inflate transformation based on the regular Deflate/Inflate + -- routines. + + -- pragma Import (C, inflateBack, "inflateBack"); + -- pragma Import (C, inflateBackEnd, "inflateBackEnd"); + +end ZLib.Thin; diff --git a/deps/zlib-1.2.10/contrib/ada/zlib.adb b/deps/zlib-1.2.10/contrib/ada/zlib.adb new file mode 100644 index 0000000..8b6fd68 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/zlib.adb @@ -0,0 +1,701 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib.adb,v 1.31 2004/09/06 06:53:19 vagul Exp $ + +with Ada.Exceptions; +with Ada.Unchecked_Conversion; +with Ada.Unchecked_Deallocation; + +with Interfaces.C.Strings; + +with ZLib.Thin; + +package body ZLib is + + use type Thin.Int; + + type Z_Stream is new Thin.Z_Stream; + + type Return_Code_Enum is + (OK, + STREAM_END, + NEED_DICT, + ERRNO, + STREAM_ERROR, + DATA_ERROR, + MEM_ERROR, + BUF_ERROR, + VERSION_ERROR); + + type Flate_Step_Function is access + function (Strm : in Thin.Z_Streamp; Flush : in Thin.Int) return Thin.Int; + pragma Convention (C, Flate_Step_Function); + + type Flate_End_Function is access + function (Ctrm : in Thin.Z_Streamp) return Thin.Int; + pragma Convention (C, Flate_End_Function); + + type Flate_Type is record + Step : Flate_Step_Function; + Done : Flate_End_Function; + end record; + + subtype Footer_Array is Stream_Element_Array (1 .. 8); + + Simple_GZip_Header : constant Stream_Element_Array (1 .. 10) + := (16#1f#, 16#8b#, -- Magic header + 16#08#, -- Z_DEFLATED + 16#00#, -- Flags + 16#00#, 16#00#, 16#00#, 16#00#, -- Time + 16#00#, -- XFlags + 16#03# -- OS code + ); + -- The simplest gzip header is not for informational, but just for + -- gzip format compatibility. + -- Note that some code below is using assumption + -- Simple_GZip_Header'Last > Footer_Array'Last, so do not make + -- Simple_GZip_Header'Last <= Footer_Array'Last. + + Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum + := (0 => OK, + 1 => STREAM_END, + 2 => NEED_DICT, + -1 => ERRNO, + -2 => STREAM_ERROR, + -3 => DATA_ERROR, + -4 => MEM_ERROR, + -5 => BUF_ERROR, + -6 => VERSION_ERROR); + + Flate : constant array (Boolean) of Flate_Type + := (True => (Step => Thin.Deflate'Access, + Done => Thin.DeflateEnd'Access), + False => (Step => Thin.Inflate'Access, + Done => Thin.InflateEnd'Access)); + + Flush_Finish : constant array (Boolean) of Flush_Mode + := (True => Finish, False => No_Flush); + + procedure Raise_Error (Stream : in Z_Stream); + pragma Inline (Raise_Error); + + procedure Raise_Error (Message : in String); + pragma Inline (Raise_Error); + + procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int); + + procedure Free is new Ada.Unchecked_Deallocation + (Z_Stream, Z_Stream_Access); + + function To_Thin_Access is new Ada.Unchecked_Conversion + (Z_Stream_Access, Thin.Z_Streamp); + + procedure Translate_GZip + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- Separate translate routine for make gzip header. + + procedure Translate_Auto + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- translate routine without additional headers. + + ----------------- + -- Check_Error -- + ----------------- + + procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int) is + use type Thin.Int; + begin + if Code /= Thin.Z_OK then + Raise_Error + (Return_Code_Enum'Image (Return_Code (Code)) + & ": " & Last_Error_Message (Stream)); + end if; + end Check_Error; + + ----------- + -- Close -- + ----------- + + procedure Close + (Filter : in out Filter_Type; + Ignore_Error : in Boolean := False) + is + Code : Thin.Int; + begin + if not Ignore_Error and then not Is_Open (Filter) then + raise Status_Error; + end if; + + Code := Flate (Filter.Compression).Done (To_Thin_Access (Filter.Strm)); + + if Ignore_Error or else Code = Thin.Z_OK then + Free (Filter.Strm); + else + declare + Error_Message : constant String + := Last_Error_Message (Filter.Strm.all); + begin + Free (Filter.Strm); + Ada.Exceptions.Raise_Exception + (ZLib_Error'Identity, + Return_Code_Enum'Image (Return_Code (Code)) + & ": " & Error_Message); + end; + end if; + end Close; + + ----------- + -- CRC32 -- + ----------- + + function CRC32 + (CRC : in Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) + return Unsigned_32 + is + use Thin; + begin + return Unsigned_32 (crc32 (ULong (CRC), + Data'Address, + Data'Length)); + end CRC32; + + procedure CRC32 + (CRC : in out Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) is + begin + CRC := CRC32 (CRC, Data); + end CRC32; + + ------------------ + -- Deflate_Init -- + ------------------ + + procedure Deflate_Init + (Filter : in out Filter_Type; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Method : in Compression_Method := Deflated; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Memory_Level : in Memory_Level_Type := Default_Memory_Level; + Header : in Header_Type := Default) + is + use type Thin.Int; + Win_Bits : Thin.Int := Thin.Int (Window_Bits); + begin + if Is_Open (Filter) then + raise Status_Error; + end if; + + -- We allow ZLib to make header only in case of default header type. + -- Otherwise we would either do header by ourselfs, or do not do + -- header at all. + + if Header = None or else Header = GZip then + Win_Bits := -Win_Bits; + end if; + + -- For the GZip CRC calculation and make headers. + + if Header = GZip then + Filter.CRC := 0; + Filter.Offset := Simple_GZip_Header'First; + else + Filter.Offset := Simple_GZip_Header'Last + 1; + end if; + + Filter.Strm := new Z_Stream; + Filter.Compression := True; + Filter.Stream_End := False; + Filter.Header := Header; + + if Thin.Deflate_Init + (To_Thin_Access (Filter.Strm), + Level => Thin.Int (Level), + method => Thin.Int (Method), + windowBits => Win_Bits, + memLevel => Thin.Int (Memory_Level), + strategy => Thin.Int (Strategy)) /= Thin.Z_OK + then + Raise_Error (Filter.Strm.all); + end if; + end Deflate_Init; + + ----------- + -- Flush -- + ----------- + + procedure Flush + (Filter : in out Filter_Type; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + No_Data : Stream_Element_Array := (1 .. 0 => 0); + Last : Stream_Element_Offset; + begin + Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush); + end Flush; + + ----------------------- + -- Generic_Translate -- + ----------------------- + + procedure Generic_Translate + (Filter : in out ZLib.Filter_Type; + In_Buffer_Size : in Integer := Default_Buffer_Size; + Out_Buffer_Size : in Integer := Default_Buffer_Size) + is + In_Buffer : Stream_Element_Array + (1 .. Stream_Element_Offset (In_Buffer_Size)); + Out_Buffer : Stream_Element_Array + (1 .. Stream_Element_Offset (Out_Buffer_Size)); + Last : Stream_Element_Offset; + In_Last : Stream_Element_Offset; + In_First : Stream_Element_Offset; + Out_Last : Stream_Element_Offset; + begin + Main : loop + Data_In (In_Buffer, Last); + + In_First := In_Buffer'First; + + loop + Translate + (Filter => Filter, + In_Data => In_Buffer (In_First .. Last), + In_Last => In_Last, + Out_Data => Out_Buffer, + Out_Last => Out_Last, + Flush => Flush_Finish (Last < In_Buffer'First)); + + if Out_Buffer'First <= Out_Last then + Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last)); + end if; + + exit Main when Stream_End (Filter); + + -- The end of in buffer. + + exit when In_Last = Last; + + In_First := In_Last + 1; + end loop; + end loop Main; + + end Generic_Translate; + + ------------------ + -- Inflate_Init -- + ------------------ + + procedure Inflate_Init + (Filter : in out Filter_Type; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Header : in Header_Type := Default) + is + use type Thin.Int; + Win_Bits : Thin.Int := Thin.Int (Window_Bits); + + procedure Check_Version; + -- Check the latest header types compatibility. + + procedure Check_Version is + begin + if Version <= "1.1.4" then + Raise_Error + ("Inflate header type " & Header_Type'Image (Header) + & " incompatible with ZLib version " & Version); + end if; + end Check_Version; + + begin + if Is_Open (Filter) then + raise Status_Error; + end if; + + case Header is + when None => + Check_Version; + + -- Inflate data without headers determined + -- by negative Win_Bits. + + Win_Bits := -Win_Bits; + when GZip => + Check_Version; + + -- Inflate gzip data defined by flag 16. + + Win_Bits := Win_Bits + 16; + when Auto => + Check_Version; + + -- Inflate with automatic detection + -- of gzip or native header defined by flag 32. + + Win_Bits := Win_Bits + 32; + when Default => null; + end case; + + Filter.Strm := new Z_Stream; + Filter.Compression := False; + Filter.Stream_End := False; + Filter.Header := Header; + + if Thin.Inflate_Init + (To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK + then + Raise_Error (Filter.Strm.all); + end if; + end Inflate_Init; + + ------------- + -- Is_Open -- + ------------- + + function Is_Open (Filter : in Filter_Type) return Boolean is + begin + return Filter.Strm /= null; + end Is_Open; + + ----------------- + -- Raise_Error -- + ----------------- + + procedure Raise_Error (Message : in String) is + begin + Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message); + end Raise_Error; + + procedure Raise_Error (Stream : in Z_Stream) is + begin + Raise_Error (Last_Error_Message (Stream)); + end Raise_Error; + + ---------- + -- Read -- + ---------- + + procedure Read + (Filter : in out Filter_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode := No_Flush) + is + In_Last : Stream_Element_Offset; + Item_First : Ada.Streams.Stream_Element_Offset := Item'First; + V_Flush : Flush_Mode := Flush; + + begin + pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1); + pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last); + + loop + if Rest_Last = Buffer'First - 1 then + V_Flush := Finish; + + elsif Rest_First > Rest_Last then + Read (Buffer, Rest_Last); + Rest_First := Buffer'First; + + if Rest_Last < Buffer'First then + V_Flush := Finish; + end if; + end if; + + Translate + (Filter => Filter, + In_Data => Buffer (Rest_First .. Rest_Last), + In_Last => In_Last, + Out_Data => Item (Item_First .. Item'Last), + Out_Last => Last, + Flush => V_Flush); + + Rest_First := In_Last + 1; + + exit when Stream_End (Filter) + or else Last = Item'Last + or else (Last >= Item'First and then Allow_Read_Some); + + Item_First := Last + 1; + end loop; + end Read; + + ---------------- + -- Stream_End -- + ---------------- + + function Stream_End (Filter : in Filter_Type) return Boolean is + begin + if Filter.Header = GZip and Filter.Compression then + return Filter.Stream_End + and then Filter.Offset = Footer_Array'Last + 1; + else + return Filter.Stream_End; + end if; + end Stream_End; + + -------------- + -- Total_In -- + -------------- + + function Total_In (Filter : in Filter_Type) return Count is + begin + return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all)); + end Total_In; + + --------------- + -- Total_Out -- + --------------- + + function Total_Out (Filter : in Filter_Type) return Count is + begin + return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all)); + end Total_Out; + + --------------- + -- Translate -- + --------------- + + procedure Translate + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) is + begin + if Filter.Header = GZip and then Filter.Compression then + Translate_GZip + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data, + Out_Last => Out_Last, + Flush => Flush); + else + Translate_Auto + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data, + Out_Last => Out_Last, + Flush => Flush); + end if; + end Translate; + + -------------------- + -- Translate_Auto -- + -------------------- + + procedure Translate_Auto + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + use type Thin.Int; + Code : Thin.Int; + + begin + if not Is_Open (Filter) then + raise Status_Error; + end if; + + if Out_Data'Length = 0 and then In_Data'Length = 0 then + raise Constraint_Error; + end if; + + Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length); + Set_In (Filter.Strm.all, In_Data'Address, In_Data'Length); + + Code := Flate (Filter.Compression).Step + (To_Thin_Access (Filter.Strm), + Thin.Int (Flush)); + + if Code = Thin.Z_STREAM_END then + Filter.Stream_End := True; + else + Check_Error (Filter.Strm.all, Code); + end if; + + In_Last := In_Data'Last + - Stream_Element_Offset (Avail_In (Filter.Strm.all)); + Out_Last := Out_Data'Last + - Stream_Element_Offset (Avail_Out (Filter.Strm.all)); + end Translate_Auto; + + -------------------- + -- Translate_GZip -- + -------------------- + + procedure Translate_GZip + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + Out_First : Stream_Element_Offset; + + procedure Add_Data (Data : in Stream_Element_Array); + -- Add data to stream from the Filter.Offset till necessary, + -- used for add gzip headr/footer. + + procedure Put_32 + (Item : in out Stream_Element_Array; + Data : in Unsigned_32); + pragma Inline (Put_32); + + -------------- + -- Add_Data -- + -------------- + + procedure Add_Data (Data : in Stream_Element_Array) is + Data_First : Stream_Element_Offset renames Filter.Offset; + Data_Last : Stream_Element_Offset; + Data_Len : Stream_Element_Offset; -- -1 + Out_Len : Stream_Element_Offset; -- -1 + begin + Out_First := Out_Last + 1; + + if Data_First > Data'Last then + return; + end if; + + Data_Len := Data'Last - Data_First; + Out_Len := Out_Data'Last - Out_First; + + if Data_Len <= Out_Len then + Out_Last := Out_First + Data_Len; + Data_Last := Data'Last; + else + Out_Last := Out_Data'Last; + Data_Last := Data_First + Out_Len; + end if; + + Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last); + + Data_First := Data_Last + 1; + Out_First := Out_Last + 1; + end Add_Data; + + ------------ + -- Put_32 -- + ------------ + + procedure Put_32 + (Item : in out Stream_Element_Array; + Data : in Unsigned_32) + is + D : Unsigned_32 := Data; + begin + for J in Item'First .. Item'First + 3 loop + Item (J) := Stream_Element (D and 16#FF#); + D := Shift_Right (D, 8); + end loop; + end Put_32; + + begin + Out_Last := Out_Data'First - 1; + + if not Filter.Stream_End then + Add_Data (Simple_GZip_Header); + + Translate_Auto + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data (Out_First .. Out_Data'Last), + Out_Last => Out_Last, + Flush => Flush); + + CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last)); + end if; + + if Filter.Stream_End and then Out_Last <= Out_Data'Last then + -- This detection method would work only when + -- Simple_GZip_Header'Last > Footer_Array'Last + + if Filter.Offset = Simple_GZip_Header'Last + 1 then + Filter.Offset := Footer_Array'First; + end if; + + declare + Footer : Footer_Array; + begin + Put_32 (Footer, Filter.CRC); + Put_32 (Footer (Footer'First + 4 .. Footer'Last), + Unsigned_32 (Total_In (Filter))); + Add_Data (Footer); + end; + end if; + end Translate_GZip; + + ------------- + -- Version -- + ------------- + + function Version return String is + begin + return Interfaces.C.Strings.Value (Thin.zlibVersion); + end Version; + + ----------- + -- Write -- + ----------- + + procedure Write + (Filter : in out Filter_Type; + Item : in Ada.Streams.Stream_Element_Array; + Flush : in Flush_Mode := No_Flush) + is + Buffer : Stream_Element_Array (1 .. Buffer_Size); + In_Last : Stream_Element_Offset; + Out_Last : Stream_Element_Offset; + In_First : Stream_Element_Offset := Item'First; + begin + if Item'Length = 0 and Flush = No_Flush then + return; + end if; + + loop + Translate + (Filter => Filter, + In_Data => Item (In_First .. Item'Last), + In_Last => In_Last, + Out_Data => Buffer, + Out_Last => Out_Last, + Flush => Flush); + + if Out_Last >= Buffer'First then + Write (Buffer (1 .. Out_Last)); + end if; + + exit when In_Last = Item'Last or Stream_End (Filter); + + In_First := In_Last + 1; + end loop; + end Write; + +end ZLib; diff --git a/deps/zlib-1.2.10/contrib/ada/zlib.ads b/deps/zlib-1.2.10/contrib/ada/zlib.ads new file mode 100644 index 0000000..79ffc40 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/zlib.ads @@ -0,0 +1,328 @@ +------------------------------------------------------------------------------ +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- This library is free software; you can redistribute it and/or modify -- +-- it under the terms of the GNU General Public License as published by -- +-- the Free Software Foundation; either version 2 of the License, or (at -- +-- your option) any later version. -- +-- -- +-- This library is distributed in the hope that it will be useful, but -- +-- WITHOUT ANY WARRANTY; without even the implied warranty of -- +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- +-- General Public License for more details. -- +-- -- +-- You should have received a copy of the GNU General Public License -- +-- along with this library; if not, write to the Free Software Foundation, -- +-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +------------------------------------------------------------------------------ + +-- $Id: zlib.ads,v 1.26 2004/09/06 06:53:19 vagul Exp $ + +with Ada.Streams; + +with Interfaces; + +package ZLib is + + ZLib_Error : exception; + Status_Error : exception; + + type Compression_Level is new Integer range -1 .. 9; + + type Flush_Mode is private; + + type Compression_Method is private; + + type Window_Bits_Type is new Integer range 8 .. 15; + + type Memory_Level_Type is new Integer range 1 .. 9; + + type Unsigned_32 is new Interfaces.Unsigned_32; + + type Strategy_Type is private; + + type Header_Type is (None, Auto, Default, GZip); + -- Header type usage have a some limitation for inflate. + -- See comment for Inflate_Init. + + subtype Count is Ada.Streams.Stream_Element_Count; + + Default_Memory_Level : constant Memory_Level_Type := 8; + Default_Window_Bits : constant Window_Bits_Type := 15; + + ---------------------------------- + -- Compression method constants -- + ---------------------------------- + + Deflated : constant Compression_Method; + -- Only one method allowed in this ZLib version + + --------------------------------- + -- Compression level constants -- + --------------------------------- + + No_Compression : constant Compression_Level := 0; + Best_Speed : constant Compression_Level := 1; + Best_Compression : constant Compression_Level := 9; + Default_Compression : constant Compression_Level := -1; + + -------------------------- + -- Flush mode constants -- + -------------------------- + + No_Flush : constant Flush_Mode; + -- Regular way for compression, no flush + + Partial_Flush : constant Flush_Mode; + -- Will be removed, use Z_SYNC_FLUSH instead + + Sync_Flush : constant Flush_Mode; + -- All pending output is flushed to the output buffer and the output + -- is aligned on a byte boundary, so that the decompressor can get all + -- input data available so far. (In particular avail_in is zero after the + -- call if enough output space has been provided before the call.) + -- Flushing may degrade compression for some compression algorithms and so + -- it should be used only when necessary. + + Block_Flush : constant Flush_Mode; + -- Z_BLOCK requests that inflate() stop + -- if and when it get to the next deflate block boundary. When decoding the + -- zlib or gzip format, this will cause inflate() to return immediately + -- after the header and before the first block. When doing a raw inflate, + -- inflate() will go ahead and process the first block, and will return + -- when it gets to the end of that block, or when it runs out of data. + + Full_Flush : constant Flush_Mode; + -- All output is flushed as with SYNC_FLUSH, and the compression state + -- is reset so that decompression can restart from this point if previous + -- compressed data has been damaged or if random access is desired. Using + -- Full_Flush too often can seriously degrade the compression. + + Finish : constant Flush_Mode; + -- Just for tell the compressor that input data is complete. + + ------------------------------------ + -- Compression strategy constants -- + ------------------------------------ + + -- RLE stategy could be used only in version 1.2.0 and later. + + Filtered : constant Strategy_Type; + Huffman_Only : constant Strategy_Type; + RLE : constant Strategy_Type; + Default_Strategy : constant Strategy_Type; + + Default_Buffer_Size : constant := 4096; + + type Filter_Type is tagged limited private; + -- The filter is for compression and for decompression. + -- The usage of the type is depend of its initialization. + + function Version return String; + pragma Inline (Version); + -- Return string representation of the ZLib version. + + procedure Deflate_Init + (Filter : in out Filter_Type; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Method : in Compression_Method := Deflated; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Memory_Level : in Memory_Level_Type := Default_Memory_Level; + Header : in Header_Type := Default); + -- Compressor initialization. + -- When Header parameter is Auto or Default, then default zlib header + -- would be provided for compressed data. + -- When Header is GZip, then gzip header would be set instead of + -- default header. + -- When Header is None, no header would be set for compressed data. + + procedure Inflate_Init + (Filter : in out Filter_Type; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Header : in Header_Type := Default); + -- Decompressor initialization. + -- Default header type mean that ZLib default header is expecting in the + -- input compressed stream. + -- Header type None mean that no header is expecting in the input stream. + -- GZip header type mean that GZip header is expecting in the + -- input compressed stream. + -- Auto header type mean that header type (GZip or Native) would be + -- detected automatically in the input stream. + -- Note that header types parameter values None, GZip and Auto are + -- supported for inflate routine only in ZLib versions 1.2.0.2 and later. + -- Deflate_Init is supporting all header types. + + function Is_Open (Filter : in Filter_Type) return Boolean; + pragma Inline (Is_Open); + -- Is the filter opened for compression or decompression. + + procedure Close + (Filter : in out Filter_Type; + Ignore_Error : in Boolean := False); + -- Closing the compression or decompressor. + -- If stream is closing before the complete and Ignore_Error is False, + -- The exception would be raised. + + generic + with procedure Data_In + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + with procedure Data_Out + (Item : in Ada.Streams.Stream_Element_Array); + procedure Generic_Translate + (Filter : in out Filter_Type; + In_Buffer_Size : in Integer := Default_Buffer_Size; + Out_Buffer_Size : in Integer := Default_Buffer_Size); + -- Compress/decompress data fetch from Data_In routine and pass the result + -- to the Data_Out routine. User should provide Data_In and Data_Out + -- for compression/decompression data flow. + -- Compression or decompression depend on Filter initialization. + + function Total_In (Filter : in Filter_Type) return Count; + pragma Inline (Total_In); + -- Returns total number of input bytes read so far + + function Total_Out (Filter : in Filter_Type) return Count; + pragma Inline (Total_Out); + -- Returns total number of bytes output so far + + function CRC32 + (CRC : in Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) + return Unsigned_32; + pragma Inline (CRC32); + -- Compute CRC32, it could be necessary for make gzip format + + procedure CRC32 + (CRC : in out Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array); + pragma Inline (CRC32); + -- Compute CRC32, it could be necessary for make gzip format + + ------------------------------------------------- + -- Below is more complex low level routines. -- + ------------------------------------------------- + + procedure Translate + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- Compress/decompress the In_Data buffer and place the result into + -- Out_Data. In_Last is the index of last element from In_Data accepted by + -- the Filter. Out_Last is the last element of the received data from + -- Filter. To tell the filter that incoming data are complete put the + -- Flush parameter to Finish. + + function Stream_End (Filter : in Filter_Type) return Boolean; + pragma Inline (Stream_End); + -- Return the true when the stream is complete. + + procedure Flush + (Filter : in out Filter_Type; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + pragma Inline (Flush); + -- Flushing the data from the compressor. + + generic + with procedure Write + (Item : in Ada.Streams.Stream_Element_Array); + -- User should provide this routine for accept + -- compressed/decompressed data. + + Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + -- Buffer size for Write user routine. + + procedure Write + (Filter : in out Filter_Type; + Item : in Ada.Streams.Stream_Element_Array; + Flush : in Flush_Mode := No_Flush); + -- Compress/Decompress data from Item to the generic parameter procedure + -- Write. Output buffer size could be set in Buffer_Size generic parameter. + + generic + with procedure Read + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + -- User should provide data for compression/decompression + -- thru this routine. + + Buffer : in out Ada.Streams.Stream_Element_Array; + -- Buffer for keep remaining data from the previous + -- back read. + + Rest_First, Rest_Last : in out Ada.Streams.Stream_Element_Offset; + -- Rest_First have to be initialized to Buffer'Last + 1 + -- Rest_Last have to be initialized to Buffer'Last + -- before usage. + + Allow_Read_Some : in Boolean := False; + -- Is it allowed to return Last < Item'Last before end of data. + + procedure Read + (Filter : in out Filter_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode := No_Flush); + -- Compress/Decompress data from generic parameter procedure Read to the + -- Item. User should provide Buffer and initialized Rest_First, Rest_Last + -- indicators. If Allow_Read_Some is True, Read routines could return + -- Last < Item'Last only at end of stream. + +private + + use Ada.Streams; + + pragma Assert (Ada.Streams.Stream_Element'Size = 8); + pragma Assert (Ada.Streams.Stream_Element'Modulus = 2**8); + + type Flush_Mode is new Integer range 0 .. 5; + + type Compression_Method is new Integer range 8 .. 8; + + type Strategy_Type is new Integer range 0 .. 3; + + No_Flush : constant Flush_Mode := 0; + Partial_Flush : constant Flush_Mode := 1; + Sync_Flush : constant Flush_Mode := 2; + Full_Flush : constant Flush_Mode := 3; + Finish : constant Flush_Mode := 4; + Block_Flush : constant Flush_Mode := 5; + + Filtered : constant Strategy_Type := 1; + Huffman_Only : constant Strategy_Type := 2; + RLE : constant Strategy_Type := 3; + Default_Strategy : constant Strategy_Type := 0; + + Deflated : constant Compression_Method := 8; + + type Z_Stream; + + type Z_Stream_Access is access all Z_Stream; + + type Filter_Type is tagged limited record + Strm : Z_Stream_Access; + Compression : Boolean; + Stream_End : Boolean; + Header : Header_Type; + CRC : Unsigned_32; + Offset : Stream_Element_Offset; + -- Offset for gzip header/footer output. + end record; + +end ZLib; diff --git a/deps/zlib-1.2.10/contrib/ada/zlib.gpr b/deps/zlib-1.2.10/contrib/ada/zlib.gpr new file mode 100644 index 0000000..296b22a --- /dev/null +++ b/deps/zlib-1.2.10/contrib/ada/zlib.gpr @@ -0,0 +1,20 @@ +project Zlib is + + for Languages use ("Ada"); + for Source_Dirs use ("."); + for Object_Dir use "."; + for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo"); + + package Compiler is + for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst"); + end Compiler; + + package Linker is + for Default_Switches ("ada") use ("-lz"); + end Linker; + + package Builder is + for Default_Switches ("ada") use ("-s", "-gnatQ"); + end Builder; + +end Zlib; diff --git a/deps/zlib-1.2.10/contrib/amd64/amd64-match.S b/deps/zlib-1.2.10/contrib/amd64/amd64-match.S new file mode 100644 index 0000000..81d4a1c --- /dev/null +++ b/deps/zlib-1.2.10/contrib/amd64/amd64-match.S @@ -0,0 +1,452 @@ +/* + * match.S -- optimized version of longest_match() + * based on the similar work by Gilles Vollant, and Brian Raiter, written 1998 + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the BSD License. Use by owners of Che Guevarra + * parafernalia is prohibited, where possible, and highly discouraged + * elsewhere. + */ + +#ifndef NO_UNDERLINE +# define match_init _match_init +# define longest_match _longest_match +#endif + +#define scanend ebx +#define scanendw bx +#define chainlenwmask edx /* high word: current chain len low word: s->wmask */ +#define curmatch rsi +#define curmatchd esi +#define windowbestlen r8 +#define scanalign r9 +#define scanalignd r9d +#define window r10 +#define bestlen r11 +#define bestlend r11d +#define scanstart r12d +#define scanstartw r12w +#define scan r13 +#define nicematch r14d +#define limit r15 +#define limitd r15d +#define prev rcx + +/* + * The 258 is a "magic number, not a parameter -- changing it + * breaks the hell loose + */ +#define MAX_MATCH (258) +#define MIN_MATCH (3) +#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) +#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) + +/* stack frame offsets */ +#define LocalVarsSize (112) +#define _chainlenwmask ( 8-LocalVarsSize)(%rsp) +#define _windowbestlen (16-LocalVarsSize)(%rsp) +#define save_r14 (24-LocalVarsSize)(%rsp) +#define save_rsi (32-LocalVarsSize)(%rsp) +#define save_rbx (40-LocalVarsSize)(%rsp) +#define save_r12 (56-LocalVarsSize)(%rsp) +#define save_r13 (64-LocalVarsSize)(%rsp) +#define save_r15 (80-LocalVarsSize)(%rsp) + + +.globl match_init, longest_match + +/* + * On AMD64 the first argument of a function (in our case -- the pointer to + * deflate_state structure) is passed in %rdi, hence our offsets below are + * all off of that. + */ + +/* you can check the structure offset by running + +#include +#include +#include "deflate.h" + +void print_depl() +{ +deflate_state ds; +deflate_state *s=&ds; +printf("size pointer=%u\n",(int)sizeof(void*)); + +printf("#define dsWSize (%3u)(%%rdi)\n",(int)(((char*)&(s->w_size))-((char*)s))); +printf("#define dsWMask (%3u)(%%rdi)\n",(int)(((char*)&(s->w_mask))-((char*)s))); +printf("#define dsWindow (%3u)(%%rdi)\n",(int)(((char*)&(s->window))-((char*)s))); +printf("#define dsPrev (%3u)(%%rdi)\n",(int)(((char*)&(s->prev))-((char*)s))); +printf("#define dsMatchLen (%3u)(%%rdi)\n",(int)(((char*)&(s->match_length))-((char*)s))); +printf("#define dsPrevMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_match))-((char*)s))); +printf("#define dsStrStart (%3u)(%%rdi)\n",(int)(((char*)&(s->strstart))-((char*)s))); +printf("#define dsMatchStart (%3u)(%%rdi)\n",(int)(((char*)&(s->match_start))-((char*)s))); +printf("#define dsLookahead (%3u)(%%rdi)\n",(int)(((char*)&(s->lookahead))-((char*)s))); +printf("#define dsPrevLen (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_length))-((char*)s))); +printf("#define dsMaxChainLen (%3u)(%%rdi)\n",(int)(((char*)&(s->max_chain_length))-((char*)s))); +printf("#define dsGoodMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->good_match))-((char*)s))); +printf("#define dsNiceMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->nice_match))-((char*)s))); +} + +*/ + + +/* + to compile for XCode 3.2 on MacOSX x86_64 + - run "gcc -g -c -DXCODE_MAC_X64_STRUCTURE amd64-match.S" + */ + + +#ifndef CURRENT_LINX_XCODE_MAC_X64_STRUCTURE +#define dsWSize ( 68)(%rdi) +#define dsWMask ( 76)(%rdi) +#define dsWindow ( 80)(%rdi) +#define dsPrev ( 96)(%rdi) +#define dsMatchLen (144)(%rdi) +#define dsPrevMatch (148)(%rdi) +#define dsStrStart (156)(%rdi) +#define dsMatchStart (160)(%rdi) +#define dsLookahead (164)(%rdi) +#define dsPrevLen (168)(%rdi) +#define dsMaxChainLen (172)(%rdi) +#define dsGoodMatch (188)(%rdi) +#define dsNiceMatch (192)(%rdi) + +#else + +#ifndef STRUCT_OFFSET +# define STRUCT_OFFSET (0) +#endif + + +#define dsWSize ( 56 + STRUCT_OFFSET)(%rdi) +#define dsWMask ( 64 + STRUCT_OFFSET)(%rdi) +#define dsWindow ( 72 + STRUCT_OFFSET)(%rdi) +#define dsPrev ( 88 + STRUCT_OFFSET)(%rdi) +#define dsMatchLen (136 + STRUCT_OFFSET)(%rdi) +#define dsPrevMatch (140 + STRUCT_OFFSET)(%rdi) +#define dsStrStart (148 + STRUCT_OFFSET)(%rdi) +#define dsMatchStart (152 + STRUCT_OFFSET)(%rdi) +#define dsLookahead (156 + STRUCT_OFFSET)(%rdi) +#define dsPrevLen (160 + STRUCT_OFFSET)(%rdi) +#define dsMaxChainLen (164 + STRUCT_OFFSET)(%rdi) +#define dsGoodMatch (180 + STRUCT_OFFSET)(%rdi) +#define dsNiceMatch (184 + STRUCT_OFFSET)(%rdi) + +#endif + + + + +.text + +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ + +longest_match: +/* + * Retrieve the function arguments. %curmatch will hold cur_match + * throughout the entire function (passed via rsi on amd64). + * rdi will hold the pointer to the deflate_state (first arg on amd64) + */ + mov %rsi, save_rsi + mov %rbx, save_rbx + mov %r12, save_r12 + mov %r13, save_r13 + mov %r14, save_r14 + mov %r15, save_r15 + +/* uInt wmask = s->w_mask; */ +/* unsigned chain_length = s->max_chain_length; */ +/* if (s->prev_length >= s->good_match) { */ +/* chain_length >>= 2; */ +/* } */ + + movl dsPrevLen, %eax + movl dsGoodMatch, %ebx + cmpl %ebx, %eax + movl dsWMask, %eax + movl dsMaxChainLen, %chainlenwmask + jl LastMatchGood + shrl $2, %chainlenwmask +LastMatchGood: + +/* chainlen is decremented once beforehand so that the function can */ +/* use the sign flag instead of the zero flag for the exit test. */ +/* It is then shifted into the high word, to make room for the wmask */ +/* value, which it will always accompany. */ + + decl %chainlenwmask + shll $16, %chainlenwmask + orl %eax, %chainlenwmask + +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ + + movl dsNiceMatch, %eax + movl dsLookahead, %ebx + cmpl %eax, %ebx + jl LookaheadLess + movl %eax, %ebx +LookaheadLess: movl %ebx, %nicematch + +/* register Bytef *scan = s->window + s->strstart; */ + + mov dsWindow, %window + movl dsStrStart, %limitd + lea (%limit, %window), %scan + +/* Determine how many bytes the scan ptr is off from being */ +/* dword-aligned. */ + + mov %scan, %scanalign + negl %scanalignd + andl $3, %scanalignd + +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ +/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ + + movl dsWSize, %eax + subl $MIN_LOOKAHEAD, %eax + xorl %ecx, %ecx + subl %eax, %limitd + cmovng %ecx, %limitd + +/* int best_len = s->prev_length; */ + + movl dsPrevLen, %bestlend + +/* Store the sum of s->window + best_len in %windowbestlen locally, and in memory. */ + + lea (%window, %bestlen), %windowbestlen + mov %windowbestlen, _windowbestlen + +/* register ush scan_start = *(ushf*)scan; */ +/* register ush scan_end = *(ushf*)(scan+best_len-1); */ +/* Posf *prev = s->prev; */ + + movzwl (%scan), %scanstart + movzwl -1(%scan, %bestlen), %scanend + mov dsPrev, %prev + +/* Jump into the main loop. */ + + movl %chainlenwmask, _chainlenwmask + jmp LoopEntry + +.balign 16 + +/* do { + * match = s->window + cur_match; + * if (*(ushf*)(match+best_len-1) != scan_end || + * *(ushf*)match != scan_start) continue; + * [...] + * } while ((cur_match = prev[cur_match & wmask]) > limit + * && --chain_length != 0); + * + * Here is the inner loop of the function. The function will spend the + * majority of its time in this loop, and majority of that time will + * be spent in the first ten instructions. + */ +LookupLoop: + andl %chainlenwmask, %curmatchd + movzwl (%prev, %curmatch, 2), %curmatchd + cmpl %limitd, %curmatchd + jbe LeaveNow + subl $0x00010000, %chainlenwmask + js LeaveNow +LoopEntry: cmpw -1(%windowbestlen, %curmatch), %scanendw + jne LookupLoop + cmpw %scanstartw, (%window, %curmatch) + jne LookupLoop + +/* Store the current value of chainlen. */ + movl %chainlenwmask, _chainlenwmask + +/* %scan is the string under scrutiny, and %prev to the string we */ +/* are hoping to match it up with. In actuality, %esi and %edi are */ +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ +/* initialized to -(MAX_MATCH_8 - scanalign). */ + + mov $(-MAX_MATCH_8), %rdx + lea (%curmatch, %window), %windowbestlen + lea MAX_MATCH_8(%windowbestlen, %scanalign), %windowbestlen + lea MAX_MATCH_8(%scan, %scanalign), %prev + +/* the prefetching below makes very little difference... */ + prefetcht1 (%windowbestlen, %rdx) + prefetcht1 (%prev, %rdx) + +/* + * Test the strings for equality, 8 bytes at a time. At the end, + * adjust %rdx so that it is offset to the exact byte that mismatched. + * + * It should be confessed that this loop usually does not represent + * much of the total running time. Replacing it with a more + * straightforward "rep cmpsb" would not drastically degrade + * performance -- unrolling it, for example, makes no difference. + */ + +#undef USE_SSE /* works, but is 6-7% slower, than non-SSE... */ + +LoopCmps: +#ifdef USE_SSE + /* Preload the SSE registers */ + movdqu (%windowbestlen, %rdx), %xmm1 + movdqu (%prev, %rdx), %xmm2 + pcmpeqb %xmm2, %xmm1 + movdqu 16(%windowbestlen, %rdx), %xmm3 + movdqu 16(%prev, %rdx), %xmm4 + pcmpeqb %xmm4, %xmm3 + movdqu 32(%windowbestlen, %rdx), %xmm5 + movdqu 32(%prev, %rdx), %xmm6 + pcmpeqb %xmm6, %xmm5 + movdqu 48(%windowbestlen, %rdx), %xmm7 + movdqu 48(%prev, %rdx), %xmm8 + pcmpeqb %xmm8, %xmm7 + + /* Check the comparisions' results */ + pmovmskb %xmm1, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + /* this is the only iteration of the loop with a possibility of having + incremented rdx by 0x108 (each loop iteration add 16*4 = 0x40 + and (0x40*4)+8=0x108 */ + add $8, %rdx + jz LenMaximum + add $8, %rdx + + + pmovmskb %xmm3, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + + add $16, %rdx + + + pmovmskb %xmm5, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + add $16, %rdx + + + pmovmskb %xmm7, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + add $16, %rdx + + jmp LoopCmps +LeaveLoopCmps: add %rax, %rdx +#else + mov (%windowbestlen, %rdx), %rax + xor (%prev, %rdx), %rax + jnz LeaveLoopCmps + + mov 8(%windowbestlen, %rdx), %rax + xor 8(%prev, %rdx), %rax + jnz LeaveLoopCmps8 + + mov 16(%windowbestlen, %rdx), %rax + xor 16(%prev, %rdx), %rax + jnz LeaveLoopCmps16 + + add $24, %rdx + jnz LoopCmps + jmp LenMaximum +# if 0 +/* + * This three-liner is tantalizingly simple, but bsf is a slow instruction, + * and the complicated alternative down below is quite a bit faster. Sad... + */ + +LeaveLoopCmps: bsf %rax, %rax /* find the first non-zero bit */ + shrl $3, %eax /* divide by 8 to get the byte */ + add %rax, %rdx +# else +LeaveLoopCmps16: + add $8, %rdx +LeaveLoopCmps8: + add $8, %rdx +LeaveLoopCmps: testl $0xFFFFFFFF, %eax /* Check the first 4 bytes */ + jnz Check16 + add $4, %rdx + shr $32, %rax +Check16: testw $0xFFFF, %ax + jnz LenLower + add $2, %rdx + shrl $16, %eax +LenLower: subb $1, %al + adc $0, %rdx +# endif +#endif + +/* Calculate the length of the match. If it is longer than MAX_MATCH, */ +/* then automatically accept it as the best possible match and leave. */ + + lea (%prev, %rdx), %rax + sub %scan, %rax + cmpl $MAX_MATCH, %eax + jge LenMaximum + +/* If the length of the match is not longer than the best match we */ +/* have so far, then forget it and return to the lookup loop. */ + + cmpl %bestlend, %eax + jg LongerMatch + mov _windowbestlen, %windowbestlen + mov dsPrev, %prev + movl _chainlenwmask, %edx + jmp LookupLoop + +/* s->match_start = cur_match; */ +/* best_len = len; */ +/* if (len >= nice_match) break; */ +/* scan_end = *(ushf*)(scan+best_len-1); */ + +LongerMatch: + movl %eax, %bestlend + movl %curmatchd, dsMatchStart + cmpl %nicematch, %eax + jge LeaveNow + + lea (%window, %bestlen), %windowbestlen + mov %windowbestlen, _windowbestlen + + movzwl -1(%scan, %rax), %scanend + mov dsPrev, %prev + movl _chainlenwmask, %chainlenwmask + jmp LookupLoop + +/* Accept the current string, with the maximum possible length. */ + +LenMaximum: + movl $MAX_MATCH, %bestlend + movl %curmatchd, dsMatchStart + +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ +/* return s->lookahead; */ + +LeaveNow: + movl dsLookahead, %eax + cmpl %eax, %bestlend + cmovngl %bestlend, %eax +LookaheadRet: + +/* Restore the registers and return from whence we came. */ + + mov save_rsi, %rsi + mov save_rbx, %rbx + mov save_r12, %r12 + mov save_r13, %r13 + mov save_r14, %r14 + mov save_r15, %r15 + + ret + +match_init: ret diff --git a/deps/zlib-1.2.10/contrib/asm686/README.686 b/deps/zlib-1.2.10/contrib/asm686/README.686 new file mode 100644 index 0000000..a0bf3be --- /dev/null +++ b/deps/zlib-1.2.10/contrib/asm686/README.686 @@ -0,0 +1,51 @@ +This is a patched version of zlib, modified to use +Pentium-Pro-optimized assembly code in the deflation algorithm. The +files changed/added by this patch are: + +README.686 +match.S + +The speedup that this patch provides varies, depending on whether the +compiler used to build the original version of zlib falls afoul of the +PPro's speed traps. My own tests show a speedup of around 10-20% at +the default compression level, and 20-30% using -9, against a version +compiled using gcc 2.7.2.3. Your mileage may vary. + +Note that this code has been tailored for the PPro/PII in particular, +and will not perform particuarly well on a Pentium. + +If you are using an assembler other than GNU as, you will have to +translate match.S to use your assembler's syntax. (Have fun.) + +Brian Raiter +breadbox@muppetlabs.com +April, 1998 + + +Added for zlib 1.1.3: + +The patches come from +http://www.muppetlabs.com/~breadbox/software/assembly.html + +To compile zlib with this asm file, copy match.S to the zlib directory +then do: + +CFLAGS="-O3 -DASMV" ./configure +make OBJA=match.o + + +Update: + +I've been ignoring these assembly routines for years, believing that +gcc's generated code had caught up with it sometime around gcc 2.95 +and the major rearchitecting of the Pentium 4. However, I recently +learned that, despite what I believed, this code still has some life +in it. On the Pentium 4 and AMD64 chips, it continues to run about 8% +faster than the code produced by gcc 4.1. + +In acknowledgement of its continuing usefulness, I've altered the +license to match that of the rest of zlib. Share and Enjoy! + +Brian Raiter +breadbox@muppetlabs.com +April, 2007 diff --git a/deps/zlib-1.2.10/contrib/asm686/match.S b/deps/zlib-1.2.10/contrib/asm686/match.S new file mode 100644 index 0000000..fa42109 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/asm686/match.S @@ -0,0 +1,357 @@ +/* match.S -- x86 assembly version of the zlib longest_match() function. + * Optimized for the Intel 686 chips (PPro and later). + * + * Copyright (C) 1998, 2007 Brian Raiter + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the author be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef NO_UNDERLINE +#define match_init _match_init +#define longest_match _longest_match +#endif + +#define MAX_MATCH (258) +#define MIN_MATCH (3) +#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) +#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) + +/* stack frame offsets */ + +#define chainlenwmask 0 /* high word: current chain len */ + /* low word: s->wmask */ +#define window 4 /* local copy of s->window */ +#define windowbestlen 8 /* s->window + bestlen */ +#define scanstart 16 /* first two bytes of string */ +#define scanend 12 /* last two bytes of string */ +#define scanalign 20 /* dword-misalignment of string */ +#define nicematch 24 /* a good enough match size */ +#define bestlen 28 /* size of best match so far */ +#define scan 32 /* ptr to string wanting match */ + +#define LocalVarsSize (36) +/* saved ebx 36 */ +/* saved edi 40 */ +/* saved esi 44 */ +/* saved ebp 48 */ +/* return address 52 */ +#define deflatestate 56 /* the function arguments */ +#define curmatch 60 + +/* All the +zlib1222add offsets are due to the addition of fields + * in zlib in the deflate_state structure since the asm code was first written + * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). + * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). + * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + */ + +#define zlib1222add (8) + +#define dsWSize (36+zlib1222add) +#define dsWMask (44+zlib1222add) +#define dsWindow (48+zlib1222add) +#define dsPrev (56+zlib1222add) +#define dsMatchLen (88+zlib1222add) +#define dsPrevMatch (92+zlib1222add) +#define dsStrStart (100+zlib1222add) +#define dsMatchStart (104+zlib1222add) +#define dsLookahead (108+zlib1222add) +#define dsPrevLen (112+zlib1222add) +#define dsMaxChainLen (116+zlib1222add) +#define dsGoodMatch (132+zlib1222add) +#define dsNiceMatch (136+zlib1222add) + + +.file "match.S" + +.globl match_init, longest_match + +.text + +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ +.cfi_sections .debug_frame + +longest_match: + +.cfi_startproc +/* Save registers that the compiler may be using, and adjust %esp to */ +/* make room for our stack frame. */ + + pushl %ebp + .cfi_def_cfa_offset 8 + .cfi_offset ebp, -8 + pushl %edi + .cfi_def_cfa_offset 12 + pushl %esi + .cfi_def_cfa_offset 16 + pushl %ebx + .cfi_def_cfa_offset 20 + subl $LocalVarsSize, %esp + .cfi_def_cfa_offset LocalVarsSize+20 + +/* Retrieve the function arguments. %ecx will hold cur_match */ +/* throughout the entire function. %edx will hold the pointer to the */ +/* deflate_state structure during the function's setup (before */ +/* entering the main loop). */ + + movl deflatestate(%esp), %edx + movl curmatch(%esp), %ecx + +/* uInt wmask = s->w_mask; */ +/* unsigned chain_length = s->max_chain_length; */ +/* if (s->prev_length >= s->good_match) { */ +/* chain_length >>= 2; */ +/* } */ + + movl dsPrevLen(%edx), %eax + movl dsGoodMatch(%edx), %ebx + cmpl %ebx, %eax + movl dsWMask(%edx), %eax + movl dsMaxChainLen(%edx), %ebx + jl LastMatchGood + shrl $2, %ebx +LastMatchGood: + +/* chainlen is decremented once beforehand so that the function can */ +/* use the sign flag instead of the zero flag for the exit test. */ +/* It is then shifted into the high word, to make room for the wmask */ +/* value, which it will always accompany. */ + + decl %ebx + shll $16, %ebx + orl %eax, %ebx + movl %ebx, chainlenwmask(%esp) + +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ + + movl dsNiceMatch(%edx), %eax + movl dsLookahead(%edx), %ebx + cmpl %eax, %ebx + jl LookaheadLess + movl %eax, %ebx +LookaheadLess: movl %ebx, nicematch(%esp) + +/* register Bytef *scan = s->window + s->strstart; */ + + movl dsWindow(%edx), %esi + movl %esi, window(%esp) + movl dsStrStart(%edx), %ebp + lea (%esi,%ebp), %edi + movl %edi, scan(%esp) + +/* Determine how many bytes the scan ptr is off from being */ +/* dword-aligned. */ + + movl %edi, %eax + negl %eax + andl $3, %eax + movl %eax, scanalign(%esp) + +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ +/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ + + movl dsWSize(%edx), %eax + subl $MIN_LOOKAHEAD, %eax + subl %eax, %ebp + jg LimitPositive + xorl %ebp, %ebp +LimitPositive: + +/* int best_len = s->prev_length; */ + + movl dsPrevLen(%edx), %eax + movl %eax, bestlen(%esp) + +/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ + + addl %eax, %esi + movl %esi, windowbestlen(%esp) + +/* register ush scan_start = *(ushf*)scan; */ +/* register ush scan_end = *(ushf*)(scan+best_len-1); */ +/* Posf *prev = s->prev; */ + + movzwl (%edi), %ebx + movl %ebx, scanstart(%esp) + movzwl -1(%edi,%eax), %ebx + movl %ebx, scanend(%esp) + movl dsPrev(%edx), %edi + +/* Jump into the main loop. */ + + movl chainlenwmask(%esp), %edx + jmp LoopEntry + +.balign 16 + +/* do { + * match = s->window + cur_match; + * if (*(ushf*)(match+best_len-1) != scan_end || + * *(ushf*)match != scan_start) continue; + * [...] + * } while ((cur_match = prev[cur_match & wmask]) > limit + * && --chain_length != 0); + * + * Here is the inner loop of the function. The function will spend the + * majority of its time in this loop, and majority of that time will + * be spent in the first ten instructions. + * + * Within this loop: + * %ebx = scanend + * %ecx = curmatch + * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) + * %esi = windowbestlen - i.e., (window + bestlen) + * %edi = prev + * %ebp = limit + */ +LookupLoop: + andl %edx, %ecx + movzwl (%edi,%ecx,2), %ecx + cmpl %ebp, %ecx + jbe LeaveNow + subl $0x00010000, %edx + js LeaveNow +LoopEntry: movzwl -1(%esi,%ecx), %eax + cmpl %ebx, %eax + jnz LookupLoop + movl window(%esp), %eax + movzwl (%eax,%ecx), %eax + cmpl scanstart(%esp), %eax + jnz LookupLoop + +/* Store the current value of chainlen. */ + + movl %edx, chainlenwmask(%esp) + +/* Point %edi to the string under scrutiny, and %esi to the string we */ +/* are hoping to match it up with. In actuality, %esi and %edi are */ +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ +/* initialized to -(MAX_MATCH_8 - scanalign). */ + + movl window(%esp), %esi + movl scan(%esp), %edi + addl %ecx, %esi + movl scanalign(%esp), %eax + movl $(-MAX_MATCH_8), %edx + lea MAX_MATCH_8(%edi,%eax), %edi + lea MAX_MATCH_8(%esi,%eax), %esi + +/* Test the strings for equality, 8 bytes at a time. At the end, + * adjust %edx so that it is offset to the exact byte that mismatched. + * + * We already know at this point that the first three bytes of the + * strings match each other, and they can be safely passed over before + * starting the compare loop. So what this code does is skip over 0-3 + * bytes, as much as necessary in order to dword-align the %edi + * pointer. (%esi will still be misaligned three times out of four.) + * + * It should be confessed that this loop usually does not represent + * much of the total running time. Replacing it with a more + * straightforward "rep cmpsb" would not drastically degrade + * performance. + */ +LoopCmps: + movl (%esi,%edx), %eax + xorl (%edi,%edx), %eax + jnz LeaveLoopCmps + movl 4(%esi,%edx), %eax + xorl 4(%edi,%edx), %eax + jnz LeaveLoopCmps4 + addl $8, %edx + jnz LoopCmps + jmp LenMaximum +LeaveLoopCmps4: addl $4, %edx +LeaveLoopCmps: testl $0x0000FFFF, %eax + jnz LenLower + addl $2, %edx + shrl $16, %eax +LenLower: subb $1, %al + adcl $0, %edx + +/* Calculate the length of the match. If it is longer than MAX_MATCH, */ +/* then automatically accept it as the best possible match and leave. */ + + lea (%edi,%edx), %eax + movl scan(%esp), %edi + subl %edi, %eax + cmpl $MAX_MATCH, %eax + jge LenMaximum + +/* If the length of the match is not longer than the best match we */ +/* have so far, then forget it and return to the lookup loop. */ + + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + cmpl %ebx, %eax + jg LongerMatch + movl windowbestlen(%esp), %esi + movl dsPrev(%edx), %edi + movl scanend(%esp), %ebx + movl chainlenwmask(%esp), %edx + jmp LookupLoop + +/* s->match_start = cur_match; */ +/* best_len = len; */ +/* if (len >= nice_match) break; */ +/* scan_end = *(ushf*)(scan+best_len-1); */ + +LongerMatch: movl nicematch(%esp), %ebx + movl %eax, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + cmpl %ebx, %eax + jge LeaveNow + movl window(%esp), %esi + addl %eax, %esi + movl %esi, windowbestlen(%esp) + movzwl -1(%edi,%eax), %ebx + movl dsPrev(%edx), %edi + movl %ebx, scanend(%esp) + movl chainlenwmask(%esp), %edx + jmp LookupLoop + +/* Accept the current string, with the maximum possible length. */ + +LenMaximum: movl deflatestate(%esp), %edx + movl $MAX_MATCH, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ +/* return s->lookahead; */ + +LeaveNow: + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + movl dsLookahead(%edx), %eax + cmpl %eax, %ebx + jg LookaheadRet + movl %ebx, %eax +LookaheadRet: + +/* Restore the stack and return from whence we came. */ + + addl $LocalVarsSize, %esp + .cfi_def_cfa_offset 20 + popl %ebx + .cfi_def_cfa_offset 16 + popl %esi + .cfi_def_cfa_offset 12 + popl %edi + .cfi_def_cfa_offset 8 + popl %ebp + .cfi_def_cfa_offset 4 +.cfi_endproc +match_init: ret diff --git a/deps/zlib-1.2.10/contrib/blast/Makefile b/deps/zlib-1.2.10/contrib/blast/Makefile new file mode 100644 index 0000000..9be80ba --- /dev/null +++ b/deps/zlib-1.2.10/contrib/blast/Makefile @@ -0,0 +1,8 @@ +blast: blast.c blast.h + cc -DTEST -o blast blast.c + +test: blast + blast < test.pk | cmp - test.txt + +clean: + rm -f blast blast.o diff --git a/deps/zlib-1.2.10/contrib/blast/README b/deps/zlib-1.2.10/contrib/blast/README new file mode 100644 index 0000000..e3a60b3 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/blast/README @@ -0,0 +1,4 @@ +Read blast.h for purpose and usage. + +Mark Adler +madler@alumni.caltech.edu diff --git a/deps/zlib-1.2.10/contrib/blast/blast.c b/deps/zlib-1.2.10/contrib/blast/blast.c new file mode 100644 index 0000000..e6e6590 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/blast/blast.c @@ -0,0 +1,466 @@ +/* blast.c + * Copyright (C) 2003, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in blast.h + * version 1.3, 24 Aug 2013 + * + * blast.c decompresses data compressed by the PKWare Compression Library. + * This function provides functionality similar to the explode() function of + * the PKWare library, hence the name "blast". + * + * This decompressor is based on the excellent format description provided by + * Ben Rudiak-Gould in comp.compression on August 13, 2001. Interestingly, the + * example Ben provided in the post is incorrect. The distance 110001 should + * instead be 111000. When corrected, the example byte stream becomes: + * + * 00 04 82 24 25 8f 80 7f + * + * which decompresses to "AIAIAIAIAIAIA" (without the quotes). + */ + +/* + * Change history: + * + * 1.0 12 Feb 2003 - First version + * 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data + * 1.2 24 Oct 2012 - Add note about using binary mode in stdio + * - Fix comparisons of differently signed integers + * 1.3 24 Aug 2013 - Return unused input from blast() + * - Fix test code to correctly report unused input + * - Enable the provision of initial input to blast() + */ + +#include /* for NULL */ +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "blast.h" /* prototype for blast() */ + +#define local static /* for local function definitions */ +#define MAXBITS 13 /* maximum code length */ +#define MAXWIN 4096 /* maximum window size */ + +/* input and output state */ +struct state { + /* input state */ + blast_in infun; /* input function provided by user */ + void *inhow; /* opaque information passed to infun() */ + unsigned char *in; /* next input location */ + unsigned left; /* available input at in */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; + + /* output state */ + blast_out outfun; /* output function provided by user */ + void *outhow; /* opaque information passed to outfun() */ + unsigned next; /* index of next write location in out[] */ + int first; /* true to check distances (for first 4K) */ + unsigned char out[MAXWIN]; /* output buffer and sliding window */ +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + int val; /* bit accumulator */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->left == 0) { + s->left = s->infun(s->inhow, &(s->in)); + if (s->left == 0) longjmp(s->env, 1); /* out of input */ + } + val |= (int)(*(s->in)++) << s->bitcnt; /* load eight bits */ + s->left--; + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = val >> need; + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return val & ((1 << need) - 1); +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -9 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. + * + * - The first code for the shortest length is all ones. Subsequent codes of + * the same length are simply integer decrements of the previous code. When + * moving up a length, a one bit is appended to the code. For a complete + * code, the last code of the longest length will be all zeros. To support + * this ordering, the bits pulled during decoding are inverted to apply the + * more "natural" ordering starting with all zeros and incrementing. + */ +local int decode(struct state *s, struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= (bitbuf & 1) ^ 1; /* invert code */ + bitbuf >>= 1; + count = *next++; + if (code < first + count) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) break; + if (s->left == 0) { + s->left = s->infun(s->inhow, &(s->in)); + if (s->left == 0) longjmp(s->env, 1); /* out of input */ + } + bitbuf = *(s->in)++; + s->left--; + if (left > 8) left = 8; + } + return -9; /* ran out of codes */ +} + +/* + * Given a list of repeated code lengths rep[0..n-1], where each byte is a + * count (high four bits + 1) and a code length (low four bits), generate the + * list of code lengths. This compaction reduces the size of the object code. + * Then given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + */ +local int construct(struct huffman *h, const unsigned char *rep, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + short length[256]; /* code lengths */ + + /* convert compact repeat counts into symbol bit length list */ + symbol = 0; + do { + len = *rep++; + left = (len >> 4) + 1; + len &= 15; + do { + length[symbol++] = len; + } while (--left); + } while (--n); + n = symbol; + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode PKWare Compression Library stream. + * + * Format notes: + * + * - First byte is 0 if literals are uncoded or 1 if they are coded. Second + * byte is 4, 5, or 6 for the number of extra bits in the distance code. + * This is the base-2 logarithm of the dictionary size minus six. + * + * - Compressed data is a combination of literals and length/distance pairs + * terminated by an end code. Literals are either Huffman coded or + * uncoded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - A bit preceding a literal or length/distance pair indicates which comes + * next, 0 for literals, 1 for length/distance. + * + * - If literals are uncoded, then the next eight bits are the literal, in the + * normal bit order in the stream, i.e. no bit-reversal is needed. Similarly, + * no bit reversal is needed for either the length extra bits or the distance + * extra bits. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 518 + * simply copies the last byte 518 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. + */ +local int decomp(struct state *s) +{ + int lit; /* true if literals are coded */ + int dict; /* log2(dictionary size) - 6 */ + int symbol; /* decoded symbol, extra bits for distance */ + int len; /* length for copy */ + unsigned dist; /* distance for copy */ + int copy; /* copy counter */ + unsigned char *from, *to; /* copy pointers */ + static int virgin = 1; /* build tables once */ + static short litcnt[MAXBITS+1], litsym[256]; /* litcode memory */ + static short lencnt[MAXBITS+1], lensym[16]; /* lencode memory */ + static short distcnt[MAXBITS+1], distsym[64]; /* distcode memory */ + static struct huffman litcode = {litcnt, litsym}; /* length code */ + static struct huffman lencode = {lencnt, lensym}; /* length code */ + static struct huffman distcode = {distcnt, distsym};/* distance code */ + /* bit lengths of literal codes */ + static const unsigned char litlen[] = { + 11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8, + 9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5, + 7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12, + 8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27, + 44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45, + 44, 173}; + /* bit lengths of length codes 0..15 */ + static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23}; + /* bit lengths of distance codes 0..63 */ + static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248}; + static const short base[16] = { /* base for length codes */ + 3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264}; + static const char extra[16] = { /* extra bits for length codes */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; + + /* set up decoding tables (once--might not be thread-safe) */ + if (virgin) { + construct(&litcode, litlen, sizeof(litlen)); + construct(&lencode, lenlen, sizeof(lenlen)); + construct(&distcode, distlen, sizeof(distlen)); + virgin = 0; + } + + /* read header */ + lit = bits(s, 8); + if (lit > 1) return -1; + dict = bits(s, 8); + if (dict < 4 || dict > 6) return -2; + + /* decode literals and length/distance pairs */ + do { + if (bits(s, 1)) { + /* get length */ + symbol = decode(s, &lencode); + len = base[symbol] + bits(s, extra[symbol]); + if (len == 519) break; /* end code */ + + /* get distance */ + symbol = len == 2 ? 2 : dict; + dist = decode(s, &distcode) << symbol; + dist += bits(s, symbol); + dist++; + if (s->first && dist > s->next) + return -3; /* distance too far back */ + + /* copy length bytes from distance bytes back */ + do { + to = s->out + s->next; + from = to - dist; + copy = MAXWIN; + if (s->next < dist) { + from += copy; + copy = dist; + } + copy -= s->next; + if (copy > len) copy = len; + len -= copy; + s->next += copy; + do { + *to++ = *from++; + } while (--copy); + if (s->next == MAXWIN) { + if (s->outfun(s->outhow, s->out, s->next)) return 1; + s->next = 0; + s->first = 0; + } + } while (len != 0); + } + else { + /* get literal and write it */ + symbol = lit ? decode(s, &litcode) : bits(s, 8); + s->out[s->next++] = symbol; + if (s->next == MAXWIN) { + if (s->outfun(s->outhow, s->out, s->next)) return 1; + s->next = 0; + s->first = 0; + } + } + } while (1); + return 0; +} + +/* See comments in blast.h */ +int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow, + unsigned *left, unsigned char **in) +{ + struct state s; /* input/output state */ + int err; /* return value */ + + /* initialize input state */ + s.infun = infun; + s.inhow = inhow; + if (left != NULL && *left) { + s.left = *left; + s.in = *in; + } + else + s.left = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* initialize output state */ + s.outfun = outfun; + s.outhow = outhow; + s.next = 0; + s.first = 1; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp(), */ + err = 2; /* then skip decomp(), return error */ + else + err = decomp(&s); /* decompress */ + + /* return unused input */ + if (left != NULL) + *left = s.left; + if (in != NULL) + *in = s.left ? s.in : NULL; + + /* write any leftover output and update the error code if needed */ + if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0) + err = 1; + return err; +} + +#ifdef TEST +/* Example of how to use blast() */ +#include +#include + +#define CHUNK 16384 + +local unsigned inf(void *how, unsigned char **buf) +{ + static unsigned char hold[CHUNK]; + + *buf = hold; + return fread(hold, 1, CHUNK, (FILE *)how); +} + +local int outf(void *how, unsigned char *buf, unsigned len) +{ + return fwrite(buf, 1, len, (FILE *)how) != len; +} + +/* Decompress a PKWare Compression Library stream from stdin to stdout */ +int main(void) +{ + int ret; + unsigned left; + + /* decompress to stdout */ + left = 0; + ret = blast(inf, stdin, outf, stdout, &left, NULL); + if (ret != 0) + fprintf(stderr, "blast error: %d\n", ret); + + /* count any leftover bytes */ + while (getchar() != EOF) + left++; + if (left) + fprintf(stderr, "blast warning: %u unused bytes of input\n", left); + + /* return blast() error code */ + return ret; +} +#endif diff --git a/deps/zlib-1.2.10/contrib/blast/blast.h b/deps/zlib-1.2.10/contrib/blast/blast.h new file mode 100644 index 0000000..6cf65ed --- /dev/null +++ b/deps/zlib-1.2.10/contrib/blast/blast.h @@ -0,0 +1,83 @@ +/* blast.h -- interface for blast.c + Copyright (C) 2003, 2012, 2013 Mark Adler + version 1.3, 24 Aug 2013 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * blast() decompresses the PKWare Data Compression Library (DCL) compressed + * format. It provides the same functionality as the explode() function in + * that library. (Note: PKWare overused the "implode" verb, and the format + * used by their library implode() function is completely different and + * incompatible with the implode compression method supported by PKZIP.) + * + * The binary mode for stdio functions should be used to assure that the + * compressed data is not corrupted when read or written. For example: + * fopen(..., "rb") and fopen(..., "wb"). + */ + + +typedef unsigned (*blast_in)(void *how, unsigned char **buf); +typedef int (*blast_out)(void *how, unsigned char *buf, unsigned len); +/* Definitions for input/output functions passed to blast(). See below for + * what the provided functions need to do. + */ + + +int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow, + unsigned *left, unsigned char **in); +/* Decompress input to output using the provided infun() and outfun() calls. + * On success, the return value of blast() is zero. If there is an error in + * the source data, i.e. it is not in the proper format, then a negative value + * is returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. + * + * The input function is invoked: len = infun(how, &buf), where buf is set by + * infun() to point to the input buffer, and infun() returns the number of + * available bytes there. If infun() returns zero, then blast() returns with + * an input error. (blast() only asks for input if it needs it.) inhow is for + * use by the application to pass an input descriptor to infun(), if desired. + * + * If left and in are not NULL and *left is not zero when blast() is called, + * then the *left bytes are *in are consumed for input before infun() is used. + * + * The output function is invoked: err = outfun(how, buf, len), where the bytes + * to be written are buf[0..len-1]. If err is not zero, then blast() returns + * with an output error. outfun() is always called with len <= 4096. outhow + * is for use by the application to pass an output descriptor to outfun(), if + * desired. + * + * If there is any unused input, *left is set to the number of bytes that were + * read and *in points to them. Otherwise *left is set to zero and *in is set + * to NULL. If left or in are NULL, then they are not set. + * + * The return codes are: + * + * 2: ran out of input before completing decompression + * 1: output error before completing decompression + * 0: successful decompression + * -1: literal flag not zero or one + * -2: dictionary size not in 4..6 + * -3: distance is too far back + * + * At the bottom of blast.c is an example program that uses blast() that can be + * compiled to produce a command-line decompression filter by defining TEST. + */ diff --git a/deps/zlib-1.2.10/contrib/blast/test.pk b/deps/zlib-1.2.10/contrib/blast/test.pk new file mode 100644 index 0000000..be10b2b Binary files /dev/null and b/deps/zlib-1.2.10/contrib/blast/test.pk differ diff --git a/deps/zlib-1.2.10/contrib/blast/test.txt b/deps/zlib-1.2.10/contrib/blast/test.txt new file mode 100644 index 0000000..bfdf1c5 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/blast/test.txt @@ -0,0 +1 @@ +AIAIAIAIAIAIA \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/delphi/ZLib.pas b/deps/zlib-1.2.10/contrib/delphi/ZLib.pas new file mode 100644 index 0000000..e9d72f0 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/delphi/ZLib.pas @@ -0,0 +1,557 @@ +{*******************************************************} +{ } +{ Borland Delphi Supplemental Components } +{ ZLIB Data Compression Interface Unit } +{ } +{ Copyright (c) 1997,99 Borland Corporation } +{ } +{*******************************************************} + +{ Updated for zlib 1.2.x by Cosmin Truta } + +unit ZLib; + +interface + +uses SysUtils, Classes; + +type + TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl; + TFree = procedure (AppData, Block: Pointer); cdecl; + + // Internal structure. Ignore. + TZStreamRec = packed record + next_in: PChar; // next input byte + avail_in: Integer; // number of bytes available at next_in + total_in: Longint; // total nb of input bytes read so far + + next_out: PChar; // next output byte should be put here + avail_out: Integer; // remaining free space at next_out + total_out: Longint; // total nb of bytes output so far + + msg: PChar; // last error message, NULL if no error + internal: Pointer; // not visible by applications + + zalloc: TAlloc; // used to allocate the internal state + zfree: TFree; // used to free the internal state + AppData: Pointer; // private data object passed to zalloc and zfree + + data_type: Integer; // best guess about the data type: ascii or binary + adler: Longint; // adler32 value of the uncompressed data + reserved: Longint; // reserved for future use + end; + + // Abstract ancestor class + TCustomZlibStream = class(TStream) + private + FStrm: TStream; + FStrmPos: Integer; + FOnProgress: TNotifyEvent; + FZRec: TZStreamRec; + FBuffer: array [Word] of Char; + protected + procedure Progress(Sender: TObject); dynamic; + property OnProgress: TNotifyEvent read FOnProgress write FOnProgress; + constructor Create(Strm: TStream); + end; + +{ TCompressionStream compresses data on the fly as data is written to it, and + stores the compressed data to another stream. + + TCompressionStream is write-only and strictly sequential. Reading from the + stream will raise an exception. Using Seek to move the stream pointer + will raise an exception. + + Output data is cached internally, written to the output stream only when + the internal output buffer is full. All pending output data is flushed + when the stream is destroyed. + + The Position property returns the number of uncompressed bytes of + data that have been written to the stream so far. + + CompressionRate returns the on-the-fly percentage by which the original + data has been compressed: (1 - (CompressedBytes / UncompressedBytes)) * 100 + If raw data size = 100 and compressed data size = 25, the CompressionRate + is 75% + + The OnProgress event is called each time the output buffer is filled and + written to the output stream. This is useful for updating a progress + indicator when you are writing a large chunk of data to the compression + stream in a single call.} + + + TCompressionLevel = (clNone, clFastest, clDefault, clMax); + + TCompressionStream = class(TCustomZlibStream) + private + function GetCompressionRate: Single; + public + constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property CompressionRate: Single read GetCompressionRate; + property OnProgress; + end; + +{ TDecompressionStream decompresses data on the fly as data is read from it. + + Compressed data comes from a separate source stream. TDecompressionStream + is read-only and unidirectional; you can seek forward in the stream, but not + backwards. The special case of setting the stream position to zero is + allowed. Seeking forward decompresses data until the requested position in + the uncompressed data has been reached. Seeking backwards, seeking relative + to the end of the stream, requesting the size of the stream, and writing to + the stream will raise an exception. + + The Position property returns the number of bytes of uncompressed data that + have been read from the stream so far. + + The OnProgress event is called each time the internal input buffer of + compressed data is exhausted and the next block is read from the input stream. + This is useful for updating a progress indicator when you are reading a + large chunk of data from the decompression stream in a single call.} + + TDecompressionStream = class(TCustomZlibStream) + public + constructor Create(Source: TStream); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property OnProgress; + end; + + + +{ CompressBuf compresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + Out: OutBuf = ptr to newly allocated buffer containing decompressed data + OutBytes = number of bytes in OutBuf } +procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + out OutBuf: Pointer; out OutBytes: Integer); + + +{ DecompressBuf decompresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + OutEstimate = zero, or est. size of the decompressed data + Out: OutBuf = ptr to newly allocated buffer containing decompressed data + OutBytes = number of bytes in OutBuf } +procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); + +{ DecompressToUserBuf decompresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + Out: OutBuf = ptr to user-allocated buffer to contain decompressed data + BufSize = number of bytes in OutBuf } +procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; + const OutBuf: Pointer; BufSize: Integer); + +const + zlib_version = '1.2.10'; + +type + EZlibError = class(Exception); + ECompressionError = class(EZlibError); + EDecompressionError = class(EZlibError); + +implementation + +uses ZLibConst; + +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = (-1); + Z_STREAM_ERROR = (-2); + Z_DATA_ERROR = (-3); + Z_MEM_ERROR = (-4); + Z_BUF_ERROR = (-5); + Z_VERSION_ERROR = (-6); + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = (-1); + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +procedure adler32; external; +procedure compressBound; external; +procedure crc32; external; +procedure deflateInit2_; external; +procedure deflateParams; external; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + Result := AllocMem(Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + + + +// deflate compresses data +function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar; + recsize: Integer): Integer; external; +function deflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function deflateEnd(var strm: TZStreamRec): Integer; external; + +// inflate decompresses data +function inflateInit_(var strm: TZStreamRec; version: PChar; + recsize: Integer): Integer; external; +function inflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function inflateEnd(var strm: TZStreamRec): Integer; external; +function inflateReset(var strm: TZStreamRec): Integer; external; + + +function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl; +begin +// GetMem(Result, Items*Size); + Result := AllocMem(Items * Size); +end; + +procedure zlibFreeMem(AppData, Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +{function zlibCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise EZlibError.Create('error'); //!! +end;} + +function CCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise ECompressionError.Create('error'); //!! +end; + +function DCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise EDecompressionError.Create('error'); //!! +end; + +procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + out OutBuf: Pointer; out OutBytes: Integer); +var + strm: TZStreamRec; + P: Pointer; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; + GetMem(OutBuf, OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm))); + try + while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, 256); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := 256; + end; + finally + CCheck(deflateEnd(strm)); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise + end; +end; + + +procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); +var + strm: TZStreamRec; + P: Pointer; + BufInc: Integer; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + BufInc := (InBytes + 255) and not 255; + if OutEstimate = 0 then + OutBytes := BufInc + else + OutBytes := OutEstimate; + GetMem(OutBuf, OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); + try + while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, BufInc); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := BufInc; + end; + finally + DCheck(inflateEnd(strm)); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise + end; +end; + +procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; + const OutBuf: Pointer; BufSize: Integer); +var + strm: TZStreamRec; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := BufSize; + DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); + try + if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then + raise EZlibError.CreateRes(@sTargetBufferTooSmall); + finally + DCheck(inflateEnd(strm)); + end; +end; + +// TCustomZlibStream + +constructor TCustomZLibStream.Create(Strm: TStream); +begin + inherited Create; + FStrm := Strm; + FStrmPos := Strm.Position; + FZRec.zalloc := zlibAllocMem; + FZRec.zfree := zlibFreeMem; +end; + +procedure TCustomZLibStream.Progress(Sender: TObject); +begin + if Assigned(FOnProgress) then FOnProgress(Sender); +end; + + +// TCompressionStream + +constructor TCompressionStream.Create(CompressionLevel: TCompressionLevel; + Dest: TStream); +const + Levels: array [TCompressionLevel] of ShortInt = + (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION); +begin + inherited Create(Dest); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec))); +end; + +destructor TCompressionStream.Destroy; +begin + FZRec.next_in := nil; + FZRec.avail_in := 0; + try + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END) + and (FZRec.avail_out = 0) do + begin + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + end; + if FZRec.avail_out < sizeof(FBuffer) then + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out); + finally + deflateEnd(FZRec); + end; + inherited Destroy; +end; + +function TCompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + raise ECompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TCompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + FZRec.next_in := @Buffer; + FZRec.avail_in := Count; + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (FZRec.avail_in > 0) do + begin + CCheck(deflate(FZRec, 0)); + if FZRec.avail_out = 0 then + begin + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + FStrmPos := FStrm.Position; + Progress(Self); + end; + end; + Result := Count; +end; + +function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +begin + if (Offset = 0) and (Origin = soFromCurrent) then + Result := FZRec.total_in + else + raise ECompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TCompressionStream.GetCompressionRate: Single; +begin + if FZRec.total_in = 0 then + Result := 0 + else + Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0; +end; + + +// TDecompressionStream + +constructor TDecompressionStream.Create(Source: TStream); +begin + inherited Create(Source); + FZRec.next_in := FBuffer; + FZRec.avail_in := 0; + DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec))); +end; + +destructor TDecompressionStream.Destroy; +begin + FStrm.Seek(-FZRec.avail_in, 1); + inflateEnd(FZRec); + inherited Destroy; +end; + +function TDecompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + FZRec.next_out := @Buffer; + FZRec.avail_out := Count; + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (FZRec.avail_out > 0) do + begin + if FZRec.avail_in = 0 then + begin + FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer)); + if FZRec.avail_in = 0 then + begin + Result := Count - FZRec.avail_out; + Exit; + end; + FZRec.next_in := FBuffer; + FStrmPos := FStrm.Position; + Progress(Self); + end; + CCheck(inflate(FZRec, 0)); + end; + Result := Count; +end; + +function TDecompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + raise EDecompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +var + I: Integer; + Buf: array [0..4095] of Char; +begin + if (Offset = 0) and (Origin = soFromBeginning) then + begin + DCheck(inflateReset(FZRec)); + FZRec.next_in := FBuffer; + FZRec.avail_in := 0; + FStrm.Position := 0; + FStrmPos := 0; + end + else if ( (Offset >= 0) and (Origin = soFromCurrent)) or + ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then + begin + if Origin = soFromBeginning then Dec(Offset, FZRec.total_out); + if Offset > 0 then + begin + for I := 1 to Offset div sizeof(Buf) do + ReadBuffer(Buf, sizeof(Buf)); + ReadBuffer(Buf, Offset mod sizeof(Buf)); + end; + end + else + raise EDecompressionError.CreateRes(@sInvalidStreamOp); + Result := FZRec.total_out; +end; + + +end. diff --git a/deps/zlib-1.2.10/contrib/delphi/ZLibConst.pas b/deps/zlib-1.2.10/contrib/delphi/ZLibConst.pas new file mode 100644 index 0000000..cdfe136 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/delphi/ZLibConst.pas @@ -0,0 +1,11 @@ +unit ZLibConst; + +interface + +resourcestring + sTargetBufferTooSmall = 'ZLib error: target buffer may be too small'; + sInvalidStreamOp = 'Invalid stream operation'; + +implementation + +end. diff --git a/deps/zlib-1.2.10/contrib/delphi/readme.txt b/deps/zlib-1.2.10/contrib/delphi/readme.txt new file mode 100644 index 0000000..2dc9a8b --- /dev/null +++ b/deps/zlib-1.2.10/contrib/delphi/readme.txt @@ -0,0 +1,76 @@ + +Overview +======== + +This directory contains an update to the ZLib interface unit, +distributed by Borland as a Delphi supplemental component. + +The original ZLib unit is Copyright (c) 1997,99 Borland Corp., +and is based on zlib version 1.0.4. There are a series of bugs +and security problems associated with that old zlib version, and +we recommend the users to update their ZLib unit. + + +Summary of modifications +======================== + +- Improved makefile, adapted to zlib version 1.2.1. + +- Some field types from TZStreamRec are changed from Integer to + Longint, for consistency with the zlib.h header, and for 64-bit + readiness. + +- The zlib_version constant is updated. + +- The new Z_RLE strategy has its corresponding symbolic constant. + +- The allocation and deallocation functions and function types + (TAlloc, TFree, zlibAllocMem and zlibFreeMem) are now cdecl, + and _malloc and _free are added as C RTL stubs. As a result, + the original C sources of zlib can be compiled out of the box, + and linked to the ZLib unit. + + +Suggestions for improvements +============================ + +Currently, the ZLib unit provides only a limited wrapper around +the zlib library, and much of the original zlib functionality is +missing. Handling compressed file formats like ZIP/GZIP or PNG +cannot be implemented without having this functionality. +Applications that handle these formats are either using their own, +duplicated code, or not using the ZLib unit at all. + +Here are a few suggestions: + +- Checksum class wrappers around adler32() and crc32(), similar + to the Java classes that implement the java.util.zip.Checksum + interface. + +- The ability to read and write raw deflate streams, without the + zlib stream header and trailer. Raw deflate streams are used + in the ZIP file format. + +- The ability to read and write gzip streams, used in the GZIP + file format, and normally produced by the gzip program. + +- The ability to select a different compression strategy, useful + to PNG and MNG image compression, and to multimedia compression + in general. Besides the compression level + + TCompressionLevel = (clNone, clFastest, clDefault, clMax); + + which, in fact, could have used the 'z' prefix and avoided + TColor-like symbols + + TCompressionLevel = (zcNone, zcFastest, zcDefault, zcMax); + + there could be a compression strategy + + TCompressionStrategy = (zsDefault, zsFiltered, zsHuffmanOnly, zsRle); + +- ZIP and GZIP stream handling via TStreams. + + +-- +Cosmin Truta diff --git a/deps/zlib-1.2.10/contrib/delphi/zlibd32.mak b/deps/zlib-1.2.10/contrib/delphi/zlibd32.mak new file mode 100644 index 0000000..9bb00b7 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/delphi/zlibd32.mak @@ -0,0 +1,99 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib.build b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib.build new file mode 100644 index 0000000..7f90d6b --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib.build @@ -0,0 +1,33 @@ + + + A .Net wrapper library around ZLib1.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib.chm b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib.chm new file mode 100644 index 0000000..f214a44 Binary files /dev/null and b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib.chm differ diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib.sln b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib.sln new file mode 100644 index 0000000..ac45ca0 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotZLib", "DotZLib\DotZLib.csproj", "{BB1EE0B1-1808-46CB-B786-949D91117FC5}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.ActiveCfg = Debug|.NET + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.Build.0 = Debug|.NET + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.ActiveCfg = Release|.NET + {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.Build.0 = Release|.NET + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/AssemblyInfo.cs b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/AssemblyInfo.cs new file mode 100644 index 0000000..0491bfc --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("DotZLib")] +[assembly: AssemblyDescription(".Net bindings for ZLib compression dll 1.2.x")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Henrik Ravn")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) 2004 by Henrik Ravn")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/ChecksumImpl.cs new file mode 100644 index 0000000..788b2fc --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/ChecksumImpl.cs @@ -0,0 +1,202 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + #region ChecksumGeneratorBase + ///

+ /// Implements the common functionality needed for all s + /// + /// + public abstract class ChecksumGeneratorBase : ChecksumGenerator + { + /// + /// The value of the current checksum + /// + protected uint _current; + + /// + /// Initializes a new instance of the checksum generator base - the current checksum is + /// set to zero + /// + public ChecksumGeneratorBase() + { + _current = 0; + } + + /// + /// Initializes a new instance of the checksum generator basewith a specified value + /// + /// The value to set the current checksum to + public ChecksumGeneratorBase(uint initialValue) + { + _current = initialValue; + } + + /// + /// Resets the current checksum to zero + /// + public void Reset() { _current = 0; } + + /// + /// Gets the current checksum value + /// + public uint Value { get { return _current; } } + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + /// All the other Update methods are implmeneted in terms of this one. + /// This is therefore the only method a derived class has to implement + public abstract void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with an array of bytes. + /// + /// The data to update the checksum with + public void Update(byte[] data) + { + Update(data, 0, data.Length); + } + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + public void Update(string data) + { + Update(Encoding.UTF8.GetBytes(data)); + } + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + public void Update(string data, Encoding encoding) + { + Update(encoding.GetBytes(data)); + } + + } + #endregion + + #region CRC32 + /// + /// Implements a CRC32 checksum generator + /// + public sealed class CRC32Checksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint crc32(uint crc, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the CRC32 checksum generator + /// + public CRC32Checksum() : base() {} + + /// + /// Initializes a new instance of the CRC32 checksum generator with a specified value + /// + /// The value to set the current checksum to + public CRC32Checksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = crc32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + + #region Adler + /// + /// Implements a checksum generator that computes the Adler checksum on data + /// + public sealed class AdlerChecksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint adler32(uint adler, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the Adler checksum generator + /// + public AdlerChecksum() : base() {} + + /// + /// Initializes a new instance of the Adler checksum generator with a specified value + /// + /// The value to set the current checksum to + public AdlerChecksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = adler32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + +} \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/CircularBuffer.cs b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/CircularBuffer.cs new file mode 100644 index 0000000..c1cab3a --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/CircularBuffer.cs @@ -0,0 +1,83 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; + +namespace DotZLib +{ + + /// + /// This class implements a circular buffer + /// + internal class CircularBuffer + { + #region Private data + private int _capacity; + private int _head; + private int _tail; + private int _size; + private byte[] _buffer; + #endregion + + public CircularBuffer(int capacity) + { + Debug.Assert( capacity > 0 ); + _buffer = new byte[capacity]; + _capacity = capacity; + _head = 0; + _tail = 0; + _size = 0; + } + + public int Size { get { return _size; } } + + public int Put(byte[] source, int offset, int count) + { + Debug.Assert( count > 0 ); + int trueCount = Math.Min(count, _capacity - Size); + for (int i = 0; i < trueCount; ++i) + _buffer[(_tail+i) % _capacity] = source[offset+i]; + _tail += trueCount; + _tail %= _capacity; + _size += trueCount; + return trueCount; + } + + public bool Put(byte b) + { + if (Size == _capacity) // no room + return false; + _buffer[_tail++] = b; + _tail %= _capacity; + ++_size; + return true; + } + + public int Get(byte[] destination, int offset, int count) + { + int trueCount = Math.Min(count,Size); + for (int i = 0; i < trueCount; ++i) + destination[offset + i] = _buffer[(_head+i) % _capacity]; + _head += trueCount; + _head %= _capacity; + _size -= trueCount; + return trueCount; + } + + public int Get() + { + if (Size == 0) + return -1; + + int result = (int)_buffer[_head++ % _capacity]; + --_size; + return result; + } + + } +} diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/CodecBase.cs b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/CodecBase.cs new file mode 100644 index 0000000..42e6da3 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/CodecBase.cs @@ -0,0 +1,198 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements the common functionality needed for all s + /// + public abstract class CodecBase : Codec, IDisposable + { + + #region Data members + + /// + /// Instance of the internal zlib buffer structure that is + /// passed to all functions in the zlib dll + /// + internal ZStream _ztream = new ZStream(); + + /// + /// True if the object instance has been disposed, false otherwise + /// + protected bool _isDisposed = false; + + /// + /// The size of the internal buffers + /// + protected const int kBufferSize = 16384; + + private byte[] _outBuffer = new byte[kBufferSize]; + private byte[] _inBuffer = new byte[kBufferSize]; + + private GCHandle _hInput; + private GCHandle _hOutput; + + private uint _checksum = 0; + + #endregion + + /// + /// Initializes a new instance of the CodeBase class. + /// + public CodecBase() + { + try + { + _hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned); + _hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned); + } + catch (Exception) + { + CleanUp(false); + throw; + } + } + + + #region Codec Members + + /// + /// Occurs when more processed data are available. + /// + public event DataAvailableHandler DataAvailable; + + /// + /// Fires the event + /// + protected void OnDataAvailable() + { + if (_ztream.total_out > 0) + { + if (DataAvailable != null) + DataAvailable( _outBuffer, 0, (int)_ztream.total_out); + resetOutput(); + } + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + public void Add(byte[] data) + { + Add(data,0,data.Length); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + /// This must be implemented by a derived class + public abstract void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + /// This must be implemented by a derived class + public abstract void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + public uint Checksum { get { return _checksum; } } + + #endregion + + #region Destructor & IDisposable stuff + + /// + /// Destroys this instance + /// + ~CodecBase() + { + CleanUp(false); + } + + /// + /// Releases any unmanaged resources and calls the method of the derived class + /// + public void Dispose() + { + CleanUp(true); + } + + /// + /// Performs any codec specific cleanup + /// + /// This must be implemented by a derived class + protected abstract void CleanUp(); + + // performs the release of the handles and calls the dereived CleanUp() + private void CleanUp(bool isDisposing) + { + if (!_isDisposed) + { + CleanUp(); + if (_hInput.IsAllocated) + _hInput.Free(); + if (_hOutput.IsAllocated) + _hOutput.Free(); + + _isDisposed = true; + } + } + + + #endregion + + #region Helper methods + + /// + /// Copies a number of bytes to the internal codec buffer - ready for proccesing + /// + /// The byte array that contains the data to copy + /// The index of the first byte to copy + /// The number of bytes to copy from data + protected void copyInput(byte[] data, int startIndex, int count) + { + Array.Copy(data, startIndex, _inBuffer,0, count); + _ztream.next_in = _hInput.AddrOfPinnedObject(); + _ztream.total_in = 0; + _ztream.avail_in = (uint)count; + + } + + /// + /// Resets the internal output buffers to a known state - ready for processing + /// + protected void resetOutput() + { + _ztream.total_out = 0; + _ztream.avail_out = kBufferSize; + _ztream.next_out = _hOutput.AddrOfPinnedObject(); + } + + /// + /// Updates the running checksum property + /// + /// The new checksum value + protected void setChecksum(uint newSum) + { + _checksum = newSum; + } + #endregion + + } +} diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/Deflater.cs b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/Deflater.cs new file mode 100644 index 0000000..c247792 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/Deflater.cs @@ -0,0 +1,106 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data compressor, using the deflate algorithm in the ZLib dll + /// + public sealed class Deflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int deflateInit_(ref ZStream sz, int level, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Deflater + /// + /// The compression level to use for this Deflater + public Deflater(CompressLevel level) : base() + { + int retval = deflateInit_(ref _ztream, (int)level, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize deflater"); + + resetOutput(); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + while (err >= 0 && _ztream.avail_in > 0) + { + err = deflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = deflate(ref _ztream, (int)FlushTypes.None); + } + inputIndex += (int)_ztream.total_in; + } + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = deflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + deflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib deflate stream + /// + protected override void CleanUp() { deflateEnd(ref _ztream); } + + } +} diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/DotZLib.cs b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/DotZLib.cs new file mode 100644 index 0000000..be184b4 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/DotZLib.cs @@ -0,0 +1,288 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + + #region Internal types + + /// + /// Defines constants for the various flush types used with zlib + /// + internal enum FlushTypes + { + None, Partial, Sync, Full, Finish, Block + } + + #region ZStream structure + // internal mapping of the zlib zstream structure for marshalling + [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)] + internal struct ZStream + { + public IntPtr next_in; + public uint avail_in; + public uint total_in; + + public IntPtr next_out; + public uint avail_out; + public uint total_out; + + [MarshalAs(UnmanagedType.LPStr)] + string msg; + uint state; + + uint zalloc; + uint zfree; + uint opaque; + + int data_type; + public uint adler; + uint reserved; + } + + #endregion + + #endregion + + #region Public enums + /// + /// Defines constants for the available compression levels in zlib + /// + public enum CompressLevel : int + { + /// + /// The default compression level with a reasonable compromise between compression and speed + /// + Default = -1, + /// + /// No compression at all. The data are passed straight through. + /// + None = 0, + /// + /// The maximum compression rate available. + /// + Best = 9, + /// + /// The fastest available compression level. + /// + Fastest = 1 + } + #endregion + + #region Exception classes + /// + /// The exception that is thrown when an error occurs on the zlib dll + /// + public class ZLibException : ApplicationException + { + /// + /// Initializes a new instance of the class with a specified + /// error message and error code + /// + /// The zlib error code that caused the exception + /// A message that (hopefully) describes the error + public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg)) + { + } + + /// + /// Initializes a new instance of the class with a specified + /// error code + /// + /// The zlib error code that caused the exception + public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode)) + { + } + } + #endregion + + #region Interfaces + + /// + /// Declares methods and properties that enables a running checksum to be calculated + /// + public interface ChecksumGenerator + { + /// + /// Gets the current value of the checksum + /// + uint Value { get; } + + /// + /// Clears the current checksum to 0 + /// + void Reset(); + + /// + /// Updates the current checksum with an array of bytes + /// + /// The data to update the checksum with + void Update(byte[] data); + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + void Update(string data); + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + void Update(string data, Encoding encoding); + } + + + /// + /// Represents the method that will be called from a codec when new data + /// are available. + /// + /// The byte array containing the processed data + /// The index of the first processed byte in data + /// The number of processed bytes available + /// On return from this method, the data may be overwritten, so grab it while you can. + /// You cannot assume that startIndex will be zero. + /// + public delegate void DataAvailableHandler(byte[] data, int startIndex, int count); + + /// + /// Declares methods and events for implementing compressors/decompressors + /// + public interface Codec + { + /// + /// Occurs when more processed data are available. + /// + event DataAvailableHandler DataAvailable; + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data); + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + uint Checksum { get; } + + + } + + #endregion + + #region Classes + /// + /// Encapsulates general information about the ZLib library + /// + public class Info + { + #region DLL imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint zlibCompileFlags(); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern string zlibVersion(); + #endregion + + #region Private stuff + private uint _flags; + + // helper function that unpacks a bitsize mask + private static int bitSize(uint bits) + { + switch (bits) + { + case 0: return 16; + case 1: return 32; + case 2: return 64; + } + return -1; + } + #endregion + + /// + /// Constructs an instance of the Info class. + /// + public Info() + { + _flags = zlibCompileFlags(); + } + + /// + /// True if the library is compiled with debug info + /// + public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } } + + /// + /// True if the library is compiled with assembly optimizations + /// + public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } } + + /// + /// Gets the size of the unsigned int that was compiled into Zlib + /// + public int SizeOfUInt { get { return bitSize(_flags & 3); } } + + /// + /// Gets the size of the unsigned long that was compiled into Zlib + /// + public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } } + + /// + /// Gets the size of the pointers that were compiled into Zlib + /// + public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } } + + /// + /// Gets the size of the z_off_t type that was compiled into Zlib + /// + public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } } + + /// + /// Gets the version of ZLib as a string, e.g. "1.2.1" + /// + public static string Version { get { return zlibVersion(); } } + } + + #endregion + +} diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/DotZLib.csproj b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/DotZLib.csproj new file mode 100644 index 0000000..71eeb85 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/DotZLib.csproj @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/GZipStream.cs b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/GZipStream.cs new file mode 100644 index 0000000..b161300 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/GZipStream.cs @@ -0,0 +1,301 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements a compressed , in GZip (.gz) format. + /// + public class GZipStream : Stream, IDisposable + { + #region Dll Imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern IntPtr gzopen(string name, string mode); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzclose(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzwrite(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzread(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzgetc(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzputc(IntPtr gzFile, int c); + + #endregion + + #region Private data + private IntPtr _gzFile; + private bool _isDisposed = false; + private bool _isWriting; + #endregion + + #region Constructors + /// + /// Creates a new file as a writeable GZipStream + /// + /// The name of the compressed file to create + /// The compression level to use when adding data + /// If an error occurred in the internal zlib function + public GZipStream(string fileName, CompressLevel level) + { + _isWriting = true; + _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level)); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + } + + /// + /// Opens an existing file as a readable GZipStream + /// + /// The name of the file to open + /// If an error occurred in the internal zlib function + public GZipStream(string fileName) + { + _isWriting = false; + _gzFile = gzopen(fileName, "rb"); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + + } + #endregion + + #region Access properties + /// + /// Returns true of this stream can be read from, false otherwise + /// + public override bool CanRead + { + get + { + return !_isWriting; + } + } + + + /// + /// Returns false. + /// + public override bool CanSeek + { + get + { + return false; + } + } + + /// + /// Returns true if this tsream is writeable, false otherwise + /// + public override bool CanWrite + { + get + { + return _isWriting; + } + } + #endregion + + #region Destructor & IDispose stuff + + /// + /// Destroys this instance + /// + ~GZipStream() + { + cleanUp(false); + } + + /// + /// Closes the external file handle + /// + public void Dispose() + { + cleanUp(true); + } + + // Does the actual closing of the file handle. + private void cleanUp(bool isDisposing) + { + if (!_isDisposed) + { + gzclose(_gzFile); + _isDisposed = true; + } + } + #endregion + + #region Basic reading and writing + /// + /// Attempts to read a number of bytes from the stream. + /// + /// The destination data buffer + /// The index of the first destination byte in buffer + /// The number of bytes requested + /// The number of bytes read + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not readable. + /// If this stream has been disposed. + public override int Read(byte[] buffer, int offset, int count) + { + if (!CanRead) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + int result; + try + { + result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + return result; + } + + /// + /// Attempts to read a single byte from the stream. + /// + /// The byte that was read, or -1 in case of error or End-Of-File + public override int ReadByte() + { + if (!CanRead) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + return gzgetc(_gzFile); + } + + /// + /// Writes a number of bytes to the stream + /// + /// + /// + /// + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void Write(byte[] buffer, int offset, int count) + { + if (!CanWrite) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + try + { + int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + } + + /// + /// Writes a single byte to the stream + /// + /// The byte to add to the stream. + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void WriteByte(byte value) + { + if (!CanWrite) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + int result = gzputc(_gzFile, (int)value); + if (result < 0) + throw new IOException(); + } + #endregion + + #region Position & length stuff + /// + /// Not supported. + /// + /// + /// Always thrown + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + /// + /// Not suppported. + /// + /// + /// + /// + /// Always thrown + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + /// + /// Flushes the GZipStream. + /// + /// In this implementation, this method does nothing. This is because excessive + /// flushing may degrade the achievable compression rates. + public override void Flush() + { + // left empty on purpose + } + + /// + /// Gets/sets the current position in the GZipStream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Position + { + get + { + throw new NotSupportedException(); + } + set + { + throw new NotSupportedException(); + } + } + + /// + /// Gets the size of the stream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Length + { + get + { + throw new NotSupportedException(); + } + } + #endregion + } +} diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/Inflater.cs b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/Inflater.cs new file mode 100644 index 0000000..8ed5451 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/Inflater.cs @@ -0,0 +1,105 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data decompressor, using the inflate algorithm in the ZLib dll + /// + public class Inflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int inflateInit_(ref ZStream sz, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Inflater + /// + public Inflater() : base() + { + int retval = inflateInit_(ref _ztream, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize inflater"); + + resetOutput(); + } + + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + err = inflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = inflate(ref _ztream, (int)FlushTypes.None); + } + + inputIndex += (int)_ztream.total_in; + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = inflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + inflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib inflate stream + /// + protected override void CleanUp() { inflateEnd(ref _ztream); } + + + } +} diff --git a/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/UnitTests.cs b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/UnitTests.cs new file mode 100644 index 0000000..a0e3985 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/DotZLib/UnitTests.cs @@ -0,0 +1,274 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Collections; +using System.IO; + +// uncomment the define below to include unit tests +//#define nunit +#if nunit +using NUnit.Framework; + +// Unit tests for the DotZLib class library +// ---------------------------------------- +// +// Use this with NUnit 2 from http://www.nunit.org +// + +namespace DotZLibTests +{ + using DotZLib; + + // helper methods + internal class Utils + { + public static bool byteArrEqual( byte[] lhs, byte[] rhs ) + { + if (lhs.Length != rhs.Length) + return false; + for (int i = lhs.Length-1; i >= 0; --i) + if (lhs[i] != rhs[i]) + return false; + return true; + } + + } + + + [TestFixture] + public class CircBufferTests + { + #region Circular buffer tests + [Test] + public void SinglePutGet() + { + CircularBuffer buf = new CircularBuffer(10); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + + Assert.IsTrue(buf.Put( 1 )); + Assert.AreEqual( 1, buf.Size ); + Assert.AreEqual( 1, buf.Get() ); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + } + + [Test] + public void BlockPutGet() + { + CircularBuffer buf = new CircularBuffer(10); + byte[] arr = {1,2,3,4,5,6,7,8,9,10}; + Assert.AreEqual( 10, buf.Put(arr,0,10) ); + Assert.AreEqual( 10, buf.Size ); + Assert.IsFalse( buf.Put(11) ); + Assert.AreEqual( 1, buf.Get() ); + Assert.IsTrue( buf.Put(11) ); + + byte[] arr2 = (byte[])arr.Clone(); + Assert.AreEqual( 9, buf.Get(arr2,1,9) ); + Assert.IsTrue( Utils.byteArrEqual(arr,arr2) ); + } + + #endregion + } + + [TestFixture] + public class ChecksumTests + { + #region CRC32 Tests + [Test] + public void CRC32_Null() + { + CRC32Checksum crc32 = new CRC32Checksum(); + Assert.AreEqual( 0, crc32.Value ); + + crc32 = new CRC32Checksum(1); + Assert.AreEqual( 1, crc32.Value ); + + crc32 = new CRC32Checksum(556); + Assert.AreEqual( 556, crc32.Value ); + } + + [Test] + public void CRC32_Data() + { + CRC32Checksum crc32 = new CRC32Checksum(); + byte[] data = { 1,2,3,4,5,6,7 }; + crc32.Update(data); + Assert.AreEqual( 0x70e46888, crc32.Value ); + + crc32 = new CRC32Checksum(); + crc32.Update("penguin"); + Assert.AreEqual( 0x0e5c1a120, crc32.Value ); + + crc32 = new CRC32Checksum(1); + crc32.Update("penguin"); + Assert.AreEqual(0x43b6aa94, crc32.Value); + + } + #endregion + + #region Adler tests + + [Test] + public void Adler_Null() + { + AdlerChecksum adler = new AdlerChecksum(); + Assert.AreEqual(0, adler.Value); + + adler = new AdlerChecksum(1); + Assert.AreEqual( 1, adler.Value ); + + adler = new AdlerChecksum(556); + Assert.AreEqual( 556, adler.Value ); + } + + [Test] + public void Adler_Data() + { + AdlerChecksum adler = new AdlerChecksum(1); + byte[] data = { 1,2,3,4,5,6,7 }; + adler.Update(data); + Assert.AreEqual( 0x5b001d, adler.Value ); + + adler = new AdlerChecksum(); + adler.Update("penguin"); + Assert.AreEqual(0x0bcf02f6, adler.Value ); + + adler = new AdlerChecksum(1); + adler.Update("penguin"); + Assert.AreEqual(0x0bd602f7, adler.Value); + + } + #endregion + } + + [TestFixture] + public class InfoTests + { + #region Info tests + [Test] + public void Info_Version() + { + Info info = new Info(); + Assert.AreEqual("1.2.10", Info.Version); + Assert.AreEqual(32, info.SizeOfUInt); + Assert.AreEqual(32, info.SizeOfULong); + Assert.AreEqual(32, info.SizeOfPointer); + Assert.AreEqual(32, info.SizeOfOffset); + } + #endregion + } + + [TestFixture] + public class DeflateInflateTests + { + #region Deflate tests + [Test] + public void Deflate_Init() + { + using (Deflater def = new Deflater(CompressLevel.Default)) + { + } + } + + private ArrayList compressedData = new ArrayList(); + private uint adler1; + + private ArrayList uncompressedData = new ArrayList(); + private uint adler2; + + public void CDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + compressedData.Add(data[i+startIndex]); + } + + [Test] + public void Deflate_Compress() + { + compressedData.Clear(); + + byte[] testData = new byte[35000]; + for (int i = 0; i < testData.Length; ++i) + testData[i] = 5; + + using (Deflater def = new Deflater((CompressLevel)5)) + { + def.DataAvailable += new DataAvailableHandler(CDataAvail); + def.Add(testData); + def.Finish(); + adler1 = def.Checksum; + } + } + #endregion + + #region Inflate tests + [Test] + public void Inflate_Init() + { + using (Inflater inf = new Inflater()) + { + } + } + + private void DDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + uncompressedData.Add(data[i+startIndex]); + } + + [Test] + public void Inflate_Expand() + { + uncompressedData.Clear(); + + using (Inflater inf = new Inflater()) + { + inf.DataAvailable += new DataAvailableHandler(DDataAvail); + inf.Add((byte[])compressedData.ToArray(typeof(byte))); + inf.Finish(); + adler2 = inf.Checksum; + } + Assert.AreEqual( adler1, adler2 ); + } + #endregion + } + + [TestFixture] + public class GZipStreamTests + { + #region GZipStream test + [Test] + public void GZipStream_WriteRead() + { + using (GZipStream gzOut = new GZipStream("gzstream.gz", CompressLevel.Best)) + { + BinaryWriter writer = new BinaryWriter(gzOut); + writer.Write("hi there"); + writer.Write(Math.PI); + writer.Write(42); + } + + using (GZipStream gzIn = new GZipStream("gzstream.gz")) + { + BinaryReader reader = new BinaryReader(gzIn); + string s = reader.ReadString(); + Assert.AreEqual("hi there",s); + double d = reader.ReadDouble(); + Assert.AreEqual(Math.PI, d); + int i = reader.ReadInt32(); + Assert.AreEqual(42,i); + } + + } + #endregion + } +} + +#endif diff --git a/deps/zlib-1.2.10/contrib/dotzlib/LICENSE_1_0.txt b/deps/zlib-1.2.10/contrib/dotzlib/LICENSE_1_0.txt new file mode 100644 index 0000000..30aac2c --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/dotzlib/readme.txt b/deps/zlib-1.2.10/contrib/dotzlib/readme.txt new file mode 100644 index 0000000..b239572 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/dotzlib/readme.txt @@ -0,0 +1,58 @@ +This directory contains a .Net wrapper class library for the ZLib1.dll + +The wrapper includes support for inflating/deflating memory buffers, +.Net streaming wrappers for the gz streams part of zlib, and wrappers +for the checksum parts of zlib. See DotZLib/UnitTests.cs for examples. + +Directory structure: +-------------------- + +LICENSE_1_0.txt - License file. +readme.txt - This file. +DotZLib.chm - Class library documentation +DotZLib.build - NAnt build file +DotZLib.sln - Microsoft Visual Studio 2003 solution file + +DotZLib\*.cs - Source files for the class library + +Unit tests: +----------- +The file DotZLib/UnitTests.cs contains unit tests for use with NUnit 2.1 or higher. +To include unit tests in the build, define nunit before building. + + +Build instructions: +------------------- + +1. Using Visual Studio.Net 2003: + Open DotZLib.sln in VS.Net and build from there. Output file (DotZLib.dll) + will be found ./DotZLib/bin/release or ./DotZLib/bin/debug, depending on + you are building the release or debug version of the library. Check + DotZLib/UnitTests.cs for instructions on how to include unit tests in the + build. + +2. Using NAnt: + Open a command prompt with access to the build environment and run nant + in the same directory as the DotZLib.build file. + You can define 2 properties on the nant command-line to control the build: + debug={true|false} to toggle between release/debug builds (default=true). + nunit={true|false} to include or esclude unit tests (default=true). + Also the target clean will remove binaries. + Output file (DotZLib.dll) will be found in either ./DotZLib/bin/release + or ./DotZLib/bin/debug, depending on whether you are building the release + or debug version of the library. + + Examples: + nant -D:debug=false -D:nunit=false + will build a release mode version of the library without unit tests. + nant + will build a debug version of the library with unit tests + nant clean + will remove all previously built files. + + +--------------------------------- +Copyright (c) Henrik Ravn 2004 + +Use, modification and distribution are subject to the Boost Software License, Version 1.0. +(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/deps/zlib-1.2.10/contrib/gcc_gvmat64/gvmat64.S b/deps/zlib-1.2.10/contrib/gcc_gvmat64/gvmat64.S new file mode 100644 index 0000000..dd858dd --- /dev/null +++ b/deps/zlib-1.2.10/contrib/gcc_gvmat64/gvmat64.S @@ -0,0 +1,574 @@ +/* +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); // current match + +; gvmat64.S -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; this file is translation from gvmat64.asm to GCC 4.x (for Linux, Mac XCode) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Permission is granted to anyone to use this software for any purpose, +; including commercial applications, and to alter it and redistribute it +; freely, subject to the following restrictions: +; +; 1. The origin of this software must not be misrepresented; you must not +; claim that you wrote the original software. If you use this software +; in a product, an acknowledgment in the product documentation would be +; appreciated but is not required. +; 2. Altered source versions must be plainly marked as such, and must not be +; misrepresented as being the original software +; 3. This notice may not be removed or altered from any source distribution. +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for zLib, I use option: +; gcc -c -arch x86_64 gvmat64.S + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; // current match / +; +; with XCode for Mac, I had strange error with some jump on intel syntax +; this is why BEFORE_JMP and AFTER_JMP are used + */ + + +#define BEFORE_JMP .att_syntax +#define AFTER_JMP .intel_syntax noprefix + +#ifndef NO_UNDERLINE +# define match_init _match_init +# define longest_match _longest_match +#endif + +.intel_syntax noprefix + +.globl match_init, longest_match +.text +longest_match: + + + +#define LocalVarsSize 96 +/* +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp +*/ + +#define chainlenwmask (rsp + 8 - LocalVarsSize) +#define nicematch (rsp + 16 - LocalVarsSize) + +#define save_rdi (rsp + 24 - LocalVarsSize) +#define save_rsi (rsp + 32 - LocalVarsSize) +#define save_rbx (rsp + 40 - LocalVarsSize) +#define save_rbp (rsp + 48 - LocalVarsSize) +#define save_r12 (rsp + 56 - LocalVarsSize) +#define save_r13 (rsp + 64 - LocalVarsSize) +#define save_r14 (rsp + 72 - LocalVarsSize) +#define save_r15 (rsp + 80 - LocalVarsSize) + + +/* +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure +*/ + +#define MAX_MATCH 258 +#define MIN_MATCH 3 +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) + +/* +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). +*/ + + + +/* you can check the structure offset by running + +#include +#include +#include "deflate.h" + +void print_depl() +{ +deflate_state ds; +deflate_state *s=&ds; +printf("size pointer=%u\n",(int)sizeof(void*)); + +printf("#define dsWSize %u\n",(int)(((char*)&(s->w_size))-((char*)s))); +printf("#define dsWMask %u\n",(int)(((char*)&(s->w_mask))-((char*)s))); +printf("#define dsWindow %u\n",(int)(((char*)&(s->window))-((char*)s))); +printf("#define dsPrev %u\n",(int)(((char*)&(s->prev))-((char*)s))); +printf("#define dsMatchLen %u\n",(int)(((char*)&(s->match_length))-((char*)s))); +printf("#define dsPrevMatch %u\n",(int)(((char*)&(s->prev_match))-((char*)s))); +printf("#define dsStrStart %u\n",(int)(((char*)&(s->strstart))-((char*)s))); +printf("#define dsMatchStart %u\n",(int)(((char*)&(s->match_start))-((char*)s))); +printf("#define dsLookahead %u\n",(int)(((char*)&(s->lookahead))-((char*)s))); +printf("#define dsPrevLen %u\n",(int)(((char*)&(s->prev_length))-((char*)s))); +printf("#define dsMaxChainLen %u\n",(int)(((char*)&(s->max_chain_length))-((char*)s))); +printf("#define dsGoodMatch %u\n",(int)(((char*)&(s->good_match))-((char*)s))); +printf("#define dsNiceMatch %u\n",(int)(((char*)&(s->nice_match))-((char*)s))); +} +*/ + +#define dsWSize 68 +#define dsWMask 76 +#define dsWindow 80 +#define dsPrev 96 +#define dsMatchLen 144 +#define dsPrevMatch 148 +#define dsStrStart 156 +#define dsMatchStart 160 +#define dsLookahead 164 +#define dsPrevLen 168 +#define dsMaxChainLen 172 +#define dsGoodMatch 188 +#define dsNiceMatch 192 + +#define window_size [ rcx + dsWSize] +#define WMask [ rcx + dsWMask] +#define window_ad [ rcx + dsWindow] +#define prev_ad [ rcx + dsPrev] +#define strstart [ rcx + dsStrStart] +#define match_start [ rcx + dsMatchStart] +#define Lookahead [ rcx + dsLookahead] //; 0ffffffffh on infozip +#define prev_length [ rcx + dsPrevLen] +#define max_chain_length [ rcx + dsMaxChainLen] +#define good_match [ rcx + dsGoodMatch] +#define nice_match [ rcx + dsNiceMatch] + +/* +; windows: +; parameter 1 in rcx(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + +; +; gcc on macosx-linux: +; see http://www.x86-64.org/documentation/abi-0.99.pdf +; param 1 in rdi, param 2 in rsi +; rbx, rsp, rbp, r12 to r15 must be preserved + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + +; ms: parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) +; mac: param 1 in rdi, param 2 rsi +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx +*/ + mov [save_rbx],rbx + mov [save_rbp],rbp + + + mov rcx,rdi + + mov r8d,esi + + + mov [save_r12],r12 + mov [save_r13],r13 + mov [save_r14],r14 + mov [save_r15],r15 + + +//;;; uInt wmask = s->w_mask; +//;;; unsigned chain_length = s->max_chain_length; +//;;; if (s->prev_length >= s->good_match) { +//;;; chain_length >>= 2; +//;;; } + + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +//;;; chainlen is decremented once beforehand so that the function can +//;;; use the sign flag instead of the zero flag for the exit test. +//;;; It is then shifted into the high word, to make room for the wmask +//;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + +//;;; on zlib only +//;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + + + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d + + + +//;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +//;;; Determine how many bytes the scan ptr is off from being +//;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +//;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +//;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + + mov eax, window_size + sub eax, MIN_LOOKAHEAD + + + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +//;;; int best_len = s->prev_length; + + +//;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +//;;; register ush scan_start = *(ushf*)scan; +//;;; register ush scan_end = *(ushf*)(scan+best_len-1); +//;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +//;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + + + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + + + + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + jmp LookupLoopIsZero + AFTER_JMP +/* +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit +*/ +.balign 16 +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP + + +//;;; Store the current value of chainlen. + mov [chainlenwmask], edx +/* +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). +*/ + lea rsi,[r8+r10] + mov rdx, 0xfffffffffffffef8 //; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0x0108] //;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0x0108] //;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + +/* +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. +*/ + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + BEFORE_JMP + jnz LoopCmps + jmp LenMaximum + AFTER_JMP + +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0x0000FFFF + jnz LenLower + + test eax,0xffffffff + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + BEFORE_JMP + jnz LenLower + AFTER_JMP + +LenLower32: + shr eax,16 + add rdx,2 + +LenLower: + sub al, 1 + adc rdx, 0 +//;;; Calculate the length of the match. If it is longer than MAX_MATCH, +//;;; then automatically accept it as the best possible match and leave. + + lea rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + BEFORE_JMP + jge LenMaximum + AFTER_JMP +/* +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// +*/ + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP +/* +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); +*/ +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + BEFORE_JMP + jge LeaveNow + AFTER_JMP + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP + +//;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +//;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +//;;; return s->lookahead; + +LeaveNow: + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d + + + +//;;; Restore the stack and return from whence we came. + + +// mov rsi,[save_rsi] +// mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] + mov r14,[save_r14] + mov r15,[save_r15] + + + ret 0 +//; please don't remove this string ! +//; Your can freely use gvmat64 in any free or commercial app +//; but it is far better don't remove the string in the binary! + // db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 + + +match_init: + ret 0 + + diff --git a/deps/zlib-1.2.10/contrib/infback9/README b/deps/zlib-1.2.10/contrib/infback9/README new file mode 100644 index 0000000..e75ed13 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/infback9/README @@ -0,0 +1 @@ +See infback9.h for what this is and how to use it. diff --git a/deps/zlib-1.2.10/contrib/infback9/infback9.c b/deps/zlib-1.2.10/contrib/infback9/infback9.c new file mode 100644 index 0000000..05fb3e3 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/infback9/infback9.c @@ -0,0 +1,615 @@ +/* infback9.c -- inflate deflate64 data using a call-back interface + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infback9.h" +#include "inftree9.h" +#include "inflate9.h" + +#define WSIZE 65536UL + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + window is a user-supplied window and output buffer that is 64K bytes. + */ +int ZEXPORT inflateBack9Init_(strm, window, version, stream_size) +z_stream FAR *strm; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (voidpf)state; + state->window = window; + return Z_OK; +} + +/* + Build and output length and distance decoding tables for fixed code + decoding. + */ +#ifdef MAKEFIXED +#include + +void makefixed9(void) +{ + unsigned sym, bits, low, size; + code *next, *lenfix, *distfix; + struct inflate_state state; + code fixed[544]; + + /* literal/length table */ + sym = 0; + while (sym < 144) state.lens[sym++] = 8; + while (sym < 256) state.lens[sym++] = 9; + while (sym < 280) state.lens[sym++] = 7; + while (sym < 288) state.lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table9(LENS, state.lens, 288, &(next), &(bits), state.work); + + /* distance table */ + sym = 0; + while (sym < 32) state.lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table9(DISTS, state.lens, 32, &(next), &(bits), state.work); + + /* write tables */ + puts(" /* inffix9.h -- table for decoding deflate64 fixed codes"); + puts(" * Generated automatically by makefixed9()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", lenfix[low].op, lenfix[low].bits, + lenfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 5) == 0) printf("\n "); + printf("{%u,%u,%d}", distfix[low].op, distfix[low].bits, + distfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* Macros for inflateBack(): */ + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n <= 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = window; \ + left = WSIZE; \ + wrap = 1; \ + if (out(out_desc, put, (unsigned)left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc) +z_stream FAR *strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have; /* available input */ + unsigned long left; /* available output */ + inflate_mode mode; /* current inflate mode */ + int lastblock; /* true if processing last block */ + int wrap; /* true if the window has wrapped */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned extra; /* extra bits needed */ + unsigned long length; /* literal or length of data to copy */ + unsigned long offset; /* distance back to copy string from */ + unsigned long copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +#include "inffix9.h" + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + mode = TYPE; + lastblock = 0; + wrap = 0; + window = state->window; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = window; + left = WSIZE; + lencode = Z_NULL; + distcode = Z_NULL; + + /* Inflate until end of block marked as last */ + for (;;) + switch (mode) { + case TYPE: + /* determine and dispatch block type */ + if (lastblock) { + BYTEBITS(); + mode = DONE; + break; + } + NEEDBITS(3); + lastblock = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + lastblock ? " (last)" : "")); + mode = STORED; + break; + case 1: /* fixed block */ + lencode = lenfix; + lenbits = 9; + distcode = distfix; + distbits = 5; + Tracev((stderr, "inflate: fixed codes block%s\n", + lastblock ? " (last)" : "")); + mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + lastblock ? " (last)" : "")); + mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + mode = BAD; + break; + } + length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %lu\n", + length)); + INITBITS(); + + /* copy stored block from input to output */ + while (length != 0) { + copy = length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); + if (state->nlen > 286) { + strm->msg = (char *)"too many length symbols"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 7; + ret = inflate_table9(CODES, state->lens, 19, &(state->next), + &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftree9.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 9; + ret = inflate_table9(LENS, state->lens, state->nlen, + &(state->next), &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + mode = BAD; + break; + } + distcode = (code const FAR *)(state->next); + distbits = 6; + ret = inflate_table9(DISTS, state->lens + state->nlen, + state->ndist, &(state->next), &(distbits), + state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + mode = LEN; + + case LEN: + /* get a literal, length, or end-of-block code */ + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(length); + left--; + mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + extra = (unsigned)(here.op) & 31; + if (extra != 0) { + NEEDBITS(extra); + length += BITS(extra); + DROPBITS(extra); + } + Tracevv((stderr, "inflate: length %lu\n", length)); + + /* get distance code */ + for (;;) { + here = distcode[BITS(distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + mode = BAD; + break; + } + offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + extra = (unsigned)(here.op) & 15; + if (extra != 0) { + NEEDBITS(extra); + offset += BITS(extra); + DROPBITS(extra); + } + if (offset > WSIZE - (wrap ? 0: left)) { + strm->msg = (char *)"invalid distance too far back"; + mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %lu\n", offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = WSIZE - offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - offset; + copy = left; + } + if (copy > length) copy = length; + length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < WSIZE) { + if (out(out_desc, window, (unsigned)(WSIZE - left))) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBack9End(strm) +z_stream FAR *strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/deps/zlib-1.2.10/contrib/infback9/infback9.h b/deps/zlib-1.2.10/contrib/infback9/infback9.h new file mode 100644 index 0000000..1073c0a --- /dev/null +++ b/deps/zlib-1.2.10/contrib/infback9/infback9.h @@ -0,0 +1,37 @@ +/* infback9.h -- header for using inflateBack9 functions + * Copyright (C) 2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * This header file and associated patches provide a decoder for PKWare's + * undocumented deflate64 compression method (method 9). Use with infback9.c, + * inftree9.h, inftree9.c, and inffix9.h. These patches are not supported. + * This should be compiled with zlib, since it uses zutil.h and zutil.o. + * This code has not yet been tested on 16-bit architectures. See the + * comments in zlib.h for inflateBack() usage. These functions are used + * identically, except that there is no windowBits parameter, and a 64K + * window must be provided. Also if int's are 16 bits, then a zero for + * the third parameter of the "out" function actually means 65536UL. + * zlib.h must be included before this header file. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm)); +ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define inflateBack9Init(strm, window) \ + inflateBack9Init_((strm), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + +#ifdef __cplusplus +} +#endif diff --git a/deps/zlib-1.2.10/contrib/infback9/inffix9.h b/deps/zlib-1.2.10/contrib/infback9/inffix9.h new file mode 100644 index 0000000..ee5671d --- /dev/null +++ b/deps/zlib-1.2.10/contrib/infback9/inffix9.h @@ -0,0 +1,107 @@ + /* inffix9.h -- table for decoding deflate64 fixed codes + * Generated automatically by makefixed9(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{132,8,115},{130,7,31},{0,8,112}, + {0,8,48},{0,9,192},{128,7,10},{0,8,96},{0,8,32},{0,9,160}, + {0,8,0},{0,8,128},{0,8,64},{0,9,224},{128,7,6},{0,8,88}, + {0,8,24},{0,9,144},{131,7,59},{0,8,120},{0,8,56},{0,9,208}, + {129,7,17},{0,8,104},{0,8,40},{0,9,176},{0,8,8},{0,8,136}, + {0,8,72},{0,9,240},{128,7,4},{0,8,84},{0,8,20},{133,8,227}, + {131,7,43},{0,8,116},{0,8,52},{0,9,200},{129,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232}, + {128,7,8},{0,8,92},{0,8,28},{0,9,152},{132,7,83},{0,8,124}, + {0,8,60},{0,9,216},{130,7,23},{0,8,108},{0,8,44},{0,9,184}, + {0,8,12},{0,8,140},{0,8,76},{0,9,248},{128,7,3},{0,8,82}, + {0,8,18},{133,8,163},{131,7,35},{0,8,114},{0,8,50},{0,9,196}, + {129,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},{0,8,130}, + {0,8,66},{0,9,228},{128,7,7},{0,8,90},{0,8,26},{0,9,148}, + {132,7,67},{0,8,122},{0,8,58},{0,9,212},{130,7,19},{0,8,106}, + {0,8,42},{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244}, + {128,7,5},{0,8,86},{0,8,22},{65,8,0},{131,7,51},{0,8,118}, + {0,8,54},{0,9,204},{129,7,15},{0,8,102},{0,8,38},{0,9,172}, + {0,8,6},{0,8,134},{0,8,70},{0,9,236},{128,7,9},{0,8,94}, + {0,8,30},{0,9,156},{132,7,99},{0,8,126},{0,8,62},{0,9,220}, + {130,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{133,8,131}, + {130,7,31},{0,8,113},{0,8,49},{0,9,194},{128,7,10},{0,8,97}, + {0,8,33},{0,9,162},{0,8,1},{0,8,129},{0,8,65},{0,9,226}, + {128,7,6},{0,8,89},{0,8,25},{0,9,146},{131,7,59},{0,8,121}, + {0,8,57},{0,9,210},{129,7,17},{0,8,105},{0,8,41},{0,9,178}, + {0,8,9},{0,8,137},{0,8,73},{0,9,242},{128,7,4},{0,8,85}, + {0,8,21},{144,8,3},{131,7,43},{0,8,117},{0,8,53},{0,9,202}, + {129,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133}, + {0,8,69},{0,9,234},{128,7,8},{0,8,93},{0,8,29},{0,9,154}, + {132,7,83},{0,8,125},{0,8,61},{0,9,218},{130,7,23},{0,8,109}, + {0,8,45},{0,9,186},{0,8,13},{0,8,141},{0,8,77},{0,9,250}, + {128,7,3},{0,8,83},{0,8,19},{133,8,195},{131,7,35},{0,8,115}, + {0,8,51},{0,9,198},{129,7,11},{0,8,99},{0,8,35},{0,9,166}, + {0,8,3},{0,8,131},{0,8,67},{0,9,230},{128,7,7},{0,8,91}, + {0,8,27},{0,9,150},{132,7,67},{0,8,123},{0,8,59},{0,9,214}, + {130,7,19},{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139}, + {0,8,75},{0,9,246},{128,7,5},{0,8,87},{0,8,23},{77,8,0}, + {131,7,51},{0,8,119},{0,8,55},{0,9,206},{129,7,15},{0,8,103}, + {0,8,39},{0,9,174},{0,8,7},{0,8,135},{0,8,71},{0,9,238}, + {128,7,9},{0,8,95},{0,8,31},{0,9,158},{132,7,99},{0,8,127}, + {0,8,63},{0,9,222},{130,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80}, + {0,8,16},{132,8,115},{130,7,31},{0,8,112},{0,8,48},{0,9,193}, + {128,7,10},{0,8,96},{0,8,32},{0,9,161},{0,8,0},{0,8,128}, + {0,8,64},{0,9,225},{128,7,6},{0,8,88},{0,8,24},{0,9,145}, + {131,7,59},{0,8,120},{0,8,56},{0,9,209},{129,7,17},{0,8,104}, + {0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},{0,9,241}, + {128,7,4},{0,8,84},{0,8,20},{133,8,227},{131,7,43},{0,8,116}, + {0,8,52},{0,9,201},{129,7,13},{0,8,100},{0,8,36},{0,9,169}, + {0,8,4},{0,8,132},{0,8,68},{0,9,233},{128,7,8},{0,8,92}, + {0,8,28},{0,9,153},{132,7,83},{0,8,124},{0,8,60},{0,9,217}, + {130,7,23},{0,8,108},{0,8,44},{0,9,185},{0,8,12},{0,8,140}, + {0,8,76},{0,9,249},{128,7,3},{0,8,82},{0,8,18},{133,8,163}, + {131,7,35},{0,8,114},{0,8,50},{0,9,197},{129,7,11},{0,8,98}, + {0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {128,7,7},{0,8,90},{0,8,26},{0,9,149},{132,7,67},{0,8,122}, + {0,8,58},{0,9,213},{130,7,19},{0,8,106},{0,8,42},{0,9,181}, + {0,8,10},{0,8,138},{0,8,74},{0,9,245},{128,7,5},{0,8,86}, + {0,8,22},{65,8,0},{131,7,51},{0,8,118},{0,8,54},{0,9,205}, + {129,7,15},{0,8,102},{0,8,38},{0,9,173},{0,8,6},{0,8,134}, + {0,8,70},{0,9,237},{128,7,9},{0,8,94},{0,8,30},{0,9,157}, + {132,7,99},{0,8,126},{0,8,62},{0,9,221},{130,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253}, + {96,7,0},{0,8,81},{0,8,17},{133,8,131},{130,7,31},{0,8,113}, + {0,8,49},{0,9,195},{128,7,10},{0,8,97},{0,8,33},{0,9,163}, + {0,8,1},{0,8,129},{0,8,65},{0,9,227},{128,7,6},{0,8,89}, + {0,8,25},{0,9,147},{131,7,59},{0,8,121},{0,8,57},{0,9,211}, + {129,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},{0,8,137}, + {0,8,73},{0,9,243},{128,7,4},{0,8,85},{0,8,21},{144,8,3}, + {131,7,43},{0,8,117},{0,8,53},{0,9,203},{129,7,13},{0,8,101}, + {0,8,37},{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235}, + {128,7,8},{0,8,93},{0,8,29},{0,9,155},{132,7,83},{0,8,125}, + {0,8,61},{0,9,219},{130,7,23},{0,8,109},{0,8,45},{0,9,187}, + {0,8,13},{0,8,141},{0,8,77},{0,9,251},{128,7,3},{0,8,83}, + {0,8,19},{133,8,195},{131,7,35},{0,8,115},{0,8,51},{0,9,199}, + {129,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{128,7,7},{0,8,91},{0,8,27},{0,9,151}, + {132,7,67},{0,8,123},{0,8,59},{0,9,215},{130,7,19},{0,8,107}, + {0,8,43},{0,9,183},{0,8,11},{0,8,139},{0,8,75},{0,9,247}, + {128,7,5},{0,8,87},{0,8,23},{77,8,0},{131,7,51},{0,8,119}, + {0,8,55},{0,9,207},{129,7,15},{0,8,103},{0,8,39},{0,9,175}, + {0,8,7},{0,8,135},{0,8,71},{0,9,239},{128,7,9},{0,8,95}, + {0,8,31},{0,9,159},{132,7,99},{0,8,127},{0,8,63},{0,9,223}, + {130,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143}, + {0,8,79},{0,9,255} + }; + + static const code distfix[32] = { + {128,5,1},{135,5,257},{131,5,17},{139,5,4097},{129,5,5}, + {137,5,1025},{133,5,65},{141,5,16385},{128,5,3},{136,5,513}, + {132,5,33},{140,5,8193},{130,5,9},{138,5,2049},{134,5,129}, + {142,5,32769},{128,5,2},{135,5,385},{131,5,25},{139,5,6145}, + {129,5,7},{137,5,1537},{133,5,97},{141,5,24577},{128,5,4}, + {136,5,769},{132,5,49},{140,5,12289},{130,5,13},{138,5,3073}, + {134,5,193},{142,5,49153} + }; diff --git a/deps/zlib-1.2.10/contrib/infback9/inflate9.h b/deps/zlib-1.2.10/contrib/infback9/inflate9.h new file mode 100644 index 0000000..ee9a793 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/infback9/inflate9.h @@ -0,0 +1,47 @@ +/* inflate9.h -- internal inflate state definition + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Possible inflate modes between inflate() calls */ +typedef enum { + TYPE, /* i: waiting for type bits, including last-flag bit */ + STORED, /* i: waiting for stored size (length and complement) */ + TABLE, /* i: waiting for dynamic block table lengths */ + LEN, /* i: waiting for length/lit code */ + DONE, /* finished check, done -- remain here until reset */ + BAD /* got a data error -- remain here until reset */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD mode -- not shown for clarity) + + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or DONE + STORED -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LEN or TYPE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + /* sliding window */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/deps/zlib-1.2.10/contrib/infback9/inftree9.c b/deps/zlib-1.2.10/contrib/infback9/inftree9.c new file mode 100644 index 0000000..ea56047 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/infback9/inftree9.c @@ -0,0 +1,324 @@ +/* inftree9.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftree9.h" + +#define MAXBITS 15 + +const char inflate9_copyright[] = + " inflate9 1.2.10 Copyright 1995-2017 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table9(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, + 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, + 131, 163, 195, 227, 3, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, + 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, + 133, 133, 133, 133, 144, 192, 202}; + static const unsigned short dbase[32] = { /* Distance codes 0..31 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, + 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, + 4097, 6145, 8193, 12289, 16385, 24577, 32769, 49153}; + static const unsigned short dext[32] = { /* Distance codes 0..31 extra */ + 128, 128, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, + 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138, + 139, 139, 140, 140, 141, 141, 142, 142}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) return -1; /* no codes! */ + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftree9.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += 1U << curr; + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + curr = root; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/deps/zlib-1.2.10/contrib/infback9/inftree9.h b/deps/zlib-1.2.10/contrib/infback9/inftree9.h new file mode 100644 index 0000000..5ab21f0 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/infback9/inftree9.h @@ -0,0 +1,61 @@ +/* inftree9.h -- header to use inftree9.c + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 100eeeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1446, which is the sum of 852 for literal/length codes and 594 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 32 6 15" for distance codes returns 594. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in infback9.c. If the root table size is changed, + then these maximum sizes would be need to be recalculated and updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 594 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table9() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table9 OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/deps/zlib-1.2.10/contrib/inflate86/inffas86.c b/deps/zlib-1.2.10/contrib/inflate86/inffas86.c new file mode 100644 index 0000000..7292f67 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/inflate86/inffas86.c @@ -0,0 +1,1157 @@ +/* inffas86.c is a hand tuned assembler version of + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ unsigned long hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } ar; + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((unsigned long)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) + __asm__ __volatile__ ( +" leaq %0, %%rax\n" +" movq %%rbp, 8(%%rax)\n" /* save regs rbp and rsp */ +" movq %%rsp, (%%rax)\n" +" movq %%rax, %%rsp\n" /* make rsp point to &ar */ +" movq 16(%%rsp), %%rsi\n" /* rsi = in */ +" movq 32(%%rsp), %%rdi\n" /* rdi = out */ +" movq 24(%%rsp), %%r9\n" /* r9 = last */ +" movq 48(%%rsp), %%r10\n" /* r10 = end */ +" movq 64(%%rsp), %%rbp\n" /* rbp = lcode */ +" movq 72(%%rsp), %%r11\n" /* r11 = dcode */ +" movq 80(%%rsp), %%rdx\n" /* rdx = hold */ +" movl 88(%%rsp), %%ebx\n" /* ebx = bits */ +" movl 100(%%rsp), %%r12d\n" /* r12d = lmask */ +" movl 104(%%rsp), %%r13d\n" /* r13d = dmask */ + /* r14d = len */ + /* r15d = dist */ +" cld\n" +" cmpq %%rdi, %%r10\n" +" je .L_one_time\n" /* if only one decode left */ +" cmpq %%rsi, %%r9\n" +" je .L_one_time\n" +" jmp .L_do_loop\n" + +".L_one_time:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code_one_time\n" + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ +" jmp .L_get_length_code_one_time\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpq %%rdi, %%r10\n" +" jbe .L_break_loop\n" +" cmpq %%rsi, %%r9\n" +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_length_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" movq %%r12, %%r8\n" /* r8 = lmask */ +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" + +".L_get_length_code_one_time:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%r14d\n" /* len = this */ +" shrl $16, %%r14d\n" /* len = this.val */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r14d\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" movq %%r13, %%r8\n" /* r8 = dmask */ +" cmpb $32, %%bl\n" +" ja .L_get_distance_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_distance_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%r11,%%r8,4), %%eax\n" /* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%r15d\n" /* dist = this */ +" shrl $16, %%r15d\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r15d\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movq %%rsi, %%r8\n" /* save in so from can use it's reg */ +" movq %%rdi, %%rax\n" +" subq 40(%%rsp), %%rax\n" /* nbytes = out - beg */ + +" cmpl %%r15d, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%rsi), %%al\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%r15d\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpq %%rdi, 40(%%rsp)\n" /* if out == beg, outside window */ +" je .L_check_window\n" + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movb -1(%%rdi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +".L_set_two:\n" +" rep stosw\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r14d, %%eax\n" /* eax += len */ +" movl (%%rbp,%%rax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r15d, %%eax\n" /* eax += dist */ +" movl (%%r11,%%rax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" /* ecx = nbytes */ +" movl 92(%%rsp), %%eax\n" /* eax = wsize, prepare for dist cmp */ +" negl %%ecx\n" /* nbytes = -nbytes */ + +" cmpl %%r15d, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%r15d, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 96(%%rsp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" addq %%rax, %%rsi\n" /* from += wsize - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%r14d\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = &out[ -dist ] */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 96(%%rsp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" movl 92(%%rsp), %%esi\n" /* from = wsize */ +" addq 56(%%rsp), %%rsi\n" /* from += window */ +" addq %%rax, %%rsi\n" /* from += write */ +" subq %%rcx, %%rsi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" movl 96(%%rsp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" movq 56(%%rsp), %%rsi\n" /* rsi = window */ +" addq %%rax, %%rsi\n" +" subq %%rcx, %%rsi\n" /* from += write - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" /* ecx = len */ +" rep movsb\n" + +" movq %%r8, %%rsi\n" /* move in back to %esi, toss from */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl $4, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 116(%%rsp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movq %%rsi, 16(%%rsp)\n" /* in */ +" movq %%rdi, 32(%%rsp)\n" /* out */ +" movl %%ebx, 88(%%rsp)\n" /* bits */ +" movq %%rdx, 80(%%rsp)\n" /* hold */ +" movq (%%rsp), %%rax\n" /* restore rbp and rsp */ +" movq 8(%%rsp), %%rbp\n" +" movq %%rax, %%rsp\n" + : + : "m" (ar) + : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" + ); +#elif ( defined( __GNUC__ ) || defined( __ICC ) ) && defined( __i386 ) + __asm__ __volatile__ ( +" leal %0, %%eax\n" +" movl %%esp, (%%eax)\n" /* save esp, ebp */ +" movl %%ebp, 4(%%eax)\n" +" movl %%eax, %%esp\n" +" movl 8(%%esp), %%esi\n" /* esi = in */ +" movl 16(%%esp), %%edi\n" /* edi = out */ +" movl 40(%%esp), %%edx\n" /* edx = hold */ +" movl 44(%%esp), %%ebx\n" /* ebx = bits */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ + +" cld\n" +" jmp .L_do_loop\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpl %%edi, 24(%%esp)\n" /* out < end */ +" jbe .L_break_loop\n" +" cmpl %%esi, 12(%%esp)\n" /* in < last */ +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" cmpb $15, %%bl\n" +" ja .L_get_length_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_length_code:\n" +" movl 56(%%esp), %%eax\n" /* eax = lmask */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%ecx\n" /* len = this */ +" shrl $16, %%ecx\n" /* len = this.val */ +" movl %%ecx, 64(%%esp)\n" /* save len */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_len\n" /* if (op <= bits) */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, 64(%%esp)\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" cmpb $15, %%bl\n" +" ja .L_get_distance_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_distance_code:\n" +" movl 60(%%esp), %%eax\n" /* eax = dmask */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%ebp\n" /* dist = this */ +" shrl $16, %%ebp\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movl %%esi, 8(%%esp)\n" /* save in so from can use it's reg */ +" movl %%edi, %%eax\n" +" subl 20(%%esp), %%eax\n" /* nbytes = out - beg */ + +" cmpl %%ebp, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%esi), %%al\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%ebp\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpl %%edi, 20(%%esp)\n" +" je .L_check_window\n" /* out == beg, if outside window */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movb -1(%%edi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +".L_set_two:\n" +" rep stosw\n" +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl 64(%%esp), %%eax\n" /* eax += len */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%ebp, %%eax\n" /* eax += dist */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" +" movl 48(%%esp), %%eax\n" /* eax = wsize */ +" negl %%ecx\n" /* nbytes = -nbytes */ +" movl 28(%%esp), %%esi\n" /* from = window */ + +" cmpl %%ebp, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 52(%%esp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" subl %%ecx, %%eax\n" +" addl %%eax, %%esi\n" /* from += wsize - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 52(%%esp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" addl 48(%%esp), %%esi\n" /* from += wsize */ +" addl %%eax, %%esi\n" /* from += write */ +" subl %%ecx, %%esi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl 28(%%esp), %%esi\n" /* from = window */ +" movl 52(%%esp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" addl %%eax, %%esi\n" +" subl %%ecx, %%esi\n" /* from += write - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" +" rep movsb\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl 8(%%esp), %%esi\n" +" movl $4, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 72(%%esp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movl %%esi, 8(%%esp)\n" /* save in */ +" movl %%edi, 16(%%esp)\n" /* save out */ +" movl %%ebx, 44(%%esp)\n" /* save bits */ +" movl %%edx, 40(%%esp)\n" /* save hold */ +" movl 4(%%esp), %%ebp\n" /* restore esp, ebp */ +" movl (%%esp), %%esp\n" + : + : "m" (ar) + : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" + ); +#elif defined( _MSC_VER ) && ! defined( _M_AMD64 ) + __asm { + lea eax, ar + mov [eax], esp /* save esp, ebp */ + mov [eax+4], ebp + mov esp, eax + mov esi, [esp+8] /* esi = in */ + mov edi, [esp+16] /* edi = out */ + mov edx, [esp+40] /* edx = hold */ + mov ebx, [esp+44] /* ebx = bits */ + mov ebp, [esp+32] /* ebp = lcode */ + + cld + jmp L_do_loop + +ALIGN 4 +L_while_test: + cmp [esp+24], edi + jbe L_break_loop + cmp [esp+12], esi + jbe L_break_loop + +L_do_loop: + cmp bl, 15 + ja L_get_length_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_length_code: + mov eax, [esp+56] /* eax = lmask */ + and eax, edx /* eax &= hold */ + mov eax, [ebp+eax*4] /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah /* cl = this.bits */ + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base /* if (op != 0) 45.7% */ + + shr eax, 16 /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov ecx, eax /* len = this */ + shr ecx, 16 /* len = this.val */ + mov [esp+64], ecx /* save len */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + and cl, 15 /* op &= 15 */ + jz L_decode_distance /* if (!op) */ + cmp bl, cl + jae L_add_bits_to_len /* if (op <= bits) */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + shr edx, cl + add [esp+64], eax /* len += hold & mask[op] */ + +L_decode_distance: + cmp bl, 15 + ja L_get_distance_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_distance_code: + mov eax, [esp+60] /* eax = dmask */ + mov ecx, [esp+36] /* ecx = dcode */ + and eax, edx /* eax &= hold */ + mov eax, [ecx+eax*4]/* eax = dcode[hold & dmask] */ + +L_dodist: + mov ebp, eax /* dist = this */ + shr ebp, 16 /* dist = this.val */ + mov cl, ah + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + mov cl, al /* cl = this.op */ + + test al, 16 /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 /* op &= 15 */ + jz L_check_dist_one + cmp bl, cl + jae L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax /* (1 << op) - 1 */ + and eax, edx /* eax &= hold */ + shr edx, cl + add ebp, eax /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov [esp+8], esi /* save in so from can use it's reg */ + mov eax, edi + sub eax, [esp+20] /* nbytes = out - beg */ + + cmp eax, ebp + jb L_clip_window /* if (dist > nbytes) 4.2% */ + + mov ecx, [esp+64] /* ecx = len */ + mov esi, edi + sub esi, ebp /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two + + rep movsw + mov al, [esi] + mov [edi], al + inc edi + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_copy_two: + rep movsw + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp ebp, 1 /* if dist 1, is a memset */ + jne L_check_window + cmp [esp+20], edi + je L_check_window /* out == beg, if outside window */ + + mov ecx, [esp+64] /* ecx = len */ + mov al, [edi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [edi], al /* memset out with from[-1] */ + inc edi + +L_set_two: + rep stosw + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, [esp+64] /* eax += len */ + mov eax, [ebp+eax*4] /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, ebp /* eax += dist */ + mov ecx, [esp+36] /* ecx = dcode */ + mov eax, [ecx+eax*4] /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax + mov eax, [esp+48] /* eax = wsize */ + neg ecx /* nbytes = -nbytes */ + mov esi, [esp+28] /* from = window */ + + cmp eax, ebp + jb L_invalid_distance_too_far /* if (dist > wsize) */ + + add ecx, ebp /* nbytes = dist - nbytes */ + cmp dword ptr [esp+52], 0 + jne L_wrap_around_window /* if (write != 0) */ + + sub eax, ecx + add esi, eax /* from += wsize - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [esp+52] /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window /* if (write >= nbytes) */ + + add esi, [esp+48] /* from += wsize */ + add esi, eax /* from += write */ + sub esi, ecx /* from -= nbytes */ + sub ecx, eax /* nbytes -= write */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, [esp+28] /* from = window */ + mov ecx, [esp+52] /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + add esi, eax + sub esi, ecx /* from += write - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_do_copy: + mov ecx, eax + rep movsb + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [esp+72], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [esp+72], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [esp+72], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov esi, [esp+4] + mov dword ptr [esp+72], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [esp+72], 0 + +L_break_loop_with_status: +/* put in, out, bits, and hold back into ar and pop esp */ + mov [esp+8], esi /* save in */ + mov [esp+16], edi /* save out */ + mov [esp+44], ebx /* save bits */ + mov [esp+40], edx /* save hold */ + mov ebp, [esp+4] /* restore esp, ebp */ + mov esp, [esp] + } +#else +#error "x86 architecture not defined" +#endif + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = ar.hold; + state->bits = ar.bits; + return; +} + diff --git a/deps/zlib-1.2.10/contrib/inflate86/inffast.S b/deps/zlib-1.2.10/contrib/inflate86/inffast.S new file mode 100644 index 0000000..2245a29 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/inflate86/inffast.S @@ -0,0 +1,1368 @@ +/* + * inffast.S is a hand tuned assembler version of: + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * This version (Jan-23-2003) of inflate_fast was coded and tested under + * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that + * machine, I found that gzip style archives decompressed about 20% faster than + * the gcc-3.2 -O3 -fomit-frame-pointer compiled version. Your results will + * depend on how large of a buffer is used for z_stream.next_in & next_out + * (8K-32K worked best for my 256K cpu cache) and how much overhead there is in + * stream processing I/O and crc32/addler32. In my case, this routine used + * 70% of the cpu time and crc32 used 20%. + * + * I am confident that this version will work in the general case, but I have + * not tested a wide variety of datasets or a wide variety of platforms. + * + * Jan-24-2003 -- Added -DUSE_MMX define for slightly faster inflating. + * It should be a runtime flag instead of compile time flag... + * + * Jan-26-2003 -- Added runtime check for MMX support with cpuid instruction. + * With -DUSE_MMX, only MMX code is compiled. With -DNO_MMX, only non-MMX code + * is compiled. Without either option, runtime detection is enabled. Runtime + * detection should work on all modern cpus and the recomended algorithm (flip + * ID bit on eflags and then use the cpuid instruction) is used in many + * multimedia applications. Tested under win2k with gcc-2.95 and gas-2.12 + * distributed with cygwin3. Compiling with gcc-2.95 -c inffast.S -o + * inffast.obj generates a COFF object which can then be linked with MSVC++ + * compiled code. Tested under FreeBSD 4.7 with gcc-2.95. + * + * Jan-28-2003 -- Tested Athlon XP... MMX mode is slower than no MMX (and + * slower than compiler generated code). Adjusted cpuid check to use the MMX + * code only for Pentiums < P4 until I have more data on the P4. Speed + * improvment is only about 15% on the Athlon when compared with code generated + * with MSVC++. Not sure yet, but I think the P4 will also be slower using the + * MMX mode because many of it's x86 ALU instructions execute in .5 cycles and + * have less latency than MMX ops. Added code to buffer the last 11 bytes of + * the input stream since the MMX code grabs bits in chunks of 32, which + * differs from the inffast.c algorithm. I don't think there would have been + * read overruns where a page boundary was crossed (a segfault), but there + * could have been overruns when next_in ends on unaligned memory (unintialized + * memory read). + * + * Mar-13-2003 -- P4 MMX is slightly slower than P4 NO_MMX. I created a C + * version of the non-MMX code so that it doesn't depend on zstrm and zstate + * structure offsets which are hard coded in this file. This was last tested + * with zlib-1.2.0 which is currently in beta testing, newer versions of this + * and inffas86.c can be found at http://www.eetbeetee.com/zlib/ and + * http://www.charm.net/~christop/zlib/ + */ + + +/* + * if you have underscore linking problems (_inflate_fast undefined), try + * using -DGAS_COFF + */ +#if ! defined( GAS_COFF ) && ! defined( GAS_ELF ) + +#if defined( WIN32 ) || defined( __CYGWIN__ ) +#define GAS_COFF /* windows object format */ +#else +#define GAS_ELF +#endif + +#endif /* ! GAS_COFF && ! GAS_ELF */ + + +#if defined( GAS_COFF ) + +/* coff externals have underscores */ +#define inflate_fast _inflate_fast +#define inflate_fast_use_mmx _inflate_fast_use_mmx + +#endif /* GAS_COFF */ + + +.file "inffast.S" + +.globl inflate_fast + +.text +.align 4,0 +.L_invalid_literal_length_code_msg: +.string "invalid literal/length code" + +.align 4,0 +.L_invalid_distance_code_msg: +.string "invalid distance code" + +.align 4,0 +.L_invalid_distance_too_far_msg: +.string "invalid distance too far back" + +#if ! defined( NO_MMX ) +.align 4,0 +.L_mask: /* mask[N] = ( 1 << N ) - 1 */ +.long 0 +.long 1 +.long 3 +.long 7 +.long 15 +.long 31 +.long 63 +.long 127 +.long 255 +.long 511 +.long 1023 +.long 2047 +.long 4095 +.long 8191 +.long 16383 +.long 32767 +.long 65535 +.long 131071 +.long 262143 +.long 524287 +.long 1048575 +.long 2097151 +.long 4194303 +.long 8388607 +.long 16777215 +.long 33554431 +.long 67108863 +.long 134217727 +.long 268435455 +.long 536870911 +.long 1073741823 +.long 2147483647 +.long 4294967295 +#endif /* NO_MMX */ + +.text + +/* + * struct z_stream offsets, in zlib.h + */ +#define next_in_strm 0 /* strm->next_in */ +#define avail_in_strm 4 /* strm->avail_in */ +#define next_out_strm 12 /* strm->next_out */ +#define avail_out_strm 16 /* strm->avail_out */ +#define msg_strm 24 /* strm->msg */ +#define state_strm 28 /* strm->state */ + +/* + * struct inflate_state offsets, in inflate.h + */ +#define mode_state 0 /* state->mode */ +#define wsize_state 32 /* state->wsize */ +#define write_state 40 /* state->write */ +#define window_state 44 /* state->window */ +#define hold_state 48 /* state->hold */ +#define bits_state 52 /* state->bits */ +#define lencode_state 68 /* state->lencode */ +#define distcode_state 72 /* state->distcode */ +#define lenbits_state 76 /* state->lenbits */ +#define distbits_state 80 /* state->distbits */ + +/* + * inflate_fast's activation record + */ +#define local_var_size 64 /* how much local space for vars */ +#define strm_sp 88 /* first arg: z_stream * (local_var_size + 24) */ +#define start_sp 92 /* second arg: unsigned int (local_var_size + 28) */ + +/* + * offsets for local vars on stack + */ +#define out 60 /* unsigned char* */ +#define window 56 /* unsigned char* */ +#define wsize 52 /* unsigned int */ +#define write 48 /* unsigned int */ +#define in 44 /* unsigned char* */ +#define beg 40 /* unsigned char* */ +#define buf 28 /* char[ 12 ] */ +#define len 24 /* unsigned int */ +#define last 20 /* unsigned char* */ +#define end 16 /* unsigned char* */ +#define dcode 12 /* code* */ +#define lcode 8 /* code* */ +#define dmask 4 /* unsigned int */ +#define lmask 0 /* unsigned int */ + +/* + * typedef enum inflate_mode consts, in inflate.h + */ +#define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */ +#define INFLATE_MODE_BAD 26 + + +#if ! defined( USE_MMX ) && ! defined( NO_MMX ) + +#define RUN_TIME_MMX + +#define CHECK_MMX 1 +#define DO_USE_MMX 2 +#define DONT_USE_MMX 3 + +.globl inflate_fast_use_mmx + +.data + +.align 4,0 +inflate_fast_use_mmx: /* integer flag for run time control 1=check,2=mmx,3=no */ +.long CHECK_MMX + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast_use_mmx,@object +.size inflate_fast_use_mmx,4 +#endif + +#endif /* RUN_TIME_MMX */ + +#if defined( GAS_COFF ) +/* coff info: scl 2 = extern, type 32 = function */ +.def inflate_fast; .scl 2; .type 32; .endef +#endif + +.text + +.align 32,0x90 +inflate_fast: + pushl %edi + pushl %esi + pushl %ebp + pushl %ebx + pushf /* save eflags (strm_sp, state_sp assumes this is 32 bits) */ + subl $local_var_size, %esp + cld + +#define strm_r %esi +#define state_r %edi + + movl strm_sp(%esp), strm_r + movl state_strm(strm_r), state_r + + /* in = strm->next_in; + * out = strm->next_out; + * last = in + strm->avail_in - 11; + * beg = out - (start - strm->avail_out); + * end = out + (strm->avail_out - 257); + */ + movl avail_in_strm(strm_r), %edx + movl next_in_strm(strm_r), %eax + + addl %eax, %edx /* avail_in += next_in */ + subl $11, %edx /* avail_in -= 11 */ + + movl %eax, in(%esp) + movl %edx, last(%esp) + + movl start_sp(%esp), %ebp + movl avail_out_strm(strm_r), %ecx + movl next_out_strm(strm_r), %ebx + + subl %ecx, %ebp /* start -= avail_out */ + negl %ebp /* start = -start */ + addl %ebx, %ebp /* start += next_out */ + + subl $257, %ecx /* avail_out -= 257 */ + addl %ebx, %ecx /* avail_out += out */ + + movl %ebx, out(%esp) + movl %ebp, beg(%esp) + movl %ecx, end(%esp) + + /* wsize = state->wsize; + * write = state->write; + * window = state->window; + * hold = state->hold; + * bits = state->bits; + * lcode = state->lencode; + * dcode = state->distcode; + * lmask = ( 1 << state->lenbits ) - 1; + * dmask = ( 1 << state->distbits ) - 1; + */ + + movl lencode_state(state_r), %eax + movl distcode_state(state_r), %ecx + + movl %eax, lcode(%esp) + movl %ecx, dcode(%esp) + + movl $1, %eax + movl lenbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, lmask(%esp) + + movl $1, %eax + movl distbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, dmask(%esp) + + movl wsize_state(state_r), %eax + movl write_state(state_r), %ecx + movl window_state(state_r), %edx + + movl %eax, wsize(%esp) + movl %ecx, write(%esp) + movl %edx, window(%esp) + + movl hold_state(state_r), %ebp + movl bits_state(state_r), %ebx + +#undef strm_r +#undef state_r + +#define in_r %esi +#define from_r %esi +#define out_r %edi + + movl in(%esp), in_r + movl last(%esp), %ecx + cmpl in_r, %ecx + ja .L_align_long /* if in < last */ + + addl $11, %ecx /* ecx = &in[ avail_in ] */ + subl in_r, %ecx /* ecx = avail_in */ + movl $12, %eax + subl %ecx, %eax /* eax = 12 - avail_in */ + leal buf(%esp), %edi + rep movsb /* memcpy( buf, in, avail_in ) */ + movl %eax, %ecx + xorl %eax, %eax + rep stosb /* memset( &buf[ avail_in ], 0, 12 - avail_in ) */ + leal buf(%esp), in_r /* in = buf */ + movl in_r, last(%esp) /* last = in, do just one iteration */ + jmp .L_is_aligned + + /* align in_r on long boundary */ +.L_align_long: + testl $3, in_r + jz .L_is_aligned + xorl %eax, %eax + movb (in_r), %al + incl in_r + movl %ebx, %ecx + addl $8, %ebx + shll %cl, %eax + orl %eax, %ebp + jmp .L_align_long + +.L_is_aligned: + movl out(%esp), out_r + +#if defined( NO_MMX ) + jmp .L_do_loop +#endif + +#if defined( USE_MMX ) + jmp .L_init_mmx +#endif + +/*** Runtime MMX check ***/ + +#if defined( RUN_TIME_MMX ) +.L_check_mmx: + cmpl $DO_USE_MMX, inflate_fast_use_mmx + je .L_init_mmx + ja .L_do_loop /* > 2 */ + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushf + movl (%esp), %eax /* copy eflags to eax */ + xorl $0x200000, (%esp) /* try toggling ID bit of eflags (bit 21) + * to see if cpu supports cpuid... + * ID bit method not supported by NexGen but + * bios may load a cpuid instruction and + * cpuid may be disabled on Cyrix 5-6x86 */ + popf + pushf + popl %edx /* copy new eflags to edx */ + xorl %eax, %edx /* test if ID bit is flipped */ + jz .L_dont_use_mmx /* not flipped if zero */ + xorl %eax, %eax + cpuid + cmpl $0x756e6547, %ebx /* check for GenuineIntel in ebx,ecx,edx */ + jne .L_dont_use_mmx + cmpl $0x6c65746e, %ecx + jne .L_dont_use_mmx + cmpl $0x49656e69, %edx + jne .L_dont_use_mmx + movl $1, %eax + cpuid /* get cpu features */ + shrl $8, %eax + andl $15, %eax + cmpl $6, %eax /* check for Pentium family, is 0xf for P4 */ + jne .L_dont_use_mmx + testl $0x800000, %edx /* test if MMX feature is set (bit 23) */ + jnz .L_use_mmx + jmp .L_dont_use_mmx +.L_use_mmx: + movl $DO_USE_MMX, inflate_fast_use_mmx + jmp .L_check_mmx_pop +.L_dont_use_mmx: + movl $DONT_USE_MMX, inflate_fast_use_mmx +.L_check_mmx_pop: + popl %edx + popl %ecx + popl %ebx + popl %eax + jmp .L_check_mmx +#endif + + +/*** Non-MMX code ***/ + +#if defined ( NO_MMX ) || defined( RUN_TIME_MMX ) + +#define hold_r %ebp +#define bits_r %bl +#define bitslong_r %ebx + +.align 32,0x90 +.L_while_test: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * do { + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = lcode[hold & lmask] + */ + cmpb $15, bits_r + ja .L_get_length_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_length_code: + movl lmask(%esp), %edx /* edx = lmask */ + movl lcode(%esp), %ecx /* ecx = lcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * dolen: + * bits -= this.bits; + * hold >>= this.bits + */ + movb %ah, %cl /* cl = this.bits */ + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* check if op is a literal + * if (op == 0) { + * PUP(out) = this.val; + * } + */ + testb %al, %al + jnz .L_test_for_length_base /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test + +.L_test_for_length_base: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len + * + * else if (op & 16) { + * len = this.val + * op &= 15 + * if (op) { + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * len += hold & mask[op]; + * bits -= op; + * hold >>= op; + * } + */ +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + movb %al, %cl + + testb $16, %al + jz .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + andb $15, %cl /* op &= 15 */ + jz .L_save_len /* if (!op) */ + cmpb %cl, bits_r + jae .L_add_bits_to_len /* if (op <= bits) */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_len: + movl $1, %eax + shll %cl, %eax + decl %eax + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, len_r /* len += hold & mask[op] */ + +.L_save_len: + movl len_r, len(%esp) /* save len */ +#undef len_r + +.L_decode_distance: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = dcode[hold & dmask]; + * dodist: + * bits -= this.bits; + * hold >>= this.bits; + * op = this.op; + */ + + cmpb $15, bits_r + ja .L_get_distance_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_distance_code: + movl dmask(%esp), %edx /* edx = dmask */ + movl dcode(%esp), %ecx /* ecx = dcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = dcode[hold & dmask] */ + +#define dist_r %edx +.L_dodist: + movl %eax, dist_r /* dist = this */ + shrl $16, dist_r /* dist = this.val */ + movb %ah, %cl + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* if (op & 16) { + * dist = this.val + * op &= 15 + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * dist += hold & mask[op]; + * bits -= op; + * hold >>= op; + */ + movb %al, %cl /* cl = this.op */ + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist + andb $15, %cl /* op &= 15 */ + jz .L_check_dist_one + cmpb %cl, bits_r + jae .L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_dist: + movl $1, %eax + shll %cl, %eax + decl %eax /* (1 << op) - 1 */ + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, dist_r /* dist += hold & ((1 << op) - 1) */ + jmp .L_check_window + +.L_check_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * nbytes = out - beg; + * if (dist <= nbytes) { + * from = out - dist; + * do { + * PUP(out) = PUP(from); + * } while (--len > 0) { + * } + */ + + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window /* if (dist > nbytes) 4.2% */ + + movl len(%esp), %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +.align 16,0x90 +.L_check_dist_one: + cmpl $1, dist_r + jne .L_check_window + cmpl out_r, beg(%esp) + je .L_check_window + + decl out_r + movl len(%esp), %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + jmp .L_while_test + +.align 16,0x90 +.L_test_for_second_level_length: + /* else if ((op & 64) == 0) { + * this = lcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl lcode(%esp), %edx /* edx = lcode */ + movl (%edx,%eax,4), %eax /* eax = lcode[val + (hold&mask[op])] */ + jmp .L_dolen + +.align 16,0x90 +.L_test_for_second_level_dist: + /* else if ((op & 64) == 0) { + * this = dcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl dcode(%esp), %edx /* edx = dcode */ + movl (%edx,%eax,4), %eax /* eax = dcode[val + (hold&mask[op])] */ + jmp .L_dodist + +.align 16,0x90 +.L_clip_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * else { + * if (dist > wsize) { + * invalid distance + * } + * from = window; + * nbytes = dist - nbytes; + * if (write == 0) { + * from += wsize - nbytes; + */ +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = len + * + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define len_r %eax + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_wrap_around_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else if (write < nbytes) { + * from += wsize + write - nbytes; + * nbytes -= write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = window; + * nbytes = write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while(--nbytes); + * from = out - dist; + * } + * } + * } + */ +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_contiguous_in_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else { + * from += write - nbytes; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1: + /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out + * %eax = len + * + * while (len > 0) { + * PUP(out) = PUP(from); + * len--; + * } + * } + * } while (in < last && out < end); + */ +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +#undef len_r +#undef dist_r + +#endif /* NO_MMX || RUN_TIME_MMX */ + + +/*** MMX code ***/ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +.align 32,0x90 +.L_init_mmx: + emms + +#undef bits_r +#undef bitslong_r +#define bitslong_r %ebp +#define hold_mm %mm0 + movd %ebp, hold_mm + movl %ebx, bitslong_r + +#define used_mm %mm1 +#define dmask2_mm %mm2 +#define lmask2_mm %mm3 +#define lmask_mm %mm4 +#define dmask_mm %mm5 +#define tmp_mm %mm6 + + movd lmask(%esp), lmask_mm + movq lmask_mm, lmask2_mm + movd dmask(%esp), dmask_mm + movq dmask_mm, dmask2_mm + pxor used_mm, used_mm + movl lcode(%esp), %ebx /* ebx = lcode */ + jmp .L_do_loop_mmx + +.align 32,0x90 +.L_while_test_mmx: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_length_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_length_code_mmx: + pand hold_mm, lmask_mm + movd lmask_mm, %eax + movq lmask2_mm, lmask_mm + movl (%ebx,%eax,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen_mmx: + movzbl %ah, %ecx /* ecx = this.bits */ + movd %ecx, used_mm + subl %ecx, bitslong_r /* bits -= this.bits */ + + testb %al, %al + jnz .L_test_for_length_base_mmx /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test_mmx + +.L_test_for_length_base_mmx: +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + + testb $16, %al + jz .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */ + andl $15, %eax /* op &= 15 */ + jz .L_decode_distance_mmx /* if (!op) */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm + movd hold_mm, %ecx + subl %eax, bitslong_r + andl .L_mask(,%eax,4), %ecx + addl %ecx, len_r /* len += hold & mask[op] */ + +.L_decode_distance_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_dist_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_dist_code_mmx: + movl dcode(%esp), %ebx /* ebx = dcode */ + pand hold_mm, dmask_mm + movd dmask_mm, %eax + movq dmask2_mm, dmask_mm + movl (%ebx,%eax,4), %eax /* eax = dcode[hold & lmask] */ + +.L_dodist_mmx: +#define dist_r %ebx + movzbl %ah, %ecx /* ecx = this.bits */ + movl %eax, dist_r + shrl $16, dist_r /* dist = this.val */ + subl %ecx, bitslong_r /* bits -= this.bits */ + movd %ecx, used_mm + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist_mmx + andl $15, %eax /* op &= 15 */ + jz .L_check_dist_one_mmx + +.L_add_bits_to_dist_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm /* save bit length of current op */ + movd hold_mm, %ecx /* get the next bits on input stream */ + subl %eax, bitslong_r /* bits -= op bits */ + andl .L_mask(,%eax,4), %ecx /* ecx = hold & mask[op] */ + addl %ecx, dist_r /* dist += hold & mask[op] */ + +.L_check_window_mmx: + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window_mmx /* if (dist > nbytes) 4.2% */ + + movl len_r, %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_check_dist_one_mmx: + cmpl $1, dist_r + jne .L_check_window_mmx + cmpl out_r, beg(%esp) + je .L_check_window_mmx + + decl out_r + movl len_r, %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_test_for_second_level_length_mmx: + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + addl len_r, %ecx + movl (%ebx,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dolen_mmx + +.align 16,0x90 +.L_test_for_second_level_dist_mmx: + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + movl dcode(%esp), %eax /* ecx = dcode */ + addl dist_r, %ecx + movl (%eax,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dodist_mmx + +.align 16,0x90 +.L_clip_window_mmx: +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window_mmx /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_wrap_around_window_mmx: +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window_mmx /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_contiguous_in_window_mmx: +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1_mmx: +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +#undef hold_r +#undef bitslong_r + +#endif /* USE_MMX || RUN_TIME_MMX */ + + +/*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/ + +.L_invalid_distance_code: + /* else { + * strm->msg = "invalid distance code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_distance_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_test_for_end_of_block: + /* else if (op & 32) { + * state->mode = TYPE; + * break; + * } + */ + testb $32, %al + jz .L_invalid_literal_length_code /* if ((op & 32) == 0) */ + + movl $0, %ecx + movl $INFLATE_MODE_TYPE, %edx + jmp .L_update_stream_state + +.L_invalid_literal_length_code: + /* else { + * strm->msg = "invalid literal/length code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_literal_length_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_invalid_distance_too_far: + /* strm->msg = "invalid distance too far back"; + * state->mode = BAD; + */ + movl in(%esp), in_r /* from_r has in's reg, put in back */ + movl $.L_invalid_distance_too_far_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_update_stream_state: + /* set strm->msg = %ecx, strm->state->mode = %edx */ + movl strm_sp(%esp), %eax + testl %ecx, %ecx /* if (msg != NULL) */ + jz .L_skip_msg + movl %ecx, msg_strm(%eax) /* strm->msg = msg */ +.L_skip_msg: + movl state_strm(%eax), %eax /* state = strm->state */ + movl %edx, mode_state(%eax) /* state->mode = edx (BAD | TYPE) */ + jmp .L_break_loop + +.align 32,0x90 +.L_break_loop: + +/* + * Regs: + * + * bits = %ebp when mmx, and in %ebx when non-mmx + * hold = %hold_mm when mmx, and in %ebp when non-mmx + * in = %esi + * out = %edi + */ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_next_in + +#endif /* RUN_TIME_MMX */ + + movl %ebp, %ebx + +.L_update_next_in: + +#endif + +#define strm_r %eax +#define state_r %edx + + /* len = bits >> 3; + * in -= len; + * bits -= len << 3; + * hold &= (1U << bits) - 1; + * state->hold = hold; + * state->bits = bits; + * strm->next_in = in; + * strm->next_out = out; + */ + movl strm_sp(%esp), strm_r + movl %ebx, %ecx + movl state_strm(strm_r), state_r + shrl $3, %ecx + subl %ecx, in_r + shll $3, %ecx + subl %ecx, %ebx + movl out_r, next_out_strm(strm_r) + movl %ebx, bits_state(state_r) + movl %ebx, %ecx + + leal buf(%esp), %ebx + cmpl %ebx, last(%esp) + jne .L_buf_not_used /* if buf != last */ + + subl %ebx, in_r /* in -= buf */ + movl next_in_strm(strm_r), %ebx + movl %ebx, last(%esp) /* last = strm->next_in */ + addl %ebx, in_r /* in += strm->next_in */ + movl avail_in_strm(strm_r), %ebx + subl $11, %ebx + addl %ebx, last(%esp) /* last = &strm->next_in[ avail_in - 11 ] */ + +.L_buf_not_used: + movl in_r, next_in_strm(strm_r) + + movl $1, %ebx + shll %cl, %ebx + decl %ebx + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_hold + +#endif /* RUN_TIME_MMX */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ebp + + emms + +.L_update_hold: + +#endif /* USE_MMX || RUN_TIME_MMX */ + + andl %ebx, %ebp + movl %ebp, hold_state(state_r) + +#define last_r %ebx + + /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */ + movl last(%esp), last_r + cmpl in_r, last_r + jbe .L_last_is_smaller /* if (in >= last) */ + + subl in_r, last_r /* last -= in */ + addl $11, last_r /* last += 11 */ + movl last_r, avail_in_strm(strm_r) + jmp .L_fixup_out +.L_last_is_smaller: + subl last_r, in_r /* in -= last */ + negl in_r /* in = -in */ + addl $11, in_r /* in += 11 */ + movl in_r, avail_in_strm(strm_r) + +#undef last_r +#define end_r %ebx + +.L_fixup_out: + /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/ + movl end(%esp), end_r + cmpl out_r, end_r + jbe .L_end_is_smaller /* if (out >= end) */ + + subl out_r, end_r /* end -= out */ + addl $257, end_r /* end += 257 */ + movl end_r, avail_out_strm(strm_r) + jmp .L_done +.L_end_is_smaller: + subl end_r, out_r /* out -= end */ + negl out_r /* out = -out */ + addl $257, out_r /* out += 257 */ + movl out_r, avail_out_strm(strm_r) + +#undef end_r +#undef strm_r +#undef state_r + +.L_done: + addl $local_var_size, %esp + popf + popl %ebx + popl %ebp + popl %esi + popl %edi + ret + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast,@function +.size inflate_fast,.-inflate_fast +#endif diff --git a/deps/zlib-1.2.10/contrib/iostream/test.cpp b/deps/zlib-1.2.10/contrib/iostream/test.cpp new file mode 100644 index 0000000..7d265b3 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream/test.cpp @@ -0,0 +1,24 @@ + +#include "zfstream.h" + +int main() { + + // Construct a stream object with this filebuffer. Anything sent + // to this stream will go to standard out. + gzofstream os( 1, ios::out ); + + // This text is getting compressed and sent to stdout. + // To prove this, run 'test | zcat'. + os << "Hello, Mommy" << endl; + + os << setcompressionlevel( Z_NO_COMPRESSION ); + os << "hello, hello, hi, ho!" << endl; + + setcompressionlevel( os, Z_DEFAULT_COMPRESSION ) + << "I'm compressing again" << endl; + + os.close(); + + return 0; + +} diff --git a/deps/zlib-1.2.10/contrib/iostream/zfstream.cpp b/deps/zlib-1.2.10/contrib/iostream/zfstream.cpp new file mode 100644 index 0000000..d0cd85f --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream/zfstream.cpp @@ -0,0 +1,329 @@ + +#include "zfstream.h" + +gzfilebuf::gzfilebuf() : + file(NULL), + mode(0), + own_file_descriptor(0) +{ } + +gzfilebuf::~gzfilebuf() { + + sync(); + if ( own_file_descriptor ) + close(); + +} + +gzfilebuf *gzfilebuf::open( const char *name, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzopen(name, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 1; + + return this; + +} + +gzfilebuf *gzfilebuf::attach( int file_descriptor, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzdopen(file_descriptor, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 0; + + return this; + +} + +gzfilebuf *gzfilebuf::close() { + + if ( is_open() ) { + + sync(); + gzclose( file ); + file = NULL; + + } + + return this; + +} + +int gzfilebuf::setcompressionlevel( int comp_level ) { + + return gzsetparams(file, comp_level, -2); + +} + +int gzfilebuf::setcompressionstrategy( int comp_strategy ) { + + return gzsetparams(file, -2, comp_strategy); + +} + + +streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) { + + return streampos(EOF); + +} + +int gzfilebuf::underflow() { + + // If the file hasn't been opened for reading, error. + if ( !is_open() || !(mode & ios::in) ) + return EOF; + + // if a buffer doesn't exists, allocate one. + if ( !base() ) { + + if ( (allocate()) == EOF ) + return EOF; + setp(0,0); + + } else { + + if ( in_avail() ) + return (unsigned char) *gptr(); + + if ( out_waiting() ) { + if ( flushbuf() == EOF ) + return EOF; + } + + } + + // Attempt to fill the buffer. + + int result = fillbuf(); + if ( result == EOF ) { + // disable get area + setg(0,0,0); + return EOF; + } + + return (unsigned char) *gptr(); + +} + +int gzfilebuf::overflow( int c ) { + + if ( !is_open() || !(mode & ios::out) ) + return EOF; + + if ( !base() ) { + if ( allocate() == EOF ) + return EOF; + setg(0,0,0); + } else { + if (in_avail()) { + return EOF; + } + if (out_waiting()) { + if (flushbuf() == EOF) + return EOF; + } + } + + int bl = blen(); + setp( base(), base() + bl); + + if ( c != EOF ) { + + *pptr() = c; + pbump(1); + + } + + return 0; + +} + +int gzfilebuf::sync() { + + if ( !is_open() ) + return EOF; + + if ( out_waiting() ) + return flushbuf(); + + return 0; + +} + +int gzfilebuf::flushbuf() { + + int n; + char *q; + + q = pbase(); + n = pptr() - q; + + if ( gzwrite( file, q, n) < n ) + return EOF; + + setp(0,0); + + return 0; + +} + +int gzfilebuf::fillbuf() { + + int required; + char *p; + + p = base(); + + required = blen(); + + int t = gzread( file, p, required ); + + if ( t <= 0) return EOF; + + setg( base(), base(), base()+t); + + return t; + +} + +gzfilestream_common::gzfilestream_common() : + ios( gzfilestream_common::rdbuf() ) +{ } + +gzfilestream_common::~gzfilestream_common() +{ } + +void gzfilestream_common::attach( int fd, int io_mode ) { + + if ( !buffer.attach( fd, io_mode) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::open( const char *name, int io_mode ) { + + if ( !buffer.open( name, io_mode ) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::close() { + + if ( !buffer.close() ) + clear( ios::failbit | ios::badbit ); + +} + +gzfilebuf *gzfilestream_common::rdbuf() +{ + return &buffer; +} + +gzifstream::gzifstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzifstream::gzifstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzifstream::gzifstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzifstream::~gzifstream() { } + +gzofstream::gzofstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzofstream::gzofstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzofstream::gzofstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzofstream::~gzofstream() { } diff --git a/deps/zlib-1.2.10/contrib/iostream/zfstream.h b/deps/zlib-1.2.10/contrib/iostream/zfstream.h new file mode 100644 index 0000000..ed79098 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream/zfstream.h @@ -0,0 +1,128 @@ + +#ifndef zfstream_h +#define zfstream_h + +#include +#include "zlib.h" + +class gzfilebuf : public streambuf { + +public: + + gzfilebuf( ); + virtual ~gzfilebuf(); + + gzfilebuf *open( const char *name, int io_mode ); + gzfilebuf *attach( int file_descriptor, int io_mode ); + gzfilebuf *close(); + + int setcompressionlevel( int comp_level ); + int setcompressionstrategy( int comp_strategy ); + + inline int is_open() const { return (file !=NULL); } + + virtual streampos seekoff( streamoff, ios::seek_dir, int ); + + virtual int sync(); + +protected: + + virtual int underflow(); + virtual int overflow( int = EOF ); + +private: + + gzFile file; + short mode; + short own_file_descriptor; + + int flushbuf(); + int fillbuf(); + +}; + +class gzfilestream_common : virtual public ios { + + friend class gzifstream; + friend class gzofstream; + friend gzofstream &setcompressionlevel( gzofstream &, int ); + friend gzofstream &setcompressionstrategy( gzofstream &, int ); + +public: + virtual ~gzfilestream_common(); + + void attach( int fd, int io_mode ); + void open( const char *name, int io_mode ); + void close(); + +protected: + gzfilestream_common(); + +private: + gzfilebuf *rdbuf(); + + gzfilebuf buffer; + +}; + +class gzifstream : public gzfilestream_common, public istream { + +public: + + gzifstream(); + gzifstream( const char *name, int io_mode = ios::in ); + gzifstream( int fd, int io_mode = ios::in ); + + virtual ~gzifstream(); + +}; + +class gzofstream : public gzfilestream_common, public ostream { + +public: + + gzofstream(); + gzofstream( const char *name, int io_mode = ios::out ); + gzofstream( int fd, int io_mode = ios::out ); + + virtual ~gzofstream(); + +}; + +template class gzomanip { + friend gzofstream &operator<<(gzofstream &, const gzomanip &); +public: + gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } +private: + gzofstream &(*func)(gzofstream &, T); + T val; +}; + +template gzofstream &operator<<(gzofstream &s, const gzomanip &m) +{ + return (*m.func)(s, m.val); +} + +inline gzofstream &setcompressionlevel( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionlevel(l); + return s; +} + +inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionstrategy(l); + return s; +} + +inline gzomanip setcompressionlevel(int l) +{ + return gzomanip(&setcompressionlevel,l); +} + +inline gzomanip setcompressionstrategy(int l) +{ + return gzomanip(&setcompressionstrategy,l); +} + +#endif diff --git a/deps/zlib-1.2.10/contrib/iostream2/zstream.h b/deps/zlib-1.2.10/contrib/iostream2/zstream.h new file mode 100644 index 0000000..43d2332 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream2/zstream.h @@ -0,0 +1,307 @@ +/* + * + * Copyright (c) 1997 + * Christian Michelsen Research AS + * Advanced Computing + * Fantoftvegen 38, 5036 BERGEN, Norway + * http://www.cmr.no + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Christian Michelsen Research AS makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef ZSTREAM__H +#define ZSTREAM__H + +/* + * zstream.h - C++ interface to the 'zlib' general purpose compression library + * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $ + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(_WIN32) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +class zstringlen { +public: + zstringlen(class izstream&); + zstringlen(class ozstream&, const char*); + size_t value() const { return val.word; } +private: + struct Val { unsigned char byte; size_t word; } val; +}; + +// ----------------------------- izstream ----------------------------- + +class izstream +{ + public: + izstream() : m_fp(0) {} + izstream(FILE* fp) : m_fp(0) { open(fp); } + izstream(const char* name) : m_fp(0) { open(name); } + ~izstream() { close(); } + + /* Opens a gzip (.gz) file for reading. + * open() can be used to read a file which is not in gzip format; + * in this case read() will directly read from the file without + * decompression. errno can be checked to distinguish two error + * cases (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name) { + if (m_fp) close(); + m_fp = ::gzopen(name, "rb"); + } + + void open(FILE* fp) { + SET_BINARY_MODE(fp); + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), "rb"); + } + + /* Flushes all pending input if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + int r = ::gzclose(m_fp); + m_fp = 0; return r; + } + + /* Binary read the given number of bytes from the compressed file. + */ + int read(void* buf, size_t len) { + return ::gzread(m_fp, buf, len); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + private: + gzFile m_fp; +}; + +/* + * Binary read the given (array of) object(s) from the compressed file. + * If the input file was not in gzip format, read() copies the objects number + * of bytes into the buffer. + * returns the number of uncompressed bytes actually read + * (0 for end of file, -1 for error). + */ +template +inline int read(izstream& zs, T* x, Items items) { + return ::gzread(zs.fp(), x, items*sizeof(T)); +} + +/* + * Binary input with the '>' operator. + */ +template +inline izstream& operator>(izstream& zs, T& x) { + ::gzread(zs.fp(), &x, sizeof(T)); + return zs; +} + + +inline zstringlen::zstringlen(izstream& zs) { + zs > val.byte; + if (val.byte == 255) zs > val.word; + else val.word = val.byte; +} + +/* + * Read length of string + the string with the '>' operator. + */ +inline izstream& operator>(izstream& zs, char* x) { + zstringlen len(zs); + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return zs; +} + +inline char* read_string(izstream& zs) { + zstringlen len(zs); + char* x = new char[len.value()+1]; + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return x; +} + +// ----------------------------- ozstream ----------------------------- + +class ozstream +{ + public: + ozstream() : m_fp(0), m_os(0) { + } + ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(fp, level); + } + ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(name, level); + } + ~ozstream() { + close(); + } + + /* Opens a gzip (.gz) file for writing. + * The compression level parameter should be in 0..9 + * errno can be checked to distinguish two error cases + * (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name, int level = Z_DEFAULT_COMPRESSION) { + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzopen(name, mode); + } + + /* open from a FILE pointer. + */ + void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) { + SET_BINARY_MODE(fp); + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), mode); + } + + /* Flushes all pending output if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + if (m_os) { + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = 0; + } + int r = ::gzclose(m_fp); m_fp = 0; return r; + } + + /* Binary write the given number of bytes into the compressed file. + */ + int write(const void* buf, size_t len) { + return ::gzwrite(m_fp, (voidp) buf, len); + } + + /* Flushes all pending output into the compressed file. The parameter + * _flush is as in the deflate() function. The return value is the zlib + * error number (see function gzerror below). flush() returns Z_OK if + * the flush_ parameter is Z_FINISH and all output could be flushed. + * flush() should be called only when strictly necessary because it can + * degrade compression. + */ + int flush(int _flush) { + os_flush(); + return ::gzflush(m_fp, _flush); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + ostream& os() { + if (m_os == 0) m_os = new ostrstream; + return *m_os; + } + + void os_flush() { + if (m_os && m_os->pcount()>0) { + ostrstream* oss = new ostrstream; + oss->fill(m_os->fill()); + oss->flags(m_os->flags()); + oss->precision(m_os->precision()); + oss->width(m_os->width()); + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = oss; + } + } + + private: + gzFile m_fp; + ostrstream* m_os; +}; + +/* + * Binary write the given (array of) object(s) into the compressed file. + * returns the number of uncompressed bytes actually written + * (0 in case of error). + */ +template +inline int write(ozstream& zs, const T* x, Items items) { + return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T)); +} + +/* + * Binary output with the '<' operator. + */ +template +inline ozstream& operator<(ozstream& zs, const T& x) { + ::gzwrite(zs.fp(), (voidp) &x, sizeof(T)); + return zs; +} + +inline zstringlen::zstringlen(ozstream& zs, const char* x) { + val.byte = 255; val.word = ::strlen(x); + if (val.word < 255) zs < (val.byte = val.word); + else zs < val; +} + +/* + * Write length of string + the string with the '<' operator. + */ +inline ozstream& operator<(ozstream& zs, const char* x) { + zstringlen len(zs, x); + ::gzwrite(zs.fp(), (voidp) x, len.value()); + return zs; +} + +#ifdef _MSC_VER +inline ozstream& operator<(ozstream& zs, char* const& x) { + return zs < (const char*) x; +} +#endif + +/* + * Ascii write with the << operator; + */ +template +inline ostream& operator<<(ozstream& zs, const T& x) { + zs.os_flush(); + return zs.os() << x; +} + +#endif diff --git a/deps/zlib-1.2.10/contrib/iostream2/zstream_test.cpp b/deps/zlib-1.2.10/contrib/iostream2/zstream_test.cpp new file mode 100644 index 0000000..6273f62 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream2/zstream_test.cpp @@ -0,0 +1,25 @@ +#include "zstream.h" +#include +#include +#include + +void main() { + char h[256] = "Hello"; + char* g = "Goodbye"; + ozstream out("temp.gz"); + out < "This works well" < h < g; + out.close(); + + izstream in("temp.gz"); // read it back + char *x = read_string(in), *y = new char[256], z[256]; + in > y > z; + in.close(); + cout << x << endl << y << endl << z << endl; + + out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results + out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl; + out << z << endl << y << endl << x << endl; + out << 1.1234567890123456789 << endl; + + delete[] x; delete[] y; +} diff --git a/deps/zlib-1.2.10/contrib/iostream3/README b/deps/zlib-1.2.10/contrib/iostream3/README new file mode 100644 index 0000000..f7b319a --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream3/README @@ -0,0 +1,35 @@ +These classes provide a C++ stream interface to the zlib library. It allows you +to do things like: + + gzofstream outf("blah.gz"); + outf << "These go into the gzip file " << 123 << endl; + +It does this by deriving a specialized stream buffer for gzipped files, which is +the way Stroustrup would have done it. :-> + +The gzifstream and gzofstream classes were originally written by Kevin Ruland +and made available in the zlib contrib/iostream directory. The older version still +compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of +this version. + +The new classes are as standard-compliant as possible, closely following the +approach of the standard library's fstream classes. It compiles under gcc versions +3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard +library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs +from the previous one in the following respects: +- added showmanyc +- added setbuf, with support for unbuffered output via setbuf(0,0) +- a few bug fixes of stream behavior +- gzipped output file opened with default compression level instead of maximum level +- setcompressionlevel()/strategy() members replaced by single setcompression() + +The code is provided "as is", with the permission to use, copy, modify, distribute +and sell it for any purpose without fee. + +Ludwig Schwardt + + +DSP Lab +Electrical & Electronic Engineering Department +University of Stellenbosch +South Africa diff --git a/deps/zlib-1.2.10/contrib/iostream3/TODO b/deps/zlib-1.2.10/contrib/iostream3/TODO new file mode 100644 index 0000000..7032f97 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream3/TODO @@ -0,0 +1,17 @@ +Possible upgrades to gzfilebuf: + +- The ability to do putback (e.g. putbackfail) + +- The ability to seek (zlib supports this, but could be slow/tricky) + +- Simultaneous read/write access (does it make sense?) + +- Support for ios_base::ate open mode + +- Locale support? + +- Check public interface to see which calls give problems + (due to dependence on library internals) + +- Override operator<<(ostream&, gzfilebuf*) to allow direct copying + of stream buffer to stream ( i.e. os << is.rdbuf(); ) diff --git a/deps/zlib-1.2.10/contrib/iostream3/test.cc b/deps/zlib-1.2.10/contrib/iostream3/test.cc new file mode 100644 index 0000000..9423533 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream3/test.cc @@ -0,0 +1,50 @@ +/* + * Test program for gzifstream and gzofstream + * + * by Ludwig Schwardt + * original version by Kevin Ruland + */ + +#include "zfstream.h" +#include // for cout + +int main() { + + gzofstream outf; + gzifstream inf; + char buf[80]; + + outf.open("test1.txt.gz"); + outf << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n" + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + + std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n"; + inf.open("test1.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + outf.rdbuf()->pubsetbuf(0,0); + outf.open("test2.txt.gz"); + outf << setcompression(Z_NO_COMPRESSION) + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "\nWrote the same message to 'test2.txt.gz' in uncompressed form"; + + std::cout << "\nReading 'test2.txt.gz' (unbuffered) produces:\n"; + inf.rdbuf()->pubsetbuf(0,0); + inf.open("test2.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + return 0; + +} diff --git a/deps/zlib-1.2.10/contrib/iostream3/zfstream.cc b/deps/zlib-1.2.10/contrib/iostream3/zfstream.cc new file mode 100644 index 0000000..94eb933 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream3/zfstream.cc @@ -0,0 +1,479 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#include "zfstream.h" +#include // for strcpy, strcat, strlen (mode strings) +#include // for BUFSIZ + +// Internal buffer sizes (default and "unbuffered" versions) +#define BIGBUFSIZE BUFSIZ +#define SMALLBUFSIZE 1 + +/*****************************************************************************/ + +// Default constructor +gzfilebuf::gzfilebuf() +: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false), + buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true) +{ + // No buffers to start with + this->disable_buffer(); +} + +// Destructor +gzfilebuf::~gzfilebuf() +{ + // Sync output buffer and close only if responsible for file + // (i.e. attached streams should be left open at this stage) + this->sync(); + if (own_fd) + this->close(); + // Make sure internal buffer is deallocated + this->disable_buffer(); +} + +// Set compression level and strategy +int +gzfilebuf::setcompression(int comp_level, + int comp_strategy) +{ + return gzsetparams(file, comp_level, comp_strategy); +} + +// Open gzipped file +gzfilebuf* +gzfilebuf::open(const char *name, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to open file + if ((file = gzopen(name, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = true; + return this; +} + +// Attach to gzipped file +gzfilebuf* +gzfilebuf::attach(int fd, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzdopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to attach to file + if ((file = gzdopen(fd, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = false; + return this; +} + +// Close gzipped file +gzfilebuf* +gzfilebuf::close() +{ + // Fail immediately if no file is open + if (!this->is_open()) + return NULL; + // Assume success + gzfilebuf* retval = this; + // Attempt to sync and close gzipped file + if (this->sync() == -1) + retval = NULL; + if (gzclose(file) < 0) + retval = NULL; + // File is now gone anyway (postcondition [27.8.1.3.8]) + file = NULL; + own_fd = false; + // Destroy internal buffer if it exists + this->disable_buffer(); + return retval; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Convert int open mode to mode string +bool +gzfilebuf::open_mode(std::ios_base::openmode mode, + char* c_mode) const +{ + bool testb = mode & std::ios_base::binary; + bool testi = mode & std::ios_base::in; + bool testo = mode & std::ios_base::out; + bool testt = mode & std::ios_base::trunc; + bool testa = mode & std::ios_base::app; + + // Check for valid flag combinations - see [27.8.1.3.2] (Table 92) + // Original zfstream hardcoded the compression level to maximum here... + // Double the time for less than 1% size improvement seems + // excessive though - keeping it at the default level + // To change back, just append "9" to the next three mode strings + if (!testi && testo && !testt && !testa) + strcpy(c_mode, "w"); + if (!testi && testo && !testt && testa) + strcpy(c_mode, "a"); + if (!testi && testo && testt && !testa) + strcpy(c_mode, "w"); + if (testi && !testo && !testt && !testa) + strcpy(c_mode, "r"); + // No read/write mode yet +// if (testi && testo && !testt && !testa) +// strcpy(c_mode, "r+"); +// if (testi && testo && testt && !testa) +// strcpy(c_mode, "w+"); + + // Mode string should be empty for invalid combination of flags + if (strlen(c_mode) == 0) + return false; + if (testb) + strcat(c_mode, "b"); + return true; +} + +// Determine number of characters in internal get buffer +std::streamsize +gzfilebuf::showmanyc() +{ + // Calls to underflow will fail if file not opened for reading + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return -1; + // Make sure get area is in use + if (this->gptr() && (this->gptr() < this->egptr())) + return std::streamsize(this->egptr() - this->gptr()); + else + return 0; +} + +// Fill get area from gzipped file +gzfilebuf::int_type +gzfilebuf::underflow() +{ + // If something is left in the get area by chance, return it + // (this shouldn't normally happen, as underflow is only supposed + // to be called when gptr >= egptr, but it serves as error check) + if (this->gptr() && (this->gptr() < this->egptr())) + return traits_type::to_int_type(*(this->gptr())); + + // If the file hasn't been opened for reading, produce error + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return traits_type::eof(); + + // Attempt to fill internal buffer from gzipped file + // (buffer must be guaranteed to exist...) + int bytes_read = gzread(file, buffer, buffer_size); + // Indicates error or EOF + if (bytes_read <= 0) + { + // Reset get area + this->setg(buffer, buffer, buffer); + return traits_type::eof(); + } + // Make all bytes read from file available as get area + this->setg(buffer, buffer, buffer + bytes_read); + + // Return next character in get area + return traits_type::to_int_type(*(this->gptr())); +} + +// Write put area to gzipped file +gzfilebuf::int_type +gzfilebuf::overflow(int_type c) +{ + // Determine whether put area is in use + if (this->pbase()) + { + // Double-check pointer range + if (this->pptr() > this->epptr() || this->pptr() < this->pbase()) + return traits_type::eof(); + // Add extra character to buffer if not EOF + if (!traits_type::eq_int_type(c, traits_type::eof())) + { + *(this->pptr()) = traits_type::to_char_type(c); + this->pbump(1); + } + // Number of characters to write to file + int bytes_to_write = this->pptr() - this->pbase(); + // Overflow doesn't fail if nothing is to be written + if (bytes_to_write > 0) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // If gzipped file won't accept all bytes written to it, fail + if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write) + return traits_type::eof(); + // Reset next pointer to point to pbase on success + this->pbump(-bytes_to_write); + } + } + // Write extra character to file if not EOF + else if (!traits_type::eq_int_type(c, traits_type::eof())) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // Impromptu char buffer (allows "unbuffered" output) + char_type last_char = traits_type::to_char_type(c); + // If gzipped file won't accept this character, fail + if (gzwrite(file, &last_char, 1) != 1) + return traits_type::eof(); + } + + // If you got here, you have succeeded (even if c was EOF) + // The return value should therefore be non-EOF + if (traits_type::eq_int_type(c, traits_type::eof())) + return traits_type::not_eof(c); + else + return c; +} + +// Assign new buffer +std::streambuf* +gzfilebuf::setbuf(char_type* p, + std::streamsize n) +{ + // First make sure stuff is sync'ed, for safety + if (this->sync() == -1) + return NULL; + // If buffering is turned off on purpose via setbuf(0,0), still allocate one... + // "Unbuffered" only really refers to put [27.8.1.4.10], while get needs at + // least a buffer of size 1 (very inefficient though, therefore make it bigger?) + // This follows from [27.5.2.4.3]/12 (gptr needs to point at something, it seems) + if (!p || !n) + { + // Replace existing buffer (if any) with small internal buffer + this->disable_buffer(); + buffer = NULL; + buffer_size = 0; + own_buffer = true; + this->enable_buffer(); + } + else + { + // Replace existing buffer (if any) with external buffer + this->disable_buffer(); + buffer = p; + buffer_size = n; + own_buffer = false; + this->enable_buffer(); + } + return this; +} + +// Write put area to gzipped file (i.e. ensures that put area is empty) +int +gzfilebuf::sync() +{ + return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Allocate internal buffer +void +gzfilebuf::enable_buffer() +{ + // If internal buffer required, allocate one + if (own_buffer && !buffer) + { + // Check for buffered vs. "unbuffered" + if (buffer_size > 0) + { + // Allocate internal buffer + buffer = new char_type[buffer_size]; + // Get area starts empty and will be expanded by underflow as need arises + this->setg(buffer, buffer, buffer); + // Setup entire internal buffer as put area. + // The one-past-end pointer actually points to the last element of the buffer, + // so that overflow(c) can safely add the extra character c to the sequence. + // These pointers remain in place for the duration of the buffer + this->setp(buffer, buffer + buffer_size - 1); + } + else + { + // Even in "unbuffered" case, (small?) get buffer is still required + buffer_size = SMALLBUFSIZE; + buffer = new char_type[buffer_size]; + this->setg(buffer, buffer, buffer); + // "Unbuffered" means no put buffer + this->setp(0, 0); + } + } + else + { + // If buffer already allocated, reset buffer pointers just to make sure no + // stale chars are lying around + this->setg(buffer, buffer, buffer); + this->setp(buffer, buffer + buffer_size - 1); + } +} + +// Destroy internal buffer +void +gzfilebuf::disable_buffer() +{ + // If internal buffer exists, deallocate it + if (own_buffer && buffer) + { + // Preserve unbuffered status by zeroing size + if (!this->pbase()) + buffer_size = 0; + delete[] buffer; + buffer = NULL; + this->setg(0, 0, 0); + this->setp(0, 0); + } + else + { + // Reset buffer pointers to initial state if external buffer exists + this->setg(buffer, buffer, buffer); + if (buffer) + this->setp(buffer, buffer + buffer_size - 1); + else + this->setp(0, 0); + } +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzifstream::gzifstream() +: std::istream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzifstream::gzifstream(const char* name, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzifstream::gzifstream(int fd, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzifstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzifstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzifstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzofstream::gzofstream() +: std::ostream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzofstream::gzofstream(const char* name, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzofstream::gzofstream(int fd, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzofstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzofstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzofstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} diff --git a/deps/zlib-1.2.10/contrib/iostream3/zfstream.h b/deps/zlib-1.2.10/contrib/iostream3/zfstream.h new file mode 100644 index 0000000..8574479 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/iostream3/zfstream.h @@ -0,0 +1,466 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#ifndef ZFSTREAM_H +#define ZFSTREAM_H + +#include // not iostream, since we don't need cin/cout +#include +#include "zlib.h" + +/*****************************************************************************/ + +/** + * @brief Gzipped file stream buffer class. + * + * This class implements basic_filebuf for gzipped files. It doesn't yet support + * seeking (allowed by zlib but slow/limited), putback and read/write access + * (tricky). Otherwise, it attempts to be a drop-in replacement for the standard + * file streambuf. +*/ +class gzfilebuf : public std::streambuf +{ +public: + // Default constructor. + gzfilebuf(); + + // Destructor. + virtual + ~gzfilebuf(); + + /** + * @brief Set compression level and strategy on the fly. + * @param comp_level Compression level (see zlib.h for allowed values) + * @param comp_strategy Compression strategy (see zlib.h for allowed values) + * @return Z_OK on success, Z_STREAM_ERROR otherwise. + * + * Unfortunately, these parameters cannot be modified separately, as the + * previous zfstream version assumed. Since the strategy is seldom changed, + * it can default and setcompression(level) then becomes like the old + * setcompressionlevel(level). + */ + int + setcompression(int comp_level, + int comp_strategy = Z_DEFAULT_STRATEGY); + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() const { return (file != NULL); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + open(const char* name, + std::ios_base::openmode mode); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + attach(int fd, + std::ios_base::openmode mode); + + /** + * @brief Close gzipped file. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + close(); + +protected: + /** + * @brief Convert ios open mode int to mode string used by zlib. + * @return True if valid mode flag combination. + */ + bool + open_mode(std::ios_base::openmode mode, + char* c_mode) const; + + /** + * @brief Number of characters available in stream buffer. + * @return Number of characters. + * + * This indicates number of characters in get area of stream buffer. + * These characters can be read without accessing the gzipped file. + */ + virtual std::streamsize + showmanyc(); + + /** + * @brief Fill get area from gzipped file. + * @return First character in get area on success, EOF on error. + * + * This actually reads characters from gzipped file to stream + * buffer. Always buffered. + */ + virtual int_type + underflow(); + + /** + * @brief Write put area to gzipped file. + * @param c Extra character to add to buffer contents. + * @return Non-EOF on success, EOF on error. + * + * This actually writes characters in stream buffer to + * gzipped file. With unbuffered output this is done one + * character at a time. + */ + virtual int_type + overflow(int_type c = traits_type::eof()); + + /** + * @brief Installs external stream buffer. + * @param p Pointer to char buffer. + * @param n Size of external buffer. + * @return @c this on success, NULL on failure. + * + * Call setbuf(0,0) to enable unbuffered output. + */ + virtual std::streambuf* + setbuf(char_type* p, + std::streamsize n); + + /** + * @brief Flush stream buffer to file. + * @return 0 on success, -1 on error. + * + * This calls underflow(EOF) to do the job. + */ + virtual int + sync(); + +// +// Some future enhancements +// +// virtual int_type uflow(); +// virtual int_type pbackfail(int_type c = traits_type::eof()); +// virtual pos_type +// seekoff(off_type off, +// std::ios_base::seekdir way, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); +// virtual pos_type +// seekpos(pos_type sp, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); + +private: + /** + * @brief Allocate internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that a proper internal buffer exists if it is required. If the + * buffer already exists or is external, the buffer pointers will be + * reset to their original state. + */ + void + enable_buffer(); + + /** + * @brief Destroy internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that the internal buffer is deallocated if it exists. In any + * case, it will also reset the buffer pointers. + */ + void + disable_buffer(); + + /** + * Underlying file pointer. + */ + gzFile file; + + /** + * Mode in which file was opened. + */ + std::ios_base::openmode io_mode; + + /** + * @brief True if this object owns file descriptor. + * + * This makes the class responsible for closing the file + * upon destruction. + */ + bool own_fd; + + /** + * @brief Stream buffer. + * + * For simplicity this remains allocated on the free store for the + * entire life span of the gzfilebuf object, unless replaced by setbuf. + */ + char_type* buffer; + + /** + * @brief Stream buffer size. + * + * Defaults to system default buffer size (typically 8192 bytes). + * Modified by setbuf. + */ + std::streamsize buffer_size; + + /** + * @brief True if this object owns stream buffer. + * + * This makes the class responsible for deleting the buffer + * upon destruction. + */ + bool own_buffer; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file input stream class. + * + * This class implements ifstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzifstream : public std::istream +{ +public: + // Default constructor + gzifstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ifstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream class. + * + * This class implements ofstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzofstream : public std::ostream +{ +public: + // Default constructor + gzofstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ofstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream manipulator class. + * + * This class defines a two-argument manipulator for gzofstream. It is used + * as base for the setcompression(int,int) manipulator. +*/ +template + class gzomanip2 + { + public: + // Allows insertor to peek at internals + template + friend gzofstream& + operator<<(gzofstream&, + const gzomanip2&); + + // Constructor + gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2), + T1 v1, + T2 v2); + private: + // Underlying manipulator function + gzofstream& + (*func)(gzofstream&, T1, T2); + + // Arguments for manipulator function + T1 val1; + T2 val2; + }; + +/*****************************************************************************/ + +// Manipulator function thunks through to stream buffer +inline gzofstream& +setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY) +{ + (gzs.rdbuf())->setcompression(l, s); + return gzs; +} + +// Manipulator constructor stores arguments +template + inline + gzomanip2::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2), + T1 v1, + T2 v2) + : func(f), val1(v1), val2(v2) + { } + +// Insertor applies underlying manipulator function to stream +template + inline gzofstream& + operator<<(gzofstream& s, const gzomanip2& m) + { return (*m.func)(s, m.val1, m.val2); } + +// Insert this onto stream to simplify setting of compression level +inline gzomanip2 +setcompression(int l, int s = Z_DEFAULT_STRATEGY) +{ return gzomanip2(&setcompression, l, s); } + +#endif // ZFSTREAM_H diff --git a/deps/zlib-1.2.10/contrib/masmx64/bld_ml64.bat b/deps/zlib-1.2.10/contrib/masmx64/bld_ml64.bat new file mode 100644 index 0000000..8f9343d --- /dev/null +++ b/deps/zlib-1.2.10/contrib/masmx64/bld_ml64.bat @@ -0,0 +1,2 @@ +ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +ml64.exe /Flgvmat64 /c /Zi gvmat64.asm diff --git a/deps/zlib-1.2.10/contrib/masmx64/gvmat64.asm b/deps/zlib-1.2.10/contrib/masmx64/gvmat64.asm new file mode 100644 index 0000000..9879c28 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/masmx64/gvmat64.asm @@ -0,0 +1,553 @@ +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); /* current match */ + +; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Permission is granted to anyone to use this software for any purpose, +; including commercial applications, and to alter it and redistribute it +; freely, subject to the following restrictions: +; +; 1. The origin of this software must not be misrepresented; you must not +; claim that you wrote the original software. If you use this software +; in a product, an acknowledgment in the product documentation would be +; appreciated but is not required. +; 2. Altered source versions must be plainly marked as such, and must not be +; misrepresented as being the original software +; 3. This notice may not be removed or altered from any source distribution. +; +; +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for infozip Zip, I use option: +; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm +; +; to compile this file for zLib, I use option: +; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm +; Be carrefull to adapt zlib1222add below to your version of zLib +; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change +; value of zlib1222add later) +; +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ +.code +longest_match PROC + + +;LocalVarsSize equ 88 + LocalVarsSize equ 72 + +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp + + chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len + ; low word: s->wmask +;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10 +;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11 +;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w +;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx +;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13 +;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d +;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9 +IFDEF INFOZIP +ELSE + nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size +ENDIF + +save_rdi equ rsp + 24 - LocalVarsSize +save_rsi equ rsp + 32 - LocalVarsSize +save_rbx equ rsp + 40 - LocalVarsSize +save_rbp equ rsp + 48 - LocalVarsSize +save_r12 equ rsp + 56 - LocalVarsSize +save_r13 equ rsp + 64 - LocalVarsSize +;save_r14 equ rsp + 72 - LocalVarsSize +;save_r15 equ rsp + 80 - LocalVarsSize + + +; summary of register usage +; scanend ebx +; scanendw bx +; chainlenwmask edx +; curmatch rsi +; curmatchd esi +; windowbestlen r8 +; scanalign r9 +; scanalignd r9d +; window r10 +; bestlen r11 +; bestlend r11d +; scanstart r12d +; scanstartw r12w +; scan r13 +; nicematch r14d +; limit r15 +; limitd r15d +; prev rcx + +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure + + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + +IFDEF INFOZIP + +_DATA SEGMENT +COMM window_size:DWORD +; WMask ; 7fff +COMM window:BYTE:010040H +COMM prev:WORD:08000H +; MatchLen : unused +; PrevMatch : unused +COMM strstart:DWORD +COMM match_start:DWORD +; Lookahead : ignore +COMM prev_length:DWORD ; PrevLen +COMM max_chain_length:DWORD +COMM good_match:DWORD +COMM nice_match:DWORD +prev_ad equ OFFSET prev +window_ad equ OFFSET window +nicematch equ nice_match +_DATA ENDS +WMask equ 07fffh + +ELSE + + IFNDEF zlib1222add + zlib1222add equ 8 + ENDIF +dsWSize equ 56+zlib1222add+(zlib1222add/2) +dsWMask equ 64+zlib1222add+(zlib1222add/2) +dsWindow equ 72+zlib1222add +dsPrev equ 88+zlib1222add +dsMatchLen equ 128+zlib1222add +dsPrevMatch equ 132+zlib1222add +dsStrStart equ 140+zlib1222add +dsMatchStart equ 144+zlib1222add +dsLookahead equ 148+zlib1222add +dsPrevLen equ 152+zlib1222add +dsMaxChainLen equ 156+zlib1222add +dsGoodMatch equ 172+zlib1222add +dsNiceMatch equ 176+zlib1222add + +window_size equ [ rcx + dsWSize] +WMask equ [ rcx + dsWMask] +window_ad equ [ rcx + dsWindow] +prev_ad equ [ rcx + dsPrev] +strstart equ [ rcx + dsStrStart] +match_start equ [ rcx + dsMatchStart] +Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip +prev_length equ [ rcx + dsPrevLen] +max_chain_length equ [ rcx + dsMaxChainLen] +good_match equ [ rcx + dsGoodMatch] +nice_match equ [ rcx + dsNiceMatch] +ENDIF + +; parameter 1 in r8(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + + + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + +; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) + +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx + + mov [save_rdi],rdi + mov [save_rsi],rsi + mov [save_rbx],rbx + mov [save_rbp],rbp +IFDEF INFOZIP + mov r8d,ecx +ELSE + mov r8d,edx +ENDIF + mov [save_r12],r12 + mov [save_r13],r13 +; mov [save_r14],r14 +; mov [save_r15],r15 + + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + +;;; on zlib only +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + +IFDEF INFOZIP + mov [chainlenwmask], ebx +; on infozip nice_match = [nice_match] +ELSE + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d +ENDIF + +;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; +IFDEF INFOZIP + mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1)) +ELSE + mov eax, window_size + sub eax, MIN_LOOKAHEAD +ENDIF + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +;;; int best_len = s->prev_length; + + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 + jmp LookupLoopIsZero + + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + jnz LookupLoop1 + + +;;; Store the current value of chainlen. + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + lea rsi,[r8+r10] + mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + jnz short LoopCmps + jmp short LenMaximum +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0000FFFFh + jnz LenLower + + test eax,0ffffffffh + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + jnz LenLower + +LenLower32: + shr eax,16 + add rdx,2 +LenLower: sub al, 1 + adc rdx, 0 +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// + + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + jge LeaveNow + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: +IFDEF INFOZIP + mov eax,r11d +ELSE + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d +ENDIF + +;;; Restore the stack and return from whence we came. + + + mov rsi,[save_rsi] + mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] +; mov r14,[save_r14] +; mov r15,[save_r15] + + + ret 0 +; please don't remove this string ! +; Your can freely use gvmat64 in any free or commercial app +; but it is far better don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 +longest_match ENDP + +match_init PROC + ret 0 +match_init ENDP + + +END diff --git a/deps/zlib-1.2.10/contrib/masmx64/inffas8664.c b/deps/zlib-1.2.10/contrib/masmx64/inffas8664.c new file mode 100644 index 0000000..e8af06f --- /dev/null +++ b/deps/zlib-1.2.10/contrib/masmx64/inffas8664.c @@ -0,0 +1,186 @@ +/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding + * version for AMD64 on Windows using Microsoft C compiler + * + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant + * + * inffas8664.c call function inffas8664fnc in inffasx64.asm + * inffasx64.asm is automatically convert from AMD64 portion of inffas86.c + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + * + */ + +#include +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ + + + + typedef struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } type_ar; +#ifdef ASMINF + +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + type_ar ar; + void inffas8664fnc(struct inffast_ar * par); + + + +#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64)) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + + inffas8664fnc(&ar); + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = (unsigned long)ar.hold; + state->bits = ar.bits; + return; +} + +#endif diff --git a/deps/zlib-1.2.10/contrib/masmx64/inffasx64.asm b/deps/zlib-1.2.10/contrib/masmx64/inffasx64.asm new file mode 100644 index 0000000..60a8d89 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/masmx64/inffasx64.asm @@ -0,0 +1,396 @@ +; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding +; version for AMD64 on Windows using Microsoft C compiler +; +; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c +; inffasx64.asm is called by inffas8664.c, which contain more info. + + +; to compile this file, I use option +; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +; with Microsoft Macro Assembler (x64) for AMD64 +; + +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +.code +inffas8664fnc PROC + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + + mov [rsp-8],rsi + mov [rsp-16],rdi + mov [rsp-24],r12 + mov [rsp-32],r13 + mov [rsp-40],r14 + mov [rsp-48],r15 + mov [rsp-56],rbx + + mov rax,rcx + + mov [rax+8], rbp ; /* save regs rbp and rsp */ + mov [rax], rsp + + mov rsp, rax ; /* make rsp point to &ar */ + + mov rsi, [rsp+16] ; /* rsi = in */ + mov rdi, [rsp+32] ; /* rdi = out */ + mov r9, [rsp+24] ; /* r9 = last */ + mov r10, [rsp+48] ; /* r10 = end */ + mov rbp, [rsp+64] ; /* rbp = lcode */ + mov r11, [rsp+72] ; /* r11 = dcode */ + mov rdx, [rsp+80] ; /* rdx = hold */ + mov ebx, [rsp+88] ; /* ebx = bits */ + mov r12d, [rsp+100] ; /* r12d = lmask */ + mov r13d, [rsp+104] ; /* r13d = dmask */ + ; /* r14d = len */ + ; /* r15d = dist */ + + + cld + cmp r10, rdi + je L_one_time ; /* if only one decode left */ + cmp r9, rsi + + jne L_do_loop + + +L_one_time: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code_one_time + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + jmp L_get_length_code_one_time + +ALIGN 4 +L_while_test: + cmp r10, rdi + jbe L_break_loop + cmp r9, rsi + jbe L_break_loop + +L_do_loop: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_length_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + mov r8, r12 ; /* r8 = lmask */ + shr eax, 16 ; /* output this.val char */ + stosb + +L_get_length_code_one_time: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + shr eax, 16 ; /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov r14d, eax ; /* len = this */ + shr r14d, 16 ; /* len = this.val */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */ + and cl, 15 ; /* op &= 15 */ + jz L_decode_distance ; /* if (!op) */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r14d, eax ; /* len += hold & mask[op] */ + +L_decode_distance: + mov r8, r13 ; /* r8 = dmask */ + cmp bl, 32 + ja L_get_distance_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_distance_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */ + +L_dodist: + mov r15d, eax ; /* dist = this */ + shr r15d, 16 ; /* dist = this.val */ + mov cl, ah + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + mov cl, al ; /* cl = this.op */ + + test al, 16 ; /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 ; /* op &= 15 */ + jz L_check_dist_one + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax ; /* (1 << op) - 1 */ + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r15d, eax ; /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov r8, rsi ; /* save in so from can use it's reg */ + mov rax, rdi + sub rax, [rsp+40] ; /* nbytes = out - beg */ + + cmp eax, r15d + jb L_clip_window ; /* if (dist > nbytes) 4.2% */ + + mov ecx, r14d ; /* ecx = len */ + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two ; /* if len % 2 == 0 */ + + rep movsw + mov al, [rsi] + mov [rdi], al + inc rdi + + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +L_copy_two: + rep movsw + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp r15d, 1 ; /* if dist 1, is a memset */ + jne L_check_window + cmp [rsp+40], rdi ; /* if out == beg, outside window */ + je L_check_window + + mov ecx, r14d ; /* ecx = len */ + mov al, [rdi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [rdi], al + inc rdi + +L_set_two: + rep stosw + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r14d ; /* eax += len */ + mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r15d ; /* eax += dist */ + mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax ; /* ecx = nbytes */ + mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */ + neg ecx ; /* nbytes = -nbytes */ + + cmp eax, r15d + jb L_invalid_distance_too_far ; /* if (dist > wsize) */ + + add ecx, r15d ; /* nbytes = dist - nbytes */ + cmp dword ptr [rsp+96], 0 + jne L_wrap_around_window ; /* if (write != 0) */ + + mov rsi, [rsp+56] ; /* from = window */ + sub eax, ecx ; /* eax -= nbytes */ + add rsi, rax ; /* from += wsize - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp r14d, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* eax -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = &out[ -dist ] */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [rsp+96] ; /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window ; /* if (write >= nbytes) */ + + mov esi, [rsp+92] ; /* from = wsize */ + add rsi, [rsp+56] ; /* from += window */ + add rsi, rax ; /* from += write */ + sub rsi, rcx ; /* from -= nbytes */ + sub ecx, eax ; /* nbytes -= write */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, [rsp+56] ; /* from = window */ + mov ecx, [rsp+96] ; /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + mov rsi, [rsp+56] ; /* rsi = window */ + add rsi, rax + sub rsi, rcx ; /* from += write - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy ; /* if (nbytes >= len) */ + +ALIGN 4 +L_do_copy: + mov ecx, eax ; /* ecx = len */ + rep movsb + + mov rsi, r8 ; /* move in back to %esi, toss from */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [rsp+116], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [rsp+116], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [rsp+116], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov dword ptr [rsp+116], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [rsp+116], 0 + +L_break_loop_with_status: +; /* put in, out, bits, and hold back into ar and pop esp */ + mov [rsp+16], rsi ; /* in */ + mov [rsp+32], rdi ; /* out */ + mov [rsp+88], ebx ; /* bits */ + mov [rsp+80], rdx ; /* hold */ + + mov rax, [rsp] ; /* restore rbp and rsp */ + mov rbp, [rsp+8] + mov rsp, rax + + + + mov rsi,[rsp-8] + mov rdi,[rsp-16] + mov r12,[rsp-24] + mov r13,[rsp-32] + mov r14,[rsp-40] + mov r15,[rsp-48] + mov rbx,[rsp-56] + + ret 0 +; : +; : "m" (ar) +; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", +; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" +; ); + +inffas8664fnc ENDP +;_TEXT ENDS +END diff --git a/deps/zlib-1.2.10/contrib/masmx64/readme.txt b/deps/zlib-1.2.10/contrib/masmx64/readme.txt new file mode 100644 index 0000000..2da6733 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/masmx64/readme.txt @@ -0,0 +1,31 @@ +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t), +for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits. + +gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits + assembly optimized version from Jean-loup Gailly original longest_match function + +inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing + original function from Mark Adler + +Use instructions +---------------- +Assemble the .asm files using MASM and put the object files into the zlib source +directory. You can also get object files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +define ASMV and ASMINF in your project. Include inffas8664.c in your source tree, +and inffasx64.obj and gvmat64.obj as object to link. + + +Build instructions +------------------ +run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe) + +ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK + +You can get Windows 2003 server DDK with ml64 and cl for AMD64 from + http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) diff --git a/deps/zlib-1.2.10/contrib/masmx86/bld_ml32.bat b/deps/zlib-1.2.10/contrib/masmx86/bld_ml32.bat new file mode 100644 index 0000000..e1b86bf --- /dev/null +++ b/deps/zlib-1.2.10/contrib/masmx86/bld_ml32.bat @@ -0,0 +1,2 @@ +ml /coff /Zi /c /Flmatch686.lst match686.asm +ml /coff /Zi /c /Flinffas32.lst inffas32.asm diff --git a/deps/zlib-1.2.10/contrib/masmx86/inffas32.asm b/deps/zlib-1.2.10/contrib/masmx86/inffas32.asm new file mode 100644 index 0000000..03d20f8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/masmx86/inffas32.asm @@ -0,0 +1,1080 @@ +;/* inffas32.asm is a hand tuned assembler version of inffast.c -- fast decoding +; * +; * inffas32.asm is derivated from inffas86.c, with translation of assembly code +; * +; * Copyright (C) 1995-2003 Mark Adler +; * For conditions of distribution and use, see copyright notice in zlib.h +; * +; * Copyright (C) 2003 Chris Anderson +; * Please use the copyright conditions above. +; * +; * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from +; * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at +; * the moment. I have successfully compiled and tested this code with gcc2.96, +; * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S +; * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX +; * enabled. I will attempt to merge the MMX code into this version. Newer +; * versions of this and inffast.S can be found at +; * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ +; * +; * 2005 : modification by Gilles Vollant +; */ +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is in directory \MASM611C of Win95 DDK +; ml.exe is also distributed in http://www.masm32.com/masmdl.htm +; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/ +; +; +; compile with command line option +; ml /coff /Zi /c /Flinffas32.lst inffas32.asm + +; if you define NO_GZIP (see inflate.h), compile with +; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm + + +; zlib122sup is 0 fort zlib 1.2.2.1 and lower +; zlib122sup is 8 fort zlib 1.2.2.2 and more (with addition of dmax and head +; in inflate_state in inflate.h) +zlib1222sup equ 8 + + +IFDEF GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 +ELSE + IFNDEF NO_GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 + ELSE + INFLATE_MODE_TYPE equ 3 + INFLATE_MODE_BAD equ 17 + ENDIF +ENDIF + + +; 75 "inffast.S" +;FILE "inffast.S" + +;;;GLOBAL _inflate_fast + +;;;SECTION .text + + + + .586p + .mmx + + name inflate_fast_x86 + .MODEL FLAT + +_DATA segment +inflate_fast_use_mmx: + dd 1 + + +_TEXT segment + + + +ALIGN 4 + db 'Fast decoding Code from Chris Anderson' + db 0 + +ALIGN 4 +invalid_literal_length_code_msg: + db 'invalid literal/length code' + db 0 + +ALIGN 4 +invalid_distance_code_msg: + db 'invalid distance code' + db 0 + +ALIGN 4 +invalid_distance_too_far_msg: + db 'invalid distance too far back' + db 0 + + +ALIGN 4 +inflate_fast_mask: +dd 0 +dd 1 +dd 3 +dd 7 +dd 15 +dd 31 +dd 63 +dd 127 +dd 255 +dd 511 +dd 1023 +dd 2047 +dd 4095 +dd 8191 +dd 16383 +dd 32767 +dd 65535 +dd 131071 +dd 262143 +dd 524287 +dd 1048575 +dd 2097151 +dd 4194303 +dd 8388607 +dd 16777215 +dd 33554431 +dd 67108863 +dd 134217727 +dd 268435455 +dd 536870911 +dd 1073741823 +dd 2147483647 +dd 4294967295 + + +mode_state equ 0 ;/* state->mode */ +wsize_state equ (32+zlib1222sup) ;/* state->wsize */ +write_state equ (36+4+zlib1222sup) ;/* state->write */ +window_state equ (40+4+zlib1222sup) ;/* state->window */ +hold_state equ (44+4+zlib1222sup) ;/* state->hold */ +bits_state equ (48+4+zlib1222sup) ;/* state->bits */ +lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */ +distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */ +lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */ +distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */ + + +;;SECTION .text +; 205 "inffast.S" +;GLOBAL inflate_fast_use_mmx + +;SECTION .data + + +; GLOBAL inflate_fast_use_mmx:object +;.size inflate_fast_use_mmx, 4 +; 226 "inffast.S" +;SECTION .text + +ALIGN 4 +_inflate_fast proc near +.FPO (16, 4, 0, 0, 1, 0) + push edi + push esi + push ebp + push ebx + pushfd + sub esp,64 + cld + + + + + mov esi, [esp+88] + mov edi, [esi+28] + + + + + + + + mov edx, [esi+4] + mov eax, [esi+0] + + add edx,eax + sub edx,11 + + mov [esp+44],eax + mov [esp+20],edx + + mov ebp, [esp+92] + mov ecx, [esi+16] + mov ebx, [esi+12] + + sub ebp,ecx + neg ebp + add ebp,ebx + + sub ecx,257 + add ecx,ebx + + mov [esp+60],ebx + mov [esp+40],ebp + mov [esp+16],ecx +; 285 "inffast.S" + mov eax, [edi+lencode_state] + mov ecx, [edi+distcode_state] + + mov [esp+8],eax + mov [esp+12],ecx + + mov eax,1 + mov ecx, [edi+lenbits_state] + shl eax,cl + dec eax + mov [esp+0],eax + + mov eax,1 + mov ecx, [edi+distbits_state] + shl eax,cl + dec eax + mov [esp+4],eax + + mov eax, [edi+wsize_state] + mov ecx, [edi+write_state] + mov edx, [edi+window_state] + + mov [esp+52],eax + mov [esp+48],ecx + mov [esp+56],edx + + mov ebp, [edi+hold_state] + mov ebx, [edi+bits_state] +; 321 "inffast.S" + mov esi, [esp+44] + mov ecx, [esp+20] + cmp ecx,esi + ja L_align_long + + add ecx,11 + sub ecx,esi + mov eax,12 + sub eax,ecx + lea edi, [esp+28] + rep movsb + mov ecx,eax + xor eax,eax + rep stosb + lea esi, [esp+28] + mov [esp+20],esi + jmp L_is_aligned + + +L_align_long: + test esi,3 + jz L_is_aligned + xor eax,eax + mov al, [esi] + inc esi + mov ecx,ebx + add ebx,8 + shl eax,cl + or ebp,eax + jmp L_align_long + +L_is_aligned: + mov edi, [esp+60] +; 366 "inffast.S" +L_check_mmx: + cmp dword ptr [inflate_fast_use_mmx],2 + je L_init_mmx + ja L_do_loop + + push eax + push ebx + push ecx + push edx + pushfd + mov eax, [esp] + xor dword ptr [esp],0200000h + + + + + popfd + pushfd + pop edx + xor edx,eax + jz L_dont_use_mmx + xor eax,eax + cpuid + cmp ebx,0756e6547h + jne L_dont_use_mmx + cmp ecx,06c65746eh + jne L_dont_use_mmx + cmp edx,049656e69h + jne L_dont_use_mmx + mov eax,1 + cpuid + shr eax,8 + and eax,15 + cmp eax,6 + jne L_dont_use_mmx + test edx,0800000h + jnz L_use_mmx + jmp L_dont_use_mmx +L_use_mmx: + mov dword ptr [inflate_fast_use_mmx],2 + jmp L_check_mmx_pop +L_dont_use_mmx: + mov dword ptr [inflate_fast_use_mmx],3 +L_check_mmx_pop: + pop edx + pop ecx + pop ebx + pop eax + jmp L_check_mmx +; 426 "inffast.S" +ALIGN 4 +L_do_loop: +; 437 "inffast.S" + cmp bl,15 + ja L_get_length_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_length_code: + mov edx, [esp+0] + mov ecx, [esp+8] + and edx,ebp + mov eax, [ecx+edx*4] + +L_dolen: + + + + + + + mov cl,ah + sub bl,ah + shr ebp,cl + + + + + + + test al,al + jnz L_test_for_length_base + + shr eax,16 + stosb + +L_while_test: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop + jmp L_break_loop + +L_test_for_length_base: +; 502 "inffast.S" + mov edx,eax + shr edx,16 + mov cl,al + + test al,16 + jz L_test_for_second_level_length + and cl,15 + jz L_save_len + cmp bl,cl + jae L_add_bits_to_len + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_len: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + +L_save_len: + mov [esp+24],edx + + +L_decode_distance: +; 549 "inffast.S" + cmp bl,15 + ja L_get_distance_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_distance_code: + mov edx, [esp+4] + mov ecx, [esp+12] + and edx,ebp + mov eax, [ecx+edx*4] + + +L_dodist: + mov edx,eax + shr edx,16 + mov cl,ah + sub bl,ah + shr ebp,cl +; 584 "inffast.S" + mov cl,al + + test al,16 + jz L_test_for_second_level_dist + and cl,15 + jz L_check_dist_one + cmp bl,cl + jae L_add_bits_to_dist + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_dist: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + jmp L_check_window + +L_check_window: +; 625 "inffast.S" + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,edx + jb L_clip_window + + mov ecx, [esp+24] + mov esi,edi + sub esi,edx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp edx,1 + jne L_check_window + cmp [esp+40],edi + je L_check_window + + dec edi + mov ecx, [esp+24] + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + + + + + test al,64 + jnz L_test_for_end_of_block + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+8] + mov eax, [edx+eax*4] + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + + + + + test al,64 + jnz L_invalid_distance_code + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+12] + mov eax, [edx+eax*4] + jmp L_dodist + +ALIGN 4 +L_clip_window: +; 721 "inffast.S" + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,edx + jb L_invalid_distance_too_far + + add ecx,edx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window + + sub eax,ecx + add esi,eax +; 749 "inffast.S" + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_wrap_around_window: +; 793 "inffast.S" + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_contiguous_in_window: +; 836 "inffast.S" + add esi,eax + sub esi,ecx + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + +L_do_copy1: +; 862 "inffast.S" + mov ecx,eax + rep movsb + + mov esi, [esp+44] + jmp L_while_test +; 878 "inffast.S" +ALIGN 4 +L_init_mmx: + emms + + + + + + movd mm0,ebp + mov ebp,ebx +; 896 "inffast.S" + movd mm4,dword ptr [esp+0] + movq mm3,mm4 + movd mm5,dword ptr [esp+4] + movq mm2,mm5 + pxor mm1,mm1 + mov ebx, [esp+8] + jmp L_do_loop_mmx + +ALIGN 4 +L_do_loop_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_length_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_length_code_mmx: + pand mm4,mm0 + movd eax,mm4 + movq mm4,mm3 + mov eax, [ebx+eax*4] + +L_dolen_mmx: + movzx ecx,ah + movd mm1,ecx + sub ebp,ecx + + test al,al + jnz L_test_for_length_base_mmx + + shr eax,16 + stosb + +L_while_test_mmx: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop_mmx + jmp L_break_loop + +L_test_for_length_base_mmx: + + mov edx,eax + shr edx,16 + + test al,16 + jz L_test_for_second_level_length_mmx + and eax,15 + jz L_decode_distance_mmx + + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add edx,ecx + +L_decode_distance_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_dist_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_dist_code_mmx: + mov ebx, [esp+12] + pand mm5,mm0 + movd eax,mm5 + movq mm5,mm2 + mov eax, [ebx+eax*4] + +L_dodist_mmx: + + movzx ecx,ah + mov ebx,eax + shr ebx,16 + sub ebp,ecx + movd mm1,ecx + + test al,16 + jz L_test_for_second_level_dist_mmx + and eax,15 + jz L_check_dist_one_mmx + +L_add_bits_to_dist_mmx: + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add ebx,ecx + +L_check_window_mmx: + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,ebx + jb L_clip_window_mmx + + mov ecx,edx + mov esi,edi + sub esi,ebx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_check_dist_one_mmx: + cmp ebx,1 + jne L_check_window_mmx + cmp [esp+40],edi + je L_check_window_mmx + + dec edi + mov ecx,edx + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_test_for_second_level_length_mmx: + test al,64 + jnz L_test_for_end_of_block + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + add ecx,edx + mov eax, [ebx+ecx*4] + jmp L_dolen_mmx + +ALIGN 4 +L_test_for_second_level_dist_mmx: + test al,64 + jnz L_invalid_distance_code + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + mov eax, [esp+12] + add ecx,ebx + mov eax, [eax+ecx*4] + jmp L_dodist_mmx + +ALIGN 4 +L_clip_window_mmx: + + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,ebx + jb L_invalid_distance_too_far + + add ecx,ebx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window_mmx + + sub eax,ecx + add esi,eax + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_wrap_around_window_mmx: + + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window_mmx + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_contiguous_in_window_mmx: + + add esi,eax + sub esi,ecx + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + +L_do_copy1_mmx: + + + mov ecx,edx + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx +; 1174 "inffast.S" +L_invalid_distance_code: + + + + + + mov ecx, invalid_distance_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_test_for_end_of_block: + + + + + + test al,32 + jz L_invalid_literal_length_code + + mov ecx,0 + mov edx,INFLATE_MODE_TYPE + jmp L_update_stream_state + +L_invalid_literal_length_code: + + + + + + mov ecx, invalid_literal_length_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_invalid_distance_too_far: + + + + mov esi, [esp+44] + mov ecx, invalid_distance_too_far_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_update_stream_state: + + mov eax, [esp+88] + test ecx,ecx + jz L_skip_msg + mov [eax+24],ecx +L_skip_msg: + mov eax, [eax+28] + mov [eax+mode_state],edx + jmp L_break_loop + +ALIGN 4 +L_break_loop: +; 1243 "inffast.S" + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_next_in + + + + mov ebx,ebp + +L_update_next_in: +; 1266 "inffast.S" + mov eax, [esp+88] + mov ecx,ebx + mov edx, [eax+28] + shr ecx,3 + sub esi,ecx + shl ecx,3 + sub ebx,ecx + mov [eax+12],edi + mov [edx+bits_state],ebx + mov ecx,ebx + + lea ebx, [esp+28] + cmp [esp+20],ebx + jne L_buf_not_used + + sub esi,ebx + mov ebx, [eax+0] + mov [esp+20],ebx + add esi,ebx + mov ebx, [eax+4] + sub ebx,11 + add [esp+20],ebx + +L_buf_not_used: + mov [eax+0],esi + + mov ebx,1 + shl ebx,cl + dec ebx + + + + + + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_hold + + + + psrlq mm0,mm1 + movd ebp,mm0 + + emms + +L_update_hold: + + + + and ebp,ebx + mov [edx+hold_state],ebp + + + + + mov ebx, [esp+20] + cmp ebx,esi + jbe L_last_is_smaller + + sub ebx,esi + add ebx,11 + mov [eax+4],ebx + jmp L_fixup_out +L_last_is_smaller: + sub esi,ebx + neg esi + add esi,11 + mov [eax+4],esi + + + + +L_fixup_out: + + mov ebx, [esp+16] + cmp ebx,edi + jbe L_end_is_smaller + + sub ebx,edi + add ebx,257 + mov [eax+16],ebx + jmp L_done +L_end_is_smaller: + sub edi,ebx + neg edi + add edi,257 + mov [eax+16],edi + + + + + +L_done: + add esp,64 + popfd + pop ebx + pop ebp + pop esi + pop edi + ret +_inflate_fast endp + +_TEXT ends +end diff --git a/deps/zlib-1.2.10/contrib/masmx86/match686.asm b/deps/zlib-1.2.10/contrib/masmx86/match686.asm new file mode 100644 index 0000000..3b09212 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/masmx86/match686.asm @@ -0,0 +1,479 @@ +; match686.asm -- Asm portion of the optimized longest_match for 32 bits x86 +; Copyright (C) 1995-1996 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; File written by Gilles Vollant, by converting match686.S from Brian Raiter +; for MASM. This is as assembly version of longest_match +; from Jean-loup Gailly in deflate.c +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is distributed in +; http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 +; +; this file contain two implementation of longest_match +; +; this longest_match was written by Brian raiter (1998), optimized for Pentium Pro +; (and the faster known version of match_init on modern Core 2 Duo and AMD Phenom) +; +; for using an assembly version of longest_match, you need define ASMV in project +; +; compile the asm file running +; ml /coff /Zi /c /Flmatch686.lst match686.asm +; and do not include match686.obj in your project +; +; note: contrib of zLib 1.2.3 and earlier contained both a deprecated version for +; Pentium (prior Pentium Pro) and this version for Pentium Pro and modern processor +; with autoselect (with cpu detection code) +; if you want support the old pentium optimization, you can still use these version +; +; this file is not optimized for old pentium, but it compatible with all x86 32 bits +; processor (starting 80386) +; +; +; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2 + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ + + NbStack equ 76 + cur_match equ dword ptr[esp+NbStack-0] + str_s equ dword ptr[esp+NbStack-4] +; 5 dword on top (ret,ebp,esi,edi,ebx) + adrret equ dword ptr[esp+NbStack-8] + pushebp equ dword ptr[esp+NbStack-12] + pushedi equ dword ptr[esp+NbStack-16] + pushesi equ dword ptr[esp+NbStack-20] + pushebx equ dword ptr[esp+NbStack-24] + + chain_length equ dword ptr [esp+NbStack-28] + limit equ dword ptr [esp+NbStack-32] + best_len equ dword ptr [esp+NbStack-36] + window equ dword ptr [esp+NbStack-40] + prev equ dword ptr [esp+NbStack-44] + scan_start equ word ptr [esp+NbStack-48] + wmask equ dword ptr [esp+NbStack-52] + match_start_ptr equ dword ptr [esp+NbStack-56] + nice_match equ dword ptr [esp+NbStack-60] + scan equ dword ptr [esp+NbStack-64] + + windowlen equ dword ptr [esp+NbStack-68] + match_start equ dword ptr [esp+NbStack-72] + strend equ dword ptr [esp+NbStack-76] + NbStackAdd equ (NbStack-24) + + .386p + + name gvmatch + .MODEL FLAT + + + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + zlib1222add equ 8 + +; Note : these value are good with a 8 bytes boundary pack structure + dep_chain_length equ 74h+zlib1222add + dep_window equ 30h+zlib1222add + dep_strstart equ 64h+zlib1222add + dep_prev_length equ 70h+zlib1222add + dep_nice_match equ 88h+zlib1222add + dep_w_size equ 24h+zlib1222add + dep_prev equ 38h+zlib1222add + dep_w_mask equ 2ch+zlib1222add + dep_good_match equ 84h+zlib1222add + dep_match_start equ 68h+zlib1222add + dep_lookahead equ 6ch+zlib1222add + + +_TEXT segment + +IFDEF NOUNDERLINE + public longest_match + public match_init +ELSE + public _longest_match + public _match_init +ENDIF + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + + +MAX_MATCH equ 258 +MIN_MATCH equ 3 +MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1) +MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h) + + +;;; stack frame offsets + +chainlenwmask equ esp + 0 ; high word: current chain len + ; low word: s->wmask +window equ esp + 4 ; local copy of s->window +windowbestlen equ esp + 8 ; s->window + bestlen +scanstart equ esp + 16 ; first two bytes of string +scanend equ esp + 12 ; last two bytes of string +scanalign equ esp + 20 ; dword-misalignment of string +nicematch equ esp + 24 ; a good enough match size +bestlen equ esp + 28 ; size of best match so far +scan equ esp + 32 ; ptr to string wanting match + +LocalVarsSize equ 36 +; saved ebx byte esp + 36 +; saved edi byte esp + 40 +; saved esi byte esp + 44 +; saved ebp byte esp + 48 +; return address byte esp + 52 +deflatestate equ esp + 56 ; the function arguments +curmatch equ esp + 60 + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +dsWSize equ 36+zlib1222add +dsWMask equ 44+zlib1222add +dsWindow equ 48+zlib1222add +dsPrev equ 56+zlib1222add +dsMatchLen equ 88+zlib1222add +dsPrevMatch equ 92+zlib1222add +dsStrStart equ 100+zlib1222add +dsMatchStart equ 104+zlib1222add +dsLookahead equ 108+zlib1222add +dsPrevLen equ 112+zlib1222add +dsMaxChainLen equ 116+zlib1222add +dsGoodMatch equ 132+zlib1222add +dsNiceMatch equ 136+zlib1222add + + +;;; match686.asm -- Pentium-Pro-optimized version of longest_match() +;;; Written for zlib 1.1.2 +;;; Copyright (C) 1998 Brian Raiter +;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html +;;; +;; +;; This software is provided 'as-is', without any express or implied +;; warranty. In no event will the authors be held liable for any damages +;; arising from the use of this software. +;; +;; Permission is granted to anyone to use this software for any purpose, +;; including commercial applications, and to alter it and redistribute it +;; freely, subject to the following restrictions: +;; +;; 1. The origin of this software must not be misrepresented; you must not +;; claim that you wrote the original software. If you use this software +;; in a product, an acknowledgment in the product documentation would be +;; appreciated but is not required. +;; 2. Altered source versions must be plainly marked as such, and must not be +;; misrepresented as being the original software +;; 3. This notice may not be removed or altered from any source distribution. +;; + +;GLOBAL _longest_match, _match_init + + +;SECTION .text + +;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch) + +;_longest_match: + IFDEF NOUNDERLINE + longest_match proc near + ELSE + _longest_match proc near + ENDIF +.FPO (9, 4, 0, 0, 1, 0) + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + push ebp + push edi + push esi + push ebx + sub esp, LocalVarsSize + +;;; Retrieve the function arguments. ecx will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + + mov edx, [deflatestate] + mov ecx, [curmatch] + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov eax, [edx + dsPrevLen] + mov ebx, [edx + dsGoodMatch] + cmp eax, ebx + mov eax, [edx + dsWMask] + mov ebx, [edx + dsMaxChainLen] + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + mov [chainlenwmask], ebx + +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + mov eax, [edx + dsNiceMatch] + mov ebx, [edx + dsLookahead] + cmp ebx, eax + jl LookaheadLess + mov ebx, eax +LookaheadLess: mov [nicematch], ebx + +;;; register Bytef *scan = s->window + s->strstart; + + mov esi, [edx + dsWindow] + mov [window], esi + mov ebp, [edx + dsStrStart] + lea edi, [esi + ebp] + mov [scan], edi + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov eax, edi + neg eax + and eax, 3 + mov [scanalign], eax + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + mov eax, [edx + dsWSize] + sub eax, MIN_LOOKAHEAD + sub ebp, eax + jg LimitPositive + xor ebp, ebp +LimitPositive: + +;;; int best_len = s->prev_length; + + mov eax, [edx + dsPrevLen] + mov [bestlen], eax + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + add esi, eax + mov [windowbestlen], esi + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx ebx, word ptr [edi] + mov [scanstart], ebx + movzx ebx, word ptr [edi + eax - 1] + mov [scanend], ebx + mov edi, [edx + dsPrev] + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + jmp short LoopEntry + +align 4 + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; ecx = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and ecx, edx + movzx ecx, word ptr [edi + ecx*2] + cmp ecx, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow +LoopEntry: movzx eax, word ptr [esi + ecx - 1] + cmp eax, ebx + jnz LookupLoop + mov eax, [window] + movzx eax, word ptr [eax + ecx] + cmp eax, [scanstart] + jnz LookupLoop + +;;; Store the current value of chainlen. + + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + mov esi, [window] + mov edi, [scan] + add esi, ecx + mov eax, [scanalign] + mov edx, 0fffffef8h; -(MAX_MATCH_8) + lea edi, [edi + eax + 0108h] ;MAX_MATCH_8] + lea esi, [esi + eax + 0108h] ;MAX_MATCH_8] + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust edx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (esi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + +LoopCmps: + mov eax, [esi + edx] + xor eax, [edi + edx] + jnz LeaveLoopCmps + mov eax, [esi + edx + 4] + xor eax, [edi + edx + 4] + jnz LeaveLoopCmps4 + add edx, 8 + jnz LoopCmps + jmp short LenMaximum +LeaveLoopCmps4: add edx, 4 +LeaveLoopCmps: test eax, 0000FFFFh + jnz LenLower + add edx, 2 + shr eax, 16 +LenLower: sub al, 1 + adc edx, 0 + +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea eax, [edi + edx] + mov edi, [scan] + sub eax, edi + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. + + mov edx, [deflatestate] + mov ebx, [bestlen] + cmp eax, ebx + jg LongerMatch + mov esi, [windowbestlen] + mov edi, [edx + dsPrev] + mov ebx, [scanend] + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: mov ebx, [nicematch] + mov [bestlen], eax + mov [edx + dsMatchStart], ecx + cmp eax, ebx + jge LeaveNow + mov esi, [window] + add esi, eax + mov [windowbestlen], esi + movzx ebx, word ptr [edi + eax - 1] + mov edi, [edx + dsPrev] + mov [scanend], ebx + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: mov edx, [deflatestate] + mov dword ptr [bestlen], MAX_MATCH + mov [edx + dsMatchStart], ecx + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: + mov edx, [deflatestate] + mov ebx, [bestlen] + mov eax, [edx + dsLookahead] + cmp ebx, eax + jg LookaheadRet + mov eax, ebx +LookaheadRet: + +;;; Restore the stack and return from whence we came. + + add esp, LocalVarsSize + pop ebx + pop esi + pop edi + pop ebp + + ret +; please don't remove this string ! +; Your can freely use match686 in any free or commercial app if you don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah + + + IFDEF NOUNDERLINE + longest_match endp + ELSE + _longest_match endp + ENDIF + + IFDEF NOUNDERLINE + match_init proc near + ret + match_init endp + ELSE + _match_init proc near + ret + _match_init endp + ENDIF + + +_TEXT ends +end diff --git a/deps/zlib-1.2.10/contrib/masmx86/readme.txt b/deps/zlib-1.2.10/contrib/masmx86/readme.txt new file mode 100644 index 0000000..3271f72 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/masmx86/readme.txt @@ -0,0 +1,27 @@ + +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(). + + +Use instructions +---------------- +Assemble using MASM, and copy the object files into the zlib source +directory, then run the appropriate makefile, as suggested below. You can +donwload MASM from here: + + http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 + +You can also get objects files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +Build instructions +------------------ +* With Microsoft C and MASM: +nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" + +* With Borland C and TASM: +make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" OBJPA="+match686c.obj+match686.obj+inffas32.obj" + diff --git a/deps/zlib-1.2.10/contrib/minizip/Makefile b/deps/zlib-1.2.10/contrib/minizip/Makefile new file mode 100644 index 0000000..84eaad2 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/Makefile @@ -0,0 +1,25 @@ +CC=cc +CFLAGS=-O -I../.. + +UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a +ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a + +.c.o: + $(CC) -c $(CFLAGS) $*.c + +all: miniunz minizip + +miniunz: $(UNZ_OBJS) + $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS) + +minizip: $(ZIP_OBJS) + $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) + +test: miniunz minizip + ./minizip test readme.txt + ./miniunz -l test.zip + mv readme.txt readme.old + ./miniunz test.zip + +clean: + /bin/rm -f *.o *~ minizip miniunz diff --git a/deps/zlib-1.2.10/contrib/minizip/Makefile.am b/deps/zlib-1.2.10/contrib/minizip/Makefile.am new file mode 100644 index 0000000..d343011 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/Makefile.am @@ -0,0 +1,45 @@ +lib_LTLIBRARIES = libminizip.la + +if COND_DEMOS +bin_PROGRAMS = miniunzip minizip +endif + +zlib_top_srcdir = $(top_srcdir)/../.. +zlib_top_builddir = $(top_builddir)/../.. + +AM_CPPFLAGS = -I$(zlib_top_srcdir) +AM_LDFLAGS = -L$(zlib_top_builddir) + +if WIN32 +iowin32_src = iowin32.c +iowin32_h = iowin32.h +endif + +libminizip_la_SOURCES = \ + ioapi.c \ + mztools.c \ + unzip.c \ + zip.c \ + ${iowin32_src} + +libminizip_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 -lz + +minizip_includedir = $(includedir)/minizip +minizip_include_HEADERS = \ + crypt.h \ + ioapi.h \ + mztools.h \ + unzip.h \ + zip.h \ + ${iowin32_h} + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = minizip.pc + +EXTRA_PROGRAMS = miniunzip minizip + +miniunzip_SOURCES = miniunz.c +miniunzip_LDADD = libminizip.la + +minizip_SOURCES = minizip.c +minizip_LDADD = libminizip.la -lz diff --git a/deps/zlib-1.2.10/contrib/minizip/MiniZip64_Changes.txt b/deps/zlib-1.2.10/contrib/minizip/MiniZip64_Changes.txt new file mode 100644 index 0000000..13a1bd9 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/MiniZip64_Changes.txt @@ -0,0 +1,6 @@ + +MiniZip 1.1 was derrived from MiniZip at version 1.01f + +Change in 1.0 (Okt 2009) + - **TODO - Add history** + diff --git a/deps/zlib-1.2.10/contrib/minizip/MiniZip64_info.txt b/deps/zlib-1.2.10/contrib/minizip/MiniZip64_info.txt new file mode 100644 index 0000000..57d7152 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/MiniZip64_info.txt @@ -0,0 +1,74 @@ +MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson + +Introduction +--------------------- +MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) + +When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. +All possible work was done for compatibility. + + +Background +--------------------- +When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64 +support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) + +That was used as a starting point. And after that ZIP64 support was added to zip.c +some refactoring and code cleanup was also done. + + +Changed from MiniZip 1.0 to MiniZip 1.1 +--------------------------------------- +* Added ZIP64 support for unzip ( by Even Rouault ) +* Added ZIP64 support for zip ( by Mathias Svensson ) +* Reverted some changed that Even Rouault did. +* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. +* Added unzip patch for BZIP Compression method (patch create by Daniel Borca) +* Added BZIP Compress method for zip +* Did some refactoring and code cleanup + + +Credits + + Gilles Vollant - Original MiniZip author + Even Rouault - ZIP64 unzip Support + Daniel Borca - BZip Compression method support in unzip + Mathias Svensson - ZIP64 zip support + Mathias Svensson - BZip Compression method support in zip + + Resources + + ZipLayout http://result42.com/projects/ZipFileLayout + Command line tool for Windows that shows the layout and information of the headers in a zip archive. + Used when debugging and validating the creation of zip files using MiniZip64 + + + ZIP App Note http://www.pkware.com/documents/casestudies/APPNOTE.TXT + Zip File specification + + +Notes. + * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. + +License +---------------------------------------------------------- + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +---------------------------------------------------------- + diff --git a/deps/zlib-1.2.10/contrib/minizip/configure.ac b/deps/zlib-1.2.10/contrib/minizip/configure.ac new file mode 100644 index 0000000..bbb2283 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/configure.ac @@ -0,0 +1,32 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_INIT([minizip], [1.2.10], [bugzilla.redhat.com]) +AC_CONFIG_SRCDIR([minizip.c]) +AM_INIT_AUTOMAKE([foreign]) +LT_INIT + +AC_MSG_CHECKING([whether to build example programs]) +AC_ARG_ENABLE([demos], AC_HELP_STRING([--enable-demos], [build example programs])) +AM_CONDITIONAL([COND_DEMOS], [test "$enable_demos" = yes]) +if test "$enable_demos" = yes +then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + +case "${host}" in + *-mingw* | mingw*) + WIN32="yes" + ;; + *) + ;; +esac +AM_CONDITIONAL([WIN32], [test "${WIN32}" = "yes"]) + + +AC_SUBST([HAVE_UNISTD_H], [0]) +AC_CHECK_HEADER([unistd.h], [HAVE_UNISTD_H=1], []) +AC_CONFIG_FILES([Makefile minizip.pc]) +AC_OUTPUT diff --git a/deps/zlib-1.2.10/contrib/minizip/crypt.h b/deps/zlib-1.2.10/contrib/minizip/crypt.h new file mode 100644 index 0000000..1e9e820 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/crypt.h @@ -0,0 +1,131 @@ +/* crypt.h -- base code for crypt/uncrypt ZIPfile + + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This code is a modified version of crypting code in Infozip distribution + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + If you don't need crypting in your application, just define symbols + NOCRYPT and NOUNCRYPT. + + This code support the "Traditional PKWARE Encryption". + + The new AES encryption added on Zip format by Winzip (see the page + http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong + Encryption is not supported. +*/ + +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + +/*********************************************************************** + * Return the next byte in the pseudo-random sequence + */ +static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) +{ + unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an + * unpredictable manner on 16-bit systems; not a problem + * with any known compiler so far, though */ + + temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; + return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); +} + +/*********************************************************************** + * Update the encryption keys with the next byte of plain text + */ +static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) +{ + (*(pkeys+0)) = CRC32((*(pkeys+0)), c); + (*(pkeys+1)) += (*(pkeys+0)) & 0xff; + (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; + { + register int keyshift = (int)((*(pkeys+1)) >> 24); + (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); + } + return c; +} + + +/*********************************************************************** + * Initialize the encryption keys and the random header according to + * the given password. + */ +static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab) +{ + *(pkeys+0) = 305419896L; + *(pkeys+1) = 591751049L; + *(pkeys+2) = 878082192L; + while (*passwd != '\0') { + update_keys(pkeys,pcrc_32_tab,(int)*passwd); + passwd++; + } +} + +#define zdecode(pkeys,pcrc_32_tab,c) \ + (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) + +#define zencode(pkeys,pcrc_32_tab,c,t) \ + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED + +#define RAND_HEAD_LEN 12 + /* "last resort" source for second part of crypt seed pattern */ +# ifndef ZCR_SEED2 +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# endif + +static int crypthead(const char* passwd, /* password string */ + unsigned char* buf, /* where to write header */ + int bufSize, + unsigned long* pkeys, + const z_crc_t* pcrc_32_tab, + unsigned long crcForCrypting) +{ + int n; /* index in random header */ + int t; /* temporary */ + int c; /* random byte */ + unsigned char header[RAND_HEAD_LEN-2]; /* random header */ + static unsigned calls = 0; /* ensure different random header each time */ + + if (bufSize> 7) & 0xff; + header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); + } + /* Encrypt random header (last two bytes is high word of crc) */ + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); + } + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; +} + +#endif diff --git a/deps/zlib-1.2.10/contrib/minizip/ioapi.c b/deps/zlib-1.2.10/contrib/minizip/ioapi.c new file mode 100644 index 0000000..7f5c191 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/ioapi.c @@ -0,0 +1,247 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS))) + #define _CRT_SECURE_NO_WARNINGS +#endif + +#if defined(__APPLE__) || defined(IOAPI_NO_64) +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include "ioapi.h" + +voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) +{ + if (pfilefunc->zfile_func64.zopen64_file != NULL) + return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); + else + { + return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); + } +} + +long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); + else + { + uLong offsetTruncated = (uLong)offset; + if (offsetTruncated != offset) + return -1; + else + return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); + } +} + +ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); + else + { + uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); + if ((tell_uLong) == MAXU32) + return (ZPOS64_T)-1; + else + return tell_uLong; + } +} + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) +{ + p_filefunc64_32->zfile_func64.zopen64_file = NULL; + p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; + p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; + p_filefunc64_32->zfile_func64.ztell64_file = NULL; + p_filefunc64_32->zfile_func64.zseek64_file = NULL; + p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; + p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; + p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; +} + + + +static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); +static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); +static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); +static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); +static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); + +static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + +static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = FOPEN_FUNC((const char*)filename, mode_fopen); + return file; +} + + +static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + + +static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret; + ret = FTELLO_FUNC((FILE *)stream); + return ret; +} + +static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + if (fseek((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + return ret; +} + +static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + + if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + + return ret; +} + + +static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = fopen64_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell64_file = ftell64_file_func; + pzlib_filefunc_def->zseek64_file = fseek64_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/deps/zlib-1.2.10/contrib/minizip/ioapi.h b/deps/zlib-1.2.10/contrib/minizip/ioapi.h new file mode 100644 index 0000000..8dcbdb0 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/ioapi.h @@ -0,0 +1,208 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + + Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) + Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. + More if/def section may be needed to support other platforms + Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. + (but you should use iowin32.c for windows instead) + +*/ + +#ifndef _ZLIBIOAPI64_H +#define _ZLIBIOAPI64_H + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + + // Linux needs this to support file operation on files larger then 4+GB + // But might need better if/def to select just the platforms that needs them. + + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif + +#endif + +#include +#include +#include "zlib.h" + +#if defined(USE_FILE32API) +#define fopen64 fopen +#define ftello64 ftell +#define fseeko64 fseek +#else +#ifdef __FreeBSD__ +#define fopen64 fopen +#define ftello64 ftello +#define fseeko64 fseeko +#endif +#ifdef _MSC_VER + #define fopen64 fopen + #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) + #define ftello64 _ftelli64 + #define fseeko64 _fseeki64 + #else // old MSC + #define ftello64 ftell + #define fseeko64 fseek + #endif +#endif +#endif + +/* +#ifndef ZPOS64_T + #ifdef _WIN32 + #define ZPOS64_T fpos_t + #else + #include + #define ZPOS64_T uint64_t + #endif +#endif +*/ + +#ifdef HAVE_MINIZIP64_CONF_H +#include "mz64conf.h" +#endif + +/* a type choosen by DEFINE */ +#ifdef HAVE_64BIT_INT_CUSTOM +typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; +#else +#ifdef HAS_STDINT_H +#include "stdint.h" +typedef uint64_t ZPOS64_T; +#else + +/* Maximum unsigned 32-bit value used as placeholder for zip64 */ +#define MAXU32 0xffffffff + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef unsigned __int64 ZPOS64_T; +#else +typedef unsigned long long int ZPOS64_T; +#endif +#endif +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) + #define ZCALLBACK CALLBACK + #else + #define ZCALLBACK + #endif +#endif + + + + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); + + +/* here is the "old" 32 bits structure structure */ +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + +typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); + +typedef struct zlib_filefunc64_def_s +{ + open64_file_func zopen64_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell64_file_func ztell64_file; + seek64_file_func zseek64_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc64_def; + +void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +/* now internal definition, only for zip.c and unzip.h */ +typedef struct zlib_filefunc64_32_def_s +{ + zlib_filefunc64_def zfile_func64; + open_file_func zopen32_file; + tell_file_func ztell32_file; + seek_file_func zseek32_file; +} zlib_filefunc64_32_def; + + +#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) +//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) +#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) + +voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); +long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); +ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); + +#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) +#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) +#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/zlib-1.2.10/contrib/minizip/iowin32.c b/deps/zlib-1.2.10/contrib/minizip/iowin32.c new file mode 100644 index 0000000..274f39e --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/iowin32.c @@ -0,0 +1,462 @@ +/* iowin32.c -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + +#include "zlib.h" +#include "ioapi.h" +#include "iowin32.h" + +#ifndef INVALID_HANDLE_VALUE +#define INVALID_HANDLE_VALUE (0xFFFFFFFF) +#endif + +#ifndef INVALID_SET_FILE_POINTER +#define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + + +// see Include/shared/winapifamily.h in the Windows Kit +#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) +#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) +#define IOWIN32_USING_WINRT_API 1 +#endif +#endif + +voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); +uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream)); +long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); +int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); + +typedef struct +{ + HANDLE hf; + int error; +} WIN32FILE_IOWIN; + + +static void win32_translate_open_mode(int mode, + DWORD* lpdwDesiredAccess, + DWORD* lpdwCreationDisposition, + DWORD* lpdwShareMode, + DWORD* lpdwFlagsAndAttributes) +{ + *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; + + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + { + *lpdwDesiredAccess = GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + *lpdwShareMode = FILE_SHARE_READ; + } + else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + } + else if (mode & ZLIB_FILEFUNC_MODE_CREATE) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = CREATE_ALWAYS; + } +} + +static voidpf win32_build_iowin(HANDLE hFile) +{ + voidpf ret=NULL; + + if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) + { + WIN32FILE_IOWIN w32fiow; + w32fiow.hf = hFile; + w32fiow.error = 0; + ret = malloc(sizeof(WIN32FILE_IOWIN)); + + if (ret==NULL) + CloseHandle(hFile); + else + *((WIN32FILE_IOWIN*)ret) = w32fiow; + } + return ret; +} + +voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API +#ifdef UNICODE + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#endif +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition,NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API +#ifdef UNICODE + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#endif +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!ReadFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + + +uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!WriteFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + +static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) +{ +#ifdef IOWIN32_USING_WINRT_API + return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod); +#else + LONG lHigh = pos.HighPart; + DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, dwMoveMethod); + BOOL fOk = TRUE; + if (dwNewPos == 0xFFFFFFFF) + if (GetLastError() != NO_ERROR) + fOk = FALSE; + if ((newPos != NULL) && (fOk)) + { + newPos->LowPart = dwNewPos; + newPos->HighPart = lHigh; + } + return fOk; +#endif +} + +long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) +{ + long ret=-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + LARGE_INTEGER pos; + pos.QuadPart = 0; + + if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=(long)pos.LowPart; + } + return ret; +} + +ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret= (ZPOS64_T)-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + if (hFile) + { + LARGE_INTEGER pos; + pos.QuadPart = 0; + + if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = (ZPOS64_T)-1; + } + else + ret=pos.QuadPart; + } + return ret; +} + + +long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + + long ret=-1; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile != NULL) + { + LARGE_INTEGER pos; + pos.QuadPart = offset; + if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + long ret=-1; + + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile) + { + LARGE_INTEGER pos; + pos.QuadPart = offset; + if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) +{ + int ret=-1; + + if (stream!=NULL) + { + HANDLE hFile; + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + CloseHandle(hFile); + ret=0; + } + free(stream); + } + return ret; +} + +int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) +{ + int ret=-1; + if (stream!=NULL) + { + ret = ((WIN32FILE_IOWIN*)stream) -> error; + } + return ret; +} + +void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen_file = win32_open_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell_file = win32_tell_file_func; + pzlib_filefunc_def->zseek_file = win32_seek_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/deps/zlib-1.2.10/contrib/minizip/iowin32.h b/deps/zlib-1.2.10/contrib/minizip/iowin32.h new file mode 100644 index 0000000..0ca0969 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/iowin32.h @@ -0,0 +1,28 @@ +/* iowin32.h -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); +void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); + +#ifdef __cplusplus +} +#endif diff --git a/deps/zlib-1.2.10/contrib/minizip/make_vms.com b/deps/zlib-1.2.10/contrib/minizip/make_vms.com new file mode 100644 index 0000000..9ac13a9 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/make_vms.com @@ -0,0 +1,25 @@ +$ if f$search("ioapi.h_orig") .eqs. "" then copy ioapi.h ioapi.h_orig +$ open/write zdef vmsdefs.h +$ copy sys$input: zdef +$ deck +#define unix +#define fill_zlib_filefunc64_32_def_from_filefunc32 fillzffunc64from +#define Write_Zip64EndOfCentralDirectoryLocator Write_Zip64EoDLocator +#define Write_Zip64EndOfCentralDirectoryRecord Write_Zip64EoDRecord +#define Write_EndOfCentralDirectoryRecord Write_EoDRecord +$ eod +$ close zdef +$ copy vmsdefs.h,ioapi.h_orig ioapi.h +$ cc/include=[--]/prefix=all ioapi.c +$ cc/include=[--]/prefix=all miniunz.c +$ cc/include=[--]/prefix=all unzip.c +$ cc/include=[--]/prefix=all minizip.c +$ cc/include=[--]/prefix=all zip.c +$ link miniunz,unzip,ioapi,[--]libz.olb/lib +$ link minizip,zip,ioapi,[--]libz.olb/lib +$ mcr []minizip test minizip_info.txt +$ mcr []miniunz -l test.zip +$ rename minizip_info.txt; minizip_info.txt_old +$ mcr []miniunz test.zip +$ delete test.zip;* +$exit diff --git a/deps/zlib-1.2.10/contrib/minizip/miniunz.c b/deps/zlib-1.2.10/contrib/minizip/miniunz.c new file mode 100644 index 0000000..3d65401 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/miniunz.c @@ -0,0 +1,660 @@ +/* + miniunz.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#ifdef __APPLE__ +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# include +# include +#else +# include +# include +#endif + + +#include "unzip.h" + +#define CASESENSITIVITY (0) +#define WRITEBUFFERSIZE (8192) +#define MAXFILENAME (256) + +#ifdef _WIN32 +#define USEWIN32IOAPI +#include "iowin32.h" +#endif +/* + mini unzip, demo of unzip package + + usage : + Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] + + list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT + if it exists +*/ + + +/* change_file_date : change the date/time of a file + filename : the filename of the file where date/time must be modified + dosdate : the new date at the MSDos format (4 bytes) + tmu_date : the SAME new date at the tm_unz format */ +void change_file_date(filename,dosdate,tmu_date) + const char *filename; + uLong dosdate; + tm_unz tmu_date; +{ +#ifdef _WIN32 + HANDLE hFile; + FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; + + hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, + 0,NULL,OPEN_EXISTING,0,NULL); + GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); + DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); + LocalFileTimeToFileTime(&ftLocal,&ftm); + SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); + CloseHandle(hFile); +#else +#ifdef unix || __APPLE__ + struct utimbuf ut; + struct tm newdate; + newdate.tm_sec = tmu_date.tm_sec; + newdate.tm_min=tmu_date.tm_min; + newdate.tm_hour=tmu_date.tm_hour; + newdate.tm_mday=tmu_date.tm_mday; + newdate.tm_mon=tmu_date.tm_mon; + if (tmu_date.tm_year > 1900) + newdate.tm_year=tmu_date.tm_year - 1900; + else + newdate.tm_year=tmu_date.tm_year ; + newdate.tm_isdst=-1; + + ut.actime=ut.modtime=mktime(&newdate); + utime(filename,&ut); +#endif +#endif +} + + +/* mymkdir and change_file_date are not 100 % portable + As I don't know well Unix, I wait feedback for the unix portion */ + +int mymkdir(dirname) + const char* dirname; +{ + int ret=0; +#ifdef _WIN32 + ret = _mkdir(dirname); +#elif unix + ret = mkdir (dirname,0775); +#elif __APPLE__ + ret = mkdir (dirname,0775); +#endif + return ret; +} + +int makedir (newdir) + char *newdir; +{ + char *buffer ; + char *p; + int len = (int)strlen(newdir); + + if (len <= 0) + return 0; + + buffer = (char*)malloc(len+1); + if (buffer==NULL) + { + printf("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + strcpy(buffer,newdir); + + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mymkdir(buffer) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mymkdir(buffer) == -1) && (errno == ENOENT)) + { + printf("couldn't create directory %s\n",buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + +void do_banner() +{ + printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); + printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); +} + +void do_help() +{ + printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ + " -e Extract without pathname (junk paths)\n" \ + " -x Extract with pathname\n" \ + " -v list files\n" \ + " -l list files\n" \ + " -d directory to extract into\n" \ + " -o overwrite files without prompting\n" \ + " -p extract crypted file using password\n\n"); +} + +void Display64BitsSize(ZPOS64_T n, int size_char) +{ + /* to avoid compatibility problem , we do here the conversion */ + char number[21]; + int offset=19; + int pos_string = 19; + number[20]=0; + for (;;) { + number[offset]=(char)((n%10)+'0'); + if (number[offset] != '0') + pos_string=offset; + n/=10; + if (offset==0) + break; + offset--; + } + { + int size_display_string = 19-pos_string; + while (size_char > size_display_string) + { + size_char--; + printf(" "); + } + } + + printf("%s",&number[pos_string]); +} + +int do_list(uf) + unzFile uf; +{ + uLong i; + unz_global_info64 gi; + int err; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); + printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); + for (i=0;i0) + ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); + + /* display a '*' if the file is crypted */ + if ((file_info.flag & 1) != 0) + charCrypt='*'; + + if (file_info.compression_method==0) + string_method="Stored"; + else + if (file_info.compression_method==Z_DEFLATED) + { + uInt iLevel=(uInt)((file_info.flag & 0x6)/2); + if (iLevel==0) + string_method="Defl:N"; + else if (iLevel==1) + string_method="Defl:X"; + else if ((iLevel==2) || (iLevel==3)) + string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ + } + else + if (file_info.compression_method==Z_BZIP2ED) + { + string_method="BZip2 "; + } + else + string_method="Unkn. "; + + Display64BitsSize(file_info.uncompressed_size,7); + printf(" %6s%c",string_method,charCrypt); + Display64BitsSize(file_info.compressed_size,7); + printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", + ratio, + (uLong)file_info.tmu_date.tm_mon + 1, + (uLong)file_info.tmu_date.tm_mday, + (uLong)file_info.tmu_date.tm_year % 100, + (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, + (uLong)file_info.crc,filename_inzip); + if ((i+1)='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + } + + if (rep == 'N') + skip = 1; + + if (rep == 'A') + *popt_overwrite=1; + } + + if ((skip==0) && (err==UNZ_OK)) + { + fout=FOPEN_FUNC(write_filename,"wb"); + /* some zipfile don't contain directory alone before file */ + if ((fout==NULL) && ((*popt_extract_without_path)==0) && + (filename_withoutpath!=(char*)filename_inzip)) + { + char c=*(filename_withoutpath-1); + *(filename_withoutpath-1)='\0'; + makedir(write_filename); + *(filename_withoutpath-1)=c; + fout=FOPEN_FUNC(write_filename,"wb"); + } + + if (fout==NULL) + { + printf("error opening %s\n",write_filename); + } + } + + if (fout!=NULL) + { + printf(" extracting: %s\n",write_filename); + + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + printf("error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + if (err>0) + if (fwrite(buf,err,1,fout)!=1) + { + printf("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + } + while (err>0); + if (fout) + fclose(fout); + + if (err==0) + change_file_date(write_filename,file_info.dosDate, + file_info.tmu_date); + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else + unzCloseCurrentFile(uf); /* don't lose the error */ + } + + free(buf); + return err; +} + + +int do_extract(uf,opt_extract_without_path,opt_overwrite,password) + unzFile uf; + int opt_extract_without_path; + int opt_overwrite; + const char* password; +{ + uLong i; + unz_global_info64 gi; + int err; + FILE* fout=NULL; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + + for (i=0;i insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +miniunzip - uncompress and examine ZIP archives +.SH SYNOPSIS +.B miniunzip +.RI [ -exvlo ] +zipfile [ files_to_extract ] [-d tempdir] +.SH DESCRIPTION +.B minizip +is a simple tool which allows the extraction of compressed file +archives in the ZIP format used by the MS-DOS utility PKZIP. It was +written as a demonstration of the +.IR zlib (3) +library and therefore lack many of the features of the +.IR unzip (1) +program. +.SH OPTIONS +A number of options are supported. With the exception of +.BI \-d\ tempdir +these must be supplied before any +other arguments and are: +.TP +.BI \-l\ ,\ \-\-v +List the files in the archive without extracting them. +.TP +.B \-o +Overwrite files without prompting for confirmation. +.TP +.B \-x +Extract files (default). +.PP +The +.I zipfile +argument is the name of the archive to process. The next argument can be used +to specify a single file to extract from the archive. + +Lastly, the following option can be specified at the end of the command-line: +.TP +.BI \-d\ tempdir +Extract the archive in the directory +.I tempdir +rather than the current directory. +.SH SEE ALSO +.BR minizip (1), +.BR zlib (3), +.BR unzip (1). +.SH AUTHOR +This program was written by Gilles Vollant. This manual page was +written by Mark Brown . The -d tempdir option +was added by Dirk Eddelbuettel . diff --git a/deps/zlib-1.2.10/contrib/minizip/minizip.1 b/deps/zlib-1.2.10/contrib/minizip/minizip.1 new file mode 100644 index 0000000..1154484 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/minizip.1 @@ -0,0 +1,46 @@ +.\" Hey, EMACS: -*- nroff -*- +.TH minizip 1 "May 2, 2001" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +minizip - create ZIP archives +.SH SYNOPSIS +.B minizip +.RI [ -o ] +zipfile [ " files" ... ] +.SH DESCRIPTION +.B minizip +is a simple tool which allows the creation of compressed file archives +in the ZIP format used by the MS-DOS utility PKZIP. It was written as +a demonstration of the +.IR zlib (3) +library and therefore lack many of the features of the +.IR zip (1) +program. +.SH OPTIONS +The first argument supplied is the name of the ZIP archive to create or +.RI -o +in which case it is ignored and the second argument treated as the +name of the ZIP file. If the ZIP file already exists it will be +overwritten. +.PP +Subsequent arguments specify a list of files to place in the ZIP +archive. If none are specified then an empty archive will be created. +.SH SEE ALSO +.BR miniunzip (1), +.BR zlib (3), +.BR zip (1). +.SH AUTHOR +This program was written by Gilles Vollant. This manual page was +written by Mark Brown . + diff --git a/deps/zlib-1.2.10/contrib/minizip/minizip.c b/deps/zlib-1.2.10/contrib/minizip/minizip.c new file mode 100644 index 0000000..4288962 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/minizip.c @@ -0,0 +1,520 @@ +/* + minizip.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#ifdef __APPLE__ +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# include +# include +#else +# include +# include +# include +# include +#endif + +#include "zip.h" + +#ifdef _WIN32 + #define USEWIN32IOAPI + #include "iowin32.h" +#endif + + + +#define WRITEBUFFERSIZE (16384) +#define MAXFILENAME (256) + +#ifdef _WIN32 +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret = 0; + { + FILETIME ftLocal; + HANDLE hFind; + WIN32_FIND_DATAA ff32; + + hFind = FindFirstFileA(f,&ff32); + if (hFind != INVALID_HANDLE_VALUE) + { + FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); + FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); + FindClose(hFind); + ret = 1; + } + } + return ret; +} +#else +#ifdef unix || __APPLE__ +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret=0; + struct stat s; /* results of stat() */ + struct tm* filedate; + time_t tm_t=0; + + if (strcmp(f,"-")!=0) + { + char name[MAXFILENAME+1]; + int len = strlen(f); + if (len > MAXFILENAME) + len = MAXFILENAME; + + strncpy(name, f,MAXFILENAME-1); + /* strncpy doesnt append the trailing NULL, of the string is too long. */ + name[ MAXFILENAME ] = '\0'; + + if (name[len - 1] == '/') + name[len - 1] = '\0'; + /* not all systems allow stat'ing a file with / appended */ + if (stat(name,&s)==0) + { + tm_t = s.st_mtime; + ret = 1; + } + } + filedate = localtime(&tm_t); + + tmzip->tm_sec = filedate->tm_sec; + tmzip->tm_min = filedate->tm_min; + tmzip->tm_hour = filedate->tm_hour; + tmzip->tm_mday = filedate->tm_mday; + tmzip->tm_mon = filedate->tm_mon ; + tmzip->tm_year = filedate->tm_year; + + return ret; +} +#else +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + return 0; +} +#endif +#endif + + + + +int check_exist_file(filename) + const char* filename; +{ + FILE* ftestexist; + int ret = 1; + ftestexist = FOPEN_FUNC(filename,"rb"); + if (ftestexist==NULL) + ret = 0; + else + fclose(ftestexist); + return ret; +} + +void do_banner() +{ + printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); + printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); +} + +void do_help() +{ + printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ + " -o Overwrite existing file.zip\n" \ + " -a Append to existing file.zip\n" \ + " -0 Store only\n" \ + " -1 Compress faster\n" \ + " -9 Compress better\n\n" \ + " -j exclude path. store only the file name.\n\n"); +} + +/* calculate the CRC32 of a file, + because to encrypt a file, we need known the CRC32 of the file before */ +int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) +{ + unsigned long calculate_crc=0; + int err=ZIP_OK; + FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); + + unsigned long size_read = 0; + unsigned long total_read = 0; + if (fin==NULL) + { + err = ZIP_ERRNO; + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + calculate_crc = crc32(calculate_crc,buf,size_read); + total_read += size_read; + + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + *result_crc=calculate_crc; + printf("file %s crc %lx\n", filenameinzip, calculate_crc); + return err; +} + +int isLargeFile(const char* filename) +{ + int largeFile = 0; + ZPOS64_T pos = 0; + FILE* pFile = FOPEN_FUNC(filename, "rb"); + + if(pFile != NULL) + { + int n = FSEEKO_FUNC(pFile, 0, SEEK_END); + pos = FTELLO_FUNC(pFile); + + printf("File : %s is %lld bytes\n", filename, pos); + + if(pos >= 0xffffffff) + largeFile = 1; + + fclose(pFile); + } + + return largeFile; +} + +int main(argc,argv) + int argc; + char *argv[]; +{ + int i; + int opt_overwrite=0; + int opt_compress_level=Z_DEFAULT_COMPRESSION; + int opt_exclude_path=0; + int zipfilenamearg = 0; + char filename_try[MAXFILENAME+16]; + int zipok; + int err=0; + int size_buf=0; + void* buf=NULL; + const char* password=NULL; + + + do_banner(); + if (argc==1) + { + do_help(); + return 0; + } + else + { + for (i=1;i='0') && (c<='9')) + opt_compress_level = c-'0'; + if ((c=='j') || (c=='J')) + opt_exclude_path = 1; + + if (((c=='p') || (c=='P')) && (i+1='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + if (rep=='N') + zipok = 0; + if (rep=='A') + opt_overwrite = 2; + } + } + + if (zipok==1) + { + zipFile zf; + int errclose; +# ifdef USEWIN32IOAPI + zlib_filefunc64_def ffunc; + fill_win32_filefunc64A(&ffunc); + zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); +# else + zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0); +# endif + + if (zf == NULL) + { + printf("error opening %s\n",filename_try); + err= ZIP_ERRNO; + } + else + printf("creating %s\n",filename_try); + + for (i=zipfilenamearg+1;(i='0') || (argv[i][1]<='9'))) && + (strlen(argv[i]) == 2))) + { + FILE * fin; + int size_read; + const char* filenameinzip = argv[i]; + const char *savefilenameinzip; + zip_fileinfo zi; + unsigned long crcFile=0; + int zip64 = 0; + + zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = + zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; + zi.dosDate = 0; + zi.internal_fa = 0; + zi.external_fa = 0; + filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); + +/* + err = zipOpenNewFileInZip(zf,filenameinzip,&zi, + NULL,0,NULL,0,NULL / * comment * /, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level); +*/ + if ((password != NULL) && (err==ZIP_OK)) + err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); + + zip64 = isLargeFile(filenameinzip); + + /* The path name saved, should not include a leading slash. */ + /*if it did, windows/xp and dynazip couldn't read the zip file. */ + savefilenameinzip = filenameinzip; + while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' ) + { + savefilenameinzip++; + } + + /*should the zip file contain any path at all?*/ + if( opt_exclude_path ) + { + const char *tmpptr; + const char *lastslash = 0; + for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++) + { + if( *tmpptr == '\\' || *tmpptr == '/') + { + lastslash = tmpptr; + } + } + if( lastslash != NULL ) + { + savefilenameinzip = lastslash+1; // base filename follows last slash. + } + } + + /**/ + err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi, + NULL,0,NULL,0,NULL /* comment*/, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level,0, + /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + password,crcFile, zip64); + + if (err != ZIP_OK) + printf("error in opening %s in zipfile\n",filenameinzip); + else + { + fin = FOPEN_FUNC(filenameinzip,"rb"); + if (fin==NULL) + { + err=ZIP_ERRNO; + printf("error in opening %s for reading\n",filenameinzip); + } + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + { + err = zipWriteInFileInZip (zf,buf,size_read); + if (err<0) + { + printf("error in writing %s in the zipfile\n", + filenameinzip); + } + + } + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + if (err<0) + err=ZIP_ERRNO; + else + { + err = zipCloseFileInZip(zf); + if (err!=ZIP_OK) + printf("error in closing %s in the zipfile\n", + filenameinzip); + } + } + } + errclose = zipClose(zf,NULL); + if (errclose != ZIP_OK) + printf("error in closing %s\n",filename_try); + } + else + { + do_help(); + } + + free(buf); + return 0; +} diff --git a/deps/zlib-1.2.10/contrib/minizip/minizip.pc.in b/deps/zlib-1.2.10/contrib/minizip/minizip.pc.in new file mode 100644 index 0000000..69b5b7f --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/minizip.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/minizip + +Name: minizip +Description: Minizip zip file manipulation library +Requires: +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lminizip +Libs.private: -lz +Cflags: -I${includedir} diff --git a/deps/zlib-1.2.10/contrib/minizip/mztools.c b/deps/zlib-1.2.10/contrib/minizip/mztools.c new file mode 100644 index 0000000..96891c2 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/mztools.c @@ -0,0 +1,291 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +/* Code */ +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#define READ_8(adr) ((unsigned char)*(adr)) +#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) +#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) + +#define WRITE_8(buff, n) do { \ + *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ +} while(0) +#define WRITE_16(buff, n) do { \ + WRITE_8((unsigned char*)(buff), n); \ + WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ +} while(0) +#define WRITE_32(buff, n) do { \ + WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ + WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ +} while(0) + +extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) +const char* file; +const char* fileOut; +const char* fileOutTmp; +uLong* nRecovered; +uLong* bytesRecovered; +{ + int err = Z_OK; + FILE* fpZip = fopen(file, "rb"); + FILE* fpOut = fopen(fileOut, "wb"); + FILE* fpOutCD = fopen(fileOutTmp, "wb"); + if (fpZip != NULL && fpOut != NULL) { + int entries = 0; + uLong totalBytes = 0; + char header[30]; + char filename[1024]; + char extra[1024]; + int offset = 0; + int offsetCD = 0; + while ( fread(header, 1, 30, fpZip) == 30 ) { + int currentOffset = offset; + + /* File entry */ + if (READ_32(header) == 0x04034b50) { + unsigned int version = READ_16(header + 4); + unsigned int gpflag = READ_16(header + 6); + unsigned int method = READ_16(header + 8); + unsigned int filetime = READ_16(header + 10); + unsigned int filedate = READ_16(header + 12); + unsigned int crc = READ_32(header + 14); /* crc */ + unsigned int cpsize = READ_32(header + 18); /* compressed size */ + unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ + unsigned int fnsize = READ_16(header + 26); /* file name length */ + unsigned int extsize = READ_16(header + 28); /* extra field length */ + filename[0] = extra[0] = '\0'; + + /* Header */ + if (fwrite(header, 1, 30, fpOut) == 30) { + offset += 30; + } else { + err = Z_ERRNO; + break; + } + + /* Filename */ + if (fnsize > 0) { + if (fnsize < sizeof(filename)) { + if (fread(filename, 1, fnsize, fpZip) == fnsize) { + if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { + offset += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (extsize < sizeof(extra)) { + if (fread(extra, 1, extsize, fpZip) == extsize) { + if (fwrite(extra, 1, extsize, fpOut) == extsize) { + offset += extsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } + + /* Data */ + { + int dataSize = cpsize; + if (dataSize == 0) { + dataSize = uncpsize; + } + if (dataSize > 0) { + char* data = malloc(dataSize); + if (data != NULL) { + if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { + if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { + offset += dataSize; + totalBytes += dataSize; + } else { + err = Z_ERRNO; + } + } else { + err = Z_ERRNO; + } + free(data); + if (err != Z_OK) { + break; + } + } else { + err = Z_MEM_ERROR; + break; + } + } + } + + /* Central directory entry */ + { + char header[46]; + char* comment = ""; + int comsize = (int) strlen(comment); + WRITE_32(header, 0x02014b50); + WRITE_16(header + 4, version); + WRITE_16(header + 6, version); + WRITE_16(header + 8, gpflag); + WRITE_16(header + 10, method); + WRITE_16(header + 12, filetime); + WRITE_16(header + 14, filedate); + WRITE_32(header + 16, crc); + WRITE_32(header + 20, cpsize); + WRITE_32(header + 24, uncpsize); + WRITE_16(header + 28, fnsize); + WRITE_16(header + 30, extsize); + WRITE_16(header + 32, comsize); + WRITE_16(header + 34, 0); /* disk # */ + WRITE_16(header + 36, 0); /* int attrb */ + WRITE_32(header + 38, 0); /* ext attrb */ + WRITE_32(header + 42, currentOffset); + /* Header */ + if (fwrite(header, 1, 46, fpOutCD) == 46) { + offsetCD += 46; + + /* Filename */ + if (fnsize > 0) { + if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { + offsetCD += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { + offsetCD += extsize; + } else { + err = Z_ERRNO; + break; + } + } + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { + offsetCD += comsize; + } else { + err = Z_ERRNO; + break; + } + } + + + } else { + err = Z_ERRNO; + break; + } + } + + /* Success */ + entries++; + + } else { + break; + } + } + + /* Final central directory */ + { + int entriesZip = entries; + char header[22]; + char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; + int comsize = (int) strlen(comment); + if (entriesZip > 0xffff) { + entriesZip = 0xffff; + } + WRITE_32(header, 0x06054b50); + WRITE_16(header + 4, 0); /* disk # */ + WRITE_16(header + 6, 0); /* disk # */ + WRITE_16(header + 8, entriesZip); /* hack */ + WRITE_16(header + 10, entriesZip); /* hack */ + WRITE_32(header + 12, offsetCD); /* size of CD */ + WRITE_32(header + 16, offset); /* offset to CD */ + WRITE_16(header + 20, comsize); /* comment */ + + /* Header */ + if (fwrite(header, 1, 22, fpOutCD) == 22) { + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { + err = Z_ERRNO; + } + } + + } else { + err = Z_ERRNO; + } + } + + /* Final merge (file + central directory) */ + fclose(fpOutCD); + if (err == Z_OK) { + fpOutCD = fopen(fileOutTmp, "rb"); + if (fpOutCD != NULL) { + int nRead; + char buffer[8192]; + while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { + if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { + err = Z_ERRNO; + break; + } + } + fclose(fpOutCD); + } + } + + /* Close */ + fclose(fpZip); + fclose(fpOut); + + /* Wipe temporary file */ + (void)remove(fileOutTmp); + + /* Number of recovered entries */ + if (err == Z_OK) { + if (nRecovered != NULL) { + *nRecovered = entries; + } + if (bytesRecovered != NULL) { + *bytesRecovered = totalBytes; + } + } + } else { + err = Z_STREAM_ERROR; + } + return err; +} diff --git a/deps/zlib-1.2.10/contrib/minizip/mztools.h b/deps/zlib-1.2.10/contrib/minizip/mztools.h new file mode 100644 index 0000000..a49a426 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/mztools.h @@ -0,0 +1,37 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +#ifndef _zip_tools_H +#define _zip_tools_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#include "unzip.h" + +/* Repair a ZIP file (missing central directory) + file: file to recover + fileOut: output file after recovery + fileOutTmp: temporary file name used for recovery +*/ +extern int ZEXPORT unzRepair(const char* file, + const char* fileOut, + const char* fileOutTmp, + uLong* nRecovered, + uLong* bytesRecovered); + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/deps/zlib-1.2.10/contrib/minizip/unzip.c b/deps/zlib-1.2.10/contrib/minizip/unzip.c new file mode 100644 index 0000000..bcfb941 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/unzip.c @@ -0,0 +1,2125 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + + ------------------------------------------------------------------------------------ + Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of + compatibility with older software. The following is from the original crypt.c. + Code woven in by Terry Thorsen 1/2003. + + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html + + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + ------------------------------------------------------------------------------------ + + Changes in unzip.c + + 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos + 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz* + 2007-2008 - Even Rouault - Remove old C style function prototypes + 2007-2008 - Even Rouault - Add unzip support for ZIP64 + + Copyright (C) 2007-2008 Even Rouault + + + Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). + Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G + should only read the compressed/uncompressed size from the Zip64 format if + the size from normal header was 0xFFFFFFFF + Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) + Patch created by Daniel Borca + + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + + Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson + +*/ + + +#include +#include +#include + +#ifndef NOUNCRYPT + #define NOUNCRYPT +#endif + +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info64_internal_s +{ + ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ +} unz_file_info64_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + ZPOS64_T offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/ + ZPOS64_T total_out_64; + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ + ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip64_read_info_s; + + +/* unz64_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + int is64bitOpenFunction; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info64 gi; /* public global information */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + ZPOS64_T num_file; /* number of the current file in the zipfile*/ + ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ + ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ + ZPOS64_T central_pos; /* position of the beginning of the central dir*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info64 cur_file_info; /* public info about the current file in zip*/ + unz_file_info64_internal cur_file_info_internal; /* private info about it*/ + file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; + + int isZip64; + +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const z_crc_t* pcrc_32_tab; +# endif +} unz64_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been successfully opened for reading. +*/ + + +local int unz64local_getByte OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unz64local_getShort OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX)); + + +local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX) +{ + ZPOS64_T x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<24; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<32; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<40; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<48; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<56; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, + const char* fileName2, + int iCaseSensitivity) + +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); +local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + + +/* + Locate the Central directory 64 of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream)); + +local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK) + return 0; + + /* total number of disks */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + if (uL != 0x06064b50) + return 0; + + return relativeOffset; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +local unzFile unzOpenInternal (const void *path, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def, + int is64bitOpenFunction) +{ + unz64_s us; + unz64_s *s; + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + us.z_filefunc.zseek32_file = NULL; + us.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); + else + us.z_filefunc = *pzlib_filefunc64_32_def; + us.is64bitOpenFunction = is64bitOpenFunction; + + + + us.filestream = ZOPEN64(us.z_filefunc, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream); + if (central_pos) + { + uLong uS; + ZPOS64_T uL64; + + us.isZip64 = 1; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* size of zip64 end of central directory record */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version made by */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version needed to extract */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + us.gi.size_comment = 0; + } + else + { + central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + us.isZip64 = 0; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.gi.number_entry = uL; + + /* total number of entries in the central dir */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + number_entry_CD = uL; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.size_central_dir = uL; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.offset_central_dir = uL; + + /* zipfile comment length */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + } + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE64(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + +extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + /* to do : check if number_entry is not truncated */ + pglobal_info32->number_entry = (uLong)s->gi.number_entry; + pglobal_info32->size_comment = s->gi.size_comment; + return UNZ_OK; +} +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) +{ + ZPOS64_T uDate; + uDate = (ZPOS64_T)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unz64local_GetCurrentFileInfoInternal (unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) +{ + unz64_s* s; + unz_file_info64 file_info; + unz_file_info64_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + uLong uL; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.compressed_size = uL; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.uncompressed_size = uL; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + // relative offset of local header + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info_internal.offset_curfile = uL; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + // Read extrafield + if ((err==UNZ_OK) && (extraField!=NULL)) + { + ZPOS64_T uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + + lSeek += file_info.size_file_extra - (uLong)uSizeRead; + } + else + lSeek += file_info.size_file_extra; + + + if ((err==UNZ_OK) && (file_info.size_file_extra != 0)) + { + uLong acc = 0; + + // since lSeek now points to after the extra field we need to move back + lSeek -= file_info.size_file_extra; + + if (lSeek!=0) + { + if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + while(acc < file_info.size_file_extra) + { + uLong headerId; + uLong dataSize; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) + err=UNZ_ERRNO; + + /* ZIP64 extra fields */ + if (headerId == 0x0001) + { + uLong uL; + + if(file_info.uncompressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == MAXU32) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == MAXU32) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + } + + } + else + { + if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) + err=UNZ_ERRNO; + } + + acc += 2 + 2 + dataSize; + } + } + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, + unz_file_info64 * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, + unz_file_info * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + int err; + unz_file_info64 file_info64; + err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); + if ((err==UNZ_OK) && (pfile_info != NULL)) + { + pfile_info->version = file_info64.version; + pfile_info->version_needed = file_info64.version_needed; + pfile_info->flag = file_info64.flag; + pfile_info->compression_method = file_info64.compression_method; + pfile_info->dosDate = file_info64.dosDate; + pfile_info->crc = file_info64.crc; + + pfile_info->size_filename = file_info64.size_filename; + pfile_info->size_file_extra = file_info64.size_file_extra; + pfile_info->size_file_comment = file_info64.size_file_comment; + + pfile_info->disk_num_start = file_info64.disk_num_start; + pfile_info->internal_fa = file_info64.internal_fa; + pfile_info->external_fa = file_info64.external_fa; + + pfile_info->tmu_date = file_info64.tmu_date, + + + pfile_info->compressed_size = (uLong)file_info64.compressed_size; + pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; + + } + return err; +} +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (unzFile file) +{ + int err=UNZ_OK; + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (unzFile file) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) +{ + unz64_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info64 cur_file_infoSaved; + unz_file_info64_internal cur_file_info_internalSaved; + ZPOS64_T num_fileSaved; + ZPOS64_T pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo64(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; // offset in file + ZPOS64_T num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) +{ + unz64_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + int err = unzGetFilePos64(file,&file_pos64); + if (err==UNZ_OK) + { + file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; + file_pos->num_of_file = (uLong)file_pos64.num_of_file; + } + return err; +} + +extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) +{ + unz64_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + if (file_pos == NULL) + return UNZ_PARAMERROR; + + file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; + file_pos64.num_of_file = file_pos->num_of_file; + return unzGoToFilePos64(file,&file_pos64); +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, + ZPOS64_T * poffset_local_extrafield, + uInt * psize_local_extrafield) +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, + int* level, int raw, const char* password) +{ + int err=UNZ_OK; + uInt iSizeVar; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->total_out_64=0; + pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw)) + { +#ifdef HAVE_BZIP2 + pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; + pfile_in_zip_read_info->bstream.bzfree = (free_func)0; + pfile_in_zip_read_info->bstream.opaque = (voidpf)0; + pfile_in_zip_read_info->bstream.state = (voidpf)0; + + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } +#else + pfile_in_zip_read_info->raw=1; +#endif + } + else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = 0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + s->encrypted = 0; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (unzFile file) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + s=(unz64_s*)file; + if (file==NULL) + return 0; //UNZ_PARAMERROR; + pfile_in_zip_read_info=s->pfile_in_zip_read; + if (pfile_in_zip_read_info==NULL) + return 0; //UNZ_PARAMERROR; + return pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile; +} + +/** Addition for GDAL : END */ + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) +{ + int err=UNZ_OK; + uInt iRead = 0; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->read_buffer == NULL) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;iread_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + + pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in; + pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in; + pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in; + pfile_in_zip_read_info->bstream.total_in_hi32 = 0; + pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out; + pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out; + pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out; + pfile_in_zip_read_info->bstream.total_out_hi32 = 0; + + uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32; + bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out; + + err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream); + + uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); + pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in; + pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in; + pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32; + pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out; + pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out; + pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32; + + if (err==BZ_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=BZ_OK) + break; +#endif + } // end Z_BZIP2ED + else + { + ZPOS64_T uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + ZPOS64_T uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + +extern ZPOS64_T ZEXPORT unztell64 (unzFile file) +{ + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return (ZPOS64_T)-1; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return (ZPOS64_T)-1; + + return pfile_in_zip_read_info->total_out_64; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* +Read extra field from the current file (opened by unzOpenCurrentFile) +This is the local-header version of the extra field (sometimes, there is +more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + uInt read_now; + ZPOS64_T size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (unzFile file) +{ + int err=UNZ_OK; + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) + inflateEnd(&pfile_in_zip_read_info->stream); +#ifdef HAVE_BZIP2 + else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) + BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); +#endif + + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) +{ + unz64_s* s; + uLong uReadThis ; + if (file==NULL) + return (int)UNZ_PARAMERROR; + s=(unz64_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) +{ + unz64_s* s; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern uLong ZEXPORT unzGetOffset (unzFile file) +{ + ZPOS64_T offset64; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + offset64 = unzGetOffset64(file); + return (uLong)offset64; +} + +extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) +{ + return unzSetOffset64(file,pos); +} diff --git a/deps/zlib-1.2.10/contrib/minizip/unzip.h b/deps/zlib-1.2.10/contrib/minizip/unzip.h new file mode 100644 index 0000000..2104e39 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/unzip.h @@ -0,0 +1,437 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------------- + + Changes + + See header of unzip64.c + +*/ + +#ifndef _unz64_H +#define _unz64_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info64_s +{ + ZPOS64_T number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info64; + +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info64_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + ZPOS64_T compressed_size; /* compressed size 8 bytes */ + ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info64; + +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +extern unzFile ZEXPORT unzOpen64 OF((const void *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. + the "64" function take a const void* pointer, because the path is just the + value passed to the open64_file_func callback. + Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path + is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* + does not describe the reality +*/ + + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, + zlib_filefunc64_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unz64Open, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzCloseCurrentFile before call unzClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); + +extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, + unz_global_info64 *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +typedef struct unz64_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ + ZPOS64_T num_of_file; /* # of file */ +} unz64_file_pos; + +extern int ZEXPORT unzGetFilePos64( + unzFile file, + unz64_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos64( + unzFile file, + const unz64_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, + unz_file_info64 *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); + +/** Addition for GDAL : END */ + + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); + +extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz64_H */ diff --git a/deps/zlib-1.2.10/contrib/minizip/zip.c b/deps/zlib-1.2.10/contrib/minizip/zip.c new file mode 100644 index 0000000..44e88a9 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/zip.c @@ -0,0 +1,2007 @@ +/* zip.c -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + Oct-2009 - Mathias Svensson - Remove old C style function prototypes + Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives + Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. + Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data + It is used when recreting zip archive with RAW when deleting items from a zip. + ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed. + Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + +*/ + + +#include +#include +#include +#include +#include "zlib.h" +#include "zip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +#ifndef VERSIONMADEBY +# define VERSIONMADEBY (0x0) /* platform depedent */ +#endif + +#ifndef Z_BUFSIZE +#define Z_BUFSIZE (64*1024) //(16384) +#endif + +#ifndef Z_MAXFILENAMEINZIP +#define Z_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +/* +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) +*/ + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + + +// NOT sure that this work on ALL platform +#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32)) + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef DEF_MEM_LEVEL +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +#endif +const char zip_copyright[] =" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + + +#define SIZEDATA_INDATABLOCK (4096-(4*4)) + +#define LOCALHEADERMAGIC (0x04034b50) +#define CENTRALHEADERMAGIC (0x02014b50) +#define ENDHEADERMAGIC (0x06054b50) +#define ZIP64ENDHEADERMAGIC (0x6064b50) +#define ZIP64ENDLOCHEADERMAGIC (0x7064b50) + +#define FLAG_LOCALHEADER_OFFSET (0x06) +#define CRC_LOCALHEADER_OFFSET (0x0e) + +#define SIZECENTRALHEADER (0x2e) /* 46 */ + +typedef struct linkedlist_datablock_internal_s +{ + struct linkedlist_datablock_internal_s* next_datablock; + uLong avail_in_this_block; + uLong filled_in_this_block; + uLong unused; /* for future use and alignment */ + unsigned char data[SIZEDATA_INDATABLOCK]; +} linkedlist_datablock_internal; + +typedef struct linkedlist_data_s +{ + linkedlist_datablock_internal* first_block; + linkedlist_datablock_internal* last_block; +} linkedlist_data; + + +typedef struct +{ + z_stream stream; /* zLib stream structure for inflate */ +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + int stream_initialised; /* 1 is stream is initialised */ + uInt pos_in_buffered_data; /* last written byte in buffered_data */ + + ZPOS64_T pos_local_header; /* offset of the local header of the file + currenty writing */ + char* central_header; /* central header data for the current file */ + uLong size_centralExtra; + uLong size_centralheader; /* size of the central header for cur file */ + uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ + uLong flag; /* flag of the file currently writing */ + + int method; /* compression method of file currenty wr.*/ + int raw; /* 1 for directly writing raw data */ + Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ + uLong dosDate; + uLong crc32; + int encrypt; + int zip64; /* Add ZIP64 extened information in the extra field */ + ZPOS64_T pos_zip64extrainfo; + ZPOS64_T totalCompressedData; + ZPOS64_T totalUncompressedData; +#ifndef NOCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const z_crc_t* pcrc_32_tab; + int crypt_header_size; +#endif +} curfile64_info; + +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + linkedlist_data central_dir;/* datablock with central dir in construction*/ + int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ + curfile64_info ci; /* info on the file curretly writing */ + + ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ + ZPOS64_T add_position_when_writing_offset; + ZPOS64_T number_entry; + +#ifndef NO_ADDFILEINEXISTINGZIP + char *globalcomment; +#endif + +} zip64_internal; + + +#ifndef NOCRYPT +#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED +#include "crypt.h" +#endif + +local linkedlist_datablock_internal* allocate_new_datablock() +{ + linkedlist_datablock_internal* ldi; + ldi = (linkedlist_datablock_internal*) + ALLOC(sizeof(linkedlist_datablock_internal)); + if (ldi!=NULL) + { + ldi->next_datablock = NULL ; + ldi->filled_in_this_block = 0 ; + ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; + } + return ldi; +} + +local void free_datablock(linkedlist_datablock_internal* ldi) +{ + while (ldi!=NULL) + { + linkedlist_datablock_internal* ldinext = ldi->next_datablock; + TRYFREE(ldi); + ldi = ldinext; + } +} + +local void init_linkedlist(linkedlist_data* ll) +{ + ll->first_block = ll->last_block = NULL; +} + +local void free_linkedlist(linkedlist_data* ll) +{ + free_datablock(ll->first_block); + ll->first_block = ll->last_block = NULL; +} + + +local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) +{ + linkedlist_datablock_internal* ldi; + const unsigned char* from_copy; + + if (ll==NULL) + return ZIP_INTERNALERROR; + + if (ll->last_block == NULL) + { + ll->first_block = ll->last_block = allocate_new_datablock(); + if (ll->first_block == NULL) + return ZIP_INTERNALERROR; + } + + ldi = ll->last_block; + from_copy = (unsigned char*)buf; + + while (len>0) + { + uInt copy_this; + uInt i; + unsigned char* to_copy; + + if (ldi->avail_in_this_block==0) + { + ldi->next_datablock = allocate_new_datablock(); + if (ldi->next_datablock == NULL) + return ZIP_INTERNALERROR; + ldi = ldi->next_datablock ; + ll->last_block = ldi; + } + + if (ldi->avail_in_this_block < len) + copy_this = (uInt)ldi->avail_in_this_block; + else + copy_this = (uInt)len; + + to_copy = &(ldi->data[ldi->filled_in_this_block]); + + for (i=0;ifilled_in_this_block += copy_this; + ldi->avail_in_this_block -= copy_this; + from_copy += copy_this ; + len -= copy_this; + } + return ZIP_OK; +} + + + +/****************************************************************************/ + +#ifndef NO_ADDFILEINEXISTINGZIP +/* =========================================================================== + Inputs a long in LSB order to the given file + nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) +*/ + +local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)); +local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) +{ + unsigned char buf[8]; + int n; + for (n = 0; n < nbByte; n++) + { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + if (x != 0) + { /* data overflow - hack for ZIP64 (X Roche) */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } + + if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + return ZIP_ERRNO; + else + return ZIP_OK; +} + +local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); +local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) +{ + unsigned char* buf=(unsigned char*)dest; + int n; + for (n = 0; n < nbByte; n++) { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + + if (x != 0) + { /* data overflow - hack for ZIP64 */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } +} + +/****************************************************************************/ + + +local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) +{ + uLong year = (uLong)ptm->tm_year; + if (year>=1980) + year-=1980; + else if (year>=80) + year-=80; + return + (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | + ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); +} + + +/****************************************************************************/ + +local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); + +local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return ZIP_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return ZIP_ERRNO; + else + return ZIP_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); + + +local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) +{ + ZPOS64_T x; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<24; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<32; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<40; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<48; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<56; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + + return err; +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* +Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before +the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + { + // Signature "0x07064b50" Zip64 end of central directory locater + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + } + + if (uPosFound!=0) + break; + } + + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (zip64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=ZIP_OK) + return 0; + + /* total number of disks */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto Zip64 end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + if (uL != 0x06064b50) // signature of 'Zip64 end of central directory' + return 0; + + return relativeOffset; +} + +int LoadCentralDirectoryRecord(zip64_internal* pziinit) +{ + int err=ZIP_OK; + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory */ + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry; + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + uLong VersionMadeBy; + uLong VersionNeeded; + uLong size_comment; + + int hasZIP64Record = 0; + + // check first if we find a ZIP64 record + central_pos = zip64local_SearchCentralDir64(&pziinit->z_filefunc,pziinit->filestream); + if(central_pos > 0) + { + hasZIP64Record = 1; + } + else if(central_pos == 0) + { + central_pos = zip64local_SearchCentralDir(&pziinit->z_filefunc,pziinit->filestream); + } + +/* disable to allow appending to empty ZIP archive + if (central_pos==0) + err=ZIP_ERRNO; +*/ + + if(hasZIP64Record) + { + ZPOS64_T sizeEndOfCentralDirectory; + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* size of zip64 end of central directory record */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version made by */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version needed to extract */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &number_entry)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&number_entry_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&size_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&offset_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + // TODO.. + // read the comment from the standard central header. + size_comment = 0; + } + else + { + // Read End of central Directory info + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir on this disk */ + number_entry = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry = uL; + + /* total number of entries in the central dir */ + number_entry_CD = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry_CD = uL; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + size_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + size_central_dir = uL; + + /* offset of start of central directory with respect to the starting disk number */ + offset_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + offset_central_dir = uL; + + + /* zipfile global comment length */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &size_comment)!=ZIP_OK) + err=ZIP_ERRNO; + } + + if ((central_posz_filefunc, pziinit->filestream); + return ZIP_ERRNO; + } + + if (size_comment>0) + { + pziinit->globalcomment = (char*)ALLOC(size_comment+1); + if (pziinit->globalcomment) + { + size_comment = ZREAD64(pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment,size_comment); + pziinit->globalcomment[size_comment]=0; + } + } + + byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); + pziinit->add_position_when_writing_offset = byte_before_the_zipfile; + + { + ZPOS64_T size_central_dir_to_read = size_central_dir; + size_t buf_size = SIZEDATA_INDATABLOCK; + void* buf_read = (void*)ALLOC(buf_size); + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + while ((size_central_dir_to_read>0) && (err==ZIP_OK)) + { + ZPOS64_T read_this = SIZEDATA_INDATABLOCK; + if (read_this > size_central_dir_to_read) + read_this = size_central_dir_to_read; + + if (ZREAD64(pziinit->z_filefunc, pziinit->filestream,buf_read,(uLong)read_this) != read_this) + err=ZIP_ERRNO; + + if (err==ZIP_OK) + err = add_data_in_datablock(&pziinit->central_dir,buf_read, (uLong)read_this); + + size_central_dir_to_read-=read_this; + } + TRYFREE(buf_read); + } + pziinit->begin_pos = byte_before_the_zipfile; + pziinit->number_entry = number_entry_CD; + + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + return err; +} + + +#endif /* !NO_ADDFILEINEXISTINGZIP*/ + + +/************************************************************/ +extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) +{ + zip64_internal ziinit; + zip64_internal* zi; + int err=ZIP_OK; + + ziinit.z_filefunc.zseek32_file = NULL; + ziinit.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); + else + ziinit.z_filefunc = *pzlib_filefunc64_32_def; + + ziinit.filestream = ZOPEN64(ziinit.z_filefunc, + pathname, + (append == APPEND_STATUS_CREATE) ? + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); + + if (ziinit.filestream == NULL) + return NULL; + + if (append == APPEND_STATUS_CREATEAFTER) + ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); + + ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); + ziinit.in_opened_file_inzip = 0; + ziinit.ci.stream_initialised = 0; + ziinit.number_entry = 0; + ziinit.add_position_when_writing_offset = 0; + init_linkedlist(&(ziinit.central_dir)); + + + + zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); + if (zi==NULL) + { + ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); + return NULL; + } + + /* now we add file in a zipfile */ +# ifndef NO_ADDFILEINEXISTINGZIP + ziinit.globalcomment = NULL; + if (append == APPEND_STATUS_ADDINZIP) + { + // Read and Cache Central Directory Records + err = LoadCentralDirectoryRecord(&ziinit); + } + + if (globalcomment) + { + *globalcomment = ziinit.globalcomment; + } +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + + if (err != ZIP_OK) + { +# ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(ziinit.globalcomment); +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + TRYFREE(zi); + return NULL; + } + else + { + *zi = ziinit; + return (zipFile)zi; + } +} + +extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) +{ + if (pzlib_filefunc32_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + +extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) +{ + if (pzlib_filefunc_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; + zlib_filefunc64_32_def_fill.ztell32_file = NULL; + zlib_filefunc64_32_def_fill.zseek32_file = NULL; + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + + + +extern zipFile ZEXPORT zipOpen (const char* pathname, int append) +{ + return zipOpen3((const void*)pathname,append,NULL,NULL); +} + +extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) +{ + return zipOpen3(pathname,append,NULL,NULL); +} + +int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) +{ + /* write the local header */ + int err; + uInt size_filename = (uInt)strlen(filename); + uInt size_extrafield = size_extrafield_local; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC, 4); + + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); + + // CRC / Compressed size / Uncompressed size will be filled in later and rewritten later + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* compressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ + } + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* uncompressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); + + if(zi->ci.zip64) + { + size_extrafield += 20; + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield,2); + + if ((err==ZIP_OK) && (size_filename > 0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) + err = ZIP_ERRNO; + } + + if ((err==ZIP_OK) && (size_extrafield_local > 0)) + { + if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local) + err = ZIP_ERRNO; + } + + + if ((err==ZIP_OK) && (zi->ci.zip64)) + { + // write the Zip64 extended info + short HeaderID = 1; + short DataSize = 16; + ZPOS64_T CompressedSize = 0; + ZPOS64_T UncompressedSize = 0; + + // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) + zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); + } + + return err; +} + +/* + NOTE. + When writing RAW the ZIP64 extended information in extrafield_local and extrafield_global needs to be stripped + before calling this function it can be done with zipRemoveExtraInfoBlock + + It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize + unnecessary allocations. + */ +extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase, int zip64) +{ + zip64_internal* zi; + uInt size_filename; + uInt size_comment; + uInt i; + int err = ZIP_OK; + +# ifdef NOCRYPT + (crcForCrypting); + if (password != NULL) + return ZIP_PARAMERROR; +# endif + + if (file == NULL) + return ZIP_PARAMERROR; + +#ifdef HAVE_BZIP2 + if ((method!=0) && (method!=Z_DEFLATED) && (method!=Z_BZIP2ED)) + return ZIP_PARAMERROR; +#else + if ((method!=0) && (method!=Z_DEFLATED)) + return ZIP_PARAMERROR; +#endif + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + if (err != ZIP_OK) + return err; + } + + if (filename==NULL) + filename="-"; + + if (comment==NULL) + size_comment = 0; + else + size_comment = (uInt)strlen(comment); + + size_filename = (uInt)strlen(filename); + + if (zipfi == NULL) + zi->ci.dosDate = 0; + else + { + if (zipfi->dosDate != 0) + zi->ci.dosDate = zipfi->dosDate; + else + zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date); + } + + zi->ci.flag = flagBase; + if ((level==8) || (level==9)) + zi->ci.flag |= 2; + if (level==2) + zi->ci.flag |= 4; + if (level==1) + zi->ci.flag |= 6; + if (password != NULL) + zi->ci.flag |= 1; + + zi->ci.crc32 = 0; + zi->ci.method = method; + zi->ci.encrypt = 0; + zi->ci.stream_initialised = 0; + zi->ci.pos_in_buffered_data = 0; + zi->ci.raw = raw; + zi->ci.pos_local_header = ZTELL64(zi->z_filefunc,zi->filestream); + + zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; + zi->ci.size_centralExtraFree = 32; // Extra space we have reserved in case we need to add ZIP64 extra info data + + zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree); + + zi->ci.size_centralExtra = size_extrafield_global; + zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); + /* version info */ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)versionMadeBy,2); + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); + zip64local_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); + zip64local_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); + zip64local_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); + zip64local_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ + zip64local_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); + zip64local_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); + zip64local_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); + else + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); + + if(zi->ci.pos_local_header >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writing_offset,4); + + for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = + *(((const char*)extrafield_global)+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ + size_extrafield_global+i) = *(comment+i); + if (zi->ci.central_header == NULL) + return ZIP_INTERNALERROR; + + zi->ci.zip64 = zip64; + zi->ci.totalCompressedData = 0; + zi->ci.totalUncompressedData = 0; + zi->ci.pos_zip64extrainfo = 0; + + err = Write_LocalFileHeader(zi, filename, size_extrafield_local, extrafield_local); + +#ifdef HAVE_BZIP2 + zi->ci.bstream.avail_in = (uInt)0; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + zi->ci.bstream.total_in_hi32 = 0; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_out_hi32 = 0; + zi->ci.bstream.total_out_lo32 = 0; +#endif + + zi->ci.stream.avail_in = (uInt)0; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + zi->ci.stream.total_in = 0; + zi->ci.stream.total_out = 0; + zi->ci.stream.data_type = Z_BINARY; + +#ifdef HAVE_BZIP2 + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) +#else + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) +#endif + { + if(zi->ci.method == Z_DEFLATED) + { + zi->ci.stream.zalloc = (alloc_func)0; + zi->ci.stream.zfree = (free_func)0; + zi->ci.stream.opaque = (voidpf)0; + + if (windowBits>0) + windowBits = -windowBits; + + err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); + + if (err==Z_OK) + zi->ci.stream_initialised = Z_DEFLATED; + } + else if(zi->ci.method == Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + // Init BZip stuff here + zi->ci.bstream.bzalloc = 0; + zi->ci.bstream.bzfree = 0; + zi->ci.bstream.opaque = (voidpf)0; + + err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0,35); + if(err == BZ_OK) + zi->ci.stream_initialised = Z_BZIP2ED; +#endif + } + + } + +# ifndef NOCRYPT + zi->ci.crypt_header_size = 0; + if ((err==Z_OK) && (password != NULL)) + { + unsigned char bufHead[RAND_HEAD_LEN]; + unsigned int sizeHead; + zi->ci.encrypt = 1; + zi->ci.pcrc_32_tab = get_crc_table(); + /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ + + sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); + zi->ci.crypt_header_size = sizeHead; + + if (ZWRITE64(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) + err = ZIP_ERRNO; + } +# endif + + if (err==Z_OK) + zi->in_opened_file_inzip = 1; + return err; +} + +extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, versionMadeBy, flagBase, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +local int zip64FlushWriteBuffer(zip64_internal* zi) +{ + int err=ZIP_OK; + + if (zi->ci.encrypt != 0) + { +#ifndef NOCRYPT + uInt i; + int t; + for (i=0;ici.pos_in_buffered_data;i++) + zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); +#endif + } + + if (ZWRITE64(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data) + err = ZIP_ERRNO; + + zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data; + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED) + { + zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_in_hi32 = 0; + } + else +#endif + { + zi->ci.totalUncompressedData += zi->ci.stream.total_in; + zi->ci.stream.total_in = 0; + } + + + zi->ci.pos_in_buffered_data = 0; + + return err; +} + +extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len) +{ + zip64_internal* zi; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + + zi->ci.crc32 = crc32(zi->ci.crc32,buf,(uInt)len); + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED && (!zi->ci.raw)) + { + zi->ci.bstream.next_in = (void*)buf; + zi->ci.bstream.avail_in = len; + err = BZ_RUN_OK; + + while ((err==BZ_RUN_OK) && (zi->ci.bstream.avail_in>0)) + { + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + + + if(err != BZ_RUN_OK) + break; + + if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32; +// uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_RUN); + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo) ; + } + } + + if(err == BZ_RUN_OK) + err = ZIP_OK; + } + else +#endif + { + zi->ci.stream.next_in = (Bytef*)buf; + zi->ci.stream.avail_in = len; + + while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) + { + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + + + if(err != ZIP_OK) + break; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_NO_FLUSH); + if(uTotalOutBefore > zi->ci.stream.total_out) + { + int bBreak = 0; + bBreak++; + } + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + else + { + uInt copy_this,i; + if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) + copy_this = zi->ci.stream.avail_in; + else + copy_this = zi->ci.stream.avail_out; + + for (i = 0; i < copy_this; i++) + *(((char*)zi->ci.stream.next_out)+i) = + *(((const char*)zi->ci.stream.next_in)+i); + { + zi->ci.stream.avail_in -= copy_this; + zi->ci.stream.avail_out-= copy_this; + zi->ci.stream.next_in+= copy_this; + zi->ci.stream.next_out+= copy_this; + zi->ci.stream.total_in+= copy_this; + zi->ci.stream.total_out+= copy_this; + zi->ci.pos_in_buffered_data += copy_this; + } + } + }// while(...) + } + + return err; +} + +extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32) +{ + return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); +} + +extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32) +{ + zip64_internal* zi; + ZPOS64_T compressed_size; + uLong invalidValue = 0xffffffff; + short datasize = 0; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + zi->ci.stream.avail_in = 0; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + while (err==ZIP_OK) + { + uLong uTotalOutBefore; + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_FINISH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + } + else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { +#ifdef HAVE_BZIP2 + err = BZ_FINISH_OK; + while (err==BZ_FINISH_OK) + { + uLong uTotalOutBefore; + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.bstream.total_out_lo32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH); + if(err == BZ_STREAM_END) + err = Z_STREAM_END; + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore); + } + + if(err == BZ_FINISH_OK) + err = ZIP_OK; +#endif + } + + if (err==Z_STREAM_END) + err=ZIP_OK; /* this is normal */ + + if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) + { + if (zip64FlushWriteBuffer(zi)==ZIP_ERRNO) + err = ZIP_ERRNO; + } + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + int tmp_err = deflateEnd(&zi->ci.stream); + if (err == ZIP_OK) + err = tmp_err; + zi->ci.stream_initialised = 0; + } +#ifdef HAVE_BZIP2 + else if((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream); + if (err==ZIP_OK) + err = tmperr; + zi->ci.stream_initialised = 0; + } +#endif + + if (!zi->ci.raw) + { + crc32 = (uLong)zi->ci.crc32; + uncompressed_size = zi->ci.totalUncompressedData; + } + compressed_size = zi->ci.totalCompressedData; + +# ifndef NOCRYPT + compressed_size += zi->ci.crypt_header_size; +# endif + + // update Current Item crc and sizes, + if(compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) + { + /*version Made by*/ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2); + /*version needed*/ + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2); + + } + + zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ + + + if(compressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue,4); /*compr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/ + + /// set internal file attributes field + if (zi->ci.stream.data_type == Z_ASCII) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); + + if(uncompressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue,4); /*uncompr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/ + + // Add ZIP64 extra info field for uncompressed size + if(uncompressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for compressed size + if(compressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for relative offset to local file header of current file + if(zi->ci.pos_local_header >= 0xffffffff) + datasize += 8; + + if(datasize > 0) + { + char* p = NULL; + + if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) + { + // we can not write more data to the buffer that we have room for. + return ZIP_BADZIPFILE; + } + + p = zi->ci.central_header + zi->ci.size_centralheader; + + // Add Extra Information Header for 'ZIP64 information' + zip64local_putValue_inmemory(p, 0x0001, 2); // HeaderID + p += 2; + zip64local_putValue_inmemory(p, datasize, 2); // DataSize + p += 2; + + if(uncompressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, uncompressed_size, 8); + p += 8; + } + + if(compressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, compressed_size, 8); + p += 8; + } + + if(zi->ci.pos_local_header >= 0xffffffff) + { + zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8); + p += 8; + } + + // Update how much extra free space we got in the memory buffer + // and increase the centralheader size so the new ZIP64 fields are included + // ( 4 below is the size of HeaderID and DataSize field ) + zi->ci.size_centralExtraFree -= datasize + 4; + zi->ci.size_centralheader += datasize + 4; + + // Update the extra info size field + zi->ci.size_centralExtra += datasize + 4; + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)zi->ci.size_centralExtra,2); + } + + if (err==ZIP_OK) + err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader); + + free(zi->ci.central_header); + + if (err==ZIP_OK) + { + // Update the LocalFileHeader with the new values. + + ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ + + if(uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff ) + { + if(zi->ci.pos_zip64extrainfo > 0) + { + // Update the size in the ZIP64 extended field. + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_zip64extrainfo + 4,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8); + } + else + err = ZIP_BADZIPFILE; // Caller passed zip64 = 0, so no room for zip64 info -> fatal + } + else + { + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); + } + + if (ZSEEK64(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + } + + zi->number_entry ++; + zi->in_opened_file_inzip = 0; + + return err; +} + +extern int ZEXPORT zipCloseFileInZip (zipFile file) +{ + return zipCloseFileInZipRaw (file,0,0); +} + +int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) +{ + int err = ZIP_OK; + ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4); + + /*num disks*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + /*relative offset*/ + if (err==ZIP_OK) /* Relative offset to the Zip64EndOfCentralDirectory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, pos,8); + + /*total disks*/ /* Do not support spawning of disk so always say 1 here*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)1,4); + + return err; +} + +int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + uLong Zip64DataSize = 44; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* size of this 'zip64 end of central directory' */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)Zip64DataSize,8); // why ZPOS64_T of this ? + + if (err==ZIP_OK) /* version made by */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* version needed */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* total number of entries in the central dir */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)size_centraldir,8); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8); + } + return err; +} +int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + /*signature*/ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + { + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + } + + if (err==ZIP_OK) /* total number of entries in the central dir */ + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + if(pos >= 0xffffffff) + { + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4); + } + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writing_offset),4); + } + + return err; +} + +int Write_GlobalComment(zip64_internal* zi, const char* global_comment) +{ + int err = ZIP_OK; + uInt size_global_comment = 0; + + if(global_comment != NULL) + size_global_comment = (uInt)strlen(global_comment); + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); + + if (err == ZIP_OK && size_global_comment > 0) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, global_comment, size_global_comment) != size_global_comment) + err = ZIP_ERRNO; + } + return err; +} + +extern int ZEXPORT zipClose (zipFile file, const char* global_comment) +{ + zip64_internal* zi; + int err = 0; + uLong size_centraldir = 0; + ZPOS64_T centraldir_pos_inzip; + ZPOS64_T pos; + + if (file == NULL) + return ZIP_PARAMERROR; + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + } + +#ifndef NO_ADDFILEINEXISTINGZIP + if (global_comment==NULL) + global_comment = zi->globalcomment; +#endif + + centraldir_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (err==ZIP_OK) + { + linkedlist_datablock_internal* ldi = zi->central_dir.first_block; + while (ldi!=NULL) + { + if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block) + err = ZIP_ERRNO; + } + + size_centraldir += ldi->filled_in_this_block; + ldi = ldi->next_datablock; + } + } + free_linkedlist(&(zi->central_dir)); + + pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + if(pos >= 0xffffffff || zi->number_entry > 0xFFFF) + { + ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); + Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + Write_Zip64EndOfCentralDirectoryLocator(zi, Zip64EOCDpos); + } + + if (err==ZIP_OK) + err = Write_EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + if(err == ZIP_OK) + err = Write_GlobalComment(zi, global_comment); + + if (ZCLOSE64(zi->z_filefunc,zi->filestream) != 0) + if (err == ZIP_OK) + err = ZIP_ERRNO; + +#ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(zi->globalcomment); +#endif + TRYFREE(zi); + + return err; +} + +extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader) +{ + char* p = pData; + int size = 0; + char* pNewHeader; + char* pTmp; + short header; + short dataSize; + + int retVal = ZIP_OK; + + if(pData == NULL || *dataLen < 4) + return ZIP_PARAMERROR; + + pNewHeader = (char*)ALLOC(*dataLen); + pTmp = pNewHeader; + + while(p < (pData + *dataLen)) + { + header = *(short*)p; + dataSize = *(((short*)p)+1); + + if( header == sHeader ) // Header found. + { + p += dataSize + 4; // skip it. do not copy to temp buffer + } + else + { + // Extra Info block should not be removed, So copy it to the temp buffer. + memcpy(pTmp, p, dataSize + 4); + p += dataSize + 4; + size += dataSize + 4; + } + + } + + if(size < *dataLen) + { + // clean old extra info block. + memset(pData,0, *dataLen); + + // copy the new extra info block over the old + if(size > 0) + memcpy(pData, pNewHeader, size); + + // set the new extra info size + *dataLen = size; + + retVal = ZIP_OK; + } + else + retVal = ZIP_ERRNO; + + TRYFREE(pNewHeader); + + return retVal; +} diff --git a/deps/zlib-1.2.10/contrib/minizip/zip.h b/deps/zlib-1.2.10/contrib/minizip/zip.h new file mode 100644 index 0000000..8aaebb6 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/minizip/zip.h @@ -0,0 +1,362 @@ +/* zip.h -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------- + + Changes + + See header of zip.h + +*/ + +#ifndef _zip12_H +#define _zip12_H + +#ifdef __cplusplus +extern "C" { +#endif + +//#define HAVE_BZIP2 + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagzipFile__ { int unused; } zipFile__; +typedef zipFile__ *zipFile; +#else +typedef voidp zipFile; +#endif + +#define ZIP_OK (0) +#define ZIP_EOF (0) +#define ZIP_ERRNO (Z_ERRNO) +#define ZIP_PARAMERROR (-102) +#define ZIP_BADZIPFILE (-103) +#define ZIP_INTERNALERROR (-104) + +#ifndef DEF_MEM_LEVEL +# if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +# else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +# endif +#endif +/* default memLevel */ + +/* tm_zip contain date/time info */ +typedef struct tm_zip_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_zip; + +typedef struct +{ + tm_zip tmz_date; /* date in understandable format */ + uLong dosDate; /* if dos_date == 0, tmu_date is used */ +/* uLong flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ +} zip_fileinfo; + +typedef const char* zipcharpc; + + +#define APPEND_STATUS_CREATE (0) +#define APPEND_STATUS_CREATEAFTER (1) +#define APPEND_STATUS_ADDINZIP (2) + +extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); +extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); +/* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip + will be created at the end of the file. + (useful if the file contain a self extractor code) + if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will + add files in existing zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. +*/ + +/* Note : there is no delete function into a zipfile. + If you want delete file into a zipfile, you must open a zipfile, and create another + Of couse, you can use RAW reading and writing to copy the file you did not want delte +*/ + +extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def)); + +extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_def* pzlib_filefunc_def)); + +extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level)); + +extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int zip64)); + +/* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) + zip64 is set to 1 if a zip64 extended information block should be added to the local file header. + this MUST be '1' if the uncompressed size is >= 0xffffffff. + +*/ + + +extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw)); + + +extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int zip64)); +/* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + +extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting)); + +extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + int zip64 + )); + +/* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCrypting : crc of file to compress (needed for crypting) + */ + +extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase + )); + + +extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase, + int zip64 + )); +/* + Same than zipOpenNewFileInZip4, except + versionMadeBy : value for Version made by field + flag : value for flag field (compression level info will be added) + */ + + +extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); +/* + Write data in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +/* + Close the current file in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); + +extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, + ZPOS64_T uncompressed_size, + uLong crc32)); + +/* + Close the current file in the zipfile, for file opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size +*/ + +extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); +/* + Close the zipfile +*/ + + +extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); +/* + zipRemoveExtraInfoBlock - Added by Mathias Svensson + + Remove extra information block from a extra information data for the local file header or central directory header + + It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode. + + 0x0001 is the signature header for the ZIP64 extra information blocks + + usage. + Remove ZIP64 Extra information from a central director extra field data + zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001); + + Remove ZIP64 Extra information from a Local File Header extra field data + zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001); +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _zip64_H */ diff --git a/deps/zlib-1.2.10/contrib/pascal/example.pas b/deps/zlib-1.2.10/contrib/pascal/example.pas new file mode 100644 index 0000000..5518b36 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/pascal/example.pas @@ -0,0 +1,599 @@ +(* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Pascal translation + * Copyright (C) 1998 by Jacques Nomssi Nzali. + * For conditions of distribution and use, see copyright notice in readme.txt + * + * Adaptation to the zlibpas interface + * Copyright (C) 2003 by Cosmin Truta. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +program example; + +{$DEFINE TEST_COMPRESS} +{DO NOT $DEFINE TEST_GZIO} +{$DEFINE TEST_DEFLATE} +{$DEFINE TEST_INFLATE} +{$DEFINE TEST_FLUSH} +{$DEFINE TEST_SYNC} +{$DEFINE TEST_DICT} + +uses SysUtils, zlibpas; + +const TESTFILE = 'foo.gz'; + +(* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + *) +const hello: PChar = 'hello, hello!'; + +const dictionary: PChar = 'hello'; + +var dictId: LongInt; (* Adler32 value of the dictionary *) + +procedure CHECK_ERR(err: Integer; msg: String); +begin + if err <> Z_OK then + begin + WriteLn(msg, ' error: ', err); + Halt(1); + end; +end; + +procedure EXIT_ERR(const msg: String); +begin + WriteLn('Error: ', msg); + Halt(1); +end; + +(* =========================================================================== + * Test compress and uncompress + *) +{$IFDEF TEST_COMPRESS} +procedure test_compress(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + err := compress(compr, comprLen, hello, len); + CHECK_ERR(err, 'compress'); + + StrCopy(PChar(uncompr), 'garbage'); + + err := uncompress(uncompr, uncomprLen, compr, comprLen); + CHECK_ERR(err, 'uncompress'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad uncompress') + else + WriteLn('uncompress(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test read/write of .gz files + *) +{$IFDEF TEST_GZIO} +procedure test_gzio(const fname: PChar; (* compressed file name *) + uncompr: Pointer; + uncomprLen: LongInt); +var err: Integer; + len: Integer; + zfile: gzFile; + pos: LongInt; +begin + len := StrLen(hello)+1; + + zfile := gzopen(fname, 'wb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + gzputc(zfile, 'h'); + if gzputs(zfile, 'ello') <> 4 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$IFDEF GZ_FORMAT_STRING} + if gzprintf(zfile, ', %s!', 'hello') <> 8 then + begin + WriteLn('gzprintf err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ELSE} + if gzputs(zfile, ', hello!') <> 8 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ENDIF} + gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *) + gzclose(zfile); + + zfile := gzopen(fname, 'rb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + + StrCopy(PChar(uncompr), 'garbage'); + + if gzread(zfile, uncompr, uncomprLen) <> len then + begin + WriteLn('gzread err: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello) <> 0 then + begin + WriteLn('bad gzread: ', PChar(uncompr)); + Halt(1); + end + else + WriteLn('gzread(): ', PChar(uncompr)); + + pos := gzseek(zfile, -8, SEEK_CUR); + if (pos <> 6) or (gztell(zfile) <> pos) then + begin + WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile)); + Halt(1); + end; + + if gzgetc(zfile) <> ' ' then + begin + WriteLn('gzgetc error'); + Halt(1); + end; + + if gzungetc(' ', zfile) <> ' ' then + begin + WriteLn('gzungetc error'); + Halt(1); + end; + + gzgets(zfile, PChar(uncompr), uncomprLen); + uncomprLen := StrLen(PChar(uncompr)); + if uncomprLen <> 7 then (* " hello!" *) + begin + WriteLn('gzgets err after gzseek: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello + 6) <> 0 then + begin + WriteLn('bad gzgets after gzseek'); + Halt(1); + end + else + WriteLn('gzgets() after gzseek: ', PChar(uncompr)); + + gzclose(zfile); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with small buffers + *) +{$IFDEF TEST_DEFLATE} +procedure test_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + + while (c_stream.total_in <> len) and + (c_stream.total_out < comprLen) do + begin + c_stream.avail_out := 1; { force small buffers } + c_stream.avail_in := 1; + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + end; + + (* Finish the stream, still forcing small buffers: *) + while TRUE do + begin + c_stream.avail_out := 1; + err := deflate(c_stream, Z_FINISH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'deflate'); + end; + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with small buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_inflate(compr: Pointer; comprLen : LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 0; + d_stream.next_out := uncompr; + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while (d_stream.total_out < uncomprLen) and + (d_stream.total_in < comprLen) do + begin + d_stream.avail_out := 1; (* force small buffers *) + d_stream.avail_in := 1; + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate') + else + WriteLn('inflate(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with large buffers and dynamic change of compression level + *) +{$IFDEF TEST_DEFLATE} +procedure test_large_deflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_SPEED); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + (* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + *) + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + if c_stream.avail_in <> 0 then + EXIT_ERR('deflate not greedy'); + + (* Feed in already compressed data and switch to no compression: *) + deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in := compr; + c_stream.avail_in := Integer(comprLen div 2); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + (* Switch back to compressing mode: *) + deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with large buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_large_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while TRUE do + begin + d_stream.next_out := uncompr; (* discard the output *) + d_stream.avail_out := Integer(uncomprLen); + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'large inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then + begin + WriteLn('bad large inflate: ', d_stream.total_out); + Halt(1); + end + else + WriteLn('large_inflate(): OK'); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with full flush + *) +{$IFDEF TEST_FLUSH} +procedure test_flush(compr: Pointer; var comprLen : LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: Integer; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + c_stream.avail_in := 3; + c_stream.avail_out := Integer(comprLen); + err := deflate(c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, 'deflate'); + + Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *) + c_stream.avail_in := len - 3; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + CHECK_ERR(err, 'deflate'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); + + comprLen := c_stream.total_out; +end; +{$ENDIF} + +(* =========================================================================== + * Test inflateSync() + *) +{$IFDEF TEST_SYNC} +procedure test_sync(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 2; (* just read the zlib header *) + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + inflate(d_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'inflate'); + + d_stream.avail_in := Integer(comprLen-2); (* read all compressed data *) + err := inflateSync(d_stream); (* but skip the damaged part *) + CHECK_ERR(err, 'inflateSync'); + + err := inflate(d_stream, Z_FINISH); + if err <> Z_DATA_ERROR then + EXIT_ERR('inflate should report DATA_ERROR'); + (* Because of incorrect adler32 *) + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + WriteLn('after inflateSync(): hel', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary)); + CHECK_ERR(err, 'deflateSetDictionary'); + + dictId := c_stream.adler; + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + c_stream.next_in := hello; + c_stream.avail_in := StrLen(hello)+1; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with a preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + while TRUE do + begin + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + if err = Z_NEED_DICT then + begin + if d_stream.adler <> dictId then + EXIT_ERR('unexpected dictionary'); + err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary)); + end; + CHECK_ERR(err, 'inflate with dict'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate with dict') + else + WriteLn('inflate with dictionary: ', PChar(uncompr)); +end; +{$ENDIF} + +var compr, uncompr: Pointer; + comprLen, uncomprLen: LongInt; + +begin + if zlibVersion^ <> ZLIB_VERSION[1] then + EXIT_ERR('Incompatible zlib version'); + + WriteLn('zlib version: ', zlibVersion); + WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags])); + + comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *) + uncomprLen := comprLen; + GetMem(compr, comprLen); + GetMem(uncompr, uncomprLen); + if (compr = NIL) or (uncompr = NIL) then + EXIT_ERR('Out of memory'); + (* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + *) + FillChar(compr^, comprLen, 0); + FillChar(uncompr^, uncomprLen, 0); + + {$IFDEF TEST_COMPRESS} + WriteLn('** Testing compress'); + test_compress(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_GZIO} + WriteLn('** Testing gzio'); + if ParamCount >= 1 then + test_gzio(ParamStr(1), uncompr, uncomprLen) + else + test_gzio(TESTFILE, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with small buffers'); + test_deflate(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with small buffers'); + test_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with large buffers'); + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with large buffers'); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_FLUSH} + WriteLn('** Testing deflate with full flush'); + test_flush(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_SYNC} + WriteLn('** Testing inflateSync'); + test_sync(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + comprLen := uncomprLen; + + {$IFDEF TEST_DICT} + WriteLn('** Testing deflate and inflate with preset dictionary'); + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + FreeMem(compr, comprLen); + FreeMem(uncompr, uncomprLen); +end. diff --git a/deps/zlib-1.2.10/contrib/pascal/readme.txt b/deps/zlib-1.2.10/contrib/pascal/readme.txt new file mode 100644 index 0000000..60e87c8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/pascal/readme.txt @@ -0,0 +1,76 @@ + +This directory contains a Pascal (Delphi, Kylix) interface to the +zlib data compression library. + + +Directory listing +================= + +zlibd32.mak makefile for Borland C++ +example.pas usage example of zlib +zlibpas.pas the Pascal interface to zlib +readme.txt this file + + +Compatibility notes +=================== + +- Although the name "zlib" would have been more normal for the + zlibpas unit, this name is already taken by Borland's ZLib unit. + This is somehow unfortunate, because that unit is not a genuine + interface to the full-fledged zlib functionality, but a suite of + class wrappers around zlib streams. Other essential features, + such as checksums, are missing. + It would have been more appropriate for that unit to have a name + like "ZStreams", or something similar. + +- The C and zlib-supplied types int, uInt, long, uLong, etc. are + translated directly into Pascal types of similar sizes (Integer, + LongInt, etc.), to avoid namespace pollution. In particular, + there is no conversion of unsigned int into a Pascal unsigned + integer. The Word type is non-portable and has the same size + (16 bits) both in a 16-bit and in a 32-bit environment, unlike + Integer. Even if there is a 32-bit Cardinal type, there is no + real need for unsigned int in zlib under a 32-bit environment. + +- Except for the callbacks, the zlib function interfaces are + assuming the calling convention normally used in Pascal + (__pascal for DOS and Windows16, __fastcall for Windows32). + Since the cdecl keyword is used, the old Turbo Pascal does + not work with this interface. + +- The gz* function interfaces are not translated, to avoid + interfacing problems with the C runtime library. Besides, + gzprintf(gzFile file, const char *format, ...) + cannot be translated into Pascal. + + +Legal issues +============ + +The zlibpas interface is: + Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler. + Copyright (C) 1998 by Bob Dellaca. + Copyright (C) 2003 by Cosmin Truta. + +The example program is: + Copyright (C) 1995-2003 by Jean-loup Gailly. + Copyright (C) 1998,1999,2000 by Jacques Nomssi Nzali. + Copyright (C) 2003 by Cosmin Truta. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + diff --git a/deps/zlib-1.2.10/contrib/pascal/zlibd32.mak b/deps/zlib-1.2.10/contrib/pascal/zlibd32.mak new file mode 100644 index 0000000..9bb00b7 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/pascal/zlibd32.mak @@ -0,0 +1,99 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/deps/zlib-1.2.10/contrib/pascal/zlibpas.pas b/deps/zlib-1.2.10/contrib/pascal/zlibpas.pas new file mode 100644 index 0000000..2330898 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/pascal/zlibpas.pas @@ -0,0 +1,276 @@ +(* zlibpas -- Pascal interface to the zlib data compression library + * + * Copyright (C) 2003 Cosmin Truta. + * Derived from original sources by Bob Dellaca. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +unit zlibpas; + +interface + +const + ZLIB_VERSION = '1.2.10'; + ZLIB_VERNUM = $12a0; + +type + alloc_func = function(opaque: Pointer; items, size: Integer): Pointer; + cdecl; + free_func = procedure(opaque, address: Pointer); + cdecl; + + in_func = function(opaque: Pointer; var buf: PByte): Integer; + cdecl; + out_func = function(opaque: Pointer; buf: PByte; size: Integer): Integer; + cdecl; + + z_streamp = ^z_stream; + z_stream = packed record + next_in: PChar; (* next input byte *) + avail_in: Integer; (* number of bytes available at next_in *) + total_in: LongInt; (* total nb of input bytes read so far *) + + next_out: PChar; (* next output byte should be put there *) + avail_out: Integer; (* remaining free space at next_out *) + total_out: LongInt; (* total nb of bytes output so far *) + + msg: PChar; (* last error message, NULL if no error *) + state: Pointer; (* not visible by applications *) + + zalloc: alloc_func; (* used to allocate the internal state *) + zfree: free_func; (* used to free the internal state *) + opaque: Pointer; (* private data object passed to zalloc and zfree *) + + data_type: Integer; (* best guess about the data type: ascii or binary *) + adler: LongInt; (* adler32 value of the uncompressed data *) + reserved: LongInt; (* reserved for future use *) + end; + + gz_headerp = ^gz_header; + gz_header = packed record + text: Integer; (* true if compressed data believed to be text *) + time: LongInt; (* modification time *) + xflags: Integer; (* extra flags (not used when writing a gzip file) *) + os: Integer; (* operating system *) + extra: PChar; (* pointer to extra field or Z_NULL if none *) + extra_len: Integer; (* extra field length (valid if extra != Z_NULL) *) + extra_max: Integer; (* space at extra (only when reading header) *) + name: PChar; (* pointer to zero-terminated file name or Z_NULL *) + name_max: Integer; (* space at name (only when reading header) *) + comment: PChar; (* pointer to zero-terminated comment or Z_NULL *) + comm_max: Integer; (* space at comment (only when reading header) *) + hcrc: Integer; (* true if there was or will be a header crc *) + done: Integer; (* true when done reading gzip header *) + end; + +(* constants *) +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + Z_BLOCK = 5; + Z_TREES = 6; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = -1; + Z_STREAM_ERROR = -2; + Z_DATA_ERROR = -3; + Z_MEM_ERROR = -4; + Z_BUF_ERROR = -5; + Z_VERSION_ERROR = -6; + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = -1; + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_FIXED = 4; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_TEXT = 1; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + +(* basic functions *) +function zlibVersion: PChar; +function deflateInit(var strm: z_stream; level: Integer): Integer; +function deflate(var strm: z_stream; flush: Integer): Integer; +function deflateEnd(var strm: z_stream): Integer; +function inflateInit(var strm: z_stream): Integer; +function inflate(var strm: z_stream; flush: Integer): Integer; +function inflateEnd(var strm: z_stream): Integer; + +(* advanced functions *) +function deflateInit2(var strm: z_stream; level, method, windowBits, + memLevel, strategy: Integer): Integer; +function deflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function deflateCopy(var dest, source: z_stream): Integer; +function deflateReset(var strm: z_stream): Integer; +function deflateParams(var strm: z_stream; level, strategy: Integer): Integer; +function deflateTune(var strm: z_stream; good_length, max_lazy, nice_length, max_chain: Integer): Integer; +function deflateBound(var strm: z_stream; sourceLen: LongInt): LongInt; +function deflatePending(var strm: z_stream; var pending: Integer; var bits: Integer): Integer; +function deflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function deflateSetHeader(var strm: z_stream; head: gz_header): Integer; +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +function inflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function inflateSync(var strm: z_stream): Integer; +function inflateCopy(var dest, source: z_stream): Integer; +function inflateReset(var strm: z_stream): Integer; +function inflateReset2(var strm: z_stream; windowBits: Integer): Integer; +function inflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function inflateMark(var strm: z_stream): LongInt; +function inflateGetHeader(var strm: z_stream; var head: gz_header): Integer; +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer; + out_fn: out_func; out_desc: Pointer): Integer; +function inflateBackEnd(var strm: z_stream): Integer; +function zlibCompileFlags: LongInt; + +(* utility functions *) +function compress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; +function compress2(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt; + level: Integer): Integer; +function compressBound(sourceLen: LongInt): LongInt; +function uncompress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; + +(* checksum functions *) +function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt; +function adler32_combine(adler1, adler2, len2: LongInt): LongInt; +function crc32(crc: LongInt; const buf: PChar; len: Integer): LongInt; +function crc32_combine(crc1, crc2, len2: LongInt): LongInt; + +(* various hacks, don't look :) *) +function deflateInit_(var strm: z_stream; level: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit_(var strm: z_stream; const version: PChar; + stream_size: Integer): Integer; +function deflateInit2_(var strm: z_stream; + level, method, windowBits, memLevel, strategy: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit2_(var strm: z_stream; windowBits: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateBackInit_(var strm: z_stream; + windowBits: Integer; window: PChar; + const version: PChar; stream_size: Integer): Integer; + + +implementation + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +function adler32; external; +function adler32_combine; external; +function compress; external; +function compress2; external; +function compressBound; external; +function crc32; external; +function crc32_combine; external; +function deflate; external; +function deflateBound; external; +function deflateCopy; external; +function deflateEnd; external; +function deflateInit_; external; +function deflateInit2_; external; +function deflateParams; external; +function deflatePending; external; +function deflatePrime; external; +function deflateReset; external; +function deflateSetDictionary; external; +function deflateSetHeader; external; +function deflateTune; external; +function inflate; external; +function inflateBack; external; +function inflateBackEnd; external; +function inflateBackInit_; external; +function inflateCopy; external; +function inflateEnd; external; +function inflateGetHeader; external; +function inflateInit_; external; +function inflateInit2_; external; +function inflateMark; external; +function inflatePrime; external; +function inflateReset; external; +function inflateReset2; external; +function inflateSetDictionary; external; +function inflateSync; external; +function uncompress; external; +function zlibCompileFlags; external; +function zlibVersion; external; + +function deflateInit(var strm: z_stream; level: Integer): Integer; +begin + Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream)); +end; + +function deflateInit2(var strm: z_stream; level, method, windowBits, memLevel, + strategy: Integer): Integer; +begin + Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit(var strm: z_stream): Integer; +begin + Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +begin + Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +begin + Result := inflateBackInit_(strm, windowBits, window, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + GetMem(Result, Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + +end. diff --git a/deps/zlib-1.2.10/contrib/puff/Makefile b/deps/zlib-1.2.10/contrib/puff/Makefile new file mode 100644 index 0000000..0e2594c --- /dev/null +++ b/deps/zlib-1.2.10/contrib/puff/Makefile @@ -0,0 +1,42 @@ +CFLAGS=-O + +puff: puff.o pufftest.o + +puff.o: puff.h + +pufftest.o: puff.h + +test: puff + puff zeros.raw + +puft: puff.c puff.h pufftest.o + cc -fprofile-arcs -ftest-coverage -o puft puff.c pufftest.o + +# puff full coverage test (should say 100%) +cov: puft + @rm -f *.gcov *.gcda + @puft -w zeros.raw 2>&1 | cat > /dev/null + @echo '04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '00 00 00 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 254 + @echo '00 01 00 fe ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '01 01 00 fe ff 0a' | xxd -r -p | puft -f 2>&1 | cat > /dev/null + @echo '02 7e ff ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246 + @echo '02' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '04 80 49 92 24 49 92 24 0f b4 ff ff c3 04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '04 80 49 92 24 49 92 24 71 ff ff 93 11 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 249 + @echo '04 c0 81 08 00 00 00 00 20 7f eb 0b 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246 + @echo '0b 00 00' | xxd -r -p | puft -f 2>&1 | cat > /dev/null + @echo '1a 07' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246 + @echo '0c c0 81 00 00 00 00 00 90 ff 6b 04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 245 + @puft -f zeros.raw 2>&1 | cat > /dev/null + @echo 'fc 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 253 + @echo '04 00 fe ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 252 + @echo '04 00 24 49' | xxd -r -p | puft 2> /dev/null || test $$? -eq 251 + @echo '04 80 49 92 24 49 92 24 0f b4 ff ff c3 84' | xxd -r -p | puft 2> /dev/null || test $$? -eq 248 + @echo '04 00 24 e9 ff ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 250 + @echo '04 00 24 e9 ff 6d' | xxd -r -p | puft 2> /dev/null || test $$? -eq 247 + @gcov -n puff.c + +clean: + rm -f puff puft *.o *.gc* diff --git a/deps/zlib-1.2.10/contrib/puff/README b/deps/zlib-1.2.10/contrib/puff/README new file mode 100644 index 0000000..bbc4cb5 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/puff/README @@ -0,0 +1,63 @@ +Puff -- A Simple Inflate +3 Mar 2003 +Mark Adler +madler@alumni.caltech.edu + +What this is -- + +puff.c provides the routine puff() to decompress the deflate data format. It +does so more slowly than zlib, but the code is about one-fifth the size of the +inflate code in zlib, and written to be very easy to read. + +Why I wrote this -- + +puff.c was written to document the deflate format unambiguously, by virtue of +being working C code. It is meant to supplement RFC 1951, which formally +describes the deflate format. I have received many questions on details of the +deflate format, and I hope that reading this code will answer those questions. +puff.c is heavily commented with details of the deflate format, especially +those little nooks and cranies of the format that might not be obvious from a +specification. + +puff.c may also be useful in applications where code size or memory usage is a +very limited resource, and speed is not as important. + +How to use it -- + +Well, most likely you should just be reading puff.c and using zlib for actual +applications, but if you must ... + +Include puff.h in your code, which provides this prototype: + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ + +Then you can call puff() to decompress a deflate stream that is in memory in +its entirety at source, to a sufficiently sized block of memory for the +decompressed data at dest. puff() is the only external symbol in puff.c The +only C library functions that puff.c needs are setjmp() and longjmp(), which +are used to simplify error checking in the code to improve readabilty. puff.c +does no memory allocation, and uses less than 2K bytes off of the stack. + +If destlen is not enough space for the uncompressed data, then inflate will +return an error without writing more than destlen bytes. Note that this means +that in order to decompress the deflate data successfully, you need to know +the size of the uncompressed data ahead of time. + +If needed, puff() can determine the size of the uncompressed data with no +output space. This is done by passing dest equal to (unsigned char *)0. Then +the initial value of *destlen is ignored and *destlen is set to the length of +the uncompressed data. So if the size of the uncompressed data is not known, +then two passes of puff() can be used--first to determine the size, and second +to do the actual inflation after allocating the appropriate memory. Not +pretty, but it works. (This is one of the reasons you should be using zlib.) + +The deflate format is self-terminating. If the deflate stream does not end +in *sourcelen bytes, puff() will return an error without reading at or past +endsource. + +On return, *sourcelen is updated to the amount of input data consumed, and +*destlen is updated to the size of the uncompressed data. See the comments +in puff.c for the possible return codes for puff(). diff --git a/deps/zlib-1.2.10/contrib/puff/puff.c b/deps/zlib-1.2.10/contrib/puff/puff.c new file mode 100644 index 0000000..c6c90d7 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/puff/puff.c @@ -0,0 +1,840 @@ +/* + * puff.c + * Copyright (C) 2002-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 2.3, 21 Jan 2013 + * + * puff.c is a simple inflate written to be an unambiguous way to specify the + * deflate format. It is not written for speed but rather simplicity. As a + * side benefit, this code might actually be useful when small code is more + * important than speed, such as bootstrap applications. For typical deflate + * data, zlib's inflate() is about four times as fast as puff(). zlib's + * inflate compiles to around 20K on my machine, whereas puff.c compiles to + * around 4K on my machine (a PowerPC using GNU cc). If the faster decode() + * function here is used, then puff() is only twice as slow as zlib's + * inflate(). + * + * All dynamically allocated memory comes from the stack. The stack required + * is less than 2K bytes. This code is compatible with 16-bit int's and + * assumes that long's are at least 32 bits. puff.c uses the short data type, + * assumed to be 16 bits, for arrays in order to conserve memory. The code + * works whether integers are stored big endian or little endian. + * + * In the comments below are "Format notes" that describe the inflate process + * and document some of the less obvious aspects of the format. This source + * code is meant to supplement RFC 1951, which formally describes the deflate + * format: + * + * http://www.zlib.org/rfc-deflate.html + */ + +/* + * Change history: + * + * 1.0 10 Feb 2002 - First version + * 1.1 17 Feb 2002 - Clarifications of some comments and notes + * - Update puff() dest and source pointers on negative + * errors to facilitate debugging deflators + * - Remove longest from struct huffman -- not needed + * - Simplify offs[] index in construct() + * - Add input size and checking, using longjmp() to + * maintain easy readability + * - Use short data type for large arrays + * - Use pointers instead of long to specify source and + * destination sizes to avoid arbitrary 4 GB limits + * 1.2 17 Mar 2002 - Add faster version of decode(), doubles speed (!), + * but leave simple version for readabilty + * - Make sure invalid distances detected if pointers + * are 16 bits + * - Fix fixed codes table error + * - Provide a scanning mode for determining size of + * uncompressed data + * 1.3 20 Mar 2002 - Go back to lengths for puff() parameters [Gailly] + * - Add a puff.h file for the interface + * - Add braces in puff() for else do [Gailly] + * - Use indexes instead of pointers for readability + * 1.4 31 Mar 2002 - Simplify construct() code set check + * - Fix some comments + * - Add FIXLCODES #define + * 1.5 6 Apr 2002 - Minor comment fixes + * 1.6 7 Aug 2002 - Minor format changes + * 1.7 3 Mar 2003 - Added test code for distribution + * - Added zlib-like license + * 1.8 9 Jan 2004 - Added some comments on no distance codes case + * 1.9 21 Feb 2008 - Fix bug on 16-bit integer architectures [Pohland] + * - Catch missing end-of-block symbol error + * 2.0 25 Jul 2008 - Add #define to permit distance too far back + * - Add option in TEST code for puff to write the data + * - Add option in TEST code to skip input bytes + * - Allow TEST code to read from piped stdin + * 2.1 4 Apr 2010 - Avoid variable initialization for happier compilers + * - Avoid unsigned comparisons for even happier compilers + * 2.2 25 Apr 2010 - Fix bug in variable initializations [Oberhumer] + * - Add const where appropriate [Oberhumer] + * - Split if's and ?'s for coverage testing + * - Break out test code to separate file + * - Move NIL to puff.h + * - Allow incomplete code only if single code length is 1 + * - Add full code coverage test to Makefile + * 2.3 21 Jan 2013 - Check for invalid code length codes in dynamic blocks + */ + +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "puff.h" /* prototype for puff() */ + +#define local static /* for local function definitions */ + +/* + * Maximums for allocations and loops. It is not useful to change these -- + * they are fixed by the deflate format. + */ +#define MAXBITS 15 /* maximum bits in a code */ +#define MAXLCODES 286 /* maximum number of literal/length codes */ +#define MAXDCODES 30 /* maximum number of distance codes */ +#define MAXCODES (MAXLCODES+MAXDCODES) /* maximum codes lengths to read */ +#define FIXLCODES 288 /* number of fixed literal/length codes */ + +/* input and output state */ +struct state { + /* output state */ + unsigned char *out; /* output buffer */ + unsigned long outlen; /* available space at out */ + unsigned long outcnt; /* bytes written to out so far */ + + /* input state */ + const unsigned char *in; /* input buffer */ + unsigned long inlen; /* available input at in */ + unsigned long incnt; /* bytes read so far */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + long val; /* bit accumulator (can use up to 20 bits) */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->incnt == s->inlen) + longjmp(s->env, 1); /* out of input */ + val |= (long)(s->in[s->incnt++]) << s->bitcnt; /* load eight bits */ + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = (int)(val >> need); + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return (int)(val & ((1L << need) - 1)); +} + +/* + * Process a stored block. + * + * Format notes: + * + * - After the two-bit stored block type (00), the stored block length and + * stored bytes are byte-aligned for fast copying. Therefore any leftover + * bits in the byte that has the last bit of the type, as many as seven, are + * discarded. The value of the discarded bits are not defined and should not + * be checked against any expectation. + * + * - The second inverted copy of the stored block length does not have to be + * checked, but it's probably a good idea to do so anyway. + * + * - A stored block can have zero length. This is sometimes used to byte-align + * subsets of the compressed data for random access or partial recovery. + */ +local int stored(struct state *s) +{ + unsigned len; /* length of stored block */ + + /* discard leftover bits from current byte (assumes s->bitcnt < 8) */ + s->bitbuf = 0; + s->bitcnt = 0; + + /* get length and check against its one's complement */ + if (s->incnt + 4 > s->inlen) + return 2; /* not enough input */ + len = s->in[s->incnt++]; + len |= s->in[s->incnt++] << 8; + if (s->in[s->incnt++] != (~len & 0xff) || + s->in[s->incnt++] != ((~len >> 8) & 0xff)) + return -2; /* didn't match complement! */ + + /* copy len bytes from in to out */ + if (s->incnt + len > s->inlen) + return 2; /* not enough input */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; /* not enough output space */ + while (len--) + s->out[s->outcnt++] = s->in[s->incnt++]; + } + else { /* just scanning */ + s->outcnt += len; + s->incnt += len; + } + + /* done with a valid stored block */ + return 0; +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -10 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. A table-based decoding + * scheme (as used in zlib) does not need to do this reversal. + * + * - The first code for the shortest length is all zeros. Subsequent codes of + * the same length are simply integer increments of the previous code. When + * moving up a length, a zero bit is appended to the code. For a complete + * code, the last code of the longest length will be all ones. + * + * - Incomplete codes are handled by this decoder, since they are permitted + * in the deflate format. See the format notes for fixed() and dynamic(). + */ +#ifdef SLOW +local int decode(struct state *s, const struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + + code = first = index = 0; + for (len = 1; len <= MAXBITS; len++) { + code |= bits(s, 1); /* get next bit */ + count = h->count[len]; + if (code - count < first) /* if length len, return symbol */ + return h->symbol[index + (code - first)]; + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + } + return -10; /* ran out of codes */ +} + +/* + * A faster version of decode() for real applications of this code. It's not + * as readable, but it makes puff() twice as fast. And it only makes the code + * a few percent larger. + */ +#else /* !SLOW */ +local int decode(struct state *s, const struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= bitbuf & 1; + bitbuf >>= 1; + count = *next++; + if (code - count < first) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) + break; + if (s->incnt == s->inlen) + longjmp(s->env, 1); /* out of input */ + bitbuf = s->in[s->incnt++]; + if (left > 8) + left = 8; + } + return -10; /* ran out of codes */ +} +#endif /* SLOW */ + +/* + * Given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + * + * Not used by decode(), but used for error checking, h->count[0] is the number + * of the n symbols not in the code. So n - h->count[0] is the number of + * codes. This is useful for checking for incomplete codes that have more than + * one symbol, which is an error in a dynamic block. + * + * Assumption: for all i in 0..n-1, 0 <= length[i] <= MAXBITS + * This is assured by the construction of the length arrays in dynamic() and + * fixed() and is not verified by construct(). + * + * Format notes: + * + * - Permitted and expected examples of incomplete codes are one of the fixed + * codes and any code with a single symbol which in deflate is coded as one + * bit instead of zero bits. See the format notes for fixed() and dynamic(). + * + * - Within a given code length, the symbols are kept in ascending order for + * the code bits definition. + */ +local int construct(struct huffman *h, const short *length, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) + return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode literal/length and distance codes until an end-of-block code. + * + * Format notes: + * + * - Compressed data that is after the block type if fixed or after the code + * description if dynamic is a combination of literals and length/distance + * pairs terminated by and end-of-block code. Literals are simply Huffman + * coded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - Literals, lengths, and the end-of-block code are combined into a single + * code of up to 286 symbols. They are 256 literals (0..255), 29 length + * symbols (257..285), and the end-of-block symbol (256). + * + * - There are 256 possible lengths (3..258), and so 29 symbols are not enough + * to represent all of those. Lengths 3..10 and 258 are in fact represented + * by just a length symbol. Lengths 11..257 are represented as a symbol and + * some number of extra bits that are added as an integer to the base length + * of the length symbol. The number of extra bits is determined by the base + * length symbol. These are in the static arrays below, lens[] for the base + * lengths and lext[] for the corresponding number of extra bits. + * + * - The reason that 258 gets its own symbol is that the longest length is used + * often in highly redundant files. Note that 258 can also be coded as the + * base value 227 plus the maximum extra value of 31. While a good deflate + * should never do this, it is not an error, and should be decoded properly. + * + * - If a length is decoded, including its extra bits if any, then it is + * followed a distance code. There are up to 30 distance symbols. Again + * there are many more possible distances (1..32768), so extra bits are added + * to a base value represented by the symbol. The distances 1..4 get their + * own symbol, but the rest require extra bits. The base distances and + * corresponding number of extra bits are below in the static arrays dist[] + * and dext[]. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 258 + * simply copies the last byte 258 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. You should not use memcpy() since its behavior is not + * defined for overlapped arrays. You should not use memmove() or bcopy() + * since though their behavior -is- defined for overlapping arrays, it is + * defined to do the wrong thing in this case. + */ +local int codes(struct state *s, + const struct huffman *lencode, + const struct huffman *distcode) +{ + int symbol; /* decoded symbol */ + int len; /* length for copy */ + unsigned dist; /* distance for copy */ + static const short lens[29] = { /* Size base for length codes 257..285 */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258}; + static const short lext[29] = { /* Extra bits for length codes 257..285 */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0}; + static const short dists[30] = { /* Offset base for distance codes 0..29 */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577}; + static const short dext[30] = { /* Extra bits for distance codes 0..29 */ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13}; + + /* decode literals and length/distance pairs */ + do { + symbol = decode(s, lencode); + if (symbol < 0) + return symbol; /* invalid symbol */ + if (symbol < 256) { /* literal: symbol is the byte */ + /* write out the literal */ + if (s->out != NIL) { + if (s->outcnt == s->outlen) + return 1; + s->out[s->outcnt] = symbol; + } + s->outcnt++; + } + else if (symbol > 256) { /* length */ + /* get and compute length */ + symbol -= 257; + if (symbol >= 29) + return -10; /* invalid fixed code */ + len = lens[symbol] + bits(s, lext[symbol]); + + /* get and check distance */ + symbol = decode(s, distcode); + if (symbol < 0) + return symbol; /* invalid symbol */ + dist = dists[symbol] + bits(s, dext[symbol]); +#ifndef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (dist > s->outcnt) + return -11; /* distance too far back */ +#endif + + /* copy length bytes from distance bytes back */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; + while (len--) { + s->out[s->outcnt] = +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + dist > s->outcnt ? + 0 : +#endif + s->out[s->outcnt - dist]; + s->outcnt++; + } + } + else + s->outcnt += len; + } + } while (symbol != 256); /* end of block symbol */ + + /* done with a valid fixed or dynamic block */ + return 0; +} + +/* + * Process a fixed codes block. + * + * Format notes: + * + * - This block type can be useful for compressing small amounts of data for + * which the size of the code descriptions in a dynamic block exceeds the + * benefit of custom codes for that block. For fixed codes, no bits are + * spent on code descriptions. Instead the code lengths for literal/length + * codes and distance codes are fixed. The specific lengths for each symbol + * can be seen in the "for" loops below. + * + * - The literal/length code is complete, but has two symbols that are invalid + * and should result in an error if received. This cannot be implemented + * simply as an incomplete code since those two symbols are in the "middle" + * of the code. They are eight bits long and the longest literal/length\ + * code is nine bits. Therefore the code must be constructed with those + * symbols, and the invalid symbols must be detected after decoding. + * + * - The fixed distance codes also have two invalid symbols that should result + * in an error if received. Since all of the distance codes are the same + * length, this can be implemented as an incomplete code. Then the invalid + * codes are detected while decoding. + */ +local int fixed(struct state *s) +{ + static int virgin = 1; + static short lencnt[MAXBITS+1], lensym[FIXLCODES]; + static short distcnt[MAXBITS+1], distsym[MAXDCODES]; + static struct huffman lencode, distcode; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + int symbol; + short lengths[FIXLCODES]; + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* literal/length table */ + for (symbol = 0; symbol < 144; symbol++) + lengths[symbol] = 8; + for (; symbol < 256; symbol++) + lengths[symbol] = 9; + for (; symbol < 280; symbol++) + lengths[symbol] = 7; + for (; symbol < FIXLCODES; symbol++) + lengths[symbol] = 8; + construct(&lencode, lengths, FIXLCODES); + + /* distance table */ + for (symbol = 0; symbol < MAXDCODES; symbol++) + lengths[symbol] = 5; + construct(&distcode, lengths, MAXDCODES); + + /* do this just once */ + virgin = 0; + } + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Process a dynamic codes block. + * + * Format notes: + * + * - A dynamic block starts with a description of the literal/length and + * distance codes for that block. New dynamic blocks allow the compressor to + * rapidly adapt to changing data with new codes optimized for that data. + * + * - The codes used by the deflate format are "canonical", which means that + * the actual bits of the codes are generated in an unambiguous way simply + * from the number of bits in each code. Therefore the code descriptions + * are simply a list of code lengths for each symbol. + * + * - The code lengths are stored in order for the symbols, so lengths are + * provided for each of the literal/length symbols, and for each of the + * distance symbols. + * + * - If a symbol is not used in the block, this is represented by a zero as + * as the code length. This does not mean a zero-length code, but rather + * that no code should be created for this symbol. There is no way in the + * deflate format to represent a zero-length code. + * + * - The maximum number of bits in a code is 15, so the possible lengths for + * any code are 1..15. + * + * - The fact that a length of zero is not permitted for a code has an + * interesting consequence. Normally if only one symbol is used for a given + * code, then in fact that code could be represented with zero bits. However + * in deflate, that code has to be at least one bit. So for example, if + * only a single distance base symbol appears in a block, then it will be + * represented by a single code of length one, in particular one 0 bit. This + * is an incomplete code, since if a 1 bit is received, it has no meaning, + * and should result in an error. So incomplete distance codes of one symbol + * should be permitted, and the receipt of invalid codes should be handled. + * + * - It is also possible to have a single literal/length code, but that code + * must be the end-of-block code, since every dynamic block has one. This + * is not the most efficient way to create an empty block (an empty fixed + * block is fewer bits), but it is allowed by the format. So incomplete + * literal/length codes of one symbol should also be permitted. + * + * - If there are only literal codes and no lengths, then there are no distance + * codes. This is represented by one distance code with zero bits. + * + * - The list of up to 286 length/literal lengths and up to 30 distance lengths + * are themselves compressed using Huffman codes and run-length encoding. In + * the list of code lengths, a 0 symbol means no code, a 1..15 symbol means + * that length, and the symbols 16, 17, and 18 are run-length instructions. + * Each of 16, 17, and 18 are follwed by extra bits to define the length of + * the run. 16 copies the last length 3 to 6 times. 17 represents 3 to 10 + * zero lengths, and 18 represents 11 to 138 zero lengths. Unused symbols + * are common, hence the special coding for zero lengths. + * + * - The symbols for 0..18 are Huffman coded, and so that code must be + * described first. This is simply a sequence of up to 19 three-bit values + * representing no code (0) or the code length for that symbol (1..7). + * + * - A dynamic block starts with three fixed-size counts from which is computed + * the number of literal/length code lengths, the number of distance code + * lengths, and the number of code length code lengths (ok, you come up with + * a better name!) in the code descriptions. For the literal/length and + * distance codes, lengths after those provided are considered zero, i.e. no + * code. The code length code lengths are received in a permuted order (see + * the order[] array below) to make a short code length code length list more + * likely. As it turns out, very short and very long codes are less likely + * to be seen in a dynamic code description, hence what may appear initially + * to be a peculiar ordering. + * + * - Given the number of literal/length code lengths (nlen) and distance code + * lengths (ndist), then they are treated as one long list of nlen + ndist + * code lengths. Therefore run-length coding can and often does cross the + * boundary between the two sets of lengths. + * + * - So to summarize, the code description at the start of a dynamic block is + * three counts for the number of code lengths for the literal/length codes, + * the distance codes, and the code length codes. This is followed by the + * code length code lengths, three bits each. This is used to construct the + * code length code which is used to read the remainder of the lengths. Then + * the literal/length code lengths and distance lengths are read as a single + * set of lengths using the code length codes. Codes are constructed from + * the resulting two sets of lengths, and then finally you can start + * decoding actual compressed data in the block. + * + * - For reference, a "typical" size for the code description in a dynamic + * block is around 80 bytes. + */ +local int dynamic(struct state *s) +{ + int nlen, ndist, ncode; /* number of lengths in descriptor */ + int index; /* index of lengths[] */ + int err; /* construct() return value */ + short lengths[MAXCODES]; /* descriptor code lengths */ + short lencnt[MAXBITS+1], lensym[MAXLCODES]; /* lencode memory */ + short distcnt[MAXBITS+1], distsym[MAXDCODES]; /* distcode memory */ + struct huffman lencode, distcode; /* length and distance codes */ + static const short order[19] = /* permutation of code length codes */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* get number of lengths in each table, check lengths */ + nlen = bits(s, 5) + 257; + ndist = bits(s, 5) + 1; + ncode = bits(s, 4) + 4; + if (nlen > MAXLCODES || ndist > MAXDCODES) + return -3; /* bad counts */ + + /* read code length code lengths (really), missing lengths are zero */ + for (index = 0; index < ncode; index++) + lengths[order[index]] = bits(s, 3); + for (; index < 19; index++) + lengths[order[index]] = 0; + + /* build huffman table for code lengths codes (use lencode temporarily) */ + err = construct(&lencode, lengths, 19); + if (err != 0) /* require complete code set here */ + return -4; + + /* read length/literal and distance code length tables */ + index = 0; + while (index < nlen + ndist) { + int symbol; /* decoded value */ + int len; /* last length to repeat */ + + symbol = decode(s, &lencode); + if (symbol < 0) + return symbol; /* invalid symbol */ + if (symbol < 16) /* length in 0..15 */ + lengths[index++] = symbol; + else { /* repeat instruction */ + len = 0; /* assume repeating zeros */ + if (symbol == 16) { /* repeat last length 3..6 times */ + if (index == 0) + return -5; /* no last length! */ + len = lengths[index - 1]; /* last length */ + symbol = 3 + bits(s, 2); + } + else if (symbol == 17) /* repeat zero 3..10 times */ + symbol = 3 + bits(s, 3); + else /* == 18, repeat zero 11..138 times */ + symbol = 11 + bits(s, 7); + if (index + symbol > nlen + ndist) + return -6; /* too many lengths! */ + while (symbol--) /* repeat last or zero symbol times */ + lengths[index++] = len; + } + } + + /* check for end-of-block code -- there better be one! */ + if (lengths[256] == 0) + return -9; + + /* build huffman table for literal/length codes */ + err = construct(&lencode, lengths, nlen); + if (err && (err < 0 || nlen != lencode.count[0] + lencode.count[1])) + return -7; /* incomplete code ok only for single length 1 code */ + + /* build huffman table for distance codes */ + err = construct(&distcode, lengths + nlen, ndist); + if (err && (err < 0 || ndist != distcode.count[0] + distcode.count[1])) + return -8; /* incomplete code ok only for single length 1 code */ + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Inflate source to dest. On return, destlen and sourcelen are updated to the + * size of the uncompressed data and the size of the deflate data respectively. + * On success, the return value of puff() is zero. If there is an error in the + * source data, i.e. it is not in the deflate format, then a negative value is + * returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. In that case, destlen and + * sourcelen are not updated to facilitate retrying from the beginning with the + * provision of more input data or more output space. In the case of invalid + * inflate data (a negative error), the dest and source pointers are updated to + * facilitate the debugging of deflators. + * + * puff() also has a mode to determine the size of the uncompressed output with + * no output written. For this dest must be (unsigned char *)0. In this case, + * the input value of *destlen is ignored, and on return *destlen is set to the + * size of the uncompressed output. + * + * The return codes are: + * + * 2: available inflate data did not terminate + * 1: output space exhausted before completing inflate + * 0: successful inflate + * -1: invalid block type (type == 3) + * -2: stored block length did not match one's complement + * -3: dynamic block code description: too many length or distance codes + * -4: dynamic block code description: code lengths codes incomplete + * -5: dynamic block code description: repeat lengths with no first length + * -6: dynamic block code description: repeat more than specified lengths + * -7: dynamic block code description: invalid literal/length code lengths + * -8: dynamic block code description: invalid distance code lengths + * -9: dynamic block code description: missing end-of-block code + * -10: invalid literal/length or distance code in fixed or dynamic block + * -11: distance is too far back in fixed or dynamic block + * + * Format notes: + * + * - Three bits are read for each block to determine the kind of block and + * whether or not it is the last block. Then the block is decoded and the + * process repeated if it was not the last block. + * + * - The leftover bits in the last byte of the deflate data after the last + * block (if it was a fixed or dynamic block) are undefined and have no + * expected values to check. + */ +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + const unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen) /* amount of input available */ +{ + struct state s; /* input/output state */ + int last, type; /* block information */ + int err; /* return value */ + + /* initialize output state */ + s.out = dest; + s.outlen = *destlen; /* ignored if dest is NIL */ + s.outcnt = 0; + + /* initialize input state */ + s.in = source; + s.inlen = *sourcelen; + s.incnt = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp() */ + err = 2; /* then skip do-loop, return error */ + else { + /* process blocks until last block or error */ + do { + last = bits(&s, 1); /* one if last block */ + type = bits(&s, 2); /* block type 0..3 */ + err = type == 0 ? + stored(&s) : + (type == 1 ? + fixed(&s) : + (type == 2 ? + dynamic(&s) : + -1)); /* type == 3, invalid */ + if (err != 0) + break; /* return with error */ + } while (!last); + } + + /* update the lengths and return */ + if (err <= 0) { + *destlen = s.outcnt; + *sourcelen = s.incnt; + } + return err; +} diff --git a/deps/zlib-1.2.10/contrib/puff/puff.h b/deps/zlib-1.2.10/contrib/puff/puff.h new file mode 100644 index 0000000..e23a245 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/puff/puff.h @@ -0,0 +1,35 @@ +/* puff.h + Copyright (C) 2002-2013 Mark Adler, all rights reserved + version 2.3, 21 Jan 2013 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * See puff.c for purpose and usage. + */ +#ifndef NIL +# define NIL ((unsigned char *)0) /* for no output option */ +#endif + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + const unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ diff --git a/deps/zlib-1.2.10/contrib/puff/pufftest.c b/deps/zlib-1.2.10/contrib/puff/pufftest.c new file mode 100644 index 0000000..7764814 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/puff/pufftest.c @@ -0,0 +1,165 @@ +/* + * pufftest.c + * Copyright (C) 2002-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 2.3, 21 Jan 2013 + */ + +/* Example of how to use puff(). + + Usage: puff [-w] [-f] [-nnn] file + ... | puff [-w] [-f] [-nnn] + + where file is the input file with deflate data, nnn is the number of bytes + of input to skip before inflating (e.g. to skip a zlib or gzip header), and + -w is used to write the decompressed data to stdout. -f is for coverage + testing, and causes pufftest to fail with not enough output space (-f does + a write like -w, so -w is not required). */ + +#include +#include +#include "puff.h" + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define local static + +/* Return size times approximately the cube root of 2, keeping the result as 1, + 3, or 5 times a power of 2 -- the result is always > size, until the result + is the maximum value of an unsigned long, where it remains. This is useful + to keep reallocations less than ~33% over the actual data. */ +local size_t bythirds(size_t size) +{ + int n; + size_t m; + + m = size; + for (n = 0; m; n++) + m >>= 1; + if (n < 3) + return size + 1; + n -= 3; + m = size >> n; + m += m == 6 ? 2 : 1; + m <<= n; + return m > size ? m : (size_t)(-1); +} + +/* Read the input file *name, or stdin if name is NULL, into allocated memory. + Reallocate to larger buffers until the entire file is read in. Return a + pointer to the allocated data, or NULL if there was a memory allocation + failure. *len is the number of bytes of data read from the input file (even + if load() returns NULL). If the input file was empty or could not be opened + or read, *len is zero. */ +local void *load(const char *name, size_t *len) +{ + size_t size; + void *buf, *swap; + FILE *in; + + *len = 0; + buf = malloc(size = 4096); + if (buf == NULL) + return NULL; + in = name == NULL ? stdin : fopen(name, "rb"); + if (in != NULL) { + for (;;) { + *len += fread((char *)buf + *len, 1, size - *len, in); + if (*len < size) break; + size = bythirds(size); + if (size == *len || (swap = realloc(buf, size)) == NULL) { + free(buf); + buf = NULL; + break; + } + buf = swap; + } + fclose(in); + } + return buf; +} + +int main(int argc, char **argv) +{ + int ret, put = 0, fail = 0; + unsigned skip = 0; + char *arg, *name = NULL; + unsigned char *source = NULL, *dest; + size_t len = 0; + unsigned long sourcelen, destlen; + + /* process arguments */ + while (arg = *++argv, --argc) + if (arg[0] == '-') { + if (arg[1] == 'w' && arg[2] == 0) + put = 1; + else if (arg[1] == 'f' && arg[2] == 0) + fail = 1, put = 1; + else if (arg[1] >= '0' && arg[1] <= '9') + skip = (unsigned)atoi(arg + 1); + else { + fprintf(stderr, "invalid option %s\n", arg); + return 3; + } + } + else if (name != NULL) { + fprintf(stderr, "only one file name allowed\n"); + return 3; + } + else + name = arg; + source = load(name, &len); + if (source == NULL) { + fprintf(stderr, "memory allocation failure\n"); + return 4; + } + if (len == 0) { + fprintf(stderr, "could not read %s, or it was empty\n", + name == NULL ? "" : name); + free(source); + return 3; + } + if (skip >= len) { + fprintf(stderr, "skip request of %d leaves no input\n", skip); + free(source); + return 3; + } + + /* test inflate data with offset skip */ + len -= skip; + sourcelen = (unsigned long)len; + ret = puff(NIL, &destlen, source + skip, &sourcelen); + if (ret) + fprintf(stderr, "puff() failed with return code %d\n", ret); + else { + fprintf(stderr, "puff() succeeded uncompressing %lu bytes\n", destlen); + if (sourcelen < len) fprintf(stderr, "%lu compressed bytes unused\n", + len - sourcelen); + } + + /* if requested, inflate again and write decompressd data to stdout */ + if (put && ret == 0) { + if (fail) + destlen >>= 1; + dest = malloc(destlen); + if (dest == NULL) { + fprintf(stderr, "memory allocation failure\n"); + free(source); + return 4; + } + puff(dest, &destlen, source + skip, &sourcelen); + SET_BINARY_MODE(stdout); + fwrite(dest, 1, destlen, stdout); + free(dest); + } + + /* clean up */ + free(source); + return ret; +} diff --git a/deps/zlib-1.2.10/contrib/puff/zeros.raw b/deps/zlib-1.2.10/contrib/puff/zeros.raw new file mode 100644 index 0000000..0a90e76 Binary files /dev/null and b/deps/zlib-1.2.10/contrib/puff/zeros.raw differ diff --git a/deps/zlib-1.2.10/contrib/testzlib/testzlib.c b/deps/zlib-1.2.10/contrib/testzlib/testzlib.c new file mode 100644 index 0000000..5f659de --- /dev/null +++ b/deps/zlib-1.2.10/contrib/testzlib/testzlib.c @@ -0,0 +1,275 @@ +#include +#include +#include + +#include "zlib.h" + + +void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) +{ + R->HighPart = A.HighPart - B.HighPart; + if (A.LowPart >= B.LowPart) + R->LowPart = A.LowPart - B.LowPart; + else + { + R->LowPart = A.LowPart - B.LowPart; + R->HighPart --; + } +} + +#ifdef _M_X64 +// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc +unsigned __int64 __rdtsc(void); +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + // printf("rdtsc = %I64x\n",__rdtsc()); + pbeginTime64->QuadPart=__rdtsc(); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres; + unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart)); + LIres.QuadPart=res; + // printf("rdtsc = %I64x\n",__rdtsc()); + return LIres; +} +#else +#ifdef _M_IX86 +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ + DWORD dwEdx,dwEax; + _asm + { + rdtsc + mov dwEax,eax + mov dwEdx,edx + } + pbeginTime64->LowPart=dwEax; + pbeginTime64->HighPart=dwEdx; +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + myGetRDTSC32(pbeginTime64); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres,endTime64; + myGetRDTSC32(&endTime64); + + LIres.LowPart=LIres.HighPart=0; + MyDoMinus64(&LIres,endTime64,beginTime64); + return LIres; +} +#else +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER lr; + lr.QuadPart=0; + return lr; +} +#endif +#endif + +void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) +{ + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))) + { + pbeginTime64->LowPart = GetTickCount(); + pbeginTime64->HighPart = 0; + } +} + +DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER endTime64,ticksPerSecond,ticks; + DWORDLONG ticksShifted,tickSecShifted; + DWORD dwLog=16+0; + DWORD dwRet; + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64))) + dwRet = (GetTickCount() - beginTime64.LowPart)*1; + else + { + MyDoMinus64(&ticks,endTime64,beginTime64); + QueryPerformanceFrequency(&ticksPerSecond); + + + { + ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog); + tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog); + + } + + dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted)); + dwRet *=1; + } + return dwRet; +} + +int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr) +{ + FILE* stream; + unsigned char* ptr; + int retVal=1; + stream=fopen(filename, "rb"); + if (stream==NULL) + return 0; + + fseek(stream,0,SEEK_END); + + *plFileSize=ftell(stream); + fseek(stream,0,SEEK_SET); + ptr=malloc((*plFileSize)+1); + if (ptr==NULL) + retVal=0; + else + { + if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) + retVal=0; + } + fclose(stream); + *pFilePtr=ptr; + return retVal; +} + +int main(int argc, char *argv[]) +{ + int BlockSizeCompress=0x8000; + int BlockSizeUncompress=0x8000; + int cprLevel=Z_DEFAULT_COMPRESSION ; + long lFileSize; + unsigned char* FilePtr; + long lBufferSizeCpr; + long lBufferSizeUncpr; + long lCompressedSize=0; + unsigned char* CprPtr; + unsigned char* UncprPtr; + long lSizeCpr,lSizeUncpr; + DWORD dwGetTick,dwMsecQP; + LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc; + + if (argc<=1) + { + printf("run TestZlib [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); + return 0; + } + + if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) + { + printf("error reading %s\n",argv[1]); + return 1; + } + else printf("file %s read, %u bytes\n",argv[1],lFileSize); + + if (argc>=3) + BlockSizeCompress=atol(argv[2]); + + if (argc>=4) + BlockSizeUncompress=atol(argv[3]); + + if (argc>=5) + cprLevel=(int)atol(argv[4]); + + lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; + lBufferSizeUncpr = lBufferSizeCpr; + + CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lFileSize; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + deflateInit(&zcpr,cprLevel); + + zcpr.next_in = FilePtr; + zcpr.next_out = CprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); + zcpr.avail_out = BlockSizeCompress; + ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeCpr=zcpr.total_out; + deflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total compress size = %u, in %u step\n",lSizeCpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr); + UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lSizeCpr; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + inflateInit(&zcpr); + + zcpr.next_in = CprPtr; + zcpr.next_out = UncprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); + zcpr.avail_out = BlockSizeUncompress; + ret=inflate(&zcpr,Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeUncpr=zcpr.total_out; + inflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + if (lSizeUncpr==lFileSize) + { + if (memcmp(FilePtr,UncprPtr,lFileSize)==0) + printf("compare ok\n"); + + } + + return 0; +} diff --git a/deps/zlib-1.2.10/contrib/testzlib/testzlib.txt b/deps/zlib-1.2.10/contrib/testzlib/testzlib.txt new file mode 100644 index 0000000..62258f1 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/testzlib/testzlib.txt @@ -0,0 +1,10 @@ +To build testzLib with Visual Studio 2005: + +copy to a directory file from : +- root of zLib tree +- contrib/testzlib +- contrib/masmx86 +- contrib/masmx64 +- contrib/vstudio/vc7 + +and open testzlib8.sln \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/untgz/Makefile b/deps/zlib-1.2.10/contrib/untgz/Makefile new file mode 100644 index 0000000..b54266f --- /dev/null +++ b/deps/zlib-1.2.10/contrib/untgz/Makefile @@ -0,0 +1,14 @@ +CC=cc +CFLAGS=-g + +untgz: untgz.o ../../libz.a + $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz + +untgz.o: untgz.c ../../zlib.h + $(CC) $(CFLAGS) -c -I../.. untgz.c + +../../libz.a: + cd ../..; ./configure; make + +clean: + rm -f untgz untgz.o *~ diff --git a/deps/zlib-1.2.10/contrib/untgz/Makefile.msc b/deps/zlib-1.2.10/contrib/untgz/Makefile.msc new file mode 100644 index 0000000..77b8602 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/untgz/Makefile.msc @@ -0,0 +1,17 @@ +CC=cl +CFLAGS=-MD + +untgz.exe: untgz.obj ..\..\zlib.lib + $(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib + +untgz.obj: untgz.c ..\..\zlib.h + $(CC) $(CFLAGS) -c -I..\.. untgz.c + +..\..\zlib.lib: + cd ..\.. + $(MAKE) -f win32\makefile.msc + cd contrib\untgz + +clean: + -del untgz.obj + -del untgz.exe diff --git a/deps/zlib-1.2.10/contrib/untgz/untgz.c b/deps/zlib-1.2.10/contrib/untgz/untgz.c new file mode 100644 index 0000000..2c391e5 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/untgz/untgz.c @@ -0,0 +1,674 @@ +/* + * untgz.c -- Display contents and extract files from a gzip'd TAR file + * + * written by Pedro A. Aranda Gutierrez + * adaptation to Unix by Jean-loup Gailly + * various fixes by Cosmin Truta + */ + +#include +#include +#include +#include +#include + +#include "zlib.h" + +#ifdef unix +# include +#else +# include +# include +#endif + +#ifdef WIN32 +#include +# ifndef F_OK +# define F_OK 0 +# endif +# define mkdir(dirname,mode) _mkdir(dirname) +# ifdef _MSC_VER +# define access(path,mode) _access(path,mode) +# define chmod(path,mode) _chmod(path,mode) +# define strdup(str) _strdup(str) +# endif +#else +# include +#endif + + +/* values used in typeflag field */ + +#define REGTYPE '0' /* regular file */ +#define AREGTYPE '\0' /* regular file */ +#define LNKTYPE '1' /* link */ +#define SYMTYPE '2' /* reserved */ +#define CHRTYPE '3' /* character special */ +#define BLKTYPE '4' /* block special */ +#define DIRTYPE '5' /* directory */ +#define FIFOTYPE '6' /* FIFO special */ +#define CONTTYPE '7' /* reserved */ + +/* GNU tar extensions */ + +#define GNUTYPE_DUMPDIR 'D' /* file names from dumped directory */ +#define GNUTYPE_LONGLINK 'K' /* long link name */ +#define GNUTYPE_LONGNAME 'L' /* long file name */ +#define GNUTYPE_MULTIVOL 'M' /* continuation of file from another volume */ +#define GNUTYPE_NAMES 'N' /* file name that does not fit into main hdr */ +#define GNUTYPE_SPARSE 'S' /* sparse file */ +#define GNUTYPE_VOLHDR 'V' /* tape/volume header */ + + +/* tar header */ + +#define BLOCKSIZE 512 +#define SHORTNAMESIZE 100 + +struct tar_header +{ /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + char typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* 500 */ +}; + +union tar_buffer +{ + char buffer[BLOCKSIZE]; + struct tar_header header; +}; + +struct attr_item +{ + struct attr_item *next; + char *fname; + int mode; + time_t time; +}; + +enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; + +char *TGZfname OF((const char *)); +void TGZnotfound OF((const char *)); + +int getoct OF((char *, int)); +char *strtime OF((time_t *)); +int setfiletime OF((char *, time_t)); +void push_attr OF((struct attr_item **, char *, int, time_t)); +void restore_attr OF((struct attr_item **)); + +int ExprMatch OF((char *, char *)); + +int makedir OF((char *)); +int matchname OF((int, int, char **, char *)); + +void error OF((const char *)); +int tar OF((gzFile, int, int, int, char **)); + +void help OF((int)); +int main OF((int, char **)); + +char *prog; + +const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL }; + +/* return the file name of the TGZ archive */ +/* or NULL if it does not exist */ + +char *TGZfname (const char *arcname) +{ + static char buffer[1024]; + int origlen,i; + + strcpy(buffer,arcname); + origlen = strlen(buffer); + + for (i=0; TGZsuffix[i]; i++) + { + strcpy(buffer+origlen,TGZsuffix[i]); + if (access(buffer,F_OK) == 0) + return buffer; + } + return NULL; +} + + +/* error message for the filename */ + +void TGZnotfound (const char *arcname) +{ + int i; + + fprintf(stderr,"%s: Couldn't find ",prog); + for (i=0;TGZsuffix[i];i++) + fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n", + arcname, + TGZsuffix[i]); + exit(1); +} + + +/* convert octal digits to int */ +/* on error return -1 */ + +int getoct (char *p,int width) +{ + int result = 0; + char c; + + while (width--) + { + c = *p++; + if (c == 0) + break; + if (c == ' ') + continue; + if (c < '0' || c > '7') + return -1; + result = result * 8 + (c - '0'); + } + return result; +} + + +/* convert time_t to string */ +/* use the "YYYY/MM/DD hh:mm:ss" format */ + +char *strtime (time_t *t) +{ + struct tm *local; + static char result[32]; + + local = localtime(t); + sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d", + local->tm_year+1900, local->tm_mon+1, local->tm_mday, + local->tm_hour, local->tm_min, local->tm_sec); + return result; +} + + +/* set file time */ + +int setfiletime (char *fname,time_t ftime) +{ +#ifdef WIN32 + static int isWinNT = -1; + SYSTEMTIME st; + FILETIME locft, modft; + struct tm *loctm; + HANDLE hFile; + int result; + + loctm = localtime(&ftime); + if (loctm == NULL) + return -1; + + st.wYear = (WORD)loctm->tm_year + 1900; + st.wMonth = (WORD)loctm->tm_mon + 1; + st.wDayOfWeek = (WORD)loctm->tm_wday; + st.wDay = (WORD)loctm->tm_mday; + st.wHour = (WORD)loctm->tm_hour; + st.wMinute = (WORD)loctm->tm_min; + st.wSecond = (WORD)loctm->tm_sec; + st.wMilliseconds = 0; + if (!SystemTimeToFileTime(&st, &locft) || + !LocalFileTimeToFileTime(&locft, &modft)) + return -1; + + if (isWinNT < 0) + isWinNT = (GetVersion() < 0x80000000) ? 1 : 0; + hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, + (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0), + NULL); + if (hFile == INVALID_HANDLE_VALUE) + return -1; + result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1; + CloseHandle(hFile); + return result; +#else + struct utimbuf settime; + + settime.actime = settime.modtime = ftime; + return utime(fname,&settime); +#endif +} + + +/* push file attributes */ + +void push_attr(struct attr_item **list,char *fname,int mode,time_t time) +{ + struct attr_item *item; + + item = (struct attr_item *)malloc(sizeof(struct attr_item)); + if (item == NULL) + error("Out of memory"); + item->fname = strdup(fname); + item->mode = mode; + item->time = time; + item->next = *list; + *list = item; +} + + +/* restore file attributes */ + +void restore_attr(struct attr_item **list) +{ + struct attr_item *item, *prev; + + for (item = *list; item != NULL; ) + { + setfiletime(item->fname,item->time); + chmod(item->fname,item->mode); + prev = item; + item = item->next; + free(prev); + } + *list = NULL; +} + + +/* match regular expression */ + +#define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) + +int ExprMatch (char *string,char *expr) +{ + while (1) + { + if (ISSPECIAL(*expr)) + { + if (*expr == '/') + { + if (*string != '\\' && *string != '/') + return 0; + string ++; expr++; + } + else if (*expr == '*') + { + if (*expr ++ == 0) + return 1; + while (*++string != *expr) + if (*string == 0) + return 0; + } + } + else + { + if (*string != *expr) + return 0; + if (*expr++ == 0) + return 1; + string++; + } + } +} + + +/* recursive mkdir */ +/* abort on ENOENT; ignore other errors like "directory already exists" */ +/* return 1 if OK */ +/* 0 on error */ + +int makedir (char *newdir) +{ + char *buffer = strdup(newdir); + char *p; + int len = strlen(buffer); + + if (len <= 0) { + free(buffer); + return 0; + } + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mkdir(buffer, 0755) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT)) + { + fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + + +int matchname (int arg,int argc,char **argv,char *fname) +{ + if (arg == argc) /* no arguments given (untgz tgzarchive) */ + return 1; + + while (arg < argc) + if (ExprMatch(fname,argv[arg++])) + return 1; + + return 0; /* ignore this for the moment being */ +} + + +/* tar file list or extract */ + +int tar (gzFile in,int action,int arg,int argc,char **argv) +{ + union tar_buffer buffer; + int len; + int err; + int getheader = 1; + int remaining = 0; + FILE *outfile = NULL; + char fname[BLOCKSIZE]; + int tarmode; + time_t tartime; + struct attr_item *attributes = NULL; + + if (action == TGZ_LIST) + printf(" date time size file\n" + " ---------- -------- --------- -------------------------------------\n"); + while (1) + { + len = gzread(in, &buffer, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + /* + * Always expect complete blocks to process + * the tar information. + */ + if (len != BLOCKSIZE) + { + action = TGZ_INVALID; /* force error exit */ + remaining = 0; /* force I/O cleanup */ + } + + /* + * If we have to get a tar header + */ + if (getheader >= 1) + { + /* + * if we met the end of the tar + * or the end-of-tar block, + * we are done + */ + if (len == 0 || buffer.header.name[0] == 0) + break; + + tarmode = getoct(buffer.header.mode,8); + tartime = (time_t)getoct(buffer.header.mtime,12); + if (tarmode == -1 || tartime == (time_t)-1) + { + buffer.header.name[0] = 0; + action = TGZ_INVALID; + } + + if (getheader == 1) + { + strncpy(fname,buffer.header.name,SHORTNAMESIZE); + if (fname[SHORTNAMESIZE-1] != 0) + fname[SHORTNAMESIZE] = 0; + } + else + { + /* + * The file name is longer than SHORTNAMESIZE + */ + if (strncmp(fname,buffer.header.name,SHORTNAMESIZE-1) != 0) + error("bad long name"); + getheader = 1; + } + + /* + * Act according to the type flag + */ + switch (buffer.header.typeflag) + { + case DIRTYPE: + if (action == TGZ_LIST) + printf(" %s %s\n",strtime(&tartime),fname); + if (action == TGZ_EXTRACT) + { + makedir(fname); + push_attr(&attributes,fname,tarmode,tartime); + } + break; + case REGTYPE: + case AREGTYPE: + remaining = getoct(buffer.header.size,12); + if (remaining == -1) + { + action = TGZ_INVALID; + break; + } + if (action == TGZ_LIST) + printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); + else if (action == TGZ_EXTRACT) + { + if (matchname(arg,argc,argv,fname)) + { + outfile = fopen(fname,"wb"); + if (outfile == NULL) { + /* try creating directory */ + char *p = strrchr(fname, '/'); + if (p != NULL) { + *p = '\0'; + makedir(fname); + *p = '/'; + outfile = fopen(fname,"wb"); + } + } + if (outfile != NULL) + printf("Extracting %s\n",fname); + else + fprintf(stderr, "%s: Couldn't create %s",prog,fname); + } + else + outfile = NULL; + } + getheader = 0; + break; + case GNUTYPE_LONGLINK: + case GNUTYPE_LONGNAME: + remaining = getoct(buffer.header.size,12); + if (remaining < 0 || remaining >= BLOCKSIZE) + { + action = TGZ_INVALID; + break; + } + len = gzread(in, fname, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + if (fname[BLOCKSIZE-1] != 0 || (int)strlen(fname) > remaining) + { + action = TGZ_INVALID; + break; + } + getheader = 2; + break; + default: + if (action == TGZ_LIST) + printf(" %s <---> %s\n",strtime(&tartime),fname); + break; + } + } + else + { + unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; + + if (outfile != NULL) + { + if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) + { + fprintf(stderr, + "%s: Error writing %s -- skipping\n",prog,fname); + fclose(outfile); + outfile = NULL; + remove(fname); + } + } + remaining -= bytes; + } + + if (remaining == 0) + { + getheader = 1; + if (outfile != NULL) + { + fclose(outfile); + outfile = NULL; + if (action != TGZ_INVALID) + push_attr(&attributes,fname,tarmode,tartime); + } + } + + /* + * Abandon if errors are found + */ + if (action == TGZ_INVALID) + { + error("broken archive"); + break; + } + } + + /* + * Restore file modes and time stamps + */ + restore_attr(&attributes); + + if (gzclose(in) != Z_OK) + error("failed gzclose"); + + return 0; +} + + +/* ============================================================ */ + +void help(int exitval) +{ + printf("untgz version 0.2.1\n" + " using zlib version %s\n\n", + zlibVersion()); + printf("Usage: untgz file.tgz extract all files\n" + " untgz file.tgz fname ... extract selected files\n" + " untgz -l file.tgz list archive contents\n" + " untgz -h display this help\n"); + exit(exitval); +} + +void error(const char *msg) +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + + +/* ============================================================ */ + +#if defined(WIN32) && defined(__GNUC__) +int _CRT_glob = 0; /* disable argument globbing in MinGW */ +#endif + +int main(int argc,char **argv) +{ + int action = TGZ_EXTRACT; + int arg = 1; + char *TGZfile; + gzFile *f; + + prog = strrchr(argv[0],'\\'); + if (prog == NULL) + { + prog = strrchr(argv[0],'/'); + if (prog == NULL) + { + prog = strrchr(argv[0],':'); + if (prog == NULL) + prog = argv[0]; + else + prog++; + } + else + prog++; + } + else + prog++; + + if (argc == 1) + help(0); + + if (strcmp(argv[arg],"-l") == 0) + { + action = TGZ_LIST; + if (argc == ++arg) + help(0); + } + else if (strcmp(argv[arg],"-h") == 0) + { + help(0); + } + + if ((TGZfile = TGZfname(argv[arg])) == NULL) + TGZnotfound(argv[arg]); + + ++arg; + if ((action == TGZ_LIST) && (arg != argc)) + help(1); + +/* + * Process the TGZ file + */ + switch(action) + { + case TGZ_LIST: + case TGZ_EXTRACT: + f = gzopen(TGZfile,"rb"); + if (f == NULL) + { + fprintf(stderr,"%s: Couldn't gzopen %s\n",prog,TGZfile); + return 1; + } + exit(tar(f, action, arg, argc, argv)); + break; + + default: + error("Unknown option"); + exit(1); + } + + return 0; +} diff --git a/deps/zlib-1.2.10/contrib/vstudio/readme.txt b/deps/zlib-1.2.10/contrib/vstudio/readme.txt new file mode 100644 index 0000000..98d8a05 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/readme.txt @@ -0,0 +1,78 @@ +Building instructions for the DLL versions of Zlib 1.2.10 +======================================================== + +This directory contains projects that build zlib and minizip using +Microsoft Visual C++ 9.0/10.0. + +You don't need to build these projects yourself. You can download the +binaries from: + http://www.winimage.com/zLibDll + +More information can be found at this site. + + + + + +Build instructions for Visual Studio 2008 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Compile assembly code (with Visual Studio Command Prompt) by running: + bld_ml64.bat (in contrib\masmx64) + bld_ml32.bat (in contrib\masmx86) +- Open contrib\vstudio\vc9\zlibvc.sln with Microsoft Visual C++ 2008 +- Or run: vcbuild /rebuild contrib\vstudio\vc9\zlibvc.sln "Release|Win32" + +Build instructions for Visual Studio 2010 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc10\zlibvc.sln with Microsoft Visual C++ 2010 + +Build instructions for Visual Studio 2012 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc11\zlibvc.sln with Microsoft Visual C++ 2012 + +Build instructions for Visual Studio 2013 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc12\zlibvc.sln with Microsoft Visual C++ 2013 + +Build instructions for Visual Studio 2015 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc14\zlibvc.sln with Microsoft Visual C++ 2015 + + +Important +--------- +- To use zlibwapi.dll in your application, you must define the + macro ZLIB_WINAPI when compiling your application's source files. + + +Additional notes +---------------- +- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built + by Gilles Vollant from the zlib 1.1.x sources, and distributed at + http://www.winimage.com/zLibDll + It uses the WINAPI calling convention for the exported functions, and + includes the minizip functionality. If your application needs that + particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll. + +- The new DLL was renamed because there exist several incompatible + versions of zlib.dll on the Internet. + +- There is also an official DLL build of zlib, named zlib1.dll. This one + is exporting the functions using the CDECL convention. See the file + win32\DLL_FAQ.txt found in this zlib distribution. + +- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol + has a slightly different effect. To avoid compatibility problems, do + not define it here. + + +Gilles Vollant +info@winimage.com + +Visual Studio 2013 and 2015 Projects from Sean Hunt +seandhunt_7@yahoo.com diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/miniunz.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc10/miniunz.vcxproj new file mode 100644 index 0000000..74e15c9 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/miniunz.vcxproj @@ -0,0 +1,310 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/miniunz.vcxproj.filters b/deps/zlib-1.2.10/contrib/vstudio/vc10/miniunz.vcxproj.filters new file mode 100644 index 0000000..0b2a3de --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/miniunz.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {048af943-022b-4db6-beeb-a54c34774ee2} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {c1d600d2-888f-4aea-b73e-8b0dd9befa0c} + h;hpp;hxx;hm;inl;inc + + + {0844199a-966b-4f19-81db-1e0125e141b9} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/minizip.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc10/minizip.vcxproj new file mode 100644 index 0000000..917e156 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/minizip.vcxproj @@ -0,0 +1,307 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/minizip.vcxproj.filters b/deps/zlib-1.2.10/contrib/vstudio/vc10/minizip.vcxproj.filters new file mode 100644 index 0000000..dd73cd3 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/minizip.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {c0419b40-bf50-40da-b153-ff74215b79de} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {bb87b070-735b-478e-92ce-7383abb2f36c} + h;hpp;hxx;hm;inl;inc + + + {f46ab6a6-548f-43cb-ae96-681abb5bd5db} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlib.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlib.vcxproj new file mode 100644 index 0000000..9088d17 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlib.vcxproj @@ -0,0 +1,420 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + true + + + Application + true + + + Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + EditAndContinue + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlib.vcxproj.filters b/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlib.vcxproj.filters new file mode 100644 index 0000000..249daa8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlib.vcxproj.filters @@ -0,0 +1,58 @@ + + + + + {c1f6a2e3-5da5-4955-8653-310d3efe05a9} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {c2aaffdc-2c95-4d6f-8466-4bec5890af2c} + h;hpp;hxx;hm;inl;inc + + + {c274fe07-05f2-461c-964b-f6341e4e7eb5} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlibdll.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlibdll.vcxproj new file mode 100644 index 0000000..bcb08ff --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlibdll.vcxproj @@ -0,0 +1,310 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlibdll.vcxproj.filters b/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlibdll.vcxproj.filters new file mode 100644 index 0000000..53a8693 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/testzlibdll.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {fa61a89f-93fc-4c89-b29e-36224b7592f4} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {d4b85da0-2ba2-4934-b57f-e2584e3848ee} + h;hpp;hxx;hm;inl;inc + + + {e573e075-00bd-4a7d-bd67-a8cc9bfc5aca} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/zlib.rc b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlib.rc new file mode 100644 index 0000000..f1c19bc --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 10, 0 + PRODUCTVERSION 1, 2, 10, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.10\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibstat.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibstat.vcxproj new file mode 100644 index 0000000..b9f2bbe --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibstat.vcxproj @@ -0,0 +1,473 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibstat.vcxproj.filters b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibstat.vcxproj.filters new file mode 100644 index 0000000..c8c7f7e --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibstat.vcxproj.filters @@ -0,0 +1,77 @@ + + + + + {174213f6-7f66-4ae8-a3a8-a1e0a1e6ffdd} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Source Files + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.def b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.def new file mode 100644 index 0000000..54e683d --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.sln b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.sln new file mode 100644 index 0000000..6f6ffd5 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.sln @@ -0,0 +1,135 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.vcxproj new file mode 100644 index 0000000..6ff9ddb --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.vcxproj @@ -0,0 +1,657 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapid + zlibwapi + zlibwapi + zlibwapid + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebug + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + true + .\zlibvc.def + true + true + Windows + false + + + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + true + false + .\zlibvc.def + true + Windows + false + + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + true + false + .\zlibvc.def + true + Windows + false + + + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + true + .\zlibvc.def + true + true + Windows + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + true + false + .\zlibvc.def + true + Windows + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + true + false + .\zlibvc.def + true + Windows + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.vcxproj.filters b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.vcxproj.filters new file mode 100644 index 0000000..180b71c --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc10/zlibvc.vcxproj.filters @@ -0,0 +1,118 @@ + + + + + {07934a85-8b61-443d-a0ee-b2eedb74f3cd} + cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90 + + + {1d99675b-433d-4a21-9e50-ed4ab8b19762} + h;hpp;hxx;hm;inl;fi;fd + + + {431c0958-fa71-44d0-9084-2d19d100c0cc} + ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc11/miniunz.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc11/miniunz.vcxproj new file mode 100644 index 0000000..8f9f20b --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc11/miniunz.vcxproj @@ -0,0 +1,314 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc11/minizip.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc11/minizip.vcxproj new file mode 100644 index 0000000..c93d9e6 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc11/minizip.vcxproj @@ -0,0 +1,311 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc11/testzlib.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc11/testzlib.vcxproj new file mode 100644 index 0000000..6d55954 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc11/testzlib.vcxproj @@ -0,0 +1,426 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + true + v110 + + + Application + true + v110 + + + Application + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc11/testzlibdll.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc11/testzlibdll.vcxproj new file mode 100644 index 0000000..9f20c78 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc11/testzlibdll.vcxproj @@ -0,0 +1,314 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc11/zlib.rc b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlib.rc new file mode 100644 index 0000000..f1c19bc --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 10, 0 + PRODUCTVERSION 1, 2, 10, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.10\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibstat.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibstat.vcxproj new file mode 100644 index 0000000..806b76a --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibstat.vcxproj @@ -0,0 +1,464 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + Unicode + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibvc.def b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibvc.def new file mode 100644 index 0000000..54e683d --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibvc.sln b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibvc.sln new file mode 100644 index 0000000..9fcbafd --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibvc.sln @@ -0,0 +1,117 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibvc.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibvc.vcxproj new file mode 100644 index 0000000..c65b95f --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc11/zlibvc.vcxproj @@ -0,0 +1,688 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + v110 + Unicode + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\contrib\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc12/miniunz.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc12/miniunz.vcxproj new file mode 100644 index 0000000..d88ac7f --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc12/miniunz.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc12/minizip.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc12/minizip.vcxproj new file mode 100644 index 0000000..f1f239c --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc12/minizip.vcxproj @@ -0,0 +1,313 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc12/testzlib.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc12/testzlib.vcxproj new file mode 100644 index 0000000..64b2cbe --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc12/testzlib.vcxproj @@ -0,0 +1,430 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + v120 + + + Application + true + v120 + + + Application + true + v120 + + + Application + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + false + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc12/testzlibdll.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc12/testzlibdll.vcxproj new file mode 100644 index 0000000..c66573a --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc12/testzlibdll.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc12/zlib.rc b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlib.rc new file mode 100644 index 0000000..ef38298 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 10, 0 + PRODUCTVERSION 1, 2, 10, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.10\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibstat.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibstat.vcxproj new file mode 100644 index 0000000..3fdee7c --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibstat.vcxproj @@ -0,0 +1,467 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + Unicode + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibvc.def b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibvc.def new file mode 100644 index 0000000..54e683d --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibvc.sln b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibvc.sln new file mode 100644 index 0000000..dcda229 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibvc.sln @@ -0,0 +1,119 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibvc.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibvc.vcxproj new file mode 100644 index 0000000..ab2b6c3 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc12/zlibvc.vcxproj @@ -0,0 +1,692 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + v120 + Unicode + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + false + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\contrib\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/miniunz.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc14/miniunz.vcxproj new file mode 100644 index 0000000..9b5c075 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/miniunz.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/miniunz.vcxproj.user b/deps/zlib-1.2.10/contrib/vstudio/vc14/miniunz.vcxproj.user new file mode 100644 index 0000000..abe8dd8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/miniunz.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/minizip.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc14/minizip.vcxproj new file mode 100644 index 0000000..968a410 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/minizip.vcxproj @@ -0,0 +1,313 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/minizip.vcxproj.user b/deps/zlib-1.2.10/contrib/vstudio/vc14/minizip.vcxproj.user new file mode 100644 index 0000000..abe8dd8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/minizip.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlib.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlib.vcxproj new file mode 100644 index 0000000..2c37125 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlib.vcxproj @@ -0,0 +1,430 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + v140 + + + Application + MultiByte + true + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + true + v140 + + + Application + MultiByte + true + v140 + + + Application + MultiByte + v140 + + + Application + true + v140 + + + Application + true + v140 + + + Application + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + false + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlib.vcxproj.user b/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlib.vcxproj.user new file mode 100644 index 0000000..abe8dd8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlib.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlibdll.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlibdll.vcxproj new file mode 100644 index 0000000..d87474d --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlibdll.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlibdll.vcxproj.user b/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlibdll.vcxproj.user new file mode 100644 index 0000000..abe8dd8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/testzlibdll.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/zlib.rc b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlib.rc new file mode 100644 index 0000000..ef38298 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 10, 0 + PRODUCTVERSION 1, 2, 10, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.10\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibstat.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibstat.vcxproj new file mode 100644 index 0000000..3e4b986 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibstat.vcxproj @@ -0,0 +1,467 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + Unicode + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibstat.vcxproj.user b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibstat.vcxproj.user new file mode 100644 index 0000000..abe8dd8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibstat.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.def b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.def new file mode 100644 index 0000000..54e683d --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.sln b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.sln new file mode 100644 index 0000000..6f4a107 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.sln @@ -0,0 +1,119 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.vcxproj b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.vcxproj new file mode 100644 index 0000000..f8f673c --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.vcxproj @@ -0,0 +1,692 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + v140 + Unicode + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + false + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\contrib\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.vcxproj.user b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.vcxproj.user new file mode 100644 index 0000000..abe8dd8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc14/zlibvc.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc9/miniunz.vcproj b/deps/zlib-1.2.10/contrib/vstudio/vc9/miniunz.vcproj new file mode 100644 index 0000000..7da32b9 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc9/miniunz.vcproj @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc9/minizip.vcproj b/deps/zlib-1.2.10/contrib/vstudio/vc9/minizip.vcproj new file mode 100644 index 0000000..e57e07d --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc9/minizip.vcproj @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc9/testzlib.vcproj b/deps/zlib-1.2.10/contrib/vstudio/vc9/testzlib.vcproj new file mode 100644 index 0000000..9cb0bf8 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc9/testzlib.vcproj @@ -0,0 +1,852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc9/testzlibdll.vcproj b/deps/zlib-1.2.10/contrib/vstudio/vc9/testzlibdll.vcproj new file mode 100644 index 0000000..b1ddde0 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc9/testzlibdll.vcproj @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc9/zlib.rc b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlib.rc new file mode 100644 index 0000000..f1c19bc --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 10, 0 + PRODUCTVERSION 1, 2, 10, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.10\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibstat.vcproj b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibstat.vcproj new file mode 100644 index 0000000..61c76c7 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibstat.vcproj @@ -0,0 +1,835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibvc.def b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibvc.def new file mode 100644 index 0000000..54e683d --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibvc.sln b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibvc.sln new file mode 100644 index 0000000..b482967 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibvc.sln @@ -0,0 +1,144 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestZlibDll", "testzlibdll.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibvc.vcproj b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibvc.vcproj new file mode 100644 index 0000000..c9a8947 --- /dev/null +++ b/deps/zlib-1.2.10/contrib/vstudio/vc9/zlibvc.vcproj @@ -0,0 +1,1156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/zlib-1.2.10/crc32.c b/deps/zlib-1.2.10/crc32.c new file mode 100644 index 0000000..9580440 --- /dev/null +++ b/deps/zlib-1.2.10/crc32.c @@ -0,0 +1,442 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +/* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif +#ifdef BYFOUR + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, z_size_t)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, z_size_t)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); + + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local z_crc_t FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + z_crc_t c; + int n, k; + z_crc_t poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (z_crc_t)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = ZSWAP32(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = ZSWAP32(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const z_crc_t FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const z_crc_t FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32_z(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + z_crc_t endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + return crc32_z(crc, buf, len); +} + +#ifdef BYFOUR + +/* + This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit + integer pointer type. This violates the strict aliasing rule, where a + compiler can assume, for optimization purposes, that two pointers to + fundamentally different types won't ever point to the same memory. This can + manifest as a problem only if one of the pointers is written to. This code + only reads from those pointers. So long as this code remains isolated in + this compilation unit, there won't be a problem. For this reason, this code + should not be copied and pasted into a compilation unit in which other code + writes to the buffer that is passed to these routines. + */ + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = (z_crc_t)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *buf4++; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = ZSWAP32((z_crc_t)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(ZSWAP32(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +local uLong crc32_combine_(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/deps/zlib-1.2.10/crc32.h b/deps/zlib-1.2.10/crc32.h new file mode 100644 index 0000000..9e0c778 --- /dev/null +++ b/deps/zlib-1.2.10/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/deps/zlib-1.2.10/crc32.lo b/deps/zlib-1.2.10/crc32.lo new file mode 100644 index 0000000..41b2f2f Binary files /dev/null and b/deps/zlib-1.2.10/crc32.lo differ diff --git a/deps/zlib-1.2.10/crc32.o b/deps/zlib-1.2.10/crc32.o new file mode 100644 index 0000000..a412be2 Binary files /dev/null and b/deps/zlib-1.2.10/crc32.o differ diff --git a/deps/zlib-1.2.10/deflate.c b/deps/zlib-1.2.10/deflate.c new file mode 100644 index 0000000..2ad890e --- /dev/null +++ b/deps/zlib-1.2.10/deflate.c @@ -0,0 +1,2158 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://tools.ietf.org/html/rfc1951 + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.10 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local int deflateStateCheck OF((z_streamp strm)); +local void slide_hash OF((deflate_state *s)); +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifdef ASMV +# pragma message("Assembler code may have bugs -- use at your own risk") + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif + +#ifdef ZLIB_DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0)) + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to UPDATE_HASH are made with consecutive input + * characters, so that a running hash key can be computed from the previous + * key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to INSERT_STRING are made with consecutive input + * characters and the first MIN_MATCH bytes of str are valid (except for + * the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to + * keep the hash table consistent if we switch back to level > 0 later. + */ +local void slide_hash(s) + deflate_state *s; +{ + unsigned n, m; + Posf *p; + uInt wsize = s->w_size; + + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + } while (--n); + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif +} + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + s->status = INIT_STATE; /* to pass state test in deflateReset() */ + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = (uInt)windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = (uInt)memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= + * Check for a valid deflate stream state. Return 0 if ok, 1 if not. + */ +local int deflateStateCheck (strm) + z_streamp strm; +{ + deflate_state *s; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + s = strm->state; + if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE && +#ifdef GZIP + s->status != GZIP_STATE && +#endif + s->status != EXTRA_STATE && + s->status != NAME_STATE && + s->status != COMMENT_STATE && + s->status != HCRC_STATE && + s->status != BUSY_STATE && + s->status != FINISH_STATE)) + return 1; + return 0; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt str, n; + int wrap; + unsigned avail; + z_const unsigned char *next; + + if (deflateStateCheck(strm) || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) + return Z_STREAM_ERROR; + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) + strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; + } + + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (z_const Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); + } + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) + z_streamp strm; + Bytef *dictionary; + uInt *dictLength; +{ + deflate_state *s; + uInt len; + + if (deflateStateCheck(strm)) + return Z_STREAM_ERROR; + s = strm->state; + len = s->strstart + s->lookahead; + if (len > s->w_size) + len = s->w_size; + if (dictionary != Z_NULL && len) + zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len); + if (dictLength != Z_NULL) + *dictLength = len; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateResetKeep (strm) + z_streamp strm; +{ + deflate_state *s; + + if (deflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = +#ifdef GZIP + s->wrap == 2 ? GZIP_STATE : +#endif + s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (deflateStateCheck(strm) || strm->state->wrap != 2) + return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + deflate_state *s; + int put; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if ((strategy != s->strategy || func != configuration_table[level].func)) { + /* Flush the last buffer: */ + int err = deflate(strm, Z_BLOCK); + if (err == Z_STREAM_ERROR) + return err; + if (strm->avail_out == 0) + return Z_BUF_ERROR; + } + if (s->level != level) { + if (s->level == 0 && s->matches != 0) { + if (s->matches == 1) + slide_hash(s); + else + CLEAR_HASH(s); + s->matches = 0; + } + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = (uInt)good_length; + s->max_lazy_match = (uInt)max_lazy; + s->nice_match = nice_length; + s->max_chain_length = (uInt)max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong complen, wraplen; + + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + + /* if can't get parameters, return conservative bound plus zlib wrapper */ + if (deflateStateCheck(strm)) + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; +#ifdef GZIP + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + Bytef *str; + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; +#endif + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return complen + wraplen; + + /* default settings: return tight bound for that case */ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output, except for + * some deflate_stored() output, goes through this function so some + * applications may wish to modify it to avoid allocating a large + * strm->next_out buffer and copying into it. (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len; + deflate_state *s = strm->state; + + _tr_flush_bits(s); + len = s->pending; + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, s->pending_out, len); + strm->next_out += len; + s->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; + } +} + +/* =========================================================================== + * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1]. + */ +#define HCRC_UPDATE(beg) \ + do { \ + if (s->gzhead->hcrc && s->pending > (beg)) \ + strm->adler = crc32(strm->adler, s->pending_buf + (beg), \ + s->pending - (beg)); \ + } while (0) + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->avail_in != 0 && strm->next_in == Z_NULL) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + old_flush = s->last_flush; + s->last_flush = flush; + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Write the header */ + if (s->status == INIT_STATE) { + /* zlib header */ + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#ifdef GZIP + if (s->status == GZIP_STATE) { + /* gzip header */ + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex; + while (s->pending + left > s->pending_buf_size) { + uInt copy = s->pending_buf_size - s->pending; + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, copy); + s->pending = s->pending_buf_size; + HCRC_UPDATE(beg); + s->gzindex += copy; + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + left -= copy; + } + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, left); + s->pending += left; + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + } + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) { + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + } + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#endif + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = s->level == 0 ? deflate_stored(s, flush) : + s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + + status = strm->state->status; + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (deflateStateCheck(source) || dest == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local unsigned read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = (int)s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ + +#else /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for FASTEST only + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#endif /* FASTEST */ + +#ifdef ZLIB_DEBUG + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* ZLIB_DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + unsigned n; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + slide_hash(s); + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, last) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (last)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +} + +/* Maximum stored block length in deflate format (not including header). */ +#define MAX_STORED 65535 + +/* Minimum of a and b. */ +#define MIN(a, b) ((a) > (b) ? (b) : (a)) + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * + * In case deflateParams() is used to later switch to a non-zero compression + * level, s->matches (otherwise unused when storing) keeps track of the number + * of hash table slides to perform. If s->matches is 1, then one hash table + * slide will be done when switching. If s->matches is 2, the maximum value + * allowed here, then the hash table will be cleared, since two or more slides + * is the same as a clear. + * + * deflate_stored() is written to minimize the number of times an input byte is + * copied. It is most efficient with large input and output buffers, which + * maximizes the opportunites to have a single copy from next_in to next_out. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Smallest worthy block size when not flushing or finishing. By default + * this is 32K. This can be as small as 507 bytes for memLevel == 1. For + * large input and output buffers, the stored block size will be larger. + */ + unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size); + + /* Copy as many min_block or larger stored blocks directly to next_out as + * possible. If flushing, copy the remaining available input to next_out as + * stored blocks, if there is enough space. + */ + unsigned len, left, have, last = 0; + unsigned used = s->strm->avail_in; + do { + /* Set len to the maximum size block that we can copy directly with the + * available input data and output space. Set left to how much of that + * would be copied from what's left in the window. + */ + len = MAX_STORED; /* maximum deflate stored block length */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + if (s->strm->avail_out < have) /* need room for header */ + break; + /* maximum stored block length that will fit in avail_out: */ + have = s->strm->avail_out - have; + left = s->strstart - s->block_start; /* bytes left in window */ + if (len > (ulg)left + s->strm->avail_in) + len = left + s->strm->avail_in; /* limit len to the input */ + if (len > have) + len = have; /* limit len to the output */ + if (left > len) + left = len; /* limit window pull to len */ + + /* If the stored block would be less than min_block in length, or if + * unable to copy all of the available input when flushing, then try + * copying to the window and the pending buffer instead. Also don't + * write an empty block when flushing -- deflate() does that. + */ + if (len < min_block && ((len == 0 && flush != Z_FINISH) || + flush == Z_NO_FLUSH || + len - left != s->strm->avail_in)) + break; + + /* Make a dummy stored block in pending to get the header bytes, + * including any pending bits. This also updates the debugging counts. + */ + last = flush == Z_FINISH && len - left == s->strm->avail_in ? 1 : 0; + _tr_stored_block(s, (char *)0, 0L, last); + + /* Replace the lengths in the dummy stored block with len. */ + s->pending_buf[s->pending - 4] = len; + s->pending_buf[s->pending - 3] = len >> 8; + s->pending_buf[s->pending - 2] = ~len; + s->pending_buf[s->pending - 1] = ~len >> 8; + + /* Write the stored block header bytes. */ + flush_pending(s->strm); + + /* Update debugging counts for the data about to be copied. */ +#ifdef ZLIB_DEBUG + s->compressed_len += len << 3; + s->bits_sent += len << 3; +#endif + + /* Copy uncompressed bytes from the window to next_out. */ + if (left) { + zmemcpy(s->strm->next_out, s->window + s->block_start, left); + s->strm->next_out += left; + s->strm->avail_out -= left; + s->strm->total_out += left; + s->block_start += left; + len -= left; + } + + /* Copy uncompressed bytes directly from next_in to next_out, updating + * the check value. + */ + if (len) { + read_buf(s->strm, s->strm->next_out, len); + s->strm->next_out += len; + s->strm->avail_out -= len; + s->strm->total_out += len; + } + } while (last == 0); + + /* Update the sliding window with the last s->w_size bytes of the copied + * data, or append all of the copied data to the existing window if less + * than s->w_size bytes were copied. Also update the number of bytes to + * insert in the hash tables, in the event that deflateParams() switches to + * a non-zero compression level. + */ + used -= s->strm->avail_in; /* number of input bytes directly copied */ + if (used) { + /* If any input was used, then no unused input remains in the window, + * therefore s->block_start == s->strstart. + */ + if (used >= s->w_size) { /* supplant the previous history */ + s->matches = 2; /* clear hash */ + zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); + s->strstart = s->w_size; + } + else { + if (s->window_size - s->strstart <= used) { + /* Slide the window down. */ + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + } + zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); + s->strstart += used; + } + s->block_start = s->strstart; + s->insert += MIN(used, s->w_size - s->insert); + } + + /* If the last block was written to next_out, then done. */ + if (last) + return finish_done; + + /* If flushing and all input has been consumed, then done. */ + if (flush != Z_NO_FLUSH && flush != Z_FINISH && + s->strm->avail_in == 0 && (long)s->strstart == s->block_start) + return block_done; + + /* Fill the window with any remaining input. */ + have = s->window_size - s->strstart - 1; + if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { + /* Slide the window down. */ + s->block_start -= s->w_size; + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + have += s->w_size; /* more space now */ + } + if (have > s->strm->avail_in) + have = s->strm->avail_in; + if (have) { + read_buf(s->strm, s->window + s->strstart, have); + s->strstart += have; + } + + /* There was not enough avail_out to write a complete worthy or flushed + * stored block to next_out. Write a stored block to pending instead, if we + * have enough input for a worthy block, or if flushing and there is enough + * room for the remaining input as a stored block in the pending buffer. + */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + /* maximum stored block length that will fit in pending: */ + have = MIN(s->pending_buf_size - have, MAX_STORED); + min_block = MIN(have, s->w_size); + left = s->strstart - s->block_start; + if (left >= min_block || + ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && + s->strm->avail_in == 0 && left <= have)) { + len = MIN(left, have); + last = flush == Z_FINISH && s->strm->avail_in == 0 && + len == left ? 1 : 0; + _tr_stored_block(s, (charf *)s->window + s->block_start, len, last); + s->block_start += len; + flush_pending(s->strm); + } + + /* We've done all we can with the available input and output. */ + return last ? finish_started : need_more; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} +#endif /* FASTEST */ + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s->lookahead <= MAX_MATCH) { + fill_window(s); + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { + scan = s->window + s->strstart - 1; + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (uInt)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} diff --git a/deps/zlib-1.2.10/deflate.h b/deps/zlib-1.2.10/deflate.h new file mode 100644 index 0000000..23ecdd3 --- /dev/null +++ b/deps/zlib-1.2.10/deflate.h @@ -0,0 +1,349 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 /* zlib header -> BUSY_STATE */ +#ifdef GZIP +# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ +#endif +#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ +#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ +#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ +#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ +#define BUSY_STATE 113 /* deflate -> FINISH_STATE */ +#define FINISH_STATE 666 /* stream complete */ +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + const static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + ulg pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + ulg gzindex; /* where in extra, name, or comment */ + Byte method; /* can only be DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef ZLIB_DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef ZLIB_DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/deps/zlib-1.2.10/deflate.lo b/deps/zlib-1.2.10/deflate.lo new file mode 100644 index 0000000..c1e1ebc Binary files /dev/null and b/deps/zlib-1.2.10/deflate.lo differ diff --git a/deps/zlib-1.2.10/deflate.o b/deps/zlib-1.2.10/deflate.o new file mode 100644 index 0000000..b044339 Binary files /dev/null and b/deps/zlib-1.2.10/deflate.o differ diff --git a/deps/zlib-1.2.10/doc/algorithm.txt b/deps/zlib-1.2.10/doc/algorithm.txt new file mode 100644 index 0000000..c97f495 --- /dev/null +++ b/deps/zlib-1.2.10/doc/algorithm.txt @@ -0,0 +1,209 @@ +1. Compression algorithm (deflate) + +The deflation algorithm used by gzip (also zip and zlib) is a variation of +LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in +the input data. The second occurrence of a string is replaced by a +pointer to the previous string, in the form of a pair (distance, +length). Distances are limited to 32K bytes, and lengths are limited +to 258 bytes. When a string does not occur anywhere in the previous +32K bytes, it is emitted as a sequence of literal bytes. (In this +description, `string' must be taken as an arbitrary sequence of bytes, +and is not restricted to printable characters.) + +Literals or match lengths are compressed with one Huffman tree, and +match distances are compressed with another tree. The trees are stored +in a compact form at the start of each block. The blocks can have any +size (except that the compressed data for one block must fit in +available memory). A block is terminated when deflate() determines that +it would be useful to start another block with fresh trees. (This is +somewhat similar to the behavior of LZW-based _compress_.) + +Duplicated strings are found using a hash table. All input strings of +length 3 are inserted in the hash table. A hash index is computed for +the next 3 bytes. If the hash chain for this index is not empty, all +strings in the chain are compared with the current input string, and +the longest match is selected. + +The hash chains are searched starting with the most recent strings, to +favor small distances and thus take advantage of the Huffman encoding. +The hash chains are singly linked. There are no deletions from the +hash chains, the algorithm simply discards matches that are too old. + +To avoid a worst-case situation, very long hash chains are arbitrarily +truncated at a certain length, determined by a runtime option (level +parameter of deflateInit). So deflate() does not always find the longest +possible match but generally finds a match which is long enough. + +deflate() also defers the selection of matches with a lazy evaluation +mechanism. After a match of length N has been found, deflate() searches for +a longer match at the next input byte. If a longer match is found, the +previous match is truncated to a length of one (thus producing a single +literal byte) and the process of lazy evaluation begins again. Otherwise, +the original match is kept, and the next match search is attempted only N +steps later. + +The lazy match evaluation is also subject to a runtime parameter. If +the current match is long enough, deflate() reduces the search for a longer +match, thus speeding up the whole process. If compression ratio is more +important than speed, deflate() attempts a complete second search even if +the first match is already long enough. + +The lazy match evaluation is not performed for the fastest compression +modes (level parameter 1 to 3). For these fast modes, new strings +are inserted in the hash table only when no match was found, or +when the match is not too long. This degrades the compression ratio +but saves time since there are both fewer insertions and fewer searches. + + +2. Decompression algorithm (inflate) + +2.1 Introduction + +The key question is how to represent a Huffman code (or any prefix code) so +that you can decode fast. The most important characteristic is that shorter +codes are much more common than longer codes, so pay attention to decoding the +short codes fast, and let the long codes take longer to decode. + +inflate() sets up a first level table that covers some number of bits of +input less than the length of longest code. It gets that many bits from the +stream, and looks it up in the table. The table will tell if the next +code is that many bits or less and how many, and if it is, it will tell +the value, else it will point to the next level table for which inflate() +grabs more bits and tries to decode a longer code. + +How many bits to make the first lookup is a tradeoff between the time it +takes to decode and the time it takes to build the table. If building the +table took no time (and if you had infinite memory), then there would only +be a first level table to cover all the way to the longest code. However, +building the table ends up taking a lot longer for more bits since short +codes are replicated many times in such a table. What inflate() does is +simply to make the number of bits in the first table a variable, and then +to set that variable for the maximum speed. + +For inflate, which has 286 possible codes for the literal/length tree, the size +of the first table is nine bits. Also the distance trees have 30 possible +values, and the size of the first table is six bits. Note that for each of +those cases, the table ended up one bit longer than the ``average'' code +length, i.e. the code length of an approximately flat code which would be a +little more than eight bits for 286 symbols and a little less than five bits +for 30 symbols. + + +2.2 More details on the inflate table lookup + +Ok, you want to know what this cleverly obfuscated inflate tree actually +looks like. You are correct that it's not a Huffman tree. It is simply a +lookup table for the first, let's say, nine bits of a Huffman symbol. The +symbol could be as short as one bit or as long as 15 bits. If a particular +symbol is shorter than nine bits, then that symbol's translation is duplicated +in all those entries that start with that symbol's bits. For example, if the +symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a +symbol is nine bits long, it appears in the table once. + +If the symbol is longer than nine bits, then that entry in the table points +to another similar table for the remaining bits. Again, there are duplicated +entries as needed. The idea is that most of the time the symbol will be short +and there will only be one table look up. (That's whole idea behind data +compression in the first place.) For the less frequent long symbols, there +will be two lookups. If you had a compression method with really long +symbols, you could have as many levels of lookups as is efficient. For +inflate, two is enough. + +So a table entry either points to another table (in which case nine bits in +the above example are gobbled), or it contains the translation for the symbol +and the number of bits to gobble. Then you start again with the next +ungobbled bit. + +You may wonder: why not just have one lookup table for how ever many bits the +longest symbol is? The reason is that if you do that, you end up spending +more time filling in duplicate symbol entries than you do actually decoding. +At least for deflate's output that generates new trees every several 10's of +kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code +would take too long if you're only decoding several thousand symbols. At the +other extreme, you could make a new table for every bit in the code. In fact, +that's essentially a Huffman tree. But then you spend too much time +traversing the tree while decoding, even for short symbols. + +So the number of bits for the first lookup table is a trade of the time to +fill out the table vs. the time spent looking at the second level and above of +the table. + +Here is an example, scaled down: + +The code being decoded, with 10 symbols, from 1 to 6 bits long: + +A: 0 +B: 10 +C: 1100 +D: 11010 +E: 11011 +F: 11100 +G: 11101 +H: 11110 +I: 111110 +J: 111111 + +Let's make the first table three bits long (eight entries): + +000: A,1 +001: A,1 +010: A,1 +011: A,1 +100: B,2 +101: B,2 +110: -> table X (gobble 3 bits) +111: -> table Y (gobble 3 bits) + +Each entry is what the bits decode as and how many bits that is, i.e. how +many bits to gobble. Or the entry points to another table, with the number of +bits to gobble implicit in the size of the table. + +Table X is two bits long since the longest code starting with 110 is five bits +long: + +00: C,1 +01: C,1 +10: D,2 +11: E,2 + +Table Y is three bits long since the longest code starting with 111 is six +bits long: + +000: F,2 +001: F,2 +010: G,2 +011: G,2 +100: H,2 +101: H,2 +110: I,3 +111: J,3 + +So what we have here are three tables with a total of 20 entries that had to +be constructed. That's compared to 64 entries for a single table. Or +compared to 16 entries for a Huffman tree (six two entry tables and one four +entry table). Assuming that the code ideally represents the probability of +the symbols, it takes on the average 1.25 lookups per symbol. That's compared +to one lookup for the single table, or 1.66 lookups per symbol for the +Huffman tree. + +There, I think that gives you a picture of what's going on. For inflate, the +meaning of a particular symbol is often more than just a letter. It can be a +byte (a "literal"), or it can be either a length or a distance which +indicates a base value and a number of bits to fetch after the code that is +added to the base value. Or it might be the special end-of-block code. The +data structures created in inftrees.c try to encode all that information +compactly in the tables. + + +Jean-loup Gailly Mark Adler +jloup@gzip.org madler@alumni.caltech.edu + + +References: + +[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data +Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, +pp. 337-343. + +``DEFLATE Compressed Data Format Specification'' available in +http://tools.ietf.org/html/rfc1951 diff --git a/deps/zlib-1.2.10/doc/rfc1950.txt b/deps/zlib-1.2.10/doc/rfc1950.txt new file mode 100644 index 0000000..ce6428a --- /dev/null +++ b/deps/zlib-1.2.10/doc/rfc1950.txt @@ -0,0 +1,619 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1950 Aladdin Enterprises +Category: Informational J-L. Gailly + Info-ZIP + May 1996 + + + ZLIB Compressed Data Format Specification version 3.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format. The + data can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a priori + bounded amount of intermediate storage. The format presently uses + the DEFLATE compression method but can be easily extended to use + other compression methods. It can be implemented readily in a manner + not covered by patents. This specification also defines the ADLER-32 + checksum (an extension and improvement of the Fletcher checksum), + used for detection of data corruption, and provides an algorithm for + computing it. + + + + +Deutsch & Gailly Informational [Page 1] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................ 3 + 1.6. Changes from previous versions ............................ 3 + 2. Detailed specification ......................................... 3 + 2.1. Overall conventions ....................................... 3 + 2.2. Data format ............................................... 4 + 2.3. Compliance ................................................ 7 + 3. References ..................................................... 7 + 4. Source code .................................................... 8 + 5. Security Considerations ........................................ 8 + 6. Acknowledgements ............................................... 8 + 7. Authors' Addresses ............................................. 8 + 8. Appendix: Rationale ............................................ 9 + 9. Appendix: Sample code ..........................................10 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + + * Can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a + priori bounded amount of intermediate storage, and hence can + be used in data communications or similar structures such as + Unix filters; + + * Can use a number of different compression methods; + + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely. + + The data format defined by this specification does not attempt to + allow random access to compressed data. + + + + + + + +Deutsch & Gailly Informational [Page 2] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into zlib format and/or decompress data from zlib + format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. + + 1.3. Scope + + The specification specifies a compressed data format that can be + used for in-memory compression of a sequence of arbitrary bytes. + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any data set that conforms to all + the specifications presented here; a compliant compressor must + produce data sets that conform to all the specifications presented + here. + + 1.5. Definitions of terms and conventions used + + byte: 8 bits stored or transmitted as a unit (same as an octet). + (For this specification, a byte is exactly 8 bits, even on + machines which store a character on a number of bits different + from 8.) See below, for the numbering of bits within a byte. + + 1.6. Changes from previous versions + + Version 3.1 was the first public release of this specification. + In version 3.2, some terminology was changed and the Adler-32 + sample code was rewritten for clarity. In version 3.3, the + support for a preset dictionary was introduced, and the + specification was converted to RFC style. + +2. Detailed specification + + 2.1. Overall conventions + + In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + + + +Deutsch & Gailly Informational [Page 3] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the MOST-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00000010|00001000| + +--------+--------+ + ^ ^ + | | + | + less significant byte = 8 + + more significant byte = 2 x 256 + + 2.2. Data format + + A zlib stream has the following structure: + + 0 1 + +---+---+ + |CMF|FLG| (more-->) + +---+---+ + + + + + + + + +Deutsch & Gailly Informational [Page 4] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + (if FLG.FDICT set) + + 0 1 2 3 + +---+---+---+---+ + | DICTID | (more-->) + +---+---+---+---+ + + +=====================+---+---+---+---+ + |...compressed data...| ADLER32 | + +=====================+---+---+---+---+ + + Any data which may appear after ADLER32 are not part of the zlib + stream. + + CMF (Compression Method and flags) + This byte is divided into a 4-bit compression method and a 4- + bit information field depending on the compression method. + + bits 0 to 3 CM Compression method + bits 4 to 7 CINFO Compression info + + CM (Compression method) + This identifies the compression method used in the file. CM = 8 + denotes the "deflate" compression method with a window size up + to 32K. This is the method used by gzip and PNG (see + references [1] and [2] in Chapter 3, below, for the reference + documents). CM = 15 is reserved. It might be used in a future + version of this specification to indicate the presence of an + extra field before the compressed data. + + CINFO (Compression info) + For CM = 8, CINFO is the base-2 logarithm of the LZ77 window + size, minus eight (CINFO=7 indicates a 32K window size). Values + of CINFO above 7 are not allowed in this version of the + specification. CINFO is not defined in this specification for + CM not equal to 8. + + FLG (FLaGs) + This flag byte is divided as follows: + + bits 0 to 4 FCHECK (check bits for CMF and FLG) + bit 5 FDICT (preset dictionary) + bits 6 to 7 FLEVEL (compression level) + + The FCHECK value must be such that CMF and FLG, when viewed as + a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG), + is a multiple of 31. + + + + +Deutsch & Gailly Informational [Page 5] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + FDICT (Preset dictionary) + If FDICT is set, a DICT dictionary identifier is present + immediately after the FLG byte. The dictionary is a sequence of + bytes which are initially fed to the compressor without + producing any compressed output. DICT is the Adler-32 checksum + of this sequence of bytes (see the definition of ADLER32 + below). The decompressor can use this identifier to determine + which dictionary has been used by the compressor. + + FLEVEL (Compression level) + These flags are available for use by specific compression + methods. The "deflate" method (CM = 8) sets these flags as + follows: + + 0 - compressor used fastest algorithm + 1 - compressor used fast algorithm + 2 - compressor used default algorithm + 3 - compressor used maximum compression, slowest algorithm + + The information in FLEVEL is not needed for decompression; it + is there to indicate if recompression might be worthwhile. + + compressed data + For compression method 8, the compressed data is stored in the + deflate compressed data format as described in the document + "DEFLATE Compressed Data Format Specification" by L. Peter + Deutsch. (See reference [3] in Chapter 3, below) + + Other compressed data formats are not specified in this version + of the zlib specification. + + ADLER32 (Adler-32 checksum) + This contains a checksum value of the uncompressed data + (excluding any dictionary data) computed according to Adler-32 + algorithm. This algorithm is a 32-bit extension and improvement + of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 + standard. See references [4] and [5] in Chapter 3, below) + + Adler-32 is composed of two sums accumulated per byte: s1 is + the sum of all bytes, s2 is the sum of all s1 values. Both sums + are done modulo 65521. s1 is initialized to 1, s2 to zero. The + Adler-32 checksum is stored as s2*65536 + s1 in most- + significant-byte first (network) order. + + + + + + + + +Deutsch & Gailly Informational [Page 6] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + 2.3. Compliance + + A compliant compressor must produce streams with correct CMF, FLG + and ADLER32, but need not support preset dictionaries. When the + zlib data format is used as part of another standard data format, + the compressor may use only preset dictionaries that are specified + by this other data format. If this other format does not use the + preset dictionary feature, the compressor must not set the FDICT + flag. + + A compliant decompressor must check CMF, FLG, and ADLER32, and + provide an error indication if any of these have incorrect values. + A compliant decompressor must give an error indication if CM is + not one of the values defined in this specification (only the + value 8 is permitted in this version), since another value could + indicate the presence of new features that would cause subsequent + data to be interpreted incorrectly. A compliant decompressor must + give an error indication if FDICT is set and DICTID is not the + identifier of a known preset dictionary. A decompressor may + ignore FLEVEL and still be compliant. When the zlib data format + is being used as a part of another standard format, a compliant + decompressor must support all the preset dictionaries specified by + the other format. When the other format does not use the preset + dictionary feature, a compliant decompressor must reject any + stream in which the FDICT flag is set. + +3. References + + [1] Deutsch, L.P.,"GZIP Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [2] Thomas Boutell, "PNG (Portable Network Graphics) specification", + available in ftp://ftp.uu.net/graphics/png/documents/ + + [3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [4] Fletcher, J. G., "An Arithmetic Checksum for Serial + Transmissions," IEEE Transactions on Communications, Vol. COM-30, + No. 1, January 1982, pp. 247-252. + + [5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms," + November, 1993, pp. 144, 145. (Available from + gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073. + + + + + + + +Deutsch & Gailly Informational [Page 7] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +4. Source code + + Source code for a C language implementation of a "zlib" compliant + library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/. + +5. Security Considerations + + A decoder that fails to check the ADLER32 checksum value may be + subject to undetected data corruption. + +6. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Jean-Loup Gailly and Mark Adler designed the zlib format and wrote + the related software described in this specification. Glenn + Randers-Pehrson converted this document to RFC and HTML format. + +7. Authors' Addresses + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + + Jean-Loup Gailly + + EMail: + + Questions about the technical content of this specification can be + sent by email to + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + + + + +Deutsch & Gailly Informational [Page 8] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +8. Appendix: Rationale + + 8.1. Preset dictionaries + + A preset dictionary is specially useful to compress short input + sequences. The compressor can take advantage of the dictionary + context to encode the input in a more compact manner. The + decompressor can be initialized with the appropriate context by + virtually decompressing a compressed version of the dictionary + without producing any output. However for certain compression + algorithms such as the deflate algorithm this operation can be + achieved without actually performing any decompression. + + The compressor and the decompressor must use exactly the same + dictionary. The dictionary may be fixed or may be chosen among a + certain number of predefined dictionaries, according to the kind + of input data. The decompressor can determine which dictionary has + been chosen by the compressor by checking the dictionary + identifier. This document does not specify the contents of + predefined dictionaries, since the optimal dictionaries are + application specific. Standard data formats using this feature of + the zlib specification must precisely define the allowed + dictionaries. + + 8.2. The Adler-32 algorithm + + The Adler-32 algorithm is much faster than the CRC32 algorithm yet + still provides an extremely low probability of undetected errors. + + The modulo on unsigned long accumulators can be delayed for 5552 + bytes, so the modulo operation time is negligible. If the bytes + are a, b, c, the second sum is 3a + 2b + c + 3, and so is position + and order sensitive, unlike the first sum, which is just a + checksum. That 65521 is prime is important to avoid a possible + large class of two-byte errors that leave the check unchanged. + (The Fletcher checksum uses 255, which is not prime and which also + makes the Fletcher check insensitive to single byte changes 0 <-> + 255.) + + The sum s1 is initialized to 1 instead of zero to make the length + of the sequence part of s2, so that the length does not have to be + checked separately. (Any sequence of zeroes has a Fletcher + checksum of zero.) + + + + + + + + +Deutsch & Gailly Informational [Page 9] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +9. Appendix: Sample code + + The following C code computes the Adler-32 checksum of a data buffer. + It is written for clarity, not for speed. The sample code is in the + ANSI C programming language. Non C users may find it easier to read + with these hints: + + & Bitwise AND operator. + >> Bitwise right shift operator. When applied to an + unsigned quantity, as here, right shift inserts zero bit(s) + at the left. + << Bitwise left shift operator. Left shift inserts zero + bit(s) at the right. + ++ "n++" increments the variable n. + % modulo operator: a % b is the remainder of a divided by b. + + #define BASE 65521 /* largest prime smaller than 65536 */ + + /* + Update a running Adler-32 checksum with the bytes buf[0..len-1] + and return the updated checksum. The Adler-32 checksum should be + initialized to 1. + + Usage example: + + unsigned long adler = 1L; + + while (read_buffer(buffer, length) != EOF) { + adler = update_adler32(adler, buffer, length); + } + if (adler != original_adler) error(); + */ + unsigned long update_adler32(unsigned long adler, + unsigned char *buf, int len) + { + unsigned long s1 = adler & 0xffff; + unsigned long s2 = (adler >> 16) & 0xffff; + int n; + + for (n = 0; n < len; n++) { + s1 = (s1 + buf[n]) % BASE; + s2 = (s2 + s1) % BASE; + } + return (s2 << 16) + s1; + } + + /* Return the adler32 of the bytes buf[0..len-1] */ + + + + +Deutsch & Gailly Informational [Page 10] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + unsigned long adler32(unsigned char *buf, int len) + { + return update_adler32(1L, buf, len); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch & Gailly Informational [Page 11] + diff --git a/deps/zlib-1.2.10/doc/rfc1951.txt b/deps/zlib-1.2.10/doc/rfc1951.txt new file mode 100644 index 0000000..403c8c7 --- /dev/null +++ b/deps/zlib-1.2.10/doc/rfc1951.txt @@ -0,0 +1,955 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1951 Aladdin Enterprises +Category: Informational May 1996 + + + DEFLATE Compressed Data Format Specification version 1.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format that + compresses data using a combination of the LZ77 algorithm and Huffman + coding, with efficiency comparable to the best currently available + general-purpose compression methods. The data can be produced or + consumed, even for an arbitrarily long sequentially presented input + data stream, using only an a priori bounded amount of intermediate + storage. The format can be implemented readily in a manner not + covered by patents. + + + + + + + + +Deutsch Informational [Page 1] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................ 3 + 1.6. Changes from previous versions ............................ 4 + 2. Compressed representation overview ............................. 4 + 3. Detailed specification ......................................... 5 + 3.1. Overall conventions ....................................... 5 + 3.1.1. Packing into bytes .................................. 5 + 3.2. Compressed block format ................................... 6 + 3.2.1. Synopsis of prefix and Huffman coding ............... 6 + 3.2.2. Use of Huffman coding in the "deflate" format ....... 7 + 3.2.3. Details of block format ............................. 9 + 3.2.4. Non-compressed blocks (BTYPE=00) ................... 11 + 3.2.5. Compressed blocks (length and distance codes) ...... 11 + 3.2.6. Compression with fixed Huffman codes (BTYPE=01) .... 12 + 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) .. 13 + 3.3. Compliance ............................................... 14 + 4. Compression algorithm details ................................. 14 + 5. References .................................................... 16 + 6. Security Considerations ....................................... 16 + 7. Source code ................................................... 16 + 8. Acknowledgements .............................................. 16 + 9. Author's Address .............................................. 17 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + * Can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a + priori bounded amount of intermediate storage, and hence + can be used in data communications or similar structures + such as Unix filters; + * Compresses data with efficiency comparable to the best + currently available general-purpose compression methods, + and in particular considerably better than the "compress" + program; + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely; + + + +Deutsch Informational [Page 2] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + * Is compatible with the file format produced by the current + widely used gzip utility, in that conforming decompressors + will be able to read data produced by the existing gzip + compressor. + + The data format defined by this specification does not attempt to: + + * Allow random access to compressed data; + * Compress specialized data (e.g., raster graphics) as well + as the best currently available specialized algorithms. + + A simple counting argument shows that no lossless compression + algorithm can compress every possible input data set. For the + format defined here, the worst case expansion is 5 bytes per 32K- + byte block, i.e., a size increase of 0.015% for large data sets. + English text usually compresses by a factor of 2.5 to 3; + executable files usually compress somewhat less; graphical data + such as raster images may compress much more. + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into "deflate" format and/or decompress data from + "deflate" format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. Familiarity with the technique of Huffman coding + is helpful but not required. + + 1.3. Scope + + The specification specifies a method for representing a sequence + of bytes as a (usually shorter) sequence of bits, and a method for + packing the latter bit sequence into bytes. + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any data set that conforms to all + the specifications presented here; a compliant compressor must + produce data sets that conform to all the specifications presented + here. + + 1.5. Definitions of terms and conventions used + + Byte: 8 bits stored or transmitted as a unit (same as an octet). + For this specification, a byte is exactly 8 bits, even on machines + + + +Deutsch Informational [Page 3] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + which store a character on a number of bits different from eight. + See below, for the numbering of bits within a byte. + + String: a sequence of arbitrary bytes. + + 1.6. Changes from previous versions + + There have been no technical changes to the deflate format since + version 1.1 of this specification. In version 1.2, some + terminology was changed. Version 1.3 is a conversion of the + specification to RFC style. + +2. Compressed representation overview + + A compressed data set consists of a series of blocks, corresponding + to successive blocks of input data. The block sizes are arbitrary, + except that non-compressible blocks are limited to 65,535 bytes. + + Each block is compressed using a combination of the LZ77 algorithm + and Huffman coding. The Huffman trees for each block are independent + of those for previous or subsequent blocks; the LZ77 algorithm may + use a reference to a duplicated string occurring in a previous block, + up to 32K input bytes before. + + Each block consists of two parts: a pair of Huffman code trees that + describe the representation of the compressed data part, and a + compressed data part. (The Huffman trees themselves are compressed + using Huffman encoding.) The compressed data consists of a series of + elements of two types: literal bytes (of strings that have not been + detected as duplicated within the previous 32K input bytes), and + pointers to duplicated strings, where a pointer is represented as a + pair . The representation used in the + "deflate" format limits distances to 32K bytes and lengths to 258 + bytes, but does not limit the size of a block, except for + uncompressible blocks, which are limited as noted above. + + Each type of value (literals, distances, and lengths) in the + compressed data is represented using a Huffman code, using one code + tree for literals and lengths and a separate code tree for distances. + The code trees for each block appear in a compact form just before + the compressed data for that block. + + + + + + + + + + +Deutsch Informational [Page 4] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +3. Detailed specification + + 3.1. Overall conventions In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the least-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00001000|00000010| + +--------+--------+ + ^ ^ + | | + | + more significant byte = 2 x 256 + + less significant byte = 8 + + 3.1.1. Packing into bytes + + This document does not address the issue of the order in which + bits of a byte are transmitted on a bit-sequential medium, + since the final data format described here is byte- rather than + + + +Deutsch Informational [Page 5] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + bit-oriented. However, we describe the compressed block format + in below, as a sequence of data elements of various bit + lengths, not a sequence of bytes. We must therefore specify + how to pack these data elements into bytes to form the final + compressed byte sequence: + + * Data elements are packed into bytes in order of + increasing bit number within the byte, i.e., starting + with the least-significant bit of the byte. + * Data elements other than Huffman codes are packed + starting with the least-significant bit of the data + element. + * Huffman codes are packed starting with the most- + significant bit of the code. + + In other words, if one were to print out the compressed data as + a sequence of bytes, starting with the first byte at the + *right* margin and proceeding to the *left*, with the most- + significant bit of each byte on the left as usual, one would be + able to parse the result from right to left, with fixed-width + elements in the correct MSB-to-LSB order and Huffman codes in + bit-reversed order (i.e., with the first bit of the code in the + relative LSB position). + + 3.2. Compressed block format + + 3.2.1. Synopsis of prefix and Huffman coding + + Prefix coding represents symbols from an a priori known + alphabet by bit sequences (codes), one code for each symbol, in + a manner such that different symbols may be represented by bit + sequences of different lengths, but a parser can always parse + an encoded string unambiguously symbol-by-symbol. + + We define a prefix code in terms of a binary tree in which the + two edges descending from each non-leaf node are labeled 0 and + 1 and in which the leaf nodes correspond one-for-one with (are + labeled with) the symbols of the alphabet; then the code for a + symbol is the sequence of 0's and 1's on the edges leading from + the root to the leaf labeled with that symbol. For example: + + + + + + + + + + + +Deutsch Informational [Page 6] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + /\ Symbol Code + 0 1 ------ ---- + / \ A 00 + /\ B B 1 + 0 1 C 011 + / \ D 010 + A /\ + 0 1 + / \ + D C + + A parser can decode the next symbol from an encoded input + stream by walking down the tree from the root, at each step + choosing the edge corresponding to the next input bit. + + Given an alphabet with known symbol frequencies, the Huffman + algorithm allows the construction of an optimal prefix code + (one which represents strings with those symbol frequencies + using the fewest bits of any possible prefix codes for that + alphabet). Such a code is called a Huffman code. (See + reference [1] in Chapter 5, references for additional + information on Huffman codes.) + + Note that in the "deflate" format, the Huffman codes for the + various alphabets must not exceed certain maximum code lengths. + This constraint complicates the algorithm for computing code + lengths from symbol frequencies. Again, see Chapter 5, + references for details. + + 3.2.2. Use of Huffman coding in the "deflate" format + + The Huffman codes used for each alphabet in the "deflate" + format have two additional rules: + + * All codes of a given bit length have lexicographically + consecutive values, in the same order as the symbols + they represent; + + * Shorter codes lexicographically precede longer codes. + + + + + + + + + + + + +Deutsch Informational [Page 7] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + We could recode the example above to follow this rule as + follows, assuming that the order of the alphabet is ABCD: + + Symbol Code + ------ ---- + A 10 + B 0 + C 110 + D 111 + + I.e., 0 precedes 10 which precedes 11x, and 110 and 111 are + lexicographically consecutive. + + Given this rule, we can define the Huffman code for an alphabet + just by giving the bit lengths of the codes for each symbol of + the alphabet in order; this is sufficient to determine the + actual codes. In our example, the code is completely defined + by the sequence of bit lengths (2, 1, 3, 3). The following + algorithm generates the codes as integers, intended to be read + from most- to least-significant bit. The code lengths are + initially in tree[I].Len; the codes are produced in + tree[I].Code. + + 1) Count the number of codes for each code length. Let + bl_count[N] be the number of codes of length N, N >= 1. + + 2) Find the numerical value of the smallest code for each + code length: + + code = 0; + bl_count[0] = 0; + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = code; + } + + 3) Assign numerical values to all codes, using consecutive + values for all codes of the same length with the base + values determined at step 2. Codes that are never used + (which have a bit length of zero) must not be assigned a + value. + + for (n = 0; n <= max_code; n++) { + len = tree[n].Len; + if (len != 0) { + tree[n].Code = next_code[len]; + next_code[len]++; + } + + + +Deutsch Informational [Page 8] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + } + + Example: + + Consider the alphabet ABCDEFGH, with bit lengths (3, 3, 3, 3, + 3, 2, 4, 4). After step 1, we have: + + N bl_count[N] + - ----------- + 2 1 + 3 5 + 4 2 + + Step 2 computes the following next_code values: + + N next_code[N] + - ------------ + 1 0 + 2 0 + 3 2 + 4 14 + + Step 3 produces the following code values: + + Symbol Length Code + ------ ------ ---- + A 3 010 + B 3 011 + C 3 100 + D 3 101 + E 3 110 + F 2 00 + G 4 1110 + H 4 1111 + + 3.2.3. Details of block format + + Each block of compressed data begins with 3 header bits + containing the following data: + + first bit BFINAL + next 2 bits BTYPE + + Note that the header bits do not necessarily begin on a byte + boundary, since a block does not necessarily occupy an integral + number of bytes. + + + + + +Deutsch Informational [Page 9] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + BFINAL is set if and only if this is the last block of the data + set. + + BTYPE specifies how the data are compressed, as follows: + + 00 - no compression + 01 - compressed with fixed Huffman codes + 10 - compressed with dynamic Huffman codes + 11 - reserved (error) + + The only difference between the two compressed cases is how the + Huffman codes for the literal/length and distance alphabets are + defined. + + In all cases, the decoding algorithm for the actual data is as + follows: + + do + read block header from input stream. + if stored with no compression + skip any remaining bits in current partially + processed byte + read LEN and NLEN (see next section) + copy LEN bytes of data to output + otherwise + if compressed with dynamic Huffman codes + read representation of code trees (see + subsection below) + loop (until end of block code recognized) + decode literal/length value from input stream + if value < 256 + copy value (literal byte) to output stream + otherwise + if value = end of block (256) + break from loop + otherwise (value = 257..285) + decode distance from input stream + + move backwards distance bytes in the output + stream, and copy length bytes from this + position to the output stream. + end loop + while not last block + + Note that a duplicated string reference may refer to a string + in a previous block; i.e., the backward distance may cross one + or more block boundaries. However a distance cannot refer past + the beginning of the output stream. (An application using a + + + +Deutsch Informational [Page 10] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + preset dictionary might discard part of the output stream; a + distance can refer to that part of the output stream anyway) + Note also that the referenced string may overlap the current + position; for example, if the last 2 bytes decoded have values + X and Y, a string reference with + adds X,Y,X,Y,X to the output stream. + + We now specify each compression method in turn. + + 3.2.4. Non-compressed blocks (BTYPE=00) + + Any bits of input up to the next byte boundary are ignored. + The rest of the block consists of the following information: + + 0 1 2 3 4... + +---+---+---+---+================================+ + | LEN | NLEN |... LEN bytes of literal data...| + +---+---+---+---+================================+ + + LEN is the number of data bytes in the block. NLEN is the + one's complement of LEN. + + 3.2.5. Compressed blocks (length and distance codes) + + As noted above, encoded data blocks in the "deflate" format + consist of sequences of symbols drawn from three conceptually + distinct alphabets: either literal bytes, from the alphabet of + byte values (0..255), or pairs, + where the length is drawn from (3..258) and the distance is + drawn from (1..32,768). In fact, the literal and length + alphabets are merged into a single alphabet (0..285), where + values 0..255 represent literal bytes, the value 256 indicates + end-of-block, and values 257..285 represent length codes + (possibly in conjunction with extra bits following the symbol + code) as follows: + + + + + + + + + + + + + + + + +Deutsch Informational [Page 11] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + Extra Extra Extra + Code Bits Length(s) Code Bits Lengths Code Bits Length(s) + ---- ---- ------ ---- ---- ------- ---- ---- ------- + 257 0 3 267 1 15,16 277 4 67-82 + 258 0 4 268 1 17,18 278 4 83-98 + 259 0 5 269 2 19-22 279 4 99-114 + 260 0 6 270 2 23-26 280 4 115-130 + 261 0 7 271 2 27-30 281 5 131-162 + 262 0 8 272 2 31-34 282 5 163-194 + 263 0 9 273 3 35-42 283 5 195-226 + 264 0 10 274 3 43-50 284 5 227-257 + 265 1 11,12 275 3 51-58 285 0 258 + 266 1 13,14 276 3 59-66 + + The extra bits should be interpreted as a machine integer + stored with the most-significant bit first, e.g., bits 1110 + represent the value 14. + + Extra Extra Extra + Code Bits Dist Code Bits Dist Code Bits Distance + ---- ---- ---- ---- ---- ------ ---- ---- -------- + 0 0 1 10 4 33-48 20 9 1025-1536 + 1 0 2 11 4 49-64 21 9 1537-2048 + 2 0 3 12 5 65-96 22 10 2049-3072 + 3 0 4 13 5 97-128 23 10 3073-4096 + 4 1 5,6 14 6 129-192 24 11 4097-6144 + 5 1 7,8 15 6 193-256 25 11 6145-8192 + 6 2 9-12 16 7 257-384 26 12 8193-12288 + 7 2 13-16 17 7 385-512 27 12 12289-16384 + 8 3 17-24 18 8 513-768 28 13 16385-24576 + 9 3 25-32 19 8 769-1024 29 13 24577-32768 + + 3.2.6. Compression with fixed Huffman codes (BTYPE=01) + + The Huffman codes for the two alphabets are fixed, and are not + represented explicitly in the data. The Huffman code lengths + for the literal/length alphabet are: + + Lit Value Bits Codes + --------- ---- ----- + 0 - 143 8 00110000 through + 10111111 + 144 - 255 9 110010000 through + 111111111 + 256 - 279 7 0000000 through + 0010111 + 280 - 287 8 11000000 through + 11000111 + + + +Deutsch Informational [Page 12] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + The code lengths are sufficient to generate the actual codes, + as described above; we show the codes in the table for added + clarity. Literal/length values 286-287 will never actually + occur in the compressed data, but participate in the code + construction. + + Distance codes 0-31 are represented by (fixed-length) 5-bit + codes, with possible additional bits as shown in the table + shown in Paragraph 3.2.5, above. Note that distance codes 30- + 31 will never actually occur in the compressed data. + + 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) + + The Huffman codes for the two alphabets appear in the block + immediately after the header bits and before the actual + compressed data, first the literal/length code and then the + distance code. Each code is defined by a sequence of code + lengths, as discussed in Paragraph 3.2.2, above. For even + greater compactness, the code length sequences themselves are + compressed using a Huffman code. The alphabet for code lengths + is as follows: + + 0 - 15: Represent code lengths of 0 - 15 + 16: Copy the previous code length 3 - 6 times. + The next 2 bits indicate repeat length + (0 = 3, ... , 3 = 6) + Example: Codes 8, 16 (+2 bits 11), + 16 (+2 bits 10) will expand to + 12 code lengths of 8 (1 + 6 + 5) + 17: Repeat a code length of 0 for 3 - 10 times. + (3 bits of length) + 18: Repeat a code length of 0 for 11 - 138 times + (7 bits of length) + + A code length of 0 indicates that the corresponding symbol in + the literal/length or distance alphabet will not occur in the + block, and should not participate in the Huffman code + construction algorithm given earlier. If only one distance + code is used, it is encoded using one bit, not zero bits; in + this case there is a single code length of one, with one unused + code. One distance code of zero bits means that there are no + distance codes used at all (the data is all literals). + + We can now define the format of the block: + + 5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286) + 5 Bits: HDIST, # of Distance codes - 1 (1 - 32) + 4 Bits: HCLEN, # of Code Length codes - 4 (4 - 19) + + + +Deutsch Informational [Page 13] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + (HCLEN + 4) x 3 bits: code lengths for the code length + alphabet given just above, in the order: 16, 17, 18, + 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 + + These code lengths are interpreted as 3-bit integers + (0-7); as above, a code length of 0 means the + corresponding symbol (literal/length or distance code + length) is not used. + + HLIT + 257 code lengths for the literal/length alphabet, + encoded using the code length Huffman code + + HDIST + 1 code lengths for the distance alphabet, + encoded using the code length Huffman code + + The actual compressed data of the block, + encoded using the literal/length and distance Huffman + codes + + The literal/length symbol 256 (end of data), + encoded using the literal/length Huffman code + + The code length repeat codes can cross from HLIT + 257 to the + HDIST + 1 code lengths. In other words, all code lengths form + a single sequence of HLIT + HDIST + 258 values. + + 3.3. Compliance + + A compressor may limit further the ranges of values specified in + the previous section and still be compliant; for example, it may + limit the range of backward pointers to some value smaller than + 32K. Similarly, a compressor may limit the size of blocks so that + a compressible block fits in memory. + + A compliant decompressor must accept the full range of possible + values defined in the previous section, and must accept blocks of + arbitrary size. + +4. Compression algorithm details + + While it is the intent of this document to define the "deflate" + compressed data format without reference to any particular + compression algorithm, the format is related to the compressed + formats produced by LZ77 (Lempel-Ziv 1977, see reference [2] below); + since many variations of LZ77 are patented, it is strongly + recommended that the implementor of a compressor follow the general + algorithm presented here, which is known not to be patented per se. + The material in this section is not part of the definition of the + + + +Deutsch Informational [Page 14] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + specification per se, and a compressor need not follow it in order to + be compliant. + + The compressor terminates a block when it determines that starting a + new block with fresh trees would be useful, or when the block size + fills up the compressor's block buffer. + + The compressor uses a chained hash table to find duplicated strings, + using a hash function that operates on 3-byte sequences. At any + given point during compression, let XYZ be the next 3 input bytes to + be examined (not necessarily all different, of course). First, the + compressor examines the hash chain for XYZ. If the chain is empty, + the compressor simply writes out X as a literal byte and advances one + byte in the input. If the hash chain is not empty, indicating that + the sequence XYZ (or, if we are unlucky, some other 3 bytes with the + same hash function value) has occurred recently, the compressor + compares all strings on the XYZ hash chain with the actual input data + sequence starting at the current point, and selects the longest + match. + + The compressor searches the hash chains starting with the most recent + strings, to favor small distances and thus take advantage of the + Huffman encoding. The hash chains are singly linked. There are no + deletions from the hash chains; the algorithm simply discards matches + that are too old. To avoid a worst-case situation, very long hash + chains are arbitrarily truncated at a certain length, determined by a + run-time parameter. + + To improve overall compression, the compressor optionally defers the + selection of matches ("lazy matching"): after a match of length N has + been found, the compressor searches for a longer match starting at + the next input byte. If it finds a longer match, it truncates the + previous match to a length of one (thus producing a single literal + byte) and then emits the longer match. Otherwise, it emits the + original match, and, as described above, advances N bytes before + continuing. + + Run-time parameters also control this "lazy match" procedure. If + compression ratio is most important, the compressor attempts a + complete second search regardless of the length of the first match. + In the normal case, if the current match is "long enough", the + compressor reduces the search for a longer match, thus speeding up + the process. If speed is most important, the compressor inserts new + strings in the hash table only when no match was found, or when the + match is not "too long". This degrades the compression ratio but + saves time since there are both fewer insertions and fewer searches. + + + + + +Deutsch Informational [Page 15] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +5. References + + [1] Huffman, D. A., "A Method for the Construction of Minimum + Redundancy Codes", Proceedings of the Institute of Radio + Engineers, September 1952, Volume 40, Number 9, pp. 1098-1101. + + [2] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data + Compression", IEEE Transactions on Information Theory, Vol. 23, + No. 3, pp. 337-343. + + [3] Gailly, J.-L., and Adler, M., ZLIB documentation and sources, + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [4] Gailly, J.-L., and Adler, M., GZIP documentation and sources, + available as gzip-*.tar in ftp://prep.ai.mit.edu/pub/gnu/ + + [5] Schwartz, E. S., and Kallick, B. "Generating a canonical prefix + encoding." Comm. ACM, 7,3 (Mar. 1964), pp. 166-169. + + [6] Hirschberg and Lelewer, "Efficient decoding of prefix codes," + Comm. ACM, 33,4, April 1990, pp. 449-459. + +6. Security Considerations + + Any data compression method involves the reduction of redundancy in + the data. Consequently, any corruption of the data is likely to have + severe effects and be difficult to correct. Uncompressed text, on + the other hand, will probably still be readable despite the presence + of some corrupted bytes. + + It is recommended that systems using this data format provide some + means of validating the integrity of the compressed data. See + reference [3], for example. + +7. Source code + + Source code for a C language implementation of a "deflate" compliant + compressor and decompressor is available within the zlib package at + ftp://ftp.uu.net/pub/archiving/zip/zlib/. + +8. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Phil Katz designed the deflate format. Jean-Loup Gailly and Mark + Adler wrote the related software described in this specification. + Glenn Randers-Pehrson converted this document to RFC and HTML format. + + + +Deutsch Informational [Page 16] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +9. Author's Address + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + Questions about the technical content of this specification can be + sent by email to: + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to: + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch Informational [Page 17] + diff --git a/deps/zlib-1.2.10/doc/rfc1952.txt b/deps/zlib-1.2.10/doc/rfc1952.txt new file mode 100644 index 0000000..a8e51b4 --- /dev/null +++ b/deps/zlib-1.2.10/doc/rfc1952.txt @@ -0,0 +1,675 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1952 Aladdin Enterprises +Category: Informational May 1996 + + + GZIP file format specification version 4.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format that is + compatible with the widely used GZIP utility. The format includes a + cyclic redundancy check value for detecting data corruption. The + format presently uses the DEFLATE method of compression but can be + easily extended to use other compression methods. The format can be + implemented readily in a manner not covered by patents. + + + + + + + + + + +Deutsch Informational [Page 1] + +RFC 1952 GZIP File Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................. 3 + 1.6. Changes from previous versions ............................ 3 + 2. Detailed specification ......................................... 4 + 2.1. Overall conventions ....................................... 4 + 2.2. File format ............................................... 5 + 2.3. Member format ............................................. 5 + 2.3.1. Member header and trailer ........................... 6 + 2.3.1.1. Extra field ................................... 8 + 2.3.1.2. Compliance .................................... 9 + 3. References .................................................. 9 + 4. Security Considerations .................................... 10 + 5. Acknowledgements ........................................... 10 + 6. Author's Address ........................................... 10 + 7. Appendix: Jean-Loup Gailly's gzip utility .................. 11 + 8. Appendix: Sample CRC Code .................................. 11 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + * Can compress or decompress a data stream (as opposed to a + randomly accessible file) to produce another data stream, + using only an a priori bounded amount of intermediate + storage, and hence can be used in data communications or + similar structures such as Unix filters; + * Compresses data with efficiency comparable to the best + currently available general-purpose compression methods, + and in particular considerably better than the "compress" + program; + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely; + * Is compatible with the file format produced by the current + widely used gzip utility, in that conforming decompressors + will be able to read data produced by the existing gzip + compressor. + + + + +Deutsch Informational [Page 2] + +RFC 1952 GZIP File Format Specification May 1996 + + + The data format defined by this specification does not attempt to: + + * Provide random access to compressed data; + * Compress specialized data (e.g., raster graphics) as well as + the best currently available specialized algorithms. + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into gzip format and/or decompress data from gzip + format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. + + 1.3. Scope + + The specification specifies a compression method and a file format + (the latter assuming only that a file can store a sequence of + arbitrary bytes). It does not specify any particular interface to + a file system or anything about character sets or encodings + (except for file names and comments, which are optional). + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any file that conforms to all the + specifications presented here; a compliant compressor must produce + files that conform to all the specifications presented here. The + material in the appendices is not part of the specification per se + and is not relevant to compliance. + + 1.5. Definitions of terms and conventions used + + byte: 8 bits stored or transmitted as a unit (same as an octet). + (For this specification, a byte is exactly 8 bits, even on + machines which store a character on a number of bits different + from 8.) See below for the numbering of bits within a byte. + + 1.6. Changes from previous versions + + There have been no technical changes to the gzip format since + version 4.1 of this specification. In version 4.2, some + terminology was changed, and the sample CRC code was rewritten for + clarity and to eliminate the requirement for the caller to do pre- + and post-conditioning. Version 4.3 is a conversion of the + specification to RFC style. + + + +Deutsch Informational [Page 3] + +RFC 1952 GZIP File Format Specification May 1996 + + +2. Detailed specification + + 2.1. Overall conventions + + In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + This document does not address the issue of the order in which + bits of a byte are transmitted on a bit-sequential medium, since + the data format described here is byte- rather than bit-oriented. + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the least-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00001000|00000010| + +--------+--------+ + ^ ^ + | | + | + more significant byte = 2 x 256 + + less significant byte = 8 + + + +Deutsch Informational [Page 4] + +RFC 1952 GZIP File Format Specification May 1996 + + + 2.2. File format + + A gzip file consists of a series of "members" (compressed data + sets). The format of each member is specified in the following + section. The members simply appear one after another in the file, + with no additional information before, between, or after them. + + 2.3. Member format + + Each member has the following structure: + + +---+---+---+---+---+---+---+---+---+---+ + |ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->) + +---+---+---+---+---+---+---+---+---+---+ + + (if FLG.FEXTRA set) + + +---+---+=================================+ + | XLEN |...XLEN bytes of "extra field"...| (more-->) + +---+---+=================================+ + + (if FLG.FNAME set) + + +=========================================+ + |...original file name, zero-terminated...| (more-->) + +=========================================+ + + (if FLG.FCOMMENT set) + + +===================================+ + |...file comment, zero-terminated...| (more-->) + +===================================+ + + (if FLG.FHCRC set) + + +---+---+ + | CRC16 | + +---+---+ + + +=======================+ + |...compressed blocks...| (more-->) + +=======================+ + + 0 1 2 3 4 5 6 7 + +---+---+---+---+---+---+---+---+ + | CRC32 | ISIZE | + +---+---+---+---+---+---+---+---+ + + + + +Deutsch Informational [Page 5] + +RFC 1952 GZIP File Format Specification May 1996 + + + 2.3.1. Member header and trailer + + ID1 (IDentification 1) + ID2 (IDentification 2) + These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 + (0x8b, \213), to identify the file as being in gzip format. + + CM (Compression Method) + This identifies the compression method used in the file. CM + = 0-7 are reserved. CM = 8 denotes the "deflate" + compression method, which is the one customarily used by + gzip and which is documented elsewhere. + + FLG (FLaGs) + This flag byte is divided into individual bits as follows: + + bit 0 FTEXT + bit 1 FHCRC + bit 2 FEXTRA + bit 3 FNAME + bit 4 FCOMMENT + bit 5 reserved + bit 6 reserved + bit 7 reserved + + If FTEXT is set, the file is probably ASCII text. This is + an optional indication, which the compressor may set by + checking a small amount of the input data to see whether any + non-ASCII characters are present. In case of doubt, FTEXT + is cleared, indicating binary data. For systems which have + different file formats for ascii text and binary data, the + decompressor can use FTEXT to choose the appropriate format. + We deliberately do not specify the algorithm used to set + this bit, since a compressor always has the option of + leaving it cleared and a decompressor always has the option + of ignoring it and letting some other program handle issues + of data conversion. + + If FHCRC is set, a CRC16 for the gzip header is present, + immediately before the compressed data. The CRC16 consists + of the two least significant bytes of the CRC32 for all + bytes of the gzip header up to and not including the CRC16. + [The FHCRC bit was never set by versions of gzip up to + 1.2.4, even though it was documented with a different + meaning in gzip 1.2.4.] + + If FEXTRA is set, optional extra fields are present, as + described in a following section. + + + +Deutsch Informational [Page 6] + +RFC 1952 GZIP File Format Specification May 1996 + + + If FNAME is set, an original file name is present, + terminated by a zero byte. The name must consist of ISO + 8859-1 (LATIN-1) characters; on operating systems using + EBCDIC or any other character set for file names, the name + must be translated to the ISO LATIN-1 character set. This + is the original name of the file being compressed, with any + directory components removed, and, if the file being + compressed is on a file system with case insensitive names, + forced to lower case. There is no original file name if the + data was compressed from a source other than a named file; + for example, if the source was stdin on a Unix system, there + is no file name. + + If FCOMMENT is set, a zero-terminated file comment is + present. This comment is not interpreted; it is only + intended for human consumption. The comment must consist of + ISO 8859-1 (LATIN-1) characters. Line breaks should be + denoted by a single line feed character (10 decimal). + + Reserved FLG bits must be zero. + + MTIME (Modification TIME) + This gives the most recent modification time of the original + file being compressed. The time is in Unix format, i.e., + seconds since 00:00:00 GMT, Jan. 1, 1970. (Note that this + may cause problems for MS-DOS and other systems that use + local rather than Universal time.) If the compressed data + did not come from a file, MTIME is set to the time at which + compression started. MTIME = 0 means no time stamp is + available. + + XFL (eXtra FLags) + These flags are available for use by specific compression + methods. The "deflate" method (CM = 8) sets these flags as + follows: + + XFL = 2 - compressor used maximum compression, + slowest algorithm + XFL = 4 - compressor used fastest algorithm + + OS (Operating System) + This identifies the type of file system on which compression + took place. This may be useful in determining end-of-line + convention for text files. The currently defined values are + as follows: + + + + + + +Deutsch Informational [Page 7] + +RFC 1952 GZIP File Format Specification May 1996 + + + 0 - FAT filesystem (MS-DOS, OS/2, NT/Win32) + 1 - Amiga + 2 - VMS (or OpenVMS) + 3 - Unix + 4 - VM/CMS + 5 - Atari TOS + 6 - HPFS filesystem (OS/2, NT) + 7 - Macintosh + 8 - Z-System + 9 - CP/M + 10 - TOPS-20 + 11 - NTFS filesystem (NT) + 12 - QDOS + 13 - Acorn RISCOS + 255 - unknown + + XLEN (eXtra LENgth) + If FLG.FEXTRA is set, this gives the length of the optional + extra field. See below for details. + + CRC32 (CRC-32) + This contains a Cyclic Redundancy Check value of the + uncompressed data computed according to CRC-32 algorithm + used in the ISO 3309 standard and in section 8.1.1.6.2 of + ITU-T recommendation V.42. (See http://www.iso.ch for + ordering ISO documents. See gopher://info.itu.ch for an + online version of ITU-T V.42.) + + ISIZE (Input SIZE) + This contains the size of the original (uncompressed) input + data modulo 2^32. + + 2.3.1.1. Extra field + + If the FLG.FEXTRA bit is set, an "extra field" is present in + the header, with total length XLEN bytes. It consists of a + series of subfields, each of the form: + + +---+---+---+---+==================================+ + |SI1|SI2| LEN |... LEN bytes of subfield data ...| + +---+---+---+---+==================================+ + + SI1 and SI2 provide a subfield ID, typically two ASCII letters + with some mnemonic value. Jean-Loup Gailly + is maintaining a registry of subfield + IDs; please send him any subfield ID you wish to use. Subfield + IDs with SI2 = 0 are reserved for future use. The following + IDs are currently defined: + + + +Deutsch Informational [Page 8] + +RFC 1952 GZIP File Format Specification May 1996 + + + SI1 SI2 Data + ---------- ---------- ---- + 0x41 ('A') 0x70 ('P') Apollo file type information + + LEN gives the length of the subfield data, excluding the 4 + initial bytes. + + 2.3.1.2. Compliance + + A compliant compressor must produce files with correct ID1, + ID2, CM, CRC32, and ISIZE, but may set all the other fields in + the fixed-length part of the header to default values (255 for + OS, 0 for all others). The compressor must set all reserved + bits to zero. + + A compliant decompressor must check ID1, ID2, and CM, and + provide an error indication if any of these have incorrect + values. It must examine FEXTRA/XLEN, FNAME, FCOMMENT and FHCRC + at least so it can skip over the optional fields if they are + present. It need not examine any other part of the header or + trailer; in particular, a decompressor may ignore FTEXT and OS + and always produce binary output, and still be compliant. A + compliant decompressor must give an error indication if any + reserved bit is non-zero, since such a bit could indicate the + presence of a new field that would cause subsequent data to be + interpreted incorrectly. + +3. References + + [1] "Information Processing - 8-bit single-byte coded graphic + character sets - Part 1: Latin alphabet No.1" (ISO 8859-1:1987). + The ISO 8859-1 (Latin-1) character set is a superset of 7-bit + ASCII. Files defining this character set are available as + iso_8859-1.* in ftp://ftp.uu.net/graphics/png/documents/ + + [2] ISO 3309 + + [3] ITU-T recommendation V.42 + + [4] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [5] Gailly, J.-L., GZIP documentation, available as gzip-*.tar in + ftp://prep.ai.mit.edu/pub/gnu/ + + [6] Sarwate, D.V., "Computation of Cyclic Redundancy Checks via Table + Look-Up", Communications of the ACM, 31(8), pp.1008-1013. + + + + +Deutsch Informational [Page 9] + +RFC 1952 GZIP File Format Specification May 1996 + + + [7] Schwaderer, W.D., "CRC Calculation", April 85 PC Tech Journal, + pp.118-133. + + [8] ftp://ftp.adelaide.edu.au/pub/rocksoft/papers/crc_v3.txt, + describing the CRC concept. + +4. Security Considerations + + Any data compression method involves the reduction of redundancy in + the data. Consequently, any corruption of the data is likely to have + severe effects and be difficult to correct. Uncompressed text, on + the other hand, will probably still be readable despite the presence + of some corrupted bytes. + + It is recommended that systems using this data format provide some + means of validating the integrity of the compressed data, such as by + setting and checking the CRC-32 check value. + +5. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Jean-Loup Gailly designed the gzip format and wrote, with Mark Adler, + the related software described in this specification. Glenn + Randers-Pehrson converted this document to RFC and HTML format. + +6. Author's Address + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + Questions about the technical content of this specification can be + sent by email to: + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to: + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + +Deutsch Informational [Page 10] + +RFC 1952 GZIP File Format Specification May 1996 + + +7. Appendix: Jean-Loup Gailly's gzip utility + + The most widely used implementation of gzip compression, and the + original documentation on which this specification is based, were + created by Jean-Loup Gailly . Since this + implementation is a de facto standard, we mention some more of its + features here. Again, the material in this section is not part of + the specification per se, and implementations need not follow it to + be compliant. + + When compressing or decompressing a file, gzip preserves the + protection, ownership, and modification time attributes on the local + file system, since there is no provision for representing protection + attributes in the gzip file format itself. Since the file format + includes a modification time, the gzip decompressor provides a + command line switch that assigns the modification time from the file, + rather than the local modification time of the compressed input, to + the decompressed output. + +8. Appendix: Sample CRC Code + + The following sample code represents a practical implementation of + the CRC (Cyclic Redundancy Check). (See also ISO 3309 and ITU-T V.42 + for a formal specification.) + + The sample code is in the ANSI C programming language. Non C users + may find it easier to read with these hints: + + & Bitwise AND operator. + ^ Bitwise exclusive-OR operator. + >> Bitwise right shift operator. When applied to an + unsigned quantity, as here, right shift inserts zero + bit(s) at the left. + ! Logical NOT operator. + ++ "n++" increments the variable n. + 0xNNN 0x introduces a hexadecimal (base 16) constant. + Suffix L indicates a long value (at least 32 bits). + + /* Table of CRCs of all 8-bit messages. */ + unsigned long crc_table[256]; + + /* Flag: has the table been computed? Initially false. */ + int crc_table_computed = 0; + + /* Make the table for a fast CRC. */ + void make_crc_table(void) + { + unsigned long c; + + + +Deutsch Informational [Page 11] + +RFC 1952 GZIP File Format Specification May 1996 + + + int n, k; + for (n = 0; n < 256; n++) { + c = (unsigned long) n; + for (k = 0; k < 8; k++) { + if (c & 1) { + c = 0xedb88320L ^ (c >> 1); + } else { + c = c >> 1; + } + } + crc_table[n] = c; + } + crc_table_computed = 1; + } + + /* + Update a running crc with the bytes buf[0..len-1] and return + the updated crc. The crc should be initialized to zero. Pre- and + post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the caller. Usage example: + + unsigned long crc = 0L; + + while (read_buffer(buffer, length) != EOF) { + crc = update_crc(crc, buffer, length); + } + if (crc != original_crc) error(); + */ + unsigned long update_crc(unsigned long crc, + unsigned char *buf, int len) + { + unsigned long c = crc ^ 0xffffffffL; + int n; + + if (!crc_table_computed) + make_crc_table(); + for (n = 0; n < len; n++) { + c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); + } + return c ^ 0xffffffffL; + } + + /* Return the CRC of the bytes buf[0..len-1]. */ + unsigned long crc(unsigned char *buf, int len) + { + return update_crc(0L, buf, len); + } + + + + +Deutsch Informational [Page 12] + diff --git a/deps/zlib-1.2.10/doc/txtvsbin.txt b/deps/zlib-1.2.10/doc/txtvsbin.txt new file mode 100644 index 0000000..3d0f063 --- /dev/null +++ b/deps/zlib-1.2.10/doc/txtvsbin.txt @@ -0,0 +1,107 @@ +A Fast Method for Identifying Plain Text Files +============================================== + + +Introduction +------------ + +Given a file coming from an unknown source, it is sometimes desirable +to find out whether the format of that file is plain text. Although +this may appear like a simple task, a fully accurate detection of the +file type requires heavy-duty semantic analysis on the file contents. +It is, however, possible to obtain satisfactory results by employing +various heuristics. + +Previous versions of PKZip and other zip-compatible compression tools +were using a crude detection scheme: if more than 80% (4/5) of the bytes +found in a certain buffer are within the range [7..127], the file is +labeled as plain text, otherwise it is labeled as binary. A prominent +limitation of this scheme is the restriction to Latin-based alphabets. +Other alphabets, like Greek, Cyrillic or Asian, make extensive use of +the bytes within the range [128..255], and texts using these alphabets +are most often misidentified by this scheme; in other words, the rate +of false negatives is sometimes too high, which means that the recall +is low. Another weakness of this scheme is a reduced precision, due to +the false positives that may occur when binary files containing large +amounts of textual characters are misidentified as plain text. + +In this article we propose a new, simple detection scheme that features +a much increased precision and a near-100% recall. This scheme is +designed to work on ASCII, Unicode and other ASCII-derived alphabets, +and it handles single-byte encodings (ISO-8859, MacRoman, KOI8, etc.) +and variable-sized encodings (ISO-2022, UTF-8, etc.). Wider encodings +(UCS-2/UTF-16 and UCS-4/UTF-32) are not handled, however. + + +The Algorithm +------------- + +The algorithm works by dividing the set of bytecodes [0..255] into three +categories: +- The white list of textual bytecodes: + 9 (TAB), 10 (LF), 13 (CR), 32 (SPACE) to 255. +- The gray list of tolerated bytecodes: + 7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB), 27 (ESC). +- The black list of undesired, non-textual bytecodes: + 0 (NUL) to 6, 14 to 31. + +If a file contains at least one byte that belongs to the white list and +no byte that belongs to the black list, then the file is categorized as +plain text; otherwise, it is categorized as binary. (The boundary case, +when the file is empty, automatically falls into the latter category.) + + +Rationale +--------- + +The idea behind this algorithm relies on two observations. + +The first observation is that, although the full range of 7-bit codes +[0..127] is properly specified by the ASCII standard, most control +characters in the range [0..31] are not used in practice. The only +widely-used, almost universally-portable control codes are 9 (TAB), +10 (LF) and 13 (CR). There are a few more control codes that are +recognized on a reduced range of platforms and text viewers/editors: +7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB) and 27 (ESC); but these +codes are rarely (if ever) used alone, without being accompanied by +some printable text. Even the newer, portable text formats such as +XML avoid using control characters outside the list mentioned here. + +The second observation is that most of the binary files tend to contain +control characters, especially 0 (NUL). Even though the older text +detection schemes observe the presence of non-ASCII codes from the range +[128..255], the precision rarely has to suffer if this upper range is +labeled as textual, because the files that are genuinely binary tend to +contain both control characters and codes from the upper range. On the +other hand, the upper range needs to be labeled as textual, because it +is used by virtually all ASCII extensions. In particular, this range is +used for encoding non-Latin scripts. + +Since there is no counting involved, other than simply observing the +presence or the absence of some byte values, the algorithm produces +consistent results, regardless what alphabet encoding is being used. +(If counting were involved, it could be possible to obtain different +results on a text encoded, say, using ISO-8859-16 versus UTF-8.) + +There is an extra category of plain text files that are "polluted" with +one or more black-listed codes, either by mistake or by peculiar design +considerations. In such cases, a scheme that tolerates a small fraction +of black-listed codes would provide an increased recall (i.e. more true +positives). This, however, incurs a reduced precision overall, since +false positives are more likely to appear in binary files that contain +large chunks of textual data. Furthermore, "polluted" plain text should +be regarded as binary by general-purpose text detection schemes, because +general-purpose text processing algorithms might not be applicable. +Under this premise, it is safe to say that our detection method provides +a near-100% recall. + +Experiments have been run on many files coming from various platforms +and applications. We tried plain text files, system logs, source code, +formatted office documents, compiled object code, etc. The results +confirm the optimistic assumptions about the capabilities of this +algorithm. + + +-- +Cosmin Truta +Last updated: 2006-May-28 diff --git a/deps/zlib-1.2.10/example b/deps/zlib-1.2.10/example new file mode 100755 index 0000000..ba4494a Binary files /dev/null and b/deps/zlib-1.2.10/example differ diff --git a/deps/zlib-1.2.10/example.o b/deps/zlib-1.2.10/example.o new file mode 100644 index 0000000..81a48ad Binary files /dev/null and b/deps/zlib-1.2.10/example.o differ diff --git a/deps/zlib-1.2.10/example64 b/deps/zlib-1.2.10/example64 new file mode 100755 index 0000000..3c9adaa Binary files /dev/null and b/deps/zlib-1.2.10/example64 differ diff --git a/deps/zlib-1.2.10/example64.o b/deps/zlib-1.2.10/example64.o new file mode 100644 index 0000000..73c80e7 Binary files /dev/null and b/deps/zlib-1.2.10/example64.o differ diff --git a/deps/zlib-1.2.10/examples/README.examples b/deps/zlib-1.2.10/examples/README.examples new file mode 100644 index 0000000..56a3171 --- /dev/null +++ b/deps/zlib-1.2.10/examples/README.examples @@ -0,0 +1,49 @@ +This directory contains examples of the use of zlib and other relevant +programs and documentation. + +enough.c + calculation and justification of ENOUGH parameter in inftrees.h + - calculates the maximum table space used in inflate tree + construction over all possible Huffman codes + +fitblk.c + compress just enough input to nearly fill a requested output size + - zlib isn't designed to do this, but fitblk does it anyway + +gun.c + uncompress a gzip file + - illustrates the use of inflateBack() for high speed file-to-file + decompression using call-back functions + - is approximately twice as fast as gzip -d + - also provides Unix uncompress functionality, again twice as fast + +gzappend.c + append to a gzip file + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of deflatePrime() to start at any bit + +gzjoin.c + join gzip files without recalculating the crc or recompressing + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of crc32_combine() + +gzlog.c +gzlog.h + efficiently and robustly maintain a message log file in gzip format + - illustrates use of raw deflate, Z_PARTIAL_FLUSH, deflatePrime(), + and deflateSetDictionary() + - illustrates use of a gzip header extra field + +zlib_how.html + painfully comprehensive description of zpipe.c (see below) + - describes in excruciating detail the use of deflate() and inflate() + +zpipe.c + reads and writes zlib streams from stdin to stdout + - illustrates the proper use of deflate() and inflate() + - deeply commented in zlib_how.html (see above) + +zran.c + index a zlib or gzip stream and randomly access it + - illustrates the use of Z_BLOCK, inflatePrime(), and + inflateSetDictionary() to provide random access diff --git a/deps/zlib-1.2.10/examples/enough.c b/deps/zlib-1.2.10/examples/enough.c new file mode 100644 index 0000000..b991144 --- /dev/null +++ b/deps/zlib-1.2.10/examples/enough.c @@ -0,0 +1,572 @@ +/* enough.c -- determine the maximum size of inflate's Huffman code tables over + * all possible valid and complete Huffman codes, subject to a length limit. + * Copyright (C) 2007, 2008, 2012 Mark Adler + * Version 1.4 18 August 2012 Mark Adler + */ + +/* Version history: + 1.0 3 Jan 2007 First version (derived from codecount.c version 1.4) + 1.1 4 Jan 2007 Use faster incremental table usage computation + Prune examine() search on previously visited states + 1.2 5 Jan 2007 Comments clean up + As inflate does, decrease root for short codes + Refuse cases where inflate would increase root + 1.3 17 Feb 2008 Add argument for initial root table size + Fix bug for initial root table size == max - 1 + Use a macro to compute the history index + 1.4 18 Aug 2012 Avoid shifts more than bits in type (caused endless loop!) + Clean up comparisons of different types + Clean up code indentation + */ + +/* + Examine all possible Huffman codes for a given number of symbols and a + maximum code length in bits to determine the maximum table size for zilb's + inflate. Only complete Huffman codes are counted. + + Two codes are considered distinct if the vectors of the number of codes per + length are not identical. So permutations of the symbol assignments result + in the same code for the counting, as do permutations of the assignments of + the bit values to the codes (i.e. only canonical codes are counted). + + We build a code from shorter to longer lengths, determining how many symbols + are coded at each length. At each step, we have how many symbols remain to + be coded, what the last code length used was, and how many bit patterns of + that length remain unused. Then we add one to the code length and double the + number of unused patterns to graduate to the next code length. We then + assign all portions of the remaining symbols to that code length that + preserve the properties of a correct and eventually complete code. Those + properties are: we cannot use more bit patterns than are available; and when + all the symbols are used, there are exactly zero possible bit patterns + remaining. + + The inflate Huffman decoding algorithm uses two-level lookup tables for + speed. There is a single first-level table to decode codes up to root bits + in length (root == 9 in the current inflate implementation). The table + has 1 << root entries and is indexed by the next root bits of input. Codes + shorter than root bits have replicated table entries, so that the correct + entry is pointed to regardless of the bits that follow the short code. If + the code is longer than root bits, then the table entry points to a second- + level table. The size of that table is determined by the longest code with + that root-bit prefix. If that longest code has length len, then the table + has size 1 << (len - root), to index the remaining bits in that set of + codes. Each subsequent root-bit prefix then has its own sub-table. The + total number of table entries required by the code is calculated + incrementally as the number of codes at each bit length is populated. When + all of the codes are shorter than root bits, then root is reduced to the + longest code length, resulting in a single, smaller, one-level table. + + The inflate algorithm also provides for small values of root (relative to + the log2 of the number of symbols), where the shortest code has more bits + than root. In that case, root is increased to the length of the shortest + code. This program, by design, does not handle that case, so it is verified + that the number of symbols is less than 2^(root + 1). + + In order to speed up the examination (by about ten orders of magnitude for + the default arguments), the intermediate states in the build-up of a code + are remembered and previously visited branches are pruned. The memory + required for this will increase rapidly with the total number of symbols and + the maximum code length in bits. However this is a very small price to pay + for the vast speedup. + + First, all of the possible Huffman codes are counted, and reachable + intermediate states are noted by a non-zero count in a saved-results array. + Second, the intermediate states that lead to (root + 1) bit or longer codes + are used to look at all sub-codes from those junctures for their inflate + memory usage. (The amount of memory used is not affected by the number of + codes of root bits or less in length.) Third, the visited states in the + construction of those sub-codes and the associated calculation of the table + size is recalled in order to avoid recalculating from the same juncture. + Beginning the code examination at (root + 1) bit codes, which is enabled by + identifying the reachable nodes, accounts for about six of the orders of + magnitude of improvement for the default arguments. About another four + orders of magnitude come from not revisiting previous states. Out of + approximately 2x10^16 possible Huffman codes, only about 2x10^6 sub-codes + need to be examined to cover all of the possible table memory usage cases + for the default arguments of 286 symbols limited to 15-bit codes. + + Note that an unsigned long long type is used for counting. It is quite easy + to exceed the capacity of an eight-byte integer with a large number of + symbols and a large maximum code length, so multiple-precision arithmetic + would need to replace the unsigned long long arithmetic in that case. This + program will abort if an overflow occurs. The big_t type identifies where + the counting takes place. + + An unsigned long long type is also used for calculating the number of + possible codes remaining at the maximum length. This limits the maximum + code length to the number of bits in a long long minus the number of bits + needed to represent the symbols in a flat code. The code_t type identifies + where the bit pattern counting takes place. + */ + +#include +#include +#include +#include + +#define local static + +/* special data types */ +typedef unsigned long long big_t; /* type for code counting */ +typedef unsigned long long code_t; /* type for bit pattern counting */ +struct tab { /* type for been here check */ + size_t len; /* length of bit vector in char's */ + char *vec; /* allocated bit vector */ +}; + +/* The array for saving results, num[], is indexed with this triplet: + + syms: number of symbols remaining to code + left: number of available bit patterns at length len + len: number of bits in the codes currently being assigned + + Those indices are constrained thusly when saving results: + + syms: 3..totsym (totsym == total symbols to code) + left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6) + len: 1..max - 1 (max == maximum code length in bits) + + syms == 2 is not saved since that immediately leads to a single code. left + must be even, since it represents the number of available bit patterns at + the current length, which is double the number at the previous length. + left ends at syms-1 since left == syms immediately results in a single code. + (left > sym is not allowed since that would result in an incomplete code.) + len is less than max, since the code completes immediately when len == max. + + The offset into the array is calculated for the three indices with the + first one (syms) being outermost, and the last one (len) being innermost. + We build the array with length max-1 lists for the len index, with syms-3 + of those for each symbol. There are totsym-2 of those, with each one + varying in length as a function of sym. See the calculation of index in + count() for the index, and the calculation of size in main() for the size + of the array. + + For the deflate example of 286 symbols limited to 15-bit codes, the array + has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than + half of the space allocated for saved results is actually used -- not all + possible triplets are reached in the generation of valid Huffman codes. + */ + +/* The array for tracking visited states, done[], is itself indexed identically + to the num[] array as described above for the (syms, left, len) triplet. + Each element in the array is further indexed by the (mem, rem) doublet, + where mem is the amount of inflate table space used so far, and rem is the + remaining unused entries in the current inflate sub-table. Each indexed + element is simply one bit indicating whether the state has been visited or + not. Since the ranges for mem and rem are not known a priori, each bit + vector is of a variable size, and grows as needed to accommodate the visited + states. mem and rem are used to calculate a single index in a triangular + array. Since the range of mem is expected in the default case to be about + ten times larger than the range of rem, the array is skewed to reduce the + memory usage, with eight times the range for mem than for rem. See the + calculations for offset and bit in beenhere() for the details. + + For the deflate example of 286 symbols limited to 15-bit codes, the bit + vectors grow to total approximately 21 MB, in addition to the 4.3 MB done[] + array itself. + */ + +/* Globals to avoid propagating constants or constant pointers recursively */ +local int max; /* maximum allowed bit length for the codes */ +local int root; /* size of base code table in bits */ +local int large; /* largest code table so far */ +local size_t size; /* number of elements in num and done */ +local int *code; /* number of symbols assigned to each bit length */ +local big_t *num; /* saved results array for code counting */ +local struct tab *done; /* states already evaluated array */ + +/* Index function for num[] and done[] */ +#define INDEX(i,j,k) (((size_t)((i-1)>>1)*((i-2)>>1)+(j>>1)-1)*(max-1)+k-1) + +/* Free allocated space. Uses globals code, num, and done. */ +local void cleanup(void) +{ + size_t n; + + if (done != NULL) { + for (n = 0; n < size; n++) + if (done[n].len) + free(done[n].vec); + free(done); + } + if (num != NULL) + free(num); + if (code != NULL) + free(code); +} + +/* Return the number of possible Huffman codes using bit patterns of lengths + len through max inclusive, coding syms symbols, with left bit patterns of + length len unused -- return -1 if there is an overflow in the counting. + Keep a record of previous results in num to prevent repeating the same + calculation. Uses the globals max and num. */ +local big_t count(int syms, int len, int left) +{ + big_t sum; /* number of possible codes from this juncture */ + big_t got; /* value returned from count() */ + int least; /* least number of syms to use at this juncture */ + int most; /* most number of syms to use at this juncture */ + int use; /* number of bit patterns to use in next call */ + size_t index; /* index of this case in *num */ + + /* see if only one possible code */ + if (syms == left) + return 1; + + /* note and verify the expected state */ + assert(syms > left && left > 0 && len < max); + + /* see if we've done this one already */ + index = INDEX(syms, left, len); + got = num[index]; + if (got) + return got; /* we have -- return the saved result */ + + /* we need to use at least this many bit patterns so that the code won't be + incomplete at the next length (more bit patterns than symbols) */ + least = (left << 1) - syms; + if (least < 0) + least = 0; + + /* we can use at most this many bit patterns, lest there not be enough + available for the remaining symbols at the maximum length (if there were + no limit to the code length, this would become: most = left - 1) */ + most = (((code_t)left << (max - len)) - syms) / + (((code_t)1 << (max - len)) - 1); + + /* count all possible codes from this juncture and add them up */ + sum = 0; + for (use = least; use <= most; use++) { + got = count(syms - use, len + 1, (left - use) << 1); + sum += got; + if (got == (big_t)0 - 1 || sum < got) /* overflow */ + return (big_t)0 - 1; + } + + /* verify that all recursive calls are productive */ + assert(sum != 0); + + /* save the result and return it */ + num[index] = sum; + return sum; +} + +/* Return true if we've been here before, set to true if not. Set a bit in a + bit vector to indicate visiting this state. Each (syms,len,left) state + has a variable size bit vector indexed by (mem,rem). The bit vector is + lengthened if needed to allow setting the (mem,rem) bit. */ +local int beenhere(int syms, int len, int left, int mem, int rem) +{ + size_t index; /* index for this state's bit vector */ + size_t offset; /* offset in this state's bit vector */ + int bit; /* mask for this state's bit */ + size_t length; /* length of the bit vector in bytes */ + char *vector; /* new or enlarged bit vector */ + + /* point to vector for (syms,left,len), bit in vector for (mem,rem) */ + index = INDEX(syms, left, len); + mem -= 1 << root; + offset = (mem >> 3) + rem; + offset = ((offset * (offset + 1)) >> 1) + rem; + bit = 1 << (mem & 7); + + /* see if we've been here */ + length = done[index].len; + if (offset < length && (done[index].vec[offset] & bit) != 0) + return 1; /* done this! */ + + /* we haven't been here before -- set the bit to show we have now */ + + /* see if we need to lengthen the vector in order to set the bit */ + if (length <= offset) { + /* if we have one already, enlarge it, zero out the appended space */ + if (length) { + do { + length <<= 1; + } while (length <= offset); + vector = realloc(done[index].vec, length); + if (vector != NULL) + memset(vector + done[index].len, 0, length - done[index].len); + } + + /* otherwise we need to make a new vector and zero it out */ + else { + length = 1 << (len - root); + while (length <= offset) + length <<= 1; + vector = calloc(length, sizeof(char)); + } + + /* in either case, bail if we can't get the memory */ + if (vector == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + exit(1); + } + + /* install the new vector */ + done[index].len = length; + done[index].vec = vector; + } + + /* set the bit */ + done[index].vec[offset] |= bit; + return 0; +} + +/* Examine all possible codes from the given node (syms, len, left). Compute + the amount of memory required to build inflate's decoding tables, where the + number of code structures used so far is mem, and the number remaining in + the current sub-table is rem. Uses the globals max, code, root, large, and + done. */ +local void examine(int syms, int len, int left, int mem, int rem) +{ + int least; /* least number of syms to use at this juncture */ + int most; /* most number of syms to use at this juncture */ + int use; /* number of bit patterns to use in next call */ + + /* see if we have a complete code */ + if (syms == left) { + /* set the last code entry */ + code[len] = left; + + /* complete computation of memory used by this code */ + while (rem < left) { + left -= rem; + rem = 1 << (len - root); + mem += rem; + } + assert(rem == left); + + /* if this is a new maximum, show the entries used and the sub-code */ + if (mem > large) { + large = mem; + printf("max %d: ", mem); + for (use = root + 1; use <= max; use++) + if (code[use]) + printf("%d[%d] ", code[use], use); + putchar('\n'); + fflush(stdout); + } + + /* remove entries as we drop back down in the recursion */ + code[len] = 0; + return; + } + + /* prune the tree if we can */ + if (beenhere(syms, len, left, mem, rem)) + return; + + /* we need to use at least this many bit patterns so that the code won't be + incomplete at the next length (more bit patterns than symbols) */ + least = (left << 1) - syms; + if (least < 0) + least = 0; + + /* we can use at most this many bit patterns, lest there not be enough + available for the remaining symbols at the maximum length (if there were + no limit to the code length, this would become: most = left - 1) */ + most = (((code_t)left << (max - len)) - syms) / + (((code_t)1 << (max - len)) - 1); + + /* occupy least table spaces, creating new sub-tables as needed */ + use = least; + while (rem < use) { + use -= rem; + rem = 1 << (len - root); + mem += rem; + } + rem -= use; + + /* examine codes from here, updating table space as we go */ + for (use = least; use <= most; use++) { + code[len] = use; + examine(syms - use, len + 1, (left - use) << 1, + mem + (rem ? 1 << (len - root) : 0), rem << 1); + if (rem == 0) { + rem = 1 << (len - root); + mem += rem; + } + rem--; + } + + /* remove entries as we drop back down in the recursion */ + code[len] = 0; +} + +/* Look at all sub-codes starting with root + 1 bits. Look at only the valid + intermediate code states (syms, left, len). For each completed code, + calculate the amount of memory required by inflate to build the decoding + tables. Find the maximum amount of memory required and show the code that + requires that maximum. Uses the globals max, root, and num. */ +local void enough(int syms) +{ + int n; /* number of remaing symbols for this node */ + int left; /* number of unused bit patterns at this length */ + size_t index; /* index of this case in *num */ + + /* clear code */ + for (n = 0; n <= max; n++) + code[n] = 0; + + /* look at all (root + 1) bit and longer codes */ + large = 1 << root; /* base table */ + if (root < max) /* otherwise, there's only a base table */ + for (n = 3; n <= syms; n++) + for (left = 2; left < n; left += 2) + { + /* look at all reachable (root + 1) bit nodes, and the + resulting codes (complete at root + 2 or more) */ + index = INDEX(n, left, root + 1); + if (root + 1 < max && num[index]) /* reachable node */ + examine(n, root + 1, left, 1 << root, 0); + + /* also look at root bit codes with completions at root + 1 + bits (not saved in num, since complete), just in case */ + if (num[index - 1] && n <= left << 1) + examine((n - left) << 1, root + 1, (n - left) << 1, + 1 << root, 0); + } + + /* done */ + printf("done: maximum of %d table entries\n", large); +} + +/* + Examine and show the total number of possible Huffman codes for a given + maximum number of symbols, initial root table size, and maximum code length + in bits -- those are the command arguments in that order. The default + values are 286, 9, and 15 respectively, for the deflate literal/length code. + The possible codes are counted for each number of coded symbols from two to + the maximum. The counts for each of those and the total number of codes are + shown. The maximum number of inflate table entires is then calculated + across all possible codes. Each new maximum number of table entries and the + associated sub-code (starting at root + 1 == 10 bits) is shown. + + To count and examine Huffman codes that are not length-limited, provide a + maximum length equal to the number of symbols minus one. + + For the deflate literal/length code, use "enough". For the deflate distance + code, use "enough 30 6". + + This uses the %llu printf format to print big_t numbers, which assumes that + big_t is an unsigned long long. If the big_t type is changed (for example + to a multiple precision type), the method of printing will also need to be + updated. + */ +int main(int argc, char **argv) +{ + int syms; /* total number of symbols to code */ + int n; /* number of symbols to code for this run */ + big_t got; /* return value of count() */ + big_t sum; /* accumulated number of codes over n */ + code_t word; /* for counting bits in code_t */ + + /* set up globals for cleanup() */ + code = NULL; + num = NULL; + done = NULL; + + /* get arguments -- default to the deflate literal/length code */ + syms = 286; + root = 9; + max = 15; + if (argc > 1) { + syms = atoi(argv[1]); + if (argc > 2) { + root = atoi(argv[2]); + if (argc > 3) + max = atoi(argv[3]); + } + } + if (argc > 4 || syms < 2 || root < 1 || max < 1) { + fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n", + stderr); + return 1; + } + + /* if not restricting the code length, the longest is syms - 1 */ + if (max > syms - 1) + max = syms - 1; + + /* determine the number of bits in a code_t */ + for (n = 0, word = 1; word; n++, word <<= 1) + ; + + /* make sure that the calculation of most will not overflow */ + if (max > n || (code_t)(syms - 2) >= (((code_t)0 - 1) >> (max - 1))) { + fputs("abort: code length too long for internal types\n", stderr); + return 1; + } + + /* reject impossible code requests */ + if ((code_t)(syms - 1) > ((code_t)1 << max) - 1) { + fprintf(stderr, "%d symbols cannot be coded in %d bits\n", + syms, max); + return 1; + } + + /* allocate code vector */ + code = calloc(max + 1, sizeof(int)); + if (code == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + return 1; + } + + /* determine size of saved results array, checking for overflows, + allocate and clear the array (set all to zero with calloc()) */ + if (syms == 2) /* iff max == 1 */ + num = NULL; /* won't be saving any results */ + else { + size = syms >> 1; + if (size > ((size_t)0 - 1) / (n = (syms - 1) >> 1) || + (size *= n, size > ((size_t)0 - 1) / (n = max - 1)) || + (size *= n, size > ((size_t)0 - 1) / sizeof(big_t)) || + (num = calloc(size, sizeof(big_t))) == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + return 1; + } + } + + /* count possible codes for all numbers of symbols, add up counts */ + sum = 0; + for (n = 2; n <= syms; n++) { + got = count(n, 1, 2); + sum += got; + if (got == (big_t)0 - 1 || sum < got) { /* overflow */ + fputs("abort: can't count that high!\n", stderr); + cleanup(); + return 1; + } + printf("%llu %d-codes\n", got, n); + } + printf("%llu total codes for 2 to %d symbols", sum, syms); + if (max < syms - 1) + printf(" (%d-bit length limit)\n", max); + else + puts(" (no length limit)"); + + /* allocate and clear done array for beenhere() */ + if (syms == 2) + done = NULL; + else if (size > ((size_t)0 - 1) / sizeof(struct tab) || + (done = calloc(size, sizeof(struct tab))) == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + return 1; + } + + /* find and show maximum inflate table usage */ + if (root > max) /* reduce root to max length */ + root = max; + if ((code_t)syms < ((code_t)1 << (root + 1))) + enough(syms); + else + puts("cannot handle minimum code lengths > root"); + + /* done */ + cleanup(); + return 0; +} diff --git a/deps/zlib-1.2.10/examples/fitblk.c b/deps/zlib-1.2.10/examples/fitblk.c new file mode 100644 index 0000000..c61de5c --- /dev/null +++ b/deps/zlib-1.2.10/examples/fitblk.c @@ -0,0 +1,233 @@ +/* fitblk.c: example of fitting compressed output to a specified size + Not copyrighted -- provided to the public domain + Version 1.1 25 November 2004 Mark Adler */ + +/* Version history: + 1.0 24 Nov 2004 First version + 1.1 25 Nov 2004 Change deflateInit2() to deflateInit() + Use fixed-size, stack-allocated raw buffers + Simplify code moving compression to subroutines + Use assert() for internal errors + Add detailed description of approach + */ + +/* Approach to just fitting a requested compressed size: + + fitblk performs three compression passes on a portion of the input + data in order to determine how much of that input will compress to + nearly the requested output block size. The first pass generates + enough deflate blocks to produce output to fill the requested + output size plus a specfied excess amount (see the EXCESS define + below). The last deflate block may go quite a bit past that, but + is discarded. The second pass decompresses and recompresses just + the compressed data that fit in the requested plus excess sized + buffer. The deflate process is terminated after that amount of + input, which is less than the amount consumed on the first pass. + The last deflate block of the result will be of a comparable size + to the final product, so that the header for that deflate block and + the compression ratio for that block will be about the same as in + the final product. The third compression pass decompresses the + result of the second step, but only the compressed data up to the + requested size minus an amount to allow the compressed stream to + complete (see the MARGIN define below). That will result in a + final compressed stream whose length is less than or equal to the + requested size. Assuming sufficient input and a requested size + greater than a few hundred bytes, the shortfall will typically be + less than ten bytes. + + If the input is short enough that the first compression completes + before filling the requested output size, then that compressed + stream is return with no recompression. + + EXCESS is chosen to be just greater than the shortfall seen in a + two pass approach similar to the above. That shortfall is due to + the last deflate block compressing more efficiently with a smaller + header on the second pass. EXCESS is set to be large enough so + that there is enough uncompressed data for the second pass to fill + out the requested size, and small enough so that the final deflate + block of the second pass will be close in size to the final deflate + block of the third and final pass. MARGIN is chosen to be just + large enough to assure that the final compression has enough room + to complete in all cases. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +/* print nastygram and leave */ +local void quit(char *why) +{ + fprintf(stderr, "fitblk abort: %s\n", why); + exit(1); +} + +#define RAWLEN 4096 /* intermediate uncompressed buffer size */ + +/* compress from file to def until provided buffer is full or end of + input reached; return last deflate() return value, or Z_ERRNO if + there was read error on the file */ +local int partcompress(FILE *in, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + def->avail_in = fread(raw, 1, RAWLEN, in); + if (ferror(in)) + return Z_ERRNO; + def->next_in = raw; + if (feof(in)) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (def->avail_out != 0 && flush == Z_NO_FLUSH); + return ret; +} + +/* recompress from inf's input to def's output; the input for inf and + the output for def are set in those structures before calling; + return last deflate() return value, or Z_MEM_ERROR if inflate() + was not able to allocate enough memory when it needed to */ +local int recompress(z_streamp inf, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + /* decompress */ + inf->avail_out = RAWLEN; + inf->next_out = raw; + ret = inflate(inf, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR && ret != Z_DATA_ERROR && + ret != Z_NEED_DICT); + if (ret == Z_MEM_ERROR) + return ret; + + /* compress what was decompresed until done or no room */ + def->avail_in = RAWLEN - inf->avail_out; + def->next_in = raw; + if (inf->avail_out != 0) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (ret != Z_STREAM_END && def->avail_out != 0); + return ret; +} + +#define EXCESS 256 /* empirically determined stream overage */ +#define MARGIN 8 /* amount to back off for completion */ + +/* compress from stdin to fixed-size block on stdout */ +int main(int argc, char **argv) +{ + int ret; /* return code */ + unsigned size; /* requested fixed output block size */ + unsigned have; /* bytes written by deflate() call */ + unsigned char *blk; /* intermediate and final stream */ + unsigned char *tmp; /* close to desired size stream */ + z_stream def, inf; /* zlib deflate and inflate states */ + + /* get requested output size */ + if (argc != 2) + quit("need one argument: size of output block"); + ret = strtol(argv[1], argv + 1, 10); + if (argv[1][0] != 0) + quit("argument must be a number"); + if (ret < 8) /* 8 is minimum zlib stream size */ + quit("need positive size of 8 or greater"); + size = (unsigned)ret; + + /* allocate memory for buffers and compression engine */ + blk = malloc(size + EXCESS); + def.zalloc = Z_NULL; + def.zfree = Z_NULL; + def.opaque = Z_NULL; + ret = deflateInit(&def, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK || blk == NULL) + quit("out of memory"); + + /* compress from stdin until output full, or no more input */ + def.avail_out = size + EXCESS; + def.next_out = blk; + ret = partcompress(stdin, &def); + if (ret == Z_ERRNO) + quit("error reading input"); + + /* if it all fit, then size was undersubscribed -- done! */ + if (ret == Z_STREAM_END && def.avail_out >= EXCESS) { + /* write block to stdout */ + have = size + EXCESS - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (all input)\n", + size - have, size); + return 0; + } + + /* it didn't all fit -- set up for recompression */ + inf.zalloc = Z_NULL; + inf.zfree = Z_NULL; + inf.opaque = Z_NULL; + inf.avail_in = 0; + inf.next_in = Z_NULL; + ret = inflateInit(&inf); + tmp = malloc(size + EXCESS); + if (ret != Z_OK || tmp == NULL) + quit("out of memory"); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do first recompression close to the right amount */ + inf.avail_in = size + EXCESS; + inf.next_in = blk; + def.avail_out = size + EXCESS; + def.next_out = tmp; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + + /* set up for next reocmpression */ + ret = inflateReset(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do second and final recompression (third compression) */ + inf.avail_in = size - MARGIN; /* assure stream will complete */ + inf.next_in = tmp; + def.avail_out = size; + def.next_out = blk; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + assert(ret == Z_STREAM_END); /* otherwise MARGIN too small */ + + /* done -- write block to stdout */ + have = size - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + free(tmp); + ret = inflateEnd(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (%lu input)\n", + size - have, size, def.total_in); + return 0; +} diff --git a/deps/zlib-1.2.10/examples/gun.c b/deps/zlib-1.2.10/examples/gun.c new file mode 100644 index 0000000..be44fa5 --- /dev/null +++ b/deps/zlib-1.2.10/examples/gun.c @@ -0,0 +1,702 @@ +/* gun.c -- simple gunzip to give an example of the use of inflateBack() + * Copyright (C) 2003, 2005, 2008, 2010, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.7 12 August 2012 Mark Adler */ + +/* Version history: + 1.0 16 Feb 2003 First version for testing of inflateBack() + 1.1 21 Feb 2005 Decompress concatenated gzip streams + Remove use of "this" variable (C++ keyword) + Fix return value for in() + Improve allocation failure checking + Add typecasting for void * structures + Add -h option for command version and usage + Add a bunch of comments + 1.2 20 Mar 2005 Add Unix compress (LZW) decompression + Copy file attributes from input file to output file + 1.3 12 Jun 2005 Add casts for error messages [Oberhumer] + 1.4 8 Dec 2006 LZW decompression speed improvements + 1.5 9 Feb 2008 Avoid warning in latest version of gcc + 1.6 17 Jan 2010 Avoid signed/unsigned comparison warnings + 1.7 12 Aug 2012 Update for z_const usage in zlib 1.2.8 + */ + +/* + gun [ -t ] [ name ... ] + + decompresses the data in the named gzip files. If no arguments are given, + gun will decompress from stdin to stdout. The names must end in .gz, -gz, + .z, -z, _z, or .Z. The uncompressed data will be written to a file name + with the suffix stripped. On success, the original file is deleted. On + failure, the output file is deleted. For most failures, the command will + continue to process the remaining names on the command line. A memory + allocation failure will abort the command. If -t is specified, then the + listed files or stdin will be tested as gzip files for integrity (without + checking for a proper suffix), no output will be written, and no files + will be deleted. + + Like gzip, gun allows concatenated gzip streams and will decompress them, + writing all of the uncompressed data to the output. Unlike gzip, gun allows + an empty file on input, and will produce no error writing an empty output + file. + + gun will also decompress files made by Unix compress, which uses LZW + compression. These files are automatically detected by virtue of their + magic header bytes. Since the end of Unix compress stream is marked by the + end-of-file, they cannot be concantenated. If a Unix compress stream is + encountered in an input file, it is the last stream in that file. + + Like gunzip and uncompress, the file attributes of the original compressed + file are maintained in the final uncompressed file, to the extent that the + user permissions allow it. + + On my Mac OS X PowerPC G4, gun is almost twice as fast as gunzip (version + 1.2.4) is on the same file, when gun is linked with zlib 1.2.2. Also the + LZW decompression provided by gun is about twice as fast as the standard + Unix uncompress command. + */ + +/* external functions and related types and constants */ +#include /* fprintf() */ +#include /* malloc(), free() */ +#include /* strerror(), strcmp(), strlen(), memcpy() */ +#include /* errno */ +#include /* open() */ +#include /* read(), write(), close(), chown(), unlink() */ +#include +#include /* stat(), chmod() */ +#include /* utime() */ +#include "zlib.h" /* inflateBackInit(), inflateBack(), */ + /* inflateBackEnd(), crc32() */ + +/* function declaration */ +#define local static + +/* buffer constants */ +#define SIZE 32768U /* input and output buffer sizes */ +#define PIECE 16384 /* limits i/o chunks for 16-bit int case */ + +/* structure for infback() to pass to input function in() -- it maintains the + input file and a buffer of size SIZE */ +struct ind { + int infile; + unsigned char *inbuf; +}; + +/* Load input buffer, assumed to be empty, and return bytes loaded and a + pointer to them. read() is called until the buffer is full, or until it + returns end-of-file or error. Return 0 on error. */ +local unsigned in(void *in_desc, z_const unsigned char **buf) +{ + int ret; + unsigned len; + unsigned char *next; + struct ind *me = (struct ind *)in_desc; + + next = me->inbuf; + *buf = next; + len = 0; + do { + ret = PIECE; + if ((unsigned)ret > SIZE - len) + ret = (int)(SIZE - len); + ret = (int)read(me->infile, next, ret); + if (ret == -1) { + len = 0; + break; + } + next += ret; + len += ret; + } while (ret != 0 && len < SIZE); + return len; +} + +/* structure for infback() to pass to output function out() -- it maintains the + output file, a running CRC-32 check on the output and the total number of + bytes output, both for checking against the gzip trailer. (The length in + the gzip trailer is stored modulo 2^32, so it's ok if a long is 32 bits and + the output is greater than 4 GB.) */ +struct outd { + int outfile; + int check; /* true if checking crc and total */ + unsigned long crc; + unsigned long total; +}; + +/* Write output buffer and update the CRC-32 and total bytes written. write() + is called until all of the output is written or an error is encountered. + On success out() returns 0. For a write failure, out() returns 1. If the + output file descriptor is -1, then nothing is written. + */ +local int out(void *out_desc, unsigned char *buf, unsigned len) +{ + int ret; + struct outd *me = (struct outd *)out_desc; + + if (me->check) { + me->crc = crc32(me->crc, buf, len); + me->total += len; + } + if (me->outfile != -1) + do { + ret = PIECE; + if ((unsigned)ret > len) + ret = (int)len; + ret = (int)write(me->outfile, buf, ret); + if (ret == -1) + return 1; + buf += ret; + len -= ret; + } while (len != 0); + return 0; +} + +/* next input byte macro for use inside lunpipe() and gunpipe() */ +#define NEXT() (have ? 0 : (have = in(indp, &next)), \ + last = have ? (have--, (int)(*next++)) : -1) + +/* memory for gunpipe() and lunpipe() -- + the first 256 entries of prefix[] and suffix[] are never used, could + have offset the index, but it's faster to waste the memory */ +unsigned char inbuf[SIZE]; /* input buffer */ +unsigned char outbuf[SIZE]; /* output buffer */ +unsigned short prefix[65536]; /* index to LZW prefix string */ +unsigned char suffix[65536]; /* one-character LZW suffix */ +unsigned char match[65280 + 2]; /* buffer for reversed match or gzip + 32K sliding window */ + +/* throw out what's left in the current bits byte buffer (this is a vestigial + aspect of the compressed data format derived from an implementation that + made use of a special VAX machine instruction!) */ +#define FLUSHCODE() \ + do { \ + left = 0; \ + rem = 0; \ + if (chunk > have) { \ + chunk -= have; \ + have = 0; \ + if (NEXT() == -1) \ + break; \ + chunk--; \ + if (chunk > have) { \ + chunk = have = 0; \ + break; \ + } \ + } \ + have -= chunk; \ + next += chunk; \ + chunk = 0; \ + } while (0) + +/* Decompress a compress (LZW) file from indp to outfile. The compress magic + header (two bytes) has already been read and verified. There are have bytes + of buffered input at next. strm is used for passing error information back + to gunpipe(). + + lunpipe() will return Z_OK on success, Z_BUF_ERROR for an unexpected end of + file, read error, or write error (a write error indicated by strm->next_in + not equal to Z_NULL), or Z_DATA_ERROR for invalid input. + */ +local int lunpipe(unsigned have, z_const unsigned char *next, struct ind *indp, + int outfile, z_stream *strm) +{ + int last; /* last byte read by NEXT(), or -1 if EOF */ + unsigned chunk; /* bytes left in current chunk */ + int left; /* bits left in rem */ + unsigned rem; /* unused bits from input */ + int bits; /* current bits per code */ + unsigned code; /* code, table traversal index */ + unsigned mask; /* mask for current bits codes */ + int max; /* maximum bits per code for this stream */ + unsigned flags; /* compress flags, then block compress flag */ + unsigned end; /* last valid entry in prefix/suffix tables */ + unsigned temp; /* current code */ + unsigned prev; /* previous code */ + unsigned final; /* last character written for previous code */ + unsigned stack; /* next position for reversed string */ + unsigned outcnt; /* bytes in output buffer */ + struct outd outd; /* output structure */ + unsigned char *p; + + /* set up output */ + outd.outfile = outfile; + outd.check = 0; + + /* process remainder of compress header -- a flags byte */ + flags = NEXT(); + if (last == -1) + return Z_BUF_ERROR; + if (flags & 0x60) { + strm->msg = (char *)"unknown lzw flags set"; + return Z_DATA_ERROR; + } + max = flags & 0x1f; + if (max < 9 || max > 16) { + strm->msg = (char *)"lzw bits out of range"; + return Z_DATA_ERROR; + } + if (max == 9) /* 9 doesn't really mean 9 */ + max = 10; + flags &= 0x80; /* true if block compress */ + + /* clear table */ + bits = 9; + mask = 0x1ff; + end = flags ? 256 : 255; + + /* set up: get first 9-bit code, which is the first decompressed byte, but + don't create a table entry until the next code */ + if (NEXT() == -1) /* no compressed data is ok */ + return Z_OK; + final = prev = (unsigned)last; /* low 8 bits of code */ + if (NEXT() == -1) /* missing a bit */ + return Z_BUF_ERROR; + if (last & 1) { /* code must be < 256 */ + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + rem = (unsigned)last >> 1; /* remaining 7 bits */ + left = 7; + chunk = bits - 2; /* 7 bytes left in this chunk */ + outbuf[0] = (unsigned char)final; /* write first decompressed byte */ + outcnt = 1; + + /* decode codes */ + stack = 0; + for (;;) { + /* if the table will be full after this, increment the code size */ + if (end >= mask && bits < max) { + FLUSHCODE(); + bits++; + mask <<= 1; + mask++; + } + + /* get a code of length bits */ + if (chunk == 0) /* decrement chunk modulo bits */ + chunk = bits; + code = rem; /* low bits of code */ + if (NEXT() == -1) { /* EOF is end of compressed data */ + /* write remaining buffered output */ + if (outcnt && out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + return Z_OK; + } + code += (unsigned)last << left; /* middle (or high) bits of code */ + left += 8; + chunk--; + if (bits > left) { /* need more bits */ + if (NEXT() == -1) /* can't end in middle of code */ + return Z_BUF_ERROR; + code += (unsigned)last << left; /* high bits of code */ + left += 8; + chunk--; + } + code &= mask; /* mask to current code length */ + left -= bits; /* number of unused bits */ + rem = (unsigned)last >> (8 - left); /* unused bits from last byte */ + + /* process clear code (256) */ + if (code == 256 && flags) { + FLUSHCODE(); + bits = 9; /* initialize bits and mask */ + mask = 0x1ff; + end = 255; /* empty table */ + continue; /* get next code */ + } + + /* special code to reuse last match */ + temp = code; /* save the current code */ + if (code > end) { + /* Be picky on the allowed code here, and make sure that the code + we drop through (prev) will be a valid index so that random + input does not cause an exception. The code != end + 1 check is + empirically derived, and not checked in the original uncompress + code. If this ever causes a problem, that check could be safely + removed. Leaving this check in greatly improves gun's ability + to detect random or corrupted input after a compress header. + In any case, the prev > end check must be retained. */ + if (code != end + 1 || prev > end) { + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + match[stack++] = (unsigned char)final; + code = prev; + } + + /* walk through linked list to generate output in reverse order */ + p = match + stack; + while (code >= 256) { + *p++ = suffix[code]; + code = prefix[code]; + } + stack = p - match; + match[stack++] = (unsigned char)code; + final = code; + + /* link new table entry */ + if (end < mask) { + end++; + prefix[end] = (unsigned short)prev; + suffix[end] = (unsigned char)final; + } + + /* set previous code for next iteration */ + prev = temp; + + /* write output in forward order */ + while (stack > SIZE - outcnt) { + while (outcnt < SIZE) + outbuf[outcnt++] = match[--stack]; + if (out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + outcnt = 0; + } + p = match + stack; + do { + outbuf[outcnt++] = *--p; + } while (p > match); + stack = 0; + + /* loop for next code with final and prev as the last match, rem and + left provide the first 0..7 bits of the next code, end is the last + valid table entry */ + } +} + +/* Decompress a gzip file from infile to outfile. strm is assumed to have been + successfully initialized with inflateBackInit(). The input file may consist + of a series of gzip streams, in which case all of them will be decompressed + to the output file. If outfile is -1, then the gzip stream(s) integrity is + checked and nothing is written. + + The return value is a zlib error code: Z_MEM_ERROR if out of memory, + Z_DATA_ERROR if the header or the compressed data is invalid, or if the + trailer CRC-32 check or length doesn't match, Z_BUF_ERROR if the input ends + prematurely or a write error occurs, or Z_ERRNO if junk (not a another gzip + stream) follows a valid gzip stream. + */ +local int gunpipe(z_stream *strm, int infile, int outfile) +{ + int ret, first, last; + unsigned have, flags, len; + z_const unsigned char *next = NULL; + struct ind ind, *indp; + struct outd outd; + + /* setup input buffer */ + ind.infile = infile; + ind.inbuf = inbuf; + indp = &ind; + + /* decompress concatenated gzip streams */ + have = 0; /* no input data read in yet */ + first = 1; /* looking for first gzip header */ + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + for (;;) { + /* look for the two magic header bytes for a gzip stream */ + if (NEXT() == -1) { + ret = Z_OK; + break; /* empty gzip stream is ok */ + } + if (last != 31 || (NEXT() != 139 && last != 157)) { + strm->msg = (char *)"incorrect header check"; + ret = first ? Z_DATA_ERROR : Z_ERRNO; + break; /* not a gzip or compress header */ + } + first = 0; /* next non-header is junk */ + + /* process a compress (LZW) file -- can't be concatenated after this */ + if (last == 157) { + ret = lunpipe(have, next, indp, outfile, strm); + break; + } + + /* process remainder of gzip header */ + ret = Z_BUF_ERROR; + if (NEXT() != 8) { /* only deflate method allowed */ + if (last == -1) break; + strm->msg = (char *)"unknown compression method"; + ret = Z_DATA_ERROR; + break; + } + flags = NEXT(); /* header flags */ + NEXT(); /* discard mod time, xflgs, os */ + NEXT(); + NEXT(); + NEXT(); + NEXT(); + NEXT(); + if (last == -1) break; + if (flags & 0xe0) { + strm->msg = (char *)"unknown header flags set"; + ret = Z_DATA_ERROR; + break; + } + if (flags & 4) { /* extra field */ + len = NEXT(); + len += (unsigned)(NEXT()) << 8; + if (last == -1) break; + while (len > have) { + len -= have; + have = 0; + if (NEXT() == -1) break; + len--; + } + if (last == -1) break; + have -= len; + next += len; + } + if (flags & 8) /* file name */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 16) /* comment */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 2) { /* header crc */ + NEXT(); + NEXT(); + } + if (last == -1) break; + + /* set up output */ + outd.outfile = outfile; + outd.check = 1; + outd.crc = crc32(0L, Z_NULL, 0); + outd.total = 0; + + /* decompress data to output */ + strm->next_in = next; + strm->avail_in = have; + ret = inflateBack(strm, in, indp, out, &outd); + if (ret != Z_STREAM_END) break; + next = strm->next_in; + have = strm->avail_in; + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + + /* check trailer */ + ret = Z_BUF_ERROR; + if (NEXT() != (int)(outd.crc & 0xff) || + NEXT() != (int)((outd.crc >> 8) & 0xff) || + NEXT() != (int)((outd.crc >> 16) & 0xff) || + NEXT() != (int)((outd.crc >> 24) & 0xff)) { + /* crc error */ + if (last != -1) { + strm->msg = (char *)"incorrect data check"; + ret = Z_DATA_ERROR; + } + break; + } + if (NEXT() != (int)(outd.total & 0xff) || + NEXT() != (int)((outd.total >> 8) & 0xff) || + NEXT() != (int)((outd.total >> 16) & 0xff) || + NEXT() != (int)((outd.total >> 24) & 0xff)) { + /* length error */ + if (last != -1) { + strm->msg = (char *)"incorrect length check"; + ret = Z_DATA_ERROR; + } + break; + } + + /* go back and look for another gzip stream */ + } + + /* clean up and return */ + return ret; +} + +/* Copy file attributes, from -> to, as best we can. This is best effort, so + no errors are reported. The mode bits, including suid, sgid, and the sticky + bit are copied (if allowed), the owner's user id and group id are copied + (again if allowed), and the access and modify times are copied. */ +local void copymeta(char *from, char *to) +{ + struct stat was; + struct utimbuf when; + + /* get all of from's Unix meta data, return if not a regular file */ + if (stat(from, &was) != 0 || (was.st_mode & S_IFMT) != S_IFREG) + return; + + /* set to's mode bits, ignore errors */ + (void)chmod(to, was.st_mode & 07777); + + /* copy owner's user and group, ignore errors */ + (void)chown(to, was.st_uid, was.st_gid); + + /* copy access and modify times, ignore errors */ + when.actime = was.st_atime; + when.modtime = was.st_mtime; + (void)utime(to, &when); +} + +/* Decompress the file inname to the file outnname, of if test is true, just + decompress without writing and check the gzip trailer for integrity. If + inname is NULL or an empty string, read from stdin. If outname is NULL or + an empty string, write to stdout. strm is a pre-initialized inflateBack + structure. When appropriate, copy the file attributes from inname to + outname. + + gunzip() returns 1 if there is an out-of-memory error or an unexpected + return code from gunpipe(). Otherwise it returns 0. + */ +local int gunzip(z_stream *strm, char *inname, char *outname, int test) +{ + int ret; + int infile, outfile; + + /* open files */ + if (inname == NULL || *inname == 0) { + inname = "-"; + infile = 0; /* stdin */ + } + else { + infile = open(inname, O_RDONLY, 0); + if (infile == -1) { + fprintf(stderr, "gun cannot open %s\n", inname); + return 0; + } + } + if (test) + outfile = -1; + else if (outname == NULL || *outname == 0) { + outname = "-"; + outfile = 1; /* stdout */ + } + else { + outfile = open(outname, O_CREAT | O_TRUNC | O_WRONLY, 0666); + if (outfile == -1) { + close(infile); + fprintf(stderr, "gun cannot create %s\n", outname); + return 0; + } + } + errno = 0; + + /* decompress */ + ret = gunpipe(strm, infile, outfile); + if (outfile > 2) close(outfile); + if (infile > 2) close(infile); + + /* interpret result */ + switch (ret) { + case Z_OK: + case Z_ERRNO: + if (infile > 2 && outfile > 2) { + copymeta(inname, outname); /* copy attributes */ + unlink(inname); + } + if (ret == Z_ERRNO) + fprintf(stderr, "gun warning: trailing garbage ignored in %s\n", + inname); + break; + case Z_DATA_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun data error on %s: %s\n", inname, strm->msg); + break; + case Z_MEM_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + case Z_BUF_ERROR: + if (outfile > 2) unlink(outname); + if (strm->next_in != Z_NULL) { + fprintf(stderr, "gun write error on %s: %s\n", + outname, strerror(errno)); + } + else if (errno) { + fprintf(stderr, "gun read error on %s: %s\n", + inname, strerror(errno)); + } + else { + fprintf(stderr, "gun unexpected end of file on %s\n", + inname); + } + break; + default: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun internal error--aborting\n"); + return 1; + } + return 0; +} + +/* Process the gun command line arguments. See the command syntax near the + beginning of this source file. */ +int main(int argc, char **argv) +{ + int ret, len, test; + char *outname; + unsigned char *window; + z_stream strm; + + /* initialize inflateBack state for repeated use */ + window = match; /* reuse LZW match buffer */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = inflateBackInit(&strm, 15, window); + if (ret != Z_OK) { + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + } + + /* decompress each file to the same name with the suffix removed */ + argc--; + argv++; + test = 0; + if (argc && strcmp(*argv, "-h") == 0) { + fprintf(stderr, "gun 1.6 (17 Jan 2010)\n"); + fprintf(stderr, "Copyright (C) 2003-2010 Mark Adler\n"); + fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n"); + return 0; + } + if (argc && strcmp(*argv, "-t") == 0) { + test = 1; + argc--; + argv++; + } + if (argc) + do { + if (test) + outname = NULL; + else { + len = (int)strlen(*argv); + if (strcmp(*argv + len - 3, ".gz") == 0 || + strcmp(*argv + len - 3, "-gz") == 0) + len -= 3; + else if (strcmp(*argv + len - 2, ".z") == 0 || + strcmp(*argv + len - 2, "-z") == 0 || + strcmp(*argv + len - 2, "_z") == 0 || + strcmp(*argv + len - 2, ".Z") == 0) + len -= 2; + else { + fprintf(stderr, "gun error: no gz type on %s--skipping\n", + *argv); + continue; + } + outname = malloc(len + 1); + if (outname == NULL) { + fprintf(stderr, "gun out of memory error--aborting\n"); + ret = 1; + break; + } + memcpy(outname, *argv, len); + outname[len] = 0; + } + ret = gunzip(&strm, *argv, outname, test); + if (outname != NULL) free(outname); + if (ret) break; + } while (argv++, --argc); + else + ret = gunzip(&strm, NULL, NULL, test); + + /* clean up */ + inflateBackEnd(&strm); + return ret; +} diff --git a/deps/zlib-1.2.10/examples/gzappend.c b/deps/zlib-1.2.10/examples/gzappend.c new file mode 100644 index 0000000..662dec3 --- /dev/null +++ b/deps/zlib-1.2.10/examples/gzappend.c @@ -0,0 +1,504 @@ +/* gzappend -- command to append to a gzip file + + Copyright (C) 2003, 2012 Mark Adler, all rights reserved + version 1.2, 11 Oct 2012 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 19 Oct 2003 - First version + * 1.1 4 Nov 2003 - Expand and clarify some comments and notes + * - Add version and copyright to help + * - Send help to stdout instead of stderr + * - Add some preemptive typecasts + * - Add L to constants in lseek() calls + * - Remove some debugging information in error messages + * - Use new data_type definition for zlib 1.2.1 + * - Simplfy and unify file operations + * - Finish off gzip file in gztack() + * - Use deflatePrime() instead of adding empty blocks + * - Keep gzip file clean on appended file read errors + * - Use in-place rotate instead of auxiliary buffer + * (Why you ask? Because it was fun to write!) + * 1.2 11 Oct 2012 - Fix for proper z_const usage + * - Check for input buffer malloc failure + */ + +/* + gzappend takes a gzip file and appends to it, compressing files from the + command line or data from stdin. The gzip file is written to directly, to + avoid copying that file, in case it's large. Note that this results in the + unfriendly behavior that if gzappend fails, the gzip file is corrupted. + + This program was written to illustrate the use of the new Z_BLOCK option of + zlib 1.2.x's inflate() function. This option returns from inflate() at each + block boundary to facilitate locating and modifying the last block bit at + the start of the final deflate block. Also whether using Z_BLOCK or not, + another required feature of zlib 1.2.x is that inflate() now provides the + number of unusued bits in the last input byte used. gzappend will not work + with versions of zlib earlier than 1.2.1. + + gzappend first decompresses the gzip file internally, discarding all but + the last 32K of uncompressed data, and noting the location of the last block + bit and the number of unused bits in the last byte of the compressed data. + The gzip trailer containing the CRC-32 and length of the uncompressed data + is verified. This trailer will be later overwritten. + + Then the last block bit is cleared by seeking back in the file and rewriting + the byte that contains it. Seeking forward, the last byte of the compressed + data is saved along with the number of unused bits to initialize deflate. + + A deflate process is initialized, using the last 32K of the uncompressed + data from the gzip file to initialize the dictionary. If the total + uncompressed data was less than 32K, then all of it is used to initialize + the dictionary. The deflate output bit buffer is also initialized with the + last bits from the original deflate stream. From here on, the data to + append is simply compressed using deflate, and written to the gzip file. + When that is complete, the new CRC-32 and uncompressed length are written + as the trailer of the gzip file. + */ + +#include +#include +#include +#include +#include +#include "zlib.h" + +#define local static +#define LGCHUNK 14 +#define CHUNK (1U << LGCHUNK) +#define DSIZE 32768U + +/* print an error message and terminate with extreme prejudice */ +local void bye(char *msg1, char *msg2) +{ + fprintf(stderr, "gzappend error: %s%s\n", msg1, msg2); + exit(1); +} + +/* return the greatest common divisor of a and b using Euclid's algorithm, + modified to be fast when one argument much greater than the other, and + coded to avoid unnecessary swapping */ +local unsigned gcd(unsigned a, unsigned b) +{ + unsigned c; + + while (a && b) + if (a > b) { + c = b; + while (a - c >= c) + c <<= 1; + a -= c; + } + else { + c = a; + while (b - c >= c) + c <<= 1; + b -= c; + } + return a + b; +} + +/* rotate list[0..len-1] left by rot positions, in place */ +local void rotate(unsigned char *list, unsigned len, unsigned rot) +{ + unsigned char tmp; + unsigned cycles; + unsigned char *start, *last, *to, *from; + + /* normalize rot and handle degenerate cases */ + if (len < 2) return; + if (rot >= len) rot %= len; + if (rot == 0) return; + + /* pointer to last entry in list */ + last = list + (len - 1); + + /* do simple left shift by one */ + if (rot == 1) { + tmp = *list; + memcpy(list, list + 1, len - 1); + *last = tmp; + return; + } + + /* do simple right shift by one */ + if (rot == len - 1) { + tmp = *last; + memmove(list + 1, list, len - 1); + *list = tmp; + return; + } + + /* otherwise do rotate as a set of cycles in place */ + cycles = gcd(len, rot); /* number of cycles */ + do { + start = from = list + cycles; /* start index is arbitrary */ + tmp = *from; /* save entry to be overwritten */ + for (;;) { + to = from; /* next step in cycle */ + from += rot; /* go right rot positions */ + if (from > last) from -= len; /* (pointer better not wrap) */ + if (from == start) break; /* all but one shifted */ + *to = *from; /* shift left */ + } + *to = tmp; /* complete the circle */ + } while (--cycles); +} + +/* structure for gzip file read operations */ +typedef struct { + int fd; /* file descriptor */ + int size; /* 1 << size is bytes in buf */ + unsigned left; /* bytes available at next */ + unsigned char *buf; /* buffer */ + z_const unsigned char *next; /* next byte in buffer */ + char *name; /* file name for error messages */ +} file; + +/* reload buffer */ +local int readin(file *in) +{ + int len; + + len = read(in->fd, in->buf, 1 << in->size); + if (len == -1) bye("error reading ", in->name); + in->left = (unsigned)len; + in->next = in->buf; + return len; +} + +/* read from file in, exit if end-of-file */ +local int readmore(file *in) +{ + if (readin(in) == 0) bye("unexpected end of ", in->name); + return 0; +} + +#define read1(in) (in->left == 0 ? readmore(in) : 0, \ + in->left--, *(in->next)++) + +/* skip over n bytes of in */ +local void skip(file *in, unsigned n) +{ + unsigned bypass; + + if (n > in->left) { + n -= in->left; + bypass = n & ~((1U << in->size) - 1); + if (bypass) { + if (lseek(in->fd, (off_t)bypass, SEEK_CUR) == -1) + bye("seeking ", in->name); + n -= bypass; + } + readmore(in); + if (n > in->left) + bye("unexpected end of ", in->name); + } + in->left -= n; + in->next += n; +} + +/* read a four-byte unsigned integer, little-endian, from in */ +unsigned long read4(file *in) +{ + unsigned long val; + + val = read1(in); + val += (unsigned)read1(in) << 8; + val += (unsigned long)read1(in) << 16; + val += (unsigned long)read1(in) << 24; + return val; +} + +/* skip over gzip header */ +local void gzheader(file *in) +{ + int flags; + unsigned n; + + if (read1(in) != 31 || read1(in) != 139) bye(in->name, " not a gzip file"); + if (read1(in) != 8) bye("unknown compression method in", in->name); + flags = read1(in); + if (flags & 0xe0) bye("unknown header flags set in", in->name); + skip(in, 6); + if (flags & 4) { + n = read1(in); + n += (unsigned)(read1(in)) << 8; + skip(in, n); + } + if (flags & 8) while (read1(in) != 0) ; + if (flags & 16) while (read1(in) != 0) ; + if (flags & 2) skip(in, 2); +} + +/* decompress gzip file "name", return strm with a deflate stream ready to + continue compression of the data in the gzip file, and return a file + descriptor pointing to where to write the compressed data -- the deflate + stream is initialized to compress using level "level" */ +local int gzscan(char *name, z_stream *strm, int level) +{ + int ret, lastbit, left, full; + unsigned have; + unsigned long crc, tot; + unsigned char *window; + off_t lastoff, end; + file gz; + + /* open gzip file */ + gz.name = name; + gz.fd = open(name, O_RDWR, 0); + if (gz.fd == -1) bye("cannot open ", name); + gz.buf = malloc(CHUNK); + if (gz.buf == NULL) bye("out of memory", ""); + gz.size = LGCHUNK; + gz.left = 0; + + /* skip gzip header */ + gzheader(&gz); + + /* prepare to decompress */ + window = malloc(DSIZE); + if (window == NULL) bye("out of memory", ""); + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = inflateInit2(strm, -15); + if (ret != Z_OK) bye("out of memory", " or library mismatch"); + + /* decompress the deflate stream, saving append information */ + lastbit = 0; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + left = 0; + strm->avail_in = gz.left; + strm->next_in = gz.next; + crc = crc32(0L, Z_NULL, 0); + have = full = 0; + do { + /* if needed, get more input */ + if (strm->avail_in == 0) { + readmore(&gz); + strm->avail_in = gz.left; + strm->next_in = gz.next; + } + + /* set up output to next available section of sliding window */ + strm->avail_out = DSIZE - have; + strm->next_out = window + have; + + /* inflate and check for errors */ + ret = inflate(strm, Z_BLOCK); + if (ret == Z_STREAM_ERROR) bye("internal stream error!", ""); + if (ret == Z_MEM_ERROR) bye("out of memory", ""); + if (ret == Z_DATA_ERROR) + bye("invalid compressed data--format violated in", name); + + /* update crc and sliding window pointer */ + crc = crc32(crc, window + have, DSIZE - have - strm->avail_out); + if (strm->avail_out) + have = DSIZE - strm->avail_out; + else { + have = 0; + full = 1; + } + + /* process end of block */ + if (strm->data_type & 128) { + if (strm->data_type & 64) + left = strm->data_type & 0x1f; + else { + lastbit = strm->data_type & 0x1f; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - strm->avail_in; + } + } + } while (ret != Z_STREAM_END); + inflateEnd(strm); + gz.left = strm->avail_in; + gz.next = strm->next_in; + + /* save the location of the end of the compressed data */ + end = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + + /* check gzip trailer and save total for deflate */ + if (crc != read4(&gz)) + bye("invalid compressed data--crc mismatch in ", name); + tot = strm->total_out; + if ((tot & 0xffffffffUL) != read4(&gz)) + bye("invalid compressed data--length mismatch in", name); + + /* if not at end of file, warn */ + if (gz.left || readin(&gz)) + fprintf(stderr, + "gzappend warning: junk at end of gzip file overwritten\n"); + + /* clear last block bit */ + lseek(gz.fd, lastoff - (lastbit != 0), SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + *gz.buf = (unsigned char)(*gz.buf ^ (1 << ((8 - lastbit) & 7))); + lseek(gz.fd, -1L, SEEK_CUR); + if (write(gz.fd, gz.buf, 1) != 1) bye("writing after seek to ", name); + + /* if window wrapped, build dictionary from window by rotating */ + if (full) { + rotate(window, DSIZE, have); + have = DSIZE; + } + + /* set up deflate stream with window, crc, total_in, and leftover bits */ + ret = deflateInit2(strm, level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); + if (ret != Z_OK) bye("out of memory", ""); + deflateSetDictionary(strm, window, have); + strm->adler = crc; + strm->total_in = tot; + if (left) { + lseek(gz.fd, --end, SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + deflatePrime(strm, 8 - left, *gz.buf); + } + lseek(gz.fd, end, SEEK_SET); + + /* clean up and return */ + free(window); + free(gz.buf); + return gz.fd; +} + +/* append file "name" to gzip file gd using deflate stream strm -- if last + is true, then finish off the deflate stream at the end */ +local void gztack(char *name, int gd, z_stream *strm, int last) +{ + int fd, len, ret; + unsigned left; + unsigned char *in, *out; + + /* open file to compress and append */ + fd = 0; + if (name != NULL) { + fd = open(name, O_RDONLY, 0); + if (fd == -1) + fprintf(stderr, "gzappend warning: %s not found, skipping ...\n", + name); + } + + /* allocate buffers */ + in = malloc(CHUNK); + out = malloc(CHUNK); + if (in == NULL || out == NULL) bye("out of memory", ""); + + /* compress input file and append to gzip file */ + do { + /* get more input */ + len = read(fd, in, CHUNK); + if (len == -1) { + fprintf(stderr, + "gzappend warning: error reading %s, skipping rest ...\n", + name); + len = 0; + } + strm->avail_in = (unsigned)len; + strm->next_in = in; + if (len) strm->adler = crc32(strm->adler, in, (unsigned)len); + + /* compress and write all available output */ + do { + strm->avail_out = CHUNK; + strm->next_out = out; + ret = deflate(strm, last && len == 0 ? Z_FINISH : Z_NO_FLUSH); + left = CHUNK - strm->avail_out; + while (left) { + len = write(gd, out + CHUNK - strm->avail_out - left, left); + if (len == -1) bye("writing gzip file", ""); + left -= (unsigned)len; + } + } while (strm->avail_out == 0 && ret != Z_STREAM_END); + } while (len != 0); + + /* write trailer after last entry */ + if (last) { + deflateEnd(strm); + out[0] = (unsigned char)(strm->adler); + out[1] = (unsigned char)(strm->adler >> 8); + out[2] = (unsigned char)(strm->adler >> 16); + out[3] = (unsigned char)(strm->adler >> 24); + out[4] = (unsigned char)(strm->total_in); + out[5] = (unsigned char)(strm->total_in >> 8); + out[6] = (unsigned char)(strm->total_in >> 16); + out[7] = (unsigned char)(strm->total_in >> 24); + len = 8; + do { + ret = write(gd, out + 8 - len, len); + if (ret == -1) bye("writing gzip file", ""); + len -= ret; + } while (len); + close(gd); + } + + /* clean up and return */ + free(out); + free(in); + if (fd > 0) close(fd); +} + +/* process the compression level option if present, scan the gzip file, and + append the specified files, or append the data from stdin if no other file + names are provided on the command line -- the gzip file must be writable + and seekable */ +int main(int argc, char **argv) +{ + int gd, level; + z_stream strm; + + /* ignore command name */ + argc--; argv++; + + /* provide usage if no arguments */ + if (*argv == NULL) { + printf( + "gzappend 1.2 (11 Oct 2012) Copyright (C) 2003, 2012 Mark Adler\n" + ); + printf( + "usage: gzappend [-level] file.gz [ addthis [ andthis ... ]]\n"); + return 0; + } + + /* set compression level */ + level = Z_DEFAULT_COMPRESSION; + if (argv[0][0] == '-') { + if (argv[0][1] < '0' || argv[0][1] > '9' || argv[0][2] != 0) + bye("invalid compression level", ""); + level = argv[0][1] - '0'; + if (*++argv == NULL) bye("no gzip file name after options", ""); + } + + /* prepare to append to gzip file */ + gd = gzscan(*argv++, &strm, level); + + /* append files on command line, or from stdin if none */ + if (*argv == NULL) + gztack(NULL, gd, &strm, 1); + else + do { + gztack(*argv, gd, &strm, argv[1] == NULL); + } while (*++argv != NULL); + return 0; +} diff --git a/deps/zlib-1.2.10/examples/gzjoin.c b/deps/zlib-1.2.10/examples/gzjoin.c new file mode 100644 index 0000000..89e8098 --- /dev/null +++ b/deps/zlib-1.2.10/examples/gzjoin.c @@ -0,0 +1,449 @@ +/* gzjoin -- command to join gzip files into one gzip file + + Copyright (C) 2004, 2005, 2012 Mark Adler, all rights reserved + version 1.2, 14 Aug 2012 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 11 Dec 2004 - First version + * 1.1 12 Jun 2005 - Changed ssize_t to long for portability + * 1.2 14 Aug 2012 - Clean up for z_const usage + */ + +/* + gzjoin takes one or more gzip files on the command line and writes out a + single gzip file that will uncompress to the concatenation of the + uncompressed data from the individual gzip files. gzjoin does this without + having to recompress any of the data and without having to calculate a new + crc32 for the concatenated uncompressed data. gzjoin does however have to + decompress all of the input data in order to find the bits in the compressed + data that need to be modified to concatenate the streams. + + gzjoin does not do an integrity check on the input gzip files other than + checking the gzip header and decompressing the compressed data. They are + otherwise assumed to be complete and correct. + + Each joint between gzip files removes at least 18 bytes of previous trailer + and subsequent header, and inserts an average of about three bytes to the + compressed data in order to connect the streams. The output gzip file + has a minimal ten-byte gzip header with no file name or modification time. + + This program was written to illustrate the use of the Z_BLOCK option of + inflate() and the crc32_combine() function. gzjoin will not compile with + versions of zlib earlier than 1.2.3. + */ + +#include /* fputs(), fprintf(), fwrite(), putc() */ +#include /* exit(), malloc(), free() */ +#include /* open() */ +#include /* close(), read(), lseek() */ +#include "zlib.h" + /* crc32(), crc32_combine(), inflateInit2(), inflate(), inflateEnd() */ + +#define local static + +/* exit with an error (return a value to allow use in an expression) */ +local int bail(char *why1, char *why2) +{ + fprintf(stderr, "gzjoin error: %s%s, output incomplete\n", why1, why2); + exit(1); + return 0; +} + +/* -- simple buffered file input with access to the buffer -- */ + +#define CHUNK 32768 /* must be a power of two and fit in unsigned */ + +/* bin buffered input file type */ +typedef struct { + char *name; /* name of file for error messages */ + int fd; /* file descriptor */ + unsigned left; /* bytes remaining at next */ + unsigned char *next; /* next byte to read */ + unsigned char *buf; /* allocated buffer of length CHUNK */ +} bin; + +/* close a buffered file and free allocated memory */ +local void bclose(bin *in) +{ + if (in != NULL) { + if (in->fd != -1) + close(in->fd); + if (in->buf != NULL) + free(in->buf); + free(in); + } +} + +/* open a buffered file for input, return a pointer to type bin, or NULL on + failure */ +local bin *bopen(char *name) +{ + bin *in; + + in = malloc(sizeof(bin)); + if (in == NULL) + return NULL; + in->buf = malloc(CHUNK); + in->fd = open(name, O_RDONLY, 0); + if (in->buf == NULL || in->fd == -1) { + bclose(in); + return NULL; + } + in->left = 0; + in->next = in->buf; + in->name = name; + return in; +} + +/* load buffer from file, return -1 on read error, 0 or 1 on success, with + 1 indicating that end-of-file was reached */ +local int bload(bin *in) +{ + long len; + + if (in == NULL) + return -1; + if (in->left != 0) + return 0; + in->next = in->buf; + do { + len = (long)read(in->fd, in->buf + in->left, CHUNK - in->left); + if (len < 0) + return -1; + in->left += (unsigned)len; + } while (len != 0 && in->left < CHUNK); + return len == 0 ? 1 : 0; +} + +/* get a byte from the file, bail if end of file */ +#define bget(in) (in->left ? 0 : bload(in), \ + in->left ? (in->left--, *(in->next)++) : \ + bail("unexpected end of file on ", in->name)) + +/* get a four-byte little-endian unsigned integer from file */ +local unsigned long bget4(bin *in) +{ + unsigned long val; + + val = bget(in); + val += (unsigned long)(bget(in)) << 8; + val += (unsigned long)(bget(in)) << 16; + val += (unsigned long)(bget(in)) << 24; + return val; +} + +/* skip bytes in file */ +local void bskip(bin *in, unsigned skip) +{ + /* check pointer */ + if (in == NULL) + return; + + /* easy case -- skip bytes in buffer */ + if (skip <= in->left) { + in->left -= skip; + in->next += skip; + return; + } + + /* skip what's in buffer, discard buffer contents */ + skip -= in->left; + in->left = 0; + + /* seek past multiples of CHUNK bytes */ + if (skip > CHUNK) { + unsigned left; + + left = skip & (CHUNK - 1); + if (left == 0) { + /* exact number of chunks: seek all the way minus one byte to check + for end-of-file with a read */ + lseek(in->fd, skip - 1, SEEK_CUR); + if (read(in->fd, in->buf, 1) != 1) + bail("unexpected end of file on ", in->name); + return; + } + + /* skip the integral chunks, update skip with remainder */ + lseek(in->fd, skip - left, SEEK_CUR); + skip = left; + } + + /* read more input and skip remainder */ + bload(in); + if (skip > in->left) + bail("unexpected end of file on ", in->name); + in->left -= skip; + in->next += skip; +} + +/* -- end of buffered input functions -- */ + +/* skip the gzip header from file in */ +local void gzhead(bin *in) +{ + int flags; + + /* verify gzip magic header and compression method */ + if (bget(in) != 0x1f || bget(in) != 0x8b || bget(in) != 8) + bail(in->name, " is not a valid gzip file"); + + /* get and verify flags */ + flags = bget(in); + if ((flags & 0xe0) != 0) + bail("unknown reserved bits set in ", in->name); + + /* skip modification time, extra flags, and os */ + bskip(in, 6); + + /* skip extra field if present */ + if (flags & 4) { + unsigned len; + + len = bget(in); + len += (unsigned)(bget(in)) << 8; + bskip(in, len); + } + + /* skip file name if present */ + if (flags & 8) + while (bget(in) != 0) + ; + + /* skip comment if present */ + if (flags & 16) + while (bget(in) != 0) + ; + + /* skip header crc if present */ + if (flags & 2) + bskip(in, 2); +} + +/* write a four-byte little-endian unsigned integer to out */ +local void put4(unsigned long val, FILE *out) +{ + putc(val & 0xff, out); + putc((val >> 8) & 0xff, out); + putc((val >> 16) & 0xff, out); + putc((val >> 24) & 0xff, out); +} + +/* Load up zlib stream from buffered input, bail if end of file */ +local void zpull(z_streamp strm, bin *in) +{ + if (in->left == 0) + bload(in); + if (in->left == 0) + bail("unexpected end of file on ", in->name); + strm->avail_in = in->left; + strm->next_in = in->next; +} + +/* Write header for gzip file to out and initialize trailer. */ +local void gzinit(unsigned long *crc, unsigned long *tot, FILE *out) +{ + fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out); + *crc = crc32(0L, Z_NULL, 0); + *tot = 0; +} + +/* Copy the compressed data from name, zeroing the last block bit of the last + block if clr is true, and adding empty blocks as needed to get to a byte + boundary. If clr is false, then the last block becomes the last block of + the output, and the gzip trailer is written. crc and tot maintains the + crc and length (modulo 2^32) of the output for the trailer. The resulting + gzip file is written to out. gzinit() must be called before the first call + of gzcopy() to write the gzip header and to initialize crc and tot. */ +local void gzcopy(char *name, int clr, unsigned long *crc, unsigned long *tot, + FILE *out) +{ + int ret; /* return value from zlib functions */ + int pos; /* where the "last block" bit is in byte */ + int last; /* true if processing the last block */ + bin *in; /* buffered input file */ + unsigned char *start; /* start of compressed data in buffer */ + unsigned char *junk; /* buffer for uncompressed data -- discarded */ + z_off_t len; /* length of uncompressed data (support > 4 GB) */ + z_stream strm; /* zlib inflate stream */ + + /* open gzip file and skip header */ + in = bopen(name); + if (in == NULL) + bail("could not open ", name); + gzhead(in); + + /* allocate buffer for uncompressed data and initialize raw inflate + stream */ + junk = malloc(CHUNK); + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); + if (junk == NULL || ret != Z_OK) + bail("out of memory", ""); + + /* inflate and copy compressed data, clear last-block bit if requested */ + len = 0; + zpull(&strm, in); + start = in->next; + last = start[0] & 1; + if (last && clr) + start[0] &= ~1; + strm.avail_out = 0; + for (;;) { + /* if input used and output done, write used input and get more */ + if (strm.avail_in == 0 && strm.avail_out != 0) { + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + + /* decompress -- return early when end-of-block reached */ + strm.avail_out = CHUNK; + strm.next_out = junk; + ret = inflate(&strm, Z_BLOCK); + switch (ret) { + case Z_MEM_ERROR: + bail("out of memory", ""); + case Z_DATA_ERROR: + bail("invalid compressed data in ", in->name); + } + + /* update length of uncompressed data */ + len += CHUNK - strm.avail_out; + + /* check for block boundary (only get this when block copied out) */ + if (strm.data_type & 128) { + /* if that was the last block, then done */ + if (last) + break; + + /* number of unused bits in last byte */ + pos = strm.data_type & 7; + + /* find the next last-block bit */ + if (pos != 0) { + /* next last-block bit is in last used byte */ + pos = 0x100 >> pos; + last = strm.next_in[-1] & pos; + if (last && clr) + in->buf[strm.next_in - in->buf - 1] &= ~pos; + } + else { + /* next last-block bit is in next unused byte */ + if (strm.avail_in == 0) { + /* don't have that byte yet -- get it */ + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + last = strm.next_in[0] & 1; + if (last && clr) + in->buf[strm.next_in - in->buf] &= ~1; + } + } + } + + /* update buffer with unused input */ + in->left = strm.avail_in; + in->next = in->buf + (strm.next_in - in->buf); + + /* copy used input, write empty blocks to get to byte boundary */ + pos = strm.data_type & 7; + fwrite(start, 1, in->next - start - 1, out); + last = in->next[-1]; + if (pos == 0 || !clr) + /* already at byte boundary, or last file: write last byte */ + putc(last, out); + else { + /* append empty blocks to last byte */ + last &= ((0x100 >> pos) - 1); /* assure unused bits are zero */ + if (pos & 1) { + /* odd -- append an empty stored block */ + putc(last, out); + if (pos == 1) + putc(0, out); /* two more bits in block header */ + fwrite("\0\0\xff\xff", 1, 4, out); + } + else { + /* even -- append 1, 2, or 3 empty fixed blocks */ + switch (pos) { + case 6: + putc(last | 8, out); + last = 0; + case 4: + putc(last | 0x20, out); + last = 0; + case 2: + putc(last | 0x80, out); + putc(0, out); + } + } + } + + /* update crc and tot */ + *crc = crc32_combine(*crc, bget4(in), len); + *tot += (unsigned long)len; + + /* clean up */ + inflateEnd(&strm); + free(junk); + bclose(in); + + /* write trailer if this is the last gzip file */ + if (!clr) { + put4(*crc, out); + put4(*tot, out); + } +} + +/* join the gzip files on the command line, write result to stdout */ +int main(int argc, char **argv) +{ + unsigned long crc, tot; /* running crc and total uncompressed length */ + + /* skip command name */ + argc--; + argv++; + + /* show usage if no arguments */ + if (argc == 0) { + fputs("gzjoin usage: gzjoin f1.gz [f2.gz [f3.gz ...]] > fjoin.gz\n", + stderr); + return 0; + } + + /* join gzip files on command line and write to stdout */ + gzinit(&crc, &tot, stdout); + while (argc--) + gzcopy(*argv++, argc, &crc, &tot, stdout); + + /* done */ + return 0; +} diff --git a/deps/zlib-1.2.10/examples/gzlog.c b/deps/zlib-1.2.10/examples/gzlog.c new file mode 100644 index 0000000..b8c2927 --- /dev/null +++ b/deps/zlib-1.2.10/examples/gzlog.c @@ -0,0 +1,1059 @@ +/* + * gzlog.c + * Copyright (C) 2004, 2008, 2012, 2016 Mark Adler, all rights reserved + * For conditions of distribution and use, see copyright notice in gzlog.h + * version 2.2, 14 Aug 2012 + */ + +/* + gzlog provides a mechanism for frequently appending short strings to a gzip + file that is efficient both in execution time and compression ratio. The + strategy is to write the short strings in an uncompressed form to the end of + the gzip file, only compressing when the amount of uncompressed data has + reached a given threshold. + + gzlog also provides protection against interruptions in the process due to + system crashes. The status of the operation is recorded in an extra field + in the gzip file, and is only updated once the gzip file is brought to a + valid state. The last data to be appended or compressed is saved in an + auxiliary file, so that if the operation is interrupted, it can be completed + the next time an append operation is attempted. + + gzlog maintains another auxiliary file with the last 32K of data from the + compressed portion, which is preloaded for the compression of the subsequent + data. This minimizes the impact to the compression ratio of appending. + */ + +/* + Operations Concept: + + Files (log name "foo"): + foo.gz -- gzip file with the complete log + foo.add -- last message to append or last data to compress + foo.dict -- dictionary of the last 32K of data for next compression + foo.temp -- temporary dictionary file for compression after this one + foo.lock -- lock file for reading and writing the other files + foo.repairs -- log file for log file recovery operations (not compressed) + + gzip file structure: + - fixed-length (no file name) header with extra field (see below) + - compressed data ending initially with empty stored block + - uncompressed data filling out originally empty stored block and + subsequent stored blocks as needed (16K max each) + - gzip trailer + - no junk at end (no other gzip streams) + + When appending data, the information in the first three items above plus the + foo.add file are sufficient to recover an interrupted append operation. The + extra field has the necessary information to restore the start of the last + stored block and determine where to append the data in the foo.add file, as + well as the crc and length of the gzip data before the append operation. + + The foo.add file is created before the gzip file is marked for append, and + deleted after the gzip file is marked as complete. So if the append + operation is interrupted, the data to add will still be there. If due to + some external force, the foo.add file gets deleted between when the append + operation was interrupted and when recovery is attempted, the gzip file will + still be restored, but without the appended data. + + When compressing data, the information in the first two items above plus the + foo.add file are sufficient to recover an interrupted compress operation. + The extra field has the necessary information to find the end of the + compressed data, and contains both the crc and length of just the compressed + data and of the complete set of data including the contents of the foo.add + file. + + Again, the foo.add file is maintained during the compress operation in case + of an interruption. If in the unlikely event the foo.add file with the data + to be compressed is missing due to some external force, a gzip file with + just the previous compressed data will be reconstructed. In this case, all + of the data that was to be compressed is lost (approximately one megabyte). + This will not occur if all that happened was an interruption of the compress + operation. + + The third state that is marked is the replacement of the old dictionary with + the new dictionary after a compress operation. Once compression is + complete, the gzip file is marked as being in the replace state. This + completes the gzip file, so an interrupt after being so marked does not + result in recompression. Then the dictionary file is replaced, and the gzip + file is marked as completed. This state prevents the possibility of + restarting compression with the wrong dictionary file. + + All three operations are wrapped by a lock/unlock procedure. In order to + gain exclusive access to the log files, first a foo.lock file must be + exclusively created. When all operations are complete, the lock is + released by deleting the foo.lock file. If when attempting to create the + lock file, it already exists and the modify time of the lock file is more + than five minutes old (set by the PATIENCE define below), then the old + lock file is considered stale and deleted, and the exclusive creation of + the lock file is retried. To assure that there are no false assessments + of the staleness of the lock file, the operations periodically touch the + lock file to update the modified date. + + Following is the definition of the extra field with all of the information + required to enable the above append and compress operations and their + recovery if interrupted. Multi-byte values are stored little endian + (consistent with the gzip format). File pointers are eight bytes long. + The crc's and lengths for the gzip trailer are four bytes long. (Note that + the length at the end of a gzip file is used for error checking only, and + for large files is actually the length modulo 2^32.) The stored block + length is two bytes long. The gzip extra field two-byte identification is + "ap" for append. It is assumed that writing the extra field to the file is + an "atomic" operation. That is, either all of the extra field is written + to the file, or none of it is, if the operation is interrupted right at the + point of updating the extra field. This is a reasonable assumption, since + the extra field is within the first 52 bytes of the file, which is smaller + than any expected block size for a mass storage device (usually 512 bytes or + larger). + + Extra field (35 bytes): + - Pointer to first stored block length -- this points to the two-byte length + of the first stored block, which is followed by the two-byte, one's + complement of that length. The stored block length is preceded by the + three-bit header of the stored block, which is the actual start of the + stored block in the deflate format. See the bit offset field below. + - Pointer to the last stored block length. This is the same as above, but + for the last stored block of the uncompressed data in the gzip file. + Initially this is the same as the first stored block length pointer. + When the stored block gets to 16K (see the MAX_STORE define), then a new + stored block as added, at which point the last stored block length pointer + is different from the first stored block length pointer. When they are + different, the first bit of the last stored block header is eight bits, or + one byte back from the block length. + - Compressed data crc and length. This is the crc and length of the data + that is in the compressed portion of the deflate stream. These are used + only in the event that the foo.add file containing the data to compress is + lost after a compress operation is interrupted. + - Total data crc and length. This is the crc and length of all of the data + stored in the gzip file, compressed and uncompressed. It is used to + reconstruct the gzip trailer when compressing, as well as when recovering + interrupted operations. + - Final stored block length. This is used to quickly find where to append, + and allows the restoration of the original final stored block state when + an append operation is interrupted. + - First stored block start as the number of bits back from the final stored + block first length byte. This value is in the range of 3..10, and is + stored as the low three bits of the final byte of the extra field after + subtracting three (0..7). This allows the last-block bit of the stored + block header to be updated when a new stored block is added, for the case + when the first stored block and the last stored block are the same. (When + they are different, the numbers of bits back is known to be eight.) This + also allows for new compressed data to be appended to the old compressed + data in the compress operation, overwriting the previous first stored + block, or for the compressed data to be terminated and a valid gzip file + reconstructed on the off chance that a compression operation was + interrupted and the data to compress in the foo.add file was deleted. + - The operation in process. This is the next two bits in the last byte (the + bits under the mask 0x18). The are interpreted as 0: nothing in process, + 1: append in process, 2: compress in process, 3: replace in process. + - The top three bits of the last byte in the extra field are reserved and + are currently set to zero. + + Main procedure: + - Exclusively create the foo.lock file using the O_CREAT and O_EXCL modes of + the system open() call. If the modify time of an existing lock file is + more than PATIENCE seconds old, then the lock file is deleted and the + exclusive create is retried. + - Load the extra field from the foo.gz file, and see if an operation was in + progress but not completed. If so, apply the recovery procedure below. + - Perform the append procedure with the provided data. + - If the uncompressed data in the foo.gz file is 1MB or more, apply the + compress procedure. + - Delete the foo.lock file. + + Append procedure: + - Put what to append in the foo.add file so that the operation can be + restarted if this procedure is interrupted. + - Mark the foo.gz extra field with the append operation in progress. + + Restore the original last-block bit and stored block length of the last + stored block from the information in the extra field, in case a previous + append operation was interrupted. + - Append the provided data to the last stored block, creating new stored + blocks as needed and updating the stored blocks last-block bits and + lengths. + - Update the crc and length with the new data, and write the gzip trailer. + - Write over the extra field (with a single write operation) with the new + pointers, lengths, and crc's, and mark the gzip file as not in process. + Though there is still a foo.add file, it will be ignored since nothing + is in process. If a foo.add file is leftover from a previously + completed operation, it is truncated when writing new data to it. + - Delete the foo.add file. + + Compress and replace procedures: + - Read all of the uncompressed data in the stored blocks in foo.gz and write + it to foo.add. Also write foo.temp with the last 32K of that data to + provide a dictionary for the next invocation of this procedure. + - Rewrite the extra field marking foo.gz with a compression in process. + * If there is no data provided to compress (due to a missing foo.add file + when recovering), reconstruct and truncate the foo.gz file to contain + only the previous compressed data and proceed to the step after the next + one. Otherwise ... + - Compress the data with the dictionary in foo.dict, and write to the + foo.gz file starting at the bit immediately following the last previously + compressed block. If there is no foo.dict, proceed anyway with the + compression at slightly reduced efficiency. (For the foo.dict file to be + missing requires some external failure beyond simply the interruption of + a compress operation.) During this process, the foo.lock file is + periodically touched to assure that that file is not considered stale by + another process before we're done. The deflation is terminated with a + non-last empty static block (10 bits long), that is then located and + written over by a last-bit-set empty stored block. + - Append the crc and length of the data in the gzip file (previously + calculated during the append operations). + - Write over the extra field with the updated stored block offsets, bits + back, crc's, and lengths, and mark foo.gz as in process for a replacement + of the dictionary. + @ Delete the foo.add file. + - Replace foo.dict with foo.temp. + - Write over the extra field, marking foo.gz as complete. + + Recovery procedure: + - If not a replace recovery, read in the foo.add file, and provide that data + to the appropriate recovery below. If there is no foo.add file, provide + a zero data length to the recovery. In that case, the append recovery + restores the foo.gz to the previous compressed + uncompressed data state. + For the the compress recovery, a missing foo.add file results in foo.gz + being restored to the previous compressed-only data state. + - Append recovery: + - Pick up append at + step above + - Compress recovery: + - Pick up compress at * step above + - Replace recovery: + - Pick up compress at @ step above + - Log the repair with a date stamp in foo.repairs + */ + +#include +#include /* rename, fopen, fprintf, fclose */ +#include /* malloc, free */ +#include /* strlen, strrchr, strcpy, strncpy, strcmp */ +#include /* open */ +#include /* lseek, read, write, close, unlink, sleep, */ + /* ftruncate, fsync */ +#include /* errno */ +#include /* time, ctime */ +#include /* stat */ +#include /* utimes */ +#include "zlib.h" /* crc32 */ + +#include "gzlog.h" /* header for external access */ + +#define local static +typedef unsigned int uint; +typedef unsigned long ulong; + +/* Macro for debugging to deterministically force recovery operations */ +#ifdef GZLOG_DEBUG + #include /* longjmp */ + jmp_buf gzlog_jump; /* where to go back to */ + int gzlog_bail = 0; /* which point to bail at (1..8) */ + int gzlog_count = -1; /* number of times through to wait */ +# define BAIL(n) do { if (n == gzlog_bail && gzlog_count-- == 0) \ + longjmp(gzlog_jump, gzlog_bail); } while (0) +#else +# define BAIL(n) +#endif + +/* how old the lock file can be in seconds before considering it stale */ +#define PATIENCE 300 + +/* maximum stored block size in Kbytes -- must be in 1..63 */ +#define MAX_STORE 16 + +/* number of stored Kbytes to trigger compression (must be >= 32 to allow + dictionary construction, and <= 204 * MAX_STORE, in order for >> 10 to + discard the stored block headers contribution of five bytes each) */ +#define TRIGGER 1024 + +/* size of a deflate dictionary (this cannot be changed) */ +#define DICT 32768U + +/* values for the operation (2 bits) */ +#define NO_OP 0 +#define APPEND_OP 1 +#define COMPRESS_OP 2 +#define REPLACE_OP 3 + +/* macros to extract little-endian integers from an unsigned byte buffer */ +#define PULL2(p) ((p)[0]+((uint)((p)[1])<<8)) +#define PULL4(p) (PULL2(p)+((ulong)PULL2(p+2)<<16)) +#define PULL8(p) (PULL4(p)+((off_t)PULL4(p+4)<<32)) + +/* macros to store integers into a byte buffer in little-endian order */ +#define PUT2(p,a) do {(p)[0]=a;(p)[1]=(a)>>8;} while(0) +#define PUT4(p,a) do {PUT2(p,a);PUT2(p+2,a>>16);} while(0) +#define PUT8(p,a) do {PUT4(p,a);PUT4(p+4,a>>32);} while(0) + +/* internal structure for log information */ +#define LOGID "\106\035\172" /* should be three non-zero characters */ +struct log { + char id[4]; /* contains LOGID to detect inadvertent overwrites */ + int fd; /* file descriptor for .gz file, opened read/write */ + char *path; /* allocated path, e.g. "/var/log/foo" or "foo" */ + char *end; /* end of path, for appending suffices such as ".gz" */ + off_t first; /* offset of first stored block first length byte */ + int back; /* location of first block id in bits back from first */ + uint stored; /* bytes currently in last stored block */ + off_t last; /* offset of last stored block first length byte */ + ulong ccrc; /* crc of compressed data */ + ulong clen; /* length (modulo 2^32) of compressed data */ + ulong tcrc; /* crc of total data */ + ulong tlen; /* length (modulo 2^32) of total data */ + time_t lock; /* last modify time of our lock file */ +}; + +/* gzip header for gzlog */ +local unsigned char log_gzhead[] = { + 0x1f, 0x8b, /* magic gzip id */ + 8, /* compression method is deflate */ + 4, /* there is an extra field (no file name) */ + 0, 0, 0, 0, /* no modification time provided */ + 0, 0xff, /* no extra flags, no OS specified */ + 39, 0, 'a', 'p', 35, 0 /* extra field with "ap" subfield */ + /* 35 is EXTRA, 39 is EXTRA + 4 */ +}; + +#define HEAD sizeof(log_gzhead) /* should be 16 */ + +/* initial gzip extra field content (52 == HEAD + EXTRA + 1) */ +local unsigned char log_gzext[] = { + 52, 0, 0, 0, 0, 0, 0, 0, /* offset of first stored block length */ + 52, 0, 0, 0, 0, 0, 0, 0, /* offset of last stored block length */ + 0, 0, 0, 0, 0, 0, 0, 0, /* compressed data crc and length */ + 0, 0, 0, 0, 0, 0, 0, 0, /* total data crc and length */ + 0, 0, /* final stored block data length */ + 5 /* op is NO_OP, last bit 8 bits back */ +}; + +#define EXTRA sizeof(log_gzext) /* should be 35 */ + +/* initial gzip data and trailer */ +local unsigned char log_gzbody[] = { + 1, 0, 0, 0xff, 0xff, /* empty stored block (last) */ + 0, 0, 0, 0, /* crc */ + 0, 0, 0, 0 /* uncompressed length */ +}; + +#define BODY sizeof(log_gzbody) + +/* Exclusively create foo.lock in order to negotiate exclusive access to the + foo.* files. If the modify time of an existing lock file is greater than + PATIENCE seconds in the past, then consider the lock file to have been + abandoned, delete it, and try the exclusive create again. Save the lock + file modify time for verification of ownership. Return 0 on success, or -1 + on failure, usually due to an access restriction or invalid path. Note that + if stat() or unlink() fails, it may be due to another process noticing the + abandoned lock file a smidge sooner and deleting it, so those are not + flagged as an error. */ +local int log_lock(struct log *log) +{ + int fd; + struct stat st; + + strcpy(log->end, ".lock"); + while ((fd = open(log->path, O_CREAT | O_EXCL, 0644)) < 0) { + if (errno != EEXIST) + return -1; + if (stat(log->path, &st) == 0 && time(NULL) - st.st_mtime > PATIENCE) { + unlink(log->path); + continue; + } + sleep(2); /* relinquish the CPU for two seconds while waiting */ + } + close(fd); + if (stat(log->path, &st) == 0) + log->lock = st.st_mtime; + return 0; +} + +/* Update the modify time of the lock file to now, in order to prevent another + task from thinking that the lock is stale. Save the lock file modify time + for verification of ownership. */ +local void log_touch(struct log *log) +{ + struct stat st; + + strcpy(log->end, ".lock"); + utimes(log->path, NULL); + if (stat(log->path, &st) == 0) + log->lock = st.st_mtime; +} + +/* Check the log file modify time against what is expected. Return true if + this is not our lock. If it is our lock, touch it to keep it. */ +local int log_check(struct log *log) +{ + struct stat st; + + strcpy(log->end, ".lock"); + if (stat(log->path, &st) || st.st_mtime != log->lock) + return 1; + log_touch(log); + return 0; +} + +/* Unlock a previously acquired lock, but only if it's ours. */ +local void log_unlock(struct log *log) +{ + if (log_check(log)) + return; + strcpy(log->end, ".lock"); + unlink(log->path); + log->lock = 0; +} + +/* Check the gzip header and read in the extra field, filling in the values in + the log structure. Return op on success or -1 if the gzip header was not as + expected. op is the current operation in progress last written to the extra + field. This assumes that the gzip file has already been opened, with the + file descriptor log->fd. */ +local int log_head(struct log *log) +{ + int op; + unsigned char buf[HEAD + EXTRA]; + + if (lseek(log->fd, 0, SEEK_SET) < 0 || + read(log->fd, buf, HEAD + EXTRA) != HEAD + EXTRA || + memcmp(buf, log_gzhead, HEAD)) { + return -1; + } + log->first = PULL8(buf + HEAD); + log->last = PULL8(buf + HEAD + 8); + log->ccrc = PULL4(buf + HEAD + 16); + log->clen = PULL4(buf + HEAD + 20); + log->tcrc = PULL4(buf + HEAD + 24); + log->tlen = PULL4(buf + HEAD + 28); + log->stored = PULL2(buf + HEAD + 32); + log->back = 3 + (buf[HEAD + 34] & 7); + op = (buf[HEAD + 34] >> 3) & 3; + return op; +} + +/* Write over the extra field contents, marking the operation as op. Use fsync + to assure that the device is written to, and in the requested order. This + operation, and only this operation, is assumed to be atomic in order to + assure that the log is recoverable in the event of an interruption at any + point in the process. Return -1 if the write to foo.gz failed. */ +local int log_mark(struct log *log, int op) +{ + int ret; + unsigned char ext[EXTRA]; + + PUT8(ext, log->first); + PUT8(ext + 8, log->last); + PUT4(ext + 16, log->ccrc); + PUT4(ext + 20, log->clen); + PUT4(ext + 24, log->tcrc); + PUT4(ext + 28, log->tlen); + PUT2(ext + 32, log->stored); + ext[34] = log->back - 3 + (op << 3); + fsync(log->fd); + ret = lseek(log->fd, HEAD, SEEK_SET) < 0 || + write(log->fd, ext, EXTRA) != EXTRA ? -1 : 0; + fsync(log->fd); + return ret; +} + +/* Rewrite the last block header bits and subsequent zero bits to get to a byte + boundary, setting the last block bit if last is true, and then write the + remainder of the stored block header (length and one's complement). Leave + the file pointer after the end of the last stored block data. Return -1 if + there is a read or write failure on the foo.gz file */ +local int log_last(struct log *log, int last) +{ + int back, len, mask; + unsigned char buf[6]; + + /* determine the locations of the bytes and bits to modify */ + back = log->last == log->first ? log->back : 8; + len = back > 8 ? 2 : 1; /* bytes back from log->last */ + mask = 0x80 >> ((back - 1) & 7); /* mask for block last-bit */ + + /* get the byte to modify (one or two back) into buf[0] -- don't need to + read the byte if the last-bit is eight bits back, since in that case + the entire byte will be modified */ + buf[0] = 0; + if (back != 8 && (lseek(log->fd, log->last - len, SEEK_SET) < 0 || + read(log->fd, buf, 1) != 1)) + return -1; + + /* change the last-bit of the last stored block as requested -- note + that all bits above the last-bit are set to zero, per the type bits + of a stored block being 00 and per the convention that the bits to + bring the stream to a byte boundary are also zeros */ + buf[1] = 0; + buf[2 - len] = (*buf & (mask - 1)) + (last ? mask : 0); + + /* write the modified stored block header and lengths, move the file + pointer to after the last stored block data */ + PUT2(buf + 2, log->stored); + PUT2(buf + 4, log->stored ^ 0xffff); + return lseek(log->fd, log->last - len, SEEK_SET) < 0 || + write(log->fd, buf + 2 - len, len + 4) != len + 4 || + lseek(log->fd, log->stored, SEEK_CUR) < 0 ? -1 : 0; +} + +/* Append len bytes from data to the locked and open log file. len may be zero + if recovering and no .add file was found. In that case, the previous state + of the foo.gz file is restored. The data is appended uncompressed in + deflate stored blocks. Return -1 if there was an error reading or writing + the foo.gz file. */ +local int log_append(struct log *log, unsigned char *data, size_t len) +{ + uint put; + off_t end; + unsigned char buf[8]; + + /* set the last block last-bit and length, in case recovering an + interrupted append, then position the file pointer to append to the + block */ + if (log_last(log, 1)) + return -1; + + /* append, adding stored blocks and updating the offset of the last stored + block as needed, and update the total crc and length */ + while (len) { + /* append as much as we can to the last block */ + put = (MAX_STORE << 10) - log->stored; + if (put > len) + put = (uint)len; + if (put) { + if (write(log->fd, data, put) != put) + return -1; + BAIL(1); + log->tcrc = crc32(log->tcrc, data, put); + log->tlen += put; + log->stored += put; + data += put; + len -= put; + } + + /* if we need to, add a new empty stored block */ + if (len) { + /* mark current block as not last */ + if (log_last(log, 0)) + return -1; + + /* point to new, empty stored block */ + log->last += 4 + log->stored + 1; + log->stored = 0; + } + + /* mark last block as last, update its length */ + if (log_last(log, 1)) + return -1; + BAIL(2); + } + + /* write the new crc and length trailer, and truncate just in case (could + be recovering from partial append with a missing foo.add file) */ + PUT4(buf, log->tcrc); + PUT4(buf + 4, log->tlen); + if (write(log->fd, buf, 8) != 8 || + (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end)) + return -1; + + /* write the extra field, marking the log file as done, delete .add file */ + if (log_mark(log, NO_OP)) + return -1; + strcpy(log->end, ".add"); + unlink(log->path); /* ignore error, since may not exist */ + return 0; +} + +/* Replace the foo.dict file with the foo.temp file. Also delete the foo.add + file, since the compress operation may have been interrupted before that was + done. Returns 1 if memory could not be allocated, or -1 if reading or + writing foo.gz fails, or if the rename fails for some reason other than + foo.temp not existing. foo.temp not existing is a permitted error, since + the replace operation may have been interrupted after the rename is done, + but before foo.gz is marked as complete. */ +local int log_replace(struct log *log) +{ + int ret; + char *dest; + + /* delete foo.add file */ + strcpy(log->end, ".add"); + unlink(log->path); /* ignore error, since may not exist */ + BAIL(3); + + /* rename foo.name to foo.dict, replacing foo.dict if it exists */ + strcpy(log->end, ".dict"); + dest = malloc(strlen(log->path) + 1); + if (dest == NULL) + return -2; + strcpy(dest, log->path); + strcpy(log->end, ".temp"); + ret = rename(log->path, dest); + free(dest); + if (ret && errno != ENOENT) + return -1; + BAIL(4); + + /* mark the foo.gz file as done */ + return log_mark(log, NO_OP); +} + +/* Compress the len bytes at data and append the compressed data to the + foo.gz deflate data immediately after the previous compressed data. This + overwrites the previous uncompressed data, which was stored in foo.add + and is the data provided in data[0..len-1]. If this operation is + interrupted, it picks up at the start of this routine, with the foo.add + file read in again. If there is no data to compress (len == 0), then we + simply terminate the foo.gz file after the previously compressed data, + appending a final empty stored block and the gzip trailer. Return -1 if + reading or writing the log.gz file failed, or -2 if there was a memory + allocation failure. */ +local int log_compress(struct log *log, unsigned char *data, size_t len) +{ + int fd; + uint got, max; + ssize_t dict; + off_t end; + z_stream strm; + unsigned char buf[DICT]; + + /* compress and append compressed data */ + if (len) { + /* set up for deflate, allocating memory */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + if (deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -15, 8, + Z_DEFAULT_STRATEGY) != Z_OK) + return -2; + + /* read in dictionary (last 32K of data that was compressed) */ + strcpy(log->end, ".dict"); + fd = open(log->path, O_RDONLY, 0); + if (fd >= 0) { + dict = read(fd, buf, DICT); + close(fd); + if (dict < 0) { + deflateEnd(&strm); + return -1; + } + if (dict) + deflateSetDictionary(&strm, buf, (uint)dict); + } + log_touch(log); + + /* prime deflate with last bits of previous block, position write + pointer to write those bits and overwrite what follows */ + if (lseek(log->fd, log->first - (log->back > 8 ? 2 : 1), + SEEK_SET) < 0 || + read(log->fd, buf, 1) != 1 || lseek(log->fd, -1, SEEK_CUR) < 0) { + deflateEnd(&strm); + return -1; + } + deflatePrime(&strm, (8 - log->back) & 7, *buf); + + /* compress, finishing with a partial non-last empty static block */ + strm.next_in = data; + max = (((uint)0 - 1) >> 1) + 1; /* in case int smaller than size_t */ + do { + strm.avail_in = len > max ? max : (uint)len; + len -= strm.avail_in; + do { + strm.avail_out = DICT; + strm.next_out = buf; + deflate(&strm, len ? Z_NO_FLUSH : Z_PARTIAL_FLUSH); + got = DICT - strm.avail_out; + if (got && write(log->fd, buf, got) != got) { + deflateEnd(&strm); + return -1; + } + log_touch(log); + } while (strm.avail_out == 0); + } while (len); + deflateEnd(&strm); + BAIL(5); + + /* find start of empty static block -- scanning backwards the first one + bit is the second bit of the block, if the last byte is zero, then + we know the byte before that has a one in the top bit, since an + empty static block is ten bits long */ + if ((log->first = lseek(log->fd, -1, SEEK_CUR)) < 0 || + read(log->fd, buf, 1) != 1) + return -1; + log->first++; + if (*buf) { + log->back = 1; + while ((*buf & ((uint)1 << (8 - log->back++))) == 0) + ; /* guaranteed to terminate, since *buf != 0 */ + } + else + log->back = 10; + + /* update compressed crc and length */ + log->ccrc = log->tcrc; + log->clen = log->tlen; + } + else { + /* no data to compress -- fix up existing gzip stream */ + log->tcrc = log->ccrc; + log->tlen = log->clen; + } + + /* complete and truncate gzip stream */ + log->last = log->first; + log->stored = 0; + PUT4(buf, log->tcrc); + PUT4(buf + 4, log->tlen); + if (log_last(log, 1) || write(log->fd, buf, 8) != 8 || + (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end)) + return -1; + BAIL(6); + + /* mark as being in the replace operation */ + if (log_mark(log, REPLACE_OP)) + return -1; + + /* execute the replace operation and mark the file as done */ + return log_replace(log); +} + +/* log a repair record to the .repairs file */ +local void log_log(struct log *log, int op, char *record) +{ + time_t now; + FILE *rec; + + now = time(NULL); + strcpy(log->end, ".repairs"); + rec = fopen(log->path, "a"); + if (rec == NULL) + return; + fprintf(rec, "%.24s %s recovery: %s\n", ctime(&now), op == APPEND_OP ? + "append" : (op == COMPRESS_OP ? "compress" : "replace"), record); + fclose(rec); + return; +} + +/* Recover the interrupted operation op. First read foo.add for recovering an + append or compress operation. Return -1 if there was an error reading or + writing foo.gz or reading an existing foo.add, or -2 if there was a memory + allocation failure. */ +local int log_recover(struct log *log, int op) +{ + int fd, ret = 0; + unsigned char *data = NULL; + size_t len = 0; + struct stat st; + + /* log recovery */ + log_log(log, op, "start"); + + /* load foo.add file if expected and present */ + if (op == APPEND_OP || op == COMPRESS_OP) { + strcpy(log->end, ".add"); + if (stat(log->path, &st) == 0 && st.st_size) { + len = (size_t)(st.st_size); + if ((off_t)len != st.st_size || + (data = malloc(st.st_size)) == NULL) { + log_log(log, op, "allocation failure"); + return -2; + } + if ((fd = open(log->path, O_RDONLY, 0)) < 0) { + log_log(log, op, ".add file read failure"); + return -1; + } + ret = (size_t)read(fd, data, len) != len; + close(fd); + if (ret) { + log_log(log, op, ".add file read failure"); + return -1; + } + log_log(log, op, "loaded .add file"); + } + else + log_log(log, op, "missing .add file!"); + } + + /* recover the interrupted operation */ + switch (op) { + case APPEND_OP: + ret = log_append(log, data, len); + break; + case COMPRESS_OP: + ret = log_compress(log, data, len); + break; + case REPLACE_OP: + ret = log_replace(log); + } + + /* log status */ + log_log(log, op, ret ? "failure" : "complete"); + + /* clean up */ + if (data != NULL) + free(data); + return ret; +} + +/* Close the foo.gz file (if open) and release the lock. */ +local void log_close(struct log *log) +{ + if (log->fd >= 0) + close(log->fd); + log->fd = -1; + log_unlock(log); +} + +/* Open foo.gz, verify the header, and load the extra field contents, after + first creating the foo.lock file to gain exclusive access to the foo.* + files. If foo.gz does not exist or is empty, then write the initial header, + extra, and body content of an empty foo.gz log file. If there is an error + creating the lock file due to access restrictions, or an error reading or + writing the foo.gz file, or if the foo.gz file is not a proper log file for + this object (e.g. not a gzip file or does not contain the expected extra + field), then return true. If there is an error, the lock is released. + Otherwise, the lock is left in place. */ +local int log_open(struct log *log) +{ + int op; + + /* release open file resource if left over -- can occur if lock lost + between gzlog_open() and gzlog_write() */ + if (log->fd >= 0) + close(log->fd); + log->fd = -1; + + /* negotiate exclusive access */ + if (log_lock(log) < 0) + return -1; + + /* open the log file, foo.gz */ + strcpy(log->end, ".gz"); + log->fd = open(log->path, O_RDWR | O_CREAT, 0644); + if (log->fd < 0) { + log_close(log); + return -1; + } + + /* if new, initialize foo.gz with an empty log, delete old dictionary */ + if (lseek(log->fd, 0, SEEK_END) == 0) { + if (write(log->fd, log_gzhead, HEAD) != HEAD || + write(log->fd, log_gzext, EXTRA) != EXTRA || + write(log->fd, log_gzbody, BODY) != BODY) { + log_close(log); + return -1; + } + strcpy(log->end, ".dict"); + unlink(log->path); + } + + /* verify log file and load extra field information */ + if ((op = log_head(log)) < 0) { + log_close(log); + return -1; + } + + /* check for interrupted process and if so, recover */ + if (op != NO_OP && log_recover(log, op)) { + log_close(log); + return -1; + } + + /* touch the lock file to prevent another process from grabbing it */ + log_touch(log); + return 0; +} + +/* See gzlog.h for the description of the external methods below */ +gzlog *gzlog_open(char *path) +{ + size_t n; + struct log *log; + + /* check arguments */ + if (path == NULL || *path == 0) + return NULL; + + /* allocate and initialize log structure */ + log = malloc(sizeof(struct log)); + if (log == NULL) + return NULL; + strcpy(log->id, LOGID); + log->fd = -1; + + /* save path and end of path for name construction */ + n = strlen(path); + log->path = malloc(n + 9); /* allow for ".repairs" */ + if (log->path == NULL) { + free(log); + return NULL; + } + strcpy(log->path, path); + log->end = log->path + n; + + /* gain exclusive access and verify log file -- may perform a + recovery operation if needed */ + if (log_open(log)) { + free(log->path); + free(log); + return NULL; + } + + /* return pointer to log structure */ + return log; +} + +/* gzlog_compress() return values: + 0: all good + -1: file i/o error (usually access issue) + -2: memory allocation failure + -3: invalid log pointer argument */ +int gzlog_compress(gzlog *logd) +{ + int fd, ret; + uint block; + size_t len, next; + unsigned char *data, buf[5]; + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + + /* see if we lost the lock -- if so get it again and reload the extra + field information (it probably changed), recover last operation if + necessary */ + if (log_check(log) && log_open(log)) + return -1; + + /* create space for uncompressed data */ + len = ((size_t)(log->last - log->first) & ~(((size_t)1 << 10) - 1)) + + log->stored; + if ((data = malloc(len)) == NULL) + return -2; + + /* do statement here is just a cheap trick for error handling */ + do { + /* read in the uncompressed data */ + if (lseek(log->fd, log->first - 1, SEEK_SET) < 0) + break; + next = 0; + while (next < len) { + if (read(log->fd, buf, 5) != 5) + break; + block = PULL2(buf + 1); + if (next + block > len || + read(log->fd, (char *)data + next, block) != block) + break; + next += block; + } + if (lseek(log->fd, 0, SEEK_CUR) != log->last + 4 + log->stored) + break; + log_touch(log); + + /* write the uncompressed data to the .add file */ + strcpy(log->end, ".add"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + break; + ret = (size_t)write(fd, data, len) != len; + if (ret | close(fd)) + break; + log_touch(log); + + /* write the dictionary for the next compress to the .temp file */ + strcpy(log->end, ".temp"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + break; + next = DICT > len ? len : DICT; + ret = (size_t)write(fd, (char *)data + len - next, next) != next; + if (ret | close(fd)) + break; + log_touch(log); + + /* roll back to compressed data, mark the compress in progress */ + log->last = log->first; + log->stored = 0; + if (log_mark(log, COMPRESS_OP)) + break; + BAIL(7); + + /* compress and append the data (clears mark) */ + ret = log_compress(log, data, len); + free(data); + return ret; + } while (0); + + /* broke out of do above on i/o error */ + free(data); + return -1; +} + +/* gzlog_write() return values: + 0: all good + -1: file i/o error (usually access issue) + -2: memory allocation failure + -3: invalid log pointer argument */ +int gzlog_write(gzlog *logd, void *data, size_t len) +{ + int fd, ret; + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + if (data == NULL || len <= 0) + return 0; + + /* see if we lost the lock -- if so get it again and reload the extra + field information (it probably changed), recover last operation if + necessary */ + if (log_check(log) && log_open(log)) + return -1; + + /* create and write .add file */ + strcpy(log->end, ".add"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + return -1; + ret = (size_t)write(fd, data, len) != len; + if (ret | close(fd)) + return -1; + log_touch(log); + + /* mark log file with append in progress */ + if (log_mark(log, APPEND_OP)) + return -1; + BAIL(8); + + /* append data (clears mark) */ + if (log_append(log, data, len)) + return -1; + + /* check to see if it's time to compress -- if not, then done */ + if (((log->last - log->first) >> 10) + (log->stored >> 10) < TRIGGER) + return 0; + + /* time to compress */ + return gzlog_compress(log); +} + +/* gzlog_close() return values: + 0: ok + -3: invalid log pointer argument */ +int gzlog_close(gzlog *logd) +{ + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + + /* close the log file and release the lock */ + log_close(log); + + /* free structure and return */ + if (log->path != NULL) + free(log->path); + strcpy(log->id, "bad"); + free(log); + return 0; +} diff --git a/deps/zlib-1.2.10/examples/gzlog.h b/deps/zlib-1.2.10/examples/gzlog.h new file mode 100644 index 0000000..86f0cec --- /dev/null +++ b/deps/zlib-1.2.10/examples/gzlog.h @@ -0,0 +1,91 @@ +/* gzlog.h + Copyright (C) 2004, 2008, 2012 Mark Adler, all rights reserved + version 2.2, 14 Aug 2012 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* Version History: + 1.0 26 Nov 2004 First version + 2.0 25 Apr 2008 Complete redesign for recovery of interrupted operations + Interface changed slightly in that now path is a prefix + Compression now occurs as needed during gzlog_write() + gzlog_write() now always leaves the log file as valid gzip + 2.1 8 Jul 2012 Fix argument checks in gzlog_compress() and gzlog_write() + 2.2 14 Aug 2012 Clean up signed comparisons + */ + +/* + The gzlog object allows writing short messages to a gzipped log file, + opening the log file locked for small bursts, and then closing it. The log + object works by appending stored (uncompressed) data to the gzip file until + 1 MB has been accumulated. At that time, the stored data is compressed, and + replaces the uncompressed data in the file. The log file is truncated to + its new size at that time. After each write operation, the log file is a + valid gzip file that can decompressed to recover what was written. + + The gzlog operations can be interupted at any point due to an application or + system crash, and the log file will be recovered the next time the log is + opened with gzlog_open(). + */ + +#ifndef GZLOG_H +#define GZLOG_H + +/* gzlog object type */ +typedef void gzlog; + +/* Open a gzlog object, creating the log file if it does not exist. Return + NULL on error. Note that gzlog_open() could take a while to complete if it + has to wait to verify that a lock is stale (possibly for five minutes), or + if there is significant contention with other instantiations of this object + when locking the resource. path is the prefix of the file names created by + this object. If path is "foo", then the log file will be "foo.gz", and + other auxiliary files will be created and destroyed during the process: + "foo.dict" for a compression dictionary, "foo.temp" for a temporary (next) + dictionary, "foo.add" for data being added or compressed, "foo.lock" for the + lock file, and "foo.repairs" to log recovery operations performed due to + interrupted gzlog operations. A gzlog_open() followed by a gzlog_close() + will recover a previously interrupted operation, if any. */ +gzlog *gzlog_open(char *path); + +/* Write to a gzlog object. Return zero on success, -1 if there is a file i/o + error on any of the gzlog files (this should not happen if gzlog_open() + succeeded, unless the device has run out of space or leftover auxiliary + files have permissions or ownership that prevent their use), -2 if there is + a memory allocation failure, or -3 if the log argument is invalid (e.g. if + it was not created by gzlog_open()). This function will write data to the + file uncompressed, until 1 MB has been accumulated, at which time that data + will be compressed. The log file will be a valid gzip file upon successful + return. */ +int gzlog_write(gzlog *log, void *data, size_t len); + +/* Force compression of any uncompressed data in the log. This should be used + sparingly, if at all. The main application would be when a log file will + not be appended to again. If this is used to compress frequently while + appending, it will both significantly increase the execution time and + reduce the compression ratio. The return codes are the same as for + gzlog_write(). */ +int gzlog_compress(gzlog *log); + +/* Close a gzlog object. Return zero on success, -3 if the log argument is + invalid. The log object is freed, and so cannot be referenced again. */ +int gzlog_close(gzlog *log); + +#endif diff --git a/deps/zlib-1.2.10/examples/zlib_how.html b/deps/zlib-1.2.10/examples/zlib_how.html new file mode 100644 index 0000000..444ff1c --- /dev/null +++ b/deps/zlib-1.2.10/examples/zlib_how.html @@ -0,0 +1,545 @@ + + + + +zlib Usage Example + + + +

zlib Usage Example

+We often get questions about how the deflate() and inflate() functions should be used. +Users wonder when they should provide more input, when they should use more output, +what to do with a Z_BUF_ERROR, how to make sure the process terminates properly, and +so on. So for those who have read zlib.h (a few times), and +would like further edification, below is an annotated example in C of simple routines to compress and decompress +from an input file to an output file using deflate() and inflate() respectively. The +annotations are interspersed between lines of the code. So please read between the lines. +We hope this helps explain some of the intricacies of zlib. +

+Without further adieu, here is the program zpipe.c: +


+/* zpipe.c: example of proper use of zlib's inflate() and deflate()
+   Not copyrighted -- provided to the public domain
+   Version 1.4  11 December 2005  Mark Adler */
+
+/* Version history:
+   1.0  30 Oct 2004  First version
+   1.1   8 Nov 2004  Add void casting for unused return values
+                     Use switch statement for inflate() return values
+   1.2   9 Nov 2004  Add assertions to document zlib guarantees
+   1.3   6 Apr 2005  Remove incorrect assertion in inf()
+   1.4  11 Dec 2005  Add hack to avoid MSDOS end-of-line conversions
+                     Avoid some compiler warnings for input and output buffers
+ */
+
+We now include the header files for the required definitions. From +stdio.h we use fopen(), fread(), fwrite(), +feof(), ferror(), and fclose() for file i/o, and +fputs() for error messages. From string.h we use +strcmp() for command line argument processing. +From assert.h we use the assert() macro. +From zlib.h +we use the basic compression functions deflateInit(), +deflate(), and deflateEnd(), and the basic decompression +functions inflateInit(), inflate(), and +inflateEnd(). +

+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include "zlib.h"
+
+This is an ugly hack required to avoid corruption of the input and output data on +Windows/MS-DOS systems. Without this, those systems would assume that the input and output +files are text, and try to convert the end-of-line characters from one standard to +another. That would corrupt binary data, and in particular would render the compressed data unusable. +This sets the input and output to binary which suppresses the end-of-line conversions. +SET_BINARY_MODE() will be used later on stdin and stdout, at the beginning of main(). +

+#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
+#  include <fcntl.h>
+#  include <io.h>
+#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+#  define SET_BINARY_MODE(file)
+#endif
+
+CHUNK is simply the buffer size for feeding data to and pulling data +from the zlib routines. Larger buffer sizes would be more efficient, +especially for inflate(). If the memory is available, buffers sizes +on the order of 128K or 256K bytes should be used. +

+#define CHUNK 16384
+
+The def() routine compresses data from an input file to an output file. The output data +will be in the zlib format, which is different from the gzip or zip +formats. The zlib format has a very small header of only two bytes to identify it as +a zlib stream and to provide decoding information, and a four-byte trailer with a fast +check value to verify the integrity of the uncompressed data after decoding. +

+/* Compress from file source to file dest until EOF on source.
+   def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+   allocated for processing, Z_STREAM_ERROR if an invalid compression
+   level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
+   version of the library linked do not match, or Z_ERRNO if there is
+   an error reading or writing the files. */
+int def(FILE *source, FILE *dest, int level)
+{
+
+Here are the local variables for def(). ret will be used for zlib +return codes. flush will keep track of the current flushing state for deflate(), +which is either no flushing, or flush to completion after the end of the input file is reached. +have is the amount of data returned from deflate(). The strm structure +is used to pass information to and from the zlib routines, and to maintain the +deflate() state. in and out are the input and output buffers for +deflate(). +

+    int ret, flush;
+    unsigned have;
+    z_stream strm;
+    unsigned char in[CHUNK];
+    unsigned char out[CHUNK];
+
+The first thing we do is to initialize the zlib state for compression using +deflateInit(). This must be done before the first use of deflate(). +The zalloc, zfree, and opaque fields in the strm +structure must be initialized before calling deflateInit(). Here they are +set to the zlib constant Z_NULL to request that zlib use +the default memory allocation routines. An application may also choose to provide +custom memory allocation routines here. deflateInit() will allocate on the +order of 256K bytes for the internal state. +(See zlib Technical Details.) +

+deflateInit() is called with a pointer to the structure to be initialized and +the compression level, which is an integer in the range of -1 to 9. Lower compression +levels result in faster execution, but less compression. Higher levels result in +greater compression, but slower execution. The zlib constant Z_DEFAULT_COMPRESSION, +equal to -1, +provides a good compromise between compression and speed and is equivalent to level 6. +Level 0 actually does no compression at all, and in fact expands the data slightly to produce +the zlib format (it is not a byte-for-byte copy of the input). +More advanced applications of zlib +may use deflateInit2() here instead. Such an application may want to reduce how +much memory will be used, at some price in compression. Or it may need to request a +gzip header and trailer instead of a zlib header and trailer, or raw +encoding with no header or trailer at all. +

+We must check the return value of deflateInit() against the zlib constant +Z_OK to make sure that it was able to +allocate memory for the internal state, and that the provided arguments were valid. +deflateInit() will also check that the version of zlib that the zlib.h +file came from matches the version of zlib actually linked with the program. This +is especially important for environments in which zlib is a shared library. +

+Note that an application can initialize multiple, independent zlib streams, which can +operate in parallel. The state information maintained in the structure allows the zlib +routines to be reentrant. +


+    /* allocate deflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    ret = deflateInit(&strm, level);
+    if (ret != Z_OK)
+        return ret;
+
+With the pleasantries out of the way, now we can get down to business. The outer do-loop +reads all of the input file and exits at the bottom of the loop once end-of-file is reached. +This loop contains the only call of deflate(). So we must make sure that all of the +input data has been processed and that all of the output data has been generated and consumed +before we fall out of the loop at the bottom. +

+    /* compress until end of file */
+    do {
+
+We start off by reading data from the input file. The number of bytes read is put directly +into avail_in, and a pointer to those bytes is put into next_in. We also +check to see if end-of-file on the input has been reached. If we are at the end of file, then flush is set to the +zlib constant Z_FINISH, which is later passed to deflate() to +indicate that this is the last chunk of input data to compress. We need to use feof() +to check for end-of-file as opposed to seeing if fewer than CHUNK bytes have been read. The +reason is that if the input file length is an exact multiple of CHUNK, we will miss +the fact that we got to the end-of-file, and not know to tell deflate() to finish +up the compressed stream. If we are not yet at the end of the input, then the zlib +constant Z_NO_FLUSH will be passed to deflate to indicate that we are still +in the middle of the uncompressed data. +

+If there is an error in reading from the input file, the process is aborted with +deflateEnd() being called to free the allocated zlib state before returning +the error. We wouldn't want a memory leak, now would we? deflateEnd() can be called +at any time after the state has been initialized. Once that's done, deflateInit() (or +deflateInit2()) would have to be called to start a new compression process. There is +no point here in checking the deflateEnd() return code. The deallocation can't fail. +


+        strm.avail_in = fread(in, 1, CHUNK, source);
+        if (ferror(source)) {
+            (void)deflateEnd(&strm);
+            return Z_ERRNO;
+        }
+        flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
+        strm.next_in = in;
+
+The inner do-loop passes our chunk of input data to deflate(), and then +keeps calling deflate() until it is done producing output. Once there is no more +new output, deflate() is guaranteed to have consumed all of the input, i.e., +avail_in will be zero. +

+        /* run deflate() on input until output buffer not full, finish
+           compression if all of source has been read in */
+        do {
+
+Output space is provided to deflate() by setting avail_out to the number +of available output bytes and next_out to a pointer to that space. +

+            strm.avail_out = CHUNK;
+            strm.next_out = out;
+
+Now we call the compression engine itself, deflate(). It takes as many of the +avail_in bytes at next_in as it can process, and writes as many as +avail_out bytes to next_out. Those counters and pointers are then +updated past the input data consumed and the output data written. It is the amount of +output space available that may limit how much input is consumed. +Hence the inner loop to make sure that +all of the input is consumed by providing more output space each time. Since avail_in +and next_in are updated by deflate(), we don't have to mess with those +between deflate() calls until it's all used up. +

+The parameters to deflate() are a pointer to the strm structure containing +the input and output information and the internal compression engine state, and a parameter +indicating whether and how to flush data to the output. Normally deflate will consume +several K bytes of input data before producing any output (except for the header), in order +to accumulate statistics on the data for optimum compression. It will then put out a burst of +compressed data, and proceed to consume more input before the next burst. Eventually, +deflate() +must be told to terminate the stream, complete the compression with provided input data, and +write out the trailer check value. deflate() will continue to compress normally as long +as the flush parameter is Z_NO_FLUSH. Once the Z_FINISH parameter is provided, +deflate() will begin to complete the compressed output stream. However depending on how +much output space is provided, deflate() may have to be called several times until it +has provided the complete compressed stream, even after it has consumed all of the input. The flush +parameter must continue to be Z_FINISH for those subsequent calls. +

+There are other values of the flush parameter that are used in more advanced applications. You can +force deflate() to produce a burst of output that encodes all of the input data provided +so far, even if it wouldn't have otherwise, for example to control data latency on a link with +compressed data. You can also ask that deflate() do that as well as erase any history up to +that point so that what follows can be decompressed independently, for example for random access +applications. Both requests will degrade compression by an amount depending on how often such +requests are made. +

+deflate() has a return value that can indicate errors, yet we do not check it here. Why +not? Well, it turns out that deflate() can do no wrong here. Let's go through +deflate()'s return values and dispense with them one by one. The possible values are +Z_OK, Z_STREAM_END, Z_STREAM_ERROR, or Z_BUF_ERROR. Z_OK +is, well, ok. Z_STREAM_END is also ok and will be returned for the last call of +deflate(). This is already guaranteed by calling deflate() with Z_FINISH +until it has no more output. Z_STREAM_ERROR is only possible if the stream is not +initialized properly, but we did initialize it properly. There is no harm in checking for +Z_STREAM_ERROR here, for example to check for the possibility that some +other part of the application inadvertently clobbered the memory containing the zlib state. +Z_BUF_ERROR will be explained further below, but +suffice it to say that this is simply an indication that deflate() could not consume +more input or produce more output. deflate() can be called again with more output space +or more available input, which it will be in this code. +


+            ret = deflate(&strm, flush);    /* no bad return value */
+            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
+
+Now we compute how much output deflate() provided on the last call, which is the +difference between how much space was provided before the call, and how much output space +is still available after the call. Then that data, if any, is written to the output file. +We can then reuse the output buffer for the next call of deflate(). Again if there +is a file i/o error, we call deflateEnd() before returning to avoid a memory leak. +

+            have = CHUNK - strm.avail_out;
+            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+                (void)deflateEnd(&strm);
+                return Z_ERRNO;
+            }
+
+The inner do-loop is repeated until the last deflate() call fails to fill the +provided output buffer. Then we know that deflate() has done as much as it can with +the provided input, and that all of that input has been consumed. We can then fall out of this +loop and reuse the input buffer. +

+The way we tell that deflate() has no more output is by seeing that it did not fill +the output buffer, leaving avail_out greater than zero. However suppose that +deflate() has no more output, but just so happened to exactly fill the output buffer! +avail_out is zero, and we can't tell that deflate() has done all it can. +As far as we know, deflate() +has more output for us. So we call it again. But now deflate() produces no output +at all, and avail_out remains unchanged as CHUNK. That deflate() call +wasn't able to do anything, either consume input or produce output, and so it returns +Z_BUF_ERROR. (See, I told you I'd cover this later.) However this is not a problem at +all. Now we finally have the desired indication that deflate() is really done, +and so we drop out of the inner loop to provide more input to deflate(). +

+With flush set to Z_FINISH, this final set of deflate() calls will +complete the output stream. Once that is done, subsequent calls of deflate() would return +Z_STREAM_ERROR if the flush parameter is not Z_FINISH, and do no more processing +until the state is reinitialized. +

+Some applications of zlib have two loops that call deflate() +instead of the single inner loop we have here. The first loop would call +without flushing and feed all of the data to deflate(). The second loop would call +deflate() with no more +data and the Z_FINISH parameter to complete the process. As you can see from this +example, that can be avoided by simply keeping track of the current flush state. +


+        } while (strm.avail_out == 0);
+        assert(strm.avail_in == 0);     /* all input will be used */
+
+Now we check to see if we have already processed all of the input file. That information was +saved in the flush variable, so we see if that was set to Z_FINISH. If so, +then we're done and we fall out of the outer loop. We're guaranteed to get Z_STREAM_END +from the last deflate() call, since we ran it until the last chunk of input was +consumed and all of the output was generated. +

+        /* done when last data in file processed */
+    } while (flush != Z_FINISH);
+    assert(ret == Z_STREAM_END);        /* stream will be complete */
+
+The process is complete, but we still need to deallocate the state to avoid a memory leak +(or rather more like a memory hemorrhage if you didn't do this). Then +finally we can return with a happy return value. +

+    /* clean up and return */
+    (void)deflateEnd(&strm);
+    return Z_OK;
+}
+
+Now we do the same thing for decompression in the inf() routine. inf() +decompresses what is hopefully a valid zlib stream from the input file and writes the +uncompressed data to the output file. Much of the discussion above for def() +applies to inf() as well, so the discussion here will focus on the differences between +the two. +

+/* Decompress from file source to file dest until stream ends or EOF.
+   inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+   allocated for processing, Z_DATA_ERROR if the deflate data is
+   invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
+   the version of the library linked do not match, or Z_ERRNO if there
+   is an error reading or writing the files. */
+int inf(FILE *source, FILE *dest)
+{
+
+The local variables have the same functionality as they do for def(). The +only difference is that there is no flush variable, since inflate() +can tell from the zlib stream itself when the stream is complete. +

+    int ret;
+    unsigned have;
+    z_stream strm;
+    unsigned char in[CHUNK];
+    unsigned char out[CHUNK];
+
+The initialization of the state is the same, except that there is no compression level, +of course, and two more elements of the structure are initialized. avail_in +and next_in must be initialized before calling inflateInit(). This +is because the application has the option to provide the start of the zlib stream in +order for inflateInit() to have access to information about the compression +method to aid in memory allocation. In the current implementation of zlib +(up through versions 1.2.x), the method-dependent memory allocations are deferred to the first call of +inflate() anyway. However those fields must be initialized since later versions +of zlib that provide more compression methods may take advantage of this interface. +In any case, no decompression is performed by inflateInit(), so the +avail_out and next_out fields do not need to be initialized before calling. +

+Here avail_in is set to zero and next_in is set to Z_NULL to +indicate that no input data is being provided. +


+    /* allocate inflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit(&strm);
+    if (ret != Z_OK)
+        return ret;
+
+The outer do-loop decompresses input until inflate() indicates +that it has reached the end of the compressed data and has produced all of the uncompressed +output. This is in contrast to def() which processes all of the input file. +If end-of-file is reached before the compressed data self-terminates, then the compressed +data is incomplete and an error is returned. +

+    /* decompress until deflate stream ends or end of file */
+    do {
+
+We read input data and set the strm structure accordingly. If we've reached the +end of the input file, then we leave the outer loop and report an error, since the +compressed data is incomplete. Note that we may read more data than is eventually consumed +by inflate(), if the input file continues past the zlib stream. +For applications where zlib streams are embedded in other data, this routine would +need to be modified to return the unused data, or at least indicate how much of the input +data was not used, so the application would know where to pick up after the zlib stream. +

+        strm.avail_in = fread(in, 1, CHUNK, source);
+        if (ferror(source)) {
+            (void)inflateEnd(&strm);
+            return Z_ERRNO;
+        }
+        if (strm.avail_in == 0)
+            break;
+        strm.next_in = in;
+
+The inner do-loop has the same function it did in def(), which is to +keep calling inflate() until has generated all of the output it can with the +provided input. +

+        /* run inflate() on input until output buffer not full */
+        do {
+
+Just like in def(), the same output space is provided for each call of inflate(). +

+            strm.avail_out = CHUNK;
+            strm.next_out = out;
+
+Now we run the decompression engine itself. There is no need to adjust the flush parameter, since +the zlib format is self-terminating. The main difference here is that there are +return values that we need to pay attention to. Z_DATA_ERROR +indicates that inflate() detected an error in the zlib compressed data format, +which means that either the data is not a zlib stream to begin with, or that the data was +corrupted somewhere along the way since it was compressed. The other error to be processed is +Z_MEM_ERROR, which can occur since memory allocation is deferred until inflate() +needs it, unlike deflate(), whose memory is allocated at the start by deflateInit(). +

+Advanced applications may use +deflateSetDictionary() to prime deflate() with a set of likely data to improve the +first 32K or so of compression. This is noted in the zlib header, so inflate() +requests that that dictionary be provided before it can start to decompress. Without the dictionary, +correct decompression is not possible. For this routine, we have no idea what the dictionary is, +so the Z_NEED_DICT indication is converted to a Z_DATA_ERROR. +

+inflate() can also return Z_STREAM_ERROR, which should not be possible here, +but could be checked for as noted above for def(). Z_BUF_ERROR does not need to be +checked for here, for the same reasons noted for def(). Z_STREAM_END will be +checked for later. +


+            ret = inflate(&strm, Z_NO_FLUSH);
+            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
+            switch (ret) {
+            case Z_NEED_DICT:
+                ret = Z_DATA_ERROR;     /* and fall through */
+            case Z_DATA_ERROR:
+            case Z_MEM_ERROR:
+                (void)inflateEnd(&strm);
+                return ret;
+            }
+
+The output of inflate() is handled identically to that of deflate(). +

+            have = CHUNK - strm.avail_out;
+            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+                (void)inflateEnd(&strm);
+                return Z_ERRNO;
+            }
+
+The inner do-loop ends when inflate() has no more output as indicated +by not filling the output buffer, just as for deflate(). In this case, we cannot +assert that strm.avail_in will be zero, since the deflate stream may end before the file +does. +

+        } while (strm.avail_out == 0);
+
+The outer do-loop ends when inflate() reports that it has reached the +end of the input zlib stream, has completed the decompression and integrity +check, and has provided all of the output. This is indicated by the inflate() +return value Z_STREAM_END. The inner loop is guaranteed to leave ret +equal to Z_STREAM_END if the last chunk of the input file read contained the end +of the zlib stream. So if the return value is not Z_STREAM_END, the +loop continues to read more input. +

+        /* done when inflate() says it's done */
+    } while (ret != Z_STREAM_END);
+
+At this point, decompression successfully completed, or we broke out of the loop due to no +more data being available from the input file. If the last inflate() return value +is not Z_STREAM_END, then the zlib stream was incomplete and a data error +is returned. Otherwise, we return with a happy return value. Of course, inflateEnd() +is called first to avoid a memory leak. +

+    /* clean up and return */
+    (void)inflateEnd(&strm);
+    return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
+}
+
+That ends the routines that directly use zlib. The following routines make this +a command-line program by running data through the above routines from stdin to +stdout, and handling any errors reported by def() or inf(). +

+zerr() is used to interpret the possible error codes from def() +and inf(), as detailed in their comments above, and print out an error message. +Note that these are only a subset of the possible return values from deflate() +and inflate(). +


+/* report a zlib or i/o error */
+void zerr(int ret)
+{
+    fputs("zpipe: ", stderr);
+    switch (ret) {
+    case Z_ERRNO:
+        if (ferror(stdin))
+            fputs("error reading stdin\n", stderr);
+        if (ferror(stdout))
+            fputs("error writing stdout\n", stderr);
+        break;
+    case Z_STREAM_ERROR:
+        fputs("invalid compression level\n", stderr);
+        break;
+    case Z_DATA_ERROR:
+        fputs("invalid or incomplete deflate data\n", stderr);
+        break;
+    case Z_MEM_ERROR:
+        fputs("out of memory\n", stderr);
+        break;
+    case Z_VERSION_ERROR:
+        fputs("zlib version mismatch!\n", stderr);
+    }
+}
+
+Here is the main() routine used to test def() and inf(). The +zpipe command is simply a compression pipe from stdin to stdout, if +no arguments are given, or it is a decompression pipe if zpipe -d is used. If any other +arguments are provided, no compression or decompression is performed. Instead a usage +message is displayed. Examples are zpipe < foo.txt > foo.txt.z to compress, and +zpipe -d < foo.txt.z > foo.txt to decompress. +

+/* compress or decompress from stdin to stdout */
+int main(int argc, char **argv)
+{
+    int ret;
+
+    /* avoid end-of-line conversions */
+    SET_BINARY_MODE(stdin);
+    SET_BINARY_MODE(stdout);
+
+    /* do compression if no arguments */
+    if (argc == 1) {
+        ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
+        if (ret != Z_OK)
+            zerr(ret);
+        return ret;
+    }
+
+    /* do decompression if -d specified */
+    else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
+        ret = inf(stdin, stdout);
+        if (ret != Z_OK)
+            zerr(ret);
+        return ret;
+    }
+
+    /* otherwise, report usage */
+    else {
+        fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);
+        return 1;
+    }
+}
+
+
+Copyright (c) 2004, 2005 by Mark Adler
Last modified 11 December 2005
+ + diff --git a/deps/zlib-1.2.10/examples/zpipe.c b/deps/zlib-1.2.10/examples/zpipe.c new file mode 100644 index 0000000..83535d1 --- /dev/null +++ b/deps/zlib-1.2.10/examples/zpipe.c @@ -0,0 +1,205 @@ +/* zpipe.c: example of proper use of zlib's inflate() and deflate() + Not copyrighted -- provided to the public domain + Version 1.4 11 December 2005 Mark Adler */ + +/* Version history: + 1.0 30 Oct 2004 First version + 1.1 8 Nov 2004 Add void casting for unused return values + Use switch statement for inflate() return values + 1.2 9 Nov 2004 Add assertions to document zlib guarantees + 1.3 6 Apr 2005 Remove incorrect assertion in inf() + 1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions + Avoid some compiler warnings for input and output buffers + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define CHUNK 16384 + +/* Compress from file source to file dest until EOF on source. + def() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_STREAM_ERROR if an invalid compression + level is supplied, Z_VERSION_ERROR if the version of zlib.h and the + version of the library linked do not match, or Z_ERRNO if there is + an error reading or writing the files. */ +int def(FILE *source, FILE *dest, int level) +{ + int ret, flush; + unsigned have; + z_stream strm; + unsigned char in[CHUNK]; + unsigned char out[CHUNK]; + + /* allocate deflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = deflateInit(&strm, level); + if (ret != Z_OK) + return ret; + + /* compress until end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; + strm.next_in = in; + + /* run deflate() on input until output buffer not full, finish + compression if all of source has been read in */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = deflate(&strm, flush); /* no bad return value */ + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + assert(strm.avail_in == 0); /* all input will be used */ + + /* done when last data in file processed */ + } while (flush != Z_FINISH); + assert(ret == Z_STREAM_END); /* stream will be complete */ + + /* clean up and return */ + (void)deflateEnd(&strm); + return Z_OK; +} + +/* Decompress from file source to file dest until stream ends or EOF. + inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_DATA_ERROR if the deflate data is + invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and + the version of the library linked do not match, or Z_ERRNO if there + is an error reading or writing the files. */ +int inf(FILE *source, FILE *dest) +{ + int ret; + unsigned have; + z_stream strm; + unsigned char in[CHUNK]; + unsigned char out[CHUNK]; + + /* allocate inflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); + if (ret != Z_OK) + return ret; + + /* decompress until deflate stream ends or end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + if (strm.avail_in == 0) + break; + strm.next_in = in; + + /* run inflate() on input until output buffer not full */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + switch (ret) { + case Z_NEED_DICT: + ret = Z_DATA_ERROR; /* and fall through */ + case Z_DATA_ERROR: + case Z_MEM_ERROR: + (void)inflateEnd(&strm); + return ret; + } + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + + /* done when inflate() says it's done */ + } while (ret != Z_STREAM_END); + + /* clean up and return */ + (void)inflateEnd(&strm); + return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; +} + +/* report a zlib or i/o error */ +void zerr(int ret) +{ + fputs("zpipe: ", stderr); + switch (ret) { + case Z_ERRNO: + if (ferror(stdin)) + fputs("error reading stdin\n", stderr); + if (ferror(stdout)) + fputs("error writing stdout\n", stderr); + break; + case Z_STREAM_ERROR: + fputs("invalid compression level\n", stderr); + break; + case Z_DATA_ERROR: + fputs("invalid or incomplete deflate data\n", stderr); + break; + case Z_MEM_ERROR: + fputs("out of memory\n", stderr); + break; + case Z_VERSION_ERROR: + fputs("zlib version mismatch!\n", stderr); + } +} + +/* compress or decompress from stdin to stdout */ +int main(int argc, char **argv) +{ + int ret; + + /* avoid end-of-line conversions */ + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + + /* do compression if no arguments */ + if (argc == 1) { + ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* do decompression if -d specified */ + else if (argc == 2 && strcmp(argv[1], "-d") == 0) { + ret = inf(stdin, stdout); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* otherwise, report usage */ + else { + fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr); + return 1; + } +} diff --git a/deps/zlib-1.2.10/examples/zran.c b/deps/zlib-1.2.10/examples/zran.c new file mode 100644 index 0000000..4fec659 --- /dev/null +++ b/deps/zlib-1.2.10/examples/zran.c @@ -0,0 +1,409 @@ +/* zran.c -- example of zlib/gzip stream indexing and random access + * Copyright (C) 2005, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.1 29 Sep 2012 Mark Adler */ + +/* Version History: + 1.0 29 May 2005 First version + 1.1 29 Sep 2012 Fix memory reallocation error + */ + +/* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary() + for random access of a compressed file. A file containing a zlib or gzip + stream is provided on the command line. The compressed stream is decoded in + its entirety, and an index built with access points about every SPAN bytes + in the uncompressed output. The compressed file is left open, and can then + be read randomly, having to decompress on the average SPAN/2 uncompressed + bytes before getting to the desired block of data. + + An access point can be created at the start of any deflate block, by saving + the starting file offset and bit of that block, and the 32K bytes of + uncompressed data that precede that block. Also the uncompressed offset of + that block is saved to provide a referece for locating a desired starting + point in the uncompressed stream. build_index() works by decompressing the + input zlib or gzip stream a block at a time, and at the end of each block + deciding if enough uncompressed data has gone by to justify the creation of + a new access point. If so, that point is saved in a data structure that + grows as needed to accommodate the points. + + To use the index, an offset in the uncompressed data is provided, for which + the latest access point at or preceding that offset is located in the index. + The input file is positioned to the specified location in the index, and if + necessary the first few bits of the compressed data is read from the file. + inflate is initialized with those bits and the 32K of uncompressed data, and + the decompression then proceeds until the desired offset in the file is + reached. Then the decompression continues to read the desired uncompressed + data from the file. + + Another approach would be to generate the index on demand. In that case, + requests for random access reads from the compressed data would try to use + the index, but if a read far enough past the end of the index is required, + then further index entries would be generated and added. + + There is some fair bit of overhead to starting inflation for the random + access, mainly copying the 32K byte dictionary. So if small pieces of the + file are being accessed, it would make sense to implement a cache to hold + some lookahead and avoid many calls to extract() for small lengths. + + Another way to build an index would be to use inflateCopy(). That would + not be constrained to have access points at block boundaries, but requires + more memory per access point, and also cannot be saved to file due to the + use of pointers in the state. The approach here allows for storage of the + index in a file. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +#define SPAN 1048576L /* desired distance between access points */ +#define WINSIZE 32768U /* sliding window size */ +#define CHUNK 16384 /* file input buffer size */ + +/* access point entry */ +struct point { + off_t out; /* corresponding offset in uncompressed data */ + off_t in; /* offset in input file of first full byte */ + int bits; /* number of bits (1-7) from byte at in - 1, or 0 */ + unsigned char window[WINSIZE]; /* preceding 32K of uncompressed data */ +}; + +/* access point list */ +struct access { + int have; /* number of list entries filled in */ + int size; /* number of list entries allocated */ + struct point *list; /* allocated list */ +}; + +/* Deallocate an index built by build_index() */ +local void free_index(struct access *index) +{ + if (index != NULL) { + free(index->list); + free(index); + } +} + +/* Add an entry to the access point list. If out of memory, deallocate the + existing list and return NULL. */ +local struct access *addpoint(struct access *index, int bits, + off_t in, off_t out, unsigned left, unsigned char *window) +{ + struct point *next; + + /* if list is empty, create it (start with eight points) */ + if (index == NULL) { + index = malloc(sizeof(struct access)); + if (index == NULL) return NULL; + index->list = malloc(sizeof(struct point) << 3); + if (index->list == NULL) { + free(index); + return NULL; + } + index->size = 8; + index->have = 0; + } + + /* if list is full, make it bigger */ + else if (index->have == index->size) { + index->size <<= 1; + next = realloc(index->list, sizeof(struct point) * index->size); + if (next == NULL) { + free_index(index); + return NULL; + } + index->list = next; + } + + /* fill in entry and increment how many we have */ + next = index->list + index->have; + next->bits = bits; + next->in = in; + next->out = out; + if (left) + memcpy(next->window, window + WINSIZE - left, left); + if (left < WINSIZE) + memcpy(next->window + left, window, WINSIZE - left); + index->have++; + + /* return list, possibly reallocated */ + return index; +} + +/* Make one entire pass through the compressed stream and build an index, with + access points about every span bytes of uncompressed output -- span is + chosen to balance the speed of random access against the memory requirements + of the list, about 32K bytes per access point. Note that data after the end + of the first zlib or gzip stream in the file is ignored. build_index() + returns the number of access points on success (>= 1), Z_MEM_ERROR for out + of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a + file read error. On success, *built points to the resulting index. */ +local int build_index(FILE *in, off_t span, struct access **built) +{ + int ret; + off_t totin, totout; /* our own total counters to avoid 4GB limit */ + off_t last; /* totout value of last access point */ + struct access *index; /* access points being generated */ + z_stream strm; + unsigned char input[CHUNK]; + unsigned char window[WINSIZE]; + + /* initialize inflate */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, 47); /* automatic zlib or gzip decoding */ + if (ret != Z_OK) + return ret; + + /* inflate the input, maintain a sliding window, and build an index -- this + also validates the integrity of the compressed data using the check + information at the end of the gzip or zlib stream */ + totin = totout = last = 0; + index = NULL; /* will be allocated by first addpoint() */ + strm.avail_out = 0; + do { + /* get some compressed data from input file */ + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto build_index_error; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto build_index_error; + } + strm.next_in = input; + + /* process all of that, or until end of stream */ + do { + /* reset sliding window if necessary */ + if (strm.avail_out == 0) { + strm.avail_out = WINSIZE; + strm.next_out = window; + } + + /* inflate until out of input, output, or at end of block -- + update the total input and output counters */ + totin += strm.avail_in; + totout += strm.avail_out; + ret = inflate(&strm, Z_BLOCK); /* return at end of block */ + totin -= strm.avail_in; + totout -= strm.avail_out; + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto build_index_error; + if (ret == Z_STREAM_END) + break; + + /* if at end of block, consider adding an index entry (note that if + data_type indicates an end-of-block, then all of the + uncompressed data from that block has been delivered, and none + of the compressed data after that block has been consumed, + except for up to seven bits) -- the totout == 0 provides an + entry point after the zlib or gzip header, and assures that the + index always has at least one access point; we avoid creating an + access point after the last block by checking bit 6 of data_type + */ + if ((strm.data_type & 128) && !(strm.data_type & 64) && + (totout == 0 || totout - last > span)) { + index = addpoint(index, strm.data_type & 7, totin, + totout, strm.avail_out, window); + if (index == NULL) { + ret = Z_MEM_ERROR; + goto build_index_error; + } + last = totout; + } + } while (strm.avail_in != 0); + } while (ret != Z_STREAM_END); + + /* clean up and return index (release unused entries in list) */ + (void)inflateEnd(&strm); + index->list = realloc(index->list, sizeof(struct point) * index->have); + index->size = index->have; + *built = index; + return index->size; + + /* return error */ + build_index_error: + (void)inflateEnd(&strm); + if (index != NULL) + free_index(index); + return ret; +} + +/* Use the index to read len bytes from offset into buf, return bytes read or + negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past + the end of the uncompressed data, then extract() will return a value less + than len, indicating how much as actually read into buf. This function + should not return a data error unless the file was modified since the index + was generated. extract() may also return Z_ERRNO if there is an error on + reading or seeking the input file. */ +local int extract(FILE *in, struct access *index, off_t offset, + unsigned char *buf, int len) +{ + int ret, skip; + z_stream strm; + struct point *here; + unsigned char input[CHUNK]; + unsigned char discard[WINSIZE]; + + /* proceed only if something reasonable to do */ + if (len < 0) + return 0; + + /* find where in stream to start */ + here = index->list; + ret = index->have; + while (--ret && here[1].out <= offset) + here++; + + /* initialize file and inflate state to start there */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); /* raw inflate */ + if (ret != Z_OK) + return ret; + ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET); + if (ret == -1) + goto extract_ret; + if (here->bits) { + ret = getc(in); + if (ret == -1) { + ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR; + goto extract_ret; + } + (void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits)); + } + (void)inflateSetDictionary(&strm, here->window, WINSIZE); + + /* skip uncompressed bytes until offset reached, then satisfy request */ + offset -= here->out; + strm.avail_in = 0; + skip = 1; /* while skipping to offset */ + do { + /* define where to put uncompressed data, and how much */ + if (offset == 0 && skip) { /* at offset now */ + strm.avail_out = len; + strm.next_out = buf; + skip = 0; /* only do this once */ + } + if (offset > WINSIZE) { /* skip WINSIZE bytes */ + strm.avail_out = WINSIZE; + strm.next_out = discard; + offset -= WINSIZE; + } + else if (offset != 0) { /* last skip */ + strm.avail_out = (unsigned)offset; + strm.next_out = discard; + offset = 0; + } + + /* uncompress until avail_out filled, or end of stream */ + do { + if (strm.avail_in == 0) { + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto extract_ret; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto extract_ret; + } + strm.next_in = input; + } + ret = inflate(&strm, Z_NO_FLUSH); /* normal inflate */ + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto extract_ret; + if (ret == Z_STREAM_END) + break; + } while (strm.avail_out != 0); + + /* if reach end of stream, then don't keep trying to get more */ + if (ret == Z_STREAM_END) + break; + + /* do until offset reached and requested data read, or stream ends */ + } while (skip); + + /* compute number of uncompressed bytes read after offset */ + ret = skip ? 0 : len - strm.avail_out; + + /* clean up and return bytes read or error */ + extract_ret: + (void)inflateEnd(&strm); + return ret; +} + +/* Demonstrate the use of build_index() and extract() by processing the file + provided on the command line, and the extracting 16K from about 2/3rds of + the way through the uncompressed output, and writing that to stdout. */ +int main(int argc, char **argv) +{ + int len; + off_t offset; + FILE *in; + struct access *index = NULL; + unsigned char buf[CHUNK]; + + /* open input file */ + if (argc != 2) { + fprintf(stderr, "usage: zran file.gz\n"); + return 1; + } + in = fopen(argv[1], "rb"); + if (in == NULL) { + fprintf(stderr, "zran: could not open %s for reading\n", argv[1]); + return 1; + } + + /* build index */ + len = build_index(in, SPAN, &index); + if (len < 0) { + fclose(in); + switch (len) { + case Z_MEM_ERROR: + fprintf(stderr, "zran: out of memory\n"); + break; + case Z_DATA_ERROR: + fprintf(stderr, "zran: compressed data error in %s\n", argv[1]); + break; + case Z_ERRNO: + fprintf(stderr, "zran: read error on %s\n", argv[1]); + break; + default: + fprintf(stderr, "zran: error %d while building index\n", len); + } + return 1; + } + fprintf(stderr, "zran: built index with %d access points\n", len); + + /* use index by reading some bytes from an arbitrary offset */ + offset = (index->list[index->have - 1].out << 1) / 3; + len = extract(in, index, offset, buf, CHUNK); + if (len < 0) + fprintf(stderr, "zran: extraction failed: %s error\n", + len == Z_MEM_ERROR ? "out of memory" : "input corrupted"); + else { + fwrite(buf, 1, len, stdout); + fprintf(stderr, "zran: extracted %d bytes at %llu\n", len, offset); + } + + /* clean up and exit */ + free_index(index); + fclose(in); + return 0; +} diff --git a/deps/zlib-1.2.10/examplesh b/deps/zlib-1.2.10/examplesh new file mode 100755 index 0000000..a5d5192 Binary files /dev/null and b/deps/zlib-1.2.10/examplesh differ diff --git a/deps/zlib-1.2.10/gzclose.c b/deps/zlib-1.2.10/gzclose.c new file mode 100644 index 0000000..caeb99a --- /dev/null +++ b/deps/zlib-1.2.10/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/deps/zlib-1.2.10/gzclose.lo b/deps/zlib-1.2.10/gzclose.lo new file mode 100644 index 0000000..3119b75 Binary files /dev/null and b/deps/zlib-1.2.10/gzclose.lo differ diff --git a/deps/zlib-1.2.10/gzclose.o b/deps/zlib-1.2.10/gzclose.o new file mode 100644 index 0000000..3119b75 Binary files /dev/null and b/deps/zlib-1.2.10/gzclose.o differ diff --git a/deps/zlib-1.2.10/gzguts.h b/deps/zlib-1.2.10/gzguts.h new file mode 100644 index 0000000..990a4d2 --- /dev/null +++ b/deps/zlib-1.2.10/gzguts.h @@ -0,0 +1,218 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +# define WIDECHAR +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer (double-sized when writing) */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/deps/zlib-1.2.10/gzlib.c b/deps/zlib-1.2.10/gzlib.c new file mode 100644 index 0000000..e142ffb --- /dev/null +++ b/deps/zlib-1.2.10/gzlib.c @@ -0,0 +1,637 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) +# define LSEEK _lseeki64 +#else +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const void *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + state->x.have = 0; /* no output data available */ + if (state->mode == GZ_READ) { /* for reading ... */ + state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ + state->how = LOOK; /* look for gzip header */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->x.pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const void *path; + int fd; + const char *mode; +{ + gz_statep state; + z_size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; + + /* allocate gzFile structure to return */ + state = (gz_statep)malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + break; + case 'T': + state->direct = 1; + break; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + + /* save the path name for error messages */ +#ifdef WIDECHAR + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (z_size_t)-1) + len = 0; + } + else +#endif + len = strlen((const char *)path); + state->path = (char *)malloc(len + 1); + if (state->path == NULL) { + free(state); + return NULL; + } +#ifdef WIDECHAR + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(state->path, len + 1, "%s", (const char *)path); +#else + strcpy(state->path, path); +#endif + + /* compute the flags for open() */ + oflag = +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef WIDECHAR + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open((const char *)path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) { + LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */ + state->mode = GZ_WRITE; /* simplify later checks */ + } + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(path, 7 + 3 * sizeof(int), "", fd); +#else + sprintf(path, "", fd); /* for debugging */ +#endif + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +#ifdef WIDECHAR +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if ((size << 1) < size) + return -1; /* need to be able to double it */ + if (size < 2) + size = 2; /* need two bytes to check magic header */ + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->x.pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + if (ret == -1) + return -1; + state->x.have = 0; + state->eof = 0; + state->past = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->x.pos += offset; + return state->x.pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->x.pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->x.pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->x.pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? state->past : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->err == Z_MEM_ERROR ? "out of memory" : + (state->msg == NULL ? "" : state->msg); +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) { + state->eof = 0; + state->past = 0; + } + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, return literal string when requested */ + if (err == Z_MEM_ERROR) + return; + + /* construct error message with path */ + if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == + NULL) { + state->err = Z_MEM_ERROR; + return; + } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); +#else + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); +#endif +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/deps/zlib-1.2.10/gzlib.lo b/deps/zlib-1.2.10/gzlib.lo new file mode 100644 index 0000000..df1a08f Binary files /dev/null and b/deps/zlib-1.2.10/gzlib.lo differ diff --git a/deps/zlib-1.2.10/gzlib.o b/deps/zlib-1.2.10/gzlib.o new file mode 100644 index 0000000..fff2a65 Binary files /dev/null and b/deps/zlib-1.2.10/gzlib.o differ diff --git a/deps/zlib-1.2.10/gzread.c b/deps/zlib-1.2.10/gzread.c new file mode 100644 index 0000000..956b91e --- /dev/null +++ b/deps/zlib-1.2.10/gzread.c @@ -0,0 +1,654 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_look OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_fetch OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); +local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + unsigned get, max = ((unsigned)-1 >> 2) + 1; + + *have = 0; + do { + get = len - *have; + if (get > max) + get = max; + ret = read(state->fd, buf + *have, get); + if (ret <= 0) + break; + *have += (unsigned)ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ +local int gz_avail(state) + gz_statep state; +{ + unsigned got; + z_streamp strm = &(state->strm); + + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + if (state->eof == 0) { + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in; + unsigned const char *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) + return -1; + strm->avail_in += got; + strm->next_in = state->in; + } + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; + } + + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; + if (strm->avail_in) { + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret = Z_OK; + unsigned had; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; + + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; + + /* good decompression */ + return 0; +} + +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; + return 0; + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + } + return 0; +} + +/* Read len bytes into buf from file, or less than len up to the end of the + input. Return the number of bytes read. If zero is returned, either the + end of file was reached, or there was an error. state->err must be + consulted in that case to determine which. */ +local z_size_t gz_read(state, buf, len) + gz_statep state; + voidp buf; + z_size_t len; +{ + z_size_t got; + unsigned n; + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return 0; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* set n to the maximum amount of len that fits in an unsigned int */ + n = -1; + if (n > len) + n = len; + + /* first just try copying data from the output buffer */ + if (state->x.have) { + if (state->x.have < n) + n = state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) { + state->past = 1; /* tried to read past end */ + break; + } + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || n < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return 0; + continue; /* no progress yet -- go back to copy above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, (unsigned char *)buf, n, &n) == -1) + return 0; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + state->strm.avail_out = n; + state->strm.next_out = (unsigned char *)buf; + if (gz_decomp(state) == -1) + return 0; + n = state->x.have; + state->x.have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->x.pos += n; + } while (len); + + /* return number of bytes read into user buffer */ + return got; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in an int"); + return -1; + } + + /* read len or fewer bytes to buf */ + len = gz_read(state, buf, len); + + /* check for an error */ + if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* return the number of bytes read (this is assured to fit in an int) */ + return (int)len; +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfread(buf, size, nitems, file) + voidp buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* read len or fewer bytes to buf, return the number of full items read */ + return len ? gz_read(state, buf, len) / size : 0; +} + +/* -- see zlib.h -- */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +#else +# undef gzgetc +#endif +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; + } + + /* nothing there -- try gz_read() */ + ret = gz_read(state, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = (unsigned char)c; + state->x.pos--; + state->past = 0; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->x.next = dest; + } + state->x.have++; + state->x.next--; + state->x.next[0] = (unsigned char)c; + state->x.pos--; + state->past = 0; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } + + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + + /* return 1 if transparent, 0 if processing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret, err; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : err; +} diff --git a/deps/zlib-1.2.10/gzread.lo b/deps/zlib-1.2.10/gzread.lo new file mode 100644 index 0000000..1cdc165 Binary files /dev/null and b/deps/zlib-1.2.10/gzread.lo differ diff --git a/deps/zlib-1.2.10/gzread.o b/deps/zlib-1.2.10/gzread.o new file mode 100644 index 0000000..b144be3 Binary files /dev/null and b/deps/zlib-1.2.10/gzread.o differ diff --git a/deps/zlib-1.2.10/gzwrite.c b/deps/zlib-1.2.10/gzwrite.c new file mode 100644 index 0000000..1ec1da4 --- /dev/null +++ b/deps/zlib-1.2.10/gzwrite.c @@ -0,0 +1,665 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); +local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on a memory allocation failure, or 0 on + success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input buffer (double size for gzprintf) */ + state->in = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = (unsigned char *)malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + strm->next_in = NULL; + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file or if gz_init() + fails to allocate memory, otherwise 0. flush is assumed to be a valid + deflate() flush value. If flush is Z_FINISH, then the deflate() state is + reset to start a new gzip stream. If gz->direct is true, then simply write + to the output file without compressing, and ignore flush. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, writ; + unsigned have, put, max = ((unsigned)-1 >> 2) + 1; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* write directly if requested */ + if (state->direct) { + while (strm->avail_in) { + put = strm->avail_in > max ? max : strm->avail_in; + writ = write(state->fd, strm->next_in, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in -= (unsigned)writ; + strm->next_in += writ; + } + return 0; + } + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + while (strm->next_out > state->x.next) { + put = strm->next_out - state->x.next > (int)max ? max : + (unsigned)(strm->next_out - state->x.next); + writ = write(state->fd, state->x.next, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + state->x.next += writ; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = state->out; + } + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on a write error or memory + allocation failure by gz_comp(), or 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* Write len bytes from buf to file. Return the number of bytes written. If + the returned value is less than len, then there was an error. */ +local z_size_t gz_write(state, buf, len) + gz_statep state; + voidpc buf; + z_size_t len; +{ + z_size_t put = len; + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + unsigned have, copy; + + if (state->strm.avail_in == 0) + state->strm.next_in = state->in; + have = (unsigned)((state->strm.next_in + state->strm.avail_in) - + state->in); + copy = state->size - have; + if (copy > len) + copy = len; + memcpy(state->in + have, buf, copy); + state->strm.avail_in += copy; + state->x.pos += copy; + buf = (const char *)buf + copy; + len -= copy; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + state->strm.next_in = (z_const Bytef *)buf; + do { + unsigned n = (unsigned)-1; + if (n > len) + n = len; + state->strm.avail_in = n; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + len -= n; + } while (len); + } + + /* input was all buffered or compressed */ + return put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* write len bytes from buf (the return value will fit in an int) */ + return (int)gz_write(state, buf, len); +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) + voidpc buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* write len bytes to buf, return the number of full items written */ + return len ? gz_write(state, buf, len) / size : 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned have; + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (have < state->size) { + state->in[have] = (unsigned char)c; + strm->avail_in++; + state->x.pos++; + return c & 0xff; + } + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = (unsigned char)c; + if (gz_write(state, buf, 1) != 1) + return -1; + return c & 0xff; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* write string */ + len = strlen(str); + ret = gz_write(state, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) +{ + int len; + unsigned left; + char *next; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return state->err; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in); + next[state->size - 1] = 0; +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(next, format, va); + for (len = 0; len < state->size; len++) + if (next[len] == 0) break; +# else + len = vsprintf(next, format, va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(next, state->size, format, va); + len = strlen(next); +# else + len = vsnprintf(next, state->size, format, va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0) + return 0; + + /* update buffer and position, compress first half if past that */ + strm->avail_in += (unsigned)len; + state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return len; +} + +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) +{ + va_list va; + int ret; + + va_start(va, format); + ret = gzvprintf(file, format, va); + va_end(va); + return ret; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + unsigned len, left; + char *next; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return Z_STREAM_ERROR; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return state->error; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->error; + } + + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(strm->next_in + strm->avail_in); + next[state->size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, + a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (next[len] == 0) + break; +# else + len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, + a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(next); +# else + len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len == 0 || len >= state->size || next[state->size - 1] != 0) + return 0; + + /* update buffer and position, compress first half if past that */ + strm->avail_in += len; + state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return (int)len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* compress remaining data with requested flush */ + (void)gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = Z_OK; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + ret = state->err; + } + + /* flush, free memory, and close file */ + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (state->size) { + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + if (close(state->fd) == -1) + ret = Z_ERRNO; + free(state); + return ret; +} diff --git a/deps/zlib-1.2.10/gzwrite.lo b/deps/zlib-1.2.10/gzwrite.lo new file mode 100644 index 0000000..9c42555 Binary files /dev/null and b/deps/zlib-1.2.10/gzwrite.lo differ diff --git a/deps/zlib-1.2.10/gzwrite.o b/deps/zlib-1.2.10/gzwrite.o new file mode 100644 index 0000000..7f10b12 Binary files /dev/null and b/deps/zlib-1.2.10/gzwrite.o differ diff --git a/deps/zlib-1.2.10/infback.c b/deps/zlib-1.2.10/infback.c new file mode 100644 index 0000000..59679ec --- /dev/null +++ b/deps/zlib-1.2.10/infback.c @@ -0,0 +1,640 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = (uInt)windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->wnext = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/deps/zlib-1.2.10/infback.lo b/deps/zlib-1.2.10/infback.lo new file mode 100644 index 0000000..326d46a Binary files /dev/null and b/deps/zlib-1.2.10/infback.lo differ diff --git a/deps/zlib-1.2.10/infback.o b/deps/zlib-1.2.10/infback.o new file mode 100644 index 0000000..326d46a Binary files /dev/null and b/deps/zlib-1.2.10/infback.o differ diff --git a/deps/zlib-1.2.10/inffast.c b/deps/zlib-1.2.10/inffast.c new file mode 100644 index 0000000..29eb7d8 --- /dev/null +++ b/deps/zlib-1.2.10/inffast.c @@ -0,0 +1,323 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2008, 2010, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef ASMINF +# pragma message("Assembler code may have bugs -- use at your own risk") +#else + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in; + last = in + (strm->avail_in - 5); + out = strm->next_out; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + *out++ = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + *out++ = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + *out++ = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + *out++ = *from++; + } while (--len); + continue; + } +#endif + } + from = window; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = window; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } while (len > 2); + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in; + strm->next_out = out; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/deps/zlib-1.2.10/inffast.h b/deps/zlib-1.2.10/inffast.h new file mode 100644 index 0000000..e5c1aa4 --- /dev/null +++ b/deps/zlib-1.2.10/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/deps/zlib-1.2.10/inffast.lo b/deps/zlib-1.2.10/inffast.lo new file mode 100644 index 0000000..d797c0e Binary files /dev/null and b/deps/zlib-1.2.10/inffast.lo differ diff --git a/deps/zlib-1.2.10/inffast.o b/deps/zlib-1.2.10/inffast.o new file mode 100644 index 0000000..d797c0e Binary files /dev/null and b/deps/zlib-1.2.10/inffast.o differ diff --git a/deps/zlib-1.2.10/inffixed.h b/deps/zlib-1.2.10/inffixed.h new file mode 100644 index 0000000..d628327 --- /dev/null +++ b/deps/zlib-1.2.10/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/deps/zlib-1.2.10/inflate.c b/deps/zlib-1.2.10/inflate.c new file mode 100644 index 0000000..ac333e8 --- /dev/null +++ b/deps/zlib-1.2.10/inflate.c @@ -0,0 +1,1561 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local int inflateStateCheck OF((z_streamp strm)); +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); + +local int inflateStateCheck(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + state = (struct inflate_state FAR *)strm->state; + if (state == Z_NULL || state->strm != strm || + state->mode < HEAD || state->mode > SYNC) + return 1; + return 0; +} + +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 5; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->strm = strm; + state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += (unsigned)value << state->bits; + state->bits += (uInt)bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, end, copy) +z_streamp strm; +const Bytef *end; +unsigned copy; +{ + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (inflateStateCheck(strm) || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + if (state->wbits == 0) + state->wbits = 15; + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + if (len > 15 || len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if ((state->wrap & 4) && hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if ((state->wrap & 4) && ( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = (int)state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +const unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (inflateStateCheck(source) || dest == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + copy->strm = dest; + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + state->sane = !subvert; + return Z_OK; +#else + (void)subvert; + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +int ZEXPORT inflateValidate(strm, check) +z_streamp strm; +int check; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (check) + state->wrap |= 4; + else + state->wrap &= ~4; + return Z_OK; +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) + return -(1L << 16); + state = (struct inflate_state FAR *)strm->state; + return (long)(((unsigned long)((long)state->back)) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} + +unsigned long ZEXPORT inflateCodesUsed(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) return (unsigned long)-1; + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); +} diff --git a/deps/zlib-1.2.10/inflate.h b/deps/zlib-1.2.10/inflate.h new file mode 100644 index 0000000..a46cce6 --- /dev/null +++ b/deps/zlib-1.2.10/inflate.h @@ -0,0 +1,125 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD = 16180, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ +struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/deps/zlib-1.2.10/inflate.lo b/deps/zlib-1.2.10/inflate.lo new file mode 100644 index 0000000..9c6376d Binary files /dev/null and b/deps/zlib-1.2.10/inflate.lo differ diff --git a/deps/zlib-1.2.10/inflate.o b/deps/zlib-1.2.10/inflate.o new file mode 100644 index 0000000..c41f725 Binary files /dev/null and b/deps/zlib-1.2.10/inflate.o differ diff --git a/deps/zlib-1.2.10/inftrees.c b/deps/zlib-1.2.10/inftrees.c new file mode 100644 index 0000000..8a904dd --- /dev/null +++ b/deps/zlib-1.2.10/inftrees.c @@ -0,0 +1,304 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.10 Copyright 1995-2017 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + unsigned match; /* use base and extra for symbol >= match */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 192, 202}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + match = 20; + break; + case LENS: + base = lbase; + extra = lext; + match = 257; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + match = 0; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if (work[sym] + 1U < match) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if (work[sym] >= match) { + here.op = (unsigned char)(extra[work[sym] - match]); + here.val = base[work[sym] - match]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/deps/zlib-1.2.10/inftrees.h b/deps/zlib-1.2.10/inftrees.h new file mode 100644 index 0000000..baa53a0 --- /dev/null +++ b/deps/zlib-1.2.10/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/deps/zlib-1.2.10/inftrees.lo b/deps/zlib-1.2.10/inftrees.lo new file mode 100644 index 0000000..1d3822c Binary files /dev/null and b/deps/zlib-1.2.10/inftrees.lo differ diff --git a/deps/zlib-1.2.10/inftrees.o b/deps/zlib-1.2.10/inftrees.o new file mode 100644 index 0000000..1d3822c Binary files /dev/null and b/deps/zlib-1.2.10/inftrees.o differ diff --git a/deps/zlib-1.2.10/libz.a b/deps/zlib-1.2.10/libz.a new file mode 100644 index 0000000..e5eb1ad Binary files /dev/null and b/deps/zlib-1.2.10/libz.a differ diff --git a/deps/zlib-1.2.10/libz.so b/deps/zlib-1.2.10/libz.so new file mode 120000 index 0000000..628585b --- /dev/null +++ b/deps/zlib-1.2.10/libz.so @@ -0,0 +1 @@ +libz.so.1.2.10 \ No newline at end of file diff --git a/deps/zlib-1.2.10/libz.so.1 b/deps/zlib-1.2.10/libz.so.1 new file mode 120000 index 0000000..628585b --- /dev/null +++ b/deps/zlib-1.2.10/libz.so.1 @@ -0,0 +1 @@ +libz.so.1.2.10 \ No newline at end of file diff --git a/deps/zlib-1.2.10/libz.so.1.2.10 b/deps/zlib-1.2.10/libz.so.1.2.10 new file mode 100755 index 0000000..c21e3b2 Binary files /dev/null and b/deps/zlib-1.2.10/libz.so.1.2.10 differ diff --git a/deps/zlib-1.2.10/make_vms.com b/deps/zlib-1.2.10/make_vms.com new file mode 100644 index 0000000..65e9d0c --- /dev/null +++ b/deps/zlib-1.2.10/make_vms.com @@ -0,0 +1,867 @@ +$! make libz under VMS written by +$! Martin P.J. Zinser +$! +$! In case of problems with the install you might contact me at +$! zinser@zinser.no-ip.info(preferred) or +$! martin.zinser@eurexchange.com (work) +$! +$! Make procedure history for Zlib +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20060120 First version to receive a number +$! 0.02 20061008 Adapt to new Makefile.in +$! 0.03 20091224 Add support for large file check +$! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite +$! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in +$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples +$! subdir path, update module search in makefile.in +$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned +$! shared image creation +$! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared +$! image +$! 0.09 20120305 SMS. P1 sets builder ("MMK", "MMS", " " (built-in)). +$! "" -> automatic, preference: MMK, MMS, built-in. +$! +$ on error then goto err_exit +$! +$ true = 1 +$ false = 0 +$ tmpnam = "temp_" + f$getjpi("","pid") +$ tt = tmpnam + ".txt" +$ tc = tmpnam + ".c" +$ th = tmpnam + ".h" +$ define/nolog tconfig 'th' +$ its_decc = false +$ its_vaxc = false +$ its_gnuc = false +$ s_case = False +$! +$! Setup variables holding "config" information +$! +$ Make = "''p1'" +$ name = "Zlib" +$ version = "?.?.?" +$ v_string = "ZLIB_VERSION" +$ v_file = "zlib.h" +$ ccopt = "/include = []" +$ lopts = "" +$ dnsrl = "" +$ aconf_in_file = "zconf.h.in#zconf.h_in#zconf_h.in" +$ conf_check_string = "" +$ linkonly = false +$ optfile = name + ".opt" +$ mapfile = name + ".map" +$ libdefs = "" +$ vax = f$getsyi("HW_MODEL").lt.1024 +$ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096 +$ ia64 = f$getsyi("HW_MODEL").ge.4096 +$! +$! 2012-03-05 SMS. +$! Why is this needed? And if it is needed, why not simply ".not. vax"? +$! +$!!! if axp .or. ia64 then set proc/parse=extended +$! +$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL") +$ mydef = F$parse(whoami,,,"DEVICE") +$ mydir = f$parse(whoami,,,"DIRECTORY") - "][" +$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") +$! +$! Check for MMK/MMS +$! +$ if (Make .eqs. "") +$ then +$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" +$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" +$ else +$ Make = f$edit( Make, "trim") +$ endif +$! +$ gosub find_version +$! +$ open/write topt tmp.opt +$ open/write optf 'optfile' +$! +$ gosub check_opts +$! +$! Look for the compiler used +$! +$ gosub check_compiler +$ close topt +$ close optf +$! +$ if its_decc +$ then +$ ccopt = "/prefix=all" + ccopt +$ if f$trnlnm("SYS") .eqs. "" +$ then +$ if axp +$ then +$ define sys sys$library: +$ else +$ ccopt = "/decc" + ccopt +$ define sys decc$library_include: +$ endif +$ endif +$! +$! 2012-03-05 SMS. +$! Why /NAMES = AS_IS? Why not simply ".not. vax"? And why not on VAX? +$! +$ if axp .or. ia64 +$ then +$ ccopt = ccopt + "/name=as_is/opt=(inline=speed)" +$ s_case = true +$ endif +$ endif +$ if its_vaxc .or. its_gnuc +$ then +$ if f$trnlnm("SYS").eqs."" then define sys sys$library: +$ endif +$! +$! Build a fake configure input header +$! +$ open/write conf_hin config.hin +$ write conf_hin "#undef _LARGEFILE64_SOURCE" +$ close conf_hin +$! +$! +$ i = 0 +$FIND_ACONF: +$ fname = f$element(i,"#",aconf_in_file) +$ if fname .eqs. "#" then goto AMISS_ERR +$ if f$search(fname) .eqs. "" +$ then +$ i = i + 1 +$ goto find_aconf +$ endif +$ open/read/err=aconf_err aconf_in 'fname' +$ open/write aconf zconf.h +$ACONF_LOOP: +$ read/end_of_file=aconf_exit aconf_in line +$ work = f$edit(line, "compress,trim") +$ if f$extract(0,6,work) .nes. "#undef" +$ then +$ if f$extract(0,12,work) .nes. "#cmakedefine" +$ then +$ write aconf line +$ endif +$ else +$ cdef = f$element(1," ",work) +$ gosub check_config +$ endif +$ goto aconf_loop +$ACONF_EXIT: +$ write aconf "" +$ write aconf "/* VMS specifics added by make_vms.com: */" +$ write aconf "#define VMS 1" +$ write aconf "#include " +$ write aconf "#include " +$ write aconf "#ifdef _LARGEFILE" +$ write aconf "# define off64_t __off64_t" +$ write aconf "# define fopen64 fopen" +$ write aconf "# define fseeko64 fseeko" +$ write aconf "# define lseek64 lseek" +$ write aconf "# define ftello64 ftell" +$ write aconf "#endif" +$ write aconf "#if !defined( __VAX) && (__CRTL_VER >= 70312000)" +$ write aconf "# define HAVE_VSNPRINTF" +$ write aconf "#endif" +$ close aconf_in +$ close aconf +$ if f$search("''th'") .nes. "" then delete 'th';* +$! Build the thing plain or with mms +$! +$ write sys$output "Compiling Zlib sources ..." +$ if make.eqs."" +$ then +$ if (f$search( "example.obj;*") .nes. "") then delete example.obj;* +$ if (f$search( "minigzip.obj;*") .nes. "") then delete minigzip.obj;* +$ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - + adler32.c zlib.h zconf.h +$ CALL MAKE compress.OBJ "CC ''CCOPT' compress" - + compress.c zlib.h zconf.h +$ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - + crc32.c zlib.h zconf.h +$ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - + deflate.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE gzclose.OBJ "CC ''CCOPT' gzclose" - + gzclose.c zutil.h zlib.h zconf.h +$ CALL MAKE gzlib.OBJ "CC ''CCOPT' gzlib" - + gzlib.c zutil.h zlib.h zconf.h +$ CALL MAKE gzread.OBJ "CC ''CCOPT' gzread" - + gzread.c zutil.h zlib.h zconf.h +$ CALL MAKE gzwrite.OBJ "CC ''CCOPT' gzwrite" - + gzwrite.c zutil.h zlib.h zconf.h +$ CALL MAKE infback.OBJ "CC ''CCOPT' infback" - + infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - + inffast.c zutil.h zlib.h zconf.h inffast.h +$ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" - + inflate.c zutil.h zlib.h zconf.h infblock.h +$ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" - + inftrees.c zutil.h zlib.h zconf.h inftrees.h +$ CALL MAKE trees.OBJ "CC ''CCOPT' trees" - + trees.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" - + uncompr.c zlib.h zconf.h +$ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" - + zutil.c zutil.h zlib.h zconf.h +$ write sys$output "Building Zlib ..." +$ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ +$ write sys$output "Building example..." +$ CALL MAKE example.OBJ "CC ''CCOPT' [.test]example" - + [.test]example.c zlib.h zconf.h +$ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb +$ write sys$output "Building minigzip..." +$ CALL MAKE minigzip.OBJ "CC ''CCOPT' [.test]minigzip" - + [.test]minigzip.c zlib.h zconf.h +$ call make minigzip.exe - + "LINK minigzip,libz.olb/lib" - + minigzip.obj libz.olb +$ else +$ gosub crea_mms +$ write sys$output "Make ''name' ''version' with ''Make' " +$ 'make' +$ endif +$! +$! Create shareable image +$! +$ gosub crea_olist +$ write sys$output "Creating libzshr.exe" +$ call map_2_shopt 'mapfile' 'optfile' +$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt +$ write sys$output "Zlib build completed" +$ delete/nolog tmp.opt;* +$ exit +$AMISS_ERR: +$ write sys$output "No source for config.hin found." +$ write sys$output "Tried any of ''aconf_in_file'" +$ goto err_exit +$CC_ERR: +$ write sys$output "C compiler required to build ''name'" +$ goto err_exit +$ERR_EXIT: +$ set message/facil/ident/sever/text +$ close/nolog optf +$ close/nolog topt +$ close/nolog aconf_in +$ close/nolog aconf +$ close/nolog out +$ close/nolog min +$ close/nolog mod +$ close/nolog h_in +$ write sys$output "Exiting..." +$ exit 2 +$! +$! +$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES +$ V = 'F$Verify(0) +$! P1 = What we are trying to make +$! P2 = Command to make it +$! P3 - P8 What it depends on +$ +$ If F$Search(P1) .Eqs. "" Then Goto Makeit +$ Time = F$CvTime(F$File(P1,"RDT")) +$arg=3 +$Loop: +$ Argument = P'arg +$ If Argument .Eqs. "" Then Goto Exit +$ El=0 +$Loop2: +$ File = F$Element(El," ",Argument) +$ If File .Eqs. " " Then Goto Endl +$ AFile = "" +$Loop3: +$ OFile = AFile +$ AFile = F$Search(File) +$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl +$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit +$ Goto Loop3 +$NextEL: +$ El = El + 1 +$ Goto Loop2 +$EndL: +$ arg=arg+1 +$ If arg .Le. 8 Then Goto Loop +$ Goto Exit +$ +$Makeit: +$ VV=F$VERIFY(0) +$ write sys$output P2 +$ 'P2 +$ VV='F$Verify(VV) +$Exit: +$ If V Then Set Verify +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ +$! +$! Check command line options and set symbols accordingly +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20041206 First version to receive a number +$! 0.02 20060126 Add new "HELP" target +$ CHECK_OPTS: +$ i = 1 +$ OPT_LOOP: +$ if i .lt. 9 +$ then +$ cparm = f$edit(p'i',"upcase") +$! +$! Check if parameter actually contains something +$! +$ if f$edit(cparm,"trim") .nes. "" +$ then +$ if cparm .eqs. "DEBUG" +$ then +$ ccopt = ccopt + "/noopt/deb" +$ lopts = lopts + "/deb" +$ endif +$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ ccopt = ccopt + f$extract(start,len,cparm) +$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - + then s_case = true +$ endif +$ if cparm .eqs. "LINK" then linkonly = true +$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ lopts = lopts + f$extract(start,len,cparm) +$ endif +$ if f$locate("CC=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ cc_com = f$extract(start,len,cparm) + if (cc_com .nes. "DECC") .and. - + (cc_com .nes. "VAXC") .and. - + (cc_com .nes. "GNUC") +$ then +$ write sys$output "Unsupported compiler choice ''cc_com' ignored" +$ write sys$output "Use DECC, VAXC, or GNUC instead" +$ else +$ if cc_com .eqs. "DECC" then its_decc = true +$ if cc_com .eqs. "VAXC" then its_vaxc = true +$ if cc_com .eqs. "GNUC" then its_gnuc = true +$ endif +$ endif +$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ mmks = f$extract(start,len,cparm) +$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") +$ then +$ make = mmks +$ else +$ write sys$output "Unsupported make choice ''mmks' ignored" +$ write sys$output "Use MMK or MMS instead" +$ endif +$ endif +$ if cparm .eqs. "HELP" then gosub bhelp +$ endif +$ i = i + 1 +$ goto opt_loop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Look for the compiler used +$! +$! Version history +$! 0.01 20040223 First version to receive a number +$! 0.02 20040229 Save/set value of decc$no_rooted_search_lists +$! 0.03 20060202 Extend handling of GNU C +$! 0.04 20090402 Compaq -> hp +$CHECK_COMPILER: +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then +$ its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") +$ its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "") +$ its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "") +$ endif +$! +$! Exit if no compiler available +$! +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then goto CC_ERR +$ else +$ if its_decc +$ then +$ write sys$output "CC compiler check ... hp C" +$ if f$trnlnm("decc$no_rooted_search_lists") .nes. "" +$ then +$ dnrsl = f$trnlnm("decc$no_rooted_search_lists") +$ endif +$ define/nolog decc$no_rooted_search_lists 1 +$ else +$ if its_vaxc then write sys$output "CC compiler check ... VAX C" +$ if its_gnuc +$ then +$ write sys$output "CC compiler check ... GNU C" +$ if f$trnlnm(topt) then write topt "gnu_cc:[000000]gcclib.olb/lib" +$ if f$trnlnm(optf) then write optf "gnu_cc:[000000]gcclib.olb/lib" +$ cc = "gcc" +$ endif +$ if f$trnlnm(topt) then write topt "sys$share:vaxcrtl.exe/share" +$ if f$trnlnm(optf) then write optf "sys$share:vaxcrtl.exe/share" +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! If MMS/MMK are available dump out the descrip.mms if required +$! +$CREA_MMS: +$ write sys$output "Creating descrip.mms..." +$ create descrip.mms +$ open/append out descrip.mms +$ copy sys$input: out +$ deck +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser +# + +OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\ + gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, \ + inftrees.obj, inffast.obj + +$ eod +$ write out "CFLAGS=", ccopt +$ write out "LOPTS=", lopts +$ write out "all : example.exe minigzip.exe libz.olb" +$ copy sys$input: out +$ deck + @ write sys$output " Example applications available" + +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link $(LOPTS) example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link $(LOPTS) minigzip,libz.olb/lib + +clean : + delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* + + +# Other dependencies. +adler32.obj : adler32.c zutil.h zlib.h zconf.h +compress.obj : compress.c zlib.h zconf.h +crc32.obj : crc32.c zutil.h zlib.h zconf.h +deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h +example.obj : [.test]example.c zlib.h zconf.h +gzclose.obj : gzclose.c zutil.h zlib.h zconf.h +gzlib.obj : gzlib.c zutil.h zlib.h zconf.h +gzread.obj : gzread.c zutil.h zlib.h zconf.h +gzwrite.obj : gzwrite.c zutil.h zlib.h zconf.h +inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h +inflate.obj : inflate.c zutil.h zlib.h zconf.h +inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h +minigzip.obj : [.test]minigzip.c zlib.h zconf.h +trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h +uncompr.obj : uncompr.c zlib.h zconf.h +zutil.obj : zutil.c zutil.h zlib.h zconf.h +infback.obj : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ eod +$ close out +$ return +$!------------------------------------------------------------------------------ +$! +$! Read list of core library sources from makefile.in and create options +$! needed to build shareable image +$! +$CREA_OLIST: +$ open/read min makefile.in +$ open/write mod modules.opt +$ src_check_list = "OBJZ =#OBJG =" +$MRLOOP: +$ read/end=mrdone min rec +$ i = 0 +$SRC_CHECK_LOOP: +$ src_check = f$element(i, "#", src_check_list) +$ i = i+1 +$ if src_check .eqs. "#" then goto mrloop +$ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop +$ rec = rec - src_check +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .eqs. "\") then goto mrloop +$MRSLOOP: +$ read/end=mrdone min rec +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop +$MRDONE: +$ close min +$ close mod +$ return +$!------------------------------------------------------------------------------ +$! +$! Take record extracted in crea_olist and split it into single filenames +$! +$EXTRA_FILNAM: +$ myrec = f$edit(rec - "\", "trim,compress") +$ i = 0 +$FELOOP: +$ srcfil = f$element(i," ", myrec) +$ if (srcfil .nes. " ") +$ then +$ write mod f$parse(srcfil,,,"NAME"), ".obj" +$ i = i + 1 +$ goto feloop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Find current Zlib version number +$! +$FIND_VERSION: +$ open/read h_in 'v_file' +$hloop: +$ read/end=hdone h_in rec +$ rec = f$edit(rec,"TRIM") +$ if (f$extract(0,1,rec) .nes. "#") then goto hloop +$ rec = f$edit(rec - "#", "TRIM") +$ if f$element(0," ",rec) .nes. "define" then goto hloop +$ if f$element(1," ",rec) .eqs. v_string +$ then +$ version = 'f$element(2," ",rec)' +$ goto hdone +$ endif +$ goto hloop +$hdone: +$ close h_in +$ return +$!------------------------------------------------------------------------------ +$! +$CHECK_CONFIG: +$! +$ in_ldef = f$locate(cdef,libdefs) +$ if (in_ldef .lt. f$length(libdefs)) +$ then +$ write aconf "#define ''cdef' 1" +$ libdefs = f$extract(0,in_ldef,libdefs) + - + f$extract(in_ldef + f$length(cdef) + 1, - + f$length(libdefs) - in_ldef - f$length(cdef) - 1, - + libdefs) +$ else +$ if (f$type('cdef') .eqs. "INTEGER") +$ then +$ write aconf "#define ''cdef' ", 'cdef' +$ else +$ if (f$type('cdef') .eqs. "STRING") +$ then +$ write aconf "#define ''cdef' ", """", '''cdef'', """" +$ else +$ gosub check_cc_def +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check if this is a define relating to the properties of the C/C++ +$! compiler +$! +$ CHECK_CC_DEF: +$ if (cdef .eqs. "_LARGEFILE64_SOURCE") +$ then +$ copy sys$input: 'tc' +$ deck +#include "tconfig" +#define _LARGEFILE +#include + +int main(){ +FILE *fp; + fp = fopen("temp.txt","r"); + fseeko(fp,1,SEEK_SET); + fclose(fp); +} + +$ eod +$ test_inv = false +$ comm_h = false +$ gosub cc_prop_check +$ return +$ endif +$ write aconf "/* ", line, " */" +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler +$! +$! Version history +$! 0.01 20031020 First version to receive a number +$! 0.02 20031022 Added logic for defines with value +$! 0.03 20040309 Make sure local config file gets not deleted +$! 0.04 20041230 Also write include for configure run +$! 0.05 20050103 Add processing of "comment defines" +$CC_PROP_CHECK: +$ cc_prop = true +$ is_need = false +$ is_need = (f$extract(0,4,cdef) .eqs. "NEED") .or. (test_inv .eq. true) +$ if f$search(th) .eqs. "" then create 'th' +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'.*;*/exclude='th' +$ if (cc_prop .and. .not. is_need) .or. - + (.not. cc_prop .and. is_need) +$ then +$ write sys$output "Checking for ''cdef'... yes" +$ if f$type('cdef_val'_yes) .nes. "" +$ then +$ if f$type('cdef_val'_yes) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_yes) +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_yes) +$ else +$ call write_config f$fao("#define !AS 1",cdef) +$ endif +$ if (cdef .eqs. "HAVE_FSEEKO") .or. (cdef .eqs. "_LARGE_FILES") .or. - + (cdef .eqs. "_LARGEFILE64_SOURCE") then - + call write_config f$string("#define _LARGEFILE 1") +$ else +$ write sys$output "Checking for ''cdef'... no" +$ if (comm_h) +$ then + call write_config f$fao("/* !AS */",line) +$ else +$ if f$type('cdef_val'_no) .nes. "" +$ then +$ if f$type('cdef_val'_no) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_no) +$ if f$type('cdef_val'_no) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_no) +$ else +$ call write_config f$fao("#undef !AS",cdef) +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler with multiple result values +$! +$! Version history +$! 0.01 20040127 First version +$! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05 +$CC_MPROP_CHECK: +$ cc_prop = true +$ i = 1 +$ idel = 1 +$ MT_LOOP: +$ if f$type(result_'i') .eqs. "STRING" +$ then +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam'_'i' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam'_'i',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'_'i'.*;* +$ if (cc_prop) +$ then +$ write sys$output "Checking for ''cdef'... ", mdef_'i' +$ if f$type(mdef_'i') .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,mdef_'i') +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,mdef_'i') +$ goto msym_clean +$ else +$ i = i + 1 +$ goto mt_loop +$ endif +$ endif +$ write sys$output "Checking for ''cdef'... no" +$ call write_config f$fao("#undef !AS",cdef) +$ MSYM_CLEAN: +$ if (idel .le. msym_max) +$ then +$ delete/sym mdef_'idel' +$ idel = idel + 1 +$ goto msym_clean +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Write configuration to both permanent and temporary config file +$! +$! Version history +$! 0.01 20031029 First version to receive a number +$! +$WRITE_CONFIG: SUBROUTINE +$ write aconf 'p1' +$ open/append confh 'th' +$ write confh 'p1' +$ close confh +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ +$! +$! Analyze the project map file and create the symbol vector for a shareable +$! image from it +$! +$! Version history +$! 0.01 20120128 First version +$! 0.02 20120226 Add pre-load logic +$! +$ MAP_2_SHOPT: Subroutine +$! +$ SAY := "WRITE_ SYS$OUTPUT" +$! +$ IF F$SEARCH("''P1'") .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT-E-NOSUCHFILE: Error, inputfile ''p1' not available" +$ goto exit_m2s +$ ENDIF +$ IF "''P2'" .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT: Error, no output file provided" +$ goto exit_m2s +$ ENDIF +$! +$ module1 = "deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary" +$ module2 = "gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread" +$ module3 = "gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary" +$ module4 = "inflateSync#uncompress#zlibVersion#compress" +$ open/read map 'p1 +$ if axp .or. ia64 +$ then +$ open/write aopt a.opt +$ open/write bopt b.opt +$ write aopt " CASE_SENSITIVE=YES" +$ write bopt "SYMBOL_VECTOR= (-" +$ mod_sym_num = 1 +$ MOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ MOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ mod_in = mod_in + 1 +$ goto mod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto mod_sym_loop +$ endif +$MAP_LOOP: +$ read/end=map_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto map_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ endif +$ goto map_loop +$MAP_END: +$ close/nolog aopt +$ close/nolog bopt +$ open/append libopt 'p2' +$ open/read aopt a.opt +$ open/read bopt b.opt +$ALOOP: +$ read/end=aloop_end aopt line +$ write libopt line +$ goto aloop +$ALOOP_END: +$ close/nolog aopt +$ sv = "" +$BLOOP: +$ read/end=bloop_end bopt svn +$ if (svn.nes."") +$ then +$ if (sv.nes."") then write libopt sv +$ sv = svn +$ endif +$ goto bloop +$BLOOP_END: +$ write libopt f$extract(0,f$length(sv)-2,sv), "-" +$ write libopt ")" +$ close/nolog bopt +$ delete/nolog/noconf a.opt;*,b.opt;* +$ else +$ if vax +$ then +$ open/append libopt 'p2' +$ mod_sym_num = 1 +$ VMOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ VMOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ mod_in = mod_in + 1 +$ goto vmod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto vmod_sym_loop +$ endif +$VMAP_LOOP: +$ read/end=vmap_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto vmap_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ endif +$ goto vmap_loop +$VMAP_END: +$ else +$ write sys$output "Unknown Architecture (Not VAX, AXP, or IA64)" +$ write sys$output "No options file created" +$ endif +$ endif +$ EXIT_M2S: +$ close/nolog map +$ close/nolog libopt +$ endsubroutine diff --git a/deps/zlib-1.2.10/minigzip b/deps/zlib-1.2.10/minigzip new file mode 100755 index 0000000..bec8783 Binary files /dev/null and b/deps/zlib-1.2.10/minigzip differ diff --git a/deps/zlib-1.2.10/minigzip.o b/deps/zlib-1.2.10/minigzip.o new file mode 100644 index 0000000..a615b72 Binary files /dev/null and b/deps/zlib-1.2.10/minigzip.o differ diff --git a/deps/zlib-1.2.10/minigzip64 b/deps/zlib-1.2.10/minigzip64 new file mode 100755 index 0000000..657e123 Binary files /dev/null and b/deps/zlib-1.2.10/minigzip64 differ diff --git a/deps/zlib-1.2.10/minigzip64.o b/deps/zlib-1.2.10/minigzip64.o new file mode 100644 index 0000000..efe8c1c Binary files /dev/null and b/deps/zlib-1.2.10/minigzip64.o differ diff --git a/deps/zlib-1.2.10/minigzipsh b/deps/zlib-1.2.10/minigzipsh new file mode 100755 index 0000000..6e86d13 Binary files /dev/null and b/deps/zlib-1.2.10/minigzipsh differ diff --git a/deps/zlib-1.2.10/msdos/Makefile.bor b/deps/zlib-1.2.10/msdos/Makefile.bor new file mode 100644 index 0000000..3d12a2c --- /dev/null +++ b/deps/zlib-1.2.10/msdos/Makefile.bor @@ -0,0 +1,115 @@ +# Makefile for zlib +# Borland C++ +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.bor" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C++, Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# memory model: one of s, m, c, l (small, medium, compact, large) +MODEL=l + +# replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version +CC=bcc +LD=bcc +AR=tlib + +# compiler flags +# replace "-O2" by "-O -G -a -d" for Turbo C++ 1.0 +CFLAGS=-O2 -Z -m$(MODEL) $(LOC) + +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/deps/zlib-1.2.10/msdos/Makefile.dj2 b/deps/zlib-1.2.10/msdos/Makefile.dj2 new file mode 100644 index 0000000..59d2037 --- /dev/null +++ b/deps/zlib-1.2.10/msdos/Makefile.dj2 @@ -0,0 +1,104 @@ +# Makefile for zlib. Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.dj2; make test -fmakefile.dj2 +# +# To install libz.a, zconf.h and zlib.h in the djgpp directories, type: +# +# make install -fmakefile.dj2 +# +# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as +# in the sample below if the pattern of the DJGPP distribution is to +# be followed. Remember that, while 'es around <=> are ignored in +# makefiles, they are *not* in batch files or in djgpp.env. +# - - - - - +# [make] +# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include +# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib +# BUTT=-m486 +# - - - - - +# Alternately, these variables may be defined below, overriding the values +# in djgpp.env, as +# INCLUDE_PATH=c:\usr\include +# LIBRARY_PATH=c:\usr\lib + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DZLIB_DEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lz +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=libz.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +OBJA = +# to use the asm code: make OBJA=match.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +check: test +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +libz.a: $(OBJS) $(OBJA) + $(AR) $@ $(OBJS) $(OBJA) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + +# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env . + +.PHONY : uninstall clean + +install: $(INCL) $(LIBS) + -@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH) + -@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH) + $(INSTALL) zlib.h $(INCLUDE_PATH) + $(INSTALL) zconf.h $(INCLUDE_PATH) + $(INSTALL) libz.a $(LIBRARY_PATH) + +uninstall: + $(RM) $(INCLUDE_PATH)\zlib.h + $(RM) $(INCLUDE_PATH)\zconf.h + $(RM) $(LIBRARY_PATH)\libz.a + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) libz.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/deps/zlib-1.2.10/msdos/Makefile.emx b/deps/zlib-1.2.10/msdos/Makefile.emx new file mode 100644 index 0000000..e30f67b --- /dev/null +++ b/deps/zlib-1.2.10/msdos/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx 0.9c by Chr. Spieler, 6/17/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DZLIB_DEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/deps/zlib-1.2.10/msdos/Makefile.msc b/deps/zlib-1.2.10/msdos/Makefile.msc new file mode 100644 index 0000000..ae83786 --- /dev/null +++ b/deps/zlib-1.2.10/msdos/Makefile.msc @@ -0,0 +1,112 @@ +# Makefile for zlib +# Microsoft C 5.1 or later +# Last updated: 19-Mar-2003 + +# To use, do "make makefile.msc" +# To compile in small model, set below: MODEL=S + +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------- Microsoft C 5.1 and later ------------- + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# Memory model: one of S, M, C, L (small, medium, compact, large) +MODEL=L + +CC=cl +CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC) +#-Ox generates bad code with MSC 5.1 +LIB_CFLAGS=-Zl $(CFLAGS) + +LD=link +LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode +# "/farcall/packcode" are only useful for `large code' memory models +# but should be a "no-op" for small code models. + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(LIB_CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + +minigzip.obj: test/minigzip.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + if exist $(ZLIB_LIB) del $(ZLIB_LIB) + lib $(ZLIB_LIB) $(OBJ1); + lib $(ZLIB_LIB) $(OBJ2); + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB); + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB); + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del *.map + -del zlib_*.bak + -del foo.gz diff --git a/deps/zlib-1.2.10/msdos/Makefile.tc b/deps/zlib-1.2.10/msdos/Makefile.tc new file mode 100644 index 0000000..5aec82a --- /dev/null +++ b/deps/zlib-1.2.10/msdos/Makefile.tc @@ -0,0 +1,100 @@ +# Makefile for zlib +# Turbo C 2.01, Turbo C++ 1.01 +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.tc" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to CFLAGS below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C 2.01, Turbo C++ 1.01 ------------ +MODEL=l +CC=tcc +LD=tcc +AR=tlib +# CFLAGS=-O2 -G -Z -m$(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +CFLAGS=-O2 -G -Z -m$(MODEL) +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/deps/zlib-1.2.10/nintendods/Makefile b/deps/zlib-1.2.10/nintendods/Makefile new file mode 100644 index 0000000..21337d0 --- /dev/null +++ b/deps/zlib-1.2.10/nintendods/Makefile @@ -0,0 +1,126 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +include $(DEVKITARM)/ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +#--------------------------------------------------------------------------------- +TARGET := $(shell basename $(CURDIR)) +BUILD := build +SOURCES := ../../ +DATA := data +INCLUDES := include + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -mthumb -mthumb-interwork + +CFLAGS := -Wall -O2\ + -march=armv5te -mtune=arm946e-s \ + -fomit-frame-pointer -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM9 +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions + +ASFLAGS := $(ARCH) -march=armv5te -mtune=arm946e-s +LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(LIBNDS) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/lib/libz.a + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + @[ -d $@ ] || mkdir -p include + @cp ../../*.h include + +lib: + @[ -d $@ ] || mkdir -p $@ + +$(BUILD): lib + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) lib + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT) : $(OFILES) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/deps/zlib-1.2.10/nintendods/README b/deps/zlib-1.2.10/nintendods/README new file mode 100644 index 0000000..ba7a37d --- /dev/null +++ b/deps/zlib-1.2.10/nintendods/README @@ -0,0 +1,5 @@ +This Makefile requires devkitARM (http://www.devkitpro.org/category/devkitarm/) and works inside "contrib/nds". It is based on a devkitARM template. + +Eduardo Costa +January 3, 2009 + diff --git a/deps/zlib-1.2.10/old/Makefile.emx b/deps/zlib-1.2.10/old/Makefile.emx new file mode 100644 index 0000000..612b037 --- /dev/null +++ b/deps/zlib-1.2.10/old/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx/rsxnt by Chr. Spieler, 6/16/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc -Zwin32 + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DZLIB_DEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ + gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/deps/zlib-1.2.10/old/Makefile.riscos b/deps/zlib-1.2.10/old/Makefile.riscos new file mode 100644 index 0000000..57e29d3 --- /dev/null +++ b/deps/zlib-1.2.10/old/Makefile.riscos @@ -0,0 +1,151 @@ +# Project: zlib_1_03 +# Patched for zlib 1.1.2 rw@shadow.org.uk 19980430 +# test works out-of-the-box, installs `somewhere' on demand + +# Toolflags: +CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fah +C++flags = -c -depend !Depend -IC: -throwback +Linkflags = -aif -c++ -o $@ +ObjAsmflags = -throwback -NoCache -depend !Depend +CMHGflags = +LibFileflags = -c -l -o $@ +Squeezeflags = -o $@ + +# change the line below to where _you_ want the library installed. +libdest = lib:zlib + +# Final targets: +@.lib: @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \ + @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \ + @.o.uncompr @.o.zutil + LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \ + @.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \ + @.o.trees @.o.uncompr @.o.zutil +test: @.minigzip @.example @.lib + @copy @.lib @.libc A~C~DF~L~N~P~Q~RS~TV + @echo running tests: hang on. + @/@.minigzip -f -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -f -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -1 libc + @/@.minigzip -d libc-gz + @diff @.lib @.libc + @echo that should have reported '@.lib and @.libc identical' if you have diff. + @/@.example @.fred @.fred + @echo that will have given lots of hello!'s. + +@.minigzip: @.o.minigzip @.lib C:o.Stubs + Link $(Linkflags) @.o.minigzip @.lib C:o.Stubs +@.example: @.o.example @.lib C:o.Stubs + Link $(Linkflags) @.o.example @.lib C:o.Stubs + +install: @.lib + cdir $(libdest) + cdir $(libdest).h + @copy @.h.zlib $(libdest).h.zlib A~C~DF~L~N~P~Q~RS~TV + @copy @.h.zconf $(libdest).h.zconf A~C~DF~L~N~P~Q~RS~TV + @copy @.lib $(libdest).lib A~C~DF~L~N~P~Q~RS~TV + @echo okay, installed zlib in $(libdest) + +clean:; remove @.minigzip + remove @.example + remove @.libc + -wipe @.o.* F~r~cV + remove @.fred + +# User-editable dependencies: +.c.o: + cc $(ccflags) -o $@ $< + +# Static dependencies: + +# Dynamic dependencies: +o.example: c.example +o.example: h.zlib +o.example: h.zconf +o.minigzip: c.minigzip +o.minigzip: h.zlib +o.minigzip: h.zconf +o.adler32: c.adler32 +o.adler32: h.zlib +o.adler32: h.zconf +o.compress: c.compress +o.compress: h.zlib +o.compress: h.zconf +o.crc32: c.crc32 +o.crc32: h.zlib +o.crc32: h.zconf +o.deflate: c.deflate +o.deflate: h.deflate +o.deflate: h.zutil +o.deflate: h.zlib +o.deflate: h.zconf +o.gzio: c.gzio +o.gzio: h.zutil +o.gzio: h.zlib +o.gzio: h.zconf +o.infblock: c.infblock +o.infblock: h.zutil +o.infblock: h.zlib +o.infblock: h.zconf +o.infblock: h.infblock +o.infblock: h.inftrees +o.infblock: h.infcodes +o.infblock: h.infutil +o.infcodes: c.infcodes +o.infcodes: h.zutil +o.infcodes: h.zlib +o.infcodes: h.zconf +o.infcodes: h.inftrees +o.infcodes: h.infblock +o.infcodes: h.infcodes +o.infcodes: h.infutil +o.infcodes: h.inffast +o.inffast: c.inffast +o.inffast: h.zutil +o.inffast: h.zlib +o.inffast: h.zconf +o.inffast: h.inftrees +o.inffast: h.infblock +o.inffast: h.infcodes +o.inffast: h.infutil +o.inffast: h.inffast +o.inflate: c.inflate +o.inflate: h.zutil +o.inflate: h.zlib +o.inflate: h.zconf +o.inflate: h.infblock +o.inftrees: c.inftrees +o.inftrees: h.zutil +o.inftrees: h.zlib +o.inftrees: h.zconf +o.inftrees: h.inftrees +o.inftrees: h.inffixed +o.infutil: c.infutil +o.infutil: h.zutil +o.infutil: h.zlib +o.infutil: h.zconf +o.infutil: h.infblock +o.infutil: h.inftrees +o.infutil: h.infcodes +o.infutil: h.infutil +o.trees: c.trees +o.trees: h.deflate +o.trees: h.zutil +o.trees: h.zlib +o.trees: h.zconf +o.trees: h.trees +o.uncompr: c.uncompr +o.uncompr: h.zlib +o.uncompr: h.zconf +o.zutil: c.zutil +o.zutil: h.zutil +o.zutil: h.zlib +o.zutil: h.zconf diff --git a/deps/zlib-1.2.10/old/README b/deps/zlib-1.2.10/old/README new file mode 100644 index 0000000..800bf07 --- /dev/null +++ b/deps/zlib-1.2.10/old/README @@ -0,0 +1,3 @@ +This directory contains files that have not been updated for zlib 1.2.x + +(Volunteers are encouraged to help clean this up. Thanks.) diff --git a/deps/zlib-1.2.10/old/descrip.mms b/deps/zlib-1.2.10/old/descrip.mms new file mode 100644 index 0000000..7066da5 --- /dev/null +++ b/deps/zlib-1.2.10/old/descrip.mms @@ -0,0 +1,48 @@ +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser + +cc_defs = +c_deb = + +.ifdef __DECC__ +pref = /prefix=all +.endif + +OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\ + inftrees.obj, infcodes.obj, infutil.obj, inffast.obj + +CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF) + +all : example.exe minigzip.exe + @ write sys$output " Example applications available" +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib + +clean : + delete *.obj;*,libz.olb;* + + +# Other dependencies. +adler32.obj : zutil.h zlib.h zconf.h +compress.obj : zlib.h zconf.h +crc32.obj : zutil.h zlib.h zconf.h +deflate.obj : deflate.h zutil.h zlib.h zconf.h +example.obj : zlib.h zconf.h +gzio.obj : zutil.h zlib.h zconf.h +infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h +inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h +inflate.obj : zutil.h zlib.h zconf.h infblock.h +inftrees.obj : zutil.h zlib.h zconf.h inftrees.h +infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h +minigzip.obj : zlib.h zconf.h +trees.obj : deflate.h zutil.h zlib.h zconf.h +uncompr.obj : zlib.h zconf.h +zutil.obj : zutil.h zlib.h zconf.h diff --git a/deps/zlib-1.2.10/old/os2/Makefile.os2 b/deps/zlib-1.2.10/old/os2/Makefile.os2 new file mode 100644 index 0000000..bb426c0 --- /dev/null +++ b/deps/zlib-1.2.10/old/os2/Makefile.os2 @@ -0,0 +1,136 @@ +# Makefile for zlib under OS/2 using GCC (PGCC) +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile and test, type: +# cp Makefile.os2 .. +# cd .. +# make -f Makefile.os2 test + +# This makefile will build a static library z.lib, a shared library +# z.dll and a import library zdll.lib. You can use either z.lib or +# zdll.lib by specifying either -lz or -lzdll on gcc's command line + +CC=gcc -Zomf -s + +CFLAGS=-O6 -Wall +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-g -DZLIB_DEBUG +#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ +# -Wstrict-prototypes -Wmissing-prototypes + +#################### BUG WARNING: ##################### +## infcodes.c hits a bug in pgcc-1.0, so you have to use either +## -O# where # <= 4 or one of (-fno-ommit-frame-pointer or -fno-force-mem) +## This bug is reportedly fixed in pgcc >1.0, but this was not tested +CFLAGS+=-fno-force-mem + +LDFLAGS=-s -L. -lzdll -Zcrtdll +LDSHARED=$(CC) -s -Zomf -Zdll -Zcrtdll + +VER=1.1.0 +ZLIB=z.lib +SHAREDLIB=z.dll +SHAREDLIBIMP=zdll.lib +LIBS=$(ZLIB) $(SHAREDLIB) $(SHAREDLIBIMP) + +AR=emxomfar cr +IMPLIB=emximp +RANLIB=echo +TAR=tar +SHELL=bash + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o + +TEST_OBJS = example.o minigzip.o + +DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \ + algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \ + nt/Makefile.nt nt/zlib.dnt contrib/README.contrib contrib/*.txt \ + contrib/asm386/*.asm contrib/asm386/*.c \ + contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/iostream/*.cpp \ + contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \ + contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 + +all: example.exe minigzip.exe + +test: all + @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + echo hello world | ./minigzip | ./minigzip -d || \ + echo ' *** minigzip test FAILED ***' ; \ + if ./example; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; \ + fi + +$(ZLIB): $(OBJS) + $(AR) $@ $(OBJS) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +$(SHAREDLIB): $(OBJS) os2/z.def + $(LDSHARED) -o $@ $^ + +$(SHAREDLIBIMP): os2/z.def + $(IMPLIB) -o $@ $^ + +example.exe: example.o $(LIBS) + $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) + +minigzip.exe: minigzip.o $(LIBS) + $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) + +clean: + rm -f *.o *~ example minigzip libz.a libz.so* foo.gz + +distclean: clean + +zip: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + zip -ul9 zlib$$v $(DISTFILES) + mv Makefile~ Makefile + +dist: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + rm -f $$d.tar.gz; \ + if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \ + files=""; \ + for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \ + cd ..; \ + GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \ + if test ! -d $$d; then rm -f $$d; fi + mv Makefile~ Makefile + +tags: + etags *.[ch] + +depend: + makedepend -- $(CFLAGS) -- *.[ch] + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzio.o: zutil.h zlib.h zconf.h +infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h +infcodes.o: zutil.h zlib.h zconf.h +infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h +inffast.o: infblock.h infcodes.h infutil.h inffast.h +inflate.o: zutil.h zlib.h zconf.h infblock.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/deps/zlib-1.2.10/old/os2/zlib.def b/deps/zlib-1.2.10/old/os2/zlib.def new file mode 100644 index 0000000..4c753f1 --- /dev/null +++ b/deps/zlib-1.2.10/old/os2/zlib.def @@ -0,0 +1,51 @@ +; +; Slightly modified version of ../nt/zlib.dnt :-) +; + +LIBRARY Z +DESCRIPTION "Zlib compression library for OS/2" +CODE PRELOAD MOVEABLE DISCARDABLE +DATA PRELOAD MOVEABLE MULTIPLE + +EXPORTS + adler32 + compress + crc32 + deflate + deflateCopy + deflateEnd + deflateInit2_ + deflateInit_ + deflateParams + deflateReset + deflateSetDictionary + gzclose + gzdopen + gzerror + gzflush + gzopen + gzread + gzwrite + inflate + inflateEnd + inflateInit2_ + inflateInit_ + inflateReset + inflateSetDictionary + inflateSync + uncompress + zlibVersion + gzprintf + gzputc + gzgetc + gzseek + gzrewind + gztell + gzeof + gzsetparams + zError + inflateSyncPoint + get_crc_table + compress2 + gzputs + gzgets diff --git a/deps/zlib-1.2.10/old/visual-basic.txt b/deps/zlib-1.2.10/old/visual-basic.txt new file mode 100644 index 0000000..57efe58 --- /dev/null +++ b/deps/zlib-1.2.10/old/visual-basic.txt @@ -0,0 +1,160 @@ +See below some functions declarations for Visual Basic. + +Frequently Asked Question: + +Q: Each time I use the compress function I get the -5 error (not enough + room in the output buffer). + +A: Make sure that the length of the compressed buffer is passed by + reference ("as any"), not by value ("as long"). Also check that + before the call of compress this length is equal to the total size of + the compressed buffer and not zero. + + +From: "Jon Caruana" +Subject: Re: How to port zlib declares to vb? +Date: Mon, 28 Oct 1996 18:33:03 -0600 + +Got the answer! (I haven't had time to check this but it's what I got, and +looks correct): + +He has the following routines working: + compress + uncompress + gzopen + gzwrite + gzread + gzclose + +Declares follow: (Quoted from Carlos Rios , in Vb4 form) + +#If Win16 Then 'Use Win16 calls. +Declare Function compress Lib "ZLIB.DLL" (ByVal compr As + String, comprLen As Any, ByVal buf As String, ByVal buflen + As Long) As Integer +Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr + As String, uncomprLen As Any, ByVal compr As String, ByVal + lcompr As Long) As Integer +Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As + String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As + Long) As Integer +#Else +Declare Function compress Lib "ZLIB32.DLL" + (ByVal compr As String, comprLen As Any, ByVal buf As + String, ByVal buflen As Long) As Integer +Declare Function uncompress Lib "ZLIB32.DLL" + (ByVal uncompr As String, uncomprLen As Any, ByVal compr As + String, ByVal lcompr As Long) As Long +Declare Function gzopen Lib "ZLIB32.DLL" + (ByVal file As String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzwrite Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzclose Lib "ZLIB32.DLL" + (ByVal file As Long) As Long +#End If + +-Jon Caruana +jon-net@usa.net +Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member + + +Here is another example from Michael that he +says conforms to the VB guidelines, and that solves the problem of not +knowing the uncompressed size by storing it at the end of the file: + +'Calling the functions: +'bracket meaning: [optional] {Range of possible values} +'Call subCompressFile( [, , [level of compression {1..9}]]) +'Call subUncompressFile() + +Option Explicit +Private lngpvtPcnSml As Long 'Stores value for 'lngPercentSmaller' +Private Const SUCCESS As Long = 0 +Private Const strFilExt As String = ".cpr" +Private Declare Function lngfncCpr Lib "zlib.dll" Alias "compress2" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long, +ByVal level As Integer) As Long +Private Declare Function lngfncUcp Lib "zlib.dll" Alias "uncompress" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long) +As Long + +Public Sub subCompressFile(ByVal strargOriFilPth As String, Optional ByVal +strargCprFilPth As String, Optional ByVal intLvl As Integer = 9) + Dim strCprPth As String + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim bytaryOri() As Byte + Dim bytaryCpr() As Byte + lngOriSiz = FileLen(strargOriFilPth) + ReDim bytaryOri(lngOriSiz - 1) + Open strargOriFilPth For Binary Access Read As #1 + Get #1, , bytaryOri() + Close #1 + strCprPth = IIf(strargCprFilPth = "", strargOriFilPth, strargCprFilPth) +'Select file path and name + strCprPth = strCprPth & IIf(Right(strCprPth, Len(strFilExt)) = +strFilExt, "", strFilExt) 'Add file extension if not exists + lngCprSiz = (lngOriSiz * 1.01) + 12 'Compression needs temporary a bit +more space then original file size + ReDim bytaryCpr(lngCprSiz - 1) + If lngfncCpr(bytaryCpr(0), lngCprSiz, bytaryOri(0), lngOriSiz, intLvl) = +SUCCESS Then + lngpvtPcnSml = (1# - (lngCprSiz / lngOriSiz)) * 100 + ReDim Preserve bytaryCpr(lngCprSiz - 1) + Open strCprPth For Binary Access Write As #1 + Put #1, , bytaryCpr() + Put #1, , lngOriSiz 'Add the the original size value to the end +(last 4 bytes) + Close #1 + Else + MsgBox "Compression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub + +Public Sub subUncompressFile(ByVal strargFilPth As String) + Dim bytaryCpr() As Byte + Dim bytaryOri() As Byte + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim strOriPth As String + lngCprSiz = FileLen(strargFilPth) + ReDim bytaryCpr(lngCprSiz - 1) + Open strargFilPth For Binary Access Read As #1 + Get #1, , bytaryCpr() + Close #1 + 'Read the original file size value: + lngOriSiz = bytaryCpr(lngCprSiz - 1) * (2 ^ 24) _ + + bytaryCpr(lngCprSiz - 2) * (2 ^ 16) _ + + bytaryCpr(lngCprSiz - 3) * (2 ^ 8) _ + + bytaryCpr(lngCprSiz - 4) + ReDim Preserve bytaryCpr(lngCprSiz - 5) 'Cut of the original size value + ReDim bytaryOri(lngOriSiz - 1) + If lngfncUcp(bytaryOri(0), lngOriSiz, bytaryCpr(0), lngCprSiz) = SUCCESS +Then + strOriPth = Left(strargFilPth, Len(strargFilPth) - Len(strFilExt)) + Open strOriPth For Binary Access Write As #1 + Put #1, , bytaryOri() + Close #1 + Else + MsgBox "Uncompression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub +Public Property Get lngPercentSmaller() As Long + lngPercentSmaller = lngpvtPcnSml +End Property diff --git a/deps/zlib-1.2.10/os400/README400 b/deps/zlib-1.2.10/os400/README400 new file mode 100644 index 0000000..28dca8c --- /dev/null +++ b/deps/zlib-1.2.10/os400/README400 @@ -0,0 +1,48 @@ + ZLIB version 1.2.10 for OS/400 installation instructions + +1) Download and unpack the zlib tarball to some IFS directory. + (i.e.: /path/to/the/zlib/ifs/source/directory) + + If the installed IFS command suppors gzip format, this is straightforward, +else you have to unpack first to some directory on a system supporting it, +then move the whole directory to the IFS via the network (via SMB or FTP). + +2) Edit the configuration parameters in the compilation script. + + EDTF STMF('/path/to/the/zlib/ifs/source/directory/os400/make.sh') + +Tune the parameters according to your needs if not matching the defaults. +Save the file and exit after edition. + +3) Enter qshell, then work in the zlib OS/400 specific directory. + + QSH + cd /path/to/the/zlib/ifs/source/directory/os400 + +4) Compile and install + + sh make.sh + +The script will: +- create the libraries, objects and IFS directories for the zlib environment, +- compile all modules, +- create a service program, +- create a static and a dynamic binding directory, +- install header files for C/C++ and for ILE/RPG, both for compilation in + DB2 and IFS environments. + +That's all. + + +Notes: For OS/400 ILE RPG programmers, a /copy member defining the ZLIB + API prototypes for ILE RPG can be found in ZLIB/H(ZLIB.INC). + In the ILE environment, the same definitions are available from + file zlib.inc located in the same IFS include directory as the + C/C++ header files. + Please read comments in this member for more information. + + Remember that most foreign textual data are ASCII coded: this + implementation does not handle conversion from/to ASCII, so + text data code conversions must be done explicitely. + + Mainly for the reason above, always open zipped files in binary mode. diff --git a/deps/zlib-1.2.10/os400/bndsrc b/deps/zlib-1.2.10/os400/bndsrc new file mode 100644 index 0000000..5e6e0a2 --- /dev/null +++ b/deps/zlib-1.2.10/os400/bndsrc @@ -0,0 +1,119 @@ +STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('ZLIB') + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.1.3 entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("adler32") + EXPORT SYMBOL("compress") + EXPORT SYMBOL("compress2") + EXPORT SYMBOL("crc32") + EXPORT SYMBOL("get_crc_table") + EXPORT SYMBOL("deflate") + EXPORT SYMBOL("deflateEnd") + EXPORT SYMBOL("deflateSetDictionary") + EXPORT SYMBOL("deflateCopy") + EXPORT SYMBOL("deflateReset") + EXPORT SYMBOL("deflateParams") + EXPORT SYMBOL("deflatePrime") + EXPORT SYMBOL("deflateInit_") + EXPORT SYMBOL("deflateInit2_") + EXPORT SYMBOL("gzopen") + EXPORT SYMBOL("gzdopen") + EXPORT SYMBOL("gzsetparams") + EXPORT SYMBOL("gzread") + EXPORT SYMBOL("gzwrite") + EXPORT SYMBOL("gzprintf") + EXPORT SYMBOL("gzputs") + EXPORT SYMBOL("gzgets") + EXPORT SYMBOL("gzputc") + EXPORT SYMBOL("gzgetc") + EXPORT SYMBOL("gzflush") + EXPORT SYMBOL("gzseek") + EXPORT SYMBOL("gzrewind") + EXPORT SYMBOL("gztell") + EXPORT SYMBOL("gzeof") + EXPORT SYMBOL("gzclose") + EXPORT SYMBOL("gzerror") + EXPORT SYMBOL("inflate") + EXPORT SYMBOL("inflateEnd") + EXPORT SYMBOL("inflateSetDictionary") + EXPORT SYMBOL("inflateSync") + EXPORT SYMBOL("inflateReset") + EXPORT SYMBOL("inflateInit_") + EXPORT SYMBOL("inflateInit2_") + EXPORT SYMBOL("inflateSyncPoint") + EXPORT SYMBOL("uncompress") + EXPORT SYMBOL("zlibVersion") + EXPORT SYMBOL("zError") + EXPORT SYMBOL("z_errmsg") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.1 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("compressBound") + EXPORT SYMBOL("deflateBound") + EXPORT SYMBOL("deflatePending") + EXPORT SYMBOL("gzungetc") + EXPORT SYMBOL("gzclearerr") + EXPORT SYMBOL("inflateBack") + EXPORT SYMBOL("inflateBackEnd") + EXPORT SYMBOL("inflateBackInit_") + EXPORT SYMBOL("inflateCopy") + EXPORT SYMBOL("zlibCompileFlags") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.4 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("adler32_combine") + EXPORT SYMBOL("adler32_combine64") + EXPORT SYMBOL("crc32_combine") + EXPORT SYMBOL("crc32_combine64") + EXPORT SYMBOL("deflateSetHeader") + EXPORT SYMBOL("deflateTune") + EXPORT SYMBOL("gzbuffer") + EXPORT SYMBOL("gzclose_r") + EXPORT SYMBOL("gzclose_w") + EXPORT SYMBOL("gzdirect") + EXPORT SYMBOL("gzoffset") + EXPORT SYMBOL("gzoffset64") + EXPORT SYMBOL("gzopen64") + EXPORT SYMBOL("gzseek64") + EXPORT SYMBOL("gztell64") + EXPORT SYMBOL("inflateGetHeader") + EXPORT SYMBOL("inflateMark") + EXPORT SYMBOL("inflatePrime") + EXPORT SYMBOL("inflateReset2") + EXPORT SYMBOL("inflateUndermine") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.6 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("deflateResetKeep") + EXPORT SYMBOL("gzgetc_") + EXPORT SYMBOL("inflateResetKeep") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.8 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("gzvprintf") + EXPORT SYMBOL("inflateGetDictionary") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.9 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("adler32_z") + EXPORT SYMBOL("crc32_z") + EXPORT SYMBOL("deflateGetDictionary") + EXPORT SYMBOL("gzfread") + EXPORT SYMBOL("gzfwrite") + EXPORT SYMBOL("inflateCodesUsed") + EXPORT SYMBOL("inflateValidate") + EXPORT SYMBOL("uncompress2") + +ENDPGMEXP diff --git a/deps/zlib-1.2.10/os400/make.sh b/deps/zlib-1.2.10/os400/make.sh new file mode 100644 index 0000000..ddbfb16 --- /dev/null +++ b/deps/zlib-1.2.10/os400/make.sh @@ -0,0 +1,366 @@ +#!/bin/sh +# +# ZLIB compilation script for the OS/400. +# +# +# This is a shell script since make is not a standard component of OS/400. + + +################################################################################ +# +# Tunable configuration parameters. +# +################################################################################ + +TARGETLIB='ZLIB' # Target OS/400 program library +STATBNDDIR='ZLIB_A' # Static binding directory. +DYNBNDDIR='ZLIB' # Dynamic binding directory. +SRVPGM="ZLIB" # Service program. +IFSDIR='/zlib' # IFS support base directory. +TGTCCSID='500' # Target CCSID of objects +DEBUG='*NONE' # Debug level +OPTIMIZE='40' # Optimisation level +OUTPUT='*NONE' # Compilation output option. +TGTRLS='V6R1M0' # Target OS release + +export TARGETLIB STATBNDDIR DYNBNDDIR SRVPGM IFSDIR +export TGTCCSID DEBUG OPTIMIZE OUTPUT TGTRLS + + +################################################################################ +# +# OS/400 specific definitions. +# +################################################################################ + +LIBIFSNAME="/QSYS.LIB/${TARGETLIB}.LIB" + + +################################################################################ +# +# Procedures. +# +################################################################################ + +# action_needed dest [src] +# +# dest is an object to build +# if specified, src is an object on which dest depends. +# +# exit 0 (succeeds) if some action has to be taken, else 1. + +action_needed() + +{ + [ ! -e "${1}" ] && return 0 + [ "${2}" ] || return 1 + [ "${1}" -ot "${2}" ] && return 0 + return 1 +} + + +# make_module module_name source_name [additional_definitions] +# +# Compile source name into module if needed. +# As side effect, append the module name to variable MODULES. +# Set LINK to "YES" if the module has been compiled. + +make_module() + +{ + MODULES="${MODULES} ${1}" + MODIFSNAME="${LIBIFSNAME}/${1}.MODULE" + CSRC="`basename \"${2}\"`" + + if action_needed "${MODIFSNAME}" "${2}" + then : + elif [ ! "`sed -e \"//,/<\\\\/source>/!d\" \ + -e '/ tmphdrfile + + # Need to translate to target CCSID. + + CMD="CPY OBJ('`pwd`/tmphdrfile') TOOBJ('${DEST}')" + CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)" + system "${CMD}" + # touch -r "${HFILE}" "${DEST}" + rm -f tmphdrfile + fi + + IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`" + + if action_needed "${IFSFILE}" "${DEST}" + then rm -f "${IFSFILE}" + ln -s "${DEST}" "${IFSFILE}" + fi +done + + +# Install the ILE/RPG header file. + + +HFILE="${SCRIPTDIR}/zlib.inc" +DEST="${SRCPF}/ZLIB.INC.MBR" + +if action_needed "${DEST}" "${HFILE}" +then CMD="CPY OBJ('${HFILE}') TOOBJ('${DEST}')" + CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)" + system "${CMD}" + # touch -r "${HFILE}" "${DEST}" +fi + +IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`" + +if action_needed "${IFSFILE}" "${DEST}" +then rm -f "${IFSFILE}" + ln -s "${DEST}" "${IFSFILE}" +fi + + +# Create and compile the identification source file. + +echo '#pragma comment(user, "ZLIB version '"${VERSION}"'")' > os400.c +echo '#pragma comment(user, __DATE__)' >> os400.c +echo '#pragma comment(user, __TIME__)' >> os400.c +echo '#pragma comment(copyright, "Copyright (C) 1995-2016 Jean-Loup Gailly, Mark Adler. OS/400 version by P. Monnerat.")' >> os400.c +make_module OS400 os400.c +LINK= # No need to rebuild service program yet. +MODULES= + + +# Get source list. + +CSOURCES=`sed -e '/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Library + + Medium + + 2.0 + + + + zlib + zlib + alain.bonnefoy@icbt.com + Public + public + www.gzip.org/zlib + + + Jean-Loup Gailly,Mark Adler + www.gzip.org/zlib + + zlib@gzip.org + + + A massively spiffy yet delicately unobtrusive compression library. + zlib is designed to be a free, general-purpose, legally unencumbered, lossless data compression library for use on virtually any computer hardware and operating system. + http://www.gzip.org/zlib + + + + + 1.2.10 + Medium + Stable + + + + + + + No License + + + + Software Development/Libraries and Extensions/C Libraries + zlib,compression + qnx6 + qnx6 + None + Developer + + + + + + + + + + + + + + Install + Post + No + Ignore + + No + Optional + + + + + + + + + + + + + InstallOver + zlib + + + + + + + + + + + + + InstallOver + zlib-dev + + + + + + + + + diff --git a/deps/zlib-1.2.10/test/example.c b/deps/zlib-1.2.10/test/example.c new file mode 100644 index 0000000..eee17ce --- /dev/null +++ b/deps/zlib-1.2.10/test/example.c @@ -0,0 +1,602 @@ +/* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2006, 2011, 2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zlib.h" +#include + +#ifdef STDC +# include +# include +#endif + +#if defined(VMS) || defined(RISCOS) +# define TESTFILE "foo-gz" +#else +# define TESTFILE "foo.gz" +#endif + +#define CHECK_ERR(err, msg) { \ + if (err != Z_OK) { \ + fprintf(stderr, "%s error: %d\n", msg, err); \ + exit(1); \ + } \ +} + +static z_const char hello[] = "hello, hello!"; +/* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + */ + +static const char dictionary[] = "hello"; +static uLong dictId; /* Adler32 value of the dictionary */ + +void test_deflate OF((Byte *compr, uLong comprLen)); +void test_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_deflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_flush OF((Byte *compr, uLong *comprLen)); +void test_sync OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_dict_deflate OF((Byte *compr, uLong comprLen)); +void test_dict_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +int main OF((int argc, char *argv[])); + + +#ifdef Z_SOLO + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + (void)q; + return calloc(n, m); +} + +void myfree(void *q, void *p) +{ + (void)q; + free(p); +} + +static alloc_func zalloc = myalloc; +static free_func zfree = myfree; + +#else /* !Z_SOLO */ + +static alloc_func zalloc = (alloc_func)0; +static free_func zfree = (free_func)0; + +void test_compress OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_gzio OF((const char *fname, + Byte *uncompr, uLong uncomprLen)); + +/* =========================================================================== + * Test compress() and uncompress() + */ +void test_compress(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + uLong len = (uLong)strlen(hello)+1; + + err = compress(compr, &comprLen, (const Bytef*)hello, len); + CHECK_ERR(err, "compress"); + + strcpy((char*)uncompr, "garbage"); + + err = uncompress(uncompr, &uncomprLen, compr, comprLen); + CHECK_ERR(err, "uncompress"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad uncompress\n"); + exit(1); + } else { + printf("uncompress(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test read/write of .gz files + */ +void test_gzio(fname, uncompr, uncomprLen) + const char *fname; /* compressed file name */ + Byte *uncompr; + uLong uncomprLen; +{ +#ifdef NO_GZCOMPRESS + fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); +#else + int err; + int len = (int)strlen(hello)+1; + gzFile file; + z_off_t pos; + + file = gzopen(fname, "wb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + gzputc(file, 'h'); + if (gzputs(file, "ello") != 4) { + fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); + exit(1); + } + if (gzprintf(file, ", %s!", "hello") != 8) { + fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); + exit(1); + } + gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ + gzclose(file); + + file = gzopen(fname, "rb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + strcpy((char*)uncompr, "garbage"); + + if (gzread(file, uncompr, (unsigned)uncomprLen) != len) { + fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); + exit(1); + } else { + printf("gzread(): %s\n", (char*)uncompr); + } + + pos = gzseek(file, -8L, SEEK_CUR); + if (pos != 6 || gztell(file) != pos) { + fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", + (long)pos, (long)gztell(file)); + exit(1); + } + + if (gzgetc(file) != ' ') { + fprintf(stderr, "gzgetc error\n"); + exit(1); + } + + if (gzungetc(' ', file) != ' ') { + fprintf(stderr, "gzungetc error\n"); + exit(1); + } + + gzgets(file, (char*)uncompr, (int)uncomprLen); + if (strlen((char*)uncompr) != 7) { /* " hello!" */ + fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello + 6)) { + fprintf(stderr, "bad gzgets after gzseek\n"); + exit(1); + } else { + printf("gzgets() after gzseek: %s\n", (char*)uncompr); + } + + gzclose(file); +#endif +} + +#endif /* Z_SOLO */ + +/* =========================================================================== + * Test deflate() with small buffers + */ +void test_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uLong len = (uLong)strlen(hello)+1; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.next_out = compr; + + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + } + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = deflate(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } + + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with small buffers + */ +void test_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 0; + d_stream.next_out = uncompr; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { + d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate\n"); + exit(1); + } else { + printf("inflate(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test deflate() with large buffers and dynamic change of compression level + */ +void test_large_deflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_SPEED); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + /* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + */ + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + if (c_stream.avail_in != 0) { + fprintf(stderr, "deflate not greedy\n"); + exit(1); + } + + /* Feed in already compressed data and switch to no compression: */ + deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in = compr; + c_stream.avail_in = (uInt)comprLen/2; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + /* Switch back to compressing mode: */ + deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with large buffers + */ +void test_large_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + for (;;) { + d_stream.next_out = uncompr; /* discard the output */ + d_stream.avail_out = (uInt)uncomprLen; + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "large inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (d_stream.total_out != 2*uncomprLen + comprLen/2) { + fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); + exit(1); + } else { + printf("large_inflate(): OK\n"); + } +} + +/* =========================================================================== + * Test deflate() with full flush + */ +void test_flush(compr, comprLen) + Byte *compr; + uLong *comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uInt len = (uInt)strlen(hello)+1; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.next_out = compr; + c_stream.avail_in = 3; + c_stream.avail_out = (uInt)*comprLen; + err = deflate(&c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, "deflate"); + + compr[3]++; /* force an error in first compressed block */ + c_stream.avail_in = len - 3; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + CHECK_ERR(err, "deflate"); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + *comprLen = c_stream.total_out; +} + +/* =========================================================================== + * Test inflateSync() + */ +void test_sync(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 2; /* just read the zlib header */ + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + err = inflate(&d_stream, Z_NO_FLUSH); + CHECK_ERR(err, "inflate"); + + d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ + err = inflateSync(&d_stream); /* but skip the damaged part */ + CHECK_ERR(err, "inflateSync"); + + err = inflate(&d_stream, Z_FINISH); + if (err != Z_DATA_ERROR) { + fprintf(stderr, "inflate should report DATA_ERROR\n"); + /* Because of incorrect adler32 */ + exit(1); + } + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + printf("after inflateSync(): hel%s\n", (char *)uncompr); +} + +/* =========================================================================== + * Test deflate() with preset dictionary + */ +void test_dict_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + err = deflateSetDictionary(&c_stream, + (const Bytef*)dictionary, (int)sizeof(dictionary)); + CHECK_ERR(err, "deflateSetDictionary"); + + dictId = c_stream.adler; + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.avail_in = (uInt)strlen(hello)+1; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with a preset dictionary + */ +void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + for (;;) { + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + if (err == Z_NEED_DICT) { + if (d_stream.adler != dictId) { + fprintf(stderr, "unexpected dictionary"); + exit(1); + } + err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, + (int)sizeof(dictionary)); + } + CHECK_ERR(err, "inflate with dict"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate with dict\n"); + exit(1); + } else { + printf("inflate with dictionary: %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Usage: example [output.gz [input.gz]] + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + Byte *compr, *uncompr; + uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ + uLong uncomprLen = comprLen; + static const char* myVersion = ZLIB_VERSION; + + if (zlibVersion()[0] != myVersion[0]) { + fprintf(stderr, "incompatible zlib version\n"); + exit(1); + + } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { + fprintf(stderr, "warning: different zlib version\n"); + } + + printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", + ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags()); + + compr = (Byte*)calloc((uInt)comprLen, 1); + uncompr = (Byte*)calloc((uInt)uncomprLen, 1); + /* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + */ + if (compr == Z_NULL || uncompr == Z_NULL) { + printf("out of memory\n"); + exit(1); + } + +#ifdef Z_SOLO + (void)argc; + (void)argv; +#else + test_compress(compr, comprLen, uncompr, uncomprLen); + + test_gzio((argc > 1 ? argv[1] : TESTFILE), + uncompr, uncomprLen); +#endif + + test_deflate(compr, comprLen); + test_inflate(compr, comprLen, uncompr, uncomprLen); + + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + + test_flush(compr, &comprLen); + test_sync(compr, comprLen, uncompr, uncomprLen); + comprLen = uncomprLen; + + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + + free(compr); + free(uncompr); + + return 0; +} diff --git a/deps/zlib-1.2.10/test/infcover.c b/deps/zlib-1.2.10/test/infcover.c new file mode 100644 index 0000000..2be0164 --- /dev/null +++ b/deps/zlib-1.2.10/test/infcover.c @@ -0,0 +1,671 @@ +/* infcover.c -- test zlib's inflate routines with full code coverage + * Copyright (C) 2011, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* to use, do: ./configure --cover && make cover */ + +#include +#include +#include +#include +#include "zlib.h" + +/* get definition of internal structure so we can mess with it (see pull()), + and so we can call inflate_trees() (see cover5()) */ +#define ZLIB_INTERNAL +#include "inftrees.h" +#include "inflate.h" + +#define local static + +/* -- memory tracking routines -- */ + +/* + These memory tracking routines are provided to zlib and track all of zlib's + allocations and deallocations, check for LIFO operations, keep a current + and high water mark of total bytes requested, optionally set a limit on the + total memory that can be allocated, and when done check for memory leaks. + + They are used as follows: + + z_stream strm; + mem_setup(&strm) initializes the memory tracking and sets the + zalloc, zfree, and opaque members of strm to use + memory tracking for all zlib operations on strm + mem_limit(&strm, limit) sets a limit on the total bytes requested -- a + request that exceeds this limit will result in an + allocation failure (returns NULL) -- setting the + limit to zero means no limit, which is the default + after mem_setup() + mem_used(&strm, "msg") prints to stderr "msg" and the total bytes used + mem_high(&strm, "msg") prints to stderr "msg" and the high water mark + mem_done(&strm, "msg") ends memory tracking, releases all allocations + for the tracking as well as leaked zlib blocks, if + any. If there was anything unusual, such as leaked + blocks, non-FIFO frees, or frees of addresses not + allocated, then "msg" and information about the + problem is printed to stderr. If everything is + normal, nothing is printed. mem_done resets the + strm members to Z_NULL to use the default memory + allocation routines on the next zlib initialization + using strm. + */ + +/* these items are strung together in a linked list, one for each allocation */ +struct mem_item { + void *ptr; /* pointer to allocated memory */ + size_t size; /* requested size of allocation */ + struct mem_item *next; /* pointer to next item in list, or NULL */ +}; + +/* this structure is at the root of the linked list, and tracks statistics */ +struct mem_zone { + struct mem_item *first; /* pointer to first item in list, or NULL */ + size_t total, highwater; /* total allocations, and largest total */ + size_t limit; /* memory allocation limit, or 0 if no limit */ + int notlifo, rogue; /* counts of non-LIFO frees and rogue frees */ +}; + +/* memory allocation routine to pass to zlib */ +local void *mem_alloc(void *mem, unsigned count, unsigned size) +{ + void *ptr; + struct mem_item *item; + struct mem_zone *zone = mem; + size_t len = count * (size_t)size; + + /* induced allocation failure */ + if (zone == NULL || (zone->limit && zone->total + len > zone->limit)) + return NULL; + + /* perform allocation using the standard library, fill memory with a + non-zero value to make sure that the code isn't depending on zeros */ + ptr = malloc(len); + if (ptr == NULL) + return NULL; + memset(ptr, 0xa5, len); + + /* create a new item for the list */ + item = malloc(sizeof(struct mem_item)); + if (item == NULL) { + free(ptr); + return NULL; + } + item->ptr = ptr; + item->size = len; + + /* insert item at the beginning of the list */ + item->next = zone->first; + zone->first = item; + + /* update the statistics */ + zone->total += item->size; + if (zone->total > zone->highwater) + zone->highwater = zone->total; + + /* return the allocated memory */ + return ptr; +} + +/* memory free routine to pass to zlib */ +local void mem_free(void *mem, void *ptr) +{ + struct mem_item *item, *next; + struct mem_zone *zone = mem; + + /* if no zone, just do a free */ + if (zone == NULL) { + free(ptr); + return; + } + + /* point next to the item that matches ptr, or NULL if not found -- remove + the item from the linked list if found */ + next = zone->first; + if (next) { + if (next->ptr == ptr) + zone->first = next->next; /* first one is it, remove from list */ + else { + do { /* search the linked list */ + item = next; + next = item->next; + } while (next != NULL && next->ptr != ptr); + if (next) { /* if found, remove from linked list */ + item->next = next->next; + zone->notlifo++; /* not a LIFO free */ + } + + } + } + + /* if found, update the statistics and free the item */ + if (next) { + zone->total -= next->size; + free(next); + } + + /* if not found, update the rogue count */ + else + zone->rogue++; + + /* in any case, do the requested free with the standard library function */ + free(ptr); +} + +/* set up a controlled memory allocation space for monitoring, set the stream + parameters to the controlled routines, with opaque pointing to the space */ +local void mem_setup(z_stream *strm) +{ + struct mem_zone *zone; + + zone = malloc(sizeof(struct mem_zone)); + assert(zone != NULL); + zone->first = NULL; + zone->total = 0; + zone->highwater = 0; + zone->limit = 0; + zone->notlifo = 0; + zone->rogue = 0; + strm->opaque = zone; + strm->zalloc = mem_alloc; + strm->zfree = mem_free; +} + +/* set a limit on the total memory allocation, or 0 to remove the limit */ +local void mem_limit(z_stream *strm, size_t limit) +{ + struct mem_zone *zone = strm->opaque; + + zone->limit = limit; +} + +/* show the current total requested allocations in bytes */ +local void mem_used(z_stream *strm, char *prefix) +{ + struct mem_zone *zone = strm->opaque; + + fprintf(stderr, "%s: %lu allocated\n", prefix, zone->total); +} + +/* show the high water allocation in bytes */ +local void mem_high(z_stream *strm, char *prefix) +{ + struct mem_zone *zone = strm->opaque; + + fprintf(stderr, "%s: %lu high water mark\n", prefix, zone->highwater); +} + +/* release the memory allocation zone -- if there are any surprises, notify */ +local void mem_done(z_stream *strm, char *prefix) +{ + int count = 0; + struct mem_item *item, *next; + struct mem_zone *zone = strm->opaque; + + /* show high water mark */ + mem_high(strm, prefix); + + /* free leftover allocations and item structures, if any */ + item = zone->first; + while (item != NULL) { + free(item->ptr); + next = item->next; + free(item); + item = next; + count++; + } + + /* issue alerts about anything unexpected */ + if (count || zone->total) + fprintf(stderr, "** %s: %lu bytes in %d blocks not freed\n", + prefix, zone->total, count); + if (zone->notlifo) + fprintf(stderr, "** %s: %d frees not LIFO\n", prefix, zone->notlifo); + if (zone->rogue) + fprintf(stderr, "** %s: %d frees not recognized\n", + prefix, zone->rogue); + + /* free the zone and delete from the stream */ + free(zone); + strm->opaque = Z_NULL; + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; +} + +/* -- inflate test routines -- */ + +/* Decode a hexadecimal string, set *len to length, in[] to the bytes. This + decodes liberally, in that hex digits can be adjacent, in which case two in + a row writes a byte. Or they can be delimited by any non-hex character, + where the delimiters are ignored except when a single hex digit is followed + by a delimiter, where that single digit writes a byte. The returned data is + allocated and must eventually be freed. NULL is returned if out of memory. + If the length is not needed, then len can be NULL. */ +local unsigned char *h2b(const char *hex, unsigned *len) +{ + unsigned char *in, *re; + unsigned next, val; + + in = malloc((strlen(hex) + 1) >> 1); + if (in == NULL) + return NULL; + next = 0; + val = 1; + do { + if (*hex >= '0' && *hex <= '9') + val = (val << 4) + *hex - '0'; + else if (*hex >= 'A' && *hex <= 'F') + val = (val << 4) + *hex - 'A' + 10; + else if (*hex >= 'a' && *hex <= 'f') + val = (val << 4) + *hex - 'a' + 10; + else if (val != 1 && val < 32) /* one digit followed by delimiter */ + val += 240; /* make it look like two digits */ + if (val > 255) { /* have two digits */ + in[next++] = val & 0xff; /* save the decoded byte */ + val = 1; /* start over */ + } + } while (*hex++); /* go through the loop with the terminating null */ + if (len != NULL) + *len = next; + re = realloc(in, next); + return re == NULL ? in : re; +} + +/* generic inflate() run, where hex is the hexadecimal input data, what is the + text to include in an error message, step is how much input data to feed + inflate() on each call, or zero to feed it all, win is the window bits + parameter to inflateInit2(), len is the size of the output buffer, and err + is the error code expected from the first inflate() call (the second + inflate() call is expected to return Z_STREAM_END). If win is 47, then + header information is collected with inflateGetHeader(). If a zlib stream + is looking for a dictionary, then an empty dictionary is provided. + inflate() is run until all of the input data is consumed. */ +local void inf(char *hex, char *what, unsigned step, int win, unsigned len, + int err) +{ + int ret; + unsigned have; + unsigned char *in, *out; + z_stream strm, copy; + gz_header head; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, win); + if (ret != Z_OK) { + mem_done(&strm, what); + return; + } + out = malloc(len); assert(out != NULL); + if (win == 47) { + head.extra = out; + head.extra_max = len; + head.name = out; + head.name_max = len; + head.comment = out; + head.comm_max = len; + ret = inflateGetHeader(&strm, &head); assert(ret == Z_OK); + } + in = h2b(hex, &have); assert(in != NULL); + if (step == 0 || step > have) + step = have; + strm.avail_in = step; + have -= step; + strm.next_in = in; + do { + strm.avail_out = len; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); assert(err == 9 || ret == err); + if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT) + break; + if (ret == Z_NEED_DICT) { + ret = inflateSetDictionary(&strm, in, 1); + assert(ret == Z_DATA_ERROR); + mem_limit(&strm, 1); + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ((struct inflate_state *)strm.state)->mode = DICT; + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_OK); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_BUF_ERROR); + } + ret = inflateCopy(©, &strm); assert(ret == Z_OK); + ret = inflateEnd(©); assert(ret == Z_OK); + err = 9; /* don't care next time around */ + have += strm.avail_in; + strm.avail_in = step > have ? have : step; + have -= strm.avail_in; + } while (strm.avail_in); + free(in); + free(out); + ret = inflateReset2(&strm, -8); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, what); +} + +/* cover all of the lines in inflate.c up to inflate() */ +local void cover_support(void) +{ + int ret; + z_stream strm; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + mem_used(&strm, "inflate init"); + ret = inflatePrime(&strm, 5, 31); assert(ret == Z_OK); + ret = inflatePrime(&strm, -1, 0); assert(ret == Z_OK); + ret = inflateSetDictionary(&strm, Z_NULL, 0); + assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "prime"); + + inf("63 0", "force window allocation", 0, -15, 1, Z_OK); + inf("63 18 5", "force window replacement", 0, -8, 259, Z_OK); + inf("63 18 68 30 d0 0 0", "force split window update", 4, -8, 259, Z_OK); + inf("3 0", "use fixed blocks", 0, -15, 1, Z_STREAM_END); + inf("", "bad window size", 0, 1, 0, Z_STREAM_ERROR); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream)); + assert(ret == Z_VERSION_ERROR); + mem_done(&strm, "wrong version"); + + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + fputs("inflate built-in memory routines\n", stderr); +} + +/* cover all inflate() header and trailer cases and code after inflate() */ +local void cover_wrap(void) +{ + int ret; + z_stream strm, copy; + unsigned char dict[257]; + + ret = inflate(Z_NULL, 0); assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + ret = inflateCopy(Z_NULL, Z_NULL); assert(ret == Z_STREAM_ERROR); + fputs("inflate bad parameters\n", stderr); + + inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR); + inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR); + inf("77 85", "bad zlib method", 0, 15, 0, Z_DATA_ERROR); + inf("8 99", "set window size from header", 0, 0, 0, Z_OK); + inf("78 9c", "bad zlib window size", 0, 8, 0, Z_DATA_ERROR); + inf("78 9c 63 0 0 0 1 0 1", "check adler32", 0, 15, 1, Z_STREAM_END); + inf("1f 8b 8 1e 0 0 0 0 0 0 1 0 0 0 0 0 0", "bad header crc", 0, 47, 1, + Z_DATA_ERROR); + inf("1f 8b 8 2 0 0 0 0 0 0 1d 26 3 0 0 0 0 0 0 0 0 0", "check gzip length", + 0, 47, 0, Z_STREAM_END); + inf("78 90", "bad zlib header check", 0, 47, 0, Z_DATA_ERROR); + inf("8 b8 0 0 0 1", "need dictionary", 0, 8, 0, Z_NEED_DICT); + inf("78 9c 63 0", "compute adler32", 0, 15, 1, Z_OK); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -8); + strm.avail_in = 2; + strm.next_in = (void *)"\x63"; + strm.avail_out = 1; + strm.next_out = (void *)&ret; + mem_limit(&strm, 1); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + memset(dict, 0, 257); + ret = inflateSetDictionary(&strm, dict, 257); + assert(ret == Z_OK); + mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256); + ret = inflatePrime(&strm, 16, 0); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (void *)"\x80"; + ret = inflateSync(&strm); assert(ret == Z_DATA_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_STREAM_ERROR); + strm.avail_in = 4; + strm.next_in = (void *)"\0\0\xff\xff"; + ret = inflateSync(&strm); assert(ret == Z_OK); + (void)inflateSyncPoint(&strm); + ret = inflateCopy(©, &strm); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ret = inflateUndermine(&strm, 1); assert(ret == Z_DATA_ERROR); + (void)inflateMark(&strm); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "miscellaneous, force memory errors"); +} + +/* input and output functions for inflateBack() */ +local unsigned pull(void *desc, unsigned char **buf) +{ + static unsigned int next = 0; + static unsigned char dat[] = {0x63, 0, 2, 0}; + struct inflate_state *state; + + if (desc == Z_NULL) { + next = 0; + return 0; /* no input (already provided at next_in) */ + } + state = (void *)((z_stream *)desc)->state; + if (state != Z_NULL) + state->mode = SYNC; /* force an otherwise impossible situation */ + return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0; +} + +local int push(void *desc, unsigned char *buf, unsigned len) +{ + buf += len; + return desc != Z_NULL; /* force error if desc not null */ +} + +/* cover inflateBack() up to common deflate data cases and after those */ +local void cover_back(void) +{ + int ret; + z_stream strm; + unsigned char win[32768]; + + ret = inflateBackInit_(Z_NULL, 0, win, 0, 0); + assert(ret == Z_VERSION_ERROR); + ret = inflateBackInit(Z_NULL, 0, win); assert(ret == Z_STREAM_ERROR); + ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + fputs("inflateBack bad parameters\n", stderr); + + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (void *)"\x03"; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret == Z_STREAM_END); + /* force output error */ + strm.avail_in = 3; + strm.next_in = (void *)"\x63\x00"; + ret = inflateBack(&strm, pull, Z_NULL, push, &strm); + assert(ret == Z_BUF_ERROR); + /* force mode error by mucking with state */ + ret = inflateBack(&strm, pull, &strm, push, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "inflateBack bad state"); + + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + fputs("inflateBack built-in memory routines\n", stderr); +} + +/* do a raw inflate of data in hexadecimal with both inflate and inflateBack */ +local int try(char *hex, char *id, int err) +{ + int ret; + unsigned len, size; + unsigned char *in, *out, *win; + char *prefix; + z_stream strm; + + /* convert to hex */ + in = h2b(hex, &len); + assert(in != NULL); + + /* allocate work areas */ + size = len << 3; + out = malloc(size); + assert(out != NULL); + win = malloc(32768); + assert(win != NULL); + prefix = malloc(strlen(id) + 6); + assert(prefix != NULL); + + /* first with inflate */ + strcpy(prefix, id); + strcat(prefix, "-late"); + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, err < 0 ? 47 : -15); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + do { + strm.avail_out = size; + strm.next_out = out; + ret = inflate(&strm, Z_TREES); + assert(ret != Z_STREAM_ERROR && ret != Z_MEM_ERROR); + if (ret == Z_DATA_ERROR || ret == Z_NEED_DICT) + break; + } while (strm.avail_in || strm.avail_out == 0); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateEnd(&strm); + mem_done(&strm, prefix); + + /* then with inflateBack */ + if (err >= 0) { + strcpy(prefix, id); + strcat(prefix, "-back"); + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret != Z_STREAM_ERROR); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateBackEnd(&strm); + mem_done(&strm, prefix); + } + + /* clean up */ + free(prefix); + free(win); + free(out); + free(in); + return ret; +} + +/* cover deflate data cases in both inflate() and inflateBack() */ +local void cover_inflate(void) +{ + try("0 0 0 0 0", "invalid stored block lengths", 1); + try("3 0", "fixed", 0); + try("6", "invalid block type", 1); + try("1 1 0 fe ff 0", "stored", 0); + try("fc 0 0", "too many length or distance symbols", 1); + try("4 0 fe ff", "invalid code lengths set", 1); + try("4 0 24 49 0", "invalid bit length repeat", 1); + try("4 0 24 e9 ff ff", "invalid bit length repeat", 1); + try("4 0 24 e9 ff 6d", "invalid code -- missing end-of-block", 1); + try("4 80 49 92 24 49 92 24 71 ff ff 93 11 0", + "invalid literal/lengths set", 1); + try("4 80 49 92 24 49 92 24 f b4 ff ff c3 84", "invalid distances set", 1); + try("4 c0 81 8 0 0 0 0 20 7f eb b 0 0", "invalid literal/length code", 1); + try("2 7e ff ff", "invalid distance code", 1); + try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 1); + + /* also trailer mismatch just in inflate() */ + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 1", "incorrect data check", -1); + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1", + "incorrect length check", -1); + try("5 c0 21 d 0 0 0 80 b0 fe 6d 2f 91 6c", "pull 17", 0); + try("5 e0 81 91 24 cb b2 2c 49 e2 f 2e 8b 9a 47 56 9f fb fe ec d2 ff 1f", + "long code", 0); + try("ed c0 1 1 0 0 0 40 20 ff 57 1b 42 2c 4f", "length extra", 0); + try("ed cf c1 b1 2c 47 10 c4 30 fa 6f 35 1d 1 82 59 3d fb be 2e 2a fc f c", + "long distance and extra", 0); + try("ed c0 81 0 0 0 0 80 a0 fd a9 17 a9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6", "window end", 0); + inf("2 8 20 80 0 3 0", "inflate_fast TYPE return", 0, -15, 258, + Z_STREAM_END); + inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK); +} + +/* cover remaining lines in inftrees.c */ +local void cover_trees(void) +{ + int ret; + unsigned bits; + unsigned short lens[16], work[16]; + code *next, table[ENOUGH_DISTS]; + + /* we need to call inflate_table() directly in order to manifest not- + enough errors, since zlib insures that enough is always enough */ + for (bits = 0; bits < 15; bits++) + lens[bits] = (unsigned short)(bits + 1); + lens[15] = 15; + next = table; + bits = 15; + ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + assert(ret == 1); + next = table; + bits = 1; + ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + assert(ret == 1); + fputs("inflate_table not enough errors\n", stderr); +} + +/* cover remaining inffast.c decoding and window copying */ +local void cover_fast(void) +{ + inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68" + " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR); + inf("25 fd 81 b5 6d 59 b6 6a 49 ea af 35 6 34 eb 8c b9 f6 b9 1e ef 67 49" + " 50 fe ff ff 3f 0 0", "fast distance extra bits", 0, -8, 258, + Z_DATA_ERROR); + inf("3 7e 0 0 0 0 0", "fast invalid distance code", 0, -8, 258, + Z_DATA_ERROR); + inf("1b 7 0 0 0 0 0", "fast invalid literal/length code", 0, -8, 258, + Z_DATA_ERROR); + inf("d c7 1 ae eb 38 c 4 41 a0 87 72 de df fb 1f b8 36 b1 38 5d ff ff 0", + "fast 2nd level codes and too far back", 0, -8, 258, Z_DATA_ERROR); + inf("63 18 5 8c 10 8 0 0 0 0", "very common case", 0, -8, 259, Z_OK); + inf("63 60 60 18 c9 0 8 18 18 18 26 c0 28 0 29 0 0 0", + "contiguous and wrap around window", 6, -8, 259, Z_OK); + inf("63 0 3 0 0 0 0 0", "copy direct from output", 0, -8, 259, + Z_STREAM_END); +} + +int main(void) +{ + fprintf(stderr, "%s\n", zlibVersion()); + cover_support(); + cover_wrap(); + cover_back(); + cover_inflate(); + cover_trees(); + cover_fast(); + return 0; +} diff --git a/deps/zlib-1.2.10/test/minigzip.c b/deps/zlib-1.2.10/test/minigzip.c new file mode 100644 index 0000000..e22fb08 --- /dev/null +++ b/deps/zlib-1.2.10/test/minigzip.c @@ -0,0 +1,651 @@ +/* minigzip.c -- simulate gzip using the zlib compression library + * Copyright (C) 1995-2006, 2010, 2011, 2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * minigzip is a minimal implementation of the gzip utility. This is + * only an example of using zlib and isn't meant to replace the + * full-featured gzip. No attempt is made to deal with file systems + * limiting names to 14 or 8+3 characters, etc... Error checking is + * very limited. So use minigzip only for testing; use gzip for the + * real thing. On MSDOS, use only on file names without extension + * or in pipe mode. + */ + +/* @(#) $Id$ */ + +#include "zlib.h" +#include + +#ifdef STDC +# include +# include +#endif + +#ifdef USE_MMAP +# include +# include +# include +#endif + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# ifdef UNDER_CE +# include +# endif +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifdef VMS +# define unlink delete +# define GZ_SUFFIX "-gz" +#endif +#ifdef RISCOS +# define unlink remove +# define GZ_SUFFIX "-gz" +# define fileno(file) file->__file +#endif +#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fileno */ +#endif + +#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) +#ifndef WIN32 /* unlink already in stdio.h for WIN32 */ + extern int unlink OF((const char *)); +#endif +#endif + +#if defined(UNDER_CE) +# include +# define perror(s) pwinerror(s) + +/* Map the Windows error number in ERROR to a locale-dependent error + message string and return a pointer to it. Typically, the values + for ERROR come from GetLastError. + + The string pointed to shall not be modified by the application, + but may be overwritten by a subsequent call to strwinerror + + The strwinerror function does not change the current setting + of GetLastError. */ + +static char *strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +static void pwinerror (s) + const char *s; +{ + if (s && *s) + fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ())); + else + fprintf(stderr, "%s\n", strwinerror(GetLastError ())); +} + +#endif /* UNDER_CE */ + +#ifndef GZ_SUFFIX +# define GZ_SUFFIX ".gz" +#endif +#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) + +#define BUFLEN 16384 +#define MAX_NAME_LEN 1024 + +#ifdef MAXSEG_64K +# define local static + /* Needed for systems with limitation on stack size. */ +#else +# define local +#endif + +#ifdef Z_SOLO +/* for Z_SOLO, create simplified gz* functions using deflate and inflate */ + +#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE) +# include /* for unlink() */ +#endif + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + (void)q; + return calloc(n, m); +} + +void myfree(q, p) + void *q, *p; +{ + (void)q; + free(p); +} + +typedef struct gzFile_s { + FILE *file; + int write; + int err; + char *msg; + z_stream strm; +} *gzFile; + +gzFile gzopen OF((const char *, const char *)); +gzFile gzdopen OF((int, const char *)); +gzFile gz_open OF((const char *, int, const char *)); + +gzFile gzopen(path, mode) +const char *path; +const char *mode; +{ + return gz_open(path, -1, mode); +} + +gzFile gzdopen(fd, mode) +int fd; +const char *mode; +{ + return gz_open(NULL, fd, mode); +} + +gzFile gz_open(path, fd, mode) + const char *path; + int fd; + const char *mode; +{ + gzFile gz; + int ret; + + gz = malloc(sizeof(struct gzFile_s)); + if (gz == NULL) + return NULL; + gz->write = strchr(mode, 'w') != NULL; + gz->strm.zalloc = myalloc; + gz->strm.zfree = myfree; + gz->strm.opaque = Z_NULL; + if (gz->write) + ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0); + else { + gz->strm.next_in = 0; + gz->strm.avail_in = Z_NULL; + ret = inflateInit2(&(gz->strm), 15 + 16); + } + if (ret != Z_OK) { + free(gz); + return NULL; + } + gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") : + fopen(path, gz->write ? "wb" : "rb"); + if (gz->file == NULL) { + gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm)); + free(gz); + return NULL; + } + gz->err = 0; + gz->msg = ""; + return gz; +} + +int gzwrite OF((gzFile, const void *, unsigned)); + +int gzwrite(gz, buf, len) + gzFile gz; + const void *buf; + unsigned len; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL || !gz->write) + return 0; + strm = &(gz->strm); + strm->next_in = (void *)buf; + strm->avail_in = len; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_NO_FLUSH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + return len; +} + +int gzread OF((gzFile, void *, unsigned)); + +int gzread(gz, buf, len) + gzFile gz; + void *buf; + unsigned len; +{ + int ret; + unsigned got; + unsigned char in[1]; + z_stream *strm; + + if (gz == NULL || gz->write) + return 0; + if (gz->err) + return 0; + strm = &(gz->strm); + strm->next_out = (void *)buf; + strm->avail_out = len; + do { + got = fread(in, 1, 1, gz->file); + if (got == 0) + break; + strm->next_in = in; + strm->avail_in = 1; + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_DATA_ERROR) { + gz->err = Z_DATA_ERROR; + gz->msg = strm->msg; + return 0; + } + if (ret == Z_STREAM_END) + inflateReset(strm); + } while (strm->avail_out); + return len - strm->avail_out; +} + +int gzclose OF((gzFile)); + +int gzclose(gz) + gzFile gz; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL) + return Z_STREAM_ERROR; + strm = &(gz->strm); + if (gz->write) { + strm->next_in = Z_NULL; + strm->avail_in = 0; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_FINISH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + deflateEnd(strm); + } + else + inflateEnd(strm); + fclose(gz->file); + free(gz); + return Z_OK; +} + +const char *gzerror OF((gzFile, int *)); + +const char *gzerror(gz, err) + gzFile gz; + int *err; +{ + *err = gz->err; + return gz->msg; +} + +#endif + +static char *prog; + +void error OF((const char *msg)); +void gz_compress OF((FILE *in, gzFile out)); +#ifdef USE_MMAP +int gz_compress_mmap OF((FILE *in, gzFile out)); +#endif +void gz_uncompress OF((gzFile in, FILE *out)); +void file_compress OF((char *file, char *mode)); +void file_uncompress OF((char *file)); +int main OF((int argc, char *argv[])); + +/* =========================================================================== + * Display error message and exit + */ +void error(msg) + const char *msg; +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + +/* =========================================================================== + * Compress input to output then close both files. + */ + +void gz_compress(in, out) + FILE *in; + gzFile out; +{ + local char buf[BUFLEN]; + int len; + int err; + +#ifdef USE_MMAP + /* Try first compressing with mmap. If mmap fails (minigzip used in a + * pipe), use the normal fread loop. + */ + if (gz_compress_mmap(in, out) == Z_OK) return; +#endif + for (;;) { + len = (int)fread(buf, 1, sizeof(buf), in); + if (ferror(in)) { + perror("fread"); + exit(1); + } + if (len == 0) break; + + if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); + } + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); +} + +#ifdef USE_MMAP /* MMAP version, Miguel Albrecht */ + +/* Try compressing the input file at once using mmap. Return Z_OK if + * if success, Z_ERRNO otherwise. + */ +int gz_compress_mmap(in, out) + FILE *in; + gzFile out; +{ + int len; + int err; + int ifd = fileno(in); + caddr_t buf; /* mmap'ed buffer for the entire input file */ + off_t buf_len; /* length of the input file */ + struct stat sb; + + /* Determine the size of the file, needed for mmap: */ + if (fstat(ifd, &sb) < 0) return Z_ERRNO; + buf_len = sb.st_size; + if (buf_len <= 0) return Z_ERRNO; + + /* Now do the actual mmap: */ + buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); + if (buf == (caddr_t)(-1)) return Z_ERRNO; + + /* Compress the whole file at once: */ + len = gzwrite(out, (char *)buf, (unsigned)buf_len); + + if (len != (int)buf_len) error(gzerror(out, &err)); + + munmap(buf, buf_len); + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); + return Z_OK; +} +#endif /* USE_MMAP */ + +/* =========================================================================== + * Uncompress input to output then close both files. + */ +void gz_uncompress(in, out) + gzFile in; + FILE *out; +{ + local char buf[BUFLEN]; + int len; + int err; + + for (;;) { + len = gzread(in, buf, sizeof(buf)); + if (len < 0) error (gzerror(in, &err)); + if (len == 0) break; + + if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { + error("failed fwrite"); + } + } + if (fclose(out)) error("failed fclose"); + + if (gzclose(in) != Z_OK) error("failed gzclose"); +} + + +/* =========================================================================== + * Compress the given file: create a corresponding .gz file and remove the + * original. + */ +void file_compress(file, mode) + char *file; + char *mode; +{ + local char outfile[MAX_NAME_LEN]; + FILE *in; + gzFile out; + + if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outfile, sizeof(outfile), "%s%s", file, GZ_SUFFIX); +#else + strcpy(outfile, file); + strcat(outfile, GZ_SUFFIX); +#endif + + in = fopen(file, "rb"); + if (in == NULL) { + perror(file); + exit(1); + } + out = gzopen(outfile, mode); + if (out == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); + exit(1); + } + gz_compress(in, out); + + unlink(file); +} + + +/* =========================================================================== + * Uncompress the given file and remove the original. + */ +void file_uncompress(file) + char *file; +{ + local char buf[MAX_NAME_LEN]; + char *infile, *outfile; + FILE *out; + gzFile in; + unsigned len = strlen(file); + + if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf, sizeof(buf), "%s", file); +#else + strcpy(buf, file); +#endif + + if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { + infile = file; + outfile = buf; + outfile[len-3] = '\0'; + } else { + outfile = file; + infile = buf; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf + len, sizeof(buf) - len, "%s", GZ_SUFFIX); +#else + strcat(infile, GZ_SUFFIX); +#endif + } + in = gzopen(infile, "rb"); + if (in == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); + exit(1); + } + out = fopen(outfile, "wb"); + if (out == NULL) { + perror(file); + exit(1); + } + + gz_uncompress(in, out); + + unlink(infile); +} + + +/* =========================================================================== + * Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...] + * -c : write to standard output + * -d : decompress + * -f : compress with Z_FILTERED + * -h : compress with Z_HUFFMAN_ONLY + * -r : compress with Z_RLE + * -1 to -9 : compression level + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + int copyout = 0; + int uncompr = 0; + gzFile file; + char *bname, outmode[20]; + +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outmode, sizeof(outmode), "%s", "wb6 "); +#else + strcpy(outmode, "wb6 "); +#endif + + prog = argv[0]; + bname = strrchr(argv[0], '/'); + if (bname) + bname++; + else + bname = argv[0]; + argc--, argv++; + + if (!strcmp(bname, "gunzip")) + uncompr = 1; + else if (!strcmp(bname, "zcat")) + copyout = uncompr = 1; + + while (argc > 0) { + if (strcmp(*argv, "-c") == 0) + copyout = 1; + else if (strcmp(*argv, "-d") == 0) + uncompr = 1; + else if (strcmp(*argv, "-f") == 0) + outmode[3] = 'f'; + else if (strcmp(*argv, "-h") == 0) + outmode[3] = 'h'; + else if (strcmp(*argv, "-r") == 0) + outmode[3] = 'R'; + else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && + (*argv)[2] == 0) + outmode[2] = (*argv)[1]; + else + break; + argc--, argv++; + } + if (outmode[3] == ' ') + outmode[3] = 0; + if (argc == 0) { + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + if (uncompr) { + file = gzdopen(fileno(stdin), "rb"); + if (file == NULL) error("can't gzdopen stdin"); + gz_uncompress(file, stdout); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + gz_compress(stdin, file); + } + } else { + if (copyout) { + SET_BINARY_MODE(stdout); + } + do { + if (uncompr) { + if (copyout) { + file = gzopen(*argv, "rb"); + if (file == NULL) + fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); + else + gz_uncompress(file, stdout); + } else { + file_uncompress(*argv); + } + } else { + if (copyout) { + FILE * in = fopen(*argv, "rb"); + + if (in == NULL) { + perror(*argv); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + + gz_compress(in, file); + } + + } else { + file_compress(*argv, outmode); + } + } + } while (argv++, --argc); + } + return 0; +} diff --git a/deps/zlib-1.2.10/treebuild.xml b/deps/zlib-1.2.10/treebuild.xml new file mode 100644 index 0000000..a530cc0 --- /dev/null +++ b/deps/zlib-1.2.10/treebuild.xml @@ -0,0 +1,116 @@ + + + + zip compression library + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/zlib-1.2.10/trees.c b/deps/zlib-1.2.10/trees.c new file mode 100644 index 0000000..357f313 --- /dev/null +++ b/deps/zlib-1.2.10/trees.c @@ -0,0 +1,1203 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2016 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef ZLIB_DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local const static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local const static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local const static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, const ct_data *ltree, + const ct_data *dtree)); +local int detect_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef ZLIB_DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* !ZLIB_DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef ZLIB_DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (ush)value << s->bi_valid; + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= (ush)value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !ZLIB_DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = (int)value;\ + s->bi_buf |= (ush)val << s->bi_valid;\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* ZLIB_DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef ZLIB_DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void ZLIB_INTERNAL _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (unsigned)(bits + xbits); + if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); + } + if (overflow == 0) return; + + Tracev((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + unsigned code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = (ush)code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ + bi_windup(s); /* align on byte boundary */ + put_short(s, (ush)stored_len); + put_short(s, (ush)~stored_len); + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + s->pending += stored_len; +#ifdef ZLIB_DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; + s->bits_sent += 2*16; + s->bits_sent += stored_len<<3; +#endif +} + +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +void ZLIB_INTERNAL _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef ZLIB_DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+last, 3); + compress_block(s, (const ct_data *)static_ltree, + (const ct_data *)static_dtree); +#ifdef ZLIB_DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+last, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (const ct_data *)s->dyn_ltree, + (const ct_data *)s->dyn_dtree); +#ifdef ZLIB_DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); +#ifdef ZLIB_DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*last)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int ZLIB_INTERNAL _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + const ct_data *ltree; /* literal tree */ + const ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= (unsigned)base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(s) + deflate_state *s; +{ + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} diff --git a/deps/zlib-1.2.10/trees.h b/deps/zlib-1.2.10/trees.h new file mode 100644 index 0000000..d35639d --- /dev/null +++ b/deps/zlib-1.2.10/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/deps/zlib-1.2.10/trees.lo b/deps/zlib-1.2.10/trees.lo new file mode 100644 index 0000000..1ed4ad6 Binary files /dev/null and b/deps/zlib-1.2.10/trees.lo differ diff --git a/deps/zlib-1.2.10/trees.o b/deps/zlib-1.2.10/trees.o new file mode 100644 index 0000000..1ed4ad6 Binary files /dev/null and b/deps/zlib-1.2.10/trees.o differ diff --git a/deps/zlib-1.2.10/uncompr.c b/deps/zlib-1.2.10/uncompr.c new file mode 100644 index 0000000..f03a1a8 --- /dev/null +++ b/deps/zlib-1.2.10/uncompr.c @@ -0,0 +1,93 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. *sourceLen is + the byte length of the source buffer. Upon entry, *destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, + *destLen is the size of the decompressed data and *sourceLen is the number + of source bytes consumed. Upon return, source + *sourceLen points to the + first unused input byte. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, or + Z_DATA_ERROR if the input data was corrupted, including if the input data is + an incomplete zlib stream. +*/ +int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong *sourceLen; +{ + z_stream stream; + int err; + const uInt max = (uInt)-1; + uLong len, left; + Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */ + + len = *sourceLen; + if (*destLen) { + left = *destLen; + *destLen = 0; + } + else { + left = 1; + dest = buf; + } + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = 0; + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + stream.next_out = dest; + stream.avail_out = 0; + + do { + if (stream.avail_out == 0) { + stream.avail_out = left > (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = len > (uLong)max ? max : (uInt)len; + len -= stream.avail_in; + } + err = inflate(&stream, Z_NO_FLUSH); + } while (err == Z_OK); + + *sourceLen -= len + stream.avail_in; + if (dest != buf) + *destLen = stream.total_out; + else if (stream.total_out && err == Z_BUF_ERROR) + left = 1; + + inflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : + err == Z_NEED_DICT ? Z_DATA_ERROR : + err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR : + err; +} + +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return uncompress2(dest, destLen, source, &sourceLen); +} diff --git a/deps/zlib-1.2.10/uncompr.lo b/deps/zlib-1.2.10/uncompr.lo new file mode 100644 index 0000000..de981a3 Binary files /dev/null and b/deps/zlib-1.2.10/uncompr.lo differ diff --git a/deps/zlib-1.2.10/uncompr.o b/deps/zlib-1.2.10/uncompr.o new file mode 100644 index 0000000..de981a3 Binary files /dev/null and b/deps/zlib-1.2.10/uncompr.o differ diff --git a/deps/zlib-1.2.10/watcom/watcom_f.mak b/deps/zlib-1.2.10/watcom/watcom_f.mak new file mode 100644 index 0000000..37f4d74 --- /dev/null +++ b/deps/zlib-1.2.10/watcom/watcom_f.mak @@ -0,0 +1,43 @@ +# Makefile for zlib +# OpenWatcom flat model +# Last updated: 28-Dec-2005 + +# To use, do "wmake -f watcom_f.mak" + +C_SOURCE = adler32.c compress.c crc32.c deflate.c & + gzclose.c gzlib.c gzread.c gzwrite.c & + infback.c inffast.c inflate.c inftrees.c & + trees.c uncompr.c zutil.c + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj & + gzclose.obj gzlib.obj gzread.obj gzwrite.obj & + infback.obj inffast.obj inflate.obj inftrees.obj & + trees.obj uncompr.obj zutil.obj + +CC = wcc386 +LINKER = wcl386 +CFLAGS = -zq -mf -3r -fp3 -s -bt=dos -oilrtfm -fr=nul -wx +ZLIB_LIB = zlib_f.lib + +.C.OBJ: + $(CC) $(CFLAGS) $[@ + +all: $(ZLIB_LIB) example.exe minigzip.exe + +$(ZLIB_LIB): $(OBJS) + wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj + wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj + wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj + wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj + wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj + +example.exe: $(ZLIB_LIB) example.obj + $(LINKER) -ldos32a -fe=example.exe example.obj $(ZLIB_LIB) + +minigzip.exe: $(ZLIB_LIB) minigzip.obj + $(LINKER) -ldos32a -fe=minigzip.exe minigzip.obj $(ZLIB_LIB) + +clean: .SYMBOLIC + del *.obj + del $(ZLIB_LIB) + @echo Cleaning done diff --git a/deps/zlib-1.2.10/watcom/watcom_l.mak b/deps/zlib-1.2.10/watcom/watcom_l.mak new file mode 100644 index 0000000..193eed7 --- /dev/null +++ b/deps/zlib-1.2.10/watcom/watcom_l.mak @@ -0,0 +1,43 @@ +# Makefile for zlib +# OpenWatcom large model +# Last updated: 28-Dec-2005 + +# To use, do "wmake -f watcom_l.mak" + +C_SOURCE = adler32.c compress.c crc32.c deflate.c & + gzclose.c gzlib.c gzread.c gzwrite.c & + infback.c inffast.c inflate.c inftrees.c & + trees.c uncompr.c zutil.c + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj & + gzclose.obj gzlib.obj gzread.obj gzwrite.obj & + infback.obj inffast.obj inflate.obj inftrees.obj & + trees.obj uncompr.obj zutil.obj + +CC = wcc +LINKER = wcl +CFLAGS = -zq -ml -s -bt=dos -oilrtfm -fr=nul -wx +ZLIB_LIB = zlib_l.lib + +.C.OBJ: + $(CC) $(CFLAGS) $[@ + +all: $(ZLIB_LIB) example.exe minigzip.exe + +$(ZLIB_LIB): $(OBJS) + wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj + wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj + wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj + wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj + wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj + +example.exe: $(ZLIB_LIB) example.obj + $(LINKER) -fe=example.exe example.obj $(ZLIB_LIB) + +minigzip.exe: $(ZLIB_LIB) minigzip.obj + $(LINKER) -fe=minigzip.exe minigzip.obj $(ZLIB_LIB) + +clean: .SYMBOLIC + del *.obj + del $(ZLIB_LIB) + @echo Cleaning done diff --git a/deps/zlib-1.2.10/win32/DLL_FAQ.txt b/deps/zlib-1.2.10/win32/DLL_FAQ.txt new file mode 100644 index 0000000..12c0090 --- /dev/null +++ b/deps/zlib-1.2.10/win32/DLL_FAQ.txt @@ -0,0 +1,397 @@ + + Frequently Asked Questions about ZLIB1.DLL + + +This document describes the design, the rationale, and the usage +of the official DLL build of zlib, named ZLIB1.DLL. If you have +general questions about zlib, you should see the file "FAQ" found +in the zlib distribution, or at the following location: + http://www.gzip.org/zlib/zlib_faq.html + + + 1. What is ZLIB1.DLL, and how can I get it? + + - ZLIB1.DLL is the official build of zlib as a DLL. + (Please remark the character '1' in the name.) + + Pointers to a precompiled ZLIB1.DLL can be found in the zlib + web site at: + http://www.zlib.net/ + + Applications that link to ZLIB1.DLL can rely on the following + specification: + + * The exported symbols are exclusively defined in the source + files "zlib.h" and "zlib.def", found in an official zlib + source distribution. + * The symbols are exported by name, not by ordinal. + * The exported names are undecorated. + * The calling convention of functions is "C" (CDECL). + * The ZLIB1.DLL binary is linked to MSVCRT.DLL. + + The archive in which ZLIB1.DLL is bundled contains compiled + test programs that must run with a valid build of ZLIB1.DLL. + It is recommended to download the prebuilt DLL from the zlib + web site, instead of building it yourself, to avoid potential + incompatibilities that could be introduced by your compiler + and build settings. If you do build the DLL yourself, please + make sure that it complies with all the above requirements, + and it runs with the precompiled test programs, bundled with + the original ZLIB1.DLL distribution. + + If, for any reason, you need to build an incompatible DLL, + please use a different file name. + + + 2. Why did you change the name of the DLL to ZLIB1.DLL? + What happened to the old ZLIB.DLL? + + - The old ZLIB.DLL, built from zlib-1.1.4 or earlier, required + compilation settings that were incompatible to those used by + a static build. The DLL settings were supposed to be enabled + by defining the macro ZLIB_DLL, before including "zlib.h". + Incorrect handling of this macro was silently accepted at + build time, resulting in two major problems: + + * ZLIB_DLL was missing from the old makefile. When building + the DLL, not all people added it to the build options. In + consequence, incompatible incarnations of ZLIB.DLL started + to circulate around the net. + + * When switching from using the static library to using the + DLL, applications had to define the ZLIB_DLL macro and + to recompile all the sources that contained calls to zlib + functions. Failure to do so resulted in creating binaries + that were unable to run with the official ZLIB.DLL build. + + The only possible solution that we could foresee was to make + a binary-incompatible change in the DLL interface, in order to + remove the dependency on the ZLIB_DLL macro, and to release + the new DLL under a different name. + + We chose the name ZLIB1.DLL, where '1' indicates the major + zlib version number. We hope that we will not have to break + the binary compatibility again, at least not as long as the + zlib-1.x series will last. + + There is still a ZLIB_DLL macro, that can trigger a more + efficient build and use of the DLL, but compatibility no + longer dependents on it. + + + 3. Can I build ZLIB.DLL from the new zlib sources, and replace + an old ZLIB.DLL, that was built from zlib-1.1.4 or earlier? + + - In principle, you can do it by assigning calling convention + keywords to the macros ZEXPORT and ZEXPORTVA. In practice, + it depends on what you mean by "an old ZLIB.DLL", because the + old DLL exists in several mutually-incompatible versions. + You have to find out first what kind of calling convention is + being used in your particular ZLIB.DLL build, and to use the + same one in the new build. If you don't know what this is all + about, you might be better off if you would just leave the old + DLL intact. + + + 4. Can I compile my application using the new zlib interface, and + link it to an old ZLIB.DLL, that was built from zlib-1.1.4 or + earlier? + + - The official answer is "no"; the real answer depends again on + what kind of ZLIB.DLL you have. Even if you are lucky, this + course of action is unreliable. + + If you rebuild your application and you intend to use a newer + version of zlib (post- 1.1.4), it is strongly recommended to + link it to the new ZLIB1.DLL. + + + 5. Why are the zlib symbols exported by name, and not by ordinal? + + - Although exporting symbols by ordinal is a little faster, it + is risky. Any single glitch in the maintenance or use of the + DEF file that contains the ordinals can result in incompatible + builds and frustrating crashes. Simply put, the benefits of + exporting symbols by ordinal do not justify the risks. + + Technically, it should be possible to maintain ordinals in + the DEF file, and still export the symbols by name. Ordinals + exist in every DLL, and even if the dynamic linking performed + at the DLL startup is searching for names, ordinals serve as + hints, for a faster name lookup. However, if the DEF file + contains ordinals, the Microsoft linker automatically builds + an implib that will cause the executables linked to it to use + those ordinals, and not the names. It is interesting to + notice that the GNU linker for Win32 does not suffer from this + problem. + + It is possible to avoid the DEF file if the exported symbols + are accompanied by a "__declspec(dllexport)" attribute in the + source files. You can do this in zlib by predefining the + ZLIB_DLL macro. + + + 6. I see that the ZLIB1.DLL functions use the "C" (CDECL) calling + convention. Why not use the STDCALL convention? + STDCALL is the standard convention in Win32, and I need it in + my Visual Basic project! + + (For readability, we use CDECL to refer to the convention + triggered by the "__cdecl" keyword, STDCALL to refer to + the convention triggered by "__stdcall", and FASTCALL to + refer to the convention triggered by "__fastcall".) + + - Most of the native Windows API functions (without varargs) use + indeed the WINAPI convention (which translates to STDCALL in + Win32), but the standard C functions use CDECL. If a user + application is intrinsically tied to the Windows API (e.g. + it calls native Windows API functions such as CreateFile()), + sometimes it makes sense to decorate its own functions with + WINAPI. But if ANSI C or POSIX portability is a goal (e.g. + it calls standard C functions such as fopen()), it is not a + sound decision to request the inclusion of , or to + use non-ANSI constructs, for the sole purpose to make the user + functions STDCALL-able. + + The functionality offered by zlib is not in the category of + "Windows functionality", but is more like "C functionality". + + Technically, STDCALL is not bad; in fact, it is slightly + faster than CDECL, and it works with variable-argument + functions, just like CDECL. It is unfortunate that, in spite + of using STDCALL in the Windows API, it is not the default + convention used by the C compilers that run under Windows. + The roots of the problem reside deep inside the unsafety of + the K&R-style function prototypes, where the argument types + are not specified; but that is another story for another day. + + The remaining fact is that CDECL is the default convention. + Even if an explicit convention is hard-coded into the function + prototypes inside C headers, problems may appear. The + necessity to expose the convention in users' callbacks is one + of these problems. + + The calling convention issues are also important when using + zlib in other programming languages. Some of them, like Ada + (GNAT) and Fortran (GNU G77), have C bindings implemented + initially on Unix, and relying on the C calling convention. + On the other hand, the pre- .NET versions of Microsoft Visual + Basic require STDCALL, while Borland Delphi prefers, although + it does not require, FASTCALL. + + In fairness to all possible uses of zlib outside the C + programming language, we choose the default "C" convention. + Anyone interested in different bindings or conventions is + encouraged to maintain specialized projects. The "contrib/" + directory from the zlib distribution already holds a couple + of foreign bindings, such as Ada, C++, and Delphi. + + + 7. I need a DLL for my Visual Basic project. What can I do? + + - Define the ZLIB_WINAPI macro before including "zlib.h", when + building both the DLL and the user application (except that + you don't need to define anything when using the DLL in Visual + Basic). The ZLIB_WINAPI macro will switch on the WINAPI + (STDCALL) convention. The name of this DLL must be different + than the official ZLIB1.DLL. + + Gilles Vollant has contributed a build named ZLIBWAPI.DLL, + with the ZLIB_WINAPI macro turned on, and with the minizip + functionality built in. For more information, please read + the notes inside "contrib/vstudio/readme.txt", found in the + zlib distribution. + + + 8. I need to use zlib in my Microsoft .NET project. What can I + do? + + - Henrik Ravn has contributed a .NET wrapper around zlib. Look + into contrib/dotzlib/, inside the zlib distribution. + + + 9. If my application uses ZLIB1.DLL, should I link it to + MSVCRT.DLL? Why? + + - It is not required, but it is recommended to link your + application to MSVCRT.DLL, if it uses ZLIB1.DLL. + + The executables (.EXE, .DLL, etc.) that are involved in the + same process and are using the C run-time library (i.e. they + are calling standard C functions), must link to the same + library. There are several libraries in the Win32 system: + CRTDLL.DLL, MSVCRT.DLL, the static C libraries, etc. + Since ZLIB1.DLL is linked to MSVCRT.DLL, the executables that + depend on it should also be linked to MSVCRT.DLL. + + +10. Why are you saying that ZLIB1.DLL and my application should + be linked to the same C run-time (CRT) library? I linked my + application and my DLLs to different C libraries (e.g. my + application to a static library, and my DLLs to MSVCRT.DLL), + and everything works fine. + + - If a user library invokes only pure Win32 API (accessible via + and the related headers), its DLL build will work + in any context. But if this library invokes standard C API, + things get more complicated. + + There is a single Win32 library in a Win32 system. Every + function in this library resides in a single DLL module, that + is safe to call from anywhere. On the other hand, there are + multiple versions of the C library, and each of them has its + own separate internal state. Standalone executables and user + DLLs that call standard C functions must link to a C run-time + (CRT) library, be it static or shared (DLL). Intermixing + occurs when an executable (not necessarily standalone) and a + DLL are linked to different CRTs, and both are running in the + same process. + + Intermixing multiple CRTs is possible, as long as their + internal states are kept intact. The Microsoft Knowledge Base + articles KB94248 "HOWTO: Use the C Run-Time" and KB140584 + "HOWTO: Link with the Correct C Run-Time (CRT) Library" + mention the potential problems raised by intermixing. + + If intermixing works for you, it's because your application + and DLLs are avoiding the corruption of each of the CRTs' + internal states, maybe by careful design, or maybe by fortune. + + Also note that linking ZLIB1.DLL to non-Microsoft CRTs, such + as those provided by Borland, raises similar problems. + + +11. Why are you linking ZLIB1.DLL to MSVCRT.DLL? + + - MSVCRT.DLL exists on every Windows 95 with a new service pack + installed, or with Microsoft Internet Explorer 4 or later, and + on all other Windows 4.x or later (Windows 98, Windows NT 4, + or later). It is freely distributable; if not present in the + system, it can be downloaded from Microsoft or from other + software provider for free. + + The fact that MSVCRT.DLL does not exist on a virgin Windows 95 + is not so problematic. Windows 95 is scarcely found nowadays, + Microsoft ended its support a long time ago, and many recent + applications from various vendors, including Microsoft, do not + even run on it. Furthermore, no serious user should run + Windows 95 without a proper update installed. + + +12. Why are you not linking ZLIB1.DLL to + <> ? + + - We considered and abandoned the following alternatives: + + * Linking ZLIB1.DLL to a static C library (LIBC.LIB, or + LIBCMT.LIB) is not a good option. People are using the DLL + mainly to save disk space. If you are linking your program + to a static C library, you may as well consider linking zlib + in statically, too. + + * Linking ZLIB1.DLL to CRTDLL.DLL looks appealing, because + CRTDLL.DLL is present on every Win32 installation. + Unfortunately, it has a series of problems: it does not + work properly with Microsoft's C++ libraries, it does not + provide support for 64-bit file offsets, (and so on...), + and Microsoft discontinued its support a long time ago. + + * Linking ZLIB1.DLL to MSVCR70.DLL or MSVCR71.DLL, supplied + with the Microsoft .NET platform, and Visual C++ 7.0/7.1, + raises problems related to the status of ZLIB1.DLL as a + system component. According to the Microsoft Knowledge Base + article KB326922 "INFO: Redistribution of the Shared C + Runtime Component in Visual C++ .NET", MSVCR70.DLL and + MSVCR71.DLL are not supposed to function as system DLLs, + because they may clash with MSVCRT.DLL. Instead, the + application's installer is supposed to put these DLLs + (if needed) in the application's private directory. + If ZLIB1.DLL depends on a non-system runtime, it cannot + function as a redistributable system component. + + * Linking ZLIB1.DLL to non-Microsoft runtimes, such as + Borland's, or Cygwin's, raises problems related to the + reliable presence of these runtimes on Win32 systems. + It's easier to let the DLL build of zlib up to the people + who distribute these runtimes, and who may proceed as + explained in the answer to Question 14. + + +13. If ZLIB1.DLL cannot be linked to MSVCR70.DLL or MSVCR71.DLL, + how can I build/use ZLIB1.DLL in Microsoft Visual C++ 7.0 + (Visual Studio .NET) or newer? + + - Due to the problems explained in the Microsoft Knowledge Base + article KB326922 (see the previous answer), the C runtime that + comes with the VC7 environment is no longer considered a + system component. That is, it should not be assumed that this + runtime exists, or may be installed in a system directory. + Since ZLIB1.DLL is supposed to be a system component, it may + not depend on a non-system component. + + In order to link ZLIB1.DLL and your application to MSVCRT.DLL + in VC7, you need the library of Visual C++ 6.0 or older. If + you don't have this library at hand, it's probably best not to + use ZLIB1.DLL. + + We are hoping that, in the future, Microsoft will provide a + way to build applications linked to a proper system runtime, + from the Visual C++ environment. Until then, you have a + couple of alternatives, such as linking zlib in statically. + If your application requires dynamic linking, you may proceed + as explained in the answer to Question 14. + + +14. I need to link my own DLL build to a CRT different than + MSVCRT.DLL. What can I do? + + - Feel free to rebuild the DLL from the zlib sources, and link + it the way you want. You should, however, clearly state that + your build is unofficial. You should give it a different file + name, and/or install it in a private directory that can be + accessed by your application only, and is not visible to the + others (i.e. it's neither in the PATH, nor in the SYSTEM or + SYSTEM32 directories). Otherwise, your build may clash with + applications that link to the official build. + + For example, in Cygwin, zlib is linked to the Cygwin runtime + CYGWIN1.DLL, and it is distributed under the name CYGZ.DLL. + + +15. May I include additional pieces of code that I find useful, + link them in ZLIB1.DLL, and export them? + + - No. A legitimate build of ZLIB1.DLL must not include code + that does not originate from the official zlib source code. + But you can make your own private DLL build, under a different + file name, as suggested in the previous answer. + + For example, zlib is a part of the VCL library, distributed + with Borland Delphi and C++ Builder. The DLL build of VCL + is a redistributable file, named VCLxx.DLL. + + +16. May I remove some functionality out of ZLIB1.DLL, by enabling + macros like NO_GZCOMPRESS or NO_GZIP at compile time? + + - No. A legitimate build of ZLIB1.DLL must provide the complete + zlib functionality, as implemented in the official zlib source + code. But you can make your own private DLL build, under a + different file name, as suggested in the previous answer. + + +17. I made my own ZLIB1.DLL build. Can I test it for compliance? + + - We prefer that you download the official DLL from the zlib + web site. If you need something peculiar from this DLL, you + can send your suggestion to the zlib mailing list. + + However, in case you do rebuild the DLL yourself, you can run + it with the test programs found in the DLL distribution. + Running these test programs is not a guarantee of compliance, + but a failure can imply a detected problem. + +** + +This document is written and maintained by +Cosmin Truta diff --git a/deps/zlib-1.2.10/win32/Makefile.bor b/deps/zlib-1.2.10/win32/Makefile.bor new file mode 100644 index 0000000..d152bbb --- /dev/null +++ b/deps/zlib-1.2.10/win32/Makefile.bor @@ -0,0 +1,110 @@ +# Makefile for zlib +# Borland C++ for Win32 +# +# Usage: +# make -f win32/Makefile.bor +# make -f win32/Makefile.bor LOCAL_ZLIB=-DASMV OBJA=match.obj OBJPA=+match.obj + +# ------------ Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or +# added to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +CC = bcc32 +AS = bcc32 +LD = bcc32 +AR = tlib +CFLAGS = -a -d -k- -O2 $(LOC) +ASFLAGS = $(LOC) +LDFLAGS = $(LOC) + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +#OBJA = +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj +#OBJPA= + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $< + +.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) $(OBJA) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + $(AR) $(ZLIB_LIB) $(OBJPA) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del $(ZLIB_LIB) + -del *.obj + -del *.exe + -del *.tds + -del zlib.bak + -del foo.gz diff --git a/deps/zlib-1.2.10/win32/Makefile.gcc b/deps/zlib-1.2.10/win32/Makefile.gcc new file mode 100644 index 0000000..305be50 --- /dev/null +++ b/deps/zlib-1.2.10/win32/Makefile.gcc @@ -0,0 +1,182 @@ +# Makefile for zlib, derived from Makefile.dj2. +# Modified for mingw32 by C. Spieler, 6/16/98. +# Updated for zlib 1.2.x by Christian Spieler and Cosmin Truta, Mar-2003. +# Last updated: Mar 2012. +# Tested under Cygwin and MinGW. + +# Copyright (C) 1995-2003 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type from the top level zlib directory: +# +# make -fwin32/Makefile.gcc; make test testdll -fwin32/Makefile.gcc +# +# To use the asm code, type: +# cp contrib/asm?86/match.S ./match.S +# make LOC=-DASMV OBJA=match.o -fwin32/Makefile.gcc +# +# To install libz.a, zconf.h and zlib.h in the system directories, type: +# +# make install -fwin32/Makefile.gcc +# +# BINARY_PATH, INCLUDE_PATH and LIBRARY_PATH must be set. +# +# To install the shared lib, append SHARED_MODE=1 to the make command : +# +# make install -fwin32/Makefile.gcc SHARED_MODE=1 + +# Note: +# If the platform is *not* MinGW (e.g. it is Cygwin or UWIN), +# the DLL name should be changed from "zlib1.dll". + +STATICLIB = libz.a +SHAREDLIB = zlib1.dll +IMPLIB = libz.dll.a + +# +# Set to 1 if shared object needs to be installed +# +SHARED_MODE=0 + +#LOC = -DASMV +#LOC = -DZLIB_DEBUG -g + +PREFIX = +CC = $(PREFIX)gcc +CFLAGS = $(LOC) -O3 -Wall + +AS = $(CC) +ASFLAGS = $(LOC) -Wall + +LD = $(CC) +LDFLAGS = $(LOC) + +AR = $(PREFIX)ar +ARFLAGS = rcs + +RC = $(PREFIX)windres +RCFLAGS = --define GCC_WINDRES + +STRIP = $(PREFIX)strip + +CP = cp -fp +# If GNU install is available, replace $(CP) with install. +INSTALL = $(CP) +RM = rm -f + +prefix ?= /usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ + gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o +OBJA = + +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) example.exe minigzip.exe example_d.exe minigzip_d.exe + +test: example.exe minigzip.exe + ./example + echo hello world | ./minigzip | ./minigzip -d + +testdll: example_d.exe minigzip_d.exe + ./example_d + echo hello world | ./minigzip_d | ./minigzip_d -d + +.c.o: + $(CC) $(CFLAGS) -c -o $@ $< + +.S.o: + $(AS) $(ASFLAGS) -c -o $@ $< + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) $@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlibrc.o + $(CC) -shared -Wl,--out-implib,$(IMPLIB) $(LDFLAGS) \ + -o $@ win32/zlib.def $(OBJS) $(OBJA) zlibrc.o + $(STRIP) $@ + +example.exe: example.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(STATICLIB) + $(STRIP) $@ + +minigzip.exe: minigzip.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(STATICLIB) + $(STRIP) $@ + +example_d.exe: example.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(IMPLIB) + $(STRIP) $@ + +minigzip_d.exe: minigzip.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(IMPLIB) + $(STRIP) $@ + +example.o: test/example.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/example.c + +minigzip.o: test/minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/minigzip.c + +zlibrc.o: win32/zlib1.rc + $(RC) $(RCFLAGS) -o $@ win32/zlib1.rc + +.PHONY: install uninstall clean + +install: zlib.h zconf.h $(STATICLIB) $(IMPLIB) + @if test -z "$(DESTDIR)$(INCLUDE_PATH)" -o -z "$(DESTDIR)$(LIBRARY_PATH)" -o -z "$(DESTDIR)$(BINARY_PATH)"; then \ + echo INCLUDE_PATH, LIBRARY_PATH, and BINARY_PATH must be specified; \ + exit 1; \ + fi + -@mkdir -p '$(DESTDIR)$(INCLUDE_PATH)' + -@mkdir -p '$(DESTDIR)$(LIBRARY_PATH)' '$(DESTDIR)$(LIBRARY_PATH)'/pkgconfig + -if [ "$(SHARED_MODE)" = "1" ]; then \ + mkdir -p '$(DESTDIR)$(BINARY_PATH)'; \ + $(INSTALL) $(SHAREDLIB) '$(DESTDIR)$(BINARY_PATH)'; \ + $(INSTALL) $(IMPLIB) '$(DESTDIR)$(LIBRARY_PATH)'; \ + fi + -$(INSTALL) zlib.h '$(DESTDIR)$(INCLUDE_PATH)' + -$(INSTALL) zconf.h '$(DESTDIR)$(INCLUDE_PATH)' + -$(INSTALL) $(STATICLIB) '$(DESTDIR)$(LIBRARY_PATH)' + sed \ + -e 's|@prefix@|${prefix}|g' \ + -e 's|@exec_prefix@|${exec_prefix}|g' \ + -e 's|@libdir@|$(LIBRARY_PATH)|g' \ + -e 's|@sharedlibdir@|$(LIBRARY_PATH)|g' \ + -e 's|@includedir@|$(INCLUDE_PATH)|g' \ + -e 's|@VERSION@|'`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' zlib.h`'|g' \ + zlib.pc.in > '$(DESTDIR)$(LIBRARY_PATH)'/pkgconfig/zlib.pc + +uninstall: + -if [ "$(SHARED_MODE)" = "1" ]; then \ + $(RM) '$(DESTDIR)$(BINARY_PATH)'/$(SHAREDLIB); \ + $(RM) '$(DESTDIR)$(LIBRARY_PATH)'/$(IMPLIB); \ + fi + -$(RM) '$(DESTDIR)$(INCLUDE_PATH)'/zlib.h + -$(RM) '$(DESTDIR)$(INCLUDE_PATH)'/zconf.h + -$(RM) '$(DESTDIR)$(LIBRARY_PATH)'/$(STATICLIB) + +clean: + -$(RM) $(STATICLIB) + -$(RM) $(SHAREDLIB) + -$(RM) $(IMPLIB) + -$(RM) *.o + -$(RM) *.exe + -$(RM) foo.gz + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: crc32.h zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +gzclose.o: zlib.h zconf.h gzguts.h +gzlib.o: zlib.h zconf.h gzguts.h +gzread.o: zlib.h zconf.h gzguts.h +gzwrite.o: zlib.h zconf.h gzguts.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/deps/zlib-1.2.10/win32/Makefile.msc b/deps/zlib-1.2.10/win32/Makefile.msc new file mode 100644 index 0000000..67b7731 --- /dev/null +++ b/deps/zlib-1.2.10/win32/Makefile.msc @@ -0,0 +1,163 @@ +# Makefile for zlib using Microsoft (Visual) C +# zlib is copyright (C) 1995-2006 Jean-loup Gailly and Mark Adler +# +# Usage: +# nmake -f win32/Makefile.msc (standard build) +# nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build) +# nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \ +# OBJA="inffas32.obj match686.obj" (use ASM code, x86) +# nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." \ +# OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" (use ASM code, x64) + +# The toplevel directory of the source tree. +# +TOP = . + +# optional build flags +LOC = + +# variables +STATICLIB = zlib.lib +SHAREDLIB = zlib1.dll +IMPLIB = zdll.lib + +CC = cl +AS = ml +LD = link +AR = lib +RC = rc +CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC) +WFLAGS = -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE +ASFLAGS = -coff -Zi $(LOC) +LDFLAGS = -nologo -debug -incremental:no -opt:ref +ARFLAGS = -nologo +RCFLAGS = /dWIN32 /r + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj \ + gzwrite.obj infback.obj inflate.obj inftrees.obj inffast.obj trees.obj uncompr.obj zutil.obj +OBJA = + + +# targets +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) \ + example.exe minigzip.exe example_d.exe minigzip_d.exe + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) -out:$@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): $(TOP)/win32/zlib.def $(OBJS) $(OBJA) zlib1.res + $(LD) $(LDFLAGS) -def:$(TOP)/win32/zlib.def -dll -implib:$(IMPLIB) \ + -out:$@ -base:0x5A4C0000 $(OBJS) $(OBJA) zlib1.res + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;2 + +example.exe: example.obj $(STATICLIB) + $(LD) $(LDFLAGS) example.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip.exe: minigzip.obj $(STATICLIB) + $(LD) $(LDFLAGS) minigzip.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +example_d.exe: example.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ example.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip_d.exe: minigzip.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ minigzip.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +{$(TOP)}.c.obj: + $(CC) -c $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/test}.c.obj: + $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/contrib/masmx64}.c.obj: + $(CC) -c $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/contrib/masmx64}.asm.obj: + $(AS) -c $(ASFLAGS) $< + +{$(TOP)/contrib/masmx86}.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: $(TOP)/adler32.c $(TOP)/zlib.h $(TOP)/zconf.h + +compress.obj: $(TOP)/compress.c $(TOP)/zlib.h $(TOP)/zconf.h + +crc32.obj: $(TOP)/crc32.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/crc32.h + +deflate.obj: $(TOP)/deflate.c $(TOP)/deflate.h $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h + +gzclose.obj: $(TOP)/gzclose.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +gzlib.obj: $(TOP)/gzlib.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +gzread.obj: $(TOP)/gzread.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +gzwrite.obj: $(TOP)/gzwrite.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +infback.obj: $(TOP)/infback.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h $(TOP)/inflate.h \ + $(TOP)/inffast.h $(TOP)/inffixed.h + +inffast.obj: $(TOP)/inffast.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h $(TOP)/inflate.h \ + $(TOP)/inffast.h + +inflate.obj: $(TOP)/inflate.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h $(TOP)/inflate.h \ + $(TOP)/inffast.h $(TOP)/inffixed.h + +inftrees.obj: $(TOP)/inftrees.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h + +trees.obj: $(TOP)/trees.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/deflate.h $(TOP)/trees.h + +uncompr.obj: $(TOP)/uncompr.c $(TOP)/zlib.h $(TOP)/zconf.h + +zutil.obj: $(TOP)/zutil.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h + +gvmat64.obj: $(TOP)/contrib\masmx64\gvmat64.asm + +inffasx64.obj: $(TOP)/contrib\masmx64\inffasx64.asm + +inffas8664.obj: $(TOP)/contrib\masmx64\inffas8664.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h \ + $(TOP)/inftrees.h $(TOP)/inflate.h $(TOP)/inffast.h + +inffas32.obj: $(TOP)/contrib\masmx86\inffas32.asm + +match686.obj: $(TOP)/contrib\masmx86\match686.asm + +example.obj: $(TOP)/test/example.c $(TOP)/zlib.h $(TOP)/zconf.h + +minigzip.obj: $(TOP)/test/minigzip.c $(TOP)/zlib.h $(TOP)/zconf.h + +zlib1.res: $(TOP)/win32/zlib1.rc + $(RC) $(RCFLAGS) /fo$@ $(TOP)/win32/zlib1.rc + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +testdll: example_d.exe minigzip_d.exe + example_d + echo hello world | minigzip_d | minigzip_d -d + + +# cleanup +clean: + -del $(STATICLIB) + -del $(SHAREDLIB) + -del $(IMPLIB) + -del *.obj + -del *.res + -del *.exp + -del *.exe + -del *.pdb + -del *.manifest + -del foo.gz diff --git a/deps/zlib-1.2.10/win32/README-WIN32.txt b/deps/zlib-1.2.10/win32/README-WIN32.txt new file mode 100644 index 0000000..16adcca --- /dev/null +++ b/deps/zlib-1.2.10/win32/README-WIN32.txt @@ -0,0 +1,103 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.10 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) +and rfc1952.txt (gzip format). + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). Two compiled +examples are distributed in this package, example and minigzip. The example_d +and minigzip_d flavors validate that the zlib1.dll file is working correctly. + +Questions about zlib should be sent to . The zlib home page +is http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. + +PLEASE read DLL_FAQ.txt, and the the zlib FAQ http://zlib.net/zlib_faq.html +before asking for help. + + +Manifest: + +The package zlib-1.2.10-win32-x86.zip will contain the following files: + + README-WIN32.txt This document + ChangeLog Changes since previous zlib packages + DLL_FAQ.txt Frequently asked questions about zlib1.dll + zlib.3.pdf Documentation of this library in Adobe Acrobat format + + example.exe A statically-bound example (using zlib.lib, not the dll) + example.pdb Symbolic information for debugging example.exe + + example_d.exe A zlib1.dll bound example (using zdll.lib) + example_d.pdb Symbolic information for debugging example_d.exe + + minigzip.exe A statically-bound test program (using zlib.lib, not the dll) + minigzip.pdb Symbolic information for debugging minigzip.exe + + minigzip_d.exe A zlib1.dll bound test program (using zdll.lib) + minigzip_d.pdb Symbolic information for debugging minigzip_d.exe + + zlib.h Install these files into the compilers' INCLUDE path to + zconf.h compile programs which use zlib.lib or zdll.lib + + zdll.lib Install these files into the compilers' LIB path if linking + zdll.exp a compiled program to the zlib1.dll binary + + zlib.lib Install these files into the compilers' LIB path to link zlib + zlib.pdb into compiled programs, without zlib1.dll runtime dependency + (zlib.pdb provides debugging info to the compile time linker) + + zlib1.dll Install this binary shared library into the system PATH, or + the program's runtime directory (where the .exe resides) + zlib1.pdb Install in the same directory as zlib1.dll, in order to debug + an application crash using WinDbg or similar tools. + +All .pdb files above are entirely optional, but are very useful to a developer +attempting to diagnose program misbehavior or a crash. Many additional +important files for developers can be found in the zlib127.zip source package +available from http://zlib.net/ - review that package's README file for details. + + +Acknowledgments: + +The deflate format used by zlib was defined by Phil Katz. The deflate and +zlib specifications were written by L. Peter Deutsch. Thanks to all the +people who reported problems and suggested various improvements in zlib; they +are too numerous to cite here. + + +Copyright notice: + + (C) 1995-2012 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/deps/zlib-1.2.10/win32/VisualC.txt b/deps/zlib-1.2.10/win32/VisualC.txt new file mode 100644 index 0000000..579a5fc --- /dev/null +++ b/deps/zlib-1.2.10/win32/VisualC.txt @@ -0,0 +1,3 @@ + +To build zlib using the Microsoft Visual C++ environment, +use the appropriate project from the projects/ directory. diff --git a/deps/zlib-1.2.10/win32/zlib.def b/deps/zlib-1.2.10/win32/zlib.def new file mode 100644 index 0000000..784b138 --- /dev/null +++ b/deps/zlib-1.2.10/win32/zlib.def @@ -0,0 +1,94 @@ +; zlib data compression library +EXPORTS +; basic functions + zlibVersion + deflate + deflateEnd + inflate + inflateEnd +; advanced functions + deflateSetDictionary + deflateGetDictionary + deflateCopy + deflateReset + deflateParams + deflateTune + deflateBound + deflatePending + deflatePrime + deflateSetHeader + inflateSetDictionary + inflateGetDictionary + inflateSync + inflateCopy + inflateReset + inflateReset2 + inflatePrime + inflateMark + inflateGetHeader + inflateBack + inflateBackEnd + zlibCompileFlags +; utility functions + compress + compress2 + compressBound + uncompress + uncompress2 + gzopen + gzdopen + gzbuffer + gzsetparams + gzread + gzfread + gzwrite + gzfwrite + gzprintf + gzvprintf + gzputs + gzgets + gzputc + gzgetc + gzungetc + gzflush + gzseek + gzrewind + gztell + gzoffset + gzeof + gzdirect + gzclose + gzclose_r + gzclose_w + gzerror + gzclearerr +; large file functions + gzopen64 + gzseek64 + gztell64 + gzoffset64 + adler32_combine64 + crc32_combine64 +; checksum functions + adler32 + adler32_z + crc32 + crc32_z + adler32_combine + crc32_combine +; various hacks, don't look :) + deflateInit_ + deflateInit2_ + inflateInit_ + inflateInit2_ + inflateBackInit_ + gzgetc_ + zError + inflateSyncPoint + get_crc_table + inflateUndermine + inflateValidate + inflateCodesUsed + inflateResetKeep + deflateResetKeep + gzopen_w diff --git a/deps/zlib-1.2.10/win32/zlib1.rc b/deps/zlib-1.2.10/win32/zlib1.rc new file mode 100644 index 0000000..5c0feed --- /dev/null +++ b/deps/zlib-1.2.10/win32/zlib1.rc @@ -0,0 +1,40 @@ +#include +#include "../zlib.h" + +#ifdef GCC_WINDRES +VS_VERSION_INFO VERSIONINFO +#else +VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE +#endif + FILEVERSION ZLIB_VER_MAJOR,ZLIB_VER_MINOR,ZLIB_VER_REVISION,0 + PRODUCTVERSION ZLIB_VER_MAJOR,ZLIB_VER_MINOR,ZLIB_VER_REVISION,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS 1 +#else + FILEFLAGS 0 +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + BEGIN + VALUE "FileDescription", "zlib data compression library\0" + VALUE "FileVersion", ZLIB_VERSION "\0" + VALUE "InternalName", "zlib1.dll\0" + VALUE "LegalCopyright", "(C) 1995-2013 Jean-loup Gailly & Mark Adler\0" + VALUE "OriginalFilename", "zlib1.dll\0" + VALUE "ProductName", "zlib\0" + VALUE "ProductVersion", ZLIB_VERSION "\0" + VALUE "Comments", "For more information visit http://www.zlib.net/\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/deps/zlib-1.2.10/zconf.h b/deps/zlib-1.2.10/zconf.h new file mode 100644 index 0000000..77398c1 --- /dev/null +++ b/deps/zlib-1.2.10/zconf.h @@ -0,0 +1,534 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#if 1 /* was set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#if 1 /* was set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/deps/zlib-1.2.10/zconf.h.cmakein b/deps/zlib-1.2.10/zconf.h.cmakein new file mode 100644 index 0000000..a7f24cc --- /dev/null +++ b/deps/zlib-1.2.10/zconf.h.cmakein @@ -0,0 +1,536 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H +#cmakedefine Z_PREFIX +#cmakedefine Z_HAVE_UNISTD_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/deps/zlib-1.2.10/zconf.h.in b/deps/zlib-1.2.10/zconf.h.in new file mode 100644 index 0000000..5e1d68a --- /dev/null +++ b/deps/zlib-1.2.10/zconf.h.in @@ -0,0 +1,534 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/deps/zlib-1.2.10/zlib.3 b/deps/zlib-1.2.10/zlib.3 new file mode 100644 index 0000000..00dc061 --- /dev/null +++ b/deps/zlib-1.2.10/zlib.3 @@ -0,0 +1,149 @@ +.TH ZLIB 3 "2 Jan 2017" +.SH NAME +zlib \- compression/decompression library +.SH SYNOPSIS +[see +.I zlib.h +for full description] +.SH DESCRIPTION +The +.I zlib +library is a general purpose data compression library. +The code is thread safe, assuming that the standard library functions +used are thread safe, such as memory allocation routines. +It provides in-memory compression and decompression functions, +including integrity checks of the uncompressed data. +This version of the library supports only one compression method (deflation) +but other algorithms may be added later +with the same stream interface. +.LP +Compression can be done in a single step if the buffers are large enough +or can be done by repeated calls of the compression function. +In the latter case, +the application must provide more input and/or consume the output +(providing more output space) before each call. +.LP +The library also supports reading and writing files in +.IR gzip (1) +(.gz) format +with an interface similar to that of stdio. +.LP +The library does not install any signal handler. +The decoder checks the consistency of the compressed data, +so the library should never crash even in the case of corrupted input. +.LP +All functions of the compression library are documented in the file +.IR zlib.h . +The distribution source includes examples of use of the library +in the files +.I test/example.c +and +.IR test/minigzip.c, +as well as other examples in the +.IR examples/ +directory. +.LP +Changes to this version are documented in the file +.I ChangeLog +that accompanies the source. +.LP +.I zlib +is built in to many languages and operating systems, including but not limited to +Java, Python, .NET, PHP, Perl, Ruby, Swift, and Go. +.LP +An experimental package to read and write files in the .zip format, +written on top of +.I zlib +by Gilles Vollant (info@winimage.com), +is available at: +.IP +http://www.winimage.com/zLibDll/minizip.html +and also in the +.I contrib/minizip +directory of the main +.I zlib +source distribution. +.SH "SEE ALSO" +The +.I zlib +web site can be found at: +.IP +http://zlib.net/ +.LP +The data format used by the +.I zlib +library is described by RFC +(Request for Comments) 1950 to 1952 in the files: +.IP +http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format) +.br +http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format) +.br +http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format) +.LP +Mark Nelson wrote an article about +.I zlib +for the Jan. 1997 issue of Dr. Dobb's Journal; +a copy of the article is available at: +.IP +http://marknelson.us/1997/01/01/zlib-engine/ +.SH "REPORTING PROBLEMS" +Before reporting a problem, +please check the +.I zlib +web site to verify that you have the latest version of +.IR zlib ; +otherwise, +obtain the latest version and see if the problem still exists. +Please read the +.I zlib +FAQ at: +.IP +http://zlib.net/zlib_faq.html +.LP +before asking for help. +Send questions and/or comments to zlib@gzip.org, +or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). +.SH AUTHORS AND LICENSE +Version 1.2.10 +.LP +Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler +.LP +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +.LP +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +.LP +.nr step 1 1 +.IP \n[step]. 3 +The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +.IP \n+[step]. +Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +.IP \n+[step]. +This notice may not be removed or altered from any source distribution. +.LP +Jean-loup Gailly Mark Adler +.br +jloup@gzip.org madler@alumni.caltech.edu +.LP +The deflate format used by +.I zlib +was defined by Phil Katz. +The deflate and +.I zlib +specifications were written by L. Peter Deutsch. +Thanks to all the people who reported problems and suggested various +improvements in +.IR zlib ; +who are too numerous to cite here. +.LP +UNIX manual page by R. P. C. Rodgers, +U.S. National Library of Medicine (rodgers@nlm.nih.gov). +.\" end of man page diff --git a/deps/zlib-1.2.10/zlib.3.pdf b/deps/zlib-1.2.10/zlib.3.pdf new file mode 100644 index 0000000..20008cd Binary files /dev/null and b/deps/zlib-1.2.10/zlib.3.pdf differ diff --git a/deps/zlib-1.2.10/zlib.h b/deps/zlib-1.2.10/zlib.h new file mode 100644 index 0000000..dc90dc8 --- /dev/null +++ b/deps/zlib-1.2.10/zlib.h @@ -0,0 +1,1911 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.10, January 2nd, 2017 + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.10" +#define ZLIB_VERNUM 0x12a0 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 10 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip and raw deflate streams in + memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in the case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte will go here */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text + for deflate, or the decoding state for inflate */ + uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. In that case, zlib is thread-safe. When zalloc and zfree are + Z_NULL on entry to the initialization function, they are set to internal + routines that use the standard library functions malloc() and free(). + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use by the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field for deflate() */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary. Some output may be provided even if + flush is zero. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. See deflatePending(), + which can be used if desired to determine whether or not there is more ouput + in that case. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed + codes block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this + function must be called again with Z_FINISH and more output space (updated + avail_out) but no more input data, until it returns with Z_STREAM_END or an + error. After deflate has returned Z_STREAM_END, the only possible operations + on the stream are deflateReset or deflateEnd. + + Z_FINISH can be used in the first deflate call after deflateInit if all the + compression is to be done in a single step. In order to complete in one + call, avail_out must be at least the value returned by deflateBound (see + below). Then deflate is guaranteed to return Z_STREAM_END. If not enough + output space is provided, deflate will not return Z_STREAM_END, and it must + be called again as described above. + + deflate() sets strm->adler to the Adler-32 checksum of all input read + so far (that is, total_in bytes). If a gzip stream is being generated, then + strm->adler will be the CRC-32 checksum of the input read so far. (See + deflateInit2 below.) + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is + considered binary. This field is only for information purposes and does not + affect the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL or the state was inadvertently written over + by the application), or Z_BUF_ERROR if no progress is possible (for example + avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and + deflate() can be called again with more input and more output space to + continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. In the current version of inflate, the provided input is not + read or consumed. The allocation of a sliding window will be deferred to + the first call of inflate (if the decompression does not complete on the + first call). If zalloc and zfree are set to Z_NULL, inflateInit updates + them to use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression. + Actual decompression will be done by inflate(). So next_in, and avail_in, + next_out, and avail_out are unused and unchanged. The current + implementation of inflateInit() does not process any header information -- + that is deferred until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), then next_in and avail_in are updated + accordingly, and processing will resume at this point for the next call of + inflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. If the + caller of inflate() does not provide both available input and available + output space, it is possible that there will be no progress made. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + To assist in this, on return inflate() always sets strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed Adler-32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained unless inflateGetHeader() is used. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + produced so far. The CRC-32 is checked against the gzip trailer, as is the + uncompressed length, modulo 2^32. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value, in which case strm->msg points to a string with a more specific + error), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL, or the state was inadvertently written over + by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR + if no progress was possible or if there was not enough room in the output + buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is to be attempted. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state + was inconsistent. +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + For the current implementation of deflate(), a windowBits value of 8 (a + window size of 256 bytes) is not supported. As a result, a request for 8 + will result in 9 (a 512-byte window). In that case, providing 8 to + inflateInit2() will result in an error when the zlib header with 9 is + checked against the initialization of inflate(). The remedy is to not use 8 + with deflateInit2() with this initialization, or at least in that case use 9 + with inflateInit2(). + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute a check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to the appropriate value, + if the operating system was determined at compile time. If a gzip stream is + being written, strm->adler is a CRC-32 instead of an Adler-32. + + For raw deflate or gzip encoding, a request for a 256-byte window is + rejected as invalid, since only the zlib header provides a means of + transmitting the window size to the decompressor. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the Adler-32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler-32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + Adler-32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by deflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If deflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + deflateGetDictionary() may return a length less than the window size, even + when more than the window size in input has been provided. It may return up + to 258 bytes less in that case, due to how zlib's implementation of deflate + manages the sliding window and lookahead for matches, where matches can be + up to 258 bytes long. If the application needs the last window-size bytes of + input, then that would need to be saved by the application outside of zlib. + + deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, but + does not free and reallocate the internal compression state. The stream + will leave the compression level and any other attributes that may have been + set unchanged. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2(). This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression approach (which is a function of the level) or the + strategy is changed, then the input available so far is compressed with the + old level and strategy using deflate(strm, Z_BLOCK). There are three + approaches for the compression levels 0, 1..3, and 4..9 respectively. The + new level and strategy will take effect at the next call of deflate(). + + If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does + not have enough output space to complete, then the parameter change will not + take effect. In this case, deflateParams() can be called again with the + same parameters and more output space to try again. + + In order to assure a change in the parameters on the first try, the + deflate stream should be flushed using deflate() with Z_BLOCK or other flush + request until strm.avail_out is not zero, before calling deflateParams(). + Then no more input data should be provided before the deflateParams() call. + If this is done, the old level and strategy will be applied to the data + compressed before deflateParams(), and the new level and strategy will be + applied to the the data compressed after deflateParams(). + + deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream + state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if + there was not enough output space to complete the compression of the + available input data before a change in the strategy or approach. Note that + in the case of a Z_BUF_ERROR, the parameters are not changed. A return + value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be + retried with more output space. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an Adler-32 or a CRC-32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see + below), inflate() will not automatically decode concatenated gzip streams. + inflate() will return Z_STREAM_END at the end of the gzip stream. The state + would need to be reset to continue decoding a subsequent gzip stream. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler-32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler-32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. If the window size is changed, then the + memory allocated for the window is freed, and the window will be reallocated + by inflate() if needed. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above, or -65536 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the default + behavior of inflate(), which expects a zlib header and trailer around the + deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero -- buf is ignored in that + case -- and inflateBack() will return a buffer error. inflateBack() will + call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. + out() should return zero on success, or non-zero on failure. If out() + returns non-zero, inflateBack() will return with an error. Neither in() nor + out() are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: ZLIB_DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. compress() is equivalent to compress2() with a level + parameter of Z_DEFAULT_COMPRESSION. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed data. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + +ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen)); +/* + Same as uncompress, except that sourceLen is a pointer, where the + length of the source is *sourceLen. On return, *sourceLen is the number of + source bytes consumed. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Three times that size in buffer space is allocated. A larger buffer + size of, for example, 64K or 128K bytes will noticeably increase the speed + of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. Previously provided + data is flushed before the parameter change. + + gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not + opened for writing, Z_ERRNO if there is an error writing the flushed data, + or Z_MEM_ERROR if there is a memory allocation error. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. If len is too large to fit in an int, + then nothing is read, -1 is returned, and the error state is set to + Z_STREAM_ERROR. +*/ + +ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, + gzFile file)); +/* + Read up to nitems items of size size from file to buf, otherwise operating + as gzread() does. This duplicates the interface of stdio's fread(), with + size_t request and return types. If the library defines size_t, then + z_size_t is identical to size_t. If not, then z_size_t is an unsigned + integer type that can contain a pointer. + + gzfread() returns the number of full items read of size size, or zero if + the end of the file was reached and a full item could not be read, or if + there was an error. gzerror() must be consulted if zero is returned in + order to determine if there was an error. If the multiplication of size and + nitems overflows, i.e. the product does not fit in a z_size_t, then nothing + is read, zero is returned, and the error state is set to Z_STREAM_ERROR. + + In the event that the end of file is reached and only a partial item is + available at the end, i.e. the remaining uncompressed data length is not a + multiple of size, then the final partial item is nevetheless read into buf + and the end-of-file flag is set. The length of the partial item read is not + provided, but could be inferred from the result of gztell(). This behavior + is the same as the behavior of fread() implementations in common libraries, + but it prevents the direct use of gzfread() to read a concurrently written + file, reseting and retrying on end-of-file, when size is not 1. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, + z_size_t nitems, gzFile file)); +/* + gzfwrite() writes nitems items of size size from buf to file, duplicating + the interface of stdio's fwrite(), with size_t request and return types. If + the library defines size_t, then z_size_t is identical to size_t. If not, + then z_size_t is an unsigned integer type that can contain a pointer. + + gzfwrite() returns the number of full items written of size size, or zero + if there was an error. If the multiplication of size and nitems overflows, + i.e. the product does not fit in a z_size_t, then nothing is written, zero + is returned, and the error state is set to Z_STREAM_ERROR. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or a negative zlib error code in case + of error. The number of uncompressed bytes written is limited to 8191, or + one less than the buffer size given to gzbuffer(). The caller should assure + that this limit is not exceeded. If it is exceeded, then gzprintf() will + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. + This can be determined using zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatenated gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as adler32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as crc32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#ifdef Z_PREFIX_SET +# define z_deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define z_inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#else +# define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#endif + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/deps/zlib-1.2.10/zlib.map b/deps/zlib-1.2.10/zlib.map new file mode 100644 index 0000000..40fa9db --- /dev/null +++ b/deps/zlib-1.2.10/zlib.map @@ -0,0 +1,94 @@ +ZLIB_1.2.0 { + global: + compressBound; + deflateBound; + inflateBack; + inflateBackEnd; + inflateBackInit_; + inflateCopy; + local: + deflate_copyright; + inflate_copyright; + inflate_fast; + inflate_table; + zcalloc; + zcfree; + z_errmsg; + gz_error; + gz_intmax; + _*; +}; + +ZLIB_1.2.0.2 { + gzclearerr; + gzungetc; + zlibCompileFlags; +} ZLIB_1.2.0; + +ZLIB_1.2.0.8 { + deflatePrime; +} ZLIB_1.2.0.2; + +ZLIB_1.2.2 { + adler32_combine; + crc32_combine; + deflateSetHeader; + inflateGetHeader; +} ZLIB_1.2.0.8; + +ZLIB_1.2.2.3 { + deflateTune; + gzdirect; +} ZLIB_1.2.2; + +ZLIB_1.2.2.4 { + inflatePrime; +} ZLIB_1.2.2.3; + +ZLIB_1.2.3.3 { + adler32_combine64; + crc32_combine64; + gzopen64; + gzseek64; + gztell64; + inflateUndermine; +} ZLIB_1.2.2.4; + +ZLIB_1.2.3.4 { + inflateReset2; + inflateMark; +} ZLIB_1.2.3.3; + +ZLIB_1.2.3.5 { + gzbuffer; + gzoffset; + gzoffset64; + gzclose_r; + gzclose_w; +} ZLIB_1.2.3.4; + +ZLIB_1.2.5.1 { + deflatePending; +} ZLIB_1.2.3.5; + +ZLIB_1.2.5.2 { + deflateResetKeep; + gzgetc_; + inflateResetKeep; +} ZLIB_1.2.5.1; + +ZLIB_1.2.7.1 { + inflateGetDictionary; + gzvprintf; +} ZLIB_1.2.5.2; + +ZLIB_1.2.9 { + inflateCodesUsed; + inflateValidate; + uncompress2; + gzfread; + gzfwrite; + deflateGetDictionary; + adler32_z; + crc32_z; +} ZLIB_1.2.7.1; diff --git a/deps/zlib-1.2.10/zlib.pc b/deps/zlib-1.2.10/zlib.pc new file mode 100644 index 0000000..bf407d7 --- /dev/null +++ b/deps/zlib-1.2.10/zlib.pc @@ -0,0 +1,13 @@ +prefix=/opt/files/release/zlib/aarch64/ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +sharedlibdir=${libdir} +includedir=${prefix}/include + +Name: zlib +Description: zlib compression library +Version: 1.2.10 + +Requires: +Libs: -L${libdir} -L${sharedlibdir} -lz +Cflags: -I${includedir} diff --git a/deps/zlib-1.2.10/zlib.pc.cmakein b/deps/zlib-1.2.10/zlib.pc.cmakein new file mode 100644 index 0000000..a5e6429 --- /dev/null +++ b/deps/zlib-1.2.10/zlib.pc.cmakein @@ -0,0 +1,13 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@INSTALL_LIB_DIR@ +sharedlibdir=@INSTALL_LIB_DIR@ +includedir=@INSTALL_INC_DIR@ + +Name: zlib +Description: zlib compression library +Version: @VERSION@ + +Requires: +Libs: -L${libdir} -L${sharedlibdir} -lz +Cflags: -I${includedir} diff --git a/deps/zlib-1.2.10/zlib.pc.in b/deps/zlib-1.2.10/zlib.pc.in new file mode 100644 index 0000000..7e5acf9 --- /dev/null +++ b/deps/zlib-1.2.10/zlib.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +sharedlibdir=@sharedlibdir@ +includedir=@includedir@ + +Name: zlib +Description: zlib compression library +Version: @VERSION@ + +Requires: +Libs: -L${libdir} -L${sharedlibdir} -lz +Cflags: -I${includedir} diff --git a/deps/zlib-1.2.10/zlib2ansi b/deps/zlib-1.2.10/zlib2ansi new file mode 100755 index 0000000..15e3e16 --- /dev/null +++ b/deps/zlib-1.2.10/zlib2ansi @@ -0,0 +1,152 @@ +#!/usr/bin/perl + +# Transform K&R C function definitions into ANSI equivalent. +# +# Author: Paul Marquess +# Version: 1.0 +# Date: 3 October 2006 + +# TODO +# +# Asumes no function pointer parameters. unless they are typedefed. +# Assumes no literal strings that look like function definitions +# Assumes functions start at the beginning of a line + +use strict; +use warnings; + +local $/; +$_ = <>; + +my $sp = qr{ \s* (?: /\* .*? \*/ )? \s* }x; # assume no nested comments + +my $d1 = qr{ $sp (?: [\w\*\s]+ $sp)* $sp \w+ $sp [\[\]\s]* $sp }x ; +my $decl = qr{ $sp (?: \w+ $sp )+ $d1 }xo ; +my $dList = qr{ $sp $decl (?: $sp , $d1 )* $sp ; $sp }xo ; + + +while (s/^ + ( # Start $1 + ( # Start $2 + .*? # Minimal eat content + ( ^ \w [\w\s\*]+ ) # $3 -- function name + \s* # optional whitespace + ) # $2 - Matched up to before parameter list + + \( \s* # Literal "(" + optional whitespace + ( [^\)]+ ) # $4 - one or more anythings except ")" + \s* \) # optional whitespace surrounding a Literal ")" + + ( (?: $dList )+ ) # $5 + + $sp ^ { # literal "{" at start of line + ) # Remember to $1 + //xsom + ) +{ + my $all = $1 ; + my $prefix = $2; + my $param_list = $4 ; + my $params = $5; + + StripComments($params); + StripComments($param_list); + $param_list =~ s/^\s+//; + $param_list =~ s/\s+$//; + + my $i = 0 ; + my %pList = map { $_ => $i++ } + split /\s*,\s*/, $param_list; + my $pMatch = '(\b' . join('|', keys %pList) . '\b)\W*$' ; + + my @params = split /\s*;\s*/, $params; + my @outParams = (); + foreach my $p (@params) + { + if ($p =~ /,/) + { + my @bits = split /\s*,\s*/, $p; + my $first = shift @bits; + $first =~ s/^\s*//; + push @outParams, $first; + $first =~ /^(\w+\s*)/; + my $type = $1 ; + push @outParams, map { $type . $_ } @bits; + } + else + { + $p =~ s/^\s+//; + push @outParams, $p; + } + } + + + my %tmp = map { /$pMatch/; $_ => $pList{$1} } + @outParams ; + + @outParams = map { " $_" } + sort { $tmp{$a} <=> $tmp{$b} } + @outParams ; + + print $prefix ; + print "(\n" . join(",\n", @outParams) . ")\n"; + print "{" ; + +} + +# Output any trailing code. +print ; +exit 0; + + +sub StripComments +{ + + no warnings; + + # Strip C & C++ coments + # From the perlfaq + $_[0] =~ + + s{ + /\* ## Start of /* ... */ comment + [^*]*\*+ ## Non-* followed by 1-or-more *'s + ( + [^/*][^*]*\*+ + )* ## 0-or-more things which don't start with / + ## but do end with '*' + / ## End of /* ... */ comment + + | ## OR C++ Comment + // ## Start of C++ comment // + [^\n]* ## followed by 0-or-more non end of line characters + + | ## OR various things which aren't comments: + + ( + " ## Start of " ... " string + ( + \\. ## Escaped char + | ## OR + [^"\\] ## Non "\ + )* + " ## End of " ... " string + + | ## OR + + ' ## Start of ' ... ' string + ( + \\. ## Escaped char + | ## OR + [^'\\] ## Non '\ + )* + ' ## End of ' ... ' string + + | ## OR + + . ## Anything other char + [^/"'\\]* ## Chars which doesn't start a comment, string or escape + ) + }{$2}gxs; + +} diff --git a/deps/zlib-1.2.10/zutil.c b/deps/zlib-1.2.10/zutil.c new file mode 100644 index 0000000..56534fb --- /dev/null +++ b/deps/zlib-1.2.10/zutil.c @@ -0,0 +1,325 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005, 2010, 2011, 2012, 2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +z_const char * const z_errmsg[10] = { + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ + (z_const char *)"", /* Z_OK 0 */ + (z_const char *)"file error", /* Z_ERRNO (-1) */ + (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ + (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ + (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ + (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ + (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ + (z_const char *)"" +}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef ZLIB_DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef ZLIB_DEBUG +#include +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf; + ulg bsize = (ulg)items*size; + + (void)opaque; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + + (void)opaque; + + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + (void)opaque; + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + (void)opaque; + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + (void)opaque; + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + (void)opaque; + free(ptr); +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/deps/zlib-1.2.10/zutil.h b/deps/zlib-1.2.10/zutil.h new file mode 100644 index 0000000..b079ea6 --- /dev/null +++ b/deps/zlib-1.2.10/zutil.h @@ -0,0 +1,271 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 1 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 2 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 5 +#endif + +#ifdef OS2 +# define OS_CODE 6 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 7 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef __acorn +# define OS_CODE 13 +#endif + +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 +#endif + +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 3 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef ZLIB_DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ diff --git a/deps/zlib-1.2.10/zutil.lo b/deps/zlib-1.2.10/zutil.lo new file mode 100644 index 0000000..cc8bc25 Binary files /dev/null and b/deps/zlib-1.2.10/zutil.lo differ diff --git a/deps/zlib-1.2.10/zutil.o b/deps/zlib-1.2.10/zutil.o new file mode 100644 index 0000000..ea78bae Binary files /dev/null and b/deps/zlib-1.2.10/zutil.o differ diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json new file mode 100644 index 0000000..14d3457 --- /dev/null +++ b/examples/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "files.associations": { + "vmlinux.h": "c", + "signal.h": "c", + "common.h": "c", + "bpf_tracing.h": "c" + } +} \ No newline at end of file diff --git a/examples/c/.gitignore b/examples/c/.gitignore new file mode 100644 index 0000000..386d7e2 --- /dev/null +++ b/examples/c/.gitignore @@ -0,0 +1,14 @@ +/.output +/bootstrap +/minimal +/minimal_legacy +/uprobe +/kprobe +/fentry +/profile +/usdt +/sockfilter +/tc +/ksyscall +/cmake-build-debug/ +/cmake-build-release/ \ No newline at end of file diff --git a/examples/c/CMakeLists.txt b/examples/c/CMakeLists.txt new file mode 100644 index 0000000..ad73004 --- /dev/null +++ b/examples/c/CMakeLists.txt @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(examples) + +# Tell cmake where to find BpfObject module +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../tools/cmake) + +# Build vendored libbpf +include(ExternalProject) +ExternalProject_Add(libbpf + PREFIX libbpf + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../libbpf/src + CONFIGURE_COMMAND "" + BUILD_COMMAND make + BUILD_STATIC_ONLY=1 + OBJDIR=${CMAKE_CURRENT_BINARY_DIR}/libbpf/libbpf + DESTDIR=${CMAKE_CURRENT_BINARY_DIR}/libbpf + INCLUDEDIR= + LIBDIR= + UAPIDIR= + install install_uapi_headers + BUILD_IN_SOURCE TRUE + INSTALL_COMMAND "" + STEP_TARGETS build +) + +ExternalProject_Add(bpftool + PREFIX bpftool + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../bpftool/src + CONFIGURE_COMMAND "" + BUILD_COMMAND make bootstrap + OUTPUT=${CMAKE_CURRENT_BINARY_DIR}/bpftool/ + BUILD_IN_SOURCE TRUE + INSTALL_COMMAND "" + STEP_TARGETS build +) + +find_program(CARGO_EXISTS cargo) +if(CARGO_EXISTS) + ExternalProject_Add(blazesym + PREFIX blazesym + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym + CONFIGURE_COMMAND "" + BUILD_COMMAND cargo build --release + BUILD_IN_SOURCE TRUE + INSTALL_COMMAND "" + STEP_TARGETS build + ) +endif() + +# Set BpfObject input parameters -- note this is usually not necessary unless +# you're in a highly vendored environment (like libbpf-bootstrap) +if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") + set(ARCH "x86") +elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") + set(ARCH "arm") +elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") + set(ARCH "arm64") +elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc64le") + set(ARCH "powerpc") +elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "mips") + set(ARCH "mips") +elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "riscv64") + set(ARCH "riscv") +elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "loongarch64") + set(ARCH "loongarch") +endif() + +set(BPFOBJECT_BPFTOOL_EXE ${CMAKE_CURRENT_BINARY_DIR}/bpftool/bootstrap/bpftool) +set(BPFOBJECT_VMLINUX_H ${CMAKE_CURRENT_SOURCE_DIR}/../../vmlinux/${ARCH}/vmlinux.h) +set(LIBBPF_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/libbpf) +set(LIBBPF_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/libbpf/libbpf.a) +find_package(BpfObject REQUIRED) + +# Create an executable for each application +file(GLOB apps *.bpf.c) +if(NOT CARGO_EXISTS) + list(REMOVE_ITEM apps ${CMAKE_CURRENT_SOURCE_DIR}/profile.bpf.c) +endif() +foreach(app ${apps}) + get_filename_component(app_stem ${app} NAME_WE) + + # Build object skeleton and depend skeleton on libbpf build + bpf_object(${app_stem} ${app_stem}.bpf.c) + add_dependencies(${app_stem}_skel libbpf-build bpftool-build) + + add_executable(${app_stem} ${app_stem}.c) + target_link_libraries(${app_stem} ${app_stem}_skel) + if(${app_stem} STREQUAL profile) + target_include_directories(${app_stem} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym/include) + target_link_libraries(${app_stem} + ${CMAKE_CURRENT_SOURCE_DIR}/../../blazesym/target/release/libblazesym.a -lpthread -lrt -ldl) + endif() +endforeach() diff --git a/examples/c/Makefile b/examples/c/Makefile new file mode 100644 index 0000000..b8fdf74 --- /dev/null +++ b/examples/c/Makefile @@ -0,0 +1,142 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +OUTPUT := .output +CLANG ?= aarch64-linux-android33-clang +LIBBPF_SRC := $(abspath ../../libbpf/src) +BPFTOOL_SRC := $(abspath ../../bpftool/src) +LIBBPF_OBJ := $(abspath libbpf.a) +BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) +BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool +LIBBLAZESYM_SRC := $(abspath ../../blazesym/) +LIBBLAZESYM_INC := $(abspath $(LIBBLAZESYM_SRC)/include) +LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a) +TOPDIR := $(shell git rev-parse --show-toplevel) +ARCH ?= arm64 + +# $(shell uname -m | sed 's/x86_64/x86/' \ +# | sed 's/arm.*/arm/' \ +# | sed 's/aarch64/arm64/' \ +# | sed 's/ppc64le/powerpc/' \ +# | sed 's/mips.*/mips/' \ +# | sed 's/riscv64/riscv/' \ +# | sed 's/loongarch64/loongarch/') +VMLINUX := ../../vmlinux/$(ARCH)/vmlinux.h +# Use our own libbpf API headers and Linux UAPI headers distributed with +# libbpf to avoid dependency on system-wide headers, which could be missing or +# outdated +INCLUDES := -I$(OUTPUT) -I../../libbpf/include/uapi -I$(dir $(VMLINUX)) -I$(LIBBLAZESYM_INC) +CFLAGS := -g -Wall -D__TARGET_ARCH_$(ARCH) +ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS) + +APPS = myringbuffer kprobe + +CARGO ?= $(shell which cargo) +ifeq ($(strip $(CARGO)),) +BZS_APPS := +else +BZS_APPS := profile +APPS += $(BZS_APPS) +# Required by libblazesym +ALL_LDFLAGS += -lrt -ldl -lpthread -lm +endif + +# Get Clang's default includes on this system. We'll explicitly add these dirs +# to the includes list when compiling with `-target bpf` because otherwise some +# architecture-specific dirs will be "missing" on some architectures/distros - +# headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h, +# sys/cdefs.h etc. might be missing. +# +# Use '-idirafter': Don't interfere with include mechanics except where the +# build would have failed anyways. +CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' \ + "$(1)" \ + "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \ + "$(if $(3), $(3))"; + MAKEFLAGS += --no-print-directory +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,aarch64-linux-gnu-gcc) +$(call allow-override,LD,aarch64-linux-gnu-ld) + +.PHONY: all +all: $(APPS) + +.PHONY: clean +clean: + $(call msg,CLEAN) + $(Q)rm -rf $(OUTPUT) $(APPS) + +$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +# Build libbpf +$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf + $(call msg,LIB,$@) + $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \ + OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \ + INCLUDEDIR= LIBDIR= UAPIDIR= \ + install + + +# Build bpftool +$(BPFTOOL): | $(BPFTOOL_OUTPUT) + $(call msg,BPFTOOL,$@) + $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap + + +$(LIBBLAZESYM_SRC)/target/release/libblazesym.a:: + $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --release + +$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT) + $(call msg,LIB, $@) + $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@ + +# Build BPF code +$(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) + $(Q)cp -r bpf $(OUTPUT)/ + $(call msg,BPF,$@) + $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ + -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) + +# Generate BPF skeletons +$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL) + $(call msg,GEN-SKEL,$@) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +# Build user-space code +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h + +$(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) + $(call msg,CC,$@) + $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ + +$(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_OBJ) + +$(BZS_APPS): $(LIBBLAZESYM_OBJ) + +# Build application binary +$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT) + $(call msg,BINARY,$@) + $(Q)$(CC) $(CFLAGS) -static $^ $(ALL_LDFLAGS) -L$(TOPDIR)/deps/libelf-aarch64/usr/lib -lelf -L$(TOPDIR)/deps/zlib-1.2.10 -lz -o $@ + +# delete failed targets +.DELETE_ON_ERROR: + +# keep intermediate (.skel.h, .bpf.o, etc) targets +.SECONDARY: diff --git a/examples/c/bootstrap.bpf.c b/examples/c/bootstrap.bpf.c new file mode 100644 index 0000000..2963bda --- /dev/null +++ b/examples/c/bootstrap.bpf.c @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2020 Facebook */ +#include "vmlinux.h" +#include +#include +#include +#include "bootstrap.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 8192); + __type(key, pid_t); + __type(value, u64); +} exec_start SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +const volatile unsigned long long min_duration_ns = 0; + +SEC("tp/sched/sched_process_exec") +int handle_exec(struct trace_event_raw_sched_process_exec *ctx) +{ + struct task_struct *task; + unsigned fname_off; + struct event *e; + pid_t pid; + u64 ts; + + /* remember time exec() was executed for this PID */ + pid = bpf_get_current_pid_tgid() >> 32; + ts = bpf_ktime_get_ns(); + bpf_map_update_elem(&exec_start, &pid, &ts, BPF_ANY); + + /* don't emit exec events when minimum duration is specified */ + if (min_duration_ns) + return 0; + + /* reserve sample from BPF ringbuf */ + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + /* fill out the sample with data */ + task = (struct task_struct *)bpf_get_current_task(); + + e->exit_event = false; + e->pid = pid; + e->ppid = BPF_CORE_READ(task, real_parent, tgid); + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + + fname_off = ctx->__data_loc_filename & 0xFFFF; + bpf_probe_read_str(&e->filename, sizeof(e->filename), (void *)ctx + fname_off); + + /* successfully submit it to user-space for post-processing */ + bpf_ringbuf_submit(e, 0); + return 0; +} + +SEC("tp/sched/sched_process_exit") +int handle_exit(struct trace_event_raw_sched_process_template *ctx) +{ + struct task_struct *task; + struct event *e; + pid_t pid, tid; + u64 id, ts, *start_ts, duration_ns = 0; + + /* get PID and TID of exiting thread/process */ + id = bpf_get_current_pid_tgid(); + pid = id >> 32; + tid = (u32)id; + + /* ignore thread exits */ + if (pid != tid) + return 0; + + /* if we recorded start of the process, calculate lifetime duration */ + start_ts = bpf_map_lookup_elem(&exec_start, &pid); + if (start_ts) + duration_ns = bpf_ktime_get_ns() - *start_ts; + else if (min_duration_ns) + return 0; + bpf_map_delete_elem(&exec_start, &pid); + + /* if process didn't live long enough, return early */ + if (min_duration_ns && duration_ns < min_duration_ns) + return 0; + + /* reserve sample from BPF ringbuf */ + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + /* fill out the sample with data */ + task = (struct task_struct *)bpf_get_current_task(); + + e->exit_event = true; + e->duration_ns = duration_ns; + e->pid = pid; + e->ppid = BPF_CORE_READ(task, real_parent, tgid); + e->exit_code = (BPF_CORE_READ(task, exit_code) >> 8) & 0xff; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + + /* send data to user-space for post-processing */ + bpf_ringbuf_submit(e, 0); + return 0; +} diff --git a/examples/c/bootstrap.c b/examples/c/bootstrap.c new file mode 100644 index 0000000..ccaf543 --- /dev/null +++ b/examples/c/bootstrap.c @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include +#include +#include "bootstrap.h" +#include "bootstrap.skel.h" + +static struct env { + bool verbose; + long min_duration_ms; +} env; + +const char *argp_program_version = "bootstrap 0.0"; +const char *argp_program_bug_address = ""; +const char argp_program_doc[] = "BPF bootstrap demo application.\n" + "\n" + "It traces process start and exits and shows associated \n" + "information (filename, process duration, PID and PPID, etc).\n" + "\n" + "USAGE: ./bootstrap [-d ] [-v]\n"; + +static const struct argp_option opts[] = { + { "verbose", 'v', NULL, 0, "Verbose debug output" }, + { "duration", 'd', "DURATION-MS", 0, "Minimum process duration (ms) to report" }, + {}, +}; + +static error_t parse_arg(int key, char *arg, struct argp_state *state) +{ + switch (key) { + case 'v': + env.verbose = true; + break; + case 'd': + errno = 0; + env.min_duration_ms = strtol(arg, NULL, 10); + if (errno || env.min_duration_ms <= 0) { + fprintf(stderr, "Invalid duration: %s\n", arg); + argp_usage(state); + } + break; + case ARGP_KEY_ARG: + argp_usage(state); + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static const struct argp argp = { + .options = opts, + .parser = parse_arg, + .doc = argp_program_doc, +}; + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + if (level == LIBBPF_DEBUG && !env.verbose) + return 0; + return vfprintf(stderr, format, args); +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + const struct event *e = data; + struct tm *tm; + char ts[32]; + time_t t; + + time(&t); + tm = localtime(&t); + strftime(ts, sizeof(ts), "%H:%M:%S", tm); + + if (e->exit_event) { + printf("%-8s %-5s %-16s %-7d %-7d [%u]", ts, "EXIT", e->comm, e->pid, e->ppid, + e->exit_code); + if (e->duration_ns) + printf(" (%llums)", e->duration_ns / 1000000); + printf("\n"); + } else { + printf("%-8s %-5s %-16s %-7d %-7d %s\n", ts, "EXEC", e->comm, e->pid, e->ppid, + e->filename); + } + + return 0; +} + +int main(int argc, char **argv) +{ + struct ring_buffer *rb = NULL; + struct bootstrap_bpf *skel; + int err; + + /* Parse command line arguments */ + err = argp_parse(&argp, argc, argv, 0, NULL, NULL); + if (err) + return err; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = bootstrap_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Parameterize BPF code with minimum duration parameter */ + skel->rodata->min_duration_ns = env.min_duration_ms * 1000000ULL; + + /* Load & verify BPF programs */ + err = bootstrap_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + /* Attach tracepoints */ + err = bootstrap_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + /* Set up ring buffer polling */ + rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); + if (!rb) { + err = -1; + fprintf(stderr, "Failed to create ring buffer\n"); + goto cleanup; + } + + /* Process events */ + printf("%-8s %-5s %-16s %-7s %-7s %s\n", "TIME", "EVENT", "COMM", "PID", "PPID", + "FILENAME/EXIT CODE"); + while (!exiting) { + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + /* Ctrl-C will cause -EINTR */ + if (err == -EINTR) { + err = 0; + break; + } + if (err < 0) { + printf("Error polling perf buffer: %d\n", err); + break; + } + } + +cleanup: + /* Clean up */ + ring_buffer__free(rb); + bootstrap_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} diff --git a/examples/c/bootstrap.h b/examples/c/bootstrap.h new file mode 100644 index 0000000..53d8aa9 --- /dev/null +++ b/examples/c/bootstrap.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2020 Facebook */ +#ifndef __BOOTSTRAP_H +#define __BOOTSTRAP_H + +#define TASK_COMM_LEN 16 +#define MAX_FILENAME_LEN 127 + +struct event { + int pid; + int ppid; + unsigned exit_code; + unsigned long long duration_ns; + char comm[TASK_COMM_LEN]; + char filename[MAX_FILENAME_LEN]; + bool exit_event; +}; + +#endif /* __BOOTSTRAP_H */ diff --git a/examples/c/bpf/bpf.h b/examples/c/bpf/bpf.h new file mode 100644 index 0000000..9ed9bce --- /dev/null +++ b/examples/c/bpf/bpf.h @@ -0,0 +1,470 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * common eBPF ELF operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + */ +#ifndef __LIBBPF_BPF_H +#define __LIBBPF_BPF_H + +#include +#include +#include +#include + +#include "libbpf_common.h" +#include "libbpf_legacy.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int libbpf_set_memlock_rlim(size_t memlock_bytes); + +struct bpf_map_create_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + __u32 btf_fd; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + + __u32 inner_map_fd; + __u32 map_flags; + __u64 map_extra; + + __u32 numa_node; + __u32 map_ifindex; +}; +#define bpf_map_create_opts__last_field map_ifindex + +LIBBPF_API int bpf_map_create(enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, + __u32 value_size, + __u32 max_entries, + const struct bpf_map_create_opts *opts); + +struct bpf_prog_load_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + /* libbpf can retry BPF_PROG_LOAD command if bpf() syscall returns + * -EAGAIN. This field determines how many attempts libbpf has to + * make. If not specified, libbpf will use default value of 5. + */ + int attempts; + + enum bpf_attach_type expected_attach_type; + __u32 prog_btf_fd; + __u32 prog_flags; + __u32 prog_ifindex; + __u32 kern_version; + + __u32 attach_btf_id; + __u32 attach_prog_fd; + __u32 attach_btf_obj_fd; + + const int *fd_array; + + /* .BTF.ext func info data */ + const void *func_info; + __u32 func_info_cnt; + __u32 func_info_rec_size; + + /* .BTF.ext line info data */ + const void *line_info; + __u32 line_info_cnt; + __u32 line_info_rec_size; + + /* verifier log options */ + __u32 log_level; + __u32 log_size; + char *log_buf; +}; +#define bpf_prog_load_opts__last_field log_buf + +LIBBPF_API int bpf_prog_load(enum bpf_prog_type prog_type, + const char *prog_name, const char *license, + const struct bpf_insn *insns, size_t insn_cnt, + const struct bpf_prog_load_opts *opts); + +/* Flags to direct loading requirements */ +#define MAPS_RELAX_COMPAT 0x01 + +/* Recommended log buffer size */ +#define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */ + +struct bpf_btf_load_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + /* kernel log options */ + char *log_buf; + __u32 log_level; + __u32 log_size; +}; +#define bpf_btf_load_opts__last_field log_size + +LIBBPF_API int bpf_btf_load(const void *btf_data, size_t btf_size, + const struct bpf_btf_load_opts *opts); + +LIBBPF_API int bpf_map_update_elem(int fd, const void *key, const void *value, + __u64 flags); + +LIBBPF_API int bpf_map_lookup_elem(int fd, const void *key, void *value); +LIBBPF_API int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, + __u64 flags); +LIBBPF_API int bpf_map_lookup_and_delete_elem(int fd, const void *key, + void *value); +LIBBPF_API int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, + void *value, __u64 flags); +LIBBPF_API int bpf_map_delete_elem(int fd, const void *key); +LIBBPF_API int bpf_map_delete_elem_flags(int fd, const void *key, __u64 flags); +LIBBPF_API int bpf_map_get_next_key(int fd, const void *key, void *next_key); +LIBBPF_API int bpf_map_freeze(int fd); + +struct bpf_map_batch_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u64 elem_flags; + __u64 flags; +}; +#define bpf_map_batch_opts__last_field flags + + +/** + * @brief **bpf_map_delete_batch()** allows for batch deletion of multiple + * elements in a BPF map. + * + * @param fd BPF map file descriptor + * @param keys pointer to an array of *count* keys + * @param count input and output parameter; on input **count** represents the + * number of elements in the map to delete in batch; + * on output if a non-EFAULT error is returned, **count** represents the number of deleted + * elements if the output **count** value is not equal to the input **count** value + * If EFAULT is returned, **count** should not be trusted to be correct. + * @param opts options for configuring the way the batch deletion works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_delete_batch(int fd, const void *keys, + __u32 *count, + const struct bpf_map_batch_opts *opts); + +/** + * @brief **bpf_map_lookup_batch()** allows for batch lookup of BPF map elements. + * + * The parameter *in_batch* is the address of the first element in the batch to read. + * *out_batch* is an output parameter that should be passed as *in_batch* to subsequent + * calls to **bpf_map_lookup_batch()**. NULL can be passed for *in_batch* to indicate + * that the batched lookup starts from the beginning of the map. + * + * The *keys* and *values* are output parameters which must point to memory large enough to + * hold *count* items based on the key and value size of the map *map_fd*. The *keys* + * buffer must be of *key_size* * *count*. The *values* buffer must be of + * *value_size* * *count*. + * + * @param fd BPF map file descriptor + * @param in_batch address of the first element in batch to read, can pass NULL to + * indicate that the batched lookup starts from the beginning of the map. + * @param out_batch output parameter that should be passed to next call as *in_batch* + * @param keys pointer to an array large enough for *count* keys + * @param values pointer to an array large enough for *count* values + * @param count input and output parameter; on input it's the number of elements + * in the map to read in batch; on output it's the number of elements that were + * successfully read. + * If a non-EFAULT error is returned, count will be set as the number of elements + * that were read before the error occurred. + * If EFAULT is returned, **count** should not be trusted to be correct. + * @param opts options for configuring the way the batch lookup works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_lookup_batch(int fd, void *in_batch, void *out_batch, + void *keys, void *values, __u32 *count, + const struct bpf_map_batch_opts *opts); + +/** + * @brief **bpf_map_lookup_and_delete_batch()** allows for batch lookup and deletion + * of BPF map elements where each element is deleted after being retrieved. + * + * @param fd BPF map file descriptor + * @param in_batch address of the first element in batch to read, can pass NULL to + * get address of the first element in *out_batch* + * @param out_batch output parameter that should be passed to next call as *in_batch* + * @param keys pointer to an array of *count* keys + * @param values pointer to an array large enough for *count* values + * @param count input and output parameter; on input it's the number of elements + * in the map to read and delete in batch; on output it represents the number of + * elements that were successfully read and deleted + * If a non-**EFAULT** error code is returned and if the output **count** value + * is not equal to the input **count** value, up to **count** elements may + * have been deleted. + * if **EFAULT** is returned up to *count* elements may have been deleted without + * being returned via the *keys* and *values* output parameters. + * @param opts options for configuring the way the batch lookup and delete works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, + void *out_batch, void *keys, + void *values, __u32 *count, + const struct bpf_map_batch_opts *opts); + +/** + * @brief **bpf_map_update_batch()** updates multiple elements in a map + * by specifying keys and their corresponding values. + * + * The *keys* and *values* parameters must point to memory large enough + * to hold *count* items based on the key and value size of the map. + * + * The *opts* parameter can be used to control how *bpf_map_update_batch()* + * should handle keys that either do or do not already exist in the map. + * In particular the *flags* parameter of *bpf_map_batch_opts* can be + * one of the following: + * + * Note that *count* is an input and output parameter, where on output it + * represents how many elements were successfully updated. Also note that if + * **EFAULT** then *count* should not be trusted to be correct. + * + * **BPF_ANY** + * Create new elements or update existing. + * + * **BPF_NOEXIST** + * Create new elements only if they do not exist. + * + * **BPF_EXIST** + * Update existing elements. + * + * **BPF_F_LOCK** + * Update spin_lock-ed map elements. This must be + * specified if the map value contains a spinlock. + * + * @param fd BPF map file descriptor + * @param keys pointer to an array of *count* keys + * @param values pointer to an array of *count* values + * @param count input and output parameter; on input it's the number of elements + * in the map to update in batch; on output if a non-EFAULT error is returned, + * **count** represents the number of updated elements if the output **count** + * value is not equal to the input **count** value. + * If EFAULT is returned, **count** should not be trusted to be correct. + * @param opts options for configuring the way the batch update works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_update_batch(int fd, const void *keys, const void *values, + __u32 *count, + const struct bpf_map_batch_opts *opts); + +struct bpf_obj_get_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + __u32 file_flags; + + size_t :0; +}; +#define bpf_obj_get_opts__last_field file_flags + +LIBBPF_API int bpf_obj_pin(int fd, const char *pathname); +LIBBPF_API int bpf_obj_get(const char *pathname); +LIBBPF_API int bpf_obj_get_opts(const char *pathname, + const struct bpf_obj_get_opts *opts); + +struct bpf_prog_attach_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + unsigned int flags; + int replace_prog_fd; +}; +#define bpf_prog_attach_opts__last_field replace_prog_fd + +LIBBPF_API int bpf_prog_attach(int prog_fd, int attachable_fd, + enum bpf_attach_type type, unsigned int flags); +LIBBPF_API int bpf_prog_attach_opts(int prog_fd, int attachable_fd, + enum bpf_attach_type type, + const struct bpf_prog_attach_opts *opts); +LIBBPF_API int bpf_prog_detach(int attachable_fd, enum bpf_attach_type type); +LIBBPF_API int bpf_prog_detach2(int prog_fd, int attachable_fd, + enum bpf_attach_type type); + +union bpf_iter_link_info; /* defined in up-to-date linux/bpf.h */ +struct bpf_link_create_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 flags; + union bpf_iter_link_info *iter_info; + __u32 iter_info_len; + __u32 target_btf_id; + union { + struct { + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + const char **syms; + const unsigned long *addrs; + const __u64 *cookies; + } kprobe_multi; + struct { + __u64 cookie; + } tracing; + }; + size_t :0; +}; +#define bpf_link_create_opts__last_field kprobe_multi.cookies + +LIBBPF_API int bpf_link_create(int prog_fd, int target_fd, + enum bpf_attach_type attach_type, + const struct bpf_link_create_opts *opts); + +LIBBPF_API int bpf_link_detach(int link_fd); + +struct bpf_link_update_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 flags; /* extra flags */ + __u32 old_prog_fd; /* expected old program FD */ +}; +#define bpf_link_update_opts__last_field old_prog_fd + +LIBBPF_API int bpf_link_update(int link_fd, int new_prog_fd, + const struct bpf_link_update_opts *opts); + +LIBBPF_API int bpf_iter_create(int link_fd); + +struct bpf_prog_test_run_attr { + int prog_fd; + int repeat; + const void *data_in; + __u32 data_size_in; + void *data_out; /* optional */ + __u32 data_size_out; /* in: max length of data_out + * out: length of data_out */ + __u32 retval; /* out: return code of the BPF program */ + __u32 duration; /* out: average per repetition in ns */ + const void *ctx_in; /* optional */ + __u32 ctx_size_in; + void *ctx_out; /* optional */ + __u32 ctx_size_out; /* in: max length of ctx_out + * out: length of cxt_out */ +}; + +LIBBPF_API int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id); +LIBBPF_API int bpf_map_get_next_id(__u32 start_id, __u32 *next_id); +LIBBPF_API int bpf_btf_get_next_id(__u32 start_id, __u32 *next_id); +LIBBPF_API int bpf_link_get_next_id(__u32 start_id, __u32 *next_id); + +struct bpf_get_fd_by_id_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 open_flags; /* permissions requested for the operation on fd */ + size_t :0; +}; +#define bpf_get_fd_by_id_opts__last_field open_flags + +LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_prog_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_map_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_map_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_btf_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_btf_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_link_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_link_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_obj_get_info_by_fd(int bpf_fd, void *info, __u32 *info_len); +/* Type-safe variants of bpf_obj_get_info_by_fd(). The callers still needs to + * pass info_len, which should normally be + * sizeof(struct bpf_{prog,map,btf,link}_info), in order to be compatible with + * different libbpf and kernel versions. + */ +LIBBPF_API int bpf_prog_get_info_by_fd(int prog_fd, struct bpf_prog_info *info, __u32 *info_len); +LIBBPF_API int bpf_map_get_info_by_fd(int map_fd, struct bpf_map_info *info, __u32 *info_len); +LIBBPF_API int bpf_btf_get_info_by_fd(int btf_fd, struct bpf_btf_info *info, __u32 *info_len); +LIBBPF_API int bpf_link_get_info_by_fd(int link_fd, struct bpf_link_info *info, __u32 *info_len); + +struct bpf_prog_query_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 query_flags; + __u32 attach_flags; /* output argument */ + __u32 *prog_ids; + __u32 prog_cnt; /* input+output argument */ + __u32 *prog_attach_flags; +}; +#define bpf_prog_query_opts__last_field prog_attach_flags + +LIBBPF_API int bpf_prog_query_opts(int target_fd, + enum bpf_attach_type type, + struct bpf_prog_query_opts *opts); +LIBBPF_API int bpf_prog_query(int target_fd, enum bpf_attach_type type, + __u32 query_flags, __u32 *attach_flags, + __u32 *prog_ids, __u32 *prog_cnt); + +LIBBPF_API int bpf_raw_tracepoint_open(const char *name, int prog_fd); +LIBBPF_API int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, + __u32 *buf_len, __u32 *prog_id, __u32 *fd_type, + __u64 *probe_offset, __u64 *probe_addr); + +#ifdef __cplusplus +/* forward-declaring enums in C++ isn't compatible with pure C enums, so + * instead define bpf_enable_stats() as accepting int as an input + */ +LIBBPF_API int bpf_enable_stats(int type); +#else +enum bpf_stats_type; /* defined in up-to-date linux/bpf.h */ +LIBBPF_API int bpf_enable_stats(enum bpf_stats_type type); +#endif + +struct bpf_prog_bind_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 flags; +}; +#define bpf_prog_bind_opts__last_field flags + +LIBBPF_API int bpf_prog_bind_map(int prog_fd, int map_fd, + const struct bpf_prog_bind_opts *opts); + +struct bpf_test_run_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + const void *data_in; /* optional */ + void *data_out; /* optional */ + __u32 data_size_in; + __u32 data_size_out; /* in: max length of data_out + * out: length of data_out + */ + const void *ctx_in; /* optional */ + void *ctx_out; /* optional */ + __u32 ctx_size_in; + __u32 ctx_size_out; /* in: max length of ctx_out + * out: length of cxt_out + */ + __u32 retval; /* out: return code of the BPF program */ + int repeat; + __u32 duration; /* out: average per repetition in ns */ + __u32 flags; + __u32 cpu; + __u32 batch_size; +}; +#define bpf_test_run_opts__last_field batch_size + +LIBBPF_API int bpf_prog_test_run_opts(int prog_fd, + struct bpf_test_run_opts *opts); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_BPF_H */ diff --git a/examples/c/bpf/bpf_core_read.h b/examples/c/bpf/bpf_core_read.h new file mode 100644 index 0000000..1ac57bb --- /dev/null +++ b/examples/c/bpf/bpf_core_read.h @@ -0,0 +1,484 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_CORE_READ_H__ +#define __BPF_CORE_READ_H__ + +/* + * enum bpf_field_info_kind is passed as a second argument into + * __builtin_preserve_field_info() built-in to get a specific aspect of + * a field, captured as a first argument. __builtin_preserve_field_info(field, + * info_kind) returns __u32 integer and produces BTF field relocation, which + * is understood and processed by libbpf during BPF object loading. See + * selftests/bpf for examples. + */ +enum bpf_field_info_kind { + BPF_FIELD_BYTE_OFFSET = 0, /* field byte offset */ + BPF_FIELD_BYTE_SIZE = 1, + BPF_FIELD_EXISTS = 2, /* field existence in target kernel */ + BPF_FIELD_SIGNED = 3, + BPF_FIELD_LSHIFT_U64 = 4, + BPF_FIELD_RSHIFT_U64 = 5, +}; + +/* second argument to __builtin_btf_type_id() built-in */ +enum bpf_type_id_kind { + BPF_TYPE_ID_LOCAL = 0, /* BTF type ID in local program */ + BPF_TYPE_ID_TARGET = 1, /* BTF type ID in target kernel */ +}; + +/* second argument to __builtin_preserve_type_info() built-in */ +enum bpf_type_info_kind { + BPF_TYPE_EXISTS = 0, /* type existence in target kernel */ + BPF_TYPE_SIZE = 1, /* type size in target kernel */ + BPF_TYPE_MATCHES = 2, /* type match in target kernel */ +}; + +/* second argument to __builtin_preserve_enum_value() built-in */ +enum bpf_enum_value_kind { + BPF_ENUMVAL_EXISTS = 0, /* enum value existence in kernel */ + BPF_ENUMVAL_VALUE = 1, /* enum value value relocation */ +}; + +#define __CORE_RELO(src, field, info) \ + __builtin_preserve_field_info((src)->field, BPF_FIELD_##info) + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define __CORE_BITFIELD_PROBE_READ(dst, src, fld) \ + bpf_probe_read_kernel( \ + (void *)dst, \ + __CORE_RELO(src, fld, BYTE_SIZE), \ + (const void *)src + __CORE_RELO(src, fld, BYTE_OFFSET)) +#else +/* semantics of LSHIFT_64 assumes loading values into low-ordered bytes, so + * for big-endian we need to adjust destination pointer accordingly, based on + * field byte size + */ +#define __CORE_BITFIELD_PROBE_READ(dst, src, fld) \ + bpf_probe_read_kernel( \ + (void *)dst + (8 - __CORE_RELO(src, fld, BYTE_SIZE)), \ + __CORE_RELO(src, fld, BYTE_SIZE), \ + (const void *)src + __CORE_RELO(src, fld, BYTE_OFFSET)) +#endif + +/* + * Extract bitfield, identified by s->field, and return its value as u64. + * All this is done in relocatable manner, so bitfield changes such as + * signedness, bit size, offset changes, this will be handled automatically. + * This version of macro is using bpf_probe_read_kernel() to read underlying + * integer storage. Macro functions as an expression and its return type is + * bpf_probe_read_kernel()'s return value: 0, on success, <0 on error. + */ +#define BPF_CORE_READ_BITFIELD_PROBED(s, field) ({ \ + unsigned long long val = 0; \ + \ + __CORE_BITFIELD_PROBE_READ(&val, s, field); \ + val <<= __CORE_RELO(s, field, LSHIFT_U64); \ + if (__CORE_RELO(s, field, SIGNED)) \ + val = ((long long)val) >> __CORE_RELO(s, field, RSHIFT_U64); \ + else \ + val = val >> __CORE_RELO(s, field, RSHIFT_U64); \ + val; \ +}) + +/* + * Extract bitfield, identified by s->field, and return its value as u64. + * This version of macro is using direct memory reads and should be used from + * BPF program types that support such functionality (e.g., typed raw + * tracepoints). + */ +#define BPF_CORE_READ_BITFIELD(s, field) ({ \ + const void *p = (const void *)s + __CORE_RELO(s, field, BYTE_OFFSET); \ + unsigned long long val; \ + \ + /* This is a so-called barrier_var() operation that makes specified \ + * variable "a black box" for optimizing compiler. \ + * It forces compiler to perform BYTE_OFFSET relocation on p and use \ + * its calculated value in the switch below, instead of applying \ + * the same relocation 4 times for each individual memory load. \ + */ \ + asm volatile("" : "=r"(p) : "0"(p)); \ + \ + switch (__CORE_RELO(s, field, BYTE_SIZE)) { \ + case 1: val = *(const unsigned char *)p; break; \ + case 2: val = *(const unsigned short *)p; break; \ + case 4: val = *(const unsigned int *)p; break; \ + case 8: val = *(const unsigned long long *)p; break; \ + } \ + val <<= __CORE_RELO(s, field, LSHIFT_U64); \ + if (__CORE_RELO(s, field, SIGNED)) \ + val = ((long long)val) >> __CORE_RELO(s, field, RSHIFT_U64); \ + else \ + val = val >> __CORE_RELO(s, field, RSHIFT_U64); \ + val; \ +}) + +#define ___bpf_field_ref1(field) (field) +#define ___bpf_field_ref2(type, field) (((typeof(type) *)0)->field) +#define ___bpf_field_ref(args...) \ + ___bpf_apply(___bpf_field_ref, ___bpf_narg(args))(args) + +/* + * Convenience macro to check that field actually exists in target kernel's. + * Returns: + * 1, if matching field is present in target kernel; + * 0, if no matching field found. + * + * Supports two forms: + * - field reference through variable access: + * bpf_core_field_exists(p->my_field); + * - field reference through type and field names: + * bpf_core_field_exists(struct my_type, my_field). + */ +#define bpf_core_field_exists(field...) \ + __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_EXISTS) + +/* + * Convenience macro to get the byte size of a field. Works for integers, + * struct/unions, pointers, arrays, and enums. + * + * Supports two forms: + * - field reference through variable access: + * bpf_core_field_size(p->my_field); + * - field reference through type and field names: + * bpf_core_field_size(struct my_type, my_field). + */ +#define bpf_core_field_size(field...) \ + __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_BYTE_SIZE) + +/* + * Convenience macro to get field's byte offset. + * + * Supports two forms: + * - field reference through variable access: + * bpf_core_field_offset(p->my_field); + * - field reference through type and field names: + * bpf_core_field_offset(struct my_type, my_field). + */ +#define bpf_core_field_offset(field...) \ + __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_BYTE_OFFSET) + +/* + * Convenience macro to get BTF type ID of a specified type, using a local BTF + * information. Return 32-bit unsigned integer with type ID from program's own + * BTF. Always succeeds. + */ +#define bpf_core_type_id_local(type) \ + __builtin_btf_type_id(*(typeof(type) *)0, BPF_TYPE_ID_LOCAL) + +/* + * Convenience macro to get BTF type ID of a target kernel's type that matches + * specified local type. + * Returns: + * - valid 32-bit unsigned type ID in kernel BTF; + * - 0, if no matching type was found in a target kernel BTF. + */ +#define bpf_core_type_id_kernel(type) \ + __builtin_btf_type_id(*(typeof(type) *)0, BPF_TYPE_ID_TARGET) + +/* + * Convenience macro to check that provided named type + * (struct/union/enum/typedef) exists in a target kernel. + * Returns: + * 1, if such type is present in target kernel's BTF; + * 0, if no matching type is found. + */ +#define bpf_core_type_exists(type) \ + __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_EXISTS) + +/* + * Convenience macro to check that provided named type + * (struct/union/enum/typedef) "matches" that in a target kernel. + * Returns: + * 1, if the type matches in the target kernel's BTF; + * 0, if the type does not match any in the target kernel + */ +#define bpf_core_type_matches(type) \ + __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_MATCHES) + +/* + * Convenience macro to get the byte size of a provided named type + * (struct/union/enum/typedef) in a target kernel. + * Returns: + * >= 0 size (in bytes), if type is present in target kernel's BTF; + * 0, if no matching type is found. + */ +#define bpf_core_type_size(type) \ + __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_SIZE) + +/* + * Convenience macro to check that provided enumerator value is defined in + * a target kernel. + * Returns: + * 1, if specified enum type and its enumerator value are present in target + * kernel's BTF; + * 0, if no matching enum and/or enum value within that enum is found. + */ +#define bpf_core_enum_value_exists(enum_type, enum_value) \ + __builtin_preserve_enum_value(*(typeof(enum_type) *)enum_value, BPF_ENUMVAL_EXISTS) + +/* + * Convenience macro to get the integer value of an enumerator value in + * a target kernel. + * Returns: + * 64-bit value, if specified enum type and its enumerator value are + * present in target kernel's BTF; + * 0, if no matching enum and/or enum value within that enum is found. + */ +#define bpf_core_enum_value(enum_type, enum_value) \ + __builtin_preserve_enum_value(*(typeof(enum_type) *)enum_value, BPF_ENUMVAL_VALUE) + +/* + * bpf_core_read() abstracts away bpf_probe_read_kernel() call and captures + * offset relocation for source address using __builtin_preserve_access_index() + * built-in, provided by Clang. + * + * __builtin_preserve_access_index() takes as an argument an expression of + * taking an address of a field within struct/union. It makes compiler emit + * a relocation, which records BTF type ID describing root struct/union and an + * accessor string which describes exact embedded field that was used to take + * an address. See detailed description of this relocation format and + * semantics in comments to struct bpf_field_reloc in libbpf_internal.h. + * + * This relocation allows libbpf to adjust BPF instruction to use correct + * actual field offset, based on target kernel BTF type that matches original + * (local) BTF, used to record relocation. + */ +#define bpf_core_read(dst, sz, src) \ + bpf_probe_read_kernel(dst, sz, (const void *)__builtin_preserve_access_index(src)) + +/* NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. */ +#define bpf_core_read_user(dst, sz, src) \ + bpf_probe_read_user(dst, sz, (const void *)__builtin_preserve_access_index(src)) +/* + * bpf_core_read_str() is a thin wrapper around bpf_probe_read_str() + * additionally emitting BPF CO-RE field relocation for specified source + * argument. + */ +#define bpf_core_read_str(dst, sz, src) \ + bpf_probe_read_kernel_str(dst, sz, (const void *)__builtin_preserve_access_index(src)) + +/* NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. */ +#define bpf_core_read_user_str(dst, sz, src) \ + bpf_probe_read_user_str(dst, sz, (const void *)__builtin_preserve_access_index(src)) + +#define ___concat(a, b) a ## b +#define ___apply(fn, n) ___concat(fn, n) +#define ___nth(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, __11, N, ...) N + +/* + * return number of provided arguments; used for switch-based variadic macro + * definitions (see ___last, ___arrow, etc below) + */ +#define ___narg(...) ___nth(_, ##__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +/* + * return 0 if no arguments are passed, N - otherwise; used for + * recursively-defined macros to specify termination (0) case, and generic + * (N) case (e.g., ___read_ptrs, ___core_read) + */ +#define ___empty(...) ___nth(_, ##__VA_ARGS__, N, N, N, N, N, N, N, N, N, N, 0) + +#define ___last1(x) x +#define ___last2(a, x) x +#define ___last3(a, b, x) x +#define ___last4(a, b, c, x) x +#define ___last5(a, b, c, d, x) x +#define ___last6(a, b, c, d, e, x) x +#define ___last7(a, b, c, d, e, f, x) x +#define ___last8(a, b, c, d, e, f, g, x) x +#define ___last9(a, b, c, d, e, f, g, h, x) x +#define ___last10(a, b, c, d, e, f, g, h, i, x) x +#define ___last(...) ___apply(___last, ___narg(__VA_ARGS__))(__VA_ARGS__) + +#define ___nolast2(a, _) a +#define ___nolast3(a, b, _) a, b +#define ___nolast4(a, b, c, _) a, b, c +#define ___nolast5(a, b, c, d, _) a, b, c, d +#define ___nolast6(a, b, c, d, e, _) a, b, c, d, e +#define ___nolast7(a, b, c, d, e, f, _) a, b, c, d, e, f +#define ___nolast8(a, b, c, d, e, f, g, _) a, b, c, d, e, f, g +#define ___nolast9(a, b, c, d, e, f, g, h, _) a, b, c, d, e, f, g, h +#define ___nolast10(a, b, c, d, e, f, g, h, i, _) a, b, c, d, e, f, g, h, i +#define ___nolast(...) ___apply(___nolast, ___narg(__VA_ARGS__))(__VA_ARGS__) + +#define ___arrow1(a) a +#define ___arrow2(a, b) a->b +#define ___arrow3(a, b, c) a->b->c +#define ___arrow4(a, b, c, d) a->b->c->d +#define ___arrow5(a, b, c, d, e) a->b->c->d->e +#define ___arrow6(a, b, c, d, e, f) a->b->c->d->e->f +#define ___arrow7(a, b, c, d, e, f, g) a->b->c->d->e->f->g +#define ___arrow8(a, b, c, d, e, f, g, h) a->b->c->d->e->f->g->h +#define ___arrow9(a, b, c, d, e, f, g, h, i) a->b->c->d->e->f->g->h->i +#define ___arrow10(a, b, c, d, e, f, g, h, i, j) a->b->c->d->e->f->g->h->i->j +#define ___arrow(...) ___apply(___arrow, ___narg(__VA_ARGS__))(__VA_ARGS__) + +#define ___type(...) typeof(___arrow(__VA_ARGS__)) + +#define ___read(read_fn, dst, src_type, src, accessor) \ + read_fn((void *)(dst), sizeof(*(dst)), &((src_type)(src))->accessor) + +/* "recursively" read a sequence of inner pointers using local __t var */ +#define ___rd_first(fn, src, a) ___read(fn, &__t, ___type(src), src, a); +#define ___rd_last(fn, ...) \ + ___read(fn, &__t, ___type(___nolast(__VA_ARGS__)), __t, ___last(__VA_ARGS__)); +#define ___rd_p1(fn, ...) const void *__t; ___rd_first(fn, __VA_ARGS__) +#define ___rd_p2(fn, ...) ___rd_p1(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p3(fn, ...) ___rd_p2(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p4(fn, ...) ___rd_p3(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p5(fn, ...) ___rd_p4(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p6(fn, ...) ___rd_p5(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p7(fn, ...) ___rd_p6(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p8(fn, ...) ___rd_p7(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p9(fn, ...) ___rd_p8(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___read_ptrs(fn, src, ...) \ + ___apply(___rd_p, ___narg(__VA_ARGS__))(fn, src, __VA_ARGS__) + +#define ___core_read0(fn, fn_ptr, dst, src, a) \ + ___read(fn, dst, ___type(src), src, a); +#define ___core_readN(fn, fn_ptr, dst, src, ...) \ + ___read_ptrs(fn_ptr, src, ___nolast(__VA_ARGS__)) \ + ___read(fn, dst, ___type(src, ___nolast(__VA_ARGS__)), __t, \ + ___last(__VA_ARGS__)); +#define ___core_read(fn, fn_ptr, dst, src, a, ...) \ + ___apply(___core_read, ___empty(__VA_ARGS__))(fn, fn_ptr, dst, \ + src, a, ##__VA_ARGS__) + +/* + * BPF_CORE_READ_INTO() is a more performance-conscious variant of + * BPF_CORE_READ(), in which final field is read into user-provided storage. + * See BPF_CORE_READ() below for more details on general usage. + */ +#define BPF_CORE_READ_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read, bpf_core_read, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * Variant of BPF_CORE_READ_INTO() for reading from user-space memory. + * + * NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. + */ +#define BPF_CORE_READ_USER_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read_user, bpf_core_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ_INTO() */ +#define BPF_PROBE_READ_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_kernel, bpf_probe_read_kernel, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ_USER_INTO(). + * + * As no CO-RE relocations are emitted, source types can be arbitrary and are + * not restricted to kernel types only. + */ +#define BPF_PROBE_READ_USER_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_user, bpf_probe_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * BPF_CORE_READ_STR_INTO() does same "pointer chasing" as + * BPF_CORE_READ() for intermediate pointers, but then executes (and returns + * corresponding error code) bpf_core_read_str() for final string read. + */ +#define BPF_CORE_READ_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read_str, bpf_core_read, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * Variant of BPF_CORE_READ_STR_INTO() for reading from user-space memory. + * + * NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. + */ +#define BPF_CORE_READ_USER_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read_user_str, bpf_core_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ_STR_INTO() */ +#define BPF_PROBE_READ_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_kernel_str, bpf_probe_read_kernel, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * Non-CO-RE variant of BPF_CORE_READ_USER_STR_INTO(). + * + * As no CO-RE relocations are emitted, source types can be arbitrary and are + * not restricted to kernel types only. + */ +#define BPF_PROBE_READ_USER_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_user_str, bpf_probe_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * BPF_CORE_READ() is used to simplify BPF CO-RE relocatable read, especially + * when there are few pointer chasing steps. + * E.g., what in non-BPF world (or in BPF w/ BCC) would be something like: + * int x = s->a.b.c->d.e->f->g; + * can be succinctly achieved using BPF_CORE_READ as: + * int x = BPF_CORE_READ(s, a.b.c, d.e, f, g); + * + * BPF_CORE_READ will decompose above statement into 4 bpf_core_read (BPF + * CO-RE relocatable bpf_probe_read_kernel() wrapper) calls, logically + * equivalent to: + * 1. const void *__t = s->a.b.c; + * 2. __t = __t->d.e; + * 3. __t = __t->f; + * 4. return __t->g; + * + * Equivalence is logical, because there is a heavy type casting/preservation + * involved, as well as all the reads are happening through + * bpf_probe_read_kernel() calls using __builtin_preserve_access_index() to + * emit CO-RE relocations. + * + * N.B. Only up to 9 "field accessors" are supported, which should be more + * than enough for any practical purpose. + */ +#define BPF_CORE_READ(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_CORE_READ_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +/* + * Variant of BPF_CORE_READ() for reading from user-space memory. + * + * NOTE: all the source types involved are still *kernel types* and need to + * exist in kernel (or kernel module) BTF, otherwise CO-RE relocation will + * fail. Custom user types are not relocatable with CO-RE. + * The typical situation in which BPF_CORE_READ_USER() might be used is to + * read kernel UAPI types from the user-space memory passed in as a syscall + * input argument. + */ +#define BPF_CORE_READ_USER(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_CORE_READ_USER_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ() */ +#define BPF_PROBE_READ(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_PROBE_READ_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +/* + * Non-CO-RE variant of BPF_CORE_READ_USER(). + * + * As no CO-RE relocations are emitted, source types can be arbitrary and are + * not restricted to kernel types only. + */ +#define BPF_PROBE_READ_USER(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_PROBE_READ_USER_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +#endif + diff --git a/examples/c/bpf/bpf_endian.h b/examples/c/bpf/bpf_endian.h new file mode 100644 index 0000000..ec9db4f --- /dev/null +++ b/examples/c/bpf/bpf_endian.h @@ -0,0 +1,99 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_ENDIAN__ +#define __BPF_ENDIAN__ + +/* + * Isolate byte #n and put it into byte #m, for __u##b type. + * E.g., moving byte #6 (nnnnnnnn) into byte #1 (mmmmmmmm) for __u64: + * 1) xxxxxxxx nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx + * 2) nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx 00000000 + * 3) 00000000 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn + * 4) 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn 00000000 + */ +#define ___bpf_mvb(x, b, n, m) ((__u##b)(x) << (b-(n+1)*8) >> (b-8) << (m*8)) + +#define ___bpf_swab16(x) ((__u16)( \ + ___bpf_mvb(x, 16, 0, 1) | \ + ___bpf_mvb(x, 16, 1, 0))) + +#define ___bpf_swab32(x) ((__u32)( \ + ___bpf_mvb(x, 32, 0, 3) | \ + ___bpf_mvb(x, 32, 1, 2) | \ + ___bpf_mvb(x, 32, 2, 1) | \ + ___bpf_mvb(x, 32, 3, 0))) + +#define ___bpf_swab64(x) ((__u64)( \ + ___bpf_mvb(x, 64, 0, 7) | \ + ___bpf_mvb(x, 64, 1, 6) | \ + ___bpf_mvb(x, 64, 2, 5) | \ + ___bpf_mvb(x, 64, 3, 4) | \ + ___bpf_mvb(x, 64, 4, 3) | \ + ___bpf_mvb(x, 64, 5, 2) | \ + ___bpf_mvb(x, 64, 6, 1) | \ + ___bpf_mvb(x, 64, 7, 0))) + +/* LLVM's BPF target selects the endianness of the CPU + * it compiles on, or the user specifies (bpfel/bpfeb), + * respectively. The used __BYTE_ORDER__ is defined by + * the compiler, we cannot rely on __BYTE_ORDER from + * libc headers, since it doesn't reflect the actual + * requested byte order. + * + * Note, LLVM's BPF target has different __builtin_bswapX() + * semantics. It does map to BPF_ALU | BPF_END | BPF_TO_BE + * in bpfel and bpfeb case, which means below, that we map + * to cpu_to_be16(). We could use it unconditionally in BPF + * case, but better not rely on it, so that this header here + * can be used from application and BPF program side, which + * use different targets. + */ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define __bpf_ntohs(x) __builtin_bswap16(x) +# define __bpf_htons(x) __builtin_bswap16(x) +# define __bpf_constant_ntohs(x) ___bpf_swab16(x) +# define __bpf_constant_htons(x) ___bpf_swab16(x) +# define __bpf_ntohl(x) __builtin_bswap32(x) +# define __bpf_htonl(x) __builtin_bswap32(x) +# define __bpf_constant_ntohl(x) ___bpf_swab32(x) +# define __bpf_constant_htonl(x) ___bpf_swab32(x) +# define __bpf_be64_to_cpu(x) __builtin_bswap64(x) +# define __bpf_cpu_to_be64(x) __builtin_bswap64(x) +# define __bpf_constant_be64_to_cpu(x) ___bpf_swab64(x) +# define __bpf_constant_cpu_to_be64(x) ___bpf_swab64(x) +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define __bpf_ntohs(x) (x) +# define __bpf_htons(x) (x) +# define __bpf_constant_ntohs(x) (x) +# define __bpf_constant_htons(x) (x) +# define __bpf_ntohl(x) (x) +# define __bpf_htonl(x) (x) +# define __bpf_constant_ntohl(x) (x) +# define __bpf_constant_htonl(x) (x) +# define __bpf_be64_to_cpu(x) (x) +# define __bpf_cpu_to_be64(x) (x) +# define __bpf_constant_be64_to_cpu(x) (x) +# define __bpf_constant_cpu_to_be64(x) (x) +#else +# error "Fix your compiler's __BYTE_ORDER__?!" +#endif + +#define bpf_htons(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_htons(x) : __bpf_htons(x)) +#define bpf_ntohs(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_ntohs(x) : __bpf_ntohs(x)) +#define bpf_htonl(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_htonl(x) : __bpf_htonl(x)) +#define bpf_ntohl(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_ntohl(x) : __bpf_ntohl(x)) +#define bpf_cpu_to_be64(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_cpu_to_be64(x) : __bpf_cpu_to_be64(x)) +#define bpf_be64_to_cpu(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_be64_to_cpu(x) : __bpf_be64_to_cpu(x)) + +#endif /* __BPF_ENDIAN__ */ diff --git a/examples/c/bpf/bpf_helper_defs.h b/examples/c/bpf/bpf_helper_defs.h new file mode 100644 index 0000000..54ab197 --- /dev/null +++ b/examples/c/bpf/bpf_helper_defs.h @@ -0,0 +1,4728 @@ +/* This is auto-generated file. See bpf_doc.py for details. */ + +/* Forward declarations of BPF structs */ +struct bpf_fib_lookup; +struct bpf_sk_lookup; +struct bpf_perf_event_data; +struct bpf_perf_event_value; +struct bpf_pidns_info; +struct bpf_redir_neigh; +struct bpf_sock; +struct bpf_sock_addr; +struct bpf_sock_ops; +struct bpf_sock_tuple; +struct bpf_spin_lock; +struct bpf_sysctl; +struct bpf_tcp_sock; +struct bpf_tunnel_key; +struct bpf_xfrm_state; +struct linux_binprm; +struct pt_regs; +struct sk_reuseport_md; +struct sockaddr; +struct tcphdr; +struct seq_file; +struct tcp6_sock; +struct tcp_sock; +struct tcp_timewait_sock; +struct tcp_request_sock; +struct udp6_sock; +struct unix_sock; +struct task_struct; +struct cgroup; +struct __sk_buff; +struct sk_msg_md; +struct xdp_md; +struct path; +struct btf_ptr; +struct inode; +struct socket; +struct file; +struct bpf_timer; +struct mptcp_sock; +struct bpf_dynptr; +struct iphdr; +struct ipv6hdr; + +/* + * bpf_map_lookup_elem + * + * Perform a lookup in *map* for an entry associated to *key*. + * + * Returns + * Map value associated to *key*, or **NULL** if no entry was + * found. + */ +static void *(*bpf_map_lookup_elem)(void *map, const void *key) = (void *) 1; + +/* + * bpf_map_update_elem + * + * Add or update the value of the entry associated to *key* in + * *map* with *value*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * Flag value **BPF_NOEXIST** cannot be used for maps of types + * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all + * elements always exist), the helper would return an error. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_update_elem)(void *map, const void *key, const void *value, __u64 flags) = (void *) 2; + +/* + * bpf_map_delete_elem + * + * Delete entry with *key* from *map*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_delete_elem)(void *map, const void *key) = (void *) 3; + +/* + * bpf_probe_read + * + * For tracing programs, safely attempt to read *size* bytes from + * kernel space address *unsafe_ptr* and store the data in *dst*. + * + * Generally, use **bpf_probe_read_user**\ () or + * **bpf_probe_read_kernel**\ () instead. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_read)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 4; + +/* + * bpf_ktime_get_ns + * + * Return the time elapsed since system boot, in nanoseconds. + * Does not include time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_MONOTONIC**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_ns)(void) = (void *) 5; + +/* + * bpf_trace_printk + * + * This helper is a "printk()-like" facility for debugging. It + * prints a message defined by format *fmt* (of size *fmt_size*) + * to file *\/sys/kernel/debug/tracing/trace* from DebugFS, if + * available. It can take up to three additional **u64** + * arguments (as an eBPF helpers, the total number of arguments is + * limited to five). + * + * Each time the helper is called, it appends a line to the trace. + * Lines are discarded while *\/sys/kernel/debug/tracing/trace* is + * open, use *\/sys/kernel/debug/tracing/trace_pipe* to avoid this. + * The format of the trace is customizable, and the exact output + * one will get depends on the options set in + * *\/sys/kernel/debug/tracing/trace_options* (see also the + * *README* file under the same directory). However, it usually + * defaults to something like: + * + * :: + * + * telnet-470 [001] .N.. 419421.045894: 0x00000001: + * + * In the above: + * + * * ``telnet`` is the name of the current task. + * * ``470`` is the PID of the current task. + * * ``001`` is the CPU number on which the task is + * running. + * * In ``.N..``, each character refers to a set of + * options (whether irqs are enabled, scheduling + * options, whether hard/softirqs are running, level of + * preempt_disabled respectively). **N** means that + * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** + * are set. + * * ``419421.045894`` is a timestamp. + * * ``0x00000001`` is a fake value used by BPF for the + * instruction pointer register. + * * ```` is the message formatted with + * *fmt*. + * + * The conversion specifiers supported by *fmt* are similar, but + * more limited than for printk(). They are **%d**, **%i**, + * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, + * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size + * of field, padding with zeroes, etc.) is available, and the + * helper will return **-EINVAL** (but print nothing) if it + * encounters an unknown specifier. + * + * Also, note that **bpf_trace_printk**\ () is slow, and should + * only be used for debugging purposes. For this reason, a notice + * block (spanning several lines) is printed to kernel logs and + * states that the helper should not be used "for production use" + * the first time this helper is used (or more precisely, when + * **trace_printk**\ () buffers are allocated). For passing values + * to user space, perf events should be preferred. + * + * Returns + * The number of bytes written to the buffer, or a negative error + * in case of failure. + */ +static long (*bpf_trace_printk)(const char *fmt, __u32 fmt_size, ...) = (void *) 6; + +/* + * bpf_get_prandom_u32 + * + * Get a pseudo-random number. + * + * From a security point of view, this helper uses its own + * pseudo-random internal state, and cannot be used to infer the + * seed of other random functions in the kernel. However, it is + * essential to note that the generator used by the helper is not + * cryptographically secure. + * + * Returns + * A random 32-bit unsigned value. + */ +static __u32 (*bpf_get_prandom_u32)(void) = (void *) 7; + +/* + * bpf_get_smp_processor_id + * + * Get the SMP (symmetric multiprocessing) processor id. Note that + * all programs run with migration disabled, which means that the + * SMP processor id is stable during all the execution of the + * program. + * + * Returns + * The SMP id of the processor running the program. + */ +static __u32 (*bpf_get_smp_processor_id)(void) = (void *) 8; + +/* + * bpf_skb_store_bytes + * + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. *flags* are a combination of + * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the + * checksum for the packet after storing the bytes) and + * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ + * **->swhash** and *skb*\ **->l4hash** to 0). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_store_bytes)(struct __sk_buff *skb, __u32 offset, const void *from, __u32 len, __u64 flags) = (void *) 9; + +/* + * bpf_l3_csum_replace + * + * Recompute the layer 3 (e.g. IP) checksum for the packet + * associated to *skb*. Computation is incremental, so the helper + * must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored in *size*. + * Alternatively, it is possible to store the difference between + * the previous and the new values of the header field in *to*, by + * setting *from* and *size* to 0. For both methods, *offset* + * indicates the location of the IP checksum within the packet. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_l3_csum_replace)(struct __sk_buff *skb, __u32 offset, __u64 from, __u64 to, __u64 size) = (void *) 10; + +/* + * bpf_l4_csum_replace + * + * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the + * packet associated to *skb*. Computation is incremental, so the + * helper must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored on the lowest + * four bits of *flags*. Alternatively, it is possible to store + * the difference between the previous and the new values of the + * header field in *to*, by setting *from* and the four lowest + * bits of *flags* to 0. For both methods, *offset* indicates the + * location of the IP checksum within the packet. In addition to + * the size of the field, *flags* can be added (bitwise OR) actual + * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left + * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and + * for updates resulting in a null checksum the value is set to + * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates + * the checksum is to be computed against a pseudo-header. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_l4_csum_replace)(struct __sk_buff *skb, __u32 offset, __u64 from, __u64 to, __u64 flags) = (void *) 11; + +/* + * bpf_tail_call + * + * This special helper is used to trigger a "tail call", or in + * other words, to jump into another eBPF program. The same stack + * frame is used (but values on stack and in registers for the + * caller are not accessible to the callee). This mechanism allows + * for program chaining, either for raising the maximum number of + * available eBPF instructions, or to execute given programs in + * conditional blocks. For security reasons, there is an upper + * limit to the number of successive tail calls that can be + * performed. + * + * Upon call of this helper, the program attempts to jump into a + * program referenced at index *index* in *prog_array_map*, a + * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes + * *ctx*, a pointer to the context. + * + * If the call succeeds, the kernel immediately runs the first + * instruction of the new program. This is not a function call, + * and it never returns to the previous program. If the call + * fails, then the helper has no effect, and the caller continues + * to run its subsequent instructions. A call can fail if the + * destination program for the jump does not exist (i.e. *index* + * is superior to the number of entries in *prog_array_map*), or + * if the maximum number of tail calls has been reached for this + * chain of programs. This limit is defined in the kernel by the + * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), + * which is currently set to 33. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_tail_call)(void *ctx, void *prog_array_map, __u32 index) = (void *) 12; + +/* + * bpf_clone_redirect + * + * Clone and redirect the packet associated to *skb* to another + * net device of index *ifindex*. Both ingress and egress + * interfaces can be used for redirection. The **BPF_F_INGRESS** + * value in *flags* is used to make the distinction (ingress path + * is selected if the flag is present, egress path otherwise). + * This is the only flag supported for now. + * + * In comparison with **bpf_redirect**\ () helper, + * **bpf_clone_redirect**\ () has the associated cost of + * duplicating the packet buffer, but this can be executed out of + * the eBPF program. Conversely, **bpf_redirect**\ () is more + * efficient, but it is handled through an action code where the + * redirection happens only after the eBPF program has returned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_clone_redirect)(struct __sk_buff *skb, __u32 ifindex, __u64 flags) = (void *) 13; + +/* + * bpf_get_current_pid_tgid + * + * Get the current pid and tgid. + * + * Returns + * A 64-bit integer containing the current tgid and pid, and + * created as such: + * *current_task*\ **->tgid << 32 \|** + * *current_task*\ **->pid**. + */ +static __u64 (*bpf_get_current_pid_tgid)(void) = (void *) 14; + +/* + * bpf_get_current_uid_gid + * + * Get the current uid and gid. + * + * Returns + * A 64-bit integer containing the current GID and UID, and + * created as such: *current_gid* **<< 32 \|** *current_uid*. + */ +static __u64 (*bpf_get_current_uid_gid)(void) = (void *) 15; + +/* + * bpf_get_current_comm + * + * Copy the **comm** attribute of the current task into *buf* of + * *size_of_buf*. The **comm** attribute contains the name of + * the executable (excluding the path) for the current task. The + * *size_of_buf* must be strictly positive. On success, the + * helper makes sure that the *buf* is NUL-terminated. On failure, + * it is filled with zeroes. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_get_current_comm)(void *buf, __u32 size_of_buf) = (void *) 16; + +/* + * bpf_get_cgroup_classid + * + * Retrieve the classid for the current task, i.e. for the net_cls + * cgroup to which *skb* belongs. + * + * This helper can be used on TC egress path, but not on ingress. + * + * The net_cls cgroup provides an interface to tag network packets + * based on a user-provided identifier for all traffic coming from + * the tasks belonging to the related cgroup. See also the related + * kernel documentation, available from the Linux sources in file + * *Documentation/admin-guide/cgroup-v1/net_cls.rst*. + * + * The Linux kernel has two versions for cgroups: there are + * cgroups v1 and cgroups v2. Both are available to users, who can + * use a mixture of them, but note that the net_cls cgroup is for + * cgroup v1 only. This makes it incompatible with BPF programs + * run on cgroups, which is a cgroup-v2-only feature (a socket can + * only hold data for one version of cgroups at a time). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to + * "**y**" or to "**m**". + * + * Returns + * The classid, or 0 for the default unconfigured classid. + */ +static __u32 (*bpf_get_cgroup_classid)(struct __sk_buff *skb) = (void *) 17; + +/* + * bpf_skb_vlan_push + * + * Push a *vlan_tci* (VLAN tag control information) of protocol + * *vlan_proto* to the packet associated to *skb*, then update + * the checksum. Note that if *vlan_proto* is different from + * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to + * be **ETH_P_8021Q**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_vlan_push)(struct __sk_buff *skb, __be16 vlan_proto, __u16 vlan_tci) = (void *) 18; + +/* + * bpf_skb_vlan_pop + * + * Pop a VLAN header from the packet associated to *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_vlan_pop)(struct __sk_buff *skb) = (void *) 19; + +/* + * bpf_skb_get_tunnel_key + * + * Get tunnel metadata. This helper takes a pointer *key* to an + * empty **struct bpf_tunnel_key** of **size**, that will be + * filled with tunnel metadata for the packet associated to *skb*. + * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which + * indicates that the tunnel is based on IPv6 protocol instead of + * IPv4. + * + * The **struct bpf_tunnel_key** is an object that generalizes the + * principal parameters used by various tunneling protocols into a + * single struct. This way, it can be used to easily make a + * decision based on the contents of the encapsulation header, + * "summarized" in this struct. In particular, it holds the IP + * address of the remote end (IPv4 or IPv6, depending on the case) + * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, + * this struct exposes the *key*\ **->tunnel_id**, which is + * generally mapped to a VNI (Virtual Network Identifier), making + * it programmable together with the **bpf_skb_set_tunnel_key**\ + * () helper. + * + * Let's imagine that the following code is part of a program + * attached to the TC ingress interface, on one end of a GRE + * tunnel, and is supposed to filter out all messages coming from + * remote ends with IPv4 address other than 10.0.0.1: + * + * :: + * + * int ret; + * struct bpf_tunnel_key key = {}; + * + * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); + * if (ret < 0) + * return TC_ACT_SHOT; // drop packet + * + * if (key.remote_ipv4 != 0x0a000001) + * return TC_ACT_SHOT; // drop packet + * + * return TC_ACT_OK; // accept packet + * + * This interface can also be used with all encapsulation devices + * that can operate in "collect metadata" mode: instead of having + * one network device per specific configuration, the "collect + * metadata" mode only requires a single device where the + * configuration can be extracted from this helper. + * + * This can be used together with various tunnels such as VXLan, + * Geneve, GRE or IP in IP (IPIP). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_get_tunnel_key)(struct __sk_buff *skb, struct bpf_tunnel_key *key, __u32 size, __u64 flags) = (void *) 20; + +/* + * bpf_skb_set_tunnel_key + * + * Populate tunnel metadata for packet associated to *skb.* The + * tunnel metadata is set to the contents of *key*, of *size*. The + * *flags* can be set to a combination of the following values: + * + * **BPF_F_TUNINFO_IPV6** + * Indicate that the tunnel is based on IPv6 protocol + * instead of IPv4. + * **BPF_F_ZERO_CSUM_TX** + * For IPv4 packets, add a flag to tunnel metadata + * indicating that checksum computation should be skipped + * and checksum set to zeroes. + * **BPF_F_DONT_FRAGMENT** + * Add a flag to tunnel metadata indicating that the + * packet should not be fragmented. + * **BPF_F_SEQ_NUMBER** + * Add a flag to tunnel metadata indicating that a + * sequence number should be added to tunnel header before + * sending the packet. This flag was added for GRE + * encapsulation, but might be used with other protocols + * as well in the future. + * **BPF_F_NO_TUNNEL_KEY** + * Add a flag to tunnel metadata indicating that no tunnel + * key should be set in the resulting tunnel header. + * + * Here is a typical usage on the transmit path: + * + * :: + * + * struct bpf_tunnel_key key; + * populate key ... + * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); + * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); + * + * See also the description of the **bpf_skb_get_tunnel_key**\ () + * helper for additional information. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_set_tunnel_key)(struct __sk_buff *skb, struct bpf_tunnel_key *key, __u32 size, __u64 flags) = (void *) 21; + +/* + * bpf_perf_event_read + * + * Read the value of a perf event counter. This helper relies on a + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of + * the perf event counter is selected when *map* is updated with + * perf event file descriptors. The *map* is an array whose size + * is the number of available CPUs, and each cell contains a value + * relative to one CPU. The value to retrieve is indicated by + * *flags*, that contains the index of the CPU to look up, masked + * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * Note that before Linux 4.13, only hardware perf event can be + * retrieved. + * + * Also, be aware that the newer helper + * **bpf_perf_event_read_value**\ () is recommended over + * **bpf_perf_event_read**\ () in general. The latter has some ABI + * quirks where error and counter value are used as a return code + * (which is wrong to do since ranges may overlap). This issue is + * fixed with **bpf_perf_event_read_value**\ (), which at the same + * time provides more features over the **bpf_perf_event_read**\ + * () interface. Please refer to the description of + * **bpf_perf_event_read_value**\ () for details. + * + * Returns + * The value of the perf event counter read from the map, or a + * negative error code in case of failure. + */ +static __u64 (*bpf_perf_event_read)(void *map, __u64 flags) = (void *) 22; + +/* + * bpf_redirect + * + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_clone_redirect**\ + * (), except that the packet is not cloned, which provides + * increased performance. + * + * Except for XDP, both ingress and egress interfaces can be used + * for redirection. The **BPF_F_INGRESS** value in *flags* is used + * to make the distinction (ingress path is selected if the flag + * is present, egress path otherwise). Currently, XDP only + * supports redirection to the egress interface, and accepts no + * flag at all. + * + * The same effect can also be attained with the more generic + * **bpf_redirect_map**\ (), which uses a BPF map to store the + * redirect target instead of providing it directly to the helper. + * + * Returns + * For XDP, the helper returns **XDP_REDIRECT** on success or + * **XDP_ABORTED** on error. For other program types, the values + * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on + * error. + */ +static long (*bpf_redirect)(__u32 ifindex, __u64 flags) = (void *) 23; + +/* + * bpf_get_route_realm + * + * Retrieve the realm or the route, that is to say the + * **tclassid** field of the destination for the *skb*. The + * identifier retrieved is a user-provided tag, similar to the + * one used with the net_cls cgroup (see description for + * **bpf_get_cgroup_classid**\ () helper), but here this tag is + * held by a route (a destination entry), not by a task. + * + * Retrieving this identifier works with the clsact TC egress hook + * (see also **tc-bpf(8)**), or alternatively on conventional + * classful egress qdiscs, but not on TC ingress path. In case of + * clsact TC egress hook, this has the advantage that, internally, + * the destination entry has not been dropped yet in the transmit + * path. Therefore, the destination entry does not need to be + * artificially held via **netif_keep_dst**\ () for a classful + * qdisc until the *skb* is freed. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_IP_ROUTE_CLASSID** configuration option. + * + * Returns + * The realm of the route for the packet associated to *skb*, or 0 + * if none was found. + */ +static __u32 (*bpf_get_route_realm)(struct __sk_buff *skb) = (void *) 24; + +/* + * bpf_perf_event_output + * + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * The context of the program *ctx* needs also be passed to the + * helper. + * + * On user space, a program willing to read the values needs to + * call **perf_event_open**\ () on the perf event (either for + * one or for all CPUs) and to store the file descriptor into the + * *map*. This must be done before the eBPF program can send data + * into it. An example is available in file + * *samples/bpf/trace_output_user.c* in the Linux kernel source + * tree (the eBPF program counterpart is in + * *samples/bpf/trace_output_kern.c*). + * + * **bpf_perf_event_output**\ () achieves better performance + * than **bpf_trace_printk**\ () for sharing data with user + * space, and is much better suitable for streaming data from eBPF + * programs. + * + * Note that this helper is not restricted to tracing use cases + * and can be used with programs attached to TC or XDP as well, + * where it allows for passing data to user space listeners. Data + * can be: + * + * * Only custom structs, + * * Only the packet payload, or + * * A combination of both. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_perf_event_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 25; + +/* + * bpf_skb_load_bytes + * + * This helper was provided as an easy way to load data from a + * packet. It can be used to load *len* bytes from *offset* from + * the packet associated to *skb*, into the buffer pointed by + * *to*. + * + * Since Linux 4.7, usage of this helper has mostly been replaced + * by "direct packet access", enabling packet data to be + * manipulated with *skb*\ **->data** and *skb*\ **->data_end** + * pointing respectively to the first byte of packet data and to + * the byte after the last byte of packet data. However, it + * remains useful if one wishes to read large quantities of data + * at once from a packet into the eBPF stack. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_load_bytes)(const void *skb, __u32 offset, void *to, __u32 len) = (void *) 26; + +/* + * bpf_get_stackid + * + * Walk a user or a kernel stack and return its id. To achieve + * this, the helper needs *ctx*, which is a pointer to the context + * on which the tracing program is executed, and a pointer to a + * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * a combination of the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_FAST_STACK_CMP** + * Compare stacks by hash only. + * **BPF_F_REUSE_STACKID** + * If two different stacks hash into the same *stackid*, + * discard the old one. + * + * The stack id retrieved is a 32 bit long integer handle which + * can be further combined with other data (including other stack + * ids) and used as a key into maps. This can be useful for + * generating a variety of graphs (such as flame graphs or off-cpu + * graphs). + * + * For walking a stack, this helper is an improvement over + * **bpf_probe_read**\ (), which can be used with unrolled loops + * but is not efficient and consumes a lot of eBPF instructions. + * Instead, **bpf_get_stackid**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * + * Returns + * The positive or null stack id on success, or a negative error + * in case of failure. + */ +static long (*bpf_get_stackid)(void *ctx, void *map, __u64 flags) = (void *) 27; + +/* + * bpf_csum_diff + * + * Compute a checksum difference, from the raw buffer pointed by + * *from*, of length *from_size* (that must be a multiple of 4), + * towards the raw buffer pointed by *to*, of size *to_size* + * (same remark). An optional *seed* can be added to the value + * (this can be cascaded, the seed may come from a previous call + * to the helper). + * + * This is flexible enough to be used in several ways: + * + * * With *from_size* == 0, *to_size* > 0 and *seed* set to + * checksum, it can be used when pushing new data. + * * With *from_size* > 0, *to_size* == 0 and *seed* set to + * checksum, it can be used when removing data from a packet. + * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it + * can be used to compute a diff. Note that *from_size* and + * *to_size* do not need to be equal. + * + * This helper can be used in combination with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to + * which one can feed in the difference computed with + * **bpf_csum_diff**\ (). + * + * Returns + * The checksum result, or a negative error code in case of + * failure. + */ +static __s64 (*bpf_csum_diff)(__be32 *from, __u32 from_size, __be32 *to, __u32 to_size, __wsum seed) = (void *) 28; + +/* + * bpf_skb_get_tunnel_opt + * + * Retrieve tunnel options metadata for the packet associated to + * *skb*, and store the raw tunnel option data to the buffer *opt* + * of *size*. + * + * This helper can be used with encapsulation devices that can + * operate in "collect metadata" mode (please refer to the related + * note in the description of **bpf_skb_get_tunnel_key**\ () for + * more details). A particular example where this can be used is + * in combination with the Geneve encapsulation protocol, where it + * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) + * and retrieving arbitrary TLVs (Type-Length-Value headers) from + * the eBPF program. This allows for full customization of these + * headers. + * + * Returns + * The size of the option data retrieved. + */ +static long (*bpf_skb_get_tunnel_opt)(struct __sk_buff *skb, void *opt, __u32 size) = (void *) 29; + +/* + * bpf_skb_set_tunnel_opt + * + * Set tunnel options metadata for the packet associated to *skb* + * to the option data contained in the raw buffer *opt* of *size*. + * + * See also the description of the **bpf_skb_get_tunnel_opt**\ () + * helper for additional information. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_set_tunnel_opt)(struct __sk_buff *skb, void *opt, __u32 size) = (void *) 30; + +/* + * bpf_skb_change_proto + * + * Change the protocol of the *skb* to *proto*. Currently + * supported are transition from IPv4 to IPv6, and from IPv6 to + * IPv4. The helper takes care of the groundwork for the + * transition, including resizing the socket buffer. The eBPF + * program is expected to fill the new headers, if any, via + * **skb_store_bytes**\ () and to recompute the checksums with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ + * (). The main case for this helper is to perform NAT64 + * operations out of an eBPF program. + * + * Internally, the GSO type is marked as dodgy so that headers are + * checked and segments are recalculated by the GSO/GRO engine. + * The size for GSO target is adapted as well. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_proto)(struct __sk_buff *skb, __be16 proto, __u64 flags) = (void *) 31; + +/* + * bpf_skb_change_type + * + * Change the packet type for the packet associated to *skb*. This + * comes down to setting *skb*\ **->pkt_type** to *type*, except + * the eBPF program does not have a write access to *skb*\ + * **->pkt_type** beside this helper. Using a helper here allows + * for graceful handling of errors. + * + * The major use case is to change incoming *skb*s to + * **PACKET_HOST** in a programmatic way instead of having to + * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for + * example. + * + * Note that *type* only allows certain values. At this time, they + * are: + * + * **PACKET_HOST** + * Packet is for us. + * **PACKET_BROADCAST** + * Send packet to all. + * **PACKET_MULTICAST** + * Send packet to group. + * **PACKET_OTHERHOST** + * Send packet to someone else. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_type)(struct __sk_buff *skb, __u32 type) = (void *) 32; + +/* + * bpf_skb_under_cgroup + * + * Check whether *skb* is a descendant of the cgroup2 held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * + * Returns + * The return value depends on the result of the test, and can be: + * + * * 0, if the *skb* failed the cgroup2 descendant test. + * * 1, if the *skb* succeeded the cgroup2 descendant test. + * * A negative error code, if an error occurred. + */ +static long (*bpf_skb_under_cgroup)(struct __sk_buff *skb, void *map, __u32 index) = (void *) 33; + +/* + * bpf_get_hash_recalc + * + * Retrieve the hash of the packet, *skb*\ **->hash**. If it is + * not set, in particular if the hash was cleared due to mangling, + * recompute this hash. Later accesses to the hash can be done + * directly with *skb*\ **->hash**. + * + * Calling **bpf_set_hash_invalid**\ (), changing a packet + * prototype with **bpf_skb_change_proto**\ (), or calling + * **bpf_skb_store_bytes**\ () with the + * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear + * the hash and to trigger a new computation for the next call to + * **bpf_get_hash_recalc**\ (). + * + * Returns + * The 32-bit hash. + */ +static __u32 (*bpf_get_hash_recalc)(struct __sk_buff *skb) = (void *) 34; + +/* + * bpf_get_current_task + * + * Get the current task. + * + * Returns + * A pointer to the current task struct. + */ +static __u64 (*bpf_get_current_task)(void) = (void *) 35; + +/* + * bpf_probe_write_user + * + * Attempt in a safe way to write *len* bytes from the buffer + * *src* to *dst* in memory. It only works for threads that are in + * user context, and *dst* must be a valid user space address. + * + * This helper should not be used to implement any kind of + * security mechanism because of TOC-TOU attacks, but rather to + * debug, divert, and manipulate execution of semi-cooperative + * processes. + * + * Keep in mind that this feature is meant for experiments, and it + * has a risk of crashing the system and running programs. + * Therefore, when an eBPF program using this helper is attached, + * a warning including PID and process name is printed to kernel + * logs. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_write_user)(void *dst, const void *src, __u32 len) = (void *) 36; + +/* + * bpf_current_task_under_cgroup + * + * Check whether the probe is being run is the context of a given + * subset of the cgroup2 hierarchy. The cgroup2 to test is held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * + * Returns + * The return value depends on the result of the test, and can be: + * + * * 1, if current task belongs to the cgroup2. + * * 0, if current task does not belong to the cgroup2. + * * A negative error code, if an error occurred. + */ +static long (*bpf_current_task_under_cgroup)(void *map, __u32 index) = (void *) 37; + +/* + * bpf_skb_change_tail + * + * Resize (trim or grow) the packet associated to *skb* to the + * new *len*. The *flags* are reserved for future usage, and must + * be left at zero. + * + * The basic idea is that the helper performs the needed work to + * change the size of the packet, then the eBPF program rewrites + * the rest via helpers like **bpf_skb_store_bytes**\ (), + * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () + * and others. This helper is a slow path utility intended for + * replies with control messages. And because it is targeted for + * slow path, the helper itself can afford to be slow: it + * implicitly linearizes, unclones and drops offloads from the + * *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_tail)(struct __sk_buff *skb, __u32 len, __u64 flags) = (void *) 38; + +/* + * bpf_skb_pull_data + * + * Pull in non-linear data in case the *skb* is non-linear and not + * all of *len* are part of the linear section. Make *len* bytes + * from *skb* readable and writable. If a zero value is passed for + * *len*, then all bytes in the linear part of *skb* will be made + * readable and writable. + * + * This helper is only needed for reading and writing with direct + * packet access. + * + * For direct packet access, testing that offsets to access + * are within packet boundaries (test on *skb*\ **->data_end**) is + * susceptible to fail if offsets are invalid, or if the requested + * data is in non-linear parts of the *skb*. On failure the + * program can just bail out, or in the case of a non-linear + * buffer, use a helper to make the data available. The + * **bpf_skb_load_bytes**\ () helper is a first solution to access + * the data. Another one consists in using **bpf_skb_pull_data** + * to pull in once the non-linear parts, then retesting and + * eventually access the data. + * + * At the same time, this also makes sure the *skb* is uncloned, + * which is a necessary condition for direct write. As this needs + * to be an invariant for the write part only, the verifier + * detects writes and adds a prologue that is calling + * **bpf_skb_pull_data()** to effectively unclone the *skb* from + * the very beginning in case it is indeed cloned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_pull_data)(struct __sk_buff *skb, __u32 len) = (void *) 39; + +/* + * bpf_csum_update + * + * Add the checksum *csum* into *skb*\ **->csum** in case the + * driver has supplied a checksum for the entire packet into that + * field. Return an error otherwise. This helper is intended to be + * used in combination with **bpf_csum_diff**\ (), in particular + * when the checksum needs to be updated after data has been + * written into the packet through direct packet access. + * + * Returns + * The checksum on success, or a negative error code in case of + * failure. + */ +static __s64 (*bpf_csum_update)(struct __sk_buff *skb, __wsum csum) = (void *) 40; + +/* + * bpf_set_hash_invalid + * + * Invalidate the current *skb*\ **->hash**. It can be used after + * mangling on headers through direct packet access, in order to + * indicate that the hash is outdated and to trigger a + * recalculation the next time the kernel tries to access this + * hash or when the **bpf_get_hash_recalc**\ () helper is called. + * + * Returns + * void. + */ +static void (*bpf_set_hash_invalid)(struct __sk_buff *skb) = (void *) 41; + +/* + * bpf_get_numa_node_id + * + * Return the id of the current NUMA node. The primary use case + * for this helper is the selection of sockets for the local NUMA + * node, when the program is attached to sockets using the + * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), + * but the helper is also available to other eBPF program types, + * similarly to **bpf_get_smp_processor_id**\ (). + * + * Returns + * The id of current NUMA node. + */ +static long (*bpf_get_numa_node_id)(void) = (void *) 42; + +/* + * bpf_skb_change_head + * + * Grows headroom of packet associated to *skb* and adjusts the + * offset of the MAC header accordingly, adding *len* bytes of + * space. It automatically extends and reallocates memory as + * required. + * + * This helper can be used on a layer 3 *skb* to push a MAC header + * for redirection into a layer 2 device. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_head)(struct __sk_buff *skb, __u32 len, __u64 flags) = (void *) 43; + +/* + * bpf_xdp_adjust_head + * + * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that + * it is possible to use a negative value for *delta*. This helper + * can be used to prepare the packet for pushing or popping + * headers. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_adjust_head)(struct xdp_md *xdp_md, int delta) = (void *) 44; + +/* + * bpf_probe_read_str + * + * Copy a NUL terminated string from an unsafe kernel address + * *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for + * more details. + * + * Generally, use **bpf_probe_read_user_str**\ () or + * **bpf_probe_read_kernel_str**\ () instead. + * + * Returns + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + */ +static long (*bpf_probe_read_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 45; + +/* + * bpf_get_socket_cookie + * + * If the **struct sk_buff** pointed by *skb* has a known socket, + * retrieve the cookie (generated by the kernel) of this socket. + * If no cookie has been set yet, generate a new cookie. Once + * generated, the socket cookie remains stable for the life of the + * socket. This helper can be useful for monitoring per socket + * networking traffic statistics as it provides a global socket + * identifier that can be assumed unique. + * + * Returns + * A 8-byte long unique number on success, or 0 if the socket + * field is missing inside *skb*. + */ +static __u64 (*bpf_get_socket_cookie)(void *ctx) = (void *) 46; + +/* + * bpf_get_socket_uid + * + * Get the owner UID of the socked associated to *skb*. + * + * Returns + * The owner UID of the socket associated to *skb*. If the socket + * is **NULL**, or if it is not a full socket (i.e. if it is a + * time-wait or a request socket instead), **overflowuid** value + * is returned (note that **overflowuid** might also be the actual + * UID value for the socket). + */ +static __u32 (*bpf_get_socket_uid)(struct __sk_buff *skb) = (void *) 47; + +/* + * bpf_set_hash + * + * Set the full hash for *skb* (set the field *skb*\ **->hash**) + * to value *hash*. + * + * Returns + * 0 + */ +static long (*bpf_set_hash)(struct __sk_buff *skb, __u32 hash) = (void *) 48; + +/* + * bpf_setsockopt + * + * Emulate a call to **setsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **setsockopt(2)** for more information. + * The option value of length *optlen* is pointed by *optval*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **setsockopt()**. + * It supports the following *level*\ s: + * + * * **SOL_SOCKET**, which supports the following *optname*\ s: + * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, + * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**, + * **SO_BINDTODEVICE**, **SO_KEEPALIVE**, **SO_REUSEADDR**, + * **SO_REUSEPORT**, **SO_BINDTOIFINDEX**, **SO_TXREHASH**. + * * **IPPROTO_TCP**, which supports the following *optname*\ s: + * **TCP_CONGESTION**, **TCP_BPF_IW**, + * **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, + * **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, + * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**, + * **TCP_NODELAY**, **TCP_MAXSEG**, **TCP_WINDOW_CLAMP**, + * **TCP_THIN_LINEAR_TIMEOUTS**, **TCP_BPF_DELACK_MAX**, + * **TCP_BPF_RTO_MIN**. + * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. + * * **IPPROTO_IPV6**, which supports the following *optname*\ s: + * **IPV6_TCLASS**, **IPV6_AUTOFLOWLABEL**. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_setsockopt)(void *bpf_socket, int level, int optname, void *optval, int optlen) = (void *) 49; + +/* + * bpf_skb_adjust_room + * + * Grow or shrink the room for data in the packet associated to + * *skb* by *len_diff*, and according to the selected *mode*. + * + * By default, the helper will reset any offloaded checksum + * indicator of the skb to CHECKSUM_NONE. This can be avoided + * by the following flag: + * + * * **BPF_F_ADJ_ROOM_NO_CSUM_RESET**: Do not reset offloaded + * checksum data of the skb to CHECKSUM_NONE. + * + * There are two supported modes at this time: + * + * * **BPF_ADJ_ROOM_MAC**: Adjust room at the mac layer + * (room space is added or removed between the layer 2 and + * layer 3 headers). + * + * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer + * (room space is added or removed between the layer 3 and + * layer 4 headers). + * + * The following flags are supported at this time: + * + * * **BPF_F_ADJ_ROOM_FIXED_GSO**: Do not adjust gso_size. + * Adjusting mss in this way is not allowed for datagrams. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV6**: + * Any new space is reserved to hold a tunnel header. + * Configure skb offsets and other fields accordingly. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L4_GRE**, + * **BPF_F_ADJ_ROOM_ENCAP_L4_UDP**: + * Use with ENCAP_L3 flags to further specify the tunnel type. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2**\ (*len*): + * Use with ENCAP_L3/L4 flags to further specify the tunnel + * type; *len* is the length of the inner MAC header. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2_ETH**: + * Use with BPF_F_ADJ_ROOM_ENCAP_L2 flag to further specify the + * L2 type as Ethernet. + * + * * **BPF_F_ADJ_ROOM_DECAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_DECAP_L3_IPV6**: + * Indicate the new IP header version after decapsulating the outer + * IP header. Used when the inner and outer IP versions are different. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_adjust_room)(struct __sk_buff *skb, __s32 len_diff, __u32 mode, __u64 flags) = (void *) 50; + +/* + * bpf_redirect_map + * + * Redirect the packet to the endpoint referenced by *map* at + * index *key*. Depending on its type, this *map* can contain + * references to net devices (for forwarding packets through other + * ports), or to CPUs (for redirecting XDP frames to another CPU; + * but this is only implemented for native XDP (with driver + * support) as of this writing). + * + * The lower two bits of *flags* are used as the return code if + * the map lookup fails. This is so that the return value can be + * one of the XDP program return codes up to **XDP_TX**, as chosen + * by the caller. The higher bits of *flags* can be set to + * BPF_F_BROADCAST or BPF_F_EXCLUDE_INGRESS as defined below. + * + * With BPF_F_BROADCAST the packet will be broadcasted to all the + * interfaces in the map, with BPF_F_EXCLUDE_INGRESS the ingress + * interface will be excluded when do broadcasting. + * + * See also **bpf_redirect**\ (), which only supports redirecting + * to an ifindex, but doesn't require a map to do so. + * + * Returns + * **XDP_REDIRECT** on success, or the value of the two lower bits + * of the *flags* argument on error. + */ +static long (*bpf_redirect_map)(void *map, __u64 key, __u64 flags) = (void *) 51; + +/* + * bpf_sk_redirect_map + * + * Redirect the packet to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_sk_redirect_map)(struct __sk_buff *skb, void *map, __u32 key, __u64 flags) = (void *) 52; + +/* + * bpf_sock_map_update + * + * Add an entry to, or update a *map* referencing sockets. The + * *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sock_map_update)(struct bpf_sock_ops *skops, void *map, void *key, __u64 flags) = (void *) 53; + +/* + * bpf_xdp_adjust_meta + * + * Adjust the address pointed by *xdp_md*\ **->data_meta** by + * *delta* (which can be positive or negative). Note that this + * operation modifies the address stored in *xdp_md*\ **->data**, + * so the latter must be loaded only after the helper has been + * called. + * + * The use of *xdp_md*\ **->data_meta** is optional and programs + * are not required to use it. The rationale is that when the + * packet is processed with XDP (e.g. as DoS filter), it is + * possible to push further meta data along with it before passing + * to the stack, and to give the guarantee that an ingress eBPF + * program attached as a TC classifier on the same device can pick + * this up for further post-processing. Since TC works with socket + * buffers, it remains possible to set from XDP the **mark** or + * **priority** pointers, or other pointers for the socket buffer. + * Having this scratch space generic and programmable allows for + * more flexibility as the user is free to store whatever meta + * data they need. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_adjust_meta)(struct xdp_md *xdp_md, int delta) = (void *) 54; + +/* + * bpf_perf_event_read_value + * + * Read the value of a perf event counter, and store it into *buf* + * of size *buf_size*. This helper relies on a *map* of type + * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event + * counter is selected when *map* is updated with perf event file + * descriptors. The *map* is an array whose size is the number of + * available CPUs, and each cell contains a value relative to one + * CPU. The value to retrieve is indicated by *flags*, that + * contains the index of the CPU to look up, masked with + * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * This helper behaves in a way close to + * **bpf_perf_event_read**\ () helper, save that instead of + * just returning the value observed, it fills the *buf* + * structure. This allows for additional data to be retrieved: in + * particular, the enabled and running times (in *buf*\ + * **->enabled** and *buf*\ **->running**, respectively) are + * copied. In general, **bpf_perf_event_read_value**\ () is + * recommended over **bpf_perf_event_read**\ (), which has some + * ABI issues and provides fewer functionalities. + * + * These values are interesting, because hardware PMU (Performance + * Monitoring Unit) counters are limited resources. When there are + * more PMU based perf events opened than available counters, + * kernel will multiplex these events so each event gets certain + * percentage (but not all) of the PMU time. In case that + * multiplexing happens, the number of samples or counter value + * will not reflect the case compared to when no multiplexing + * occurs. This makes comparison between different runs difficult. + * Typically, the counter value should be normalized before + * comparing to other experiments. The usual normalization is done + * as follows. + * + * :: + * + * normalized_counter = counter * t_enabled / t_running + * + * Where t_enabled is the time enabled for event and t_running is + * the time running for event since last normalization. The + * enabled and running times are accumulated since the perf event + * open. To achieve scaling factor between two invocations of an + * eBPF program, users can use CPU id as the key (which is + * typical for perf array usage model) to remember the previous + * value and do the calculation inside the eBPF program. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_perf_event_read_value)(void *map, __u64 flags, struct bpf_perf_event_value *buf, __u32 buf_size) = (void *) 55; + +/* + * bpf_perf_prog_read_value + * + * For an eBPF program attached to a perf event, retrieve the + * value of the event counter associated to *ctx* and store it in + * the structure pointed by *buf* and of size *buf_size*. Enabled + * and running times are also stored in the structure (see + * description of helper **bpf_perf_event_read_value**\ () for + * more details). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_perf_prog_read_value)(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, __u32 buf_size) = (void *) 56; + +/* + * bpf_getsockopt + * + * Emulate a call to **getsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **getsockopt(2)** for more information. + * The retrieved value is stored in the structure pointed by + * *opval* and of length *optlen*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **getsockopt()**. + * It supports the same set of *optname*\ s that is supported by + * the **bpf_setsockopt**\ () helper. The exceptions are + * **TCP_BPF_*** is **bpf_setsockopt**\ () only and + * **TCP_SAVED_SYN** is **bpf_getsockopt**\ () only. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_getsockopt)(void *bpf_socket, int level, int optname, void *optval, int optlen) = (void *) 57; + +/* + * bpf_override_return + * + * Used for error injection, this helper uses kprobes to override + * the return value of the probed function, and to set it to *rc*. + * The first argument is the context *regs* on which the kprobe + * works. + * + * This helper works by setting the PC (program counter) + * to an override function which is run in place of the original + * probed function. This means the probed function is not run at + * all. The replacement function just returns with the required + * value. + * + * This helper has security implications, and thus is subject to + * restrictions. It is only available if the kernel was compiled + * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration + * option, and in this case it only works on functions tagged with + * **ALLOW_ERROR_INJECTION** in the kernel code. + * + * Also, the helper is only available for the architectures having + * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, + * x86 architecture is the only one to support this feature. + * + * Returns + * 0 + */ +static long (*bpf_override_return)(struct pt_regs *regs, __u64 rc) = (void *) 58; + +/* + * bpf_sock_ops_cb_flags_set + * + * Attempt to set the value of the **bpf_sock_ops_cb_flags** field + * for the full TCP socket associated to *bpf_sock_ops* to + * *argval*. + * + * The primary use of this field is to determine if there should + * be calls to eBPF programs of type + * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP + * code. A program of the same type can change its value, per + * connection and as necessary, when the connection is + * established. This field is directly accessible for reading, but + * this helper must be used for updates in order to return an + * error if an eBPF program tries to set a callback that is not + * supported in the current kernel. + * + * *argval* is a flag array which can combine these flags: + * + * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) + * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) + * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) + * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) + * + * Therefore, this function can be used to clear a callback flag by + * setting the appropriate bit to zero. e.g. to disable the RTO + * callback: + * + * **bpf_sock_ops_cb_flags_set(bpf_sock,** + * **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)** + * + * Here are some examples of where one could call such eBPF + * program: + * + * * When RTO fires. + * * When a packet is retransmitted. + * * When the connection terminates. + * * When a packet is sent. + * * When a packet is received. + * + * Returns + * Code **-EINVAL** if the socket is not a full TCP socket; + * otherwise, a positive number containing the bits that could not + * be set is returned (which comes down to 0 if all bits were set + * as required). + */ +static long (*bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops *bpf_sock, int argval) = (void *) 59; + +/* + * bpf_msg_redirect_map + * + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_msg_redirect_map)(struct sk_msg_md *msg, void *map, __u32 key, __u64 flags) = (void *) 60; + +/* + * bpf_msg_apply_bytes + * + * For socket policies, apply the verdict of the eBPF program to + * the next *bytes* (number of bytes) of message *msg*. + * + * For example, this helper can be used in the following cases: + * + * * A single **sendmsg**\ () or **sendfile**\ () system call + * contains multiple logical messages that the eBPF program is + * supposed to read and for which it should apply a verdict. + * * An eBPF program only cares to read the first *bytes* of a + * *msg*. If the message has a large payload, then setting up + * and calling the eBPF program repeatedly for all bytes, even + * though the verdict is already known, would create unnecessary + * overhead. + * + * When called from within an eBPF program, the helper sets a + * counter internal to the BPF infrastructure, that is used to + * apply the last verdict to the next *bytes*. If *bytes* is + * smaller than the current data being processed from a + * **sendmsg**\ () or **sendfile**\ () system call, the first + * *bytes* will be sent and the eBPF program will be re-run with + * the pointer for start of data pointing to byte number *bytes* + * **+ 1**. If *bytes* is larger than the current data being + * processed, then the eBPF verdict will be applied to multiple + * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are + * consumed. + * + * Note that if a socket closes with the internal counter holding + * a non-zero value, this is not a problem because data is not + * being buffered for *bytes* and is sent as it is received. + * + * Returns + * 0 + */ +static long (*bpf_msg_apply_bytes)(struct sk_msg_md *msg, __u32 bytes) = (void *) 61; + +/* + * bpf_msg_cork_bytes + * + * For socket policies, prevent the execution of the verdict eBPF + * program for message *msg* until *bytes* (byte number) have been + * accumulated. + * + * This can be used when one needs a specific number of bytes + * before a verdict can be assigned, even if the data spans + * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme + * case would be a user calling **sendmsg**\ () repeatedly with + * 1-byte long message segments. Obviously, this is bad for + * performance, but it is still valid. If the eBPF program needs + * *bytes* bytes to validate a header, this helper can be used to + * prevent the eBPF program to be called again until *bytes* have + * been accumulated. + * + * Returns + * 0 + */ +static long (*bpf_msg_cork_bytes)(struct sk_msg_md *msg, __u32 bytes) = (void *) 62; + +/* + * bpf_msg_pull_data + * + * For socket policies, pull in non-linear data from user space + * for *msg* and set pointers *msg*\ **->data** and *msg*\ + * **->data_end** to *start* and *end* bytes offsets into *msg*, + * respectively. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it can only parse data that the (**data**, **data_end**) + * pointers have already consumed. For **sendmsg**\ () hooks this + * is likely the first scatterlist element. But for calls relying + * on the **sendpage** handler (e.g. **sendfile**\ ()) this will + * be the range (**0**, **0**) because the data is shared with + * user space and by default the objective is to avoid allowing + * user space to modify data while (or after) eBPF verdict is + * being decided. This helper can be used to pull in data and to + * set the start and end pointer to given values. Data will be + * copied if necessary (i.e. if data was not linear and if start + * and end pointers do not point to the same chunk). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_msg_pull_data)(struct sk_msg_md *msg, __u32 start, __u32 end, __u64 flags) = (void *) 63; + +/* + * bpf_bind + * + * Bind the socket associated to *ctx* to the address pointed by + * *addr*, of length *addr_len*. This allows for making outgoing + * connection from the desired IP address, which can be useful for + * example when all processes inside a cgroup should use one + * single IP address on a host that has multiple IP configured. + * + * This helper works for IPv4 and IPv6, TCP and UDP sockets. The + * domain (*addr*\ **->sa_family**) must be **AF_INET** (or + * **AF_INET6**). It's advised to pass zero port (**sin_port** + * or **sin6_port**) which triggers IP_BIND_ADDRESS_NO_PORT-like + * behavior and lets the kernel efficiently pick up an unused + * port as long as 4-tuple is unique. Passing non-zero port might + * lead to degraded performance. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_bind)(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) = (void *) 64; + +/* + * bpf_xdp_adjust_tail + * + * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is + * possible to both shrink and grow the packet tail. + * Shrink done via *delta* being a negative integer. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_adjust_tail)(struct xdp_md *xdp_md, int delta) = (void *) 65; + +/* + * bpf_skb_get_xfrm_state + * + * Retrieve the XFRM state (IP transform framework, see also + * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. + * + * The retrieved value is stored in the **struct bpf_xfrm_state** + * pointed by *xfrm_state* and of length *size*. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_XFRM** configuration option. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_get_xfrm_state)(struct __sk_buff *skb, __u32 index, struct bpf_xfrm_state *xfrm_state, __u32 size, __u64 flags) = (void *) 66; + +/* + * bpf_get_stack + * + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *ctx*, which is a pointer + * to the context on which the tracing program is executed. + * To store the stacktrace, the bpf program provides *buf* with + * a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect (build_id, file_offset) instead of ips for user + * stack, only valid if **BPF_F_USER_STACK** is also + * specified. + * + * *file_offset* is an offset relative to the beginning + * of the executable or shared object file backing the vma + * which the *ip* falls in. It is *not* an offset relative + * to that object's base address. Accordingly, it must be + * adjusted by adding (sh_addr - sh_offset), where + * sh_{addr,offset} correspond to the executable section + * containing *file_offset* in the object, for comparisons + * to symbols' st_value to be valid. + * + * **bpf_get_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * + * Returns + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + */ +static long (*bpf_get_stack)(void *ctx, void *buf, __u32 size, __u64 flags) = (void *) 67; + +/* + * bpf_skb_load_bytes_relative + * + * This helper is similar to **bpf_skb_load_bytes**\ () in that + * it provides an easy way to load *len* bytes from *offset* + * from the packet associated to *skb*, into the buffer pointed + * by *to*. The difference to **bpf_skb_load_bytes**\ () is that + * a fifth argument *start_header* exists in order to select a + * base offset to start from. *start_header* can be one of: + * + * **BPF_HDR_START_MAC** + * Base offset to load data from is *skb*'s mac header. + * **BPF_HDR_START_NET** + * Base offset to load data from is *skb*'s network header. + * + * In general, "direct packet access" is the preferred method to + * access packet data, however, this helper is in particular useful + * in socket filters where *skb*\ **->data** does not always point + * to the start of the mac header and where "direct packet access" + * is not available. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_load_bytes_relative)(const void *skb, __u32 offset, void *to, __u32 len, __u32 start_header) = (void *) 68; + +/* + * bpf_fib_lookup + * + * Do FIB lookup in kernel tables using parameters in *params*. + * If lookup is successful and result shows packet is to be + * forwarded, the neighbor tables are searched for the nexthop. + * If successful (ie., FIB lookup shows forwarding and nexthop + * is resolved), the nexthop address is returned in ipv4_dst + * or ipv6_dst based on family, smac is set to mac address of + * egress device, dmac is set to nexthop mac address, rt_metric + * is set to metric from route (IPv4/IPv6 only), and ifindex + * is set to the device index of the nexthop from the FIB lookup. + * + * *plen* argument is the size of the passed in struct. + * *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_FIB_LOOKUP_DIRECT** + * Do a direct table lookup vs full lookup using FIB + * rules. + * **BPF_FIB_LOOKUP_OUTPUT** + * Perform lookup from an egress perspective (default is + * ingress). + * **BPF_FIB_LOOKUP_SKIP_NEIGH** + * Skip the neighbour table lookup. *params*->dmac + * and *params*->smac will not be set as output. A common + * use case is to call **bpf_redirect_neigh**\ () after + * doing **bpf_fib_lookup**\ (). + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** tc cls_act programs. + * + * Returns + * * < 0 if any input argument is invalid + * * 0 on success (packet is forwarded, nexthop neighbor exists) + * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the + * packet is not forwarded or needs assist from full stack + * + * If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU + * was exceeded and output params->mtu_result contains the MTU. + */ +static long (*bpf_fib_lookup)(void *ctx, struct bpf_fib_lookup *params, int plen, __u32 flags) = (void *) 69; + +/* + * bpf_sock_hash_update + * + * Add an entry to, or update a sockhash *map* referencing sockets. + * The *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sock_hash_update)(struct bpf_sock_ops *skops, void *map, void *key, __u64 flags) = (void *) 70; + +/* + * bpf_msg_redirect_hash + * + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_msg_redirect_hash)(struct sk_msg_md *msg, void *map, void *key, __u64 flags) = (void *) 71; + +/* + * bpf_sk_redirect_hash + * + * This helper is used in programs implementing policies at the + * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. + * if the verdict eBPF program returns **SK_PASS**), redirect it + * to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_sk_redirect_hash)(struct __sk_buff *skb, void *map, void *key, __u64 flags) = (void *) 72; + +/* + * bpf_lwt_push_encap + * + * Encapsulate the packet associated to *skb* within a Layer 3 + * protocol header. This header is provided in the buffer at + * address *hdr*, with *len* its size in bytes. *type* indicates + * the protocol of the header and can be one of: + * + * **BPF_LWT_ENCAP_SEG6** + * IPv6 encapsulation with Segment Routing Header + * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, + * the IPv6 header is computed by the kernel. + * **BPF_LWT_ENCAP_SEG6_INLINE** + * Only works if *skb* contains an IPv6 packet. Insert a + * Segment Routing Header (**struct ipv6_sr_hdr**) inside + * the IPv6 header. + * **BPF_LWT_ENCAP_IP** + * IP encapsulation (GRE/GUE/IPIP/etc). The outer header + * must be IPv4 or IPv6, followed by zero or more + * additional headers, up to **LWT_BPF_MAX_HEADROOM** + * total bytes in all prepended headers. Please note that + * if **skb_is_gso**\ (*skb*) is true, no more than two + * headers can be prepended, and the inner header, if + * present, should be either GRE or UDP/GUE. + * + * **BPF_LWT_ENCAP_SEG6**\ \* types can be called by BPF programs + * of type **BPF_PROG_TYPE_LWT_IN**; **BPF_LWT_ENCAP_IP** type can + * be called by bpf programs of types **BPF_PROG_TYPE_LWT_IN** and + * **BPF_PROG_TYPE_LWT_XMIT**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_push_encap)(struct __sk_buff *skb, __u32 type, void *hdr, __u32 len) = (void *) 73; + +/* + * bpf_lwt_seg6_store_bytes + * + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. Only the flags, tag and TLVs + * inside the outermost IPv6 Segment Routing Header can be + * modified through this helper. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_seg6_store_bytes)(struct __sk_buff *skb, __u32 offset, const void *from, __u32 len) = (void *) 74; + +/* + * bpf_lwt_seg6_adjust_srh + * + * Adjust the size allocated to TLVs in the outermost IPv6 + * Segment Routing Header contained in the packet associated to + * *skb*, at position *offset* by *delta* bytes. Only offsets + * after the segments are accepted. *delta* can be as well + * positive (growing) as negative (shrinking). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_seg6_adjust_srh)(struct __sk_buff *skb, __u32 offset, __s32 delta) = (void *) 75; + +/* + * bpf_lwt_seg6_action + * + * Apply an IPv6 Segment Routing action of type *action* to the + * packet associated to *skb*. Each action takes a parameter + * contained at address *param*, and of length *param_len* bytes. + * *action* can be one of: + * + * **SEG6_LOCAL_ACTION_END_X** + * End.X action: Endpoint with Layer-3 cross-connect. + * Type of *param*: **struct in6_addr**. + * **SEG6_LOCAL_ACTION_END_T** + * End.T action: Endpoint with specific IPv6 table lookup. + * Type of *param*: **int**. + * **SEG6_LOCAL_ACTION_END_B6** + * End.B6 action: Endpoint bound to an SRv6 policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * **SEG6_LOCAL_ACTION_END_B6_ENCAP** + * End.B6.Encap action: Endpoint bound to an SRv6 + * encapsulation policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_seg6_action)(struct __sk_buff *skb, __u32 action, void *param, __u32 param_len) = (void *) 76; + +/* + * bpf_rc_repeat + * + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded repeat key message. This delays + * the generation of a key up event for previously generated + * key down event. + * + * Some IR protocols like NEC have a special IR message for + * repeating last button, for when a button is held down. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * + * Returns + * 0 + */ +static long (*bpf_rc_repeat)(void *ctx) = (void *) 77; + +/* + * bpf_rc_keydown + * + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded key press with *scancode*, + * *toggle* value in the given *protocol*. The scancode will be + * translated to a keycode using the rc keymap, and reported as + * an input key down event. After a period a key up event is + * generated. This period can be extended by calling either + * **bpf_rc_keydown**\ () again with the same values, or calling + * **bpf_rc_repeat**\ (). + * + * Some protocols include a toggle bit, in case the button was + * released and pressed again between consecutive scancodes. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * The *protocol* is the decoded protocol number (see + * **enum rc_proto** for some predefined values). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * + * Returns + * 0 + */ +static long (*bpf_rc_keydown)(void *ctx, __u32 protocol, __u64 scancode, __u32 toggle) = (void *) 78; + +/* + * bpf_skb_cgroup_id + * + * Return the cgroup v2 id of the socket associated with the *skb*. + * This is roughly similar to the **bpf_get_cgroup_classid**\ () + * helper for cgroup v1 by providing a tag resp. identifier that + * can be matched on or used for map lookups e.g. to implement + * policy. The cgroup v2 id of a given path in the hierarchy is + * exposed in user space through the f_handle API in order to get + * to the same 64-bit id. + * + * This helper can be used on TC egress path, but not on ingress, + * and is available only if the kernel was compiled with the + * **CONFIG_SOCK_CGROUP_DATA** configuration option. + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_skb_cgroup_id)(struct __sk_buff *skb) = (void *) 79; + +/* + * bpf_get_current_cgroup_id + * + * Get the current cgroup id based on the cgroup within which + * the current task is running. + * + * Returns + * A 64-bit integer containing the current cgroup id based + * on the cgroup within which the current task is running. + */ +static __u64 (*bpf_get_current_cgroup_id)(void) = (void *) 80; + +/* + * bpf_get_local_storage + * + * Get the pointer to the local storage area. + * The type and the size of the local storage is defined + * by the *map* argument. + * The *flags* meaning is specific for each map type, + * and has to be 0 for cgroup local storage. + * + * Depending on the BPF program type, a local storage area + * can be shared between multiple instances of the BPF program, + * running simultaneously. + * + * A user should care about the synchronization by himself. + * For example, by using the **BPF_ATOMIC** instructions to alter + * the shared data. + * + * Returns + * A pointer to the local storage area. + */ +static void *(*bpf_get_local_storage)(void *map, __u64 flags) = (void *) 81; + +/* + * bpf_sk_select_reuseport + * + * Select a **SO_REUSEPORT** socket from a + * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*. + * It checks the selected socket is matching the incoming + * request in the socket buffer. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sk_select_reuseport)(struct sk_reuseport_md *reuse, void *map, void *key, __u64 flags) = (void *) 82; + +/* + * bpf_skb_ancestor_cgroup_id + * + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *skb* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *skb*, then return value will be same as that + * of **bpf_skb_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *skb*. + * + * The format of returned id and helper limitations are same as in + * **bpf_skb_cgroup_id**\ (). + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_skb_ancestor_cgroup_id)(struct __sk_buff *skb, int ancestor_level) = (void *) 83; + +/* + * bpf_sk_lookup_tcp + * + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * + * Returns + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + */ +static struct bpf_sock *(*bpf_sk_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 84; + +/* + * bpf_sk_lookup_udp + * + * Look for UDP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * + * Returns + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + */ +static struct bpf_sock *(*bpf_sk_lookup_udp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 85; + +/* + * bpf_sk_release + * + * Release the reference held by *sock*. *sock* must be a + * non-**NULL** pointer that was returned from + * **bpf_sk_lookup_xxx**\ (). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sk_release)(void *sock) = (void *) 86; + +/* + * bpf_map_push_elem + * + * Push an element *value* in *map*. *flags* is one of: + * + * **BPF_EXIST** + * If the queue/stack is full, the oldest element is + * removed to make room for this. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_push_elem)(void *map, const void *value, __u64 flags) = (void *) 87; + +/* + * bpf_map_pop_elem + * + * Pop an element from *map*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_pop_elem)(void *map, void *value) = (void *) 88; + +/* + * bpf_map_peek_elem + * + * Get an element from *map* without removing it. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_peek_elem)(void *map, void *value) = (void *) 89; + +/* + * bpf_msg_push_data + * + * For socket policies, insert *len* bytes into *msg* at offset + * *start*. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it may want to insert metadata or options into the *msg*. + * This can later be read and used by any of the lower layer BPF + * hooks. + * + * This helper may fail if under memory pressure (a malloc + * fails) in these cases BPF programs will get an appropriate + * error and BPF programs will need to handle them. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_msg_push_data)(struct sk_msg_md *msg, __u32 start, __u32 len, __u64 flags) = (void *) 90; + +/* + * bpf_msg_pop_data + * + * Will remove *len* bytes from a *msg* starting at byte *start*. + * This may result in **ENOMEM** errors under certain situations if + * an allocation and copy are required due to a full ring buffer. + * However, the helper will try to avoid doing the allocation + * if possible. Other errors can occur if input parameters are + * invalid either due to *start* byte not being valid part of *msg* + * payload and/or *pop* value being to large. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_msg_pop_data)(struct sk_msg_md *msg, __u32 start, __u32 len, __u64 flags) = (void *) 91; + +/* + * bpf_rc_pointer_rel + * + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded pointer movement. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * + * Returns + * 0 + */ +static long (*bpf_rc_pointer_rel)(void *ctx, __s32 rel_x, __s32 rel_y) = (void *) 92; + +/* + * bpf_spin_lock + * + * Acquire a spinlock represented by the pointer *lock*, which is + * stored as part of a value of a map. Taking the lock allows to + * safely update the rest of the fields in that value. The + * spinlock can (and must) later be released with a call to + * **bpf_spin_unlock**\ (\ *lock*\ ). + * + * Spinlocks in BPF programs come with a number of restrictions + * and constraints: + * + * * **bpf_spin_lock** objects are only allowed inside maps of + * types **BPF_MAP_TYPE_HASH** and **BPF_MAP_TYPE_ARRAY** (this + * list could be extended in the future). + * * BTF description of the map is mandatory. + * * The BPF program can take ONE lock at a time, since taking two + * or more could cause dead locks. + * * Only one **struct bpf_spin_lock** is allowed per map element. + * * When the lock is taken, calls (either BPF to BPF or helpers) + * are not allowed. + * * The **BPF_LD_ABS** and **BPF_LD_IND** instructions are not + * allowed inside a spinlock-ed region. + * * The BPF program MUST call **bpf_spin_unlock**\ () to release + * the lock, on all execution paths, before it returns. + * * The BPF program can access **struct bpf_spin_lock** only via + * the **bpf_spin_lock**\ () and **bpf_spin_unlock**\ () + * helpers. Loading or storing data into the **struct + * bpf_spin_lock** *lock*\ **;** field of a map is not allowed. + * * To use the **bpf_spin_lock**\ () helper, the BTF description + * of the map value must be a struct and have **struct + * bpf_spin_lock** *anyname*\ **;** field at the top level. + * Nested lock inside another struct is not allowed. + * * The **struct bpf_spin_lock** *lock* field in a map value must + * be aligned on a multiple of 4 bytes in that value. + * * Syscall with command **BPF_MAP_LOOKUP_ELEM** does not copy + * the **bpf_spin_lock** field to user space. + * * Syscall with command **BPF_MAP_UPDATE_ELEM**, or update from + * a BPF program, do not update the **bpf_spin_lock** field. + * * **bpf_spin_lock** cannot be on the stack or inside a + * networking packet (it can only be inside of a map values). + * * **bpf_spin_lock** is available to root only. + * * Tracing programs and socket filter programs cannot use + * **bpf_spin_lock**\ () due to insufficient preemption checks + * (but this may change in the future). + * * **bpf_spin_lock** is not allowed in inner maps of map-in-map. + * + * Returns + * 0 + */ +static long (*bpf_spin_lock)(struct bpf_spin_lock *lock) = (void *) 93; + +/* + * bpf_spin_unlock + * + * Release the *lock* previously locked by a call to + * **bpf_spin_lock**\ (\ *lock*\ ). + * + * Returns + * 0 + */ +static long (*bpf_spin_unlock)(struct bpf_spin_lock *lock) = (void *) 94; + +/* + * bpf_sk_fullsock + * + * This helper gets a **struct bpf_sock** pointer such + * that all the fields in this **bpf_sock** can be accessed. + * + * Returns + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + */ +static struct bpf_sock *(*bpf_sk_fullsock)(struct bpf_sock *sk) = (void *) 95; + +/* + * bpf_tcp_sock + * + * This helper gets a **struct bpf_tcp_sock** pointer from a + * **struct bpf_sock** pointer. + * + * Returns + * A **struct bpf_tcp_sock** pointer on success, or **NULL** in + * case of failure. + */ +static struct bpf_tcp_sock *(*bpf_tcp_sock)(struct bpf_sock *sk) = (void *) 96; + +/* + * bpf_skb_ecn_set_ce + * + * Set ECN (Explicit Congestion Notification) field of IP header + * to **CE** (Congestion Encountered) if current value is **ECT** + * (ECN Capable Transport). Otherwise, do nothing. Works with IPv6 + * and IPv4. + * + * Returns + * 1 if the **CE** flag is set (either by the current helper call + * or because it was already present), 0 if it is not set. + */ +static long (*bpf_skb_ecn_set_ce)(struct __sk_buff *skb) = (void *) 97; + +/* + * bpf_get_listener_sock + * + * Return a **struct bpf_sock** pointer in **TCP_LISTEN** state. + * **bpf_sk_release**\ () is unnecessary and not allowed. + * + * Returns + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + */ +static struct bpf_sock *(*bpf_get_listener_sock)(struct bpf_sock *sk) = (void *) 98; + +/* + * bpf_skc_lookup_tcp + * + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * This function is identical to **bpf_sk_lookup_tcp**\ (), except + * that it also returns timewait or request sockets. Use + * **bpf_sk_fullsock**\ () or **bpf_tcp_sock**\ () to access the + * full structure. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * + * Returns + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + */ +static struct bpf_sock *(*bpf_skc_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 99; + +/* + * bpf_tcp_check_syncookie + * + * Check whether *iph* and *th* contain a valid SYN cookie ACK for + * the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative + * error otherwise. + */ +static long (*bpf_tcp_check_syncookie)(void *sk, void *iph, __u32 iph_len, struct tcphdr *th, __u32 th_len) = (void *) 100; + +/* + * bpf_sysctl_get_name + * + * Get name of sysctl in /proc/sys/ and copy it into provided by + * program buffer *buf* of size *buf_len*. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * If *flags* is zero, full name (e.g. "net/ipv4/tcp_mem") is + * copied. Use **BPF_F_SYSCTL_BASE_NAME** flag to copy base name + * only (e.g. "tcp_mem"). + * + * Returns + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + */ +static long (*bpf_sysctl_get_name)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len, __u64 flags) = (void *) 101; + +/* + * bpf_sysctl_get_current_value + * + * Get current value of sysctl as it is presented in /proc/sys + * (incl. newline, etc), and copy it as a string into provided + * by program buffer *buf* of size *buf_len*. + * + * The whole value is copied, no matter what file position user + * space issued e.g. sys_read at. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * Returns + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if current value was unavailable, e.g. because + * sysctl is uninitialized and read returns -EIO for it. + */ +static long (*bpf_sysctl_get_current_value)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len) = (void *) 102; + +/* + * bpf_sysctl_get_new_value + * + * Get new value being written by user space to sysctl (before + * the actual write happens) and copy it as a string into + * provided by program buffer *buf* of size *buf_len*. + * + * User space may write new value at file position > 0. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * Returns + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if sysctl is being read. + */ +static long (*bpf_sysctl_get_new_value)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len) = (void *) 103; + +/* + * bpf_sysctl_set_new_value + * + * Override new value being written by user space to sysctl with + * value provided by program in buffer *buf* of size *buf_len*. + * + * *buf* should contain a string in same form as provided by user + * space on sysctl write. + * + * User space may write new value at file position > 0. To override + * the whole sysctl value file position should be set to zero. + * + * Returns + * 0 on success. + * + * **-E2BIG** if the *buf_len* is too big. + * + * **-EINVAL** if sysctl is being read. + */ +static long (*bpf_sysctl_set_new_value)(struct bpf_sysctl *ctx, const char *buf, unsigned long buf_len) = (void *) 104; + +/* + * bpf_strtol + * + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to a long integer according to the given base + * and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)) followed by a single + * optional '**-**' sign. + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtol**\ (3). + * + * Returns + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + */ +static long (*bpf_strtol)(const char *buf, unsigned long buf_len, __u64 flags, long *res) = (void *) 105; + +/* + * bpf_strtoul + * + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to an unsigned long integer according to the + * given base and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)). + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtoul**\ (3). + * + * Returns + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + */ +static long (*bpf_strtoul)(const char *buf, unsigned long buf_len, __u64 flags, unsigned long *res) = (void *) 106; + +/* + * bpf_sk_storage_get + * + * Get a bpf-local-storage from a *sk*. + * + * Logically, it could be thought of getting the value from + * a *map* with *sk* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *sk*) except this + * helper enforces the key must be a full socket and the map must + * be a **BPF_MAP_TYPE_SK_STORAGE** also. + * + * Underneath, the value is stored locally at *sk* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf-local-storages residing at *sk*. + * + * *sk* is a kernel **struct sock** pointer for LSM program. + * *sk* is a **struct bpf_sock** pointer for other program types. + * + * An optional *flags* (**BPF_SK_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf-local-storage will be + * created if one does not exist. *value* can be used + * together with **BPF_SK_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf-local-storage. If *value* is + * **NULL**, the new bpf-local-storage will be zero initialized. + * + * Returns + * A bpf-local-storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf-local-storage. + */ +static void *(*bpf_sk_storage_get)(void *map, void *sk, void *value, __u64 flags) = (void *) 107; + +/* + * bpf_sk_storage_delete + * + * Delete a bpf-local-storage from a *sk*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf-local-storage cannot be found. + * **-EINVAL** if sk is not a fullsock (e.g. a request_sock). + */ +static long (*bpf_sk_storage_delete)(void *map, void *sk) = (void *) 108; + +/* + * bpf_send_signal + * + * Send signal *sig* to the process of the current task. + * The signal may be delivered to any of this process's threads. + * + * Returns + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + */ +static long (*bpf_send_signal)(__u32 sig) = (void *) 109; + +/* + * bpf_tcp_gen_syncookie + * + * Try to issue a SYN cookie for the packet with corresponding + * IP/TCP headers, *iph* and *th*, on the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header with options (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** SYN cookie cannot be issued due to error + * + * **-ENOENT** SYN cookie should not be issued (no SYN flood) + * + * **-EOPNOTSUPP** kernel configuration does not enable SYN cookies + * + * **-EPROTONOSUPPORT** IP packet version is not 4 or 6 + */ +static __s64 (*bpf_tcp_gen_syncookie)(void *sk, void *iph, __u32 iph_len, struct tcphdr *th, __u32 th_len) = (void *) 110; + +/* + * bpf_skb_output + * + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct sk_buff. + * + * This helper is similar to **bpf_perf_event_output**\ () but + * restricted to raw_tracepoint bpf programs. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 111; + +/* + * bpf_probe_read_user + * + * Safely attempt to read *size* bytes from user space address + * *unsafe_ptr* and store the data in *dst*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_read_user)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 112; + +/* + * bpf_probe_read_kernel + * + * Safely attempt to read *size* bytes from kernel space address + * *unsafe_ptr* and store the data in *dst*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_read_kernel)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 113; + +/* + * bpf_probe_read_user_str + * + * Copy a NUL terminated string from an unsafe user address + * *unsafe_ptr* to *dst*. The *size* should include the + * terminating NUL byte. In case the string length is smaller than + * *size*, the target is not padded with further NUL bytes. If the + * string length is larger than *size*, just *size*-1 bytes are + * copied and the last byte is set to NUL. + * + * On success, returns the number of bytes that were written, + * including the terminal NUL. This makes this helper useful in + * tracing programs for reading strings, and more importantly to + * get its length at runtime. See the following snippet: + * + * :: + * + * SEC("kprobe/sys_open") + * void bpf_sys_open(struct pt_regs *ctx) + * { + * char buf[PATHLEN]; // PATHLEN is defined to 256 + * int res = bpf_probe_read_user_str(buf, sizeof(buf), + * ctx->di); + * + * // Consume buf, for example push it to + * // userspace via bpf_perf_event_output(); we + * // can use res (the string length) as event + * // size, after checking its boundaries. + * } + * + * In comparison, using **bpf_probe_read_user**\ () helper here + * instead to read the string would require to estimate the length + * at compile time, and would often result in copying more memory + * than necessary. + * + * Another useful use case is when parsing individual process + * arguments or individual environment variables navigating + * *current*\ **->mm->arg_start** and *current*\ + * **->mm->env_start**: using this helper and the return value, + * one can quickly iterate at the right offset of the memory area. + * + * Returns + * On success, the strictly positive length of the output string, + * including the trailing NUL character. On error, a negative + * value. + */ +static long (*bpf_probe_read_user_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 114; + +/* + * bpf_probe_read_kernel_str + * + * Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr* + * to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply. + * + * Returns + * On success, the strictly positive length of the string, including + * the trailing NUL character. On error, a negative value. + */ +static long (*bpf_probe_read_kernel_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 115; + +/* + * bpf_tcp_send_ack + * + * Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**. + * *rcv_nxt* is the ack_seq to be sent out. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_tcp_send_ack)(void *tp, __u32 rcv_nxt) = (void *) 116; + +/* + * bpf_send_signal_thread + * + * Send signal *sig* to the thread corresponding to the current task. + * + * Returns + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + */ +static long (*bpf_send_signal_thread)(__u32 sig) = (void *) 117; + +/* + * bpf_jiffies64 + * + * Obtain the 64bit jiffies + * + * Returns + * The 64 bit jiffies + */ +static __u64 (*bpf_jiffies64)(void) = (void *) 118; + +/* + * bpf_read_branch_records + * + * For an eBPF program attached to a perf event, retrieve the + * branch records (**struct perf_branch_entry**) associated to *ctx* + * and store it in the buffer pointed by *buf* up to size + * *size* bytes. + * + * Returns + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to + * instead return the number of bytes required to store all the + * branch entries. If this flag is set, *buf* may be NULL. + * + * **-EINVAL** if arguments invalid or **size** not a multiple + * of **sizeof**\ (**struct perf_branch_entry**\ ). + * + * **-ENOENT** if architecture does not support branch records. + */ +static long (*bpf_read_branch_records)(struct bpf_perf_event_data *ctx, void *buf, __u32 size, __u64 flags) = (void *) 119; + +/* + * bpf_get_ns_current_pid_tgid + * + * Returns 0 on success, values for *pid* and *tgid* as seen from the current + * *namespace* will be returned in *nsdata*. + * + * Returns + * 0 on success, or one of the following in case of failure: + * + * **-EINVAL** if dev and inum supplied don't match dev_t and inode number + * with nsfs of current task, or if dev conversion to dev_t lost high bits. + * + * **-ENOENT** if pidns does not exists for the current task. + */ +static long (*bpf_get_ns_current_pid_tgid)(__u64 dev, __u64 ino, struct bpf_pidns_info *nsdata, __u32 size) = (void *) 120; + +/* + * bpf_xdp_output + * + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct xdp_buff. + * + * This helper is similar to **bpf_perf_eventoutput**\ () but + * restricted to raw_tracepoint bpf programs. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 121; + +/* + * bpf_get_netns_cookie + * + * Retrieve the cookie (generated by the kernel) of the network + * namespace the input *ctx* is associated with. The network + * namespace cookie remains stable for its lifetime and provides + * a global identifier that can be assumed unique. If *ctx* is + * NULL, then the helper returns the cookie for the initial + * network namespace. The cookie itself is very similar to that + * of **bpf_get_socket_cookie**\ () helper, but for network + * namespaces instead of sockets. + * + * Returns + * A 8-byte long opaque number. + */ +static __u64 (*bpf_get_netns_cookie)(void *ctx) = (void *) 122; + +/* + * bpf_get_current_ancestor_cgroup_id + * + * Return id of cgroup v2 that is ancestor of the cgroup associated + * with the current task at the *ancestor_level*. The root cgroup + * is at *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with the current task, then return value will be the + * same as that of **bpf_get_current_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with the current task. + * + * The format of returned id and helper limitations are same as in + * **bpf_get_current_cgroup_id**\ (). + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_get_current_ancestor_cgroup_id)(int ancestor_level) = (void *) 123; + +/* + * bpf_sk_assign + * + * Helper is overloaded depending on BPF program type. This + * description applies to **BPF_PROG_TYPE_SCHED_CLS** and + * **BPF_PROG_TYPE_SCHED_ACT** programs. + * + * Assign the *sk* to the *skb*. When combined with appropriate + * routing configuration to receive the packet towards the socket, + * will cause *skb* to be delivered to the specified socket. + * Subsequent redirection of *skb* via **bpf_redirect**\ (), + * **bpf_clone_redirect**\ () or other methods outside of BPF may + * interfere with successful delivery to the socket. + * + * This operation is only valid from TC ingress path. + * + * The *flags* argument must be zero. + * + * Returns + * 0 on success, or a negative error in case of failure: + * + * **-EINVAL** if specified *flags* are not supported. + * + * **-ENOENT** if the socket is unavailable for assignment. + * + * **-ENETUNREACH** if the socket is unreachable (wrong netns). + * + * **-EOPNOTSUPP** if the operation is not supported, for example + * a call from outside of TC ingress. + * + * **-ESOCKTNOSUPPORT** if the socket type is not supported + * (reuseport). + */ +static long (*bpf_sk_assign)(void *ctx, void *sk, __u64 flags) = (void *) 124; + +/* + * bpf_ktime_get_boot_ns + * + * Return the time elapsed since system boot, in nanoseconds. + * Does include the time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_BOOTTIME**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_boot_ns)(void) = (void *) 125; + +/* + * bpf_seq_printf + * + * **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print + * out the format string. + * The *m* represents the seq_file. The *fmt* and *fmt_size* are for + * the format string itself. The *data* and *data_len* are format string + * arguments. The *data* are a **u64** array and corresponding format string + * values are stored in the array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* array. + * The *data_len* is the size of *data* in bytes - must be a multiple of 8. + * + * Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory. + * Reading kernel memory may fail due to either invalid address or + * valid address but requiring a major memory fault. If reading kernel memory + * fails, the string for **%s** will be an empty string, and the ip + * address for **%p{i,I}{4,6}** will be 0. Not returning error to + * bpf program is consistent with what **bpf_trace_printk**\ () does for now. + * + * Returns + * 0 on success, or a negative error in case of failure: + * + * **-EBUSY** if per-CPU memory copy buffer is busy, can try again + * by returning 1 from bpf program. + * + * **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported. + * + * **-E2BIG** if *fmt* contains too many format specifiers. + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + */ +static long (*bpf_seq_printf)(struct seq_file *m, const char *fmt, __u32 fmt_size, const void *data, __u32 data_len) = (void *) 126; + +/* + * bpf_seq_write + * + * **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data. + * The *m* represents the seq_file. The *data* and *len* represent the + * data to write in bytes. + * + * Returns + * 0 on success, or a negative error in case of failure: + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + */ +static long (*bpf_seq_write)(struct seq_file *m, const void *data, __u32 len) = (void *) 127; + +/* + * bpf_sk_cgroup_id + * + * Return the cgroup v2 id of the socket *sk*. + * + * *sk* must be a non-**NULL** pointer to a socket, e.g. one + * returned from **bpf_sk_lookup_xxx**\ (), + * **bpf_sk_fullsock**\ (), etc. The format of returned id is + * same as in **bpf_skb_cgroup_id**\ (). + * + * This helper is available only if the kernel was compiled with + * the **CONFIG_SOCK_CGROUP_DATA** configuration option. + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_sk_cgroup_id)(void *sk) = (void *) 128; + +/* + * bpf_sk_ancestor_cgroup_id + * + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *sk* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *sk*, then return value will be same as that + * of **bpf_sk_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *sk*. + * + * The format of returned id and helper limitations are same as in + * **bpf_sk_cgroup_id**\ (). + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_sk_ancestor_cgroup_id)(void *sk, int ancestor_level) = (void *) 129; + +/* + * bpf_ringbuf_output + * + * Copy *size* bytes from *data* into a ring buffer *ringbuf*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * An adaptive notification is a notification sent whenever the user-space + * process has caught up and consumed all available payloads. In case the user-space + * process is still processing a previous payload, then no notification is needed + * as it will process the newly added payload automatically. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_ringbuf_output)(void *ringbuf, void *data, __u64 size, __u64 flags) = (void *) 130; + +/* + * bpf_ringbuf_reserve + * + * Reserve *size* bytes of payload in a ring buffer *ringbuf*. + * *flags* must be 0. + * + * Returns + * Valid pointer with *size* bytes of memory available; NULL, + * otherwise. + */ +static void *(*bpf_ringbuf_reserve)(void *ringbuf, __u64 size, __u64 flags) = (void *) 131; + +/* + * bpf_ringbuf_submit + * + * Submit reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_submit)(void *data, __u64 flags) = (void *) 132; + +/* + * bpf_ringbuf_discard + * + * Discard reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_discard)(void *data, __u64 flags) = (void *) 133; + +/* + * bpf_ringbuf_query + * + * Query various characteristics of provided ring buffer. What + * exactly is queries is determined by *flags*: + * + * * **BPF_RB_AVAIL_DATA**: Amount of data not yet consumed. + * * **BPF_RB_RING_SIZE**: The size of ring buffer. + * * **BPF_RB_CONS_POS**: Consumer position (can wrap around). + * * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around). + * + * Data returned is just a momentary snapshot of actual values + * and could be inaccurate, so this facility should be used to + * power heuristics and for reporting, not to make 100% correct + * calculation. + * + * Returns + * Requested value, or 0, if *flags* are not recognized. + */ +static __u64 (*bpf_ringbuf_query)(void *ringbuf, __u64 flags) = (void *) 134; + +/* + * bpf_csum_level + * + * Change the skbs checksum level by one layer up or down, or + * reset it entirely to none in order to have the stack perform + * checksum validation. The level is applicable to the following + * protocols: TCP, UDP, GRE, SCTP, FCOE. For example, a decap of + * | ETH | IP | UDP | GUE | IP | TCP | into | ETH | IP | TCP | + * through **bpf_skb_adjust_room**\ () helper with passing in + * **BPF_F_ADJ_ROOM_NO_CSUM_RESET** flag would require one call + * to **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_DEC** since + * the UDP header is removed. Similarly, an encap of the latter + * into the former could be accompanied by a helper call to + * **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_INC** if the + * skb is still intended to be processed in higher layers of the + * stack instead of just egressing at tc. + * + * There are three supported level settings at this time: + * + * * **BPF_CSUM_LEVEL_INC**: Increases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_DEC**: Decreases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_RESET**: Resets skb->csum_level to 0 and + * sets CHECKSUM_NONE to force checksum validation by the stack. + * * **BPF_CSUM_LEVEL_QUERY**: No-op, returns the current + * skb->csum_level. + * + * Returns + * 0 on success, or a negative error in case of failure. In the + * case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level + * is returned or the error code -EACCES in case the skb is not + * subject to CHECKSUM_UNNECESSARY. + */ +static long (*bpf_csum_level)(struct __sk_buff *skb, __u64 level) = (void *) 135; + +/* + * bpf_skc_to_tcp6_sock + * + * Dynamically cast a *sk* pointer to a *tcp6_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp6_sock *(*bpf_skc_to_tcp6_sock)(void *sk) = (void *) 136; + +/* + * bpf_skc_to_tcp_sock + * + * Dynamically cast a *sk* pointer to a *tcp_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp_sock *(*bpf_skc_to_tcp_sock)(void *sk) = (void *) 137; + +/* + * bpf_skc_to_tcp_timewait_sock + * + * Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp_timewait_sock *(*bpf_skc_to_tcp_timewait_sock)(void *sk) = (void *) 138; + +/* + * bpf_skc_to_tcp_request_sock + * + * Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp_request_sock *(*bpf_skc_to_tcp_request_sock)(void *sk) = (void *) 139; + +/* + * bpf_skc_to_udp6_sock + * + * Dynamically cast a *sk* pointer to a *udp6_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct udp6_sock *(*bpf_skc_to_udp6_sock)(void *sk) = (void *) 140; + +/* + * bpf_get_task_stack + * + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *task*, which is a valid + * pointer to **struct task_struct**. To store the stacktrace, the + * bpf program provides *buf* with a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect buildid+offset instead of ips for user stack, + * only valid if **BPF_F_USER_STACK** is also specified. + * + * **bpf_get_task_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * + * Returns + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + */ +static long (*bpf_get_task_stack)(struct task_struct *task, void *buf, __u32 size, __u64 flags) = (void *) 141; + +/* + * bpf_load_hdr_opt + * + * Load header option. Support reading a particular TCP header + * option for bpf program (**BPF_PROG_TYPE_SOCK_OPS**). + * + * If *flags* is 0, it will search the option from the + * *skops*\ **->skb_data**. The comment in **struct bpf_sock_ops** + * has details on what skb_data contains under different + * *skops*\ **->op**. + * + * The first byte of the *searchby_res* specifies the + * kind that it wants to search. + * + * If the searching kind is an experimental kind + * (i.e. 253 or 254 according to RFC6994). It also + * needs to specify the "magic" which is either + * 2 bytes or 4 bytes. It then also needs to + * specify the size of the magic by using + * the 2nd byte which is "kind-length" of a TCP + * header option and the "kind-length" also + * includes the first 2 bytes "kind" and "kind-length" + * itself as a normal TCP header option also does. + * + * For example, to search experimental kind 254 with + * 2 byte magic 0xeB9F, the searchby_res should be + * [ 254, 4, 0xeB, 0x9F, 0, 0, .... 0 ]. + * + * To search for the standard window scale option (3), + * the *searchby_res* should be [ 3, 0, 0, .... 0 ]. + * Note, kind-length must be 0 for regular option. + * + * Searching for No-Op (0) and End-of-Option-List (1) are + * not supported. + * + * *len* must be at least 2 bytes which is the minimal size + * of a header option. + * + * Supported flags: + * + * * **BPF_LOAD_HDR_OPT_TCP_SYN** to search from the + * saved_syn packet or the just-received syn packet. + * + * + * Returns + * > 0 when found, the header option is copied to *searchby_res*. + * The return value is the total length copied. On failure, a + * negative error code is returned: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOMSG** if the option is not found. + * + * **-ENOENT** if no syn packet is available when + * **BPF_LOAD_HDR_OPT_TCP_SYN** is used. + * + * **-ENOSPC** if there is not enough space. Only *len* number of + * bytes are copied. + * + * **-EFAULT** on failure to parse the header options in the + * packet. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + */ +static long (*bpf_load_hdr_opt)(struct bpf_sock_ops *skops, void *searchby_res, __u32 len, __u64 flags) = (void *) 142; + +/* + * bpf_store_hdr_opt + * + * Store header option. The data will be copied + * from buffer *from* with length *len* to the TCP header. + * + * The buffer *from* should have the whole option that + * includes the kind, kind-length, and the actual + * option data. The *len* must be at least kind-length + * long. The kind-length does not have to be 4 byte + * aligned. The kernel will take care of the padding + * and setting the 4 bytes aligned value to th->doff. + * + * This helper will check for duplicated option + * by searching the same option in the outgoing skb. + * + * This helper can only be called during + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * + * Returns + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** If param is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * Nothing has been written + * + * **-EEXIST** if the option already exists. + * + * **-EFAULT** on failure to parse the existing header options. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + */ +static long (*bpf_store_hdr_opt)(struct bpf_sock_ops *skops, const void *from, __u32 len, __u64 flags) = (void *) 143; + +/* + * bpf_reserve_hdr_opt + * + * Reserve *len* bytes for the bpf header option. The + * space will be used by **bpf_store_hdr_opt**\ () later in + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * If **bpf_reserve_hdr_opt**\ () is called multiple times, + * the total number of bytes will be reserved. + * + * This helper can only be called during + * **BPF_SOCK_OPS_HDR_OPT_LEN_CB**. + * + * + * Returns + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + */ +static long (*bpf_reserve_hdr_opt)(struct bpf_sock_ops *skops, __u32 len, __u64 flags) = (void *) 144; + +/* + * bpf_inode_storage_get + * + * Get a bpf_local_storage from an *inode*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *inode* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *inode*) except this + * helper enforces the key must be an inode and the map must also + * be a **BPF_MAP_TYPE_INODE_STORAGE**. + * + * Underneath, the value is stored locally at *inode* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *inode*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * + * Returns + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + */ +static void *(*bpf_inode_storage_get)(void *map, void *inode, void *value, __u64 flags) = (void *) 145; + +/* + * bpf_inode_storage_delete + * + * Delete a bpf_local_storage from an *inode*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +static int (*bpf_inode_storage_delete)(void *map, void *inode) = (void *) 146; + +/* + * bpf_d_path + * + * Return full path for given **struct path** object, which + * needs to be the kernel BTF *path* object. The path is + * returned in the provided buffer *buf* of size *sz* and + * is zero terminated. + * + * + * Returns + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + */ +static long (*bpf_d_path)(struct path *path, char *buf, __u32 sz) = (void *) 147; + +/* + * bpf_copy_from_user + * + * Read *size* bytes from user space address *user_ptr* and store + * the data in *dst*. This is a wrapper of **copy_from_user**\ (). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_copy_from_user)(void *dst, __u32 size, const void *user_ptr) = (void *) 148; + +/* + * bpf_snprintf_btf + * + * Use BTF to store a string representation of *ptr*->ptr in *str*, + * using *ptr*->type_id. This value should specify the type + * that *ptr*->ptr points to. LLVM __builtin_btf_type_id(type, 1) + * can be used to look up vmlinux BTF type ids. Traversing the + * data structure using BTF, the type information and values are + * stored in the first *str_size* - 1 bytes of *str*. Safe copy of + * the pointer data is carried out to avoid kernel crashes during + * operation. Smaller types can use string space on the stack; + * larger programs can use map data to store the string + * representation. + * + * The string can be subsequently shared with userspace via + * bpf_perf_event_output() or ring buffer interfaces. + * bpf_trace_printk() is to be avoided as it places too small + * a limit on string size to be useful. + * + * *flags* is a combination of + * + * **BTF_F_COMPACT** + * no formatting around type information + * **BTF_F_NONAME** + * no struct/union member names/types + * **BTF_F_PTR_RAW** + * show raw (unobfuscated) pointer values; + * equivalent to printk specifier %px. + * **BTF_F_ZERO** + * show zero-valued struct/union members; they + * are not displayed by default + * + * + * Returns + * The number of bytes that were written (or would have been + * written if output had to be truncated due to string size), + * or a negative error in cases of failure. + */ +static long (*bpf_snprintf_btf)(char *str, __u32 str_size, struct btf_ptr *ptr, __u32 btf_ptr_size, __u64 flags) = (void *) 149; + +/* + * bpf_seq_printf_btf + * + * Use BTF to write to seq_write a string representation of + * *ptr*->ptr, using *ptr*->type_id as per bpf_snprintf_btf(). + * *flags* are identical to those used for bpf_snprintf_btf. + * + * Returns + * 0 on success or a negative error in case of failure. + */ +static long (*bpf_seq_printf_btf)(struct seq_file *m, struct btf_ptr *ptr, __u32 ptr_size, __u64 flags) = (void *) 150; + +/* + * bpf_skb_cgroup_classid + * + * See **bpf_get_cgroup_classid**\ () for the main description. + * This helper differs from **bpf_get_cgroup_classid**\ () in that + * the cgroup v1 net_cls class is retrieved only from the *skb*'s + * associated socket instead of the current process. + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_skb_cgroup_classid)(struct __sk_buff *skb) = (void *) 151; + +/* + * bpf_redirect_neigh + * + * Redirect the packet to another net device of index *ifindex* + * and fill in L2 addresses from neighboring subsystem. This helper + * is somewhat similar to **bpf_redirect**\ (), except that it + * populates L2 addresses as well, meaning, internally, the helper + * relies on the neighbor lookup for the L2 address of the nexthop. + * + * The helper will perform a FIB lookup based on the skb's + * networking header to get the address of the next hop, unless + * this is supplied by the caller in the *params* argument. The + * *plen* argument indicates the len of *params* and should be set + * to 0 if *params* is NULL. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types, and enabled + * for IPv4 and IPv6 protocols. + * + * Returns + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + */ +static long (*bpf_redirect_neigh)(__u32 ifindex, struct bpf_redir_neigh *params, int plen, __u64 flags) = (void *) 152; + +/* + * bpf_per_cpu_ptr + * + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on *cpu*. A ksym is an + * extern variable decorated with '__ksym'. For ksym, there is a + * global var (either static or global) defined of the same name + * in the kernel. The ksym is percpu if the global var is percpu. + * The returned pointer points to the global percpu var on *cpu*. + * + * bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the + * kernel, except that bpf_per_cpu_ptr() may return NULL. This + * happens if *cpu* is larger than nr_cpu_ids. The caller of + * bpf_per_cpu_ptr() must check the returned value. + * + * Returns + * A pointer pointing to the kernel percpu variable on *cpu*, or + * NULL, if *cpu* is invalid. + */ +static void *(*bpf_per_cpu_ptr)(const void *percpu_ptr, __u32 cpu) = (void *) 153; + +/* + * bpf_this_cpu_ptr + * + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on this cpu. See the + * description of 'ksym' in **bpf_per_cpu_ptr**\ (). + * + * bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in + * the kernel. Different from **bpf_per_cpu_ptr**\ (), it would + * never return NULL. + * + * Returns + * A pointer pointing to the kernel percpu variable on this cpu. + */ +static void *(*bpf_this_cpu_ptr)(const void *percpu_ptr) = (void *) 154; + +/* + * bpf_redirect_peer + * + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_redirect**\ (), except + * that the redirection happens to the *ifindex*' peer device and + * the netns switch takes place from ingress to ingress without + * going through the CPU's backlog queue. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types at the ingress + * hook and for veth device types. The peer device must reside in a + * different network namespace. + * + * Returns + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + */ +static long (*bpf_redirect_peer)(__u32 ifindex, __u64 flags) = (void *) 155; + +/* + * bpf_task_storage_get + * + * Get a bpf_local_storage from the *task*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *task* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *task*) except this + * helper enforces the key must be a task_struct and the map must also + * be a **BPF_MAP_TYPE_TASK_STORAGE**. + * + * Underneath, the value is stored locally at *task* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *task*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * + * Returns + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + */ +static void *(*bpf_task_storage_get)(void *map, struct task_struct *task, void *value, __u64 flags) = (void *) 156; + +/* + * bpf_task_storage_delete + * + * Delete a bpf_local_storage from a *task*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +static long (*bpf_task_storage_delete)(void *map, struct task_struct *task) = (void *) 157; + +/* + * bpf_get_current_task_btf + * + * Return a BTF pointer to the "current" task. + * This pointer can also be used in helpers that accept an + * *ARG_PTR_TO_BTF_ID* of type *task_struct*. + * + * Returns + * Pointer to the current task. + */ +static struct task_struct *(*bpf_get_current_task_btf)(void) = (void *) 158; + +/* + * bpf_bprm_opts_set + * + * Set or clear certain options on *bprm*: + * + * **BPF_F_BPRM_SECUREEXEC** Set the secureexec bit + * which sets the **AT_SECURE** auxv for glibc. The bit + * is cleared if the flag is not specified. + * + * Returns + * **-EINVAL** if invalid *flags* are passed, zero otherwise. + */ +static long (*bpf_bprm_opts_set)(struct linux_binprm *bprm, __u64 flags) = (void *) 159; + +/* + * bpf_ktime_get_coarse_ns + * + * Return a coarse-grained version of the time elapsed since + * system boot, in nanoseconds. Does not include time the system + * was suspended. + * + * See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_coarse_ns)(void) = (void *) 160; + +/* + * bpf_ima_inode_hash + * + * Returns the stored IMA hash of the *inode* (if it's available). + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * + * Returns + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if + * invalid arguments are passed. + */ +static long (*bpf_ima_inode_hash)(struct inode *inode, void *dst, __u32 size) = (void *) 161; + +/* + * bpf_sock_from_file + * + * If the given file represents a socket, returns the associated + * socket. + * + * Returns + * A pointer to a struct socket on success or NULL if the file is + * not a socket. + */ +static struct socket *(*bpf_sock_from_file)(struct file *file) = (void *) 162; + +/* + * bpf_check_mtu + * + * Check packet size against exceeding MTU of net device (based + * on *ifindex*). This helper will likely be used in combination + * with helpers that adjust/change the packet size. + * + * The argument *len_diff* can be used for querying with a planned + * size change. This allows to check MTU prior to changing packet + * ctx. Providing a *len_diff* adjustment that is larger than the + * actual packet size (resulting in negative packet size) will in + * principle not exceed the MTU, which is why it is not considered + * a failure. Other BPF helpers are needed for performing the + * planned size change; therefore the responsibility for catching + * a negative packet size belongs in those helpers. + * + * Specifying *ifindex* zero means the MTU check is performed + * against the current net device. This is practical if this isn't + * used prior to redirect. + * + * On input *mtu_len* must be a valid pointer, else verifier will + * reject BPF program. If the value *mtu_len* is initialized to + * zero then the ctx packet size is use. When value *mtu_len* is + * provided as input this specify the L3 length that the MTU check + * is done against. Remember XDP and TC length operate at L2, but + * this value is L3 as this correlate to MTU and IP-header tot_len + * values which are L3 (similar behavior as bpf_fib_lookup). + * + * The Linux kernel route table can configure MTUs on a more + * specific per route level, which is not provided by this helper. + * For route level MTU checks use the **bpf_fib_lookup**\ () + * helper. + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** for tc cls_act programs. + * + * The *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_MTU_CHK_SEGS** + * This flag will only works for *ctx* **struct sk_buff**. + * If packet context contains extra packet segment buffers + * (often knows as GSO skb), then MTU check is harder to + * check at this point, because in transmit path it is + * possible for the skb packet to get re-segmented + * (depending on net device features). This could still be + * a MTU violation, so this flag enables performing MTU + * check against segments, with a different violation + * return code to tell it apart. Check cannot use len_diff. + * + * On return *mtu_len* pointer contains the MTU value of the net + * device. Remember the net device configured MTU is the L3 size, + * which is returned here and XDP and TC length operate at L2. + * Helper take this into account for you, but remember when using + * MTU value in your BPF-code. + * + * + * Returns + * * 0 on success, and populate MTU value in *mtu_len* pointer. + * + * * < 0 if any input argument is invalid (*mtu_len* not updated) + * + * MTU violations return positive values, but also populate MTU + * value in *mtu_len* pointer, as this can be needed for + * implementing PMTU handing: + * + * * **BPF_MTU_CHK_RET_FRAG_NEEDED** + * * **BPF_MTU_CHK_RET_SEGS_TOOBIG** + */ +static long (*bpf_check_mtu)(void *ctx, __u32 ifindex, __u32 *mtu_len, __s32 len_diff, __u64 flags) = (void *) 163; + +/* + * bpf_for_each_map_elem + * + * For each element in **map**, call **callback_fn** function with + * **map**, **callback_ctx** and other map-specific parameters. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. + * + * The following are a list of supported map types and their + * respective expected callback signatures: + * + * BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_PERCPU_HASH, + * BPF_MAP_TYPE_LRU_HASH, BPF_MAP_TYPE_LRU_PERCPU_HASH, + * BPF_MAP_TYPE_ARRAY, BPF_MAP_TYPE_PERCPU_ARRAY + * + * long (\*callback_fn)(struct bpf_map \*map, const void \*key, void \*value, void \*ctx); + * + * For per_cpu maps, the map_value is the value on the cpu where the + * bpf_prog is running. + * + * If **callback_fn** return 0, the helper will continue to the next + * element. If return value is 1, the helper will skip the rest of + * elements and return. Other return values are not used now. + * + * + * Returns + * The number of traversed map elements for success, **-EINVAL** for + * invalid **flags**. + */ +static long (*bpf_for_each_map_elem)(void *map, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 164; + +/* + * bpf_snprintf + * + * Outputs a string into the **str** buffer of size **str_size** + * based on a format string stored in a read-only map pointed by + * **fmt**. + * + * Each format specifier in **fmt** corresponds to one u64 element + * in the **data** array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* + * array. The *data_len* is the size of *data* in bytes - must be + * a multiple of 8. + * + * Formats **%s** and **%p{i,I}{4,6}** require to read kernel + * memory. Reading kernel memory may fail due to either invalid + * address or valid address but requiring a major memory fault. If + * reading kernel memory fails, the string for **%s** will be an + * empty string, and the ip address for **%p{i,I}{4,6}** will be 0. + * Not returning error to bpf program is consistent with what + * **bpf_trace_printk**\ () does for now. + * + * + * Returns + * The strictly positive length of the formatted string, including + * the trailing zero character. If the return value is greater than + * **str_size**, **str** contains a truncated string, guaranteed to + * be zero-terminated except when **str_size** is 0. + * + * Or **-EBUSY** if the per-CPU memory copy buffer is busy. + */ +static long (*bpf_snprintf)(char *str, __u32 str_size, const char *fmt, __u64 *data, __u32 data_len) = (void *) 165; + +/* + * bpf_sys_bpf + * + * Execute bpf syscall with given arguments. + * + * Returns + * A syscall result. + */ +static long (*bpf_sys_bpf)(__u32 cmd, void *attr, __u32 attr_size) = (void *) 166; + +/* + * bpf_btf_find_by_name_kind + * + * Find BTF type with given name and kind in vmlinux BTF or in module's BTFs. + * + * Returns + * Returns btf_id and btf_obj_fd in lower and upper 32 bits. + */ +static long (*bpf_btf_find_by_name_kind)(char *name, int name_sz, __u32 kind, int flags) = (void *) 167; + +/* + * bpf_sys_close + * + * Execute close syscall for given FD. + * + * Returns + * A syscall result. + */ +static long (*bpf_sys_close)(__u32 fd) = (void *) 168; + +/* + * bpf_timer_init + * + * Initialize the timer. + * First 4 bits of *flags* specify clockid. + * Only CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME are allowed. + * All other bits of *flags* are reserved. + * The verifier will reject the program if *timer* is not from + * the same *map*. + * + * Returns + * 0 on success. + * **-EBUSY** if *timer* is already initialized. + * **-EINVAL** if invalid *flags* are passed. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + */ +static long (*bpf_timer_init)(struct bpf_timer *timer, void *map, __u64 flags) = (void *) 169; + +/* + * bpf_timer_set_callback + * + * Configure the timer to call *callback_fn* static function. + * + * Returns + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + */ +static long (*bpf_timer_set_callback)(struct bpf_timer *timer, void *callback_fn) = (void *) 170; + +/* + * bpf_timer_start + * + * Set timer expiration N nanoseconds from the current time. The + * configured callback will be invoked in soft irq context on some cpu + * and will not repeat unless another bpf_timer_start() is made. + * In such case the next invocation can migrate to a different cpu. + * Since struct bpf_timer is a field inside map element the map + * owns the timer. The bpf_timer_set_callback() will increment refcnt + * of BPF program to make sure that callback_fn code stays valid. + * When user space reference to a map reaches zero all timers + * in a map are cancelled and corresponding program's refcnts are + * decremented. This is done to make sure that Ctrl-C of a user + * process doesn't leave any timers running. If map is pinned in + * bpffs the callback_fn can re-arm itself indefinitely. + * bpf_map_update/delete_elem() helpers and user space sys_bpf commands + * cancel and free the timer in the given map element. + * The map can contain timers that invoke callback_fn-s from different + * programs. The same callback_fn can serve different timers from + * different maps if key/value layout matches across maps. + * Every bpf_timer_set_callback() can have different callback_fn. + * + * + * Returns + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier + * or invalid *flags* are passed. + */ +static long (*bpf_timer_start)(struct bpf_timer *timer, __u64 nsecs, __u64 flags) = (void *) 171; + +/* + * bpf_timer_cancel + * + * Cancel the timer and wait for callback_fn to finish if it was running. + * + * Returns + * 0 if the timer was not active. + * 1 if the timer was active. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its + * own timer which would have led to a deadlock otherwise. + */ +static long (*bpf_timer_cancel)(struct bpf_timer *timer) = (void *) 172; + +/* + * bpf_get_func_ip + * + * Get address of the traced function (for tracing and kprobe programs). + * + * Returns + * Address of the traced function. + * 0 for kprobes placed within the function (not at the entry). + */ +static __u64 (*bpf_get_func_ip)(void *ctx) = (void *) 173; + +/* + * bpf_get_attach_cookie + * + * Get bpf_cookie value provided (optionally) during the program + * attachment. It might be different for each individual + * attachment, even if BPF program itself is the same. + * Expects BPF program context *ctx* as a first argument. + * + * Supported for the following program types: + * - kprobe/uprobe; + * - tracepoint; + * - perf_event. + * + * Returns + * Value specified by user at BPF link creation/attachment time + * or 0, if it was not specified. + */ +static __u64 (*bpf_get_attach_cookie)(void *ctx) = (void *) 174; + +/* + * bpf_task_pt_regs + * + * Get the struct pt_regs associated with **task**. + * + * Returns + * A pointer to struct pt_regs. + */ +static long (*bpf_task_pt_regs)(struct task_struct *task) = (void *) 175; + +/* + * bpf_get_branch_snapshot + * + * Get branch trace from hardware engines like Intel LBR. The + * hardware engine is stopped shortly after the helper is + * called. Therefore, the user need to filter branch entries + * based on the actual use case. To capture branch trace + * before the trigger point of the BPF program, the helper + * should be called at the beginning of the BPF program. + * + * The data is stored as struct perf_branch_entry into output + * buffer *entries*. *size* is the size of *entries* in bytes. + * *flags* is reserved for now and must be zero. + * + * + * Returns + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-ENOENT** if architecture does not support branch records. + */ +static long (*bpf_get_branch_snapshot)(void *entries, __u32 size, __u64 flags) = (void *) 176; + +/* + * bpf_trace_vprintk + * + * Behaves like **bpf_trace_printk**\ () helper, but takes an array of u64 + * to format and can handle more format args as a result. + * + * Arguments are to be used as in **bpf_seq_printf**\ () helper. + * + * Returns + * The number of bytes written to the buffer, or a negative error + * in case of failure. + */ +static long (*bpf_trace_vprintk)(const char *fmt, __u32 fmt_size, const void *data, __u32 data_len) = (void *) 177; + +/* + * bpf_skc_to_unix_sock + * + * Dynamically cast a *sk* pointer to a *unix_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct unix_sock *(*bpf_skc_to_unix_sock)(void *sk) = (void *) 178; + +/* + * bpf_kallsyms_lookup_name + * + * Get the address of a kernel symbol, returned in *res*. *res* is + * set to 0 if the symbol is not found. + * + * Returns + * On success, zero. On error, a negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-EINVAL** if string *name* is not the same size as *name_sz*. + * + * **-ENOENT** if symbol is not found. + * + * **-EPERM** if caller does not have permission to obtain kernel address. + */ +static long (*bpf_kallsyms_lookup_name)(const char *name, int name_sz, int flags, __u64 *res) = (void *) 179; + +/* + * bpf_find_vma + * + * Find vma of *task* that contains *addr*, call *callback_fn* + * function with *task*, *vma*, and *callback_ctx*. + * The *callback_fn* should be a static function and + * the *callback_ctx* should be a pointer to the stack. + * The *flags* is used to control certain aspects of the helper. + * Currently, the *flags* must be 0. + * + * The expected callback signature is + * + * long (\*callback_fn)(struct task_struct \*task, struct vm_area_struct \*vma, void \*callback_ctx); + * + * + * Returns + * 0 on success. + * **-ENOENT** if *task->mm* is NULL, or no vma contains *addr*. + * **-EBUSY** if failed to try lock mmap_lock. + * **-EINVAL** for invalid **flags**. + */ +static long (*bpf_find_vma)(struct task_struct *task, __u64 addr, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 180; + +/* + * bpf_loop + * + * For **nr_loops**, call **callback_fn** function + * with **callback_ctx** as the context parameter. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. Currently, nr_loops is + * limited to 1 << 23 (~8 million) loops. + * + * long (\*callback_fn)(u32 index, void \*ctx); + * + * where **index** is the current index in the loop. The index + * is zero-indexed. + * + * If **callback_fn** returns 0, the helper will continue to the next + * loop. If return value is 1, the helper will skip the rest of + * the loops and return. Other return values are not used now, + * and will be rejected by the verifier. + * + * + * Returns + * The number of loops performed, **-EINVAL** for invalid **flags**, + * **-E2BIG** if **nr_loops** exceeds the maximum number of loops. + */ +static long (*bpf_loop)(__u32 nr_loops, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 181; + +/* + * bpf_strncmp + * + * Do strncmp() between **s1** and **s2**. **s1** doesn't need + * to be null-terminated and **s1_sz** is the maximum storage + * size of **s1**. **s2** must be a read-only string. + * + * Returns + * An integer less than, equal to, or greater than zero + * if the first **s1_sz** bytes of **s1** is found to be + * less than, to match, or be greater than **s2**. + */ +static long (*bpf_strncmp)(const char *s1, __u32 s1_sz, const char *s2) = (void *) 182; + +/* + * bpf_get_func_arg + * + * Get **n**-th argument register (zero based) of the traced function (for tracing programs) + * returned in **value**. + * + * + * Returns + * 0 on success. + * **-EINVAL** if n >= argument register count of traced function. + */ +static long (*bpf_get_func_arg)(void *ctx, __u32 n, __u64 *value) = (void *) 183; + +/* + * bpf_get_func_ret + * + * Get return value of the traced function (for tracing programs) + * in **value**. + * + * + * Returns + * 0 on success. + * **-EOPNOTSUPP** for tracing programs other than BPF_TRACE_FEXIT or BPF_MODIFY_RETURN. + */ +static long (*bpf_get_func_ret)(void *ctx, __u64 *value) = (void *) 184; + +/* + * bpf_get_func_arg_cnt + * + * Get number of registers of the traced function (for tracing programs) where + * function arguments are stored in these registers. + * + * + * Returns + * The number of argument registers of the traced function. + */ +static long (*bpf_get_func_arg_cnt)(void *ctx) = (void *) 185; + +/* + * bpf_get_retval + * + * Get the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * + * Returns + * The BPF program's return value. + */ +static int (*bpf_get_retval)(void) = (void *) 186; + +/* + * bpf_set_retval + * + * Set the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * + * Note that there is the following corner case where the program exports an error + * via bpf_set_retval but signals success via 'return 1': + * + * bpf_set_retval(-EPERM); + * return 1; + * + * In this case, the BPF program's return value will use helper's -EPERM. This + * still holds true for cgroup/bind{4,6} which supports extra 'return 3' success case. + * + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static int (*bpf_set_retval)(int retval) = (void *) 187; + +/* + * bpf_xdp_get_buff_len + * + * Get the total size of a given xdp buff (linear and paged area) + * + * Returns + * The total size of a given xdp buffer. + */ +static __u64 (*bpf_xdp_get_buff_len)(struct xdp_md *xdp_md) = (void *) 188; + +/* + * bpf_xdp_load_bytes + * + * This helper is provided as an easy way to load data from a + * xdp buffer. It can be used to load *len* bytes from *offset* from + * the frame associated to *xdp_md*, into the buffer pointed by + * *buf*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_load_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = (void *) 189; + +/* + * bpf_xdp_store_bytes + * + * Store *len* bytes from buffer *buf* into the frame + * associated to *xdp_md*, at *offset*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_store_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = (void *) 190; + +/* + * bpf_copy_from_user_task + * + * Read *size* bytes from user space address *user_ptr* in *tsk*'s + * address space, and stores the data in *dst*. *flags* is not + * used yet and is provided for future extensibility. This helper + * can only be used by sleepable programs. + * + * Returns + * 0 on success, or a negative error in case of failure. On error + * *dst* buffer is zeroed out. + */ +static long (*bpf_copy_from_user_task)(void *dst, __u32 size, const void *user_ptr, struct task_struct *tsk, __u64 flags) = (void *) 191; + +/* + * bpf_skb_set_tstamp + * + * Change the __sk_buff->tstamp_type to *tstamp_type* + * and set *tstamp* to the __sk_buff->tstamp together. + * + * If there is no need to change the __sk_buff->tstamp_type, + * the tstamp value can be directly written to __sk_buff->tstamp + * instead. + * + * BPF_SKB_TSTAMP_DELIVERY_MONO is the only tstamp that + * will be kept during bpf_redirect_*(). A non zero + * *tstamp* must be used with the BPF_SKB_TSTAMP_DELIVERY_MONO + * *tstamp_type*. + * + * A BPF_SKB_TSTAMP_UNSPEC *tstamp_type* can only be used + * with a zero *tstamp*. + * + * Only IPv4 and IPv6 skb->protocol are supported. + * + * This function is most useful when it needs to set a + * mono delivery time to __sk_buff->tstamp and then + * bpf_redirect_*() to the egress of an iface. For example, + * changing the (rcv) timestamp in __sk_buff->tstamp at + * ingress to a mono delivery time and then bpf_redirect_*() + * to sch_fq@phy-dev. + * + * Returns + * 0 on success. + * **-EINVAL** for invalid input + * **-EOPNOTSUPP** for unsupported protocol + */ +static long (*bpf_skb_set_tstamp)(struct __sk_buff *skb, __u64 tstamp, __u32 tstamp_type) = (void *) 192; + +/* + * bpf_ima_file_hash + * + * Returns a calculated IMA hash of the *file*. + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * + * Returns + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if + * invalid arguments are passed. + */ +static long (*bpf_ima_file_hash)(struct file *file, void *dst, __u32 size) = (void *) 193; + +/* + * bpf_kptr_xchg + * + * Exchange kptr at pointer *map_value* with *ptr*, and return the + * old value. *ptr* can be NULL, otherwise it must be a referenced + * pointer which will be released when this helper is called. + * + * Returns + * The old value of kptr (which can be NULL). The returned pointer + * if not NULL, is a reference which must be released using its + * corresponding release function, or moved into a BPF map before + * program exit. + */ +static void *(*bpf_kptr_xchg)(void *map_value, void *ptr) = (void *) 194; + +/* + * bpf_map_lookup_percpu_elem + * + * Perform a lookup in *percpu map* for an entry associated to + * *key* on *cpu*. + * + * Returns + * Map value associated to *key* on *cpu*, or **NULL** if no entry + * was found or *cpu* is invalid. + */ +static void *(*bpf_map_lookup_percpu_elem)(void *map, const void *key, __u32 cpu) = (void *) 195; + +/* + * bpf_skc_to_mptcp_sock + * + * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct mptcp_sock *(*bpf_skc_to_mptcp_sock)(void *sk) = (void *) 196; + +/* + * bpf_dynptr_from_mem + * + * Get a dynptr to local memory *data*. + * + * *data* must be a ptr to a map value. + * The maximum *size* supported is DYNPTR_MAX_SIZE. + * *flags* is currently unused. + * + * Returns + * 0 on success, -E2BIG if the size exceeds DYNPTR_MAX_SIZE, + * -EINVAL if flags is not 0. + */ +static long (*bpf_dynptr_from_mem)(void *data, __u32 size, __u64 flags, struct bpf_dynptr *ptr) = (void *) 197; + +/* + * bpf_ringbuf_reserve_dynptr + * + * Reserve *size* bytes of payload in a ring buffer *ringbuf* + * through the dynptr interface. *flags* must be 0. + * + * Please note that a corresponding bpf_ringbuf_submit_dynptr or + * bpf_ringbuf_discard_dynptr must be called on *ptr*, even if the + * reservation fails. This is enforced by the verifier. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_ringbuf_reserve_dynptr)(void *ringbuf, __u32 size, __u64 flags, struct bpf_dynptr *ptr) = (void *) 198; + +/* + * bpf_ringbuf_submit_dynptr + * + * Submit reserved ring buffer sample, pointed to by *data*, + * through the dynptr interface. This is a no-op if the dynptr is + * invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_submit'. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_submit_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = (void *) 199; + +/* + * bpf_ringbuf_discard_dynptr + * + * Discard reserved ring buffer sample through the dynptr + * interface. This is a no-op if the dynptr is invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_discard'. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_discard_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = (void *) 200; + +/* + * bpf_dynptr_read + * + * Read *len* bytes from *src* into *dst*, starting from *offset* + * into *src*. + * *flags* is currently unused. + * + * Returns + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *src*'s data, -EINVAL if *src* is an invalid dynptr or if + * *flags* is not 0. + */ +static long (*bpf_dynptr_read)(void *dst, __u32 len, const struct bpf_dynptr *src, __u32 offset, __u64 flags) = (void *) 201; + +/* + * bpf_dynptr_write + * + * Write *len* bytes from *src* into *dst*, starting from *offset* + * into *dst*. + * *flags* is currently unused. + * + * Returns + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *dst*'s data, -EINVAL if *dst* is an invalid dynptr or if *dst* + * is a read-only dynptr or if *flags* is not 0. + */ +static long (*bpf_dynptr_write)(const struct bpf_dynptr *dst, __u32 offset, void *src, __u32 len, __u64 flags) = (void *) 202; + +/* + * bpf_dynptr_data + * + * Get a pointer to the underlying dynptr data. + * + * *len* must be a statically known value. The returned data slice + * is invalidated whenever the dynptr is invalidated. + * + * Returns + * Pointer to the underlying dynptr data, NULL if the dynptr is + * read-only, if the dynptr is invalid, or if the offset and length + * is out of bounds. + */ +static void *(*bpf_dynptr_data)(const struct bpf_dynptr *ptr, __u32 offset, __u32 len) = (void *) 203; + +/* + * bpf_tcp_raw_gen_syncookie_ipv4 + * + * Try to issue a SYN cookie for the packet with corresponding + * IPv4/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + */ +static __s64 (*bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th, __u32 th_len) = (void *) 204; + +/* + * bpf_tcp_raw_gen_syncookie_ipv6 + * + * Try to issue a SYN cookie for the packet with corresponding + * IPv6/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + */ +static __s64 (*bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th, __u32 th_len) = (void *) 205; + +/* + * bpf_tcp_raw_check_syncookie_ipv4 + * + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the TCP header. + * + * Returns + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + */ +static long (*bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th) = (void *) 206; + +/* + * bpf_tcp_raw_check_syncookie_ipv6 + * + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the TCP header. + * + * Returns + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + */ +static long (*bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th) = (void *) 207; + +/* + * bpf_ktime_get_tai_ns + * + * A nonsettable system-wide clock derived from wall-clock time but + * ignoring leap seconds. This clock does not experience + * discontinuities and backwards jumps caused by NTP inserting leap + * seconds as CLOCK_REALTIME does. + * + * See: **clock_gettime**\ (**CLOCK_TAI**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_tai_ns)(void) = (void *) 208; + +/* + * bpf_user_ringbuf_drain + * + * Drain samples from the specified user ring buffer, and invoke + * the provided callback for each such sample: + * + * long (\*callback_fn)(const struct bpf_dynptr \*dynptr, void \*ctx); + * + * If **callback_fn** returns 0, the helper will continue to try + * and drain the next sample, up to a maximum of + * BPF_MAX_USER_RINGBUF_SAMPLES samples. If the return value is 1, + * the helper will skip the rest of the samples and return. Other + * return values are not used now, and will be rejected by the + * verifier. + * + * Returns + * The number of drained samples if no error was encountered while + * draining samples, or 0 if no samples were present in the ring + * buffer. If a user-space producer was epoll-waiting on this map, + * and at least one sample was drained, they will receive an event + * notification notifying them of available space in the ring + * buffer. If the BPF_RB_NO_WAKEUP flag is passed to this + * function, no wakeup notification will be sent. If the + * BPF_RB_FORCE_WAKEUP flag is passed, a wakeup notification will + * be sent even if no sample was drained. + * + * On failure, the returned value is one of the following: + * + * **-EBUSY** if the ring buffer is contended, and another calling + * context was concurrently draining the ring buffer. + * + * **-EINVAL** if user-space is not properly tracking the ring + * buffer due to the producer position not being aligned to 8 + * bytes, a sample not being aligned to 8 bytes, or the producer + * position not matching the advertised length of a sample. + * + * **-E2BIG** if user-space has tried to publish a sample which is + * larger than the size of the ring buffer, or which cannot fit + * within a struct bpf_dynptr. + */ +static long (*bpf_user_ringbuf_drain)(void *map, void *callback_fn, void *ctx, __u64 flags) = (void *) 209; + +/* + * bpf_cgrp_storage_get + * + * Get a bpf_local_storage from the *cgroup*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *cgroup* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *cgroup*) except this + * helper enforces the key must be a cgroup struct and the map must also + * be a **BPF_MAP_TYPE_CGRP_STORAGE**. + * + * In reality, the local-storage value is embedded directly inside of the + * *cgroup* object itself, rather than being located in the + * **BPF_MAP_TYPE_CGRP_STORAGE** map. When the local-storage value is + * queried for some *map* on a *cgroup* object, the kernel will perform an + * O(n) iteration over all of the live local-storage values for that + * *cgroup* object until the local-storage value for the *map* is found. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * + * Returns + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + */ +static void *(*bpf_cgrp_storage_get)(void *map, struct cgroup *cgroup, void *value, __u64 flags) = (void *) 210; + +/* + * bpf_cgrp_storage_delete + * + * Delete a bpf_local_storage from a *cgroup*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +static long (*bpf_cgrp_storage_delete)(void *map, struct cgroup *cgroup) = (void *) 211; + + diff --git a/examples/c/bpf/bpf_helpers.h b/examples/c/bpf/bpf_helpers.h new file mode 100644 index 0000000..5ec1871 --- /dev/null +++ b/examples/c/bpf/bpf_helpers.h @@ -0,0 +1,289 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_HELPERS__ +#define __BPF_HELPERS__ + +/* + * Note that bpf programs need to include either + * vmlinux.h (auto-generated from BTF) or linux/types.h + * in advance since bpf_helper_defs.h uses such types + * as __u64. + */ +#include "bpf_helper_defs.h" + +#define __uint(name, val) int (*name)[val] +#define __type(name, val) typeof(val) *name +#define __array(name, val) typeof(val) *name[] + +/* + * Helper macro to place programs, maps, license in + * different sections in elf_bpf file. Section names + * are interpreted by libbpf depending on the context (BPF programs, BPF maps, + * extern variables, etc). + * To allow use of SEC() with externs (e.g., for extern .maps declarations), + * make sure __attribute__((unused)) doesn't trigger compilation warning. + */ +#if __GNUC__ && !__clang__ + +/* + * Pragma macros are broken on GCC + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55578 + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90400 + */ +#define SEC(name) __attribute__((section(name), used)) + +#else + +#define SEC(name) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wignored-attributes\"") \ + __attribute__((section(name), used)) \ + _Pragma("GCC diagnostic pop") \ + +#endif + +/* Avoid 'linux/stddef.h' definition of '__always_inline'. */ +#undef __always_inline +#define __always_inline inline __attribute__((always_inline)) + +#ifndef __noinline +#define __noinline __attribute__((noinline)) +#endif +#ifndef __weak +#define __weak __attribute__((weak)) +#endif + +/* + * Use __hidden attribute to mark a non-static BPF subprogram effectively + * static for BPF verifier's verification algorithm purposes, allowing more + * extensive and permissive BPF verification process, taking into account + * subprogram's caller context. + */ +#define __hidden __attribute__((visibility("hidden"))) + +/* When utilizing vmlinux.h with BPF CO-RE, user BPF programs can't include + * any system-level headers (such as stddef.h, linux/version.h, etc), and + * commonly-used macros like NULL and KERNEL_VERSION aren't available through + * vmlinux.h. This just adds unnecessary hurdles and forces users to re-define + * them on their own. So as a convenience, provide such definitions here. + */ +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef KERNEL_VERSION +#define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c))) +#endif + +/* + * Helper macros to manipulate data structures + */ +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((unsigned long)&((TYPE *)0)->MEMBER) +#endif +#ifndef container_of +#define container_of(ptr, type, member) \ + ({ \ + void *__mptr = (void *)(ptr); \ + ((type *)(__mptr - offsetof(type, member))); \ + }) +#endif + +/* + * Compiler (optimization) barrier. + */ +#ifndef barrier +#define barrier() asm volatile("" ::: "memory") +#endif + +/* Variable-specific compiler (optimization) barrier. It's a no-op which makes + * compiler believe that there is some black box modification of a given + * variable and thus prevents compiler from making extra assumption about its + * value and potential simplifications and optimizations on this variable. + * + * E.g., compiler might often delay or even omit 32-bit to 64-bit casting of + * a variable, making some code patterns unverifiable. Putting barrier_var() + * in place will ensure that cast is performed before the barrier_var() + * invocation, because compiler has to pessimistically assume that embedded + * asm section might perform some extra operations on that variable. + * + * This is a variable-specific variant of more global barrier(). + */ +#ifndef barrier_var +#define barrier_var(var) asm volatile("" : "+r"(var)) +#endif + +/* + * Helper macro to throw a compilation error if __bpf_unreachable() gets + * built into the resulting code. This works given BPF back end does not + * implement __builtin_trap(). This is useful to assert that certain paths + * of the program code are never used and hence eliminated by the compiler. + * + * For example, consider a switch statement that covers known cases used by + * the program. __bpf_unreachable() can then reside in the default case. If + * the program gets extended such that a case is not covered in the switch + * statement, then it will throw a build error due to the default case not + * being compiled out. + */ +#ifndef __bpf_unreachable +# define __bpf_unreachable() __builtin_trap() +#endif + +/* + * Helper function to perform a tail call with a constant/immediate map slot. + */ +#if __clang_major__ >= 8 && defined(__bpf__) +static __always_inline void +bpf_tail_call_static(void *ctx, const void *map, const __u32 slot) +{ + if (!__builtin_constant_p(slot)) + __bpf_unreachable(); + + /* + * Provide a hard guarantee that LLVM won't optimize setting r2 (map + * pointer) and r3 (constant map index) from _different paths_ ending + * up at the _same_ call insn as otherwise we won't be able to use the + * jmpq/nopl retpoline-free patching by the x86-64 JIT in the kernel + * given they mismatch. See also d2e4c1e6c294 ("bpf: Constant map key + * tracking for prog array pokes") for details on verifier tracking. + * + * Note on clobber list: we need to stay in-line with BPF calling + * convention, so even if we don't end up using r0, r4, r5, we need + * to mark them as clobber so that LLVM doesn't end up using them + * before / after the call. + */ + asm volatile("r1 = %[ctx]\n\t" + "r2 = %[map]\n\t" + "r3 = %[slot]\n\t" + "call 12" + :: [ctx]"r"(ctx), [map]"r"(map), [slot]"i"(slot) + : "r0", "r1", "r2", "r3", "r4", "r5"); +} +#endif + +enum libbpf_pin_type { + LIBBPF_PIN_NONE, + /* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */ + LIBBPF_PIN_BY_NAME, +}; + +enum libbpf_tristate { + TRI_NO = 0, + TRI_YES = 1, + TRI_MODULE = 2, +}; + +#define __kconfig __attribute__((section(".kconfig"))) +#define __ksym __attribute__((section(".ksyms"))) +#define __kptr __attribute__((btf_type_tag("kptr"))) +#define __kptr_ref __attribute__((btf_type_tag("kptr_ref"))) + +#ifndef ___bpf_concat +#define ___bpf_concat(a, b) a ## b +#endif +#ifndef ___bpf_apply +#define ___bpf_apply(fn, n) ___bpf_concat(fn, n) +#endif +#ifndef ___bpf_nth +#define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N +#endif +#ifndef ___bpf_narg +#define ___bpf_narg(...) \ + ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#endif + +#define ___bpf_fill0(arr, p, x) do {} while (0) +#define ___bpf_fill1(arr, p, x) arr[p] = x +#define ___bpf_fill2(arr, p, x, args...) arr[p] = x; ___bpf_fill1(arr, p + 1, args) +#define ___bpf_fill3(arr, p, x, args...) arr[p] = x; ___bpf_fill2(arr, p + 1, args) +#define ___bpf_fill4(arr, p, x, args...) arr[p] = x; ___bpf_fill3(arr, p + 1, args) +#define ___bpf_fill5(arr, p, x, args...) arr[p] = x; ___bpf_fill4(arr, p + 1, args) +#define ___bpf_fill6(arr, p, x, args...) arr[p] = x; ___bpf_fill5(arr, p + 1, args) +#define ___bpf_fill7(arr, p, x, args...) arr[p] = x; ___bpf_fill6(arr, p + 1, args) +#define ___bpf_fill8(arr, p, x, args...) arr[p] = x; ___bpf_fill7(arr, p + 1, args) +#define ___bpf_fill9(arr, p, x, args...) arr[p] = x; ___bpf_fill8(arr, p + 1, args) +#define ___bpf_fill10(arr, p, x, args...) arr[p] = x; ___bpf_fill9(arr, p + 1, args) +#define ___bpf_fill11(arr, p, x, args...) arr[p] = x; ___bpf_fill10(arr, p + 1, args) +#define ___bpf_fill12(arr, p, x, args...) arr[p] = x; ___bpf_fill11(arr, p + 1, args) +#define ___bpf_fill(arr, args...) \ + ___bpf_apply(___bpf_fill, ___bpf_narg(args))(arr, 0, args) + +/* + * BPF_SEQ_PRINTF to wrap bpf_seq_printf to-be-printed values + * in a structure. + */ +#define BPF_SEQ_PRINTF(seq, fmt, args...) \ +({ \ + static const char ___fmt[] = fmt; \ + unsigned long long ___param[___bpf_narg(args)]; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + \ + bpf_seq_printf(seq, ___fmt, sizeof(___fmt), \ + ___param, sizeof(___param)); \ +}) + +/* + * BPF_SNPRINTF wraps the bpf_snprintf helper with variadic arguments instead of + * an array of u64. + */ +#define BPF_SNPRINTF(out, out_size, fmt, args...) \ +({ \ + static const char ___fmt[] = fmt; \ + unsigned long long ___param[___bpf_narg(args)]; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + \ + bpf_snprintf(out, out_size, ___fmt, \ + ___param, sizeof(___param)); \ +}) + +#ifdef BPF_NO_GLOBAL_DATA +#define BPF_PRINTK_FMT_MOD +#else +#define BPF_PRINTK_FMT_MOD static const +#endif + +#define __bpf_printk(fmt, ...) \ +({ \ + BPF_PRINTK_FMT_MOD char ____fmt[] = fmt; \ + bpf_trace_printk(____fmt, sizeof(____fmt), \ + ##__VA_ARGS__); \ +}) + +/* + * __bpf_vprintk wraps the bpf_trace_vprintk helper with variadic arguments + * instead of an array of u64. + */ +#define __bpf_vprintk(fmt, args...) \ +({ \ + static const char ___fmt[] = fmt; \ + unsigned long long ___param[___bpf_narg(args)]; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + \ + bpf_trace_vprintk(___fmt, sizeof(___fmt), \ + ___param, sizeof(___param)); \ +}) + +/* Use __bpf_printk when bpf_printk call has 3 or fewer fmt args + * Otherwise use __bpf_vprintk + */ +#define ___bpf_pick_printk(...) \ + ___bpf_nth(_, ##__VA_ARGS__, __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, \ + __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, \ + __bpf_vprintk, __bpf_vprintk, __bpf_printk /*3*/, __bpf_printk /*2*/,\ + __bpf_printk /*1*/, __bpf_printk /*0*/) + +/* Helper macro to print out debug messages */ +#define bpf_printk(fmt, args...) ___bpf_pick_printk(args)(fmt, ##args) + +#endif diff --git a/examples/c/bpf/bpf_tracing.h b/examples/c/bpf/bpf_tracing.h new file mode 100644 index 0000000..df90229 --- /dev/null +++ b/examples/c/bpf/bpf_tracing.h @@ -0,0 +1,920 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_TRACING_H__ +#define __BPF_TRACING_H__ + +#include "bpf_helpers.h" + +/* Scan the ARCH passed in from ARCH env variable (see Makefile) */ +#if defined(__TARGET_ARCH_x86) + #define bpf_target_x86 + #define bpf_target_defined +#elif defined(__TARGET_ARCH_s390) + #define bpf_target_s390 + #define bpf_target_defined +#elif defined(__TARGET_ARCH_arm) + #define bpf_target_arm + #define bpf_target_defined +#elif defined(__TARGET_ARCH_arm64) + #define bpf_target_arm64 + #define bpf_target_defined +#elif defined(__TARGET_ARCH_mips) + #define bpf_target_mips + #define bpf_target_defined +#elif defined(__TARGET_ARCH_powerpc) + #define bpf_target_powerpc + #define bpf_target_defined +#elif defined(__TARGET_ARCH_sparc) + #define bpf_target_sparc + #define bpf_target_defined +#elif defined(__TARGET_ARCH_riscv) + #define bpf_target_riscv + #define bpf_target_defined +#elif defined(__TARGET_ARCH_arc) + #define bpf_target_arc + #define bpf_target_defined +#elif defined(__TARGET_ARCH_loongarch) + #define bpf_target_loongarch + #define bpf_target_defined +#else + +/* Fall back to what the compiler says */ +#if defined(__x86_64__) + #define bpf_target_x86 + #define bpf_target_defined +#elif defined(__s390__) + #define bpf_target_s390 + #define bpf_target_defined +#elif defined(__arm__) + #define bpf_target_arm + #define bpf_target_defined +#elif defined(__aarch64__) + #define bpf_target_arm64 + #define bpf_target_defined +#elif defined(__mips__) + #define bpf_target_mips + #define bpf_target_defined +#elif defined(__powerpc__) + #define bpf_target_powerpc + #define bpf_target_defined +#elif defined(__sparc__) + #define bpf_target_sparc + #define bpf_target_defined +#elif defined(__riscv) && __riscv_xlen == 64 + #define bpf_target_riscv + #define bpf_target_defined +#elif defined(__arc__) + #define bpf_target_arc + #define bpf_target_defined +#elif defined(__loongarch__) + #define bpf_target_loongarch + #define bpf_target_defined +#endif /* no compiler target */ + +#endif + +#ifndef __BPF_TARGET_MISSING +#define __BPF_TARGET_MISSING "GCC error \"Must specify a BPF target arch via __TARGET_ARCH_xxx\"" +#endif + +#if defined(bpf_target_x86) + +/* + * https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI + */ + +#if defined(__KERNEL__) || defined(__VMLINUX_H__) + +#define __PT_PARM1_REG di +#define __PT_PARM2_REG si +#define __PT_PARM3_REG dx +#define __PT_PARM4_REG cx +#define __PT_PARM5_REG r8 +#define __PT_PARM6_REG r9 +/* + * Syscall uses r10 for PARM4. See arch/x86/entry/entry_64.S:entry_SYSCALL_64 + * comments in Linux sources. And refer to syscall(2) manpage. + */ +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG r10 +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG sp +#define __PT_FP_REG bp +#define __PT_RC_REG ax +#define __PT_SP_REG sp +#define __PT_IP_REG ip + +#else + +#ifdef __i386__ + +/* i386 kernel is built with -mregparm=3 */ +#define __PT_PARM1_REG eax +#define __PT_PARM2_REG edx +#define __PT_PARM3_REG ecx +/* i386 syscall ABI is very different, refer to syscall(2) manpage */ +#define __PT_PARM1_SYSCALL_REG ebx +#define __PT_PARM2_SYSCALL_REG ecx +#define __PT_PARM3_SYSCALL_REG edx +#define __PT_PARM4_SYSCALL_REG esi +#define __PT_PARM5_SYSCALL_REG edi +#define __PT_PARM6_SYSCALL_REG ebp + +#define __PT_RET_REG esp +#define __PT_FP_REG ebp +#define __PT_RC_REG eax +#define __PT_SP_REG esp +#define __PT_IP_REG eip + +#else /* __i386__ */ + +#define __PT_PARM1_REG rdi +#define __PT_PARM2_REG rsi +#define __PT_PARM3_REG rdx +#define __PT_PARM4_REG rcx +#define __PT_PARM5_REG r8 +#define __PT_PARM6_REG r9 + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG r10 +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG rsp +#define __PT_FP_REG rbp +#define __PT_RC_REG rax +#define __PT_SP_REG rsp +#define __PT_IP_REG rip + +#endif /* __i386__ */ + +#endif /* __KERNEL__ || __VMLINUX_H__ */ + +#elif defined(bpf_target_s390) + +/* + * https://github.com/IBM/s390x-abi/releases/download/v1.6/lzsabi_s390x.pdf + */ + +struct pt_regs___s390 { + unsigned long orig_gpr2; +}; + +/* s390 provides user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x)) +#define __PT_PARM1_REG gprs[2] +#define __PT_PARM2_REG gprs[3] +#define __PT_PARM3_REG gprs[4] +#define __PT_PARM4_REG gprs[5] +#define __PT_PARM5_REG gprs[6] + +#define __PT_PARM1_SYSCALL_REG orig_gpr2 +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG gprs[7] +#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x) +#define PT_REGS_PARM1_CORE_SYSCALL(x) \ + BPF_CORE_READ((const struct pt_regs___s390 *)(x), __PT_PARM1_SYSCALL_REG) + +#define __PT_RET_REG gprs[14] +#define __PT_FP_REG gprs[11] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG gprs[2] +#define __PT_SP_REG gprs[15] +#define __PT_IP_REG psw.addr + +#elif defined(bpf_target_arm) + +/* + * https://github.com/ARM-software/abi-aa/blob/main/aapcs32/aapcs32.rst#machine-registers + */ + +#define __PT_PARM1_REG uregs[0] +#define __PT_PARM2_REG uregs[1] +#define __PT_PARM3_REG uregs[2] +#define __PT_PARM4_REG uregs[3] + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM6_SYSCALL_REG uregs[5] +#define __PT_PARM7_SYSCALL_REG uregs[6] + +#define __PT_RET_REG uregs[14] +#define __PT_FP_REG uregs[11] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG uregs[0] +#define __PT_SP_REG uregs[13] +#define __PT_IP_REG uregs[12] + +#elif defined(bpf_target_arm64) + +/* + * https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#machine-registers + */ + +struct pt_regs___arm64 { + unsigned long orig_x0; +}; + +/* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x)) +#define __PT_PARM1_REG regs[0] +#define __PT_PARM2_REG regs[1] +#define __PT_PARM3_REG regs[2] +#define __PT_PARM4_REG regs[3] +#define __PT_PARM5_REG regs[4] +#define __PT_PARM6_REG regs[5] +#define __PT_PARM7_REG regs[6] +#define __PT_PARM8_REG regs[7] + +#define __PT_PARM1_SYSCALL_REG orig_x0 +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG +#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x) +#define PT_REGS_PARM1_CORE_SYSCALL(x) \ + BPF_CORE_READ((const struct pt_regs___arm64 *)(x), __PT_PARM1_SYSCALL_REG) + +#define __PT_RET_REG regs[30] +#define __PT_FP_REG regs[29] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG regs[0] +#define __PT_SP_REG sp +#define __PT_IP_REG pc + +#elif defined(bpf_target_mips) + +/* + * N64 ABI is assumed right now. + * https://en.wikipedia.org/wiki/MIPS_architecture#Calling_conventions + */ + +#define __PT_PARM1_REG regs[4] +#define __PT_PARM2_REG regs[5] +#define __PT_PARM3_REG regs[6] +#define __PT_PARM4_REG regs[7] +#define __PT_PARM5_REG regs[8] +#define __PT_PARM6_REG regs[9] +#define __PT_PARM7_REG regs[10] +#define __PT_PARM8_REG regs[11] + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG /* only N32/N64 */ +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG /* only N32/N64 */ + +#define __PT_RET_REG regs[31] +#define __PT_FP_REG regs[30] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG regs[2] +#define __PT_SP_REG regs[29] +#define __PT_IP_REG cp0_epc + +#elif defined(bpf_target_powerpc) + +/* + * http://refspecs.linux-foundation.org/elf/elfspec_ppc.pdf (page 3-14, + * section "Function Calling Sequence") + */ + +#define __PT_PARM1_REG gpr[3] +#define __PT_PARM2_REG gpr[4] +#define __PT_PARM3_REG gpr[5] +#define __PT_PARM4_REG gpr[6] +#define __PT_PARM5_REG gpr[7] +#define __PT_PARM6_REG gpr[8] +#define __PT_PARM7_REG gpr[9] +#define __PT_PARM8_REG gpr[10] + +/* powerpc does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG orig_gpr3 +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG +#if !defined(__arch64__) +#define __PT_PARM7_SYSCALL_REG __PT_PARM7_REG /* only powerpc (not powerpc64) */ +#endif + +#define __PT_RET_REG regs[31] +#define __PT_FP_REG __unsupported__ +#define __PT_RC_REG gpr[3] +#define __PT_SP_REG sp +#define __PT_IP_REG nip + +#elif defined(bpf_target_sparc) + +/* + * https://en.wikipedia.org/wiki/Calling_convention#SPARC + */ + +#define __PT_PARM1_REG u_regs[UREG_I0] +#define __PT_PARM2_REG u_regs[UREG_I1] +#define __PT_PARM3_REG u_regs[UREG_I2] +#define __PT_PARM4_REG u_regs[UREG_I3] +#define __PT_PARM5_REG u_regs[UREG_I4] +#define __PT_PARM6_REG u_regs[UREG_I5] + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG u_regs[UREG_I7] +#define __PT_FP_REG __unsupported__ +#define __PT_RC_REG u_regs[UREG_I0] +#define __PT_SP_REG u_regs[UREG_FP] +/* Should this also be a bpf_target check for the sparc case? */ +#if defined(__arch64__) +#define __PT_IP_REG tpc +#else +#define __PT_IP_REG pc +#endif + +#elif defined(bpf_target_riscv) + +/* + * https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc#risc-v-calling-conventions + */ + +#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) +#define __PT_PARM1_REG a0 +#define __PT_PARM2_REG a1 +#define __PT_PARM3_REG a2 +#define __PT_PARM4_REG a3 +#define __PT_PARM5_REG a4 +#define __PT_PARM6_REG a5 +#define __PT_PARM7_REG a6 +#define __PT_PARM8_REG a7 + +/* riscv does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG ra +#define __PT_FP_REG s0 +#define __PT_RC_REG a0 +#define __PT_SP_REG sp +#define __PT_IP_REG pc + +#elif defined(bpf_target_arc) + +/* + * Section "Function Calling Sequence" (page 24): + * https://raw.githubusercontent.com/wiki/foss-for-synopsys-dwc-arc-processors/toolchain/files/ARCv2_ABI.pdf + */ + +/* arc provides struct user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) +#define __PT_PARM1_REG scratch.r0 +#define __PT_PARM2_REG scratch.r1 +#define __PT_PARM3_REG scratch.r2 +#define __PT_PARM4_REG scratch.r3 +#define __PT_PARM5_REG scratch.r4 +#define __PT_PARM6_REG scratch.r5 +#define __PT_PARM7_REG scratch.r6 +#define __PT_PARM8_REG scratch.r7 + +/* arc does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG scratch.blink +#define __PT_FP_REG scratch.fp +#define __PT_RC_REG scratch.r0 +#define __PT_SP_REG scratch.sp +#define __PT_IP_REG scratch.ret + +#elif defined(bpf_target_loongarch) + +/* + * https://docs.kernel.org/loongarch/introduction.html + * https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html + */ + +#define __PT_PARM1_REG regs[4] +#define __PT_PARM2_REG regs[5] +#define __PT_PARM3_REG regs[6] +#define __PT_PARM4_REG regs[7] +#define __PT_PARM5_REG regs[8] +#define __PT_PARM6_REG regs[9] +#define __PT_PARM7_REG regs[10] +#define __PT_PARM8_REG regs[11] + +/* loongarch does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG regs[1] +#define __PT_FP_REG regs[22] +#define __PT_RC_REG regs[4] +#define __PT_SP_REG regs[3] +#define __PT_IP_REG csr_era + +#endif + +#if defined(bpf_target_defined) + +struct pt_regs; + +/* allow some architectures to override `struct pt_regs` */ +#ifndef __PT_REGS_CAST +#define __PT_REGS_CAST(x) (x) +#endif + +/* + * Different architectures support different number of arguments passed + * through registers. i386 supports just 3, some arches support up to 8. + */ +#ifndef __PT_PARM4_REG +#define __PT_PARM4_REG __unsupported__ +#endif +#ifndef __PT_PARM5_REG +#define __PT_PARM5_REG __unsupported__ +#endif +#ifndef __PT_PARM6_REG +#define __PT_PARM6_REG __unsupported__ +#endif +#ifndef __PT_PARM7_REG +#define __PT_PARM7_REG __unsupported__ +#endif +#ifndef __PT_PARM8_REG +#define __PT_PARM8_REG __unsupported__ +#endif +/* + * Similarly, syscall-specific conventions might differ between function call + * conventions within each architecutre. All supported architectures pass + * either 6 or 7 syscall arguments in registers. + * + * See syscall(2) manpage for succinct table with information on each arch. + */ +#ifndef __PT_PARM7_SYSCALL_REG +#define __PT_PARM7_SYSCALL_REG __unsupported__ +#endif + +#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG) +#define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->__PT_PARM2_REG) +#define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->__PT_PARM3_REG) +#define PT_REGS_PARM4(x) (__PT_REGS_CAST(x)->__PT_PARM4_REG) +#define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->__PT_PARM5_REG) +#define PT_REGS_PARM6(x) (__PT_REGS_CAST(x)->__PT_PARM6_REG) +#define PT_REGS_PARM7(x) (__PT_REGS_CAST(x)->__PT_PARM7_REG) +#define PT_REGS_PARM8(x) (__PT_REGS_CAST(x)->__PT_PARM8_REG) +#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->__PT_RET_REG) +#define PT_REGS_FP(x) (__PT_REGS_CAST(x)->__PT_FP_REG) +#define PT_REGS_RC(x) (__PT_REGS_CAST(x)->__PT_RC_REG) +#define PT_REGS_SP(x) (__PT_REGS_CAST(x)->__PT_SP_REG) +#define PT_REGS_IP(x) (__PT_REGS_CAST(x)->__PT_IP_REG) + +#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM1_REG) +#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM2_REG) +#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM3_REG) +#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM4_REG) +#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM5_REG) +#define PT_REGS_PARM6_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM6_REG) +#define PT_REGS_PARM7_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM7_REG) +#define PT_REGS_PARM8_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM8_REG) +#define PT_REGS_RET_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RET_REG) +#define PT_REGS_FP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_FP_REG) +#define PT_REGS_RC_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RC_REG) +#define PT_REGS_SP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_SP_REG) +#define PT_REGS_IP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_IP_REG) + +#if defined(bpf_target_powerpc) + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; }) +#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP + +#elif defined(bpf_target_sparc) + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); }) +#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP + +#else + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) \ + ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); }) +#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) \ + ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)(PT_REGS_FP(ctx) + sizeof(ip))); }) + +#endif + +#ifndef PT_REGS_PARM1_SYSCALL +#define PT_REGS_PARM1_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM1_SYSCALL_REG) +#define PT_REGS_PARM1_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM1_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM2_SYSCALL +#define PT_REGS_PARM2_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM2_SYSCALL_REG) +#define PT_REGS_PARM2_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM2_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM3_SYSCALL +#define PT_REGS_PARM3_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM3_SYSCALL_REG) +#define PT_REGS_PARM3_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM3_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM4_SYSCALL +#define PT_REGS_PARM4_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM4_SYSCALL_REG) +#define PT_REGS_PARM4_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM4_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM5_SYSCALL +#define PT_REGS_PARM5_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM5_SYSCALL_REG) +#define PT_REGS_PARM5_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM5_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM6_SYSCALL +#define PT_REGS_PARM6_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM6_SYSCALL_REG) +#define PT_REGS_PARM6_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM6_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM7_SYSCALL +#define PT_REGS_PARM7_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM7_SYSCALL_REG) +#define PT_REGS_PARM7_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM7_SYSCALL_REG) +#endif + +#else /* defined(bpf_target_defined) */ + +#define PT_REGS_PARM1(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM8(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RET(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_FP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RC(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_SP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_IP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define PT_REGS_PARM1_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM8_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RET_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_FP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RC_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_SP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_IP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define PT_REGS_PARM1_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define PT_REGS_PARM1_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#endif /* defined(bpf_target_defined) */ + +/* + * When invoked from a syscall handler kprobe, returns a pointer to a + * struct pt_regs containing syscall arguments and suitable for passing to + * PT_REGS_PARMn_SYSCALL() and PT_REGS_PARMn_CORE_SYSCALL(). + */ +#ifndef PT_REGS_SYSCALL_REGS +/* By default, assume that the arch selects ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ((struct pt_regs *)PT_REGS_PARM1(ctx)) +#endif + +#ifndef ___bpf_concat +#define ___bpf_concat(a, b) a ## b +#endif +#ifndef ___bpf_apply +#define ___bpf_apply(fn, n) ___bpf_concat(fn, n) +#endif +#ifndef ___bpf_nth +#define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N +#endif +#ifndef ___bpf_narg +#define ___bpf_narg(...) ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#endif + +#define ___bpf_ctx_cast0() ctx +#define ___bpf_ctx_cast1(x) ___bpf_ctx_cast0(), (void *)ctx[0] +#define ___bpf_ctx_cast2(x, args...) ___bpf_ctx_cast1(args), (void *)ctx[1] +#define ___bpf_ctx_cast3(x, args...) ___bpf_ctx_cast2(args), (void *)ctx[2] +#define ___bpf_ctx_cast4(x, args...) ___bpf_ctx_cast3(args), (void *)ctx[3] +#define ___bpf_ctx_cast5(x, args...) ___bpf_ctx_cast4(args), (void *)ctx[4] +#define ___bpf_ctx_cast6(x, args...) ___bpf_ctx_cast5(args), (void *)ctx[5] +#define ___bpf_ctx_cast7(x, args...) ___bpf_ctx_cast6(args), (void *)ctx[6] +#define ___bpf_ctx_cast8(x, args...) ___bpf_ctx_cast7(args), (void *)ctx[7] +#define ___bpf_ctx_cast9(x, args...) ___bpf_ctx_cast8(args), (void *)ctx[8] +#define ___bpf_ctx_cast10(x, args...) ___bpf_ctx_cast9(args), (void *)ctx[9] +#define ___bpf_ctx_cast11(x, args...) ___bpf_ctx_cast10(args), (void *)ctx[10] +#define ___bpf_ctx_cast12(x, args...) ___bpf_ctx_cast11(args), (void *)ctx[11] +#define ___bpf_ctx_cast(args...) ___bpf_apply(___bpf_ctx_cast, ___bpf_narg(args))(args) + +/* + * BPF_PROG is a convenience wrapper for generic tp_btf/fentry/fexit and + * similar kinds of BPF programs, that accept input arguments as a single + * pointer to untyped u64 array, where each u64 can actually be a typed + * pointer or integer of different size. Instead of requring user to write + * manual casts and work with array elements by index, BPF_PROG macro + * allows user to declare a list of named and typed input arguments in the + * same syntax as for normal C function. All the casting is hidden and + * performed transparently, while user code can just assume working with + * function arguments of specified type and name. + * + * Original raw context argument is preserved as well as 'ctx' argument. + * This is useful when using BPF helpers that expect original context + * as one of the parameters (e.g., for bpf_perf_event_output()). + */ +#define BPF_PROG(name, args...) \ +name(unsigned long long *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx, ##args); \ +typeof(name(0)) name(unsigned long long *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_ctx_cast(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx, ##args) + +#ifndef ___bpf_nth2 +#define ___bpf_nth2(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, \ + _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, N, ...) N +#endif +#ifndef ___bpf_narg2 +#define ___bpf_narg2(...) \ + ___bpf_nth2(_, ##__VA_ARGS__, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, \ + 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0) +#endif + +#define ___bpf_treg_cnt(t) \ + __builtin_choose_expr(sizeof(t) == 1, 1, \ + __builtin_choose_expr(sizeof(t) == 2, 1, \ + __builtin_choose_expr(sizeof(t) == 4, 1, \ + __builtin_choose_expr(sizeof(t) == 8, 1, \ + __builtin_choose_expr(sizeof(t) == 16, 2, \ + (void)0))))) + +#define ___bpf_reg_cnt0() (0) +#define ___bpf_reg_cnt1(t, x) (___bpf_reg_cnt0() + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt2(t, x, args...) (___bpf_reg_cnt1(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt3(t, x, args...) (___bpf_reg_cnt2(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt4(t, x, args...) (___bpf_reg_cnt3(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt5(t, x, args...) (___bpf_reg_cnt4(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt6(t, x, args...) (___bpf_reg_cnt5(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt7(t, x, args...) (___bpf_reg_cnt6(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt8(t, x, args...) (___bpf_reg_cnt7(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt9(t, x, args...) (___bpf_reg_cnt8(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt10(t, x, args...) (___bpf_reg_cnt9(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt11(t, x, args...) (___bpf_reg_cnt10(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt12(t, x, args...) (___bpf_reg_cnt11(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt(args...) ___bpf_apply(___bpf_reg_cnt, ___bpf_narg2(args))(args) + +#define ___bpf_union_arg(t, x, n) \ + __builtin_choose_expr(sizeof(t) == 1, ({ union { __u8 z[1]; t x; } ___t = { .z = {ctx[n]}}; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 2, ({ union { __u16 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 4, ({ union { __u32 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 8, ({ union { __u64 z[1]; t x; } ___t = {.z = {ctx[n]} }; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 16, ({ union { __u64 z[2]; t x; } ___t = {.z = {ctx[n], ctx[n + 1]} }; ___t.x; }), \ + (void)0))))) + +#define ___bpf_ctx_arg0(n, args...) +#define ___bpf_ctx_arg1(n, t, x) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt1(t, x)) +#define ___bpf_ctx_arg2(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt2(t, x, args)) ___bpf_ctx_arg1(n, args) +#define ___bpf_ctx_arg3(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt3(t, x, args)) ___bpf_ctx_arg2(n, args) +#define ___bpf_ctx_arg4(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt4(t, x, args)) ___bpf_ctx_arg3(n, args) +#define ___bpf_ctx_arg5(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt5(t, x, args)) ___bpf_ctx_arg4(n, args) +#define ___bpf_ctx_arg6(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt6(t, x, args)) ___bpf_ctx_arg5(n, args) +#define ___bpf_ctx_arg7(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt7(t, x, args)) ___bpf_ctx_arg6(n, args) +#define ___bpf_ctx_arg8(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt8(t, x, args)) ___bpf_ctx_arg7(n, args) +#define ___bpf_ctx_arg9(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt9(t, x, args)) ___bpf_ctx_arg8(n, args) +#define ___bpf_ctx_arg10(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt10(t, x, args)) ___bpf_ctx_arg9(n, args) +#define ___bpf_ctx_arg11(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt11(t, x, args)) ___bpf_ctx_arg10(n, args) +#define ___bpf_ctx_arg12(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt12(t, x, args)) ___bpf_ctx_arg11(n, args) +#define ___bpf_ctx_arg(args...) ___bpf_apply(___bpf_ctx_arg, ___bpf_narg2(args))(___bpf_reg_cnt(args), args) + +#define ___bpf_ctx_decl0() +#define ___bpf_ctx_decl1(t, x) , t x +#define ___bpf_ctx_decl2(t, x, args...) , t x ___bpf_ctx_decl1(args) +#define ___bpf_ctx_decl3(t, x, args...) , t x ___bpf_ctx_decl2(args) +#define ___bpf_ctx_decl4(t, x, args...) , t x ___bpf_ctx_decl3(args) +#define ___bpf_ctx_decl5(t, x, args...) , t x ___bpf_ctx_decl4(args) +#define ___bpf_ctx_decl6(t, x, args...) , t x ___bpf_ctx_decl5(args) +#define ___bpf_ctx_decl7(t, x, args...) , t x ___bpf_ctx_decl6(args) +#define ___bpf_ctx_decl8(t, x, args...) , t x ___bpf_ctx_decl7(args) +#define ___bpf_ctx_decl9(t, x, args...) , t x ___bpf_ctx_decl8(args) +#define ___bpf_ctx_decl10(t, x, args...) , t x ___bpf_ctx_decl9(args) +#define ___bpf_ctx_decl11(t, x, args...) , t x ___bpf_ctx_decl10(args) +#define ___bpf_ctx_decl12(t, x, args...) , t x ___bpf_ctx_decl11(args) +#define ___bpf_ctx_decl(args...) ___bpf_apply(___bpf_ctx_decl, ___bpf_narg2(args))(args) + +/* + * BPF_PROG2 is an enhanced version of BPF_PROG in order to handle struct + * arguments. Since each struct argument might take one or two u64 values + * in the trampoline stack, argument type size is needed to place proper number + * of u64 values for each argument. Therefore, BPF_PROG2 has different + * syntax from BPF_PROG. For example, for the following BPF_PROG syntax: + * + * int BPF_PROG(test2, int a, int b) { ... } + * + * the corresponding BPF_PROG2 syntax is: + * + * int BPF_PROG2(test2, int, a, int, b) { ... } + * + * where type and the corresponding argument name are separated by comma. + * + * Use BPF_PROG2 macro if one of the arguments might be a struct/union larger + * than 8 bytes: + * + * int BPF_PROG2(test_struct_arg, struct bpf_testmod_struct_arg_1, a, int, b, + * int, c, int, d, struct bpf_testmod_struct_arg_2, e, int, ret) + * { + * // access a, b, c, d, e, and ret directly + * ... + * } + */ +#define BPF_PROG2(name, args...) \ +name(unsigned long long *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx ___bpf_ctx_decl(args)); \ +typeof(name(0)) name(unsigned long long *ctx) \ +{ \ + return ____##name(ctx ___bpf_ctx_arg(args)); \ +} \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx ___bpf_ctx_decl(args)) + +struct pt_regs; + +#define ___bpf_kprobe_args0() ctx +#define ___bpf_kprobe_args1(x) ___bpf_kprobe_args0(), (void *)PT_REGS_PARM1(ctx) +#define ___bpf_kprobe_args2(x, args...) ___bpf_kprobe_args1(args), (void *)PT_REGS_PARM2(ctx) +#define ___bpf_kprobe_args3(x, args...) ___bpf_kprobe_args2(args), (void *)PT_REGS_PARM3(ctx) +#define ___bpf_kprobe_args4(x, args...) ___bpf_kprobe_args3(args), (void *)PT_REGS_PARM4(ctx) +#define ___bpf_kprobe_args5(x, args...) ___bpf_kprobe_args4(args), (void *)PT_REGS_PARM5(ctx) +#define ___bpf_kprobe_args6(x, args...) ___bpf_kprobe_args5(args), (void *)PT_REGS_PARM6(ctx) +#define ___bpf_kprobe_args7(x, args...) ___bpf_kprobe_args6(args), (void *)PT_REGS_PARM7(ctx) +#define ___bpf_kprobe_args8(x, args...) ___bpf_kprobe_args7(args), (void *)PT_REGS_PARM8(ctx) +#define ___bpf_kprobe_args(args...) ___bpf_apply(___bpf_kprobe_args, ___bpf_narg(args))(args) + +/* + * BPF_KPROBE serves the same purpose for kprobes as BPF_PROG for + * tp_btf/fentry/fexit BPF programs. It hides the underlying platform-specific + * low-level way of getting kprobe input arguments from struct pt_regs, and + * provides a familiar typed and named function arguments syntax and + * semantics of accessing kprobe input paremeters. + * + * Original struct pt_regs* context is preserved as 'ctx' argument. This might + * be necessary when using BPF helpers like bpf_perf_event_output(). + */ +#define BPF_KPROBE(name, args...) \ +name(struct pt_regs *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_kprobe_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args) + +#define ___bpf_kretprobe_args0() ctx +#define ___bpf_kretprobe_args1(x) ___bpf_kretprobe_args0(), (void *)PT_REGS_RC(ctx) +#define ___bpf_kretprobe_args(args...) ___bpf_apply(___bpf_kretprobe_args, ___bpf_narg(args))(args) + +/* + * BPF_KRETPROBE is similar to BPF_KPROBE, except, it only provides optional + * return value (in addition to `struct pt_regs *ctx`), but no input + * arguments, because they will be clobbered by the time probed function + * returns. + */ +#define BPF_KRETPROBE(name, args...) \ +name(struct pt_regs *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_kretprobe_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) ____##name(struct pt_regs *ctx, ##args) + +/* If kernel has CONFIG_ARCH_HAS_SYSCALL_WRAPPER, read pt_regs directly */ +#define ___bpf_syscall_args0() ctx +#define ___bpf_syscall_args1(x) ___bpf_syscall_args0(), (void *)PT_REGS_PARM1_SYSCALL(regs) +#define ___bpf_syscall_args2(x, args...) ___bpf_syscall_args1(args), (void *)PT_REGS_PARM2_SYSCALL(regs) +#define ___bpf_syscall_args3(x, args...) ___bpf_syscall_args2(args), (void *)PT_REGS_PARM3_SYSCALL(regs) +#define ___bpf_syscall_args4(x, args...) ___bpf_syscall_args3(args), (void *)PT_REGS_PARM4_SYSCALL(regs) +#define ___bpf_syscall_args5(x, args...) ___bpf_syscall_args4(args), (void *)PT_REGS_PARM5_SYSCALL(regs) +#define ___bpf_syscall_args6(x, args...) ___bpf_syscall_args5(args), (void *)PT_REGS_PARM6_SYSCALL(regs) +#define ___bpf_syscall_args7(x, args...) ___bpf_syscall_args6(args), (void *)PT_REGS_PARM7_SYSCALL(regs) +#define ___bpf_syscall_args(args...) ___bpf_apply(___bpf_syscall_args, ___bpf_narg(args))(args) + +/* If kernel doesn't have CONFIG_ARCH_HAS_SYSCALL_WRAPPER, we have to BPF_CORE_READ from pt_regs */ +#define ___bpf_syswrap_args0() ctx +#define ___bpf_syswrap_args1(x) ___bpf_syswrap_args0(), (void *)PT_REGS_PARM1_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args2(x, args...) ___bpf_syswrap_args1(args), (void *)PT_REGS_PARM2_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args3(x, args...) ___bpf_syswrap_args2(args), (void *)PT_REGS_PARM3_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args4(x, args...) ___bpf_syswrap_args3(args), (void *)PT_REGS_PARM4_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args5(x, args...) ___bpf_syswrap_args4(args), (void *)PT_REGS_PARM5_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args6(x, args...) ___bpf_syswrap_args5(args), (void *)PT_REGS_PARM6_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args7(x, args...) ___bpf_syswrap_args6(args), (void *)PT_REGS_PARM7_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args(args...) ___bpf_apply(___bpf_syswrap_args, ___bpf_narg(args))(args) + +/* + * BPF_KSYSCALL is a variant of BPF_KPROBE, which is intended for + * tracing syscall functions, like __x64_sys_close. It hides the underlying + * platform-specific low-level way of getting syscall input arguments from + * struct pt_regs, and provides a familiar typed and named function arguments + * syntax and semantics of accessing syscall input parameters. + * + * Original struct pt_regs * context is preserved as 'ctx' argument. This might + * be necessary when using BPF helpers like bpf_perf_event_output(). + * + * At the moment BPF_KSYSCALL does not transparently handle all the calling + * convention quirks for the following syscalls: + * + * - mmap(): __ARCH_WANT_SYS_OLD_MMAP. + * - clone(): CONFIG_CLONE_BACKWARDS, CONFIG_CLONE_BACKWARDS2 and + * CONFIG_CLONE_BACKWARDS3. + * - socket-related syscalls: __ARCH_WANT_SYS_SOCKETCALL. + * - compat syscalls. + * + * This may or may not change in the future. User needs to take extra measures + * to handle such quirks explicitly, if necessary. + * + * This macro relies on BPF CO-RE support and virtual __kconfig externs. + */ +#define BPF_KSYSCALL(name, args...) \ +name(struct pt_regs *ctx); \ +extern _Bool LINUX_HAS_SYSCALL_WRAPPER __kconfig; \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + struct pt_regs *regs = LINUX_HAS_SYSCALL_WRAPPER \ + ? (struct pt_regs *)PT_REGS_PARM1(ctx) \ + : ctx; \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + if (LINUX_HAS_SYSCALL_WRAPPER) \ + return ____##name(___bpf_syswrap_args(args)); \ + else \ + return ____##name(___bpf_syscall_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args) + +#define BPF_KPROBE_SYSCALL BPF_KSYSCALL + +/* BPF_UPROBE and BPF_URETPROBE are identical to BPF_KPROBE and BPF_KRETPROBE, + * but are named way less confusingly for SEC("uprobe") and SEC("uretprobe") + * use cases. + */ +#define BPF_UPROBE(name, args...) BPF_KPROBE(name, ##args) +#define BPF_URETPROBE(name, args...) BPF_KRETPROBE(name, ##args) + +#endif diff --git a/examples/c/bpf/btf.h b/examples/c/bpf/btf.h new file mode 100644 index 0000000..8e6880d --- /dev/null +++ b/examples/c/bpf/btf.h @@ -0,0 +1,575 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2018 Facebook */ +/*! \file */ + +#ifndef __LIBBPF_BTF_H +#define __LIBBPF_BTF_H + +#include +#include +#include +#include + +#include "libbpf_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define BTF_ELF_SEC ".BTF" +#define BTF_EXT_ELF_SEC ".BTF.ext" +#define MAPS_ELF_SEC ".maps" + +struct btf; +struct btf_ext; +struct btf_type; + +struct bpf_object; + +enum btf_endianness { + BTF_LITTLE_ENDIAN = 0, + BTF_BIG_ENDIAN = 1, +}; + +/** + * @brief **btf__free()** frees all data of a BTF object + * @param btf BTF object to free + */ +LIBBPF_API void btf__free(struct btf *btf); + +/** + * @brief **btf__new()** creates a new instance of a BTF object from the raw + * bytes of an ELF's BTF section + * @param data raw bytes + * @param size number of bytes passed in `data` + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new(const void *data, __u32 size); + +/** + * @brief **btf__new_split()** create a new instance of a BTF object from the + * provided raw data bytes. It takes another BTF instance, **base_btf**, which + * serves as a base BTF, which is extended by types in a newly created BTF + * instance + * @param data raw bytes + * @param size length of raw bytes + * @param base_btf the base BTF object + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * If *base_btf* is NULL, `btf__new_split()` is equivalent to `btf__new()` and + * creates non-split BTF. + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new_split(const void *data, __u32 size, struct btf *base_btf); + +/** + * @brief **btf__new_empty()** creates an empty BTF object. Use + * `btf__add_*()` to populate such BTF object. + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new_empty(void); + +/** + * @brief **btf__new_empty_split()** creates an unpopulated BTF object from an + * ELF BTF section except with a base BTF on top of which split BTF should be + * based + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * If *base_btf* is NULL, `btf__new_empty_split()` is equivalent to + * `btf__new_empty()` and creates non-split BTF. + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new_empty_split(struct btf *base_btf); + +LIBBPF_API struct btf *btf__parse(const char *path, struct btf_ext **btf_ext); +LIBBPF_API struct btf *btf__parse_split(const char *path, struct btf *base_btf); +LIBBPF_API struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext); +LIBBPF_API struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf); +LIBBPF_API struct btf *btf__parse_raw(const char *path); +LIBBPF_API struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf); + +LIBBPF_API struct btf *btf__load_vmlinux_btf(void); +LIBBPF_API struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf); + +LIBBPF_API struct btf *btf__load_from_kernel_by_id(__u32 id); +LIBBPF_API struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf); + +LIBBPF_API int btf__load_into_kernel(struct btf *btf); +LIBBPF_API __s32 btf__find_by_name(const struct btf *btf, + const char *type_name); +LIBBPF_API __s32 btf__find_by_name_kind(const struct btf *btf, + const char *type_name, __u32 kind); +LIBBPF_API __u32 btf__type_cnt(const struct btf *btf); +LIBBPF_API const struct btf *btf__base_btf(const struct btf *btf); +LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf, + __u32 id); +LIBBPF_API size_t btf__pointer_size(const struct btf *btf); +LIBBPF_API int btf__set_pointer_size(struct btf *btf, size_t ptr_sz); +LIBBPF_API enum btf_endianness btf__endianness(const struct btf *btf); +LIBBPF_API int btf__set_endianness(struct btf *btf, enum btf_endianness endian); +LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id); +LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id); +LIBBPF_API int btf__align_of(const struct btf *btf, __u32 id); +LIBBPF_API int btf__fd(const struct btf *btf); +LIBBPF_API void btf__set_fd(struct btf *btf, int fd); +LIBBPF_API const void *btf__raw_data(const struct btf *btf, __u32 *size); +LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset); +LIBBPF_API const char *btf__str_by_offset(const struct btf *btf, __u32 offset); + +LIBBPF_API struct btf_ext *btf_ext__new(const __u8 *data, __u32 size); +LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext); +LIBBPF_API const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size); + +LIBBPF_API int btf__find_str(struct btf *btf, const char *s); +LIBBPF_API int btf__add_str(struct btf *btf, const char *s); +LIBBPF_API int btf__add_type(struct btf *btf, const struct btf *src_btf, + const struct btf_type *src_type); +/** + * @brief **btf__add_btf()** appends all the BTF types from *src_btf* into *btf* + * @param btf BTF object which all the BTF types and strings are added to + * @param src_btf BTF object which all BTF types and referenced strings are copied from + * @return BTF type ID of the first appended BTF type, or negative error code + * + * **btf__add_btf()** can be used to simply and efficiently append the entire + * contents of one BTF object to another one. All the BTF type data is copied + * over, all referenced type IDs are adjusted by adding a necessary ID offset. + * Only strings referenced from BTF types are copied over and deduplicated, so + * if there were some unused strings in *src_btf*, those won't be copied over, + * which is consistent with the general string deduplication semantics of BTF + * writing APIs. + * + * If any error is encountered during this process, the contents of *btf* is + * left intact, which means that **btf__add_btf()** follows the transactional + * semantics and the operation as a whole is all-or-nothing. + * + * *src_btf* has to be non-split BTF, as of now copying types from split BTF + * is not supported and will result in -ENOTSUP error code returned. + */ +LIBBPF_API int btf__add_btf(struct btf *btf, const struct btf *src_btf); + +LIBBPF_API int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding); +LIBBPF_API int btf__add_float(struct btf *btf, const char *name, size_t byte_sz); +LIBBPF_API int btf__add_ptr(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_array(struct btf *btf, + int index_type_id, int elem_type_id, __u32 nr_elems); +/* struct/union construction APIs */ +LIBBPF_API int btf__add_struct(struct btf *btf, const char *name, __u32 sz); +LIBBPF_API int btf__add_union(struct btf *btf, const char *name, __u32 sz); +LIBBPF_API int btf__add_field(struct btf *btf, const char *name, int field_type_id, + __u32 bit_offset, __u32 bit_size); + +/* enum construction APIs */ +LIBBPF_API int btf__add_enum(struct btf *btf, const char *name, __u32 bytes_sz); +LIBBPF_API int btf__add_enum_value(struct btf *btf, const char *name, __s64 value); +LIBBPF_API int btf__add_enum64(struct btf *btf, const char *name, __u32 bytes_sz, bool is_signed); +LIBBPF_API int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value); + +enum btf_fwd_kind { + BTF_FWD_STRUCT = 0, + BTF_FWD_UNION = 1, + BTF_FWD_ENUM = 2, +}; + +LIBBPF_API int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind); +LIBBPF_API int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id); +LIBBPF_API int btf__add_volatile(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_const(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_restrict(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id); + +/* func and func_proto construction APIs */ +LIBBPF_API int btf__add_func(struct btf *btf, const char *name, + enum btf_func_linkage linkage, int proto_type_id); +LIBBPF_API int btf__add_func_proto(struct btf *btf, int ret_type_id); +LIBBPF_API int btf__add_func_param(struct btf *btf, const char *name, int type_id); + +/* var & datasec construction APIs */ +LIBBPF_API int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id); +LIBBPF_API int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz); +LIBBPF_API int btf__add_datasec_var_info(struct btf *btf, int var_type_id, + __u32 offset, __u32 byte_sz); + +/* tag construction API */ +LIBBPF_API int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, + int component_idx); + +struct btf_dedup_opts { + size_t sz; + /* optional .BTF.ext info to dedup along the main BTF info */ + struct btf_ext *btf_ext; + /* force hash collisions (used for testing) */ + bool force_collisions; + size_t :0; +}; +#define btf_dedup_opts__last_field force_collisions + +LIBBPF_API int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts); + +struct btf_dump; + +struct btf_dump_opts { + size_t sz; +}; +#define btf_dump_opts__last_field sz + +typedef void (*btf_dump_printf_fn_t)(void *ctx, const char *fmt, va_list args); + +LIBBPF_API struct btf_dump *btf_dump__new(const struct btf *btf, + btf_dump_printf_fn_t printf_fn, + void *ctx, + const struct btf_dump_opts *opts); + +LIBBPF_API void btf_dump__free(struct btf_dump *d); + +LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id); + +struct btf_dump_emit_type_decl_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* optional field name for type declaration, e.g.: + * - struct my_struct + * - void (*)(int) + * - char (*)[123] + */ + const char *field_name; + /* extra indentation level (in number of tabs) to emit for multi-line + * type declarations (e.g., anonymous struct); applies for lines + * starting from the second one (first line is assumed to have + * necessary indentation already + */ + int indent_level; + /* strip all the const/volatile/restrict mods */ + bool strip_mods; + size_t :0; +}; +#define btf_dump_emit_type_decl_opts__last_field strip_mods + +LIBBPF_API int +btf_dump__emit_type_decl(struct btf_dump *d, __u32 id, + const struct btf_dump_emit_type_decl_opts *opts); + + +struct btf_dump_type_data_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + const char *indent_str; + int indent_level; + /* below match "show" flags for bpf_show_snprintf() */ + bool compact; /* no newlines/indentation */ + bool skip_names; /* skip member/type names */ + bool emit_zeroes; /* show 0-valued fields */ + size_t :0; +}; +#define btf_dump_type_data_opts__last_field emit_zeroes + +LIBBPF_API int +btf_dump__dump_type_data(struct btf_dump *d, __u32 id, + const void *data, size_t data_sz, + const struct btf_dump_type_data_opts *opts); + +/* + * A set of helpers for easier BTF types handling. + * + * The inline functions below rely on constants from the kernel headers which + * may not be available for applications including this header file. To avoid + * compilation errors, we define all the constants here that were added after + * the initial introduction of the BTF_KIND* constants. + */ +#ifndef BTF_KIND_FUNC +#define BTF_KIND_FUNC 12 /* Function */ +#define BTF_KIND_FUNC_PROTO 13 /* Function Proto */ +#endif +#ifndef BTF_KIND_VAR +#define BTF_KIND_VAR 14 /* Variable */ +#define BTF_KIND_DATASEC 15 /* Section */ +#endif +#ifndef BTF_KIND_FLOAT +#define BTF_KIND_FLOAT 16 /* Floating point */ +#endif +/* The kernel header switched to enums, so the following were never #defined */ +#define BTF_KIND_DECL_TAG 17 /* Decl Tag */ +#define BTF_KIND_TYPE_TAG 18 /* Type Tag */ +#define BTF_KIND_ENUM64 19 /* Enum for up-to 64bit values */ + +static inline __u16 btf_kind(const struct btf_type *t) +{ + return BTF_INFO_KIND(t->info); +} + +static inline __u16 btf_vlen(const struct btf_type *t) +{ + return BTF_INFO_VLEN(t->info); +} + +static inline bool btf_kflag(const struct btf_type *t) +{ + return BTF_INFO_KFLAG(t->info); +} + +static inline bool btf_is_void(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_UNKN; +} + +static inline bool btf_is_int(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_INT; +} + +static inline bool btf_is_ptr(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_PTR; +} + +static inline bool btf_is_array(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_ARRAY; +} + +static inline bool btf_is_struct(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_STRUCT; +} + +static inline bool btf_is_union(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_UNION; +} + +static inline bool btf_is_composite(const struct btf_type *t) +{ + __u16 kind = btf_kind(t); + + return kind == BTF_KIND_STRUCT || kind == BTF_KIND_UNION; +} + +static inline bool btf_is_enum(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_ENUM; +} + +static inline bool btf_is_enum64(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_ENUM64; +} + +static inline bool btf_is_fwd(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FWD; +} + +static inline bool btf_is_typedef(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_TYPEDEF; +} + +static inline bool btf_is_volatile(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_VOLATILE; +} + +static inline bool btf_is_const(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_CONST; +} + +static inline bool btf_is_restrict(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_RESTRICT; +} + +static inline bool btf_is_mod(const struct btf_type *t) +{ + __u16 kind = btf_kind(t); + + return kind == BTF_KIND_VOLATILE || + kind == BTF_KIND_CONST || + kind == BTF_KIND_RESTRICT || + kind == BTF_KIND_TYPE_TAG; +} + +static inline bool btf_is_func(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FUNC; +} + +static inline bool btf_is_func_proto(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FUNC_PROTO; +} + +static inline bool btf_is_var(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_VAR; +} + +static inline bool btf_is_datasec(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_DATASEC; +} + +static inline bool btf_is_float(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FLOAT; +} + +static inline bool btf_is_decl_tag(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_DECL_TAG; +} + +static inline bool btf_is_type_tag(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_TYPE_TAG; +} + +static inline bool btf_is_any_enum(const struct btf_type *t) +{ + return btf_is_enum(t) || btf_is_enum64(t); +} + +static inline bool btf_kind_core_compat(const struct btf_type *t1, + const struct btf_type *t2) +{ + return btf_kind(t1) == btf_kind(t2) || + (btf_is_any_enum(t1) && btf_is_any_enum(t2)); +} + +static inline __u8 btf_int_encoding(const struct btf_type *t) +{ + return BTF_INT_ENCODING(*(__u32 *)(t + 1)); +} + +static inline __u8 btf_int_offset(const struct btf_type *t) +{ + return BTF_INT_OFFSET(*(__u32 *)(t + 1)); +} + +static inline __u8 btf_int_bits(const struct btf_type *t) +{ + return BTF_INT_BITS(*(__u32 *)(t + 1)); +} + +static inline struct btf_array *btf_array(const struct btf_type *t) +{ + return (struct btf_array *)(t + 1); +} + +static inline struct btf_enum *btf_enum(const struct btf_type *t) +{ + return (struct btf_enum *)(t + 1); +} + +struct btf_enum64; + +static inline struct btf_enum64 *btf_enum64(const struct btf_type *t) +{ + return (struct btf_enum64 *)(t + 1); +} + +static inline __u64 btf_enum64_value(const struct btf_enum64 *e) +{ + /* struct btf_enum64 is introduced in Linux 6.0, which is very + * bleeding-edge. Here we are avoiding relying on struct btf_enum64 + * definition coming from kernel UAPI headers to support wider range + * of system-wide kernel headers. + * + * Given this header can be also included from C++ applications, that + * further restricts C tricks we can use (like using compatible + * anonymous struct). So just treat struct btf_enum64 as + * a three-element array of u32 and access second (lo32) and third + * (hi32) elements directly. + * + * For reference, here is a struct btf_enum64 definition: + * + * const struct btf_enum64 { + * __u32 name_off; + * __u32 val_lo32; + * __u32 val_hi32; + * }; + */ + const __u32 *e64 = (const __u32 *)e; + + return ((__u64)e64[2] << 32) | e64[1]; +} + +static inline struct btf_member *btf_members(const struct btf_type *t) +{ + return (struct btf_member *)(t + 1); +} + +/* Get bit offset of a member with specified index. */ +static inline __u32 btf_member_bit_offset(const struct btf_type *t, + __u32 member_idx) +{ + const struct btf_member *m = btf_members(t) + member_idx; + bool kflag = btf_kflag(t); + + return kflag ? BTF_MEMBER_BIT_OFFSET(m->offset) : m->offset; +} +/* + * Get bitfield size of a member, assuming t is BTF_KIND_STRUCT or + * BTF_KIND_UNION. If member is not a bitfield, zero is returned. + */ +static inline __u32 btf_member_bitfield_size(const struct btf_type *t, + __u32 member_idx) +{ + const struct btf_member *m = btf_members(t) + member_idx; + bool kflag = btf_kflag(t); + + return kflag ? BTF_MEMBER_BITFIELD_SIZE(m->offset) : 0; +} + +static inline struct btf_param *btf_params(const struct btf_type *t) +{ + return (struct btf_param *)(t + 1); +} + +static inline struct btf_var *btf_var(const struct btf_type *t) +{ + return (struct btf_var *)(t + 1); +} + +static inline struct btf_var_secinfo * +btf_var_secinfos(const struct btf_type *t) +{ + return (struct btf_var_secinfo *)(t + 1); +} + +struct btf_decl_tag; +static inline struct btf_decl_tag *btf_decl_tag(const struct btf_type *t) +{ + return (struct btf_decl_tag *)(t + 1); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_BTF_H */ diff --git a/examples/c/bpf/hashmap.h b/examples/c/bpf/hashmap.h new file mode 100644 index 0000000..0a5bf19 --- /dev/null +++ b/examples/c/bpf/hashmap.h @@ -0,0 +1,218 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Generic non-thread safe hash map implementation. + * + * Copyright (c) 2019 Facebook + */ +#ifndef __LIBBPF_HASHMAP_H +#define __LIBBPF_HASHMAP_H + +#include +#include +#include + +static inline size_t hash_bits(size_t h, int bits) +{ + /* shuffle bits and return requested number of upper bits */ + if (bits == 0) + return 0; + +#if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__) + /* LP64 case */ + return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits); +#elif (__SIZEOF_SIZE_T__ <= __SIZEOF_LONG__) + return (h * 2654435769lu) >> (__SIZEOF_LONG__ * 8 - bits); +#else +# error "Unsupported size_t size" +#endif +} + +/* generic C-string hashing function */ +static inline size_t str_hash(const char *s) +{ + size_t h = 0; + + while (*s) { + h = h * 31 + *s; + s++; + } + return h; +} + +typedef size_t (*hashmap_hash_fn)(long key, void *ctx); +typedef bool (*hashmap_equal_fn)(long key1, long key2, void *ctx); + +/* + * Hashmap interface is polymorphic, keys and values could be either + * long-sized integers or pointers, this is achieved as follows: + * - interface functions that operate on keys and values are hidden + * behind auxiliary macros, e.g. hashmap_insert <-> hashmap__insert; + * - these auxiliary macros cast the key and value parameters as + * long or long *, so the user does not have to specify the casts explicitly; + * - for pointer parameters (e.g. old_key) the size of the pointed + * type is verified by hashmap_cast_ptr using _Static_assert; + * - when iterating using hashmap__for_each_* forms + * hasmap_entry->key should be used for integer keys and + * hasmap_entry->pkey should be used for pointer keys, + * same goes for values. + */ +struct hashmap_entry { + union { + long key; + const void *pkey; + }; + union { + long value; + void *pvalue; + }; + struct hashmap_entry *next; +}; + +struct hashmap { + hashmap_hash_fn hash_fn; + hashmap_equal_fn equal_fn; + void *ctx; + + struct hashmap_entry **buckets; + size_t cap; + size_t cap_bits; + size_t sz; +}; + +#define HASHMAP_INIT(hash_fn, equal_fn, ctx) { \ + .hash_fn = (hash_fn), \ + .equal_fn = (equal_fn), \ + .ctx = (ctx), \ + .buckets = NULL, \ + .cap = 0, \ + .cap_bits = 0, \ + .sz = 0, \ +} + +void hashmap__init(struct hashmap *map, hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, void *ctx); +struct hashmap *hashmap__new(hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, + void *ctx); +void hashmap__clear(struct hashmap *map); +void hashmap__free(struct hashmap *map); + +size_t hashmap__size(const struct hashmap *map); +size_t hashmap__capacity(const struct hashmap *map); + +/* + * Hashmap insertion strategy: + * - HASHMAP_ADD - only add key/value if key doesn't exist yet; + * - HASHMAP_SET - add key/value pair if key doesn't exist yet; otherwise, + * update value; + * - HASHMAP_UPDATE - update value, if key already exists; otherwise, do + * nothing and return -ENOENT; + * - HASHMAP_APPEND - always add key/value pair, even if key already exists. + * This turns hashmap into a multimap by allowing multiple values to be + * associated with the same key. Most useful read API for such hashmap is + * hashmap__for_each_key_entry() iteration. If hashmap__find() is still + * used, it will return last inserted key/value entry (first in a bucket + * chain). + */ +enum hashmap_insert_strategy { + HASHMAP_ADD, + HASHMAP_SET, + HASHMAP_UPDATE, + HASHMAP_APPEND, +}; + +#define hashmap_cast_ptr(p) ({ \ + _Static_assert((__builtin_constant_p((p)) ? (p) == NULL : 0) || \ + sizeof(*(p)) == sizeof(long), \ + #p " pointee should be a long-sized integer or a pointer"); \ + (long *)(p); \ +}) + +/* + * hashmap__insert() adds key/value entry w/ various semantics, depending on + * provided strategy value. If a given key/value pair replaced already + * existing key/value pair, both old key and old value will be returned + * through old_key and old_value to allow calling code do proper memory + * management. + */ +int hashmap_insert(struct hashmap *map, long key, long value, + enum hashmap_insert_strategy strategy, + long *old_key, long *old_value); + +#define hashmap__insert(map, key, value, strategy, old_key, old_value) \ + hashmap_insert((map), (long)(key), (long)(value), (strategy), \ + hashmap_cast_ptr(old_key), \ + hashmap_cast_ptr(old_value)) + +#define hashmap__add(map, key, value) \ + hashmap__insert((map), (key), (value), HASHMAP_ADD, NULL, NULL) + +#define hashmap__set(map, key, value, old_key, old_value) \ + hashmap__insert((map), (key), (value), HASHMAP_SET, (old_key), (old_value)) + +#define hashmap__update(map, key, value, old_key, old_value) \ + hashmap__insert((map), (key), (value), HASHMAP_UPDATE, (old_key), (old_value)) + +#define hashmap__append(map, key, value) \ + hashmap__insert((map), (key), (value), HASHMAP_APPEND, NULL, NULL) + +bool hashmap_delete(struct hashmap *map, long key, long *old_key, long *old_value); + +#define hashmap__delete(map, key, old_key, old_value) \ + hashmap_delete((map), (long)(key), \ + hashmap_cast_ptr(old_key), \ + hashmap_cast_ptr(old_value)) + +bool hashmap_find(const struct hashmap *map, long key, long *value); + +#define hashmap__find(map, key, value) \ + hashmap_find((map), (long)(key), hashmap_cast_ptr(value)) + +/* + * hashmap__for_each_entry - iterate over all entries in hashmap + * @map: hashmap to iterate + * @cur: struct hashmap_entry * used as a loop cursor + * @bkt: integer used as a bucket loop cursor + */ +#define hashmap__for_each_entry(map, cur, bkt) \ + for (bkt = 0; bkt < map->cap; bkt++) \ + for (cur = map->buckets[bkt]; cur; cur = cur->next) + +/* + * hashmap__for_each_entry_safe - iterate over all entries in hashmap, safe + * against removals + * @map: hashmap to iterate + * @cur: struct hashmap_entry * used as a loop cursor + * @tmp: struct hashmap_entry * used as a temporary next cursor storage + * @bkt: integer used as a bucket loop cursor + */ +#define hashmap__for_each_entry_safe(map, cur, tmp, bkt) \ + for (bkt = 0; bkt < map->cap; bkt++) \ + for (cur = map->buckets[bkt]; \ + cur && ({tmp = cur->next; true; }); \ + cur = tmp) + +/* + * hashmap__for_each_key_entry - iterate over entries associated with given key + * @map: hashmap to iterate + * @cur: struct hashmap_entry * used as a loop cursor + * @key: key to iterate entries for + */ +#define hashmap__for_each_key_entry(map, cur, _key) \ + for (cur = map->buckets \ + ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \ + : NULL; \ + cur; \ + cur = cur->next) \ + if (map->equal_fn(cur->key, (_key), map->ctx)) + +#define hashmap__for_each_key_entry_safe(map, cur, tmp, _key) \ + for (cur = map->buckets \ + ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \ + : NULL; \ + cur && ({ tmp = cur->next; true; }); \ + cur = tmp) \ + if (map->equal_fn(cur->key, (_key), map->ctx)) + +#endif /* __LIBBPF_HASHMAP_H */ diff --git a/examples/c/bpf/libbpf.h b/examples/c/bpf/libbpf.h new file mode 100644 index 0000000..2efd80f --- /dev/null +++ b/examples/c/bpf/libbpf.h @@ -0,0 +1,1629 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Common eBPF ELF object loading operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + */ +#ifndef __LIBBPF_LIBBPF_H +#define __LIBBPF_LIBBPF_H + +#include +#include +#include +#include +#include // for size_t +#include + +#include "libbpf_common.h" +#include "libbpf_legacy.h" + +#ifdef __cplusplus +extern "C" { +#endif + +LIBBPF_API __u32 libbpf_major_version(void); +LIBBPF_API __u32 libbpf_minor_version(void); +LIBBPF_API const char *libbpf_version_string(void); + +enum libbpf_errno { + __LIBBPF_ERRNO__START = 4000, + + /* Something wrong in libelf */ + LIBBPF_ERRNO__LIBELF = __LIBBPF_ERRNO__START, + LIBBPF_ERRNO__FORMAT, /* BPF object format invalid */ + LIBBPF_ERRNO__KVERSION, /* Incorrect or no 'version' section */ + LIBBPF_ERRNO__ENDIAN, /* Endian mismatch */ + LIBBPF_ERRNO__INTERNAL, /* Internal error in libbpf */ + LIBBPF_ERRNO__RELOC, /* Relocation failed */ + LIBBPF_ERRNO__LOAD, /* Load program failure for unknown reason */ + LIBBPF_ERRNO__VERIFY, /* Kernel verifier blocks program loading */ + LIBBPF_ERRNO__PROG2BIG, /* Program too big */ + LIBBPF_ERRNO__KVER, /* Incorrect kernel version */ + LIBBPF_ERRNO__PROGTYPE, /* Kernel doesn't support this program type */ + LIBBPF_ERRNO__WRNGPID, /* Wrong pid in netlink message */ + LIBBPF_ERRNO__INVSEQ, /* Invalid netlink sequence */ + LIBBPF_ERRNO__NLPARSE, /* netlink parsing error */ + __LIBBPF_ERRNO__END, +}; + +LIBBPF_API int libbpf_strerror(int err, char *buf, size_t size); + +/** + * @brief **libbpf_bpf_attach_type_str()** converts the provided attach type + * value into a textual representation. + * @param t The attach type. + * @return Pointer to a static string identifying the attach type. NULL is + * returned for unknown **bpf_attach_type** values. + */ +LIBBPF_API const char *libbpf_bpf_attach_type_str(enum bpf_attach_type t); + +/** + * @brief **libbpf_bpf_link_type_str()** converts the provided link type value + * into a textual representation. + * @param t The link type. + * @return Pointer to a static string identifying the link type. NULL is + * returned for unknown **bpf_link_type** values. + */ +LIBBPF_API const char *libbpf_bpf_link_type_str(enum bpf_link_type t); + +/** + * @brief **libbpf_bpf_map_type_str()** converts the provided map type value + * into a textual representation. + * @param t The map type. + * @return Pointer to a static string identifying the map type. NULL is + * returned for unknown **bpf_map_type** values. + */ +LIBBPF_API const char *libbpf_bpf_map_type_str(enum bpf_map_type t); + +/** + * @brief **libbpf_bpf_prog_type_str()** converts the provided program type + * value into a textual representation. + * @param t The program type. + * @return Pointer to a static string identifying the program type. NULL is + * returned for unknown **bpf_prog_type** values. + */ +LIBBPF_API const char *libbpf_bpf_prog_type_str(enum bpf_prog_type t); + +enum libbpf_print_level { + LIBBPF_WARN, + LIBBPF_INFO, + LIBBPF_DEBUG, +}; + +typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level, + const char *, va_list ap); + +/** + * @brief **libbpf_set_print()** sets user-provided log callback function to + * be used for libbpf warnings and informational messages. + * @param fn The log print function. If NULL, libbpf won't print anything. + * @return Pointer to old print function. + */ +LIBBPF_API libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn); + +/* Hide internal to user */ +struct bpf_object; + +struct bpf_object_open_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* object name override, if provided: + * - for object open from file, this will override setting object + * name from file path's base name; + * - for object open from memory buffer, this will specify an object + * name and will override default "-" name; + */ + const char *object_name; + /* parse map definitions non-strictly, allowing extra attributes/data */ + bool relaxed_maps; + /* maps that set the 'pinning' attribute in their definition will have + * their pin_path attribute set to a file in this directory, and be + * auto-pinned to that path on load; defaults to "/sys/fs/bpf". + */ + const char *pin_root_path; + + __u32 :32; /* stub out now removed attach_prog_fd */ + + /* Additional kernel config content that augments and overrides + * system Kconfig for CONFIG_xxx externs. + */ + const char *kconfig; + /* Path to the custom BTF to be used for BPF CO-RE relocations. + * This custom BTF completely replaces the use of vmlinux BTF + * for the purpose of CO-RE relocations. + * NOTE: any other BPF feature (e.g., fentry/fexit programs, + * struct_ops, etc) will need actual kernel BTF at /sys/kernel/btf/vmlinux. + */ + const char *btf_custom_path; + /* Pointer to a buffer for storing kernel logs for applicable BPF + * commands. Valid kernel_log_size has to be specified as well and are + * passed-through to bpf() syscall. Keep in mind that kernel might + * fail operation with -ENOSPC error if provided buffer is too small + * to contain entire log output. + * See the comment below for kernel_log_level for interaction between + * log_buf and log_level settings. + * + * If specified, this log buffer will be passed for: + * - each BPF progral load (BPF_PROG_LOAD) attempt, unless overriden + * with bpf_program__set_log() on per-program level, to get + * BPF verifier log output. + * - during BPF object's BTF load into kernel (BPF_BTF_LOAD) to get + * BTF sanity checking log. + * + * Each BPF command (BPF_BTF_LOAD or BPF_PROG_LOAD) will overwrite + * previous contents, so if you need more fine-grained control, set + * per-program buffer with bpf_program__set_log_buf() to preserve each + * individual program's verification log. Keep using kernel_log_buf + * for BTF verification log, if necessary. + */ + char *kernel_log_buf; + size_t kernel_log_size; + /* + * Log level can be set independently from log buffer. Log_level=0 + * means that libbpf will attempt loading BTF or program without any + * logging requested, but will retry with either its own or custom log + * buffer, if provided, and log_level=1 on any error. + * And vice versa, setting log_level>0 will request BTF or prog + * loading with verbose log from the first attempt (and as such also + * for successfully loaded BTF or program), and the actual log buffer + * could be either libbpf's own auto-allocated log buffer, if + * kernel_log_buffer is NULL, or user-provided custom kernel_log_buf. + * If user didn't provide custom log buffer, libbpf will emit captured + * logs through its print callback. + */ + __u32 kernel_log_level; + + size_t :0; +}; +#define bpf_object_open_opts__last_field kernel_log_level + +/** + * @brief **bpf_object__open()** creates a bpf_object by opening + * the BPF ELF object file pointed to by the passed path and loading it + * into memory. + * @param path BPF object file path. + * @return pointer to the new bpf_object; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_object *bpf_object__open(const char *path); + +/** + * @brief **bpf_object__open_file()** creates a bpf_object by opening + * the BPF ELF object file pointed to by the passed path and loading it + * into memory. + * @param path BPF object file path + * @param opts options for how to load the bpf object, this parameter is + * optional and can be set to NULL + * @return pointer to the new bpf_object; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_object * +bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts); + +/** + * @brief **bpf_object__open_mem()** creates a bpf_object by reading + * the BPF objects raw bytes from a memory buffer containing a valid + * BPF ELF object file. + * @param obj_buf pointer to the buffer containing ELF file bytes + * @param obj_buf_sz number of bytes in the buffer + * @param opts options for how to load the bpf object + * @return pointer to the new bpf_object; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_object * +bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, + const struct bpf_object_open_opts *opts); + +/** + * @brief **bpf_object__load()** loads BPF object into kernel. + * @param obj Pointer to a valid BPF object instance returned by + * **bpf_object__open*()** APIs + * @return 0, on success; negative error code, otherwise, error code is + * stored in errno + */ +LIBBPF_API int bpf_object__load(struct bpf_object *obj); + +/** + * @brief **bpf_object__close()** closes a BPF object and releases all + * resources. + * @param obj Pointer to a valid BPF object + */ +LIBBPF_API void bpf_object__close(struct bpf_object *obj); + +/** + * @brief **bpf_object__pin_maps()** pins each map contained within + * the BPF object at the passed directory. + * @param obj Pointer to a valid BPF object + * @param path A directory where maps should be pinned. + * @return 0, on success; negative error code, otherwise + * + * If `path` is NULL `bpf_map__pin` (which is being used on each map) + * will use the pin_path attribute of each map. In this case, maps that + * don't have a pin_path set will be ignored. + */ +LIBBPF_API int bpf_object__pin_maps(struct bpf_object *obj, const char *path); + +/** + * @brief **bpf_object__unpin_maps()** unpins each map contained within + * the BPF object found in the passed directory. + * @param obj Pointer to a valid BPF object + * @param path A directory where pinned maps should be searched for. + * @return 0, on success; negative error code, otherwise + * + * If `path` is NULL `bpf_map__unpin` (which is being used on each map) + * will use the pin_path attribute of each map. In this case, maps that + * don't have a pin_path set will be ignored. + */ +LIBBPF_API int bpf_object__unpin_maps(struct bpf_object *obj, + const char *path); +LIBBPF_API int bpf_object__pin_programs(struct bpf_object *obj, + const char *path); +LIBBPF_API int bpf_object__unpin_programs(struct bpf_object *obj, + const char *path); +LIBBPF_API int bpf_object__pin(struct bpf_object *object, const char *path); + +LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj); +LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj); +LIBBPF_API int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version); + +struct btf; +LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj); +LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj); + +LIBBPF_API struct bpf_program * +bpf_object__find_program_by_name(const struct bpf_object *obj, + const char *name); + +LIBBPF_API int +libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, + enum bpf_attach_type *expected_attach_type); +LIBBPF_API int libbpf_attach_type_by_name(const char *name, + enum bpf_attach_type *attach_type); +LIBBPF_API int libbpf_find_vmlinux_btf_id(const char *name, + enum bpf_attach_type attach_type); + +/* Accessors of bpf_program */ +struct bpf_program; + +LIBBPF_API struct bpf_program * +bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prog); + +#define bpf_object__for_each_program(pos, obj) \ + for ((pos) = bpf_object__next_program((obj), NULL); \ + (pos) != NULL; \ + (pos) = bpf_object__next_program((obj), (pos))) + +LIBBPF_API struct bpf_program * +bpf_object__prev_program(const struct bpf_object *obj, struct bpf_program *prog); + +LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog, + __u32 ifindex); + +LIBBPF_API const char *bpf_program__name(const struct bpf_program *prog); +LIBBPF_API const char *bpf_program__section_name(const struct bpf_program *prog); +LIBBPF_API bool bpf_program__autoload(const struct bpf_program *prog); +LIBBPF_API int bpf_program__set_autoload(struct bpf_program *prog, bool autoload); +LIBBPF_API bool bpf_program__autoattach(const struct bpf_program *prog); +LIBBPF_API void bpf_program__set_autoattach(struct bpf_program *prog, bool autoattach); + +struct bpf_insn; + +/** + * @brief **bpf_program__insns()** gives read-only access to BPF program's + * underlying BPF instructions. + * @param prog BPF program for which to return instructions + * @return a pointer to an array of BPF instructions that belong to the + * specified BPF program + * + * Returned pointer is always valid and not NULL. Number of `struct bpf_insn` + * pointed to can be fetched using **bpf_program__insn_cnt()** API. + * + * Keep in mind, libbpf can modify and append/delete BPF program's + * instructions as it processes BPF object file and prepares everything for + * uploading into the kernel. So depending on the point in BPF object + * lifetime, **bpf_program__insns()** can return different sets of + * instructions. As an example, during BPF object load phase BPF program + * instructions will be CO-RE-relocated, BPF subprograms instructions will be + * appended, ldimm64 instructions will have FDs embedded, etc. So instructions + * returned before **bpf_object__load()** and after it might be quite + * different. + */ +LIBBPF_API const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog); + +/** + * @brief **bpf_program__set_insns()** can set BPF program's underlying + * BPF instructions. + * + * WARNING: This is a very advanced libbpf API and users need to know + * what they are doing. This should be used from prog_prepare_load_fn + * callback only. + * + * @param prog BPF program for which to return instructions + * @param new_insns a pointer to an array of BPF instructions + * @param new_insn_cnt number of `struct bpf_insn`'s that form + * specified BPF program + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_program__set_insns(struct bpf_program *prog, + struct bpf_insn *new_insns, size_t new_insn_cnt); + +/** + * @brief **bpf_program__insn_cnt()** returns number of `struct bpf_insn`'s + * that form specified BPF program. + * @param prog BPF program for which to return number of BPF instructions + * + * See **bpf_program__insns()** documentation for notes on how libbpf can + * change instructions and their count during different phases of + * **bpf_object** lifetime. + */ +LIBBPF_API size_t bpf_program__insn_cnt(const struct bpf_program *prog); + +LIBBPF_API int bpf_program__fd(const struct bpf_program *prog); + +/** + * @brief **bpf_program__pin()** pins the BPF program to a file + * in the BPF FS specified by a path. This increments the programs + * reference count, allowing it to stay loaded after the process + * which loaded it has exited. + * + * @param prog BPF program to pin, must already be loaded + * @param path file path in a BPF file system + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_program__pin(struct bpf_program *prog, const char *path); + +/** + * @brief **bpf_program__unpin()** unpins the BPF program from a file + * in the BPFFS specified by a path. This decrements the programs + * reference count. + * + * The file pinning the BPF program can also be unlinked by a different + * process in which case this function will return an error. + * + * @param prog BPF program to unpin + * @param path file path to the pin in a BPF file system + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_program__unpin(struct bpf_program *prog, const char *path); +LIBBPF_API void bpf_program__unload(struct bpf_program *prog); + +struct bpf_link; + +LIBBPF_API struct bpf_link *bpf_link__open(const char *path); +LIBBPF_API int bpf_link__fd(const struct bpf_link *link); +LIBBPF_API const char *bpf_link__pin_path(const struct bpf_link *link); +/** + * @brief **bpf_link__pin()** pins the BPF link to a file + * in the BPF FS specified by a path. This increments the links + * reference count, allowing it to stay loaded after the process + * which loaded it has exited. + * + * @param link BPF link to pin, must already be loaded + * @param path file path in a BPF file system + * @return 0, on success; negative error code, otherwise + */ + +LIBBPF_API int bpf_link__pin(struct bpf_link *link, const char *path); + +/** + * @brief **bpf_link__unpin()** unpins the BPF link from a file + * in the BPFFS specified by a path. This decrements the links + * reference count. + * + * The file pinning the BPF link can also be unlinked by a different + * process in which case this function will return an error. + * + * @param prog BPF program to unpin + * @param path file path to the pin in a BPF file system + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_link__unpin(struct bpf_link *link); +LIBBPF_API int bpf_link__update_program(struct bpf_link *link, + struct bpf_program *prog); +LIBBPF_API void bpf_link__disconnect(struct bpf_link *link); +LIBBPF_API int bpf_link__detach(struct bpf_link *link); +LIBBPF_API int bpf_link__destroy(struct bpf_link *link); + +/** + * @brief **bpf_program__attach()** is a generic function for attaching + * a BPF program based on auto-detection of program type, attach type, + * and extra paremeters, where applicable. + * + * @param prog BPF program to attach + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + * + * This is supported for: + * - kprobe/kretprobe (depends on SEC() definition) + * - uprobe/uretprobe (depends on SEC() definition) + * - tracepoint + * - raw tracepoint + * - tracing programs (typed raw TP/fentry/fexit/fmod_ret) + */ +LIBBPF_API struct bpf_link * +bpf_program__attach(const struct bpf_program *prog); + +struct bpf_perf_event_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; +}; +#define bpf_perf_event_opts__last_field bpf_cookie + +LIBBPF_API struct bpf_link * +bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd); + +LIBBPF_API struct bpf_link * +bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd, + const struct bpf_perf_event_opts *opts); + +struct bpf_kprobe_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* function's offset to install kprobe to */ + size_t offset; + /* kprobe is return probe */ + bool retprobe; + size_t :0; +}; +#define bpf_kprobe_opts__last_field retprobe + +LIBBPF_API struct bpf_link * +bpf_program__attach_kprobe(const struct bpf_program *prog, bool retprobe, + const char *func_name); +LIBBPF_API struct bpf_link * +bpf_program__attach_kprobe_opts(const struct bpf_program *prog, + const char *func_name, + const struct bpf_kprobe_opts *opts); + +struct bpf_kprobe_multi_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* array of function symbols to attach */ + const char **syms; + /* array of function addresses to attach */ + const unsigned long *addrs; + /* array of user-provided values fetchable through bpf_get_attach_cookie */ + const __u64 *cookies; + /* number of elements in syms/addrs/cookies arrays */ + size_t cnt; + /* create return kprobes */ + bool retprobe; + size_t :0; +}; + +#define bpf_kprobe_multi_opts__last_field retprobe + +LIBBPF_API struct bpf_link * +bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, + const char *pattern, + const struct bpf_kprobe_multi_opts *opts); + +struct bpf_ksyscall_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* attach as return probe? */ + bool retprobe; + size_t :0; +}; +#define bpf_ksyscall_opts__last_field retprobe + +/** + * @brief **bpf_program__attach_ksyscall()** attaches a BPF program + * to kernel syscall handler of a specified syscall. Optionally it's possible + * to request to install retprobe that will be triggered at syscall exit. It's + * also possible to associate BPF cookie (though options). + * + * Libbpf automatically will determine correct full kernel function name, + * which depending on system architecture and kernel version/configuration + * could be of the form ___sys_ or __se_sys_, and will + * attach specified program using kprobe/kretprobe mechanism. + * + * **bpf_program__attach_ksyscall()** is an API counterpart of declarative + * **SEC("ksyscall/")** annotation of BPF programs. + * + * At the moment **SEC("ksyscall")** and **bpf_program__attach_ksyscall()** do + * not handle all the calling convention quirks for mmap(), clone() and compat + * syscalls. It also only attaches to "native" syscall interfaces. If host + * system supports compat syscalls or defines 32-bit syscalls in 64-bit + * kernel, such syscall interfaces won't be attached to by libbpf. + * + * These limitations may or may not change in the future. Therefore it is + * recommended to use SEC("kprobe") for these syscalls or if working with + * compat and 32-bit interfaces is required. + * + * @param prog BPF program to attach + * @param syscall_name Symbolic name of the syscall (e.g., "bpf") + * @param opts Additional options (see **struct bpf_ksyscall_opts**) + * @return Reference to the newly created BPF link; or NULL is returned on + * error, error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_ksyscall(const struct bpf_program *prog, + const char *syscall_name, + const struct bpf_ksyscall_opts *opts); + +struct bpf_uprobe_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* offset of kernel reference counted USDT semaphore, added in + * a6ca88b241d5 ("trace_uprobe: support reference counter in fd-based uprobe") + */ + size_t ref_ctr_offset; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* uprobe is return probe, invoked at function return time */ + bool retprobe; + /* Function name to attach to. Could be an unqualified ("abc") or library-qualified + * "abc@LIBXYZ" name. To specify function entry, func_name should be set while + * func_offset argument to bpf_prog__attach_uprobe_opts() should be 0. To trace an + * offset within a function, specify func_name and use func_offset argument to specify + * offset within the function. Shared library functions must specify the shared library + * binary_path. + */ + const char *func_name; + size_t :0; +}; +#define bpf_uprobe_opts__last_field func_name + +/** + * @brief **bpf_program__attach_uprobe()** attaches a BPF program + * to the userspace function which is found by binary path and + * offset. You can optionally specify a particular proccess to attach + * to. You can also optionally attach the program to the function + * exit instead of entry. + * + * @param prog BPF program to attach + * @param retprobe Attach to function exit + * @param pid Process ID to attach the uprobe to, 0 for self (own process), + * -1 for all processes + * @param binary_path Path to binary that contains the function symbol + * @param func_offset Offset within the binary of the function symbol + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_uprobe(const struct bpf_program *prog, bool retprobe, + pid_t pid, const char *binary_path, + size_t func_offset); + +/** + * @brief **bpf_program__attach_uprobe_opts()** is just like + * bpf_program__attach_uprobe() except with a options struct + * for various configurations. + * + * @param prog BPF program to attach + * @param pid Process ID to attach the uprobe to, 0 for self (own process), + * -1 for all processes + * @param binary_path Path to binary that contains the function symbol + * @param func_offset Offset within the binary of the function symbol + * @param opts Options for altering program attachment + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, + const char *binary_path, size_t func_offset, + const struct bpf_uprobe_opts *opts); + +struct bpf_usdt_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value accessible through usdt_cookie() */ + __u64 usdt_cookie; + size_t :0; +}; +#define bpf_usdt_opts__last_field usdt_cookie + +/** + * @brief **bpf_program__attach_usdt()** is just like + * bpf_program__attach_uprobe_opts() except it covers USDT (User-space + * Statically Defined Tracepoint) attachment, instead of attaching to + * user-space function entry or exit. + * + * @param prog BPF program to attach + * @param pid Process ID to attach the uprobe to, 0 for self (own process), + * -1 for all processes + * @param binary_path Path to binary that contains provided USDT probe + * @param usdt_provider USDT provider name + * @param usdt_name USDT probe name + * @param opts Options for altering program attachment + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_usdt(const struct bpf_program *prog, + pid_t pid, const char *binary_path, + const char *usdt_provider, const char *usdt_name, + const struct bpf_usdt_opts *opts); + +struct bpf_tracepoint_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; +}; +#define bpf_tracepoint_opts__last_field bpf_cookie + +LIBBPF_API struct bpf_link * +bpf_program__attach_tracepoint(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name); +LIBBPF_API struct bpf_link * +bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name, + const struct bpf_tracepoint_opts *opts); + +LIBBPF_API struct bpf_link * +bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, + const char *tp_name); + +struct bpf_trace_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 cookie; +}; +#define bpf_trace_opts__last_field cookie + +LIBBPF_API struct bpf_link * +bpf_program__attach_trace(const struct bpf_program *prog); +LIBBPF_API struct bpf_link * +bpf_program__attach_trace_opts(const struct bpf_program *prog, const struct bpf_trace_opts *opts); + +LIBBPF_API struct bpf_link * +bpf_program__attach_lsm(const struct bpf_program *prog); +LIBBPF_API struct bpf_link * +bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd); +LIBBPF_API struct bpf_link * +bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd); +LIBBPF_API struct bpf_link * +bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex); +LIBBPF_API struct bpf_link * +bpf_program__attach_freplace(const struct bpf_program *prog, + int target_fd, const char *attach_func_name); + +struct bpf_map; + +LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map); + +struct bpf_iter_attach_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + union bpf_iter_link_info *link_info; + __u32 link_info_len; +}; +#define bpf_iter_attach_opts__last_field link_info_len + +LIBBPF_API struct bpf_link * +bpf_program__attach_iter(const struct bpf_program *prog, + const struct bpf_iter_attach_opts *opts); + +LIBBPF_API enum bpf_prog_type bpf_program__type(const struct bpf_program *prog); + +/** + * @brief **bpf_program__set_type()** sets the program + * type of the passed BPF program. + * @param prog BPF program to set the program type for + * @param type program type to set the BPF map to have + * @return error code; or 0 if no error. An error occurs + * if the object is already loaded. + * + * This must be called before the BPF object is loaded, + * otherwise it has no effect and an error is returned. + */ +LIBBPF_API int bpf_program__set_type(struct bpf_program *prog, + enum bpf_prog_type type); + +LIBBPF_API enum bpf_attach_type +bpf_program__expected_attach_type(const struct bpf_program *prog); + +/** + * @brief **bpf_program__set_expected_attach_type()** sets the + * attach type of the passed BPF program. This is used for + * auto-detection of attachment when programs are loaded. + * @param prog BPF program to set the attach type for + * @param type attach type to set the BPF map to have + * @return error code; or 0 if no error. An error occurs + * if the object is already loaded. + * + * This must be called before the BPF object is loaded, + * otherwise it has no effect and an error is returned. + */ +LIBBPF_API int +bpf_program__set_expected_attach_type(struct bpf_program *prog, + enum bpf_attach_type type); + +LIBBPF_API __u32 bpf_program__flags(const struct bpf_program *prog); +LIBBPF_API int bpf_program__set_flags(struct bpf_program *prog, __u32 flags); + +/* Per-program log level and log buffer getters/setters. + * See bpf_object_open_opts comments regarding log_level and log_buf + * interactions. + */ +LIBBPF_API __u32 bpf_program__log_level(const struct bpf_program *prog); +LIBBPF_API int bpf_program__set_log_level(struct bpf_program *prog, __u32 log_level); +LIBBPF_API const char *bpf_program__log_buf(const struct bpf_program *prog, size_t *log_size); +LIBBPF_API int bpf_program__set_log_buf(struct bpf_program *prog, char *log_buf, size_t log_size); + +/** + * @brief **bpf_program__set_attach_target()** sets BTF-based attach target + * for supported BPF program types: + * - BTF-aware raw tracepoints (tp_btf); + * - fentry/fexit/fmod_ret; + * - lsm; + * - freplace. + * @param prog BPF program to set the attach type for + * @param type attach type to set the BPF map to have + * @return error code; or 0 if no error occurred. + */ +LIBBPF_API int +bpf_program__set_attach_target(struct bpf_program *prog, int attach_prog_fd, + const char *attach_func_name); + +/** + * @brief **bpf_object__find_map_by_name()** returns BPF map of + * the given name, if it exists within the passed BPF object + * @param obj BPF object + * @param name name of the BPF map + * @return BPF map instance, if such map exists within the BPF object; + * or NULL otherwise. + */ +LIBBPF_API struct bpf_map * +bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name); + +LIBBPF_API int +bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name); + +LIBBPF_API struct bpf_map * +bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *map); + +#define bpf_object__for_each_map(pos, obj) \ + for ((pos) = bpf_object__next_map((obj), NULL); \ + (pos) != NULL; \ + (pos) = bpf_object__next_map((obj), (pos))) +#define bpf_map__for_each bpf_object__for_each_map + +LIBBPF_API struct bpf_map * +bpf_object__prev_map(const struct bpf_object *obj, const struct bpf_map *map); + +/** + * @brief **bpf_map__set_autocreate()** sets whether libbpf has to auto-create + * BPF map during BPF object load phase. + * @param map the BPF map instance + * @param autocreate whether to create BPF map during BPF object load + * @return 0 on success; -EBUSY if BPF object was already loaded + * + * **bpf_map__set_autocreate()** allows to opt-out from libbpf auto-creating + * BPF map. By default, libbpf will attempt to create every single BPF map + * defined in BPF object file using BPF_MAP_CREATE command of bpf() syscall + * and fill in map FD in BPF instructions. + * + * This API allows to opt-out of this process for specific map instance. This + * can be useful if host kernel doesn't support such BPF map type or used + * combination of flags and user application wants to avoid creating such + * a map in the first place. User is still responsible to make sure that their + * BPF-side code that expects to use such missing BPF map is recognized by BPF + * verifier as dead code, otherwise BPF verifier will reject such BPF program. + */ +LIBBPF_API int bpf_map__set_autocreate(struct bpf_map *map, bool autocreate); +LIBBPF_API bool bpf_map__autocreate(const struct bpf_map *map); + +/** + * @brief **bpf_map__fd()** gets the file descriptor of the passed + * BPF map + * @param map the BPF map instance + * @return the file descriptor; or -EINVAL in case of an error + */ +LIBBPF_API int bpf_map__fd(const struct bpf_map *map); +LIBBPF_API int bpf_map__reuse_fd(struct bpf_map *map, int fd); +/* get map name */ +LIBBPF_API const char *bpf_map__name(const struct bpf_map *map); +/* get/set map type */ +LIBBPF_API enum bpf_map_type bpf_map__type(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type); +/* get/set map size (max_entries) */ +LIBBPF_API __u32 bpf_map__max_entries(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries); +/* get/set map flags */ +LIBBPF_API __u32 bpf_map__map_flags(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags); +/* get/set map NUMA node */ +LIBBPF_API __u32 bpf_map__numa_node(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node); +/* get/set map key size */ +LIBBPF_API __u32 bpf_map__key_size(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_key_size(struct bpf_map *map, __u32 size); +/* get/set map value size */ +LIBBPF_API __u32 bpf_map__value_size(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_value_size(struct bpf_map *map, __u32 size); +/* get map key/value BTF type IDs */ +LIBBPF_API __u32 bpf_map__btf_key_type_id(const struct bpf_map *map); +LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map); +/* get/set map if_index */ +LIBBPF_API __u32 bpf_map__ifindex(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex); +/* get/set map map_extra flags */ +LIBBPF_API __u64 bpf_map__map_extra(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_map_extra(struct bpf_map *map, __u64 map_extra); + +LIBBPF_API int bpf_map__set_initial_value(struct bpf_map *map, + const void *data, size_t size); +LIBBPF_API const void *bpf_map__initial_value(struct bpf_map *map, size_t *psize); + +/** + * @brief **bpf_map__is_internal()** tells the caller whether or not the + * passed map is a special map created by libbpf automatically for things like + * global variables, __ksym externs, Kconfig values, etc + * @param map the bpf_map + * @return true, if the map is an internal map; false, otherwise + */ +LIBBPF_API bool bpf_map__is_internal(const struct bpf_map *map); + +/** + * @brief **bpf_map__set_pin_path()** sets the path attribute that tells where the + * BPF map should be pinned. This does not actually create the 'pin'. + * @param map The bpf_map + * @param path The path + * @return 0, on success; negative error, otherwise + */ +LIBBPF_API int bpf_map__set_pin_path(struct bpf_map *map, const char *path); + +/** + * @brief **bpf_map__pin_path()** gets the path attribute that tells where the + * BPF map should be pinned. + * @param map The bpf_map + * @return The path string; which can be NULL + */ +LIBBPF_API const char *bpf_map__pin_path(const struct bpf_map *map); + +/** + * @brief **bpf_map__is_pinned()** tells the caller whether or not the + * passed map has been pinned via a 'pin' file. + * @param map The bpf_map + * @return true, if the map is pinned; false, otherwise + */ +LIBBPF_API bool bpf_map__is_pinned(const struct bpf_map *map); + +/** + * @brief **bpf_map__pin()** creates a file that serves as a 'pin' + * for the BPF map. This increments the reference count on the + * BPF map which will keep the BPF map loaded even after the + * userspace process which loaded it has exited. + * @param map The bpf_map to pin + * @param path A file path for the 'pin' + * @return 0, on success; negative error, otherwise + * + * If `path` is NULL the maps `pin_path` attribute will be used. If this is + * also NULL, an error will be returned and the map will not be pinned. + */ +LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path); + +/** + * @brief **bpf_map__unpin()** removes the file that serves as a + * 'pin' for the BPF map. + * @param map The bpf_map to unpin + * @param path A file path for the 'pin' + * @return 0, on success; negative error, otherwise + * + * The `path` parameter can be NULL, in which case the `pin_path` + * map attribute is unpinned. If both the `path` parameter and + * `pin_path` map attribute are set, they must be equal. + */ +LIBBPF_API int bpf_map__unpin(struct bpf_map *map, const char *path); + +LIBBPF_API int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd); +LIBBPF_API struct bpf_map *bpf_map__inner_map(struct bpf_map *map); + +/** + * @brief **bpf_map__lookup_elem()** allows to lookup BPF map value + * corresponding to provided key. + * @param map BPF map to lookup element in + * @param key pointer to memory containing bytes of the key used for lookup + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @param value pointer to memory in which looked up value will be stored + * @param value_sz size in byte of value data memory; it has to match BPF map + * definition's **value_size**. For per-CPU BPF maps value size has to be + * a product of BPF map value size and number of possible CPUs in the system + * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for + * per-CPU values value size has to be aligned up to closest 8 bytes for + * alignment reasons, so expected size is: `round_up(value_size, 8) + * * libbpf_num_possible_cpus()`. + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__lookup_elem()** is high-level equivalent of + * **bpf_map_lookup_elem()** API with added check for key and value size. + */ +LIBBPF_API int bpf_map__lookup_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags); + +/** + * @brief **bpf_map__update_elem()** allows to insert or update value in BPF + * map that corresponds to provided key. + * @param map BPF map to insert to or update element in + * @param key pointer to memory containing bytes of the key + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @param value pointer to memory containing bytes of the value + * @param value_sz size in byte of value data memory; it has to match BPF map + * definition's **value_size**. For per-CPU BPF maps value size has to be + * a product of BPF map value size and number of possible CPUs in the system + * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for + * per-CPU values value size has to be aligned up to closest 8 bytes for + * alignment reasons, so expected size is: `round_up(value_size, 8) + * * libbpf_num_possible_cpus()`. + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__update_elem()** is high-level equivalent of + * **bpf_map_update_elem()** API with added check for key and value size. + */ +LIBBPF_API int bpf_map__update_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + const void *value, size_t value_sz, __u64 flags); + +/** + * @brief **bpf_map__delete_elem()** allows to delete element in BPF map that + * corresponds to provided key. + * @param map BPF map to delete element from + * @param key pointer to memory containing bytes of the key + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__delete_elem()** is high-level equivalent of + * **bpf_map_delete_elem()** API with added check for key size. + */ +LIBBPF_API int bpf_map__delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, __u64 flags); + +/** + * @brief **bpf_map__lookup_and_delete_elem()** allows to lookup BPF map value + * corresponding to provided key and atomically delete it afterwards. + * @param map BPF map to lookup element in + * @param key pointer to memory containing bytes of the key used for lookup + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @param value pointer to memory in which looked up value will be stored + * @param value_sz size in byte of value data memory; it has to match BPF map + * definition's **value_size**. For per-CPU BPF maps value size has to be + * a product of BPF map value size and number of possible CPUs in the system + * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for + * per-CPU values value size has to be aligned up to closest 8 bytes for + * alignment reasons, so expected size is: `round_up(value_size, 8) + * * libbpf_num_possible_cpus()`. + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__lookup_and_delete_elem()** is high-level equivalent of + * **bpf_map_lookup_and_delete_elem()** API with added check for key and value size. + */ +LIBBPF_API int bpf_map__lookup_and_delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags); + +/** + * @brief **bpf_map__get_next_key()** allows to iterate BPF map keys by + * fetching next key that follows current key. + * @param map BPF map to fetch next key from + * @param cur_key pointer to memory containing bytes of current key or NULL to + * fetch the first key + * @param next_key pointer to memory to write next key into + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @return 0, on success; -ENOENT if **cur_key** is the last key in BPF map; + * negative error, otherwise + * + * **bpf_map__get_next_key()** is high-level equivalent of + * **bpf_map_get_next_key()** API with added check for key size. + */ +LIBBPF_API int bpf_map__get_next_key(const struct bpf_map *map, + const void *cur_key, void *next_key, size_t key_sz); + +struct bpf_xdp_set_link_opts { + size_t sz; + int old_fd; + size_t :0; +}; +#define bpf_xdp_set_link_opts__last_field old_fd + +struct bpf_xdp_attach_opts { + size_t sz; + int old_prog_fd; + size_t :0; +}; +#define bpf_xdp_attach_opts__last_field old_prog_fd + +struct bpf_xdp_query_opts { + size_t sz; + __u32 prog_id; /* output */ + __u32 drv_prog_id; /* output */ + __u32 hw_prog_id; /* output */ + __u32 skb_prog_id; /* output */ + __u8 attach_mode; /* output */ + __u64 feature_flags; /* output */ + size_t :0; +}; +#define bpf_xdp_query_opts__last_field feature_flags + +LIBBPF_API int bpf_xdp_attach(int ifindex, int prog_fd, __u32 flags, + const struct bpf_xdp_attach_opts *opts); +LIBBPF_API int bpf_xdp_detach(int ifindex, __u32 flags, + const struct bpf_xdp_attach_opts *opts); +LIBBPF_API int bpf_xdp_query(int ifindex, int flags, struct bpf_xdp_query_opts *opts); +LIBBPF_API int bpf_xdp_query_id(int ifindex, int flags, __u32 *prog_id); + +/* TC related API */ +enum bpf_tc_attach_point { + BPF_TC_INGRESS = 1 << 0, + BPF_TC_EGRESS = 1 << 1, + BPF_TC_CUSTOM = 1 << 2, +}; + +#define BPF_TC_PARENT(a, b) \ + ((((a) << 16) & 0xFFFF0000U) | ((b) & 0x0000FFFFU)) + +enum bpf_tc_flags { + BPF_TC_F_REPLACE = 1 << 0, +}; + +struct bpf_tc_hook { + size_t sz; + int ifindex; + enum bpf_tc_attach_point attach_point; + __u32 parent; + size_t :0; +}; +#define bpf_tc_hook__last_field parent + +struct bpf_tc_opts { + size_t sz; + int prog_fd; + __u32 flags; + __u32 prog_id; + __u32 handle; + __u32 priority; + size_t :0; +}; +#define bpf_tc_opts__last_field priority + +LIBBPF_API int bpf_tc_hook_create(struct bpf_tc_hook *hook); +LIBBPF_API int bpf_tc_hook_destroy(struct bpf_tc_hook *hook); +LIBBPF_API int bpf_tc_attach(const struct bpf_tc_hook *hook, + struct bpf_tc_opts *opts); +LIBBPF_API int bpf_tc_detach(const struct bpf_tc_hook *hook, + const struct bpf_tc_opts *opts); +LIBBPF_API int bpf_tc_query(const struct bpf_tc_hook *hook, + struct bpf_tc_opts *opts); + +/* Ring buffer APIs */ +struct ring_buffer; +struct user_ring_buffer; + +typedef int (*ring_buffer_sample_fn)(void *ctx, void *data, size_t size); + +struct ring_buffer_opts { + size_t sz; /* size of this struct, for forward/backward compatiblity */ +}; + +#define ring_buffer_opts__last_field sz + +LIBBPF_API struct ring_buffer * +ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx, + const struct ring_buffer_opts *opts); +LIBBPF_API void ring_buffer__free(struct ring_buffer *rb); +LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd, + ring_buffer_sample_fn sample_cb, void *ctx); +LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms); +LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb); +LIBBPF_API int ring_buffer__epoll_fd(const struct ring_buffer *rb); + +struct user_ring_buffer_opts { + size_t sz; /* size of this struct, for forward/backward compatibility */ +}; + +#define user_ring_buffer_opts__last_field sz + +/** + * @brief **user_ring_buffer__new()** creates a new instance of a user ring + * buffer. + * + * @param map_fd A file descriptor to a BPF_MAP_TYPE_USER_RINGBUF map. + * @param opts Options for how the ring buffer should be created. + * @return A user ring buffer on success; NULL and errno being set on a + * failure. + */ +LIBBPF_API struct user_ring_buffer * +user_ring_buffer__new(int map_fd, const struct user_ring_buffer_opts *opts); + +/** + * @brief **user_ring_buffer__reserve()** reserves a pointer to a sample in the + * user ring buffer. + * @param rb A pointer to a user ring buffer. + * @param size The size of the sample, in bytes. + * @return A pointer to an 8-byte aligned reserved region of the user ring + * buffer; NULL, and errno being set if a sample could not be reserved. + * + * This function is *not* thread safe, and callers must synchronize accessing + * this function if there are multiple producers. If a size is requested that + * is larger than the size of the entire ring buffer, errno will be set to + * E2BIG and NULL is returned. If the ring buffer could accommodate the size, + * but currently does not have enough space, errno is set to ENOSPC and NULL is + * returned. + * + * After initializing the sample, callers must invoke + * **user_ring_buffer__submit()** to post the sample to the kernel. Otherwise, + * the sample must be freed with **user_ring_buffer__discard()**. + */ +LIBBPF_API void *user_ring_buffer__reserve(struct user_ring_buffer *rb, __u32 size); + +/** + * @brief **user_ring_buffer__reserve_blocking()** reserves a record in the + * ring buffer, possibly blocking for up to @timeout_ms until a sample becomes + * available. + * @param rb The user ring buffer. + * @param size The size of the sample, in bytes. + * @param timeout_ms The amount of time, in milliseconds, for which the caller + * should block when waiting for a sample. -1 causes the caller to block + * indefinitely. + * @return A pointer to an 8-byte aligned reserved region of the user ring + * buffer; NULL, and errno being set if a sample could not be reserved. + * + * This function is *not* thread safe, and callers must synchronize + * accessing this function if there are multiple producers + * + * If **timeout_ms** is -1, the function will block indefinitely until a sample + * becomes available. Otherwise, **timeout_ms** must be non-negative, or errno + * is set to EINVAL, and NULL is returned. If **timeout_ms** is 0, no blocking + * will occur and the function will return immediately after attempting to + * reserve a sample. + * + * If **size** is larger than the size of the entire ring buffer, errno is set + * to E2BIG and NULL is returned. If the ring buffer could accommodate + * **size**, but currently does not have enough space, the caller will block + * until at most **timeout_ms** has elapsed. If insufficient space is available + * at that time, errno is set to ENOSPC, and NULL is returned. + * + * The kernel guarantees that it will wake up this thread to check if + * sufficient space is available in the ring buffer at least once per + * invocation of the **bpf_ringbuf_drain()** helper function, provided that at + * least one sample is consumed, and the BPF program did not invoke the + * function with BPF_RB_NO_WAKEUP. A wakeup may occur sooner than that, but the + * kernel does not guarantee this. If the helper function is invoked with + * BPF_RB_FORCE_WAKEUP, a wakeup event will be sent even if no sample is + * consumed. + * + * When a sample of size **size** is found within **timeout_ms**, a pointer to + * the sample is returned. After initializing the sample, callers must invoke + * **user_ring_buffer__submit()** to post the sample to the ring buffer. + * Otherwise, the sample must be freed with **user_ring_buffer__discard()**. + */ +LIBBPF_API void *user_ring_buffer__reserve_blocking(struct user_ring_buffer *rb, + __u32 size, + int timeout_ms); + +/** + * @brief **user_ring_buffer__submit()** submits a previously reserved sample + * into the ring buffer. + * @param rb The user ring buffer. + * @param sample A reserved sample. + * + * It is not necessary to synchronize amongst multiple producers when invoking + * this function. + */ +LIBBPF_API void user_ring_buffer__submit(struct user_ring_buffer *rb, void *sample); + +/** + * @brief **user_ring_buffer__discard()** discards a previously reserved sample. + * @param rb The user ring buffer. + * @param sample A reserved sample. + * + * It is not necessary to synchronize amongst multiple producers when invoking + * this function. + */ +LIBBPF_API void user_ring_buffer__discard(struct user_ring_buffer *rb, void *sample); + +/** + * @brief **user_ring_buffer__free()** frees a ring buffer that was previously + * created with **user_ring_buffer__new()**. + * @param rb The user ring buffer being freed. + */ +LIBBPF_API void user_ring_buffer__free(struct user_ring_buffer *rb); + +/* Perf buffer APIs */ +struct perf_buffer; + +typedef void (*perf_buffer_sample_fn)(void *ctx, int cpu, + void *data, __u32 size); +typedef void (*perf_buffer_lost_fn)(void *ctx, int cpu, __u64 cnt); + +/* common use perf buffer options */ +struct perf_buffer_opts { + size_t sz; + __u32 sample_period; + size_t :0; +}; +#define perf_buffer_opts__last_field sample_period + +/** + * @brief **perf_buffer__new()** creates BPF perfbuf manager for a specified + * BPF_PERF_EVENT_ARRAY map + * @param map_fd FD of BPF_PERF_EVENT_ARRAY BPF map that will be used by BPF + * code to send data over to user-space + * @param page_cnt number of memory pages allocated for each per-CPU buffer + * @param sample_cb function called on each received data record + * @param lost_cb function called when record loss has occurred + * @param ctx user-provided extra context passed into *sample_cb* and *lost_cb* + * @return a new instance of struct perf_buffer on success, NULL on error with + * *errno* containing an error code + */ +LIBBPF_API struct perf_buffer * +perf_buffer__new(int map_fd, size_t page_cnt, + perf_buffer_sample_fn sample_cb, perf_buffer_lost_fn lost_cb, void *ctx, + const struct perf_buffer_opts *opts); + +enum bpf_perf_event_ret { + LIBBPF_PERF_EVENT_DONE = 0, + LIBBPF_PERF_EVENT_ERROR = -1, + LIBBPF_PERF_EVENT_CONT = -2, +}; + +struct perf_event_header; + +typedef enum bpf_perf_event_ret +(*perf_buffer_event_fn)(void *ctx, int cpu, struct perf_event_header *event); + +/* raw perf buffer options, giving most power and control */ +struct perf_buffer_raw_opts { + size_t sz; + long :0; + long :0; + /* if cpu_cnt == 0, open all on all possible CPUs (up to the number of + * max_entries of given PERF_EVENT_ARRAY map) + */ + int cpu_cnt; + /* if cpu_cnt > 0, cpus is an array of CPUs to open ring buffers on */ + int *cpus; + /* if cpu_cnt > 0, map_keys specify map keys to set per-CPU FDs for */ + int *map_keys; +}; +#define perf_buffer_raw_opts__last_field map_keys + +struct perf_event_attr; + +LIBBPF_API struct perf_buffer * +perf_buffer__new_raw(int map_fd, size_t page_cnt, struct perf_event_attr *attr, + perf_buffer_event_fn event_cb, void *ctx, + const struct perf_buffer_raw_opts *opts); + +LIBBPF_API void perf_buffer__free(struct perf_buffer *pb); +LIBBPF_API int perf_buffer__epoll_fd(const struct perf_buffer *pb); +LIBBPF_API int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms); +LIBBPF_API int perf_buffer__consume(struct perf_buffer *pb); +LIBBPF_API int perf_buffer__consume_buffer(struct perf_buffer *pb, size_t buf_idx); +LIBBPF_API size_t perf_buffer__buffer_cnt(const struct perf_buffer *pb); +LIBBPF_API int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_idx); +/** + * @brief **perf_buffer__buffer()** returns the per-cpu raw mmap()'ed underlying + * memory region of the ring buffer. + * This ring buffer can be used to implement a custom events consumer. + * The ring buffer starts with the *struct perf_event_mmap_page*, which + * holds the ring buffer managment fields, when accessing the header + * structure it's important to be SMP aware. + * You can refer to *perf_event_read_simple* for a simple example. + * @param pb the perf buffer structure + * @param buf_idx the buffer index to retreive + * @param buf (out) gets the base pointer of the mmap()'ed memory + * @param buf_size (out) gets the size of the mmap()'ed region + * @return 0 on success, negative error code for failure + */ +LIBBPF_API int perf_buffer__buffer(struct perf_buffer *pb, int buf_idx, void **buf, + size_t *buf_size); + +struct bpf_prog_linfo; +struct bpf_prog_info; + +LIBBPF_API void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo); +LIBBPF_API struct bpf_prog_linfo * +bpf_prog_linfo__new(const struct bpf_prog_info *info); +LIBBPF_API const struct bpf_line_info * +bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo, + __u64 addr, __u32 func_idx, __u32 nr_skip); +LIBBPF_API const struct bpf_line_info * +bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo, + __u32 insn_off, __u32 nr_skip); + +/* + * Probe for supported system features + * + * Note that running many of these probes in a short amount of time can cause + * the kernel to reach the maximal size of lockable memory allowed for the + * user, causing subsequent probes to fail. In this case, the caller may want + * to adjust that limit with setrlimit(). + */ + +/** + * @brief **libbpf_probe_bpf_prog_type()** detects if host kernel supports + * BPF programs of a given type. + * @param prog_type BPF program type to detect kernel support for + * @param opts reserved for future extensibility, should be NULL + * @return 1, if given program type is supported; 0, if given program type is + * not supported; negative error code if feature detection failed or can't be + * performed + * + * Make sure the process has required set of CAP_* permissions (or runs as + * root) when performing feature checking. + */ +LIBBPF_API int libbpf_probe_bpf_prog_type(enum bpf_prog_type prog_type, const void *opts); +/** + * @brief **libbpf_probe_bpf_map_type()** detects if host kernel supports + * BPF maps of a given type. + * @param map_type BPF map type to detect kernel support for + * @param opts reserved for future extensibility, should be NULL + * @return 1, if given map type is supported; 0, if given map type is + * not supported; negative error code if feature detection failed or can't be + * performed + * + * Make sure the process has required set of CAP_* permissions (or runs as + * root) when performing feature checking. + */ +LIBBPF_API int libbpf_probe_bpf_map_type(enum bpf_map_type map_type, const void *opts); +/** + * @brief **libbpf_probe_bpf_helper()** detects if host kernel supports the + * use of a given BPF helper from specified BPF program type. + * @param prog_type BPF program type used to check the support of BPF helper + * @param helper_id BPF helper ID (enum bpf_func_id) to check support for + * @param opts reserved for future extensibility, should be NULL + * @return 1, if given combination of program type and helper is supported; 0, + * if the combination is not supported; negative error code if feature + * detection for provided input arguments failed or can't be performed + * + * Make sure the process has required set of CAP_* permissions (or runs as + * root) when performing feature checking. + */ +LIBBPF_API int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, + enum bpf_func_id helper_id, const void *opts); + +/** + * @brief **libbpf_num_possible_cpus()** is a helper function to get the + * number of possible CPUs that the host kernel supports and expects. + * @return number of possible CPUs; or error code on failure + * + * Example usage: + * + * int ncpus = libbpf_num_possible_cpus(); + * if (ncpus < 0) { + * // error handling + * } + * long values[ncpus]; + * bpf_map_lookup_elem(per_cpu_map_fd, key, values); + */ +LIBBPF_API int libbpf_num_possible_cpus(void); + +struct bpf_map_skeleton { + const char *name; + struct bpf_map **map; + void **mmaped; +}; + +struct bpf_prog_skeleton { + const char *name; + struct bpf_program **prog; + struct bpf_link **link; +}; + +struct bpf_object_skeleton { + size_t sz; /* size of this struct, for forward/backward compatibility */ + + const char *name; + const void *data; + size_t data_sz; + + struct bpf_object **obj; + + int map_cnt; + int map_skel_sz; /* sizeof(struct bpf_map_skeleton) */ + struct bpf_map_skeleton *maps; + + int prog_cnt; + int prog_skel_sz; /* sizeof(struct bpf_prog_skeleton) */ + struct bpf_prog_skeleton *progs; +}; + +LIBBPF_API int +bpf_object__open_skeleton(struct bpf_object_skeleton *s, + const struct bpf_object_open_opts *opts); +LIBBPF_API int bpf_object__load_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API int bpf_object__attach_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API void bpf_object__detach_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s); + +struct bpf_var_skeleton { + const char *name; + struct bpf_map **map; + void **addr; +}; + +struct bpf_object_subskeleton { + size_t sz; /* size of this struct, for forward/backward compatibility */ + + const struct bpf_object *obj; + + int map_cnt; + int map_skel_sz; /* sizeof(struct bpf_map_skeleton) */ + struct bpf_map_skeleton *maps; + + int prog_cnt; + int prog_skel_sz; /* sizeof(struct bpf_prog_skeleton) */ + struct bpf_prog_skeleton *progs; + + int var_cnt; + int var_skel_sz; /* sizeof(struct bpf_var_skeleton) */ + struct bpf_var_skeleton *vars; +}; + +LIBBPF_API int +bpf_object__open_subskeleton(struct bpf_object_subskeleton *s); +LIBBPF_API void +bpf_object__destroy_subskeleton(struct bpf_object_subskeleton *s); + +struct gen_loader_opts { + size_t sz; /* size of this struct, for forward/backward compatiblity */ + const char *data; + const char *insns; + __u32 data_sz; + __u32 insns_sz; +}; + +#define gen_loader_opts__last_field insns_sz +LIBBPF_API int bpf_object__gen_loader(struct bpf_object *obj, + struct gen_loader_opts *opts); + +enum libbpf_tristate { + TRI_NO = 0, + TRI_YES = 1, + TRI_MODULE = 2, +}; + +struct bpf_linker_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; +}; +#define bpf_linker_opts__last_field sz + +struct bpf_linker_file_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; +}; +#define bpf_linker_file_opts__last_field sz + +struct bpf_linker; + +LIBBPF_API struct bpf_linker *bpf_linker__new(const char *filename, struct bpf_linker_opts *opts); +LIBBPF_API int bpf_linker__add_file(struct bpf_linker *linker, + const char *filename, + const struct bpf_linker_file_opts *opts); +LIBBPF_API int bpf_linker__finalize(struct bpf_linker *linker); +LIBBPF_API void bpf_linker__free(struct bpf_linker *linker); + +/* + * Custom handling of BPF program's SEC() definitions + */ + +struct bpf_prog_load_opts; /* defined in bpf.h */ + +/* Called during bpf_object__open() for each recognized BPF program. Callback + * can use various bpf_program__set_*() setters to adjust whatever properties + * are necessary. + */ +typedef int (*libbpf_prog_setup_fn_t)(struct bpf_program *prog, long cookie); + +/* Called right before libbpf performs bpf_prog_load() to load BPF program + * into the kernel. Callback can adjust opts as necessary. + */ +typedef int (*libbpf_prog_prepare_load_fn_t)(struct bpf_program *prog, + struct bpf_prog_load_opts *opts, long cookie); + +/* Called during skeleton attach or through bpf_program__attach(). If + * auto-attach is not supported, callback should return 0 and set link to + * NULL (it's not considered an error during skeleton attach, but it will be + * an error for bpf_program__attach() calls). On error, error should be + * returned directly and link set to NULL. On success, return 0 and set link + * to a valid struct bpf_link. + */ +typedef int (*libbpf_prog_attach_fn_t)(const struct bpf_program *prog, long cookie, + struct bpf_link **link); + +struct libbpf_prog_handler_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* User-provided value that is passed to prog_setup_fn, + * prog_prepare_load_fn, and prog_attach_fn callbacks. Allows user to + * register one set of callbacks for multiple SEC() definitions and + * still be able to distinguish them, if necessary. For example, + * libbpf itself is using this to pass necessary flags (e.g., + * sleepable flag) to a common internal SEC() handler. + */ + long cookie; + /* BPF program initialization callback (see libbpf_prog_setup_fn_t). + * Callback is optional, pass NULL if it's not necessary. + */ + libbpf_prog_setup_fn_t prog_setup_fn; + /* BPF program loading callback (see libbpf_prog_prepare_load_fn_t). + * Callback is optional, pass NULL if it's not necessary. + */ + libbpf_prog_prepare_load_fn_t prog_prepare_load_fn; + /* BPF program attach callback (see libbpf_prog_attach_fn_t). + * Callback is optional, pass NULL if it's not necessary. + */ + libbpf_prog_attach_fn_t prog_attach_fn; +}; +#define libbpf_prog_handler_opts__last_field prog_attach_fn + +/** + * @brief **libbpf_register_prog_handler()** registers a custom BPF program + * SEC() handler. + * @param sec section prefix for which custom handler is registered + * @param prog_type BPF program type associated with specified section + * @param exp_attach_type Expected BPF attach type associated with specified section + * @param opts optional cookie, callbacks, and other extra options + * @return Non-negative handler ID is returned on success. This handler ID has + * to be passed to *libbpf_unregister_prog_handler()* to unregister such + * custom handler. Negative error code is returned on error. + * + * *sec* defines which SEC() definitions are handled by this custom handler + * registration. *sec* can have few different forms: + * - if *sec* is just a plain string (e.g., "abc"), it will match only + * SEC("abc"). If BPF program specifies SEC("abc/whatever") it will result + * in an error; + * - if *sec* is of the form "abc/", proper SEC() form is + * SEC("abc/something"), where acceptable "something" should be checked by + * *prog_init_fn* callback, if there are additional restrictions; + * - if *sec* is of the form "abc+", it will successfully match both + * SEC("abc") and SEC("abc/whatever") forms; + * - if *sec* is NULL, custom handler is registered for any BPF program that + * doesn't match any of the registered (custom or libbpf's own) SEC() + * handlers. There could be only one such generic custom handler registered + * at any given time. + * + * All custom handlers (except the one with *sec* == NULL) are processed + * before libbpf's own SEC() handlers. It is allowed to "override" libbpf's + * SEC() handlers by registering custom ones for the same section prefix + * (i.e., it's possible to have custom SEC("perf_event/LLC-load-misses") + * handler). + * + * Note, like much of global libbpf APIs (e.g., libbpf_set_print(), + * libbpf_set_strict_mode(), etc)) these APIs are not thread-safe. User needs + * to ensure synchronization if there is a risk of running this API from + * multiple threads simultaneously. + */ +LIBBPF_API int libbpf_register_prog_handler(const char *sec, + enum bpf_prog_type prog_type, + enum bpf_attach_type exp_attach_type, + const struct libbpf_prog_handler_opts *opts); +/** + * @brief *libbpf_unregister_prog_handler()* unregisters previously registered + * custom BPF program SEC() handler. + * @param handler_id handler ID returned by *libbpf_register_prog_handler()* + * after successful registration + * @return 0 on success, negative error code if handler isn't found + * + * Note, like much of global libbpf APIs (e.g., libbpf_set_print(), + * libbpf_set_strict_mode(), etc)) these APIs are not thread-safe. User needs + * to ensure synchronization if there is a risk of running this API from + * multiple threads simultaneously. + */ +LIBBPF_API int libbpf_unregister_prog_handler(int handler_id); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_LIBBPF_H */ diff --git a/examples/c/bpf/libbpf_common.h b/examples/c/bpf/libbpf_common.h new file mode 100644 index 0000000..9a7937f --- /dev/null +++ b/examples/c/bpf/libbpf_common.h @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Common user-facing libbpf helpers. + * + * Copyright (c) 2019 Facebook + */ + +#ifndef __LIBBPF_LIBBPF_COMMON_H +#define __LIBBPF_LIBBPF_COMMON_H + +#include +#include "libbpf_version.h" + +#ifndef LIBBPF_API +#define LIBBPF_API __attribute__((visibility("default"))) +#endif + +#define LIBBPF_DEPRECATED(msg) __attribute__((deprecated(msg))) + +/* Mark a symbol as deprecated when libbpf version is >= {major}.{minor} */ +#define LIBBPF_DEPRECATED_SINCE(major, minor, msg) \ + __LIBBPF_MARK_DEPRECATED_ ## major ## _ ## minor \ + (LIBBPF_DEPRECATED("libbpf v" # major "." # minor "+: " msg)) + +#define __LIBBPF_CURRENT_VERSION_GEQ(major, minor) \ + (LIBBPF_MAJOR_VERSION > (major) || \ + (LIBBPF_MAJOR_VERSION == (major) && LIBBPF_MINOR_VERSION >= (minor))) + +/* Add checks for other versions below when planning deprecation of API symbols + * with the LIBBPF_DEPRECATED_SINCE macro. + */ +#if __LIBBPF_CURRENT_VERSION_GEQ(1, 0) +#define __LIBBPF_MARK_DEPRECATED_1_0(X) X +#else +#define __LIBBPF_MARK_DEPRECATED_1_0(X) +#endif + +/* This set of internal macros allows to do "function overloading" based on + * number of arguments provided by used in backwards-compatible way during the + * transition to libbpf 1.0 + * It's ugly but necessary evil that will be cleaned up when we get to 1.0. + * See bpf_prog_load() overload for example. + */ +#define ___libbpf_cat(A, B) A ## B +#define ___libbpf_select(NAME, NUM) ___libbpf_cat(NAME, NUM) +#define ___libbpf_nth(_1, _2, _3, _4, _5, _6, N, ...) N +#define ___libbpf_cnt(...) ___libbpf_nth(__VA_ARGS__, 6, 5, 4, 3, 2, 1) +#define ___libbpf_overload(NAME, ...) ___libbpf_select(NAME, ___libbpf_cnt(__VA_ARGS__))(__VA_ARGS__) + +/* Helper macro to declare and initialize libbpf options struct + * + * This dance with uninitialized declaration, followed by memset to zero, + * followed by assignment using compound literal syntax is done to preserve + * ability to use a nice struct field initialization syntax and **hopefully** + * have all the padding bytes initialized to zero. It's not guaranteed though, + * when copying literal, that compiler won't copy garbage in literal's padding + * bytes, but that's the best way I've found and it seems to work in practice. + * + * Macro declares opts struct of given type and name, zero-initializes, + * including any extra padding, it with memset() and then assigns initial + * values provided by users in struct initializer-syntax as varargs. + */ +#define LIBBPF_OPTS(TYPE, NAME, ...) \ + struct TYPE NAME = ({ \ + memset(&NAME, 0, sizeof(struct TYPE)); \ + (struct TYPE) { \ + .sz = sizeof(struct TYPE), \ + __VA_ARGS__ \ + }; \ + }) + +#endif /* __LIBBPF_LIBBPF_COMMON_H */ diff --git a/examples/c/bpf/libbpf_internal.h b/examples/c/bpf/libbpf_internal.h new file mode 100644 index 0000000..fbaf683 --- /dev/null +++ b/examples/c/bpf/libbpf_internal.h @@ -0,0 +1,580 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Internal libbpf helpers. + * + * Copyright (c) 2019 Facebook + */ + +#ifndef __LIBBPF_LIBBPF_INTERNAL_H +#define __LIBBPF_LIBBPF_INTERNAL_H + +#include +#include +#include +#include +#include +#include +#include "relo_core.h" + +/* make sure libbpf doesn't use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +/* prevent accidental re-addition of reallocarray()/strlcpy() */ +#pragma GCC poison reallocarray strlcpy + +#include "libbpf.h" +#include "btf.h" + +#ifndef EM_BPF +#define EM_BPF 247 +#endif + +#ifndef R_BPF_64_64 +#define R_BPF_64_64 1 +#endif +#ifndef R_BPF_64_ABS64 +#define R_BPF_64_ABS64 2 +#endif +#ifndef R_BPF_64_ABS32 +#define R_BPF_64_ABS32 3 +#endif +#ifndef R_BPF_64_32 +#define R_BPF_64_32 10 +#endif + +#ifndef SHT_LLVM_ADDRSIG +#define SHT_LLVM_ADDRSIG 0x6FFF4C03 +#endif + +/* if libelf is old and doesn't support mmap(), fall back to read() */ +#ifndef ELF_C_READ_MMAP +#define ELF_C_READ_MMAP ELF_C_READ +#endif + +/* Older libelf all end up in this expression, for both 32 and 64 bit */ +#ifndef ELF64_ST_VISIBILITY +#define ELF64_ST_VISIBILITY(o) ((o) & 0x03) +#endif + +#define BTF_INFO_ENC(kind, kind_flag, vlen) \ + ((!!(kind_flag) << 31) | ((kind) << 24) | ((vlen) & BTF_MAX_VLEN)) +#define BTF_TYPE_ENC(name, info, size_or_type) (name), (info), (size_or_type) +#define BTF_INT_ENC(encoding, bits_offset, nr_bits) \ + ((encoding) << 24 | (bits_offset) << 16 | (nr_bits)) +#define BTF_TYPE_INT_ENC(name, encoding, bits_offset, bits, sz) \ + BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_INT, 0, 0), sz), \ + BTF_INT_ENC(encoding, bits_offset, bits) +#define BTF_MEMBER_ENC(name, type, bits_offset) (name), (type), (bits_offset) +#define BTF_PARAM_ENC(name, type) (name), (type) +#define BTF_VAR_SECINFO_ENC(type, offset, size) (type), (offset), (size) +#define BTF_TYPE_FLOAT_ENC(name, sz) \ + BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_FLOAT, 0, 0), sz) +#define BTF_TYPE_DECL_TAG_ENC(value, type, component_idx) \ + BTF_TYPE_ENC(value, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 0), type), (component_idx) +#define BTF_TYPE_TYPE_TAG_ENC(value, type) \ + BTF_TYPE_ENC(value, BTF_INFO_ENC(BTF_KIND_TYPE_TAG, 0, 0), type) + +#ifndef likely +#define likely(x) __builtin_expect(!!(x), 1) +#endif +#ifndef unlikely +#define unlikely(x) __builtin_expect(!!(x), 0) +#endif +#ifndef min +# define min(x, y) ((x) < (y) ? (x) : (y)) +#endif +#ifndef max +# define max(x, y) ((x) < (y) ? (y) : (x)) +#endif +#ifndef offsetofend +# define offsetofend(TYPE, FIELD) \ + (offsetof(TYPE, FIELD) + sizeof(((TYPE *)0)->FIELD)) +#endif +#ifndef __alias +#define __alias(symbol) __attribute__((alias(#symbol))) +#endif + +/* Check whether a string `str` has prefix `pfx`, regardless if `pfx` is + * a string literal known at compilation time or char * pointer known only at + * runtime. + */ +#define str_has_pfx(str, pfx) \ + (strncmp(str, pfx, __builtin_constant_p(pfx) ? sizeof(pfx) - 1 : strlen(pfx)) == 0) + +/* suffix check */ +static inline bool str_has_sfx(const char *str, const char *sfx) +{ + size_t str_len = strlen(str); + size_t sfx_len = strlen(sfx); + + if (sfx_len > str_len) + return false; + return strcmp(str + str_len - sfx_len, sfx) == 0; +} + +/* Symbol versioning is different between static and shared library. + * Properly versioned symbols are needed for shared library, but + * only the symbol of the new version is needed for static library. + * Starting with GNU C 10, use symver attribute instead of .symver assembler + * directive, which works better with GCC LTO builds. + */ +#if defined(SHARED) && defined(__GNUC__) && __GNUC__ >= 10 + +#define DEFAULT_VERSION(internal_name, api_name, version) \ + __attribute__((symver(#api_name "@@" #version))) +#define COMPAT_VERSION(internal_name, api_name, version) \ + __attribute__((symver(#api_name "@" #version))) + +#elif defined(SHARED) + +#define COMPAT_VERSION(internal_name, api_name, version) \ + asm(".symver " #internal_name "," #api_name "@" #version); +#define DEFAULT_VERSION(internal_name, api_name, version) \ + asm(".symver " #internal_name "," #api_name "@@" #version); + +#else /* !SHARED */ + +#define COMPAT_VERSION(internal_name, api_name, version) +#define DEFAULT_VERSION(internal_name, api_name, version) \ + extern typeof(internal_name) api_name \ + __attribute__((alias(#internal_name))); + +#endif + +extern void libbpf_print(enum libbpf_print_level level, + const char *format, ...) + __attribute__((format(printf, 2, 3))); + +#define __pr(level, fmt, ...) \ +do { \ + libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \ +} while (0) + +#define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__) +#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__) +#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__) + +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +struct bpf_link { + int (*detach)(struct bpf_link *link); + void (*dealloc)(struct bpf_link *link); + char *pin_path; /* NULL, if not pinned */ + int fd; /* hook FD, -1 if not applicable */ + bool disconnected; +}; + +/* + * Re-implement glibc's reallocarray() for libbpf internal-only use. + * reallocarray(), unfortunately, is not available in all versions of glibc, + * so requires extra feature detection and using reallocarray() stub from + * and COMPAT_NEED_REALLOCARRAY. All this complicates + * build of libbpf unnecessarily and is just a maintenance burden. Instead, + * it's trivial to implement libbpf-specific internal version and use it + * throughout libbpf. + */ +static inline void *libbpf_reallocarray(void *ptr, size_t nmemb, size_t size) +{ + size_t total; + +#if __has_builtin(__builtin_mul_overflow) + if (unlikely(__builtin_mul_overflow(nmemb, size, &total))) + return NULL; +#else + if (size == 0 || nmemb > ULONG_MAX / size) + return NULL; + total = nmemb * size; +#endif + return realloc(ptr, total); +} + +/* Copy up to sz - 1 bytes from zero-terminated src string and ensure that dst + * is zero-terminated string no matter what (unless sz == 0, in which case + * it's a no-op). It's conceptually close to FreeBSD's strlcpy(), but differs + * in what is returned. Given this is internal helper, it's trivial to extend + * this, when necessary. Use this instead of strncpy inside libbpf source code. + */ +static inline void libbpf_strlcpy(char *dst, const char *src, size_t sz) +{ + size_t i; + + if (sz == 0) + return; + + sz--; + for (i = 0; i < sz && src[i]; i++) + dst[i] = src[i]; + dst[i] = '\0'; +} + +__u32 get_kernel_version(void); + +struct btf; +struct btf_type; + +struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id); +const char *btf_kind_str(const struct btf_type *t); +const struct btf_type *skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id); + +static inline enum btf_func_linkage btf_func_linkage(const struct btf_type *t) +{ + return (enum btf_func_linkage)(int)btf_vlen(t); +} + +static inline __u32 btf_type_info(int kind, int vlen, int kflag) +{ + return (kflag << 31) | (kind << 24) | vlen; +} + +enum map_def_parts { + MAP_DEF_MAP_TYPE = 0x001, + MAP_DEF_KEY_TYPE = 0x002, + MAP_DEF_KEY_SIZE = 0x004, + MAP_DEF_VALUE_TYPE = 0x008, + MAP_DEF_VALUE_SIZE = 0x010, + MAP_DEF_MAX_ENTRIES = 0x020, + MAP_DEF_MAP_FLAGS = 0x040, + MAP_DEF_NUMA_NODE = 0x080, + MAP_DEF_PINNING = 0x100, + MAP_DEF_INNER_MAP = 0x200, + MAP_DEF_MAP_EXTRA = 0x400, + + MAP_DEF_ALL = 0x7ff, /* combination of all above */ +}; + +struct btf_map_def { + enum map_def_parts parts; + __u32 map_type; + __u32 key_type_id; + __u32 key_size; + __u32 value_type_id; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + __u32 numa_node; + __u32 pinning; + __u64 map_extra; +}; + +int parse_btf_map_def(const char *map_name, struct btf *btf, + const struct btf_type *def_t, bool strict, + struct btf_map_def *map_def, struct btf_map_def *inner_def); + +void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz, + size_t cur_cnt, size_t max_cnt, size_t add_cnt); +int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt); + +static inline bool libbpf_is_mem_zeroed(const char *p, ssize_t len) +{ + while (len > 0) { + if (*p) + return false; + p++; + len--; + } + return true; +} + +static inline bool libbpf_validate_opts(const char *opts, + size_t opts_sz, size_t user_sz, + const char *type_name) +{ + if (user_sz < sizeof(size_t)) { + pr_warn("%s size (%zu) is too small\n", type_name, user_sz); + return false; + } + if (!libbpf_is_mem_zeroed(opts + opts_sz, (ssize_t)user_sz - opts_sz)) { + pr_warn("%s has non-zero extra bytes\n", type_name); + return false; + } + return true; +} + +#define OPTS_VALID(opts, type) \ + (!(opts) || libbpf_validate_opts((const char *)opts, \ + offsetofend(struct type, \ + type##__last_field), \ + (opts)->sz, #type)) +#define OPTS_HAS(opts, field) \ + ((opts) && opts->sz >= offsetofend(typeof(*(opts)), field)) +#define OPTS_GET(opts, field, fallback_value) \ + (OPTS_HAS(opts, field) ? (opts)->field : fallback_value) +#define OPTS_SET(opts, field, value) \ + do { \ + if (OPTS_HAS(opts, field)) \ + (opts)->field = value; \ + } while (0) + +#define OPTS_ZEROED(opts, last_nonzero_field) \ +({ \ + ssize_t __off = offsetofend(typeof(*(opts)), last_nonzero_field); \ + !(opts) || libbpf_is_mem_zeroed((const void *)opts + __off, \ + (opts)->sz - __off); \ +}) + +enum kern_feature_id { + /* v4.14: kernel support for program & map names. */ + FEAT_PROG_NAME, + /* v5.2: kernel support for global data sections. */ + FEAT_GLOBAL_DATA, + /* BTF support */ + FEAT_BTF, + /* BTF_KIND_FUNC and BTF_KIND_FUNC_PROTO support */ + FEAT_BTF_FUNC, + /* BTF_KIND_VAR and BTF_KIND_DATASEC support */ + FEAT_BTF_DATASEC, + /* BTF_FUNC_GLOBAL is supported */ + FEAT_BTF_GLOBAL_FUNC, + /* BPF_F_MMAPABLE is supported for arrays */ + FEAT_ARRAY_MMAP, + /* kernel support for expected_attach_type in BPF_PROG_LOAD */ + FEAT_EXP_ATTACH_TYPE, + /* bpf_probe_read_{kernel,user}[_str] helpers */ + FEAT_PROBE_READ_KERN, + /* BPF_PROG_BIND_MAP is supported */ + FEAT_PROG_BIND_MAP, + /* Kernel support for module BTFs */ + FEAT_MODULE_BTF, + /* BTF_KIND_FLOAT support */ + FEAT_BTF_FLOAT, + /* BPF perf link support */ + FEAT_PERF_LINK, + /* BTF_KIND_DECL_TAG support */ + FEAT_BTF_DECL_TAG, + /* BTF_KIND_TYPE_TAG support */ + FEAT_BTF_TYPE_TAG, + /* memcg-based accounting for BPF maps and progs */ + FEAT_MEMCG_ACCOUNT, + /* BPF cookie (bpf_get_attach_cookie() BPF helper) support */ + FEAT_BPF_COOKIE, + /* BTF_KIND_ENUM64 support and BTF_KIND_ENUM kflag support */ + FEAT_BTF_ENUM64, + /* Kernel uses syscall wrapper (CONFIG_ARCH_HAS_SYSCALL_WRAPPER) */ + FEAT_SYSCALL_WRAPPER, + __FEAT_CNT, +}; + +int probe_memcg_account(void); +bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id); +int bump_rlimit_memlock(void); + +int parse_cpu_mask_str(const char *s, bool **mask, int *mask_sz); +int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz); +int libbpf__load_raw_btf(const char *raw_types, size_t types_len, + const char *str_sec, size_t str_len); +int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level); + +struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf); +void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type, + const char **prefix, int *kind); + +struct btf_ext_info { + /* + * info points to the individual info section (e.g. func_info and + * line_info) from the .BTF.ext. It does not include the __u32 rec_size. + */ + void *info; + __u32 rec_size; + __u32 len; + /* optional (maintained internally by libbpf) mapping between .BTF.ext + * section and corresponding ELF section. This is used to join + * information like CO-RE relocation records with corresponding BPF + * programs defined in ELF sections + */ + __u32 *sec_idxs; + int sec_cnt; +}; + +#define for_each_btf_ext_sec(seg, sec) \ + for (sec = (seg)->info; \ + (void *)sec < (seg)->info + (seg)->len; \ + sec = (void *)sec + sizeof(struct btf_ext_info_sec) + \ + (seg)->rec_size * sec->num_info) + +#define for_each_btf_ext_rec(seg, sec, i, rec) \ + for (i = 0, rec = (void *)&(sec)->data; \ + i < (sec)->num_info; \ + i++, rec = (void *)rec + (seg)->rec_size) + +/* + * The .BTF.ext ELF section layout defined as + * struct btf_ext_header + * func_info subsection + * + * The func_info subsection layout: + * record size for struct bpf_func_info in the func_info subsection + * struct btf_sec_func_info for section #1 + * a list of bpf_func_info records for section #1 + * where struct bpf_func_info mimics one in include/uapi/linux/bpf.h + * but may not be identical + * struct btf_sec_func_info for section #2 + * a list of bpf_func_info records for section #2 + * ...... + * + * Note that the bpf_func_info record size in .BTF.ext may not + * be the same as the one defined in include/uapi/linux/bpf.h. + * The loader should ensure that record_size meets minimum + * requirement and pass the record as is to the kernel. The + * kernel will handle the func_info properly based on its contents. + */ +struct btf_ext_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + + /* All offsets are in bytes relative to the end of this header */ + __u32 func_info_off; + __u32 func_info_len; + __u32 line_info_off; + __u32 line_info_len; + + /* optional part of .BTF.ext header */ + __u32 core_relo_off; + __u32 core_relo_len; +}; + +struct btf_ext { + union { + struct btf_ext_header *hdr; + void *data; + }; + struct btf_ext_info func_info; + struct btf_ext_info line_info; + struct btf_ext_info core_relo_info; + __u32 data_size; +}; + +struct btf_ext_info_sec { + __u32 sec_name_off; + __u32 num_info; + /* Followed by num_info * record_size number of bytes */ + __u8 data[]; +}; + +/* The minimum bpf_func_info checked by the loader */ +struct bpf_func_info_min { + __u32 insn_off; + __u32 type_id; +}; + +/* The minimum bpf_line_info checked by the loader */ +struct bpf_line_info_min { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + + +typedef int (*type_id_visit_fn)(__u32 *type_id, void *ctx); +typedef int (*str_off_visit_fn)(__u32 *str_off, void *ctx); +int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx); +int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx); +int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx); +int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx); +__s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, + __u32 kind); + +typedef int (*kallsyms_cb_t)(unsigned long long sym_addr, char sym_type, + const char *sym_name, void *ctx); + +int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *arg); + +/* handle direct returned errors */ +static inline int libbpf_err(int ret) +{ + if (ret < 0) + errno = -ret; + return ret; +} + +/* handle errno-based (e.g., syscall or libc) errors according to libbpf's + * strict mode settings + */ +static inline int libbpf_err_errno(int ret) +{ + /* errno is already assumed to be set on error */ + return ret < 0 ? -errno : ret; +} + +/* handle error for pointer-returning APIs, err is assumed to be < 0 always */ +static inline void *libbpf_err_ptr(int err) +{ + /* set errno on error, this doesn't break anything */ + errno = -err; + return NULL; +} + +/* handle pointer-returning APIs' error handling */ +static inline void *libbpf_ptr(void *ret) +{ + /* set errno on error, this doesn't break anything */ + if (IS_ERR(ret)) + errno = -PTR_ERR(ret); + + return IS_ERR(ret) ? NULL : ret; +} + +static inline bool str_is_empty(const char *s) +{ + return !s || !s[0]; +} + +static inline bool is_ldimm64_insn(struct bpf_insn *insn) +{ + return insn->code == (BPF_LD | BPF_IMM | BPF_DW); +} + +/* if fd is stdin, stdout, or stderr, dup to a fd greater than 2 + * Takes ownership of the fd passed in, and closes it if calling + * fcntl(fd, F_DUPFD_CLOEXEC, 3). + */ +static inline int ensure_good_fd(int fd) +{ + int old_fd = fd, saved_errno; + + if (fd < 0) + return fd; + if (fd < 3) { + fd = fcntl(fd, F_DUPFD_CLOEXEC, 3); + saved_errno = errno; + close(old_fd); + errno = saved_errno; + if (fd < 0) { + pr_warn("failed to dup FD %d to FD > 2: %d\n", old_fd, -saved_errno); + errno = saved_errno; + } + } + return fd; +} + +/* The following two functions are exposed to bpftool */ +int bpf_core_add_cands(struct bpf_core_cand *local_cand, + size_t local_essent_len, + const struct btf *targ_btf, + const char *targ_btf_name, + int targ_start_id, + struct bpf_core_cand_list *cands); +void bpf_core_free_cands(struct bpf_core_cand_list *cands); + +struct usdt_manager *usdt_manager_new(struct bpf_object *obj); +void usdt_manager_free(struct usdt_manager *man); +struct bpf_link * usdt_manager_attach_usdt(struct usdt_manager *man, + const struct bpf_program *prog, + pid_t pid, const char *path, + const char *usdt_provider, const char *usdt_name, + __u64 usdt_cookie); + +static inline bool is_pow_of_2(size_t x) +{ + return x && (x & (x - 1)) == 0; +} + +#define PROG_LOAD_ATTEMPTS 5 +int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts); + +#endif /* __LIBBPF_LIBBPF_INTERNAL_H */ diff --git a/examples/c/bpf/libbpf_legacy.h b/examples/c/bpf/libbpf_legacy.h new file mode 100644 index 0000000..1e1be46 --- /dev/null +++ b/examples/c/bpf/libbpf_legacy.h @@ -0,0 +1,140 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Libbpf legacy APIs (either discouraged or deprecated, as mentioned in [0]) + * + * [0] https://docs.google.com/document/d/1UyjTZuPFWiPFyKk1tV5an11_iaRuec6U-ZESZ54nNTY + * + * Copyright (C) 2021 Facebook + */ +#ifndef __LIBBPF_LEGACY_BPF_H +#define __LIBBPF_LEGACY_BPF_H + +#include +#include +#include +#include +#include "libbpf_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* As of libbpf 1.0 libbpf_set_strict_mode() and enum libbpf_struct_mode have + * no effect. But they are left in libbpf_legacy.h so that applications that + * prepared for libbpf 1.0 before final release by using + * libbpf_set_strict_mode() still work with libbpf 1.0+ without any changes. + */ +enum libbpf_strict_mode { + /* Turn on all supported strict features of libbpf to simulate libbpf + * v1.0 behavior. + * This will be the default behavior in libbpf v1.0. + */ + LIBBPF_STRICT_ALL = 0xffffffff, + + /* + * Disable any libbpf 1.0 behaviors. This is the default before libbpf + * v1.0. It won't be supported anymore in v1.0, please update your + * code so that it handles LIBBPF_STRICT_ALL mode before libbpf v1.0. + */ + LIBBPF_STRICT_NONE = 0x00, + /* + * Return NULL pointers on error, not ERR_PTR(err). + * Additionally, libbpf also always sets errno to corresponding Exx + * (positive) error code. + */ + LIBBPF_STRICT_CLEAN_PTRS = 0x01, + /* + * Return actual error codes from low-level APIs directly, not just -1. + * Additionally, libbpf also always sets errno to corresponding Exx + * (positive) error code. + */ + LIBBPF_STRICT_DIRECT_ERRS = 0x02, + /* + * Enforce strict BPF program section (SEC()) names. + * E.g., while prefiously SEC("xdp_whatever") or SEC("perf_event_blah") were + * allowed, with LIBBPF_STRICT_SEC_PREFIX this will become + * unrecognized by libbpf and would have to be just SEC("xdp") and + * SEC("xdp") and SEC("perf_event"). + * + * Note, in this mode the program pin path will be based on the + * function name instead of section name. + * + * Additionally, routines in the .text section are always considered + * sub-programs. Legacy behavior allows for a single routine in .text + * to be a program. + */ + LIBBPF_STRICT_SEC_NAME = 0x04, + /* + * Disable the global 'bpf_objects_list'. Maintaining this list adds + * a race condition to bpf_object__open() and bpf_object__close(). + * Clients can maintain it on their own if it is valuable for them. + */ + LIBBPF_STRICT_NO_OBJECT_LIST = 0x08, + /* + * Automatically bump RLIMIT_MEMLOCK using setrlimit() before the + * first BPF program or map creation operation. This is done only if + * kernel is too old to support memcg-based memory accounting for BPF + * subsystem. By default, RLIMIT_MEMLOCK limit is set to RLIM_INFINITY, + * but it can be overriden with libbpf_set_memlock_rlim() API. + * Note that libbpf_set_memlock_rlim() needs to be called before + * the very first bpf_prog_load(), bpf_map_create() or bpf_object__load() + * operation. + */ + LIBBPF_STRICT_AUTO_RLIMIT_MEMLOCK = 0x10, + /* + * Error out on any SEC("maps") map definition, which are deprecated + * in favor of BTF-defined map definitions in SEC(".maps"). + */ + LIBBPF_STRICT_MAP_DEFINITIONS = 0x20, + + __LIBBPF_STRICT_LAST, +}; + +LIBBPF_API int libbpf_set_strict_mode(enum libbpf_strict_mode mode); + +/** + * @brief **libbpf_get_error()** extracts the error code from the passed + * pointer + * @param ptr pointer returned from libbpf API function + * @return error code; or 0 if no error occured + * + * Note, as of libbpf 1.0 this function is not necessary and not recommended + * to be used. Libbpf doesn't return error code embedded into the pointer + * itself. Instead, NULL is returned on error and error code is passed through + * thread-local errno variable. **libbpf_get_error()** is just returning -errno + * value if it receives NULL, which is correct only if errno hasn't been + * modified between libbpf API call and corresponding **libbpf_get_error()** + * call. Prefer to check return for NULL and use errno directly. + * + * This API is left in libbpf 1.0 to allow applications that were 1.0-ready + * before final libbpf 1.0 without needing to change them. + */ +LIBBPF_API long libbpf_get_error(const void *ptr); + +#define DECLARE_LIBBPF_OPTS LIBBPF_OPTS + +/* "Discouraged" APIs which don't follow consistent libbpf naming patterns. + * They are normally a trivial aliases or wrappers for proper APIs and are + * left to minimize unnecessary disruption for users of libbpf. But they + * shouldn't be used going forward. + */ + +struct bpf_program; +struct bpf_map; +struct btf; +struct btf_ext; + +LIBBPF_API struct btf *libbpf_find_kernel_btf(void); + +LIBBPF_API enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog); +LIBBPF_API enum bpf_attach_type bpf_program__get_expected_attach_type(const struct bpf_program *prog); +LIBBPF_API const char *bpf_map__get_pin_path(const struct bpf_map *map); +LIBBPF_API const void *btf__get_raw_data(const struct btf *btf, __u32 *size); +LIBBPF_API const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_LEGACY_BPF_H */ diff --git a/examples/c/bpf/libbpf_version.h b/examples/c/bpf/libbpf_version.h new file mode 100644 index 0000000..1fd2eea --- /dev/null +++ b/examples/c/bpf/libbpf_version.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (C) 2021 Facebook */ +#ifndef __LIBBPF_VERSION_H +#define __LIBBPF_VERSION_H + +#define LIBBPF_MAJOR_VERSION 1 +#define LIBBPF_MINOR_VERSION 2 + +#endif /* __LIBBPF_VERSION_H */ diff --git a/examples/c/bpf/relo_core.h b/examples/c/bpf/relo_core.h new file mode 100644 index 0000000..1c0566d --- /dev/null +++ b/examples/c/bpf/relo_core.h @@ -0,0 +1,99 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2019 Facebook */ + +#ifndef __RELO_CORE_H +#define __RELO_CORE_H + +#include + +struct bpf_core_cand { + const struct btf *btf; + __u32 id; +}; + +/* dynamically sized list of type IDs and its associated struct btf */ +struct bpf_core_cand_list { + struct bpf_core_cand *cands; + int len; +}; + +#define BPF_CORE_SPEC_MAX_LEN 64 + +/* represents BPF CO-RE field or array element accessor */ +struct bpf_core_accessor { + __u32 type_id; /* struct/union type or array element type */ + __u32 idx; /* field index or array index */ + const char *name; /* field name or NULL for array accessor */ +}; + +struct bpf_core_spec { + const struct btf *btf; + /* high-level spec: named fields and array indices only */ + struct bpf_core_accessor spec[BPF_CORE_SPEC_MAX_LEN]; + /* original unresolved (no skip_mods_or_typedefs) root type ID */ + __u32 root_type_id; + /* CO-RE relocation kind */ + enum bpf_core_relo_kind relo_kind; + /* high-level spec length */ + int len; + /* raw, low-level spec: 1-to-1 with accessor spec string */ + int raw_spec[BPF_CORE_SPEC_MAX_LEN]; + /* raw spec length */ + int raw_len; + /* field bit offset represented by spec */ + __u32 bit_offset; +}; + +struct bpf_core_relo_res { + /* expected value in the instruction, unless validate == false */ + __u64 orig_val; + /* new value that needs to be patched up to */ + __u64 new_val; + /* relocation unsuccessful, poison instruction, but don't fail load */ + bool poison; + /* some relocations can't be validated against orig_val */ + bool validate; + /* for field byte offset relocations or the forms: + * *(T *)(rX + ) = rY + * rX = *(T *)(rY + ), + * we remember original and resolved field size to adjust direct + * memory loads of pointers and integers; this is necessary for 32-bit + * host kernel architectures, but also allows to automatically + * relocate fields that were resized from, e.g., u32 to u64, etc. + */ + bool fail_memsz_adjust; + __u32 orig_sz; + __u32 orig_type_id; + __u32 new_sz; + __u32 new_type_id; +}; + +int __bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id, int level); +int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id); +int __bpf_core_types_match(const struct btf *local_btf, __u32 local_id, const struct btf *targ_btf, + __u32 targ_id, bool behind_ptr, int level); +int bpf_core_types_match(const struct btf *local_btf, __u32 local_id, const struct btf *targ_btf, + __u32 targ_id); + +size_t bpf_core_essential_name_len(const char *name); + +int bpf_core_calc_relo_insn(const char *prog_name, + const struct bpf_core_relo *relo, int relo_idx, + const struct btf *local_btf, + struct bpf_core_cand_list *cands, + struct bpf_core_spec *specs_scratch, + struct bpf_core_relo_res *targ_res); + +int bpf_core_patch_insn(const char *prog_name, struct bpf_insn *insn, + int insn_idx, const struct bpf_core_relo *relo, + int relo_idx, const struct bpf_core_relo_res *res); + +int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, + const struct bpf_core_relo *relo, + struct bpf_core_spec *spec); + +int bpf_core_format_spec(char *buf, size_t buf_sz, const struct bpf_core_spec *spec); + +#endif diff --git a/examples/c/bpf/skel_internal.h b/examples/c/bpf/skel_internal.h new file mode 100644 index 0000000..1e82ab0 --- /dev/null +++ b/examples/c/bpf/skel_internal.h @@ -0,0 +1,374 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2021 Facebook */ +#ifndef __SKEL_INTERNAL_H +#define __SKEL_INTERNAL_H + +#ifdef __KERNEL__ +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include "bpf.h" +#endif + +#ifndef __NR_bpf +# if defined(__mips__) && defined(_ABIO32) +# define __NR_bpf 4355 +# elif defined(__mips__) && defined(_ABIN32) +# define __NR_bpf 6319 +# elif defined(__mips__) && defined(_ABI64) +# define __NR_bpf 5315 +# endif +#endif + +/* This file is a base header for auto-generated *.lskel.h files. + * Its contents will change and may become part of auto-generation in the future. + * + * The layout of bpf_[map|prog]_desc and bpf_loader_ctx is feature dependent + * and will change from one version of libbpf to another and features + * requested during loader program generation. + */ +struct bpf_map_desc { + /* output of the loader prog */ + int map_fd; + /* input for the loader prog */ + __u32 max_entries; + __aligned_u64 initial_value; +}; +struct bpf_prog_desc { + int prog_fd; +}; + +enum { + BPF_SKEL_KERNEL = (1ULL << 0), +}; + +struct bpf_loader_ctx { + __u32 sz; + __u32 flags; + __u32 log_level; + __u32 log_size; + __u64 log_buf; +}; + +struct bpf_load_and_run_opts { + struct bpf_loader_ctx *ctx; + const void *data; + const void *insns; + __u32 data_sz; + __u32 insns_sz; + const char *errstr; +}; + +long kern_sys_bpf(__u32 cmd, void *attr, __u32 attr_size); + +static inline int skel_sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, + unsigned int size) +{ +#ifdef __KERNEL__ + return kern_sys_bpf(cmd, attr, size); +#else + return syscall(__NR_bpf, cmd, attr, size); +#endif +} + +#ifdef __KERNEL__ +static inline int close(int fd) +{ + return close_fd(fd); +} + +static inline void *skel_alloc(size_t size) +{ + struct bpf_loader_ctx *ctx = kzalloc(size, GFP_KERNEL); + + if (!ctx) + return NULL; + ctx->flags |= BPF_SKEL_KERNEL; + return ctx; +} + +static inline void skel_free(const void *p) +{ + kfree(p); +} + +/* skel->bss/rodata maps are populated the following way: + * + * For kernel use: + * skel_prep_map_data() allocates kernel memory that kernel module can directly access. + * Generated lskel stores the pointer in skel->rodata and in skel->maps.rodata.initial_value. + * The loader program will perform probe_read_kernel() from maps.rodata.initial_value. + * skel_finalize_map_data() sets skel->rodata to point to actual value in a bpf map and + * does maps.rodata.initial_value = ~0ULL to signal skel_free_map_data() that kvfree + * is not nessary. + * + * For user space: + * skel_prep_map_data() mmaps anon memory into skel->rodata that can be accessed directly. + * Generated lskel stores the pointer in skel->rodata and in skel->maps.rodata.initial_value. + * The loader program will perform copy_from_user() from maps.rodata.initial_value. + * skel_finalize_map_data() remaps bpf array map value from the kernel memory into + * skel->rodata address. + * + * The "bpftool gen skeleton -L" command generates lskel.h that is suitable for + * both kernel and user space. The generated loader program does + * either bpf_probe_read_kernel() or bpf_copy_from_user() from initial_value + * depending on bpf_loader_ctx->flags. + */ +static inline void skel_free_map_data(void *p, __u64 addr, size_t sz) +{ + if (addr != ~0ULL) + kvfree(p); + /* When addr == ~0ULL the 'p' points to + * ((struct bpf_array *)map)->value. See skel_finalize_map_data. + */ +} + +static inline void *skel_prep_map_data(const void *val, size_t mmap_sz, size_t val_sz) +{ + void *addr; + + addr = kvmalloc(val_sz, GFP_KERNEL); + if (!addr) + return NULL; + memcpy(addr, val, val_sz); + return addr; +} + +static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int flags, int fd) +{ + struct bpf_map *map; + void *addr = NULL; + + kvfree((void *) (long) *init_val); + *init_val = ~0ULL; + + /* At this point bpf_load_and_run() finished without error and + * 'fd' is a valid bpf map FD. All sanity checks below should succeed. + */ + map = bpf_map_get(fd); + if (IS_ERR(map)) + return NULL; + if (map->map_type != BPF_MAP_TYPE_ARRAY) + goto out; + addr = ((struct bpf_array *)map)->value; + /* the addr stays valid, since FD is not closed */ +out: + bpf_map_put(map); + return addr; +} + +#else + +static inline void *skel_alloc(size_t size) +{ + return calloc(1, size); +} + +static inline void skel_free(void *p) +{ + free(p); +} + +static inline void skel_free_map_data(void *p, __u64 addr, size_t sz) +{ + munmap(p, sz); +} + +static inline void *skel_prep_map_data(const void *val, size_t mmap_sz, size_t val_sz) +{ + void *addr; + + addr = mmap(NULL, mmap_sz, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (addr == (void *) -1) + return NULL; + memcpy(addr, val, val_sz); + return addr; +} + +static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int flags, int fd) +{ + void *addr; + + addr = mmap((void *) (long) *init_val, mmap_sz, flags, MAP_SHARED | MAP_FIXED, fd, 0); + if (addr == (void *) -1) + return NULL; + return addr; +} +#endif + +static inline int skel_closenz(int fd) +{ + if (fd > 0) + return close(fd); + return -EINVAL; +} + +#ifndef offsetofend +#define offsetofend(TYPE, MEMBER) \ + (offsetof(TYPE, MEMBER) + sizeof((((TYPE *)0)->MEMBER))) +#endif + +static inline int skel_map_create(enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, + __u32 value_size, + __u32 max_entries) +{ + const size_t attr_sz = offsetofend(union bpf_attr, map_extra); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + + attr.map_type = map_type; + strncpy(attr.map_name, map_name, sizeof(attr.map_name)); + attr.key_size = key_size; + attr.value_size = value_size; + attr.max_entries = max_entries; + + return skel_sys_bpf(BPF_MAP_CREATE, &attr, attr_sz); +} + +static inline int skel_map_update_elem(int fd, const void *key, + const void *value, __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = (long) key; + attr.value = (long) value; + attr.flags = flags; + + return skel_sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, attr_sz); +} + +static inline int skel_map_delete_elem(int fd, const void *key) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = (long)key; + + return skel_sys_bpf(BPF_MAP_DELETE_ELEM, &attr, attr_sz); +} + +static inline int skel_map_get_fd_by_id(__u32 id) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.map_id = id; + + return skel_sys_bpf(BPF_MAP_GET_FD_BY_ID, &attr, attr_sz); +} + +static inline int skel_raw_tracepoint_open(const char *name, int prog_fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, raw_tracepoint.prog_fd); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.raw_tracepoint.name = (long) name; + attr.raw_tracepoint.prog_fd = prog_fd; + + return skel_sys_bpf(BPF_RAW_TRACEPOINT_OPEN, &attr, attr_sz); +} + +static inline int skel_link_create(int prog_fd, int target_fd, + enum bpf_attach_type attach_type) +{ + const size_t attr_sz = offsetofend(union bpf_attr, link_create.iter_info_len); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.link_create.prog_fd = prog_fd; + attr.link_create.target_fd = target_fd; + attr.link_create.attach_type = attach_type; + + return skel_sys_bpf(BPF_LINK_CREATE, &attr, attr_sz); +} + +#ifdef __KERNEL__ +#define set_err +#else +#define set_err err = -errno +#endif + +static inline int bpf_load_and_run(struct bpf_load_and_run_opts *opts) +{ + const size_t prog_load_attr_sz = offsetofend(union bpf_attr, fd_array); + const size_t test_run_attr_sz = offsetofend(union bpf_attr, test); + int map_fd = -1, prog_fd = -1, key = 0, err; + union bpf_attr attr; + + err = map_fd = skel_map_create(BPF_MAP_TYPE_ARRAY, "__loader.map", 4, opts->data_sz, 1); + if (map_fd < 0) { + opts->errstr = "failed to create loader map"; + set_err; + goto out; + } + + err = skel_map_update_elem(map_fd, &key, opts->data, 0); + if (err < 0) { + opts->errstr = "failed to update loader map"; + set_err; + goto out; + } + + memset(&attr, 0, prog_load_attr_sz); + attr.prog_type = BPF_PROG_TYPE_SYSCALL; + attr.insns = (long) opts->insns; + attr.insn_cnt = opts->insns_sz / sizeof(struct bpf_insn); + attr.license = (long) "Dual BSD/GPL"; + memcpy(attr.prog_name, "__loader.prog", sizeof("__loader.prog")); + attr.fd_array = (long) &map_fd; + attr.log_level = opts->ctx->log_level; + attr.log_size = opts->ctx->log_size; + attr.log_buf = opts->ctx->log_buf; + attr.prog_flags = BPF_F_SLEEPABLE; + err = prog_fd = skel_sys_bpf(BPF_PROG_LOAD, &attr, prog_load_attr_sz); + if (prog_fd < 0) { + opts->errstr = "failed to load loader prog"; + set_err; + goto out; + } + + memset(&attr, 0, test_run_attr_sz); + attr.test.prog_fd = prog_fd; + attr.test.ctx_in = (long) opts->ctx; + attr.test.ctx_size_in = opts->ctx->sz; + err = skel_sys_bpf(BPF_PROG_RUN, &attr, test_run_attr_sz); + if (err < 0 || (int)attr.test.retval < 0) { + opts->errstr = "failed to execute loader prog"; + if (err < 0) { + set_err; + } else { + err = (int)attr.test.retval; +#ifndef __KERNEL__ + errno = -err; +#endif + } + goto out; + } + err = 0; +out: + if (map_fd >= 0) + close(map_fd); + if (prog_fd >= 0) + close(prog_fd); + return err; +} + +#endif diff --git a/examples/c/bpf/usdt.bpf.h b/examples/c/bpf/usdt.bpf.h new file mode 100644 index 0000000..0bd4c13 --- /dev/null +++ b/examples/c/bpf/usdt.bpf.h @@ -0,0 +1,250 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */ +#ifndef __USDT_BPF_H__ +#define __USDT_BPF_H__ + +#include +#include +#include + +/* Below types and maps are internal implementation details of libbpf's USDT + * support and are subjects to change. Also, bpf_usdt_xxx() API helpers should + * be considered an unstable API as well and might be adjusted based on user + * feedback from using libbpf's USDT support in production. + */ + +/* User can override BPF_USDT_MAX_SPEC_CNT to change default size of internal + * map that keeps track of USDT argument specifications. This might be + * necessary if there are a lot of USDT attachments. + */ +#ifndef BPF_USDT_MAX_SPEC_CNT +#define BPF_USDT_MAX_SPEC_CNT 256 +#endif +/* User can override BPF_USDT_MAX_IP_CNT to change default size of internal + * map that keeps track of IP (memory address) mapping to USDT argument + * specification. + * Note, if kernel supports BPF cookies, this map is not used and could be + * resized all the way to 1 to save a bit of memory. + */ +#ifndef BPF_USDT_MAX_IP_CNT +#define BPF_USDT_MAX_IP_CNT (4 * BPF_USDT_MAX_SPEC_CNT) +#endif + +enum __bpf_usdt_arg_type { + BPF_USDT_ARG_CONST, + BPF_USDT_ARG_REG, + BPF_USDT_ARG_REG_DEREF, +}; + +struct __bpf_usdt_arg_spec { + /* u64 scalar interpreted depending on arg_type, see below */ + __u64 val_off; + /* arg location case, see bpf_udst_arg() for details */ + enum __bpf_usdt_arg_type arg_type; + /* offset of referenced register within struct pt_regs */ + short reg_off; + /* whether arg should be interpreted as signed value */ + bool arg_signed; + /* number of bits that need to be cleared and, optionally, + * sign-extended to cast arguments that are 1, 2, or 4 bytes + * long into final 8-byte u64/s64 value returned to user + */ + char arg_bitshift; +}; + +/* should match USDT_MAX_ARG_CNT in usdt.c exactly */ +#define BPF_USDT_MAX_ARG_CNT 12 +struct __bpf_usdt_spec { + struct __bpf_usdt_arg_spec args[BPF_USDT_MAX_ARG_CNT]; + __u64 usdt_cookie; + short arg_cnt; +}; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, BPF_USDT_MAX_SPEC_CNT); + __type(key, int); + __type(value, struct __bpf_usdt_spec); +} __bpf_usdt_specs SEC(".maps") __weak; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, BPF_USDT_MAX_IP_CNT); + __type(key, long); + __type(value, __u32); +} __bpf_usdt_ip_to_spec_id SEC(".maps") __weak; + +extern const _Bool LINUX_HAS_BPF_COOKIE __kconfig; + +static __always_inline +int __bpf_usdt_spec_id(struct pt_regs *ctx) +{ + if (!LINUX_HAS_BPF_COOKIE) { + long ip = PT_REGS_IP(ctx); + int *spec_id_ptr; + + spec_id_ptr = bpf_map_lookup_elem(&__bpf_usdt_ip_to_spec_id, &ip); + return spec_id_ptr ? *spec_id_ptr : -ESRCH; + } + + return bpf_get_attach_cookie(ctx); +} + +/* Return number of USDT arguments defined for currently traced USDT. */ +__weak __hidden +int bpf_usdt_arg_cnt(struct pt_regs *ctx) +{ + struct __bpf_usdt_spec *spec; + int spec_id; + + spec_id = __bpf_usdt_spec_id(ctx); + if (spec_id < 0) + return -ESRCH; + + spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); + if (!spec) + return -ESRCH; + + return spec->arg_cnt; +} + +/* Fetch USDT argument #*arg_num* (zero-indexed) and put its value into *res. + * Returns 0 on success; negative error, otherwise. + * On error *res is guaranteed to be set to zero. + */ +__weak __hidden +int bpf_usdt_arg(struct pt_regs *ctx, __u64 arg_num, long *res) +{ + struct __bpf_usdt_spec *spec; + struct __bpf_usdt_arg_spec *arg_spec; + unsigned long val; + int err, spec_id; + + *res = 0; + + spec_id = __bpf_usdt_spec_id(ctx); + if (spec_id < 0) + return -ESRCH; + + spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); + if (!spec) + return -ESRCH; + + if (arg_num >= BPF_USDT_MAX_ARG_CNT) + return -ENOENT; + barrier_var(arg_num); + if (arg_num >= spec->arg_cnt) + return -ENOENT; + + arg_spec = &spec->args[arg_num]; + switch (arg_spec->arg_type) { + case BPF_USDT_ARG_CONST: + /* Arg is just a constant ("-4@$-9" in USDT arg spec). + * value is recorded in arg_spec->val_off directly. + */ + val = arg_spec->val_off; + break; + case BPF_USDT_ARG_REG: + /* Arg is in a register (e.g, "8@%rax" in USDT arg spec), + * so we read the contents of that register directly from + * struct pt_regs. To keep things simple user-space parts + * record offsetof(struct pt_regs, ) in arg_spec->reg_off. + */ + err = bpf_probe_read_kernel(&val, sizeof(val), (void *)ctx + arg_spec->reg_off); + if (err) + return err; + break; + case BPF_USDT_ARG_REG_DEREF: + /* Arg is in memory addressed by register, plus some offset + * (e.g., "-4@-1204(%rbp)" in USDT arg spec). Register is + * identified like with BPF_USDT_ARG_REG case, and the offset + * is in arg_spec->val_off. We first fetch register contents + * from pt_regs, then do another user-space probe read to + * fetch argument value itself. + */ + err = bpf_probe_read_kernel(&val, sizeof(val), (void *)ctx + arg_spec->reg_off); + if (err) + return err; + err = bpf_probe_read_user(&val, sizeof(val), (void *)val + arg_spec->val_off); + if (err) + return err; +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + val >>= arg_spec->arg_bitshift; +#endif + break; + default: + return -EINVAL; + } + + /* cast arg from 1, 2, or 4 bytes to final 8 byte size clearing + * necessary upper arg_bitshift bits, with sign extension if argument + * is signed + */ + val <<= arg_spec->arg_bitshift; + if (arg_spec->arg_signed) + val = ((long)val) >> arg_spec->arg_bitshift; + else + val = val >> arg_spec->arg_bitshift; + *res = val; + return 0; +} + +/* Retrieve user-specified cookie value provided during attach as + * bpf_usdt_opts.usdt_cookie. This serves the same purpose as BPF cookie + * returned by bpf_get_attach_cookie(). Libbpf's support for USDT is itself + * utilizing BPF cookies internally, so user can't use BPF cookie directly + * for USDT programs and has to use bpf_usdt_cookie() API instead. + */ +__weak __hidden +long bpf_usdt_cookie(struct pt_regs *ctx) +{ + struct __bpf_usdt_spec *spec; + int spec_id; + + spec_id = __bpf_usdt_spec_id(ctx); + if (spec_id < 0) + return 0; + + spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); + if (!spec) + return 0; + + return spec->usdt_cookie; +} + +/* we rely on ___bpf_apply() and ___bpf_narg() macros already defined in bpf_tracing.h */ +#define ___bpf_usdt_args0() ctx +#define ___bpf_usdt_args1(x) ___bpf_usdt_args0(), ({ long _x; bpf_usdt_arg(ctx, 0, &_x); (void *)_x; }) +#define ___bpf_usdt_args2(x, args...) ___bpf_usdt_args1(args), ({ long _x; bpf_usdt_arg(ctx, 1, &_x); (void *)_x; }) +#define ___bpf_usdt_args3(x, args...) ___bpf_usdt_args2(args), ({ long _x; bpf_usdt_arg(ctx, 2, &_x); (void *)_x; }) +#define ___bpf_usdt_args4(x, args...) ___bpf_usdt_args3(args), ({ long _x; bpf_usdt_arg(ctx, 3, &_x); (void *)_x; }) +#define ___bpf_usdt_args5(x, args...) ___bpf_usdt_args4(args), ({ long _x; bpf_usdt_arg(ctx, 4, &_x); (void *)_x; }) +#define ___bpf_usdt_args6(x, args...) ___bpf_usdt_args5(args), ({ long _x; bpf_usdt_arg(ctx, 5, &_x); (void *)_x; }) +#define ___bpf_usdt_args7(x, args...) ___bpf_usdt_args6(args), ({ long _x; bpf_usdt_arg(ctx, 6, &_x); (void *)_x; }) +#define ___bpf_usdt_args8(x, args...) ___bpf_usdt_args7(args), ({ long _x; bpf_usdt_arg(ctx, 7, &_x); (void *)_x; }) +#define ___bpf_usdt_args9(x, args...) ___bpf_usdt_args8(args), ({ long _x; bpf_usdt_arg(ctx, 8, &_x); (void *)_x; }) +#define ___bpf_usdt_args10(x, args...) ___bpf_usdt_args9(args), ({ long _x; bpf_usdt_arg(ctx, 9, &_x); (void *)_x; }) +#define ___bpf_usdt_args11(x, args...) ___bpf_usdt_args10(args), ({ long _x; bpf_usdt_arg(ctx, 10, &_x); (void *)_x; }) +#define ___bpf_usdt_args12(x, args...) ___bpf_usdt_args11(args), ({ long _x; bpf_usdt_arg(ctx, 11, &_x); (void *)_x; }) +#define ___bpf_usdt_args(args...) ___bpf_apply(___bpf_usdt_args, ___bpf_narg(args))(args) + +/* + * BPF_USDT serves the same purpose for USDT handlers as BPF_PROG for + * tp_btf/fentry/fexit BPF programs and BPF_KPROBE for kprobes. + * Original struct pt_regs * context is preserved as 'ctx' argument. + */ +#define BPF_USDT(name, args...) \ +name(struct pt_regs *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_usdt_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args) + +#endif /* __USDT_BPF_H__ */ diff --git a/examples/c/btf_file/a13-5.10-2022-06-arm64.btf b/examples/c/btf_file/a13-5.10-2022-06-arm64.btf new file mode 100755 index 0000000..149874d Binary files /dev/null and b/examples/c/btf_file/a13-5.10-2022-06-arm64.btf differ diff --git a/examples/c/common.h b/examples/c/common.h new file mode 100644 index 0000000..bd45743 --- /dev/null +++ b/examples/c/common.h @@ -0,0 +1,13 @@ + + +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2020 Andrii Nakryiko */ +#ifndef __COMMON_H +#define __COMMON_H + +struct mydata_t{ + unsigned int __nr_running; + int __cpu; +}; + +#endif /* __COMMON_H */ \ No newline at end of file diff --git a/examples/c/egypt-1.11.tar.gz b/examples/c/egypt-1.11.tar.gz new file mode 100644 index 0000000..55d2b9e Binary files /dev/null and b/examples/c/egypt-1.11.tar.gz differ diff --git a/examples/c/egypt-1.11/CHANGES b/examples/c/egypt-1.11/CHANGES new file mode 100644 index 0000000..6c6a674 --- /dev/null +++ b/examples/c/egypt-1.11/CHANGES @@ -0,0 +1,44 @@ + +-- 1.11 released -- + +Miscellaneous bug fixes. + +New command line option --cluster-by-file. + +New command line options --callees and --callers. + +Support omitting external functions using the --omit option. + +Support new RTL dump function comment syntax of gcc versions 7 and 10. + +New command line option --summarize-callers. + +-- 1.10 released -- + +Support the RTL function comment syntax of gcc 4.4.0 +when compiling for ARM. + +-- 1.9 released -- + +Support the new RTL function comment syntax of gcc 4.7. + +-- 1.8 released -- + +Deal with CRLF terminated RTL files. + +The graph now includes any functions that are defined in the +compilation unit but do not call nor get called by other functions. + +-- 1.7 released -- + +Added this file. + +Added more text about indirect calls to man page. + +Documented the C++ demangling support. + +Ignore caret prefix on ARM short calls (from Lennert Buytenhek). + +Escape quote characters in demangled C++ names. + +-- 1.6 released -- diff --git a/examples/c/egypt-1.11/MANIFEST b/examples/c/egypt-1.11/MANIFEST new file mode 100644 index 0000000..d8a0474 --- /dev/null +++ b/examples/c/egypt-1.11/MANIFEST @@ -0,0 +1,6 @@ +MANIFEST This file +CHANGES Change log +Makefile.PL Makefile generator +egypt The program +META.yml Module meta-data (added by MakeMaker) +META.json Module JSON meta-data (added by MakeMaker) diff --git a/examples/c/egypt-1.11/META.json b/examples/c/egypt-1.11/META.json new file mode 100644 index 0000000..2284629 --- /dev/null +++ b/examples/c/egypt-1.11/META.json @@ -0,0 +1,37 @@ +{ + "abstract" : "A tool for creating call graphs of C programs", + "author" : [ + "Andreas Gustafsson" + ], + "dynamic_config" : 1, + "generated_by" : "ExtUtils::MakeMaker version 7.62, CPAN::Meta::Converter version 2.150010", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : 2 + }, + "name" : "egypt", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + } + }, + "release_status" : "stable", + "version" : "1.11", + "x_serialization_backend" : "JSON::PP version 4.06" +} diff --git a/examples/c/egypt-1.11/META.yml b/examples/c/egypt-1.11/META.yml new file mode 100644 index 0000000..9e97da1 --- /dev/null +++ b/examples/c/egypt-1.11/META.yml @@ -0,0 +1,21 @@ +--- +abstract: 'A tool for creating call graphs of C programs' +author: + - 'Andreas Gustafsson' +build_requires: + ExtUtils::MakeMaker: '0' +configure_requires: + ExtUtils::MakeMaker: '0' +dynamic_config: 1 +generated_by: 'ExtUtils::MakeMaker version 7.62, CPAN::Meta::Converter version 2.150010' +license: unknown +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: '1.4' +name: egypt +no_index: + directory: + - t + - inc +version: '1.11' +x_serialization_backend: 'CPAN::Meta::YAML version 0.018' diff --git a/examples/c/egypt-1.11/Makefile.PL b/examples/c/egypt-1.11/Makefile.PL new file mode 100644 index 0000000..6c8d692 --- /dev/null +++ b/examples/c/egypt-1.11/Makefile.PL @@ -0,0 +1,8 @@ +use strict; +use ExtUtils::MakeMaker; +WriteMakefile(NAME => 'egypt', + AUTHOR => 'Andreas Gustafsson', + VERSION_FROM => 'egypt', + ABSTRACT => 'A tool for creating call graphs of C programs', + EXE_FILES => [ 'egypt' ] + ); diff --git a/examples/c/egypt-1.11/egypt b/examples/c/egypt-1.11/egypt new file mode 100755 index 0000000..9473ba3 --- /dev/null +++ b/examples/c/egypt-1.11/egypt @@ -0,0 +1,629 @@ +#!/usr/bin/perl -w + +=head1 NAME + +egypt - create call graph from gcc RTL dump + +=head1 SYNOPISIS + + egypt ... | dotty - + egypt ... | dot + +=head1 DESCRIPTION + +Egypt is a simple tool for creating call graphs of C programs. + +=head1 OPTIONS + +=over 8 + +=item --callers function,function... + +Show only the given function(s) and their callers, recursively +including all functions from which the given functions can be +reached. Taking the address of a function is considered +equivalent to a call for the purpose of determining reachability. +For the supported forms of the "function" arguments, see the +section titled "Selecting functions". + +=item --callees function,function... + +Show only the given function(s) and their callees, recursively +including all functions that can be reached from the given functions. +Taking the address of a function is considered equivalent to a call +for the purpose of determining reachability. +For the supported forms of the "function" arguments, see the +section titled "Selecting functions". + +=item --cluster-by-file + +Create a Graphviz cluster for each input file, containing the +functions defined in that file. + +=item --include-external + +Include calls to external functions in the call graph. A function is +considered external if it is not defined in any of the input files. +For example, functions in the standard C library are external. Only +direct function calls will be displayed; there is no way to display +the action of taking the address of an external function. + +=item --omit function,function... + +Omit the given function(s) from the call graph. +For the supported forms of the "function" arguments, see the +section titled "Selecting functions". + +=item --summarize-callers n + +When a function has n or more callers, don't show show a separate +arrow for each caller, but just a single arrow from a pseudo-node +indicating the number of callers. This is useful to reduce clutter +resulting from utility functions called in a large number of places. + +=back + +=head1 HOW IT WORKS + +The two major tasks in creating a call graph are analyzing the syntax +of the source code to find the function calls and laying out the +graph, but Egypt actually does neither. Instead, it delegates the +source code analysis to GCC and the graph layout to Graphviz, both of +which are better at their respective jobs than egypt could ever hope +to be itself. Egypt itself is just a small Perl script that acts as +glue between these existing tools. + +Egypt takes advantage of GCC's capability to dump an intermediate +representation of the program being compiled into a file (a I); this file is much easier to extract information from than a C +source file. Egypt extracts information about function calls from the +RTL file and massages it into the format used by Graphviz. + +=head1 GENERATING THE RTL FILE + +Compile the program or source file you want to create a call graph for +with gcc, adding the option "-fdump-rtl-expand" to CFLAGS. This +option causes gcc to dump its intermediate code representation of each +file it compiles into a file. In old versions of GCC this option +was called "-dr", but GCC 4.4.0 and newer accept only the +"-fdump-rtl-expand" form. For best results, compile without +optimization. + +For example, the following works for many programs: + + make clean + make CFLAGS=-fdump-rtl-expand + +Depending on the GCC version, the RTL file for a source file F +may be called something like F, F, +F, or F. + +=head1 SELECTING FUNCTIONS + +In the command line options that take function names as arguments, +multiple C function names can be given separated by commas. + +C++ functions names can be given either in their name-mangled or +demangled form; see the section titled "C++ Support" for details about +demangling. Because the demangled form can include commas, multiple +functions must be given by specifying the command line option multiple +times rather than as a single option with a comma-separated argument. + +=head1 VIEWING THE CALL GRAPH + +To view the call graph in an X11 window, run egypt with one or +more RTL files as command line arguments and pipe its output to the +B program from the Graphviz package. For example, if you +compiled F with C to +generate F, you can use + + egypt foo.c.229r.expand | dotty - + +If the program contains many source files, consider using +shell wildcards or the B command: + + egypt *.expand | dotty - + egypt $(find . -name '*.expand' -print) | dotty - + +=head1 PRINTING THE CALL GRAPH + +To convert the call graph into a file format suitable for printing or +embedding into a document, use the use the B program from the +Graphviz package. + +For example, to generate a PDF file F +fitting everything on a US letter size page in landscape mode, try + + egypt *.expand | dot -Grotate=90 -Gsize=11,8.5 -Tpdf -o callgraph.pdf + +Sometimes, the graph will fit better if function calls go from left to +right instead of top to bottom. The B option B<-Grankdir=LR> +will do that: + + egypt *.expand | dot -Gsize=8.5,11 -Grankdir=LR -Tpdf -o callgraph.pdf + +For nontrivial programs, the graph may end up too small +to comfortably read. If that happens, try N-up printing +using the PostScript driver: + + egypt *.expand | dot -Gpage=8.5,11 -Tps -o callgraph.ps + +You can also try playing with other B options such as B<-Gratio>, +or for a different style of graph, try using B instead of +B. See the Graphviz documentation for more information about the +various options available for customizing the style of the graph +and the supported output file formats. + +=head1 READING THE CALL GRAPH + +Function calls are displayed as solid arrows. A dotted arrow means +that the function the arrow points from takes the address of the +function the arrow points to. + +=head1 INDIRECT FUNCTION CALLS + +Egypt does not display indirect function calls. Doing that is +impossible in the general case: determining which functions will call +each other indirectly at runtime would require solving the halting +problem. + +The dotted arrows generated by egypt are sometimes misunderstood to +represent indirect calls, but they actually represent +taking the address of a function, resulting in a function pointer. +That function pointer will typically be used to make an indirect +function call at some later time, but the call is not necessarily made +from the same function where there address was taken, and it is +generally not possible to determine where or even whether that call +will take place. + +The dotted arrows may or may not be useful for understanding the +program structure depending on the particular style of programming +used. One case where they are often useful is with event-driven +programs where a sequence of events is handled by a chain of callback +functions, each one registering the address of the next with the event +handling framework before returning to the event loop. In such a +program, the dotted arrows will indicate which callbacks cause which +other callbacks to be invoked; such a graph may to be more useful than +a graph of the actual indirect calls, which would just show the event +loop calling every callback. + +=head1 C++ SUPPORT + +Egypt provides limited support for C++. Producing readable call +graphs from C++ is more challenging than the C case because the fully +qualified names of C++ functions tend to be long, especially when +using templates. + +Egypt attempts to automatically demangle C++ function names and +display them in in the native C++ syntax. This demangling support +relies on comments in the RTL output generated by GCC, and the exact +format of the demangled names varies between GCC versions. Some +include the return type and argument list (e.g., gcc 7.5.0), while +others don't (e.g., gcc 10.2), so the same member function can appear +in the call graph as either C or just C +depending on the GCC version. If GCC does not include the argument +list, overloaded functions will appear in the graph as distinct nodes +with identical labels. + +When specifying C++ function names on the command line using the +demangled form, they must be given exactly as they appear in +the call graph using your version of GCC, including any +embedded whitespace. Shell quoting may be needed to preserve +whitespace or special characters in the function name. + +Egypt will not display virtual function calls, because there is no +easy way to determine which virtual function is being called +based on the RTL. Inline functions may be subsumed into their +callers. + +When using the C<--include-external> option to display external C++ +functions, such as those in the C++ standard library, they will be +displayed in their name mangled form, and when they are given as +arguments to command line options, they must be given in their name +mangled form. + +=head1 WHY IS IT CALLED EGYPT? + +The original plan was to call it B, short for I, +but it turned out to be one of those rare cases where ROT13'ing the +name made it easier to remember and pronounce. + +=head1 SEE ALSO + +L, L, L, L + +=head1 COPYRIGHT + +Copyright 1994-2022 Andreas Gustafsson + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Andreas Gustafsson + +=cut + +use strict; +use Getopt::Long; + +use vars qw($VERSION); + +$VERSION = "1.11"; + +# Call structure data indexed by calling function name. This is a +# reference to a hash table where the key is a the name of a function +# (the caller) and the value is a reference to another hash table of +# attributes of that function. +# +# For internal functions (those defined in the RTL), the 'calls' +# attribute is a reference to an inner hash table indexed by the name +# of a symbol referenced by the caller (the potential callee) and a +# value of "call" (if the reference is a direct function call) or +# "ref" (if the reference is a non-function-call symbol reference; if +# the referenced symbol itself turns out to be a function, this will +# be considered an indirect function call). +# +# For external functions (those called from the RTL but not defined in +# the RTL), the inner hash table is empty. To check if a function +# is internal, you can check for the presence of the 'file' attribute. + +my $funcs = { }; + +# The current function +my $curfunc; + +# Functions to omit, as an array +my @omit = (); +# Ditto as a hash +my %omit_map; + +# Values of command line options +my @callers_of; +my @callees_of; +my $include_external = 0; +my $cluster_by_file = 0; +my $summarize_callers; + +# Map from demangled to mangled C++ function name +my $mangle_map = { }; + +# Mapping from symbol reference types to dot styles + +my $styles = { + call => 'solid', + ref => 'dotted' +}; + +# Convert a Perl string into a dot string + +sub dot_string { + my ($s) = @_; + # Escape embedded quotes + $s =~ s/\"/\\\"/g; + # Surround with qotes + return "\"$s\""; +} + +GetOptions('omit=s' => \@omit, + 'callers=s' => \@callers_of, + 'callees=s' => \@callees_of, + 'include-external' => \$include_external, + 'cluster-by-file' => \$cluster_by_file, + 'summarize-callers=i' => \$summarize_callers); + +# Given a list of one or more items that can each contain +# lists of comma-separated items, return a list where the +# comma-separated items have been expanded. Any items +# containing parentheses are left alone. + +sub split_function_list { + return map { + m/[\(\)]/ ? $_ : split(/,/, $_); + } @_; +} + +@omit = split_function_list(@omit); +@callees_of = split_function_list(@callees_of); +@callers_of = split_function_list(@callers_of); + +# Called at the start of each new function in the RTL + +sub enter_func { + my ($funcname, $source_fn) = @_; + $curfunc = $funcname; + $funcs->{$funcname}->{file} = $source_fn; +} + +# Register a function call in the global $funcs + +sub save_call { + my ($caller, $callee, $reftype) = @_; + # ARM short calls are flagged with a caret prefix; ignore it + $callee =~ s/^\^+//; + # Store the reference type, but if a direct call to a function + # is followed by taking the address of the same function, + # keep it as a direct call. + if (! exists($funcs->{$caller}->{'calls'}->{$callee})) { + $funcs->{$caller}->{'calls'}->{$callee} = $reftype; + } + # Create a node for the callee if it doesn't have one already, + # just in case it's an external function, since those don't + # get a node otherwise. + if ($reftype eq 'call' && ! exists($funcs->{$callee})) { + $funcs->{$callee} = { }; + } +} + +# Read the RTL + +foreach my $fn (@ARGV) { + open(my $fh, "<", $fn) + or die "open: $fn: $!\n"; + + # Find the original source file name by stripping the last two + # filename extensions (e.g., .229r.expand) + my @parts = split('\.', $fn); + my $source_fn = join('.', @parts[0..$#parts-2]); + + while (<$fh>) { + chomp; + # Look for a comment indicating the start of a function + if (/^;; Function (\S+)\s*$/) { + # pre-gcc4 style + enter_func($1, $source_fn); + } elsif (/^;; Function (.*)\s+\((\S+)(,.*)?\).*$/) { + # gcc4 style - $1 is the human readable name, and $2 is the mangled name + # Compiling for ARM, it can look like ";; Function foo (foo)[0:3]" + my ($unmangled, $mangled) = ($1, $2); + # As of gcc 7.5.0, the ";; Function" comments and the function + # calls use different name manglings for constructors: the + # comment contains C2 ("base object contructor"), but the + # calls contain C1 ("complete object constructor"). + # Destructors have a corresponding issue with D1 vs D2. Work + # around this by replacing C2/D2 by C1/D1 as needed. This is + # intended to fix the common case of code that does not use + # virtual base classes (not to be confused with virtual + # functions or abstract base classes). It has not been tested + # with code that does use virtual base classes, and will quite + # possibly break that case. + if ($mangled =~ /(_ZN(\d+))(.*)/) { + my ($prefix, $c2_pos, $suffix) = ($1, $2, $3); + my $sub = substr($suffix, $c2_pos, 2); + if ($sub eq 'C2' || $sub eq 'D2') { + substr($suffix, $c2_pos + 1, 1) = '1'; + my $remangled = $prefix . $suffix; + $mangled = $remangled; + } + } + enter_func($mangled, $source_fn); + if ($unmangled ne $mangled) { + $mangle_map->{$unmangled} = $mangled; + # Use the unmangled C++ name as the label + $funcs->{$curfunc}->{'attrs'}->{'label'} = $unmangled; + } + } + + # Look for a function call or symbol reference. + if (/^.*\(call.*"(.*)".*$/) { + save_call($curfunc, $1, 'call'); + } elsif (/^.*\(symbol_ref[^"]*"([^"]*)".*$/) { + # The first quoted string after symbol_ref is a symbol being + # referenced by the current function (it may be followed by + # other strings such as a file name). This could be the name + # of another function or of some data variable; we save the + # reference regardless, and will ignore it later on if it + # turns out not to match a known function. + save_call($curfunc, $1, 'ref'); + } + } + close($fh); +} + +# Mangle a function name + +sub mangle { + my ($f) = @_; + my $m = $mangle_map->{$f}; + if ($m) { + return $m; + } elsif (defined($funcs->{$f})) { + return $f; + } else { + warn "warning: unknown function \"$f\" ignored\n"; + return (); + } +} + +@omit = map { mangle($_); } @omit; +@callees_of = map { mangle($_) } @callees_of; +@callers_of = map { mangle($_) } @callers_of; + +delete @$funcs{@omit}; + +@omit_map{@omit} = (); + +my $genid = "node00000000"; + +# Depth-first search: add the function $f to $set, and then +# recursively walk its callers or callees (as determined by $key) and +# add them, too, if they are not already in the set. +# Uses the global $funcs. + +sub dfs { + my ($set, $f, $key) = @_; + $set->{$f} = undef; + # Guard against autovivification + if (exists($funcs->{$f})) { + if (exists($funcs->{$f}->{$key})) { + foreach my $g (keys %{$funcs->{$f}->{$key}}) { + if (! exists($set->{$g})) { + dfs($set, $g, $key); + } + } + } + } +} + +# Find the functions reachable from the list of functions @$fs, +# returning a set (as a hash with values of undef). + +sub functions_reachable_from { + my ($fs, $key) = @_; + my $set = { }; + foreach my $f (@$fs) { + dfs($set, $f, $key); + } + return $set; +} + +# Update $funcs to add a reverse index for finding callers given their +# callees. Adds a new key "sllac" ("calls" backwards) to each +# called function. + +sub make_reverse_index { + my ($funcs) = @_; + my @fs = keys %$funcs; + foreach my $f (@fs) { + my $attrs = $funcs->{$f}; + my $calls = $attrs->{calls}; + foreach my $g (keys %$calls) { + my $type = $calls->{$g}; # call or ref + $funcs->{$g}->{sllac}->{$f} = $type; + } + } +} + +# Delete all functions in $funcs not in $keep, as well as all calls to +# the deleted functions. + +sub cull { + my ($funcs, $keep) = @_; + foreach my $f (keys %$funcs) { + if (! exists($keep->{$f})) { + delete $funcs->{$f}; + } else { + my $calls = $funcs->{$f}->{calls}; + foreach my $g (keys %$calls) { + if (! exists($keep->{$g})) { + delete $calls->{$g}; + } + } + } + } +} + +if (@callees_of) { + cull($funcs, functions_reachable_from([@callees_of], 'calls')); +} +if (@callers_of) { + make_reverse_index($funcs); + cull($funcs, functions_reachable_from([@callers_of], 'sllac')); +} + +# Handle summarize_callers + +if (defined($summarize_callers)) { + my %n_incoming_calls; + # Count the incoming calls + foreach my $caller (keys %{$funcs}) { + foreach my $callee (keys %{$funcs->{$caller}->{'calls'}}) { + $n_incoming_calls{$callee}++; + } + } + # Delete the usual arrows + foreach my $caller (keys %{$funcs}) { + foreach my $callee (keys %{$funcs->{$caller}->{'calls'}}) { + if ($n_incoming_calls{$callee} >= $summarize_callers) { + delete $funcs->{$caller}->{'calls'}->{$callee}; + } + } + } + # Add summary arrows instead + while (my ($callee, $n_calls) = each %n_incoming_calls) { + if ($n_calls >= $summarize_callers) { + my $id = $genid++; + $funcs->{$id}->{'is_summary'} = 1; + $funcs->{$id}->{'attrs'}->{'shape'} = 'plaintext'; + # XXX call/ref distinction + $funcs->{$id}->{'calls'}->{$callee} = 'call'; + $funcs->{$id}->{'attrs'}->{'label'} = "$n_calls callers"; + } + } +} + +# Return true iff we should show a call of type $reftype to +# the function $callee. + +sub show_call_p { + # If the referenced symbol is not a defined function + # or a direct call to an external function, ignore it. + my ($reftype, $callee) = @_; + my $r = (exists($funcs->{$callee}->{file}) or + ($include_external and $reftype eq 'call' + and ! exists $omit_map{$callee})); + return $r; +} + +print "digraph callgraph {\n"; + +# Nodes + +foreach my $f (sort keys %$funcs) { + # Omit nodes for external functions without --include-external + next if ! $include_external and + ! (exists($funcs->{$f}->{file}) or exists($funcs->{$f}->{is_summary})); + my $a = $funcs->{$f}->{'attrs'} || { }; + # If externals are hidden, hide their summary nodes, too. + # Otherwise, we might get a node like "42 callers" with no + # callee, because that callee is a hidden printf(). + if (exists $funcs->{$f}->{'is_summary'}) { + my @callees = keys %{$funcs->{$f}->{'calls'}}; + @callees == 1 or die; + next if ! show_call_p('call', $callees[0]); + } + my $attrs_str = join(" ", map { + my $val = dot_string($a->{$_}); + "$_=$val" + } sort keys %$a); + my $f_s = dot_string($f); + print "$f_s [$attrs_str];\n"; +} + +# Edges + +foreach my $caller (sort keys %{$funcs}) { + foreach my $callee (sort keys %{$funcs->{$caller}->{'calls'}}) { + my $reftype = $funcs->{$caller}->{'calls'}->{$callee}; + next unless show_call_p($reftype, $callee); + my $style = $styles->{$reftype}; + my $caller_s = dot_string($caller); + my $callee_s = dot_string($callee); + print "$caller_s -> $callee_s [style=$style];\n"; + } +} + +# Subgraphs + +if ($cluster_by_file) { + # Mapping from source file name to a list of function names + my $funcs_by_file = { }; + foreach my $func (sort keys %{$funcs}) { + my $attrs = $funcs->{$func}; + if (exists($attrs->{file})) { + my $fn = $attrs->{file}; + push(@{$funcs_by_file->{$fn}}, $func); + } + } + foreach my $fn (sort keys %{$funcs_by_file}) { + print "subgraph ", dot_string("cluster_" . $fn), " {\n"; + print "label=", dot_string($fn), "\n"; + foreach my $func (@{$funcs_by_file->{$fn}}) { + print dot_string($func), ";\n"; + } + print "}\n"; + } +} + +print "}\n"; diff --git a/examples/c/fentry.bpf.c b/examples/c/fentry.bpf.c new file mode 100644 index 0000000..baf5575 --- /dev/null +++ b/examples/c/fentry.bpf.c @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2021 Sartura */ +#include "vmlinux.h" +#include +#include + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("fentry/do_unlinkat") +int BPF_PROG(do_unlinkat, int dfd, struct filename *name) +{ + pid_t pid; + + pid = bpf_get_current_pid_tgid() >> 32; + bpf_printk("fentry: pid = %d, filename = %s\n", pid, name->name); + return 0; +} + +SEC("fexit/do_unlinkat") +int BPF_PROG(do_unlinkat_exit, int dfd, struct filename *name, long ret) +{ + pid_t pid; + + pid = bpf_get_current_pid_tgid() >> 32; + bpf_printk("fexit: pid = %d, filename = %s, ret = %ld\n", pid, name->name, ret); + return 0; +} diff --git a/examples/c/fentry.c b/examples/c/fentry.c new file mode 100644 index 0000000..9daa67f --- /dev/null +++ b/examples/c/fentry.c @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2021 Sartura + * Based on minimal.c by Facebook */ + +#include +#include +#include +#include +#include +#include +#include +#include "fentry.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile sig_atomic_t stop; + +void sig_int(int signo) +{ + stop = 1; +} + +int main(int argc, char **argv) +{ + struct fentry_bpf *skel; + int err; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Open load and verify BPF application */ + skel = fentry_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* Attach tracepoint handler */ + err = fentry_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + if (signal(SIGINT, sig_int) == SIG_ERR) { + fprintf(stderr, "can't set signal handler: %s\n", strerror(errno)); + goto cleanup; + } + + printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " + "to see output of the BPF programs.\n"); + + while (!stop) { + fprintf(stderr, "."); + sleep(1); + } + +cleanup: + fentry_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/kprobe.bpf.c b/examples/c/kprobe.bpf.c new file mode 100644 index 0000000..24da3f3 --- /dev/null +++ b/examples/c/kprobe.bpf.c @@ -0,0 +1,38 @@ +/* + * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git + * @Date: 2023-08-26 16:04:37 + * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git + * @LastEditTime: 2023-08-28 19:31:53 + * @FilePath: /libbpf-bootstrap-arm/examples/c/kprobe.bpf.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看é…ç½® 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2021 Sartura */ +#include "vmlinux.h" +#include "bpf/bpf_helpers.h" +#include "bpf/bpf_tracing.h" +#include "bpf/bpf_core_read.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("kprobe/do_unlinkat") +int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) +{ + pid_t pid; + const char *filename; + + pid = bpf_get_current_pid_tgid() >> 32; + filename = BPF_CORE_READ(name, name); + bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename); + return 0; +} + +SEC("kretprobe/do_unlinkat") +int BPF_KRETPROBE(do_unlinkat_exit, long ret) +{ + pid_t pid; + + pid = bpf_get_current_pid_tgid() >> 32; + bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); + return 0; +} diff --git a/examples/c/kprobe.c b/examples/c/kprobe.c new file mode 100644 index 0000000..d45b9a8 --- /dev/null +++ b/examples/c/kprobe.c @@ -0,0 +1,70 @@ +/* + * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git + * @Date: 2023-08-16 10:20:56 + * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git + * @LastEditTime: 2023-08-28 19:32:13 + * @FilePath: /libbpf-bootstrap-arm/examples/c/kprobe.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看é…ç½® 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2021 Sartura + * Based on minimal.c by Facebook */ + +#include +#include +#include +#include +#include +#include +#include "bpf/libbpf.h" +#include "kprobe.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile sig_atomic_t stop; + +static void sig_int(int signo) +{ + stop = 1; +} + +int main(int argc, char **argv) +{ + struct kprobe_bpf *skel; + int err; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Open load and verify BPF application */ + skel = kprobe_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + /* Attach tracepoint handler */ + err = kprobe_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + if (signal(SIGINT, sig_int) == SIG_ERR) { + fprintf(stderr, "can't set signal handler: %s\n", strerror(errno)); + goto cleanup; + } + + printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " + "to see output of the BPF programs.\n"); + + while (!stop) { + + } + +cleanup: + kprobe_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/ksyscall.bpf.c b/examples/c/ksyscall.bpf.c new file mode 100644 index 0000000..27a496a --- /dev/null +++ b/examples/c/ksyscall.bpf.c @@ -0,0 +1,53 @@ +#include "vmlinux.h" +#include +#include +#include + +#define TASK_COMM_LEN 16 + +SEC("ksyscall/tgkill") +int BPF_KSYSCALL(tgkill_entry, pid_t tgid, pid_t tid, int sig) +{ + char comm[TASK_COMM_LEN]; + __u32 caller_pid = bpf_get_current_pid_tgid() >> 32; + + if (sig == 0) { + /* + If sig is 0, then no signal is sent, but existence and permission + checks are still performed; this can be used to check for the + existence of a process ID or process group ID that the caller is + permitted to signal. + */ + return 0; + } + + bpf_get_current_comm(&comm, sizeof(comm)); + bpf_printk( + "tgkill syscall called by PID %d (%s) for thread id %d with pid %d and signal %d.", + caller_pid, comm, tid, tgid, sig); + return 0; +} + +SEC("ksyscall/kill") +int BPF_KSYSCALL(entry_probe, pid_t pid, int sig) +{ + char comm[TASK_COMM_LEN]; + __u32 caller_pid = bpf_get_current_pid_tgid() >> 32; + + if (sig == 0) { + /* + If sig is 0, then no signal is sent, but existence and permission + checks are still performed; this can be used to check for the + existence of a process ID or process group ID that the caller is + permitted to signal. + */ + return 0; + } + + bpf_get_current_comm(&comm, sizeof(comm)); + bpf_printk("KILL syscall called by PID %d (%s) for PID %d with signal %d.", caller_pid, + comm, pid, sig); + return 0; +} + +char _license[] SEC("license") = "GPL"; diff --git a/examples/c/ksyscall.c b/examples/c/ksyscall.c new file mode 100644 index 0000000..ac931f9 --- /dev/null +++ b/examples/c/ksyscall.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include +#include +#include "ksyscall.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static volatile sig_atomic_t stop; + +static void sig_int(int signo) +{ + stop = 1; +} + +int main(int argc, char **argv) +{ + struct ksyscall_bpf *skel; + int err; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Open load and verify BPF application */ + skel = ksyscall_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* Attach tracepoint handler */ + err = ksyscall_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + if (signal(SIGINT, sig_int) == SIG_ERR) { + fprintf(stderr, "can't set signal handler: %s\n", strerror(errno)); + goto cleanup; + } + + printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " + "to see output of the BPF programs.\n"); + + while (!stop) { + fprintf(stderr, "."); + sleep(1); + } + +cleanup: + ksyscall_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/libbpf.a b/examples/c/libbpf.a new file mode 100644 index 0000000..11aa771 Binary files /dev/null and b/examples/c/libbpf.a differ diff --git a/examples/c/libbpf_android.a b/examples/c/libbpf_android.a new file mode 100644 index 0000000..96c016a Binary files /dev/null and b/examples/c/libbpf_android.a differ diff --git a/examples/c/minimal.bpf.c b/examples/c/minimal.bpf.c new file mode 100644 index 0000000..ea1eeef --- /dev/null +++ b/examples/c/minimal.bpf.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2020 Facebook */ +#include +#include + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +int my_pid = 0; + +SEC("tp/syscalls/sys_enter_write") +int handle_tp(void *ctx) +{ + int pid = bpf_get_current_pid_tgid() >> 32; + + if (pid != my_pid) + return 0; + + bpf_printk("BPF triggered from PID %d.\n", pid); + + return 0; +} diff --git a/examples/c/minimal.c b/examples/c/minimal.c new file mode 100644 index 0000000..cf3927f --- /dev/null +++ b/examples/c/minimal.c @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include "minimal.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +int main(int argc, char **argv) +{ + struct minimal_bpf *skel; + int err; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Open BPF application */ + skel = minimal_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* ensure BPF program only handles write() syscalls from our process */ + skel->bss->my_pid = getpid(); + + /* Load & verify BPF programs */ + err = minimal_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + /* Attach tracepoint handler */ + err = minimal_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " + "to see output of the BPF programs.\n"); + + for (;;) { + /* trigger our BPF program */ + fprintf(stderr, "."); + sleep(1); + } + +cleanup: + minimal_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/minimal_legacy.bpf.c b/examples/c/minimal_legacy.bpf.c new file mode 100644 index 0000000..7812373 --- /dev/null +++ b/examples/c/minimal_legacy.bpf.c @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#define BPF_NO_GLOBAL_DATA +#include +#include +#include + +typedef unsigned int u32; +typedef int pid_t; + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +/* Create an array with 1 entry instead of a global variable + * which does not work with older kernels */ +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, u32); + __type(value, pid_t); +} my_pid_map SEC(".maps"); + +SEC("tp/syscalls/sys_enter_write") +int handle_tp(void *ctx) +{ + u32 index = 0; + pid_t pid = bpf_get_current_pid_tgid() >> 32; + pid_t *my_pid = bpf_map_lookup_elem(&my_pid_map, &index); + + if (!my_pid || *my_pid != pid) + return 1; + + bpf_printk("BPF triggered from PID %d.\n", pid); + + return 0; +} diff --git a/examples/c/minimal_legacy.c b/examples/c/minimal_legacy.c new file mode 100644 index 0000000..b671e32 --- /dev/null +++ b/examples/c/minimal_legacy.c @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#include +#include +#include +#include +#include "minimal_legacy.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +int main(int argc, char **argv) +{ + struct minimal_legacy_bpf *skel; + int err; + pid_t pid; + unsigned index = 0; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Load and verify BPF application */ + skel = minimal_legacy_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* ensure BPF program only handles write() syscalls from our process */ + pid = getpid(); + err = bpf_map__update_elem(skel->maps.my_pid_map, &index, sizeof(index), &pid, + sizeof(pid_t), BPF_ANY); + if (err < 0) { + fprintf(stderr, "Error updating map with pid: %s\n", strerror(err)); + goto cleanup; + } + + /* Attach tracepoint handler */ + err = minimal_legacy_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " + "to see output of the BPF programs.\n"); + + for (;;) { + /* trigger our BPF program */ + fprintf(stderr, "."); + sleep(1); + } + +cleanup: + minimal_legacy_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/minimal_ns.bpf.c b/examples/c/minimal_ns.bpf.c new file mode 100644 index 0000000..fb1c3a7 --- /dev/null +++ b/examples/c/minimal_ns.bpf.c @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2023 Hosein Bakhtiari */ +#include +#include +#include + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +int my_pid = 0; +unsigned long long dev; +unsigned long long ino; + +SEC("tp/syscalls/sys_enter_write") +int handle_tp(void *ctx) +{ + struct bpf_pidns_info ns; + + bpf_get_ns_current_pid_tgid(dev, ino, &ns, sizeof(ns)); + if (ns.pid != my_pid) + return 0; + + bpf_printk("BPF triggered from PID %d.\n", ns.pid); + + return 0; +} diff --git a/examples/c/minimal_ns.c b/examples/c/minimal_ns.c new file mode 100644 index 0000000..c89b74c --- /dev/null +++ b/examples/c/minimal_ns.c @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2023 Hosein Bakhtiari */ +#include +#include +#include +#include +#include "minimal_ns.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +int main(int argc, char **argv) +{ + struct minimal_ns_bpf *skel; + int err; + struct stat sb; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Open BPF application */ + skel = minimal_ns_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* ensure BPF program only handles write() syscalls from our process */ + if (stat("/proc/self/ns/pid", &sb) == -1) { + fprintf(stderr, "Failed to acquire namespace information"); + return 1; + } + skel->bss->dev = sb.st_dev; + skel->bss->ino = sb.st_ino; + skel->bss->my_pid = getpid(); + + /* Load & verify BPF programs */ + err = minimal_ns_bpf__load(skel); + if (err) { + fprintf(stderr, "Failed to load and verify BPF skeleton\n"); + goto cleanup; + } + + /* Attach tracepoint handler */ + err = minimal_ns_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " + "to see output of the BPF programs.\n"); + + for (;;) { + /* trigger our BPF program */ + fprintf(stderr, "."); + sleep(1); + } + +cleanup: + minimal_ns_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/myringbuffer.bpf.c b/examples/c/myringbuffer.bpf.c new file mode 100644 index 0000000..9199b02 --- /dev/null +++ b/examples/c/myringbuffer.bpf.c @@ -0,0 +1,42 @@ +/* + * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git + * @Date: 2023-08-16 14:55:36 + * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git + * @LastEditTime: 2023-08-26 16:05:09 + * @FilePath: /libbpf-bootstrap-arm/examples/c/myringbuffer.bpf.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看é…ç½® 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +#include "vmlinux.h" //内置(基于Linux5.8) +#include "bpf/bpf_helpers.h" //内核和ebpfå­ç³»ç»Ÿæ²Ÿé€šä½¿ç”¨çš„函数 +#include "bpf/bpf_tracing.h" +#include "common.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +//定义MAP +struct { + //使用ringbuffer(性能远比perfmap,perfbuffer高) + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +//声明许å¯ï¼ˆå†…æ ¸å¼ºåˆ¶è¦æ±‚) + + +//定义挂载点 +SEC("kprobe/update_rq_clock") +//定义hook函数内容,æ“作 +int BPF_KPROBE(update_rq_clock,struct rq* rq){ + struct mydata_t* mydata; + //预留ringbuf空间 + mydata = bpf_ringbuf_reserve(&rb, sizeof(*mydata), 0); + if(!mydata){//é”™è¯¯å¤„ç† + return 0; + } + //æ‹¿æ•°æ® + mydata->__nr_running = rq->nr_running; //其他的先ä¸ç®¡ + mydata->__cpu = bpf_get_smp_processor_id(); + + bpf_ringbuf_submit(mydata, 0); + return 0; +} diff --git a/examples/c/myringbuffer.c b/examples/c/myringbuffer.c new file mode 100644 index 0000000..0fa700d --- /dev/null +++ b/examples/c/myringbuffer.c @@ -0,0 +1,108 @@ +//用户æ€ç¨‹åº +#include +#include +#include +#include +#include +#include "bpf/libbpf.h" +//和内核æ€å…±äº«æ•°æ®ç»“æž„ +#include "common.h" +//ç»è¿‡bpftool处ç†çš„内核æ€ç¨‹åºå¤´æ–‡ä»¶ï¼ˆå†…æ ¸æ€"嵌入"到用户æ€ï¼‰ +#include "myringbuffer.skel.h" + + + +int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + /* Ignore debug-level libbpf logs */ + if (level > LIBBPF_INFO) + return 0; + return vfprintf(stderr, format, args); +} + +//å–æ¶ˆå†…核内存é™åˆ¶ +void bump_memlock_rlimit(void) +{ + struct rlimit rlim_new = { .rlim_cur = RLIM_INFINITY, .rlim_max = RLIM_INFINITY}; + //æ›´æ–°+é”™è¯¯å¤„ç† + if (setrlimit(RLIMIT_MEMLOCK, &rlim_new)) { + fprintf(stderr, "Failed to relimit OS source"); + exit(1); + } +} + +//处ç†CTRL-C +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +//回调处ç†å‡½æ•° +int ringbuf_event_handler(void *ctx, void *data, size_t data_sz) +{ + const struct mydata_t * md = data; + printf("[ringbuf-handler] nr_running->%d cpu->%d \n", md->__nr_running, md->__cpu); + return 0; +} + +//主逻辑 +int main(int argc, char **argv) +{ + struct ring_buffer *rb = NULL; + //通过${apps}.skel.hæ“作控制交互内核æ€ç¨‹åº + struct myringbuffer_bpf *skel; + int err; + + + //logs + libbpf_set_print(libbpf_print_fn); + //os settings + bump_memlock_rlimit(); + //Clean handling + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + +//--------------------------------------------------------------- + //加载,验è¯ebpf内核æ€ç¨‹åº + skel = myringbuffer_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "failed to open and verify BPF skeleton"); + return -1; + } + + //挂载 + err = myringbuffer_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton"); + goto cleanup; //良好习惯清ç†èµ„æº + } + + /*-----------------------ringbufferæ“作部分--------------------*/ + rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), ringbuf_event_handler, NULL, NULL); + if (!rb) { + err = -1; + fprintf(stderr, "Failed to create ring buffer\n"); + goto cleanup; + } + + + while (!exiting) { + err = ring_buffer__poll(rb, -1); + if (err == -EINTR) { + err = 0; + break; + } + if (err < 0) { + printf("Error polling ring buffer: %d\n", err); + break; + } + } + +cleanup: + ring_buffer__free(rb); + myringbuffer_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} \ No newline at end of file diff --git a/examples/c/out.perf-folded b/examples/c/out.perf-folded new file mode 100644 index 0000000..a7df235 --- /dev/null +++ b/examples/c/out.perf-folded @@ -0,0 +1,113 @@ +myringbuffer;[unknown];[libc.so.6] 250000 +myringbuffer;[unknown];[unknown];__strlen_avx2 250000 +myringbuffer;[unknown];[unknown];bpf_core_add_cands 500000 +myringbuffer;[unknown];[unknown];bpf_core_essential_name_len 250000 +myringbuffer;[unknown];_IO_do_write@@GLIBC_2.2.5 500000 +myringbuffer;[unknown];_IO_file_overflow@@GLIBC_2.2.5 1000000 +myringbuffer;[unknown];_IO_file_write@@GLIBC_2.2.5 2750000 +myringbuffer;[unknown];_IO_file_xsputn@@GLIBC_2.2.5 14000000 +myringbuffer;[unknown];__GI___libc_cleanup_pop_restore 250000 +myringbuffer;[unknown];__GI___libc_write 5250000 +myringbuffer;[unknown];__GI___libc_write;__x86_indirect_thunk_rax 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64 750000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_write 750000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write 1000000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;__fdget_pos;__fget_light 2500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write 4000000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write 2000000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0 3750000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;__check_object_size;__check_heap_object 1000000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;__check_object_size;__virt_addr_valid 3500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;__check_object_size;check_stack_object 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;__wake_up_common_lock 2500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;_copy_from_iter 1250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;_copy_from_iter;copyin 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;_copy_from_iter;copyin;copy_user_enhanced_fast_string 500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;_copy_from_iter;copyin;copy_user_generic_unrolled 3000000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;ktime_get_real_seconds 750000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;ldsem_up_read 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write 25250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;add_wait_queue 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;add_wait_queue;_raw_spin_lock_irqsave 500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;do_output_char 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;do_output_char;pty_write 1250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;do_output_char;tty_insert_flip_string_and_push_buffer 5750000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;do_output_char;tty_insert_flip_string_and_push_buffer;_raw_spin_lock_irqsave 750000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;do_output_char;tty_insert_flip_string_and_push_buffer;queue_work_on 12250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;down_read 1500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;mutex_lock 500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;mutex_unlock 1500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;process_echoes 750000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;pty_write 2000000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;pty_write_room 3000000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;remove_wait_queue 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;tty_buffer_space_avail 1500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;tty_hung_up_p 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;tty_insert_flip_string_and_push_buffer 6500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;tty_insert_flip_string_and_push_buffer;_raw_spin_lock_irqsave 500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;tty_insert_flip_string_and_push_buffer;queue_work_on 192000000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;up_read 750000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;n_tty_write;wait_woken;schedule_timeout;schedule;__sched_text_start 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;tty_ldisc_deref 500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;tty_ldisc_ref_wait 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;tty_ldisc_ref_wait;ldsem_down_read 500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;tty_paranoia_check 750000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;tty_write_lock 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;file_tty_write.isra.0;tty_write_lock;mutex_trylock 250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;new_sync_write;tty_write 1250000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_write;vfs_write;security_file_permission 500000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;syscall_enter_from_user_mode 7000000 +myringbuffer;[unknown];__GI___libc_write;entry_SYSCALL_64_after_hwframe;do_syscall_64;syscall_exit_to_user_mode 750000 +myringbuffer;[unknown];__memmove_avx_unaligned_erms 2250000 +myringbuffer;[unknown];__memmove_avx_unaligned_erms;asm_exc_page_fault;exc_page_fault;do_user_addr_fault 500000 +myringbuffer;[unknown];__memmove_avx_unaligned_erms;asm_exc_page_fault;exc_page_fault;do_user_addr_fault;handle_mm_fault;__handle_mm_fault;__alloc_pages;get_page_from_freelist;prep_new_page;kernel_init_free_pages.part.0;clear_page_erms 250000 +myringbuffer;[unknown];__memmove_avx_unaligned_erms;asm_exc_page_fault;exc_page_fault;do_user_addr_fault;handle_mm_fault;__handle_mm_fault;do_huge_pmd_anonymous_page;clear_huge_page;clear_subpage;clear_page_erms 250000 +myringbuffer;[unknown];__memmove_avx_unaligned_erms;asm_exc_page_fault;exc_page_fault;do_user_addr_fault;handle_mm_fault;__handle_mm_fault;lru_cache_add;__pagevec_lru_add 250000 +myringbuffer;[unknown];__mempcpy_avx_unaligned_erms 1000000 +myringbuffer;[unknown];__strchrnul_avx2 1750000 +myringbuffer;[unknown];__vfprintf_internal 13000000 +myringbuffer;[unknown];_dl_sysdep_start;dl_main;_dl_relocate_object 250000 +myringbuffer;[unknown];_itoa_word 3250000 +myringbuffer;[unknown];btf_type_size.isra.0 500000 +myringbuffer;[unknown];libbpf_add_mem 750000 +myringbuffer;[unknown];probe_memcg_account;syscall;[[kernel.kallsyms]] 250000 +myringbuffer;[unknown];read;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_read;vfs_read;new_sync_read;kernfs_fop_read_iter;_copy_to_iter;copyout;copy_user_enhanced_fast_string 2000000 +myringbuffer;[unknown];read;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_read;vfs_read;new_sync_read;kernfs_fop_read_iter;_copy_to_iter;copyout;copy_user_enhanced_fast_string;asm_exc_page_fault;exc_page_fault;do_user_addr_fault;handle_mm_fault 250000 +myringbuffer;[unknown];read;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_read;vfs_read;new_sync_read;kernfs_fop_read_iter;_copy_to_iter;copyout;copy_user_enhanced_fast_string;asm_exc_page_fault;exc_page_fault;do_user_addr_fault;handle_mm_fault;__handle_mm_fault;do_huge_pmd_anonymous_page;clear_huge_page;clear_subpage;clear_page_erms 500000 +myringbuffer;[unknown];read;entry_SYSCALL_64_after_hwframe;do_syscall_64;ksys_read;vfs_read;new_sync_read;kernfs_fop_read_iter;btf_vmlinux_read;memcpy_erms 250000 +myringbuffer;_IO_do_write@@GLIBC_2.2.5 1000000 +myringbuffer;_IO_file_write@@GLIBC_2.2.5 750000 +myringbuffer;__close;[[kernel.kallsyms]] 250000 +myringbuffer;__libc_start_call_main;epoll_wait 750000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait 250000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;__fget_light 500000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;__put_user_nocheck_4 250000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;__put_user_nocheck_8 250000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;ep_item_poll.isra.0 500000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;ep_item_poll.isra.0;bpf_map_poll 250000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;ep_item_poll.isra.0;ringbuf_map_poll 500000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;ep_start_scan 250000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;mutex_unlock 250000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;schedule_hrtimeout_range 250000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;schedule_hrtimeout_range_clock;schedule;__sched_text_start 250000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_epoll_wait;do_epoll_wait;schedule_hrtimeout_range_clock;schedule;__sched_text_start;finish_task_switch 750000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;syscall_enter_from_user_mode 250000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;syscall_exit_to_user_mode 500000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;syscall_exit_to_user_mode;exit_to_user_mode_prepare 1750000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;syscall_exit_to_user_mode;exit_to_user_mode_prepare;__rseq_handle_notify_resume 2000000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;syscall_exit_to_user_mode;exit_to_user_mode_prepare;__rseq_handle_notify_resume;__get_user_8 500000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;syscall_exit_to_user_mode;exit_to_user_mode_prepare;__rseq_handle_notify_resume;__put_user_nocheck_8 750000 +myringbuffer;__libc_start_call_main;epoll_wait;entry_SYSCALL_64_after_hwframe;do_syscall_64;syscall_exit_to_user_mode;exit_to_user_mode_prepare;mem_cgroup_handle_over_high 250000 +myringbuffer;ringbuf_event_handler 1000000 +myringbuffer;ringbuf_process_ring 4500000 +myringbuffer;ringbuf_process_ring;printf 1250000 +myringbuffer;ringbuf_process_ring;ringbuf_event_handler 750000 +myringbuffer;syscall;[[kernel.kallsyms]] 1750000 +myringbuffer;syscall;entry_SYSCALL_64_after_hwframe;do_syscall_64;__do_sys_perf_event_open;perf_event_alloc;perf_try_init_event;perf_kprobe_event_init;perf_kprobe_init;create_local_trace_kprobe;__register_trace_kprobe;within_notrace_func;kallsyms_lookup_name;kallsyms_expand_symbol.constprop.0 500000 +myringbuffer;syscall;entry_SYSCALL_64_after_hwframe;do_syscall_64;__do_sys_perf_event_open;perf_event_alloc;perf_try_init_event;perf_kprobe_event_init;perf_kprobe_init;create_local_trace_kprobe;register_kprobe;jump_label_text_reserved;__jump_label_text_reserved;arch_jump_entry_size;insn_decode;insn_get_length;insn_get_immediate;insn_get_displacement;insn_get_sib;insn_get_modrm;insn_get_opcode;insn_get_prefixes.part.0 250000 +myringbuffer;syscall;entry_SYSCALL_64_after_hwframe;do_syscall_64;__do_sys_perf_event_open;perf_event_alloc;perf_try_init_event;perf_kprobe_event_init;perf_kprobe_init;create_local_trace_kprobe;register_kprobe;kprobe_addr;kallsyms_lookup_name;kallsyms_expand_symbol.constprop.0 250000 +myringbuffer;syscall;entry_SYSCALL_64_after_hwframe;do_syscall_64;__do_sys_perf_event_open;perf_event_alloc;perf_try_init_event;perf_kprobe_event_init;perf_kprobe_init;perf_trace_event_init;enable_trace_kprobe;enable_kprobe;arm_kprobe;register_ftrace_function;ftrace_startup;ftrace_run_update_code;ftrace_modify_all_code;ftrace_replace_code;ftrace_rec_iter_next 500000 +myringbuffer;syscall;entry_SYSCALL_64_after_hwframe;do_syscall_64;__do_sys_perf_event_open;perf_event_alloc;perf_try_init_event;perf_kprobe_event_init;perf_kprobe_init;perf_trace_event_init;enable_trace_kprobe;enable_kprobe;arm_kprobe;register_ftrace_function;ftrace_startup;ftrace_run_update_code;ftrace_modify_all_code;ftrace_replace_code;ftrace_rec_iter_record 250000 +myringbuffer;syscall;entry_SYSCALL_64_after_hwframe;do_syscall_64;__do_sys_perf_event_open;perf_event_alloc;perf_try_init_event;perf_kprobe_event_init;perf_kprobe_init;perf_trace_event_init;enable_trace_kprobe;enable_kprobe;arm_kprobe;register_ftrace_function;ftrace_startup;ftrace_run_update_code;ftrace_modify_all_code;ftrace_update_ftrace_func;text_poke_bp;text_poke_bp_batch;on_each_cpu_cond_mask;smp_call_function_many_cond;hv_send_ipi_mask_allbutself;__send_ipi_mask;cpumask_next;_find_next_bit 250000 +myringbuffer;syscall;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_bpf;__sys_bpf 250000 +myringbuffer;syscall;entry_SYSCALL_64_after_hwframe;do_syscall_64;__x64_sys_bpf;__sys_bpf;bpf_prog_load;perf_event_bpf_event;perf_iterate_sb;perf_event_bpf_output;perf_output_end;perf_output_put_handle;irq_work_queue;native_apic_wait_icr_idle;hv_apic_read 250000 diff --git a/examples/c/perf.svg b/examples/c/perf.svg new file mode 100644 index 0000000..661b795 --- /dev/null +++ b/examples/c/perf.svg @@ -0,0 +1,1289 @@ + + + + + + + + + + + + + + +Flame Graph + +Reset Zoom +Search +ic + + + +register_kprobe (500,000 samples, 0.13%) + + + +insn_get_sib (250,000 samples, 0.07%) + + + +_IO_do_write@@GLIBC_2.2.5 (1,000,000 samples, 0.27%) + + + +do_syscall_64 (10,250,000 samples, 2.74%) +do.. + + +ringbuf_process_ring (6,500,000 samples, 1.73%) + + + +check_stack_object (250,000 samples, 0.07%) + + + +__memmove_avx_unaligned_erms (3,500,000 samples, 0.93%) + + + +clear_subpage (250,000 samples, 0.07%) + + + +_raw_spin_lock_irqsave (500,000 samples, 0.13%) + + + +perf_trace_event_init (1,000,000 samples, 0.27%) + + + +add_wait_queue (750,000 samples, 0.20%) + + + +ep_start_scan (250,000 samples, 0.07%) + + + +clear_page_erms (500,000 samples, 0.13%) + + + +_IO_file_overflow@@GLIBC_2.2.5 (1,000,000 samples, 0.27%) + + + +schedule (250,000 samples, 0.07%) + + + +copy_user_generic_unrolled (3,000,000 samples, 0.80%) + + + +vfs_write (284,750,000 samples, 75.98%) +vfs_write + + +ftrace_rec_iter_next (500,000 samples, 0.13%) + + + +create_local_trace_kprobe (1,000,000 samples, 0.27%) + + + +[unknown] (1,000,000 samples, 0.27%) + + + +remove_wait_queue (250,000 samples, 0.07%) + + + +bpf_prog_load (250,000 samples, 0.07%) + + + +file_tty_write.isra.0 (277,000,000 samples, 73.92%) +file_tty_write.isra.0 + + +ftrace_rec_iter_record (250,000 samples, 0.07%) + + + +perf_event_alloc (2,000,000 samples, 0.53%) + + + +ldsem_down_read (500,000 samples, 0.13%) + + + +__x86_indirect_thunk_rax (250,000 samples, 0.07%) + + + +pty_write (1,250,000 samples, 0.33%) + + + +ringbuf_event_handler (750,000 samples, 0.20%) + + + +copy_user_enhanced_fast_string (500,000 samples, 0.13%) + + + +__put_user_nocheck_8 (750,000 samples, 0.20%) + + + +__strlen_avx2 (250,000 samples, 0.07%) + + + +ftrace_modify_all_code (1,000,000 samples, 0.27%) + + + +wait_woken (250,000 samples, 0.07%) + + + +perf_try_init_event (2,000,000 samples, 0.53%) + + + +pty_write_room (3,000,000 samples, 0.80%) + + + +do_user_addr_fault (750,000 samples, 0.20%) + + + +bpf_map_poll (250,000 samples, 0.07%) + + + +mutex_trylock (250,000 samples, 0.07%) + + + +mutex_unlock (250,000 samples, 0.07%) + + + +btf_type_size.isra.0 (500,000 samples, 0.13%) + + + +exc_page_fault (1,250,000 samples, 0.33%) + + + +down_read (1,500,000 samples, 0.40%) + + + +ep_item_poll.isra.0 (1,250,000 samples, 0.33%) + + + +security_file_permission (500,000 samples, 0.13%) + + + +__pagevec_lru_add (250,000 samples, 0.07%) + + + +__strchrnul_avx2 (1,750,000 samples, 0.47%) + + + +tty_hung_up_p (250,000 samples, 0.07%) + + + +__check_heap_object (1,000,000 samples, 0.27%) + + + +clear_page_erms (250,000 samples, 0.07%) + + + +do_huge_pmd_anonymous_page (250,000 samples, 0.07%) + + + +insn_get_length (250,000 samples, 0.07%) + + + +arm_kprobe (1,000,000 samples, 0.27%) + + + +_raw_spin_lock_irqsave (500,000 samples, 0.13%) + + + +_IO_file_write@@GLIBC_2.2.5 (750,000 samples, 0.20%) + + + +hv_apic_read (250,000 samples, 0.07%) + + + +__sched_text_start (250,000 samples, 0.07%) + + + +clear_huge_page (500,000 samples, 0.13%) + + + +_copy_to_iter (2,750,000 samples, 0.73%) + + + +vfs_read (3,000,000 samples, 0.80%) + + + +__close (250,000 samples, 0.07%) + + + +ftrace_update_ftrace_func (250,000 samples, 0.07%) + + + +entry_SYSCALL_64_after_hwframe (10,250,000 samples, 2.74%) +en.. + + +[[kernel.kallsyms]] (250,000 samples, 0.07%) + + + +do_epoll_wait (4,250,000 samples, 1.13%) + + + +smp_call_function_many_cond (250,000 samples, 0.07%) + + + +get_page_from_freelist (250,000 samples, 0.07%) + + + +_IO_do_write@@GLIBC_2.2.5 (500,000 samples, 0.13%) + + + +tty_write_lock (500,000 samples, 0.13%) + + + +text_poke_bp (250,000 samples, 0.07%) + + + +mem_cgroup_handle_over_high (250,000 samples, 0.07%) + + + +schedule_hrtimeout_range_clock (1,000,000 samples, 0.27%) + + + +perf_output_put_handle (250,000 samples, 0.07%) + + + +ldsem_up_read (250,000 samples, 0.07%) + + + +[libc.so.6] (250,000 samples, 0.07%) + + + +__put_user_nocheck_4 (250,000 samples, 0.07%) + + + +[unknown] (350,000,000 samples, 93.40%) +[unknown] + + +[[kernel.kallsyms]] (1,750,000 samples, 0.47%) + + + +_raw_spin_lock_irqsave (750,000 samples, 0.20%) + + + +kallsyms_expand_symbol.constprop.0 (500,000 samples, 0.13%) + + + +ktime_get_real_seconds (750,000 samples, 0.20%) + + + +perf_kprobe_init (2,000,000 samples, 0.53%) + + + +__GI___libc_write (303,000,000 samples, 80.85%) +__GI___libc_write + + +mutex_unlock (1,500,000 samples, 0.40%) + + + +insn_get_displacement (250,000 samples, 0.07%) + + + +irq_work_queue (250,000 samples, 0.07%) + + + +kallsyms_lookup_name (250,000 samples, 0.07%) + + + +bpf_core_add_cands (500,000 samples, 0.13%) + + + +do_syscall_64 (297,500,000 samples, 79.39%) +do_syscall_64 + + +kprobe_addr (250,000 samples, 0.07%) + + + +all (374,750,000 samples, 100%) + + + +entry_SYSCALL_64_after_hwframe (2,500,000 samples, 0.67%) + + + +new_sync_read (3,000,000 samples, 0.80%) + + + +copyout (2,750,000 samples, 0.73%) + + + +do_huge_pmd_anonymous_page (500,000 samples, 0.13%) + + + +__send_ipi_mask (250,000 samples, 0.07%) + + + +ringbuf_map_poll (500,000 samples, 0.13%) + + + +entry_SYSCALL_64_after_hwframe (297,500,000 samples, 79.39%) +entry_SYSCALL_64_after_hwframe + + +native_apic_wait_icr_idle (250,000 samples, 0.07%) + + + +tty_paranoia_check (750,000 samples, 0.20%) + + + +syscall_exit_to_user_mode (5,750,000 samples, 1.53%) + + + +tty_insert_flip_string_and_push_buffer (199,000,000 samples, 53.10%) +tty_insert_flip_string_and_push_buffer + + +perf_kprobe_event_init (2,000,000 samples, 0.53%) + + + +_IO_file_xsputn@@GLIBC_2.2.5 (14,000,000 samples, 3.74%) +_IO_.. + + +perf_event_bpf_event (250,000 samples, 0.07%) + + + +ksys_read (3,000,000 samples, 0.80%) + + + +__sys_bpf (500,000 samples, 0.13%) + + + +__jump_label_text_reserved (250,000 samples, 0.07%) + + + +_dl_relocate_object (250,000 samples, 0.07%) + + + +syscall_enter_from_user_mode (250,000 samples, 0.07%) + + + +ftrace_startup (1,000,000 samples, 0.27%) + + + +schedule_hrtimeout_range (250,000 samples, 0.07%) + + + +__fget_light (500,000 samples, 0.13%) + + + +copyin (3,750,000 samples, 1.00%) + + + +schedule (1,000,000 samples, 0.27%) + + + +__fdget_pos (2,500,000 samples, 0.67%) + + + +handle_mm_fault (750,000 samples, 0.20%) + + + +clear_page_erms (250,000 samples, 0.07%) + + + +__do_sys_perf_event_open (2,000,000 samples, 0.53%) + + + +memcpy_erms (250,000 samples, 0.07%) + + + +__virt_addr_valid (3,500,000 samples, 0.93%) + + + +copy_user_enhanced_fast_string (2,750,000 samples, 0.73%) + + + +__wake_up_common_lock (2,500,000 samples, 0.67%) + + + +read (3,000,000 samples, 0.80%) + + + +ringbuf_event_handler (1,000,000 samples, 0.27%) + + + +__check_object_size (4,750,000 samples, 1.27%) + + + +perf_event_bpf_output (250,000 samples, 0.07%) + + + +__register_trace_kprobe (500,000 samples, 0.13%) + + + +__GI___libc_cleanup_pop_restore (250,000 samples, 0.07%) + + + +prep_new_page (250,000 samples, 0.07%) + + + +queue_work_on (192,000,000 samples, 51.23%) +queue_work_on + + +__get_user_8 (500,000 samples, 0.13%) + + + +do_output_char (20,250,000 samples, 5.40%) +do_outp.. + + +queue_work_on (12,250,000 samples, 3.27%) +que.. + + +bpf_core_essential_name_len (250,000 samples, 0.07%) + + + +hv_send_ipi_mask_allbutself (250,000 samples, 0.07%) + + + +process_echoes (750,000 samples, 0.20%) + + + +perf_iterate_sb (250,000 samples, 0.07%) + + + +enable_kprobe (1,000,000 samples, 0.27%) + + + +_itoa_word (3,250,000 samples, 0.87%) + + + +_IO_file_write@@GLIBC_2.2.5 (2,750,000 samples, 0.73%) + + + +ksys_write (288,250,000 samples, 76.92%) +ksys_write + + +_dl_sysdep_start (250,000 samples, 0.07%) + + + +__put_user_nocheck_8 (250,000 samples, 0.07%) + + + +exit_to_user_mode_prepare (5,250,000 samples, 1.40%) + + + +new_sync_write (280,250,000 samples, 74.78%) +new_sync_write + + +text_poke_bp_batch (250,000 samples, 0.07%) + + + +asm_exc_page_fault (1,250,000 samples, 0.33%) + + + +__sched_text_start (1,000,000 samples, 0.27%) + + + +epoll_wait (11,000,000 samples, 2.94%) +ep.. + + +tty_ldisc_ref_wait (750,000 samples, 0.20%) + + + +printf (1,250,000 samples, 0.33%) + + + +ftrace_replace_code (750,000 samples, 0.20%) + + + +tty_write (1,250,000 samples, 0.33%) + + + +insn_get_opcode (250,000 samples, 0.07%) + + + +__x64_sys_bpf (500,000 samples, 0.13%) + + + +_copy_from_iter (5,000,000 samples, 1.33%) + + + +syscall (4,250,000 samples, 1.13%) + + + +enable_trace_kprobe (1,000,000 samples, 0.27%) + + + +__rseq_handle_notify_resume (3,250,000 samples, 0.87%) + + + +__alloc_pages (250,000 samples, 0.07%) + + + +__vfprintf_internal (13,000,000 samples, 3.47%) +__v.. + + +syscall_exit_to_user_mode (750,000 samples, 0.20%) + + + +do_user_addr_fault (1,250,000 samples, 0.33%) + + + +up_read (750,000 samples, 0.20%) + + + +kernfs_fop_read_iter (3,000,000 samples, 0.80%) + + + +insn_get_modrm (250,000 samples, 0.07%) + + + +syscall (250,000 samples, 0.07%) + + + +cpumask_next (250,000 samples, 0.07%) + + + +within_notrace_func (500,000 samples, 0.13%) + + + +clear_subpage (500,000 samples, 0.13%) + + + +probe_memcg_account (250,000 samples, 0.07%) + + + +__handle_mm_fault (750,000 samples, 0.20%) + + + +__x64_sys_epoll_wait (4,250,000 samples, 1.13%) + + + +myringbuffer (374,750,000 samples, 100.00%) +myringbuffer + + +btf_vmlinux_read (250,000 samples, 0.07%) + + + +finish_task_switch (750,000 samples, 0.20%) + + + +clear_huge_page (250,000 samples, 0.07%) + + + +[[kernel.kallsyms]] (250,000 samples, 0.07%) + + + +do_syscall_64 (3,000,000 samples, 0.80%) + + + +insn_get_immediate (250,000 samples, 0.07%) + + + +perf_output_end (250,000 samples, 0.07%) + + + +__libc_start_call_main (11,000,000 samples, 2.94%) +__.. + + +tty_insert_flip_string_and_push_buffer (18,750,000 samples, 5.00%) +tty_in.. + + +schedule_timeout (250,000 samples, 0.07%) + + + +tty_ldisc_deref (500,000 samples, 0.13%) + + + +insn_decode (250,000 samples, 0.07%) + + + +kernel_init_free_pages.part.0 (250,000 samples, 0.07%) + + + +dl_main (250,000 samples, 0.07%) + + + +__handle_mm_fault (500,000 samples, 0.13%) + + + +__x64_sys_write (750,000 samples, 0.20%) + + + +__mempcpy_avx_unaligned_erms (1,000,000 samples, 0.27%) + + + +kallsyms_lookup_name (500,000 samples, 0.13%) + + + +tty_buffer_space_avail (1,500,000 samples, 0.40%) + + + +on_each_cpu_cond_mask (250,000 samples, 0.07%) + + + +_find_next_bit (250,000 samples, 0.07%) + + + +handle_mm_fault (750,000 samples, 0.20%) + + + +insn_get_prefixes.part.0 (250,000 samples, 0.07%) + + + +exc_page_fault (750,000 samples, 0.20%) + + + +do_syscall_64 (2,500,000 samples, 0.67%) + + + +mutex_lock (500,000 samples, 0.13%) + + + +arch_jump_entry_size (250,000 samples, 0.07%) + + + +asm_exc_page_fault (750,000 samples, 0.20%) + + + +register_ftrace_function (1,000,000 samples, 0.27%) + + + +n_tty_write (257,500,000 samples, 68.71%) +n_tty_write + + +pty_write (2,000,000 samples, 0.53%) + + + +syscall_enter_from_user_mode (7,000,000 samples, 1.87%) +s.. + + +kallsyms_expand_symbol.constprop.0 (250,000 samples, 0.07%) + + + +__fget_light (2,500,000 samples, 0.67%) + + + +jump_label_text_reserved (250,000 samples, 0.07%) + + + +libbpf_add_mem (750,000 samples, 0.20%) + + + +ftrace_run_update_code (1,000,000 samples, 0.27%) + + + +entry_SYSCALL_64_after_hwframe (3,000,000 samples, 0.80%) + + + +lru_cache_add (250,000 samples, 0.07%) + + + + diff --git a/examples/c/profile.bpf.c b/examples/c/profile.bpf.c new file mode 100644 index 0000000..bdcc029 --- /dev/null +++ b/examples/c/profile.bpf.c @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2022 Meta Platforms, Inc. */ +#include "vmlinux.h" +#include +#include +#include + +#include "profile.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} events SEC(".maps"); + +SEC("perf_event") +int profile(void *ctx) +{ + int pid = bpf_get_current_pid_tgid() >> 32; + int cpu_id = bpf_get_smp_processor_id(); + struct stacktrace_event *event; + int cp; + + event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); + if (!event) + return 1; + + event->pid = pid; + event->cpu_id = cpu_id; + + if (bpf_get_current_comm(event->comm, sizeof(event->comm))) + event->comm[0] = 0; + + event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); + + event->ustack_sz = + bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); + + bpf_ringbuf_submit(event, 0); + + return 0; +} diff --git a/examples/c/profile.c b/examples/c/profile.c new file mode 100644 index 0000000..c18c835 --- /dev/null +++ b/examples/c/profile.c @@ -0,0 +1,244 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2022 Facebook */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "profile.skel.h" +#include "profile.h" +#include "blazesym.h" + +/* + * This function is from libbpf, but it is not a public API and can only be + * used for demonstration. We can use this here because we statically link + * against the libbpf built from submodule during build. + */ +extern int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz); + +static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, + unsigned long flags) +{ + int ret; + + ret = syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags); + return ret; +} + +static struct blaze_symbolizer *symbolizer; + +static void show_stack_trace(__u64 *stack, int stack_sz, pid_t pid) +{ + const struct blaze_result *result; + const struct blaze_sym *sym; + int i, j; + + assert(sizeof(uintptr_t) == sizeof(uint64_t)); + + if (pid) { + struct blaze_symbolize_src_process src = { + .pid = pid, + }; + result = blaze_symbolize_process(symbolizer, &src, (const uintptr_t *)stack, stack_sz); + } else { + struct blaze_symbolize_src_kernel src = {}; + result = blaze_symbolize_kernel(symbolizer, &src, (const uintptr_t *)stack, stack_sz); + } + + + for (i = 0; i < stack_sz; i++) { + if (!result || result->size <= i || !result->entries[i].size) { + printf(" %d [<%016llx>]\n", i, stack[i]); + continue; + } + + if (result->entries[i].size == 1) { + sym = &result->entries[i].syms[0]; + if (sym->path && sym->path[0]) { + printf(" %d [<%016llx>] %s+0x%llx %s:%ld\n", i, stack[i], + sym->symbol, stack[i] - sym->addr, sym->path, + sym->line); + } else { + printf(" %d [<%016llx>] %s+0x%llx\n", i, stack[i], sym->symbol, + stack[i] - sym->addr); + } + continue; + } + + printf(" %d [<%016llx>]\n", i, stack[i]); + for (j = 0; j < result->entries[i].size; j++) { + sym = &result->entries[i].syms[j]; + if (sym->path && sym->path[0]) { + printf(" %s+0x%llx %s:%ld\n", sym->symbol, + stack[i] - sym->addr, sym->path, sym->line); + } else { + printf(" %s+0x%llx\n", sym->symbol, + stack[i] - sym->addr); + } + } + } + + blaze_result_free(result); +} + +/* Receive events from the ring buffer. */ +static int event_handler(void *_ctx, void *data, size_t size) +{ + struct stacktrace_event *event = data; + + if (event->kstack_sz <= 0 && event->ustack_sz <= 0) + return 1; + + printf("COMM: %s (pid=%d) @ CPU %d\n", event->comm, event->pid, event->cpu_id); + + if (event->kstack_sz > 0) { + printf("Kernel:\n"); + show_stack_trace(event->kstack, event->kstack_sz / sizeof(__u64), 0); + } else { + printf("No Kernel Stack\n"); + } + + if (event->ustack_sz > 0) { + printf("Userspace:\n"); + show_stack_trace(event->ustack, event->ustack_sz / sizeof(__u64), event->pid); + } else { + printf("No Userspace Stack\n"); + } + + printf("\n"); + return 0; +} + +static void show_help(const char *progname) +{ + printf("Usage: %s [-f ] [-h]\n", progname); +} + +int main(int argc, char *const argv[]) +{ + const char *online_cpus_file = "/sys/devices/system/cpu/online"; + int freq = 1, pid = -1, cpu; + struct profile_bpf *skel = NULL; + struct perf_event_attr attr; + struct bpf_link **links = NULL; + struct ring_buffer *ring_buf = NULL; + int num_cpus, num_online_cpus; + int *pefds = NULL, pefd; + int argp, i, err = 0; + bool *online_mask = NULL; + + while ((argp = getopt(argc, argv, "hf:")) != -1) { + switch (argp) { + case 'f': + freq = atoi(optarg); + if (freq < 1) + freq = 1; + break; + + case 'h': + default: + show_help(argv[0]); + return 1; + } + } + + err = parse_cpu_mask_file(online_cpus_file, &online_mask, &num_online_cpus); + if (err) { + fprintf(stderr, "Fail to get online CPU numbers: %d\n", err); + goto cleanup; + } + + num_cpus = libbpf_num_possible_cpus(); + if (num_cpus <= 0) { + fprintf(stderr, "Fail to get the number of processors\n"); + err = -1; + goto cleanup; + } + + skel = profile_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Fail to open and load BPF skeleton\n"); + err = -1; + goto cleanup; + } + + symbolizer = blaze_symbolizer_new(); + if (!symbolizer) { + fprintf(stderr, "Fail to create a symbolizer\n"); + err = -1; + goto cleanup; + } + + /* Prepare ring buffer to receive events from the BPF program. */ + ring_buf = ring_buffer__new(bpf_map__fd(skel->maps.events), event_handler, NULL, NULL); + if (!ring_buf) { + err = -1; + goto cleanup; + } + + pefds = malloc(num_cpus * sizeof(int)); + for (i = 0; i < num_cpus; i++) { + pefds[i] = -1; + } + + links = calloc(num_cpus, sizeof(struct bpf_link *)); + + memset(&attr, 0, sizeof(attr)); + attr.type = PERF_TYPE_HARDWARE; + attr.size = sizeof(attr); + attr.config = PERF_COUNT_HW_CPU_CYCLES; + attr.sample_freq = freq; + attr.freq = 1; + + for (cpu = 0; cpu < num_cpus; cpu++) { + /* skip offline/not present CPUs */ + if (cpu >= num_online_cpus || !online_mask[cpu]) + continue; + + /* Set up performance monitoring on a CPU/Core */ + pefd = perf_event_open(&attr, pid, cpu, -1, PERF_FLAG_FD_CLOEXEC); + if (pefd < 0) { + fprintf(stderr, "Fail to set up performance monitor on a CPU/Core\n"); + err = -1; + goto cleanup; + } + pefds[cpu] = pefd; + + /* Attach a BPF program on a CPU */ + links[cpu] = bpf_program__attach_perf_event(skel->progs.profile, pefd); + if (!links[cpu]) { + err = -1; + goto cleanup; + } + } + + /* Wait and receive stack traces */ + while (ring_buffer__poll(ring_buf, -1) >= 0) { + } + +cleanup: + if (links) { + for (cpu = 0; cpu < num_cpus; cpu++) + bpf_link__destroy(links[cpu]); + free(links); + } + if (pefds) { + for (i = 0; i < num_cpus; i++) { + if (pefds[i] >= 0) + close(pefds[i]); + } + free(pefds); + } + ring_buffer__free(ring_buf); + profile_bpf__destroy(skel); + blaze_symbolizer_free(symbolizer); + free(online_mask); + return -err; +} diff --git a/examples/c/profile.h b/examples/c/profile.h new file mode 100644 index 0000000..cb72f38 --- /dev/null +++ b/examples/c/profile.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2022 Meta Platforms, Inc. */ +#ifndef __PROFILE_H_ +#define __PROFILE_H_ + +#ifndef TASK_COMM_LEN +#define TASK_COMM_LEN 16 +#endif + +#ifndef MAX_STACK_DEPTH +#define MAX_STACK_DEPTH 128 +#endif + +typedef __u64 stack_trace_t[MAX_STACK_DEPTH]; + +struct stacktrace_event { + __u32 pid; + __u32 cpu_id; + char comm[TASK_COMM_LEN]; + __s32 kstack_sz; + __s32 ustack_sz; + stack_trace_t kstack; + stack_trace_t ustack; +}; + +#endif /* __PROFILE_H_ */ diff --git a/examples/c/rb_test b/examples/c/rb_test new file mode 100755 index 0000000..0a791c3 Binary files /dev/null and b/examples/c/rb_test differ diff --git a/examples/c/rb_test.bpf.c b/examples/c/rb_test.bpf.c new file mode 100644 index 0000000..c3c6c70 --- /dev/null +++ b/examples/c/rb_test.bpf.c @@ -0,0 +1,30 @@ +// #include "vmlinux.h" +#include +#include +#include "common.h" + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +/* BPF ringbuf map */ +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024 /* 256 KB */); +} rb SEC(".maps"); + +SEC("tp/sched/sched_process_exec") +int handle_exec(struct trace_event_raw_sched_process_exec *ctx) +{ + unsigned fname_off = ctx->__data_loc_filename & 0xFFFF; + struct event *e; + + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + e->pid = bpf_get_current_pid_tgid() >> 32; + bpf_get_current_comm(&e->comm, sizeof(e->comm)); + bpf_probe_read_str(&e->filename, sizeof(e->filename), (void *)ctx + fname_off); + + bpf_ringbuf_submit(e, 0); + return 0; +} \ No newline at end of file diff --git a/examples/c/rb_test.c b/examples/c/rb_test.c new file mode 100644 index 0000000..8feee4f --- /dev/null +++ b/examples/c/rb_test.c @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +// Copyright (c) 2020 Andrii Nakryiko +#include +#include +#include +#include +#include +#include +#include "common.h" +#include "rb_test.skel.h" + +int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + /* Ignore debug-level libbpf logs */ + if (level > LIBBPF_INFO) + return 0; + return vfprintf(stderr, format, args); +} + +void bump_memlock_rlimit(void) +{ + struct rlimit rlim_new = { + .rlim_cur = RLIM_INFINITY, + .rlim_max = RLIM_INFINITY, + }; + + if (setrlimit(RLIMIT_MEMLOCK, &rlim_new)) { + fprintf(stderr, "Failed to increase RLIMIT_MEMLOCK limit!\n"); + exit(1); + } +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +int handle_event(void *ctx, void *data, size_t data_sz) +{ + const struct event *e = data; + struct tm *tm; + char ts[32]; + time_t t; + + time(&t); + tm = localtime(&t); + strftime(ts, sizeof(ts), "%H:%M:%S", tm); + + printf("%-8s %-5s %-7d %-16s %s\n", ts, "EXEC", e->pid, e->comm, e->filename); + + return 0; +} + +int main(int argc, char **argv) +{ + struct ring_buffer *rb = NULL; + struct rb_test_bpf *skel; + int err; + + /* Set up libbpf logging callback */ + libbpf_set_print(libbpf_print_fn); + + /* Bump RLIMIT_MEMLOCK to create BPF maps */ + bump_memlock_rlimit(); + + /* Clean handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF application */ + skel = rb_test_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Attach tracepoint */ + err = rb_test_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + /* Set up ring buffer polling */ + rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); + if (!rb) { + err = -1; + fprintf(stderr, "Failed to create ring buffer\n"); + goto cleanup; + } + + /* Process events */ + printf("%-8s %-5s %-7s %-16s %s\n", + "TIME", "EVENT", "PID", "COMM", "FILENAME"); + while (!exiting) { + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + /* Ctrl-C will cause -EINTR */ + if (err == -EINTR) { + err = 0; + break; + } + if (err < 0) { + printf("Error polling ring buffer: %d\n", err); + break; + } + } + +cleanup: + ring_buffer__free(rb); + rb_test_bpf__destroy(skel); + + return err < 0 ? -err : 0; +} \ No newline at end of file diff --git a/examples/c/sockfilter.bpf.c b/examples/c/sockfilter.bpf.c new file mode 100644 index 0000000..0f2f82d --- /dev/null +++ b/examples/c/sockfilter.bpf.c @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2022 Jacky Yin */ +#include +#include +#include +#include +#include +#include +#include +#include "sockfilter.h" + +#define IP_MF 0x2000 +#define IP_OFFSET 0x1FFF + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +struct { + __uint(type, BPF_MAP_TYPE_RINGBUF); + __uint(max_entries, 256 * 1024); +} rb SEC(".maps"); + +static inline int ip_is_fragment(struct __sk_buff *skb, __u32 nhoff) +{ + __u16 frag_off; + + bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, frag_off), &frag_off, 2); + frag_off = __bpf_ntohs(frag_off); + return frag_off & (IP_MF | IP_OFFSET); +} + +SEC("socket") +int socket_handler(struct __sk_buff *skb) +{ + struct so_event *e; + __u8 verlen; + __u16 proto; + __u32 nhoff = ETH_HLEN; + + bpf_skb_load_bytes(skb, 12, &proto, 2); + proto = __bpf_ntohs(proto); + if (proto != ETH_P_IP) + return 0; + + if (ip_is_fragment(skb, nhoff)) + return 0; + + /* reserve sample from BPF ringbuf */ + e = bpf_ringbuf_reserve(&rb, sizeof(*e), 0); + if (!e) + return 0; + + bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, protocol), &e->ip_proto, 1); + + if (e->ip_proto != IPPROTO_GRE) { + bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, saddr), &(e->src_addr), 4); + bpf_skb_load_bytes(skb, nhoff + offsetof(struct iphdr, daddr), &(e->dst_addr), 4); + } + + bpf_skb_load_bytes(skb, nhoff + 0, &verlen, 1); + bpf_skb_load_bytes(skb, nhoff + ((verlen & 0xF) << 2), &(e->ports), 4); + e->pkt_type = skb->pkt_type; + e->ifindex = skb->ifindex; + bpf_ringbuf_submit(e, 0); + + return skb->len; +} diff --git a/examples/c/sockfilter.c b/examples/c/sockfilter.c new file mode 100644 index 0000000..f30e505 --- /dev/null +++ b/examples/c/sockfilter.c @@ -0,0 +1,206 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2022 Jacky Yin */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "sockfilter.h" +#include "sockfilter.skel.h" + +static struct env { + const char *interface; +} env; + +const char argp_program_doc[] = + "BPF socket filter demo application.\n" + "\n" + "This program watch network packet of specified interface and print out src/dst\n" + "information.\n" + "\n" + "Currently only IPv4 is supported.\n" + "\n" + "USAGE: ./sockfilter [-i ]\n"; + +static const struct argp_option opts[] = { + { "interface", 'i', "INTERFACE", 0, "Network interface to attach" }, + {}, +}; + +static error_t parse_arg(int key, char *arg, struct argp_state *state) +{ + switch (key) { + case 'i': + env.interface = arg; + break; + case ARGP_KEY_ARG: + argp_usage(state); + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static const struct argp argp = { + .options = opts, + .parser = parse_arg, + .doc = argp_program_doc, +}; + +static const char *ipproto_mapping[IPPROTO_MAX] = { + [IPPROTO_IP] = "IP", [IPPROTO_ICMP] = "ICMP", [IPPROTO_IGMP] = "IGMP", + [IPPROTO_IPIP] = "IPIP", [IPPROTO_TCP] = "TCP", [IPPROTO_EGP] = "EGP", + [IPPROTO_PUP] = "PUP", [IPPROTO_UDP] = "UDP", [IPPROTO_IDP] = "IDP", + [IPPROTO_TP] = "TP", [IPPROTO_DCCP] = "DCCP", [IPPROTO_IPV6] = "IPV6", + [IPPROTO_RSVP] = "RSVP", [IPPROTO_GRE] = "GRE", [IPPROTO_ESP] = "ESP", + [IPPROTO_AH] = "AH", [IPPROTO_MTP] = "MTP", [IPPROTO_BEETPH] = "BEETPH", + [IPPROTO_ENCAP] = "ENCAP", [IPPROTO_PIM] = "PIM", [IPPROTO_COMP] = "COMP", + [IPPROTO_SCTP] = "SCTP", [IPPROTO_UDPLITE] = "UDPLITE", [IPPROTO_MPLS] = "MPLS", + [IPPROTO_RAW] = "RAW" +}; + +static int open_raw_sock(const char *name) +{ + struct sockaddr_ll sll; + int sock; + + sock = socket(PF_PACKET, SOCK_RAW | SOCK_NONBLOCK | SOCK_CLOEXEC, htons(ETH_P_ALL)); + if (sock < 0) { + fprintf(stderr, "Failed to create raw socket\n"); + return -1; + } + + memset(&sll, 0, sizeof(sll)); + sll.sll_family = AF_PACKET; + sll.sll_ifindex = if_nametoindex(name); + sll.sll_protocol = htons(ETH_P_ALL); + if (bind(sock, (struct sockaddr *)&sll, sizeof(sll)) < 0) { + fprintf(stderr, "Failed to bind to %s: %s\n", name, strerror(errno)); + close(sock); + return -1; + } + + return sock; +} + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static inline void ltoa(uint32_t addr, char *dst) +{ + snprintf(dst, 16, "%u.%u.%u.%u", (addr >> 24) & 0xFF, (addr >> 16) & 0xFF, + (addr >> 8) & 0xFF, (addr & 0xFF)); +} + +static int handle_event(void *ctx, void *data, size_t data_sz) +{ + const struct so_event *e = data; + char ifname[IF_NAMESIZE]; + char sstr[16] = {}, dstr[16] = {}; + + if (e->pkt_type != PACKET_HOST) + return 0; + + if (e->ip_proto < 0 || e->ip_proto >= IPPROTO_MAX) + return 0; + + if (!if_indextoname(e->ifindex, ifname)) + return 0; + + ltoa(ntohl(e->src_addr), sstr); + ltoa(ntohl(e->dst_addr), dstr); + + printf("interface: %s\tprotocol: %s\t%s:%d(src) -> %s:%d(dst)\n", ifname, + ipproto_mapping[e->ip_proto], sstr, ntohs(e->port16[0]), dstr, ntohs(e->port16[1])); + + return 0; +} + +static volatile bool exiting = false; + +static void sig_handler(int sig) +{ + exiting = true; +} + +int main(int argc, char **argv) +{ + struct ring_buffer *rb = NULL; + struct sockfilter_bpf *skel; + int err, prog_fd, sock; + + env.interface = "lo"; + /* Parse command line arguments */ + err = argp_parse(&argp, argc, argv, 0, NULL, NULL); + if (err) + return -err; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Cleaner handling of Ctrl-C */ + signal(SIGINT, sig_handler); + signal(SIGTERM, sig_handler); + + /* Load and verify BPF programs*/ + skel = sockfilter_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* Set up ring buffer polling */ + rb = ring_buffer__new(bpf_map__fd(skel->maps.rb), handle_event, NULL, NULL); + if (!rb) { + err = -1; + fprintf(stderr, "Failed to create ring buffer\n"); + goto cleanup; + } + + /* Create raw socket for localhost interface */ + sock = open_raw_sock(env.interface); + if (sock < 0) { + err = -2; + fprintf(stderr, "Failed to open raw socket\n"); + goto cleanup; + } + + /* Attach BPF program to raw socket */ + prog_fd = bpf_program__fd(skel->progs.socket_handler); + if (setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, sizeof(prog_fd))) { + err = -3; + fprintf(stderr, "Failed to attach to raw socket\n"); + goto cleanup; + } + + /* Process events */ + while (!exiting) { + err = ring_buffer__poll(rb, 100 /* timeout, ms */); + /* Ctrl-C will cause -EINTR */ + if (err == -EINTR) { + err = 0; + break; + } + if (err < 0) { + fprintf(stderr, "Error polling perf buffer: %d\n", err); + break; + } + sleep(1); + } + +cleanup: + ring_buffer__free(rb); + sockfilter_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/sockfilter.h b/examples/c/sockfilter.h new file mode 100644 index 0000000..87df2f9 --- /dev/null +++ b/examples/c/sockfilter.h @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2022 Jacky Yin */ +#ifndef __SOCKFILTER_H +#define __SOCKFILTER_H + +struct so_event { + __be32 src_addr; + __be32 dst_addr; + union { + __be32 ports; + __be16 port16[2]; + }; + __u32 ip_proto; + __u32 pkt_type; + __u32 ifindex; +}; + +#endif /* __SOCKFILTER_H */ diff --git a/examples/c/tc.bpf.c b/examples/c/tc.bpf.c new file mode 100644 index 0000000..77c2045 --- /dev/null +++ b/examples/c/tc.bpf.c @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2022 Hengqi Chen */ +#include +#include +#include +#include + +#define TC_ACT_OK 0 +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ + +SEC("tc") +int tc_ingress(struct __sk_buff *ctx) +{ + void *data_end = (void *)(__u64)ctx->data_end; + void *data = (void *)(__u64)ctx->data; + struct ethhdr *l2; + struct iphdr *l3; + + if (ctx->protocol != bpf_htons(ETH_P_IP)) + return TC_ACT_OK; + + l2 = data; + if ((void *)(l2 + 1) > data_end) + return TC_ACT_OK; + + l3 = (struct iphdr *)(l2 + 1); + if ((void *)(l3 + 1) > data_end) + return TC_ACT_OK; + + bpf_printk("Got IP packet: tot_len: %d, ttl: %d", bpf_ntohs(l3->tot_len), l3->ttl); + return TC_ACT_OK; +} + +char __license[] SEC("license") = "GPL"; diff --git a/examples/c/tc.c b/examples/c/tc.c new file mode 100644 index 0000000..a89207d --- /dev/null +++ b/examples/c/tc.c @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2022 Hengqi Chen */ +#include +#include +#include "tc.skel.h" + +#define LO_IFINDEX 1 + +static volatile sig_atomic_t exiting = 0; + +static void sig_int(int signo) +{ + exiting = 1; +} + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +int main(int argc, char **argv) +{ + DECLARE_LIBBPF_OPTS(bpf_tc_hook, tc_hook, .ifindex = LO_IFINDEX, + .attach_point = BPF_TC_INGRESS); + DECLARE_LIBBPF_OPTS(bpf_tc_opts, tc_opts, .handle = 1, .priority = 1); + bool hook_created = false; + struct tc_bpf *skel; + int err; + + libbpf_set_print(libbpf_print_fn); + + skel = tc_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + /* The hook (i.e. qdisc) may already exists because: + * 1. it is created by other processes or users + * 2. or since we are attaching to the TC ingress ONLY, + * bpf_tc_hook_destroy does NOT really remove the qdisc, + * there may be an egress filter on the qdisc + */ + err = bpf_tc_hook_create(&tc_hook); + if (!err) + hook_created = true; + if (err && err != -EEXIST) { + fprintf(stderr, "Failed to create TC hook: %d\n", err); + goto cleanup; + } + + tc_opts.prog_fd = bpf_program__fd(skel->progs.tc_ingress); + err = bpf_tc_attach(&tc_hook, &tc_opts); + if (err) { + fprintf(stderr, "Failed to attach TC: %d\n", err); + goto cleanup; + } + + if (signal(SIGINT, sig_int) == SIG_ERR) { + err = errno; + fprintf(stderr, "Can't set signal handler: %s\n", strerror(errno)); + goto cleanup; + } + + printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " + "to see output of the BPF program.\n"); + + while (!exiting) { + fprintf(stderr, "."); + sleep(1); + } + + tc_opts.flags = tc_opts.prog_fd = tc_opts.prog_id = 0; + err = bpf_tc_detach(&tc_hook, &tc_opts); + if (err) { + fprintf(stderr, "Failed to detach TC: %d\n", err); + goto cleanup; + } + +cleanup: + if (hook_created) + bpf_tc_hook_destroy(&tc_hook); + tc_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/test.old b/examples/c/test.old new file mode 100644 index 0000000..508aff6 Binary files /dev/null and b/examples/c/test.old differ diff --git a/examples/c/uprobe.bpf.c b/examples/c/uprobe.bpf.c new file mode 100644 index 0000000..c5c9ba0 --- /dev/null +++ b/examples/c/uprobe.bpf.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; + +SEC("uprobe") +int BPF_KPROBE(uprobe_add, int a, int b) +{ + bpf_printk("uprobed_add ENTRY: a = %d, b = %d", a, b); + return 0; +} + +SEC("uretprobe") +int BPF_KRETPROBE(uretprobe_add, int ret) +{ + bpf_printk("uprobed_add EXIT: return = %d", ret); + return 0; +} + +SEC("uprobe//proc/self/exe:uprobed_sub") +int BPF_KPROBE(uprobe_sub, int a, int b) +{ + bpf_printk("uprobed_sub ENTRY: a = %d, b = %d", a, b); + return 0; +} + +SEC("uretprobe//proc/self/exe:uprobed_sub") +int BPF_KRETPROBE(uretprobe_sub, int ret) +{ + bpf_printk("uprobed_sub EXIT: return = %d", ret); + return 0; +} diff --git a/examples/c/uprobe.c b/examples/c/uprobe.c new file mode 100644 index 0000000..8651dca --- /dev/null +++ b/examples/c/uprobe.c @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2020 Facebook */ +#include +#include +#include +#include +#include +#include "uprobe.skel.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +/* + * Taken from https://github.com/torvalds/linux/blob/9b59ec8d50a1f28747ceff9a4f39af5deba9540e/tools/testing/selftests/bpf/trace_helpers.c#L149-L205 + * + * See discussion in https://github.com/libbpf/libbpf-bootstrap/pull/90 + */ +ssize_t get_uprobe_offset(const void *addr) +{ + size_t start, end, base; + char buf[256]; + bool found = false; + FILE *f; + + f = fopen("/proc/self/maps", "r"); + if (!f) + return -errno; + + while (fscanf(f, "%zx-%zx %s %zx %*[^\n]\n", &start, &end, buf, &base) == 4) { + if (buf[2] == 'x' && (uintptr_t)addr >= start && (uintptr_t)addr < end) { + found = true; + break; + } + } + + fclose(f); + + if (!found) + return -ESRCH; + + return (uintptr_t)addr - start + base; +} + +/* It's a global function to make sure compiler doesn't inline it. */ +int uprobed_add(int a, int b) +{ + return a + b; +} + +int uprobed_sub(int a, int b) +{ + return a - b; +} + +int main(int argc, char **argv) +{ + struct uprobe_bpf *skel; + long uprobe_offset; + int err, i; + + /* Set up libbpf errors and debug info callback */ + libbpf_set_print(libbpf_print_fn); + + /* Load and verify BPF application */ + skel = uprobe_bpf__open_and_load(); + if (!skel) { + fprintf(stderr, "Failed to open and load BPF skeleton\n"); + return 1; + } + + /* uprobe/uretprobe expects relative offset of the function to attach + * to. This offset is relateve to the process's base load address. So + * easy way to do this is to take an absolute address of the desired + * function and substract base load address from it. If we were to + * parse ELF to calculate this function, we'd need to add .text + * section offset and function's offset within .text ELF section. + */ + uprobe_offset = get_uprobe_offset(&uprobed_add); + + /* Attach tracepoint handler */ + skel->links.uprobe_add = + bpf_program__attach_uprobe(skel->progs.uprobe_add, false /* not uretprobe */, + 0 /* self pid */, "/proc/self/exe", uprobe_offset); + + if (!skel->links.uprobe_add) { + err = -errno; + fprintf(stderr, "Failed to attach uprobe: %d\n", err); + goto cleanup; + } + + /* we can also attach uprobe/uretprobe to any existing or future + * processes that use the same binary executable; to do that we need + * to specify -1 as PID, as we do here + */ + skel->links.uretprobe_add = + bpf_program__attach_uprobe(skel->progs.uretprobe_add, true /* uretprobe */, + -1 /* any pid */, "/proc/self/exe", uprobe_offset); + + if (!skel->links.uretprobe_add) { + err = -errno; + fprintf(stderr, "Failed to attach uprobe: %d\n", err); + goto cleanup; + } + + /* Let libbpf perform auto-attach for uprobe_sub/uretprobe_sub + * NOTICE: we provide path and symbol info in SEC for BPF programs + */ + err = uprobe_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to auto-attach BPF skeleton: %d\n", err); + goto cleanup; + } + + printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " + "to see output of the BPF programs.\n"); + + for (i = 0;; i++) { + /* trigger our BPF programs */ + fprintf(stderr, "."); + uprobed_add(i, i + 1); + uprobed_sub(i * i, i); + sleep(1); + } + +cleanup: + uprobe_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/usdt.bpf.c b/examples/c/usdt.bpf.c new file mode 100644 index 0000000..49ba506 --- /dev/null +++ b/examples/c/usdt.bpf.c @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2022 Hengqi Chen */ +#include +#include +#include +#include + +pid_t my_pid; + +SEC("usdt/libc.so.6:libc:setjmp") +int BPF_USDT(usdt_auto_attach, void *arg1, int arg2, void *arg3) +{ + pid_t pid = bpf_get_current_pid_tgid() >> 32; + + if (pid != my_pid) + return 0; + + bpf_printk("USDT auto attach to libc:setjmp: arg1 = %lx, arg2 = %d, arg3 = %lx", arg1, arg2, + arg3); + return 0; +} + +SEC("usdt") +int BPF_USDT(usdt_manual_attach, void *arg1, int arg2, void *arg3) +{ + bpf_printk("USDT manual attach to libc:setjmp: arg1 = %lx, arg2 = %d, arg3 = %lx", arg1, + arg2, arg3); + return 0; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/examples/c/usdt.c b/examples/c/usdt.c new file mode 100644 index 0000000..1ffcbf2 --- /dev/null +++ b/examples/c/usdt.c @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2022 Hengqi Chen */ +#include +#include +#include +#include +#include "usdt.skel.h" + +static volatile sig_atomic_t exiting; +static jmp_buf env; + +static void sig_int(int signo) +{ + exiting = 1; +} + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return vfprintf(stderr, format, args); +} + +static void usdt_trigger() +{ + setjmp(env); +} + +int main(int argc, char **argv) +{ + struct usdt_bpf *skel; + int err; + + libbpf_set_print(libbpf_print_fn); + + skel = usdt_bpf__open(); + if (!skel) { + fprintf(stderr, "Failed to open BPF skeleton\n"); + return 1; + } + + skel->bss->my_pid = getpid(); + + err = usdt_bpf__load(skel); + if (!skel) { + fprintf(stderr, "Failed to load BPF skeleton\n"); + return 1; + } + + /* + * Manually attach to libc.so we find. + * We specify pid here, so we don't have to do pid filtering in BPF program. + */ + skel->links.usdt_manual_attach = bpf_program__attach_usdt( + skel->progs.usdt_manual_attach, getpid(), "libc.so.6", "libc", "setjmp", NULL); + if (!skel->links.usdt_manual_attach) { + err = errno; + fprintf(stderr, "Failed to attach BPF program `usdt_manual_attach`\n"); + goto cleanup; + } + + /* + * Auto attach by libbpf, libbpf should be able to find libc.so in your system. + * By default, auto attach does NOT specify pid, so we do pid filtering in BPF program + */ + err = usdt_bpf__attach(skel); + if (err) { + fprintf(stderr, "Failed to attach BPF skeleton\n"); + goto cleanup; + } + + if (signal(SIGINT, sig_int) == SIG_ERR) { + err = errno; + fprintf(stderr, "can't set signal handler: %s\n", strerror(errno)); + goto cleanup; + } + + printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " + "to see output of the BPF programs.\n"); + + while (!exiting) { + /* trigger our BPF programs */ + usdt_trigger(); + fprintf(stderr, "."); + sleep(1); + } + +cleanup: + usdt_bpf__destroy(skel); + return -err; +} diff --git a/examples/c/xmake.lua b/examples/c/xmake.lua new file mode 100644 index 0000000..1854335 --- /dev/null +++ b/examples/c/xmake.lua @@ -0,0 +1,108 @@ +add_rules("mode.release", "mode.debug") +add_rules("platform.linux.bpf") +set_license("GPL-2.0") + +if xmake.version():satisfies(">=2.5.7 <=2.5.9") then + on_load(function (target) + raise("xmake(%s) has a bug preventing BPF source code compilation. Please run `xmake update -f 2.5.6` to revert to v2.5.6 version or upgrade to xmake v2.6.1 that fixed the issue.", xmake.version()) + end) +end + +option("system-libbpf", {showmenu = true, default = false, description = "Use system-installed libbpf"}) +option("require-bpftool", {showmenu = true, default = false, description = "Require bpftool package"}) + +add_requires("elfutils", "zlib") +if is_plat("android") then + add_requires("ndk >=22.x", "argp-standalone") + set_toolchains("@ndk", {sdkver = "23"}) +else + add_requires("llvm >=10.x") + set_toolchains("@llvm") + add_requires("linux-headers") +end + +add_includedirs("../../vmlinux") + +-- we can run `xmake f --require-bpftool=y` to pull bpftool from xmake-repo repository +if has_config("require-bpftool") then + add_requires("linux-tools", {configs = {bpftool = true}}) + add_packages("linux-tools") +else + before_build(function (target) + os.addenv("PATH", path.join(os.scriptdir(), "..", "..", "tools")) + end) +end + +-- we use the vendored libbpf sources for libbpf-bootstrap. +-- for some projects you may want to use the system-installed libbpf, so you can run `xmake f --system-libbpf=y` +if has_config("system-libbpf") then + add_requires("libbpf", {system = true}) +else + target("libbpf") + set_kind("static") + set_basename("bpf") + add_files("../../libbpf/src/*.c") + add_includedirs("../../libbpf/include") + add_includedirs("../../libbpf/include/uapi", {public = true}) + add_includedirs("$(buildir)", {interface = true}) + add_configfiles("../../libbpf/src/(*.h)", {prefixdir = "bpf"}) + add_packages("elfutils", "zlib") + if is_plat("android") then + add_defines("__user=", "__force=", "__poll_t=uint32_t") + end +end + +target("minimal") + set_kind("binary") + add_files("minimal.c", "minimal.bpf.c") + add_packages("linux-headers") + if not has_config("system-libbpf") then + add_deps("libbpf") + end + +target("minimal_legacy") + set_kind("binary") + add_files("minimal_legacy.c", "minimal_legacy.bpf.c") + add_packages("linux-headers") + if not has_config("system-libbpf") then + add_deps("libbpf") + end + +target("bootstrap") + set_kind("binary") + add_files("bootstrap.c", "bootstrap.bpf.c") + add_packages("linux-headers") + if not has_config("system-libbpf") then + add_deps("libbpf") + end + if is_plat("android") then + add_packages("argp-standalone") + end + +target("fentry") + set_kind("binary") + add_files("fentry.c", "fentry.bpf.c") + add_packages("linux-headers") + if not has_config("system-libbpf") then + add_deps("libbpf") + end + +target("uprobe") + set_kind("binary") + add_files("uprobe.c", "uprobe.bpf.c") + add_packages("linux-headers") + if not has_config("system-libbpf") then + add_deps("libbpf") + end + +target("kprobe") + set_kind("binary") + add_files("kprobe.c", "kprobe.bpf.c") + add_packages("linux-headers") + if not has_config("system-libbpf") then + add_deps("libbpf") + end + if is_plat("android") then + -- TODO we need fix vmlinux.h to support android + set_default(false) + end diff --git a/examples/rust/.gitignore b/examples/rust/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/examples/rust/.gitignore @@ -0,0 +1 @@ +target diff --git a/examples/rust/Cargo.lock b/examples/rust/Cargo.lock new file mode 100644 index 0000000..d7856bb --- /dev/null +++ b/examples/rust/Cargo.lock @@ -0,0 +1,818 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "blazesym" +version = "0.2.0-alpha.2" +dependencies = [ + "libc", +] + +[[package]] +name = "camino" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ad0e1e3e88dd237a156ab9f571021b8a158caa0ae44b1968a241efb5144c1e" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "3.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29e724a68d9319343bb3328c9cc2dfde263f4b3142ee1059a9980580171c954b" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "once_cell", + "strsim 0.10.0", + "termcolor", + "textwrap 0.15.0", +] + +[[package]] +name = "clap_derive" +version = "3.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13547f7012c01ab4a0e8f8967730ada8f9fdf419e8b6c792788f39cf4e46eefa" +dependencies = [ + "heck 0.4.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ctrlc" +version = "3.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d91974fbbe88ec1df0c24a4f00f99583667a7e2e6272b2b92d294d81e462173" +dependencies = [ + "nix 0.25.0", + "winapi", +] + +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + +[[package]] +name = "flate2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "itoa" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libbpf-cargo" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9bdbd32bc3fd6a2b6ca7a73cf1a4976c1da51be8367849226573348f338ec0" +dependencies = [ + "anyhow", + "cargo_metadata", + "clap 3.2.17", + "libbpf-sys", + "memmap2", + "num_enum", + "regex", + "scroll", + "scroll_derive", + "semver", + "serde", + "serde_json", + "tempfile", + "thiserror", +] + +[[package]] +name = "libbpf-rs" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae623007dfcd01956d889e06f2c003106573158fe61e88450e9f448466d6dbed" +dependencies = [ + "bitflags", + "lazy_static", + "libbpf-sys", + "nix 0.24.2", + "num_enum", + "strum_macros", + "thiserror", + "vsprintf", +] + +[[package]] +name = "libbpf-sys" +version = "1.0.4+v1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6295785ed176d06d7a03595331cd89b986a0f4af84a7f35e8e745af9787f0b13" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "libc" +version = "0.2.139" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +dependencies = [ + "adler", +] + +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb" +dependencies = [ + "autocfg", + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "object" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +dependencies = [ + "flate2", + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" + +[[package]] +name = "os_str_bytes" +version = "6.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" + +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "proc-macro-crate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +dependencies = [ + "once_cell", + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profile" +version = "0.1.0" +dependencies = [ + "blazesym", + "clap 3.2.17", + "libbpf-cargo", + "libbpf-rs", + "libc", + "nix 0.24.2", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "rustversion" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" + +[[package]] +name = "ryu" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" + +[[package]] +name = "scroll_derive" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "semver" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "structopt" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +dependencies = [ + "clap 2.34.0", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck 0.3.3", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "strum_macros" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" +dependencies = [ + "heck 0.3.3", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "textwrap" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" + +[[package]] +name = "thiserror" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "tracecon" +version = "0.1.0" +dependencies = [ + "anyhow", + "ctrlc", + "libbpf-cargo", + "libbpf-rs", + "libc", + "object", + "plain", + "structopt", +] + +[[package]] +name = "unicode-ident" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" + +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vsprintf" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec2f81b75ca063294776b4f7e8da71d1d5ae81c2b1b149c8d89969230265d63" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "xdp" +version = "0.1.0" +dependencies = [ + "anyhow", + "ctrlc", + "libbpf-cargo", + "libbpf-rs", + "libc", + "structopt", +] diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml new file mode 100644 index 0000000..c5c4cb3 --- /dev/null +++ b/examples/rust/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] +members = [ + "tracecon", + "xdp", + "profile", +] diff --git a/examples/rust/profile/.gitignore b/examples/rust/profile/.gitignore new file mode 100644 index 0000000..3a1b448 --- /dev/null +++ b/examples/rust/profile/.gitignore @@ -0,0 +1,2 @@ +/src/bpf/.output +/target diff --git a/examples/rust/profile/Cargo.toml b/examples/rust/profile/Cargo.toml new file mode 100644 index 0000000..55623df --- /dev/null +++ b/examples/rust/profile/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "profile" +version = "0.1.0" +authors = ["Kuifeng Lee "] +license = "GPL-2.0 OR BSD-3-Clause" + +[dependencies] +libbpf-rs = "0.19" +nix = "0.24.1" +blazesym = { path = "../../../blazesym", default-features = false, features = ["dont-generate-test-files"] } +libc = "*" +clap = { version = "3.1.18", features = ["derive"] } + +[build-dependencies] +libbpf-cargo = "0.13" diff --git a/examples/rust/profile/build.rs b/examples/rust/profile/build.rs new file mode 100644 index 0000000..057c0b5 --- /dev/null +++ b/examples/rust/profile/build.rs @@ -0,0 +1,25 @@ +use std::fs::create_dir_all; +use std::path::Path; + +extern crate libbpf_cargo; +use libbpf_cargo::SkeletonBuilder; + +const SRC: &str = "./src/bpf/profile.bpf.c"; + +fn main() { + // It's unfortunate we cannot use `OUT_DIR` to store the generated skeleton. + // Reasons are because the generated skeleton contains compiler attributes + // that cannot be `include!()`ed via macro. And we cannot use the `#[path = "..."]` + // trick either because you cannot yet `concat!(env!("OUT_DIR"), "/skel.rs")` inside + // the path attribute either (see https://github.com/rust-lang/rust/pull/83366). + // + // However, there is hope! When the above feature stabilizes we can clean this + // all up. + create_dir_all("./src/bpf/.output").unwrap(); + let skel = Path::new("./src/bpf/.output/profile.skel.rs"); + SkeletonBuilder::new() + .source(SRC) + .build_and_generate(&skel) + .expect("bpf compilation failed"); + println!("cargo:rerun-if-changed={}", SRC); +} diff --git a/examples/rust/profile/src/bpf/profile.bpf.c b/examples/rust/profile/src/bpf/profile.bpf.c new file mode 120000 index 0000000..4a45257 --- /dev/null +++ b/examples/rust/profile/src/bpf/profile.bpf.c @@ -0,0 +1 @@ +../../../../c/profile.bpf.c \ No newline at end of file diff --git a/examples/rust/profile/src/bpf/profile.h b/examples/rust/profile/src/bpf/profile.h new file mode 120000 index 0000000..7dd1339 --- /dev/null +++ b/examples/rust/profile/src/bpf/profile.h @@ -0,0 +1 @@ +../../../../c/profile.h \ No newline at end of file diff --git a/examples/rust/profile/src/bpf/vmlinux.h b/examples/rust/profile/src/bpf/vmlinux.h new file mode 120000 index 0000000..cab453b --- /dev/null +++ b/examples/rust/profile/src/bpf/vmlinux.h @@ -0,0 +1 @@ +../../../../../vmlinux/vmlinux.h \ No newline at end of file diff --git a/examples/rust/profile/src/main.rs b/examples/rust/profile/src/main.rs new file mode 100644 index 0000000..4d7cc36 --- /dev/null +++ b/examples/rust/profile/src/main.rs @@ -0,0 +1,229 @@ +use std::u64; + +use std::boxed::Box; +use std::io::Error; +use std::mem; +use std::result::Result; +use std::time::Duration; + +extern crate nix; +use nix::unistd::close; + +extern crate libbpf_rs; + +extern crate clap; +use clap::Parser; + +#[path = "bpf/.output/profile.skel.rs"] +mod profile; +use profile::*; + +extern crate blazesym; +use blazesym::symbolize; + +extern crate libc; + +mod syscall; + +const MAX_STACK_DEPTH: usize = 128; +const TASK_COMM_LEN: usize = 16; + +// A Rust version of stacktrace_event in profile.h +#[repr(C)] +struct stacktrace_event { + pid: u32, + cpu_id: u32, + comm: [u8; TASK_COMM_LEN], + kstack_size: i32, + ustack_size: i32, + kstack: [u64; MAX_STACK_DEPTH], + ustack: [u64; MAX_STACK_DEPTH], +} + +fn init_perf_monitor(freq: u64) -> Vec { + let nprocs = libbpf_rs::num_possible_cpus().unwrap(); + let pid = -1; + let buf: Vec = vec![0; mem::size_of::()]; + let mut attr = unsafe { + Box::::from_raw( + buf.leak().as_mut_ptr() as *mut syscall::perf_event_attr + ) + }; + attr._type = syscall::PERF_TYPE_HARDWARE; + attr.size = mem::size_of::() as u32; + attr.config = syscall::PERF_COUNT_HW_CPU_CYCLES; + attr.sample.sample_freq = freq; + attr.flags = 1 << 10; // freq = 1 + (0..nprocs) + .map(|cpu| { + let fd = syscall::perf_event_open(attr.as_ref(), pid, cpu as i32, -1, 0); + fd as i32 + }) + .collect() +} + +fn attach_perf_event( + pefds: &[i32], + prog: &mut libbpf_rs::Program, +) -> Vec> { + pefds + .iter() + .map(|pefd| prog.attach_perf_event(*pefd)) + .collect() +} + +// Pid 0 means a kernel space stack. +fn show_stack_trace(stack: &[u64], symbolizer: &symbolize::Symbolizer, pid: u32) { + let converted_stack; + // The kernel always reports `u64` addresses, whereas blazesym uses `usize`. + // Convert the stack trace as necessary. + let stack = if mem::size_of::() != mem::size_of::() { + converted_stack = stack + .iter() + .copied() + .map(|addr| addr as blazesym::Addr) + .collect::>(); + converted_stack.as_slice() + } else { + // SAFETY: `Addr` has the same size as `u64`, so it can be trivially and + // safely converted. + unsafe { mem::transmute::<_, &[blazesym::Addr]>(stack) } + }; + + let src = if pid == 0 { + symbolize::Source::from(symbolize::Kernel::default()) + } else { + symbolize::Source::from(symbolize::Process::new(pid.into())) + }; + + let syms = symbolizer.symbolize(&src, stack).unwrap(); + for i in 0..stack.len() { + if syms.len() <= i || syms[i].len() == 0 { + println!(" {} [<{:016x}>]", i, stack[i]); + continue; + } + + if syms[i].len() == 1 { + let sym = &syms[i][0]; + if !sym.path.as_os_str().is_empty() { + println!( + " {} [<{:016x}>] {}+0x{:x} {}:{}", + i, + stack[i], + sym.symbol, + stack[i] - sym.addr, + sym.path.display(), + sym.line + ); + } else { + println!( + " {} [<{:016x}>] {}+0x{}", + i, + stack[i], + sym.symbol, + stack[i] - sym.addr + ); + } + continue; + } + + println!(" {} [<{:016x}>]", i, stack[i]); + + for sym in &syms[i] { + if !sym.path.as_os_str().is_empty() { + println!( + " {}+0x{:x} {}:{}", + sym.symbol, + stack[i] - sym.addr, + sym.path.display(), + sym.line + ); + } else { + println!(" {}+0x{}", sym.symbol, stack[i] - sym.addr); + } + } + } +} + +fn event_handler(symbolizer: &symbolize::Symbolizer, data: &[u8]) -> ::std::os::raw::c_int { + if data.len() != mem::size_of::() { + eprintln!( + "Invalid size {} != {}", + data.len(), + mem::size_of::() + ); + return 1; + } + + let event = unsafe { &*(data.as_ptr() as *const stacktrace_event) }; + + if event.kstack_size <= 0 && event.ustack_size <= 0 { + return 1; + } + + let comm = std::str::from_utf8(&event.comm) + .or::(Ok("")) + .unwrap(); + println!("COMM: {} (pid={}) @ CPU {}", comm, event.pid, event.cpu_id); + + if event.kstack_size > 0 { + println!("Kernel:"); + show_stack_trace( + &event.kstack[0..(event.kstack_size as usize / mem::size_of::())], + symbolizer, + 0, + ); + } else { + println!("No Kernel Stack"); + } + + if event.ustack_size > 0 { + println!("Userspace:"); + show_stack_trace( + &event.ustack[0..(event.ustack_size as usize / mem::size_of::())], + symbolizer, + event.pid, + ); + } else { + println!("No Userspace Stack"); + } + + println!(); + 0 +} + +#[derive(Parser, Debug)] +struct Args { + /// Sampling frequency + #[clap(short, default_value_t = 1)] + freq: u64, +} + +fn main() -> Result<(), Error> { + let args = Args::parse(); + let freq = if args.freq < 1 { 1 } else { args.freq }; + + let symbolizer = symbolize::Symbolizer::new(); + + let skel_builder = ProfileSkelBuilder::default(); + let open_skel = skel_builder.open().unwrap(); + let mut skel = open_skel.load().unwrap(); + + let pefds = init_perf_monitor(freq); + let _links = attach_perf_event(&pefds, skel.progs_mut().profile()); + + let mut builder = libbpf_rs::RingBufferBuilder::new(); + builder + .add(skel.maps().events(), move |data| { + event_handler(&symbolizer, data) + }) + .unwrap(); + let ringbuf = builder.build().unwrap(); + while ringbuf.poll(Duration::MAX).is_ok() {} + + for pefd in pefds { + close(pefd)?; + } + + Ok(()) +} diff --git a/examples/rust/profile/src/syscall.rs b/examples/rust/profile/src/syscall.rs new file mode 100644 index 0000000..eb73f3b --- /dev/null +++ b/examples/rust/profile/src/syscall.rs @@ -0,0 +1,80 @@ +extern crate libc; + +#[repr(C)] +pub union sample_un { + pub sample_period: u64, + pub sample_freq: u64, +} + +#[repr(C)] +pub union wakeup_un { + pub wakeup_events: u32, + pub wakeup_atermark: u32, +} + +#[repr(C)] +pub union bp_1_un { + pub bp_addr: u64, + pub kprobe_func: u64, + pub uprobe_path: u64, + pub config1: u64, +} + +#[repr(C)] +pub union bp_2_un { + pub bp_len: u64, + pub kprobe_addr: u64, + pub probe_offset: u64, + pub config2: u64, +} + +#[repr(C)] +pub struct perf_event_attr { + pub _type: u32, + pub size: u32, + pub config: u64, + pub sample: sample_un, + pub sample_type: u64, + pub read_format: u64, + pub flags: u64, + pub wakeup: wakeup_un, + pub bp_type: u32, + pub bp_1: bp_1_un, + pub bp_2: bp_2_un, + pub branch_sample_type: u64, + pub sample_regs_user: u64, + pub sample_stack_user: u32, + pub clockid: i32, + pub sample_regs_intr: u64, + pub aux_watermark: u32, + pub sample_max_stack: u16, + pub __reserved_2: u16, + pub aux_sample_size: u32, + pub __reserved_3: u32, +} + +pub const PERF_TYPE_HARDWARE: u32 = 0; +pub const PERF_COUNT_HW_CPU_CYCLES: u64 = 0; + +extern "C" { + fn syscall(number: libc::c_long, ...) -> libc::c_long; +} + +pub fn perf_event_open( + hw_event: &perf_event_attr, + pid: libc::pid_t, + cpu: libc::c_int, + group_fd: libc::c_int, + flags: libc::c_ulong, +) -> libc::c_long { + unsafe { + syscall( + libc::SYS_perf_event_open, + hw_event as *const perf_event_attr, + pid, + cpu, + group_fd, + flags, + ) + } +} diff --git a/examples/rust/tracecon/.gitignore b/examples/rust/tracecon/.gitignore new file mode 100644 index 0000000..3a1b448 --- /dev/null +++ b/examples/rust/tracecon/.gitignore @@ -0,0 +1,2 @@ +/src/bpf/.output +/target diff --git a/examples/rust/tracecon/Cargo.lock b/examples/rust/tracecon/Cargo.lock new file mode 100644 index 0000000..de5b3a8 --- /dev/null +++ b/examples/rust/tracecon/Cargo.lock @@ -0,0 +1,759 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee10e43ae4a853c0a3591d4e2ada1719e553be18199d9da9d4a83f5927c2f5c7" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714a157da7991e23d90686b9524b9e12e0407a108647f52e9328f4b3d51ac7f" +dependencies = [ + "cargo-platform", + "semver 0.11.0", + "semver-parser", + "serde", + "serde_json", +] + +[[package]] +name = "cc" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "crc32fast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ctrlc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19c6cedffdc8c03a3346d723eb20bd85a13362bb96dc2ac000842c6381ec7bf" +dependencies = [ + "nix 0.23.0", + "winapi", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libbpf-cargo" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23536bf02ff6387e7bb68055f6ad52d75c20d77b2ab6535977fc1e771041286c" +dependencies = [ + "anyhow", + "cargo_metadata", + "libbpf-sys", + "memmap2", + "num_enum", + "regex", + "scroll", + "scroll_derive", + "semver 1.0.4", + "serde", + "serde_json", + "structopt", + "tempfile", + "thiserror", +] + +[[package]] +name = "libbpf-rs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d1f46d8d976bba68a9b772138e2307cfd7432bf66f3e1c83b3944e83ab9002" +dependencies = [ + "bitflags", + "libbpf-sys", + "nix 0.22.0", + "num_enum", + "strum_macros", + "thiserror", + "vsprintf", +] + +[[package]] +name = "libbpf-sys" +version = "0.5.0-2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97982339699ecfda9742ae39311fac5a6cce5ac7330bcf714cb702a49ecc8e2a" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "libc" +version = "0.2.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memmap2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "nix" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1e25ee6b412c2a1e3fcb6a4499a5c1bfe7f43e014bdce9a6b6666e5aa2d187" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f305c2c2e4c39a82f7bf0bf65fb557f9070ce06781d4f2454295cc34b1c43188" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "num_enum" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" +dependencies = [ + "derivative", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "object" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +dependencies = [ + "flate2", + "memchr", +] + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "pkg-config" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "ppv-lite86" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" + +[[package]] +name = "proc-macro-crate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "scroll" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda28d4b4830b807a8b43f7b0e6b5df875311b3e7621d84577188c175b6ec1ec" + +[[package]] +name = "scroll_derive" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaaae8f38bb311444cfb7f1979af0bc9240d95795f75f9ceddf6a59b79ceffa0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", + "serde", +] + +[[package]] +name = "semver" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e466864e431129c7e0d3476b92f20458e5879919a0596c6472738d9fa2d342f8" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "structopt" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b9788f4202aa75c240ecc9c15c65185e6a39ccdeb0fd5d008b98825464c87c" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "strum_macros" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2afee18b8beb5a596ecb4a2dce128c719b4ba399d34126b9e4396e3f9860966" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "tracecon" +version = "0.1.0" +dependencies = [ + "anyhow", + "ctrlc", + "libbpf-cargo", + "libbpf-rs", + "libc", + "object", + "plain", + "structopt", +] + +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "unicode-segmentation" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "vsprintf" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec2f81b75ca063294776b4f7e8da71d1d5ae81c2b1b149c8d89969230265d63" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/examples/rust/tracecon/Cargo.toml b/examples/rust/tracecon/Cargo.toml new file mode 100644 index 0000000..96e2893 --- /dev/null +++ b/examples/rust/tracecon/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "tracecon" +version = "0.1.0" +authors = ["Magnus Kulke "] +edition = "2021" +license = "GPL-2.0 OR BSD-3-Clause" + +[dependencies] +anyhow = "1.0" +libbpf-rs = "0.19" +libc = "0.2" +structopt = "0.3" +ctrlc = "3.1" +object = "0.25" +plain = "0.2" + +[build-dependencies] +libbpf-cargo = "0.13" diff --git a/examples/rust/tracecon/README.md b/examples/rust/tracecon/README.md new file mode 100644 index 0000000..eaf2c49 --- /dev/null +++ b/examples/rust/tracecon/README.md @@ -0,0 +1,88 @@ +# tracecon + +An eBPF sample application, written in C & Rust using +[libbpf-rs](https://github.com/libbpf/libbpf-rs). It will output all +TCPv4 connections that have been established on the host as ips and +hostnames by probing `tcp_v4_connect` in kernel and glibc's `getaddrinfo` +in userland. On a successful host lookup the first result will be stored in +a hashmap, which can be used as a lookup table to retrieve a hostname for +ip_v4 connections. + +## Requirements + +### Kernel + +The project is built on technology like `CO-RE` and `BTF`, which is only +available in more recent kernels (5.0-ish). Ubuntu 20.10 has configured and +packaged all the required dependencies. + +### Compilers + +The project has been tested with LLVM v11 and Rust v1.52.1. + +### Generate `vmlinux.h` + +```bash +bpftool btf dump file /sys/kernel/btf/vmlinux format c > src/bpf/vmlinux.h +``` + +You can verify whether your kernel was built with BTF enabled: + +```bash +cat /boot/config-$(uname -r) | grep CONFIG_DEBUG_INFO_BTF +``` + +## Build + +### Vagrant + +eBPF is a low-level technology on the Linux kernel. Docker is not a good fit +to build eBPF code on MacOS or Windows environments. On those platforms +Docker ships its own kernel (e.g. linuxkit) and BTF might not be enabled. + +There is a `Vagrantfile` to provision a Ubuntu 20.10 VM including the +necessary dependencies to build the project. To install Vagrant with a +VirtualBox backend and provision the VM on a MacOS host machine run: + +``` +brew cask install virtualbox +brew cask install vagrant +vagrant up +``` + +Log in to the machine. The current host workdir is mounted to `/vagrant`: + +``` +vagrant ssh +sudo su - +cd /vagrant +``` + +### Cargo + +```bash +cargo build +``` + +## Run + +Start the program to instrument the eBPF probe and listen to events: + +```bash +cargo run --release +``` + +In another shell perform some http calls: + +```bash +curl -s www.jsonplaceholder.com > /dev/null +# Do not use a dns lookup +curl -s -H "Host: www.jsonplaceholder.com" 172.67.201.157 > /dev/null +``` + +The other shell should show the respective events: + +```bash +host event: www.jsonplaceholder.com +ip event: 172.67.201.157 +``` diff --git a/examples/rust/tracecon/Vagrantfile b/examples/rust/tracecon/Vagrantfile new file mode 100644 index 0000000..cdef072 --- /dev/null +++ b/examples/rust/tracecon/Vagrantfile @@ -0,0 +1,82 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.box = "ubuntu/groovy64" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # NOTE: This will enable public access to the opened port + # config.vm.network "forwarded_port", guest: 80, host: 8080 + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine and only allow access + # via 127.0.0.1 to disable public access + # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network "private_network", ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network "public_network" + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder ".", "/src", type: "rsync" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + config.vm.provider "virtualbox" do |vb| + # Display the VirtualBox GUI when booting the machine + vb.gui = false + + # Customize the amount of memory on the VM: + vb.memory = "16384" + vb.cpus = 4 + end + + # + # View the documentation for the provider you are using for more + # information on available options. + + # Enable provisioning with a shell script. Additional provisioners such as + # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the + # documentation for more information about their specific syntax and use. + config.vm.provision "shell", inline: <<-SHELL + apt-get update -y + apt-get install -y \ + build-essential \ + curl \ + libbpf-dev \ + clang \ + libelf-dev \ + linux-tools-$(uname -r) + curl https://sh.rustup.rs -sSf | sh -s -- -y + bpftool btf dump file \ + /sys/kernel/btf/vmlinux \ + format c > /vagrant/src/bpf/vmlinux.h + SHELL +end diff --git a/examples/rust/tracecon/build.rs b/examples/rust/tracecon/build.rs new file mode 100644 index 0000000..ce5c894 --- /dev/null +++ b/examples/rust/tracecon/build.rs @@ -0,0 +1,24 @@ +use std::fs::create_dir_all; +use std::path::Path; + +use libbpf_cargo::SkeletonBuilder; + +const SRC: &str = "./src/bpf/tracecon.bpf.c"; + +fn main() { + // It's unfortunate we cannot use `OUT_DIR` to store the generated skeleton. + // Reasons are because the generated skeleton contains compiler attributes + // that cannot be `include!()`ed via macro. And we cannot use the `#[path = "..."]` + // trick either because you cannot yet `concat!(env!("OUT_DIR"), "/skel.rs")` inside + // the path attribute either (see https://github.com/rust-lang/rust/pull/83366). + // + // However, there is hope! When the above feature stabilizes we can clean this + // all up. + create_dir_all("./src/bpf/.output").unwrap(); + let skel = Path::new("./src/bpf/.output/tracecon.skel.rs"); + SkeletonBuilder::new() + .source(SRC) + .build_and_generate(&skel) + .expect("bpf compilation failed"); + println!("cargo:rerun-if-changed={}", SRC); +} diff --git a/examples/rust/tracecon/src/bpf/tracecon.bpf.c b/examples/rust/tracecon/src/bpf/tracecon.bpf.c new file mode 100644 index 0000000..50ed178 --- /dev/null +++ b/examples/rust/tracecon/src/bpf/tracecon.bpf.c @@ -0,0 +1,162 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +#include "vmlinux.h" +#include +#include +#include + +#define memcpy(dest, src, n) __builtin_memcpy((dest), (src), (n)) +#define HOSTNAME_LEN 84 + +const volatile pid_t target_pid = 0; + +/* Copied from: include/netdb.h */ +struct addrinfo { + int ai_flags; /* Input flags. */ + int ai_family; /* Protocol family for socket. */ + int ai_socktype; /* Socket type. */ + int ai_protocol; /* Protocol for socket. */ + u32 ai_addrlen; /* Length of socket address. */ + struct sockaddr *ai_addr; /* Socket address for socket. */ + char *ai_canonname; /* Canonical name for service location. */ + struct addrinfo *ai_next; /* Pointer to next in list. */ +}; + +struct lookup { + char c[84]; + struct addrinfo **results; +}; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 10240); + __type(key, u32); + __type(value, struct lookup); +} lookups SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 10240); + __type(key, u32); + __type(value, struct lookup); +} hostnames SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, 10240); + __type(key, u32); + __type(value, struct sock *); +} sockets SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(key_size, sizeof(u32)); + __uint(value_size, sizeof(u32)); +} events SEC(".maps"); + +enum tag { IP = 0, HOSTNAME = 1 }; + +struct event { + u8 tag; + u8 ip[4]; + u8 hostname[HOSTNAME_LEN]; +}; + +/* trigger creation of event struct in skeleton code */ +struct event _event = {}; + +static u32 get_tid() +{ + u64 tgid = bpf_get_current_pid_tgid(); + pid_t pid = tgid >> 32; + + if (target_pid != 0 && target_pid != pid) + return 0; + return (u32)tgid; +} + +SEC("uprobe/getaddrinfo") +int BPF_KPROBE(getaddrinfo_enter, const char *hostname, const char *service, + const struct addrinfo *hints, struct addrinfo **res) +{ + u32 tid = get_tid(); + struct lookup lookup = {}; + + if (!tid) + return 0; + bpf_probe_read_user_str(&lookup.c, sizeof(lookup.c), hostname); + lookup.results = res; + bpf_map_update_elem(&lookups, &tid, &lookup, BPF_ANY); + return 0; +} + +SEC("uretprobe/getaddrinfo") +int BPF_KRETPROBE(getaddrinfo_exit, int ret) +{ + u32 tid = get_tid(); + struct lookup *lookup; + struct addrinfo *result; + struct sockaddr_in *addr; + struct in_addr ipv4_addr; + + if (!tid) + return 0; + if (ret != 0) + goto cleanup; + lookup = bpf_map_lookup_elem(&lookups, &tid); + if (!lookup) + return 0; + bpf_probe_read_user(&result, sizeof(result), lookup->results); + bpf_probe_read_user(&addr, sizeof(addr), &result->ai_addr); + bpf_probe_read_user(&ipv4_addr, sizeof(ipv4_addr), &addr->sin_addr); + bpf_map_update_elem(&hostnames, &ipv4_addr.s_addr, lookup, BPF_ANY); +cleanup: + bpf_map_delete_elem(&lookups, &tid); + return 0; +} + + +SEC("kprobe/tcp_v4_connect") +int BPF_KPROBE(tcp_v4_connect_enter, struct sock *sk, struct sockaddr *uaddr, int addr_len) +{ + u32 tid = get_tid(); + + if (!tid) + return 0; + bpf_map_update_elem(&sockets, &tid, &sk, 0); + return 0; +}; + +SEC("kretprobe/tcp_v4_connect") +int BPF_KRETPROBE(tcp_v4_connect_exit, int ret) +{ + u32 tid = get_tid(); + struct sock **sockpp; + struct lookup *lookup; + struct event event = {}; + u32 ip; + + if (!tid) + return 0; + if (ret != 0) + goto cleanup; + sockpp = bpf_map_lookup_elem(&sockets, &tid); + if (!sockpp) + return 0; + ip = BPF_CORE_READ(*sockpp, __sk_common.skc_daddr); + lookup = bpf_map_lookup_elem(&hostnames, &ip); + if (!lookup) { + event.tag = IP; + memcpy(&event.ip, &ip, sizeof(event.ip)); + } else { + event.tag = HOSTNAME; + memcpy(&event.hostname, &lookup->c, sizeof(lookup->c)); + bpf_map_delete_elem(&hostnames, &ip); + } + /* ctx is implied in the signature macro */ + bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event)); +cleanup: + bpf_map_delete_elem(&sockets, &tid); + return 0; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/examples/rust/tracecon/src/bpf/vmlinux.h b/examples/rust/tracecon/src/bpf/vmlinux.h new file mode 120000 index 0000000..cab453b --- /dev/null +++ b/examples/rust/tracecon/src/bpf/vmlinux.h @@ -0,0 +1 @@ +../../../../../vmlinux/vmlinux.h \ No newline at end of file diff --git a/examples/rust/tracecon/src/main.rs b/examples/rust/tracecon/src/main.rs new file mode 100644 index 0000000..3a9da0a --- /dev/null +++ b/examples/rust/tracecon/src/main.rs @@ -0,0 +1,128 @@ +use anyhow::{anyhow, bail, Context, Result}; +use core::time::Duration; +use libbpf_rs::PerfBufferBuilder; +use object::Object; +use object::ObjectSymbol; +use plain::Plain; +use std::fs; +use std::net::Ipv4Addr; +use std::path::Path; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use structopt::StructOpt; + +#[path = "bpf/.output/tracecon.skel.rs"] +mod tracecon; +use tracecon::*; + +type Event = tracecon_bss_types::event; +unsafe impl Plain for Event {} + +#[derive(Debug, StructOpt)] +struct Command { + /// verbose output + #[structopt(long, short)] + verbose: bool, + /// glibc path + #[structopt(long, short, default_value = "/lib/x86_64-linux-gnu/libc.so.6")] + glibc: String, + #[structopt(long, short)] + /// pid to observe + pid: Option, +} + +fn bump_memlock_rlimit() -> Result<()> { + let rlimit = libc::rlimit { + rlim_cur: 128 << 20, + rlim_max: 128 << 20, + }; + + if unsafe { libc::setrlimit(libc::RLIMIT_MEMLOCK, &rlimit) } != 0 { + bail!("Failed to increase rlimit"); + } + + Ok(()) +} + +fn get_symbol_address(so_path: &str, fn_name: &str) -> Result { + let path = Path::new(so_path); + let buffer = + fs::read(path).with_context(|| format!("could not read file `{}`", path.display()))?; + let file = object::File::parse(buffer.as_slice())?; + + let mut symbols = file.dynamic_symbols(); + let symbol = symbols + .find(|symbol| { + if let Ok(name) = symbol.name() { + return name == fn_name; + } + false + }) + .ok_or(anyhow!("symbol not found"))?; + + Ok(symbol.address() as usize) +} + +fn handle_event(_cpu: i32, data: &[u8]) { + let mut event = Event::default(); + plain::copy_from_bytes(&mut event, data).expect("Event data buffer was too short"); + + match event.tag { + 0 => println!("ip event: {}", Ipv4Addr::from(event.ip)), + 1 => println!("host event: {}", String::from_utf8_lossy(&event.hostname)), + _ => {} + } +} + +fn main() -> Result<()> { + let opts = Command::from_args(); + + let mut skel_builder = TraceconSkelBuilder::default(); + if opts.verbose { + skel_builder.obj_builder.debug(true); + } + + bump_memlock_rlimit()?; + let mut open_skel = skel_builder.open()?; + if let Some(pid) = opts.pid { + open_skel.rodata().target_pid = pid; + } + let mut skel = open_skel.load()?; + let address = get_symbol_address(&opts.glibc, "getaddrinfo")?; + + let _uprobe = + skel.progs_mut() + .getaddrinfo_enter() + .attach_uprobe(false, -1, &opts.glibc, address)?; + + let _uretprobe = + skel.progs_mut() + .getaddrinfo_exit() + .attach_uprobe(true, -1, &opts.glibc, address)?; + + let _kprobe = skel + .progs_mut() + .tcp_v4_connect_enter() + .attach_kprobe(false, "tcp_v4_connect")?; + + let _kretprobe = skel + .progs_mut() + .tcp_v4_connect_exit() + .attach_kprobe(true, "tcp_v4_connect")?; + + let perf = PerfBufferBuilder::new(skel.maps_mut().events()) + .sample_cb(handle_event) + .build()?; + + let running = Arc::new(AtomicBool::new(true)); + let r = running.clone(); + ctrlc::set_handler(move || { + r.store(false, Ordering::SeqCst); + })?; + + while running.load(Ordering::SeqCst) { + perf.poll(Duration::from_millis(100))?; + } + + Ok(()) +} diff --git a/examples/rust/xdp/.gitignore b/examples/rust/xdp/.gitignore new file mode 100644 index 0000000..3a1b448 --- /dev/null +++ b/examples/rust/xdp/.gitignore @@ -0,0 +1,2 @@ +/src/bpf/.output +/target diff --git a/examples/rust/xdp/Cargo.lock b/examples/rust/xdp/Cargo.lock new file mode 100644 index 0000000..c4169ca --- /dev/null +++ b/examples/rust/xdp/Cargo.lock @@ -0,0 +1,702 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714a157da7991e23d90686b9524b9e12e0407a108647f52e9328f4b3d51ac7f" +dependencies = [ + "cargo-platform", + "semver 0.11.0", + "semver-parser", + "serde", + "serde_json", +] + +[[package]] +name = "cc" +version = "1.0.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "ctrlc" +version = "3.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "232295399409a8b7ae41276757b5a1cc21032848d42bff2352261f958b3ca29a" +dependencies = [ + "nix 0.20.0", + "winapi", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "heck" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +dependencies = [ + "libc", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libbpf-cargo" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23536bf02ff6387e7bb68055f6ad52d75c20d77b2ab6535977fc1e771041286c" +dependencies = [ + "anyhow", + "cargo_metadata", + "libbpf-sys", + "memmap2", + "num_enum", + "regex", + "scroll", + "scroll_derive", + "semver 1.0.4", + "serde", + "serde_json", + "structopt", + "tempfile", + "thiserror", +] + +[[package]] +name = "libbpf-rs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d1f46d8d976bba68a9b772138e2307cfd7432bf66f3e1c83b3944e83ab9002" +dependencies = [ + "bitflags", + "libbpf-sys", + "nix 0.22.0", + "num_enum", + "strum_macros", + "thiserror", + "vsprintf", +] + +[[package]] +name = "libbpf-sys" +version = "0.5.0-2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97982339699ecfda9742ae39311fac5a6cce5ac7330bcf714cb702a49ecc8e2a" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "libc" +version = "0.2.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memmap2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg", +] + +[[package]] +name = "nix" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1e25ee6b412c2a1e3fcb6a4499a5c1bfe7f43e014bdce9a6b6666e5aa2d187" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "num_enum" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226b45a5c2ac4dd696ed30fa6b94b057ad909c7b7fc2e0d0808192bced894066" +dependencies = [ + "derivative", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "pkg-config" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" + +[[package]] +name = "ppv-lite86" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "scroll" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda28d4b4830b807a8b43f7b0e6b5df875311b3e7621d84577188c175b6ec1ec" + +[[package]] +name = "scroll_derive" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaaae8f38bb311444cfb7f1979af0bc9240d95795f75f9ceddf6a59b79ceffa0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", + "serde", +] + +[[package]] +name = "semver" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e466864e431129c7e0d3476b92f20458e5879919a0596c6472738d9fa2d342f8" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "structopt" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "strum_macros" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "unicode-segmentation" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" + +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "vsprintf" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec2f81b75ca063294776b4f7e8da71d1d5ae81c2b1b149c8d89969230265d63" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "xdp" +version = "0.1.0" +dependencies = [ + "anyhow", + "ctrlc", + "libbpf-cargo", + "libbpf-rs", + "libc", + "structopt", +] diff --git a/examples/rust/xdp/Cargo.toml b/examples/rust/xdp/Cargo.toml new file mode 100644 index 0000000..ba18964 --- /dev/null +++ b/examples/rust/xdp/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "xdp" +version = "0.1.0" +authors = ["Hengqi Chen "] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0" +ctrlc = { version = "3.0", features = ["termination"] } +libc = "0.2" +libbpf-rs = "0.19" +structopt = "0.3" + +[build-dependencies] +libbpf-cargo = "0.13" diff --git a/examples/rust/xdp/build.rs b/examples/rust/xdp/build.rs new file mode 100644 index 0000000..46df4b1 --- /dev/null +++ b/examples/rust/xdp/build.rs @@ -0,0 +1,24 @@ +use std::fs::create_dir_all; +use std::path::Path; + +use libbpf_cargo::SkeletonBuilder; + +const SRC: &str = "./src/bpf/xdppass.bpf.c"; + +fn main() { + // It's unfortunate we cannot use `OUT_DIR` to store the generated skeleton. + // Reasons are because the generated skeleton contains compiler attributes + // that cannot be `include!()`ed via macro. And we cannot use the `#[path = "..."]` + // trick either because you cannot yet `concat!(env!("OUT_DIR"), "/skel.rs")` inside + // the path attribute either (see https://github.com/rust-lang/rust/pull/83366). + // + // However, there is hope! When the above feature stabilizes we can clean this + // all up. + create_dir_all("./src/bpf/.output").unwrap(); + let skel = Path::new("./src/bpf/.output/xdppass.skel.rs"); + SkeletonBuilder::new() + .source(SRC) + .build_and_generate(&skel) + .unwrap(); + println!("cargo:rerun-if-changed={}", SRC); +} diff --git a/examples/rust/xdp/src/bpf/vmlinux.h b/examples/rust/xdp/src/bpf/vmlinux.h new file mode 120000 index 0000000..cab453b --- /dev/null +++ b/examples/rust/xdp/src/bpf/vmlinux.h @@ -0,0 +1 @@ +../../../../../vmlinux/vmlinux.h \ No newline at end of file diff --git a/examples/rust/xdp/src/bpf/xdppass.bpf.c b/examples/rust/xdp/src/bpf/xdppass.bpf.c new file mode 100644 index 0000000..f0bf395 --- /dev/null +++ b/examples/rust/xdp/src/bpf/xdppass.bpf.c @@ -0,0 +1,15 @@ +#include "vmlinux.h" +#include + +SEC("xdp") +int xdp_pass(struct xdp_md *ctx) +{ + void *data = (void *)(long)ctx->data; + void *data_end = (void *)(long)ctx->data_end; + int pkt_sz = data_end - data; + + bpf_printk("packet size: %d", pkt_sz); + return XDP_PASS; +} + +char __license[] SEC("license") = "GPL"; diff --git a/examples/rust/xdp/src/main.rs b/examples/rust/xdp/src/main.rs new file mode 100644 index 0000000..15d1e7f --- /dev/null +++ b/examples/rust/xdp/src/main.rs @@ -0,0 +1,57 @@ +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use std::{thread, time}; + +use anyhow::{bail, Result}; +use structopt::StructOpt; + +#[path = "bpf/.output/xdppass.skel.rs"] +mod xdppass; +use xdppass::*; + +#[derive(Debug, StructOpt)] +struct Command { + /// Interface index to attach XDP program + #[structopt(default_value = "0")] + ifindex: i32, +} + +fn bump_memlock_rlimit() -> Result<()> { + let rlimit = libc::rlimit { + rlim_cur: 128 << 20, + rlim_max: 128 << 20, + }; + + if unsafe { libc::setrlimit(libc::RLIMIT_MEMLOCK, &rlimit) } != 0 { + bail!("Failed to increase rlimit"); + } + + Ok(()) +} + +fn main() -> Result<()> { + let opts = Command::from_args(); + + bump_memlock_rlimit()?; + + let skel_builder = XdppassSkelBuilder::default(); + let open_skel = skel_builder.open()?; + let mut skel = open_skel.load()?; + let link = skel.progs_mut().xdp_pass().attach_xdp(opts.ifindex)?; + skel.links = XdppassLinks { + xdp_pass: Some(link), + }; + + let running = Arc::new(AtomicBool::new(true)); + let r = running.clone(); + ctrlc::set_handler(move || { + r.store(false, Ordering::SeqCst); + })?; + + while running.load(Ordering::SeqCst) { + eprint!("."); + thread::sleep(time::Duration::from_secs(1)); + } + + Ok(()) +} diff --git a/libbpf/.readthedocs.yaml b/libbpf/.readthedocs.yaml new file mode 100644 index 0000000..803dfa2 --- /dev/null +++ b/libbpf/.readthedocs.yaml @@ -0,0 +1,22 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Build documentation in the docs/ directory with Sphinx +sphinx: + builder: html + configuration: docs/conf.py + +formats: + - htmlzip + - pdf + - epub + +# Optionally set the version of Python and requirements required to build your docs +python: + version: 3.7 + install: + - requirements: docs/sphinx/requirements.txt \ No newline at end of file diff --git a/libbpf/BPF-CHECKPOINT-COMMIT b/libbpf/BPF-CHECKPOINT-COMMIT new file mode 100644 index 0000000..db6c0fa --- /dev/null +++ b/libbpf/BPF-CHECKPOINT-COMMIT @@ -0,0 +1 @@ +915efd8a446b74442039d31689d5d863caf82517 diff --git a/libbpf/CHECKPOINT-COMMIT b/libbpf/CHECKPOINT-COMMIT new file mode 100644 index 0000000..c803b12 --- /dev/null +++ b/libbpf/CHECKPOINT-COMMIT @@ -0,0 +1 @@ +226bc6ae6405c46a6e9865835c36a1d45fc0b3bf diff --git a/libbpf/LICENSE b/libbpf/LICENSE new file mode 100644 index 0000000..d38fed3 --- /dev/null +++ b/libbpf/LICENSE @@ -0,0 +1 @@ +LGPL-2.1 OR BSD-2-Clause diff --git a/libbpf/LICENSE.BSD-2-Clause b/libbpf/LICENSE.BSD-2-Clause new file mode 100644 index 0000000..bce40aa --- /dev/null +++ b/libbpf/LICENSE.BSD-2-Clause @@ -0,0 +1,32 @@ +Valid-License-Identifier: BSD-2-Clause +SPDX-URL: https://spdx.org/licenses/BSD-2-Clause.html +Usage-Guide: + To use the BSD 2-clause "Simplified" License put the following SPDX + tag/value pair into a comment according to the placement guidelines in + the licensing rules documentation: + SPDX-License-Identifier: BSD-2-Clause +License-Text: + +Copyright (c) 2015 The Libbpf Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/libbpf/LICENSE.LGPL-2.1 b/libbpf/LICENSE.LGPL-2.1 new file mode 100644 index 0000000..27bb434 --- /dev/null +++ b/libbpf/LICENSE.LGPL-2.1 @@ -0,0 +1,503 @@ +Valid-License-Identifier: LGPL-2.1 +Valid-License-Identifier: LGPL-2.1+ +SPDX-URL: https://spdx.org/licenses/LGPL-2.1.html +Usage-Guide: + To use this license in source code, put one of the following SPDX + tag/value pairs into a comment according to the placement + guidelines in the licensing rules documentation. + For 'GNU Lesser General Public License (LGPL) version 2.1 only' use: + SPDX-License-Identifier: LGPL-2.1 + For 'GNU Lesser General Public License (LGPL) version 2.1 or any later + version' use: + SPDX-License-Identifier: LGPL-2.1+ +License-Text: + +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts as +the successor of the GNU Library Public License, version 2, hence the +version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public Licenses are +intended to guarantee your freedom to share and change free software--to +make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially +designated software packages--typically libraries--of the Free Software +Foundation and other authors who decide to use it. You can use it too, but +we suggest you first think carefully about whether this license or the +ordinary General Public License is the better strategy to use in any +particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not +price. Our General Public Licenses are designed to make sure that you have +the freedom to distribute copies of free software (and charge for this +service if you wish); that you receive source code or can get it if you +want it; that you can change the software and use pieces of it in new free +programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for you if +you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for +a fee, you must give the recipients all the rights that we gave you. You +must make sure that they, too, receive or can get the source code. If you +link other code with the library, you must provide complete object files to +the recipients, so that they can relink them with the library after making +changes to the library and recompiling it. And you must show them these +terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no +warranty for the free library. Also, if the library is modified by someone +else and passed on, the recipients should know that what they have is not +the original version, so that the original author's reputation will not be +affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any +free program. We wish to make sure that a company cannot effectively +restrict the users of a free program by obtaining a restrictive license +from a patent holder. Therefore, we insist that any patent license obtained +for a version of the library must be consistent with the full freedom of +use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU +General Public License. This license, the GNU Lesser General Public +License, applies to certain designated libraries, and is quite different +from the ordinary General Public License. We use this license for certain +libraries in order to permit linking those libraries into non-free +programs. + +When a program is linked with a library, whether statically or using a +shared library, the combination of the two is legally speaking a combined +work, a derivative of the original library. The ordinary General Public +License therefore permits such linking only if the entire combination fits +its criteria of freedom. The Lesser General Public License permits more lax +criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does +Less to protect the user's freedom than the ordinary General Public +License. It also provides other free software developers Less of an +advantage over competing non-free programs. These disadvantages are the +reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + +For example, on rare occasions, there may be a special need to encourage +the widest possible use of a certain library, so that it becomes a de-facto +standard. To achieve this, non-free programs must be allowed to use the +library. A more frequent case is that a free library does the same job as +widely used non-free libraries. In this case, there is little to gain by +limiting the free library to free software only, so we use the Lesser +General Public License. + +In other cases, permission to use a particular library in non-free programs +enables a greater number of people to use a large body of free +software. For example, permission to use the GNU C Library in non-free +programs enables many more people to use the whole GNU operating system, as +well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' +freedom, it does ensure that the user of a program that is linked with the +Library has the freedom and the wherewithal to run that program using a +modified version of the Library. + +The precise terms and conditions for copying, distribution and modification +follow. Pay close attention to the difference between a "work based on the +library" and a "work that uses the library". The former contains code +derived from the library, whereas the latter must be combined with the +library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program + which contains a notice placed by the copyright holder or other + authorized party saying it may be distributed under the terms of this + Lesser General Public License (also called "this License"). Each + licensee is addressed as "you". + + A "library" means a collection of software functions and/or data + prepared so as to be conveniently linked with application programs + (which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work which + has been distributed under these terms. A "work based on the Library" + means either the Library or any derivative work under copyright law: + that is to say, a work containing the Library or a portion of it, either + verbatim or with modifications and/or translated straightforwardly into + another language. (Hereinafter, translation is included without + limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for making + modifications to it. For a library, complete source code means all the + source code for all modules it contains, plus any associated interface + definition files, plus the scripts used to control compilation and + installation of the library. + + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of running + a program using the Library is not restricted, and output from such a + program is covered only if its contents constitute a work based on the + Library (independent of the use of the Library in a tool for writing + it). Whether that is true depends on what the Library does and what the + program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the notices + that refer to this License and to the absence of any warranty; and + distribute a copy of this License along with the Library. + + You may charge a fee for the physical act of transferring a copy, and + you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, + thus forming a work based on the Library, and copy and distribute such + modifications or work under the terms of Section 1 above, provided that + you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices stating + that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no charge to + all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a table + of data to be supplied by an application program that uses the + facility, other than as an argument passed when the facility is + invoked, then you must make a good faith effort to ensure that, in + the event an application does not supply such function or table, the + facility still operates, and performs whatever part of its purpose + remains meaningful. + + (For example, a function in a library to compute square roots has a + purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must be + optional: if the application does not supply it, the square root + function must still compute square roots.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the Library, and + can be reasonably considered independent and separate works in + themselves, then this License, and its terms, do not apply to those + sections when you distribute them as separate works. But when you + distribute the same sections as part of a whole which is a work based on + the Library, the distribution of the whole must be on the terms of this + License, whose permissions for other licensees extend to the entire + whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest + your rights to work written entirely by you; rather, the intent is to + exercise the right to control the distribution of derivative or + collective works based on the Library. + + In addition, mere aggregation of another work not based on the Library + with the Library (or with a work based on the Library) on a volume of a + storage or distribution medium does not bring the other work under the + scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public + License instead of this License to a given copy of the Library. To do + this, you must alter all the notices that refer to this License, so that + they refer to the ordinary GNU General Public License, version 2, + instead of to this License. (If a newer version than version 2 of the + ordinary GNU General Public License has appeared, then you can specify + that version instead if you wish.) Do not make any other change in these + notices. + + Once this change is made in a given copy, it is irreversible for that + copy, so the ordinary GNU General Public License applies to all + subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of the + Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of + it, under Section 2) in object code or executable form under the terms + of Sections 1 and 2 above provided that you accompany it with the + complete corresponding machine-readable source code, which must be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange. + + If distribution of object code is made by offering access to copy from a + designated place, then offering equivalent access to copy the source + code from the same place satisfies the requirement to distribute the + source code, even though third parties are not compelled to copy the + source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but + is designed to work with the Library by being compiled or linked with + it, is called a "work that uses the Library". Such a work, in isolation, + is not a derivative work of the Library, and therefore falls outside the + scope of this License. + + However, linking a "work that uses the Library" with the Library creates + an executable that is a derivative of the Library (because it contains + portions of the Library), rather than a "work that uses the + library". The executable is therefore covered by this License. Section 6 + states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file + that is part of the Library, the object code for the work may be a + derivative work of the Library even though the source code is + not. Whether this is true is especially significant if the work can be + linked without the Library, or if the work is itself a library. The + threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data structure + layouts and accessors, and small macros and small inline functions (ten + lines or less in length), then the use of the object file is + unrestricted, regardless of whether it is legally a derivative + work. (Executables containing this object code plus portions of the + Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may + distribute the object code for the work under the terms of Section + 6. Any executables containing that work also fall under Section 6, + whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a + "work that uses the Library" with the Library to produce a work + containing portions of the Library, and distribute that work under terms + of your choice, provided that the terms permit modification of the work + for the customer's own use and reverse engineering for debugging such + modifications. + + You must give prominent notice with each copy of the work that the + Library is used in it and that the Library and its use are covered by + this License. You must supply a copy of this License. If the work during + execution displays copyright notices, you must include the copyright + notice for the Library among them, as well as a reference directing the + user to the copy of this License. Also, you must do one of these things: + + a) Accompany the work with the complete corresponding machine-readable + source code for the Library including whatever changes were used in + the work (which must be distributed under Sections 1 and 2 above); + and, if the work is an executable linked with the Library, with the + complete machine-readable "work that uses the Library", as object + code and/or source code, so that the user can modify the Library and + then relink to produce a modified executable containing the modified + Library. (It is understood that the user who changes the contents of + definitions files in the Library will not necessarily be able to + recompile the application to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a copy + of the library already present on the user's computer system, rather + than copying library functions into the executable, and (2) will + operate properly with a modified version of the library, if the user + installs one, as long as the modified version is interface-compatible + with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at least three + years, to give the same user the materials specified in Subsection + 6a, above, for a charge no more than the cost of performing this + distribution. + + d) If distribution of the work is made by offering access to copy from a + designated place, offer equivalent access to copy the above specified + materials from the same place. + + e) Verify that the user has already received a copy of these materials + or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the Library" + must include any data and utility programs needed for reproducing the + executable from it. However, as a special exception, the materials to be + distributed need not include anything that is normally distributed (in + either source or binary form) with the major components (compiler, + kernel, and so on) of the operating system on which the executable runs, + unless that component itself accompanies the executable. + + It may happen that this requirement contradicts the license restrictions + of other proprietary libraries that do not normally accompany the + operating system. Such a contradiction means you cannot use both them + and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library + side-by-side in a single library together with other library facilities + not covered by this License, and distribute such a combined library, + provided that the separate distribution of the work based on the Library + and of the other library facilities is otherwise permitted, and provided + that you do these two things: + + a) Accompany the combined library with a copy of the same work based on + the Library, uncombined with any other library facilities. This must + be distributed under the terms of the Sections above. + + b) Give prominent notice with the combined library of the fact that part + of it is a work based on the Library, and explaining where to find + the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the + Library except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, link with, or distribute the + Library is void, and will automatically terminate your rights under this + License. However, parties who have received copies, or rights, from you + under this License will not have their licenses terminated so long as + such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed + it. However, nothing else grants you permission to modify or distribute + the Library or its derivative works. These actions are prohibited by law + if you do not accept this License. Therefore, by modifying or + distributing the Library (or any work based on the Library), you + indicate your acceptance of this License to do so, and all its terms and + conditions for copying, distributing or modifying the Library or works + based on it. + +10. Each time you redistribute the Library (or any work based on the + Library), the recipient automatically receives a license from the + original licensor to copy, distribute, link with or modify the Library + subject to these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted + herein. You are not responsible for enforcing compliance by third + parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot + distribute so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you + may not distribute the Library at all. For example, if a patent license + would not permit royalty-free redistribution of the Library by all + those who receive copies directly or indirectly through you, then the + only way you could satisfy both it and this License would be to refrain + entirely from distribution of the Library. + + If any portion of this section is held invalid or unenforceable under + any particular circumstance, the balance of the section is intended to + apply, and the section as a whole is intended to apply in other + circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any + such claims; this section has the sole purpose of protecting the + integrity of the free software distribution system which is implemented + by public license practices. Many people have made generous + contributions to the wide range of software distributed through that + system in reliance on consistent application of that system; it is up + to the author/donor to decide if he or she is willing to distribute + software through any other system and a licensee cannot impose that + choice. + + This section is intended to make thoroughly clear what is believed to + be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain + countries either by patents or by copyrighted interfaces, the original + copyright holder who places the Library under this License may add an + explicit geographical distribution limitation excluding those + countries, so that distribution is permitted only in or among countries + not thus excluded. In such case, this License incorporates the + limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of + the Lesser General Public License from time to time. Such new versions + will be similar in spirit to the present version, but may differ in + detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the Library + specifies a version number of this License which applies to it and "any + later version", you have the option of following the terms and + conditions either of that version or of any later version published by + the Free Software Foundation. If the Library does not specify a license + version number, you may choose any version ever published by the Free + Software Foundation. + +14. If you wish to incorporate parts of the Library into other free + programs whose distribution conditions are incompatible with these, + write to the author to ask for permission. For software which is + copyrighted by the Free Software Foundation, write to the Free Software + Foundation; we sometimes make exceptions for this. Our decision will be + guided by the two goals of preserving the free status of all + derivatives of our free software and of promoting the sharing and reuse + of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY + FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE + ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH + YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL + NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR + DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL + DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY + (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED + INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF + THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR + OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + +To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + +one line to give the library's name and an idea of what it does. +Copyright (C) year name of author + +This library is free software; you can redistribute it and/or modify it +under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at +your option) any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License +for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add +information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in +the library `Frob' (a library for tweaking knobs) written +by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice +That's all there is to it! diff --git a/libbpf/README.md b/libbpf/README.md new file mode 100644 index 0000000..4642294 --- /dev/null +++ b/libbpf/README.md @@ -0,0 +1,189 @@ + + + + + +libbpf +[![Github Actions Builds & Tests](https://github.com/libbpf/libbpf/actions/workflows/test.yml/badge.svg)](https://github.com/libbpf/libbpf/actions/workflows/test.yml) +[![Coverity](https://img.shields.io/coverity/scan/18195.svg)](https://scan.coverity.com/projects/libbpf) +[![CodeQL](https://github.com/libbpf/libbpf/workflows/CodeQL/badge.svg?branch=master)](https://github.com/libbpf/libbpf/actions?query=workflow%3ACodeQL+branch%3Amaster) +[![OSS-Fuzz Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/libbpf.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html#libbpf) +[![Read the Docs](https://readthedocs.org/projects/libbpf/badge/?version=latest)](https://libbpf.readthedocs.io/en/latest/) +====== + +**This is the official home of the libbpf library.** + +*Please use this Github repository for building and packaging libbpf +and when using it in your projects through Git submodule.* + +Libbpf *authoritative source code* is developed as part of [bpf-next Linux source +tree](https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next) under +`tools/lib/bpf` subdirectory and is periodically synced to Github. As such, all the +libbpf changes should be sent to [BPF mailing list](http://vger.kernel.org/vger-lists.html#bpf), +please don't open PRs here unless you are changing Github-specific parts of libbpf +(e.g., Github-specific Makefile). + +Libbpf and general BPF usage questions +====================================== + +Libbpf documentation can be found [here](https://libbpf.readthedocs.io/en/latest/api.html). +It's an ongoing effort and has ways to go, but please take a look and consider contributing as well. + +Please check out [libbpf-bootstrap](https://github.com/libbpf/libbpf-bootstrap) +and [the companion blog post](https://nakryiko.com/posts/libbpf-bootstrap/) for +the examples of building BPF applications with libbpf. +[libbpf-tools](https://github.com/iovisor/bcc/tree/master/libbpf-tools) are also +a good source of the real-world libbpf-based tracing tools. + +See also ["BPF CO-RE reference guide"](https://nakryiko.com/posts/bpf-core-reference-guide/) +for the coverage of practical aspects of building BPF CO-RE applications and +["BPF CO-RE"](https://nakryiko.com/posts/bpf-portability-and-co-re/) for +general introduction into BPF portability issues and BPF CO-RE origins. + +All general BPF questions, including kernel functionality, libbpf APIs and +their application, should be sent to bpf@vger.kernel.org mailing list. You can +subscribe to it [here](http://vger.kernel.org/vger-lists.html#bpf) and search +its archive [here](https://lore.kernel.org/bpf/). Please search the archive +before asking new questions. It very well might be that this was already +addressed or answered before. + +bpf@vger.kernel.org is monitored by many more people and they will happily try +to help you with whatever issue you have. This repository's PRs and issues +should be opened only for dealing with issues pertaining to specific way this +libbpf mirror repo is set up and organized. + +Building libbpf +=============== +libelf is an internal dependency of libbpf and thus it is required to link +against and must be installed on the system for applications to work. +pkg-config is used by default to find libelf, and the program called can be +overridden with `PKG_CONFIG`. + +If using `pkg-config` at build time is not desired, it can be disabled by +setting `NO_PKG_CONFIG=1` when calling make. + +To build both static libbpf.a and shared libbpf.so: +```bash +$ cd src +$ make +``` + +To build only static libbpf.a library in directory +build/ and install them together with libbpf headers in a staging directory +root/: +```bash +$ cd src +$ mkdir build root +$ BUILD_STATIC_ONLY=y OBJDIR=build DESTDIR=root make install +``` + +To build both static libbpf.a and shared libbpf.so against a custom libelf +dependency installed in /build/root/ and install them together with libbpf +headers in a build directory /build/root/: +```bash +$ cd src +$ PKG_CONFIG_PATH=/build/root/lib64/pkgconfig DESTDIR=/build/root make install +``` + +BPF CO-RE (Compile Once – Run Everywhere) +========================================= + +Libbpf supports building BPF CO-RE-enabled applications, which, in contrast to +[BCC](https://github.com/iovisor/bcc/), do not require Clang/LLVM runtime +being deployed to target servers and doesn't rely on kernel-devel headers +being available. + +It does rely on kernel to be built with [BTF type +information](https://www.kernel.org/doc/html/latest/bpf/btf.html), though. +Some major Linux distributions come with kernel BTF already built in: + - Fedora 31+ + - RHEL 8.2+ + - OpenSUSE Tumbleweed (in the next release, as of 2020-06-04) + - Arch Linux (from kernel 5.7.1.arch1-1) + - Manjaro (from kernel 5.4 if compiled after 2021-06-18) + - Ubuntu 20.10 + - Debian 11 (amd64/arm64) + +If your kernel doesn't come with BTF built-in, you'll need to build custom +kernel. You'll need: + - `pahole` 1.16+ tool (part of `dwarves` package), which performs DWARF to + BTF conversion; + - kernel built with `CONFIG_DEBUG_INFO_BTF=y` option; + - you can check if your kernel has BTF built-in by looking for + `/sys/kernel/btf/vmlinux` file: + +```shell +$ ls -la /sys/kernel/btf/vmlinux +-r--r--r--. 1 root root 3541561 Jun 2 18:16 /sys/kernel/btf/vmlinux +``` + +To develop and build BPF programs, you'll need Clang/LLVM 10+. The following +distributions have Clang/LLVM 10+ packaged by default: + - Fedora 32+ + - Ubuntu 20.04+ + - Arch Linux + - Ubuntu 20.10 (LLVM 11) + - Debian 11 (LLVM 11) + - Alpine 3.13+ + +Otherwise, please make sure to update it on your system. + +The following resources are useful to understand what BPF CO-RE is and how to +use it: +- [BPF CO-RE reference guide](https://nakryiko.com/posts/bpf-core-reference-guide/) +- [BPF Portability and CO-RE](https://nakryiko.com/posts/bpf-portability-and-co-re/) +- [HOWTO: BCC to libbpf conversion](https://nakryiko.com/posts/bcc-to-libbpf-howto-guide/) +- [libbpf-tools in BCC repo](https://github.com/iovisor/bcc/tree/master/libbpf-tools) + contain lots of real-world tools converted from BCC to BPF CO-RE. Consider + converting some more to both contribute to the BPF community and gain some + more experience with it. + +Distributions +============= + +Distributions packaging libbpf from this mirror: + - [Fedora](https://src.fedoraproject.org/rpms/libbpf) + - [Gentoo](https://packages.gentoo.org/packages/dev-libs/libbpf) + - [Debian](https://packages.debian.org/source/sid/libbpf) + - [Arch](https://archlinux.org/packages/core/x86_64/libbpf/) + - [Ubuntu](https://packages.ubuntu.com/source/impish/libbpf) + - [Alpine](https://pkgs.alpinelinux.org/packages?name=libbpf) + +Benefits of packaging from the mirror over packaging from kernel sources: + - Consistent versioning across distributions. + - No ties to any specific kernel, transparent handling of older kernels. + Libbpf is designed to be kernel-agnostic and work across multitude of + kernel versions. It has built-in mechanisms to gracefully handle older + kernels, that are missing some of the features, by working around or + gracefully degrading functionality. Thus libbpf is not tied to a specific + kernel version and can/should be packaged and versioned independently. + - Continuous integration testing via + [GitHub Actions](https://github.com/libbpf/libbpf/actions). + - Static code analysis via [LGTM](https://lgtm.com/projects/g/libbpf/libbpf) + and [Coverity](https://scan.coverity.com/projects/libbpf). + +Package dependencies of libbpf, package names may vary across distros: + - zlib + - libelf + +[![libbpf distro packaging status](https://repology.org/badge/vertical-allrepos/libbpf.svg)](https://repology.org/project/libbpf/versions) + + +bpf-next to Github sync +======================= + +All the gory details of syncing can be found in `scripts/sync-kernel.sh` +script. See [SYNC.md](SYNC.md) for instruction. + +Some header files in this repo (`include/linux/*.h`) are reduced versions of +their counterpart files at +[bpf-next](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/)'s +`tools/include/linux/*.h` to make compilation successful. + +License +======= + +This work is dual-licensed under BSD 2-clause license and GNU LGPL v2.1 license. +You can choose between one of them if you use this work. + +`SPDX-License-Identifier: BSD-2-Clause OR LGPL-2.1` diff --git a/libbpf/SYNC.md b/libbpf/SYNC.md new file mode 100644 index 0000000..14a44a7 --- /dev/null +++ b/libbpf/SYNC.md @@ -0,0 +1,281 @@ + + + + + +Libbpf sync +=========== + +Libbpf *authoritative source code* is developed as part of [bpf-next Linux source +tree](https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next) under +`tools/lib/bpf` subdirectory and is periodically synced to Github. + +Most of the mundane mechanical things like bpf and bpf-next tree merge, Git +history transformation, cherry-picking relevant commits, re-generating +auto-generated headers, etc. are taken care by +[sync-kernel.sh script](https://github.com/libbpf/libbpf/blob/master/scripts/sync-kernel.sh). +But occasionally human needs to do few extra things to make everything work +nicely. + +This document goes over the process of syncing libbpf sources from Linux repo +to this Github repository. Feel free to contribute fixes and additions if you +run into new problems not outlined here. + +Setup expectations +------------------ + +Sync script has particular expectation of upstream Linux repo setup. It +expects that current HEAD of that repo points to bpf-next's master branch and +that there is a separate local branch pointing to bpf tree's master branch. +This is important, as the script will automatically merge their histories for +the purpose of libbpf sync. + +Below, we assume that Linux repo is located at `~/linux`, it's current head is +at latest `bpf-next/master`, and libbpf's Github repo is located at +`~/libbpf`, checked out to latest commit on `master` branch. It doesn't matter +from where to run `sync-kernel.sh` script, but we'll be running it from inside +`~/libbpf`. + +``` +$ cd ~/linux && git remote -v | grep -E '^(bpf|bpf-next)' +bpf https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git (fetch) +bpf ssh://git@gitolite.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git +(push) +bpf-next +https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git (fetch) +bpf-next +ssh://git@gitolite.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git (push) +$ git branch -vv | grep -E '^? (master|bpf-master)' +* bpf-master 2d311f480b52 [bpf/master] riscv, bpf: Fix patch_text implicit declaration + master c8ee37bde402 [bpf-next/master] libbpf: Fix bpf_xdp_query() in old kernels +$ git checkout bpf-master && git pull && git checkout master && git pull +... +$ git log --oneline -n1 +c8ee37bde402 (HEAD -> master, bpf-next/master) libbpf: Fix bpf_xdp_query() in old kernels +$ cd ~/libbpf && git checkout master && git pull +Your branch is up to date with 'libbpf/master'. +Already up to date. +``` + +Running setup script +-------------------- + +First step is to always run `sync-kernel.sh` script. It expects three arguments: + +``` +$ scripts/sync-kernel.sh +``` + +Note, that we'll store script's entire output in `/tmp/libbpf-sync.txt` and +put it into PR summary later on. **Please store scripts output and include it +in PR summary for others to check for anything unexpected and suspicious.** + +``` +$ scripts/sync-kernel.sh ~/libbpf ~/linux bpf-master | tee /tmp/libbpf-sync.txt +Dumping existing libbpf commit signatures... +WORKDIR: /home/andriin/libbpf +LINUX REPO: /home/andriin/linux +LIBBPF REPO: /home/andriin/libbpf +... +``` + +Most of the time this will go very uneventful. One expected case when sync +script might require user intervention is if `bpf` tree has some libbpf fixes, +which is nowadays not a very frequent occurence. But if that happens, script +will show you a diff between expected state as of latest bpf-next and synced +Github repo state. And will ask if these changes look good. Please use your +best judgement to verify that differences are indeed from expected `bpf` tree +fixes. E.g., it might look like below: + +``` +Comparing list of files... +Comparing file contents... +--- /home/andriin/linux/include/uapi/linux/netdev.h 2023-02-27 16:54:42.270583372 -0800 ++++ /home/andriin/libbpf/include/uapi/linux/netdev.h 2023-02-27 16:54:34.615530796 -0800 +@@ -19,7 +19,7 @@ + * @NETDEV_XDP_ACT_XSK_ZEROCOPY: This feature informs if netdev supports AF_XDP + * in zero copy mode. + * @NETDEV_XDP_ACT_HW_OFFLOAD: This feature informs if netdev supports XDP hw +- * oflloading. ++ * offloading. + * @NETDEV_XDP_ACT_RX_SG: This feature informs if netdev implements non-linear + * XDP buffer support in the driver napi callback. + * @NETDEV_XDP_ACT_NDO_XMIT_SG: This feature informs if netdev implements +/home/andriin/linux/include/uapi/linux/netdev.h and /home/andriin/libbpf/include/uapi/linux/netdev.h are different! +Unfortunately, there are some inconsistencies, please double check. +Does everything look good? [y/N]: +``` + +If it looks sensible and expected, type `y` and script will proceed. + +If sync is successful, your `~/linux` repo will be left in original state on +the original HEAD commit. `~/libbpf` repo will now be on a new branch, named +`libbpf-sync-` (e.g., `libbpf-sync-2023-02-28T00-53-40.072Z`). + +Push this branch into your fork of `libbpf/libbpf` Github repo and create a PR: + +``` +$ git push --set-upstream origin libbpf-sync-2023-02-28T00-53-40.072Z +Enumerating objects: 130, done. +Counting objects: 100% (115/115), done. +Delta compression using up to 80 threads +Compressing objects: 100% (28/28), done. +Writing objects: 100% (32/32), 5.57 KiB | 1.86 MiB/s, done. +Total 32 (delta 21), reused 0 (delta 0), pack-reused 0 +remote: Resolving deltas: 100% (21/21), completed with 9 local objects. +remote: +remote: Create a pull request for 'libbpf-sync-2023-02-28T00-53-40.072Z' on GitHub by visiting: +remote: https://github.com/anakryiko/libbpf/pull/new/libbpf-sync-2023-02-28T00-53-40.072Z +remote: +To github.com:anakryiko/libbpf.git + * [new branch] libbpf-sync-2023-02-28T00-53-40.072Z -> libbpf-sync-2023-02-28T00-53-40.072Z +Branch 'libbpf-sync-2023-02-28T00-53-40.072Z' set up to track remote branch 'libbpf-sync-2023-02-28T00-53-40.072Z' from 'origin'. +``` + +**Please, adjust PR name to have a properly looking timestamp. Libbpf +maintainers will be very thankful for that!** + +By default Github will turn above branch name into PR with subject "Libbpf sync +2023 02 28 t00 53 40.072 z". Please fix this into a proper timestamp, e.g.: +"Libbpf sync 2023-02-28T00:53:40.072Z". Thank you! + +**Please don't forget to paste contents of /tmp/libbpf-sync.txt into PR +summary!** + +Once PR is created, libbpf CI will run a bunch of tests to check that +everything is good. In simple cases that would be all you'd need to do. In more +complicated cases some extra adjustments might be necessary. + +**Please, keep naming and style consistent.** Prefix CI-related fixes with `ci: ` +prefix. If you had to modify sync script, prefix it with `sync: `. Also make +sure that each such commit has `Signed-off-by: Your Full Name `, +just like you'd do that for Linux upstream patch. Libbpf closely follows kernel +conventions and styling, so please help maintaining that. + +Including new sources +--------------------- + +If entirely new source files (typically `*.c`) were added to the library in the +kernel repository, it may be necessary to add these to the build system +manually (you may notice linker errors otherwise), because the script cannot +handle such changes automatically. To that end, edit `src/Makefile` as +necessary. Commit +[c2495832ced4](https://github.com/libbpf/libbpf/commit/c2495832ced4239bcd376b9954db38a6addd89ca) +is an example of how to go about doing that. + +Similarly, if new public API header files were added, the `Makefile` will need +to be adjusted as well. + +Updating allow/deny lists +------------------------- + +Libbpf CI intentionally runs a subset of latest BPF selftests on old kernel +(4.9 and 5.5, currently). It happens from time to time that some tests that +previously were successfully running on old kernels now don't, typically due to +reliance on some freshly added kernel feature. It might look something like this in [CI logs](https://github.com/libbpf/libbpf/actions/runs/4206303272/jobs/7299609578#step:4:2733): + +``` + All error logs: + serial_test_xdp_info:FAIL:get_xdp_none errno=2 + #283 xdp_info:FAIL + Summary: 49/166 PASSED, 5 SKIPPED, 1 FAILED +``` + +In such case we can either work with upstream to fix test to be compatible with +old kernels, or we'll have to add a test into a denylist (or remove it from +allowlist, like was [done](https://github.com/libbpf/libbpf/commit/ea284299025bf85b85b4923191de6463cd43ccd6) +for the case above). + +``` +$ find . -name '*LIST*' +./ci/vmtest/configs/ALLOWLIST-4.9.0 +./ci/vmtest/configs/DENYLIST-5.5.0 +./ci/vmtest/configs/DENYLIST-latest.s390x +./ci/vmtest/configs/DENYLIST-latest +./ci/vmtest/configs/ALLOWLIST-5.5.0 +``` + +Please determine which tests need to be added/removed from which list. And then +add that as a separate commit. **Please keep using the same branch name, so +that the same PR can be updated.** There is no need to open new PRs for each +such fix. + +Regenerating vmlinux.h header +----------------------------- + +To compile latest BPF selftests against old kernels, we check in pre-generated +[vmlinux.h](https://github.com/libbpf/libbpf/blob/master/.github/actions/build-selftests/vmlinux.h) +header file, located at `.github/actions/build-selftests/vmlinux.h`, which +contains type definitions from latest upstream kernel. When after libbpf sync +upstream BPF selftests require new kernel types, we'd need to regenerate +`vmlinux.h` and check it in as well. + +This will looks something like this in [CI logs](https://github.com/libbpf/libbpf/actions/runs/4198939244/jobs/7283214243#step:4:1903): + +``` + In file included from progs/test_spin_lock_fail.c:5: + /home/runner/work/libbpf/libbpf/.kernel/tools/testing/selftests/bpf/bpf_experimental.h:73:53: error: declaration of 'struct bpf_rb_root' will not be visible outside of this function [-Werror,-Wvisibility] + extern struct bpf_rb_node *bpf_rbtree_remove(struct bpf_rb_root *root, + ^ + /home/runner/work/libbpf/libbpf/.kernel/tools/testing/selftests/bpf/bpf_experimental.h:81:35: error: declaration of 'struct bpf_rb_root' will not be visible outside of this function [-Werror,-Wvisibility] + extern void bpf_rbtree_add(struct bpf_rb_root *root, struct bpf_rb_node *node, + ^ + /home/runner/work/libbpf/libbpf/.kernel/tools/testing/selftests/bpf/bpf_experimental.h:90:52: error: declaration of 'struct bpf_rb_root' will not be visible outside of this function [-Werror,-Wvisibility] + extern struct bpf_rb_node *bpf_rbtree_first(struct bpf_rb_root *root) __ksym; + ^ + 3 errors generated. + make: *** [Makefile:572: /home/runner/work/libbpf/libbpf/.kernel/tools/testing/selftests/bpf/test_spin_lock_fail.bpf.o] Error 1 + make: *** Waiting for unfinished jobs.... + Error: Process completed with exit code 2. +``` + +You'll need to build latest upstream kernel from `bpf-next` tree, using BPF +selftest configs. Concat arch-agnostic and arch-specific configs, build kernel, +then use bpftool to dump `vmlinux.h`: + +``` +$ cd ~/linux +$ cat tools/testing/selftests/bpf/config \ + tools/testing/selftests/bpf/config.x86_64 > .config +$ make -j$(nproc) olddefconfig all +... +$ bpftool btf dump file ~/linux/vmlinux format c > ~/libbpf/.github/actions/build-selftests/vmlinux.h +$ cd ~/libbpf && git add . && git commit -s +``` + +Check in generated `vmlinux.h`, don't forget to use `ci: ` commit prefix, add +it on top of sync commits. Push to Github and let libbpf CI do the checking for +you. See [this commit](https://github.com/libbpf/libbpf/commit/34212c94a64df8eeb1dd5d064630a65e1dfd4c20) +for reference. + +Troubleshooting +--------------- + +If something goes wrong and sync script exits early or is terminated early by +user, you might end up with `~/linux` repo on temporary sync-related branch. +Don't worry, though, sync script never destroys repo state, it follows +"copy-on-write" philosophy and creates new branches where necessary. So it's +very easy to restore previous state. So if anything goes wrong, it's easy to +start fresh: + +``` +$ git branch | grep -E 'libbpf-.*Z' + libbpf-baseline-2023-02-28T00-43-35.146Z + libbpf-bpf-baseline-2023-02-28T00-43-35.146Z + libbpf-bpf-tip-2023-02-28T00-43-35.146Z + libbpf-squash-base-2023-02-28T00-43-35.146Z +* libbpf-squash-tip-2023-02-28T00-43-35.146Z +$ git cherry-pick --abort +$ git checkout master && git branch | grep -E 'libbpf-.*Z' | xargs git br -D +Switched to branch 'master' +Your branch is up to date with 'bpf-next/master'. +Deleted branch libbpf-baseline-2023-02-28T00-43-35.146Z (was 951bce29c898). +Deleted branch libbpf-bpf-baseline-2023-02-28T00-43-35.146Z (was 3a70e0d4c9d7). +Deleted branch libbpf-bpf-tip-2023-02-28T00-43-35.146Z (was 2d311f480b52). +Deleted branch libbpf-squash-base-2023-02-28T00-43-35.146Z (was 957f109ef883). +Deleted branch libbpf-squash-tip-2023-02-28T00-43-35.146Z (was be66130d2339). +Deleted branch libbpf-tip-2023-02-28T00-43-35.146Z (was 2d311f480b52). +``` + +You might need to do the same for your `~/libbpf` repo sometimes, depending at +which stage sync script was terminated. diff --git a/libbpf/assets/libbpf-logo-compact-darkbg.png b/libbpf/assets/libbpf-logo-compact-darkbg.png new file mode 100644 index 0000000..aaef60e Binary files /dev/null and b/libbpf/assets/libbpf-logo-compact-darkbg.png differ diff --git a/libbpf/assets/libbpf-logo-compact-mono.png b/libbpf/assets/libbpf-logo-compact-mono.png new file mode 100644 index 0000000..51daed1 Binary files /dev/null and b/libbpf/assets/libbpf-logo-compact-mono.png differ diff --git a/libbpf/assets/libbpf-logo-compact.png b/libbpf/assets/libbpf-logo-compact.png new file mode 100644 index 0000000..99ae3ab Binary files /dev/null and b/libbpf/assets/libbpf-logo-compact.png differ diff --git a/libbpf/assets/libbpf-logo-sideways-darkbg.png b/libbpf/assets/libbpf-logo-sideways-darkbg.png new file mode 100644 index 0000000..00d6d83 Binary files /dev/null and b/libbpf/assets/libbpf-logo-sideways-darkbg.png differ diff --git a/libbpf/assets/libbpf-logo-sideways-mono.png b/libbpf/assets/libbpf-logo-sideways-mono.png new file mode 100644 index 0000000..82f1ce5 Binary files /dev/null and b/libbpf/assets/libbpf-logo-sideways-mono.png differ diff --git a/libbpf/assets/libbpf-logo-sideways.png b/libbpf/assets/libbpf-logo-sideways.png new file mode 100644 index 0000000..48186c3 Binary files /dev/null and b/libbpf/assets/libbpf-logo-sideways.png differ diff --git a/libbpf/assets/libbpf-logo-sparse-darkbg.png b/libbpf/assets/libbpf-logo-sparse-darkbg.png new file mode 100644 index 0000000..5e57430 Binary files /dev/null and b/libbpf/assets/libbpf-logo-sparse-darkbg.png differ diff --git a/libbpf/assets/libbpf-logo-sparse-mono.png b/libbpf/assets/libbpf-logo-sparse-mono.png new file mode 100644 index 0000000..b02d432 Binary files /dev/null and b/libbpf/assets/libbpf-logo-sparse-mono.png differ diff --git a/libbpf/assets/libbpf-logo-sparse.png b/libbpf/assets/libbpf-logo-sparse.png new file mode 100644 index 0000000..a306588 Binary files /dev/null and b/libbpf/assets/libbpf-logo-sparse.png differ diff --git a/libbpf/ci/diffs/.keep b/libbpf/ci/diffs/.keep new file mode 100644 index 0000000..e69de29 diff --git a/libbpf/ci/diffs/0001-s390-define-RUNTIME_DISCARD_EXIT-to-fix-link-error-w.patch b/libbpf/ci/diffs/0001-s390-define-RUNTIME_DISCARD_EXIT-to-fix-link-error-w.patch new file mode 100644 index 0000000..2f8d84f --- /dev/null +++ b/libbpf/ci/diffs/0001-s390-define-RUNTIME_DISCARD_EXIT-to-fix-link-error-w.patch @@ -0,0 +1,70 @@ +From 6fba14e2ed9d159f76b23fa5c16f3ea99acbc003 Mon Sep 17 00:00:00 2001 +From: Masahiro Yamada +Date: Thu, 5 Jan 2023 12:13:06 +0900 +Subject: [PATCH] s390: define RUNTIME_DISCARD_EXIT to fix link error with GNU + ld < 2.36 + +Nathan Chancellor reports that the s390 vmlinux fails to link with +GNU ld < 2.36 since commit 99cb0d917ffa ("arch: fix broken BuildID +for arm64 and riscv"). + +It happens for defconfig, or more specifically for CONFIG_EXPOLINE=y. + + $ s390x-linux-gnu-ld --version | head -n1 + GNU ld (GNU Binutils for Debian) 2.35.2 + $ make -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- allnoconfig + $ ./scripts/config -e CONFIG_EXPOLINE + $ make -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- olddefconfig + $ make -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- + `.exit.text' referenced in section `.s390_return_reg' of drivers/base/dd.o: defined in discarded section `.exit.text' of drivers/base/dd.o + make[1]: *** [scripts/Makefile.vmlinux:34: vmlinux] Error 1 + make: *** [Makefile:1252: vmlinux] Error 2 + +arch/s390/kernel/vmlinux.lds.S wants to keep EXIT_TEXT: + + .exit.text : { + EXIT_TEXT + } + +But, at the same time, EXIT_TEXT is thrown away by DISCARD because +s390 does not define RUNTIME_DISCARD_EXIT. + +I still do not understand why the latter wins after 99cb0d917ffa, +but defining RUNTIME_DISCARD_EXIT seems correct because the comment +line in arch/s390/kernel/vmlinux.lds.S says: + + /* + * .exit.text is discarded at runtime, not link time, + * to deal with references from __bug_table + */ + +Nathan also found that binutils commit 21401fc7bf67 ("Duplicate output +sections in scripts") cured this issue, so we cannot reproduce it with +binutils 2.36+, but it is better to not rely on it. + +Fixes: 99cb0d917ffa ("arch: fix broken BuildID for arm64 and riscv") +Link: https://lore.kernel.org/all/Y7Jal56f6UBh1abE@dev-arch.thelio-3990X/ +Reported-by: Nathan Chancellor +Signed-off-by: Masahiro Yamada +Link: https://lore.kernel.org/r/20230105031306.1455409-1-masahiroy@kernel.org +Signed-off-by: Heiko Carstens +--- + arch/s390/kernel/vmlinux.lds.S | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S +index 5ea3830af0cc..6e101e6f499d 100644 +--- a/arch/s390/kernel/vmlinux.lds.S ++++ b/arch/s390/kernel/vmlinux.lds.S +@@ -17,6 +17,8 @@ + /* Handle ro_after_init data on our own. */ + #define RO_AFTER_INIT_DATA + ++#define RUNTIME_DISCARD_EXIT ++ + #define EMITS_PT_NOTE + + #include +-- +2.30.2 + diff --git a/libbpf/ci/diffs/0001-selftests-bpf-Select-CONFIG_FUNCTION_ERROR_INJECTION.patch b/libbpf/ci/diffs/0001-selftests-bpf-Select-CONFIG_FUNCTION_ERROR_INJECTION.patch new file mode 100644 index 0000000..3ee42c6 --- /dev/null +++ b/libbpf/ci/diffs/0001-selftests-bpf-Select-CONFIG_FUNCTION_ERROR_INJECTION.patch @@ -0,0 +1,46 @@ +From a8dfde09c90109e3a98af54847e91bde7dc2d5c2 Mon Sep 17 00:00:00 2001 +From: Song Liu +Date: Tue, 13 Dec 2022 14:05:00 -0800 +Subject: [PATCH] selftests/bpf: Select CONFIG_FUNCTION_ERROR_INJECTION +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +BPF selftests require CONFIG_FUNCTION_ERROR_INJECTION to work. However, +CONFIG_FUNCTION_ERROR_INJECTION is no longer 'y' by default after recent +changes. As a result, we are seeing errors like the following from BPF CI: + + bpf_testmod_test_read() is not modifiable + __x64_sys_setdomainname is not sleepable + __x64_sys_getpgid is not sleepable + +Fix this by explicitly selecting CONFIG_FUNCTION_ERROR_INJECTION in the +selftest config. + +Fixes: a4412fdd49dc ("error-injection: Add prompt for function error injection") +Reported-by: Daniel Müller +Signed-off-by: Song Liu +Signed-off-by: Andrii Nakryiko +Signed-off-by: Daniel Borkmann +Acked-by: Daniel Müller +Link: https://lore.kernel.org/bpf/20221213220500.3427947-1-song@kernel.org +Signed-off-by: Daniel Müller +--- + tools/testing/selftests/bpf/config | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tools/testing/selftests/bpf/config b/tools/testing/selftests/bpf/config +index 612f69..63cd4a 100644 +--- a/tools/testing/selftests/bpf/config ++++ b/tools/testing/selftests/bpf/config +@@ -16,6 +16,7 @@ CONFIG_CRYPTO_USER_API_HASH=y + CONFIG_DYNAMIC_FTRACE=y + CONFIG_FPROBE=y + CONFIG_FTRACE_SYSCALLS=y ++CONFIG_FUNCTION_ERROR_INJECTION=y + CONFIG_FUNCTION_TRACER=y + CONFIG_GENEVE=y + CONFIG_IKCONFIG=y +-- +2.30.2 + diff --git a/libbpf/ci/managers/debian.sh b/libbpf/ci/managers/debian.sh new file mode 100755 index 0000000..3d3f860 --- /dev/null +++ b/libbpf/ci/managers/debian.sh @@ -0,0 +1,95 @@ +#!/bin/bash + +PHASES=(${@:-SETUP RUN RUN_ASAN CLEANUP}) +DEBIAN_RELEASE="${DEBIAN_RELEASE:-testing}" +CONT_NAME="${CONT_NAME:-libbpf-debian-$DEBIAN_RELEASE}" +ENV_VARS="${ENV_VARS:-}" +DOCKER_RUN="${DOCKER_RUN:-docker run}" +REPO_ROOT="${REPO_ROOT:-$PWD}" +ADDITIONAL_DEPS=(pkgconf) +EXTRA_CFLAGS="" +EXTRA_LDFLAGS="" + +function info() { + echo -e "\033[33;1m$1\033[0m" +} + +function error() { + echo -e "\033[31;1m$1\033[0m" +} + +function docker_exec() { + docker exec $ENV_VARS $CONT_NAME "$@" +} + +set -eu + +source "$(dirname $0)/travis_wait.bash" + +for phase in "${PHASES[@]}"; do + case $phase in + SETUP) + info "Setup phase" + info "Using Debian $DEBIAN_RELEASE" + + docker --version + + docker pull debian:$DEBIAN_RELEASE + info "Starting container $CONT_NAME" + $DOCKER_RUN -v $REPO_ROOT:/build:rw \ + -w /build --privileged=true --name $CONT_NAME \ + -dit --net=host debian:$DEBIAN_RELEASE /bin/bash + echo -e "::group::Build Env Setup" + docker_exec bash -c "echo deb-src http://deb.debian.org/debian $DEBIAN_RELEASE main >>/etc/apt/sources.list" + docker_exec apt-get -y update + docker_exec apt-get -y install aptitude + docker_exec aptitude -y install make libz-dev libelf-dev + docker_exec aptitude -y install "${ADDITIONAL_DEPS[@]}" + echo -e "::endgroup::" + ;; + RUN|RUN_CLANG|RUN_CLANG14|RUN_CLANG15|RUN_CLANG16|RUN_GCC10|RUN_GCC11|RUN_GCC12|RUN_ASAN|RUN_CLANG_ASAN|RUN_GCC10_ASAN) + CC="cc" + if [[ "$phase" =~ "RUN_CLANG(\d+)(_ASAN)?" ]]; then + ENV_VARS="-e CC=clang-${BASH_REMATCH[1]} -e CXX=clang++-${BASH_REMATCH[1]}" + CC="clang-${BASH_REMATCH[1]}" + elif [[ "$phase" = *"CLANG"* ]]; then + ENV_VARS="-e CC=clang -e CXX=clang++" + CC="clang" + elif [[ "$phase" =~ "RUN_GCC(\d+)(_ASAN)?" ]]; then + ENV_VARS="-e CC=gcc-${BASH_REMATCH[1]} -e CXX=g++-${BASH_REMATCH[1]}" + CC="gcc-${BASH_REMATCH[1]}" + fi + if [[ "$phase" = *"ASAN"* ]]; then + EXTRA_CFLAGS="${EXTRA_CFLAGS} -fsanitize=address,undefined" + EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -fsanitize=address,undefined" + fi + if [[ "$CC" != "cc" ]]; then + docker_exec aptitude -y install "$CC" + else + docker_exec aptitude -y install gcc + fi + docker_exec mkdir build install + docker_exec ${CC} --version + info "build" + docker_exec make -j$((4*$(nproc))) EXTRA_CFLAGS="${EXTRA_CFLAGS}" EXTRA_LDFLAGS="${EXTRA_LDFLAGS}" -C ./src -B OBJDIR=../build + info "ldd build/libbpf.so:" + docker_exec ldd build/libbpf.so + if ! docker_exec ldd build/libbpf.so | grep -q libelf; then + error "No reference to libelf.so in libbpf.so!" + exit 1 + fi + info "install" + docker_exec make -j$((4*$(nproc))) -C src OBJDIR=../build DESTDIR=../install install + info "link binary" + docker_exec bash -c "EXTRA_CFLAGS=\"${EXTRA_CFLAGS}\" EXTRA_LDFLAGS=\"${EXTRA_LDFLAGS}\" ./ci/managers/test_compile.sh" + ;; + CLEANUP) + info "Cleanup phase" + docker stop $CONT_NAME + docker rm -f $CONT_NAME + ;; + *) + echo >&2 "Unknown phase '$phase'" + exit 1 + esac +done diff --git a/libbpf/ci/managers/test_compile.sh b/libbpf/ci/managers/test_compile.sh new file mode 100755 index 0000000..094ba3e --- /dev/null +++ b/libbpf/ci/managers/test_compile.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euox pipefail + +EXTRA_CFLAGS=${EXTRA_CFLAGS:-} +EXTRA_LDFLAGS=${EXTRA_LDFLAGS:-} + +cat << EOF > main.c +#include +int main() { + return bpf_object__open(0) < 0; +} +EOF + +# static linking +${CC:-cc} ${EXTRA_CFLAGS} ${EXTRA_LDFLAGS} -o main -I./include/uapi -I./install/usr/include main.c ./build/libbpf.a -lelf -lz diff --git a/libbpf/ci/managers/travis_wait.bash b/libbpf/ci/managers/travis_wait.bash new file mode 100644 index 0000000..acf6ad1 --- /dev/null +++ b/libbpf/ci/managers/travis_wait.bash @@ -0,0 +1,61 @@ +# This was borrowed from https://github.com/travis-ci/travis-build/tree/master/lib/travis/build/bash +# to get around https://github.com/travis-ci/travis-ci/issues/9979. It should probably be removed +# as soon as Travis CI has started to provide an easy way to export the functions to bash scripts. + +travis_jigger() { + local cmd_pid="${1}" + shift + local timeout="${1}" + shift + local count=0 + + echo -e "\\n" + + while [[ "${count}" -lt "${timeout}" ]]; do + count="$((count + 1))" + echo -ne "Still running (${count} of ${timeout}): ${*}\\r" + sleep 60 + done + + echo -e "\\n${ANSI_RED}Timeout (${timeout} minutes) reached. Terminating \"${*}\"${ANSI_RESET}\\n" + kill -9 "${cmd_pid}" +} + +travis_wait() { + local timeout="${1}" + + if [[ "${timeout}" =~ ^[0-9]+$ ]]; then + shift + else + timeout=20 + fi + + local cmd=("${@}") + local log_file="travis_wait_${$}.log" + + "${cmd[@]}" &>"${log_file}" & + local cmd_pid="${!}" + + travis_jigger "${!}" "${timeout}" "${cmd[@]}" & + local jigger_pid="${!}" + local result + + { + set +e + wait "${cmd_pid}" 2>/dev/null + result="${?}" + ps -p"${jigger_pid}" &>/dev/null && kill "${jigger_pid}" + set -e + } + + if [[ "${result}" -eq 0 ]]; then + echo -e "\\n${ANSI_GREEN}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}" + else + echo -e "\\n${ANSI_RED}The command ${cmd[*]} exited with ${result}.${ANSI_RESET}" + fi + + echo -e "\\n${ANSI_GREEN}Log:${ANSI_RESET}\\n" + cat "${log_file}" + + return "${result}" +} diff --git a/libbpf/ci/managers/ubuntu.sh b/libbpf/ci/managers/ubuntu.sh new file mode 100755 index 0000000..7fe1b3f --- /dev/null +++ b/libbpf/ci/managers/ubuntu.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -eux + +RELEASE="focal" + +apt-get update +apt-get install -y pkg-config + +source "$(dirname $0)/travis_wait.bash" + +cd $REPO_ROOT + +EXTRA_CFLAGS="-Werror -Wall -fsanitize=address,undefined" +EXTRA_LDFLAGS="-Werror -Wall -fsanitize=address,undefined" +mkdir build install +cc --version +make -j$((4*$(nproc))) EXTRA_CFLAGS="${EXTRA_CFLAGS}" EXTRA_LDFLAGS="${EXTRA_LDFLAGS}" -C ./src -B OBJDIR=../build +ldd build/libbpf.so +if ! ldd build/libbpf.so | grep -q libelf; then + echo "FAIL: No reference to libelf.so in libbpf.so!" + exit 1 +fi +make -j$((4*$(nproc))) -C src OBJDIR=../build DESTDIR=../install install +EXTRA_CFLAGS=${EXTRA_CFLAGS} EXTRA_LDFLAGS=${EXTRA_LDFLAGS} $(dirname $0)/test_compile.sh diff --git a/libbpf/ci/vmtest/configs/ALLOWLIST-4.9.0 b/libbpf/ci/vmtest/configs/ALLOWLIST-4.9.0 new file mode 100644 index 0000000..ee0d3db --- /dev/null +++ b/libbpf/ci/vmtest/configs/ALLOWLIST-4.9.0 @@ -0,0 +1,8 @@ +# btf_dump -- need to disable data dump sub-tests +core_retro +cpu_mask +hashmap +legacy_printk +perf_buffer +section_names + diff --git a/libbpf/ci/vmtest/configs/ALLOWLIST-5.5.0 b/libbpf/ci/vmtest/configs/ALLOWLIST-5.5.0 new file mode 100644 index 0000000..d673590 --- /dev/null +++ b/libbpf/ci/vmtest/configs/ALLOWLIST-5.5.0 @@ -0,0 +1,53 @@ +# attach_probe +autoload +bpf_verif_scale +cgroup_attach_autodetach +cgroup_attach_override +core_autosize +core_extern +core_read_macros +core_reloc +core_retro +cpu_mask +endian +get_branch_snapshot +get_stackid_cannot_attach +global_data +global_data_init +global_func_args +hashmap +legacy_printk +linked_funcs +linked_maps +map_lock +obj_name +perf_buffer +perf_event_stackmap +pinning +pkt_md_access +probe_user +queue_stack_map +raw_tp_writable_reject_nbd_invalid +raw_tp_writable_test_run +rdonly_maps +section_names +signal_pending +skeleton +sockmap_ktls +sockopt +sockopt_inherit +sockopt_multi +spinlock +stacktrace_map +stacktrace_map_raw_tp +static_linked +task_fd_query_rawtp +task_fd_query_tp +tc_bpf +tcp_estats +tcp_rtt +tp_attach_query +usdt/urand_pid_attach +xdp +xdp_noinline +xdp_perf diff --git a/libbpf/ci/vmtest/configs/DENYLIST-5.5.0 b/libbpf/ci/vmtest/configs/DENYLIST-5.5.0 new file mode 100644 index 0000000..d732bed --- /dev/null +++ b/libbpf/ci/vmtest/configs/DENYLIST-5.5.0 @@ -0,0 +1,118 @@ +# This file is not used and is there for historic purposes only. +# See ALLOWLIST-5.5.0 instead. + +# PERMANENTLY DISABLED +align # verifier output format changed +atomics # new atomic operations (v5.12+) +atomic_bounds # new atomic operations (v5.12+) +bind_perm # changed semantics of return values (v5.12+) +bpf_cookie # 5.15+ +bpf_iter # bpf_iter support is missing +bpf_obj_id # bpf_link support missing for GET_OBJ_INFO, GET_FD_BY_ID, etc +bpf_tcp_ca # STRUCT_OPS is missing +btf_map_in_map # inner map leak fixed in 5.8 +btf_skc_cls_ingress # v5.10+ functionality +cg_storage_multi # v5.9+ functionality +cgroup_attach_multi # BPF_F_REPLACE_PROG missing +cgroup_link # LINK_CREATE is missing +cgroup_skb_sk_lookup # bpf_sk_lookup_tcp() helper is missing +check_mtu # missing BPF helper (v5.12+) +cls_redirect # bpf_csum_level() helper is missing +connect_force_port # cgroup/get{peer,sock}name{4,6} support is missing +d_path # v5.10+ feature +enable_stats # BPF_ENABLE_STATS support is missing +fentry_fexit # bpf_prog_test_tracing missing +fentry_test # bpf_prog_test_tracing missing +fexit_bpf2bpf # freplace is missing +fexit_sleep # relies on bpf_trampoline fix in 5.12+ +fexit_test # bpf_prog_test_tracing missing +flow_dissector # bpf_link-based flow dissector is in 5.8+ +flow_dissector_reattach +for_each # v5.12+ +get_func_ip_test # v5.15+ +get_stack_raw_tp # exercising BPF verifier bug causing infinite loop +hash_large_key # v5.11+ +ima # v5.11+ +kfree_skb # 32-bit pointer arith in test_pkt_access +ksyms # __start_BTF has different name +kfunc_call # v5.13+ +link_pinning # bpf_link is missing +linked_vars # v5.13+ +load_bytes_relative # new functionality in 5.8 +lookup_and_delete # v5.14+ +map_init # per-CPU LRU missing +map_ptr # test uses BPF_MAP_TYPE_RINGBUF, added in 5.8 +metadata # v5.10+ +migrate_reuseport # v5.14+ +mmap # 5.5 kernel is too permissive with re-mmaping +modify_return # fmod_ret support is missing +module_attach # module BTF support missing (v5.11+) +netcnt +netns_cookie # v5.15+ +ns_current_pid_tgid # bpf_get_ns_current_pid_tgid() helper is missing +pe_preserve_elems # v5.10+ +perf_branches # bpf_read_branch_records() helper is missing +perf_link # v5.15+ +pkt_access # 32-bit pointer arith in test_pkt_access +probe_read_user_str # kernel bug with garbage bytes at the end +prog_run_xattr # 32-bit pointer arith in test_pkt_access +raw_tp_test_run # v5.10+ +recursion # v5.12+ +ringbuf # BPF_MAP_TYPE_RINGBUF is supported in 5.8+ + +# bug in verifier w/ tracking references +#reference_tracking/classifier/sk_lookup_success +reference_tracking + +select_reuseport # UDP support is missing +send_signal # bpf_send_signal_thread() helper is missing +sk_assign # bpf_sk_assign helper missing +sk_lookup # v5.9+ +sk_storage_tracing # missing bpf_sk_storage_get() helper +skb_ctx # ctx_{size, }_{in, out} in BPF_PROG_TEST_RUN is missing +skb_helpers # helpers added in 5.8+ +skeleton # creates too big ARRAY map +snprintf # v5.13+ +snprintf_btf # v5.10+ +sock_fields # v5.10+ +socket_cookie # v5.12+ +sockmap_basic # uses new socket fields, 5.8+ +sockmap_listen # no listen socket supportin SOCKMAP +sockopt_sk +sockopt_qos_to_cc # v5.15+ +stacktrace_build_id # v5.9+ +stack_var_off # v5.12+ +syscall # v5.14+ +task_local_storage # v5.12+ +task_pt_regs # v5.15+ +tcp_hdr_options # v5.10+, new TCP header options feature in BPF +tcpbpf_user # LINK_CREATE is missing +tc_redirect # v5.14+ +test_bpffs # v5.10+, new CONFIG_BPF_PRELOAD=y and CONFIG_BPF_PRELOAD_UMG=y|m +test_bprm_opts # v5.11+ +test_global_funcs # kernel doesn't support BTF linkage=global on FUNCs +test_local_storage # v5.10+ feature +test_lsm # no BPF_LSM support +test_overhead # no fmod_ret support +test_profiler # needs verifier logic improvements from v5.10+ +test_skb_pkt_end # v5.11+ +timer # v5.15+ +timer_mim # v5.15+ +trace_ext # v5.10+ +trace_printk # v5.14+ +trampoline_count # v5.12+ have lower allowed limits +udp_limit # no cgroup/sock_release BPF program type (5.9+) +varlen # verifier bug fixed in later kernels +vmlinux # hrtimer_nanosleep() signature changed incompatibly +xdp_adjust_tail # new XDP functionality added in 5.8 +xdp_attach # IFLA_XDP_EXPECTED_FD support is missing +xdp_bonding # v5.15+ +xdp_bpf2bpf # freplace is missing +xdp_context_test_run # v5.15+ +xdp_cpumap_attach # v5.9+ +xdp_devmap_attach # new feature in 5.8 +xdp_link # v5.9+ + +# SUBTESTS FAILING (block entire test until blocking subtests works properly) +btf # "size check test", "func (Non zero vlen)" +tailcalls # tailcall_bpf2bpf_1, tailcall_bpf2bpf_2, tailcall_bpf2bpf_3 diff --git a/libbpf/ci/vmtest/configs/DENYLIST-latest b/libbpf/ci/vmtest/configs/DENYLIST-latest new file mode 100644 index 0000000..ebebe9f --- /dev/null +++ b/libbpf/ci/vmtest/configs/DENYLIST-latest @@ -0,0 +1 @@ +decap_sanity # weird failure with decap_sanity_ns netns already existing, TBD diff --git a/libbpf/ci/vmtest/configs/DENYLIST-latest.s390x b/libbpf/ci/vmtest/configs/DENYLIST-latest.s390x new file mode 100644 index 0000000..3684f49 --- /dev/null +++ b/libbpf/ci/vmtest/configs/DENYLIST-latest.s390x @@ -0,0 +1,3 @@ +# TEMPORARY +usdt/basic # failing verifier due to bounds check after LLVM update +usdt/multispec # same as above diff --git a/libbpf/ci/vmtest/helpers.sh b/libbpf/ci/vmtest/helpers.sh new file mode 100755 index 0000000..c44d098 --- /dev/null +++ b/libbpf/ci/vmtest/helpers.sh @@ -0,0 +1,38 @@ +# shellcheck shell=bash + +# $1 - start or end +# $2 - fold identifier, no spaces +# $3 - fold section description +foldable() { + local YELLOW='\033[1;33m' + local NOCOLOR='\033[0m' + if [ $1 = "start" ]; then + line="::group::$2" + if [ ! -z "${3:-}" ]; then + line="$line - ${YELLOW}$3${NOCOLOR}" + fi + else + line="::endgroup::" + fi + echo -e "$line" +} + +__print() { + local TITLE="" + if [[ -n $2 ]]; then + TITLE=" title=$2" + fi + echo "::$1${TITLE}::$3" +} + +# $1 - title +# $2 - message +print_error() { + __print error $1 $2 +} + +# $1 - title +# $2 - message +print_notice() { + __print notice $1 $2 +} diff --git a/libbpf/ci/vmtest/run_selftests.sh b/libbpf/ci/vmtest/run_selftests.sh new file mode 100755 index 0000000..1dcde76 --- /dev/null +++ b/libbpf/ci/vmtest/run_selftests.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +set -euo pipefail + +source $(cd $(dirname $0) && pwd)/helpers.sh + +ARCH=$(uname -m) + +STATUS_FILE=/exitstatus + +read_lists() { + (for path in "$@"; do + if [[ -s "$path" ]]; then + cat "$path" + fi; + done) | cut -d'#' -f1 | tr -s ' \t\n' ',' +} + +test_progs() { + if [[ "${KERNEL}" != '4.9.0' ]]; then + foldable start test_progs "Testing test_progs" + # "&& true" does not change the return code (it is not executed + # if the Python script fails), but it prevents exiting on a + # failure due to the "set -e". + ./test_progs ${DENYLIST:+-d$DENYLIST} ${ALLOWLIST:+-a$ALLOWLIST} && true + echo "test_progs:$?" >> "${STATUS_FILE}" + foldable end test_progs + fi +} + +test_progs_no_alu32() { + foldable start test_progs-no_alu32 "Testing test_progs-no_alu32" + ./test_progs-no_alu32 ${DENYLIST:+-d$DENYLIST} ${ALLOWLIST:+-a$ALLOWLIST} && true + echo "test_progs-no_alu32:$?" >> "${STATUS_FILE}" + foldable end test_progs-no_alu32 +} + +test_maps() { + if [[ "${KERNEL}" == 'latest' ]]; then + foldable start test_maps "Testing test_maps" + ./test_maps && true + echo "test_maps:$?" >> "${STATUS_FILE}" + foldable end test_maps + fi +} + +test_verifier() { + if [[ "${KERNEL}" == 'latest' ]]; then + foldable start test_verifier "Testing test_verifier" + ./test_verifier && true + echo "test_verifier:$?" >> "${STATUS_FILE}" + foldable end test_verifier + fi +} + +foldable end vm_init + +configs_path=/${PROJECT_NAME}/selftests/bpf +local_configs_path=${PROJECT_NAME}/vmtest/configs +DENYLIST=$(read_lists \ + "$configs_path/DENYLIST" \ + "$configs_path/DENYLIST.${ARCH}" \ + "$local_configs_path/DENYLIST-${KERNEL}" \ + "$local_configs_path/DENYLIST-${KERNEL}.${ARCH}" \ +) +ALLOWLIST=$(read_lists \ + "$configs_path/ALLOWLIST" \ + "$configs_path/ALLOWLIST.${ARCH}" \ + "$local_configs_path/ALLOWLIST-${KERNEL}" \ + "$local_configs_path/ALLOWLIST-${KERNEL}.${ARCH}" \ +) + +echo "DENYLIST: ${DENYLIST}" +echo "ALLOWLIST: ${ALLOWLIST}" + +cd ${PROJECT_NAME}/selftests/bpf + +if [ $# -eq 0 ]; then + test_progs + test_progs_no_alu32 + # test_maps + test_verifier +else + for test_name in "$@"; do + "${test_name}" + done +fi diff --git a/libbpf/docs/.gitignore b/libbpf/docs/.gitignore new file mode 100644 index 0000000..dd08fae --- /dev/null +++ b/libbpf/docs/.gitignore @@ -0,0 +1,2 @@ +sphinx/build +sphinx/doxygen/build \ No newline at end of file diff --git a/libbpf/docs/api.rst b/libbpf/docs/api.rst new file mode 100644 index 0000000..7a8e709 --- /dev/null +++ b/libbpf/docs/api.rst @@ -0,0 +1,93 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +.. _api: + +.. toctree:: Table of Contents + + +LIBBPF API +========== + +Error Handling +-------------- + +When libbpf is used in "libbpf 1.0 mode", API functions can return errors in one of two ways. + +You can set "libbpf 1.0" mode with the following line: + +.. code-block:: + + libbpf_set_strict_mode(LIBBPF_STRICT_DIRECT_ERRS | LIBBPF_STRICT_CLEAN_PTRS); + +If the function returns an error code directly, it uses 0 to indicate success +and a negative error code to indicate what caused the error. In this case the +error code should be checked directly from the return, you do not need to check +errno. + +For example: + +.. code-block:: + + err = some_libbpf_api_with_error_return(...); + if (err < 0) { + /* Handle error accordingly */ + } + +If the function returns a pointer, it will return NULL to indicate there was +an error. In this case errno should be checked for the error code. + +For example: + +.. code-block:: + + ptr = some_libbpf_api_returning_ptr(); + if (!ptr) { + /* note no minus sign for EINVAL and E2BIG below */ + if (errno == EINVAL) { + /* handle EINVAL error */ + } else if (errno == E2BIG) { + /* handle E2BIG error */ + } + } + +libbpf.h +-------- +.. doxygenfile:: libbpf.h + :project: libbpf + :sections: func define public-type enum + +bpf.h +----- +.. doxygenfile:: bpf.h + :project: libbpf + :sections: func define public-type enum + +btf.h +----- +.. doxygenfile:: btf.h + :project: libbpf + :sections: func define public-type enum + +xsk.h +----- +.. doxygenfile:: xsk.h + :project: libbpf + :sections: func define public-type enum + +bpf_tracing.h +------------- +.. doxygenfile:: bpf_tracing.h + :project: libbpf + :sections: func define public-type enum + +bpf_core_read.h +--------------- +.. doxygenfile:: bpf_core_read.h + :project: libbpf + :sections: func define public-type enum + +bpf_endian.h +------------ +.. doxygenfile:: bpf_endian.h + :project: libbpf + :sections: func define public-type enum diff --git a/libbpf/docs/conf.py b/libbpf/docs/conf.py new file mode 100644 index 0000000..1d8714e --- /dev/null +++ b/libbpf/docs/conf.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +import os +import subprocess + +project = "libbpf" + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.doctest', + 'sphinx.ext.mathjax', + 'sphinx.ext.viewcode', + 'sphinx.ext.imgmath', + 'sphinx.ext.todo', + 'breathe', +] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True' + +if read_the_docs_build: + subprocess.call('cd sphinx ; make clean', shell=True) + subprocess.call('cd sphinx/doxygen ; doxygen', shell=True) + +html_theme = 'sphinx_rtd_theme' + +breathe_projects = { "libbpf": "./sphinx/doxygen/build/xml/" } +breathe_default_project = "libbpf" +breathe_show_define_initializer = True +breathe_show_enumvalue_initializer = True diff --git a/libbpf/docs/index.rst b/libbpf/docs/index.rst new file mode 100644 index 0000000..7545a20 --- /dev/null +++ b/libbpf/docs/index.rst @@ -0,0 +1,33 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +.. _libbpf: + +====== +libbpf +====== + +If you are looking to develop BPF applications using the libbpf library, this +directory contains important documentation that you should read. + +To get started, it is recommended to begin with the :doc:`libbpf Overview +` document, which provides a high-level understanding of the +libbpf APIs and their usage. This will give you a solid foundation to start +exploring and utilizing the various features of libbpf to develop your BPF +applications. + +.. toctree:: + :maxdepth: 1 + + libbpf_overview + API Documentation + program_types + libbpf_naming_convention + libbpf_build + + +All general BPF questions, including kernel functionality, libbpf APIs and their +application, should be sent to bpf@vger.kernel.org mailing list. You can +`subscribe `_ to the mailing list +search its `archive `_. Please search the archive +before asking new questions. It may be that this was already addressed or +answered before. diff --git a/libbpf/docs/libbpf_build.rst b/libbpf/docs/libbpf_build.rst new file mode 100644 index 0000000..8e8c23e --- /dev/null +++ b/libbpf/docs/libbpf_build.rst @@ -0,0 +1,37 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +Building libbpf +=============== + +libelf and zlib are internal dependencies of libbpf and thus are required to link +against and must be installed on the system for applications to work. +pkg-config is used by default to find libelf, and the program called +can be overridden with PKG_CONFIG. + +If using pkg-config at build time is not desired, it can be disabled by +setting NO_PKG_CONFIG=1 when calling make. + +To build both static libbpf.a and shared libbpf.so: + +.. code-block:: bash + + $ cd src + $ make + +To build only static libbpf.a library in directory build/ and install them +together with libbpf headers in a staging directory root/: + +.. code-block:: bash + + $ cd src + $ mkdir build root + $ BUILD_STATIC_ONLY=y OBJDIR=build DESTDIR=root make install + +To build both static libbpf.a and shared libbpf.so against a custom libelf +dependency installed in /build/root/ and install them together with libbpf +headers in a build directory /build/root/: + +.. code-block:: bash + + $ cd src + $ PKG_CONFIG_PATH=/build/root/lib64/pkgconfig DESTDIR=/build/root make \ No newline at end of file diff --git a/libbpf/docs/libbpf_naming_convention.rst b/libbpf/docs/libbpf_naming_convention.rst new file mode 100644 index 0000000..b5b41b6 --- /dev/null +++ b/libbpf/docs/libbpf_naming_convention.rst @@ -0,0 +1,193 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +API naming convention +===================== + +libbpf API provides access to a few logically separated groups of +functions and types. Every group has its own naming convention +described here. It's recommended to follow these conventions whenever a +new function or type is added to keep libbpf API clean and consistent. + +All types and functions provided by libbpf API should have one of the +following prefixes: ``bpf_``, ``btf_``, ``libbpf_``, ``btf_dump_``, +``ring_buffer_``, ``perf_buffer_``. + +System call wrappers +-------------------- + +System call wrappers are simple wrappers for commands supported by +sys_bpf system call. These wrappers should go to ``bpf.h`` header file +and map one to one to corresponding commands. + +For example ``bpf_map_lookup_elem`` wraps ``BPF_MAP_LOOKUP_ELEM`` +command of sys_bpf, ``bpf_prog_attach`` wraps ``BPF_PROG_ATTACH``, etc. + +Objects +------- + +Another class of types and functions provided by libbpf API is "objects" +and functions to work with them. Objects are high-level abstractions +such as BPF program or BPF map. They're represented by corresponding +structures such as ``struct bpf_object``, ``struct bpf_program``, +``struct bpf_map``, etc. + +Structures are forward declared and access to their fields should be +provided via corresponding getters and setters rather than directly. + +These objects are associated with corresponding parts of ELF object that +contains compiled BPF programs. + +For example ``struct bpf_object`` represents ELF object itself created +from an ELF file or from a buffer, ``struct bpf_program`` represents a +program in ELF object and ``struct bpf_map`` is a map. + +Functions that work with an object have names built from object name, +double underscore and part that describes function purpose. + +For example ``bpf_object__open`` consists of the name of corresponding +object, ``bpf_object``, double underscore and ``open`` that defines the +purpose of the function to open ELF file and create ``bpf_object`` from +it. + +All objects and corresponding functions other than BTF related should go +to ``libbpf.h``. BTF types and functions should go to ``btf.h``. + +Auxiliary functions +------------------- + +Auxiliary functions and types that don't fit well in any of categories +described above should have ``libbpf_`` prefix, e.g. +``libbpf_get_error`` or ``libbpf_prog_type_by_name``. + +ABI +--- + +libbpf can be both linked statically or used as DSO. To avoid possible +conflicts with other libraries an application is linked with, all +non-static libbpf symbols should have one of the prefixes mentioned in +API documentation above. See API naming convention to choose the right +name for a new symbol. + +Symbol visibility +----------------- + +libbpf follow the model when all global symbols have visibility "hidden" +by default and to make a symbol visible it has to be explicitly +attributed with ``LIBBPF_API`` macro. For example: + +.. code-block:: c + + LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id); + +This prevents from accidentally exporting a symbol, that is not supposed +to be a part of ABI what, in turn, improves both libbpf developer- and +user-experiences. + +ABI versioning +-------------- + +To make future ABI extensions possible libbpf ABI is versioned. +Versioning is implemented by ``libbpf.map`` version script that is +passed to linker. + +Version name is ``LIBBPF_`` prefix + three-component numeric version, +starting from ``0.0.1``. + +Every time ABI is being changed, e.g. because a new symbol is added or +semantic of existing symbol is changed, ABI version should be bumped. +This bump in ABI version is at most once per kernel development cycle. + +For example, if current state of ``libbpf.map`` is: + +.. code-block:: none + + LIBBPF_0.0.1 { + global: + bpf_func_a; + bpf_func_b; + local: + \*; + }; + +, and a new symbol ``bpf_func_c`` is being introduced, then +``libbpf.map`` should be changed like this: + +.. code-block:: none + + LIBBPF_0.0.1 { + global: + bpf_func_a; + bpf_func_b; + local: + \*; + }; + LIBBPF_0.0.2 { + global: + bpf_func_c; + } LIBBPF_0.0.1; + +, where new version ``LIBBPF_0.0.2`` depends on the previous +``LIBBPF_0.0.1``. + +Format of version script and ways to handle ABI changes, including +incompatible ones, described in details in [1]. + +Stand-alone build +------------------- + +Under https://github.com/libbpf/libbpf there is a (semi-)automated +mirror of the mainline's version of libbpf for a stand-alone build. + +However, all changes to libbpf's code base must be upstreamed through +the mainline kernel tree. + + +API documentation convention +============================ + +The libbpf API is documented via comments above definitions in +header files. These comments can be rendered by doxygen and sphinx +for well organized html output. This section describes the +convention in which these comments should be formatted. + +Here is an example from btf.h: + +.. code-block:: c + + /** + * @brief **btf__new()** creates a new instance of a BTF object from the raw + * bytes of an ELF's BTF section + * @param data raw bytes + * @param size number of bytes passed in `data` + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ + +The comment must start with a block comment of the form '/\*\*'. + +The documentation always starts with a @brief directive. This line is a short +description about this API. It starts with the name of the API, denoted in bold +like so: **api_name**. Please include an open and close parenthesis if this is a +function. Follow with the short description of the API. A longer form description +can be added below the last directive, at the bottom of the comment. + +Parameters are denoted with the @param directive, there should be one for each +parameter. If this is a function with a non-void return, use the @return directive +to document it. + +License +------------------- + +libbpf is dual-licensed under LGPL 2.1 and BSD 2-Clause. + +Links +------------------- + +[1] https://www.akkadia.org/drepper/dsohowto.pdf + (Chapter 3. Maintaining APIs and ABIs). diff --git a/libbpf/docs/libbpf_overview.rst b/libbpf/docs/libbpf_overview.rst new file mode 100644 index 0000000..f36a2d4 --- /dev/null +++ b/libbpf/docs/libbpf_overview.rst @@ -0,0 +1,228 @@ +.. SPDX-License-Identifier: GPL-2.0 + +=============== +libbpf Overview +=============== + +libbpf is a C-based library containing a BPF loader that takes compiled BPF +object files and prepares and loads them into the Linux kernel. libbpf takes the +heavy lifting of loading, verifying, and attaching BPF programs to various +kernel hooks, allowing BPF application developers to focus only on BPF program +correctness and performance. + +The following are the high-level features supported by libbpf: + +* Provides high-level and low-level APIs for user space programs to interact + with BPF programs. The low-level APIs wrap all the bpf system call + functionality, which is useful when users need more fine-grained control + over the interactions between user space and BPF programs. +* Provides overall support for the BPF object skeleton generated by bpftool. + The skeleton file simplifies the process for the user space programs to access + global variables and work with BPF programs. +* Provides BPF-side APIS, including BPF helper definitions, BPF maps support, + and tracing helpers, allowing developers to simplify BPF code writing. +* Supports BPF CO-RE mechanism, enabling BPF developers to write portable + BPF programs that can be compiled once and run across different kernel + versions. + +This document will delve into the above concepts in detail, providing a deeper +understanding of the capabilities and advantages of libbpf and how it can help +you develop BPF applications efficiently. + +BPF App Lifecycle and libbpf APIs +================================== + +A BPF application consists of one or more BPF programs (either cooperating or +completely independent), BPF maps, and global variables. The global +variables are shared between all BPF programs, which allows them to cooperate on +a common set of data. libbpf provides APIs that user space programs can use to +manipulate the BPF programs by triggering different phases of a BPF application +lifecycle. + +The following section provides a brief overview of each phase in the BPF life +cycle: + +* **Open phase**: In this phase, libbpf parses the BPF + object file and discovers BPF maps, BPF programs, and global variables. After + a BPF app is opened, user space apps can make additional adjustments + (setting BPF program types, if necessary; pre-setting initial values for + global variables, etc.) before all the entities are created and loaded. + +* **Load phase**: In the load phase, libbpf creates BPF + maps, resolves various relocations, and verifies and loads BPF programs into + the kernel. At this point, libbpf validates all the parts of a BPF application + and loads the BPF program into the kernel, but no BPF program has yet been + executed. After the load phase, it’s possible to set up the initial BPF map + state without racing with the BPF program code execution. + +* **Attachment phase**: In this phase, libbpf + attaches BPF programs to various BPF hook points (e.g., tracepoints, kprobes, + cgroup hooks, network packet processing pipeline, etc.). During this + phase, BPF programs perform useful work such as processing + packets, or updating BPF maps and global variables that can be read from user + space. + +* **Tear down phase**: In the tear down phase, + libbpf detaches BPF programs and unloads them from the kernel. BPF maps are + destroyed, and all the resources used by the BPF app are freed. + +BPF Object Skeleton File +======================== + +BPF skeleton is an alternative interface to libbpf APIs for working with BPF +objects. Skeleton code abstract away generic libbpf APIs to significantly +simplify code for manipulating BPF programs from user space. Skeleton code +includes a bytecode representation of the BPF object file, simplifying the +process of distributing your BPF code. With BPF bytecode embedded, there are no +extra files to deploy along with your application binary. + +You can generate the skeleton header file ``(.skel.h)`` for a specific object +file by passing the BPF object to the bpftool. The generated BPF skeleton +provides the following custom functions that correspond to the BPF lifecycle, +each of them prefixed with the specific object name: + +* ``__open()`` – creates and opens BPF application (```` stands for + the specific bpf object name) +* ``__load()`` – instantiates, loads,and verifies BPF application parts +* ``__attach()`` – attaches all auto-attachable BPF programs (it’s + optional, you can have more control by using libbpf APIs directly) +* ``__destroy()`` – detaches all BPF programs and + frees up all used resources + +Using the skeleton code is the recommended way to work with bpf programs. Keep +in mind, BPF skeleton provides access to the underlying BPF object, so whatever +was possible to do with generic libbpf APIs is still possible even when the BPF +skeleton is used. It's an additive convenience feature, with no syscalls, and no +cumbersome code. + +Other Advantages of Using Skeleton File +--------------------------------------- + +* BPF skeleton provides an interface for user space programs to work with BPF + global variables. The skeleton code memory maps global variables as a struct + into user space. The struct interface allows user space programs to initialize + BPF programs before the BPF load phase and fetch and update data from user + space afterward. + +* The ``skel.h`` file reflects the object file structure by listing out the + available maps, programs, etc. BPF skeleton provides direct access to all the + BPF maps and BPF programs as struct fields. This eliminates the need for + string-based lookups with ``bpf_object_find_map_by_name()`` and + ``bpf_object_find_program_by_name()`` APIs, reducing errors due to BPF source + code and user-space code getting out of sync. + +* The embedded bytecode representation of the object file ensures that the + skeleton and the BPF object file are always in sync. + +BPF Helpers +=========== + +libbpf provides BPF-side APIs that BPF programs can use to interact with the +system. The BPF helpers definition allows developers to use them in BPF code as +any other plain C function. For example, there are helper functions to print +debugging messages, get the time since the system was booted, interact with BPF +maps, manipulate network packets, etc. + +For a complete description of what the helpers do, the arguments they take, and +the return value, see the `bpf-helpers +`_ man page. + +BPF CO-RE (Compile Once – Run Everywhere) +========================================= + +BPF programs work in the kernel space and have access to kernel memory and data +structures. One limitation that BPF applications come across is the lack of +portability across different kernel versions and configurations. `BCC +`_ is one of the solutions for BPF +portability. However, it comes with runtime overhead and a large binary size +from embedding the compiler with the application. + +libbpf steps up the BPF program portability by supporting the BPF CO-RE concept. +BPF CO-RE brings together BTF type information, libbpf, and the compiler to +produce a single executable binary that you can run on multiple kernel versions +and configurations. + +To make BPF programs portable libbpf relies on the BTF type information of the +running kernel. Kernel also exposes this self-describing authoritative BTF +information through ``sysfs`` at ``/sys/kernel/btf/vmlinux``. + +You can generate the BTF information for the running kernel with the following +command: + +:: + + $ bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h + +The command generates a ``vmlinux.h`` header file with all kernel types +(:doc:`BTF types <../btf>`) that the running kernel uses. Including +``vmlinux.h`` in your BPF program eliminates dependency on system-wide kernel +headers. + +libbpf enables portability of BPF programs by looking at the BPF program’s +recorded BTF type and relocation information and matching them to BTF +information (vmlinux) provided by the running kernel. libbpf then resolves and +matches all the types and fields, and updates necessary offsets and other +relocatable data to ensure that BPF program’s logic functions correctly for a +specific kernel on the host. BPF CO-RE concept thus eliminates overhead +associated with BPF development and allows developers to write portable BPF +applications without modifications and runtime source code compilation on the +target machine. + +The following code snippet shows how to read the parent field of a kernel +``task_struct`` using BPF CO-RE and libbf. The basic helper to read a field in a +CO-RE relocatable manner is ``bpf_core_read(dst, sz, src)``, which will read +``sz`` bytes from the field referenced by ``src`` into the memory pointed to by +``dst``. + +.. code-block:: C + :emphasize-lines: 6 + + //... + struct task_struct *task = (void *)bpf_get_current_task(); + struct task_struct *parent_task; + int err; + + err = bpf_core_read(&parent_task, sizeof(void *), &task->parent); + if (err) { + /* handle error */ + } + + /* parent_task contains the value of task->parent pointer */ + +In the code snippet, we first get a pointer to the current ``task_struct`` using +``bpf_get_current_task()``. We then use ``bpf_core_read()`` to read the parent +field of task struct into the ``parent_task`` variable. ``bpf_core_read()`` is +just like ``bpf_probe_read_kernel()`` BPF helper, except it records information +about the field that should be relocated on the target kernel. i.e, if the +``parent`` field gets shifted to a different offset within +``struct task_struct`` due to some new field added in front of it, libbpf will +automatically adjust the actual offset to the proper value. + +Getting Started with libbpf +=========================== + +Check out the `libbpf-bootstrap `_ +repository with simple examples of using libbpf to build various BPF +applications. + +See also `libbpf API documentation +`_. + +libbpf and Rust +=============== + +If you are building BPF applications in Rust, it is recommended to use the +`Libbpf-rs `_ library instead of bindgen +bindings directly to libbpf. Libbpf-rs wraps libbpf functionality in +Rust-idiomatic interfaces and provides libbpf-cargo plugin to handle BPF code +compilation and skeleton generation. Using Libbpf-rs will make building user +space part of the BPF application easier. Note that the BPF program themselves +must still be written in plain C. + +Additional Documentation +======================== + +* `Program types and ELF Sections `_ +* `API naming convention `_ +* `Building libbpf `_ +* `API documentation Convention `_ diff --git a/libbpf/docs/program_types.rst b/libbpf/docs/program_types.rst new file mode 100644 index 0000000..ad4d4d5 --- /dev/null +++ b/libbpf/docs/program_types.rst @@ -0,0 +1,203 @@ +.. SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +.. _program_types_and_elf: + +Program Types and ELF Sections +============================== + +The table below lists the program types, their attach types where relevant and the ELF section +names supported by libbpf for them. The ELF section names follow these rules: + +- ``type`` is an exact match, e.g. ``SEC("socket")`` +- ``type+`` means it can be either exact ``SEC("type")`` or well-formed ``SEC("type/extras")`` + with a '``/``' separator between ``type`` and ``extras``. + +When ``extras`` are specified, they provide details of how to auto-attach the BPF program. The +format of ``extras`` depends on the program type, e.g. ``SEC("tracepoint//")`` +for tracepoints or ``SEC("usdt/::")`` for USDT probes. The extras are +described in more detail in the footnotes. + + ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| Program Type | Attach Type | ELF Section Name | Sleepable | ++===========================================+========================================+==================================+===========+ +| ``BPF_PROG_TYPE_CGROUP_DEVICE`` | ``BPF_CGROUP_DEVICE`` | ``cgroup/dev`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SKB`` | | ``cgroup/skb`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET_EGRESS`` | ``cgroup_skb/egress`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET_INGRESS`` | ``cgroup_skb/ingress`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SOCKOPT`` | ``BPF_CGROUP_GETSOCKOPT`` | ``cgroup/getsockopt`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_SETSOCKOPT`` | ``cgroup/setsockopt`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SOCK_ADDR`` | ``BPF_CGROUP_INET4_BIND`` | ``cgroup/bind4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET4_CONNECT`` | ``cgroup/connect4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET4_GETPEERNAME`` | ``cgroup/getpeername4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET4_GETSOCKNAME`` | ``cgroup/getsockname4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_BIND`` | ``cgroup/bind6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_CONNECT`` | ``cgroup/connect6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_GETPEERNAME`` | ``cgroup/getpeername6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_GETSOCKNAME`` | ``cgroup/getsockname6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_UDP4_RECVMSG`` | ``cgroup/recvmsg4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_UDP4_SENDMSG`` | ``cgroup/sendmsg4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_UDP6_RECVMSG`` | ``cgroup/recvmsg6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_UDP6_SENDMSG`` | ``cgroup/sendmsg6`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SOCK`` | ``BPF_CGROUP_INET4_POST_BIND`` | ``cgroup/post_bind4`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET6_POST_BIND`` | ``cgroup/post_bind6`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET_SOCK_CREATE`` | ``cgroup/sock_create`` | | ++ + +----------------------------------+-----------+ +| | | ``cgroup/sock`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_CGROUP_INET_SOCK_RELEASE`` | ``cgroup/sock_release`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_CGROUP_SYSCTL`` | ``BPF_CGROUP_SYSCTL`` | ``cgroup/sysctl`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_EXT`` | | ``freplace+`` [#fentry]_ | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_FLOW_DISSECTOR`` | ``BPF_FLOW_DISSECTOR`` | ``flow_dissector`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_KPROBE`` | | ``kprobe+`` [#kprobe]_ | | ++ + +----------------------------------+-----------+ +| | | ``kretprobe+`` [#kprobe]_ | | ++ + +----------------------------------+-----------+ +| | | ``ksyscall+`` [#ksyscall]_ | | ++ + +----------------------------------+-----------+ +| | | ``kretsyscall+`` [#ksyscall]_ | | ++ + +----------------------------------+-----------+ +| | | ``uprobe+`` [#uprobe]_ | | ++ + +----------------------------------+-----------+ +| | | ``uprobe.s+`` [#uprobe]_ | Yes | ++ + +----------------------------------+-----------+ +| | | ``uretprobe+`` [#uprobe]_ | | ++ + +----------------------------------+-----------+ +| | | ``uretprobe.s+`` [#uprobe]_ | Yes | ++ + +----------------------------------+-----------+ +| | | ``usdt+`` [#usdt]_ | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_KPROBE_MULTI`` | ``kprobe.multi+`` [#kpmulti]_ | | ++ + +----------------------------------+-----------+ +| | | ``kretprobe.multi+`` [#kpmulti]_ | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LIRC_MODE2`` | ``BPF_LIRC_MODE2`` | ``lirc_mode2`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LSM`` | ``BPF_LSM_CGROUP`` | ``lsm_cgroup+`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_LSM_MAC`` | ``lsm+`` [#lsm]_ | | ++ + +----------------------------------+-----------+ +| | | ``lsm.s+`` [#lsm]_ | Yes | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LWT_IN`` | | ``lwt_in`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LWT_OUT`` | | ``lwt_out`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LWT_SEG6LOCAL`` | | ``lwt_seg6local`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_LWT_XMIT`` | | ``lwt_xmit`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_PERF_EVENT`` | | ``perf_event`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE`` | | ``raw_tp.w+`` [#rawtp]_ | | ++ + +----------------------------------+-----------+ +| | | ``raw_tracepoint.w+`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_RAW_TRACEPOINT`` | | ``raw_tp+`` [#rawtp]_ | | ++ + +----------------------------------+-----------+ +| | | ``raw_tracepoint+`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SCHED_ACT`` | | ``action`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SCHED_CLS`` | | ``classifier`` | | ++ + +----------------------------------+-----------+ +| | | ``tc`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SK_LOOKUP`` | ``BPF_SK_LOOKUP`` | ``sk_lookup`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SK_MSG`` | ``BPF_SK_MSG_VERDICT`` | ``sk_msg`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SK_REUSEPORT`` | ``BPF_SK_REUSEPORT_SELECT_OR_MIGRATE`` | ``sk_reuseport/migrate`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_SK_REUSEPORT_SELECT`` | ``sk_reuseport`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SK_SKB`` | | ``sk_skb`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_SK_SKB_STREAM_PARSER`` | ``sk_skb/stream_parser`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_SK_SKB_STREAM_VERDICT`` | ``sk_skb/stream_verdict`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SOCKET_FILTER`` | | ``socket`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SOCK_OPS`` | ``BPF_CGROUP_SOCK_OPS`` | ``sockops`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_STRUCT_OPS`` | | ``struct_ops+`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_SYSCALL`` | | ``syscall`` | Yes | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_TRACEPOINT`` | | ``tp+`` [#tp]_ | | ++ + +----------------------------------+-----------+ +| | | ``tracepoint+`` [#tp]_ | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_TRACING`` | ``BPF_MODIFY_RETURN`` | ``fmod_ret+`` [#fentry]_ | | ++ + +----------------------------------+-----------+ +| | | ``fmod_ret.s+`` [#fentry]_ | Yes | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_FENTRY`` | ``fentry+`` [#fentry]_ | | ++ + +----------------------------------+-----------+ +| | | ``fentry.s+`` [#fentry]_ | Yes | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_FEXIT`` | ``fexit+`` [#fentry]_ | | ++ + +----------------------------------+-----------+ +| | | ``fexit.s+`` [#fentry]_ | Yes | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_ITER`` | ``iter+`` [#iter]_ | | ++ + +----------------------------------+-----------+ +| | | ``iter.s+`` [#iter]_ | Yes | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_TRACE_RAW_TP`` | ``tp_btf+`` [#fentry]_ | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ +| ``BPF_PROG_TYPE_XDP`` | ``BPF_XDP_CPUMAP`` | ``xdp.frags/cpumap`` | | ++ + +----------------------------------+-----------+ +| | | ``xdp/cpumap`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_XDP_DEVMAP`` | ``xdp.frags/devmap`` | | ++ + +----------------------------------+-----------+ +| | | ``xdp/devmap`` | | ++ +----------------------------------------+----------------------------------+-----------+ +| | ``BPF_XDP`` | ``xdp.frags`` | | ++ + +----------------------------------+-----------+ +| | | ``xdp`` | | ++-------------------------------------------+----------------------------------------+----------------------------------+-----------+ + + +.. rubric:: Footnotes + +.. [#fentry] The ``fentry`` attach format is ``fentry[.s]/``. +.. [#kprobe] The ``kprobe`` attach format is ``kprobe/[+]``. Valid + characters for ``function`` are ``a-zA-Z0-9_.`` and ``offset`` must be a valid + non-negative integer. +.. [#ksyscall] The ``ksyscall`` attach format is ``ksyscall/``. +.. [#uprobe] The ``uprobe`` attach format is ``uprobe[.s]/:[+]``. +.. [#usdt] The ``usdt`` attach format is ``usdt/::``. +.. [#kpmulti] The ``kprobe.multi`` attach format is ``kprobe.multi/`` where ``pattern`` + supports ``*`` and ``?`` wildcards. Valid characters for pattern are + ``a-zA-Z0-9_.*?``. +.. [#lsm] The ``lsm`` attachment format is ``lsm[.s]/``. +.. [#rawtp] The ``raw_tp`` attach format is ``raw_tracepoint[.w]/``. +.. [#tp] The ``tracepoint`` attach format is ``tracepoint//``. +.. [#iter] The ``iter`` attach format is ``iter[.s]/``. diff --git a/libbpf/docs/sphinx/Makefile b/libbpf/docs/sphinx/Makefile new file mode 100644 index 0000000..5dc39c5 --- /dev/null +++ b/libbpf/docs/sphinx/Makefile @@ -0,0 +1,9 @@ +SPHINXBUILD ?= sphinx-build +SOURCEDIR = ../src +BUILDDIR = build + +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" + +%: + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" diff --git a/libbpf/docs/sphinx/doxygen/Doxyfile b/libbpf/docs/sphinx/doxygen/Doxyfile new file mode 100644 index 0000000..b04c115 --- /dev/null +++ b/libbpf/docs/sphinx/doxygen/Doxyfile @@ -0,0 +1,277 @@ +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "libbpf" +PROJECT_NUMBER = +PROJECT_BRIEF = +PROJECT_LOGO = +OUTPUT_DIRECTORY = ./build +CREATE_SUBDIRS = NO +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English +OUTPUT_TEXT_DIRECTION = None +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +JAVADOC_BANNER = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +PYTHON_DOCSTRING = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +OPTIMIZE_OUTPUT_SLICE = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +TOC_INCLUDE_HEADINGS = 5 +AUTOLINK_SUPPORT = YES +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 +NUM_PROC_THREADS = 1 +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +RESOLVE_UNNAMED_PARAMS = YES +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +HIDE_COMPOUND_REFERENCE= NO +SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +CITE_BIB_FILES = +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +INPUT = ../../../src +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = *.c \ + *.h +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = ___* +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = YES +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +ALPHABETICAL_INDEX = YES +IGNORE_PREFIX = +GENERATE_HTML = NO +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_TIMESTAMP = NO +HTML_DYNAMIC_MENUS = YES +HTML_DYNAMIC_SECTIONS = NO +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = NO +ENUM_VALUES_PER_LINE = 4 +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +HTML_FORMULA_FORMAT = png +FORMULA_FONTSIZE = 10 +FORMULA_TRANSPARENT = YES +FORMULA_MACROFILE = +USE_MATHJAX = NO +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = +MAKEINDEX_CMD_NAME = makeindex +LATEX_MAKEINDEX_CMD = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = +LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_FILES = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +LATEX_SOURCE_CODE = NO +LATEX_BIB_STYLE = plain +LATEX_TIMESTAMP = NO +LATEX_EMOJI_DIRECTORY = +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +RTF_SOURCE_CODE = NO +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_SUBDIR = +MAN_LINKS = NO +GENERATE_XML = YES +XML_OUTPUT = xml +XML_PROGRAMLISTING = YES +XML_NS_MEMB_FILE_SCOPE = NO +GENERATE_DOCBOOK = NO +DOCBOOK_OUTPUT = docbook +DOCBOOK_PROGRAMLISTING = NO +GENERATE_AUTOGEN_DEF = NO +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = YES +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = NO +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +EXTERNAL_PAGES = YES +CLASS_DIAGRAMS = YES +DIA_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +DOT_NUM_THREADS = 0 +DOT_FONTNAME = Helvetica +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +UML_LIMIT_NUM_FIELDS = 10 +DOT_UML_DETAILS = NO +DOT_WRAP_THRESHOLD = 17 +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = +DOTFILE_DIRS = +MSCFILE_DIRS = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = +PLANTUML_CFG_FILE = +PLANTUML_INCLUDE_PATH = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES diff --git a/libbpf/docs/sphinx/requirements.txt b/libbpf/docs/sphinx/requirements.txt new file mode 100644 index 0000000..188f51e --- /dev/null +++ b/libbpf/docs/sphinx/requirements.txt @@ -0,0 +1 @@ +breathe \ No newline at end of file diff --git a/libbpf/fuzz/bpf-object-fuzzer.c b/libbpf/fuzz/bpf-object-fuzzer.c new file mode 100644 index 0000000..89286e2 --- /dev/null +++ b/libbpf/fuzz/bpf-object-fuzzer.c @@ -0,0 +1,23 @@ +#include "libbpf.h" + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) +{ + return 0; +} + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + struct bpf_object *obj = NULL; + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts); + int err; + + libbpf_set_print(libbpf_print_fn); + + opts.object_name = "fuzz-object"; + obj = bpf_object__open_mem(data, size, &opts); + err = libbpf_get_error(obj); + if (err) + return 0; + + bpf_object__close(obj); + return 0; +} diff --git a/libbpf/fuzz/bpf-object-fuzzer_seed_corpus.zip b/libbpf/fuzz/bpf-object-fuzzer_seed_corpus.zip new file mode 100644 index 0000000..602b381 Binary files /dev/null and b/libbpf/fuzz/bpf-object-fuzzer_seed_corpus.zip differ diff --git a/libbpf/include/asm/barrier.h b/libbpf/include/asm/barrier.h new file mode 100644 index 0000000..1fc6aee --- /dev/null +++ b/libbpf/include/asm/barrier.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __ASM_BARRIER_H +#define __ASM_BARRIER_H + +#include + +#endif diff --git a/libbpf/include/linux/compiler.h b/libbpf/include/linux/compiler.h new file mode 100644 index 0000000..26336dc --- /dev/null +++ b/libbpf/include/linux/compiler.h @@ -0,0 +1,70 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_COMPILER_H +#define __LINUX_COMPILER_H + +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + +#define READ_ONCE(x) (*(volatile typeof(x) *)&x) +#define WRITE_ONCE(x, v) (*(volatile typeof(x) *)&x) = (v) + +#define barrier() asm volatile("" ::: "memory") + +#if defined(__x86_64__) + +# define smp_rmb() barrier() +# define smp_wmb() barrier() +# define smp_mb() asm volatile("lock; addl $0,-132(%%rsp)" ::: "memory", "cc") + +# define smp_store_release(p, v) \ +do { \ + barrier(); \ + WRITE_ONCE(*p, v); \ +} while (0) + +# define smp_load_acquire(p) \ +({ \ + typeof(*p) ___p = READ_ONCE(*p); \ + barrier(); \ + ___p; \ +}) + +#elif defined(__aarch64__) + +# define smp_rmb() asm volatile("dmb ishld" ::: "memory") +# define smp_wmb() asm volatile("dmb ishst" ::: "memory") +# define smp_mb() asm volatile("dmb ish" ::: "memory") + +#endif + +#ifndef smp_mb +# define smp_mb() __sync_synchronize() +#endif + +#ifndef smp_rmb +# define smp_rmb() smp_mb() +#endif + +#ifndef smp_wmb +# define smp_wmb() smp_mb() +#endif + +#ifndef smp_store_release +# define smp_store_release(p, v) \ +do { \ + smp_mb(); \ + WRITE_ONCE(*p, v); \ +} while (0) +#endif + +#ifndef smp_load_acquire +# define smp_load_acquire(p) \ +({ \ + typeof(*p) ___p = READ_ONCE(*p); \ + smp_mb(); \ + ___p; \ +}) +#endif + +#endif /* __LINUX_COMPILER_H */ diff --git a/libbpf/include/linux/err.h b/libbpf/include/linux/err.h new file mode 100644 index 0000000..1b1dafb --- /dev/null +++ b/libbpf/include/linux/err.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_ERR_H +#define __LINUX_ERR_H + +#include +#include + +#define MAX_ERRNO 4095 + +#define IS_ERR_VALUE(x) ((x) >= (unsigned long)-MAX_ERRNO) + +static inline void * ERR_PTR(long error_) +{ + return (void *) error_; +} + +static inline long PTR_ERR(const void *ptr) +{ + return (long) ptr; +} + +static inline bool IS_ERR(const void *ptr) +{ + return IS_ERR_VALUE((unsigned long)ptr); +} + +static inline bool IS_ERR_OR_NULL(const void *ptr) +{ + return (!ptr) || IS_ERR_VALUE((unsigned long)ptr); +} + +static inline long PTR_ERR_OR_ZERO(const void *ptr) +{ + return IS_ERR(ptr) ? PTR_ERR(ptr) : 0; +} + +#endif diff --git a/libbpf/include/linux/filter.h b/libbpf/include/linux/filter.h new file mode 100644 index 0000000..e7e3373 --- /dev/null +++ b/libbpf/include/linux/filter.h @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_FILTER_H +#define __LINUX_FILTER_H + +#include + +#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \ + ((struct bpf_insn) { \ + .code = CODE, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = IMM }) + +#define BPF_ALU32_IMM(OP, DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_ALU64_IMM(OP, DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_MOV64_IMM(DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_MOV | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_EXIT_INSN() \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_EXIT, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = 0 }) + +#define BPF_EMIT_CALL(FUNC) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_CALL, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = 0, \ + .imm = ((FUNC) - BPF_FUNC_unspec) }) + +#define BPF_LDX_MEM(SIZE, DST, SRC, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = 0 }) + +#define BPF_STX_MEM(SIZE, DST, SRC, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF, \ + .imm = 0 }) + +#define BPF_ST_MEM(SIZE, DST, OFF, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +#define BPF_MOV64_REG(DST, SRC) \ + ((struct bpf_insn) { \ + .code = BPF_ALU64 | BPF_MOV | BPF_X, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = 0, \ + .imm = 0 }) + +#define BPF_MOV32_IMM(DST, IMM) \ + ((struct bpf_insn) { \ + .code = BPF_ALU | BPF_MOV | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = 0, \ + .imm = IMM }) + +#define BPF_LD_IMM64_RAW_FULL(DST, SRC, OFF1, OFF2, IMM1, IMM2) \ + ((struct bpf_insn) { \ + .code = BPF_LD | BPF_DW | BPF_IMM, \ + .dst_reg = DST, \ + .src_reg = SRC, \ + .off = OFF1, \ + .imm = IMM1 }), \ + ((struct bpf_insn) { \ + .code = 0, \ + .dst_reg = 0, \ + .src_reg = 0, \ + .off = OFF2, \ + .imm = IMM2 }) + +#define BPF_LD_MAP_FD(DST, MAP_FD) \ + BPF_LD_IMM64_RAW_FULL(DST, BPF_PSEUDO_MAP_FD, 0, 0, \ + MAP_FD, 0) + +#define BPF_LD_MAP_VALUE(DST, MAP_FD, VALUE_OFF) \ + BPF_LD_IMM64_RAW_FULL(DST, BPF_PSEUDO_MAP_VALUE, 0, 0, \ + MAP_FD, VALUE_OFF) + +#define BPF_JMP_IMM(OP, DST, IMM, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +#define BPF_JMP32_IMM(OP, DST, IMM, OFF) \ + ((struct bpf_insn) { \ + .code = BPF_JMP32 | BPF_OP(OP) | BPF_K, \ + .dst_reg = DST, \ + .src_reg = 0, \ + .off = OFF, \ + .imm = IMM }) + +#endif diff --git a/libbpf/include/linux/kernel.h b/libbpf/include/linux/kernel.h new file mode 100644 index 0000000..a4a7a9d --- /dev/null +++ b/libbpf/include/linux/kernel.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_KERNEL_H +#define __LINUX_KERNEL_H + +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif + +#ifndef container_of +#define container_of(ptr, type, member) ({ \ + const typeof(((type *)0)->member) * __mptr = (ptr); \ + (type *)((char *)__mptr - offsetof(type, member)); }) +#endif + +#ifndef max +#define max(x, y) ({ \ + typeof(x) _max1 = (x); \ + typeof(y) _max2 = (y); \ + (void) (&_max1 == &_max2); \ + _max1 > _max2 ? _max1 : _max2; }) +#endif + +#ifndef min +#define min(x, y) ({ \ + typeof(x) _min1 = (x); \ + typeof(y) _min2 = (y); \ + (void) (&_min1 == &_min2); \ + _min1 < _min2 ? _min1 : _min2; }) +#endif + +#ifndef roundup +#define roundup(x, y) ( \ +{ \ + const typeof(y) __y = y; \ + (((x) + (__y - 1)) / __y) * __y; \ +} \ +) +#endif + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) + +#endif diff --git a/libbpf/include/linux/list.h b/libbpf/include/linux/list.h new file mode 100644 index 0000000..fc91c34 --- /dev/null +++ b/libbpf/include/linux/list.h @@ -0,0 +1,91 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_LIST_H +#define __LINUX_LIST_H + +#define LIST_HEAD_INIT(name) { &(name), &(name) } +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define POISON_POINTER_DELTA 0 +#define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA) +#define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA) + + +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} + +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty() on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void __list_del_entry(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} + +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) +#define list_next_entry(pos, member) \ + list_entry((pos)->member.next, typeof(*(pos)), member) +#define list_for_each_entry(pos, head, member) \ + for (pos = list_first_entry(head, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_next_entry(pos, member)) + +#endif diff --git a/libbpf/include/linux/overflow.h b/libbpf/include/linux/overflow.h new file mode 100644 index 0000000..53d7580 --- /dev/null +++ b/libbpf/include/linux/overflow.h @@ -0,0 +1,90 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_OVERFLOW_H +#define __LINUX_OVERFLOW_H + +#define is_signed_type(type) (((type)(-1)) < (type)1) +#define __type_half_max(type) ((type)1 << (8*sizeof(type) - 1 - is_signed_type(type))) +#define type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T))) +#define type_min(T) ((T)((T)-type_max(T)-(T)1)) + +#ifndef unlikely +#define unlikely(x) __builtin_expect(!!(x), 0) +#endif + +#ifdef __GNUC__ +#define GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +#if GCC_VERSION >= 50100 +#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1 +#endif +#endif + +#ifdef COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW + +#define check_mul_overflow(a, b, d) ({ \ + typeof(a) __a = (a); \ + typeof(b) __b = (b); \ + typeof(d) __d = (d); \ + (void) (&__a == &__b); \ + (void) (&__a == __d); \ + __builtin_mul_overflow(__a, __b, __d); \ +}) + +#else + +/* + * If one of a or b is a compile-time constant, this avoids a division. + */ +#define __unsigned_mul_overflow(a, b, d) ({ \ + typeof(a) __a = (a); \ + typeof(b) __b = (b); \ + typeof(d) __d = (d); \ + (void) (&__a == &__b); \ + (void) (&__a == __d); \ + *__d = __a * __b; \ + __builtin_constant_p(__b) ? \ + __b > 0 && __a > type_max(typeof(__a)) / __b : \ + __a > 0 && __b > type_max(typeof(__b)) / __a; \ +}) + +/* + * Signed multiplication is rather hard. gcc always follows C99, so + * division is truncated towards 0. This means that we can write the + * overflow check like this: + * + * (a > 0 && (b > MAX/a || b < MIN/a)) || + * (a < -1 && (b > MIN/a || b < MAX/a) || + * (a == -1 && b == MIN) + * + * The redundant casts of -1 are to silence an annoying -Wtype-limits + * (included in -Wextra) warning: When the type is u8 or u16, the + * __b_c_e in check_mul_overflow obviously selects + * __unsigned_mul_overflow, but unfortunately gcc still parses this + * code and warns about the limited range of __b. + */ + +#define __signed_mul_overflow(a, b, d) ({ \ + typeof(a) __a = (a); \ + typeof(b) __b = (b); \ + typeof(d) __d = (d); \ + typeof(a) __tmax = type_max(typeof(a)); \ + typeof(a) __tmin = type_min(typeof(a)); \ + (void) (&__a == &__b); \ + (void) (&__a == __d); \ + *__d = (__u64)__a * (__u64)__b; \ + (__b > 0 && (__a > __tmax/__b || __a < __tmin/__b)) || \ + (__b < (typeof(__b))-1 && (__a > __tmin/__b || __a < __tmax/__b)) || \ + (__b == (typeof(__b))-1 && __a == __tmin); \ +}) + +#define check_mul_overflow(a, b, d) \ + __builtin_choose_expr(is_signed_type(typeof(a)), \ + __signed_mul_overflow(a, b, d), \ + __unsigned_mul_overflow(a, b, d)) + + +#endif /* COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW */ + +#endif diff --git a/libbpf/include/linux/ring_buffer.h b/libbpf/include/linux/ring_buffer.h new file mode 100644 index 0000000..fc4677b --- /dev/null +++ b/libbpf/include/linux/ring_buffer.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef _TOOLS_LINUX_RING_BUFFER_H_ +#define _TOOLS_LINUX_RING_BUFFER_H_ + +#include + +static inline __u64 ring_buffer_read_head(struct perf_event_mmap_page *base) +{ + return smp_load_acquire(&base->data_head); +} + +static inline void ring_buffer_write_tail(struct perf_event_mmap_page *base, + __u64 tail) +{ + smp_store_release(&base->data_tail, tail); +} + +#endif /* _TOOLS_LINUX_RING_BUFFER_H_ */ diff --git a/libbpf/include/linux/types.h b/libbpf/include/linux/types.h new file mode 100644 index 0000000..b15252a --- /dev/null +++ b/libbpf/include/linux/types.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LINUX_TYPES_H +#define __LINUX_TYPES_H + +#include +#include +#include + +#include + +#include +#include + +#define __bitwise__ +#define __bitwise __bitwise__ + +typedef __u16 __bitwise __le16; +typedef __u16 __bitwise __be16; +typedef __u32 __bitwise __le32; +typedef __u32 __bitwise __be32; +typedef __u64 __bitwise __le64; +typedef __u64 __bitwise __be64; + +#ifndef __aligned_u64 +# define __aligned_u64 __u64 __attribute__((aligned(8))) +#endif + +struct list_head { + struct list_head *next, *prev; +}; + +#endif diff --git a/libbpf/include/uapi/linux/bpf.h b/libbpf/include/uapi/linux/bpf.h new file mode 100644 index 0000000..d6c5a02 --- /dev/null +++ b/libbpf/include/uapi/linux/bpf.h @@ -0,0 +1,7144 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + */ +#ifndef _UAPI__LINUX_BPF_H__ +#define _UAPI__LINUX_BPF_H__ + +#include +#include + +/* Extended instruction set based on top of classic BPF */ + +/* instruction classes */ +#define BPF_JMP32 0x06 /* jmp mode in word width */ +#define BPF_ALU64 0x07 /* alu mode in double word width */ + +/* ld/ldx fields */ +#define BPF_DW 0x18 /* double word (64-bit) */ +#define BPF_ATOMIC 0xc0 /* atomic memory ops - op type in immediate */ +#define BPF_XADD 0xc0 /* exclusive add - legacy name */ + +/* alu/jmp fields */ +#define BPF_MOV 0xb0 /* mov reg to reg */ +#define BPF_ARSH 0xc0 /* sign extending arithmetic shift right */ + +/* change endianness of a register */ +#define BPF_END 0xd0 /* flags for endianness conversion: */ +#define BPF_TO_LE 0x00 /* convert to little-endian */ +#define BPF_TO_BE 0x08 /* convert to big-endian */ +#define BPF_FROM_LE BPF_TO_LE +#define BPF_FROM_BE BPF_TO_BE + +/* jmp encodings */ +#define BPF_JNE 0x50 /* jump != */ +#define BPF_JLT 0xa0 /* LT is unsigned, '<' */ +#define BPF_JLE 0xb0 /* LE is unsigned, '<=' */ +#define BPF_JSGT 0x60 /* SGT is signed '>', GT in x86 */ +#define BPF_JSGE 0x70 /* SGE is signed '>=', GE in x86 */ +#define BPF_JSLT 0xc0 /* SLT is signed, '<' */ +#define BPF_JSLE 0xd0 /* SLE is signed, '<=' */ +#define BPF_CALL 0x80 /* function call */ +#define BPF_EXIT 0x90 /* function return */ + +/* atomic op type fields (stored in immediate) */ +#define BPF_FETCH 0x01 /* not an opcode on its own, used to build others */ +#define BPF_XCHG (0xe0 | BPF_FETCH) /* atomic exchange */ +#define BPF_CMPXCHG (0xf0 | BPF_FETCH) /* atomic compare-and-write */ + +/* Register numbers */ +enum { + BPF_REG_0 = 0, + BPF_REG_1, + BPF_REG_2, + BPF_REG_3, + BPF_REG_4, + BPF_REG_5, + BPF_REG_6, + BPF_REG_7, + BPF_REG_8, + BPF_REG_9, + BPF_REG_10, + __MAX_BPF_REG, +}; + +/* BPF has 10 general purpose 64-bit registers and stack frame. */ +#define MAX_BPF_REG __MAX_BPF_REG + +struct bpf_insn { + __u8 code; /* opcode */ + __u8 dst_reg:4; /* dest register */ + __u8 src_reg:4; /* source register */ + __s16 off; /* signed offset */ + __s32 imm; /* signed immediate constant */ +}; + +/* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */ +struct bpf_lpm_trie_key { + __u32 prefixlen; /* up to 32 for AF_INET, 128 for AF_INET6 */ + __u8 data[0]; /* Arbitrary size */ +}; + +struct bpf_cgroup_storage_key { + __u64 cgroup_inode_id; /* cgroup inode id */ + __u32 attach_type; /* program attach type (enum bpf_attach_type) */ +}; + +enum bpf_cgroup_iter_order { + BPF_CGROUP_ITER_ORDER_UNSPEC = 0, + BPF_CGROUP_ITER_SELF_ONLY, /* process only a single object. */ + BPF_CGROUP_ITER_DESCENDANTS_PRE, /* walk descendants in pre-order. */ + BPF_CGROUP_ITER_DESCENDANTS_POST, /* walk descendants in post-order. */ + BPF_CGROUP_ITER_ANCESTORS_UP, /* walk ancestors upward. */ +}; + +union bpf_iter_link_info { + struct { + __u32 map_fd; + } map; + struct { + enum bpf_cgroup_iter_order order; + + /* At most one of cgroup_fd and cgroup_id can be non-zero. If + * both are zero, the walk starts from the default cgroup v2 + * root. For walking v1 hierarchy, one should always explicitly + * specify cgroup_fd. + */ + __u32 cgroup_fd; + __u64 cgroup_id; + } cgroup; + /* Parameters of task iterators. */ + struct { + __u32 tid; + __u32 pid; + __u32 pid_fd; + } task; +}; + +/* BPF syscall commands, see bpf(2) man-page for more details. */ +/** + * DOC: eBPF Syscall Preamble + * + * The operation to be performed by the **bpf**\ () system call is determined + * by the *cmd* argument. Each operation takes an accompanying argument, + * provided via *attr*, which is a pointer to a union of type *bpf_attr* (see + * below). The size argument is the size of the union pointed to by *attr*. + */ +/** + * DOC: eBPF Syscall Commands + * + * BPF_MAP_CREATE + * Description + * Create a map and return a file descriptor that refers to the + * map. The close-on-exec file descriptor flag (see **fcntl**\ (2)) + * is automatically enabled for the new file descriptor. + * + * Applying **close**\ (2) to the file descriptor returned by + * **BPF_MAP_CREATE** will delete the map (but see NOTES). + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_MAP_LOOKUP_ELEM + * Description + * Look up an element with a given *key* in the map referred to + * by the file descriptor *map_fd*. + * + * The *flags* argument may be specified as one of the + * following: + * + * **BPF_F_LOCK** + * Look up the value of a spin-locked map without + * returning the lock. This must be specified if the + * elements contain a spinlock. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_UPDATE_ELEM + * Description + * Create or update an element (key/value pair) in a specified map. + * + * The *flags* argument should be specified as one of the + * following: + * + * **BPF_ANY** + * Create a new element or update an existing element. + * **BPF_NOEXIST** + * Create a new element only if it did not exist. + * **BPF_EXIST** + * Update an existing element. + * **BPF_F_LOCK** + * Update a spin_lock-ed map element. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * May set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, + * **E2BIG**, **EEXIST**, or **ENOENT**. + * + * **E2BIG** + * The number of elements in the map reached the + * *max_entries* limit specified at map creation time. + * **EEXIST** + * If *flags* specifies **BPF_NOEXIST** and the element + * with *key* already exists in the map. + * **ENOENT** + * If *flags* specifies **BPF_EXIST** and the element with + * *key* does not exist in the map. + * + * BPF_MAP_DELETE_ELEM + * Description + * Look up and delete an element by key in a specified map. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_GET_NEXT_KEY + * Description + * Look up an element by key in a specified map and return the key + * of the next element. Can be used to iterate over all elements + * in the map. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * The following cases can be used to iterate over all elements of + * the map: + * + * * If *key* is not found, the operation returns zero and sets + * the *next_key* pointer to the key of the first element. + * * If *key* is found, the operation returns zero and sets the + * *next_key* pointer to the key of the next element. + * * If *key* is the last element, returns -1 and *errno* is set + * to **ENOENT**. + * + * May set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or + * **EINVAL** on error. + * + * BPF_PROG_LOAD + * Description + * Verify and load an eBPF program, returning a new file + * descriptor associated with the program. + * + * Applying **close**\ (2) to the file descriptor returned by + * **BPF_PROG_LOAD** will unload the eBPF program (but see NOTES). + * + * The close-on-exec file descriptor flag (see **fcntl**\ (2)) is + * automatically enabled for the new file descriptor. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_OBJ_PIN + * Description + * Pin an eBPF program or map referred by the specified *bpf_fd* + * to the provided *pathname* on the filesystem. + * + * The *pathname* argument must not contain a dot ("."). + * + * On success, *pathname* retains a reference to the eBPF object, + * preventing deallocation of the object when the original + * *bpf_fd* is closed. This allow the eBPF object to live beyond + * **close**\ (\ *bpf_fd*\ ), and hence the lifetime of the parent + * process. + * + * Applying **unlink**\ (2) or similar calls to the *pathname* + * unpins the object from the filesystem, removing the reference. + * If no other file descriptors or filesystem nodes refer to the + * same object, it will be deallocated (see NOTES). + * + * The filesystem type for the parent directory of *pathname* must + * be **BPF_FS_MAGIC**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_OBJ_GET + * Description + * Open a file descriptor for the eBPF object pinned to the + * specified *pathname*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_PROG_ATTACH + * Description + * Attach an eBPF program to a *target_fd* at the specified + * *attach_type* hook. + * + * The *attach_type* specifies the eBPF attachment point to + * attach the program to, and must be one of *bpf_attach_type* + * (see below). + * + * The *attach_bpf_fd* must be a valid file descriptor for a + * loaded eBPF program of a cgroup, flow dissector, LIRC, sockmap + * or sock_ops type corresponding to the specified *attach_type*. + * + * The *target_fd* must be a valid file descriptor for a kernel + * object which depends on the attach type of *attach_bpf_fd*: + * + * **BPF_PROG_TYPE_CGROUP_DEVICE**, + * **BPF_PROG_TYPE_CGROUP_SKB**, + * **BPF_PROG_TYPE_CGROUP_SOCK**, + * **BPF_PROG_TYPE_CGROUP_SOCK_ADDR**, + * **BPF_PROG_TYPE_CGROUP_SOCKOPT**, + * **BPF_PROG_TYPE_CGROUP_SYSCTL**, + * **BPF_PROG_TYPE_SOCK_OPS** + * + * Control Group v2 hierarchy with the eBPF controller + * enabled. Requires the kernel to be compiled with + * **CONFIG_CGROUP_BPF**. + * + * **BPF_PROG_TYPE_FLOW_DISSECTOR** + * + * Network namespace (eg /proc/self/ns/net). + * + * **BPF_PROG_TYPE_LIRC_MODE2** + * + * LIRC device path (eg /dev/lircN). Requires the kernel + * to be compiled with **CONFIG_BPF_LIRC_MODE2**. + * + * **BPF_PROG_TYPE_SK_SKB**, + * **BPF_PROG_TYPE_SK_MSG** + * + * eBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**). + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_DETACH + * Description + * Detach the eBPF program associated with the *target_fd* at the + * hook specified by *attach_type*. The program must have been + * previously attached using **BPF_PROG_ATTACH**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_TEST_RUN + * Description + * Run the eBPF program associated with the *prog_fd* a *repeat* + * number of times against a provided program context *ctx_in* and + * data *data_in*, and return the modified program context + * *ctx_out*, *data_out* (for example, packet data), result of the + * execution *retval*, and *duration* of the test run. + * + * The sizes of the buffers provided as input and output + * parameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must + * be provided in the corresponding variables *ctx_size_in*, + * *ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any + * of these parameters are not provided (ie set to NULL), the + * corresponding size field must be zero. + * + * Some program types have particular requirements: + * + * **BPF_PROG_TYPE_SK_LOOKUP** + * *data_in* and *data_out* must be NULL. + * + * **BPF_PROG_TYPE_RAW_TRACEPOINT**, + * **BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE** + * + * *ctx_out*, *data_in* and *data_out* must be NULL. + * *repeat* must be zero. + * + * BPF_PROG_RUN is an alias for BPF_PROG_TEST_RUN. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * **ENOSPC** + * Either *data_size_out* or *ctx_size_out* is too small. + * **ENOTSUPP** + * This command is not supported by the program type of + * the program referred to by *prog_fd*. + * + * BPF_PROG_GET_NEXT_ID + * Description + * Fetch the next eBPF program currently loaded into the kernel. + * + * Looks for the eBPF program with an id greater than *start_id* + * and updates *next_id* on success. If no other eBPF programs + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_MAP_GET_NEXT_ID + * Description + * Fetch the next eBPF map currently loaded into the kernel. + * + * Looks for the eBPF map with an id greater than *start_id* + * and updates *next_id* on success. If no other eBPF maps + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_PROG_GET_FD_BY_ID + * Description + * Open a file descriptor for the eBPF program corresponding to + * *prog_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_MAP_GET_FD_BY_ID + * Description + * Open a file descriptor for the eBPF map corresponding to + * *map_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_OBJ_GET_INFO_BY_FD + * Description + * Obtain information about the eBPF object corresponding to + * *bpf_fd*. + * + * Populates up to *info_len* bytes of *info*, which will be in + * one of the following formats depending on the eBPF object type + * of *bpf_fd*: + * + * * **struct bpf_prog_info** + * * **struct bpf_map_info** + * * **struct bpf_btf_info** + * * **struct bpf_link_info** + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_QUERY + * Description + * Obtain information about eBPF programs associated with the + * specified *attach_type* hook. + * + * The *target_fd* must be a valid file descriptor for a kernel + * object which depends on the attach type of *attach_bpf_fd*: + * + * **BPF_PROG_TYPE_CGROUP_DEVICE**, + * **BPF_PROG_TYPE_CGROUP_SKB**, + * **BPF_PROG_TYPE_CGROUP_SOCK**, + * **BPF_PROG_TYPE_CGROUP_SOCK_ADDR**, + * **BPF_PROG_TYPE_CGROUP_SOCKOPT**, + * **BPF_PROG_TYPE_CGROUP_SYSCTL**, + * **BPF_PROG_TYPE_SOCK_OPS** + * + * Control Group v2 hierarchy with the eBPF controller + * enabled. Requires the kernel to be compiled with + * **CONFIG_CGROUP_BPF**. + * + * **BPF_PROG_TYPE_FLOW_DISSECTOR** + * + * Network namespace (eg /proc/self/ns/net). + * + * **BPF_PROG_TYPE_LIRC_MODE2** + * + * LIRC device path (eg /dev/lircN). Requires the kernel + * to be compiled with **CONFIG_BPF_LIRC_MODE2**. + * + * **BPF_PROG_QUERY** always fetches the number of programs + * attached and the *attach_flags* which were used to attach those + * programs. Additionally, if *prog_ids* is nonzero and the number + * of attached programs is less than *prog_cnt*, populates + * *prog_ids* with the eBPF program ids of the programs attached + * at *target_fd*. + * + * The following flags may alter the result: + * + * **BPF_F_QUERY_EFFECTIVE** + * Only return information regarding programs which are + * currently effective at the specified *target_fd*. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_RAW_TRACEPOINT_OPEN + * Description + * Attach an eBPF program to a tracepoint *name* to access kernel + * internal arguments of the tracepoint in their raw form. + * + * The *prog_fd* must be a valid file descriptor associated with + * a loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**. + * + * No ABI guarantees are made about the content of tracepoint + * arguments exposed to the corresponding eBPF program. + * + * Applying **close**\ (2) to the file descriptor returned by + * **BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES). + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_BTF_LOAD + * Description + * Verify and load BPF Type Format (BTF) metadata into the kernel, + * returning a new file descriptor associated with the metadata. + * BTF is described in more detail at + * https://www.kernel.org/doc/html/latest/bpf/btf.html. + * + * The *btf* parameter must point to valid memory providing + * *btf_size* bytes of BTF binary metadata. + * + * The returned file descriptor can be passed to other **bpf**\ () + * subcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to + * associate the BTF with those objects. + * + * Similar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional + * parameters to specify a *btf_log_buf*, *btf_log_size* and + * *btf_log_level* which allow the kernel to return freeform log + * output regarding the BTF verification process. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_BTF_GET_FD_BY_ID + * Description + * Open a file descriptor for the BPF Type Format (BTF) + * corresponding to *btf_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_TASK_FD_QUERY + * Description + * Obtain information about eBPF programs associated with the + * target process identified by *pid* and *fd*. + * + * If the *pid* and *fd* are associated with a tracepoint, kprobe + * or uprobe perf event, then the *prog_id* and *fd_type* will + * be populated with the eBPF program id and file descriptor type + * of type **bpf_task_fd_type**. If associated with a kprobe or + * uprobe, the *probe_offset* and *probe_addr* will also be + * populated. Optionally, if *buf* is provided, then up to + * *buf_len* bytes of *buf* will be populated with the name of + * the tracepoint, kprobe or uprobe. + * + * The resulting *prog_id* may be introspected in deeper detail + * using **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_LOOKUP_AND_DELETE_ELEM + * Description + * Look up an element with the given *key* in the map referred to + * by the file descriptor *fd*, and if found, delete the element. + * + * For **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map + * types, the *flags* argument needs to be set to 0, but for other + * map types, it may be specified as: + * + * **BPF_F_LOCK** + * Look up and delete the value of a spin-locked map + * without returning the lock. This must be specified if + * the elements contain a spinlock. + * + * The **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types + * implement this command as a "pop" operation, deleting the top + * element rather than one corresponding to *key*. + * The *key* and *key_len* parameters should be zeroed when + * issuing this operation for these map types. + * + * This command is only valid for the following map types: + * * **BPF_MAP_TYPE_QUEUE** + * * **BPF_MAP_TYPE_STACK** + * * **BPF_MAP_TYPE_HASH** + * * **BPF_MAP_TYPE_PERCPU_HASH** + * * **BPF_MAP_TYPE_LRU_HASH** + * * **BPF_MAP_TYPE_LRU_PERCPU_HASH** + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_FREEZE + * Description + * Freeze the permissions of the specified map. + * + * Write permissions may be frozen by passing zero *flags*. + * Upon success, no future syscall invocations may alter the + * map state of *map_fd*. Write operations from eBPF programs + * are still possible for a frozen map. + * + * Not supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_BTF_GET_NEXT_ID + * Description + * Fetch the next BPF Type Format (BTF) object currently loaded + * into the kernel. + * + * Looks for the BTF object with an id greater than *start_id* + * and updates *next_id* on success. If no other BTF objects + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_MAP_LOOKUP_BATCH + * Description + * Iterate and fetch multiple elements in a map. + * + * Two opaque values are used to manage batch operations, + * *in_batch* and *out_batch*. Initially, *in_batch* must be set + * to NULL to begin the batched operation. After each subsequent + * **BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant + * *out_batch* as the *in_batch* for the next operation to + * continue iteration from the current point. + * + * The *keys* and *values* are output parameters which must point + * to memory large enough to hold *count* items based on the key + * and value size of the map *map_fd*. The *keys* buffer must be + * of *key_size* * *count*. The *values* buffer must be of + * *value_size* * *count*. + * + * The *elem_flags* argument may be specified as one of the + * following: + * + * **BPF_F_LOCK** + * Look up the value of a spin-locked map without + * returning the lock. This must be specified if the + * elements contain a spinlock. + * + * On success, *count* elements from the map are copied into the + * user buffer, with the keys copied into *keys* and the values + * copied into the corresponding indices in *values*. + * + * If an error is returned and *errno* is not **EFAULT**, *count* + * is set to the number of successfully processed elements. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * May set *errno* to **ENOSPC** to indicate that *keys* or + * *values* is too small to dump an entire bucket during + * iteration of a hash-based map type. + * + * BPF_MAP_LOOKUP_AND_DELETE_BATCH + * Description + * Iterate and delete all elements in a map. + * + * This operation has the same behavior as + * **BPF_MAP_LOOKUP_BATCH** with two exceptions: + * + * * Every element that is successfully returned is also deleted + * from the map. This is at least *count* elements. Note that + * *count* is both an input and an output parameter. + * * Upon returning with *errno* set to **EFAULT**, up to + * *count* elements may be deleted without returning the keys + * and values of the deleted elements. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_MAP_UPDATE_BATCH + * Description + * Update multiple elements in a map by *key*. + * + * The *keys* and *values* are input parameters which must point + * to memory large enough to hold *count* items based on the key + * and value size of the map *map_fd*. The *keys* buffer must be + * of *key_size* * *count*. The *values* buffer must be of + * *value_size* * *count*. + * + * Each element specified in *keys* is sequentially updated to the + * value in the corresponding index in *values*. The *in_batch* + * and *out_batch* parameters are ignored and should be zeroed. + * + * The *elem_flags* argument should be specified as one of the + * following: + * + * **BPF_ANY** + * Create new elements or update a existing elements. + * **BPF_NOEXIST** + * Create new elements only if they do not exist. + * **BPF_EXIST** + * Update existing elements. + * **BPF_F_LOCK** + * Update spin_lock-ed map elements. This must be + * specified if the map value contains a spinlock. + * + * On success, *count* elements from the map are updated. + * + * If an error is returned and *errno* is not **EFAULT**, *count* + * is set to the number of successfully processed elements. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * May set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or + * **E2BIG**. **E2BIG** indicates that the number of elements in + * the map reached the *max_entries* limit specified at map + * creation time. + * + * May set *errno* to one of the following error codes under + * specific circumstances: + * + * **EEXIST** + * If *flags* specifies **BPF_NOEXIST** and the element + * with *key* already exists in the map. + * **ENOENT** + * If *flags* specifies **BPF_EXIST** and the element with + * *key* does not exist in the map. + * + * BPF_MAP_DELETE_BATCH + * Description + * Delete multiple elements in a map by *key*. + * + * The *keys* parameter is an input parameter which must point + * to memory large enough to hold *count* items based on the key + * size of the map *map_fd*, that is, *key_size* * *count*. + * + * Each element specified in *keys* is sequentially deleted. The + * *in_batch*, *out_batch*, and *values* parameters are ignored + * and should be zeroed. + * + * The *elem_flags* argument may be specified as one of the + * following: + * + * **BPF_F_LOCK** + * Look up the value of a spin-locked map without + * returning the lock. This must be specified if the + * elements contain a spinlock. + * + * On success, *count* elements from the map are updated. + * + * If an error is returned and *errno* is not **EFAULT**, *count* + * is set to the number of successfully processed elements. If + * *errno* is **EFAULT**, up to *count* elements may be been + * deleted. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_LINK_CREATE + * Description + * Attach an eBPF program to a *target_fd* at the specified + * *attach_type* hook and return a file descriptor handle for + * managing the link. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_LINK_UPDATE + * Description + * Update the eBPF program in the specified *link_fd* to + * *new_prog_fd*. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_LINK_GET_FD_BY_ID + * Description + * Open a file descriptor for the eBPF Link corresponding to + * *link_id*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_LINK_GET_NEXT_ID + * Description + * Fetch the next eBPF link currently loaded into the kernel. + * + * Looks for the eBPF link with an id greater than *start_id* + * and updates *next_id* on success. If no other eBPF links + * remain with ids higher than *start_id*, returns -1 and sets + * *errno* to **ENOENT**. + * + * Return + * Returns zero on success. On error, or when no id remains, -1 + * is returned and *errno* is set appropriately. + * + * BPF_ENABLE_STATS + * Description + * Enable eBPF runtime statistics gathering. + * + * Runtime statistics gathering for the eBPF runtime is disabled + * by default to minimize the corresponding performance overhead. + * This command enables statistics globally. + * + * Multiple programs may independently enable statistics. + * After gathering the desired statistics, eBPF runtime statistics + * may be disabled again by calling **close**\ (2) for the file + * descriptor returned by this function. Statistics will only be + * disabled system-wide when all outstanding file descriptors + * returned by prior calls for this subcommand are closed. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_ITER_CREATE + * Description + * Create an iterator on top of the specified *link_fd* (as + * previously created using **BPF_LINK_CREATE**) and return a + * file descriptor that can be used to trigger the iteration. + * + * If the resulting file descriptor is pinned to the filesystem + * using **BPF_OBJ_PIN**, then subsequent **read**\ (2) syscalls + * for that path will trigger the iterator to read kernel state + * using the eBPF program attached to *link_fd*. + * + * Return + * A new file descriptor (a nonnegative integer), or -1 if an + * error occurred (in which case, *errno* is set appropriately). + * + * BPF_LINK_DETACH + * Description + * Forcefully detach the specified *link_fd* from its + * corresponding attachment point. + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * BPF_PROG_BIND_MAP + * Description + * Bind a map to the lifetime of an eBPF program. + * + * The map identified by *map_fd* is bound to the program + * identified by *prog_fd* and only released when *prog_fd* is + * released. This may be used in cases where metadata should be + * associated with a program which otherwise does not contain any + * references to the map (for example, embedded in the eBPF + * program instructions). + * + * Return + * Returns zero on success. On error, -1 is returned and *errno* + * is set appropriately. + * + * NOTES + * eBPF objects (maps and programs) can be shared between processes. + * + * * After **fork**\ (2), the child inherits file descriptors + * referring to the same eBPF objects. + * * File descriptors referring to eBPF objects can be transferred over + * **unix**\ (7) domain sockets. + * * File descriptors referring to eBPF objects can be duplicated in the + * usual way, using **dup**\ (2) and similar calls. + * * File descriptors referring to eBPF objects can be pinned to the + * filesystem using the **BPF_OBJ_PIN** command of **bpf**\ (2). + * + * An eBPF object is deallocated only after all file descriptors referring + * to the object have been closed and no references remain pinned to the + * filesystem or attached (for example, bound to a program or device). + */ +enum bpf_cmd { + BPF_MAP_CREATE, + BPF_MAP_LOOKUP_ELEM, + BPF_MAP_UPDATE_ELEM, + BPF_MAP_DELETE_ELEM, + BPF_MAP_GET_NEXT_KEY, + BPF_PROG_LOAD, + BPF_OBJ_PIN, + BPF_OBJ_GET, + BPF_PROG_ATTACH, + BPF_PROG_DETACH, + BPF_PROG_TEST_RUN, + BPF_PROG_RUN = BPF_PROG_TEST_RUN, + BPF_PROG_GET_NEXT_ID, + BPF_MAP_GET_NEXT_ID, + BPF_PROG_GET_FD_BY_ID, + BPF_MAP_GET_FD_BY_ID, + BPF_OBJ_GET_INFO_BY_FD, + BPF_PROG_QUERY, + BPF_RAW_TRACEPOINT_OPEN, + BPF_BTF_LOAD, + BPF_BTF_GET_FD_BY_ID, + BPF_TASK_FD_QUERY, + BPF_MAP_LOOKUP_AND_DELETE_ELEM, + BPF_MAP_FREEZE, + BPF_BTF_GET_NEXT_ID, + BPF_MAP_LOOKUP_BATCH, + BPF_MAP_LOOKUP_AND_DELETE_BATCH, + BPF_MAP_UPDATE_BATCH, + BPF_MAP_DELETE_BATCH, + BPF_LINK_CREATE, + BPF_LINK_UPDATE, + BPF_LINK_GET_FD_BY_ID, + BPF_LINK_GET_NEXT_ID, + BPF_ENABLE_STATS, + BPF_ITER_CREATE, + BPF_LINK_DETACH, + BPF_PROG_BIND_MAP, +}; + +enum bpf_map_type { + BPF_MAP_TYPE_UNSPEC, + BPF_MAP_TYPE_HASH, + BPF_MAP_TYPE_ARRAY, + BPF_MAP_TYPE_PROG_ARRAY, + BPF_MAP_TYPE_PERF_EVENT_ARRAY, + BPF_MAP_TYPE_PERCPU_HASH, + BPF_MAP_TYPE_PERCPU_ARRAY, + BPF_MAP_TYPE_STACK_TRACE, + BPF_MAP_TYPE_CGROUP_ARRAY, + BPF_MAP_TYPE_LRU_HASH, + BPF_MAP_TYPE_LRU_PERCPU_HASH, + BPF_MAP_TYPE_LPM_TRIE, + BPF_MAP_TYPE_ARRAY_OF_MAPS, + BPF_MAP_TYPE_HASH_OF_MAPS, + BPF_MAP_TYPE_DEVMAP, + BPF_MAP_TYPE_SOCKMAP, + BPF_MAP_TYPE_CPUMAP, + BPF_MAP_TYPE_XSKMAP, + BPF_MAP_TYPE_SOCKHASH, + BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED, + /* BPF_MAP_TYPE_CGROUP_STORAGE is available to bpf programs attaching + * to a cgroup. The newer BPF_MAP_TYPE_CGRP_STORAGE is available to + * both cgroup-attached and other progs and supports all functionality + * provided by BPF_MAP_TYPE_CGROUP_STORAGE. So mark + * BPF_MAP_TYPE_CGROUP_STORAGE deprecated. + */ + BPF_MAP_TYPE_CGROUP_STORAGE = BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED, + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE, + BPF_MAP_TYPE_QUEUE, + BPF_MAP_TYPE_STACK, + BPF_MAP_TYPE_SK_STORAGE, + BPF_MAP_TYPE_DEVMAP_HASH, + BPF_MAP_TYPE_STRUCT_OPS, + BPF_MAP_TYPE_RINGBUF, + BPF_MAP_TYPE_INODE_STORAGE, + BPF_MAP_TYPE_TASK_STORAGE, + BPF_MAP_TYPE_BLOOM_FILTER, + BPF_MAP_TYPE_USER_RINGBUF, + BPF_MAP_TYPE_CGRP_STORAGE, +}; + +/* Note that tracing related programs such as + * BPF_PROG_TYPE_{KPROBE,TRACEPOINT,PERF_EVENT,RAW_TRACEPOINT} + * are not subject to a stable API since kernel internal data + * structures can change from release to release and may + * therefore break existing tracing BPF programs. Tracing BPF + * programs correspond to /a/ specific kernel which is to be + * analyzed, and not /a/ specific kernel /and/ all future ones. + */ +enum bpf_prog_type { + BPF_PROG_TYPE_UNSPEC, + BPF_PROG_TYPE_SOCKET_FILTER, + BPF_PROG_TYPE_KPROBE, + BPF_PROG_TYPE_SCHED_CLS, + BPF_PROG_TYPE_SCHED_ACT, + BPF_PROG_TYPE_TRACEPOINT, + BPF_PROG_TYPE_XDP, + BPF_PROG_TYPE_PERF_EVENT, + BPF_PROG_TYPE_CGROUP_SKB, + BPF_PROG_TYPE_CGROUP_SOCK, + BPF_PROG_TYPE_LWT_IN, + BPF_PROG_TYPE_LWT_OUT, + BPF_PROG_TYPE_LWT_XMIT, + BPF_PROG_TYPE_SOCK_OPS, + BPF_PROG_TYPE_SK_SKB, + BPF_PROG_TYPE_CGROUP_DEVICE, + BPF_PROG_TYPE_SK_MSG, + BPF_PROG_TYPE_RAW_TRACEPOINT, + BPF_PROG_TYPE_CGROUP_SOCK_ADDR, + BPF_PROG_TYPE_LWT_SEG6LOCAL, + BPF_PROG_TYPE_LIRC_MODE2, + BPF_PROG_TYPE_SK_REUSEPORT, + BPF_PROG_TYPE_FLOW_DISSECTOR, + BPF_PROG_TYPE_CGROUP_SYSCTL, + BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, + BPF_PROG_TYPE_CGROUP_SOCKOPT, + BPF_PROG_TYPE_TRACING, + BPF_PROG_TYPE_STRUCT_OPS, + BPF_PROG_TYPE_EXT, + BPF_PROG_TYPE_LSM, + BPF_PROG_TYPE_SK_LOOKUP, + BPF_PROG_TYPE_SYSCALL, /* a program that can execute syscalls */ +}; + +enum bpf_attach_type { + BPF_CGROUP_INET_INGRESS, + BPF_CGROUP_INET_EGRESS, + BPF_CGROUP_INET_SOCK_CREATE, + BPF_CGROUP_SOCK_OPS, + BPF_SK_SKB_STREAM_PARSER, + BPF_SK_SKB_STREAM_VERDICT, + BPF_CGROUP_DEVICE, + BPF_SK_MSG_VERDICT, + BPF_CGROUP_INET4_BIND, + BPF_CGROUP_INET6_BIND, + BPF_CGROUP_INET4_CONNECT, + BPF_CGROUP_INET6_CONNECT, + BPF_CGROUP_INET4_POST_BIND, + BPF_CGROUP_INET6_POST_BIND, + BPF_CGROUP_UDP4_SENDMSG, + BPF_CGROUP_UDP6_SENDMSG, + BPF_LIRC_MODE2, + BPF_FLOW_DISSECTOR, + BPF_CGROUP_SYSCTL, + BPF_CGROUP_UDP4_RECVMSG, + BPF_CGROUP_UDP6_RECVMSG, + BPF_CGROUP_GETSOCKOPT, + BPF_CGROUP_SETSOCKOPT, + BPF_TRACE_RAW_TP, + BPF_TRACE_FENTRY, + BPF_TRACE_FEXIT, + BPF_MODIFY_RETURN, + BPF_LSM_MAC, + BPF_TRACE_ITER, + BPF_CGROUP_INET4_GETPEERNAME, + BPF_CGROUP_INET6_GETPEERNAME, + BPF_CGROUP_INET4_GETSOCKNAME, + BPF_CGROUP_INET6_GETSOCKNAME, + BPF_XDP_DEVMAP, + BPF_CGROUP_INET_SOCK_RELEASE, + BPF_XDP_CPUMAP, + BPF_SK_LOOKUP, + BPF_XDP, + BPF_SK_SKB_VERDICT, + BPF_SK_REUSEPORT_SELECT, + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE, + BPF_PERF_EVENT, + BPF_TRACE_KPROBE_MULTI, + BPF_LSM_CGROUP, + BPF_STRUCT_OPS, + __MAX_BPF_ATTACH_TYPE +}; + +#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE + +enum bpf_link_type { + BPF_LINK_TYPE_UNSPEC = 0, + BPF_LINK_TYPE_RAW_TRACEPOINT = 1, + BPF_LINK_TYPE_TRACING = 2, + BPF_LINK_TYPE_CGROUP = 3, + BPF_LINK_TYPE_ITER = 4, + BPF_LINK_TYPE_NETNS = 5, + BPF_LINK_TYPE_XDP = 6, + BPF_LINK_TYPE_PERF_EVENT = 7, + BPF_LINK_TYPE_KPROBE_MULTI = 8, + BPF_LINK_TYPE_STRUCT_OPS = 9, + + MAX_BPF_LINK_TYPE, +}; + +/* cgroup-bpf attach flags used in BPF_PROG_ATTACH command + * + * NONE(default): No further bpf programs allowed in the subtree. + * + * BPF_F_ALLOW_OVERRIDE: If a sub-cgroup installs some bpf program, + * the program in this cgroup yields to sub-cgroup program. + * + * BPF_F_ALLOW_MULTI: If a sub-cgroup installs some bpf program, + * that cgroup program gets run in addition to the program in this cgroup. + * + * Only one program is allowed to be attached to a cgroup with + * NONE or BPF_F_ALLOW_OVERRIDE flag. + * Attaching another program on top of NONE or BPF_F_ALLOW_OVERRIDE will + * release old program and attach the new one. Attach flags has to match. + * + * Multiple programs are allowed to be attached to a cgroup with + * BPF_F_ALLOW_MULTI flag. They are executed in FIFO order + * (those that were attached first, run first) + * The programs of sub-cgroup are executed first, then programs of + * this cgroup and then programs of parent cgroup. + * When children program makes decision (like picking TCP CA or sock bind) + * parent program has a chance to override it. + * + * With BPF_F_ALLOW_MULTI a new program is added to the end of the list of + * programs for a cgroup. Though it's possible to replace an old program at + * any position by also specifying BPF_F_REPLACE flag and position itself in + * replace_bpf_fd attribute. Old program at this position will be released. + * + * A cgroup with MULTI or OVERRIDE flag allows any attach flags in sub-cgroups. + * A cgroup with NONE doesn't allow any programs in sub-cgroups. + * Ex1: + * cgrp1 (MULTI progs A, B) -> + * cgrp2 (OVERRIDE prog C) -> + * cgrp3 (MULTI prog D) -> + * cgrp4 (OVERRIDE prog E) -> + * cgrp5 (NONE prog F) + * the event in cgrp5 triggers execution of F,D,A,B in that order. + * if prog F is detached, the execution is E,D,A,B + * if prog F and D are detached, the execution is E,A,B + * if prog F, E and D are detached, the execution is C,A,B + * + * All eligible programs are executed regardless of return code from + * earlier programs. + */ +#define BPF_F_ALLOW_OVERRIDE (1U << 0) +#define BPF_F_ALLOW_MULTI (1U << 1) +#define BPF_F_REPLACE (1U << 2) + +/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the + * verifier will perform strict alignment checking as if the kernel + * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set, + * and NET_IP_ALIGN defined to 2. + */ +#define BPF_F_STRICT_ALIGNMENT (1U << 0) + +/* If BPF_F_ANY_ALIGNMENT is used in BPF_PROG_LOAD command, the + * verifier will allow any alignment whatsoever. On platforms + * with strict alignment requirements for loads ands stores (such + * as sparc and mips) the verifier validates that all loads and + * stores provably follow this requirement. This flag turns that + * checking and enforcement off. + * + * It is mostly used for testing when we want to validate the + * context and memory access aspects of the verifier, but because + * of an unaligned access the alignment check would trigger before + * the one we are interested in. + */ +#define BPF_F_ANY_ALIGNMENT (1U << 1) + +/* BPF_F_TEST_RND_HI32 is used in BPF_PROG_LOAD command for testing purpose. + * Verifier does sub-register def/use analysis and identifies instructions whose + * def only matters for low 32-bit, high 32-bit is never referenced later + * through implicit zero extension. Therefore verifier notifies JIT back-ends + * that it is safe to ignore clearing high 32-bit for these instructions. This + * saves some back-ends a lot of code-gen. However such optimization is not + * necessary on some arches, for example x86_64, arm64 etc, whose JIT back-ends + * hence hasn't used verifier's analysis result. But, we really want to have a + * way to be able to verify the correctness of the described optimization on + * x86_64 on which testsuites are frequently exercised. + * + * So, this flag is introduced. Once it is set, verifier will randomize high + * 32-bit for those instructions who has been identified as safe to ignore them. + * Then, if verifier is not doing correct analysis, such randomization will + * regress tests to expose bugs. + */ +#define BPF_F_TEST_RND_HI32 (1U << 2) + +/* The verifier internal test flag. Behavior is undefined */ +#define BPF_F_TEST_STATE_FREQ (1U << 3) + +/* If BPF_F_SLEEPABLE is used in BPF_PROG_LOAD command, the verifier will + * restrict map and helper usage for such programs. Sleepable BPF programs can + * only be attached to hooks where kernel execution context allows sleeping. + * Such programs are allowed to use helpers that may sleep like + * bpf_copy_from_user(). + */ +#define BPF_F_SLEEPABLE (1U << 4) + +/* If BPF_F_XDP_HAS_FRAGS is used in BPF_PROG_LOAD command, the loaded program + * fully support xdp frags. + */ +#define BPF_F_XDP_HAS_FRAGS (1U << 5) + +/* If BPF_F_XDP_DEV_BOUND_ONLY is used in BPF_PROG_LOAD command, the loaded + * program becomes device-bound but can access XDP metadata. + */ +#define BPF_F_XDP_DEV_BOUND_ONLY (1U << 6) + +/* link_create.kprobe_multi.flags used in LINK_CREATE command for + * BPF_TRACE_KPROBE_MULTI attach type to create return probe. + */ +#define BPF_F_KPROBE_MULTI_RETURN (1U << 0) + +/* When BPF ldimm64's insn[0].src_reg != 0 then this can have + * the following extensions: + * + * insn[0].src_reg: BPF_PSEUDO_MAP_[FD|IDX] + * insn[0].imm: map fd or fd_idx + * insn[1].imm: 0 + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of map + * verifier type: CONST_PTR_TO_MAP + */ +#define BPF_PSEUDO_MAP_FD 1 +#define BPF_PSEUDO_MAP_IDX 5 + +/* insn[0].src_reg: BPF_PSEUDO_MAP_[IDX_]VALUE + * insn[0].imm: map fd or fd_idx + * insn[1].imm: offset into value + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of map[0]+offset + * verifier type: PTR_TO_MAP_VALUE + */ +#define BPF_PSEUDO_MAP_VALUE 2 +#define BPF_PSEUDO_MAP_IDX_VALUE 6 + +/* insn[0].src_reg: BPF_PSEUDO_BTF_ID + * insn[0].imm: kernel btd id of VAR + * insn[1].imm: 0 + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of the kernel variable + * verifier type: PTR_TO_BTF_ID or PTR_TO_MEM, depending on whether the var + * is struct/union. + */ +#define BPF_PSEUDO_BTF_ID 3 +/* insn[0].src_reg: BPF_PSEUDO_FUNC + * insn[0].imm: insn offset to the func + * insn[1].imm: 0 + * insn[0].off: 0 + * insn[1].off: 0 + * ldimm64 rewrite: address of the function + * verifier type: PTR_TO_FUNC. + */ +#define BPF_PSEUDO_FUNC 4 + +/* when bpf_call->src_reg == BPF_PSEUDO_CALL, bpf_call->imm == pc-relative + * offset to another bpf function + */ +#define BPF_PSEUDO_CALL 1 +/* when bpf_call->src_reg == BPF_PSEUDO_KFUNC_CALL, + * bpf_call->imm == btf_id of a BTF_KIND_FUNC in the running kernel + */ +#define BPF_PSEUDO_KFUNC_CALL 2 + +/* flags for BPF_MAP_UPDATE_ELEM command */ +enum { + BPF_ANY = 0, /* create new element or update existing */ + BPF_NOEXIST = 1, /* create new element if it didn't exist */ + BPF_EXIST = 2, /* update existing element */ + BPF_F_LOCK = 4, /* spin_lock-ed map_lookup/map_update */ +}; + +/* flags for BPF_MAP_CREATE command */ +enum { + BPF_F_NO_PREALLOC = (1U << 0), +/* Instead of having one common LRU list in the + * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list + * which can scale and perform better. + * Note, the LRU nodes (including free nodes) cannot be moved + * across different LRU lists. + */ + BPF_F_NO_COMMON_LRU = (1U << 1), +/* Specify numa node during map creation */ + BPF_F_NUMA_NODE = (1U << 2), + +/* Flags for accessing BPF object from syscall side. */ + BPF_F_RDONLY = (1U << 3), + BPF_F_WRONLY = (1U << 4), + +/* Flag for stack_map, store build_id+offset instead of pointer */ + BPF_F_STACK_BUILD_ID = (1U << 5), + +/* Zero-initialize hash function seed. This should only be used for testing. */ + BPF_F_ZERO_SEED = (1U << 6), + +/* Flags for accessing BPF object from program side. */ + BPF_F_RDONLY_PROG = (1U << 7), + BPF_F_WRONLY_PROG = (1U << 8), + +/* Clone map from listener for newly accepted socket */ + BPF_F_CLONE = (1U << 9), + +/* Enable memory-mapping BPF map */ + BPF_F_MMAPABLE = (1U << 10), + +/* Share perf_event among processes */ + BPF_F_PRESERVE_ELEMS = (1U << 11), + +/* Create a map that is suitable to be an inner map with dynamic max entries */ + BPF_F_INNER_MAP = (1U << 12), + +/* Create a map that will be registered/unregesitered by the backed bpf_link */ + BPF_F_LINK = (1U << 13), +}; + +/* Flags for BPF_PROG_QUERY. */ + +/* Query effective (directly attached + inherited from ancestor cgroups) + * programs that will be executed for events within a cgroup. + * attach_flags with this flag are always returned 0. + */ +#define BPF_F_QUERY_EFFECTIVE (1U << 0) + +/* Flags for BPF_PROG_TEST_RUN */ + +/* If set, run the test on the cpu specified by bpf_attr.test.cpu */ +#define BPF_F_TEST_RUN_ON_CPU (1U << 0) +/* If set, XDP frames will be transmitted after processing */ +#define BPF_F_TEST_XDP_LIVE_FRAMES (1U << 1) + +/* type for BPF_ENABLE_STATS */ +enum bpf_stats_type { + /* enabled run_time_ns and run_cnt */ + BPF_STATS_RUN_TIME = 0, +}; + +enum bpf_stack_build_id_status { + /* user space need an empty entry to identify end of a trace */ + BPF_STACK_BUILD_ID_EMPTY = 0, + /* with valid build_id and offset */ + BPF_STACK_BUILD_ID_VALID = 1, + /* couldn't get build_id, fallback to ip */ + BPF_STACK_BUILD_ID_IP = 2, +}; + +#define BPF_BUILD_ID_SIZE 20 +struct bpf_stack_build_id { + __s32 status; + unsigned char build_id[BPF_BUILD_ID_SIZE]; + union { + __u64 offset; + __u64 ip; + }; +}; + +#define BPF_OBJ_NAME_LEN 16U + +union bpf_attr { + struct { /* anonymous struct used by BPF_MAP_CREATE command */ + __u32 map_type; /* one of enum bpf_map_type */ + __u32 key_size; /* size of key in bytes */ + __u32 value_size; /* size of value in bytes */ + __u32 max_entries; /* max number of entries in a map */ + __u32 map_flags; /* BPF_MAP_CREATE related + * flags defined above. + */ + __u32 inner_map_fd; /* fd pointing to the inner map */ + __u32 numa_node; /* numa node (effective only if + * BPF_F_NUMA_NODE is set). + */ + char map_name[BPF_OBJ_NAME_LEN]; + __u32 map_ifindex; /* ifindex of netdev to create on */ + __u32 btf_fd; /* fd pointing to a BTF type data */ + __u32 btf_key_type_id; /* BTF type_id of the key */ + __u32 btf_value_type_id; /* BTF type_id of the value */ + __u32 btf_vmlinux_value_type_id;/* BTF type_id of a kernel- + * struct stored as the + * map value + */ + /* Any per-map-type extra fields + * + * BPF_MAP_TYPE_BLOOM_FILTER - the lowest 4 bits indicate the + * number of hash functions (if 0, the bloom filter will default + * to using 5 hash functions). + */ + __u64 map_extra; + }; + + struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ + __u32 map_fd; + __aligned_u64 key; + union { + __aligned_u64 value; + __aligned_u64 next_key; + }; + __u64 flags; + }; + + struct { /* struct used by BPF_MAP_*_BATCH commands */ + __aligned_u64 in_batch; /* start batch, + * NULL to start from beginning + */ + __aligned_u64 out_batch; /* output: next start batch */ + __aligned_u64 keys; + __aligned_u64 values; + __u32 count; /* input/output: + * input: # of key/value + * elements + * output: # of filled elements + */ + __u32 map_fd; + __u64 elem_flags; + __u64 flags; + } batch; + + struct { /* anonymous struct used by BPF_PROG_LOAD command */ + __u32 prog_type; /* one of enum bpf_prog_type */ + __u32 insn_cnt; + __aligned_u64 insns; + __aligned_u64 license; + __u32 log_level; /* verbosity level of verifier */ + __u32 log_size; /* size of user buffer */ + __aligned_u64 log_buf; /* user supplied buffer */ + __u32 kern_version; /* not used */ + __u32 prog_flags; + char prog_name[BPF_OBJ_NAME_LEN]; + __u32 prog_ifindex; /* ifindex of netdev to prep for */ + /* For some prog types expected attach type must be known at + * load time to verify attach type specific parts of prog + * (context accesses, allowed helpers, etc). + */ + __u32 expected_attach_type; + __u32 prog_btf_fd; /* fd pointing to BTF type data */ + __u32 func_info_rec_size; /* userspace bpf_func_info size */ + __aligned_u64 func_info; /* func info */ + __u32 func_info_cnt; /* number of bpf_func_info records */ + __u32 line_info_rec_size; /* userspace bpf_line_info size */ + __aligned_u64 line_info; /* line info */ + __u32 line_info_cnt; /* number of bpf_line_info records */ + __u32 attach_btf_id; /* in-kernel BTF type id to attach to */ + union { + /* valid prog_fd to attach to bpf prog */ + __u32 attach_prog_fd; + /* or valid module BTF object fd or 0 to attach to vmlinux */ + __u32 attach_btf_obj_fd; + }; + __u32 core_relo_cnt; /* number of bpf_core_relo */ + __aligned_u64 fd_array; /* array of FDs */ + __aligned_u64 core_relos; + __u32 core_relo_rec_size; /* sizeof(struct bpf_core_relo) */ + }; + + struct { /* anonymous struct used by BPF_OBJ_* commands */ + __aligned_u64 pathname; + __u32 bpf_fd; + __u32 file_flags; + }; + + struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ + __u32 target_fd; /* container object to attach to */ + __u32 attach_bpf_fd; /* eBPF program to attach */ + __u32 attach_type; + __u32 attach_flags; + __u32 replace_bpf_fd; /* previously attached eBPF + * program to replace if + * BPF_F_REPLACE is used + */ + }; + + struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */ + __u32 prog_fd; + __u32 retval; + __u32 data_size_in; /* input: len of data_in */ + __u32 data_size_out; /* input/output: len of data_out + * returns ENOSPC if data_out + * is too small. + */ + __aligned_u64 data_in; + __aligned_u64 data_out; + __u32 repeat; + __u32 duration; + __u32 ctx_size_in; /* input: len of ctx_in */ + __u32 ctx_size_out; /* input/output: len of ctx_out + * returns ENOSPC if ctx_out + * is too small. + */ + __aligned_u64 ctx_in; + __aligned_u64 ctx_out; + __u32 flags; + __u32 cpu; + __u32 batch_size; + } test; + + struct { /* anonymous struct used by BPF_*_GET_*_ID */ + union { + __u32 start_id; + __u32 prog_id; + __u32 map_id; + __u32 btf_id; + __u32 link_id; + }; + __u32 next_id; + __u32 open_flags; + }; + + struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ + __u32 bpf_fd; + __u32 info_len; + __aligned_u64 info; + } info; + + struct { /* anonymous struct used by BPF_PROG_QUERY command */ + __u32 target_fd; /* container object to query */ + __u32 attach_type; + __u32 query_flags; + __u32 attach_flags; + __aligned_u64 prog_ids; + __u32 prog_cnt; + /* output: per-program attach_flags. + * not allowed to be set during effective query. + */ + __aligned_u64 prog_attach_flags; + } query; + + struct { /* anonymous struct used by BPF_RAW_TRACEPOINT_OPEN command */ + __u64 name; + __u32 prog_fd; + } raw_tracepoint; + + struct { /* anonymous struct for BPF_BTF_LOAD */ + __aligned_u64 btf; + __aligned_u64 btf_log_buf; + __u32 btf_size; + __u32 btf_log_size; + __u32 btf_log_level; + }; + + struct { + __u32 pid; /* input: pid */ + __u32 fd; /* input: fd */ + __u32 flags; /* input: flags */ + __u32 buf_len; /* input/output: buf len */ + __aligned_u64 buf; /* input/output: + * tp_name for tracepoint + * symbol for kprobe + * filename for uprobe + */ + __u32 prog_id; /* output: prod_id */ + __u32 fd_type; /* output: BPF_FD_TYPE_* */ + __u64 probe_offset; /* output: probe_offset */ + __u64 probe_addr; /* output: probe_addr */ + } task_fd_query; + + struct { /* struct used by BPF_LINK_CREATE command */ + union { + __u32 prog_fd; /* eBPF program to attach */ + __u32 map_fd; /* eBPF struct_ops to attach */ + }; + union { + __u32 target_fd; /* object to attach to */ + __u32 target_ifindex; /* target ifindex */ + }; + __u32 attach_type; /* attach type */ + __u32 flags; /* extra flags */ + union { + __u32 target_btf_id; /* btf_id of target to attach to */ + struct { + __aligned_u64 iter_info; /* extra bpf_iter_link_info */ + __u32 iter_info_len; /* iter_info length */ + }; + struct { + /* black box user-provided value passed through + * to BPF program at the execution time and + * accessible through bpf_get_attach_cookie() BPF helper + */ + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + __aligned_u64 syms; + __aligned_u64 addrs; + __aligned_u64 cookies; + } kprobe_multi; + struct { + /* this is overlaid with the target_btf_id above. */ + __u32 target_btf_id; + /* black box user-provided value passed through + * to BPF program at the execution time and + * accessible through bpf_get_attach_cookie() BPF helper + */ + __u64 cookie; + } tracing; + }; + } link_create; + + struct { /* struct used by BPF_LINK_UPDATE command */ + __u32 link_fd; /* link fd */ + union { + /* new program fd to update link with */ + __u32 new_prog_fd; + /* new struct_ops map fd to update link with */ + __u32 new_map_fd; + }; + __u32 flags; /* extra flags */ + union { + /* expected link's program fd; is specified only if + * BPF_F_REPLACE flag is set in flags. + */ + __u32 old_prog_fd; + /* expected link's map fd; is specified only + * if BPF_F_REPLACE flag is set. + */ + __u32 old_map_fd; + }; + } link_update; + + struct { + __u32 link_fd; + } link_detach; + + struct { /* struct used by BPF_ENABLE_STATS command */ + __u32 type; + } enable_stats; + + struct { /* struct used by BPF_ITER_CREATE command */ + __u32 link_fd; + __u32 flags; + } iter_create; + + struct { /* struct used by BPF_PROG_BIND_MAP command */ + __u32 prog_fd; + __u32 map_fd; + __u32 flags; /* extra flags */ + } prog_bind_map; + +} __attribute__((aligned(8))); + +/* The description below is an attempt at providing documentation to eBPF + * developers about the multiple available eBPF helper functions. It can be + * parsed and used to produce a manual page. The workflow is the following, + * and requires the rst2man utility: + * + * $ ./scripts/bpf_doc.py \ + * --filename include/uapi/linux/bpf.h > /tmp/bpf-helpers.rst + * $ rst2man /tmp/bpf-helpers.rst > /tmp/bpf-helpers.7 + * $ man /tmp/bpf-helpers.7 + * + * Note that in order to produce this external documentation, some RST + * formatting is used in the descriptions to get "bold" and "italics" in + * manual pages. Also note that the few trailing white spaces are + * intentional, removing them would break paragraphs for rst2man. + * + * Start of BPF helper function descriptions: + * + * void *bpf_map_lookup_elem(struct bpf_map *map, const void *key) + * Description + * Perform a lookup in *map* for an entry associated to *key*. + * Return + * Map value associated to *key*, or **NULL** if no entry was + * found. + * + * long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags) + * Description + * Add or update the value of the entry associated to *key* in + * *map* with *value*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * Flag value **BPF_NOEXIST** cannot be used for maps of types + * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all + * elements always exist), the helper would return an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_delete_elem(struct bpf_map *map, const void *key) + * Description + * Delete entry with *key* from *map*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read(void *dst, u32 size, const void *unsafe_ptr) + * Description + * For tracing programs, safely attempt to read *size* bytes from + * kernel space address *unsafe_ptr* and store the data in *dst*. + * + * Generally, use **bpf_probe_read_user**\ () or + * **bpf_probe_read_kernel**\ () instead. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_ktime_get_ns(void) + * Description + * Return the time elapsed since system boot, in nanoseconds. + * Does not include time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_MONOTONIC**) + * Return + * Current *ktime*. + * + * long bpf_trace_printk(const char *fmt, u32 fmt_size, ...) + * Description + * This helper is a "printk()-like" facility for debugging. It + * prints a message defined by format *fmt* (of size *fmt_size*) + * to file *\/sys/kernel/tracing/trace* from TraceFS, if + * available. It can take up to three additional **u64** + * arguments (as an eBPF helpers, the total number of arguments is + * limited to five). + * + * Each time the helper is called, it appends a line to the trace. + * Lines are discarded while *\/sys/kernel/tracing/trace* is + * open, use *\/sys/kernel/tracing/trace_pipe* to avoid this. + * The format of the trace is customizable, and the exact output + * one will get depends on the options set in + * *\/sys/kernel/tracing/trace_options* (see also the + * *README* file under the same directory). However, it usually + * defaults to something like: + * + * :: + * + * telnet-470 [001] .N.. 419421.045894: 0x00000001: + * + * In the above: + * + * * ``telnet`` is the name of the current task. + * * ``470`` is the PID of the current task. + * * ``001`` is the CPU number on which the task is + * running. + * * In ``.N..``, each character refers to a set of + * options (whether irqs are enabled, scheduling + * options, whether hard/softirqs are running, level of + * preempt_disabled respectively). **N** means that + * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** + * are set. + * * ``419421.045894`` is a timestamp. + * * ``0x00000001`` is a fake value used by BPF for the + * instruction pointer register. + * * ```` is the message formatted with + * *fmt*. + * + * The conversion specifiers supported by *fmt* are similar, but + * more limited than for printk(). They are **%d**, **%i**, + * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, + * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size + * of field, padding with zeroes, etc.) is available, and the + * helper will return **-EINVAL** (but print nothing) if it + * encounters an unknown specifier. + * + * Also, note that **bpf_trace_printk**\ () is slow, and should + * only be used for debugging purposes. For this reason, a notice + * block (spanning several lines) is printed to kernel logs and + * states that the helper should not be used "for production use" + * the first time this helper is used (or more precisely, when + * **trace_printk**\ () buffers are allocated). For passing values + * to user space, perf events should be preferred. + * Return + * The number of bytes written to the buffer, or a negative error + * in case of failure. + * + * u32 bpf_get_prandom_u32(void) + * Description + * Get a pseudo-random number. + * + * From a security point of view, this helper uses its own + * pseudo-random internal state, and cannot be used to infer the + * seed of other random functions in the kernel. However, it is + * essential to note that the generator used by the helper is not + * cryptographically secure. + * Return + * A random 32-bit unsigned value. + * + * u32 bpf_get_smp_processor_id(void) + * Description + * Get the SMP (symmetric multiprocessing) processor id. Note that + * all programs run with migration disabled, which means that the + * SMP processor id is stable during all the execution of the + * program. + * Return + * The SMP id of the processor running the program. + * + * long bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags) + * Description + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. *flags* are a combination of + * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the + * checksum for the packet after storing the bytes) and + * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ + * **->swhash** and *skb*\ **->l4hash** to 0). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size) + * Description + * Recompute the layer 3 (e.g. IP) checksum for the packet + * associated to *skb*. Computation is incremental, so the helper + * must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored in *size*. + * Alternatively, it is possible to store the difference between + * the previous and the new values of the header field in *to*, by + * setting *from* and *size* to 0. For both methods, *offset* + * indicates the location of the IP checksum within the packet. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags) + * Description + * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the + * packet associated to *skb*. Computation is incremental, so the + * helper must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored on the lowest + * four bits of *flags*. Alternatively, it is possible to store + * the difference between the previous and the new values of the + * header field in *to*, by setting *from* and the four lowest + * bits of *flags* to 0. For both methods, *offset* indicates the + * location of the IP checksum within the packet. In addition to + * the size of the field, *flags* can be added (bitwise OR) actual + * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left + * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and + * for updates resulting in a null checksum the value is set to + * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates + * the checksum is to be computed against a pseudo-header. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index) + * Description + * This special helper is used to trigger a "tail call", or in + * other words, to jump into another eBPF program. The same stack + * frame is used (but values on stack and in registers for the + * caller are not accessible to the callee). This mechanism allows + * for program chaining, either for raising the maximum number of + * available eBPF instructions, or to execute given programs in + * conditional blocks. For security reasons, there is an upper + * limit to the number of successive tail calls that can be + * performed. + * + * Upon call of this helper, the program attempts to jump into a + * program referenced at index *index* in *prog_array_map*, a + * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes + * *ctx*, a pointer to the context. + * + * If the call succeeds, the kernel immediately runs the first + * instruction of the new program. This is not a function call, + * and it never returns to the previous program. If the call + * fails, then the helper has no effect, and the caller continues + * to run its subsequent instructions. A call can fail if the + * destination program for the jump does not exist (i.e. *index* + * is superior to the number of entries in *prog_array_map*), or + * if the maximum number of tail calls has been reached for this + * chain of programs. This limit is defined in the kernel by the + * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), + * which is currently set to 33. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags) + * Description + * Clone and redirect the packet associated to *skb* to another + * net device of index *ifindex*. Both ingress and egress + * interfaces can be used for redirection. The **BPF_F_INGRESS** + * value in *flags* is used to make the distinction (ingress path + * is selected if the flag is present, egress path otherwise). + * This is the only flag supported for now. + * + * In comparison with **bpf_redirect**\ () helper, + * **bpf_clone_redirect**\ () has the associated cost of + * duplicating the packet buffer, but this can be executed out of + * the eBPF program. Conversely, **bpf_redirect**\ () is more + * efficient, but it is handled through an action code where the + * redirection happens only after the eBPF program has returned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_get_current_pid_tgid(void) + * Description + * Get the current pid and tgid. + * Return + * A 64-bit integer containing the current tgid and pid, and + * created as such: + * *current_task*\ **->tgid << 32 \|** + * *current_task*\ **->pid**. + * + * u64 bpf_get_current_uid_gid(void) + * Description + * Get the current uid and gid. + * Return + * A 64-bit integer containing the current GID and UID, and + * created as such: *current_gid* **<< 32 \|** *current_uid*. + * + * long bpf_get_current_comm(void *buf, u32 size_of_buf) + * Description + * Copy the **comm** attribute of the current task into *buf* of + * *size_of_buf*. The **comm** attribute contains the name of + * the executable (excluding the path) for the current task. The + * *size_of_buf* must be strictly positive. On success, the + * helper makes sure that the *buf* is NUL-terminated. On failure, + * it is filled with zeroes. + * Return + * 0 on success, or a negative error in case of failure. + * + * u32 bpf_get_cgroup_classid(struct sk_buff *skb) + * Description + * Retrieve the classid for the current task, i.e. for the net_cls + * cgroup to which *skb* belongs. + * + * This helper can be used on TC egress path, but not on ingress. + * + * The net_cls cgroup provides an interface to tag network packets + * based on a user-provided identifier for all traffic coming from + * the tasks belonging to the related cgroup. See also the related + * kernel documentation, available from the Linux sources in file + * *Documentation/admin-guide/cgroup-v1/net_cls.rst*. + * + * The Linux kernel has two versions for cgroups: there are + * cgroups v1 and cgroups v2. Both are available to users, who can + * use a mixture of them, but note that the net_cls cgroup is for + * cgroup v1 only. This makes it incompatible with BPF programs + * run on cgroups, which is a cgroup-v2-only feature (a socket can + * only hold data for one version of cgroups at a time). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to + * "**y**" or to "**m**". + * Return + * The classid, or 0 for the default unconfigured classid. + * + * long bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci) + * Description + * Push a *vlan_tci* (VLAN tag control information) of protocol + * *vlan_proto* to the packet associated to *skb*, then update + * the checksum. Note that if *vlan_proto* is different from + * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to + * be **ETH_P_8021Q**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_vlan_pop(struct sk_buff *skb) + * Description + * Pop a VLAN header from the packet associated to *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) + * Description + * Get tunnel metadata. This helper takes a pointer *key* to an + * empty **struct bpf_tunnel_key** of **size**, that will be + * filled with tunnel metadata for the packet associated to *skb*. + * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which + * indicates that the tunnel is based on IPv6 protocol instead of + * IPv4. + * + * The **struct bpf_tunnel_key** is an object that generalizes the + * principal parameters used by various tunneling protocols into a + * single struct. This way, it can be used to easily make a + * decision based on the contents of the encapsulation header, + * "summarized" in this struct. In particular, it holds the IP + * address of the remote end (IPv4 or IPv6, depending on the case) + * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, + * this struct exposes the *key*\ **->tunnel_id**, which is + * generally mapped to a VNI (Virtual Network Identifier), making + * it programmable together with the **bpf_skb_set_tunnel_key**\ + * () helper. + * + * Let's imagine that the following code is part of a program + * attached to the TC ingress interface, on one end of a GRE + * tunnel, and is supposed to filter out all messages coming from + * remote ends with IPv4 address other than 10.0.0.1: + * + * :: + * + * int ret; + * struct bpf_tunnel_key key = {}; + * + * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); + * if (ret < 0) + * return TC_ACT_SHOT; // drop packet + * + * if (key.remote_ipv4 != 0x0a000001) + * return TC_ACT_SHOT; // drop packet + * + * return TC_ACT_OK; // accept packet + * + * This interface can also be used with all encapsulation devices + * that can operate in "collect metadata" mode: instead of having + * one network device per specific configuration, the "collect + * metadata" mode only requires a single device where the + * configuration can be extracted from this helper. + * + * This can be used together with various tunnels such as VXLan, + * Geneve, GRE or IP in IP (IPIP). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) + * Description + * Populate tunnel metadata for packet associated to *skb.* The + * tunnel metadata is set to the contents of *key*, of *size*. The + * *flags* can be set to a combination of the following values: + * + * **BPF_F_TUNINFO_IPV6** + * Indicate that the tunnel is based on IPv6 protocol + * instead of IPv4. + * **BPF_F_ZERO_CSUM_TX** + * For IPv4 packets, add a flag to tunnel metadata + * indicating that checksum computation should be skipped + * and checksum set to zeroes. + * **BPF_F_DONT_FRAGMENT** + * Add a flag to tunnel metadata indicating that the + * packet should not be fragmented. + * **BPF_F_SEQ_NUMBER** + * Add a flag to tunnel metadata indicating that a + * sequence number should be added to tunnel header before + * sending the packet. This flag was added for GRE + * encapsulation, but might be used with other protocols + * as well in the future. + * **BPF_F_NO_TUNNEL_KEY** + * Add a flag to tunnel metadata indicating that no tunnel + * key should be set in the resulting tunnel header. + * + * Here is a typical usage on the transmit path: + * + * :: + * + * struct bpf_tunnel_key key; + * populate key ... + * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); + * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); + * + * See also the description of the **bpf_skb_get_tunnel_key**\ () + * helper for additional information. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_perf_event_read(struct bpf_map *map, u64 flags) + * Description + * Read the value of a perf event counter. This helper relies on a + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of + * the perf event counter is selected when *map* is updated with + * perf event file descriptors. The *map* is an array whose size + * is the number of available CPUs, and each cell contains a value + * relative to one CPU. The value to retrieve is indicated by + * *flags*, that contains the index of the CPU to look up, masked + * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * Note that before Linux 4.13, only hardware perf event can be + * retrieved. + * + * Also, be aware that the newer helper + * **bpf_perf_event_read_value**\ () is recommended over + * **bpf_perf_event_read**\ () in general. The latter has some ABI + * quirks where error and counter value are used as a return code + * (which is wrong to do since ranges may overlap). This issue is + * fixed with **bpf_perf_event_read_value**\ (), which at the same + * time provides more features over the **bpf_perf_event_read**\ + * () interface. Please refer to the description of + * **bpf_perf_event_read_value**\ () for details. + * Return + * The value of the perf event counter read from the map, or a + * negative error code in case of failure. + * + * long bpf_redirect(u32 ifindex, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_clone_redirect**\ + * (), except that the packet is not cloned, which provides + * increased performance. + * + * Except for XDP, both ingress and egress interfaces can be used + * for redirection. The **BPF_F_INGRESS** value in *flags* is used + * to make the distinction (ingress path is selected if the flag + * is present, egress path otherwise). Currently, XDP only + * supports redirection to the egress interface, and accepts no + * flag at all. + * + * The same effect can also be attained with the more generic + * **bpf_redirect_map**\ (), which uses a BPF map to store the + * redirect target instead of providing it directly to the helper. + * Return + * For XDP, the helper returns **XDP_REDIRECT** on success or + * **XDP_ABORTED** on error. For other program types, the values + * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on + * error. + * + * u32 bpf_get_route_realm(struct sk_buff *skb) + * Description + * Retrieve the realm or the route, that is to say the + * **tclassid** field of the destination for the *skb*. The + * identifier retrieved is a user-provided tag, similar to the + * one used with the net_cls cgroup (see description for + * **bpf_get_cgroup_classid**\ () helper), but here this tag is + * held by a route (a destination entry), not by a task. + * + * Retrieving this identifier works with the clsact TC egress hook + * (see also **tc-bpf(8)**), or alternatively on conventional + * classful egress qdiscs, but not on TC ingress path. In case of + * clsact TC egress hook, this has the advantage that, internally, + * the destination entry has not been dropped yet in the transmit + * path. Therefore, the destination entry does not need to be + * artificially held via **netif_keep_dst**\ () for a classful + * qdisc until the *skb* is freed. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_IP_ROUTE_CLASSID** configuration option. + * Return + * The realm of the route for the packet associated to *skb*, or 0 + * if none was found. + * + * long bpf_perf_event_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * The context of the program *ctx* needs also be passed to the + * helper. + * + * On user space, a program willing to read the values needs to + * call **perf_event_open**\ () on the perf event (either for + * one or for all CPUs) and to store the file descriptor into the + * *map*. This must be done before the eBPF program can send data + * into it. An example is available in file + * *samples/bpf/trace_output_user.c* in the Linux kernel source + * tree (the eBPF program counterpart is in + * *samples/bpf/trace_output_kern.c*). + * + * **bpf_perf_event_output**\ () achieves better performance + * than **bpf_trace_printk**\ () for sharing data with user + * space, and is much better suitable for streaming data from eBPF + * programs. + * + * Note that this helper is not restricted to tracing use cases + * and can be used with programs attached to TC or XDP as well, + * where it allows for passing data to user space listeners. Data + * can be: + * + * * Only custom structs, + * * Only the packet payload, or + * * A combination of both. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_load_bytes(const void *skb, u32 offset, void *to, u32 len) + * Description + * This helper was provided as an easy way to load data from a + * packet. It can be used to load *len* bytes from *offset* from + * the packet associated to *skb*, into the buffer pointed by + * *to*. + * + * Since Linux 4.7, usage of this helper has mostly been replaced + * by "direct packet access", enabling packet data to be + * manipulated with *skb*\ **->data** and *skb*\ **->data_end** + * pointing respectively to the first byte of packet data and to + * the byte after the last byte of packet data. However, it + * remains useful if one wishes to read large quantities of data + * at once from a packet into the eBPF stack. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_get_stackid(void *ctx, struct bpf_map *map, u64 flags) + * Description + * Walk a user or a kernel stack and return its id. To achieve + * this, the helper needs *ctx*, which is a pointer to the context + * on which the tracing program is executed, and a pointer to a + * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * a combination of the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_FAST_STACK_CMP** + * Compare stacks by hash only. + * **BPF_F_REUSE_STACKID** + * If two different stacks hash into the same *stackid*, + * discard the old one. + * + * The stack id retrieved is a 32 bit long integer handle which + * can be further combined with other data (including other stack + * ids) and used as a key into maps. This can be useful for + * generating a variety of graphs (such as flame graphs or off-cpu + * graphs). + * + * For walking a stack, this helper is an improvement over + * **bpf_probe_read**\ (), which can be used with unrolled loops + * but is not efficient and consumes a lot of eBPF instructions. + * Instead, **bpf_get_stackid**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * Return + * The positive or null stack id on success, or a negative error + * in case of failure. + * + * s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed) + * Description + * Compute a checksum difference, from the raw buffer pointed by + * *from*, of length *from_size* (that must be a multiple of 4), + * towards the raw buffer pointed by *to*, of size *to_size* + * (same remark). An optional *seed* can be added to the value + * (this can be cascaded, the seed may come from a previous call + * to the helper). + * + * This is flexible enough to be used in several ways: + * + * * With *from_size* == 0, *to_size* > 0 and *seed* set to + * checksum, it can be used when pushing new data. + * * With *from_size* > 0, *to_size* == 0 and *seed* set to + * checksum, it can be used when removing data from a packet. + * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it + * can be used to compute a diff. Note that *from_size* and + * *to_size* do not need to be equal. + * + * This helper can be used in combination with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to + * which one can feed in the difference computed with + * **bpf_csum_diff**\ (). + * Return + * The checksum result, or a negative error code in case of + * failure. + * + * long bpf_skb_get_tunnel_opt(struct sk_buff *skb, void *opt, u32 size) + * Description + * Retrieve tunnel options metadata for the packet associated to + * *skb*, and store the raw tunnel option data to the buffer *opt* + * of *size*. + * + * This helper can be used with encapsulation devices that can + * operate in "collect metadata" mode (please refer to the related + * note in the description of **bpf_skb_get_tunnel_key**\ () for + * more details). A particular example where this can be used is + * in combination with the Geneve encapsulation protocol, where it + * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) + * and retrieving arbitrary TLVs (Type-Length-Value headers) from + * the eBPF program. This allows for full customization of these + * headers. + * Return + * The size of the option data retrieved. + * + * long bpf_skb_set_tunnel_opt(struct sk_buff *skb, void *opt, u32 size) + * Description + * Set tunnel options metadata for the packet associated to *skb* + * to the option data contained in the raw buffer *opt* of *size*. + * + * See also the description of the **bpf_skb_get_tunnel_opt**\ () + * helper for additional information. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_change_proto(struct sk_buff *skb, __be16 proto, u64 flags) + * Description + * Change the protocol of the *skb* to *proto*. Currently + * supported are transition from IPv4 to IPv6, and from IPv6 to + * IPv4. The helper takes care of the groundwork for the + * transition, including resizing the socket buffer. The eBPF + * program is expected to fill the new headers, if any, via + * **skb_store_bytes**\ () and to recompute the checksums with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ + * (). The main case for this helper is to perform NAT64 + * operations out of an eBPF program. + * + * Internally, the GSO type is marked as dodgy so that headers are + * checked and segments are recalculated by the GSO/GRO engine. + * The size for GSO target is adapted as well. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_change_type(struct sk_buff *skb, u32 type) + * Description + * Change the packet type for the packet associated to *skb*. This + * comes down to setting *skb*\ **->pkt_type** to *type*, except + * the eBPF program does not have a write access to *skb*\ + * **->pkt_type** beside this helper. Using a helper here allows + * for graceful handling of errors. + * + * The major use case is to change incoming *skb*s to + * **PACKET_HOST** in a programmatic way instead of having to + * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for + * example. + * + * Note that *type* only allows certain values. At this time, they + * are: + * + * **PACKET_HOST** + * Packet is for us. + * **PACKET_BROADCAST** + * Send packet to all. + * **PACKET_MULTICAST** + * Send packet to group. + * **PACKET_OTHERHOST** + * Send packet to someone else. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index) + * Description + * Check whether *skb* is a descendant of the cgroup2 held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * Return + * The return value depends on the result of the test, and can be: + * + * * 0, if the *skb* failed the cgroup2 descendant test. + * * 1, if the *skb* succeeded the cgroup2 descendant test. + * * A negative error code, if an error occurred. + * + * u32 bpf_get_hash_recalc(struct sk_buff *skb) + * Description + * Retrieve the hash of the packet, *skb*\ **->hash**. If it is + * not set, in particular if the hash was cleared due to mangling, + * recompute this hash. Later accesses to the hash can be done + * directly with *skb*\ **->hash**. + * + * Calling **bpf_set_hash_invalid**\ (), changing a packet + * prototype with **bpf_skb_change_proto**\ (), or calling + * **bpf_skb_store_bytes**\ () with the + * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear + * the hash and to trigger a new computation for the next call to + * **bpf_get_hash_recalc**\ (). + * Return + * The 32-bit hash. + * + * u64 bpf_get_current_task(void) + * Description + * Get the current task. + * Return + * A pointer to the current task struct. + * + * long bpf_probe_write_user(void *dst, const void *src, u32 len) + * Description + * Attempt in a safe way to write *len* bytes from the buffer + * *src* to *dst* in memory. It only works for threads that are in + * user context, and *dst* must be a valid user space address. + * + * This helper should not be used to implement any kind of + * security mechanism because of TOC-TOU attacks, but rather to + * debug, divert, and manipulate execution of semi-cooperative + * processes. + * + * Keep in mind that this feature is meant for experiments, and it + * has a risk of crashing the system and running programs. + * Therefore, when an eBPF program using this helper is attached, + * a warning including PID and process name is printed to kernel + * logs. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_current_task_under_cgroup(struct bpf_map *map, u32 index) + * Description + * Check whether the probe is being run is the context of a given + * subset of the cgroup2 hierarchy. The cgroup2 to test is held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * Return + * The return value depends on the result of the test, and can be: + * + * * 1, if current task belongs to the cgroup2. + * * 0, if current task does not belong to the cgroup2. + * * A negative error code, if an error occurred. + * + * long bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags) + * Description + * Resize (trim or grow) the packet associated to *skb* to the + * new *len*. The *flags* are reserved for future usage, and must + * be left at zero. + * + * The basic idea is that the helper performs the needed work to + * change the size of the packet, then the eBPF program rewrites + * the rest via helpers like **bpf_skb_store_bytes**\ (), + * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () + * and others. This helper is a slow path utility intended for + * replies with control messages. And because it is targeted for + * slow path, the helper itself can afford to be slow: it + * implicitly linearizes, unclones and drops offloads from the + * *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_pull_data(struct sk_buff *skb, u32 len) + * Description + * Pull in non-linear data in case the *skb* is non-linear and not + * all of *len* are part of the linear section. Make *len* bytes + * from *skb* readable and writable. If a zero value is passed for + * *len*, then all bytes in the linear part of *skb* will be made + * readable and writable. + * + * This helper is only needed for reading and writing with direct + * packet access. + * + * For direct packet access, testing that offsets to access + * are within packet boundaries (test on *skb*\ **->data_end**) is + * susceptible to fail if offsets are invalid, or if the requested + * data is in non-linear parts of the *skb*. On failure the + * program can just bail out, or in the case of a non-linear + * buffer, use a helper to make the data available. The + * **bpf_skb_load_bytes**\ () helper is a first solution to access + * the data. Another one consists in using **bpf_skb_pull_data** + * to pull in once the non-linear parts, then retesting and + * eventually access the data. + * + * At the same time, this also makes sure the *skb* is uncloned, + * which is a necessary condition for direct write. As this needs + * to be an invariant for the write part only, the verifier + * detects writes and adds a prologue that is calling + * **bpf_skb_pull_data()** to effectively unclone the *skb* from + * the very beginning in case it is indeed cloned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * s64 bpf_csum_update(struct sk_buff *skb, __wsum csum) + * Description + * Add the checksum *csum* into *skb*\ **->csum** in case the + * driver has supplied a checksum for the entire packet into that + * field. Return an error otherwise. This helper is intended to be + * used in combination with **bpf_csum_diff**\ (), in particular + * when the checksum needs to be updated after data has been + * written into the packet through direct packet access. + * Return + * The checksum on success, or a negative error code in case of + * failure. + * + * void bpf_set_hash_invalid(struct sk_buff *skb) + * Description + * Invalidate the current *skb*\ **->hash**. It can be used after + * mangling on headers through direct packet access, in order to + * indicate that the hash is outdated and to trigger a + * recalculation the next time the kernel tries to access this + * hash or when the **bpf_get_hash_recalc**\ () helper is called. + * Return + * void. + * + * long bpf_get_numa_node_id(void) + * Description + * Return the id of the current NUMA node. The primary use case + * for this helper is the selection of sockets for the local NUMA + * node, when the program is attached to sockets using the + * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), + * but the helper is also available to other eBPF program types, + * similarly to **bpf_get_smp_processor_id**\ (). + * Return + * The id of current NUMA node. + * + * long bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags) + * Description + * Grows headroom of packet associated to *skb* and adjusts the + * offset of the MAC header accordingly, adding *len* bytes of + * space. It automatically extends and reallocates memory as + * required. + * + * This helper can be used on a layer 3 *skb* to push a MAC header + * for redirection into a layer 2 device. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that + * it is possible to use a negative value for *delta*. This helper + * can be used to prepare the packet for pushing or popping + * headers. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_str(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Copy a NUL terminated string from an unsafe kernel address + * *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for + * more details. + * + * Generally, use **bpf_probe_read_user_str**\ () or + * **bpf_probe_read_kernel_str**\ () instead. + * Return + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + * + * u64 bpf_get_socket_cookie(struct sk_buff *skb) + * Description + * If the **struct sk_buff** pointed by *skb* has a known socket, + * retrieve the cookie (generated by the kernel) of this socket. + * If no cookie has been set yet, generate a new cookie. Once + * generated, the socket cookie remains stable for the life of the + * socket. This helper can be useful for monitoring per socket + * networking traffic statistics as it provides a global socket + * identifier that can be assumed unique. + * Return + * A 8-byte long unique number on success, or 0 if the socket + * field is missing inside *skb*. + * + * u64 bpf_get_socket_cookie(struct bpf_sock_addr *ctx) + * Description + * Equivalent to bpf_get_socket_cookie() helper that accepts + * *skb*, but gets socket from **struct bpf_sock_addr** context. + * Return + * A 8-byte long unique number. + * + * u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx) + * Description + * Equivalent to **bpf_get_socket_cookie**\ () helper that accepts + * *skb*, but gets socket from **struct bpf_sock_ops** context. + * Return + * A 8-byte long unique number. + * + * u64 bpf_get_socket_cookie(struct sock *sk) + * Description + * Equivalent to **bpf_get_socket_cookie**\ () helper that accepts + * *sk*, but gets socket from a BTF **struct sock**. This helper + * also works for sleepable programs. + * Return + * A 8-byte long unique number or 0 if *sk* is NULL. + * + * u32 bpf_get_socket_uid(struct sk_buff *skb) + * Description + * Get the owner UID of the socked associated to *skb*. + * Return + * The owner UID of the socket associated to *skb*. If the socket + * is **NULL**, or if it is not a full socket (i.e. if it is a + * time-wait or a request socket instead), **overflowuid** value + * is returned (note that **overflowuid** might also be the actual + * UID value for the socket). + * + * long bpf_set_hash(struct sk_buff *skb, u32 hash) + * Description + * Set the full hash for *skb* (set the field *skb*\ **->hash**) + * to value *hash*. + * Return + * 0 + * + * long bpf_setsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen) + * Description + * Emulate a call to **setsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **setsockopt(2)** for more information. + * The option value of length *optlen* is pointed by *optval*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **setsockopt()**. + * It supports the following *level*\ s: + * + * * **SOL_SOCKET**, which supports the following *optname*\ s: + * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, + * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**, + * **SO_BINDTODEVICE**, **SO_KEEPALIVE**, **SO_REUSEADDR**, + * **SO_REUSEPORT**, **SO_BINDTOIFINDEX**, **SO_TXREHASH**. + * * **IPPROTO_TCP**, which supports the following *optname*\ s: + * **TCP_CONGESTION**, **TCP_BPF_IW**, + * **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, + * **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, + * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**, + * **TCP_NODELAY**, **TCP_MAXSEG**, **TCP_WINDOW_CLAMP**, + * **TCP_THIN_LINEAR_TIMEOUTS**, **TCP_BPF_DELACK_MAX**, + * **TCP_BPF_RTO_MIN**. + * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. + * * **IPPROTO_IPV6**, which supports the following *optname*\ s: + * **IPV6_TCLASS**, **IPV6_AUTOFLOWLABEL**. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_adjust_room(struct sk_buff *skb, s32 len_diff, u32 mode, u64 flags) + * Description + * Grow or shrink the room for data in the packet associated to + * *skb* by *len_diff*, and according to the selected *mode*. + * + * By default, the helper will reset any offloaded checksum + * indicator of the skb to CHECKSUM_NONE. This can be avoided + * by the following flag: + * + * * **BPF_F_ADJ_ROOM_NO_CSUM_RESET**: Do not reset offloaded + * checksum data of the skb to CHECKSUM_NONE. + * + * There are two supported modes at this time: + * + * * **BPF_ADJ_ROOM_MAC**: Adjust room at the mac layer + * (room space is added or removed between the layer 2 and + * layer 3 headers). + * + * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer + * (room space is added or removed between the layer 3 and + * layer 4 headers). + * + * The following flags are supported at this time: + * + * * **BPF_F_ADJ_ROOM_FIXED_GSO**: Do not adjust gso_size. + * Adjusting mss in this way is not allowed for datagrams. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV6**: + * Any new space is reserved to hold a tunnel header. + * Configure skb offsets and other fields accordingly. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L4_GRE**, + * **BPF_F_ADJ_ROOM_ENCAP_L4_UDP**: + * Use with ENCAP_L3 flags to further specify the tunnel type. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2**\ (*len*): + * Use with ENCAP_L3/L4 flags to further specify the tunnel + * type; *len* is the length of the inner MAC header. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2_ETH**: + * Use with BPF_F_ADJ_ROOM_ENCAP_L2 flag to further specify the + * L2 type as Ethernet. + * + * * **BPF_F_ADJ_ROOM_DECAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_DECAP_L3_IPV6**: + * Indicate the new IP header version after decapsulating the outer + * IP header. Used when the inner and outer IP versions are different. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_redirect_map(struct bpf_map *map, u64 key, u64 flags) + * Description + * Redirect the packet to the endpoint referenced by *map* at + * index *key*. Depending on its type, this *map* can contain + * references to net devices (for forwarding packets through other + * ports), or to CPUs (for redirecting XDP frames to another CPU; + * but this is only implemented for native XDP (with driver + * support) as of this writing). + * + * The lower two bits of *flags* are used as the return code if + * the map lookup fails. This is so that the return value can be + * one of the XDP program return codes up to **XDP_TX**, as chosen + * by the caller. The higher bits of *flags* can be set to + * BPF_F_BROADCAST or BPF_F_EXCLUDE_INGRESS as defined below. + * + * With BPF_F_BROADCAST the packet will be broadcasted to all the + * interfaces in the map, with BPF_F_EXCLUDE_INGRESS the ingress + * interface will be excluded when do broadcasting. + * + * See also **bpf_redirect**\ (), which only supports redirecting + * to an ifindex, but doesn't require a map to do so. + * Return + * **XDP_REDIRECT** on success, or the value of the two lower bits + * of the *flags* argument on error. + * + * long bpf_sk_redirect_map(struct sk_buff *skb, struct bpf_map *map, u32 key, u64 flags) + * Description + * Redirect the packet to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) + * Description + * Add an entry to, or update a *map* referencing sockets. The + * *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust the address pointed by *xdp_md*\ **->data_meta** by + * *delta* (which can be positive or negative). Note that this + * operation modifies the address stored in *xdp_md*\ **->data**, + * so the latter must be loaded only after the helper has been + * called. + * + * The use of *xdp_md*\ **->data_meta** is optional and programs + * are not required to use it. The rationale is that when the + * packet is processed with XDP (e.g. as DoS filter), it is + * possible to push further meta data along with it before passing + * to the stack, and to give the guarantee that an ingress eBPF + * program attached as a TC classifier on the same device can pick + * this up for further post-processing. Since TC works with socket + * buffers, it remains possible to set from XDP the **mark** or + * **priority** pointers, or other pointers for the socket buffer. + * Having this scratch space generic and programmable allows for + * more flexibility as the user is free to store whatever meta + * data they need. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size) + * Description + * Read the value of a perf event counter, and store it into *buf* + * of size *buf_size*. This helper relies on a *map* of type + * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event + * counter is selected when *map* is updated with perf event file + * descriptors. The *map* is an array whose size is the number of + * available CPUs, and each cell contains a value relative to one + * CPU. The value to retrieve is indicated by *flags*, that + * contains the index of the CPU to look up, masked with + * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * This helper behaves in a way close to + * **bpf_perf_event_read**\ () helper, save that instead of + * just returning the value observed, it fills the *buf* + * structure. This allows for additional data to be retrieved: in + * particular, the enabled and running times (in *buf*\ + * **->enabled** and *buf*\ **->running**, respectively) are + * copied. In general, **bpf_perf_event_read_value**\ () is + * recommended over **bpf_perf_event_read**\ (), which has some + * ABI issues and provides fewer functionalities. + * + * These values are interesting, because hardware PMU (Performance + * Monitoring Unit) counters are limited resources. When there are + * more PMU based perf events opened than available counters, + * kernel will multiplex these events so each event gets certain + * percentage (but not all) of the PMU time. In case that + * multiplexing happens, the number of samples or counter value + * will not reflect the case compared to when no multiplexing + * occurs. This makes comparison between different runs difficult. + * Typically, the counter value should be normalized before + * comparing to other experiments. The usual normalization is done + * as follows. + * + * :: + * + * normalized_counter = counter * t_enabled / t_running + * + * Where t_enabled is the time enabled for event and t_running is + * the time running for event since last normalization. The + * enabled and running times are accumulated since the perf event + * open. To achieve scaling factor between two invocations of an + * eBPF program, users can use CPU id as the key (which is + * typical for perf array usage model) to remember the previous + * value and do the calculation inside the eBPF program. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size) + * Description + * For an eBPF program attached to a perf event, retrieve the + * value of the event counter associated to *ctx* and store it in + * the structure pointed by *buf* and of size *buf_size*. Enabled + * and running times are also stored in the structure (see + * description of helper **bpf_perf_event_read_value**\ () for + * more details). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_getsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen) + * Description + * Emulate a call to **getsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **getsockopt(2)** for more information. + * The retrieved value is stored in the structure pointed by + * *opval* and of length *optlen*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **getsockopt()**. + * It supports the same set of *optname*\ s that is supported by + * the **bpf_setsockopt**\ () helper. The exceptions are + * **TCP_BPF_*** is **bpf_setsockopt**\ () only and + * **TCP_SAVED_SYN** is **bpf_getsockopt**\ () only. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_override_return(struct pt_regs *regs, u64 rc) + * Description + * Used for error injection, this helper uses kprobes to override + * the return value of the probed function, and to set it to *rc*. + * The first argument is the context *regs* on which the kprobe + * works. + * + * This helper works by setting the PC (program counter) + * to an override function which is run in place of the original + * probed function. This means the probed function is not run at + * all. The replacement function just returns with the required + * value. + * + * This helper has security implications, and thus is subject to + * restrictions. It is only available if the kernel was compiled + * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration + * option, and in this case it only works on functions tagged with + * **ALLOW_ERROR_INJECTION** in the kernel code. + * + * Also, the helper is only available for the architectures having + * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, + * x86 architecture is the only one to support this feature. + * Return + * 0 + * + * long bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval) + * Description + * Attempt to set the value of the **bpf_sock_ops_cb_flags** field + * for the full TCP socket associated to *bpf_sock_ops* to + * *argval*. + * + * The primary use of this field is to determine if there should + * be calls to eBPF programs of type + * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP + * code. A program of the same type can change its value, per + * connection and as necessary, when the connection is + * established. This field is directly accessible for reading, but + * this helper must be used for updates in order to return an + * error if an eBPF program tries to set a callback that is not + * supported in the current kernel. + * + * *argval* is a flag array which can combine these flags: + * + * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) + * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) + * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) + * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) + * + * Therefore, this function can be used to clear a callback flag by + * setting the appropriate bit to zero. e.g. to disable the RTO + * callback: + * + * **bpf_sock_ops_cb_flags_set(bpf_sock,** + * **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)** + * + * Here are some examples of where one could call such eBPF + * program: + * + * * When RTO fires. + * * When a packet is retransmitted. + * * When the connection terminates. + * * When a packet is sent. + * * When a packet is received. + * Return + * Code **-EINVAL** if the socket is not a full TCP socket; + * otherwise, a positive number containing the bits that could not + * be set is returned (which comes down to 0 if all bits were set + * as required). + * + * long bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes) + * Description + * For socket policies, apply the verdict of the eBPF program to + * the next *bytes* (number of bytes) of message *msg*. + * + * For example, this helper can be used in the following cases: + * + * * A single **sendmsg**\ () or **sendfile**\ () system call + * contains multiple logical messages that the eBPF program is + * supposed to read and for which it should apply a verdict. + * * An eBPF program only cares to read the first *bytes* of a + * *msg*. If the message has a large payload, then setting up + * and calling the eBPF program repeatedly for all bytes, even + * though the verdict is already known, would create unnecessary + * overhead. + * + * When called from within an eBPF program, the helper sets a + * counter internal to the BPF infrastructure, that is used to + * apply the last verdict to the next *bytes*. If *bytes* is + * smaller than the current data being processed from a + * **sendmsg**\ () or **sendfile**\ () system call, the first + * *bytes* will be sent and the eBPF program will be re-run with + * the pointer for start of data pointing to byte number *bytes* + * **+ 1**. If *bytes* is larger than the current data being + * processed, then the eBPF verdict will be applied to multiple + * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are + * consumed. + * + * Note that if a socket closes with the internal counter holding + * a non-zero value, this is not a problem because data is not + * being buffered for *bytes* and is sent as it is received. + * Return + * 0 + * + * long bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes) + * Description + * For socket policies, prevent the execution of the verdict eBPF + * program for message *msg* until *bytes* (byte number) have been + * accumulated. + * + * This can be used when one needs a specific number of bytes + * before a verdict can be assigned, even if the data spans + * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme + * case would be a user calling **sendmsg**\ () repeatedly with + * 1-byte long message segments. Obviously, this is bad for + * performance, but it is still valid. If the eBPF program needs + * *bytes* bytes to validate a header, this helper can be used to + * prevent the eBPF program to be called again until *bytes* have + * been accumulated. + * Return + * 0 + * + * long bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags) + * Description + * For socket policies, pull in non-linear data from user space + * for *msg* and set pointers *msg*\ **->data** and *msg*\ + * **->data_end** to *start* and *end* bytes offsets into *msg*, + * respectively. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it can only parse data that the (**data**, **data_end**) + * pointers have already consumed. For **sendmsg**\ () hooks this + * is likely the first scatterlist element. But for calls relying + * on the **sendpage** handler (e.g. **sendfile**\ ()) this will + * be the range (**0**, **0**) because the data is shared with + * user space and by default the objective is to avoid allowing + * user space to modify data while (or after) eBPF verdict is + * being decided. This helper can be used to pull in data and to + * set the start and end pointer to given values. Data will be + * copied if necessary (i.e. if data was not linear and if start + * and end pointers do not point to the same chunk). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) + * Description + * Bind the socket associated to *ctx* to the address pointed by + * *addr*, of length *addr_len*. This allows for making outgoing + * connection from the desired IP address, which can be useful for + * example when all processes inside a cgroup should use one + * single IP address on a host that has multiple IP configured. + * + * This helper works for IPv4 and IPv6, TCP and UDP sockets. The + * domain (*addr*\ **->sa_family**) must be **AF_INET** (or + * **AF_INET6**). It's advised to pass zero port (**sin_port** + * or **sin6_port**) which triggers IP_BIND_ADDRESS_NO_PORT-like + * behavior and lets the kernel efficiently pick up an unused + * port as long as 4-tuple is unique. Passing non-zero port might + * lead to degraded performance. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta) + * Description + * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is + * possible to both shrink and grow the packet tail. + * Shrink done via *delta* being a negative integer. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags) + * Description + * Retrieve the XFRM state (IP transform framework, see also + * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. + * + * The retrieved value is stored in the **struct bpf_xfrm_state** + * pointed by *xfrm_state* and of length *size*. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_XFRM** configuration option. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_get_stack(void *ctx, void *buf, u32 size, u64 flags) + * Description + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *ctx*, which is a pointer + * to the context on which the tracing program is executed. + * To store the stacktrace, the bpf program provides *buf* with + * a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect (build_id, file_offset) instead of ips for user + * stack, only valid if **BPF_F_USER_STACK** is also + * specified. + * + * *file_offset* is an offset relative to the beginning + * of the executable or shared object file backing the vma + * which the *ip* falls in. It is *not* an offset relative + * to that object's base address. Accordingly, it must be + * adjusted by adding (sh_addr - sh_offset), where + * sh_{addr,offset} correspond to the executable section + * containing *file_offset* in the object, for comparisons + * to symbols' st_value to be valid. + * + * **bpf_get_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * Return + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + * + * long bpf_skb_load_bytes_relative(const void *skb, u32 offset, void *to, u32 len, u32 start_header) + * Description + * This helper is similar to **bpf_skb_load_bytes**\ () in that + * it provides an easy way to load *len* bytes from *offset* + * from the packet associated to *skb*, into the buffer pointed + * by *to*. The difference to **bpf_skb_load_bytes**\ () is that + * a fifth argument *start_header* exists in order to select a + * base offset to start from. *start_header* can be one of: + * + * **BPF_HDR_START_MAC** + * Base offset to load data from is *skb*'s mac header. + * **BPF_HDR_START_NET** + * Base offset to load data from is *skb*'s network header. + * + * In general, "direct packet access" is the preferred method to + * access packet data, however, this helper is in particular useful + * in socket filters where *skb*\ **->data** does not always point + * to the start of the mac header and where "direct packet access" + * is not available. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags) + * Description + * Do FIB lookup in kernel tables using parameters in *params*. + * If lookup is successful and result shows packet is to be + * forwarded, the neighbor tables are searched for the nexthop. + * If successful (ie., FIB lookup shows forwarding and nexthop + * is resolved), the nexthop address is returned in ipv4_dst + * or ipv6_dst based on family, smac is set to mac address of + * egress device, dmac is set to nexthop mac address, rt_metric + * is set to metric from route (IPv4/IPv6 only), and ifindex + * is set to the device index of the nexthop from the FIB lookup. + * + * *plen* argument is the size of the passed in struct. + * *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_FIB_LOOKUP_DIRECT** + * Do a direct table lookup vs full lookup using FIB + * rules. + * **BPF_FIB_LOOKUP_OUTPUT** + * Perform lookup from an egress perspective (default is + * ingress). + * **BPF_FIB_LOOKUP_SKIP_NEIGH** + * Skip the neighbour table lookup. *params*->dmac + * and *params*->smac will not be set as output. A common + * use case is to call **bpf_redirect_neigh**\ () after + * doing **bpf_fib_lookup**\ (). + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** tc cls_act programs. + * Return + * * < 0 if any input argument is invalid + * * 0 on success (packet is forwarded, nexthop neighbor exists) + * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the + * packet is not forwarded or needs assist from full stack + * + * If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU + * was exceeded and output params->mtu_result contains the MTU. + * + * long bpf_sock_hash_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) + * Description + * Add an entry to, or update a sockhash *map* referencing sockets. + * The *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags) + * Description + * This helper is used in programs implementing policies at the + * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. + * if the verdict eBPF program returns **SK_PASS**), redirect it + * to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress otherwise). This is the only flag supported for now. + * Return + * **SK_PASS** on success, or **SK_DROP** on error. + * + * long bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len) + * Description + * Encapsulate the packet associated to *skb* within a Layer 3 + * protocol header. This header is provided in the buffer at + * address *hdr*, with *len* its size in bytes. *type* indicates + * the protocol of the header and can be one of: + * + * **BPF_LWT_ENCAP_SEG6** + * IPv6 encapsulation with Segment Routing Header + * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, + * the IPv6 header is computed by the kernel. + * **BPF_LWT_ENCAP_SEG6_INLINE** + * Only works if *skb* contains an IPv6 packet. Insert a + * Segment Routing Header (**struct ipv6_sr_hdr**) inside + * the IPv6 header. + * **BPF_LWT_ENCAP_IP** + * IP encapsulation (GRE/GUE/IPIP/etc). The outer header + * must be IPv4 or IPv6, followed by zero or more + * additional headers, up to **LWT_BPF_MAX_HEADROOM** + * total bytes in all prepended headers. Please note that + * if **skb_is_gso**\ (*skb*) is true, no more than two + * headers can be prepended, and the inner header, if + * present, should be either GRE or UDP/GUE. + * + * **BPF_LWT_ENCAP_SEG6**\ \* types can be called by BPF programs + * of type **BPF_PROG_TYPE_LWT_IN**; **BPF_LWT_ENCAP_IP** type can + * be called by bpf programs of types **BPF_PROG_TYPE_LWT_IN** and + * **BPF_PROG_TYPE_LWT_XMIT**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len) + * Description + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. Only the flags, tag and TLVs + * inside the outermost IPv6 Segment Routing Header can be + * modified through this helper. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta) + * Description + * Adjust the size allocated to TLVs in the outermost IPv6 + * Segment Routing Header contained in the packet associated to + * *skb*, at position *offset* by *delta* bytes. Only offsets + * after the segments are accepted. *delta* can be as well + * positive (growing) as negative (shrinking). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len) + * Description + * Apply an IPv6 Segment Routing action of type *action* to the + * packet associated to *skb*. Each action takes a parameter + * contained at address *param*, and of length *param_len* bytes. + * *action* can be one of: + * + * **SEG6_LOCAL_ACTION_END_X** + * End.X action: Endpoint with Layer-3 cross-connect. + * Type of *param*: **struct in6_addr**. + * **SEG6_LOCAL_ACTION_END_T** + * End.T action: Endpoint with specific IPv6 table lookup. + * Type of *param*: **int**. + * **SEG6_LOCAL_ACTION_END_B6** + * End.B6 action: Endpoint bound to an SRv6 policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * **SEG6_LOCAL_ACTION_END_B6_ENCAP** + * End.B6.Encap action: Endpoint bound to an SRv6 + * encapsulation policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_rc_repeat(void *ctx) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded repeat key message. This delays + * the generation of a key up event for previously generated + * key down event. + * + * Some IR protocols like NEC have a special IR message for + * repeating last button, for when a button is held down. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * long bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded key press with *scancode*, + * *toggle* value in the given *protocol*. The scancode will be + * translated to a keycode using the rc keymap, and reported as + * an input key down event. After a period a key up event is + * generated. This period can be extended by calling either + * **bpf_rc_keydown**\ () again with the same values, or calling + * **bpf_rc_repeat**\ (). + * + * Some protocols include a toggle bit, in case the button was + * released and pressed again between consecutive scancodes. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * The *protocol* is the decoded protocol number (see + * **enum rc_proto** for some predefined values). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * u64 bpf_skb_cgroup_id(struct sk_buff *skb) + * Description + * Return the cgroup v2 id of the socket associated with the *skb*. + * This is roughly similar to the **bpf_get_cgroup_classid**\ () + * helper for cgroup v1 by providing a tag resp. identifier that + * can be matched on or used for map lookups e.g. to implement + * policy. The cgroup v2 id of a given path in the hierarchy is + * exposed in user space through the f_handle API in order to get + * to the same 64-bit id. + * + * This helper can be used on TC egress path, but not on ingress, + * and is available only if the kernel was compiled with the + * **CONFIG_SOCK_CGROUP_DATA** configuration option. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * u64 bpf_get_current_cgroup_id(void) + * Description + * Get the current cgroup id based on the cgroup within which + * the current task is running. + * Return + * A 64-bit integer containing the current cgroup id based + * on the cgroup within which the current task is running. + * + * void *bpf_get_local_storage(void *map, u64 flags) + * Description + * Get the pointer to the local storage area. + * The type and the size of the local storage is defined + * by the *map* argument. + * The *flags* meaning is specific for each map type, + * and has to be 0 for cgroup local storage. + * + * Depending on the BPF program type, a local storage area + * can be shared between multiple instances of the BPF program, + * running simultaneously. + * + * A user should care about the synchronization by himself. + * For example, by using the **BPF_ATOMIC** instructions to alter + * the shared data. + * Return + * A pointer to the local storage area. + * + * long bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags) + * Description + * Select a **SO_REUSEPORT** socket from a + * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*. + * It checks the selected socket is matching the incoming + * request in the socket buffer. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *skb* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *skb*, then return value will be same as that + * of **bpf_skb_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *skb*. + * + * The format of returned id and helper limitations are same as in + * **bpf_skb_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * struct bpf_sock *bpf_sk_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + * + * struct bpf_sock *bpf_sk_lookup_udp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for UDP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + * + * long bpf_sk_release(void *sock) + * Description + * Release the reference held by *sock*. *sock* must be a + * non-**NULL** pointer that was returned from + * **bpf_sk_lookup_xxx**\ (). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags) + * Description + * Push an element *value* in *map*. *flags* is one of: + * + * **BPF_EXIST** + * If the queue/stack is full, the oldest element is + * removed to make room for this. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_pop_elem(struct bpf_map *map, void *value) + * Description + * Pop an element from *map*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_map_peek_elem(struct bpf_map *map, void *value) + * Description + * Get an element from *map* without removing it. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_msg_push_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags) + * Description + * For socket policies, insert *len* bytes into *msg* at offset + * *start*. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it may want to insert metadata or options into the *msg*. + * This can later be read and used by any of the lower layer BPF + * hooks. + * + * This helper may fail if under memory pressure (a malloc + * fails) in these cases BPF programs will get an appropriate + * error and BPF programs will need to handle them. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_msg_pop_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags) + * Description + * Will remove *len* bytes from a *msg* starting at byte *start*. + * This may result in **ENOMEM** errors under certain situations if + * an allocation and copy are required due to a full ring buffer. + * However, the helper will try to avoid doing the allocation + * if possible. Other errors can occur if input parameters are + * invalid either due to *start* byte not being valid part of *msg* + * payload and/or *pop* value being to large. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y) + * Description + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded pointer movement. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * Return + * 0 + * + * long bpf_spin_lock(struct bpf_spin_lock *lock) + * Description + * Acquire a spinlock represented by the pointer *lock*, which is + * stored as part of a value of a map. Taking the lock allows to + * safely update the rest of the fields in that value. The + * spinlock can (and must) later be released with a call to + * **bpf_spin_unlock**\ (\ *lock*\ ). + * + * Spinlocks in BPF programs come with a number of restrictions + * and constraints: + * + * * **bpf_spin_lock** objects are only allowed inside maps of + * types **BPF_MAP_TYPE_HASH** and **BPF_MAP_TYPE_ARRAY** (this + * list could be extended in the future). + * * BTF description of the map is mandatory. + * * The BPF program can take ONE lock at a time, since taking two + * or more could cause dead locks. + * * Only one **struct bpf_spin_lock** is allowed per map element. + * * When the lock is taken, calls (either BPF to BPF or helpers) + * are not allowed. + * * The **BPF_LD_ABS** and **BPF_LD_IND** instructions are not + * allowed inside a spinlock-ed region. + * * The BPF program MUST call **bpf_spin_unlock**\ () to release + * the lock, on all execution paths, before it returns. + * * The BPF program can access **struct bpf_spin_lock** only via + * the **bpf_spin_lock**\ () and **bpf_spin_unlock**\ () + * helpers. Loading or storing data into the **struct + * bpf_spin_lock** *lock*\ **;** field of a map is not allowed. + * * To use the **bpf_spin_lock**\ () helper, the BTF description + * of the map value must be a struct and have **struct + * bpf_spin_lock** *anyname*\ **;** field at the top level. + * Nested lock inside another struct is not allowed. + * * The **struct bpf_spin_lock** *lock* field in a map value must + * be aligned on a multiple of 4 bytes in that value. + * * Syscall with command **BPF_MAP_LOOKUP_ELEM** does not copy + * the **bpf_spin_lock** field to user space. + * * Syscall with command **BPF_MAP_UPDATE_ELEM**, or update from + * a BPF program, do not update the **bpf_spin_lock** field. + * * **bpf_spin_lock** cannot be on the stack or inside a + * networking packet (it can only be inside of a map values). + * * **bpf_spin_lock** is available to root only. + * * Tracing programs and socket filter programs cannot use + * **bpf_spin_lock**\ () due to insufficient preemption checks + * (but this may change in the future). + * * **bpf_spin_lock** is not allowed in inner maps of map-in-map. + * Return + * 0 + * + * long bpf_spin_unlock(struct bpf_spin_lock *lock) + * Description + * Release the *lock* previously locked by a call to + * **bpf_spin_lock**\ (\ *lock*\ ). + * Return + * 0 + * + * struct bpf_sock *bpf_sk_fullsock(struct bpf_sock *sk) + * Description + * This helper gets a **struct bpf_sock** pointer such + * that all the fields in this **bpf_sock** can be accessed. + * Return + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + * + * struct bpf_tcp_sock *bpf_tcp_sock(struct bpf_sock *sk) + * Description + * This helper gets a **struct bpf_tcp_sock** pointer from a + * **struct bpf_sock** pointer. + * Return + * A **struct bpf_tcp_sock** pointer on success, or **NULL** in + * case of failure. + * + * long bpf_skb_ecn_set_ce(struct sk_buff *skb) + * Description + * Set ECN (Explicit Congestion Notification) field of IP header + * to **CE** (Congestion Encountered) if current value is **ECT** + * (ECN Capable Transport). Otherwise, do nothing. Works with IPv6 + * and IPv4. + * Return + * 1 if the **CE** flag is set (either by the current helper call + * or because it was already present), 0 if it is not set. + * + * struct bpf_sock *bpf_get_listener_sock(struct bpf_sock *sk) + * Description + * Return a **struct bpf_sock** pointer in **TCP_LISTEN** state. + * **bpf_sk_release**\ () is unnecessary and not allowed. + * Return + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + * + * struct bpf_sock *bpf_skc_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) + * Description + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * This function is identical to **bpf_sk_lookup_tcp**\ (), except + * that it also returns timewait or request sockets. Use + * **bpf_sk_fullsock**\ () or **bpf_tcp_sock**\ () to access the + * full structure. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * Return + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + * + * long bpf_tcp_check_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len) + * Description + * Check whether *iph* and *th* contain a valid SYN cookie ACK for + * the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative + * error otherwise. + * + * long bpf_sysctl_get_name(struct bpf_sysctl *ctx, char *buf, size_t buf_len, u64 flags) + * Description + * Get name of sysctl in /proc/sys/ and copy it into provided by + * program buffer *buf* of size *buf_len*. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * If *flags* is zero, full name (e.g. "net/ipv4/tcp_mem") is + * copied. Use **BPF_F_SYSCTL_BASE_NAME** flag to copy base name + * only (e.g. "tcp_mem"). + * Return + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * long bpf_sysctl_get_current_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len) + * Description + * Get current value of sysctl as it is presented in /proc/sys + * (incl. newline, etc), and copy it as a string into provided + * by program buffer *buf* of size *buf_len*. + * + * The whole value is copied, no matter what file position user + * space issued e.g. sys_read at. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * Return + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if current value was unavailable, e.g. because + * sysctl is uninitialized and read returns -EIO for it. + * + * long bpf_sysctl_get_new_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len) + * Description + * Get new value being written by user space to sysctl (before + * the actual write happens) and copy it as a string into + * provided by program buffer *buf* of size *buf_len*. + * + * User space may write new value at file position > 0. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * Return + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if sysctl is being read. + * + * long bpf_sysctl_set_new_value(struct bpf_sysctl *ctx, const char *buf, size_t buf_len) + * Description + * Override new value being written by user space to sysctl with + * value provided by program in buffer *buf* of size *buf_len*. + * + * *buf* should contain a string in same form as provided by user + * space on sysctl write. + * + * User space may write new value at file position > 0. To override + * the whole sysctl value file position should be set to zero. + * Return + * 0 on success. + * + * **-E2BIG** if the *buf_len* is too big. + * + * **-EINVAL** if sysctl is being read. + * + * long bpf_strtol(const char *buf, size_t buf_len, u64 flags, long *res) + * Description + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to a long integer according to the given base + * and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)) followed by a single + * optional '**-**' sign. + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtol**\ (3). + * Return + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + * + * long bpf_strtoul(const char *buf, size_t buf_len, u64 flags, unsigned long *res) + * Description + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to an unsigned long integer according to the + * given base and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)). + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtoul**\ (3). + * Return + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + * + * void *bpf_sk_storage_get(struct bpf_map *map, void *sk, void *value, u64 flags) + * Description + * Get a bpf-local-storage from a *sk*. + * + * Logically, it could be thought of getting the value from + * a *map* with *sk* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *sk*) except this + * helper enforces the key must be a full socket and the map must + * be a **BPF_MAP_TYPE_SK_STORAGE** also. + * + * Underneath, the value is stored locally at *sk* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf-local-storages residing at *sk*. + * + * *sk* is a kernel **struct sock** pointer for LSM program. + * *sk* is a **struct bpf_sock** pointer for other program types. + * + * An optional *flags* (**BPF_SK_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf-local-storage will be + * created if one does not exist. *value* can be used + * together with **BPF_SK_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf-local-storage. If *value* is + * **NULL**, the new bpf-local-storage will be zero initialized. + * Return + * A bpf-local-storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf-local-storage. + * + * long bpf_sk_storage_delete(struct bpf_map *map, void *sk) + * Description + * Delete a bpf-local-storage from a *sk*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf-local-storage cannot be found. + * **-EINVAL** if sk is not a fullsock (e.g. a request_sock). + * + * long bpf_send_signal(u32 sig) + * Description + * Send signal *sig* to the process of the current task. + * The signal may be delivered to any of this process's threads. + * Return + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + * + * s64 bpf_tcp_gen_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len) + * Description + * Try to issue a SYN cookie for the packet with corresponding + * IP/TCP headers, *iph* and *th*, on the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header with options (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** SYN cookie cannot be issued due to error + * + * **-ENOENT** SYN cookie should not be issued (no SYN flood) + * + * **-EOPNOTSUPP** kernel configuration does not enable SYN cookies + * + * **-EPROTONOSUPPORT** IP packet version is not 4 or 6 + * + * long bpf_skb_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct sk_buff. + * + * This helper is similar to **bpf_perf_event_output**\ () but + * restricted to raw_tracepoint bpf programs. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_user(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Safely attempt to read *size* bytes from user space address + * *unsafe_ptr* and store the data in *dst*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Safely attempt to read *size* bytes from kernel space address + * *unsafe_ptr* and store the data in *dst*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_probe_read_user_str(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Copy a NUL terminated string from an unsafe user address + * *unsafe_ptr* to *dst*. The *size* should include the + * terminating NUL byte. In case the string length is smaller than + * *size*, the target is not padded with further NUL bytes. If the + * string length is larger than *size*, just *size*-1 bytes are + * copied and the last byte is set to NUL. + * + * On success, returns the number of bytes that were written, + * including the terminal NUL. This makes this helper useful in + * tracing programs for reading strings, and more importantly to + * get its length at runtime. See the following snippet: + * + * :: + * + * SEC("kprobe/sys_open") + * void bpf_sys_open(struct pt_regs *ctx) + * { + * char buf[PATHLEN]; // PATHLEN is defined to 256 + * int res = bpf_probe_read_user_str(buf, sizeof(buf), + * ctx->di); + * + * // Consume buf, for example push it to + * // userspace via bpf_perf_event_output(); we + * // can use res (the string length) as event + * // size, after checking its boundaries. + * } + * + * In comparison, using **bpf_probe_read_user**\ () helper here + * instead to read the string would require to estimate the length + * at compile time, and would often result in copying more memory + * than necessary. + * + * Another useful use case is when parsing individual process + * arguments or individual environment variables navigating + * *current*\ **->mm->arg_start** and *current*\ + * **->mm->env_start**: using this helper and the return value, + * one can quickly iterate at the right offset of the memory area. + * Return + * On success, the strictly positive length of the output string, + * including the trailing NUL character. On error, a negative + * value. + * + * long bpf_probe_read_kernel_str(void *dst, u32 size, const void *unsafe_ptr) + * Description + * Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr* + * to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply. + * Return + * On success, the strictly positive length of the string, including + * the trailing NUL character. On error, a negative value. + * + * long bpf_tcp_send_ack(void *tp, u32 rcv_nxt) + * Description + * Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**. + * *rcv_nxt* is the ack_seq to be sent out. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_send_signal_thread(u32 sig) + * Description + * Send signal *sig* to the thread corresponding to the current task. + * Return + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + * + * u64 bpf_jiffies64(void) + * Description + * Obtain the 64bit jiffies + * Return + * The 64 bit jiffies + * + * long bpf_read_branch_records(struct bpf_perf_event_data *ctx, void *buf, u32 size, u64 flags) + * Description + * For an eBPF program attached to a perf event, retrieve the + * branch records (**struct perf_branch_entry**) associated to *ctx* + * and store it in the buffer pointed by *buf* up to size + * *size* bytes. + * Return + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to + * instead return the number of bytes required to store all the + * branch entries. If this flag is set, *buf* may be NULL. + * + * **-EINVAL** if arguments invalid or **size** not a multiple + * of **sizeof**\ (**struct perf_branch_entry**\ ). + * + * **-ENOENT** if architecture does not support branch records. + * + * long bpf_get_ns_current_pid_tgid(u64 dev, u64 ino, struct bpf_pidns_info *nsdata, u32 size) + * Description + * Returns 0 on success, values for *pid* and *tgid* as seen from the current + * *namespace* will be returned in *nsdata*. + * Return + * 0 on success, or one of the following in case of failure: + * + * **-EINVAL** if dev and inum supplied don't match dev_t and inode number + * with nsfs of current task, or if dev conversion to dev_t lost high bits. + * + * **-ENOENT** if pidns does not exists for the current task. + * + * long bpf_xdp_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) + * Description + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct xdp_buff. + * + * This helper is similar to **bpf_perf_eventoutput**\ () but + * restricted to raw_tracepoint bpf programs. + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_get_netns_cookie(void *ctx) + * Description + * Retrieve the cookie (generated by the kernel) of the network + * namespace the input *ctx* is associated with. The network + * namespace cookie remains stable for its lifetime and provides + * a global identifier that can be assumed unique. If *ctx* is + * NULL, then the helper returns the cookie for the initial + * network namespace. The cookie itself is very similar to that + * of **bpf_get_socket_cookie**\ () helper, but for network + * namespaces instead of sockets. + * Return + * A 8-byte long opaque number. + * + * u64 bpf_get_current_ancestor_cgroup_id(int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of the cgroup associated + * with the current task at the *ancestor_level*. The root cgroup + * is at *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with the current task, then return value will be the + * same as that of **bpf_get_current_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with the current task. + * + * The format of returned id and helper limitations are same as in + * **bpf_get_current_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * long bpf_sk_assign(struct sk_buff *skb, void *sk, u64 flags) + * Description + * Helper is overloaded depending on BPF program type. This + * description applies to **BPF_PROG_TYPE_SCHED_CLS** and + * **BPF_PROG_TYPE_SCHED_ACT** programs. + * + * Assign the *sk* to the *skb*. When combined with appropriate + * routing configuration to receive the packet towards the socket, + * will cause *skb* to be delivered to the specified socket. + * Subsequent redirection of *skb* via **bpf_redirect**\ (), + * **bpf_clone_redirect**\ () or other methods outside of BPF may + * interfere with successful delivery to the socket. + * + * This operation is only valid from TC ingress path. + * + * The *flags* argument must be zero. + * Return + * 0 on success, or a negative error in case of failure: + * + * **-EINVAL** if specified *flags* are not supported. + * + * **-ENOENT** if the socket is unavailable for assignment. + * + * **-ENETUNREACH** if the socket is unreachable (wrong netns). + * + * **-EOPNOTSUPP** if the operation is not supported, for example + * a call from outside of TC ingress. + * + * **-ESOCKTNOSUPPORT** if the socket type is not supported + * (reuseport). + * + * long bpf_sk_assign(struct bpf_sk_lookup *ctx, struct bpf_sock *sk, u64 flags) + * Description + * Helper is overloaded depending on BPF program type. This + * description applies to **BPF_PROG_TYPE_SK_LOOKUP** programs. + * + * Select the *sk* as a result of a socket lookup. + * + * For the operation to succeed passed socket must be compatible + * with the packet description provided by the *ctx* object. + * + * L4 protocol (**IPPROTO_TCP** or **IPPROTO_UDP**) must + * be an exact match. While IP family (**AF_INET** or + * **AF_INET6**) must be compatible, that is IPv6 sockets + * that are not v6-only can be selected for IPv4 packets. + * + * Only TCP listeners and UDP unconnected sockets can be + * selected. *sk* can also be NULL to reset any previous + * selection. + * + * *flags* argument can combination of following values: + * + * * **BPF_SK_LOOKUP_F_REPLACE** to override the previous + * socket selection, potentially done by a BPF program + * that ran before us. + * + * * **BPF_SK_LOOKUP_F_NO_REUSEPORT** to skip + * load-balancing within reuseport group for the socket + * being selected. + * + * On success *ctx->sk* will point to the selected socket. + * + * Return + * 0 on success, or a negative errno in case of failure. + * + * * **-EAFNOSUPPORT** if socket family (*sk->family*) is + * not compatible with packet family (*ctx->family*). + * + * * **-EEXIST** if socket has been already selected, + * potentially by another program, and + * **BPF_SK_LOOKUP_F_REPLACE** flag was not specified. + * + * * **-EINVAL** if unsupported flags were specified. + * + * * **-EPROTOTYPE** if socket L4 protocol + * (*sk->protocol*) doesn't match packet protocol + * (*ctx->protocol*). + * + * * **-ESOCKTNOSUPPORT** if socket is not in allowed + * state (TCP listening or UDP unconnected). + * + * u64 bpf_ktime_get_boot_ns(void) + * Description + * Return the time elapsed since system boot, in nanoseconds. + * Does include the time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_BOOTTIME**) + * Return + * Current *ktime*. + * + * long bpf_seq_printf(struct seq_file *m, const char *fmt, u32 fmt_size, const void *data, u32 data_len) + * Description + * **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print + * out the format string. + * The *m* represents the seq_file. The *fmt* and *fmt_size* are for + * the format string itself. The *data* and *data_len* are format string + * arguments. The *data* are a **u64** array and corresponding format string + * values are stored in the array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* array. + * The *data_len* is the size of *data* in bytes - must be a multiple of 8. + * + * Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory. + * Reading kernel memory may fail due to either invalid address or + * valid address but requiring a major memory fault. If reading kernel memory + * fails, the string for **%s** will be an empty string, and the ip + * address for **%p{i,I}{4,6}** will be 0. Not returning error to + * bpf program is consistent with what **bpf_trace_printk**\ () does for now. + * Return + * 0 on success, or a negative error in case of failure: + * + * **-EBUSY** if per-CPU memory copy buffer is busy, can try again + * by returning 1 from bpf program. + * + * **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported. + * + * **-E2BIG** if *fmt* contains too many format specifiers. + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + * + * long bpf_seq_write(struct seq_file *m, const void *data, u32 len) + * Description + * **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data. + * The *m* represents the seq_file. The *data* and *len* represent the + * data to write in bytes. + * Return + * 0 on success, or a negative error in case of failure: + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + * + * u64 bpf_sk_cgroup_id(void *sk) + * Description + * Return the cgroup v2 id of the socket *sk*. + * + * *sk* must be a non-**NULL** pointer to a socket, e.g. one + * returned from **bpf_sk_lookup_xxx**\ (), + * **bpf_sk_fullsock**\ (), etc. The format of returned id is + * same as in **bpf_skb_cgroup_id**\ (). + * + * This helper is available only if the kernel was compiled with + * the **CONFIG_SOCK_CGROUP_DATA** configuration option. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * u64 bpf_sk_ancestor_cgroup_id(void *sk, int ancestor_level) + * Description + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *sk* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *sk*, then return value will be same as that + * of **bpf_sk_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *sk*. + * + * The format of returned id and helper limitations are same as in + * **bpf_sk_cgroup_id**\ (). + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * long bpf_ringbuf_output(void *ringbuf, void *data, u64 size, u64 flags) + * Description + * Copy *size* bytes from *data* into a ring buffer *ringbuf*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * An adaptive notification is a notification sent whenever the user-space + * process has caught up and consumed all available payloads. In case the user-space + * process is still processing a previous payload, then no notification is needed + * as it will process the newly added payload automatically. + * Return + * 0 on success, or a negative error in case of failure. + * + * void *bpf_ringbuf_reserve(void *ringbuf, u64 size, u64 flags) + * Description + * Reserve *size* bytes of payload in a ring buffer *ringbuf*. + * *flags* must be 0. + * Return + * Valid pointer with *size* bytes of memory available; NULL, + * otherwise. + * + * void bpf_ringbuf_submit(void *data, u64 flags) + * Description + * Submit reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * Return + * Nothing. Always succeeds. + * + * void bpf_ringbuf_discard(void *data, u64 flags) + * Description + * Discard reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * Return + * Nothing. Always succeeds. + * + * u64 bpf_ringbuf_query(void *ringbuf, u64 flags) + * Description + * Query various characteristics of provided ring buffer. What + * exactly is queries is determined by *flags*: + * + * * **BPF_RB_AVAIL_DATA**: Amount of data not yet consumed. + * * **BPF_RB_RING_SIZE**: The size of ring buffer. + * * **BPF_RB_CONS_POS**: Consumer position (can wrap around). + * * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around). + * + * Data returned is just a momentary snapshot of actual values + * and could be inaccurate, so this facility should be used to + * power heuristics and for reporting, not to make 100% correct + * calculation. + * Return + * Requested value, or 0, if *flags* are not recognized. + * + * long bpf_csum_level(struct sk_buff *skb, u64 level) + * Description + * Change the skbs checksum level by one layer up or down, or + * reset it entirely to none in order to have the stack perform + * checksum validation. The level is applicable to the following + * protocols: TCP, UDP, GRE, SCTP, FCOE. For example, a decap of + * | ETH | IP | UDP | GUE | IP | TCP | into | ETH | IP | TCP | + * through **bpf_skb_adjust_room**\ () helper with passing in + * **BPF_F_ADJ_ROOM_NO_CSUM_RESET** flag would require one call + * to **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_DEC** since + * the UDP header is removed. Similarly, an encap of the latter + * into the former could be accompanied by a helper call to + * **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_INC** if the + * skb is still intended to be processed in higher layers of the + * stack instead of just egressing at tc. + * + * There are three supported level settings at this time: + * + * * **BPF_CSUM_LEVEL_INC**: Increases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_DEC**: Decreases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_RESET**: Resets skb->csum_level to 0 and + * sets CHECKSUM_NONE to force checksum validation by the stack. + * * **BPF_CSUM_LEVEL_QUERY**: No-op, returns the current + * skb->csum_level. + * Return + * 0 on success, or a negative error in case of failure. In the + * case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level + * is returned or the error code -EACCES in case the skb is not + * subject to CHECKSUM_UNNECESSARY. + * + * struct tcp6_sock *bpf_skc_to_tcp6_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp6_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct tcp_sock *bpf_skc_to_tcp_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct tcp_timewait_sock *bpf_skc_to_tcp_timewait_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct tcp_request_sock *bpf_skc_to_tcp_request_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * struct udp6_sock *bpf_skc_to_udp6_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *udp6_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_get_task_stack(struct task_struct *task, void *buf, u32 size, u64 flags) + * Description + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *task*, which is a valid + * pointer to **struct task_struct**. To store the stacktrace, the + * bpf program provides *buf* with a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect buildid+offset instead of ips for user stack, + * only valid if **BPF_F_USER_STACK** is also specified. + * + * **bpf_get_task_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * Return + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + * + * long bpf_load_hdr_opt(struct bpf_sock_ops *skops, void *searchby_res, u32 len, u64 flags) + * Description + * Load header option. Support reading a particular TCP header + * option for bpf program (**BPF_PROG_TYPE_SOCK_OPS**). + * + * If *flags* is 0, it will search the option from the + * *skops*\ **->skb_data**. The comment in **struct bpf_sock_ops** + * has details on what skb_data contains under different + * *skops*\ **->op**. + * + * The first byte of the *searchby_res* specifies the + * kind that it wants to search. + * + * If the searching kind is an experimental kind + * (i.e. 253 or 254 according to RFC6994). It also + * needs to specify the "magic" which is either + * 2 bytes or 4 bytes. It then also needs to + * specify the size of the magic by using + * the 2nd byte which is "kind-length" of a TCP + * header option and the "kind-length" also + * includes the first 2 bytes "kind" and "kind-length" + * itself as a normal TCP header option also does. + * + * For example, to search experimental kind 254 with + * 2 byte magic 0xeB9F, the searchby_res should be + * [ 254, 4, 0xeB, 0x9F, 0, 0, .... 0 ]. + * + * To search for the standard window scale option (3), + * the *searchby_res* should be [ 3, 0, 0, .... 0 ]. + * Note, kind-length must be 0 for regular option. + * + * Searching for No-Op (0) and End-of-Option-List (1) are + * not supported. + * + * *len* must be at least 2 bytes which is the minimal size + * of a header option. + * + * Supported flags: + * + * * **BPF_LOAD_HDR_OPT_TCP_SYN** to search from the + * saved_syn packet or the just-received syn packet. + * + * Return + * > 0 when found, the header option is copied to *searchby_res*. + * The return value is the total length copied. On failure, a + * negative error code is returned: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOMSG** if the option is not found. + * + * **-ENOENT** if no syn packet is available when + * **BPF_LOAD_HDR_OPT_TCP_SYN** is used. + * + * **-ENOSPC** if there is not enough space. Only *len* number of + * bytes are copied. + * + * **-EFAULT** on failure to parse the header options in the + * packet. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + * + * long bpf_store_hdr_opt(struct bpf_sock_ops *skops, const void *from, u32 len, u64 flags) + * Description + * Store header option. The data will be copied + * from buffer *from* with length *len* to the TCP header. + * + * The buffer *from* should have the whole option that + * includes the kind, kind-length, and the actual + * option data. The *len* must be at least kind-length + * long. The kind-length does not have to be 4 byte + * aligned. The kernel will take care of the padding + * and setting the 4 bytes aligned value to th->doff. + * + * This helper will check for duplicated option + * by searching the same option in the outgoing skb. + * + * This helper can only be called during + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * Return + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** If param is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * Nothing has been written + * + * **-EEXIST** if the option already exists. + * + * **-EFAULT** on failure to parse the existing header options. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + * + * long bpf_reserve_hdr_opt(struct bpf_sock_ops *skops, u32 len, u64 flags) + * Description + * Reserve *len* bytes for the bpf header option. The + * space will be used by **bpf_store_hdr_opt**\ () later in + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * If **bpf_reserve_hdr_opt**\ () is called multiple times, + * the total number of bytes will be reserved. + * + * This helper can only be called during + * **BPF_SOCK_OPS_HDR_OPT_LEN_CB**. + * + * Return + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + * + * void *bpf_inode_storage_get(struct bpf_map *map, void *inode, void *value, u64 flags) + * Description + * Get a bpf_local_storage from an *inode*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *inode* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *inode*) except this + * helper enforces the key must be an inode and the map must also + * be a **BPF_MAP_TYPE_INODE_STORAGE**. + * + * Underneath, the value is stored locally at *inode* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *inode*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * Return + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + * + * int bpf_inode_storage_delete(struct bpf_map *map, void *inode) + * Description + * Delete a bpf_local_storage from an *inode*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + * + * long bpf_d_path(struct path *path, char *buf, u32 sz) + * Description + * Return full path for given **struct path** object, which + * needs to be the kernel BTF *path* object. The path is + * returned in the provided buffer *buf* of size *sz* and + * is zero terminated. + * + * Return + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + * + * long bpf_copy_from_user(void *dst, u32 size, const void *user_ptr) + * Description + * Read *size* bytes from user space address *user_ptr* and store + * the data in *dst*. This is a wrapper of **copy_from_user**\ (). + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_snprintf_btf(char *str, u32 str_size, struct btf_ptr *ptr, u32 btf_ptr_size, u64 flags) + * Description + * Use BTF to store a string representation of *ptr*->ptr in *str*, + * using *ptr*->type_id. This value should specify the type + * that *ptr*->ptr points to. LLVM __builtin_btf_type_id(type, 1) + * can be used to look up vmlinux BTF type ids. Traversing the + * data structure using BTF, the type information and values are + * stored in the first *str_size* - 1 bytes of *str*. Safe copy of + * the pointer data is carried out to avoid kernel crashes during + * operation. Smaller types can use string space on the stack; + * larger programs can use map data to store the string + * representation. + * + * The string can be subsequently shared with userspace via + * bpf_perf_event_output() or ring buffer interfaces. + * bpf_trace_printk() is to be avoided as it places too small + * a limit on string size to be useful. + * + * *flags* is a combination of + * + * **BTF_F_COMPACT** + * no formatting around type information + * **BTF_F_NONAME** + * no struct/union member names/types + * **BTF_F_PTR_RAW** + * show raw (unobfuscated) pointer values; + * equivalent to printk specifier %px. + * **BTF_F_ZERO** + * show zero-valued struct/union members; they + * are not displayed by default + * + * Return + * The number of bytes that were written (or would have been + * written if output had to be truncated due to string size), + * or a negative error in cases of failure. + * + * long bpf_seq_printf_btf(struct seq_file *m, struct btf_ptr *ptr, u32 ptr_size, u64 flags) + * Description + * Use BTF to write to seq_write a string representation of + * *ptr*->ptr, using *ptr*->type_id as per bpf_snprintf_btf(). + * *flags* are identical to those used for bpf_snprintf_btf. + * Return + * 0 on success or a negative error in case of failure. + * + * u64 bpf_skb_cgroup_classid(struct sk_buff *skb) + * Description + * See **bpf_get_cgroup_classid**\ () for the main description. + * This helper differs from **bpf_get_cgroup_classid**\ () in that + * the cgroup v1 net_cls class is retrieved only from the *skb*'s + * associated socket instead of the current process. + * Return + * The id is returned or 0 in case the id could not be retrieved. + * + * long bpf_redirect_neigh(u32 ifindex, struct bpf_redir_neigh *params, int plen, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex* + * and fill in L2 addresses from neighboring subsystem. This helper + * is somewhat similar to **bpf_redirect**\ (), except that it + * populates L2 addresses as well, meaning, internally, the helper + * relies on the neighbor lookup for the L2 address of the nexthop. + * + * The helper will perform a FIB lookup based on the skb's + * networking header to get the address of the next hop, unless + * this is supplied by the caller in the *params* argument. The + * *plen* argument indicates the len of *params* and should be set + * to 0 if *params* is NULL. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types, and enabled + * for IPv4 and IPv6 protocols. + * Return + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + * + * void *bpf_per_cpu_ptr(const void *percpu_ptr, u32 cpu) + * Description + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on *cpu*. A ksym is an + * extern variable decorated with '__ksym'. For ksym, there is a + * global var (either static or global) defined of the same name + * in the kernel. The ksym is percpu if the global var is percpu. + * The returned pointer points to the global percpu var on *cpu*. + * + * bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the + * kernel, except that bpf_per_cpu_ptr() may return NULL. This + * happens if *cpu* is larger than nr_cpu_ids. The caller of + * bpf_per_cpu_ptr() must check the returned value. + * Return + * A pointer pointing to the kernel percpu variable on *cpu*, or + * NULL, if *cpu* is invalid. + * + * void *bpf_this_cpu_ptr(const void *percpu_ptr) + * Description + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on this cpu. See the + * description of 'ksym' in **bpf_per_cpu_ptr**\ (). + * + * bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in + * the kernel. Different from **bpf_per_cpu_ptr**\ (), it would + * never return NULL. + * Return + * A pointer pointing to the kernel percpu variable on this cpu. + * + * long bpf_redirect_peer(u32 ifindex, u64 flags) + * Description + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_redirect**\ (), except + * that the redirection happens to the *ifindex*' peer device and + * the netns switch takes place from ingress to ingress without + * going through the CPU's backlog queue. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types at the ingress + * hook and for veth device types. The peer device must reside in a + * different network namespace. + * Return + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + * + * void *bpf_task_storage_get(struct bpf_map *map, struct task_struct *task, void *value, u64 flags) + * Description + * Get a bpf_local_storage from the *task*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *task* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *task*) except this + * helper enforces the key must be a task_struct and the map must also + * be a **BPF_MAP_TYPE_TASK_STORAGE**. + * + * Underneath, the value is stored locally at *task* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *task*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * Return + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + * + * long bpf_task_storage_delete(struct bpf_map *map, struct task_struct *task) + * Description + * Delete a bpf_local_storage from a *task*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + * + * struct task_struct *bpf_get_current_task_btf(void) + * Description + * Return a BTF pointer to the "current" task. + * This pointer can also be used in helpers that accept an + * *ARG_PTR_TO_BTF_ID* of type *task_struct*. + * Return + * Pointer to the current task. + * + * long bpf_bprm_opts_set(struct linux_binprm *bprm, u64 flags) + * Description + * Set or clear certain options on *bprm*: + * + * **BPF_F_BPRM_SECUREEXEC** Set the secureexec bit + * which sets the **AT_SECURE** auxv for glibc. The bit + * is cleared if the flag is not specified. + * Return + * **-EINVAL** if invalid *flags* are passed, zero otherwise. + * + * u64 bpf_ktime_get_coarse_ns(void) + * Description + * Return a coarse-grained version of the time elapsed since + * system boot, in nanoseconds. Does not include time the system + * was suspended. + * + * See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**) + * Return + * Current *ktime*. + * + * long bpf_ima_inode_hash(struct inode *inode, void *dst, u32 size) + * Description + * Returns the stored IMA hash of the *inode* (if it's available). + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * Return + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if + * invalid arguments are passed. + * + * struct socket *bpf_sock_from_file(struct file *file) + * Description + * If the given file represents a socket, returns the associated + * socket. + * Return + * A pointer to a struct socket on success or NULL if the file is + * not a socket. + * + * long bpf_check_mtu(void *ctx, u32 ifindex, u32 *mtu_len, s32 len_diff, u64 flags) + * Description + * Check packet size against exceeding MTU of net device (based + * on *ifindex*). This helper will likely be used in combination + * with helpers that adjust/change the packet size. + * + * The argument *len_diff* can be used for querying with a planned + * size change. This allows to check MTU prior to changing packet + * ctx. Providing a *len_diff* adjustment that is larger than the + * actual packet size (resulting in negative packet size) will in + * principle not exceed the MTU, which is why it is not considered + * a failure. Other BPF helpers are needed for performing the + * planned size change; therefore the responsibility for catching + * a negative packet size belongs in those helpers. + * + * Specifying *ifindex* zero means the MTU check is performed + * against the current net device. This is practical if this isn't + * used prior to redirect. + * + * On input *mtu_len* must be a valid pointer, else verifier will + * reject BPF program. If the value *mtu_len* is initialized to + * zero then the ctx packet size is use. When value *mtu_len* is + * provided as input this specify the L3 length that the MTU check + * is done against. Remember XDP and TC length operate at L2, but + * this value is L3 as this correlate to MTU and IP-header tot_len + * values which are L3 (similar behavior as bpf_fib_lookup). + * + * The Linux kernel route table can configure MTUs on a more + * specific per route level, which is not provided by this helper. + * For route level MTU checks use the **bpf_fib_lookup**\ () + * helper. + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** for tc cls_act programs. + * + * The *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_MTU_CHK_SEGS** + * This flag will only works for *ctx* **struct sk_buff**. + * If packet context contains extra packet segment buffers + * (often knows as GSO skb), then MTU check is harder to + * check at this point, because in transmit path it is + * possible for the skb packet to get re-segmented + * (depending on net device features). This could still be + * a MTU violation, so this flag enables performing MTU + * check against segments, with a different violation + * return code to tell it apart. Check cannot use len_diff. + * + * On return *mtu_len* pointer contains the MTU value of the net + * device. Remember the net device configured MTU is the L3 size, + * which is returned here and XDP and TC length operate at L2. + * Helper take this into account for you, but remember when using + * MTU value in your BPF-code. + * + * Return + * * 0 on success, and populate MTU value in *mtu_len* pointer. + * + * * < 0 if any input argument is invalid (*mtu_len* not updated) + * + * MTU violations return positive values, but also populate MTU + * value in *mtu_len* pointer, as this can be needed for + * implementing PMTU handing: + * + * * **BPF_MTU_CHK_RET_FRAG_NEEDED** + * * **BPF_MTU_CHK_RET_SEGS_TOOBIG** + * + * long bpf_for_each_map_elem(struct bpf_map *map, void *callback_fn, void *callback_ctx, u64 flags) + * Description + * For each element in **map**, call **callback_fn** function with + * **map**, **callback_ctx** and other map-specific parameters. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. + * + * The following are a list of supported map types and their + * respective expected callback signatures: + * + * BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_PERCPU_HASH, + * BPF_MAP_TYPE_LRU_HASH, BPF_MAP_TYPE_LRU_PERCPU_HASH, + * BPF_MAP_TYPE_ARRAY, BPF_MAP_TYPE_PERCPU_ARRAY + * + * long (\*callback_fn)(struct bpf_map \*map, const void \*key, void \*value, void \*ctx); + * + * For per_cpu maps, the map_value is the value on the cpu where the + * bpf_prog is running. + * + * If **callback_fn** return 0, the helper will continue to the next + * element. If return value is 1, the helper will skip the rest of + * elements and return. Other return values are not used now. + * + * Return + * The number of traversed map elements for success, **-EINVAL** for + * invalid **flags**. + * + * long bpf_snprintf(char *str, u32 str_size, const char *fmt, u64 *data, u32 data_len) + * Description + * Outputs a string into the **str** buffer of size **str_size** + * based on a format string stored in a read-only map pointed by + * **fmt**. + * + * Each format specifier in **fmt** corresponds to one u64 element + * in the **data** array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* + * array. The *data_len* is the size of *data* in bytes - must be + * a multiple of 8. + * + * Formats **%s** and **%p{i,I}{4,6}** require to read kernel + * memory. Reading kernel memory may fail due to either invalid + * address or valid address but requiring a major memory fault. If + * reading kernel memory fails, the string for **%s** will be an + * empty string, and the ip address for **%p{i,I}{4,6}** will be 0. + * Not returning error to bpf program is consistent with what + * **bpf_trace_printk**\ () does for now. + * + * Return + * The strictly positive length of the formatted string, including + * the trailing zero character. If the return value is greater than + * **str_size**, **str** contains a truncated string, guaranteed to + * be zero-terminated except when **str_size** is 0. + * + * Or **-EBUSY** if the per-CPU memory copy buffer is busy. + * + * long bpf_sys_bpf(u32 cmd, void *attr, u32 attr_size) + * Description + * Execute bpf syscall with given arguments. + * Return + * A syscall result. + * + * long bpf_btf_find_by_name_kind(char *name, int name_sz, u32 kind, int flags) + * Description + * Find BTF type with given name and kind in vmlinux BTF or in module's BTFs. + * Return + * Returns btf_id and btf_obj_fd in lower and upper 32 bits. + * + * long bpf_sys_close(u32 fd) + * Description + * Execute close syscall for given FD. + * Return + * A syscall result. + * + * long bpf_timer_init(struct bpf_timer *timer, struct bpf_map *map, u64 flags) + * Description + * Initialize the timer. + * First 4 bits of *flags* specify clockid. + * Only CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME are allowed. + * All other bits of *flags* are reserved. + * The verifier will reject the program if *timer* is not from + * the same *map*. + * Return + * 0 on success. + * **-EBUSY** if *timer* is already initialized. + * **-EINVAL** if invalid *flags* are passed. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + * + * long bpf_timer_set_callback(struct bpf_timer *timer, void *callback_fn) + * Description + * Configure the timer to call *callback_fn* static function. + * Return + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + * + * long bpf_timer_start(struct bpf_timer *timer, u64 nsecs, u64 flags) + * Description + * Set timer expiration N nanoseconds from the current time. The + * configured callback will be invoked in soft irq context on some cpu + * and will not repeat unless another bpf_timer_start() is made. + * In such case the next invocation can migrate to a different cpu. + * Since struct bpf_timer is a field inside map element the map + * owns the timer. The bpf_timer_set_callback() will increment refcnt + * of BPF program to make sure that callback_fn code stays valid. + * When user space reference to a map reaches zero all timers + * in a map are cancelled and corresponding program's refcnts are + * decremented. This is done to make sure that Ctrl-C of a user + * process doesn't leave any timers running. If map is pinned in + * bpffs the callback_fn can re-arm itself indefinitely. + * bpf_map_update/delete_elem() helpers and user space sys_bpf commands + * cancel and free the timer in the given map element. + * The map can contain timers that invoke callback_fn-s from different + * programs. The same callback_fn can serve different timers from + * different maps if key/value layout matches across maps. + * Every bpf_timer_set_callback() can have different callback_fn. + * + * *flags* can be one of: + * + * **BPF_F_TIMER_ABS** + * Start the timer in absolute expire value instead of the + * default relative one. + * + * Return + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier + * or invalid *flags* are passed. + * + * long bpf_timer_cancel(struct bpf_timer *timer) + * Description + * Cancel the timer and wait for callback_fn to finish if it was running. + * Return + * 0 if the timer was not active. + * 1 if the timer was active. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its + * own timer which would have led to a deadlock otherwise. + * + * u64 bpf_get_func_ip(void *ctx) + * Description + * Get address of the traced function (for tracing and kprobe programs). + * Return + * Address of the traced function. + * 0 for kprobes placed within the function (not at the entry). + * + * u64 bpf_get_attach_cookie(void *ctx) + * Description + * Get bpf_cookie value provided (optionally) during the program + * attachment. It might be different for each individual + * attachment, even if BPF program itself is the same. + * Expects BPF program context *ctx* as a first argument. + * + * Supported for the following program types: + * - kprobe/uprobe; + * - tracepoint; + * - perf_event. + * Return + * Value specified by user at BPF link creation/attachment time + * or 0, if it was not specified. + * + * long bpf_task_pt_regs(struct task_struct *task) + * Description + * Get the struct pt_regs associated with **task**. + * Return + * A pointer to struct pt_regs. + * + * long bpf_get_branch_snapshot(void *entries, u32 size, u64 flags) + * Description + * Get branch trace from hardware engines like Intel LBR. The + * hardware engine is stopped shortly after the helper is + * called. Therefore, the user need to filter branch entries + * based on the actual use case. To capture branch trace + * before the trigger point of the BPF program, the helper + * should be called at the beginning of the BPF program. + * + * The data is stored as struct perf_branch_entry into output + * buffer *entries*. *size* is the size of *entries* in bytes. + * *flags* is reserved for now and must be zero. + * + * Return + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-ENOENT** if architecture does not support branch records. + * + * long bpf_trace_vprintk(const char *fmt, u32 fmt_size, const void *data, u32 data_len) + * Description + * Behaves like **bpf_trace_printk**\ () helper, but takes an array of u64 + * to format and can handle more format args as a result. + * + * Arguments are to be used as in **bpf_seq_printf**\ () helper. + * Return + * The number of bytes written to the buffer, or a negative error + * in case of failure. + * + * struct unix_sock *bpf_skc_to_unix_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *unix_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_kallsyms_lookup_name(const char *name, int name_sz, int flags, u64 *res) + * Description + * Get the address of a kernel symbol, returned in *res*. *res* is + * set to 0 if the symbol is not found. + * Return + * On success, zero. On error, a negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-EINVAL** if string *name* is not the same size as *name_sz*. + * + * **-ENOENT** if symbol is not found. + * + * **-EPERM** if caller does not have permission to obtain kernel address. + * + * long bpf_find_vma(struct task_struct *task, u64 addr, void *callback_fn, void *callback_ctx, u64 flags) + * Description + * Find vma of *task* that contains *addr*, call *callback_fn* + * function with *task*, *vma*, and *callback_ctx*. + * The *callback_fn* should be a static function and + * the *callback_ctx* should be a pointer to the stack. + * The *flags* is used to control certain aspects of the helper. + * Currently, the *flags* must be 0. + * + * The expected callback signature is + * + * long (\*callback_fn)(struct task_struct \*task, struct vm_area_struct \*vma, void \*callback_ctx); + * + * Return + * 0 on success. + * **-ENOENT** if *task->mm* is NULL, or no vma contains *addr*. + * **-EBUSY** if failed to try lock mmap_lock. + * **-EINVAL** for invalid **flags**. + * + * long bpf_loop(u32 nr_loops, void *callback_fn, void *callback_ctx, u64 flags) + * Description + * For **nr_loops**, call **callback_fn** function + * with **callback_ctx** as the context parameter. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. Currently, nr_loops is + * limited to 1 << 23 (~8 million) loops. + * + * long (\*callback_fn)(u32 index, void \*ctx); + * + * where **index** is the current index in the loop. The index + * is zero-indexed. + * + * If **callback_fn** returns 0, the helper will continue to the next + * loop. If return value is 1, the helper will skip the rest of + * the loops and return. Other return values are not used now, + * and will be rejected by the verifier. + * + * Return + * The number of loops performed, **-EINVAL** for invalid **flags**, + * **-E2BIG** if **nr_loops** exceeds the maximum number of loops. + * + * long bpf_strncmp(const char *s1, u32 s1_sz, const char *s2) + * Description + * Do strncmp() between **s1** and **s2**. **s1** doesn't need + * to be null-terminated and **s1_sz** is the maximum storage + * size of **s1**. **s2** must be a read-only string. + * Return + * An integer less than, equal to, or greater than zero + * if the first **s1_sz** bytes of **s1** is found to be + * less than, to match, or be greater than **s2**. + * + * long bpf_get_func_arg(void *ctx, u32 n, u64 *value) + * Description + * Get **n**-th argument register (zero based) of the traced function (for tracing programs) + * returned in **value**. + * + * Return + * 0 on success. + * **-EINVAL** if n >= argument register count of traced function. + * + * long bpf_get_func_ret(void *ctx, u64 *value) + * Description + * Get return value of the traced function (for tracing programs) + * in **value**. + * + * Return + * 0 on success. + * **-EOPNOTSUPP** for tracing programs other than BPF_TRACE_FEXIT or BPF_MODIFY_RETURN. + * + * long bpf_get_func_arg_cnt(void *ctx) + * Description + * Get number of registers of the traced function (for tracing programs) where + * function arguments are stored in these registers. + * + * Return + * The number of argument registers of the traced function. + * + * int bpf_get_retval(void) + * Description + * Get the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * Return + * The BPF program's return value. + * + * int bpf_set_retval(int retval) + * Description + * Set the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * + * Note that there is the following corner case where the program exports an error + * via bpf_set_retval but signals success via 'return 1': + * + * bpf_set_retval(-EPERM); + * return 1; + * + * In this case, the BPF program's return value will use helper's -EPERM. This + * still holds true for cgroup/bind{4,6} which supports extra 'return 3' success case. + * + * Return + * 0 on success, or a negative error in case of failure. + * + * u64 bpf_xdp_get_buff_len(struct xdp_buff *xdp_md) + * Description + * Get the total size of a given xdp buff (linear and paged area) + * Return + * The total size of a given xdp buffer. + * + * long bpf_xdp_load_bytes(struct xdp_buff *xdp_md, u32 offset, void *buf, u32 len) + * Description + * This helper is provided as an easy way to load data from a + * xdp buffer. It can be used to load *len* bytes from *offset* from + * the frame associated to *xdp_md*, into the buffer pointed by + * *buf*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_xdp_store_bytes(struct xdp_buff *xdp_md, u32 offset, void *buf, u32 len) + * Description + * Store *len* bytes from buffer *buf* into the frame + * associated to *xdp_md*, at *offset*. + * Return + * 0 on success, or a negative error in case of failure. + * + * long bpf_copy_from_user_task(void *dst, u32 size, const void *user_ptr, struct task_struct *tsk, u64 flags) + * Description + * Read *size* bytes from user space address *user_ptr* in *tsk*'s + * address space, and stores the data in *dst*. *flags* is not + * used yet and is provided for future extensibility. This helper + * can only be used by sleepable programs. + * Return + * 0 on success, or a negative error in case of failure. On error + * *dst* buffer is zeroed out. + * + * long bpf_skb_set_tstamp(struct sk_buff *skb, u64 tstamp, u32 tstamp_type) + * Description + * Change the __sk_buff->tstamp_type to *tstamp_type* + * and set *tstamp* to the __sk_buff->tstamp together. + * + * If there is no need to change the __sk_buff->tstamp_type, + * the tstamp value can be directly written to __sk_buff->tstamp + * instead. + * + * BPF_SKB_TSTAMP_DELIVERY_MONO is the only tstamp that + * will be kept during bpf_redirect_*(). A non zero + * *tstamp* must be used with the BPF_SKB_TSTAMP_DELIVERY_MONO + * *tstamp_type*. + * + * A BPF_SKB_TSTAMP_UNSPEC *tstamp_type* can only be used + * with a zero *tstamp*. + * + * Only IPv4 and IPv6 skb->protocol are supported. + * + * This function is most useful when it needs to set a + * mono delivery time to __sk_buff->tstamp and then + * bpf_redirect_*() to the egress of an iface. For example, + * changing the (rcv) timestamp in __sk_buff->tstamp at + * ingress to a mono delivery time and then bpf_redirect_*() + * to sch_fq@phy-dev. + * Return + * 0 on success. + * **-EINVAL** for invalid input + * **-EOPNOTSUPP** for unsupported protocol + * + * long bpf_ima_file_hash(struct file *file, void *dst, u32 size) + * Description + * Returns a calculated IMA hash of the *file*. + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * Return + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if + * invalid arguments are passed. + * + * void *bpf_kptr_xchg(void *map_value, void *ptr) + * Description + * Exchange kptr at pointer *map_value* with *ptr*, and return the + * old value. *ptr* can be NULL, otherwise it must be a referenced + * pointer which will be released when this helper is called. + * Return + * The old value of kptr (which can be NULL). The returned pointer + * if not NULL, is a reference which must be released using its + * corresponding release function, or moved into a BPF map before + * program exit. + * + * void *bpf_map_lookup_percpu_elem(struct bpf_map *map, const void *key, u32 cpu) + * Description + * Perform a lookup in *percpu map* for an entry associated to + * *key* on *cpu*. + * Return + * Map value associated to *key* on *cpu*, or **NULL** if no entry + * was found or *cpu* is invalid. + * + * struct mptcp_sock *bpf_skc_to_mptcp_sock(void *sk) + * Description + * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. + * Return + * *sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_dynptr_from_mem(void *data, u32 size, u64 flags, struct bpf_dynptr *ptr) + * Description + * Get a dynptr to local memory *data*. + * + * *data* must be a ptr to a map value. + * The maximum *size* supported is DYNPTR_MAX_SIZE. + * *flags* is currently unused. + * Return + * 0 on success, -E2BIG if the size exceeds DYNPTR_MAX_SIZE, + * -EINVAL if flags is not 0. + * + * long bpf_ringbuf_reserve_dynptr(void *ringbuf, u32 size, u64 flags, struct bpf_dynptr *ptr) + * Description + * Reserve *size* bytes of payload in a ring buffer *ringbuf* + * through the dynptr interface. *flags* must be 0. + * + * Please note that a corresponding bpf_ringbuf_submit_dynptr or + * bpf_ringbuf_discard_dynptr must be called on *ptr*, even if the + * reservation fails. This is enforced by the verifier. + * Return + * 0 on success, or a negative error in case of failure. + * + * void bpf_ringbuf_submit_dynptr(struct bpf_dynptr *ptr, u64 flags) + * Description + * Submit reserved ring buffer sample, pointed to by *data*, + * through the dynptr interface. This is a no-op if the dynptr is + * invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_submit'. + * Return + * Nothing. Always succeeds. + * + * void bpf_ringbuf_discard_dynptr(struct bpf_dynptr *ptr, u64 flags) + * Description + * Discard reserved ring buffer sample through the dynptr + * interface. This is a no-op if the dynptr is invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_discard'. + * Return + * Nothing. Always succeeds. + * + * long bpf_dynptr_read(void *dst, u32 len, const struct bpf_dynptr *src, u32 offset, u64 flags) + * Description + * Read *len* bytes from *src* into *dst*, starting from *offset* + * into *src*. + * *flags* is currently unused. + * Return + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *src*'s data, -EINVAL if *src* is an invalid dynptr or if + * *flags* is not 0. + * + * long bpf_dynptr_write(const struct bpf_dynptr *dst, u32 offset, void *src, u32 len, u64 flags) + * Description + * Write *len* bytes from *src* into *dst*, starting from *offset* + * into *dst*. + * + * *flags* must be 0 except for skb-type dynptrs. + * + * For skb-type dynptrs: + * * All data slices of the dynptr are automatically + * invalidated after **bpf_dynptr_write**\ (). This is + * because writing may pull the skb and change the + * underlying packet buffer. + * + * * For *flags*, please see the flags accepted by + * **bpf_skb_store_bytes**\ (). + * Return + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *dst*'s data, -EINVAL if *dst* is an invalid dynptr or if *dst* + * is a read-only dynptr or if *flags* is not correct. For skb-type dynptrs, + * other errors correspond to errors returned by **bpf_skb_store_bytes**\ (). + * + * void *bpf_dynptr_data(const struct bpf_dynptr *ptr, u32 offset, u32 len) + * Description + * Get a pointer to the underlying dynptr data. + * + * *len* must be a statically known value. The returned data slice + * is invalidated whenever the dynptr is invalidated. + * + * skb and xdp type dynptrs may not use bpf_dynptr_data. They should + * instead use bpf_dynptr_slice and bpf_dynptr_slice_rdwr. + * Return + * Pointer to the underlying dynptr data, NULL if the dynptr is + * read-only, if the dynptr is invalid, or if the offset and length + * is out of bounds. + * + * s64 bpf_tcp_raw_gen_syncookie_ipv4(struct iphdr *iph, struct tcphdr *th, u32 th_len) + * Description + * Try to issue a SYN cookie for the packet with corresponding + * IPv4/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + * + * s64 bpf_tcp_raw_gen_syncookie_ipv6(struct ipv6hdr *iph, struct tcphdr *th, u32 th_len) + * Description + * Try to issue a SYN cookie for the packet with corresponding + * IPv6/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * Return + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + * + * long bpf_tcp_raw_check_syncookie_ipv4(struct iphdr *iph, struct tcphdr *th) + * Description + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the TCP header. + * Return + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + * + * long bpf_tcp_raw_check_syncookie_ipv6(struct ipv6hdr *iph, struct tcphdr *th) + * Description + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the TCP header. + * Return + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + * + * u64 bpf_ktime_get_tai_ns(void) + * Description + * A nonsettable system-wide clock derived from wall-clock time but + * ignoring leap seconds. This clock does not experience + * discontinuities and backwards jumps caused by NTP inserting leap + * seconds as CLOCK_REALTIME does. + * + * See: **clock_gettime**\ (**CLOCK_TAI**) + * Return + * Current *ktime*. + * + * long bpf_user_ringbuf_drain(struct bpf_map *map, void *callback_fn, void *ctx, u64 flags) + * Description + * Drain samples from the specified user ring buffer, and invoke + * the provided callback for each such sample: + * + * long (\*callback_fn)(const struct bpf_dynptr \*dynptr, void \*ctx); + * + * If **callback_fn** returns 0, the helper will continue to try + * and drain the next sample, up to a maximum of + * BPF_MAX_USER_RINGBUF_SAMPLES samples. If the return value is 1, + * the helper will skip the rest of the samples and return. Other + * return values are not used now, and will be rejected by the + * verifier. + * Return + * The number of drained samples if no error was encountered while + * draining samples, or 0 if no samples were present in the ring + * buffer. If a user-space producer was epoll-waiting on this map, + * and at least one sample was drained, they will receive an event + * notification notifying them of available space in the ring + * buffer. If the BPF_RB_NO_WAKEUP flag is passed to this + * function, no wakeup notification will be sent. If the + * BPF_RB_FORCE_WAKEUP flag is passed, a wakeup notification will + * be sent even if no sample was drained. + * + * On failure, the returned value is one of the following: + * + * **-EBUSY** if the ring buffer is contended, and another calling + * context was concurrently draining the ring buffer. + * + * **-EINVAL** if user-space is not properly tracking the ring + * buffer due to the producer position not being aligned to 8 + * bytes, a sample not being aligned to 8 bytes, or the producer + * position not matching the advertised length of a sample. + * + * **-E2BIG** if user-space has tried to publish a sample which is + * larger than the size of the ring buffer, or which cannot fit + * within a struct bpf_dynptr. + * + * void *bpf_cgrp_storage_get(struct bpf_map *map, struct cgroup *cgroup, void *value, u64 flags) + * Description + * Get a bpf_local_storage from the *cgroup*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *cgroup* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *cgroup*) except this + * helper enforces the key must be a cgroup struct and the map must also + * be a **BPF_MAP_TYPE_CGRP_STORAGE**. + * + * In reality, the local-storage value is embedded directly inside of the + * *cgroup* object itself, rather than being located in the + * **BPF_MAP_TYPE_CGRP_STORAGE** map. When the local-storage value is + * queried for some *map* on a *cgroup* object, the kernel will perform an + * O(n) iteration over all of the live local-storage values for that + * *cgroup* object until the local-storage value for the *map* is found. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * Return + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + * + * long bpf_cgrp_storage_delete(struct bpf_map *map, struct cgroup *cgroup) + * Description + * Delete a bpf_local_storage from a *cgroup*. + * Return + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +#define ___BPF_FUNC_MAPPER(FN, ctx...) \ + FN(unspec, 0, ##ctx) \ + FN(map_lookup_elem, 1, ##ctx) \ + FN(map_update_elem, 2, ##ctx) \ + FN(map_delete_elem, 3, ##ctx) \ + FN(probe_read, 4, ##ctx) \ + FN(ktime_get_ns, 5, ##ctx) \ + FN(trace_printk, 6, ##ctx) \ + FN(get_prandom_u32, 7, ##ctx) \ + FN(get_smp_processor_id, 8, ##ctx) \ + FN(skb_store_bytes, 9, ##ctx) \ + FN(l3_csum_replace, 10, ##ctx) \ + FN(l4_csum_replace, 11, ##ctx) \ + FN(tail_call, 12, ##ctx) \ + FN(clone_redirect, 13, ##ctx) \ + FN(get_current_pid_tgid, 14, ##ctx) \ + FN(get_current_uid_gid, 15, ##ctx) \ + FN(get_current_comm, 16, ##ctx) \ + FN(get_cgroup_classid, 17, ##ctx) \ + FN(skb_vlan_push, 18, ##ctx) \ + FN(skb_vlan_pop, 19, ##ctx) \ + FN(skb_get_tunnel_key, 20, ##ctx) \ + FN(skb_set_tunnel_key, 21, ##ctx) \ + FN(perf_event_read, 22, ##ctx) \ + FN(redirect, 23, ##ctx) \ + FN(get_route_realm, 24, ##ctx) \ + FN(perf_event_output, 25, ##ctx) \ + FN(skb_load_bytes, 26, ##ctx) \ + FN(get_stackid, 27, ##ctx) \ + FN(csum_diff, 28, ##ctx) \ + FN(skb_get_tunnel_opt, 29, ##ctx) \ + FN(skb_set_tunnel_opt, 30, ##ctx) \ + FN(skb_change_proto, 31, ##ctx) \ + FN(skb_change_type, 32, ##ctx) \ + FN(skb_under_cgroup, 33, ##ctx) \ + FN(get_hash_recalc, 34, ##ctx) \ + FN(get_current_task, 35, ##ctx) \ + FN(probe_write_user, 36, ##ctx) \ + FN(current_task_under_cgroup, 37, ##ctx) \ + FN(skb_change_tail, 38, ##ctx) \ + FN(skb_pull_data, 39, ##ctx) \ + FN(csum_update, 40, ##ctx) \ + FN(set_hash_invalid, 41, ##ctx) \ + FN(get_numa_node_id, 42, ##ctx) \ + FN(skb_change_head, 43, ##ctx) \ + FN(xdp_adjust_head, 44, ##ctx) \ + FN(probe_read_str, 45, ##ctx) \ + FN(get_socket_cookie, 46, ##ctx) \ + FN(get_socket_uid, 47, ##ctx) \ + FN(set_hash, 48, ##ctx) \ + FN(setsockopt, 49, ##ctx) \ + FN(skb_adjust_room, 50, ##ctx) \ + FN(redirect_map, 51, ##ctx) \ + FN(sk_redirect_map, 52, ##ctx) \ + FN(sock_map_update, 53, ##ctx) \ + FN(xdp_adjust_meta, 54, ##ctx) \ + FN(perf_event_read_value, 55, ##ctx) \ + FN(perf_prog_read_value, 56, ##ctx) \ + FN(getsockopt, 57, ##ctx) \ + FN(override_return, 58, ##ctx) \ + FN(sock_ops_cb_flags_set, 59, ##ctx) \ + FN(msg_redirect_map, 60, ##ctx) \ + FN(msg_apply_bytes, 61, ##ctx) \ + FN(msg_cork_bytes, 62, ##ctx) \ + FN(msg_pull_data, 63, ##ctx) \ + FN(bind, 64, ##ctx) \ + FN(xdp_adjust_tail, 65, ##ctx) \ + FN(skb_get_xfrm_state, 66, ##ctx) \ + FN(get_stack, 67, ##ctx) \ + FN(skb_load_bytes_relative, 68, ##ctx) \ + FN(fib_lookup, 69, ##ctx) \ + FN(sock_hash_update, 70, ##ctx) \ + FN(msg_redirect_hash, 71, ##ctx) \ + FN(sk_redirect_hash, 72, ##ctx) \ + FN(lwt_push_encap, 73, ##ctx) \ + FN(lwt_seg6_store_bytes, 74, ##ctx) \ + FN(lwt_seg6_adjust_srh, 75, ##ctx) \ + FN(lwt_seg6_action, 76, ##ctx) \ + FN(rc_repeat, 77, ##ctx) \ + FN(rc_keydown, 78, ##ctx) \ + FN(skb_cgroup_id, 79, ##ctx) \ + FN(get_current_cgroup_id, 80, ##ctx) \ + FN(get_local_storage, 81, ##ctx) \ + FN(sk_select_reuseport, 82, ##ctx) \ + FN(skb_ancestor_cgroup_id, 83, ##ctx) \ + FN(sk_lookup_tcp, 84, ##ctx) \ + FN(sk_lookup_udp, 85, ##ctx) \ + FN(sk_release, 86, ##ctx) \ + FN(map_push_elem, 87, ##ctx) \ + FN(map_pop_elem, 88, ##ctx) \ + FN(map_peek_elem, 89, ##ctx) \ + FN(msg_push_data, 90, ##ctx) \ + FN(msg_pop_data, 91, ##ctx) \ + FN(rc_pointer_rel, 92, ##ctx) \ + FN(spin_lock, 93, ##ctx) \ + FN(spin_unlock, 94, ##ctx) \ + FN(sk_fullsock, 95, ##ctx) \ + FN(tcp_sock, 96, ##ctx) \ + FN(skb_ecn_set_ce, 97, ##ctx) \ + FN(get_listener_sock, 98, ##ctx) \ + FN(skc_lookup_tcp, 99, ##ctx) \ + FN(tcp_check_syncookie, 100, ##ctx) \ + FN(sysctl_get_name, 101, ##ctx) \ + FN(sysctl_get_current_value, 102, ##ctx) \ + FN(sysctl_get_new_value, 103, ##ctx) \ + FN(sysctl_set_new_value, 104, ##ctx) \ + FN(strtol, 105, ##ctx) \ + FN(strtoul, 106, ##ctx) \ + FN(sk_storage_get, 107, ##ctx) \ + FN(sk_storage_delete, 108, ##ctx) \ + FN(send_signal, 109, ##ctx) \ + FN(tcp_gen_syncookie, 110, ##ctx) \ + FN(skb_output, 111, ##ctx) \ + FN(probe_read_user, 112, ##ctx) \ + FN(probe_read_kernel, 113, ##ctx) \ + FN(probe_read_user_str, 114, ##ctx) \ + FN(probe_read_kernel_str, 115, ##ctx) \ + FN(tcp_send_ack, 116, ##ctx) \ + FN(send_signal_thread, 117, ##ctx) \ + FN(jiffies64, 118, ##ctx) \ + FN(read_branch_records, 119, ##ctx) \ + FN(get_ns_current_pid_tgid, 120, ##ctx) \ + FN(xdp_output, 121, ##ctx) \ + FN(get_netns_cookie, 122, ##ctx) \ + FN(get_current_ancestor_cgroup_id, 123, ##ctx) \ + FN(sk_assign, 124, ##ctx) \ + FN(ktime_get_boot_ns, 125, ##ctx) \ + FN(seq_printf, 126, ##ctx) \ + FN(seq_write, 127, ##ctx) \ + FN(sk_cgroup_id, 128, ##ctx) \ + FN(sk_ancestor_cgroup_id, 129, ##ctx) \ + FN(ringbuf_output, 130, ##ctx) \ + FN(ringbuf_reserve, 131, ##ctx) \ + FN(ringbuf_submit, 132, ##ctx) \ + FN(ringbuf_discard, 133, ##ctx) \ + FN(ringbuf_query, 134, ##ctx) \ + FN(csum_level, 135, ##ctx) \ + FN(skc_to_tcp6_sock, 136, ##ctx) \ + FN(skc_to_tcp_sock, 137, ##ctx) \ + FN(skc_to_tcp_timewait_sock, 138, ##ctx) \ + FN(skc_to_tcp_request_sock, 139, ##ctx) \ + FN(skc_to_udp6_sock, 140, ##ctx) \ + FN(get_task_stack, 141, ##ctx) \ + FN(load_hdr_opt, 142, ##ctx) \ + FN(store_hdr_opt, 143, ##ctx) \ + FN(reserve_hdr_opt, 144, ##ctx) \ + FN(inode_storage_get, 145, ##ctx) \ + FN(inode_storage_delete, 146, ##ctx) \ + FN(d_path, 147, ##ctx) \ + FN(copy_from_user, 148, ##ctx) \ + FN(snprintf_btf, 149, ##ctx) \ + FN(seq_printf_btf, 150, ##ctx) \ + FN(skb_cgroup_classid, 151, ##ctx) \ + FN(redirect_neigh, 152, ##ctx) \ + FN(per_cpu_ptr, 153, ##ctx) \ + FN(this_cpu_ptr, 154, ##ctx) \ + FN(redirect_peer, 155, ##ctx) \ + FN(task_storage_get, 156, ##ctx) \ + FN(task_storage_delete, 157, ##ctx) \ + FN(get_current_task_btf, 158, ##ctx) \ + FN(bprm_opts_set, 159, ##ctx) \ + FN(ktime_get_coarse_ns, 160, ##ctx) \ + FN(ima_inode_hash, 161, ##ctx) \ + FN(sock_from_file, 162, ##ctx) \ + FN(check_mtu, 163, ##ctx) \ + FN(for_each_map_elem, 164, ##ctx) \ + FN(snprintf, 165, ##ctx) \ + FN(sys_bpf, 166, ##ctx) \ + FN(btf_find_by_name_kind, 167, ##ctx) \ + FN(sys_close, 168, ##ctx) \ + FN(timer_init, 169, ##ctx) \ + FN(timer_set_callback, 170, ##ctx) \ + FN(timer_start, 171, ##ctx) \ + FN(timer_cancel, 172, ##ctx) \ + FN(get_func_ip, 173, ##ctx) \ + FN(get_attach_cookie, 174, ##ctx) \ + FN(task_pt_regs, 175, ##ctx) \ + FN(get_branch_snapshot, 176, ##ctx) \ + FN(trace_vprintk, 177, ##ctx) \ + FN(skc_to_unix_sock, 178, ##ctx) \ + FN(kallsyms_lookup_name, 179, ##ctx) \ + FN(find_vma, 180, ##ctx) \ + FN(loop, 181, ##ctx) \ + FN(strncmp, 182, ##ctx) \ + FN(get_func_arg, 183, ##ctx) \ + FN(get_func_ret, 184, ##ctx) \ + FN(get_func_arg_cnt, 185, ##ctx) \ + FN(get_retval, 186, ##ctx) \ + FN(set_retval, 187, ##ctx) \ + FN(xdp_get_buff_len, 188, ##ctx) \ + FN(xdp_load_bytes, 189, ##ctx) \ + FN(xdp_store_bytes, 190, ##ctx) \ + FN(copy_from_user_task, 191, ##ctx) \ + FN(skb_set_tstamp, 192, ##ctx) \ + FN(ima_file_hash, 193, ##ctx) \ + FN(kptr_xchg, 194, ##ctx) \ + FN(map_lookup_percpu_elem, 195, ##ctx) \ + FN(skc_to_mptcp_sock, 196, ##ctx) \ + FN(dynptr_from_mem, 197, ##ctx) \ + FN(ringbuf_reserve_dynptr, 198, ##ctx) \ + FN(ringbuf_submit_dynptr, 199, ##ctx) \ + FN(ringbuf_discard_dynptr, 200, ##ctx) \ + FN(dynptr_read, 201, ##ctx) \ + FN(dynptr_write, 202, ##ctx) \ + FN(dynptr_data, 203, ##ctx) \ + FN(tcp_raw_gen_syncookie_ipv4, 204, ##ctx) \ + FN(tcp_raw_gen_syncookie_ipv6, 205, ##ctx) \ + FN(tcp_raw_check_syncookie_ipv4, 206, ##ctx) \ + FN(tcp_raw_check_syncookie_ipv6, 207, ##ctx) \ + FN(ktime_get_tai_ns, 208, ##ctx) \ + FN(user_ringbuf_drain, 209, ##ctx) \ + FN(cgrp_storage_get, 210, ##ctx) \ + FN(cgrp_storage_delete, 211, ##ctx) \ + /* */ + +/* backwards-compatibility macros for users of __BPF_FUNC_MAPPER that don't + * know or care about integer value that is now passed as second argument + */ +#define __BPF_FUNC_MAPPER_APPLY(name, value, FN) FN(name), +#define __BPF_FUNC_MAPPER(FN) ___BPF_FUNC_MAPPER(__BPF_FUNC_MAPPER_APPLY, FN) + +/* integer value in 'imm' field of BPF_CALL instruction selects which helper + * function eBPF program intends to call + */ +#define __BPF_ENUM_FN(x, y) BPF_FUNC_ ## x = y, +enum bpf_func_id { + ___BPF_FUNC_MAPPER(__BPF_ENUM_FN) + __BPF_FUNC_MAX_ID, +}; +#undef __BPF_ENUM_FN + +/* All flags used by eBPF helper functions, placed here. */ + +/* BPF_FUNC_skb_store_bytes flags. */ +enum { + BPF_F_RECOMPUTE_CSUM = (1ULL << 0), + BPF_F_INVALIDATE_HASH = (1ULL << 1), +}; + +/* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags. + * First 4 bits are for passing the header field size. + */ +enum { + BPF_F_HDR_FIELD_MASK = 0xfULL, +}; + +/* BPF_FUNC_l4_csum_replace flags. */ +enum { + BPF_F_PSEUDO_HDR = (1ULL << 4), + BPF_F_MARK_MANGLED_0 = (1ULL << 5), + BPF_F_MARK_ENFORCE = (1ULL << 6), +}; + +/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ +enum { + BPF_F_INGRESS = (1ULL << 0), +}; + +/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ +enum { + BPF_F_TUNINFO_IPV6 = (1ULL << 0), +}; + +/* flags for both BPF_FUNC_get_stackid and BPF_FUNC_get_stack. */ +enum { + BPF_F_SKIP_FIELD_MASK = 0xffULL, + BPF_F_USER_STACK = (1ULL << 8), +/* flags used by BPF_FUNC_get_stackid only. */ + BPF_F_FAST_STACK_CMP = (1ULL << 9), + BPF_F_REUSE_STACKID = (1ULL << 10), +/* flags used by BPF_FUNC_get_stack only. */ + BPF_F_USER_BUILD_ID = (1ULL << 11), +}; + +/* BPF_FUNC_skb_set_tunnel_key flags. */ +enum { + BPF_F_ZERO_CSUM_TX = (1ULL << 1), + BPF_F_DONT_FRAGMENT = (1ULL << 2), + BPF_F_SEQ_NUMBER = (1ULL << 3), + BPF_F_NO_TUNNEL_KEY = (1ULL << 4), +}; + +/* BPF_FUNC_skb_get_tunnel_key flags. */ +enum { + BPF_F_TUNINFO_FLAGS = (1ULL << 4), +}; + +/* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and + * BPF_FUNC_perf_event_read_value flags. + */ +enum { + BPF_F_INDEX_MASK = 0xffffffffULL, + BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK, +/* BPF_FUNC_perf_event_output for sk_buff input context. */ + BPF_F_CTXLEN_MASK = (0xfffffULL << 32), +}; + +/* Current network namespace */ +enum { + BPF_F_CURRENT_NETNS = (-1L), +}; + +/* BPF_FUNC_csum_level level values. */ +enum { + BPF_CSUM_LEVEL_QUERY, + BPF_CSUM_LEVEL_INC, + BPF_CSUM_LEVEL_DEC, + BPF_CSUM_LEVEL_RESET, +}; + +/* BPF_FUNC_skb_adjust_room flags. */ +enum { + BPF_F_ADJ_ROOM_FIXED_GSO = (1ULL << 0), + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = (1ULL << 1), + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = (1ULL << 2), + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = (1ULL << 3), + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = (1ULL << 4), + BPF_F_ADJ_ROOM_NO_CSUM_RESET = (1ULL << 5), + BPF_F_ADJ_ROOM_ENCAP_L2_ETH = (1ULL << 6), + BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = (1ULL << 7), + BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = (1ULL << 8), +}; + +enum { + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff, + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, +}; + +#define BPF_F_ADJ_ROOM_ENCAP_L2(len) (((__u64)len & \ + BPF_ADJ_ROOM_ENCAP_L2_MASK) \ + << BPF_ADJ_ROOM_ENCAP_L2_SHIFT) + +/* BPF_FUNC_sysctl_get_name flags. */ +enum { + BPF_F_SYSCTL_BASE_NAME = (1ULL << 0), +}; + +/* BPF_FUNC__storage_get flags */ +enum { + BPF_LOCAL_STORAGE_GET_F_CREATE = (1ULL << 0), + /* BPF_SK_STORAGE_GET_F_CREATE is only kept for backward compatibility + * and BPF_LOCAL_STORAGE_GET_F_CREATE must be used instead. + */ + BPF_SK_STORAGE_GET_F_CREATE = BPF_LOCAL_STORAGE_GET_F_CREATE, +}; + +/* BPF_FUNC_read_branch_records flags. */ +enum { + BPF_F_GET_BRANCH_RECORDS_SIZE = (1ULL << 0), +}; + +/* BPF_FUNC_bpf_ringbuf_commit, BPF_FUNC_bpf_ringbuf_discard, and + * BPF_FUNC_bpf_ringbuf_output flags. + */ +enum { + BPF_RB_NO_WAKEUP = (1ULL << 0), + BPF_RB_FORCE_WAKEUP = (1ULL << 1), +}; + +/* BPF_FUNC_bpf_ringbuf_query flags */ +enum { + BPF_RB_AVAIL_DATA = 0, + BPF_RB_RING_SIZE = 1, + BPF_RB_CONS_POS = 2, + BPF_RB_PROD_POS = 3, +}; + +/* BPF ring buffer constants */ +enum { + BPF_RINGBUF_BUSY_BIT = (1U << 31), + BPF_RINGBUF_DISCARD_BIT = (1U << 30), + BPF_RINGBUF_HDR_SZ = 8, +}; + +/* BPF_FUNC_sk_assign flags in bpf_sk_lookup context. */ +enum { + BPF_SK_LOOKUP_F_REPLACE = (1ULL << 0), + BPF_SK_LOOKUP_F_NO_REUSEPORT = (1ULL << 1), +}; + +/* Mode for BPF_FUNC_skb_adjust_room helper. */ +enum bpf_adj_room_mode { + BPF_ADJ_ROOM_NET, + BPF_ADJ_ROOM_MAC, +}; + +/* Mode for BPF_FUNC_skb_load_bytes_relative helper. */ +enum bpf_hdr_start_off { + BPF_HDR_START_MAC, + BPF_HDR_START_NET, +}; + +/* Encapsulation type for BPF_FUNC_lwt_push_encap helper. */ +enum bpf_lwt_encap_mode { + BPF_LWT_ENCAP_SEG6, + BPF_LWT_ENCAP_SEG6_INLINE, + BPF_LWT_ENCAP_IP, +}; + +/* Flags for bpf_bprm_opts_set helper */ +enum { + BPF_F_BPRM_SECUREEXEC = (1ULL << 0), +}; + +/* Flags for bpf_redirect_map helper */ +enum { + BPF_F_BROADCAST = (1ULL << 3), + BPF_F_EXCLUDE_INGRESS = (1ULL << 4), +}; + +#define __bpf_md_ptr(type, name) \ +union { \ + type name; \ + __u64 :64; \ +} __attribute__((aligned(8))) + +enum { + BPF_SKB_TSTAMP_UNSPEC, + BPF_SKB_TSTAMP_DELIVERY_MONO, /* tstamp has mono delivery time */ + /* For any BPF_SKB_TSTAMP_* that the bpf prog cannot handle, + * the bpf prog should handle it like BPF_SKB_TSTAMP_UNSPEC + * and try to deduce it by ingress, egress or skb->sk->sk_clockid. + */ +}; + +/* user accessible mirror of in-kernel sk_buff. + * new fields can only be added to the end of this structure + */ +struct __sk_buff { + __u32 len; + __u32 pkt_type; + __u32 mark; + __u32 queue_mapping; + __u32 protocol; + __u32 vlan_present; + __u32 vlan_tci; + __u32 vlan_proto; + __u32 priority; + __u32 ingress_ifindex; + __u32 ifindex; + __u32 tc_index; + __u32 cb[5]; + __u32 hash; + __u32 tc_classid; + __u32 data; + __u32 data_end; + __u32 napi_id; + + /* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */ + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + /* ... here. */ + + __u32 data_meta; + __bpf_md_ptr(struct bpf_flow_keys *, flow_keys); + __u64 tstamp; + __u32 wire_len; + __u32 gso_segs; + __bpf_md_ptr(struct bpf_sock *, sk); + __u32 gso_size; + __u8 tstamp_type; + __u32 :24; /* Padding, future use. */ + __u64 hwtstamp; +}; + +struct bpf_tunnel_key { + __u32 tunnel_id; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; + union { + __u16 tunnel_ext; /* compat */ + __be16 tunnel_flags; + }; + __u32 tunnel_label; + union { + __u32 local_ipv4; + __u32 local_ipv6[4]; + }; +}; + +/* user accessible mirror of in-kernel xfrm_state. + * new fields can only be added to the end of this structure + */ +struct bpf_xfrm_state { + __u32 reqid; + __u32 spi; /* Stored in network byte order */ + __u16 family; + __u16 ext; /* Padding, future use. */ + union { + __u32 remote_ipv4; /* Stored in network byte order */ + __u32 remote_ipv6[4]; /* Stored in network byte order */ + }; +}; + +/* Generic BPF return codes which all BPF program types may support. + * The values are binary compatible with their TC_ACT_* counter-part to + * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT + * programs. + * + * XDP is handled seprately, see XDP_*. + */ +enum bpf_ret_code { + BPF_OK = 0, + /* 1 reserved */ + BPF_DROP = 2, + /* 3-6 reserved */ + BPF_REDIRECT = 7, + /* >127 are reserved for prog type specific return codes. + * + * BPF_LWT_REROUTE: used by BPF_PROG_TYPE_LWT_IN and + * BPF_PROG_TYPE_LWT_XMIT to indicate that skb had been + * changed and should be routed based on its new L3 header. + * (This is an L3 redirect, as opposed to L2 redirect + * represented by BPF_REDIRECT above). + */ + BPF_LWT_REROUTE = 128, + /* BPF_FLOW_DISSECTOR_CONTINUE: used by BPF_PROG_TYPE_FLOW_DISSECTOR + * to indicate that no custom dissection was performed, and + * fallback to standard dissector is requested. + */ + BPF_FLOW_DISSECTOR_CONTINUE = 129, +}; + +struct bpf_sock { + __u32 bound_dev_if; + __u32 family; + __u32 type; + __u32 protocol; + __u32 mark; + __u32 priority; + /* IP address also allows 1 and 2 bytes access */ + __u32 src_ip4; + __u32 src_ip6[4]; + __u32 src_port; /* host byte order */ + __be16 dst_port; /* network byte order */ + __u16 :16; /* zero padding */ + __u32 dst_ip4; + __u32 dst_ip6[4]; + __u32 state; + __s32 rx_queue_mapping; +}; + +struct bpf_tcp_sock { + __u32 snd_cwnd; /* Sending congestion window */ + __u32 srtt_us; /* smoothed round trip time << 3 in usecs */ + __u32 rtt_min; + __u32 snd_ssthresh; /* Slow start size threshold */ + __u32 rcv_nxt; /* What we want to receive next */ + __u32 snd_nxt; /* Next sequence we send */ + __u32 snd_una; /* First byte we want an ack for */ + __u32 mss_cache; /* Cached effective mss, not including SACKS */ + __u32 ecn_flags; /* ECN status bits. */ + __u32 rate_delivered; /* saved rate sample: packets delivered */ + __u32 rate_interval_us; /* saved rate sample: time elapsed */ + __u32 packets_out; /* Packets which are "in flight" */ + __u32 retrans_out; /* Retransmitted packets out */ + __u32 total_retrans; /* Total retransmits for entire connection */ + __u32 segs_in; /* RFC4898 tcpEStatsPerfSegsIn + * total number of segments in. + */ + __u32 data_segs_in; /* RFC4898 tcpEStatsPerfDataSegsIn + * total number of data segments in. + */ + __u32 segs_out; /* RFC4898 tcpEStatsPerfSegsOut + * The total number of segments sent. + */ + __u32 data_segs_out; /* RFC4898 tcpEStatsPerfDataSegsOut + * total number of data segments sent. + */ + __u32 lost_out; /* Lost packets */ + __u32 sacked_out; /* SACK'd packets */ + __u64 bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived + * sum(delta(rcv_nxt)), or how many bytes + * were acked. + */ + __u64 bytes_acked; /* RFC4898 tcpEStatsAppHCThruOctetsAcked + * sum(delta(snd_una)), or how many bytes + * were acked. + */ + __u32 dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups + * total number of DSACK blocks received + */ + __u32 delivered; /* Total data packets delivered incl. rexmits */ + __u32 delivered_ce; /* Like the above but only ECE marked packets */ + __u32 icsk_retransmits; /* Number of unrecovered [RTO] timeouts */ +}; + +struct bpf_sock_tuple { + union { + struct { + __be32 saddr; + __be32 daddr; + __be16 sport; + __be16 dport; + } ipv4; + struct { + __be32 saddr[4]; + __be32 daddr[4]; + __be16 sport; + __be16 dport; + } ipv6; + }; +}; + +struct bpf_xdp_sock { + __u32 queue_id; +}; + +#define XDP_PACKET_HEADROOM 256 + +/* User return codes for XDP prog type. + * A valid XDP program must return one of these defined values. All other + * return codes are reserved for future use. Unknown return codes will + * result in packet drops and a warning via bpf_warn_invalid_xdp_action(). + */ +enum xdp_action { + XDP_ABORTED = 0, + XDP_DROP, + XDP_PASS, + XDP_TX, + XDP_REDIRECT, +}; + +/* user accessible metadata for XDP packet hook + * new fields must be added to the end of this structure + */ +struct xdp_md { + __u32 data; + __u32 data_end; + __u32 data_meta; + /* Below access go through struct xdp_rxq_info */ + __u32 ingress_ifindex; /* rxq->dev->ifindex */ + __u32 rx_queue_index; /* rxq->queue_index */ + + __u32 egress_ifindex; /* txq->dev->ifindex */ +}; + +/* DEVMAP map-value layout + * + * The struct data-layout of map-value is a configuration interface. + * New members can only be added to the end of this structure. + */ +struct bpf_devmap_val { + __u32 ifindex; /* device index */ + union { + int fd; /* prog fd on map write */ + __u32 id; /* prog id on map read */ + } bpf_prog; +}; + +/* CPUMAP map-value layout + * + * The struct data-layout of map-value is a configuration interface. + * New members can only be added to the end of this structure. + */ +struct bpf_cpumap_val { + __u32 qsize; /* queue size to remote target CPU */ + union { + int fd; /* prog fd on map write */ + __u32 id; /* prog id on map read */ + } bpf_prog; +}; + +enum sk_action { + SK_DROP = 0, + SK_PASS, +}; + +/* user accessible metadata for SK_MSG packet hook, new fields must + * be added to the end of this structure + */ +struct sk_msg_md { + __bpf_md_ptr(void *, data); + __bpf_md_ptr(void *, data_end); + + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + __u32 size; /* Total size of sk_msg */ + + __bpf_md_ptr(struct bpf_sock *, sk); /* current socket */ +}; + +struct sk_reuseport_md { + /* + * Start of directly accessible data. It begins from + * the tcp/udp header. + */ + __bpf_md_ptr(void *, data); + /* End of directly accessible data */ + __bpf_md_ptr(void *, data_end); + /* + * Total length of packet (starting from the tcp/udp header). + * Note that the directly accessible bytes (data_end - data) + * could be less than this "len". Those bytes could be + * indirectly read by a helper "bpf_skb_load_bytes()". + */ + __u32 len; + /* + * Eth protocol in the mac header (network byte order). e.g. + * ETH_P_IP(0x0800) and ETH_P_IPV6(0x86DD) + */ + __u32 eth_protocol; + __u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */ + __u32 bind_inany; /* Is sock bound to an INANY address? */ + __u32 hash; /* A hash of the packet 4 tuples */ + /* When reuse->migrating_sk is NULL, it is selecting a sk for the + * new incoming connection request (e.g. selecting a listen sk for + * the received SYN in the TCP case). reuse->sk is one of the sk + * in the reuseport group. The bpf prog can use reuse->sk to learn + * the local listening ip/port without looking into the skb. + * + * When reuse->migrating_sk is not NULL, reuse->sk is closed and + * reuse->migrating_sk is the socket that needs to be migrated + * to another listening socket. migrating_sk could be a fullsock + * sk that is fully established or a reqsk that is in-the-middle + * of 3-way handshake. + */ + __bpf_md_ptr(struct bpf_sock *, sk); + __bpf_md_ptr(struct bpf_sock *, migrating_sk); +}; + +#define BPF_TAG_SIZE 8 + +struct bpf_prog_info { + __u32 type; + __u32 id; + __u8 tag[BPF_TAG_SIZE]; + __u32 jited_prog_len; + __u32 xlated_prog_len; + __aligned_u64 jited_prog_insns; + __aligned_u64 xlated_prog_insns; + __u64 load_time; /* ns since boottime */ + __u32 created_by_uid; + __u32 nr_map_ids; + __aligned_u64 map_ids; + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 gpl_compatible:1; + __u32 :31; /* alignment pad */ + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; + __u32 nr_jited_func_lens; + __aligned_u64 jited_ksyms; + __aligned_u64 jited_func_lens; + __u32 btf_id; + __u32 func_info_rec_size; + __aligned_u64 func_info; + __u32 nr_func_info; + __u32 nr_line_info; + __aligned_u64 line_info; + __aligned_u64 jited_line_info; + __u32 nr_jited_line_info; + __u32 line_info_rec_size; + __u32 jited_line_info_rec_size; + __u32 nr_prog_tags; + __aligned_u64 prog_tags; + __u64 run_time_ns; + __u64 run_cnt; + __u64 recursion_misses; + __u32 verified_insns; + __u32 attach_btf_obj_id; + __u32 attach_btf_id; +} __attribute__((aligned(8))); + +struct bpf_map_info { + __u32 type; + __u32 id; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 btf_vmlinux_value_type_id; + __u64 netns_dev; + __u64 netns_ino; + __u32 btf_id; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 :32; /* alignment pad */ + __u64 map_extra; +} __attribute__((aligned(8))); + +struct bpf_btf_info { + __aligned_u64 btf; + __u32 btf_size; + __u32 id; + __aligned_u64 name; + __u32 name_len; + __u32 kernel_btf; +} __attribute__((aligned(8))); + +struct bpf_link_info { + __u32 type; + __u32 id; + __u32 prog_id; + union { + struct { + __aligned_u64 tp_name; /* in/out: tp_name buffer ptr */ + __u32 tp_name_len; /* in/out: tp_name buffer len */ + } raw_tracepoint; + struct { + __u32 attach_type; + __u32 target_obj_id; /* prog_id for PROG_EXT, otherwise btf object id */ + __u32 target_btf_id; /* BTF type id inside the object */ + } tracing; + struct { + __u64 cgroup_id; + __u32 attach_type; + } cgroup; + struct { + __aligned_u64 target_name; /* in/out: target_name buffer ptr */ + __u32 target_name_len; /* in/out: target_name buffer len */ + + /* If the iter specific field is 32 bits, it can be put + * in the first or second union. Otherwise it should be + * put in the second union. + */ + union { + struct { + __u32 map_id; + } map; + }; + union { + struct { + __u64 cgroup_id; + __u32 order; + } cgroup; + struct { + __u32 tid; + __u32 pid; + } task; + }; + } iter; + struct { + __u32 netns_ino; + __u32 attach_type; + } netns; + struct { + __u32 ifindex; + } xdp; + struct { + __u32 map_id; + } struct_ops; + }; +} __attribute__((aligned(8))); + +/* User bpf_sock_addr struct to access socket fields and sockaddr struct passed + * by user and intended to be used by socket (e.g. to bind to, depends on + * attach type). + */ +struct bpf_sock_addr { + __u32 user_family; /* Allows 4-byte read, but no write. */ + __u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order. + */ + __u32 user_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. + * Stored in network byte order. + */ + __u32 user_port; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order + */ + __u32 family; /* Allows 4-byte read, but no write */ + __u32 type; /* Allows 4-byte read, but no write */ + __u32 protocol; /* Allows 4-byte read, but no write */ + __u32 msg_src_ip4; /* Allows 1,2,4-byte read and 4-byte write. + * Stored in network byte order. + */ + __u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. + * Stored in network byte order. + */ + __bpf_md_ptr(struct bpf_sock *, sk); +}; + +/* User bpf_sock_ops struct to access socket values and specify request ops + * and their replies. + * Some of this fields are in network (bigendian) byte order and may need + * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h). + * New fields can only be added at the end of this structure + */ +struct bpf_sock_ops { + __u32 op; + union { + __u32 args[4]; /* Optionally passed to bpf program */ + __u32 reply; /* Returned by bpf program */ + __u32 replylong[4]; /* Optionally returned by bpf prog */ + }; + __u32 family; + __u32 remote_ip4; /* Stored in network byte order */ + __u32 local_ip4; /* Stored in network byte order */ + __u32 remote_ip6[4]; /* Stored in network byte order */ + __u32 local_ip6[4]; /* Stored in network byte order */ + __u32 remote_port; /* Stored in network byte order */ + __u32 local_port; /* stored in host byte order */ + __u32 is_fullsock; /* Some TCP fields are only valid if + * there is a full socket. If not, the + * fields read as zero. + */ + __u32 snd_cwnd; + __u32 srtt_us; /* Averaged RTT << 3 in usecs */ + __u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */ + __u32 state; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u32 sk_txhash; + __u64 bytes_received; + __u64 bytes_acked; + __bpf_md_ptr(struct bpf_sock *, sk); + /* [skb_data, skb_data_end) covers the whole TCP header. + * + * BPF_SOCK_OPS_PARSE_HDR_OPT_CB: The packet received + * BPF_SOCK_OPS_HDR_OPT_LEN_CB: Not useful because the + * header has not been written. + * BPF_SOCK_OPS_WRITE_HDR_OPT_CB: The header and options have + * been written so far. + * BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: The SYNACK that concludes + * the 3WHS. + * BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: The ACK that concludes + * the 3WHS. + * + * bpf_load_hdr_opt() can also be used to read a particular option. + */ + __bpf_md_ptr(void *, skb_data); + __bpf_md_ptr(void *, skb_data_end); + __u32 skb_len; /* The total length of a packet. + * It includes the header, options, + * and payload. + */ + __u32 skb_tcp_flags; /* tcp_flags of the header. It provides + * an easy way to check for tcp_flags + * without parsing skb_data. + * + * In particular, the skb_tcp_flags + * will still be available in + * BPF_SOCK_OPS_HDR_OPT_LEN even though + * the outgoing header has not + * been written yet. + */ + __u64 skb_hwtstamp; +}; + +/* Definitions for bpf_sock_ops_cb_flags */ +enum { + BPF_SOCK_OPS_RTO_CB_FLAG = (1<<0), + BPF_SOCK_OPS_RETRANS_CB_FLAG = (1<<1), + BPF_SOCK_OPS_STATE_CB_FLAG = (1<<2), + BPF_SOCK_OPS_RTT_CB_FLAG = (1<<3), + /* Call bpf for all received TCP headers. The bpf prog will be + * called under sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB + * + * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB + * for the header option related helpers that will be useful + * to the bpf programs. + * + * It could be used at the client/active side (i.e. connect() side) + * when the server told it that the server was in syncookie + * mode and required the active side to resend the bpf-written + * options. The active side can keep writing the bpf-options until + * it received a valid packet from the server side to confirm + * the earlier packet (and options) has been received. The later + * example patch is using it like this at the active side when the + * server is in syncookie mode. + * + * The bpf prog will usually turn this off in the common cases. + */ + BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = (1<<4), + /* Call bpf when kernel has received a header option that + * the kernel cannot handle. The bpf prog will be called under + * sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB. + * + * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB + * for the header option related helpers that will be useful + * to the bpf programs. + */ + BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = (1<<5), + /* Call bpf when the kernel is writing header options for the + * outgoing packet. The bpf prog will first be called + * to reserve space in a skb under + * sock_ops->op == BPF_SOCK_OPS_HDR_OPT_LEN_CB. Then + * the bpf prog will be called to write the header option(s) + * under sock_ops->op == BPF_SOCK_OPS_WRITE_HDR_OPT_CB. + * + * Please refer to the comment in BPF_SOCK_OPS_HDR_OPT_LEN_CB + * and BPF_SOCK_OPS_WRITE_HDR_OPT_CB for the header option + * related helpers that will be useful to the bpf programs. + * + * The kernel gets its chance to reserve space and write + * options first before the BPF program does. + */ + BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = (1<<6), +/* Mask of all currently supported cb flags */ + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7F, +}; + +/* List of known BPF sock_ops operators. + * New entries can only be added at the end + */ +enum { + BPF_SOCK_OPS_VOID, + BPF_SOCK_OPS_TIMEOUT_INIT, /* Should return SYN-RTO value to use or + * -1 if default value should be used + */ + BPF_SOCK_OPS_RWND_INIT, /* Should return initial advertized + * window (in packets) or -1 if default + * value should be used + */ + BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an + * active connection is initialized + */ + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an + * active connection is + * established + */ + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a + * passive connection is + * established + */ + BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control + * needs ECN + */ + BPF_SOCK_OPS_BASE_RTT, /* Get base RTT. The correct value is + * based on the path and may be + * dependent on the congestion control + * algorithm. In general it indicates + * a congestion threshold. RTTs above + * this indicate congestion + */ + BPF_SOCK_OPS_RTO_CB, /* Called when an RTO has triggered. + * Arg1: value of icsk_retransmits + * Arg2: value of icsk_rto + * Arg3: whether RTO has expired + */ + BPF_SOCK_OPS_RETRANS_CB, /* Called when skb is retransmitted. + * Arg1: sequence number of 1st byte + * Arg2: # segments + * Arg3: return value of + * tcp_transmit_skb (0 => success) + */ + BPF_SOCK_OPS_STATE_CB, /* Called when TCP changes state. + * Arg1: old_state + * Arg2: new_state + */ + BPF_SOCK_OPS_TCP_LISTEN_CB, /* Called on listen(2), right after + * socket transition to LISTEN state. + */ + BPF_SOCK_OPS_RTT_CB, /* Called on every RTT. + */ + BPF_SOCK_OPS_PARSE_HDR_OPT_CB, /* Parse the header option. + * It will be called to handle + * the packets received at + * an already established + * connection. + * + * sock_ops->skb_data: + * Referring to the received skb. + * It covers the TCP header only. + * + * bpf_load_hdr_opt() can also + * be used to search for a + * particular option. + */ + BPF_SOCK_OPS_HDR_OPT_LEN_CB, /* Reserve space for writing the + * header option later in + * BPF_SOCK_OPS_WRITE_HDR_OPT_CB. + * Arg1: bool want_cookie. (in + * writing SYNACK only) + * + * sock_ops->skb_data: + * Not available because no header has + * been written yet. + * + * sock_ops->skb_tcp_flags: + * The tcp_flags of the + * outgoing skb. (e.g. SYN, ACK, FIN). + * + * bpf_reserve_hdr_opt() should + * be used to reserve space. + */ + BPF_SOCK_OPS_WRITE_HDR_OPT_CB, /* Write the header options + * Arg1: bool want_cookie. (in + * writing SYNACK only) + * + * sock_ops->skb_data: + * Referring to the outgoing skb. + * It covers the TCP header + * that has already been written + * by the kernel and the + * earlier bpf-progs. + * + * sock_ops->skb_tcp_flags: + * The tcp_flags of the outgoing + * skb. (e.g. SYN, ACK, FIN). + * + * bpf_store_hdr_opt() should + * be used to write the + * option. + * + * bpf_load_hdr_opt() can also + * be used to search for a + * particular option that + * has already been written + * by the kernel or the + * earlier bpf-progs. + */ +}; + +/* List of TCP states. There is a build check in net/ipv4/tcp.c to detect + * changes between the TCP and BPF versions. Ideally this should never happen. + * If it does, we need to add code to convert them before calling + * the BPF sock_ops function. + */ +enum { + BPF_TCP_ESTABLISHED = 1, + BPF_TCP_SYN_SENT, + BPF_TCP_SYN_RECV, + BPF_TCP_FIN_WAIT1, + BPF_TCP_FIN_WAIT2, + BPF_TCP_TIME_WAIT, + BPF_TCP_CLOSE, + BPF_TCP_CLOSE_WAIT, + BPF_TCP_LAST_ACK, + BPF_TCP_LISTEN, + BPF_TCP_CLOSING, /* Now a valid state */ + BPF_TCP_NEW_SYN_RECV, + + BPF_TCP_MAX_STATES /* Leave at the end! */ +}; + +enum { + TCP_BPF_IW = 1001, /* Set TCP initial congestion window */ + TCP_BPF_SNDCWND_CLAMP = 1002, /* Set sndcwnd_clamp */ + TCP_BPF_DELACK_MAX = 1003, /* Max delay ack in usecs */ + TCP_BPF_RTO_MIN = 1004, /* Min delay ack in usecs */ + /* Copy the SYN pkt to optval + * + * BPF_PROG_TYPE_SOCK_OPS only. It is similar to the + * bpf_getsockopt(TCP_SAVED_SYN) but it does not limit + * to only getting from the saved_syn. It can either get the + * syn packet from: + * + * 1. the just-received SYN packet (only available when writing the + * SYNACK). It will be useful when it is not necessary to + * save the SYN packet for latter use. It is also the only way + * to get the SYN during syncookie mode because the syn + * packet cannot be saved during syncookie. + * + * OR + * + * 2. the earlier saved syn which was done by + * bpf_setsockopt(TCP_SAVE_SYN). + * + * The bpf_getsockopt(TCP_BPF_SYN*) option will hide where the + * SYN packet is obtained. + * + * If the bpf-prog does not need the IP[46] header, the + * bpf-prog can avoid parsing the IP header by using + * TCP_BPF_SYN. Otherwise, the bpf-prog can get both + * IP[46] and TCP header by using TCP_BPF_SYN_IP. + * + * >0: Total number of bytes copied + * -ENOSPC: Not enough space in optval. Only optlen number of + * bytes is copied. + * -ENOENT: The SYN skb is not available now and the earlier SYN pkt + * is not saved by setsockopt(TCP_SAVE_SYN). + */ + TCP_BPF_SYN = 1005, /* Copy the TCP header */ + TCP_BPF_SYN_IP = 1006, /* Copy the IP[46] and TCP header */ + TCP_BPF_SYN_MAC = 1007, /* Copy the MAC, IP[46], and TCP header */ +}; + +enum { + BPF_LOAD_HDR_OPT_TCP_SYN = (1ULL << 0), +}; + +/* args[0] value during BPF_SOCK_OPS_HDR_OPT_LEN_CB and + * BPF_SOCK_OPS_WRITE_HDR_OPT_CB. + */ +enum { + BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, /* Kernel is finding the + * total option spaces + * required for an established + * sk in order to calculate the + * MSS. No skb is actually + * sent. + */ + BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, /* Kernel is in syncookie mode + * when sending a SYN. + */ +}; + +struct bpf_perf_event_value { + __u64 counter; + __u64 enabled; + __u64 running; +}; + +enum { + BPF_DEVCG_ACC_MKNOD = (1ULL << 0), + BPF_DEVCG_ACC_READ = (1ULL << 1), + BPF_DEVCG_ACC_WRITE = (1ULL << 2), +}; + +enum { + BPF_DEVCG_DEV_BLOCK = (1ULL << 0), + BPF_DEVCG_DEV_CHAR = (1ULL << 1), +}; + +struct bpf_cgroup_dev_ctx { + /* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */ + __u32 access_type; + __u32 major; + __u32 minor; +}; + +struct bpf_raw_tracepoint_args { + __u64 args[0]; +}; + +/* DIRECT: Skip the FIB rules and go to FIB table associated with device + * OUTPUT: Do lookup from egress perspective; default is ingress + */ +enum { + BPF_FIB_LOOKUP_DIRECT = (1U << 0), + BPF_FIB_LOOKUP_OUTPUT = (1U << 1), + BPF_FIB_LOOKUP_SKIP_NEIGH = (1U << 2), +}; + +enum { + BPF_FIB_LKUP_RET_SUCCESS, /* lookup successful */ + BPF_FIB_LKUP_RET_BLACKHOLE, /* dest is blackholed; can be dropped */ + BPF_FIB_LKUP_RET_UNREACHABLE, /* dest is unreachable; can be dropped */ + BPF_FIB_LKUP_RET_PROHIBIT, /* dest not allowed; can be dropped */ + BPF_FIB_LKUP_RET_NOT_FWDED, /* packet is not forwarded */ + BPF_FIB_LKUP_RET_FWD_DISABLED, /* fwding is not enabled on ingress */ + BPF_FIB_LKUP_RET_UNSUPP_LWT, /* fwd requires encapsulation */ + BPF_FIB_LKUP_RET_NO_NEIGH, /* no neighbor entry for nh */ + BPF_FIB_LKUP_RET_FRAG_NEEDED, /* fragmentation required to fwd */ +}; + +struct bpf_fib_lookup { + /* input: network family for lookup (AF_INET, AF_INET6) + * output: network family of egress nexthop + */ + __u8 family; + + /* set if lookup is to consider L4 data - e.g., FIB rules */ + __u8 l4_protocol; + __be16 sport; + __be16 dport; + + union { /* used for MTU check */ + /* input to lookup */ + __u16 tot_len; /* L3 length from network hdr (iph->tot_len) */ + + /* output: MTU value */ + __u16 mtu_result; + }; + /* input: L3 device index for lookup + * output: device index from FIB lookup + */ + __u32 ifindex; + + union { + /* inputs to lookup */ + __u8 tos; /* AF_INET */ + __be32 flowinfo; /* AF_INET6, flow_label + priority */ + + /* output: metric of fib result (IPv4/IPv6 only) */ + __u32 rt_metric; + }; + + union { + __be32 ipv4_src; + __u32 ipv6_src[4]; /* in6_addr; network order */ + }; + + /* input to bpf_fib_lookup, ipv{4,6}_dst is destination address in + * network header. output: bpf_fib_lookup sets to gateway address + * if FIB lookup returns gateway route + */ + union { + __be32 ipv4_dst; + __u32 ipv6_dst[4]; /* in6_addr; network order */ + }; + + /* output */ + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __u8 smac[6]; /* ETH_ALEN */ + __u8 dmac[6]; /* ETH_ALEN */ +}; + +struct bpf_redir_neigh { + /* network family for lookup (AF_INET, AF_INET6) */ + __u32 nh_family; + /* network address of nexthop; skips fib lookup to find gateway */ + union { + __be32 ipv4_nh; + __u32 ipv6_nh[4]; /* in6_addr; network order */ + }; +}; + +/* bpf_check_mtu flags*/ +enum bpf_check_mtu_flags { + BPF_MTU_CHK_SEGS = (1U << 0), +}; + +enum bpf_check_mtu_ret { + BPF_MTU_CHK_RET_SUCCESS, /* check and lookup successful */ + BPF_MTU_CHK_RET_FRAG_NEEDED, /* fragmentation required to fwd */ + BPF_MTU_CHK_RET_SEGS_TOOBIG, /* GSO re-segmentation needed to fwd */ +}; + +enum bpf_task_fd_type { + BPF_FD_TYPE_RAW_TRACEPOINT, /* tp name */ + BPF_FD_TYPE_TRACEPOINT, /* tp name */ + BPF_FD_TYPE_KPROBE, /* (symbol + offset) or addr */ + BPF_FD_TYPE_KRETPROBE, /* (symbol + offset) or addr */ + BPF_FD_TYPE_UPROBE, /* filename + offset */ + BPF_FD_TYPE_URETPROBE, /* filename + offset */ +}; + +enum { + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = (1U << 0), + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = (1U << 1), + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = (1U << 2), +}; + +struct bpf_flow_keys { + __u16 nhoff; + __u16 thoff; + __u16 addr_proto; /* ETH_P_* of valid addrs */ + __u8 is_frag; + __u8 is_first_frag; + __u8 is_encap; + __u8 ip_proto; + __be16 n_proto; + __be16 sport; + __be16 dport; + union { + struct { + __be32 ipv4_src; + __be32 ipv4_dst; + }; + struct { + __u32 ipv6_src[4]; /* in6_addr; network order */ + __u32 ipv6_dst[4]; /* in6_addr; network order */ + }; + }; + __u32 flags; + __be32 flow_label; +}; + +struct bpf_func_info { + __u32 insn_off; + __u32 type_id; +}; + +#define BPF_LINE_INFO_LINE_NUM(line_col) ((line_col) >> 10) +#define BPF_LINE_INFO_LINE_COL(line_col) ((line_col) & 0x3ff) + +struct bpf_line_info { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + +struct bpf_spin_lock { + __u32 val; +}; + +struct bpf_timer { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_dynptr { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_list_head { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_list_node { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_rb_root { + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_rb_node { + __u64 :64; + __u64 :64; + __u64 :64; +} __attribute__((aligned(8))); + +struct bpf_sysctl { + __u32 write; /* Sysctl is being read (= 0) or written (= 1). + * Allows 1,2,4-byte read, but no write. + */ + __u32 file_pos; /* Sysctl file position to read from, write to. + * Allows 1,2,4-byte read an 4-byte write. + */ +}; + +struct bpf_sockopt { + __bpf_md_ptr(struct bpf_sock *, sk); + __bpf_md_ptr(void *, optval); + __bpf_md_ptr(void *, optval_end); + + __s32 level; + __s32 optname; + __s32 optlen; + __s32 retval; +}; + +struct bpf_pidns_info { + __u32 pid; + __u32 tgid; +}; + +/* User accessible data for SK_LOOKUP programs. Add new fields at the end. */ +struct bpf_sk_lookup { + union { + __bpf_md_ptr(struct bpf_sock *, sk); /* Selected socket */ + __u64 cookie; /* Non-zero if socket was selected in PROG_TEST_RUN */ + }; + + __u32 family; /* Protocol family (AF_INET, AF_INET6) */ + __u32 protocol; /* IP protocol (IPPROTO_TCP, IPPROTO_UDP) */ + __u32 remote_ip4; /* Network byte order */ + __u32 remote_ip6[4]; /* Network byte order */ + __be16 remote_port; /* Network byte order */ + __u16 :16; /* Zero padding */ + __u32 local_ip4; /* Network byte order */ + __u32 local_ip6[4]; /* Network byte order */ + __u32 local_port; /* Host byte order */ + __u32 ingress_ifindex; /* The arriving interface. Determined by inet_iif. */ +}; + +/* + * struct btf_ptr is used for typed pointer representation; the + * type id is used to render the pointer data as the appropriate type + * via the bpf_snprintf_btf() helper described above. A flags field - + * potentially to specify additional details about the BTF pointer + * (rather than its mode of display) - is included for future use. + * Display flags - BTF_F_* - are passed to bpf_snprintf_btf separately. + */ +struct btf_ptr { + void *ptr; + __u32 type_id; + __u32 flags; /* BTF ptr flags; unused at present. */ +}; + +/* + * Flags to control bpf_snprintf_btf() behaviour. + * - BTF_F_COMPACT: no formatting around type information + * - BTF_F_NONAME: no struct/union member names/types + * - BTF_F_PTR_RAW: show raw (unobfuscated) pointer values; + * equivalent to %px. + * - BTF_F_ZERO: show zero-valued struct/union members; they + * are not displayed by default + */ +enum { + BTF_F_COMPACT = (1ULL << 0), + BTF_F_NONAME = (1ULL << 1), + BTF_F_PTR_RAW = (1ULL << 2), + BTF_F_ZERO = (1ULL << 3), +}; + +/* bpf_core_relo_kind encodes which aspect of captured field/type/enum value + * has to be adjusted by relocations. It is emitted by llvm and passed to + * libbpf and later to the kernel. + */ +enum bpf_core_relo_kind { + BPF_CORE_FIELD_BYTE_OFFSET = 0, /* field byte offset */ + BPF_CORE_FIELD_BYTE_SIZE = 1, /* field size in bytes */ + BPF_CORE_FIELD_EXISTS = 2, /* field existence in target kernel */ + BPF_CORE_FIELD_SIGNED = 3, /* field signedness (0 - unsigned, 1 - signed) */ + BPF_CORE_FIELD_LSHIFT_U64 = 4, /* bitfield-specific left bitshift */ + BPF_CORE_FIELD_RSHIFT_U64 = 5, /* bitfield-specific right bitshift */ + BPF_CORE_TYPE_ID_LOCAL = 6, /* type ID in local BPF object */ + BPF_CORE_TYPE_ID_TARGET = 7, /* type ID in target kernel */ + BPF_CORE_TYPE_EXISTS = 8, /* type existence in target kernel */ + BPF_CORE_TYPE_SIZE = 9, /* type size in bytes */ + BPF_CORE_ENUMVAL_EXISTS = 10, /* enum value existence in target kernel */ + BPF_CORE_ENUMVAL_VALUE = 11, /* enum value integer value */ + BPF_CORE_TYPE_MATCHES = 12, /* type match in target kernel */ +}; + +/* + * "struct bpf_core_relo" is used to pass relocation data form LLVM to libbpf + * and from libbpf to the kernel. + * + * CO-RE relocation captures the following data: + * - insn_off - instruction offset (in bytes) within a BPF program that needs + * its insn->imm field to be relocated with actual field info; + * - type_id - BTF type ID of the "root" (containing) entity of a relocatable + * type or field; + * - access_str_off - offset into corresponding .BTF string section. String + * interpretation depends on specific relocation kind: + * - for field-based relocations, string encodes an accessed field using + * a sequence of field and array indices, separated by colon (:). It's + * conceptually very close to LLVM's getelementptr ([0]) instruction's + * arguments for identifying offset to a field. + * - for type-based relocations, strings is expected to be just "0"; + * - for enum value-based relocations, string contains an index of enum + * value within its enum type; + * - kind - one of enum bpf_core_relo_kind; + * + * Example: + * struct sample { + * int a; + * struct { + * int b[10]; + * }; + * }; + * + * struct sample *s = ...; + * int *x = &s->a; // encoded as "0:0" (a is field #0) + * int *y = &s->b[5]; // encoded as "0:1:0:5" (anon struct is field #1, + * // b is field #0 inside anon struct, accessing elem #5) + * int *z = &s[10]->b; // encoded as "10:1" (ptr is used as an array) + * + * type_id for all relocs in this example will capture BTF type id of + * `struct sample`. + * + * Such relocation is emitted when using __builtin_preserve_access_index() + * Clang built-in, passing expression that captures field address, e.g.: + * + * bpf_probe_read(&dst, sizeof(dst), + * __builtin_preserve_access_index(&src->a.b.c)); + * + * In this case Clang will emit field relocation recording necessary data to + * be able to find offset of embedded `a.b.c` field within `src` struct. + * + * [0] https://llvm.org/docs/LangRef.html#getelementptr-instruction + */ +struct bpf_core_relo { + __u32 insn_off; + __u32 type_id; + __u32 access_str_off; + enum bpf_core_relo_kind kind; +}; + +/* + * Flags to control bpf_timer_start() behaviour. + * - BPF_F_TIMER_ABS: Timeout passed is absolute time, by default it is + * relative to current time. + */ +enum { + BPF_F_TIMER_ABS = (1ULL << 0), +}; + +/* BPF numbers iterator state */ +struct bpf_iter_num { + /* opaque iterator state; having __u64 here allows to preserve correct + * alignment requirements in vmlinux.h, generated from BTF + */ + __u64 __opaque[1]; +} __attribute__((aligned(8))); + +#endif /* _UAPI__LINUX_BPF_H__ */ diff --git a/libbpf/include/uapi/linux/bpf_common.h b/libbpf/include/uapi/linux/bpf_common.h new file mode 100644 index 0000000..ee97668 --- /dev/null +++ b/libbpf/include/uapi/linux/bpf_common.h @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__LINUX_BPF_COMMON_H__ +#define _UAPI__LINUX_BPF_COMMON_H__ + +/* Instruction classes */ +#define BPF_CLASS(code) ((code) & 0x07) +#define BPF_LD 0x00 +#define BPF_LDX 0x01 +#define BPF_ST 0x02 +#define BPF_STX 0x03 +#define BPF_ALU 0x04 +#define BPF_JMP 0x05 +#define BPF_RET 0x06 +#define BPF_MISC 0x07 + +/* ld/ldx fields */ +#define BPF_SIZE(code) ((code) & 0x18) +#define BPF_W 0x00 /* 32-bit */ +#define BPF_H 0x08 /* 16-bit */ +#define BPF_B 0x10 /* 8-bit */ +/* eBPF BPF_DW 0x18 64-bit */ +#define BPF_MODE(code) ((code) & 0xe0) +#define BPF_IMM 0x00 +#define BPF_ABS 0x20 +#define BPF_IND 0x40 +#define BPF_MEM 0x60 +#define BPF_LEN 0x80 +#define BPF_MSH 0xa0 + +/* alu/jmp fields */ +#define BPF_OP(code) ((code) & 0xf0) +#define BPF_ADD 0x00 +#define BPF_SUB 0x10 +#define BPF_MUL 0x20 +#define BPF_DIV 0x30 +#define BPF_OR 0x40 +#define BPF_AND 0x50 +#define BPF_LSH 0x60 +#define BPF_RSH 0x70 +#define BPF_NEG 0x80 +#define BPF_MOD 0x90 +#define BPF_XOR 0xa0 + +#define BPF_JA 0x00 +#define BPF_JEQ 0x10 +#define BPF_JGT 0x20 +#define BPF_JGE 0x30 +#define BPF_JSET 0x40 +#define BPF_SRC(code) ((code) & 0x08) +#define BPF_K 0x00 +#define BPF_X 0x08 + +#ifndef BPF_MAXINSNS +#define BPF_MAXINSNS 4096 +#endif + +#endif /* _UAPI__LINUX_BPF_COMMON_H__ */ diff --git a/libbpf/include/uapi/linux/btf.h b/libbpf/include/uapi/linux/btf.h new file mode 100644 index 0000000..ec1798b --- /dev/null +++ b/libbpf/include/uapi/linux/btf.h @@ -0,0 +1,200 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* Copyright (c) 2018 Facebook */ +#ifndef _UAPI__LINUX_BTF_H__ +#define _UAPI__LINUX_BTF_H__ + +#include + +#define BTF_MAGIC 0xeB9F +#define BTF_VERSION 1 + +struct btf_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + + /* All offsets are in bytes relative to the end of this header */ + __u32 type_off; /* offset of type section */ + __u32 type_len; /* length of type section */ + __u32 str_off; /* offset of string section */ + __u32 str_len; /* length of string section */ +}; + +/* Max # of type identifier */ +#define BTF_MAX_TYPE 0x000fffff +/* Max offset into the string section */ +#define BTF_MAX_NAME_OFFSET 0x00ffffff +/* Max # of struct/union/enum members or func args */ +#define BTF_MAX_VLEN 0xffff + +struct btf_type { + __u32 name_off; + /* "info" bits arrangement + * bits 0-15: vlen (e.g. # of struct's members) + * bits 16-23: unused + * bits 24-28: kind (e.g. int, ptr, array...etc) + * bits 29-30: unused + * bit 31: kind_flag, currently used by + * struct, union, enum, fwd and enum64 + */ + __u32 info; + /* "size" is used by INT, ENUM, STRUCT, UNION, DATASEC and ENUM64. + * "size" tells the size of the type it is describing. + * + * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, + * FUNC, FUNC_PROTO, VAR, DECL_TAG and TYPE_TAG. + * "type" is a type_id referring to another type. + */ + union { + __u32 size; + __u32 type; + }; +}; + +#define BTF_INFO_KIND(info) (((info) >> 24) & 0x1f) +#define BTF_INFO_VLEN(info) ((info) & 0xffff) +#define BTF_INFO_KFLAG(info) ((info) >> 31) + +enum { + BTF_KIND_UNKN = 0, /* Unknown */ + BTF_KIND_INT = 1, /* Integer */ + BTF_KIND_PTR = 2, /* Pointer */ + BTF_KIND_ARRAY = 3, /* Array */ + BTF_KIND_STRUCT = 4, /* Struct */ + BTF_KIND_UNION = 5, /* Union */ + BTF_KIND_ENUM = 6, /* Enumeration up to 32-bit values */ + BTF_KIND_FWD = 7, /* Forward */ + BTF_KIND_TYPEDEF = 8, /* Typedef */ + BTF_KIND_VOLATILE = 9, /* Volatile */ + BTF_KIND_CONST = 10, /* Const */ + BTF_KIND_RESTRICT = 11, /* Restrict */ + BTF_KIND_FUNC = 12, /* Function */ + BTF_KIND_FUNC_PROTO = 13, /* Function Proto */ + BTF_KIND_VAR = 14, /* Variable */ + BTF_KIND_DATASEC = 15, /* Section */ + BTF_KIND_FLOAT = 16, /* Floating point */ + BTF_KIND_DECL_TAG = 17, /* Decl Tag */ + BTF_KIND_TYPE_TAG = 18, /* Type Tag */ + BTF_KIND_ENUM64 = 19, /* Enumeration up to 64-bit values */ + + NR_BTF_KINDS, + BTF_KIND_MAX = NR_BTF_KINDS - 1, +}; + +/* For some specific BTF_KIND, "struct btf_type" is immediately + * followed by extra data. + */ + +/* BTF_KIND_INT is followed by a u32 and the following + * is the 32 bits arrangement: + */ +#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24) +#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16) +#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff) + +/* Attributes stored in the BTF_INT_ENCODING */ +#define BTF_INT_SIGNED (1 << 0) +#define BTF_INT_CHAR (1 << 1) +#define BTF_INT_BOOL (1 << 2) + +/* BTF_KIND_ENUM is followed by multiple "struct btf_enum". + * The exact number of btf_enum is stored in the vlen (of the + * info in "struct btf_type"). + */ +struct btf_enum { + __u32 name_off; + __s32 val; +}; + +/* BTF_KIND_ARRAY is followed by one "struct btf_array" */ +struct btf_array { + __u32 type; + __u32 index_type; + __u32 nelems; +}; + +/* BTF_KIND_STRUCT and BTF_KIND_UNION are followed + * by multiple "struct btf_member". The exact number + * of btf_member is stored in the vlen (of the info in + * "struct btf_type"). + */ +struct btf_member { + __u32 name_off; + __u32 type; + /* If the type info kind_flag is set, the btf_member offset + * contains both member bitfield size and bit offset. The + * bitfield size is set for bitfield members. If the type + * info kind_flag is not set, the offset contains only bit + * offset. + */ + __u32 offset; +}; + +/* If the struct/union type info kind_flag is set, the + * following two macros are used to access bitfield_size + * and bit_offset from btf_member.offset. + */ +#define BTF_MEMBER_BITFIELD_SIZE(val) ((val) >> 24) +#define BTF_MEMBER_BIT_OFFSET(val) ((val) & 0xffffff) + +/* BTF_KIND_FUNC_PROTO is followed by multiple "struct btf_param". + * The exact number of btf_param is stored in the vlen (of the + * info in "struct btf_type"). + */ +struct btf_param { + __u32 name_off; + __u32 type; +}; + +enum { + BTF_VAR_STATIC = 0, + BTF_VAR_GLOBAL_ALLOCATED = 1, + BTF_VAR_GLOBAL_EXTERN = 2, +}; + +enum btf_func_linkage { + BTF_FUNC_STATIC = 0, + BTF_FUNC_GLOBAL = 1, + BTF_FUNC_EXTERN = 2, +}; + +/* BTF_KIND_VAR is followed by a single "struct btf_var" to describe + * additional information related to the variable such as its linkage. + */ +struct btf_var { + __u32 linkage; +}; + +/* BTF_KIND_DATASEC is followed by multiple "struct btf_var_secinfo" + * to describe all BTF_KIND_VAR types it contains along with it's + * in-section offset as well as size. + */ +struct btf_var_secinfo { + __u32 type; + __u32 offset; + __u32 size; +}; + +/* BTF_KIND_DECL_TAG is followed by a single "struct btf_decl_tag" to describe + * additional information related to the tag applied location. + * If component_idx == -1, the tag is applied to a struct, union, + * variable or function. Otherwise, it is applied to a struct/union + * member or a func argument, and component_idx indicates which member + * or argument (0 ... vlen-1). + */ +struct btf_decl_tag { + __s32 component_idx; +}; + +/* BTF_KIND_ENUM64 is followed by multiple "struct btf_enum64". + * The exact number of btf_enum64 is stored in the vlen (of the + * info in "struct btf_type"). + */ +struct btf_enum64 { + __u32 name_off; + __u32 val_lo32; + __u32 val_hi32; +}; + +#endif /* _UAPI__LINUX_BTF_H__ */ diff --git a/libbpf/include/uapi/linux/fcntl.h b/libbpf/include/uapi/linux/fcntl.h new file mode 100644 index 0000000..2f86b2a --- /dev/null +++ b/libbpf/include/uapi/linux/fcntl.h @@ -0,0 +1,114 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_FCNTL_H +#define _UAPI_LINUX_FCNTL_H + +#include +#include + +#define F_SETLEASE (F_LINUX_SPECIFIC_BASE + 0) +#define F_GETLEASE (F_LINUX_SPECIFIC_BASE + 1) + +/* + * Cancel a blocking posix lock; internal use only until we expose an + * asynchronous lock api to userspace: + */ +#define F_CANCELLK (F_LINUX_SPECIFIC_BASE + 5) + +/* Create a file descriptor with FD_CLOEXEC set. */ +#define F_DUPFD_CLOEXEC (F_LINUX_SPECIFIC_BASE + 6) + +/* + * Request nofications on a directory. + * See below for events that may be notified. + */ +#define F_NOTIFY (F_LINUX_SPECIFIC_BASE+2) + +/* + * Set and get of pipe page size array + */ +#define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7) +#define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8) + +/* + * Set/Get seals + */ +#define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9) +#define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10) + +/* + * Types of seals + */ +#define F_SEAL_SEAL 0x0001 /* prevent further seals from being set */ +#define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */ +#define F_SEAL_GROW 0x0004 /* prevent file from growing */ +#define F_SEAL_WRITE 0x0008 /* prevent writes */ +#define F_SEAL_FUTURE_WRITE 0x0010 /* prevent future writes while mapped */ +/* (1U << 31) is reserved for signed error codes */ + +/* + * Set/Get write life time hints. {GET,SET}_RW_HINT operate on the + * underlying inode, while {GET,SET}_FILE_RW_HINT operate only on + * the specific file. + */ +#define F_GET_RW_HINT (F_LINUX_SPECIFIC_BASE + 11) +#define F_SET_RW_HINT (F_LINUX_SPECIFIC_BASE + 12) +#define F_GET_FILE_RW_HINT (F_LINUX_SPECIFIC_BASE + 13) +#define F_SET_FILE_RW_HINT (F_LINUX_SPECIFIC_BASE + 14) + +/* + * Valid hint values for F_{GET,SET}_RW_HINT. 0 is "not set", or can be + * used to clear any hints previously set. + */ +#define RWH_WRITE_LIFE_NOT_SET 0 +#define RWH_WRITE_LIFE_NONE 1 +#define RWH_WRITE_LIFE_SHORT 2 +#define RWH_WRITE_LIFE_MEDIUM 3 +#define RWH_WRITE_LIFE_LONG 4 +#define RWH_WRITE_LIFE_EXTREME 5 + +/* + * The originally introduced spelling is remained from the first + * versions of the patch set that introduced the feature, see commit + * v4.13-rc1~212^2~51. + */ +#define RWF_WRITE_LIFE_NOT_SET RWH_WRITE_LIFE_NOT_SET + +/* + * Types of directory notifications that may be requested. + */ +#define DN_ACCESS 0x00000001 /* File accessed */ +#define DN_MODIFY 0x00000002 /* File modified */ +#define DN_CREATE 0x00000004 /* File created */ +#define DN_DELETE 0x00000008 /* File removed */ +#define DN_RENAME 0x00000010 /* File renamed */ +#define DN_ATTRIB 0x00000020 /* File changed attibutes */ +#define DN_MULTISHOT 0x80000000 /* Don't remove notifier */ + +/* + * The constants AT_REMOVEDIR and AT_EACCESS have the same value. AT_EACCESS is + * meaningful only to faccessat, while AT_REMOVEDIR is meaningful only to + * unlinkat. The two functions do completely different things and therefore, + * the flags can be allowed to overlap. For example, passing AT_REMOVEDIR to + * faccessat would be undefined behavior and thus treating it equivalent to + * AT_EACCESS is valid undefined behavior. + */ +#define AT_FDCWD -100 /* Special value used to indicate + openat should use the current + working directory. */ +#define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ +#define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ +#define AT_REMOVEDIR 0x200 /* Remove directory instead of + unlinking file. */ +#define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ +#define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount traversal */ +#define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname */ + +#define AT_STATX_SYNC_TYPE 0x6000 /* Type of synchronisation required from statx() */ +#define AT_STATX_SYNC_AS_STAT 0x0000 /* - Do whatever stat() does */ +#define AT_STATX_FORCE_SYNC 0x2000 /* - Force the attributes to be sync'd with the server */ +#define AT_STATX_DONT_SYNC 0x4000 /* - Don't sync attributes with the server */ + +#define AT_RECURSIVE 0x8000 /* Apply to the entire subtree */ + +#endif /* _UAPI_LINUX_FCNTL_H */ diff --git a/libbpf/include/uapi/linux/if_link.h b/libbpf/include/uapi/linux/if_link.h new file mode 100644 index 0000000..901d98b --- /dev/null +++ b/libbpf/include/uapi/linux/if_link.h @@ -0,0 +1,1283 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_IF_LINK_H +#define _UAPI_LINUX_IF_LINK_H + +#include +#include + +/* This struct should be in sync with struct rtnl_link_stats64 */ +struct rtnl_link_stats { + __u32 rx_packets; + __u32 tx_packets; + __u32 rx_bytes; + __u32 tx_bytes; + __u32 rx_errors; + __u32 tx_errors; + __u32 rx_dropped; + __u32 tx_dropped; + __u32 multicast; + __u32 collisions; + /* detailed rx_errors: */ + __u32 rx_length_errors; + __u32 rx_over_errors; + __u32 rx_crc_errors; + __u32 rx_frame_errors; + __u32 rx_fifo_errors; + __u32 rx_missed_errors; + + /* detailed tx_errors */ + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + + /* for cslip etc */ + __u32 rx_compressed; + __u32 tx_compressed; + + __u32 rx_nohandler; +}; + +/** + * struct rtnl_link_stats64 - The main device statistics structure. + * + * @rx_packets: Number of good packets received by the interface. + * For hardware interfaces counts all good packets received from the device + * by the host, including packets which host had to drop at various stages + * of processing (even in the driver). + * + * @tx_packets: Number of packets successfully transmitted. + * For hardware interfaces counts packets which host was able to successfully + * hand over to the device, which does not necessarily mean that packets + * had been successfully transmitted out of the device, only that device + * acknowledged it copied them out of host memory. + * + * @rx_bytes: Number of good received bytes, corresponding to @rx_packets. + * + * For IEEE 802.3 devices should count the length of Ethernet Frames + * excluding the FCS. + * + * @tx_bytes: Number of good transmitted bytes, corresponding to @tx_packets. + * + * For IEEE 802.3 devices should count the length of Ethernet Frames + * excluding the FCS. + * + * @rx_errors: Total number of bad packets received on this network device. + * This counter must include events counted by @rx_length_errors, + * @rx_crc_errors, @rx_frame_errors and other errors not otherwise + * counted. + * + * @tx_errors: Total number of transmit problems. + * This counter must include events counter by @tx_aborted_errors, + * @tx_carrier_errors, @tx_fifo_errors, @tx_heartbeat_errors, + * @tx_window_errors and other errors not otherwise counted. + * + * @rx_dropped: Number of packets received but not processed, + * e.g. due to lack of resources or unsupported protocol. + * For hardware interfaces this counter may include packets discarded + * due to L2 address filtering but should not include packets dropped + * by the device due to buffer exhaustion which are counted separately in + * @rx_missed_errors (since procfs folds those two counters together). + * + * @tx_dropped: Number of packets dropped on their way to transmission, + * e.g. due to lack of resources. + * + * @multicast: Multicast packets received. + * For hardware interfaces this statistic is commonly calculated + * at the device level (unlike @rx_packets) and therefore may include + * packets which did not reach the host. + * + * For IEEE 802.3 devices this counter may be equivalent to: + * + * - 30.3.1.1.21 aMulticastFramesReceivedOK + * + * @collisions: Number of collisions during packet transmissions. + * + * @rx_length_errors: Number of packets dropped due to invalid length. + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter should be equivalent to a sum + * of the following attributes: + * + * - 30.3.1.1.23 aInRangeLengthErrors + * - 30.3.1.1.24 aOutOfRangeLengthField + * - 30.3.1.1.25 aFrameTooLongErrors + * + * @rx_over_errors: Receiver FIFO overflow event counter. + * + * Historically the count of overflow events. Such events may be + * reported in the receive descriptors or via interrupts, and may + * not correspond one-to-one with dropped packets. + * + * The recommended interpretation for high speed interfaces is - + * number of packets dropped because they did not fit into buffers + * provided by the host, e.g. packets larger than MTU or next buffer + * in the ring was not available for a scatter transfer. + * + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * This statistics was historically used interchangeably with + * @rx_fifo_errors. + * + * This statistic corresponds to hardware events and is not commonly used + * on software devices. + * + * @rx_crc_errors: Number of packets received with a CRC error. + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter must be equivalent to: + * + * - 30.3.1.1.6 aFrameCheckSequenceErrors + * + * @rx_frame_errors: Receiver frame alignment errors. + * Part of aggregate "frame" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter should be equivalent to: + * + * - 30.3.1.1.7 aAlignmentErrors + * + * @rx_fifo_errors: Receiver FIFO error counter. + * + * Historically the count of overflow events. Those events may be + * reported in the receive descriptors or via interrupts, and may + * not correspond one-to-one with dropped packets. + * + * This statistics was used interchangeably with @rx_over_errors. + * Not recommended for use in drivers for high speed interfaces. + * + * This statistic is used on software devices, e.g. to count software + * packet queue overflow (can) or sequencing errors (GRE). + * + * @rx_missed_errors: Count of packets missed by the host. + * Folded into the "drop" counter in `/proc/net/dev`. + * + * Counts number of packets dropped by the device due to lack + * of buffer space. This usually indicates that the host interface + * is slower than the network interface, or host is not keeping up + * with the receive packet rate. + * + * This statistic corresponds to hardware events and is not used + * on software devices. + * + * @tx_aborted_errors: + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * For IEEE 802.3 devices capable of half-duplex operation this counter + * must be equivalent to: + * + * - 30.3.1.1.11 aFramesAbortedDueToXSColls + * + * High speed interfaces may use this counter as a general device + * discard counter. + * + * @tx_carrier_errors: Number of frame transmission errors due to loss + * of carrier during transmission. + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter must be equivalent to: + * + * - 30.3.1.1.13 aCarrierSenseErrors + * + * @tx_fifo_errors: Number of frame transmission errors due to device + * FIFO underrun / underflow. This condition occurs when the device + * begins transmission of a frame but is unable to deliver the + * entire frame to the transmitter in time for transmission. + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * @tx_heartbeat_errors: Number of Heartbeat / SQE Test errors for + * old half-duplex Ethernet. + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices possibly equivalent to: + * + * - 30.3.2.1.4 aSQETestErrors + * + * @tx_window_errors: Number of frame transmission errors due + * to late collisions (for Ethernet - after the first 64B of transmission). + * Part of aggregate "carrier" errors in `/proc/net/dev`. + * + * For IEEE 802.3 devices this counter must be equivalent to: + * + * - 30.3.1.1.10 aLateCollisions + * + * @rx_compressed: Number of correctly received compressed packets. + * This counters is only meaningful for interfaces which support + * packet compression (e.g. CSLIP, PPP). + * + * @tx_compressed: Number of transmitted compressed packets. + * This counters is only meaningful for interfaces which support + * packet compression (e.g. CSLIP, PPP). + * + * @rx_nohandler: Number of packets received on the interface + * but dropped by the networking stack because the device is + * not designated to receive packets (e.g. backup link in a bond). + */ +struct rtnl_link_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; + __u64 collisions; + + /* detailed rx_errors: */ + __u64 rx_length_errors; + __u64 rx_over_errors; + __u64 rx_crc_errors; + __u64 rx_frame_errors; + __u64 rx_fifo_errors; + __u64 rx_missed_errors; + + /* detailed tx_errors */ + __u64 tx_aborted_errors; + __u64 tx_carrier_errors; + __u64 tx_fifo_errors; + __u64 tx_heartbeat_errors; + __u64 tx_window_errors; + + /* for cslip etc */ + __u64 rx_compressed; + __u64 tx_compressed; + __u64 rx_nohandler; +}; + +/* The struct should be in sync with struct ifmap */ +struct rtnl_link_ifmap { + __u64 mem_start; + __u64 mem_end; + __u64 base_addr; + __u16 irq; + __u8 dma; + __u8 port; +}; + +/* + * IFLA_AF_SPEC + * Contains nested attributes for address family specific attributes. + * Each address family may create a attribute with the address family + * number as type and create its own attribute structure in it. + * + * Example: + * [IFLA_AF_SPEC] = { + * [AF_INET] = { + * [IFLA_INET_CONF] = ..., + * }, + * [AF_INET6] = { + * [IFLA_INET6_FLAGS] = ..., + * [IFLA_INET6_CONF] = ..., + * } + * } + */ + +enum { + IFLA_UNSPEC, + IFLA_ADDRESS, + IFLA_BROADCAST, + IFLA_IFNAME, + IFLA_MTU, + IFLA_LINK, + IFLA_QDISC, + IFLA_STATS, + IFLA_COST, +#define IFLA_COST IFLA_COST + IFLA_PRIORITY, +#define IFLA_PRIORITY IFLA_PRIORITY + IFLA_MASTER, +#define IFLA_MASTER IFLA_MASTER + IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */ +#define IFLA_WIRELESS IFLA_WIRELESS + IFLA_PROTINFO, /* Protocol specific information for a link */ +#define IFLA_PROTINFO IFLA_PROTINFO + IFLA_TXQLEN, +#define IFLA_TXQLEN IFLA_TXQLEN + IFLA_MAP, +#define IFLA_MAP IFLA_MAP + IFLA_WEIGHT, +#define IFLA_WEIGHT IFLA_WEIGHT + IFLA_OPERSTATE, + IFLA_LINKMODE, + IFLA_LINKINFO, +#define IFLA_LINKINFO IFLA_LINKINFO + IFLA_NET_NS_PID, + IFLA_IFALIAS, + IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ + IFLA_VFINFO_LIST, + IFLA_STATS64, + IFLA_VF_PORTS, + IFLA_PORT_SELF, + IFLA_AF_SPEC, + IFLA_GROUP, /* Group the device belongs to */ + IFLA_NET_NS_FD, + IFLA_EXT_MASK, /* Extended info mask, VFs, etc */ + IFLA_PROMISCUITY, /* Promiscuity count: > 0 means acts PROMISC */ +#define IFLA_PROMISCUITY IFLA_PROMISCUITY + IFLA_NUM_TX_QUEUES, + IFLA_NUM_RX_QUEUES, + IFLA_CARRIER, + IFLA_PHYS_PORT_ID, + IFLA_CARRIER_CHANGES, + IFLA_PHYS_SWITCH_ID, + IFLA_LINK_NETNSID, + IFLA_PHYS_PORT_NAME, + IFLA_PROTO_DOWN, + IFLA_GSO_MAX_SEGS, + IFLA_GSO_MAX_SIZE, + IFLA_PAD, + IFLA_XDP, + IFLA_EVENT, + IFLA_NEW_NETNSID, + IFLA_IF_NETNSID, + IFLA_TARGET_NETNSID = IFLA_IF_NETNSID, /* new alias */ + IFLA_CARRIER_UP_COUNT, + IFLA_CARRIER_DOWN_COUNT, + IFLA_NEW_IFINDEX, + IFLA_MIN_MTU, + IFLA_MAX_MTU, + IFLA_PROP_LIST, + IFLA_ALT_IFNAME, /* Alternative ifname */ + IFLA_PERM_ADDRESS, + IFLA_PROTO_DOWN_REASON, + + /* device (sysfs) name as parent, used instead + * of IFLA_LINK where there's no parent netdev + */ + IFLA_PARENT_DEV_NAME, + IFLA_PARENT_DEV_BUS_NAME, + IFLA_GRO_MAX_SIZE, + IFLA_TSO_MAX_SIZE, + IFLA_TSO_MAX_SEGS, + + __IFLA_MAX +}; + + +#define IFLA_MAX (__IFLA_MAX - 1) + +enum { + IFLA_PROTO_DOWN_REASON_UNSPEC, + IFLA_PROTO_DOWN_REASON_MASK, /* u32, mask for reason bits */ + IFLA_PROTO_DOWN_REASON_VALUE, /* u32, reason bit value */ + + __IFLA_PROTO_DOWN_REASON_CNT, + IFLA_PROTO_DOWN_REASON_MAX = __IFLA_PROTO_DOWN_REASON_CNT - 1 +}; + +/* backwards compatibility for userspace */ +#ifndef __KERNEL__ +#define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) +#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) +#endif + +enum { + IFLA_INET_UNSPEC, + IFLA_INET_CONF, + __IFLA_INET_MAX, +}; + +#define IFLA_INET_MAX (__IFLA_INET_MAX - 1) + +/* ifi_flags. + + IFF_* flags. + + The only change is: + IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are + more not changeable by user. They describe link media + characteristics and set by device driver. + + Comments: + - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid + - If neither of these three flags are set; + the interface is NBMA. + + - IFF_MULTICAST does not mean anything special: + multicasts can be used on all not-NBMA links. + IFF_MULTICAST means that this media uses special encapsulation + for multicast frames. Apparently, all IFF_POINTOPOINT and + IFF_BROADCAST devices are able to use multicasts too. + */ + +/* IFLA_LINK. + For usual devices it is equal ifi_index. + If it is a "virtual interface" (f.e. tunnel), ifi_link + can point to real physical interface (f.e. for bandwidth calculations), + or maybe 0, what means, that real media is unknown (usual + for IPIP tunnels, when route to endpoint is allowed to change) + */ + +/* Subtype attributes for IFLA_PROTINFO */ +enum { + IFLA_INET6_UNSPEC, + IFLA_INET6_FLAGS, /* link flags */ + IFLA_INET6_CONF, /* sysctl parameters */ + IFLA_INET6_STATS, /* statistics */ + IFLA_INET6_MCAST, /* MC things. What of them? */ + IFLA_INET6_CACHEINFO, /* time values and max reasm size */ + IFLA_INET6_ICMP6STATS, /* statistics (icmpv6) */ + IFLA_INET6_TOKEN, /* device token */ + IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */ + IFLA_INET6_RA_MTU, /* mtu carried in the RA message */ + __IFLA_INET6_MAX +}; + +#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) + +enum in6_addr_gen_mode { + IN6_ADDR_GEN_MODE_EUI64, + IN6_ADDR_GEN_MODE_NONE, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY, + IN6_ADDR_GEN_MODE_RANDOM, +}; + +/* Bridge section */ + +enum { + IFLA_BR_UNSPEC, + IFLA_BR_FORWARD_DELAY, + IFLA_BR_HELLO_TIME, + IFLA_BR_MAX_AGE, + IFLA_BR_AGEING_TIME, + IFLA_BR_STP_STATE, + IFLA_BR_PRIORITY, + IFLA_BR_VLAN_FILTERING, + IFLA_BR_VLAN_PROTOCOL, + IFLA_BR_GROUP_FWD_MASK, + IFLA_BR_ROOT_ID, + IFLA_BR_BRIDGE_ID, + IFLA_BR_ROOT_PORT, + IFLA_BR_ROOT_PATH_COST, + IFLA_BR_TOPOLOGY_CHANGE, + IFLA_BR_TOPOLOGY_CHANGE_DETECTED, + IFLA_BR_HELLO_TIMER, + IFLA_BR_TCN_TIMER, + IFLA_BR_TOPOLOGY_CHANGE_TIMER, + IFLA_BR_GC_TIMER, + IFLA_BR_GROUP_ADDR, + IFLA_BR_FDB_FLUSH, + IFLA_BR_MCAST_ROUTER, + IFLA_BR_MCAST_SNOOPING, + IFLA_BR_MCAST_QUERY_USE_IFADDR, + IFLA_BR_MCAST_QUERIER, + IFLA_BR_MCAST_HASH_ELASTICITY, + IFLA_BR_MCAST_HASH_MAX, + IFLA_BR_MCAST_LAST_MEMBER_CNT, + IFLA_BR_MCAST_STARTUP_QUERY_CNT, + IFLA_BR_MCAST_LAST_MEMBER_INTVL, + IFLA_BR_MCAST_MEMBERSHIP_INTVL, + IFLA_BR_MCAST_QUERIER_INTVL, + IFLA_BR_MCAST_QUERY_INTVL, + IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, + IFLA_BR_MCAST_STARTUP_QUERY_INTVL, + IFLA_BR_NF_CALL_IPTABLES, + IFLA_BR_NF_CALL_IP6TABLES, + IFLA_BR_NF_CALL_ARPTABLES, + IFLA_BR_VLAN_DEFAULT_PVID, + IFLA_BR_PAD, + IFLA_BR_VLAN_STATS_ENABLED, + IFLA_BR_MCAST_STATS_ENABLED, + IFLA_BR_MCAST_IGMP_VERSION, + IFLA_BR_MCAST_MLD_VERSION, + IFLA_BR_VLAN_STATS_PER_PORT, + IFLA_BR_MULTI_BOOLOPT, + IFLA_BR_MCAST_QUERIER_STATE, + __IFLA_BR_MAX, +}; + +#define IFLA_BR_MAX (__IFLA_BR_MAX - 1) + +struct ifla_bridge_id { + __u8 prio[2]; + __u8 addr[6]; /* ETH_ALEN */ +}; + +enum { + BRIDGE_MODE_UNSPEC, + BRIDGE_MODE_HAIRPIN, +}; + +enum { + IFLA_BRPORT_UNSPEC, + IFLA_BRPORT_STATE, /* Spanning tree state */ + IFLA_BRPORT_PRIORITY, /* " priority */ + IFLA_BRPORT_COST, /* " cost */ + IFLA_BRPORT_MODE, /* mode (hairpin) */ + IFLA_BRPORT_GUARD, /* bpdu guard */ + IFLA_BRPORT_PROTECT, /* root port protection */ + IFLA_BRPORT_FAST_LEAVE, /* multicast fast leave */ + IFLA_BRPORT_LEARNING, /* mac learning */ + IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */ + IFLA_BRPORT_PROXYARP, /* proxy ARP */ + IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */ + IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */ + IFLA_BRPORT_ROOT_ID, /* designated root */ + IFLA_BRPORT_BRIDGE_ID, /* designated bridge */ + IFLA_BRPORT_DESIGNATED_PORT, + IFLA_BRPORT_DESIGNATED_COST, + IFLA_BRPORT_ID, + IFLA_BRPORT_NO, + IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, + IFLA_BRPORT_CONFIG_PENDING, + IFLA_BRPORT_MESSAGE_AGE_TIMER, + IFLA_BRPORT_FORWARD_DELAY_TIMER, + IFLA_BRPORT_HOLD_TIMER, + IFLA_BRPORT_FLUSH, + IFLA_BRPORT_MULTICAST_ROUTER, + IFLA_BRPORT_PAD, + IFLA_BRPORT_MCAST_FLOOD, + IFLA_BRPORT_MCAST_TO_UCAST, + IFLA_BRPORT_VLAN_TUNNEL, + IFLA_BRPORT_BCAST_FLOOD, + IFLA_BRPORT_GROUP_FWD_MASK, + IFLA_BRPORT_NEIGH_SUPPRESS, + IFLA_BRPORT_ISOLATED, + IFLA_BRPORT_BACKUP_PORT, + IFLA_BRPORT_MRP_RING_OPEN, + IFLA_BRPORT_MRP_IN_OPEN, + IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT, + IFLA_BRPORT_MCAST_EHT_HOSTS_CNT, + __IFLA_BRPORT_MAX +}; +#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) + +struct ifla_cacheinfo { + __u32 max_reasm_len; + __u32 tstamp; /* ipv6InterfaceTable updated timestamp */ + __u32 reachable_time; + __u32 retrans_time; +}; + +enum { + IFLA_INFO_UNSPEC, + IFLA_INFO_KIND, + IFLA_INFO_DATA, + IFLA_INFO_XSTATS, + IFLA_INFO_SLAVE_KIND, + IFLA_INFO_SLAVE_DATA, + __IFLA_INFO_MAX, +}; + +#define IFLA_INFO_MAX (__IFLA_INFO_MAX - 1) + +/* VLAN section */ + +enum { + IFLA_VLAN_UNSPEC, + IFLA_VLAN_ID, + IFLA_VLAN_FLAGS, + IFLA_VLAN_EGRESS_QOS, + IFLA_VLAN_INGRESS_QOS, + IFLA_VLAN_PROTOCOL, + __IFLA_VLAN_MAX, +}; + +#define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1) + +struct ifla_vlan_flags { + __u32 flags; + __u32 mask; +}; + +enum { + IFLA_VLAN_QOS_UNSPEC, + IFLA_VLAN_QOS_MAPPING, + __IFLA_VLAN_QOS_MAX +}; + +#define IFLA_VLAN_QOS_MAX (__IFLA_VLAN_QOS_MAX - 1) + +struct ifla_vlan_qos_mapping { + __u32 from; + __u32 to; +}; + +/* MACVLAN section */ +enum { + IFLA_MACVLAN_UNSPEC, + IFLA_MACVLAN_MODE, + IFLA_MACVLAN_FLAGS, + IFLA_MACVLAN_MACADDR_MODE, + IFLA_MACVLAN_MACADDR, + IFLA_MACVLAN_MACADDR_DATA, + IFLA_MACVLAN_MACADDR_COUNT, + IFLA_MACVLAN_BC_QUEUE_LEN, + IFLA_MACVLAN_BC_QUEUE_LEN_USED, + __IFLA_MACVLAN_MAX, +}; + +#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1) + +enum macvlan_mode { + MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */ + MACVLAN_MODE_VEPA = 2, /* talk to other ports through ext bridge */ + MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ + MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */ + MACVLAN_MODE_SOURCE = 16,/* use source MAC address list to assign */ +}; + +enum macvlan_macaddr_mode { + MACVLAN_MACADDR_ADD, + MACVLAN_MACADDR_DEL, + MACVLAN_MACADDR_FLUSH, + MACVLAN_MACADDR_SET, +}; + +#define MACVLAN_FLAG_NOPROMISC 1 +#define MACVLAN_FLAG_NODST 2 /* skip dst macvlan if matching src macvlan */ + +/* VRF section */ +enum { + IFLA_VRF_UNSPEC, + IFLA_VRF_TABLE, + __IFLA_VRF_MAX +}; + +#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) + +enum { + IFLA_VRF_PORT_UNSPEC, + IFLA_VRF_PORT_TABLE, + __IFLA_VRF_PORT_MAX +}; + +#define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1) + +/* MACSEC section */ +enum { + IFLA_MACSEC_UNSPEC, + IFLA_MACSEC_SCI, + IFLA_MACSEC_PORT, + IFLA_MACSEC_ICV_LEN, + IFLA_MACSEC_CIPHER_SUITE, + IFLA_MACSEC_WINDOW, + IFLA_MACSEC_ENCODING_SA, + IFLA_MACSEC_ENCRYPT, + IFLA_MACSEC_PROTECT, + IFLA_MACSEC_INC_SCI, + IFLA_MACSEC_ES, + IFLA_MACSEC_SCB, + IFLA_MACSEC_REPLAY_PROTECT, + IFLA_MACSEC_VALIDATION, + IFLA_MACSEC_PAD, + IFLA_MACSEC_OFFLOAD, + __IFLA_MACSEC_MAX, +}; + +#define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1) + +/* XFRM section */ +enum { + IFLA_XFRM_UNSPEC, + IFLA_XFRM_LINK, + IFLA_XFRM_IF_ID, + IFLA_XFRM_COLLECT_METADATA, + __IFLA_XFRM_MAX +}; + +#define IFLA_XFRM_MAX (__IFLA_XFRM_MAX - 1) + +enum macsec_validation_type { + MACSEC_VALIDATE_DISABLED = 0, + MACSEC_VALIDATE_CHECK = 1, + MACSEC_VALIDATE_STRICT = 2, + __MACSEC_VALIDATE_END, + MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1, +}; + +enum macsec_offload { + MACSEC_OFFLOAD_OFF = 0, + MACSEC_OFFLOAD_PHY = 1, + MACSEC_OFFLOAD_MAC = 2, + __MACSEC_OFFLOAD_END, + MACSEC_OFFLOAD_MAX = __MACSEC_OFFLOAD_END - 1, +}; + +/* IPVLAN section */ +enum { + IFLA_IPVLAN_UNSPEC, + IFLA_IPVLAN_MODE, + IFLA_IPVLAN_FLAGS, + __IFLA_IPVLAN_MAX +}; + +#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1) + +enum ipvlan_mode { + IPVLAN_MODE_L2 = 0, + IPVLAN_MODE_L3, + IPVLAN_MODE_L3S, + IPVLAN_MODE_MAX +}; + +#define IPVLAN_F_PRIVATE 0x01 +#define IPVLAN_F_VEPA 0x02 + +/* VXLAN section */ +enum { + IFLA_VXLAN_UNSPEC, + IFLA_VXLAN_ID, + IFLA_VXLAN_GROUP, /* group or remote address */ + IFLA_VXLAN_LINK, + IFLA_VXLAN_LOCAL, + IFLA_VXLAN_TTL, + IFLA_VXLAN_TOS, + IFLA_VXLAN_LEARNING, + IFLA_VXLAN_AGEING, + IFLA_VXLAN_LIMIT, + IFLA_VXLAN_PORT_RANGE, /* source port */ + IFLA_VXLAN_PROXY, + IFLA_VXLAN_RSC, + IFLA_VXLAN_L2MISS, + IFLA_VXLAN_L3MISS, + IFLA_VXLAN_PORT, /* destination port */ + IFLA_VXLAN_GROUP6, + IFLA_VXLAN_LOCAL6, + IFLA_VXLAN_UDP_CSUM, + IFLA_VXLAN_UDP_ZERO_CSUM6_TX, + IFLA_VXLAN_UDP_ZERO_CSUM6_RX, + IFLA_VXLAN_REMCSUM_TX, + IFLA_VXLAN_REMCSUM_RX, + IFLA_VXLAN_GBP, + IFLA_VXLAN_REMCSUM_NOPARTIAL, + IFLA_VXLAN_COLLECT_METADATA, + IFLA_VXLAN_LABEL, + IFLA_VXLAN_GPE, + IFLA_VXLAN_TTL_INHERIT, + IFLA_VXLAN_DF, + __IFLA_VXLAN_MAX +}; +#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) + +struct ifla_vxlan_port_range { + __be16 low; + __be16 high; +}; + +enum ifla_vxlan_df { + VXLAN_DF_UNSET = 0, + VXLAN_DF_SET, + VXLAN_DF_INHERIT, + __VXLAN_DF_END, + VXLAN_DF_MAX = __VXLAN_DF_END - 1, +}; + +/* GENEVE section */ +enum { + IFLA_GENEVE_UNSPEC, + IFLA_GENEVE_ID, + IFLA_GENEVE_REMOTE, + IFLA_GENEVE_TTL, + IFLA_GENEVE_TOS, + IFLA_GENEVE_PORT, /* destination port */ + IFLA_GENEVE_COLLECT_METADATA, + IFLA_GENEVE_REMOTE6, + IFLA_GENEVE_UDP_CSUM, + IFLA_GENEVE_UDP_ZERO_CSUM6_TX, + IFLA_GENEVE_UDP_ZERO_CSUM6_RX, + IFLA_GENEVE_LABEL, + IFLA_GENEVE_TTL_INHERIT, + IFLA_GENEVE_DF, + __IFLA_GENEVE_MAX +}; +#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) + +enum ifla_geneve_df { + GENEVE_DF_UNSET = 0, + GENEVE_DF_SET, + GENEVE_DF_INHERIT, + __GENEVE_DF_END, + GENEVE_DF_MAX = __GENEVE_DF_END - 1, +}; + +/* Bareudp section */ +enum { + IFLA_BAREUDP_UNSPEC, + IFLA_BAREUDP_PORT, + IFLA_BAREUDP_ETHERTYPE, + IFLA_BAREUDP_SRCPORT_MIN, + IFLA_BAREUDP_MULTIPROTO_MODE, + __IFLA_BAREUDP_MAX +}; + +#define IFLA_BAREUDP_MAX (__IFLA_BAREUDP_MAX - 1) + +/* PPP section */ +enum { + IFLA_PPP_UNSPEC, + IFLA_PPP_DEV_FD, + __IFLA_PPP_MAX +}; +#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1) + +/* GTP section */ + +enum ifla_gtp_role { + GTP_ROLE_GGSN = 0, + GTP_ROLE_SGSN, +}; + +enum { + IFLA_GTP_UNSPEC, + IFLA_GTP_FD0, + IFLA_GTP_FD1, + IFLA_GTP_PDP_HASHSIZE, + IFLA_GTP_ROLE, + __IFLA_GTP_MAX, +}; +#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1) + +/* Bonding section */ + +enum { + IFLA_BOND_UNSPEC, + IFLA_BOND_MODE, + IFLA_BOND_ACTIVE_SLAVE, + IFLA_BOND_MIIMON, + IFLA_BOND_UPDELAY, + IFLA_BOND_DOWNDELAY, + IFLA_BOND_USE_CARRIER, + IFLA_BOND_ARP_INTERVAL, + IFLA_BOND_ARP_IP_TARGET, + IFLA_BOND_ARP_VALIDATE, + IFLA_BOND_ARP_ALL_TARGETS, + IFLA_BOND_PRIMARY, + IFLA_BOND_PRIMARY_RESELECT, + IFLA_BOND_FAIL_OVER_MAC, + IFLA_BOND_XMIT_HASH_POLICY, + IFLA_BOND_RESEND_IGMP, + IFLA_BOND_NUM_PEER_NOTIF, + IFLA_BOND_ALL_SLAVES_ACTIVE, + IFLA_BOND_MIN_LINKS, + IFLA_BOND_LP_INTERVAL, + IFLA_BOND_PACKETS_PER_SLAVE, + IFLA_BOND_AD_LACP_RATE, + IFLA_BOND_AD_SELECT, + IFLA_BOND_AD_INFO, + IFLA_BOND_AD_ACTOR_SYS_PRIO, + IFLA_BOND_AD_USER_PORT_KEY, + IFLA_BOND_AD_ACTOR_SYSTEM, + IFLA_BOND_TLB_DYNAMIC_LB, + IFLA_BOND_PEER_NOTIF_DELAY, + IFLA_BOND_AD_LACP_ACTIVE, + IFLA_BOND_MISSED_MAX, + IFLA_BOND_NS_IP6_TARGET, + __IFLA_BOND_MAX, +}; + +#define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1) + +enum { + IFLA_BOND_AD_INFO_UNSPEC, + IFLA_BOND_AD_INFO_AGGREGATOR, + IFLA_BOND_AD_INFO_NUM_PORTS, + IFLA_BOND_AD_INFO_ACTOR_KEY, + IFLA_BOND_AD_INFO_PARTNER_KEY, + IFLA_BOND_AD_INFO_PARTNER_MAC, + __IFLA_BOND_AD_INFO_MAX, +}; + +#define IFLA_BOND_AD_INFO_MAX (__IFLA_BOND_AD_INFO_MAX - 1) + +enum { + IFLA_BOND_SLAVE_UNSPEC, + IFLA_BOND_SLAVE_STATE, + IFLA_BOND_SLAVE_MII_STATUS, + IFLA_BOND_SLAVE_LINK_FAILURE_COUNT, + IFLA_BOND_SLAVE_PERM_HWADDR, + IFLA_BOND_SLAVE_QUEUE_ID, + IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, + IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, + IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, + IFLA_BOND_SLAVE_PRIO, + __IFLA_BOND_SLAVE_MAX, +}; + +#define IFLA_BOND_SLAVE_MAX (__IFLA_BOND_SLAVE_MAX - 1) + +/* SR-IOV virtual function management section */ + +enum { + IFLA_VF_INFO_UNSPEC, + IFLA_VF_INFO, + __IFLA_VF_INFO_MAX, +}; + +#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1) + +enum { + IFLA_VF_UNSPEC, + IFLA_VF_MAC, /* Hardware queue specific attributes */ + IFLA_VF_VLAN, /* VLAN ID and QoS */ + IFLA_VF_TX_RATE, /* Max TX Bandwidth Allocation */ + IFLA_VF_SPOOFCHK, /* Spoof Checking on/off switch */ + IFLA_VF_LINK_STATE, /* link state enable/disable/auto switch */ + IFLA_VF_RATE, /* Min and Max TX Bandwidth Allocation */ + IFLA_VF_RSS_QUERY_EN, /* RSS Redirection Table and Hash Key query + * on/off switch + */ + IFLA_VF_STATS, /* network device statistics */ + IFLA_VF_TRUST, /* Trust VF */ + IFLA_VF_IB_NODE_GUID, /* VF Infiniband node GUID */ + IFLA_VF_IB_PORT_GUID, /* VF Infiniband port GUID */ + IFLA_VF_VLAN_LIST, /* nested list of vlans, option for QinQ */ + IFLA_VF_BROADCAST, /* VF broadcast */ + __IFLA_VF_MAX, +}; + +#define IFLA_VF_MAX (__IFLA_VF_MAX - 1) + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; /* MAX_ADDR_LEN */ +}; + +struct ifla_vf_broadcast { + __u8 broadcast[32]; +}; + +struct ifla_vf_vlan { + __u32 vf; + __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ + __u32 qos; +}; + +enum { + IFLA_VF_VLAN_INFO_UNSPEC, + IFLA_VF_VLAN_INFO, /* VLAN ID, QoS and VLAN protocol */ + __IFLA_VF_VLAN_INFO_MAX, +}; + +#define IFLA_VF_VLAN_INFO_MAX (__IFLA_VF_VLAN_INFO_MAX - 1) +#define MAX_VLAN_LIST_LEN 1 + +struct ifla_vf_vlan_info { + __u32 vf; + __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ + __u32 qos; + __be16 vlan_proto; /* VLAN protocol either 802.1Q or 802.1ad */ +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ +}; + +struct ifla_vf_rate { + __u32 vf; + __u32 min_tx_rate; /* Min Bandwidth in Mbps */ + __u32 max_tx_rate; /* Max Bandwidth in Mbps */ +}; + +struct ifla_vf_spoofchk { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_guid { + __u32 vf; + __u64 guid; +}; + +enum { + IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ + IFLA_VF_LINK_STATE_ENABLE, /* link always up */ + IFLA_VF_LINK_STATE_DISABLE, /* link always down */ + __IFLA_VF_LINK_STATE_MAX, +}; + +struct ifla_vf_link_state { + __u32 vf; + __u32 link_state; +}; + +struct ifla_vf_rss_query_en { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_STATS_RX_PACKETS, + IFLA_VF_STATS_TX_PACKETS, + IFLA_VF_STATS_RX_BYTES, + IFLA_VF_STATS_TX_BYTES, + IFLA_VF_STATS_BROADCAST, + IFLA_VF_STATS_MULTICAST, + IFLA_VF_STATS_PAD, + IFLA_VF_STATS_RX_DROPPED, + IFLA_VF_STATS_TX_DROPPED, + __IFLA_VF_STATS_MAX, +}; + +#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1) + +struct ifla_vf_trust { + __u32 vf; + __u32 setting; +}; + +/* VF ports management section + * + * Nested layout of set/get msg is: + * + * [IFLA_NUM_VF] + * [IFLA_VF_PORTS] + * [IFLA_VF_PORT] + * [IFLA_PORT_*], ... + * [IFLA_VF_PORT] + * [IFLA_PORT_*], ... + * ... + * [IFLA_PORT_SELF] + * [IFLA_PORT_*], ... + */ + +enum { + IFLA_VF_PORT_UNSPEC, + IFLA_VF_PORT, /* nest */ + __IFLA_VF_PORT_MAX, +}; + +#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1) + +enum { + IFLA_PORT_UNSPEC, + IFLA_PORT_VF, /* __u32 */ + IFLA_PORT_PROFILE, /* string */ + IFLA_PORT_VSI_TYPE, /* 802.1Qbg (pre-)standard VDP */ + IFLA_PORT_INSTANCE_UUID, /* binary UUID */ + IFLA_PORT_HOST_UUID, /* binary UUID */ + IFLA_PORT_REQUEST, /* __u8 */ + IFLA_PORT_RESPONSE, /* __u16, output only */ + __IFLA_PORT_MAX, +}; + +#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1) + +#define PORT_PROFILE_MAX 40 +#define PORT_UUID_MAX 16 +#define PORT_SELF_VF -1 + +enum { + PORT_REQUEST_PREASSOCIATE = 0, + PORT_REQUEST_PREASSOCIATE_RR, + PORT_REQUEST_ASSOCIATE, + PORT_REQUEST_DISASSOCIATE, +}; + +enum { + PORT_VDP_RESPONSE_SUCCESS = 0, + PORT_VDP_RESPONSE_INVALID_FORMAT, + PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES, + PORT_VDP_RESPONSE_UNUSED_VTID, + PORT_VDP_RESPONSE_VTID_VIOLATION, + PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION, + PORT_VDP_RESPONSE_OUT_OF_SYNC, + /* 0x08-0xFF reserved for future VDP use */ + PORT_PROFILE_RESPONSE_SUCCESS = 0x100, + PORT_PROFILE_RESPONSE_INPROGRESS, + PORT_PROFILE_RESPONSE_INVALID, + PORT_PROFILE_RESPONSE_BADSTATE, + PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES, + PORT_PROFILE_RESPONSE_ERROR, +}; + +struct ifla_port_vsi { + __u8 vsi_mgr_id; + __u8 vsi_type_id[3]; + __u8 vsi_type_version; + __u8 pad[3]; +}; + + +/* IPoIB section */ + +enum { + IFLA_IPOIB_UNSPEC, + IFLA_IPOIB_PKEY, + IFLA_IPOIB_MODE, + IFLA_IPOIB_UMCAST, + __IFLA_IPOIB_MAX +}; + +enum { + IPOIB_MODE_DATAGRAM = 0, /* using unreliable datagram QPs */ + IPOIB_MODE_CONNECTED = 1, /* using connected QPs */ +}; + +#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1) + + +/* HSR/PRP section, both uses same interface */ + +/* Different redundancy protocols for hsr device */ +enum { + HSR_PROTOCOL_HSR, + HSR_PROTOCOL_PRP, + HSR_PROTOCOL_MAX, +}; + +enum { + IFLA_HSR_UNSPEC, + IFLA_HSR_SLAVE1, + IFLA_HSR_SLAVE2, + IFLA_HSR_MULTICAST_SPEC, /* Last byte of supervision addr */ + IFLA_HSR_SUPERVISION_ADDR, /* Supervision frame multicast addr */ + IFLA_HSR_SEQ_NR, + IFLA_HSR_VERSION, /* HSR version */ + IFLA_HSR_PROTOCOL, /* Indicate different protocol than + * HSR. For example PRP. + */ + __IFLA_HSR_MAX, +}; + +#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1) + +/* STATS section */ + +struct if_stats_msg { + __u8 family; + __u8 pad1; + __u16 pad2; + __u32 ifindex; + __u32 filter_mask; +}; + +/* A stats attribute can be netdev specific or a global stat. + * For netdev stats, lets use the prefix IFLA_STATS_LINK_* + */ +enum { + IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */ + IFLA_STATS_LINK_64, + IFLA_STATS_LINK_XSTATS, + IFLA_STATS_LINK_XSTATS_SLAVE, + IFLA_STATS_LINK_OFFLOAD_XSTATS, + IFLA_STATS_AF_SPEC, + __IFLA_STATS_MAX, +}; + +#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1) + +#define IFLA_STATS_FILTER_BIT(ATTR) (1 << (ATTR - 1)) + +/* These are embedded into IFLA_STATS_LINK_XSTATS: + * [IFLA_STATS_LINK_XSTATS] + * -> [LINK_XSTATS_TYPE_xxx] + * -> [rtnl link type specific attributes] + */ +enum { + LINK_XSTATS_TYPE_UNSPEC, + LINK_XSTATS_TYPE_BRIDGE, + LINK_XSTATS_TYPE_BOND, + __LINK_XSTATS_TYPE_MAX +}; +#define LINK_XSTATS_TYPE_MAX (__LINK_XSTATS_TYPE_MAX - 1) + +/* These are stats embedded into IFLA_STATS_LINK_OFFLOAD_XSTATS */ +enum { + IFLA_OFFLOAD_XSTATS_UNSPEC, + IFLA_OFFLOAD_XSTATS_CPU_HIT, /* struct rtnl_link_stats64 */ + __IFLA_OFFLOAD_XSTATS_MAX +}; +#define IFLA_OFFLOAD_XSTATS_MAX (__IFLA_OFFLOAD_XSTATS_MAX - 1) + +/* XDP section */ + +#define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) +#define XDP_FLAGS_SKB_MODE (1U << 1) +#define XDP_FLAGS_DRV_MODE (1U << 2) +#define XDP_FLAGS_HW_MODE (1U << 3) +#define XDP_FLAGS_REPLACE (1U << 4) +#define XDP_FLAGS_MODES (XDP_FLAGS_SKB_MODE | \ + XDP_FLAGS_DRV_MODE | \ + XDP_FLAGS_HW_MODE) +#define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST | \ + XDP_FLAGS_MODES | XDP_FLAGS_REPLACE) + +/* These are stored into IFLA_XDP_ATTACHED on dump. */ +enum { + XDP_ATTACHED_NONE = 0, + XDP_ATTACHED_DRV, + XDP_ATTACHED_SKB, + XDP_ATTACHED_HW, + XDP_ATTACHED_MULTI, +}; + +enum { + IFLA_XDP_UNSPEC, + IFLA_XDP_FD, + IFLA_XDP_ATTACHED, + IFLA_XDP_FLAGS, + IFLA_XDP_PROG_ID, + IFLA_XDP_DRV_PROG_ID, + IFLA_XDP_SKB_PROG_ID, + IFLA_XDP_HW_PROG_ID, + IFLA_XDP_EXPECTED_FD, + __IFLA_XDP_MAX, +}; + +#define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1) + +enum { + IFLA_EVENT_NONE, + IFLA_EVENT_REBOOT, /* internal reset / reboot */ + IFLA_EVENT_FEATURES, /* change in offload features */ + IFLA_EVENT_BONDING_FAILOVER, /* change in active slave */ + IFLA_EVENT_NOTIFY_PEERS, /* re-sent grat. arp/ndisc */ + IFLA_EVENT_IGMP_RESEND, /* re-sent IGMP JOIN */ + IFLA_EVENT_BONDING_OPTIONS, /* change in bonding options */ +}; + +/* tun section */ + +enum { + IFLA_TUN_UNSPEC, + IFLA_TUN_OWNER, + IFLA_TUN_GROUP, + IFLA_TUN_TYPE, + IFLA_TUN_PI, + IFLA_TUN_VNET_HDR, + IFLA_TUN_PERSIST, + IFLA_TUN_MULTI_QUEUE, + IFLA_TUN_NUM_QUEUES, + IFLA_TUN_NUM_DISABLED_QUEUES, + __IFLA_TUN_MAX, +}; + +#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1) + +/* rmnet section */ + +#define RMNET_FLAGS_INGRESS_DEAGGREGATION (1U << 0) +#define RMNET_FLAGS_INGRESS_MAP_COMMANDS (1U << 1) +#define RMNET_FLAGS_INGRESS_MAP_CKSUMV4 (1U << 2) +#define RMNET_FLAGS_EGRESS_MAP_CKSUMV4 (1U << 3) +#define RMNET_FLAGS_INGRESS_MAP_CKSUMV5 (1U << 4) +#define RMNET_FLAGS_EGRESS_MAP_CKSUMV5 (1U << 5) + +enum { + IFLA_RMNET_UNSPEC, + IFLA_RMNET_MUX_ID, + IFLA_RMNET_FLAGS, + __IFLA_RMNET_MAX, +}; + +#define IFLA_RMNET_MAX (__IFLA_RMNET_MAX - 1) + +struct ifla_rmnet_flags { + __u32 flags; + __u32 mask; +}; + +/* MCTP section */ + +enum { + IFLA_MCTP_UNSPEC, + IFLA_MCTP_NET, + __IFLA_MCTP_MAX, +}; + +#define IFLA_MCTP_MAX (__IFLA_MCTP_MAX - 1) + +#endif /* _UAPI_LINUX_IF_LINK_H */ diff --git a/libbpf/include/uapi/linux/if_xdp.h b/libbpf/include/uapi/linux/if_xdp.h new file mode 100644 index 0000000..a78a809 --- /dev/null +++ b/libbpf/include/uapi/linux/if_xdp.h @@ -0,0 +1,111 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * if_xdp: XDP socket user-space interface + * Copyright(c) 2018 Intel Corporation. + * + * Author(s): Björn Töpel + * Magnus Karlsson + */ + +#ifndef _LINUX_IF_XDP_H +#define _LINUX_IF_XDP_H + +#include + +/* Options for the sxdp_flags field */ +#define XDP_SHARED_UMEM (1 << 0) +#define XDP_COPY (1 << 1) /* Force copy-mode */ +#define XDP_ZEROCOPY (1 << 2) /* Force zero-copy mode */ +/* If this option is set, the driver might go sleep and in that case + * the XDP_RING_NEED_WAKEUP flag in the fill and/or Tx rings will be + * set. If it is set, the application need to explicitly wake up the + * driver with a poll() (Rx and Tx) or sendto() (Tx only). If you are + * running the driver and the application on the same core, you should + * use this option so that the kernel will yield to the user space + * application. + */ +#define XDP_USE_NEED_WAKEUP (1 << 3) + +/* Flags for xsk_umem_config flags */ +#define XDP_UMEM_UNALIGNED_CHUNK_FLAG (1 << 0) + +struct sockaddr_xdp { + __u16 sxdp_family; + __u16 sxdp_flags; + __u32 sxdp_ifindex; + __u32 sxdp_queue_id; + __u32 sxdp_shared_umem_fd; +}; + +/* XDP_RING flags */ +#define XDP_RING_NEED_WAKEUP (1 << 0) + +struct xdp_ring_offset { + __u64 producer; + __u64 consumer; + __u64 desc; + __u64 flags; +}; + +struct xdp_mmap_offsets { + struct xdp_ring_offset rx; + struct xdp_ring_offset tx; + struct xdp_ring_offset fr; /* Fill */ + struct xdp_ring_offset cr; /* Completion */ +}; + +/* XDP socket options */ +#define XDP_MMAP_OFFSETS 1 +#define XDP_RX_RING 2 +#define XDP_TX_RING 3 +#define XDP_UMEM_REG 4 +#define XDP_UMEM_FILL_RING 5 +#define XDP_UMEM_COMPLETION_RING 6 +#define XDP_STATISTICS 7 +#define XDP_OPTIONS 8 + +struct xdp_umem_reg { + __u64 addr; /* Start of packet data area */ + __u64 len; /* Length of packet data area */ + __u32 chunk_size; + __u32 headroom; + __u32 flags; +}; + +struct xdp_statistics { + __u64 rx_dropped; /* Dropped for other reasons */ + __u64 rx_invalid_descs; /* Dropped due to invalid descriptor */ + __u64 tx_invalid_descs; /* Dropped due to invalid descriptor */ + __u64 rx_ring_full; /* Dropped due to rx ring being full */ + __u64 rx_fill_ring_empty_descs; /* Failed to retrieve item from fill ring */ + __u64 tx_ring_empty_descs; /* Failed to retrieve item from tx ring */ +}; + +struct xdp_options { + __u32 flags; +}; + +/* Flags for the flags field of struct xdp_options */ +#define XDP_OPTIONS_ZEROCOPY (1 << 0) + +/* Pgoff for mmaping the rings */ +#define XDP_PGOFF_RX_RING 0 +#define XDP_PGOFF_TX_RING 0x80000000 +#define XDP_UMEM_PGOFF_FILL_RING 0x100000000ULL +#define XDP_UMEM_PGOFF_COMPLETION_RING 0x180000000ULL + +/* Masks for unaligned chunks mode */ +#define XSK_UNALIGNED_BUF_OFFSET_SHIFT 48 +#define XSK_UNALIGNED_BUF_ADDR_MASK \ + ((1ULL << XSK_UNALIGNED_BUF_OFFSET_SHIFT) - 1) + +/* Rx/Tx descriptor */ +struct xdp_desc { + __u64 addr; + __u32 len; + __u32 options; +}; + +/* UMEM descriptor is __u64 */ + +#endif /* _LINUX_IF_XDP_H */ diff --git a/libbpf/include/uapi/linux/netdev.h b/libbpf/include/uapi/linux/netdev.h new file mode 100644 index 0000000..8c4e3e5 --- /dev/null +++ b/libbpf/include/uapi/linux/netdev.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause */ +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/netdev.yaml */ +/* YNL-GEN uapi header */ + +#ifndef _UAPI_LINUX_NETDEV_H +#define _UAPI_LINUX_NETDEV_H + +#define NETDEV_FAMILY_NAME "netdev" +#define NETDEV_FAMILY_VERSION 1 + +/** + * enum netdev_xdp_act + * @NETDEV_XDP_ACT_BASIC: XDP feautues set supported by all drivers + * (XDP_ABORTED, XDP_DROP, XDP_PASS, XDP_TX) + * @NETDEV_XDP_ACT_REDIRECT: The netdev supports XDP_REDIRECT + * @NETDEV_XDP_ACT_NDO_XMIT: This feature informs if netdev implements + * ndo_xdp_xmit callback. + * @NETDEV_XDP_ACT_XSK_ZEROCOPY: This feature informs if netdev supports AF_XDP + * in zero copy mode. + * @NETDEV_XDP_ACT_HW_OFFLOAD: This feature informs if netdev supports XDP hw + * offloading. + * @NETDEV_XDP_ACT_RX_SG: This feature informs if netdev implements non-linear + * XDP buffer support in the driver napi callback. + * @NETDEV_XDP_ACT_NDO_XMIT_SG: This feature informs if netdev implements + * non-linear XDP buffer support in ndo_xdp_xmit callback. + */ +enum netdev_xdp_act { + NETDEV_XDP_ACT_BASIC = 1, + NETDEV_XDP_ACT_REDIRECT = 2, + NETDEV_XDP_ACT_NDO_XMIT = 4, + NETDEV_XDP_ACT_XSK_ZEROCOPY = 8, + NETDEV_XDP_ACT_HW_OFFLOAD = 16, + NETDEV_XDP_ACT_RX_SG = 32, + NETDEV_XDP_ACT_NDO_XMIT_SG = 64, +}; + +enum { + NETDEV_A_DEV_IFINDEX = 1, + NETDEV_A_DEV_PAD, + NETDEV_A_DEV_XDP_FEATURES, + + __NETDEV_A_DEV_MAX, + NETDEV_A_DEV_MAX = (__NETDEV_A_DEV_MAX - 1) +}; + +enum { + NETDEV_CMD_DEV_GET = 1, + NETDEV_CMD_DEV_ADD_NTF, + NETDEV_CMD_DEV_DEL_NTF, + NETDEV_CMD_DEV_CHANGE_NTF, + + __NETDEV_CMD_MAX, + NETDEV_CMD_MAX = (__NETDEV_CMD_MAX - 1) +}; + +#define NETDEV_MCGRP_MGMT "mgmt" + +#endif /* _UAPI_LINUX_NETDEV_H */ diff --git a/libbpf/include/uapi/linux/netlink.h b/libbpf/include/uapi/linux/netlink.h new file mode 100644 index 0000000..0a4d733 --- /dev/null +++ b/libbpf/include/uapi/linux/netlink.h @@ -0,0 +1,252 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI__LINUX_NETLINK_H +#define _UAPI__LINUX_NETLINK_H + +#include +#include /* for __kernel_sa_family_t */ +#include + +#define NETLINK_ROUTE 0 /* Routing/device hook */ +#define NETLINK_UNUSED 1 /* Unused number */ +#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ +#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */ +#define NETLINK_SOCK_DIAG 4 /* socket monitoring */ +#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ +#define NETLINK_XFRM 6 /* ipsec */ +#define NETLINK_SELINUX 7 /* SELinux event notifications */ +#define NETLINK_ISCSI 8 /* Open-iSCSI */ +#define NETLINK_AUDIT 9 /* auditing */ +#define NETLINK_FIB_LOOKUP 10 +#define NETLINK_CONNECTOR 11 +#define NETLINK_NETFILTER 12 /* netfilter subsystem */ +#define NETLINK_IP6_FW 13 +#define NETLINK_DNRTMSG 14 /* DECnet routing messages */ +#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ +#define NETLINK_GENERIC 16 +/* leave room for NETLINK_DM (DM Events) */ +#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */ +#define NETLINK_ECRYPTFS 19 +#define NETLINK_RDMA 20 +#define NETLINK_CRYPTO 21 /* Crypto layer */ +#define NETLINK_SMC 22 /* SMC monitoring */ + +#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG + +#define MAX_LINKS 32 + +struct sockaddr_nl { + __kernel_sa_family_t nl_family; /* AF_NETLINK */ + unsigned short nl_pad; /* zero */ + __u32 nl_pid; /* port ID */ + __u32 nl_groups; /* multicast groups mask */ +}; + +struct nlmsghdr { + __u32 nlmsg_len; /* Length of message including header */ + __u16 nlmsg_type; /* Message content */ + __u16 nlmsg_flags; /* Additional flags */ + __u32 nlmsg_seq; /* Sequence number */ + __u32 nlmsg_pid; /* Sending process port ID */ +}; + +/* Flags values */ + +#define NLM_F_REQUEST 0x01 /* It is request message. */ +#define NLM_F_MULTI 0x02 /* Multipart message, terminated by NLMSG_DONE */ +#define NLM_F_ACK 0x04 /* Reply with ack, with zero or error code */ +#define NLM_F_ECHO 0x08 /* Echo this request */ +#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to sequence change */ +#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ + +/* Modifiers to GET request */ +#define NLM_F_ROOT 0x100 /* specify tree root */ +#define NLM_F_MATCH 0x200 /* return all matching */ +#define NLM_F_ATOMIC 0x400 /* atomic GET */ +#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) + +/* Modifiers to NEW request */ +#define NLM_F_REPLACE 0x100 /* Override existing */ +#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */ +#define NLM_F_CREATE 0x400 /* Create, if it does not exist */ +#define NLM_F_APPEND 0x800 /* Add to end of list */ + +/* Modifiers to DELETE request */ +#define NLM_F_NONREC 0x100 /* Do not delete recursively */ + +/* Flags for ACK message */ +#define NLM_F_CAPPED 0x100 /* request was capped */ +#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ + +/* + 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL + 4.4BSD CHANGE NLM_F_REPLACE + + True CHANGE NLM_F_CREATE|NLM_F_REPLACE + Append NLM_F_CREATE + Check NLM_F_EXCL + */ + +#define NLMSG_ALIGNTO 4U +#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) +#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) +#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN) +#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) +#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) +#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ + (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) +#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ + (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ + (nlh)->nlmsg_len <= (len)) +#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) + +#define NLMSG_NOOP 0x1 /* Nothing. */ +#define NLMSG_ERROR 0x2 /* Error */ +#define NLMSG_DONE 0x3 /* End of a dump */ +#define NLMSG_OVERRUN 0x4 /* Data lost */ + +#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ + +struct nlmsgerr { + int error; + struct nlmsghdr msg; + /* + * followed by the message contents unless NETLINK_CAP_ACK was set + * or the ACK indicates success (error == 0) + * message length is aligned with NLMSG_ALIGN() + */ + /* + * followed by TLVs defined in enum nlmsgerr_attrs + * if NETLINK_EXT_ACK was set + */ +}; + +/** + * enum nlmsgerr_attrs - nlmsgerr attributes + * @NLMSGERR_ATTR_UNUSED: unused + * @NLMSGERR_ATTR_MSG: error message string (string) + * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original + * message, counting from the beginning of the header (u32) + * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to + * be used - in the success case - to identify a created + * object or operation or similar (binary) + * @__NLMSGERR_ATTR_MAX: number of attributes + * @NLMSGERR_ATTR_MAX: highest attribute number + */ +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED, + NLMSGERR_ATTR_MSG, + NLMSGERR_ATTR_OFFS, + NLMSGERR_ATTR_COOKIE, + + __NLMSGERR_ATTR_MAX, + NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1 +}; + +#define NETLINK_ADD_MEMBERSHIP 1 +#define NETLINK_DROP_MEMBERSHIP 2 +#define NETLINK_PKTINFO 3 +#define NETLINK_BROADCAST_ERROR 4 +#define NETLINK_NO_ENOBUFS 5 +#ifndef __KERNEL__ +#define NETLINK_RX_RING 6 +#define NETLINK_TX_RING 7 +#endif +#define NETLINK_LISTEN_ALL_NSID 8 +#define NETLINK_LIST_MEMBERSHIPS 9 +#define NETLINK_CAP_ACK 10 +#define NETLINK_EXT_ACK 11 +#define NETLINK_GET_STRICT_CHK 12 + +struct nl_pktinfo { + __u32 group; +}; + +struct nl_mmap_req { + unsigned int nm_block_size; + unsigned int nm_block_nr; + unsigned int nm_frame_size; + unsigned int nm_frame_nr; +}; + +struct nl_mmap_hdr { + unsigned int nm_status; + unsigned int nm_len; + __u32 nm_group; + /* credentials */ + __u32 nm_pid; + __u32 nm_uid; + __u32 nm_gid; +}; + +#ifndef __KERNEL__ +enum nl_mmap_status { + NL_MMAP_STATUS_UNUSED, + NL_MMAP_STATUS_RESERVED, + NL_MMAP_STATUS_VALID, + NL_MMAP_STATUS_COPY, + NL_MMAP_STATUS_SKIP, +}; + +#define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO +#define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) +#define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) +#endif + +#define NET_MAJOR 36 /* Major 36 is reserved for networking */ + +enum { + NETLINK_UNCONNECTED = 0, + NETLINK_CONNECTED, +}; + +/* + * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> + * +---------------------+- - -+- - - - - - - - - -+- - -+ + * | Header | Pad | Payload | Pad | + * | (struct nlattr) | ing | | ing | + * +---------------------+- - -+- - - - - - - - - -+- - -+ + * <-------------- nlattr->nla_len --------------> + */ + +struct nlattr { + __u16 nla_len; + __u16 nla_type; +}; + +/* + * nla_type (16 bits) + * +---+---+-------------------------------+ + * | N | O | Attribute Type | + * +---+---+-------------------------------+ + * N := Carries nested attributes + * O := Payload stored in network byte order + * + * Note: The N and O flag are mutually exclusive. + */ +#define NLA_F_NESTED (1 << 15) +#define NLA_F_NET_BYTEORDER (1 << 14) +#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) + +#define NLA_ALIGNTO 4 +#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) +#define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) + +/* Generic 32 bitflags attribute content sent to the kernel. + * + * The value is a bitmap that defines the values being set + * The selector is a bitmask that defines which value is legit + * + * Examples: + * value = 0x0, and selector = 0x1 + * implies we are selecting bit 1 and we want to set its value to 0. + * + * value = 0x2, and selector = 0x2 + * implies we are selecting bit 2 and we want to set its value to 1. + * + */ +struct nla_bitfield32 { + __u32 value; + __u32 selector; +}; + +#endif /* _UAPI__LINUX_NETLINK_H */ diff --git a/libbpf/include/uapi/linux/openat2.h b/libbpf/include/uapi/linux/openat2.h new file mode 100644 index 0000000..a5feb76 --- /dev/null +++ b/libbpf/include/uapi/linux/openat2.h @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_OPENAT2_H +#define _UAPI_LINUX_OPENAT2_H + +#include + +/* + * Arguments for how openat2(2) should open the target path. If only @flags and + * @mode are non-zero, then openat2(2) operates very similarly to openat(2). + * + * However, unlike openat(2), unknown or invalid bits in @flags result in + * -EINVAL rather than being silently ignored. @mode must be zero unless one of + * {O_CREAT, O_TMPFILE} are set. + * + * @flags: O_* flags. + * @mode: O_CREAT/O_TMPFILE file mode. + * @resolve: RESOLVE_* flags. + */ +struct open_how { + __u64 flags; + __u64 mode; + __u64 resolve; +}; + +/* how->resolve flags for openat2(2). */ +#define RESOLVE_NO_XDEV 0x01 /* Block mount-point crossings + (includes bind-mounts). */ +#define RESOLVE_NO_MAGICLINKS 0x02 /* Block traversal through procfs-style + "magic-links". */ +#define RESOLVE_NO_SYMLINKS 0x04 /* Block traversal through all symlinks + (implies OEXT_NO_MAGICLINKS) */ +#define RESOLVE_BENEATH 0x08 /* Block "lexical" trickery like + "..", symlinks, and absolute + paths which escape the dirfd. */ +#define RESOLVE_IN_ROOT 0x10 /* Make all jumps to "/" and ".." + be scoped inside the dirfd + (similar to chroot(2)). */ +#define RESOLVE_CACHED 0x20 /* Only complete if resolution can be + completed through cached lookup. May + return -EAGAIN if that's not + possible. */ + +#endif /* _UAPI_LINUX_OPENAT2_H */ diff --git a/libbpf/include/uapi/linux/perf_event.h b/libbpf/include/uapi/linux/perf_event.h new file mode 100644 index 0000000..3767543 --- /dev/null +++ b/libbpf/include/uapi/linux/perf_event.h @@ -0,0 +1,1448 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +/* + * Performance events: + * + * Copyright (C) 2008-2009, Thomas Gleixner + * Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar + * Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra + * + * Data type definitions, declarations, prototypes. + * + * Started by: Thomas Gleixner and Ingo Molnar + * + * For licencing details see kernel-base/COPYING + */ +#ifndef _UAPI_LINUX_PERF_EVENT_H +#define _UAPI_LINUX_PERF_EVENT_H + +#include +#include +#include + +/* + * User-space ABI bits: + */ + +/* + * attr.type + */ +enum perf_type_id { + PERF_TYPE_HARDWARE = 0, + PERF_TYPE_SOFTWARE = 1, + PERF_TYPE_TRACEPOINT = 2, + PERF_TYPE_HW_CACHE = 3, + PERF_TYPE_RAW = 4, + PERF_TYPE_BREAKPOINT = 5, + + PERF_TYPE_MAX, /* non-ABI */ +}; + +/* + * attr.config layout for type PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE + * PERF_TYPE_HARDWARE: 0xEEEEEEEE000000AA + * AA: hardware event ID + * EEEEEEEE: PMU type ID + * PERF_TYPE_HW_CACHE: 0xEEEEEEEE00DDCCBB + * BB: hardware cache ID + * CC: hardware cache op ID + * DD: hardware cache op result ID + * EEEEEEEE: PMU type ID + * If the PMU type ID is 0, the PERF_TYPE_RAW will be applied. + */ +#define PERF_PMU_TYPE_SHIFT 32 +#define PERF_HW_EVENT_MASK 0xffffffff + +/* + * Generalized performance event event_id types, used by the + * attr.event_id parameter of the sys_perf_event_open() + * syscall: + */ +enum perf_hw_id { + /* + * Common hardware events, generalized by the kernel: + */ + PERF_COUNT_HW_CPU_CYCLES = 0, + PERF_COUNT_HW_INSTRUCTIONS = 1, + PERF_COUNT_HW_CACHE_REFERENCES = 2, + PERF_COUNT_HW_CACHE_MISSES = 3, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, + PERF_COUNT_HW_BRANCH_MISSES = 5, + PERF_COUNT_HW_BUS_CYCLES = 6, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, + PERF_COUNT_HW_REF_CPU_CYCLES = 9, + + PERF_COUNT_HW_MAX, /* non-ABI */ +}; + +/* + * Generalized hardware cache events: + * + * { L1-D, L1-I, LLC, ITLB, DTLB, BPU, NODE } x + * { read, write, prefetch } x + * { accesses, misses } + */ +enum perf_hw_cache_id { + PERF_COUNT_HW_CACHE_L1D = 0, + PERF_COUNT_HW_CACHE_L1I = 1, + PERF_COUNT_HW_CACHE_LL = 2, + PERF_COUNT_HW_CACHE_DTLB = 3, + PERF_COUNT_HW_CACHE_ITLB = 4, + PERF_COUNT_HW_CACHE_BPU = 5, + PERF_COUNT_HW_CACHE_NODE = 6, + + PERF_COUNT_HW_CACHE_MAX, /* non-ABI */ +}; + +enum perf_hw_cache_op_id { + PERF_COUNT_HW_CACHE_OP_READ = 0, + PERF_COUNT_HW_CACHE_OP_WRITE = 1, + PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, + + PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */ +}; + +enum perf_hw_cache_op_result_id { + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, + PERF_COUNT_HW_CACHE_RESULT_MISS = 1, + + PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */ +}; + +/* + * Special "software" events provided by the kernel, even if the hardware + * does not support performance events. These events measure various + * physical and sw events of the kernel (and allow the profiling of them as + * well): + */ +enum perf_sw_ids { + PERF_COUNT_SW_CPU_CLOCK = 0, + PERF_COUNT_SW_TASK_CLOCK = 1, + PERF_COUNT_SW_PAGE_FAULTS = 2, + PERF_COUNT_SW_CONTEXT_SWITCHES = 3, + PERF_COUNT_SW_CPU_MIGRATIONS = 4, + PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, + PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, + PERF_COUNT_SW_EMULATION_FAULTS = 8, + PERF_COUNT_SW_DUMMY = 9, + PERF_COUNT_SW_BPF_OUTPUT = 10, + PERF_COUNT_SW_CGROUP_SWITCHES = 11, + + PERF_COUNT_SW_MAX, /* non-ABI */ +}; + +/* + * Bits that can be set in attr.sample_type to request information + * in the overflow packets. + */ +enum perf_event_sample_format { + PERF_SAMPLE_IP = 1U << 0, + PERF_SAMPLE_TID = 1U << 1, + PERF_SAMPLE_TIME = 1U << 2, + PERF_SAMPLE_ADDR = 1U << 3, + PERF_SAMPLE_READ = 1U << 4, + PERF_SAMPLE_CALLCHAIN = 1U << 5, + PERF_SAMPLE_ID = 1U << 6, + PERF_SAMPLE_CPU = 1U << 7, + PERF_SAMPLE_PERIOD = 1U << 8, + PERF_SAMPLE_STREAM_ID = 1U << 9, + PERF_SAMPLE_RAW = 1U << 10, + PERF_SAMPLE_BRANCH_STACK = 1U << 11, + PERF_SAMPLE_REGS_USER = 1U << 12, + PERF_SAMPLE_STACK_USER = 1U << 13, + PERF_SAMPLE_WEIGHT = 1U << 14, + PERF_SAMPLE_DATA_SRC = 1U << 15, + PERF_SAMPLE_IDENTIFIER = 1U << 16, + PERF_SAMPLE_TRANSACTION = 1U << 17, + PERF_SAMPLE_REGS_INTR = 1U << 18, + PERF_SAMPLE_PHYS_ADDR = 1U << 19, + PERF_SAMPLE_AUX = 1U << 20, + PERF_SAMPLE_CGROUP = 1U << 21, + PERF_SAMPLE_DATA_PAGE_SIZE = 1U << 22, + PERF_SAMPLE_CODE_PAGE_SIZE = 1U << 23, + PERF_SAMPLE_WEIGHT_STRUCT = 1U << 24, + + PERF_SAMPLE_MAX = 1U << 25, /* non-ABI */ +}; + +#define PERF_SAMPLE_WEIGHT_TYPE (PERF_SAMPLE_WEIGHT | PERF_SAMPLE_WEIGHT_STRUCT) +/* + * values to program into branch_sample_type when PERF_SAMPLE_BRANCH is set + * + * If the user does not pass priv level information via branch_sample_type, + * the kernel uses the event's priv level. Branch and event priv levels do + * not have to match. Branch priv level is checked for permissions. + * + * The branch types can be combined, however BRANCH_ANY covers all types + * of branches and therefore it supersedes all the other types. + */ +enum perf_branch_sample_type_shift { + PERF_SAMPLE_BRANCH_USER_SHIFT = 0, /* user branches */ + PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, /* kernel branches */ + PERF_SAMPLE_BRANCH_HV_SHIFT = 2, /* hypervisor branches */ + + PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, /* any branch types */ + PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, /* any call branch */ + PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, /* any return branch */ + PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, /* indirect calls */ + PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, /* transaction aborts */ + PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, /* in transaction */ + PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, /* not in transaction */ + PERF_SAMPLE_BRANCH_COND_SHIFT = 10, /* conditional branches */ + + PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, /* call/ret stack */ + PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, /* indirect jumps */ + PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, /* direct call */ + + PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, /* no flags */ + PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, /* no cycles */ + + PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, /* save branch type */ + + PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, /* save low level index of raw branch records */ + + PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18, /* save privilege mode */ + + PERF_SAMPLE_BRANCH_MAX_SHIFT /* non-ABI */ +}; + +enum perf_branch_sample_type { + PERF_SAMPLE_BRANCH_USER = 1U << PERF_SAMPLE_BRANCH_USER_SHIFT, + PERF_SAMPLE_BRANCH_KERNEL = 1U << PERF_SAMPLE_BRANCH_KERNEL_SHIFT, + PERF_SAMPLE_BRANCH_HV = 1U << PERF_SAMPLE_BRANCH_HV_SHIFT, + + PERF_SAMPLE_BRANCH_ANY = 1U << PERF_SAMPLE_BRANCH_ANY_SHIFT, + PERF_SAMPLE_BRANCH_ANY_CALL = 1U << PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT, + PERF_SAMPLE_BRANCH_ANY_RETURN = 1U << PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT, + PERF_SAMPLE_BRANCH_IND_CALL = 1U << PERF_SAMPLE_BRANCH_IND_CALL_SHIFT, + PERF_SAMPLE_BRANCH_ABORT_TX = 1U << PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT, + PERF_SAMPLE_BRANCH_IN_TX = 1U << PERF_SAMPLE_BRANCH_IN_TX_SHIFT, + PERF_SAMPLE_BRANCH_NO_TX = 1U << PERF_SAMPLE_BRANCH_NO_TX_SHIFT, + PERF_SAMPLE_BRANCH_COND = 1U << PERF_SAMPLE_BRANCH_COND_SHIFT, + + PERF_SAMPLE_BRANCH_CALL_STACK = 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT, + PERF_SAMPLE_BRANCH_IND_JUMP = 1U << PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT, + PERF_SAMPLE_BRANCH_CALL = 1U << PERF_SAMPLE_BRANCH_CALL_SHIFT, + + PERF_SAMPLE_BRANCH_NO_FLAGS = 1U << PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT, + PERF_SAMPLE_BRANCH_NO_CYCLES = 1U << PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT, + + PERF_SAMPLE_BRANCH_TYPE_SAVE = + 1U << PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT, + + PERF_SAMPLE_BRANCH_HW_INDEX = 1U << PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT, + + PERF_SAMPLE_BRANCH_PRIV_SAVE = 1U << PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT, + + PERF_SAMPLE_BRANCH_MAX = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT, +}; + +/* + * Common flow change classification + */ +enum { + PERF_BR_UNKNOWN = 0, /* unknown */ + PERF_BR_COND = 1, /* conditional */ + PERF_BR_UNCOND = 2, /* unconditional */ + PERF_BR_IND = 3, /* indirect */ + PERF_BR_CALL = 4, /* function call */ + PERF_BR_IND_CALL = 5, /* indirect function call */ + PERF_BR_RET = 6, /* function return */ + PERF_BR_SYSCALL = 7, /* syscall */ + PERF_BR_SYSRET = 8, /* syscall return */ + PERF_BR_COND_CALL = 9, /* conditional function call */ + PERF_BR_COND_RET = 10, /* conditional function return */ + PERF_BR_ERET = 11, /* exception return */ + PERF_BR_IRQ = 12, /* irq */ + PERF_BR_SERROR = 13, /* system error */ + PERF_BR_NO_TX = 14, /* not in transaction */ + PERF_BR_EXTEND_ABI = 15, /* extend ABI */ + PERF_BR_MAX, +}; + +/* + * Common branch speculation outcome classification + */ +enum { + PERF_BR_SPEC_NA = 0, /* Not available */ + PERF_BR_SPEC_WRONG_PATH = 1, /* Speculative but on wrong path */ + PERF_BR_NON_SPEC_CORRECT_PATH = 2, /* Non-speculative but on correct path */ + PERF_BR_SPEC_CORRECT_PATH = 3, /* Speculative and on correct path */ + PERF_BR_SPEC_MAX, +}; + +enum { + PERF_BR_NEW_FAULT_ALGN = 0, /* Alignment fault */ + PERF_BR_NEW_FAULT_DATA = 1, /* Data fault */ + PERF_BR_NEW_FAULT_INST = 2, /* Inst fault */ + PERF_BR_NEW_ARCH_1 = 3, /* Architecture specific */ + PERF_BR_NEW_ARCH_2 = 4, /* Architecture specific */ + PERF_BR_NEW_ARCH_3 = 5, /* Architecture specific */ + PERF_BR_NEW_ARCH_4 = 6, /* Architecture specific */ + PERF_BR_NEW_ARCH_5 = 7, /* Architecture specific */ + PERF_BR_NEW_MAX, +}; + +enum { + PERF_BR_PRIV_UNKNOWN = 0, + PERF_BR_PRIV_USER = 1, + PERF_BR_PRIV_KERNEL = 2, + PERF_BR_PRIV_HV = 3, +}; + +#define PERF_BR_ARM64_FIQ PERF_BR_NEW_ARCH_1 +#define PERF_BR_ARM64_DEBUG_HALT PERF_BR_NEW_ARCH_2 +#define PERF_BR_ARM64_DEBUG_EXIT PERF_BR_NEW_ARCH_3 +#define PERF_BR_ARM64_DEBUG_INST PERF_BR_NEW_ARCH_4 +#define PERF_BR_ARM64_DEBUG_DATA PERF_BR_NEW_ARCH_5 + +#define PERF_SAMPLE_BRANCH_PLM_ALL \ + (PERF_SAMPLE_BRANCH_USER|\ + PERF_SAMPLE_BRANCH_KERNEL|\ + PERF_SAMPLE_BRANCH_HV) + +/* + * Values to determine ABI of the registers dump. + */ +enum perf_sample_regs_abi { + PERF_SAMPLE_REGS_ABI_NONE = 0, + PERF_SAMPLE_REGS_ABI_32 = 1, + PERF_SAMPLE_REGS_ABI_64 = 2, +}; + +/* + * Values for the memory transaction event qualifier, mostly for + * abort events. Multiple bits can be set. + */ +enum { + PERF_TXN_ELISION = (1 << 0), /* From elision */ + PERF_TXN_TRANSACTION = (1 << 1), /* From transaction */ + PERF_TXN_SYNC = (1 << 2), /* Instruction is related */ + PERF_TXN_ASYNC = (1 << 3), /* Instruction not related */ + PERF_TXN_RETRY = (1 << 4), /* Retry possible */ + PERF_TXN_CONFLICT = (1 << 5), /* Conflict abort */ + PERF_TXN_CAPACITY_WRITE = (1 << 6), /* Capacity write abort */ + PERF_TXN_CAPACITY_READ = (1 << 7), /* Capacity read abort */ + + PERF_TXN_MAX = (1 << 8), /* non-ABI */ + + /* bits 32..63 are reserved for the abort code */ + + PERF_TXN_ABORT_MASK = (0xffffffffULL << 32), + PERF_TXN_ABORT_SHIFT = 32, +}; + +/* + * The format of the data returned by read() on a perf event fd, + * as specified by attr.read_format: + * + * struct read_format { + * { u64 value; + * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED + * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING + * { u64 id; } && PERF_FORMAT_ID + * { u64 lost; } && PERF_FORMAT_LOST + * } && !PERF_FORMAT_GROUP + * + * { u64 nr; + * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED + * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING + * { u64 value; + * { u64 id; } && PERF_FORMAT_ID + * { u64 lost; } && PERF_FORMAT_LOST + * } cntr[nr]; + * } && PERF_FORMAT_GROUP + * }; + */ +enum perf_event_read_format { + PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0, + PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1, + PERF_FORMAT_ID = 1U << 2, + PERF_FORMAT_GROUP = 1U << 3, + PERF_FORMAT_LOST = 1U << 4, + + PERF_FORMAT_MAX = 1U << 5, /* non-ABI */ +}; + +#define PERF_ATTR_SIZE_VER0 64 /* sizeof first published struct */ +#define PERF_ATTR_SIZE_VER1 72 /* add: config2 */ +#define PERF_ATTR_SIZE_VER2 80 /* add: branch_sample_type */ +#define PERF_ATTR_SIZE_VER3 96 /* add: sample_regs_user */ + /* add: sample_stack_user */ +#define PERF_ATTR_SIZE_VER4 104 /* add: sample_regs_intr */ +#define PERF_ATTR_SIZE_VER5 112 /* add: aux_watermark */ +#define PERF_ATTR_SIZE_VER6 120 /* add: aux_sample_size */ +#define PERF_ATTR_SIZE_VER7 128 /* add: sig_data */ +#define PERF_ATTR_SIZE_VER8 136 /* add: config3 */ + +/* + * Hardware event_id to monitor via a performance monitoring event: + * + * @sample_max_stack: Max number of frame pointers in a callchain, + * should be < /proc/sys/kernel/perf_event_max_stack + */ +struct perf_event_attr { + + /* + * Major type: hardware/software/tracepoint/etc. + */ + __u32 type; + + /* + * Size of the attr structure, for fwd/bwd compat. + */ + __u32 size; + + /* + * Type specific configuration information. + */ + __u64 config; + + union { + __u64 sample_period; + __u64 sample_freq; + }; + + __u64 sample_type; + __u64 read_format; + + __u64 disabled : 1, /* off by default */ + inherit : 1, /* children inherit it */ + pinned : 1, /* must always be on PMU */ + exclusive : 1, /* only group on PMU */ + exclude_user : 1, /* don't count user */ + exclude_kernel : 1, /* ditto kernel */ + exclude_hv : 1, /* ditto hypervisor */ + exclude_idle : 1, /* don't count when idle */ + mmap : 1, /* include mmap data */ + comm : 1, /* include comm data */ + freq : 1, /* use freq, not period */ + inherit_stat : 1, /* per task counts */ + enable_on_exec : 1, /* next exec enables */ + task : 1, /* trace fork/exit */ + watermark : 1, /* wakeup_watermark */ + /* + * precise_ip: + * + * 0 - SAMPLE_IP can have arbitrary skid + * 1 - SAMPLE_IP must have constant skid + * 2 - SAMPLE_IP requested to have 0 skid + * 3 - SAMPLE_IP must have 0 skid + * + * See also PERF_RECORD_MISC_EXACT_IP + */ + precise_ip : 2, /* skid constraint */ + mmap_data : 1, /* non-exec mmap data */ + sample_id_all : 1, /* sample_type all events */ + + exclude_host : 1, /* don't count in host */ + exclude_guest : 1, /* don't count in guest */ + + exclude_callchain_kernel : 1, /* exclude kernel callchains */ + exclude_callchain_user : 1, /* exclude user callchains */ + mmap2 : 1, /* include mmap with inode data */ + comm_exec : 1, /* flag comm events that are due to an exec */ + use_clockid : 1, /* use @clockid for time fields */ + context_switch : 1, /* context switch data */ + write_backward : 1, /* Write ring buffer from end to beginning */ + namespaces : 1, /* include namespaces data */ + ksymbol : 1, /* include ksymbol events */ + bpf_event : 1, /* include bpf events */ + aux_output : 1, /* generate AUX records instead of events */ + cgroup : 1, /* include cgroup events */ + text_poke : 1, /* include text poke events */ + build_id : 1, /* use build id in mmap2 events */ + inherit_thread : 1, /* children only inherit if cloned with CLONE_THREAD */ + remove_on_exec : 1, /* event is removed from task on exec */ + sigtrap : 1, /* send synchronous SIGTRAP on event */ + __reserved_1 : 26; + + union { + __u32 wakeup_events; /* wakeup every n events */ + __u32 wakeup_watermark; /* bytes before wakeup */ + }; + + __u32 bp_type; + union { + __u64 bp_addr; + __u64 kprobe_func; /* for perf_kprobe */ + __u64 uprobe_path; /* for perf_uprobe */ + __u64 config1; /* extension of config */ + }; + union { + __u64 bp_len; + __u64 kprobe_addr; /* when kprobe_func == NULL */ + __u64 probe_offset; /* for perf_[k,u]probe */ + __u64 config2; /* extension of config1 */ + }; + __u64 branch_sample_type; /* enum perf_branch_sample_type */ + + /* + * Defines set of user regs to dump on samples. + * See asm/perf_regs.h for details. + */ + __u64 sample_regs_user; + + /* + * Defines size of the user stack to dump on samples. + */ + __u32 sample_stack_user; + + __s32 clockid; + /* + * Defines set of regs to dump for each sample + * state captured on: + * - precise = 0: PMU interrupt + * - precise > 0: sampled instruction + * + * See asm/perf_regs.h for details. + */ + __u64 sample_regs_intr; + + /* + * Wakeup watermark for AUX area + */ + __u32 aux_watermark; + __u16 sample_max_stack; + __u16 __reserved_2; + __u32 aux_sample_size; + __u32 __reserved_3; + + /* + * User provided data if sigtrap=1, passed back to user via + * siginfo_t::si_perf_data, e.g. to permit user to identify the event. + * Note, siginfo_t::si_perf_data is long-sized, and sig_data will be + * truncated accordingly on 32 bit architectures. + */ + __u64 sig_data; + + __u64 config3; /* extension of config2 */ +}; + +/* + * Structure used by below PERF_EVENT_IOC_QUERY_BPF command + * to query bpf programs attached to the same perf tracepoint + * as the given perf event. + */ +struct perf_event_query_bpf { + /* + * The below ids array length + */ + __u32 ids_len; + /* + * Set by the kernel to indicate the number of + * available programs + */ + __u32 prog_cnt; + /* + * User provided buffer to store program ids + */ + __u32 ids[]; +}; + +/* + * Ioctls that can be done on a perf event fd: + */ +#define PERF_EVENT_IOC_ENABLE _IO ('$', 0) +#define PERF_EVENT_IOC_DISABLE _IO ('$', 1) +#define PERF_EVENT_IOC_REFRESH _IO ('$', 2) +#define PERF_EVENT_IOC_RESET _IO ('$', 3) +#define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64) +#define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5) +#define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) +#define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) +#define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32) +#define PERF_EVENT_IOC_PAUSE_OUTPUT _IOW('$', 9, __u32) +#define PERF_EVENT_IOC_QUERY_BPF _IOWR('$', 10, struct perf_event_query_bpf *) +#define PERF_EVENT_IOC_MODIFY_ATTRIBUTES _IOW('$', 11, struct perf_event_attr *) + +enum perf_event_ioc_flags { + PERF_IOC_FLAG_GROUP = 1U << 0, +}; + +/* + * Structure of the page that can be mapped via mmap + */ +struct perf_event_mmap_page { + __u32 version; /* version number of this structure */ + __u32 compat_version; /* lowest version this is compat with */ + + /* + * Bits needed to read the hw events in user-space. + * + * u32 seq, time_mult, time_shift, index, width; + * u64 count, enabled, running; + * u64 cyc, time_offset; + * s64 pmc = 0; + * + * do { + * seq = pc->lock; + * barrier() + * + * enabled = pc->time_enabled; + * running = pc->time_running; + * + * if (pc->cap_usr_time && enabled != running) { + * cyc = rdtsc(); + * time_offset = pc->time_offset; + * time_mult = pc->time_mult; + * time_shift = pc->time_shift; + * } + * + * index = pc->index; + * count = pc->offset; + * if (pc->cap_user_rdpmc && index) { + * width = pc->pmc_width; + * pmc = rdpmc(index - 1); + * } + * + * barrier(); + * } while (pc->lock != seq); + * + * NOTE: for obvious reason this only works on self-monitoring + * processes. + */ + __u32 lock; /* seqlock for synchronization */ + __u32 index; /* hardware event identifier */ + __s64 offset; /* add to hardware event value */ + __u64 time_enabled; /* time event active */ + __u64 time_running; /* time event on cpu */ + union { + __u64 capabilities; + struct { + __u64 cap_bit0 : 1, /* Always 0, deprecated, see commit 860f085b74e9 */ + cap_bit0_is_deprecated : 1, /* Always 1, signals that bit 0 is zero */ + + cap_user_rdpmc : 1, /* The RDPMC instruction can be used to read counts */ + cap_user_time : 1, /* The time_{shift,mult,offset} fields are used */ + cap_user_time_zero : 1, /* The time_zero field is used */ + cap_user_time_short : 1, /* the time_{cycle,mask} fields are used */ + cap_____res : 58; + }; + }; + + /* + * If cap_user_rdpmc this field provides the bit-width of the value + * read using the rdpmc() or equivalent instruction. This can be used + * to sign extend the result like: + * + * pmc <<= 64 - width; + * pmc >>= 64 - width; // signed shift right + * count += pmc; + */ + __u16 pmc_width; + + /* + * If cap_usr_time the below fields can be used to compute the time + * delta since time_enabled (in ns) using rdtsc or similar. + * + * u64 quot, rem; + * u64 delta; + * + * quot = (cyc >> time_shift); + * rem = cyc & (((u64)1 << time_shift) - 1); + * delta = time_offset + quot * time_mult + + * ((rem * time_mult) >> time_shift); + * + * Where time_offset,time_mult,time_shift and cyc are read in the + * seqcount loop described above. This delta can then be added to + * enabled and possible running (if index), improving the scaling: + * + * enabled += delta; + * if (index) + * running += delta; + * + * quot = count / running; + * rem = count % running; + * count = quot * enabled + (rem * enabled) / running; + */ + __u16 time_shift; + __u32 time_mult; + __u64 time_offset; + /* + * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated + * from sample timestamps. + * + * time = timestamp - time_zero; + * quot = time / time_mult; + * rem = time % time_mult; + * cyc = (quot << time_shift) + (rem << time_shift) / time_mult; + * + * And vice versa: + * + * quot = cyc >> time_shift; + * rem = cyc & (((u64)1 << time_shift) - 1); + * timestamp = time_zero + quot * time_mult + + * ((rem * time_mult) >> time_shift); + */ + __u64 time_zero; + + __u32 size; /* Header size up to __reserved[] fields. */ + __u32 __reserved_1; + + /* + * If cap_usr_time_short, the hardware clock is less than 64bit wide + * and we must compute the 'cyc' value, as used by cap_usr_time, as: + * + * cyc = time_cycles + ((cyc - time_cycles) & time_mask) + * + * NOTE: this form is explicitly chosen such that cap_usr_time_short + * is a correction on top of cap_usr_time, and code that doesn't + * know about cap_usr_time_short still works under the assumption + * the counter doesn't wrap. + */ + __u64 time_cycles; + __u64 time_mask; + + /* + * Hole for extension of the self monitor capabilities + */ + + __u8 __reserved[116*8]; /* align to 1k. */ + + /* + * Control data for the mmap() data buffer. + * + * User-space reading the @data_head value should issue an smp_rmb(), + * after reading this value. + * + * When the mapping is PROT_WRITE the @data_tail value should be + * written by userspace to reflect the last read data, after issueing + * an smp_mb() to separate the data read from the ->data_tail store. + * In this case the kernel will not over-write unread data. + * + * See perf_output_put_handle() for the data ordering. + * + * data_{offset,size} indicate the location and size of the perf record + * buffer within the mmapped area. + */ + __u64 data_head; /* head in the data section */ + __u64 data_tail; /* user-space written tail */ + __u64 data_offset; /* where the buffer starts */ + __u64 data_size; /* data buffer size */ + + /* + * AUX area is defined by aux_{offset,size} fields that should be set + * by the userspace, so that + * + * aux_offset >= data_offset + data_size + * + * prior to mmap()ing it. Size of the mmap()ed area should be aux_size. + * + * Ring buffer pointers aux_{head,tail} have the same semantics as + * data_{head,tail} and same ordering rules apply. + */ + __u64 aux_head; + __u64 aux_tail; + __u64 aux_offset; + __u64 aux_size; +}; + +/* + * The current state of perf_event_header::misc bits usage: + * ('|' used bit, '-' unused bit) + * + * 012 CDEF + * |||---------|||| + * + * Where: + * 0-2 CPUMODE_MASK + * + * C PROC_MAP_PARSE_TIMEOUT + * D MMAP_DATA / COMM_EXEC / FORK_EXEC / SWITCH_OUT + * E MMAP_BUILD_ID / EXACT_IP / SCHED_OUT_PREEMPT + * F (reserved) + */ + +#define PERF_RECORD_MISC_CPUMODE_MASK (7 << 0) +#define PERF_RECORD_MISC_CPUMODE_UNKNOWN (0 << 0) +#define PERF_RECORD_MISC_KERNEL (1 << 0) +#define PERF_RECORD_MISC_USER (2 << 0) +#define PERF_RECORD_MISC_HYPERVISOR (3 << 0) +#define PERF_RECORD_MISC_GUEST_KERNEL (4 << 0) +#define PERF_RECORD_MISC_GUEST_USER (5 << 0) + +/* + * Indicates that /proc/PID/maps parsing are truncated by time out. + */ +#define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT (1 << 12) +/* + * Following PERF_RECORD_MISC_* are used on different + * events, so can reuse the same bit position: + * + * PERF_RECORD_MISC_MMAP_DATA - PERF_RECORD_MMAP* events + * PERF_RECORD_MISC_COMM_EXEC - PERF_RECORD_COMM event + * PERF_RECORD_MISC_FORK_EXEC - PERF_RECORD_FORK event (perf internal) + * PERF_RECORD_MISC_SWITCH_OUT - PERF_RECORD_SWITCH* events + */ +#define PERF_RECORD_MISC_MMAP_DATA (1 << 13) +#define PERF_RECORD_MISC_COMM_EXEC (1 << 13) +#define PERF_RECORD_MISC_FORK_EXEC (1 << 13) +#define PERF_RECORD_MISC_SWITCH_OUT (1 << 13) +/* + * These PERF_RECORD_MISC_* flags below are safely reused + * for the following events: + * + * PERF_RECORD_MISC_EXACT_IP - PERF_RECORD_SAMPLE of precise events + * PERF_RECORD_MISC_SWITCH_OUT_PREEMPT - PERF_RECORD_SWITCH* events + * PERF_RECORD_MISC_MMAP_BUILD_ID - PERF_RECORD_MMAP2 event + * + * + * PERF_RECORD_MISC_EXACT_IP: + * Indicates that the content of PERF_SAMPLE_IP points to + * the actual instruction that triggered the event. See also + * perf_event_attr::precise_ip. + * + * PERF_RECORD_MISC_SWITCH_OUT_PREEMPT: + * Indicates that thread was preempted in TASK_RUNNING state. + * + * PERF_RECORD_MISC_MMAP_BUILD_ID: + * Indicates that mmap2 event carries build id data. + */ +#define PERF_RECORD_MISC_EXACT_IP (1 << 14) +#define PERF_RECORD_MISC_SWITCH_OUT_PREEMPT (1 << 14) +#define PERF_RECORD_MISC_MMAP_BUILD_ID (1 << 14) +/* + * Reserve the last bit to indicate some extended misc field + */ +#define PERF_RECORD_MISC_EXT_RESERVED (1 << 15) + +struct perf_event_header { + __u32 type; + __u16 misc; + __u16 size; +}; + +struct perf_ns_link_info { + __u64 dev; + __u64 ino; +}; + +enum { + NET_NS_INDEX = 0, + UTS_NS_INDEX = 1, + IPC_NS_INDEX = 2, + PID_NS_INDEX = 3, + USER_NS_INDEX = 4, + MNT_NS_INDEX = 5, + CGROUP_NS_INDEX = 6, + + NR_NAMESPACES, /* number of available namespaces */ +}; + +enum perf_event_type { + + /* + * If perf_event_attr.sample_id_all is set then all event types will + * have the sample_type selected fields related to where/when + * (identity) an event took place (TID, TIME, ID, STREAM_ID, CPU, + * IDENTIFIER) described in PERF_RECORD_SAMPLE below, it will be stashed + * just after the perf_event_header and the fields already present for + * the existing fields, i.e. at the end of the payload. That way a newer + * perf.data file will be supported by older perf tools, with these new + * optional fields being ignored. + * + * struct sample_id { + * { u32 pid, tid; } && PERF_SAMPLE_TID + * { u64 time; } && PERF_SAMPLE_TIME + * { u64 id; } && PERF_SAMPLE_ID + * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID + * { u32 cpu, res; } && PERF_SAMPLE_CPU + * { u64 id; } && PERF_SAMPLE_IDENTIFIER + * } && perf_event_attr::sample_id_all + * + * Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. The + * advantage of PERF_SAMPLE_IDENTIFIER is that its position is fixed + * relative to header.size. + */ + + /* + * The MMAP events record the PROT_EXEC mappings so that we can + * correlate userspace IPs to code. They have the following structure: + * + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * u64 addr; + * u64 len; + * u64 pgoff; + * char filename[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_MMAP = 1, + + /* + * struct { + * struct perf_event_header header; + * u64 id; + * u64 lost; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_LOST = 2, + + /* + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * char comm[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_COMM = 3, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, ppid; + * u32 tid, ptid; + * u64 time; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_EXIT = 4, + + /* + * struct { + * struct perf_event_header header; + * u64 time; + * u64 id; + * u64 stream_id; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_THROTTLE = 5, + PERF_RECORD_UNTHROTTLE = 6, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, ppid; + * u32 tid, ptid; + * u64 time; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_FORK = 7, + + /* + * struct { + * struct perf_event_header header; + * u32 pid, tid; + * + * struct read_format values; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_READ = 8, + + /* + * struct { + * struct perf_event_header header; + * + * # + * # Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. + * # The advantage of PERF_SAMPLE_IDENTIFIER is that its position + * # is fixed relative to header. + * # + * + * { u64 id; } && PERF_SAMPLE_IDENTIFIER + * { u64 ip; } && PERF_SAMPLE_IP + * { u32 pid, tid; } && PERF_SAMPLE_TID + * { u64 time; } && PERF_SAMPLE_TIME + * { u64 addr; } && PERF_SAMPLE_ADDR + * { u64 id; } && PERF_SAMPLE_ID + * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID + * { u32 cpu, res; } && PERF_SAMPLE_CPU + * { u64 period; } && PERF_SAMPLE_PERIOD + * + * { struct read_format values; } && PERF_SAMPLE_READ + * + * { u64 nr, + * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN + * + * # + * # The RAW record below is opaque data wrt the ABI + * # + * # That is, the ABI doesn't make any promises wrt to + * # the stability of its content, it may vary depending + * # on event, hardware, kernel version and phase of + * # the moon. + * # + * # In other words, PERF_SAMPLE_RAW contents are not an ABI. + * # + * + * { u32 size; + * char data[size];}&& PERF_SAMPLE_RAW + * + * { u64 nr; + * { u64 hw_idx; } && PERF_SAMPLE_BRANCH_HW_INDEX + * { u64 from, to, flags } lbr[nr]; + * } && PERF_SAMPLE_BRANCH_STACK + * + * { u64 abi; # enum perf_sample_regs_abi + * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER + * + * { u64 size; + * char data[size]; + * u64 dyn_size; } && PERF_SAMPLE_STACK_USER + * + * { union perf_sample_weight + * { + * u64 full; && PERF_SAMPLE_WEIGHT + * #if defined(__LITTLE_ENDIAN_BITFIELD) + * struct { + * u32 var1_dw; + * u16 var2_w; + * u16 var3_w; + * } && PERF_SAMPLE_WEIGHT_STRUCT + * #elif defined(__BIG_ENDIAN_BITFIELD) + * struct { + * u16 var3_w; + * u16 var2_w; + * u32 var1_dw; + * } && PERF_SAMPLE_WEIGHT_STRUCT + * #endif + * } + * } + * { u64 data_src; } && PERF_SAMPLE_DATA_SRC + * { u64 transaction; } && PERF_SAMPLE_TRANSACTION + * { u64 abi; # enum perf_sample_regs_abi + * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR + * { u64 phys_addr;} && PERF_SAMPLE_PHYS_ADDR + * { u64 size; + * char data[size]; } && PERF_SAMPLE_AUX + * { u64 data_page_size;} && PERF_SAMPLE_DATA_PAGE_SIZE + * { u64 code_page_size;} && PERF_SAMPLE_CODE_PAGE_SIZE + * }; + */ + PERF_RECORD_SAMPLE = 9, + + /* + * The MMAP2 records are an augmented version of MMAP, they add + * maj, min, ino numbers to be used to uniquely identify each mapping + * + * struct { + * struct perf_event_header header; + * + * u32 pid, tid; + * u64 addr; + * u64 len; + * u64 pgoff; + * union { + * struct { + * u32 maj; + * u32 min; + * u64 ino; + * u64 ino_generation; + * }; + * struct { + * u8 build_id_size; + * u8 __reserved_1; + * u16 __reserved_2; + * u8 build_id[20]; + * }; + * }; + * u32 prot, flags; + * char filename[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_MMAP2 = 10, + + /* + * Records that new data landed in the AUX buffer part. + * + * struct { + * struct perf_event_header header; + * + * u64 aux_offset; + * u64 aux_size; + * u64 flags; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_AUX = 11, + + /* + * Indicates that instruction trace has started + * + * struct { + * struct perf_event_header header; + * u32 pid; + * u32 tid; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_ITRACE_START = 12, + + /* + * Records the dropped/lost sample number. + * + * struct { + * struct perf_event_header header; + * + * u64 lost; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_LOST_SAMPLES = 13, + + /* + * Records a context switch in or out (flagged by + * PERF_RECORD_MISC_SWITCH_OUT). See also + * PERF_RECORD_SWITCH_CPU_WIDE. + * + * struct { + * struct perf_event_header header; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_SWITCH = 14, + + /* + * CPU-wide version of PERF_RECORD_SWITCH with next_prev_pid and + * next_prev_tid that are the next (switching out) or previous + * (switching in) pid/tid. + * + * struct { + * struct perf_event_header header; + * u32 next_prev_pid; + * u32 next_prev_tid; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_SWITCH_CPU_WIDE = 15, + + /* + * struct { + * struct perf_event_header header; + * u32 pid; + * u32 tid; + * u64 nr_namespaces; + * { u64 dev, inode; } [nr_namespaces]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_NAMESPACES = 16, + + /* + * Record ksymbol register/unregister events: + * + * struct { + * struct perf_event_header header; + * u64 addr; + * u32 len; + * u16 ksym_type; + * u16 flags; + * char name[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_KSYMBOL = 17, + + /* + * Record bpf events: + * enum perf_bpf_event_type { + * PERF_BPF_EVENT_UNKNOWN = 0, + * PERF_BPF_EVENT_PROG_LOAD = 1, + * PERF_BPF_EVENT_PROG_UNLOAD = 2, + * }; + * + * struct { + * struct perf_event_header header; + * u16 type; + * u16 flags; + * u32 id; + * u8 tag[BPF_TAG_SIZE]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_BPF_EVENT = 18, + + /* + * struct { + * struct perf_event_header header; + * u64 id; + * char path[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_CGROUP = 19, + + /* + * Records changes to kernel text i.e. self-modified code. 'old_len' is + * the number of old bytes, 'new_len' is the number of new bytes. Either + * 'old_len' or 'new_len' may be zero to indicate, for example, the + * addition or removal of a trampoline. 'bytes' contains the old bytes + * followed immediately by the new bytes. + * + * struct { + * struct perf_event_header header; + * u64 addr; + * u16 old_len; + * u16 new_len; + * u8 bytes[]; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_TEXT_POKE = 20, + + /* + * Data written to the AUX area by hardware due to aux_output, may need + * to be matched to the event by an architecture-specific hardware ID. + * This records the hardware ID, but requires sample_id to provide the + * event ID. e.g. Intel PT uses this record to disambiguate PEBS-via-PT + * records from multiple events. + * + * struct { + * struct perf_event_header header; + * u64 hw_id; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_AUX_OUTPUT_HW_ID = 21, + + PERF_RECORD_MAX, /* non-ABI */ +}; + +enum perf_record_ksymbol_type { + PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, + PERF_RECORD_KSYMBOL_TYPE_BPF = 1, + /* + * Out of line code such as kprobe-replaced instructions or optimized + * kprobes or ftrace trampolines. + */ + PERF_RECORD_KSYMBOL_TYPE_OOL = 2, + PERF_RECORD_KSYMBOL_TYPE_MAX /* non-ABI */ +}; + +#define PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER (1 << 0) + +enum perf_bpf_event_type { + PERF_BPF_EVENT_UNKNOWN = 0, + PERF_BPF_EVENT_PROG_LOAD = 1, + PERF_BPF_EVENT_PROG_UNLOAD = 2, + PERF_BPF_EVENT_MAX, /* non-ABI */ +}; + +#define PERF_MAX_STACK_DEPTH 127 +#define PERF_MAX_CONTEXTS_PER_STACK 8 + +enum perf_callchain_context { + PERF_CONTEXT_HV = (__u64)-32, + PERF_CONTEXT_KERNEL = (__u64)-128, + PERF_CONTEXT_USER = (__u64)-512, + + PERF_CONTEXT_GUEST = (__u64)-2048, + PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176, + PERF_CONTEXT_GUEST_USER = (__u64)-2560, + + PERF_CONTEXT_MAX = (__u64)-4095, +}; + +/** + * PERF_RECORD_AUX::flags bits + */ +#define PERF_AUX_FLAG_TRUNCATED 0x01 /* record was truncated to fit */ +#define PERF_AUX_FLAG_OVERWRITE 0x02 /* snapshot from overwrite mode */ +#define PERF_AUX_FLAG_PARTIAL 0x04 /* record contains gaps */ +#define PERF_AUX_FLAG_COLLISION 0x08 /* sample collided with another */ +#define PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK 0xff00 /* PMU specific trace format type */ + +/* CoreSight PMU AUX buffer formats */ +#define PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT 0x0000 /* Default for backward compatibility */ +#define PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW 0x0100 /* Raw format of the source */ + +#define PERF_FLAG_FD_NO_GROUP (1UL << 0) +#define PERF_FLAG_FD_OUTPUT (1UL << 1) +#define PERF_FLAG_PID_CGROUP (1UL << 2) /* pid=cgroup id, per-cpu mode only */ +#define PERF_FLAG_FD_CLOEXEC (1UL << 3) /* O_CLOEXEC */ + +#if defined(__LITTLE_ENDIAN_BITFIELD) +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_op:5, /* type of opcode */ + mem_lvl:14, /* memory hierarchy level */ + mem_snoop:5, /* snoop mode */ + mem_lock:2, /* lock instr */ + mem_dtlb:7, /* tlb access */ + mem_lvl_num:4, /* memory hierarchy level number */ + mem_remote:1, /* remote */ + mem_snoopx:2, /* snoop mode, ext */ + mem_blk:3, /* access blocked */ + mem_hops:3, /* hop level */ + mem_rsvd:18; + }; +}; +#elif defined(__BIG_ENDIAN_BITFIELD) +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_rsvd:18, + mem_hops:3, /* hop level */ + mem_blk:3, /* access blocked */ + mem_snoopx:2, /* snoop mode, ext */ + mem_remote:1, /* remote */ + mem_lvl_num:4, /* memory hierarchy level number */ + mem_dtlb:7, /* tlb access */ + mem_lock:2, /* lock instr */ + mem_snoop:5, /* snoop mode */ + mem_lvl:14, /* memory hierarchy level */ + mem_op:5; /* type of opcode */ + }; +}; +#else +#error "Unknown endianness" +#endif + +/* type of opcode (load/store/prefetch,code) */ +#define PERF_MEM_OP_NA 0x01 /* not available */ +#define PERF_MEM_OP_LOAD 0x02 /* load instruction */ +#define PERF_MEM_OP_STORE 0x04 /* store instruction */ +#define PERF_MEM_OP_PFETCH 0x08 /* prefetch */ +#define PERF_MEM_OP_EXEC 0x10 /* code (execution) */ +#define PERF_MEM_OP_SHIFT 0 + +/* + * PERF_MEM_LVL_* namespace being depricated to some extent in the + * favour of newer composite PERF_MEM_{LVLNUM_,REMOTE_,SNOOPX_} fields. + * Supporting this namespace inorder to not break defined ABIs. + * + * memory hierarchy (memory level, hit or miss) + */ +#define PERF_MEM_LVL_NA 0x01 /* not available */ +#define PERF_MEM_LVL_HIT 0x02 /* hit level */ +#define PERF_MEM_LVL_MISS 0x04 /* miss level */ +#define PERF_MEM_LVL_L1 0x08 /* L1 */ +#define PERF_MEM_LVL_LFB 0x10 /* Line Fill Buffer */ +#define PERF_MEM_LVL_L2 0x20 /* L2 */ +#define PERF_MEM_LVL_L3 0x40 /* L3 */ +#define PERF_MEM_LVL_LOC_RAM 0x80 /* Local DRAM */ +#define PERF_MEM_LVL_REM_RAM1 0x100 /* Remote DRAM (1 hop) */ +#define PERF_MEM_LVL_REM_RAM2 0x200 /* Remote DRAM (2 hops) */ +#define PERF_MEM_LVL_REM_CCE1 0x400 /* Remote Cache (1 hop) */ +#define PERF_MEM_LVL_REM_CCE2 0x800 /* Remote Cache (2 hops) */ +#define PERF_MEM_LVL_IO 0x1000 /* I/O memory */ +#define PERF_MEM_LVL_UNC 0x2000 /* Uncached memory */ +#define PERF_MEM_LVL_SHIFT 5 + +#define PERF_MEM_REMOTE_REMOTE 0x01 /* Remote */ +#define PERF_MEM_REMOTE_SHIFT 37 + +#define PERF_MEM_LVLNUM_L1 0x01 /* L1 */ +#define PERF_MEM_LVLNUM_L2 0x02 /* L2 */ +#define PERF_MEM_LVLNUM_L3 0x03 /* L3 */ +#define PERF_MEM_LVLNUM_L4 0x04 /* L4 */ +/* 5-0x8 available */ +#define PERF_MEM_LVLNUM_CXL 0x09 /* CXL */ +#define PERF_MEM_LVLNUM_IO 0x0a /* I/O */ +#define PERF_MEM_LVLNUM_ANY_CACHE 0x0b /* Any cache */ +#define PERF_MEM_LVLNUM_LFB 0x0c /* LFB */ +#define PERF_MEM_LVLNUM_RAM 0x0d /* RAM */ +#define PERF_MEM_LVLNUM_PMEM 0x0e /* PMEM */ +#define PERF_MEM_LVLNUM_NA 0x0f /* N/A */ + +#define PERF_MEM_LVLNUM_SHIFT 33 + +/* snoop mode */ +#define PERF_MEM_SNOOP_NA 0x01 /* not available */ +#define PERF_MEM_SNOOP_NONE 0x02 /* no snoop */ +#define PERF_MEM_SNOOP_HIT 0x04 /* snoop hit */ +#define PERF_MEM_SNOOP_MISS 0x08 /* snoop miss */ +#define PERF_MEM_SNOOP_HITM 0x10 /* snoop hit modified */ +#define PERF_MEM_SNOOP_SHIFT 19 + +#define PERF_MEM_SNOOPX_FWD 0x01 /* forward */ +#define PERF_MEM_SNOOPX_PEER 0x02 /* xfer from peer */ +#define PERF_MEM_SNOOPX_SHIFT 38 + +/* locked instruction */ +#define PERF_MEM_LOCK_NA 0x01 /* not available */ +#define PERF_MEM_LOCK_LOCKED 0x02 /* locked transaction */ +#define PERF_MEM_LOCK_SHIFT 24 + +/* TLB access */ +#define PERF_MEM_TLB_NA 0x01 /* not available */ +#define PERF_MEM_TLB_HIT 0x02 /* hit level */ +#define PERF_MEM_TLB_MISS 0x04 /* miss level */ +#define PERF_MEM_TLB_L1 0x08 /* L1 */ +#define PERF_MEM_TLB_L2 0x10 /* L2 */ +#define PERF_MEM_TLB_WK 0x20 /* Hardware Walker*/ +#define PERF_MEM_TLB_OS 0x40 /* OS fault handler */ +#define PERF_MEM_TLB_SHIFT 26 + +/* Access blocked */ +#define PERF_MEM_BLK_NA 0x01 /* not available */ +#define PERF_MEM_BLK_DATA 0x02 /* data could not be forwarded */ +#define PERF_MEM_BLK_ADDR 0x04 /* address conflict */ +#define PERF_MEM_BLK_SHIFT 40 + +/* hop level */ +#define PERF_MEM_HOPS_0 0x01 /* remote core, same node */ +#define PERF_MEM_HOPS_1 0x02 /* remote node, same socket */ +#define PERF_MEM_HOPS_2 0x03 /* remote socket, same board */ +#define PERF_MEM_HOPS_3 0x04 /* remote board */ +/* 5-7 available */ +#define PERF_MEM_HOPS_SHIFT 43 + +#define PERF_MEM_S(a, s) \ + (((__u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT) + +/* + * single taken branch record layout: + * + * from: source instruction (may not always be a branch insn) + * to: branch target + * mispred: branch target was mispredicted + * predicted: branch target was predicted + * + * support for mispred, predicted is optional. In case it + * is not supported mispred = predicted = 0. + * + * in_tx: running in a hardware transaction + * abort: aborting a hardware transaction + * cycles: cycles from last branch (or 0 if not supported) + * type: branch type + * spec: branch speculation info (or 0 if not supported) + */ +struct perf_branch_entry { + __u64 from; + __u64 to; + __u64 mispred:1, /* target mispredicted */ + predicted:1,/* target predicted */ + in_tx:1, /* in transaction */ + abort:1, /* transaction abort */ + cycles:16, /* cycle count to last branch */ + type:4, /* branch type */ + spec:2, /* branch speculation info */ + new_type:4, /* additional branch type */ + priv:3, /* privilege level */ + reserved:31; +}; + +union perf_sample_weight { + __u64 full; +#if defined(__LITTLE_ENDIAN_BITFIELD) + struct { + __u32 var1_dw; + __u16 var2_w; + __u16 var3_w; + }; +#elif defined(__BIG_ENDIAN_BITFIELD) + struct { + __u16 var3_w; + __u16 var2_w; + __u32 var1_dw; + }; +#else +#error "Unknown endianness" +#endif +}; + +#endif /* _UAPI_LINUX_PERF_EVENT_H */ diff --git a/libbpf/include/uapi/linux/pkt_cls.h b/libbpf/include/uapi/linux/pkt_cls.h new file mode 100644 index 0000000..3faee01 --- /dev/null +++ b/libbpf/include/uapi/linux/pkt_cls.h @@ -0,0 +1,612 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __LINUX_PKT_CLS_H +#define __LINUX_PKT_CLS_H + +#include +#include + +#define TC_COOKIE_MAX_SIZE 16 + +/* Action attributes */ +enum { + TCA_ACT_UNSPEC, + TCA_ACT_KIND, + TCA_ACT_OPTIONS, + TCA_ACT_INDEX, + TCA_ACT_STATS, + TCA_ACT_PAD, + TCA_ACT_COOKIE, + __TCA_ACT_MAX +}; + +#define TCA_ACT_MAX __TCA_ACT_MAX +#define TCA_OLD_COMPAT (TCA_ACT_MAX+1) +#define TCA_ACT_MAX_PRIO 32 +#define TCA_ACT_BIND 1 +#define TCA_ACT_NOBIND 0 +#define TCA_ACT_UNBIND 1 +#define TCA_ACT_NOUNBIND 0 +#define TCA_ACT_REPLACE 1 +#define TCA_ACT_NOREPLACE 0 + +#define TC_ACT_UNSPEC (-1) +#define TC_ACT_OK 0 +#define TC_ACT_RECLASSIFY 1 +#define TC_ACT_SHOT 2 +#define TC_ACT_PIPE 3 +#define TC_ACT_STOLEN 4 +#define TC_ACT_QUEUED 5 +#define TC_ACT_REPEAT 6 +#define TC_ACT_REDIRECT 7 +#define TC_ACT_TRAP 8 /* For hw path, this means "trap to cpu" + * and don't further process the frame + * in hardware. For sw path, this is + * equivalent of TC_ACT_STOLEN - drop + * the skb and act like everything + * is alright. + */ +#define TC_ACT_VALUE_MAX TC_ACT_TRAP + +/* There is a special kind of actions called "extended actions", + * which need a value parameter. These have a local opcode located in + * the highest nibble, starting from 1. The rest of the bits + * are used to carry the value. These two parts together make + * a combined opcode. + */ +#define __TC_ACT_EXT_SHIFT 28 +#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT) +#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1) +#define TC_ACT_EXT_OPCODE(combined) ((combined) & (~TC_ACT_EXT_VAL_MASK)) +#define TC_ACT_EXT_CMP(combined, opcode) (TC_ACT_EXT_OPCODE(combined) == opcode) + +#define TC_ACT_JUMP __TC_ACT_EXT(1) +#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2) +#define TC_ACT_EXT_OPCODE_MAX TC_ACT_GOTO_CHAIN + +/* Action type identifiers*/ +enum { + TCA_ID_UNSPEC=0, + TCA_ID_POLICE=1, + /* other actions go here */ + __TCA_ID_MAX=255 +}; + +#define TCA_ID_MAX __TCA_ID_MAX + +struct tc_police { + __u32 index; + int action; +#define TC_POLICE_UNSPEC TC_ACT_UNSPEC +#define TC_POLICE_OK TC_ACT_OK +#define TC_POLICE_RECLASSIFY TC_ACT_RECLASSIFY +#define TC_POLICE_SHOT TC_ACT_SHOT +#define TC_POLICE_PIPE TC_ACT_PIPE + + __u32 limit; + __u32 burst; + __u32 mtu; + struct tc_ratespec rate; + struct tc_ratespec peakrate; + int refcnt; + int bindcnt; + __u32 capab; +}; + +struct tcf_t { + __u64 install; + __u64 lastuse; + __u64 expires; + __u64 firstuse; +}; + +struct tc_cnt { + int refcnt; + int bindcnt; +}; + +#define tc_gen \ + __u32 index; \ + __u32 capab; \ + int action; \ + int refcnt; \ + int bindcnt + +enum { + TCA_POLICE_UNSPEC, + TCA_POLICE_TBF, + TCA_POLICE_RATE, + TCA_POLICE_PEAKRATE, + TCA_POLICE_AVRATE, + TCA_POLICE_RESULT, + TCA_POLICE_TM, + TCA_POLICE_PAD, + __TCA_POLICE_MAX +#define TCA_POLICE_RESULT TCA_POLICE_RESULT +}; + +#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1) + +/* tca flags definitions */ +#define TCA_CLS_FLAGS_SKIP_HW (1 << 0) /* don't offload filter to HW */ +#define TCA_CLS_FLAGS_SKIP_SW (1 << 1) /* don't use filter in SW */ +#define TCA_CLS_FLAGS_IN_HW (1 << 2) /* filter is offloaded to HW */ +#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */ +#define TCA_CLS_FLAGS_VERBOSE (1 << 4) /* verbose logging */ + +/* U32 filters */ + +#define TC_U32_HTID(h) ((h)&0xFFF00000) +#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20) +#define TC_U32_HASH(h) (((h)>>12)&0xFF) +#define TC_U32_NODE(h) ((h)&0xFFF) +#define TC_U32_KEY(h) ((h)&0xFFFFF) +#define TC_U32_UNSPEC 0 +#define TC_U32_ROOT (0xFFF00000) + +enum { + TCA_U32_UNSPEC, + TCA_U32_CLASSID, + TCA_U32_HASH, + TCA_U32_LINK, + TCA_U32_DIVISOR, + TCA_U32_SEL, + TCA_U32_POLICE, + TCA_U32_ACT, + TCA_U32_INDEV, + TCA_U32_PCNT, + TCA_U32_MARK, + TCA_U32_FLAGS, + TCA_U32_PAD, + __TCA_U32_MAX +}; + +#define TCA_U32_MAX (__TCA_U32_MAX - 1) + +struct tc_u32_key { + __be32 mask; + __be32 val; + int off; + int offmask; +}; + +struct tc_u32_sel { + unsigned char flags; + unsigned char offshift; + unsigned char nkeys; + + __be16 offmask; + __u16 off; + short offoff; + + short hoff; + __be32 hmask; + struct tc_u32_key keys[]; +}; + +struct tc_u32_mark { + __u32 val; + __u32 mask; + __u32 success; +}; + +struct tc_u32_pcnt { + __u64 rcnt; + __u64 rhit; + __u64 kcnts[]; +}; + +/* Flags */ + +#define TC_U32_TERMINAL 1 +#define TC_U32_OFFSET 2 +#define TC_U32_VAROFFSET 4 +#define TC_U32_EAT 8 + +#define TC_U32_MAXDEPTH 8 + + +/* RSVP filter */ + +enum { + TCA_RSVP_UNSPEC, + TCA_RSVP_CLASSID, + TCA_RSVP_DST, + TCA_RSVP_SRC, + TCA_RSVP_PINFO, + TCA_RSVP_POLICE, + TCA_RSVP_ACT, + __TCA_RSVP_MAX +}; + +#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 ) + +struct tc_rsvp_gpi { + __u32 key; + __u32 mask; + int offset; +}; + +struct tc_rsvp_pinfo { + struct tc_rsvp_gpi dpi; + struct tc_rsvp_gpi spi; + __u8 protocol; + __u8 tunnelid; + __u8 tunnelhdr; + __u8 pad; +}; + +/* ROUTE filter */ + +enum { + TCA_ROUTE4_UNSPEC, + TCA_ROUTE4_CLASSID, + TCA_ROUTE4_TO, + TCA_ROUTE4_FROM, + TCA_ROUTE4_IIF, + TCA_ROUTE4_POLICE, + TCA_ROUTE4_ACT, + __TCA_ROUTE4_MAX +}; + +#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1) + + +/* FW filter */ + +enum { + TCA_FW_UNSPEC, + TCA_FW_CLASSID, + TCA_FW_POLICE, + TCA_FW_INDEV, + TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */ + TCA_FW_MASK, + __TCA_FW_MAX +}; + +#define TCA_FW_MAX (__TCA_FW_MAX - 1) + +/* TC index filter */ + +enum { + TCA_TCINDEX_UNSPEC, + TCA_TCINDEX_HASH, + TCA_TCINDEX_MASK, + TCA_TCINDEX_SHIFT, + TCA_TCINDEX_FALL_THROUGH, + TCA_TCINDEX_CLASSID, + TCA_TCINDEX_POLICE, + TCA_TCINDEX_ACT, + __TCA_TCINDEX_MAX +}; + +#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1) + +/* Flow filter */ + +enum { + FLOW_KEY_SRC, + FLOW_KEY_DST, + FLOW_KEY_PROTO, + FLOW_KEY_PROTO_SRC, + FLOW_KEY_PROTO_DST, + FLOW_KEY_IIF, + FLOW_KEY_PRIORITY, + FLOW_KEY_MARK, + FLOW_KEY_NFCT, + FLOW_KEY_NFCT_SRC, + FLOW_KEY_NFCT_DST, + FLOW_KEY_NFCT_PROTO_SRC, + FLOW_KEY_NFCT_PROTO_DST, + FLOW_KEY_RTCLASSID, + FLOW_KEY_SKUID, + FLOW_KEY_SKGID, + FLOW_KEY_VLAN_TAG, + FLOW_KEY_RXHASH, + __FLOW_KEY_MAX, +}; + +#define FLOW_KEY_MAX (__FLOW_KEY_MAX - 1) + +enum { + FLOW_MODE_MAP, + FLOW_MODE_HASH, +}; + +enum { + TCA_FLOW_UNSPEC, + TCA_FLOW_KEYS, + TCA_FLOW_MODE, + TCA_FLOW_BASECLASS, + TCA_FLOW_RSHIFT, + TCA_FLOW_ADDEND, + TCA_FLOW_MASK, + TCA_FLOW_XOR, + TCA_FLOW_DIVISOR, + TCA_FLOW_ACT, + TCA_FLOW_POLICE, + TCA_FLOW_EMATCHES, + TCA_FLOW_PERTURB, + __TCA_FLOW_MAX +}; + +#define TCA_FLOW_MAX (__TCA_FLOW_MAX - 1) + +/* Basic filter */ + +enum { + TCA_BASIC_UNSPEC, + TCA_BASIC_CLASSID, + TCA_BASIC_EMATCHES, + TCA_BASIC_ACT, + TCA_BASIC_POLICE, + __TCA_BASIC_MAX +}; + +#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1) + + +/* Cgroup classifier */ + +enum { + TCA_CGROUP_UNSPEC, + TCA_CGROUP_ACT, + TCA_CGROUP_POLICE, + TCA_CGROUP_EMATCHES, + __TCA_CGROUP_MAX, +}; + +#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1) + +/* BPF classifier */ + +#define TCA_BPF_FLAG_ACT_DIRECT (1 << 0) + +enum { + TCA_BPF_UNSPEC, + TCA_BPF_ACT, + TCA_BPF_POLICE, + TCA_BPF_CLASSID, + TCA_BPF_OPS_LEN, + TCA_BPF_OPS, + TCA_BPF_FD, + TCA_BPF_NAME, + TCA_BPF_FLAGS, + TCA_BPF_FLAGS_GEN, + TCA_BPF_TAG, + TCA_BPF_ID, + __TCA_BPF_MAX, +}; + +#define TCA_BPF_MAX (__TCA_BPF_MAX - 1) + +/* Flower classifier */ + +enum { + TCA_FLOWER_UNSPEC, + TCA_FLOWER_CLASSID, + TCA_FLOWER_INDEV, + TCA_FLOWER_ACT, + TCA_FLOWER_KEY_ETH_DST, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_DST_MASK, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_SRC, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_SRC_MASK, /* ETH_ALEN */ + TCA_FLOWER_KEY_ETH_TYPE, /* be16 */ + TCA_FLOWER_KEY_IP_PROTO, /* u8 */ + TCA_FLOWER_KEY_IPV4_SRC, /* be32 */ + TCA_FLOWER_KEY_IPV4_SRC_MASK, /* be32 */ + TCA_FLOWER_KEY_IPV4_DST, /* be32 */ + TCA_FLOWER_KEY_IPV4_DST_MASK, /* be32 */ + TCA_FLOWER_KEY_IPV6_SRC, /* struct in6_addr */ + TCA_FLOWER_KEY_IPV6_SRC_MASK, /* struct in6_addr */ + TCA_FLOWER_KEY_IPV6_DST, /* struct in6_addr */ + TCA_FLOWER_KEY_IPV6_DST_MASK, /* struct in6_addr */ + TCA_FLOWER_KEY_TCP_SRC, /* be16 */ + TCA_FLOWER_KEY_TCP_DST, /* be16 */ + TCA_FLOWER_KEY_UDP_SRC, /* be16 */ + TCA_FLOWER_KEY_UDP_DST, /* be16 */ + + TCA_FLOWER_FLAGS, + TCA_FLOWER_KEY_VLAN_ID, /* be16 */ + TCA_FLOWER_KEY_VLAN_PRIO, /* u8 */ + TCA_FLOWER_KEY_VLAN_ETH_TYPE, /* be16 */ + + TCA_FLOWER_KEY_ENC_KEY_ID, /* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_SRC, /* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK,/* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_DST, /* be32 */ + TCA_FLOWER_KEY_ENC_IPV4_DST_MASK,/* be32 */ + TCA_FLOWER_KEY_ENC_IPV6_SRC, /* struct in6_addr */ + TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK,/* struct in6_addr */ + TCA_FLOWER_KEY_ENC_IPV6_DST, /* struct in6_addr */ + TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */ + + TCA_FLOWER_KEY_TCP_SRC_MASK, /* be16 */ + TCA_FLOWER_KEY_TCP_DST_MASK, /* be16 */ + TCA_FLOWER_KEY_UDP_SRC_MASK, /* be16 */ + TCA_FLOWER_KEY_UDP_DST_MASK, /* be16 */ + TCA_FLOWER_KEY_SCTP_SRC_MASK, /* be16 */ + TCA_FLOWER_KEY_SCTP_DST_MASK, /* be16 */ + + TCA_FLOWER_KEY_SCTP_SRC, /* be16 */ + TCA_FLOWER_KEY_SCTP_DST, /* be16 */ + + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT, /* be16 */ + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */ + TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */ + TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */ + + TCA_FLOWER_KEY_FLAGS, /* be32 */ + TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */ + + TCA_FLOWER_KEY_ICMPV4_CODE, /* u8 */ + TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */ + TCA_FLOWER_KEY_ICMPV4_TYPE, /* u8 */ + TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */ + TCA_FLOWER_KEY_ICMPV6_CODE, /* u8 */ + TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */ + TCA_FLOWER_KEY_ICMPV6_TYPE, /* u8 */ + TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */ + + TCA_FLOWER_KEY_ARP_SIP, /* be32 */ + TCA_FLOWER_KEY_ARP_SIP_MASK, /* be32 */ + TCA_FLOWER_KEY_ARP_TIP, /* be32 */ + TCA_FLOWER_KEY_ARP_TIP_MASK, /* be32 */ + TCA_FLOWER_KEY_ARP_OP, /* u8 */ + TCA_FLOWER_KEY_ARP_OP_MASK, /* u8 */ + TCA_FLOWER_KEY_ARP_SHA, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_SHA_MASK, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_THA, /* ETH_ALEN */ + TCA_FLOWER_KEY_ARP_THA_MASK, /* ETH_ALEN */ + + TCA_FLOWER_KEY_MPLS_TTL, /* u8 - 8 bits */ + TCA_FLOWER_KEY_MPLS_BOS, /* u8 - 1 bit */ + TCA_FLOWER_KEY_MPLS_TC, /* u8 - 3 bits */ + TCA_FLOWER_KEY_MPLS_LABEL, /* be32 - 20 bits */ + + TCA_FLOWER_KEY_TCP_FLAGS, /* be16 */ + TCA_FLOWER_KEY_TCP_FLAGS_MASK, /* be16 */ + + TCA_FLOWER_KEY_IP_TOS, /* u8 */ + TCA_FLOWER_KEY_IP_TOS_MASK, /* u8 */ + TCA_FLOWER_KEY_IP_TTL, /* u8 */ + TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */ + + TCA_FLOWER_KEY_CVLAN_ID, /* be16 */ + TCA_FLOWER_KEY_CVLAN_PRIO, /* u8 */ + TCA_FLOWER_KEY_CVLAN_ETH_TYPE, /* be16 */ + + TCA_FLOWER_KEY_ENC_IP_TOS, /* u8 */ + TCA_FLOWER_KEY_ENC_IP_TOS_MASK, /* u8 */ + TCA_FLOWER_KEY_ENC_IP_TTL, /* u8 */ + TCA_FLOWER_KEY_ENC_IP_TTL_MASK, /* u8 */ + + TCA_FLOWER_KEY_ENC_OPTS, + TCA_FLOWER_KEY_ENC_OPTS_MASK, + + TCA_FLOWER_IN_HW_COUNT, + + __TCA_FLOWER_MAX, +}; + +#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1) + +enum { + TCA_FLOWER_KEY_ENC_OPTS_UNSPEC, + TCA_FLOWER_KEY_ENC_OPTS_GENEVE, /* Nested + * TCA_FLOWER_KEY_ENC_OPT_GENEVE_ + * attributes + */ + __TCA_FLOWER_KEY_ENC_OPTS_MAX, +}; + +#define TCA_FLOWER_KEY_ENC_OPTS_MAX (__TCA_FLOWER_KEY_ENC_OPTS_MAX - 1) + +enum { + TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS, /* u16 */ + TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE, /* u8 */ + TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA, /* 4 to 128 bytes */ + + __TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX, +}; + +#define TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX \ + (__TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX - 1) + +enum { + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0), + TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1), +}; + +/* Match-all classifier */ + +enum { + TCA_MATCHALL_UNSPEC, + TCA_MATCHALL_CLASSID, + TCA_MATCHALL_ACT, + TCA_MATCHALL_FLAGS, + __TCA_MATCHALL_MAX, +}; + +#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1) + +/* Extended Matches */ + +struct tcf_ematch_tree_hdr { + __u16 nmatches; + __u16 progid; +}; + +enum { + TCA_EMATCH_TREE_UNSPEC, + TCA_EMATCH_TREE_HDR, + TCA_EMATCH_TREE_LIST, + __TCA_EMATCH_TREE_MAX +}; +#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1) + +struct tcf_ematch_hdr { + __u16 matchid; + __u16 kind; + __u16 flags; + __u16 pad; /* currently unused */ +}; + +/* 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-----------------------+-+-+---+ + * | Unused |S|I| R | + * +-----------------------+-+-+---+ + * + * R(2) ::= relation to next ematch + * where: 0 0 END (last ematch) + * 0 1 AND + * 1 0 OR + * 1 1 Unused (invalid) + * I(1) ::= invert result + * S(1) ::= simple payload + */ +#define TCF_EM_REL_END 0 +#define TCF_EM_REL_AND (1<<0) +#define TCF_EM_REL_OR (1<<1) +#define TCF_EM_INVERT (1<<2) +#define TCF_EM_SIMPLE (1<<3) + +#define TCF_EM_REL_MASK 3 +#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK) + +enum { + TCF_LAYER_LINK, + TCF_LAYER_NETWORK, + TCF_LAYER_TRANSPORT, + __TCF_LAYER_MAX +}; +#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1) + +/* Ematch type assignments + * 1..32767 Reserved for ematches inside kernel tree + * 32768..65535 Free to use, not reliable + */ +#define TCF_EM_CONTAINER 0 +#define TCF_EM_CMP 1 +#define TCF_EM_NBYTE 2 +#define TCF_EM_U32 3 +#define TCF_EM_META 4 +#define TCF_EM_TEXT 5 +#define TCF_EM_VLAN 6 +#define TCF_EM_CANID 7 +#define TCF_EM_IPSET 8 +#define TCF_EM_IPT 9 +#define TCF_EM_MAX 9 + +enum { + TCF_EM_PROG_TC +}; + +enum { + TCF_EM_OPND_EQ, + TCF_EM_OPND_GT, + TCF_EM_OPND_LT +}; + +#endif diff --git a/libbpf/include/uapi/linux/pkt_sched.h b/libbpf/include/uapi/linux/pkt_sched.h new file mode 100644 index 0000000..5c903ab --- /dev/null +++ b/libbpf/include/uapi/linux/pkt_sched.h @@ -0,0 +1,1164 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef __LINUX_PKT_SCHED_H +#define __LINUX_PKT_SCHED_H + +#include + +/* Logical priority bands not depending on specific packet scheduler. + Every scheduler will map them to real traffic classes, if it has + no more precise mechanism to classify packets. + + These numbers have no special meaning, though their coincidence + with obsolete IPv6 values is not occasional :-). New IPv6 drafts + preferred full anarchy inspired by diffserv group. + + Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy + class, actually, as rule it will be handled with more care than + filler or even bulk. + */ + +#define TC_PRIO_BESTEFFORT 0 +#define TC_PRIO_FILLER 1 +#define TC_PRIO_BULK 2 +#define TC_PRIO_INTERACTIVE_BULK 4 +#define TC_PRIO_INTERACTIVE 6 +#define TC_PRIO_CONTROL 7 + +#define TC_PRIO_MAX 15 + +/* Generic queue statistics, available for all the elements. + Particular schedulers may have also their private records. + */ + +struct tc_stats { + __u64 bytes; /* Number of enqueued bytes */ + __u32 packets; /* Number of enqueued packets */ + __u32 drops; /* Packets dropped because of lack of resources */ + __u32 overlimits; /* Number of throttle events when this + * flow goes out of allocated bandwidth */ + __u32 bps; /* Current flow byte rate */ + __u32 pps; /* Current flow packet rate */ + __u32 qlen; + __u32 backlog; +}; + +struct tc_estimator { + signed char interval; + unsigned char ewma_log; +}; + +/* "Handles" + --------- + + All the traffic control objects have 32bit identifiers, or "handles". + + They can be considered as opaque numbers from user API viewpoint, + but actually they always consist of two fields: major and + minor numbers, which are interpreted by kernel specially, + that may be used by applications, though not recommended. + + F.e. qdisc handles always have minor number equal to zero, + classes (or flows) have major equal to parent qdisc major, and + minor uniquely identifying class inside qdisc. + + Macros to manipulate handles: + */ + +#define TC_H_MAJ_MASK (0xFFFF0000U) +#define TC_H_MIN_MASK (0x0000FFFFU) +#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK) +#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK) +#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK)) + +#define TC_H_UNSPEC (0U) +#define TC_H_ROOT (0xFFFFFFFFU) +#define TC_H_INGRESS (0xFFFFFFF1U) +#define TC_H_CLSACT TC_H_INGRESS + +#define TC_H_MIN_PRIORITY 0xFFE0U +#define TC_H_MIN_INGRESS 0xFFF2U +#define TC_H_MIN_EGRESS 0xFFF3U + +/* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */ +enum tc_link_layer { + TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */ + TC_LINKLAYER_ETHERNET, + TC_LINKLAYER_ATM, +}; +#define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */ + +struct tc_ratespec { + unsigned char cell_log; + __u8 linklayer; /* lower 4 bits */ + unsigned short overhead; + short cell_align; + unsigned short mpu; + __u32 rate; +}; + +#define TC_RTAB_SIZE 1024 + +struct tc_sizespec { + unsigned char cell_log; + unsigned char size_log; + short cell_align; + int overhead; + unsigned int linklayer; + unsigned int mpu; + unsigned int mtu; + unsigned int tsize; +}; + +enum { + TCA_STAB_UNSPEC, + TCA_STAB_BASE, + TCA_STAB_DATA, + __TCA_STAB_MAX +}; + +#define TCA_STAB_MAX (__TCA_STAB_MAX - 1) + +/* FIFO section */ + +struct tc_fifo_qopt { + __u32 limit; /* Queue length: bytes for bfifo, packets for pfifo */ +}; + +/* SKBPRIO section */ + +/* + * Priorities go from zero to (SKBPRIO_MAX_PRIORITY - 1). + * SKBPRIO_MAX_PRIORITY should be at least 64 in order for skbprio to be able + * to map one to one the DS field of IPV4 and IPV6 headers. + * Memory allocation grows linearly with SKBPRIO_MAX_PRIORITY. + */ + +#define SKBPRIO_MAX_PRIORITY 64 + +struct tc_skbprio_qopt { + __u32 limit; /* Queue length in packets. */ +}; + +/* PRIO section */ + +#define TCQ_PRIO_BANDS 16 +#define TCQ_MIN_PRIO_BANDS 2 + +struct tc_prio_qopt { + int bands; /* Number of bands */ + __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ +}; + +/* MULTIQ section */ + +struct tc_multiq_qopt { + __u16 bands; /* Number of bands */ + __u16 max_bands; /* Maximum number of queues */ +}; + +/* PLUG section */ + +#define TCQ_PLUG_BUFFER 0 +#define TCQ_PLUG_RELEASE_ONE 1 +#define TCQ_PLUG_RELEASE_INDEFINITE 2 +#define TCQ_PLUG_LIMIT 3 + +struct tc_plug_qopt { + /* TCQ_PLUG_BUFFER: Inset a plug into the queue and + * buffer any incoming packets + * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head + * to beginning of the next plug. + * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue. + * Stop buffering packets until the next TCQ_PLUG_BUFFER + * command is received (just act as a pass-thru queue). + * TCQ_PLUG_LIMIT: Increase/decrease queue size + */ + int action; + __u32 limit; +}; + +/* TBF section */ + +struct tc_tbf_qopt { + struct tc_ratespec rate; + struct tc_ratespec peakrate; + __u32 limit; + __u32 buffer; + __u32 mtu; +}; + +enum { + TCA_TBF_UNSPEC, + TCA_TBF_PARMS, + TCA_TBF_RTAB, + TCA_TBF_PTAB, + TCA_TBF_RATE64, + TCA_TBF_PRATE64, + TCA_TBF_BURST, + TCA_TBF_PBURST, + TCA_TBF_PAD, + __TCA_TBF_MAX, +}; + +#define TCA_TBF_MAX (__TCA_TBF_MAX - 1) + + +/* TEQL section */ + +/* TEQL does not require any parameters */ + +/* SFQ section */ + +struct tc_sfq_qopt { + unsigned quantum; /* Bytes per round allocated to flow */ + int perturb_period; /* Period of hash perturbation */ + __u32 limit; /* Maximal packets in queue */ + unsigned divisor; /* Hash divisor */ + unsigned flows; /* Maximal number of flows */ +}; + +struct tc_sfqred_stats { + __u32 prob_drop; /* Early drops, below max threshold */ + __u32 forced_drop; /* Early drops, after max threshold */ + __u32 prob_mark; /* Marked packets, below max threshold */ + __u32 forced_mark; /* Marked packets, after max threshold */ + __u32 prob_mark_head; /* Marked packets, below max threshold */ + __u32 forced_mark_head;/* Marked packets, after max threshold */ +}; + +struct tc_sfq_qopt_v1 { + struct tc_sfq_qopt v0; + unsigned int depth; /* max number of packets per flow */ + unsigned int headdrop; +/* SFQRED parameters */ + __u32 limit; /* HARD maximal flow queue length (bytes) */ + __u32 qth_min; /* Min average length threshold (bytes) */ + __u32 qth_max; /* Max average length threshold (bytes) */ + unsigned char Wlog; /* log(W) */ + unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ + unsigned char Scell_log; /* cell size for idle damping */ + unsigned char flags; + __u32 max_P; /* probability, high resolution */ +/* SFQRED stats */ + struct tc_sfqred_stats stats; +}; + + +struct tc_sfq_xstats { + __s32 allot; +}; + +/* RED section */ + +enum { + TCA_RED_UNSPEC, + TCA_RED_PARMS, + TCA_RED_STAB, + TCA_RED_MAX_P, + __TCA_RED_MAX, +}; + +#define TCA_RED_MAX (__TCA_RED_MAX - 1) + +struct tc_red_qopt { + __u32 limit; /* HARD maximal queue length (bytes) */ + __u32 qth_min; /* Min average length threshold (bytes) */ + __u32 qth_max; /* Max average length threshold (bytes) */ + unsigned char Wlog; /* log(W) */ + unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ + unsigned char Scell_log; /* cell size for idle damping */ + unsigned char flags; +#define TC_RED_ECN 1 +#define TC_RED_HARDDROP 2 +#define TC_RED_ADAPTATIVE 4 +}; + +struct tc_red_xstats { + __u32 early; /* Early drops */ + __u32 pdrop; /* Drops due to queue limits */ + __u32 other; /* Drops due to drop() calls */ + __u32 marked; /* Marked packets */ +}; + +/* GRED section */ + +#define MAX_DPs 16 + +enum { + TCA_GRED_UNSPEC, + TCA_GRED_PARMS, + TCA_GRED_STAB, + TCA_GRED_DPS, + TCA_GRED_MAX_P, + TCA_GRED_LIMIT, + TCA_GRED_VQ_LIST, /* nested TCA_GRED_VQ_ENTRY */ + __TCA_GRED_MAX, +}; + +#define TCA_GRED_MAX (__TCA_GRED_MAX - 1) + +enum { + TCA_GRED_VQ_ENTRY_UNSPEC, + TCA_GRED_VQ_ENTRY, /* nested TCA_GRED_VQ_* */ + __TCA_GRED_VQ_ENTRY_MAX, +}; +#define TCA_GRED_VQ_ENTRY_MAX (__TCA_GRED_VQ_ENTRY_MAX - 1) + +enum { + TCA_GRED_VQ_UNSPEC, + TCA_GRED_VQ_PAD, + TCA_GRED_VQ_DP, /* u32 */ + TCA_GRED_VQ_STAT_BYTES, /* u64 */ + TCA_GRED_VQ_STAT_PACKETS, /* u32 */ + TCA_GRED_VQ_STAT_BACKLOG, /* u32 */ + TCA_GRED_VQ_STAT_PROB_DROP, /* u32 */ + TCA_GRED_VQ_STAT_PROB_MARK, /* u32 */ + TCA_GRED_VQ_STAT_FORCED_DROP, /* u32 */ + TCA_GRED_VQ_STAT_FORCED_MARK, /* u32 */ + TCA_GRED_VQ_STAT_PDROP, /* u32 */ + TCA_GRED_VQ_STAT_OTHER, /* u32 */ + TCA_GRED_VQ_FLAGS, /* u32 */ + __TCA_GRED_VQ_MAX +}; + +#define TCA_GRED_VQ_MAX (__TCA_GRED_VQ_MAX - 1) + +struct tc_gred_qopt { + __u32 limit; /* HARD maximal queue length (bytes) */ + __u32 qth_min; /* Min average length threshold (bytes) */ + __u32 qth_max; /* Max average length threshold (bytes) */ + __u32 DP; /* up to 2^32 DPs */ + __u32 backlog; + __u32 qave; + __u32 forced; + __u32 early; + __u32 other; + __u32 pdrop; + __u8 Wlog; /* log(W) */ + __u8 Plog; /* log(P_max/(qth_max-qth_min)) */ + __u8 Scell_log; /* cell size for idle damping */ + __u8 prio; /* prio of this VQ */ + __u32 packets; + __u32 bytesin; +}; + +/* gred setup */ +struct tc_gred_sopt { + __u32 DPs; + __u32 def_DP; + __u8 grio; + __u8 flags; + __u16 pad1; +}; + +/* CHOKe section */ + +enum { + TCA_CHOKE_UNSPEC, + TCA_CHOKE_PARMS, + TCA_CHOKE_STAB, + TCA_CHOKE_MAX_P, + __TCA_CHOKE_MAX, +}; + +#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1) + +struct tc_choke_qopt { + __u32 limit; /* Hard queue length (packets) */ + __u32 qth_min; /* Min average threshold (packets) */ + __u32 qth_max; /* Max average threshold (packets) */ + unsigned char Wlog; /* log(W) */ + unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ + unsigned char Scell_log; /* cell size for idle damping */ + unsigned char flags; /* see RED flags */ +}; + +struct tc_choke_xstats { + __u32 early; /* Early drops */ + __u32 pdrop; /* Drops due to queue limits */ + __u32 other; /* Drops due to drop() calls */ + __u32 marked; /* Marked packets */ + __u32 matched; /* Drops due to flow match */ +}; + +/* HTB section */ +#define TC_HTB_NUMPRIO 8 +#define TC_HTB_MAXDEPTH 8 +#define TC_HTB_PROTOVER 3 /* the same as HTB and TC's major */ + +struct tc_htb_opt { + struct tc_ratespec rate; + struct tc_ratespec ceil; + __u32 buffer; + __u32 cbuffer; + __u32 quantum; + __u32 level; /* out only */ + __u32 prio; +}; +struct tc_htb_glob { + __u32 version; /* to match HTB/TC */ + __u32 rate2quantum; /* bps->quantum divisor */ + __u32 defcls; /* default class number */ + __u32 debug; /* debug flags */ + + /* stats */ + __u32 direct_pkts; /* count of non shaped packets */ +}; +enum { + TCA_HTB_UNSPEC, + TCA_HTB_PARMS, + TCA_HTB_INIT, + TCA_HTB_CTAB, + TCA_HTB_RTAB, + TCA_HTB_DIRECT_QLEN, + TCA_HTB_RATE64, + TCA_HTB_CEIL64, + TCA_HTB_PAD, + TCA_HTB_OFFLOAD, + __TCA_HTB_MAX, +}; + +#define TCA_HTB_MAX (__TCA_HTB_MAX - 1) + +struct tc_htb_xstats { + __u32 lends; + __u32 borrows; + __u32 giants; /* unused since 'Make HTB scheduler work with TSO.' */ + __s32 tokens; + __s32 ctokens; +}; + +/* HFSC section */ + +struct tc_hfsc_qopt { + __u16 defcls; /* default class */ +}; + +struct tc_service_curve { + __u32 m1; /* slope of the first segment in bps */ + __u32 d; /* x-projection of the first segment in us */ + __u32 m2; /* slope of the second segment in bps */ +}; + +struct tc_hfsc_stats { + __u64 work; /* total work done */ + __u64 rtwork; /* work done by real-time criteria */ + __u32 period; /* current period */ + __u32 level; /* class level in hierarchy */ +}; + +enum { + TCA_HFSC_UNSPEC, + TCA_HFSC_RSC, + TCA_HFSC_FSC, + TCA_HFSC_USC, + __TCA_HFSC_MAX, +}; + +#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1) + + +/* CBQ section */ + +#define TC_CBQ_MAXPRIO 8 +#define TC_CBQ_MAXLEVEL 8 +#define TC_CBQ_DEF_EWMA 5 + +struct tc_cbq_lssopt { + unsigned char change; + unsigned char flags; +#define TCF_CBQ_LSS_BOUNDED 1 +#define TCF_CBQ_LSS_ISOLATED 2 + unsigned char ewma_log; + unsigned char level; +#define TCF_CBQ_LSS_FLAGS 1 +#define TCF_CBQ_LSS_EWMA 2 +#define TCF_CBQ_LSS_MAXIDLE 4 +#define TCF_CBQ_LSS_MINIDLE 8 +#define TCF_CBQ_LSS_OFFTIME 0x10 +#define TCF_CBQ_LSS_AVPKT 0x20 + __u32 maxidle; + __u32 minidle; + __u32 offtime; + __u32 avpkt; +}; + +struct tc_cbq_wrropt { + unsigned char flags; + unsigned char priority; + unsigned char cpriority; + unsigned char __reserved; + __u32 allot; + __u32 weight; +}; + +struct tc_cbq_ovl { + unsigned char strategy; +#define TC_CBQ_OVL_CLASSIC 0 +#define TC_CBQ_OVL_DELAY 1 +#define TC_CBQ_OVL_LOWPRIO 2 +#define TC_CBQ_OVL_DROP 3 +#define TC_CBQ_OVL_RCLASSIC 4 + unsigned char priority2; + __u16 pad; + __u32 penalty; +}; + +struct tc_cbq_police { + unsigned char police; + unsigned char __res1; + unsigned short __res2; +}; + +struct tc_cbq_fopt { + __u32 split; + __u32 defmap; + __u32 defchange; +}; + +struct tc_cbq_xstats { + __u32 borrows; + __u32 overactions; + __s32 avgidle; + __s32 undertime; +}; + +enum { + TCA_CBQ_UNSPEC, + TCA_CBQ_LSSOPT, + TCA_CBQ_WRROPT, + TCA_CBQ_FOPT, + TCA_CBQ_OVL_STRATEGY, + TCA_CBQ_RATE, + TCA_CBQ_RTAB, + TCA_CBQ_POLICE, + __TCA_CBQ_MAX, +}; + +#define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1) + +/* dsmark section */ + +enum { + TCA_DSMARK_UNSPEC, + TCA_DSMARK_INDICES, + TCA_DSMARK_DEFAULT_INDEX, + TCA_DSMARK_SET_TC_INDEX, + TCA_DSMARK_MASK, + TCA_DSMARK_VALUE, + __TCA_DSMARK_MAX, +}; + +#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1) + +/* ATM section */ + +enum { + TCA_ATM_UNSPEC, + TCA_ATM_FD, /* file/socket descriptor */ + TCA_ATM_PTR, /* pointer to descriptor - later */ + TCA_ATM_HDR, /* LL header */ + TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ + TCA_ATM_ADDR, /* PVC address (for output only) */ + TCA_ATM_STATE, /* VC state (ATM_VS_*; for output only) */ + __TCA_ATM_MAX, +}; + +#define TCA_ATM_MAX (__TCA_ATM_MAX - 1) + +/* Network emulator */ + +enum { + TCA_NETEM_UNSPEC, + TCA_NETEM_CORR, + TCA_NETEM_DELAY_DIST, + TCA_NETEM_REORDER, + TCA_NETEM_CORRUPT, + TCA_NETEM_LOSS, + TCA_NETEM_RATE, + TCA_NETEM_ECN, + TCA_NETEM_RATE64, + TCA_NETEM_PAD, + TCA_NETEM_LATENCY64, + TCA_NETEM_JITTER64, + TCA_NETEM_SLOT, + TCA_NETEM_SLOT_DIST, + __TCA_NETEM_MAX, +}; + +#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1) + +struct tc_netem_qopt { + __u32 latency; /* added delay (us) */ + __u32 limit; /* fifo limit (packets) */ + __u32 loss; /* random packet loss (0=none ~0=100%) */ + __u32 gap; /* re-ordering gap (0 for none) */ + __u32 duplicate; /* random packet dup (0=none ~0=100%) */ + __u32 jitter; /* random jitter in latency (us) */ +}; + +struct tc_netem_corr { + __u32 delay_corr; /* delay correlation */ + __u32 loss_corr; /* packet loss correlation */ + __u32 dup_corr; /* duplicate correlation */ +}; + +struct tc_netem_reorder { + __u32 probability; + __u32 correlation; +}; + +struct tc_netem_corrupt { + __u32 probability; + __u32 correlation; +}; + +struct tc_netem_rate { + __u32 rate; /* byte/s */ + __s32 packet_overhead; + __u32 cell_size; + __s32 cell_overhead; +}; + +struct tc_netem_slot { + __s64 min_delay; /* nsec */ + __s64 max_delay; + __s32 max_packets; + __s32 max_bytes; + __s64 dist_delay; /* nsec */ + __s64 dist_jitter; /* nsec */ +}; + +enum { + NETEM_LOSS_UNSPEC, + NETEM_LOSS_GI, /* General Intuitive - 4 state model */ + NETEM_LOSS_GE, /* Gilbert Elliot models */ + __NETEM_LOSS_MAX +}; +#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1) + +/* State transition probabilities for 4 state model */ +struct tc_netem_gimodel { + __u32 p13; + __u32 p31; + __u32 p32; + __u32 p14; + __u32 p23; +}; + +/* Gilbert-Elliot models */ +struct tc_netem_gemodel { + __u32 p; + __u32 r; + __u32 h; + __u32 k1; +}; + +#define NETEM_DIST_SCALE 8192 +#define NETEM_DIST_MAX 16384 + +/* DRR */ + +enum { + TCA_DRR_UNSPEC, + TCA_DRR_QUANTUM, + __TCA_DRR_MAX +}; + +#define TCA_DRR_MAX (__TCA_DRR_MAX - 1) + +struct tc_drr_stats { + __u32 deficit; +}; + +/* MQPRIO */ +#define TC_QOPT_BITMASK 15 +#define TC_QOPT_MAX_QUEUE 16 + +enum { + TC_MQPRIO_HW_OFFLOAD_NONE, /* no offload requested */ + TC_MQPRIO_HW_OFFLOAD_TCS, /* offload TCs, no queue counts */ + __TC_MQPRIO_HW_OFFLOAD_MAX +}; + +#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1) + +enum { + TC_MQPRIO_MODE_DCB, + TC_MQPRIO_MODE_CHANNEL, + __TC_MQPRIO_MODE_MAX +}; + +#define __TC_MQPRIO_MODE_MAX (__TC_MQPRIO_MODE_MAX - 1) + +enum { + TC_MQPRIO_SHAPER_DCB, + TC_MQPRIO_SHAPER_BW_RATE, /* Add new shapers below */ + __TC_MQPRIO_SHAPER_MAX +}; + +#define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1) + +struct tc_mqprio_qopt { + __u8 num_tc; + __u8 prio_tc_map[TC_QOPT_BITMASK + 1]; + __u8 hw; + __u16 count[TC_QOPT_MAX_QUEUE]; + __u16 offset[TC_QOPT_MAX_QUEUE]; +}; + +#define TC_MQPRIO_F_MODE 0x1 +#define TC_MQPRIO_F_SHAPER 0x2 +#define TC_MQPRIO_F_MIN_RATE 0x4 +#define TC_MQPRIO_F_MAX_RATE 0x8 + +enum { + TCA_MQPRIO_UNSPEC, + TCA_MQPRIO_MODE, + TCA_MQPRIO_SHAPER, + TCA_MQPRIO_MIN_RATE64, + TCA_MQPRIO_MAX_RATE64, + __TCA_MQPRIO_MAX, +}; + +#define TCA_MQPRIO_MAX (__TCA_MQPRIO_MAX - 1) + +/* SFB */ + +enum { + TCA_SFB_UNSPEC, + TCA_SFB_PARMS, + __TCA_SFB_MAX, +}; + +#define TCA_SFB_MAX (__TCA_SFB_MAX - 1) + +/* + * Note: increment, decrement are Q0.16 fixed-point values. + */ +struct tc_sfb_qopt { + __u32 rehash_interval; /* delay between hash move, in ms */ + __u32 warmup_time; /* double buffering warmup time in ms (warmup_time < rehash_interval) */ + __u32 max; /* max len of qlen_min */ + __u32 bin_size; /* maximum queue length per bin */ + __u32 increment; /* probability increment, (d1 in Blue) */ + __u32 decrement; /* probability decrement, (d2 in Blue) */ + __u32 limit; /* max SFB queue length */ + __u32 penalty_rate; /* inelastic flows are rate limited to 'rate' pps */ + __u32 penalty_burst; +}; + +struct tc_sfb_xstats { + __u32 earlydrop; + __u32 penaltydrop; + __u32 bucketdrop; + __u32 queuedrop; + __u32 childdrop; /* drops in child qdisc */ + __u32 marked; + __u32 maxqlen; + __u32 maxprob; + __u32 avgprob; +}; + +#define SFB_MAX_PROB 0xFFFF + +/* QFQ */ +enum { + TCA_QFQ_UNSPEC, + TCA_QFQ_WEIGHT, + TCA_QFQ_LMAX, + __TCA_QFQ_MAX +}; + +#define TCA_QFQ_MAX (__TCA_QFQ_MAX - 1) + +struct tc_qfq_stats { + __u32 weight; + __u32 lmax; +}; + +/* CODEL */ + +enum { + TCA_CODEL_UNSPEC, + TCA_CODEL_TARGET, + TCA_CODEL_LIMIT, + TCA_CODEL_INTERVAL, + TCA_CODEL_ECN, + TCA_CODEL_CE_THRESHOLD, + __TCA_CODEL_MAX +}; + +#define TCA_CODEL_MAX (__TCA_CODEL_MAX - 1) + +struct tc_codel_xstats { + __u32 maxpacket; /* largest packet we've seen so far */ + __u32 count; /* how many drops we've done since the last time we + * entered dropping state + */ + __u32 lastcount; /* count at entry to dropping state */ + __u32 ldelay; /* in-queue delay seen by most recently dequeued packet */ + __s32 drop_next; /* time to drop next packet */ + __u32 drop_overlimit; /* number of time max qdisc packet limit was hit */ + __u32 ecn_mark; /* number of packets we ECN marked instead of dropped */ + __u32 dropping; /* are we in dropping state ? */ + __u32 ce_mark; /* number of CE marked packets because of ce_threshold */ +}; + +/* FQ_CODEL */ + +enum { + TCA_FQ_CODEL_UNSPEC, + TCA_FQ_CODEL_TARGET, + TCA_FQ_CODEL_LIMIT, + TCA_FQ_CODEL_INTERVAL, + TCA_FQ_CODEL_ECN, + TCA_FQ_CODEL_FLOWS, + TCA_FQ_CODEL_QUANTUM, + TCA_FQ_CODEL_CE_THRESHOLD, + TCA_FQ_CODEL_DROP_BATCH_SIZE, + TCA_FQ_CODEL_MEMORY_LIMIT, + __TCA_FQ_CODEL_MAX +}; + +#define TCA_FQ_CODEL_MAX (__TCA_FQ_CODEL_MAX - 1) + +enum { + TCA_FQ_CODEL_XSTATS_QDISC, + TCA_FQ_CODEL_XSTATS_CLASS, +}; + +struct tc_fq_codel_qd_stats { + __u32 maxpacket; /* largest packet we've seen so far */ + __u32 drop_overlimit; /* number of time max qdisc + * packet limit was hit + */ + __u32 ecn_mark; /* number of packets we ECN marked + * instead of being dropped + */ + __u32 new_flow_count; /* number of time packets + * created a 'new flow' + */ + __u32 new_flows_len; /* count of flows in new list */ + __u32 old_flows_len; /* count of flows in old list */ + __u32 ce_mark; /* packets above ce_threshold */ + __u32 memory_usage; /* in bytes */ + __u32 drop_overmemory; +}; + +struct tc_fq_codel_cl_stats { + __s32 deficit; + __u32 ldelay; /* in-queue delay seen by most recently + * dequeued packet + */ + __u32 count; + __u32 lastcount; + __u32 dropping; + __s32 drop_next; +}; + +struct tc_fq_codel_xstats { + __u32 type; + union { + struct tc_fq_codel_qd_stats qdisc_stats; + struct tc_fq_codel_cl_stats class_stats; + }; +}; + +/* FQ */ + +enum { + TCA_FQ_UNSPEC, + + TCA_FQ_PLIMIT, /* limit of total number of packets in queue */ + + TCA_FQ_FLOW_PLIMIT, /* limit of packets per flow */ + + TCA_FQ_QUANTUM, /* RR quantum */ + + TCA_FQ_INITIAL_QUANTUM, /* RR quantum for new flow */ + + TCA_FQ_RATE_ENABLE, /* enable/disable rate limiting */ + + TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */ + + TCA_FQ_FLOW_MAX_RATE, /* per flow max rate */ + + TCA_FQ_BUCKETS_LOG, /* log2(number of buckets) */ + + TCA_FQ_FLOW_REFILL_DELAY, /* flow credit refill delay in usec */ + + TCA_FQ_ORPHAN_MASK, /* mask applied to orphaned skb hashes */ + + TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */ + + TCA_FQ_CE_THRESHOLD, /* DCTCP-like CE-marking threshold */ + + __TCA_FQ_MAX +}; + +#define TCA_FQ_MAX (__TCA_FQ_MAX - 1) + +struct tc_fq_qd_stats { + __u64 gc_flows; + __u64 highprio_packets; + __u64 tcp_retrans; + __u64 throttled; + __u64 flows_plimit; + __u64 pkts_too_long; + __u64 allocation_errors; + __s64 time_next_delayed_flow; + __u32 flows; + __u32 inactive_flows; + __u32 throttled_flows; + __u32 unthrottle_latency_ns; + __u64 ce_mark; /* packets above ce_threshold */ +}; + +/* Heavy-Hitter Filter */ + +enum { + TCA_HHF_UNSPEC, + TCA_HHF_BACKLOG_LIMIT, + TCA_HHF_QUANTUM, + TCA_HHF_HH_FLOWS_LIMIT, + TCA_HHF_RESET_TIMEOUT, + TCA_HHF_ADMIT_BYTES, + TCA_HHF_EVICT_TIMEOUT, + TCA_HHF_NON_HH_WEIGHT, + __TCA_HHF_MAX +}; + +#define TCA_HHF_MAX (__TCA_HHF_MAX - 1) + +struct tc_hhf_xstats { + __u32 drop_overlimit; /* number of times max qdisc packet limit + * was hit + */ + __u32 hh_overlimit; /* number of times max heavy-hitters was hit */ + __u32 hh_tot_count; /* number of captured heavy-hitters so far */ + __u32 hh_cur_count; /* number of current heavy-hitters */ +}; + +/* PIE */ +enum { + TCA_PIE_UNSPEC, + TCA_PIE_TARGET, + TCA_PIE_LIMIT, + TCA_PIE_TUPDATE, + TCA_PIE_ALPHA, + TCA_PIE_BETA, + TCA_PIE_ECN, + TCA_PIE_BYTEMODE, + __TCA_PIE_MAX +}; +#define TCA_PIE_MAX (__TCA_PIE_MAX - 1) + +struct tc_pie_xstats { + __u32 prob; /* current probability */ + __u32 delay; /* current delay in ms */ + __u32 avg_dq_rate; /* current average dq_rate in bits/pie_time */ + __u32 packets_in; /* total number of packets enqueued */ + __u32 dropped; /* packets dropped due to pie_action */ + __u32 overlimit; /* dropped due to lack of space in queue */ + __u32 maxq; /* maximum queue size */ + __u32 ecn_mark; /* packets marked with ecn*/ +}; + +/* CBS */ +struct tc_cbs_qopt { + __u8 offload; + __u8 _pad[3]; + __s32 hicredit; + __s32 locredit; + __s32 idleslope; + __s32 sendslope; +}; + +enum { + TCA_CBS_UNSPEC, + TCA_CBS_PARMS, + __TCA_CBS_MAX, +}; + +#define TCA_CBS_MAX (__TCA_CBS_MAX - 1) + + +/* ETF */ +struct tc_etf_qopt { + __s32 delta; + __s32 clockid; + __u32 flags; +#define TC_ETF_DEADLINE_MODE_ON BIT(0) +#define TC_ETF_OFFLOAD_ON BIT(1) +}; + +enum { + TCA_ETF_UNSPEC, + TCA_ETF_PARMS, + __TCA_ETF_MAX, +}; + +#define TCA_ETF_MAX (__TCA_ETF_MAX - 1) + + +/* CAKE */ +enum { + TCA_CAKE_UNSPEC, + TCA_CAKE_PAD, + TCA_CAKE_BASE_RATE64, + TCA_CAKE_DIFFSERV_MODE, + TCA_CAKE_ATM, + TCA_CAKE_FLOW_MODE, + TCA_CAKE_OVERHEAD, + TCA_CAKE_RTT, + TCA_CAKE_TARGET, + TCA_CAKE_AUTORATE, + TCA_CAKE_MEMORY, + TCA_CAKE_NAT, + TCA_CAKE_RAW, + TCA_CAKE_WASH, + TCA_CAKE_MPU, + TCA_CAKE_INGRESS, + TCA_CAKE_ACK_FILTER, + TCA_CAKE_SPLIT_GSO, + __TCA_CAKE_MAX +}; +#define TCA_CAKE_MAX (__TCA_CAKE_MAX - 1) + +enum { + __TCA_CAKE_STATS_INVALID, + TCA_CAKE_STATS_PAD, + TCA_CAKE_STATS_CAPACITY_ESTIMATE64, + TCA_CAKE_STATS_MEMORY_LIMIT, + TCA_CAKE_STATS_MEMORY_USED, + TCA_CAKE_STATS_AVG_NETOFF, + TCA_CAKE_STATS_MIN_NETLEN, + TCA_CAKE_STATS_MAX_NETLEN, + TCA_CAKE_STATS_MIN_ADJLEN, + TCA_CAKE_STATS_MAX_ADJLEN, + TCA_CAKE_STATS_TIN_STATS, + TCA_CAKE_STATS_DEFICIT, + TCA_CAKE_STATS_COBALT_COUNT, + TCA_CAKE_STATS_DROPPING, + TCA_CAKE_STATS_DROP_NEXT_US, + TCA_CAKE_STATS_P_DROP, + TCA_CAKE_STATS_BLUE_TIMER_US, + __TCA_CAKE_STATS_MAX +}; +#define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1) + +enum { + __TCA_CAKE_TIN_STATS_INVALID, + TCA_CAKE_TIN_STATS_PAD, + TCA_CAKE_TIN_STATS_SENT_PACKETS, + TCA_CAKE_TIN_STATS_SENT_BYTES64, + TCA_CAKE_TIN_STATS_DROPPED_PACKETS, + TCA_CAKE_TIN_STATS_DROPPED_BYTES64, + TCA_CAKE_TIN_STATS_ACKS_DROPPED_PACKETS, + TCA_CAKE_TIN_STATS_ACKS_DROPPED_BYTES64, + TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS, + TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64, + TCA_CAKE_TIN_STATS_BACKLOG_PACKETS, + TCA_CAKE_TIN_STATS_BACKLOG_BYTES, + TCA_CAKE_TIN_STATS_THRESHOLD_RATE64, + TCA_CAKE_TIN_STATS_TARGET_US, + TCA_CAKE_TIN_STATS_INTERVAL_US, + TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS, + TCA_CAKE_TIN_STATS_WAY_MISSES, + TCA_CAKE_TIN_STATS_WAY_COLLISIONS, + TCA_CAKE_TIN_STATS_PEAK_DELAY_US, + TCA_CAKE_TIN_STATS_AVG_DELAY_US, + TCA_CAKE_TIN_STATS_BASE_DELAY_US, + TCA_CAKE_TIN_STATS_SPARSE_FLOWS, + TCA_CAKE_TIN_STATS_BULK_FLOWS, + TCA_CAKE_TIN_STATS_UNRESPONSIVE_FLOWS, + TCA_CAKE_TIN_STATS_MAX_SKBLEN, + TCA_CAKE_TIN_STATS_FLOW_QUANTUM, + __TCA_CAKE_TIN_STATS_MAX +}; +#define TCA_CAKE_TIN_STATS_MAX (__TCA_CAKE_TIN_STATS_MAX - 1) +#define TC_CAKE_MAX_TINS (8) + +enum { + CAKE_FLOW_NONE = 0, + CAKE_FLOW_SRC_IP, + CAKE_FLOW_DST_IP, + CAKE_FLOW_HOSTS, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_DST_IP */ + CAKE_FLOW_FLOWS, + CAKE_FLOW_DUAL_SRC, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_FLOWS */ + CAKE_FLOW_DUAL_DST, /* = CAKE_FLOW_DST_IP | CAKE_FLOW_FLOWS */ + CAKE_FLOW_TRIPLE, /* = CAKE_FLOW_HOSTS | CAKE_FLOW_FLOWS */ + CAKE_FLOW_MAX, +}; + +enum { + CAKE_DIFFSERV_DIFFSERV3 = 0, + CAKE_DIFFSERV_DIFFSERV4, + CAKE_DIFFSERV_DIFFSERV8, + CAKE_DIFFSERV_BESTEFFORT, + CAKE_DIFFSERV_PRECEDENCE, + CAKE_DIFFSERV_MAX +}; + +enum { + CAKE_ACK_NONE = 0, + CAKE_ACK_FILTER, + CAKE_ACK_AGGRESSIVE, + CAKE_ACK_MAX +}; + +enum { + CAKE_ATM_NONE = 0, + CAKE_ATM_ATM, + CAKE_ATM_PTM, + CAKE_ATM_MAX +}; + + +/* TAPRIO */ +enum { + TC_TAPRIO_CMD_SET_GATES = 0x00, + TC_TAPRIO_CMD_SET_AND_HOLD = 0x01, + TC_TAPRIO_CMD_SET_AND_RELEASE = 0x02, +}; + +enum { + TCA_TAPRIO_SCHED_ENTRY_UNSPEC, + TCA_TAPRIO_SCHED_ENTRY_INDEX, /* u32 */ + TCA_TAPRIO_SCHED_ENTRY_CMD, /* u8 */ + TCA_TAPRIO_SCHED_ENTRY_GATE_MASK, /* u32 */ + TCA_TAPRIO_SCHED_ENTRY_INTERVAL, /* u32 */ + __TCA_TAPRIO_SCHED_ENTRY_MAX, +}; +#define TCA_TAPRIO_SCHED_ENTRY_MAX (__TCA_TAPRIO_SCHED_ENTRY_MAX - 1) + +/* The format for schedule entry list is: + * [TCA_TAPRIO_SCHED_ENTRY_LIST] + * [TCA_TAPRIO_SCHED_ENTRY] + * [TCA_TAPRIO_SCHED_ENTRY_CMD] + * [TCA_TAPRIO_SCHED_ENTRY_GATES] + * [TCA_TAPRIO_SCHED_ENTRY_INTERVAL] + */ +enum { + TCA_TAPRIO_SCHED_UNSPEC, + TCA_TAPRIO_SCHED_ENTRY, + __TCA_TAPRIO_SCHED_MAX, +}; + +#define TCA_TAPRIO_SCHED_MAX (__TCA_TAPRIO_SCHED_MAX - 1) + +enum { + TCA_TAPRIO_ATTR_UNSPEC, + TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */ + TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST, /* nested of entry */ + TCA_TAPRIO_ATTR_SCHED_BASE_TIME, /* s64 */ + TCA_TAPRIO_ATTR_SCHED_SINGLE_ENTRY, /* single entry */ + TCA_TAPRIO_ATTR_SCHED_CLOCKID, /* s32 */ + TCA_TAPRIO_PAD, + __TCA_TAPRIO_ATTR_MAX, +}; + +#define TCA_TAPRIO_ATTR_MAX (__TCA_TAPRIO_ATTR_MAX - 1) + +#endif diff --git a/libbpf/scripts/build-fuzzers.sh b/libbpf/scripts/build-fuzzers.sh new file mode 100755 index 0000000..a704f47 --- /dev/null +++ b/libbpf/scripts/build-fuzzers.sh @@ -0,0 +1,81 @@ +#!/bin/bash +set -eux + +SANITIZER=${SANITIZER:-address} +flags="-O1 -fno-omit-frame-pointer -g -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=$SANITIZER -fsanitize=fuzzer-no-link" + +export CC=${CC:-clang} +export CFLAGS=${CFLAGS:-$flags} + +export CXX=${CXX:-clang++} +export CXXFLAGS=${CXXFLAGS:-$flags} + +cd "$(dirname -- "$0")/.." + +export OUT=${OUT:-"$(pwd)/out"} +mkdir -p "$OUT" + +export LIB_FUZZING_ENGINE=${LIB_FUZZING_ENGINE:--fsanitize=fuzzer} + +# libelf is compiled with _FORTIFY_SOURCE by default and it +# isn't compatible with MSan. It was borrowed +# from https://github.com/google/oss-fuzz/pull/7422 +if [[ "$SANITIZER" == memory ]]; then + CFLAGS+=" -U_FORTIFY_SOURCE" + CXXFLAGS+=" -U_FORTIFY_SOURCE" +fi + +# The alignment check is turned off by default on OSS-Fuzz/CFLite so it should be +# turned on explicitly there. It was borrowed from +# https://github.com/google/oss-fuzz/pull/7092 +if [[ "$SANITIZER" == undefined ]]; then + additional_ubsan_checks=alignment + UBSAN_FLAGS="-fsanitize=$additional_ubsan_checks -fno-sanitize-recover=$additional_ubsan_checks" + CFLAGS+=" $UBSAN_FLAGS" + CXXFLAGS+=" $UBSAN_FLAGS" +fi + +# Ideally libbelf should be built using release tarballs available +# at https://sourceware.org/elfutils/ftp/. Unfortunately sometimes they +# fail to compile (for example, elfutils-0.185 fails to compile with LDFLAGS enabled +# due to https://bugs.gentoo.org/794601) so let's just point the script to +# commits referring to versions of libelf that actually can be built +rm -rf elfutils +git clone git://sourceware.org/git/elfutils.git +( +cd elfutils +git checkout e9f3045caa5c4498f371383e5519151942d48b6d +git log --oneline -1 + +# ASan isn't compatible with -Wl,--no-undefined: https://github.com/google/sanitizers/issues/380 +find -name Makefile.am | xargs sed -i 's/,--no-undefined//' + +# ASan isn't compatible with -Wl,-z,defs either: +# https://clang.llvm.org/docs/AddressSanitizer.html#usage +sed -i 's/^\(ZDEFS_LDFLAGS=\).*/\1/' configure.ac + +if [[ "$SANITIZER" == undefined ]]; then + # That's basicaly what --enable-sanitize-undefined does to turn off unaligned access + # elfutils heavily relies on on i386/x86_64 but without changing compiler flags along the way + sed -i 's/\(check_undefined_val\)=[0-9]/\1=1/' configure.ac +fi + +autoreconf -i -f +if ! ./configure --enable-maintainer-mode --disable-debuginfod --disable-libdebuginfod \ + CC="$CC" CFLAGS="-Wno-error $CFLAGS" CXX="$CXX" CXXFLAGS="-Wno-error $CXXFLAGS" LDFLAGS="$CFLAGS"; then + cat config.log + exit 1 +fi + +make -C config -j$(nproc) V=1 +make -C lib -j$(nproc) V=1 +make -C libelf -j$(nproc) V=1 +) + +make -C src BUILD_STATIC_ONLY=y V=1 clean +make -C src -j$(nproc) CFLAGS="-I$(pwd)/elfutils/libelf $CFLAGS" BUILD_STATIC_ONLY=y V=1 + +$CC $CFLAGS -Isrc -Iinclude -Iinclude/uapi -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c fuzz/bpf-object-fuzzer.c -o bpf-object-fuzzer.o +$CXX $CXXFLAGS $LIB_FUZZING_ENGINE bpf-object-fuzzer.o src/libbpf.a "$(pwd)/elfutils/libelf/libelf.a" -l:libz.a -o "$OUT/bpf-object-fuzzer" + +cp fuzz/bpf-object-fuzzer_seed_corpus.zip "$OUT" diff --git a/libbpf/scripts/coverity.sh b/libbpf/scripts/coverity.sh new file mode 100755 index 0000000..99e4809 --- /dev/null +++ b/libbpf/scripts/coverity.sh @@ -0,0 +1,105 @@ +#!/bin/bash +# Taken from: https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh +# Local changes are annotated with "#[local]" + +set -e + +# Environment check +echo -e "\033[33;1mNote: COVERITY_SCAN_PROJECT_NAME and COVERITY_SCAN_TOKEN are available on Project Settings page on scan.coverity.com\033[0m" +[ -z "$COVERITY_SCAN_PROJECT_NAME" ] && echo "ERROR: COVERITY_SCAN_PROJECT_NAME must be set" && exit 1 +[ -z "$COVERITY_SCAN_NOTIFICATION_EMAIL" ] && echo "ERROR: COVERITY_SCAN_NOTIFICATION_EMAIL must be set" && exit 1 +[ -z "$COVERITY_SCAN_BRANCH_PATTERN" ] && echo "ERROR: COVERITY_SCAN_BRANCH_PATTERN must be set" && exit 1 +[ -z "$COVERITY_SCAN_BUILD_COMMAND" ] && echo "ERROR: COVERITY_SCAN_BUILD_COMMAND must be set" && exit 1 +[ -z "$COVERITY_SCAN_TOKEN" ] && echo "ERROR: COVERITY_SCAN_TOKEN must be set" && exit 1 + +PLATFORM=`uname` +#[local] Use /var/tmp for TOOL_ARCHIVE and TOOL_BASE, as on certain systems +# /tmp is tmpfs and is sometimes too small to handle all necessary tooling +TOOL_ARCHIVE=/var//tmp/cov-analysis-${PLATFORM}.tgz +TOOL_URL=https://scan.coverity.com/download/${PLATFORM} +TOOL_BASE=/var/tmp/coverity-scan-analysis +UPLOAD_URL="https://scan.coverity.com/builds" +SCAN_URL="https://scan.coverity.com" + +# Do not run on pull requests +if [ "${TRAVIS_PULL_REQUEST}" = "true" ]; then + echo -e "\033[33;1mINFO: Skipping Coverity Analysis: branch is a pull request.\033[0m" + exit 0 +fi + +# Verify this branch should run +IS_COVERITY_SCAN_BRANCH=`ruby -e "puts '${TRAVIS_BRANCH}' =~ /\\A$COVERITY_SCAN_BRANCH_PATTERN\\z/ ? 1 : 0"` +if [ "$IS_COVERITY_SCAN_BRANCH" = "1" ]; then + echo -e "\033[33;1mCoverity Scan configured to run on branch ${TRAVIS_BRANCH}\033[0m" +else + echo -e "\033[33;1mCoverity Scan NOT configured to run on branch ${TRAVIS_BRANCH}\033[0m" + exit 1 +fi + +# Verify upload is permitted +AUTH_RES=`curl -s --form project="$COVERITY_SCAN_PROJECT_NAME" --form token="$COVERITY_SCAN_TOKEN" $SCAN_URL/api/upload_permitted` +if [ "$AUTH_RES" = "Access denied" ]; then + echo -e "\033[33;1mCoverity Scan API access denied. Check COVERITY_SCAN_PROJECT_NAME and COVERITY_SCAN_TOKEN.\033[0m" + exit 1 +else + AUTH=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['upload_permitted']"` + if [ "$AUTH" = "true" ]; then + echo -e "\033[33;1mCoverity Scan analysis authorized per quota.\033[0m" + else + WHEN=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['next_upload_permitted_at']"` + echo -e "\033[33;1mCoverity Scan analysis NOT authorized until $WHEN.\033[0m" + exit 0 + fi +fi + +if [ ! -d $TOOL_BASE ]; then + # Download Coverity Scan Analysis Tool + if [ ! -e $TOOL_ARCHIVE ]; then + echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m" + wget -nv -O $TOOL_ARCHIVE $TOOL_URL --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=$COVERITY_SCAN_TOKEN" + fi + + # Extract Coverity Scan Analysis Tool + echo -e "\033[33;1mExtracting Coverity Scan Analysis Tool...\033[0m" + mkdir -p $TOOL_BASE + pushd $TOOL_BASE + tar xzf $TOOL_ARCHIVE + popd +fi + +TOOL_DIR=`find $TOOL_BASE -type d -name 'cov-analysis*'` +export PATH=$TOOL_DIR/bin:$PATH + +# Build +echo -e "\033[33;1mRunning Coverity Scan Analysis Tool...\033[0m" +COV_BUILD_OPTIONS="" +#COV_BUILD_OPTIONS="--return-emit-failures 8 --parse-error-threshold 85" +RESULTS_DIR="cov-int" +eval "${COVERITY_SCAN_BUILD_COMMAND_PREPEND}" +COVERITY_UNSUPPORTED=1 cov-build --dir $RESULTS_DIR $COV_BUILD_OPTIONS $COVERITY_SCAN_BUILD_COMMAND +cov-import-scm --dir $RESULTS_DIR --scm git --log $RESULTS_DIR/scm_log.txt 2>&1 + +# Upload results +echo -e "\033[33;1mTarring Coverity Scan Analysis results...\033[0m" +RESULTS_ARCHIVE=analysis-results.tgz +tar czf $RESULTS_ARCHIVE $RESULTS_DIR +SHA=`git rev-parse --short HEAD` + +echo -e "\033[33;1mUploading Coverity Scan Analysis results...\033[0m" +response=$(curl \ + --silent --write-out "\n%{http_code}\n" \ + --form project=$COVERITY_SCAN_PROJECT_NAME \ + --form token=$COVERITY_SCAN_TOKEN \ + --form email=$COVERITY_SCAN_NOTIFICATION_EMAIL \ + --form file=@$RESULTS_ARCHIVE \ + --form version=$SHA \ + --form description="Travis CI build" \ + $UPLOAD_URL) +status_code=$(echo "$response" | sed -n '$p') +#[local] Coverity used to return 201 on success, but it's 200 now +# See https://github.com/systemd/systemd/blob/master/tools/coverity.sh#L145 +if [ "$status_code" != "200" ]; then + TEXT=$(echo "$response" | sed '$d') + echo -e "\033[33;1mCoverity Scan upload failed: $TEXT.\033[0m" + exit 1 +fi diff --git a/libbpf/scripts/sync-kernel.sh b/libbpf/scripts/sync-kernel.sh new file mode 100755 index 0000000..55ffcd1 --- /dev/null +++ b/libbpf/scripts/sync-kernel.sh @@ -0,0 +1,355 @@ +#!/bin/bash + +usage () { + echo "USAGE: ./sync-kernel.sh " + echo "" + echo "Set BPF_NEXT_BASELINE to override bpf-next tree commit, otherwise read from /CHECKPOINT-COMMIT." + echo "Set BPF_BASELINE to override bpf tree commit, otherwise read from /BPF-CHECKPOINT-COMMIT." + echo "Set MANUAL_MODE to 1 to manually control every cherry-picked commits." + exit 1 +} + +set -eu + +LIBBPF_REPO=${1-""} +LINUX_REPO=${2-""} +BPF_BRANCH=${3-""} +BASELINE_COMMIT=${BPF_NEXT_BASELINE:-$(cat ${LIBBPF_REPO}/CHECKPOINT-COMMIT)} +BPF_BASELINE_COMMIT=${BPF_BASELINE:-$(cat ${LIBBPF_REPO}/BPF-CHECKPOINT-COMMIT)} + +if [ -z "${LIBBPF_REPO}" ] || [ -z "${LINUX_REPO}" ]; then + echo "Error: libbpf or linux repos are not specified" + usage +fi +if [ -z "${BPF_BRANCH}" ]; then + echo "Error: linux's bpf tree branch is not specified" + usage +fi +if [ -z "${BASELINE_COMMIT}" ] || [ -z "${BPF_BASELINE_COMMIT}" ]; then + echo "Error: bpf or bpf-next baseline commits are not provided" + usage +fi + +SUFFIX=$(date --utc +%Y-%m-%dT%H-%M-%S.%3NZ) +WORKDIR=$(pwd) +TMP_DIR=$(mktemp -d) + +trap "cd ${WORKDIR}; exit" INT TERM EXIT + +declare -A PATH_MAP +PATH_MAP=( \ + [tools/lib/bpf]=src \ + [tools/include/uapi/linux/bpf_common.h]=include/uapi/linux/bpf_common.h \ + [tools/include/uapi/linux/bpf.h]=include/uapi/linux/bpf.h \ + [tools/include/uapi/linux/btf.h]=include/uapi/linux/btf.h \ + [tools/include/uapi/linux/fcntl.h]=include/uapi/linux/fcntl.h \ + [tools/include/uapi/linux/openat2.h]=include/uapi/linux/openat2.h \ + [tools/include/uapi/linux/if_link.h]=include/uapi/linux/if_link.h \ + [tools/include/uapi/linux/if_xdp.h]=include/uapi/linux/if_xdp.h \ + [tools/include/uapi/linux/netdev.h]=include/uapi/linux/netdev.h \ + [tools/include/uapi/linux/netlink.h]=include/uapi/linux/netlink.h \ + [tools/include/uapi/linux/pkt_cls.h]=include/uapi/linux/pkt_cls.h \ + [tools/include/uapi/linux/pkt_sched.h]=include/uapi/linux/pkt_sched.h \ + [include/uapi/linux/perf_event.h]=include/uapi/linux/perf_event.h \ + [Documentation/bpf/libbpf]=docs \ +) + +LIBBPF_PATHS=("${!PATH_MAP[@]}" ":^tools/lib/bpf/Makefile" ":^tools/lib/bpf/Build" ":^tools/lib/bpf/.gitignore" ":^tools/include/tools/libc_compat.h") +LIBBPF_VIEW_PATHS=("${PATH_MAP[@]}") +LIBBPF_VIEW_EXCLUDE_REGEX='^src/(Makefile|Build|test_libbpf\.c|bpf_helper_defs\.h|\.gitignore)$|^docs/(\.gitignore|api\.rst|conf\.py)$|^docs/sphinx/.*' +LINUX_VIEW_EXCLUDE_REGEX='^include/tools/libc_compat.h$' + +LIBBPF_TREE_FILTER="mkdir -p __libbpf/include/uapi/linux __libbpf/include/tools && "$'\\\n' +for p in "${!PATH_MAP[@]}"; do + LIBBPF_TREE_FILTER+="git mv -kf ${p} __libbpf/${PATH_MAP[${p}]} && "$'\\\n' +done +LIBBPF_TREE_FILTER+="git rm --ignore-unmatch -f __libbpf/src/{Makefile,Build,test_libbpf.c,.gitignore} >/dev/null" + +cd_to() +{ + cd ${WORKDIR} && cd "$1" +} + +# Output brief single-line commit description +# $1 - commit ref +commit_desc() +{ + git log -n1 --pretty='%h ("%s")' $1 +} + +# Create commit single-line signature, which consists of: +# - full commit subject +# - author date in ISO8601 format +# - full commit body with newlines replaced with vertical bars (|) +# - shortstat appended at the end +# The idea is that this single-line signature is good enough to make final +# decision about whether two commits are the same, across different repos. +# $1 - commit ref +# $2 - paths filter +commit_signature() +{ + local ref=$1 + shift + git show --pretty='("%s")|%aI|%b' --shortstat $ref -- "${@-.}" | tr '\n' '|' +} + +# Cherry-pick commits touching libbpf-related files +# $1 - baseline_tag +# $2 - tip_tag +cherry_pick_commits() +{ + local manual_mode=${MANUAL_MODE:-0} + local baseline_tag=$1 + local tip_tag=$2 + local new_commits + local signature + local should_skip + local synced_cnt + local manual_check + local libbpf_conflict_cnt + local desc + + new_commits=$(git rev-list --no-merges --topo-order --reverse ${baseline_tag}..${tip_tag} -- "${LIBBPF_PATHS[@]}") + for new_commit in ${new_commits}; do + desc="$(commit_desc ${new_commit})" + signature="$(commit_signature ${new_commit} "${LIBBPF_PATHS[@]}")" + synced_cnt=$(grep -F "${signature}" ${TMP_DIR}/libbpf_commits.txt | wc -l) + manual_check=0 + if ((${synced_cnt} > 0)); then + # commit with the same subject is already in libbpf, but it's + # not 100% the same commit, so check with user + echo "Commit '${desc}' is synced into libbpf as:" + grep -F "${signature}" ${TMP_DIR}/libbpf_commits.txt | \ + cut -d'|' -f1 | sed -e 's/^/- /' + if ((${manual_mode} != 1 && ${synced_cnt} == 1)); then + echo "Skipping '${desc}' due to unique match..." + continue + fi + if ((${synced_cnt} > 1)); then + echo "'${desc} matches multiple commits, please, double-check!" + manual_check=1 + fi + fi + if ((${manual_mode} == 1 || ${manual_check} == 1)); then + read -p "Do you want to skip '${desc}'? [y/N]: " should_skip + case "${should_skip}" in + "y" | "Y") + echo "Skipping '${desc}'..." + continue + ;; + esac + fi + # commit hasn't been synced into libbpf yet + echo "Picking '${desc}'..." + if ! git cherry-pick ${new_commit} &>/dev/null; then + echo "Warning! Cherry-picking '${desc} failed, checking if it's non-libbpf files causing problems..." + libbpf_conflict_cnt=$(git diff --name-only --diff-filter=U -- "${LIBBPF_PATHS[@]}" | wc -l) + conflict_cnt=$(git diff --name-only | wc -l) + prompt_resolution=1 + + if ((${libbpf_conflict_cnt} == 0)); then + echo "Looks like only non-libbpf files have conflicts, ignoring..." + if ((${conflict_cnt} == 0)); then + echo "Empty cherry-pick, skipping it..." + git cherry-pick --abort + continue + fi + + git add . + # GIT_EDITOR=true to avoid editor popping up to edit commit message + if ! GIT_EDITOR=true git cherry-pick --continue &>/dev/null; then + echo "Error! That still failed! Please resolve manually." + else + echo "Success! All cherry-pick conflicts were resolved for '${desc}'!" + prompt_resolution=0 + fi + fi + + if ((${prompt_resolution} == 1)); then + read -p "Error! Cherry-picking '${desc}' failed, please fix manually and press to proceed..." + fi + fi + # Append signature of just cherry-picked commit to avoid + # potentially cherry-picking the same commit twice later when + # processing bpf tree commits. At this point we don't know yet + # the final commit sha in libbpf repo, so we record Linux SHA + # instead as LINUX_. + echo LINUX_$(git log --pretty='%h' -n1) "${signature}" >> ${TMP_DIR}/libbpf_commits.txt + done +} + +cleanup() +{ + echo "Cleaning up..." + rm -r ${TMP_DIR} + cd_to ${LINUX_REPO} + git checkout ${TIP_SYM_REF} + git branch -D ${BASELINE_TAG} ${TIP_TAG} ${BPF_BASELINE_TAG} ${BPF_TIP_TAG} \ + ${SQUASH_BASE_TAG} ${SQUASH_TIP_TAG} ${VIEW_TAG} || true + + cd_to . + echo "DONE." +} + + +cd_to ${LIBBPF_REPO} +GITHUB_ABS_DIR=$(pwd) +echo "Dumping existing libbpf commit signatures..." +for h in $(git log --pretty='%h' -n500); do + echo $h "$(commit_signature $h)" >> ${TMP_DIR}/libbpf_commits.txt +done + +# Use current kernel repo HEAD as a source of patches +cd_to ${LINUX_REPO} +LINUX_ABS_DIR=$(pwd) +TIP_SYM_REF=$(git symbolic-ref -q --short HEAD || git rev-parse HEAD) +TIP_COMMIT=$(git rev-parse HEAD) +BPF_TIP_COMMIT=$(git rev-parse ${BPF_BRANCH}) +BASELINE_TAG=libbpf-baseline-${SUFFIX} +TIP_TAG=libbpf-tip-${SUFFIX} +BPF_BASELINE_TAG=libbpf-bpf-baseline-${SUFFIX} +BPF_TIP_TAG=libbpf-bpf-tip-${SUFFIX} +VIEW_TAG=libbpf-view-${SUFFIX} +LIBBPF_SYNC_TAG=libbpf-sync-${SUFFIX} + +# Squash state of kernel repo at baseline into single commit +SQUASH_BASE_TAG=libbpf-squash-base-${SUFFIX} +SQUASH_TIP_TAG=libbpf-squash-tip-${SUFFIX} +SQUASH_COMMIT=$(git commit-tree ${BASELINE_COMMIT}^{tree} -m "BASELINE SQUASH ${BASELINE_COMMIT}") + +echo "WORKDIR: ${WORKDIR}" +echo "LINUX REPO: ${LINUX_REPO}" +echo "LIBBPF REPO: ${LIBBPF_REPO}" +echo "TEMP DIR: ${TMP_DIR}" +echo "SUFFIX: ${SUFFIX}" +echo "BASE COMMIT: '$(commit_desc ${BASELINE_COMMIT})'" +echo "TIP COMMIT: '$(commit_desc ${TIP_COMMIT})'" +echo "BPF BASE COMMIT: '$(commit_desc ${BPF_BASELINE_COMMIT})'" +echo "BPF TIP COMMIT: '$(commit_desc ${BPF_TIP_COMMIT})'" +echo "SQUASH COMMIT: ${SQUASH_COMMIT}" +echo "BASELINE TAG: ${BASELINE_TAG}" +echo "TIP TAG: ${TIP_TAG}" +echo "BPF BASELINE TAG: ${BPF_BASELINE_TAG}" +echo "BPF TIP TAG: ${BPF_TIP_TAG}" +echo "SQUASH BASE TAG: ${SQUASH_BASE_TAG}" +echo "SQUASH TIP TAG: ${SQUASH_TIP_TAG}" +echo "VIEW TAG: ${VIEW_TAG}" +echo "LIBBPF SYNC TAG: ${LIBBPF_SYNC_TAG}" +echo "PATCHES: ${TMP_DIR}/patches" + +git branch ${BASELINE_TAG} ${BASELINE_COMMIT} +git branch ${TIP_TAG} ${TIP_COMMIT} +git branch ${BPF_BASELINE_TAG} ${BPF_BASELINE_COMMIT} +git branch ${BPF_TIP_TAG} ${BPF_TIP_COMMIT} +git branch ${SQUASH_BASE_TAG} ${SQUASH_COMMIT} +git checkout -b ${SQUASH_TIP_TAG} ${SQUASH_COMMIT} + +# Cherry-pick new commits onto squashed baseline commit +cherry_pick_commits ${BASELINE_TAG} ${TIP_TAG} +cherry_pick_commits ${BPF_BASELINE_TAG} ${BPF_TIP_TAG} + +# Move all libbpf files into __libbpf directory. +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch --prune-empty -f --tree-filter "${LIBBPF_TREE_FILTER}" ${SQUASH_TIP_TAG} ${SQUASH_BASE_TAG} +# Make __libbpf a new root directory +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch --prune-empty -f --subdirectory-filter __libbpf ${SQUASH_TIP_TAG} ${SQUASH_BASE_TAG} + +# If there are no new commits with libbpf-related changes, bail out +COMMIT_CNT=$(git rev-list --count ${SQUASH_BASE_TAG}..${SQUASH_TIP_TAG}) +if ((${COMMIT_CNT} <= 0)); then + echo "No new changes to apply, we are done!" + cleanup + exit 2 +fi + +# Exclude baseline commit and generate nice cover letter with summary +git format-patch --no-signature ${SQUASH_BASE_TAG}..${SQUASH_TIP_TAG} --cover-letter -o ${TMP_DIR}/patches + +# Now is time to re-apply libbpf-related linux patches to libbpf repo +cd_to ${LIBBPF_REPO} +git checkout -b ${LIBBPF_SYNC_TAG} + +for patch in $(ls -1 ${TMP_DIR}/patches | tail -n +2); do + if ! git am -3 --committer-date-is-author-date "${TMP_DIR}/patches/${patch}"; then + if ! patch -p1 --merge < "${TMP_DIR}/patches/${patch}"; then + read -p "Applying ${TMP_DIR}/patches/${patch} failed, please resolve manually and press to proceed..." + fi + git am --continue + fi +done + +# Generate bpf_helper_defs.h and commit, if anything changed +# restore Linux tip to use bpf_doc.py +cd_to ${LINUX_REPO} +git checkout ${TIP_TAG} +# re-generate bpf_helper_defs.h +cd_to ${LIBBPF_REPO} +"${LINUX_ABS_DIR}/scripts/bpf_doc.py" --header \ + --file include/uapi/linux/bpf.h > src/bpf_helper_defs.h +# if anything changed, commit it +helpers_changes=$(git status --porcelain src/bpf_helper_defs.h | wc -l) +if ((${helpers_changes} == 1)); then + git add src/bpf_helper_defs.h + git commit -s -m "sync: auto-generate latest BPF helpers + +Latest changes to BPF helper definitions. +" -- src/bpf_helper_defs.h +fi + +# Use generated cover-letter as a template for "sync commit" with +# baseline and checkpoint commits from kernel repo (and leave summary +# from cover letter intact, of course) +echo ${TIP_COMMIT} > CHECKPOINT-COMMIT && \ +echo ${BPF_TIP_COMMIT} > BPF-CHECKPOINT-COMMIT && \ +git add CHECKPOINT-COMMIT && \ +git add BPF-CHECKPOINT-COMMIT && \ +awk '/\*\*\* BLURB HERE \*\*\*/ {p=1} p' ${TMP_DIR}/patches/0000-cover-letter.patch | \ +sed "s/\*\*\* BLURB HERE \*\*\*/\ +sync: latest libbpf changes from kernel\n\ +\n\ +Syncing latest libbpf commits from kernel repository.\n\ +Baseline bpf-next commit: ${BASELINE_COMMIT}\n\ +Checkpoint bpf-next commit: ${TIP_COMMIT}\n\ +Baseline bpf commit: ${BPF_BASELINE_COMMIT}\n\ +Checkpoint bpf commit: ${BPF_TIP_COMMIT}/" | \ +git commit -s --file=- + +echo "SUCCESS! ${COMMIT_CNT} commits synced." + +echo "Verifying Linux's and Github's libbpf state" + +cd_to ${LINUX_REPO} +git checkout -b ${VIEW_TAG} ${TIP_COMMIT} +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --tree-filter "${LIBBPF_TREE_FILTER}" ${VIEW_TAG}^..${VIEW_TAG} +FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --subdirectory-filter __libbpf ${VIEW_TAG}^..${VIEW_TAG} +git ls-files -- "${LIBBPF_VIEW_PATHS[@]}" | grep -v -E "${LINUX_VIEW_EXCLUDE_REGEX}" > ${TMP_DIR}/linux-view.ls + +cd_to ${LIBBPF_REPO} +git ls-files -- "${LIBBPF_VIEW_PATHS[@]}" | grep -v -E "${LIBBPF_VIEW_EXCLUDE_REGEX}" > ${TMP_DIR}/github-view.ls + +echo "Comparing list of files..." +diff -u ${TMP_DIR}/linux-view.ls ${TMP_DIR}/github-view.ls +echo "Comparing file contents..." +CONSISTENT=1 +for F in $(cat ${TMP_DIR}/linux-view.ls); do + if ! diff -u "${LINUX_ABS_DIR}/${F}" "${GITHUB_ABS_DIR}/${F}"; then + echo "${LINUX_ABS_DIR}/${F} and ${GITHUB_ABS_DIR}/${F} are different!" + CONSISTENT=0 + fi +done +if ((${CONSISTENT} == 1)); then + echo "Great! Content is identical!" +else + ignore_inconsistency=n + echo "Unfortunately, there are some inconsistencies, please double check." + read -p "Does everything look good? [y/N]: " ignore_inconsistency + case "${ignore_inconsistency}" in + "y" | "Y") + echo "Ok, proceeding..." + ;; + *) + echo "Oops, exiting with error..." + exit 4 + esac +fi + +cleanup diff --git a/libbpf/src/.gitignore b/libbpf/src/.gitignore new file mode 100644 index 0000000..0473afb --- /dev/null +++ b/libbpf/src/.gitignore @@ -0,0 +1,6 @@ +*.o +*.a +/libbpf.pc +/libbpf.so* +/staticobjs +/sharedobjs diff --git a/libbpf/src/Makefile b/libbpf/src/Makefile new file mode 100644 index 0000000..bd940e2 --- /dev/null +++ b/libbpf/src/Makefile @@ -0,0 +1,183 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +ifeq ($(V),1) + Q = + msg = +else + Q = @ + msg = @printf ' %-8s %s%s\n' "$(1)" "$(2)" "$(if $(3), $(3))"; +endif + +LIBBPF_MAJOR_VERSION := 1 +LIBBPF_MINOR_VERSION := 2 +LIBBPF_PATCH_VERSION := 0 +LIBBPF_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).$(LIBBPF_PATCH_VERSION) +LIBBPF_MAJMIN_VERSION := $(LIBBPF_MAJOR_VERSION).$(LIBBPF_MINOR_VERSION).0 +LIBBPF_MAP_VERSION := $(shell grep -oE '^LIBBPF_([0-9.]+)' libbpf.map | sort -rV | head -n1 | cut -d'_' -f2) +ifneq ($(LIBBPF_MAJMIN_VERSION), $(LIBBPF_MAP_VERSION)) +$(error Libbpf release ($(LIBBPF_VERSION)) and map ($(LIBBPF_MAP_VERSION)) versions are out of sync!) +endif + +define allow-override + $(if $(or $(findstring environment,$(origin $(1))),\ + $(findstring command line,$(origin $(1)))),,\ + $(eval $(1) = $(2))) +endef + +$(call allow-override,CC,aarch64-linux-gnu-gcc) +$(call allow-override,LD,aarch64-linux-gnu-ld) + +TOPDIR = .. + +INCLUDES := -I. -I$(TOPDIR)/include -I$(TOPDIR)/include/uapi +ALL_CFLAGS := $(INCLUDES) + +SHARED_CFLAGS += -fPIC -fvisibility=hidden -DSHARED + +CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89 +ALL_CFLAGS += $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $(EXTRA_CFLAGS) +ALL_LDFLAGS += $(LDFLAGS) $(EXTRA_LDFLAGS) + +ifdef NO_PKG_CONFIG + ALL_LDFLAGS += -L/home/jiahuan/libelf-aarch64/usr/lib -lelf -L/home/jiahuan/zlib-1.2.10 -lz +else + PKG_CONFIG ?= pkg-config + ALL_CFLAGS += $(shell $(PKG_CONFIG) --cflags libelf zlib) + ALL_LDFLAGS += $(shell $(PKG_CONFIG) --libs libelf zlib) +endif + +OBJDIR ?= . +SHARED_OBJDIR := $(OBJDIR)/sharedobjs +STATIC_OBJDIR := $(OBJDIR)/staticobjs +OBJS := bpf.o btf.o libbpf.o libbpf_errno.o netlink.o \ + nlattr.o str_error.o libbpf_probes.o bpf_prog_linfo.o \ + btf_dump.o hashmap.o ringbuf.o strset.o linker.o gen_loader.o \ + relo_core.o usdt.o zip.o +SHARED_OBJS := $(addprefix $(SHARED_OBJDIR)/,$(OBJS)) +STATIC_OBJS := $(addprefix $(STATIC_OBJDIR)/,$(OBJS)) + +STATIC_LIBS := $(OBJDIR)/libbpf.a +ifndef BUILD_STATIC_ONLY + SHARED_LIBS := $(OBJDIR)/libbpf.so \ + $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION) \ + $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) + VERSION_SCRIPT := libbpf.map +endif + +HEADERS := bpf.h libbpf.h btf.h libbpf_common.h libbpf_legacy.h \ + bpf_helpers.h bpf_helper_defs.h bpf_tracing.h \ + bpf_endian.h bpf_core_read.h skel_internal.h libbpf_version.h \ + usdt.bpf.h +UAPI_HEADERS := $(addprefix $(TOPDIR)/include/uapi/linux/,\ + bpf.h bpf_common.h btf.h) + +PC_FILE := $(OBJDIR)/libbpf.pc + +INSTALL = install + +DESTDIR ?= + +HOSTARCH = $(firstword $(subst -, ,$(shell $(CC) -dumpmachine))) +ifeq ($(filter-out %64 %64be %64eb %64le %64el s390x, $(HOSTARCH)),) + LIBSUBDIR := lib64 +else + LIBSUBDIR := lib +endif + +# By default let the pc file itself use ${prefix} in includedir/libdir so that +# the prefix can be overridden at runtime (eg: --define-prefix) +ifndef LIBDIR + LIBDIR_PC := $$\{prefix\}/$(LIBSUBDIR) +else + LIBDIR_PC := $(LIBDIR) +endif +PREFIX ?= /usr +LIBDIR ?= $(PREFIX)/$(LIBSUBDIR) +INCLUDEDIR ?= $(PREFIX)/include +UAPIDIR ?= $(PREFIX)/include + +TAGS_PROG := $(if $(shell which etags 2>/dev/null),etags,ctags) + +all: $(STATIC_LIBS) $(SHARED_LIBS) $(PC_FILE) + +$(OBJDIR)/libbpf.a: $(STATIC_OBJS) + $(call msg,AR,$@) + $(Q)$(AR) rcs $@ $^ + +$(OBJDIR)/libbpf.so: $(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION) + $(Q)ln -sf $(^F) $@ + +$(OBJDIR)/libbpf.so.$(LIBBPF_MAJOR_VERSION): $(OBJDIR)/libbpf.so.$(LIBBPF_VERSION) + $(Q)ln -sf $(^F) $@ + +$(OBJDIR)/libbpf.so.$(LIBBPF_VERSION): $(SHARED_OBJS) + $(call msg,CC,$@) + $(Q)$(CC) -shared -Wl,--version-script=$(VERSION_SCRIPT) \ + -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \ + $^ $(ALL_LDFLAGS) -o $@ + +$(OBJDIR)/libbpf.pc: force + $(Q)sed -e "s|@PREFIX@|$(PREFIX)|" \ + -e "s|@LIBDIR@|$(LIBDIR_PC)|" \ + -e "s|@VERSION@|$(LIBBPF_VERSION)|" \ + < libbpf.pc.template > $@ + +$(STATIC_OBJDIR) $(SHARED_OBJDIR): + $(call msg,MKDIR,$@) + $(Q)mkdir -p $@ + +$(STATIC_OBJDIR)/%.o: %.c | $(STATIC_OBJDIR) + $(call msg,CC,$@) + $(Q)$(CC) $(ALL_CFLAGS) $(CPPFLAGS) -c $< -o $@ + +$(SHARED_OBJDIR)/%.o: %.c | $(SHARED_OBJDIR) + $(call msg,CC,$@) + $(Q)$(CC) $(ALL_CFLAGS) $(SHARED_CFLAGS) $(CPPFLAGS) -c $< -o $@ + +define do_install + $(call msg,INSTALL,$1) + $(Q)if [ ! -d '$(DESTDIR)$2' ]; then \ + $(INSTALL) -d -m 755 '$(DESTDIR)$2'; \ + fi; + $(Q)$(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR)$2' +endef + +# Preserve symlinks at installation. +define do_s_install + $(call msg,INSTALL,$1) + $(Q)if [ ! -d '$(DESTDIR)$2' ]; then \ + $(INSTALL) -d -m 755 '$(DESTDIR)$2'; \ + fi; + $(Q)cp -fR $1 '$(DESTDIR)$2' +endef + +install: all install_headers install_pkgconfig + $(call do_s_install,$(STATIC_LIBS) $(SHARED_LIBS),$(LIBDIR)) + +install_headers: + $(call do_install,$(HEADERS),$(INCLUDEDIR)/bpf,644) + +# UAPI headers can be installed by a different package so they're not installed +# in by install rule. +install_uapi_headers: + $(call do_install,$(UAPI_HEADERS),$(UAPIDIR)/linux,644) + +install_pkgconfig: $(PC_FILE) + $(call do_install,$(PC_FILE),$(LIBDIR)/pkgconfig,644) + +clean: + $(call msg,CLEAN) + $(Q)rm -rf *.o *.a *.so *.so.* *.pc $(SHARED_OBJDIR) $(STATIC_OBJDIR) + +.PHONY: cscope tags force +cscope: + $(call msg,CSCOPE) + $(Q)ls *.c *.h > cscope.files + $(Q)cscope -b -q -f cscope.out + +tags: + $(call msg,CTAGS) + $(Q)rm -f TAGS tags + $(Q)ls *.c *.h | xargs $(TAGS_PROG) -a + +force: diff --git a/libbpf/src/bpf.c b/libbpf/src/bpf.c new file mode 100644 index 0000000..7670359 --- /dev/null +++ b/libbpf/src/bpf.c @@ -0,0 +1,1191 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * common eBPF ELF operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" + +/* + * When building perf, unistd.h is overridden. __NR_bpf is + * required to be defined explicitly. + */ +#ifndef __NR_bpf +# if defined(__i386__) +# define __NR_bpf 357 +# elif defined(__x86_64__) +# define __NR_bpf 321 +# elif defined(__aarch64__) +# define __NR_bpf 280 +# elif defined(__sparc__) +# define __NR_bpf 349 +# elif defined(__s390__) +# define __NR_bpf 351 +# elif defined(__arc__) +# define __NR_bpf 280 +# elif defined(__mips__) && defined(_ABIO32) +# define __NR_bpf 4355 +# elif defined(__mips__) && defined(_ABIN32) +# define __NR_bpf 6319 +# elif defined(__mips__) && defined(_ABI64) +# define __NR_bpf 5315 +# else +# error __NR_bpf not defined. libbpf does not support your arch. +# endif +#endif + +static inline __u64 ptr_to_u64(const void *ptr) +{ + return (__u64) (unsigned long) ptr; +} + +static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, + unsigned int size) +{ + return syscall(__NR_bpf, cmd, attr, size); +} + +static inline int sys_bpf_fd(enum bpf_cmd cmd, union bpf_attr *attr, + unsigned int size) +{ + int fd; + + fd = sys_bpf(cmd, attr, size); + return ensure_good_fd(fd); +} + +int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts) +{ + int fd; + + do { + fd = sys_bpf_fd(BPF_PROG_LOAD, attr, size); + } while (fd < 0 && errno == EAGAIN && --attempts > 0); + + return fd; +} + +/* Probe whether kernel switched from memlock-based (RLIMIT_MEMLOCK) to + * memcg-based memory accounting for BPF maps and progs. This was done in [0]. + * We use the support for bpf_ktime_get_coarse_ns() helper, which was added in + * the same 5.11 Linux release ([1]), to detect memcg-based accounting for BPF. + * + * [0] https://lore.kernel.org/bpf/20201201215900.3569844-1-guro@fb.com/ + * [1] d05512618056 ("bpf: Add bpf_ktime_get_coarse_ns helper") + */ +int probe_memcg_account(void) +{ + const size_t attr_sz = offsetofend(union bpf_attr, attach_btf_obj_fd); + struct bpf_insn insns[] = { + BPF_EMIT_CALL(BPF_FUNC_ktime_get_coarse_ns), + BPF_EXIT_INSN(), + }; + size_t insn_cnt = ARRAY_SIZE(insns); + union bpf_attr attr; + int prog_fd; + + /* attempt loading freplace trying to use custom BTF */ + memset(&attr, 0, attr_sz); + attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER; + attr.insns = ptr_to_u64(insns); + attr.insn_cnt = insn_cnt; + attr.license = ptr_to_u64("GPL"); + + prog_fd = sys_bpf_fd(BPF_PROG_LOAD, &attr, attr_sz); + if (prog_fd >= 0) { + close(prog_fd); + return 1; + } + return 0; +} + +static bool memlock_bumped; +static rlim_t memlock_rlim = RLIM_INFINITY; + +int libbpf_set_memlock_rlim(size_t memlock_bytes) +{ + if (memlock_bumped) + return libbpf_err(-EBUSY); + + memlock_rlim = memlock_bytes; + return 0; +} + +int bump_rlimit_memlock(void) +{ + struct rlimit rlim; + + /* if kernel supports memcg-based accounting, skip bumping RLIMIT_MEMLOCK */ + if (memlock_bumped || kernel_supports(NULL, FEAT_MEMCG_ACCOUNT)) + return 0; + + memlock_bumped = true; + + /* zero memlock_rlim_max disables auto-bumping RLIMIT_MEMLOCK */ + if (memlock_rlim == 0) + return 0; + + rlim.rlim_cur = rlim.rlim_max = memlock_rlim; + if (setrlimit(RLIMIT_MEMLOCK, &rlim)) + return -errno; + + return 0; +} + +int bpf_map_create(enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, + __u32 value_size, + __u32 max_entries, + const struct bpf_map_create_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, map_extra); + union bpf_attr attr; + int fd; + + bump_rlimit_memlock(); + + memset(&attr, 0, attr_sz); + + if (!OPTS_VALID(opts, bpf_map_create_opts)) + return libbpf_err(-EINVAL); + + attr.map_type = map_type; + if (map_name && kernel_supports(NULL, FEAT_PROG_NAME)) + libbpf_strlcpy(attr.map_name, map_name, sizeof(attr.map_name)); + attr.key_size = key_size; + attr.value_size = value_size; + attr.max_entries = max_entries; + + attr.btf_fd = OPTS_GET(opts, btf_fd, 0); + attr.btf_key_type_id = OPTS_GET(opts, btf_key_type_id, 0); + attr.btf_value_type_id = OPTS_GET(opts, btf_value_type_id, 0); + attr.btf_vmlinux_value_type_id = OPTS_GET(opts, btf_vmlinux_value_type_id, 0); + + attr.inner_map_fd = OPTS_GET(opts, inner_map_fd, 0); + attr.map_flags = OPTS_GET(opts, map_flags, 0); + attr.map_extra = OPTS_GET(opts, map_extra, 0); + attr.numa_node = OPTS_GET(opts, numa_node, 0); + attr.map_ifindex = OPTS_GET(opts, map_ifindex, 0); + + fd = sys_bpf_fd(BPF_MAP_CREATE, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +static void * +alloc_zero_tailing_info(const void *orecord, __u32 cnt, + __u32 actual_rec_size, __u32 expected_rec_size) +{ + __u64 info_len = (__u64)actual_rec_size * cnt; + void *info, *nrecord; + int i; + + info = malloc(info_len); + if (!info) + return NULL; + + /* zero out bytes kernel does not understand */ + nrecord = info; + for (i = 0; i < cnt; i++) { + memcpy(nrecord, orecord, expected_rec_size); + memset(nrecord + expected_rec_size, 0, + actual_rec_size - expected_rec_size); + orecord += actual_rec_size; + nrecord += actual_rec_size; + } + + return info; +} + +int bpf_prog_load(enum bpf_prog_type prog_type, + const char *prog_name, const char *license, + const struct bpf_insn *insns, size_t insn_cnt, + const struct bpf_prog_load_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, fd_array); + void *finfo = NULL, *linfo = NULL; + const char *func_info, *line_info; + __u32 log_size, log_level, attach_prog_fd, attach_btf_obj_fd; + __u32 func_info_rec_size, line_info_rec_size; + int fd, attempts; + union bpf_attr attr; + char *log_buf; + + bump_rlimit_memlock(); + + if (!OPTS_VALID(opts, bpf_prog_load_opts)) + return libbpf_err(-EINVAL); + + attempts = OPTS_GET(opts, attempts, 0); + if (attempts < 0) + return libbpf_err(-EINVAL); + if (attempts == 0) + attempts = PROG_LOAD_ATTEMPTS; + + memset(&attr, 0, attr_sz); + + attr.prog_type = prog_type; + attr.expected_attach_type = OPTS_GET(opts, expected_attach_type, 0); + + attr.prog_btf_fd = OPTS_GET(opts, prog_btf_fd, 0); + attr.prog_flags = OPTS_GET(opts, prog_flags, 0); + attr.prog_ifindex = OPTS_GET(opts, prog_ifindex, 0); + attr.kern_version = OPTS_GET(opts, kern_version, 0); + + if (prog_name && kernel_supports(NULL, FEAT_PROG_NAME)) + libbpf_strlcpy(attr.prog_name, prog_name, sizeof(attr.prog_name)); + attr.license = ptr_to_u64(license); + + if (insn_cnt > UINT_MAX) + return libbpf_err(-E2BIG); + + attr.insns = ptr_to_u64(insns); + attr.insn_cnt = (__u32)insn_cnt; + + attach_prog_fd = OPTS_GET(opts, attach_prog_fd, 0); + attach_btf_obj_fd = OPTS_GET(opts, attach_btf_obj_fd, 0); + + if (attach_prog_fd && attach_btf_obj_fd) + return libbpf_err(-EINVAL); + + attr.attach_btf_id = OPTS_GET(opts, attach_btf_id, 0); + if (attach_prog_fd) + attr.attach_prog_fd = attach_prog_fd; + else + attr.attach_btf_obj_fd = attach_btf_obj_fd; + + log_buf = OPTS_GET(opts, log_buf, NULL); + log_size = OPTS_GET(opts, log_size, 0); + log_level = OPTS_GET(opts, log_level, 0); + + if (!!log_buf != !!log_size) + return libbpf_err(-EINVAL); + if (log_level > (4 | 2 | 1)) + return libbpf_err(-EINVAL); + if (log_level && !log_buf) + return libbpf_err(-EINVAL); + + func_info_rec_size = OPTS_GET(opts, func_info_rec_size, 0); + func_info = OPTS_GET(opts, func_info, NULL); + attr.func_info_rec_size = func_info_rec_size; + attr.func_info = ptr_to_u64(func_info); + attr.func_info_cnt = OPTS_GET(opts, func_info_cnt, 0); + + line_info_rec_size = OPTS_GET(opts, line_info_rec_size, 0); + line_info = OPTS_GET(opts, line_info, NULL); + attr.line_info_rec_size = line_info_rec_size; + attr.line_info = ptr_to_u64(line_info); + attr.line_info_cnt = OPTS_GET(opts, line_info_cnt, 0); + + attr.fd_array = ptr_to_u64(OPTS_GET(opts, fd_array, NULL)); + + if (log_level) { + attr.log_buf = ptr_to_u64(log_buf); + attr.log_size = log_size; + attr.log_level = log_level; + } + + fd = sys_bpf_prog_load(&attr, attr_sz, attempts); + if (fd >= 0) + return fd; + + /* After bpf_prog_load, the kernel may modify certain attributes + * to give user space a hint how to deal with loading failure. + * Check to see whether we can make some changes and load again. + */ + while (errno == E2BIG && (!finfo || !linfo)) { + if (!finfo && attr.func_info_cnt && + attr.func_info_rec_size < func_info_rec_size) { + /* try with corrected func info records */ + finfo = alloc_zero_tailing_info(func_info, + attr.func_info_cnt, + func_info_rec_size, + attr.func_info_rec_size); + if (!finfo) { + errno = E2BIG; + goto done; + } + + attr.func_info = ptr_to_u64(finfo); + attr.func_info_rec_size = func_info_rec_size; + } else if (!linfo && attr.line_info_cnt && + attr.line_info_rec_size < line_info_rec_size) { + linfo = alloc_zero_tailing_info(line_info, + attr.line_info_cnt, + line_info_rec_size, + attr.line_info_rec_size); + if (!linfo) { + errno = E2BIG; + goto done; + } + + attr.line_info = ptr_to_u64(linfo); + attr.line_info_rec_size = line_info_rec_size; + } else { + break; + } + + fd = sys_bpf_prog_load(&attr, attr_sz, attempts); + if (fd >= 0) + goto done; + } + + if (log_level == 0 && log_buf) { + /* log_level == 0 with non-NULL log_buf requires retrying on error + * with log_level == 1 and log_buf/log_buf_size set, to get details of + * failure + */ + attr.log_buf = ptr_to_u64(log_buf); + attr.log_size = log_size; + attr.log_level = 1; + + fd = sys_bpf_prog_load(&attr, attr_sz, attempts); + } +done: + /* free() doesn't affect errno, so we don't need to restore it */ + free(finfo); + free(linfo); + return libbpf_err_errno(fd); +} + +int bpf_map_update_elem(int fd, const void *key, const void *value, + __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + attr.flags = flags; + + ret = sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_lookup_elem(int fd, const void *key, void *value) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + + ret = sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + attr.flags = flags; + + ret = sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_lookup_and_delete_elem(int fd, const void *key, void *value) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + + ret = sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, void *value, __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.value = ptr_to_u64(value); + attr.flags = flags; + + ret = sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_delete_elem(int fd, const void *key) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + + ret = sys_bpf(BPF_MAP_DELETE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_delete_elem_flags(int fd, const void *key, __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.flags = flags; + + ret = sys_bpf(BPF_MAP_DELETE_ELEM, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_get_next_key(int fd, const void *key, void *next_key) +{ + const size_t attr_sz = offsetofend(union bpf_attr, next_key); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = ptr_to_u64(key); + attr.next_key = ptr_to_u64(next_key); + + ret = sys_bpf(BPF_MAP_GET_NEXT_KEY, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_map_freeze(int fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, map_fd); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + + ret = sys_bpf(BPF_MAP_FREEZE, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +static int bpf_map_batch_common(int cmd, int fd, void *in_batch, + void *out_batch, void *keys, void *values, + __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, batch); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_map_batch_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.batch.map_fd = fd; + attr.batch.in_batch = ptr_to_u64(in_batch); + attr.batch.out_batch = ptr_to_u64(out_batch); + attr.batch.keys = ptr_to_u64(keys); + attr.batch.values = ptr_to_u64(values); + attr.batch.count = *count; + attr.batch.elem_flags = OPTS_GET(opts, elem_flags, 0); + attr.batch.flags = OPTS_GET(opts, flags, 0); + + ret = sys_bpf(cmd, &attr, attr_sz); + *count = attr.batch.count; + + return libbpf_err_errno(ret); +} + +int bpf_map_delete_batch(int fd, const void *keys, __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + return bpf_map_batch_common(BPF_MAP_DELETE_BATCH, fd, NULL, + NULL, (void *)keys, NULL, count, opts); +} + +int bpf_map_lookup_batch(int fd, void *in_batch, void *out_batch, void *keys, + void *values, __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + return bpf_map_batch_common(BPF_MAP_LOOKUP_BATCH, fd, in_batch, + out_batch, keys, values, count, opts); +} + +int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, + void *keys, void *values, __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + return bpf_map_batch_common(BPF_MAP_LOOKUP_AND_DELETE_BATCH, + fd, in_batch, out_batch, keys, values, + count, opts); +} + +int bpf_map_update_batch(int fd, const void *keys, const void *values, __u32 *count, + const struct bpf_map_batch_opts *opts) +{ + return bpf_map_batch_common(BPF_MAP_UPDATE_BATCH, fd, NULL, NULL, + (void *)keys, (void *)values, count, opts); +} + +int bpf_obj_pin(int fd, const char *pathname) +{ + const size_t attr_sz = offsetofend(union bpf_attr, file_flags); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.pathname = ptr_to_u64((void *)pathname); + attr.bpf_fd = fd; + + ret = sys_bpf(BPF_OBJ_PIN, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_obj_get(const char *pathname) +{ + return bpf_obj_get_opts(pathname, NULL); +} + +int bpf_obj_get_opts(const char *pathname, const struct bpf_obj_get_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, file_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_obj_get_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.pathname = ptr_to_u64((void *)pathname); + attr.file_flags = OPTS_GET(opts, file_flags, 0); + + fd = sys_bpf_fd(BPF_OBJ_GET, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_prog_attach(int prog_fd, int target_fd, enum bpf_attach_type type, + unsigned int flags) +{ + DECLARE_LIBBPF_OPTS(bpf_prog_attach_opts, opts, + .flags = flags, + ); + + return bpf_prog_attach_opts(prog_fd, target_fd, type, &opts); +} + +int bpf_prog_attach_opts(int prog_fd, int target_fd, + enum bpf_attach_type type, + const struct bpf_prog_attach_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, replace_bpf_fd); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_prog_attach_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.target_fd = target_fd; + attr.attach_bpf_fd = prog_fd; + attr.attach_type = type; + attr.attach_flags = OPTS_GET(opts, flags, 0); + attr.replace_bpf_fd = OPTS_GET(opts, replace_prog_fd, 0); + + ret = sys_bpf(BPF_PROG_ATTACH, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_prog_detach(int target_fd, enum bpf_attach_type type) +{ + const size_t attr_sz = offsetofend(union bpf_attr, replace_bpf_fd); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.target_fd = target_fd; + attr.attach_type = type; + + ret = sys_bpf(BPF_PROG_DETACH, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_prog_detach2(int prog_fd, int target_fd, enum bpf_attach_type type) +{ + const size_t attr_sz = offsetofend(union bpf_attr, replace_bpf_fd); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.target_fd = target_fd; + attr.attach_bpf_fd = prog_fd; + attr.attach_type = type; + + ret = sys_bpf(BPF_PROG_DETACH, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_link_create(int prog_fd, int target_fd, + enum bpf_attach_type attach_type, + const struct bpf_link_create_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, link_create); + __u32 target_btf_id, iter_info_len; + union bpf_attr attr; + int fd, err; + + if (!OPTS_VALID(opts, bpf_link_create_opts)) + return libbpf_err(-EINVAL); + + iter_info_len = OPTS_GET(opts, iter_info_len, 0); + target_btf_id = OPTS_GET(opts, target_btf_id, 0); + + /* validate we don't have unexpected combinations of non-zero fields */ + if (iter_info_len || target_btf_id) { + if (iter_info_len && target_btf_id) + return libbpf_err(-EINVAL); + if (!OPTS_ZEROED(opts, target_btf_id)) + return libbpf_err(-EINVAL); + } + + memset(&attr, 0, attr_sz); + attr.link_create.prog_fd = prog_fd; + attr.link_create.target_fd = target_fd; + attr.link_create.attach_type = attach_type; + attr.link_create.flags = OPTS_GET(opts, flags, 0); + + if (target_btf_id) { + attr.link_create.target_btf_id = target_btf_id; + goto proceed; + } + + switch (attach_type) { + case BPF_TRACE_ITER: + attr.link_create.iter_info = ptr_to_u64(OPTS_GET(opts, iter_info, (void *)0)); + attr.link_create.iter_info_len = iter_info_len; + break; + case BPF_PERF_EVENT: + attr.link_create.perf_event.bpf_cookie = OPTS_GET(opts, perf_event.bpf_cookie, 0); + if (!OPTS_ZEROED(opts, perf_event)) + return libbpf_err(-EINVAL); + break; + case BPF_TRACE_KPROBE_MULTI: + attr.link_create.kprobe_multi.flags = OPTS_GET(opts, kprobe_multi.flags, 0); + attr.link_create.kprobe_multi.cnt = OPTS_GET(opts, kprobe_multi.cnt, 0); + attr.link_create.kprobe_multi.syms = ptr_to_u64(OPTS_GET(opts, kprobe_multi.syms, 0)); + attr.link_create.kprobe_multi.addrs = ptr_to_u64(OPTS_GET(opts, kprobe_multi.addrs, 0)); + attr.link_create.kprobe_multi.cookies = ptr_to_u64(OPTS_GET(opts, kprobe_multi.cookies, 0)); + if (!OPTS_ZEROED(opts, kprobe_multi)) + return libbpf_err(-EINVAL); + break; + case BPF_TRACE_FENTRY: + case BPF_TRACE_FEXIT: + case BPF_MODIFY_RETURN: + case BPF_LSM_MAC: + attr.link_create.tracing.cookie = OPTS_GET(opts, tracing.cookie, 0); + if (!OPTS_ZEROED(opts, tracing)) + return libbpf_err(-EINVAL); + break; + default: + if (!OPTS_ZEROED(opts, flags)) + return libbpf_err(-EINVAL); + break; + } +proceed: + fd = sys_bpf_fd(BPF_LINK_CREATE, &attr, attr_sz); + if (fd >= 0) + return fd; + /* we'll get EINVAL if LINK_CREATE doesn't support attaching fentry + * and other similar programs + */ + err = -errno; + if (err != -EINVAL) + return libbpf_err(err); + + /* if user used features not supported by + * BPF_RAW_TRACEPOINT_OPEN command, then just give up immediately + */ + if (attr.link_create.target_fd || attr.link_create.target_btf_id) + return libbpf_err(err); + if (!OPTS_ZEROED(opts, sz)) + return libbpf_err(err); + + /* otherwise, for few select kinds of programs that can be + * attached using BPF_RAW_TRACEPOINT_OPEN command, try that as + * a fallback for older kernels + */ + switch (attach_type) { + case BPF_TRACE_RAW_TP: + case BPF_LSM_MAC: + case BPF_TRACE_FENTRY: + case BPF_TRACE_FEXIT: + case BPF_MODIFY_RETURN: + return bpf_raw_tracepoint_open(NULL, prog_fd); + default: + return libbpf_err(err); + } +} + +int bpf_link_detach(int link_fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, link_detach); + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.link_detach.link_fd = link_fd; + + ret = sys_bpf(BPF_LINK_DETACH, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_link_update(int link_fd, int new_prog_fd, + const struct bpf_link_update_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, link_update); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_link_update_opts)) + return libbpf_err(-EINVAL); + + if (OPTS_GET(opts, old_prog_fd, 0) && OPTS_GET(opts, old_map_fd, 0)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.link_update.link_fd = link_fd; + attr.link_update.new_prog_fd = new_prog_fd; + attr.link_update.flags = OPTS_GET(opts, flags, 0); + if (OPTS_GET(opts, old_prog_fd, 0)) + attr.link_update.old_prog_fd = OPTS_GET(opts, old_prog_fd, 0); + else if (OPTS_GET(opts, old_map_fd, 0)) + attr.link_update.old_map_fd = OPTS_GET(opts, old_map_fd, 0); + + ret = sys_bpf(BPF_LINK_UPDATE, &attr, attr_sz); + return libbpf_err_errno(ret); +} + +int bpf_iter_create(int link_fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, iter_create); + union bpf_attr attr; + int fd; + + memset(&attr, 0, attr_sz); + attr.iter_create.link_fd = link_fd; + + fd = sys_bpf_fd(BPF_ITER_CREATE, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_prog_query_opts(int target_fd, + enum bpf_attach_type type, + struct bpf_prog_query_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, query); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_prog_query_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + + attr.query.target_fd = target_fd; + attr.query.attach_type = type; + attr.query.query_flags = OPTS_GET(opts, query_flags, 0); + attr.query.prog_cnt = OPTS_GET(opts, prog_cnt, 0); + attr.query.prog_ids = ptr_to_u64(OPTS_GET(opts, prog_ids, NULL)); + attr.query.prog_attach_flags = ptr_to_u64(OPTS_GET(opts, prog_attach_flags, NULL)); + + ret = sys_bpf(BPF_PROG_QUERY, &attr, attr_sz); + + OPTS_SET(opts, attach_flags, attr.query.attach_flags); + OPTS_SET(opts, prog_cnt, attr.query.prog_cnt); + + return libbpf_err_errno(ret); +} + +int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags, + __u32 *attach_flags, __u32 *prog_ids, __u32 *prog_cnt) +{ + LIBBPF_OPTS(bpf_prog_query_opts, opts); + int ret; + + opts.query_flags = query_flags; + opts.prog_ids = prog_ids; + opts.prog_cnt = *prog_cnt; + + ret = bpf_prog_query_opts(target_fd, type, &opts); + + if (attach_flags) + *attach_flags = opts.attach_flags; + *prog_cnt = opts.prog_cnt; + + return libbpf_err_errno(ret); +} + +int bpf_prog_test_run_opts(int prog_fd, struct bpf_test_run_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, test); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_test_run_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.test.prog_fd = prog_fd; + attr.test.batch_size = OPTS_GET(opts, batch_size, 0); + attr.test.cpu = OPTS_GET(opts, cpu, 0); + attr.test.flags = OPTS_GET(opts, flags, 0); + attr.test.repeat = OPTS_GET(opts, repeat, 0); + attr.test.duration = OPTS_GET(opts, duration, 0); + attr.test.ctx_size_in = OPTS_GET(opts, ctx_size_in, 0); + attr.test.ctx_size_out = OPTS_GET(opts, ctx_size_out, 0); + attr.test.data_size_in = OPTS_GET(opts, data_size_in, 0); + attr.test.data_size_out = OPTS_GET(opts, data_size_out, 0); + attr.test.ctx_in = ptr_to_u64(OPTS_GET(opts, ctx_in, NULL)); + attr.test.ctx_out = ptr_to_u64(OPTS_GET(opts, ctx_out, NULL)); + attr.test.data_in = ptr_to_u64(OPTS_GET(opts, data_in, NULL)); + attr.test.data_out = ptr_to_u64(OPTS_GET(opts, data_out, NULL)); + + ret = sys_bpf(BPF_PROG_TEST_RUN, &attr, attr_sz); + + OPTS_SET(opts, data_size_out, attr.test.data_size_out); + OPTS_SET(opts, ctx_size_out, attr.test.ctx_size_out); + OPTS_SET(opts, duration, attr.test.duration); + OPTS_SET(opts, retval, attr.test.retval); + + return libbpf_err_errno(ret); +} + +static int bpf_obj_get_next_id(__u32 start_id, __u32 *next_id, int cmd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int err; + + memset(&attr, 0, attr_sz); + attr.start_id = start_id; + + err = sys_bpf(cmd, &attr, attr_sz); + if (!err) + *next_id = attr.next_id; + + return libbpf_err_errno(err); +} + +int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id) +{ + return bpf_obj_get_next_id(start_id, next_id, BPF_PROG_GET_NEXT_ID); +} + +int bpf_map_get_next_id(__u32 start_id, __u32 *next_id) +{ + return bpf_obj_get_next_id(start_id, next_id, BPF_MAP_GET_NEXT_ID); +} + +int bpf_btf_get_next_id(__u32 start_id, __u32 *next_id) +{ + return bpf_obj_get_next_id(start_id, next_id, BPF_BTF_GET_NEXT_ID); +} + +int bpf_link_get_next_id(__u32 start_id, __u32 *next_id) +{ + return bpf_obj_get_next_id(start_id, next_id, BPF_LINK_GET_NEXT_ID); +} + +int bpf_prog_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_get_fd_by_id_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.prog_id = id; + attr.open_flags = OPTS_GET(opts, open_flags, 0); + + fd = sys_bpf_fd(BPF_PROG_GET_FD_BY_ID, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_prog_get_fd_by_id(__u32 id) +{ + return bpf_prog_get_fd_by_id_opts(id, NULL); +} + +int bpf_map_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_get_fd_by_id_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.map_id = id; + attr.open_flags = OPTS_GET(opts, open_flags, 0); + + fd = sys_bpf_fd(BPF_MAP_GET_FD_BY_ID, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_map_get_fd_by_id(__u32 id) +{ + return bpf_map_get_fd_by_id_opts(id, NULL); +} + +int bpf_btf_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_get_fd_by_id_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.btf_id = id; + attr.open_flags = OPTS_GET(opts, open_flags, 0); + + fd = sys_bpf_fd(BPF_BTF_GET_FD_BY_ID, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_btf_get_fd_by_id(__u32 id) +{ + return bpf_btf_get_fd_by_id_opts(id, NULL); +} + +int bpf_link_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, open_flags); + union bpf_attr attr; + int fd; + + if (!OPTS_VALID(opts, bpf_get_fd_by_id_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.link_id = id; + attr.open_flags = OPTS_GET(opts, open_flags, 0); + + fd = sys_bpf_fd(BPF_LINK_GET_FD_BY_ID, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_link_get_fd_by_id(__u32 id) +{ + return bpf_link_get_fd_by_id_opts(id, NULL); +} + +int bpf_obj_get_info_by_fd(int bpf_fd, void *info, __u32 *info_len) +{ + const size_t attr_sz = offsetofend(union bpf_attr, info); + union bpf_attr attr; + int err; + + memset(&attr, 0, attr_sz); + attr.info.bpf_fd = bpf_fd; + attr.info.info_len = *info_len; + attr.info.info = ptr_to_u64(info); + + err = sys_bpf(BPF_OBJ_GET_INFO_BY_FD, &attr, attr_sz); + if (!err) + *info_len = attr.info.info_len; + return libbpf_err_errno(err); +} + +int bpf_prog_get_info_by_fd(int prog_fd, struct bpf_prog_info *info, __u32 *info_len) +{ + return bpf_obj_get_info_by_fd(prog_fd, info, info_len); +} + +int bpf_map_get_info_by_fd(int map_fd, struct bpf_map_info *info, __u32 *info_len) +{ + return bpf_obj_get_info_by_fd(map_fd, info, info_len); +} + +int bpf_btf_get_info_by_fd(int btf_fd, struct bpf_btf_info *info, __u32 *info_len) +{ + return bpf_obj_get_info_by_fd(btf_fd, info, info_len); +} + +int bpf_link_get_info_by_fd(int link_fd, struct bpf_link_info *info, __u32 *info_len) +{ + return bpf_obj_get_info_by_fd(link_fd, info, info_len); +} + +int bpf_raw_tracepoint_open(const char *name, int prog_fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, raw_tracepoint); + union bpf_attr attr; + int fd; + + memset(&attr, 0, attr_sz); + attr.raw_tracepoint.name = ptr_to_u64(name); + attr.raw_tracepoint.prog_fd = prog_fd; + + fd = sys_bpf_fd(BPF_RAW_TRACEPOINT_OPEN, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_btf_load(const void *btf_data, size_t btf_size, const struct bpf_btf_load_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, btf_log_level); + union bpf_attr attr; + char *log_buf; + size_t log_size; + __u32 log_level; + int fd; + + bump_rlimit_memlock(); + + memset(&attr, 0, attr_sz); + + if (!OPTS_VALID(opts, bpf_btf_load_opts)) + return libbpf_err(-EINVAL); + + log_buf = OPTS_GET(opts, log_buf, NULL); + log_size = OPTS_GET(opts, log_size, 0); + log_level = OPTS_GET(opts, log_level, 0); + + if (log_size > UINT_MAX) + return libbpf_err(-EINVAL); + if (log_size && !log_buf) + return libbpf_err(-EINVAL); + + attr.btf = ptr_to_u64(btf_data); + attr.btf_size = btf_size; + /* log_level == 0 and log_buf != NULL means "try loading without + * log_buf, but retry with log_buf and log_level=1 on error", which is + * consistent across low-level and high-level BTF and program loading + * APIs within libbpf and provides a sensible behavior in practice + */ + if (log_level) { + attr.btf_log_buf = ptr_to_u64(log_buf); + attr.btf_log_size = (__u32)log_size; + attr.btf_log_level = log_level; + } + + fd = sys_bpf_fd(BPF_BTF_LOAD, &attr, attr_sz); + if (fd < 0 && log_buf && log_level == 0) { + attr.btf_log_buf = ptr_to_u64(log_buf); + attr.btf_log_size = (__u32)log_size; + attr.btf_log_level = 1; + fd = sys_bpf_fd(BPF_BTF_LOAD, &attr, attr_sz); + } + return libbpf_err_errno(fd); +} + +int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, __u32 *buf_len, + __u32 *prog_id, __u32 *fd_type, __u64 *probe_offset, + __u64 *probe_addr) +{ + const size_t attr_sz = offsetofend(union bpf_attr, task_fd_query); + union bpf_attr attr; + int err; + + memset(&attr, 0, attr_sz); + attr.task_fd_query.pid = pid; + attr.task_fd_query.fd = fd; + attr.task_fd_query.flags = flags; + attr.task_fd_query.buf = ptr_to_u64(buf); + attr.task_fd_query.buf_len = *buf_len; + + err = sys_bpf(BPF_TASK_FD_QUERY, &attr, attr_sz); + + *buf_len = attr.task_fd_query.buf_len; + *prog_id = attr.task_fd_query.prog_id; + *fd_type = attr.task_fd_query.fd_type; + *probe_offset = attr.task_fd_query.probe_offset; + *probe_addr = attr.task_fd_query.probe_addr; + + return libbpf_err_errno(err); +} + +int bpf_enable_stats(enum bpf_stats_type type) +{ + const size_t attr_sz = offsetofend(union bpf_attr, enable_stats); + union bpf_attr attr; + int fd; + + memset(&attr, 0, attr_sz); + attr.enable_stats.type = type; + + fd = sys_bpf_fd(BPF_ENABLE_STATS, &attr, attr_sz); + return libbpf_err_errno(fd); +} + +int bpf_prog_bind_map(int prog_fd, int map_fd, + const struct bpf_prog_bind_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, prog_bind_map); + union bpf_attr attr; + int ret; + + if (!OPTS_VALID(opts, bpf_prog_bind_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.prog_bind_map.prog_fd = prog_fd; + attr.prog_bind_map.map_fd = map_fd; + attr.prog_bind_map.flags = OPTS_GET(opts, flags, 0); + + ret = sys_bpf(BPF_PROG_BIND_MAP, &attr, attr_sz); + return libbpf_err_errno(ret); +} diff --git a/libbpf/src/bpf.h b/libbpf/src/bpf.h new file mode 100644 index 0000000..b073e73 --- /dev/null +++ b/libbpf/src/bpf.h @@ -0,0 +1,530 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Common BPF ELF operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License (not later!) + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see + */ +#ifndef __LIBBPF_BPF_H +#define __LIBBPF_BPF_H + +#include +#include +#include +#include + +#include "libbpf_common.h" +#include "libbpf_legacy.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int libbpf_set_memlock_rlim(size_t memlock_bytes); + +struct bpf_map_create_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + __u32 btf_fd; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + + __u32 inner_map_fd; + __u32 map_flags; + __u64 map_extra; + + __u32 numa_node; + __u32 map_ifindex; +}; +#define bpf_map_create_opts__last_field map_ifindex + +LIBBPF_API int bpf_map_create(enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, + __u32 value_size, + __u32 max_entries, + const struct bpf_map_create_opts *opts); + +struct bpf_prog_load_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + /* libbpf can retry BPF_PROG_LOAD command if bpf() syscall returns + * -EAGAIN. This field determines how many attempts libbpf has to + * make. If not specified, libbpf will use default value of 5. + */ + int attempts; + + enum bpf_attach_type expected_attach_type; + __u32 prog_btf_fd; + __u32 prog_flags; + __u32 prog_ifindex; + __u32 kern_version; + + __u32 attach_btf_id; + __u32 attach_prog_fd; + __u32 attach_btf_obj_fd; + + const int *fd_array; + + /* .BTF.ext func info data */ + const void *func_info; + __u32 func_info_cnt; + __u32 func_info_rec_size; + + /* .BTF.ext line info data */ + const void *line_info; + __u32 line_info_cnt; + __u32 line_info_rec_size; + + /* verifier log options */ + __u32 log_level; + __u32 log_size; + char *log_buf; +}; +#define bpf_prog_load_opts__last_field log_buf + +LIBBPF_API int bpf_prog_load(enum bpf_prog_type prog_type, + const char *prog_name, const char *license, + const struct bpf_insn *insns, size_t insn_cnt, + const struct bpf_prog_load_opts *opts); + +/* Flags to direct loading requirements */ +#define MAPS_RELAX_COMPAT 0x01 + +/* Recommended log buffer size */ +#define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */ + +struct bpf_btf_load_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + /* kernel log options */ + char *log_buf; + __u32 log_level; + __u32 log_size; +}; +#define bpf_btf_load_opts__last_field log_size + +LIBBPF_API int bpf_btf_load(const void *btf_data, size_t btf_size, + const struct bpf_btf_load_opts *opts); + +LIBBPF_API int bpf_map_update_elem(int fd, const void *key, const void *value, + __u64 flags); + +LIBBPF_API int bpf_map_lookup_elem(int fd, const void *key, void *value); +LIBBPF_API int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, + __u64 flags); +LIBBPF_API int bpf_map_lookup_and_delete_elem(int fd, const void *key, + void *value); +LIBBPF_API int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, + void *value, __u64 flags); +LIBBPF_API int bpf_map_delete_elem(int fd, const void *key); +LIBBPF_API int bpf_map_delete_elem_flags(int fd, const void *key, __u64 flags); +LIBBPF_API int bpf_map_get_next_key(int fd, const void *key, void *next_key); +LIBBPF_API int bpf_map_freeze(int fd); + +struct bpf_map_batch_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u64 elem_flags; + __u64 flags; +}; +#define bpf_map_batch_opts__last_field flags + + +/** + * @brief **bpf_map_delete_batch()** allows for batch deletion of multiple + * elements in a BPF map. + * + * @param fd BPF map file descriptor + * @param keys pointer to an array of *count* keys + * @param count input and output parameter; on input **count** represents the + * number of elements in the map to delete in batch; + * on output if a non-EFAULT error is returned, **count** represents the number of deleted + * elements if the output **count** value is not equal to the input **count** value + * If EFAULT is returned, **count** should not be trusted to be correct. + * @param opts options for configuring the way the batch deletion works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_delete_batch(int fd, const void *keys, + __u32 *count, + const struct bpf_map_batch_opts *opts); + +/** + * @brief **bpf_map_lookup_batch()** allows for batch lookup of BPF map elements. + * + * The parameter *in_batch* is the address of the first element in the batch to read. + * *out_batch* is an output parameter that should be passed as *in_batch* to subsequent + * calls to **bpf_map_lookup_batch()**. NULL can be passed for *in_batch* to indicate + * that the batched lookup starts from the beginning of the map. + * + * The *keys* and *values* are output parameters which must point to memory large enough to + * hold *count* items based on the key and value size of the map *map_fd*. The *keys* + * buffer must be of *key_size* * *count*. The *values* buffer must be of + * *value_size* * *count*. + * + * @param fd BPF map file descriptor + * @param in_batch address of the first element in batch to read, can pass NULL to + * indicate that the batched lookup starts from the beginning of the map. + * @param out_batch output parameter that should be passed to next call as *in_batch* + * @param keys pointer to an array large enough for *count* keys + * @param values pointer to an array large enough for *count* values + * @param count input and output parameter; on input it's the number of elements + * in the map to read in batch; on output it's the number of elements that were + * successfully read. + * If a non-EFAULT error is returned, count will be set as the number of elements + * that were read before the error occurred. + * If EFAULT is returned, **count** should not be trusted to be correct. + * @param opts options for configuring the way the batch lookup works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_lookup_batch(int fd, void *in_batch, void *out_batch, + void *keys, void *values, __u32 *count, + const struct bpf_map_batch_opts *opts); + +/** + * @brief **bpf_map_lookup_and_delete_batch()** allows for batch lookup and deletion + * of BPF map elements where each element is deleted after being retrieved. + * + * @param fd BPF map file descriptor + * @param in_batch address of the first element in batch to read, can pass NULL to + * get address of the first element in *out_batch* + * @param out_batch output parameter that should be passed to next call as *in_batch* + * @param keys pointer to an array of *count* keys + * @param values pointer to an array large enough for *count* values + * @param count input and output parameter; on input it's the number of elements + * in the map to read and delete in batch; on output it represents the number of + * elements that were successfully read and deleted + * If a non-**EFAULT** error code is returned and if the output **count** value + * is not equal to the input **count** value, up to **count** elements may + * have been deleted. + * if **EFAULT** is returned up to *count* elements may have been deleted without + * being returned via the *keys* and *values* output parameters. + * @param opts options for configuring the way the batch lookup and delete works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, + void *out_batch, void *keys, + void *values, __u32 *count, + const struct bpf_map_batch_opts *opts); + +/** + * @brief **bpf_map_update_batch()** updates multiple elements in a map + * by specifying keys and their corresponding values. + * + * The *keys* and *values* parameters must point to memory large enough + * to hold *count* items based on the key and value size of the map. + * + * The *opts* parameter can be used to control how *bpf_map_update_batch()* + * should handle keys that either do or do not already exist in the map. + * In particular the *flags* parameter of *bpf_map_batch_opts* can be + * one of the following: + * + * Note that *count* is an input and output parameter, where on output it + * represents how many elements were successfully updated. Also note that if + * **EFAULT** then *count* should not be trusted to be correct. + * + * **BPF_ANY** + * Create new elements or update existing. + * + * **BPF_NOEXIST** + * Create new elements only if they do not exist. + * + * **BPF_EXIST** + * Update existing elements. + * + * **BPF_F_LOCK** + * Update spin_lock-ed map elements. This must be + * specified if the map value contains a spinlock. + * + * @param fd BPF map file descriptor + * @param keys pointer to an array of *count* keys + * @param values pointer to an array of *count* values + * @param count input and output parameter; on input it's the number of elements + * in the map to update in batch; on output if a non-EFAULT error is returned, + * **count** represents the number of updated elements if the output **count** + * value is not equal to the input **count** value. + * If EFAULT is returned, **count** should not be trusted to be correct. + * @param opts options for configuring the way the batch update works + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_update_batch(int fd, const void *keys, const void *values, + __u32 *count, + const struct bpf_map_batch_opts *opts); + +struct bpf_obj_get_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + __u32 file_flags; + + size_t :0; +}; +#define bpf_obj_get_opts__last_field file_flags + +LIBBPF_API int bpf_obj_pin(int fd, const char *pathname); +LIBBPF_API int bpf_obj_get(const char *pathname); +LIBBPF_API int bpf_obj_get_opts(const char *pathname, + const struct bpf_obj_get_opts *opts); + +struct bpf_prog_attach_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + unsigned int flags; + int replace_prog_fd; +}; +#define bpf_prog_attach_opts__last_field replace_prog_fd + +LIBBPF_API int bpf_prog_attach(int prog_fd, int attachable_fd, + enum bpf_attach_type type, unsigned int flags); +LIBBPF_API int bpf_prog_attach_opts(int prog_fd, int attachable_fd, + enum bpf_attach_type type, + const struct bpf_prog_attach_opts *opts); +LIBBPF_API int bpf_prog_detach(int attachable_fd, enum bpf_attach_type type); +LIBBPF_API int bpf_prog_detach2(int prog_fd, int attachable_fd, + enum bpf_attach_type type); + +union bpf_iter_link_info; /* defined in up-to-date linux/bpf.h */ +struct bpf_link_create_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 flags; + union bpf_iter_link_info *iter_info; + __u32 iter_info_len; + __u32 target_btf_id; + union { + struct { + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + const char **syms; + const unsigned long *addrs; + const __u64 *cookies; + } kprobe_multi; + struct { + __u64 cookie; + } tracing; + }; + size_t :0; +}; +#define bpf_link_create_opts__last_field kprobe_multi.cookies + +LIBBPF_API int bpf_link_create(int prog_fd, int target_fd, + enum bpf_attach_type attach_type, + const struct bpf_link_create_opts *opts); + +LIBBPF_API int bpf_link_detach(int link_fd); + +struct bpf_link_update_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 flags; /* extra flags */ + __u32 old_prog_fd; /* expected old program FD */ + __u32 old_map_fd; /* expected old map FD */ +}; +#define bpf_link_update_opts__last_field old_map_fd + +LIBBPF_API int bpf_link_update(int link_fd, int new_prog_fd, + const struct bpf_link_update_opts *opts); + +LIBBPF_API int bpf_iter_create(int link_fd); + +struct bpf_prog_test_run_attr { + int prog_fd; + int repeat; + const void *data_in; + __u32 data_size_in; + void *data_out; /* optional */ + __u32 data_size_out; /* in: max length of data_out + * out: length of data_out */ + __u32 retval; /* out: return code of the BPF program */ + __u32 duration; /* out: average per repetition in ns */ + const void *ctx_in; /* optional */ + __u32 ctx_size_in; + void *ctx_out; /* optional */ + __u32 ctx_size_out; /* in: max length of ctx_out + * out: length of cxt_out */ +}; + +LIBBPF_API int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id); +LIBBPF_API int bpf_map_get_next_id(__u32 start_id, __u32 *next_id); +LIBBPF_API int bpf_btf_get_next_id(__u32 start_id, __u32 *next_id); +LIBBPF_API int bpf_link_get_next_id(__u32 start_id, __u32 *next_id); + +struct bpf_get_fd_by_id_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 open_flags; /* permissions requested for the operation on fd */ + size_t :0; +}; +#define bpf_get_fd_by_id_opts__last_field open_flags + +LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_prog_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_map_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_map_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_btf_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_btf_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_link_get_fd_by_id(__u32 id); +LIBBPF_API int bpf_link_get_fd_by_id_opts(__u32 id, + const struct bpf_get_fd_by_id_opts *opts); +LIBBPF_API int bpf_obj_get_info_by_fd(int bpf_fd, void *info, __u32 *info_len); + +/** + * @brief **bpf_prog_get_info_by_fd()** obtains information about the BPF + * program corresponding to *prog_fd*. + * + * Populates up to *info_len* bytes of *info* and updates *info_len* with the + * actual number of bytes written to *info*. + * + * @param prog_fd BPF program file descriptor + * @param info pointer to **struct bpf_prog_info** that will be populated with + * BPF program information + * @param info_len pointer to the size of *info*; on success updated with the + * number of bytes written to *info* + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_prog_get_info_by_fd(int prog_fd, struct bpf_prog_info *info, __u32 *info_len); + +/** + * @brief **bpf_map_get_info_by_fd()** obtains information about the BPF + * map corresponding to *map_fd*. + * + * Populates up to *info_len* bytes of *info* and updates *info_len* with the + * actual number of bytes written to *info*. + * + * @param map_fd BPF map file descriptor + * @param info pointer to **struct bpf_map_info** that will be populated with + * BPF map information + * @param info_len pointer to the size of *info*; on success updated with the + * number of bytes written to *info* + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_map_get_info_by_fd(int map_fd, struct bpf_map_info *info, __u32 *info_len); + +/** + * @brief **bpf_btf_get_info_by_fd()** obtains information about the + * BTF object corresponding to *btf_fd*. + * + * Populates up to *info_len* bytes of *info* and updates *info_len* with the + * actual number of bytes written to *info*. + * + * @param btf_fd BTF object file descriptor + * @param info pointer to **struct bpf_btf_info** that will be populated with + * BTF object information + * @param info_len pointer to the size of *info*; on success updated with the + * number of bytes written to *info* + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_btf_get_info_by_fd(int btf_fd, struct bpf_btf_info *info, __u32 *info_len); + +/** + * @brief **bpf_btf_get_info_by_fd()** obtains information about the BPF + * link corresponding to *link_fd*. + * + * Populates up to *info_len* bytes of *info* and updates *info_len* with the + * actual number of bytes written to *info*. + * + * @param link_fd BPF link file descriptor + * @param info pointer to **struct bpf_link_info** that will be populated with + * BPF link information + * @param info_len pointer to the size of *info*; on success updated with the + * number of bytes written to *info* + * @return 0, on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_link_get_info_by_fd(int link_fd, struct bpf_link_info *info, __u32 *info_len); + +struct bpf_prog_query_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 query_flags; + __u32 attach_flags; /* output argument */ + __u32 *prog_ids; + __u32 prog_cnt; /* input+output argument */ + __u32 *prog_attach_flags; +}; +#define bpf_prog_query_opts__last_field prog_attach_flags + +LIBBPF_API int bpf_prog_query_opts(int target_fd, + enum bpf_attach_type type, + struct bpf_prog_query_opts *opts); +LIBBPF_API int bpf_prog_query(int target_fd, enum bpf_attach_type type, + __u32 query_flags, __u32 *attach_flags, + __u32 *prog_ids, __u32 *prog_cnt); + +LIBBPF_API int bpf_raw_tracepoint_open(const char *name, int prog_fd); +LIBBPF_API int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, + __u32 *buf_len, __u32 *prog_id, __u32 *fd_type, + __u64 *probe_offset, __u64 *probe_addr); + +#ifdef __cplusplus +/* forward-declaring enums in C++ isn't compatible with pure C enums, so + * instead define bpf_enable_stats() as accepting int as an input + */ +LIBBPF_API int bpf_enable_stats(int type); +#else +enum bpf_stats_type; /* defined in up-to-date linux/bpf.h */ +LIBBPF_API int bpf_enable_stats(enum bpf_stats_type type); +#endif + +struct bpf_prog_bind_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + __u32 flags; +}; +#define bpf_prog_bind_opts__last_field flags + +LIBBPF_API int bpf_prog_bind_map(int prog_fd, int map_fd, + const struct bpf_prog_bind_opts *opts); + +struct bpf_test_run_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + const void *data_in; /* optional */ + void *data_out; /* optional */ + __u32 data_size_in; + __u32 data_size_out; /* in: max length of data_out + * out: length of data_out + */ + const void *ctx_in; /* optional */ + void *ctx_out; /* optional */ + __u32 ctx_size_in; + __u32 ctx_size_out; /* in: max length of ctx_out + * out: length of cxt_out + */ + __u32 retval; /* out: return code of the BPF program */ + int repeat; + __u32 duration; /* out: average per repetition in ns */ + __u32 flags; + __u32 cpu; + __u32 batch_size; +}; +#define bpf_test_run_opts__last_field batch_size + +LIBBPF_API int bpf_prog_test_run_opts(int prog_fd, + struct bpf_test_run_opts *opts); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_BPF_H */ diff --git a/libbpf/src/bpf_core_read.h b/libbpf/src/bpf_core_read.h new file mode 100644 index 0000000..1ac57bb --- /dev/null +++ b/libbpf/src/bpf_core_read.h @@ -0,0 +1,484 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_CORE_READ_H__ +#define __BPF_CORE_READ_H__ + +/* + * enum bpf_field_info_kind is passed as a second argument into + * __builtin_preserve_field_info() built-in to get a specific aspect of + * a field, captured as a first argument. __builtin_preserve_field_info(field, + * info_kind) returns __u32 integer and produces BTF field relocation, which + * is understood and processed by libbpf during BPF object loading. See + * selftests/bpf for examples. + */ +enum bpf_field_info_kind { + BPF_FIELD_BYTE_OFFSET = 0, /* field byte offset */ + BPF_FIELD_BYTE_SIZE = 1, + BPF_FIELD_EXISTS = 2, /* field existence in target kernel */ + BPF_FIELD_SIGNED = 3, + BPF_FIELD_LSHIFT_U64 = 4, + BPF_FIELD_RSHIFT_U64 = 5, +}; + +/* second argument to __builtin_btf_type_id() built-in */ +enum bpf_type_id_kind { + BPF_TYPE_ID_LOCAL = 0, /* BTF type ID in local program */ + BPF_TYPE_ID_TARGET = 1, /* BTF type ID in target kernel */ +}; + +/* second argument to __builtin_preserve_type_info() built-in */ +enum bpf_type_info_kind { + BPF_TYPE_EXISTS = 0, /* type existence in target kernel */ + BPF_TYPE_SIZE = 1, /* type size in target kernel */ + BPF_TYPE_MATCHES = 2, /* type match in target kernel */ +}; + +/* second argument to __builtin_preserve_enum_value() built-in */ +enum bpf_enum_value_kind { + BPF_ENUMVAL_EXISTS = 0, /* enum value existence in kernel */ + BPF_ENUMVAL_VALUE = 1, /* enum value value relocation */ +}; + +#define __CORE_RELO(src, field, info) \ + __builtin_preserve_field_info((src)->field, BPF_FIELD_##info) + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define __CORE_BITFIELD_PROBE_READ(dst, src, fld) \ + bpf_probe_read_kernel( \ + (void *)dst, \ + __CORE_RELO(src, fld, BYTE_SIZE), \ + (const void *)src + __CORE_RELO(src, fld, BYTE_OFFSET)) +#else +/* semantics of LSHIFT_64 assumes loading values into low-ordered bytes, so + * for big-endian we need to adjust destination pointer accordingly, based on + * field byte size + */ +#define __CORE_BITFIELD_PROBE_READ(dst, src, fld) \ + bpf_probe_read_kernel( \ + (void *)dst + (8 - __CORE_RELO(src, fld, BYTE_SIZE)), \ + __CORE_RELO(src, fld, BYTE_SIZE), \ + (const void *)src + __CORE_RELO(src, fld, BYTE_OFFSET)) +#endif + +/* + * Extract bitfield, identified by s->field, and return its value as u64. + * All this is done in relocatable manner, so bitfield changes such as + * signedness, bit size, offset changes, this will be handled automatically. + * This version of macro is using bpf_probe_read_kernel() to read underlying + * integer storage. Macro functions as an expression and its return type is + * bpf_probe_read_kernel()'s return value: 0, on success, <0 on error. + */ +#define BPF_CORE_READ_BITFIELD_PROBED(s, field) ({ \ + unsigned long long val = 0; \ + \ + __CORE_BITFIELD_PROBE_READ(&val, s, field); \ + val <<= __CORE_RELO(s, field, LSHIFT_U64); \ + if (__CORE_RELO(s, field, SIGNED)) \ + val = ((long long)val) >> __CORE_RELO(s, field, RSHIFT_U64); \ + else \ + val = val >> __CORE_RELO(s, field, RSHIFT_U64); \ + val; \ +}) + +/* + * Extract bitfield, identified by s->field, and return its value as u64. + * This version of macro is using direct memory reads and should be used from + * BPF program types that support such functionality (e.g., typed raw + * tracepoints). + */ +#define BPF_CORE_READ_BITFIELD(s, field) ({ \ + const void *p = (const void *)s + __CORE_RELO(s, field, BYTE_OFFSET); \ + unsigned long long val; \ + \ + /* This is a so-called barrier_var() operation that makes specified \ + * variable "a black box" for optimizing compiler. \ + * It forces compiler to perform BYTE_OFFSET relocation on p and use \ + * its calculated value in the switch below, instead of applying \ + * the same relocation 4 times for each individual memory load. \ + */ \ + asm volatile("" : "=r"(p) : "0"(p)); \ + \ + switch (__CORE_RELO(s, field, BYTE_SIZE)) { \ + case 1: val = *(const unsigned char *)p; break; \ + case 2: val = *(const unsigned short *)p; break; \ + case 4: val = *(const unsigned int *)p; break; \ + case 8: val = *(const unsigned long long *)p; break; \ + } \ + val <<= __CORE_RELO(s, field, LSHIFT_U64); \ + if (__CORE_RELO(s, field, SIGNED)) \ + val = ((long long)val) >> __CORE_RELO(s, field, RSHIFT_U64); \ + else \ + val = val >> __CORE_RELO(s, field, RSHIFT_U64); \ + val; \ +}) + +#define ___bpf_field_ref1(field) (field) +#define ___bpf_field_ref2(type, field) (((typeof(type) *)0)->field) +#define ___bpf_field_ref(args...) \ + ___bpf_apply(___bpf_field_ref, ___bpf_narg(args))(args) + +/* + * Convenience macro to check that field actually exists in target kernel's. + * Returns: + * 1, if matching field is present in target kernel; + * 0, if no matching field found. + * + * Supports two forms: + * - field reference through variable access: + * bpf_core_field_exists(p->my_field); + * - field reference through type and field names: + * bpf_core_field_exists(struct my_type, my_field). + */ +#define bpf_core_field_exists(field...) \ + __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_EXISTS) + +/* + * Convenience macro to get the byte size of a field. Works for integers, + * struct/unions, pointers, arrays, and enums. + * + * Supports two forms: + * - field reference through variable access: + * bpf_core_field_size(p->my_field); + * - field reference through type and field names: + * bpf_core_field_size(struct my_type, my_field). + */ +#define bpf_core_field_size(field...) \ + __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_BYTE_SIZE) + +/* + * Convenience macro to get field's byte offset. + * + * Supports two forms: + * - field reference through variable access: + * bpf_core_field_offset(p->my_field); + * - field reference through type and field names: + * bpf_core_field_offset(struct my_type, my_field). + */ +#define bpf_core_field_offset(field...) \ + __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_BYTE_OFFSET) + +/* + * Convenience macro to get BTF type ID of a specified type, using a local BTF + * information. Return 32-bit unsigned integer with type ID from program's own + * BTF. Always succeeds. + */ +#define bpf_core_type_id_local(type) \ + __builtin_btf_type_id(*(typeof(type) *)0, BPF_TYPE_ID_LOCAL) + +/* + * Convenience macro to get BTF type ID of a target kernel's type that matches + * specified local type. + * Returns: + * - valid 32-bit unsigned type ID in kernel BTF; + * - 0, if no matching type was found in a target kernel BTF. + */ +#define bpf_core_type_id_kernel(type) \ + __builtin_btf_type_id(*(typeof(type) *)0, BPF_TYPE_ID_TARGET) + +/* + * Convenience macro to check that provided named type + * (struct/union/enum/typedef) exists in a target kernel. + * Returns: + * 1, if such type is present in target kernel's BTF; + * 0, if no matching type is found. + */ +#define bpf_core_type_exists(type) \ + __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_EXISTS) + +/* + * Convenience macro to check that provided named type + * (struct/union/enum/typedef) "matches" that in a target kernel. + * Returns: + * 1, if the type matches in the target kernel's BTF; + * 0, if the type does not match any in the target kernel + */ +#define bpf_core_type_matches(type) \ + __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_MATCHES) + +/* + * Convenience macro to get the byte size of a provided named type + * (struct/union/enum/typedef) in a target kernel. + * Returns: + * >= 0 size (in bytes), if type is present in target kernel's BTF; + * 0, if no matching type is found. + */ +#define bpf_core_type_size(type) \ + __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_SIZE) + +/* + * Convenience macro to check that provided enumerator value is defined in + * a target kernel. + * Returns: + * 1, if specified enum type and its enumerator value are present in target + * kernel's BTF; + * 0, if no matching enum and/or enum value within that enum is found. + */ +#define bpf_core_enum_value_exists(enum_type, enum_value) \ + __builtin_preserve_enum_value(*(typeof(enum_type) *)enum_value, BPF_ENUMVAL_EXISTS) + +/* + * Convenience macro to get the integer value of an enumerator value in + * a target kernel. + * Returns: + * 64-bit value, if specified enum type and its enumerator value are + * present in target kernel's BTF; + * 0, if no matching enum and/or enum value within that enum is found. + */ +#define bpf_core_enum_value(enum_type, enum_value) \ + __builtin_preserve_enum_value(*(typeof(enum_type) *)enum_value, BPF_ENUMVAL_VALUE) + +/* + * bpf_core_read() abstracts away bpf_probe_read_kernel() call and captures + * offset relocation for source address using __builtin_preserve_access_index() + * built-in, provided by Clang. + * + * __builtin_preserve_access_index() takes as an argument an expression of + * taking an address of a field within struct/union. It makes compiler emit + * a relocation, which records BTF type ID describing root struct/union and an + * accessor string which describes exact embedded field that was used to take + * an address. See detailed description of this relocation format and + * semantics in comments to struct bpf_field_reloc in libbpf_internal.h. + * + * This relocation allows libbpf to adjust BPF instruction to use correct + * actual field offset, based on target kernel BTF type that matches original + * (local) BTF, used to record relocation. + */ +#define bpf_core_read(dst, sz, src) \ + bpf_probe_read_kernel(dst, sz, (const void *)__builtin_preserve_access_index(src)) + +/* NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. */ +#define bpf_core_read_user(dst, sz, src) \ + bpf_probe_read_user(dst, sz, (const void *)__builtin_preserve_access_index(src)) +/* + * bpf_core_read_str() is a thin wrapper around bpf_probe_read_str() + * additionally emitting BPF CO-RE field relocation for specified source + * argument. + */ +#define bpf_core_read_str(dst, sz, src) \ + bpf_probe_read_kernel_str(dst, sz, (const void *)__builtin_preserve_access_index(src)) + +/* NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. */ +#define bpf_core_read_user_str(dst, sz, src) \ + bpf_probe_read_user_str(dst, sz, (const void *)__builtin_preserve_access_index(src)) + +#define ___concat(a, b) a ## b +#define ___apply(fn, n) ___concat(fn, n) +#define ___nth(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, __11, N, ...) N + +/* + * return number of provided arguments; used for switch-based variadic macro + * definitions (see ___last, ___arrow, etc below) + */ +#define ___narg(...) ___nth(_, ##__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +/* + * return 0 if no arguments are passed, N - otherwise; used for + * recursively-defined macros to specify termination (0) case, and generic + * (N) case (e.g., ___read_ptrs, ___core_read) + */ +#define ___empty(...) ___nth(_, ##__VA_ARGS__, N, N, N, N, N, N, N, N, N, N, 0) + +#define ___last1(x) x +#define ___last2(a, x) x +#define ___last3(a, b, x) x +#define ___last4(a, b, c, x) x +#define ___last5(a, b, c, d, x) x +#define ___last6(a, b, c, d, e, x) x +#define ___last7(a, b, c, d, e, f, x) x +#define ___last8(a, b, c, d, e, f, g, x) x +#define ___last9(a, b, c, d, e, f, g, h, x) x +#define ___last10(a, b, c, d, e, f, g, h, i, x) x +#define ___last(...) ___apply(___last, ___narg(__VA_ARGS__))(__VA_ARGS__) + +#define ___nolast2(a, _) a +#define ___nolast3(a, b, _) a, b +#define ___nolast4(a, b, c, _) a, b, c +#define ___nolast5(a, b, c, d, _) a, b, c, d +#define ___nolast6(a, b, c, d, e, _) a, b, c, d, e +#define ___nolast7(a, b, c, d, e, f, _) a, b, c, d, e, f +#define ___nolast8(a, b, c, d, e, f, g, _) a, b, c, d, e, f, g +#define ___nolast9(a, b, c, d, e, f, g, h, _) a, b, c, d, e, f, g, h +#define ___nolast10(a, b, c, d, e, f, g, h, i, _) a, b, c, d, e, f, g, h, i +#define ___nolast(...) ___apply(___nolast, ___narg(__VA_ARGS__))(__VA_ARGS__) + +#define ___arrow1(a) a +#define ___arrow2(a, b) a->b +#define ___arrow3(a, b, c) a->b->c +#define ___arrow4(a, b, c, d) a->b->c->d +#define ___arrow5(a, b, c, d, e) a->b->c->d->e +#define ___arrow6(a, b, c, d, e, f) a->b->c->d->e->f +#define ___arrow7(a, b, c, d, e, f, g) a->b->c->d->e->f->g +#define ___arrow8(a, b, c, d, e, f, g, h) a->b->c->d->e->f->g->h +#define ___arrow9(a, b, c, d, e, f, g, h, i) a->b->c->d->e->f->g->h->i +#define ___arrow10(a, b, c, d, e, f, g, h, i, j) a->b->c->d->e->f->g->h->i->j +#define ___arrow(...) ___apply(___arrow, ___narg(__VA_ARGS__))(__VA_ARGS__) + +#define ___type(...) typeof(___arrow(__VA_ARGS__)) + +#define ___read(read_fn, dst, src_type, src, accessor) \ + read_fn((void *)(dst), sizeof(*(dst)), &((src_type)(src))->accessor) + +/* "recursively" read a sequence of inner pointers using local __t var */ +#define ___rd_first(fn, src, a) ___read(fn, &__t, ___type(src), src, a); +#define ___rd_last(fn, ...) \ + ___read(fn, &__t, ___type(___nolast(__VA_ARGS__)), __t, ___last(__VA_ARGS__)); +#define ___rd_p1(fn, ...) const void *__t; ___rd_first(fn, __VA_ARGS__) +#define ___rd_p2(fn, ...) ___rd_p1(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p3(fn, ...) ___rd_p2(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p4(fn, ...) ___rd_p3(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p5(fn, ...) ___rd_p4(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p6(fn, ...) ___rd_p5(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p7(fn, ...) ___rd_p6(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p8(fn, ...) ___rd_p7(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___rd_p9(fn, ...) ___rd_p8(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) +#define ___read_ptrs(fn, src, ...) \ + ___apply(___rd_p, ___narg(__VA_ARGS__))(fn, src, __VA_ARGS__) + +#define ___core_read0(fn, fn_ptr, dst, src, a) \ + ___read(fn, dst, ___type(src), src, a); +#define ___core_readN(fn, fn_ptr, dst, src, ...) \ + ___read_ptrs(fn_ptr, src, ___nolast(__VA_ARGS__)) \ + ___read(fn, dst, ___type(src, ___nolast(__VA_ARGS__)), __t, \ + ___last(__VA_ARGS__)); +#define ___core_read(fn, fn_ptr, dst, src, a, ...) \ + ___apply(___core_read, ___empty(__VA_ARGS__))(fn, fn_ptr, dst, \ + src, a, ##__VA_ARGS__) + +/* + * BPF_CORE_READ_INTO() is a more performance-conscious variant of + * BPF_CORE_READ(), in which final field is read into user-provided storage. + * See BPF_CORE_READ() below for more details on general usage. + */ +#define BPF_CORE_READ_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read, bpf_core_read, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * Variant of BPF_CORE_READ_INTO() for reading from user-space memory. + * + * NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. + */ +#define BPF_CORE_READ_USER_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read_user, bpf_core_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ_INTO() */ +#define BPF_PROBE_READ_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_kernel, bpf_probe_read_kernel, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ_USER_INTO(). + * + * As no CO-RE relocations are emitted, source types can be arbitrary and are + * not restricted to kernel types only. + */ +#define BPF_PROBE_READ_USER_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_user, bpf_probe_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * BPF_CORE_READ_STR_INTO() does same "pointer chasing" as + * BPF_CORE_READ() for intermediate pointers, but then executes (and returns + * corresponding error code) bpf_core_read_str() for final string read. + */ +#define BPF_CORE_READ_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read_str, bpf_core_read, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * Variant of BPF_CORE_READ_STR_INTO() for reading from user-space memory. + * + * NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. + */ +#define BPF_CORE_READ_USER_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_core_read_user_str, bpf_core_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ_STR_INTO() */ +#define BPF_PROBE_READ_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_kernel_str, bpf_probe_read_kernel, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * Non-CO-RE variant of BPF_CORE_READ_USER_STR_INTO(). + * + * As no CO-RE relocations are emitted, source types can be arbitrary and are + * not restricted to kernel types only. + */ +#define BPF_PROBE_READ_USER_STR_INTO(dst, src, a, ...) ({ \ + ___core_read(bpf_probe_read_user_str, bpf_probe_read_user, \ + dst, (src), a, ##__VA_ARGS__) \ +}) + +/* + * BPF_CORE_READ() is used to simplify BPF CO-RE relocatable read, especially + * when there are few pointer chasing steps. + * E.g., what in non-BPF world (or in BPF w/ BCC) would be something like: + * int x = s->a.b.c->d.e->f->g; + * can be succinctly achieved using BPF_CORE_READ as: + * int x = BPF_CORE_READ(s, a.b.c, d.e, f, g); + * + * BPF_CORE_READ will decompose above statement into 4 bpf_core_read (BPF + * CO-RE relocatable bpf_probe_read_kernel() wrapper) calls, logically + * equivalent to: + * 1. const void *__t = s->a.b.c; + * 2. __t = __t->d.e; + * 3. __t = __t->f; + * 4. return __t->g; + * + * Equivalence is logical, because there is a heavy type casting/preservation + * involved, as well as all the reads are happening through + * bpf_probe_read_kernel() calls using __builtin_preserve_access_index() to + * emit CO-RE relocations. + * + * N.B. Only up to 9 "field accessors" are supported, which should be more + * than enough for any practical purpose. + */ +#define BPF_CORE_READ(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_CORE_READ_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +/* + * Variant of BPF_CORE_READ() for reading from user-space memory. + * + * NOTE: all the source types involved are still *kernel types* and need to + * exist in kernel (or kernel module) BTF, otherwise CO-RE relocation will + * fail. Custom user types are not relocatable with CO-RE. + * The typical situation in which BPF_CORE_READ_USER() might be used is to + * read kernel UAPI types from the user-space memory passed in as a syscall + * input argument. + */ +#define BPF_CORE_READ_USER(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_CORE_READ_USER_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +/* Non-CO-RE variant of BPF_CORE_READ() */ +#define BPF_PROBE_READ(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_PROBE_READ_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +/* + * Non-CO-RE variant of BPF_CORE_READ_USER(). + * + * As no CO-RE relocations are emitted, source types can be arbitrary and are + * not restricted to kernel types only. + */ +#define BPF_PROBE_READ_USER(src, a, ...) ({ \ + ___type((src), a, ##__VA_ARGS__) __r; \ + BPF_PROBE_READ_USER_INTO(&__r, (src), a, ##__VA_ARGS__); \ + __r; \ +}) + +#endif + diff --git a/libbpf/src/bpf_endian.h b/libbpf/src/bpf_endian.h new file mode 100644 index 0000000..ec9db4f --- /dev/null +++ b/libbpf/src/bpf_endian.h @@ -0,0 +1,99 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_ENDIAN__ +#define __BPF_ENDIAN__ + +/* + * Isolate byte #n and put it into byte #m, for __u##b type. + * E.g., moving byte #6 (nnnnnnnn) into byte #1 (mmmmmmmm) for __u64: + * 1) xxxxxxxx nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx + * 2) nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx 00000000 + * 3) 00000000 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn + * 4) 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn 00000000 + */ +#define ___bpf_mvb(x, b, n, m) ((__u##b)(x) << (b-(n+1)*8) >> (b-8) << (m*8)) + +#define ___bpf_swab16(x) ((__u16)( \ + ___bpf_mvb(x, 16, 0, 1) | \ + ___bpf_mvb(x, 16, 1, 0))) + +#define ___bpf_swab32(x) ((__u32)( \ + ___bpf_mvb(x, 32, 0, 3) | \ + ___bpf_mvb(x, 32, 1, 2) | \ + ___bpf_mvb(x, 32, 2, 1) | \ + ___bpf_mvb(x, 32, 3, 0))) + +#define ___bpf_swab64(x) ((__u64)( \ + ___bpf_mvb(x, 64, 0, 7) | \ + ___bpf_mvb(x, 64, 1, 6) | \ + ___bpf_mvb(x, 64, 2, 5) | \ + ___bpf_mvb(x, 64, 3, 4) | \ + ___bpf_mvb(x, 64, 4, 3) | \ + ___bpf_mvb(x, 64, 5, 2) | \ + ___bpf_mvb(x, 64, 6, 1) | \ + ___bpf_mvb(x, 64, 7, 0))) + +/* LLVM's BPF target selects the endianness of the CPU + * it compiles on, or the user specifies (bpfel/bpfeb), + * respectively. The used __BYTE_ORDER__ is defined by + * the compiler, we cannot rely on __BYTE_ORDER from + * libc headers, since it doesn't reflect the actual + * requested byte order. + * + * Note, LLVM's BPF target has different __builtin_bswapX() + * semantics. It does map to BPF_ALU | BPF_END | BPF_TO_BE + * in bpfel and bpfeb case, which means below, that we map + * to cpu_to_be16(). We could use it unconditionally in BPF + * case, but better not rely on it, so that this header here + * can be used from application and BPF program side, which + * use different targets. + */ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define __bpf_ntohs(x) __builtin_bswap16(x) +# define __bpf_htons(x) __builtin_bswap16(x) +# define __bpf_constant_ntohs(x) ___bpf_swab16(x) +# define __bpf_constant_htons(x) ___bpf_swab16(x) +# define __bpf_ntohl(x) __builtin_bswap32(x) +# define __bpf_htonl(x) __builtin_bswap32(x) +# define __bpf_constant_ntohl(x) ___bpf_swab32(x) +# define __bpf_constant_htonl(x) ___bpf_swab32(x) +# define __bpf_be64_to_cpu(x) __builtin_bswap64(x) +# define __bpf_cpu_to_be64(x) __builtin_bswap64(x) +# define __bpf_constant_be64_to_cpu(x) ___bpf_swab64(x) +# define __bpf_constant_cpu_to_be64(x) ___bpf_swab64(x) +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define __bpf_ntohs(x) (x) +# define __bpf_htons(x) (x) +# define __bpf_constant_ntohs(x) (x) +# define __bpf_constant_htons(x) (x) +# define __bpf_ntohl(x) (x) +# define __bpf_htonl(x) (x) +# define __bpf_constant_ntohl(x) (x) +# define __bpf_constant_htonl(x) (x) +# define __bpf_be64_to_cpu(x) (x) +# define __bpf_cpu_to_be64(x) (x) +# define __bpf_constant_be64_to_cpu(x) (x) +# define __bpf_constant_cpu_to_be64(x) (x) +#else +# error "Fix your compiler's __BYTE_ORDER__?!" +#endif + +#define bpf_htons(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_htons(x) : __bpf_htons(x)) +#define bpf_ntohs(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_ntohs(x) : __bpf_ntohs(x)) +#define bpf_htonl(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_htonl(x) : __bpf_htonl(x)) +#define bpf_ntohl(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_ntohl(x) : __bpf_ntohl(x)) +#define bpf_cpu_to_be64(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_cpu_to_be64(x) : __bpf_cpu_to_be64(x)) +#define bpf_be64_to_cpu(x) \ + (__builtin_constant_p(x) ? \ + __bpf_constant_be64_to_cpu(x) : __bpf_be64_to_cpu(x)) + +#endif /* __BPF_ENDIAN__ */ diff --git a/libbpf/src/bpf_gen_internal.h b/libbpf/src/bpf_gen_internal.h new file mode 100644 index 0000000..fdf4440 --- /dev/null +++ b/libbpf/src/bpf_gen_internal.h @@ -0,0 +1,74 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2021 Facebook */ +#ifndef __BPF_GEN_INTERNAL_H +#define __BPF_GEN_INTERNAL_H + +#include "bpf.h" + +struct ksym_relo_desc { + const char *name; + int kind; + int insn_idx; + bool is_weak; + bool is_typeless; + bool is_ld64; +}; + +struct ksym_desc { + const char *name; + int ref; + int kind; + union { + /* used for kfunc */ + int off; + /* used for typeless ksym */ + bool typeless; + }; + int insn; + bool is_ld64; +}; + +struct bpf_gen { + struct gen_loader_opts *opts; + void *data_start; + void *data_cur; + void *insn_start; + void *insn_cur; + ssize_t cleanup_label; + __u32 nr_progs; + __u32 nr_maps; + int log_level; + int error; + struct ksym_relo_desc *relos; + int relo_cnt; + struct bpf_core_relo *core_relos; + int core_relo_cnt; + char attach_target[128]; + int attach_kind; + struct ksym_desc *ksyms; + __u32 nr_ksyms; + int fd_array; + int nr_fd_array; +}; + +void bpf_gen__init(struct bpf_gen *gen, int log_level, int nr_progs, int nr_maps); +int bpf_gen__finish(struct bpf_gen *gen, int nr_progs, int nr_maps); +void bpf_gen__free(struct bpf_gen *gen); +void bpf_gen__load_btf(struct bpf_gen *gen, const void *raw_data, __u32 raw_size); +void bpf_gen__map_create(struct bpf_gen *gen, + enum bpf_map_type map_type, const char *map_name, + __u32 key_size, __u32 value_size, __u32 max_entries, + struct bpf_map_create_opts *map_attr, int map_idx); +void bpf_gen__prog_load(struct bpf_gen *gen, + enum bpf_prog_type prog_type, const char *prog_name, + const char *license, struct bpf_insn *insns, size_t insn_cnt, + struct bpf_prog_load_opts *load_attr, int prog_idx); +void bpf_gen__map_update_elem(struct bpf_gen *gen, int map_idx, void *value, __u32 value_size); +void bpf_gen__map_freeze(struct bpf_gen *gen, int map_idx); +void bpf_gen__record_attach_target(struct bpf_gen *gen, const char *name, enum bpf_attach_type type); +void bpf_gen__record_extern(struct bpf_gen *gen, const char *name, bool is_weak, + bool is_typeless, bool is_ld64, int kind, int insn_idx); +void bpf_gen__record_relo_core(struct bpf_gen *gen, const struct bpf_core_relo *core_relo); +void bpf_gen__populate_outer_map(struct bpf_gen *gen, int outer_map_idx, int key, int inner_map_idx); + +#endif diff --git a/libbpf/src/bpf_helper_defs.h b/libbpf/src/bpf_helper_defs.h new file mode 100644 index 0000000..8eae417 --- /dev/null +++ b/libbpf/src/bpf_helper_defs.h @@ -0,0 +1,4748 @@ +/* This is auto-generated file. See bpf_doc.py for details. */ + +/* Forward declarations of BPF structs */ +struct bpf_fib_lookup; +struct bpf_sk_lookup; +struct bpf_perf_event_data; +struct bpf_perf_event_value; +struct bpf_pidns_info; +struct bpf_redir_neigh; +struct bpf_sock; +struct bpf_sock_addr; +struct bpf_sock_ops; +struct bpf_sock_tuple; +struct bpf_spin_lock; +struct bpf_sysctl; +struct bpf_tcp_sock; +struct bpf_tunnel_key; +struct bpf_xfrm_state; +struct linux_binprm; +struct pt_regs; +struct sk_reuseport_md; +struct sockaddr; +struct tcphdr; +struct seq_file; +struct tcp6_sock; +struct tcp_sock; +struct tcp_timewait_sock; +struct tcp_request_sock; +struct udp6_sock; +struct unix_sock; +struct task_struct; +struct cgroup; +struct __sk_buff; +struct sk_msg_md; +struct xdp_md; +struct path; +struct btf_ptr; +struct inode; +struct socket; +struct file; +struct bpf_timer; +struct mptcp_sock; +struct bpf_dynptr; +struct iphdr; +struct ipv6hdr; + +/* + * bpf_map_lookup_elem + * + * Perform a lookup in *map* for an entry associated to *key*. + * + * Returns + * Map value associated to *key*, or **NULL** if no entry was + * found. + */ +static void *(*bpf_map_lookup_elem)(void *map, const void *key) = (void *) 1; + +/* + * bpf_map_update_elem + * + * Add or update the value of the entry associated to *key* in + * *map* with *value*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * Flag value **BPF_NOEXIST** cannot be used for maps of types + * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all + * elements always exist), the helper would return an error. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_update_elem)(void *map, const void *key, const void *value, __u64 flags) = (void *) 2; + +/* + * bpf_map_delete_elem + * + * Delete entry with *key* from *map*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_delete_elem)(void *map, const void *key) = (void *) 3; + +/* + * bpf_probe_read + * + * For tracing programs, safely attempt to read *size* bytes from + * kernel space address *unsafe_ptr* and store the data in *dst*. + * + * Generally, use **bpf_probe_read_user**\ () or + * **bpf_probe_read_kernel**\ () instead. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_read)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 4; + +/* + * bpf_ktime_get_ns + * + * Return the time elapsed since system boot, in nanoseconds. + * Does not include time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_MONOTONIC**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_ns)(void) = (void *) 5; + +/* + * bpf_trace_printk + * + * This helper is a "printk()-like" facility for debugging. It + * prints a message defined by format *fmt* (of size *fmt_size*) + * to file *\/sys/kernel/tracing/trace* from TraceFS, if + * available. It can take up to three additional **u64** + * arguments (as an eBPF helpers, the total number of arguments is + * limited to five). + * + * Each time the helper is called, it appends a line to the trace. + * Lines are discarded while *\/sys/kernel/tracing/trace* is + * open, use *\/sys/kernel/tracing/trace_pipe* to avoid this. + * The format of the trace is customizable, and the exact output + * one will get depends on the options set in + * *\/sys/kernel/tracing/trace_options* (see also the + * *README* file under the same directory). However, it usually + * defaults to something like: + * + * :: + * + * telnet-470 [001] .N.. 419421.045894: 0x00000001: + * + * In the above: + * + * * ``telnet`` is the name of the current task. + * * ``470`` is the PID of the current task. + * * ``001`` is the CPU number on which the task is + * running. + * * In ``.N..``, each character refers to a set of + * options (whether irqs are enabled, scheduling + * options, whether hard/softirqs are running, level of + * preempt_disabled respectively). **N** means that + * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** + * are set. + * * ``419421.045894`` is a timestamp. + * * ``0x00000001`` is a fake value used by BPF for the + * instruction pointer register. + * * ```` is the message formatted with + * *fmt*. + * + * The conversion specifiers supported by *fmt* are similar, but + * more limited than for printk(). They are **%d**, **%i**, + * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, + * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size + * of field, padding with zeroes, etc.) is available, and the + * helper will return **-EINVAL** (but print nothing) if it + * encounters an unknown specifier. + * + * Also, note that **bpf_trace_printk**\ () is slow, and should + * only be used for debugging purposes. For this reason, a notice + * block (spanning several lines) is printed to kernel logs and + * states that the helper should not be used "for production use" + * the first time this helper is used (or more precisely, when + * **trace_printk**\ () buffers are allocated). For passing values + * to user space, perf events should be preferred. + * + * Returns + * The number of bytes written to the buffer, or a negative error + * in case of failure. + */ +static long (*bpf_trace_printk)(const char *fmt, __u32 fmt_size, ...) = (void *) 6; + +/* + * bpf_get_prandom_u32 + * + * Get a pseudo-random number. + * + * From a security point of view, this helper uses its own + * pseudo-random internal state, and cannot be used to infer the + * seed of other random functions in the kernel. However, it is + * essential to note that the generator used by the helper is not + * cryptographically secure. + * + * Returns + * A random 32-bit unsigned value. + */ +static __u32 (*bpf_get_prandom_u32)(void) = (void *) 7; + +/* + * bpf_get_smp_processor_id + * + * Get the SMP (symmetric multiprocessing) processor id. Note that + * all programs run with migration disabled, which means that the + * SMP processor id is stable during all the execution of the + * program. + * + * Returns + * The SMP id of the processor running the program. + */ +static __u32 (*bpf_get_smp_processor_id)(void) = (void *) 8; + +/* + * bpf_skb_store_bytes + * + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. *flags* are a combination of + * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the + * checksum for the packet after storing the bytes) and + * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ + * **->swhash** and *skb*\ **->l4hash** to 0). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_store_bytes)(struct __sk_buff *skb, __u32 offset, const void *from, __u32 len, __u64 flags) = (void *) 9; + +/* + * bpf_l3_csum_replace + * + * Recompute the layer 3 (e.g. IP) checksum for the packet + * associated to *skb*. Computation is incremental, so the helper + * must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored in *size*. + * Alternatively, it is possible to store the difference between + * the previous and the new values of the header field in *to*, by + * setting *from* and *size* to 0. For both methods, *offset* + * indicates the location of the IP checksum within the packet. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_l3_csum_replace)(struct __sk_buff *skb, __u32 offset, __u64 from, __u64 to, __u64 size) = (void *) 10; + +/* + * bpf_l4_csum_replace + * + * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the + * packet associated to *skb*. Computation is incremental, so the + * helper must know the former value of the header field that was + * modified (*from*), the new value of this field (*to*), and the + * number of bytes (2 or 4) for this field, stored on the lowest + * four bits of *flags*. Alternatively, it is possible to store + * the difference between the previous and the new values of the + * header field in *to*, by setting *from* and the four lowest + * bits of *flags* to 0. For both methods, *offset* indicates the + * location of the IP checksum within the packet. In addition to + * the size of the field, *flags* can be added (bitwise OR) actual + * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left + * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and + * for updates resulting in a null checksum the value is set to + * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates + * the checksum is to be computed against a pseudo-header. + * + * This helper works in combination with **bpf_csum_diff**\ (), + * which does not update the checksum in-place, but offers more + * flexibility and can handle sizes larger than 2 or 4 for the + * checksum to update. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_l4_csum_replace)(struct __sk_buff *skb, __u32 offset, __u64 from, __u64 to, __u64 flags) = (void *) 11; + +/* + * bpf_tail_call + * + * This special helper is used to trigger a "tail call", or in + * other words, to jump into another eBPF program. The same stack + * frame is used (but values on stack and in registers for the + * caller are not accessible to the callee). This mechanism allows + * for program chaining, either for raising the maximum number of + * available eBPF instructions, or to execute given programs in + * conditional blocks. For security reasons, there is an upper + * limit to the number of successive tail calls that can be + * performed. + * + * Upon call of this helper, the program attempts to jump into a + * program referenced at index *index* in *prog_array_map*, a + * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes + * *ctx*, a pointer to the context. + * + * If the call succeeds, the kernel immediately runs the first + * instruction of the new program. This is not a function call, + * and it never returns to the previous program. If the call + * fails, then the helper has no effect, and the caller continues + * to run its subsequent instructions. A call can fail if the + * destination program for the jump does not exist (i.e. *index* + * is superior to the number of entries in *prog_array_map*), or + * if the maximum number of tail calls has been reached for this + * chain of programs. This limit is defined in the kernel by the + * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), + * which is currently set to 33. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_tail_call)(void *ctx, void *prog_array_map, __u32 index) = (void *) 12; + +/* + * bpf_clone_redirect + * + * Clone and redirect the packet associated to *skb* to another + * net device of index *ifindex*. Both ingress and egress + * interfaces can be used for redirection. The **BPF_F_INGRESS** + * value in *flags* is used to make the distinction (ingress path + * is selected if the flag is present, egress path otherwise). + * This is the only flag supported for now. + * + * In comparison with **bpf_redirect**\ () helper, + * **bpf_clone_redirect**\ () has the associated cost of + * duplicating the packet buffer, but this can be executed out of + * the eBPF program. Conversely, **bpf_redirect**\ () is more + * efficient, but it is handled through an action code where the + * redirection happens only after the eBPF program has returned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_clone_redirect)(struct __sk_buff *skb, __u32 ifindex, __u64 flags) = (void *) 13; + +/* + * bpf_get_current_pid_tgid + * + * Get the current pid and tgid. + * + * Returns + * A 64-bit integer containing the current tgid and pid, and + * created as such: + * *current_task*\ **->tgid << 32 \|** + * *current_task*\ **->pid**. + */ +static __u64 (*bpf_get_current_pid_tgid)(void) = (void *) 14; + +/* + * bpf_get_current_uid_gid + * + * Get the current uid and gid. + * + * Returns + * A 64-bit integer containing the current GID and UID, and + * created as such: *current_gid* **<< 32 \|** *current_uid*. + */ +static __u64 (*bpf_get_current_uid_gid)(void) = (void *) 15; + +/* + * bpf_get_current_comm + * + * Copy the **comm** attribute of the current task into *buf* of + * *size_of_buf*. The **comm** attribute contains the name of + * the executable (excluding the path) for the current task. The + * *size_of_buf* must be strictly positive. On success, the + * helper makes sure that the *buf* is NUL-terminated. On failure, + * it is filled with zeroes. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_get_current_comm)(void *buf, __u32 size_of_buf) = (void *) 16; + +/* + * bpf_get_cgroup_classid + * + * Retrieve the classid for the current task, i.e. for the net_cls + * cgroup to which *skb* belongs. + * + * This helper can be used on TC egress path, but not on ingress. + * + * The net_cls cgroup provides an interface to tag network packets + * based on a user-provided identifier for all traffic coming from + * the tasks belonging to the related cgroup. See also the related + * kernel documentation, available from the Linux sources in file + * *Documentation/admin-guide/cgroup-v1/net_cls.rst*. + * + * The Linux kernel has two versions for cgroups: there are + * cgroups v1 and cgroups v2. Both are available to users, who can + * use a mixture of them, but note that the net_cls cgroup is for + * cgroup v1 only. This makes it incompatible with BPF programs + * run on cgroups, which is a cgroup-v2-only feature (a socket can + * only hold data for one version of cgroups at a time). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to + * "**y**" or to "**m**". + * + * Returns + * The classid, or 0 for the default unconfigured classid. + */ +static __u32 (*bpf_get_cgroup_classid)(struct __sk_buff *skb) = (void *) 17; + +/* + * bpf_skb_vlan_push + * + * Push a *vlan_tci* (VLAN tag control information) of protocol + * *vlan_proto* to the packet associated to *skb*, then update + * the checksum. Note that if *vlan_proto* is different from + * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to + * be **ETH_P_8021Q**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_vlan_push)(struct __sk_buff *skb, __be16 vlan_proto, __u16 vlan_tci) = (void *) 18; + +/* + * bpf_skb_vlan_pop + * + * Pop a VLAN header from the packet associated to *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_vlan_pop)(struct __sk_buff *skb) = (void *) 19; + +/* + * bpf_skb_get_tunnel_key + * + * Get tunnel metadata. This helper takes a pointer *key* to an + * empty **struct bpf_tunnel_key** of **size**, that will be + * filled with tunnel metadata for the packet associated to *skb*. + * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which + * indicates that the tunnel is based on IPv6 protocol instead of + * IPv4. + * + * The **struct bpf_tunnel_key** is an object that generalizes the + * principal parameters used by various tunneling protocols into a + * single struct. This way, it can be used to easily make a + * decision based on the contents of the encapsulation header, + * "summarized" in this struct. In particular, it holds the IP + * address of the remote end (IPv4 or IPv6, depending on the case) + * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, + * this struct exposes the *key*\ **->tunnel_id**, which is + * generally mapped to a VNI (Virtual Network Identifier), making + * it programmable together with the **bpf_skb_set_tunnel_key**\ + * () helper. + * + * Let's imagine that the following code is part of a program + * attached to the TC ingress interface, on one end of a GRE + * tunnel, and is supposed to filter out all messages coming from + * remote ends with IPv4 address other than 10.0.0.1: + * + * :: + * + * int ret; + * struct bpf_tunnel_key key = {}; + * + * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); + * if (ret < 0) + * return TC_ACT_SHOT; // drop packet + * + * if (key.remote_ipv4 != 0x0a000001) + * return TC_ACT_SHOT; // drop packet + * + * return TC_ACT_OK; // accept packet + * + * This interface can also be used with all encapsulation devices + * that can operate in "collect metadata" mode: instead of having + * one network device per specific configuration, the "collect + * metadata" mode only requires a single device where the + * configuration can be extracted from this helper. + * + * This can be used together with various tunnels such as VXLan, + * Geneve, GRE or IP in IP (IPIP). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_get_tunnel_key)(struct __sk_buff *skb, struct bpf_tunnel_key *key, __u32 size, __u64 flags) = (void *) 20; + +/* + * bpf_skb_set_tunnel_key + * + * Populate tunnel metadata for packet associated to *skb.* The + * tunnel metadata is set to the contents of *key*, of *size*. The + * *flags* can be set to a combination of the following values: + * + * **BPF_F_TUNINFO_IPV6** + * Indicate that the tunnel is based on IPv6 protocol + * instead of IPv4. + * **BPF_F_ZERO_CSUM_TX** + * For IPv4 packets, add a flag to tunnel metadata + * indicating that checksum computation should be skipped + * and checksum set to zeroes. + * **BPF_F_DONT_FRAGMENT** + * Add a flag to tunnel metadata indicating that the + * packet should not be fragmented. + * **BPF_F_SEQ_NUMBER** + * Add a flag to tunnel metadata indicating that a + * sequence number should be added to tunnel header before + * sending the packet. This flag was added for GRE + * encapsulation, but might be used with other protocols + * as well in the future. + * **BPF_F_NO_TUNNEL_KEY** + * Add a flag to tunnel metadata indicating that no tunnel + * key should be set in the resulting tunnel header. + * + * Here is a typical usage on the transmit path: + * + * :: + * + * struct bpf_tunnel_key key; + * populate key ... + * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); + * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); + * + * See also the description of the **bpf_skb_get_tunnel_key**\ () + * helper for additional information. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_set_tunnel_key)(struct __sk_buff *skb, struct bpf_tunnel_key *key, __u32 size, __u64 flags) = (void *) 21; + +/* + * bpf_perf_event_read + * + * Read the value of a perf event counter. This helper relies on a + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of + * the perf event counter is selected when *map* is updated with + * perf event file descriptors. The *map* is an array whose size + * is the number of available CPUs, and each cell contains a value + * relative to one CPU. The value to retrieve is indicated by + * *flags*, that contains the index of the CPU to look up, masked + * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * Note that before Linux 4.13, only hardware perf event can be + * retrieved. + * + * Also, be aware that the newer helper + * **bpf_perf_event_read_value**\ () is recommended over + * **bpf_perf_event_read**\ () in general. The latter has some ABI + * quirks where error and counter value are used as a return code + * (which is wrong to do since ranges may overlap). This issue is + * fixed with **bpf_perf_event_read_value**\ (), which at the same + * time provides more features over the **bpf_perf_event_read**\ + * () interface. Please refer to the description of + * **bpf_perf_event_read_value**\ () for details. + * + * Returns + * The value of the perf event counter read from the map, or a + * negative error code in case of failure. + */ +static __u64 (*bpf_perf_event_read)(void *map, __u64 flags) = (void *) 22; + +/* + * bpf_redirect + * + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_clone_redirect**\ + * (), except that the packet is not cloned, which provides + * increased performance. + * + * Except for XDP, both ingress and egress interfaces can be used + * for redirection. The **BPF_F_INGRESS** value in *flags* is used + * to make the distinction (ingress path is selected if the flag + * is present, egress path otherwise). Currently, XDP only + * supports redirection to the egress interface, and accepts no + * flag at all. + * + * The same effect can also be attained with the more generic + * **bpf_redirect_map**\ (), which uses a BPF map to store the + * redirect target instead of providing it directly to the helper. + * + * Returns + * For XDP, the helper returns **XDP_REDIRECT** on success or + * **XDP_ABORTED** on error. For other program types, the values + * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on + * error. + */ +static long (*bpf_redirect)(__u32 ifindex, __u64 flags) = (void *) 23; + +/* + * bpf_get_route_realm + * + * Retrieve the realm or the route, that is to say the + * **tclassid** field of the destination for the *skb*. The + * identifier retrieved is a user-provided tag, similar to the + * one used with the net_cls cgroup (see description for + * **bpf_get_cgroup_classid**\ () helper), but here this tag is + * held by a route (a destination entry), not by a task. + * + * Retrieving this identifier works with the clsact TC egress hook + * (see also **tc-bpf(8)**), or alternatively on conventional + * classful egress qdiscs, but not on TC ingress path. In case of + * clsact TC egress hook, this has the advantage that, internally, + * the destination entry has not been dropped yet in the transmit + * path. Therefore, the destination entry does not need to be + * artificially held via **netif_keep_dst**\ () for a classful + * qdisc until the *skb* is freed. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_IP_ROUTE_CLASSID** configuration option. + * + * Returns + * The realm of the route for the packet associated to *skb*, or 0 + * if none was found. + */ +static __u32 (*bpf_get_route_realm)(struct __sk_buff *skb) = (void *) 24; + +/* + * bpf_perf_event_output + * + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * The context of the program *ctx* needs also be passed to the + * helper. + * + * On user space, a program willing to read the values needs to + * call **perf_event_open**\ () on the perf event (either for + * one or for all CPUs) and to store the file descriptor into the + * *map*. This must be done before the eBPF program can send data + * into it. An example is available in file + * *samples/bpf/trace_output_user.c* in the Linux kernel source + * tree (the eBPF program counterpart is in + * *samples/bpf/trace_output_kern.c*). + * + * **bpf_perf_event_output**\ () achieves better performance + * than **bpf_trace_printk**\ () for sharing data with user + * space, and is much better suitable for streaming data from eBPF + * programs. + * + * Note that this helper is not restricted to tracing use cases + * and can be used with programs attached to TC or XDP as well, + * where it allows for passing data to user space listeners. Data + * can be: + * + * * Only custom structs, + * * Only the packet payload, or + * * A combination of both. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_perf_event_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 25; + +/* + * bpf_skb_load_bytes + * + * This helper was provided as an easy way to load data from a + * packet. It can be used to load *len* bytes from *offset* from + * the packet associated to *skb*, into the buffer pointed by + * *to*. + * + * Since Linux 4.7, usage of this helper has mostly been replaced + * by "direct packet access", enabling packet data to be + * manipulated with *skb*\ **->data** and *skb*\ **->data_end** + * pointing respectively to the first byte of packet data and to + * the byte after the last byte of packet data. However, it + * remains useful if one wishes to read large quantities of data + * at once from a packet into the eBPF stack. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_load_bytes)(const void *skb, __u32 offset, void *to, __u32 len) = (void *) 26; + +/* + * bpf_get_stackid + * + * Walk a user or a kernel stack and return its id. To achieve + * this, the helper needs *ctx*, which is a pointer to the context + * on which the tracing program is executed, and a pointer to a + * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * a combination of the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_FAST_STACK_CMP** + * Compare stacks by hash only. + * **BPF_F_REUSE_STACKID** + * If two different stacks hash into the same *stackid*, + * discard the old one. + * + * The stack id retrieved is a 32 bit long integer handle which + * can be further combined with other data (including other stack + * ids) and used as a key into maps. This can be useful for + * generating a variety of graphs (such as flame graphs or off-cpu + * graphs). + * + * For walking a stack, this helper is an improvement over + * **bpf_probe_read**\ (), which can be used with unrolled loops + * but is not efficient and consumes a lot of eBPF instructions. + * Instead, **bpf_get_stackid**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * + * Returns + * The positive or null stack id on success, or a negative error + * in case of failure. + */ +static long (*bpf_get_stackid)(void *ctx, void *map, __u64 flags) = (void *) 27; + +/* + * bpf_csum_diff + * + * Compute a checksum difference, from the raw buffer pointed by + * *from*, of length *from_size* (that must be a multiple of 4), + * towards the raw buffer pointed by *to*, of size *to_size* + * (same remark). An optional *seed* can be added to the value + * (this can be cascaded, the seed may come from a previous call + * to the helper). + * + * This is flexible enough to be used in several ways: + * + * * With *from_size* == 0, *to_size* > 0 and *seed* set to + * checksum, it can be used when pushing new data. + * * With *from_size* > 0, *to_size* == 0 and *seed* set to + * checksum, it can be used when removing data from a packet. + * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it + * can be used to compute a diff. Note that *from_size* and + * *to_size* do not need to be equal. + * + * This helper can be used in combination with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to + * which one can feed in the difference computed with + * **bpf_csum_diff**\ (). + * + * Returns + * The checksum result, or a negative error code in case of + * failure. + */ +static __s64 (*bpf_csum_diff)(__be32 *from, __u32 from_size, __be32 *to, __u32 to_size, __wsum seed) = (void *) 28; + +/* + * bpf_skb_get_tunnel_opt + * + * Retrieve tunnel options metadata for the packet associated to + * *skb*, and store the raw tunnel option data to the buffer *opt* + * of *size*. + * + * This helper can be used with encapsulation devices that can + * operate in "collect metadata" mode (please refer to the related + * note in the description of **bpf_skb_get_tunnel_key**\ () for + * more details). A particular example where this can be used is + * in combination with the Geneve encapsulation protocol, where it + * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) + * and retrieving arbitrary TLVs (Type-Length-Value headers) from + * the eBPF program. This allows for full customization of these + * headers. + * + * Returns + * The size of the option data retrieved. + */ +static long (*bpf_skb_get_tunnel_opt)(struct __sk_buff *skb, void *opt, __u32 size) = (void *) 29; + +/* + * bpf_skb_set_tunnel_opt + * + * Set tunnel options metadata for the packet associated to *skb* + * to the option data contained in the raw buffer *opt* of *size*. + * + * See also the description of the **bpf_skb_get_tunnel_opt**\ () + * helper for additional information. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_set_tunnel_opt)(struct __sk_buff *skb, void *opt, __u32 size) = (void *) 30; + +/* + * bpf_skb_change_proto + * + * Change the protocol of the *skb* to *proto*. Currently + * supported are transition from IPv4 to IPv6, and from IPv6 to + * IPv4. The helper takes care of the groundwork for the + * transition, including resizing the socket buffer. The eBPF + * program is expected to fill the new headers, if any, via + * **skb_store_bytes**\ () and to recompute the checksums with + * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ + * (). The main case for this helper is to perform NAT64 + * operations out of an eBPF program. + * + * Internally, the GSO type is marked as dodgy so that headers are + * checked and segments are recalculated by the GSO/GRO engine. + * The size for GSO target is adapted as well. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_proto)(struct __sk_buff *skb, __be16 proto, __u64 flags) = (void *) 31; + +/* + * bpf_skb_change_type + * + * Change the packet type for the packet associated to *skb*. This + * comes down to setting *skb*\ **->pkt_type** to *type*, except + * the eBPF program does not have a write access to *skb*\ + * **->pkt_type** beside this helper. Using a helper here allows + * for graceful handling of errors. + * + * The major use case is to change incoming *skb*s to + * **PACKET_HOST** in a programmatic way instead of having to + * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for + * example. + * + * Note that *type* only allows certain values. At this time, they + * are: + * + * **PACKET_HOST** + * Packet is for us. + * **PACKET_BROADCAST** + * Send packet to all. + * **PACKET_MULTICAST** + * Send packet to group. + * **PACKET_OTHERHOST** + * Send packet to someone else. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_type)(struct __sk_buff *skb, __u32 type) = (void *) 32; + +/* + * bpf_skb_under_cgroup + * + * Check whether *skb* is a descendant of the cgroup2 held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * + * Returns + * The return value depends on the result of the test, and can be: + * + * * 0, if the *skb* failed the cgroup2 descendant test. + * * 1, if the *skb* succeeded the cgroup2 descendant test. + * * A negative error code, if an error occurred. + */ +static long (*bpf_skb_under_cgroup)(struct __sk_buff *skb, void *map, __u32 index) = (void *) 33; + +/* + * bpf_get_hash_recalc + * + * Retrieve the hash of the packet, *skb*\ **->hash**. If it is + * not set, in particular if the hash was cleared due to mangling, + * recompute this hash. Later accesses to the hash can be done + * directly with *skb*\ **->hash**. + * + * Calling **bpf_set_hash_invalid**\ (), changing a packet + * prototype with **bpf_skb_change_proto**\ (), or calling + * **bpf_skb_store_bytes**\ () with the + * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear + * the hash and to trigger a new computation for the next call to + * **bpf_get_hash_recalc**\ (). + * + * Returns + * The 32-bit hash. + */ +static __u32 (*bpf_get_hash_recalc)(struct __sk_buff *skb) = (void *) 34; + +/* + * bpf_get_current_task + * + * Get the current task. + * + * Returns + * A pointer to the current task struct. + */ +static __u64 (*bpf_get_current_task)(void) = (void *) 35; + +/* + * bpf_probe_write_user + * + * Attempt in a safe way to write *len* bytes from the buffer + * *src* to *dst* in memory. It only works for threads that are in + * user context, and *dst* must be a valid user space address. + * + * This helper should not be used to implement any kind of + * security mechanism because of TOC-TOU attacks, but rather to + * debug, divert, and manipulate execution of semi-cooperative + * processes. + * + * Keep in mind that this feature is meant for experiments, and it + * has a risk of crashing the system and running programs. + * Therefore, when an eBPF program using this helper is attached, + * a warning including PID and process name is printed to kernel + * logs. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_write_user)(void *dst, const void *src, __u32 len) = (void *) 36; + +/* + * bpf_current_task_under_cgroup + * + * Check whether the probe is being run is the context of a given + * subset of the cgroup2 hierarchy. The cgroup2 to test is held by + * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. + * + * Returns + * The return value depends on the result of the test, and can be: + * + * * 1, if current task belongs to the cgroup2. + * * 0, if current task does not belong to the cgroup2. + * * A negative error code, if an error occurred. + */ +static long (*bpf_current_task_under_cgroup)(void *map, __u32 index) = (void *) 37; + +/* + * bpf_skb_change_tail + * + * Resize (trim or grow) the packet associated to *skb* to the + * new *len*. The *flags* are reserved for future usage, and must + * be left at zero. + * + * The basic idea is that the helper performs the needed work to + * change the size of the packet, then the eBPF program rewrites + * the rest via helpers like **bpf_skb_store_bytes**\ (), + * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () + * and others. This helper is a slow path utility intended for + * replies with control messages. And because it is targeted for + * slow path, the helper itself can afford to be slow: it + * implicitly linearizes, unclones and drops offloads from the + * *skb*. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_tail)(struct __sk_buff *skb, __u32 len, __u64 flags) = (void *) 38; + +/* + * bpf_skb_pull_data + * + * Pull in non-linear data in case the *skb* is non-linear and not + * all of *len* are part of the linear section. Make *len* bytes + * from *skb* readable and writable. If a zero value is passed for + * *len*, then all bytes in the linear part of *skb* will be made + * readable and writable. + * + * This helper is only needed for reading and writing with direct + * packet access. + * + * For direct packet access, testing that offsets to access + * are within packet boundaries (test on *skb*\ **->data_end**) is + * susceptible to fail if offsets are invalid, or if the requested + * data is in non-linear parts of the *skb*. On failure the + * program can just bail out, or in the case of a non-linear + * buffer, use a helper to make the data available. The + * **bpf_skb_load_bytes**\ () helper is a first solution to access + * the data. Another one consists in using **bpf_skb_pull_data** + * to pull in once the non-linear parts, then retesting and + * eventually access the data. + * + * At the same time, this also makes sure the *skb* is uncloned, + * which is a necessary condition for direct write. As this needs + * to be an invariant for the write part only, the verifier + * detects writes and adds a prologue that is calling + * **bpf_skb_pull_data()** to effectively unclone the *skb* from + * the very beginning in case it is indeed cloned. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_pull_data)(struct __sk_buff *skb, __u32 len) = (void *) 39; + +/* + * bpf_csum_update + * + * Add the checksum *csum* into *skb*\ **->csum** in case the + * driver has supplied a checksum for the entire packet into that + * field. Return an error otherwise. This helper is intended to be + * used in combination with **bpf_csum_diff**\ (), in particular + * when the checksum needs to be updated after data has been + * written into the packet through direct packet access. + * + * Returns + * The checksum on success, or a negative error code in case of + * failure. + */ +static __s64 (*bpf_csum_update)(struct __sk_buff *skb, __wsum csum) = (void *) 40; + +/* + * bpf_set_hash_invalid + * + * Invalidate the current *skb*\ **->hash**. It can be used after + * mangling on headers through direct packet access, in order to + * indicate that the hash is outdated and to trigger a + * recalculation the next time the kernel tries to access this + * hash or when the **bpf_get_hash_recalc**\ () helper is called. + * + * Returns + * void. + */ +static void (*bpf_set_hash_invalid)(struct __sk_buff *skb) = (void *) 41; + +/* + * bpf_get_numa_node_id + * + * Return the id of the current NUMA node. The primary use case + * for this helper is the selection of sockets for the local NUMA + * node, when the program is attached to sockets using the + * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), + * but the helper is also available to other eBPF program types, + * similarly to **bpf_get_smp_processor_id**\ (). + * + * Returns + * The id of current NUMA node. + */ +static long (*bpf_get_numa_node_id)(void) = (void *) 42; + +/* + * bpf_skb_change_head + * + * Grows headroom of packet associated to *skb* and adjusts the + * offset of the MAC header accordingly, adding *len* bytes of + * space. It automatically extends and reallocates memory as + * required. + * + * This helper can be used on a layer 3 *skb* to push a MAC header + * for redirection into a layer 2 device. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_change_head)(struct __sk_buff *skb, __u32 len, __u64 flags) = (void *) 43; + +/* + * bpf_xdp_adjust_head + * + * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that + * it is possible to use a negative value for *delta*. This helper + * can be used to prepare the packet for pushing or popping + * headers. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_adjust_head)(struct xdp_md *xdp_md, int delta) = (void *) 44; + +/* + * bpf_probe_read_str + * + * Copy a NUL terminated string from an unsafe kernel address + * *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for + * more details. + * + * Generally, use **bpf_probe_read_user_str**\ () or + * **bpf_probe_read_kernel_str**\ () instead. + * + * Returns + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + */ +static long (*bpf_probe_read_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 45; + +/* + * bpf_get_socket_cookie + * + * If the **struct sk_buff** pointed by *skb* has a known socket, + * retrieve the cookie (generated by the kernel) of this socket. + * If no cookie has been set yet, generate a new cookie. Once + * generated, the socket cookie remains stable for the life of the + * socket. This helper can be useful for monitoring per socket + * networking traffic statistics as it provides a global socket + * identifier that can be assumed unique. + * + * Returns + * A 8-byte long unique number on success, or 0 if the socket + * field is missing inside *skb*. + */ +static __u64 (*bpf_get_socket_cookie)(void *ctx) = (void *) 46; + +/* + * bpf_get_socket_uid + * + * Get the owner UID of the socked associated to *skb*. + * + * Returns + * The owner UID of the socket associated to *skb*. If the socket + * is **NULL**, or if it is not a full socket (i.e. if it is a + * time-wait or a request socket instead), **overflowuid** value + * is returned (note that **overflowuid** might also be the actual + * UID value for the socket). + */ +static __u32 (*bpf_get_socket_uid)(struct __sk_buff *skb) = (void *) 47; + +/* + * bpf_set_hash + * + * Set the full hash for *skb* (set the field *skb*\ **->hash**) + * to value *hash*. + * + * Returns + * 0 + */ +static long (*bpf_set_hash)(struct __sk_buff *skb, __u32 hash) = (void *) 48; + +/* + * bpf_setsockopt + * + * Emulate a call to **setsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **setsockopt(2)** for more information. + * The option value of length *optlen* is pointed by *optval*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **setsockopt()**. + * It supports the following *level*\ s: + * + * * **SOL_SOCKET**, which supports the following *optname*\ s: + * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, + * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**, + * **SO_BINDTODEVICE**, **SO_KEEPALIVE**, **SO_REUSEADDR**, + * **SO_REUSEPORT**, **SO_BINDTOIFINDEX**, **SO_TXREHASH**. + * * **IPPROTO_TCP**, which supports the following *optname*\ s: + * **TCP_CONGESTION**, **TCP_BPF_IW**, + * **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, + * **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, + * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**, + * **TCP_NODELAY**, **TCP_MAXSEG**, **TCP_WINDOW_CLAMP**, + * **TCP_THIN_LINEAR_TIMEOUTS**, **TCP_BPF_DELACK_MAX**, + * **TCP_BPF_RTO_MIN**. + * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. + * * **IPPROTO_IPV6**, which supports the following *optname*\ s: + * **IPV6_TCLASS**, **IPV6_AUTOFLOWLABEL**. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_setsockopt)(void *bpf_socket, int level, int optname, void *optval, int optlen) = (void *) 49; + +/* + * bpf_skb_adjust_room + * + * Grow or shrink the room for data in the packet associated to + * *skb* by *len_diff*, and according to the selected *mode*. + * + * By default, the helper will reset any offloaded checksum + * indicator of the skb to CHECKSUM_NONE. This can be avoided + * by the following flag: + * + * * **BPF_F_ADJ_ROOM_NO_CSUM_RESET**: Do not reset offloaded + * checksum data of the skb to CHECKSUM_NONE. + * + * There are two supported modes at this time: + * + * * **BPF_ADJ_ROOM_MAC**: Adjust room at the mac layer + * (room space is added or removed between the layer 2 and + * layer 3 headers). + * + * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer + * (room space is added or removed between the layer 3 and + * layer 4 headers). + * + * The following flags are supported at this time: + * + * * **BPF_F_ADJ_ROOM_FIXED_GSO**: Do not adjust gso_size. + * Adjusting mss in this way is not allowed for datagrams. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV6**: + * Any new space is reserved to hold a tunnel header. + * Configure skb offsets and other fields accordingly. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L4_GRE**, + * **BPF_F_ADJ_ROOM_ENCAP_L4_UDP**: + * Use with ENCAP_L3 flags to further specify the tunnel type. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2**\ (*len*): + * Use with ENCAP_L3/L4 flags to further specify the tunnel + * type; *len* is the length of the inner MAC header. + * + * * **BPF_F_ADJ_ROOM_ENCAP_L2_ETH**: + * Use with BPF_F_ADJ_ROOM_ENCAP_L2 flag to further specify the + * L2 type as Ethernet. + * + * * **BPF_F_ADJ_ROOM_DECAP_L3_IPV4**, + * **BPF_F_ADJ_ROOM_DECAP_L3_IPV6**: + * Indicate the new IP header version after decapsulating the outer + * IP header. Used when the inner and outer IP versions are different. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_adjust_room)(struct __sk_buff *skb, __s32 len_diff, __u32 mode, __u64 flags) = (void *) 50; + +/* + * bpf_redirect_map + * + * Redirect the packet to the endpoint referenced by *map* at + * index *key*. Depending on its type, this *map* can contain + * references to net devices (for forwarding packets through other + * ports), or to CPUs (for redirecting XDP frames to another CPU; + * but this is only implemented for native XDP (with driver + * support) as of this writing). + * + * The lower two bits of *flags* are used as the return code if + * the map lookup fails. This is so that the return value can be + * one of the XDP program return codes up to **XDP_TX**, as chosen + * by the caller. The higher bits of *flags* can be set to + * BPF_F_BROADCAST or BPF_F_EXCLUDE_INGRESS as defined below. + * + * With BPF_F_BROADCAST the packet will be broadcasted to all the + * interfaces in the map, with BPF_F_EXCLUDE_INGRESS the ingress + * interface will be excluded when do broadcasting. + * + * See also **bpf_redirect**\ (), which only supports redirecting + * to an ifindex, but doesn't require a map to do so. + * + * Returns + * **XDP_REDIRECT** on success, or the value of the two lower bits + * of the *flags* argument on error. + */ +static long (*bpf_redirect_map)(void *map, __u64 key, __u64 flags) = (void *) 51; + +/* + * bpf_sk_redirect_map + * + * Redirect the packet to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_sk_redirect_map)(struct __sk_buff *skb, void *map, __u32 key, __u64 flags) = (void *) 52; + +/* + * bpf_sock_map_update + * + * Add an entry to, or update a *map* referencing sockets. The + * *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sock_map_update)(struct bpf_sock_ops *skops, void *map, void *key, __u64 flags) = (void *) 53; + +/* + * bpf_xdp_adjust_meta + * + * Adjust the address pointed by *xdp_md*\ **->data_meta** by + * *delta* (which can be positive or negative). Note that this + * operation modifies the address stored in *xdp_md*\ **->data**, + * so the latter must be loaded only after the helper has been + * called. + * + * The use of *xdp_md*\ **->data_meta** is optional and programs + * are not required to use it. The rationale is that when the + * packet is processed with XDP (e.g. as DoS filter), it is + * possible to push further meta data along with it before passing + * to the stack, and to give the guarantee that an ingress eBPF + * program attached as a TC classifier on the same device can pick + * this up for further post-processing. Since TC works with socket + * buffers, it remains possible to set from XDP the **mark** or + * **priority** pointers, or other pointers for the socket buffer. + * Having this scratch space generic and programmable allows for + * more flexibility as the user is free to store whatever meta + * data they need. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_adjust_meta)(struct xdp_md *xdp_md, int delta) = (void *) 54; + +/* + * bpf_perf_event_read_value + * + * Read the value of a perf event counter, and store it into *buf* + * of size *buf_size*. This helper relies on a *map* of type + * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event + * counter is selected when *map* is updated with perf event file + * descriptors. The *map* is an array whose size is the number of + * available CPUs, and each cell contains a value relative to one + * CPU. The value to retrieve is indicated by *flags*, that + * contains the index of the CPU to look up, masked with + * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to + * **BPF_F_CURRENT_CPU** to indicate that the value for the + * current CPU should be retrieved. + * + * This helper behaves in a way close to + * **bpf_perf_event_read**\ () helper, save that instead of + * just returning the value observed, it fills the *buf* + * structure. This allows for additional data to be retrieved: in + * particular, the enabled and running times (in *buf*\ + * **->enabled** and *buf*\ **->running**, respectively) are + * copied. In general, **bpf_perf_event_read_value**\ () is + * recommended over **bpf_perf_event_read**\ (), which has some + * ABI issues and provides fewer functionalities. + * + * These values are interesting, because hardware PMU (Performance + * Monitoring Unit) counters are limited resources. When there are + * more PMU based perf events opened than available counters, + * kernel will multiplex these events so each event gets certain + * percentage (but not all) of the PMU time. In case that + * multiplexing happens, the number of samples or counter value + * will not reflect the case compared to when no multiplexing + * occurs. This makes comparison between different runs difficult. + * Typically, the counter value should be normalized before + * comparing to other experiments. The usual normalization is done + * as follows. + * + * :: + * + * normalized_counter = counter * t_enabled / t_running + * + * Where t_enabled is the time enabled for event and t_running is + * the time running for event since last normalization. The + * enabled and running times are accumulated since the perf event + * open. To achieve scaling factor between two invocations of an + * eBPF program, users can use CPU id as the key (which is + * typical for perf array usage model) to remember the previous + * value and do the calculation inside the eBPF program. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_perf_event_read_value)(void *map, __u64 flags, struct bpf_perf_event_value *buf, __u32 buf_size) = (void *) 55; + +/* + * bpf_perf_prog_read_value + * + * For an eBPF program attached to a perf event, retrieve the + * value of the event counter associated to *ctx* and store it in + * the structure pointed by *buf* and of size *buf_size*. Enabled + * and running times are also stored in the structure (see + * description of helper **bpf_perf_event_read_value**\ () for + * more details). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_perf_prog_read_value)(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, __u32 buf_size) = (void *) 56; + +/* + * bpf_getsockopt + * + * Emulate a call to **getsockopt()** on the socket associated to + * *bpf_socket*, which must be a full socket. The *level* at + * which the option resides and the name *optname* of the option + * must be specified, see **getsockopt(2)** for more information. + * The retrieved value is stored in the structure pointed by + * *opval* and of length *optlen*. + * + * *bpf_socket* should be one of the following: + * + * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. + * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** + * and **BPF_CGROUP_INET6_CONNECT**. + * + * This helper actually implements a subset of **getsockopt()**. + * It supports the same set of *optname*\ s that is supported by + * the **bpf_setsockopt**\ () helper. The exceptions are + * **TCP_BPF_*** is **bpf_setsockopt**\ () only and + * **TCP_SAVED_SYN** is **bpf_getsockopt**\ () only. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_getsockopt)(void *bpf_socket, int level, int optname, void *optval, int optlen) = (void *) 57; + +/* + * bpf_override_return + * + * Used for error injection, this helper uses kprobes to override + * the return value of the probed function, and to set it to *rc*. + * The first argument is the context *regs* on which the kprobe + * works. + * + * This helper works by setting the PC (program counter) + * to an override function which is run in place of the original + * probed function. This means the probed function is not run at + * all. The replacement function just returns with the required + * value. + * + * This helper has security implications, and thus is subject to + * restrictions. It is only available if the kernel was compiled + * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration + * option, and in this case it only works on functions tagged with + * **ALLOW_ERROR_INJECTION** in the kernel code. + * + * Also, the helper is only available for the architectures having + * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, + * x86 architecture is the only one to support this feature. + * + * Returns + * 0 + */ +static long (*bpf_override_return)(struct pt_regs *regs, __u64 rc) = (void *) 58; + +/* + * bpf_sock_ops_cb_flags_set + * + * Attempt to set the value of the **bpf_sock_ops_cb_flags** field + * for the full TCP socket associated to *bpf_sock_ops* to + * *argval*. + * + * The primary use of this field is to determine if there should + * be calls to eBPF programs of type + * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP + * code. A program of the same type can change its value, per + * connection and as necessary, when the connection is + * established. This field is directly accessible for reading, but + * this helper must be used for updates in order to return an + * error if an eBPF program tries to set a callback that is not + * supported in the current kernel. + * + * *argval* is a flag array which can combine these flags: + * + * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) + * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) + * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) + * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) + * + * Therefore, this function can be used to clear a callback flag by + * setting the appropriate bit to zero. e.g. to disable the RTO + * callback: + * + * **bpf_sock_ops_cb_flags_set(bpf_sock,** + * **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)** + * + * Here are some examples of where one could call such eBPF + * program: + * + * * When RTO fires. + * * When a packet is retransmitted. + * * When the connection terminates. + * * When a packet is sent. + * * When a packet is received. + * + * Returns + * Code **-EINVAL** if the socket is not a full TCP socket; + * otherwise, a positive number containing the bits that could not + * be set is returned (which comes down to 0 if all bits were set + * as required). + */ +static long (*bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops *bpf_sock, int argval) = (void *) 59; + +/* + * bpf_msg_redirect_map + * + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_msg_redirect_map)(struct sk_msg_md *msg, void *map, __u32 key, __u64 flags) = (void *) 60; + +/* + * bpf_msg_apply_bytes + * + * For socket policies, apply the verdict of the eBPF program to + * the next *bytes* (number of bytes) of message *msg*. + * + * For example, this helper can be used in the following cases: + * + * * A single **sendmsg**\ () or **sendfile**\ () system call + * contains multiple logical messages that the eBPF program is + * supposed to read and for which it should apply a verdict. + * * An eBPF program only cares to read the first *bytes* of a + * *msg*. If the message has a large payload, then setting up + * and calling the eBPF program repeatedly for all bytes, even + * though the verdict is already known, would create unnecessary + * overhead. + * + * When called from within an eBPF program, the helper sets a + * counter internal to the BPF infrastructure, that is used to + * apply the last verdict to the next *bytes*. If *bytes* is + * smaller than the current data being processed from a + * **sendmsg**\ () or **sendfile**\ () system call, the first + * *bytes* will be sent and the eBPF program will be re-run with + * the pointer for start of data pointing to byte number *bytes* + * **+ 1**. If *bytes* is larger than the current data being + * processed, then the eBPF verdict will be applied to multiple + * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are + * consumed. + * + * Note that if a socket closes with the internal counter holding + * a non-zero value, this is not a problem because data is not + * being buffered for *bytes* and is sent as it is received. + * + * Returns + * 0 + */ +static long (*bpf_msg_apply_bytes)(struct sk_msg_md *msg, __u32 bytes) = (void *) 61; + +/* + * bpf_msg_cork_bytes + * + * For socket policies, prevent the execution of the verdict eBPF + * program for message *msg* until *bytes* (byte number) have been + * accumulated. + * + * This can be used when one needs a specific number of bytes + * before a verdict can be assigned, even if the data spans + * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme + * case would be a user calling **sendmsg**\ () repeatedly with + * 1-byte long message segments. Obviously, this is bad for + * performance, but it is still valid. If the eBPF program needs + * *bytes* bytes to validate a header, this helper can be used to + * prevent the eBPF program to be called again until *bytes* have + * been accumulated. + * + * Returns + * 0 + */ +static long (*bpf_msg_cork_bytes)(struct sk_msg_md *msg, __u32 bytes) = (void *) 62; + +/* + * bpf_msg_pull_data + * + * For socket policies, pull in non-linear data from user space + * for *msg* and set pointers *msg*\ **->data** and *msg*\ + * **->data_end** to *start* and *end* bytes offsets into *msg*, + * respectively. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it can only parse data that the (**data**, **data_end**) + * pointers have already consumed. For **sendmsg**\ () hooks this + * is likely the first scatterlist element. But for calls relying + * on the **sendpage** handler (e.g. **sendfile**\ ()) this will + * be the range (**0**, **0**) because the data is shared with + * user space and by default the objective is to avoid allowing + * user space to modify data while (or after) eBPF verdict is + * being decided. This helper can be used to pull in data and to + * set the start and end pointer to given values. Data will be + * copied if necessary (i.e. if data was not linear and if start + * and end pointers do not point to the same chunk). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_msg_pull_data)(struct sk_msg_md *msg, __u32 start, __u32 end, __u64 flags) = (void *) 63; + +/* + * bpf_bind + * + * Bind the socket associated to *ctx* to the address pointed by + * *addr*, of length *addr_len*. This allows for making outgoing + * connection from the desired IP address, which can be useful for + * example when all processes inside a cgroup should use one + * single IP address on a host that has multiple IP configured. + * + * This helper works for IPv4 and IPv6, TCP and UDP sockets. The + * domain (*addr*\ **->sa_family**) must be **AF_INET** (or + * **AF_INET6**). It's advised to pass zero port (**sin_port** + * or **sin6_port**) which triggers IP_BIND_ADDRESS_NO_PORT-like + * behavior and lets the kernel efficiently pick up an unused + * port as long as 4-tuple is unique. Passing non-zero port might + * lead to degraded performance. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_bind)(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) = (void *) 64; + +/* + * bpf_xdp_adjust_tail + * + * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is + * possible to both shrink and grow the packet tail. + * Shrink done via *delta* being a negative integer. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_adjust_tail)(struct xdp_md *xdp_md, int delta) = (void *) 65; + +/* + * bpf_skb_get_xfrm_state + * + * Retrieve the XFRM state (IP transform framework, see also + * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. + * + * The retrieved value is stored in the **struct bpf_xfrm_state** + * pointed by *xfrm_state* and of length *size*. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_XFRM** configuration option. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_get_xfrm_state)(struct __sk_buff *skb, __u32 index, struct bpf_xfrm_state *xfrm_state, __u32 size, __u64 flags) = (void *) 66; + +/* + * bpf_get_stack + * + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *ctx*, which is a pointer + * to the context on which the tracing program is executed. + * To store the stacktrace, the bpf program provides *buf* with + * a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect (build_id, file_offset) instead of ips for user + * stack, only valid if **BPF_F_USER_STACK** is also + * specified. + * + * *file_offset* is an offset relative to the beginning + * of the executable or shared object file backing the vma + * which the *ip* falls in. It is *not* an offset relative + * to that object's base address. Accordingly, it must be + * adjusted by adding (sh_addr - sh_offset), where + * sh_{addr,offset} correspond to the executable section + * containing *file_offset* in the object, for comparisons + * to symbols' st_value to be valid. + * + * **bpf_get_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * + * Returns + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + */ +static long (*bpf_get_stack)(void *ctx, void *buf, __u32 size, __u64 flags) = (void *) 67; + +/* + * bpf_skb_load_bytes_relative + * + * This helper is similar to **bpf_skb_load_bytes**\ () in that + * it provides an easy way to load *len* bytes from *offset* + * from the packet associated to *skb*, into the buffer pointed + * by *to*. The difference to **bpf_skb_load_bytes**\ () is that + * a fifth argument *start_header* exists in order to select a + * base offset to start from. *start_header* can be one of: + * + * **BPF_HDR_START_MAC** + * Base offset to load data from is *skb*'s mac header. + * **BPF_HDR_START_NET** + * Base offset to load data from is *skb*'s network header. + * + * In general, "direct packet access" is the preferred method to + * access packet data, however, this helper is in particular useful + * in socket filters where *skb*\ **->data** does not always point + * to the start of the mac header and where "direct packet access" + * is not available. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_load_bytes_relative)(const void *skb, __u32 offset, void *to, __u32 len, __u32 start_header) = (void *) 68; + +/* + * bpf_fib_lookup + * + * Do FIB lookup in kernel tables using parameters in *params*. + * If lookup is successful and result shows packet is to be + * forwarded, the neighbor tables are searched for the nexthop. + * If successful (ie., FIB lookup shows forwarding and nexthop + * is resolved), the nexthop address is returned in ipv4_dst + * or ipv6_dst based on family, smac is set to mac address of + * egress device, dmac is set to nexthop mac address, rt_metric + * is set to metric from route (IPv4/IPv6 only), and ifindex + * is set to the device index of the nexthop from the FIB lookup. + * + * *plen* argument is the size of the passed in struct. + * *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_FIB_LOOKUP_DIRECT** + * Do a direct table lookup vs full lookup using FIB + * rules. + * **BPF_FIB_LOOKUP_OUTPUT** + * Perform lookup from an egress perspective (default is + * ingress). + * **BPF_FIB_LOOKUP_SKIP_NEIGH** + * Skip the neighbour table lookup. *params*->dmac + * and *params*->smac will not be set as output. A common + * use case is to call **bpf_redirect_neigh**\ () after + * doing **bpf_fib_lookup**\ (). + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** tc cls_act programs. + * + * Returns + * * < 0 if any input argument is invalid + * * 0 on success (packet is forwarded, nexthop neighbor exists) + * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the + * packet is not forwarded or needs assist from full stack + * + * If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU + * was exceeded and output params->mtu_result contains the MTU. + */ +static long (*bpf_fib_lookup)(void *ctx, struct bpf_fib_lookup *params, int plen, __u32 flags) = (void *) 69; + +/* + * bpf_sock_hash_update + * + * Add an entry to, or update a sockhash *map* referencing sockets. + * The *skops* is used as a new value for the entry associated to + * *key*. *flags* is one of: + * + * **BPF_NOEXIST** + * The entry for *key* must not exist in the map. + * **BPF_EXIST** + * The entry for *key* must already exist in the map. + * **BPF_ANY** + * No condition on the existence of the entry for *key*. + * + * If the *map* has eBPF programs (parser and verdict), those will + * be inherited by the socket being added. If the socket is + * already attached to eBPF programs, this results in an error. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sock_hash_update)(struct bpf_sock_ops *skops, void *map, void *key, __u64 flags) = (void *) 70; + +/* + * bpf_msg_redirect_hash + * + * This helper is used in programs implementing policies at the + * socket level. If the message *msg* is allowed to pass (i.e. if + * the verdict eBPF program returns **SK_PASS**), redirect it to + * the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress path otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_msg_redirect_hash)(struct sk_msg_md *msg, void *map, void *key, __u64 flags) = (void *) 71; + +/* + * bpf_sk_redirect_hash + * + * This helper is used in programs implementing policies at the + * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. + * if the verdict eBPF program returns **SK_PASS**), redirect it + * to the socket referenced by *map* (of type + * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and + * egress interfaces can be used for redirection. The + * **BPF_F_INGRESS** value in *flags* is used to make the + * distinction (ingress path is selected if the flag is present, + * egress otherwise). This is the only flag supported for now. + * + * Returns + * **SK_PASS** on success, or **SK_DROP** on error. + */ +static long (*bpf_sk_redirect_hash)(struct __sk_buff *skb, void *map, void *key, __u64 flags) = (void *) 72; + +/* + * bpf_lwt_push_encap + * + * Encapsulate the packet associated to *skb* within a Layer 3 + * protocol header. This header is provided in the buffer at + * address *hdr*, with *len* its size in bytes. *type* indicates + * the protocol of the header and can be one of: + * + * **BPF_LWT_ENCAP_SEG6** + * IPv6 encapsulation with Segment Routing Header + * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, + * the IPv6 header is computed by the kernel. + * **BPF_LWT_ENCAP_SEG6_INLINE** + * Only works if *skb* contains an IPv6 packet. Insert a + * Segment Routing Header (**struct ipv6_sr_hdr**) inside + * the IPv6 header. + * **BPF_LWT_ENCAP_IP** + * IP encapsulation (GRE/GUE/IPIP/etc). The outer header + * must be IPv4 or IPv6, followed by zero or more + * additional headers, up to **LWT_BPF_MAX_HEADROOM** + * total bytes in all prepended headers. Please note that + * if **skb_is_gso**\ (*skb*) is true, no more than two + * headers can be prepended, and the inner header, if + * present, should be either GRE or UDP/GUE. + * + * **BPF_LWT_ENCAP_SEG6**\ \* types can be called by BPF programs + * of type **BPF_PROG_TYPE_LWT_IN**; **BPF_LWT_ENCAP_IP** type can + * be called by bpf programs of types **BPF_PROG_TYPE_LWT_IN** and + * **BPF_PROG_TYPE_LWT_XMIT**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_push_encap)(struct __sk_buff *skb, __u32 type, void *hdr, __u32 len) = (void *) 73; + +/* + * bpf_lwt_seg6_store_bytes + * + * Store *len* bytes from address *from* into the packet + * associated to *skb*, at *offset*. Only the flags, tag and TLVs + * inside the outermost IPv6 Segment Routing Header can be + * modified through this helper. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_seg6_store_bytes)(struct __sk_buff *skb, __u32 offset, const void *from, __u32 len) = (void *) 74; + +/* + * bpf_lwt_seg6_adjust_srh + * + * Adjust the size allocated to TLVs in the outermost IPv6 + * Segment Routing Header contained in the packet associated to + * *skb*, at position *offset* by *delta* bytes. Only offsets + * after the segments are accepted. *delta* can be as well + * positive (growing) as negative (shrinking). + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_seg6_adjust_srh)(struct __sk_buff *skb, __u32 offset, __s32 delta) = (void *) 75; + +/* + * bpf_lwt_seg6_action + * + * Apply an IPv6 Segment Routing action of type *action* to the + * packet associated to *skb*. Each action takes a parameter + * contained at address *param*, and of length *param_len* bytes. + * *action* can be one of: + * + * **SEG6_LOCAL_ACTION_END_X** + * End.X action: Endpoint with Layer-3 cross-connect. + * Type of *param*: **struct in6_addr**. + * **SEG6_LOCAL_ACTION_END_T** + * End.T action: Endpoint with specific IPv6 table lookup. + * Type of *param*: **int**. + * **SEG6_LOCAL_ACTION_END_B6** + * End.B6 action: Endpoint bound to an SRv6 policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * **SEG6_LOCAL_ACTION_END_B6_ENCAP** + * End.B6.Encap action: Endpoint bound to an SRv6 + * encapsulation policy. + * Type of *param*: **struct ipv6_sr_hdr**. + * + * A call to this helper is susceptible to change the underlying + * packet buffer. Therefore, at load time, all checks on pointers + * previously done by the verifier are invalidated and must be + * performed again, if the helper is used in combination with + * direct packet access. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_lwt_seg6_action)(struct __sk_buff *skb, __u32 action, void *param, __u32 param_len) = (void *) 76; + +/* + * bpf_rc_repeat + * + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded repeat key message. This delays + * the generation of a key up event for previously generated + * key down event. + * + * Some IR protocols like NEC have a special IR message for + * repeating last button, for when a button is held down. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * + * Returns + * 0 + */ +static long (*bpf_rc_repeat)(void *ctx) = (void *) 77; + +/* + * bpf_rc_keydown + * + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded key press with *scancode*, + * *toggle* value in the given *protocol*. The scancode will be + * translated to a keycode using the rc keymap, and reported as + * an input key down event. After a period a key up event is + * generated. This period can be extended by calling either + * **bpf_rc_keydown**\ () again with the same values, or calling + * **bpf_rc_repeat**\ (). + * + * Some protocols include a toggle bit, in case the button was + * released and pressed again between consecutive scancodes. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * The *protocol* is the decoded protocol number (see + * **enum rc_proto** for some predefined values). + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * + * Returns + * 0 + */ +static long (*bpf_rc_keydown)(void *ctx, __u32 protocol, __u64 scancode, __u32 toggle) = (void *) 78; + +/* + * bpf_skb_cgroup_id + * + * Return the cgroup v2 id of the socket associated with the *skb*. + * This is roughly similar to the **bpf_get_cgroup_classid**\ () + * helper for cgroup v1 by providing a tag resp. identifier that + * can be matched on or used for map lookups e.g. to implement + * policy. The cgroup v2 id of a given path in the hierarchy is + * exposed in user space through the f_handle API in order to get + * to the same 64-bit id. + * + * This helper can be used on TC egress path, but not on ingress, + * and is available only if the kernel was compiled with the + * **CONFIG_SOCK_CGROUP_DATA** configuration option. + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_skb_cgroup_id)(struct __sk_buff *skb) = (void *) 79; + +/* + * bpf_get_current_cgroup_id + * + * Get the current cgroup id based on the cgroup within which + * the current task is running. + * + * Returns + * A 64-bit integer containing the current cgroup id based + * on the cgroup within which the current task is running. + */ +static __u64 (*bpf_get_current_cgroup_id)(void) = (void *) 80; + +/* + * bpf_get_local_storage + * + * Get the pointer to the local storage area. + * The type and the size of the local storage is defined + * by the *map* argument. + * The *flags* meaning is specific for each map type, + * and has to be 0 for cgroup local storage. + * + * Depending on the BPF program type, a local storage area + * can be shared between multiple instances of the BPF program, + * running simultaneously. + * + * A user should care about the synchronization by himself. + * For example, by using the **BPF_ATOMIC** instructions to alter + * the shared data. + * + * Returns + * A pointer to the local storage area. + */ +static void *(*bpf_get_local_storage)(void *map, __u64 flags) = (void *) 81; + +/* + * bpf_sk_select_reuseport + * + * Select a **SO_REUSEPORT** socket from a + * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*. + * It checks the selected socket is matching the incoming + * request in the socket buffer. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sk_select_reuseport)(struct sk_reuseport_md *reuse, void *map, void *key, __u64 flags) = (void *) 82; + +/* + * bpf_skb_ancestor_cgroup_id + * + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *skb* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *skb*, then return value will be same as that + * of **bpf_skb_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *skb*. + * + * The format of returned id and helper limitations are same as in + * **bpf_skb_cgroup_id**\ (). + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_skb_ancestor_cgroup_id)(struct __sk_buff *skb, int ancestor_level) = (void *) 83; + +/* + * bpf_sk_lookup_tcp + * + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * + * Returns + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + */ +static struct bpf_sock *(*bpf_sk_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 84; + +/* + * bpf_sk_lookup_udp + * + * Look for UDP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * The *ctx* should point to the context of the program, such as + * the skb or socket (depending on the hook in use). This is used + * to determine the base network namespace for the lookup. + * + * *tuple_size* must be one of: + * + * **sizeof**\ (*tuple*\ **->ipv4**) + * Look for an IPv4 socket. + * **sizeof**\ (*tuple*\ **->ipv6**) + * Look for an IPv6 socket. + * + * If the *netns* is a negative signed 32-bit integer, then the + * socket lookup table in the netns associated with the *ctx* + * will be used. For the TC hooks, this is the netns of the device + * in the skb. For socket hooks, this is the netns of the socket. + * If *netns* is any other signed 32-bit value greater than or + * equal to zero then it specifies the ID of the netns relative to + * the netns associated with the *ctx*. *netns* values beyond the + * range of 32-bit integers are reserved for future use. + * + * All values for *flags* are reserved for future usage, and must + * be left at zero. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * + * Returns + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + */ +static struct bpf_sock *(*bpf_sk_lookup_udp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 85; + +/* + * bpf_sk_release + * + * Release the reference held by *sock*. *sock* must be a + * non-**NULL** pointer that was returned from + * **bpf_sk_lookup_xxx**\ (). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_sk_release)(void *sock) = (void *) 86; + +/* + * bpf_map_push_elem + * + * Push an element *value* in *map*. *flags* is one of: + * + * **BPF_EXIST** + * If the queue/stack is full, the oldest element is + * removed to make room for this. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_push_elem)(void *map, const void *value, __u64 flags) = (void *) 87; + +/* + * bpf_map_pop_elem + * + * Pop an element from *map*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_pop_elem)(void *map, void *value) = (void *) 88; + +/* + * bpf_map_peek_elem + * + * Get an element from *map* without removing it. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_map_peek_elem)(void *map, void *value) = (void *) 89; + +/* + * bpf_msg_push_data + * + * For socket policies, insert *len* bytes into *msg* at offset + * *start*. + * + * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a + * *msg* it may want to insert metadata or options into the *msg*. + * This can later be read and used by any of the lower layer BPF + * hooks. + * + * This helper may fail if under memory pressure (a malloc + * fails) in these cases BPF programs will get an appropriate + * error and BPF programs will need to handle them. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_msg_push_data)(struct sk_msg_md *msg, __u32 start, __u32 len, __u64 flags) = (void *) 90; + +/* + * bpf_msg_pop_data + * + * Will remove *len* bytes from a *msg* starting at byte *start*. + * This may result in **ENOMEM** errors under certain situations if + * an allocation and copy are required due to a full ring buffer. + * However, the helper will try to avoid doing the allocation + * if possible. Other errors can occur if input parameters are + * invalid either due to *start* byte not being valid part of *msg* + * payload and/or *pop* value being to large. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_msg_pop_data)(struct sk_msg_md *msg, __u32 start, __u32 len, __u64 flags) = (void *) 91; + +/* + * bpf_rc_pointer_rel + * + * This helper is used in programs implementing IR decoding, to + * report a successfully decoded pointer movement. + * + * The *ctx* should point to the lirc sample as passed into + * the program. + * + * This helper is only available is the kernel was compiled with + * the **CONFIG_BPF_LIRC_MODE2** configuration option set to + * "**y**". + * + * Returns + * 0 + */ +static long (*bpf_rc_pointer_rel)(void *ctx, __s32 rel_x, __s32 rel_y) = (void *) 92; + +/* + * bpf_spin_lock + * + * Acquire a spinlock represented by the pointer *lock*, which is + * stored as part of a value of a map. Taking the lock allows to + * safely update the rest of the fields in that value. The + * spinlock can (and must) later be released with a call to + * **bpf_spin_unlock**\ (\ *lock*\ ). + * + * Spinlocks in BPF programs come with a number of restrictions + * and constraints: + * + * * **bpf_spin_lock** objects are only allowed inside maps of + * types **BPF_MAP_TYPE_HASH** and **BPF_MAP_TYPE_ARRAY** (this + * list could be extended in the future). + * * BTF description of the map is mandatory. + * * The BPF program can take ONE lock at a time, since taking two + * or more could cause dead locks. + * * Only one **struct bpf_spin_lock** is allowed per map element. + * * When the lock is taken, calls (either BPF to BPF or helpers) + * are not allowed. + * * The **BPF_LD_ABS** and **BPF_LD_IND** instructions are not + * allowed inside a spinlock-ed region. + * * The BPF program MUST call **bpf_spin_unlock**\ () to release + * the lock, on all execution paths, before it returns. + * * The BPF program can access **struct bpf_spin_lock** only via + * the **bpf_spin_lock**\ () and **bpf_spin_unlock**\ () + * helpers. Loading or storing data into the **struct + * bpf_spin_lock** *lock*\ **;** field of a map is not allowed. + * * To use the **bpf_spin_lock**\ () helper, the BTF description + * of the map value must be a struct and have **struct + * bpf_spin_lock** *anyname*\ **;** field at the top level. + * Nested lock inside another struct is not allowed. + * * The **struct bpf_spin_lock** *lock* field in a map value must + * be aligned on a multiple of 4 bytes in that value. + * * Syscall with command **BPF_MAP_LOOKUP_ELEM** does not copy + * the **bpf_spin_lock** field to user space. + * * Syscall with command **BPF_MAP_UPDATE_ELEM**, or update from + * a BPF program, do not update the **bpf_spin_lock** field. + * * **bpf_spin_lock** cannot be on the stack or inside a + * networking packet (it can only be inside of a map values). + * * **bpf_spin_lock** is available to root only. + * * Tracing programs and socket filter programs cannot use + * **bpf_spin_lock**\ () due to insufficient preemption checks + * (but this may change in the future). + * * **bpf_spin_lock** is not allowed in inner maps of map-in-map. + * + * Returns + * 0 + */ +static long (*bpf_spin_lock)(struct bpf_spin_lock *lock) = (void *) 93; + +/* + * bpf_spin_unlock + * + * Release the *lock* previously locked by a call to + * **bpf_spin_lock**\ (\ *lock*\ ). + * + * Returns + * 0 + */ +static long (*bpf_spin_unlock)(struct bpf_spin_lock *lock) = (void *) 94; + +/* + * bpf_sk_fullsock + * + * This helper gets a **struct bpf_sock** pointer such + * that all the fields in this **bpf_sock** can be accessed. + * + * Returns + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + */ +static struct bpf_sock *(*bpf_sk_fullsock)(struct bpf_sock *sk) = (void *) 95; + +/* + * bpf_tcp_sock + * + * This helper gets a **struct bpf_tcp_sock** pointer from a + * **struct bpf_sock** pointer. + * + * Returns + * A **struct bpf_tcp_sock** pointer on success, or **NULL** in + * case of failure. + */ +static struct bpf_tcp_sock *(*bpf_tcp_sock)(struct bpf_sock *sk) = (void *) 96; + +/* + * bpf_skb_ecn_set_ce + * + * Set ECN (Explicit Congestion Notification) field of IP header + * to **CE** (Congestion Encountered) if current value is **ECT** + * (ECN Capable Transport). Otherwise, do nothing. Works with IPv6 + * and IPv4. + * + * Returns + * 1 if the **CE** flag is set (either by the current helper call + * or because it was already present), 0 if it is not set. + */ +static long (*bpf_skb_ecn_set_ce)(struct __sk_buff *skb) = (void *) 97; + +/* + * bpf_get_listener_sock + * + * Return a **struct bpf_sock** pointer in **TCP_LISTEN** state. + * **bpf_sk_release**\ () is unnecessary and not allowed. + * + * Returns + * A **struct bpf_sock** pointer on success, or **NULL** in + * case of failure. + */ +static struct bpf_sock *(*bpf_get_listener_sock)(struct bpf_sock *sk) = (void *) 98; + +/* + * bpf_skc_lookup_tcp + * + * Look for TCP socket matching *tuple*, optionally in a child + * network namespace *netns*. The return value must be checked, + * and if non-**NULL**, released via **bpf_sk_release**\ (). + * + * This function is identical to **bpf_sk_lookup_tcp**\ (), except + * that it also returns timewait or request sockets. Use + * **bpf_sk_fullsock**\ () or **bpf_tcp_sock**\ () to access the + * full structure. + * + * This helper is available only if the kernel was compiled with + * **CONFIG_NET** configuration option. + * + * Returns + * Pointer to **struct bpf_sock**, or **NULL** in case of failure. + * For sockets with reuseport option, the **struct bpf_sock** + * result is from *reuse*\ **->socks**\ [] using the hash of the + * tuple. + */ +static struct bpf_sock *(*bpf_skc_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 99; + +/* + * bpf_tcp_check_syncookie + * + * Check whether *iph* and *th* contain a valid SYN cookie ACK for + * the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative + * error otherwise. + */ +static long (*bpf_tcp_check_syncookie)(void *sk, void *iph, __u32 iph_len, struct tcphdr *th, __u32 th_len) = (void *) 100; + +/* + * bpf_sysctl_get_name + * + * Get name of sysctl in /proc/sys/ and copy it into provided by + * program buffer *buf* of size *buf_len*. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * If *flags* is zero, full name (e.g. "net/ipv4/tcp_mem") is + * copied. Use **BPF_F_SYSCTL_BASE_NAME** flag to copy base name + * only (e.g. "tcp_mem"). + * + * Returns + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + */ +static long (*bpf_sysctl_get_name)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len, __u64 flags) = (void *) 101; + +/* + * bpf_sysctl_get_current_value + * + * Get current value of sysctl as it is presented in /proc/sys + * (incl. newline, etc), and copy it as a string into provided + * by program buffer *buf* of size *buf_len*. + * + * The whole value is copied, no matter what file position user + * space issued e.g. sys_read at. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * Returns + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if current value was unavailable, e.g. because + * sysctl is uninitialized and read returns -EIO for it. + */ +static long (*bpf_sysctl_get_current_value)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len) = (void *) 102; + +/* + * bpf_sysctl_get_new_value + * + * Get new value being written by user space to sysctl (before + * the actual write happens) and copy it as a string into + * provided by program buffer *buf* of size *buf_len*. + * + * User space may write new value at file position > 0. + * + * The buffer is always NUL terminated, unless it's zero-sized. + * + * Returns + * Number of character copied (not including the trailing NUL). + * + * **-E2BIG** if the buffer wasn't big enough (*buf* will contain + * truncated name in this case). + * + * **-EINVAL** if sysctl is being read. + */ +static long (*bpf_sysctl_get_new_value)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len) = (void *) 103; + +/* + * bpf_sysctl_set_new_value + * + * Override new value being written by user space to sysctl with + * value provided by program in buffer *buf* of size *buf_len*. + * + * *buf* should contain a string in same form as provided by user + * space on sysctl write. + * + * User space may write new value at file position > 0. To override + * the whole sysctl value file position should be set to zero. + * + * Returns + * 0 on success. + * + * **-E2BIG** if the *buf_len* is too big. + * + * **-EINVAL** if sysctl is being read. + */ +static long (*bpf_sysctl_set_new_value)(struct bpf_sysctl *ctx, const char *buf, unsigned long buf_len) = (void *) 104; + +/* + * bpf_strtol + * + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to a long integer according to the given base + * and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)) followed by a single + * optional '**-**' sign. + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtol**\ (3). + * + * Returns + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + */ +static long (*bpf_strtol)(const char *buf, unsigned long buf_len, __u64 flags, long *res) = (void *) 105; + +/* + * bpf_strtoul + * + * Convert the initial part of the string from buffer *buf* of + * size *buf_len* to an unsigned long integer according to the + * given base and save the result in *res*. + * + * The string may begin with an arbitrary amount of white space + * (as determined by **isspace**\ (3)). + * + * Five least significant bits of *flags* encode base, other bits + * are currently unused. + * + * Base must be either 8, 10, 16 or 0 to detect it automatically + * similar to user space **strtoul**\ (3). + * + * Returns + * Number of characters consumed on success. Must be positive but + * no more than *buf_len*. + * + * **-EINVAL** if no valid digits were found or unsupported base + * was provided. + * + * **-ERANGE** if resulting value was out of range. + */ +static long (*bpf_strtoul)(const char *buf, unsigned long buf_len, __u64 flags, unsigned long *res) = (void *) 106; + +/* + * bpf_sk_storage_get + * + * Get a bpf-local-storage from a *sk*. + * + * Logically, it could be thought of getting the value from + * a *map* with *sk* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *sk*) except this + * helper enforces the key must be a full socket and the map must + * be a **BPF_MAP_TYPE_SK_STORAGE** also. + * + * Underneath, the value is stored locally at *sk* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf-local-storages residing at *sk*. + * + * *sk* is a kernel **struct sock** pointer for LSM program. + * *sk* is a **struct bpf_sock** pointer for other program types. + * + * An optional *flags* (**BPF_SK_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf-local-storage will be + * created if one does not exist. *value* can be used + * together with **BPF_SK_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf-local-storage. If *value* is + * **NULL**, the new bpf-local-storage will be zero initialized. + * + * Returns + * A bpf-local-storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf-local-storage. + */ +static void *(*bpf_sk_storage_get)(void *map, void *sk, void *value, __u64 flags) = (void *) 107; + +/* + * bpf_sk_storage_delete + * + * Delete a bpf-local-storage from a *sk*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf-local-storage cannot be found. + * **-EINVAL** if sk is not a fullsock (e.g. a request_sock). + */ +static long (*bpf_sk_storage_delete)(void *map, void *sk) = (void *) 108; + +/* + * bpf_send_signal + * + * Send signal *sig* to the process of the current task. + * The signal may be delivered to any of this process's threads. + * + * Returns + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + */ +static long (*bpf_send_signal)(__u32 sig) = (void *) 109; + +/* + * bpf_tcp_gen_syncookie + * + * Try to issue a SYN cookie for the packet with corresponding + * IP/TCP headers, *iph* and *th*, on the listening socket in *sk*. + * + * *iph* points to the start of the IPv4 or IPv6 header, while + * *iph_len* contains **sizeof**\ (**struct iphdr**) or + * **sizeof**\ (**struct ipv6hdr**). + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header with options (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** SYN cookie cannot be issued due to error + * + * **-ENOENT** SYN cookie should not be issued (no SYN flood) + * + * **-EOPNOTSUPP** kernel configuration does not enable SYN cookies + * + * **-EPROTONOSUPPORT** IP packet version is not 4 or 6 + */ +static __s64 (*bpf_tcp_gen_syncookie)(void *sk, void *iph, __u32 iph_len, struct tcphdr *th, __u32 th_len) = (void *) 110; + +/* + * bpf_skb_output + * + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct sk_buff. + * + * This helper is similar to **bpf_perf_event_output**\ () but + * restricted to raw_tracepoint bpf programs. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_skb_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 111; + +/* + * bpf_probe_read_user + * + * Safely attempt to read *size* bytes from user space address + * *unsafe_ptr* and store the data in *dst*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_read_user)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 112; + +/* + * bpf_probe_read_kernel + * + * Safely attempt to read *size* bytes from kernel space address + * *unsafe_ptr* and store the data in *dst*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_probe_read_kernel)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 113; + +/* + * bpf_probe_read_user_str + * + * Copy a NUL terminated string from an unsafe user address + * *unsafe_ptr* to *dst*. The *size* should include the + * terminating NUL byte. In case the string length is smaller than + * *size*, the target is not padded with further NUL bytes. If the + * string length is larger than *size*, just *size*-1 bytes are + * copied and the last byte is set to NUL. + * + * On success, returns the number of bytes that were written, + * including the terminal NUL. This makes this helper useful in + * tracing programs for reading strings, and more importantly to + * get its length at runtime. See the following snippet: + * + * :: + * + * SEC("kprobe/sys_open") + * void bpf_sys_open(struct pt_regs *ctx) + * { + * char buf[PATHLEN]; // PATHLEN is defined to 256 + * int res = bpf_probe_read_user_str(buf, sizeof(buf), + * ctx->di); + * + * // Consume buf, for example push it to + * // userspace via bpf_perf_event_output(); we + * // can use res (the string length) as event + * // size, after checking its boundaries. + * } + * + * In comparison, using **bpf_probe_read_user**\ () helper here + * instead to read the string would require to estimate the length + * at compile time, and would often result in copying more memory + * than necessary. + * + * Another useful use case is when parsing individual process + * arguments or individual environment variables navigating + * *current*\ **->mm->arg_start** and *current*\ + * **->mm->env_start**: using this helper and the return value, + * one can quickly iterate at the right offset of the memory area. + * + * Returns + * On success, the strictly positive length of the output string, + * including the trailing NUL character. On error, a negative + * value. + */ +static long (*bpf_probe_read_user_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 114; + +/* + * bpf_probe_read_kernel_str + * + * Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr* + * to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply. + * + * Returns + * On success, the strictly positive length of the string, including + * the trailing NUL character. On error, a negative value. + */ +static long (*bpf_probe_read_kernel_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 115; + +/* + * bpf_tcp_send_ack + * + * Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**. + * *rcv_nxt* is the ack_seq to be sent out. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_tcp_send_ack)(void *tp, __u32 rcv_nxt) = (void *) 116; + +/* + * bpf_send_signal_thread + * + * Send signal *sig* to the thread corresponding to the current task. + * + * Returns + * 0 on success or successfully queued. + * + * **-EBUSY** if work queue under nmi is full. + * + * **-EINVAL** if *sig* is invalid. + * + * **-EPERM** if no permission to send the *sig*. + * + * **-EAGAIN** if bpf program can try again. + */ +static long (*bpf_send_signal_thread)(__u32 sig) = (void *) 117; + +/* + * bpf_jiffies64 + * + * Obtain the 64bit jiffies + * + * Returns + * The 64 bit jiffies + */ +static __u64 (*bpf_jiffies64)(void) = (void *) 118; + +/* + * bpf_read_branch_records + * + * For an eBPF program attached to a perf event, retrieve the + * branch records (**struct perf_branch_entry**) associated to *ctx* + * and store it in the buffer pointed by *buf* up to size + * *size* bytes. + * + * Returns + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to + * instead return the number of bytes required to store all the + * branch entries. If this flag is set, *buf* may be NULL. + * + * **-EINVAL** if arguments invalid or **size** not a multiple + * of **sizeof**\ (**struct perf_branch_entry**\ ). + * + * **-ENOENT** if architecture does not support branch records. + */ +static long (*bpf_read_branch_records)(struct bpf_perf_event_data *ctx, void *buf, __u32 size, __u64 flags) = (void *) 119; + +/* + * bpf_get_ns_current_pid_tgid + * + * Returns 0 on success, values for *pid* and *tgid* as seen from the current + * *namespace* will be returned in *nsdata*. + * + * Returns + * 0 on success, or one of the following in case of failure: + * + * **-EINVAL** if dev and inum supplied don't match dev_t and inode number + * with nsfs of current task, or if dev conversion to dev_t lost high bits. + * + * **-ENOENT** if pidns does not exists for the current task. + */ +static long (*bpf_get_ns_current_pid_tgid)(__u64 dev, __u64 ino, struct bpf_pidns_info *nsdata, __u32 size) = (void *) 120; + +/* + * bpf_xdp_output + * + * Write raw *data* blob into a special BPF perf event held by + * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf + * event must have the following attributes: **PERF_SAMPLE_RAW** + * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and + * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. + * + * The *flags* are used to indicate the index in *map* for which + * the value must be put, masked with **BPF_F_INDEX_MASK**. + * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** + * to indicate that the index of the current CPU core should be + * used. + * + * The value to write, of *size*, is passed through eBPF stack and + * pointed by *data*. + * + * *ctx* is a pointer to in-kernel struct xdp_buff. + * + * This helper is similar to **bpf_perf_eventoutput**\ () but + * restricted to raw_tracepoint bpf programs. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 121; + +/* + * bpf_get_netns_cookie + * + * Retrieve the cookie (generated by the kernel) of the network + * namespace the input *ctx* is associated with. The network + * namespace cookie remains stable for its lifetime and provides + * a global identifier that can be assumed unique. If *ctx* is + * NULL, then the helper returns the cookie for the initial + * network namespace. The cookie itself is very similar to that + * of **bpf_get_socket_cookie**\ () helper, but for network + * namespaces instead of sockets. + * + * Returns + * A 8-byte long opaque number. + */ +static __u64 (*bpf_get_netns_cookie)(void *ctx) = (void *) 122; + +/* + * bpf_get_current_ancestor_cgroup_id + * + * Return id of cgroup v2 that is ancestor of the cgroup associated + * with the current task at the *ancestor_level*. The root cgroup + * is at *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with the current task, then return value will be the + * same as that of **bpf_get_current_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with the current task. + * + * The format of returned id and helper limitations are same as in + * **bpf_get_current_cgroup_id**\ (). + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_get_current_ancestor_cgroup_id)(int ancestor_level) = (void *) 123; + +/* + * bpf_sk_assign + * + * Helper is overloaded depending on BPF program type. This + * description applies to **BPF_PROG_TYPE_SCHED_CLS** and + * **BPF_PROG_TYPE_SCHED_ACT** programs. + * + * Assign the *sk* to the *skb*. When combined with appropriate + * routing configuration to receive the packet towards the socket, + * will cause *skb* to be delivered to the specified socket. + * Subsequent redirection of *skb* via **bpf_redirect**\ (), + * **bpf_clone_redirect**\ () or other methods outside of BPF may + * interfere with successful delivery to the socket. + * + * This operation is only valid from TC ingress path. + * + * The *flags* argument must be zero. + * + * Returns + * 0 on success, or a negative error in case of failure: + * + * **-EINVAL** if specified *flags* are not supported. + * + * **-ENOENT** if the socket is unavailable for assignment. + * + * **-ENETUNREACH** if the socket is unreachable (wrong netns). + * + * **-EOPNOTSUPP** if the operation is not supported, for example + * a call from outside of TC ingress. + * + * **-ESOCKTNOSUPPORT** if the socket type is not supported + * (reuseport). + */ +static long (*bpf_sk_assign)(void *ctx, void *sk, __u64 flags) = (void *) 124; + +/* + * bpf_ktime_get_boot_ns + * + * Return the time elapsed since system boot, in nanoseconds. + * Does include the time the system was suspended. + * See: **clock_gettime**\ (**CLOCK_BOOTTIME**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_boot_ns)(void) = (void *) 125; + +/* + * bpf_seq_printf + * + * **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print + * out the format string. + * The *m* represents the seq_file. The *fmt* and *fmt_size* are for + * the format string itself. The *data* and *data_len* are format string + * arguments. The *data* are a **u64** array and corresponding format string + * values are stored in the array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* array. + * The *data_len* is the size of *data* in bytes - must be a multiple of 8. + * + * Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory. + * Reading kernel memory may fail due to either invalid address or + * valid address but requiring a major memory fault. If reading kernel memory + * fails, the string for **%s** will be an empty string, and the ip + * address for **%p{i,I}{4,6}** will be 0. Not returning error to + * bpf program is consistent with what **bpf_trace_printk**\ () does for now. + * + * Returns + * 0 on success, or a negative error in case of failure: + * + * **-EBUSY** if per-CPU memory copy buffer is busy, can try again + * by returning 1 from bpf program. + * + * **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported. + * + * **-E2BIG** if *fmt* contains too many format specifiers. + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + */ +static long (*bpf_seq_printf)(struct seq_file *m, const char *fmt, __u32 fmt_size, const void *data, __u32 data_len) = (void *) 126; + +/* + * bpf_seq_write + * + * **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data. + * The *m* represents the seq_file. The *data* and *len* represent the + * data to write in bytes. + * + * Returns + * 0 on success, or a negative error in case of failure: + * + * **-EOVERFLOW** if an overflow happened: The same object will be tried again. + */ +static long (*bpf_seq_write)(struct seq_file *m, const void *data, __u32 len) = (void *) 127; + +/* + * bpf_sk_cgroup_id + * + * Return the cgroup v2 id of the socket *sk*. + * + * *sk* must be a non-**NULL** pointer to a socket, e.g. one + * returned from **bpf_sk_lookup_xxx**\ (), + * **bpf_sk_fullsock**\ (), etc. The format of returned id is + * same as in **bpf_skb_cgroup_id**\ (). + * + * This helper is available only if the kernel was compiled with + * the **CONFIG_SOCK_CGROUP_DATA** configuration option. + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_sk_cgroup_id)(void *sk) = (void *) 128; + +/* + * bpf_sk_ancestor_cgroup_id + * + * Return id of cgroup v2 that is ancestor of cgroup associated + * with the *sk* at the *ancestor_level*. The root cgroup is at + * *ancestor_level* zero and each step down the hierarchy + * increments the level. If *ancestor_level* == level of cgroup + * associated with *sk*, then return value will be same as that + * of **bpf_sk_cgroup_id**\ (). + * + * The helper is useful to implement policies based on cgroups + * that are upper in hierarchy than immediate cgroup associated + * with *sk*. + * + * The format of returned id and helper limitations are same as in + * **bpf_sk_cgroup_id**\ (). + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_sk_ancestor_cgroup_id)(void *sk, int ancestor_level) = (void *) 129; + +/* + * bpf_ringbuf_output + * + * Copy *size* bytes from *data* into a ring buffer *ringbuf*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * An adaptive notification is a notification sent whenever the user-space + * process has caught up and consumed all available payloads. In case the user-space + * process is still processing a previous payload, then no notification is needed + * as it will process the newly added payload automatically. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_ringbuf_output)(void *ringbuf, void *data, __u64 size, __u64 flags) = (void *) 130; + +/* + * bpf_ringbuf_reserve + * + * Reserve *size* bytes of payload in a ring buffer *ringbuf*. + * *flags* must be 0. + * + * Returns + * Valid pointer with *size* bytes of memory available; NULL, + * otherwise. + */ +static void *(*bpf_ringbuf_reserve)(void *ringbuf, __u64 size, __u64 flags) = (void *) 131; + +/* + * bpf_ringbuf_submit + * + * Submit reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_submit)(void *data, __u64 flags) = (void *) 132; + +/* + * bpf_ringbuf_discard + * + * Discard reserved ring buffer sample, pointed to by *data*. + * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification + * of new data availability is sent. + * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification + * of new data availability is sent unconditionally. + * If **0** is specified in *flags*, an adaptive notification + * of new data availability is sent. + * + * See 'bpf_ringbuf_output()' for the definition of adaptive notification. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_discard)(void *data, __u64 flags) = (void *) 133; + +/* + * bpf_ringbuf_query + * + * Query various characteristics of provided ring buffer. What + * exactly is queries is determined by *flags*: + * + * * **BPF_RB_AVAIL_DATA**: Amount of data not yet consumed. + * * **BPF_RB_RING_SIZE**: The size of ring buffer. + * * **BPF_RB_CONS_POS**: Consumer position (can wrap around). + * * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around). + * + * Data returned is just a momentary snapshot of actual values + * and could be inaccurate, so this facility should be used to + * power heuristics and for reporting, not to make 100% correct + * calculation. + * + * Returns + * Requested value, or 0, if *flags* are not recognized. + */ +static __u64 (*bpf_ringbuf_query)(void *ringbuf, __u64 flags) = (void *) 134; + +/* + * bpf_csum_level + * + * Change the skbs checksum level by one layer up or down, or + * reset it entirely to none in order to have the stack perform + * checksum validation. The level is applicable to the following + * protocols: TCP, UDP, GRE, SCTP, FCOE. For example, a decap of + * | ETH | IP | UDP | GUE | IP | TCP | into | ETH | IP | TCP | + * through **bpf_skb_adjust_room**\ () helper with passing in + * **BPF_F_ADJ_ROOM_NO_CSUM_RESET** flag would require one call + * to **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_DEC** since + * the UDP header is removed. Similarly, an encap of the latter + * into the former could be accompanied by a helper call to + * **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_INC** if the + * skb is still intended to be processed in higher layers of the + * stack instead of just egressing at tc. + * + * There are three supported level settings at this time: + * + * * **BPF_CSUM_LEVEL_INC**: Increases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_DEC**: Decreases skb->csum_level for skbs + * with CHECKSUM_UNNECESSARY. + * * **BPF_CSUM_LEVEL_RESET**: Resets skb->csum_level to 0 and + * sets CHECKSUM_NONE to force checksum validation by the stack. + * * **BPF_CSUM_LEVEL_QUERY**: No-op, returns the current + * skb->csum_level. + * + * Returns + * 0 on success, or a negative error in case of failure. In the + * case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level + * is returned or the error code -EACCES in case the skb is not + * subject to CHECKSUM_UNNECESSARY. + */ +static long (*bpf_csum_level)(struct __sk_buff *skb, __u64 level) = (void *) 135; + +/* + * bpf_skc_to_tcp6_sock + * + * Dynamically cast a *sk* pointer to a *tcp6_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp6_sock *(*bpf_skc_to_tcp6_sock)(void *sk) = (void *) 136; + +/* + * bpf_skc_to_tcp_sock + * + * Dynamically cast a *sk* pointer to a *tcp_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp_sock *(*bpf_skc_to_tcp_sock)(void *sk) = (void *) 137; + +/* + * bpf_skc_to_tcp_timewait_sock + * + * Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp_timewait_sock *(*bpf_skc_to_tcp_timewait_sock)(void *sk) = (void *) 138; + +/* + * bpf_skc_to_tcp_request_sock + * + * Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct tcp_request_sock *(*bpf_skc_to_tcp_request_sock)(void *sk) = (void *) 139; + +/* + * bpf_skc_to_udp6_sock + * + * Dynamically cast a *sk* pointer to a *udp6_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct udp6_sock *(*bpf_skc_to_udp6_sock)(void *sk) = (void *) 140; + +/* + * bpf_get_task_stack + * + * Return a user or a kernel stack in bpf program provided buffer. + * To achieve this, the helper needs *task*, which is a valid + * pointer to **struct task_struct**. To store the stacktrace, the + * bpf program provides *buf* with a nonnegative *size*. + * + * The last argument, *flags*, holds the number of stack frames to + * skip (from 0 to 255), masked with + * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set + * the following flags: + * + * **BPF_F_USER_STACK** + * Collect a user space stack instead of a kernel stack. + * **BPF_F_USER_BUILD_ID** + * Collect buildid+offset instead of ips for user stack, + * only valid if **BPF_F_USER_STACK** is also specified. + * + * **bpf_get_task_stack**\ () can collect up to + * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject + * to sufficient large buffer size. Note that + * this limit can be controlled with the **sysctl** program, and + * that it should be manually increased in order to profile long + * user stacks (such as stacks for Java programs). To do so, use: + * + * :: + * + * # sysctl kernel.perf_event_max_stack= + * + * Returns + * The non-negative copied *buf* length equal to or less than + * *size* on success, or a negative error in case of failure. + */ +static long (*bpf_get_task_stack)(struct task_struct *task, void *buf, __u32 size, __u64 flags) = (void *) 141; + +/* + * bpf_load_hdr_opt + * + * Load header option. Support reading a particular TCP header + * option for bpf program (**BPF_PROG_TYPE_SOCK_OPS**). + * + * If *flags* is 0, it will search the option from the + * *skops*\ **->skb_data**. The comment in **struct bpf_sock_ops** + * has details on what skb_data contains under different + * *skops*\ **->op**. + * + * The first byte of the *searchby_res* specifies the + * kind that it wants to search. + * + * If the searching kind is an experimental kind + * (i.e. 253 or 254 according to RFC6994). It also + * needs to specify the "magic" which is either + * 2 bytes or 4 bytes. It then also needs to + * specify the size of the magic by using + * the 2nd byte which is "kind-length" of a TCP + * header option and the "kind-length" also + * includes the first 2 bytes "kind" and "kind-length" + * itself as a normal TCP header option also does. + * + * For example, to search experimental kind 254 with + * 2 byte magic 0xeB9F, the searchby_res should be + * [ 254, 4, 0xeB, 0x9F, 0, 0, .... 0 ]. + * + * To search for the standard window scale option (3), + * the *searchby_res* should be [ 3, 0, 0, .... 0 ]. + * Note, kind-length must be 0 for regular option. + * + * Searching for No-Op (0) and End-of-Option-List (1) are + * not supported. + * + * *len* must be at least 2 bytes which is the minimal size + * of a header option. + * + * Supported flags: + * + * * **BPF_LOAD_HDR_OPT_TCP_SYN** to search from the + * saved_syn packet or the just-received syn packet. + * + * + * Returns + * > 0 when found, the header option is copied to *searchby_res*. + * The return value is the total length copied. On failure, a + * negative error code is returned: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOMSG** if the option is not found. + * + * **-ENOENT** if no syn packet is available when + * **BPF_LOAD_HDR_OPT_TCP_SYN** is used. + * + * **-ENOSPC** if there is not enough space. Only *len* number of + * bytes are copied. + * + * **-EFAULT** on failure to parse the header options in the + * packet. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + */ +static long (*bpf_load_hdr_opt)(struct bpf_sock_ops *skops, void *searchby_res, __u32 len, __u64 flags) = (void *) 142; + +/* + * bpf_store_hdr_opt + * + * Store header option. The data will be copied + * from buffer *from* with length *len* to the TCP header. + * + * The buffer *from* should have the whole option that + * includes the kind, kind-length, and the actual + * option data. The *len* must be at least kind-length + * long. The kind-length does not have to be 4 byte + * aligned. The kernel will take care of the padding + * and setting the 4 bytes aligned value to th->doff. + * + * This helper will check for duplicated option + * by searching the same option in the outgoing skb. + * + * This helper can only be called during + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * + * Returns + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** If param is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * Nothing has been written + * + * **-EEXIST** if the option already exists. + * + * **-EFAULT** on failure to parse the existing header options. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + */ +static long (*bpf_store_hdr_opt)(struct bpf_sock_ops *skops, const void *from, __u32 len, __u64 flags) = (void *) 143; + +/* + * bpf_reserve_hdr_opt + * + * Reserve *len* bytes for the bpf header option. The + * space will be used by **bpf_store_hdr_opt**\ () later in + * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. + * + * If **bpf_reserve_hdr_opt**\ () is called multiple times, + * the total number of bytes will be reserved. + * + * This helper can only be called during + * **BPF_SOCK_OPS_HDR_OPT_LEN_CB**. + * + * + * Returns + * 0 on success, or negative error in case of failure: + * + * **-EINVAL** if a parameter is invalid. + * + * **-ENOSPC** if there is not enough space in the header. + * + * **-EPERM** if the helper cannot be used under the current + * *skops*\ **->op**. + */ +static long (*bpf_reserve_hdr_opt)(struct bpf_sock_ops *skops, __u32 len, __u64 flags) = (void *) 144; + +/* + * bpf_inode_storage_get + * + * Get a bpf_local_storage from an *inode*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *inode* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *inode*) except this + * helper enforces the key must be an inode and the map must also + * be a **BPF_MAP_TYPE_INODE_STORAGE**. + * + * Underneath, the value is stored locally at *inode* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *inode*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * + * Returns + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + */ +static void *(*bpf_inode_storage_get)(void *map, void *inode, void *value, __u64 flags) = (void *) 145; + +/* + * bpf_inode_storage_delete + * + * Delete a bpf_local_storage from an *inode*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +static int (*bpf_inode_storage_delete)(void *map, void *inode) = (void *) 146; + +/* + * bpf_d_path + * + * Return full path for given **struct path** object, which + * needs to be the kernel BTF *path* object. The path is + * returned in the provided buffer *buf* of size *sz* and + * is zero terminated. + * + * + * Returns + * On success, the strictly positive length of the string, + * including the trailing NUL character. On error, a negative + * value. + */ +static long (*bpf_d_path)(struct path *path, char *buf, __u32 sz) = (void *) 147; + +/* + * bpf_copy_from_user + * + * Read *size* bytes from user space address *user_ptr* and store + * the data in *dst*. This is a wrapper of **copy_from_user**\ (). + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_copy_from_user)(void *dst, __u32 size, const void *user_ptr) = (void *) 148; + +/* + * bpf_snprintf_btf + * + * Use BTF to store a string representation of *ptr*->ptr in *str*, + * using *ptr*->type_id. This value should specify the type + * that *ptr*->ptr points to. LLVM __builtin_btf_type_id(type, 1) + * can be used to look up vmlinux BTF type ids. Traversing the + * data structure using BTF, the type information and values are + * stored in the first *str_size* - 1 bytes of *str*. Safe copy of + * the pointer data is carried out to avoid kernel crashes during + * operation. Smaller types can use string space on the stack; + * larger programs can use map data to store the string + * representation. + * + * The string can be subsequently shared with userspace via + * bpf_perf_event_output() or ring buffer interfaces. + * bpf_trace_printk() is to be avoided as it places too small + * a limit on string size to be useful. + * + * *flags* is a combination of + * + * **BTF_F_COMPACT** + * no formatting around type information + * **BTF_F_NONAME** + * no struct/union member names/types + * **BTF_F_PTR_RAW** + * show raw (unobfuscated) pointer values; + * equivalent to printk specifier %px. + * **BTF_F_ZERO** + * show zero-valued struct/union members; they + * are not displayed by default + * + * + * Returns + * The number of bytes that were written (or would have been + * written if output had to be truncated due to string size), + * or a negative error in cases of failure. + */ +static long (*bpf_snprintf_btf)(char *str, __u32 str_size, struct btf_ptr *ptr, __u32 btf_ptr_size, __u64 flags) = (void *) 149; + +/* + * bpf_seq_printf_btf + * + * Use BTF to write to seq_write a string representation of + * *ptr*->ptr, using *ptr*->type_id as per bpf_snprintf_btf(). + * *flags* are identical to those used for bpf_snprintf_btf. + * + * Returns + * 0 on success or a negative error in case of failure. + */ +static long (*bpf_seq_printf_btf)(struct seq_file *m, struct btf_ptr *ptr, __u32 ptr_size, __u64 flags) = (void *) 150; + +/* + * bpf_skb_cgroup_classid + * + * See **bpf_get_cgroup_classid**\ () for the main description. + * This helper differs from **bpf_get_cgroup_classid**\ () in that + * the cgroup v1 net_cls class is retrieved only from the *skb*'s + * associated socket instead of the current process. + * + * Returns + * The id is returned or 0 in case the id could not be retrieved. + */ +static __u64 (*bpf_skb_cgroup_classid)(struct __sk_buff *skb) = (void *) 151; + +/* + * bpf_redirect_neigh + * + * Redirect the packet to another net device of index *ifindex* + * and fill in L2 addresses from neighboring subsystem. This helper + * is somewhat similar to **bpf_redirect**\ (), except that it + * populates L2 addresses as well, meaning, internally, the helper + * relies on the neighbor lookup for the L2 address of the nexthop. + * + * The helper will perform a FIB lookup based on the skb's + * networking header to get the address of the next hop, unless + * this is supplied by the caller in the *params* argument. The + * *plen* argument indicates the len of *params* and should be set + * to 0 if *params* is NULL. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types, and enabled + * for IPv4 and IPv6 protocols. + * + * Returns + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + */ +static long (*bpf_redirect_neigh)(__u32 ifindex, struct bpf_redir_neigh *params, int plen, __u64 flags) = (void *) 152; + +/* + * bpf_per_cpu_ptr + * + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on *cpu*. A ksym is an + * extern variable decorated with '__ksym'. For ksym, there is a + * global var (either static or global) defined of the same name + * in the kernel. The ksym is percpu if the global var is percpu. + * The returned pointer points to the global percpu var on *cpu*. + * + * bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the + * kernel, except that bpf_per_cpu_ptr() may return NULL. This + * happens if *cpu* is larger than nr_cpu_ids. The caller of + * bpf_per_cpu_ptr() must check the returned value. + * + * Returns + * A pointer pointing to the kernel percpu variable on *cpu*, or + * NULL, if *cpu* is invalid. + */ +static void *(*bpf_per_cpu_ptr)(const void *percpu_ptr, __u32 cpu) = (void *) 153; + +/* + * bpf_this_cpu_ptr + * + * Take a pointer to a percpu ksym, *percpu_ptr*, and return a + * pointer to the percpu kernel variable on this cpu. See the + * description of 'ksym' in **bpf_per_cpu_ptr**\ (). + * + * bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in + * the kernel. Different from **bpf_per_cpu_ptr**\ (), it would + * never return NULL. + * + * Returns + * A pointer pointing to the kernel percpu variable on this cpu. + */ +static void *(*bpf_this_cpu_ptr)(const void *percpu_ptr) = (void *) 154; + +/* + * bpf_redirect_peer + * + * Redirect the packet to another net device of index *ifindex*. + * This helper is somewhat similar to **bpf_redirect**\ (), except + * that the redirection happens to the *ifindex*' peer device and + * the netns switch takes place from ingress to ingress without + * going through the CPU's backlog queue. + * + * The *flags* argument is reserved and must be 0. The helper is + * currently only supported for tc BPF program types at the ingress + * hook and for veth device types. The peer device must reside in a + * different network namespace. + * + * Returns + * The helper returns **TC_ACT_REDIRECT** on success or + * **TC_ACT_SHOT** on error. + */ +static long (*bpf_redirect_peer)(__u32 ifindex, __u64 flags) = (void *) 155; + +/* + * bpf_task_storage_get + * + * Get a bpf_local_storage from the *task*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *task* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *task*) except this + * helper enforces the key must be a task_struct and the map must also + * be a **BPF_MAP_TYPE_TASK_STORAGE**. + * + * Underneath, the value is stored locally at *task* instead of + * the *map*. The *map* is used as the bpf-local-storage + * "type". The bpf-local-storage "type" (i.e. the *map*) is + * searched against all bpf_local_storage residing at *task*. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * + * Returns + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + */ +static void *(*bpf_task_storage_get)(void *map, struct task_struct *task, void *value, __u64 flags) = (void *) 156; + +/* + * bpf_task_storage_delete + * + * Delete a bpf_local_storage from a *task*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +static long (*bpf_task_storage_delete)(void *map, struct task_struct *task) = (void *) 157; + +/* + * bpf_get_current_task_btf + * + * Return a BTF pointer to the "current" task. + * This pointer can also be used in helpers that accept an + * *ARG_PTR_TO_BTF_ID* of type *task_struct*. + * + * Returns + * Pointer to the current task. + */ +static struct task_struct *(*bpf_get_current_task_btf)(void) = (void *) 158; + +/* + * bpf_bprm_opts_set + * + * Set or clear certain options on *bprm*: + * + * **BPF_F_BPRM_SECUREEXEC** Set the secureexec bit + * which sets the **AT_SECURE** auxv for glibc. The bit + * is cleared if the flag is not specified. + * + * Returns + * **-EINVAL** if invalid *flags* are passed, zero otherwise. + */ +static long (*bpf_bprm_opts_set)(struct linux_binprm *bprm, __u64 flags) = (void *) 159; + +/* + * bpf_ktime_get_coarse_ns + * + * Return a coarse-grained version of the time elapsed since + * system boot, in nanoseconds. Does not include time the system + * was suspended. + * + * See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_coarse_ns)(void) = (void *) 160; + +/* + * bpf_ima_inode_hash + * + * Returns the stored IMA hash of the *inode* (if it's available). + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * + * Returns + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if + * invalid arguments are passed. + */ +static long (*bpf_ima_inode_hash)(struct inode *inode, void *dst, __u32 size) = (void *) 161; + +/* + * bpf_sock_from_file + * + * If the given file represents a socket, returns the associated + * socket. + * + * Returns + * A pointer to a struct socket on success or NULL if the file is + * not a socket. + */ +static struct socket *(*bpf_sock_from_file)(struct file *file) = (void *) 162; + +/* + * bpf_check_mtu + * + * Check packet size against exceeding MTU of net device (based + * on *ifindex*). This helper will likely be used in combination + * with helpers that adjust/change the packet size. + * + * The argument *len_diff* can be used for querying with a planned + * size change. This allows to check MTU prior to changing packet + * ctx. Providing a *len_diff* adjustment that is larger than the + * actual packet size (resulting in negative packet size) will in + * principle not exceed the MTU, which is why it is not considered + * a failure. Other BPF helpers are needed for performing the + * planned size change; therefore the responsibility for catching + * a negative packet size belongs in those helpers. + * + * Specifying *ifindex* zero means the MTU check is performed + * against the current net device. This is practical if this isn't + * used prior to redirect. + * + * On input *mtu_len* must be a valid pointer, else verifier will + * reject BPF program. If the value *mtu_len* is initialized to + * zero then the ctx packet size is use. When value *mtu_len* is + * provided as input this specify the L3 length that the MTU check + * is done against. Remember XDP and TC length operate at L2, but + * this value is L3 as this correlate to MTU and IP-header tot_len + * values which are L3 (similar behavior as bpf_fib_lookup). + * + * The Linux kernel route table can configure MTUs on a more + * specific per route level, which is not provided by this helper. + * For route level MTU checks use the **bpf_fib_lookup**\ () + * helper. + * + * *ctx* is either **struct xdp_md** for XDP programs or + * **struct sk_buff** for tc cls_act programs. + * + * The *flags* argument can be a combination of one or more of the + * following values: + * + * **BPF_MTU_CHK_SEGS** + * This flag will only works for *ctx* **struct sk_buff**. + * If packet context contains extra packet segment buffers + * (often knows as GSO skb), then MTU check is harder to + * check at this point, because in transmit path it is + * possible for the skb packet to get re-segmented + * (depending on net device features). This could still be + * a MTU violation, so this flag enables performing MTU + * check against segments, with a different violation + * return code to tell it apart. Check cannot use len_diff. + * + * On return *mtu_len* pointer contains the MTU value of the net + * device. Remember the net device configured MTU is the L3 size, + * which is returned here and XDP and TC length operate at L2. + * Helper take this into account for you, but remember when using + * MTU value in your BPF-code. + * + * + * Returns + * * 0 on success, and populate MTU value in *mtu_len* pointer. + * + * * < 0 if any input argument is invalid (*mtu_len* not updated) + * + * MTU violations return positive values, but also populate MTU + * value in *mtu_len* pointer, as this can be needed for + * implementing PMTU handing: + * + * * **BPF_MTU_CHK_RET_FRAG_NEEDED** + * * **BPF_MTU_CHK_RET_SEGS_TOOBIG** + */ +static long (*bpf_check_mtu)(void *ctx, __u32 ifindex, __u32 *mtu_len, __s32 len_diff, __u64 flags) = (void *) 163; + +/* + * bpf_for_each_map_elem + * + * For each element in **map**, call **callback_fn** function with + * **map**, **callback_ctx** and other map-specific parameters. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. + * + * The following are a list of supported map types and their + * respective expected callback signatures: + * + * BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_PERCPU_HASH, + * BPF_MAP_TYPE_LRU_HASH, BPF_MAP_TYPE_LRU_PERCPU_HASH, + * BPF_MAP_TYPE_ARRAY, BPF_MAP_TYPE_PERCPU_ARRAY + * + * long (\*callback_fn)(struct bpf_map \*map, const void \*key, void \*value, void \*ctx); + * + * For per_cpu maps, the map_value is the value on the cpu where the + * bpf_prog is running. + * + * If **callback_fn** return 0, the helper will continue to the next + * element. If return value is 1, the helper will skip the rest of + * elements and return. Other return values are not used now. + * + * + * Returns + * The number of traversed map elements for success, **-EINVAL** for + * invalid **flags**. + */ +static long (*bpf_for_each_map_elem)(void *map, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 164; + +/* + * bpf_snprintf + * + * Outputs a string into the **str** buffer of size **str_size** + * based on a format string stored in a read-only map pointed by + * **fmt**. + * + * Each format specifier in **fmt** corresponds to one u64 element + * in the **data** array. For strings and pointers where pointees + * are accessed, only the pointer values are stored in the *data* + * array. The *data_len* is the size of *data* in bytes - must be + * a multiple of 8. + * + * Formats **%s** and **%p{i,I}{4,6}** require to read kernel + * memory. Reading kernel memory may fail due to either invalid + * address or valid address but requiring a major memory fault. If + * reading kernel memory fails, the string for **%s** will be an + * empty string, and the ip address for **%p{i,I}{4,6}** will be 0. + * Not returning error to bpf program is consistent with what + * **bpf_trace_printk**\ () does for now. + * + * + * Returns + * The strictly positive length of the formatted string, including + * the trailing zero character. If the return value is greater than + * **str_size**, **str** contains a truncated string, guaranteed to + * be zero-terminated except when **str_size** is 0. + * + * Or **-EBUSY** if the per-CPU memory copy buffer is busy. + */ +static long (*bpf_snprintf)(char *str, __u32 str_size, const char *fmt, __u64 *data, __u32 data_len) = (void *) 165; + +/* + * bpf_sys_bpf + * + * Execute bpf syscall with given arguments. + * + * Returns + * A syscall result. + */ +static long (*bpf_sys_bpf)(__u32 cmd, void *attr, __u32 attr_size) = (void *) 166; + +/* + * bpf_btf_find_by_name_kind + * + * Find BTF type with given name and kind in vmlinux BTF or in module's BTFs. + * + * Returns + * Returns btf_id and btf_obj_fd in lower and upper 32 bits. + */ +static long (*bpf_btf_find_by_name_kind)(char *name, int name_sz, __u32 kind, int flags) = (void *) 167; + +/* + * bpf_sys_close + * + * Execute close syscall for given FD. + * + * Returns + * A syscall result. + */ +static long (*bpf_sys_close)(__u32 fd) = (void *) 168; + +/* + * bpf_timer_init + * + * Initialize the timer. + * First 4 bits of *flags* specify clockid. + * Only CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME are allowed. + * All other bits of *flags* are reserved. + * The verifier will reject the program if *timer* is not from + * the same *map*. + * + * Returns + * 0 on success. + * **-EBUSY** if *timer* is already initialized. + * **-EINVAL** if invalid *flags* are passed. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + */ +static long (*bpf_timer_init)(struct bpf_timer *timer, void *map, __u64 flags) = (void *) 169; + +/* + * bpf_timer_set_callback + * + * Configure the timer to call *callback_fn* static function. + * + * Returns + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EPERM** if *timer* is in a map that doesn't have any user references. + * The user space should either hold a file descriptor to a map with timers + * or pin such map in bpffs. When map is unpinned or file descriptor is + * closed all timers in the map will be cancelled and freed. + */ +static long (*bpf_timer_set_callback)(struct bpf_timer *timer, void *callback_fn) = (void *) 170; + +/* + * bpf_timer_start + * + * Set timer expiration N nanoseconds from the current time. The + * configured callback will be invoked in soft irq context on some cpu + * and will not repeat unless another bpf_timer_start() is made. + * In such case the next invocation can migrate to a different cpu. + * Since struct bpf_timer is a field inside map element the map + * owns the timer. The bpf_timer_set_callback() will increment refcnt + * of BPF program to make sure that callback_fn code stays valid. + * When user space reference to a map reaches zero all timers + * in a map are cancelled and corresponding program's refcnts are + * decremented. This is done to make sure that Ctrl-C of a user + * process doesn't leave any timers running. If map is pinned in + * bpffs the callback_fn can re-arm itself indefinitely. + * bpf_map_update/delete_elem() helpers and user space sys_bpf commands + * cancel and free the timer in the given map element. + * The map can contain timers that invoke callback_fn-s from different + * programs. The same callback_fn can serve different timers from + * different maps if key/value layout matches across maps. + * Every bpf_timer_set_callback() can have different callback_fn. + * + * *flags* can be one of: + * + * **BPF_F_TIMER_ABS** + * Start the timer in absolute expire value instead of the + * default relative one. + * + * + * Returns + * 0 on success. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier + * or invalid *flags* are passed. + */ +static long (*bpf_timer_start)(struct bpf_timer *timer, __u64 nsecs, __u64 flags) = (void *) 171; + +/* + * bpf_timer_cancel + * + * Cancel the timer and wait for callback_fn to finish if it was running. + * + * Returns + * 0 if the timer was not active. + * 1 if the timer was active. + * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. + * **-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its + * own timer which would have led to a deadlock otherwise. + */ +static long (*bpf_timer_cancel)(struct bpf_timer *timer) = (void *) 172; + +/* + * bpf_get_func_ip + * + * Get address of the traced function (for tracing and kprobe programs). + * + * Returns + * Address of the traced function. + * 0 for kprobes placed within the function (not at the entry). + */ +static __u64 (*bpf_get_func_ip)(void *ctx) = (void *) 173; + +/* + * bpf_get_attach_cookie + * + * Get bpf_cookie value provided (optionally) during the program + * attachment. It might be different for each individual + * attachment, even if BPF program itself is the same. + * Expects BPF program context *ctx* as a first argument. + * + * Supported for the following program types: + * - kprobe/uprobe; + * - tracepoint; + * - perf_event. + * + * Returns + * Value specified by user at BPF link creation/attachment time + * or 0, if it was not specified. + */ +static __u64 (*bpf_get_attach_cookie)(void *ctx) = (void *) 174; + +/* + * bpf_task_pt_regs + * + * Get the struct pt_regs associated with **task**. + * + * Returns + * A pointer to struct pt_regs. + */ +static long (*bpf_task_pt_regs)(struct task_struct *task) = (void *) 175; + +/* + * bpf_get_branch_snapshot + * + * Get branch trace from hardware engines like Intel LBR. The + * hardware engine is stopped shortly after the helper is + * called. Therefore, the user need to filter branch entries + * based on the actual use case. To capture branch trace + * before the trigger point of the BPF program, the helper + * should be called at the beginning of the BPF program. + * + * The data is stored as struct perf_branch_entry into output + * buffer *entries*. *size* is the size of *entries* in bytes. + * *flags* is reserved for now and must be zero. + * + * + * Returns + * On success, number of bytes written to *buf*. On error, a + * negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-ENOENT** if architecture does not support branch records. + */ +static long (*bpf_get_branch_snapshot)(void *entries, __u32 size, __u64 flags) = (void *) 176; + +/* + * bpf_trace_vprintk + * + * Behaves like **bpf_trace_printk**\ () helper, but takes an array of u64 + * to format and can handle more format args as a result. + * + * Arguments are to be used as in **bpf_seq_printf**\ () helper. + * + * Returns + * The number of bytes written to the buffer, or a negative error + * in case of failure. + */ +static long (*bpf_trace_vprintk)(const char *fmt, __u32 fmt_size, const void *data, __u32 data_len) = (void *) 177; + +/* + * bpf_skc_to_unix_sock + * + * Dynamically cast a *sk* pointer to a *unix_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct unix_sock *(*bpf_skc_to_unix_sock)(void *sk) = (void *) 178; + +/* + * bpf_kallsyms_lookup_name + * + * Get the address of a kernel symbol, returned in *res*. *res* is + * set to 0 if the symbol is not found. + * + * Returns + * On success, zero. On error, a negative value. + * + * **-EINVAL** if *flags* is not zero. + * + * **-EINVAL** if string *name* is not the same size as *name_sz*. + * + * **-ENOENT** if symbol is not found. + * + * **-EPERM** if caller does not have permission to obtain kernel address. + */ +static long (*bpf_kallsyms_lookup_name)(const char *name, int name_sz, int flags, __u64 *res) = (void *) 179; + +/* + * bpf_find_vma + * + * Find vma of *task* that contains *addr*, call *callback_fn* + * function with *task*, *vma*, and *callback_ctx*. + * The *callback_fn* should be a static function and + * the *callback_ctx* should be a pointer to the stack. + * The *flags* is used to control certain aspects of the helper. + * Currently, the *flags* must be 0. + * + * The expected callback signature is + * + * long (\*callback_fn)(struct task_struct \*task, struct vm_area_struct \*vma, void \*callback_ctx); + * + * + * Returns + * 0 on success. + * **-ENOENT** if *task->mm* is NULL, or no vma contains *addr*. + * **-EBUSY** if failed to try lock mmap_lock. + * **-EINVAL** for invalid **flags**. + */ +static long (*bpf_find_vma)(struct task_struct *task, __u64 addr, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 180; + +/* + * bpf_loop + * + * For **nr_loops**, call **callback_fn** function + * with **callback_ctx** as the context parameter. + * The **callback_fn** should be a static function and + * the **callback_ctx** should be a pointer to the stack. + * The **flags** is used to control certain aspects of the helper. + * Currently, the **flags** must be 0. Currently, nr_loops is + * limited to 1 << 23 (~8 million) loops. + * + * long (\*callback_fn)(u32 index, void \*ctx); + * + * where **index** is the current index in the loop. The index + * is zero-indexed. + * + * If **callback_fn** returns 0, the helper will continue to the next + * loop. If return value is 1, the helper will skip the rest of + * the loops and return. Other return values are not used now, + * and will be rejected by the verifier. + * + * + * Returns + * The number of loops performed, **-EINVAL** for invalid **flags**, + * **-E2BIG** if **nr_loops** exceeds the maximum number of loops. + */ +static long (*bpf_loop)(__u32 nr_loops, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 181; + +/* + * bpf_strncmp + * + * Do strncmp() between **s1** and **s2**. **s1** doesn't need + * to be null-terminated and **s1_sz** is the maximum storage + * size of **s1**. **s2** must be a read-only string. + * + * Returns + * An integer less than, equal to, or greater than zero + * if the first **s1_sz** bytes of **s1** is found to be + * less than, to match, or be greater than **s2**. + */ +static long (*bpf_strncmp)(const char *s1, __u32 s1_sz, const char *s2) = (void *) 182; + +/* + * bpf_get_func_arg + * + * Get **n**-th argument register (zero based) of the traced function (for tracing programs) + * returned in **value**. + * + * + * Returns + * 0 on success. + * **-EINVAL** if n >= argument register count of traced function. + */ +static long (*bpf_get_func_arg)(void *ctx, __u32 n, __u64 *value) = (void *) 183; + +/* + * bpf_get_func_ret + * + * Get return value of the traced function (for tracing programs) + * in **value**. + * + * + * Returns + * 0 on success. + * **-EOPNOTSUPP** for tracing programs other than BPF_TRACE_FEXIT or BPF_MODIFY_RETURN. + */ +static long (*bpf_get_func_ret)(void *ctx, __u64 *value) = (void *) 184; + +/* + * bpf_get_func_arg_cnt + * + * Get number of registers of the traced function (for tracing programs) where + * function arguments are stored in these registers. + * + * + * Returns + * The number of argument registers of the traced function. + */ +static long (*bpf_get_func_arg_cnt)(void *ctx) = (void *) 185; + +/* + * bpf_get_retval + * + * Get the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * + * Returns + * The BPF program's return value. + */ +static int (*bpf_get_retval)(void) = (void *) 186; + +/* + * bpf_set_retval + * + * Set the BPF program's return value that will be returned to the upper layers. + * + * This helper is currently supported by cgroup programs and only by the hooks + * where BPF program's return value is returned to the userspace via errno. + * + * Note that there is the following corner case where the program exports an error + * via bpf_set_retval but signals success via 'return 1': + * + * bpf_set_retval(-EPERM); + * return 1; + * + * In this case, the BPF program's return value will use helper's -EPERM. This + * still holds true for cgroup/bind{4,6} which supports extra 'return 3' success case. + * + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static int (*bpf_set_retval)(int retval) = (void *) 187; + +/* + * bpf_xdp_get_buff_len + * + * Get the total size of a given xdp buff (linear and paged area) + * + * Returns + * The total size of a given xdp buffer. + */ +static __u64 (*bpf_xdp_get_buff_len)(struct xdp_md *xdp_md) = (void *) 188; + +/* + * bpf_xdp_load_bytes + * + * This helper is provided as an easy way to load data from a + * xdp buffer. It can be used to load *len* bytes from *offset* from + * the frame associated to *xdp_md*, into the buffer pointed by + * *buf*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_load_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = (void *) 189; + +/* + * bpf_xdp_store_bytes + * + * Store *len* bytes from buffer *buf* into the frame + * associated to *xdp_md*, at *offset*. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_xdp_store_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = (void *) 190; + +/* + * bpf_copy_from_user_task + * + * Read *size* bytes from user space address *user_ptr* in *tsk*'s + * address space, and stores the data in *dst*. *flags* is not + * used yet and is provided for future extensibility. This helper + * can only be used by sleepable programs. + * + * Returns + * 0 on success, or a negative error in case of failure. On error + * *dst* buffer is zeroed out. + */ +static long (*bpf_copy_from_user_task)(void *dst, __u32 size, const void *user_ptr, struct task_struct *tsk, __u64 flags) = (void *) 191; + +/* + * bpf_skb_set_tstamp + * + * Change the __sk_buff->tstamp_type to *tstamp_type* + * and set *tstamp* to the __sk_buff->tstamp together. + * + * If there is no need to change the __sk_buff->tstamp_type, + * the tstamp value can be directly written to __sk_buff->tstamp + * instead. + * + * BPF_SKB_TSTAMP_DELIVERY_MONO is the only tstamp that + * will be kept during bpf_redirect_*(). A non zero + * *tstamp* must be used with the BPF_SKB_TSTAMP_DELIVERY_MONO + * *tstamp_type*. + * + * A BPF_SKB_TSTAMP_UNSPEC *tstamp_type* can only be used + * with a zero *tstamp*. + * + * Only IPv4 and IPv6 skb->protocol are supported. + * + * This function is most useful when it needs to set a + * mono delivery time to __sk_buff->tstamp and then + * bpf_redirect_*() to the egress of an iface. For example, + * changing the (rcv) timestamp in __sk_buff->tstamp at + * ingress to a mono delivery time and then bpf_redirect_*() + * to sch_fq@phy-dev. + * + * Returns + * 0 on success. + * **-EINVAL** for invalid input + * **-EOPNOTSUPP** for unsupported protocol + */ +static long (*bpf_skb_set_tstamp)(struct __sk_buff *skb, __u64 tstamp, __u32 tstamp_type) = (void *) 192; + +/* + * bpf_ima_file_hash + * + * Returns a calculated IMA hash of the *file*. + * If the hash is larger than *size*, then only *size* + * bytes will be copied to *dst* + * + * Returns + * The **hash_algo** is returned on success, + * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if + * invalid arguments are passed. + */ +static long (*bpf_ima_file_hash)(struct file *file, void *dst, __u32 size) = (void *) 193; + +/* + * bpf_kptr_xchg + * + * Exchange kptr at pointer *map_value* with *ptr*, and return the + * old value. *ptr* can be NULL, otherwise it must be a referenced + * pointer which will be released when this helper is called. + * + * Returns + * The old value of kptr (which can be NULL). The returned pointer + * if not NULL, is a reference which must be released using its + * corresponding release function, or moved into a BPF map before + * program exit. + */ +static void *(*bpf_kptr_xchg)(void *map_value, void *ptr) = (void *) 194; + +/* + * bpf_map_lookup_percpu_elem + * + * Perform a lookup in *percpu map* for an entry associated to + * *key* on *cpu*. + * + * Returns + * Map value associated to *key* on *cpu*, or **NULL** if no entry + * was found or *cpu* is invalid. + */ +static void *(*bpf_map_lookup_percpu_elem)(void *map, const void *key, __u32 cpu) = (void *) 195; + +/* + * bpf_skc_to_mptcp_sock + * + * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. + * + * Returns + * *sk* if casting is valid, or **NULL** otherwise. + */ +static struct mptcp_sock *(*bpf_skc_to_mptcp_sock)(void *sk) = (void *) 196; + +/* + * bpf_dynptr_from_mem + * + * Get a dynptr to local memory *data*. + * + * *data* must be a ptr to a map value. + * The maximum *size* supported is DYNPTR_MAX_SIZE. + * *flags* is currently unused. + * + * Returns + * 0 on success, -E2BIG if the size exceeds DYNPTR_MAX_SIZE, + * -EINVAL if flags is not 0. + */ +static long (*bpf_dynptr_from_mem)(void *data, __u32 size, __u64 flags, struct bpf_dynptr *ptr) = (void *) 197; + +/* + * bpf_ringbuf_reserve_dynptr + * + * Reserve *size* bytes of payload in a ring buffer *ringbuf* + * through the dynptr interface. *flags* must be 0. + * + * Please note that a corresponding bpf_ringbuf_submit_dynptr or + * bpf_ringbuf_discard_dynptr must be called on *ptr*, even if the + * reservation fails. This is enforced by the verifier. + * + * Returns + * 0 on success, or a negative error in case of failure. + */ +static long (*bpf_ringbuf_reserve_dynptr)(void *ringbuf, __u32 size, __u64 flags, struct bpf_dynptr *ptr) = (void *) 198; + +/* + * bpf_ringbuf_submit_dynptr + * + * Submit reserved ring buffer sample, pointed to by *data*, + * through the dynptr interface. This is a no-op if the dynptr is + * invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_submit'. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_submit_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = (void *) 199; + +/* + * bpf_ringbuf_discard_dynptr + * + * Discard reserved ring buffer sample through the dynptr + * interface. This is a no-op if the dynptr is invalid/null. + * + * For more information on *flags*, please see + * 'bpf_ringbuf_discard'. + * + * Returns + * Nothing. Always succeeds. + */ +static void (*bpf_ringbuf_discard_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = (void *) 200; + +/* + * bpf_dynptr_read + * + * Read *len* bytes from *src* into *dst*, starting from *offset* + * into *src*. + * *flags* is currently unused. + * + * Returns + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *src*'s data, -EINVAL if *src* is an invalid dynptr or if + * *flags* is not 0. + */ +static long (*bpf_dynptr_read)(void *dst, __u32 len, const struct bpf_dynptr *src, __u32 offset, __u64 flags) = (void *) 201; + +/* + * bpf_dynptr_write + * + * Write *len* bytes from *src* into *dst*, starting from *offset* + * into *dst*. + * + * *flags* must be 0 except for skb-type dynptrs. + * + * For skb-type dynptrs: + * * All data slices of the dynptr are automatically + * invalidated after **bpf_dynptr_write**\ (). This is + * because writing may pull the skb and change the + * underlying packet buffer. + * + * * For *flags*, please see the flags accepted by + * **bpf_skb_store_bytes**\ (). + * + * Returns + * 0 on success, -E2BIG if *offset* + *len* exceeds the length + * of *dst*'s data, -EINVAL if *dst* is an invalid dynptr or if *dst* + * is a read-only dynptr or if *flags* is not correct. For skb-type dynptrs, + * other errors correspond to errors returned by **bpf_skb_store_bytes**\ (). + */ +static long (*bpf_dynptr_write)(const struct bpf_dynptr *dst, __u32 offset, void *src, __u32 len, __u64 flags) = (void *) 202; + +/* + * bpf_dynptr_data + * + * Get a pointer to the underlying dynptr data. + * + * *len* must be a statically known value. The returned data slice + * is invalidated whenever the dynptr is invalidated. + * + * skb and xdp type dynptrs may not use bpf_dynptr_data. They should + * instead use bpf_dynptr_slice and bpf_dynptr_slice_rdwr. + * + * Returns + * Pointer to the underlying dynptr data, NULL if the dynptr is + * read-only, if the dynptr is invalid, or if the offset and length + * is out of bounds. + */ +static void *(*bpf_dynptr_data)(const struct bpf_dynptr *ptr, __u32 offset, __u32 len) = (void *) 203; + +/* + * bpf_tcp_raw_gen_syncookie_ipv4 + * + * Try to issue a SYN cookie for the packet with corresponding + * IPv4/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + */ +static __s64 (*bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th, __u32 th_len) = (void *) 204; + +/* + * bpf_tcp_raw_gen_syncookie_ipv6 + * + * Try to issue a SYN cookie for the packet with corresponding + * IPv6/TCP headers, *iph* and *th*, without depending on a + * listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the start of the TCP header, while *th_len* + * contains the length of the TCP header (at least + * **sizeof**\ (**struct tcphdr**)). + * + * Returns + * On success, lower 32 bits hold the generated SYN cookie in + * followed by 16 bits which hold the MSS value for that cookie, + * and the top 16 bits are unused. + * + * On failure, the returned value is one of the following: + * + * **-EINVAL** if *th_len* is invalid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + */ +static __s64 (*bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th, __u32 th_len) = (void *) 205; + +/* + * bpf_tcp_raw_check_syncookie_ipv4 + * + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv4 header. + * + * *th* points to the TCP header. + * + * Returns + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + */ +static long (*bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th) = (void *) 206; + +/* + * bpf_tcp_raw_check_syncookie_ipv6 + * + * Check whether *iph* and *th* contain a valid SYN cookie ACK + * without depending on a listening socket. + * + * *iph* points to the IPv6 header. + * + * *th* points to the TCP header. + * + * Returns + * 0 if *iph* and *th* are a valid SYN cookie ACK. + * + * On failure, the returned value is one of the following: + * + * **-EACCES** if the SYN cookie is not valid. + * + * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. + */ +static long (*bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th) = (void *) 207; + +/* + * bpf_ktime_get_tai_ns + * + * A nonsettable system-wide clock derived from wall-clock time but + * ignoring leap seconds. This clock does not experience + * discontinuities and backwards jumps caused by NTP inserting leap + * seconds as CLOCK_REALTIME does. + * + * See: **clock_gettime**\ (**CLOCK_TAI**) + * + * Returns + * Current *ktime*. + */ +static __u64 (*bpf_ktime_get_tai_ns)(void) = (void *) 208; + +/* + * bpf_user_ringbuf_drain + * + * Drain samples from the specified user ring buffer, and invoke + * the provided callback for each such sample: + * + * long (\*callback_fn)(const struct bpf_dynptr \*dynptr, void \*ctx); + * + * If **callback_fn** returns 0, the helper will continue to try + * and drain the next sample, up to a maximum of + * BPF_MAX_USER_RINGBUF_SAMPLES samples. If the return value is 1, + * the helper will skip the rest of the samples and return. Other + * return values are not used now, and will be rejected by the + * verifier. + * + * Returns + * The number of drained samples if no error was encountered while + * draining samples, or 0 if no samples were present in the ring + * buffer. If a user-space producer was epoll-waiting on this map, + * and at least one sample was drained, they will receive an event + * notification notifying them of available space in the ring + * buffer. If the BPF_RB_NO_WAKEUP flag is passed to this + * function, no wakeup notification will be sent. If the + * BPF_RB_FORCE_WAKEUP flag is passed, a wakeup notification will + * be sent even if no sample was drained. + * + * On failure, the returned value is one of the following: + * + * **-EBUSY** if the ring buffer is contended, and another calling + * context was concurrently draining the ring buffer. + * + * **-EINVAL** if user-space is not properly tracking the ring + * buffer due to the producer position not being aligned to 8 + * bytes, a sample not being aligned to 8 bytes, or the producer + * position not matching the advertised length of a sample. + * + * **-E2BIG** if user-space has tried to publish a sample which is + * larger than the size of the ring buffer, or which cannot fit + * within a struct bpf_dynptr. + */ +static long (*bpf_user_ringbuf_drain)(void *map, void *callback_fn, void *ctx, __u64 flags) = (void *) 209; + +/* + * bpf_cgrp_storage_get + * + * Get a bpf_local_storage from the *cgroup*. + * + * Logically, it could be thought of as getting the value from + * a *map* with *cgroup* as the **key**. From this + * perspective, the usage is not much different from + * **bpf_map_lookup_elem**\ (*map*, **&**\ *cgroup*) except this + * helper enforces the key must be a cgroup struct and the map must also + * be a **BPF_MAP_TYPE_CGRP_STORAGE**. + * + * In reality, the local-storage value is embedded directly inside of the + * *cgroup* object itself, rather than being located in the + * **BPF_MAP_TYPE_CGRP_STORAGE** map. When the local-storage value is + * queried for some *map* on a *cgroup* object, the kernel will perform an + * O(n) iteration over all of the live local-storage values for that + * *cgroup* object until the local-storage value for the *map* is found. + * + * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be + * used such that a new bpf_local_storage will be + * created if one does not exist. *value* can be used + * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify + * the initial value of a bpf_local_storage. If *value* is + * **NULL**, the new bpf_local_storage will be zero initialized. + * + * Returns + * A bpf_local_storage pointer is returned on success. + * + * **NULL** if not found or there was an error in adding + * a new bpf_local_storage. + */ +static void *(*bpf_cgrp_storage_get)(void *map, struct cgroup *cgroup, void *value, __u64 flags) = (void *) 210; + +/* + * bpf_cgrp_storage_delete + * + * Delete a bpf_local_storage from a *cgroup*. + * + * Returns + * 0 on success. + * + * **-ENOENT** if the bpf_local_storage cannot be found. + */ +static long (*bpf_cgrp_storage_delete)(void *map, struct cgroup *cgroup) = (void *) 211; + + diff --git a/libbpf/src/bpf_helpers.h b/libbpf/src/bpf_helpers.h new file mode 100644 index 0000000..e7e1a8a --- /dev/null +++ b/libbpf/src/bpf_helpers.h @@ -0,0 +1,294 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_HELPERS__ +#define __BPF_HELPERS__ + +/* + * Note that bpf programs need to include either + * vmlinux.h (auto-generated from BTF) or linux/types.h + * in advance since bpf_helper_defs.h uses such types + * as __u64. + */ +#include "bpf_helper_defs.h" + +#define __uint(name, val) int (*name)[val] +#define __type(name, val) typeof(val) *name +#define __array(name, val) typeof(val) *name[] + +/* + * Helper macro to place programs, maps, license in + * different sections in elf_bpf file. Section names + * are interpreted by libbpf depending on the context (BPF programs, BPF maps, + * extern variables, etc). + * To allow use of SEC() with externs (e.g., for extern .maps declarations), + * make sure __attribute__((unused)) doesn't trigger compilation warning. + */ +#if __GNUC__ && !__clang__ + +/* + * Pragma macros are broken on GCC + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55578 + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90400 + */ +#define SEC(name) __attribute__((section(name), used)) + +#else + +#define SEC(name) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wignored-attributes\"") \ + __attribute__((section(name), used)) \ + _Pragma("GCC diagnostic pop") \ + +#endif + +/* Avoid 'linux/stddef.h' definition of '__always_inline'. */ +#undef __always_inline +#define __always_inline inline __attribute__((always_inline)) + +#ifndef __noinline +#define __noinline __attribute__((noinline)) +#endif +#ifndef __weak +#define __weak __attribute__((weak)) +#endif + +/* + * Use __hidden attribute to mark a non-static BPF subprogram effectively + * static for BPF verifier's verification algorithm purposes, allowing more + * extensive and permissive BPF verification process, taking into account + * subprogram's caller context. + */ +#define __hidden __attribute__((visibility("hidden"))) + +/* When utilizing vmlinux.h with BPF CO-RE, user BPF programs can't include + * any system-level headers (such as stddef.h, linux/version.h, etc), and + * commonly-used macros like NULL and KERNEL_VERSION aren't available through + * vmlinux.h. This just adds unnecessary hurdles and forces users to re-define + * them on their own. So as a convenience, provide such definitions here. + */ +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef KERNEL_VERSION +#define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c))) +#endif + +/* + * Helper macros to manipulate data structures + */ +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((unsigned long)&((TYPE *)0)->MEMBER) +#endif +#ifndef container_of +#define container_of(ptr, type, member) \ + ({ \ + void *__mptr = (void *)(ptr); \ + ((type *)(__mptr - offsetof(type, member))); \ + }) +#endif + +/* + * Compiler (optimization) barrier. + */ +#ifndef barrier +#define barrier() asm volatile("" ::: "memory") +#endif + +/* Variable-specific compiler (optimization) barrier. It's a no-op which makes + * compiler believe that there is some black box modification of a given + * variable and thus prevents compiler from making extra assumption about its + * value and potential simplifications and optimizations on this variable. + * + * E.g., compiler might often delay or even omit 32-bit to 64-bit casting of + * a variable, making some code patterns unverifiable. Putting barrier_var() + * in place will ensure that cast is performed before the barrier_var() + * invocation, because compiler has to pessimistically assume that embedded + * asm section might perform some extra operations on that variable. + * + * This is a variable-specific variant of more global barrier(). + */ +#ifndef barrier_var +#define barrier_var(var) asm volatile("" : "+r"(var)) +#endif + +/* + * Helper macro to throw a compilation error if __bpf_unreachable() gets + * built into the resulting code. This works given BPF back end does not + * implement __builtin_trap(). This is useful to assert that certain paths + * of the program code are never used and hence eliminated by the compiler. + * + * For example, consider a switch statement that covers known cases used by + * the program. __bpf_unreachable() can then reside in the default case. If + * the program gets extended such that a case is not covered in the switch + * statement, then it will throw a build error due to the default case not + * being compiled out. + */ +#ifndef __bpf_unreachable +# define __bpf_unreachable() __builtin_trap() +#endif + +/* + * Helper function to perform a tail call with a constant/immediate map slot. + */ +#if __clang_major__ >= 8 && defined(__bpf__) +static __always_inline void +bpf_tail_call_static(void *ctx, const void *map, const __u32 slot) +{ + if (!__builtin_constant_p(slot)) + __bpf_unreachable(); + + /* + * Provide a hard guarantee that LLVM won't optimize setting r2 (map + * pointer) and r3 (constant map index) from _different paths_ ending + * up at the _same_ call insn as otherwise we won't be able to use the + * jmpq/nopl retpoline-free patching by the x86-64 JIT in the kernel + * given they mismatch. See also d2e4c1e6c294 ("bpf: Constant map key + * tracking for prog array pokes") for details on verifier tracking. + * + * Note on clobber list: we need to stay in-line with BPF calling + * convention, so even if we don't end up using r0, r4, r5, we need + * to mark them as clobber so that LLVM doesn't end up using them + * before / after the call. + */ + asm volatile("r1 = %[ctx]\n\t" + "r2 = %[map]\n\t" + "r3 = %[slot]\n\t" + "call 12" + :: [ctx]"r"(ctx), [map]"r"(map), [slot]"i"(slot) + : "r0", "r1", "r2", "r3", "r4", "r5"); +} +#endif + +enum libbpf_pin_type { + LIBBPF_PIN_NONE, + /* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */ + LIBBPF_PIN_BY_NAME, +}; + +enum libbpf_tristate { + TRI_NO = 0, + TRI_YES = 1, + TRI_MODULE = 2, +}; + +#define __kconfig __attribute__((section(".kconfig"))) +#define __ksym __attribute__((section(".ksyms"))) +#define __kptr_untrusted __attribute__((btf_type_tag("kptr_untrusted"))) +#define __kptr __attribute__((btf_type_tag("kptr"))) + +#define bpf_ksym_exists(sym) ({ \ + _Static_assert(!__builtin_constant_p(!!sym), #sym " should be marked as __weak"); \ + !!sym; \ +}) + +#ifndef ___bpf_concat +#define ___bpf_concat(a, b) a ## b +#endif +#ifndef ___bpf_apply +#define ___bpf_apply(fn, n) ___bpf_concat(fn, n) +#endif +#ifndef ___bpf_nth +#define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N +#endif +#ifndef ___bpf_narg +#define ___bpf_narg(...) \ + ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#endif + +#define ___bpf_fill0(arr, p, x) do {} while (0) +#define ___bpf_fill1(arr, p, x) arr[p] = x +#define ___bpf_fill2(arr, p, x, args...) arr[p] = x; ___bpf_fill1(arr, p + 1, args) +#define ___bpf_fill3(arr, p, x, args...) arr[p] = x; ___bpf_fill2(arr, p + 1, args) +#define ___bpf_fill4(arr, p, x, args...) arr[p] = x; ___bpf_fill3(arr, p + 1, args) +#define ___bpf_fill5(arr, p, x, args...) arr[p] = x; ___bpf_fill4(arr, p + 1, args) +#define ___bpf_fill6(arr, p, x, args...) arr[p] = x; ___bpf_fill5(arr, p + 1, args) +#define ___bpf_fill7(arr, p, x, args...) arr[p] = x; ___bpf_fill6(arr, p + 1, args) +#define ___bpf_fill8(arr, p, x, args...) arr[p] = x; ___bpf_fill7(arr, p + 1, args) +#define ___bpf_fill9(arr, p, x, args...) arr[p] = x; ___bpf_fill8(arr, p + 1, args) +#define ___bpf_fill10(arr, p, x, args...) arr[p] = x; ___bpf_fill9(arr, p + 1, args) +#define ___bpf_fill11(arr, p, x, args...) arr[p] = x; ___bpf_fill10(arr, p + 1, args) +#define ___bpf_fill12(arr, p, x, args...) arr[p] = x; ___bpf_fill11(arr, p + 1, args) +#define ___bpf_fill(arr, args...) \ + ___bpf_apply(___bpf_fill, ___bpf_narg(args))(arr, 0, args) + +/* + * BPF_SEQ_PRINTF to wrap bpf_seq_printf to-be-printed values + * in a structure. + */ +#define BPF_SEQ_PRINTF(seq, fmt, args...) \ +({ \ + static const char ___fmt[] = fmt; \ + unsigned long long ___param[___bpf_narg(args)]; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + \ + bpf_seq_printf(seq, ___fmt, sizeof(___fmt), \ + ___param, sizeof(___param)); \ +}) + +/* + * BPF_SNPRINTF wraps the bpf_snprintf helper with variadic arguments instead of + * an array of u64. + */ +#define BPF_SNPRINTF(out, out_size, fmt, args...) \ +({ \ + static const char ___fmt[] = fmt; \ + unsigned long long ___param[___bpf_narg(args)]; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + \ + bpf_snprintf(out, out_size, ___fmt, \ + ___param, sizeof(___param)); \ +}) + +#ifdef BPF_NO_GLOBAL_DATA +#define BPF_PRINTK_FMT_MOD +#else +#define BPF_PRINTK_FMT_MOD static const +#endif + +#define __bpf_printk(fmt, ...) \ +({ \ + BPF_PRINTK_FMT_MOD char ____fmt[] = fmt; \ + bpf_trace_printk(____fmt, sizeof(____fmt), \ + ##__VA_ARGS__); \ +}) + +/* + * __bpf_vprintk wraps the bpf_trace_vprintk helper with variadic arguments + * instead of an array of u64. + */ +#define __bpf_vprintk(fmt, args...) \ +({ \ + static const char ___fmt[] = fmt; \ + unsigned long long ___param[___bpf_narg(args)]; \ + \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + ___bpf_fill(___param, args); \ + _Pragma("GCC diagnostic pop") \ + \ + bpf_trace_vprintk(___fmt, sizeof(___fmt), \ + ___param, sizeof(___param)); \ +}) + +/* Use __bpf_printk when bpf_printk call has 3 or fewer fmt args + * Otherwise use __bpf_vprintk + */ +#define ___bpf_pick_printk(...) \ + ___bpf_nth(_, ##__VA_ARGS__, __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, \ + __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, \ + __bpf_vprintk, __bpf_vprintk, __bpf_printk /*3*/, __bpf_printk /*2*/,\ + __bpf_printk /*1*/, __bpf_printk /*0*/) + +/* Helper macro to print out debug messages */ +#define bpf_printk(fmt, args...) ___bpf_pick_printk(args)(fmt, ##args) + +#endif diff --git a/libbpf/src/bpf_prog_linfo.c b/libbpf/src/bpf_prog_linfo.c new file mode 100644 index 0000000..5c50309 --- /dev/null +++ b/libbpf/src/bpf_prog_linfo.c @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2018 Facebook */ + +#include +#include +#include +#include +#include "libbpf.h" +#include "libbpf_internal.h" + +struct bpf_prog_linfo { + void *raw_linfo; + void *raw_jited_linfo; + __u32 *nr_jited_linfo_per_func; + __u32 *jited_linfo_func_idx; + __u32 nr_linfo; + __u32 nr_jited_func; + __u32 rec_size; + __u32 jited_rec_size; +}; + +static int dissect_jited_func(struct bpf_prog_linfo *prog_linfo, + const __u64 *ksym_func, const __u32 *ksym_len) +{ + __u32 nr_jited_func, nr_linfo; + const void *raw_jited_linfo; + const __u64 *jited_linfo; + __u64 last_jited_linfo; + /* + * Index to raw_jited_linfo: + * i: Index for searching the next ksym_func + * prev_i: Index to the last found ksym_func + */ + __u32 i, prev_i; + __u32 f; /* Index to ksym_func */ + + raw_jited_linfo = prog_linfo->raw_jited_linfo; + jited_linfo = raw_jited_linfo; + if (ksym_func[0] != *jited_linfo) + goto errout; + + prog_linfo->jited_linfo_func_idx[0] = 0; + nr_jited_func = prog_linfo->nr_jited_func; + nr_linfo = prog_linfo->nr_linfo; + + for (prev_i = 0, i = 1, f = 1; + i < nr_linfo && f < nr_jited_func; + i++) { + raw_jited_linfo += prog_linfo->jited_rec_size; + last_jited_linfo = *jited_linfo; + jited_linfo = raw_jited_linfo; + + if (ksym_func[f] == *jited_linfo) { + prog_linfo->jited_linfo_func_idx[f] = i; + + /* Sanity check */ + if (last_jited_linfo - ksym_func[f - 1] + 1 > + ksym_len[f - 1]) + goto errout; + + prog_linfo->nr_jited_linfo_per_func[f - 1] = + i - prev_i; + prev_i = i; + + /* + * The ksym_func[f] is found in jited_linfo. + * Look for the next one. + */ + f++; + } else if (*jited_linfo <= last_jited_linfo) { + /* Ensure the addr is increasing _within_ a func */ + goto errout; + } + } + + if (f != nr_jited_func) + goto errout; + + prog_linfo->nr_jited_linfo_per_func[nr_jited_func - 1] = + nr_linfo - prev_i; + + return 0; + +errout: + return -EINVAL; +} + +void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo) +{ + if (!prog_linfo) + return; + + free(prog_linfo->raw_linfo); + free(prog_linfo->raw_jited_linfo); + free(prog_linfo->nr_jited_linfo_per_func); + free(prog_linfo->jited_linfo_func_idx); + free(prog_linfo); +} + +struct bpf_prog_linfo *bpf_prog_linfo__new(const struct bpf_prog_info *info) +{ + struct bpf_prog_linfo *prog_linfo; + __u32 nr_linfo, nr_jited_func; + __u64 data_sz; + + nr_linfo = info->nr_line_info; + + if (!nr_linfo) + return errno = EINVAL, NULL; + + /* + * The min size that bpf_prog_linfo has to access for + * searching purpose. + */ + if (info->line_info_rec_size < + offsetof(struct bpf_line_info, file_name_off)) + return errno = EINVAL, NULL; + + prog_linfo = calloc(1, sizeof(*prog_linfo)); + if (!prog_linfo) + return errno = ENOMEM, NULL; + + /* Copy xlated line_info */ + prog_linfo->nr_linfo = nr_linfo; + prog_linfo->rec_size = info->line_info_rec_size; + data_sz = (__u64)nr_linfo * prog_linfo->rec_size; + prog_linfo->raw_linfo = malloc(data_sz); + if (!prog_linfo->raw_linfo) + goto err_free; + memcpy(prog_linfo->raw_linfo, (void *)(long)info->line_info, data_sz); + + nr_jited_func = info->nr_jited_ksyms; + if (!nr_jited_func || + !info->jited_line_info || + info->nr_jited_line_info != nr_linfo || + info->jited_line_info_rec_size < sizeof(__u64) || + info->nr_jited_func_lens != nr_jited_func || + !info->jited_ksyms || + !info->jited_func_lens) + /* Not enough info to provide jited_line_info */ + return prog_linfo; + + /* Copy jited_line_info */ + prog_linfo->nr_jited_func = nr_jited_func; + prog_linfo->jited_rec_size = info->jited_line_info_rec_size; + data_sz = (__u64)nr_linfo * prog_linfo->jited_rec_size; + prog_linfo->raw_jited_linfo = malloc(data_sz); + if (!prog_linfo->raw_jited_linfo) + goto err_free; + memcpy(prog_linfo->raw_jited_linfo, + (void *)(long)info->jited_line_info, data_sz); + + /* Number of jited_line_info per jited func */ + prog_linfo->nr_jited_linfo_per_func = malloc(nr_jited_func * + sizeof(__u32)); + if (!prog_linfo->nr_jited_linfo_per_func) + goto err_free; + + /* + * For each jited func, + * the start idx to the "linfo" and "jited_linfo" array, + */ + prog_linfo->jited_linfo_func_idx = malloc(nr_jited_func * + sizeof(__u32)); + if (!prog_linfo->jited_linfo_func_idx) + goto err_free; + + if (dissect_jited_func(prog_linfo, + (__u64 *)(long)info->jited_ksyms, + (__u32 *)(long)info->jited_func_lens)) + goto err_free; + + return prog_linfo; + +err_free: + bpf_prog_linfo__free(prog_linfo); + return errno = EINVAL, NULL; +} + +const struct bpf_line_info * +bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo, + __u64 addr, __u32 func_idx, __u32 nr_skip) +{ + __u32 jited_rec_size, rec_size, nr_linfo, start, i; + const void *raw_jited_linfo, *raw_linfo; + const __u64 *jited_linfo; + + if (func_idx >= prog_linfo->nr_jited_func) + return errno = ENOENT, NULL; + + nr_linfo = prog_linfo->nr_jited_linfo_per_func[func_idx]; + if (nr_skip >= nr_linfo) + return errno = ENOENT, NULL; + + start = prog_linfo->jited_linfo_func_idx[func_idx] + nr_skip; + jited_rec_size = prog_linfo->jited_rec_size; + raw_jited_linfo = prog_linfo->raw_jited_linfo + + (start * jited_rec_size); + jited_linfo = raw_jited_linfo; + if (addr < *jited_linfo) + return errno = ENOENT, NULL; + + nr_linfo -= nr_skip; + rec_size = prog_linfo->rec_size; + raw_linfo = prog_linfo->raw_linfo + (start * rec_size); + for (i = 0; i < nr_linfo; i++) { + if (addr < *jited_linfo) + break; + + raw_linfo += rec_size; + raw_jited_linfo += jited_rec_size; + jited_linfo = raw_jited_linfo; + } + + return raw_linfo - rec_size; +} + +const struct bpf_line_info * +bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo, + __u32 insn_off, __u32 nr_skip) +{ + const struct bpf_line_info *linfo; + __u32 rec_size, nr_linfo, i; + const void *raw_linfo; + + nr_linfo = prog_linfo->nr_linfo; + if (nr_skip >= nr_linfo) + return errno = ENOENT, NULL; + + rec_size = prog_linfo->rec_size; + raw_linfo = prog_linfo->raw_linfo + (nr_skip * rec_size); + linfo = raw_linfo; + if (insn_off < linfo->insn_off) + return errno = ENOENT, NULL; + + nr_linfo -= nr_skip; + for (i = 0; i < nr_linfo; i++) { + if (insn_off < linfo->insn_off) + break; + + raw_linfo += rec_size; + linfo = raw_linfo; + } + + return raw_linfo - rec_size; +} diff --git a/libbpf/src/bpf_tracing.h b/libbpf/src/bpf_tracing.h new file mode 100644 index 0000000..6fb3d0f --- /dev/null +++ b/libbpf/src/bpf_tracing.h @@ -0,0 +1,923 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BPF_TRACING_H__ +#define __BPF_TRACING_H__ + +#include + +/* Scan the ARCH passed in from ARCH env variable (see Makefile) */ +#if defined(__TARGET_ARCH_x86) + #define bpf_target_x86 + #define bpf_target_defined +#elif defined(__TARGET_ARCH_s390) + #define bpf_target_s390 + #define bpf_target_defined +#elif defined(__TARGET_ARCH_arm) + #define bpf_target_arm + #define bpf_target_defined +#elif defined(__TARGET_ARCH_arm64) + #define bpf_target_arm64 + #define bpf_target_defined +#elif defined(__TARGET_ARCH_mips) + #define bpf_target_mips + #define bpf_target_defined +#elif defined(__TARGET_ARCH_powerpc) + #define bpf_target_powerpc + #define bpf_target_defined +#elif defined(__TARGET_ARCH_sparc) + #define bpf_target_sparc + #define bpf_target_defined +#elif defined(__TARGET_ARCH_riscv) + #define bpf_target_riscv + #define bpf_target_defined +#elif defined(__TARGET_ARCH_arc) + #define bpf_target_arc + #define bpf_target_defined +#elif defined(__TARGET_ARCH_loongarch) + #define bpf_target_loongarch + #define bpf_target_defined +#else + +/* Fall back to what the compiler says */ +#if defined(__x86_64__) + #define bpf_target_x86 + #define bpf_target_defined +#elif defined(__s390__) + #define bpf_target_s390 + #define bpf_target_defined +#elif defined(__arm__) + #define bpf_target_arm + #define bpf_target_defined +#elif defined(__aarch64__) + #define bpf_target_arm64 + #define bpf_target_defined +#elif defined(__mips__) + #define bpf_target_mips + #define bpf_target_defined +#elif defined(__powerpc__) + #define bpf_target_powerpc + #define bpf_target_defined +#elif defined(__sparc__) + #define bpf_target_sparc + #define bpf_target_defined +#elif defined(__riscv) && __riscv_xlen == 64 + #define bpf_target_riscv + #define bpf_target_defined +#elif defined(__arc__) + #define bpf_target_arc + #define bpf_target_defined +#elif defined(__loongarch__) + #define bpf_target_loongarch + #define bpf_target_defined +#endif /* no compiler target */ + +#endif + +#ifndef __BPF_TARGET_MISSING +#define __BPF_TARGET_MISSING "GCC error \"Must specify a BPF target arch via __TARGET_ARCH_xxx\"" +#endif + +#if defined(bpf_target_x86) + +/* + * https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI + */ + +#if defined(__KERNEL__) || defined(__VMLINUX_H__) + +#define __PT_PARM1_REG di +#define __PT_PARM2_REG si +#define __PT_PARM3_REG dx +#define __PT_PARM4_REG cx +#define __PT_PARM5_REG r8 +#define __PT_PARM6_REG r9 +/* + * Syscall uses r10 for PARM4. See arch/x86/entry/entry_64.S:entry_SYSCALL_64 + * comments in Linux sources. And refer to syscall(2) manpage. + */ +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG r10 +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG sp +#define __PT_FP_REG bp +#define __PT_RC_REG ax +#define __PT_SP_REG sp +#define __PT_IP_REG ip + +#else + +#ifdef __i386__ + +/* i386 kernel is built with -mregparm=3 */ +#define __PT_PARM1_REG eax +#define __PT_PARM2_REG edx +#define __PT_PARM3_REG ecx +/* i386 syscall ABI is very different, refer to syscall(2) manpage */ +#define __PT_PARM1_SYSCALL_REG ebx +#define __PT_PARM2_SYSCALL_REG ecx +#define __PT_PARM3_SYSCALL_REG edx +#define __PT_PARM4_SYSCALL_REG esi +#define __PT_PARM5_SYSCALL_REG edi +#define __PT_PARM6_SYSCALL_REG ebp + +#define __PT_RET_REG esp +#define __PT_FP_REG ebp +#define __PT_RC_REG eax +#define __PT_SP_REG esp +#define __PT_IP_REG eip + +#else /* __i386__ */ + +#define __PT_PARM1_REG rdi +#define __PT_PARM2_REG rsi +#define __PT_PARM3_REG rdx +#define __PT_PARM4_REG rcx +#define __PT_PARM5_REG r8 +#define __PT_PARM6_REG r9 + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG r10 +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG rsp +#define __PT_FP_REG rbp +#define __PT_RC_REG rax +#define __PT_SP_REG rsp +#define __PT_IP_REG rip + +#endif /* __i386__ */ + +#endif /* __KERNEL__ || __VMLINUX_H__ */ + +#elif defined(bpf_target_s390) + +/* + * https://github.com/IBM/s390x-abi/releases/download/v1.6/lzsabi_s390x.pdf + */ + +struct pt_regs___s390 { + unsigned long orig_gpr2; +}; + +/* s390 provides user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x)) +#define __PT_PARM1_REG gprs[2] +#define __PT_PARM2_REG gprs[3] +#define __PT_PARM3_REG gprs[4] +#define __PT_PARM4_REG gprs[5] +#define __PT_PARM5_REG gprs[6] + +#define __PT_PARM1_SYSCALL_REG orig_gpr2 +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG gprs[7] +#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x) +#define PT_REGS_PARM1_CORE_SYSCALL(x) \ + BPF_CORE_READ((const struct pt_regs___s390 *)(x), __PT_PARM1_SYSCALL_REG) + +#define __PT_RET_REG gprs[14] +#define __PT_FP_REG gprs[11] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG gprs[2] +#define __PT_SP_REG gprs[15] +#define __PT_IP_REG psw.addr + +#elif defined(bpf_target_arm) + +/* + * https://github.com/ARM-software/abi-aa/blob/main/aapcs32/aapcs32.rst#machine-registers + */ + +#define __PT_PARM1_REG uregs[0] +#define __PT_PARM2_REG uregs[1] +#define __PT_PARM3_REG uregs[2] +#define __PT_PARM4_REG uregs[3] + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG uregs[4] +#define __PT_PARM6_SYSCALL_REG uregs[5] +#define __PT_PARM7_SYSCALL_REG uregs[6] + +#define __PT_RET_REG uregs[14] +#define __PT_FP_REG uregs[11] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG uregs[0] +#define __PT_SP_REG uregs[13] +#define __PT_IP_REG uregs[12] + +#elif defined(bpf_target_arm64) + +/* + * https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#machine-registers + */ + +struct pt_regs___arm64 { + unsigned long orig_x0; +}; + +/* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x)) +#define __PT_PARM1_REG regs[0] +#define __PT_PARM2_REG regs[1] +#define __PT_PARM3_REG regs[2] +#define __PT_PARM4_REG regs[3] +#define __PT_PARM5_REG regs[4] +#define __PT_PARM6_REG regs[5] +#define __PT_PARM7_REG regs[6] +#define __PT_PARM8_REG regs[7] + +#define __PT_PARM1_SYSCALL_REG orig_x0 +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG +#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x) +#define PT_REGS_PARM1_CORE_SYSCALL(x) \ + BPF_CORE_READ((const struct pt_regs___arm64 *)(x), __PT_PARM1_SYSCALL_REG) + +#define __PT_RET_REG regs[30] +#define __PT_FP_REG regs[29] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG regs[0] +#define __PT_SP_REG sp +#define __PT_IP_REG pc + +#elif defined(bpf_target_mips) + +/* + * N64 ABI is assumed right now. + * https://en.wikipedia.org/wiki/MIPS_architecture#Calling_conventions + */ + +#define __PT_PARM1_REG regs[4] +#define __PT_PARM2_REG regs[5] +#define __PT_PARM3_REG regs[6] +#define __PT_PARM4_REG regs[7] +#define __PT_PARM5_REG regs[8] +#define __PT_PARM6_REG regs[9] +#define __PT_PARM7_REG regs[10] +#define __PT_PARM8_REG regs[11] + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG /* only N32/N64 */ +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG /* only N32/N64 */ + +#define __PT_RET_REG regs[31] +#define __PT_FP_REG regs[30] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG regs[2] +#define __PT_SP_REG regs[29] +#define __PT_IP_REG cp0_epc + +#elif defined(bpf_target_powerpc) + +/* + * http://refspecs.linux-foundation.org/elf/elfspec_ppc.pdf (page 3-14, + * section "Function Calling Sequence") + */ + +#define __PT_PARM1_REG gpr[3] +#define __PT_PARM2_REG gpr[4] +#define __PT_PARM3_REG gpr[5] +#define __PT_PARM4_REG gpr[6] +#define __PT_PARM5_REG gpr[7] +#define __PT_PARM6_REG gpr[8] +#define __PT_PARM7_REG gpr[9] +#define __PT_PARM8_REG gpr[10] + +/* powerpc does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG orig_gpr3 +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG +#if !defined(__arch64__) +#define __PT_PARM7_SYSCALL_REG __PT_PARM7_REG /* only powerpc (not powerpc64) */ +#endif + +#define __PT_RET_REG regs[31] +#define __PT_FP_REG __unsupported__ +#define __PT_RC_REG gpr[3] +#define __PT_SP_REG sp +#define __PT_IP_REG nip + +#elif defined(bpf_target_sparc) + +/* + * https://en.wikipedia.org/wiki/Calling_convention#SPARC + */ + +#define __PT_PARM1_REG u_regs[UREG_I0] +#define __PT_PARM2_REG u_regs[UREG_I1] +#define __PT_PARM3_REG u_regs[UREG_I2] +#define __PT_PARM4_REG u_regs[UREG_I3] +#define __PT_PARM5_REG u_regs[UREG_I4] +#define __PT_PARM6_REG u_regs[UREG_I5] + +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG u_regs[UREG_I7] +#define __PT_FP_REG __unsupported__ +#define __PT_RC_REG u_regs[UREG_I0] +#define __PT_SP_REG u_regs[UREG_FP] +/* Should this also be a bpf_target check for the sparc case? */ +#if defined(__arch64__) +#define __PT_IP_REG tpc +#else +#define __PT_IP_REG pc +#endif + +#elif defined(bpf_target_riscv) + +/* + * https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc#risc-v-calling-conventions + */ + +#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) +#define __PT_PARM1_REG a0 +#define __PT_PARM2_REG a1 +#define __PT_PARM3_REG a2 +#define __PT_PARM4_REG a3 +#define __PT_PARM5_REG a4 +#define __PT_PARM6_REG a5 +#define __PT_PARM7_REG a6 +#define __PT_PARM8_REG a7 + +/* riscv does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG ra +#define __PT_FP_REG s0 +#define __PT_RC_REG a0 +#define __PT_SP_REG sp +#define __PT_IP_REG pc + +#elif defined(bpf_target_arc) + +/* + * Section "Function Calling Sequence" (page 24): + * https://raw.githubusercontent.com/wiki/foss-for-synopsys-dwc-arc-processors/toolchain/files/ARCv2_ABI.pdf + */ + +/* arc provides struct user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) +#define __PT_PARM1_REG scratch.r0 +#define __PT_PARM2_REG scratch.r1 +#define __PT_PARM3_REG scratch.r2 +#define __PT_PARM4_REG scratch.r3 +#define __PT_PARM5_REG scratch.r4 +#define __PT_PARM6_REG scratch.r5 +#define __PT_PARM7_REG scratch.r6 +#define __PT_PARM8_REG scratch.r7 + +/* arc does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG scratch.blink +#define __PT_FP_REG scratch.fp +#define __PT_RC_REG scratch.r0 +#define __PT_SP_REG scratch.sp +#define __PT_IP_REG scratch.ret + +#elif defined(bpf_target_loongarch) + +/* + * https://docs.kernel.org/loongarch/introduction.html + * https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html + */ + +/* loongarch provides struct user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x)) +#define __PT_PARM1_REG regs[4] +#define __PT_PARM2_REG regs[5] +#define __PT_PARM3_REG regs[6] +#define __PT_PARM4_REG regs[7] +#define __PT_PARM5_REG regs[8] +#define __PT_PARM6_REG regs[9] +#define __PT_PARM7_REG regs[10] +#define __PT_PARM8_REG regs[11] + +/* loongarch does not select ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ctx +#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG +#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG +#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG +#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG +#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG +#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG + +#define __PT_RET_REG regs[1] +#define __PT_FP_REG regs[22] +#define __PT_RC_REG regs[4] +#define __PT_SP_REG regs[3] +#define __PT_IP_REG csr_era + +#endif + +#if defined(bpf_target_defined) + +struct pt_regs; + +/* allow some architectures to override `struct pt_regs` */ +#ifndef __PT_REGS_CAST +#define __PT_REGS_CAST(x) (x) +#endif + +/* + * Different architectures support different number of arguments passed + * through registers. i386 supports just 3, some arches support up to 8. + */ +#ifndef __PT_PARM4_REG +#define __PT_PARM4_REG __unsupported__ +#endif +#ifndef __PT_PARM5_REG +#define __PT_PARM5_REG __unsupported__ +#endif +#ifndef __PT_PARM6_REG +#define __PT_PARM6_REG __unsupported__ +#endif +#ifndef __PT_PARM7_REG +#define __PT_PARM7_REG __unsupported__ +#endif +#ifndef __PT_PARM8_REG +#define __PT_PARM8_REG __unsupported__ +#endif +/* + * Similarly, syscall-specific conventions might differ between function call + * conventions within each architecutre. All supported architectures pass + * either 6 or 7 syscall arguments in registers. + * + * See syscall(2) manpage for succinct table with information on each arch. + */ +#ifndef __PT_PARM7_SYSCALL_REG +#define __PT_PARM7_SYSCALL_REG __unsupported__ +#endif + +#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG) +#define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->__PT_PARM2_REG) +#define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->__PT_PARM3_REG) +#define PT_REGS_PARM4(x) (__PT_REGS_CAST(x)->__PT_PARM4_REG) +#define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->__PT_PARM5_REG) +#define PT_REGS_PARM6(x) (__PT_REGS_CAST(x)->__PT_PARM6_REG) +#define PT_REGS_PARM7(x) (__PT_REGS_CAST(x)->__PT_PARM7_REG) +#define PT_REGS_PARM8(x) (__PT_REGS_CAST(x)->__PT_PARM8_REG) +#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->__PT_RET_REG) +#define PT_REGS_FP(x) (__PT_REGS_CAST(x)->__PT_FP_REG) +#define PT_REGS_RC(x) (__PT_REGS_CAST(x)->__PT_RC_REG) +#define PT_REGS_SP(x) (__PT_REGS_CAST(x)->__PT_SP_REG) +#define PT_REGS_IP(x) (__PT_REGS_CAST(x)->__PT_IP_REG) + +#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM1_REG) +#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM2_REG) +#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM3_REG) +#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM4_REG) +#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM5_REG) +#define PT_REGS_PARM6_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM6_REG) +#define PT_REGS_PARM7_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM7_REG) +#define PT_REGS_PARM8_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM8_REG) +#define PT_REGS_RET_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RET_REG) +#define PT_REGS_FP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_FP_REG) +#define PT_REGS_RC_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RC_REG) +#define PT_REGS_SP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_SP_REG) +#define PT_REGS_IP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_IP_REG) + +#if defined(bpf_target_powerpc) + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; }) +#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP + +#elif defined(bpf_target_sparc) + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); }) +#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP + +#else + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) \ + ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); }) +#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) \ + ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)(PT_REGS_FP(ctx) + sizeof(ip))); }) + +#endif + +#ifndef PT_REGS_PARM1_SYSCALL +#define PT_REGS_PARM1_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM1_SYSCALL_REG) +#define PT_REGS_PARM1_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM1_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM2_SYSCALL +#define PT_REGS_PARM2_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM2_SYSCALL_REG) +#define PT_REGS_PARM2_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM2_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM3_SYSCALL +#define PT_REGS_PARM3_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM3_SYSCALL_REG) +#define PT_REGS_PARM3_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM3_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM4_SYSCALL +#define PT_REGS_PARM4_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM4_SYSCALL_REG) +#define PT_REGS_PARM4_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM4_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM5_SYSCALL +#define PT_REGS_PARM5_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM5_SYSCALL_REG) +#define PT_REGS_PARM5_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM5_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM6_SYSCALL +#define PT_REGS_PARM6_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM6_SYSCALL_REG) +#define PT_REGS_PARM6_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM6_SYSCALL_REG) +#endif +#ifndef PT_REGS_PARM7_SYSCALL +#define PT_REGS_PARM7_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_PARM7_SYSCALL_REG) +#define PT_REGS_PARM7_CORE_SYSCALL(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM7_SYSCALL_REG) +#endif + +#else /* defined(bpf_target_defined) */ + +#define PT_REGS_PARM1(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM8(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RET(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_FP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RC(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_SP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_IP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define PT_REGS_PARM1_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM8_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RET_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_FP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_RC_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_SP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_IP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define PT_REGS_PARM1_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#define PT_REGS_PARM1_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM2_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM3_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM4_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM5_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM6_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) +#define PT_REGS_PARM7_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) + +#endif /* defined(bpf_target_defined) */ + +/* + * When invoked from a syscall handler kprobe, returns a pointer to a + * struct pt_regs containing syscall arguments and suitable for passing to + * PT_REGS_PARMn_SYSCALL() and PT_REGS_PARMn_CORE_SYSCALL(). + */ +#ifndef PT_REGS_SYSCALL_REGS +/* By default, assume that the arch selects ARCH_HAS_SYSCALL_WRAPPER. */ +#define PT_REGS_SYSCALL_REGS(ctx) ((struct pt_regs *)PT_REGS_PARM1(ctx)) +#endif + +#ifndef ___bpf_concat +#define ___bpf_concat(a, b) a ## b +#endif +#ifndef ___bpf_apply +#define ___bpf_apply(fn, n) ___bpf_concat(fn, n) +#endif +#ifndef ___bpf_nth +#define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N +#endif +#ifndef ___bpf_narg +#define ___bpf_narg(...) ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#endif + +#define ___bpf_ctx_cast0() ctx +#define ___bpf_ctx_cast1(x) ___bpf_ctx_cast0(), (void *)ctx[0] +#define ___bpf_ctx_cast2(x, args...) ___bpf_ctx_cast1(args), (void *)ctx[1] +#define ___bpf_ctx_cast3(x, args...) ___bpf_ctx_cast2(args), (void *)ctx[2] +#define ___bpf_ctx_cast4(x, args...) ___bpf_ctx_cast3(args), (void *)ctx[3] +#define ___bpf_ctx_cast5(x, args...) ___bpf_ctx_cast4(args), (void *)ctx[4] +#define ___bpf_ctx_cast6(x, args...) ___bpf_ctx_cast5(args), (void *)ctx[5] +#define ___bpf_ctx_cast7(x, args...) ___bpf_ctx_cast6(args), (void *)ctx[6] +#define ___bpf_ctx_cast8(x, args...) ___bpf_ctx_cast7(args), (void *)ctx[7] +#define ___bpf_ctx_cast9(x, args...) ___bpf_ctx_cast8(args), (void *)ctx[8] +#define ___bpf_ctx_cast10(x, args...) ___bpf_ctx_cast9(args), (void *)ctx[9] +#define ___bpf_ctx_cast11(x, args...) ___bpf_ctx_cast10(args), (void *)ctx[10] +#define ___bpf_ctx_cast12(x, args...) ___bpf_ctx_cast11(args), (void *)ctx[11] +#define ___bpf_ctx_cast(args...) ___bpf_apply(___bpf_ctx_cast, ___bpf_narg(args))(args) + +/* + * BPF_PROG is a convenience wrapper for generic tp_btf/fentry/fexit and + * similar kinds of BPF programs, that accept input arguments as a single + * pointer to untyped u64 array, where each u64 can actually be a typed + * pointer or integer of different size. Instead of requring user to write + * manual casts and work with array elements by index, BPF_PROG macro + * allows user to declare a list of named and typed input arguments in the + * same syntax as for normal C function. All the casting is hidden and + * performed transparently, while user code can just assume working with + * function arguments of specified type and name. + * + * Original raw context argument is preserved as well as 'ctx' argument. + * This is useful when using BPF helpers that expect original context + * as one of the parameters (e.g., for bpf_perf_event_output()). + */ +#define BPF_PROG(name, args...) \ +name(unsigned long long *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx, ##args); \ +typeof(name(0)) name(unsigned long long *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_ctx_cast(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx, ##args) + +#ifndef ___bpf_nth2 +#define ___bpf_nth2(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, \ + _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, N, ...) N +#endif +#ifndef ___bpf_narg2 +#define ___bpf_narg2(...) \ + ___bpf_nth2(_, ##__VA_ARGS__, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, \ + 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0) +#endif + +#define ___bpf_treg_cnt(t) \ + __builtin_choose_expr(sizeof(t) == 1, 1, \ + __builtin_choose_expr(sizeof(t) == 2, 1, \ + __builtin_choose_expr(sizeof(t) == 4, 1, \ + __builtin_choose_expr(sizeof(t) == 8, 1, \ + __builtin_choose_expr(sizeof(t) == 16, 2, \ + (void)0))))) + +#define ___bpf_reg_cnt0() (0) +#define ___bpf_reg_cnt1(t, x) (___bpf_reg_cnt0() + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt2(t, x, args...) (___bpf_reg_cnt1(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt3(t, x, args...) (___bpf_reg_cnt2(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt4(t, x, args...) (___bpf_reg_cnt3(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt5(t, x, args...) (___bpf_reg_cnt4(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt6(t, x, args...) (___bpf_reg_cnt5(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt7(t, x, args...) (___bpf_reg_cnt6(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt8(t, x, args...) (___bpf_reg_cnt7(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt9(t, x, args...) (___bpf_reg_cnt8(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt10(t, x, args...) (___bpf_reg_cnt9(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt11(t, x, args...) (___bpf_reg_cnt10(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt12(t, x, args...) (___bpf_reg_cnt11(args) + ___bpf_treg_cnt(t)) +#define ___bpf_reg_cnt(args...) ___bpf_apply(___bpf_reg_cnt, ___bpf_narg2(args))(args) + +#define ___bpf_union_arg(t, x, n) \ + __builtin_choose_expr(sizeof(t) == 1, ({ union { __u8 z[1]; t x; } ___t = { .z = {ctx[n]}}; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 2, ({ union { __u16 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 4, ({ union { __u32 z[1]; t x; } ___t = { .z = {ctx[n]} }; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 8, ({ union { __u64 z[1]; t x; } ___t = {.z = {ctx[n]} }; ___t.x; }), \ + __builtin_choose_expr(sizeof(t) == 16, ({ union { __u64 z[2]; t x; } ___t = {.z = {ctx[n], ctx[n + 1]} }; ___t.x; }), \ + (void)0))))) + +#define ___bpf_ctx_arg0(n, args...) +#define ___bpf_ctx_arg1(n, t, x) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt1(t, x)) +#define ___bpf_ctx_arg2(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt2(t, x, args)) ___bpf_ctx_arg1(n, args) +#define ___bpf_ctx_arg3(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt3(t, x, args)) ___bpf_ctx_arg2(n, args) +#define ___bpf_ctx_arg4(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt4(t, x, args)) ___bpf_ctx_arg3(n, args) +#define ___bpf_ctx_arg5(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt5(t, x, args)) ___bpf_ctx_arg4(n, args) +#define ___bpf_ctx_arg6(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt6(t, x, args)) ___bpf_ctx_arg5(n, args) +#define ___bpf_ctx_arg7(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt7(t, x, args)) ___bpf_ctx_arg6(n, args) +#define ___bpf_ctx_arg8(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt8(t, x, args)) ___bpf_ctx_arg7(n, args) +#define ___bpf_ctx_arg9(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt9(t, x, args)) ___bpf_ctx_arg8(n, args) +#define ___bpf_ctx_arg10(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt10(t, x, args)) ___bpf_ctx_arg9(n, args) +#define ___bpf_ctx_arg11(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt11(t, x, args)) ___bpf_ctx_arg10(n, args) +#define ___bpf_ctx_arg12(n, t, x, args...) , ___bpf_union_arg(t, x, n - ___bpf_reg_cnt12(t, x, args)) ___bpf_ctx_arg11(n, args) +#define ___bpf_ctx_arg(args...) ___bpf_apply(___bpf_ctx_arg, ___bpf_narg2(args))(___bpf_reg_cnt(args), args) + +#define ___bpf_ctx_decl0() +#define ___bpf_ctx_decl1(t, x) , t x +#define ___bpf_ctx_decl2(t, x, args...) , t x ___bpf_ctx_decl1(args) +#define ___bpf_ctx_decl3(t, x, args...) , t x ___bpf_ctx_decl2(args) +#define ___bpf_ctx_decl4(t, x, args...) , t x ___bpf_ctx_decl3(args) +#define ___bpf_ctx_decl5(t, x, args...) , t x ___bpf_ctx_decl4(args) +#define ___bpf_ctx_decl6(t, x, args...) , t x ___bpf_ctx_decl5(args) +#define ___bpf_ctx_decl7(t, x, args...) , t x ___bpf_ctx_decl6(args) +#define ___bpf_ctx_decl8(t, x, args...) , t x ___bpf_ctx_decl7(args) +#define ___bpf_ctx_decl9(t, x, args...) , t x ___bpf_ctx_decl8(args) +#define ___bpf_ctx_decl10(t, x, args...) , t x ___bpf_ctx_decl9(args) +#define ___bpf_ctx_decl11(t, x, args...) , t x ___bpf_ctx_decl10(args) +#define ___bpf_ctx_decl12(t, x, args...) , t x ___bpf_ctx_decl11(args) +#define ___bpf_ctx_decl(args...) ___bpf_apply(___bpf_ctx_decl, ___bpf_narg2(args))(args) + +/* + * BPF_PROG2 is an enhanced version of BPF_PROG in order to handle struct + * arguments. Since each struct argument might take one or two u64 values + * in the trampoline stack, argument type size is needed to place proper number + * of u64 values for each argument. Therefore, BPF_PROG2 has different + * syntax from BPF_PROG. For example, for the following BPF_PROG syntax: + * + * int BPF_PROG(test2, int a, int b) { ... } + * + * the corresponding BPF_PROG2 syntax is: + * + * int BPF_PROG2(test2, int, a, int, b) { ... } + * + * where type and the corresponding argument name are separated by comma. + * + * Use BPF_PROG2 macro if one of the arguments might be a struct/union larger + * than 8 bytes: + * + * int BPF_PROG2(test_struct_arg, struct bpf_testmod_struct_arg_1, a, int, b, + * int, c, int, d, struct bpf_testmod_struct_arg_2, e, int, ret) + * { + * // access a, b, c, d, e, and ret directly + * ... + * } + */ +#define BPF_PROG2(name, args...) \ +name(unsigned long long *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx ___bpf_ctx_decl(args)); \ +typeof(name(0)) name(unsigned long long *ctx) \ +{ \ + return ____##name(ctx ___bpf_ctx_arg(args)); \ +} \ +static __always_inline typeof(name(0)) \ +____##name(unsigned long long *ctx ___bpf_ctx_decl(args)) + +struct pt_regs; + +#define ___bpf_kprobe_args0() ctx +#define ___bpf_kprobe_args1(x) ___bpf_kprobe_args0(), (void *)PT_REGS_PARM1(ctx) +#define ___bpf_kprobe_args2(x, args...) ___bpf_kprobe_args1(args), (void *)PT_REGS_PARM2(ctx) +#define ___bpf_kprobe_args3(x, args...) ___bpf_kprobe_args2(args), (void *)PT_REGS_PARM3(ctx) +#define ___bpf_kprobe_args4(x, args...) ___bpf_kprobe_args3(args), (void *)PT_REGS_PARM4(ctx) +#define ___bpf_kprobe_args5(x, args...) ___bpf_kprobe_args4(args), (void *)PT_REGS_PARM5(ctx) +#define ___bpf_kprobe_args6(x, args...) ___bpf_kprobe_args5(args), (void *)PT_REGS_PARM6(ctx) +#define ___bpf_kprobe_args7(x, args...) ___bpf_kprobe_args6(args), (void *)PT_REGS_PARM7(ctx) +#define ___bpf_kprobe_args8(x, args...) ___bpf_kprobe_args7(args), (void *)PT_REGS_PARM8(ctx) +#define ___bpf_kprobe_args(args...) ___bpf_apply(___bpf_kprobe_args, ___bpf_narg(args))(args) + +/* + * BPF_KPROBE serves the same purpose for kprobes as BPF_PROG for + * tp_btf/fentry/fexit BPF programs. It hides the underlying platform-specific + * low-level way of getting kprobe input arguments from struct pt_regs, and + * provides a familiar typed and named function arguments syntax and + * semantics of accessing kprobe input paremeters. + * + * Original struct pt_regs* context is preserved as 'ctx' argument. This might + * be necessary when using BPF helpers like bpf_perf_event_output(). + */ +#define BPF_KPROBE(name, args...) \ +name(struct pt_regs *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_kprobe_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args) + +#define ___bpf_kretprobe_args0() ctx +#define ___bpf_kretprobe_args1(x) ___bpf_kretprobe_args0(), (void *)PT_REGS_RC(ctx) +#define ___bpf_kretprobe_args(args...) ___bpf_apply(___bpf_kretprobe_args, ___bpf_narg(args))(args) + +/* + * BPF_KRETPROBE is similar to BPF_KPROBE, except, it only provides optional + * return value (in addition to `struct pt_regs *ctx`), but no input + * arguments, because they will be clobbered by the time probed function + * returns. + */ +#define BPF_KRETPROBE(name, args...) \ +name(struct pt_regs *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_kretprobe_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) ____##name(struct pt_regs *ctx, ##args) + +/* If kernel has CONFIG_ARCH_HAS_SYSCALL_WRAPPER, read pt_regs directly */ +#define ___bpf_syscall_args0() ctx +#define ___bpf_syscall_args1(x) ___bpf_syscall_args0(), (void *)PT_REGS_PARM1_SYSCALL(regs) +#define ___bpf_syscall_args2(x, args...) ___bpf_syscall_args1(args), (void *)PT_REGS_PARM2_SYSCALL(regs) +#define ___bpf_syscall_args3(x, args...) ___bpf_syscall_args2(args), (void *)PT_REGS_PARM3_SYSCALL(regs) +#define ___bpf_syscall_args4(x, args...) ___bpf_syscall_args3(args), (void *)PT_REGS_PARM4_SYSCALL(regs) +#define ___bpf_syscall_args5(x, args...) ___bpf_syscall_args4(args), (void *)PT_REGS_PARM5_SYSCALL(regs) +#define ___bpf_syscall_args6(x, args...) ___bpf_syscall_args5(args), (void *)PT_REGS_PARM6_SYSCALL(regs) +#define ___bpf_syscall_args7(x, args...) ___bpf_syscall_args6(args), (void *)PT_REGS_PARM7_SYSCALL(regs) +#define ___bpf_syscall_args(args...) ___bpf_apply(___bpf_syscall_args, ___bpf_narg(args))(args) + +/* If kernel doesn't have CONFIG_ARCH_HAS_SYSCALL_WRAPPER, we have to BPF_CORE_READ from pt_regs */ +#define ___bpf_syswrap_args0() ctx +#define ___bpf_syswrap_args1(x) ___bpf_syswrap_args0(), (void *)PT_REGS_PARM1_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args2(x, args...) ___bpf_syswrap_args1(args), (void *)PT_REGS_PARM2_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args3(x, args...) ___bpf_syswrap_args2(args), (void *)PT_REGS_PARM3_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args4(x, args...) ___bpf_syswrap_args3(args), (void *)PT_REGS_PARM4_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args5(x, args...) ___bpf_syswrap_args4(args), (void *)PT_REGS_PARM5_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args6(x, args...) ___bpf_syswrap_args5(args), (void *)PT_REGS_PARM6_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args7(x, args...) ___bpf_syswrap_args6(args), (void *)PT_REGS_PARM7_CORE_SYSCALL(regs) +#define ___bpf_syswrap_args(args...) ___bpf_apply(___bpf_syswrap_args, ___bpf_narg(args))(args) + +/* + * BPF_KSYSCALL is a variant of BPF_KPROBE, which is intended for + * tracing syscall functions, like __x64_sys_close. It hides the underlying + * platform-specific low-level way of getting syscall input arguments from + * struct pt_regs, and provides a familiar typed and named function arguments + * syntax and semantics of accessing syscall input parameters. + * + * Original struct pt_regs * context is preserved as 'ctx' argument. This might + * be necessary when using BPF helpers like bpf_perf_event_output(). + * + * At the moment BPF_KSYSCALL does not transparently handle all the calling + * convention quirks for the following syscalls: + * + * - mmap(): __ARCH_WANT_SYS_OLD_MMAP. + * - clone(): CONFIG_CLONE_BACKWARDS, CONFIG_CLONE_BACKWARDS2 and + * CONFIG_CLONE_BACKWARDS3. + * - socket-related syscalls: __ARCH_WANT_SYS_SOCKETCALL. + * - compat syscalls. + * + * This may or may not change in the future. User needs to take extra measures + * to handle such quirks explicitly, if necessary. + * + * This macro relies on BPF CO-RE support and virtual __kconfig externs. + */ +#define BPF_KSYSCALL(name, args...) \ +name(struct pt_regs *ctx); \ +extern _Bool LINUX_HAS_SYSCALL_WRAPPER __kconfig; \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + struct pt_regs *regs = LINUX_HAS_SYSCALL_WRAPPER \ + ? (struct pt_regs *)PT_REGS_PARM1(ctx) \ + : ctx; \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + if (LINUX_HAS_SYSCALL_WRAPPER) \ + return ____##name(___bpf_syswrap_args(args)); \ + else \ + return ____##name(___bpf_syscall_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args) + +#define BPF_KPROBE_SYSCALL BPF_KSYSCALL + +/* BPF_UPROBE and BPF_URETPROBE are identical to BPF_KPROBE and BPF_KRETPROBE, + * but are named way less confusingly for SEC("uprobe") and SEC("uretprobe") + * use cases. + */ +#define BPF_UPROBE(name, args...) BPF_KPROBE(name, ##args) +#define BPF_URETPROBE(name, args...) BPF_KRETPROBE(name, ##args) + +#endif diff --git a/libbpf/src/btf.c b/libbpf/src/btf.c new file mode 100644 index 0000000..5190f5b --- /dev/null +++ b/libbpf/src/btf.c @@ -0,0 +1,5026 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2018 Facebook */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "btf.h" +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" +#include "hashmap.h" +#include "strset.h" + +#define BTF_MAX_NR_TYPES 0x7fffffffU +#define BTF_MAX_STR_OFFSET 0x7fffffffU + +static struct btf_type btf_void; + +struct btf { + /* raw BTF data in native endianness */ + void *raw_data; + /* raw BTF data in non-native endianness */ + void *raw_data_swapped; + __u32 raw_size; + /* whether target endianness differs from the native one */ + bool swapped_endian; + + /* + * When BTF is loaded from an ELF or raw memory it is stored + * in a contiguous memory block. The hdr, type_data, and, strs_data + * point inside that memory region to their respective parts of BTF + * representation: + * + * +--------------------------------+ + * | Header | Types | Strings | + * +--------------------------------+ + * ^ ^ ^ + * | | | + * hdr | | + * types_data-+ | + * strs_data------------+ + * + * If BTF data is later modified, e.g., due to types added or + * removed, BTF deduplication performed, etc, this contiguous + * representation is broken up into three independently allocated + * memory regions to be able to modify them independently. + * raw_data is nulled out at that point, but can be later allocated + * and cached again if user calls btf__raw_data(), at which point + * raw_data will contain a contiguous copy of header, types, and + * strings: + * + * +----------+ +---------+ +-----------+ + * | Header | | Types | | Strings | + * +----------+ +---------+ +-----------+ + * ^ ^ ^ + * | | | + * hdr | | + * types_data----+ | + * strset__data(strs_set)-----+ + * + * +----------+---------+-----------+ + * | Header | Types | Strings | + * raw_data----->+----------+---------+-----------+ + */ + struct btf_header *hdr; + + void *types_data; + size_t types_data_cap; /* used size stored in hdr->type_len */ + + /* type ID to `struct btf_type *` lookup index + * type_offs[0] corresponds to the first non-VOID type: + * - for base BTF it's type [1]; + * - for split BTF it's the first non-base BTF type. + */ + __u32 *type_offs; + size_t type_offs_cap; + /* number of types in this BTF instance: + * - doesn't include special [0] void type; + * - for split BTF counts number of types added on top of base BTF. + */ + __u32 nr_types; + /* if not NULL, points to the base BTF on top of which the current + * split BTF is based + */ + struct btf *base_btf; + /* BTF type ID of the first type in this BTF instance: + * - for base BTF it's equal to 1; + * - for split BTF it's equal to biggest type ID of base BTF plus 1. + */ + int start_id; + /* logical string offset of this BTF instance: + * - for base BTF it's equal to 0; + * - for split BTF it's equal to total size of base BTF's string section size. + */ + int start_str_off; + + /* only one of strs_data or strs_set can be non-NULL, depending on + * whether BTF is in a modifiable state (strs_set is used) or not + * (strs_data points inside raw_data) + */ + void *strs_data; + /* a set of unique strings */ + struct strset *strs_set; + /* whether strings are already deduplicated */ + bool strs_deduped; + + /* BTF object FD, if loaded into kernel */ + int fd; + + /* Pointer size (in bytes) for a target architecture of this BTF */ + int ptr_sz; +}; + +static inline __u64 ptr_to_u64(const void *ptr) +{ + return (__u64) (unsigned long) ptr; +} + +/* Ensure given dynamically allocated memory region pointed to by *data* with + * capacity of *cap_cnt* elements each taking *elem_sz* bytes has enough + * memory to accommodate *add_cnt* new elements, assuming *cur_cnt* elements + * are already used. At most *max_cnt* elements can be ever allocated. + * If necessary, memory is reallocated and all existing data is copied over, + * new pointer to the memory region is stored at *data, new memory region + * capacity (in number of elements) is stored in *cap. + * On success, memory pointer to the beginning of unused memory is returned. + * On error, NULL is returned. + */ +void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz, + size_t cur_cnt, size_t max_cnt, size_t add_cnt) +{ + size_t new_cnt; + void *new_data; + + if (cur_cnt + add_cnt <= *cap_cnt) + return *data + cur_cnt * elem_sz; + + /* requested more than the set limit */ + if (cur_cnt + add_cnt > max_cnt) + return NULL; + + new_cnt = *cap_cnt; + new_cnt += new_cnt / 4; /* expand by 25% */ + if (new_cnt < 16) /* but at least 16 elements */ + new_cnt = 16; + if (new_cnt > max_cnt) /* but not exceeding a set limit */ + new_cnt = max_cnt; + if (new_cnt < cur_cnt + add_cnt) /* also ensure we have enough memory */ + new_cnt = cur_cnt + add_cnt; + + new_data = libbpf_reallocarray(*data, new_cnt, elem_sz); + if (!new_data) + return NULL; + + /* zero out newly allocated portion of memory */ + memset(new_data + (*cap_cnt) * elem_sz, 0, (new_cnt - *cap_cnt) * elem_sz); + + *data = new_data; + *cap_cnt = new_cnt; + return new_data + cur_cnt * elem_sz; +} + +/* Ensure given dynamically allocated memory region has enough allocated space + * to accommodate *need_cnt* elements of size *elem_sz* bytes each + */ +int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt) +{ + void *p; + + if (need_cnt <= *cap_cnt) + return 0; + + p = libbpf_add_mem(data, cap_cnt, elem_sz, *cap_cnt, SIZE_MAX, need_cnt - *cap_cnt); + if (!p) + return -ENOMEM; + + return 0; +} + +static void *btf_add_type_offs_mem(struct btf *btf, size_t add_cnt) +{ + return libbpf_add_mem((void **)&btf->type_offs, &btf->type_offs_cap, sizeof(__u32), + btf->nr_types, BTF_MAX_NR_TYPES, add_cnt); +} + +static int btf_add_type_idx_entry(struct btf *btf, __u32 type_off) +{ + __u32 *p; + + p = btf_add_type_offs_mem(btf, 1); + if (!p) + return -ENOMEM; + + *p = type_off; + return 0; +} + +static void btf_bswap_hdr(struct btf_header *h) +{ + h->magic = bswap_16(h->magic); + h->hdr_len = bswap_32(h->hdr_len); + h->type_off = bswap_32(h->type_off); + h->type_len = bswap_32(h->type_len); + h->str_off = bswap_32(h->str_off); + h->str_len = bswap_32(h->str_len); +} + +static int btf_parse_hdr(struct btf *btf) +{ + struct btf_header *hdr = btf->hdr; + __u32 meta_left; + + if (btf->raw_size < sizeof(struct btf_header)) { + pr_debug("BTF header not found\n"); + return -EINVAL; + } + + if (hdr->magic == bswap_16(BTF_MAGIC)) { + btf->swapped_endian = true; + if (bswap_32(hdr->hdr_len) != sizeof(struct btf_header)) { + pr_warn("Can't load BTF with non-native endianness due to unsupported header length %u\n", + bswap_32(hdr->hdr_len)); + return -ENOTSUP; + } + btf_bswap_hdr(hdr); + } else if (hdr->magic != BTF_MAGIC) { + pr_debug("Invalid BTF magic: %x\n", hdr->magic); + return -EINVAL; + } + + if (btf->raw_size < hdr->hdr_len) { + pr_debug("BTF header len %u larger than data size %u\n", + hdr->hdr_len, btf->raw_size); + return -EINVAL; + } + + meta_left = btf->raw_size - hdr->hdr_len; + if (meta_left < (long long)hdr->str_off + hdr->str_len) { + pr_debug("Invalid BTF total size: %u\n", btf->raw_size); + return -EINVAL; + } + + if ((long long)hdr->type_off + hdr->type_len > hdr->str_off) { + pr_debug("Invalid BTF data sections layout: type data at %u + %u, strings data at %u + %u\n", + hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len); + return -EINVAL; + } + + if (hdr->type_off % 4) { + pr_debug("BTF type section is not aligned to 4 bytes\n"); + return -EINVAL; + } + + return 0; +} + +static int btf_parse_str_sec(struct btf *btf) +{ + const struct btf_header *hdr = btf->hdr; + const char *start = btf->strs_data; + const char *end = start + btf->hdr->str_len; + + if (btf->base_btf && hdr->str_len == 0) + return 0; + if (!hdr->str_len || hdr->str_len - 1 > BTF_MAX_STR_OFFSET || end[-1]) { + pr_debug("Invalid BTF string section\n"); + return -EINVAL; + } + if (!btf->base_btf && start[0]) { + pr_debug("Invalid BTF string section\n"); + return -EINVAL; + } + return 0; +} + +static int btf_type_size(const struct btf_type *t) +{ + const int base_size = sizeof(struct btf_type); + __u16 vlen = btf_vlen(t); + + switch (btf_kind(t)) { + case BTF_KIND_FWD: + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_FLOAT: + case BTF_KIND_TYPE_TAG: + return base_size; + case BTF_KIND_INT: + return base_size + sizeof(__u32); + case BTF_KIND_ENUM: + return base_size + vlen * sizeof(struct btf_enum); + case BTF_KIND_ENUM64: + return base_size + vlen * sizeof(struct btf_enum64); + case BTF_KIND_ARRAY: + return base_size + sizeof(struct btf_array); + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + return base_size + vlen * sizeof(struct btf_member); + case BTF_KIND_FUNC_PROTO: + return base_size + vlen * sizeof(struct btf_param); + case BTF_KIND_VAR: + return base_size + sizeof(struct btf_var); + case BTF_KIND_DATASEC: + return base_size + vlen * sizeof(struct btf_var_secinfo); + case BTF_KIND_DECL_TAG: + return base_size + sizeof(struct btf_decl_tag); + default: + pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t)); + return -EINVAL; + } +} + +static void btf_bswap_type_base(struct btf_type *t) +{ + t->name_off = bswap_32(t->name_off); + t->info = bswap_32(t->info); + t->type = bswap_32(t->type); +} + +static int btf_bswap_type_rest(struct btf_type *t) +{ + struct btf_var_secinfo *v; + struct btf_enum64 *e64; + struct btf_member *m; + struct btf_array *a; + struct btf_param *p; + struct btf_enum *e; + __u16 vlen = btf_vlen(t); + int i; + + switch (btf_kind(t)) { + case BTF_KIND_FWD: + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_FLOAT: + case BTF_KIND_TYPE_TAG: + return 0; + case BTF_KIND_INT: + *(__u32 *)(t + 1) = bswap_32(*(__u32 *)(t + 1)); + return 0; + case BTF_KIND_ENUM: + for (i = 0, e = btf_enum(t); i < vlen; i++, e++) { + e->name_off = bswap_32(e->name_off); + e->val = bswap_32(e->val); + } + return 0; + case BTF_KIND_ENUM64: + for (i = 0, e64 = btf_enum64(t); i < vlen; i++, e64++) { + e64->name_off = bswap_32(e64->name_off); + e64->val_lo32 = bswap_32(e64->val_lo32); + e64->val_hi32 = bswap_32(e64->val_hi32); + } + return 0; + case BTF_KIND_ARRAY: + a = btf_array(t); + a->type = bswap_32(a->type); + a->index_type = bswap_32(a->index_type); + a->nelems = bswap_32(a->nelems); + return 0; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + for (i = 0, m = btf_members(t); i < vlen; i++, m++) { + m->name_off = bswap_32(m->name_off); + m->type = bswap_32(m->type); + m->offset = bswap_32(m->offset); + } + return 0; + case BTF_KIND_FUNC_PROTO: + for (i = 0, p = btf_params(t); i < vlen; i++, p++) { + p->name_off = bswap_32(p->name_off); + p->type = bswap_32(p->type); + } + return 0; + case BTF_KIND_VAR: + btf_var(t)->linkage = bswap_32(btf_var(t)->linkage); + return 0; + case BTF_KIND_DATASEC: + for (i = 0, v = btf_var_secinfos(t); i < vlen; i++, v++) { + v->type = bswap_32(v->type); + v->offset = bswap_32(v->offset); + v->size = bswap_32(v->size); + } + return 0; + case BTF_KIND_DECL_TAG: + btf_decl_tag(t)->component_idx = bswap_32(btf_decl_tag(t)->component_idx); + return 0; + default: + pr_debug("Unsupported BTF_KIND:%u\n", btf_kind(t)); + return -EINVAL; + } +} + +static int btf_parse_type_sec(struct btf *btf) +{ + struct btf_header *hdr = btf->hdr; + void *next_type = btf->types_data; + void *end_type = next_type + hdr->type_len; + int err, type_size; + + while (next_type + sizeof(struct btf_type) <= end_type) { + if (btf->swapped_endian) + btf_bswap_type_base(next_type); + + type_size = btf_type_size(next_type); + if (type_size < 0) + return type_size; + if (next_type + type_size > end_type) { + pr_warn("BTF type [%d] is malformed\n", btf->start_id + btf->nr_types); + return -EINVAL; + } + + if (btf->swapped_endian && btf_bswap_type_rest(next_type)) + return -EINVAL; + + err = btf_add_type_idx_entry(btf, next_type - btf->types_data); + if (err) + return err; + + next_type += type_size; + btf->nr_types++; + } + + if (next_type != end_type) { + pr_warn("BTF types data is malformed\n"); + return -EINVAL; + } + + return 0; +} + +__u32 btf__type_cnt(const struct btf *btf) +{ + return btf->start_id + btf->nr_types; +} + +const struct btf *btf__base_btf(const struct btf *btf) +{ + return btf->base_btf; +} + +/* internal helper returning non-const pointer to a type */ +struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id) +{ + if (type_id == 0) + return &btf_void; + if (type_id < btf->start_id) + return btf_type_by_id(btf->base_btf, type_id); + return btf->types_data + btf->type_offs[type_id - btf->start_id]; +} + +const struct btf_type *btf__type_by_id(const struct btf *btf, __u32 type_id) +{ + if (type_id >= btf->start_id + btf->nr_types) + return errno = EINVAL, NULL; + return btf_type_by_id((struct btf *)btf, type_id); +} + +static int determine_ptr_size(const struct btf *btf) +{ + static const char * const long_aliases[] = { + "long", + "long int", + "int long", + "unsigned long", + "long unsigned", + "unsigned long int", + "unsigned int long", + "long unsigned int", + "long int unsigned", + "int unsigned long", + "int long unsigned", + }; + const struct btf_type *t; + const char *name; + int i, j, n; + + if (btf->base_btf && btf->base_btf->ptr_sz > 0) + return btf->base_btf->ptr_sz; + + n = btf__type_cnt(btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(btf, i); + if (!btf_is_int(t)) + continue; + + if (t->size != 4 && t->size != 8) + continue; + + name = btf__name_by_offset(btf, t->name_off); + if (!name) + continue; + + for (j = 0; j < ARRAY_SIZE(long_aliases); j++) { + if (strcmp(name, long_aliases[j]) == 0) + return t->size; + } + } + + return -1; +} + +static size_t btf_ptr_sz(const struct btf *btf) +{ + if (!btf->ptr_sz) + ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); + return btf->ptr_sz < 0 ? sizeof(void *) : btf->ptr_sz; +} + +/* Return pointer size this BTF instance assumes. The size is heuristically + * determined by looking for 'long' or 'unsigned long' integer type and + * recording its size in bytes. If BTF type information doesn't have any such + * type, this function returns 0. In the latter case, native architecture's + * pointer size is assumed, so will be either 4 or 8, depending on + * architecture that libbpf was compiled for. It's possible to override + * guessed value by using btf__set_pointer_size() API. + */ +size_t btf__pointer_size(const struct btf *btf) +{ + if (!btf->ptr_sz) + ((struct btf *)btf)->ptr_sz = determine_ptr_size(btf); + + if (btf->ptr_sz < 0) + /* not enough BTF type info to guess */ + return 0; + + return btf->ptr_sz; +} + +/* Override or set pointer size in bytes. Only values of 4 and 8 are + * supported. + */ +int btf__set_pointer_size(struct btf *btf, size_t ptr_sz) +{ + if (ptr_sz != 4 && ptr_sz != 8) + return libbpf_err(-EINVAL); + btf->ptr_sz = ptr_sz; + return 0; +} + +static bool is_host_big_endian(void) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return false; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + return true; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif +} + +enum btf_endianness btf__endianness(const struct btf *btf) +{ + if (is_host_big_endian()) + return btf->swapped_endian ? BTF_LITTLE_ENDIAN : BTF_BIG_ENDIAN; + else + return btf->swapped_endian ? BTF_BIG_ENDIAN : BTF_LITTLE_ENDIAN; +} + +int btf__set_endianness(struct btf *btf, enum btf_endianness endian) +{ + if (endian != BTF_LITTLE_ENDIAN && endian != BTF_BIG_ENDIAN) + return libbpf_err(-EINVAL); + + btf->swapped_endian = is_host_big_endian() != (endian == BTF_BIG_ENDIAN); + if (!btf->swapped_endian) { + free(btf->raw_data_swapped); + btf->raw_data_swapped = NULL; + } + return 0; +} + +static bool btf_type_is_void(const struct btf_type *t) +{ + return t == &btf_void || btf_is_fwd(t); +} + +static bool btf_type_is_void_or_null(const struct btf_type *t) +{ + return !t || btf_type_is_void(t); +} + +#define MAX_RESOLVE_DEPTH 32 + +__s64 btf__resolve_size(const struct btf *btf, __u32 type_id) +{ + const struct btf_array *array; + const struct btf_type *t; + __u32 nelems = 1; + __s64 size = -1; + int i; + + t = btf__type_by_id(btf, type_id); + for (i = 0; i < MAX_RESOLVE_DEPTH && !btf_type_is_void_or_null(t); i++) { + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_DATASEC: + case BTF_KIND_FLOAT: + size = t->size; + goto done; + case BTF_KIND_PTR: + size = btf_ptr_sz(btf); + goto done; + case BTF_KIND_TYPEDEF: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_VAR: + case BTF_KIND_DECL_TAG: + case BTF_KIND_TYPE_TAG: + type_id = t->type; + break; + case BTF_KIND_ARRAY: + array = btf_array(t); + if (nelems && array->nelems > UINT32_MAX / nelems) + return libbpf_err(-E2BIG); + nelems *= array->nelems; + type_id = array->type; + break; + default: + return libbpf_err(-EINVAL); + } + + t = btf__type_by_id(btf, type_id); + } + +done: + if (size < 0) + return libbpf_err(-EINVAL); + if (nelems && size > UINT32_MAX / nelems) + return libbpf_err(-E2BIG); + + return nelems * size; +} + +int btf__align_of(const struct btf *btf, __u32 id) +{ + const struct btf_type *t = btf__type_by_id(btf, id); + __u16 kind = btf_kind(t); + + switch (kind) { + case BTF_KIND_INT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FLOAT: + return min(btf_ptr_sz(btf), (size_t)t->size); + case BTF_KIND_PTR: + return btf_ptr_sz(btf); + case BTF_KIND_TYPEDEF: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_TYPE_TAG: + return btf__align_of(btf, t->type); + case BTF_KIND_ARRAY: + return btf__align_of(btf, btf_array(t)->type); + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m = btf_members(t); + __u16 vlen = btf_vlen(t); + int i, max_align = 1, align; + + for (i = 0; i < vlen; i++, m++) { + align = btf__align_of(btf, m->type); + if (align <= 0) + return libbpf_err(align); + max_align = max(max_align, align); + + /* if field offset isn't aligned according to field + * type's alignment, then struct must be packed + */ + if (btf_member_bitfield_size(t, i) == 0 && + (m->offset % (8 * align)) != 0) + return 1; + } + + /* if struct/union size isn't a multiple of its alignment, + * then struct must be packed + */ + if ((t->size % max_align) != 0) + return 1; + + return max_align; + } + default: + pr_warn("unsupported BTF_KIND:%u\n", btf_kind(t)); + return errno = EINVAL, 0; + } +} + +int btf__resolve_type(const struct btf *btf, __u32 type_id) +{ + const struct btf_type *t; + int depth = 0; + + t = btf__type_by_id(btf, type_id); + while (depth < MAX_RESOLVE_DEPTH && + !btf_type_is_void_or_null(t) && + (btf_is_mod(t) || btf_is_typedef(t) || btf_is_var(t))) { + type_id = t->type; + t = btf__type_by_id(btf, type_id); + depth++; + } + + if (depth == MAX_RESOLVE_DEPTH || btf_type_is_void_or_null(t)) + return libbpf_err(-EINVAL); + + return type_id; +} + +__s32 btf__find_by_name(const struct btf *btf, const char *type_name) +{ + __u32 i, nr_types = btf__type_cnt(btf); + + if (!strcmp(type_name, "void")) + return 0; + + for (i = 1; i < nr_types; i++) { + const struct btf_type *t = btf__type_by_id(btf, i); + const char *name = btf__name_by_offset(btf, t->name_off); + + if (name && !strcmp(type_name, name)) + return i; + } + + return libbpf_err(-ENOENT); +} + +static __s32 btf_find_by_name_kind(const struct btf *btf, int start_id, + const char *type_name, __u32 kind) +{ + __u32 i, nr_types = btf__type_cnt(btf); + + if (kind == BTF_KIND_UNKN || !strcmp(type_name, "void")) + return 0; + + for (i = start_id; i < nr_types; i++) { + const struct btf_type *t = btf__type_by_id(btf, i); + const char *name; + + if (btf_kind(t) != kind) + continue; + name = btf__name_by_offset(btf, t->name_off); + if (name && !strcmp(type_name, name)) + return i; + } + + return libbpf_err(-ENOENT); +} + +__s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, + __u32 kind) +{ + return btf_find_by_name_kind(btf, btf->start_id, type_name, kind); +} + +__s32 btf__find_by_name_kind(const struct btf *btf, const char *type_name, + __u32 kind) +{ + return btf_find_by_name_kind(btf, 1, type_name, kind); +} + +static bool btf_is_modifiable(const struct btf *btf) +{ + return (void *)btf->hdr != btf->raw_data; +} + +void btf__free(struct btf *btf) +{ + if (IS_ERR_OR_NULL(btf)) + return; + + if (btf->fd >= 0) + close(btf->fd); + + if (btf_is_modifiable(btf)) { + /* if BTF was modified after loading, it will have a split + * in-memory representation for header, types, and strings + * sections, so we need to free all of them individually. It + * might still have a cached contiguous raw data present, + * which will be unconditionally freed below. + */ + free(btf->hdr); + free(btf->types_data); + strset__free(btf->strs_set); + } + free(btf->raw_data); + free(btf->raw_data_swapped); + free(btf->type_offs); + free(btf); +} + +static struct btf *btf_new_empty(struct btf *base_btf) +{ + struct btf *btf; + + btf = calloc(1, sizeof(*btf)); + if (!btf) + return ERR_PTR(-ENOMEM); + + btf->nr_types = 0; + btf->start_id = 1; + btf->start_str_off = 0; + btf->fd = -1; + btf->ptr_sz = sizeof(void *); + btf->swapped_endian = false; + + if (base_btf) { + btf->base_btf = base_btf; + btf->start_id = btf__type_cnt(base_btf); + btf->start_str_off = base_btf->hdr->str_len; + } + + /* +1 for empty string at offset 0 */ + btf->raw_size = sizeof(struct btf_header) + (base_btf ? 0 : 1); + btf->raw_data = calloc(1, btf->raw_size); + if (!btf->raw_data) { + free(btf); + return ERR_PTR(-ENOMEM); + } + + btf->hdr = btf->raw_data; + btf->hdr->hdr_len = sizeof(struct btf_header); + btf->hdr->magic = BTF_MAGIC; + btf->hdr->version = BTF_VERSION; + + btf->types_data = btf->raw_data + btf->hdr->hdr_len; + btf->strs_data = btf->raw_data + btf->hdr->hdr_len; + btf->hdr->str_len = base_btf ? 0 : 1; /* empty string at offset 0 */ + + return btf; +} + +struct btf *btf__new_empty(void) +{ + return libbpf_ptr(btf_new_empty(NULL)); +} + +struct btf *btf__new_empty_split(struct btf *base_btf) +{ + return libbpf_ptr(btf_new_empty(base_btf)); +} + +static struct btf *btf_new(const void *data, __u32 size, struct btf *base_btf) +{ + struct btf *btf; + int err; + + btf = calloc(1, sizeof(struct btf)); + if (!btf) + return ERR_PTR(-ENOMEM); + + btf->nr_types = 0; + btf->start_id = 1; + btf->start_str_off = 0; + btf->fd = -1; + + if (base_btf) { + btf->base_btf = base_btf; + btf->start_id = btf__type_cnt(base_btf); + btf->start_str_off = base_btf->hdr->str_len; + } + + btf->raw_data = malloc(size); + if (!btf->raw_data) { + err = -ENOMEM; + goto done; + } + memcpy(btf->raw_data, data, size); + btf->raw_size = size; + + btf->hdr = btf->raw_data; + err = btf_parse_hdr(btf); + if (err) + goto done; + + btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off; + btf->types_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->type_off; + + err = btf_parse_str_sec(btf); + err = err ?: btf_parse_type_sec(btf); + if (err) + goto done; + +done: + if (err) { + btf__free(btf); + return ERR_PTR(err); + } + + return btf; +} + +struct btf *btf__new(const void *data, __u32 size) +{ + return libbpf_ptr(btf_new(data, size, NULL)); +} + +static struct btf *btf_parse_elf(const char *path, struct btf *base_btf, + struct btf_ext **btf_ext) +{ + Elf_Data *btf_data = NULL, *btf_ext_data = NULL; + int err = 0, fd = -1, idx = 0; + struct btf *btf = NULL; + Elf_Scn *scn = NULL; + Elf *elf = NULL; + GElf_Ehdr ehdr; + size_t shstrndx; + + if (elf_version(EV_CURRENT) == EV_NONE) { + pr_warn("failed to init libelf for %s\n", path); + return ERR_PTR(-LIBBPF_ERRNO__LIBELF); + } + + fd = open(path, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + err = -errno; + pr_warn("failed to open %s: %s\n", path, strerror(errno)); + return ERR_PTR(err); + } + + err = -LIBBPF_ERRNO__FORMAT; + + elf = elf_begin(fd, ELF_C_READ, NULL); + if (!elf) { + pr_warn("failed to open %s as ELF file\n", path); + goto done; + } + if (!gelf_getehdr(elf, &ehdr)) { + pr_warn("failed to get EHDR from %s\n", path); + goto done; + } + + if (elf_getshdrstrndx(elf, &shstrndx)) { + pr_warn("failed to get section names section index for %s\n", + path); + goto done; + } + + if (!elf_rawdata(elf_getscn(elf, shstrndx), NULL)) { + pr_warn("failed to get e_shstrndx from %s\n", path); + goto done; + } + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + GElf_Shdr sh; + char *name; + + idx++; + if (gelf_getshdr(scn, &sh) != &sh) { + pr_warn("failed to get section(%d) header from %s\n", + idx, path); + goto done; + } + name = elf_strptr(elf, shstrndx, sh.sh_name); + if (!name) { + pr_warn("failed to get section(%d) name from %s\n", + idx, path); + goto done; + } + if (strcmp(name, BTF_ELF_SEC) == 0) { + btf_data = elf_getdata(scn, 0); + if (!btf_data) { + pr_warn("failed to get section(%d, %s) data from %s\n", + idx, name, path); + goto done; + } + continue; + } else if (btf_ext && strcmp(name, BTF_EXT_ELF_SEC) == 0) { + btf_ext_data = elf_getdata(scn, 0); + if (!btf_ext_data) { + pr_warn("failed to get section(%d, %s) data from %s\n", + idx, name, path); + goto done; + } + continue; + } + } + + if (!btf_data) { + pr_warn("failed to find '%s' ELF section in %s\n", BTF_ELF_SEC, path); + err = -ENODATA; + goto done; + } + btf = btf_new(btf_data->d_buf, btf_data->d_size, base_btf); + err = libbpf_get_error(btf); + if (err) + goto done; + + switch (gelf_getclass(elf)) { + case ELFCLASS32: + btf__set_pointer_size(btf, 4); + break; + case ELFCLASS64: + btf__set_pointer_size(btf, 8); + break; + default: + pr_warn("failed to get ELF class (bitness) for %s\n", path); + break; + } + + if (btf_ext && btf_ext_data) { + *btf_ext = btf_ext__new(btf_ext_data->d_buf, btf_ext_data->d_size); + err = libbpf_get_error(*btf_ext); + if (err) + goto done; + } else if (btf_ext) { + *btf_ext = NULL; + } +done: + if (elf) + elf_end(elf); + close(fd); + + if (!err) + return btf; + + if (btf_ext) + btf_ext__free(*btf_ext); + btf__free(btf); + + return ERR_PTR(err); +} + +struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext) +{ + return libbpf_ptr(btf_parse_elf(path, NULL, btf_ext)); +} + +struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf) +{ + return libbpf_ptr(btf_parse_elf(path, base_btf, NULL)); +} + +static struct btf *btf_parse_raw(const char *path, struct btf *base_btf) +{ + struct btf *btf = NULL; + void *data = NULL; + FILE *f = NULL; + __u16 magic; + int err = 0; + long sz; + + f = fopen(path, "rb"); + if (!f) { + err = -errno; + goto err_out; + } + + /* check BTF magic */ + if (fread(&magic, 1, sizeof(magic), f) < sizeof(magic)) { + err = -EIO; + goto err_out; + } + if (magic != BTF_MAGIC && magic != bswap_16(BTF_MAGIC)) { + /* definitely not a raw BTF */ + err = -EPROTO; + goto err_out; + } + + /* get file size */ + if (fseek(f, 0, SEEK_END)) { + err = -errno; + goto err_out; + } + sz = ftell(f); + if (sz < 0) { + err = -errno; + goto err_out; + } + /* rewind to the start */ + if (fseek(f, 0, SEEK_SET)) { + err = -errno; + goto err_out; + } + + /* pre-alloc memory and read all of BTF data */ + data = malloc(sz); + if (!data) { + err = -ENOMEM; + goto err_out; + } + if (fread(data, 1, sz, f) < sz) { + err = -EIO; + goto err_out; + } + + /* finally parse BTF data */ + btf = btf_new(data, sz, base_btf); + +err_out: + free(data); + if (f) + fclose(f); + return err ? ERR_PTR(err) : btf; +} + +struct btf *btf__parse_raw(const char *path) +{ + return libbpf_ptr(btf_parse_raw(path, NULL)); +} + +struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf) +{ + return libbpf_ptr(btf_parse_raw(path, base_btf)); +} + +static struct btf *btf_parse(const char *path, struct btf *base_btf, struct btf_ext **btf_ext) +{ + struct btf *btf; + int err; + + if (btf_ext) + *btf_ext = NULL; + + btf = btf_parse_raw(path, base_btf); + err = libbpf_get_error(btf); + if (!err) + return btf; + if (err != -EPROTO) + return ERR_PTR(err); + return btf_parse_elf(path, base_btf, btf_ext); +} + +struct btf *btf__parse(const char *path, struct btf_ext **btf_ext) +{ + return libbpf_ptr(btf_parse(path, NULL, btf_ext)); +} + +struct btf *btf__parse_split(const char *path, struct btf *base_btf) +{ + return libbpf_ptr(btf_parse(path, base_btf, NULL)); +} + +static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian); + +int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level) +{ + LIBBPF_OPTS(bpf_btf_load_opts, opts); + __u32 buf_sz = 0, raw_size; + char *buf = NULL, *tmp; + void *raw_data; + int err = 0; + + if (btf->fd >= 0) + return libbpf_err(-EEXIST); + if (log_sz && !log_buf) + return libbpf_err(-EINVAL); + + /* cache native raw data representation */ + raw_data = btf_get_raw_data(btf, &raw_size, false); + if (!raw_data) { + err = -ENOMEM; + goto done; + } + btf->raw_size = raw_size; + btf->raw_data = raw_data; + +retry_load: + /* if log_level is 0, we won't provide log_buf/log_size to the kernel, + * initially. Only if BTF loading fails, we bump log_level to 1 and + * retry, using either auto-allocated or custom log_buf. This way + * non-NULL custom log_buf provides a buffer just in case, but hopes + * for successful load and no need for log_buf. + */ + if (log_level) { + /* if caller didn't provide custom log_buf, we'll keep + * allocating our own progressively bigger buffers for BTF + * verification log + */ + if (!log_buf) { + buf_sz = max((__u32)BPF_LOG_BUF_SIZE, buf_sz * 2); + tmp = realloc(buf, buf_sz); + if (!tmp) { + err = -ENOMEM; + goto done; + } + buf = tmp; + buf[0] = '\0'; + } + + opts.log_buf = log_buf ? log_buf : buf; + opts.log_size = log_buf ? log_sz : buf_sz; + opts.log_level = log_level; + } + + btf->fd = bpf_btf_load(raw_data, raw_size, &opts); + if (btf->fd < 0) { + /* time to turn on verbose mode and try again */ + if (log_level == 0) { + log_level = 1; + goto retry_load; + } + /* only retry if caller didn't provide custom log_buf, but + * make sure we can never overflow buf_sz + */ + if (!log_buf && errno == ENOSPC && buf_sz <= UINT_MAX / 2) + goto retry_load; + + err = -errno; + pr_warn("BTF loading error: %d\n", err); + /* don't print out contents of custom log_buf */ + if (!log_buf && buf[0]) + pr_warn("-- BEGIN BTF LOAD LOG ---\n%s\n-- END BTF LOAD LOG --\n", buf); + } + +done: + free(buf); + return libbpf_err(err); +} + +int btf__load_into_kernel(struct btf *btf) +{ + return btf_load_into_kernel(btf, NULL, 0, 0); +} + +int btf__fd(const struct btf *btf) +{ + return btf->fd; +} + +void btf__set_fd(struct btf *btf, int fd) +{ + btf->fd = fd; +} + +static const void *btf_strs_data(const struct btf *btf) +{ + return btf->strs_data ? btf->strs_data : strset__data(btf->strs_set); +} + +static void *btf_get_raw_data(const struct btf *btf, __u32 *size, bool swap_endian) +{ + struct btf_header *hdr = btf->hdr; + struct btf_type *t; + void *data, *p; + __u32 data_sz; + int i; + + data = swap_endian ? btf->raw_data_swapped : btf->raw_data; + if (data) { + *size = btf->raw_size; + return data; + } + + data_sz = hdr->hdr_len + hdr->type_len + hdr->str_len; + data = calloc(1, data_sz); + if (!data) + return NULL; + p = data; + + memcpy(p, hdr, hdr->hdr_len); + if (swap_endian) + btf_bswap_hdr(p); + p += hdr->hdr_len; + + memcpy(p, btf->types_data, hdr->type_len); + if (swap_endian) { + for (i = 0; i < btf->nr_types; i++) { + t = p + btf->type_offs[i]; + /* btf_bswap_type_rest() relies on native t->info, so + * we swap base type info after we swapped all the + * additional information + */ + if (btf_bswap_type_rest(t)) + goto err_out; + btf_bswap_type_base(t); + } + } + p += hdr->type_len; + + memcpy(p, btf_strs_data(btf), hdr->str_len); + p += hdr->str_len; + + *size = data_sz; + return data; +err_out: + free(data); + return NULL; +} + +const void *btf__raw_data(const struct btf *btf_ro, __u32 *size) +{ + struct btf *btf = (struct btf *)btf_ro; + __u32 data_sz; + void *data; + + data = btf_get_raw_data(btf, &data_sz, btf->swapped_endian); + if (!data) + return errno = ENOMEM, NULL; + + btf->raw_size = data_sz; + if (btf->swapped_endian) + btf->raw_data_swapped = data; + else + btf->raw_data = data; + *size = data_sz; + return data; +} + +__attribute__((alias("btf__raw_data"))) +const void *btf__get_raw_data(const struct btf *btf, __u32 *size); + +const char *btf__str_by_offset(const struct btf *btf, __u32 offset) +{ + if (offset < btf->start_str_off) + return btf__str_by_offset(btf->base_btf, offset); + else if (offset - btf->start_str_off < btf->hdr->str_len) + return btf_strs_data(btf) + (offset - btf->start_str_off); + else + return errno = EINVAL, NULL; +} + +const char *btf__name_by_offset(const struct btf *btf, __u32 offset) +{ + return btf__str_by_offset(btf, offset); +} + +struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf) +{ + struct bpf_btf_info btf_info; + __u32 len = sizeof(btf_info); + __u32 last_size; + struct btf *btf; + void *ptr; + int err; + + /* we won't know btf_size until we call bpf_btf_get_info_by_fd(). so + * let's start with a sane default - 4KiB here - and resize it only if + * bpf_btf_get_info_by_fd() needs a bigger buffer. + */ + last_size = 4096; + ptr = malloc(last_size); + if (!ptr) + return ERR_PTR(-ENOMEM); + + memset(&btf_info, 0, sizeof(btf_info)); + btf_info.btf = ptr_to_u64(ptr); + btf_info.btf_size = last_size; + err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len); + + if (!err && btf_info.btf_size > last_size) { + void *temp_ptr; + + last_size = btf_info.btf_size; + temp_ptr = realloc(ptr, last_size); + if (!temp_ptr) { + btf = ERR_PTR(-ENOMEM); + goto exit_free; + } + ptr = temp_ptr; + + len = sizeof(btf_info); + memset(&btf_info, 0, sizeof(btf_info)); + btf_info.btf = ptr_to_u64(ptr); + btf_info.btf_size = last_size; + + err = bpf_btf_get_info_by_fd(btf_fd, &btf_info, &len); + } + + if (err || btf_info.btf_size > last_size) { + btf = err ? ERR_PTR(-errno) : ERR_PTR(-E2BIG); + goto exit_free; + } + + btf = btf_new(ptr, btf_info.btf_size, base_btf); + +exit_free: + free(ptr); + return btf; +} + +struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf) +{ + struct btf *btf; + int btf_fd; + + btf_fd = bpf_btf_get_fd_by_id(id); + if (btf_fd < 0) + return libbpf_err_ptr(-errno); + + btf = btf_get_from_fd(btf_fd, base_btf); + close(btf_fd); + + return libbpf_ptr(btf); +} + +struct btf *btf__load_from_kernel_by_id(__u32 id) +{ + return btf__load_from_kernel_by_id_split(id, NULL); +} + +static void btf_invalidate_raw_data(struct btf *btf) +{ + if (btf->raw_data) { + free(btf->raw_data); + btf->raw_data = NULL; + } + if (btf->raw_data_swapped) { + free(btf->raw_data_swapped); + btf->raw_data_swapped = NULL; + } +} + +/* Ensure BTF is ready to be modified (by splitting into a three memory + * regions for header, types, and strings). Also invalidate cached + * raw_data, if any. + */ +static int btf_ensure_modifiable(struct btf *btf) +{ + void *hdr, *types; + struct strset *set = NULL; + int err = -ENOMEM; + + if (btf_is_modifiable(btf)) { + /* any BTF modification invalidates raw_data */ + btf_invalidate_raw_data(btf); + return 0; + } + + /* split raw data into three memory regions */ + hdr = malloc(btf->hdr->hdr_len); + types = malloc(btf->hdr->type_len); + if (!hdr || !types) + goto err_out; + + memcpy(hdr, btf->hdr, btf->hdr->hdr_len); + memcpy(types, btf->types_data, btf->hdr->type_len); + + /* build lookup index for all strings */ + set = strset__new(BTF_MAX_STR_OFFSET, btf->strs_data, btf->hdr->str_len); + if (IS_ERR(set)) { + err = PTR_ERR(set); + goto err_out; + } + + /* only when everything was successful, update internal state */ + btf->hdr = hdr; + btf->types_data = types; + btf->types_data_cap = btf->hdr->type_len; + btf->strs_data = NULL; + btf->strs_set = set; + /* if BTF was created from scratch, all strings are guaranteed to be + * unique and deduplicated + */ + if (btf->hdr->str_len == 0) + btf->strs_deduped = true; + if (!btf->base_btf && btf->hdr->str_len == 1) + btf->strs_deduped = true; + + /* invalidate raw_data representation */ + btf_invalidate_raw_data(btf); + + return 0; + +err_out: + strset__free(set); + free(hdr); + free(types); + return err; +} + +/* Find an offset in BTF string section that corresponds to a given string *s*. + * Returns: + * - >0 offset into string section, if string is found; + * - -ENOENT, if string is not in the string section; + * - <0, on any other error. + */ +int btf__find_str(struct btf *btf, const char *s) +{ + int off; + + if (btf->base_btf) { + off = btf__find_str(btf->base_btf, s); + if (off != -ENOENT) + return off; + } + + /* BTF needs to be in a modifiable state to build string lookup index */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + off = strset__find_str(btf->strs_set, s); + if (off < 0) + return libbpf_err(off); + + return btf->start_str_off + off; +} + +/* Add a string s to the BTF string section. + * Returns: + * - > 0 offset into string section, on success; + * - < 0, on error. + */ +int btf__add_str(struct btf *btf, const char *s) +{ + int off; + + if (btf->base_btf) { + off = btf__find_str(btf->base_btf, s); + if (off != -ENOENT) + return off; + } + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + off = strset__add_str(btf->strs_set, s); + if (off < 0) + return libbpf_err(off); + + btf->hdr->str_len = strset__data_size(btf->strs_set); + + return btf->start_str_off + off; +} + +static void *btf_add_type_mem(struct btf *btf, size_t add_sz) +{ + return libbpf_add_mem(&btf->types_data, &btf->types_data_cap, 1, + btf->hdr->type_len, UINT_MAX, add_sz); +} + +static void btf_type_inc_vlen(struct btf_type *t) +{ + t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, btf_kflag(t)); +} + +static int btf_commit_type(struct btf *btf, int data_sz) +{ + int err; + + err = btf_add_type_idx_entry(btf, btf->hdr->type_len); + if (err) + return libbpf_err(err); + + btf->hdr->type_len += data_sz; + btf->hdr->str_off += data_sz; + btf->nr_types++; + return btf->start_id + btf->nr_types - 1; +} + +struct btf_pipe { + const struct btf *src; + struct btf *dst; + struct hashmap *str_off_map; /* map string offsets from src to dst */ +}; + +static int btf_rewrite_str(__u32 *str_off, void *ctx) +{ + struct btf_pipe *p = ctx; + long mapped_off; + int off, err; + + if (!*str_off) /* nothing to do for empty strings */ + return 0; + + if (p->str_off_map && + hashmap__find(p->str_off_map, *str_off, &mapped_off)) { + *str_off = mapped_off; + return 0; + } + + off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off)); + if (off < 0) + return off; + + /* Remember string mapping from src to dst. It avoids + * performing expensive string comparisons. + */ + if (p->str_off_map) { + err = hashmap__append(p->str_off_map, *str_off, off); + if (err) + return err; + } + + *str_off = off; + return 0; +} + +int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type) +{ + struct btf_pipe p = { .src = src_btf, .dst = btf }; + struct btf_type *t; + int sz, err; + + sz = btf_type_size(src_type); + if (sz < 0) + return libbpf_err(sz); + + /* deconstruct BTF, if necessary, and invalidate raw_data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + memcpy(t, src_type, sz); + + err = btf_type_visit_str_offs(t, btf_rewrite_str, &p); + if (err) + return libbpf_err(err); + + return btf_commit_type(btf, sz); +} + +static int btf_rewrite_type_ids(__u32 *type_id, void *ctx) +{ + struct btf *btf = ctx; + + if (!*type_id) /* nothing to do for VOID references */ + return 0; + + /* we haven't updated btf's type count yet, so + * btf->start_id + btf->nr_types - 1 is the type ID offset we should + * add to all newly added BTF types + */ + *type_id += btf->start_id + btf->nr_types - 1; + return 0; +} + +static size_t btf_dedup_identity_hash_fn(long key, void *ctx); +static bool btf_dedup_equal_fn(long k1, long k2, void *ctx); + +int btf__add_btf(struct btf *btf, const struct btf *src_btf) +{ + struct btf_pipe p = { .src = src_btf, .dst = btf }; + int data_sz, sz, cnt, i, err, old_strs_len; + __u32 *off; + void *t; + + /* appending split BTF isn't supported yet */ + if (src_btf->base_btf) + return libbpf_err(-ENOTSUP); + + /* deconstruct BTF, if necessary, and invalidate raw_data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + /* remember original strings section size if we have to roll back + * partial strings section changes + */ + old_strs_len = btf->hdr->str_len; + + data_sz = src_btf->hdr->type_len; + cnt = btf__type_cnt(src_btf) - 1; + + /* pre-allocate enough memory for new types */ + t = btf_add_type_mem(btf, data_sz); + if (!t) + return libbpf_err(-ENOMEM); + + /* pre-allocate enough memory for type offset index for new types */ + off = btf_add_type_offs_mem(btf, cnt); + if (!off) + return libbpf_err(-ENOMEM); + + /* Map the string offsets from src_btf to the offsets from btf to improve performance */ + p.str_off_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL); + if (IS_ERR(p.str_off_map)) + return libbpf_err(-ENOMEM); + + /* bulk copy types data for all types from src_btf */ + memcpy(t, src_btf->types_data, data_sz); + + for (i = 0; i < cnt; i++) { + sz = btf_type_size(t); + if (sz < 0) { + /* unlikely, has to be corrupted src_btf */ + err = sz; + goto err_out; + } + + /* fill out type ID to type offset mapping for lookups by type ID */ + *off = t - btf->types_data; + + /* add, dedup, and remap strings referenced by this BTF type */ + err = btf_type_visit_str_offs(t, btf_rewrite_str, &p); + if (err) + goto err_out; + + /* remap all type IDs referenced from this BTF type */ + err = btf_type_visit_type_ids(t, btf_rewrite_type_ids, btf); + if (err) + goto err_out; + + /* go to next type data and type offset index entry */ + t += sz; + off++; + } + + /* Up until now any of the copied type data was effectively invisible, + * so if we exited early before this point due to error, BTF would be + * effectively unmodified. There would be extra internal memory + * pre-allocated, but it would not be available for querying. But now + * that we've copied and rewritten all the data successfully, we can + * update type count and various internal offsets and sizes to + * "commit" the changes and made them visible to the outside world. + */ + btf->hdr->type_len += data_sz; + btf->hdr->str_off += data_sz; + btf->nr_types += cnt; + + hashmap__free(p.str_off_map); + + /* return type ID of the first added BTF type */ + return btf->start_id + btf->nr_types - cnt; +err_out: + /* zero out preallocated memory as if it was just allocated with + * libbpf_add_mem() + */ + memset(btf->types_data + btf->hdr->type_len, 0, data_sz); + memset(btf->strs_data + old_strs_len, 0, btf->hdr->str_len - old_strs_len); + + /* and now restore original strings section size; types data size + * wasn't modified, so doesn't need restoring, see big comment above + */ + btf->hdr->str_len = old_strs_len; + + hashmap__free(p.str_off_map); + + return libbpf_err(err); +} + +/* + * Append new BTF_KIND_INT type with: + * - *name* - non-empty, non-NULL type name; + * - *sz* - power-of-2 (1, 2, 4, ..) size of the type, in bytes; + * - encoding is a combination of BTF_INT_SIGNED, BTF_INT_CHAR, BTF_INT_BOOL. + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding) +{ + struct btf_type *t; + int sz, name_off; + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + /* byte_sz must be power of 2 */ + if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 16) + return libbpf_err(-EINVAL); + if (encoding & ~(BTF_INT_SIGNED | BTF_INT_CHAR | BTF_INT_BOOL)) + return libbpf_err(-EINVAL); + + /* deconstruct BTF, if necessary, and invalidate raw_data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type) + sizeof(int); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + /* if something goes wrong later, we might end up with an extra string, + * but that shouldn't be a problem, because BTF can't be constructed + * completely anyway and will most probably be just discarded + */ + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + t->name_off = name_off; + t->info = btf_type_info(BTF_KIND_INT, 0, 0); + t->size = byte_sz; + /* set INT info, we don't allow setting legacy bit offset/size */ + *(__u32 *)(t + 1) = (encoding << 24) | (byte_sz * 8); + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_FLOAT type with: + * - *name* - non-empty, non-NULL type name; + * - *sz* - size of the type, in bytes; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_float(struct btf *btf, const char *name, size_t byte_sz) +{ + struct btf_type *t; + int sz, name_off; + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + /* byte_sz must be one of the explicitly allowed values */ + if (byte_sz != 2 && byte_sz != 4 && byte_sz != 8 && byte_sz != 12 && + byte_sz != 16) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + t->name_off = name_off; + t->info = btf_type_info(BTF_KIND_FLOAT, 0, 0); + t->size = byte_sz; + + return btf_commit_type(btf, sz); +} + +/* it's completely legal to append BTF types with type IDs pointing forward to + * types that haven't been appended yet, so we only make sure that id looks + * sane, we can't guarantee that ID will always be valid + */ +static int validate_type_id(int id) +{ + if (id < 0 || id > BTF_MAX_NR_TYPES) + return -EINVAL; + return 0; +} + +/* generic append function for PTR, TYPEDEF, CONST/VOLATILE/RESTRICT */ +static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id) +{ + struct btf_type *t; + int sz, name_off = 0; + + if (validate_type_id(ref_type_id)) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + t->name_off = name_off; + t->info = btf_type_info(kind, 0, 0); + t->type = ref_type_id; + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_PTR type with: + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_ptr(struct btf *btf, int ref_type_id) +{ + return btf_add_ref_kind(btf, BTF_KIND_PTR, NULL, ref_type_id); +} + +/* + * Append new BTF_KIND_ARRAY type with: + * - *index_type_id* - type ID of the type describing array index; + * - *elem_type_id* - type ID of the type describing array element; + * - *nr_elems* - the size of the array; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_array(struct btf *btf, int index_type_id, int elem_type_id, __u32 nr_elems) +{ + struct btf_type *t; + struct btf_array *a; + int sz; + + if (validate_type_id(index_type_id) || validate_type_id(elem_type_id)) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type) + sizeof(struct btf_array); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + t->name_off = 0; + t->info = btf_type_info(BTF_KIND_ARRAY, 0, 0); + t->size = 0; + + a = btf_array(t); + a->type = elem_type_id; + a->index_type = index_type_id; + a->nelems = nr_elems; + + return btf_commit_type(btf, sz); +} + +/* generic STRUCT/UNION append function */ +static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz) +{ + struct btf_type *t; + int sz, name_off = 0; + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + /* start out with vlen=0 and no kflag; this will be adjusted when + * adding each member + */ + t->name_off = name_off; + t->info = btf_type_info(kind, 0, 0); + t->size = bytes_sz; + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_STRUCT type with: + * - *name* - name of the struct, can be NULL or empty for anonymous structs; + * - *byte_sz* - size of the struct, in bytes; + * + * Struct initially has no fields in it. Fields can be added by + * btf__add_field() right after btf__add_struct() succeeds. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_struct(struct btf *btf, const char *name, __u32 byte_sz) +{ + return btf_add_composite(btf, BTF_KIND_STRUCT, name, byte_sz); +} + +/* + * Append new BTF_KIND_UNION type with: + * - *name* - name of the union, can be NULL or empty for anonymous union; + * - *byte_sz* - size of the union, in bytes; + * + * Union initially has no fields in it. Fields can be added by + * btf__add_field() right after btf__add_union() succeeds. All fields + * should have *bit_offset* of 0. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_union(struct btf *btf, const char *name, __u32 byte_sz) +{ + return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz); +} + +static struct btf_type *btf_last_type(struct btf *btf) +{ + return btf_type_by_id(btf, btf__type_cnt(btf) - 1); +} + +/* + * Append new field for the current STRUCT/UNION type with: + * - *name* - name of the field, can be NULL or empty for anonymous field; + * - *type_id* - type ID for the type describing field type; + * - *bit_offset* - bit offset of the start of the field within struct/union; + * - *bit_size* - bit size of a bitfield, 0 for non-bitfield fields; + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_field(struct btf *btf, const char *name, int type_id, + __u32 bit_offset, __u32 bit_size) +{ + struct btf_type *t; + struct btf_member *m; + bool is_bitfield; + int sz, name_off = 0; + + /* last type should be union/struct */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_composite(t)) + return libbpf_err(-EINVAL); + + if (validate_type_id(type_id)) + return libbpf_err(-EINVAL); + /* best-effort bit field offset/size enforcement */ + is_bitfield = bit_size || (bit_offset % 8 != 0); + if (is_bitfield && (bit_size == 0 || bit_size > 255 || bit_offset > 0xffffff)) + return libbpf_err(-EINVAL); + + /* only offset 0 is allowed for unions */ + if (btf_is_union(t) && bit_offset) + return libbpf_err(-EINVAL); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_member); + m = btf_add_type_mem(btf, sz); + if (!m) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + m->name_off = name_off; + m->type = type_id; + m->offset = bit_offset | (bit_size << 24); + + /* btf_add_type_mem can invalidate t pointer */ + t = btf_last_type(btf); + /* update parent type's vlen and kflag */ + t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, is_bitfield || btf_kflag(t)); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +static int btf_add_enum_common(struct btf *btf, const char *name, __u32 byte_sz, + bool is_signed, __u8 kind) +{ + struct btf_type *t; + int sz, name_off = 0; + + /* byte_sz must be power of 2 */ + if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 8) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + /* start out with vlen=0; it will be adjusted when adding enum values */ + t->name_off = name_off; + t->info = btf_type_info(kind, 0, is_signed); + t->size = byte_sz; + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_ENUM type with: + * - *name* - name of the enum, can be NULL or empty for anonymous enums; + * - *byte_sz* - size of the enum, in bytes. + * + * Enum initially has no enum values in it (and corresponds to enum forward + * declaration). Enumerator values can be added by btf__add_enum_value() + * immediately after btf__add_enum() succeeds. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz) +{ + /* + * set the signedness to be unsigned, it will change to signed + * if any later enumerator is negative. + */ + return btf_add_enum_common(btf, name, byte_sz, false, BTF_KIND_ENUM); +} + +/* + * Append new enum value for the current ENUM type with: + * - *name* - name of the enumerator value, can't be NULL or empty; + * - *value* - integer value corresponding to enum value *name*; + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_enum_value(struct btf *btf, const char *name, __s64 value) +{ + struct btf_type *t; + struct btf_enum *v; + int sz, name_off; + + /* last type should be BTF_KIND_ENUM */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_enum(t)) + return libbpf_err(-EINVAL); + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + if (value < INT_MIN || value > UINT_MAX) + return libbpf_err(-E2BIG); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_enum); + v = btf_add_type_mem(btf, sz); + if (!v) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + v->name_off = name_off; + v->val = value; + + /* update parent type's vlen */ + t = btf_last_type(btf); + btf_type_inc_vlen(t); + + /* if negative value, set signedness to signed */ + if (value < 0) + t->info = btf_type_info(btf_kind(t), btf_vlen(t), true); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +/* + * Append new BTF_KIND_ENUM64 type with: + * - *name* - name of the enum, can be NULL or empty for anonymous enums; + * - *byte_sz* - size of the enum, in bytes. + * - *is_signed* - whether the enum values are signed or not; + * + * Enum initially has no enum values in it (and corresponds to enum forward + * declaration). Enumerator values can be added by btf__add_enum64_value() + * immediately after btf__add_enum64() succeeds. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_enum64(struct btf *btf, const char *name, __u32 byte_sz, + bool is_signed) +{ + return btf_add_enum_common(btf, name, byte_sz, is_signed, + BTF_KIND_ENUM64); +} + +/* + * Append new enum value for the current ENUM64 type with: + * - *name* - name of the enumerator value, can't be NULL or empty; + * - *value* - integer value corresponding to enum value *name*; + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value) +{ + struct btf_enum64 *v; + struct btf_type *t; + int sz, name_off; + + /* last type should be BTF_KIND_ENUM64 */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_enum64(t)) + return libbpf_err(-EINVAL); + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_enum64); + v = btf_add_type_mem(btf, sz); + if (!v) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + v->name_off = name_off; + v->val_lo32 = (__u32)value; + v->val_hi32 = value >> 32; + + /* update parent type's vlen */ + t = btf_last_type(btf); + btf_type_inc_vlen(t); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +/* + * Append new BTF_KIND_FWD type with: + * - *name*, non-empty/non-NULL name; + * - *fwd_kind*, kind of forward declaration, one of BTF_FWD_STRUCT, + * BTF_FWD_UNION, or BTF_FWD_ENUM; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind) +{ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + switch (fwd_kind) { + case BTF_FWD_STRUCT: + case BTF_FWD_UNION: { + struct btf_type *t; + int id; + + id = btf_add_ref_kind(btf, BTF_KIND_FWD, name, 0); + if (id <= 0) + return id; + t = btf_type_by_id(btf, id); + t->info = btf_type_info(BTF_KIND_FWD, 0, fwd_kind == BTF_FWD_UNION); + return id; + } + case BTF_FWD_ENUM: + /* enum forward in BTF currently is just an enum with no enum + * values; we also assume a standard 4-byte size for it + */ + return btf__add_enum(btf, name, sizeof(int)); + default: + return libbpf_err(-EINVAL); + } +} + +/* + * Append new BTF_KING_TYPEDEF type with: + * - *name*, non-empty/non-NULL name; + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id) +{ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + return btf_add_ref_kind(btf, BTF_KIND_TYPEDEF, name, ref_type_id); +} + +/* + * Append new BTF_KIND_VOLATILE type with: + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_volatile(struct btf *btf, int ref_type_id) +{ + return btf_add_ref_kind(btf, BTF_KIND_VOLATILE, NULL, ref_type_id); +} + +/* + * Append new BTF_KIND_CONST type with: + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_const(struct btf *btf, int ref_type_id) +{ + return btf_add_ref_kind(btf, BTF_KIND_CONST, NULL, ref_type_id); +} + +/* + * Append new BTF_KIND_RESTRICT type with: + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_restrict(struct btf *btf, int ref_type_id) +{ + return btf_add_ref_kind(btf, BTF_KIND_RESTRICT, NULL, ref_type_id); +} + +/* + * Append new BTF_KIND_TYPE_TAG type with: + * - *value*, non-empty/non-NULL tag value; + * - *ref_type_id* - referenced type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id) +{ + if (!value || !value[0]) + return libbpf_err(-EINVAL); + + return btf_add_ref_kind(btf, BTF_KIND_TYPE_TAG, value, ref_type_id); +} + +/* + * Append new BTF_KIND_FUNC type with: + * - *name*, non-empty/non-NULL name; + * - *proto_type_id* - FUNC_PROTO's type ID, it might not exist yet; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_func(struct btf *btf, const char *name, + enum btf_func_linkage linkage, int proto_type_id) +{ + int id; + + if (!name || !name[0]) + return libbpf_err(-EINVAL); + if (linkage != BTF_FUNC_STATIC && linkage != BTF_FUNC_GLOBAL && + linkage != BTF_FUNC_EXTERN) + return libbpf_err(-EINVAL); + + id = btf_add_ref_kind(btf, BTF_KIND_FUNC, name, proto_type_id); + if (id > 0) { + struct btf_type *t = btf_type_by_id(btf, id); + + t->info = btf_type_info(BTF_KIND_FUNC, linkage, 0); + } + return libbpf_err(id); +} + +/* + * Append new BTF_KIND_FUNC_PROTO with: + * - *ret_type_id* - type ID for return result of a function. + * + * Function prototype initially has no arguments, but they can be added by + * btf__add_func_param() one by one, immediately after + * btf__add_func_proto() succeeded. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_func_proto(struct btf *btf, int ret_type_id) +{ + struct btf_type *t; + int sz; + + if (validate_type_id(ret_type_id)) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + /* start out with vlen=0; this will be adjusted when adding enum + * values, if necessary + */ + t->name_off = 0; + t->info = btf_type_info(BTF_KIND_FUNC_PROTO, 0, 0); + t->type = ret_type_id; + + return btf_commit_type(btf, sz); +} + +/* + * Append new function parameter for current FUNC_PROTO type with: + * - *name* - parameter name, can be NULL or empty; + * - *type_id* - type ID describing the type of the parameter. + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_func_param(struct btf *btf, const char *name, int type_id) +{ + struct btf_type *t; + struct btf_param *p; + int sz, name_off = 0; + + if (validate_type_id(type_id)) + return libbpf_err(-EINVAL); + + /* last type should be BTF_KIND_FUNC_PROTO */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_func_proto(t)) + return libbpf_err(-EINVAL); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_param); + p = btf_add_type_mem(btf, sz); + if (!p) + return libbpf_err(-ENOMEM); + + if (name && name[0]) { + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + } + + p->name_off = name_off; + p->type = type_id; + + /* update parent type's vlen */ + t = btf_last_type(btf); + btf_type_inc_vlen(t); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +/* + * Append new BTF_KIND_VAR type with: + * - *name* - non-empty/non-NULL name; + * - *linkage* - variable linkage, one of BTF_VAR_STATIC, + * BTF_VAR_GLOBAL_ALLOCATED, or BTF_VAR_GLOBAL_EXTERN; + * - *type_id* - type ID of the type describing the type of the variable. + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id) +{ + struct btf_type *t; + struct btf_var *v; + int sz, name_off; + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + if (linkage != BTF_VAR_STATIC && linkage != BTF_VAR_GLOBAL_ALLOCATED && + linkage != BTF_VAR_GLOBAL_EXTERN) + return libbpf_err(-EINVAL); + if (validate_type_id(type_id)) + return libbpf_err(-EINVAL); + + /* deconstruct BTF, if necessary, and invalidate raw_data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type) + sizeof(struct btf_var); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + t->name_off = name_off; + t->info = btf_type_info(BTF_KIND_VAR, 0, 0); + t->type = type_id; + + v = btf_var(t); + v->linkage = linkage; + + return btf_commit_type(btf, sz); +} + +/* + * Append new BTF_KIND_DATASEC type with: + * - *name* - non-empty/non-NULL name; + * - *byte_sz* - data section size, in bytes. + * + * Data section is initially empty. Variables info can be added with + * btf__add_datasec_var_info() calls, after btf__add_datasec() succeeds. + * + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz) +{ + struct btf_type *t; + int sz, name_off; + + /* non-empty name */ + if (!name || !name[0]) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + name_off = btf__add_str(btf, name); + if (name_off < 0) + return name_off; + + /* start with vlen=0, which will be update as var_secinfos are added */ + t->name_off = name_off; + t->info = btf_type_info(BTF_KIND_DATASEC, 0, 0); + t->size = byte_sz; + + return btf_commit_type(btf, sz); +} + +/* + * Append new data section variable information entry for current DATASEC type: + * - *var_type_id* - type ID, describing type of the variable; + * - *offset* - variable offset within data section, in bytes; + * - *byte_sz* - variable size, in bytes. + * + * Returns: + * - 0, on success; + * - <0, on error. + */ +int btf__add_datasec_var_info(struct btf *btf, int var_type_id, __u32 offset, __u32 byte_sz) +{ + struct btf_type *t; + struct btf_var_secinfo *v; + int sz; + + /* last type should be BTF_KIND_DATASEC */ + if (btf->nr_types == 0) + return libbpf_err(-EINVAL); + t = btf_last_type(btf); + if (!btf_is_datasec(t)) + return libbpf_err(-EINVAL); + + if (validate_type_id(var_type_id)) + return libbpf_err(-EINVAL); + + /* decompose and invalidate raw data */ + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_var_secinfo); + v = btf_add_type_mem(btf, sz); + if (!v) + return libbpf_err(-ENOMEM); + + v->type = var_type_id; + v->offset = offset; + v->size = byte_sz; + + /* update parent type's vlen */ + t = btf_last_type(btf); + btf_type_inc_vlen(t); + + btf->hdr->type_len += sz; + btf->hdr->str_off += sz; + return 0; +} + +/* + * Append new BTF_KIND_DECL_TAG type with: + * - *value* - non-empty/non-NULL string; + * - *ref_type_id* - referenced type ID, it might not exist yet; + * - *component_idx* - -1 for tagging reference type, otherwise struct/union + * member or function argument index; + * Returns: + * - >0, type ID of newly added BTF type; + * - <0, on error. + */ +int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, + int component_idx) +{ + struct btf_type *t; + int sz, value_off; + + if (!value || !value[0] || component_idx < -1) + return libbpf_err(-EINVAL); + + if (validate_type_id(ref_type_id)) + return libbpf_err(-EINVAL); + + if (btf_ensure_modifiable(btf)) + return libbpf_err(-ENOMEM); + + sz = sizeof(struct btf_type) + sizeof(struct btf_decl_tag); + t = btf_add_type_mem(btf, sz); + if (!t) + return libbpf_err(-ENOMEM); + + value_off = btf__add_str(btf, value); + if (value_off < 0) + return value_off; + + t->name_off = value_off; + t->info = btf_type_info(BTF_KIND_DECL_TAG, 0, false); + t->type = ref_type_id; + btf_decl_tag(t)->component_idx = component_idx; + + return btf_commit_type(btf, sz); +} + +struct btf_ext_sec_setup_param { + __u32 off; + __u32 len; + __u32 min_rec_size; + struct btf_ext_info *ext_info; + const char *desc; +}; + +static int btf_ext_setup_info(struct btf_ext *btf_ext, + struct btf_ext_sec_setup_param *ext_sec) +{ + const struct btf_ext_info_sec *sinfo; + struct btf_ext_info *ext_info; + __u32 info_left, record_size; + size_t sec_cnt = 0; + /* The start of the info sec (including the __u32 record_size). */ + void *info; + + if (ext_sec->len == 0) + return 0; + + if (ext_sec->off & 0x03) { + pr_debug(".BTF.ext %s section is not aligned to 4 bytes\n", + ext_sec->desc); + return -EINVAL; + } + + info = btf_ext->data + btf_ext->hdr->hdr_len + ext_sec->off; + info_left = ext_sec->len; + + if (btf_ext->data + btf_ext->data_size < info + ext_sec->len) { + pr_debug("%s section (off:%u len:%u) is beyond the end of the ELF section .BTF.ext\n", + ext_sec->desc, ext_sec->off, ext_sec->len); + return -EINVAL; + } + + /* At least a record size */ + if (info_left < sizeof(__u32)) { + pr_debug(".BTF.ext %s record size not found\n", ext_sec->desc); + return -EINVAL; + } + + /* The record size needs to meet the minimum standard */ + record_size = *(__u32 *)info; + if (record_size < ext_sec->min_rec_size || + record_size & 0x03) { + pr_debug("%s section in .BTF.ext has invalid record size %u\n", + ext_sec->desc, record_size); + return -EINVAL; + } + + sinfo = info + sizeof(__u32); + info_left -= sizeof(__u32); + + /* If no records, return failure now so .BTF.ext won't be used. */ + if (!info_left) { + pr_debug("%s section in .BTF.ext has no records", ext_sec->desc); + return -EINVAL; + } + + while (info_left) { + unsigned int sec_hdrlen = sizeof(struct btf_ext_info_sec); + __u64 total_record_size; + __u32 num_records; + + if (info_left < sec_hdrlen) { + pr_debug("%s section header is not found in .BTF.ext\n", + ext_sec->desc); + return -EINVAL; + } + + num_records = sinfo->num_info; + if (num_records == 0) { + pr_debug("%s section has incorrect num_records in .BTF.ext\n", + ext_sec->desc); + return -EINVAL; + } + + total_record_size = sec_hdrlen + (__u64)num_records * record_size; + if (info_left < total_record_size) { + pr_debug("%s section has incorrect num_records in .BTF.ext\n", + ext_sec->desc); + return -EINVAL; + } + + info_left -= total_record_size; + sinfo = (void *)sinfo + total_record_size; + sec_cnt++; + } + + ext_info = ext_sec->ext_info; + ext_info->len = ext_sec->len - sizeof(__u32); + ext_info->rec_size = record_size; + ext_info->info = info + sizeof(__u32); + ext_info->sec_cnt = sec_cnt; + + return 0; +} + +static int btf_ext_setup_func_info(struct btf_ext *btf_ext) +{ + struct btf_ext_sec_setup_param param = { + .off = btf_ext->hdr->func_info_off, + .len = btf_ext->hdr->func_info_len, + .min_rec_size = sizeof(struct bpf_func_info_min), + .ext_info = &btf_ext->func_info, + .desc = "func_info" + }; + + return btf_ext_setup_info(btf_ext, ¶m); +} + +static int btf_ext_setup_line_info(struct btf_ext *btf_ext) +{ + struct btf_ext_sec_setup_param param = { + .off = btf_ext->hdr->line_info_off, + .len = btf_ext->hdr->line_info_len, + .min_rec_size = sizeof(struct bpf_line_info_min), + .ext_info = &btf_ext->line_info, + .desc = "line_info", + }; + + return btf_ext_setup_info(btf_ext, ¶m); +} + +static int btf_ext_setup_core_relos(struct btf_ext *btf_ext) +{ + struct btf_ext_sec_setup_param param = { + .off = btf_ext->hdr->core_relo_off, + .len = btf_ext->hdr->core_relo_len, + .min_rec_size = sizeof(struct bpf_core_relo), + .ext_info = &btf_ext->core_relo_info, + .desc = "core_relo", + }; + + return btf_ext_setup_info(btf_ext, ¶m); +} + +static int btf_ext_parse_hdr(__u8 *data, __u32 data_size) +{ + const struct btf_ext_header *hdr = (struct btf_ext_header *)data; + + if (data_size < offsetofend(struct btf_ext_header, hdr_len) || + data_size < hdr->hdr_len) { + pr_debug("BTF.ext header not found"); + return -EINVAL; + } + + if (hdr->magic == bswap_16(BTF_MAGIC)) { + pr_warn("BTF.ext in non-native endianness is not supported\n"); + return -ENOTSUP; + } else if (hdr->magic != BTF_MAGIC) { + pr_debug("Invalid BTF.ext magic:%x\n", hdr->magic); + return -EINVAL; + } + + if (hdr->version != BTF_VERSION) { + pr_debug("Unsupported BTF.ext version:%u\n", hdr->version); + return -ENOTSUP; + } + + if (hdr->flags) { + pr_debug("Unsupported BTF.ext flags:%x\n", hdr->flags); + return -ENOTSUP; + } + + if (data_size == hdr->hdr_len) { + pr_debug("BTF.ext has no data\n"); + return -EINVAL; + } + + return 0; +} + +void btf_ext__free(struct btf_ext *btf_ext) +{ + if (IS_ERR_OR_NULL(btf_ext)) + return; + free(btf_ext->func_info.sec_idxs); + free(btf_ext->line_info.sec_idxs); + free(btf_ext->core_relo_info.sec_idxs); + free(btf_ext->data); + free(btf_ext); +} + +struct btf_ext *btf_ext__new(const __u8 *data, __u32 size) +{ + struct btf_ext *btf_ext; + int err; + + btf_ext = calloc(1, sizeof(struct btf_ext)); + if (!btf_ext) + return libbpf_err_ptr(-ENOMEM); + + btf_ext->data_size = size; + btf_ext->data = malloc(size); + if (!btf_ext->data) { + err = -ENOMEM; + goto done; + } + memcpy(btf_ext->data, data, size); + + err = btf_ext_parse_hdr(btf_ext->data, size); + if (err) + goto done; + + if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, line_info_len)) { + err = -EINVAL; + goto done; + } + + err = btf_ext_setup_func_info(btf_ext); + if (err) + goto done; + + err = btf_ext_setup_line_info(btf_ext); + if (err) + goto done; + + if (btf_ext->hdr->hdr_len < offsetofend(struct btf_ext_header, core_relo_len)) + goto done; /* skip core relos parsing */ + + err = btf_ext_setup_core_relos(btf_ext); + if (err) + goto done; + +done: + if (err) { + btf_ext__free(btf_ext); + return libbpf_err_ptr(err); + } + + return btf_ext; +} + +const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size) +{ + *size = btf_ext->data_size; + return btf_ext->data; +} + +struct btf_dedup; + +static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts); +static void btf_dedup_free(struct btf_dedup *d); +static int btf_dedup_prep(struct btf_dedup *d); +static int btf_dedup_strings(struct btf_dedup *d); +static int btf_dedup_prim_types(struct btf_dedup *d); +static int btf_dedup_struct_types(struct btf_dedup *d); +static int btf_dedup_ref_types(struct btf_dedup *d); +static int btf_dedup_resolve_fwds(struct btf_dedup *d); +static int btf_dedup_compact_types(struct btf_dedup *d); +static int btf_dedup_remap_types(struct btf_dedup *d); + +/* + * Deduplicate BTF types and strings. + * + * BTF dedup algorithm takes as an input `struct btf` representing `.BTF` ELF + * section with all BTF type descriptors and string data. It overwrites that + * memory in-place with deduplicated types and strings without any loss of + * information. If optional `struct btf_ext` representing '.BTF.ext' ELF section + * is provided, all the strings referenced from .BTF.ext section are honored + * and updated to point to the right offsets after deduplication. + * + * If function returns with error, type/string data might be garbled and should + * be discarded. + * + * More verbose and detailed description of both problem btf_dedup is solving, + * as well as solution could be found at: + * https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html + * + * Problem description and justification + * ===================================== + * + * BTF type information is typically emitted either as a result of conversion + * from DWARF to BTF or directly by compiler. In both cases, each compilation + * unit contains information about a subset of all the types that are used + * in an application. These subsets are frequently overlapping and contain a lot + * of duplicated information when later concatenated together into a single + * binary. This algorithm ensures that each unique type is represented by single + * BTF type descriptor, greatly reducing resulting size of BTF data. + * + * Compilation unit isolation and subsequent duplication of data is not the only + * problem. The same type hierarchy (e.g., struct and all the type that struct + * references) in different compilation units can be represented in BTF to + * various degrees of completeness (or, rather, incompleteness) due to + * struct/union forward declarations. + * + * Let's take a look at an example, that we'll use to better understand the + * problem (and solution). Suppose we have two compilation units, each using + * same `struct S`, but each of them having incomplete type information about + * struct's fields: + * + * // CU #1: + * struct S; + * struct A { + * int a; + * struct A* self; + * struct S* parent; + * }; + * struct B; + * struct S { + * struct A* a_ptr; + * struct B* b_ptr; + * }; + * + * // CU #2: + * struct S; + * struct A; + * struct B { + * int b; + * struct B* self; + * struct S* parent; + * }; + * struct S { + * struct A* a_ptr; + * struct B* b_ptr; + * }; + * + * In case of CU #1, BTF data will know only that `struct B` exist (but no + * more), but will know the complete type information about `struct A`. While + * for CU #2, it will know full type information about `struct B`, but will + * only know about forward declaration of `struct A` (in BTF terms, it will + * have `BTF_KIND_FWD` type descriptor with name `B`). + * + * This compilation unit isolation means that it's possible that there is no + * single CU with complete type information describing structs `S`, `A`, and + * `B`. Also, we might get tons of duplicated and redundant type information. + * + * Additional complication we need to keep in mind comes from the fact that + * types, in general, can form graphs containing cycles, not just DAGs. + * + * While algorithm does deduplication, it also merges and resolves type + * information (unless disabled throught `struct btf_opts`), whenever possible. + * E.g., in the example above with two compilation units having partial type + * information for structs `A` and `B`, the output of algorithm will emit + * a single copy of each BTF type that describes structs `A`, `B`, and `S` + * (as well as type information for `int` and pointers), as if they were defined + * in a single compilation unit as: + * + * struct A { + * int a; + * struct A* self; + * struct S* parent; + * }; + * struct B { + * int b; + * struct B* self; + * struct S* parent; + * }; + * struct S { + * struct A* a_ptr; + * struct B* b_ptr; + * }; + * + * Algorithm summary + * ================= + * + * Algorithm completes its work in 7 separate passes: + * + * 1. Strings deduplication. + * 2. Primitive types deduplication (int, enum, fwd). + * 3. Struct/union types deduplication. + * 4. Resolve unambiguous forward declarations. + * 5. Reference types deduplication (pointers, typedefs, arrays, funcs, func + * protos, and const/volatile/restrict modifiers). + * 6. Types compaction. + * 7. Types remapping. + * + * Algorithm determines canonical type descriptor, which is a single + * representative type for each truly unique type. This canonical type is the + * one that will go into final deduplicated BTF type information. For + * struct/unions, it is also the type that algorithm will merge additional type + * information into (while resolving FWDs), as it discovers it from data in + * other CUs. Each input BTF type eventually gets either mapped to itself, if + * that type is canonical, or to some other type, if that type is equivalent + * and was chosen as canonical representative. This mapping is stored in + * `btf_dedup->map` array. This map is also used to record STRUCT/UNION that + * FWD type got resolved to. + * + * To facilitate fast discovery of canonical types, we also maintain canonical + * index (`btf_dedup->dedup_table`), which maps type descriptor's signature hash + * (i.e., hashed kind, name, size, fields, etc) into a list of canonical types + * that match that signature. With sufficiently good choice of type signature + * hashing function, we can limit number of canonical types for each unique type + * signature to a very small number, allowing to find canonical type for any + * duplicated type very quickly. + * + * Struct/union deduplication is the most critical part and algorithm for + * deduplicating structs/unions is described in greater details in comments for + * `btf_dedup_is_equiv` function. + */ +int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts) +{ + struct btf_dedup *d; + int err; + + if (!OPTS_VALID(opts, btf_dedup_opts)) + return libbpf_err(-EINVAL); + + d = btf_dedup_new(btf, opts); + if (IS_ERR(d)) { + pr_debug("btf_dedup_new failed: %ld", PTR_ERR(d)); + return libbpf_err(-EINVAL); + } + + if (btf_ensure_modifiable(btf)) { + err = -ENOMEM; + goto done; + } + + err = btf_dedup_prep(d); + if (err) { + pr_debug("btf_dedup_prep failed:%d\n", err); + goto done; + } + err = btf_dedup_strings(d); + if (err < 0) { + pr_debug("btf_dedup_strings failed:%d\n", err); + goto done; + } + err = btf_dedup_prim_types(d); + if (err < 0) { + pr_debug("btf_dedup_prim_types failed:%d\n", err); + goto done; + } + err = btf_dedup_struct_types(d); + if (err < 0) { + pr_debug("btf_dedup_struct_types failed:%d\n", err); + goto done; + } + err = btf_dedup_resolve_fwds(d); + if (err < 0) { + pr_debug("btf_dedup_resolve_fwds failed:%d\n", err); + goto done; + } + err = btf_dedup_ref_types(d); + if (err < 0) { + pr_debug("btf_dedup_ref_types failed:%d\n", err); + goto done; + } + err = btf_dedup_compact_types(d); + if (err < 0) { + pr_debug("btf_dedup_compact_types failed:%d\n", err); + goto done; + } + err = btf_dedup_remap_types(d); + if (err < 0) { + pr_debug("btf_dedup_remap_types failed:%d\n", err); + goto done; + } + +done: + btf_dedup_free(d); + return libbpf_err(err); +} + +#define BTF_UNPROCESSED_ID ((__u32)-1) +#define BTF_IN_PROGRESS_ID ((__u32)-2) + +struct btf_dedup { + /* .BTF section to be deduped in-place */ + struct btf *btf; + /* + * Optional .BTF.ext section. When provided, any strings referenced + * from it will be taken into account when deduping strings + */ + struct btf_ext *btf_ext; + /* + * This is a map from any type's signature hash to a list of possible + * canonical representative type candidates. Hash collisions are + * ignored, so even types of various kinds can share same list of + * candidates, which is fine because we rely on subsequent + * btf_xxx_equal() checks to authoritatively verify type equality. + */ + struct hashmap *dedup_table; + /* Canonical types map */ + __u32 *map; + /* Hypothetical mapping, used during type graph equivalence checks */ + __u32 *hypot_map; + __u32 *hypot_list; + size_t hypot_cnt; + size_t hypot_cap; + /* Whether hypothetical mapping, if successful, would need to adjust + * already canonicalized types (due to a new forward declaration to + * concrete type resolution). In such case, during split BTF dedup + * candidate type would still be considered as different, because base + * BTF is considered to be immutable. + */ + bool hypot_adjust_canon; + /* Various option modifying behavior of algorithm */ + struct btf_dedup_opts opts; + /* temporary strings deduplication state */ + struct strset *strs_set; +}; + +static long hash_combine(long h, long value) +{ + return h * 31 + value; +} + +#define for_each_dedup_cand(d, node, hash) \ + hashmap__for_each_key_entry(d->dedup_table, node, hash) + +static int btf_dedup_table_add(struct btf_dedup *d, long hash, __u32 type_id) +{ + return hashmap__append(d->dedup_table, hash, type_id); +} + +static int btf_dedup_hypot_map_add(struct btf_dedup *d, + __u32 from_id, __u32 to_id) +{ + if (d->hypot_cnt == d->hypot_cap) { + __u32 *new_list; + + d->hypot_cap += max((size_t)16, d->hypot_cap / 2); + new_list = libbpf_reallocarray(d->hypot_list, d->hypot_cap, sizeof(__u32)); + if (!new_list) + return -ENOMEM; + d->hypot_list = new_list; + } + d->hypot_list[d->hypot_cnt++] = from_id; + d->hypot_map[from_id] = to_id; + return 0; +} + +static void btf_dedup_clear_hypot_map(struct btf_dedup *d) +{ + int i; + + for (i = 0; i < d->hypot_cnt; i++) + d->hypot_map[d->hypot_list[i]] = BTF_UNPROCESSED_ID; + d->hypot_cnt = 0; + d->hypot_adjust_canon = false; +} + +static void btf_dedup_free(struct btf_dedup *d) +{ + hashmap__free(d->dedup_table); + d->dedup_table = NULL; + + free(d->map); + d->map = NULL; + + free(d->hypot_map); + d->hypot_map = NULL; + + free(d->hypot_list); + d->hypot_list = NULL; + + free(d); +} + +static size_t btf_dedup_identity_hash_fn(long key, void *ctx) +{ + return key; +} + +static size_t btf_dedup_collision_hash_fn(long key, void *ctx) +{ + return 0; +} + +static bool btf_dedup_equal_fn(long k1, long k2, void *ctx) +{ + return k1 == k2; +} + +static struct btf_dedup *btf_dedup_new(struct btf *btf, const struct btf_dedup_opts *opts) +{ + struct btf_dedup *d = calloc(1, sizeof(struct btf_dedup)); + hashmap_hash_fn hash_fn = btf_dedup_identity_hash_fn; + int i, err = 0, type_cnt; + + if (!d) + return ERR_PTR(-ENOMEM); + + if (OPTS_GET(opts, force_collisions, false)) + hash_fn = btf_dedup_collision_hash_fn; + + d->btf = btf; + d->btf_ext = OPTS_GET(opts, btf_ext, NULL); + + d->dedup_table = hashmap__new(hash_fn, btf_dedup_equal_fn, NULL); + if (IS_ERR(d->dedup_table)) { + err = PTR_ERR(d->dedup_table); + d->dedup_table = NULL; + goto done; + } + + type_cnt = btf__type_cnt(btf); + d->map = malloc(sizeof(__u32) * type_cnt); + if (!d->map) { + err = -ENOMEM; + goto done; + } + /* special BTF "void" type is made canonical immediately */ + d->map[0] = 0; + for (i = 1; i < type_cnt; i++) { + struct btf_type *t = btf_type_by_id(d->btf, i); + + /* VAR and DATASEC are never deduped and are self-canonical */ + if (btf_is_var(t) || btf_is_datasec(t)) + d->map[i] = i; + else + d->map[i] = BTF_UNPROCESSED_ID; + } + + d->hypot_map = malloc(sizeof(__u32) * type_cnt); + if (!d->hypot_map) { + err = -ENOMEM; + goto done; + } + for (i = 0; i < type_cnt; i++) + d->hypot_map[i] = BTF_UNPROCESSED_ID; + +done: + if (err) { + btf_dedup_free(d); + return ERR_PTR(err); + } + + return d; +} + +/* + * Iterate over all possible places in .BTF and .BTF.ext that can reference + * string and pass pointer to it to a provided callback `fn`. + */ +static int btf_for_each_str_off(struct btf_dedup *d, str_off_visit_fn fn, void *ctx) +{ + int i, r; + + for (i = 0; i < d->btf->nr_types; i++) { + struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); + + r = btf_type_visit_str_offs(t, fn, ctx); + if (r) + return r; + } + + if (!d->btf_ext) + return 0; + + r = btf_ext_visit_str_offs(d->btf_ext, fn, ctx); + if (r) + return r; + + return 0; +} + +static int strs_dedup_remap_str_off(__u32 *str_off_ptr, void *ctx) +{ + struct btf_dedup *d = ctx; + __u32 str_off = *str_off_ptr; + const char *s; + int off, err; + + /* don't touch empty string or string in main BTF */ + if (str_off == 0 || str_off < d->btf->start_str_off) + return 0; + + s = btf__str_by_offset(d->btf, str_off); + if (d->btf->base_btf) { + err = btf__find_str(d->btf->base_btf, s); + if (err >= 0) { + *str_off_ptr = err; + return 0; + } + if (err != -ENOENT) + return err; + } + + off = strset__add_str(d->strs_set, s); + if (off < 0) + return off; + + *str_off_ptr = d->btf->start_str_off + off; + return 0; +} + +/* + * Dedup string and filter out those that are not referenced from either .BTF + * or .BTF.ext (if provided) sections. + * + * This is done by building index of all strings in BTF's string section, + * then iterating over all entities that can reference strings (e.g., type + * names, struct field names, .BTF.ext line info, etc) and marking corresponding + * strings as used. After that all used strings are deduped and compacted into + * sequential blob of memory and new offsets are calculated. Then all the string + * references are iterated again and rewritten using new offsets. + */ +static int btf_dedup_strings(struct btf_dedup *d) +{ + int err; + + if (d->btf->strs_deduped) + return 0; + + d->strs_set = strset__new(BTF_MAX_STR_OFFSET, NULL, 0); + if (IS_ERR(d->strs_set)) { + err = PTR_ERR(d->strs_set); + goto err_out; + } + + if (!d->btf->base_btf) { + /* insert empty string; we won't be looking it up during strings + * dedup, but it's good to have it for generic BTF string lookups + */ + err = strset__add_str(d->strs_set, ""); + if (err < 0) + goto err_out; + } + + /* remap string offsets */ + err = btf_for_each_str_off(d, strs_dedup_remap_str_off, d); + if (err) + goto err_out; + + /* replace BTF string data and hash with deduped ones */ + strset__free(d->btf->strs_set); + d->btf->hdr->str_len = strset__data_size(d->strs_set); + d->btf->strs_set = d->strs_set; + d->strs_set = NULL; + d->btf->strs_deduped = true; + return 0; + +err_out: + strset__free(d->strs_set); + d->strs_set = NULL; + + return err; +} + +static long btf_hash_common(struct btf_type *t) +{ + long h; + + h = hash_combine(0, t->name_off); + h = hash_combine(h, t->info); + h = hash_combine(h, t->size); + return h; +} + +static bool btf_equal_common(struct btf_type *t1, struct btf_type *t2) +{ + return t1->name_off == t2->name_off && + t1->info == t2->info && + t1->size == t2->size; +} + +/* Calculate type signature hash of INT or TAG. */ +static long btf_hash_int_decl_tag(struct btf_type *t) +{ + __u32 info = *(__u32 *)(t + 1); + long h; + + h = btf_hash_common(t); + h = hash_combine(h, info); + return h; +} + +/* Check structural equality of two INTs or TAGs. */ +static bool btf_equal_int_tag(struct btf_type *t1, struct btf_type *t2) +{ + __u32 info1, info2; + + if (!btf_equal_common(t1, t2)) + return false; + info1 = *(__u32 *)(t1 + 1); + info2 = *(__u32 *)(t2 + 1); + return info1 == info2; +} + +/* Calculate type signature hash of ENUM/ENUM64. */ +static long btf_hash_enum(struct btf_type *t) +{ + long h; + + /* don't hash vlen, enum members and size to support enum fwd resolving */ + h = hash_combine(0, t->name_off); + return h; +} + +static bool btf_equal_enum_members(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_enum *m1, *m2; + __u16 vlen; + int i; + + vlen = btf_vlen(t1); + m1 = btf_enum(t1); + m2 = btf_enum(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off || m1->val != m2->val) + return false; + m1++; + m2++; + } + return true; +} + +static bool btf_equal_enum64_members(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_enum64 *m1, *m2; + __u16 vlen; + int i; + + vlen = btf_vlen(t1); + m1 = btf_enum64(t1); + m2 = btf_enum64(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off || m1->val_lo32 != m2->val_lo32 || + m1->val_hi32 != m2->val_hi32) + return false; + m1++; + m2++; + } + return true; +} + +/* Check structural equality of two ENUMs or ENUM64s. */ +static bool btf_equal_enum(struct btf_type *t1, struct btf_type *t2) +{ + if (!btf_equal_common(t1, t2)) + return false; + + /* t1 & t2 kinds are identical because of btf_equal_common */ + if (btf_kind(t1) == BTF_KIND_ENUM) + return btf_equal_enum_members(t1, t2); + else + return btf_equal_enum64_members(t1, t2); +} + +static inline bool btf_is_enum_fwd(struct btf_type *t) +{ + return btf_is_any_enum(t) && btf_vlen(t) == 0; +} + +static bool btf_compat_enum(struct btf_type *t1, struct btf_type *t2) +{ + if (!btf_is_enum_fwd(t1) && !btf_is_enum_fwd(t2)) + return btf_equal_enum(t1, t2); + /* At this point either t1 or t2 or both are forward declarations, thus: + * - skip comparing vlen because it is zero for forward declarations; + * - skip comparing size to allow enum forward declarations + * to be compatible with enum64 full declarations; + * - skip comparing kind for the same reason. + */ + return t1->name_off == t2->name_off && + btf_is_any_enum(t1) && btf_is_any_enum(t2); +} + +/* + * Calculate type signature hash of STRUCT/UNION, ignoring referenced type IDs, + * as referenced type IDs equivalence is established separately during type + * graph equivalence check algorithm. + */ +static long btf_hash_struct(struct btf_type *t) +{ + const struct btf_member *member = btf_members(t); + __u32 vlen = btf_vlen(t); + long h = btf_hash_common(t); + int i; + + for (i = 0; i < vlen; i++) { + h = hash_combine(h, member->name_off); + h = hash_combine(h, member->offset); + /* no hashing of referenced type ID, it can be unresolved yet */ + member++; + } + return h; +} + +/* + * Check structural compatibility of two STRUCTs/UNIONs, ignoring referenced + * type IDs. This check is performed during type graph equivalence check and + * referenced types equivalence is checked separately. + */ +static bool btf_shallow_equal_struct(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_member *m1, *m2; + __u16 vlen; + int i; + + if (!btf_equal_common(t1, t2)) + return false; + + vlen = btf_vlen(t1); + m1 = btf_members(t1); + m2 = btf_members(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off || m1->offset != m2->offset) + return false; + m1++; + m2++; + } + return true; +} + +/* + * Calculate type signature hash of ARRAY, including referenced type IDs, + * under assumption that they were already resolved to canonical type IDs and + * are not going to change. + */ +static long btf_hash_array(struct btf_type *t) +{ + const struct btf_array *info = btf_array(t); + long h = btf_hash_common(t); + + h = hash_combine(h, info->type); + h = hash_combine(h, info->index_type); + h = hash_combine(h, info->nelems); + return h; +} + +/* + * Check exact equality of two ARRAYs, taking into account referenced + * type IDs, under assumption that they were already resolved to canonical + * type IDs and are not going to change. + * This function is called during reference types deduplication to compare + * ARRAY to potential canonical representative. + */ +static bool btf_equal_array(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_array *info1, *info2; + + if (!btf_equal_common(t1, t2)) + return false; + + info1 = btf_array(t1); + info2 = btf_array(t2); + return info1->type == info2->type && + info1->index_type == info2->index_type && + info1->nelems == info2->nelems; +} + +/* + * Check structural compatibility of two ARRAYs, ignoring referenced type + * IDs. This check is performed during type graph equivalence check and + * referenced types equivalence is checked separately. + */ +static bool btf_compat_array(struct btf_type *t1, struct btf_type *t2) +{ + if (!btf_equal_common(t1, t2)) + return false; + + return btf_array(t1)->nelems == btf_array(t2)->nelems; +} + +/* + * Calculate type signature hash of FUNC_PROTO, including referenced type IDs, + * under assumption that they were already resolved to canonical type IDs and + * are not going to change. + */ +static long btf_hash_fnproto(struct btf_type *t) +{ + const struct btf_param *member = btf_params(t); + __u16 vlen = btf_vlen(t); + long h = btf_hash_common(t); + int i; + + for (i = 0; i < vlen; i++) { + h = hash_combine(h, member->name_off); + h = hash_combine(h, member->type); + member++; + } + return h; +} + +/* + * Check exact equality of two FUNC_PROTOs, taking into account referenced + * type IDs, under assumption that they were already resolved to canonical + * type IDs and are not going to change. + * This function is called during reference types deduplication to compare + * FUNC_PROTO to potential canonical representative. + */ +static bool btf_equal_fnproto(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_param *m1, *m2; + __u16 vlen; + int i; + + if (!btf_equal_common(t1, t2)) + return false; + + vlen = btf_vlen(t1); + m1 = btf_params(t1); + m2 = btf_params(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off || m1->type != m2->type) + return false; + m1++; + m2++; + } + return true; +} + +/* + * Check structural compatibility of two FUNC_PROTOs, ignoring referenced type + * IDs. This check is performed during type graph equivalence check and + * referenced types equivalence is checked separately. + */ +static bool btf_compat_fnproto(struct btf_type *t1, struct btf_type *t2) +{ + const struct btf_param *m1, *m2; + __u16 vlen; + int i; + + /* skip return type ID */ + if (t1->name_off != t2->name_off || t1->info != t2->info) + return false; + + vlen = btf_vlen(t1); + m1 = btf_params(t1); + m2 = btf_params(t2); + for (i = 0; i < vlen; i++) { + if (m1->name_off != m2->name_off) + return false; + m1++; + m2++; + } + return true; +} + +/* Prepare split BTF for deduplication by calculating hashes of base BTF's + * types and initializing the rest of the state (canonical type mapping) for + * the fixed base BTF part. + */ +static int btf_dedup_prep(struct btf_dedup *d) +{ + struct btf_type *t; + int type_id; + long h; + + if (!d->btf->base_btf) + return 0; + + for (type_id = 1; type_id < d->btf->start_id; type_id++) { + t = btf_type_by_id(d->btf, type_id); + + /* all base BTF types are self-canonical by definition */ + d->map[type_id] = type_id; + + switch (btf_kind(t)) { + case BTF_KIND_VAR: + case BTF_KIND_DATASEC: + /* VAR and DATASEC are never hash/deduplicated */ + continue; + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_FWD: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_FLOAT: + case BTF_KIND_TYPE_TAG: + h = btf_hash_common(t); + break; + case BTF_KIND_INT: + case BTF_KIND_DECL_TAG: + h = btf_hash_int_decl_tag(t); + break; + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + h = btf_hash_enum(t); + break; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + h = btf_hash_struct(t); + break; + case BTF_KIND_ARRAY: + h = btf_hash_array(t); + break; + case BTF_KIND_FUNC_PROTO: + h = btf_hash_fnproto(t); + break; + default: + pr_debug("unknown kind %d for type [%d]\n", btf_kind(t), type_id); + return -EINVAL; + } + if (btf_dedup_table_add(d, h, type_id)) + return -ENOMEM; + } + + return 0; +} + +/* + * Deduplicate primitive types, that can't reference other types, by calculating + * their type signature hash and comparing them with any possible canonical + * candidate. If no canonical candidate matches, type itself is marked as + * canonical and is added into `btf_dedup->dedup_table` as another candidate. + */ +static int btf_dedup_prim_type(struct btf_dedup *d, __u32 type_id) +{ + struct btf_type *t = btf_type_by_id(d->btf, type_id); + struct hashmap_entry *hash_entry; + struct btf_type *cand; + /* if we don't find equivalent type, then we are canonical */ + __u32 new_id = type_id; + __u32 cand_id; + long h; + + switch (btf_kind(t)) { + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_ARRAY: + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_FUNC: + case BTF_KIND_FUNC_PROTO: + case BTF_KIND_VAR: + case BTF_KIND_DATASEC: + case BTF_KIND_DECL_TAG: + case BTF_KIND_TYPE_TAG: + return 0; + + case BTF_KIND_INT: + h = btf_hash_int_decl_tag(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_int_tag(t, cand)) { + new_id = cand_id; + break; + } + } + break; + + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + h = btf_hash_enum(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_enum(t, cand)) { + new_id = cand_id; + break; + } + if (btf_compat_enum(t, cand)) { + if (btf_is_enum_fwd(t)) { + /* resolve fwd to full enum */ + new_id = cand_id; + break; + } + /* resolve canonical enum fwd to full enum */ + d->map[cand_id] = type_id; + } + } + break; + + case BTF_KIND_FWD: + case BTF_KIND_FLOAT: + h = btf_hash_common(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_common(t, cand)) { + new_id = cand_id; + break; + } + } + break; + + default: + return -EINVAL; + } + + d->map[type_id] = new_id; + if (type_id == new_id && btf_dedup_table_add(d, h, type_id)) + return -ENOMEM; + + return 0; +} + +static int btf_dedup_prim_types(struct btf_dedup *d) +{ + int i, err; + + for (i = 0; i < d->btf->nr_types; i++) { + err = btf_dedup_prim_type(d, d->btf->start_id + i); + if (err) + return err; + } + return 0; +} + +/* + * Check whether type is already mapped into canonical one (could be to itself). + */ +static inline bool is_type_mapped(struct btf_dedup *d, uint32_t type_id) +{ + return d->map[type_id] <= BTF_MAX_NR_TYPES; +} + +/* + * Resolve type ID into its canonical type ID, if any; otherwise return original + * type ID. If type is FWD and is resolved into STRUCT/UNION already, follow + * STRUCT/UNION link and resolve it into canonical type ID as well. + */ +static inline __u32 resolve_type_id(struct btf_dedup *d, __u32 type_id) +{ + while (is_type_mapped(d, type_id) && d->map[type_id] != type_id) + type_id = d->map[type_id]; + return type_id; +} + +/* + * Resolve FWD to underlying STRUCT/UNION, if any; otherwise return original + * type ID. + */ +static uint32_t resolve_fwd_id(struct btf_dedup *d, uint32_t type_id) +{ + __u32 orig_type_id = type_id; + + if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) + return type_id; + + while (is_type_mapped(d, type_id) && d->map[type_id] != type_id) + type_id = d->map[type_id]; + + if (!btf_is_fwd(btf__type_by_id(d->btf, type_id))) + return type_id; + + return orig_type_id; +} + + +static inline __u16 btf_fwd_kind(struct btf_type *t) +{ + return btf_kflag(t) ? BTF_KIND_UNION : BTF_KIND_STRUCT; +} + +/* Check if given two types are identical ARRAY definitions */ +static bool btf_dedup_identical_arrays(struct btf_dedup *d, __u32 id1, __u32 id2) +{ + struct btf_type *t1, *t2; + + t1 = btf_type_by_id(d->btf, id1); + t2 = btf_type_by_id(d->btf, id2); + if (!btf_is_array(t1) || !btf_is_array(t2)) + return false; + + return btf_equal_array(t1, t2); +} + +/* Check if given two types are identical STRUCT/UNION definitions */ +static bool btf_dedup_identical_structs(struct btf_dedup *d, __u32 id1, __u32 id2) +{ + const struct btf_member *m1, *m2; + struct btf_type *t1, *t2; + int n, i; + + t1 = btf_type_by_id(d->btf, id1); + t2 = btf_type_by_id(d->btf, id2); + + if (!btf_is_composite(t1) || btf_kind(t1) != btf_kind(t2)) + return false; + + if (!btf_shallow_equal_struct(t1, t2)) + return false; + + m1 = btf_members(t1); + m2 = btf_members(t2); + for (i = 0, n = btf_vlen(t1); i < n; i++, m1++, m2++) { + if (m1->type != m2->type && + !btf_dedup_identical_arrays(d, m1->type, m2->type) && + !btf_dedup_identical_structs(d, m1->type, m2->type)) + return false; + } + return true; +} + +/* + * Check equivalence of BTF type graph formed by candidate struct/union (we'll + * call it "candidate graph" in this description for brevity) to a type graph + * formed by (potential) canonical struct/union ("canonical graph" for brevity + * here, though keep in mind that not all types in canonical graph are + * necessarily canonical representatives themselves, some of them might be + * duplicates or its uniqueness might not have been established yet). + * Returns: + * - >0, if type graphs are equivalent; + * - 0, if not equivalent; + * - <0, on error. + * + * Algorithm performs side-by-side DFS traversal of both type graphs and checks + * equivalence of BTF types at each step. If at any point BTF types in candidate + * and canonical graphs are not compatible structurally, whole graphs are + * incompatible. If types are structurally equivalent (i.e., all information + * except referenced type IDs is exactly the same), a mapping from `canon_id` to + * a `cand_id` is recored in hypothetical mapping (`btf_dedup->hypot_map`). + * If a type references other types, then those referenced types are checked + * for equivalence recursively. + * + * During DFS traversal, if we find that for current `canon_id` type we + * already have some mapping in hypothetical map, we check for two possible + * situations: + * - `canon_id` is mapped to exactly the same type as `cand_id`. This will + * happen when type graphs have cycles. In this case we assume those two + * types are equivalent. + * - `canon_id` is mapped to different type. This is contradiction in our + * hypothetical mapping, because same graph in canonical graph corresponds + * to two different types in candidate graph, which for equivalent type + * graphs shouldn't happen. This condition terminates equivalence check + * with negative result. + * + * If type graphs traversal exhausts types to check and find no contradiction, + * then type graphs are equivalent. + * + * When checking types for equivalence, there is one special case: FWD types. + * If FWD type resolution is allowed and one of the types (either from canonical + * or candidate graph) is FWD and other is STRUCT/UNION (depending on FWD's kind + * flag) and their names match, hypothetical mapping is updated to point from + * FWD to STRUCT/UNION. If graphs will be determined as equivalent successfully, + * this mapping will be used to record FWD -> STRUCT/UNION mapping permanently. + * + * Technically, this could lead to incorrect FWD to STRUCT/UNION resolution, + * if there are two exactly named (or anonymous) structs/unions that are + * compatible structurally, one of which has FWD field, while other is concrete + * STRUCT/UNION, but according to C sources they are different structs/unions + * that are referencing different types with the same name. This is extremely + * unlikely to happen, but btf_dedup API allows to disable FWD resolution if + * this logic is causing problems. + * + * Doing FWD resolution means that both candidate and/or canonical graphs can + * consists of portions of the graph that come from multiple compilation units. + * This is due to the fact that types within single compilation unit are always + * deduplicated and FWDs are already resolved, if referenced struct/union + * definiton is available. So, if we had unresolved FWD and found corresponding + * STRUCT/UNION, they will be from different compilation units. This + * consequently means that when we "link" FWD to corresponding STRUCT/UNION, + * type graph will likely have at least two different BTF types that describe + * same type (e.g., most probably there will be two different BTF types for the + * same 'int' primitive type) and could even have "overlapping" parts of type + * graph that describe same subset of types. + * + * This in turn means that our assumption that each type in canonical graph + * must correspond to exactly one type in candidate graph might not hold + * anymore and will make it harder to detect contradictions using hypothetical + * map. To handle this problem, we allow to follow FWD -> STRUCT/UNION + * resolution only in canonical graph. FWDs in candidate graphs are never + * resolved. To see why it's OK, let's check all possible situations w.r.t. FWDs + * that can occur: + * - Both types in canonical and candidate graphs are FWDs. If they are + * structurally equivalent, then they can either be both resolved to the + * same STRUCT/UNION or not resolved at all. In both cases they are + * equivalent and there is no need to resolve FWD on candidate side. + * - Both types in canonical and candidate graphs are concrete STRUCT/UNION, + * so nothing to resolve as well, algorithm will check equivalence anyway. + * - Type in canonical graph is FWD, while type in candidate is concrete + * STRUCT/UNION. In this case candidate graph comes from single compilation + * unit, so there is exactly one BTF type for each unique C type. After + * resolving FWD into STRUCT/UNION, there might be more than one BTF type + * in canonical graph mapping to single BTF type in candidate graph, but + * because hypothetical mapping maps from canonical to candidate types, it's + * alright, and we still maintain the property of having single `canon_id` + * mapping to single `cand_id` (there could be two different `canon_id` + * mapped to the same `cand_id`, but it's not contradictory). + * - Type in canonical graph is concrete STRUCT/UNION, while type in candidate + * graph is FWD. In this case we are just going to check compatibility of + * STRUCT/UNION and corresponding FWD, and if they are compatible, we'll + * assume that whatever STRUCT/UNION FWD resolves to must be equivalent to + * a concrete STRUCT/UNION from canonical graph. If the rest of type graphs + * turn out equivalent, we'll re-resolve FWD to concrete STRUCT/UNION from + * canonical graph. + */ +static int btf_dedup_is_equiv(struct btf_dedup *d, __u32 cand_id, + __u32 canon_id) +{ + struct btf_type *cand_type; + struct btf_type *canon_type; + __u32 hypot_type_id; + __u16 cand_kind; + __u16 canon_kind; + int i, eq; + + /* if both resolve to the same canonical, they must be equivalent */ + if (resolve_type_id(d, cand_id) == resolve_type_id(d, canon_id)) + return 1; + + canon_id = resolve_fwd_id(d, canon_id); + + hypot_type_id = d->hypot_map[canon_id]; + if (hypot_type_id <= BTF_MAX_NR_TYPES) { + if (hypot_type_id == cand_id) + return 1; + /* In some cases compiler will generate different DWARF types + * for *identical* array type definitions and use them for + * different fields within the *same* struct. This breaks type + * equivalence check, which makes an assumption that candidate + * types sub-graph has a consistent and deduped-by-compiler + * types within a single CU. So work around that by explicitly + * allowing identical array types here. + */ + if (btf_dedup_identical_arrays(d, hypot_type_id, cand_id)) + return 1; + /* It turns out that similar situation can happen with + * struct/union sometimes, sigh... Handle the case where + * structs/unions are exactly the same, down to the referenced + * type IDs. Anything more complicated (e.g., if referenced + * types are different, but equivalent) is *way more* + * complicated and requires a many-to-many equivalence mapping. + */ + if (btf_dedup_identical_structs(d, hypot_type_id, cand_id)) + return 1; + return 0; + } + + if (btf_dedup_hypot_map_add(d, canon_id, cand_id)) + return -ENOMEM; + + cand_type = btf_type_by_id(d->btf, cand_id); + canon_type = btf_type_by_id(d->btf, canon_id); + cand_kind = btf_kind(cand_type); + canon_kind = btf_kind(canon_type); + + if (cand_type->name_off != canon_type->name_off) + return 0; + + /* FWD <--> STRUCT/UNION equivalence check, if enabled */ + if ((cand_kind == BTF_KIND_FWD || canon_kind == BTF_KIND_FWD) + && cand_kind != canon_kind) { + __u16 real_kind; + __u16 fwd_kind; + + if (cand_kind == BTF_KIND_FWD) { + real_kind = canon_kind; + fwd_kind = btf_fwd_kind(cand_type); + } else { + real_kind = cand_kind; + fwd_kind = btf_fwd_kind(canon_type); + /* we'd need to resolve base FWD to STRUCT/UNION */ + if (fwd_kind == real_kind && canon_id < d->btf->start_id) + d->hypot_adjust_canon = true; + } + return fwd_kind == real_kind; + } + + if (cand_kind != canon_kind) + return 0; + + switch (cand_kind) { + case BTF_KIND_INT: + return btf_equal_int_tag(cand_type, canon_type); + + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + return btf_compat_enum(cand_type, canon_type); + + case BTF_KIND_FWD: + case BTF_KIND_FLOAT: + return btf_equal_common(cand_type, canon_type); + + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_TYPE_TAG: + if (cand_type->info != canon_type->info) + return 0; + return btf_dedup_is_equiv(d, cand_type->type, canon_type->type); + + case BTF_KIND_ARRAY: { + const struct btf_array *cand_arr, *canon_arr; + + if (!btf_compat_array(cand_type, canon_type)) + return 0; + cand_arr = btf_array(cand_type); + canon_arr = btf_array(canon_type); + eq = btf_dedup_is_equiv(d, cand_arr->index_type, canon_arr->index_type); + if (eq <= 0) + return eq; + return btf_dedup_is_equiv(d, cand_arr->type, canon_arr->type); + } + + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *cand_m, *canon_m; + __u16 vlen; + + if (!btf_shallow_equal_struct(cand_type, canon_type)) + return 0; + vlen = btf_vlen(cand_type); + cand_m = btf_members(cand_type); + canon_m = btf_members(canon_type); + for (i = 0; i < vlen; i++) { + eq = btf_dedup_is_equiv(d, cand_m->type, canon_m->type); + if (eq <= 0) + return eq; + cand_m++; + canon_m++; + } + + return 1; + } + + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *cand_p, *canon_p; + __u16 vlen; + + if (!btf_compat_fnproto(cand_type, canon_type)) + return 0; + eq = btf_dedup_is_equiv(d, cand_type->type, canon_type->type); + if (eq <= 0) + return eq; + vlen = btf_vlen(cand_type); + cand_p = btf_params(cand_type); + canon_p = btf_params(canon_type); + for (i = 0; i < vlen; i++) { + eq = btf_dedup_is_equiv(d, cand_p->type, canon_p->type); + if (eq <= 0) + return eq; + cand_p++; + canon_p++; + } + return 1; + } + + default: + return -EINVAL; + } + return 0; +} + +/* + * Use hypothetical mapping, produced by successful type graph equivalence + * check, to augment existing struct/union canonical mapping, where possible. + * + * If BTF_KIND_FWD resolution is allowed, this mapping is also used to record + * FWD -> STRUCT/UNION correspondence as well. FWD resolution is bidirectional: + * it doesn't matter if FWD type was part of canonical graph or candidate one, + * we are recording the mapping anyway. As opposed to carefulness required + * for struct/union correspondence mapping (described below), for FWD resolution + * it's not important, as by the time that FWD type (reference type) will be + * deduplicated all structs/unions will be deduped already anyway. + * + * Recording STRUCT/UNION mapping is purely a performance optimization and is + * not required for correctness. It needs to be done carefully to ensure that + * struct/union from candidate's type graph is not mapped into corresponding + * struct/union from canonical type graph that itself hasn't been resolved into + * canonical representative. The only guarantee we have is that canonical + * struct/union was determined as canonical and that won't change. But any + * types referenced through that struct/union fields could have been not yet + * resolved, so in case like that it's too early to establish any kind of + * correspondence between structs/unions. + * + * No canonical correspondence is derived for primitive types (they are already + * deduplicated completely already anyway) or reference types (they rely on + * stability of struct/union canonical relationship for equivalence checks). + */ +static void btf_dedup_merge_hypot_map(struct btf_dedup *d) +{ + __u32 canon_type_id, targ_type_id; + __u16 t_kind, c_kind; + __u32 t_id, c_id; + int i; + + for (i = 0; i < d->hypot_cnt; i++) { + canon_type_id = d->hypot_list[i]; + targ_type_id = d->hypot_map[canon_type_id]; + t_id = resolve_type_id(d, targ_type_id); + c_id = resolve_type_id(d, canon_type_id); + t_kind = btf_kind(btf__type_by_id(d->btf, t_id)); + c_kind = btf_kind(btf__type_by_id(d->btf, c_id)); + /* + * Resolve FWD into STRUCT/UNION. + * It's ok to resolve FWD into STRUCT/UNION that's not yet + * mapped to canonical representative (as opposed to + * STRUCT/UNION <--> STRUCT/UNION mapping logic below), because + * eventually that struct is going to be mapped and all resolved + * FWDs will automatically resolve to correct canonical + * representative. This will happen before ref type deduping, + * which critically depends on stability of these mapping. This + * stability is not a requirement for STRUCT/UNION equivalence + * checks, though. + */ + + /* if it's the split BTF case, we still need to point base FWD + * to STRUCT/UNION in a split BTF, because FWDs from split BTF + * will be resolved against base FWD. If we don't point base + * canonical FWD to the resolved STRUCT/UNION, then all the + * FWDs in split BTF won't be correctly resolved to a proper + * STRUCT/UNION. + */ + if (t_kind != BTF_KIND_FWD && c_kind == BTF_KIND_FWD) + d->map[c_id] = t_id; + + /* if graph equivalence determined that we'd need to adjust + * base canonical types, then we need to only point base FWDs + * to STRUCTs/UNIONs and do no more modifications. For all + * other purposes the type graphs were not equivalent. + */ + if (d->hypot_adjust_canon) + continue; + + if (t_kind == BTF_KIND_FWD && c_kind != BTF_KIND_FWD) + d->map[t_id] = c_id; + + if ((t_kind == BTF_KIND_STRUCT || t_kind == BTF_KIND_UNION) && + c_kind != BTF_KIND_FWD && + is_type_mapped(d, c_id) && + !is_type_mapped(d, t_id)) { + /* + * as a perf optimization, we can map struct/union + * that's part of type graph we just verified for + * equivalence. We can do that for struct/union that has + * canonical representative only, though. + */ + d->map[t_id] = c_id; + } + } +} + +/* + * Deduplicate struct/union types. + * + * For each struct/union type its type signature hash is calculated, taking + * into account type's name, size, number, order and names of fields, but + * ignoring type ID's referenced from fields, because they might not be deduped + * completely until after reference types deduplication phase. This type hash + * is used to iterate over all potential canonical types, sharing same hash. + * For each canonical candidate we check whether type graphs that they form + * (through referenced types in fields and so on) are equivalent using algorithm + * implemented in `btf_dedup_is_equiv`. If such equivalence is found and + * BTF_KIND_FWD resolution is allowed, then hypothetical mapping + * (btf_dedup->hypot_map) produced by aforementioned type graph equivalence + * algorithm is used to record FWD -> STRUCT/UNION mapping. It's also used to + * potentially map other structs/unions to their canonical representatives, + * if such relationship hasn't yet been established. This speeds up algorithm + * by eliminating some of the duplicate work. + * + * If no matching canonical representative was found, struct/union is marked + * as canonical for itself and is added into btf_dedup->dedup_table hash map + * for further look ups. + */ +static int btf_dedup_struct_type(struct btf_dedup *d, __u32 type_id) +{ + struct btf_type *cand_type, *t; + struct hashmap_entry *hash_entry; + /* if we don't find equivalent type, then we are canonical */ + __u32 new_id = type_id; + __u16 kind; + long h; + + /* already deduped or is in process of deduping (loop detected) */ + if (d->map[type_id] <= BTF_MAX_NR_TYPES) + return 0; + + t = btf_type_by_id(d->btf, type_id); + kind = btf_kind(t); + + if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION) + return 0; + + h = btf_hash_struct(t); + for_each_dedup_cand(d, hash_entry, h) { + __u32 cand_id = hash_entry->value; + int eq; + + /* + * Even though btf_dedup_is_equiv() checks for + * btf_shallow_equal_struct() internally when checking two + * structs (unions) for equivalence, we need to guard here + * from picking matching FWD type as a dedup candidate. + * This can happen due to hash collision. In such case just + * relying on btf_dedup_is_equiv() would lead to potentially + * creating a loop (FWD -> STRUCT and STRUCT -> FWD), because + * FWD and compatible STRUCT/UNION are considered equivalent. + */ + cand_type = btf_type_by_id(d->btf, cand_id); + if (!btf_shallow_equal_struct(t, cand_type)) + continue; + + btf_dedup_clear_hypot_map(d); + eq = btf_dedup_is_equiv(d, type_id, cand_id); + if (eq < 0) + return eq; + if (!eq) + continue; + btf_dedup_merge_hypot_map(d); + if (d->hypot_adjust_canon) /* not really equivalent */ + continue; + new_id = cand_id; + break; + } + + d->map[type_id] = new_id; + if (type_id == new_id && btf_dedup_table_add(d, h, type_id)) + return -ENOMEM; + + return 0; +} + +static int btf_dedup_struct_types(struct btf_dedup *d) +{ + int i, err; + + for (i = 0; i < d->btf->nr_types; i++) { + err = btf_dedup_struct_type(d, d->btf->start_id + i); + if (err) + return err; + } + return 0; +} + +/* + * Deduplicate reference type. + * + * Once all primitive and struct/union types got deduplicated, we can easily + * deduplicate all other (reference) BTF types. This is done in two steps: + * + * 1. Resolve all referenced type IDs into their canonical type IDs. This + * resolution can be done either immediately for primitive or struct/union types + * (because they were deduped in previous two phases) or recursively for + * reference types. Recursion will always terminate at either primitive or + * struct/union type, at which point we can "unwind" chain of reference types + * one by one. There is no danger of encountering cycles because in C type + * system the only way to form type cycle is through struct/union, so any chain + * of reference types, even those taking part in a type cycle, will inevitably + * reach struct/union at some point. + * + * 2. Once all referenced type IDs are resolved into canonical ones, BTF type + * becomes "stable", in the sense that no further deduplication will cause + * any changes to it. With that, it's now possible to calculate type's signature + * hash (this time taking into account referenced type IDs) and loop over all + * potential canonical representatives. If no match was found, current type + * will become canonical representative of itself and will be added into + * btf_dedup->dedup_table as another possible canonical representative. + */ +static int btf_dedup_ref_type(struct btf_dedup *d, __u32 type_id) +{ + struct hashmap_entry *hash_entry; + __u32 new_id = type_id, cand_id; + struct btf_type *t, *cand; + /* if we don't find equivalent type, then we are representative type */ + int ref_type_id; + long h; + + if (d->map[type_id] == BTF_IN_PROGRESS_ID) + return -ELOOP; + if (d->map[type_id] <= BTF_MAX_NR_TYPES) + return resolve_type_id(d, type_id); + + t = btf_type_by_id(d->btf, type_id); + d->map[type_id] = BTF_IN_PROGRESS_ID; + + switch (btf_kind(t)) { + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_TYPE_TAG: + ref_type_id = btf_dedup_ref_type(d, t->type); + if (ref_type_id < 0) + return ref_type_id; + t->type = ref_type_id; + + h = btf_hash_common(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_common(t, cand)) { + new_id = cand_id; + break; + } + } + break; + + case BTF_KIND_DECL_TAG: + ref_type_id = btf_dedup_ref_type(d, t->type); + if (ref_type_id < 0) + return ref_type_id; + t->type = ref_type_id; + + h = btf_hash_int_decl_tag(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_int_tag(t, cand)) { + new_id = cand_id; + break; + } + } + break; + + case BTF_KIND_ARRAY: { + struct btf_array *info = btf_array(t); + + ref_type_id = btf_dedup_ref_type(d, info->type); + if (ref_type_id < 0) + return ref_type_id; + info->type = ref_type_id; + + ref_type_id = btf_dedup_ref_type(d, info->index_type); + if (ref_type_id < 0) + return ref_type_id; + info->index_type = ref_type_id; + + h = btf_hash_array(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_array(t, cand)) { + new_id = cand_id; + break; + } + } + break; + } + + case BTF_KIND_FUNC_PROTO: { + struct btf_param *param; + __u16 vlen; + int i; + + ref_type_id = btf_dedup_ref_type(d, t->type); + if (ref_type_id < 0) + return ref_type_id; + t->type = ref_type_id; + + vlen = btf_vlen(t); + param = btf_params(t); + for (i = 0; i < vlen; i++) { + ref_type_id = btf_dedup_ref_type(d, param->type); + if (ref_type_id < 0) + return ref_type_id; + param->type = ref_type_id; + param++; + } + + h = btf_hash_fnproto(t); + for_each_dedup_cand(d, hash_entry, h) { + cand_id = hash_entry->value; + cand = btf_type_by_id(d->btf, cand_id); + if (btf_equal_fnproto(t, cand)) { + new_id = cand_id; + break; + } + } + break; + } + + default: + return -EINVAL; + } + + d->map[type_id] = new_id; + if (type_id == new_id && btf_dedup_table_add(d, h, type_id)) + return -ENOMEM; + + return new_id; +} + +static int btf_dedup_ref_types(struct btf_dedup *d) +{ + int i, err; + + for (i = 0; i < d->btf->nr_types; i++) { + err = btf_dedup_ref_type(d, d->btf->start_id + i); + if (err < 0) + return err; + } + /* we won't need d->dedup_table anymore */ + hashmap__free(d->dedup_table); + d->dedup_table = NULL; + return 0; +} + +/* + * Collect a map from type names to type ids for all canonical structs + * and unions. If the same name is shared by several canonical types + * use a special value 0 to indicate this fact. + */ +static int btf_dedup_fill_unique_names_map(struct btf_dedup *d, struct hashmap *names_map) +{ + __u32 nr_types = btf__type_cnt(d->btf); + struct btf_type *t; + __u32 type_id; + __u16 kind; + int err; + + /* + * Iterate over base and split module ids in order to get all + * available structs in the map. + */ + for (type_id = 1; type_id < nr_types; ++type_id) { + t = btf_type_by_id(d->btf, type_id); + kind = btf_kind(t); + + if (kind != BTF_KIND_STRUCT && kind != BTF_KIND_UNION) + continue; + + /* Skip non-canonical types */ + if (type_id != d->map[type_id]) + continue; + + err = hashmap__add(names_map, t->name_off, type_id); + if (err == -EEXIST) + err = hashmap__set(names_map, t->name_off, 0, NULL, NULL); + + if (err) + return err; + } + + return 0; +} + +static int btf_dedup_resolve_fwd(struct btf_dedup *d, struct hashmap *names_map, __u32 type_id) +{ + struct btf_type *t = btf_type_by_id(d->btf, type_id); + enum btf_fwd_kind fwd_kind = btf_kflag(t); + __u16 cand_kind, kind = btf_kind(t); + struct btf_type *cand_t; + uintptr_t cand_id; + + if (kind != BTF_KIND_FWD) + return 0; + + /* Skip if this FWD already has a mapping */ + if (type_id != d->map[type_id]) + return 0; + + if (!hashmap__find(names_map, t->name_off, &cand_id)) + return 0; + + /* Zero is a special value indicating that name is not unique */ + if (!cand_id) + return 0; + + cand_t = btf_type_by_id(d->btf, cand_id); + cand_kind = btf_kind(cand_t); + if ((cand_kind == BTF_KIND_STRUCT && fwd_kind != BTF_FWD_STRUCT) || + (cand_kind == BTF_KIND_UNION && fwd_kind != BTF_FWD_UNION)) + return 0; + + d->map[type_id] = cand_id; + + return 0; +} + +/* + * Resolve unambiguous forward declarations. + * + * The lion's share of all FWD declarations is resolved during + * `btf_dedup_struct_types` phase when different type graphs are + * compared against each other. However, if in some compilation unit a + * FWD declaration is not a part of a type graph compared against + * another type graph that declaration's canonical type would not be + * changed. Example: + * + * CU #1: + * + * struct foo; + * struct foo *some_global; + * + * CU #2: + * + * struct foo { int u; }; + * struct foo *another_global; + * + * After `btf_dedup_struct_types` the BTF looks as follows: + * + * [1] STRUCT 'foo' size=4 vlen=1 ... + * [2] INT 'int' size=4 ... + * [3] PTR '(anon)' type_id=1 + * [4] FWD 'foo' fwd_kind=struct + * [5] PTR '(anon)' type_id=4 + * + * This pass assumes that such FWD declarations should be mapped to + * structs or unions with identical name in case if the name is not + * ambiguous. + */ +static int btf_dedup_resolve_fwds(struct btf_dedup *d) +{ + int i, err; + struct hashmap *names_map; + + names_map = hashmap__new(btf_dedup_identity_hash_fn, btf_dedup_equal_fn, NULL); + if (IS_ERR(names_map)) + return PTR_ERR(names_map); + + err = btf_dedup_fill_unique_names_map(d, names_map); + if (err < 0) + goto exit; + + for (i = 0; i < d->btf->nr_types; i++) { + err = btf_dedup_resolve_fwd(d, names_map, d->btf->start_id + i); + if (err < 0) + break; + } + +exit: + hashmap__free(names_map); + return err; +} + +/* + * Compact types. + * + * After we established for each type its corresponding canonical representative + * type, we now can eliminate types that are not canonical and leave only + * canonical ones layed out sequentially in memory by copying them over + * duplicates. During compaction btf_dedup->hypot_map array is reused to store + * a map from original type ID to a new compacted type ID, which will be used + * during next phase to "fix up" type IDs, referenced from struct/union and + * reference types. + */ +static int btf_dedup_compact_types(struct btf_dedup *d) +{ + __u32 *new_offs; + __u32 next_type_id = d->btf->start_id; + const struct btf_type *t; + void *p; + int i, id, len; + + /* we are going to reuse hypot_map to store compaction remapping */ + d->hypot_map[0] = 0; + /* base BTF types are not renumbered */ + for (id = 1; id < d->btf->start_id; id++) + d->hypot_map[id] = id; + for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) + d->hypot_map[id] = BTF_UNPROCESSED_ID; + + p = d->btf->types_data; + + for (i = 0, id = d->btf->start_id; i < d->btf->nr_types; i++, id++) { + if (d->map[id] != id) + continue; + + t = btf__type_by_id(d->btf, id); + len = btf_type_size(t); + if (len < 0) + return len; + + memmove(p, t, len); + d->hypot_map[id] = next_type_id; + d->btf->type_offs[next_type_id - d->btf->start_id] = p - d->btf->types_data; + p += len; + next_type_id++; + } + + /* shrink struct btf's internal types index and update btf_header */ + d->btf->nr_types = next_type_id - d->btf->start_id; + d->btf->type_offs_cap = d->btf->nr_types; + d->btf->hdr->type_len = p - d->btf->types_data; + new_offs = libbpf_reallocarray(d->btf->type_offs, d->btf->type_offs_cap, + sizeof(*new_offs)); + if (d->btf->type_offs_cap && !new_offs) + return -ENOMEM; + d->btf->type_offs = new_offs; + d->btf->hdr->str_off = d->btf->hdr->type_len; + d->btf->raw_size = d->btf->hdr->hdr_len + d->btf->hdr->type_len + d->btf->hdr->str_len; + return 0; +} + +/* + * Figure out final (deduplicated and compacted) type ID for provided original + * `type_id` by first resolving it into corresponding canonical type ID and + * then mapping it to a deduplicated type ID, stored in btf_dedup->hypot_map, + * which is populated during compaction phase. + */ +static int btf_dedup_remap_type_id(__u32 *type_id, void *ctx) +{ + struct btf_dedup *d = ctx; + __u32 resolved_type_id, new_type_id; + + resolved_type_id = resolve_type_id(d, *type_id); + new_type_id = d->hypot_map[resolved_type_id]; + if (new_type_id > BTF_MAX_NR_TYPES) + return -EINVAL; + + *type_id = new_type_id; + return 0; +} + +/* + * Remap referenced type IDs into deduped type IDs. + * + * After BTF types are deduplicated and compacted, their final type IDs may + * differ from original ones. The map from original to a corresponding + * deduped type ID is stored in btf_dedup->hypot_map and is populated during + * compaction phase. During remapping phase we are rewriting all type IDs + * referenced from any BTF type (e.g., struct fields, func proto args, etc) to + * their final deduped type IDs. + */ +static int btf_dedup_remap_types(struct btf_dedup *d) +{ + int i, r; + + for (i = 0; i < d->btf->nr_types; i++) { + struct btf_type *t = btf_type_by_id(d->btf, d->btf->start_id + i); + + r = btf_type_visit_type_ids(t, btf_dedup_remap_type_id, d); + if (r) + return r; + } + + if (!d->btf_ext) + return 0; + + r = btf_ext_visit_type_ids(d->btf_ext, btf_dedup_remap_type_id, d); + if (r) + return r; + + return 0; +} + +/* + * Probe few well-known locations for vmlinux kernel image and try to load BTF + * data out of it to use for target BTF. + */ +struct btf *btf__load_vmlinux_btf(void) +{ + const char *locations[] = { + /* try canonical vmlinux BTF through sysfs first */ + "/sys/kernel/btf/vmlinux", + /* fall back to trying to find vmlinux on disk otherwise */ + "/boot/vmlinux-%1$s", + "/lib/modules/%1$s/vmlinux-%1$s", + "/lib/modules/%1$s/build/vmlinux", + "/usr/lib/modules/%1$s/kernel/vmlinux", + "/usr/lib/debug/boot/vmlinux-%1$s", + "/usr/lib/debug/boot/vmlinux-%1$s.debug", + "/usr/lib/debug/lib/modules/%1$s/vmlinux", + "/data/local/tmp/a13-5.10-2022-06-arm64.btf", + }; + char path[PATH_MAX + 1]; + struct utsname buf; + struct btf *btf; + int i, err; + + uname(&buf); + + for (i = 0; i < ARRAY_SIZE(locations); i++) { + snprintf(path, PATH_MAX, locations[i], buf.release); + + if (faccessat(AT_FDCWD, path, R_OK, AT_EACCESS)) + continue; + + btf = btf__parse(path, NULL); + err = libbpf_get_error(btf); + pr_debug("loading kernel BTF '%s': %d\n", path, err); + if (err) + continue; + + return btf; + } + + pr_warn("failed to find valid kernel BTF\n"); + return libbpf_err_ptr(-ESRCH); +} + +struct btf *libbpf_find_kernel_btf(void) __attribute__((alias("btf__load_vmlinux_btf"))); + +struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf) +{ + char path[80]; + + snprintf(path, sizeof(path), "/sys/kernel/btf/%s", module_name); + return btf__parse_split(path, vmlinux_btf); +} + +int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx) +{ + int i, n, err; + + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + return 0; + + case BTF_KIND_FWD: + case BTF_KIND_CONST: + case BTF_KIND_VOLATILE: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_VAR: + case BTF_KIND_DECL_TAG: + case BTF_KIND_TYPE_TAG: + return visit(&t->type, ctx); + + case BTF_KIND_ARRAY: { + struct btf_array *a = btf_array(t); + + err = visit(&a->type, ctx); + err = err ?: visit(&a->index_type, ctx); + return err; + } + + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + struct btf_member *m = btf_members(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->type, ctx); + if (err) + return err; + } + return 0; + } + + case BTF_KIND_FUNC_PROTO: { + struct btf_param *m = btf_params(t); + + err = visit(&t->type, ctx); + if (err) + return err; + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->type, ctx); + if (err) + return err; + } + return 0; + } + + case BTF_KIND_DATASEC: { + struct btf_var_secinfo *m = btf_var_secinfos(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->type, ctx); + if (err) + return err; + } + return 0; + } + + default: + return -EINVAL; + } +} + +int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx) +{ + int i, n, err; + + err = visit(&t->name_off, ctx); + if (err) + return err; + + switch (btf_kind(t)) { + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + struct btf_member *m = btf_members(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->name_off, ctx); + if (err) + return err; + } + break; + } + case BTF_KIND_ENUM: { + struct btf_enum *m = btf_enum(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->name_off, ctx); + if (err) + return err; + } + break; + } + case BTF_KIND_ENUM64: { + struct btf_enum64 *m = btf_enum64(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->name_off, ctx); + if (err) + return err; + } + break; + } + case BTF_KIND_FUNC_PROTO: { + struct btf_param *m = btf_params(t); + + for (i = 0, n = btf_vlen(t); i < n; i++, m++) { + err = visit(&m->name_off, ctx); + if (err) + return err; + } + break; + } + default: + break; + } + + return 0; +} + +int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx) +{ + const struct btf_ext_info *seg; + struct btf_ext_info_sec *sec; + int i, err; + + seg = &btf_ext->func_info; + for_each_btf_ext_sec(seg, sec) { + struct bpf_func_info_min *rec; + + for_each_btf_ext_rec(seg, sec, i, rec) { + err = visit(&rec->type_id, ctx); + if (err < 0) + return err; + } + } + + seg = &btf_ext->core_relo_info; + for_each_btf_ext_sec(seg, sec) { + struct bpf_core_relo *rec; + + for_each_btf_ext_rec(seg, sec, i, rec) { + err = visit(&rec->type_id, ctx); + if (err < 0) + return err; + } + } + + return 0; +} + +int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx) +{ + const struct btf_ext_info *seg; + struct btf_ext_info_sec *sec; + int i, err; + + seg = &btf_ext->func_info; + for_each_btf_ext_sec(seg, sec) { + err = visit(&sec->sec_name_off, ctx); + if (err) + return err; + } + + seg = &btf_ext->line_info; + for_each_btf_ext_sec(seg, sec) { + struct bpf_line_info_min *rec; + + err = visit(&sec->sec_name_off, ctx); + if (err) + return err; + + for_each_btf_ext_rec(seg, sec, i, rec) { + err = visit(&rec->file_name_off, ctx); + if (err) + return err; + err = visit(&rec->line_off, ctx); + if (err) + return err; + } + } + + seg = &btf_ext->core_relo_info; + for_each_btf_ext_sec(seg, sec) { + struct bpf_core_relo *rec; + + err = visit(&sec->sec_name_off, ctx); + if (err) + return err; + + for_each_btf_ext_rec(seg, sec, i, rec) { + err = visit(&rec->access_str_off, ctx); + if (err) + return err; + } + } + + return 0; +} diff --git a/libbpf/src/btf.h b/libbpf/src/btf.h new file mode 100644 index 0000000..8e6880d --- /dev/null +++ b/libbpf/src/btf.h @@ -0,0 +1,575 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2018 Facebook */ +/*! \file */ + +#ifndef __LIBBPF_BTF_H +#define __LIBBPF_BTF_H + +#include +#include +#include +#include + +#include "libbpf_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define BTF_ELF_SEC ".BTF" +#define BTF_EXT_ELF_SEC ".BTF.ext" +#define MAPS_ELF_SEC ".maps" + +struct btf; +struct btf_ext; +struct btf_type; + +struct bpf_object; + +enum btf_endianness { + BTF_LITTLE_ENDIAN = 0, + BTF_BIG_ENDIAN = 1, +}; + +/** + * @brief **btf__free()** frees all data of a BTF object + * @param btf BTF object to free + */ +LIBBPF_API void btf__free(struct btf *btf); + +/** + * @brief **btf__new()** creates a new instance of a BTF object from the raw + * bytes of an ELF's BTF section + * @param data raw bytes + * @param size number of bytes passed in `data` + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new(const void *data, __u32 size); + +/** + * @brief **btf__new_split()** create a new instance of a BTF object from the + * provided raw data bytes. It takes another BTF instance, **base_btf**, which + * serves as a base BTF, which is extended by types in a newly created BTF + * instance + * @param data raw bytes + * @param size length of raw bytes + * @param base_btf the base BTF object + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * If *base_btf* is NULL, `btf__new_split()` is equivalent to `btf__new()` and + * creates non-split BTF. + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new_split(const void *data, __u32 size, struct btf *base_btf); + +/** + * @brief **btf__new_empty()** creates an empty BTF object. Use + * `btf__add_*()` to populate such BTF object. + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new_empty(void); + +/** + * @brief **btf__new_empty_split()** creates an unpopulated BTF object from an + * ELF BTF section except with a base BTF on top of which split BTF should be + * based + * @return new BTF object instance which has to be eventually freed with + * **btf__free()** + * + * If *base_btf* is NULL, `btf__new_empty_split()` is equivalent to + * `btf__new_empty()` and creates non-split BTF. + * + * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract + * error code from such a pointer `libbpf_get_error()` should be used. If + * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is + * returned on error instead. In both cases thread-local `errno` variable is + * always set to error code as well. + */ +LIBBPF_API struct btf *btf__new_empty_split(struct btf *base_btf); + +LIBBPF_API struct btf *btf__parse(const char *path, struct btf_ext **btf_ext); +LIBBPF_API struct btf *btf__parse_split(const char *path, struct btf *base_btf); +LIBBPF_API struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext); +LIBBPF_API struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf); +LIBBPF_API struct btf *btf__parse_raw(const char *path); +LIBBPF_API struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf); + +LIBBPF_API struct btf *btf__load_vmlinux_btf(void); +LIBBPF_API struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf); + +LIBBPF_API struct btf *btf__load_from_kernel_by_id(__u32 id); +LIBBPF_API struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf); + +LIBBPF_API int btf__load_into_kernel(struct btf *btf); +LIBBPF_API __s32 btf__find_by_name(const struct btf *btf, + const char *type_name); +LIBBPF_API __s32 btf__find_by_name_kind(const struct btf *btf, + const char *type_name, __u32 kind); +LIBBPF_API __u32 btf__type_cnt(const struct btf *btf); +LIBBPF_API const struct btf *btf__base_btf(const struct btf *btf); +LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf, + __u32 id); +LIBBPF_API size_t btf__pointer_size(const struct btf *btf); +LIBBPF_API int btf__set_pointer_size(struct btf *btf, size_t ptr_sz); +LIBBPF_API enum btf_endianness btf__endianness(const struct btf *btf); +LIBBPF_API int btf__set_endianness(struct btf *btf, enum btf_endianness endian); +LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id); +LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id); +LIBBPF_API int btf__align_of(const struct btf *btf, __u32 id); +LIBBPF_API int btf__fd(const struct btf *btf); +LIBBPF_API void btf__set_fd(struct btf *btf, int fd); +LIBBPF_API const void *btf__raw_data(const struct btf *btf, __u32 *size); +LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset); +LIBBPF_API const char *btf__str_by_offset(const struct btf *btf, __u32 offset); + +LIBBPF_API struct btf_ext *btf_ext__new(const __u8 *data, __u32 size); +LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext); +LIBBPF_API const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size); + +LIBBPF_API int btf__find_str(struct btf *btf, const char *s); +LIBBPF_API int btf__add_str(struct btf *btf, const char *s); +LIBBPF_API int btf__add_type(struct btf *btf, const struct btf *src_btf, + const struct btf_type *src_type); +/** + * @brief **btf__add_btf()** appends all the BTF types from *src_btf* into *btf* + * @param btf BTF object which all the BTF types and strings are added to + * @param src_btf BTF object which all BTF types and referenced strings are copied from + * @return BTF type ID of the first appended BTF type, or negative error code + * + * **btf__add_btf()** can be used to simply and efficiently append the entire + * contents of one BTF object to another one. All the BTF type data is copied + * over, all referenced type IDs are adjusted by adding a necessary ID offset. + * Only strings referenced from BTF types are copied over and deduplicated, so + * if there were some unused strings in *src_btf*, those won't be copied over, + * which is consistent with the general string deduplication semantics of BTF + * writing APIs. + * + * If any error is encountered during this process, the contents of *btf* is + * left intact, which means that **btf__add_btf()** follows the transactional + * semantics and the operation as a whole is all-or-nothing. + * + * *src_btf* has to be non-split BTF, as of now copying types from split BTF + * is not supported and will result in -ENOTSUP error code returned. + */ +LIBBPF_API int btf__add_btf(struct btf *btf, const struct btf *src_btf); + +LIBBPF_API int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding); +LIBBPF_API int btf__add_float(struct btf *btf, const char *name, size_t byte_sz); +LIBBPF_API int btf__add_ptr(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_array(struct btf *btf, + int index_type_id, int elem_type_id, __u32 nr_elems); +/* struct/union construction APIs */ +LIBBPF_API int btf__add_struct(struct btf *btf, const char *name, __u32 sz); +LIBBPF_API int btf__add_union(struct btf *btf, const char *name, __u32 sz); +LIBBPF_API int btf__add_field(struct btf *btf, const char *name, int field_type_id, + __u32 bit_offset, __u32 bit_size); + +/* enum construction APIs */ +LIBBPF_API int btf__add_enum(struct btf *btf, const char *name, __u32 bytes_sz); +LIBBPF_API int btf__add_enum_value(struct btf *btf, const char *name, __s64 value); +LIBBPF_API int btf__add_enum64(struct btf *btf, const char *name, __u32 bytes_sz, bool is_signed); +LIBBPF_API int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value); + +enum btf_fwd_kind { + BTF_FWD_STRUCT = 0, + BTF_FWD_UNION = 1, + BTF_FWD_ENUM = 2, +}; + +LIBBPF_API int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind); +LIBBPF_API int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id); +LIBBPF_API int btf__add_volatile(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_const(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_restrict(struct btf *btf, int ref_type_id); +LIBBPF_API int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id); + +/* func and func_proto construction APIs */ +LIBBPF_API int btf__add_func(struct btf *btf, const char *name, + enum btf_func_linkage linkage, int proto_type_id); +LIBBPF_API int btf__add_func_proto(struct btf *btf, int ret_type_id); +LIBBPF_API int btf__add_func_param(struct btf *btf, const char *name, int type_id); + +/* var & datasec construction APIs */ +LIBBPF_API int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id); +LIBBPF_API int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz); +LIBBPF_API int btf__add_datasec_var_info(struct btf *btf, int var_type_id, + __u32 offset, __u32 byte_sz); + +/* tag construction API */ +LIBBPF_API int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, + int component_idx); + +struct btf_dedup_opts { + size_t sz; + /* optional .BTF.ext info to dedup along the main BTF info */ + struct btf_ext *btf_ext; + /* force hash collisions (used for testing) */ + bool force_collisions; + size_t :0; +}; +#define btf_dedup_opts__last_field force_collisions + +LIBBPF_API int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts); + +struct btf_dump; + +struct btf_dump_opts { + size_t sz; +}; +#define btf_dump_opts__last_field sz + +typedef void (*btf_dump_printf_fn_t)(void *ctx, const char *fmt, va_list args); + +LIBBPF_API struct btf_dump *btf_dump__new(const struct btf *btf, + btf_dump_printf_fn_t printf_fn, + void *ctx, + const struct btf_dump_opts *opts); + +LIBBPF_API void btf_dump__free(struct btf_dump *d); + +LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id); + +struct btf_dump_emit_type_decl_opts { + /* size of this struct, for forward/backward compatiblity */ + size_t sz; + /* optional field name for type declaration, e.g.: + * - struct my_struct + * - void (*)(int) + * - char (*)[123] + */ + const char *field_name; + /* extra indentation level (in number of tabs) to emit for multi-line + * type declarations (e.g., anonymous struct); applies for lines + * starting from the second one (first line is assumed to have + * necessary indentation already + */ + int indent_level; + /* strip all the const/volatile/restrict mods */ + bool strip_mods; + size_t :0; +}; +#define btf_dump_emit_type_decl_opts__last_field strip_mods + +LIBBPF_API int +btf_dump__emit_type_decl(struct btf_dump *d, __u32 id, + const struct btf_dump_emit_type_decl_opts *opts); + + +struct btf_dump_type_data_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + const char *indent_str; + int indent_level; + /* below match "show" flags for bpf_show_snprintf() */ + bool compact; /* no newlines/indentation */ + bool skip_names; /* skip member/type names */ + bool emit_zeroes; /* show 0-valued fields */ + size_t :0; +}; +#define btf_dump_type_data_opts__last_field emit_zeroes + +LIBBPF_API int +btf_dump__dump_type_data(struct btf_dump *d, __u32 id, + const void *data, size_t data_sz, + const struct btf_dump_type_data_opts *opts); + +/* + * A set of helpers for easier BTF types handling. + * + * The inline functions below rely on constants from the kernel headers which + * may not be available for applications including this header file. To avoid + * compilation errors, we define all the constants here that were added after + * the initial introduction of the BTF_KIND* constants. + */ +#ifndef BTF_KIND_FUNC +#define BTF_KIND_FUNC 12 /* Function */ +#define BTF_KIND_FUNC_PROTO 13 /* Function Proto */ +#endif +#ifndef BTF_KIND_VAR +#define BTF_KIND_VAR 14 /* Variable */ +#define BTF_KIND_DATASEC 15 /* Section */ +#endif +#ifndef BTF_KIND_FLOAT +#define BTF_KIND_FLOAT 16 /* Floating point */ +#endif +/* The kernel header switched to enums, so the following were never #defined */ +#define BTF_KIND_DECL_TAG 17 /* Decl Tag */ +#define BTF_KIND_TYPE_TAG 18 /* Type Tag */ +#define BTF_KIND_ENUM64 19 /* Enum for up-to 64bit values */ + +static inline __u16 btf_kind(const struct btf_type *t) +{ + return BTF_INFO_KIND(t->info); +} + +static inline __u16 btf_vlen(const struct btf_type *t) +{ + return BTF_INFO_VLEN(t->info); +} + +static inline bool btf_kflag(const struct btf_type *t) +{ + return BTF_INFO_KFLAG(t->info); +} + +static inline bool btf_is_void(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_UNKN; +} + +static inline bool btf_is_int(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_INT; +} + +static inline bool btf_is_ptr(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_PTR; +} + +static inline bool btf_is_array(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_ARRAY; +} + +static inline bool btf_is_struct(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_STRUCT; +} + +static inline bool btf_is_union(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_UNION; +} + +static inline bool btf_is_composite(const struct btf_type *t) +{ + __u16 kind = btf_kind(t); + + return kind == BTF_KIND_STRUCT || kind == BTF_KIND_UNION; +} + +static inline bool btf_is_enum(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_ENUM; +} + +static inline bool btf_is_enum64(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_ENUM64; +} + +static inline bool btf_is_fwd(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FWD; +} + +static inline bool btf_is_typedef(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_TYPEDEF; +} + +static inline bool btf_is_volatile(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_VOLATILE; +} + +static inline bool btf_is_const(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_CONST; +} + +static inline bool btf_is_restrict(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_RESTRICT; +} + +static inline bool btf_is_mod(const struct btf_type *t) +{ + __u16 kind = btf_kind(t); + + return kind == BTF_KIND_VOLATILE || + kind == BTF_KIND_CONST || + kind == BTF_KIND_RESTRICT || + kind == BTF_KIND_TYPE_TAG; +} + +static inline bool btf_is_func(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FUNC; +} + +static inline bool btf_is_func_proto(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FUNC_PROTO; +} + +static inline bool btf_is_var(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_VAR; +} + +static inline bool btf_is_datasec(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_DATASEC; +} + +static inline bool btf_is_float(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_FLOAT; +} + +static inline bool btf_is_decl_tag(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_DECL_TAG; +} + +static inline bool btf_is_type_tag(const struct btf_type *t) +{ + return btf_kind(t) == BTF_KIND_TYPE_TAG; +} + +static inline bool btf_is_any_enum(const struct btf_type *t) +{ + return btf_is_enum(t) || btf_is_enum64(t); +} + +static inline bool btf_kind_core_compat(const struct btf_type *t1, + const struct btf_type *t2) +{ + return btf_kind(t1) == btf_kind(t2) || + (btf_is_any_enum(t1) && btf_is_any_enum(t2)); +} + +static inline __u8 btf_int_encoding(const struct btf_type *t) +{ + return BTF_INT_ENCODING(*(__u32 *)(t + 1)); +} + +static inline __u8 btf_int_offset(const struct btf_type *t) +{ + return BTF_INT_OFFSET(*(__u32 *)(t + 1)); +} + +static inline __u8 btf_int_bits(const struct btf_type *t) +{ + return BTF_INT_BITS(*(__u32 *)(t + 1)); +} + +static inline struct btf_array *btf_array(const struct btf_type *t) +{ + return (struct btf_array *)(t + 1); +} + +static inline struct btf_enum *btf_enum(const struct btf_type *t) +{ + return (struct btf_enum *)(t + 1); +} + +struct btf_enum64; + +static inline struct btf_enum64 *btf_enum64(const struct btf_type *t) +{ + return (struct btf_enum64 *)(t + 1); +} + +static inline __u64 btf_enum64_value(const struct btf_enum64 *e) +{ + /* struct btf_enum64 is introduced in Linux 6.0, which is very + * bleeding-edge. Here we are avoiding relying on struct btf_enum64 + * definition coming from kernel UAPI headers to support wider range + * of system-wide kernel headers. + * + * Given this header can be also included from C++ applications, that + * further restricts C tricks we can use (like using compatible + * anonymous struct). So just treat struct btf_enum64 as + * a three-element array of u32 and access second (lo32) and third + * (hi32) elements directly. + * + * For reference, here is a struct btf_enum64 definition: + * + * const struct btf_enum64 { + * __u32 name_off; + * __u32 val_lo32; + * __u32 val_hi32; + * }; + */ + const __u32 *e64 = (const __u32 *)e; + + return ((__u64)e64[2] << 32) | e64[1]; +} + +static inline struct btf_member *btf_members(const struct btf_type *t) +{ + return (struct btf_member *)(t + 1); +} + +/* Get bit offset of a member with specified index. */ +static inline __u32 btf_member_bit_offset(const struct btf_type *t, + __u32 member_idx) +{ + const struct btf_member *m = btf_members(t) + member_idx; + bool kflag = btf_kflag(t); + + return kflag ? BTF_MEMBER_BIT_OFFSET(m->offset) : m->offset; +} +/* + * Get bitfield size of a member, assuming t is BTF_KIND_STRUCT or + * BTF_KIND_UNION. If member is not a bitfield, zero is returned. + */ +static inline __u32 btf_member_bitfield_size(const struct btf_type *t, + __u32 member_idx) +{ + const struct btf_member *m = btf_members(t) + member_idx; + bool kflag = btf_kflag(t); + + return kflag ? BTF_MEMBER_BITFIELD_SIZE(m->offset) : 0; +} + +static inline struct btf_param *btf_params(const struct btf_type *t) +{ + return (struct btf_param *)(t + 1); +} + +static inline struct btf_var *btf_var(const struct btf_type *t) +{ + return (struct btf_var *)(t + 1); +} + +static inline struct btf_var_secinfo * +btf_var_secinfos(const struct btf_type *t) +{ + return (struct btf_var_secinfo *)(t + 1); +} + +struct btf_decl_tag; +static inline struct btf_decl_tag *btf_decl_tag(const struct btf_type *t) +{ + return (struct btf_decl_tag *)(t + 1); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_BTF_H */ diff --git a/libbpf/src/btf_dump.c b/libbpf/src/btf_dump.c new file mode 100644 index 0000000..580985e --- /dev/null +++ b/libbpf/src/btf_dump.c @@ -0,0 +1,2526 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * BTF-to-C type converter. + * + * Copyright (c) 2019 Facebook + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "btf.h" +#include "hashmap.h" +#include "libbpf.h" +#include "libbpf_internal.h" + +static const char PREFIXES[] = "\t\t\t\t\t\t\t\t\t\t\t\t\t"; +static const size_t PREFIX_CNT = sizeof(PREFIXES) - 1; + +static const char *pfx(int lvl) +{ + return lvl >= PREFIX_CNT ? PREFIXES : &PREFIXES[PREFIX_CNT - lvl]; +} + +enum btf_dump_type_order_state { + NOT_ORDERED, + ORDERING, + ORDERED, +}; + +enum btf_dump_type_emit_state { + NOT_EMITTED, + EMITTING, + EMITTED, +}; + +/* per-type auxiliary state */ +struct btf_dump_type_aux_state { + /* topological sorting state */ + enum btf_dump_type_order_state order_state: 2; + /* emitting state used to determine the need for forward declaration */ + enum btf_dump_type_emit_state emit_state: 2; + /* whether forward declaration was already emitted */ + __u8 fwd_emitted: 1; + /* whether unique non-duplicate name was already assigned */ + __u8 name_resolved: 1; + /* whether type is referenced from any other type */ + __u8 referenced: 1; +}; + +/* indent string length; one indent string is added for each indent level */ +#define BTF_DATA_INDENT_STR_LEN 32 + +/* + * Common internal data for BTF type data dump operations. + */ +struct btf_dump_data { + const void *data_end; /* end of valid data to show */ + bool compact; + bool skip_names; + bool emit_zeroes; + __u8 indent_lvl; /* base indent level */ + char indent_str[BTF_DATA_INDENT_STR_LEN]; + /* below are used during iteration */ + int depth; + bool is_array_member; + bool is_array_terminated; + bool is_array_char; +}; + +struct btf_dump { + const struct btf *btf; + btf_dump_printf_fn_t printf_fn; + void *cb_ctx; + int ptr_sz; + bool strip_mods; + bool skip_anon_defs; + int last_id; + + /* per-type auxiliary state */ + struct btf_dump_type_aux_state *type_states; + size_t type_states_cap; + /* per-type optional cached unique name, must be freed, if present */ + const char **cached_names; + size_t cached_names_cap; + + /* topo-sorted list of dependent type definitions */ + __u32 *emit_queue; + int emit_queue_cap; + int emit_queue_cnt; + + /* + * stack of type declarations (e.g., chain of modifiers, arrays, + * funcs, etc) + */ + __u32 *decl_stack; + int decl_stack_cap; + int decl_stack_cnt; + + /* maps struct/union/enum name to a number of name occurrences */ + struct hashmap *type_names; + /* + * maps typedef identifiers and enum value names to a number of such + * name occurrences + */ + struct hashmap *ident_names; + /* + * data for typed display; allocated if needed. + */ + struct btf_dump_data *typed_dump; +}; + +static size_t str_hash_fn(long key, void *ctx) +{ + return str_hash((void *)key); +} + +static bool str_equal_fn(long a, long b, void *ctx) +{ + return strcmp((void *)a, (void *)b) == 0; +} + +static const char *btf_name_of(const struct btf_dump *d, __u32 name_off) +{ + return btf__name_by_offset(d->btf, name_off); +} + +static void btf_dump_printf(const struct btf_dump *d, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + d->printf_fn(d->cb_ctx, fmt, args); + va_end(args); +} + +static int btf_dump_mark_referenced(struct btf_dump *d); +static int btf_dump_resize(struct btf_dump *d); + +struct btf_dump *btf_dump__new(const struct btf *btf, + btf_dump_printf_fn_t printf_fn, + void *ctx, + const struct btf_dump_opts *opts) +{ + struct btf_dump *d; + int err; + + if (!OPTS_VALID(opts, btf_dump_opts)) + return libbpf_err_ptr(-EINVAL); + + if (!printf_fn) + return libbpf_err_ptr(-EINVAL); + + d = calloc(1, sizeof(struct btf_dump)); + if (!d) + return libbpf_err_ptr(-ENOMEM); + + d->btf = btf; + d->printf_fn = printf_fn; + d->cb_ctx = ctx; + d->ptr_sz = btf__pointer_size(btf) ? : sizeof(void *); + + d->type_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); + if (IS_ERR(d->type_names)) { + err = PTR_ERR(d->type_names); + d->type_names = NULL; + goto err; + } + d->ident_names = hashmap__new(str_hash_fn, str_equal_fn, NULL); + if (IS_ERR(d->ident_names)) { + err = PTR_ERR(d->ident_names); + d->ident_names = NULL; + goto err; + } + + err = btf_dump_resize(d); + if (err) + goto err; + + return d; +err: + btf_dump__free(d); + return libbpf_err_ptr(err); +} + +static int btf_dump_resize(struct btf_dump *d) +{ + int err, last_id = btf__type_cnt(d->btf) - 1; + + if (last_id <= d->last_id) + return 0; + + if (libbpf_ensure_mem((void **)&d->type_states, &d->type_states_cap, + sizeof(*d->type_states), last_id + 1)) + return -ENOMEM; + if (libbpf_ensure_mem((void **)&d->cached_names, &d->cached_names_cap, + sizeof(*d->cached_names), last_id + 1)) + return -ENOMEM; + + if (d->last_id == 0) { + /* VOID is special */ + d->type_states[0].order_state = ORDERED; + d->type_states[0].emit_state = EMITTED; + } + + /* eagerly determine referenced types for anon enums */ + err = btf_dump_mark_referenced(d); + if (err) + return err; + + d->last_id = last_id; + return 0; +} + +static void btf_dump_free_names(struct hashmap *map) +{ + size_t bkt; + struct hashmap_entry *cur; + + hashmap__for_each_entry(map, cur, bkt) + free((void *)cur->pkey); + + hashmap__free(map); +} + +void btf_dump__free(struct btf_dump *d) +{ + int i; + + if (IS_ERR_OR_NULL(d)) + return; + + free(d->type_states); + if (d->cached_names) { + /* any set cached name is owned by us and should be freed */ + for (i = 0; i <= d->last_id; i++) { + if (d->cached_names[i]) + free((void *)d->cached_names[i]); + } + } + free(d->cached_names); + free(d->emit_queue); + free(d->decl_stack); + btf_dump_free_names(d->type_names); + btf_dump_free_names(d->ident_names); + + free(d); +} + +static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr); +static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id); + +/* + * Dump BTF type in a compilable C syntax, including all the necessary + * dependent types, necessary for compilation. If some of the dependent types + * were already emitted as part of previous btf_dump__dump_type() invocation + * for another type, they won't be emitted again. This API allows callers to + * filter out BTF types according to user-defined criterias and emitted only + * minimal subset of types, necessary to compile everything. Full struct/union + * definitions will still be emitted, even if the only usage is through + * pointer and could be satisfied with just a forward declaration. + * + * Dumping is done in two high-level passes: + * 1. Topologically sort type definitions to satisfy C rules of compilation. + * 2. Emit type definitions in C syntax. + * + * Returns 0 on success; <0, otherwise. + */ +int btf_dump__dump_type(struct btf_dump *d, __u32 id) +{ + int err, i; + + if (id >= btf__type_cnt(d->btf)) + return libbpf_err(-EINVAL); + + err = btf_dump_resize(d); + if (err) + return libbpf_err(err); + + d->emit_queue_cnt = 0; + err = btf_dump_order_type(d, id, false); + if (err < 0) + return libbpf_err(err); + + for (i = 0; i < d->emit_queue_cnt; i++) + btf_dump_emit_type(d, d->emit_queue[i], 0 /*top-level*/); + + return 0; +} + +/* + * Mark all types that are referenced from any other type. This is used to + * determine top-level anonymous enums that need to be emitted as an + * independent type declarations. + * Anonymous enums come in two flavors: either embedded in a struct's field + * definition, in which case they have to be declared inline as part of field + * type declaration; or as a top-level anonymous enum, typically used for + * declaring global constants. It's impossible to distinguish between two + * without knowning whether given enum type was referenced from other type: + * top-level anonymous enum won't be referenced by anything, while embedded + * one will. + */ +static int btf_dump_mark_referenced(struct btf_dump *d) +{ + int i, j, n = btf__type_cnt(d->btf); + const struct btf_type *t; + __u16 vlen; + + for (i = d->last_id + 1; i < n; i++) { + t = btf__type_by_id(d->btf, i); + vlen = btf_vlen(t); + + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FWD: + case BTF_KIND_FLOAT: + break; + + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_PTR: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FUNC: + case BTF_KIND_VAR: + case BTF_KIND_DECL_TAG: + case BTF_KIND_TYPE_TAG: + d->type_states[t->type].referenced = 1; + break; + + case BTF_KIND_ARRAY: { + const struct btf_array *a = btf_array(t); + + d->type_states[a->index_type].referenced = 1; + d->type_states[a->type].referenced = 1; + break; + } + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m = btf_members(t); + + for (j = 0; j < vlen; j++, m++) + d->type_states[m->type].referenced = 1; + break; + } + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *p = btf_params(t); + + for (j = 0; j < vlen; j++, p++) + d->type_states[p->type].referenced = 1; + break; + } + case BTF_KIND_DATASEC: { + const struct btf_var_secinfo *v = btf_var_secinfos(t); + + for (j = 0; j < vlen; j++, v++) + d->type_states[v->type].referenced = 1; + break; + } + default: + return -EINVAL; + } + } + return 0; +} + +static int btf_dump_add_emit_queue_id(struct btf_dump *d, __u32 id) +{ + __u32 *new_queue; + size_t new_cap; + + if (d->emit_queue_cnt >= d->emit_queue_cap) { + new_cap = max(16, d->emit_queue_cap * 3 / 2); + new_queue = libbpf_reallocarray(d->emit_queue, new_cap, sizeof(new_queue[0])); + if (!new_queue) + return -ENOMEM; + d->emit_queue = new_queue; + d->emit_queue_cap = new_cap; + } + + d->emit_queue[d->emit_queue_cnt++] = id; + return 0; +} + +/* + * Determine order of emitting dependent types and specified type to satisfy + * C compilation rules. This is done through topological sorting with an + * additional complication which comes from C rules. The main idea for C is + * that if some type is "embedded" into a struct/union, it's size needs to be + * known at the time of definition of containing type. E.g., for: + * + * struct A {}; + * struct B { struct A x; } + * + * struct A *HAS* to be defined before struct B, because it's "embedded", + * i.e., it is part of struct B layout. But in the following case: + * + * struct A; + * struct B { struct A *x; } + * struct A {}; + * + * it's enough to just have a forward declaration of struct A at the time of + * struct B definition, as struct B has a pointer to struct A, so the size of + * field x is known without knowing struct A size: it's sizeof(void *). + * + * Unfortunately, there are some trickier cases we need to handle, e.g.: + * + * struct A {}; // if this was forward-declaration: compilation error + * struct B { + * struct { // anonymous struct + * struct A y; + * } *x; + * }; + * + * In this case, struct B's field x is a pointer, so it's size is known + * regardless of the size of (anonymous) struct it points to. But because this + * struct is anonymous and thus defined inline inside struct B, *and* it + * embeds struct A, compiler requires full definition of struct A to be known + * before struct B can be defined. This creates a transitive dependency + * between struct A and struct B. If struct A was forward-declared before + * struct B definition and fully defined after struct B definition, that would + * trigger compilation error. + * + * All this means that while we are doing topological sorting on BTF type + * graph, we need to determine relationships between different types (graph + * nodes): + * - weak link (relationship) between X and Y, if Y *CAN* be + * forward-declared at the point of X definition; + * - strong link, if Y *HAS* to be fully-defined before X can be defined. + * + * The rule is as follows. Given a chain of BTF types from X to Y, if there is + * BTF_KIND_PTR type in the chain and at least one non-anonymous type + * Z (excluding X, including Y), then link is weak. Otherwise, it's strong. + * Weak/strong relationship is determined recursively during DFS traversal and + * is returned as a result from btf_dump_order_type(). + * + * btf_dump_order_type() is trying to avoid unnecessary forward declarations, + * but it is not guaranteeing that no extraneous forward declarations will be + * emitted. + * + * To avoid extra work, algorithm marks some of BTF types as ORDERED, when + * it's done with them, but not for all (e.g., VOLATILE, CONST, RESTRICT, + * ARRAY, FUNC_PROTO), as weak/strong semantics for those depends on the + * entire graph path, so depending where from one came to that BTF type, it + * might cause weak or strong ordering. For types like STRUCT/UNION/INT/ENUM, + * once they are processed, there is no need to do it again, so they are + * marked as ORDERED. We can mark PTR as ORDERED as well, as it semi-forces + * weak link, unless subsequent referenced STRUCT/UNION/ENUM is anonymous. But + * in any case, once those are processed, no need to do it again, as the + * result won't change. + * + * Returns: + * - 1, if type is part of strong link (so there is strong topological + * ordering requirements); + * - 0, if type is part of weak link (so can be satisfied through forward + * declaration); + * - <0, on error (e.g., unsatisfiable type loop detected). + */ +static int btf_dump_order_type(struct btf_dump *d, __u32 id, bool through_ptr) +{ + /* + * Order state is used to detect strong link cycles, but only for BTF + * kinds that are or could be an independent definition (i.e., + * stand-alone fwd decl, enum, typedef, struct, union). Ptrs, arrays, + * func_protos, modifiers are just means to get to these definitions. + * Int/void don't need definitions, they are assumed to be always + * properly defined. We also ignore datasec, var, and funcs for now. + * So for all non-defining kinds, we never even set ordering state, + * for defining kinds we set ORDERING and subsequently ORDERED if it + * forms a strong link. + */ + struct btf_dump_type_aux_state *tstate = &d->type_states[id]; + const struct btf_type *t; + __u16 vlen; + int err, i; + + /* return true, letting typedefs know that it's ok to be emitted */ + if (tstate->order_state == ORDERED) + return 1; + + t = btf__type_by_id(d->btf, id); + + if (tstate->order_state == ORDERING) { + /* type loop, but resolvable through fwd declaration */ + if (btf_is_composite(t) && through_ptr && t->name_off != 0) + return 0; + pr_warn("unsatisfiable type cycle, id:[%u]\n", id); + return -ELOOP; + } + + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + tstate->order_state = ORDERED; + return 0; + + case BTF_KIND_PTR: + err = btf_dump_order_type(d, t->type, true); + tstate->order_state = ORDERED; + return err; + + case BTF_KIND_ARRAY: + return btf_dump_order_type(d, btf_array(t)->type, false); + + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m = btf_members(t); + /* + * struct/union is part of strong link, only if it's embedded + * (so no ptr in a path) or it's anonymous (so has to be + * defined inline, even if declared through ptr) + */ + if (through_ptr && t->name_off != 0) + return 0; + + tstate->order_state = ORDERING; + + vlen = btf_vlen(t); + for (i = 0; i < vlen; i++, m++) { + err = btf_dump_order_type(d, m->type, false); + if (err < 0) + return err; + } + + if (t->name_off != 0) { + err = btf_dump_add_emit_queue_id(d, id); + if (err < 0) + return err; + } + + tstate->order_state = ORDERED; + return 1; + } + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FWD: + /* + * non-anonymous or non-referenced enums are top-level + * declarations and should be emitted. Same logic can be + * applied to FWDs, it won't hurt anyways. + */ + if (t->name_off != 0 || !tstate->referenced) { + err = btf_dump_add_emit_queue_id(d, id); + if (err) + return err; + } + tstate->order_state = ORDERED; + return 1; + + case BTF_KIND_TYPEDEF: { + int is_strong; + + is_strong = btf_dump_order_type(d, t->type, through_ptr); + if (is_strong < 0) + return is_strong; + + /* typedef is similar to struct/union w.r.t. fwd-decls */ + if (through_ptr && !is_strong) + return 0; + + /* typedef is always a named definition */ + err = btf_dump_add_emit_queue_id(d, id); + if (err) + return err; + + d->type_states[id].order_state = ORDERED; + return 1; + } + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_TYPE_TAG: + return btf_dump_order_type(d, t->type, through_ptr); + + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *p = btf_params(t); + bool is_strong; + + err = btf_dump_order_type(d, t->type, through_ptr); + if (err < 0) + return err; + is_strong = err > 0; + + vlen = btf_vlen(t); + for (i = 0; i < vlen; i++, p++) { + err = btf_dump_order_type(d, p->type, through_ptr); + if (err < 0) + return err; + if (err > 0) + is_strong = true; + } + return is_strong; + } + case BTF_KIND_FUNC: + case BTF_KIND_VAR: + case BTF_KIND_DATASEC: + case BTF_KIND_DECL_TAG: + d->type_states[id].order_state = ORDERED; + return 0; + + default: + return -EINVAL; + } +} + +static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id, + const struct btf_type *t); + +static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id, + const struct btf_type *t); +static void btf_dump_emit_struct_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, int lvl); + +static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id, + const struct btf_type *t); +static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, int lvl); + +static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id, + const struct btf_type *t); + +static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, int lvl); + +/* a local view into a shared stack */ +struct id_stack { + const __u32 *ids; + int cnt; +}; + +static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id, + const char *fname, int lvl); +static void btf_dump_emit_type_chain(struct btf_dump *d, + struct id_stack *decl_stack, + const char *fname, int lvl); + +static const char *btf_dump_type_name(struct btf_dump *d, __u32 id); +static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id); +static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map, + const char *orig_name); + +static bool btf_dump_is_blacklisted(struct btf_dump *d, __u32 id) +{ + const struct btf_type *t = btf__type_by_id(d->btf, id); + + /* __builtin_va_list is a compiler built-in, which causes compilation + * errors, when compiling w/ different compiler, then used to compile + * original code (e.g., GCC to compile kernel, Clang to use generated + * C header from BTF). As it is built-in, it should be already defined + * properly internally in compiler. + */ + if (t->name_off == 0) + return false; + return strcmp(btf_name_of(d, t->name_off), "__builtin_va_list") == 0; +} + +/* + * Emit C-syntax definitions of types from chains of BTF types. + * + * High-level handling of determining necessary forward declarations are handled + * by btf_dump_emit_type() itself, but all nitty-gritty details of emitting type + * declarations/definitions in C syntax are handled by a combo of + * btf_dump_emit_type_decl()/btf_dump_emit_type_chain() w/ delegation to + * corresponding btf_dump_emit_*_{def,fwd}() functions. + * + * We also keep track of "containing struct/union type ID" to determine when + * we reference it from inside and thus can avoid emitting unnecessary forward + * declaration. + * + * This algorithm is designed in such a way, that even if some error occurs + * (either technical, e.g., out of memory, or logical, i.e., malformed BTF + * that doesn't comply to C rules completely), algorithm will try to proceed + * and produce as much meaningful output as possible. + */ +static void btf_dump_emit_type(struct btf_dump *d, __u32 id, __u32 cont_id) +{ + struct btf_dump_type_aux_state *tstate = &d->type_states[id]; + bool top_level_def = cont_id == 0; + const struct btf_type *t; + __u16 kind; + + if (tstate->emit_state == EMITTED) + return; + + t = btf__type_by_id(d->btf, id); + kind = btf_kind(t); + + if (tstate->emit_state == EMITTING) { + if (tstate->fwd_emitted) + return; + + switch (kind) { + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + /* + * if we are referencing a struct/union that we are + * part of - then no need for fwd declaration + */ + if (id == cont_id) + return; + if (t->name_off == 0) { + pr_warn("anonymous struct/union loop, id:[%u]\n", + id); + return; + } + btf_dump_emit_struct_fwd(d, id, t); + btf_dump_printf(d, ";\n\n"); + tstate->fwd_emitted = 1; + break; + case BTF_KIND_TYPEDEF: + /* + * for typedef fwd_emitted means typedef definition + * was emitted, but it can be used only for "weak" + * references through pointer only, not for embedding + */ + if (!btf_dump_is_blacklisted(d, id)) { + btf_dump_emit_typedef_def(d, id, t, 0); + btf_dump_printf(d, ";\n\n"); + } + tstate->fwd_emitted = 1; + break; + default: + break; + } + + return; + } + + switch (kind) { + case BTF_KIND_INT: + /* Emit type alias definitions if necessary */ + btf_dump_emit_missing_aliases(d, id, t); + + tstate->emit_state = EMITTED; + break; + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + if (top_level_def) { + btf_dump_emit_enum_def(d, id, t, 0); + btf_dump_printf(d, ";\n\n"); + } + tstate->emit_state = EMITTED; + break; + case BTF_KIND_PTR: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_TYPE_TAG: + btf_dump_emit_type(d, t->type, cont_id); + break; + case BTF_KIND_ARRAY: + btf_dump_emit_type(d, btf_array(t)->type, cont_id); + break; + case BTF_KIND_FWD: + btf_dump_emit_fwd_def(d, id, t); + btf_dump_printf(d, ";\n\n"); + tstate->emit_state = EMITTED; + break; + case BTF_KIND_TYPEDEF: + tstate->emit_state = EMITTING; + btf_dump_emit_type(d, t->type, id); + /* + * typedef can server as both definition and forward + * declaration; at this stage someone depends on + * typedef as a forward declaration (refers to it + * through pointer), so unless we already did it, + * emit typedef as a forward declaration + */ + if (!tstate->fwd_emitted && !btf_dump_is_blacklisted(d, id)) { + btf_dump_emit_typedef_def(d, id, t, 0); + btf_dump_printf(d, ";\n\n"); + } + tstate->emit_state = EMITTED; + break; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + tstate->emit_state = EMITTING; + /* if it's a top-level struct/union definition or struct/union + * is anonymous, then in C we'll be emitting all fields and + * their types (as opposed to just `struct X`), so we need to + * make sure that all types, referenced from struct/union + * members have necessary forward-declarations, where + * applicable + */ + if (top_level_def || t->name_off == 0) { + const struct btf_member *m = btf_members(t); + __u16 vlen = btf_vlen(t); + int i, new_cont_id; + + new_cont_id = t->name_off == 0 ? cont_id : id; + for (i = 0; i < vlen; i++, m++) + btf_dump_emit_type(d, m->type, new_cont_id); + } else if (!tstate->fwd_emitted && id != cont_id) { + btf_dump_emit_struct_fwd(d, id, t); + btf_dump_printf(d, ";\n\n"); + tstate->fwd_emitted = 1; + } + + if (top_level_def) { + btf_dump_emit_struct_def(d, id, t, 0); + btf_dump_printf(d, ";\n\n"); + tstate->emit_state = EMITTED; + } else { + tstate->emit_state = NOT_EMITTED; + } + break; + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *p = btf_params(t); + __u16 n = btf_vlen(t); + int i; + + btf_dump_emit_type(d, t->type, cont_id); + for (i = 0; i < n; i++, p++) + btf_dump_emit_type(d, p->type, cont_id); + + break; + } + default: + break; + } +} + +static bool btf_is_struct_packed(const struct btf *btf, __u32 id, + const struct btf_type *t) +{ + const struct btf_member *m; + int max_align = 1, align, i, bit_sz; + __u16 vlen; + + m = btf_members(t); + vlen = btf_vlen(t); + /* all non-bitfield fields have to be naturally aligned */ + for (i = 0; i < vlen; i++, m++) { + align = btf__align_of(btf, m->type); + bit_sz = btf_member_bitfield_size(t, i); + if (align && bit_sz == 0 && m->offset % (8 * align) != 0) + return true; + max_align = max(align, max_align); + } + /* size of a non-packed struct has to be a multiple of its alignment */ + if (t->size % max_align != 0) + return true; + /* + * if original struct was marked as packed, but its layout is + * naturally aligned, we'll detect that it's not packed + */ + return false; +} + +static void btf_dump_emit_bit_padding(const struct btf_dump *d, + int cur_off, int next_off, int next_align, + bool in_bitfield, int lvl) +{ + const struct { + const char *name; + int bits; + } pads[] = { + {"long", d->ptr_sz * 8}, {"int", 32}, {"short", 16}, {"char", 8} + }; + int new_off, pad_bits, bits, i; + const char *pad_type; + + if (cur_off >= next_off) + return; /* no gap */ + + /* For filling out padding we want to take advantage of + * natural alignment rules to minimize unnecessary explicit + * padding. First, we find the largest type (among long, int, + * short, or char) that can be used to force naturally aligned + * boundary. Once determined, we'll use such type to fill in + * the remaining padding gap. In some cases we can rely on + * compiler filling some gaps, but sometimes we need to force + * alignment to close natural alignment with markers like + * `long: 0` (this is always the case for bitfields). Note + * that even if struct itself has, let's say 4-byte alignment + * (i.e., it only uses up to int-aligned types), using `long: + * X;` explicit padding doesn't actually change struct's + * overall alignment requirements, but compiler does take into + * account that type's (long, in this example) natural + * alignment requirements when adding implicit padding. We use + * this fact heavily and don't worry about ruining correct + * struct alignment requirement. + */ + for (i = 0; i < ARRAY_SIZE(pads); i++) { + pad_bits = pads[i].bits; + pad_type = pads[i].name; + + new_off = roundup(cur_off, pad_bits); + if (new_off <= next_off) + break; + } + + if (new_off > cur_off && new_off <= next_off) { + /* We need explicit `: 0` aligning mark if next + * field is right on alignment offset and its + * alignment requirement is less strict than 's + * alignment (so compiler won't naturally align to the + * offset we expect), or if subsequent `: X`, + * will actually completely fit in the remaining hole, + * making compiler basically ignore `: X` + * completely. + */ + if (in_bitfield || + (new_off == next_off && roundup(cur_off, next_align * 8) != new_off) || + (new_off != next_off && next_off - new_off <= new_off - cur_off)) + /* but for bitfields we'll emit explicit bit count */ + btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, + in_bitfield ? new_off - cur_off : 0); + cur_off = new_off; + } + + /* Now we know we start at naturally aligned offset for a chosen + * padding type (long, int, short, or char), and so the rest is just + * a straightforward filling of remaining padding gap with full + * `: sizeof();` markers, except for the last one, which + * might need smaller than sizeof() padding. + */ + while (cur_off != next_off) { + bits = min(next_off - cur_off, pad_bits); + if (bits == pad_bits) { + btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, pad_bits); + cur_off += bits; + continue; + } + /* For the remainder padding that doesn't cover entire + * pad_type bit length, we pick the smallest necessary type. + * This is pure aesthetics, we could have just used `long`, + * but having smallest necessary one communicates better the + * scale of the padding gap. + */ + for (i = ARRAY_SIZE(pads) - 1; i >= 0; i--) { + pad_type = pads[i].name; + pad_bits = pads[i].bits; + if (pad_bits < bits) + continue; + + btf_dump_printf(d, "\n%s%s: %d;", pfx(lvl), pad_type, bits); + cur_off += bits; + break; + } + } +} + +static void btf_dump_emit_struct_fwd(struct btf_dump *d, __u32 id, + const struct btf_type *t) +{ + btf_dump_printf(d, "%s%s%s", + btf_is_struct(t) ? "struct" : "union", + t->name_off ? " " : "", + btf_dump_type_name(d, id)); +} + +static void btf_dump_emit_struct_def(struct btf_dump *d, + __u32 id, + const struct btf_type *t, + int lvl) +{ + const struct btf_member *m = btf_members(t); + bool is_struct = btf_is_struct(t); + bool packed, prev_bitfield = false; + int align, i, off = 0; + __u16 vlen = btf_vlen(t); + + align = btf__align_of(d->btf, id); + packed = is_struct ? btf_is_struct_packed(d->btf, id, t) : 0; + + btf_dump_printf(d, "%s%s%s {", + is_struct ? "struct" : "union", + t->name_off ? " " : "", + btf_dump_type_name(d, id)); + + for (i = 0; i < vlen; i++, m++) { + const char *fname; + int m_off, m_sz, m_align; + bool in_bitfield; + + fname = btf_name_of(d, m->name_off); + m_sz = btf_member_bitfield_size(t, i); + m_off = btf_member_bit_offset(t, i); + m_align = packed ? 1 : btf__align_of(d->btf, m->type); + + in_bitfield = prev_bitfield && m_sz != 0; + + btf_dump_emit_bit_padding(d, off, m_off, m_align, in_bitfield, lvl + 1); + btf_dump_printf(d, "\n%s", pfx(lvl + 1)); + btf_dump_emit_type_decl(d, m->type, fname, lvl + 1); + + if (m_sz) { + btf_dump_printf(d, ": %d", m_sz); + off = m_off + m_sz; + prev_bitfield = true; + } else { + m_sz = max((__s64)0, btf__resolve_size(d->btf, m->type)); + off = m_off + m_sz * 8; + prev_bitfield = false; + } + + btf_dump_printf(d, ";"); + } + + /* pad at the end, if necessary */ + if (is_struct) + btf_dump_emit_bit_padding(d, off, t->size * 8, align, false, lvl + 1); + + /* + * Keep `struct empty {}` on a single line, + * only print newline when there are regular or padding fields. + */ + if (vlen || t->size) { + btf_dump_printf(d, "\n"); + btf_dump_printf(d, "%s}", pfx(lvl)); + } else { + btf_dump_printf(d, "}"); + } + if (packed) + btf_dump_printf(d, " __attribute__((packed))"); +} + +static const char *missing_base_types[][2] = { + /* + * GCC emits typedefs to its internal __PolyX_t types when compiling Arm + * SIMD intrinsics. Alias them to standard base types. + */ + { "__Poly8_t", "unsigned char" }, + { "__Poly16_t", "unsigned short" }, + { "__Poly64_t", "unsigned long long" }, + { "__Poly128_t", "unsigned __int128" }, +}; + +static void btf_dump_emit_missing_aliases(struct btf_dump *d, __u32 id, + const struct btf_type *t) +{ + const char *name = btf_dump_type_name(d, id); + int i; + + for (i = 0; i < ARRAY_SIZE(missing_base_types); i++) { + if (strcmp(name, missing_base_types[i][0]) == 0) { + btf_dump_printf(d, "typedef %s %s;\n\n", + missing_base_types[i][1], name); + break; + } + } +} + +static void btf_dump_emit_enum_fwd(struct btf_dump *d, __u32 id, + const struct btf_type *t) +{ + btf_dump_printf(d, "enum %s", btf_dump_type_name(d, id)); +} + +static void btf_dump_emit_enum32_val(struct btf_dump *d, + const struct btf_type *t, + int lvl, __u16 vlen) +{ + const struct btf_enum *v = btf_enum(t); + bool is_signed = btf_kflag(t); + const char *fmt_str; + const char *name; + size_t dup_cnt; + int i; + + for (i = 0; i < vlen; i++, v++) { + name = btf_name_of(d, v->name_off); + /* enumerators share namespace with typedef idents */ + dup_cnt = btf_dump_name_dups(d, d->ident_names, name); + if (dup_cnt > 1) { + fmt_str = is_signed ? "\n%s%s___%zd = %d," : "\n%s%s___%zd = %u,"; + btf_dump_printf(d, fmt_str, pfx(lvl + 1), name, dup_cnt, v->val); + } else { + fmt_str = is_signed ? "\n%s%s = %d," : "\n%s%s = %u,"; + btf_dump_printf(d, fmt_str, pfx(lvl + 1), name, v->val); + } + } +} + +static void btf_dump_emit_enum64_val(struct btf_dump *d, + const struct btf_type *t, + int lvl, __u16 vlen) +{ + const struct btf_enum64 *v = btf_enum64(t); + bool is_signed = btf_kflag(t); + const char *fmt_str; + const char *name; + size_t dup_cnt; + __u64 val; + int i; + + for (i = 0; i < vlen; i++, v++) { + name = btf_name_of(d, v->name_off); + dup_cnt = btf_dump_name_dups(d, d->ident_names, name); + val = btf_enum64_value(v); + if (dup_cnt > 1) { + fmt_str = is_signed ? "\n%s%s___%zd = %lldLL," + : "\n%s%s___%zd = %lluULL,"; + btf_dump_printf(d, fmt_str, + pfx(lvl + 1), name, dup_cnt, + (unsigned long long)val); + } else { + fmt_str = is_signed ? "\n%s%s = %lldLL," + : "\n%s%s = %lluULL,"; + btf_dump_printf(d, fmt_str, + pfx(lvl + 1), name, + (unsigned long long)val); + } + } +} +static void btf_dump_emit_enum_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, + int lvl) +{ + __u16 vlen = btf_vlen(t); + + btf_dump_printf(d, "enum%s%s", + t->name_off ? " " : "", + btf_dump_type_name(d, id)); + + if (!vlen) + return; + + btf_dump_printf(d, " {"); + if (btf_is_enum(t)) + btf_dump_emit_enum32_val(d, t, lvl, vlen); + else + btf_dump_emit_enum64_val(d, t, lvl, vlen); + btf_dump_printf(d, "\n%s}", pfx(lvl)); + + /* special case enums with special sizes */ + if (t->size == 1) { + /* one-byte enums can be forced with mode(byte) attribute */ + btf_dump_printf(d, " __attribute__((mode(byte)))"); + } else if (t->size == 8 && d->ptr_sz == 8) { + /* enum can be 8-byte sized if one of the enumerator values + * doesn't fit in 32-bit integer, or by adding mode(word) + * attribute (but probably only on 64-bit architectures); do + * our best here to try to satisfy the contract without adding + * unnecessary attributes + */ + bool needs_word_mode; + + if (btf_is_enum(t)) { + /* enum can't represent 64-bit values, so we need word mode */ + needs_word_mode = true; + } else { + /* enum64 needs mode(word) if none of its values has + * non-zero upper 32-bits (which means that all values + * fit in 32-bit integers and won't cause compiler to + * bump enum to be 64-bit naturally + */ + int i; + + needs_word_mode = true; + for (i = 0; i < vlen; i++) { + if (btf_enum64(t)[i].val_hi32 != 0) { + needs_word_mode = false; + break; + } + } + } + if (needs_word_mode) + btf_dump_printf(d, " __attribute__((mode(word)))"); + } + +} + +static void btf_dump_emit_fwd_def(struct btf_dump *d, __u32 id, + const struct btf_type *t) +{ + const char *name = btf_dump_type_name(d, id); + + if (btf_kflag(t)) + btf_dump_printf(d, "union %s", name); + else + btf_dump_printf(d, "struct %s", name); +} + +static void btf_dump_emit_typedef_def(struct btf_dump *d, __u32 id, + const struct btf_type *t, int lvl) +{ + const char *name = btf_dump_ident_name(d, id); + + /* + * Old GCC versions are emitting invalid typedef for __gnuc_va_list + * pointing to VOID. This generates warnings from btf_dump() and + * results in uncompilable header file, so we are fixing it up here + * with valid typedef into __builtin_va_list. + */ + if (t->type == 0 && strcmp(name, "__gnuc_va_list") == 0) { + btf_dump_printf(d, "typedef __builtin_va_list __gnuc_va_list"); + return; + } + + btf_dump_printf(d, "typedef "); + btf_dump_emit_type_decl(d, t->type, name, lvl); +} + +static int btf_dump_push_decl_stack_id(struct btf_dump *d, __u32 id) +{ + __u32 *new_stack; + size_t new_cap; + + if (d->decl_stack_cnt >= d->decl_stack_cap) { + new_cap = max(16, d->decl_stack_cap * 3 / 2); + new_stack = libbpf_reallocarray(d->decl_stack, new_cap, sizeof(new_stack[0])); + if (!new_stack) + return -ENOMEM; + d->decl_stack = new_stack; + d->decl_stack_cap = new_cap; + } + + d->decl_stack[d->decl_stack_cnt++] = id; + + return 0; +} + +/* + * Emit type declaration (e.g., field type declaration in a struct or argument + * declaration in function prototype) in correct C syntax. + * + * For most types it's trivial, but there are few quirky type declaration + * cases worth mentioning: + * - function prototypes (especially nesting of function prototypes); + * - arrays; + * - const/volatile/restrict for pointers vs other types. + * + * For a good discussion of *PARSING* C syntax (as a human), see + * Peter van der Linden's "Expert C Programming: Deep C Secrets", + * Ch.3 "Unscrambling Declarations in C". + * + * It won't help with BTF to C conversion much, though, as it's an opposite + * problem. So we came up with this algorithm in reverse to van der Linden's + * parsing algorithm. It goes from structured BTF representation of type + * declaration to a valid compilable C syntax. + * + * For instance, consider this C typedef: + * typedef const int * const * arr[10] arr_t; + * It will be represented in BTF with this chain of BTF types: + * [typedef] -> [array] -> [ptr] -> [const] -> [ptr] -> [const] -> [int] + * + * Notice how [const] modifier always goes before type it modifies in BTF type + * graph, but in C syntax, const/volatile/restrict modifiers are written to + * the right of pointers, but to the left of other types. There are also other + * quirks, like function pointers, arrays of them, functions returning other + * functions, etc. + * + * We handle that by pushing all the types to a stack, until we hit "terminal" + * type (int/enum/struct/union/fwd). Then depending on the kind of a type on + * top of a stack, modifiers are handled differently. Array/function pointers + * have also wildly different syntax and how nesting of them are done. See + * code for authoritative definition. + * + * To avoid allocating new stack for each independent chain of BTF types, we + * share one bigger stack, with each chain working only on its own local view + * of a stack frame. Some care is required to "pop" stack frames after + * processing type declaration chain. + */ +int btf_dump__emit_type_decl(struct btf_dump *d, __u32 id, + const struct btf_dump_emit_type_decl_opts *opts) +{ + const char *fname; + int lvl, err; + + if (!OPTS_VALID(opts, btf_dump_emit_type_decl_opts)) + return libbpf_err(-EINVAL); + + err = btf_dump_resize(d); + if (err) + return libbpf_err(err); + + fname = OPTS_GET(opts, field_name, ""); + lvl = OPTS_GET(opts, indent_level, 0); + d->strip_mods = OPTS_GET(opts, strip_mods, false); + btf_dump_emit_type_decl(d, id, fname, lvl); + d->strip_mods = false; + return 0; +} + +static void btf_dump_emit_type_decl(struct btf_dump *d, __u32 id, + const char *fname, int lvl) +{ + struct id_stack decl_stack; + const struct btf_type *t; + int err, stack_start; + + stack_start = d->decl_stack_cnt; + for (;;) { + t = btf__type_by_id(d->btf, id); + if (d->strip_mods && btf_is_mod(t)) + goto skip_mod; + + err = btf_dump_push_decl_stack_id(d, id); + if (err < 0) { + /* + * if we don't have enough memory for entire type decl + * chain, restore stack, emit warning, and try to + * proceed nevertheless + */ + pr_warn("not enough memory for decl stack:%d", err); + d->decl_stack_cnt = stack_start; + return; + } +skip_mod: + /* VOID */ + if (id == 0) + break; + + switch (btf_kind(t)) { + case BTF_KIND_PTR: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + case BTF_KIND_FUNC_PROTO: + case BTF_KIND_TYPE_TAG: + id = t->type; + break; + case BTF_KIND_ARRAY: + id = btf_array(t)->type; + break; + case BTF_KIND_INT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FWD: + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_TYPEDEF: + case BTF_KIND_FLOAT: + goto done; + default: + pr_warn("unexpected type in decl chain, kind:%u, id:[%u]\n", + btf_kind(t), id); + goto done; + } + } +done: + /* + * We might be inside a chain of declarations (e.g., array of function + * pointers returning anonymous (so inlined) structs, having another + * array field). Each of those needs its own "stack frame" to handle + * emitting of declarations. Those stack frames are non-overlapping + * portions of shared btf_dump->decl_stack. To make it a bit nicer to + * handle this set of nested stacks, we create a view corresponding to + * our own "stack frame" and work with it as an independent stack. + * We'll need to clean up after emit_type_chain() returns, though. + */ + decl_stack.ids = d->decl_stack + stack_start; + decl_stack.cnt = d->decl_stack_cnt - stack_start; + btf_dump_emit_type_chain(d, &decl_stack, fname, lvl); + /* + * emit_type_chain() guarantees that it will pop its entire decl_stack + * frame before returning. But it works with a read-only view into + * decl_stack, so it doesn't actually pop anything from the + * perspective of shared btf_dump->decl_stack, per se. We need to + * reset decl_stack state to how it was before us to avoid it growing + * all the time. + */ + d->decl_stack_cnt = stack_start; +} + +static void btf_dump_emit_mods(struct btf_dump *d, struct id_stack *decl_stack) +{ + const struct btf_type *t; + __u32 id; + + while (decl_stack->cnt) { + id = decl_stack->ids[decl_stack->cnt - 1]; + t = btf__type_by_id(d->btf, id); + + switch (btf_kind(t)) { + case BTF_KIND_VOLATILE: + btf_dump_printf(d, "volatile "); + break; + case BTF_KIND_CONST: + btf_dump_printf(d, "const "); + break; + case BTF_KIND_RESTRICT: + btf_dump_printf(d, "restrict "); + break; + default: + return; + } + decl_stack->cnt--; + } +} + +static void btf_dump_drop_mods(struct btf_dump *d, struct id_stack *decl_stack) +{ + const struct btf_type *t; + __u32 id; + + while (decl_stack->cnt) { + id = decl_stack->ids[decl_stack->cnt - 1]; + t = btf__type_by_id(d->btf, id); + if (!btf_is_mod(t)) + return; + decl_stack->cnt--; + } +} + +static void btf_dump_emit_name(const struct btf_dump *d, + const char *name, bool last_was_ptr) +{ + bool separate = name[0] && !last_was_ptr; + + btf_dump_printf(d, "%s%s", separate ? " " : "", name); +} + +static void btf_dump_emit_type_chain(struct btf_dump *d, + struct id_stack *decls, + const char *fname, int lvl) +{ + /* + * last_was_ptr is used to determine if we need to separate pointer + * asterisk (*) from previous part of type signature with space, so + * that we get `int ***`, instead of `int * * *`. We default to true + * for cases where we have single pointer in a chain. E.g., in ptr -> + * func_proto case. func_proto will start a new emit_type_chain call + * with just ptr, which should be emitted as (*) or (*), so we + * don't want to prepend space for that last pointer. + */ + bool last_was_ptr = true; + const struct btf_type *t; + const char *name; + __u16 kind; + __u32 id; + + while (decls->cnt) { + id = decls->ids[--decls->cnt]; + if (id == 0) { + /* VOID is a special snowflake */ + btf_dump_emit_mods(d, decls); + btf_dump_printf(d, "void"); + last_was_ptr = false; + continue; + } + + t = btf__type_by_id(d->btf, id); + kind = btf_kind(t); + + switch (kind) { + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + btf_dump_emit_mods(d, decls); + name = btf_name_of(d, t->name_off); + btf_dump_printf(d, "%s", name); + break; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + btf_dump_emit_mods(d, decls); + /* inline anonymous struct/union */ + if (t->name_off == 0 && !d->skip_anon_defs) + btf_dump_emit_struct_def(d, id, t, lvl); + else + btf_dump_emit_struct_fwd(d, id, t); + break; + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + btf_dump_emit_mods(d, decls); + /* inline anonymous enum */ + if (t->name_off == 0 && !d->skip_anon_defs) + btf_dump_emit_enum_def(d, id, t, lvl); + else + btf_dump_emit_enum_fwd(d, id, t); + break; + case BTF_KIND_FWD: + btf_dump_emit_mods(d, decls); + btf_dump_emit_fwd_def(d, id, t); + break; + case BTF_KIND_TYPEDEF: + btf_dump_emit_mods(d, decls); + btf_dump_printf(d, "%s", btf_dump_ident_name(d, id)); + break; + case BTF_KIND_PTR: + btf_dump_printf(d, "%s", last_was_ptr ? "*" : " *"); + break; + case BTF_KIND_VOLATILE: + btf_dump_printf(d, " volatile"); + break; + case BTF_KIND_CONST: + btf_dump_printf(d, " const"); + break; + case BTF_KIND_RESTRICT: + btf_dump_printf(d, " restrict"); + break; + case BTF_KIND_TYPE_TAG: + btf_dump_emit_mods(d, decls); + name = btf_name_of(d, t->name_off); + btf_dump_printf(d, " __attribute__((btf_type_tag(\"%s\")))", name); + break; + case BTF_KIND_ARRAY: { + const struct btf_array *a = btf_array(t); + const struct btf_type *next_t; + __u32 next_id; + bool multidim; + /* + * GCC has a bug + * (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=8354) + * which causes it to emit extra const/volatile + * modifiers for an array, if array's element type has + * const/volatile modifiers. Clang doesn't do that. + * In general, it doesn't seem very meaningful to have + * a const/volatile modifier for array, so we are + * going to silently skip them here. + */ + btf_dump_drop_mods(d, decls); + + if (decls->cnt == 0) { + btf_dump_emit_name(d, fname, last_was_ptr); + btf_dump_printf(d, "[%u]", a->nelems); + return; + } + + next_id = decls->ids[decls->cnt - 1]; + next_t = btf__type_by_id(d->btf, next_id); + multidim = btf_is_array(next_t); + /* we need space if we have named non-pointer */ + if (fname[0] && !last_was_ptr) + btf_dump_printf(d, " "); + /* no parentheses for multi-dimensional array */ + if (!multidim) + btf_dump_printf(d, "("); + btf_dump_emit_type_chain(d, decls, fname, lvl); + if (!multidim) + btf_dump_printf(d, ")"); + btf_dump_printf(d, "[%u]", a->nelems); + return; + } + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *p = btf_params(t); + __u16 vlen = btf_vlen(t); + int i; + + /* + * GCC emits extra volatile qualifier for + * __attribute__((noreturn)) function pointers. Clang + * doesn't do it. It's a GCC quirk for backwards + * compatibility with code written for GCC <2.5. So, + * similarly to extra qualifiers for array, just drop + * them, instead of handling them. + */ + btf_dump_drop_mods(d, decls); + if (decls->cnt) { + btf_dump_printf(d, " ("); + btf_dump_emit_type_chain(d, decls, fname, lvl); + btf_dump_printf(d, ")"); + } else { + btf_dump_emit_name(d, fname, last_was_ptr); + } + btf_dump_printf(d, "("); + /* + * Clang for BPF target generates func_proto with no + * args as a func_proto with a single void arg (e.g., + * `int (*f)(void)` vs just `int (*f)()`). We are + * going to pretend there are no args for such case. + */ + if (vlen == 1 && p->type == 0) { + btf_dump_printf(d, ")"); + return; + } + + for (i = 0; i < vlen; i++, p++) { + if (i > 0) + btf_dump_printf(d, ", "); + + /* last arg of type void is vararg */ + if (i == vlen - 1 && p->type == 0) { + btf_dump_printf(d, "..."); + break; + } + + name = btf_name_of(d, p->name_off); + btf_dump_emit_type_decl(d, p->type, name, lvl); + } + + btf_dump_printf(d, ")"); + return; + } + default: + pr_warn("unexpected type in decl chain, kind:%u, id:[%u]\n", + kind, id); + return; + } + + last_was_ptr = kind == BTF_KIND_PTR; + } + + btf_dump_emit_name(d, fname, last_was_ptr); +} + +/* show type name as (type_name) */ +static void btf_dump_emit_type_cast(struct btf_dump *d, __u32 id, + bool top_level) +{ + const struct btf_type *t; + + /* for array members, we don't bother emitting type name for each + * member to avoid the redundancy of + * .name = (char[4])[(char)'f',(char)'o',(char)'o',] + */ + if (d->typed_dump->is_array_member) + return; + + /* avoid type name specification for variable/section; it will be done + * for the associated variable value(s). + */ + t = btf__type_by_id(d->btf, id); + if (btf_is_var(t) || btf_is_datasec(t)) + return; + + if (top_level) + btf_dump_printf(d, "("); + + d->skip_anon_defs = true; + d->strip_mods = true; + btf_dump_emit_type_decl(d, id, "", 0); + d->strip_mods = false; + d->skip_anon_defs = false; + + if (top_level) + btf_dump_printf(d, ")"); +} + +/* return number of duplicates (occurrences) of a given name */ +static size_t btf_dump_name_dups(struct btf_dump *d, struct hashmap *name_map, + const char *orig_name) +{ + char *old_name, *new_name; + size_t dup_cnt = 0; + int err; + + new_name = strdup(orig_name); + if (!new_name) + return 1; + + (void)hashmap__find(name_map, orig_name, &dup_cnt); + dup_cnt++; + + err = hashmap__set(name_map, new_name, dup_cnt, &old_name, NULL); + if (err) + free(new_name); + + free(old_name); + + return dup_cnt; +} + +static const char *btf_dump_resolve_name(struct btf_dump *d, __u32 id, + struct hashmap *name_map) +{ + struct btf_dump_type_aux_state *s = &d->type_states[id]; + const struct btf_type *t = btf__type_by_id(d->btf, id); + const char *orig_name = btf_name_of(d, t->name_off); + const char **cached_name = &d->cached_names[id]; + size_t dup_cnt; + + if (t->name_off == 0) + return ""; + + if (s->name_resolved) + return *cached_name ? *cached_name : orig_name; + + if (btf_is_fwd(t) || (btf_is_enum(t) && btf_vlen(t) == 0)) { + s->name_resolved = 1; + return orig_name; + } + + dup_cnt = btf_dump_name_dups(d, name_map, orig_name); + if (dup_cnt > 1) { + const size_t max_len = 256; + char new_name[max_len]; + + snprintf(new_name, max_len, "%s___%zu", orig_name, dup_cnt); + *cached_name = strdup(new_name); + } + + s->name_resolved = 1; + return *cached_name ? *cached_name : orig_name; +} + +static const char *btf_dump_type_name(struct btf_dump *d, __u32 id) +{ + return btf_dump_resolve_name(d, id, d->type_names); +} + +static const char *btf_dump_ident_name(struct btf_dump *d, __u32 id) +{ + return btf_dump_resolve_name(d, id, d->ident_names); +} + +static int btf_dump_dump_type_data(struct btf_dump *d, + const char *fname, + const struct btf_type *t, + __u32 id, + const void *data, + __u8 bits_offset, + __u8 bit_sz); + +static const char *btf_dump_data_newline(struct btf_dump *d) +{ + return d->typed_dump->compact || d->typed_dump->depth == 0 ? "" : "\n"; +} + +static const char *btf_dump_data_delim(struct btf_dump *d) +{ + return d->typed_dump->depth == 0 ? "" : ","; +} + +static void btf_dump_data_pfx(struct btf_dump *d) +{ + int i, lvl = d->typed_dump->indent_lvl + d->typed_dump->depth; + + if (d->typed_dump->compact) + return; + + for (i = 0; i < lvl; i++) + btf_dump_printf(d, "%s", d->typed_dump->indent_str); +} + +/* A macro is used here as btf_type_value[s]() appends format specifiers + * to the format specifier passed in; these do the work of appending + * delimiters etc while the caller simply has to specify the type values + * in the format specifier + value(s). + */ +#define btf_dump_type_values(d, fmt, ...) \ + btf_dump_printf(d, fmt "%s%s", \ + ##__VA_ARGS__, \ + btf_dump_data_delim(d), \ + btf_dump_data_newline(d)) + +static int btf_dump_unsupported_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id) +{ + btf_dump_printf(d, "", btf_kind(t)); + return -ENOTSUP; +} + +static int btf_dump_get_bitfield_value(struct btf_dump *d, + const struct btf_type *t, + const void *data, + __u8 bits_offset, + __u8 bit_sz, + __u64 *value) +{ + __u16 left_shift_bits, right_shift_bits; + const __u8 *bytes = data; + __u8 nr_copy_bits; + __u64 num = 0; + int i; + + /* Maximum supported bitfield size is 64 bits */ + if (t->size > 8) { + pr_warn("unexpected bitfield size %d\n", t->size); + return -EINVAL; + } + + /* Bitfield value retrieval is done in two steps; first relevant bytes are + * stored in num, then we left/right shift num to eliminate irrelevant bits. + */ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + for (i = t->size - 1; i >= 0; i--) + num = num * 256 + bytes[i]; + nr_copy_bits = bit_sz + bits_offset; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + for (i = 0; i < t->size; i++) + num = num * 256 + bytes[i]; + nr_copy_bits = t->size * 8 - bits_offset; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif + left_shift_bits = 64 - nr_copy_bits; + right_shift_bits = 64 - bit_sz; + + *value = (num << left_shift_bits) >> right_shift_bits; + + return 0; +} + +static int btf_dump_bitfield_check_zero(struct btf_dump *d, + const struct btf_type *t, + const void *data, + __u8 bits_offset, + __u8 bit_sz) +{ + __u64 check_num; + int err; + + err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, &check_num); + if (err) + return err; + if (check_num == 0) + return -ENODATA; + return 0; +} + +static int btf_dump_bitfield_data(struct btf_dump *d, + const struct btf_type *t, + const void *data, + __u8 bits_offset, + __u8 bit_sz) +{ + __u64 print_num; + int err; + + err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, &print_num); + if (err) + return err; + + btf_dump_type_values(d, "0x%llx", (unsigned long long)print_num); + + return 0; +} + +/* ints, floats and ptrs */ +static int btf_dump_base_type_check_zero(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + static __u8 bytecmp[16] = {}; + int nr_bytes; + + /* For pointer types, pointer size is not defined on a per-type basis. + * On dump creation however, we store the pointer size. + */ + if (btf_kind(t) == BTF_KIND_PTR) + nr_bytes = d->ptr_sz; + else + nr_bytes = t->size; + + if (nr_bytes < 1 || nr_bytes > 16) { + pr_warn("unexpected size %d for id [%u]\n", nr_bytes, id); + return -EINVAL; + } + + if (memcmp(data, bytecmp, nr_bytes) == 0) + return -ENODATA; + return 0; +} + +static bool ptr_is_aligned(const struct btf *btf, __u32 type_id, + const void *data) +{ + int alignment = btf__align_of(btf, type_id); + + if (alignment == 0) + return false; + + return ((uintptr_t)data) % alignment == 0; +} + +static int btf_dump_int_data(struct btf_dump *d, + const struct btf_type *t, + __u32 type_id, + const void *data, + __u8 bits_offset) +{ + __u8 encoding = btf_int_encoding(t); + bool sign = encoding & BTF_INT_SIGNED; + char buf[16] __attribute__((aligned(16))); + int sz = t->size; + + if (sz == 0 || sz > sizeof(buf)) { + pr_warn("unexpected size %d for id [%u]\n", sz, type_id); + return -EINVAL; + } + + /* handle packed int data - accesses of integers not aligned on + * int boundaries can cause problems on some platforms. + */ + if (!ptr_is_aligned(d->btf, type_id, data)) { + memcpy(buf, data, sz); + data = buf; + } + + switch (sz) { + case 16: { + const __u64 *ints = data; + __u64 lsi, msi; + + /* avoid use of __int128 as some 32-bit platforms do not + * support it. + */ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + lsi = ints[0]; + msi = ints[1]; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + lsi = ints[1]; + msi = ints[0]; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif + if (msi == 0) + btf_dump_type_values(d, "0x%llx", (unsigned long long)lsi); + else + btf_dump_type_values(d, "0x%llx%016llx", (unsigned long long)msi, + (unsigned long long)lsi); + break; + } + case 8: + if (sign) + btf_dump_type_values(d, "%lld", *(long long *)data); + else + btf_dump_type_values(d, "%llu", *(unsigned long long *)data); + break; + case 4: + if (sign) + btf_dump_type_values(d, "%d", *(__s32 *)data); + else + btf_dump_type_values(d, "%u", *(__u32 *)data); + break; + case 2: + if (sign) + btf_dump_type_values(d, "%d", *(__s16 *)data); + else + btf_dump_type_values(d, "%u", *(__u16 *)data); + break; + case 1: + if (d->typed_dump->is_array_char) { + /* check for null terminator */ + if (d->typed_dump->is_array_terminated) + break; + if (*(char *)data == '\0') { + d->typed_dump->is_array_terminated = true; + break; + } + if (isprint(*(char *)data)) { + btf_dump_type_values(d, "'%c'", *(char *)data); + break; + } + } + if (sign) + btf_dump_type_values(d, "%d", *(__s8 *)data); + else + btf_dump_type_values(d, "%u", *(__u8 *)data); + break; + default: + pr_warn("unexpected sz %d for id [%u]\n", sz, type_id); + return -EINVAL; + } + return 0; +} + +union float_data { + long double ld; + double d; + float f; +}; + +static int btf_dump_float_data(struct btf_dump *d, + const struct btf_type *t, + __u32 type_id, + const void *data) +{ + const union float_data *flp = data; + union float_data fl; + int sz = t->size; + + /* handle unaligned data; copy to local union */ + if (!ptr_is_aligned(d->btf, type_id, data)) { + memcpy(&fl, data, sz); + flp = &fl; + } + + switch (sz) { + case 16: + btf_dump_type_values(d, "%Lf", flp->ld); + break; + case 8: + btf_dump_type_values(d, "%lf", flp->d); + break; + case 4: + btf_dump_type_values(d, "%f", flp->f); + break; + default: + pr_warn("unexpected size %d for id [%u]\n", sz, type_id); + return -EINVAL; + } + return 0; +} + +static int btf_dump_var_data(struct btf_dump *d, + const struct btf_type *v, + __u32 id, + const void *data) +{ + enum btf_func_linkage linkage = btf_var(v)->linkage; + const struct btf_type *t; + const char *l; + __u32 type_id; + + switch (linkage) { + case BTF_FUNC_STATIC: + l = "static "; + break; + case BTF_FUNC_EXTERN: + l = "extern "; + break; + case BTF_FUNC_GLOBAL: + default: + l = ""; + break; + } + + /* format of output here is [linkage] [type] [varname] = (type)value, + * for example "static int cpu_profile_flip = (int)1" + */ + btf_dump_printf(d, "%s", l); + type_id = v->type; + t = btf__type_by_id(d->btf, type_id); + btf_dump_emit_type_cast(d, type_id, false); + btf_dump_printf(d, " %s = ", btf_name_of(d, v->name_off)); + return btf_dump_dump_type_data(d, NULL, t, type_id, data, 0, 0); +} + +static int btf_dump_array_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + const struct btf_array *array = btf_array(t); + const struct btf_type *elem_type; + __u32 i, elem_type_id; + __s64 elem_size; + bool is_array_member; + + elem_type_id = array->type; + elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL); + elem_size = btf__resolve_size(d->btf, elem_type_id); + if (elem_size <= 0) { + pr_warn("unexpected elem size %zd for array type [%u]\n", + (ssize_t)elem_size, id); + return -EINVAL; + } + + if (btf_is_int(elem_type)) { + /* + * BTF_INT_CHAR encoding never seems to be set for + * char arrays, so if size is 1 and element is + * printable as a char, we'll do that. + */ + if (elem_size == 1) + d->typed_dump->is_array_char = true; + } + + /* note that we increment depth before calling btf_dump_print() below; + * this is intentional. btf_dump_data_newline() will not print a + * newline for depth 0 (since this leaves us with trailing newlines + * at the end of typed display), so depth is incremented first. + * For similar reasons, we decrement depth before showing the closing + * parenthesis. + */ + d->typed_dump->depth++; + btf_dump_printf(d, "[%s", btf_dump_data_newline(d)); + + /* may be a multidimensional array, so store current "is array member" + * status so we can restore it correctly later. + */ + is_array_member = d->typed_dump->is_array_member; + d->typed_dump->is_array_member = true; + for (i = 0; i < array->nelems; i++, data += elem_size) { + if (d->typed_dump->is_array_terminated) + break; + btf_dump_dump_type_data(d, NULL, elem_type, elem_type_id, data, 0, 0); + } + d->typed_dump->is_array_member = is_array_member; + d->typed_dump->depth--; + btf_dump_data_pfx(d); + btf_dump_type_values(d, "]"); + + return 0; +} + +static int btf_dump_struct_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + const struct btf_member *m = btf_members(t); + __u16 n = btf_vlen(t); + int i, err = 0; + + /* note that we increment depth before calling btf_dump_print() below; + * this is intentional. btf_dump_data_newline() will not print a + * newline for depth 0 (since this leaves us with trailing newlines + * at the end of typed display), so depth is incremented first. + * For similar reasons, we decrement depth before showing the closing + * parenthesis. + */ + d->typed_dump->depth++; + btf_dump_printf(d, "{%s", btf_dump_data_newline(d)); + + for (i = 0; i < n; i++, m++) { + const struct btf_type *mtype; + const char *mname; + __u32 moffset; + __u8 bit_sz; + + mtype = btf__type_by_id(d->btf, m->type); + mname = btf_name_of(d, m->name_off); + moffset = btf_member_bit_offset(t, i); + + bit_sz = btf_member_bitfield_size(t, i); + err = btf_dump_dump_type_data(d, mname, mtype, m->type, data + moffset / 8, + moffset % 8, bit_sz); + if (err < 0) + return err; + } + d->typed_dump->depth--; + btf_dump_data_pfx(d); + btf_dump_type_values(d, "}"); + return err; +} + +union ptr_data { + unsigned int p; + unsigned long long lp; +}; + +static int btf_dump_ptr_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + if (ptr_is_aligned(d->btf, id, data) && d->ptr_sz == sizeof(void *)) { + btf_dump_type_values(d, "%p", *(void **)data); + } else { + union ptr_data pt; + + memcpy(&pt, data, d->ptr_sz); + if (d->ptr_sz == 4) + btf_dump_type_values(d, "0x%x", pt.p); + else + btf_dump_type_values(d, "0x%llx", pt.lp); + } + return 0; +} + +static int btf_dump_get_enum_value(struct btf_dump *d, + const struct btf_type *t, + const void *data, + __u32 id, + __s64 *value) +{ + bool is_signed = btf_kflag(t); + + if (!ptr_is_aligned(d->btf, id, data)) { + __u64 val; + int err; + + err = btf_dump_get_bitfield_value(d, t, data, 0, 0, &val); + if (err) + return err; + *value = (__s64)val; + return 0; + } + + switch (t->size) { + case 8: + *value = *(__s64 *)data; + return 0; + case 4: + *value = is_signed ? (__s64)*(__s32 *)data : *(__u32 *)data; + return 0; + case 2: + *value = is_signed ? *(__s16 *)data : *(__u16 *)data; + return 0; + case 1: + *value = is_signed ? *(__s8 *)data : *(__u8 *)data; + return 0; + default: + pr_warn("unexpected size %d for enum, id:[%u]\n", t->size, id); + return -EINVAL; + } +} + +static int btf_dump_enum_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + bool is_signed; + __s64 value; + int i, err; + + err = btf_dump_get_enum_value(d, t, data, id, &value); + if (err) + return err; + + is_signed = btf_kflag(t); + if (btf_is_enum(t)) { + const struct btf_enum *e; + + for (i = 0, e = btf_enum(t); i < btf_vlen(t); i++, e++) { + if (value != e->val) + continue; + btf_dump_type_values(d, "%s", btf_name_of(d, e->name_off)); + return 0; + } + + btf_dump_type_values(d, is_signed ? "%d" : "%u", value); + } else { + const struct btf_enum64 *e; + + for (i = 0, e = btf_enum64(t); i < btf_vlen(t); i++, e++) { + if (value != btf_enum64_value(e)) + continue; + btf_dump_type_values(d, "%s", btf_name_of(d, e->name_off)); + return 0; + } + + btf_dump_type_values(d, is_signed ? "%lldLL" : "%lluULL", + (unsigned long long)value); + } + return 0; +} + +static int btf_dump_datasec_data(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data) +{ + const struct btf_var_secinfo *vsi; + const struct btf_type *var; + __u32 i; + int err; + + btf_dump_type_values(d, "SEC(\"%s\") ", btf_name_of(d, t->name_off)); + + for (i = 0, vsi = btf_var_secinfos(t); i < btf_vlen(t); i++, vsi++) { + var = btf__type_by_id(d->btf, vsi->type); + err = btf_dump_dump_type_data(d, NULL, var, vsi->type, data + vsi->offset, 0, 0); + if (err < 0) + return err; + btf_dump_printf(d, ";"); + } + return 0; +} + +/* return size of type, or if base type overflows, return -E2BIG. */ +static int btf_dump_type_data_check_overflow(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data, + __u8 bits_offset) +{ + __s64 size = btf__resolve_size(d->btf, id); + + if (size < 0 || size >= INT_MAX) { + pr_warn("unexpected size [%zu] for id [%u]\n", + (size_t)size, id); + return -EINVAL; + } + + /* Only do overflow checking for base types; we do not want to + * avoid showing part of a struct, union or array, even if we + * do not have enough data to show the full object. By + * restricting overflow checking to base types we can ensure + * that partial display succeeds, while avoiding overflowing + * and using bogus data for display. + */ + t = skip_mods_and_typedefs(d->btf, id, NULL); + if (!t) { + pr_warn("unexpected error skipping mods/typedefs for id [%u]\n", + id); + return -EINVAL; + } + + switch (btf_kind(t)) { + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + case BTF_KIND_PTR: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + if (data + bits_offset / 8 + size > d->typed_dump->data_end) + return -E2BIG; + break; + default: + break; + } + return (int)size; +} + +static int btf_dump_type_data_check_zero(struct btf_dump *d, + const struct btf_type *t, + __u32 id, + const void *data, + __u8 bits_offset, + __u8 bit_sz) +{ + __s64 value; + int i, err; + + /* toplevel exceptions; we show zero values if + * - we ask for them (emit_zeros) + * - if we are at top-level so we see "struct empty { }" + * - or if we are an array member and the array is non-empty and + * not a char array; we don't want to be in a situation where we + * have an integer array 0, 1, 0, 1 and only show non-zero values. + * If the array contains zeroes only, or is a char array starting + * with a '\0', the array-level check_zero() will prevent showing it; + * we are concerned with determining zero value at the array member + * level here. + */ + if (d->typed_dump->emit_zeroes || d->typed_dump->depth == 0 || + (d->typed_dump->is_array_member && + !d->typed_dump->is_array_char)) + return 0; + + t = skip_mods_and_typedefs(d->btf, id, NULL); + + switch (btf_kind(t)) { + case BTF_KIND_INT: + if (bit_sz) + return btf_dump_bitfield_check_zero(d, t, data, bits_offset, bit_sz); + return btf_dump_base_type_check_zero(d, t, id, data); + case BTF_KIND_FLOAT: + case BTF_KIND_PTR: + return btf_dump_base_type_check_zero(d, t, id, data); + case BTF_KIND_ARRAY: { + const struct btf_array *array = btf_array(t); + const struct btf_type *elem_type; + __u32 elem_type_id, elem_size; + bool ischar; + + elem_type_id = array->type; + elem_size = btf__resolve_size(d->btf, elem_type_id); + elem_type = skip_mods_and_typedefs(d->btf, elem_type_id, NULL); + + ischar = btf_is_int(elem_type) && elem_size == 1; + + /* check all elements; if _any_ element is nonzero, all + * of array is displayed. We make an exception however + * for char arrays where the first element is 0; these + * are considered zeroed also, even if later elements are + * non-zero because the string is terminated. + */ + for (i = 0; i < array->nelems; i++) { + if (i == 0 && ischar && *(char *)data == 0) + return -ENODATA; + err = btf_dump_type_data_check_zero(d, elem_type, + elem_type_id, + data + + (i * elem_size), + bits_offset, 0); + if (err != -ENODATA) + return err; + } + return -ENODATA; + } + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m = btf_members(t); + __u16 n = btf_vlen(t); + + /* if any struct/union member is non-zero, the struct/union + * is considered non-zero and dumped. + */ + for (i = 0; i < n; i++, m++) { + const struct btf_type *mtype; + __u32 moffset; + + mtype = btf__type_by_id(d->btf, m->type); + moffset = btf_member_bit_offset(t, i); + + /* btf_int_bits() does not store member bitfield size; + * bitfield size needs to be stored here so int display + * of member can retrieve it. + */ + bit_sz = btf_member_bitfield_size(t, i); + err = btf_dump_type_data_check_zero(d, mtype, m->type, data + moffset / 8, + moffset % 8, bit_sz); + if (err != ENODATA) + return err; + } + return -ENODATA; + } + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + err = btf_dump_get_enum_value(d, t, data, id, &value); + if (err) + return err; + if (value == 0) + return -ENODATA; + return 0; + default: + return 0; + } +} + +/* returns size of data dumped, or error. */ +static int btf_dump_dump_type_data(struct btf_dump *d, + const char *fname, + const struct btf_type *t, + __u32 id, + const void *data, + __u8 bits_offset, + __u8 bit_sz) +{ + int size, err = 0; + + size = btf_dump_type_data_check_overflow(d, t, id, data, bits_offset); + if (size < 0) + return size; + err = btf_dump_type_data_check_zero(d, t, id, data, bits_offset, bit_sz); + if (err) { + /* zeroed data is expected and not an error, so simply skip + * dumping such data. Record other errors however. + */ + if (err == -ENODATA) + return size; + return err; + } + btf_dump_data_pfx(d); + + if (!d->typed_dump->skip_names) { + if (fname && strlen(fname) > 0) + btf_dump_printf(d, ".%s = ", fname); + btf_dump_emit_type_cast(d, id, true); + } + + t = skip_mods_and_typedefs(d->btf, id, NULL); + + switch (btf_kind(t)) { + case BTF_KIND_UNKN: + case BTF_KIND_FWD: + case BTF_KIND_FUNC: + case BTF_KIND_FUNC_PROTO: + case BTF_KIND_DECL_TAG: + err = btf_dump_unsupported_data(d, t, id); + break; + case BTF_KIND_INT: + if (bit_sz) + err = btf_dump_bitfield_data(d, t, data, bits_offset, bit_sz); + else + err = btf_dump_int_data(d, t, id, data, bits_offset); + break; + case BTF_KIND_FLOAT: + err = btf_dump_float_data(d, t, id, data); + break; + case BTF_KIND_PTR: + err = btf_dump_ptr_data(d, t, id, data); + break; + case BTF_KIND_ARRAY: + err = btf_dump_array_data(d, t, id, data); + break; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + err = btf_dump_struct_data(d, t, id, data); + break; + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + /* handle bitfield and int enum values */ + if (bit_sz) { + __u64 print_num; + __s64 enum_val; + + err = btf_dump_get_bitfield_value(d, t, data, bits_offset, bit_sz, + &print_num); + if (err) + break; + enum_val = (__s64)print_num; + err = btf_dump_enum_data(d, t, id, &enum_val); + } else + err = btf_dump_enum_data(d, t, id, data); + break; + case BTF_KIND_VAR: + err = btf_dump_var_data(d, t, id, data); + break; + case BTF_KIND_DATASEC: + err = btf_dump_datasec_data(d, t, id, data); + break; + default: + pr_warn("unexpected kind [%u] for id [%u]\n", + BTF_INFO_KIND(t->info), id); + return -EINVAL; + } + if (err < 0) + return err; + return size; +} + +int btf_dump__dump_type_data(struct btf_dump *d, __u32 id, + const void *data, size_t data_sz, + const struct btf_dump_type_data_opts *opts) +{ + struct btf_dump_data typed_dump = {}; + const struct btf_type *t; + int ret; + + if (!OPTS_VALID(opts, btf_dump_type_data_opts)) + return libbpf_err(-EINVAL); + + t = btf__type_by_id(d->btf, id); + if (!t) + return libbpf_err(-ENOENT); + + d->typed_dump = &typed_dump; + d->typed_dump->data_end = data + data_sz; + d->typed_dump->indent_lvl = OPTS_GET(opts, indent_level, 0); + + /* default indent string is a tab */ + if (!OPTS_GET(opts, indent_str, NULL)) + d->typed_dump->indent_str[0] = '\t'; + else + libbpf_strlcpy(d->typed_dump->indent_str, opts->indent_str, + sizeof(d->typed_dump->indent_str)); + + d->typed_dump->compact = OPTS_GET(opts, compact, false); + d->typed_dump->skip_names = OPTS_GET(opts, skip_names, false); + d->typed_dump->emit_zeroes = OPTS_GET(opts, emit_zeroes, false); + + ret = btf_dump_dump_type_data(d, NULL, t, id, data, 0, 0); + + d->typed_dump = NULL; + + return libbpf_err(ret); +} diff --git a/libbpf/src/gen_loader.c b/libbpf/src/gen_loader.c new file mode 100644 index 0000000..83e8e3b --- /dev/null +++ b/libbpf/src/gen_loader.c @@ -0,0 +1,1123 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2021 Facebook */ +#include +#include +#include +#include +#include +#include +#include "btf.h" +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" +#include "hashmap.h" +#include "bpf_gen_internal.h" +#include "skel_internal.h" +#include + +#define MAX_USED_MAPS 64 +#define MAX_USED_PROGS 32 +#define MAX_KFUNC_DESCS 256 +#define MAX_FD_ARRAY_SZ (MAX_USED_MAPS + MAX_KFUNC_DESCS) + +/* The following structure describes the stack layout of the loader program. + * In addition R6 contains the pointer to context. + * R7 contains the result of the last sys_bpf command (typically error or FD). + * R9 contains the result of the last sys_close command. + * + * Naming convention: + * ctx - bpf program context + * stack - bpf program stack + * blob - bpf_attr-s, strings, insns, map data. + * All the bytes that loader prog will use for read/write. + */ +struct loader_stack { + __u32 btf_fd; + __u32 inner_map_fd; + __u32 prog_fd[MAX_USED_PROGS]; +}; + +#define stack_off(field) \ + (__s16)(-sizeof(struct loader_stack) + offsetof(struct loader_stack, field)) + +#define attr_field(attr, field) (attr + offsetof(union bpf_attr, field)) + +static int blob_fd_array_off(struct bpf_gen *gen, int index) +{ + return gen->fd_array + index * sizeof(int); +} + +static int realloc_insn_buf(struct bpf_gen *gen, __u32 size) +{ + size_t off = gen->insn_cur - gen->insn_start; + void *insn_start; + + if (gen->error) + return gen->error; + if (size > INT32_MAX || off + size > INT32_MAX) { + gen->error = -ERANGE; + return -ERANGE; + } + insn_start = realloc(gen->insn_start, off + size); + if (!insn_start) { + gen->error = -ENOMEM; + free(gen->insn_start); + gen->insn_start = NULL; + return -ENOMEM; + } + gen->insn_start = insn_start; + gen->insn_cur = insn_start + off; + return 0; +} + +static int realloc_data_buf(struct bpf_gen *gen, __u32 size) +{ + size_t off = gen->data_cur - gen->data_start; + void *data_start; + + if (gen->error) + return gen->error; + if (size > INT32_MAX || off + size > INT32_MAX) { + gen->error = -ERANGE; + return -ERANGE; + } + data_start = realloc(gen->data_start, off + size); + if (!data_start) { + gen->error = -ENOMEM; + free(gen->data_start); + gen->data_start = NULL; + return -ENOMEM; + } + gen->data_start = data_start; + gen->data_cur = data_start + off; + return 0; +} + +static void emit(struct bpf_gen *gen, struct bpf_insn insn) +{ + if (realloc_insn_buf(gen, sizeof(insn))) + return; + memcpy(gen->insn_cur, &insn, sizeof(insn)); + gen->insn_cur += sizeof(insn); +} + +static void emit2(struct bpf_gen *gen, struct bpf_insn insn1, struct bpf_insn insn2) +{ + emit(gen, insn1); + emit(gen, insn2); +} + +static int add_data(struct bpf_gen *gen, const void *data, __u32 size); +static void emit_sys_close_blob(struct bpf_gen *gen, int blob_off); + +void bpf_gen__init(struct bpf_gen *gen, int log_level, int nr_progs, int nr_maps) +{ + size_t stack_sz = sizeof(struct loader_stack), nr_progs_sz; + int i; + + gen->fd_array = add_data(gen, NULL, MAX_FD_ARRAY_SZ * sizeof(int)); + gen->log_level = log_level; + /* save ctx pointer into R6 */ + emit(gen, BPF_MOV64_REG(BPF_REG_6, BPF_REG_1)); + + /* bzero stack */ + emit(gen, BPF_MOV64_REG(BPF_REG_1, BPF_REG_10)); + emit(gen, BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -stack_sz)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, stack_sz)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, 0)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel)); + + /* amount of stack actually used, only used to calculate iterations, not stack offset */ + nr_progs_sz = offsetof(struct loader_stack, prog_fd[nr_progs]); + /* jump over cleanup code */ + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, + /* size of cleanup code below (including map fd cleanup) */ + (nr_progs_sz / 4) * 3 + 2 + + /* 6 insns for emit_sys_close_blob, + * 6 insns for debug_regs in emit_sys_close_blob + */ + nr_maps * (6 + (gen->log_level ? 6 : 0)))); + + /* remember the label where all error branches will jump to */ + gen->cleanup_label = gen->insn_cur - gen->insn_start; + /* emit cleanup code: close all temp FDs */ + for (i = 0; i < nr_progs_sz; i += 4) { + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_10, -stack_sz + i)); + emit(gen, BPF_JMP_IMM(BPF_JSLE, BPF_REG_1, 0, 1)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_sys_close)); + } + for (i = 0; i < nr_maps; i++) + emit_sys_close_blob(gen, blob_fd_array_off(gen, i)); + /* R7 contains the error code from sys_bpf. Copy it into R0 and exit. */ + emit(gen, BPF_MOV64_REG(BPF_REG_0, BPF_REG_7)); + emit(gen, BPF_EXIT_INSN()); +} + +static int add_data(struct bpf_gen *gen, const void *data, __u32 size) +{ + __u32 size8 = roundup(size, 8); + __u64 zero = 0; + void *prev; + + if (realloc_data_buf(gen, size8)) + return 0; + prev = gen->data_cur; + if (data) { + memcpy(gen->data_cur, data, size); + memcpy(gen->data_cur + size, &zero, size8 - size); + } else { + memset(gen->data_cur, 0, size8); + } + gen->data_cur += size8; + return prev - gen->data_start; +} + +/* Get index for map_fd/btf_fd slot in reserved fd_array, or in data relative + * to start of fd_array. Caller can decide if it is usable or not. + */ +static int add_map_fd(struct bpf_gen *gen) +{ + if (gen->nr_maps == MAX_USED_MAPS) { + pr_warn("Total maps exceeds %d\n", MAX_USED_MAPS); + gen->error = -E2BIG; + return 0; + } + return gen->nr_maps++; +} + +static int add_kfunc_btf_fd(struct bpf_gen *gen) +{ + int cur; + + if (gen->nr_fd_array == MAX_KFUNC_DESCS) { + cur = add_data(gen, NULL, sizeof(int)); + return (cur - gen->fd_array) / sizeof(int); + } + return MAX_USED_MAPS + gen->nr_fd_array++; +} + +static int insn_bytes_to_bpf_size(__u32 sz) +{ + switch (sz) { + case 8: return BPF_DW; + case 4: return BPF_W; + case 2: return BPF_H; + case 1: return BPF_B; + default: return -1; + } +} + +/* *(u64 *)(blob + off) = (u64)(void *)(blob + data) */ +static void emit_rel_store(struct bpf_gen *gen, int off, int data) +{ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, data)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, off)); + emit(gen, BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0)); +} + +static void move_blob2blob(struct bpf_gen *gen, int off, int size, int blob_off) +{ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_2, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_off)); + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_2, 0)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, off)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_1, BPF_REG_0, 0)); +} + +static void move_blob2ctx(struct bpf_gen *gen, int ctx_off, int size, int blob_off) +{ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_off)); + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_1, 0)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_6, BPF_REG_0, ctx_off)); +} + +static void move_ctx2blob(struct bpf_gen *gen, int off, int size, int ctx_off, + bool check_non_zero) +{ + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_6, ctx_off)); + if (check_non_zero) + /* If value in ctx is zero don't update the blob. + * For example: when ctx->map.max_entries == 0, keep default max_entries from bpf.c + */ + emit(gen, BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, off)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_1, BPF_REG_0, 0)); +} + +static void move_stack2blob(struct bpf_gen *gen, int off, int size, int stack_off) +{ + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_10, stack_off)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, off)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_1, BPF_REG_0, 0)); +} + +static void move_stack2ctx(struct bpf_gen *gen, int ctx_off, int size, int stack_off) +{ + emit(gen, BPF_LDX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_0, BPF_REG_10, stack_off)); + emit(gen, BPF_STX_MEM(insn_bytes_to_bpf_size(size), BPF_REG_6, BPF_REG_0, ctx_off)); +} + +static void emit_sys_bpf(struct bpf_gen *gen, int cmd, int attr, int attr_size) +{ + emit(gen, BPF_MOV64_IMM(BPF_REG_1, cmd)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_2, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, attr)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, attr_size)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_sys_bpf)); + /* remember the result in R7 */ + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_0)); +} + +static bool is_simm16(__s64 value) +{ + return value == (__s64)(__s16)value; +} + +static void emit_check_err(struct bpf_gen *gen) +{ + __s64 off = -(gen->insn_cur - gen->insn_start - gen->cleanup_label) / 8 - 1; + + /* R7 contains result of last sys_bpf command. + * if (R7 < 0) goto cleanup; + */ + if (is_simm16(off)) { + emit(gen, BPF_JMP_IMM(BPF_JSLT, BPF_REG_7, 0, off)); + } else { + gen->error = -ERANGE; + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, -1)); + } +} + +/* reg1 and reg2 should not be R1 - R5. They can be R0, R6 - R10 */ +static void emit_debug(struct bpf_gen *gen, int reg1, int reg2, + const char *fmt, va_list args) +{ + char buf[1024]; + int addr, len, ret; + + if (!gen->log_level) + return; + ret = vsnprintf(buf, sizeof(buf), fmt, args); + if (ret < 1024 - 7 && reg1 >= 0 && reg2 < 0) + /* The special case to accommodate common debug_ret(): + * to avoid specifying BPF_REG_7 and adding " r=%%d" to + * prints explicitly. + */ + strcat(buf, " r=%d"); + len = strlen(buf) + 1; + addr = add_data(gen, buf, len); + + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, addr)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, len)); + if (reg1 >= 0) + emit(gen, BPF_MOV64_REG(BPF_REG_3, reg1)); + if (reg2 >= 0) + emit(gen, BPF_MOV64_REG(BPF_REG_4, reg2)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_trace_printk)); +} + +static void debug_regs(struct bpf_gen *gen, int reg1, int reg2, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + emit_debug(gen, reg1, reg2, fmt, args); + va_end(args); +} + +static void debug_ret(struct bpf_gen *gen, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + emit_debug(gen, BPF_REG_7, -1, fmt, args); + va_end(args); +} + +static void __emit_sys_close(struct bpf_gen *gen) +{ + emit(gen, BPF_JMP_IMM(BPF_JSLE, BPF_REG_1, 0, + /* 2 is the number of the following insns + * * 6 is additional insns in debug_regs + */ + 2 + (gen->log_level ? 6 : 0))); + emit(gen, BPF_MOV64_REG(BPF_REG_9, BPF_REG_1)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_sys_close)); + debug_regs(gen, BPF_REG_9, BPF_REG_0, "close(%%d) = %%d"); +} + +static void emit_sys_close_stack(struct bpf_gen *gen, int stack_off) +{ + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_10, stack_off)); + __emit_sys_close(gen); +} + +static void emit_sys_close_blob(struct bpf_gen *gen, int blob_off) +{ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_off)); + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0)); + __emit_sys_close(gen); +} + +int bpf_gen__finish(struct bpf_gen *gen, int nr_progs, int nr_maps) +{ + int i; + + if (nr_progs < gen->nr_progs || nr_maps != gen->nr_maps) { + pr_warn("nr_progs %d/%d nr_maps %d/%d mismatch\n", + nr_progs, gen->nr_progs, nr_maps, gen->nr_maps); + gen->error = -EFAULT; + return gen->error; + } + emit_sys_close_stack(gen, stack_off(btf_fd)); + for (i = 0; i < gen->nr_progs; i++) + move_stack2ctx(gen, + sizeof(struct bpf_loader_ctx) + + sizeof(struct bpf_map_desc) * gen->nr_maps + + sizeof(struct bpf_prog_desc) * i + + offsetof(struct bpf_prog_desc, prog_fd), 4, + stack_off(prog_fd[i])); + for (i = 0; i < gen->nr_maps; i++) + move_blob2ctx(gen, + sizeof(struct bpf_loader_ctx) + + sizeof(struct bpf_map_desc) * i + + offsetof(struct bpf_map_desc, map_fd), 4, + blob_fd_array_off(gen, i)); + emit(gen, BPF_MOV64_IMM(BPF_REG_0, 0)); + emit(gen, BPF_EXIT_INSN()); + pr_debug("gen: finish %d\n", gen->error); + if (!gen->error) { + struct gen_loader_opts *opts = gen->opts; + + opts->insns = gen->insn_start; + opts->insns_sz = gen->insn_cur - gen->insn_start; + opts->data = gen->data_start; + opts->data_sz = gen->data_cur - gen->data_start; + } + return gen->error; +} + +void bpf_gen__free(struct bpf_gen *gen) +{ + if (!gen) + return; + free(gen->data_start); + free(gen->insn_start); + free(gen); +} + +void bpf_gen__load_btf(struct bpf_gen *gen, const void *btf_raw_data, + __u32 btf_raw_size) +{ + int attr_size = offsetofend(union bpf_attr, btf_log_level); + int btf_data, btf_load_attr; + union bpf_attr attr; + + memset(&attr, 0, attr_size); + pr_debug("gen: load_btf: size %d\n", btf_raw_size); + btf_data = add_data(gen, btf_raw_data, btf_raw_size); + + attr.btf_size = btf_raw_size; + btf_load_attr = add_data(gen, &attr, attr_size); + + /* populate union bpf_attr with user provided log details */ + move_ctx2blob(gen, attr_field(btf_load_attr, btf_log_level), 4, + offsetof(struct bpf_loader_ctx, log_level), false); + move_ctx2blob(gen, attr_field(btf_load_attr, btf_log_size), 4, + offsetof(struct bpf_loader_ctx, log_size), false); + move_ctx2blob(gen, attr_field(btf_load_attr, btf_log_buf), 8, + offsetof(struct bpf_loader_ctx, log_buf), false); + /* populate union bpf_attr with a pointer to the BTF data */ + emit_rel_store(gen, attr_field(btf_load_attr, btf), btf_data); + /* emit BTF_LOAD command */ + emit_sys_bpf(gen, BPF_BTF_LOAD, btf_load_attr, attr_size); + debug_ret(gen, "btf_load size %d", btf_raw_size); + emit_check_err(gen); + /* remember btf_fd in the stack, if successful */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_7, stack_off(btf_fd))); +} + +void bpf_gen__map_create(struct bpf_gen *gen, + enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, __u32 value_size, __u32 max_entries, + struct bpf_map_create_opts *map_attr, int map_idx) +{ + int attr_size = offsetofend(union bpf_attr, map_extra); + bool close_inner_map_fd = false; + int map_create_attr, idx; + union bpf_attr attr; + + memset(&attr, 0, attr_size); + attr.map_type = map_type; + attr.key_size = key_size; + attr.value_size = value_size; + attr.map_flags = map_attr->map_flags; + attr.map_extra = map_attr->map_extra; + if (map_name) + libbpf_strlcpy(attr.map_name, map_name, sizeof(attr.map_name)); + attr.numa_node = map_attr->numa_node; + attr.map_ifindex = map_attr->map_ifindex; + attr.max_entries = max_entries; + attr.btf_key_type_id = map_attr->btf_key_type_id; + attr.btf_value_type_id = map_attr->btf_value_type_id; + + pr_debug("gen: map_create: %s idx %d type %d value_type_id %d\n", + attr.map_name, map_idx, map_type, attr.btf_value_type_id); + + map_create_attr = add_data(gen, &attr, attr_size); + if (attr.btf_value_type_id) + /* populate union bpf_attr with btf_fd saved in the stack earlier */ + move_stack2blob(gen, attr_field(map_create_attr, btf_fd), 4, + stack_off(btf_fd)); + switch (attr.map_type) { + case BPF_MAP_TYPE_ARRAY_OF_MAPS: + case BPF_MAP_TYPE_HASH_OF_MAPS: + move_stack2blob(gen, attr_field(map_create_attr, inner_map_fd), 4, + stack_off(inner_map_fd)); + close_inner_map_fd = true; + break; + default: + break; + } + /* conditionally update max_entries */ + if (map_idx >= 0) + move_ctx2blob(gen, attr_field(map_create_attr, max_entries), 4, + sizeof(struct bpf_loader_ctx) + + sizeof(struct bpf_map_desc) * map_idx + + offsetof(struct bpf_map_desc, max_entries), + true /* check that max_entries != 0 */); + /* emit MAP_CREATE command */ + emit_sys_bpf(gen, BPF_MAP_CREATE, map_create_attr, attr_size); + debug_ret(gen, "map_create %s idx %d type %d value_size %d value_btf_id %d", + attr.map_name, map_idx, map_type, value_size, + attr.btf_value_type_id); + emit_check_err(gen); + /* remember map_fd in the stack, if successful */ + if (map_idx < 0) { + /* This bpf_gen__map_create() function is called with map_idx >= 0 + * for all maps that libbpf loading logic tracks. + * It's called with -1 to create an inner map. + */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_7, + stack_off(inner_map_fd))); + } else if (map_idx != gen->nr_maps) { + gen->error = -EDOM; /* internal bug */ + return; + } else { + /* add_map_fd does gen->nr_maps++ */ + idx = add_map_fd(gen); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_fd_array_off(gen, idx))); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_7, 0)); + } + if (close_inner_map_fd) + emit_sys_close_stack(gen, stack_off(inner_map_fd)); +} + +void bpf_gen__record_attach_target(struct bpf_gen *gen, const char *attach_name, + enum bpf_attach_type type) +{ + const char *prefix; + int kind, ret; + + btf_get_kernel_prefix_kind(type, &prefix, &kind); + gen->attach_kind = kind; + ret = snprintf(gen->attach_target, sizeof(gen->attach_target), "%s%s", + prefix, attach_name); + if (ret >= sizeof(gen->attach_target)) + gen->error = -ENOSPC; +} + +static void emit_find_attach_target(struct bpf_gen *gen) +{ + int name, len = strlen(gen->attach_target) + 1; + + pr_debug("gen: find_attach_tgt %s %d\n", gen->attach_target, gen->attach_kind); + name = add_data(gen, gen->attach_target, len); + + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, name)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, len)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, gen->attach_kind)); + emit(gen, BPF_MOV64_IMM(BPF_REG_4, 0)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_btf_find_by_name_kind)); + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_0)); + debug_ret(gen, "find_by_name_kind(%s,%d)", + gen->attach_target, gen->attach_kind); + emit_check_err(gen); + /* if successful, btf_id is in lower 32-bit of R7 and + * btf_obj_fd is in upper 32-bit + */ +} + +void bpf_gen__record_extern(struct bpf_gen *gen, const char *name, bool is_weak, + bool is_typeless, bool is_ld64, int kind, int insn_idx) +{ + struct ksym_relo_desc *relo; + + relo = libbpf_reallocarray(gen->relos, gen->relo_cnt + 1, sizeof(*relo)); + if (!relo) { + gen->error = -ENOMEM; + return; + } + gen->relos = relo; + relo += gen->relo_cnt; + relo->name = name; + relo->is_weak = is_weak; + relo->is_typeless = is_typeless; + relo->is_ld64 = is_ld64; + relo->kind = kind; + relo->insn_idx = insn_idx; + gen->relo_cnt++; +} + +/* returns existing ksym_desc with ref incremented, or inserts a new one */ +static struct ksym_desc *get_ksym_desc(struct bpf_gen *gen, struct ksym_relo_desc *relo) +{ + struct ksym_desc *kdesc; + int i; + + for (i = 0; i < gen->nr_ksyms; i++) { + kdesc = &gen->ksyms[i]; + if (kdesc->kind == relo->kind && kdesc->is_ld64 == relo->is_ld64 && + !strcmp(kdesc->name, relo->name)) { + kdesc->ref++; + return kdesc; + } + } + kdesc = libbpf_reallocarray(gen->ksyms, gen->nr_ksyms + 1, sizeof(*kdesc)); + if (!kdesc) { + gen->error = -ENOMEM; + return NULL; + } + gen->ksyms = kdesc; + kdesc = &gen->ksyms[gen->nr_ksyms++]; + kdesc->name = relo->name; + kdesc->kind = relo->kind; + kdesc->ref = 1; + kdesc->off = 0; + kdesc->insn = 0; + kdesc->is_ld64 = relo->is_ld64; + return kdesc; +} + +/* Overwrites BPF_REG_{0, 1, 2, 3, 4, 7} + * Returns result in BPF_REG_7 + */ +static void emit_bpf_find_by_name_kind(struct bpf_gen *gen, struct ksym_relo_desc *relo) +{ + int name_off, len = strlen(relo->name) + 1; + + name_off = add_data(gen, relo->name, len); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, name_off)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, len)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, relo->kind)); + emit(gen, BPF_MOV64_IMM(BPF_REG_4, 0)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_btf_find_by_name_kind)); + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_0)); + debug_ret(gen, "find_by_name_kind(%s,%d)", relo->name, relo->kind); +} + +/* Overwrites BPF_REG_{0, 1, 2, 3, 4, 7} + * Returns result in BPF_REG_7 + * Returns u64 symbol addr in BPF_REG_9 + */ +static void emit_bpf_kallsyms_lookup_name(struct bpf_gen *gen, struct ksym_relo_desc *relo) +{ + int name_off, len = strlen(relo->name) + 1, res_off; + + name_off = add_data(gen, relo->name, len); + res_off = add_data(gen, NULL, 8); /* res is u64 */ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, name_off)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, len)); + emit(gen, BPF_MOV64_IMM(BPF_REG_3, 0)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_4, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, res_off)); + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_4)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_kallsyms_lookup_name)); + emit(gen, BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0)); + emit(gen, BPF_MOV64_REG(BPF_REG_7, BPF_REG_0)); + debug_ret(gen, "kallsyms_lookup_name(%s,%d)", relo->name, relo->kind); +} + +/* Expects: + * BPF_REG_8 - pointer to instruction + * + * We need to reuse BTF fd for same symbol otherwise each relocation takes a new + * index, while kernel limits total kfunc BTFs to 256. For duplicate symbols, + * this would mean a new BTF fd index for each entry. By pairing symbol name + * with index, we get the insn->imm, insn->off pairing that kernel uses for + * kfunc_tab, which becomes the effective limit even though all of them may + * share same index in fd_array (such that kfunc_btf_tab has 1 element). + */ +static void emit_relo_kfunc_btf(struct bpf_gen *gen, struct ksym_relo_desc *relo, int insn) +{ + struct ksym_desc *kdesc; + int btf_fd_idx; + + kdesc = get_ksym_desc(gen, relo); + if (!kdesc) + return; + /* try to copy from existing bpf_insn */ + if (kdesc->ref > 1) { + move_blob2blob(gen, insn + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + offsetof(struct bpf_insn, imm)); + move_blob2blob(gen, insn + offsetof(struct bpf_insn, off), 2, + kdesc->insn + offsetof(struct bpf_insn, off)); + goto log; + } + /* remember insn offset, so we can copy BTF ID and FD later */ + kdesc->insn = insn; + emit_bpf_find_by_name_kind(gen, relo); + if (!relo->is_weak) + emit_check_err(gen); + /* get index in fd_array to store BTF FD at */ + btf_fd_idx = add_kfunc_btf_fd(gen); + if (btf_fd_idx > INT16_MAX) { + pr_warn("BTF fd off %d for kfunc %s exceeds INT16_MAX, cannot process relocation\n", + btf_fd_idx, relo->name); + gen->error = -E2BIG; + return; + } + kdesc->off = btf_fd_idx; + /* jump to success case */ + emit(gen, BPF_JMP_IMM(BPF_JSGE, BPF_REG_7, 0, 3)); + /* set value for imm, off as 0 */ + emit(gen, BPF_ST_MEM(BPF_W, BPF_REG_8, offsetof(struct bpf_insn, imm), 0)); + emit(gen, BPF_ST_MEM(BPF_H, BPF_REG_8, offsetof(struct bpf_insn, off), 0)); + /* skip success case for ret < 0 */ + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, 10)); + /* store btf_id into insn[insn_idx].imm */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_7, offsetof(struct bpf_insn, imm))); + /* obtain fd in BPF_REG_9 */ + emit(gen, BPF_MOV64_REG(BPF_REG_9, BPF_REG_7)); + emit(gen, BPF_ALU64_IMM(BPF_RSH, BPF_REG_9, 32)); + /* jump to fd_array store if fd denotes module BTF */ + emit(gen, BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 0, 2)); + /* set the default value for off */ + emit(gen, BPF_ST_MEM(BPF_H, BPF_REG_8, offsetof(struct bpf_insn, off), 0)); + /* skip BTF fd store for vmlinux BTF */ + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, 4)); + /* load fd_array slot pointer */ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_fd_array_off(gen, btf_fd_idx))); + /* store BTF fd in slot */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_9, 0)); + /* store index into insn[insn_idx].off */ + emit(gen, BPF_ST_MEM(BPF_H, BPF_REG_8, offsetof(struct bpf_insn, off), btf_fd_idx)); +log: + if (!gen->log_level) + return; + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_8, + offsetof(struct bpf_insn, imm))); + emit(gen, BPF_LDX_MEM(BPF_H, BPF_REG_9, BPF_REG_8, + offsetof(struct bpf_insn, off))); + debug_regs(gen, BPF_REG_7, BPF_REG_9, " func (%s:count=%d): imm: %%d, off: %%d", + relo->name, kdesc->ref); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, blob_fd_array_off(gen, kdesc->off))); + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_0, 0)); + debug_regs(gen, BPF_REG_9, -1, " func (%s:count=%d): btf_fd", + relo->name, kdesc->ref); +} + +static void emit_ksym_relo_log(struct bpf_gen *gen, struct ksym_relo_desc *relo, + int ref) +{ + if (!gen->log_level) + return; + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_8, + offsetof(struct bpf_insn, imm))); + emit(gen, BPF_LDX_MEM(BPF_H, BPF_REG_9, BPF_REG_8, sizeof(struct bpf_insn) + + offsetof(struct bpf_insn, imm))); + debug_regs(gen, BPF_REG_7, BPF_REG_9, " var t=%d w=%d (%s:count=%d): imm[0]: %%d, imm[1]: %%d", + relo->is_typeless, relo->is_weak, relo->name, ref); + emit(gen, BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_8, offsetofend(struct bpf_insn, code))); + debug_regs(gen, BPF_REG_9, -1, " var t=%d w=%d (%s:count=%d): insn.reg", + relo->is_typeless, relo->is_weak, relo->name, ref); +} + +/* Expects: + * BPF_REG_8 - pointer to instruction + */ +static void emit_relo_ksym_typeless(struct bpf_gen *gen, + struct ksym_relo_desc *relo, int insn) +{ + struct ksym_desc *kdesc; + + kdesc = get_ksym_desc(gen, relo); + if (!kdesc) + return; + /* try to copy from existing ldimm64 insn */ + if (kdesc->ref > 1) { + move_blob2blob(gen, insn + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + offsetof(struct bpf_insn, imm)); + move_blob2blob(gen, insn + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm)); + goto log; + } + /* remember insn offset, so we can copy ksym addr later */ + kdesc->insn = insn; + /* skip typeless ksym_desc in fd closing loop in cleanup_relos */ + kdesc->typeless = true; + emit_bpf_kallsyms_lookup_name(gen, relo); + emit(gen, BPF_JMP_IMM(BPF_JEQ, BPF_REG_7, -ENOENT, 1)); + emit_check_err(gen); + /* store lower half of addr into insn[insn_idx].imm */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_9, offsetof(struct bpf_insn, imm))); + /* store upper half of addr into insn[insn_idx + 1].imm */ + emit(gen, BPF_ALU64_IMM(BPF_RSH, BPF_REG_9, 32)); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_9, + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm))); +log: + emit_ksym_relo_log(gen, relo, kdesc->ref); +} + +static __u32 src_reg_mask(void) +{ +#if defined(__LITTLE_ENDIAN_BITFIELD) + return 0x0f; /* src_reg,dst_reg,... */ +#elif defined(__BIG_ENDIAN_BITFIELD) + return 0xf0; /* dst_reg,src_reg,... */ +#else +#error "Unsupported bit endianness, cannot proceed" +#endif +} + +/* Expects: + * BPF_REG_8 - pointer to instruction + */ +static void emit_relo_ksym_btf(struct bpf_gen *gen, struct ksym_relo_desc *relo, int insn) +{ + struct ksym_desc *kdesc; + __u32 reg_mask; + + kdesc = get_ksym_desc(gen, relo); + if (!kdesc) + return; + /* try to copy from existing ldimm64 insn */ + if (kdesc->ref > 1) { + move_blob2blob(gen, insn + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm)); + move_blob2blob(gen, insn + offsetof(struct bpf_insn, imm), 4, + kdesc->insn + offsetof(struct bpf_insn, imm)); + /* jump over src_reg adjustment if imm (btf_id) is not 0, reuse BPF_REG_0 from move_blob2blob + * If btf_id is zero, clear BPF_PSEUDO_BTF_ID flag in src_reg of ld_imm64 insn + */ + emit(gen, BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 3)); + goto clear_src_reg; + } + /* remember insn offset, so we can copy BTF ID and FD later */ + kdesc->insn = insn; + emit_bpf_find_by_name_kind(gen, relo); + if (!relo->is_weak) + emit_check_err(gen); + /* jump to success case */ + emit(gen, BPF_JMP_IMM(BPF_JSGE, BPF_REG_7, 0, 3)); + /* set values for insn[insn_idx].imm, insn[insn_idx + 1].imm as 0 */ + emit(gen, BPF_ST_MEM(BPF_W, BPF_REG_8, offsetof(struct bpf_insn, imm), 0)); + emit(gen, BPF_ST_MEM(BPF_W, BPF_REG_8, sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm), 0)); + /* skip success case for ret < 0 */ + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, 4)); + /* store btf_id into insn[insn_idx].imm */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_7, offsetof(struct bpf_insn, imm))); + /* store btf_obj_fd into insn[insn_idx + 1].imm */ + emit(gen, BPF_ALU64_IMM(BPF_RSH, BPF_REG_7, 32)); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_8, BPF_REG_7, + sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm))); + /* skip src_reg adjustment */ + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, 3)); +clear_src_reg: + /* clear bpf_object__relocate_data's src_reg assignment, otherwise we get a verifier failure */ + reg_mask = src_reg_mask(); + emit(gen, BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_8, offsetofend(struct bpf_insn, code))); + emit(gen, BPF_ALU32_IMM(BPF_AND, BPF_REG_9, reg_mask)); + emit(gen, BPF_STX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, offsetofend(struct bpf_insn, code))); + + emit_ksym_relo_log(gen, relo, kdesc->ref); +} + +void bpf_gen__record_relo_core(struct bpf_gen *gen, + const struct bpf_core_relo *core_relo) +{ + struct bpf_core_relo *relos; + + relos = libbpf_reallocarray(gen->core_relos, gen->core_relo_cnt + 1, sizeof(*relos)); + if (!relos) { + gen->error = -ENOMEM; + return; + } + gen->core_relos = relos; + relos += gen->core_relo_cnt; + memcpy(relos, core_relo, sizeof(*relos)); + gen->core_relo_cnt++; +} + +static void emit_relo(struct bpf_gen *gen, struct ksym_relo_desc *relo, int insns) +{ + int insn; + + pr_debug("gen: emit_relo (%d): %s at %d %s\n", + relo->kind, relo->name, relo->insn_idx, relo->is_ld64 ? "ld64" : "call"); + insn = insns + sizeof(struct bpf_insn) * relo->insn_idx; + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_8, BPF_PSEUDO_MAP_IDX_VALUE, 0, 0, 0, insn)); + if (relo->is_ld64) { + if (relo->is_typeless) + emit_relo_ksym_typeless(gen, relo, insn); + else + emit_relo_ksym_btf(gen, relo, insn); + } else { + emit_relo_kfunc_btf(gen, relo, insn); + } +} + +static void emit_relos(struct bpf_gen *gen, int insns) +{ + int i; + + for (i = 0; i < gen->relo_cnt; i++) + emit_relo(gen, gen->relos + i, insns); +} + +static void cleanup_core_relo(struct bpf_gen *gen) +{ + if (!gen->core_relo_cnt) + return; + free(gen->core_relos); + gen->core_relo_cnt = 0; + gen->core_relos = NULL; +} + +static void cleanup_relos(struct bpf_gen *gen, int insns) +{ + struct ksym_desc *kdesc; + int i, insn; + + for (i = 0; i < gen->nr_ksyms; i++) { + kdesc = &gen->ksyms[i]; + /* only close fds for typed ksyms and kfuncs */ + if (kdesc->is_ld64 && !kdesc->typeless) { + /* close fd recorded in insn[insn_idx + 1].imm */ + insn = kdesc->insn; + insn += sizeof(struct bpf_insn) + offsetof(struct bpf_insn, imm); + emit_sys_close_blob(gen, insn); + } else if (!kdesc->is_ld64) { + emit_sys_close_blob(gen, blob_fd_array_off(gen, kdesc->off)); + if (kdesc->off < MAX_FD_ARRAY_SZ) + gen->nr_fd_array--; + } + } + if (gen->nr_ksyms) { + free(gen->ksyms); + gen->nr_ksyms = 0; + gen->ksyms = NULL; + } + if (gen->relo_cnt) { + free(gen->relos); + gen->relo_cnt = 0; + gen->relos = NULL; + } + cleanup_core_relo(gen); +} + +void bpf_gen__prog_load(struct bpf_gen *gen, + enum bpf_prog_type prog_type, const char *prog_name, + const char *license, struct bpf_insn *insns, size_t insn_cnt, + struct bpf_prog_load_opts *load_attr, int prog_idx) +{ + int prog_load_attr, license_off, insns_off, func_info, line_info, core_relos; + int attr_size = offsetofend(union bpf_attr, core_relo_rec_size); + union bpf_attr attr; + + memset(&attr, 0, attr_size); + pr_debug("gen: prog_load: type %d insns_cnt %zd progi_idx %d\n", + prog_type, insn_cnt, prog_idx); + /* add license string to blob of bytes */ + license_off = add_data(gen, license, strlen(license) + 1); + /* add insns to blob of bytes */ + insns_off = add_data(gen, insns, insn_cnt * sizeof(struct bpf_insn)); + + attr.prog_type = prog_type; + attr.expected_attach_type = load_attr->expected_attach_type; + attr.attach_btf_id = load_attr->attach_btf_id; + attr.prog_ifindex = load_attr->prog_ifindex; + attr.kern_version = 0; + attr.insn_cnt = (__u32)insn_cnt; + attr.prog_flags = load_attr->prog_flags; + + attr.func_info_rec_size = load_attr->func_info_rec_size; + attr.func_info_cnt = load_attr->func_info_cnt; + func_info = add_data(gen, load_attr->func_info, + attr.func_info_cnt * attr.func_info_rec_size); + + attr.line_info_rec_size = load_attr->line_info_rec_size; + attr.line_info_cnt = load_attr->line_info_cnt; + line_info = add_data(gen, load_attr->line_info, + attr.line_info_cnt * attr.line_info_rec_size); + + attr.core_relo_rec_size = sizeof(struct bpf_core_relo); + attr.core_relo_cnt = gen->core_relo_cnt; + core_relos = add_data(gen, gen->core_relos, + attr.core_relo_cnt * attr.core_relo_rec_size); + + libbpf_strlcpy(attr.prog_name, prog_name, sizeof(attr.prog_name)); + prog_load_attr = add_data(gen, &attr, attr_size); + + /* populate union bpf_attr with a pointer to license */ + emit_rel_store(gen, attr_field(prog_load_attr, license), license_off); + + /* populate union bpf_attr with a pointer to instructions */ + emit_rel_store(gen, attr_field(prog_load_attr, insns), insns_off); + + /* populate union bpf_attr with a pointer to func_info */ + emit_rel_store(gen, attr_field(prog_load_attr, func_info), func_info); + + /* populate union bpf_attr with a pointer to line_info */ + emit_rel_store(gen, attr_field(prog_load_attr, line_info), line_info); + + /* populate union bpf_attr with a pointer to core_relos */ + emit_rel_store(gen, attr_field(prog_load_attr, core_relos), core_relos); + + /* populate union bpf_attr fd_array with a pointer to data where map_fds are saved */ + emit_rel_store(gen, attr_field(prog_load_attr, fd_array), gen->fd_array); + + /* populate union bpf_attr with user provided log details */ + move_ctx2blob(gen, attr_field(prog_load_attr, log_level), 4, + offsetof(struct bpf_loader_ctx, log_level), false); + move_ctx2blob(gen, attr_field(prog_load_attr, log_size), 4, + offsetof(struct bpf_loader_ctx, log_size), false); + move_ctx2blob(gen, attr_field(prog_load_attr, log_buf), 8, + offsetof(struct bpf_loader_ctx, log_buf), false); + /* populate union bpf_attr with btf_fd saved in the stack earlier */ + move_stack2blob(gen, attr_field(prog_load_attr, prog_btf_fd), 4, + stack_off(btf_fd)); + if (gen->attach_kind) { + emit_find_attach_target(gen); + /* populate union bpf_attr with btf_id and btf_obj_fd found by helper */ + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_0, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, prog_load_attr)); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_7, + offsetof(union bpf_attr, attach_btf_id))); + emit(gen, BPF_ALU64_IMM(BPF_RSH, BPF_REG_7, 32)); + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_7, + offsetof(union bpf_attr, attach_btf_obj_fd))); + } + emit_relos(gen, insns_off); + /* emit PROG_LOAD command */ + emit_sys_bpf(gen, BPF_PROG_LOAD, prog_load_attr, attr_size); + debug_ret(gen, "prog_load %s insn_cnt %d", attr.prog_name, attr.insn_cnt); + /* successful or not, close btf module FDs used in extern ksyms and attach_btf_obj_fd */ + cleanup_relos(gen, insns_off); + if (gen->attach_kind) { + emit_sys_close_blob(gen, + attr_field(prog_load_attr, attach_btf_obj_fd)); + gen->attach_kind = 0; + } + emit_check_err(gen); + /* remember prog_fd in the stack, if successful */ + emit(gen, BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_7, + stack_off(prog_fd[gen->nr_progs]))); + gen->nr_progs++; +} + +void bpf_gen__map_update_elem(struct bpf_gen *gen, int map_idx, void *pvalue, + __u32 value_size) +{ + int attr_size = offsetofend(union bpf_attr, flags); + int map_update_attr, value, key; + union bpf_attr attr; + int zero = 0; + + memset(&attr, 0, attr_size); + pr_debug("gen: map_update_elem: idx %d\n", map_idx); + + value = add_data(gen, pvalue, value_size); + key = add_data(gen, &zero, sizeof(zero)); + + /* if (map_desc[map_idx].initial_value) { + * if (ctx->flags & BPF_SKEL_KERNEL) + * bpf_probe_read_kernel(value, value_size, initial_value); + * else + * bpf_copy_from_user(value, value_size, initial_value); + * } + */ + emit(gen, BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, + sizeof(struct bpf_loader_ctx) + + sizeof(struct bpf_map_desc) * map_idx + + offsetof(struct bpf_map_desc, initial_value))); + emit(gen, BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0, 8)); + emit2(gen, BPF_LD_IMM64_RAW_FULL(BPF_REG_1, BPF_PSEUDO_MAP_IDX_VALUE, + 0, 0, 0, value)); + emit(gen, BPF_MOV64_IMM(BPF_REG_2, value_size)); + emit(gen, BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, + offsetof(struct bpf_loader_ctx, flags))); + emit(gen, BPF_JMP_IMM(BPF_JSET, BPF_REG_0, BPF_SKEL_KERNEL, 2)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_copy_from_user)); + emit(gen, BPF_JMP_IMM(BPF_JA, 0, 0, 1)); + emit(gen, BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel)); + + map_update_attr = add_data(gen, &attr, attr_size); + move_blob2blob(gen, attr_field(map_update_attr, map_fd), 4, + blob_fd_array_off(gen, map_idx)); + emit_rel_store(gen, attr_field(map_update_attr, key), key); + emit_rel_store(gen, attr_field(map_update_attr, value), value); + /* emit MAP_UPDATE_ELEM command */ + emit_sys_bpf(gen, BPF_MAP_UPDATE_ELEM, map_update_attr, attr_size); + debug_ret(gen, "update_elem idx %d value_size %d", map_idx, value_size); + emit_check_err(gen); +} + +void bpf_gen__populate_outer_map(struct bpf_gen *gen, int outer_map_idx, int slot, + int inner_map_idx) +{ + int attr_size = offsetofend(union bpf_attr, flags); + int map_update_attr, key; + union bpf_attr attr; + + memset(&attr, 0, attr_size); + pr_debug("gen: populate_outer_map: outer %d key %d inner %d\n", + outer_map_idx, slot, inner_map_idx); + + key = add_data(gen, &slot, sizeof(slot)); + + map_update_attr = add_data(gen, &attr, attr_size); + move_blob2blob(gen, attr_field(map_update_attr, map_fd), 4, + blob_fd_array_off(gen, outer_map_idx)); + emit_rel_store(gen, attr_field(map_update_attr, key), key); + emit_rel_store(gen, attr_field(map_update_attr, value), + blob_fd_array_off(gen, inner_map_idx)); + + /* emit MAP_UPDATE_ELEM command */ + emit_sys_bpf(gen, BPF_MAP_UPDATE_ELEM, map_update_attr, attr_size); + debug_ret(gen, "populate_outer_map outer %d key %d inner %d", + outer_map_idx, slot, inner_map_idx); + emit_check_err(gen); +} + +void bpf_gen__map_freeze(struct bpf_gen *gen, int map_idx) +{ + int attr_size = offsetofend(union bpf_attr, map_fd); + int map_freeze_attr; + union bpf_attr attr; + + memset(&attr, 0, attr_size); + pr_debug("gen: map_freeze: idx %d\n", map_idx); + map_freeze_attr = add_data(gen, &attr, attr_size); + move_blob2blob(gen, attr_field(map_freeze_attr, map_fd), 4, + blob_fd_array_off(gen, map_idx)); + /* emit MAP_FREEZE command */ + emit_sys_bpf(gen, BPF_MAP_FREEZE, map_freeze_attr, attr_size); + debug_ret(gen, "map_freeze"); + emit_check_err(gen); +} diff --git a/libbpf/src/hashmap.c b/libbpf/src/hashmap.c new file mode 100644 index 0000000..140ee40 --- /dev/null +++ b/libbpf/src/hashmap.c @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * Generic non-thread safe hash map implementation. + * + * Copyright (c) 2019 Facebook + */ +#include +#include +#include +#include +#include +#include "hashmap.h" + +/* make sure libbpf doesn't use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +/* prevent accidental re-addition of reallocarray() */ +#pragma GCC poison reallocarray + +/* start with 4 buckets */ +#define HASHMAP_MIN_CAP_BITS 2 + +static void hashmap_add_entry(struct hashmap_entry **pprev, + struct hashmap_entry *entry) +{ + entry->next = *pprev; + *pprev = entry; +} + +static void hashmap_del_entry(struct hashmap_entry **pprev, + struct hashmap_entry *entry) +{ + *pprev = entry->next; + entry->next = NULL; +} + +void hashmap__init(struct hashmap *map, hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, void *ctx) +{ + map->hash_fn = hash_fn; + map->equal_fn = equal_fn; + map->ctx = ctx; + + map->buckets = NULL; + map->cap = 0; + map->cap_bits = 0; + map->sz = 0; +} + +struct hashmap *hashmap__new(hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, + void *ctx) +{ + struct hashmap *map = malloc(sizeof(struct hashmap)); + + if (!map) + return ERR_PTR(-ENOMEM); + hashmap__init(map, hash_fn, equal_fn, ctx); + return map; +} + +void hashmap__clear(struct hashmap *map) +{ + struct hashmap_entry *cur, *tmp; + size_t bkt; + + hashmap__for_each_entry_safe(map, cur, tmp, bkt) { + free(cur); + } + free(map->buckets); + map->buckets = NULL; + map->cap = map->cap_bits = map->sz = 0; +} + +void hashmap__free(struct hashmap *map) +{ + if (IS_ERR_OR_NULL(map)) + return; + + hashmap__clear(map); + free(map); +} + +size_t hashmap__size(const struct hashmap *map) +{ + return map->sz; +} + +size_t hashmap__capacity(const struct hashmap *map) +{ + return map->cap; +} + +static bool hashmap_needs_to_grow(struct hashmap *map) +{ + /* grow if empty or more than 75% filled */ + return (map->cap == 0) || ((map->sz + 1) * 4 / 3 > map->cap); +} + +static int hashmap_grow(struct hashmap *map) +{ + struct hashmap_entry **new_buckets; + struct hashmap_entry *cur, *tmp; + size_t new_cap_bits, new_cap; + size_t h, bkt; + + new_cap_bits = map->cap_bits + 1; + if (new_cap_bits < HASHMAP_MIN_CAP_BITS) + new_cap_bits = HASHMAP_MIN_CAP_BITS; + + new_cap = 1UL << new_cap_bits; + new_buckets = calloc(new_cap, sizeof(new_buckets[0])); + if (!new_buckets) + return -ENOMEM; + + hashmap__for_each_entry_safe(map, cur, tmp, bkt) { + h = hash_bits(map->hash_fn(cur->key, map->ctx), new_cap_bits); + hashmap_add_entry(&new_buckets[h], cur); + } + + map->cap = new_cap; + map->cap_bits = new_cap_bits; + free(map->buckets); + map->buckets = new_buckets; + + return 0; +} + +static bool hashmap_find_entry(const struct hashmap *map, + const long key, size_t hash, + struct hashmap_entry ***pprev, + struct hashmap_entry **entry) +{ + struct hashmap_entry *cur, **prev_ptr; + + if (!map->buckets) + return false; + + for (prev_ptr = &map->buckets[hash], cur = *prev_ptr; + cur; + prev_ptr = &cur->next, cur = cur->next) { + if (map->equal_fn(cur->key, key, map->ctx)) { + if (pprev) + *pprev = prev_ptr; + *entry = cur; + return true; + } + } + + return false; +} + +int hashmap_insert(struct hashmap *map, long key, long value, + enum hashmap_insert_strategy strategy, + long *old_key, long *old_value) +{ + struct hashmap_entry *entry; + size_t h; + int err; + + if (old_key) + *old_key = 0; + if (old_value) + *old_value = 0; + + h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits); + if (strategy != HASHMAP_APPEND && + hashmap_find_entry(map, key, h, NULL, &entry)) { + if (old_key) + *old_key = entry->key; + if (old_value) + *old_value = entry->value; + + if (strategy == HASHMAP_SET || strategy == HASHMAP_UPDATE) { + entry->key = key; + entry->value = value; + return 0; + } else if (strategy == HASHMAP_ADD) { + return -EEXIST; + } + } + + if (strategy == HASHMAP_UPDATE) + return -ENOENT; + + if (hashmap_needs_to_grow(map)) { + err = hashmap_grow(map); + if (err) + return err; + h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits); + } + + entry = malloc(sizeof(struct hashmap_entry)); + if (!entry) + return -ENOMEM; + + entry->key = key; + entry->value = value; + hashmap_add_entry(&map->buckets[h], entry); + map->sz++; + + return 0; +} + +bool hashmap_find(const struct hashmap *map, long key, long *value) +{ + struct hashmap_entry *entry; + size_t h; + + h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits); + if (!hashmap_find_entry(map, key, h, NULL, &entry)) + return false; + + if (value) + *value = entry->value; + return true; +} + +bool hashmap_delete(struct hashmap *map, long key, + long *old_key, long *old_value) +{ + struct hashmap_entry **pprev, *entry; + size_t h; + + h = hash_bits(map->hash_fn(key, map->ctx), map->cap_bits); + if (!hashmap_find_entry(map, key, h, &pprev, &entry)) + return false; + + if (old_key) + *old_key = entry->key; + if (old_value) + *old_value = entry->value; + + hashmap_del_entry(pprev, entry); + free(entry); + map->sz--; + + return true; +} diff --git a/libbpf/src/hashmap.h b/libbpf/src/hashmap.h new file mode 100644 index 0000000..0a5bf19 --- /dev/null +++ b/libbpf/src/hashmap.h @@ -0,0 +1,218 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Generic non-thread safe hash map implementation. + * + * Copyright (c) 2019 Facebook + */ +#ifndef __LIBBPF_HASHMAP_H +#define __LIBBPF_HASHMAP_H + +#include +#include +#include + +static inline size_t hash_bits(size_t h, int bits) +{ + /* shuffle bits and return requested number of upper bits */ + if (bits == 0) + return 0; + +#if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__) + /* LP64 case */ + return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits); +#elif (__SIZEOF_SIZE_T__ <= __SIZEOF_LONG__) + return (h * 2654435769lu) >> (__SIZEOF_LONG__ * 8 - bits); +#else +# error "Unsupported size_t size" +#endif +} + +/* generic C-string hashing function */ +static inline size_t str_hash(const char *s) +{ + size_t h = 0; + + while (*s) { + h = h * 31 + *s; + s++; + } + return h; +} + +typedef size_t (*hashmap_hash_fn)(long key, void *ctx); +typedef bool (*hashmap_equal_fn)(long key1, long key2, void *ctx); + +/* + * Hashmap interface is polymorphic, keys and values could be either + * long-sized integers or pointers, this is achieved as follows: + * - interface functions that operate on keys and values are hidden + * behind auxiliary macros, e.g. hashmap_insert <-> hashmap__insert; + * - these auxiliary macros cast the key and value parameters as + * long or long *, so the user does not have to specify the casts explicitly; + * - for pointer parameters (e.g. old_key) the size of the pointed + * type is verified by hashmap_cast_ptr using _Static_assert; + * - when iterating using hashmap__for_each_* forms + * hasmap_entry->key should be used for integer keys and + * hasmap_entry->pkey should be used for pointer keys, + * same goes for values. + */ +struct hashmap_entry { + union { + long key; + const void *pkey; + }; + union { + long value; + void *pvalue; + }; + struct hashmap_entry *next; +}; + +struct hashmap { + hashmap_hash_fn hash_fn; + hashmap_equal_fn equal_fn; + void *ctx; + + struct hashmap_entry **buckets; + size_t cap; + size_t cap_bits; + size_t sz; +}; + +#define HASHMAP_INIT(hash_fn, equal_fn, ctx) { \ + .hash_fn = (hash_fn), \ + .equal_fn = (equal_fn), \ + .ctx = (ctx), \ + .buckets = NULL, \ + .cap = 0, \ + .cap_bits = 0, \ + .sz = 0, \ +} + +void hashmap__init(struct hashmap *map, hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, void *ctx); +struct hashmap *hashmap__new(hashmap_hash_fn hash_fn, + hashmap_equal_fn equal_fn, + void *ctx); +void hashmap__clear(struct hashmap *map); +void hashmap__free(struct hashmap *map); + +size_t hashmap__size(const struct hashmap *map); +size_t hashmap__capacity(const struct hashmap *map); + +/* + * Hashmap insertion strategy: + * - HASHMAP_ADD - only add key/value if key doesn't exist yet; + * - HASHMAP_SET - add key/value pair if key doesn't exist yet; otherwise, + * update value; + * - HASHMAP_UPDATE - update value, if key already exists; otherwise, do + * nothing and return -ENOENT; + * - HASHMAP_APPEND - always add key/value pair, even if key already exists. + * This turns hashmap into a multimap by allowing multiple values to be + * associated with the same key. Most useful read API for such hashmap is + * hashmap__for_each_key_entry() iteration. If hashmap__find() is still + * used, it will return last inserted key/value entry (first in a bucket + * chain). + */ +enum hashmap_insert_strategy { + HASHMAP_ADD, + HASHMAP_SET, + HASHMAP_UPDATE, + HASHMAP_APPEND, +}; + +#define hashmap_cast_ptr(p) ({ \ + _Static_assert((__builtin_constant_p((p)) ? (p) == NULL : 0) || \ + sizeof(*(p)) == sizeof(long), \ + #p " pointee should be a long-sized integer or a pointer"); \ + (long *)(p); \ +}) + +/* + * hashmap__insert() adds key/value entry w/ various semantics, depending on + * provided strategy value. If a given key/value pair replaced already + * existing key/value pair, both old key and old value will be returned + * through old_key and old_value to allow calling code do proper memory + * management. + */ +int hashmap_insert(struct hashmap *map, long key, long value, + enum hashmap_insert_strategy strategy, + long *old_key, long *old_value); + +#define hashmap__insert(map, key, value, strategy, old_key, old_value) \ + hashmap_insert((map), (long)(key), (long)(value), (strategy), \ + hashmap_cast_ptr(old_key), \ + hashmap_cast_ptr(old_value)) + +#define hashmap__add(map, key, value) \ + hashmap__insert((map), (key), (value), HASHMAP_ADD, NULL, NULL) + +#define hashmap__set(map, key, value, old_key, old_value) \ + hashmap__insert((map), (key), (value), HASHMAP_SET, (old_key), (old_value)) + +#define hashmap__update(map, key, value, old_key, old_value) \ + hashmap__insert((map), (key), (value), HASHMAP_UPDATE, (old_key), (old_value)) + +#define hashmap__append(map, key, value) \ + hashmap__insert((map), (key), (value), HASHMAP_APPEND, NULL, NULL) + +bool hashmap_delete(struct hashmap *map, long key, long *old_key, long *old_value); + +#define hashmap__delete(map, key, old_key, old_value) \ + hashmap_delete((map), (long)(key), \ + hashmap_cast_ptr(old_key), \ + hashmap_cast_ptr(old_value)) + +bool hashmap_find(const struct hashmap *map, long key, long *value); + +#define hashmap__find(map, key, value) \ + hashmap_find((map), (long)(key), hashmap_cast_ptr(value)) + +/* + * hashmap__for_each_entry - iterate over all entries in hashmap + * @map: hashmap to iterate + * @cur: struct hashmap_entry * used as a loop cursor + * @bkt: integer used as a bucket loop cursor + */ +#define hashmap__for_each_entry(map, cur, bkt) \ + for (bkt = 0; bkt < map->cap; bkt++) \ + for (cur = map->buckets[bkt]; cur; cur = cur->next) + +/* + * hashmap__for_each_entry_safe - iterate over all entries in hashmap, safe + * against removals + * @map: hashmap to iterate + * @cur: struct hashmap_entry * used as a loop cursor + * @tmp: struct hashmap_entry * used as a temporary next cursor storage + * @bkt: integer used as a bucket loop cursor + */ +#define hashmap__for_each_entry_safe(map, cur, tmp, bkt) \ + for (bkt = 0; bkt < map->cap; bkt++) \ + for (cur = map->buckets[bkt]; \ + cur && ({tmp = cur->next; true; }); \ + cur = tmp) + +/* + * hashmap__for_each_key_entry - iterate over entries associated with given key + * @map: hashmap to iterate + * @cur: struct hashmap_entry * used as a loop cursor + * @key: key to iterate entries for + */ +#define hashmap__for_each_key_entry(map, cur, _key) \ + for (cur = map->buckets \ + ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \ + : NULL; \ + cur; \ + cur = cur->next) \ + if (map->equal_fn(cur->key, (_key), map->ctx)) + +#define hashmap__for_each_key_entry_safe(map, cur, tmp, _key) \ + for (cur = map->buckets \ + ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \ + : NULL; \ + cur && ({ tmp = cur->next; true; }); \ + cur = tmp) \ + if (map->equal_fn(cur->key, (_key), map->ctx)) + +#endif /* __LIBBPF_HASHMAP_H */ diff --git a/libbpf/src/libbpf.c b/libbpf/src/libbpf.c new file mode 100644 index 0000000..f6a071d --- /dev/null +++ b/libbpf/src/libbpf.c @@ -0,0 +1,12726 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * Common eBPF ELF object loading operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + * Copyright (C) 2017 Nicira, Inc. + * Copyright (C) 2019 Isovalent, Inc. + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libbpf.h" +#include "bpf.h" +#include "btf.h" +#include "str_error.h" +#include "libbpf_internal.h" +#include "hashmap.h" +#include "bpf_gen_internal.h" +#include "zip.h" + +#ifndef BPF_FS_MAGIC +#define BPF_FS_MAGIC 0xcafe4a11 +#endif + +#define BPF_INSN_SZ (sizeof(struct bpf_insn)) + +/* vsprintf() in __base_pr() uses nonliteral format string. It may break + * compilation if user enables corresponding warning. Disable it explicitly. + */ +#pragma GCC diagnostic ignored "-Wformat-nonliteral" + +#define __printf(a, b) __attribute__((format(printf, a, b))) + +static struct bpf_map *bpf_object__add_map(struct bpf_object *obj); +static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog); + +static const char * const attach_type_name[] = { + [BPF_CGROUP_INET_INGRESS] = "cgroup_inet_ingress", + [BPF_CGROUP_INET_EGRESS] = "cgroup_inet_egress", + [BPF_CGROUP_INET_SOCK_CREATE] = "cgroup_inet_sock_create", + [BPF_CGROUP_INET_SOCK_RELEASE] = "cgroup_inet_sock_release", + [BPF_CGROUP_SOCK_OPS] = "cgroup_sock_ops", + [BPF_CGROUP_DEVICE] = "cgroup_device", + [BPF_CGROUP_INET4_BIND] = "cgroup_inet4_bind", + [BPF_CGROUP_INET6_BIND] = "cgroup_inet6_bind", + [BPF_CGROUP_INET4_CONNECT] = "cgroup_inet4_connect", + [BPF_CGROUP_INET6_CONNECT] = "cgroup_inet6_connect", + [BPF_CGROUP_INET4_POST_BIND] = "cgroup_inet4_post_bind", + [BPF_CGROUP_INET6_POST_BIND] = "cgroup_inet6_post_bind", + [BPF_CGROUP_INET4_GETPEERNAME] = "cgroup_inet4_getpeername", + [BPF_CGROUP_INET6_GETPEERNAME] = "cgroup_inet6_getpeername", + [BPF_CGROUP_INET4_GETSOCKNAME] = "cgroup_inet4_getsockname", + [BPF_CGROUP_INET6_GETSOCKNAME] = "cgroup_inet6_getsockname", + [BPF_CGROUP_UDP4_SENDMSG] = "cgroup_udp4_sendmsg", + [BPF_CGROUP_UDP6_SENDMSG] = "cgroup_udp6_sendmsg", + [BPF_CGROUP_SYSCTL] = "cgroup_sysctl", + [BPF_CGROUP_UDP4_RECVMSG] = "cgroup_udp4_recvmsg", + [BPF_CGROUP_UDP6_RECVMSG] = "cgroup_udp6_recvmsg", + [BPF_CGROUP_GETSOCKOPT] = "cgroup_getsockopt", + [BPF_CGROUP_SETSOCKOPT] = "cgroup_setsockopt", + [BPF_SK_SKB_STREAM_PARSER] = "sk_skb_stream_parser", + [BPF_SK_SKB_STREAM_VERDICT] = "sk_skb_stream_verdict", + [BPF_SK_SKB_VERDICT] = "sk_skb_verdict", + [BPF_SK_MSG_VERDICT] = "sk_msg_verdict", + [BPF_LIRC_MODE2] = "lirc_mode2", + [BPF_FLOW_DISSECTOR] = "flow_dissector", + [BPF_TRACE_RAW_TP] = "trace_raw_tp", + [BPF_TRACE_FENTRY] = "trace_fentry", + [BPF_TRACE_FEXIT] = "trace_fexit", + [BPF_MODIFY_RETURN] = "modify_return", + [BPF_LSM_MAC] = "lsm_mac", + [BPF_LSM_CGROUP] = "lsm_cgroup", + [BPF_SK_LOOKUP] = "sk_lookup", + [BPF_TRACE_ITER] = "trace_iter", + [BPF_XDP_DEVMAP] = "xdp_devmap", + [BPF_XDP_CPUMAP] = "xdp_cpumap", + [BPF_XDP] = "xdp", + [BPF_SK_REUSEPORT_SELECT] = "sk_reuseport_select", + [BPF_SK_REUSEPORT_SELECT_OR_MIGRATE] = "sk_reuseport_select_or_migrate", + [BPF_PERF_EVENT] = "perf_event", + [BPF_TRACE_KPROBE_MULTI] = "trace_kprobe_multi", + [BPF_STRUCT_OPS] = "struct_ops", +}; + +static const char * const link_type_name[] = { + [BPF_LINK_TYPE_UNSPEC] = "unspec", + [BPF_LINK_TYPE_RAW_TRACEPOINT] = "raw_tracepoint", + [BPF_LINK_TYPE_TRACING] = "tracing", + [BPF_LINK_TYPE_CGROUP] = "cgroup", + [BPF_LINK_TYPE_ITER] = "iter", + [BPF_LINK_TYPE_NETNS] = "netns", + [BPF_LINK_TYPE_XDP] = "xdp", + [BPF_LINK_TYPE_PERF_EVENT] = "perf_event", + [BPF_LINK_TYPE_KPROBE_MULTI] = "kprobe_multi", + [BPF_LINK_TYPE_STRUCT_OPS] = "struct_ops", +}; + +static const char * const map_type_name[] = { + [BPF_MAP_TYPE_UNSPEC] = "unspec", + [BPF_MAP_TYPE_HASH] = "hash", + [BPF_MAP_TYPE_ARRAY] = "array", + [BPF_MAP_TYPE_PROG_ARRAY] = "prog_array", + [BPF_MAP_TYPE_PERF_EVENT_ARRAY] = "perf_event_array", + [BPF_MAP_TYPE_PERCPU_HASH] = "percpu_hash", + [BPF_MAP_TYPE_PERCPU_ARRAY] = "percpu_array", + [BPF_MAP_TYPE_STACK_TRACE] = "stack_trace", + [BPF_MAP_TYPE_CGROUP_ARRAY] = "cgroup_array", + [BPF_MAP_TYPE_LRU_HASH] = "lru_hash", + [BPF_MAP_TYPE_LRU_PERCPU_HASH] = "lru_percpu_hash", + [BPF_MAP_TYPE_LPM_TRIE] = "lpm_trie", + [BPF_MAP_TYPE_ARRAY_OF_MAPS] = "array_of_maps", + [BPF_MAP_TYPE_HASH_OF_MAPS] = "hash_of_maps", + [BPF_MAP_TYPE_DEVMAP] = "devmap", + [BPF_MAP_TYPE_DEVMAP_HASH] = "devmap_hash", + [BPF_MAP_TYPE_SOCKMAP] = "sockmap", + [BPF_MAP_TYPE_CPUMAP] = "cpumap", + [BPF_MAP_TYPE_XSKMAP] = "xskmap", + [BPF_MAP_TYPE_SOCKHASH] = "sockhash", + [BPF_MAP_TYPE_CGROUP_STORAGE] = "cgroup_storage", + [BPF_MAP_TYPE_REUSEPORT_SOCKARRAY] = "reuseport_sockarray", + [BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE] = "percpu_cgroup_storage", + [BPF_MAP_TYPE_QUEUE] = "queue", + [BPF_MAP_TYPE_STACK] = "stack", + [BPF_MAP_TYPE_SK_STORAGE] = "sk_storage", + [BPF_MAP_TYPE_STRUCT_OPS] = "struct_ops", + [BPF_MAP_TYPE_RINGBUF] = "ringbuf", + [BPF_MAP_TYPE_INODE_STORAGE] = "inode_storage", + [BPF_MAP_TYPE_TASK_STORAGE] = "task_storage", + [BPF_MAP_TYPE_BLOOM_FILTER] = "bloom_filter", + [BPF_MAP_TYPE_USER_RINGBUF] = "user_ringbuf", + [BPF_MAP_TYPE_CGRP_STORAGE] = "cgrp_storage", +}; + +static const char * const prog_type_name[] = { + [BPF_PROG_TYPE_UNSPEC] = "unspec", + [BPF_PROG_TYPE_SOCKET_FILTER] = "socket_filter", + [BPF_PROG_TYPE_KPROBE] = "kprobe", + [BPF_PROG_TYPE_SCHED_CLS] = "sched_cls", + [BPF_PROG_TYPE_SCHED_ACT] = "sched_act", + [BPF_PROG_TYPE_TRACEPOINT] = "tracepoint", + [BPF_PROG_TYPE_XDP] = "xdp", + [BPF_PROG_TYPE_PERF_EVENT] = "perf_event", + [BPF_PROG_TYPE_CGROUP_SKB] = "cgroup_skb", + [BPF_PROG_TYPE_CGROUP_SOCK] = "cgroup_sock", + [BPF_PROG_TYPE_LWT_IN] = "lwt_in", + [BPF_PROG_TYPE_LWT_OUT] = "lwt_out", + [BPF_PROG_TYPE_LWT_XMIT] = "lwt_xmit", + [BPF_PROG_TYPE_SOCK_OPS] = "sock_ops", + [BPF_PROG_TYPE_SK_SKB] = "sk_skb", + [BPF_PROG_TYPE_CGROUP_DEVICE] = "cgroup_device", + [BPF_PROG_TYPE_SK_MSG] = "sk_msg", + [BPF_PROG_TYPE_RAW_TRACEPOINT] = "raw_tracepoint", + [BPF_PROG_TYPE_CGROUP_SOCK_ADDR] = "cgroup_sock_addr", + [BPF_PROG_TYPE_LWT_SEG6LOCAL] = "lwt_seg6local", + [BPF_PROG_TYPE_LIRC_MODE2] = "lirc_mode2", + [BPF_PROG_TYPE_SK_REUSEPORT] = "sk_reuseport", + [BPF_PROG_TYPE_FLOW_DISSECTOR] = "flow_dissector", + [BPF_PROG_TYPE_CGROUP_SYSCTL] = "cgroup_sysctl", + [BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE] = "raw_tracepoint_writable", + [BPF_PROG_TYPE_CGROUP_SOCKOPT] = "cgroup_sockopt", + [BPF_PROG_TYPE_TRACING] = "tracing", + [BPF_PROG_TYPE_STRUCT_OPS] = "struct_ops", + [BPF_PROG_TYPE_EXT] = "ext", + [BPF_PROG_TYPE_LSM] = "lsm", + [BPF_PROG_TYPE_SK_LOOKUP] = "sk_lookup", + [BPF_PROG_TYPE_SYSCALL] = "syscall", +}; + +static int __base_pr(enum libbpf_print_level level, const char *format, + va_list args) +{ + if (level == LIBBPF_DEBUG) + return 0; + + return vfprintf(stderr, format, args); +} + +static libbpf_print_fn_t __libbpf_pr = __base_pr; + +libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn) +{ + libbpf_print_fn_t old_print_fn = __libbpf_pr; + + __libbpf_pr = fn; + return old_print_fn; +} + +__printf(2, 3) +void libbpf_print(enum libbpf_print_level level, const char *format, ...) +{ + va_list args; + int old_errno; + + if (!__libbpf_pr) + return; + + old_errno = errno; + + va_start(args, format); + __libbpf_pr(level, format, args); + va_end(args); + + errno = old_errno; +} + +static void pr_perm_msg(int err) +{ + struct rlimit limit; + char buf[100]; + + if (err != -EPERM || geteuid() != 0) + return; + + err = getrlimit(RLIMIT_MEMLOCK, &limit); + if (err) + return; + + if (limit.rlim_cur == RLIM_INFINITY) + return; + + if (limit.rlim_cur < 1024) + snprintf(buf, sizeof(buf), "%zu bytes", (size_t)limit.rlim_cur); + else if (limit.rlim_cur < 1024*1024) + snprintf(buf, sizeof(buf), "%.1f KiB", (double)limit.rlim_cur / 1024); + else + snprintf(buf, sizeof(buf), "%.1f MiB", (double)limit.rlim_cur / (1024*1024)); + + pr_warn("permission error while running as root; try raising 'ulimit -l'? current value: %s\n", + buf); +} + +#define STRERR_BUFSIZE 128 + +/* Copied from tools/perf/util/util.h */ +#ifndef zfree +# define zfree(ptr) ({ free(*ptr); *ptr = NULL; }) +#endif + +#ifndef zclose +# define zclose(fd) ({ \ + int ___err = 0; \ + if ((fd) >= 0) \ + ___err = close((fd)); \ + fd = -1; \ + ___err; }) +#endif + +static inline __u64 ptr_to_u64(const void *ptr) +{ + return (__u64) (unsigned long) ptr; +} + +int libbpf_set_strict_mode(enum libbpf_strict_mode mode) +{ + /* as of v1.0 libbpf_set_strict_mode() is a no-op */ + return 0; +} + +__u32 libbpf_major_version(void) +{ + return LIBBPF_MAJOR_VERSION; +} + +__u32 libbpf_minor_version(void) +{ + return LIBBPF_MINOR_VERSION; +} + +const char *libbpf_version_string(void) +{ +#define __S(X) #X +#define _S(X) __S(X) + return "v" _S(LIBBPF_MAJOR_VERSION) "." _S(LIBBPF_MINOR_VERSION); +#undef _S +#undef __S +} + +enum reloc_type { + RELO_LD64, + RELO_CALL, + RELO_DATA, + RELO_EXTERN_LD64, + RELO_EXTERN_CALL, + RELO_SUBPROG_ADDR, + RELO_CORE, +}; + +struct reloc_desc { + enum reloc_type type; + int insn_idx; + union { + const struct bpf_core_relo *core_relo; /* used when type == RELO_CORE */ + struct { + int map_idx; + int sym_off; + }; + }; +}; + +/* stored as sec_def->cookie for all libbpf-supported SEC()s */ +enum sec_def_flags { + SEC_NONE = 0, + /* expected_attach_type is optional, if kernel doesn't support that */ + SEC_EXP_ATTACH_OPT = 1, + /* legacy, only used by libbpf_get_type_names() and + * libbpf_attach_type_by_name(), not used by libbpf itself at all. + * This used to be associated with cgroup (and few other) BPF programs + * that were attachable through BPF_PROG_ATTACH command. Pretty + * meaningless nowadays, though. + */ + SEC_ATTACHABLE = 2, + SEC_ATTACHABLE_OPT = SEC_ATTACHABLE | SEC_EXP_ATTACH_OPT, + /* attachment target is specified through BTF ID in either kernel or + * other BPF program's BTF object + */ + SEC_ATTACH_BTF = 4, + /* BPF program type allows sleeping/blocking in kernel */ + SEC_SLEEPABLE = 8, + /* BPF program support non-linear XDP buffer */ + SEC_XDP_FRAGS = 16, +}; + +struct bpf_sec_def { + char *sec; + enum bpf_prog_type prog_type; + enum bpf_attach_type expected_attach_type; + long cookie; + int handler_id; + + libbpf_prog_setup_fn_t prog_setup_fn; + libbpf_prog_prepare_load_fn_t prog_prepare_load_fn; + libbpf_prog_attach_fn_t prog_attach_fn; +}; + +/* + * bpf_prog should be a better name but it has been used in + * linux/filter.h. + */ +struct bpf_program { + char *name; + char *sec_name; + size_t sec_idx; + const struct bpf_sec_def *sec_def; + /* this program's instruction offset (in number of instructions) + * within its containing ELF section + */ + size_t sec_insn_off; + /* number of original instructions in ELF section belonging to this + * program, not taking into account subprogram instructions possible + * appended later during relocation + */ + size_t sec_insn_cnt; + /* Offset (in number of instructions) of the start of instruction + * belonging to this BPF program within its containing main BPF + * program. For the entry-point (main) BPF program, this is always + * zero. For a sub-program, this gets reset before each of main BPF + * programs are processed and relocated and is used to determined + * whether sub-program was already appended to the main program, and + * if yes, at which instruction offset. + */ + size_t sub_insn_off; + + /* instructions that belong to BPF program; insns[0] is located at + * sec_insn_off instruction within its ELF section in ELF file, so + * when mapping ELF file instruction index to the local instruction, + * one needs to subtract sec_insn_off; and vice versa. + */ + struct bpf_insn *insns; + /* actual number of instruction in this BPF program's image; for + * entry-point BPF programs this includes the size of main program + * itself plus all the used sub-programs, appended at the end + */ + size_t insns_cnt; + + struct reloc_desc *reloc_desc; + int nr_reloc; + + /* BPF verifier log settings */ + char *log_buf; + size_t log_size; + __u32 log_level; + + struct bpf_object *obj; + + int fd; + bool autoload; + bool autoattach; + bool mark_btf_static; + enum bpf_prog_type type; + enum bpf_attach_type expected_attach_type; + + int prog_ifindex; + __u32 attach_btf_obj_fd; + __u32 attach_btf_id; + __u32 attach_prog_fd; + + void *func_info; + __u32 func_info_rec_size; + __u32 func_info_cnt; + + void *line_info; + __u32 line_info_rec_size; + __u32 line_info_cnt; + __u32 prog_flags; +}; + +struct bpf_struct_ops { + const char *tname; + const struct btf_type *type; + struct bpf_program **progs; + __u32 *kern_func_off; + /* e.g. struct tcp_congestion_ops in bpf_prog's btf format */ + void *data; + /* e.g. struct bpf_struct_ops_tcp_congestion_ops in + * btf_vmlinux's format. + * struct bpf_struct_ops_tcp_congestion_ops { + * [... some other kernel fields ...] + * struct tcp_congestion_ops data; + * } + * kern_vdata-size == sizeof(struct bpf_struct_ops_tcp_congestion_ops) + * bpf_map__init_kern_struct_ops() will populate the "kern_vdata" + * from "data". + */ + void *kern_vdata; + __u32 type_id; +}; + +#define DATA_SEC ".data" +#define BSS_SEC ".bss" +#define RODATA_SEC ".rodata" +#define KCONFIG_SEC ".kconfig" +#define KSYMS_SEC ".ksyms" +#define STRUCT_OPS_SEC ".struct_ops" +#define STRUCT_OPS_LINK_SEC ".struct_ops.link" + +enum libbpf_map_type { + LIBBPF_MAP_UNSPEC, + LIBBPF_MAP_DATA, + LIBBPF_MAP_BSS, + LIBBPF_MAP_RODATA, + LIBBPF_MAP_KCONFIG, +}; + +struct bpf_map_def { + unsigned int type; + unsigned int key_size; + unsigned int value_size; + unsigned int max_entries; + unsigned int map_flags; +}; + +struct bpf_map { + struct bpf_object *obj; + char *name; + /* real_name is defined for special internal maps (.rodata*, + * .data*, .bss, .kconfig) and preserves their original ELF section + * name. This is important to be able to find corresponding BTF + * DATASEC information. + */ + char *real_name; + int fd; + int sec_idx; + size_t sec_offset; + int map_ifindex; + int inner_map_fd; + struct bpf_map_def def; + __u32 numa_node; + __u32 btf_var_idx; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + enum libbpf_map_type libbpf_type; + void *mmaped; + struct bpf_struct_ops *st_ops; + struct bpf_map *inner_map; + void **init_slots; + int init_slots_sz; + char *pin_path; + bool pinned; + bool reused; + bool autocreate; + __u64 map_extra; +}; + +enum extern_type { + EXT_UNKNOWN, + EXT_KCFG, + EXT_KSYM, +}; + +enum kcfg_type { + KCFG_UNKNOWN, + KCFG_CHAR, + KCFG_BOOL, + KCFG_INT, + KCFG_TRISTATE, + KCFG_CHAR_ARR, +}; + +struct extern_desc { + enum extern_type type; + int sym_idx; + int btf_id; + int sec_btf_id; + const char *name; + bool is_set; + bool is_weak; + union { + struct { + enum kcfg_type type; + int sz; + int align; + int data_off; + bool is_signed; + } kcfg; + struct { + unsigned long long addr; + + /* target btf_id of the corresponding kernel var. */ + int kernel_btf_obj_fd; + int kernel_btf_id; + + /* local btf_id of the ksym extern's type. */ + __u32 type_id; + /* BTF fd index to be patched in for insn->off, this is + * 0 for vmlinux BTF, index in obj->fd_array for module + * BTF + */ + __s16 btf_fd_idx; + } ksym; + }; +}; + +struct module_btf { + struct btf *btf; + char *name; + __u32 id; + int fd; + int fd_array_idx; +}; + +enum sec_type { + SEC_UNUSED = 0, + SEC_RELO, + SEC_BSS, + SEC_DATA, + SEC_RODATA, +}; + +struct elf_sec_desc { + enum sec_type sec_type; + Elf64_Shdr *shdr; + Elf_Data *data; +}; + +struct elf_state { + int fd; + const void *obj_buf; + size_t obj_buf_sz; + Elf *elf; + Elf64_Ehdr *ehdr; + Elf_Data *symbols; + Elf_Data *st_ops_data; + Elf_Data *st_ops_link_data; + size_t shstrndx; /* section index for section name strings */ + size_t strtabidx; + struct elf_sec_desc *secs; + size_t sec_cnt; + int btf_maps_shndx; + __u32 btf_maps_sec_btf_id; + int text_shndx; + int symbols_shndx; + int st_ops_shndx; + int st_ops_link_shndx; +}; + +struct usdt_manager; + +struct bpf_object { + char name[BPF_OBJ_NAME_LEN]; + char license[64]; + __u32 kern_version; + + struct bpf_program *programs; + size_t nr_programs; + struct bpf_map *maps; + size_t nr_maps; + size_t maps_cap; + + char *kconfig; + struct extern_desc *externs; + int nr_extern; + int kconfig_map_idx; + + bool loaded; + bool has_subcalls; + bool has_rodata; + + struct bpf_gen *gen_loader; + + /* Information when doing ELF related work. Only valid if efile.elf is not NULL */ + struct elf_state efile; + + struct btf *btf; + struct btf_ext *btf_ext; + + /* Parse and load BTF vmlinux if any of the programs in the object need + * it at load time. + */ + struct btf *btf_vmlinux; + /* Path to the custom BTF to be used for BPF CO-RE relocations as an + * override for vmlinux BTF. + */ + char *btf_custom_path; + /* vmlinux BTF override for CO-RE relocations */ + struct btf *btf_vmlinux_override; + /* Lazily initialized kernel module BTFs */ + struct module_btf *btf_modules; + bool btf_modules_loaded; + size_t btf_module_cnt; + size_t btf_module_cap; + + /* optional log settings passed to BPF_BTF_LOAD and BPF_PROG_LOAD commands */ + char *log_buf; + size_t log_size; + __u32 log_level; + + int *fd_array; + size_t fd_array_cap; + size_t fd_array_cnt; + + struct usdt_manager *usdt_man; + + char path[]; +}; + +static const char *elf_sym_str(const struct bpf_object *obj, size_t off); +static const char *elf_sec_str(const struct bpf_object *obj, size_t off); +static Elf_Scn *elf_sec_by_idx(const struct bpf_object *obj, size_t idx); +static Elf_Scn *elf_sec_by_name(const struct bpf_object *obj, const char *name); +static Elf64_Shdr *elf_sec_hdr(const struct bpf_object *obj, Elf_Scn *scn); +static const char *elf_sec_name(const struct bpf_object *obj, Elf_Scn *scn); +static Elf_Data *elf_sec_data(const struct bpf_object *obj, Elf_Scn *scn); +static Elf64_Sym *elf_sym_by_idx(const struct bpf_object *obj, size_t idx); +static Elf64_Rel *elf_rel_by_idx(Elf_Data *data, size_t idx); + +void bpf_program__unload(struct bpf_program *prog) +{ + if (!prog) + return; + + zclose(prog->fd); + + zfree(&prog->func_info); + zfree(&prog->line_info); +} + +static void bpf_program__exit(struct bpf_program *prog) +{ + if (!prog) + return; + + bpf_program__unload(prog); + zfree(&prog->name); + zfree(&prog->sec_name); + zfree(&prog->insns); + zfree(&prog->reloc_desc); + + prog->nr_reloc = 0; + prog->insns_cnt = 0; + prog->sec_idx = -1; +} + +static bool insn_is_subprog_call(const struct bpf_insn *insn) +{ + return BPF_CLASS(insn->code) == BPF_JMP && + BPF_OP(insn->code) == BPF_CALL && + BPF_SRC(insn->code) == BPF_K && + insn->src_reg == BPF_PSEUDO_CALL && + insn->dst_reg == 0 && + insn->off == 0; +} + +static bool is_call_insn(const struct bpf_insn *insn) +{ + return insn->code == (BPF_JMP | BPF_CALL); +} + +static bool insn_is_pseudo_func(struct bpf_insn *insn) +{ + return is_ldimm64_insn(insn) && insn->src_reg == BPF_PSEUDO_FUNC; +} + +static int +bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog, + const char *name, size_t sec_idx, const char *sec_name, + size_t sec_off, void *insn_data, size_t insn_data_sz) +{ + if (insn_data_sz == 0 || insn_data_sz % BPF_INSN_SZ || sec_off % BPF_INSN_SZ) { + pr_warn("sec '%s': corrupted program '%s', offset %zu, size %zu\n", + sec_name, name, sec_off, insn_data_sz); + return -EINVAL; + } + + memset(prog, 0, sizeof(*prog)); + prog->obj = obj; + + prog->sec_idx = sec_idx; + prog->sec_insn_off = sec_off / BPF_INSN_SZ; + prog->sec_insn_cnt = insn_data_sz / BPF_INSN_SZ; + /* insns_cnt can later be increased by appending used subprograms */ + prog->insns_cnt = prog->sec_insn_cnt; + + prog->type = BPF_PROG_TYPE_UNSPEC; + prog->fd = -1; + + /* libbpf's convention for SEC("?abc...") is that it's just like + * SEC("abc...") but the corresponding bpf_program starts out with + * autoload set to false. + */ + if (sec_name[0] == '?') { + prog->autoload = false; + /* from now on forget there was ? in section name */ + sec_name++; + } else { + prog->autoload = true; + } + + prog->autoattach = true; + + /* inherit object's log_level */ + prog->log_level = obj->log_level; + + prog->sec_name = strdup(sec_name); + if (!prog->sec_name) + goto errout; + + prog->name = strdup(name); + if (!prog->name) + goto errout; + + prog->insns = malloc(insn_data_sz); + if (!prog->insns) + goto errout; + memcpy(prog->insns, insn_data, insn_data_sz); + + return 0; +errout: + pr_warn("sec '%s': failed to allocate memory for prog '%s'\n", sec_name, name); + bpf_program__exit(prog); + return -ENOMEM; +} + +static int +bpf_object__add_programs(struct bpf_object *obj, Elf_Data *sec_data, + const char *sec_name, int sec_idx) +{ + Elf_Data *symbols = obj->efile.symbols; + struct bpf_program *prog, *progs; + void *data = sec_data->d_buf; + size_t sec_sz = sec_data->d_size, sec_off, prog_sz, nr_syms; + int nr_progs, err, i; + const char *name; + Elf64_Sym *sym; + + progs = obj->programs; + nr_progs = obj->nr_programs; + nr_syms = symbols->d_size / sizeof(Elf64_Sym); + + for (i = 0; i < nr_syms; i++) { + sym = elf_sym_by_idx(obj, i); + + if (sym->st_shndx != sec_idx) + continue; + if (ELF64_ST_TYPE(sym->st_info) != STT_FUNC) + continue; + + prog_sz = sym->st_size; + sec_off = sym->st_value; + + name = elf_sym_str(obj, sym->st_name); + if (!name) { + pr_warn("sec '%s': failed to get symbol name for offset %zu\n", + sec_name, sec_off); + return -LIBBPF_ERRNO__FORMAT; + } + + if (sec_off + prog_sz > sec_sz) { + pr_warn("sec '%s': program at offset %zu crosses section boundary\n", + sec_name, sec_off); + return -LIBBPF_ERRNO__FORMAT; + } + + if (sec_idx != obj->efile.text_shndx && ELF64_ST_BIND(sym->st_info) == STB_LOCAL) { + pr_warn("sec '%s': program '%s' is static and not supported\n", sec_name, name); + return -ENOTSUP; + } + + pr_debug("sec '%s': found program '%s' at insn offset %zu (%zu bytes), code size %zu insns (%zu bytes)\n", + sec_name, name, sec_off / BPF_INSN_SZ, sec_off, prog_sz / BPF_INSN_SZ, prog_sz); + + progs = libbpf_reallocarray(progs, nr_progs + 1, sizeof(*progs)); + if (!progs) { + /* + * In this case the original obj->programs + * is still valid, so don't need special treat for + * bpf_close_object(). + */ + pr_warn("sec '%s': failed to alloc memory for new program '%s'\n", + sec_name, name); + return -ENOMEM; + } + obj->programs = progs; + + prog = &progs[nr_progs]; + + err = bpf_object__init_prog(obj, prog, name, sec_idx, sec_name, + sec_off, data + sec_off, prog_sz); + if (err) + return err; + + /* if function is a global/weak symbol, but has restricted + * (STV_HIDDEN or STV_INTERNAL) visibility, mark its BTF FUNC + * as static to enable more permissive BPF verification mode + * with more outside context available to BPF verifier + */ + if (ELF64_ST_BIND(sym->st_info) != STB_LOCAL + && (ELF64_ST_VISIBILITY(sym->st_other) == STV_HIDDEN + || ELF64_ST_VISIBILITY(sym->st_other) == STV_INTERNAL)) + prog->mark_btf_static = true; + + nr_progs++; + obj->nr_programs = nr_progs; + } + + return 0; +} + +static const struct btf_member * +find_member_by_offset(const struct btf_type *t, __u32 bit_offset) +{ + struct btf_member *m; + int i; + + for (i = 0, m = btf_members(t); i < btf_vlen(t); i++, m++) { + if (btf_member_bit_offset(t, i) == bit_offset) + return m; + } + + return NULL; +} + +static const struct btf_member * +find_member_by_name(const struct btf *btf, const struct btf_type *t, + const char *name) +{ + struct btf_member *m; + int i; + + for (i = 0, m = btf_members(t); i < btf_vlen(t); i++, m++) { + if (!strcmp(btf__name_by_offset(btf, m->name_off), name)) + return m; + } + + return NULL; +} + +#define STRUCT_OPS_VALUE_PREFIX "bpf_struct_ops_" +static int find_btf_by_prefix_kind(const struct btf *btf, const char *prefix, + const char *name, __u32 kind); + +static int +find_struct_ops_kern_types(const struct btf *btf, const char *tname, + const struct btf_type **type, __u32 *type_id, + const struct btf_type **vtype, __u32 *vtype_id, + const struct btf_member **data_member) +{ + const struct btf_type *kern_type, *kern_vtype; + const struct btf_member *kern_data_member; + __s32 kern_vtype_id, kern_type_id; + __u32 i; + + kern_type_id = btf__find_by_name_kind(btf, tname, BTF_KIND_STRUCT); + if (kern_type_id < 0) { + pr_warn("struct_ops init_kern: struct %s is not found in kernel BTF\n", + tname); + return kern_type_id; + } + kern_type = btf__type_by_id(btf, kern_type_id); + + /* Find the corresponding "map_value" type that will be used + * in map_update(BPF_MAP_TYPE_STRUCT_OPS). For example, + * find "struct bpf_struct_ops_tcp_congestion_ops" from the + * btf_vmlinux. + */ + kern_vtype_id = find_btf_by_prefix_kind(btf, STRUCT_OPS_VALUE_PREFIX, + tname, BTF_KIND_STRUCT); + if (kern_vtype_id < 0) { + pr_warn("struct_ops init_kern: struct %s%s is not found in kernel BTF\n", + STRUCT_OPS_VALUE_PREFIX, tname); + return kern_vtype_id; + } + kern_vtype = btf__type_by_id(btf, kern_vtype_id); + + /* Find "struct tcp_congestion_ops" from + * struct bpf_struct_ops_tcp_congestion_ops { + * [ ... ] + * struct tcp_congestion_ops data; + * } + */ + kern_data_member = btf_members(kern_vtype); + for (i = 0; i < btf_vlen(kern_vtype); i++, kern_data_member++) { + if (kern_data_member->type == kern_type_id) + break; + } + if (i == btf_vlen(kern_vtype)) { + pr_warn("struct_ops init_kern: struct %s data is not found in struct %s%s\n", + tname, STRUCT_OPS_VALUE_PREFIX, tname); + return -EINVAL; + } + + *type = kern_type; + *type_id = kern_type_id; + *vtype = kern_vtype; + *vtype_id = kern_vtype_id; + *data_member = kern_data_member; + + return 0; +} + +static bool bpf_map__is_struct_ops(const struct bpf_map *map) +{ + return map->def.type == BPF_MAP_TYPE_STRUCT_OPS; +} + +/* Init the map's fields that depend on kern_btf */ +static int bpf_map__init_kern_struct_ops(struct bpf_map *map, + const struct btf *btf, + const struct btf *kern_btf) +{ + const struct btf_member *member, *kern_member, *kern_data_member; + const struct btf_type *type, *kern_type, *kern_vtype; + __u32 i, kern_type_id, kern_vtype_id, kern_data_off; + struct bpf_struct_ops *st_ops; + void *data, *kern_data; + const char *tname; + int err; + + st_ops = map->st_ops; + type = st_ops->type; + tname = st_ops->tname; + err = find_struct_ops_kern_types(kern_btf, tname, + &kern_type, &kern_type_id, + &kern_vtype, &kern_vtype_id, + &kern_data_member); + if (err) + return err; + + pr_debug("struct_ops init_kern %s: type_id:%u kern_type_id:%u kern_vtype_id:%u\n", + map->name, st_ops->type_id, kern_type_id, kern_vtype_id); + + map->def.value_size = kern_vtype->size; + map->btf_vmlinux_value_type_id = kern_vtype_id; + + st_ops->kern_vdata = calloc(1, kern_vtype->size); + if (!st_ops->kern_vdata) + return -ENOMEM; + + data = st_ops->data; + kern_data_off = kern_data_member->offset / 8; + kern_data = st_ops->kern_vdata + kern_data_off; + + member = btf_members(type); + for (i = 0; i < btf_vlen(type); i++, member++) { + const struct btf_type *mtype, *kern_mtype; + __u32 mtype_id, kern_mtype_id; + void *mdata, *kern_mdata; + __s64 msize, kern_msize; + __u32 moff, kern_moff; + __u32 kern_member_idx; + const char *mname; + + mname = btf__name_by_offset(btf, member->name_off); + kern_member = find_member_by_name(kern_btf, kern_type, mname); + if (!kern_member) { + pr_warn("struct_ops init_kern %s: Cannot find member %s in kernel BTF\n", + map->name, mname); + return -ENOTSUP; + } + + kern_member_idx = kern_member - btf_members(kern_type); + if (btf_member_bitfield_size(type, i) || + btf_member_bitfield_size(kern_type, kern_member_idx)) { + pr_warn("struct_ops init_kern %s: bitfield %s is not supported\n", + map->name, mname); + return -ENOTSUP; + } + + moff = member->offset / 8; + kern_moff = kern_member->offset / 8; + + mdata = data + moff; + kern_mdata = kern_data + kern_moff; + + mtype = skip_mods_and_typedefs(btf, member->type, &mtype_id); + kern_mtype = skip_mods_and_typedefs(kern_btf, kern_member->type, + &kern_mtype_id); + if (BTF_INFO_KIND(mtype->info) != + BTF_INFO_KIND(kern_mtype->info)) { + pr_warn("struct_ops init_kern %s: Unmatched member type %s %u != %u(kernel)\n", + map->name, mname, BTF_INFO_KIND(mtype->info), + BTF_INFO_KIND(kern_mtype->info)); + return -ENOTSUP; + } + + if (btf_is_ptr(mtype)) { + struct bpf_program *prog; + + prog = st_ops->progs[i]; + if (!prog) + continue; + + kern_mtype = skip_mods_and_typedefs(kern_btf, + kern_mtype->type, + &kern_mtype_id); + + /* mtype->type must be a func_proto which was + * guaranteed in bpf_object__collect_st_ops_relos(), + * so only check kern_mtype for func_proto here. + */ + if (!btf_is_func_proto(kern_mtype)) { + pr_warn("struct_ops init_kern %s: kernel member %s is not a func ptr\n", + map->name, mname); + return -ENOTSUP; + } + + prog->attach_btf_id = kern_type_id; + prog->expected_attach_type = kern_member_idx; + + st_ops->kern_func_off[i] = kern_data_off + kern_moff; + + pr_debug("struct_ops init_kern %s: func ptr %s is set to prog %s from data(+%u) to kern_data(+%u)\n", + map->name, mname, prog->name, moff, + kern_moff); + + continue; + } + + msize = btf__resolve_size(btf, mtype_id); + kern_msize = btf__resolve_size(kern_btf, kern_mtype_id); + if (msize < 0 || kern_msize < 0 || msize != kern_msize) { + pr_warn("struct_ops init_kern %s: Error in size of member %s: %zd != %zd(kernel)\n", + map->name, mname, (ssize_t)msize, + (ssize_t)kern_msize); + return -ENOTSUP; + } + + pr_debug("struct_ops init_kern %s: copy %s %u bytes from data(+%u) to kern_data(+%u)\n", + map->name, mname, (unsigned int)msize, + moff, kern_moff); + memcpy(kern_mdata, mdata, msize); + } + + return 0; +} + +static int bpf_object__init_kern_struct_ops_maps(struct bpf_object *obj) +{ + struct bpf_map *map; + size_t i; + int err; + + for (i = 0; i < obj->nr_maps; i++) { + map = &obj->maps[i]; + + if (!bpf_map__is_struct_ops(map)) + continue; + + err = bpf_map__init_kern_struct_ops(map, obj->btf, + obj->btf_vmlinux); + if (err) + return err; + } + + return 0; +} + +static int init_struct_ops_maps(struct bpf_object *obj, const char *sec_name, + int shndx, Elf_Data *data, __u32 map_flags) +{ + const struct btf_type *type, *datasec; + const struct btf_var_secinfo *vsi; + struct bpf_struct_ops *st_ops; + const char *tname, *var_name; + __s32 type_id, datasec_id; + const struct btf *btf; + struct bpf_map *map; + __u32 i; + + if (shndx == -1) + return 0; + + btf = obj->btf; + datasec_id = btf__find_by_name_kind(btf, sec_name, + BTF_KIND_DATASEC); + if (datasec_id < 0) { + pr_warn("struct_ops init: DATASEC %s not found\n", + sec_name); + return -EINVAL; + } + + datasec = btf__type_by_id(btf, datasec_id); + vsi = btf_var_secinfos(datasec); + for (i = 0; i < btf_vlen(datasec); i++, vsi++) { + type = btf__type_by_id(obj->btf, vsi->type); + var_name = btf__name_by_offset(obj->btf, type->name_off); + + type_id = btf__resolve_type(obj->btf, vsi->type); + if (type_id < 0) { + pr_warn("struct_ops init: Cannot resolve var type_id %u in DATASEC %s\n", + vsi->type, sec_name); + return -EINVAL; + } + + type = btf__type_by_id(obj->btf, type_id); + tname = btf__name_by_offset(obj->btf, type->name_off); + if (!tname[0]) { + pr_warn("struct_ops init: anonymous type is not supported\n"); + return -ENOTSUP; + } + if (!btf_is_struct(type)) { + pr_warn("struct_ops init: %s is not a struct\n", tname); + return -EINVAL; + } + + map = bpf_object__add_map(obj); + if (IS_ERR(map)) + return PTR_ERR(map); + + map->sec_idx = shndx; + map->sec_offset = vsi->offset; + map->name = strdup(var_name); + if (!map->name) + return -ENOMEM; + + map->def.type = BPF_MAP_TYPE_STRUCT_OPS; + map->def.key_size = sizeof(int); + map->def.value_size = type->size; + map->def.max_entries = 1; + map->def.map_flags = map_flags; + + map->st_ops = calloc(1, sizeof(*map->st_ops)); + if (!map->st_ops) + return -ENOMEM; + st_ops = map->st_ops; + st_ops->data = malloc(type->size); + st_ops->progs = calloc(btf_vlen(type), sizeof(*st_ops->progs)); + st_ops->kern_func_off = malloc(btf_vlen(type) * + sizeof(*st_ops->kern_func_off)); + if (!st_ops->data || !st_ops->progs || !st_ops->kern_func_off) + return -ENOMEM; + + if (vsi->offset + type->size > data->d_size) { + pr_warn("struct_ops init: var %s is beyond the end of DATASEC %s\n", + var_name, sec_name); + return -EINVAL; + } + + memcpy(st_ops->data, + data->d_buf + vsi->offset, + type->size); + st_ops->tname = tname; + st_ops->type = type; + st_ops->type_id = type_id; + + pr_debug("struct_ops init: struct %s(type_id=%u) %s found at offset %u\n", + tname, type_id, var_name, vsi->offset); + } + + return 0; +} + +static int bpf_object_init_struct_ops(struct bpf_object *obj) +{ + int err; + + err = init_struct_ops_maps(obj, STRUCT_OPS_SEC, obj->efile.st_ops_shndx, + obj->efile.st_ops_data, 0); + err = err ?: init_struct_ops_maps(obj, STRUCT_OPS_LINK_SEC, + obj->efile.st_ops_link_shndx, + obj->efile.st_ops_link_data, + BPF_F_LINK); + return err; +} + +static struct bpf_object *bpf_object__new(const char *path, + const void *obj_buf, + size_t obj_buf_sz, + const char *obj_name) +{ + struct bpf_object *obj; + char *end; + + obj = calloc(1, sizeof(struct bpf_object) + strlen(path) + 1); + if (!obj) { + pr_warn("alloc memory failed for %s\n", path); + return ERR_PTR(-ENOMEM); + } + + strcpy(obj->path, path); + if (obj_name) { + libbpf_strlcpy(obj->name, obj_name, sizeof(obj->name)); + } else { + /* Using basename() GNU version which doesn't modify arg. */ + libbpf_strlcpy(obj->name, basename((void *)path), sizeof(obj->name)); + end = strchr(obj->name, '.'); + if (end) + *end = 0; + } + + obj->efile.fd = -1; + /* + * Caller of this function should also call + * bpf_object__elf_finish() after data collection to return + * obj_buf to user. If not, we should duplicate the buffer to + * avoid user freeing them before elf finish. + */ + obj->efile.obj_buf = obj_buf; + obj->efile.obj_buf_sz = obj_buf_sz; + obj->efile.btf_maps_shndx = -1; + obj->efile.st_ops_shndx = -1; + obj->efile.st_ops_link_shndx = -1; + obj->kconfig_map_idx = -1; + + obj->kern_version = get_kernel_version(); + obj->loaded = false; + + return obj; +} + +static void bpf_object__elf_finish(struct bpf_object *obj) +{ + if (!obj->efile.elf) + return; + + elf_end(obj->efile.elf); + obj->efile.elf = NULL; + obj->efile.symbols = NULL; + obj->efile.st_ops_data = NULL; + obj->efile.st_ops_link_data = NULL; + + zfree(&obj->efile.secs); + obj->efile.sec_cnt = 0; + zclose(obj->efile.fd); + obj->efile.obj_buf = NULL; + obj->efile.obj_buf_sz = 0; +} + +static int bpf_object__elf_init(struct bpf_object *obj) +{ + Elf64_Ehdr *ehdr; + int err = 0; + Elf *elf; + + if (obj->efile.elf) { + pr_warn("elf: init internal error\n"); + return -LIBBPF_ERRNO__LIBELF; + } + + if (obj->efile.obj_buf_sz > 0) { + /* obj_buf should have been validated by bpf_object__open_mem(). */ + elf = elf_memory((char *)obj->efile.obj_buf, obj->efile.obj_buf_sz); + } else { + obj->efile.fd = open(obj->path, O_RDONLY | O_CLOEXEC); + if (obj->efile.fd < 0) { + char errmsg[STRERR_BUFSIZE], *cp; + + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("elf: failed to open %s: %s\n", obj->path, cp); + return err; + } + + elf = elf_begin(obj->efile.fd, ELF_C_READ_MMAP, NULL); + } + + if (!elf) { + pr_warn("elf: failed to open %s as ELF file: %s\n", obj->path, elf_errmsg(-1)); + err = -LIBBPF_ERRNO__LIBELF; + goto errout; + } + + obj->efile.elf = elf; + + if (elf_kind(elf) != ELF_K_ELF) { + err = -LIBBPF_ERRNO__FORMAT; + pr_warn("elf: '%s' is not a proper ELF object\n", obj->path); + goto errout; + } + + if (gelf_getclass(elf) != ELFCLASS64) { + err = -LIBBPF_ERRNO__FORMAT; + pr_warn("elf: '%s' is not a 64-bit ELF object\n", obj->path); + goto errout; + } + + obj->efile.ehdr = ehdr = elf64_getehdr(elf); + if (!obj->efile.ehdr) { + pr_warn("elf: failed to get ELF header from %s: %s\n", obj->path, elf_errmsg(-1)); + err = -LIBBPF_ERRNO__FORMAT; + goto errout; + } + + if (elf_getshdrstrndx(elf, &obj->efile.shstrndx)) { + pr_warn("elf: failed to get section names section index for %s: %s\n", + obj->path, elf_errmsg(-1)); + err = -LIBBPF_ERRNO__FORMAT; + goto errout; + } + + /* Elf is corrupted/truncated, avoid calling elf_strptr. */ + if (!elf_rawdata(elf_getscn(elf, obj->efile.shstrndx), NULL)) { + pr_warn("elf: failed to get section names strings from %s: %s\n", + obj->path, elf_errmsg(-1)); + err = -LIBBPF_ERRNO__FORMAT; + goto errout; + } + + /* Old LLVM set e_machine to EM_NONE */ + if (ehdr->e_type != ET_REL || (ehdr->e_machine && ehdr->e_machine != EM_BPF)) { + pr_warn("elf: %s is not a valid eBPF object file\n", obj->path); + err = -LIBBPF_ERRNO__FORMAT; + goto errout; + } + + return 0; +errout: + bpf_object__elf_finish(obj); + return err; +} + +static int bpf_object__check_endianness(struct bpf_object *obj) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + if (obj->efile.ehdr->e_ident[EI_DATA] == ELFDATA2LSB) + return 0; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + if (obj->efile.ehdr->e_ident[EI_DATA] == ELFDATA2MSB) + return 0; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif + pr_warn("elf: endianness mismatch in %s.\n", obj->path); + return -LIBBPF_ERRNO__ENDIAN; +} + +static int +bpf_object__init_license(struct bpf_object *obj, void *data, size_t size) +{ + if (!data) { + pr_warn("invalid license section in %s\n", obj->path); + return -LIBBPF_ERRNO__FORMAT; + } + /* libbpf_strlcpy() only copies first N - 1 bytes, so size + 1 won't + * go over allowed ELF data section buffer + */ + libbpf_strlcpy(obj->license, data, min(size + 1, sizeof(obj->license))); + pr_debug("license of %s is %s\n", obj->path, obj->license); + return 0; +} + +static int +bpf_object__init_kversion(struct bpf_object *obj, void *data, size_t size) +{ + __u32 kver; + + if (!data || size != sizeof(kver)) { + pr_warn("invalid kver section in %s\n", obj->path); + return -LIBBPF_ERRNO__FORMAT; + } + memcpy(&kver, data, sizeof(kver)); + obj->kern_version = kver; + pr_debug("kernel version of %s is %x\n", obj->path, obj->kern_version); + return 0; +} + +static bool bpf_map_type__is_map_in_map(enum bpf_map_type type) +{ + if (type == BPF_MAP_TYPE_ARRAY_OF_MAPS || + type == BPF_MAP_TYPE_HASH_OF_MAPS) + return true; + return false; +} + +static int find_elf_sec_sz(const struct bpf_object *obj, const char *name, __u32 *size) +{ + Elf_Data *data; + Elf_Scn *scn; + + if (!name) + return -EINVAL; + + scn = elf_sec_by_name(obj, name); + data = elf_sec_data(obj, scn); + if (data) { + *size = data->d_size; + return 0; /* found it */ + } + + return -ENOENT; +} + +static Elf64_Sym *find_elf_var_sym(const struct bpf_object *obj, const char *name) +{ + Elf_Data *symbols = obj->efile.symbols; + const char *sname; + size_t si; + + for (si = 0; si < symbols->d_size / sizeof(Elf64_Sym); si++) { + Elf64_Sym *sym = elf_sym_by_idx(obj, si); + + if (ELF64_ST_TYPE(sym->st_info) != STT_OBJECT) + continue; + + if (ELF64_ST_BIND(sym->st_info) != STB_GLOBAL && + ELF64_ST_BIND(sym->st_info) != STB_WEAK) + continue; + + sname = elf_sym_str(obj, sym->st_name); + if (!sname) { + pr_warn("failed to get sym name string for var %s\n", name); + return ERR_PTR(-EIO); + } + if (strcmp(name, sname) == 0) + return sym; + } + + return ERR_PTR(-ENOENT); +} + +static struct bpf_map *bpf_object__add_map(struct bpf_object *obj) +{ + struct bpf_map *map; + int err; + + err = libbpf_ensure_mem((void **)&obj->maps, &obj->maps_cap, + sizeof(*obj->maps), obj->nr_maps + 1); + if (err) + return ERR_PTR(err); + + map = &obj->maps[obj->nr_maps++]; + map->obj = obj; + map->fd = -1; + map->inner_map_fd = -1; + map->autocreate = true; + + return map; +} + +static size_t bpf_map_mmap_sz(const struct bpf_map *map) +{ + long page_sz = sysconf(_SC_PAGE_SIZE); + size_t map_sz; + + map_sz = (size_t)roundup(map->def.value_size, 8) * map->def.max_entries; + map_sz = roundup(map_sz, page_sz); + return map_sz; +} + +static char *internal_map_name(struct bpf_object *obj, const char *real_name) +{ + char map_name[BPF_OBJ_NAME_LEN], *p; + int pfx_len, sfx_len = max((size_t)7, strlen(real_name)); + + /* This is one of the more confusing parts of libbpf for various + * reasons, some of which are historical. The original idea for naming + * internal names was to include as much of BPF object name prefix as + * possible, so that it can be distinguished from similar internal + * maps of a different BPF object. + * As an example, let's say we have bpf_object named 'my_object_name' + * and internal map corresponding to '.rodata' ELF section. The final + * map name advertised to user and to the kernel will be + * 'my_objec.rodata', taking first 8 characters of object name and + * entire 7 characters of '.rodata'. + * Somewhat confusingly, if internal map ELF section name is shorter + * than 7 characters, e.g., '.bss', we still reserve 7 characters + * for the suffix, even though we only have 4 actual characters, and + * resulting map will be called 'my_objec.bss', not even using all 15 + * characters allowed by the kernel. Oh well, at least the truncated + * object name is somewhat consistent in this case. But if the map + * name is '.kconfig', we'll still have entirety of '.kconfig' added + * (8 chars) and thus will be left with only first 7 characters of the + * object name ('my_obje'). Happy guessing, user, that the final map + * name will be "my_obje.kconfig". + * Now, with libbpf starting to support arbitrarily named .rodata.* + * and .data.* data sections, it's possible that ELF section name is + * longer than allowed 15 chars, so we now need to be careful to take + * only up to 15 first characters of ELF name, taking no BPF object + * name characters at all. So '.rodata.abracadabra' will result in + * '.rodata.abracad' kernel and user-visible name. + * We need to keep this convoluted logic intact for .data, .bss and + * .rodata maps, but for new custom .data.custom and .rodata.custom + * maps we use their ELF names as is, not prepending bpf_object name + * in front. We still need to truncate them to 15 characters for the + * kernel. Full name can be recovered for such maps by using DATASEC + * BTF type associated with such map's value type, though. + */ + if (sfx_len >= BPF_OBJ_NAME_LEN) + sfx_len = BPF_OBJ_NAME_LEN - 1; + + /* if there are two or more dots in map name, it's a custom dot map */ + if (strchr(real_name + 1, '.') != NULL) + pfx_len = 0; + else + pfx_len = min((size_t)BPF_OBJ_NAME_LEN - sfx_len - 1, strlen(obj->name)); + + snprintf(map_name, sizeof(map_name), "%.*s%.*s", pfx_len, obj->name, + sfx_len, real_name); + + /* sanitise map name to characters allowed by kernel */ + for (p = map_name; *p && p < map_name + sizeof(map_name); p++) + if (!isalnum(*p) && *p != '_' && *p != '.') + *p = '_'; + + return strdup(map_name); +} + +static int +map_fill_btf_type_info(struct bpf_object *obj, struct bpf_map *map); + +/* Internal BPF map is mmap()'able only if at least one of corresponding + * DATASEC's VARs are to be exposed through BPF skeleton. I.e., it's a GLOBAL + * variable and it's not marked as __hidden (which turns it into, effectively, + * a STATIC variable). + */ +static bool map_is_mmapable(struct bpf_object *obj, struct bpf_map *map) +{ + const struct btf_type *t, *vt; + struct btf_var_secinfo *vsi; + int i, n; + + if (!map->btf_value_type_id) + return false; + + t = btf__type_by_id(obj->btf, map->btf_value_type_id); + if (!btf_is_datasec(t)) + return false; + + vsi = btf_var_secinfos(t); + for (i = 0, n = btf_vlen(t); i < n; i++, vsi++) { + vt = btf__type_by_id(obj->btf, vsi->type); + if (!btf_is_var(vt)) + continue; + + if (btf_var(vt)->linkage != BTF_VAR_STATIC) + return true; + } + + return false; +} + +static int +bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type, + const char *real_name, int sec_idx, void *data, size_t data_sz) +{ + struct bpf_map_def *def; + struct bpf_map *map; + int err; + + map = bpf_object__add_map(obj); + if (IS_ERR(map)) + return PTR_ERR(map); + + map->libbpf_type = type; + map->sec_idx = sec_idx; + map->sec_offset = 0; + map->real_name = strdup(real_name); + map->name = internal_map_name(obj, real_name); + if (!map->real_name || !map->name) { + zfree(&map->real_name); + zfree(&map->name); + return -ENOMEM; + } + + def = &map->def; + def->type = BPF_MAP_TYPE_ARRAY; + def->key_size = sizeof(int); + def->value_size = data_sz; + def->max_entries = 1; + def->map_flags = type == LIBBPF_MAP_RODATA || type == LIBBPF_MAP_KCONFIG + ? BPF_F_RDONLY_PROG : 0; + + /* failures are fine because of maps like .rodata.str1.1 */ + (void) map_fill_btf_type_info(obj, map); + + if (map_is_mmapable(obj, map)) + def->map_flags |= BPF_F_MMAPABLE; + + pr_debug("map '%s' (global data): at sec_idx %d, offset %zu, flags %x.\n", + map->name, map->sec_idx, map->sec_offset, def->map_flags); + + map->mmaped = mmap(NULL, bpf_map_mmap_sz(map), PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (map->mmaped == MAP_FAILED) { + err = -errno; + map->mmaped = NULL; + pr_warn("failed to alloc map '%s' content buffer: %d\n", + map->name, err); + zfree(&map->real_name); + zfree(&map->name); + return err; + } + + if (data) + memcpy(map->mmaped, data, data_sz); + + pr_debug("map %td is \"%s\"\n", map - obj->maps, map->name); + return 0; +} + +static int bpf_object__init_global_data_maps(struct bpf_object *obj) +{ + struct elf_sec_desc *sec_desc; + const char *sec_name; + int err = 0, sec_idx; + + /* + * Populate obj->maps with libbpf internal maps. + */ + for (sec_idx = 1; sec_idx < obj->efile.sec_cnt; sec_idx++) { + sec_desc = &obj->efile.secs[sec_idx]; + + /* Skip recognized sections with size 0. */ + if (!sec_desc->data || sec_desc->data->d_size == 0) + continue; + + switch (sec_desc->sec_type) { + case SEC_DATA: + sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, sec_idx)); + err = bpf_object__init_internal_map(obj, LIBBPF_MAP_DATA, + sec_name, sec_idx, + sec_desc->data->d_buf, + sec_desc->data->d_size); + break; + case SEC_RODATA: + obj->has_rodata = true; + sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, sec_idx)); + err = bpf_object__init_internal_map(obj, LIBBPF_MAP_RODATA, + sec_name, sec_idx, + sec_desc->data->d_buf, + sec_desc->data->d_size); + break; + case SEC_BSS: + sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, sec_idx)); + err = bpf_object__init_internal_map(obj, LIBBPF_MAP_BSS, + sec_name, sec_idx, + NULL, + sec_desc->data->d_size); + break; + default: + /* skip */ + break; + } + if (err) + return err; + } + return 0; +} + + +static struct extern_desc *find_extern_by_name(const struct bpf_object *obj, + const void *name) +{ + int i; + + for (i = 0; i < obj->nr_extern; i++) { + if (strcmp(obj->externs[i].name, name) == 0) + return &obj->externs[i]; + } + return NULL; +} + +static int set_kcfg_value_tri(struct extern_desc *ext, void *ext_val, + char value) +{ + switch (ext->kcfg.type) { + case KCFG_BOOL: + if (value == 'm') { + pr_warn("extern (kcfg) '%s': value '%c' implies tristate or char type\n", + ext->name, value); + return -EINVAL; + } + *(bool *)ext_val = value == 'y' ? true : false; + break; + case KCFG_TRISTATE: + if (value == 'y') + *(enum libbpf_tristate *)ext_val = TRI_YES; + else if (value == 'm') + *(enum libbpf_tristate *)ext_val = TRI_MODULE; + else /* value == 'n' */ + *(enum libbpf_tristate *)ext_val = TRI_NO; + break; + case KCFG_CHAR: + *(char *)ext_val = value; + break; + case KCFG_UNKNOWN: + case KCFG_INT: + case KCFG_CHAR_ARR: + default: + pr_warn("extern (kcfg) '%s': value '%c' implies bool, tristate, or char type\n", + ext->name, value); + return -EINVAL; + } + ext->is_set = true; + return 0; +} + +static int set_kcfg_value_str(struct extern_desc *ext, char *ext_val, + const char *value) +{ + size_t len; + + if (ext->kcfg.type != KCFG_CHAR_ARR) { + pr_warn("extern (kcfg) '%s': value '%s' implies char array type\n", + ext->name, value); + return -EINVAL; + } + + len = strlen(value); + if (value[len - 1] != '"') { + pr_warn("extern (kcfg) '%s': invalid string config '%s'\n", + ext->name, value); + return -EINVAL; + } + + /* strip quotes */ + len -= 2; + if (len >= ext->kcfg.sz) { + pr_warn("extern (kcfg) '%s': long string '%s' of (%zu bytes) truncated to %d bytes\n", + ext->name, value, len, ext->kcfg.sz - 1); + len = ext->kcfg.sz - 1; + } + memcpy(ext_val, value + 1, len); + ext_val[len] = '\0'; + ext->is_set = true; + return 0; +} + +static int parse_u64(const char *value, __u64 *res) +{ + char *value_end; + int err; + + errno = 0; + *res = strtoull(value, &value_end, 0); + if (errno) { + err = -errno; + pr_warn("failed to parse '%s' as integer: %d\n", value, err); + return err; + } + if (*value_end) { + pr_warn("failed to parse '%s' as integer completely\n", value); + return -EINVAL; + } + return 0; +} + +static bool is_kcfg_value_in_range(const struct extern_desc *ext, __u64 v) +{ + int bit_sz = ext->kcfg.sz * 8; + + if (ext->kcfg.sz == 8) + return true; + + /* Validate that value stored in u64 fits in integer of `ext->sz` + * bytes size without any loss of information. If the target integer + * is signed, we rely on the following limits of integer type of + * Y bits and subsequent transformation: + * + * -2^(Y-1) <= X <= 2^(Y-1) - 1 + * 0 <= X + 2^(Y-1) <= 2^Y - 1 + * 0 <= X + 2^(Y-1) < 2^Y + * + * For unsigned target integer, check that all the (64 - Y) bits are + * zero. + */ + if (ext->kcfg.is_signed) + return v + (1ULL << (bit_sz - 1)) < (1ULL << bit_sz); + else + return (v >> bit_sz) == 0; +} + +static int set_kcfg_value_num(struct extern_desc *ext, void *ext_val, + __u64 value) +{ + if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR && + ext->kcfg.type != KCFG_BOOL) { + pr_warn("extern (kcfg) '%s': value '%llu' implies integer, char, or boolean type\n", + ext->name, (unsigned long long)value); + return -EINVAL; + } + if (ext->kcfg.type == KCFG_BOOL && value > 1) { + pr_warn("extern (kcfg) '%s': value '%llu' isn't boolean compatible\n", + ext->name, (unsigned long long)value); + return -EINVAL; + + } + if (!is_kcfg_value_in_range(ext, value)) { + pr_warn("extern (kcfg) '%s': value '%llu' doesn't fit in %d bytes\n", + ext->name, (unsigned long long)value, ext->kcfg.sz); + return -ERANGE; + } + switch (ext->kcfg.sz) { + case 1: + *(__u8 *)ext_val = value; + break; + case 2: + *(__u16 *)ext_val = value; + break; + case 4: + *(__u32 *)ext_val = value; + break; + case 8: + *(__u64 *)ext_val = value; + break; + default: + return -EINVAL; + } + ext->is_set = true; + return 0; +} + +static int bpf_object__process_kconfig_line(struct bpf_object *obj, + char *buf, void *data) +{ + struct extern_desc *ext; + char *sep, *value; + int len, err = 0; + void *ext_val; + __u64 num; + + if (!str_has_pfx(buf, "CONFIG_")) + return 0; + + sep = strchr(buf, '='); + if (!sep) { + pr_warn("failed to parse '%s': no separator\n", buf); + return -EINVAL; + } + + /* Trim ending '\n' */ + len = strlen(buf); + if (buf[len - 1] == '\n') + buf[len - 1] = '\0'; + /* Split on '=' and ensure that a value is present. */ + *sep = '\0'; + if (!sep[1]) { + *sep = '='; + pr_warn("failed to parse '%s': no value\n", buf); + return -EINVAL; + } + + ext = find_extern_by_name(obj, buf); + if (!ext || ext->is_set) + return 0; + + ext_val = data + ext->kcfg.data_off; + value = sep + 1; + + switch (*value) { + case 'y': case 'n': case 'm': + err = set_kcfg_value_tri(ext, ext_val, *value); + break; + case '"': + err = set_kcfg_value_str(ext, ext_val, value); + break; + default: + /* assume integer */ + err = parse_u64(value, &num); + if (err) { + pr_warn("extern (kcfg) '%s': value '%s' isn't a valid integer\n", ext->name, value); + return err; + } + if (ext->kcfg.type != KCFG_INT && ext->kcfg.type != KCFG_CHAR) { + pr_warn("extern (kcfg) '%s': value '%s' implies integer type\n", ext->name, value); + return -EINVAL; + } + err = set_kcfg_value_num(ext, ext_val, num); + break; + } + if (err) + return err; + pr_debug("extern (kcfg) '%s': set to %s\n", ext->name, value); + return 0; +} + +static int bpf_object__read_kconfig_file(struct bpf_object *obj, void *data) +{ + char buf[PATH_MAX]; + struct utsname uts; + int len, err = 0; + gzFile file; + + uname(&uts); + len = snprintf(buf, PATH_MAX, "/boot/config-%s", uts.release); + if (len < 0) + return -EINVAL; + else if (len >= PATH_MAX) + return -ENAMETOOLONG; + + /* gzopen also accepts uncompressed files. */ + file = gzopen(buf, "r"); + if (!file) + file = gzopen("/proc/config.gz", "r"); + + if (!file) { + pr_warn("failed to open system Kconfig\n"); + return -ENOENT; + } + + while (gzgets(file, buf, sizeof(buf))) { + err = bpf_object__process_kconfig_line(obj, buf, data); + if (err) { + pr_warn("error parsing system Kconfig line '%s': %d\n", + buf, err); + goto out; + } + } + +out: + gzclose(file); + return err; +} + +static int bpf_object__read_kconfig_mem(struct bpf_object *obj, + const char *config, void *data) +{ + char buf[PATH_MAX]; + int err = 0; + FILE *file; + + file = fmemopen((void *)config, strlen(config), "r"); + if (!file) { + err = -errno; + pr_warn("failed to open in-memory Kconfig: %d\n", err); + return err; + } + + while (fgets(buf, sizeof(buf), file)) { + err = bpf_object__process_kconfig_line(obj, buf, data); + if (err) { + pr_warn("error parsing in-memory Kconfig line '%s': %d\n", + buf, err); + break; + } + } + + fclose(file); + return err; +} + +static int bpf_object__init_kconfig_map(struct bpf_object *obj) +{ + struct extern_desc *last_ext = NULL, *ext; + size_t map_sz; + int i, err; + + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type == EXT_KCFG) + last_ext = ext; + } + + if (!last_ext) + return 0; + + map_sz = last_ext->kcfg.data_off + last_ext->kcfg.sz; + err = bpf_object__init_internal_map(obj, LIBBPF_MAP_KCONFIG, + ".kconfig", obj->efile.symbols_shndx, + NULL, map_sz); + if (err) + return err; + + obj->kconfig_map_idx = obj->nr_maps - 1; + + return 0; +} + +const struct btf_type * +skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id) +{ + const struct btf_type *t = btf__type_by_id(btf, id); + + if (res_id) + *res_id = id; + + while (btf_is_mod(t) || btf_is_typedef(t)) { + if (res_id) + *res_id = t->type; + t = btf__type_by_id(btf, t->type); + } + + return t; +} + +static const struct btf_type * +resolve_func_ptr(const struct btf *btf, __u32 id, __u32 *res_id) +{ + const struct btf_type *t; + + t = skip_mods_and_typedefs(btf, id, NULL); + if (!btf_is_ptr(t)) + return NULL; + + t = skip_mods_and_typedefs(btf, t->type, res_id); + + return btf_is_func_proto(t) ? t : NULL; +} + +static const char *__btf_kind_str(__u16 kind) +{ + switch (kind) { + case BTF_KIND_UNKN: return "void"; + case BTF_KIND_INT: return "int"; + case BTF_KIND_PTR: return "ptr"; + case BTF_KIND_ARRAY: return "array"; + case BTF_KIND_STRUCT: return "struct"; + case BTF_KIND_UNION: return "union"; + case BTF_KIND_ENUM: return "enum"; + case BTF_KIND_FWD: return "fwd"; + case BTF_KIND_TYPEDEF: return "typedef"; + case BTF_KIND_VOLATILE: return "volatile"; + case BTF_KIND_CONST: return "const"; + case BTF_KIND_RESTRICT: return "restrict"; + case BTF_KIND_FUNC: return "func"; + case BTF_KIND_FUNC_PROTO: return "func_proto"; + case BTF_KIND_VAR: return "var"; + case BTF_KIND_DATASEC: return "datasec"; + case BTF_KIND_FLOAT: return "float"; + case BTF_KIND_DECL_TAG: return "decl_tag"; + case BTF_KIND_TYPE_TAG: return "type_tag"; + case BTF_KIND_ENUM64: return "enum64"; + default: return "unknown"; + } +} + +const char *btf_kind_str(const struct btf_type *t) +{ + return __btf_kind_str(btf_kind(t)); +} + +/* + * Fetch integer attribute of BTF map definition. Such attributes are + * represented using a pointer to an array, in which dimensionality of array + * encodes specified integer value. E.g., int (*type)[BPF_MAP_TYPE_ARRAY]; + * encodes `type => BPF_MAP_TYPE_ARRAY` key/value pair completely using BTF + * type definition, while using only sizeof(void *) space in ELF data section. + */ +static bool get_map_field_int(const char *map_name, const struct btf *btf, + const struct btf_member *m, __u32 *res) +{ + const struct btf_type *t = skip_mods_and_typedefs(btf, m->type, NULL); + const char *name = btf__name_by_offset(btf, m->name_off); + const struct btf_array *arr_info; + const struct btf_type *arr_t; + + if (!btf_is_ptr(t)) { + pr_warn("map '%s': attr '%s': expected PTR, got %s.\n", + map_name, name, btf_kind_str(t)); + return false; + } + + arr_t = btf__type_by_id(btf, t->type); + if (!arr_t) { + pr_warn("map '%s': attr '%s': type [%u] not found.\n", + map_name, name, t->type); + return false; + } + if (!btf_is_array(arr_t)) { + pr_warn("map '%s': attr '%s': expected ARRAY, got %s.\n", + map_name, name, btf_kind_str(arr_t)); + return false; + } + arr_info = btf_array(arr_t); + *res = arr_info->nelems; + return true; +} + +static int pathname_concat(char *buf, size_t buf_sz, const char *path, const char *name) +{ + int len; + + len = snprintf(buf, buf_sz, "%s/%s", path, name); + if (len < 0) + return -EINVAL; + if (len >= buf_sz) + return -ENAMETOOLONG; + + return 0; +} + +static int build_map_pin_path(struct bpf_map *map, const char *path) +{ + char buf[PATH_MAX]; + int err; + + if (!path) + path = "/sys/fs/bpf"; + + err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map)); + if (err) + return err; + + return bpf_map__set_pin_path(map, buf); +} + +/* should match definition in bpf_helpers.h */ +enum libbpf_pin_type { + LIBBPF_PIN_NONE, + /* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */ + LIBBPF_PIN_BY_NAME, +}; + +int parse_btf_map_def(const char *map_name, struct btf *btf, + const struct btf_type *def_t, bool strict, + struct btf_map_def *map_def, struct btf_map_def *inner_def) +{ + const struct btf_type *t; + const struct btf_member *m; + bool is_inner = inner_def == NULL; + int vlen, i; + + vlen = btf_vlen(def_t); + m = btf_members(def_t); + for (i = 0; i < vlen; i++, m++) { + const char *name = btf__name_by_offset(btf, m->name_off); + + if (!name) { + pr_warn("map '%s': invalid field #%d.\n", map_name, i); + return -EINVAL; + } + if (strcmp(name, "type") == 0) { + if (!get_map_field_int(map_name, btf, m, &map_def->map_type)) + return -EINVAL; + map_def->parts |= MAP_DEF_MAP_TYPE; + } else if (strcmp(name, "max_entries") == 0) { + if (!get_map_field_int(map_name, btf, m, &map_def->max_entries)) + return -EINVAL; + map_def->parts |= MAP_DEF_MAX_ENTRIES; + } else if (strcmp(name, "map_flags") == 0) { + if (!get_map_field_int(map_name, btf, m, &map_def->map_flags)) + return -EINVAL; + map_def->parts |= MAP_DEF_MAP_FLAGS; + } else if (strcmp(name, "numa_node") == 0) { + if (!get_map_field_int(map_name, btf, m, &map_def->numa_node)) + return -EINVAL; + map_def->parts |= MAP_DEF_NUMA_NODE; + } else if (strcmp(name, "key_size") == 0) { + __u32 sz; + + if (!get_map_field_int(map_name, btf, m, &sz)) + return -EINVAL; + if (map_def->key_size && map_def->key_size != sz) { + pr_warn("map '%s': conflicting key size %u != %u.\n", + map_name, map_def->key_size, sz); + return -EINVAL; + } + map_def->key_size = sz; + map_def->parts |= MAP_DEF_KEY_SIZE; + } else if (strcmp(name, "key") == 0) { + __s64 sz; + + t = btf__type_by_id(btf, m->type); + if (!t) { + pr_warn("map '%s': key type [%d] not found.\n", + map_name, m->type); + return -EINVAL; + } + if (!btf_is_ptr(t)) { + pr_warn("map '%s': key spec is not PTR: %s.\n", + map_name, btf_kind_str(t)); + return -EINVAL; + } + sz = btf__resolve_size(btf, t->type); + if (sz < 0) { + pr_warn("map '%s': can't determine key size for type [%u]: %zd.\n", + map_name, t->type, (ssize_t)sz); + return sz; + } + if (map_def->key_size && map_def->key_size != sz) { + pr_warn("map '%s': conflicting key size %u != %zd.\n", + map_name, map_def->key_size, (ssize_t)sz); + return -EINVAL; + } + map_def->key_size = sz; + map_def->key_type_id = t->type; + map_def->parts |= MAP_DEF_KEY_SIZE | MAP_DEF_KEY_TYPE; + } else if (strcmp(name, "value_size") == 0) { + __u32 sz; + + if (!get_map_field_int(map_name, btf, m, &sz)) + return -EINVAL; + if (map_def->value_size && map_def->value_size != sz) { + pr_warn("map '%s': conflicting value size %u != %u.\n", + map_name, map_def->value_size, sz); + return -EINVAL; + } + map_def->value_size = sz; + map_def->parts |= MAP_DEF_VALUE_SIZE; + } else if (strcmp(name, "value") == 0) { + __s64 sz; + + t = btf__type_by_id(btf, m->type); + if (!t) { + pr_warn("map '%s': value type [%d] not found.\n", + map_name, m->type); + return -EINVAL; + } + if (!btf_is_ptr(t)) { + pr_warn("map '%s': value spec is not PTR: %s.\n", + map_name, btf_kind_str(t)); + return -EINVAL; + } + sz = btf__resolve_size(btf, t->type); + if (sz < 0) { + pr_warn("map '%s': can't determine value size for type [%u]: %zd.\n", + map_name, t->type, (ssize_t)sz); + return sz; + } + if (map_def->value_size && map_def->value_size != sz) { + pr_warn("map '%s': conflicting value size %u != %zd.\n", + map_name, map_def->value_size, (ssize_t)sz); + return -EINVAL; + } + map_def->value_size = sz; + map_def->value_type_id = t->type; + map_def->parts |= MAP_DEF_VALUE_SIZE | MAP_DEF_VALUE_TYPE; + } + else if (strcmp(name, "values") == 0) { + bool is_map_in_map = bpf_map_type__is_map_in_map(map_def->map_type); + bool is_prog_array = map_def->map_type == BPF_MAP_TYPE_PROG_ARRAY; + const char *desc = is_map_in_map ? "map-in-map inner" : "prog-array value"; + char inner_map_name[128]; + int err; + + if (is_inner) { + pr_warn("map '%s': multi-level inner maps not supported.\n", + map_name); + return -ENOTSUP; + } + if (i != vlen - 1) { + pr_warn("map '%s': '%s' member should be last.\n", + map_name, name); + return -EINVAL; + } + if (!is_map_in_map && !is_prog_array) { + pr_warn("map '%s': should be map-in-map or prog-array.\n", + map_name); + return -ENOTSUP; + } + if (map_def->value_size && map_def->value_size != 4) { + pr_warn("map '%s': conflicting value size %u != 4.\n", + map_name, map_def->value_size); + return -EINVAL; + } + map_def->value_size = 4; + t = btf__type_by_id(btf, m->type); + if (!t) { + pr_warn("map '%s': %s type [%d] not found.\n", + map_name, desc, m->type); + return -EINVAL; + } + if (!btf_is_array(t) || btf_array(t)->nelems) { + pr_warn("map '%s': %s spec is not a zero-sized array.\n", + map_name, desc); + return -EINVAL; + } + t = skip_mods_and_typedefs(btf, btf_array(t)->type, NULL); + if (!btf_is_ptr(t)) { + pr_warn("map '%s': %s def is of unexpected kind %s.\n", + map_name, desc, btf_kind_str(t)); + return -EINVAL; + } + t = skip_mods_and_typedefs(btf, t->type, NULL); + if (is_prog_array) { + if (!btf_is_func_proto(t)) { + pr_warn("map '%s': prog-array value def is of unexpected kind %s.\n", + map_name, btf_kind_str(t)); + return -EINVAL; + } + continue; + } + if (!btf_is_struct(t)) { + pr_warn("map '%s': map-in-map inner def is of unexpected kind %s.\n", + map_name, btf_kind_str(t)); + return -EINVAL; + } + + snprintf(inner_map_name, sizeof(inner_map_name), "%s.inner", map_name); + err = parse_btf_map_def(inner_map_name, btf, t, strict, inner_def, NULL); + if (err) + return err; + + map_def->parts |= MAP_DEF_INNER_MAP; + } else if (strcmp(name, "pinning") == 0) { + __u32 val; + + if (is_inner) { + pr_warn("map '%s': inner def can't be pinned.\n", map_name); + return -EINVAL; + } + if (!get_map_field_int(map_name, btf, m, &val)) + return -EINVAL; + if (val != LIBBPF_PIN_NONE && val != LIBBPF_PIN_BY_NAME) { + pr_warn("map '%s': invalid pinning value %u.\n", + map_name, val); + return -EINVAL; + } + map_def->pinning = val; + map_def->parts |= MAP_DEF_PINNING; + } else if (strcmp(name, "map_extra") == 0) { + __u32 map_extra; + + if (!get_map_field_int(map_name, btf, m, &map_extra)) + return -EINVAL; + map_def->map_extra = map_extra; + map_def->parts |= MAP_DEF_MAP_EXTRA; + } else { + if (strict) { + pr_warn("map '%s': unknown field '%s'.\n", map_name, name); + return -ENOTSUP; + } + pr_debug("map '%s': ignoring unknown field '%s'.\n", map_name, name); + } + } + + if (map_def->map_type == BPF_MAP_TYPE_UNSPEC) { + pr_warn("map '%s': map type isn't specified.\n", map_name); + return -EINVAL; + } + + return 0; +} + +static size_t adjust_ringbuf_sz(size_t sz) +{ + __u32 page_sz = sysconf(_SC_PAGE_SIZE); + __u32 mul; + + /* if user forgot to set any size, make sure they see error */ + if (sz == 0) + return 0; + /* Kernel expects BPF_MAP_TYPE_RINGBUF's max_entries to be + * a power-of-2 multiple of kernel's page size. If user diligently + * satisified these conditions, pass the size through. + */ + if ((sz % page_sz) == 0 && is_pow_of_2(sz / page_sz)) + return sz; + + /* Otherwise find closest (page_sz * power_of_2) product bigger than + * user-set size to satisfy both user size request and kernel + * requirements and substitute correct max_entries for map creation. + */ + for (mul = 1; mul <= UINT_MAX / page_sz; mul <<= 1) { + if (mul * page_sz > sz) + return mul * page_sz; + } + + /* if it's impossible to satisfy the conditions (i.e., user size is + * very close to UINT_MAX but is not a power-of-2 multiple of + * page_size) then just return original size and let kernel reject it + */ + return sz; +} + +static bool map_is_ringbuf(const struct bpf_map *map) +{ + return map->def.type == BPF_MAP_TYPE_RINGBUF || + map->def.type == BPF_MAP_TYPE_USER_RINGBUF; +} + +static void fill_map_from_def(struct bpf_map *map, const struct btf_map_def *def) +{ + map->def.type = def->map_type; + map->def.key_size = def->key_size; + map->def.value_size = def->value_size; + map->def.max_entries = def->max_entries; + map->def.map_flags = def->map_flags; + map->map_extra = def->map_extra; + + map->numa_node = def->numa_node; + map->btf_key_type_id = def->key_type_id; + map->btf_value_type_id = def->value_type_id; + + /* auto-adjust BPF ringbuf map max_entries to be a multiple of page size */ + if (map_is_ringbuf(map)) + map->def.max_entries = adjust_ringbuf_sz(map->def.max_entries); + + if (def->parts & MAP_DEF_MAP_TYPE) + pr_debug("map '%s': found type = %u.\n", map->name, def->map_type); + + if (def->parts & MAP_DEF_KEY_TYPE) + pr_debug("map '%s': found key [%u], sz = %u.\n", + map->name, def->key_type_id, def->key_size); + else if (def->parts & MAP_DEF_KEY_SIZE) + pr_debug("map '%s': found key_size = %u.\n", map->name, def->key_size); + + if (def->parts & MAP_DEF_VALUE_TYPE) + pr_debug("map '%s': found value [%u], sz = %u.\n", + map->name, def->value_type_id, def->value_size); + else if (def->parts & MAP_DEF_VALUE_SIZE) + pr_debug("map '%s': found value_size = %u.\n", map->name, def->value_size); + + if (def->parts & MAP_DEF_MAX_ENTRIES) + pr_debug("map '%s': found max_entries = %u.\n", map->name, def->max_entries); + if (def->parts & MAP_DEF_MAP_FLAGS) + pr_debug("map '%s': found map_flags = 0x%x.\n", map->name, def->map_flags); + if (def->parts & MAP_DEF_MAP_EXTRA) + pr_debug("map '%s': found map_extra = 0x%llx.\n", map->name, + (unsigned long long)def->map_extra); + if (def->parts & MAP_DEF_PINNING) + pr_debug("map '%s': found pinning = %u.\n", map->name, def->pinning); + if (def->parts & MAP_DEF_NUMA_NODE) + pr_debug("map '%s': found numa_node = %u.\n", map->name, def->numa_node); + + if (def->parts & MAP_DEF_INNER_MAP) + pr_debug("map '%s': found inner map definition.\n", map->name); +} + +static const char *btf_var_linkage_str(__u32 linkage) +{ + switch (linkage) { + case BTF_VAR_STATIC: return "static"; + case BTF_VAR_GLOBAL_ALLOCATED: return "global"; + case BTF_VAR_GLOBAL_EXTERN: return "extern"; + default: return "unknown"; + } +} + +static int bpf_object__init_user_btf_map(struct bpf_object *obj, + const struct btf_type *sec, + int var_idx, int sec_idx, + const Elf_Data *data, bool strict, + const char *pin_root_path) +{ + struct btf_map_def map_def = {}, inner_def = {}; + const struct btf_type *var, *def; + const struct btf_var_secinfo *vi; + const struct btf_var *var_extra; + const char *map_name; + struct bpf_map *map; + int err; + + vi = btf_var_secinfos(sec) + var_idx; + var = btf__type_by_id(obj->btf, vi->type); + var_extra = btf_var(var); + map_name = btf__name_by_offset(obj->btf, var->name_off); + + if (map_name == NULL || map_name[0] == '\0') { + pr_warn("map #%d: empty name.\n", var_idx); + return -EINVAL; + } + if ((__u64)vi->offset + vi->size > data->d_size) { + pr_warn("map '%s' BTF data is corrupted.\n", map_name); + return -EINVAL; + } + if (!btf_is_var(var)) { + pr_warn("map '%s': unexpected var kind %s.\n", + map_name, btf_kind_str(var)); + return -EINVAL; + } + if (var_extra->linkage != BTF_VAR_GLOBAL_ALLOCATED) { + pr_warn("map '%s': unsupported map linkage %s.\n", + map_name, btf_var_linkage_str(var_extra->linkage)); + return -EOPNOTSUPP; + } + + def = skip_mods_and_typedefs(obj->btf, var->type, NULL); + if (!btf_is_struct(def)) { + pr_warn("map '%s': unexpected def kind %s.\n", + map_name, btf_kind_str(var)); + return -EINVAL; + } + if (def->size > vi->size) { + pr_warn("map '%s': invalid def size.\n", map_name); + return -EINVAL; + } + + map = bpf_object__add_map(obj); + if (IS_ERR(map)) + return PTR_ERR(map); + map->name = strdup(map_name); + if (!map->name) { + pr_warn("map '%s': failed to alloc map name.\n", map_name); + return -ENOMEM; + } + map->libbpf_type = LIBBPF_MAP_UNSPEC; + map->def.type = BPF_MAP_TYPE_UNSPEC; + map->sec_idx = sec_idx; + map->sec_offset = vi->offset; + map->btf_var_idx = var_idx; + pr_debug("map '%s': at sec_idx %d, offset %zu.\n", + map_name, map->sec_idx, map->sec_offset); + + err = parse_btf_map_def(map->name, obj->btf, def, strict, &map_def, &inner_def); + if (err) + return err; + + fill_map_from_def(map, &map_def); + + if (map_def.pinning == LIBBPF_PIN_BY_NAME) { + err = build_map_pin_path(map, pin_root_path); + if (err) { + pr_warn("map '%s': couldn't build pin path.\n", map->name); + return err; + } + } + + if (map_def.parts & MAP_DEF_INNER_MAP) { + map->inner_map = calloc(1, sizeof(*map->inner_map)); + if (!map->inner_map) + return -ENOMEM; + map->inner_map->fd = -1; + map->inner_map->sec_idx = sec_idx; + map->inner_map->name = malloc(strlen(map_name) + sizeof(".inner") + 1); + if (!map->inner_map->name) + return -ENOMEM; + sprintf(map->inner_map->name, "%s.inner", map_name); + + fill_map_from_def(map->inner_map, &inner_def); + } + + err = map_fill_btf_type_info(obj, map); + if (err) + return err; + + return 0; +} + +static int bpf_object__init_user_btf_maps(struct bpf_object *obj, bool strict, + const char *pin_root_path) +{ + const struct btf_type *sec = NULL; + int nr_types, i, vlen, err; + const struct btf_type *t; + const char *name; + Elf_Data *data; + Elf_Scn *scn; + + if (obj->efile.btf_maps_shndx < 0) + return 0; + + scn = elf_sec_by_idx(obj, obj->efile.btf_maps_shndx); + data = elf_sec_data(obj, scn); + if (!scn || !data) { + pr_warn("elf: failed to get %s map definitions for %s\n", + MAPS_ELF_SEC, obj->path); + return -EINVAL; + } + + nr_types = btf__type_cnt(obj->btf); + for (i = 1; i < nr_types; i++) { + t = btf__type_by_id(obj->btf, i); + if (!btf_is_datasec(t)) + continue; + name = btf__name_by_offset(obj->btf, t->name_off); + if (strcmp(name, MAPS_ELF_SEC) == 0) { + sec = t; + obj->efile.btf_maps_sec_btf_id = i; + break; + } + } + + if (!sec) { + pr_warn("DATASEC '%s' not found.\n", MAPS_ELF_SEC); + return -ENOENT; + } + + vlen = btf_vlen(sec); + for (i = 0; i < vlen; i++) { + err = bpf_object__init_user_btf_map(obj, sec, i, + obj->efile.btf_maps_shndx, + data, strict, + pin_root_path); + if (err) + return err; + } + + return 0; +} + +static int bpf_object__init_maps(struct bpf_object *obj, + const struct bpf_object_open_opts *opts) +{ + const char *pin_root_path; + bool strict; + int err = 0; + + strict = !OPTS_GET(opts, relaxed_maps, false); + pin_root_path = OPTS_GET(opts, pin_root_path, NULL); + + err = bpf_object__init_user_btf_maps(obj, strict, pin_root_path); + err = err ?: bpf_object__init_global_data_maps(obj); + err = err ?: bpf_object__init_kconfig_map(obj); + err = err ?: bpf_object_init_struct_ops(obj); + + return err; +} + +static bool section_have_execinstr(struct bpf_object *obj, int idx) +{ + Elf64_Shdr *sh; + + sh = elf_sec_hdr(obj, elf_sec_by_idx(obj, idx)); + if (!sh) + return false; + + return sh->sh_flags & SHF_EXECINSTR; +} + +static bool btf_needs_sanitization(struct bpf_object *obj) +{ + bool has_func_global = kernel_supports(obj, FEAT_BTF_GLOBAL_FUNC); + bool has_datasec = kernel_supports(obj, FEAT_BTF_DATASEC); + bool has_float = kernel_supports(obj, FEAT_BTF_FLOAT); + bool has_func = kernel_supports(obj, FEAT_BTF_FUNC); + bool has_decl_tag = kernel_supports(obj, FEAT_BTF_DECL_TAG); + bool has_type_tag = kernel_supports(obj, FEAT_BTF_TYPE_TAG); + bool has_enum64 = kernel_supports(obj, FEAT_BTF_ENUM64); + + return !has_func || !has_datasec || !has_func_global || !has_float || + !has_decl_tag || !has_type_tag || !has_enum64; +} + +static int bpf_object__sanitize_btf(struct bpf_object *obj, struct btf *btf) +{ + bool has_func_global = kernel_supports(obj, FEAT_BTF_GLOBAL_FUNC); + bool has_datasec = kernel_supports(obj, FEAT_BTF_DATASEC); + bool has_float = kernel_supports(obj, FEAT_BTF_FLOAT); + bool has_func = kernel_supports(obj, FEAT_BTF_FUNC); + bool has_decl_tag = kernel_supports(obj, FEAT_BTF_DECL_TAG); + bool has_type_tag = kernel_supports(obj, FEAT_BTF_TYPE_TAG); + bool has_enum64 = kernel_supports(obj, FEAT_BTF_ENUM64); + int enum64_placeholder_id = 0; + struct btf_type *t; + int i, j, vlen; + + for (i = 1; i < btf__type_cnt(btf); i++) { + t = (struct btf_type *)btf__type_by_id(btf, i); + + if ((!has_datasec && btf_is_var(t)) || (!has_decl_tag && btf_is_decl_tag(t))) { + /* replace VAR/DECL_TAG with INT */ + t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0); + /* + * using size = 1 is the safest choice, 4 will be too + * big and cause kernel BTF validation failure if + * original variable took less than 4 bytes + */ + t->size = 1; + *(int *)(t + 1) = BTF_INT_ENC(0, 0, 8); + } else if (!has_datasec && btf_is_datasec(t)) { + /* replace DATASEC with STRUCT */ + const struct btf_var_secinfo *v = btf_var_secinfos(t); + struct btf_member *m = btf_members(t); + struct btf_type *vt; + char *name; + + name = (char *)btf__name_by_offset(btf, t->name_off); + while (*name) { + if (*name == '.') + *name = '_'; + name++; + } + + vlen = btf_vlen(t); + t->info = BTF_INFO_ENC(BTF_KIND_STRUCT, 0, vlen); + for (j = 0; j < vlen; j++, v++, m++) { + /* order of field assignments is important */ + m->offset = v->offset * 8; + m->type = v->type; + /* preserve variable name as member name */ + vt = (void *)btf__type_by_id(btf, v->type); + m->name_off = vt->name_off; + } + } else if (!has_func && btf_is_func_proto(t)) { + /* replace FUNC_PROTO with ENUM */ + vlen = btf_vlen(t); + t->info = BTF_INFO_ENC(BTF_KIND_ENUM, 0, vlen); + t->size = sizeof(__u32); /* kernel enforced */ + } else if (!has_func && btf_is_func(t)) { + /* replace FUNC with TYPEDEF */ + t->info = BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0); + } else if (!has_func_global && btf_is_func(t)) { + /* replace BTF_FUNC_GLOBAL with BTF_FUNC_STATIC */ + t->info = BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0); + } else if (!has_float && btf_is_float(t)) { + /* replace FLOAT with an equally-sized empty STRUCT; + * since C compilers do not accept e.g. "float" as a + * valid struct name, make it anonymous + */ + t->name_off = 0; + t->info = BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 0); + } else if (!has_type_tag && btf_is_type_tag(t)) { + /* replace TYPE_TAG with a CONST */ + t->name_off = 0; + t->info = BTF_INFO_ENC(BTF_KIND_CONST, 0, 0); + } else if (!has_enum64 && btf_is_enum(t)) { + /* clear the kflag */ + t->info = btf_type_info(btf_kind(t), btf_vlen(t), false); + } else if (!has_enum64 && btf_is_enum64(t)) { + /* replace ENUM64 with a union */ + struct btf_member *m; + + if (enum64_placeholder_id == 0) { + enum64_placeholder_id = btf__add_int(btf, "enum64_placeholder", 1, 0); + if (enum64_placeholder_id < 0) + return enum64_placeholder_id; + + t = (struct btf_type *)btf__type_by_id(btf, i); + } + + m = btf_members(t); + vlen = btf_vlen(t); + t->info = BTF_INFO_ENC(BTF_KIND_UNION, 0, vlen); + for (j = 0; j < vlen; j++, m++) { + m->type = enum64_placeholder_id; + m->offset = 0; + } + } + } + + return 0; +} + +static bool libbpf_needs_btf(const struct bpf_object *obj) +{ + return obj->efile.btf_maps_shndx >= 0 || + obj->efile.st_ops_shndx >= 0 || + obj->efile.st_ops_link_shndx >= 0 || + obj->nr_extern > 0; +} + +static bool kernel_needs_btf(const struct bpf_object *obj) +{ + return obj->efile.st_ops_shndx >= 0 || obj->efile.st_ops_link_shndx >= 0; +} + +static int bpf_object__init_btf(struct bpf_object *obj, + Elf_Data *btf_data, + Elf_Data *btf_ext_data) +{ + int err = -ENOENT; + + if (btf_data) { + obj->btf = btf__new(btf_data->d_buf, btf_data->d_size); + err = libbpf_get_error(obj->btf); + if (err) { + obj->btf = NULL; + pr_warn("Error loading ELF section %s: %d.\n", BTF_ELF_SEC, err); + goto out; + } + /* enforce 8-byte pointers for BPF-targeted BTFs */ + btf__set_pointer_size(obj->btf, 8); + } + if (btf_ext_data) { + struct btf_ext_info *ext_segs[3]; + int seg_num, sec_num; + + if (!obj->btf) { + pr_debug("Ignore ELF section %s because its depending ELF section %s is not found.\n", + BTF_EXT_ELF_SEC, BTF_ELF_SEC); + goto out; + } + obj->btf_ext = btf_ext__new(btf_ext_data->d_buf, btf_ext_data->d_size); + err = libbpf_get_error(obj->btf_ext); + if (err) { + pr_warn("Error loading ELF section %s: %d. Ignored and continue.\n", + BTF_EXT_ELF_SEC, err); + obj->btf_ext = NULL; + goto out; + } + + /* setup .BTF.ext to ELF section mapping */ + ext_segs[0] = &obj->btf_ext->func_info; + ext_segs[1] = &obj->btf_ext->line_info; + ext_segs[2] = &obj->btf_ext->core_relo_info; + for (seg_num = 0; seg_num < ARRAY_SIZE(ext_segs); seg_num++) { + struct btf_ext_info *seg = ext_segs[seg_num]; + const struct btf_ext_info_sec *sec; + const char *sec_name; + Elf_Scn *scn; + + if (seg->sec_cnt == 0) + continue; + + seg->sec_idxs = calloc(seg->sec_cnt, sizeof(*seg->sec_idxs)); + if (!seg->sec_idxs) { + err = -ENOMEM; + goto out; + } + + sec_num = 0; + for_each_btf_ext_sec(seg, sec) { + /* preventively increment index to avoid doing + * this before every continue below + */ + sec_num++; + + sec_name = btf__name_by_offset(obj->btf, sec->sec_name_off); + if (str_is_empty(sec_name)) + continue; + scn = elf_sec_by_name(obj, sec_name); + if (!scn) + continue; + + seg->sec_idxs[sec_num - 1] = elf_ndxscn(scn); + } + } + } +out: + if (err && libbpf_needs_btf(obj)) { + pr_warn("BTF is required, but is missing or corrupted.\n"); + return err; + } + return 0; +} + +static int compare_vsi_off(const void *_a, const void *_b) +{ + const struct btf_var_secinfo *a = _a; + const struct btf_var_secinfo *b = _b; + + return a->offset - b->offset; +} + +static int btf_fixup_datasec(struct bpf_object *obj, struct btf *btf, + struct btf_type *t) +{ + __u32 size = 0, i, vars = btf_vlen(t); + const char *sec_name = btf__name_by_offset(btf, t->name_off); + struct btf_var_secinfo *vsi; + bool fixup_offsets = false; + int err; + + if (!sec_name) { + pr_debug("No name found in string section for DATASEC kind.\n"); + return -ENOENT; + } + + /* Extern-backing datasecs (.ksyms, .kconfig) have their size and + * variable offsets set at the previous step. Further, not every + * extern BTF VAR has corresponding ELF symbol preserved, so we skip + * all fixups altogether for such sections and go straight to sorting + * VARs within their DATASEC. + */ + if (strcmp(sec_name, KCONFIG_SEC) == 0 || strcmp(sec_name, KSYMS_SEC) == 0) + goto sort_vars; + + /* Clang leaves DATASEC size and VAR offsets as zeroes, so we need to + * fix this up. But BPF static linker already fixes this up and fills + * all the sizes and offsets during static linking. So this step has + * to be optional. But the STV_HIDDEN handling is non-optional for any + * non-extern DATASEC, so the variable fixup loop below handles both + * functions at the same time, paying the cost of BTF VAR <-> ELF + * symbol matching just once. + */ + if (t->size == 0) { + err = find_elf_sec_sz(obj, sec_name, &size); + if (err || !size) { + pr_debug("sec '%s': failed to determine size from ELF: size %u, err %d\n", + sec_name, size, err); + return -ENOENT; + } + + t->size = size; + fixup_offsets = true; + } + + for (i = 0, vsi = btf_var_secinfos(t); i < vars; i++, vsi++) { + const struct btf_type *t_var; + struct btf_var *var; + const char *var_name; + Elf64_Sym *sym; + + t_var = btf__type_by_id(btf, vsi->type); + if (!t_var || !btf_is_var(t_var)) { + pr_debug("sec '%s': unexpected non-VAR type found\n", sec_name); + return -EINVAL; + } + + var = btf_var(t_var); + if (var->linkage == BTF_VAR_STATIC || var->linkage == BTF_VAR_GLOBAL_EXTERN) + continue; + + var_name = btf__name_by_offset(btf, t_var->name_off); + if (!var_name) { + pr_debug("sec '%s': failed to find name of DATASEC's member #%d\n", + sec_name, i); + return -ENOENT; + } + + sym = find_elf_var_sym(obj, var_name); + if (IS_ERR(sym)) { + pr_debug("sec '%s': failed to find ELF symbol for VAR '%s'\n", + sec_name, var_name); + return -ENOENT; + } + + if (fixup_offsets) + vsi->offset = sym->st_value; + + /* if variable is a global/weak symbol, but has restricted + * (STV_HIDDEN or STV_INTERNAL) visibility, mark its BTF VAR + * as static. This follows similar logic for functions (BPF + * subprogs) and influences libbpf's further decisions about + * whether to make global data BPF array maps as + * BPF_F_MMAPABLE. + */ + if (ELF64_ST_VISIBILITY(sym->st_other) == STV_HIDDEN + || ELF64_ST_VISIBILITY(sym->st_other) == STV_INTERNAL) + var->linkage = BTF_VAR_STATIC; + } + +sort_vars: + qsort(btf_var_secinfos(t), vars, sizeof(*vsi), compare_vsi_off); + return 0; +} + +static int bpf_object_fixup_btf(struct bpf_object *obj) +{ + int i, n, err = 0; + + if (!obj->btf) + return 0; + + n = btf__type_cnt(obj->btf); + for (i = 1; i < n; i++) { + struct btf_type *t = btf_type_by_id(obj->btf, i); + + /* Loader needs to fix up some of the things compiler + * couldn't get its hands on while emitting BTF. This + * is section size and global variable offset. We use + * the info from the ELF itself for this purpose. + */ + if (btf_is_datasec(t)) { + err = btf_fixup_datasec(obj, obj->btf, t); + if (err) + return err; + } + } + + return 0; +} + +static bool prog_needs_vmlinux_btf(struct bpf_program *prog) +{ + if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || + prog->type == BPF_PROG_TYPE_LSM) + return true; + + /* BPF_PROG_TYPE_TRACING programs which do not attach to other programs + * also need vmlinux BTF + */ + if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd) + return true; + + return false; +} + +static bool obj_needs_vmlinux_btf(const struct bpf_object *obj) +{ + struct bpf_program *prog; + int i; + + /* CO-RE relocations need kernel BTF, only when btf_custom_path + * is not specified + */ + if (obj->btf_ext && obj->btf_ext->core_relo_info.len && !obj->btf_custom_path) + return true; + + /* Support for typed ksyms needs kernel BTF */ + for (i = 0; i < obj->nr_extern; i++) { + const struct extern_desc *ext; + + ext = &obj->externs[i]; + if (ext->type == EXT_KSYM && ext->ksym.type_id) + return true; + } + + bpf_object__for_each_program(prog, obj) { + if (!prog->autoload) + continue; + if (prog_needs_vmlinux_btf(prog)) + return true; + } + + return false; +} + +static int bpf_object__load_vmlinux_btf(struct bpf_object *obj, bool force) +{ + int err; + + /* btf_vmlinux could be loaded earlier */ + if (obj->btf_vmlinux || obj->gen_loader) + return 0; + + if (!force && !obj_needs_vmlinux_btf(obj)) + return 0; + + obj->btf_vmlinux = btf__load_vmlinux_btf(); + err = libbpf_get_error(obj->btf_vmlinux); + if (err) { + pr_warn("Error loading vmlinux BTF: %d\n", err); + obj->btf_vmlinux = NULL; + return err; + } + return 0; +} + +static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj) +{ + struct btf *kern_btf = obj->btf; + bool btf_mandatory, sanitize; + int i, err = 0; + + if (!obj->btf) + return 0; + + if (!kernel_supports(obj, FEAT_BTF)) { + if (kernel_needs_btf(obj)) { + err = -EOPNOTSUPP; + goto report; + } + pr_debug("Kernel doesn't support BTF, skipping uploading it.\n"); + return 0; + } + + /* Even though some subprogs are global/weak, user might prefer more + * permissive BPF verification process that BPF verifier performs for + * static functions, taking into account more context from the caller + * functions. In such case, they need to mark such subprogs with + * __attribute__((visibility("hidden"))) and libbpf will adjust + * corresponding FUNC BTF type to be marked as static and trigger more + * involved BPF verification process. + */ + for (i = 0; i < obj->nr_programs; i++) { + struct bpf_program *prog = &obj->programs[i]; + struct btf_type *t; + const char *name; + int j, n; + + if (!prog->mark_btf_static || !prog_is_subprog(obj, prog)) + continue; + + n = btf__type_cnt(obj->btf); + for (j = 1; j < n; j++) { + t = btf_type_by_id(obj->btf, j); + if (!btf_is_func(t) || btf_func_linkage(t) != BTF_FUNC_GLOBAL) + continue; + + name = btf__str_by_offset(obj->btf, t->name_off); + if (strcmp(name, prog->name) != 0) + continue; + + t->info = btf_type_info(BTF_KIND_FUNC, BTF_FUNC_STATIC, 0); + break; + } + } + + sanitize = btf_needs_sanitization(obj); + if (sanitize) { + const void *raw_data; + __u32 sz; + + /* clone BTF to sanitize a copy and leave the original intact */ + raw_data = btf__raw_data(obj->btf, &sz); + kern_btf = btf__new(raw_data, sz); + err = libbpf_get_error(kern_btf); + if (err) + return err; + + /* enforce 8-byte pointers for BPF-targeted BTFs */ + btf__set_pointer_size(obj->btf, 8); + err = bpf_object__sanitize_btf(obj, kern_btf); + if (err) + return err; + } + + if (obj->gen_loader) { + __u32 raw_size = 0; + const void *raw_data = btf__raw_data(kern_btf, &raw_size); + + if (!raw_data) + return -ENOMEM; + bpf_gen__load_btf(obj->gen_loader, raw_data, raw_size); + /* Pretend to have valid FD to pass various fd >= 0 checks. + * This fd == 0 will not be used with any syscall and will be reset to -1 eventually. + */ + btf__set_fd(kern_btf, 0); + } else { + /* currently BPF_BTF_LOAD only supports log_level 1 */ + err = btf_load_into_kernel(kern_btf, obj->log_buf, obj->log_size, + obj->log_level ? 1 : 0); + } + if (sanitize) { + if (!err) { + /* move fd to libbpf's BTF */ + btf__set_fd(obj->btf, btf__fd(kern_btf)); + btf__set_fd(kern_btf, -1); + } + btf__free(kern_btf); + } +report: + if (err) { + btf_mandatory = kernel_needs_btf(obj); + pr_warn("Error loading .BTF into kernel: %d. %s\n", err, + btf_mandatory ? "BTF is mandatory, can't proceed." + : "BTF is optional, ignoring."); + if (!btf_mandatory) + err = 0; + } + return err; +} + +static const char *elf_sym_str(const struct bpf_object *obj, size_t off) +{ + const char *name; + + name = elf_strptr(obj->efile.elf, obj->efile.strtabidx, off); + if (!name) { + pr_warn("elf: failed to get section name string at offset %zu from %s: %s\n", + off, obj->path, elf_errmsg(-1)); + return NULL; + } + + return name; +} + +static const char *elf_sec_str(const struct bpf_object *obj, size_t off) +{ + const char *name; + + name = elf_strptr(obj->efile.elf, obj->efile.shstrndx, off); + if (!name) { + pr_warn("elf: failed to get section name string at offset %zu from %s: %s\n", + off, obj->path, elf_errmsg(-1)); + return NULL; + } + + return name; +} + +static Elf_Scn *elf_sec_by_idx(const struct bpf_object *obj, size_t idx) +{ + Elf_Scn *scn; + + scn = elf_getscn(obj->efile.elf, idx); + if (!scn) { + pr_warn("elf: failed to get section(%zu) from %s: %s\n", + idx, obj->path, elf_errmsg(-1)); + return NULL; + } + return scn; +} + +static Elf_Scn *elf_sec_by_name(const struct bpf_object *obj, const char *name) +{ + Elf_Scn *scn = NULL; + Elf *elf = obj->efile.elf; + const char *sec_name; + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + sec_name = elf_sec_name(obj, scn); + if (!sec_name) + return NULL; + + if (strcmp(sec_name, name) != 0) + continue; + + return scn; + } + return NULL; +} + +static Elf64_Shdr *elf_sec_hdr(const struct bpf_object *obj, Elf_Scn *scn) +{ + Elf64_Shdr *shdr; + + if (!scn) + return NULL; + + shdr = elf64_getshdr(scn); + if (!shdr) { + pr_warn("elf: failed to get section(%zu) header from %s: %s\n", + elf_ndxscn(scn), obj->path, elf_errmsg(-1)); + return NULL; + } + + return shdr; +} + +static const char *elf_sec_name(const struct bpf_object *obj, Elf_Scn *scn) +{ + const char *name; + Elf64_Shdr *sh; + + if (!scn) + return NULL; + + sh = elf_sec_hdr(obj, scn); + if (!sh) + return NULL; + + name = elf_sec_str(obj, sh->sh_name); + if (!name) { + pr_warn("elf: failed to get section(%zu) name from %s: %s\n", + elf_ndxscn(scn), obj->path, elf_errmsg(-1)); + return NULL; + } + + return name; +} + +static Elf_Data *elf_sec_data(const struct bpf_object *obj, Elf_Scn *scn) +{ + Elf_Data *data; + + if (!scn) + return NULL; + + data = elf_getdata(scn, 0); + if (!data) { + pr_warn("elf: failed to get section(%zu) %s data from %s: %s\n", + elf_ndxscn(scn), elf_sec_name(obj, scn) ?: "", + obj->path, elf_errmsg(-1)); + return NULL; + } + + return data; +} + +static Elf64_Sym *elf_sym_by_idx(const struct bpf_object *obj, size_t idx) +{ + if (idx >= obj->efile.symbols->d_size / sizeof(Elf64_Sym)) + return NULL; + + return (Elf64_Sym *)obj->efile.symbols->d_buf + idx; +} + +static Elf64_Rel *elf_rel_by_idx(Elf_Data *data, size_t idx) +{ + if (idx >= data->d_size / sizeof(Elf64_Rel)) + return NULL; + + return (Elf64_Rel *)data->d_buf + idx; +} + +static bool is_sec_name_dwarf(const char *name) +{ + /* approximation, but the actual list is too long */ + return str_has_pfx(name, ".debug_"); +} + +static bool ignore_elf_section(Elf64_Shdr *hdr, const char *name) +{ + /* no special handling of .strtab */ + if (hdr->sh_type == SHT_STRTAB) + return true; + + /* ignore .llvm_addrsig section as well */ + if (hdr->sh_type == SHT_LLVM_ADDRSIG) + return true; + + /* no subprograms will lead to an empty .text section, ignore it */ + if (hdr->sh_type == SHT_PROGBITS && hdr->sh_size == 0 && + strcmp(name, ".text") == 0) + return true; + + /* DWARF sections */ + if (is_sec_name_dwarf(name)) + return true; + + if (str_has_pfx(name, ".rel")) { + name += sizeof(".rel") - 1; + /* DWARF section relocations */ + if (is_sec_name_dwarf(name)) + return true; + + /* .BTF and .BTF.ext don't need relocations */ + if (strcmp(name, BTF_ELF_SEC) == 0 || + strcmp(name, BTF_EXT_ELF_SEC) == 0) + return true; + } + + return false; +} + +static int cmp_progs(const void *_a, const void *_b) +{ + const struct bpf_program *a = _a; + const struct bpf_program *b = _b; + + if (a->sec_idx != b->sec_idx) + return a->sec_idx < b->sec_idx ? -1 : 1; + + /* sec_insn_off can't be the same within the section */ + return a->sec_insn_off < b->sec_insn_off ? -1 : 1; +} + +static int bpf_object__elf_collect(struct bpf_object *obj) +{ + struct elf_sec_desc *sec_desc; + Elf *elf = obj->efile.elf; + Elf_Data *btf_ext_data = NULL; + Elf_Data *btf_data = NULL; + int idx = 0, err = 0; + const char *name; + Elf_Data *data; + Elf_Scn *scn; + Elf64_Shdr *sh; + + /* ELF section indices are 0-based, but sec #0 is special "invalid" + * section. Since section count retrieved by elf_getshdrnum() does + * include sec #0, it is already the necessary size of an array to keep + * all the sections. + */ + if (elf_getshdrnum(obj->efile.elf, &obj->efile.sec_cnt)) { + pr_warn("elf: failed to get the number of sections for %s: %s\n", + obj->path, elf_errmsg(-1)); + return -LIBBPF_ERRNO__FORMAT; + } + obj->efile.secs = calloc(obj->efile.sec_cnt, sizeof(*obj->efile.secs)); + if (!obj->efile.secs) + return -ENOMEM; + + /* a bunch of ELF parsing functionality depends on processing symbols, + * so do the first pass and find the symbol table + */ + scn = NULL; + while ((scn = elf_nextscn(elf, scn)) != NULL) { + sh = elf_sec_hdr(obj, scn); + if (!sh) + return -LIBBPF_ERRNO__FORMAT; + + if (sh->sh_type == SHT_SYMTAB) { + if (obj->efile.symbols) { + pr_warn("elf: multiple symbol tables in %s\n", obj->path); + return -LIBBPF_ERRNO__FORMAT; + } + + data = elf_sec_data(obj, scn); + if (!data) + return -LIBBPF_ERRNO__FORMAT; + + idx = elf_ndxscn(scn); + + obj->efile.symbols = data; + obj->efile.symbols_shndx = idx; + obj->efile.strtabidx = sh->sh_link; + } + } + + if (!obj->efile.symbols) { + pr_warn("elf: couldn't find symbol table in %s, stripped object file?\n", + obj->path); + return -ENOENT; + } + + scn = NULL; + while ((scn = elf_nextscn(elf, scn)) != NULL) { + idx = elf_ndxscn(scn); + sec_desc = &obj->efile.secs[idx]; + + sh = elf_sec_hdr(obj, scn); + if (!sh) + return -LIBBPF_ERRNO__FORMAT; + + name = elf_sec_str(obj, sh->sh_name); + if (!name) + return -LIBBPF_ERRNO__FORMAT; + + if (ignore_elf_section(sh, name)) + continue; + + data = elf_sec_data(obj, scn); + if (!data) + return -LIBBPF_ERRNO__FORMAT; + + pr_debug("elf: section(%d) %s, size %ld, link %d, flags %lx, type=%d\n", + idx, name, (unsigned long)data->d_size, + (int)sh->sh_link, (unsigned long)sh->sh_flags, + (int)sh->sh_type); + + if (strcmp(name, "license") == 0) { + err = bpf_object__init_license(obj, data->d_buf, data->d_size); + if (err) + return err; + } else if (strcmp(name, "version") == 0) { + err = bpf_object__init_kversion(obj, data->d_buf, data->d_size); + if (err) + return err; + } else if (strcmp(name, "maps") == 0) { + pr_warn("elf: legacy map definitions in 'maps' section are not supported by libbpf v1.0+\n"); + return -ENOTSUP; + } else if (strcmp(name, MAPS_ELF_SEC) == 0) { + obj->efile.btf_maps_shndx = idx; + } else if (strcmp(name, BTF_ELF_SEC) == 0) { + if (sh->sh_type != SHT_PROGBITS) + return -LIBBPF_ERRNO__FORMAT; + btf_data = data; + } else if (strcmp(name, BTF_EXT_ELF_SEC) == 0) { + if (sh->sh_type != SHT_PROGBITS) + return -LIBBPF_ERRNO__FORMAT; + btf_ext_data = data; + } else if (sh->sh_type == SHT_SYMTAB) { + /* already processed during the first pass above */ + } else if (sh->sh_type == SHT_PROGBITS && data->d_size > 0) { + if (sh->sh_flags & SHF_EXECINSTR) { + if (strcmp(name, ".text") == 0) + obj->efile.text_shndx = idx; + err = bpf_object__add_programs(obj, data, name, idx); + if (err) + return err; + } else if (strcmp(name, DATA_SEC) == 0 || + str_has_pfx(name, DATA_SEC ".")) { + sec_desc->sec_type = SEC_DATA; + sec_desc->shdr = sh; + sec_desc->data = data; + } else if (strcmp(name, RODATA_SEC) == 0 || + str_has_pfx(name, RODATA_SEC ".")) { + sec_desc->sec_type = SEC_RODATA; + sec_desc->shdr = sh; + sec_desc->data = data; + } else if (strcmp(name, STRUCT_OPS_SEC) == 0) { + obj->efile.st_ops_data = data; + obj->efile.st_ops_shndx = idx; + } else if (strcmp(name, STRUCT_OPS_LINK_SEC) == 0) { + obj->efile.st_ops_link_data = data; + obj->efile.st_ops_link_shndx = idx; + } else { + pr_info("elf: skipping unrecognized data section(%d) %s\n", + idx, name); + } + } else if (sh->sh_type == SHT_REL) { + int targ_sec_idx = sh->sh_info; /* points to other section */ + + if (sh->sh_entsize != sizeof(Elf64_Rel) || + targ_sec_idx >= obj->efile.sec_cnt) + return -LIBBPF_ERRNO__FORMAT; + + /* Only do relo for section with exec instructions */ + if (!section_have_execinstr(obj, targ_sec_idx) && + strcmp(name, ".rel" STRUCT_OPS_SEC) && + strcmp(name, ".rel" STRUCT_OPS_LINK_SEC) && + strcmp(name, ".rel" MAPS_ELF_SEC)) { + pr_info("elf: skipping relo section(%d) %s for section(%d) %s\n", + idx, name, targ_sec_idx, + elf_sec_name(obj, elf_sec_by_idx(obj, targ_sec_idx)) ?: ""); + continue; + } + + sec_desc->sec_type = SEC_RELO; + sec_desc->shdr = sh; + sec_desc->data = data; + } else if (sh->sh_type == SHT_NOBITS && (strcmp(name, BSS_SEC) == 0 || + str_has_pfx(name, BSS_SEC "."))) { + sec_desc->sec_type = SEC_BSS; + sec_desc->shdr = sh; + sec_desc->data = data; + } else { + pr_info("elf: skipping section(%d) %s (size %zu)\n", idx, name, + (size_t)sh->sh_size); + } + } + + if (!obj->efile.strtabidx || obj->efile.strtabidx > idx) { + pr_warn("elf: symbol strings section missing or invalid in %s\n", obj->path); + return -LIBBPF_ERRNO__FORMAT; + } + + /* sort BPF programs by section name and in-section instruction offset + * for faster search + */ + if (obj->nr_programs) + qsort(obj->programs, obj->nr_programs, sizeof(*obj->programs), cmp_progs); + + return bpf_object__init_btf(obj, btf_data, btf_ext_data); +} + +static bool sym_is_extern(const Elf64_Sym *sym) +{ + int bind = ELF64_ST_BIND(sym->st_info); + /* externs are symbols w/ type=NOTYPE, bind=GLOBAL|WEAK, section=UND */ + return sym->st_shndx == SHN_UNDEF && + (bind == STB_GLOBAL || bind == STB_WEAK) && + ELF64_ST_TYPE(sym->st_info) == STT_NOTYPE; +} + +static bool sym_is_subprog(const Elf64_Sym *sym, int text_shndx) +{ + int bind = ELF64_ST_BIND(sym->st_info); + int type = ELF64_ST_TYPE(sym->st_info); + + /* in .text section */ + if (sym->st_shndx != text_shndx) + return false; + + /* local function */ + if (bind == STB_LOCAL && type == STT_SECTION) + return true; + + /* global function */ + return bind == STB_GLOBAL && type == STT_FUNC; +} + +static int find_extern_btf_id(const struct btf *btf, const char *ext_name) +{ + const struct btf_type *t; + const char *tname; + int i, n; + + if (!btf) + return -ESRCH; + + n = btf__type_cnt(btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(btf, i); + + if (!btf_is_var(t) && !btf_is_func(t)) + continue; + + tname = btf__name_by_offset(btf, t->name_off); + if (strcmp(tname, ext_name)) + continue; + + if (btf_is_var(t) && + btf_var(t)->linkage != BTF_VAR_GLOBAL_EXTERN) + return -EINVAL; + + if (btf_is_func(t) && btf_func_linkage(t) != BTF_FUNC_EXTERN) + return -EINVAL; + + return i; + } + + return -ENOENT; +} + +static int find_extern_sec_btf_id(struct btf *btf, int ext_btf_id) { + const struct btf_var_secinfo *vs; + const struct btf_type *t; + int i, j, n; + + if (!btf) + return -ESRCH; + + n = btf__type_cnt(btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(btf, i); + + if (!btf_is_datasec(t)) + continue; + + vs = btf_var_secinfos(t); + for (j = 0; j < btf_vlen(t); j++, vs++) { + if (vs->type == ext_btf_id) + return i; + } + } + + return -ENOENT; +} + +static enum kcfg_type find_kcfg_type(const struct btf *btf, int id, + bool *is_signed) +{ + const struct btf_type *t; + const char *name; + + t = skip_mods_and_typedefs(btf, id, NULL); + name = btf__name_by_offset(btf, t->name_off); + + if (is_signed) + *is_signed = false; + switch (btf_kind(t)) { + case BTF_KIND_INT: { + int enc = btf_int_encoding(t); + + if (enc & BTF_INT_BOOL) + return t->size == 1 ? KCFG_BOOL : KCFG_UNKNOWN; + if (is_signed) + *is_signed = enc & BTF_INT_SIGNED; + if (t->size == 1) + return KCFG_CHAR; + if (t->size < 1 || t->size > 8 || (t->size & (t->size - 1))) + return KCFG_UNKNOWN; + return KCFG_INT; + } + case BTF_KIND_ENUM: + if (t->size != 4) + return KCFG_UNKNOWN; + if (strcmp(name, "libbpf_tristate")) + return KCFG_UNKNOWN; + return KCFG_TRISTATE; + case BTF_KIND_ENUM64: + if (strcmp(name, "libbpf_tristate")) + return KCFG_UNKNOWN; + return KCFG_TRISTATE; + case BTF_KIND_ARRAY: + if (btf_array(t)->nelems == 0) + return KCFG_UNKNOWN; + if (find_kcfg_type(btf, btf_array(t)->type, NULL) != KCFG_CHAR) + return KCFG_UNKNOWN; + return KCFG_CHAR_ARR; + default: + return KCFG_UNKNOWN; + } +} + +static int cmp_externs(const void *_a, const void *_b) +{ + const struct extern_desc *a = _a; + const struct extern_desc *b = _b; + + if (a->type != b->type) + return a->type < b->type ? -1 : 1; + + if (a->type == EXT_KCFG) { + /* descending order by alignment requirements */ + if (a->kcfg.align != b->kcfg.align) + return a->kcfg.align > b->kcfg.align ? -1 : 1; + /* ascending order by size, within same alignment class */ + if (a->kcfg.sz != b->kcfg.sz) + return a->kcfg.sz < b->kcfg.sz ? -1 : 1; + } + + /* resolve ties by name */ + return strcmp(a->name, b->name); +} + +static int find_int_btf_id(const struct btf *btf) +{ + const struct btf_type *t; + int i, n; + + n = btf__type_cnt(btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(btf, i); + + if (btf_is_int(t) && btf_int_bits(t) == 32) + return i; + } + + return 0; +} + +static int add_dummy_ksym_var(struct btf *btf) +{ + int i, int_btf_id, sec_btf_id, dummy_var_btf_id; + const struct btf_var_secinfo *vs; + const struct btf_type *sec; + + if (!btf) + return 0; + + sec_btf_id = btf__find_by_name_kind(btf, KSYMS_SEC, + BTF_KIND_DATASEC); + if (sec_btf_id < 0) + return 0; + + sec = btf__type_by_id(btf, sec_btf_id); + vs = btf_var_secinfos(sec); + for (i = 0; i < btf_vlen(sec); i++, vs++) { + const struct btf_type *vt; + + vt = btf__type_by_id(btf, vs->type); + if (btf_is_func(vt)) + break; + } + + /* No func in ksyms sec. No need to add dummy var. */ + if (i == btf_vlen(sec)) + return 0; + + int_btf_id = find_int_btf_id(btf); + dummy_var_btf_id = btf__add_var(btf, + "dummy_ksym", + BTF_VAR_GLOBAL_ALLOCATED, + int_btf_id); + if (dummy_var_btf_id < 0) + pr_warn("cannot create a dummy_ksym var\n"); + + return dummy_var_btf_id; +} + +static int bpf_object__collect_externs(struct bpf_object *obj) +{ + struct btf_type *sec, *kcfg_sec = NULL, *ksym_sec = NULL; + const struct btf_type *t; + struct extern_desc *ext; + int i, n, off, dummy_var_btf_id; + const char *ext_name, *sec_name; + Elf_Scn *scn; + Elf64_Shdr *sh; + + if (!obj->efile.symbols) + return 0; + + scn = elf_sec_by_idx(obj, obj->efile.symbols_shndx); + sh = elf_sec_hdr(obj, scn); + if (!sh || sh->sh_entsize != sizeof(Elf64_Sym)) + return -LIBBPF_ERRNO__FORMAT; + + dummy_var_btf_id = add_dummy_ksym_var(obj->btf); + if (dummy_var_btf_id < 0) + return dummy_var_btf_id; + + n = sh->sh_size / sh->sh_entsize; + pr_debug("looking for externs among %d symbols...\n", n); + + for (i = 0; i < n; i++) { + Elf64_Sym *sym = elf_sym_by_idx(obj, i); + + if (!sym) + return -LIBBPF_ERRNO__FORMAT; + if (!sym_is_extern(sym)) + continue; + ext_name = elf_sym_str(obj, sym->st_name); + if (!ext_name || !ext_name[0]) + continue; + + ext = obj->externs; + ext = libbpf_reallocarray(ext, obj->nr_extern + 1, sizeof(*ext)); + if (!ext) + return -ENOMEM; + obj->externs = ext; + ext = &ext[obj->nr_extern]; + memset(ext, 0, sizeof(*ext)); + obj->nr_extern++; + + ext->btf_id = find_extern_btf_id(obj->btf, ext_name); + if (ext->btf_id <= 0) { + pr_warn("failed to find BTF for extern '%s': %d\n", + ext_name, ext->btf_id); + return ext->btf_id; + } + t = btf__type_by_id(obj->btf, ext->btf_id); + ext->name = btf__name_by_offset(obj->btf, t->name_off); + ext->sym_idx = i; + ext->is_weak = ELF64_ST_BIND(sym->st_info) == STB_WEAK; + + ext->sec_btf_id = find_extern_sec_btf_id(obj->btf, ext->btf_id); + if (ext->sec_btf_id <= 0) { + pr_warn("failed to find BTF for extern '%s' [%d] section: %d\n", + ext_name, ext->btf_id, ext->sec_btf_id); + return ext->sec_btf_id; + } + sec = (void *)btf__type_by_id(obj->btf, ext->sec_btf_id); + sec_name = btf__name_by_offset(obj->btf, sec->name_off); + + if (strcmp(sec_name, KCONFIG_SEC) == 0) { + if (btf_is_func(t)) { + pr_warn("extern function %s is unsupported under %s section\n", + ext->name, KCONFIG_SEC); + return -ENOTSUP; + } + kcfg_sec = sec; + ext->type = EXT_KCFG; + ext->kcfg.sz = btf__resolve_size(obj->btf, t->type); + if (ext->kcfg.sz <= 0) { + pr_warn("failed to resolve size of extern (kcfg) '%s': %d\n", + ext_name, ext->kcfg.sz); + return ext->kcfg.sz; + } + ext->kcfg.align = btf__align_of(obj->btf, t->type); + if (ext->kcfg.align <= 0) { + pr_warn("failed to determine alignment of extern (kcfg) '%s': %d\n", + ext_name, ext->kcfg.align); + return -EINVAL; + } + ext->kcfg.type = find_kcfg_type(obj->btf, t->type, + &ext->kcfg.is_signed); + if (ext->kcfg.type == KCFG_UNKNOWN) { + pr_warn("extern (kcfg) '%s': type is unsupported\n", ext_name); + return -ENOTSUP; + } + } else if (strcmp(sec_name, KSYMS_SEC) == 0) { + ksym_sec = sec; + ext->type = EXT_KSYM; + skip_mods_and_typedefs(obj->btf, t->type, + &ext->ksym.type_id); + } else { + pr_warn("unrecognized extern section '%s'\n", sec_name); + return -ENOTSUP; + } + } + pr_debug("collected %d externs total\n", obj->nr_extern); + + if (!obj->nr_extern) + return 0; + + /* sort externs by type, for kcfg ones also by (align, size, name) */ + qsort(obj->externs, obj->nr_extern, sizeof(*ext), cmp_externs); + + /* for .ksyms section, we need to turn all externs into allocated + * variables in BTF to pass kernel verification; we do this by + * pretending that each extern is a 8-byte variable + */ + if (ksym_sec) { + /* find existing 4-byte integer type in BTF to use for fake + * extern variables in DATASEC + */ + int int_btf_id = find_int_btf_id(obj->btf); + /* For extern function, a dummy_var added earlier + * will be used to replace the vs->type and + * its name string will be used to refill + * the missing param's name. + */ + const struct btf_type *dummy_var; + + dummy_var = btf__type_by_id(obj->btf, dummy_var_btf_id); + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type != EXT_KSYM) + continue; + pr_debug("extern (ksym) #%d: symbol %d, name %s\n", + i, ext->sym_idx, ext->name); + } + + sec = ksym_sec; + n = btf_vlen(sec); + for (i = 0, off = 0; i < n; i++, off += sizeof(int)) { + struct btf_var_secinfo *vs = btf_var_secinfos(sec) + i; + struct btf_type *vt; + + vt = (void *)btf__type_by_id(obj->btf, vs->type); + ext_name = btf__name_by_offset(obj->btf, vt->name_off); + ext = find_extern_by_name(obj, ext_name); + if (!ext) { + pr_warn("failed to find extern definition for BTF %s '%s'\n", + btf_kind_str(vt), ext_name); + return -ESRCH; + } + if (btf_is_func(vt)) { + const struct btf_type *func_proto; + struct btf_param *param; + int j; + + func_proto = btf__type_by_id(obj->btf, + vt->type); + param = btf_params(func_proto); + /* Reuse the dummy_var string if the + * func proto does not have param name. + */ + for (j = 0; j < btf_vlen(func_proto); j++) + if (param[j].type && !param[j].name_off) + param[j].name_off = + dummy_var->name_off; + vs->type = dummy_var_btf_id; + vt->info &= ~0xffff; + vt->info |= BTF_FUNC_GLOBAL; + } else { + btf_var(vt)->linkage = BTF_VAR_GLOBAL_ALLOCATED; + vt->type = int_btf_id; + } + vs->offset = off; + vs->size = sizeof(int); + } + sec->size = off; + } + + if (kcfg_sec) { + sec = kcfg_sec; + /* for kcfg externs calculate their offsets within a .kconfig map */ + off = 0; + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type != EXT_KCFG) + continue; + + ext->kcfg.data_off = roundup(off, ext->kcfg.align); + off = ext->kcfg.data_off + ext->kcfg.sz; + pr_debug("extern (kcfg) #%d: symbol %d, off %u, name %s\n", + i, ext->sym_idx, ext->kcfg.data_off, ext->name); + } + sec->size = off; + n = btf_vlen(sec); + for (i = 0; i < n; i++) { + struct btf_var_secinfo *vs = btf_var_secinfos(sec) + i; + + t = btf__type_by_id(obj->btf, vs->type); + ext_name = btf__name_by_offset(obj->btf, t->name_off); + ext = find_extern_by_name(obj, ext_name); + if (!ext) { + pr_warn("failed to find extern definition for BTF var '%s'\n", + ext_name); + return -ESRCH; + } + btf_var(t)->linkage = BTF_VAR_GLOBAL_ALLOCATED; + vs->offset = ext->kcfg.data_off; + } + } + return 0; +} + +static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog) +{ + return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1; +} + +struct bpf_program * +bpf_object__find_program_by_name(const struct bpf_object *obj, + const char *name) +{ + struct bpf_program *prog; + + bpf_object__for_each_program(prog, obj) { + if (prog_is_subprog(obj, prog)) + continue; + if (!strcmp(prog->name, name)) + return prog; + } + return errno = ENOENT, NULL; +} + +static bool bpf_object__shndx_is_data(const struct bpf_object *obj, + int shndx) +{ + switch (obj->efile.secs[shndx].sec_type) { + case SEC_BSS: + case SEC_DATA: + case SEC_RODATA: + return true; + default: + return false; + } +} + +static bool bpf_object__shndx_is_maps(const struct bpf_object *obj, + int shndx) +{ + return shndx == obj->efile.btf_maps_shndx; +} + +static enum libbpf_map_type +bpf_object__section_to_libbpf_map_type(const struct bpf_object *obj, int shndx) +{ + if (shndx == obj->efile.symbols_shndx) + return LIBBPF_MAP_KCONFIG; + + switch (obj->efile.secs[shndx].sec_type) { + case SEC_BSS: + return LIBBPF_MAP_BSS; + case SEC_DATA: + return LIBBPF_MAP_DATA; + case SEC_RODATA: + return LIBBPF_MAP_RODATA; + default: + return LIBBPF_MAP_UNSPEC; + } +} + +static int bpf_program__record_reloc(struct bpf_program *prog, + struct reloc_desc *reloc_desc, + __u32 insn_idx, const char *sym_name, + const Elf64_Sym *sym, const Elf64_Rel *rel) +{ + struct bpf_insn *insn = &prog->insns[insn_idx]; + size_t map_idx, nr_maps = prog->obj->nr_maps; + struct bpf_object *obj = prog->obj; + __u32 shdr_idx = sym->st_shndx; + enum libbpf_map_type type; + const char *sym_sec_name; + struct bpf_map *map; + + if (!is_call_insn(insn) && !is_ldimm64_insn(insn)) { + pr_warn("prog '%s': invalid relo against '%s' for insns[%d].code 0x%x\n", + prog->name, sym_name, insn_idx, insn->code); + return -LIBBPF_ERRNO__RELOC; + } + + if (sym_is_extern(sym)) { + int sym_idx = ELF64_R_SYM(rel->r_info); + int i, n = obj->nr_extern; + struct extern_desc *ext; + + for (i = 0; i < n; i++) { + ext = &obj->externs[i]; + if (ext->sym_idx == sym_idx) + break; + } + if (i >= n) { + pr_warn("prog '%s': extern relo failed to find extern for '%s' (%d)\n", + prog->name, sym_name, sym_idx); + return -LIBBPF_ERRNO__RELOC; + } + pr_debug("prog '%s': found extern #%d '%s' (sym %d) for insn #%u\n", + prog->name, i, ext->name, ext->sym_idx, insn_idx); + if (insn->code == (BPF_JMP | BPF_CALL)) + reloc_desc->type = RELO_EXTERN_CALL; + else + reloc_desc->type = RELO_EXTERN_LD64; + reloc_desc->insn_idx = insn_idx; + reloc_desc->sym_off = i; /* sym_off stores extern index */ + return 0; + } + + /* sub-program call relocation */ + if (is_call_insn(insn)) { + if (insn->src_reg != BPF_PSEUDO_CALL) { + pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name); + return -LIBBPF_ERRNO__RELOC; + } + /* text_shndx can be 0, if no default "main" program exists */ + if (!shdr_idx || shdr_idx != obj->efile.text_shndx) { + sym_sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, shdr_idx)); + pr_warn("prog '%s': bad call relo against '%s' in section '%s'\n", + prog->name, sym_name, sym_sec_name); + return -LIBBPF_ERRNO__RELOC; + } + if (sym->st_value % BPF_INSN_SZ) { + pr_warn("prog '%s': bad call relo against '%s' at offset %zu\n", + prog->name, sym_name, (size_t)sym->st_value); + return -LIBBPF_ERRNO__RELOC; + } + reloc_desc->type = RELO_CALL; + reloc_desc->insn_idx = insn_idx; + reloc_desc->sym_off = sym->st_value; + return 0; + } + + if (!shdr_idx || shdr_idx >= SHN_LORESERVE) { + pr_warn("prog '%s': invalid relo against '%s' in special section 0x%x; forgot to initialize global var?..\n", + prog->name, sym_name, shdr_idx); + return -LIBBPF_ERRNO__RELOC; + } + + /* loading subprog addresses */ + if (sym_is_subprog(sym, obj->efile.text_shndx)) { + /* global_func: sym->st_value = offset in the section, insn->imm = 0. + * local_func: sym->st_value = 0, insn->imm = offset in the section. + */ + if ((sym->st_value % BPF_INSN_SZ) || (insn->imm % BPF_INSN_SZ)) { + pr_warn("prog '%s': bad subprog addr relo against '%s' at offset %zu+%d\n", + prog->name, sym_name, (size_t)sym->st_value, insn->imm); + return -LIBBPF_ERRNO__RELOC; + } + + reloc_desc->type = RELO_SUBPROG_ADDR; + reloc_desc->insn_idx = insn_idx; + reloc_desc->sym_off = sym->st_value; + return 0; + } + + type = bpf_object__section_to_libbpf_map_type(obj, shdr_idx); + sym_sec_name = elf_sec_name(obj, elf_sec_by_idx(obj, shdr_idx)); + + /* generic map reference relocation */ + if (type == LIBBPF_MAP_UNSPEC) { + if (!bpf_object__shndx_is_maps(obj, shdr_idx)) { + pr_warn("prog '%s': bad map relo against '%s' in section '%s'\n", + prog->name, sym_name, sym_sec_name); + return -LIBBPF_ERRNO__RELOC; + } + for (map_idx = 0; map_idx < nr_maps; map_idx++) { + map = &obj->maps[map_idx]; + if (map->libbpf_type != type || + map->sec_idx != sym->st_shndx || + map->sec_offset != sym->st_value) + continue; + pr_debug("prog '%s': found map %zd (%s, sec %d, off %zu) for insn #%u\n", + prog->name, map_idx, map->name, map->sec_idx, + map->sec_offset, insn_idx); + break; + } + if (map_idx >= nr_maps) { + pr_warn("prog '%s': map relo failed to find map for section '%s', off %zu\n", + prog->name, sym_sec_name, (size_t)sym->st_value); + return -LIBBPF_ERRNO__RELOC; + } + reloc_desc->type = RELO_LD64; + reloc_desc->insn_idx = insn_idx; + reloc_desc->map_idx = map_idx; + reloc_desc->sym_off = 0; /* sym->st_value determines map_idx */ + return 0; + } + + /* global data map relocation */ + if (!bpf_object__shndx_is_data(obj, shdr_idx)) { + pr_warn("prog '%s': bad data relo against section '%s'\n", + prog->name, sym_sec_name); + return -LIBBPF_ERRNO__RELOC; + } + for (map_idx = 0; map_idx < nr_maps; map_idx++) { + map = &obj->maps[map_idx]; + if (map->libbpf_type != type || map->sec_idx != sym->st_shndx) + continue; + pr_debug("prog '%s': found data map %zd (%s, sec %d, off %zu) for insn %u\n", + prog->name, map_idx, map->name, map->sec_idx, + map->sec_offset, insn_idx); + break; + } + if (map_idx >= nr_maps) { + pr_warn("prog '%s': data relo failed to find map for section '%s'\n", + prog->name, sym_sec_name); + return -LIBBPF_ERRNO__RELOC; + } + + reloc_desc->type = RELO_DATA; + reloc_desc->insn_idx = insn_idx; + reloc_desc->map_idx = map_idx; + reloc_desc->sym_off = sym->st_value; + return 0; +} + +static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) +{ + return insn_idx >= prog->sec_insn_off && + insn_idx < prog->sec_insn_off + prog->sec_insn_cnt; +} + +static struct bpf_program *find_prog_by_sec_insn(const struct bpf_object *obj, + size_t sec_idx, size_t insn_idx) +{ + int l = 0, r = obj->nr_programs - 1, m; + struct bpf_program *prog; + + if (!obj->nr_programs) + return NULL; + + while (l < r) { + m = l + (r - l + 1) / 2; + prog = &obj->programs[m]; + + if (prog->sec_idx < sec_idx || + (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx)) + l = m; + else + r = m - 1; + } + /* matching program could be at index l, but it still might be the + * wrong one, so we need to double check conditions for the last time + */ + prog = &obj->programs[l]; + if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx)) + return prog; + return NULL; +} + +static int +bpf_object__collect_prog_relos(struct bpf_object *obj, Elf64_Shdr *shdr, Elf_Data *data) +{ + const char *relo_sec_name, *sec_name; + size_t sec_idx = shdr->sh_info, sym_idx; + struct bpf_program *prog; + struct reloc_desc *relos; + int err, i, nrels; + const char *sym_name; + __u32 insn_idx; + Elf_Scn *scn; + Elf_Data *scn_data; + Elf64_Sym *sym; + Elf64_Rel *rel; + + if (sec_idx >= obj->efile.sec_cnt) + return -EINVAL; + + scn = elf_sec_by_idx(obj, sec_idx); + scn_data = elf_sec_data(obj, scn); + + relo_sec_name = elf_sec_str(obj, shdr->sh_name); + sec_name = elf_sec_name(obj, scn); + if (!relo_sec_name || !sec_name) + return -EINVAL; + + pr_debug("sec '%s': collecting relocation for section(%zu) '%s'\n", + relo_sec_name, sec_idx, sec_name); + nrels = shdr->sh_size / shdr->sh_entsize; + + for (i = 0; i < nrels; i++) { + rel = elf_rel_by_idx(data, i); + if (!rel) { + pr_warn("sec '%s': failed to get relo #%d\n", relo_sec_name, i); + return -LIBBPF_ERRNO__FORMAT; + } + + sym_idx = ELF64_R_SYM(rel->r_info); + sym = elf_sym_by_idx(obj, sym_idx); + if (!sym) { + pr_warn("sec '%s': symbol #%zu not found for relo #%d\n", + relo_sec_name, sym_idx, i); + return -LIBBPF_ERRNO__FORMAT; + } + + if (sym->st_shndx >= obj->efile.sec_cnt) { + pr_warn("sec '%s': corrupted symbol #%zu pointing to invalid section #%zu for relo #%d\n", + relo_sec_name, sym_idx, (size_t)sym->st_shndx, i); + return -LIBBPF_ERRNO__FORMAT; + } + + if (rel->r_offset % BPF_INSN_SZ || rel->r_offset >= scn_data->d_size) { + pr_warn("sec '%s': invalid offset 0x%zx for relo #%d\n", + relo_sec_name, (size_t)rel->r_offset, i); + return -LIBBPF_ERRNO__FORMAT; + } + + insn_idx = rel->r_offset / BPF_INSN_SZ; + /* relocations against static functions are recorded as + * relocations against the section that contains a function; + * in such case, symbol will be STT_SECTION and sym.st_name + * will point to empty string (0), so fetch section name + * instead + */ + if (ELF64_ST_TYPE(sym->st_info) == STT_SECTION && sym->st_name == 0) + sym_name = elf_sec_name(obj, elf_sec_by_idx(obj, sym->st_shndx)); + else + sym_name = elf_sym_str(obj, sym->st_name); + sym_name = sym_name ?: "reloc_desc, + prog->nr_reloc + 1, sizeof(*relos)); + if (!relos) + return -ENOMEM; + prog->reloc_desc = relos; + + /* adjust insn_idx to local BPF program frame of reference */ + insn_idx -= prog->sec_insn_off; + err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc], + insn_idx, sym_name, sym, rel); + if (err) + return err; + + prog->nr_reloc++; + } + return 0; +} + +static int map_fill_btf_type_info(struct bpf_object *obj, struct bpf_map *map) +{ + int id; + + if (!obj->btf) + return -ENOENT; + + /* if it's BTF-defined map, we don't need to search for type IDs. + * For struct_ops map, it does not need btf_key_type_id and + * btf_value_type_id. + */ + if (map->sec_idx == obj->efile.btf_maps_shndx || bpf_map__is_struct_ops(map)) + return 0; + + /* + * LLVM annotates global data differently in BTF, that is, + * only as '.data', '.bss' or '.rodata'. + */ + if (!bpf_map__is_internal(map)) + return -ENOENT; + + id = btf__find_by_name(obj->btf, map->real_name); + if (id < 0) + return id; + + map->btf_key_type_id = 0; + map->btf_value_type_id = id; + return 0; +} + +static int bpf_get_map_info_from_fdinfo(int fd, struct bpf_map_info *info) +{ + char file[PATH_MAX], buff[4096]; + FILE *fp; + __u32 val; + int err; + + snprintf(file, sizeof(file), "/proc/%d/fdinfo/%d", getpid(), fd); + memset(info, 0, sizeof(*info)); + + fp = fopen(file, "r"); + if (!fp) { + err = -errno; + pr_warn("failed to open %s: %d. No procfs support?\n", file, + err); + return err; + } + + while (fgets(buff, sizeof(buff), fp)) { + if (sscanf(buff, "map_type:\t%u", &val) == 1) + info->type = val; + else if (sscanf(buff, "key_size:\t%u", &val) == 1) + info->key_size = val; + else if (sscanf(buff, "value_size:\t%u", &val) == 1) + info->value_size = val; + else if (sscanf(buff, "max_entries:\t%u", &val) == 1) + info->max_entries = val; + else if (sscanf(buff, "map_flags:\t%i", &val) == 1) + info->map_flags = val; + } + + fclose(fp); + + return 0; +} + +bool bpf_map__autocreate(const struct bpf_map *map) +{ + return map->autocreate; +} + +int bpf_map__set_autocreate(struct bpf_map *map, bool autocreate) +{ + if (map->obj->loaded) + return libbpf_err(-EBUSY); + + map->autocreate = autocreate; + return 0; +} + +int bpf_map__reuse_fd(struct bpf_map *map, int fd) +{ + struct bpf_map_info info; + __u32 len = sizeof(info), name_len; + int new_fd, err; + char *new_name; + + memset(&info, 0, len); + err = bpf_map_get_info_by_fd(fd, &info, &len); + if (err && errno == EINVAL) + err = bpf_get_map_info_from_fdinfo(fd, &info); + if (err) + return libbpf_err(err); + + name_len = strlen(info.name); + if (name_len == BPF_OBJ_NAME_LEN - 1 && strncmp(map->name, info.name, name_len) == 0) + new_name = strdup(map->name); + else + new_name = strdup(info.name); + + if (!new_name) + return libbpf_err(-errno); + + new_fd = open("/", O_RDONLY | O_CLOEXEC); + if (new_fd < 0) { + err = -errno; + goto err_free_new_name; + } + + new_fd = dup3(fd, new_fd, O_CLOEXEC); + if (new_fd < 0) { + err = -errno; + goto err_close_new_fd; + } + + err = zclose(map->fd); + if (err) { + err = -errno; + goto err_close_new_fd; + } + free(map->name); + + map->fd = new_fd; + map->name = new_name; + map->def.type = info.type; + map->def.key_size = info.key_size; + map->def.value_size = info.value_size; + map->def.max_entries = info.max_entries; + map->def.map_flags = info.map_flags; + map->btf_key_type_id = info.btf_key_type_id; + map->btf_value_type_id = info.btf_value_type_id; + map->reused = true; + map->map_extra = info.map_extra; + + return 0; + +err_close_new_fd: + close(new_fd); +err_free_new_name: + free(new_name); + return libbpf_err(err); +} + +__u32 bpf_map__max_entries(const struct bpf_map *map) +{ + return map->def.max_entries; +} + +struct bpf_map *bpf_map__inner_map(struct bpf_map *map) +{ + if (!bpf_map_type__is_map_in_map(map->def.type)) + return errno = EINVAL, NULL; + + return map->inner_map; +} + +int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries) +{ + if (map->obj->loaded) + return libbpf_err(-EBUSY); + + map->def.max_entries = max_entries; + + /* auto-adjust BPF ringbuf map max_entries to be a multiple of page size */ + if (map_is_ringbuf(map)) + map->def.max_entries = adjust_ringbuf_sz(map->def.max_entries); + + return 0; +} + +static int +bpf_object__probe_loading(struct bpf_object *obj) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int ret, insn_cnt = ARRAY_SIZE(insns); + + if (obj->gen_loader) + return 0; + + ret = bump_rlimit_memlock(); + if (ret) + pr_warn("Failed to bump RLIMIT_MEMLOCK (err = %d), you might need to do it explicitly!\n", ret); + + /* make sure basic loading works */ + ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL); + if (ret < 0) + ret = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", insns, insn_cnt, NULL); + if (ret < 0) { + ret = errno; + cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg)); + pr_warn("Error in %s():%s(%d). Couldn't load trivial BPF " + "program. Make sure your kernel supports BPF " + "(CONFIG_BPF_SYSCALL=y) and/or that RLIMIT_MEMLOCK is " + "set to big enough value.\n", __func__, cp, ret); + return -ret; + } + close(ret); + + return 0; +} + +static int probe_fd(int fd) +{ + if (fd >= 0) + close(fd); + return fd >= 0; +} + +static int probe_kern_prog_name(void) +{ + const size_t attr_sz = offsetofend(union bpf_attr, prog_name); + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + union bpf_attr attr; + int ret; + + memset(&attr, 0, attr_sz); + attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER; + attr.license = ptr_to_u64("GPL"); + attr.insns = ptr_to_u64(insns); + attr.insn_cnt = (__u32)ARRAY_SIZE(insns); + libbpf_strlcpy(attr.prog_name, "libbpf_nametest", sizeof(attr.prog_name)); + + /* make sure loading with name works */ + ret = sys_bpf_prog_load(&attr, attr_sz, PROG_LOAD_ATTEMPTS); + return probe_fd(ret); +} + +static int probe_kern_global_data(void) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + struct bpf_insn insns[] = { + BPF_LD_MAP_VALUE(BPF_REG_1, 0, 16), + BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42), + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int ret, map, insn_cnt = ARRAY_SIZE(insns); + + map = bpf_map_create(BPF_MAP_TYPE_ARRAY, "libbpf_global", sizeof(int), 32, 1, NULL); + if (map < 0) { + ret = -errno; + cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg)); + pr_warn("Error in %s():%s(%d). Couldn't create simple array map.\n", + __func__, cp, -ret); + return ret; + } + + insns[0].imm = map; + + ret = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL); + close(map); + return probe_fd(ret); +} + +static int probe_kern_btf(void) +{ + static const char strs[] = "\0int"; + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_func(void) +{ + static const char strs[] = "\0int\0x\0a"; + /* void x(int a) {} */ + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* FUNC_PROTO */ /* [2] */ + BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 1), 0), + BTF_PARAM_ENC(7, 1), + /* FUNC x */ /* [3] */ + BTF_TYPE_ENC(5, BTF_INFO_ENC(BTF_KIND_FUNC, 0, 0), 2), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_func_global(void) +{ + static const char strs[] = "\0int\0x\0a"; + /* static void x(int a) {} */ + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* FUNC_PROTO */ /* [2] */ + BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_FUNC_PROTO, 0, 1), 0), + BTF_PARAM_ENC(7, 1), + /* FUNC x BTF_FUNC_GLOBAL */ /* [3] */ + BTF_TYPE_ENC(5, BTF_INFO_ENC(BTF_KIND_FUNC, 0, BTF_FUNC_GLOBAL), 2), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_datasec(void) +{ + static const char strs[] = "\0x\0.data"; + /* static int a; */ + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* VAR x */ /* [2] */ + BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_VAR, 0, 0), 1), + BTF_VAR_STATIC, + /* DATASEC val */ /* [3] */ + BTF_TYPE_ENC(3, BTF_INFO_ENC(BTF_KIND_DATASEC, 0, 1), 4), + BTF_VAR_SECINFO_ENC(2, 0, 4), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_float(void) +{ + static const char strs[] = "\0float"; + __u32 types[] = { + /* float */ + BTF_TYPE_FLOAT_ENC(1, 4), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_decl_tag(void) +{ + static const char strs[] = "\0tag"; + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* VAR x */ /* [2] */ + BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_VAR, 0, 0), 1), + BTF_VAR_STATIC, + /* attr */ + BTF_TYPE_DECL_TAG_ENC(1, 2, -1), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_btf_type_tag(void) +{ + static const char strs[] = "\0tag"; + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* attr */ + BTF_TYPE_TYPE_TAG_ENC(1, 1), /* [2] */ + /* ptr */ + BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_PTR, 0, 0), 2), /* [3] */ + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_array_mmap(void) +{ + LIBBPF_OPTS(bpf_map_create_opts, opts, .map_flags = BPF_F_MMAPABLE); + int fd; + + fd = bpf_map_create(BPF_MAP_TYPE_ARRAY, "libbpf_mmap", sizeof(int), sizeof(int), 1, &opts); + return probe_fd(fd); +} + +static int probe_kern_exp_attach_type(void) +{ + LIBBPF_OPTS(bpf_prog_load_opts, opts, .expected_attach_type = BPF_CGROUP_INET_SOCK_CREATE); + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int fd, insn_cnt = ARRAY_SIZE(insns); + + /* use any valid combination of program type and (optional) + * non-zero expected attach type (i.e., not a BPF_CGROUP_INET_INGRESS) + * to see if kernel supports expected_attach_type field for + * BPF_PROG_LOAD command + */ + fd = bpf_prog_load(BPF_PROG_TYPE_CGROUP_SOCK, NULL, "GPL", insns, insn_cnt, &opts); + return probe_fd(fd); +} + +static int probe_kern_probe_read_kernel(void) +{ + struct bpf_insn insns[] = { + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), /* r1 = r10 (fp) */ + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), /* r1 += -8 */ + BPF_MOV64_IMM(BPF_REG_2, 8), /* r2 = 8 */ + BPF_MOV64_IMM(BPF_REG_3, 0), /* r3 = 0 */ + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_probe_read_kernel), + BPF_EXIT_INSN(), + }; + int fd, insn_cnt = ARRAY_SIZE(insns); + + fd = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", insns, insn_cnt, NULL); + return probe_fd(fd); +} + +static int probe_prog_bind_map(void) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int ret, map, prog, insn_cnt = ARRAY_SIZE(insns); + + map = bpf_map_create(BPF_MAP_TYPE_ARRAY, "libbpf_det_bind", sizeof(int), 32, 1, NULL); + if (map < 0) { + ret = -errno; + cp = libbpf_strerror_r(ret, errmsg, sizeof(errmsg)); + pr_warn("Error in %s():%s(%d). Couldn't create simple array map.\n", + __func__, cp, -ret); + return ret; + } + + prog = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL); + if (prog < 0) { + close(map); + return 0; + } + + ret = bpf_prog_bind_map(prog, map, NULL); + + close(map); + close(prog); + + return ret >= 0; +} + +static int probe_module_btf(void) +{ + static const char strs[] = "\0int"; + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), + }; + struct bpf_btf_info info; + __u32 len = sizeof(info); + char name[16]; + int fd, err; + + fd = libbpf__load_raw_btf((char *)types, sizeof(types), strs, sizeof(strs)); + if (fd < 0) + return 0; /* BTF not supported at all */ + + memset(&info, 0, sizeof(info)); + info.name = ptr_to_u64(name); + info.name_len = sizeof(name); + + /* check that BPF_OBJ_GET_INFO_BY_FD supports specifying name pointer; + * kernel's module BTF support coincides with support for + * name/name_len fields in struct bpf_btf_info. + */ + err = bpf_btf_get_info_by_fd(fd, &info, &len); + close(fd); + return !err; +} + +static int probe_perf_link(void) +{ + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int prog_fd, link_fd, err; + + prog_fd = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", + insns, ARRAY_SIZE(insns), NULL); + if (prog_fd < 0) + return -errno; + + /* use invalid perf_event FD to get EBADF, if link is supported; + * otherwise EINVAL should be returned + */ + link_fd = bpf_link_create(prog_fd, -1, BPF_PERF_EVENT, NULL); + err = -errno; /* close() can clobber errno */ + + if (link_fd >= 0) + close(link_fd); + close(prog_fd); + + return link_fd < 0 && err == -EBADF; +} + +static int probe_kern_bpf_cookie(void) +{ + struct bpf_insn insns[] = { + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_attach_cookie), + BPF_EXIT_INSN(), + }; + int ret, insn_cnt = ARRAY_SIZE(insns); + + ret = bpf_prog_load(BPF_PROG_TYPE_KPROBE, NULL, "GPL", insns, insn_cnt, NULL); + return probe_fd(ret); +} + +static int probe_kern_btf_enum64(void) +{ + static const char strs[] = "\0enum64"; + __u32 types[] = { + BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), + }; + + return probe_fd(libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs))); +} + +static int probe_kern_syscall_wrapper(void); + +enum kern_feature_result { + FEAT_UNKNOWN = 0, + FEAT_SUPPORTED = 1, + FEAT_MISSING = 2, +}; + +typedef int (*feature_probe_fn)(void); + +static struct kern_feature_desc { + const char *desc; + feature_probe_fn probe; + enum kern_feature_result res; +} feature_probes[__FEAT_CNT] = { + [FEAT_PROG_NAME] = { + "BPF program name", probe_kern_prog_name, + }, + [FEAT_GLOBAL_DATA] = { + "global variables", probe_kern_global_data, + }, + [FEAT_BTF] = { + "minimal BTF", probe_kern_btf, + }, + [FEAT_BTF_FUNC] = { + "BTF functions", probe_kern_btf_func, + }, + [FEAT_BTF_GLOBAL_FUNC] = { + "BTF global function", probe_kern_btf_func_global, + }, + [FEAT_BTF_DATASEC] = { + "BTF data section and variable", probe_kern_btf_datasec, + }, + [FEAT_ARRAY_MMAP] = { + "ARRAY map mmap()", probe_kern_array_mmap, + }, + [FEAT_EXP_ATTACH_TYPE] = { + "BPF_PROG_LOAD expected_attach_type attribute", + probe_kern_exp_attach_type, + }, + [FEAT_PROBE_READ_KERN] = { + "bpf_probe_read_kernel() helper", probe_kern_probe_read_kernel, + }, + [FEAT_PROG_BIND_MAP] = { + "BPF_PROG_BIND_MAP support", probe_prog_bind_map, + }, + [FEAT_MODULE_BTF] = { + "module BTF support", probe_module_btf, + }, + [FEAT_BTF_FLOAT] = { + "BTF_KIND_FLOAT support", probe_kern_btf_float, + }, + [FEAT_PERF_LINK] = { + "BPF perf link support", probe_perf_link, + }, + [FEAT_BTF_DECL_TAG] = { + "BTF_KIND_DECL_TAG support", probe_kern_btf_decl_tag, + }, + [FEAT_BTF_TYPE_TAG] = { + "BTF_KIND_TYPE_TAG support", probe_kern_btf_type_tag, + }, + [FEAT_MEMCG_ACCOUNT] = { + "memcg-based memory accounting", probe_memcg_account, + }, + [FEAT_BPF_COOKIE] = { + "BPF cookie support", probe_kern_bpf_cookie, + }, + [FEAT_BTF_ENUM64] = { + "BTF_KIND_ENUM64 support", probe_kern_btf_enum64, + }, + [FEAT_SYSCALL_WRAPPER] = { + "Kernel using syscall wrapper", probe_kern_syscall_wrapper, + }, +}; + +bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id) +{ + struct kern_feature_desc *feat = &feature_probes[feat_id]; + int ret; + + if (obj && obj->gen_loader) + /* To generate loader program assume the latest kernel + * to avoid doing extra prog_load, map_create syscalls. + */ + return true; + + if (READ_ONCE(feat->res) == FEAT_UNKNOWN) { + ret = feat->probe(); + if (ret > 0) { + WRITE_ONCE(feat->res, FEAT_SUPPORTED); + } else if (ret == 0) { + WRITE_ONCE(feat->res, FEAT_MISSING); + } else { + pr_warn("Detection of kernel %s support failed: %d\n", feat->desc, ret); + WRITE_ONCE(feat->res, FEAT_MISSING); + } + } + + return READ_ONCE(feat->res) == FEAT_SUPPORTED; +} + +static bool map_is_reuse_compat(const struct bpf_map *map, int map_fd) +{ + struct bpf_map_info map_info; + char msg[STRERR_BUFSIZE]; + __u32 map_info_len = sizeof(map_info); + int err; + + memset(&map_info, 0, map_info_len); + err = bpf_map_get_info_by_fd(map_fd, &map_info, &map_info_len); + if (err && errno == EINVAL) + err = bpf_get_map_info_from_fdinfo(map_fd, &map_info); + if (err) { + pr_warn("failed to get map info for map FD %d: %s\n", map_fd, + libbpf_strerror_r(errno, msg, sizeof(msg))); + return false; + } + + return (map_info.type == map->def.type && + map_info.key_size == map->def.key_size && + map_info.value_size == map->def.value_size && + map_info.max_entries == map->def.max_entries && + map_info.map_flags == map->def.map_flags && + map_info.map_extra == map->map_extra); +} + +static int +bpf_object__reuse_map(struct bpf_map *map) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + int err, pin_fd; + + pin_fd = bpf_obj_get(map->pin_path); + if (pin_fd < 0) { + err = -errno; + if (err == -ENOENT) { + pr_debug("found no pinned map to reuse at '%s'\n", + map->pin_path); + return 0; + } + + cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg)); + pr_warn("couldn't retrieve pinned map '%s': %s\n", + map->pin_path, cp); + return err; + } + + if (!map_is_reuse_compat(map, pin_fd)) { + pr_warn("couldn't reuse pinned map at '%s': parameter mismatch\n", + map->pin_path); + close(pin_fd); + return -EINVAL; + } + + err = bpf_map__reuse_fd(map, pin_fd); + close(pin_fd); + if (err) + return err; + + map->pinned = true; + pr_debug("reused pinned map at '%s'\n", map->pin_path); + + return 0; +} + +static int +bpf_object__populate_internal_map(struct bpf_object *obj, struct bpf_map *map) +{ + enum libbpf_map_type map_type = map->libbpf_type; + char *cp, errmsg[STRERR_BUFSIZE]; + int err, zero = 0; + + if (obj->gen_loader) { + bpf_gen__map_update_elem(obj->gen_loader, map - obj->maps, + map->mmaped, map->def.value_size); + if (map_type == LIBBPF_MAP_RODATA || map_type == LIBBPF_MAP_KCONFIG) + bpf_gen__map_freeze(obj->gen_loader, map - obj->maps); + return 0; + } + err = bpf_map_update_elem(map->fd, &zero, map->mmaped, 0); + if (err) { + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("Error setting initial map(%s) contents: %s\n", + map->name, cp); + return err; + } + + /* Freeze .rodata and .kconfig map as read-only from syscall side. */ + if (map_type == LIBBPF_MAP_RODATA || map_type == LIBBPF_MAP_KCONFIG) { + err = bpf_map_freeze(map->fd); + if (err) { + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("Error freezing map(%s) as read-only: %s\n", + map->name, cp); + return err; + } + } + return 0; +} + +static void bpf_map__destroy(struct bpf_map *map); + +static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map, bool is_inner) +{ + LIBBPF_OPTS(bpf_map_create_opts, create_attr); + struct bpf_map_def *def = &map->def; + const char *map_name = NULL; + int err = 0; + + if (kernel_supports(obj, FEAT_PROG_NAME)) + map_name = map->name; + create_attr.map_ifindex = map->map_ifindex; + create_attr.map_flags = def->map_flags; + create_attr.numa_node = map->numa_node; + create_attr.map_extra = map->map_extra; + + if (bpf_map__is_struct_ops(map)) + create_attr.btf_vmlinux_value_type_id = map->btf_vmlinux_value_type_id; + + if (obj->btf && btf__fd(obj->btf) >= 0) { + create_attr.btf_fd = btf__fd(obj->btf); + create_attr.btf_key_type_id = map->btf_key_type_id; + create_attr.btf_value_type_id = map->btf_value_type_id; + } + + if (bpf_map_type__is_map_in_map(def->type)) { + if (map->inner_map) { + err = bpf_object__create_map(obj, map->inner_map, true); + if (err) { + pr_warn("map '%s': failed to create inner map: %d\n", + map->name, err); + return err; + } + map->inner_map_fd = bpf_map__fd(map->inner_map); + } + if (map->inner_map_fd >= 0) + create_attr.inner_map_fd = map->inner_map_fd; + } + + switch (def->type) { + case BPF_MAP_TYPE_PERF_EVENT_ARRAY: + case BPF_MAP_TYPE_CGROUP_ARRAY: + case BPF_MAP_TYPE_STACK_TRACE: + case BPF_MAP_TYPE_ARRAY_OF_MAPS: + case BPF_MAP_TYPE_HASH_OF_MAPS: + case BPF_MAP_TYPE_DEVMAP: + case BPF_MAP_TYPE_DEVMAP_HASH: + case BPF_MAP_TYPE_CPUMAP: + case BPF_MAP_TYPE_XSKMAP: + case BPF_MAP_TYPE_SOCKMAP: + case BPF_MAP_TYPE_SOCKHASH: + case BPF_MAP_TYPE_QUEUE: + case BPF_MAP_TYPE_STACK: + create_attr.btf_fd = 0; + create_attr.btf_key_type_id = 0; + create_attr.btf_value_type_id = 0; + map->btf_key_type_id = 0; + map->btf_value_type_id = 0; + default: + break; + } + + if (obj->gen_loader) { + bpf_gen__map_create(obj->gen_loader, def->type, map_name, + def->key_size, def->value_size, def->max_entries, + &create_attr, is_inner ? -1 : map - obj->maps); + /* Pretend to have valid FD to pass various fd >= 0 checks. + * This fd == 0 will not be used with any syscall and will be reset to -1 eventually. + */ + map->fd = 0; + } else { + map->fd = bpf_map_create(def->type, map_name, + def->key_size, def->value_size, + def->max_entries, &create_attr); + } + if (map->fd < 0 && (create_attr.btf_key_type_id || + create_attr.btf_value_type_id)) { + char *cp, errmsg[STRERR_BUFSIZE]; + + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n", + map->name, cp, err); + create_attr.btf_fd = 0; + create_attr.btf_key_type_id = 0; + create_attr.btf_value_type_id = 0; + map->btf_key_type_id = 0; + map->btf_value_type_id = 0; + map->fd = bpf_map_create(def->type, map_name, + def->key_size, def->value_size, + def->max_entries, &create_attr); + } + + err = map->fd < 0 ? -errno : 0; + + if (bpf_map_type__is_map_in_map(def->type) && map->inner_map) { + if (obj->gen_loader) + map->inner_map->fd = -1; + bpf_map__destroy(map->inner_map); + zfree(&map->inner_map); + } + + return err; +} + +static int init_map_in_map_slots(struct bpf_object *obj, struct bpf_map *map) +{ + const struct bpf_map *targ_map; + unsigned int i; + int fd, err = 0; + + for (i = 0; i < map->init_slots_sz; i++) { + if (!map->init_slots[i]) + continue; + + targ_map = map->init_slots[i]; + fd = bpf_map__fd(targ_map); + + if (obj->gen_loader) { + bpf_gen__populate_outer_map(obj->gen_loader, + map - obj->maps, i, + targ_map - obj->maps); + } else { + err = bpf_map_update_elem(map->fd, &i, &fd, 0); + } + if (err) { + err = -errno; + pr_warn("map '%s': failed to initialize slot [%d] to map '%s' fd=%d: %d\n", + map->name, i, targ_map->name, fd, err); + return err; + } + pr_debug("map '%s': slot [%d] set to map '%s' fd=%d\n", + map->name, i, targ_map->name, fd); + } + + zfree(&map->init_slots); + map->init_slots_sz = 0; + + return 0; +} + +static int init_prog_array_slots(struct bpf_object *obj, struct bpf_map *map) +{ + const struct bpf_program *targ_prog; + unsigned int i; + int fd, err; + + if (obj->gen_loader) + return -ENOTSUP; + + for (i = 0; i < map->init_slots_sz; i++) { + if (!map->init_slots[i]) + continue; + + targ_prog = map->init_slots[i]; + fd = bpf_program__fd(targ_prog); + + err = bpf_map_update_elem(map->fd, &i, &fd, 0); + if (err) { + err = -errno; + pr_warn("map '%s': failed to initialize slot [%d] to prog '%s' fd=%d: %d\n", + map->name, i, targ_prog->name, fd, err); + return err; + } + pr_debug("map '%s': slot [%d] set to prog '%s' fd=%d\n", + map->name, i, targ_prog->name, fd); + } + + zfree(&map->init_slots); + map->init_slots_sz = 0; + + return 0; +} + +static int bpf_object_init_prog_arrays(struct bpf_object *obj) +{ + struct bpf_map *map; + int i, err; + + for (i = 0; i < obj->nr_maps; i++) { + map = &obj->maps[i]; + + if (!map->init_slots_sz || map->def.type != BPF_MAP_TYPE_PROG_ARRAY) + continue; + + err = init_prog_array_slots(obj, map); + if (err < 0) { + zclose(map->fd); + return err; + } + } + return 0; +} + +static int map_set_def_max_entries(struct bpf_map *map) +{ + if (map->def.type == BPF_MAP_TYPE_PERF_EVENT_ARRAY && !map->def.max_entries) { + int nr_cpus; + + nr_cpus = libbpf_num_possible_cpus(); + if (nr_cpus < 0) { + pr_warn("map '%s': failed to determine number of system CPUs: %d\n", + map->name, nr_cpus); + return nr_cpus; + } + pr_debug("map '%s': setting size to %d\n", map->name, nr_cpus); + map->def.max_entries = nr_cpus; + } + + return 0; +} + +static int +bpf_object__create_maps(struct bpf_object *obj) +{ + struct bpf_map *map; + char *cp, errmsg[STRERR_BUFSIZE]; + unsigned int i, j; + int err; + bool retried; + + for (i = 0; i < obj->nr_maps; i++) { + map = &obj->maps[i]; + + /* To support old kernels, we skip creating global data maps + * (.rodata, .data, .kconfig, etc); later on, during program + * loading, if we detect that at least one of the to-be-loaded + * programs is referencing any global data map, we'll error + * out with program name and relocation index logged. + * This approach allows to accommodate Clang emitting + * unnecessary .rodata.str1.1 sections for string literals, + * but also it allows to have CO-RE applications that use + * global variables in some of BPF programs, but not others. + * If those global variable-using programs are not loaded at + * runtime due to bpf_program__set_autoload(prog, false), + * bpf_object loading will succeed just fine even on old + * kernels. + */ + if (bpf_map__is_internal(map) && !kernel_supports(obj, FEAT_GLOBAL_DATA)) + map->autocreate = false; + + if (!map->autocreate) { + pr_debug("map '%s': skipped auto-creating...\n", map->name); + continue; + } + + err = map_set_def_max_entries(map); + if (err) + goto err_out; + + retried = false; +retry: + if (map->pin_path) { + err = bpf_object__reuse_map(map); + if (err) { + pr_warn("map '%s': error reusing pinned map\n", + map->name); + goto err_out; + } + if (retried && map->fd < 0) { + pr_warn("map '%s': cannot find pinned map\n", + map->name); + err = -ENOENT; + goto err_out; + } + } + + if (map->fd >= 0) { + pr_debug("map '%s': skipping creation (preset fd=%d)\n", + map->name, map->fd); + } else { + err = bpf_object__create_map(obj, map, false); + if (err) + goto err_out; + + pr_debug("map '%s': created successfully, fd=%d\n", + map->name, map->fd); + + if (bpf_map__is_internal(map)) { + err = bpf_object__populate_internal_map(obj, map); + if (err < 0) { + zclose(map->fd); + goto err_out; + } + } + + if (map->init_slots_sz && map->def.type != BPF_MAP_TYPE_PROG_ARRAY) { + err = init_map_in_map_slots(obj, map); + if (err < 0) { + zclose(map->fd); + goto err_out; + } + } + } + + if (map->pin_path && !map->pinned) { + err = bpf_map__pin(map, NULL); + if (err) { + zclose(map->fd); + if (!retried && err == -EEXIST) { + retried = true; + goto retry; + } + pr_warn("map '%s': failed to auto-pin at '%s': %d\n", + map->name, map->pin_path, err); + goto err_out; + } + } + } + + return 0; + +err_out: + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("map '%s': failed to create: %s(%d)\n", map->name, cp, err); + pr_perm_msg(err); + for (j = 0; j < i; j++) + zclose(obj->maps[j].fd); + return err; +} + +static bool bpf_core_is_flavor_sep(const char *s) +{ + /* check X___Y name pattern, where X and Y are not underscores */ + return s[0] != '_' && /* X */ + s[1] == '_' && s[2] == '_' && s[3] == '_' && /* ___ */ + s[4] != '_'; /* Y */ +} + +/* Given 'some_struct_name___with_flavor' return the length of a name prefix + * before last triple underscore. Struct name part after last triple + * underscore is ignored by BPF CO-RE relocation during relocation matching. + */ +size_t bpf_core_essential_name_len(const char *name) +{ + size_t n = strlen(name); + int i; + + for (i = n - 5; i >= 0; i--) { + if (bpf_core_is_flavor_sep(name + i)) + return i + 1; + } + return n; +} + +void bpf_core_free_cands(struct bpf_core_cand_list *cands) +{ + if (!cands) + return; + + free(cands->cands); + free(cands); +} + +int bpf_core_add_cands(struct bpf_core_cand *local_cand, + size_t local_essent_len, + const struct btf *targ_btf, + const char *targ_btf_name, + int targ_start_id, + struct bpf_core_cand_list *cands) +{ + struct bpf_core_cand *new_cands, *cand; + const struct btf_type *t, *local_t; + const char *targ_name, *local_name; + size_t targ_essent_len; + int n, i; + + local_t = btf__type_by_id(local_cand->btf, local_cand->id); + local_name = btf__str_by_offset(local_cand->btf, local_t->name_off); + + n = btf__type_cnt(targ_btf); + for (i = targ_start_id; i < n; i++) { + t = btf__type_by_id(targ_btf, i); + if (!btf_kind_core_compat(t, local_t)) + continue; + + targ_name = btf__name_by_offset(targ_btf, t->name_off); + if (str_is_empty(targ_name)) + continue; + + targ_essent_len = bpf_core_essential_name_len(targ_name); + if (targ_essent_len != local_essent_len) + continue; + + if (strncmp(local_name, targ_name, local_essent_len) != 0) + continue; + + pr_debug("CO-RE relocating [%d] %s %s: found target candidate [%d] %s %s in [%s]\n", + local_cand->id, btf_kind_str(local_t), + local_name, i, btf_kind_str(t), targ_name, + targ_btf_name); + new_cands = libbpf_reallocarray(cands->cands, cands->len + 1, + sizeof(*cands->cands)); + if (!new_cands) + return -ENOMEM; + + cand = &new_cands[cands->len]; + cand->btf = targ_btf; + cand->id = i; + + cands->cands = new_cands; + cands->len++; + } + return 0; +} + +static int load_module_btfs(struct bpf_object *obj) +{ + struct bpf_btf_info info; + struct module_btf *mod_btf; + struct btf *btf; + char name[64]; + __u32 id = 0, len; + int err, fd; + + if (obj->btf_modules_loaded) + return 0; + + if (obj->gen_loader) + return 0; + + /* don't do this again, even if we find no module BTFs */ + obj->btf_modules_loaded = true; + + /* kernel too old to support module BTFs */ + if (!kernel_supports(obj, FEAT_MODULE_BTF)) + return 0; + + while (true) { + err = bpf_btf_get_next_id(id, &id); + if (err && errno == ENOENT) + return 0; + if (err) { + err = -errno; + pr_warn("failed to iterate BTF objects: %d\n", err); + return err; + } + + fd = bpf_btf_get_fd_by_id(id); + if (fd < 0) { + if (errno == ENOENT) + continue; /* expected race: BTF was unloaded */ + err = -errno; + pr_warn("failed to get BTF object #%d FD: %d\n", id, err); + return err; + } + + len = sizeof(info); + memset(&info, 0, sizeof(info)); + info.name = ptr_to_u64(name); + info.name_len = sizeof(name); + + err = bpf_btf_get_info_by_fd(fd, &info, &len); + if (err) { + err = -errno; + pr_warn("failed to get BTF object #%d info: %d\n", id, err); + goto err_out; + } + + /* ignore non-module BTFs */ + if (!info.kernel_btf || strcmp(name, "vmlinux") == 0) { + close(fd); + continue; + } + + btf = btf_get_from_fd(fd, obj->btf_vmlinux); + err = libbpf_get_error(btf); + if (err) { + pr_warn("failed to load module [%s]'s BTF object #%d: %d\n", + name, id, err); + goto err_out; + } + + err = libbpf_ensure_mem((void **)&obj->btf_modules, &obj->btf_module_cap, + sizeof(*obj->btf_modules), obj->btf_module_cnt + 1); + if (err) + goto err_out; + + mod_btf = &obj->btf_modules[obj->btf_module_cnt++]; + + mod_btf->btf = btf; + mod_btf->id = id; + mod_btf->fd = fd; + mod_btf->name = strdup(name); + if (!mod_btf->name) { + err = -ENOMEM; + goto err_out; + } + continue; + +err_out: + close(fd); + return err; + } + + return 0; +} + +static struct bpf_core_cand_list * +bpf_core_find_cands(struct bpf_object *obj, const struct btf *local_btf, __u32 local_type_id) +{ + struct bpf_core_cand local_cand = {}; + struct bpf_core_cand_list *cands; + const struct btf *main_btf; + const struct btf_type *local_t; + const char *local_name; + size_t local_essent_len; + int err, i; + + local_cand.btf = local_btf; + local_cand.id = local_type_id; + local_t = btf__type_by_id(local_btf, local_type_id); + if (!local_t) + return ERR_PTR(-EINVAL); + + local_name = btf__name_by_offset(local_btf, local_t->name_off); + if (str_is_empty(local_name)) + return ERR_PTR(-EINVAL); + local_essent_len = bpf_core_essential_name_len(local_name); + + cands = calloc(1, sizeof(*cands)); + if (!cands) + return ERR_PTR(-ENOMEM); + + /* Attempt to find target candidates in vmlinux BTF first */ + main_btf = obj->btf_vmlinux_override ?: obj->btf_vmlinux; + err = bpf_core_add_cands(&local_cand, local_essent_len, main_btf, "vmlinux", 1, cands); + if (err) + goto err_out; + + /* if vmlinux BTF has any candidate, don't got for module BTFs */ + if (cands->len) + return cands; + + /* if vmlinux BTF was overridden, don't attempt to load module BTFs */ + if (obj->btf_vmlinux_override) + return cands; + + /* now look through module BTFs, trying to still find candidates */ + err = load_module_btfs(obj); + if (err) + goto err_out; + + for (i = 0; i < obj->btf_module_cnt; i++) { + err = bpf_core_add_cands(&local_cand, local_essent_len, + obj->btf_modules[i].btf, + obj->btf_modules[i].name, + btf__type_cnt(obj->btf_vmlinux), + cands); + if (err) + goto err_out; + } + + return cands; +err_out: + bpf_core_free_cands(cands); + return ERR_PTR(err); +} + +/* Check local and target types for compatibility. This check is used for + * type-based CO-RE relocations and follow slightly different rules than + * field-based relocations. This function assumes that root types were already + * checked for name match. Beyond that initial root-level name check, names + * are completely ignored. Compatibility rules are as follows: + * - any two STRUCTs/UNIONs/FWDs/ENUMs/INTs are considered compatible, but + * kind should match for local and target types (i.e., STRUCT is not + * compatible with UNION); + * - for ENUMs, the size is ignored; + * - for INT, size and signedness are ignored; + * - for ARRAY, dimensionality is ignored, element types are checked for + * compatibility recursively; + * - CONST/VOLATILE/RESTRICT modifiers are ignored; + * - TYPEDEFs/PTRs are compatible if types they pointing to are compatible; + * - FUNC_PROTOs are compatible if they have compatible signature: same + * number of input args and compatible return and argument types. + * These rules are not set in stone and probably will be adjusted as we get + * more experience with using BPF CO-RE relocations. + */ +int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id) +{ + return __bpf_core_types_are_compat(local_btf, local_id, targ_btf, targ_id, 32); +} + +int bpf_core_types_match(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id) +{ + return __bpf_core_types_match(local_btf, local_id, targ_btf, targ_id, false, 32); +} + +static size_t bpf_core_hash_fn(const long key, void *ctx) +{ + return key; +} + +static bool bpf_core_equal_fn(const long k1, const long k2, void *ctx) +{ + return k1 == k2; +} + +static int record_relo_core(struct bpf_program *prog, + const struct bpf_core_relo *core_relo, int insn_idx) +{ + struct reloc_desc *relos, *relo; + + relos = libbpf_reallocarray(prog->reloc_desc, + prog->nr_reloc + 1, sizeof(*relos)); + if (!relos) + return -ENOMEM; + relo = &relos[prog->nr_reloc]; + relo->type = RELO_CORE; + relo->insn_idx = insn_idx; + relo->core_relo = core_relo; + prog->reloc_desc = relos; + prog->nr_reloc++; + return 0; +} + +static const struct bpf_core_relo *find_relo_core(struct bpf_program *prog, int insn_idx) +{ + struct reloc_desc *relo; + int i; + + for (i = 0; i < prog->nr_reloc; i++) { + relo = &prog->reloc_desc[i]; + if (relo->type != RELO_CORE || relo->insn_idx != insn_idx) + continue; + + return relo->core_relo; + } + + return NULL; +} + +static int bpf_core_resolve_relo(struct bpf_program *prog, + const struct bpf_core_relo *relo, + int relo_idx, + const struct btf *local_btf, + struct hashmap *cand_cache, + struct bpf_core_relo_res *targ_res) +{ + struct bpf_core_spec specs_scratch[3] = {}; + struct bpf_core_cand_list *cands = NULL; + const char *prog_name = prog->name; + const struct btf_type *local_type; + const char *local_name; + __u32 local_id = relo->type_id; + int err; + + local_type = btf__type_by_id(local_btf, local_id); + if (!local_type) + return -EINVAL; + + local_name = btf__name_by_offset(local_btf, local_type->name_off); + if (!local_name) + return -EINVAL; + + if (relo->kind != BPF_CORE_TYPE_ID_LOCAL && + !hashmap__find(cand_cache, local_id, &cands)) { + cands = bpf_core_find_cands(prog->obj, local_btf, local_id); + if (IS_ERR(cands)) { + pr_warn("prog '%s': relo #%d: target candidate search failed for [%d] %s %s: %ld\n", + prog_name, relo_idx, local_id, btf_kind_str(local_type), + local_name, PTR_ERR(cands)); + return PTR_ERR(cands); + } + err = hashmap__set(cand_cache, local_id, cands, NULL, NULL); + if (err) { + bpf_core_free_cands(cands); + return err; + } + } + + return bpf_core_calc_relo_insn(prog_name, relo, relo_idx, local_btf, cands, specs_scratch, + targ_res); +} + +static int +bpf_object__relocate_core(struct bpf_object *obj, const char *targ_btf_path) +{ + const struct btf_ext_info_sec *sec; + struct bpf_core_relo_res targ_res; + const struct bpf_core_relo *rec; + const struct btf_ext_info *seg; + struct hashmap_entry *entry; + struct hashmap *cand_cache = NULL; + struct bpf_program *prog; + struct bpf_insn *insn; + const char *sec_name; + int i, err = 0, insn_idx, sec_idx, sec_num; + + if (obj->btf_ext->core_relo_info.len == 0) + return 0; + + if (targ_btf_path) { + obj->btf_vmlinux_override = btf__parse(targ_btf_path, NULL); + err = libbpf_get_error(obj->btf_vmlinux_override); + if (err) { + pr_warn("failed to parse target BTF: %d\n", err); + return err; + } + } + + cand_cache = hashmap__new(bpf_core_hash_fn, bpf_core_equal_fn, NULL); + if (IS_ERR(cand_cache)) { + err = PTR_ERR(cand_cache); + goto out; + } + + seg = &obj->btf_ext->core_relo_info; + sec_num = 0; + for_each_btf_ext_sec(seg, sec) { + sec_idx = seg->sec_idxs[sec_num]; + sec_num++; + + sec_name = btf__name_by_offset(obj->btf, sec->sec_name_off); + if (str_is_empty(sec_name)) { + err = -EINVAL; + goto out; + } + + pr_debug("sec '%s': found %d CO-RE relocations\n", sec_name, sec->num_info); + + for_each_btf_ext_rec(seg, sec, i, rec) { + if (rec->insn_off % BPF_INSN_SZ) + return -EINVAL; + insn_idx = rec->insn_off / BPF_INSN_SZ; + prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); + if (!prog) { + /* When __weak subprog is "overridden" by another instance + * of the subprog from a different object file, linker still + * appends all the .BTF.ext info that used to belong to that + * eliminated subprogram. + * This is similar to what x86-64 linker does for relocations. + * So just ignore such relocations just like we ignore + * subprog instructions when discovering subprograms. + */ + pr_debug("sec '%s': skipping CO-RE relocation #%d for insn #%d belonging to eliminated weak subprogram\n", + sec_name, i, insn_idx); + continue; + } + /* no need to apply CO-RE relocation if the program is + * not going to be loaded + */ + if (!prog->autoload) + continue; + + /* adjust insn_idx from section frame of reference to the local + * program's frame of reference; (sub-)program code is not yet + * relocated, so it's enough to just subtract in-section offset + */ + insn_idx = insn_idx - prog->sec_insn_off; + if (insn_idx >= prog->insns_cnt) + return -EINVAL; + insn = &prog->insns[insn_idx]; + + err = record_relo_core(prog, rec, insn_idx); + if (err) { + pr_warn("prog '%s': relo #%d: failed to record relocation: %d\n", + prog->name, i, err); + goto out; + } + + if (prog->obj->gen_loader) + continue; + + err = bpf_core_resolve_relo(prog, rec, i, obj->btf, cand_cache, &targ_res); + if (err) { + pr_warn("prog '%s': relo #%d: failed to relocate: %d\n", + prog->name, i, err); + goto out; + } + + err = bpf_core_patch_insn(prog->name, insn, insn_idx, rec, i, &targ_res); + if (err) { + pr_warn("prog '%s': relo #%d: failed to patch insn #%u: %d\n", + prog->name, i, insn_idx, err); + goto out; + } + } + } + +out: + /* obj->btf_vmlinux and module BTFs are freed after object load */ + btf__free(obj->btf_vmlinux_override); + obj->btf_vmlinux_override = NULL; + + if (!IS_ERR_OR_NULL(cand_cache)) { + hashmap__for_each_entry(cand_cache, entry, i) { + bpf_core_free_cands(entry->pvalue); + } + hashmap__free(cand_cache); + } + return err; +} + +/* base map load ldimm64 special constant, used also for log fixup logic */ +#define MAP_LDIMM64_POISON_BASE 2001000000 +#define MAP_LDIMM64_POISON_PFX "200100" + +static void poison_map_ldimm64(struct bpf_program *prog, int relo_idx, + int insn_idx, struct bpf_insn *insn, + int map_idx, const struct bpf_map *map) +{ + int i; + + pr_debug("prog '%s': relo #%d: poisoning insn #%d that loads map #%d '%s'\n", + prog->name, relo_idx, insn_idx, map_idx, map->name); + + /* we turn single ldimm64 into two identical invalid calls */ + for (i = 0; i < 2; i++) { + insn->code = BPF_JMP | BPF_CALL; + insn->dst_reg = 0; + insn->src_reg = 0; + insn->off = 0; + /* if this instruction is reachable (not a dead code), + * verifier will complain with something like: + * invalid func unknown#2001000123 + * where lower 123 is map index into obj->maps[] array + */ + insn->imm = MAP_LDIMM64_POISON_BASE + map_idx; + + insn++; + } +} + +/* Relocate data references within program code: + * - map references; + * - global variable references; + * - extern references. + */ +static int +bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog) +{ + int i; + + for (i = 0; i < prog->nr_reloc; i++) { + struct reloc_desc *relo = &prog->reloc_desc[i]; + struct bpf_insn *insn = &prog->insns[relo->insn_idx]; + const struct bpf_map *map; + struct extern_desc *ext; + + switch (relo->type) { + case RELO_LD64: + map = &obj->maps[relo->map_idx]; + if (obj->gen_loader) { + insn[0].src_reg = BPF_PSEUDO_MAP_IDX; + insn[0].imm = relo->map_idx; + } else if (map->autocreate) { + insn[0].src_reg = BPF_PSEUDO_MAP_FD; + insn[0].imm = map->fd; + } else { + poison_map_ldimm64(prog, i, relo->insn_idx, insn, + relo->map_idx, map); + } + break; + case RELO_DATA: + map = &obj->maps[relo->map_idx]; + insn[1].imm = insn[0].imm + relo->sym_off; + if (obj->gen_loader) { + insn[0].src_reg = BPF_PSEUDO_MAP_IDX_VALUE; + insn[0].imm = relo->map_idx; + } else if (map->autocreate) { + insn[0].src_reg = BPF_PSEUDO_MAP_VALUE; + insn[0].imm = map->fd; + } else { + poison_map_ldimm64(prog, i, relo->insn_idx, insn, + relo->map_idx, map); + } + break; + case RELO_EXTERN_LD64: + ext = &obj->externs[relo->sym_off]; + if (ext->type == EXT_KCFG) { + if (obj->gen_loader) { + insn[0].src_reg = BPF_PSEUDO_MAP_IDX_VALUE; + insn[0].imm = obj->kconfig_map_idx; + } else { + insn[0].src_reg = BPF_PSEUDO_MAP_VALUE; + insn[0].imm = obj->maps[obj->kconfig_map_idx].fd; + } + insn[1].imm = ext->kcfg.data_off; + } else /* EXT_KSYM */ { + if (ext->ksym.type_id && ext->is_set) { /* typed ksyms */ + insn[0].src_reg = BPF_PSEUDO_BTF_ID; + insn[0].imm = ext->ksym.kernel_btf_id; + insn[1].imm = ext->ksym.kernel_btf_obj_fd; + } else { /* typeless ksyms or unresolved typed ksyms */ + insn[0].imm = (__u32)ext->ksym.addr; + insn[1].imm = ext->ksym.addr >> 32; + } + } + break; + case RELO_EXTERN_CALL: + ext = &obj->externs[relo->sym_off]; + insn[0].src_reg = BPF_PSEUDO_KFUNC_CALL; + if (ext->is_set) { + insn[0].imm = ext->ksym.kernel_btf_id; + insn[0].off = ext->ksym.btf_fd_idx; + } else { /* unresolved weak kfunc */ + insn[0].imm = 0; + insn[0].off = 0; + } + break; + case RELO_SUBPROG_ADDR: + if (insn[0].src_reg != BPF_PSEUDO_FUNC) { + pr_warn("prog '%s': relo #%d: bad insn\n", + prog->name, i); + return -EINVAL; + } + /* handled already */ + break; + case RELO_CALL: + /* handled already */ + break; + case RELO_CORE: + /* will be handled by bpf_program_record_relos() */ + break; + default: + pr_warn("prog '%s': relo #%d: bad relo type %d\n", + prog->name, i, relo->type); + return -EINVAL; + } + } + + return 0; +} + +static int adjust_prog_btf_ext_info(const struct bpf_object *obj, + const struct bpf_program *prog, + const struct btf_ext_info *ext_info, + void **prog_info, __u32 *prog_rec_cnt, + __u32 *prog_rec_sz) +{ + void *copy_start = NULL, *copy_end = NULL; + void *rec, *rec_end, *new_prog_info; + const struct btf_ext_info_sec *sec; + size_t old_sz, new_sz; + int i, sec_num, sec_idx, off_adj; + + sec_num = 0; + for_each_btf_ext_sec(ext_info, sec) { + sec_idx = ext_info->sec_idxs[sec_num]; + sec_num++; + if (prog->sec_idx != sec_idx) + continue; + + for_each_btf_ext_rec(ext_info, sec, i, rec) { + __u32 insn_off = *(__u32 *)rec / BPF_INSN_SZ; + + if (insn_off < prog->sec_insn_off) + continue; + if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt) + break; + + if (!copy_start) + copy_start = rec; + copy_end = rec + ext_info->rec_size; + } + + if (!copy_start) + return -ENOENT; + + /* append func/line info of a given (sub-)program to the main + * program func/line info + */ + old_sz = (size_t)(*prog_rec_cnt) * ext_info->rec_size; + new_sz = old_sz + (copy_end - copy_start); + new_prog_info = realloc(*prog_info, new_sz); + if (!new_prog_info) + return -ENOMEM; + *prog_info = new_prog_info; + *prog_rec_cnt = new_sz / ext_info->rec_size; + memcpy(new_prog_info + old_sz, copy_start, copy_end - copy_start); + + /* Kernel instruction offsets are in units of 8-byte + * instructions, while .BTF.ext instruction offsets generated + * by Clang are in units of bytes. So convert Clang offsets + * into kernel offsets and adjust offset according to program + * relocated position. + */ + off_adj = prog->sub_insn_off - prog->sec_insn_off; + rec = new_prog_info + old_sz; + rec_end = new_prog_info + new_sz; + for (; rec < rec_end; rec += ext_info->rec_size) { + __u32 *insn_off = rec; + + *insn_off = *insn_off / BPF_INSN_SZ + off_adj; + } + *prog_rec_sz = ext_info->rec_size; + return 0; + } + + return -ENOENT; +} + +static int +reloc_prog_func_and_line_info(const struct bpf_object *obj, + struct bpf_program *main_prog, + const struct bpf_program *prog) +{ + int err; + + /* no .BTF.ext relocation if .BTF.ext is missing or kernel doesn't + * supprot func/line info + */ + if (!obj->btf_ext || !kernel_supports(obj, FEAT_BTF_FUNC)) + return 0; + + /* only attempt func info relocation if main program's func_info + * relocation was successful + */ + if (main_prog != prog && !main_prog->func_info) + goto line_info; + + err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info, + &main_prog->func_info, + &main_prog->func_info_cnt, + &main_prog->func_info_rec_size); + if (err) { + if (err != -ENOENT) { + pr_warn("prog '%s': error relocating .BTF.ext function info: %d\n", + prog->name, err); + return err; + } + if (main_prog->func_info) { + /* + * Some info has already been found but has problem + * in the last btf_ext reloc. Must have to error out. + */ + pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name); + return err; + } + /* Have problem loading the very first info. Ignore the rest. */ + pr_warn("prog '%s': missing .BTF.ext function info for the main program, skipping all of .BTF.ext func info.\n", + prog->name); + } + +line_info: + /* don't relocate line info if main program's relocation failed */ + if (main_prog != prog && !main_prog->line_info) + return 0; + + err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info, + &main_prog->line_info, + &main_prog->line_info_cnt, + &main_prog->line_info_rec_size); + if (err) { + if (err != -ENOENT) { + pr_warn("prog '%s': error relocating .BTF.ext line info: %d\n", + prog->name, err); + return err; + } + if (main_prog->line_info) { + /* + * Some info has already been found but has problem + * in the last btf_ext reloc. Must have to error out. + */ + pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name); + return err; + } + /* Have problem loading the very first info. Ignore the rest. */ + pr_warn("prog '%s': missing .BTF.ext line info for the main program, skipping all of .BTF.ext line info.\n", + prog->name); + } + return 0; +} + +static int cmp_relo_by_insn_idx(const void *key, const void *elem) +{ + size_t insn_idx = *(const size_t *)key; + const struct reloc_desc *relo = elem; + + if (insn_idx == relo->insn_idx) + return 0; + return insn_idx < relo->insn_idx ? -1 : 1; +} + +static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) +{ + if (!prog->nr_reloc) + return NULL; + return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc, + sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx); +} + +static int append_subprog_relos(struct bpf_program *main_prog, struct bpf_program *subprog) +{ + int new_cnt = main_prog->nr_reloc + subprog->nr_reloc; + struct reloc_desc *relos; + int i; + + if (main_prog == subprog) + return 0; + relos = libbpf_reallocarray(main_prog->reloc_desc, new_cnt, sizeof(*relos)); + if (!relos) + return -ENOMEM; + if (subprog->nr_reloc) + memcpy(relos + main_prog->nr_reloc, subprog->reloc_desc, + sizeof(*relos) * subprog->nr_reloc); + + for (i = main_prog->nr_reloc; i < new_cnt; i++) + relos[i].insn_idx += subprog->sub_insn_off; + /* After insn_idx adjustment the 'relos' array is still sorted + * by insn_idx and doesn't break bsearch. + */ + main_prog->reloc_desc = relos; + main_prog->nr_reloc = new_cnt; + return 0; +} + +static int +bpf_object__reloc_code(struct bpf_object *obj, struct bpf_program *main_prog, + struct bpf_program *prog) +{ + size_t sub_insn_idx, insn_idx, new_cnt; + struct bpf_program *subprog; + struct bpf_insn *insns, *insn; + struct reloc_desc *relo; + int err; + + err = reloc_prog_func_and_line_info(obj, main_prog, prog); + if (err) + return err; + + for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) { + insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; + if (!insn_is_subprog_call(insn) && !insn_is_pseudo_func(insn)) + continue; + + relo = find_prog_insn_relo(prog, insn_idx); + if (relo && relo->type == RELO_EXTERN_CALL) + /* kfunc relocations will be handled later + * in bpf_object__relocate_data() + */ + continue; + if (relo && relo->type != RELO_CALL && relo->type != RELO_SUBPROG_ADDR) { + pr_warn("prog '%s': unexpected relo for insn #%zu, type %d\n", + prog->name, insn_idx, relo->type); + return -LIBBPF_ERRNO__RELOC; + } + if (relo) { + /* sub-program instruction index is a combination of + * an offset of a symbol pointed to by relocation and + * call instruction's imm field; for global functions, + * call always has imm = -1, but for static functions + * relocation is against STT_SECTION and insn->imm + * points to a start of a static function + * + * for subprog addr relocation, the relo->sym_off + insn->imm is + * the byte offset in the corresponding section. + */ + if (relo->type == RELO_CALL) + sub_insn_idx = relo->sym_off / BPF_INSN_SZ + insn->imm + 1; + else + sub_insn_idx = (relo->sym_off + insn->imm) / BPF_INSN_SZ; + } else if (insn_is_pseudo_func(insn)) { + /* + * RELO_SUBPROG_ADDR relo is always emitted even if both + * functions are in the same section, so it shouldn't reach here. + */ + pr_warn("prog '%s': missing subprog addr relo for insn #%zu\n", + prog->name, insn_idx); + return -LIBBPF_ERRNO__RELOC; + } else { + /* if subprogram call is to a static function within + * the same ELF section, there won't be any relocation + * emitted, but it also means there is no additional + * offset necessary, insns->imm is relative to + * instruction's original position within the section + */ + sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1; + } + + /* we enforce that sub-programs should be in .text section */ + subprog = find_prog_by_sec_insn(obj, obj->efile.text_shndx, sub_insn_idx); + if (!subprog) { + pr_warn("prog '%s': no .text section found yet sub-program call exists\n", + prog->name); + return -LIBBPF_ERRNO__RELOC; + } + + /* if it's the first call instruction calling into this + * subprogram (meaning this subprog hasn't been processed + * yet) within the context of current main program: + * - append it at the end of main program's instructions blog; + * - process is recursively, while current program is put on hold; + * - if that subprogram calls some other not yet processes + * subprogram, same thing will happen recursively until + * there are no more unprocesses subprograms left to append + * and relocate. + */ + if (subprog->sub_insn_off == 0) { + subprog->sub_insn_off = main_prog->insns_cnt; + + new_cnt = main_prog->insns_cnt + subprog->insns_cnt; + insns = libbpf_reallocarray(main_prog->insns, new_cnt, sizeof(*insns)); + if (!insns) { + pr_warn("prog '%s': failed to realloc prog code\n", main_prog->name); + return -ENOMEM; + } + main_prog->insns = insns; + main_prog->insns_cnt = new_cnt; + + memcpy(main_prog->insns + subprog->sub_insn_off, subprog->insns, + subprog->insns_cnt * sizeof(*insns)); + + pr_debug("prog '%s': added %zu insns from sub-prog '%s'\n", + main_prog->name, subprog->insns_cnt, subprog->name); + + /* The subprog insns are now appended. Append its relos too. */ + err = append_subprog_relos(main_prog, subprog); + if (err) + return err; + err = bpf_object__reloc_code(obj, main_prog, subprog); + if (err) + return err; + } + + /* main_prog->insns memory could have been re-allocated, so + * calculate pointer again + */ + insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; + /* calculate correct instruction position within current main + * prog; each main prog can have a different set of + * subprograms appended (potentially in different order as + * well), so position of any subprog can be different for + * different main programs + */ + insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1; + + pr_debug("prog '%s': insn #%zu relocated, imm %d points to subprog '%s' (now at %zu offset)\n", + prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off); + } + + return 0; +} + +/* + * Relocate sub-program calls. + * + * Algorithm operates as follows. Each entry-point BPF program (referred to as + * main prog) is processed separately. For each subprog (non-entry functions, + * that can be called from either entry progs or other subprogs) gets their + * sub_insn_off reset to zero. This serves as indicator that this subprogram + * hasn't been yet appended and relocated within current main prog. Once its + * relocated, sub_insn_off will point at the position within current main prog + * where given subprog was appended. This will further be used to relocate all + * the call instructions jumping into this subprog. + * + * We start with main program and process all call instructions. If the call + * is into a subprog that hasn't been processed (i.e., subprog->sub_insn_off + * is zero), subprog instructions are appended at the end of main program's + * instruction array. Then main program is "put on hold" while we recursively + * process newly appended subprogram. If that subprogram calls into another + * subprogram that hasn't been appended, new subprogram is appended again to + * the *main* prog's instructions (subprog's instructions are always left + * untouched, as they need to be in unmodified state for subsequent main progs + * and subprog instructions are always sent only as part of a main prog) and + * the process continues recursively. Once all the subprogs called from a main + * prog or any of its subprogs are appended (and relocated), all their + * positions within finalized instructions array are known, so it's easy to + * rewrite call instructions with correct relative offsets, corresponding to + * desired target subprog. + * + * Its important to realize that some subprogs might not be called from some + * main prog and any of its called/used subprogs. Those will keep their + * subprog->sub_insn_off as zero at all times and won't be appended to current + * main prog and won't be relocated within the context of current main prog. + * They might still be used from other main progs later. + * + * Visually this process can be shown as below. Suppose we have two main + * programs mainA and mainB and BPF object contains three subprogs: subA, + * subB, and subC. mainA calls only subA, mainB calls only subC, but subA and + * subC both call subB: + * + * +--------+ +-------+ + * | v v | + * +--+---+ +--+-+-+ +---+--+ + * | subA | | subB | | subC | + * +--+---+ +------+ +---+--+ + * ^ ^ + * | | + * +---+-------+ +------+----+ + * | mainA | | mainB | + * +-----------+ +-----------+ + * + * We'll start relocating mainA, will find subA, append it and start + * processing sub A recursively: + * + * +-----------+------+ + * | mainA | subA | + * +-----------+------+ + * + * At this point we notice that subB is used from subA, so we append it and + * relocate (there are no further subcalls from subB): + * + * +-----------+------+------+ + * | mainA | subA | subB | + * +-----------+------+------+ + * + * At this point, we relocate subA calls, then go one level up and finish with + * relocatin mainA calls. mainA is done. + * + * For mainB process is similar but results in different order. We start with + * mainB and skip subA and subB, as mainB never calls them (at least + * directly), but we see subC is needed, so we append and start processing it: + * + * +-----------+------+ + * | mainB | subC | + * +-----------+------+ + * Now we see subC needs subB, so we go back to it, append and relocate it: + * + * +-----------+------+------+ + * | mainB | subC | subB | + * +-----------+------+------+ + * + * At this point we unwind recursion, relocate calls in subC, then in mainB. + */ +static int +bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog) +{ + struct bpf_program *subprog; + int i, err; + + /* mark all subprogs as not relocated (yet) within the context of + * current main program + */ + for (i = 0; i < obj->nr_programs; i++) { + subprog = &obj->programs[i]; + if (!prog_is_subprog(obj, subprog)) + continue; + + subprog->sub_insn_off = 0; + } + + err = bpf_object__reloc_code(obj, prog, prog); + if (err) + return err; + + return 0; +} + +static void +bpf_object__free_relocs(struct bpf_object *obj) +{ + struct bpf_program *prog; + int i; + + /* free up relocation descriptors */ + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + zfree(&prog->reloc_desc); + prog->nr_reloc = 0; + } +} + +static int cmp_relocs(const void *_a, const void *_b) +{ + const struct reloc_desc *a = _a; + const struct reloc_desc *b = _b; + + if (a->insn_idx != b->insn_idx) + return a->insn_idx < b->insn_idx ? -1 : 1; + + /* no two relocations should have the same insn_idx, but ... */ + if (a->type != b->type) + return a->type < b->type ? -1 : 1; + + return 0; +} + +static void bpf_object__sort_relos(struct bpf_object *obj) +{ + int i; + + for (i = 0; i < obj->nr_programs; i++) { + struct bpf_program *p = &obj->programs[i]; + + if (!p->nr_reloc) + continue; + + qsort(p->reloc_desc, p->nr_reloc, sizeof(*p->reloc_desc), cmp_relocs); + } +} + +static int +bpf_object__relocate(struct bpf_object *obj, const char *targ_btf_path) +{ + struct bpf_program *prog; + size_t i, j; + int err; + + if (obj->btf_ext) { + err = bpf_object__relocate_core(obj, targ_btf_path); + if (err) { + pr_warn("failed to perform CO-RE relocations: %d\n", + err); + return err; + } + bpf_object__sort_relos(obj); + } + + /* Before relocating calls pre-process relocations and mark + * few ld_imm64 instructions that points to subprogs. + * Otherwise bpf_object__reloc_code() later would have to consider + * all ld_imm64 insns as relocation candidates. That would + * reduce relocation speed, since amount of find_prog_insn_relo() + * would increase and most of them will fail to find a relo. + */ + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + for (j = 0; j < prog->nr_reloc; j++) { + struct reloc_desc *relo = &prog->reloc_desc[j]; + struct bpf_insn *insn = &prog->insns[relo->insn_idx]; + + /* mark the insn, so it's recognized by insn_is_pseudo_func() */ + if (relo->type == RELO_SUBPROG_ADDR) + insn[0].src_reg = BPF_PSEUDO_FUNC; + } + } + + /* relocate subprogram calls and append used subprograms to main + * programs; each copy of subprogram code needs to be relocated + * differently for each main program, because its code location might + * have changed. + * Append subprog relos to main programs to allow data relos to be + * processed after text is completely relocated. + */ + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + /* sub-program's sub-calls are relocated within the context of + * its main program only + */ + if (prog_is_subprog(obj, prog)) + continue; + if (!prog->autoload) + continue; + + err = bpf_object__relocate_calls(obj, prog); + if (err) { + pr_warn("prog '%s': failed to relocate calls: %d\n", + prog->name, err); + return err; + } + } + /* Process data relos for main programs */ + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + if (prog_is_subprog(obj, prog)) + continue; + if (!prog->autoload) + continue; + err = bpf_object__relocate_data(obj, prog); + if (err) { + pr_warn("prog '%s': failed to relocate data references: %d\n", + prog->name, err); + return err; + } + } + + return 0; +} + +static int bpf_object__collect_st_ops_relos(struct bpf_object *obj, + Elf64_Shdr *shdr, Elf_Data *data); + +static int bpf_object__collect_map_relos(struct bpf_object *obj, + Elf64_Shdr *shdr, Elf_Data *data) +{ + const int bpf_ptr_sz = 8, host_ptr_sz = sizeof(void *); + int i, j, nrels, new_sz; + const struct btf_var_secinfo *vi = NULL; + const struct btf_type *sec, *var, *def; + struct bpf_map *map = NULL, *targ_map = NULL; + struct bpf_program *targ_prog = NULL; + bool is_prog_array, is_map_in_map; + const struct btf_member *member; + const char *name, *mname, *type; + unsigned int moff; + Elf64_Sym *sym; + Elf64_Rel *rel; + void *tmp; + + if (!obj->efile.btf_maps_sec_btf_id || !obj->btf) + return -EINVAL; + sec = btf__type_by_id(obj->btf, obj->efile.btf_maps_sec_btf_id); + if (!sec) + return -EINVAL; + + nrels = shdr->sh_size / shdr->sh_entsize; + for (i = 0; i < nrels; i++) { + rel = elf_rel_by_idx(data, i); + if (!rel) { + pr_warn(".maps relo #%d: failed to get ELF relo\n", i); + return -LIBBPF_ERRNO__FORMAT; + } + + sym = elf_sym_by_idx(obj, ELF64_R_SYM(rel->r_info)); + if (!sym) { + pr_warn(".maps relo #%d: symbol %zx not found\n", + i, (size_t)ELF64_R_SYM(rel->r_info)); + return -LIBBPF_ERRNO__FORMAT; + } + name = elf_sym_str(obj, sym->st_name) ?: ""; + + pr_debug(".maps relo #%d: for %zd value %zd rel->r_offset %zu name %d ('%s')\n", + i, (ssize_t)(rel->r_info >> 32), (size_t)sym->st_value, + (size_t)rel->r_offset, sym->st_name, name); + + for (j = 0; j < obj->nr_maps; j++) { + map = &obj->maps[j]; + if (map->sec_idx != obj->efile.btf_maps_shndx) + continue; + + vi = btf_var_secinfos(sec) + map->btf_var_idx; + if (vi->offset <= rel->r_offset && + rel->r_offset + bpf_ptr_sz <= vi->offset + vi->size) + break; + } + if (j == obj->nr_maps) { + pr_warn(".maps relo #%d: cannot find map '%s' at rel->r_offset %zu\n", + i, name, (size_t)rel->r_offset); + return -EINVAL; + } + + is_map_in_map = bpf_map_type__is_map_in_map(map->def.type); + is_prog_array = map->def.type == BPF_MAP_TYPE_PROG_ARRAY; + type = is_map_in_map ? "map" : "prog"; + if (is_map_in_map) { + if (sym->st_shndx != obj->efile.btf_maps_shndx) { + pr_warn(".maps relo #%d: '%s' isn't a BTF-defined map\n", + i, name); + return -LIBBPF_ERRNO__RELOC; + } + if (map->def.type == BPF_MAP_TYPE_HASH_OF_MAPS && + map->def.key_size != sizeof(int)) { + pr_warn(".maps relo #%d: hash-of-maps '%s' should have key size %zu.\n", + i, map->name, sizeof(int)); + return -EINVAL; + } + targ_map = bpf_object__find_map_by_name(obj, name); + if (!targ_map) { + pr_warn(".maps relo #%d: '%s' isn't a valid map reference\n", + i, name); + return -ESRCH; + } + } else if (is_prog_array) { + targ_prog = bpf_object__find_program_by_name(obj, name); + if (!targ_prog) { + pr_warn(".maps relo #%d: '%s' isn't a valid program reference\n", + i, name); + return -ESRCH; + } + if (targ_prog->sec_idx != sym->st_shndx || + targ_prog->sec_insn_off * 8 != sym->st_value || + prog_is_subprog(obj, targ_prog)) { + pr_warn(".maps relo #%d: '%s' isn't an entry-point program\n", + i, name); + return -LIBBPF_ERRNO__RELOC; + } + } else { + return -EINVAL; + } + + var = btf__type_by_id(obj->btf, vi->type); + def = skip_mods_and_typedefs(obj->btf, var->type, NULL); + if (btf_vlen(def) == 0) + return -EINVAL; + member = btf_members(def) + btf_vlen(def) - 1; + mname = btf__name_by_offset(obj->btf, member->name_off); + if (strcmp(mname, "values")) + return -EINVAL; + + moff = btf_member_bit_offset(def, btf_vlen(def) - 1) / 8; + if (rel->r_offset - vi->offset < moff) + return -EINVAL; + + moff = rel->r_offset - vi->offset - moff; + /* here we use BPF pointer size, which is always 64 bit, as we + * are parsing ELF that was built for BPF target + */ + if (moff % bpf_ptr_sz) + return -EINVAL; + moff /= bpf_ptr_sz; + if (moff >= map->init_slots_sz) { + new_sz = moff + 1; + tmp = libbpf_reallocarray(map->init_slots, new_sz, host_ptr_sz); + if (!tmp) + return -ENOMEM; + map->init_slots = tmp; + memset(map->init_slots + map->init_slots_sz, 0, + (new_sz - map->init_slots_sz) * host_ptr_sz); + map->init_slots_sz = new_sz; + } + map->init_slots[moff] = is_map_in_map ? (void *)targ_map : (void *)targ_prog; + + pr_debug(".maps relo #%d: map '%s' slot [%d] points to %s '%s'\n", + i, map->name, moff, type, name); + } + + return 0; +} + +static int bpf_object__collect_relos(struct bpf_object *obj) +{ + int i, err; + + for (i = 0; i < obj->efile.sec_cnt; i++) { + struct elf_sec_desc *sec_desc = &obj->efile.secs[i]; + Elf64_Shdr *shdr; + Elf_Data *data; + int idx; + + if (sec_desc->sec_type != SEC_RELO) + continue; + + shdr = sec_desc->shdr; + data = sec_desc->data; + idx = shdr->sh_info; + + if (shdr->sh_type != SHT_REL) { + pr_warn("internal error at %d\n", __LINE__); + return -LIBBPF_ERRNO__INTERNAL; + } + + if (idx == obj->efile.st_ops_shndx || idx == obj->efile.st_ops_link_shndx) + err = bpf_object__collect_st_ops_relos(obj, shdr, data); + else if (idx == obj->efile.btf_maps_shndx) + err = bpf_object__collect_map_relos(obj, shdr, data); + else + err = bpf_object__collect_prog_relos(obj, shdr, data); + if (err) + return err; + } + + bpf_object__sort_relos(obj); + return 0; +} + +static bool insn_is_helper_call(struct bpf_insn *insn, enum bpf_func_id *func_id) +{ + if (BPF_CLASS(insn->code) == BPF_JMP && + BPF_OP(insn->code) == BPF_CALL && + BPF_SRC(insn->code) == BPF_K && + insn->src_reg == 0 && + insn->dst_reg == 0) { + *func_id = insn->imm; + return true; + } + return false; +} + +static int bpf_object__sanitize_prog(struct bpf_object *obj, struct bpf_program *prog) +{ + struct bpf_insn *insn = prog->insns; + enum bpf_func_id func_id; + int i; + + if (obj->gen_loader) + return 0; + + for (i = 0; i < prog->insns_cnt; i++, insn++) { + if (!insn_is_helper_call(insn, &func_id)) + continue; + + /* on kernels that don't yet support + * bpf_probe_read_{kernel,user}[_str] helpers, fall back + * to bpf_probe_read() which works well for old kernels + */ + switch (func_id) { + case BPF_FUNC_probe_read_kernel: + case BPF_FUNC_probe_read_user: + if (!kernel_supports(obj, FEAT_PROBE_READ_KERN)) + insn->imm = BPF_FUNC_probe_read; + break; + case BPF_FUNC_probe_read_kernel_str: + case BPF_FUNC_probe_read_user_str: + if (!kernel_supports(obj, FEAT_PROBE_READ_KERN)) + insn->imm = BPF_FUNC_probe_read_str; + break; + default: + break; + } + } + return 0; +} + +static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name, + int *btf_obj_fd, int *btf_type_id); + +/* this is called as prog->sec_def->prog_prepare_load_fn for libbpf-supported sec_defs */ +static int libbpf_prepare_prog_load(struct bpf_program *prog, + struct bpf_prog_load_opts *opts, long cookie) +{ + enum sec_def_flags def = cookie; + + /* old kernels might not support specifying expected_attach_type */ + if ((def & SEC_EXP_ATTACH_OPT) && !kernel_supports(prog->obj, FEAT_EXP_ATTACH_TYPE)) + opts->expected_attach_type = 0; + + if (def & SEC_SLEEPABLE) + opts->prog_flags |= BPF_F_SLEEPABLE; + + if (prog->type == BPF_PROG_TYPE_XDP && (def & SEC_XDP_FRAGS)) + opts->prog_flags |= BPF_F_XDP_HAS_FRAGS; + + if ((def & SEC_ATTACH_BTF) && !prog->attach_btf_id) { + int btf_obj_fd = 0, btf_type_id = 0, err; + const char *attach_name; + + attach_name = strchr(prog->sec_name, '/'); + if (!attach_name) { + /* if BPF program is annotated with just SEC("fentry") + * (or similar) without declaratively specifying + * target, then it is expected that target will be + * specified with bpf_program__set_attach_target() at + * runtime before BPF object load step. If not, then + * there is nothing to load into the kernel as BPF + * verifier won't be able to validate BPF program + * correctness anyways. + */ + pr_warn("prog '%s': no BTF-based attach target is specified, use bpf_program__set_attach_target()\n", + prog->name); + return -EINVAL; + } + attach_name++; /* skip over / */ + + err = libbpf_find_attach_btf_id(prog, attach_name, &btf_obj_fd, &btf_type_id); + if (err) + return err; + + /* cache resolved BTF FD and BTF type ID in the prog */ + prog->attach_btf_obj_fd = btf_obj_fd; + prog->attach_btf_id = btf_type_id; + + /* but by now libbpf common logic is not utilizing + * prog->atach_btf_obj_fd/prog->attach_btf_id anymore because + * this callback is called after opts were populated by + * libbpf, so this callback has to update opts explicitly here + */ + opts->attach_btf_obj_fd = btf_obj_fd; + opts->attach_btf_id = btf_type_id; + } + return 0; +} + +static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz); + +static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog, + struct bpf_insn *insns, int insns_cnt, + const char *license, __u32 kern_version, int *prog_fd) +{ + LIBBPF_OPTS(bpf_prog_load_opts, load_attr); + const char *prog_name = NULL; + char *cp, errmsg[STRERR_BUFSIZE]; + size_t log_buf_size = 0; + char *log_buf = NULL, *tmp; + int btf_fd, ret, err; + bool own_log_buf = true; + __u32 log_level = prog->log_level; + + if (prog->type == BPF_PROG_TYPE_UNSPEC) { + /* + * The program type must be set. Most likely we couldn't find a proper + * section definition at load time, and thus we didn't infer the type. + */ + pr_warn("prog '%s': missing BPF prog type, check ELF section name '%s'\n", + prog->name, prog->sec_name); + return -EINVAL; + } + + if (!insns || !insns_cnt) + return -EINVAL; + + load_attr.expected_attach_type = prog->expected_attach_type; + if (kernel_supports(obj, FEAT_PROG_NAME)) + prog_name = prog->name; + load_attr.attach_prog_fd = prog->attach_prog_fd; + load_attr.attach_btf_obj_fd = prog->attach_btf_obj_fd; + load_attr.attach_btf_id = prog->attach_btf_id; + load_attr.kern_version = kern_version; + load_attr.prog_ifindex = prog->prog_ifindex; + + /* specify func_info/line_info only if kernel supports them */ + btf_fd = bpf_object__btf_fd(obj); + if (btf_fd >= 0 && kernel_supports(obj, FEAT_BTF_FUNC)) { + load_attr.prog_btf_fd = btf_fd; + load_attr.func_info = prog->func_info; + load_attr.func_info_rec_size = prog->func_info_rec_size; + load_attr.func_info_cnt = prog->func_info_cnt; + load_attr.line_info = prog->line_info; + load_attr.line_info_rec_size = prog->line_info_rec_size; + load_attr.line_info_cnt = prog->line_info_cnt; + } + load_attr.log_level = log_level; + load_attr.prog_flags = prog->prog_flags; + load_attr.fd_array = obj->fd_array; + + /* adjust load_attr if sec_def provides custom preload callback */ + if (prog->sec_def && prog->sec_def->prog_prepare_load_fn) { + err = prog->sec_def->prog_prepare_load_fn(prog, &load_attr, prog->sec_def->cookie); + if (err < 0) { + pr_warn("prog '%s': failed to prepare load attributes: %d\n", + prog->name, err); + return err; + } + insns = prog->insns; + insns_cnt = prog->insns_cnt; + } + + if (obj->gen_loader) { + bpf_gen__prog_load(obj->gen_loader, prog->type, prog->name, + license, insns, insns_cnt, &load_attr, + prog - obj->programs); + *prog_fd = -1; + return 0; + } + +retry_load: + /* if log_level is zero, we don't request logs initially even if + * custom log_buf is specified; if the program load fails, then we'll + * bump log_level to 1 and use either custom log_buf or we'll allocate + * our own and retry the load to get details on what failed + */ + if (log_level) { + if (prog->log_buf) { + log_buf = prog->log_buf; + log_buf_size = prog->log_size; + own_log_buf = false; + } else if (obj->log_buf) { + log_buf = obj->log_buf; + log_buf_size = obj->log_size; + own_log_buf = false; + } else { + log_buf_size = max((size_t)BPF_LOG_BUF_SIZE, log_buf_size * 2); + tmp = realloc(log_buf, log_buf_size); + if (!tmp) { + ret = -ENOMEM; + goto out; + } + log_buf = tmp; + log_buf[0] = '\0'; + own_log_buf = true; + } + } + + load_attr.log_buf = log_buf; + load_attr.log_size = log_buf_size; + load_attr.log_level = log_level; + + ret = bpf_prog_load(prog->type, prog_name, license, insns, insns_cnt, &load_attr); + if (ret >= 0) { + if (log_level && own_log_buf) { + pr_debug("prog '%s': -- BEGIN PROG LOAD LOG --\n%s-- END PROG LOAD LOG --\n", + prog->name, log_buf); + } + + if (obj->has_rodata && kernel_supports(obj, FEAT_PROG_BIND_MAP)) { + struct bpf_map *map; + int i; + + for (i = 0; i < obj->nr_maps; i++) { + map = &prog->obj->maps[i]; + if (map->libbpf_type != LIBBPF_MAP_RODATA) + continue; + + if (bpf_prog_bind_map(ret, bpf_map__fd(map), NULL)) { + cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); + pr_warn("prog '%s': failed to bind map '%s': %s\n", + prog->name, map->real_name, cp); + /* Don't fail hard if can't bind rodata. */ + } + } + } + + *prog_fd = ret; + ret = 0; + goto out; + } + + if (log_level == 0) { + log_level = 1; + goto retry_load; + } + /* On ENOSPC, increase log buffer size and retry, unless custom + * log_buf is specified. + * Be careful to not overflow u32, though. Kernel's log buf size limit + * isn't part of UAPI so it can always be bumped to full 4GB. So don't + * multiply by 2 unless we are sure we'll fit within 32 bits. + * Currently, we'll get -EINVAL when we reach (UINT_MAX >> 2). + */ + if (own_log_buf && errno == ENOSPC && log_buf_size <= UINT_MAX / 2) + goto retry_load; + + ret = -errno; + + /* post-process verifier log to improve error descriptions */ + fixup_verifier_log(prog, log_buf, log_buf_size); + + cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); + pr_warn("prog '%s': BPF program load failed: %s\n", prog->name, cp); + pr_perm_msg(ret); + + if (own_log_buf && log_buf && log_buf[0] != '\0') { + pr_warn("prog '%s': -- BEGIN PROG LOAD LOG --\n%s-- END PROG LOAD LOG --\n", + prog->name, log_buf); + } + +out: + if (own_log_buf) + free(log_buf); + return ret; +} + +static char *find_prev_line(char *buf, char *cur) +{ + char *p; + + if (cur == buf) /* end of a log buf */ + return NULL; + + p = cur - 1; + while (p - 1 >= buf && *(p - 1) != '\n') + p--; + + return p; +} + +static void patch_log(char *buf, size_t buf_sz, size_t log_sz, + char *orig, size_t orig_sz, const char *patch) +{ + /* size of the remaining log content to the right from the to-be-replaced part */ + size_t rem_sz = (buf + log_sz) - (orig + orig_sz); + size_t patch_sz = strlen(patch); + + if (patch_sz != orig_sz) { + /* If patch line(s) are longer than original piece of verifier log, + * shift log contents by (patch_sz - orig_sz) bytes to the right + * starting from after to-be-replaced part of the log. + * + * If patch line(s) are shorter than original piece of verifier log, + * shift log contents by (orig_sz - patch_sz) bytes to the left + * starting from after to-be-replaced part of the log + * + * We need to be careful about not overflowing available + * buf_sz capacity. If that's the case, we'll truncate the end + * of the original log, as necessary. + */ + if (patch_sz > orig_sz) { + if (orig + patch_sz >= buf + buf_sz) { + /* patch is big enough to cover remaining space completely */ + patch_sz -= (orig + patch_sz) - (buf + buf_sz) + 1; + rem_sz = 0; + } else if (patch_sz - orig_sz > buf_sz - log_sz) { + /* patch causes part of remaining log to be truncated */ + rem_sz -= (patch_sz - orig_sz) - (buf_sz - log_sz); + } + } + /* shift remaining log to the right by calculated amount */ + memmove(orig + patch_sz, orig + orig_sz, rem_sz); + } + + memcpy(orig, patch, patch_sz); +} + +static void fixup_log_failed_core_relo(struct bpf_program *prog, + char *buf, size_t buf_sz, size_t log_sz, + char *line1, char *line2, char *line3) +{ + /* Expected log for failed and not properly guarded CO-RE relocation: + * line1 -> 123: (85) call unknown#195896080 + * line2 -> invalid func unknown#195896080 + * line3 -> + * + * "123" is the index of the instruction that was poisoned. We extract + * instruction index to find corresponding CO-RE relocation and + * replace this part of the log with more relevant information about + * failed CO-RE relocation. + */ + const struct bpf_core_relo *relo; + struct bpf_core_spec spec; + char patch[512], spec_buf[256]; + int insn_idx, err, spec_len; + + if (sscanf(line1, "%d: (%*d) call unknown#195896080\n", &insn_idx) != 1) + return; + + relo = find_relo_core(prog, insn_idx); + if (!relo) + return; + + err = bpf_core_parse_spec(prog->name, prog->obj->btf, relo, &spec); + if (err) + return; + + spec_len = bpf_core_format_spec(spec_buf, sizeof(spec_buf), &spec); + snprintf(patch, sizeof(patch), + "%d: \n" + "failed to resolve CO-RE relocation %s%s\n", + insn_idx, spec_buf, spec_len >= sizeof(spec_buf) ? "..." : ""); + + patch_log(buf, buf_sz, log_sz, line1, line3 - line1, patch); +} + +static void fixup_log_missing_map_load(struct bpf_program *prog, + char *buf, size_t buf_sz, size_t log_sz, + char *line1, char *line2, char *line3) +{ + /* Expected log for failed and not properly guarded CO-RE relocation: + * line1 -> 123: (85) call unknown#2001000345 + * line2 -> invalid func unknown#2001000345 + * line3 -> + * + * "123" is the index of the instruction that was poisoned. + * "345" in "2001000345" are map index in obj->maps to fetch map name. + */ + struct bpf_object *obj = prog->obj; + const struct bpf_map *map; + int insn_idx, map_idx; + char patch[128]; + + if (sscanf(line1, "%d: (%*d) call unknown#%d\n", &insn_idx, &map_idx) != 2) + return; + + map_idx -= MAP_LDIMM64_POISON_BASE; + if (map_idx < 0 || map_idx >= obj->nr_maps) + return; + map = &obj->maps[map_idx]; + + snprintf(patch, sizeof(patch), + "%d: \n" + "BPF map '%s' is referenced but wasn't created\n", + insn_idx, map->name); + + patch_log(buf, buf_sz, log_sz, line1, line3 - line1, patch); +} + +static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz) +{ + /* look for familiar error patterns in last N lines of the log */ + const size_t max_last_line_cnt = 10; + char *prev_line, *cur_line, *next_line; + size_t log_sz; + int i; + + if (!buf) + return; + + log_sz = strlen(buf) + 1; + next_line = buf + log_sz - 1; + + for (i = 0; i < max_last_line_cnt; i++, next_line = cur_line) { + cur_line = find_prev_line(buf, next_line); + if (!cur_line) + return; + + /* failed CO-RE relocation case */ + if (str_has_pfx(cur_line, "invalid func unknown#195896080\n")) { + prev_line = find_prev_line(buf, cur_line); + if (!prev_line) + continue; + + fixup_log_failed_core_relo(prog, buf, buf_sz, log_sz, + prev_line, cur_line, next_line); + return; + } else if (str_has_pfx(cur_line, "invalid func unknown#"MAP_LDIMM64_POISON_PFX)) { + prev_line = find_prev_line(buf, cur_line); + if (!prev_line) + continue; + + fixup_log_missing_map_load(prog, buf, buf_sz, log_sz, + prev_line, cur_line, next_line); + return; + } + } +} + +static int bpf_program_record_relos(struct bpf_program *prog) +{ + struct bpf_object *obj = prog->obj; + int i; + + for (i = 0; i < prog->nr_reloc; i++) { + struct reloc_desc *relo = &prog->reloc_desc[i]; + struct extern_desc *ext = &obj->externs[relo->sym_off]; + int kind; + + switch (relo->type) { + case RELO_EXTERN_LD64: + if (ext->type != EXT_KSYM) + continue; + kind = btf_is_var(btf__type_by_id(obj->btf, ext->btf_id)) ? + BTF_KIND_VAR : BTF_KIND_FUNC; + bpf_gen__record_extern(obj->gen_loader, ext->name, + ext->is_weak, !ext->ksym.type_id, + true, kind, relo->insn_idx); + break; + case RELO_EXTERN_CALL: + bpf_gen__record_extern(obj->gen_loader, ext->name, + ext->is_weak, false, false, BTF_KIND_FUNC, + relo->insn_idx); + break; + case RELO_CORE: { + struct bpf_core_relo cr = { + .insn_off = relo->insn_idx * 8, + .type_id = relo->core_relo->type_id, + .access_str_off = relo->core_relo->access_str_off, + .kind = relo->core_relo->kind, + }; + + bpf_gen__record_relo_core(obj->gen_loader, &cr); + break; + } + default: + continue; + } + } + return 0; +} + +static int +bpf_object__load_progs(struct bpf_object *obj, int log_level) +{ + struct bpf_program *prog; + size_t i; + int err; + + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + err = bpf_object__sanitize_prog(obj, prog); + if (err) + return err; + } + + for (i = 0; i < obj->nr_programs; i++) { + prog = &obj->programs[i]; + if (prog_is_subprog(obj, prog)) + continue; + if (!prog->autoload) { + pr_debug("prog '%s': skipped loading\n", prog->name); + continue; + } + prog->log_level |= log_level; + + if (obj->gen_loader) + bpf_program_record_relos(prog); + + err = bpf_object_load_prog(obj, prog, prog->insns, prog->insns_cnt, + obj->license, obj->kern_version, &prog->fd); + if (err) { + pr_warn("prog '%s': failed to load: %d\n", prog->name, err); + return err; + } + } + + bpf_object__free_relocs(obj); + return 0; +} + +static const struct bpf_sec_def *find_sec_def(const char *sec_name); + +static int bpf_object_init_progs(struct bpf_object *obj, const struct bpf_object_open_opts *opts) +{ + struct bpf_program *prog; + int err; + + bpf_object__for_each_program(prog, obj) { + prog->sec_def = find_sec_def(prog->sec_name); + if (!prog->sec_def) { + /* couldn't guess, but user might manually specify */ + pr_debug("prog '%s': unrecognized ELF section name '%s'\n", + prog->name, prog->sec_name); + continue; + } + + prog->type = prog->sec_def->prog_type; + prog->expected_attach_type = prog->sec_def->expected_attach_type; + + /* sec_def can have custom callback which should be called + * after bpf_program is initialized to adjust its properties + */ + if (prog->sec_def->prog_setup_fn) { + err = prog->sec_def->prog_setup_fn(prog, prog->sec_def->cookie); + if (err < 0) { + pr_warn("prog '%s': failed to initialize: %d\n", + prog->name, err); + return err; + } + } + } + + return 0; +} + +static struct bpf_object *bpf_object_open(const char *path, const void *obj_buf, size_t obj_buf_sz, + const struct bpf_object_open_opts *opts) +{ + const char *obj_name, *kconfig, *btf_tmp_path; + struct bpf_object *obj; + char tmp_name[64]; + int err; + char *log_buf; + size_t log_size; + __u32 log_level; + + if (elf_version(EV_CURRENT) == EV_NONE) { + pr_warn("failed to init libelf for %s\n", + path ? : "(mem buf)"); + return ERR_PTR(-LIBBPF_ERRNO__LIBELF); + } + + if (!OPTS_VALID(opts, bpf_object_open_opts)) + return ERR_PTR(-EINVAL); + + obj_name = OPTS_GET(opts, object_name, NULL); + if (obj_buf) { + if (!obj_name) { + snprintf(tmp_name, sizeof(tmp_name), "%lx-%lx", + (unsigned long)obj_buf, + (unsigned long)obj_buf_sz); + obj_name = tmp_name; + } + path = obj_name; + pr_debug("loading object '%s' from buffer\n", obj_name); + } + + log_buf = OPTS_GET(opts, kernel_log_buf, NULL); + log_size = OPTS_GET(opts, kernel_log_size, 0); + log_level = OPTS_GET(opts, kernel_log_level, 0); + if (log_size > UINT_MAX) + return ERR_PTR(-EINVAL); + if (log_size && !log_buf) + return ERR_PTR(-EINVAL); + + obj = bpf_object__new(path, obj_buf, obj_buf_sz, obj_name); + if (IS_ERR(obj)) + return obj; + + obj->log_buf = log_buf; + obj->log_size = log_size; + obj->log_level = log_level; + + btf_tmp_path = OPTS_GET(opts, btf_custom_path, NULL); + if (btf_tmp_path) { + if (strlen(btf_tmp_path) >= PATH_MAX) { + err = -ENAMETOOLONG; + goto out; + } + obj->btf_custom_path = strdup(btf_tmp_path); + if (!obj->btf_custom_path) { + err = -ENOMEM; + goto out; + } + } + + kconfig = OPTS_GET(opts, kconfig, NULL); + if (kconfig) { + obj->kconfig = strdup(kconfig); + if (!obj->kconfig) { + err = -ENOMEM; + goto out; + } + } + + err = bpf_object__elf_init(obj); + err = err ? : bpf_object__check_endianness(obj); + err = err ? : bpf_object__elf_collect(obj); + err = err ? : bpf_object__collect_externs(obj); + err = err ? : bpf_object_fixup_btf(obj); + err = err ? : bpf_object__init_maps(obj, opts); + err = err ? : bpf_object_init_progs(obj, opts); + err = err ? : bpf_object__collect_relos(obj); + if (err) + goto out; + + bpf_object__elf_finish(obj); + + return obj; +out: + bpf_object__close(obj); + return ERR_PTR(err); +} + +struct bpf_object * +bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts) +{ + if (!path) + return libbpf_err_ptr(-EINVAL); + + pr_debug("loading %s\n", path); + + return libbpf_ptr(bpf_object_open(path, NULL, 0, opts)); +} + +struct bpf_object *bpf_object__open(const char *path) +{ + return bpf_object__open_file(path, NULL); +} + +struct bpf_object * +bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, + const struct bpf_object_open_opts *opts) +{ + if (!obj_buf || obj_buf_sz == 0) + return libbpf_err_ptr(-EINVAL); + + return libbpf_ptr(bpf_object_open(NULL, obj_buf, obj_buf_sz, opts)); +} + +static int bpf_object_unload(struct bpf_object *obj) +{ + size_t i; + + if (!obj) + return libbpf_err(-EINVAL); + + for (i = 0; i < obj->nr_maps; i++) { + zclose(obj->maps[i].fd); + if (obj->maps[i].st_ops) + zfree(&obj->maps[i].st_ops->kern_vdata); + } + + for (i = 0; i < obj->nr_programs; i++) + bpf_program__unload(&obj->programs[i]); + + return 0; +} + +static int bpf_object__sanitize_maps(struct bpf_object *obj) +{ + struct bpf_map *m; + + bpf_object__for_each_map(m, obj) { + if (!bpf_map__is_internal(m)) + continue; + if (!kernel_supports(obj, FEAT_ARRAY_MMAP)) + m->def.map_flags &= ~BPF_F_MMAPABLE; + } + + return 0; +} + +int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *ctx) +{ + char sym_type, sym_name[500]; + unsigned long long sym_addr; + int ret, err = 0; + FILE *f; + + f = fopen("/proc/kallsyms", "r"); + if (!f) { + err = -errno; + pr_warn("failed to open /proc/kallsyms: %d\n", err); + return err; + } + + while (true) { + ret = fscanf(f, "%llx %c %499s%*[^\n]\n", + &sym_addr, &sym_type, sym_name); + if (ret == EOF && feof(f)) + break; + if (ret != 3) { + pr_warn("failed to read kallsyms entry: %d\n", ret); + err = -EINVAL; + break; + } + + err = cb(sym_addr, sym_type, sym_name, ctx); + if (err) + break; + } + + fclose(f); + return err; +} + +static int kallsyms_cb(unsigned long long sym_addr, char sym_type, + const char *sym_name, void *ctx) +{ + struct bpf_object *obj = ctx; + const struct btf_type *t; + struct extern_desc *ext; + + ext = find_extern_by_name(obj, sym_name); + if (!ext || ext->type != EXT_KSYM) + return 0; + + t = btf__type_by_id(obj->btf, ext->btf_id); + if (!btf_is_var(t)) + return 0; + + if (ext->is_set && ext->ksym.addr != sym_addr) { + pr_warn("extern (ksym) '%s': resolution is ambiguous: 0x%llx or 0x%llx\n", + sym_name, ext->ksym.addr, sym_addr); + return -EINVAL; + } + if (!ext->is_set) { + ext->is_set = true; + ext->ksym.addr = sym_addr; + pr_debug("extern (ksym) '%s': set to 0x%llx\n", sym_name, sym_addr); + } + return 0; +} + +static int bpf_object__read_kallsyms_file(struct bpf_object *obj) +{ + return libbpf_kallsyms_parse(kallsyms_cb, obj); +} + +static int find_ksym_btf_id(struct bpf_object *obj, const char *ksym_name, + __u16 kind, struct btf **res_btf, + struct module_btf **res_mod_btf) +{ + struct module_btf *mod_btf; + struct btf *btf; + int i, id, err; + + btf = obj->btf_vmlinux; + mod_btf = NULL; + id = btf__find_by_name_kind(btf, ksym_name, kind); + + if (id == -ENOENT) { + err = load_module_btfs(obj); + if (err) + return err; + + for (i = 0; i < obj->btf_module_cnt; i++) { + /* we assume module_btf's BTF FD is always >0 */ + mod_btf = &obj->btf_modules[i]; + btf = mod_btf->btf; + id = btf__find_by_name_kind_own(btf, ksym_name, kind); + if (id != -ENOENT) + break; + } + } + if (id <= 0) + return -ESRCH; + + *res_btf = btf; + *res_mod_btf = mod_btf; + return id; +} + +static int bpf_object__resolve_ksym_var_btf_id(struct bpf_object *obj, + struct extern_desc *ext) +{ + const struct btf_type *targ_var, *targ_type; + __u32 targ_type_id, local_type_id; + struct module_btf *mod_btf = NULL; + const char *targ_var_name; + struct btf *btf = NULL; + int id, err; + + id = find_ksym_btf_id(obj, ext->name, BTF_KIND_VAR, &btf, &mod_btf); + if (id < 0) { + if (id == -ESRCH && ext->is_weak) + return 0; + pr_warn("extern (var ksym) '%s': not found in kernel BTF\n", + ext->name); + return id; + } + + /* find local type_id */ + local_type_id = ext->ksym.type_id; + + /* find target type_id */ + targ_var = btf__type_by_id(btf, id); + targ_var_name = btf__name_by_offset(btf, targ_var->name_off); + targ_type = skip_mods_and_typedefs(btf, targ_var->type, &targ_type_id); + + err = bpf_core_types_are_compat(obj->btf, local_type_id, + btf, targ_type_id); + if (err <= 0) { + const struct btf_type *local_type; + const char *targ_name, *local_name; + + local_type = btf__type_by_id(obj->btf, local_type_id); + local_name = btf__name_by_offset(obj->btf, local_type->name_off); + targ_name = btf__name_by_offset(btf, targ_type->name_off); + + pr_warn("extern (var ksym) '%s': incompatible types, expected [%d] %s %s, but kernel has [%d] %s %s\n", + ext->name, local_type_id, + btf_kind_str(local_type), local_name, targ_type_id, + btf_kind_str(targ_type), targ_name); + return -EINVAL; + } + + ext->is_set = true; + ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0; + ext->ksym.kernel_btf_id = id; + pr_debug("extern (var ksym) '%s': resolved to [%d] %s %s\n", + ext->name, id, btf_kind_str(targ_var), targ_var_name); + + return 0; +} + +static int bpf_object__resolve_ksym_func_btf_id(struct bpf_object *obj, + struct extern_desc *ext) +{ + int local_func_proto_id, kfunc_proto_id, kfunc_id; + struct module_btf *mod_btf = NULL; + const struct btf_type *kern_func; + struct btf *kern_btf = NULL; + int ret; + + local_func_proto_id = ext->ksym.type_id; + + kfunc_id = find_ksym_btf_id(obj, ext->name, BTF_KIND_FUNC, &kern_btf, &mod_btf); + if (kfunc_id < 0) { + if (kfunc_id == -ESRCH && ext->is_weak) + return 0; + pr_warn("extern (func ksym) '%s': not found in kernel or module BTFs\n", + ext->name); + return kfunc_id; + } + + kern_func = btf__type_by_id(kern_btf, kfunc_id); + kfunc_proto_id = kern_func->type; + + ret = bpf_core_types_are_compat(obj->btf, local_func_proto_id, + kern_btf, kfunc_proto_id); + if (ret <= 0) { + pr_warn("extern (func ksym) '%s': func_proto [%d] incompatible with kernel [%d]\n", + ext->name, local_func_proto_id, kfunc_proto_id); + return -EINVAL; + } + + /* set index for module BTF fd in fd_array, if unset */ + if (mod_btf && !mod_btf->fd_array_idx) { + /* insn->off is s16 */ + if (obj->fd_array_cnt == INT16_MAX) { + pr_warn("extern (func ksym) '%s': module BTF fd index %d too big to fit in bpf_insn offset\n", + ext->name, mod_btf->fd_array_idx); + return -E2BIG; + } + /* Cannot use index 0 for module BTF fd */ + if (!obj->fd_array_cnt) + obj->fd_array_cnt = 1; + + ret = libbpf_ensure_mem((void **)&obj->fd_array, &obj->fd_array_cap, sizeof(int), + obj->fd_array_cnt + 1); + if (ret) + return ret; + mod_btf->fd_array_idx = obj->fd_array_cnt; + /* we assume module BTF FD is always >0 */ + obj->fd_array[obj->fd_array_cnt++] = mod_btf->fd; + } + + ext->is_set = true; + ext->ksym.kernel_btf_id = kfunc_id; + ext->ksym.btf_fd_idx = mod_btf ? mod_btf->fd_array_idx : 0; + /* Also set kernel_btf_obj_fd to make sure that bpf_object__relocate_data() + * populates FD into ld_imm64 insn when it's used to point to kfunc. + * {kernel_btf_id, btf_fd_idx} -> fixup bpf_call. + * {kernel_btf_id, kernel_btf_obj_fd} -> fixup ld_imm64. + */ + ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0; + pr_debug("extern (func ksym) '%s': resolved to kernel [%d]\n", + ext->name, kfunc_id); + + return 0; +} + +static int bpf_object__resolve_ksyms_btf_id(struct bpf_object *obj) +{ + const struct btf_type *t; + struct extern_desc *ext; + int i, err; + + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type != EXT_KSYM || !ext->ksym.type_id) + continue; + + if (obj->gen_loader) { + ext->is_set = true; + ext->ksym.kernel_btf_obj_fd = 0; + ext->ksym.kernel_btf_id = 0; + continue; + } + t = btf__type_by_id(obj->btf, ext->btf_id); + if (btf_is_var(t)) + err = bpf_object__resolve_ksym_var_btf_id(obj, ext); + else + err = bpf_object__resolve_ksym_func_btf_id(obj, ext); + if (err) + return err; + } + return 0; +} + +static int bpf_object__resolve_externs(struct bpf_object *obj, + const char *extra_kconfig) +{ + bool need_config = false, need_kallsyms = false; + bool need_vmlinux_btf = false; + struct extern_desc *ext; + void *kcfg_data = NULL; + int err, i; + + if (obj->nr_extern == 0) + return 0; + + if (obj->kconfig_map_idx >= 0) + kcfg_data = obj->maps[obj->kconfig_map_idx].mmaped; + + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + + if (ext->type == EXT_KSYM) { + if (ext->ksym.type_id) + need_vmlinux_btf = true; + else + need_kallsyms = true; + continue; + } else if (ext->type == EXT_KCFG) { + void *ext_ptr = kcfg_data + ext->kcfg.data_off; + __u64 value = 0; + + /* Kconfig externs need actual /proc/config.gz */ + if (str_has_pfx(ext->name, "CONFIG_")) { + need_config = true; + continue; + } + + /* Virtual kcfg externs are customly handled by libbpf */ + if (strcmp(ext->name, "LINUX_KERNEL_VERSION") == 0) { + value = get_kernel_version(); + if (!value) { + pr_warn("extern (kcfg) '%s': failed to get kernel version\n", ext->name); + return -EINVAL; + } + } else if (strcmp(ext->name, "LINUX_HAS_BPF_COOKIE") == 0) { + value = kernel_supports(obj, FEAT_BPF_COOKIE); + } else if (strcmp(ext->name, "LINUX_HAS_SYSCALL_WRAPPER") == 0) { + value = kernel_supports(obj, FEAT_SYSCALL_WRAPPER); + } else if (!str_has_pfx(ext->name, "LINUX_") || !ext->is_weak) { + /* Currently libbpf supports only CONFIG_ and LINUX_ prefixed + * __kconfig externs, where LINUX_ ones are virtual and filled out + * customly by libbpf (their values don't come from Kconfig). + * If LINUX_xxx variable is not recognized by libbpf, but is marked + * __weak, it defaults to zero value, just like for CONFIG_xxx + * externs. + */ + pr_warn("extern (kcfg) '%s': unrecognized virtual extern\n", ext->name); + return -EINVAL; + } + + err = set_kcfg_value_num(ext, ext_ptr, value); + if (err) + return err; + pr_debug("extern (kcfg) '%s': set to 0x%llx\n", + ext->name, (long long)value); + } else { + pr_warn("extern '%s': unrecognized extern kind\n", ext->name); + return -EINVAL; + } + } + if (need_config && extra_kconfig) { + err = bpf_object__read_kconfig_mem(obj, extra_kconfig, kcfg_data); + if (err) + return -EINVAL; + need_config = false; + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + if (ext->type == EXT_KCFG && !ext->is_set) { + need_config = true; + break; + } + } + } + if (need_config) { + err = bpf_object__read_kconfig_file(obj, kcfg_data); + if (err) + return -EINVAL; + } + if (need_kallsyms) { + err = bpf_object__read_kallsyms_file(obj); + if (err) + return -EINVAL; + } + if (need_vmlinux_btf) { + err = bpf_object__resolve_ksyms_btf_id(obj); + if (err) + return -EINVAL; + } + for (i = 0; i < obj->nr_extern; i++) { + ext = &obj->externs[i]; + + if (!ext->is_set && !ext->is_weak) { + pr_warn("extern '%s' (strong): not resolved\n", ext->name); + return -ESRCH; + } else if (!ext->is_set) { + pr_debug("extern '%s' (weak): not resolved, defaulting to zero\n", + ext->name); + } + } + + return 0; +} + +static void bpf_map_prepare_vdata(const struct bpf_map *map) +{ + struct bpf_struct_ops *st_ops; + __u32 i; + + st_ops = map->st_ops; + for (i = 0; i < btf_vlen(st_ops->type); i++) { + struct bpf_program *prog = st_ops->progs[i]; + void *kern_data; + int prog_fd; + + if (!prog) + continue; + + prog_fd = bpf_program__fd(prog); + kern_data = st_ops->kern_vdata + st_ops->kern_func_off[i]; + *(unsigned long *)kern_data = prog_fd; + } +} + +static int bpf_object_prepare_struct_ops(struct bpf_object *obj) +{ + int i; + + for (i = 0; i < obj->nr_maps; i++) + if (bpf_map__is_struct_ops(&obj->maps[i])) + bpf_map_prepare_vdata(&obj->maps[i]); + + return 0; +} + +static int bpf_object_load(struct bpf_object *obj, int extra_log_level, const char *target_btf_path) +{ + int err, i; + + if (!obj) + return libbpf_err(-EINVAL); + + if (obj->loaded) { + pr_warn("object '%s': load can't be attempted twice\n", obj->name); + return libbpf_err(-EINVAL); + } + + if (obj->gen_loader) + bpf_gen__init(obj->gen_loader, extra_log_level, obj->nr_programs, obj->nr_maps); + + err = bpf_object__probe_loading(obj); + err = err ? : bpf_object__load_vmlinux_btf(obj, false); + err = err ? : bpf_object__resolve_externs(obj, obj->kconfig); + err = err ? : bpf_object__sanitize_and_load_btf(obj); + err = err ? : bpf_object__sanitize_maps(obj); + err = err ? : bpf_object__init_kern_struct_ops_maps(obj); + err = err ? : bpf_object__create_maps(obj); + err = err ? : bpf_object__relocate(obj, obj->btf_custom_path ? : target_btf_path); + err = err ? : bpf_object__load_progs(obj, extra_log_level); + err = err ? : bpf_object_init_prog_arrays(obj); + err = err ? : bpf_object_prepare_struct_ops(obj); + + if (obj->gen_loader) { + /* reset FDs */ + if (obj->btf) + btf__set_fd(obj->btf, -1); + for (i = 0; i < obj->nr_maps; i++) + obj->maps[i].fd = -1; + if (!err) + err = bpf_gen__finish(obj->gen_loader, obj->nr_programs, obj->nr_maps); + } + + /* clean up fd_array */ + zfree(&obj->fd_array); + + /* clean up module BTFs */ + for (i = 0; i < obj->btf_module_cnt; i++) { + close(obj->btf_modules[i].fd); + btf__free(obj->btf_modules[i].btf); + free(obj->btf_modules[i].name); + } + free(obj->btf_modules); + + /* clean up vmlinux BTF */ + btf__free(obj->btf_vmlinux); + obj->btf_vmlinux = NULL; + + obj->loaded = true; /* doesn't matter if successfully or not */ + + if (err) + goto out; + + return 0; +out: + /* unpin any maps that were auto-pinned during load */ + for (i = 0; i < obj->nr_maps; i++) + if (obj->maps[i].pinned && !obj->maps[i].reused) + bpf_map__unpin(&obj->maps[i], NULL); + + bpf_object_unload(obj); + pr_warn("failed to load object '%s'\n", obj->path); + return libbpf_err(err); +} + +int bpf_object__load(struct bpf_object *obj) +{ + return bpf_object_load(obj, 0, NULL); +} + +static int make_parent_dir(const char *path) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + char *dname, *dir; + int err = 0; + + dname = strdup(path); + if (dname == NULL) + return -ENOMEM; + + dir = dirname(dname); + if (mkdir(dir, 0700) && errno != EEXIST) + err = -errno; + + free(dname); + if (err) { + cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg)); + pr_warn("failed to mkdir %s: %s\n", path, cp); + } + return err; +} + +static int check_path(const char *path) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + struct statfs st_fs; + char *dname, *dir; + int err = 0; + + if (path == NULL) + return -EINVAL; + + dname = strdup(path); + if (dname == NULL) + return -ENOMEM; + + dir = dirname(dname); + if (statfs(dir, &st_fs)) { + cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg)); + pr_warn("failed to statfs %s: %s\n", dir, cp); + err = -errno; + } + free(dname); + + if (!err && st_fs.f_type != BPF_FS_MAGIC) { + pr_warn("specified path %s is not on BPF FS\n", path); + err = -EINVAL; + } + + return err; +} + +int bpf_program__pin(struct bpf_program *prog, const char *path) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + int err; + + if (prog->fd < 0) { + pr_warn("prog '%s': can't pin program that wasn't loaded\n", prog->name); + return libbpf_err(-EINVAL); + } + + err = make_parent_dir(path); + if (err) + return libbpf_err(err); + + err = check_path(path); + if (err) + return libbpf_err(err); + + if (bpf_obj_pin(prog->fd, path)) { + err = -errno; + cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg)); + pr_warn("prog '%s': failed to pin at '%s': %s\n", prog->name, path, cp); + return libbpf_err(err); + } + + pr_debug("prog '%s': pinned at '%s'\n", prog->name, path); + return 0; +} + +int bpf_program__unpin(struct bpf_program *prog, const char *path) +{ + int err; + + if (prog->fd < 0) { + pr_warn("prog '%s': can't unpin program that wasn't loaded\n", prog->name); + return libbpf_err(-EINVAL); + } + + err = check_path(path); + if (err) + return libbpf_err(err); + + err = unlink(path); + if (err) + return libbpf_err(-errno); + + pr_debug("prog '%s': unpinned from '%s'\n", prog->name, path); + return 0; +} + +int bpf_map__pin(struct bpf_map *map, const char *path) +{ + char *cp, errmsg[STRERR_BUFSIZE]; + int err; + + if (map == NULL) { + pr_warn("invalid map pointer\n"); + return libbpf_err(-EINVAL); + } + + if (map->pin_path) { + if (path && strcmp(path, map->pin_path)) { + pr_warn("map '%s' already has pin path '%s' different from '%s'\n", + bpf_map__name(map), map->pin_path, path); + return libbpf_err(-EINVAL); + } else if (map->pinned) { + pr_debug("map '%s' already pinned at '%s'; not re-pinning\n", + bpf_map__name(map), map->pin_path); + return 0; + } + } else { + if (!path) { + pr_warn("missing a path to pin map '%s' at\n", + bpf_map__name(map)); + return libbpf_err(-EINVAL); + } else if (map->pinned) { + pr_warn("map '%s' already pinned\n", bpf_map__name(map)); + return libbpf_err(-EEXIST); + } + + map->pin_path = strdup(path); + if (!map->pin_path) { + err = -errno; + goto out_err; + } + } + + err = make_parent_dir(map->pin_path); + if (err) + return libbpf_err(err); + + err = check_path(map->pin_path); + if (err) + return libbpf_err(err); + + if (bpf_obj_pin(map->fd, map->pin_path)) { + err = -errno; + goto out_err; + } + + map->pinned = true; + pr_debug("pinned map '%s'\n", map->pin_path); + + return 0; + +out_err: + cp = libbpf_strerror_r(-err, errmsg, sizeof(errmsg)); + pr_warn("failed to pin map: %s\n", cp); + return libbpf_err(err); +} + +int bpf_map__unpin(struct bpf_map *map, const char *path) +{ + int err; + + if (map == NULL) { + pr_warn("invalid map pointer\n"); + return libbpf_err(-EINVAL); + } + + if (map->pin_path) { + if (path && strcmp(path, map->pin_path)) { + pr_warn("map '%s' already has pin path '%s' different from '%s'\n", + bpf_map__name(map), map->pin_path, path); + return libbpf_err(-EINVAL); + } + path = map->pin_path; + } else if (!path) { + pr_warn("no path to unpin map '%s' from\n", + bpf_map__name(map)); + return libbpf_err(-EINVAL); + } + + err = check_path(path); + if (err) + return libbpf_err(err); + + err = unlink(path); + if (err != 0) + return libbpf_err(-errno); + + map->pinned = false; + pr_debug("unpinned map '%s' from '%s'\n", bpf_map__name(map), path); + + return 0; +} + +int bpf_map__set_pin_path(struct bpf_map *map, const char *path) +{ + char *new = NULL; + + if (path) { + new = strdup(path); + if (!new) + return libbpf_err(-errno); + } + + free(map->pin_path); + map->pin_path = new; + return 0; +} + +__alias(bpf_map__pin_path) +const char *bpf_map__get_pin_path(const struct bpf_map *map); + +const char *bpf_map__pin_path(const struct bpf_map *map) +{ + return map->pin_path; +} + +bool bpf_map__is_pinned(const struct bpf_map *map) +{ + return map->pinned; +} + +static void sanitize_pin_path(char *s) +{ + /* bpffs disallows periods in path names */ + while (*s) { + if (*s == '.') + *s = '_'; + s++; + } +} + +int bpf_object__pin_maps(struct bpf_object *obj, const char *path) +{ + struct bpf_map *map; + int err; + + if (!obj) + return libbpf_err(-ENOENT); + + if (!obj->loaded) { + pr_warn("object not yet loaded; load it first\n"); + return libbpf_err(-ENOENT); + } + + bpf_object__for_each_map(map, obj) { + char *pin_path = NULL; + char buf[PATH_MAX]; + + if (!map->autocreate) + continue; + + if (path) { + err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map)); + if (err) + goto err_unpin_maps; + sanitize_pin_path(buf); + pin_path = buf; + } else if (!map->pin_path) { + continue; + } + + err = bpf_map__pin(map, pin_path); + if (err) + goto err_unpin_maps; + } + + return 0; + +err_unpin_maps: + while ((map = bpf_object__prev_map(obj, map))) { + if (!map->pin_path) + continue; + + bpf_map__unpin(map, NULL); + } + + return libbpf_err(err); +} + +int bpf_object__unpin_maps(struct bpf_object *obj, const char *path) +{ + struct bpf_map *map; + int err; + + if (!obj) + return libbpf_err(-ENOENT); + + bpf_object__for_each_map(map, obj) { + char *pin_path = NULL; + char buf[PATH_MAX]; + + if (path) { + err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map)); + if (err) + return libbpf_err(err); + sanitize_pin_path(buf); + pin_path = buf; + } else if (!map->pin_path) { + continue; + } + + err = bpf_map__unpin(map, pin_path); + if (err) + return libbpf_err(err); + } + + return 0; +} + +int bpf_object__pin_programs(struct bpf_object *obj, const char *path) +{ + struct bpf_program *prog; + char buf[PATH_MAX]; + int err; + + if (!obj) + return libbpf_err(-ENOENT); + + if (!obj->loaded) { + pr_warn("object not yet loaded; load it first\n"); + return libbpf_err(-ENOENT); + } + + bpf_object__for_each_program(prog, obj) { + err = pathname_concat(buf, sizeof(buf), path, prog->name); + if (err) + goto err_unpin_programs; + + err = bpf_program__pin(prog, buf); + if (err) + goto err_unpin_programs; + } + + return 0; + +err_unpin_programs: + while ((prog = bpf_object__prev_program(obj, prog))) { + if (pathname_concat(buf, sizeof(buf), path, prog->name)) + continue; + + bpf_program__unpin(prog, buf); + } + + return libbpf_err(err); +} + +int bpf_object__unpin_programs(struct bpf_object *obj, const char *path) +{ + struct bpf_program *prog; + int err; + + if (!obj) + return libbpf_err(-ENOENT); + + bpf_object__for_each_program(prog, obj) { + char buf[PATH_MAX]; + + err = pathname_concat(buf, sizeof(buf), path, prog->name); + if (err) + return libbpf_err(err); + + err = bpf_program__unpin(prog, buf); + if (err) + return libbpf_err(err); + } + + return 0; +} + +int bpf_object__pin(struct bpf_object *obj, const char *path) +{ + int err; + + err = bpf_object__pin_maps(obj, path); + if (err) + return libbpf_err(err); + + err = bpf_object__pin_programs(obj, path); + if (err) { + bpf_object__unpin_maps(obj, path); + return libbpf_err(err); + } + + return 0; +} + +static void bpf_map__destroy(struct bpf_map *map) +{ + if (map->inner_map) { + bpf_map__destroy(map->inner_map); + zfree(&map->inner_map); + } + + zfree(&map->init_slots); + map->init_slots_sz = 0; + + if (map->mmaped) { + munmap(map->mmaped, bpf_map_mmap_sz(map)); + map->mmaped = NULL; + } + + if (map->st_ops) { + zfree(&map->st_ops->data); + zfree(&map->st_ops->progs); + zfree(&map->st_ops->kern_func_off); + zfree(&map->st_ops); + } + + zfree(&map->name); + zfree(&map->real_name); + zfree(&map->pin_path); + + if (map->fd >= 0) + zclose(map->fd); +} + +void bpf_object__close(struct bpf_object *obj) +{ + size_t i; + + if (IS_ERR_OR_NULL(obj)) + return; + + usdt_manager_free(obj->usdt_man); + obj->usdt_man = NULL; + + bpf_gen__free(obj->gen_loader); + bpf_object__elf_finish(obj); + bpf_object_unload(obj); + btf__free(obj->btf); + btf_ext__free(obj->btf_ext); + + for (i = 0; i < obj->nr_maps; i++) + bpf_map__destroy(&obj->maps[i]); + + zfree(&obj->btf_custom_path); + zfree(&obj->kconfig); + zfree(&obj->externs); + obj->nr_extern = 0; + + zfree(&obj->maps); + obj->nr_maps = 0; + + if (obj->programs && obj->nr_programs) { + for (i = 0; i < obj->nr_programs; i++) + bpf_program__exit(&obj->programs[i]); + } + zfree(&obj->programs); + + free(obj); +} + +const char *bpf_object__name(const struct bpf_object *obj) +{ + return obj ? obj->name : libbpf_err_ptr(-EINVAL); +} + +unsigned int bpf_object__kversion(const struct bpf_object *obj) +{ + return obj ? obj->kern_version : 0; +} + +struct btf *bpf_object__btf(const struct bpf_object *obj) +{ + return obj ? obj->btf : NULL; +} + +int bpf_object__btf_fd(const struct bpf_object *obj) +{ + return obj->btf ? btf__fd(obj->btf) : -1; +} + +int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version) +{ + if (obj->loaded) + return libbpf_err(-EINVAL); + + obj->kern_version = kern_version; + + return 0; +} + +int bpf_object__gen_loader(struct bpf_object *obj, struct gen_loader_opts *opts) +{ + struct bpf_gen *gen; + + if (!opts) + return -EFAULT; + if (!OPTS_VALID(opts, gen_loader_opts)) + return -EINVAL; + gen = calloc(sizeof(*gen), 1); + if (!gen) + return -ENOMEM; + gen->opts = opts; + obj->gen_loader = gen; + return 0; +} + +static struct bpf_program * +__bpf_program__iter(const struct bpf_program *p, const struct bpf_object *obj, + bool forward) +{ + size_t nr_programs = obj->nr_programs; + ssize_t idx; + + if (!nr_programs) + return NULL; + + if (!p) + /* Iter from the beginning */ + return forward ? &obj->programs[0] : + &obj->programs[nr_programs - 1]; + + if (p->obj != obj) { + pr_warn("error: program handler doesn't match object\n"); + return errno = EINVAL, NULL; + } + + idx = (p - obj->programs) + (forward ? 1 : -1); + if (idx >= obj->nr_programs || idx < 0) + return NULL; + return &obj->programs[idx]; +} + +struct bpf_program * +bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prev) +{ + struct bpf_program *prog = prev; + + do { + prog = __bpf_program__iter(prog, obj, true); + } while (prog && prog_is_subprog(obj, prog)); + + return prog; +} + +struct bpf_program * +bpf_object__prev_program(const struct bpf_object *obj, struct bpf_program *next) +{ + struct bpf_program *prog = next; + + do { + prog = __bpf_program__iter(prog, obj, false); + } while (prog && prog_is_subprog(obj, prog)); + + return prog; +} + +void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) +{ + prog->prog_ifindex = ifindex; +} + +const char *bpf_program__name(const struct bpf_program *prog) +{ + return prog->name; +} + +const char *bpf_program__section_name(const struct bpf_program *prog) +{ + return prog->sec_name; +} + +bool bpf_program__autoload(const struct bpf_program *prog) +{ + return prog->autoload; +} + +int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) +{ + if (prog->obj->loaded) + return libbpf_err(-EINVAL); + + prog->autoload = autoload; + return 0; +} + +bool bpf_program__autoattach(const struct bpf_program *prog) +{ + return prog->autoattach; +} + +void bpf_program__set_autoattach(struct bpf_program *prog, bool autoattach) +{ + prog->autoattach = autoattach; +} + +const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog) +{ + return prog->insns; +} + +size_t bpf_program__insn_cnt(const struct bpf_program *prog) +{ + return prog->insns_cnt; +} + +int bpf_program__set_insns(struct bpf_program *prog, + struct bpf_insn *new_insns, size_t new_insn_cnt) +{ + struct bpf_insn *insns; + + if (prog->obj->loaded) + return -EBUSY; + + insns = libbpf_reallocarray(prog->insns, new_insn_cnt, sizeof(*insns)); + if (!insns) { + pr_warn("prog '%s': failed to realloc prog code\n", prog->name); + return -ENOMEM; + } + memcpy(insns, new_insns, new_insn_cnt * sizeof(*insns)); + + prog->insns = insns; + prog->insns_cnt = new_insn_cnt; + return 0; +} + +int bpf_program__fd(const struct bpf_program *prog) +{ + if (!prog) + return libbpf_err(-EINVAL); + + if (prog->fd < 0) + return libbpf_err(-ENOENT); + + return prog->fd; +} + +__alias(bpf_program__type) +enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog); + +enum bpf_prog_type bpf_program__type(const struct bpf_program *prog) +{ + return prog->type; +} + +int bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) +{ + if (prog->obj->loaded) + return libbpf_err(-EBUSY); + + prog->type = type; + return 0; +} + +__alias(bpf_program__expected_attach_type) +enum bpf_attach_type bpf_program__get_expected_attach_type(const struct bpf_program *prog); + +enum bpf_attach_type bpf_program__expected_attach_type(const struct bpf_program *prog) +{ + return prog->expected_attach_type; +} + +int bpf_program__set_expected_attach_type(struct bpf_program *prog, + enum bpf_attach_type type) +{ + if (prog->obj->loaded) + return libbpf_err(-EBUSY); + + prog->expected_attach_type = type; + return 0; +} + +__u32 bpf_program__flags(const struct bpf_program *prog) +{ + return prog->prog_flags; +} + +int bpf_program__set_flags(struct bpf_program *prog, __u32 flags) +{ + if (prog->obj->loaded) + return libbpf_err(-EBUSY); + + prog->prog_flags = flags; + return 0; +} + +__u32 bpf_program__log_level(const struct bpf_program *prog) +{ + return prog->log_level; +} + +int bpf_program__set_log_level(struct bpf_program *prog, __u32 log_level) +{ + if (prog->obj->loaded) + return libbpf_err(-EBUSY); + + prog->log_level = log_level; + return 0; +} + +const char *bpf_program__log_buf(const struct bpf_program *prog, size_t *log_size) +{ + *log_size = prog->log_size; + return prog->log_buf; +} + +int bpf_program__set_log_buf(struct bpf_program *prog, char *log_buf, size_t log_size) +{ + if (log_size && !log_buf) + return -EINVAL; + if (prog->log_size > UINT_MAX) + return -EINVAL; + if (prog->obj->loaded) + return -EBUSY; + + prog->log_buf = log_buf; + prog->log_size = log_size; + return 0; +} + +#define SEC_DEF(sec_pfx, ptype, atype, flags, ...) { \ + .sec = (char *)sec_pfx, \ + .prog_type = BPF_PROG_TYPE_##ptype, \ + .expected_attach_type = atype, \ + .cookie = (long)(flags), \ + .prog_prepare_load_fn = libbpf_prepare_prog_load, \ + __VA_ARGS__ \ +} + +static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_ksyscall(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link); +static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link); + +static const struct bpf_sec_def section_defs[] = { + SEC_DEF("socket", SOCKET_FILTER, 0, SEC_NONE), + SEC_DEF("sk_reuseport/migrate", SK_REUSEPORT, BPF_SK_REUSEPORT_SELECT_OR_MIGRATE, SEC_ATTACHABLE), + SEC_DEF("sk_reuseport", SK_REUSEPORT, BPF_SK_REUSEPORT_SELECT, SEC_ATTACHABLE), + SEC_DEF("kprobe+", KPROBE, 0, SEC_NONE, attach_kprobe), + SEC_DEF("uprobe+", KPROBE, 0, SEC_NONE, attach_uprobe), + SEC_DEF("uprobe.s+", KPROBE, 0, SEC_SLEEPABLE, attach_uprobe), + SEC_DEF("kretprobe+", KPROBE, 0, SEC_NONE, attach_kprobe), + SEC_DEF("uretprobe+", KPROBE, 0, SEC_NONE, attach_uprobe), + SEC_DEF("uretprobe.s+", KPROBE, 0, SEC_SLEEPABLE, attach_uprobe), + SEC_DEF("kprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi), + SEC_DEF("kretprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi), + SEC_DEF("ksyscall+", KPROBE, 0, SEC_NONE, attach_ksyscall), + SEC_DEF("kretsyscall+", KPROBE, 0, SEC_NONE, attach_ksyscall), + SEC_DEF("usdt+", KPROBE, 0, SEC_NONE, attach_usdt), + SEC_DEF("tc", SCHED_CLS, 0, SEC_NONE), + SEC_DEF("classifier", SCHED_CLS, 0, SEC_NONE), + SEC_DEF("action", SCHED_ACT, 0, SEC_NONE), + SEC_DEF("tracepoint+", TRACEPOINT, 0, SEC_NONE, attach_tp), + SEC_DEF("tp+", TRACEPOINT, 0, SEC_NONE, attach_tp), + SEC_DEF("raw_tracepoint+", RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp), + SEC_DEF("raw_tp+", RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp), + SEC_DEF("raw_tracepoint.w+", RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp), + SEC_DEF("raw_tp.w+", RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp), + SEC_DEF("tp_btf+", TRACING, BPF_TRACE_RAW_TP, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("fentry+", TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("fmod_ret+", TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("fexit+", TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("fentry.s+", TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace), + SEC_DEF("fmod_ret.s+", TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace), + SEC_DEF("fexit.s+", TRACING, BPF_TRACE_FEXIT, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_trace), + SEC_DEF("freplace+", EXT, 0, SEC_ATTACH_BTF, attach_trace), + SEC_DEF("lsm+", LSM, BPF_LSM_MAC, SEC_ATTACH_BTF, attach_lsm), + SEC_DEF("lsm.s+", LSM, BPF_LSM_MAC, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_lsm), + SEC_DEF("lsm_cgroup+", LSM, BPF_LSM_CGROUP, SEC_ATTACH_BTF), + SEC_DEF("iter+", TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF, attach_iter), + SEC_DEF("iter.s+", TRACING, BPF_TRACE_ITER, SEC_ATTACH_BTF | SEC_SLEEPABLE, attach_iter), + SEC_DEF("syscall", SYSCALL, 0, SEC_SLEEPABLE), + SEC_DEF("xdp.frags/devmap", XDP, BPF_XDP_DEVMAP, SEC_XDP_FRAGS), + SEC_DEF("xdp/devmap", XDP, BPF_XDP_DEVMAP, SEC_ATTACHABLE), + SEC_DEF("xdp.frags/cpumap", XDP, BPF_XDP_CPUMAP, SEC_XDP_FRAGS), + SEC_DEF("xdp/cpumap", XDP, BPF_XDP_CPUMAP, SEC_ATTACHABLE), + SEC_DEF("xdp.frags", XDP, BPF_XDP, SEC_XDP_FRAGS), + SEC_DEF("xdp", XDP, BPF_XDP, SEC_ATTACHABLE_OPT), + SEC_DEF("perf_event", PERF_EVENT, 0, SEC_NONE), + SEC_DEF("lwt_in", LWT_IN, 0, SEC_NONE), + SEC_DEF("lwt_out", LWT_OUT, 0, SEC_NONE), + SEC_DEF("lwt_xmit", LWT_XMIT, 0, SEC_NONE), + SEC_DEF("lwt_seg6local", LWT_SEG6LOCAL, 0, SEC_NONE), + SEC_DEF("sockops", SOCK_OPS, BPF_CGROUP_SOCK_OPS, SEC_ATTACHABLE_OPT), + SEC_DEF("sk_skb/stream_parser", SK_SKB, BPF_SK_SKB_STREAM_PARSER, SEC_ATTACHABLE_OPT), + SEC_DEF("sk_skb/stream_verdict",SK_SKB, BPF_SK_SKB_STREAM_VERDICT, SEC_ATTACHABLE_OPT), + SEC_DEF("sk_skb", SK_SKB, 0, SEC_NONE), + SEC_DEF("sk_msg", SK_MSG, BPF_SK_MSG_VERDICT, SEC_ATTACHABLE_OPT), + SEC_DEF("lirc_mode2", LIRC_MODE2, BPF_LIRC_MODE2, SEC_ATTACHABLE_OPT), + SEC_DEF("flow_dissector", FLOW_DISSECTOR, BPF_FLOW_DISSECTOR, SEC_ATTACHABLE_OPT), + SEC_DEF("cgroup_skb/ingress", CGROUP_SKB, BPF_CGROUP_INET_INGRESS, SEC_ATTACHABLE_OPT), + SEC_DEF("cgroup_skb/egress", CGROUP_SKB, BPF_CGROUP_INET_EGRESS, SEC_ATTACHABLE_OPT), + SEC_DEF("cgroup/skb", CGROUP_SKB, 0, SEC_NONE), + SEC_DEF("cgroup/sock_create", CGROUP_SOCK, BPF_CGROUP_INET_SOCK_CREATE, SEC_ATTACHABLE), + SEC_DEF("cgroup/sock_release", CGROUP_SOCK, BPF_CGROUP_INET_SOCK_RELEASE, SEC_ATTACHABLE), + SEC_DEF("cgroup/sock", CGROUP_SOCK, BPF_CGROUP_INET_SOCK_CREATE, SEC_ATTACHABLE_OPT), + SEC_DEF("cgroup/post_bind4", CGROUP_SOCK, BPF_CGROUP_INET4_POST_BIND, SEC_ATTACHABLE), + SEC_DEF("cgroup/post_bind6", CGROUP_SOCK, BPF_CGROUP_INET6_POST_BIND, SEC_ATTACHABLE), + SEC_DEF("cgroup/bind4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_BIND, SEC_ATTACHABLE), + SEC_DEF("cgroup/bind6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_BIND, SEC_ATTACHABLE), + SEC_DEF("cgroup/connect4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_CONNECT, SEC_ATTACHABLE), + SEC_DEF("cgroup/connect6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_CONNECT, SEC_ATTACHABLE), + SEC_DEF("cgroup/sendmsg4", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_SENDMSG, SEC_ATTACHABLE), + SEC_DEF("cgroup/sendmsg6", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_SENDMSG, SEC_ATTACHABLE), + SEC_DEF("cgroup/recvmsg4", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP4_RECVMSG, SEC_ATTACHABLE), + SEC_DEF("cgroup/recvmsg6", CGROUP_SOCK_ADDR, BPF_CGROUP_UDP6_RECVMSG, SEC_ATTACHABLE), + SEC_DEF("cgroup/getpeername4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETPEERNAME, SEC_ATTACHABLE), + SEC_DEF("cgroup/getpeername6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETPEERNAME, SEC_ATTACHABLE), + SEC_DEF("cgroup/getsockname4", CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_GETSOCKNAME, SEC_ATTACHABLE), + SEC_DEF("cgroup/getsockname6", CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_GETSOCKNAME, SEC_ATTACHABLE), + SEC_DEF("cgroup/sysctl", CGROUP_SYSCTL, BPF_CGROUP_SYSCTL, SEC_ATTACHABLE), + SEC_DEF("cgroup/getsockopt", CGROUP_SOCKOPT, BPF_CGROUP_GETSOCKOPT, SEC_ATTACHABLE), + SEC_DEF("cgroup/setsockopt", CGROUP_SOCKOPT, BPF_CGROUP_SETSOCKOPT, SEC_ATTACHABLE), + SEC_DEF("cgroup/dev", CGROUP_DEVICE, BPF_CGROUP_DEVICE, SEC_ATTACHABLE_OPT), + SEC_DEF("struct_ops+", STRUCT_OPS, 0, SEC_NONE), + SEC_DEF("struct_ops.s+", STRUCT_OPS, 0, SEC_SLEEPABLE), + SEC_DEF("sk_lookup", SK_LOOKUP, BPF_SK_LOOKUP, SEC_ATTACHABLE), +}; + +static size_t custom_sec_def_cnt; +static struct bpf_sec_def *custom_sec_defs; +static struct bpf_sec_def custom_fallback_def; +static bool has_custom_fallback_def; + +static int last_custom_sec_def_handler_id; + +int libbpf_register_prog_handler(const char *sec, + enum bpf_prog_type prog_type, + enum bpf_attach_type exp_attach_type, + const struct libbpf_prog_handler_opts *opts) +{ + struct bpf_sec_def *sec_def; + + if (!OPTS_VALID(opts, libbpf_prog_handler_opts)) + return libbpf_err(-EINVAL); + + if (last_custom_sec_def_handler_id == INT_MAX) /* prevent overflow */ + return libbpf_err(-E2BIG); + + if (sec) { + sec_def = libbpf_reallocarray(custom_sec_defs, custom_sec_def_cnt + 1, + sizeof(*sec_def)); + if (!sec_def) + return libbpf_err(-ENOMEM); + + custom_sec_defs = sec_def; + sec_def = &custom_sec_defs[custom_sec_def_cnt]; + } else { + if (has_custom_fallback_def) + return libbpf_err(-EBUSY); + + sec_def = &custom_fallback_def; + } + + sec_def->sec = sec ? strdup(sec) : NULL; + if (sec && !sec_def->sec) + return libbpf_err(-ENOMEM); + + sec_def->prog_type = prog_type; + sec_def->expected_attach_type = exp_attach_type; + sec_def->cookie = OPTS_GET(opts, cookie, 0); + + sec_def->prog_setup_fn = OPTS_GET(opts, prog_setup_fn, NULL); + sec_def->prog_prepare_load_fn = OPTS_GET(opts, prog_prepare_load_fn, NULL); + sec_def->prog_attach_fn = OPTS_GET(opts, prog_attach_fn, NULL); + + sec_def->handler_id = ++last_custom_sec_def_handler_id; + + if (sec) + custom_sec_def_cnt++; + else + has_custom_fallback_def = true; + + return sec_def->handler_id; +} + +int libbpf_unregister_prog_handler(int handler_id) +{ + struct bpf_sec_def *sec_defs; + int i; + + if (handler_id <= 0) + return libbpf_err(-EINVAL); + + if (has_custom_fallback_def && custom_fallback_def.handler_id == handler_id) { + memset(&custom_fallback_def, 0, sizeof(custom_fallback_def)); + has_custom_fallback_def = false; + return 0; + } + + for (i = 0; i < custom_sec_def_cnt; i++) { + if (custom_sec_defs[i].handler_id == handler_id) + break; + } + + if (i == custom_sec_def_cnt) + return libbpf_err(-ENOENT); + + free(custom_sec_defs[i].sec); + for (i = i + 1; i < custom_sec_def_cnt; i++) + custom_sec_defs[i - 1] = custom_sec_defs[i]; + custom_sec_def_cnt--; + + /* try to shrink the array, but it's ok if we couldn't */ + sec_defs = libbpf_reallocarray(custom_sec_defs, custom_sec_def_cnt, sizeof(*sec_defs)); + if (sec_defs) + custom_sec_defs = sec_defs; + + return 0; +} + +static bool sec_def_matches(const struct bpf_sec_def *sec_def, const char *sec_name) +{ + size_t len = strlen(sec_def->sec); + + /* "type/" always has to have proper SEC("type/extras") form */ + if (sec_def->sec[len - 1] == '/') { + if (str_has_pfx(sec_name, sec_def->sec)) + return true; + return false; + } + + /* "type+" means it can be either exact SEC("type") or + * well-formed SEC("type/extras") with proper '/' separator + */ + if (sec_def->sec[len - 1] == '+') { + len--; + /* not even a prefix */ + if (strncmp(sec_name, sec_def->sec, len) != 0) + return false; + /* exact match or has '/' separator */ + if (sec_name[len] == '\0' || sec_name[len] == '/') + return true; + return false; + } + + return strcmp(sec_name, sec_def->sec) == 0; +} + +static const struct bpf_sec_def *find_sec_def(const char *sec_name) +{ + const struct bpf_sec_def *sec_def; + int i, n; + + n = custom_sec_def_cnt; + for (i = 0; i < n; i++) { + sec_def = &custom_sec_defs[i]; + if (sec_def_matches(sec_def, sec_name)) + return sec_def; + } + + n = ARRAY_SIZE(section_defs); + for (i = 0; i < n; i++) { + sec_def = §ion_defs[i]; + if (sec_def_matches(sec_def, sec_name)) + return sec_def; + } + + if (has_custom_fallback_def) + return &custom_fallback_def; + + return NULL; +} + +#define MAX_TYPE_NAME_SIZE 32 + +static char *libbpf_get_type_names(bool attach_type) +{ + int i, len = ARRAY_SIZE(section_defs) * MAX_TYPE_NAME_SIZE; + char *buf; + + buf = malloc(len); + if (!buf) + return NULL; + + buf[0] = '\0'; + /* Forge string buf with all available names */ + for (i = 0; i < ARRAY_SIZE(section_defs); i++) { + const struct bpf_sec_def *sec_def = §ion_defs[i]; + + if (attach_type) { + if (sec_def->prog_prepare_load_fn != libbpf_prepare_prog_load) + continue; + + if (!(sec_def->cookie & SEC_ATTACHABLE)) + continue; + } + + if (strlen(buf) + strlen(section_defs[i].sec) + 2 > len) { + free(buf); + return NULL; + } + strcat(buf, " "); + strcat(buf, section_defs[i].sec); + } + + return buf; +} + +int libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, + enum bpf_attach_type *expected_attach_type) +{ + const struct bpf_sec_def *sec_def; + char *type_names; + + if (!name) + return libbpf_err(-EINVAL); + + sec_def = find_sec_def(name); + if (sec_def) { + *prog_type = sec_def->prog_type; + *expected_attach_type = sec_def->expected_attach_type; + return 0; + } + + pr_debug("failed to guess program type from ELF section '%s'\n", name); + type_names = libbpf_get_type_names(false); + if (type_names != NULL) { + pr_debug("supported section(type) names are:%s\n", type_names); + free(type_names); + } + + return libbpf_err(-ESRCH); +} + +const char *libbpf_bpf_attach_type_str(enum bpf_attach_type t) +{ + if (t < 0 || t >= ARRAY_SIZE(attach_type_name)) + return NULL; + + return attach_type_name[t]; +} + +const char *libbpf_bpf_link_type_str(enum bpf_link_type t) +{ + if (t < 0 || t >= ARRAY_SIZE(link_type_name)) + return NULL; + + return link_type_name[t]; +} + +const char *libbpf_bpf_map_type_str(enum bpf_map_type t) +{ + if (t < 0 || t >= ARRAY_SIZE(map_type_name)) + return NULL; + + return map_type_name[t]; +} + +const char *libbpf_bpf_prog_type_str(enum bpf_prog_type t) +{ + if (t < 0 || t >= ARRAY_SIZE(prog_type_name)) + return NULL; + + return prog_type_name[t]; +} + +static struct bpf_map *find_struct_ops_map_by_offset(struct bpf_object *obj, + int sec_idx, + size_t offset) +{ + struct bpf_map *map; + size_t i; + + for (i = 0; i < obj->nr_maps; i++) { + map = &obj->maps[i]; + if (!bpf_map__is_struct_ops(map)) + continue; + if (map->sec_idx == sec_idx && + map->sec_offset <= offset && + offset - map->sec_offset < map->def.value_size) + return map; + } + + return NULL; +} + +/* Collect the reloc from ELF and populate the st_ops->progs[] */ +static int bpf_object__collect_st_ops_relos(struct bpf_object *obj, + Elf64_Shdr *shdr, Elf_Data *data) +{ + const struct btf_member *member; + struct bpf_struct_ops *st_ops; + struct bpf_program *prog; + unsigned int shdr_idx; + const struct btf *btf; + struct bpf_map *map; + unsigned int moff, insn_idx; + const char *name; + __u32 member_idx; + Elf64_Sym *sym; + Elf64_Rel *rel; + int i, nrels; + + btf = obj->btf; + nrels = shdr->sh_size / shdr->sh_entsize; + for (i = 0; i < nrels; i++) { + rel = elf_rel_by_idx(data, i); + if (!rel) { + pr_warn("struct_ops reloc: failed to get %d reloc\n", i); + return -LIBBPF_ERRNO__FORMAT; + } + + sym = elf_sym_by_idx(obj, ELF64_R_SYM(rel->r_info)); + if (!sym) { + pr_warn("struct_ops reloc: symbol %zx not found\n", + (size_t)ELF64_R_SYM(rel->r_info)); + return -LIBBPF_ERRNO__FORMAT; + } + + name = elf_sym_str(obj, sym->st_name) ?: ""; + map = find_struct_ops_map_by_offset(obj, shdr->sh_info, rel->r_offset); + if (!map) { + pr_warn("struct_ops reloc: cannot find map at rel->r_offset %zu\n", + (size_t)rel->r_offset); + return -EINVAL; + } + + moff = rel->r_offset - map->sec_offset; + shdr_idx = sym->st_shndx; + st_ops = map->st_ops; + pr_debug("struct_ops reloc %s: for %lld value %lld shdr_idx %u rel->r_offset %zu map->sec_offset %zu name %d (\'%s\')\n", + map->name, + (long long)(rel->r_info >> 32), + (long long)sym->st_value, + shdr_idx, (size_t)rel->r_offset, + map->sec_offset, sym->st_name, name); + + if (shdr_idx >= SHN_LORESERVE) { + pr_warn("struct_ops reloc %s: rel->r_offset %zu shdr_idx %u unsupported non-static function\n", + map->name, (size_t)rel->r_offset, shdr_idx); + return -LIBBPF_ERRNO__RELOC; + } + if (sym->st_value % BPF_INSN_SZ) { + pr_warn("struct_ops reloc %s: invalid target program offset %llu\n", + map->name, (unsigned long long)sym->st_value); + return -LIBBPF_ERRNO__FORMAT; + } + insn_idx = sym->st_value / BPF_INSN_SZ; + + member = find_member_by_offset(st_ops->type, moff * 8); + if (!member) { + pr_warn("struct_ops reloc %s: cannot find member at moff %u\n", + map->name, moff); + return -EINVAL; + } + member_idx = member - btf_members(st_ops->type); + name = btf__name_by_offset(btf, member->name_off); + + if (!resolve_func_ptr(btf, member->type, NULL)) { + pr_warn("struct_ops reloc %s: cannot relocate non func ptr %s\n", + map->name, name); + return -EINVAL; + } + + prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx); + if (!prog) { + pr_warn("struct_ops reloc %s: cannot find prog at shdr_idx %u to relocate func ptr %s\n", + map->name, shdr_idx, name); + return -EINVAL; + } + + /* prevent the use of BPF prog with invalid type */ + if (prog->type != BPF_PROG_TYPE_STRUCT_OPS) { + pr_warn("struct_ops reloc %s: prog %s is not struct_ops BPF program\n", + map->name, prog->name); + return -EINVAL; + } + + /* if we haven't yet processed this BPF program, record proper + * attach_btf_id and member_idx + */ + if (!prog->attach_btf_id) { + prog->attach_btf_id = st_ops->type_id; + prog->expected_attach_type = member_idx; + } + + /* struct_ops BPF prog can be re-used between multiple + * .struct_ops & .struct_ops.link as long as it's the + * same struct_ops struct definition and the same + * function pointer field + */ + if (prog->attach_btf_id != st_ops->type_id || + prog->expected_attach_type != member_idx) { + pr_warn("struct_ops reloc %s: cannot use prog %s in sec %s with type %u attach_btf_id %u expected_attach_type %u for func ptr %s\n", + map->name, prog->name, prog->sec_name, prog->type, + prog->attach_btf_id, prog->expected_attach_type, name); + return -EINVAL; + } + + st_ops->progs[member_idx] = prog; + } + + return 0; +} + +#define BTF_TRACE_PREFIX "btf_trace_" +#define BTF_LSM_PREFIX "bpf_lsm_" +#define BTF_ITER_PREFIX "bpf_iter_" +#define BTF_MAX_NAME_SIZE 128 + +void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type, + const char **prefix, int *kind) +{ + switch (attach_type) { + case BPF_TRACE_RAW_TP: + *prefix = BTF_TRACE_PREFIX; + *kind = BTF_KIND_TYPEDEF; + break; + case BPF_LSM_MAC: + case BPF_LSM_CGROUP: + *prefix = BTF_LSM_PREFIX; + *kind = BTF_KIND_FUNC; + break; + case BPF_TRACE_ITER: + *prefix = BTF_ITER_PREFIX; + *kind = BTF_KIND_FUNC; + break; + default: + *prefix = ""; + *kind = BTF_KIND_FUNC; + } +} + +static int find_btf_by_prefix_kind(const struct btf *btf, const char *prefix, + const char *name, __u32 kind) +{ + char btf_type_name[BTF_MAX_NAME_SIZE]; + int ret; + + ret = snprintf(btf_type_name, sizeof(btf_type_name), + "%s%s", prefix, name); + /* snprintf returns the number of characters written excluding the + * terminating null. So, if >= BTF_MAX_NAME_SIZE are written, it + * indicates truncation. + */ + if (ret < 0 || ret >= sizeof(btf_type_name)) + return -ENAMETOOLONG; + return btf__find_by_name_kind(btf, btf_type_name, kind); +} + +static inline int find_attach_btf_id(struct btf *btf, const char *name, + enum bpf_attach_type attach_type) +{ + const char *prefix; + int kind; + + btf_get_kernel_prefix_kind(attach_type, &prefix, &kind); + return find_btf_by_prefix_kind(btf, prefix, name, kind); +} + +int libbpf_find_vmlinux_btf_id(const char *name, + enum bpf_attach_type attach_type) +{ + struct btf *btf; + int err; + + btf = btf__load_vmlinux_btf(); + err = libbpf_get_error(btf); + if (err) { + pr_warn("vmlinux BTF is not found\n"); + return libbpf_err(err); + } + + err = find_attach_btf_id(btf, name, attach_type); + if (err <= 0) + pr_warn("%s is not found in vmlinux BTF\n", name); + + btf__free(btf); + return libbpf_err(err); +} + +static int libbpf_find_prog_btf_id(const char *name, __u32 attach_prog_fd) +{ + struct bpf_prog_info info; + __u32 info_len = sizeof(info); + struct btf *btf; + int err; + + memset(&info, 0, info_len); + err = bpf_prog_get_info_by_fd(attach_prog_fd, &info, &info_len); + if (err) { + pr_warn("failed bpf_prog_get_info_by_fd for FD %d: %d\n", + attach_prog_fd, err); + return err; + } + + err = -EINVAL; + if (!info.btf_id) { + pr_warn("The target program doesn't have BTF\n"); + goto out; + } + btf = btf__load_from_kernel_by_id(info.btf_id); + err = libbpf_get_error(btf); + if (err) { + pr_warn("Failed to get BTF %d of the program: %d\n", info.btf_id, err); + goto out; + } + err = btf__find_by_name_kind(btf, name, BTF_KIND_FUNC); + btf__free(btf); + if (err <= 0) { + pr_warn("%s is not found in prog's BTF\n", name); + goto out; + } +out: + return err; +} + +static int find_kernel_btf_id(struct bpf_object *obj, const char *attach_name, + enum bpf_attach_type attach_type, + int *btf_obj_fd, int *btf_type_id) +{ + int ret, i; + + ret = find_attach_btf_id(obj->btf_vmlinux, attach_name, attach_type); + if (ret > 0) { + *btf_obj_fd = 0; /* vmlinux BTF */ + *btf_type_id = ret; + return 0; + } + if (ret != -ENOENT) + return ret; + + ret = load_module_btfs(obj); + if (ret) + return ret; + + for (i = 0; i < obj->btf_module_cnt; i++) { + const struct module_btf *mod = &obj->btf_modules[i]; + + ret = find_attach_btf_id(mod->btf, attach_name, attach_type); + if (ret > 0) { + *btf_obj_fd = mod->fd; + *btf_type_id = ret; + return 0; + } + if (ret == -ENOENT) + continue; + + return ret; + } + + return -ESRCH; +} + +static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name, + int *btf_obj_fd, int *btf_type_id) +{ + enum bpf_attach_type attach_type = prog->expected_attach_type; + __u32 attach_prog_fd = prog->attach_prog_fd; + int err = 0; + + /* BPF program's BTF ID */ + if (prog->type == BPF_PROG_TYPE_EXT || attach_prog_fd) { + if (!attach_prog_fd) { + pr_warn("prog '%s': attach program FD is not set\n", prog->name); + return -EINVAL; + } + err = libbpf_find_prog_btf_id(attach_name, attach_prog_fd); + if (err < 0) { + pr_warn("prog '%s': failed to find BPF program (FD %d) BTF ID for '%s': %d\n", + prog->name, attach_prog_fd, attach_name, err); + return err; + } + *btf_obj_fd = 0; + *btf_type_id = err; + return 0; + } + + /* kernel/module BTF ID */ + if (prog->obj->gen_loader) { + bpf_gen__record_attach_target(prog->obj->gen_loader, attach_name, attach_type); + *btf_obj_fd = 0; + *btf_type_id = 1; + } else { + err = find_kernel_btf_id(prog->obj, attach_name, attach_type, btf_obj_fd, btf_type_id); + } + if (err) { + pr_warn("prog '%s': failed to find kernel BTF type ID of '%s': %d\n", + prog->name, attach_name, err); + return err; + } + return 0; +} + +int libbpf_attach_type_by_name(const char *name, + enum bpf_attach_type *attach_type) +{ + char *type_names; + const struct bpf_sec_def *sec_def; + + if (!name) + return libbpf_err(-EINVAL); + + sec_def = find_sec_def(name); + if (!sec_def) { + pr_debug("failed to guess attach type based on ELF section name '%s'\n", name); + type_names = libbpf_get_type_names(true); + if (type_names != NULL) { + pr_debug("attachable section(type) names are:%s\n", type_names); + free(type_names); + } + + return libbpf_err(-EINVAL); + } + + if (sec_def->prog_prepare_load_fn != libbpf_prepare_prog_load) + return libbpf_err(-EINVAL); + if (!(sec_def->cookie & SEC_ATTACHABLE)) + return libbpf_err(-EINVAL); + + *attach_type = sec_def->expected_attach_type; + return 0; +} + +int bpf_map__fd(const struct bpf_map *map) +{ + return map ? map->fd : libbpf_err(-EINVAL); +} + +static bool map_uses_real_name(const struct bpf_map *map) +{ + /* Since libbpf started to support custom .data.* and .rodata.* maps, + * their user-visible name differs from kernel-visible name. Users see + * such map's corresponding ELF section name as a map name. + * This check distinguishes .data/.rodata from .data.* and .rodata.* + * maps to know which name has to be returned to the user. + */ + if (map->libbpf_type == LIBBPF_MAP_DATA && strcmp(map->real_name, DATA_SEC) != 0) + return true; + if (map->libbpf_type == LIBBPF_MAP_RODATA && strcmp(map->real_name, RODATA_SEC) != 0) + return true; + return false; +} + +const char *bpf_map__name(const struct bpf_map *map) +{ + if (!map) + return NULL; + + if (map_uses_real_name(map)) + return map->real_name; + + return map->name; +} + +enum bpf_map_type bpf_map__type(const struct bpf_map *map) +{ + return map->def.type; +} + +int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->def.type = type; + return 0; +} + +__u32 bpf_map__map_flags(const struct bpf_map *map) +{ + return map->def.map_flags; +} + +int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->def.map_flags = flags; + return 0; +} + +__u64 bpf_map__map_extra(const struct bpf_map *map) +{ + return map->map_extra; +} + +int bpf_map__set_map_extra(struct bpf_map *map, __u64 map_extra) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->map_extra = map_extra; + return 0; +} + +__u32 bpf_map__numa_node(const struct bpf_map *map) +{ + return map->numa_node; +} + +int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->numa_node = numa_node; + return 0; +} + +__u32 bpf_map__key_size(const struct bpf_map *map) +{ + return map->def.key_size; +} + +int bpf_map__set_key_size(struct bpf_map *map, __u32 size) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->def.key_size = size; + return 0; +} + +__u32 bpf_map__value_size(const struct bpf_map *map) +{ + return map->def.value_size; +} + +int bpf_map__set_value_size(struct bpf_map *map, __u32 size) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->def.value_size = size; + return 0; +} + +__u32 bpf_map__btf_key_type_id(const struct bpf_map *map) +{ + return map ? map->btf_key_type_id : 0; +} + +__u32 bpf_map__btf_value_type_id(const struct bpf_map *map) +{ + return map ? map->btf_value_type_id : 0; +} + +int bpf_map__set_initial_value(struct bpf_map *map, + const void *data, size_t size) +{ + if (!map->mmaped || map->libbpf_type == LIBBPF_MAP_KCONFIG || + size != map->def.value_size || map->fd >= 0) + return libbpf_err(-EINVAL); + + memcpy(map->mmaped, data, size); + return 0; +} + +const void *bpf_map__initial_value(struct bpf_map *map, size_t *psize) +{ + if (!map->mmaped) + return NULL; + *psize = map->def.value_size; + return map->mmaped; +} + +bool bpf_map__is_internal(const struct bpf_map *map) +{ + return map->libbpf_type != LIBBPF_MAP_UNSPEC; +} + +__u32 bpf_map__ifindex(const struct bpf_map *map) +{ + return map->map_ifindex; +} + +int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->map_ifindex = ifindex; + return 0; +} + +int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd) +{ + if (!bpf_map_type__is_map_in_map(map->def.type)) { + pr_warn("error: unsupported map type\n"); + return libbpf_err(-EINVAL); + } + if (map->inner_map_fd != -1) { + pr_warn("error: inner_map_fd already specified\n"); + return libbpf_err(-EINVAL); + } + if (map->inner_map) { + bpf_map__destroy(map->inner_map); + zfree(&map->inner_map); + } + map->inner_map_fd = fd; + return 0; +} + +static struct bpf_map * +__bpf_map__iter(const struct bpf_map *m, const struct bpf_object *obj, int i) +{ + ssize_t idx; + struct bpf_map *s, *e; + + if (!obj || !obj->maps) + return errno = EINVAL, NULL; + + s = obj->maps; + e = obj->maps + obj->nr_maps; + + if ((m < s) || (m >= e)) { + pr_warn("error in %s: map handler doesn't belong to object\n", + __func__); + return errno = EINVAL, NULL; + } + + idx = (m - obj->maps) + i; + if (idx >= obj->nr_maps || idx < 0) + return NULL; + return &obj->maps[idx]; +} + +struct bpf_map * +bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *prev) +{ + if (prev == NULL) + return obj->maps; + + return __bpf_map__iter(prev, obj, 1); +} + +struct bpf_map * +bpf_object__prev_map(const struct bpf_object *obj, const struct bpf_map *next) +{ + if (next == NULL) { + if (!obj->nr_maps) + return NULL; + return obj->maps + obj->nr_maps - 1; + } + + return __bpf_map__iter(next, obj, -1); +} + +struct bpf_map * +bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name) +{ + struct bpf_map *pos; + + bpf_object__for_each_map(pos, obj) { + /* if it's a special internal map name (which always starts + * with dot) then check if that special name matches the + * real map name (ELF section name) + */ + if (name[0] == '.') { + if (pos->real_name && strcmp(pos->real_name, name) == 0) + return pos; + continue; + } + /* otherwise map name has to be an exact match */ + if (map_uses_real_name(pos)) { + if (strcmp(pos->real_name, name) == 0) + return pos; + continue; + } + if (strcmp(pos->name, name) == 0) + return pos; + } + return errno = ENOENT, NULL; +} + +int +bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name) +{ + return bpf_map__fd(bpf_object__find_map_by_name(obj, name)); +} + +static int validate_map_op(const struct bpf_map *map, size_t key_sz, + size_t value_sz, bool check_value_sz) +{ + if (map->fd <= 0) + return -ENOENT; + + if (map->def.key_size != key_sz) { + pr_warn("map '%s': unexpected key size %zu provided, expected %u\n", + map->name, key_sz, map->def.key_size); + return -EINVAL; + } + + if (!check_value_sz) + return 0; + + switch (map->def.type) { + case BPF_MAP_TYPE_PERCPU_ARRAY: + case BPF_MAP_TYPE_PERCPU_HASH: + case BPF_MAP_TYPE_LRU_PERCPU_HASH: + case BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: { + int num_cpu = libbpf_num_possible_cpus(); + size_t elem_sz = roundup(map->def.value_size, 8); + + if (value_sz != num_cpu * elem_sz) { + pr_warn("map '%s': unexpected value size %zu provided for per-CPU map, expected %d * %zu = %zd\n", + map->name, value_sz, num_cpu, elem_sz, num_cpu * elem_sz); + return -EINVAL; + } + break; + } + default: + if (map->def.value_size != value_sz) { + pr_warn("map '%s': unexpected value size %zu provided, expected %u\n", + map->name, value_sz, map->def.value_size); + return -EINVAL; + } + break; + } + return 0; +} + +int bpf_map__lookup_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags) +{ + int err; + + err = validate_map_op(map, key_sz, value_sz, true); + if (err) + return libbpf_err(err); + + return bpf_map_lookup_elem_flags(map->fd, key, value, flags); +} + +int bpf_map__update_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + const void *value, size_t value_sz, __u64 flags) +{ + int err; + + err = validate_map_op(map, key_sz, value_sz, true); + if (err) + return libbpf_err(err); + + return bpf_map_update_elem(map->fd, key, value, flags); +} + +int bpf_map__delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, __u64 flags) +{ + int err; + + err = validate_map_op(map, key_sz, 0, false /* check_value_sz */); + if (err) + return libbpf_err(err); + + return bpf_map_delete_elem_flags(map->fd, key, flags); +} + +int bpf_map__lookup_and_delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags) +{ + int err; + + err = validate_map_op(map, key_sz, value_sz, true); + if (err) + return libbpf_err(err); + + return bpf_map_lookup_and_delete_elem_flags(map->fd, key, value, flags); +} + +int bpf_map__get_next_key(const struct bpf_map *map, + const void *cur_key, void *next_key, size_t key_sz) +{ + int err; + + err = validate_map_op(map, key_sz, 0, false /* check_value_sz */); + if (err) + return libbpf_err(err); + + return bpf_map_get_next_key(map->fd, cur_key, next_key); +} + +long libbpf_get_error(const void *ptr) +{ + if (!IS_ERR_OR_NULL(ptr)) + return 0; + + if (IS_ERR(ptr)) + errno = -PTR_ERR(ptr); + + /* If ptr == NULL, then errno should be already set by the failing + * API, because libbpf never returns NULL on success and it now always + * sets errno on error. So no extra errno handling for ptr == NULL + * case. + */ + return -errno; +} + +/* Replace link's underlying BPF program with the new one */ +int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog) +{ + int ret; + + ret = bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL); + return libbpf_err_errno(ret); +} + +/* Release "ownership" of underlying BPF resource (typically, BPF program + * attached to some BPF hook, e.g., tracepoint, kprobe, etc). Disconnected + * link, when destructed through bpf_link__destroy() call won't attempt to + * detach/unregisted that BPF resource. This is useful in situations where, + * say, attached BPF program has to outlive userspace program that attached it + * in the system. Depending on type of BPF program, though, there might be + * additional steps (like pinning BPF program in BPF FS) necessary to ensure + * exit of userspace program doesn't trigger automatic detachment and clean up + * inside the kernel. + */ +void bpf_link__disconnect(struct bpf_link *link) +{ + link->disconnected = true; +} + +int bpf_link__destroy(struct bpf_link *link) +{ + int err = 0; + + if (IS_ERR_OR_NULL(link)) + return 0; + + if (!link->disconnected && link->detach) + err = link->detach(link); + if (link->pin_path) + free(link->pin_path); + if (link->dealloc) + link->dealloc(link); + else + free(link); + + return libbpf_err(err); +} + +int bpf_link__fd(const struct bpf_link *link) +{ + return link->fd; +} + +const char *bpf_link__pin_path(const struct bpf_link *link) +{ + return link->pin_path; +} + +static int bpf_link__detach_fd(struct bpf_link *link) +{ + return libbpf_err_errno(close(link->fd)); +} + +struct bpf_link *bpf_link__open(const char *path) +{ + struct bpf_link *link; + int fd; + + fd = bpf_obj_get(path); + if (fd < 0) { + fd = -errno; + pr_warn("failed to open link at %s: %d\n", path, fd); + return libbpf_err_ptr(fd); + } + + link = calloc(1, sizeof(*link)); + if (!link) { + close(fd); + return libbpf_err_ptr(-ENOMEM); + } + link->detach = &bpf_link__detach_fd; + link->fd = fd; + + link->pin_path = strdup(path); + if (!link->pin_path) { + bpf_link__destroy(link); + return libbpf_err_ptr(-ENOMEM); + } + + return link; +} + +int bpf_link__detach(struct bpf_link *link) +{ + return bpf_link_detach(link->fd) ? -errno : 0; +} + +int bpf_link__pin(struct bpf_link *link, const char *path) +{ + int err; + + if (link->pin_path) + return libbpf_err(-EBUSY); + err = make_parent_dir(path); + if (err) + return libbpf_err(err); + err = check_path(path); + if (err) + return libbpf_err(err); + + link->pin_path = strdup(path); + if (!link->pin_path) + return libbpf_err(-ENOMEM); + + if (bpf_obj_pin(link->fd, link->pin_path)) { + err = -errno; + zfree(&link->pin_path); + return libbpf_err(err); + } + + pr_debug("link fd=%d: pinned at %s\n", link->fd, link->pin_path); + return 0; +} + +int bpf_link__unpin(struct bpf_link *link) +{ + int err; + + if (!link->pin_path) + return libbpf_err(-EINVAL); + + err = unlink(link->pin_path); + if (err != 0) + return -errno; + + pr_debug("link fd=%d: unpinned from %s\n", link->fd, link->pin_path); + zfree(&link->pin_path); + return 0; +} + +struct bpf_link_perf { + struct bpf_link link; + int perf_event_fd; + /* legacy kprobe support: keep track of probe identifier and type */ + char *legacy_probe_name; + bool legacy_is_kprobe; + bool legacy_is_retprobe; +}; + +static int remove_kprobe_event_legacy(const char *probe_name, bool retprobe); +static int remove_uprobe_event_legacy(const char *probe_name, bool retprobe); + +static int bpf_link_perf_detach(struct bpf_link *link) +{ + struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link); + int err = 0; + + if (ioctl(perf_link->perf_event_fd, PERF_EVENT_IOC_DISABLE, 0) < 0) + err = -errno; + + if (perf_link->perf_event_fd != link->fd) + close(perf_link->perf_event_fd); + close(link->fd); + + /* legacy uprobe/kprobe needs to be removed after perf event fd closure */ + if (perf_link->legacy_probe_name) { + if (perf_link->legacy_is_kprobe) { + err = remove_kprobe_event_legacy(perf_link->legacy_probe_name, + perf_link->legacy_is_retprobe); + } else { + err = remove_uprobe_event_legacy(perf_link->legacy_probe_name, + perf_link->legacy_is_retprobe); + } + } + + return err; +} + +static void bpf_link_perf_dealloc(struct bpf_link *link) +{ + struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link); + + free(perf_link->legacy_probe_name); + free(perf_link); +} + +struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd, + const struct bpf_perf_event_opts *opts) +{ + char errmsg[STRERR_BUFSIZE]; + struct bpf_link_perf *link; + int prog_fd, link_fd = -1, err; + bool force_ioctl_attach; + + if (!OPTS_VALID(opts, bpf_perf_event_opts)) + return libbpf_err_ptr(-EINVAL); + + if (pfd < 0) { + pr_warn("prog '%s': invalid perf event FD %d\n", + prog->name, pfd); + return libbpf_err_ptr(-EINVAL); + } + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach BPF program w/o FD (did you load it?)\n", + prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->link.detach = &bpf_link_perf_detach; + link->link.dealloc = &bpf_link_perf_dealloc; + link->perf_event_fd = pfd; + + force_ioctl_attach = OPTS_GET(opts, force_ioctl_attach, false); + if (kernel_supports(prog->obj, FEAT_PERF_LINK) && !force_ioctl_attach) { + DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_opts, + .perf_event.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0)); + + link_fd = bpf_link_create(prog_fd, pfd, BPF_PERF_EVENT, &link_opts); + if (link_fd < 0) { + err = -errno; + pr_warn("prog '%s': failed to create BPF link for perf_event FD %d: %d (%s)\n", + prog->name, pfd, + err, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_out; + } + link->link.fd = link_fd; + } else { + if (OPTS_GET(opts, bpf_cookie, 0)) { + pr_warn("prog '%s': user context value is not supported\n", prog->name); + err = -EOPNOTSUPP; + goto err_out; + } + + if (ioctl(pfd, PERF_EVENT_IOC_SET_BPF, prog_fd) < 0) { + err = -errno; + pr_warn("prog '%s': failed to attach to perf_event FD %d: %s\n", + prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + if (err == -EPROTO) + pr_warn("prog '%s': try add PERF_SAMPLE_CALLCHAIN to or remove exclude_callchain_[kernel|user] from pfd %d\n", + prog->name, pfd); + goto err_out; + } + link->link.fd = pfd; + } + if (ioctl(pfd, PERF_EVENT_IOC_ENABLE, 0) < 0) { + err = -errno; + pr_warn("prog '%s': failed to enable perf_event FD %d: %s\n", + prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_out; + } + + return &link->link; +err_out: + if (link_fd >= 0) + close(link_fd); + free(link); + return libbpf_err_ptr(err); +} + +struct bpf_link *bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd) +{ + return bpf_program__attach_perf_event_opts(prog, pfd, NULL); +} + +/* + * this function is expected to parse integer in the range of [0, 2^31-1] from + * given file using scanf format string fmt. If actual parsed value is + * negative, the result might be indistinguishable from error + */ +static int parse_uint_from_file(const char *file, const char *fmt) +{ + char buf[STRERR_BUFSIZE]; + int err, ret; + FILE *f; + + f = fopen(file, "r"); + if (!f) { + err = -errno; + pr_debug("failed to open '%s': %s\n", file, + libbpf_strerror_r(err, buf, sizeof(buf))); + return err; + } + err = fscanf(f, fmt, &ret); + if (err != 1) { + err = err == EOF ? -EIO : -errno; + pr_debug("failed to parse '%s': %s\n", file, + libbpf_strerror_r(err, buf, sizeof(buf))); + fclose(f); + return err; + } + fclose(f); + return ret; +} + +static int determine_kprobe_perf_type(void) +{ + const char *file = "/sys/bus/event_source/devices/kprobe/type"; + + return parse_uint_from_file(file, "%d\n"); +} + +static int determine_uprobe_perf_type(void) +{ + const char *file = "/sys/bus/event_source/devices/uprobe/type"; + + return parse_uint_from_file(file, "%d\n"); +} + +static int determine_kprobe_retprobe_bit(void) +{ + const char *file = "/sys/bus/event_source/devices/kprobe/format/retprobe"; + + return parse_uint_from_file(file, "config:%d\n"); +} + +static int determine_uprobe_retprobe_bit(void) +{ + const char *file = "/sys/bus/event_source/devices/uprobe/format/retprobe"; + + return parse_uint_from_file(file, "config:%d\n"); +} + +#define PERF_UPROBE_REF_CTR_OFFSET_BITS 32 +#define PERF_UPROBE_REF_CTR_OFFSET_SHIFT 32 + +static int perf_event_open_probe(bool uprobe, bool retprobe, const char *name, + uint64_t offset, int pid, size_t ref_ctr_off) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_event_attr attr; + char errmsg[STRERR_BUFSIZE]; + int type, pfd; + + if ((__u64)ref_ctr_off >= (1ULL << PERF_UPROBE_REF_CTR_OFFSET_BITS)) + return -EINVAL; + + memset(&attr, 0, attr_sz); + + type = uprobe ? determine_uprobe_perf_type() + : determine_kprobe_perf_type(); + if (type < 0) { + pr_warn("failed to determine %s perf type: %s\n", + uprobe ? "uprobe" : "kprobe", + libbpf_strerror_r(type, errmsg, sizeof(errmsg))); + return type; + } + if (retprobe) { + int bit = uprobe ? determine_uprobe_retprobe_bit() + : determine_kprobe_retprobe_bit(); + + if (bit < 0) { + pr_warn("failed to determine %s retprobe bit: %s\n", + uprobe ? "uprobe" : "kprobe", + libbpf_strerror_r(bit, errmsg, sizeof(errmsg))); + return bit; + } + attr.config |= 1 << bit; + } + attr.size = attr_sz; + attr.type = type; + attr.config |= (__u64)ref_ctr_off << PERF_UPROBE_REF_CTR_OFFSET_SHIFT; + attr.config1 = ptr_to_u64(name); /* kprobe_func or uprobe_path */ + attr.config2 = offset; /* kprobe_addr or probe_offset */ + + /* pid filter is meaningful only for uprobes */ + pfd = syscall(__NR_perf_event_open, &attr, + pid < 0 ? -1 : pid /* pid */, + pid == -1 ? 0 : -1 /* cpu */, + -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC); + return pfd >= 0 ? pfd : -errno; +} + +static int append_to_file(const char *file, const char *fmt, ...) +{ + int fd, n, err = 0; + va_list ap; + char buf[1024]; + + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + + if (n < 0 || n >= sizeof(buf)) + return -EINVAL; + + fd = open(file, O_WRONLY | O_APPEND | O_CLOEXEC, 0); + if (fd < 0) + return -errno; + + if (write(fd, buf, n) < 0) + err = -errno; + + close(fd); + return err; +} + +#define DEBUGFS "/sys/kernel/debug/tracing" +#define TRACEFS "/sys/kernel/tracing" + +static bool use_debugfs(void) +{ + static int has_debugfs = -1; + + if (has_debugfs < 0) + has_debugfs = faccessat(AT_FDCWD, DEBUGFS, F_OK, AT_EACCESS) == 0; + + return has_debugfs == 1; +} + +static const char *tracefs_path(void) +{ + return use_debugfs() ? DEBUGFS : TRACEFS; +} + +static const char *tracefs_kprobe_events(void) +{ + return use_debugfs() ? DEBUGFS"/kprobe_events" : TRACEFS"/kprobe_events"; +} + +static const char *tracefs_uprobe_events(void) +{ + return use_debugfs() ? DEBUGFS"/uprobe_events" : TRACEFS"/uprobe_events"; +} + +static void gen_kprobe_legacy_event_name(char *buf, size_t buf_sz, + const char *kfunc_name, size_t offset) +{ + static int index = 0; + int i; + + snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx_%d", getpid(), kfunc_name, offset, + __sync_fetch_and_add(&index, 1)); + + /* sanitize binary_path in the probe name */ + for (i = 0; buf[i]; i++) { + if (!isalnum(buf[i])) + buf[i] = '_'; + } +} + +static int add_kprobe_event_legacy(const char *probe_name, bool retprobe, + const char *kfunc_name, size_t offset) +{ + return append_to_file(tracefs_kprobe_events(), "%c:%s/%s %s+0x%zx", + retprobe ? 'r' : 'p', + retprobe ? "kretprobes" : "kprobes", + probe_name, kfunc_name, offset); +} + +static int remove_kprobe_event_legacy(const char *probe_name, bool retprobe) +{ + return append_to_file(tracefs_kprobe_events(), "-:%s/%s", + retprobe ? "kretprobes" : "kprobes", probe_name); +} + +static int determine_kprobe_perf_type_legacy(const char *probe_name, bool retprobe) +{ + char file[256]; + + snprintf(file, sizeof(file), "%s/events/%s/%s/id", + tracefs_path(), retprobe ? "kretprobes" : "kprobes", probe_name); + + return parse_uint_from_file(file, "%d\n"); +} + +static int perf_event_kprobe_open_legacy(const char *probe_name, bool retprobe, + const char *kfunc_name, size_t offset, int pid) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_event_attr attr; + char errmsg[STRERR_BUFSIZE]; + int type, pfd, err; + + err = add_kprobe_event_legacy(probe_name, retprobe, kfunc_name, offset); + if (err < 0) { + pr_warn("failed to add legacy kprobe event for '%s+0x%zx': %s\n", + kfunc_name, offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + return err; + } + type = determine_kprobe_perf_type_legacy(probe_name, retprobe); + if (type < 0) { + err = type; + pr_warn("failed to determine legacy kprobe event id for '%s+0x%zx': %s\n", + kfunc_name, offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_clean_legacy; + } + + memset(&attr, 0, attr_sz); + attr.size = attr_sz; + attr.config = type; + attr.type = PERF_TYPE_TRACEPOINT; + + pfd = syscall(__NR_perf_event_open, &attr, + pid < 0 ? -1 : pid, /* pid */ + pid == -1 ? 0 : -1, /* cpu */ + -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC); + if (pfd < 0) { + err = -errno; + pr_warn("legacy kprobe perf_event_open() failed: %s\n", + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_clean_legacy; + } + return pfd; + +err_clean_legacy: + /* Clear the newly added legacy kprobe_event */ + remove_kprobe_event_legacy(probe_name, retprobe); + return err; +} + +static const char *arch_specific_syscall_pfx(void) +{ +#if defined(__x86_64__) + return "x64"; +#elif defined(__i386__) + return "ia32"; +#elif defined(__s390x__) + return "s390x"; +#elif defined(__s390__) + return "s390"; +#elif defined(__arm__) + return "arm"; +#elif defined(__aarch64__) + return "arm64"; +#elif defined(__mips__) + return "mips"; +#elif defined(__riscv) + return "riscv"; +#elif defined(__powerpc__) + return "powerpc"; +#elif defined(__powerpc64__) + return "powerpc64"; +#else + return NULL; +#endif +} + +static int probe_kern_syscall_wrapper(void) +{ + char syscall_name[64]; + const char *ksys_pfx; + + ksys_pfx = arch_specific_syscall_pfx(); + if (!ksys_pfx) + return 0; + + snprintf(syscall_name, sizeof(syscall_name), "__%s_sys_bpf", ksys_pfx); + + if (determine_kprobe_perf_type() >= 0) { + int pfd; + + pfd = perf_event_open_probe(false, false, syscall_name, 0, getpid(), 0); + if (pfd >= 0) + close(pfd); + + return pfd >= 0 ? 1 : 0; + } else { /* legacy mode */ + char probe_name[128]; + + gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), syscall_name, 0); + if (add_kprobe_event_legacy(probe_name, false, syscall_name, 0) < 0) + return 0; + + (void)remove_kprobe_event_legacy(probe_name, false); + return 1; + } +} + +struct bpf_link * +bpf_program__attach_kprobe_opts(const struct bpf_program *prog, + const char *func_name, + const struct bpf_kprobe_opts *opts) +{ + DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts); + enum probe_attach_mode attach_mode; + char errmsg[STRERR_BUFSIZE]; + char *legacy_probe = NULL; + struct bpf_link *link; + size_t offset; + bool retprobe, legacy; + int pfd, err; + + if (!OPTS_VALID(opts, bpf_kprobe_opts)) + return libbpf_err_ptr(-EINVAL); + + attach_mode = OPTS_GET(opts, attach_mode, PROBE_ATTACH_MODE_DEFAULT); + retprobe = OPTS_GET(opts, retprobe, false); + offset = OPTS_GET(opts, offset, 0); + pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + + legacy = determine_kprobe_perf_type() < 0; + switch (attach_mode) { + case PROBE_ATTACH_MODE_LEGACY: + legacy = true; + pe_opts.force_ioctl_attach = true; + break; + case PROBE_ATTACH_MODE_PERF: + if (legacy) + return libbpf_err_ptr(-ENOTSUP); + pe_opts.force_ioctl_attach = true; + break; + case PROBE_ATTACH_MODE_LINK: + if (legacy || !kernel_supports(prog->obj, FEAT_PERF_LINK)) + return libbpf_err_ptr(-ENOTSUP); + break; + case PROBE_ATTACH_MODE_DEFAULT: + break; + default: + return libbpf_err_ptr(-EINVAL); + } + + if (!legacy) { + pfd = perf_event_open_probe(false /* uprobe */, retprobe, + func_name, offset, + -1 /* pid */, 0 /* ref_ctr_off */); + } else { + char probe_name[256]; + + gen_kprobe_legacy_event_name(probe_name, sizeof(probe_name), + func_name, offset); + + legacy_probe = strdup(probe_name); + if (!legacy_probe) + return libbpf_err_ptr(-ENOMEM); + + pfd = perf_event_kprobe_open_legacy(legacy_probe, retprobe, func_name, + offset, -1 /* pid */); + } + if (pfd < 0) { + err = -errno; + pr_warn("prog '%s': failed to create %s '%s+0x%zx' perf event: %s\n", + prog->name, retprobe ? "kretprobe" : "kprobe", + func_name, offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_out; + } + link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); + err = libbpf_get_error(link); + if (err) { + close(pfd); + pr_warn("prog '%s': failed to attach to %s '%s+0x%zx': %s\n", + prog->name, retprobe ? "kretprobe" : "kprobe", + func_name, offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_clean_legacy; + } + if (legacy) { + struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link); + + perf_link->legacy_probe_name = legacy_probe; + perf_link->legacy_is_kprobe = true; + perf_link->legacy_is_retprobe = retprobe; + } + + return link; + +err_clean_legacy: + if (legacy) + remove_kprobe_event_legacy(legacy_probe, retprobe); +err_out: + free(legacy_probe); + return libbpf_err_ptr(err); +} + +struct bpf_link *bpf_program__attach_kprobe(const struct bpf_program *prog, + bool retprobe, + const char *func_name) +{ + DECLARE_LIBBPF_OPTS(bpf_kprobe_opts, opts, + .retprobe = retprobe, + ); + + return bpf_program__attach_kprobe_opts(prog, func_name, &opts); +} + +struct bpf_link *bpf_program__attach_ksyscall(const struct bpf_program *prog, + const char *syscall_name, + const struct bpf_ksyscall_opts *opts) +{ + LIBBPF_OPTS(bpf_kprobe_opts, kprobe_opts); + char func_name[128]; + + if (!OPTS_VALID(opts, bpf_ksyscall_opts)) + return libbpf_err_ptr(-EINVAL); + + if (kernel_supports(prog->obj, FEAT_SYSCALL_WRAPPER)) { + /* arch_specific_syscall_pfx() should never return NULL here + * because it is guarded by kernel_supports(). However, since + * compiler does not know that we have an explicit conditional + * as well. + */ + snprintf(func_name, sizeof(func_name), "__%s_sys_%s", + arch_specific_syscall_pfx() ? : "", syscall_name); + } else { + snprintf(func_name, sizeof(func_name), "__se_sys_%s", syscall_name); + } + + kprobe_opts.retprobe = OPTS_GET(opts, retprobe, false); + kprobe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + + return bpf_program__attach_kprobe_opts(prog, func_name, &kprobe_opts); +} + +/* Adapted from perf/util/string.c */ +static bool glob_match(const char *str, const char *pat) +{ + while (*str && *pat && *pat != '*') { + if (*pat == '?') { /* Matches any single character */ + str++; + pat++; + continue; + } + if (*str != *pat) + return false; + str++; + pat++; + } + /* Check wild card */ + if (*pat == '*') { + while (*pat == '*') + pat++; + if (!*pat) /* Tail wild card matches all */ + return true; + while (*str) + if (glob_match(str++, pat)) + return true; + } + return !*str && !*pat; +} + +struct kprobe_multi_resolve { + const char *pattern; + unsigned long *addrs; + size_t cap; + size_t cnt; +}; + +static int +resolve_kprobe_multi_cb(unsigned long long sym_addr, char sym_type, + const char *sym_name, void *ctx) +{ + struct kprobe_multi_resolve *res = ctx; + int err; + + if (!glob_match(sym_name, res->pattern)) + return 0; + + err = libbpf_ensure_mem((void **) &res->addrs, &res->cap, sizeof(unsigned long), + res->cnt + 1); + if (err) + return err; + + res->addrs[res->cnt++] = (unsigned long) sym_addr; + return 0; +} + +struct bpf_link * +bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, + const char *pattern, + const struct bpf_kprobe_multi_opts *opts) +{ + LIBBPF_OPTS(bpf_link_create_opts, lopts); + struct kprobe_multi_resolve res = { + .pattern = pattern, + }; + struct bpf_link *link = NULL; + char errmsg[STRERR_BUFSIZE]; + const unsigned long *addrs; + int err, link_fd, prog_fd; + const __u64 *cookies; + const char **syms; + bool retprobe; + size_t cnt; + + if (!OPTS_VALID(opts, bpf_kprobe_multi_opts)) + return libbpf_err_ptr(-EINVAL); + + syms = OPTS_GET(opts, syms, false); + addrs = OPTS_GET(opts, addrs, false); + cnt = OPTS_GET(opts, cnt, false); + cookies = OPTS_GET(opts, cookies, false); + + if (!pattern && !addrs && !syms) + return libbpf_err_ptr(-EINVAL); + if (pattern && (addrs || syms || cookies || cnt)) + return libbpf_err_ptr(-EINVAL); + if (!pattern && !cnt) + return libbpf_err_ptr(-EINVAL); + if (addrs && syms) + return libbpf_err_ptr(-EINVAL); + + if (pattern) { + err = libbpf_kallsyms_parse(resolve_kprobe_multi_cb, &res); + if (err) + goto error; + if (!res.cnt) { + err = -ENOENT; + goto error; + } + addrs = res.addrs; + cnt = res.cnt; + } + + retprobe = OPTS_GET(opts, retprobe, false); + + lopts.kprobe_multi.syms = syms; + lopts.kprobe_multi.addrs = addrs; + lopts.kprobe_multi.cookies = cookies; + lopts.kprobe_multi.cnt = cnt; + lopts.kprobe_multi.flags = retprobe ? BPF_F_KPROBE_MULTI_RETURN : 0; + + link = calloc(1, sizeof(*link)); + if (!link) { + err = -ENOMEM; + goto error; + } + link->detach = &bpf_link__detach_fd; + + prog_fd = bpf_program__fd(prog); + link_fd = bpf_link_create(prog_fd, 0, BPF_TRACE_KPROBE_MULTI, &lopts); + if (link_fd < 0) { + err = -errno; + pr_warn("prog '%s': failed to attach: %s\n", + prog->name, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto error; + } + link->fd = link_fd; + free(res.addrs); + return link; + +error: + free(link); + free(res.addrs); + return libbpf_err_ptr(err); +} + +static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + DECLARE_LIBBPF_OPTS(bpf_kprobe_opts, opts); + unsigned long offset = 0; + const char *func_name; + char *func; + int n; + + *link = NULL; + + /* no auto-attach for SEC("kprobe") and SEC("kretprobe") */ + if (strcmp(prog->sec_name, "kprobe") == 0 || strcmp(prog->sec_name, "kretprobe") == 0) + return 0; + + opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe/"); + if (opts.retprobe) + func_name = prog->sec_name + sizeof("kretprobe/") - 1; + else + func_name = prog->sec_name + sizeof("kprobe/") - 1; + + n = sscanf(func_name, "%m[a-zA-Z0-9_.]+%li", &func, &offset); + if (n < 1) { + pr_warn("kprobe name is invalid: %s\n", func_name); + return -EINVAL; + } + if (opts.retprobe && offset != 0) { + free(func); + pr_warn("kretprobes do not support offset specification\n"); + return -EINVAL; + } + + opts.offset = offset; + *link = bpf_program__attach_kprobe_opts(prog, func, &opts); + free(func); + return libbpf_get_error(*link); +} + +static int attach_ksyscall(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + LIBBPF_OPTS(bpf_ksyscall_opts, opts); + const char *syscall_name; + + *link = NULL; + + /* no auto-attach for SEC("ksyscall") and SEC("kretsyscall") */ + if (strcmp(prog->sec_name, "ksyscall") == 0 || strcmp(prog->sec_name, "kretsyscall") == 0) + return 0; + + opts.retprobe = str_has_pfx(prog->sec_name, "kretsyscall/"); + if (opts.retprobe) + syscall_name = prog->sec_name + sizeof("kretsyscall/") - 1; + else + syscall_name = prog->sec_name + sizeof("ksyscall/") - 1; + + *link = bpf_program__attach_ksyscall(prog, syscall_name, &opts); + return *link ? 0 : -errno; +} + +static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + LIBBPF_OPTS(bpf_kprobe_multi_opts, opts); + const char *spec; + char *pattern; + int n; + + *link = NULL; + + /* no auto-attach for SEC("kprobe.multi") and SEC("kretprobe.multi") */ + if (strcmp(prog->sec_name, "kprobe.multi") == 0 || + strcmp(prog->sec_name, "kretprobe.multi") == 0) + return 0; + + opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe.multi/"); + if (opts.retprobe) + spec = prog->sec_name + sizeof("kretprobe.multi/") - 1; + else + spec = prog->sec_name + sizeof("kprobe.multi/") - 1; + + n = sscanf(spec, "%m[a-zA-Z0-9_.*?]", &pattern); + if (n < 1) { + pr_warn("kprobe multi pattern is invalid: %s\n", pattern); + return -EINVAL; + } + + *link = bpf_program__attach_kprobe_multi_opts(prog, pattern, &opts); + free(pattern); + return libbpf_get_error(*link); +} + +static void gen_uprobe_legacy_event_name(char *buf, size_t buf_sz, + const char *binary_path, uint64_t offset) +{ + int i; + + snprintf(buf, buf_sz, "libbpf_%u_%s_0x%zx", getpid(), binary_path, (size_t)offset); + + /* sanitize binary_path in the probe name */ + for (i = 0; buf[i]; i++) { + if (!isalnum(buf[i])) + buf[i] = '_'; + } +} + +static inline int add_uprobe_event_legacy(const char *probe_name, bool retprobe, + const char *binary_path, size_t offset) +{ + return append_to_file(tracefs_uprobe_events(), "%c:%s/%s %s:0x%zx", + retprobe ? 'r' : 'p', + retprobe ? "uretprobes" : "uprobes", + probe_name, binary_path, offset); +} + +static inline int remove_uprobe_event_legacy(const char *probe_name, bool retprobe) +{ + return append_to_file(tracefs_uprobe_events(), "-:%s/%s", + retprobe ? "uretprobes" : "uprobes", probe_name); +} + +static int determine_uprobe_perf_type_legacy(const char *probe_name, bool retprobe) +{ + char file[512]; + + snprintf(file, sizeof(file), "%s/events/%s/%s/id", + tracefs_path(), retprobe ? "uretprobes" : "uprobes", probe_name); + + return parse_uint_from_file(file, "%d\n"); +} + +static int perf_event_uprobe_open_legacy(const char *probe_name, bool retprobe, + const char *binary_path, size_t offset, int pid) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_event_attr attr; + int type, pfd, err; + + err = add_uprobe_event_legacy(probe_name, retprobe, binary_path, offset); + if (err < 0) { + pr_warn("failed to add legacy uprobe event for %s:0x%zx: %d\n", + binary_path, (size_t)offset, err); + return err; + } + type = determine_uprobe_perf_type_legacy(probe_name, retprobe); + if (type < 0) { + err = type; + pr_warn("failed to determine legacy uprobe event id for %s:0x%zx: %d\n", + binary_path, offset, err); + goto err_clean_legacy; + } + + memset(&attr, 0, attr_sz); + attr.size = attr_sz; + attr.config = type; + attr.type = PERF_TYPE_TRACEPOINT; + + pfd = syscall(__NR_perf_event_open, &attr, + pid < 0 ? -1 : pid, /* pid */ + pid == -1 ? 0 : -1, /* cpu */ + -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC); + if (pfd < 0) { + err = -errno; + pr_warn("legacy uprobe perf_event_open() failed: %d\n", err); + goto err_clean_legacy; + } + return pfd; + +err_clean_legacy: + /* Clear the newly added legacy uprobe_event */ + remove_uprobe_event_legacy(probe_name, retprobe); + return err; +} + +/* Return next ELF section of sh_type after scn, or first of that type if scn is NULL. */ +static Elf_Scn *elf_find_next_scn_by_type(Elf *elf, int sh_type, Elf_Scn *scn) +{ + while ((scn = elf_nextscn(elf, scn)) != NULL) { + GElf_Shdr sh; + + if (!gelf_getshdr(scn, &sh)) + continue; + if (sh.sh_type == sh_type) + return scn; + } + return NULL; +} + +/* Find offset of function name in the provided ELF object. "binary_path" is + * the path to the ELF binary represented by "elf", and only used for error + * reporting matters. "name" matches symbol name or name@@LIB for library + * functions. + */ +static long elf_find_func_offset(Elf *elf, const char *binary_path, const char *name) +{ + int i, sh_types[2] = { SHT_DYNSYM, SHT_SYMTAB }; + bool is_shared_lib, is_name_qualified; + long ret = -ENOENT; + size_t name_len; + GElf_Ehdr ehdr; + + if (!gelf_getehdr(elf, &ehdr)) { + pr_warn("elf: failed to get ehdr from %s: %s\n", binary_path, elf_errmsg(-1)); + ret = -LIBBPF_ERRNO__FORMAT; + goto out; + } + /* for shared lib case, we do not need to calculate relative offset */ + is_shared_lib = ehdr.e_type == ET_DYN; + + name_len = strlen(name); + /* Does name specify "@@LIB"? */ + is_name_qualified = strstr(name, "@@") != NULL; + + /* Search SHT_DYNSYM, SHT_SYMTAB for symbol. This search order is used because if + * a binary is stripped, it may only have SHT_DYNSYM, and a fully-statically + * linked binary may not have SHT_DYMSYM, so absence of a section should not be + * reported as a warning/error. + */ + for (i = 0; i < ARRAY_SIZE(sh_types); i++) { + size_t nr_syms, strtabidx, idx; + Elf_Data *symbols = NULL; + Elf_Scn *scn = NULL; + int last_bind = -1; + const char *sname; + GElf_Shdr sh; + + scn = elf_find_next_scn_by_type(elf, sh_types[i], NULL); + if (!scn) { + pr_debug("elf: failed to find symbol table ELF sections in '%s'\n", + binary_path); + continue; + } + if (!gelf_getshdr(scn, &sh)) + continue; + strtabidx = sh.sh_link; + symbols = elf_getdata(scn, 0); + if (!symbols) { + pr_warn("elf: failed to get symbols for symtab section in '%s': %s\n", + binary_path, elf_errmsg(-1)); + ret = -LIBBPF_ERRNO__FORMAT; + goto out; + } + nr_syms = symbols->d_size / sh.sh_entsize; + + for (idx = 0; idx < nr_syms; idx++) { + int curr_bind; + GElf_Sym sym; + Elf_Scn *sym_scn; + GElf_Shdr sym_sh; + + if (!gelf_getsym(symbols, idx, &sym)) + continue; + + if (GELF_ST_TYPE(sym.st_info) != STT_FUNC) + continue; + + sname = elf_strptr(elf, strtabidx, sym.st_name); + if (!sname) + continue; + + curr_bind = GELF_ST_BIND(sym.st_info); + + /* User can specify func, func@@LIB or func@@LIB_VERSION. */ + if (strncmp(sname, name, name_len) != 0) + continue; + /* ...but we don't want a search for "foo" to match 'foo2" also, so any + * additional characters in sname should be of the form "@@LIB". + */ + if (!is_name_qualified && sname[name_len] != '\0' && sname[name_len] != '@') + continue; + + if (ret >= 0) { + /* handle multiple matches */ + if (last_bind != STB_WEAK && curr_bind != STB_WEAK) { + /* Only accept one non-weak bind. */ + pr_warn("elf: ambiguous match for '%s', '%s' in '%s'\n", + sname, name, binary_path); + ret = -LIBBPF_ERRNO__FORMAT; + goto out; + } else if (curr_bind == STB_WEAK) { + /* already have a non-weak bind, and + * this is a weak bind, so ignore. + */ + continue; + } + } + + /* Transform symbol's virtual address (absolute for + * binaries and relative for shared libs) into file + * offset, which is what kernel is expecting for + * uprobe/uretprobe attachment. + * See Documentation/trace/uprobetracer.rst for more + * details. + * This is done by looking up symbol's containing + * section's header and using it's virtual address + * (sh_addr) and corresponding file offset (sh_offset) + * to transform sym.st_value (virtual address) into + * desired final file offset. + */ + sym_scn = elf_getscn(elf, sym.st_shndx); + if (!sym_scn) + continue; + if (!gelf_getshdr(sym_scn, &sym_sh)) + continue; + + ret = sym.st_value - sym_sh.sh_addr + sym_sh.sh_offset; + last_bind = curr_bind; + } + if (ret > 0) + break; + } + + if (ret > 0) { + pr_debug("elf: symbol address match for '%s' in '%s': 0x%lx\n", name, binary_path, + ret); + } else { + if (ret == 0) { + pr_warn("elf: '%s' is 0 in symtab for '%s': %s\n", name, binary_path, + is_shared_lib ? "should not be 0 in a shared library" : + "try using shared library path instead"); + ret = -ENOENT; + } else { + pr_warn("elf: failed to find symbol '%s' in '%s'\n", name, binary_path); + } + } +out: + return ret; +} + +/* Find offset of function name in ELF object specified by path. "name" matches + * symbol name or name@@LIB for library functions. + */ +static long elf_find_func_offset_from_file(const char *binary_path, const char *name) +{ + char errmsg[STRERR_BUFSIZE]; + long ret = -ENOENT; + Elf *elf; + int fd; + + fd = open(binary_path, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + ret = -errno; + pr_warn("failed to open %s: %s\n", binary_path, + libbpf_strerror_r(ret, errmsg, sizeof(errmsg))); + return ret; + } + elf = elf_begin(fd, ELF_C_READ_MMAP, NULL); + if (!elf) { + pr_warn("elf: could not read elf from %s: %s\n", binary_path, elf_errmsg(-1)); + close(fd); + return -LIBBPF_ERRNO__FORMAT; + } + + ret = elf_find_func_offset(elf, binary_path, name); + elf_end(elf); + close(fd); + return ret; +} + +/* Find offset of function name in archive specified by path. Currently + * supported are .zip files that do not compress their contents, as used on + * Android in the form of APKs, for example. "file_name" is the name of the ELF + * file inside the archive. "func_name" matches symbol name or name@@LIB for + * library functions. + * + * An overview of the APK format specifically provided here: + * https://en.wikipedia.org/w/index.php?title=Apk_(file_format)&oldid=1139099120#Package_contents + */ +static long elf_find_func_offset_from_archive(const char *archive_path, const char *file_name, + const char *func_name) +{ + struct zip_archive *archive; + struct zip_entry entry; + long ret; + Elf *elf; + + archive = zip_archive_open(archive_path); + if (IS_ERR(archive)) { + ret = PTR_ERR(archive); + pr_warn("zip: failed to open %s: %ld\n", archive_path, ret); + return ret; + } + + ret = zip_archive_find_entry(archive, file_name, &entry); + if (ret) { + pr_warn("zip: could not find archive member %s in %s: %ld\n", file_name, + archive_path, ret); + goto out; + } + pr_debug("zip: found entry for %s in %s at 0x%lx\n", file_name, archive_path, + (unsigned long)entry.data_offset); + + if (entry.compression) { + pr_warn("zip: entry %s of %s is compressed and cannot be handled\n", file_name, + archive_path); + ret = -LIBBPF_ERRNO__FORMAT; + goto out; + } + + elf = elf_memory((void *)entry.data, entry.data_length); + if (!elf) { + pr_warn("elf: could not read elf file %s from %s: %s\n", file_name, archive_path, + elf_errmsg(-1)); + ret = -LIBBPF_ERRNO__LIBELF; + goto out; + } + + ret = elf_find_func_offset(elf, file_name, func_name); + if (ret > 0) { + pr_debug("elf: symbol address match for %s of %s in %s: 0x%x + 0x%lx = 0x%lx\n", + func_name, file_name, archive_path, entry.data_offset, ret, + ret + entry.data_offset); + ret += entry.data_offset; + } + elf_end(elf); + +out: + zip_archive_close(archive); + return ret; +} + +static const char *arch_specific_lib_paths(void) +{ + /* + * Based on https://packages.debian.org/sid/libc6. + * + * Assume that the traced program is built for the same architecture + * as libbpf, which should cover the vast majority of cases. + */ +#if defined(__x86_64__) + return "/lib/x86_64-linux-gnu"; +#elif defined(__i386__) + return "/lib/i386-linux-gnu"; +#elif defined(__s390x__) + return "/lib/s390x-linux-gnu"; +#elif defined(__s390__) + return "/lib/s390-linux-gnu"; +#elif defined(__arm__) && defined(__SOFTFP__) + return "/lib/arm-linux-gnueabi"; +#elif defined(__arm__) && !defined(__SOFTFP__) + return "/lib/arm-linux-gnueabihf"; +#elif defined(__aarch64__) + return "/lib/aarch64-linux-gnu"; +#elif defined(__mips__) && defined(__MIPSEL__) && _MIPS_SZLONG == 64 + return "/lib/mips64el-linux-gnuabi64"; +#elif defined(__mips__) && defined(__MIPSEL__) && _MIPS_SZLONG == 32 + return "/lib/mipsel-linux-gnu"; +#elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return "/lib/powerpc64le-linux-gnu"; +#elif defined(__sparc__) && defined(__arch64__) + return "/lib/sparc64-linux-gnu"; +#elif defined(__riscv) && __riscv_xlen == 64 + return "/lib/riscv64-linux-gnu"; +#else + return NULL; +#endif +} + +/* Get full path to program/shared library. */ +static int resolve_full_path(const char *file, char *result, size_t result_sz) +{ + const char *search_paths[3] = {}; + int i, perm; + + if (str_has_sfx(file, ".so") || strstr(file, ".so.")) { + search_paths[0] = getenv("LD_LIBRARY_PATH"); + search_paths[1] = "/usr/lib64:/usr/lib"; + search_paths[2] = arch_specific_lib_paths(); + perm = R_OK; + } else { + search_paths[0] = getenv("PATH"); + search_paths[1] = "/usr/bin:/usr/sbin"; + perm = R_OK | X_OK; + } + + for (i = 0; i < ARRAY_SIZE(search_paths); i++) { + const char *s; + + if (!search_paths[i]) + continue; + for (s = search_paths[i]; s != NULL; s = strchr(s, ':')) { + char *next_path; + int seg_len; + + if (s[0] == ':') + s++; + next_path = strchr(s, ':'); + seg_len = next_path ? next_path - s : strlen(s); + if (!seg_len) + continue; + snprintf(result, result_sz, "%.*s/%s", seg_len, s, file); + /* ensure it has required permissions */ + if (faccessat(AT_FDCWD, result, perm, AT_EACCESS) < 0) + continue; + pr_debug("resolved '%s' to '%s'\n", file, result); + return 0; + } + } + return -ENOENT; +} + +LIBBPF_API struct bpf_link * +bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, + const char *binary_path, size_t func_offset, + const struct bpf_uprobe_opts *opts) +{ + const char *archive_path = NULL, *archive_sep = NULL; + char errmsg[STRERR_BUFSIZE], *legacy_probe = NULL; + DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts); + enum probe_attach_mode attach_mode; + char full_path[PATH_MAX]; + struct bpf_link *link; + size_t ref_ctr_off; + int pfd, err; + bool retprobe, legacy; + const char *func_name; + + if (!OPTS_VALID(opts, bpf_uprobe_opts)) + return libbpf_err_ptr(-EINVAL); + + attach_mode = OPTS_GET(opts, attach_mode, PROBE_ATTACH_MODE_DEFAULT); + retprobe = OPTS_GET(opts, retprobe, false); + ref_ctr_off = OPTS_GET(opts, ref_ctr_offset, 0); + pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + + if (!binary_path) + return libbpf_err_ptr(-EINVAL); + + /* Check if "binary_path" refers to an archive. */ + archive_sep = strstr(binary_path, "!/"); + if (archive_sep) { + full_path[0] = '\0'; + libbpf_strlcpy(full_path, binary_path, + min(sizeof(full_path), (size_t)(archive_sep - binary_path + 1))); + archive_path = full_path; + binary_path = archive_sep + 2; + } else if (!strchr(binary_path, '/')) { + err = resolve_full_path(binary_path, full_path, sizeof(full_path)); + if (err) { + pr_warn("prog '%s': failed to resolve full path for '%s': %d\n", + prog->name, binary_path, err); + return libbpf_err_ptr(err); + } + binary_path = full_path; + } + func_name = OPTS_GET(opts, func_name, NULL); + if (func_name) { + long sym_off; + + if (archive_path) { + sym_off = elf_find_func_offset_from_archive(archive_path, binary_path, + func_name); + binary_path = archive_path; + } else { + sym_off = elf_find_func_offset_from_file(binary_path, func_name); + } + if (sym_off < 0) + return libbpf_err_ptr(sym_off); + func_offset += sym_off; + } + + legacy = determine_uprobe_perf_type() < 0; + switch (attach_mode) { + case PROBE_ATTACH_MODE_LEGACY: + legacy = true; + pe_opts.force_ioctl_attach = true; + break; + case PROBE_ATTACH_MODE_PERF: + if (legacy) + return libbpf_err_ptr(-ENOTSUP); + pe_opts.force_ioctl_attach = true; + break; + case PROBE_ATTACH_MODE_LINK: + if (legacy || !kernel_supports(prog->obj, FEAT_PERF_LINK)) + return libbpf_err_ptr(-ENOTSUP); + break; + case PROBE_ATTACH_MODE_DEFAULT: + break; + default: + return libbpf_err_ptr(-EINVAL); + } + + if (!legacy) { + pfd = perf_event_open_probe(true /* uprobe */, retprobe, binary_path, + func_offset, pid, ref_ctr_off); + } else { + char probe_name[PATH_MAX + 64]; + + if (ref_ctr_off) + return libbpf_err_ptr(-EINVAL); + + gen_uprobe_legacy_event_name(probe_name, sizeof(probe_name), + binary_path, func_offset); + + legacy_probe = strdup(probe_name); + if (!legacy_probe) + return libbpf_err_ptr(-ENOMEM); + + pfd = perf_event_uprobe_open_legacy(legacy_probe, retprobe, + binary_path, func_offset, pid); + } + if (pfd < 0) { + err = -errno; + pr_warn("prog '%s': failed to create %s '%s:0x%zx' perf event: %s\n", + prog->name, retprobe ? "uretprobe" : "uprobe", + binary_path, func_offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_out; + } + + link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); + err = libbpf_get_error(link); + if (err) { + close(pfd); + pr_warn("prog '%s': failed to attach to %s '%s:0x%zx': %s\n", + prog->name, retprobe ? "uretprobe" : "uprobe", + binary_path, func_offset, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + goto err_clean_legacy; + } + if (legacy) { + struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link); + + perf_link->legacy_probe_name = legacy_probe; + perf_link->legacy_is_kprobe = false; + perf_link->legacy_is_retprobe = retprobe; + } + return link; + +err_clean_legacy: + if (legacy) + remove_uprobe_event_legacy(legacy_probe, retprobe); +err_out: + free(legacy_probe); + return libbpf_err_ptr(err); +} + +/* Format of u[ret]probe section definition supporting auto-attach: + * u[ret]probe/binary:function[+offset] + * + * binary can be an absolute/relative path or a filename; the latter is resolved to a + * full binary path via bpf_program__attach_uprobe_opts. + * + * Specifying uprobe+ ensures we carry out strict matching; either "uprobe" must be + * specified (and auto-attach is not possible) or the above format is specified for + * auto-attach. + */ +static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + DECLARE_LIBBPF_OPTS(bpf_uprobe_opts, opts); + char *probe_type = NULL, *binary_path = NULL, *func_name = NULL; + int n, ret = -EINVAL; + long offset = 0; + + *link = NULL; + + n = sscanf(prog->sec_name, "%m[^/]/%m[^:]:%m[a-zA-Z0-9_.]+%li", + &probe_type, &binary_path, &func_name, &offset); + switch (n) { + case 1: + /* handle SEC("u[ret]probe") - format is valid, but auto-attach is impossible. */ + ret = 0; + break; + case 2: + pr_warn("prog '%s': section '%s' missing ':function[+offset]' specification\n", + prog->name, prog->sec_name); + break; + case 3: + case 4: + opts.retprobe = strcmp(probe_type, "uretprobe") == 0 || + strcmp(probe_type, "uretprobe.s") == 0; + if (opts.retprobe && offset != 0) { + pr_warn("prog '%s': uretprobes do not support offset specification\n", + prog->name); + break; + } + opts.func_name = func_name; + *link = bpf_program__attach_uprobe_opts(prog, -1, binary_path, offset, &opts); + ret = libbpf_get_error(*link); + break; + default: + pr_warn("prog '%s': invalid format of section definition '%s'\n", prog->name, + prog->sec_name); + break; + } + free(probe_type); + free(binary_path); + free(func_name); + + return ret; +} + +struct bpf_link *bpf_program__attach_uprobe(const struct bpf_program *prog, + bool retprobe, pid_t pid, + const char *binary_path, + size_t func_offset) +{ + DECLARE_LIBBPF_OPTS(bpf_uprobe_opts, opts, .retprobe = retprobe); + + return bpf_program__attach_uprobe_opts(prog, pid, binary_path, func_offset, &opts); +} + +struct bpf_link *bpf_program__attach_usdt(const struct bpf_program *prog, + pid_t pid, const char *binary_path, + const char *usdt_provider, const char *usdt_name, + const struct bpf_usdt_opts *opts) +{ + char resolved_path[512]; + struct bpf_object *obj = prog->obj; + struct bpf_link *link; + __u64 usdt_cookie; + int err; + + if (!OPTS_VALID(opts, bpf_uprobe_opts)) + return libbpf_err_ptr(-EINVAL); + + if (bpf_program__fd(prog) < 0) { + pr_warn("prog '%s': can't attach BPF program w/o FD (did you load it?)\n", + prog->name); + return libbpf_err_ptr(-EINVAL); + } + + if (!binary_path) + return libbpf_err_ptr(-EINVAL); + + if (!strchr(binary_path, '/')) { + err = resolve_full_path(binary_path, resolved_path, sizeof(resolved_path)); + if (err) { + pr_warn("prog '%s': failed to resolve full path for '%s': %d\n", + prog->name, binary_path, err); + return libbpf_err_ptr(err); + } + binary_path = resolved_path; + } + + /* USDT manager is instantiated lazily on first USDT attach. It will + * be destroyed together with BPF object in bpf_object__close(). + */ + if (IS_ERR(obj->usdt_man)) + return libbpf_ptr(obj->usdt_man); + if (!obj->usdt_man) { + obj->usdt_man = usdt_manager_new(obj); + if (IS_ERR(obj->usdt_man)) + return libbpf_ptr(obj->usdt_man); + } + + usdt_cookie = OPTS_GET(opts, usdt_cookie, 0); + link = usdt_manager_attach_usdt(obj->usdt_man, prog, pid, binary_path, + usdt_provider, usdt_name, usdt_cookie); + err = libbpf_get_error(link); + if (err) + return libbpf_err_ptr(err); + return link; +} + +static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + char *path = NULL, *provider = NULL, *name = NULL; + const char *sec_name; + int n, err; + + sec_name = bpf_program__section_name(prog); + if (strcmp(sec_name, "usdt") == 0) { + /* no auto-attach for just SEC("usdt") */ + *link = NULL; + return 0; + } + + n = sscanf(sec_name, "usdt/%m[^:]:%m[^:]:%m[^:]", &path, &provider, &name); + if (n != 3) { + pr_warn("invalid section '%s', expected SEC(\"usdt/::\")\n", + sec_name); + err = -EINVAL; + } else { + *link = bpf_program__attach_usdt(prog, -1 /* any process */, path, + provider, name, NULL); + err = libbpf_get_error(*link); + } + free(path); + free(provider); + free(name); + return err; +} + +static int determine_tracepoint_id(const char *tp_category, + const char *tp_name) +{ + char file[PATH_MAX]; + int ret; + + ret = snprintf(file, sizeof(file), "%s/events/%s/%s/id", + tracefs_path(), tp_category, tp_name); + if (ret < 0) + return -errno; + if (ret >= sizeof(file)) { + pr_debug("tracepoint %s/%s path is too long\n", + tp_category, tp_name); + return -E2BIG; + } + return parse_uint_from_file(file, "%d\n"); +} + +static int perf_event_open_tracepoint(const char *tp_category, + const char *tp_name) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_event_attr attr; + char errmsg[STRERR_BUFSIZE]; + int tp_id, pfd, err; + + tp_id = determine_tracepoint_id(tp_category, tp_name); + if (tp_id < 0) { + pr_warn("failed to determine tracepoint '%s/%s' perf event ID: %s\n", + tp_category, tp_name, + libbpf_strerror_r(tp_id, errmsg, sizeof(errmsg))); + return tp_id; + } + + memset(&attr, 0, attr_sz); + attr.type = PERF_TYPE_TRACEPOINT; + attr.size = attr_sz; + attr.config = tp_id; + + pfd = syscall(__NR_perf_event_open, &attr, -1 /* pid */, 0 /* cpu */, + -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC); + if (pfd < 0) { + err = -errno; + pr_warn("tracepoint '%s/%s' perf_event_open() failed: %s\n", + tp_category, tp_name, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + return err; + } + return pfd; +} + +struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name, + const struct bpf_tracepoint_opts *opts) +{ + DECLARE_LIBBPF_OPTS(bpf_perf_event_opts, pe_opts); + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int pfd, err; + + if (!OPTS_VALID(opts, bpf_tracepoint_opts)) + return libbpf_err_ptr(-EINVAL); + + pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + + pfd = perf_event_open_tracepoint(tp_category, tp_name); + if (pfd < 0) { + pr_warn("prog '%s': failed to create tracepoint '%s/%s' perf event: %s\n", + prog->name, tp_category, tp_name, + libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(pfd); + } + link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); + err = libbpf_get_error(link); + if (err) { + close(pfd); + pr_warn("prog '%s': failed to attach to tracepoint '%s/%s': %s\n", + prog->name, tp_category, tp_name, + libbpf_strerror_r(err, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(err); + } + return link; +} + +struct bpf_link *bpf_program__attach_tracepoint(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name) +{ + return bpf_program__attach_tracepoint_opts(prog, tp_category, tp_name, NULL); +} + +static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + char *sec_name, *tp_cat, *tp_name; + + *link = NULL; + + /* no auto-attach for SEC("tp") or SEC("tracepoint") */ + if (strcmp(prog->sec_name, "tp") == 0 || strcmp(prog->sec_name, "tracepoint") == 0) + return 0; + + sec_name = strdup(prog->sec_name); + if (!sec_name) + return -ENOMEM; + + /* extract "tp//" or "tracepoint//" */ + if (str_has_pfx(prog->sec_name, "tp/")) + tp_cat = sec_name + sizeof("tp/") - 1; + else + tp_cat = sec_name + sizeof("tracepoint/") - 1; + tp_name = strchr(tp_cat, '/'); + if (!tp_name) { + free(sec_name); + return -EINVAL; + } + *tp_name = '\0'; + tp_name++; + + *link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name); + free(sec_name); + return libbpf_get_error(*link); +} + +struct bpf_link *bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, + const char *tp_name) +{ + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int prog_fd, pfd; + + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach before loaded\n", prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->detach = &bpf_link__detach_fd; + + pfd = bpf_raw_tracepoint_open(tp_name, prog_fd); + if (pfd < 0) { + pfd = -errno; + free(link); + pr_warn("prog '%s': failed to attach to raw tracepoint '%s': %s\n", + prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(pfd); + } + link->fd = pfd; + return link; +} + +static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + static const char *const prefixes[] = { + "raw_tp", + "raw_tracepoint", + "raw_tp.w", + "raw_tracepoint.w", + }; + size_t i; + const char *tp_name = NULL; + + *link = NULL; + + for (i = 0; i < ARRAY_SIZE(prefixes); i++) { + size_t pfx_len; + + if (!str_has_pfx(prog->sec_name, prefixes[i])) + continue; + + pfx_len = strlen(prefixes[i]); + /* no auto-attach case of, e.g., SEC("raw_tp") */ + if (prog->sec_name[pfx_len] == '\0') + return 0; + + if (prog->sec_name[pfx_len] != '/') + continue; + + tp_name = prog->sec_name + pfx_len + 1; + break; + } + + if (!tp_name) { + pr_warn("prog '%s': invalid section name '%s'\n", + prog->name, prog->sec_name); + return -EINVAL; + } + + *link = bpf_program__attach_raw_tracepoint(prog, tp_name); + return libbpf_get_error(*link); +} + +/* Common logic for all BPF program types that attach to a btf_id */ +static struct bpf_link *bpf_program__attach_btf_id(const struct bpf_program *prog, + const struct bpf_trace_opts *opts) +{ + LIBBPF_OPTS(bpf_link_create_opts, link_opts); + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int prog_fd, pfd; + + if (!OPTS_VALID(opts, bpf_trace_opts)) + return libbpf_err_ptr(-EINVAL); + + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach before loaded\n", prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->detach = &bpf_link__detach_fd; + + /* libbpf is smart enough to redirect to BPF_RAW_TRACEPOINT_OPEN on old kernels */ + link_opts.tracing.cookie = OPTS_GET(opts, cookie, 0); + pfd = bpf_link_create(prog_fd, 0, bpf_program__expected_attach_type(prog), &link_opts); + if (pfd < 0) { + pfd = -errno; + free(link); + pr_warn("prog '%s': failed to attach: %s\n", + prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(pfd); + } + link->fd = pfd; + return link; +} + +struct bpf_link *bpf_program__attach_trace(const struct bpf_program *prog) +{ + return bpf_program__attach_btf_id(prog, NULL); +} + +struct bpf_link *bpf_program__attach_trace_opts(const struct bpf_program *prog, + const struct bpf_trace_opts *opts) +{ + return bpf_program__attach_btf_id(prog, opts); +} + +struct bpf_link *bpf_program__attach_lsm(const struct bpf_program *prog) +{ + return bpf_program__attach_btf_id(prog, NULL); +} + +static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + *link = bpf_program__attach_trace(prog); + return libbpf_get_error(*link); +} + +static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + *link = bpf_program__attach_lsm(prog); + return libbpf_get_error(*link); +} + +static struct bpf_link * +bpf_program__attach_fd(const struct bpf_program *prog, int target_fd, int btf_id, + const char *target_name) +{ + DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts, + .target_btf_id = btf_id); + enum bpf_attach_type attach_type; + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int prog_fd, link_fd; + + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach before loaded\n", prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->detach = &bpf_link__detach_fd; + + attach_type = bpf_program__expected_attach_type(prog); + link_fd = bpf_link_create(prog_fd, target_fd, attach_type, &opts); + if (link_fd < 0) { + link_fd = -errno; + free(link); + pr_warn("prog '%s': failed to attach to %s: %s\n", + prog->name, target_name, + libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(link_fd); + } + link->fd = link_fd; + return link; +} + +struct bpf_link * +bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd) +{ + return bpf_program__attach_fd(prog, cgroup_fd, 0, "cgroup"); +} + +struct bpf_link * +bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd) +{ + return bpf_program__attach_fd(prog, netns_fd, 0, "netns"); +} + +struct bpf_link *bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex) +{ + /* target_fd/target_ifindex use the same field in LINK_CREATE */ + return bpf_program__attach_fd(prog, ifindex, 0, "xdp"); +} + +struct bpf_link *bpf_program__attach_freplace(const struct bpf_program *prog, + int target_fd, + const char *attach_func_name) +{ + int btf_id; + + if (!!target_fd != !!attach_func_name) { + pr_warn("prog '%s': supply none or both of target_fd and attach_func_name\n", + prog->name); + return libbpf_err_ptr(-EINVAL); + } + + if (prog->type != BPF_PROG_TYPE_EXT) { + pr_warn("prog '%s': only BPF_PROG_TYPE_EXT can attach as freplace", + prog->name); + return libbpf_err_ptr(-EINVAL); + } + + if (target_fd) { + btf_id = libbpf_find_prog_btf_id(attach_func_name, target_fd); + if (btf_id < 0) + return libbpf_err_ptr(btf_id); + + return bpf_program__attach_fd(prog, target_fd, btf_id, "freplace"); + } else { + /* no target, so use raw_tracepoint_open for compatibility + * with old kernels + */ + return bpf_program__attach_trace(prog); + } +} + +struct bpf_link * +bpf_program__attach_iter(const struct bpf_program *prog, + const struct bpf_iter_attach_opts *opts) +{ + DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_create_opts); + char errmsg[STRERR_BUFSIZE]; + struct bpf_link *link; + int prog_fd, link_fd; + __u32 target_fd = 0; + + if (!OPTS_VALID(opts, bpf_iter_attach_opts)) + return libbpf_err_ptr(-EINVAL); + + link_create_opts.iter_info = OPTS_GET(opts, link_info, (void *)0); + link_create_opts.iter_info_len = OPTS_GET(opts, link_info_len, 0); + + prog_fd = bpf_program__fd(prog); + if (prog_fd < 0) { + pr_warn("prog '%s': can't attach before loaded\n", prog->name); + return libbpf_err_ptr(-EINVAL); + } + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-ENOMEM); + link->detach = &bpf_link__detach_fd; + + link_fd = bpf_link_create(prog_fd, target_fd, BPF_TRACE_ITER, + &link_create_opts); + if (link_fd < 0) { + link_fd = -errno; + free(link); + pr_warn("prog '%s': failed to attach to iterator: %s\n", + prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); + return libbpf_err_ptr(link_fd); + } + link->fd = link_fd; + return link; +} + +static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link) +{ + *link = bpf_program__attach_iter(prog, NULL); + return libbpf_get_error(*link); +} + +struct bpf_link *bpf_program__attach(const struct bpf_program *prog) +{ + struct bpf_link *link = NULL; + int err; + + if (!prog->sec_def || !prog->sec_def->prog_attach_fn) + return libbpf_err_ptr(-EOPNOTSUPP); + + err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, &link); + if (err) + return libbpf_err_ptr(err); + + /* When calling bpf_program__attach() explicitly, auto-attach support + * is expected to work, so NULL returned link is considered an error. + * This is different for skeleton's attach, see comment in + * bpf_object__attach_skeleton(). + */ + if (!link) + return libbpf_err_ptr(-EOPNOTSUPP); + + return link; +} + +struct bpf_link_struct_ops { + struct bpf_link link; + int map_fd; +}; + +static int bpf_link__detach_struct_ops(struct bpf_link *link) +{ + struct bpf_link_struct_ops *st_link; + __u32 zero = 0; + + st_link = container_of(link, struct bpf_link_struct_ops, link); + + if (st_link->map_fd < 0) + /* w/o a real link */ + return bpf_map_delete_elem(link->fd, &zero); + + return close(link->fd); +} + +struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map) +{ + struct bpf_link_struct_ops *link; + __u32 zero = 0; + int err, fd; + + if (!bpf_map__is_struct_ops(map) || map->fd == -1) + return libbpf_err_ptr(-EINVAL); + + link = calloc(1, sizeof(*link)); + if (!link) + return libbpf_err_ptr(-EINVAL); + + /* kern_vdata should be prepared during the loading phase. */ + err = bpf_map_update_elem(map->fd, &zero, map->st_ops->kern_vdata, 0); + /* It can be EBUSY if the map has been used to create or + * update a link before. We don't allow updating the value of + * a struct_ops once it is set. That ensures that the value + * never changed. So, it is safe to skip EBUSY. + */ + if (err && (!(map->def.map_flags & BPF_F_LINK) || err != -EBUSY)) { + free(link); + return libbpf_err_ptr(err); + } + + link->link.detach = bpf_link__detach_struct_ops; + + if (!(map->def.map_flags & BPF_F_LINK)) { + /* w/o a real link */ + link->link.fd = map->fd; + link->map_fd = -1; + return &link->link; + } + + fd = bpf_link_create(map->fd, 0, BPF_STRUCT_OPS, NULL); + if (fd < 0) { + free(link); + return libbpf_err_ptr(fd); + } + + link->link.fd = fd; + link->map_fd = map->fd; + + return &link->link; +} + +/* + * Swap the back struct_ops of a link with a new struct_ops map. + */ +int bpf_link__update_map(struct bpf_link *link, const struct bpf_map *map) +{ + struct bpf_link_struct_ops *st_ops_link; + __u32 zero = 0; + int err; + + if (!bpf_map__is_struct_ops(map) || map->fd < 0) + return -EINVAL; + + st_ops_link = container_of(link, struct bpf_link_struct_ops, link); + /* Ensure the type of a link is correct */ + if (st_ops_link->map_fd < 0) + return -EINVAL; + + err = bpf_map_update_elem(map->fd, &zero, map->st_ops->kern_vdata, 0); + /* It can be EBUSY if the map has been used to create or + * update a link before. We don't allow updating the value of + * a struct_ops once it is set. That ensures that the value + * never changed. So, it is safe to skip EBUSY. + */ + if (err && err != -EBUSY) + return err; + + err = bpf_link_update(link->fd, map->fd, NULL); + if (err < 0) + return err; + + st_ops_link->map_fd = map->fd; + + return 0; +} + +typedef enum bpf_perf_event_ret (*bpf_perf_event_print_t)(struct perf_event_header *hdr, + void *private_data); + +static enum bpf_perf_event_ret +perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size, + void **copy_mem, size_t *copy_size, + bpf_perf_event_print_t fn, void *private_data) +{ + struct perf_event_mmap_page *header = mmap_mem; + __u64 data_head = ring_buffer_read_head(header); + __u64 data_tail = header->data_tail; + void *base = ((__u8 *)header) + page_size; + int ret = LIBBPF_PERF_EVENT_CONT; + struct perf_event_header *ehdr; + size_t ehdr_size; + + while (data_head != data_tail) { + ehdr = base + (data_tail & (mmap_size - 1)); + ehdr_size = ehdr->size; + + if (((void *)ehdr) + ehdr_size > base + mmap_size) { + void *copy_start = ehdr; + size_t len_first = base + mmap_size - copy_start; + size_t len_secnd = ehdr_size - len_first; + + if (*copy_size < ehdr_size) { + free(*copy_mem); + *copy_mem = malloc(ehdr_size); + if (!*copy_mem) { + *copy_size = 0; + ret = LIBBPF_PERF_EVENT_ERROR; + break; + } + *copy_size = ehdr_size; + } + + memcpy(*copy_mem, copy_start, len_first); + memcpy(*copy_mem + len_first, base, len_secnd); + ehdr = *copy_mem; + } + + ret = fn(ehdr, private_data); + data_tail += ehdr_size; + if (ret != LIBBPF_PERF_EVENT_CONT) + break; + } + + ring_buffer_write_tail(header, data_tail); + return libbpf_err(ret); +} + +struct perf_buffer; + +struct perf_buffer_params { + struct perf_event_attr *attr; + /* if event_cb is specified, it takes precendence */ + perf_buffer_event_fn event_cb; + /* sample_cb and lost_cb are higher-level common-case callbacks */ + perf_buffer_sample_fn sample_cb; + perf_buffer_lost_fn lost_cb; + void *ctx; + int cpu_cnt; + int *cpus; + int *map_keys; +}; + +struct perf_cpu_buf { + struct perf_buffer *pb; + void *base; /* mmap()'ed memory */ + void *buf; /* for reconstructing segmented data */ + size_t buf_size; + int fd; + int cpu; + int map_key; +}; + +struct perf_buffer { + perf_buffer_event_fn event_cb; + perf_buffer_sample_fn sample_cb; + perf_buffer_lost_fn lost_cb; + void *ctx; /* passed into callbacks */ + + size_t page_size; + size_t mmap_size; + struct perf_cpu_buf **cpu_bufs; + struct epoll_event *events; + int cpu_cnt; /* number of allocated CPU buffers */ + int epoll_fd; /* perf event FD */ + int map_fd; /* BPF_MAP_TYPE_PERF_EVENT_ARRAY BPF map FD */ +}; + +static void perf_buffer__free_cpu_buf(struct perf_buffer *pb, + struct perf_cpu_buf *cpu_buf) +{ + if (!cpu_buf) + return; + if (cpu_buf->base && + munmap(cpu_buf->base, pb->mmap_size + pb->page_size)) + pr_warn("failed to munmap cpu_buf #%d\n", cpu_buf->cpu); + if (cpu_buf->fd >= 0) { + ioctl(cpu_buf->fd, PERF_EVENT_IOC_DISABLE, 0); + close(cpu_buf->fd); + } + free(cpu_buf->buf); + free(cpu_buf); +} + +void perf_buffer__free(struct perf_buffer *pb) +{ + int i; + + if (IS_ERR_OR_NULL(pb)) + return; + if (pb->cpu_bufs) { + for (i = 0; i < pb->cpu_cnt; i++) { + struct perf_cpu_buf *cpu_buf = pb->cpu_bufs[i]; + + if (!cpu_buf) + continue; + + bpf_map_delete_elem(pb->map_fd, &cpu_buf->map_key); + perf_buffer__free_cpu_buf(pb, cpu_buf); + } + free(pb->cpu_bufs); + } + if (pb->epoll_fd >= 0) + close(pb->epoll_fd); + free(pb->events); + free(pb); +} + +static struct perf_cpu_buf * +perf_buffer__open_cpu_buf(struct perf_buffer *pb, struct perf_event_attr *attr, + int cpu, int map_key) +{ + struct perf_cpu_buf *cpu_buf; + char msg[STRERR_BUFSIZE]; + int err; + + cpu_buf = calloc(1, sizeof(*cpu_buf)); + if (!cpu_buf) + return ERR_PTR(-ENOMEM); + + cpu_buf->pb = pb; + cpu_buf->cpu = cpu; + cpu_buf->map_key = map_key; + + cpu_buf->fd = syscall(__NR_perf_event_open, attr, -1 /* pid */, cpu, + -1, PERF_FLAG_FD_CLOEXEC); + if (cpu_buf->fd < 0) { + err = -errno; + pr_warn("failed to open perf buffer event on cpu #%d: %s\n", + cpu, libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + cpu_buf->base = mmap(NULL, pb->mmap_size + pb->page_size, + PROT_READ | PROT_WRITE, MAP_SHARED, + cpu_buf->fd, 0); + if (cpu_buf->base == MAP_FAILED) { + cpu_buf->base = NULL; + err = -errno; + pr_warn("failed to mmap perf buffer on cpu #%d: %s\n", + cpu, libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + if (ioctl(cpu_buf->fd, PERF_EVENT_IOC_ENABLE, 0) < 0) { + err = -errno; + pr_warn("failed to enable perf buffer event on cpu #%d: %s\n", + cpu, libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + return cpu_buf; + +error: + perf_buffer__free_cpu_buf(pb, cpu_buf); + return (struct perf_cpu_buf *)ERR_PTR(err); +} + +static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt, + struct perf_buffer_params *p); + +struct perf_buffer *perf_buffer__new(int map_fd, size_t page_cnt, + perf_buffer_sample_fn sample_cb, + perf_buffer_lost_fn lost_cb, + void *ctx, + const struct perf_buffer_opts *opts) +{ + const size_t attr_sz = sizeof(struct perf_event_attr); + struct perf_buffer_params p = {}; + struct perf_event_attr attr; + __u32 sample_period; + + if (!OPTS_VALID(opts, perf_buffer_opts)) + return libbpf_err_ptr(-EINVAL); + + sample_period = OPTS_GET(opts, sample_period, 1); + if (!sample_period) + sample_period = 1; + + memset(&attr, 0, attr_sz); + attr.size = attr_sz; + attr.config = PERF_COUNT_SW_BPF_OUTPUT; + attr.type = PERF_TYPE_SOFTWARE; + attr.sample_type = PERF_SAMPLE_RAW; + attr.sample_period = sample_period; + attr.wakeup_events = sample_period; + + p.attr = &attr; + p.sample_cb = sample_cb; + p.lost_cb = lost_cb; + p.ctx = ctx; + + return libbpf_ptr(__perf_buffer__new(map_fd, page_cnt, &p)); +} + +struct perf_buffer *perf_buffer__new_raw(int map_fd, size_t page_cnt, + struct perf_event_attr *attr, + perf_buffer_event_fn event_cb, void *ctx, + const struct perf_buffer_raw_opts *opts) +{ + struct perf_buffer_params p = {}; + + if (!attr) + return libbpf_err_ptr(-EINVAL); + + if (!OPTS_VALID(opts, perf_buffer_raw_opts)) + return libbpf_err_ptr(-EINVAL); + + p.attr = attr; + p.event_cb = event_cb; + p.ctx = ctx; + p.cpu_cnt = OPTS_GET(opts, cpu_cnt, 0); + p.cpus = OPTS_GET(opts, cpus, NULL); + p.map_keys = OPTS_GET(opts, map_keys, NULL); + + return libbpf_ptr(__perf_buffer__new(map_fd, page_cnt, &p)); +} + +static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt, + struct perf_buffer_params *p) +{ + const char *online_cpus_file = "/sys/devices/system/cpu/online"; + struct bpf_map_info map; + char msg[STRERR_BUFSIZE]; + struct perf_buffer *pb; + bool *online = NULL; + __u32 map_info_len; + int err, i, j, n; + + if (page_cnt == 0 || (page_cnt & (page_cnt - 1))) { + pr_warn("page count should be power of two, but is %zu\n", + page_cnt); + return ERR_PTR(-EINVAL); + } + + /* best-effort sanity checks */ + memset(&map, 0, sizeof(map)); + map_info_len = sizeof(map); + err = bpf_map_get_info_by_fd(map_fd, &map, &map_info_len); + if (err) { + err = -errno; + /* if BPF_OBJ_GET_INFO_BY_FD is supported, will return + * -EBADFD, -EFAULT, or -E2BIG on real error + */ + if (err != -EINVAL) { + pr_warn("failed to get map info for map FD %d: %s\n", + map_fd, libbpf_strerror_r(err, msg, sizeof(msg))); + return ERR_PTR(err); + } + pr_debug("failed to get map info for FD %d; API not supported? Ignoring...\n", + map_fd); + } else { + if (map.type != BPF_MAP_TYPE_PERF_EVENT_ARRAY) { + pr_warn("map '%s' should be BPF_MAP_TYPE_PERF_EVENT_ARRAY\n", + map.name); + return ERR_PTR(-EINVAL); + } + } + + pb = calloc(1, sizeof(*pb)); + if (!pb) + return ERR_PTR(-ENOMEM); + + pb->event_cb = p->event_cb; + pb->sample_cb = p->sample_cb; + pb->lost_cb = p->lost_cb; + pb->ctx = p->ctx; + + pb->page_size = getpagesize(); + pb->mmap_size = pb->page_size * page_cnt; + pb->map_fd = map_fd; + + pb->epoll_fd = epoll_create1(EPOLL_CLOEXEC); + if (pb->epoll_fd < 0) { + err = -errno; + pr_warn("failed to create epoll instance: %s\n", + libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + if (p->cpu_cnt > 0) { + pb->cpu_cnt = p->cpu_cnt; + } else { + pb->cpu_cnt = libbpf_num_possible_cpus(); + if (pb->cpu_cnt < 0) { + err = pb->cpu_cnt; + goto error; + } + if (map.max_entries && map.max_entries < pb->cpu_cnt) + pb->cpu_cnt = map.max_entries; + } + + pb->events = calloc(pb->cpu_cnt, sizeof(*pb->events)); + if (!pb->events) { + err = -ENOMEM; + pr_warn("failed to allocate events: out of memory\n"); + goto error; + } + pb->cpu_bufs = calloc(pb->cpu_cnt, sizeof(*pb->cpu_bufs)); + if (!pb->cpu_bufs) { + err = -ENOMEM; + pr_warn("failed to allocate buffers: out of memory\n"); + goto error; + } + + err = parse_cpu_mask_file(online_cpus_file, &online, &n); + if (err) { + pr_warn("failed to get online CPU mask: %d\n", err); + goto error; + } + + for (i = 0, j = 0; i < pb->cpu_cnt; i++) { + struct perf_cpu_buf *cpu_buf; + int cpu, map_key; + + cpu = p->cpu_cnt > 0 ? p->cpus[i] : i; + map_key = p->cpu_cnt > 0 ? p->map_keys[i] : i; + + /* in case user didn't explicitly requested particular CPUs to + * be attached to, skip offline/not present CPUs + */ + if (p->cpu_cnt <= 0 && (cpu >= n || !online[cpu])) + continue; + + cpu_buf = perf_buffer__open_cpu_buf(pb, p->attr, cpu, map_key); + if (IS_ERR(cpu_buf)) { + err = PTR_ERR(cpu_buf); + goto error; + } + + pb->cpu_bufs[j] = cpu_buf; + + err = bpf_map_update_elem(pb->map_fd, &map_key, + &cpu_buf->fd, 0); + if (err) { + err = -errno; + pr_warn("failed to set cpu #%d, key %d -> perf FD %d: %s\n", + cpu, map_key, cpu_buf->fd, + libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + + pb->events[j].events = EPOLLIN; + pb->events[j].data.ptr = cpu_buf; + if (epoll_ctl(pb->epoll_fd, EPOLL_CTL_ADD, cpu_buf->fd, + &pb->events[j]) < 0) { + err = -errno; + pr_warn("failed to epoll_ctl cpu #%d perf FD %d: %s\n", + cpu, cpu_buf->fd, + libbpf_strerror_r(err, msg, sizeof(msg))); + goto error; + } + j++; + } + pb->cpu_cnt = j; + free(online); + + return pb; + +error: + free(online); + if (pb) + perf_buffer__free(pb); + return ERR_PTR(err); +} + +struct perf_sample_raw { + struct perf_event_header header; + uint32_t size; + char data[]; +}; + +struct perf_sample_lost { + struct perf_event_header header; + uint64_t id; + uint64_t lost; + uint64_t sample_id; +}; + +static enum bpf_perf_event_ret +perf_buffer__process_record(struct perf_event_header *e, void *ctx) +{ + struct perf_cpu_buf *cpu_buf = ctx; + struct perf_buffer *pb = cpu_buf->pb; + void *data = e; + + /* user wants full control over parsing perf event */ + if (pb->event_cb) + return pb->event_cb(pb->ctx, cpu_buf->cpu, e); + + switch (e->type) { + case PERF_RECORD_SAMPLE: { + struct perf_sample_raw *s = data; + + if (pb->sample_cb) + pb->sample_cb(pb->ctx, cpu_buf->cpu, s->data, s->size); + break; + } + case PERF_RECORD_LOST: { + struct perf_sample_lost *s = data; + + if (pb->lost_cb) + pb->lost_cb(pb->ctx, cpu_buf->cpu, s->lost); + break; + } + default: + pr_warn("unknown perf sample type %d\n", e->type); + return LIBBPF_PERF_EVENT_ERROR; + } + return LIBBPF_PERF_EVENT_CONT; +} + +static int perf_buffer__process_records(struct perf_buffer *pb, + struct perf_cpu_buf *cpu_buf) +{ + enum bpf_perf_event_ret ret; + + ret = perf_event_read_simple(cpu_buf->base, pb->mmap_size, + pb->page_size, &cpu_buf->buf, + &cpu_buf->buf_size, + perf_buffer__process_record, cpu_buf); + if (ret != LIBBPF_PERF_EVENT_CONT) + return ret; + return 0; +} + +int perf_buffer__epoll_fd(const struct perf_buffer *pb) +{ + return pb->epoll_fd; +} + +int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms) +{ + int i, cnt, err; + + cnt = epoll_wait(pb->epoll_fd, pb->events, pb->cpu_cnt, timeout_ms); + if (cnt < 0) + return -errno; + + for (i = 0; i < cnt; i++) { + struct perf_cpu_buf *cpu_buf = pb->events[i].data.ptr; + + err = perf_buffer__process_records(pb, cpu_buf); + if (err) { + pr_warn("error while processing records: %d\n", err); + return libbpf_err(err); + } + } + return cnt; +} + +/* Return number of PERF_EVENT_ARRAY map slots set up by this perf_buffer + * manager. + */ +size_t perf_buffer__buffer_cnt(const struct perf_buffer *pb) +{ + return pb->cpu_cnt; +} + +/* + * Return perf_event FD of a ring buffer in *buf_idx* slot of + * PERF_EVENT_ARRAY BPF map. This FD can be polled for new data using + * select()/poll()/epoll() Linux syscalls. + */ +int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_idx) +{ + struct perf_cpu_buf *cpu_buf; + + if (buf_idx >= pb->cpu_cnt) + return libbpf_err(-EINVAL); + + cpu_buf = pb->cpu_bufs[buf_idx]; + if (!cpu_buf) + return libbpf_err(-ENOENT); + + return cpu_buf->fd; +} + +int perf_buffer__buffer(struct perf_buffer *pb, int buf_idx, void **buf, size_t *buf_size) +{ + struct perf_cpu_buf *cpu_buf; + + if (buf_idx >= pb->cpu_cnt) + return libbpf_err(-EINVAL); + + cpu_buf = pb->cpu_bufs[buf_idx]; + if (!cpu_buf) + return libbpf_err(-ENOENT); + + *buf = cpu_buf->base; + *buf_size = pb->mmap_size; + return 0; +} + +/* + * Consume data from perf ring buffer corresponding to slot *buf_idx* in + * PERF_EVENT_ARRAY BPF map without waiting/polling. If there is no data to + * consume, do nothing and return success. + * Returns: + * - 0 on success; + * - <0 on failure. + */ +int perf_buffer__consume_buffer(struct perf_buffer *pb, size_t buf_idx) +{ + struct perf_cpu_buf *cpu_buf; + + if (buf_idx >= pb->cpu_cnt) + return libbpf_err(-EINVAL); + + cpu_buf = pb->cpu_bufs[buf_idx]; + if (!cpu_buf) + return libbpf_err(-ENOENT); + + return perf_buffer__process_records(pb, cpu_buf); +} + +int perf_buffer__consume(struct perf_buffer *pb) +{ + int i, err; + + for (i = 0; i < pb->cpu_cnt; i++) { + struct perf_cpu_buf *cpu_buf = pb->cpu_bufs[i]; + + if (!cpu_buf) + continue; + + err = perf_buffer__process_records(pb, cpu_buf); + if (err) { + pr_warn("perf_buffer: failed to process records in buffer #%d: %d\n", i, err); + return libbpf_err(err); + } + } + return 0; +} + +int bpf_program__set_attach_target(struct bpf_program *prog, + int attach_prog_fd, + const char *attach_func_name) +{ + int btf_obj_fd = 0, btf_id = 0, err; + + if (!prog || attach_prog_fd < 0) + return libbpf_err(-EINVAL); + + if (prog->obj->loaded) + return libbpf_err(-EINVAL); + + if (attach_prog_fd && !attach_func_name) { + /* remember attach_prog_fd and let bpf_program__load() find + * BTF ID during the program load + */ + prog->attach_prog_fd = attach_prog_fd; + return 0; + } + + if (attach_prog_fd) { + btf_id = libbpf_find_prog_btf_id(attach_func_name, + attach_prog_fd); + if (btf_id < 0) + return libbpf_err(btf_id); + } else { + if (!attach_func_name) + return libbpf_err(-EINVAL); + + /* load btf_vmlinux, if not yet */ + err = bpf_object__load_vmlinux_btf(prog->obj, true); + if (err) + return libbpf_err(err); + err = find_kernel_btf_id(prog->obj, attach_func_name, + prog->expected_attach_type, + &btf_obj_fd, &btf_id); + if (err) + return libbpf_err(err); + } + + prog->attach_btf_id = btf_id; + prog->attach_btf_obj_fd = btf_obj_fd; + prog->attach_prog_fd = attach_prog_fd; + return 0; +} + +int parse_cpu_mask_str(const char *s, bool **mask, int *mask_sz) +{ + int err = 0, n, len, start, end = -1; + bool *tmp; + + *mask = NULL; + *mask_sz = 0; + + /* Each sub string separated by ',' has format \d+-\d+ or \d+ */ + while (*s) { + if (*s == ',' || *s == '\n') { + s++; + continue; + } + n = sscanf(s, "%d%n-%d%n", &start, &len, &end, &len); + if (n <= 0 || n > 2) { + pr_warn("Failed to get CPU range %s: %d\n", s, n); + err = -EINVAL; + goto cleanup; + } else if (n == 1) { + end = start; + } + if (start < 0 || start > end) { + pr_warn("Invalid CPU range [%d,%d] in %s\n", + start, end, s); + err = -EINVAL; + goto cleanup; + } + tmp = realloc(*mask, end + 1); + if (!tmp) { + err = -ENOMEM; + goto cleanup; + } + *mask = tmp; + memset(tmp + *mask_sz, 0, start - *mask_sz); + memset(tmp + start, 1, end - start + 1); + *mask_sz = end + 1; + s += len; + } + if (!*mask_sz) { + pr_warn("Empty CPU range\n"); + return -EINVAL; + } + return 0; +cleanup: + free(*mask); + *mask = NULL; + return err; +} + +int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz) +{ + int fd, err = 0, len; + char buf[128]; + + fd = open(fcpu, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + err = -errno; + pr_warn("Failed to open cpu mask file %s: %d\n", fcpu, err); + return err; + } + len = read(fd, buf, sizeof(buf)); + close(fd); + if (len <= 0) { + err = len ? -errno : -EINVAL; + pr_warn("Failed to read cpu mask from %s: %d\n", fcpu, err); + return err; + } + if (len >= sizeof(buf)) { + pr_warn("CPU mask is too big in file %s\n", fcpu); + return -E2BIG; + } + buf[len] = '\0'; + + return parse_cpu_mask_str(buf, mask, mask_sz); +} + +int libbpf_num_possible_cpus(void) +{ + static const char *fcpu = "/sys/devices/system/cpu/possible"; + static int cpus; + int err, n, i, tmp_cpus; + bool *mask; + + tmp_cpus = READ_ONCE(cpus); + if (tmp_cpus > 0) + return tmp_cpus; + + err = parse_cpu_mask_file(fcpu, &mask, &n); + if (err) + return libbpf_err(err); + + tmp_cpus = 0; + for (i = 0; i < n; i++) { + if (mask[i]) + tmp_cpus++; + } + free(mask); + + WRITE_ONCE(cpus, tmp_cpus); + return tmp_cpus; +} + +static int populate_skeleton_maps(const struct bpf_object *obj, + struct bpf_map_skeleton *maps, + size_t map_cnt) +{ + int i; + + for (i = 0; i < map_cnt; i++) { + struct bpf_map **map = maps[i].map; + const char *name = maps[i].name; + void **mmaped = maps[i].mmaped; + + *map = bpf_object__find_map_by_name(obj, name); + if (!*map) { + pr_warn("failed to find skeleton map '%s'\n", name); + return -ESRCH; + } + + /* externs shouldn't be pre-setup from user code */ + if (mmaped && (*map)->libbpf_type != LIBBPF_MAP_KCONFIG) + *mmaped = (*map)->mmaped; + } + return 0; +} + +static int populate_skeleton_progs(const struct bpf_object *obj, + struct bpf_prog_skeleton *progs, + size_t prog_cnt) +{ + int i; + + for (i = 0; i < prog_cnt; i++) { + struct bpf_program **prog = progs[i].prog; + const char *name = progs[i].name; + + *prog = bpf_object__find_program_by_name(obj, name); + if (!*prog) { + pr_warn("failed to find skeleton program '%s'\n", name); + return -ESRCH; + } + } + return 0; +} + +int bpf_object__open_skeleton(struct bpf_object_skeleton *s, + const struct bpf_object_open_opts *opts) +{ + DECLARE_LIBBPF_OPTS(bpf_object_open_opts, skel_opts, + .object_name = s->name, + ); + struct bpf_object *obj; + int err; + + /* Attempt to preserve opts->object_name, unless overriden by user + * explicitly. Overwriting object name for skeletons is discouraged, + * as it breaks global data maps, because they contain object name + * prefix as their own map name prefix. When skeleton is generated, + * bpftool is making an assumption that this name will stay the same. + */ + if (opts) { + memcpy(&skel_opts, opts, sizeof(*opts)); + if (!opts->object_name) + skel_opts.object_name = s->name; + } + + obj = bpf_object__open_mem(s->data, s->data_sz, &skel_opts); + err = libbpf_get_error(obj); + if (err) { + pr_warn("failed to initialize skeleton BPF object '%s': %d\n", + s->name, err); + return libbpf_err(err); + } + + *s->obj = obj; + err = populate_skeleton_maps(obj, s->maps, s->map_cnt); + if (err) { + pr_warn("failed to populate skeleton maps for '%s': %d\n", s->name, err); + return libbpf_err(err); + } + + err = populate_skeleton_progs(obj, s->progs, s->prog_cnt); + if (err) { + pr_warn("failed to populate skeleton progs for '%s': %d\n", s->name, err); + return libbpf_err(err); + } + + return 0; +} + +int bpf_object__open_subskeleton(struct bpf_object_subskeleton *s) +{ + int err, len, var_idx, i; + const char *var_name; + const struct bpf_map *map; + struct btf *btf; + __u32 map_type_id; + const struct btf_type *map_type, *var_type; + const struct bpf_var_skeleton *var_skel; + struct btf_var_secinfo *var; + + if (!s->obj) + return libbpf_err(-EINVAL); + + btf = bpf_object__btf(s->obj); + if (!btf) { + pr_warn("subskeletons require BTF at runtime (object %s)\n", + bpf_object__name(s->obj)); + return libbpf_err(-errno); + } + + err = populate_skeleton_maps(s->obj, s->maps, s->map_cnt); + if (err) { + pr_warn("failed to populate subskeleton maps: %d\n", err); + return libbpf_err(err); + } + + err = populate_skeleton_progs(s->obj, s->progs, s->prog_cnt); + if (err) { + pr_warn("failed to populate subskeleton maps: %d\n", err); + return libbpf_err(err); + } + + for (var_idx = 0; var_idx < s->var_cnt; var_idx++) { + var_skel = &s->vars[var_idx]; + map = *var_skel->map; + map_type_id = bpf_map__btf_value_type_id(map); + map_type = btf__type_by_id(btf, map_type_id); + + if (!btf_is_datasec(map_type)) { + pr_warn("type for map '%1$s' is not a datasec: %2$s", + bpf_map__name(map), + __btf_kind_str(btf_kind(map_type))); + return libbpf_err(-EINVAL); + } + + len = btf_vlen(map_type); + var = btf_var_secinfos(map_type); + for (i = 0; i < len; i++, var++) { + var_type = btf__type_by_id(btf, var->type); + var_name = btf__name_by_offset(btf, var_type->name_off); + if (strcmp(var_name, var_skel->name) == 0) { + *var_skel->addr = map->mmaped + var->offset; + break; + } + } + } + return 0; +} + +void bpf_object__destroy_subskeleton(struct bpf_object_subskeleton *s) +{ + if (!s) + return; + free(s->maps); + free(s->progs); + free(s->vars); + free(s); +} + +int bpf_object__load_skeleton(struct bpf_object_skeleton *s) +{ + int i, err; + + err = bpf_object__load(*s->obj); + if (err) { + pr_warn("failed to load BPF skeleton '%s': %d\n", s->name, err); + return libbpf_err(err); + } + + for (i = 0; i < s->map_cnt; i++) { + struct bpf_map *map = *s->maps[i].map; + size_t mmap_sz = bpf_map_mmap_sz(map); + int prot, map_fd = bpf_map__fd(map); + void **mmaped = s->maps[i].mmaped; + + if (!mmaped) + continue; + + if (!(map->def.map_flags & BPF_F_MMAPABLE)) { + *mmaped = NULL; + continue; + } + + if (map->def.map_flags & BPF_F_RDONLY_PROG) + prot = PROT_READ; + else + prot = PROT_READ | PROT_WRITE; + + /* Remap anonymous mmap()-ed "map initialization image" as + * a BPF map-backed mmap()-ed memory, but preserving the same + * memory address. This will cause kernel to change process' + * page table to point to a different piece of kernel memory, + * but from userspace point of view memory address (and its + * contents, being identical at this point) will stay the + * same. This mapping will be released by bpf_object__close() + * as per normal clean up procedure, so we don't need to worry + * about it from skeleton's clean up perspective. + */ + *mmaped = mmap(map->mmaped, mmap_sz, prot, + MAP_SHARED | MAP_FIXED, map_fd, 0); + if (*mmaped == MAP_FAILED) { + err = -errno; + *mmaped = NULL; + pr_warn("failed to re-mmap() map '%s': %d\n", + bpf_map__name(map), err); + return libbpf_err(err); + } + } + + return 0; +} + +int bpf_object__attach_skeleton(struct bpf_object_skeleton *s) +{ + int i, err; + + for (i = 0; i < s->prog_cnt; i++) { + struct bpf_program *prog = *s->progs[i].prog; + struct bpf_link **link = s->progs[i].link; + + if (!prog->autoload || !prog->autoattach) + continue; + + /* auto-attaching not supported for this program */ + if (!prog->sec_def || !prog->sec_def->prog_attach_fn) + continue; + + /* if user already set the link manually, don't attempt auto-attach */ + if (*link) + continue; + + err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, link); + if (err) { + pr_warn("prog '%s': failed to auto-attach: %d\n", + bpf_program__name(prog), err); + return libbpf_err(err); + } + + /* It's possible that for some SEC() definitions auto-attach + * is supported in some cases (e.g., if definition completely + * specifies target information), but is not in other cases. + * SEC("uprobe") is one such case. If user specified target + * binary and function name, such BPF program can be + * auto-attached. But if not, it shouldn't trigger skeleton's + * attach to fail. It should just be skipped. + * attach_fn signals such case with returning 0 (no error) and + * setting link to NULL. + */ + } + + return 0; +} + +void bpf_object__detach_skeleton(struct bpf_object_skeleton *s) +{ + int i; + + for (i = 0; i < s->prog_cnt; i++) { + struct bpf_link **link = s->progs[i].link; + + bpf_link__destroy(*link); + *link = NULL; + } +} + +void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s) +{ + if (!s) + return; + + if (s->progs) + bpf_object__detach_skeleton(s); + if (s->obj) + bpf_object__close(*s->obj); + free(s->maps); + free(s->progs); + free(s); +} diff --git a/libbpf/src/libbpf.h b/libbpf/src/libbpf.h new file mode 100644 index 0000000..1615e55 --- /dev/null +++ b/libbpf/src/libbpf.h @@ -0,0 +1,1654 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Common eBPF ELF object loading operations. + * + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + */ +#ifndef __LIBBPF_LIBBPF_H +#define __LIBBPF_LIBBPF_H + +#include +#include +#include +#include +#include // for size_t +#include + +#include "libbpf_common.h" +#include "libbpf_legacy.h" + +#ifdef __cplusplus +extern "C" { +#endif + +LIBBPF_API __u32 libbpf_major_version(void); +LIBBPF_API __u32 libbpf_minor_version(void); +LIBBPF_API const char *libbpf_version_string(void); + +enum libbpf_errno { + __LIBBPF_ERRNO__START = 4000, + + /* Something wrong in libelf */ + LIBBPF_ERRNO__LIBELF = __LIBBPF_ERRNO__START, + LIBBPF_ERRNO__FORMAT, /* BPF object format invalid */ + LIBBPF_ERRNO__KVERSION, /* Incorrect or no 'version' section */ + LIBBPF_ERRNO__ENDIAN, /* Endian mismatch */ + LIBBPF_ERRNO__INTERNAL, /* Internal error in libbpf */ + LIBBPF_ERRNO__RELOC, /* Relocation failed */ + LIBBPF_ERRNO__LOAD, /* Load program failure for unknown reason */ + LIBBPF_ERRNO__VERIFY, /* Kernel verifier blocks program loading */ + LIBBPF_ERRNO__PROG2BIG, /* Program too big */ + LIBBPF_ERRNO__KVER, /* Incorrect kernel version */ + LIBBPF_ERRNO__PROGTYPE, /* Kernel doesn't support this program type */ + LIBBPF_ERRNO__WRNGPID, /* Wrong pid in netlink message */ + LIBBPF_ERRNO__INVSEQ, /* Invalid netlink sequence */ + LIBBPF_ERRNO__NLPARSE, /* netlink parsing error */ + __LIBBPF_ERRNO__END, +}; + +LIBBPF_API int libbpf_strerror(int err, char *buf, size_t size); + +/** + * @brief **libbpf_bpf_attach_type_str()** converts the provided attach type + * value into a textual representation. + * @param t The attach type. + * @return Pointer to a static string identifying the attach type. NULL is + * returned for unknown **bpf_attach_type** values. + */ +LIBBPF_API const char *libbpf_bpf_attach_type_str(enum bpf_attach_type t); + +/** + * @brief **libbpf_bpf_link_type_str()** converts the provided link type value + * into a textual representation. + * @param t The link type. + * @return Pointer to a static string identifying the link type. NULL is + * returned for unknown **bpf_link_type** values. + */ +LIBBPF_API const char *libbpf_bpf_link_type_str(enum bpf_link_type t); + +/** + * @brief **libbpf_bpf_map_type_str()** converts the provided map type value + * into a textual representation. + * @param t The map type. + * @return Pointer to a static string identifying the map type. NULL is + * returned for unknown **bpf_map_type** values. + */ +LIBBPF_API const char *libbpf_bpf_map_type_str(enum bpf_map_type t); + +/** + * @brief **libbpf_bpf_prog_type_str()** converts the provided program type + * value into a textual representation. + * @param t The program type. + * @return Pointer to a static string identifying the program type. NULL is + * returned for unknown **bpf_prog_type** values. + */ +LIBBPF_API const char *libbpf_bpf_prog_type_str(enum bpf_prog_type t); + +enum libbpf_print_level { + LIBBPF_WARN, + LIBBPF_INFO, + LIBBPF_DEBUG, +}; + +typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level, + const char *, va_list ap); + +/** + * @brief **libbpf_set_print()** sets user-provided log callback function to + * be used for libbpf warnings and informational messages. + * @param fn The log print function. If NULL, libbpf won't print anything. + * @return Pointer to old print function. + */ +LIBBPF_API libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn); + +/* Hide internal to user */ +struct bpf_object; + +struct bpf_object_open_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* object name override, if provided: + * - for object open from file, this will override setting object + * name from file path's base name; + * - for object open from memory buffer, this will specify an object + * name and will override default "-" name; + */ + const char *object_name; + /* parse map definitions non-strictly, allowing extra attributes/data */ + bool relaxed_maps; + /* maps that set the 'pinning' attribute in their definition will have + * their pin_path attribute set to a file in this directory, and be + * auto-pinned to that path on load; defaults to "/sys/fs/bpf". + */ + const char *pin_root_path; + + __u32 :32; /* stub out now removed attach_prog_fd */ + + /* Additional kernel config content that augments and overrides + * system Kconfig for CONFIG_xxx externs. + */ + const char *kconfig; + /* Path to the custom BTF to be used for BPF CO-RE relocations. + * This custom BTF completely replaces the use of vmlinux BTF + * for the purpose of CO-RE relocations. + * NOTE: any other BPF feature (e.g., fentry/fexit programs, + * struct_ops, etc) will need actual kernel BTF at /sys/kernel/btf/vmlinux. + */ + const char *btf_custom_path; + /* Pointer to a buffer for storing kernel logs for applicable BPF + * commands. Valid kernel_log_size has to be specified as well and are + * passed-through to bpf() syscall. Keep in mind that kernel might + * fail operation with -ENOSPC error if provided buffer is too small + * to contain entire log output. + * See the comment below for kernel_log_level for interaction between + * log_buf and log_level settings. + * + * If specified, this log buffer will be passed for: + * - each BPF progral load (BPF_PROG_LOAD) attempt, unless overriden + * with bpf_program__set_log() on per-program level, to get + * BPF verifier log output. + * - during BPF object's BTF load into kernel (BPF_BTF_LOAD) to get + * BTF sanity checking log. + * + * Each BPF command (BPF_BTF_LOAD or BPF_PROG_LOAD) will overwrite + * previous contents, so if you need more fine-grained control, set + * per-program buffer with bpf_program__set_log_buf() to preserve each + * individual program's verification log. Keep using kernel_log_buf + * for BTF verification log, if necessary. + */ + char *kernel_log_buf; + size_t kernel_log_size; + /* + * Log level can be set independently from log buffer. Log_level=0 + * means that libbpf will attempt loading BTF or program without any + * logging requested, but will retry with either its own or custom log + * buffer, if provided, and log_level=1 on any error. + * And vice versa, setting log_level>0 will request BTF or prog + * loading with verbose log from the first attempt (and as such also + * for successfully loaded BTF or program), and the actual log buffer + * could be either libbpf's own auto-allocated log buffer, if + * kernel_log_buffer is NULL, or user-provided custom kernel_log_buf. + * If user didn't provide custom log buffer, libbpf will emit captured + * logs through its print callback. + */ + __u32 kernel_log_level; + + size_t :0; +}; +#define bpf_object_open_opts__last_field kernel_log_level + +/** + * @brief **bpf_object__open()** creates a bpf_object by opening + * the BPF ELF object file pointed to by the passed path and loading it + * into memory. + * @param path BPF object file path. + * @return pointer to the new bpf_object; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_object *bpf_object__open(const char *path); + +/** + * @brief **bpf_object__open_file()** creates a bpf_object by opening + * the BPF ELF object file pointed to by the passed path and loading it + * into memory. + * @param path BPF object file path + * @param opts options for how to load the bpf object, this parameter is + * optional and can be set to NULL + * @return pointer to the new bpf_object; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_object * +bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts); + +/** + * @brief **bpf_object__open_mem()** creates a bpf_object by reading + * the BPF objects raw bytes from a memory buffer containing a valid + * BPF ELF object file. + * @param obj_buf pointer to the buffer containing ELF file bytes + * @param obj_buf_sz number of bytes in the buffer + * @param opts options for how to load the bpf object + * @return pointer to the new bpf_object; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_object * +bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, + const struct bpf_object_open_opts *opts); + +/** + * @brief **bpf_object__load()** loads BPF object into kernel. + * @param obj Pointer to a valid BPF object instance returned by + * **bpf_object__open*()** APIs + * @return 0, on success; negative error code, otherwise, error code is + * stored in errno + */ +LIBBPF_API int bpf_object__load(struct bpf_object *obj); + +/** + * @brief **bpf_object__close()** closes a BPF object and releases all + * resources. + * @param obj Pointer to a valid BPF object + */ +LIBBPF_API void bpf_object__close(struct bpf_object *obj); + +/** + * @brief **bpf_object__pin_maps()** pins each map contained within + * the BPF object at the passed directory. + * @param obj Pointer to a valid BPF object + * @param path A directory where maps should be pinned. + * @return 0, on success; negative error code, otherwise + * + * If `path` is NULL `bpf_map__pin` (which is being used on each map) + * will use the pin_path attribute of each map. In this case, maps that + * don't have a pin_path set will be ignored. + */ +LIBBPF_API int bpf_object__pin_maps(struct bpf_object *obj, const char *path); + +/** + * @brief **bpf_object__unpin_maps()** unpins each map contained within + * the BPF object found in the passed directory. + * @param obj Pointer to a valid BPF object + * @param path A directory where pinned maps should be searched for. + * @return 0, on success; negative error code, otherwise + * + * If `path` is NULL `bpf_map__unpin` (which is being used on each map) + * will use the pin_path attribute of each map. In this case, maps that + * don't have a pin_path set will be ignored. + */ +LIBBPF_API int bpf_object__unpin_maps(struct bpf_object *obj, + const char *path); +LIBBPF_API int bpf_object__pin_programs(struct bpf_object *obj, + const char *path); +LIBBPF_API int bpf_object__unpin_programs(struct bpf_object *obj, + const char *path); +LIBBPF_API int bpf_object__pin(struct bpf_object *object, const char *path); + +LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj); +LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj); +LIBBPF_API int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version); + +struct btf; +LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj); +LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj); + +LIBBPF_API struct bpf_program * +bpf_object__find_program_by_name(const struct bpf_object *obj, + const char *name); + +LIBBPF_API int +libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, + enum bpf_attach_type *expected_attach_type); +LIBBPF_API int libbpf_attach_type_by_name(const char *name, + enum bpf_attach_type *attach_type); +LIBBPF_API int libbpf_find_vmlinux_btf_id(const char *name, + enum bpf_attach_type attach_type); + +/* Accessors of bpf_program */ +struct bpf_program; + +LIBBPF_API struct bpf_program * +bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prog); + +#define bpf_object__for_each_program(pos, obj) \ + for ((pos) = bpf_object__next_program((obj), NULL); \ + (pos) != NULL; \ + (pos) = bpf_object__next_program((obj), (pos))) + +LIBBPF_API struct bpf_program * +bpf_object__prev_program(const struct bpf_object *obj, struct bpf_program *prog); + +LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog, + __u32 ifindex); + +LIBBPF_API const char *bpf_program__name(const struct bpf_program *prog); +LIBBPF_API const char *bpf_program__section_name(const struct bpf_program *prog); +LIBBPF_API bool bpf_program__autoload(const struct bpf_program *prog); +LIBBPF_API int bpf_program__set_autoload(struct bpf_program *prog, bool autoload); +LIBBPF_API bool bpf_program__autoattach(const struct bpf_program *prog); +LIBBPF_API void bpf_program__set_autoattach(struct bpf_program *prog, bool autoattach); + +struct bpf_insn; + +/** + * @brief **bpf_program__insns()** gives read-only access to BPF program's + * underlying BPF instructions. + * @param prog BPF program for which to return instructions + * @return a pointer to an array of BPF instructions that belong to the + * specified BPF program + * + * Returned pointer is always valid and not NULL. Number of `struct bpf_insn` + * pointed to can be fetched using **bpf_program__insn_cnt()** API. + * + * Keep in mind, libbpf can modify and append/delete BPF program's + * instructions as it processes BPF object file and prepares everything for + * uploading into the kernel. So depending on the point in BPF object + * lifetime, **bpf_program__insns()** can return different sets of + * instructions. As an example, during BPF object load phase BPF program + * instructions will be CO-RE-relocated, BPF subprograms instructions will be + * appended, ldimm64 instructions will have FDs embedded, etc. So instructions + * returned before **bpf_object__load()** and after it might be quite + * different. + */ +LIBBPF_API const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog); + +/** + * @brief **bpf_program__set_insns()** can set BPF program's underlying + * BPF instructions. + * + * WARNING: This is a very advanced libbpf API and users need to know + * what they are doing. This should be used from prog_prepare_load_fn + * callback only. + * + * @param prog BPF program for which to return instructions + * @param new_insns a pointer to an array of BPF instructions + * @param new_insn_cnt number of `struct bpf_insn`'s that form + * specified BPF program + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_program__set_insns(struct bpf_program *prog, + struct bpf_insn *new_insns, size_t new_insn_cnt); + +/** + * @brief **bpf_program__insn_cnt()** returns number of `struct bpf_insn`'s + * that form specified BPF program. + * @param prog BPF program for which to return number of BPF instructions + * + * See **bpf_program__insns()** documentation for notes on how libbpf can + * change instructions and their count during different phases of + * **bpf_object** lifetime. + */ +LIBBPF_API size_t bpf_program__insn_cnt(const struct bpf_program *prog); + +LIBBPF_API int bpf_program__fd(const struct bpf_program *prog); + +/** + * @brief **bpf_program__pin()** pins the BPF program to a file + * in the BPF FS specified by a path. This increments the programs + * reference count, allowing it to stay loaded after the process + * which loaded it has exited. + * + * @param prog BPF program to pin, must already be loaded + * @param path file path in a BPF file system + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_program__pin(struct bpf_program *prog, const char *path); + +/** + * @brief **bpf_program__unpin()** unpins the BPF program from a file + * in the BPFFS specified by a path. This decrements the programs + * reference count. + * + * The file pinning the BPF program can also be unlinked by a different + * process in which case this function will return an error. + * + * @param prog BPF program to unpin + * @param path file path to the pin in a BPF file system + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_program__unpin(struct bpf_program *prog, const char *path); +LIBBPF_API void bpf_program__unload(struct bpf_program *prog); + +struct bpf_link; + +LIBBPF_API struct bpf_link *bpf_link__open(const char *path); +LIBBPF_API int bpf_link__fd(const struct bpf_link *link); +LIBBPF_API const char *bpf_link__pin_path(const struct bpf_link *link); +/** + * @brief **bpf_link__pin()** pins the BPF link to a file + * in the BPF FS specified by a path. This increments the links + * reference count, allowing it to stay loaded after the process + * which loaded it has exited. + * + * @param link BPF link to pin, must already be loaded + * @param path file path in a BPF file system + * @return 0, on success; negative error code, otherwise + */ + +LIBBPF_API int bpf_link__pin(struct bpf_link *link, const char *path); + +/** + * @brief **bpf_link__unpin()** unpins the BPF link from a file + * in the BPFFS specified by a path. This decrements the links + * reference count. + * + * The file pinning the BPF link can also be unlinked by a different + * process in which case this function will return an error. + * + * @param prog BPF program to unpin + * @param path file path to the pin in a BPF file system + * @return 0, on success; negative error code, otherwise + */ +LIBBPF_API int bpf_link__unpin(struct bpf_link *link); +LIBBPF_API int bpf_link__update_program(struct bpf_link *link, + struct bpf_program *prog); +LIBBPF_API void bpf_link__disconnect(struct bpf_link *link); +LIBBPF_API int bpf_link__detach(struct bpf_link *link); +LIBBPF_API int bpf_link__destroy(struct bpf_link *link); + +/** + * @brief **bpf_program__attach()** is a generic function for attaching + * a BPF program based on auto-detection of program type, attach type, + * and extra paremeters, where applicable. + * + * @param prog BPF program to attach + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + * + * This is supported for: + * - kprobe/kretprobe (depends on SEC() definition) + * - uprobe/uretprobe (depends on SEC() definition) + * - tracepoint + * - raw tracepoint + * - tracing programs (typed raw TP/fentry/fexit/fmod_ret) + */ +LIBBPF_API struct bpf_link * +bpf_program__attach(const struct bpf_program *prog); + +struct bpf_perf_event_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* don't use BPF link when attach BPF program */ + bool force_ioctl_attach; + size_t :0; +}; +#define bpf_perf_event_opts__last_field force_ioctl_attach + +LIBBPF_API struct bpf_link * +bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd); + +LIBBPF_API struct bpf_link * +bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd, + const struct bpf_perf_event_opts *opts); + +/** + * enum probe_attach_mode - the mode to attach kprobe/uprobe + * + * force libbpf to attach kprobe/uprobe in specific mode, -ENOTSUP will + * be returned if it is not supported by the kernel. + */ +enum probe_attach_mode { + /* attach probe in latest supported mode by kernel */ + PROBE_ATTACH_MODE_DEFAULT = 0, + /* attach probe in legacy mode, using debugfs/tracefs */ + PROBE_ATTACH_MODE_LEGACY, + /* create perf event with perf_event_open() syscall */ + PROBE_ATTACH_MODE_PERF, + /* attach probe with BPF link */ + PROBE_ATTACH_MODE_LINK, +}; + +struct bpf_kprobe_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* function's offset to install kprobe to */ + size_t offset; + /* kprobe is return probe */ + bool retprobe; + /* kprobe attach mode */ + enum probe_attach_mode attach_mode; + size_t :0; +}; +#define bpf_kprobe_opts__last_field attach_mode + +LIBBPF_API struct bpf_link * +bpf_program__attach_kprobe(const struct bpf_program *prog, bool retprobe, + const char *func_name); +LIBBPF_API struct bpf_link * +bpf_program__attach_kprobe_opts(const struct bpf_program *prog, + const char *func_name, + const struct bpf_kprobe_opts *opts); + +struct bpf_kprobe_multi_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* array of function symbols to attach */ + const char **syms; + /* array of function addresses to attach */ + const unsigned long *addrs; + /* array of user-provided values fetchable through bpf_get_attach_cookie */ + const __u64 *cookies; + /* number of elements in syms/addrs/cookies arrays */ + size_t cnt; + /* create return kprobes */ + bool retprobe; + size_t :0; +}; + +#define bpf_kprobe_multi_opts__last_field retprobe + +LIBBPF_API struct bpf_link * +bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, + const char *pattern, + const struct bpf_kprobe_multi_opts *opts); + +struct bpf_ksyscall_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* attach as return probe? */ + bool retprobe; + size_t :0; +}; +#define bpf_ksyscall_opts__last_field retprobe + +/** + * @brief **bpf_program__attach_ksyscall()** attaches a BPF program + * to kernel syscall handler of a specified syscall. Optionally it's possible + * to request to install retprobe that will be triggered at syscall exit. It's + * also possible to associate BPF cookie (though options). + * + * Libbpf automatically will determine correct full kernel function name, + * which depending on system architecture and kernel version/configuration + * could be of the form ___sys_ or __se_sys_, and will + * attach specified program using kprobe/kretprobe mechanism. + * + * **bpf_program__attach_ksyscall()** is an API counterpart of declarative + * **SEC("ksyscall/")** annotation of BPF programs. + * + * At the moment **SEC("ksyscall")** and **bpf_program__attach_ksyscall()** do + * not handle all the calling convention quirks for mmap(), clone() and compat + * syscalls. It also only attaches to "native" syscall interfaces. If host + * system supports compat syscalls or defines 32-bit syscalls in 64-bit + * kernel, such syscall interfaces won't be attached to by libbpf. + * + * These limitations may or may not change in the future. Therefore it is + * recommended to use SEC("kprobe") for these syscalls or if working with + * compat and 32-bit interfaces is required. + * + * @param prog BPF program to attach + * @param syscall_name Symbolic name of the syscall (e.g., "bpf") + * @param opts Additional options (see **struct bpf_ksyscall_opts**) + * @return Reference to the newly created BPF link; or NULL is returned on + * error, error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_ksyscall(const struct bpf_program *prog, + const char *syscall_name, + const struct bpf_ksyscall_opts *opts); + +struct bpf_uprobe_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* offset of kernel reference counted USDT semaphore, added in + * a6ca88b241d5 ("trace_uprobe: support reference counter in fd-based uprobe") + */ + size_t ref_ctr_offset; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; + /* uprobe is return probe, invoked at function return time */ + bool retprobe; + /* Function name to attach to. Could be an unqualified ("abc") or library-qualified + * "abc@LIBXYZ" name. To specify function entry, func_name should be set while + * func_offset argument to bpf_prog__attach_uprobe_opts() should be 0. To trace an + * offset within a function, specify func_name and use func_offset argument to specify + * offset within the function. Shared library functions must specify the shared library + * binary_path. + */ + const char *func_name; + /* uprobe attach mode */ + enum probe_attach_mode attach_mode; + size_t :0; +}; +#define bpf_uprobe_opts__last_field attach_mode + +/** + * @brief **bpf_program__attach_uprobe()** attaches a BPF program + * to the userspace function which is found by binary path and + * offset. You can optionally specify a particular proccess to attach + * to. You can also optionally attach the program to the function + * exit instead of entry. + * + * @param prog BPF program to attach + * @param retprobe Attach to function exit + * @param pid Process ID to attach the uprobe to, 0 for self (own process), + * -1 for all processes + * @param binary_path Path to binary that contains the function symbol + * @param func_offset Offset within the binary of the function symbol + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_uprobe(const struct bpf_program *prog, bool retprobe, + pid_t pid, const char *binary_path, + size_t func_offset); + +/** + * @brief **bpf_program__attach_uprobe_opts()** is just like + * bpf_program__attach_uprobe() except with a options struct + * for various configurations. + * + * @param prog BPF program to attach + * @param pid Process ID to attach the uprobe to, 0 for self (own process), + * -1 for all processes + * @param binary_path Path to binary that contains the function symbol + * @param func_offset Offset within the binary of the function symbol + * @param opts Options for altering program attachment + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, + const char *binary_path, size_t func_offset, + const struct bpf_uprobe_opts *opts); + +struct bpf_usdt_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value accessible through usdt_cookie() */ + __u64 usdt_cookie; + size_t :0; +}; +#define bpf_usdt_opts__last_field usdt_cookie + +/** + * @brief **bpf_program__attach_usdt()** is just like + * bpf_program__attach_uprobe_opts() except it covers USDT (User-space + * Statically Defined Tracepoint) attachment, instead of attaching to + * user-space function entry or exit. + * + * @param prog BPF program to attach + * @param pid Process ID to attach the uprobe to, 0 for self (own process), + * -1 for all processes + * @param binary_path Path to binary that contains provided USDT probe + * @param usdt_provider USDT provider name + * @param usdt_name USDT probe name + * @param opts Options for altering program attachment + * @return Reference to the newly created BPF link; or NULL is returned on error, + * error code is stored in errno + */ +LIBBPF_API struct bpf_link * +bpf_program__attach_usdt(const struct bpf_program *prog, + pid_t pid, const char *binary_path, + const char *usdt_provider, const char *usdt_name, + const struct bpf_usdt_opts *opts); + +struct bpf_tracepoint_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 bpf_cookie; +}; +#define bpf_tracepoint_opts__last_field bpf_cookie + +LIBBPF_API struct bpf_link * +bpf_program__attach_tracepoint(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name); +LIBBPF_API struct bpf_link * +bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, + const char *tp_category, + const char *tp_name, + const struct bpf_tracepoint_opts *opts); + +LIBBPF_API struct bpf_link * +bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, + const char *tp_name); + +struct bpf_trace_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* custom user-provided value fetchable through bpf_get_attach_cookie() */ + __u64 cookie; +}; +#define bpf_trace_opts__last_field cookie + +LIBBPF_API struct bpf_link * +bpf_program__attach_trace(const struct bpf_program *prog); +LIBBPF_API struct bpf_link * +bpf_program__attach_trace_opts(const struct bpf_program *prog, const struct bpf_trace_opts *opts); + +LIBBPF_API struct bpf_link * +bpf_program__attach_lsm(const struct bpf_program *prog); +LIBBPF_API struct bpf_link * +bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd); +LIBBPF_API struct bpf_link * +bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd); +LIBBPF_API struct bpf_link * +bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex); +LIBBPF_API struct bpf_link * +bpf_program__attach_freplace(const struct bpf_program *prog, + int target_fd, const char *attach_func_name); + +struct bpf_map; + +LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map); +LIBBPF_API int bpf_link__update_map(struct bpf_link *link, const struct bpf_map *map); + +struct bpf_iter_attach_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + union bpf_iter_link_info *link_info; + __u32 link_info_len; +}; +#define bpf_iter_attach_opts__last_field link_info_len + +LIBBPF_API struct bpf_link * +bpf_program__attach_iter(const struct bpf_program *prog, + const struct bpf_iter_attach_opts *opts); + +LIBBPF_API enum bpf_prog_type bpf_program__type(const struct bpf_program *prog); + +/** + * @brief **bpf_program__set_type()** sets the program + * type of the passed BPF program. + * @param prog BPF program to set the program type for + * @param type program type to set the BPF map to have + * @return error code; or 0 if no error. An error occurs + * if the object is already loaded. + * + * This must be called before the BPF object is loaded, + * otherwise it has no effect and an error is returned. + */ +LIBBPF_API int bpf_program__set_type(struct bpf_program *prog, + enum bpf_prog_type type); + +LIBBPF_API enum bpf_attach_type +bpf_program__expected_attach_type(const struct bpf_program *prog); + +/** + * @brief **bpf_program__set_expected_attach_type()** sets the + * attach type of the passed BPF program. This is used for + * auto-detection of attachment when programs are loaded. + * @param prog BPF program to set the attach type for + * @param type attach type to set the BPF map to have + * @return error code; or 0 if no error. An error occurs + * if the object is already loaded. + * + * This must be called before the BPF object is loaded, + * otherwise it has no effect and an error is returned. + */ +LIBBPF_API int +bpf_program__set_expected_attach_type(struct bpf_program *prog, + enum bpf_attach_type type); + +LIBBPF_API __u32 bpf_program__flags(const struct bpf_program *prog); +LIBBPF_API int bpf_program__set_flags(struct bpf_program *prog, __u32 flags); + +/* Per-program log level and log buffer getters/setters. + * See bpf_object_open_opts comments regarding log_level and log_buf + * interactions. + */ +LIBBPF_API __u32 bpf_program__log_level(const struct bpf_program *prog); +LIBBPF_API int bpf_program__set_log_level(struct bpf_program *prog, __u32 log_level); +LIBBPF_API const char *bpf_program__log_buf(const struct bpf_program *prog, size_t *log_size); +LIBBPF_API int bpf_program__set_log_buf(struct bpf_program *prog, char *log_buf, size_t log_size); + +/** + * @brief **bpf_program__set_attach_target()** sets BTF-based attach target + * for supported BPF program types: + * - BTF-aware raw tracepoints (tp_btf); + * - fentry/fexit/fmod_ret; + * - lsm; + * - freplace. + * @param prog BPF program to set the attach type for + * @param type attach type to set the BPF map to have + * @return error code; or 0 if no error occurred. + */ +LIBBPF_API int +bpf_program__set_attach_target(struct bpf_program *prog, int attach_prog_fd, + const char *attach_func_name); + +/** + * @brief **bpf_object__find_map_by_name()** returns BPF map of + * the given name, if it exists within the passed BPF object + * @param obj BPF object + * @param name name of the BPF map + * @return BPF map instance, if such map exists within the BPF object; + * or NULL otherwise. + */ +LIBBPF_API struct bpf_map * +bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name); + +LIBBPF_API int +bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name); + +LIBBPF_API struct bpf_map * +bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *map); + +#define bpf_object__for_each_map(pos, obj) \ + for ((pos) = bpf_object__next_map((obj), NULL); \ + (pos) != NULL; \ + (pos) = bpf_object__next_map((obj), (pos))) +#define bpf_map__for_each bpf_object__for_each_map + +LIBBPF_API struct bpf_map * +bpf_object__prev_map(const struct bpf_object *obj, const struct bpf_map *map); + +/** + * @brief **bpf_map__set_autocreate()** sets whether libbpf has to auto-create + * BPF map during BPF object load phase. + * @param map the BPF map instance + * @param autocreate whether to create BPF map during BPF object load + * @return 0 on success; -EBUSY if BPF object was already loaded + * + * **bpf_map__set_autocreate()** allows to opt-out from libbpf auto-creating + * BPF map. By default, libbpf will attempt to create every single BPF map + * defined in BPF object file using BPF_MAP_CREATE command of bpf() syscall + * and fill in map FD in BPF instructions. + * + * This API allows to opt-out of this process for specific map instance. This + * can be useful if host kernel doesn't support such BPF map type or used + * combination of flags and user application wants to avoid creating such + * a map in the first place. User is still responsible to make sure that their + * BPF-side code that expects to use such missing BPF map is recognized by BPF + * verifier as dead code, otherwise BPF verifier will reject such BPF program. + */ +LIBBPF_API int bpf_map__set_autocreate(struct bpf_map *map, bool autocreate); +LIBBPF_API bool bpf_map__autocreate(const struct bpf_map *map); + +/** + * @brief **bpf_map__fd()** gets the file descriptor of the passed + * BPF map + * @param map the BPF map instance + * @return the file descriptor; or -EINVAL in case of an error + */ +LIBBPF_API int bpf_map__fd(const struct bpf_map *map); +LIBBPF_API int bpf_map__reuse_fd(struct bpf_map *map, int fd); +/* get map name */ +LIBBPF_API const char *bpf_map__name(const struct bpf_map *map); +/* get/set map type */ +LIBBPF_API enum bpf_map_type bpf_map__type(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type); +/* get/set map size (max_entries) */ +LIBBPF_API __u32 bpf_map__max_entries(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries); +/* get/set map flags */ +LIBBPF_API __u32 bpf_map__map_flags(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags); +/* get/set map NUMA node */ +LIBBPF_API __u32 bpf_map__numa_node(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node); +/* get/set map key size */ +LIBBPF_API __u32 bpf_map__key_size(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_key_size(struct bpf_map *map, __u32 size); +/* get/set map value size */ +LIBBPF_API __u32 bpf_map__value_size(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_value_size(struct bpf_map *map, __u32 size); +/* get map key/value BTF type IDs */ +LIBBPF_API __u32 bpf_map__btf_key_type_id(const struct bpf_map *map); +LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map); +/* get/set map if_index */ +LIBBPF_API __u32 bpf_map__ifindex(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex); +/* get/set map map_extra flags */ +LIBBPF_API __u64 bpf_map__map_extra(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_map_extra(struct bpf_map *map, __u64 map_extra); + +LIBBPF_API int bpf_map__set_initial_value(struct bpf_map *map, + const void *data, size_t size); +LIBBPF_API const void *bpf_map__initial_value(struct bpf_map *map, size_t *psize); + +/** + * @brief **bpf_map__is_internal()** tells the caller whether or not the + * passed map is a special map created by libbpf automatically for things like + * global variables, __ksym externs, Kconfig values, etc + * @param map the bpf_map + * @return true, if the map is an internal map; false, otherwise + */ +LIBBPF_API bool bpf_map__is_internal(const struct bpf_map *map); + +/** + * @brief **bpf_map__set_pin_path()** sets the path attribute that tells where the + * BPF map should be pinned. This does not actually create the 'pin'. + * @param map The bpf_map + * @param path The path + * @return 0, on success; negative error, otherwise + */ +LIBBPF_API int bpf_map__set_pin_path(struct bpf_map *map, const char *path); + +/** + * @brief **bpf_map__pin_path()** gets the path attribute that tells where the + * BPF map should be pinned. + * @param map The bpf_map + * @return The path string; which can be NULL + */ +LIBBPF_API const char *bpf_map__pin_path(const struct bpf_map *map); + +/** + * @brief **bpf_map__is_pinned()** tells the caller whether or not the + * passed map has been pinned via a 'pin' file. + * @param map The bpf_map + * @return true, if the map is pinned; false, otherwise + */ +LIBBPF_API bool bpf_map__is_pinned(const struct bpf_map *map); + +/** + * @brief **bpf_map__pin()** creates a file that serves as a 'pin' + * for the BPF map. This increments the reference count on the + * BPF map which will keep the BPF map loaded even after the + * userspace process which loaded it has exited. + * @param map The bpf_map to pin + * @param path A file path for the 'pin' + * @return 0, on success; negative error, otherwise + * + * If `path` is NULL the maps `pin_path` attribute will be used. If this is + * also NULL, an error will be returned and the map will not be pinned. + */ +LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path); + +/** + * @brief **bpf_map__unpin()** removes the file that serves as a + * 'pin' for the BPF map. + * @param map The bpf_map to unpin + * @param path A file path for the 'pin' + * @return 0, on success; negative error, otherwise + * + * The `path` parameter can be NULL, in which case the `pin_path` + * map attribute is unpinned. If both the `path` parameter and + * `pin_path` map attribute are set, they must be equal. + */ +LIBBPF_API int bpf_map__unpin(struct bpf_map *map, const char *path); + +LIBBPF_API int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd); +LIBBPF_API struct bpf_map *bpf_map__inner_map(struct bpf_map *map); + +/** + * @brief **bpf_map__lookup_elem()** allows to lookup BPF map value + * corresponding to provided key. + * @param map BPF map to lookup element in + * @param key pointer to memory containing bytes of the key used for lookup + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @param value pointer to memory in which looked up value will be stored + * @param value_sz size in byte of value data memory; it has to match BPF map + * definition's **value_size**. For per-CPU BPF maps value size has to be + * a product of BPF map value size and number of possible CPUs in the system + * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for + * per-CPU values value size has to be aligned up to closest 8 bytes for + * alignment reasons, so expected size is: `round_up(value_size, 8) + * * libbpf_num_possible_cpus()`. + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__lookup_elem()** is high-level equivalent of + * **bpf_map_lookup_elem()** API with added check for key and value size. + */ +LIBBPF_API int bpf_map__lookup_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags); + +/** + * @brief **bpf_map__update_elem()** allows to insert or update value in BPF + * map that corresponds to provided key. + * @param map BPF map to insert to or update element in + * @param key pointer to memory containing bytes of the key + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @param value pointer to memory containing bytes of the value + * @param value_sz size in byte of value data memory; it has to match BPF map + * definition's **value_size**. For per-CPU BPF maps value size has to be + * a product of BPF map value size and number of possible CPUs in the system + * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for + * per-CPU values value size has to be aligned up to closest 8 bytes for + * alignment reasons, so expected size is: `round_up(value_size, 8) + * * libbpf_num_possible_cpus()`. + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__update_elem()** is high-level equivalent of + * **bpf_map_update_elem()** API with added check for key and value size. + */ +LIBBPF_API int bpf_map__update_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + const void *value, size_t value_sz, __u64 flags); + +/** + * @brief **bpf_map__delete_elem()** allows to delete element in BPF map that + * corresponds to provided key. + * @param map BPF map to delete element from + * @param key pointer to memory containing bytes of the key + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__delete_elem()** is high-level equivalent of + * **bpf_map_delete_elem()** API with added check for key size. + */ +LIBBPF_API int bpf_map__delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, __u64 flags); + +/** + * @brief **bpf_map__lookup_and_delete_elem()** allows to lookup BPF map value + * corresponding to provided key and atomically delete it afterwards. + * @param map BPF map to lookup element in + * @param key pointer to memory containing bytes of the key used for lookup + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @param value pointer to memory in which looked up value will be stored + * @param value_sz size in byte of value data memory; it has to match BPF map + * definition's **value_size**. For per-CPU BPF maps value size has to be + * a product of BPF map value size and number of possible CPUs in the system + * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for + * per-CPU values value size has to be aligned up to closest 8 bytes for + * alignment reasons, so expected size is: `round_up(value_size, 8) + * * libbpf_num_possible_cpus()`. + * @flags extra flags passed to kernel for this operation + * @return 0, on success; negative error, otherwise + * + * **bpf_map__lookup_and_delete_elem()** is high-level equivalent of + * **bpf_map_lookup_and_delete_elem()** API with added check for key and value size. + */ +LIBBPF_API int bpf_map__lookup_and_delete_elem(const struct bpf_map *map, + const void *key, size_t key_sz, + void *value, size_t value_sz, __u64 flags); + +/** + * @brief **bpf_map__get_next_key()** allows to iterate BPF map keys by + * fetching next key that follows current key. + * @param map BPF map to fetch next key from + * @param cur_key pointer to memory containing bytes of current key or NULL to + * fetch the first key + * @param next_key pointer to memory to write next key into + * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** + * @return 0, on success; -ENOENT if **cur_key** is the last key in BPF map; + * negative error, otherwise + * + * **bpf_map__get_next_key()** is high-level equivalent of + * **bpf_map_get_next_key()** API with added check for key size. + */ +LIBBPF_API int bpf_map__get_next_key(const struct bpf_map *map, + const void *cur_key, void *next_key, size_t key_sz); + +struct bpf_xdp_set_link_opts { + size_t sz; + int old_fd; + size_t :0; +}; +#define bpf_xdp_set_link_opts__last_field old_fd + +struct bpf_xdp_attach_opts { + size_t sz; + int old_prog_fd; + size_t :0; +}; +#define bpf_xdp_attach_opts__last_field old_prog_fd + +struct bpf_xdp_query_opts { + size_t sz; + __u32 prog_id; /* output */ + __u32 drv_prog_id; /* output */ + __u32 hw_prog_id; /* output */ + __u32 skb_prog_id; /* output */ + __u8 attach_mode; /* output */ + __u64 feature_flags; /* output */ + size_t :0; +}; +#define bpf_xdp_query_opts__last_field feature_flags + +LIBBPF_API int bpf_xdp_attach(int ifindex, int prog_fd, __u32 flags, + const struct bpf_xdp_attach_opts *opts); +LIBBPF_API int bpf_xdp_detach(int ifindex, __u32 flags, + const struct bpf_xdp_attach_opts *opts); +LIBBPF_API int bpf_xdp_query(int ifindex, int flags, struct bpf_xdp_query_opts *opts); +LIBBPF_API int bpf_xdp_query_id(int ifindex, int flags, __u32 *prog_id); + +/* TC related API */ +enum bpf_tc_attach_point { + BPF_TC_INGRESS = 1 << 0, + BPF_TC_EGRESS = 1 << 1, + BPF_TC_CUSTOM = 1 << 2, +}; + +#define BPF_TC_PARENT(a, b) \ + ((((a) << 16) & 0xFFFF0000U) | ((b) & 0x0000FFFFU)) + +enum bpf_tc_flags { + BPF_TC_F_REPLACE = 1 << 0, +}; + +struct bpf_tc_hook { + size_t sz; + int ifindex; + enum bpf_tc_attach_point attach_point; + __u32 parent; + size_t :0; +}; +#define bpf_tc_hook__last_field parent + +struct bpf_tc_opts { + size_t sz; + int prog_fd; + __u32 flags; + __u32 prog_id; + __u32 handle; + __u32 priority; + size_t :0; +}; +#define bpf_tc_opts__last_field priority + +LIBBPF_API int bpf_tc_hook_create(struct bpf_tc_hook *hook); +LIBBPF_API int bpf_tc_hook_destroy(struct bpf_tc_hook *hook); +LIBBPF_API int bpf_tc_attach(const struct bpf_tc_hook *hook, + struct bpf_tc_opts *opts); +LIBBPF_API int bpf_tc_detach(const struct bpf_tc_hook *hook, + const struct bpf_tc_opts *opts); +LIBBPF_API int bpf_tc_query(const struct bpf_tc_hook *hook, + struct bpf_tc_opts *opts); + +/* Ring buffer APIs */ +struct ring_buffer; +struct user_ring_buffer; + +typedef int (*ring_buffer_sample_fn)(void *ctx, void *data, size_t size); + +struct ring_buffer_opts { + size_t sz; /* size of this struct, for forward/backward compatibility */ +}; + +#define ring_buffer_opts__last_field sz + +LIBBPF_API struct ring_buffer * +ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx, + const struct ring_buffer_opts *opts); +LIBBPF_API void ring_buffer__free(struct ring_buffer *rb); +LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd, + ring_buffer_sample_fn sample_cb, void *ctx); +LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms); +LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb); +LIBBPF_API int ring_buffer__epoll_fd(const struct ring_buffer *rb); + +struct user_ring_buffer_opts { + size_t sz; /* size of this struct, for forward/backward compatibility */ +}; + +#define user_ring_buffer_opts__last_field sz + +/** + * @brief **user_ring_buffer__new()** creates a new instance of a user ring + * buffer. + * + * @param map_fd A file descriptor to a BPF_MAP_TYPE_USER_RINGBUF map. + * @param opts Options for how the ring buffer should be created. + * @return A user ring buffer on success; NULL and errno being set on a + * failure. + */ +LIBBPF_API struct user_ring_buffer * +user_ring_buffer__new(int map_fd, const struct user_ring_buffer_opts *opts); + +/** + * @brief **user_ring_buffer__reserve()** reserves a pointer to a sample in the + * user ring buffer. + * @param rb A pointer to a user ring buffer. + * @param size The size of the sample, in bytes. + * @return A pointer to an 8-byte aligned reserved region of the user ring + * buffer; NULL, and errno being set if a sample could not be reserved. + * + * This function is *not* thread safe, and callers must synchronize accessing + * this function if there are multiple producers. If a size is requested that + * is larger than the size of the entire ring buffer, errno will be set to + * E2BIG and NULL is returned. If the ring buffer could accommodate the size, + * but currently does not have enough space, errno is set to ENOSPC and NULL is + * returned. + * + * After initializing the sample, callers must invoke + * **user_ring_buffer__submit()** to post the sample to the kernel. Otherwise, + * the sample must be freed with **user_ring_buffer__discard()**. + */ +LIBBPF_API void *user_ring_buffer__reserve(struct user_ring_buffer *rb, __u32 size); + +/** + * @brief **user_ring_buffer__reserve_blocking()** reserves a record in the + * ring buffer, possibly blocking for up to @timeout_ms until a sample becomes + * available. + * @param rb The user ring buffer. + * @param size The size of the sample, in bytes. + * @param timeout_ms The amount of time, in milliseconds, for which the caller + * should block when waiting for a sample. -1 causes the caller to block + * indefinitely. + * @return A pointer to an 8-byte aligned reserved region of the user ring + * buffer; NULL, and errno being set if a sample could not be reserved. + * + * This function is *not* thread safe, and callers must synchronize + * accessing this function if there are multiple producers + * + * If **timeout_ms** is -1, the function will block indefinitely until a sample + * becomes available. Otherwise, **timeout_ms** must be non-negative, or errno + * is set to EINVAL, and NULL is returned. If **timeout_ms** is 0, no blocking + * will occur and the function will return immediately after attempting to + * reserve a sample. + * + * If **size** is larger than the size of the entire ring buffer, errno is set + * to E2BIG and NULL is returned. If the ring buffer could accommodate + * **size**, but currently does not have enough space, the caller will block + * until at most **timeout_ms** has elapsed. If insufficient space is available + * at that time, errno is set to ENOSPC, and NULL is returned. + * + * The kernel guarantees that it will wake up this thread to check if + * sufficient space is available in the ring buffer at least once per + * invocation of the **bpf_ringbuf_drain()** helper function, provided that at + * least one sample is consumed, and the BPF program did not invoke the + * function with BPF_RB_NO_WAKEUP. A wakeup may occur sooner than that, but the + * kernel does not guarantee this. If the helper function is invoked with + * BPF_RB_FORCE_WAKEUP, a wakeup event will be sent even if no sample is + * consumed. + * + * When a sample of size **size** is found within **timeout_ms**, a pointer to + * the sample is returned. After initializing the sample, callers must invoke + * **user_ring_buffer__submit()** to post the sample to the ring buffer. + * Otherwise, the sample must be freed with **user_ring_buffer__discard()**. + */ +LIBBPF_API void *user_ring_buffer__reserve_blocking(struct user_ring_buffer *rb, + __u32 size, + int timeout_ms); + +/** + * @brief **user_ring_buffer__submit()** submits a previously reserved sample + * into the ring buffer. + * @param rb The user ring buffer. + * @param sample A reserved sample. + * + * It is not necessary to synchronize amongst multiple producers when invoking + * this function. + */ +LIBBPF_API void user_ring_buffer__submit(struct user_ring_buffer *rb, void *sample); + +/** + * @brief **user_ring_buffer__discard()** discards a previously reserved sample. + * @param rb The user ring buffer. + * @param sample A reserved sample. + * + * It is not necessary to synchronize amongst multiple producers when invoking + * this function. + */ +LIBBPF_API void user_ring_buffer__discard(struct user_ring_buffer *rb, void *sample); + +/** + * @brief **user_ring_buffer__free()** frees a ring buffer that was previously + * created with **user_ring_buffer__new()**. + * @param rb The user ring buffer being freed. + */ +LIBBPF_API void user_ring_buffer__free(struct user_ring_buffer *rb); + +/* Perf buffer APIs */ +struct perf_buffer; + +typedef void (*perf_buffer_sample_fn)(void *ctx, int cpu, + void *data, __u32 size); +typedef void (*perf_buffer_lost_fn)(void *ctx, int cpu, __u64 cnt); + +/* common use perf buffer options */ +struct perf_buffer_opts { + size_t sz; + __u32 sample_period; + size_t :0; +}; +#define perf_buffer_opts__last_field sample_period + +/** + * @brief **perf_buffer__new()** creates BPF perfbuf manager for a specified + * BPF_PERF_EVENT_ARRAY map + * @param map_fd FD of BPF_PERF_EVENT_ARRAY BPF map that will be used by BPF + * code to send data over to user-space + * @param page_cnt number of memory pages allocated for each per-CPU buffer + * @param sample_cb function called on each received data record + * @param lost_cb function called when record loss has occurred + * @param ctx user-provided extra context passed into *sample_cb* and *lost_cb* + * @return a new instance of struct perf_buffer on success, NULL on error with + * *errno* containing an error code + */ +LIBBPF_API struct perf_buffer * +perf_buffer__new(int map_fd, size_t page_cnt, + perf_buffer_sample_fn sample_cb, perf_buffer_lost_fn lost_cb, void *ctx, + const struct perf_buffer_opts *opts); + +enum bpf_perf_event_ret { + LIBBPF_PERF_EVENT_DONE = 0, + LIBBPF_PERF_EVENT_ERROR = -1, + LIBBPF_PERF_EVENT_CONT = -2, +}; + +struct perf_event_header; + +typedef enum bpf_perf_event_ret +(*perf_buffer_event_fn)(void *ctx, int cpu, struct perf_event_header *event); + +/* raw perf buffer options, giving most power and control */ +struct perf_buffer_raw_opts { + size_t sz; + long :0; + long :0; + /* if cpu_cnt == 0, open all on all possible CPUs (up to the number of + * max_entries of given PERF_EVENT_ARRAY map) + */ + int cpu_cnt; + /* if cpu_cnt > 0, cpus is an array of CPUs to open ring buffers on */ + int *cpus; + /* if cpu_cnt > 0, map_keys specify map keys to set per-CPU FDs for */ + int *map_keys; +}; +#define perf_buffer_raw_opts__last_field map_keys + +struct perf_event_attr; + +LIBBPF_API struct perf_buffer * +perf_buffer__new_raw(int map_fd, size_t page_cnt, struct perf_event_attr *attr, + perf_buffer_event_fn event_cb, void *ctx, + const struct perf_buffer_raw_opts *opts); + +LIBBPF_API void perf_buffer__free(struct perf_buffer *pb); +LIBBPF_API int perf_buffer__epoll_fd(const struct perf_buffer *pb); +LIBBPF_API int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms); +LIBBPF_API int perf_buffer__consume(struct perf_buffer *pb); +LIBBPF_API int perf_buffer__consume_buffer(struct perf_buffer *pb, size_t buf_idx); +LIBBPF_API size_t perf_buffer__buffer_cnt(const struct perf_buffer *pb); +LIBBPF_API int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_idx); +/** + * @brief **perf_buffer__buffer()** returns the per-cpu raw mmap()'ed underlying + * memory region of the ring buffer. + * This ring buffer can be used to implement a custom events consumer. + * The ring buffer starts with the *struct perf_event_mmap_page*, which + * holds the ring buffer managment fields, when accessing the header + * structure it's important to be SMP aware. + * You can refer to *perf_event_read_simple* for a simple example. + * @param pb the perf buffer structure + * @param buf_idx the buffer index to retreive + * @param buf (out) gets the base pointer of the mmap()'ed memory + * @param buf_size (out) gets the size of the mmap()'ed region + * @return 0 on success, negative error code for failure + */ +LIBBPF_API int perf_buffer__buffer(struct perf_buffer *pb, int buf_idx, void **buf, + size_t *buf_size); + +struct bpf_prog_linfo; +struct bpf_prog_info; + +LIBBPF_API void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo); +LIBBPF_API struct bpf_prog_linfo * +bpf_prog_linfo__new(const struct bpf_prog_info *info); +LIBBPF_API const struct bpf_line_info * +bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo, + __u64 addr, __u32 func_idx, __u32 nr_skip); +LIBBPF_API const struct bpf_line_info * +bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo, + __u32 insn_off, __u32 nr_skip); + +/* + * Probe for supported system features + * + * Note that running many of these probes in a short amount of time can cause + * the kernel to reach the maximal size of lockable memory allowed for the + * user, causing subsequent probes to fail. In this case, the caller may want + * to adjust that limit with setrlimit(). + */ + +/** + * @brief **libbpf_probe_bpf_prog_type()** detects if host kernel supports + * BPF programs of a given type. + * @param prog_type BPF program type to detect kernel support for + * @param opts reserved for future extensibility, should be NULL + * @return 1, if given program type is supported; 0, if given program type is + * not supported; negative error code if feature detection failed or can't be + * performed + * + * Make sure the process has required set of CAP_* permissions (or runs as + * root) when performing feature checking. + */ +LIBBPF_API int libbpf_probe_bpf_prog_type(enum bpf_prog_type prog_type, const void *opts); +/** + * @brief **libbpf_probe_bpf_map_type()** detects if host kernel supports + * BPF maps of a given type. + * @param map_type BPF map type to detect kernel support for + * @param opts reserved for future extensibility, should be NULL + * @return 1, if given map type is supported; 0, if given map type is + * not supported; negative error code if feature detection failed or can't be + * performed + * + * Make sure the process has required set of CAP_* permissions (or runs as + * root) when performing feature checking. + */ +LIBBPF_API int libbpf_probe_bpf_map_type(enum bpf_map_type map_type, const void *opts); +/** + * @brief **libbpf_probe_bpf_helper()** detects if host kernel supports the + * use of a given BPF helper from specified BPF program type. + * @param prog_type BPF program type used to check the support of BPF helper + * @param helper_id BPF helper ID (enum bpf_func_id) to check support for + * @param opts reserved for future extensibility, should be NULL + * @return 1, if given combination of program type and helper is supported; 0, + * if the combination is not supported; negative error code if feature + * detection for provided input arguments failed or can't be performed + * + * Make sure the process has required set of CAP_* permissions (or runs as + * root) when performing feature checking. + */ +LIBBPF_API int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, + enum bpf_func_id helper_id, const void *opts); + +/** + * @brief **libbpf_num_possible_cpus()** is a helper function to get the + * number of possible CPUs that the host kernel supports and expects. + * @return number of possible CPUs; or error code on failure + * + * Example usage: + * + * int ncpus = libbpf_num_possible_cpus(); + * if (ncpus < 0) { + * // error handling + * } + * long values[ncpus]; + * bpf_map_lookup_elem(per_cpu_map_fd, key, values); + */ +LIBBPF_API int libbpf_num_possible_cpus(void); + +struct bpf_map_skeleton { + const char *name; + struct bpf_map **map; + void **mmaped; +}; + +struct bpf_prog_skeleton { + const char *name; + struct bpf_program **prog; + struct bpf_link **link; +}; + +struct bpf_object_skeleton { + size_t sz; /* size of this struct, for forward/backward compatibility */ + + const char *name; + const void *data; + size_t data_sz; + + struct bpf_object **obj; + + int map_cnt; + int map_skel_sz; /* sizeof(struct bpf_map_skeleton) */ + struct bpf_map_skeleton *maps; + + int prog_cnt; + int prog_skel_sz; /* sizeof(struct bpf_prog_skeleton) */ + struct bpf_prog_skeleton *progs; +}; + +LIBBPF_API int +bpf_object__open_skeleton(struct bpf_object_skeleton *s, + const struct bpf_object_open_opts *opts); +LIBBPF_API int bpf_object__load_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API int bpf_object__attach_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API void bpf_object__detach_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s); + +struct bpf_var_skeleton { + const char *name; + struct bpf_map **map; + void **addr; +}; + +struct bpf_object_subskeleton { + size_t sz; /* size of this struct, for forward/backward compatibility */ + + const struct bpf_object *obj; + + int map_cnt; + int map_skel_sz; /* sizeof(struct bpf_map_skeleton) */ + struct bpf_map_skeleton *maps; + + int prog_cnt; + int prog_skel_sz; /* sizeof(struct bpf_prog_skeleton) */ + struct bpf_prog_skeleton *progs; + + int var_cnt; + int var_skel_sz; /* sizeof(struct bpf_var_skeleton) */ + struct bpf_var_skeleton *vars; +}; + +LIBBPF_API int +bpf_object__open_subskeleton(struct bpf_object_subskeleton *s); +LIBBPF_API void +bpf_object__destroy_subskeleton(struct bpf_object_subskeleton *s); + +struct gen_loader_opts { + size_t sz; /* size of this struct, for forward/backward compatibility */ + const char *data; + const char *insns; + __u32 data_sz; + __u32 insns_sz; +}; + +#define gen_loader_opts__last_field insns_sz +LIBBPF_API int bpf_object__gen_loader(struct bpf_object *obj, + struct gen_loader_opts *opts); + +enum libbpf_tristate { + TRI_NO = 0, + TRI_YES = 1, + TRI_MODULE = 2, +}; + +struct bpf_linker_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; +}; +#define bpf_linker_opts__last_field sz + +struct bpf_linker_file_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; +}; +#define bpf_linker_file_opts__last_field sz + +struct bpf_linker; + +LIBBPF_API struct bpf_linker *bpf_linker__new(const char *filename, struct bpf_linker_opts *opts); +LIBBPF_API int bpf_linker__add_file(struct bpf_linker *linker, + const char *filename, + const struct bpf_linker_file_opts *opts); +LIBBPF_API int bpf_linker__finalize(struct bpf_linker *linker); +LIBBPF_API void bpf_linker__free(struct bpf_linker *linker); + +/* + * Custom handling of BPF program's SEC() definitions + */ + +struct bpf_prog_load_opts; /* defined in bpf.h */ + +/* Called during bpf_object__open() for each recognized BPF program. Callback + * can use various bpf_program__set_*() setters to adjust whatever properties + * are necessary. + */ +typedef int (*libbpf_prog_setup_fn_t)(struct bpf_program *prog, long cookie); + +/* Called right before libbpf performs bpf_prog_load() to load BPF program + * into the kernel. Callback can adjust opts as necessary. + */ +typedef int (*libbpf_prog_prepare_load_fn_t)(struct bpf_program *prog, + struct bpf_prog_load_opts *opts, long cookie); + +/* Called during skeleton attach or through bpf_program__attach(). If + * auto-attach is not supported, callback should return 0 and set link to + * NULL (it's not considered an error during skeleton attach, but it will be + * an error for bpf_program__attach() calls). On error, error should be + * returned directly and link set to NULL. On success, return 0 and set link + * to a valid struct bpf_link. + */ +typedef int (*libbpf_prog_attach_fn_t)(const struct bpf_program *prog, long cookie, + struct bpf_link **link); + +struct libbpf_prog_handler_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + /* User-provided value that is passed to prog_setup_fn, + * prog_prepare_load_fn, and prog_attach_fn callbacks. Allows user to + * register one set of callbacks for multiple SEC() definitions and + * still be able to distinguish them, if necessary. For example, + * libbpf itself is using this to pass necessary flags (e.g., + * sleepable flag) to a common internal SEC() handler. + */ + long cookie; + /* BPF program initialization callback (see libbpf_prog_setup_fn_t). + * Callback is optional, pass NULL if it's not necessary. + */ + libbpf_prog_setup_fn_t prog_setup_fn; + /* BPF program loading callback (see libbpf_prog_prepare_load_fn_t). + * Callback is optional, pass NULL if it's not necessary. + */ + libbpf_prog_prepare_load_fn_t prog_prepare_load_fn; + /* BPF program attach callback (see libbpf_prog_attach_fn_t). + * Callback is optional, pass NULL if it's not necessary. + */ + libbpf_prog_attach_fn_t prog_attach_fn; +}; +#define libbpf_prog_handler_opts__last_field prog_attach_fn + +/** + * @brief **libbpf_register_prog_handler()** registers a custom BPF program + * SEC() handler. + * @param sec section prefix for which custom handler is registered + * @param prog_type BPF program type associated with specified section + * @param exp_attach_type Expected BPF attach type associated with specified section + * @param opts optional cookie, callbacks, and other extra options + * @return Non-negative handler ID is returned on success. This handler ID has + * to be passed to *libbpf_unregister_prog_handler()* to unregister such + * custom handler. Negative error code is returned on error. + * + * *sec* defines which SEC() definitions are handled by this custom handler + * registration. *sec* can have few different forms: + * - if *sec* is just a plain string (e.g., "abc"), it will match only + * SEC("abc"). If BPF program specifies SEC("abc/whatever") it will result + * in an error; + * - if *sec* is of the form "abc/", proper SEC() form is + * SEC("abc/something"), where acceptable "something" should be checked by + * *prog_init_fn* callback, if there are additional restrictions; + * - if *sec* is of the form "abc+", it will successfully match both + * SEC("abc") and SEC("abc/whatever") forms; + * - if *sec* is NULL, custom handler is registered for any BPF program that + * doesn't match any of the registered (custom or libbpf's own) SEC() + * handlers. There could be only one such generic custom handler registered + * at any given time. + * + * All custom handlers (except the one with *sec* == NULL) are processed + * before libbpf's own SEC() handlers. It is allowed to "override" libbpf's + * SEC() handlers by registering custom ones for the same section prefix + * (i.e., it's possible to have custom SEC("perf_event/LLC-load-misses") + * handler). + * + * Note, like much of global libbpf APIs (e.g., libbpf_set_print(), + * libbpf_set_strict_mode(), etc)) these APIs are not thread-safe. User needs + * to ensure synchronization if there is a risk of running this API from + * multiple threads simultaneously. + */ +LIBBPF_API int libbpf_register_prog_handler(const char *sec, + enum bpf_prog_type prog_type, + enum bpf_attach_type exp_attach_type, + const struct libbpf_prog_handler_opts *opts); +/** + * @brief *libbpf_unregister_prog_handler()* unregisters previously registered + * custom BPF program SEC() handler. + * @param handler_id handler ID returned by *libbpf_register_prog_handler()* + * after successful registration + * @return 0 on success, negative error code if handler isn't found + * + * Note, like much of global libbpf APIs (e.g., libbpf_set_print(), + * libbpf_set_strict_mode(), etc)) these APIs are not thread-safe. User needs + * to ensure synchronization if there is a risk of running this API from + * multiple threads simultaneously. + */ +LIBBPF_API int libbpf_unregister_prog_handler(int handler_id); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_LIBBPF_H */ diff --git a/libbpf/src/libbpf.map b/libbpf/src/libbpf.map new file mode 100644 index 0000000..a5aa3a3 --- /dev/null +++ b/libbpf/src/libbpf.map @@ -0,0 +1,393 @@ +LIBBPF_0.0.1 { + global: + bpf_btf_get_fd_by_id; + bpf_map__btf_key_type_id; + bpf_map__btf_value_type_id; + bpf_map__fd; + bpf_map__name; + bpf_map__pin; + bpf_map__reuse_fd; + bpf_map__set_ifindex; + bpf_map__set_inner_map_fd; + bpf_map__unpin; + bpf_map_delete_elem; + bpf_map_get_fd_by_id; + bpf_map_get_next_id; + bpf_map_get_next_key; + bpf_map_lookup_and_delete_elem; + bpf_map_lookup_elem; + bpf_map_update_elem; + bpf_obj_get; + bpf_obj_get_info_by_fd; + bpf_obj_pin; + bpf_object__btf_fd; + bpf_object__close; + bpf_object__find_map_by_name; + bpf_object__kversion; + bpf_object__load; + bpf_object__name; + bpf_object__open; + bpf_object__pin; + bpf_object__pin_maps; + bpf_object__pin_programs; + bpf_object__unpin_maps; + bpf_object__unpin_programs; + bpf_prog_attach; + bpf_prog_detach; + bpf_prog_detach2; + bpf_prog_get_fd_by_id; + bpf_prog_get_next_id; + bpf_prog_query; + bpf_program__fd; + bpf_program__pin; + bpf_program__set_expected_attach_type; + bpf_program__set_ifindex; + bpf_program__set_type; + bpf_program__unload; + bpf_program__unpin; + bpf_prog_linfo__free; + bpf_prog_linfo__new; + bpf_prog_linfo__lfind_addr_func; + bpf_prog_linfo__lfind; + bpf_raw_tracepoint_open; + bpf_task_fd_query; + btf__fd; + btf__find_by_name; + btf__free; + btf__name_by_offset; + btf__new; + btf__resolve_size; + btf__resolve_type; + btf__type_by_id; + libbpf_attach_type_by_name; + libbpf_get_error; + libbpf_prog_type_by_name; + libbpf_set_print; + libbpf_strerror; + local: + *; +}; + +LIBBPF_0.0.2 { + global: + bpf_map_lookup_elem_flags; + bpf_object__btf; + bpf_object__find_map_fd_by_name; + btf__get_raw_data; + btf_ext__free; + btf_ext__get_raw_data; + btf_ext__new; +} LIBBPF_0.0.1; + +LIBBPF_0.0.3 { + global: + bpf_map__is_internal; + bpf_map_freeze; +} LIBBPF_0.0.2; + +LIBBPF_0.0.4 { + global: + bpf_link__destroy; + bpf_program__attach_kprobe; + bpf_program__attach_perf_event; + bpf_program__attach_raw_tracepoint; + bpf_program__attach_tracepoint; + bpf_program__attach_uprobe; + btf_dump__dump_type; + btf_dump__free; + btf__parse_elf; + libbpf_num_possible_cpus; + perf_buffer__free; + perf_buffer__poll; +} LIBBPF_0.0.3; + +LIBBPF_0.0.5 { + global: + bpf_btf_get_next_id; +} LIBBPF_0.0.4; + +LIBBPF_0.0.6 { + global: + bpf_map__get_pin_path; + bpf_map__is_pinned; + bpf_map__set_pin_path; + bpf_object__open_file; + bpf_object__open_mem; + bpf_program__attach_trace; + bpf_program__get_expected_attach_type; + bpf_program__get_type; + btf__find_by_name_kind; + libbpf_find_vmlinux_btf_id; +} LIBBPF_0.0.5; + +LIBBPF_0.0.7 { + global: + btf_dump__emit_type_decl; + bpf_link__disconnect; + bpf_map__attach_struct_ops; + bpf_map_delete_batch; + bpf_map_lookup_and_delete_batch; + bpf_map_lookup_batch; + bpf_map_update_batch; + bpf_object__find_program_by_name; + bpf_object__attach_skeleton; + bpf_object__destroy_skeleton; + bpf_object__detach_skeleton; + bpf_object__load_skeleton; + bpf_object__open_skeleton; + bpf_program__attach; + bpf_program__name; + btf__align_of; + libbpf_find_kernel_btf; +} LIBBPF_0.0.6; + +LIBBPF_0.0.8 { + global: + bpf_link__fd; + bpf_link__open; + bpf_link__pin; + bpf_link__pin_path; + bpf_link__unpin; + bpf_link__update_program; + bpf_link_create; + bpf_link_update; + bpf_map__set_initial_value; + bpf_prog_attach_opts; + bpf_program__attach_cgroup; + bpf_program__attach_lsm; + bpf_program__set_attach_target; +} LIBBPF_0.0.7; + +LIBBPF_0.0.9 { + global: + bpf_enable_stats; + bpf_iter_create; + bpf_link_get_fd_by_id; + bpf_link_get_next_id; + bpf_program__attach_iter; + bpf_program__attach_netns; + perf_buffer__consume; + ring_buffer__add; + ring_buffer__consume; + ring_buffer__free; + ring_buffer__new; + ring_buffer__poll; +} LIBBPF_0.0.8; + +LIBBPF_0.1.0 { + global: + bpf_link__detach; + bpf_link_detach; + bpf_map__ifindex; + bpf_map__key_size; + bpf_map__map_flags; + bpf_map__max_entries; + bpf_map__numa_node; + bpf_map__set_key_size; + bpf_map__set_map_flags; + bpf_map__set_max_entries; + bpf_map__set_numa_node; + bpf_map__set_type; + bpf_map__set_value_size; + bpf_map__type; + bpf_map__value_size; + bpf_program__attach_xdp; + bpf_program__autoload; + bpf_program__set_autoload; + btf__parse; + btf__parse_raw; + btf__pointer_size; + btf__set_fd; + btf__set_pointer_size; +} LIBBPF_0.0.9; + +LIBBPF_0.2.0 { + global: + bpf_prog_bind_map; + bpf_prog_test_run_opts; + bpf_program__attach_freplace; + bpf_program__section_name; + btf__add_array; + btf__add_const; + btf__add_enum; + btf__add_enum_value; + btf__add_datasec; + btf__add_datasec_var_info; + btf__add_field; + btf__add_func; + btf__add_func_param; + btf__add_func_proto; + btf__add_fwd; + btf__add_int; + btf__add_ptr; + btf__add_restrict; + btf__add_str; + btf__add_struct; + btf__add_typedef; + btf__add_union; + btf__add_var; + btf__add_volatile; + btf__endianness; + btf__find_str; + btf__new_empty; + btf__set_endianness; + btf__str_by_offset; + perf_buffer__buffer_cnt; + perf_buffer__buffer_fd; + perf_buffer__epoll_fd; + perf_buffer__consume_buffer; +} LIBBPF_0.1.0; + +LIBBPF_0.3.0 { + global: + btf__base_btf; + btf__parse_elf_split; + btf__parse_raw_split; + btf__parse_split; + btf__new_empty_split; + btf__new_split; + ring_buffer__epoll_fd; +} LIBBPF_0.2.0; + +LIBBPF_0.4.0 { + global: + btf__add_float; + btf__add_type; + bpf_linker__add_file; + bpf_linker__finalize; + bpf_linker__free; + bpf_linker__new; + bpf_map__inner_map; + bpf_object__set_kversion; + bpf_tc_attach; + bpf_tc_detach; + bpf_tc_hook_create; + bpf_tc_hook_destroy; + bpf_tc_query; +} LIBBPF_0.3.0; + +LIBBPF_0.5.0 { + global: + bpf_map__initial_value; + bpf_map__pin_path; + bpf_map_lookup_and_delete_elem_flags; + bpf_program__attach_kprobe_opts; + bpf_program__attach_perf_event_opts; + bpf_program__attach_tracepoint_opts; + bpf_program__attach_uprobe_opts; + bpf_object__gen_loader; + btf__load_from_kernel_by_id; + btf__load_from_kernel_by_id_split; + btf__load_into_kernel; + btf__load_module_btf; + btf__load_vmlinux_btf; + btf_dump__dump_type_data; + libbpf_set_strict_mode; +} LIBBPF_0.4.0; + +LIBBPF_0.6.0 { + global: + bpf_map__map_extra; + bpf_map__set_map_extra; + bpf_map_create; + bpf_object__next_map; + bpf_object__next_program; + bpf_object__prev_map; + bpf_object__prev_program; + bpf_prog_load; + bpf_program__flags; + bpf_program__insn_cnt; + bpf_program__insns; + bpf_program__set_flags; + btf__add_btf; + btf__add_decl_tag; + btf__add_type_tag; + btf__dedup; + btf__raw_data; + btf__type_cnt; + btf_dump__new; + libbpf_major_version; + libbpf_minor_version; + libbpf_version_string; + perf_buffer__new; + perf_buffer__new_raw; +} LIBBPF_0.5.0; + +LIBBPF_0.7.0 { + global: + bpf_btf_load; + bpf_program__expected_attach_type; + bpf_program__log_buf; + bpf_program__log_level; + bpf_program__set_log_buf; + bpf_program__set_log_level; + bpf_program__type; + bpf_xdp_attach; + bpf_xdp_detach; + bpf_xdp_query; + bpf_xdp_query_id; + btf_ext__raw_data; + libbpf_probe_bpf_helper; + libbpf_probe_bpf_map_type; + libbpf_probe_bpf_prog_type; + libbpf_set_memlock_rlim; +} LIBBPF_0.6.0; + +LIBBPF_0.8.0 { + global: + bpf_map__autocreate; + bpf_map__get_next_key; + bpf_map__delete_elem; + bpf_map__lookup_and_delete_elem; + bpf_map__lookup_elem; + bpf_map__set_autocreate; + bpf_map__update_elem; + bpf_map_delete_elem_flags; + bpf_object__destroy_subskeleton; + bpf_object__open_subskeleton; + bpf_program__attach_kprobe_multi_opts; + bpf_program__attach_trace_opts; + bpf_program__attach_usdt; + bpf_program__set_insns; + libbpf_register_prog_handler; + libbpf_unregister_prog_handler; +} LIBBPF_0.7.0; + +LIBBPF_1.0.0 { + global: + bpf_obj_get_opts; + bpf_prog_query_opts; + bpf_program__attach_ksyscall; + bpf_program__autoattach; + bpf_program__set_autoattach; + btf__add_enum64; + btf__add_enum64_value; + libbpf_bpf_attach_type_str; + libbpf_bpf_link_type_str; + libbpf_bpf_map_type_str; + libbpf_bpf_prog_type_str; + perf_buffer__buffer; +} LIBBPF_0.8.0; + +LIBBPF_1.1.0 { + global: + bpf_btf_get_fd_by_id_opts; + bpf_link_get_fd_by_id_opts; + bpf_map_get_fd_by_id_opts; + bpf_prog_get_fd_by_id_opts; + user_ring_buffer__discard; + user_ring_buffer__free; + user_ring_buffer__new; + user_ring_buffer__reserve; + user_ring_buffer__reserve_blocking; + user_ring_buffer__submit; +} LIBBPF_1.0.0; + +LIBBPF_1.2.0 { + global: + bpf_btf_get_info_by_fd; + bpf_link__update_map; + bpf_link_get_info_by_fd; + bpf_map_get_info_by_fd; + bpf_prog_get_info_by_fd; +} LIBBPF_1.1.0; diff --git a/libbpf/src/libbpf.pc.template b/libbpf/src/libbpf.pc.template new file mode 100644 index 0000000..b45ed53 --- /dev/null +++ b/libbpf/src/libbpf.pc.template @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +prefix=@PREFIX@ +libdir=@LIBDIR@ +includedir=${prefix}/include + +Name: libbpf +Description: BPF library +Version: @VERSION@ +Libs: -L${libdir} -lbpf +Requires.private: libelf zlib +Cflags: -I${includedir} diff --git a/libbpf/src/libbpf_common.h b/libbpf/src/libbpf_common.h new file mode 100644 index 0000000..9a7937f --- /dev/null +++ b/libbpf/src/libbpf_common.h @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Common user-facing libbpf helpers. + * + * Copyright (c) 2019 Facebook + */ + +#ifndef __LIBBPF_LIBBPF_COMMON_H +#define __LIBBPF_LIBBPF_COMMON_H + +#include +#include "libbpf_version.h" + +#ifndef LIBBPF_API +#define LIBBPF_API __attribute__((visibility("default"))) +#endif + +#define LIBBPF_DEPRECATED(msg) __attribute__((deprecated(msg))) + +/* Mark a symbol as deprecated when libbpf version is >= {major}.{minor} */ +#define LIBBPF_DEPRECATED_SINCE(major, minor, msg) \ + __LIBBPF_MARK_DEPRECATED_ ## major ## _ ## minor \ + (LIBBPF_DEPRECATED("libbpf v" # major "." # minor "+: " msg)) + +#define __LIBBPF_CURRENT_VERSION_GEQ(major, minor) \ + (LIBBPF_MAJOR_VERSION > (major) || \ + (LIBBPF_MAJOR_VERSION == (major) && LIBBPF_MINOR_VERSION >= (minor))) + +/* Add checks for other versions below when planning deprecation of API symbols + * with the LIBBPF_DEPRECATED_SINCE macro. + */ +#if __LIBBPF_CURRENT_VERSION_GEQ(1, 0) +#define __LIBBPF_MARK_DEPRECATED_1_0(X) X +#else +#define __LIBBPF_MARK_DEPRECATED_1_0(X) +#endif + +/* This set of internal macros allows to do "function overloading" based on + * number of arguments provided by used in backwards-compatible way during the + * transition to libbpf 1.0 + * It's ugly but necessary evil that will be cleaned up when we get to 1.0. + * See bpf_prog_load() overload for example. + */ +#define ___libbpf_cat(A, B) A ## B +#define ___libbpf_select(NAME, NUM) ___libbpf_cat(NAME, NUM) +#define ___libbpf_nth(_1, _2, _3, _4, _5, _6, N, ...) N +#define ___libbpf_cnt(...) ___libbpf_nth(__VA_ARGS__, 6, 5, 4, 3, 2, 1) +#define ___libbpf_overload(NAME, ...) ___libbpf_select(NAME, ___libbpf_cnt(__VA_ARGS__))(__VA_ARGS__) + +/* Helper macro to declare and initialize libbpf options struct + * + * This dance with uninitialized declaration, followed by memset to zero, + * followed by assignment using compound literal syntax is done to preserve + * ability to use a nice struct field initialization syntax and **hopefully** + * have all the padding bytes initialized to zero. It's not guaranteed though, + * when copying literal, that compiler won't copy garbage in literal's padding + * bytes, but that's the best way I've found and it seems to work in practice. + * + * Macro declares opts struct of given type and name, zero-initializes, + * including any extra padding, it with memset() and then assigns initial + * values provided by users in struct initializer-syntax as varargs. + */ +#define LIBBPF_OPTS(TYPE, NAME, ...) \ + struct TYPE NAME = ({ \ + memset(&NAME, 0, sizeof(struct TYPE)); \ + (struct TYPE) { \ + .sz = sizeof(struct TYPE), \ + __VA_ARGS__ \ + }; \ + }) + +#endif /* __LIBBPF_LIBBPF_COMMON_H */ diff --git a/libbpf/src/libbpf_errno.c b/libbpf/src/libbpf_errno.c new file mode 100644 index 0000000..6b18017 --- /dev/null +++ b/libbpf/src/libbpf_errno.c @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * Copyright (C) 2013-2015 Alexei Starovoitov + * Copyright (C) 2015 Wang Nan + * Copyright (C) 2015 Huawei Inc. + * Copyright (C) 2017 Nicira, Inc. + */ + +#undef _GNU_SOURCE +#include +#include + +#include "libbpf.h" +#include "libbpf_internal.h" + +/* make sure libbpf doesn't use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +#define ERRNO_OFFSET(e) ((e) - __LIBBPF_ERRNO__START) +#define ERRCODE_OFFSET(c) ERRNO_OFFSET(LIBBPF_ERRNO__##c) +#define NR_ERRNO (__LIBBPF_ERRNO__END - __LIBBPF_ERRNO__START) + +static const char *libbpf_strerror_table[NR_ERRNO] = { + [ERRCODE_OFFSET(LIBELF)] = "Something wrong in libelf", + [ERRCODE_OFFSET(FORMAT)] = "BPF object format invalid", + [ERRCODE_OFFSET(KVERSION)] = "'version' section incorrect or lost", + [ERRCODE_OFFSET(ENDIAN)] = "Endian mismatch", + [ERRCODE_OFFSET(INTERNAL)] = "Internal error in libbpf", + [ERRCODE_OFFSET(RELOC)] = "Relocation failed", + [ERRCODE_OFFSET(VERIFY)] = "Kernel verifier blocks program loading", + [ERRCODE_OFFSET(PROG2BIG)] = "Program too big", + [ERRCODE_OFFSET(KVER)] = "Incorrect kernel version", + [ERRCODE_OFFSET(PROGTYPE)] = "Kernel doesn't support this program type", + [ERRCODE_OFFSET(WRNGPID)] = "Wrong pid in netlink message", + [ERRCODE_OFFSET(INVSEQ)] = "Invalid netlink sequence", + [ERRCODE_OFFSET(NLPARSE)] = "Incorrect netlink message parsing", +}; + +int libbpf_strerror(int err, char *buf, size_t size) +{ + int ret; + + if (!buf || !size) + return libbpf_err(-EINVAL); + + err = err > 0 ? err : -err; + + if (err < __LIBBPF_ERRNO__START) { + ret = strerror_r(err, buf, size); + buf[size - 1] = '\0'; + return libbpf_err_errno(ret); + } + + if (err < __LIBBPF_ERRNO__END) { + const char *msg; + + msg = libbpf_strerror_table[ERRNO_OFFSET(err)]; + ret = snprintf(buf, size, "%s", msg); + buf[size - 1] = '\0'; + /* The length of the buf and msg is positive. + * A negative number may be returned only when the + * size exceeds INT_MAX. Not likely to appear. + */ + if (ret >= size) + return libbpf_err(-ERANGE); + return 0; + } + + ret = snprintf(buf, size, "Unknown libbpf error %d", err); + buf[size - 1] = '\0'; + if (ret >= size) + return libbpf_err(-ERANGE); + return libbpf_err(-ENOENT); +} diff --git a/libbpf/src/libbpf_internal.h b/libbpf/src/libbpf_internal.h new file mode 100644 index 0000000..e4d0566 --- /dev/null +++ b/libbpf/src/libbpf_internal.h @@ -0,0 +1,580 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Internal libbpf helpers. + * + * Copyright (c) 2019 Facebook + */ + +#ifndef __LIBBPF_LIBBPF_INTERNAL_H +#define __LIBBPF_LIBBPF_INTERNAL_H + +#include +#include +#include +#include +#include +#include +#include "relo_core.h" + +/* make sure libbpf doesn't use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +/* prevent accidental re-addition of reallocarray() */ +#pragma GCC poison reallocarray + +#include "libbpf.h" +#include "btf.h" + +#ifndef EM_BPF +#define EM_BPF 247 +#endif + +#ifndef R_BPF_64_64 +#define R_BPF_64_64 1 +#endif +#ifndef R_BPF_64_ABS64 +#define R_BPF_64_ABS64 2 +#endif +#ifndef R_BPF_64_ABS32 +#define R_BPF_64_ABS32 3 +#endif +#ifndef R_BPF_64_32 +#define R_BPF_64_32 10 +#endif + +#ifndef SHT_LLVM_ADDRSIG +#define SHT_LLVM_ADDRSIG 0x6FFF4C03 +#endif + +/* if libelf is old and doesn't support mmap(), fall back to read() */ +#ifndef ELF_C_READ_MMAP +#define ELF_C_READ_MMAP ELF_C_READ +#endif + +/* Older libelf all end up in this expression, for both 32 and 64 bit */ +#ifndef ELF64_ST_VISIBILITY +#define ELF64_ST_VISIBILITY(o) ((o) & 0x03) +#endif + +#define BTF_INFO_ENC(kind, kind_flag, vlen) \ + ((!!(kind_flag) << 31) | ((kind) << 24) | ((vlen) & BTF_MAX_VLEN)) +#define BTF_TYPE_ENC(name, info, size_or_type) (name), (info), (size_or_type) +#define BTF_INT_ENC(encoding, bits_offset, nr_bits) \ + ((encoding) << 24 | (bits_offset) << 16 | (nr_bits)) +#define BTF_TYPE_INT_ENC(name, encoding, bits_offset, bits, sz) \ + BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_INT, 0, 0), sz), \ + BTF_INT_ENC(encoding, bits_offset, bits) +#define BTF_MEMBER_ENC(name, type, bits_offset) (name), (type), (bits_offset) +#define BTF_PARAM_ENC(name, type) (name), (type) +#define BTF_VAR_SECINFO_ENC(type, offset, size) (type), (offset), (size) +#define BTF_TYPE_FLOAT_ENC(name, sz) \ + BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_FLOAT, 0, 0), sz) +#define BTF_TYPE_DECL_TAG_ENC(value, type, component_idx) \ + BTF_TYPE_ENC(value, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 0), type), (component_idx) +#define BTF_TYPE_TYPE_TAG_ENC(value, type) \ + BTF_TYPE_ENC(value, BTF_INFO_ENC(BTF_KIND_TYPE_TAG, 0, 0), type) + +#ifndef likely +#define likely(x) __builtin_expect(!!(x), 1) +#endif +#ifndef unlikely +#define unlikely(x) __builtin_expect(!!(x), 0) +#endif +#ifndef min +# define min(x, y) ((x) < (y) ? (x) : (y)) +#endif +#ifndef max +# define max(x, y) ((x) < (y) ? (y) : (x)) +#endif +#ifndef offsetofend +# define offsetofend(TYPE, FIELD) \ + (offsetof(TYPE, FIELD) + sizeof(((TYPE *)0)->FIELD)) +#endif +#ifndef __alias +#define __alias(symbol) __attribute__((alias(#symbol))) +#endif + +/* Check whether a string `str` has prefix `pfx`, regardless if `pfx` is + * a string literal known at compilation time or char * pointer known only at + * runtime. + */ +#define str_has_pfx(str, pfx) \ + (strncmp(str, pfx, __builtin_constant_p(pfx) ? sizeof(pfx) - 1 : strlen(pfx)) == 0) + +/* suffix check */ +static inline bool str_has_sfx(const char *str, const char *sfx) +{ + size_t str_len = strlen(str); + size_t sfx_len = strlen(sfx); + + if (sfx_len > str_len) + return false; + return strcmp(str + str_len - sfx_len, sfx) == 0; +} + +/* Symbol versioning is different between static and shared library. + * Properly versioned symbols are needed for shared library, but + * only the symbol of the new version is needed for static library. + * Starting with GNU C 10, use symver attribute instead of .symver assembler + * directive, which works better with GCC LTO builds. + */ +#if defined(SHARED) && defined(__GNUC__) && __GNUC__ >= 10 + +#define DEFAULT_VERSION(internal_name, api_name, version) \ + __attribute__((symver(#api_name "@@" #version))) +#define COMPAT_VERSION(internal_name, api_name, version) \ + __attribute__((symver(#api_name "@" #version))) + +#elif defined(SHARED) + +#define COMPAT_VERSION(internal_name, api_name, version) \ + asm(".symver " #internal_name "," #api_name "@" #version); +#define DEFAULT_VERSION(internal_name, api_name, version) \ + asm(".symver " #internal_name "," #api_name "@@" #version); + +#else /* !SHARED */ + +#define COMPAT_VERSION(internal_name, api_name, version) +#define DEFAULT_VERSION(internal_name, api_name, version) \ + extern typeof(internal_name) api_name \ + __attribute__((alias(#internal_name))); + +#endif + +extern void libbpf_print(enum libbpf_print_level level, + const char *format, ...) + __attribute__((format(printf, 2, 3))); + +#define __pr(level, fmt, ...) \ +do { \ + libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \ +} while (0) + +#define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__) +#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__) +#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__) + +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +struct bpf_link { + int (*detach)(struct bpf_link *link); + void (*dealloc)(struct bpf_link *link); + char *pin_path; /* NULL, if not pinned */ + int fd; /* hook FD, -1 if not applicable */ + bool disconnected; +}; + +/* + * Re-implement glibc's reallocarray() for libbpf internal-only use. + * reallocarray(), unfortunately, is not available in all versions of glibc, + * so requires extra feature detection and using reallocarray() stub from + * and COMPAT_NEED_REALLOCARRAY. All this complicates + * build of libbpf unnecessarily and is just a maintenance burden. Instead, + * it's trivial to implement libbpf-specific internal version and use it + * throughout libbpf. + */ +static inline void *libbpf_reallocarray(void *ptr, size_t nmemb, size_t size) +{ + size_t total; + +#if __has_builtin(__builtin_mul_overflow) + if (unlikely(__builtin_mul_overflow(nmemb, size, &total))) + return NULL; +#else + if (size == 0 || nmemb > ULONG_MAX / size) + return NULL; + total = nmemb * size; +#endif + return realloc(ptr, total); +} + +/* Copy up to sz - 1 bytes from zero-terminated src string and ensure that dst + * is zero-terminated string no matter what (unless sz == 0, in which case + * it's a no-op). It's conceptually close to FreeBSD's strlcpy(), but differs + * in what is returned. Given this is internal helper, it's trivial to extend + * this, when necessary. Use this instead of strncpy inside libbpf source code. + */ +static inline void libbpf_strlcpy(char *dst, const char *src, size_t sz) +{ + size_t i; + + if (sz == 0) + return; + + sz--; + for (i = 0; i < sz && src[i]; i++) + dst[i] = src[i]; + dst[i] = '\0'; +} + +__u32 get_kernel_version(void); + +struct btf; +struct btf_type; + +struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id); +const char *btf_kind_str(const struct btf_type *t); +const struct btf_type *skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id); + +static inline enum btf_func_linkage btf_func_linkage(const struct btf_type *t) +{ + return (enum btf_func_linkage)(int)btf_vlen(t); +} + +static inline __u32 btf_type_info(int kind, int vlen, int kflag) +{ + return (kflag << 31) | (kind << 24) | vlen; +} + +enum map_def_parts { + MAP_DEF_MAP_TYPE = 0x001, + MAP_DEF_KEY_TYPE = 0x002, + MAP_DEF_KEY_SIZE = 0x004, + MAP_DEF_VALUE_TYPE = 0x008, + MAP_DEF_VALUE_SIZE = 0x010, + MAP_DEF_MAX_ENTRIES = 0x020, + MAP_DEF_MAP_FLAGS = 0x040, + MAP_DEF_NUMA_NODE = 0x080, + MAP_DEF_PINNING = 0x100, + MAP_DEF_INNER_MAP = 0x200, + MAP_DEF_MAP_EXTRA = 0x400, + + MAP_DEF_ALL = 0x7ff, /* combination of all above */ +}; + +struct btf_map_def { + enum map_def_parts parts; + __u32 map_type; + __u32 key_type_id; + __u32 key_size; + __u32 value_type_id; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + __u32 numa_node; + __u32 pinning; + __u64 map_extra; +}; + +int parse_btf_map_def(const char *map_name, struct btf *btf, + const struct btf_type *def_t, bool strict, + struct btf_map_def *map_def, struct btf_map_def *inner_def); + +void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz, + size_t cur_cnt, size_t max_cnt, size_t add_cnt); +int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt); + +static inline bool libbpf_is_mem_zeroed(const char *p, ssize_t len) +{ + while (len > 0) { + if (*p) + return false; + p++; + len--; + } + return true; +} + +static inline bool libbpf_validate_opts(const char *opts, + size_t opts_sz, size_t user_sz, + const char *type_name) +{ + if (user_sz < sizeof(size_t)) { + pr_warn("%s size (%zu) is too small\n", type_name, user_sz); + return false; + } + if (!libbpf_is_mem_zeroed(opts + opts_sz, (ssize_t)user_sz - opts_sz)) { + pr_warn("%s has non-zero extra bytes\n", type_name); + return false; + } + return true; +} + +#define OPTS_VALID(opts, type) \ + (!(opts) || libbpf_validate_opts((const char *)opts, \ + offsetofend(struct type, \ + type##__last_field), \ + (opts)->sz, #type)) +#define OPTS_HAS(opts, field) \ + ((opts) && opts->sz >= offsetofend(typeof(*(opts)), field)) +#define OPTS_GET(opts, field, fallback_value) \ + (OPTS_HAS(opts, field) ? (opts)->field : fallback_value) +#define OPTS_SET(opts, field, value) \ + do { \ + if (OPTS_HAS(opts, field)) \ + (opts)->field = value; \ + } while (0) + +#define OPTS_ZEROED(opts, last_nonzero_field) \ +({ \ + ssize_t __off = offsetofend(typeof(*(opts)), last_nonzero_field); \ + !(opts) || libbpf_is_mem_zeroed((const void *)opts + __off, \ + (opts)->sz - __off); \ +}) + +enum kern_feature_id { + /* v4.14: kernel support for program & map names. */ + FEAT_PROG_NAME, + /* v5.2: kernel support for global data sections. */ + FEAT_GLOBAL_DATA, + /* BTF support */ + FEAT_BTF, + /* BTF_KIND_FUNC and BTF_KIND_FUNC_PROTO support */ + FEAT_BTF_FUNC, + /* BTF_KIND_VAR and BTF_KIND_DATASEC support */ + FEAT_BTF_DATASEC, + /* BTF_FUNC_GLOBAL is supported */ + FEAT_BTF_GLOBAL_FUNC, + /* BPF_F_MMAPABLE is supported for arrays */ + FEAT_ARRAY_MMAP, + /* kernel support for expected_attach_type in BPF_PROG_LOAD */ + FEAT_EXP_ATTACH_TYPE, + /* bpf_probe_read_{kernel,user}[_str] helpers */ + FEAT_PROBE_READ_KERN, + /* BPF_PROG_BIND_MAP is supported */ + FEAT_PROG_BIND_MAP, + /* Kernel support for module BTFs */ + FEAT_MODULE_BTF, + /* BTF_KIND_FLOAT support */ + FEAT_BTF_FLOAT, + /* BPF perf link support */ + FEAT_PERF_LINK, + /* BTF_KIND_DECL_TAG support */ + FEAT_BTF_DECL_TAG, + /* BTF_KIND_TYPE_TAG support */ + FEAT_BTF_TYPE_TAG, + /* memcg-based accounting for BPF maps and progs */ + FEAT_MEMCG_ACCOUNT, + /* BPF cookie (bpf_get_attach_cookie() BPF helper) support */ + FEAT_BPF_COOKIE, + /* BTF_KIND_ENUM64 support and BTF_KIND_ENUM kflag support */ + FEAT_BTF_ENUM64, + /* Kernel uses syscall wrapper (CONFIG_ARCH_HAS_SYSCALL_WRAPPER) */ + FEAT_SYSCALL_WRAPPER, + __FEAT_CNT, +}; + +int probe_memcg_account(void); +bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id); +int bump_rlimit_memlock(void); + +int parse_cpu_mask_str(const char *s, bool **mask, int *mask_sz); +int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz); +int libbpf__load_raw_btf(const char *raw_types, size_t types_len, + const char *str_sec, size_t str_len); +int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level); + +struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf); +void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type, + const char **prefix, int *kind); + +struct btf_ext_info { + /* + * info points to the individual info section (e.g. func_info and + * line_info) from the .BTF.ext. It does not include the __u32 rec_size. + */ + void *info; + __u32 rec_size; + __u32 len; + /* optional (maintained internally by libbpf) mapping between .BTF.ext + * section and corresponding ELF section. This is used to join + * information like CO-RE relocation records with corresponding BPF + * programs defined in ELF sections + */ + __u32 *sec_idxs; + int sec_cnt; +}; + +#define for_each_btf_ext_sec(seg, sec) \ + for (sec = (seg)->info; \ + (void *)sec < (seg)->info + (seg)->len; \ + sec = (void *)sec + sizeof(struct btf_ext_info_sec) + \ + (seg)->rec_size * sec->num_info) + +#define for_each_btf_ext_rec(seg, sec, i, rec) \ + for (i = 0, rec = (void *)&(sec)->data; \ + i < (sec)->num_info; \ + i++, rec = (void *)rec + (seg)->rec_size) + +/* + * The .BTF.ext ELF section layout defined as + * struct btf_ext_header + * func_info subsection + * + * The func_info subsection layout: + * record size for struct bpf_func_info in the func_info subsection + * struct btf_sec_func_info for section #1 + * a list of bpf_func_info records for section #1 + * where struct bpf_func_info mimics one in include/uapi/linux/bpf.h + * but may not be identical + * struct btf_sec_func_info for section #2 + * a list of bpf_func_info records for section #2 + * ...... + * + * Note that the bpf_func_info record size in .BTF.ext may not + * be the same as the one defined in include/uapi/linux/bpf.h. + * The loader should ensure that record_size meets minimum + * requirement and pass the record as is to the kernel. The + * kernel will handle the func_info properly based on its contents. + */ +struct btf_ext_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + + /* All offsets are in bytes relative to the end of this header */ + __u32 func_info_off; + __u32 func_info_len; + __u32 line_info_off; + __u32 line_info_len; + + /* optional part of .BTF.ext header */ + __u32 core_relo_off; + __u32 core_relo_len; +}; + +struct btf_ext { + union { + struct btf_ext_header *hdr; + void *data; + }; + struct btf_ext_info func_info; + struct btf_ext_info line_info; + struct btf_ext_info core_relo_info; + __u32 data_size; +}; + +struct btf_ext_info_sec { + __u32 sec_name_off; + __u32 num_info; + /* Followed by num_info * record_size number of bytes */ + __u8 data[]; +}; + +/* The minimum bpf_func_info checked by the loader */ +struct bpf_func_info_min { + __u32 insn_off; + __u32 type_id; +}; + +/* The minimum bpf_line_info checked by the loader */ +struct bpf_line_info_min { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + + +typedef int (*type_id_visit_fn)(__u32 *type_id, void *ctx); +typedef int (*str_off_visit_fn)(__u32 *str_off, void *ctx); +int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx); +int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx); +int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx); +int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx); +__s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, + __u32 kind); + +typedef int (*kallsyms_cb_t)(unsigned long long sym_addr, char sym_type, + const char *sym_name, void *ctx); + +int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *arg); + +/* handle direct returned errors */ +static inline int libbpf_err(int ret) +{ + if (ret < 0) + errno = -ret; + return ret; +} + +/* handle errno-based (e.g., syscall or libc) errors according to libbpf's + * strict mode settings + */ +static inline int libbpf_err_errno(int ret) +{ + /* errno is already assumed to be set on error */ + return ret < 0 ? -errno : ret; +} + +/* handle error for pointer-returning APIs, err is assumed to be < 0 always */ +static inline void *libbpf_err_ptr(int err) +{ + /* set errno on error, this doesn't break anything */ + errno = -err; + return NULL; +} + +/* handle pointer-returning APIs' error handling */ +static inline void *libbpf_ptr(void *ret) +{ + /* set errno on error, this doesn't break anything */ + if (IS_ERR(ret)) + errno = -PTR_ERR(ret); + + return IS_ERR(ret) ? NULL : ret; +} + +static inline bool str_is_empty(const char *s) +{ + return !s || !s[0]; +} + +static inline bool is_ldimm64_insn(struct bpf_insn *insn) +{ + return insn->code == (BPF_LD | BPF_IMM | BPF_DW); +} + +/* if fd is stdin, stdout, or stderr, dup to a fd greater than 2 + * Takes ownership of the fd passed in, and closes it if calling + * fcntl(fd, F_DUPFD_CLOEXEC, 3). + */ +static inline int ensure_good_fd(int fd) +{ + int old_fd = fd, saved_errno; + + if (fd < 0) + return fd; + if (fd < 3) { + fd = fcntl(fd, F_DUPFD_CLOEXEC, 3); + saved_errno = errno; + close(old_fd); + errno = saved_errno; + if (fd < 0) { + pr_warn("failed to dup FD %d to FD > 2: %d\n", old_fd, -saved_errno); + errno = saved_errno; + } + } + return fd; +} + +/* The following two functions are exposed to bpftool */ +int bpf_core_add_cands(struct bpf_core_cand *local_cand, + size_t local_essent_len, + const struct btf *targ_btf, + const char *targ_btf_name, + int targ_start_id, + struct bpf_core_cand_list *cands); +void bpf_core_free_cands(struct bpf_core_cand_list *cands); + +struct usdt_manager *usdt_manager_new(struct bpf_object *obj); +void usdt_manager_free(struct usdt_manager *man); +struct bpf_link * usdt_manager_attach_usdt(struct usdt_manager *man, + const struct bpf_program *prog, + pid_t pid, const char *path, + const char *usdt_provider, const char *usdt_name, + __u64 usdt_cookie); + +static inline bool is_pow_of_2(size_t x) +{ + return x && (x & (x - 1)) == 0; +} + +#define PROG_LOAD_ATTEMPTS 5 +int sys_bpf_prog_load(union bpf_attr *attr, unsigned int size, int attempts); + +#endif /* __LIBBPF_LIBBPF_INTERNAL_H */ diff --git a/libbpf/src/libbpf_legacy.h b/libbpf/src/libbpf_legacy.h new file mode 100644 index 0000000..1e1be46 --- /dev/null +++ b/libbpf/src/libbpf_legacy.h @@ -0,0 +1,140 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Libbpf legacy APIs (either discouraged or deprecated, as mentioned in [0]) + * + * [0] https://docs.google.com/document/d/1UyjTZuPFWiPFyKk1tV5an11_iaRuec6U-ZESZ54nNTY + * + * Copyright (C) 2021 Facebook + */ +#ifndef __LIBBPF_LEGACY_BPF_H +#define __LIBBPF_LEGACY_BPF_H + +#include +#include +#include +#include +#include "libbpf_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* As of libbpf 1.0 libbpf_set_strict_mode() and enum libbpf_struct_mode have + * no effect. But they are left in libbpf_legacy.h so that applications that + * prepared for libbpf 1.0 before final release by using + * libbpf_set_strict_mode() still work with libbpf 1.0+ without any changes. + */ +enum libbpf_strict_mode { + /* Turn on all supported strict features of libbpf to simulate libbpf + * v1.0 behavior. + * This will be the default behavior in libbpf v1.0. + */ + LIBBPF_STRICT_ALL = 0xffffffff, + + /* + * Disable any libbpf 1.0 behaviors. This is the default before libbpf + * v1.0. It won't be supported anymore in v1.0, please update your + * code so that it handles LIBBPF_STRICT_ALL mode before libbpf v1.0. + */ + LIBBPF_STRICT_NONE = 0x00, + /* + * Return NULL pointers on error, not ERR_PTR(err). + * Additionally, libbpf also always sets errno to corresponding Exx + * (positive) error code. + */ + LIBBPF_STRICT_CLEAN_PTRS = 0x01, + /* + * Return actual error codes from low-level APIs directly, not just -1. + * Additionally, libbpf also always sets errno to corresponding Exx + * (positive) error code. + */ + LIBBPF_STRICT_DIRECT_ERRS = 0x02, + /* + * Enforce strict BPF program section (SEC()) names. + * E.g., while prefiously SEC("xdp_whatever") or SEC("perf_event_blah") were + * allowed, with LIBBPF_STRICT_SEC_PREFIX this will become + * unrecognized by libbpf and would have to be just SEC("xdp") and + * SEC("xdp") and SEC("perf_event"). + * + * Note, in this mode the program pin path will be based on the + * function name instead of section name. + * + * Additionally, routines in the .text section are always considered + * sub-programs. Legacy behavior allows for a single routine in .text + * to be a program. + */ + LIBBPF_STRICT_SEC_NAME = 0x04, + /* + * Disable the global 'bpf_objects_list'. Maintaining this list adds + * a race condition to bpf_object__open() and bpf_object__close(). + * Clients can maintain it on their own if it is valuable for them. + */ + LIBBPF_STRICT_NO_OBJECT_LIST = 0x08, + /* + * Automatically bump RLIMIT_MEMLOCK using setrlimit() before the + * first BPF program or map creation operation. This is done only if + * kernel is too old to support memcg-based memory accounting for BPF + * subsystem. By default, RLIMIT_MEMLOCK limit is set to RLIM_INFINITY, + * but it can be overriden with libbpf_set_memlock_rlim() API. + * Note that libbpf_set_memlock_rlim() needs to be called before + * the very first bpf_prog_load(), bpf_map_create() or bpf_object__load() + * operation. + */ + LIBBPF_STRICT_AUTO_RLIMIT_MEMLOCK = 0x10, + /* + * Error out on any SEC("maps") map definition, which are deprecated + * in favor of BTF-defined map definitions in SEC(".maps"). + */ + LIBBPF_STRICT_MAP_DEFINITIONS = 0x20, + + __LIBBPF_STRICT_LAST, +}; + +LIBBPF_API int libbpf_set_strict_mode(enum libbpf_strict_mode mode); + +/** + * @brief **libbpf_get_error()** extracts the error code from the passed + * pointer + * @param ptr pointer returned from libbpf API function + * @return error code; or 0 if no error occured + * + * Note, as of libbpf 1.0 this function is not necessary and not recommended + * to be used. Libbpf doesn't return error code embedded into the pointer + * itself. Instead, NULL is returned on error and error code is passed through + * thread-local errno variable. **libbpf_get_error()** is just returning -errno + * value if it receives NULL, which is correct only if errno hasn't been + * modified between libbpf API call and corresponding **libbpf_get_error()** + * call. Prefer to check return for NULL and use errno directly. + * + * This API is left in libbpf 1.0 to allow applications that were 1.0-ready + * before final libbpf 1.0 without needing to change them. + */ +LIBBPF_API long libbpf_get_error(const void *ptr); + +#define DECLARE_LIBBPF_OPTS LIBBPF_OPTS + +/* "Discouraged" APIs which don't follow consistent libbpf naming patterns. + * They are normally a trivial aliases or wrappers for proper APIs and are + * left to minimize unnecessary disruption for users of libbpf. But they + * shouldn't be used going forward. + */ + +struct bpf_program; +struct bpf_map; +struct btf; +struct btf_ext; + +LIBBPF_API struct btf *libbpf_find_kernel_btf(void); + +LIBBPF_API enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog); +LIBBPF_API enum bpf_attach_type bpf_program__get_expected_attach_type(const struct bpf_program *prog); +LIBBPF_API const char *bpf_map__get_pin_path(const struct bpf_map *map); +LIBBPF_API const void *btf__get_raw_data(const struct btf *btf, __u32 *size); +LIBBPF_API const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __LIBBPF_LEGACY_BPF_H */ diff --git a/libbpf/src/libbpf_probes.c b/libbpf/src/libbpf_probes.c new file mode 100644 index 0000000..4f3bc96 --- /dev/null +++ b/libbpf/src/libbpf_probes.c @@ -0,0 +1,447 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2019 Netronome Systems, Inc. */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" + +/* On Ubuntu LINUX_VERSION_CODE doesn't correspond to info.release, + * but Ubuntu provides /proc/version_signature file, as described at + * https://ubuntu.com/kernel, with an example contents below, which we + * can use to get a proper LINUX_VERSION_CODE. + * + * Ubuntu 5.4.0-12.15-generic 5.4.8 + * + * In the above, 5.4.8 is what kernel is actually expecting, while + * uname() call will return 5.4.0 in info.release. + */ +static __u32 get_ubuntu_kernel_version(void) +{ + const char *ubuntu_kver_file = "/proc/version_signature"; + __u32 major, minor, patch; + int ret; + FILE *f; + + if (faccessat(AT_FDCWD, ubuntu_kver_file, R_OK, AT_EACCESS) != 0) + return 0; + + f = fopen(ubuntu_kver_file, "r"); + if (!f) + return 0; + + ret = fscanf(f, "%*s %*s %u.%u.%u\n", &major, &minor, &patch); + fclose(f); + if (ret != 3) + return 0; + + return KERNEL_VERSION(major, minor, patch); +} + +/* On Debian LINUX_VERSION_CODE doesn't correspond to info.release. + * Instead, it is provided in info.version. An example content of + * Debian 10 looks like the below. + * + * utsname::release 4.19.0-22-amd64 + * utsname::version #1 SMP Debian 4.19.260-1 (2022-09-29) + * + * In the above, 4.19.260 is what kernel is actually expecting, while + * uname() call will return 4.19.0 in info.release. + */ +static __u32 get_debian_kernel_version(struct utsname *info) +{ + __u32 major, minor, patch; + char *p; + + p = strstr(info->version, "Debian "); + if (!p) { + /* This is not a Debian kernel. */ + return 0; + } + + if (sscanf(p, "Debian %u.%u.%u", &major, &minor, &patch) != 3) + return 0; + + return KERNEL_VERSION(major, minor, patch); +} + +__u32 get_kernel_version(void) +{ + __u32 major, minor, patch, version; + struct utsname info; + + /* Check if this is an Ubuntu kernel. */ + version = get_ubuntu_kernel_version(); + if (version != 0) + return version; + + uname(&info); + + /* Check if this is a Debian kernel. */ + version = get_debian_kernel_version(&info); + if (version != 0) + return version; + + if (sscanf(info.release, "%u.%u.%u", &major, &minor, &patch) != 3) + return 0; + + return KERNEL_VERSION(major, minor, patch); +} + +static int probe_prog_load(enum bpf_prog_type prog_type, + const struct bpf_insn *insns, size_t insns_cnt, + char *log_buf, size_t log_buf_sz) +{ + LIBBPF_OPTS(bpf_prog_load_opts, opts, + .log_buf = log_buf, + .log_size = log_buf_sz, + .log_level = log_buf ? 1 : 0, + ); + int fd, err, exp_err = 0; + const char *exp_msg = NULL; + char buf[4096]; + + switch (prog_type) { + case BPF_PROG_TYPE_CGROUP_SOCK_ADDR: + opts.expected_attach_type = BPF_CGROUP_INET4_CONNECT; + break; + case BPF_PROG_TYPE_CGROUP_SOCKOPT: + opts.expected_attach_type = BPF_CGROUP_GETSOCKOPT; + break; + case BPF_PROG_TYPE_SK_LOOKUP: + opts.expected_attach_type = BPF_SK_LOOKUP; + break; + case BPF_PROG_TYPE_KPROBE: + opts.kern_version = get_kernel_version(); + break; + case BPF_PROG_TYPE_LIRC_MODE2: + opts.expected_attach_type = BPF_LIRC_MODE2; + break; + case BPF_PROG_TYPE_TRACING: + case BPF_PROG_TYPE_LSM: + opts.log_buf = buf; + opts.log_size = sizeof(buf); + opts.log_level = 1; + if (prog_type == BPF_PROG_TYPE_TRACING) + opts.expected_attach_type = BPF_TRACE_FENTRY; + else + opts.expected_attach_type = BPF_MODIFY_RETURN; + opts.attach_btf_id = 1; + + exp_err = -EINVAL; + exp_msg = "attach_btf_id 1 is not a function"; + break; + case BPF_PROG_TYPE_EXT: + opts.log_buf = buf; + opts.log_size = sizeof(buf); + opts.log_level = 1; + opts.attach_btf_id = 1; + + exp_err = -EINVAL; + exp_msg = "Cannot replace kernel functions"; + break; + case BPF_PROG_TYPE_SYSCALL: + opts.prog_flags = BPF_F_SLEEPABLE; + break; + case BPF_PROG_TYPE_STRUCT_OPS: + exp_err = -524; /* -ENOTSUPP */ + break; + case BPF_PROG_TYPE_UNSPEC: + case BPF_PROG_TYPE_SOCKET_FILTER: + case BPF_PROG_TYPE_SCHED_CLS: + case BPF_PROG_TYPE_SCHED_ACT: + case BPF_PROG_TYPE_TRACEPOINT: + case BPF_PROG_TYPE_XDP: + case BPF_PROG_TYPE_PERF_EVENT: + case BPF_PROG_TYPE_CGROUP_SKB: + case BPF_PROG_TYPE_CGROUP_SOCK: + case BPF_PROG_TYPE_LWT_IN: + case BPF_PROG_TYPE_LWT_OUT: + case BPF_PROG_TYPE_LWT_XMIT: + case BPF_PROG_TYPE_SOCK_OPS: + case BPF_PROG_TYPE_SK_SKB: + case BPF_PROG_TYPE_CGROUP_DEVICE: + case BPF_PROG_TYPE_SK_MSG: + case BPF_PROG_TYPE_RAW_TRACEPOINT: + case BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE: + case BPF_PROG_TYPE_LWT_SEG6LOCAL: + case BPF_PROG_TYPE_SK_REUSEPORT: + case BPF_PROG_TYPE_FLOW_DISSECTOR: + case BPF_PROG_TYPE_CGROUP_SYSCTL: + break; + default: + return -EOPNOTSUPP; + } + + fd = bpf_prog_load(prog_type, NULL, "GPL", insns, insns_cnt, &opts); + err = -errno; + if (fd >= 0) + close(fd); + if (exp_err) { + if (fd >= 0 || err != exp_err) + return 0; + if (exp_msg && !strstr(buf, exp_msg)) + return 0; + return 1; + } + return fd >= 0 ? 1 : 0; +} + +int libbpf_probe_bpf_prog_type(enum bpf_prog_type prog_type, const void *opts) +{ + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN() + }; + const size_t insn_cnt = ARRAY_SIZE(insns); + int ret; + + if (opts) + return libbpf_err(-EINVAL); + + ret = probe_prog_load(prog_type, insns, insn_cnt, NULL, 0); + return libbpf_err(ret); +} + +int libbpf__load_raw_btf(const char *raw_types, size_t types_len, + const char *str_sec, size_t str_len) +{ + struct btf_header hdr = { + .magic = BTF_MAGIC, + .version = BTF_VERSION, + .hdr_len = sizeof(struct btf_header), + .type_len = types_len, + .str_off = types_len, + .str_len = str_len, + }; + int btf_fd, btf_len; + __u8 *raw_btf; + + btf_len = hdr.hdr_len + hdr.type_len + hdr.str_len; + raw_btf = malloc(btf_len); + if (!raw_btf) + return -ENOMEM; + + memcpy(raw_btf, &hdr, sizeof(hdr)); + memcpy(raw_btf + hdr.hdr_len, raw_types, hdr.type_len); + memcpy(raw_btf + hdr.hdr_len + hdr.type_len, str_sec, hdr.str_len); + + btf_fd = bpf_btf_load(raw_btf, btf_len, NULL); + + free(raw_btf); + return btf_fd; +} + +static int load_local_storage_btf(void) +{ + const char strs[] = "\0bpf_spin_lock\0val\0cnt\0l"; + /* struct bpf_spin_lock { + * int val; + * }; + * struct val { + * int cnt; + * struct bpf_spin_lock l; + * }; + */ + __u32 types[] = { + /* int */ + BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4), /* [1] */ + /* struct bpf_spin_lock */ /* [2] */ + BTF_TYPE_ENC(1, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 1), 4), + BTF_MEMBER_ENC(15, 1, 0), /* int val; */ + /* struct val */ /* [3] */ + BTF_TYPE_ENC(15, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 8), + BTF_MEMBER_ENC(19, 1, 0), /* int cnt; */ + BTF_MEMBER_ENC(23, 2, 32),/* struct bpf_spin_lock l; */ + }; + + return libbpf__load_raw_btf((char *)types, sizeof(types), + strs, sizeof(strs)); +} + +static int probe_map_create(enum bpf_map_type map_type) +{ + LIBBPF_OPTS(bpf_map_create_opts, opts); + int key_size, value_size, max_entries; + __u32 btf_key_type_id = 0, btf_value_type_id = 0; + int fd = -1, btf_fd = -1, fd_inner = -1, exp_err = 0, err = 0; + + key_size = sizeof(__u32); + value_size = sizeof(__u32); + max_entries = 1; + + switch (map_type) { + case BPF_MAP_TYPE_STACK_TRACE: + value_size = sizeof(__u64); + break; + case BPF_MAP_TYPE_LPM_TRIE: + key_size = sizeof(__u64); + value_size = sizeof(__u64); + opts.map_flags = BPF_F_NO_PREALLOC; + break; + case BPF_MAP_TYPE_CGROUP_STORAGE: + case BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: + key_size = sizeof(struct bpf_cgroup_storage_key); + value_size = sizeof(__u64); + max_entries = 0; + break; + case BPF_MAP_TYPE_QUEUE: + case BPF_MAP_TYPE_STACK: + key_size = 0; + break; + case BPF_MAP_TYPE_SK_STORAGE: + case BPF_MAP_TYPE_INODE_STORAGE: + case BPF_MAP_TYPE_TASK_STORAGE: + case BPF_MAP_TYPE_CGRP_STORAGE: + btf_key_type_id = 1; + btf_value_type_id = 3; + value_size = 8; + max_entries = 0; + opts.map_flags = BPF_F_NO_PREALLOC; + btf_fd = load_local_storage_btf(); + if (btf_fd < 0) + return btf_fd; + break; + case BPF_MAP_TYPE_RINGBUF: + case BPF_MAP_TYPE_USER_RINGBUF: + key_size = 0; + value_size = 0; + max_entries = sysconf(_SC_PAGE_SIZE); + break; + case BPF_MAP_TYPE_STRUCT_OPS: + /* we'll get -ENOTSUPP for invalid BTF type ID for struct_ops */ + opts.btf_vmlinux_value_type_id = 1; + exp_err = -524; /* -ENOTSUPP */ + break; + case BPF_MAP_TYPE_BLOOM_FILTER: + key_size = 0; + max_entries = 1; + break; + case BPF_MAP_TYPE_HASH: + case BPF_MAP_TYPE_ARRAY: + case BPF_MAP_TYPE_PROG_ARRAY: + case BPF_MAP_TYPE_PERF_EVENT_ARRAY: + case BPF_MAP_TYPE_PERCPU_HASH: + case BPF_MAP_TYPE_PERCPU_ARRAY: + case BPF_MAP_TYPE_CGROUP_ARRAY: + case BPF_MAP_TYPE_LRU_HASH: + case BPF_MAP_TYPE_LRU_PERCPU_HASH: + case BPF_MAP_TYPE_ARRAY_OF_MAPS: + case BPF_MAP_TYPE_HASH_OF_MAPS: + case BPF_MAP_TYPE_DEVMAP: + case BPF_MAP_TYPE_DEVMAP_HASH: + case BPF_MAP_TYPE_SOCKMAP: + case BPF_MAP_TYPE_CPUMAP: + case BPF_MAP_TYPE_XSKMAP: + case BPF_MAP_TYPE_SOCKHASH: + case BPF_MAP_TYPE_REUSEPORT_SOCKARRAY: + break; + case BPF_MAP_TYPE_UNSPEC: + default: + return -EOPNOTSUPP; + } + + if (map_type == BPF_MAP_TYPE_ARRAY_OF_MAPS || + map_type == BPF_MAP_TYPE_HASH_OF_MAPS) { + fd_inner = bpf_map_create(BPF_MAP_TYPE_HASH, NULL, + sizeof(__u32), sizeof(__u32), 1, NULL); + if (fd_inner < 0) + goto cleanup; + + opts.inner_map_fd = fd_inner; + } + + if (btf_fd >= 0) { + opts.btf_fd = btf_fd; + opts.btf_key_type_id = btf_key_type_id; + opts.btf_value_type_id = btf_value_type_id; + } + + fd = bpf_map_create(map_type, NULL, key_size, value_size, max_entries, &opts); + err = -errno; + +cleanup: + if (fd >= 0) + close(fd); + if (fd_inner >= 0) + close(fd_inner); + if (btf_fd >= 0) + close(btf_fd); + + if (exp_err) + return fd < 0 && err == exp_err ? 1 : 0; + else + return fd >= 0 ? 1 : 0; +} + +int libbpf_probe_bpf_map_type(enum bpf_map_type map_type, const void *opts) +{ + int ret; + + if (opts) + return libbpf_err(-EINVAL); + + ret = probe_map_create(map_type); + return libbpf_err(ret); +} + +int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, enum bpf_func_id helper_id, + const void *opts) +{ + struct bpf_insn insns[] = { + BPF_EMIT_CALL((__u32)helper_id), + BPF_EXIT_INSN(), + }; + const size_t insn_cnt = ARRAY_SIZE(insns); + char buf[4096]; + int ret; + + if (opts) + return libbpf_err(-EINVAL); + + /* we can't successfully load all prog types to check for BPF helper + * support, so bail out with -EOPNOTSUPP error + */ + switch (prog_type) { + case BPF_PROG_TYPE_TRACING: + case BPF_PROG_TYPE_EXT: + case BPF_PROG_TYPE_LSM: + case BPF_PROG_TYPE_STRUCT_OPS: + return -EOPNOTSUPP; + default: + break; + } + + buf[0] = '\0'; + ret = probe_prog_load(prog_type, insns, insn_cnt, buf, sizeof(buf)); + if (ret < 0) + return libbpf_err(ret); + + /* If BPF verifier doesn't recognize BPF helper ID (enum bpf_func_id) + * at all, it will emit something like "invalid func unknown#181". + * If BPF verifier recognizes BPF helper but it's not supported for + * given BPF program type, it will emit "unknown func bpf_sys_bpf#166". + * In both cases, provided combination of BPF program type and BPF + * helper is not supported by the kernel. + * In all other cases, probe_prog_load() above will either succeed (e.g., + * because BPF helper happens to accept no input arguments or it + * accepts one input argument and initial PTR_TO_CTX is fine for + * that), or we'll get some more specific BPF verifier error about + * some unsatisfied conditions. + */ + if (ret == 0 && (strstr(buf, "invalid func ") || strstr(buf, "unknown func "))) + return 0; + return 1; /* assume supported */ +} diff --git a/libbpf/src/libbpf_version.h b/libbpf/src/libbpf_version.h new file mode 100644 index 0000000..1fd2eea --- /dev/null +++ b/libbpf/src/libbpf_version.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (C) 2021 Facebook */ +#ifndef __LIBBPF_VERSION_H +#define __LIBBPF_VERSION_H + +#define LIBBPF_MAJOR_VERSION 1 +#define LIBBPF_MINOR_VERSION 2 + +#endif /* __LIBBPF_VERSION_H */ diff --git a/libbpf/src/linker.c b/libbpf/src/linker.c new file mode 100644 index 0000000..d706978 --- /dev/null +++ b/libbpf/src/linker.c @@ -0,0 +1,2893 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* + * BPF static linker + * + * Copyright (c) 2021 Facebook + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "libbpf.h" +#include "btf.h" +#include "libbpf_internal.h" +#include "strset.h" + +#define BTF_EXTERN_SEC ".extern" + +struct src_sec { + const char *sec_name; + /* positional (not necessarily ELF) index in an array of sections */ + int id; + /* positional (not necessarily ELF) index of a matching section in a final object file */ + int dst_id; + /* section data offset in a matching output section */ + int dst_off; + /* whether section is omitted from the final ELF file */ + bool skipped; + /* whether section is an ephemeral section, not mapped to an ELF section */ + bool ephemeral; + + /* ELF info */ + size_t sec_idx; + Elf_Scn *scn; + Elf64_Shdr *shdr; + Elf_Data *data; + + /* corresponding BTF DATASEC type ID */ + int sec_type_id; +}; + +struct src_obj { + const char *filename; + int fd; + Elf *elf; + /* Section header strings section index */ + size_t shstrs_sec_idx; + /* SYMTAB section index */ + size_t symtab_sec_idx; + + struct btf *btf; + struct btf_ext *btf_ext; + + /* List of sections (including ephemeral). Slot zero is unused. */ + struct src_sec *secs; + int sec_cnt; + + /* mapping of symbol indices from src to dst ELF */ + int *sym_map; + /* mapping from the src BTF type IDs to dst ones */ + int *btf_type_map; +}; + +/* single .BTF.ext data section */ +struct btf_ext_sec_data { + size_t rec_cnt; + __u32 rec_sz; + void *recs; +}; + +struct glob_sym { + /* ELF symbol index */ + int sym_idx; + /* associated section id for .ksyms, .kconfig, etc, but not .extern */ + int sec_id; + /* extern name offset in STRTAB */ + int name_off; + /* optional associated BTF type ID */ + int btf_id; + /* BTF type ID to which VAR/FUNC type is pointing to; used for + * rewriting types when extern VAR/FUNC is resolved to a concrete + * definition + */ + int underlying_btf_id; + /* sec_var index in the corresponding dst_sec, if exists */ + int var_idx; + + /* extern or resolved/global symbol */ + bool is_extern; + /* weak or strong symbol, never goes back from strong to weak */ + bool is_weak; +}; + +struct dst_sec { + char *sec_name; + /* positional (not necessarily ELF) index in an array of sections */ + int id; + + bool ephemeral; + + /* ELF info */ + size_t sec_idx; + Elf_Scn *scn; + Elf64_Shdr *shdr; + Elf_Data *data; + + /* final output section size */ + int sec_sz; + /* final output contents of the section */ + void *raw_data; + + /* corresponding STT_SECTION symbol index in SYMTAB */ + int sec_sym_idx; + + /* section's DATASEC variable info, emitted on BTF finalization */ + bool has_btf; + int sec_var_cnt; + struct btf_var_secinfo *sec_vars; + + /* section's .BTF.ext data */ + struct btf_ext_sec_data func_info; + struct btf_ext_sec_data line_info; + struct btf_ext_sec_data core_relo_info; +}; + +struct bpf_linker { + char *filename; + int fd; + Elf *elf; + Elf64_Ehdr *elf_hdr; + + /* Output sections metadata */ + struct dst_sec *secs; + int sec_cnt; + + struct strset *strtab_strs; /* STRTAB unique strings */ + size_t strtab_sec_idx; /* STRTAB section index */ + size_t symtab_sec_idx; /* SYMTAB section index */ + + struct btf *btf; + struct btf_ext *btf_ext; + + /* global (including extern) ELF symbols */ + int glob_sym_cnt; + struct glob_sym *glob_syms; +}; + +#define pr_warn_elf(fmt, ...) \ + libbpf_print(LIBBPF_WARN, "libbpf: " fmt ": %s\n", ##__VA_ARGS__, elf_errmsg(-1)) + +static int init_output_elf(struct bpf_linker *linker, const char *file); + +static int linker_load_obj_file(struct bpf_linker *linker, const char *filename, + const struct bpf_linker_file_opts *opts, + struct src_obj *obj); +static int linker_sanity_check_elf(struct src_obj *obj); +static int linker_sanity_check_elf_symtab(struct src_obj *obj, struct src_sec *sec); +static int linker_sanity_check_elf_relos(struct src_obj *obj, struct src_sec *sec); +static int linker_sanity_check_btf(struct src_obj *obj); +static int linker_sanity_check_btf_ext(struct src_obj *obj); +static int linker_fixup_btf(struct src_obj *obj); +static int linker_append_sec_data(struct bpf_linker *linker, struct src_obj *obj); +static int linker_append_elf_syms(struct bpf_linker *linker, struct src_obj *obj); +static int linker_append_elf_sym(struct bpf_linker *linker, struct src_obj *obj, + Elf64_Sym *sym, const char *sym_name, int src_sym_idx); +static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *obj); +static int linker_append_btf(struct bpf_linker *linker, struct src_obj *obj); +static int linker_append_btf_ext(struct bpf_linker *linker, struct src_obj *obj); + +static int finalize_btf(struct bpf_linker *linker); +static int finalize_btf_ext(struct bpf_linker *linker); + +void bpf_linker__free(struct bpf_linker *linker) +{ + int i; + + if (!linker) + return; + + free(linker->filename); + + if (linker->elf) + elf_end(linker->elf); + + if (linker->fd >= 0) + close(linker->fd); + + strset__free(linker->strtab_strs); + + btf__free(linker->btf); + btf_ext__free(linker->btf_ext); + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + free(sec->sec_name); + free(sec->raw_data); + free(sec->sec_vars); + + free(sec->func_info.recs); + free(sec->line_info.recs); + free(sec->core_relo_info.recs); + } + free(linker->secs); + + free(linker->glob_syms); + free(linker); +} + +struct bpf_linker *bpf_linker__new(const char *filename, struct bpf_linker_opts *opts) +{ + struct bpf_linker *linker; + int err; + + if (!OPTS_VALID(opts, bpf_linker_opts)) + return errno = EINVAL, NULL; + + if (elf_version(EV_CURRENT) == EV_NONE) { + pr_warn_elf("libelf initialization failed"); + return errno = EINVAL, NULL; + } + + linker = calloc(1, sizeof(*linker)); + if (!linker) + return errno = ENOMEM, NULL; + + linker->fd = -1; + + err = init_output_elf(linker, filename); + if (err) + goto err_out; + + return linker; + +err_out: + bpf_linker__free(linker); + return errno = -err, NULL; +} + +static struct dst_sec *add_dst_sec(struct bpf_linker *linker, const char *sec_name) +{ + struct dst_sec *secs = linker->secs, *sec; + size_t new_cnt = linker->sec_cnt ? linker->sec_cnt + 1 : 2; + + secs = libbpf_reallocarray(secs, new_cnt, sizeof(*secs)); + if (!secs) + return NULL; + + /* zero out newly allocated memory */ + memset(secs + linker->sec_cnt, 0, (new_cnt - linker->sec_cnt) * sizeof(*secs)); + + linker->secs = secs; + linker->sec_cnt = new_cnt; + + sec = &linker->secs[new_cnt - 1]; + sec->id = new_cnt - 1; + sec->sec_name = strdup(sec_name); + if (!sec->sec_name) + return NULL; + + return sec; +} + +static Elf64_Sym *add_new_sym(struct bpf_linker *linker, size_t *sym_idx) +{ + struct dst_sec *symtab = &linker->secs[linker->symtab_sec_idx]; + Elf64_Sym *syms, *sym; + size_t sym_cnt = symtab->sec_sz / sizeof(*sym); + + syms = libbpf_reallocarray(symtab->raw_data, sym_cnt + 1, sizeof(*sym)); + if (!syms) + return NULL; + + sym = &syms[sym_cnt]; + memset(sym, 0, sizeof(*sym)); + + symtab->raw_data = syms; + symtab->sec_sz += sizeof(*sym); + symtab->shdr->sh_size += sizeof(*sym); + symtab->data->d_size += sizeof(*sym); + + if (sym_idx) + *sym_idx = sym_cnt; + + return sym; +} + +static int init_output_elf(struct bpf_linker *linker, const char *file) +{ + int err, str_off; + Elf64_Sym *init_sym; + struct dst_sec *sec; + + linker->filename = strdup(file); + if (!linker->filename) + return -ENOMEM; + + linker->fd = open(file, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644); + if (linker->fd < 0) { + err = -errno; + pr_warn("failed to create '%s': %d\n", file, err); + return err; + } + + linker->elf = elf_begin(linker->fd, ELF_C_WRITE, NULL); + if (!linker->elf) { + pr_warn_elf("failed to create ELF object"); + return -EINVAL; + } + + /* ELF header */ + linker->elf_hdr = elf64_newehdr(linker->elf); + if (!linker->elf_hdr) { + pr_warn_elf("failed to create ELF header"); + return -EINVAL; + } + + linker->elf_hdr->e_machine = EM_BPF; + linker->elf_hdr->e_type = ET_REL; +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + linker->elf_hdr->e_ident[EI_DATA] = ELFDATA2LSB; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + linker->elf_hdr->e_ident[EI_DATA] = ELFDATA2MSB; +#else +#error "Unknown __BYTE_ORDER__" +#endif + + /* STRTAB */ + /* initialize strset with an empty string to conform to ELF */ + linker->strtab_strs = strset__new(INT_MAX, "", sizeof("")); + if (libbpf_get_error(linker->strtab_strs)) + return libbpf_get_error(linker->strtab_strs); + + sec = add_dst_sec(linker, ".strtab"); + if (!sec) + return -ENOMEM; + + sec->scn = elf_newscn(linker->elf); + if (!sec->scn) { + pr_warn_elf("failed to create STRTAB section"); + return -EINVAL; + } + + sec->shdr = elf64_getshdr(sec->scn); + if (!sec->shdr) + return -EINVAL; + + sec->data = elf_newdata(sec->scn); + if (!sec->data) { + pr_warn_elf("failed to create STRTAB data"); + return -EINVAL; + } + + str_off = strset__add_str(linker->strtab_strs, sec->sec_name); + if (str_off < 0) + return str_off; + + sec->sec_idx = elf_ndxscn(sec->scn); + linker->elf_hdr->e_shstrndx = sec->sec_idx; + linker->strtab_sec_idx = sec->sec_idx; + + sec->shdr->sh_name = str_off; + sec->shdr->sh_type = SHT_STRTAB; + sec->shdr->sh_flags = SHF_STRINGS; + sec->shdr->sh_offset = 0; + sec->shdr->sh_link = 0; + sec->shdr->sh_info = 0; + sec->shdr->sh_addralign = 1; + sec->shdr->sh_size = sec->sec_sz = 0; + sec->shdr->sh_entsize = 0; + + /* SYMTAB */ + sec = add_dst_sec(linker, ".symtab"); + if (!sec) + return -ENOMEM; + + sec->scn = elf_newscn(linker->elf); + if (!sec->scn) { + pr_warn_elf("failed to create SYMTAB section"); + return -EINVAL; + } + + sec->shdr = elf64_getshdr(sec->scn); + if (!sec->shdr) + return -EINVAL; + + sec->data = elf_newdata(sec->scn); + if (!sec->data) { + pr_warn_elf("failed to create SYMTAB data"); + return -EINVAL; + } + + str_off = strset__add_str(linker->strtab_strs, sec->sec_name); + if (str_off < 0) + return str_off; + + sec->sec_idx = elf_ndxscn(sec->scn); + linker->symtab_sec_idx = sec->sec_idx; + + sec->shdr->sh_name = str_off; + sec->shdr->sh_type = SHT_SYMTAB; + sec->shdr->sh_flags = 0; + sec->shdr->sh_offset = 0; + sec->shdr->sh_link = linker->strtab_sec_idx; + /* sh_info should be one greater than the index of the last local + * symbol (i.e., binding is STB_LOCAL). But why and who cares? + */ + sec->shdr->sh_info = 0; + sec->shdr->sh_addralign = 8; + sec->shdr->sh_entsize = sizeof(Elf64_Sym); + + /* .BTF */ + linker->btf = btf__new_empty(); + err = libbpf_get_error(linker->btf); + if (err) + return err; + + /* add the special all-zero symbol */ + init_sym = add_new_sym(linker, NULL); + if (!init_sym) + return -EINVAL; + + init_sym->st_name = 0; + init_sym->st_info = 0; + init_sym->st_other = 0; + init_sym->st_shndx = SHN_UNDEF; + init_sym->st_value = 0; + init_sym->st_size = 0; + + return 0; +} + +int bpf_linker__add_file(struct bpf_linker *linker, const char *filename, + const struct bpf_linker_file_opts *opts) +{ + struct src_obj obj = {}; + int err = 0; + + if (!OPTS_VALID(opts, bpf_linker_file_opts)) + return libbpf_err(-EINVAL); + + if (!linker->elf) + return libbpf_err(-EINVAL); + + err = err ?: linker_load_obj_file(linker, filename, opts, &obj); + err = err ?: linker_append_sec_data(linker, &obj); + err = err ?: linker_append_elf_syms(linker, &obj); + err = err ?: linker_append_elf_relos(linker, &obj); + err = err ?: linker_append_btf(linker, &obj); + err = err ?: linker_append_btf_ext(linker, &obj); + + /* free up src_obj resources */ + free(obj.btf_type_map); + btf__free(obj.btf); + btf_ext__free(obj.btf_ext); + free(obj.secs); + free(obj.sym_map); + if (obj.elf) + elf_end(obj.elf); + if (obj.fd >= 0) + close(obj.fd); + + return libbpf_err(err); +} + +static bool is_dwarf_sec_name(const char *name) +{ + /* approximation, but the actual list is too long */ + return strncmp(name, ".debug_", sizeof(".debug_") - 1) == 0; +} + +static bool is_ignored_sec(struct src_sec *sec) +{ + Elf64_Shdr *shdr = sec->shdr; + const char *name = sec->sec_name; + + /* no special handling of .strtab */ + if (shdr->sh_type == SHT_STRTAB) + return true; + + /* ignore .llvm_addrsig section as well */ + if (shdr->sh_type == SHT_LLVM_ADDRSIG) + return true; + + /* no subprograms will lead to an empty .text section, ignore it */ + if (shdr->sh_type == SHT_PROGBITS && shdr->sh_size == 0 && + strcmp(sec->sec_name, ".text") == 0) + return true; + + /* DWARF sections */ + if (is_dwarf_sec_name(sec->sec_name)) + return true; + + if (strncmp(name, ".rel", sizeof(".rel") - 1) == 0) { + name += sizeof(".rel") - 1; + /* DWARF section relocations */ + if (is_dwarf_sec_name(name)) + return true; + + /* .BTF and .BTF.ext don't need relocations */ + if (strcmp(name, BTF_ELF_SEC) == 0 || + strcmp(name, BTF_EXT_ELF_SEC) == 0) + return true; + } + + return false; +} + +static struct src_sec *add_src_sec(struct src_obj *obj, const char *sec_name) +{ + struct src_sec *secs = obj->secs, *sec; + size_t new_cnt = obj->sec_cnt ? obj->sec_cnt + 1 : 2; + + secs = libbpf_reallocarray(secs, new_cnt, sizeof(*secs)); + if (!secs) + return NULL; + + /* zero out newly allocated memory */ + memset(secs + obj->sec_cnt, 0, (new_cnt - obj->sec_cnt) * sizeof(*secs)); + + obj->secs = secs; + obj->sec_cnt = new_cnt; + + sec = &obj->secs[new_cnt - 1]; + sec->id = new_cnt - 1; + sec->sec_name = sec_name; + + return sec; +} + +static int linker_load_obj_file(struct bpf_linker *linker, const char *filename, + const struct bpf_linker_file_opts *opts, + struct src_obj *obj) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + const int host_endianness = ELFDATA2LSB; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + const int host_endianness = ELFDATA2MSB; +#else +#error "Unknown __BYTE_ORDER__" +#endif + int err = 0; + Elf_Scn *scn; + Elf_Data *data; + Elf64_Ehdr *ehdr; + Elf64_Shdr *shdr; + struct src_sec *sec; + + pr_debug("linker: adding object file '%s'...\n", filename); + + obj->filename = filename; + + obj->fd = open(filename, O_RDONLY | O_CLOEXEC); + if (obj->fd < 0) { + err = -errno; + pr_warn("failed to open file '%s': %d\n", filename, err); + return err; + } + obj->elf = elf_begin(obj->fd, ELF_C_READ_MMAP, NULL); + if (!obj->elf) { + err = -errno; + pr_warn_elf("failed to parse ELF file '%s'", filename); + return err; + } + + /* Sanity check ELF file high-level properties */ + ehdr = elf64_getehdr(obj->elf); + if (!ehdr) { + err = -errno; + pr_warn_elf("failed to get ELF header for %s", filename); + return err; + } + if (ehdr->e_ident[EI_DATA] != host_endianness) { + err = -EOPNOTSUPP; + pr_warn_elf("unsupported byte order of ELF file %s", filename); + return err; + } + if (ehdr->e_type != ET_REL + || ehdr->e_machine != EM_BPF + || ehdr->e_ident[EI_CLASS] != ELFCLASS64) { + err = -EOPNOTSUPP; + pr_warn_elf("unsupported kind of ELF file %s", filename); + return err; + } + + if (elf_getshdrstrndx(obj->elf, &obj->shstrs_sec_idx)) { + err = -errno; + pr_warn_elf("failed to get SHSTRTAB section index for %s", filename); + return err; + } + + scn = NULL; + while ((scn = elf_nextscn(obj->elf, scn)) != NULL) { + size_t sec_idx = elf_ndxscn(scn); + const char *sec_name; + + shdr = elf64_getshdr(scn); + if (!shdr) { + err = -errno; + pr_warn_elf("failed to get section #%zu header for %s", + sec_idx, filename); + return err; + } + + sec_name = elf_strptr(obj->elf, obj->shstrs_sec_idx, shdr->sh_name); + if (!sec_name) { + err = -errno; + pr_warn_elf("failed to get section #%zu name for %s", + sec_idx, filename); + return err; + } + + data = elf_getdata(scn, 0); + if (!data) { + err = -errno; + pr_warn_elf("failed to get section #%zu (%s) data from %s", + sec_idx, sec_name, filename); + return err; + } + + sec = add_src_sec(obj, sec_name); + if (!sec) + return -ENOMEM; + + sec->scn = scn; + sec->shdr = shdr; + sec->data = data; + sec->sec_idx = elf_ndxscn(scn); + + if (is_ignored_sec(sec)) { + sec->skipped = true; + continue; + } + + switch (shdr->sh_type) { + case SHT_SYMTAB: + if (obj->symtab_sec_idx) { + err = -EOPNOTSUPP; + pr_warn("multiple SYMTAB sections found, not supported\n"); + return err; + } + obj->symtab_sec_idx = sec_idx; + break; + case SHT_STRTAB: + /* we'll construct our own string table */ + break; + case SHT_PROGBITS: + if (strcmp(sec_name, BTF_ELF_SEC) == 0) { + obj->btf = btf__new(data->d_buf, shdr->sh_size); + err = libbpf_get_error(obj->btf); + if (err) { + pr_warn("failed to parse .BTF from %s: %d\n", filename, err); + return err; + } + sec->skipped = true; + continue; + } + if (strcmp(sec_name, BTF_EXT_ELF_SEC) == 0) { + obj->btf_ext = btf_ext__new(data->d_buf, shdr->sh_size); + err = libbpf_get_error(obj->btf_ext); + if (err) { + pr_warn("failed to parse .BTF.ext from '%s': %d\n", filename, err); + return err; + } + sec->skipped = true; + continue; + } + + /* data & code */ + break; + case SHT_NOBITS: + /* BSS */ + break; + case SHT_REL: + /* relocations */ + break; + default: + pr_warn("unrecognized section #%zu (%s) in %s\n", + sec_idx, sec_name, filename); + err = -EINVAL; + return err; + } + } + + err = err ?: linker_sanity_check_elf(obj); + err = err ?: linker_sanity_check_btf(obj); + err = err ?: linker_sanity_check_btf_ext(obj); + err = err ?: linker_fixup_btf(obj); + + return err; +} + +static int linker_sanity_check_elf(struct src_obj *obj) +{ + struct src_sec *sec; + int i, err; + + if (!obj->symtab_sec_idx) { + pr_warn("ELF is missing SYMTAB section in %s\n", obj->filename); + return -EINVAL; + } + if (!obj->shstrs_sec_idx) { + pr_warn("ELF is missing section headers STRTAB section in %s\n", obj->filename); + return -EINVAL; + } + + for (i = 1; i < obj->sec_cnt; i++) { + sec = &obj->secs[i]; + + if (sec->sec_name[0] == '\0') { + pr_warn("ELF section #%zu has empty name in %s\n", sec->sec_idx, obj->filename); + return -EINVAL; + } + + if (sec->shdr->sh_addralign && !is_pow_of_2(sec->shdr->sh_addralign)) + return -EINVAL; + if (sec->shdr->sh_addralign != sec->data->d_align) + return -EINVAL; + + if (sec->shdr->sh_size != sec->data->d_size) + return -EINVAL; + + switch (sec->shdr->sh_type) { + case SHT_SYMTAB: + err = linker_sanity_check_elf_symtab(obj, sec); + if (err) + return err; + break; + case SHT_STRTAB: + break; + case SHT_PROGBITS: + if (sec->shdr->sh_flags & SHF_EXECINSTR) { + if (sec->shdr->sh_size % sizeof(struct bpf_insn) != 0) + return -EINVAL; + } + break; + case SHT_NOBITS: + break; + case SHT_REL: + err = linker_sanity_check_elf_relos(obj, sec); + if (err) + return err; + break; + case SHT_LLVM_ADDRSIG: + break; + default: + pr_warn("ELF section #%zu (%s) has unrecognized type %zu in %s\n", + sec->sec_idx, sec->sec_name, (size_t)sec->shdr->sh_type, obj->filename); + return -EINVAL; + } + } + + return 0; +} + +static int linker_sanity_check_elf_symtab(struct src_obj *obj, struct src_sec *sec) +{ + struct src_sec *link_sec; + Elf64_Sym *sym; + int i, n; + + if (sec->shdr->sh_entsize != sizeof(Elf64_Sym)) + return -EINVAL; + if (sec->shdr->sh_size % sec->shdr->sh_entsize != 0) + return -EINVAL; + + if (!sec->shdr->sh_link || sec->shdr->sh_link >= obj->sec_cnt) { + pr_warn("ELF SYMTAB section #%zu points to missing STRTAB section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_link, obj->filename); + return -EINVAL; + } + link_sec = &obj->secs[sec->shdr->sh_link]; + if (link_sec->shdr->sh_type != SHT_STRTAB) { + pr_warn("ELF SYMTAB section #%zu points to invalid STRTAB section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_link, obj->filename); + return -EINVAL; + } + + n = sec->shdr->sh_size / sec->shdr->sh_entsize; + sym = sec->data->d_buf; + for (i = 0; i < n; i++, sym++) { + int sym_type = ELF64_ST_TYPE(sym->st_info); + int sym_bind = ELF64_ST_BIND(sym->st_info); + int sym_vis = ELF64_ST_VISIBILITY(sym->st_other); + + if (i == 0) { + if (sym->st_name != 0 || sym->st_info != 0 + || sym->st_other != 0 || sym->st_shndx != 0 + || sym->st_value != 0 || sym->st_size != 0) { + pr_warn("ELF sym #0 is invalid in %s\n", obj->filename); + return -EINVAL; + } + continue; + } + if (sym_bind != STB_LOCAL && sym_bind != STB_GLOBAL && sym_bind != STB_WEAK) { + pr_warn("ELF sym #%d in section #%zu has unsupported symbol binding %d\n", + i, sec->sec_idx, sym_bind); + return -EINVAL; + } + if (sym_vis != STV_DEFAULT && sym_vis != STV_HIDDEN) { + pr_warn("ELF sym #%d in section #%zu has unsupported symbol visibility %d\n", + i, sec->sec_idx, sym_vis); + return -EINVAL; + } + if (sym->st_shndx == 0) { + if (sym_type != STT_NOTYPE || sym_bind == STB_LOCAL + || sym->st_value != 0 || sym->st_size != 0) { + pr_warn("ELF sym #%d is invalid extern symbol in %s\n", + i, obj->filename); + + return -EINVAL; + } + continue; + } + if (sym->st_shndx < SHN_LORESERVE && sym->st_shndx >= obj->sec_cnt) { + pr_warn("ELF sym #%d in section #%zu points to missing section #%zu in %s\n", + i, sec->sec_idx, (size_t)sym->st_shndx, obj->filename); + return -EINVAL; + } + if (sym_type == STT_SECTION) { + if (sym->st_value != 0) + return -EINVAL; + continue; + } + } + + return 0; +} + +static int linker_sanity_check_elf_relos(struct src_obj *obj, struct src_sec *sec) +{ + struct src_sec *link_sec, *sym_sec; + Elf64_Rel *relo; + int i, n; + + if (sec->shdr->sh_entsize != sizeof(Elf64_Rel)) + return -EINVAL; + if (sec->shdr->sh_size % sec->shdr->sh_entsize != 0) + return -EINVAL; + + /* SHT_REL's sh_link should point to SYMTAB */ + if (sec->shdr->sh_link != obj->symtab_sec_idx) { + pr_warn("ELF relo section #%zu points to invalid SYMTAB section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_link, obj->filename); + return -EINVAL; + } + + /* SHT_REL's sh_info points to relocated section */ + if (!sec->shdr->sh_info || sec->shdr->sh_info >= obj->sec_cnt) { + pr_warn("ELF relo section #%zu points to missing section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_info, obj->filename); + return -EINVAL; + } + link_sec = &obj->secs[sec->shdr->sh_info]; + + /* .rel -> pattern is followed */ + if (strncmp(sec->sec_name, ".rel", sizeof(".rel") - 1) != 0 + || strcmp(sec->sec_name + sizeof(".rel") - 1, link_sec->sec_name) != 0) { + pr_warn("ELF relo section #%zu name has invalid name in %s\n", + sec->sec_idx, obj->filename); + return -EINVAL; + } + + /* don't further validate relocations for ignored sections */ + if (link_sec->skipped) + return 0; + + /* relocatable section is data or instructions */ + if (link_sec->shdr->sh_type != SHT_PROGBITS && link_sec->shdr->sh_type != SHT_NOBITS) { + pr_warn("ELF relo section #%zu points to invalid section #%zu in %s\n", + sec->sec_idx, (size_t)sec->shdr->sh_info, obj->filename); + return -EINVAL; + } + + /* check sanity of each relocation */ + n = sec->shdr->sh_size / sec->shdr->sh_entsize; + relo = sec->data->d_buf; + sym_sec = &obj->secs[obj->symtab_sec_idx]; + for (i = 0; i < n; i++, relo++) { + size_t sym_idx = ELF64_R_SYM(relo->r_info); + size_t sym_type = ELF64_R_TYPE(relo->r_info); + + if (sym_type != R_BPF_64_64 && sym_type != R_BPF_64_32 && + sym_type != R_BPF_64_ABS64 && sym_type != R_BPF_64_ABS32) { + pr_warn("ELF relo #%d in section #%zu has unexpected type %zu in %s\n", + i, sec->sec_idx, sym_type, obj->filename); + return -EINVAL; + } + + if (!sym_idx || sym_idx * sizeof(Elf64_Sym) >= sym_sec->shdr->sh_size) { + pr_warn("ELF relo #%d in section #%zu points to invalid symbol #%zu in %s\n", + i, sec->sec_idx, sym_idx, obj->filename); + return -EINVAL; + } + + if (link_sec->shdr->sh_flags & SHF_EXECINSTR) { + if (relo->r_offset % sizeof(struct bpf_insn) != 0) { + pr_warn("ELF relo #%d in section #%zu points to missing symbol #%zu in %s\n", + i, sec->sec_idx, sym_idx, obj->filename); + return -EINVAL; + } + } + } + + return 0; +} + +static int check_btf_type_id(__u32 *type_id, void *ctx) +{ + struct btf *btf = ctx; + + if (*type_id >= btf__type_cnt(btf)) + return -EINVAL; + + return 0; +} + +static int check_btf_str_off(__u32 *str_off, void *ctx) +{ + struct btf *btf = ctx; + const char *s; + + s = btf__str_by_offset(btf, *str_off); + + if (!s) + return -EINVAL; + + return 0; +} + +static int linker_sanity_check_btf(struct src_obj *obj) +{ + struct btf_type *t; + int i, n, err = 0; + + if (!obj->btf) + return 0; + + n = btf__type_cnt(obj->btf); + for (i = 1; i < n; i++) { + t = btf_type_by_id(obj->btf, i); + + err = err ?: btf_type_visit_type_ids(t, check_btf_type_id, obj->btf); + err = err ?: btf_type_visit_str_offs(t, check_btf_str_off, obj->btf); + if (err) + return err; + } + + return 0; +} + +static int linker_sanity_check_btf_ext(struct src_obj *obj) +{ + int err = 0; + + if (!obj->btf_ext) + return 0; + + /* can't use .BTF.ext without .BTF */ + if (!obj->btf) + return -EINVAL; + + err = err ?: btf_ext_visit_type_ids(obj->btf_ext, check_btf_type_id, obj->btf); + err = err ?: btf_ext_visit_str_offs(obj->btf_ext, check_btf_str_off, obj->btf); + if (err) + return err; + + return 0; +} + +static int init_sec(struct bpf_linker *linker, struct dst_sec *dst_sec, struct src_sec *src_sec) +{ + Elf_Scn *scn; + Elf_Data *data; + Elf64_Shdr *shdr; + int name_off; + + dst_sec->sec_sz = 0; + dst_sec->sec_idx = 0; + dst_sec->ephemeral = src_sec->ephemeral; + + /* ephemeral sections are just thin section shells lacking most parts */ + if (src_sec->ephemeral) + return 0; + + scn = elf_newscn(linker->elf); + if (!scn) + return -ENOMEM; + data = elf_newdata(scn); + if (!data) + return -ENOMEM; + shdr = elf64_getshdr(scn); + if (!shdr) + return -ENOMEM; + + dst_sec->scn = scn; + dst_sec->shdr = shdr; + dst_sec->data = data; + dst_sec->sec_idx = elf_ndxscn(scn); + + name_off = strset__add_str(linker->strtab_strs, src_sec->sec_name); + if (name_off < 0) + return name_off; + + shdr->sh_name = name_off; + shdr->sh_type = src_sec->shdr->sh_type; + shdr->sh_flags = src_sec->shdr->sh_flags; + shdr->sh_size = 0; + /* sh_link and sh_info have different meaning for different types of + * sections, so we leave it up to the caller code to fill them in, if + * necessary + */ + shdr->sh_link = 0; + shdr->sh_info = 0; + shdr->sh_addralign = src_sec->shdr->sh_addralign; + shdr->sh_entsize = src_sec->shdr->sh_entsize; + + data->d_type = src_sec->data->d_type; + data->d_size = 0; + data->d_buf = NULL; + data->d_align = src_sec->data->d_align; + data->d_off = 0; + + return 0; +} + +static struct dst_sec *find_dst_sec_by_name(struct bpf_linker *linker, const char *sec_name) +{ + struct dst_sec *sec; + int i; + + for (i = 1; i < linker->sec_cnt; i++) { + sec = &linker->secs[i]; + + if (strcmp(sec->sec_name, sec_name) == 0) + return sec; + } + + return NULL; +} + +static bool secs_match(struct dst_sec *dst, struct src_sec *src) +{ + if (dst->ephemeral || src->ephemeral) + return true; + + if (dst->shdr->sh_type != src->shdr->sh_type) { + pr_warn("sec %s types mismatch\n", dst->sec_name); + return false; + } + if (dst->shdr->sh_flags != src->shdr->sh_flags) { + pr_warn("sec %s flags mismatch\n", dst->sec_name); + return false; + } + if (dst->shdr->sh_entsize != src->shdr->sh_entsize) { + pr_warn("sec %s entsize mismatch\n", dst->sec_name); + return false; + } + + return true; +} + +static bool sec_content_is_same(struct dst_sec *dst_sec, struct src_sec *src_sec) +{ + if (dst_sec->sec_sz != src_sec->shdr->sh_size) + return false; + if (memcmp(dst_sec->raw_data, src_sec->data->d_buf, dst_sec->sec_sz) != 0) + return false; + return true; +} + +static int extend_sec(struct bpf_linker *linker, struct dst_sec *dst, struct src_sec *src) +{ + void *tmp; + size_t dst_align, src_align; + size_t dst_align_sz, dst_final_sz; + int err; + + /* Ephemeral source section doesn't contribute anything to ELF + * section data. + */ + if (src->ephemeral) + return 0; + + /* Some sections (like .maps) can contain both externs (and thus be + * ephemeral) and non-externs (map definitions). So it's possible that + * it has to be "upgraded" from ephemeral to non-ephemeral when the + * first non-ephemeral entity appears. In such case, we add ELF + * section, data, etc. + */ + if (dst->ephemeral) { + err = init_sec(linker, dst, src); + if (err) + return err; + } + + dst_align = dst->shdr->sh_addralign; + src_align = src->shdr->sh_addralign; + if (dst_align == 0) + dst_align = 1; + if (dst_align < src_align) + dst_align = src_align; + + dst_align_sz = (dst->sec_sz + dst_align - 1) / dst_align * dst_align; + + /* no need to re-align final size */ + dst_final_sz = dst_align_sz + src->shdr->sh_size; + + if (src->shdr->sh_type != SHT_NOBITS) { + tmp = realloc(dst->raw_data, dst_final_sz); + if (!tmp) + return -ENOMEM; + dst->raw_data = tmp; + + /* pad dst section, if it's alignment forced size increase */ + memset(dst->raw_data + dst->sec_sz, 0, dst_align_sz - dst->sec_sz); + /* now copy src data at a properly aligned offset */ + memcpy(dst->raw_data + dst_align_sz, src->data->d_buf, src->shdr->sh_size); + } + + dst->sec_sz = dst_final_sz; + dst->shdr->sh_size = dst_final_sz; + dst->data->d_size = dst_final_sz; + + dst->shdr->sh_addralign = dst_align; + dst->data->d_align = dst_align; + + src->dst_off = dst_align_sz; + + return 0; +} + +static bool is_data_sec(struct src_sec *sec) +{ + if (!sec || sec->skipped) + return false; + /* ephemeral sections are data sections, e.g., .kconfig, .ksyms */ + if (sec->ephemeral) + return true; + return sec->shdr->sh_type == SHT_PROGBITS || sec->shdr->sh_type == SHT_NOBITS; +} + +static bool is_relo_sec(struct src_sec *sec) +{ + if (!sec || sec->skipped || sec->ephemeral) + return false; + return sec->shdr->sh_type == SHT_REL; +} + +static int linker_append_sec_data(struct bpf_linker *linker, struct src_obj *obj) +{ + int i, err; + + for (i = 1; i < obj->sec_cnt; i++) { + struct src_sec *src_sec; + struct dst_sec *dst_sec; + + src_sec = &obj->secs[i]; + if (!is_data_sec(src_sec)) + continue; + + dst_sec = find_dst_sec_by_name(linker, src_sec->sec_name); + if (!dst_sec) { + dst_sec = add_dst_sec(linker, src_sec->sec_name); + if (!dst_sec) + return -ENOMEM; + err = init_sec(linker, dst_sec, src_sec); + if (err) { + pr_warn("failed to init section '%s'\n", src_sec->sec_name); + return err; + } + } else { + if (!secs_match(dst_sec, src_sec)) { + pr_warn("ELF sections %s are incompatible\n", src_sec->sec_name); + return -1; + } + + /* "license" and "version" sections are deduped */ + if (strcmp(src_sec->sec_name, "license") == 0 + || strcmp(src_sec->sec_name, "version") == 0) { + if (!sec_content_is_same(dst_sec, src_sec)) { + pr_warn("non-identical contents of section '%s' are not supported\n", src_sec->sec_name); + return -EINVAL; + } + src_sec->skipped = true; + src_sec->dst_id = dst_sec->id; + continue; + } + } + + /* record mapped section index */ + src_sec->dst_id = dst_sec->id; + + err = extend_sec(linker, dst_sec, src_sec); + if (err) + return err; + } + + return 0; +} + +static int linker_append_elf_syms(struct bpf_linker *linker, struct src_obj *obj) +{ + struct src_sec *symtab = &obj->secs[obj->symtab_sec_idx]; + Elf64_Sym *sym = symtab->data->d_buf; + int i, n = symtab->shdr->sh_size / symtab->shdr->sh_entsize, err; + int str_sec_idx = symtab->shdr->sh_link; + const char *sym_name; + + obj->sym_map = calloc(n + 1, sizeof(*obj->sym_map)); + if (!obj->sym_map) + return -ENOMEM; + + for (i = 0; i < n; i++, sym++) { + /* We already validated all-zero symbol #0 and we already + * appended it preventively to the final SYMTAB, so skip it. + */ + if (i == 0) + continue; + + sym_name = elf_strptr(obj->elf, str_sec_idx, sym->st_name); + if (!sym_name) { + pr_warn("can't fetch symbol name for symbol #%d in '%s'\n", i, obj->filename); + return -EINVAL; + } + + err = linker_append_elf_sym(linker, obj, sym, sym_name, i); + if (err) + return err; + } + + return 0; +} + +static Elf64_Sym *get_sym_by_idx(struct bpf_linker *linker, size_t sym_idx) +{ + struct dst_sec *symtab = &linker->secs[linker->symtab_sec_idx]; + Elf64_Sym *syms = symtab->raw_data; + + return &syms[sym_idx]; +} + +static struct glob_sym *find_glob_sym(struct bpf_linker *linker, const char *sym_name) +{ + struct glob_sym *glob_sym; + const char *name; + int i; + + for (i = 0; i < linker->glob_sym_cnt; i++) { + glob_sym = &linker->glob_syms[i]; + name = strset__data(linker->strtab_strs) + glob_sym->name_off; + + if (strcmp(name, sym_name) == 0) + return glob_sym; + } + + return NULL; +} + +static struct glob_sym *add_glob_sym(struct bpf_linker *linker) +{ + struct glob_sym *syms, *sym; + + syms = libbpf_reallocarray(linker->glob_syms, linker->glob_sym_cnt + 1, + sizeof(*linker->glob_syms)); + if (!syms) + return NULL; + + sym = &syms[linker->glob_sym_cnt]; + memset(sym, 0, sizeof(*sym)); + sym->var_idx = -1; + + linker->glob_syms = syms; + linker->glob_sym_cnt++; + + return sym; +} + +static bool glob_sym_btf_matches(const char *sym_name, bool exact, + const struct btf *btf1, __u32 id1, + const struct btf *btf2, __u32 id2) +{ + const struct btf_type *t1, *t2; + bool is_static1, is_static2; + const char *n1, *n2; + int i, n; + +recur: + n1 = n2 = NULL; + t1 = skip_mods_and_typedefs(btf1, id1, &id1); + t2 = skip_mods_and_typedefs(btf2, id2, &id2); + + /* check if only one side is FWD, otherwise handle with common logic */ + if (!exact && btf_is_fwd(t1) != btf_is_fwd(t2)) { + n1 = btf__str_by_offset(btf1, t1->name_off); + n2 = btf__str_by_offset(btf2, t2->name_off); + if (strcmp(n1, n2) != 0) { + pr_warn("global '%s': incompatible forward declaration names '%s' and '%s'\n", + sym_name, n1, n2); + return false; + } + /* validate if FWD kind matches concrete kind */ + if (btf_is_fwd(t1)) { + if (btf_kflag(t1) && btf_is_union(t2)) + return true; + if (!btf_kflag(t1) && btf_is_struct(t2)) + return true; + pr_warn("global '%s': incompatible %s forward declaration and concrete kind %s\n", + sym_name, btf_kflag(t1) ? "union" : "struct", btf_kind_str(t2)); + } else { + if (btf_kflag(t2) && btf_is_union(t1)) + return true; + if (!btf_kflag(t2) && btf_is_struct(t1)) + return true; + pr_warn("global '%s': incompatible %s forward declaration and concrete kind %s\n", + sym_name, btf_kflag(t2) ? "union" : "struct", btf_kind_str(t1)); + } + return false; + } + + if (btf_kind(t1) != btf_kind(t2)) { + pr_warn("global '%s': incompatible BTF kinds %s and %s\n", + sym_name, btf_kind_str(t1), btf_kind_str(t2)); + return false; + } + + switch (btf_kind(t1)) { + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + case BTF_KIND_FWD: + case BTF_KIND_FUNC: + case BTF_KIND_VAR: + n1 = btf__str_by_offset(btf1, t1->name_off); + n2 = btf__str_by_offset(btf2, t2->name_off); + if (strcmp(n1, n2) != 0) { + pr_warn("global '%s': incompatible %s names '%s' and '%s'\n", + sym_name, btf_kind_str(t1), n1, n2); + return false; + } + break; + default: + break; + } + + switch (btf_kind(t1)) { + case BTF_KIND_UNKN: /* void */ + case BTF_KIND_FWD: + return true; + case BTF_KIND_INT: + case BTF_KIND_FLOAT: + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + /* ignore encoding for int and enum values for enum */ + if (t1->size != t2->size) { + pr_warn("global '%s': incompatible %s '%s' size %u and %u\n", + sym_name, btf_kind_str(t1), n1, t1->size, t2->size); + return false; + } + return true; + case BTF_KIND_PTR: + /* just validate overall shape of the referenced type, so no + * contents comparison for struct/union, and allowd fwd vs + * struct/union + */ + exact = false; + id1 = t1->type; + id2 = t2->type; + goto recur; + case BTF_KIND_ARRAY: + /* ignore index type and array size */ + id1 = btf_array(t1)->type; + id2 = btf_array(t2)->type; + goto recur; + case BTF_KIND_FUNC: + /* extern and global linkages are compatible */ + is_static1 = btf_func_linkage(t1) == BTF_FUNC_STATIC; + is_static2 = btf_func_linkage(t2) == BTF_FUNC_STATIC; + if (is_static1 != is_static2) { + pr_warn("global '%s': incompatible func '%s' linkage\n", sym_name, n1); + return false; + } + + id1 = t1->type; + id2 = t2->type; + goto recur; + case BTF_KIND_VAR: + /* extern and global linkages are compatible */ + is_static1 = btf_var(t1)->linkage == BTF_VAR_STATIC; + is_static2 = btf_var(t2)->linkage == BTF_VAR_STATIC; + if (is_static1 != is_static2) { + pr_warn("global '%s': incompatible var '%s' linkage\n", sym_name, n1); + return false; + } + + id1 = t1->type; + id2 = t2->type; + goto recur; + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: { + const struct btf_member *m1, *m2; + + if (!exact) + return true; + + if (btf_vlen(t1) != btf_vlen(t2)) { + pr_warn("global '%s': incompatible number of %s fields %u and %u\n", + sym_name, btf_kind_str(t1), btf_vlen(t1), btf_vlen(t2)); + return false; + } + + n = btf_vlen(t1); + m1 = btf_members(t1); + m2 = btf_members(t2); + for (i = 0; i < n; i++, m1++, m2++) { + n1 = btf__str_by_offset(btf1, m1->name_off); + n2 = btf__str_by_offset(btf2, m2->name_off); + if (strcmp(n1, n2) != 0) { + pr_warn("global '%s': incompatible field #%d names '%s' and '%s'\n", + sym_name, i, n1, n2); + return false; + } + if (m1->offset != m2->offset) { + pr_warn("global '%s': incompatible field #%d ('%s') offsets\n", + sym_name, i, n1); + return false; + } + if (!glob_sym_btf_matches(sym_name, exact, btf1, m1->type, btf2, m2->type)) + return false; + } + + return true; + } + case BTF_KIND_FUNC_PROTO: { + const struct btf_param *m1, *m2; + + if (btf_vlen(t1) != btf_vlen(t2)) { + pr_warn("global '%s': incompatible number of %s params %u and %u\n", + sym_name, btf_kind_str(t1), btf_vlen(t1), btf_vlen(t2)); + return false; + } + + n = btf_vlen(t1); + m1 = btf_params(t1); + m2 = btf_params(t2); + for (i = 0; i < n; i++, m1++, m2++) { + /* ignore func arg names */ + if (!glob_sym_btf_matches(sym_name, exact, btf1, m1->type, btf2, m2->type)) + return false; + } + + /* now check return type as well */ + id1 = t1->type; + id2 = t2->type; + goto recur; + } + + /* skip_mods_and_typedefs() make this impossible */ + case BTF_KIND_TYPEDEF: + case BTF_KIND_VOLATILE: + case BTF_KIND_CONST: + case BTF_KIND_RESTRICT: + /* DATASECs are never compared with each other */ + case BTF_KIND_DATASEC: + default: + pr_warn("global '%s': unsupported BTF kind %s\n", + sym_name, btf_kind_str(t1)); + return false; + } +} + +static bool map_defs_match(const char *sym_name, + const struct btf *main_btf, + const struct btf_map_def *main_def, + const struct btf_map_def *main_inner_def, + const struct btf *extra_btf, + const struct btf_map_def *extra_def, + const struct btf_map_def *extra_inner_def) +{ + const char *reason; + + if (main_def->map_type != extra_def->map_type) { + reason = "type"; + goto mismatch; + } + + /* check key type/size match */ + if (main_def->key_size != extra_def->key_size) { + reason = "key_size"; + goto mismatch; + } + if (!!main_def->key_type_id != !!extra_def->key_type_id) { + reason = "key type"; + goto mismatch; + } + if ((main_def->parts & MAP_DEF_KEY_TYPE) + && !glob_sym_btf_matches(sym_name, true /*exact*/, + main_btf, main_def->key_type_id, + extra_btf, extra_def->key_type_id)) { + reason = "key type"; + goto mismatch; + } + + /* validate value type/size match */ + if (main_def->value_size != extra_def->value_size) { + reason = "value_size"; + goto mismatch; + } + if (!!main_def->value_type_id != !!extra_def->value_type_id) { + reason = "value type"; + goto mismatch; + } + if ((main_def->parts & MAP_DEF_VALUE_TYPE) + && !glob_sym_btf_matches(sym_name, true /*exact*/, + main_btf, main_def->value_type_id, + extra_btf, extra_def->value_type_id)) { + reason = "key type"; + goto mismatch; + } + + if (main_def->max_entries != extra_def->max_entries) { + reason = "max_entries"; + goto mismatch; + } + if (main_def->map_flags != extra_def->map_flags) { + reason = "map_flags"; + goto mismatch; + } + if (main_def->numa_node != extra_def->numa_node) { + reason = "numa_node"; + goto mismatch; + } + if (main_def->pinning != extra_def->pinning) { + reason = "pinning"; + goto mismatch; + } + + if ((main_def->parts & MAP_DEF_INNER_MAP) != (extra_def->parts & MAP_DEF_INNER_MAP)) { + reason = "inner map"; + goto mismatch; + } + + if (main_def->parts & MAP_DEF_INNER_MAP) { + char inner_map_name[128]; + + snprintf(inner_map_name, sizeof(inner_map_name), "%s.inner", sym_name); + + return map_defs_match(inner_map_name, + main_btf, main_inner_def, NULL, + extra_btf, extra_inner_def, NULL); + } + + return true; + +mismatch: + pr_warn("global '%s': map %s mismatch\n", sym_name, reason); + return false; +} + +static bool glob_map_defs_match(const char *sym_name, + struct bpf_linker *linker, struct glob_sym *glob_sym, + struct src_obj *obj, Elf64_Sym *sym, int btf_id) +{ + struct btf_map_def dst_def = {}, dst_inner_def = {}; + struct btf_map_def src_def = {}, src_inner_def = {}; + const struct btf_type *t; + int err; + + t = btf__type_by_id(obj->btf, btf_id); + if (!btf_is_var(t)) { + pr_warn("global '%s': invalid map definition type [%d]\n", sym_name, btf_id); + return false; + } + t = skip_mods_and_typedefs(obj->btf, t->type, NULL); + + err = parse_btf_map_def(sym_name, obj->btf, t, true /*strict*/, &src_def, &src_inner_def); + if (err) { + pr_warn("global '%s': invalid map definition\n", sym_name); + return false; + } + + /* re-parse existing map definition */ + t = btf__type_by_id(linker->btf, glob_sym->btf_id); + t = skip_mods_and_typedefs(linker->btf, t->type, NULL); + err = parse_btf_map_def(sym_name, linker->btf, t, true /*strict*/, &dst_def, &dst_inner_def); + if (err) { + /* this should not happen, because we already validated it */ + pr_warn("global '%s': invalid dst map definition\n", sym_name); + return false; + } + + /* Currently extern map definition has to be complete and match + * concrete map definition exactly. This restriction might be lifted + * in the future. + */ + return map_defs_match(sym_name, linker->btf, &dst_def, &dst_inner_def, + obj->btf, &src_def, &src_inner_def); +} + +static bool glob_syms_match(const char *sym_name, + struct bpf_linker *linker, struct glob_sym *glob_sym, + struct src_obj *obj, Elf64_Sym *sym, size_t sym_idx, int btf_id) +{ + const struct btf_type *src_t; + + /* if we are dealing with externs, BTF types describing both global + * and extern VARs/FUNCs should be completely present in all files + */ + if (!glob_sym->btf_id || !btf_id) { + pr_warn("BTF info is missing for global symbol '%s'\n", sym_name); + return false; + } + + src_t = btf__type_by_id(obj->btf, btf_id); + if (!btf_is_var(src_t) && !btf_is_func(src_t)) { + pr_warn("only extern variables and functions are supported, but got '%s' for '%s'\n", + btf_kind_str(src_t), sym_name); + return false; + } + + /* deal with .maps definitions specially */ + if (glob_sym->sec_id && strcmp(linker->secs[glob_sym->sec_id].sec_name, MAPS_ELF_SEC) == 0) + return glob_map_defs_match(sym_name, linker, glob_sym, obj, sym, btf_id); + + if (!glob_sym_btf_matches(sym_name, true /*exact*/, + linker->btf, glob_sym->btf_id, obj->btf, btf_id)) + return false; + + return true; +} + +static bool btf_is_non_static(const struct btf_type *t) +{ + return (btf_is_var(t) && btf_var(t)->linkage != BTF_VAR_STATIC) + || (btf_is_func(t) && btf_func_linkage(t) != BTF_FUNC_STATIC); +} + +static int find_glob_sym_btf(struct src_obj *obj, Elf64_Sym *sym, const char *sym_name, + int *out_btf_sec_id, int *out_btf_id) +{ + int i, j, n, m, btf_id = 0; + const struct btf_type *t; + const struct btf_var_secinfo *vi; + const char *name; + + if (!obj->btf) { + pr_warn("failed to find BTF info for object '%s'\n", obj->filename); + return -EINVAL; + } + + n = btf__type_cnt(obj->btf); + for (i = 1; i < n; i++) { + t = btf__type_by_id(obj->btf, i); + + /* some global and extern FUNCs and VARs might not be associated with any + * DATASEC, so try to detect them in the same pass + */ + if (btf_is_non_static(t)) { + name = btf__str_by_offset(obj->btf, t->name_off); + if (strcmp(name, sym_name) != 0) + continue; + + /* remember and still try to find DATASEC */ + btf_id = i; + continue; + } + + if (!btf_is_datasec(t)) + continue; + + vi = btf_var_secinfos(t); + for (j = 0, m = btf_vlen(t); j < m; j++, vi++) { + t = btf__type_by_id(obj->btf, vi->type); + name = btf__str_by_offset(obj->btf, t->name_off); + + if (strcmp(name, sym_name) != 0) + continue; + if (btf_is_var(t) && btf_var(t)->linkage == BTF_VAR_STATIC) + continue; + if (btf_is_func(t) && btf_func_linkage(t) == BTF_FUNC_STATIC) + continue; + + if (btf_id && btf_id != vi->type) { + pr_warn("global/extern '%s' BTF is ambiguous: both types #%d and #%u match\n", + sym_name, btf_id, vi->type); + return -EINVAL; + } + + *out_btf_sec_id = i; + *out_btf_id = vi->type; + + return 0; + } + } + + /* free-floating extern or global FUNC */ + if (btf_id) { + *out_btf_sec_id = 0; + *out_btf_id = btf_id; + return 0; + } + + pr_warn("failed to find BTF info for global/extern symbol '%s'\n", sym_name); + return -ENOENT; +} + +static struct src_sec *find_src_sec_by_name(struct src_obj *obj, const char *sec_name) +{ + struct src_sec *sec; + int i; + + for (i = 1; i < obj->sec_cnt; i++) { + sec = &obj->secs[i]; + + if (strcmp(sec->sec_name, sec_name) == 0) + return sec; + } + + return NULL; +} + +static int complete_extern_btf_info(struct btf *dst_btf, int dst_id, + struct btf *src_btf, int src_id) +{ + struct btf_type *dst_t = btf_type_by_id(dst_btf, dst_id); + struct btf_type *src_t = btf_type_by_id(src_btf, src_id); + struct btf_param *src_p, *dst_p; + const char *s; + int i, n, off; + + /* We already made sure that source and destination types (FUNC or + * VAR) match in terms of types and argument names. + */ + if (btf_is_var(dst_t)) { + btf_var(dst_t)->linkage = BTF_VAR_GLOBAL_ALLOCATED; + return 0; + } + + dst_t->info = btf_type_info(BTF_KIND_FUNC, BTF_FUNC_GLOBAL, 0); + + /* now onto FUNC_PROTO types */ + src_t = btf_type_by_id(src_btf, src_t->type); + dst_t = btf_type_by_id(dst_btf, dst_t->type); + + /* Fill in all the argument names, which for extern FUNCs are missing. + * We'll end up with two copies of FUNCs/VARs for externs, but that + * will be taken care of by BTF dedup at the very end. + * It might be that BTF types for extern in one file has less/more BTF + * information (e.g., FWD instead of full STRUCT/UNION information), + * but that should be (in most cases, subject to BTF dedup rules) + * handled and resolved by BTF dedup algorithm as well, so we won't + * worry about it. Our only job is to make sure that argument names + * are populated on both sides, otherwise BTF dedup will pedantically + * consider them different. + */ + src_p = btf_params(src_t); + dst_p = btf_params(dst_t); + for (i = 0, n = btf_vlen(dst_t); i < n; i++, src_p++, dst_p++) { + if (!src_p->name_off) + continue; + + /* src_btf has more complete info, so add name to dst_btf */ + s = btf__str_by_offset(src_btf, src_p->name_off); + off = btf__add_str(dst_btf, s); + if (off < 0) + return off; + dst_p->name_off = off; + } + return 0; +} + +static void sym_update_bind(Elf64_Sym *sym, int sym_bind) +{ + sym->st_info = ELF64_ST_INFO(sym_bind, ELF64_ST_TYPE(sym->st_info)); +} + +static void sym_update_type(Elf64_Sym *sym, int sym_type) +{ + sym->st_info = ELF64_ST_INFO(ELF64_ST_BIND(sym->st_info), sym_type); +} + +static void sym_update_visibility(Elf64_Sym *sym, int sym_vis) +{ + /* libelf doesn't provide setters for ST_VISIBILITY, + * but it is stored in the lower 2 bits of st_other + */ + sym->st_other &= ~0x03; + sym->st_other |= sym_vis; +} + +static int linker_append_elf_sym(struct bpf_linker *linker, struct src_obj *obj, + Elf64_Sym *sym, const char *sym_name, int src_sym_idx) +{ + struct src_sec *src_sec = NULL; + struct dst_sec *dst_sec = NULL; + struct glob_sym *glob_sym = NULL; + int name_off, sym_type, sym_bind, sym_vis, err; + int btf_sec_id = 0, btf_id = 0; + size_t dst_sym_idx; + Elf64_Sym *dst_sym; + bool sym_is_extern; + + sym_type = ELF64_ST_TYPE(sym->st_info); + sym_bind = ELF64_ST_BIND(sym->st_info); + sym_vis = ELF64_ST_VISIBILITY(sym->st_other); + sym_is_extern = sym->st_shndx == SHN_UNDEF; + + if (sym_is_extern) { + if (!obj->btf) { + pr_warn("externs without BTF info are not supported\n"); + return -ENOTSUP; + } + } else if (sym->st_shndx < SHN_LORESERVE) { + src_sec = &obj->secs[sym->st_shndx]; + if (src_sec->skipped) + return 0; + dst_sec = &linker->secs[src_sec->dst_id]; + + /* allow only one STT_SECTION symbol per section */ + if (sym_type == STT_SECTION && dst_sec->sec_sym_idx) { + obj->sym_map[src_sym_idx] = dst_sec->sec_sym_idx; + return 0; + } + } + + if (sym_bind == STB_LOCAL) + goto add_sym; + + /* find matching BTF info */ + err = find_glob_sym_btf(obj, sym, sym_name, &btf_sec_id, &btf_id); + if (err) + return err; + + if (sym_is_extern && btf_sec_id) { + const char *sec_name = NULL; + const struct btf_type *t; + + t = btf__type_by_id(obj->btf, btf_sec_id); + sec_name = btf__str_by_offset(obj->btf, t->name_off); + + /* Clang puts unannotated extern vars into + * '.extern' BTF DATASEC. Treat them the same + * as unannotated extern funcs (which are + * currently not put into any DATASECs). + * Those don't have associated src_sec/dst_sec. + */ + if (strcmp(sec_name, BTF_EXTERN_SEC) != 0) { + src_sec = find_src_sec_by_name(obj, sec_name); + if (!src_sec) { + pr_warn("failed to find matching ELF sec '%s'\n", sec_name); + return -ENOENT; + } + dst_sec = &linker->secs[src_sec->dst_id]; + } + } + + glob_sym = find_glob_sym(linker, sym_name); + if (glob_sym) { + /* Preventively resolve to existing symbol. This is + * needed for further relocation symbol remapping in + * the next step of linking. + */ + obj->sym_map[src_sym_idx] = glob_sym->sym_idx; + + /* If both symbols are non-externs, at least one of + * them has to be STB_WEAK, otherwise they are in + * a conflict with each other. + */ + if (!sym_is_extern && !glob_sym->is_extern + && !glob_sym->is_weak && sym_bind != STB_WEAK) { + pr_warn("conflicting non-weak symbol #%d (%s) definition in '%s'\n", + src_sym_idx, sym_name, obj->filename); + return -EINVAL; + } + + if (!glob_syms_match(sym_name, linker, glob_sym, obj, sym, src_sym_idx, btf_id)) + return -EINVAL; + + dst_sym = get_sym_by_idx(linker, glob_sym->sym_idx); + + /* If new symbol is strong, then force dst_sym to be strong as + * well; this way a mix of weak and non-weak extern + * definitions will end up being strong. + */ + if (sym_bind == STB_GLOBAL) { + /* We still need to preserve type (NOTYPE or + * OBJECT/FUNC, depending on whether the symbol is + * extern or not) + */ + sym_update_bind(dst_sym, STB_GLOBAL); + glob_sym->is_weak = false; + } + + /* Non-default visibility is "contaminating", with stricter + * visibility overwriting more permissive ones, even if more + * permissive visibility comes from just an extern definition. + * Currently only STV_DEFAULT and STV_HIDDEN are allowed and + * ensured by ELF symbol sanity checks above. + */ + if (sym_vis > ELF64_ST_VISIBILITY(dst_sym->st_other)) + sym_update_visibility(dst_sym, sym_vis); + + /* If the new symbol is extern, then regardless if + * existing symbol is extern or resolved global, just + * keep the existing one untouched. + */ + if (sym_is_extern) + return 0; + + /* If existing symbol is a strong resolved symbol, bail out, + * because we lost resolution battle have nothing to + * contribute. We already checked abover that there is no + * strong-strong conflict. We also already tightened binding + * and visibility, so nothing else to contribute at that point. + */ + if (!glob_sym->is_extern && sym_bind == STB_WEAK) + return 0; + + /* At this point, new symbol is strong non-extern, + * so overwrite glob_sym with new symbol information. + * Preserve binding and visibility. + */ + sym_update_type(dst_sym, sym_type); + dst_sym->st_shndx = dst_sec->sec_idx; + dst_sym->st_value = src_sec->dst_off + sym->st_value; + dst_sym->st_size = sym->st_size; + + /* see comment below about dst_sec->id vs dst_sec->sec_idx */ + glob_sym->sec_id = dst_sec->id; + glob_sym->is_extern = false; + + if (complete_extern_btf_info(linker->btf, glob_sym->btf_id, + obj->btf, btf_id)) + return -EINVAL; + + /* request updating VAR's/FUNC's underlying BTF type when appending BTF type */ + glob_sym->underlying_btf_id = 0; + + obj->sym_map[src_sym_idx] = glob_sym->sym_idx; + return 0; + } + +add_sym: + name_off = strset__add_str(linker->strtab_strs, sym_name); + if (name_off < 0) + return name_off; + + dst_sym = add_new_sym(linker, &dst_sym_idx); + if (!dst_sym) + return -ENOMEM; + + dst_sym->st_name = name_off; + dst_sym->st_info = sym->st_info; + dst_sym->st_other = sym->st_other; + dst_sym->st_shndx = dst_sec ? dst_sec->sec_idx : sym->st_shndx; + dst_sym->st_value = (src_sec ? src_sec->dst_off : 0) + sym->st_value; + dst_sym->st_size = sym->st_size; + + obj->sym_map[src_sym_idx] = dst_sym_idx; + + if (sym_type == STT_SECTION && dst_sym) { + dst_sec->sec_sym_idx = dst_sym_idx; + dst_sym->st_value = 0; + } + + if (sym_bind != STB_LOCAL) { + glob_sym = add_glob_sym(linker); + if (!glob_sym) + return -ENOMEM; + + glob_sym->sym_idx = dst_sym_idx; + /* we use dst_sec->id (and not dst_sec->sec_idx), because + * ephemeral sections (.kconfig, .ksyms, etc) don't have + * sec_idx (as they don't have corresponding ELF section), but + * still have id. .extern doesn't have even ephemeral section + * associated with it, so dst_sec->id == dst_sec->sec_idx == 0. + */ + glob_sym->sec_id = dst_sec ? dst_sec->id : 0; + glob_sym->name_off = name_off; + /* we will fill btf_id in during BTF merging step */ + glob_sym->btf_id = 0; + glob_sym->is_extern = sym_is_extern; + glob_sym->is_weak = sym_bind == STB_WEAK; + } + + return 0; +} + +static int linker_append_elf_relos(struct bpf_linker *linker, struct src_obj *obj) +{ + struct src_sec *src_symtab = &obj->secs[obj->symtab_sec_idx]; + int i, err; + + for (i = 1; i < obj->sec_cnt; i++) { + struct src_sec *src_sec, *src_linked_sec; + struct dst_sec *dst_sec, *dst_linked_sec; + Elf64_Rel *src_rel, *dst_rel; + int j, n; + + src_sec = &obj->secs[i]; + if (!is_relo_sec(src_sec)) + continue; + + /* shdr->sh_info points to relocatable section */ + src_linked_sec = &obj->secs[src_sec->shdr->sh_info]; + if (src_linked_sec->skipped) + continue; + + dst_sec = find_dst_sec_by_name(linker, src_sec->sec_name); + if (!dst_sec) { + dst_sec = add_dst_sec(linker, src_sec->sec_name); + if (!dst_sec) + return -ENOMEM; + err = init_sec(linker, dst_sec, src_sec); + if (err) { + pr_warn("failed to init section '%s'\n", src_sec->sec_name); + return err; + } + } else if (!secs_match(dst_sec, src_sec)) { + pr_warn("sections %s are not compatible\n", src_sec->sec_name); + return -1; + } + + /* shdr->sh_link points to SYMTAB */ + dst_sec->shdr->sh_link = linker->symtab_sec_idx; + + /* shdr->sh_info points to relocated section */ + dst_linked_sec = &linker->secs[src_linked_sec->dst_id]; + dst_sec->shdr->sh_info = dst_linked_sec->sec_idx; + + src_sec->dst_id = dst_sec->id; + err = extend_sec(linker, dst_sec, src_sec); + if (err) + return err; + + src_rel = src_sec->data->d_buf; + dst_rel = dst_sec->raw_data + src_sec->dst_off; + n = src_sec->shdr->sh_size / src_sec->shdr->sh_entsize; + for (j = 0; j < n; j++, src_rel++, dst_rel++) { + size_t src_sym_idx, dst_sym_idx, sym_type; + Elf64_Sym *src_sym; + + src_sym_idx = ELF64_R_SYM(src_rel->r_info); + src_sym = src_symtab->data->d_buf + sizeof(*src_sym) * src_sym_idx; + + dst_sym_idx = obj->sym_map[src_sym_idx]; + dst_rel->r_offset += src_linked_sec->dst_off; + sym_type = ELF64_R_TYPE(src_rel->r_info); + dst_rel->r_info = ELF64_R_INFO(dst_sym_idx, sym_type); + + if (ELF64_ST_TYPE(src_sym->st_info) == STT_SECTION) { + struct src_sec *sec = &obj->secs[src_sym->st_shndx]; + struct bpf_insn *insn; + + if (src_linked_sec->shdr->sh_flags & SHF_EXECINSTR) { + /* calls to the very first static function inside + * .text section at offset 0 will + * reference section symbol, not the + * function symbol. Fix that up, + * otherwise it won't be possible to + * relocate calls to two different + * static functions with the same name + * (rom two different object files) + */ + insn = dst_linked_sec->raw_data + dst_rel->r_offset; + if (insn->code == (BPF_JMP | BPF_CALL)) + insn->imm += sec->dst_off / sizeof(struct bpf_insn); + else + insn->imm += sec->dst_off; + } else { + pr_warn("relocation against STT_SECTION in non-exec section is not supported!\n"); + return -EINVAL; + } + } + + } + } + + return 0; +} + +static Elf64_Sym *find_sym_by_name(struct src_obj *obj, size_t sec_idx, + int sym_type, const char *sym_name) +{ + struct src_sec *symtab = &obj->secs[obj->symtab_sec_idx]; + Elf64_Sym *sym = symtab->data->d_buf; + int i, n = symtab->shdr->sh_size / symtab->shdr->sh_entsize; + int str_sec_idx = symtab->shdr->sh_link; + const char *name; + + for (i = 0; i < n; i++, sym++) { + if (sym->st_shndx != sec_idx) + continue; + if (ELF64_ST_TYPE(sym->st_info) != sym_type) + continue; + + name = elf_strptr(obj->elf, str_sec_idx, sym->st_name); + if (!name) + return NULL; + + if (strcmp(sym_name, name) != 0) + continue; + + return sym; + } + + return NULL; +} + +static int linker_fixup_btf(struct src_obj *obj) +{ + const char *sec_name; + struct src_sec *sec; + int i, j, n, m; + + if (!obj->btf) + return 0; + + n = btf__type_cnt(obj->btf); + for (i = 1; i < n; i++) { + struct btf_var_secinfo *vi; + struct btf_type *t; + + t = btf_type_by_id(obj->btf, i); + if (btf_kind(t) != BTF_KIND_DATASEC) + continue; + + sec_name = btf__str_by_offset(obj->btf, t->name_off); + sec = find_src_sec_by_name(obj, sec_name); + if (sec) { + /* record actual section size, unless ephemeral */ + if (sec->shdr) + t->size = sec->shdr->sh_size; + } else { + /* BTF can have some sections that are not represented + * in ELF, e.g., .kconfig, .ksyms, .extern, which are used + * for special extern variables. + * + * For all but one such special (ephemeral) + * sections, we pre-create "section shells" to be able + * to keep track of extra per-section metadata later + * (e.g., those BTF extern variables). + * + * .extern is even more special, though, because it + * contains extern variables that need to be resolved + * by static linker, not libbpf and kernel. When such + * externs are resolved, we are going to remove them + * from .extern BTF section and might end up not + * needing it at all. Each resolved extern should have + * matching non-extern VAR/FUNC in other sections. + * + * We do support leaving some of the externs + * unresolved, though, to support cases of building + * libraries, which will later be linked against final + * BPF applications. So if at finalization we still + * see unresolved externs, we'll create .extern + * section on our own. + */ + if (strcmp(sec_name, BTF_EXTERN_SEC) == 0) + continue; + + sec = add_src_sec(obj, sec_name); + if (!sec) + return -ENOMEM; + + sec->ephemeral = true; + sec->sec_idx = 0; /* will match UNDEF shndx in ELF */ + } + + /* remember ELF section and its BTF type ID match */ + sec->sec_type_id = i; + + /* fix up variable offsets */ + vi = btf_var_secinfos(t); + for (j = 0, m = btf_vlen(t); j < m; j++, vi++) { + const struct btf_type *vt = btf__type_by_id(obj->btf, vi->type); + const char *var_name = btf__str_by_offset(obj->btf, vt->name_off); + int var_linkage = btf_var(vt)->linkage; + Elf64_Sym *sym; + + /* no need to patch up static or extern vars */ + if (var_linkage != BTF_VAR_GLOBAL_ALLOCATED) + continue; + + sym = find_sym_by_name(obj, sec->sec_idx, STT_OBJECT, var_name); + if (!sym) { + pr_warn("failed to find symbol for variable '%s' in section '%s'\n", var_name, sec_name); + return -ENOENT; + } + + vi->offset = sym->st_value; + } + } + + return 0; +} + +static int remap_type_id(__u32 *type_id, void *ctx) +{ + int *id_map = ctx; + int new_id = id_map[*type_id]; + + /* Error out if the type wasn't remapped. Ignore VOID which stays VOID. */ + if (new_id == 0 && *type_id != 0) { + pr_warn("failed to find new ID mapping for original BTF type ID %u\n", *type_id); + return -EINVAL; + } + + *type_id = id_map[*type_id]; + + return 0; +} + +static int linker_append_btf(struct bpf_linker *linker, struct src_obj *obj) +{ + const struct btf_type *t; + int i, j, n, start_id, id; + const char *name; + + if (!obj->btf) + return 0; + + start_id = btf__type_cnt(linker->btf); + n = btf__type_cnt(obj->btf); + + obj->btf_type_map = calloc(n + 1, sizeof(int)); + if (!obj->btf_type_map) + return -ENOMEM; + + for (i = 1; i < n; i++) { + struct glob_sym *glob_sym = NULL; + + t = btf__type_by_id(obj->btf, i); + + /* DATASECs are handled specially below */ + if (btf_kind(t) == BTF_KIND_DATASEC) + continue; + + if (btf_is_non_static(t)) { + /* there should be glob_sym already */ + name = btf__str_by_offset(obj->btf, t->name_off); + glob_sym = find_glob_sym(linker, name); + + /* VARs without corresponding glob_sym are those that + * belong to skipped/deduplicated sections (i.e., + * license and version), so just skip them + */ + if (!glob_sym) + continue; + + /* linker_append_elf_sym() might have requested + * updating underlying type ID, if extern was resolved + * to strong symbol or weak got upgraded to non-weak + */ + if (glob_sym->underlying_btf_id == 0) + glob_sym->underlying_btf_id = -t->type; + + /* globals from previous object files that match our + * VAR/FUNC already have a corresponding associated + * BTF type, so just make sure to use it + */ + if (glob_sym->btf_id) { + /* reuse existing BTF type for global var/func */ + obj->btf_type_map[i] = glob_sym->btf_id; + continue; + } + } + + id = btf__add_type(linker->btf, obj->btf, t); + if (id < 0) { + pr_warn("failed to append BTF type #%d from file '%s'\n", i, obj->filename); + return id; + } + + obj->btf_type_map[i] = id; + + /* record just appended BTF type for var/func */ + if (glob_sym) { + glob_sym->btf_id = id; + glob_sym->underlying_btf_id = -t->type; + } + } + + /* remap all the types except DATASECs */ + n = btf__type_cnt(linker->btf); + for (i = start_id; i < n; i++) { + struct btf_type *dst_t = btf_type_by_id(linker->btf, i); + + if (btf_type_visit_type_ids(dst_t, remap_type_id, obj->btf_type_map)) + return -EINVAL; + } + + /* Rewrite VAR/FUNC underlying types (i.e., FUNC's FUNC_PROTO and VAR's + * actual type), if necessary + */ + for (i = 0; i < linker->glob_sym_cnt; i++) { + struct glob_sym *glob_sym = &linker->glob_syms[i]; + struct btf_type *glob_t; + + if (glob_sym->underlying_btf_id >= 0) + continue; + + glob_sym->underlying_btf_id = obj->btf_type_map[-glob_sym->underlying_btf_id]; + + glob_t = btf_type_by_id(linker->btf, glob_sym->btf_id); + glob_t->type = glob_sym->underlying_btf_id; + } + + /* append DATASEC info */ + for (i = 1; i < obj->sec_cnt; i++) { + struct src_sec *src_sec; + struct dst_sec *dst_sec; + const struct btf_var_secinfo *src_var; + struct btf_var_secinfo *dst_var; + + src_sec = &obj->secs[i]; + if (!src_sec->sec_type_id || src_sec->skipped) + continue; + dst_sec = &linker->secs[src_sec->dst_id]; + + /* Mark section as having BTF regardless of the presence of + * variables. In some cases compiler might generate empty BTF + * with no variables information. E.g., when promoting local + * array/structure variable initial values and BPF object + * file otherwise has no read-only static variables in + * .rodata. We need to preserve such empty BTF and just set + * correct section size. + */ + dst_sec->has_btf = true; + + t = btf__type_by_id(obj->btf, src_sec->sec_type_id); + src_var = btf_var_secinfos(t); + n = btf_vlen(t); + for (j = 0; j < n; j++, src_var++) { + void *sec_vars = dst_sec->sec_vars; + int new_id = obj->btf_type_map[src_var->type]; + struct glob_sym *glob_sym = NULL; + + t = btf_type_by_id(linker->btf, new_id); + if (btf_is_non_static(t)) { + name = btf__str_by_offset(linker->btf, t->name_off); + glob_sym = find_glob_sym(linker, name); + if (glob_sym->sec_id != dst_sec->id) { + pr_warn("global '%s': section mismatch %d vs %d\n", + name, glob_sym->sec_id, dst_sec->id); + return -EINVAL; + } + } + + /* If there is already a member (VAR or FUNC) mapped + * to the same type, don't add a duplicate entry. + * This will happen when multiple object files define + * the same extern VARs/FUNCs. + */ + if (glob_sym && glob_sym->var_idx >= 0) { + __s64 sz; + + dst_var = &dst_sec->sec_vars[glob_sym->var_idx]; + /* Because underlying BTF type might have + * changed, so might its size have changed, so + * re-calculate and update it in sec_var. + */ + sz = btf__resolve_size(linker->btf, glob_sym->underlying_btf_id); + if (sz < 0) { + pr_warn("global '%s': failed to resolve size of underlying type: %d\n", + name, (int)sz); + return -EINVAL; + } + dst_var->size = sz; + continue; + } + + sec_vars = libbpf_reallocarray(sec_vars, + dst_sec->sec_var_cnt + 1, + sizeof(*dst_sec->sec_vars)); + if (!sec_vars) + return -ENOMEM; + + dst_sec->sec_vars = sec_vars; + dst_sec->sec_var_cnt++; + + dst_var = &dst_sec->sec_vars[dst_sec->sec_var_cnt - 1]; + dst_var->type = obj->btf_type_map[src_var->type]; + dst_var->size = src_var->size; + dst_var->offset = src_sec->dst_off + src_var->offset; + + if (glob_sym) + glob_sym->var_idx = dst_sec->sec_var_cnt - 1; + } + } + + return 0; +} + +static void *add_btf_ext_rec(struct btf_ext_sec_data *ext_data, const void *src_rec) +{ + void *tmp; + + tmp = libbpf_reallocarray(ext_data->recs, ext_data->rec_cnt + 1, ext_data->rec_sz); + if (!tmp) + return NULL; + ext_data->recs = tmp; + + tmp += ext_data->rec_cnt * ext_data->rec_sz; + memcpy(tmp, src_rec, ext_data->rec_sz); + + ext_data->rec_cnt++; + + return tmp; +} + +static int linker_append_btf_ext(struct bpf_linker *linker, struct src_obj *obj) +{ + const struct btf_ext_info_sec *ext_sec; + const char *sec_name, *s; + struct src_sec *src_sec; + struct dst_sec *dst_sec; + int rec_sz, str_off, i; + + if (!obj->btf_ext) + return 0; + + rec_sz = obj->btf_ext->func_info.rec_size; + for_each_btf_ext_sec(&obj->btf_ext->func_info, ext_sec) { + struct bpf_func_info_min *src_rec, *dst_rec; + + sec_name = btf__name_by_offset(obj->btf, ext_sec->sec_name_off); + src_sec = find_src_sec_by_name(obj, sec_name); + if (!src_sec) { + pr_warn("can't find section '%s' referenced from .BTF.ext\n", sec_name); + return -EINVAL; + } + dst_sec = &linker->secs[src_sec->dst_id]; + + if (dst_sec->func_info.rec_sz == 0) + dst_sec->func_info.rec_sz = rec_sz; + if (dst_sec->func_info.rec_sz != rec_sz) { + pr_warn("incompatible .BTF.ext record sizes for section '%s'\n", sec_name); + return -EINVAL; + } + + for_each_btf_ext_rec(&obj->btf_ext->func_info, ext_sec, i, src_rec) { + dst_rec = add_btf_ext_rec(&dst_sec->func_info, src_rec); + if (!dst_rec) + return -ENOMEM; + + dst_rec->insn_off += src_sec->dst_off; + dst_rec->type_id = obj->btf_type_map[dst_rec->type_id]; + } + } + + rec_sz = obj->btf_ext->line_info.rec_size; + for_each_btf_ext_sec(&obj->btf_ext->line_info, ext_sec) { + struct bpf_line_info_min *src_rec, *dst_rec; + + sec_name = btf__name_by_offset(obj->btf, ext_sec->sec_name_off); + src_sec = find_src_sec_by_name(obj, sec_name); + if (!src_sec) { + pr_warn("can't find section '%s' referenced from .BTF.ext\n", sec_name); + return -EINVAL; + } + dst_sec = &linker->secs[src_sec->dst_id]; + + if (dst_sec->line_info.rec_sz == 0) + dst_sec->line_info.rec_sz = rec_sz; + if (dst_sec->line_info.rec_sz != rec_sz) { + pr_warn("incompatible .BTF.ext record sizes for section '%s'\n", sec_name); + return -EINVAL; + } + + for_each_btf_ext_rec(&obj->btf_ext->line_info, ext_sec, i, src_rec) { + dst_rec = add_btf_ext_rec(&dst_sec->line_info, src_rec); + if (!dst_rec) + return -ENOMEM; + + dst_rec->insn_off += src_sec->dst_off; + + s = btf__str_by_offset(obj->btf, src_rec->file_name_off); + str_off = btf__add_str(linker->btf, s); + if (str_off < 0) + return -ENOMEM; + dst_rec->file_name_off = str_off; + + s = btf__str_by_offset(obj->btf, src_rec->line_off); + str_off = btf__add_str(linker->btf, s); + if (str_off < 0) + return -ENOMEM; + dst_rec->line_off = str_off; + + /* dst_rec->line_col is fine */ + } + } + + rec_sz = obj->btf_ext->core_relo_info.rec_size; + for_each_btf_ext_sec(&obj->btf_ext->core_relo_info, ext_sec) { + struct bpf_core_relo *src_rec, *dst_rec; + + sec_name = btf__name_by_offset(obj->btf, ext_sec->sec_name_off); + src_sec = find_src_sec_by_name(obj, sec_name); + if (!src_sec) { + pr_warn("can't find section '%s' referenced from .BTF.ext\n", sec_name); + return -EINVAL; + } + dst_sec = &linker->secs[src_sec->dst_id]; + + if (dst_sec->core_relo_info.rec_sz == 0) + dst_sec->core_relo_info.rec_sz = rec_sz; + if (dst_sec->core_relo_info.rec_sz != rec_sz) { + pr_warn("incompatible .BTF.ext record sizes for section '%s'\n", sec_name); + return -EINVAL; + } + + for_each_btf_ext_rec(&obj->btf_ext->core_relo_info, ext_sec, i, src_rec) { + dst_rec = add_btf_ext_rec(&dst_sec->core_relo_info, src_rec); + if (!dst_rec) + return -ENOMEM; + + dst_rec->insn_off += src_sec->dst_off; + dst_rec->type_id = obj->btf_type_map[dst_rec->type_id]; + + s = btf__str_by_offset(obj->btf, src_rec->access_str_off); + str_off = btf__add_str(linker->btf, s); + if (str_off < 0) + return -ENOMEM; + dst_rec->access_str_off = str_off; + + /* dst_rec->kind is fine */ + } + } + + return 0; +} + +int bpf_linker__finalize(struct bpf_linker *linker) +{ + struct dst_sec *sec; + size_t strs_sz; + const void *strs; + int err, i; + + if (!linker->elf) + return libbpf_err(-EINVAL); + + err = finalize_btf(linker); + if (err) + return libbpf_err(err); + + /* Finalize strings */ + strs_sz = strset__data_size(linker->strtab_strs); + strs = strset__data(linker->strtab_strs); + + sec = &linker->secs[linker->strtab_sec_idx]; + sec->data->d_align = 1; + sec->data->d_off = 0LL; + sec->data->d_buf = (void *)strs; + sec->data->d_type = ELF_T_BYTE; + sec->data->d_size = strs_sz; + sec->shdr->sh_size = strs_sz; + + for (i = 1; i < linker->sec_cnt; i++) { + sec = &linker->secs[i]; + + /* STRTAB is handled specially above */ + if (sec->sec_idx == linker->strtab_sec_idx) + continue; + + /* special ephemeral sections (.ksyms, .kconfig, etc) */ + if (!sec->scn) + continue; + + sec->data->d_buf = sec->raw_data; + } + + /* Finalize ELF layout */ + if (elf_update(linker->elf, ELF_C_NULL) < 0) { + err = -errno; + pr_warn_elf("failed to finalize ELF layout"); + return libbpf_err(err); + } + + /* Write out final ELF contents */ + if (elf_update(linker->elf, ELF_C_WRITE) < 0) { + err = -errno; + pr_warn_elf("failed to write ELF contents"); + return libbpf_err(err); + } + + elf_end(linker->elf); + close(linker->fd); + + linker->elf = NULL; + linker->fd = -1; + + return 0; +} + +static int emit_elf_data_sec(struct bpf_linker *linker, const char *sec_name, + size_t align, const void *raw_data, size_t raw_sz) +{ + Elf_Scn *scn; + Elf_Data *data; + Elf64_Shdr *shdr; + int name_off; + + name_off = strset__add_str(linker->strtab_strs, sec_name); + if (name_off < 0) + return name_off; + + scn = elf_newscn(linker->elf); + if (!scn) + return -ENOMEM; + data = elf_newdata(scn); + if (!data) + return -ENOMEM; + shdr = elf64_getshdr(scn); + if (!shdr) + return -EINVAL; + + shdr->sh_name = name_off; + shdr->sh_type = SHT_PROGBITS; + shdr->sh_flags = 0; + shdr->sh_size = raw_sz; + shdr->sh_link = 0; + shdr->sh_info = 0; + shdr->sh_addralign = align; + shdr->sh_entsize = 0; + + data->d_type = ELF_T_BYTE; + data->d_size = raw_sz; + data->d_buf = (void *)raw_data; + data->d_align = align; + data->d_off = 0; + + return 0; +} + +static int finalize_btf(struct bpf_linker *linker) +{ + LIBBPF_OPTS(btf_dedup_opts, opts); + struct btf *btf = linker->btf; + const void *raw_data; + int i, j, id, err; + __u32 raw_sz; + + /* bail out if no BTF data was produced */ + if (btf__type_cnt(linker->btf) == 1) + return 0; + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + if (!sec->has_btf) + continue; + + id = btf__add_datasec(btf, sec->sec_name, sec->sec_sz); + if (id < 0) { + pr_warn("failed to add consolidated BTF type for datasec '%s': %d\n", + sec->sec_name, id); + return id; + } + + for (j = 0; j < sec->sec_var_cnt; j++) { + struct btf_var_secinfo *vi = &sec->sec_vars[j]; + + if (btf__add_datasec_var_info(btf, vi->type, vi->offset, vi->size)) + return -EINVAL; + } + } + + err = finalize_btf_ext(linker); + if (err) { + pr_warn(".BTF.ext generation failed: %d\n", err); + return err; + } + + opts.btf_ext = linker->btf_ext; + err = btf__dedup(linker->btf, &opts); + if (err) { + pr_warn("BTF dedup failed: %d\n", err); + return err; + } + + /* Emit .BTF section */ + raw_data = btf__raw_data(linker->btf, &raw_sz); + if (!raw_data) + return -ENOMEM; + + err = emit_elf_data_sec(linker, BTF_ELF_SEC, 8, raw_data, raw_sz); + if (err) { + pr_warn("failed to write out .BTF ELF section: %d\n", err); + return err; + } + + /* Emit .BTF.ext section */ + if (linker->btf_ext) { + raw_data = btf_ext__get_raw_data(linker->btf_ext, &raw_sz); + if (!raw_data) + return -ENOMEM; + + err = emit_elf_data_sec(linker, BTF_EXT_ELF_SEC, 8, raw_data, raw_sz); + if (err) { + pr_warn("failed to write out .BTF.ext ELF section: %d\n", err); + return err; + } + } + + return 0; +} + +static int emit_btf_ext_data(struct bpf_linker *linker, void *output, + const char *sec_name, struct btf_ext_sec_data *sec_data) +{ + struct btf_ext_info_sec *sec_info; + void *cur = output; + int str_off; + size_t sz; + + if (!sec_data->rec_cnt) + return 0; + + str_off = btf__add_str(linker->btf, sec_name); + if (str_off < 0) + return -ENOMEM; + + sec_info = cur; + sec_info->sec_name_off = str_off; + sec_info->num_info = sec_data->rec_cnt; + cur += sizeof(struct btf_ext_info_sec); + + sz = sec_data->rec_cnt * sec_data->rec_sz; + memcpy(cur, sec_data->recs, sz); + cur += sz; + + return cur - output; +} + +static int finalize_btf_ext(struct bpf_linker *linker) +{ + size_t funcs_sz = 0, lines_sz = 0, core_relos_sz = 0, total_sz = 0; + size_t func_rec_sz = 0, line_rec_sz = 0, core_relo_rec_sz = 0; + struct btf_ext_header *hdr; + void *data, *cur; + int i, err, sz; + + /* validate that all sections have the same .BTF.ext record sizes + * and calculate total data size for each type of data (func info, + * line info, core relos) + */ + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + if (sec->func_info.rec_cnt) { + if (func_rec_sz == 0) + func_rec_sz = sec->func_info.rec_sz; + if (func_rec_sz != sec->func_info.rec_sz) { + pr_warn("mismatch in func_info record size %zu != %u\n", + func_rec_sz, sec->func_info.rec_sz); + return -EINVAL; + } + + funcs_sz += sizeof(struct btf_ext_info_sec) + func_rec_sz * sec->func_info.rec_cnt; + } + if (sec->line_info.rec_cnt) { + if (line_rec_sz == 0) + line_rec_sz = sec->line_info.rec_sz; + if (line_rec_sz != sec->line_info.rec_sz) { + pr_warn("mismatch in line_info record size %zu != %u\n", + line_rec_sz, sec->line_info.rec_sz); + return -EINVAL; + } + + lines_sz += sizeof(struct btf_ext_info_sec) + line_rec_sz * sec->line_info.rec_cnt; + } + if (sec->core_relo_info.rec_cnt) { + if (core_relo_rec_sz == 0) + core_relo_rec_sz = sec->core_relo_info.rec_sz; + if (core_relo_rec_sz != sec->core_relo_info.rec_sz) { + pr_warn("mismatch in core_relo_info record size %zu != %u\n", + core_relo_rec_sz, sec->core_relo_info.rec_sz); + return -EINVAL; + } + + core_relos_sz += sizeof(struct btf_ext_info_sec) + core_relo_rec_sz * sec->core_relo_info.rec_cnt; + } + } + + if (!funcs_sz && !lines_sz && !core_relos_sz) + return 0; + + total_sz += sizeof(struct btf_ext_header); + if (funcs_sz) { + funcs_sz += sizeof(__u32); /* record size prefix */ + total_sz += funcs_sz; + } + if (lines_sz) { + lines_sz += sizeof(__u32); /* record size prefix */ + total_sz += lines_sz; + } + if (core_relos_sz) { + core_relos_sz += sizeof(__u32); /* record size prefix */ + total_sz += core_relos_sz; + } + + cur = data = calloc(1, total_sz); + if (!data) + return -ENOMEM; + + hdr = cur; + hdr->magic = BTF_MAGIC; + hdr->version = BTF_VERSION; + hdr->flags = 0; + hdr->hdr_len = sizeof(struct btf_ext_header); + cur += sizeof(struct btf_ext_header); + + /* All offsets are in bytes relative to the end of this header */ + hdr->func_info_off = 0; + hdr->func_info_len = funcs_sz; + hdr->line_info_off = funcs_sz; + hdr->line_info_len = lines_sz; + hdr->core_relo_off = funcs_sz + lines_sz; + hdr->core_relo_len = core_relos_sz; + + if (funcs_sz) { + *(__u32 *)cur = func_rec_sz; + cur += sizeof(__u32); + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->func_info); + if (sz < 0) { + err = sz; + goto out; + } + + cur += sz; + } + } + + if (lines_sz) { + *(__u32 *)cur = line_rec_sz; + cur += sizeof(__u32); + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->line_info); + if (sz < 0) { + err = sz; + goto out; + } + + cur += sz; + } + } + + if (core_relos_sz) { + *(__u32 *)cur = core_relo_rec_sz; + cur += sizeof(__u32); + + for (i = 1; i < linker->sec_cnt; i++) { + struct dst_sec *sec = &linker->secs[i]; + + sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->core_relo_info); + if (sz < 0) { + err = sz; + goto out; + } + + cur += sz; + } + } + + linker->btf_ext = btf_ext__new(data, total_sz); + err = libbpf_get_error(linker->btf_ext); + if (err) { + linker->btf_ext = NULL; + pr_warn("failed to parse final .BTF.ext data: %d\n", err); + goto out; + } + +out: + free(data); + return err; +} diff --git a/libbpf/src/netlink.c b/libbpf/src/netlink.c new file mode 100644 index 0000000..84dd5fa --- /dev/null +++ b/libbpf/src/netlink.c @@ -0,0 +1,917 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2018 Facebook */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_internal.h" +#include "nlattr.h" + +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + +typedef int (*libbpf_dump_nlmsg_t)(void *cookie, void *msg, struct nlattr **tb); + +typedef int (*__dump_nlmsg_t)(struct nlmsghdr *nlmsg, libbpf_dump_nlmsg_t, + void *cookie); + +struct xdp_link_info { + __u32 prog_id; + __u32 drv_prog_id; + __u32 hw_prog_id; + __u32 skb_prog_id; + __u8 attach_mode; +}; + +struct xdp_id_md { + int ifindex; + __u32 flags; + struct xdp_link_info info; + __u64 feature_flags; +}; + +struct xdp_features_md { + int ifindex; + __u64 flags; +}; + +static int libbpf_netlink_open(__u32 *nl_pid, int proto) +{ + struct sockaddr_nl sa; + socklen_t addrlen; + int one = 1, ret; + int sock; + + memset(&sa, 0, sizeof(sa)); + sa.nl_family = AF_NETLINK; + + sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, proto); + if (sock < 0) + return -errno; + + if (setsockopt(sock, SOL_NETLINK, NETLINK_EXT_ACK, + &one, sizeof(one)) < 0) { + pr_warn("Netlink error reporting not supported\n"); + } + + if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) { + ret = -errno; + goto cleanup; + } + + addrlen = sizeof(sa); + if (getsockname(sock, (struct sockaddr *)&sa, &addrlen) < 0) { + ret = -errno; + goto cleanup; + } + + if (addrlen != sizeof(sa)) { + ret = -LIBBPF_ERRNO__INTERNAL; + goto cleanup; + } + + *nl_pid = sa.nl_pid; + return sock; + +cleanup: + close(sock); + return ret; +} + +static void libbpf_netlink_close(int sock) +{ + close(sock); +} + +enum { + NL_CONT, + NL_NEXT, + NL_DONE, +}; + +static int netlink_recvmsg(int sock, struct msghdr *mhdr, int flags) +{ + int len; + + do { + len = recvmsg(sock, mhdr, flags); + } while (len < 0 && (errno == EINTR || errno == EAGAIN)); + + if (len < 0) + return -errno; + return len; +} + +static int alloc_iov(struct iovec *iov, int len) +{ + void *nbuf; + + nbuf = realloc(iov->iov_base, len); + if (!nbuf) + return -ENOMEM; + + iov->iov_base = nbuf; + iov->iov_len = len; + return 0; +} + +static int libbpf_netlink_recv(int sock, __u32 nl_pid, int seq, + __dump_nlmsg_t _fn, libbpf_dump_nlmsg_t fn, + void *cookie) +{ + struct iovec iov = {}; + struct msghdr mhdr = { + .msg_iov = &iov, + .msg_iovlen = 1, + }; + bool multipart = true; + struct nlmsgerr *err; + struct nlmsghdr *nh; + int len, ret; + + ret = alloc_iov(&iov, 4096); + if (ret) + goto done; + + while (multipart) { +start: + multipart = false; + len = netlink_recvmsg(sock, &mhdr, MSG_PEEK | MSG_TRUNC); + if (len < 0) { + ret = len; + goto done; + } + + if (len > iov.iov_len) { + ret = alloc_iov(&iov, len); + if (ret) + goto done; + } + + len = netlink_recvmsg(sock, &mhdr, 0); + if (len < 0) { + ret = len; + goto done; + } + + if (len == 0) + break; + + for (nh = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(nh, len); + nh = NLMSG_NEXT(nh, len)) { + if (nh->nlmsg_pid != nl_pid) { + ret = -LIBBPF_ERRNO__WRNGPID; + goto done; + } + if (nh->nlmsg_seq != seq) { + ret = -LIBBPF_ERRNO__INVSEQ; + goto done; + } + if (nh->nlmsg_flags & NLM_F_MULTI) + multipart = true; + switch (nh->nlmsg_type) { + case NLMSG_ERROR: + err = (struct nlmsgerr *)NLMSG_DATA(nh); + if (!err->error) + continue; + ret = err->error; + libbpf_nla_dump_errormsg(nh); + goto done; + case NLMSG_DONE: + ret = 0; + goto done; + default: + break; + } + if (_fn) { + ret = _fn(nh, fn, cookie); + switch (ret) { + case NL_CONT: + break; + case NL_NEXT: + goto start; + case NL_DONE: + ret = 0; + goto done; + default: + goto done; + } + } + } + } + ret = 0; +done: + free(iov.iov_base); + return ret; +} + +static int libbpf_netlink_send_recv(struct libbpf_nla_req *req, + int proto, __dump_nlmsg_t parse_msg, + libbpf_dump_nlmsg_t parse_attr, + void *cookie) +{ + __u32 nl_pid = 0; + int sock, ret; + + sock = libbpf_netlink_open(&nl_pid, proto); + if (sock < 0) + return sock; + + req->nh.nlmsg_pid = 0; + req->nh.nlmsg_seq = time(NULL); + + if (send(sock, req, req->nh.nlmsg_len, 0) < 0) { + ret = -errno; + goto out; + } + + ret = libbpf_netlink_recv(sock, nl_pid, req->nh.nlmsg_seq, + parse_msg, parse_attr, cookie); +out: + libbpf_netlink_close(sock); + return ret; +} + +static int parse_genl_family_id(struct nlmsghdr *nh, libbpf_dump_nlmsg_t fn, + void *cookie) +{ + struct genlmsghdr *gnl = NLMSG_DATA(nh); + struct nlattr *na = (struct nlattr *)((void *)gnl + GENL_HDRLEN); + struct nlattr *tb[CTRL_ATTR_FAMILY_ID + 1]; + __u16 *id = cookie; + + libbpf_nla_parse(tb, CTRL_ATTR_FAMILY_ID, na, + NLMSG_PAYLOAD(nh, sizeof(*gnl)), NULL); + if (!tb[CTRL_ATTR_FAMILY_ID]) + return NL_CONT; + + *id = libbpf_nla_getattr_u16(tb[CTRL_ATTR_FAMILY_ID]); + return NL_DONE; +} + +static int libbpf_netlink_resolve_genl_family_id(const char *name, + __u16 len, __u16 *id) +{ + struct libbpf_nla_req req = { + .nh.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN), + .nh.nlmsg_type = GENL_ID_CTRL, + .nh.nlmsg_flags = NLM_F_REQUEST, + .gnl.cmd = CTRL_CMD_GETFAMILY, + .gnl.version = 2, + }; + int err; + + err = nlattr_add(&req, CTRL_ATTR_FAMILY_NAME, name, len); + if (err < 0) + return err; + + return libbpf_netlink_send_recv(&req, NETLINK_GENERIC, + parse_genl_family_id, NULL, id); +} + +static int __bpf_set_link_xdp_fd_replace(int ifindex, int fd, int old_fd, + __u32 flags) +{ + struct nlattr *nla; + int ret; + struct libbpf_nla_req req; + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; + req.nh.nlmsg_type = RTM_SETLINK; + req.ifinfo.ifi_family = AF_UNSPEC; + req.ifinfo.ifi_index = ifindex; + + nla = nlattr_begin_nested(&req, IFLA_XDP); + if (!nla) + return -EMSGSIZE; + ret = nlattr_add(&req, IFLA_XDP_FD, &fd, sizeof(fd)); + if (ret < 0) + return ret; + if (flags) { + ret = nlattr_add(&req, IFLA_XDP_FLAGS, &flags, sizeof(flags)); + if (ret < 0) + return ret; + } + if (flags & XDP_FLAGS_REPLACE) { + ret = nlattr_add(&req, IFLA_XDP_EXPECTED_FD, &old_fd, + sizeof(old_fd)); + if (ret < 0) + return ret; + } + nlattr_end_nested(&req, nla); + + return libbpf_netlink_send_recv(&req, NETLINK_ROUTE, NULL, NULL, NULL); +} + +int bpf_xdp_attach(int ifindex, int prog_fd, __u32 flags, const struct bpf_xdp_attach_opts *opts) +{ + int old_prog_fd, err; + + if (!OPTS_VALID(opts, bpf_xdp_attach_opts)) + return libbpf_err(-EINVAL); + + old_prog_fd = OPTS_GET(opts, old_prog_fd, 0); + if (old_prog_fd) + flags |= XDP_FLAGS_REPLACE; + else + old_prog_fd = -1; + + err = __bpf_set_link_xdp_fd_replace(ifindex, prog_fd, old_prog_fd, flags); + return libbpf_err(err); +} + +int bpf_xdp_detach(int ifindex, __u32 flags, const struct bpf_xdp_attach_opts *opts) +{ + return bpf_xdp_attach(ifindex, -1, flags, opts); +} + +static int __dump_link_nlmsg(struct nlmsghdr *nlh, + libbpf_dump_nlmsg_t dump_link_nlmsg, void *cookie) +{ + struct nlattr *tb[IFLA_MAX + 1], *attr; + struct ifinfomsg *ifi = NLMSG_DATA(nlh); + int len; + + len = nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); + attr = (struct nlattr *) ((void *) ifi + NLMSG_ALIGN(sizeof(*ifi))); + + if (libbpf_nla_parse(tb, IFLA_MAX, attr, len, NULL) != 0) + return -LIBBPF_ERRNO__NLPARSE; + + return dump_link_nlmsg(cookie, ifi, tb); +} + +static int get_xdp_info(void *cookie, void *msg, struct nlattr **tb) +{ + struct nlattr *xdp_tb[IFLA_XDP_MAX + 1]; + struct xdp_id_md *xdp_id = cookie; + struct ifinfomsg *ifinfo = msg; + int ret; + + if (xdp_id->ifindex && xdp_id->ifindex != ifinfo->ifi_index) + return 0; + + if (!tb[IFLA_XDP]) + return 0; + + ret = libbpf_nla_parse_nested(xdp_tb, IFLA_XDP_MAX, tb[IFLA_XDP], NULL); + if (ret) + return ret; + + if (!xdp_tb[IFLA_XDP_ATTACHED]) + return 0; + + xdp_id->info.attach_mode = libbpf_nla_getattr_u8( + xdp_tb[IFLA_XDP_ATTACHED]); + + if (xdp_id->info.attach_mode == XDP_ATTACHED_NONE) + return 0; + + if (xdp_tb[IFLA_XDP_PROG_ID]) + xdp_id->info.prog_id = libbpf_nla_getattr_u32( + xdp_tb[IFLA_XDP_PROG_ID]); + + if (xdp_tb[IFLA_XDP_SKB_PROG_ID]) + xdp_id->info.skb_prog_id = libbpf_nla_getattr_u32( + xdp_tb[IFLA_XDP_SKB_PROG_ID]); + + if (xdp_tb[IFLA_XDP_DRV_PROG_ID]) + xdp_id->info.drv_prog_id = libbpf_nla_getattr_u32( + xdp_tb[IFLA_XDP_DRV_PROG_ID]); + + if (xdp_tb[IFLA_XDP_HW_PROG_ID]) + xdp_id->info.hw_prog_id = libbpf_nla_getattr_u32( + xdp_tb[IFLA_XDP_HW_PROG_ID]); + + return 0; +} + +static int parse_xdp_features(struct nlmsghdr *nh, libbpf_dump_nlmsg_t fn, + void *cookie) +{ + struct genlmsghdr *gnl = NLMSG_DATA(nh); + struct nlattr *na = (struct nlattr *)((void *)gnl + GENL_HDRLEN); + struct nlattr *tb[NETDEV_CMD_MAX + 1]; + struct xdp_features_md *md = cookie; + __u32 ifindex; + + libbpf_nla_parse(tb, NETDEV_CMD_MAX, na, + NLMSG_PAYLOAD(nh, sizeof(*gnl)), NULL); + + if (!tb[NETDEV_A_DEV_IFINDEX] || !tb[NETDEV_A_DEV_XDP_FEATURES]) + return NL_CONT; + + ifindex = libbpf_nla_getattr_u32(tb[NETDEV_A_DEV_IFINDEX]); + if (ifindex != md->ifindex) + return NL_CONT; + + md->flags = libbpf_nla_getattr_u64(tb[NETDEV_A_DEV_XDP_FEATURES]); + return NL_DONE; +} + +int bpf_xdp_query(int ifindex, int xdp_flags, struct bpf_xdp_query_opts *opts) +{ + struct libbpf_nla_req req = { + .nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)), + .nh.nlmsg_type = RTM_GETLINK, + .nh.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, + .ifinfo.ifi_family = AF_PACKET, + }; + struct xdp_id_md xdp_id = {}; + struct xdp_features_md md = { + .ifindex = ifindex, + }; + __u16 id; + int err; + + if (!OPTS_VALID(opts, bpf_xdp_query_opts)) + return libbpf_err(-EINVAL); + + if (xdp_flags & ~XDP_FLAGS_MASK) + return libbpf_err(-EINVAL); + + /* Check whether the single {HW,DRV,SKB} mode is set */ + xdp_flags &= XDP_FLAGS_SKB_MODE | XDP_FLAGS_DRV_MODE | XDP_FLAGS_HW_MODE; + if (xdp_flags & (xdp_flags - 1)) + return libbpf_err(-EINVAL); + + xdp_id.ifindex = ifindex; + xdp_id.flags = xdp_flags; + + err = libbpf_netlink_send_recv(&req, NETLINK_ROUTE, __dump_link_nlmsg, + get_xdp_info, &xdp_id); + if (err) + return libbpf_err(err); + + OPTS_SET(opts, prog_id, xdp_id.info.prog_id); + OPTS_SET(opts, drv_prog_id, xdp_id.info.drv_prog_id); + OPTS_SET(opts, hw_prog_id, xdp_id.info.hw_prog_id); + OPTS_SET(opts, skb_prog_id, xdp_id.info.skb_prog_id); + OPTS_SET(opts, attach_mode, xdp_id.info.attach_mode); + + if (!OPTS_HAS(opts, feature_flags)) + return 0; + + err = libbpf_netlink_resolve_genl_family_id("netdev", sizeof("netdev"), &id); + if (err < 0) { + if (err == -ENOENT) { + opts->feature_flags = 0; + goto skip_feature_flags; + } + return libbpf_err(err); + } + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(GENL_HDRLEN); + req.nh.nlmsg_flags = NLM_F_REQUEST; + req.nh.nlmsg_type = id; + req.gnl.cmd = NETDEV_CMD_DEV_GET; + req.gnl.version = 2; + + err = nlattr_add(&req, NETDEV_A_DEV_IFINDEX, &ifindex, sizeof(ifindex)); + if (err < 0) + return libbpf_err(err); + + err = libbpf_netlink_send_recv(&req, NETLINK_GENERIC, + parse_xdp_features, NULL, &md); + if (err) + return libbpf_err(err); + + opts->feature_flags = md.flags; + +skip_feature_flags: + return 0; +} + +int bpf_xdp_query_id(int ifindex, int flags, __u32 *prog_id) +{ + LIBBPF_OPTS(bpf_xdp_query_opts, opts); + int ret; + + ret = bpf_xdp_query(ifindex, flags, &opts); + if (ret) + return libbpf_err(ret); + + flags &= XDP_FLAGS_MODES; + + if (opts.attach_mode != XDP_ATTACHED_MULTI && !flags) + *prog_id = opts.prog_id; + else if (flags & XDP_FLAGS_DRV_MODE) + *prog_id = opts.drv_prog_id; + else if (flags & XDP_FLAGS_HW_MODE) + *prog_id = opts.hw_prog_id; + else if (flags & XDP_FLAGS_SKB_MODE) + *prog_id = opts.skb_prog_id; + else + *prog_id = 0; + + return 0; +} + + +typedef int (*qdisc_config_t)(struct libbpf_nla_req *req); + +static int clsact_config(struct libbpf_nla_req *req) +{ + req->tc.tcm_parent = TC_H_CLSACT; + req->tc.tcm_handle = TC_H_MAKE(TC_H_CLSACT, 0); + + return nlattr_add(req, TCA_KIND, "clsact", sizeof("clsact")); +} + +static int attach_point_to_config(struct bpf_tc_hook *hook, + qdisc_config_t *config) +{ + switch (OPTS_GET(hook, attach_point, 0)) { + case BPF_TC_INGRESS: + case BPF_TC_EGRESS: + case BPF_TC_INGRESS | BPF_TC_EGRESS: + if (OPTS_GET(hook, parent, 0)) + return -EINVAL; + *config = &clsact_config; + return 0; + case BPF_TC_CUSTOM: + return -EOPNOTSUPP; + default: + return -EINVAL; + } +} + +static int tc_get_tcm_parent(enum bpf_tc_attach_point attach_point, + __u32 *parent) +{ + switch (attach_point) { + case BPF_TC_INGRESS: + case BPF_TC_EGRESS: + if (*parent) + return -EINVAL; + *parent = TC_H_MAKE(TC_H_CLSACT, + attach_point == BPF_TC_INGRESS ? + TC_H_MIN_INGRESS : TC_H_MIN_EGRESS); + break; + case BPF_TC_CUSTOM: + if (!*parent) + return -EINVAL; + break; + default: + return -EINVAL; + } + return 0; +} + +static int tc_qdisc_modify(struct bpf_tc_hook *hook, int cmd, int flags) +{ + qdisc_config_t config; + int ret; + struct libbpf_nla_req req; + + ret = attach_point_to_config(hook, &config); + if (ret < 0) + return ret; + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | flags; + req.nh.nlmsg_type = cmd; + req.tc.tcm_family = AF_UNSPEC; + req.tc.tcm_ifindex = OPTS_GET(hook, ifindex, 0); + + ret = config(&req); + if (ret < 0) + return ret; + + return libbpf_netlink_send_recv(&req, NETLINK_ROUTE, NULL, NULL, NULL); +} + +static int tc_qdisc_create_excl(struct bpf_tc_hook *hook) +{ + return tc_qdisc_modify(hook, RTM_NEWQDISC, NLM_F_CREATE | NLM_F_EXCL); +} + +static int tc_qdisc_delete(struct bpf_tc_hook *hook) +{ + return tc_qdisc_modify(hook, RTM_DELQDISC, 0); +} + +int bpf_tc_hook_create(struct bpf_tc_hook *hook) +{ + int ret; + + if (!hook || !OPTS_VALID(hook, bpf_tc_hook) || + OPTS_GET(hook, ifindex, 0) <= 0) + return libbpf_err(-EINVAL); + + ret = tc_qdisc_create_excl(hook); + return libbpf_err(ret); +} + +static int __bpf_tc_detach(const struct bpf_tc_hook *hook, + const struct bpf_tc_opts *opts, + const bool flush); + +int bpf_tc_hook_destroy(struct bpf_tc_hook *hook) +{ + if (!hook || !OPTS_VALID(hook, bpf_tc_hook) || + OPTS_GET(hook, ifindex, 0) <= 0) + return libbpf_err(-EINVAL); + + switch (OPTS_GET(hook, attach_point, 0)) { + case BPF_TC_INGRESS: + case BPF_TC_EGRESS: + return libbpf_err(__bpf_tc_detach(hook, NULL, true)); + case BPF_TC_INGRESS | BPF_TC_EGRESS: + return libbpf_err(tc_qdisc_delete(hook)); + case BPF_TC_CUSTOM: + return libbpf_err(-EOPNOTSUPP); + default: + return libbpf_err(-EINVAL); + } +} + +struct bpf_cb_ctx { + struct bpf_tc_opts *opts; + bool processed; +}; + +static int __get_tc_info(void *cookie, struct tcmsg *tc, struct nlattr **tb, + bool unicast) +{ + struct nlattr *tbb[TCA_BPF_MAX + 1]; + struct bpf_cb_ctx *info = cookie; + + if (!info || !info->opts) + return -EINVAL; + if (unicast && info->processed) + return -EINVAL; + if (!tb[TCA_OPTIONS]) + return NL_CONT; + + libbpf_nla_parse_nested(tbb, TCA_BPF_MAX, tb[TCA_OPTIONS], NULL); + if (!tbb[TCA_BPF_ID]) + return -EINVAL; + + OPTS_SET(info->opts, prog_id, libbpf_nla_getattr_u32(tbb[TCA_BPF_ID])); + OPTS_SET(info->opts, handle, tc->tcm_handle); + OPTS_SET(info->opts, priority, TC_H_MAJ(tc->tcm_info) >> 16); + + info->processed = true; + return unicast ? NL_NEXT : NL_DONE; +} + +static int get_tc_info(struct nlmsghdr *nh, libbpf_dump_nlmsg_t fn, + void *cookie) +{ + struct tcmsg *tc = NLMSG_DATA(nh); + struct nlattr *tb[TCA_MAX + 1]; + + libbpf_nla_parse(tb, TCA_MAX, + (struct nlattr *)((void *)tc + NLMSG_ALIGN(sizeof(*tc))), + NLMSG_PAYLOAD(nh, sizeof(*tc)), NULL); + if (!tb[TCA_KIND]) + return NL_CONT; + return __get_tc_info(cookie, tc, tb, nh->nlmsg_flags & NLM_F_ECHO); +} + +static int tc_add_fd_and_name(struct libbpf_nla_req *req, int fd) +{ + struct bpf_prog_info info; + __u32 info_len = sizeof(info); + char name[256]; + int len, ret; + + memset(&info, 0, info_len); + ret = bpf_prog_get_info_by_fd(fd, &info, &info_len); + if (ret < 0) + return ret; + + ret = nlattr_add(req, TCA_BPF_FD, &fd, sizeof(fd)); + if (ret < 0) + return ret; + len = snprintf(name, sizeof(name), "%s:[%u]", info.name, info.id); + if (len < 0) + return -errno; + if (len >= sizeof(name)) + return -ENAMETOOLONG; + return nlattr_add(req, TCA_BPF_NAME, name, len + 1); +} + +int bpf_tc_attach(const struct bpf_tc_hook *hook, struct bpf_tc_opts *opts) +{ + __u32 protocol, bpf_flags, handle, priority, parent, prog_id, flags; + int ret, ifindex, attach_point, prog_fd; + struct bpf_cb_ctx info = {}; + struct libbpf_nla_req req; + struct nlattr *nla; + + if (!hook || !opts || + !OPTS_VALID(hook, bpf_tc_hook) || + !OPTS_VALID(opts, bpf_tc_opts)) + return libbpf_err(-EINVAL); + + ifindex = OPTS_GET(hook, ifindex, 0); + parent = OPTS_GET(hook, parent, 0); + attach_point = OPTS_GET(hook, attach_point, 0); + + handle = OPTS_GET(opts, handle, 0); + priority = OPTS_GET(opts, priority, 0); + prog_fd = OPTS_GET(opts, prog_fd, 0); + prog_id = OPTS_GET(opts, prog_id, 0); + flags = OPTS_GET(opts, flags, 0); + + if (ifindex <= 0 || !prog_fd || prog_id) + return libbpf_err(-EINVAL); + if (priority > UINT16_MAX) + return libbpf_err(-EINVAL); + if (flags & ~BPF_TC_F_REPLACE) + return libbpf_err(-EINVAL); + + flags = (flags & BPF_TC_F_REPLACE) ? NLM_F_REPLACE : NLM_F_EXCL; + protocol = ETH_P_ALL; + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_CREATE | + NLM_F_ECHO | flags; + req.nh.nlmsg_type = RTM_NEWTFILTER; + req.tc.tcm_family = AF_UNSPEC; + req.tc.tcm_ifindex = ifindex; + req.tc.tcm_handle = handle; + req.tc.tcm_info = TC_H_MAKE(priority << 16, htons(protocol)); + + ret = tc_get_tcm_parent(attach_point, &parent); + if (ret < 0) + return libbpf_err(ret); + req.tc.tcm_parent = parent; + + ret = nlattr_add(&req, TCA_KIND, "bpf", sizeof("bpf")); + if (ret < 0) + return libbpf_err(ret); + nla = nlattr_begin_nested(&req, TCA_OPTIONS); + if (!nla) + return libbpf_err(-EMSGSIZE); + ret = tc_add_fd_and_name(&req, prog_fd); + if (ret < 0) + return libbpf_err(ret); + bpf_flags = TCA_BPF_FLAG_ACT_DIRECT; + ret = nlattr_add(&req, TCA_BPF_FLAGS, &bpf_flags, sizeof(bpf_flags)); + if (ret < 0) + return libbpf_err(ret); + nlattr_end_nested(&req, nla); + + info.opts = opts; + + ret = libbpf_netlink_send_recv(&req, NETLINK_ROUTE, get_tc_info, NULL, + &info); + if (ret < 0) + return libbpf_err(ret); + if (!info.processed) + return libbpf_err(-ENOENT); + return ret; +} + +static int __bpf_tc_detach(const struct bpf_tc_hook *hook, + const struct bpf_tc_opts *opts, + const bool flush) +{ + __u32 protocol = 0, handle, priority, parent, prog_id, flags; + int ret, ifindex, attach_point, prog_fd; + struct libbpf_nla_req req; + + if (!hook || + !OPTS_VALID(hook, bpf_tc_hook) || + !OPTS_VALID(opts, bpf_tc_opts)) + return -EINVAL; + + ifindex = OPTS_GET(hook, ifindex, 0); + parent = OPTS_GET(hook, parent, 0); + attach_point = OPTS_GET(hook, attach_point, 0); + + handle = OPTS_GET(opts, handle, 0); + priority = OPTS_GET(opts, priority, 0); + prog_fd = OPTS_GET(opts, prog_fd, 0); + prog_id = OPTS_GET(opts, prog_id, 0); + flags = OPTS_GET(opts, flags, 0); + + if (ifindex <= 0 || flags || prog_fd || prog_id) + return -EINVAL; + if (priority > UINT16_MAX) + return -EINVAL; + if (!flush) { + if (!handle || !priority) + return -EINVAL; + protocol = ETH_P_ALL; + } else { + if (handle || priority) + return -EINVAL; + } + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; + req.nh.nlmsg_type = RTM_DELTFILTER; + req.tc.tcm_family = AF_UNSPEC; + req.tc.tcm_ifindex = ifindex; + if (!flush) { + req.tc.tcm_handle = handle; + req.tc.tcm_info = TC_H_MAKE(priority << 16, htons(protocol)); + } + + ret = tc_get_tcm_parent(attach_point, &parent); + if (ret < 0) + return ret; + req.tc.tcm_parent = parent; + + if (!flush) { + ret = nlattr_add(&req, TCA_KIND, "bpf", sizeof("bpf")); + if (ret < 0) + return ret; + } + + return libbpf_netlink_send_recv(&req, NETLINK_ROUTE, NULL, NULL, NULL); +} + +int bpf_tc_detach(const struct bpf_tc_hook *hook, + const struct bpf_tc_opts *opts) +{ + int ret; + + if (!opts) + return libbpf_err(-EINVAL); + + ret = __bpf_tc_detach(hook, opts, false); + return libbpf_err(ret); +} + +int bpf_tc_query(const struct bpf_tc_hook *hook, struct bpf_tc_opts *opts) +{ + __u32 protocol, handle, priority, parent, prog_id, flags; + int ret, ifindex, attach_point, prog_fd; + struct bpf_cb_ctx info = {}; + struct libbpf_nla_req req; + + if (!hook || !opts || + !OPTS_VALID(hook, bpf_tc_hook) || + !OPTS_VALID(opts, bpf_tc_opts)) + return libbpf_err(-EINVAL); + + ifindex = OPTS_GET(hook, ifindex, 0); + parent = OPTS_GET(hook, parent, 0); + attach_point = OPTS_GET(hook, attach_point, 0); + + handle = OPTS_GET(opts, handle, 0); + priority = OPTS_GET(opts, priority, 0); + prog_fd = OPTS_GET(opts, prog_fd, 0); + prog_id = OPTS_GET(opts, prog_id, 0); + flags = OPTS_GET(opts, flags, 0); + + if (ifindex <= 0 || flags || prog_fd || prog_id || + !handle || !priority) + return libbpf_err(-EINVAL); + if (priority > UINT16_MAX) + return libbpf_err(-EINVAL); + + protocol = ETH_P_ALL; + + memset(&req, 0, sizeof(req)); + req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); + req.nh.nlmsg_flags = NLM_F_REQUEST; + req.nh.nlmsg_type = RTM_GETTFILTER; + req.tc.tcm_family = AF_UNSPEC; + req.tc.tcm_ifindex = ifindex; + req.tc.tcm_handle = handle; + req.tc.tcm_info = TC_H_MAKE(priority << 16, htons(protocol)); + + ret = tc_get_tcm_parent(attach_point, &parent); + if (ret < 0) + return libbpf_err(ret); + req.tc.tcm_parent = parent; + + ret = nlattr_add(&req, TCA_KIND, "bpf", sizeof("bpf")); + if (ret < 0) + return libbpf_err(ret); + + info.opts = opts; + + ret = libbpf_netlink_send_recv(&req, NETLINK_ROUTE, get_tc_info, NULL, + &info); + if (ret < 0) + return libbpf_err(ret); + if (!info.processed) + return libbpf_err(-ENOENT); + return ret; +} diff --git a/libbpf/src/nlattr.c b/libbpf/src/nlattr.c new file mode 100644 index 0000000..975e265 --- /dev/null +++ b/libbpf/src/nlattr.c @@ -0,0 +1,195 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) + +/* + * NETLINK Netlink attributes + * + * Copyright (c) 2003-2013 Thomas Graf + */ + +#include +#include +#include +#include +#include "nlattr.h" +#include "libbpf_internal.h" + +static uint16_t nla_attr_minlen[LIBBPF_NLA_TYPE_MAX+1] = { + [LIBBPF_NLA_U8] = sizeof(uint8_t), + [LIBBPF_NLA_U16] = sizeof(uint16_t), + [LIBBPF_NLA_U32] = sizeof(uint32_t), + [LIBBPF_NLA_U64] = sizeof(uint64_t), + [LIBBPF_NLA_STRING] = 1, + [LIBBPF_NLA_FLAG] = 0, +}; + +static struct nlattr *nla_next(const struct nlattr *nla, int *remaining) +{ + int totlen = NLA_ALIGN(nla->nla_len); + + *remaining -= totlen; + return (struct nlattr *)((void *)nla + totlen); +} + +static int nla_ok(const struct nlattr *nla, int remaining) +{ + return remaining >= (int)sizeof(*nla) && + nla->nla_len >= sizeof(*nla) && + nla->nla_len <= remaining; +} + +static int nla_type(const struct nlattr *nla) +{ + return nla->nla_type & NLA_TYPE_MASK; +} + +static int validate_nla(struct nlattr *nla, int maxtype, + struct libbpf_nla_policy *policy) +{ + struct libbpf_nla_policy *pt; + unsigned int minlen = 0; + int type = nla_type(nla); + + if (type < 0 || type > maxtype) + return 0; + + pt = &policy[type]; + + if (pt->type > LIBBPF_NLA_TYPE_MAX) + return 0; + + if (pt->minlen) + minlen = pt->minlen; + else if (pt->type != LIBBPF_NLA_UNSPEC) + minlen = nla_attr_minlen[pt->type]; + + if (libbpf_nla_len(nla) < minlen) + return -1; + + if (pt->maxlen && libbpf_nla_len(nla) > pt->maxlen) + return -1; + + if (pt->type == LIBBPF_NLA_STRING) { + char *data = libbpf_nla_data(nla); + + if (data[libbpf_nla_len(nla) - 1] != '\0') + return -1; + } + + return 0; +} + +static inline int nlmsg_len(const struct nlmsghdr *nlh) +{ + return nlh->nlmsg_len - NLMSG_HDRLEN; +} + +/** + * Create attribute index based on a stream of attributes. + * @arg tb Index array to be filled (maxtype+1 elements). + * @arg maxtype Maximum attribute type expected and accepted. + * @arg head Head of attribute stream. + * @arg len Length of attribute stream. + * @arg policy Attribute validation policy. + * + * Iterates over the stream of attributes and stores a pointer to each + * attribute in the index array using the attribute type as index to + * the array. Attribute with a type greater than the maximum type + * specified will be silently ignored in order to maintain backwards + * compatibility. If \a policy is not NULL, the attribute will be + * validated using the specified policy. + * + * @see nla_validate + * @return 0 on success or a negative error code. + */ +int libbpf_nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, + int len, struct libbpf_nla_policy *policy) +{ + struct nlattr *nla; + int rem, err; + + memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1)); + + libbpf_nla_for_each_attr(nla, head, len, rem) { + int type = nla_type(nla); + + if (type > maxtype) + continue; + + if (policy) { + err = validate_nla(nla, maxtype, policy); + if (err < 0) + goto errout; + } + + if (tb[type]) + pr_warn("Attribute of type %#x found multiple times in message, " + "previous attribute is being ignored.\n", type); + + tb[type] = nla; + } + + err = 0; +errout: + return err; +} + +/** + * Create attribute index based on nested attribute + * @arg tb Index array to be filled (maxtype+1 elements). + * @arg maxtype Maximum attribute type expected and accepted. + * @arg nla Nested Attribute. + * @arg policy Attribute validation policy. + * + * Feeds the stream of attributes nested into the specified attribute + * to libbpf_nla_parse(). + * + * @see libbpf_nla_parse + * @return 0 on success or a negative error code. + */ +int libbpf_nla_parse_nested(struct nlattr *tb[], int maxtype, + struct nlattr *nla, + struct libbpf_nla_policy *policy) +{ + return libbpf_nla_parse(tb, maxtype, libbpf_nla_data(nla), + libbpf_nla_len(nla), policy); +} + +/* dump netlink extended ack error message */ +int libbpf_nla_dump_errormsg(struct nlmsghdr *nlh) +{ + struct libbpf_nla_policy extack_policy[NLMSGERR_ATTR_MAX + 1] = { + [NLMSGERR_ATTR_MSG] = { .type = LIBBPF_NLA_STRING }, + [NLMSGERR_ATTR_OFFS] = { .type = LIBBPF_NLA_U32 }, + }; + struct nlattr *tb[NLMSGERR_ATTR_MAX + 1], *attr; + struct nlmsgerr *err; + char *errmsg = NULL; + int hlen, alen; + + /* no TLVs, nothing to do here */ + if (!(nlh->nlmsg_flags & NLM_F_ACK_TLVS)) + return 0; + + err = (struct nlmsgerr *)NLMSG_DATA(nlh); + hlen = sizeof(*err); + + /* if NLM_F_CAPPED is set then the inner err msg was capped */ + if (!(nlh->nlmsg_flags & NLM_F_CAPPED)) + hlen += nlmsg_len(&err->msg); + + attr = (struct nlattr *) ((void *) err + hlen); + alen = (void *)nlh + nlh->nlmsg_len - (void *)attr; + + if (libbpf_nla_parse(tb, NLMSGERR_ATTR_MAX, attr, alen, + extack_policy) != 0) { + pr_warn("Failed to parse extended error attributes\n"); + return 0; + } + + if (tb[NLMSGERR_ATTR_MSG]) + errmsg = (char *) libbpf_nla_data(tb[NLMSGERR_ATTR_MSG]); + + pr_warn("Kernel error message: %s\n", errmsg); + + return 0; +} diff --git a/libbpf/src/nlattr.h b/libbpf/src/nlattr.h new file mode 100644 index 0000000..d92d1c1 --- /dev/null +++ b/libbpf/src/nlattr.h @@ -0,0 +1,176 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * NETLINK Netlink attributes + * + * Copyright (c) 2003-2013 Thomas Graf + */ + +#ifndef __LIBBPF_NLATTR_H +#define __LIBBPF_NLATTR_H + +#include +#include +#include +#include +#include +#include + +/* avoid multiple definition of netlink features */ +#define __LINUX_NETLINK_H + +/** + * Standard attribute types to specify validation policy + */ +enum { + LIBBPF_NLA_UNSPEC, /**< Unspecified type, binary data chunk */ + LIBBPF_NLA_U8, /**< 8 bit integer */ + LIBBPF_NLA_U16, /**< 16 bit integer */ + LIBBPF_NLA_U32, /**< 32 bit integer */ + LIBBPF_NLA_U64, /**< 64 bit integer */ + LIBBPF_NLA_STRING, /**< NUL terminated character string */ + LIBBPF_NLA_FLAG, /**< Flag */ + LIBBPF_NLA_MSECS, /**< Micro seconds (64bit) */ + LIBBPF_NLA_NESTED, /**< Nested attributes */ + __LIBBPF_NLA_TYPE_MAX, +}; + +#define LIBBPF_NLA_TYPE_MAX (__LIBBPF_NLA_TYPE_MAX - 1) + +/** + * @ingroup attr + * Attribute validation policy. + * + * See section @core_doc{core_attr_parse,Attribute Parsing} for more details. + */ +struct libbpf_nla_policy { + /** Type of attribute or LIBBPF_NLA_UNSPEC */ + uint16_t type; + + /** Minimal length of payload required */ + uint16_t minlen; + + /** Maximal length of payload allowed */ + uint16_t maxlen; +}; + +struct libbpf_nla_req { + struct nlmsghdr nh; + union { + struct ifinfomsg ifinfo; + struct tcmsg tc; + struct genlmsghdr gnl; + }; + char buf[128]; +}; + +/** + * @ingroup attr + * Iterate over a stream of attributes + * @arg pos loop counter, set to current attribute + * @arg head head of attribute stream + * @arg len length of attribute stream + * @arg rem initialized to len, holds bytes currently remaining in stream + */ +#define libbpf_nla_for_each_attr(pos, head, len, rem) \ + for (pos = head, rem = len; \ + nla_ok(pos, rem); \ + pos = nla_next(pos, &(rem))) + +/** + * libbpf_nla_data - head of payload + * @nla: netlink attribute + */ +static inline void *libbpf_nla_data(const struct nlattr *nla) +{ + return (void *)nla + NLA_HDRLEN; +} + +static inline uint8_t libbpf_nla_getattr_u8(const struct nlattr *nla) +{ + return *(uint8_t *)libbpf_nla_data(nla); +} + +static inline uint16_t libbpf_nla_getattr_u16(const struct nlattr *nla) +{ + return *(uint16_t *)libbpf_nla_data(nla); +} + +static inline uint32_t libbpf_nla_getattr_u32(const struct nlattr *nla) +{ + return *(uint32_t *)libbpf_nla_data(nla); +} + +static inline uint64_t libbpf_nla_getattr_u64(const struct nlattr *nla) +{ + return *(uint64_t *)libbpf_nla_data(nla); +} + +static inline const char *libbpf_nla_getattr_str(const struct nlattr *nla) +{ + return (const char *)libbpf_nla_data(nla); +} + +/** + * libbpf_nla_len - length of payload + * @nla: netlink attribute + */ +static inline int libbpf_nla_len(const struct nlattr *nla) +{ + return nla->nla_len - NLA_HDRLEN; +} + +int libbpf_nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, + int len, struct libbpf_nla_policy *policy); +int libbpf_nla_parse_nested(struct nlattr *tb[], int maxtype, + struct nlattr *nla, + struct libbpf_nla_policy *policy); + +int libbpf_nla_dump_errormsg(struct nlmsghdr *nlh); + +static inline struct nlattr *nla_data(struct nlattr *nla) +{ + return (struct nlattr *)((void *)nla + NLA_HDRLEN); +} + +static inline struct nlattr *req_tail(struct libbpf_nla_req *req) +{ + return (struct nlattr *)((void *)req + NLMSG_ALIGN(req->nh.nlmsg_len)); +} + +static inline int nlattr_add(struct libbpf_nla_req *req, int type, + const void *data, int len) +{ + struct nlattr *nla; + + if (NLMSG_ALIGN(req->nh.nlmsg_len) + NLA_ALIGN(NLA_HDRLEN + len) > sizeof(*req)) + return -EMSGSIZE; + if (!!data != !!len) + return -EINVAL; + + nla = req_tail(req); + nla->nla_type = type; + nla->nla_len = NLA_HDRLEN + len; + if (data) + memcpy(nla_data(nla), data, len); + req->nh.nlmsg_len = NLMSG_ALIGN(req->nh.nlmsg_len) + NLA_ALIGN(nla->nla_len); + return 0; +} + +static inline struct nlattr *nlattr_begin_nested(struct libbpf_nla_req *req, int type) +{ + struct nlattr *tail; + + tail = req_tail(req); + if (nlattr_add(req, type | NLA_F_NESTED, NULL, 0)) + return NULL; + return tail; +} + +static inline void nlattr_end_nested(struct libbpf_nla_req *req, + struct nlattr *tail) +{ + tail->nla_len = (void *)req_tail(req) - (void *)tail; +} + +#endif /* __LIBBPF_NLATTR_H */ diff --git a/libbpf/src/relo_core.c b/libbpf/src/relo_core.c new file mode 100644 index 0000000..a26b2f5 --- /dev/null +++ b/libbpf/src/relo_core.c @@ -0,0 +1,1687 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2019 Facebook */ + +#ifdef __KERNEL__ +#include +#include +#include +#include +#include "relo_core.h" + +static const char *btf_kind_str(const struct btf_type *t) +{ + return btf_type_str(t); +} + +static bool is_ldimm64_insn(struct bpf_insn *insn) +{ + return insn->code == (BPF_LD | BPF_IMM | BPF_DW); +} + +static const struct btf_type * +skip_mods_and_typedefs(const struct btf *btf, u32 id, u32 *res_id) +{ + return btf_type_skip_modifiers(btf, id, res_id); +} + +static const char *btf__name_by_offset(const struct btf *btf, u32 offset) +{ + return btf_name_by_offset(btf, offset); +} + +static s64 btf__resolve_size(const struct btf *btf, u32 type_id) +{ + const struct btf_type *t; + int size; + + t = btf_type_by_id(btf, type_id); + t = btf_resolve_size(btf, t, &size); + if (IS_ERR(t)) + return PTR_ERR(t); + return size; +} + +enum libbpf_print_level { + LIBBPF_WARN, + LIBBPF_INFO, + LIBBPF_DEBUG, +}; + +#undef pr_warn +#undef pr_info +#undef pr_debug +#define pr_warn(fmt, log, ...) bpf_log((void *)log, fmt, "", ##__VA_ARGS__) +#define pr_info(fmt, log, ...) bpf_log((void *)log, fmt, "", ##__VA_ARGS__) +#define pr_debug(fmt, log, ...) bpf_log((void *)log, fmt, "", ##__VA_ARGS__) +#define libbpf_print(level, fmt, ...) bpf_log((void *)prog_name, fmt, ##__VA_ARGS__) +#else +#include +#include +#include +#include +#include + +#include "libbpf.h" +#include "bpf.h" +#include "btf.h" +#include "str_error.h" +#include "libbpf_internal.h" +#endif + +static bool is_flex_arr(const struct btf *btf, + const struct bpf_core_accessor *acc, + const struct btf_array *arr) +{ + const struct btf_type *t; + + /* not a flexible array, if not inside a struct or has non-zero size */ + if (!acc->name || arr->nelems > 0) + return false; + + /* has to be the last member of enclosing struct */ + t = btf_type_by_id(btf, acc->type_id); + return acc->idx == btf_vlen(t) - 1; +} + +static const char *core_relo_kind_str(enum bpf_core_relo_kind kind) +{ + switch (kind) { + case BPF_CORE_FIELD_BYTE_OFFSET: return "byte_off"; + case BPF_CORE_FIELD_BYTE_SIZE: return "byte_sz"; + case BPF_CORE_FIELD_EXISTS: return "field_exists"; + case BPF_CORE_FIELD_SIGNED: return "signed"; + case BPF_CORE_FIELD_LSHIFT_U64: return "lshift_u64"; + case BPF_CORE_FIELD_RSHIFT_U64: return "rshift_u64"; + case BPF_CORE_TYPE_ID_LOCAL: return "local_type_id"; + case BPF_CORE_TYPE_ID_TARGET: return "target_type_id"; + case BPF_CORE_TYPE_EXISTS: return "type_exists"; + case BPF_CORE_TYPE_MATCHES: return "type_matches"; + case BPF_CORE_TYPE_SIZE: return "type_size"; + case BPF_CORE_ENUMVAL_EXISTS: return "enumval_exists"; + case BPF_CORE_ENUMVAL_VALUE: return "enumval_value"; + default: return "unknown"; + } +} + +static bool core_relo_is_field_based(enum bpf_core_relo_kind kind) +{ + switch (kind) { + case BPF_CORE_FIELD_BYTE_OFFSET: + case BPF_CORE_FIELD_BYTE_SIZE: + case BPF_CORE_FIELD_EXISTS: + case BPF_CORE_FIELD_SIGNED: + case BPF_CORE_FIELD_LSHIFT_U64: + case BPF_CORE_FIELD_RSHIFT_U64: + return true; + default: + return false; + } +} + +static bool core_relo_is_type_based(enum bpf_core_relo_kind kind) +{ + switch (kind) { + case BPF_CORE_TYPE_ID_LOCAL: + case BPF_CORE_TYPE_ID_TARGET: + case BPF_CORE_TYPE_EXISTS: + case BPF_CORE_TYPE_MATCHES: + case BPF_CORE_TYPE_SIZE: + return true; + default: + return false; + } +} + +static bool core_relo_is_enumval_based(enum bpf_core_relo_kind kind) +{ + switch (kind) { + case BPF_CORE_ENUMVAL_EXISTS: + case BPF_CORE_ENUMVAL_VALUE: + return true; + default: + return false; + } +} + +int __bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id, int level) +{ + const struct btf_type *local_type, *targ_type; + int depth = 32; /* max recursion depth */ + + /* caller made sure that names match (ignoring flavor suffix) */ + local_type = btf_type_by_id(local_btf, local_id); + targ_type = btf_type_by_id(targ_btf, targ_id); + if (!btf_kind_core_compat(local_type, targ_type)) + return 0; + +recur: + depth--; + if (depth < 0) + return -EINVAL; + + local_type = skip_mods_and_typedefs(local_btf, local_id, &local_id); + targ_type = skip_mods_and_typedefs(targ_btf, targ_id, &targ_id); + if (!local_type || !targ_type) + return -EINVAL; + + if (!btf_kind_core_compat(local_type, targ_type)) + return 0; + + switch (btf_kind(local_type)) { + case BTF_KIND_UNKN: + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + case BTF_KIND_ENUM: + case BTF_KIND_FWD: + case BTF_KIND_ENUM64: + return 1; + case BTF_KIND_INT: + /* just reject deprecated bitfield-like integers; all other + * integers are by default compatible between each other + */ + return btf_int_offset(local_type) == 0 && btf_int_offset(targ_type) == 0; + case BTF_KIND_PTR: + local_id = local_type->type; + targ_id = targ_type->type; + goto recur; + case BTF_KIND_ARRAY: + local_id = btf_array(local_type)->type; + targ_id = btf_array(targ_type)->type; + goto recur; + case BTF_KIND_FUNC_PROTO: { + struct btf_param *local_p = btf_params(local_type); + struct btf_param *targ_p = btf_params(targ_type); + __u16 local_vlen = btf_vlen(local_type); + __u16 targ_vlen = btf_vlen(targ_type); + int i, err; + + if (local_vlen != targ_vlen) + return 0; + + for (i = 0; i < local_vlen; i++, local_p++, targ_p++) { + if (level <= 0) + return -EINVAL; + + skip_mods_and_typedefs(local_btf, local_p->type, &local_id); + skip_mods_and_typedefs(targ_btf, targ_p->type, &targ_id); + err = __bpf_core_types_are_compat(local_btf, local_id, targ_btf, targ_id, + level - 1); + if (err <= 0) + return err; + } + + /* tail recurse for return type check */ + skip_mods_and_typedefs(local_btf, local_type->type, &local_id); + skip_mods_and_typedefs(targ_btf, targ_type->type, &targ_id); + goto recur; + } + default: + pr_warn("unexpected kind %s relocated, local [%d], target [%d]\n", + btf_kind_str(local_type), local_id, targ_id); + return 0; + } +} + +/* + * Turn bpf_core_relo into a low- and high-level spec representation, + * validating correctness along the way, as well as calculating resulting + * field bit offset, specified by accessor string. Low-level spec captures + * every single level of nestedness, including traversing anonymous + * struct/union members. High-level one only captures semantically meaningful + * "turning points": named fields and array indicies. + * E.g., for this case: + * + * struct sample { + * int __unimportant; + * struct { + * int __1; + * int __2; + * int a[7]; + * }; + * }; + * + * struct sample *s = ...; + * + * int x = &s->a[3]; // access string = '0:1:2:3' + * + * Low-level spec has 1:1 mapping with each element of access string (it's + * just a parsed access string representation): [0, 1, 2, 3]. + * + * High-level spec will capture only 3 points: + * - initial zero-index access by pointer (&s->... is the same as &s[0]...); + * - field 'a' access (corresponds to '2' in low-level spec); + * - array element #3 access (corresponds to '3' in low-level spec). + * + * Type-based relocations (TYPE_EXISTS/TYPE_MATCHES/TYPE_SIZE, + * TYPE_ID_LOCAL/TYPE_ID_TARGET) don't capture any field information. Their + * spec and raw_spec are kept empty. + * + * Enum value-based relocations (ENUMVAL_EXISTS/ENUMVAL_VALUE) use access + * string to specify enumerator's value index that need to be relocated. + */ +int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, + const struct bpf_core_relo *relo, + struct bpf_core_spec *spec) +{ + int access_idx, parsed_len, i; + struct bpf_core_accessor *acc; + const struct btf_type *t; + const char *name, *spec_str; + __u32 id, name_off; + __s64 sz; + + spec_str = btf__name_by_offset(btf, relo->access_str_off); + if (str_is_empty(spec_str) || *spec_str == ':') + return -EINVAL; + + memset(spec, 0, sizeof(*spec)); + spec->btf = btf; + spec->root_type_id = relo->type_id; + spec->relo_kind = relo->kind; + + /* type-based relocations don't have a field access string */ + if (core_relo_is_type_based(relo->kind)) { + if (strcmp(spec_str, "0")) + return -EINVAL; + return 0; + } + + /* parse spec_str="0:1:2:3:4" into array raw_spec=[0, 1, 2, 3, 4] */ + while (*spec_str) { + if (*spec_str == ':') + ++spec_str; + if (sscanf(spec_str, "%d%n", &access_idx, &parsed_len) != 1) + return -EINVAL; + if (spec->raw_len == BPF_CORE_SPEC_MAX_LEN) + return -E2BIG; + spec_str += parsed_len; + spec->raw_spec[spec->raw_len++] = access_idx; + } + + if (spec->raw_len == 0) + return -EINVAL; + + t = skip_mods_and_typedefs(btf, relo->type_id, &id); + if (!t) + return -EINVAL; + + access_idx = spec->raw_spec[0]; + acc = &spec->spec[0]; + acc->type_id = id; + acc->idx = access_idx; + spec->len++; + + if (core_relo_is_enumval_based(relo->kind)) { + if (!btf_is_any_enum(t) || spec->raw_len > 1 || access_idx >= btf_vlen(t)) + return -EINVAL; + + /* record enumerator name in a first accessor */ + name_off = btf_is_enum(t) ? btf_enum(t)[access_idx].name_off + : btf_enum64(t)[access_idx].name_off; + acc->name = btf__name_by_offset(btf, name_off); + return 0; + } + + if (!core_relo_is_field_based(relo->kind)) + return -EINVAL; + + sz = btf__resolve_size(btf, id); + if (sz < 0) + return sz; + spec->bit_offset = access_idx * sz * 8; + + for (i = 1; i < spec->raw_len; i++) { + t = skip_mods_and_typedefs(btf, id, &id); + if (!t) + return -EINVAL; + + access_idx = spec->raw_spec[i]; + acc = &spec->spec[spec->len]; + + if (btf_is_composite(t)) { + const struct btf_member *m; + __u32 bit_offset; + + if (access_idx >= btf_vlen(t)) + return -EINVAL; + + bit_offset = btf_member_bit_offset(t, access_idx); + spec->bit_offset += bit_offset; + + m = btf_members(t) + access_idx; + if (m->name_off) { + name = btf__name_by_offset(btf, m->name_off); + if (str_is_empty(name)) + return -EINVAL; + + acc->type_id = id; + acc->idx = access_idx; + acc->name = name; + spec->len++; + } + + id = m->type; + } else if (btf_is_array(t)) { + const struct btf_array *a = btf_array(t); + bool flex; + + t = skip_mods_and_typedefs(btf, a->type, &id); + if (!t) + return -EINVAL; + + flex = is_flex_arr(btf, acc - 1, a); + if (!flex && access_idx >= a->nelems) + return -EINVAL; + + spec->spec[spec->len].type_id = id; + spec->spec[spec->len].idx = access_idx; + spec->len++; + + sz = btf__resolve_size(btf, id); + if (sz < 0) + return sz; + spec->bit_offset += access_idx * sz * 8; + } else { + pr_warn("prog '%s': relo for [%u] %s (at idx %d) captures type [%d] of unexpected kind %s\n", + prog_name, relo->type_id, spec_str, i, id, btf_kind_str(t)); + return -EINVAL; + } + } + + return 0; +} + +/* Check two types for compatibility for the purpose of field access + * relocation. const/volatile/restrict and typedefs are skipped to ensure we + * are relocating semantically compatible entities: + * - any two STRUCTs/UNIONs are compatible and can be mixed; + * - any two FWDs are compatible, if their names match (modulo flavor suffix); + * - any two PTRs are always compatible; + * - for ENUMs, names should be the same (ignoring flavor suffix) or at + * least one of enums should be anonymous; + * - for ENUMs, check sizes, names are ignored; + * - for INT, size and signedness are ignored; + * - any two FLOATs are always compatible; + * - for ARRAY, dimensionality is ignored, element types are checked for + * compatibility recursively; + * - everything else shouldn't be ever a target of relocation. + * These rules are not set in stone and probably will be adjusted as we get + * more experience with using BPF CO-RE relocations. + */ +static int bpf_core_fields_are_compat(const struct btf *local_btf, + __u32 local_id, + const struct btf *targ_btf, + __u32 targ_id) +{ + const struct btf_type *local_type, *targ_type; + +recur: + local_type = skip_mods_and_typedefs(local_btf, local_id, &local_id); + targ_type = skip_mods_and_typedefs(targ_btf, targ_id, &targ_id); + if (!local_type || !targ_type) + return -EINVAL; + + if (btf_is_composite(local_type) && btf_is_composite(targ_type)) + return 1; + if (!btf_kind_core_compat(local_type, targ_type)) + return 0; + + switch (btf_kind(local_type)) { + case BTF_KIND_PTR: + case BTF_KIND_FLOAT: + return 1; + case BTF_KIND_FWD: + case BTF_KIND_ENUM64: + case BTF_KIND_ENUM: { + const char *local_name, *targ_name; + size_t local_len, targ_len; + + local_name = btf__name_by_offset(local_btf, + local_type->name_off); + targ_name = btf__name_by_offset(targ_btf, targ_type->name_off); + local_len = bpf_core_essential_name_len(local_name); + targ_len = bpf_core_essential_name_len(targ_name); + /* one of them is anonymous or both w/ same flavor-less names */ + return local_len == 0 || targ_len == 0 || + (local_len == targ_len && + strncmp(local_name, targ_name, local_len) == 0); + } + case BTF_KIND_INT: + /* just reject deprecated bitfield-like integers; all other + * integers are by default compatible between each other + */ + return btf_int_offset(local_type) == 0 && + btf_int_offset(targ_type) == 0; + case BTF_KIND_ARRAY: + local_id = btf_array(local_type)->type; + targ_id = btf_array(targ_type)->type; + goto recur; + default: + return 0; + } +} + +/* + * Given single high-level named field accessor in local type, find + * corresponding high-level accessor for a target type. Along the way, + * maintain low-level spec for target as well. Also keep updating target + * bit offset. + * + * Searching is performed through recursive exhaustive enumeration of all + * fields of a struct/union. If there are any anonymous (embedded) + * structs/unions, they are recursively searched as well. If field with + * desired name is found, check compatibility between local and target types, + * before returning result. + * + * 1 is returned, if field is found. + * 0 is returned if no compatible field is found. + * <0 is returned on error. + */ +static int bpf_core_match_member(const struct btf *local_btf, + const struct bpf_core_accessor *local_acc, + const struct btf *targ_btf, + __u32 targ_id, + struct bpf_core_spec *spec, + __u32 *next_targ_id) +{ + const struct btf_type *local_type, *targ_type; + const struct btf_member *local_member, *m; + const char *local_name, *targ_name; + __u32 local_id; + int i, n, found; + + targ_type = skip_mods_and_typedefs(targ_btf, targ_id, &targ_id); + if (!targ_type) + return -EINVAL; + if (!btf_is_composite(targ_type)) + return 0; + + local_id = local_acc->type_id; + local_type = btf_type_by_id(local_btf, local_id); + local_member = btf_members(local_type) + local_acc->idx; + local_name = btf__name_by_offset(local_btf, local_member->name_off); + + n = btf_vlen(targ_type); + m = btf_members(targ_type); + for (i = 0; i < n; i++, m++) { + __u32 bit_offset; + + bit_offset = btf_member_bit_offset(targ_type, i); + + /* too deep struct/union/array nesting */ + if (spec->raw_len == BPF_CORE_SPEC_MAX_LEN) + return -E2BIG; + + /* speculate this member will be the good one */ + spec->bit_offset += bit_offset; + spec->raw_spec[spec->raw_len++] = i; + + targ_name = btf__name_by_offset(targ_btf, m->name_off); + if (str_is_empty(targ_name)) { + /* embedded struct/union, we need to go deeper */ + found = bpf_core_match_member(local_btf, local_acc, + targ_btf, m->type, + spec, next_targ_id); + if (found) /* either found or error */ + return found; + } else if (strcmp(local_name, targ_name) == 0) { + /* matching named field */ + struct bpf_core_accessor *targ_acc; + + targ_acc = &spec->spec[spec->len++]; + targ_acc->type_id = targ_id; + targ_acc->idx = i; + targ_acc->name = targ_name; + + *next_targ_id = m->type; + found = bpf_core_fields_are_compat(local_btf, + local_member->type, + targ_btf, m->type); + if (!found) + spec->len--; /* pop accessor */ + return found; + } + /* member turned out not to be what we looked for */ + spec->bit_offset -= bit_offset; + spec->raw_len--; + } + + return 0; +} + +/* + * Try to match local spec to a target type and, if successful, produce full + * target spec (high-level, low-level + bit offset). + */ +static int bpf_core_spec_match(struct bpf_core_spec *local_spec, + const struct btf *targ_btf, __u32 targ_id, + struct bpf_core_spec *targ_spec) +{ + const struct btf_type *targ_type; + const struct bpf_core_accessor *local_acc; + struct bpf_core_accessor *targ_acc; + int i, sz, matched; + __u32 name_off; + + memset(targ_spec, 0, sizeof(*targ_spec)); + targ_spec->btf = targ_btf; + targ_spec->root_type_id = targ_id; + targ_spec->relo_kind = local_spec->relo_kind; + + if (core_relo_is_type_based(local_spec->relo_kind)) { + if (local_spec->relo_kind == BPF_CORE_TYPE_MATCHES) + return bpf_core_types_match(local_spec->btf, + local_spec->root_type_id, + targ_btf, targ_id); + else + return bpf_core_types_are_compat(local_spec->btf, + local_spec->root_type_id, + targ_btf, targ_id); + } + + local_acc = &local_spec->spec[0]; + targ_acc = &targ_spec->spec[0]; + + if (core_relo_is_enumval_based(local_spec->relo_kind)) { + size_t local_essent_len, targ_essent_len; + const char *targ_name; + + /* has to resolve to an enum */ + targ_type = skip_mods_and_typedefs(targ_spec->btf, targ_id, &targ_id); + if (!btf_is_any_enum(targ_type)) + return 0; + + local_essent_len = bpf_core_essential_name_len(local_acc->name); + + for (i = 0; i < btf_vlen(targ_type); i++) { + if (btf_is_enum(targ_type)) + name_off = btf_enum(targ_type)[i].name_off; + else + name_off = btf_enum64(targ_type)[i].name_off; + + targ_name = btf__name_by_offset(targ_spec->btf, name_off); + targ_essent_len = bpf_core_essential_name_len(targ_name); + if (targ_essent_len != local_essent_len) + continue; + if (strncmp(local_acc->name, targ_name, local_essent_len) == 0) { + targ_acc->type_id = targ_id; + targ_acc->idx = i; + targ_acc->name = targ_name; + targ_spec->len++; + targ_spec->raw_spec[targ_spec->raw_len] = targ_acc->idx; + targ_spec->raw_len++; + return 1; + } + } + return 0; + } + + if (!core_relo_is_field_based(local_spec->relo_kind)) + return -EINVAL; + + for (i = 0; i < local_spec->len; i++, local_acc++, targ_acc++) { + targ_type = skip_mods_and_typedefs(targ_spec->btf, targ_id, + &targ_id); + if (!targ_type) + return -EINVAL; + + if (local_acc->name) { + matched = bpf_core_match_member(local_spec->btf, + local_acc, + targ_btf, targ_id, + targ_spec, &targ_id); + if (matched <= 0) + return matched; + } else { + /* for i=0, targ_id is already treated as array element + * type (because it's the original struct), for others + * we should find array element type first + */ + if (i > 0) { + const struct btf_array *a; + bool flex; + + if (!btf_is_array(targ_type)) + return 0; + + a = btf_array(targ_type); + flex = is_flex_arr(targ_btf, targ_acc - 1, a); + if (!flex && local_acc->idx >= a->nelems) + return 0; + if (!skip_mods_and_typedefs(targ_btf, a->type, + &targ_id)) + return -EINVAL; + } + + /* too deep struct/union/array nesting */ + if (targ_spec->raw_len == BPF_CORE_SPEC_MAX_LEN) + return -E2BIG; + + targ_acc->type_id = targ_id; + targ_acc->idx = local_acc->idx; + targ_acc->name = NULL; + targ_spec->len++; + targ_spec->raw_spec[targ_spec->raw_len] = targ_acc->idx; + targ_spec->raw_len++; + + sz = btf__resolve_size(targ_btf, targ_id); + if (sz < 0) + return sz; + targ_spec->bit_offset += local_acc->idx * sz * 8; + } + } + + return 1; +} + +static int bpf_core_calc_field_relo(const char *prog_name, + const struct bpf_core_relo *relo, + const struct bpf_core_spec *spec, + __u64 *val, __u32 *field_sz, __u32 *type_id, + bool *validate) +{ + const struct bpf_core_accessor *acc; + const struct btf_type *t; + __u32 byte_off, byte_sz, bit_off, bit_sz, field_type_id; + const struct btf_member *m; + const struct btf_type *mt; + bool bitfield; + __s64 sz; + + *field_sz = 0; + + if (relo->kind == BPF_CORE_FIELD_EXISTS) { + *val = spec ? 1 : 0; + return 0; + } + + if (!spec) + return -EUCLEAN; /* request instruction poisoning */ + + acc = &spec->spec[spec->len - 1]; + t = btf_type_by_id(spec->btf, acc->type_id); + + /* a[n] accessor needs special handling */ + if (!acc->name) { + if (relo->kind == BPF_CORE_FIELD_BYTE_OFFSET) { + *val = spec->bit_offset / 8; + /* remember field size for load/store mem size */ + sz = btf__resolve_size(spec->btf, acc->type_id); + if (sz < 0) + return -EINVAL; + *field_sz = sz; + *type_id = acc->type_id; + } else if (relo->kind == BPF_CORE_FIELD_BYTE_SIZE) { + sz = btf__resolve_size(spec->btf, acc->type_id); + if (sz < 0) + return -EINVAL; + *val = sz; + } else { + pr_warn("prog '%s': relo %d at insn #%d can't be applied to array access\n", + prog_name, relo->kind, relo->insn_off / 8); + return -EINVAL; + } + if (validate) + *validate = true; + return 0; + } + + m = btf_members(t) + acc->idx; + mt = skip_mods_and_typedefs(spec->btf, m->type, &field_type_id); + bit_off = spec->bit_offset; + bit_sz = btf_member_bitfield_size(t, acc->idx); + + bitfield = bit_sz > 0; + if (bitfield) { + byte_sz = mt->size; + byte_off = bit_off / 8 / byte_sz * byte_sz; + /* figure out smallest int size necessary for bitfield load */ + while (bit_off + bit_sz - byte_off * 8 > byte_sz * 8) { + if (byte_sz >= 8) { + /* bitfield can't be read with 64-bit read */ + pr_warn("prog '%s': relo %d at insn #%d can't be satisfied for bitfield\n", + prog_name, relo->kind, relo->insn_off / 8); + return -E2BIG; + } + byte_sz *= 2; + byte_off = bit_off / 8 / byte_sz * byte_sz; + } + } else { + sz = btf__resolve_size(spec->btf, field_type_id); + if (sz < 0) + return -EINVAL; + byte_sz = sz; + byte_off = spec->bit_offset / 8; + bit_sz = byte_sz * 8; + } + + /* for bitfields, all the relocatable aspects are ambiguous and we + * might disagree with compiler, so turn off validation of expected + * value, except for signedness + */ + if (validate) + *validate = !bitfield; + + switch (relo->kind) { + case BPF_CORE_FIELD_BYTE_OFFSET: + *val = byte_off; + if (!bitfield) { + *field_sz = byte_sz; + *type_id = field_type_id; + } + break; + case BPF_CORE_FIELD_BYTE_SIZE: + *val = byte_sz; + break; + case BPF_CORE_FIELD_SIGNED: + *val = (btf_is_any_enum(mt) && BTF_INFO_KFLAG(mt->info)) || + (btf_int_encoding(mt) & BTF_INT_SIGNED); + if (validate) + *validate = true; /* signedness is never ambiguous */ + break; + case BPF_CORE_FIELD_LSHIFT_U64: +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + *val = 64 - (bit_off + bit_sz - byte_off * 8); +#else + *val = (8 - byte_sz) * 8 + (bit_off - byte_off * 8); +#endif + break; + case BPF_CORE_FIELD_RSHIFT_U64: + *val = 64 - bit_sz; + if (validate) + *validate = true; /* right shift is never ambiguous */ + break; + case BPF_CORE_FIELD_EXISTS: + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static int bpf_core_calc_type_relo(const struct bpf_core_relo *relo, + const struct bpf_core_spec *spec, + __u64 *val, bool *validate) +{ + __s64 sz; + + /* by default, always check expected value in bpf_insn */ + if (validate) + *validate = true; + + /* type-based relos return zero when target type is not found */ + if (!spec) { + *val = 0; + return 0; + } + + switch (relo->kind) { + case BPF_CORE_TYPE_ID_TARGET: + *val = spec->root_type_id; + /* type ID, embedded in bpf_insn, might change during linking, + * so enforcing it is pointless + */ + if (validate) + *validate = false; + break; + case BPF_CORE_TYPE_EXISTS: + case BPF_CORE_TYPE_MATCHES: + *val = 1; + break; + case BPF_CORE_TYPE_SIZE: + sz = btf__resolve_size(spec->btf, spec->root_type_id); + if (sz < 0) + return -EINVAL; + *val = sz; + break; + case BPF_CORE_TYPE_ID_LOCAL: + /* BPF_CORE_TYPE_ID_LOCAL is handled specially and shouldn't get here */ + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static int bpf_core_calc_enumval_relo(const struct bpf_core_relo *relo, + const struct bpf_core_spec *spec, + __u64 *val) +{ + const struct btf_type *t; + + switch (relo->kind) { + case BPF_CORE_ENUMVAL_EXISTS: + *val = spec ? 1 : 0; + break; + case BPF_CORE_ENUMVAL_VALUE: + if (!spec) + return -EUCLEAN; /* request instruction poisoning */ + t = btf_type_by_id(spec->btf, spec->spec[0].type_id); + if (btf_is_enum(t)) + *val = btf_enum(t)[spec->spec[0].idx].val; + else + *val = btf_enum64_value(btf_enum64(t) + spec->spec[0].idx); + break; + default: + return -EOPNOTSUPP; + } + + return 0; +} + +/* Calculate original and target relocation values, given local and target + * specs and relocation kind. These values are calculated for each candidate. + * If there are multiple candidates, resulting values should all be consistent + * with each other. Otherwise, libbpf will refuse to proceed due to ambiguity. + * If instruction has to be poisoned, *poison will be set to true. + */ +static int bpf_core_calc_relo(const char *prog_name, + const struct bpf_core_relo *relo, + int relo_idx, + const struct bpf_core_spec *local_spec, + const struct bpf_core_spec *targ_spec, + struct bpf_core_relo_res *res) +{ + int err = -EOPNOTSUPP; + + res->orig_val = 0; + res->new_val = 0; + res->poison = false; + res->validate = true; + res->fail_memsz_adjust = false; + res->orig_sz = res->new_sz = 0; + res->orig_type_id = res->new_type_id = 0; + + if (core_relo_is_field_based(relo->kind)) { + err = bpf_core_calc_field_relo(prog_name, relo, local_spec, + &res->orig_val, &res->orig_sz, + &res->orig_type_id, &res->validate); + err = err ?: bpf_core_calc_field_relo(prog_name, relo, targ_spec, + &res->new_val, &res->new_sz, + &res->new_type_id, NULL); + if (err) + goto done; + /* Validate if it's safe to adjust load/store memory size. + * Adjustments are performed only if original and new memory + * sizes differ. + */ + res->fail_memsz_adjust = false; + if (res->orig_sz != res->new_sz) { + const struct btf_type *orig_t, *new_t; + + orig_t = btf_type_by_id(local_spec->btf, res->orig_type_id); + new_t = btf_type_by_id(targ_spec->btf, res->new_type_id); + + /* There are two use cases in which it's safe to + * adjust load/store's mem size: + * - reading a 32-bit kernel pointer, while on BPF + * size pointers are always 64-bit; in this case + * it's safe to "downsize" instruction size due to + * pointer being treated as unsigned integer with + * zero-extended upper 32-bits; + * - reading unsigned integers, again due to + * zero-extension is preserving the value correctly. + * + * In all other cases it's incorrect to attempt to + * load/store field because read value will be + * incorrect, so we poison relocated instruction. + */ + if (btf_is_ptr(orig_t) && btf_is_ptr(new_t)) + goto done; + if (btf_is_int(orig_t) && btf_is_int(new_t) && + btf_int_encoding(orig_t) != BTF_INT_SIGNED && + btf_int_encoding(new_t) != BTF_INT_SIGNED) + goto done; + + /* mark as invalid mem size adjustment, but this will + * only be checked for LDX/STX/ST insns + */ + res->fail_memsz_adjust = true; + } + } else if (core_relo_is_type_based(relo->kind)) { + err = bpf_core_calc_type_relo(relo, local_spec, &res->orig_val, &res->validate); + err = err ?: bpf_core_calc_type_relo(relo, targ_spec, &res->new_val, NULL); + } else if (core_relo_is_enumval_based(relo->kind)) { + err = bpf_core_calc_enumval_relo(relo, local_spec, &res->orig_val); + err = err ?: bpf_core_calc_enumval_relo(relo, targ_spec, &res->new_val); + } + +done: + if (err == -EUCLEAN) { + /* EUCLEAN is used to signal instruction poisoning request */ + res->poison = true; + err = 0; + } else if (err == -EOPNOTSUPP) { + /* EOPNOTSUPP means unknown/unsupported relocation */ + pr_warn("prog '%s': relo #%d: unrecognized CO-RE relocation %s (%d) at insn #%d\n", + prog_name, relo_idx, core_relo_kind_str(relo->kind), + relo->kind, relo->insn_off / 8); + } + + return err; +} + +/* + * Turn instruction for which CO_RE relocation failed into invalid one with + * distinct signature. + */ +static void bpf_core_poison_insn(const char *prog_name, int relo_idx, + int insn_idx, struct bpf_insn *insn) +{ + pr_debug("prog '%s': relo #%d: substituting insn #%d w/ invalid insn\n", + prog_name, relo_idx, insn_idx); + insn->code = BPF_JMP | BPF_CALL; + insn->dst_reg = 0; + insn->src_reg = 0; + insn->off = 0; + /* if this instruction is reachable (not a dead code), + * verifier will complain with the following message: + * invalid func unknown#195896080 + */ + insn->imm = 195896080; /* => 0xbad2310 => "bad relo" */ +} + +static int insn_bpf_size_to_bytes(struct bpf_insn *insn) +{ + switch (BPF_SIZE(insn->code)) { + case BPF_DW: return 8; + case BPF_W: return 4; + case BPF_H: return 2; + case BPF_B: return 1; + default: return -1; + } +} + +static int insn_bytes_to_bpf_size(__u32 sz) +{ + switch (sz) { + case 8: return BPF_DW; + case 4: return BPF_W; + case 2: return BPF_H; + case 1: return BPF_B; + default: return -1; + } +} + +/* + * Patch relocatable BPF instruction. + * + * Patched value is determined by relocation kind and target specification. + * For existence relocations target spec will be NULL if field/type is not found. + * Expected insn->imm value is determined using relocation kind and local + * spec, and is checked before patching instruction. If actual insn->imm value + * is wrong, bail out with error. + * + * Currently supported classes of BPF instruction are: + * 1. rX = (assignment with immediate operand); + * 2. rX += (arithmetic operations with immediate operand); + * 3. rX = (load with 64-bit immediate value); + * 4. rX = *(T *)(rY + ), where T is one of {u8, u16, u32, u64}; + * 5. *(T *)(rX + ) = rY, where T is one of {u8, u16, u32, u64}; + * 6. *(T *)(rX + ) = , where T is one of {u8, u16, u32, u64}. + */ +int bpf_core_patch_insn(const char *prog_name, struct bpf_insn *insn, + int insn_idx, const struct bpf_core_relo *relo, + int relo_idx, const struct bpf_core_relo_res *res) +{ + __u64 orig_val, new_val; + __u8 class; + + class = BPF_CLASS(insn->code); + + if (res->poison) { +poison: + /* poison second part of ldimm64 to avoid confusing error from + * verifier about "unknown opcode 00" + */ + if (is_ldimm64_insn(insn)) + bpf_core_poison_insn(prog_name, relo_idx, insn_idx + 1, insn + 1); + bpf_core_poison_insn(prog_name, relo_idx, insn_idx, insn); + return 0; + } + + orig_val = res->orig_val; + new_val = res->new_val; + + switch (class) { + case BPF_ALU: + case BPF_ALU64: + if (BPF_SRC(insn->code) != BPF_K) + return -EINVAL; + if (res->validate && insn->imm != orig_val) { + pr_warn("prog '%s': relo #%d: unexpected insn #%d (ALU/ALU64) value: got %u, exp %llu -> %llu\n", + prog_name, relo_idx, + insn_idx, insn->imm, (unsigned long long)orig_val, + (unsigned long long)new_val); + return -EINVAL; + } + orig_val = insn->imm; + insn->imm = new_val; + pr_debug("prog '%s': relo #%d: patched insn #%d (ALU/ALU64) imm %llu -> %llu\n", + prog_name, relo_idx, insn_idx, + (unsigned long long)orig_val, (unsigned long long)new_val); + break; + case BPF_LDX: + case BPF_ST: + case BPF_STX: + if (res->validate && insn->off != orig_val) { + pr_warn("prog '%s': relo #%d: unexpected insn #%d (LDX/ST/STX) value: got %u, exp %llu -> %llu\n", + prog_name, relo_idx, insn_idx, insn->off, (unsigned long long)orig_val, + (unsigned long long)new_val); + return -EINVAL; + } + if (new_val > SHRT_MAX) { + pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) value too big: %llu\n", + prog_name, relo_idx, insn_idx, (unsigned long long)new_val); + return -ERANGE; + } + if (res->fail_memsz_adjust) { + pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) accesses field incorrectly. " + "Make sure you are accessing pointers, unsigned integers, or fields of matching type and size.\n", + prog_name, relo_idx, insn_idx); + goto poison; + } + + orig_val = insn->off; + insn->off = new_val; + pr_debug("prog '%s': relo #%d: patched insn #%d (LDX/ST/STX) off %llu -> %llu\n", + prog_name, relo_idx, insn_idx, (unsigned long long)orig_val, + (unsigned long long)new_val); + + if (res->new_sz != res->orig_sz) { + int insn_bytes_sz, insn_bpf_sz; + + insn_bytes_sz = insn_bpf_size_to_bytes(insn); + if (insn_bytes_sz != res->orig_sz) { + pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) unexpected mem size: got %d, exp %u\n", + prog_name, relo_idx, insn_idx, insn_bytes_sz, res->orig_sz); + return -EINVAL; + } + + insn_bpf_sz = insn_bytes_to_bpf_size(res->new_sz); + if (insn_bpf_sz < 0) { + pr_warn("prog '%s': relo #%d: insn #%d (LDX/ST/STX) invalid new mem size: %u\n", + prog_name, relo_idx, insn_idx, res->new_sz); + return -EINVAL; + } + + insn->code = BPF_MODE(insn->code) | insn_bpf_sz | BPF_CLASS(insn->code); + pr_debug("prog '%s': relo #%d: patched insn #%d (LDX/ST/STX) mem_sz %u -> %u\n", + prog_name, relo_idx, insn_idx, res->orig_sz, res->new_sz); + } + break; + case BPF_LD: { + __u64 imm; + + if (!is_ldimm64_insn(insn) || + insn[0].src_reg != 0 || insn[0].off != 0 || + insn[1].code != 0 || insn[1].dst_reg != 0 || + insn[1].src_reg != 0 || insn[1].off != 0) { + pr_warn("prog '%s': relo #%d: insn #%d (LDIMM64) has unexpected form\n", + prog_name, relo_idx, insn_idx); + return -EINVAL; + } + + imm = (__u32)insn[0].imm | ((__u64)insn[1].imm << 32); + if (res->validate && imm != orig_val) { + pr_warn("prog '%s': relo #%d: unexpected insn #%d (LDIMM64) value: got %llu, exp %llu -> %llu\n", + prog_name, relo_idx, + insn_idx, (unsigned long long)imm, + (unsigned long long)orig_val, (unsigned long long)new_val); + return -EINVAL; + } + + insn[0].imm = new_val; + insn[1].imm = new_val >> 32; + pr_debug("prog '%s': relo #%d: patched insn #%d (LDIMM64) imm64 %llu -> %llu\n", + prog_name, relo_idx, insn_idx, + (unsigned long long)imm, (unsigned long long)new_val); + break; + } + default: + pr_warn("prog '%s': relo #%d: trying to relocate unrecognized insn #%d, code:0x%x, src:0x%x, dst:0x%x, off:0x%x, imm:0x%x\n", + prog_name, relo_idx, insn_idx, insn->code, + insn->src_reg, insn->dst_reg, insn->off, insn->imm); + return -EINVAL; + } + + return 0; +} + +/* Output spec definition in the format: + * [] () + => @, + * where is a C-syntax view of recorded field access, e.g.: x.a[3].b + */ +int bpf_core_format_spec(char *buf, size_t buf_sz, const struct bpf_core_spec *spec) +{ + const struct btf_type *t; + const char *s; + __u32 type_id; + int i, len = 0; + +#define append_buf(fmt, args...) \ + ({ \ + int r; \ + r = snprintf(buf, buf_sz, fmt, ##args); \ + len += r; \ + if (r >= buf_sz) \ + r = buf_sz; \ + buf += r; \ + buf_sz -= r; \ + }) + + type_id = spec->root_type_id; + t = btf_type_by_id(spec->btf, type_id); + s = btf__name_by_offset(spec->btf, t->name_off); + + append_buf("<%s> [%u] %s %s", + core_relo_kind_str(spec->relo_kind), + type_id, btf_kind_str(t), str_is_empty(s) ? "" : s); + + if (core_relo_is_type_based(spec->relo_kind)) + return len; + + if (core_relo_is_enumval_based(spec->relo_kind)) { + t = skip_mods_and_typedefs(spec->btf, type_id, NULL); + if (btf_is_enum(t)) { + const struct btf_enum *e; + const char *fmt_str; + + e = btf_enum(t) + spec->raw_spec[0]; + s = btf__name_by_offset(spec->btf, e->name_off); + fmt_str = BTF_INFO_KFLAG(t->info) ? "::%s = %d" : "::%s = %u"; + append_buf(fmt_str, s, e->val); + } else { + const struct btf_enum64 *e; + const char *fmt_str; + + e = btf_enum64(t) + spec->raw_spec[0]; + s = btf__name_by_offset(spec->btf, e->name_off); + fmt_str = BTF_INFO_KFLAG(t->info) ? "::%s = %lld" : "::%s = %llu"; + append_buf(fmt_str, s, (unsigned long long)btf_enum64_value(e)); + } + return len; + } + + if (core_relo_is_field_based(spec->relo_kind)) { + for (i = 0; i < spec->len; i++) { + if (spec->spec[i].name) + append_buf(".%s", spec->spec[i].name); + else if (i > 0 || spec->spec[i].idx > 0) + append_buf("[%u]", spec->spec[i].idx); + } + + append_buf(" ("); + for (i = 0; i < spec->raw_len; i++) + append_buf("%s%d", i == 0 ? "" : ":", spec->raw_spec[i]); + + if (spec->bit_offset % 8) + append_buf(" @ offset %u.%u)", spec->bit_offset / 8, spec->bit_offset % 8); + else + append_buf(" @ offset %u)", spec->bit_offset / 8); + return len; + } + + return len; +#undef append_buf +} + +/* + * Calculate CO-RE relocation target result. + * + * The outline and important points of the algorithm: + * 1. For given local type, find corresponding candidate target types. + * Candidate type is a type with the same "essential" name, ignoring + * everything after last triple underscore (___). E.g., `sample`, + * `sample___flavor_one`, `sample___flavor_another_one`, are all candidates + * for each other. Names with triple underscore are referred to as + * "flavors" and are useful, among other things, to allow to + * specify/support incompatible variations of the same kernel struct, which + * might differ between different kernel versions and/or build + * configurations. + * + * N.B. Struct "flavors" could be generated by bpftool's BTF-to-C + * converter, when deduplicated BTF of a kernel still contains more than + * one different types with the same name. In that case, ___2, ___3, etc + * are appended starting from second name conflict. But start flavors are + * also useful to be defined "locally", in BPF program, to extract same + * data from incompatible changes between different kernel + * versions/configurations. For instance, to handle field renames between + * kernel versions, one can use two flavors of the struct name with the + * same common name and use conditional relocations to extract that field, + * depending on target kernel version. + * 2. For each candidate type, try to match local specification to this + * candidate target type. Matching involves finding corresponding + * high-level spec accessors, meaning that all named fields should match, + * as well as all array accesses should be within the actual bounds. Also, + * types should be compatible (see bpf_core_fields_are_compat for details). + * 3. It is supported and expected that there might be multiple flavors + * matching the spec. As long as all the specs resolve to the same set of + * offsets across all candidates, there is no error. If there is any + * ambiguity, CO-RE relocation will fail. This is necessary to accommodate + * imperfection of BTF deduplication, which can cause slight duplication of + * the same BTF type, if some directly or indirectly referenced (by + * pointer) type gets resolved to different actual types in different + * object files. If such a situation occurs, deduplicated BTF will end up + * with two (or more) structurally identical types, which differ only in + * types they refer to through pointer. This should be OK in most cases and + * is not an error. + * 4. Candidate types search is performed by linearly scanning through all + * types in target BTF. It is anticipated that this is overall more + * efficient memory-wise and not significantly worse (if not better) + * CPU-wise compared to prebuilding a map from all local type names to + * a list of candidate type names. It's also sped up by caching resolved + * list of matching candidates per each local "root" type ID, that has at + * least one bpf_core_relo associated with it. This list is shared + * between multiple relocations for the same type ID and is updated as some + * of the candidates are pruned due to structural incompatibility. + */ +int bpf_core_calc_relo_insn(const char *prog_name, + const struct bpf_core_relo *relo, + int relo_idx, + const struct btf *local_btf, + struct bpf_core_cand_list *cands, + struct bpf_core_spec *specs_scratch, + struct bpf_core_relo_res *targ_res) +{ + struct bpf_core_spec *local_spec = &specs_scratch[0]; + struct bpf_core_spec *cand_spec = &specs_scratch[1]; + struct bpf_core_spec *targ_spec = &specs_scratch[2]; + struct bpf_core_relo_res cand_res; + const struct btf_type *local_type; + const char *local_name; + __u32 local_id; + char spec_buf[256]; + int i, j, err; + + local_id = relo->type_id; + local_type = btf_type_by_id(local_btf, local_id); + local_name = btf__name_by_offset(local_btf, local_type->name_off); + if (!local_name) + return -EINVAL; + + err = bpf_core_parse_spec(prog_name, local_btf, relo, local_spec); + if (err) { + const char *spec_str; + + spec_str = btf__name_by_offset(local_btf, relo->access_str_off); + pr_warn("prog '%s': relo #%d: parsing [%d] %s %s + %s failed: %d\n", + prog_name, relo_idx, local_id, btf_kind_str(local_type), + str_is_empty(local_name) ? "" : local_name, + spec_str ?: "", err); + return -EINVAL; + } + + bpf_core_format_spec(spec_buf, sizeof(spec_buf), local_spec); + pr_debug("prog '%s': relo #%d: %s\n", prog_name, relo_idx, spec_buf); + + /* TYPE_ID_LOCAL relo is special and doesn't need candidate search */ + if (relo->kind == BPF_CORE_TYPE_ID_LOCAL) { + /* bpf_insn's imm value could get out of sync during linking */ + memset(targ_res, 0, sizeof(*targ_res)); + targ_res->validate = false; + targ_res->poison = false; + targ_res->orig_val = local_spec->root_type_id; + targ_res->new_val = local_spec->root_type_id; + return 0; + } + + /* libbpf doesn't support candidate search for anonymous types */ + if (str_is_empty(local_name)) { + pr_warn("prog '%s': relo #%d: <%s> (%d) relocation doesn't support anonymous types\n", + prog_name, relo_idx, core_relo_kind_str(relo->kind), relo->kind); + return -EOPNOTSUPP; + } + + for (i = 0, j = 0; i < cands->len; i++) { + err = bpf_core_spec_match(local_spec, cands->cands[i].btf, + cands->cands[i].id, cand_spec); + if (err < 0) { + bpf_core_format_spec(spec_buf, sizeof(spec_buf), cand_spec); + pr_warn("prog '%s': relo #%d: error matching candidate #%d %s: %d\n ", + prog_name, relo_idx, i, spec_buf, err); + return err; + } + + bpf_core_format_spec(spec_buf, sizeof(spec_buf), cand_spec); + pr_debug("prog '%s': relo #%d: %s candidate #%d %s\n", prog_name, + relo_idx, err == 0 ? "non-matching" : "matching", i, spec_buf); + + if (err == 0) + continue; + + err = bpf_core_calc_relo(prog_name, relo, relo_idx, local_spec, cand_spec, &cand_res); + if (err) + return err; + + if (j == 0) { + *targ_res = cand_res; + *targ_spec = *cand_spec; + } else if (cand_spec->bit_offset != targ_spec->bit_offset) { + /* if there are many field relo candidates, they + * should all resolve to the same bit offset + */ + pr_warn("prog '%s': relo #%d: field offset ambiguity: %u != %u\n", + prog_name, relo_idx, cand_spec->bit_offset, + targ_spec->bit_offset); + return -EINVAL; + } else if (cand_res.poison != targ_res->poison || + cand_res.new_val != targ_res->new_val) { + /* all candidates should result in the same relocation + * decision and value, otherwise it's dangerous to + * proceed due to ambiguity + */ + pr_warn("prog '%s': relo #%d: relocation decision ambiguity: %s %llu != %s %llu\n", + prog_name, relo_idx, + cand_res.poison ? "failure" : "success", + (unsigned long long)cand_res.new_val, + targ_res->poison ? "failure" : "success", + (unsigned long long)targ_res->new_val); + return -EINVAL; + } + + cands->cands[j++] = cands->cands[i]; + } + + /* + * For BPF_CORE_FIELD_EXISTS relo or when used BPF program has field + * existence checks or kernel version/config checks, it's expected + * that we might not find any candidates. In this case, if field + * wasn't found in any candidate, the list of candidates shouldn't + * change at all, we'll just handle relocating appropriately, + * depending on relo's kind. + */ + if (j > 0) + cands->len = j; + + /* + * If no candidates were found, it might be both a programmer error, + * as well as expected case, depending whether instruction w/ + * relocation is guarded in some way that makes it unreachable (dead + * code) if relocation can't be resolved. This is handled in + * bpf_core_patch_insn() uniformly by replacing that instruction with + * BPF helper call insn (using invalid helper ID). If that instruction + * is indeed unreachable, then it will be ignored and eliminated by + * verifier. If it was an error, then verifier will complain and point + * to a specific instruction number in its log. + */ + if (j == 0) { + pr_debug("prog '%s': relo #%d: no matching targets found\n", + prog_name, relo_idx); + + /* calculate single target relo result explicitly */ + err = bpf_core_calc_relo(prog_name, relo, relo_idx, local_spec, NULL, targ_res); + if (err) + return err; + } + + return 0; +} + +static bool bpf_core_names_match(const struct btf *local_btf, size_t local_name_off, + const struct btf *targ_btf, size_t targ_name_off) +{ + const char *local_n, *targ_n; + size_t local_len, targ_len; + + local_n = btf__name_by_offset(local_btf, local_name_off); + targ_n = btf__name_by_offset(targ_btf, targ_name_off); + + if (str_is_empty(targ_n)) + return str_is_empty(local_n); + + targ_len = bpf_core_essential_name_len(targ_n); + local_len = bpf_core_essential_name_len(local_n); + + return targ_len == local_len && strncmp(local_n, targ_n, local_len) == 0; +} + +static int bpf_core_enums_match(const struct btf *local_btf, const struct btf_type *local_t, + const struct btf *targ_btf, const struct btf_type *targ_t) +{ + __u16 local_vlen = btf_vlen(local_t); + __u16 targ_vlen = btf_vlen(targ_t); + int i, j; + + if (local_t->size != targ_t->size) + return 0; + + if (local_vlen > targ_vlen) + return 0; + + /* iterate over the local enum's variants and make sure each has + * a symbolic name correspondent in the target + */ + for (i = 0; i < local_vlen; i++) { + bool matched = false; + __u32 local_n_off, targ_n_off; + + local_n_off = btf_is_enum(local_t) ? btf_enum(local_t)[i].name_off : + btf_enum64(local_t)[i].name_off; + + for (j = 0; j < targ_vlen; j++) { + targ_n_off = btf_is_enum(targ_t) ? btf_enum(targ_t)[j].name_off : + btf_enum64(targ_t)[j].name_off; + + if (bpf_core_names_match(local_btf, local_n_off, targ_btf, targ_n_off)) { + matched = true; + break; + } + } + + if (!matched) + return 0; + } + return 1; +} + +static int bpf_core_composites_match(const struct btf *local_btf, const struct btf_type *local_t, + const struct btf *targ_btf, const struct btf_type *targ_t, + bool behind_ptr, int level) +{ + const struct btf_member *local_m = btf_members(local_t); + __u16 local_vlen = btf_vlen(local_t); + __u16 targ_vlen = btf_vlen(targ_t); + int i, j, err; + + if (local_vlen > targ_vlen) + return 0; + + /* check that all local members have a match in the target */ + for (i = 0; i < local_vlen; i++, local_m++) { + const struct btf_member *targ_m = btf_members(targ_t); + bool matched = false; + + for (j = 0; j < targ_vlen; j++, targ_m++) { + if (!bpf_core_names_match(local_btf, local_m->name_off, + targ_btf, targ_m->name_off)) + continue; + + err = __bpf_core_types_match(local_btf, local_m->type, targ_btf, + targ_m->type, behind_ptr, level - 1); + if (err < 0) + return err; + if (err > 0) { + matched = true; + break; + } + } + + if (!matched) + return 0; + } + return 1; +} + +/* Check that two types "match". This function assumes that root types were + * already checked for name match. + * + * The matching relation is defined as follows: + * - modifiers and typedefs are stripped (and, hence, effectively ignored) + * - generally speaking types need to be of same kind (struct vs. struct, union + * vs. union, etc.) + * - exceptions are struct/union behind a pointer which could also match a + * forward declaration of a struct or union, respectively, and enum vs. + * enum64 (see below) + * Then, depending on type: + * - integers: + * - match if size and signedness match + * - arrays & pointers: + * - target types are recursively matched + * - structs & unions: + * - local members need to exist in target with the same name + * - for each member we recursively check match unless it is already behind a + * pointer, in which case we only check matching names and compatible kind + * - enums: + * - local variants have to have a match in target by symbolic name (but not + * numeric value) + * - size has to match (but enum may match enum64 and vice versa) + * - function pointers: + * - number and position of arguments in local type has to match target + * - for each argument and the return value we recursively check match + */ +int __bpf_core_types_match(const struct btf *local_btf, __u32 local_id, const struct btf *targ_btf, + __u32 targ_id, bool behind_ptr, int level) +{ + const struct btf_type *local_t, *targ_t; + int depth = 32; /* max recursion depth */ + __u16 local_k, targ_k; + + if (level <= 0) + return -EINVAL; + +recur: + depth--; + if (depth < 0) + return -EINVAL; + + local_t = skip_mods_and_typedefs(local_btf, local_id, &local_id); + targ_t = skip_mods_and_typedefs(targ_btf, targ_id, &targ_id); + if (!local_t || !targ_t) + return -EINVAL; + + /* While the name check happens after typedefs are skipped, root-level + * typedefs would still be name-matched as that's the contract with + * callers. + */ + if (!bpf_core_names_match(local_btf, local_t->name_off, targ_btf, targ_t->name_off)) + return 0; + + local_k = btf_kind(local_t); + targ_k = btf_kind(targ_t); + + switch (local_k) { + case BTF_KIND_UNKN: + return local_k == targ_k; + case BTF_KIND_FWD: { + bool local_f = BTF_INFO_KFLAG(local_t->info); + + if (behind_ptr) { + if (local_k == targ_k) + return local_f == BTF_INFO_KFLAG(targ_t->info); + + /* for forward declarations kflag dictates whether the + * target is a struct (0) or union (1) + */ + return (targ_k == BTF_KIND_STRUCT && !local_f) || + (targ_k == BTF_KIND_UNION && local_f); + } else { + if (local_k != targ_k) + return 0; + + /* match if the forward declaration is for the same kind */ + return local_f == BTF_INFO_KFLAG(targ_t->info); + } + } + case BTF_KIND_ENUM: + case BTF_KIND_ENUM64: + if (!btf_is_any_enum(targ_t)) + return 0; + + return bpf_core_enums_match(local_btf, local_t, targ_btf, targ_t); + case BTF_KIND_STRUCT: + case BTF_KIND_UNION: + if (behind_ptr) { + bool targ_f = BTF_INFO_KFLAG(targ_t->info); + + if (local_k == targ_k) + return 1; + + if (targ_k != BTF_KIND_FWD) + return 0; + + return (local_k == BTF_KIND_UNION) == targ_f; + } else { + if (local_k != targ_k) + return 0; + + return bpf_core_composites_match(local_btf, local_t, targ_btf, targ_t, + behind_ptr, level); + } + case BTF_KIND_INT: { + __u8 local_sgn; + __u8 targ_sgn; + + if (local_k != targ_k) + return 0; + + local_sgn = btf_int_encoding(local_t) & BTF_INT_SIGNED; + targ_sgn = btf_int_encoding(targ_t) & BTF_INT_SIGNED; + + return local_t->size == targ_t->size && local_sgn == targ_sgn; + } + case BTF_KIND_PTR: + if (local_k != targ_k) + return 0; + + behind_ptr = true; + + local_id = local_t->type; + targ_id = targ_t->type; + goto recur; + case BTF_KIND_ARRAY: { + const struct btf_array *local_array = btf_array(local_t); + const struct btf_array *targ_array = btf_array(targ_t); + + if (local_k != targ_k) + return 0; + + if (local_array->nelems != targ_array->nelems) + return 0; + + local_id = local_array->type; + targ_id = targ_array->type; + goto recur; + } + case BTF_KIND_FUNC_PROTO: { + struct btf_param *local_p = btf_params(local_t); + struct btf_param *targ_p = btf_params(targ_t); + __u16 local_vlen = btf_vlen(local_t); + __u16 targ_vlen = btf_vlen(targ_t); + int i, err; + + if (local_k != targ_k) + return 0; + + if (local_vlen != targ_vlen) + return 0; + + for (i = 0; i < local_vlen; i++, local_p++, targ_p++) { + err = __bpf_core_types_match(local_btf, local_p->type, targ_btf, + targ_p->type, behind_ptr, level - 1); + if (err <= 0) + return err; + } + + /* tail recurse for return type check */ + local_id = local_t->type; + targ_id = targ_t->type; + goto recur; + } + default: + pr_warn("unexpected kind %s relocated, local [%d], target [%d]\n", + btf_kind_str(local_t), local_id, targ_id); + return 0; + } +} diff --git a/libbpf/src/relo_core.h b/libbpf/src/relo_core.h new file mode 100644 index 0000000..1c0566d --- /dev/null +++ b/libbpf/src/relo_core.h @@ -0,0 +1,99 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2019 Facebook */ + +#ifndef __RELO_CORE_H +#define __RELO_CORE_H + +#include + +struct bpf_core_cand { + const struct btf *btf; + __u32 id; +}; + +/* dynamically sized list of type IDs and its associated struct btf */ +struct bpf_core_cand_list { + struct bpf_core_cand *cands; + int len; +}; + +#define BPF_CORE_SPEC_MAX_LEN 64 + +/* represents BPF CO-RE field or array element accessor */ +struct bpf_core_accessor { + __u32 type_id; /* struct/union type or array element type */ + __u32 idx; /* field index or array index */ + const char *name; /* field name or NULL for array accessor */ +}; + +struct bpf_core_spec { + const struct btf *btf; + /* high-level spec: named fields and array indices only */ + struct bpf_core_accessor spec[BPF_CORE_SPEC_MAX_LEN]; + /* original unresolved (no skip_mods_or_typedefs) root type ID */ + __u32 root_type_id; + /* CO-RE relocation kind */ + enum bpf_core_relo_kind relo_kind; + /* high-level spec length */ + int len; + /* raw, low-level spec: 1-to-1 with accessor spec string */ + int raw_spec[BPF_CORE_SPEC_MAX_LEN]; + /* raw spec length */ + int raw_len; + /* field bit offset represented by spec */ + __u32 bit_offset; +}; + +struct bpf_core_relo_res { + /* expected value in the instruction, unless validate == false */ + __u64 orig_val; + /* new value that needs to be patched up to */ + __u64 new_val; + /* relocation unsuccessful, poison instruction, but don't fail load */ + bool poison; + /* some relocations can't be validated against orig_val */ + bool validate; + /* for field byte offset relocations or the forms: + * *(T *)(rX + ) = rY + * rX = *(T *)(rY + ), + * we remember original and resolved field size to adjust direct + * memory loads of pointers and integers; this is necessary for 32-bit + * host kernel architectures, but also allows to automatically + * relocate fields that were resized from, e.g., u32 to u64, etc. + */ + bool fail_memsz_adjust; + __u32 orig_sz; + __u32 orig_type_id; + __u32 new_sz; + __u32 new_type_id; +}; + +int __bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id, int level); +int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, + const struct btf *targ_btf, __u32 targ_id); +int __bpf_core_types_match(const struct btf *local_btf, __u32 local_id, const struct btf *targ_btf, + __u32 targ_id, bool behind_ptr, int level); +int bpf_core_types_match(const struct btf *local_btf, __u32 local_id, const struct btf *targ_btf, + __u32 targ_id); + +size_t bpf_core_essential_name_len(const char *name); + +int bpf_core_calc_relo_insn(const char *prog_name, + const struct bpf_core_relo *relo, int relo_idx, + const struct btf *local_btf, + struct bpf_core_cand_list *cands, + struct bpf_core_spec *specs_scratch, + struct bpf_core_relo_res *targ_res); + +int bpf_core_patch_insn(const char *prog_name, struct bpf_insn *insn, + int insn_idx, const struct bpf_core_relo *relo, + int relo_idx, const struct bpf_core_relo_res *res); + +int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, + const struct bpf_core_relo *relo, + struct bpf_core_spec *spec); + +int bpf_core_format_spec(char *buf, size_t buf_sz, const struct bpf_core_spec *spec); + +#endif diff --git a/libbpf/src/ringbuf.c b/libbpf/src/ringbuf.c new file mode 100644 index 0000000..0219936 --- /dev/null +++ b/libbpf/src/ringbuf.c @@ -0,0 +1,587 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* + * Ring buffer operations. + * + * Copyright (C) 2020 Facebook, Inc. + */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libbpf.h" +#include "libbpf_internal.h" +#include "bpf.h" + +struct ring { + ring_buffer_sample_fn sample_cb; + void *ctx; + void *data; + unsigned long *consumer_pos; + unsigned long *producer_pos; + unsigned long mask; + int map_fd; +}; + +struct ring_buffer { + struct epoll_event *events; + struct ring *rings; + size_t page_size; + int epoll_fd; + int ring_cnt; +}; + +struct user_ring_buffer { + struct epoll_event event; + unsigned long *consumer_pos; + unsigned long *producer_pos; + void *data; + unsigned long mask; + size_t page_size; + int map_fd; + int epoll_fd; +}; + +/* 8-byte ring buffer header structure */ +struct ringbuf_hdr { + __u32 len; + __u32 pad; +}; + +static void ringbuf_unmap_ring(struct ring_buffer *rb, struct ring *r) +{ + if (r->consumer_pos) { + munmap(r->consumer_pos, rb->page_size); + r->consumer_pos = NULL; + } + if (r->producer_pos) { + munmap(r->producer_pos, rb->page_size + 2 * (r->mask + 1)); + r->producer_pos = NULL; + } +} + +/* Add extra RINGBUF maps to this ring buffer manager */ +int ring_buffer__add(struct ring_buffer *rb, int map_fd, + ring_buffer_sample_fn sample_cb, void *ctx) +{ + struct bpf_map_info info; + __u32 len = sizeof(info); + struct epoll_event *e; + struct ring *r; + __u64 mmap_sz; + void *tmp; + int err; + + memset(&info, 0, sizeof(info)); + + err = bpf_map_get_info_by_fd(map_fd, &info, &len); + if (err) { + err = -errno; + pr_warn("ringbuf: failed to get map info for fd=%d: %d\n", + map_fd, err); + return libbpf_err(err); + } + + if (info.type != BPF_MAP_TYPE_RINGBUF) { + pr_warn("ringbuf: map fd=%d is not BPF_MAP_TYPE_RINGBUF\n", + map_fd); + return libbpf_err(-EINVAL); + } + + tmp = libbpf_reallocarray(rb->rings, rb->ring_cnt + 1, sizeof(*rb->rings)); + if (!tmp) + return libbpf_err(-ENOMEM); + rb->rings = tmp; + + tmp = libbpf_reallocarray(rb->events, rb->ring_cnt + 1, sizeof(*rb->events)); + if (!tmp) + return libbpf_err(-ENOMEM); + rb->events = tmp; + + r = &rb->rings[rb->ring_cnt]; + memset(r, 0, sizeof(*r)); + + r->map_fd = map_fd; + r->sample_cb = sample_cb; + r->ctx = ctx; + r->mask = info.max_entries - 1; + + /* Map writable consumer page */ + tmp = mmap(NULL, rb->page_size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); + if (tmp == MAP_FAILED) { + err = -errno; + pr_warn("ringbuf: failed to mmap consumer page for map fd=%d: %d\n", + map_fd, err); + return libbpf_err(err); + } + r->consumer_pos = tmp; + + /* Map read-only producer page and data pages. We map twice as big + * data size to allow simple reading of samples that wrap around the + * end of a ring buffer. See kernel implementation for details. + */ + mmap_sz = rb->page_size + 2 * (__u64)info.max_entries; + if (mmap_sz != (__u64)(size_t)mmap_sz) { + pr_warn("ringbuf: ring buffer size (%u) is too big\n", info.max_entries); + return libbpf_err(-E2BIG); + } + tmp = mmap(NULL, (size_t)mmap_sz, PROT_READ, MAP_SHARED, map_fd, rb->page_size); + if (tmp == MAP_FAILED) { + err = -errno; + ringbuf_unmap_ring(rb, r); + pr_warn("ringbuf: failed to mmap data pages for map fd=%d: %d\n", + map_fd, err); + return libbpf_err(err); + } + r->producer_pos = tmp; + r->data = tmp + rb->page_size; + + e = &rb->events[rb->ring_cnt]; + memset(e, 0, sizeof(*e)); + + e->events = EPOLLIN; + e->data.fd = rb->ring_cnt; + if (epoll_ctl(rb->epoll_fd, EPOLL_CTL_ADD, map_fd, e) < 0) { + err = -errno; + ringbuf_unmap_ring(rb, r); + pr_warn("ringbuf: failed to epoll add map fd=%d: %d\n", + map_fd, err); + return libbpf_err(err); + } + + rb->ring_cnt++; + return 0; +} + +void ring_buffer__free(struct ring_buffer *rb) +{ + int i; + + if (!rb) + return; + + for (i = 0; i < rb->ring_cnt; ++i) + ringbuf_unmap_ring(rb, &rb->rings[i]); + if (rb->epoll_fd >= 0) + close(rb->epoll_fd); + + free(rb->events); + free(rb->rings); + free(rb); +} + +struct ring_buffer * +ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx, + const struct ring_buffer_opts *opts) +{ + struct ring_buffer *rb; + int err; + + if (!OPTS_VALID(opts, ring_buffer_opts)) + return errno = EINVAL, NULL; + + rb = calloc(1, sizeof(*rb)); + if (!rb) + return errno = ENOMEM, NULL; + + rb->page_size = getpagesize(); + + rb->epoll_fd = epoll_create1(EPOLL_CLOEXEC); + if (rb->epoll_fd < 0) { + err = -errno; + pr_warn("ringbuf: failed to create epoll instance: %d\n", err); + goto err_out; + } + + err = ring_buffer__add(rb, map_fd, sample_cb, ctx); + if (err) + goto err_out; + + return rb; + +err_out: + ring_buffer__free(rb); + return errno = -err, NULL; +} + +static inline int roundup_len(__u32 len) +{ + /* clear out top 2 bits (discard and busy, if set) */ + len <<= 2; + len >>= 2; + /* add length prefix */ + len += BPF_RINGBUF_HDR_SZ; + /* round up to 8 byte alignment */ + return (len + 7) / 8 * 8; +} + +static int64_t ringbuf_process_ring(struct ring *r) +{ + int *len_ptr, len, err; + /* 64-bit to avoid overflow in case of extreme application behavior */ + int64_t cnt = 0; + unsigned long cons_pos, prod_pos; + bool got_new_data; + void *sample; + + cons_pos = smp_load_acquire(r->consumer_pos); + do { + got_new_data = false; + prod_pos = smp_load_acquire(r->producer_pos); + while (cons_pos < prod_pos) { + len_ptr = r->data + (cons_pos & r->mask); + len = smp_load_acquire(len_ptr); + + /* sample not committed yet, bail out for now */ + if (len & BPF_RINGBUF_BUSY_BIT) + goto done; + + got_new_data = true; + cons_pos += roundup_len(len); + + if ((len & BPF_RINGBUF_DISCARD_BIT) == 0) { + sample = (void *)len_ptr + BPF_RINGBUF_HDR_SZ; + err = r->sample_cb(r->ctx, sample, len); + if (err < 0) { + /* update consumer pos and bail out */ + smp_store_release(r->consumer_pos, + cons_pos); + return err; + } + cnt++; + } + + smp_store_release(r->consumer_pos, cons_pos); + } + } while (got_new_data); +done: + return cnt; +} + +/* Consume available ring buffer(s) data without event polling. + * Returns number of records consumed across all registered ring buffers (or + * INT_MAX, whichever is less), or negative number if any of the callbacks + * return error. + */ +int ring_buffer__consume(struct ring_buffer *rb) +{ + int64_t err, res = 0; + int i; + + for (i = 0; i < rb->ring_cnt; i++) { + struct ring *ring = &rb->rings[i]; + + err = ringbuf_process_ring(ring); + if (err < 0) + return libbpf_err(err); + res += err; + } + if (res > INT_MAX) + return INT_MAX; + return res; +} + +/* Poll for available data and consume records, if any are available. + * Returns number of records consumed (or INT_MAX, whichever is less), or + * negative number, if any of the registered callbacks returned error. + */ +int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms) +{ + int i, cnt; + int64_t err, res = 0; + + cnt = epoll_wait(rb->epoll_fd, rb->events, rb->ring_cnt, timeout_ms); + if (cnt < 0) + return libbpf_err(-errno); + + for (i = 0; i < cnt; i++) { + __u32 ring_id = rb->events[i].data.fd; + struct ring *ring = &rb->rings[ring_id]; + + err = ringbuf_process_ring(ring); + if (err < 0) + return libbpf_err(err); + res += err; + } + if (res > INT_MAX) + return INT_MAX; + return res; +} + +/* Get an fd that can be used to sleep until data is available in the ring(s) */ +int ring_buffer__epoll_fd(const struct ring_buffer *rb) +{ + return rb->epoll_fd; +} + +static void user_ringbuf_unmap_ring(struct user_ring_buffer *rb) +{ + if (rb->consumer_pos) { + munmap(rb->consumer_pos, rb->page_size); + rb->consumer_pos = NULL; + } + if (rb->producer_pos) { + munmap(rb->producer_pos, rb->page_size + 2 * (rb->mask + 1)); + rb->producer_pos = NULL; + } +} + +void user_ring_buffer__free(struct user_ring_buffer *rb) +{ + if (!rb) + return; + + user_ringbuf_unmap_ring(rb); + + if (rb->epoll_fd >= 0) + close(rb->epoll_fd); + + free(rb); +} + +static int user_ringbuf_map(struct user_ring_buffer *rb, int map_fd) +{ + struct bpf_map_info info; + __u32 len = sizeof(info); + __u64 mmap_sz; + void *tmp; + struct epoll_event *rb_epoll; + int err; + + memset(&info, 0, sizeof(info)); + + err = bpf_map_get_info_by_fd(map_fd, &info, &len); + if (err) { + err = -errno; + pr_warn("user ringbuf: failed to get map info for fd=%d: %d\n", map_fd, err); + return err; + } + + if (info.type != BPF_MAP_TYPE_USER_RINGBUF) { + pr_warn("user ringbuf: map fd=%d is not BPF_MAP_TYPE_USER_RINGBUF\n", map_fd); + return -EINVAL; + } + + rb->map_fd = map_fd; + rb->mask = info.max_entries - 1; + + /* Map read-only consumer page */ + tmp = mmap(NULL, rb->page_size, PROT_READ, MAP_SHARED, map_fd, 0); + if (tmp == MAP_FAILED) { + err = -errno; + pr_warn("user ringbuf: failed to mmap consumer page for map fd=%d: %d\n", + map_fd, err); + return err; + } + rb->consumer_pos = tmp; + + /* Map read-write the producer page and data pages. We map the data + * region as twice the total size of the ring buffer to allow the + * simple reading and writing of samples that wrap around the end of + * the buffer. See the kernel implementation for details. + */ + mmap_sz = rb->page_size + 2 * (__u64)info.max_entries; + if (mmap_sz != (__u64)(size_t)mmap_sz) { + pr_warn("user ringbuf: ring buf size (%u) is too big\n", info.max_entries); + return -E2BIG; + } + tmp = mmap(NULL, (size_t)mmap_sz, PROT_READ | PROT_WRITE, MAP_SHARED, + map_fd, rb->page_size); + if (tmp == MAP_FAILED) { + err = -errno; + pr_warn("user ringbuf: failed to mmap data pages for map fd=%d: %d\n", + map_fd, err); + return err; + } + + rb->producer_pos = tmp; + rb->data = tmp + rb->page_size; + + rb_epoll = &rb->event; + rb_epoll->events = EPOLLOUT; + if (epoll_ctl(rb->epoll_fd, EPOLL_CTL_ADD, map_fd, rb_epoll) < 0) { + err = -errno; + pr_warn("user ringbuf: failed to epoll add map fd=%d: %d\n", map_fd, err); + return err; + } + + return 0; +} + +struct user_ring_buffer * +user_ring_buffer__new(int map_fd, const struct user_ring_buffer_opts *opts) +{ + struct user_ring_buffer *rb; + int err; + + if (!OPTS_VALID(opts, user_ring_buffer_opts)) + return errno = EINVAL, NULL; + + rb = calloc(1, sizeof(*rb)); + if (!rb) + return errno = ENOMEM, NULL; + + rb->page_size = getpagesize(); + + rb->epoll_fd = epoll_create1(EPOLL_CLOEXEC); + if (rb->epoll_fd < 0) { + err = -errno; + pr_warn("user ringbuf: failed to create epoll instance: %d\n", err); + goto err_out; + } + + err = user_ringbuf_map(rb, map_fd); + if (err) + goto err_out; + + return rb; + +err_out: + user_ring_buffer__free(rb); + return errno = -err, NULL; +} + +static void user_ringbuf_commit(struct user_ring_buffer *rb, void *sample, bool discard) +{ + __u32 new_len; + struct ringbuf_hdr *hdr; + uintptr_t hdr_offset; + + hdr_offset = rb->mask + 1 + (sample - rb->data) - BPF_RINGBUF_HDR_SZ; + hdr = rb->data + (hdr_offset & rb->mask); + + new_len = hdr->len & ~BPF_RINGBUF_BUSY_BIT; + if (discard) + new_len |= BPF_RINGBUF_DISCARD_BIT; + + /* Synchronizes with smp_load_acquire() in __bpf_user_ringbuf_peek() in + * the kernel. + */ + __atomic_exchange_n(&hdr->len, new_len, __ATOMIC_ACQ_REL); +} + +void user_ring_buffer__discard(struct user_ring_buffer *rb, void *sample) +{ + user_ringbuf_commit(rb, sample, true); +} + +void user_ring_buffer__submit(struct user_ring_buffer *rb, void *sample) +{ + user_ringbuf_commit(rb, sample, false); +} + +void *user_ring_buffer__reserve(struct user_ring_buffer *rb, __u32 size) +{ + __u32 avail_size, total_size, max_size; + /* 64-bit to avoid overflow in case of extreme application behavior */ + __u64 cons_pos, prod_pos; + struct ringbuf_hdr *hdr; + + /* The top two bits are used as special flags */ + if (size & (BPF_RINGBUF_BUSY_BIT | BPF_RINGBUF_DISCARD_BIT)) + return errno = E2BIG, NULL; + + /* Synchronizes with smp_store_release() in __bpf_user_ringbuf_peek() in + * the kernel. + */ + cons_pos = smp_load_acquire(rb->consumer_pos); + /* Synchronizes with smp_store_release() in user_ringbuf_commit() */ + prod_pos = smp_load_acquire(rb->producer_pos); + + max_size = rb->mask + 1; + avail_size = max_size - (prod_pos - cons_pos); + /* Round up total size to a multiple of 8. */ + total_size = (size + BPF_RINGBUF_HDR_SZ + 7) / 8 * 8; + + if (total_size > max_size) + return errno = E2BIG, NULL; + + if (avail_size < total_size) + return errno = ENOSPC, NULL; + + hdr = rb->data + (prod_pos & rb->mask); + hdr->len = size | BPF_RINGBUF_BUSY_BIT; + hdr->pad = 0; + + /* Synchronizes with smp_load_acquire() in __bpf_user_ringbuf_peek() in + * the kernel. + */ + smp_store_release(rb->producer_pos, prod_pos + total_size); + + return (void *)rb->data + ((prod_pos + BPF_RINGBUF_HDR_SZ) & rb->mask); +} + +static __u64 ns_elapsed_timespec(const struct timespec *start, const struct timespec *end) +{ + __u64 start_ns, end_ns, ns_per_s = 1000000000; + + start_ns = (__u64)start->tv_sec * ns_per_s + start->tv_nsec; + end_ns = (__u64)end->tv_sec * ns_per_s + end->tv_nsec; + + return end_ns - start_ns; +} + +void *user_ring_buffer__reserve_blocking(struct user_ring_buffer *rb, __u32 size, int timeout_ms) +{ + void *sample; + int err, ms_remaining = timeout_ms; + struct timespec start; + + if (timeout_ms < 0 && timeout_ms != -1) + return errno = EINVAL, NULL; + + if (timeout_ms != -1) { + err = clock_gettime(CLOCK_MONOTONIC, &start); + if (err) + return NULL; + } + + do { + int cnt, ms_elapsed; + struct timespec curr; + __u64 ns_per_ms = 1000000; + + sample = user_ring_buffer__reserve(rb, size); + if (sample) + return sample; + else if (errno != ENOSPC) + return NULL; + + /* The kernel guarantees at least one event notification + * delivery whenever at least one sample is drained from the + * ring buffer in an invocation to bpf_ringbuf_drain(). Other + * additional events may be delivered at any time, but only one + * event is guaranteed per bpf_ringbuf_drain() invocation, + * provided that a sample is drained, and the BPF program did + * not pass BPF_RB_NO_WAKEUP to bpf_ringbuf_drain(). If + * BPF_RB_FORCE_WAKEUP is passed to bpf_ringbuf_drain(), a + * wakeup event will be delivered even if no samples are + * drained. + */ + cnt = epoll_wait(rb->epoll_fd, &rb->event, 1, ms_remaining); + if (cnt < 0) + return NULL; + + if (timeout_ms == -1) + continue; + + err = clock_gettime(CLOCK_MONOTONIC, &curr); + if (err) + return NULL; + + ms_elapsed = ns_elapsed_timespec(&start, &curr) / ns_per_ms; + ms_remaining = timeout_ms - ms_elapsed; + } while (ms_remaining > 0); + + /* Try one more time to reserve a sample after the specified timeout has elapsed. */ + return user_ring_buffer__reserve(rb, size); +} diff --git a/libbpf/src/skel_internal.h b/libbpf/src/skel_internal.h new file mode 100644 index 0000000..1e82ab0 --- /dev/null +++ b/libbpf/src/skel_internal.h @@ -0,0 +1,374 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2021 Facebook */ +#ifndef __SKEL_INTERNAL_H +#define __SKEL_INTERNAL_H + +#ifdef __KERNEL__ +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include "bpf.h" +#endif + +#ifndef __NR_bpf +# if defined(__mips__) && defined(_ABIO32) +# define __NR_bpf 4355 +# elif defined(__mips__) && defined(_ABIN32) +# define __NR_bpf 6319 +# elif defined(__mips__) && defined(_ABI64) +# define __NR_bpf 5315 +# endif +#endif + +/* This file is a base header for auto-generated *.lskel.h files. + * Its contents will change and may become part of auto-generation in the future. + * + * The layout of bpf_[map|prog]_desc and bpf_loader_ctx is feature dependent + * and will change from one version of libbpf to another and features + * requested during loader program generation. + */ +struct bpf_map_desc { + /* output of the loader prog */ + int map_fd; + /* input for the loader prog */ + __u32 max_entries; + __aligned_u64 initial_value; +}; +struct bpf_prog_desc { + int prog_fd; +}; + +enum { + BPF_SKEL_KERNEL = (1ULL << 0), +}; + +struct bpf_loader_ctx { + __u32 sz; + __u32 flags; + __u32 log_level; + __u32 log_size; + __u64 log_buf; +}; + +struct bpf_load_and_run_opts { + struct bpf_loader_ctx *ctx; + const void *data; + const void *insns; + __u32 data_sz; + __u32 insns_sz; + const char *errstr; +}; + +long kern_sys_bpf(__u32 cmd, void *attr, __u32 attr_size); + +static inline int skel_sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, + unsigned int size) +{ +#ifdef __KERNEL__ + return kern_sys_bpf(cmd, attr, size); +#else + return syscall(__NR_bpf, cmd, attr, size); +#endif +} + +#ifdef __KERNEL__ +static inline int close(int fd) +{ + return close_fd(fd); +} + +static inline void *skel_alloc(size_t size) +{ + struct bpf_loader_ctx *ctx = kzalloc(size, GFP_KERNEL); + + if (!ctx) + return NULL; + ctx->flags |= BPF_SKEL_KERNEL; + return ctx; +} + +static inline void skel_free(const void *p) +{ + kfree(p); +} + +/* skel->bss/rodata maps are populated the following way: + * + * For kernel use: + * skel_prep_map_data() allocates kernel memory that kernel module can directly access. + * Generated lskel stores the pointer in skel->rodata and in skel->maps.rodata.initial_value. + * The loader program will perform probe_read_kernel() from maps.rodata.initial_value. + * skel_finalize_map_data() sets skel->rodata to point to actual value in a bpf map and + * does maps.rodata.initial_value = ~0ULL to signal skel_free_map_data() that kvfree + * is not nessary. + * + * For user space: + * skel_prep_map_data() mmaps anon memory into skel->rodata that can be accessed directly. + * Generated lskel stores the pointer in skel->rodata and in skel->maps.rodata.initial_value. + * The loader program will perform copy_from_user() from maps.rodata.initial_value. + * skel_finalize_map_data() remaps bpf array map value from the kernel memory into + * skel->rodata address. + * + * The "bpftool gen skeleton -L" command generates lskel.h that is suitable for + * both kernel and user space. The generated loader program does + * either bpf_probe_read_kernel() or bpf_copy_from_user() from initial_value + * depending on bpf_loader_ctx->flags. + */ +static inline void skel_free_map_data(void *p, __u64 addr, size_t sz) +{ + if (addr != ~0ULL) + kvfree(p); + /* When addr == ~0ULL the 'p' points to + * ((struct bpf_array *)map)->value. See skel_finalize_map_data. + */ +} + +static inline void *skel_prep_map_data(const void *val, size_t mmap_sz, size_t val_sz) +{ + void *addr; + + addr = kvmalloc(val_sz, GFP_KERNEL); + if (!addr) + return NULL; + memcpy(addr, val, val_sz); + return addr; +} + +static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int flags, int fd) +{ + struct bpf_map *map; + void *addr = NULL; + + kvfree((void *) (long) *init_val); + *init_val = ~0ULL; + + /* At this point bpf_load_and_run() finished without error and + * 'fd' is a valid bpf map FD. All sanity checks below should succeed. + */ + map = bpf_map_get(fd); + if (IS_ERR(map)) + return NULL; + if (map->map_type != BPF_MAP_TYPE_ARRAY) + goto out; + addr = ((struct bpf_array *)map)->value; + /* the addr stays valid, since FD is not closed */ +out: + bpf_map_put(map); + return addr; +} + +#else + +static inline void *skel_alloc(size_t size) +{ + return calloc(1, size); +} + +static inline void skel_free(void *p) +{ + free(p); +} + +static inline void skel_free_map_data(void *p, __u64 addr, size_t sz) +{ + munmap(p, sz); +} + +static inline void *skel_prep_map_data(const void *val, size_t mmap_sz, size_t val_sz) +{ + void *addr; + + addr = mmap(NULL, mmap_sz, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (addr == (void *) -1) + return NULL; + memcpy(addr, val, val_sz); + return addr; +} + +static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int flags, int fd) +{ + void *addr; + + addr = mmap((void *) (long) *init_val, mmap_sz, flags, MAP_SHARED | MAP_FIXED, fd, 0); + if (addr == (void *) -1) + return NULL; + return addr; +} +#endif + +static inline int skel_closenz(int fd) +{ + if (fd > 0) + return close(fd); + return -EINVAL; +} + +#ifndef offsetofend +#define offsetofend(TYPE, MEMBER) \ + (offsetof(TYPE, MEMBER) + sizeof((((TYPE *)0)->MEMBER))) +#endif + +static inline int skel_map_create(enum bpf_map_type map_type, + const char *map_name, + __u32 key_size, + __u32 value_size, + __u32 max_entries) +{ + const size_t attr_sz = offsetofend(union bpf_attr, map_extra); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + + attr.map_type = map_type; + strncpy(attr.map_name, map_name, sizeof(attr.map_name)); + attr.key_size = key_size; + attr.value_size = value_size; + attr.max_entries = max_entries; + + return skel_sys_bpf(BPF_MAP_CREATE, &attr, attr_sz); +} + +static inline int skel_map_update_elem(int fd, const void *key, + const void *value, __u64 flags) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = (long) key; + attr.value = (long) value; + attr.flags = flags; + + return skel_sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, attr_sz); +} + +static inline int skel_map_delete_elem(int fd, const void *key) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.map_fd = fd; + attr.key = (long)key; + + return skel_sys_bpf(BPF_MAP_DELETE_ELEM, &attr, attr_sz); +} + +static inline int skel_map_get_fd_by_id(__u32 id) +{ + const size_t attr_sz = offsetofend(union bpf_attr, flags); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.map_id = id; + + return skel_sys_bpf(BPF_MAP_GET_FD_BY_ID, &attr, attr_sz); +} + +static inline int skel_raw_tracepoint_open(const char *name, int prog_fd) +{ + const size_t attr_sz = offsetofend(union bpf_attr, raw_tracepoint.prog_fd); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.raw_tracepoint.name = (long) name; + attr.raw_tracepoint.prog_fd = prog_fd; + + return skel_sys_bpf(BPF_RAW_TRACEPOINT_OPEN, &attr, attr_sz); +} + +static inline int skel_link_create(int prog_fd, int target_fd, + enum bpf_attach_type attach_type) +{ + const size_t attr_sz = offsetofend(union bpf_attr, link_create.iter_info_len); + union bpf_attr attr; + + memset(&attr, 0, attr_sz); + attr.link_create.prog_fd = prog_fd; + attr.link_create.target_fd = target_fd; + attr.link_create.attach_type = attach_type; + + return skel_sys_bpf(BPF_LINK_CREATE, &attr, attr_sz); +} + +#ifdef __KERNEL__ +#define set_err +#else +#define set_err err = -errno +#endif + +static inline int bpf_load_and_run(struct bpf_load_and_run_opts *opts) +{ + const size_t prog_load_attr_sz = offsetofend(union bpf_attr, fd_array); + const size_t test_run_attr_sz = offsetofend(union bpf_attr, test); + int map_fd = -1, prog_fd = -1, key = 0, err; + union bpf_attr attr; + + err = map_fd = skel_map_create(BPF_MAP_TYPE_ARRAY, "__loader.map", 4, opts->data_sz, 1); + if (map_fd < 0) { + opts->errstr = "failed to create loader map"; + set_err; + goto out; + } + + err = skel_map_update_elem(map_fd, &key, opts->data, 0); + if (err < 0) { + opts->errstr = "failed to update loader map"; + set_err; + goto out; + } + + memset(&attr, 0, prog_load_attr_sz); + attr.prog_type = BPF_PROG_TYPE_SYSCALL; + attr.insns = (long) opts->insns; + attr.insn_cnt = opts->insns_sz / sizeof(struct bpf_insn); + attr.license = (long) "Dual BSD/GPL"; + memcpy(attr.prog_name, "__loader.prog", sizeof("__loader.prog")); + attr.fd_array = (long) &map_fd; + attr.log_level = opts->ctx->log_level; + attr.log_size = opts->ctx->log_size; + attr.log_buf = opts->ctx->log_buf; + attr.prog_flags = BPF_F_SLEEPABLE; + err = prog_fd = skel_sys_bpf(BPF_PROG_LOAD, &attr, prog_load_attr_sz); + if (prog_fd < 0) { + opts->errstr = "failed to load loader prog"; + set_err; + goto out; + } + + memset(&attr, 0, test_run_attr_sz); + attr.test.prog_fd = prog_fd; + attr.test.ctx_in = (long) opts->ctx; + attr.test.ctx_size_in = opts->ctx->sz; + err = skel_sys_bpf(BPF_PROG_RUN, &attr, test_run_attr_sz); + if (err < 0 || (int)attr.test.retval < 0) { + opts->errstr = "failed to execute loader prog"; + if (err < 0) { + set_err; + } else { + err = (int)attr.test.retval; +#ifndef __KERNEL__ + errno = -err; +#endif + } + goto out; + } + err = 0; +out: + if (map_fd >= 0) + close(map_fd); + if (prog_fd >= 0) + close(prog_fd); + return err; +} + +#endif diff --git a/libbpf/src/str_error.c b/libbpf/src/str_error.c new file mode 100644 index 0000000..146da01 --- /dev/null +++ b/libbpf/src/str_error.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +#undef _GNU_SOURCE +#include +#include +#include "str_error.h" + +/* make sure libbpf doesn't use kernel-only integer typedefs */ +#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 + +/* + * Wrapper to allow for building in non-GNU systems such as Alpine Linux's musl + * libc, while checking strerror_r() return to avoid having to check this in + * all places calling it. + */ +char *libbpf_strerror_r(int err, char *dst, int len) +{ + int ret = strerror_r(err < 0 ? -err : err, dst, len); + if (ret) + snprintf(dst, len, "ERROR: strerror_r(%d)=%d", err, ret); + return dst; +} diff --git a/libbpf/src/str_error.h b/libbpf/src/str_error.h new file mode 100644 index 0000000..a139334 --- /dev/null +++ b/libbpf/src/str_error.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __LIBBPF_STR_ERROR_H +#define __LIBBPF_STR_ERROR_H + +char *libbpf_strerror_r(int err, char *dst, int len); +#endif /* __LIBBPF_STR_ERROR_H */ diff --git a/libbpf/src/strset.c b/libbpf/src/strset.c new file mode 100644 index 0000000..2464bcb --- /dev/null +++ b/libbpf/src/strset.c @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2021 Facebook */ +#include +#include +#include +#include +#include +#include "hashmap.h" +#include "libbpf_internal.h" +#include "strset.h" + +struct strset { + void *strs_data; + size_t strs_data_len; + size_t strs_data_cap; + size_t strs_data_max_len; + + /* lookup index for each unique string in strings set */ + struct hashmap *strs_hash; +}; + +static size_t strset_hash_fn(long key, void *ctx) +{ + const struct strset *s = ctx; + const char *str = s->strs_data + key; + + return str_hash(str); +} + +static bool strset_equal_fn(long key1, long key2, void *ctx) +{ + const struct strset *s = ctx; + const char *str1 = s->strs_data + key1; + const char *str2 = s->strs_data + key2; + + return strcmp(str1, str2) == 0; +} + +struct strset *strset__new(size_t max_data_sz, const char *init_data, size_t init_data_sz) +{ + struct strset *set = calloc(1, sizeof(*set)); + struct hashmap *hash; + int err = -ENOMEM; + + if (!set) + return ERR_PTR(-ENOMEM); + + hash = hashmap__new(strset_hash_fn, strset_equal_fn, set); + if (IS_ERR(hash)) + goto err_out; + + set->strs_data_max_len = max_data_sz; + set->strs_hash = hash; + + if (init_data) { + long off; + + set->strs_data = malloc(init_data_sz); + if (!set->strs_data) + goto err_out; + + memcpy(set->strs_data, init_data, init_data_sz); + set->strs_data_len = init_data_sz; + set->strs_data_cap = init_data_sz; + + for (off = 0; off < set->strs_data_len; off += strlen(set->strs_data + off) + 1) { + /* hashmap__add() returns EEXIST if string with the same + * content already is in the hash map + */ + err = hashmap__add(hash, off, off); + if (err == -EEXIST) + continue; /* duplicate */ + if (err) + goto err_out; + } + } + + return set; +err_out: + strset__free(set); + return ERR_PTR(err); +} + +void strset__free(struct strset *set) +{ + if (IS_ERR_OR_NULL(set)) + return; + + hashmap__free(set->strs_hash); + free(set->strs_data); + free(set); +} + +size_t strset__data_size(const struct strset *set) +{ + return set->strs_data_len; +} + +const char *strset__data(const struct strset *set) +{ + return set->strs_data; +} + +static void *strset_add_str_mem(struct strset *set, size_t add_sz) +{ + return libbpf_add_mem(&set->strs_data, &set->strs_data_cap, 1, + set->strs_data_len, set->strs_data_max_len, add_sz); +} + +/* Find string offset that corresponds to a given string *s*. + * Returns: + * - >0 offset into string data, if string is found; + * - -ENOENT, if string is not in the string data; + * - <0, on any other error. + */ +int strset__find_str(struct strset *set, const char *s) +{ + long old_off, new_off, len; + void *p; + + /* see strset__add_str() for why we do this */ + len = strlen(s) + 1; + p = strset_add_str_mem(set, len); + if (!p) + return -ENOMEM; + + new_off = set->strs_data_len; + memcpy(p, s, len); + + if (hashmap__find(set->strs_hash, new_off, &old_off)) + return old_off; + + return -ENOENT; +} + +/* Add a string s to the string data. If the string already exists, return its + * offset within string data. + * Returns: + * - > 0 offset into string data, on success; + * - < 0, on error. + */ +int strset__add_str(struct strset *set, const char *s) +{ + long old_off, new_off, len; + void *p; + int err; + + /* Hashmap keys are always offsets within set->strs_data, so to even + * look up some string from the "outside", we need to first append it + * at the end, so that it can be addressed with an offset. Luckily, + * until set->strs_data_len is incremented, that string is just a piece + * of garbage for the rest of the code, so no harm, no foul. On the + * other hand, if the string is unique, it's already appended and + * ready to be used, only a simple set->strs_data_len increment away. + */ + len = strlen(s) + 1; + p = strset_add_str_mem(set, len); + if (!p) + return -ENOMEM; + + new_off = set->strs_data_len; + memcpy(p, s, len); + + /* Now attempt to add the string, but only if the string with the same + * contents doesn't exist already (HASHMAP_ADD strategy). If such + * string exists, we'll get its offset in old_off (that's old_key). + */ + err = hashmap__insert(set->strs_hash, new_off, new_off, + HASHMAP_ADD, &old_off, NULL); + if (err == -EEXIST) + return old_off; /* duplicated string, return existing offset */ + if (err) + return err; + + set->strs_data_len += len; /* new unique string, adjust data length */ + return new_off; +} diff --git a/libbpf/src/strset.h b/libbpf/src/strset.h new file mode 100644 index 0000000..b6ddf77 --- /dev/null +++ b/libbpf/src/strset.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* Copyright (c) 2021 Facebook */ +#ifndef __LIBBPF_STRSET_H +#define __LIBBPF_STRSET_H + +#include +#include + +struct strset; + +struct strset *strset__new(size_t max_data_sz, const char *init_data, size_t init_data_sz); +void strset__free(struct strset *set); + +const char *strset__data(const struct strset *set); +size_t strset__data_size(const struct strset *set); + +int strset__find_str(struct strset *set, const char *s); +int strset__add_str(struct strset *set, const char *s); + +#endif /* __LIBBPF_STRSET_H */ diff --git a/libbpf/src/usdt.bpf.h b/libbpf/src/usdt.bpf.h new file mode 100644 index 0000000..0bd4c13 --- /dev/null +++ b/libbpf/src/usdt.bpf.h @@ -0,0 +1,250 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */ +#ifndef __USDT_BPF_H__ +#define __USDT_BPF_H__ + +#include +#include +#include + +/* Below types and maps are internal implementation details of libbpf's USDT + * support and are subjects to change. Also, bpf_usdt_xxx() API helpers should + * be considered an unstable API as well and might be adjusted based on user + * feedback from using libbpf's USDT support in production. + */ + +/* User can override BPF_USDT_MAX_SPEC_CNT to change default size of internal + * map that keeps track of USDT argument specifications. This might be + * necessary if there are a lot of USDT attachments. + */ +#ifndef BPF_USDT_MAX_SPEC_CNT +#define BPF_USDT_MAX_SPEC_CNT 256 +#endif +/* User can override BPF_USDT_MAX_IP_CNT to change default size of internal + * map that keeps track of IP (memory address) mapping to USDT argument + * specification. + * Note, if kernel supports BPF cookies, this map is not used and could be + * resized all the way to 1 to save a bit of memory. + */ +#ifndef BPF_USDT_MAX_IP_CNT +#define BPF_USDT_MAX_IP_CNT (4 * BPF_USDT_MAX_SPEC_CNT) +#endif + +enum __bpf_usdt_arg_type { + BPF_USDT_ARG_CONST, + BPF_USDT_ARG_REG, + BPF_USDT_ARG_REG_DEREF, +}; + +struct __bpf_usdt_arg_spec { + /* u64 scalar interpreted depending on arg_type, see below */ + __u64 val_off; + /* arg location case, see bpf_udst_arg() for details */ + enum __bpf_usdt_arg_type arg_type; + /* offset of referenced register within struct pt_regs */ + short reg_off; + /* whether arg should be interpreted as signed value */ + bool arg_signed; + /* number of bits that need to be cleared and, optionally, + * sign-extended to cast arguments that are 1, 2, or 4 bytes + * long into final 8-byte u64/s64 value returned to user + */ + char arg_bitshift; +}; + +/* should match USDT_MAX_ARG_CNT in usdt.c exactly */ +#define BPF_USDT_MAX_ARG_CNT 12 +struct __bpf_usdt_spec { + struct __bpf_usdt_arg_spec args[BPF_USDT_MAX_ARG_CNT]; + __u64 usdt_cookie; + short arg_cnt; +}; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, BPF_USDT_MAX_SPEC_CNT); + __type(key, int); + __type(value, struct __bpf_usdt_spec); +} __bpf_usdt_specs SEC(".maps") __weak; + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(max_entries, BPF_USDT_MAX_IP_CNT); + __type(key, long); + __type(value, __u32); +} __bpf_usdt_ip_to_spec_id SEC(".maps") __weak; + +extern const _Bool LINUX_HAS_BPF_COOKIE __kconfig; + +static __always_inline +int __bpf_usdt_spec_id(struct pt_regs *ctx) +{ + if (!LINUX_HAS_BPF_COOKIE) { + long ip = PT_REGS_IP(ctx); + int *spec_id_ptr; + + spec_id_ptr = bpf_map_lookup_elem(&__bpf_usdt_ip_to_spec_id, &ip); + return spec_id_ptr ? *spec_id_ptr : -ESRCH; + } + + return bpf_get_attach_cookie(ctx); +} + +/* Return number of USDT arguments defined for currently traced USDT. */ +__weak __hidden +int bpf_usdt_arg_cnt(struct pt_regs *ctx) +{ + struct __bpf_usdt_spec *spec; + int spec_id; + + spec_id = __bpf_usdt_spec_id(ctx); + if (spec_id < 0) + return -ESRCH; + + spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); + if (!spec) + return -ESRCH; + + return spec->arg_cnt; +} + +/* Fetch USDT argument #*arg_num* (zero-indexed) and put its value into *res. + * Returns 0 on success; negative error, otherwise. + * On error *res is guaranteed to be set to zero. + */ +__weak __hidden +int bpf_usdt_arg(struct pt_regs *ctx, __u64 arg_num, long *res) +{ + struct __bpf_usdt_spec *spec; + struct __bpf_usdt_arg_spec *arg_spec; + unsigned long val; + int err, spec_id; + + *res = 0; + + spec_id = __bpf_usdt_spec_id(ctx); + if (spec_id < 0) + return -ESRCH; + + spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); + if (!spec) + return -ESRCH; + + if (arg_num >= BPF_USDT_MAX_ARG_CNT) + return -ENOENT; + barrier_var(arg_num); + if (arg_num >= spec->arg_cnt) + return -ENOENT; + + arg_spec = &spec->args[arg_num]; + switch (arg_spec->arg_type) { + case BPF_USDT_ARG_CONST: + /* Arg is just a constant ("-4@$-9" in USDT arg spec). + * value is recorded in arg_spec->val_off directly. + */ + val = arg_spec->val_off; + break; + case BPF_USDT_ARG_REG: + /* Arg is in a register (e.g, "8@%rax" in USDT arg spec), + * so we read the contents of that register directly from + * struct pt_regs. To keep things simple user-space parts + * record offsetof(struct pt_regs, ) in arg_spec->reg_off. + */ + err = bpf_probe_read_kernel(&val, sizeof(val), (void *)ctx + arg_spec->reg_off); + if (err) + return err; + break; + case BPF_USDT_ARG_REG_DEREF: + /* Arg is in memory addressed by register, plus some offset + * (e.g., "-4@-1204(%rbp)" in USDT arg spec). Register is + * identified like with BPF_USDT_ARG_REG case, and the offset + * is in arg_spec->val_off. We first fetch register contents + * from pt_regs, then do another user-space probe read to + * fetch argument value itself. + */ + err = bpf_probe_read_kernel(&val, sizeof(val), (void *)ctx + arg_spec->reg_off); + if (err) + return err; + err = bpf_probe_read_user(&val, sizeof(val), (void *)val + arg_spec->val_off); + if (err) + return err; +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + val >>= arg_spec->arg_bitshift; +#endif + break; + default: + return -EINVAL; + } + + /* cast arg from 1, 2, or 4 bytes to final 8 byte size clearing + * necessary upper arg_bitshift bits, with sign extension if argument + * is signed + */ + val <<= arg_spec->arg_bitshift; + if (arg_spec->arg_signed) + val = ((long)val) >> arg_spec->arg_bitshift; + else + val = val >> arg_spec->arg_bitshift; + *res = val; + return 0; +} + +/* Retrieve user-specified cookie value provided during attach as + * bpf_usdt_opts.usdt_cookie. This serves the same purpose as BPF cookie + * returned by bpf_get_attach_cookie(). Libbpf's support for USDT is itself + * utilizing BPF cookies internally, so user can't use BPF cookie directly + * for USDT programs and has to use bpf_usdt_cookie() API instead. + */ +__weak __hidden +long bpf_usdt_cookie(struct pt_regs *ctx) +{ + struct __bpf_usdt_spec *spec; + int spec_id; + + spec_id = __bpf_usdt_spec_id(ctx); + if (spec_id < 0) + return 0; + + spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); + if (!spec) + return 0; + + return spec->usdt_cookie; +} + +/* we rely on ___bpf_apply() and ___bpf_narg() macros already defined in bpf_tracing.h */ +#define ___bpf_usdt_args0() ctx +#define ___bpf_usdt_args1(x) ___bpf_usdt_args0(), ({ long _x; bpf_usdt_arg(ctx, 0, &_x); (void *)_x; }) +#define ___bpf_usdt_args2(x, args...) ___bpf_usdt_args1(args), ({ long _x; bpf_usdt_arg(ctx, 1, &_x); (void *)_x; }) +#define ___bpf_usdt_args3(x, args...) ___bpf_usdt_args2(args), ({ long _x; bpf_usdt_arg(ctx, 2, &_x); (void *)_x; }) +#define ___bpf_usdt_args4(x, args...) ___bpf_usdt_args3(args), ({ long _x; bpf_usdt_arg(ctx, 3, &_x); (void *)_x; }) +#define ___bpf_usdt_args5(x, args...) ___bpf_usdt_args4(args), ({ long _x; bpf_usdt_arg(ctx, 4, &_x); (void *)_x; }) +#define ___bpf_usdt_args6(x, args...) ___bpf_usdt_args5(args), ({ long _x; bpf_usdt_arg(ctx, 5, &_x); (void *)_x; }) +#define ___bpf_usdt_args7(x, args...) ___bpf_usdt_args6(args), ({ long _x; bpf_usdt_arg(ctx, 6, &_x); (void *)_x; }) +#define ___bpf_usdt_args8(x, args...) ___bpf_usdt_args7(args), ({ long _x; bpf_usdt_arg(ctx, 7, &_x); (void *)_x; }) +#define ___bpf_usdt_args9(x, args...) ___bpf_usdt_args8(args), ({ long _x; bpf_usdt_arg(ctx, 8, &_x); (void *)_x; }) +#define ___bpf_usdt_args10(x, args...) ___bpf_usdt_args9(args), ({ long _x; bpf_usdt_arg(ctx, 9, &_x); (void *)_x; }) +#define ___bpf_usdt_args11(x, args...) ___bpf_usdt_args10(args), ({ long _x; bpf_usdt_arg(ctx, 10, &_x); (void *)_x; }) +#define ___bpf_usdt_args12(x, args...) ___bpf_usdt_args11(args), ({ long _x; bpf_usdt_arg(ctx, 11, &_x); (void *)_x; }) +#define ___bpf_usdt_args(args...) ___bpf_apply(___bpf_usdt_args, ___bpf_narg(args))(args) + +/* + * BPF_USDT serves the same purpose for USDT handlers as BPF_PROG for + * tp_btf/fentry/fexit BPF programs and BPF_KPROBE for kprobes. + * Original struct pt_regs * context is preserved as 'ctx' argument. + */ +#define BPF_USDT(name, args...) \ +name(struct pt_regs *ctx); \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args); \ +typeof(name(0)) name(struct pt_regs *ctx) \ +{ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ + return ____##name(___bpf_usdt_args(args)); \ + _Pragma("GCC diagnostic pop") \ +} \ +static __always_inline typeof(name(0)) \ +____##name(struct pt_regs *ctx, ##args) + +#endif /* __USDT_BPF_H__ */ diff --git a/libbpf/src/usdt.c b/libbpf/src/usdt.c new file mode 100644 index 0000000..b8402e3 --- /dev/null +++ b/libbpf/src/usdt.c @@ -0,0 +1,1556 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* s8 will be marked as poison while it's a reg of riscv */ +#if defined(__riscv) +#define rv_s8 s8 +#endif + +#include "bpf.h" +#include "libbpf.h" +#include "libbpf_common.h" +#include "libbpf_internal.h" +#include "hashmap.h" + +/* libbpf's USDT support consists of BPF-side state/code and user-space + * state/code working together in concert. BPF-side parts are defined in + * usdt.bpf.h header library. User-space state is encapsulated by struct + * usdt_manager and all the supporting code centered around usdt_manager. + * + * usdt.bpf.h defines two BPF maps that usdt_manager expects: USDT spec map + * and IP-to-spec-ID map, which is auxiliary map necessary for kernels that + * don't support BPF cookie (see below). These two maps are implicitly + * embedded into user's end BPF object file when user's code included + * usdt.bpf.h. This means that libbpf doesn't do anything special to create + * these USDT support maps. They are created by normal libbpf logic of + * instantiating BPF maps when opening and loading BPF object. + * + * As such, libbpf is basically unaware of the need to do anything + * USDT-related until the very first call to bpf_program__attach_usdt(), which + * can be called by user explicitly or happen automatically during skeleton + * attach (or, equivalently, through generic bpf_program__attach() call). At + * this point, libbpf will instantiate and initialize struct usdt_manager and + * store it in bpf_object. USDT manager is per-BPF object construct, as each + * independent BPF object might or might not have USDT programs, and thus all + * the expected USDT-related state. There is no coordination between two + * bpf_object in parts of USDT attachment, they are oblivious of each other's + * existence and libbpf is just oblivious, dealing with bpf_object-specific + * USDT state. + * + * Quick crash course on USDTs. + * + * From user-space application's point of view, USDT is essentially just + * a slightly special function call that normally has zero overhead, unless it + * is being traced by some external entity (e.g, BPF-based tool). Here's how + * a typical application can trigger USDT probe: + * + * #include // provided by systemtap-sdt-devel package + * // folly also provide similar functionality in folly/tracing/StaticTracepoint.h + * + * STAP_PROBE3(my_usdt_provider, my_usdt_probe_name, 123, x, &y); + * + * USDT is identified by it's : pair of names. Each + * individual USDT has a fixed number of arguments (3 in the above example) + * and specifies values of each argument as if it was a function call. + * + * USDT call is actually not a function call, but is instead replaced by + * a single NOP instruction (thus zero overhead, effectively). But in addition + * to that, those USDT macros generate special SHT_NOTE ELF records in + * .note.stapsdt ELF section. Here's an example USDT definition as emitted by + * `readelf -n `: + * + * stapsdt 0x00000089 NT_STAPSDT (SystemTap probe descriptors) + * Provider: test + * Name: usdt12 + * Location: 0x0000000000549df3, Base: 0x00000000008effa4, Semaphore: 0x0000000000a4606e + * Arguments: -4@-1204(%rbp) -4@%edi -8@-1216(%rbp) -8@%r8 -4@$5 -8@%r9 8@%rdx 8@%r10 -4@$-9 -2@%cx -2@%ax -1@%sil + * + * In this case we have USDT test:usdt12 with 12 arguments. + * + * Location and base are offsets used to calculate absolute IP address of that + * NOP instruction that kernel can replace with an interrupt instruction to + * trigger instrumentation code (BPF program for all that we care about). + * + * Semaphore above is and optional feature. It records an address of a 2-byte + * refcount variable (normally in '.probes' ELF section) used for signaling if + * there is anything that is attached to USDT. This is useful for user + * applications if, for example, they need to prepare some arguments that are + * passed only to USDTs and preparation is expensive. By checking if USDT is + * "activated", an application can avoid paying those costs unnecessarily. + * Recent enough kernel has built-in support for automatically managing this + * refcount, which libbpf expects and relies on. If USDT is defined without + * associated semaphore, this value will be zero. See selftests for semaphore + * examples. + * + * Arguments is the most interesting part. This USDT specification string is + * providing information about all the USDT arguments and their locations. The + * part before @ sign defined byte size of the argument (1, 2, 4, or 8) and + * whether the argument is signed or unsigned (negative size means signed). + * The part after @ sign is assembly-like definition of argument location + * (see [0] for more details). Technically, assembler can provide some pretty + * advanced definitions, but libbpf is currently supporting three most common + * cases: + * 1) immediate constant, see 5th and 9th args above (-4@$5 and -4@-9); + * 2) register value, e.g., 8@%rdx, which means "unsigned 8-byte integer + * whose value is in register %rdx"; + * 3) memory dereference addressed by register, e.g., -4@-1204(%rbp), which + * specifies signed 32-bit integer stored at offset -1204 bytes from + * memory address stored in %rbp. + * + * [0] https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation + * + * During attachment, libbpf parses all the relevant USDT specifications and + * prepares `struct usdt_spec` (USDT spec), which is then provided to BPF-side + * code through spec map. This allows BPF applications to quickly fetch the + * actual value at runtime using a simple BPF-side code. + * + * With basics out of the way, let's go over less immediately obvious aspects + * of supporting USDTs. + * + * First, there is no special USDT BPF program type. It is actually just + * a uprobe BPF program (which for kernel, at least currently, is just a kprobe + * program, so BPF_PROG_TYPE_KPROBE program type). With the only difference + * that uprobe is usually attached at the function entry, while USDT will + * normally will be somewhere inside the function. But it should always be + * pointing to NOP instruction, which makes such uprobes the fastest uprobe + * kind. + * + * Second, it's important to realize that such STAP_PROBEn(provider, name, ...) + * macro invocations can end up being inlined many-many times, depending on + * specifics of each individual user application. So single conceptual USDT + * (identified by provider:name pair of identifiers) is, generally speaking, + * multiple uprobe locations (USDT call sites) in different places in user + * application. Further, again due to inlining, each USDT call site might end + * up having the same argument #N be located in a different place. In one call + * site it could be a constant, in another will end up in a register, and in + * yet another could be some other register or even somewhere on the stack. + * + * As such, "attaching to USDT" means (in general case) attaching the same + * uprobe BPF program to multiple target locations in user application, each + * potentially having a completely different USDT spec associated with it. + * To wire all this up together libbpf allocates a unique integer spec ID for + * each unique USDT spec. Spec IDs are allocated as sequential small integers + * so that they can be used as keys in array BPF map (for performance reasons). + * Spec ID allocation and accounting is big part of what usdt_manager is + * about. This state has to be maintained per-BPF object and coordinate + * between different USDT attachments within the same BPF object. + * + * Spec ID is the key in spec BPF map, value is the actual USDT spec layed out + * as struct usdt_spec. Each invocation of BPF program at runtime needs to + * know its associated spec ID. It gets it either through BPF cookie, which + * libbpf sets to spec ID during attach time, or, if kernel is too old to + * support BPF cookie, through IP-to-spec-ID map that libbpf maintains in such + * case. The latter means that some modes of operation can't be supported + * without BPF cookie. Such mode is attaching to shared library "generically", + * without specifying target process. In such case, it's impossible to + * calculate absolute IP addresses for IP-to-spec-ID map, and thus such mode + * is not supported without BPF cookie support. + * + * Note that libbpf is using BPF cookie functionality for its own internal + * needs, so user itself can't rely on BPF cookie feature. To that end, libbpf + * provides conceptually equivalent USDT cookie support. It's still u64 + * user-provided value that can be associated with USDT attachment. Note that + * this will be the same value for all USDT call sites within the same single + * *logical* USDT attachment. This makes sense because to user attaching to + * USDT is a single BPF program triggered for singular USDT probe. The fact + * that this is done at multiple actual locations is a mostly hidden + * implementation details. This USDT cookie value can be fetched with + * bpf_usdt_cookie(ctx) API provided by usdt.bpf.h + * + * Lastly, while single USDT can have tons of USDT call sites, it doesn't + * necessarily have that many different USDT specs. It very well might be + * that 1000 USDT call sites only need 5 different USDT specs, because all the + * arguments are typically contained in a small set of registers or stack + * locations. As such, it's wasteful to allocate as many USDT spec IDs as + * there are USDT call sites. So libbpf tries to be frugal and performs + * on-the-fly deduplication during a single USDT attachment to only allocate + * the minimal required amount of unique USDT specs (and thus spec IDs). This + * is trivially achieved by using USDT spec string (Arguments string from USDT + * note) as a lookup key in a hashmap. USDT spec string uniquely defines + * everything about how to fetch USDT arguments, so two USDT call sites + * sharing USDT spec string can safely share the same USDT spec and spec ID. + * Note, this spec string deduplication is happening only during the same USDT + * attachment, so each USDT spec shares the same USDT cookie value. This is + * not generally true for other USDT attachments within the same BPF object, + * as even if USDT spec string is the same, USDT cookie value can be + * different. It was deemed excessive to try to deduplicate across independent + * USDT attachments by taking into account USDT spec string *and* USDT cookie + * value, which would complicated spec ID accounting significantly for little + * gain. + */ + +#define USDT_BASE_SEC ".stapsdt.base" +#define USDT_SEMA_SEC ".probes" +#define USDT_NOTE_SEC ".note.stapsdt" +#define USDT_NOTE_TYPE 3 +#define USDT_NOTE_NAME "stapsdt" + +/* should match exactly enum __bpf_usdt_arg_type from usdt.bpf.h */ +enum usdt_arg_type { + USDT_ARG_CONST, + USDT_ARG_REG, + USDT_ARG_REG_DEREF, +}; + +/* should match exactly struct __bpf_usdt_arg_spec from usdt.bpf.h */ +struct usdt_arg_spec { + __u64 val_off; + enum usdt_arg_type arg_type; + short reg_off; + bool arg_signed; + char arg_bitshift; +}; + +/* should match BPF_USDT_MAX_ARG_CNT in usdt.bpf.h */ +#define USDT_MAX_ARG_CNT 12 + +/* should match struct __bpf_usdt_spec from usdt.bpf.h */ +struct usdt_spec { + struct usdt_arg_spec args[USDT_MAX_ARG_CNT]; + __u64 usdt_cookie; + short arg_cnt; +}; + +struct usdt_note { + const char *provider; + const char *name; + /* USDT args specification string, e.g.: + * "-4@%esi -4@-24(%rbp) -4@%ecx 2@%ax 8@%rdx" + */ + const char *args; + long loc_addr; + long base_addr; + long sema_addr; +}; + +struct usdt_target { + long abs_ip; + long rel_ip; + long sema_off; + struct usdt_spec spec; + const char *spec_str; +}; + +struct usdt_manager { + struct bpf_map *specs_map; + struct bpf_map *ip_to_spec_id_map; + + int *free_spec_ids; + size_t free_spec_cnt; + size_t next_free_spec_id; + + bool has_bpf_cookie; + bool has_sema_refcnt; +}; + +struct usdt_manager *usdt_manager_new(struct bpf_object *obj) +{ + static const char *ref_ctr_sysfs_path = "/sys/bus/event_source/devices/uprobe/format/ref_ctr_offset"; + struct usdt_manager *man; + struct bpf_map *specs_map, *ip_to_spec_id_map; + + specs_map = bpf_object__find_map_by_name(obj, "__bpf_usdt_specs"); + ip_to_spec_id_map = bpf_object__find_map_by_name(obj, "__bpf_usdt_ip_to_spec_id"); + if (!specs_map || !ip_to_spec_id_map) { + pr_warn("usdt: failed to find USDT support BPF maps, did you forget to include bpf/usdt.bpf.h?\n"); + return ERR_PTR(-ESRCH); + } + + man = calloc(1, sizeof(*man)); + if (!man) + return ERR_PTR(-ENOMEM); + + man->specs_map = specs_map; + man->ip_to_spec_id_map = ip_to_spec_id_map; + + /* Detect if BPF cookie is supported for kprobes. + * We don't need IP-to-ID mapping if we can use BPF cookies. + * Added in: 7adfc6c9b315 ("bpf: Add bpf_get_attach_cookie() BPF helper to access bpf_cookie value") + */ + man->has_bpf_cookie = kernel_supports(obj, FEAT_BPF_COOKIE); + + /* Detect kernel support for automatic refcounting of USDT semaphore. + * If this is not supported, USDTs with semaphores will not be supported. + * Added in: a6ca88b241d5 ("trace_uprobe: support reference counter in fd-based uprobe") + */ + man->has_sema_refcnt = faccessat(AT_FDCWD, ref_ctr_sysfs_path, F_OK, AT_EACCESS) == 0; + + return man; +} + +void usdt_manager_free(struct usdt_manager *man) +{ + if (IS_ERR_OR_NULL(man)) + return; + + free(man->free_spec_ids); + free(man); +} + +static int sanity_check_usdt_elf(Elf *elf, const char *path) +{ + GElf_Ehdr ehdr; + int endianness; + + if (elf_kind(elf) != ELF_K_ELF) { + pr_warn("usdt: unrecognized ELF kind %d for '%s'\n", elf_kind(elf), path); + return -EBADF; + } + + switch (gelf_getclass(elf)) { + case ELFCLASS64: + if (sizeof(void *) != 8) { + pr_warn("usdt: attaching to 64-bit ELF binary '%s' is not supported\n", path); + return -EBADF; + } + break; + case ELFCLASS32: + if (sizeof(void *) != 4) { + pr_warn("usdt: attaching to 32-bit ELF binary '%s' is not supported\n", path); + return -EBADF; + } + break; + default: + pr_warn("usdt: unsupported ELF class for '%s'\n", path); + return -EBADF; + } + + if (!gelf_getehdr(elf, &ehdr)) + return -EINVAL; + + if (ehdr.e_type != ET_EXEC && ehdr.e_type != ET_DYN) { + pr_warn("usdt: unsupported type of ELF binary '%s' (%d), only ET_EXEC and ET_DYN are supported\n", + path, ehdr.e_type); + return -EBADF; + } + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + endianness = ELFDATA2LSB; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + endianness = ELFDATA2MSB; +#else +# error "Unrecognized __BYTE_ORDER__" +#endif + if (endianness != ehdr.e_ident[EI_DATA]) { + pr_warn("usdt: ELF endianness mismatch for '%s'\n", path); + return -EBADF; + } + + return 0; +} + +static int find_elf_sec_by_name(Elf *elf, const char *sec_name, GElf_Shdr *shdr, Elf_Scn **scn) +{ + Elf_Scn *sec = NULL; + size_t shstrndx; + + if (elf_getshdrstrndx(elf, &shstrndx)) + return -EINVAL; + + /* check if ELF is corrupted and avoid calling elf_strptr if yes */ + if (!elf_rawdata(elf_getscn(elf, shstrndx), NULL)) + return -EINVAL; + + while ((sec = elf_nextscn(elf, sec)) != NULL) { + char *name; + + if (!gelf_getshdr(sec, shdr)) + return -EINVAL; + + name = elf_strptr(elf, shstrndx, shdr->sh_name); + if (name && strcmp(sec_name, name) == 0) { + *scn = sec; + return 0; + } + } + + return -ENOENT; +} + +struct elf_seg { + long start; + long end; + long offset; + bool is_exec; +}; + +static int cmp_elf_segs(const void *_a, const void *_b) +{ + const struct elf_seg *a = _a; + const struct elf_seg *b = _b; + + return a->start < b->start ? -1 : 1; +} + +static int parse_elf_segs(Elf *elf, const char *path, struct elf_seg **segs, size_t *seg_cnt) +{ + GElf_Phdr phdr; + size_t n; + int i, err; + struct elf_seg *seg; + void *tmp; + + *seg_cnt = 0; + + if (elf_getphdrnum(elf, &n)) { + err = -errno; + return err; + } + + for (i = 0; i < n; i++) { + if (!gelf_getphdr(elf, i, &phdr)) { + err = -errno; + return err; + } + + pr_debug("usdt: discovered PHDR #%d in '%s': vaddr 0x%lx memsz 0x%lx offset 0x%lx type 0x%lx flags 0x%lx\n", + i, path, (long)phdr.p_vaddr, (long)phdr.p_memsz, (long)phdr.p_offset, + (long)phdr.p_type, (long)phdr.p_flags); + if (phdr.p_type != PT_LOAD) + continue; + + tmp = libbpf_reallocarray(*segs, *seg_cnt + 1, sizeof(**segs)); + if (!tmp) + return -ENOMEM; + + *segs = tmp; + seg = *segs + *seg_cnt; + (*seg_cnt)++; + + seg->start = phdr.p_vaddr; + seg->end = phdr.p_vaddr + phdr.p_memsz; + seg->offset = phdr.p_offset; + seg->is_exec = phdr.p_flags & PF_X; + } + + if (*seg_cnt == 0) { + pr_warn("usdt: failed to find PT_LOAD program headers in '%s'\n", path); + return -ESRCH; + } + + qsort(*segs, *seg_cnt, sizeof(**segs), cmp_elf_segs); + return 0; +} + +static int parse_vma_segs(int pid, const char *lib_path, struct elf_seg **segs, size_t *seg_cnt) +{ + char path[PATH_MAX], line[PATH_MAX], mode[16]; + size_t seg_start, seg_end, seg_off; + struct elf_seg *seg; + int tmp_pid, i, err; + FILE *f; + + *seg_cnt = 0; + + /* Handle containerized binaries only accessible from + * /proc//root/. They will be reported as just / in + * /proc//maps. + */ + if (sscanf(lib_path, "/proc/%d/root%s", &tmp_pid, path) == 2 && pid == tmp_pid) + goto proceed; + + if (!realpath(lib_path, path)) { + pr_warn("usdt: failed to get absolute path of '%s' (err %d), using path as is...\n", + lib_path, -errno); + libbpf_strlcpy(path, lib_path, sizeof(path)); + } + +proceed: + sprintf(line, "/proc/%d/maps", pid); + f = fopen(line, "r"); + if (!f) { + err = -errno; + pr_warn("usdt: failed to open '%s' to get base addr of '%s': %d\n", + line, lib_path, err); + return err; + } + + /* We need to handle lines with no path at the end: + * + * 7f5c6f5d1000-7f5c6f5d3000 rw-p 001c7000 08:04 21238613 /usr/lib64/libc-2.17.so + * 7f5c6f5d3000-7f5c6f5d8000 rw-p 00000000 00:00 0 + * 7f5c6f5d8000-7f5c6f5d9000 r-xp 00000000 103:01 362990598 /data/users/andriin/linux/tools/bpf/usdt/libhello_usdt.so + */ + while (fscanf(f, "%zx-%zx %s %zx %*s %*d%[^\n]\n", + &seg_start, &seg_end, mode, &seg_off, line) == 5) { + void *tmp; + + /* to handle no path case (see above) we need to capture line + * without skipping any whitespaces. So we need to strip + * leading whitespaces manually here + */ + i = 0; + while (isblank(line[i])) + i++; + if (strcmp(line + i, path) != 0) + continue; + + pr_debug("usdt: discovered segment for lib '%s': addrs %zx-%zx mode %s offset %zx\n", + path, seg_start, seg_end, mode, seg_off); + + /* ignore non-executable sections for shared libs */ + if (mode[2] != 'x') + continue; + + tmp = libbpf_reallocarray(*segs, *seg_cnt + 1, sizeof(**segs)); + if (!tmp) { + err = -ENOMEM; + goto err_out; + } + + *segs = tmp; + seg = *segs + *seg_cnt; + *seg_cnt += 1; + + seg->start = seg_start; + seg->end = seg_end; + seg->offset = seg_off; + seg->is_exec = true; + } + + if (*seg_cnt == 0) { + pr_warn("usdt: failed to find '%s' (resolved to '%s') within PID %d memory mappings\n", + lib_path, path, pid); + err = -ESRCH; + goto err_out; + } + + qsort(*segs, *seg_cnt, sizeof(**segs), cmp_elf_segs); + err = 0; +err_out: + fclose(f); + return err; +} + +static struct elf_seg *find_elf_seg(struct elf_seg *segs, size_t seg_cnt, long virtaddr) +{ + struct elf_seg *seg; + int i; + + /* for ELF binaries (both executables and shared libraries), we are + * given virtual address (absolute for executables, relative for + * libraries) which should match address range of [seg_start, seg_end) + */ + for (i = 0, seg = segs; i < seg_cnt; i++, seg++) { + if (seg->start <= virtaddr && virtaddr < seg->end) + return seg; + } + return NULL; +} + +static struct elf_seg *find_vma_seg(struct elf_seg *segs, size_t seg_cnt, long offset) +{ + struct elf_seg *seg; + int i; + + /* for VMA segments from /proc//maps file, provided "address" is + * actually a file offset, so should be fall within logical + * offset-based range of [offset_start, offset_end) + */ + for (i = 0, seg = segs; i < seg_cnt; i++, seg++) { + if (seg->offset <= offset && offset < seg->offset + (seg->end - seg->start)) + return seg; + } + return NULL; +} + +static int parse_usdt_note(Elf *elf, const char *path, GElf_Nhdr *nhdr, + const char *data, size_t name_off, size_t desc_off, + struct usdt_note *usdt_note); + +static int parse_usdt_spec(struct usdt_spec *spec, const struct usdt_note *note, __u64 usdt_cookie); + +static int collect_usdt_targets(struct usdt_manager *man, Elf *elf, const char *path, pid_t pid, + const char *usdt_provider, const char *usdt_name, __u64 usdt_cookie, + struct usdt_target **out_targets, size_t *out_target_cnt) +{ + size_t off, name_off, desc_off, seg_cnt = 0, vma_seg_cnt = 0, target_cnt = 0; + struct elf_seg *segs = NULL, *vma_segs = NULL; + struct usdt_target *targets = NULL, *target; + long base_addr = 0; + Elf_Scn *notes_scn, *base_scn; + GElf_Shdr base_shdr, notes_shdr; + GElf_Ehdr ehdr; + GElf_Nhdr nhdr; + Elf_Data *data; + int err; + + *out_targets = NULL; + *out_target_cnt = 0; + + err = find_elf_sec_by_name(elf, USDT_NOTE_SEC, ¬es_shdr, ¬es_scn); + if (err) { + pr_warn("usdt: no USDT notes section (%s) found in '%s'\n", USDT_NOTE_SEC, path); + return err; + } + + if (notes_shdr.sh_type != SHT_NOTE || !gelf_getehdr(elf, &ehdr)) { + pr_warn("usdt: invalid USDT notes section (%s) in '%s'\n", USDT_NOTE_SEC, path); + return -EINVAL; + } + + err = parse_elf_segs(elf, path, &segs, &seg_cnt); + if (err) { + pr_warn("usdt: failed to process ELF program segments for '%s': %d\n", path, err); + goto err_out; + } + + /* .stapsdt.base ELF section is optional, but is used for prelink + * offset compensation (see a big comment further below) + */ + if (find_elf_sec_by_name(elf, USDT_BASE_SEC, &base_shdr, &base_scn) == 0) + base_addr = base_shdr.sh_addr; + + data = elf_getdata(notes_scn, 0); + off = 0; + while ((off = gelf_getnote(data, off, &nhdr, &name_off, &desc_off)) > 0) { + long usdt_abs_ip, usdt_rel_ip, usdt_sema_off = 0; + struct usdt_note note; + struct elf_seg *seg = NULL; + void *tmp; + + err = parse_usdt_note(elf, path, &nhdr, data->d_buf, name_off, desc_off, ¬e); + if (err) + goto err_out; + + if (strcmp(note.provider, usdt_provider) != 0 || strcmp(note.name, usdt_name) != 0) + continue; + + /* We need to compensate "prelink effect". See [0] for details, + * relevant parts quoted here: + * + * Each SDT probe also expands into a non-allocated ELF note. You can + * find this by looking at SHT_NOTE sections and decoding the format; + * see below for details. Because the note is non-allocated, it means + * there is no runtime cost, and also preserved in both stripped files + * and .debug files. + * + * However, this means that prelink won't adjust the note's contents + * for address offsets. Instead, this is done via the .stapsdt.base + * section. This is a special section that is added to the text. We + * will only ever have one of these sections in a final link and it + * will only ever be one byte long. Nothing about this section itself + * matters, we just use it as a marker to detect prelink address + * adjustments. + * + * Each probe note records the link-time address of the .stapsdt.base + * section alongside the probe PC address. The decoder compares the + * base address stored in the note with the .stapsdt.base section's + * sh_addr. Initially these are the same, but the section header will + * be adjusted by prelink. So the decoder applies the difference to + * the probe PC address to get the correct prelinked PC address; the + * same adjustment is applied to the semaphore address, if any. + * + * [0] https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation + */ + usdt_abs_ip = note.loc_addr; + if (base_addr) + usdt_abs_ip += base_addr - note.base_addr; + + /* When attaching uprobes (which is what USDTs basically are) + * kernel expects file offset to be specified, not a relative + * virtual address, so we need to translate virtual address to + * file offset, for both ET_EXEC and ET_DYN binaries. + */ + seg = find_elf_seg(segs, seg_cnt, usdt_abs_ip); + if (!seg) { + err = -ESRCH; + pr_warn("usdt: failed to find ELF program segment for '%s:%s' in '%s' at IP 0x%lx\n", + usdt_provider, usdt_name, path, usdt_abs_ip); + goto err_out; + } + if (!seg->is_exec) { + err = -ESRCH; + pr_warn("usdt: matched ELF binary '%s' segment [0x%lx, 0x%lx) for '%s:%s' at IP 0x%lx is not executable\n", + path, seg->start, seg->end, usdt_provider, usdt_name, + usdt_abs_ip); + goto err_out; + } + /* translate from virtual address to file offset */ + usdt_rel_ip = usdt_abs_ip - seg->start + seg->offset; + + if (ehdr.e_type == ET_DYN && !man->has_bpf_cookie) { + /* If we don't have BPF cookie support but need to + * attach to a shared library, we'll need to know and + * record absolute addresses of attach points due to + * the need to lookup USDT spec by absolute IP of + * triggered uprobe. Doing this resolution is only + * possible when we have a specific PID of the process + * that's using specified shared library. BPF cookie + * removes the absolute address limitation as we don't + * need to do this lookup (we just use BPF cookie as + * an index of USDT spec), so for newer kernels with + * BPF cookie support libbpf supports USDT attachment + * to shared libraries with no PID filter. + */ + if (pid < 0) { + pr_warn("usdt: attaching to shared libraries without specific PID is not supported on current kernel\n"); + err = -ENOTSUP; + goto err_out; + } + + /* vma_segs are lazily initialized only if necessary */ + if (vma_seg_cnt == 0) { + err = parse_vma_segs(pid, path, &vma_segs, &vma_seg_cnt); + if (err) { + pr_warn("usdt: failed to get memory segments in PID %d for shared library '%s': %d\n", + pid, path, err); + goto err_out; + } + } + + seg = find_vma_seg(vma_segs, vma_seg_cnt, usdt_rel_ip); + if (!seg) { + err = -ESRCH; + pr_warn("usdt: failed to find shared lib memory segment for '%s:%s' in '%s' at relative IP 0x%lx\n", + usdt_provider, usdt_name, path, usdt_rel_ip); + goto err_out; + } + + usdt_abs_ip = seg->start - seg->offset + usdt_rel_ip; + } + + pr_debug("usdt: probe for '%s:%s' in %s '%s': addr 0x%lx base 0x%lx (resolved abs_ip 0x%lx rel_ip 0x%lx) args '%s' in segment [0x%lx, 0x%lx) at offset 0x%lx\n", + usdt_provider, usdt_name, ehdr.e_type == ET_EXEC ? "exec" : "lib ", path, + note.loc_addr, note.base_addr, usdt_abs_ip, usdt_rel_ip, note.args, + seg ? seg->start : 0, seg ? seg->end : 0, seg ? seg->offset : 0); + + /* Adjust semaphore address to be a file offset */ + if (note.sema_addr) { + if (!man->has_sema_refcnt) { + pr_warn("usdt: kernel doesn't support USDT semaphore refcounting for '%s:%s' in '%s'\n", + usdt_provider, usdt_name, path); + err = -ENOTSUP; + goto err_out; + } + + seg = find_elf_seg(segs, seg_cnt, note.sema_addr); + if (!seg) { + err = -ESRCH; + pr_warn("usdt: failed to find ELF loadable segment with semaphore of '%s:%s' in '%s' at 0x%lx\n", + usdt_provider, usdt_name, path, note.sema_addr); + goto err_out; + } + if (seg->is_exec) { + err = -ESRCH; + pr_warn("usdt: matched ELF binary '%s' segment [0x%lx, 0x%lx] for semaphore of '%s:%s' at 0x%lx is executable\n", + path, seg->start, seg->end, usdt_provider, usdt_name, + note.sema_addr); + goto err_out; + } + + usdt_sema_off = note.sema_addr - seg->start + seg->offset; + + pr_debug("usdt: sema for '%s:%s' in %s '%s': addr 0x%lx base 0x%lx (resolved 0x%lx) in segment [0x%lx, 0x%lx] at offset 0x%lx\n", + usdt_provider, usdt_name, ehdr.e_type == ET_EXEC ? "exec" : "lib ", + path, note.sema_addr, note.base_addr, usdt_sema_off, + seg->start, seg->end, seg->offset); + } + + /* Record adjusted addresses and offsets and parse USDT spec */ + tmp = libbpf_reallocarray(targets, target_cnt + 1, sizeof(*targets)); + if (!tmp) { + err = -ENOMEM; + goto err_out; + } + targets = tmp; + + target = &targets[target_cnt]; + memset(target, 0, sizeof(*target)); + + target->abs_ip = usdt_abs_ip; + target->rel_ip = usdt_rel_ip; + target->sema_off = usdt_sema_off; + + /* notes.args references strings from Elf itself, so they can + * be referenced safely until elf_end() call + */ + target->spec_str = note.args; + + err = parse_usdt_spec(&target->spec, ¬e, usdt_cookie); + if (err) + goto err_out; + + target_cnt++; + } + + *out_targets = targets; + *out_target_cnt = target_cnt; + err = target_cnt; + +err_out: + free(segs); + free(vma_segs); + if (err < 0) + free(targets); + return err; +} + +struct bpf_link_usdt { + struct bpf_link link; + + struct usdt_manager *usdt_man; + + size_t spec_cnt; + int *spec_ids; + + size_t uprobe_cnt; + struct { + long abs_ip; + struct bpf_link *link; + } *uprobes; +}; + +static int bpf_link_usdt_detach(struct bpf_link *link) +{ + struct bpf_link_usdt *usdt_link = container_of(link, struct bpf_link_usdt, link); + struct usdt_manager *man = usdt_link->usdt_man; + int i; + + for (i = 0; i < usdt_link->uprobe_cnt; i++) { + /* detach underlying uprobe link */ + bpf_link__destroy(usdt_link->uprobes[i].link); + /* there is no need to update specs map because it will be + * unconditionally overwritten on subsequent USDT attaches, + * but if BPF cookies are not used we need to remove entry + * from ip_to_spec_id map, otherwise we'll run into false + * conflicting IP errors + */ + if (!man->has_bpf_cookie) { + /* not much we can do about errors here */ + (void)bpf_map_delete_elem(bpf_map__fd(man->ip_to_spec_id_map), + &usdt_link->uprobes[i].abs_ip); + } + } + + /* try to return the list of previously used spec IDs to usdt_manager + * for future reuse for subsequent USDT attaches + */ + if (!man->free_spec_ids) { + /* if there were no free spec IDs yet, just transfer our IDs */ + man->free_spec_ids = usdt_link->spec_ids; + man->free_spec_cnt = usdt_link->spec_cnt; + usdt_link->spec_ids = NULL; + } else { + /* otherwise concat IDs */ + size_t new_cnt = man->free_spec_cnt + usdt_link->spec_cnt; + int *new_free_ids; + + new_free_ids = libbpf_reallocarray(man->free_spec_ids, new_cnt, + sizeof(*new_free_ids)); + /* If we couldn't resize free_spec_ids, we'll just leak + * a bunch of free IDs; this is very unlikely to happen and if + * system is so exhausted on memory, it's the least of user's + * concerns, probably. + * So just do our best here to return those IDs to usdt_manager. + */ + if (new_free_ids) { + memcpy(new_free_ids + man->free_spec_cnt, usdt_link->spec_ids, + usdt_link->spec_cnt * sizeof(*usdt_link->spec_ids)); + man->free_spec_ids = new_free_ids; + man->free_spec_cnt = new_cnt; + } + } + + return 0; +} + +static void bpf_link_usdt_dealloc(struct bpf_link *link) +{ + struct bpf_link_usdt *usdt_link = container_of(link, struct bpf_link_usdt, link); + + free(usdt_link->spec_ids); + free(usdt_link->uprobes); + free(usdt_link); +} + +static size_t specs_hash_fn(long key, void *ctx) +{ + return str_hash((char *)key); +} + +static bool specs_equal_fn(long key1, long key2, void *ctx) +{ + return strcmp((char *)key1, (char *)key2) == 0; +} + +static int allocate_spec_id(struct usdt_manager *man, struct hashmap *specs_hash, + struct bpf_link_usdt *link, struct usdt_target *target, + int *spec_id, bool *is_new) +{ + long tmp; + void *new_ids; + int err; + + /* check if we already allocated spec ID for this spec string */ + if (hashmap__find(specs_hash, target->spec_str, &tmp)) { + *spec_id = tmp; + *is_new = false; + return 0; + } + + /* otherwise it's a new ID that needs to be set up in specs map and + * returned back to usdt_manager when USDT link is detached + */ + new_ids = libbpf_reallocarray(link->spec_ids, link->spec_cnt + 1, sizeof(*link->spec_ids)); + if (!new_ids) + return -ENOMEM; + link->spec_ids = new_ids; + + /* get next free spec ID, giving preference to free list, if not empty */ + if (man->free_spec_cnt) { + *spec_id = man->free_spec_ids[man->free_spec_cnt - 1]; + + /* cache spec ID for current spec string for future lookups */ + err = hashmap__add(specs_hash, target->spec_str, *spec_id); + if (err) + return err; + + man->free_spec_cnt--; + } else { + /* don't allocate spec ID bigger than what fits in specs map */ + if (man->next_free_spec_id >= bpf_map__max_entries(man->specs_map)) + return -E2BIG; + + *spec_id = man->next_free_spec_id; + + /* cache spec ID for current spec string for future lookups */ + err = hashmap__add(specs_hash, target->spec_str, *spec_id); + if (err) + return err; + + man->next_free_spec_id++; + } + + /* remember new spec ID in the link for later return back to free list on detach */ + link->spec_ids[link->spec_cnt] = *spec_id; + link->spec_cnt++; + *is_new = true; + return 0; +} + +struct bpf_link *usdt_manager_attach_usdt(struct usdt_manager *man, const struct bpf_program *prog, + pid_t pid, const char *path, + const char *usdt_provider, const char *usdt_name, + __u64 usdt_cookie) +{ + int i, fd, err, spec_map_fd, ip_map_fd; + LIBBPF_OPTS(bpf_uprobe_opts, opts); + struct hashmap *specs_hash = NULL; + struct bpf_link_usdt *link = NULL; + struct usdt_target *targets = NULL; + size_t target_cnt; + Elf *elf; + + spec_map_fd = bpf_map__fd(man->specs_map); + ip_map_fd = bpf_map__fd(man->ip_to_spec_id_map); + + /* TODO: perform path resolution similar to uprobe's */ + fd = open(path, O_RDONLY); + if (fd < 0) { + err = -errno; + pr_warn("usdt: failed to open ELF binary '%s': %d\n", path, err); + return libbpf_err_ptr(err); + } + + elf = elf_begin(fd, ELF_C_READ_MMAP, NULL); + if (!elf) { + err = -EBADF; + pr_warn("usdt: failed to parse ELF binary '%s': %s\n", path, elf_errmsg(-1)); + goto err_out; + } + + err = sanity_check_usdt_elf(elf, path); + if (err) + goto err_out; + + /* normalize PID filter */ + if (pid < 0) + pid = -1; + else if (pid == 0) + pid = getpid(); + + /* discover USDT in given binary, optionally limiting + * activations to a given PID, if pid > 0 + */ + err = collect_usdt_targets(man, elf, path, pid, usdt_provider, usdt_name, + usdt_cookie, &targets, &target_cnt); + if (err <= 0) { + err = (err == 0) ? -ENOENT : err; + goto err_out; + } + + specs_hash = hashmap__new(specs_hash_fn, specs_equal_fn, NULL); + if (IS_ERR(specs_hash)) { + err = PTR_ERR(specs_hash); + goto err_out; + } + + link = calloc(1, sizeof(*link)); + if (!link) { + err = -ENOMEM; + goto err_out; + } + + link->usdt_man = man; + link->link.detach = &bpf_link_usdt_detach; + link->link.dealloc = &bpf_link_usdt_dealloc; + + link->uprobes = calloc(target_cnt, sizeof(*link->uprobes)); + if (!link->uprobes) { + err = -ENOMEM; + goto err_out; + } + + for (i = 0; i < target_cnt; i++) { + struct usdt_target *target = &targets[i]; + struct bpf_link *uprobe_link; + bool is_new; + int spec_id; + + /* Spec ID can be either reused or newly allocated. If it is + * newly allocated, we'll need to fill out spec map, otherwise + * entire spec should be valid and can be just used by a new + * uprobe. We reuse spec when USDT arg spec is identical. We + * also never share specs between two different USDT + * attachments ("links"), so all the reused specs already + * share USDT cookie value implicitly. + */ + err = allocate_spec_id(man, specs_hash, link, target, &spec_id, &is_new); + if (err) + goto err_out; + + if (is_new && bpf_map_update_elem(spec_map_fd, &spec_id, &target->spec, BPF_ANY)) { + err = -errno; + pr_warn("usdt: failed to set USDT spec #%d for '%s:%s' in '%s': %d\n", + spec_id, usdt_provider, usdt_name, path, err); + goto err_out; + } + if (!man->has_bpf_cookie && + bpf_map_update_elem(ip_map_fd, &target->abs_ip, &spec_id, BPF_NOEXIST)) { + err = -errno; + if (err == -EEXIST) { + pr_warn("usdt: IP collision detected for spec #%d for '%s:%s' in '%s'\n", + spec_id, usdt_provider, usdt_name, path); + } else { + pr_warn("usdt: failed to map IP 0x%lx to spec #%d for '%s:%s' in '%s': %d\n", + target->abs_ip, spec_id, usdt_provider, usdt_name, + path, err); + } + goto err_out; + } + + opts.ref_ctr_offset = target->sema_off; + opts.bpf_cookie = man->has_bpf_cookie ? spec_id : 0; + uprobe_link = bpf_program__attach_uprobe_opts(prog, pid, path, + target->rel_ip, &opts); + err = libbpf_get_error(uprobe_link); + if (err) { + pr_warn("usdt: failed to attach uprobe #%d for '%s:%s' in '%s': %d\n", + i, usdt_provider, usdt_name, path, err); + goto err_out; + } + + link->uprobes[i].link = uprobe_link; + link->uprobes[i].abs_ip = target->abs_ip; + link->uprobe_cnt++; + } + + free(targets); + hashmap__free(specs_hash); + elf_end(elf); + close(fd); + + return &link->link; + +err_out: + if (link) + bpf_link__destroy(&link->link); + free(targets); + hashmap__free(specs_hash); + if (elf) + elf_end(elf); + close(fd); + return libbpf_err_ptr(err); +} + +/* Parse out USDT ELF note from '.note.stapsdt' section. + * Logic inspired by perf's code. + */ +static int parse_usdt_note(Elf *elf, const char *path, GElf_Nhdr *nhdr, + const char *data, size_t name_off, size_t desc_off, + struct usdt_note *note) +{ + const char *provider, *name, *args; + long addrs[3]; + size_t len; + + /* sanity check USDT note name and type first */ + if (strncmp(data + name_off, USDT_NOTE_NAME, nhdr->n_namesz) != 0) + return -EINVAL; + if (nhdr->n_type != USDT_NOTE_TYPE) + return -EINVAL; + + /* sanity check USDT note contents ("description" in ELF terminology) */ + len = nhdr->n_descsz; + data = data + desc_off; + + /* +3 is the very minimum required to store three empty strings */ + if (len < sizeof(addrs) + 3) + return -EINVAL; + + /* get location, base, and semaphore addrs */ + memcpy(&addrs, data, sizeof(addrs)); + + /* parse string fields: provider, name, args */ + provider = data + sizeof(addrs); + + name = (const char *)memchr(provider, '\0', data + len - provider); + if (!name) /* non-zero-terminated provider */ + return -EINVAL; + name++; + if (name >= data + len || *name == '\0') /* missing or empty name */ + return -EINVAL; + + args = memchr(name, '\0', data + len - name); + if (!args) /* non-zero-terminated name */ + return -EINVAL; + ++args; + if (args >= data + len) /* missing arguments spec */ + return -EINVAL; + + note->provider = provider; + note->name = name; + if (*args == '\0' || *args == ':') + note->args = ""; + else + note->args = args; + note->loc_addr = addrs[0]; + note->base_addr = addrs[1]; + note->sema_addr = addrs[2]; + + return 0; +} + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg, int *arg_sz); + +static int parse_usdt_spec(struct usdt_spec *spec, const struct usdt_note *note, __u64 usdt_cookie) +{ + struct usdt_arg_spec *arg; + const char *s; + int arg_sz, len; + + spec->usdt_cookie = usdt_cookie; + spec->arg_cnt = 0; + + s = note->args; + while (s[0]) { + if (spec->arg_cnt >= USDT_MAX_ARG_CNT) { + pr_warn("usdt: too many USDT arguments (> %d) for '%s:%s' with args spec '%s'\n", + USDT_MAX_ARG_CNT, note->provider, note->name, note->args); + return -E2BIG; + } + + arg = &spec->args[spec->arg_cnt]; + len = parse_usdt_arg(s, spec->arg_cnt, arg, &arg_sz); + if (len < 0) + return len; + + arg->arg_signed = arg_sz < 0; + if (arg_sz < 0) + arg_sz = -arg_sz; + + switch (arg_sz) { + case 1: case 2: case 4: case 8: + arg->arg_bitshift = 64 - arg_sz * 8; + break; + default: + pr_warn("usdt: unsupported arg #%d (spec '%s') size: %d\n", + spec->arg_cnt, s, arg_sz); + return -EINVAL; + } + + s += len; + spec->arg_cnt++; + } + + return 0; +} + +/* Architecture-specific logic for parsing USDT argument location specs */ + +#if defined(__x86_64__) || defined(__i386__) + +static int calc_pt_regs_off(const char *reg_name) +{ + static struct { + const char *names[4]; + size_t pt_regs_off; + } reg_map[] = { +#ifdef __x86_64__ +#define reg_off(reg64, reg32) offsetof(struct pt_regs, reg64) +#else +#define reg_off(reg64, reg32) offsetof(struct pt_regs, reg32) +#endif + { {"rip", "eip", "", ""}, reg_off(rip, eip) }, + { {"rax", "eax", "ax", "al"}, reg_off(rax, eax) }, + { {"rbx", "ebx", "bx", "bl"}, reg_off(rbx, ebx) }, + { {"rcx", "ecx", "cx", "cl"}, reg_off(rcx, ecx) }, + { {"rdx", "edx", "dx", "dl"}, reg_off(rdx, edx) }, + { {"rsi", "esi", "si", "sil"}, reg_off(rsi, esi) }, + { {"rdi", "edi", "di", "dil"}, reg_off(rdi, edi) }, + { {"rbp", "ebp", "bp", "bpl"}, reg_off(rbp, ebp) }, + { {"rsp", "esp", "sp", "spl"}, reg_off(rsp, esp) }, +#undef reg_off +#ifdef __x86_64__ + { {"r8", "r8d", "r8w", "r8b"}, offsetof(struct pt_regs, r8) }, + { {"r9", "r9d", "r9w", "r9b"}, offsetof(struct pt_regs, r9) }, + { {"r10", "r10d", "r10w", "r10b"}, offsetof(struct pt_regs, r10) }, + { {"r11", "r11d", "r11w", "r11b"}, offsetof(struct pt_regs, r11) }, + { {"r12", "r12d", "r12w", "r12b"}, offsetof(struct pt_regs, r12) }, + { {"r13", "r13d", "r13w", "r13b"}, offsetof(struct pt_regs, r13) }, + { {"r14", "r14d", "r14w", "r14b"}, offsetof(struct pt_regs, r14) }, + { {"r15", "r15d", "r15w", "r15b"}, offsetof(struct pt_regs, r15) }, +#endif + }; + int i, j; + + for (i = 0; i < ARRAY_SIZE(reg_map); i++) { + for (j = 0; j < ARRAY_SIZE(reg_map[i].names); j++) { + if (strcmp(reg_name, reg_map[i].names[j]) == 0) + return reg_map[i].pt_regs_off; + } + } + + pr_warn("usdt: unrecognized register '%s'\n", reg_name); + return -ENOENT; +} + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg, int *arg_sz) +{ + char reg_name[16]; + int len, reg_off; + long off; + + if (sscanf(arg_str, " %d @ %ld ( %%%15[^)] ) %n", arg_sz, &off, reg_name, &len) == 3) { + /* Memory dereference case, e.g., -4@-20(%rbp) */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = off; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ ( %%%15[^)] ) %n", arg_sz, reg_name, &len) == 2) { + /* Memory dereference case without offset, e.g., 8@(%rsp) */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ %%%15s %n", arg_sz, reg_name, &len) == 2) { + /* Register read case, e.g., -4@%eax */ + arg->arg_type = USDT_ARG_REG; + arg->val_off = 0; + + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ $%ld %n", arg_sz, &off, &len) == 2) { + /* Constant value case, e.g., 4@$71 */ + arg->arg_type = USDT_ARG_CONST; + arg->val_off = off; + arg->reg_off = 0; + } else { + pr_warn("usdt: unrecognized arg #%d spec '%s'\n", arg_num, arg_str); + return -EINVAL; + } + + return len; +} + +#elif defined(__s390x__) + +/* Do not support __s390__ for now, since user_pt_regs is broken with -m31. */ + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg, int *arg_sz) +{ + unsigned int reg; + int len; + long off; + + if (sscanf(arg_str, " %d @ %ld ( %%r%u ) %n", arg_sz, &off, ®, &len) == 3) { + /* Memory dereference case, e.g., -2@-28(%r15) */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = off; + if (reg > 15) { + pr_warn("usdt: unrecognized register '%%r%u'\n", reg); + return -EINVAL; + } + arg->reg_off = offsetof(user_pt_regs, gprs[reg]); + } else if (sscanf(arg_str, " %d @ %%r%u %n", arg_sz, ®, &len) == 2) { + /* Register read case, e.g., -8@%r0 */ + arg->arg_type = USDT_ARG_REG; + arg->val_off = 0; + if (reg > 15) { + pr_warn("usdt: unrecognized register '%%r%u'\n", reg); + return -EINVAL; + } + arg->reg_off = offsetof(user_pt_regs, gprs[reg]); + } else if (sscanf(arg_str, " %d @ %ld %n", arg_sz, &off, &len) == 2) { + /* Constant value case, e.g., 4@71 */ + arg->arg_type = USDT_ARG_CONST; + arg->val_off = off; + arg->reg_off = 0; + } else { + pr_warn("usdt: unrecognized arg #%d spec '%s'\n", arg_num, arg_str); + return -EINVAL; + } + + return len; +} + +#elif defined(__aarch64__) + +static int calc_pt_regs_off(const char *reg_name) +{ + int reg_num; + + if (sscanf(reg_name, "x%d", ®_num) == 1) { + if (reg_num >= 0 && reg_num < 31) + return offsetof(struct user_pt_regs, regs[reg_num]); + } else if (strcmp(reg_name, "sp") == 0) { + return offsetof(struct user_pt_regs, sp); + } + pr_warn("usdt: unrecognized register '%s'\n", reg_name); + return -ENOENT; +} + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg, int *arg_sz) +{ + char reg_name[16]; + int len, reg_off; + long off; + + if (sscanf(arg_str, " %d @ \[ %15[a-z0-9] , %ld ] %n", arg_sz, reg_name, &off, &len) == 3) { + /* Memory dereference case, e.g., -4@[sp, 96] */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = off; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ \[ %15[a-z0-9] ] %n", arg_sz, reg_name, &len) == 2) { + /* Memory dereference case, e.g., -4@[sp] */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ %ld %n", arg_sz, &off, &len) == 2) { + /* Constant value case, e.g., 4@5 */ + arg->arg_type = USDT_ARG_CONST; + arg->val_off = off; + arg->reg_off = 0; + } else if (sscanf(arg_str, " %d @ %15[a-z0-9] %n", arg_sz, reg_name, &len) == 2) { + /* Register read case, e.g., -8@x4 */ + arg->arg_type = USDT_ARG_REG; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else { + pr_warn("usdt: unrecognized arg #%d spec '%s'\n", arg_num, arg_str); + return -EINVAL; + } + + return len; +} + +#elif defined(__riscv) + +static int calc_pt_regs_off(const char *reg_name) +{ + static struct { + const char *name; + size_t pt_regs_off; + } reg_map[] = { + { "ra", offsetof(struct user_regs_struct, ra) }, + { "sp", offsetof(struct user_regs_struct, sp) }, + { "gp", offsetof(struct user_regs_struct, gp) }, + { "tp", offsetof(struct user_regs_struct, tp) }, + { "a0", offsetof(struct user_regs_struct, a0) }, + { "a1", offsetof(struct user_regs_struct, a1) }, + { "a2", offsetof(struct user_regs_struct, a2) }, + { "a3", offsetof(struct user_regs_struct, a3) }, + { "a4", offsetof(struct user_regs_struct, a4) }, + { "a5", offsetof(struct user_regs_struct, a5) }, + { "a6", offsetof(struct user_regs_struct, a6) }, + { "a7", offsetof(struct user_regs_struct, a7) }, + { "s0", offsetof(struct user_regs_struct, s0) }, + { "s1", offsetof(struct user_regs_struct, s1) }, + { "s2", offsetof(struct user_regs_struct, s2) }, + { "s3", offsetof(struct user_regs_struct, s3) }, + { "s4", offsetof(struct user_regs_struct, s4) }, + { "s5", offsetof(struct user_regs_struct, s5) }, + { "s6", offsetof(struct user_regs_struct, s6) }, + { "s7", offsetof(struct user_regs_struct, s7) }, + { "s8", offsetof(struct user_regs_struct, rv_s8) }, + { "s9", offsetof(struct user_regs_struct, s9) }, + { "s10", offsetof(struct user_regs_struct, s10) }, + { "s11", offsetof(struct user_regs_struct, s11) }, + { "t0", offsetof(struct user_regs_struct, t0) }, + { "t1", offsetof(struct user_regs_struct, t1) }, + { "t2", offsetof(struct user_regs_struct, t2) }, + { "t3", offsetof(struct user_regs_struct, t3) }, + { "t4", offsetof(struct user_regs_struct, t4) }, + { "t5", offsetof(struct user_regs_struct, t5) }, + { "t6", offsetof(struct user_regs_struct, t6) }, + }; + int i; + + for (i = 0; i < ARRAY_SIZE(reg_map); i++) { + if (strcmp(reg_name, reg_map[i].name) == 0) + return reg_map[i].pt_regs_off; + } + + pr_warn("usdt: unrecognized register '%s'\n", reg_name); + return -ENOENT; +} + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg, int *arg_sz) +{ + char reg_name[16]; + int len, reg_off; + long off; + + if (sscanf(arg_str, " %d @ %ld ( %15[a-z0-9] ) %n", arg_sz, &off, reg_name, &len) == 3) { + /* Memory dereference case, e.g., -8@-88(s0) */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = off; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ %ld %n", arg_sz, &off, &len) == 2) { + /* Constant value case, e.g., 4@5 */ + arg->arg_type = USDT_ARG_CONST; + arg->val_off = off; + arg->reg_off = 0; + } else if (sscanf(arg_str, " %d @ %15[a-z0-9] %n", arg_sz, reg_name, &len) == 2) { + /* Register read case, e.g., -8@a1 */ + arg->arg_type = USDT_ARG_REG; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else { + pr_warn("usdt: unrecognized arg #%d spec '%s'\n", arg_num, arg_str); + return -EINVAL; + } + + return len; +} + +#elif defined(__arm__) + +static int calc_pt_regs_off(const char *reg_name) +{ + static struct { + const char *name; + size_t pt_regs_off; + } reg_map[] = { + { "r0", offsetof(struct pt_regs, uregs[0]) }, + { "r1", offsetof(struct pt_regs, uregs[1]) }, + { "r2", offsetof(struct pt_regs, uregs[2]) }, + { "r3", offsetof(struct pt_regs, uregs[3]) }, + { "r4", offsetof(struct pt_regs, uregs[4]) }, + { "r5", offsetof(struct pt_regs, uregs[5]) }, + { "r6", offsetof(struct pt_regs, uregs[6]) }, + { "r7", offsetof(struct pt_regs, uregs[7]) }, + { "r8", offsetof(struct pt_regs, uregs[8]) }, + { "r9", offsetof(struct pt_regs, uregs[9]) }, + { "r10", offsetof(struct pt_regs, uregs[10]) }, + { "fp", offsetof(struct pt_regs, uregs[11]) }, + { "ip", offsetof(struct pt_regs, uregs[12]) }, + { "sp", offsetof(struct pt_regs, uregs[13]) }, + { "lr", offsetof(struct pt_regs, uregs[14]) }, + { "pc", offsetof(struct pt_regs, uregs[15]) }, + }; + int i; + + for (i = 0; i < ARRAY_SIZE(reg_map); i++) { + if (strcmp(reg_name, reg_map[i].name) == 0) + return reg_map[i].pt_regs_off; + } + + pr_warn("usdt: unrecognized register '%s'\n", reg_name); + return -ENOENT; +} + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg, int *arg_sz) +{ + char reg_name[16]; + int len, reg_off; + long off; + + if (sscanf(arg_str, " %d @ \[ %15[a-z0-9] , #%ld ] %n", + arg_sz, reg_name, &off, &len) == 3) { + /* Memory dereference case, e.g., -4@[fp, #96] */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = off; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ \[ %15[a-z0-9] ] %n", arg_sz, reg_name, &len) == 2) { + /* Memory dereference case, e.g., -4@[sp] */ + arg->arg_type = USDT_ARG_REG_DEREF; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else if (sscanf(arg_str, " %d @ #%ld %n", arg_sz, &off, &len) == 2) { + /* Constant value case, e.g., 4@#5 */ + arg->arg_type = USDT_ARG_CONST; + arg->val_off = off; + arg->reg_off = 0; + } else if (sscanf(arg_str, " %d @ %15[a-z0-9] %n", arg_sz, reg_name, &len) == 2) { + /* Register read case, e.g., -8@r4 */ + arg->arg_type = USDT_ARG_REG; + arg->val_off = 0; + reg_off = calc_pt_regs_off(reg_name); + if (reg_off < 0) + return reg_off; + arg->reg_off = reg_off; + } else { + pr_warn("usdt: unrecognized arg #%d spec '%s'\n", arg_num, arg_str); + return -EINVAL; + } + + return len; +} + +#else + +static int parse_usdt_arg(const char *arg_str, int arg_num, struct usdt_arg_spec *arg, int *arg_sz) +{ + pr_warn("usdt: libbpf doesn't support USDTs on current architecture\n"); + return -ENOTSUP; +} + +#endif diff --git a/libbpf/src/zip.c b/libbpf/src/zip.c new file mode 100644 index 0000000..3f26d62 --- /dev/null +++ b/libbpf/src/zip.c @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +/* + * Routines for dealing with .zip archives. + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "libbpf_internal.h" +#include "zip.h" + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpacked" +#pragma GCC diagnostic ignored "-Wattributes" + +/* Specification of ZIP file format can be found here: + * https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT + * For a high level overview of the structure of a ZIP file see + * sections 4.3.1 - 4.3.6. + * + * Data structures appearing in ZIP files do not contain any + * padding and they might be misaligned. To allow us to safely + * operate on pointers to such structures and their members, we + * declare the types as packed. + */ + +#define END_OF_CD_RECORD_MAGIC 0x06054b50 + +/* See section 4.3.16 of the spec. */ +struct end_of_cd_record { + /* Magic value equal to END_OF_CD_RECORD_MAGIC */ + __u32 magic; + + /* Number of the file containing this structure or 0xFFFF if ZIP64 archive. + * Zip archive might span multiple files (disks). + */ + __u16 this_disk; + + /* Number of the file containing the beginning of the central directory or + * 0xFFFF if ZIP64 archive. + */ + __u16 cd_disk; + + /* Number of central directory records on this disk or 0xFFFF if ZIP64 + * archive. + */ + __u16 cd_records; + + /* Number of central directory records on all disks or 0xFFFF if ZIP64 + * archive. + */ + __u16 cd_records_total; + + /* Size of the central directory record or 0xFFFFFFFF if ZIP64 archive. */ + __u32 cd_size; + + /* Offset of the central directory from the beginning of the archive or + * 0xFFFFFFFF if ZIP64 archive. + */ + __u32 cd_offset; + + /* Length of comment data following end of central directory record. */ + __u16 comment_length; + + /* Up to 64k of arbitrary bytes. */ + /* uint8_t comment[comment_length] */ +} __attribute__((packed)); + +#define CD_FILE_HEADER_MAGIC 0x02014b50 +#define FLAG_ENCRYPTED (1 << 0) +#define FLAG_HAS_DATA_DESCRIPTOR (1 << 3) + +/* See section 4.3.12 of the spec. */ +struct cd_file_header { + /* Magic value equal to CD_FILE_HEADER_MAGIC. */ + __u32 magic; + __u16 version; + /* Minimum zip version needed to extract the file. */ + __u16 min_version; + __u16 flags; + __u16 compression; + __u16 last_modified_time; + __u16 last_modified_date; + __u32 crc; + __u32 compressed_size; + __u32 uncompressed_size; + __u16 file_name_length; + __u16 extra_field_length; + __u16 file_comment_length; + /* Number of the disk where the file starts or 0xFFFF if ZIP64 archive. */ + __u16 disk; + __u16 internal_attributes; + __u32 external_attributes; + /* Offset from the start of the disk containing the local file header to the + * start of the local file header. + */ + __u32 offset; +} __attribute__((packed)); + +#define LOCAL_FILE_HEADER_MAGIC 0x04034b50 + +/* See section 4.3.7 of the spec. */ +struct local_file_header { + /* Magic value equal to LOCAL_FILE_HEADER_MAGIC. */ + __u32 magic; + /* Minimum zip version needed to extract the file. */ + __u16 min_version; + __u16 flags; + __u16 compression; + __u16 last_modified_time; + __u16 last_modified_date; + __u32 crc; + __u32 compressed_size; + __u32 uncompressed_size; + __u16 file_name_length; + __u16 extra_field_length; +} __attribute__((packed)); + +#pragma GCC diagnostic pop + +struct zip_archive { + void *data; + __u32 size; + __u32 cd_offset; + __u32 cd_records; +}; + +static void *check_access(struct zip_archive *archive, __u32 offset, __u32 size) +{ + if (offset + size > archive->size || offset > offset + size) + return NULL; + + return archive->data + offset; +} + +/* Returns 0 on success, -EINVAL on error and -ENOTSUP if the eocd indicates the + * archive uses features which are not supported. + */ +static int try_parse_end_of_cd(struct zip_archive *archive, __u32 offset) +{ + __u16 comment_length, cd_records; + struct end_of_cd_record *eocd; + __u32 cd_offset, cd_size; + + eocd = check_access(archive, offset, sizeof(*eocd)); + if (!eocd || eocd->magic != END_OF_CD_RECORD_MAGIC) + return -EINVAL; + + comment_length = eocd->comment_length; + if (offset + sizeof(*eocd) + comment_length != archive->size) + return -EINVAL; + + cd_records = eocd->cd_records; + if (eocd->this_disk != 0 || eocd->cd_disk != 0 || eocd->cd_records_total != cd_records) + /* This is a valid eocd, but we only support single-file non-ZIP64 archives. */ + return -ENOTSUP; + + cd_offset = eocd->cd_offset; + cd_size = eocd->cd_size; + if (!check_access(archive, cd_offset, cd_size)) + return -EINVAL; + + archive->cd_offset = cd_offset; + archive->cd_records = cd_records; + return 0; +} + +static int find_cd(struct zip_archive *archive) +{ + int64_t limit, offset; + int rc = -EINVAL; + + if (archive->size <= sizeof(struct end_of_cd_record)) + return -EINVAL; + + /* Because the end of central directory ends with a variable length array of + * up to 0xFFFF bytes we can't know exactly where it starts and need to + * search for it at the end of the file, scanning the (limit, offset] range. + */ + offset = archive->size - sizeof(struct end_of_cd_record); + limit = (int64_t)offset - (1 << 16); + + for (; offset >= 0 && offset > limit && rc != 0; offset--) { + rc = try_parse_end_of_cd(archive, offset); + if (rc == -ENOTSUP) + break; + } + return rc; +} + +struct zip_archive *zip_archive_open(const char *path) +{ + struct zip_archive *archive; + int err, fd; + off_t size; + void *data; + + fd = open(path, O_RDONLY | O_CLOEXEC); + if (fd < 0) + return ERR_PTR(-errno); + + size = lseek(fd, 0, SEEK_END); + if (size == (off_t)-1 || size > UINT32_MAX) { + close(fd); + return ERR_PTR(-EINVAL); + } + + data = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); + err = -errno; + close(fd); + + if (data == MAP_FAILED) + return ERR_PTR(err); + + archive = malloc(sizeof(*archive)); + if (!archive) { + munmap(data, size); + return ERR_PTR(-ENOMEM); + }; + + archive->data = data; + archive->size = size; + + err = find_cd(archive); + if (err) { + munmap(data, size); + free(archive); + return ERR_PTR(err); + } + + return archive; +} + +void zip_archive_close(struct zip_archive *archive) +{ + munmap(archive->data, archive->size); + free(archive); +} + +static struct local_file_header *local_file_header_at_offset(struct zip_archive *archive, + __u32 offset) +{ + struct local_file_header *lfh; + + lfh = check_access(archive, offset, sizeof(*lfh)); + if (!lfh || lfh->magic != LOCAL_FILE_HEADER_MAGIC) + return NULL; + + return lfh; +} + +static int get_entry_at_offset(struct zip_archive *archive, __u32 offset, struct zip_entry *out) +{ + struct local_file_header *lfh; + __u32 compressed_size; + const char *name; + void *data; + + lfh = local_file_header_at_offset(archive, offset); + if (!lfh) + return -EINVAL; + + offset += sizeof(*lfh); + if ((lfh->flags & FLAG_ENCRYPTED) || (lfh->flags & FLAG_HAS_DATA_DESCRIPTOR)) + return -EINVAL; + + name = check_access(archive, offset, lfh->file_name_length); + if (!name) + return -EINVAL; + + offset += lfh->file_name_length; + if (!check_access(archive, offset, lfh->extra_field_length)) + return -EINVAL; + + offset += lfh->extra_field_length; + compressed_size = lfh->compressed_size; + data = check_access(archive, offset, compressed_size); + if (!data) + return -EINVAL; + + out->compression = lfh->compression; + out->name_length = lfh->file_name_length; + out->name = name; + out->data = data; + out->data_length = compressed_size; + out->data_offset = offset; + + return 0; +} + +int zip_archive_find_entry(struct zip_archive *archive, const char *file_name, + struct zip_entry *out) +{ + size_t file_name_length = strlen(file_name); + __u32 i, offset = archive->cd_offset; + + for (i = 0; i < archive->cd_records; ++i) { + __u16 cdfh_name_length, cdfh_flags; + struct cd_file_header *cdfh; + const char *cdfh_name; + + cdfh = check_access(archive, offset, sizeof(*cdfh)); + if (!cdfh || cdfh->magic != CD_FILE_HEADER_MAGIC) + return -EINVAL; + + offset += sizeof(*cdfh); + cdfh_name_length = cdfh->file_name_length; + cdfh_name = check_access(archive, offset, cdfh_name_length); + if (!cdfh_name) + return -EINVAL; + + cdfh_flags = cdfh->flags; + if ((cdfh_flags & FLAG_ENCRYPTED) == 0 && + (cdfh_flags & FLAG_HAS_DATA_DESCRIPTOR) == 0 && + file_name_length == cdfh_name_length && + memcmp(file_name, archive->data + offset, file_name_length) == 0) { + return get_entry_at_offset(archive, cdfh->offset, out); + } + + offset += cdfh_name_length; + offset += cdfh->extra_field_length; + offset += cdfh->file_comment_length; + } + + return -ENOENT; +} diff --git a/libbpf/src/zip.h b/libbpf/src/zip.h new file mode 100644 index 0000000..1c1bb21 --- /dev/null +++ b/libbpf/src/zip.h @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +#ifndef __LIBBPF_ZIP_H +#define __LIBBPF_ZIP_H + +#include + +/* Represents an open zip archive. + * Only basic ZIP files are supported, in particular the following are not + * supported: + * - encryption + * - streaming + * - multi-part ZIP files + * - ZIP64 + */ +struct zip_archive; + +/* Carries information on name, compression method, and data corresponding to a + * file in a zip archive. + */ +struct zip_entry { + /* Compression method as defined in pkzip spec. 0 means data is uncompressed. */ + __u16 compression; + + /* Non-null terminated name of the file. */ + const char *name; + /* Length of the file name. */ + __u16 name_length; + + /* Pointer to the file data. */ + const void *data; + /* Length of the file data. */ + __u32 data_length; + /* Offset of the file data within the archive. */ + __u32 data_offset; +}; + +/* Open a zip archive. Returns NULL in case of an error. */ +struct zip_archive *zip_archive_open(const char *path); + +/* Close a zip archive and release resources. */ +void zip_archive_close(struct zip_archive *archive); + +/* Look up an entry corresponding to a file in given zip archive. */ +int zip_archive_find_entry(struct zip_archive *archive, const char *name, struct zip_entry *out); + +#endif diff --git a/tools/FlameGraph/.travis.yml b/tools/FlameGraph/.travis.yml new file mode 100644 index 0000000..e11ed35 --- /dev/null +++ b/tools/FlameGraph/.travis.yml @@ -0,0 +1,19 @@ +# Using the container-based infrastructure +sudo: false + +language: perl +perl: + - "5.24" + - "5.22" + - "5.20" + - "5.18" + - "5.16" + - "5.14" + - "5.12" + - "5.10" + +install: + /bin/true + +script: + ./test.sh diff --git a/tools/FlameGraph/README.md b/tools/FlameGraph/README.md new file mode 100644 index 0000000..1aa3ecd --- /dev/null +++ b/tools/FlameGraph/README.md @@ -0,0 +1,225 @@ +# Flame Graphs visualize profiled code + +Main Website: http://www.brendangregg.com/flamegraphs.html + +Example (click to zoom): + +[![Example](http://www.brendangregg.com/FlameGraphs/cpu-bash-flamegraph.svg)](http://www.brendangregg.com/FlameGraphs/cpu-bash-flamegraph.svg) + +Click a box to zoom the Flame Graph to this stack frame only. +To search and highlight all stack frames matching a regular expression, click the _search_ button in the upper right corner or press Ctrl-F. +By default, search is case sensitive, but this can be toggled by pressing Ctrl-I or by clicking the _ic_ button in the upper right corner. + +Other sites: +- The Flame Graph article in ACMQ and CACM: http://queue.acm.org/detail.cfm?id=2927301 http://cacm.acm.org/magazines/2016/6/202665-the-flame-graph/abstract +- CPU profiling using Linux perf\_events, DTrace, SystemTap, or ktap: http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html +- CPU profiling using XCode Instruments: http://schani.wordpress.com/2012/11/16/flame-graphs-for-instruments/ +- CPU profiling using Xperf.exe: http://randomascii.wordpress.com/2013/03/26/summarizing-xperf-cpu-usage-with-flame-graphs/ +- Memory profiling: http://www.brendangregg.com/FlameGraphs/memoryflamegraphs.html +- Other examples, updates, and news: http://www.brendangregg.com/flamegraphs.html#Updates + +Flame graphs can be created in three steps: + +1. Capture stacks +2. Fold stacks +3. flamegraph.pl + +1\. Capture stacks +================= +Stack samples can be captured using Linux perf\_events, FreeBSD pmcstat (hwpmc), DTrace, SystemTap, and many other profilers. See the stackcollapse-\* converters. + +### Linux perf\_events + +Using Linux perf\_events (aka "perf") to capture 60 seconds of 99 Hertz stack samples, both user- and kernel-level stacks, all processes: + +``` +# perf record -F 99 -a -g -- sleep 60 +# perf script > out.perf +``` + +Now only capturing PID 181: + +``` +# perf record -F 99 -p 181 -g -- sleep 60 +# perf script > out.perf +``` + +### DTrace + +Using DTrace to capture 60 seconds of kernel stacks at 997 Hertz: + +``` +# dtrace -x stackframes=100 -n 'profile-997 /arg0/ { @[stack()] = count(); } tick-60s { exit(0); }' -o out.kern_stacks +``` + +Using DTrace to capture 60 seconds of user-level stacks for PID 12345 at 97 Hertz: + +``` +# dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345 && arg1/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks +``` + +60 seconds of user-level stacks, including time spent in-kernel, for PID 12345 at 97 Hertz: + +``` +# dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks +``` + +Switch `ustack()` for `jstack()` if the application has a ustack helper to include translated frames (eg, node.js frames; see: http://dtrace.org/blogs/dap/2012/01/05/where-does-your-node-program-spend-its-time/). The rate for user-level stack collection is deliberately slower than kernel, which is especially important when using `jstack()` as it performs additional work to translate frames. + +2\. Fold stacks +============== +Use the stackcollapse programs to fold stack samples into single lines. The programs provided are: + +- `stackcollapse.pl`: for DTrace stacks +- `stackcollapse-perf.pl`: for Linux perf_events "perf script" output +- `stackcollapse-pmc.pl`: for FreeBSD pmcstat -G stacks +- `stackcollapse-stap.pl`: for SystemTap stacks +- `stackcollapse-instruments.pl`: for XCode Instruments +- `stackcollapse-vtune.pl`: for Intel VTune profiles +- `stackcollapse-ljp.awk`: for Lightweight Java Profiler +- `stackcollapse-jstack.pl`: for Java jstack(1) output +- `stackcollapse-gdb.pl`: for gdb(1) stacks +- `stackcollapse-go.pl`: for Golang pprof stacks +- `stackcollapse-vsprof.pl`: for Microsoft Visual Studio profiles +- `stackcollapse-wcp.pl`: for wallClockProfiler output + +Usage example: + +``` +For perf_events: +$ ./stackcollapse-perf.pl out.perf > out.folded + +For DTrace: +$ ./stackcollapse.pl out.kern_stacks > out.kern_folded +``` + +The output looks like this: + +``` +unix`_sys_sysenter_post_swapgs 1401 +unix`_sys_sysenter_post_swapgs;genunix`close 5 +unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf 85 +unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;c2audit`audit_closef 26 +unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;c2audit`audit_setf 5 +unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;genunix`audit_getstate 6 +unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;genunix`audit_unfalloc 2 +unix`_sys_sysenter_post_swapgs;genunix`close;genunix`closeandsetf;genunix`closef 48 +[...] +``` + +3\. flamegraph.pl +================ +Use flamegraph.pl to render a SVG. + +``` +$ ./flamegraph.pl out.kern_folded > kernel.svg +``` + +An advantage of having the folded input file (and why this is separate to flamegraph.pl) is that you can use grep for functions of interest. Eg: + +``` +$ grep cpuid out.kern_folded | ./flamegraph.pl > cpuid.svg +``` + +Provided Examples +================= + +### Linux perf\_events + +An example output from Linux "perf script" is included, gzip'd, as example-perf-stacks.txt.gz. The resulting flame graph is example-perf.svg: + +[![Example](http://www.brendangregg.com/FlameGraphs/example-perf.svg)](http://www.brendangregg.com/FlameGraphs/example-perf.svg) + +You can create this using: + +``` +$ gunzip -c example-perf-stacks.txt.gz | ./stackcollapse-perf.pl --all | ./flamegraph.pl --color=java --hash > example-perf.svg +``` + +This shows my typical workflow: I'll gzip profiles on the target, then copy them to my laptop for analysis. Since I have hundreds of profiles, I leave them gzip'd! + +Since this profile included Java, I used the flamegraph.pl --color=java palette. I've also used stackcollapse-perf.pl --all, which includes all annotations that help flamegraph.pl use separate colors for kernel and user level code. The resulting flame graph uses: green == Java, yellow == C++, red == user-mode native, orange == kernel. + +This profile was from an analysis of vert.x performance. The benchmark client, wrk, is also visible in the flame graph. + +### DTrace + +An example output from DTrace is also included, example-dtrace-stacks.txt, and the resulting flame graph, example-dtrace.svg: + +[![Example](http://www.brendangregg.com/FlameGraphs/example-dtrace.svg)](http://www.brendangregg.com/FlameGraphs/example-dtrace.svg) + +You can generate this using: + +``` +$ ./stackcollapse.pl example-stacks.txt | ./flamegraph.pl > example.svg +``` + +This was from a particular performance investigation: the Flame Graph identified that CPU time was spent in the lofs module, and quantified that time. + + +Options +======= +See the USAGE message (--help) for options: + +USAGE: ./flamegraph.pl [options] infile > outfile.svg + + --title TEXT # change title text + --subtitle TEXT # second level title (optional) + --width NUM # width of image (default 1200) + --height NUM # height of each frame (default 16) + --minwidth NUM # omit smaller functions (default 0.1 pixels) + --fonttype FONT # font type (default "Verdana") + --fontsize NUM # font size (default 12) + --countname TEXT # count type label (default "samples") + --nametype TEXT # name type label (default "Function:") + --colors PALETTE # set color palette. choices are: hot (default), mem, + # io, wakeup, chain, java, js, perl, red, green, blue, + # aqua, yellow, purple, orange + --bgcolors COLOR # set background colors. gradient choices are yellow + # (default), blue, green, grey; flat colors use "#rrggbb" + --hash # colors are keyed by function name hash + --cp # use consistent palette (palette.map) + --reverse # generate stack-reversed flame graph + --inverted # icicle graph + --flamechart # produce a flame chart (sort by time, do not merge stacks) + --negate # switch differential hues (blue<->red) + --notes TEXT # add notes comment in SVG (for debugging) + --help # this message + + eg, + ./flamegraph.pl --title="Flame Graph: malloc()" trace.txt > graph.svg + +As suggested in the example, flame graphs can process traces of any event, +such as malloc()s, provided stack traces are gathered. + + +Consistent Palette +================== +If you use the `--cp` option, it will use the $colors selection and randomly +generate the palette like normal. Any future flamegraphs created using the `--cp` +option will use the same palette map. Any new symbols from future flamegraphs +will have their colors randomly generated using the $colors selection. + +If you don't like the palette, just delete the palette.map file. + +This allows your to change your colorscheme between flamegraphs to make the +differences REALLY stand out. + +Example: + +Say we have 2 captures, one with a problem, and one when it was working +(whatever "it" is): + +``` +cat working.folded | ./flamegraph.pl --cp > working.svg +# this generates a palette.map, as per the normal random generated look. + +cat broken.folded | ./flamegraph.pl --cp --colors mem > broken.svg +# this svg will use the same palette.map for the same events, but a very +# different colorscheme for any new events. +``` + +Take a look at the demo directory for an example: + +palette-example-working.svg +palette-example-broken.svg diff --git a/tools/FlameGraph/aix-perf.pl b/tools/FlameGraph/aix-perf.pl new file mode 100755 index 0000000..1edd082 --- /dev/null +++ b/tools/FlameGraph/aix-perf.pl @@ -0,0 +1,31 @@ +#!/usr/bin/perl + +use Getopt::Std; + +getopt('urt'); + +unless ($opt_r && $opt_t){ + print "Usage: $0 [ -u user] -r sample_count -t sleep_time\n"; + exit(0); +} + +my $i; +my @proc = ""; +for ($i = 0; $i < $opt_r ; $i++){ + if ($opt_u){ + $proc = `/usr/sysv/bin/ps -u $opt_u `; + $proc =~ s/^.*\n//; + $proc =~ s/\s*(\d+).*\n/\1 /g; + @proc = split(/\s+/,$proc); + } else { + opendir(my $dh, '/proc') || die "Cant't open /proc: $!"; + @proc = grep { /^[\d]+$/ } readdir($dh); + closedir ($dh); + } + + foreach my $pid (@proc){ + my $command = "/usr/bin/procstack $pid"; + print `$command 2>/dev/null`; + } + select(undef, undef, undef, $opt_t); +} diff --git a/tools/FlameGraph/demos/README b/tools/FlameGraph/demos/README new file mode 100644 index 0000000..d47e242 --- /dev/null +++ b/tools/FlameGraph/demos/README @@ -0,0 +1,5 @@ +Flame Graph demos gathered and created for the talk "Blazing Performance with +Flame Graphs" at USENIX/LISA 2013. + +These SVGs can not be seen on github directly; save them locally first (git +clone or download), then open them in a browser (file://...). diff --git a/tools/FlameGraph/demos/brkbytes-mysql.svg b/tools/FlameGraph/demos/brkbytes-mysql.svg new file mode 100644 index 0000000..d19bffa --- /dev/null +++ b/tools/FlameGraph/demos/brkbytes-mysql.svg @@ -0,0 +1,1255 @@ + + + + + + + + + + + + +Heap Expansion Flame Graph + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +mysqld`_ZL19heap_create_handlerP10handlertonP11TABLE_SHAREP11st_mem_root (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (589,824 bytes, 2.76%) +li.. + + +mysqld`_Z22thd_prepare_connectionP3THD (7,151,616 bytes, 33.45%) +mysqld`_Z22thd_prepare_connectionP3THD + + +mysqld`_Z16dispatch_command19enum_server_commandP3THDPcj (12,017,664 bytes, 56.21%) +mysqld`_Z16dispatch_command19enum_server_commandP3THDPcj + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (589,824 bytes, 2.76%) +li.. + + +mysqld`_ZN6String10real_allocEj (1,253,376 bytes, 5.86%) +mysqld`.. + + +libmtmalloc.so.1`morecore (1,179,648 bytes, 5.52%) +libmtma.. + + +all (21,381,120 bytes, 100%) + + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (147,456 bytes, 0.69%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`_Z21find_or_create_digestP10PFS_threadP18PSI_digest_storagePKcj (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (589,824 bytes, 2.76%) +li.. + + +mysqld`_ZN11ha_innobase4openEPKcij (147,456 bytes, 0.69%) + + +libc.so.1`sbrk (1,032,192 bytes, 4.83%) +libc.s.. + + +mysqld`my_malloc (2,359,296 bytes, 11.03%) +mysqld`my_malloc + + +mysqld`_ZN7handler7ha_openEP5TABLEPKcii (147,456 bytes, 0.69%) + + +libc.so.1`sbrk (2,064,384 bytes, 9.66%) +libc.so.1`sbrk + + +mysqld`_Z23dict_table_open_on_namePKcmm17dict_err_ignore_t (73,728 bytes, 0.34%) + + +mysqld`_Z30open_normal_and_derived_tablesP3THDP10TABLE_LISTj (294,912 bytes, 1.38%) + + +mysqld`_Z15get_new_handlerP11TABLE_SHAREP11st_mem_rootP10handlerton (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (589,824 bytes, 2.76%) +li.. + + +mysqld`_ZL16buf_do_LRU_batchP10buf_pool_tm (147,456 bytes, 0.69%) + + +libc.so.1`_brk_unlocked (1,253,376 bytes, 5.86%) +libc.so.. + + +mysqld`_ZN4ItemnwEmP11st_mem_root (147,456 bytes, 0.69%) + + +libmtmalloc.so.1`malloc_internal (2,064,384 bytes, 9.66%) +libmtmalloc.so.. + + +libmtmalloc.so.1`morecore (1,179,648 bytes, 5.52%) +libmtma.. + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`handle_one_connection (20,275,200 bytes, 94.83%) +mysqld`handle_one_connection + + +mysqld`_ZN13st_join_table10sort_tableEv (2,211,840 bytes, 10.34%) +mysqld`_ZN13st_.. + + +libmtmalloc.so.1`malloc (1,179,648 bytes, 5.52%) +libmtma.. + + +mysqld`_ZL21execute_sqlcom_selectP3THDP10TABLE_LIST (884,736 bytes, 4.14%) +mysq.. + + +mysqld`_Z21mem_heap_create_blockP16mem_block_info_tmmPKcm (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (1,032,192 bytes, 4.83%) +libmtm.. + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +mysqld`alloc_root (147,456 bytes, 0.69%) + + +libmtmalloc.so.1`malloc (589,824 bytes, 2.76%) +li.. + + +mysqld`_ZN18Prepared_statement12execute_loopEP6StringbPhS2_ (3,170,304 bytes, 14.83%) +mysqld`_ZN18Prepared_s.. + + +libc.so.1`_brk_unlocked (1,179,648 bytes, 5.52%) +libc.so.. + + +libc.so.1`_brk_unlocked (294,912 bytes, 1.38%) + + +mysqld`_Z9lex_startP3THD (1,179,648 bytes, 5.52%) +mysqld`.. + + +libmtmalloc.so.1`malloc_internal (147,456 bytes, 0.69%) + + +libc.so.1`sbrk (1,253,376 bytes, 5.86%) +libc.so.. + + +libc.so.1`_brk_unlocked (1,105,920 bytes, 5.17%) +libc.s.. + + +mysqld`my_malloc (1,253,376 bytes, 5.86%) +mysqld`.. + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (2,064,384 bytes, 9.66%) +libmtmalloc.so.. + + +libmtmalloc.so.1`malloc (294,912 bytes, 1.38%) + + +libmtmalloc.so.1`malloc (1,179,648 bytes, 5.52%) +libmtma.. + + +mysqld`my_malloc (368,640 bytes, 1.72%) + + +libc.so.1`_brk_unlocked (368,640 bytes, 1.72%) + + +libmtmalloc.so.1`calloc (1,105,920 bytes, 5.17%) +libmtm.. + + +mysqld`_Z11open_tablesP3THDPP10TABLE_LISTPjjP19Prelocking_strategy (294,912 bytes, 1.38%) + + +mysqld`_Z19create_schema_tableP3THDP10TABLE_LIST (294,912 bytes, 1.38%) + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`_ZN4JOIN4execEv (589,824 bytes, 2.76%) +my.. + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +mysqld`_Z10open_tableP3THDP10TABLE_LISTP18Open_table_context (221,184 bytes, 1.03%) + + +libc.so.1`sbrk (1,032,192 bytes, 4.83%) +libc.s.. + + +mysqld`_Z24do_handle_one_connectionP3THD (20,275,200 bytes, 94.83%) +mysqld`_Z24do_handle_one_connectionP3THD + + +mysqld`_Z24get_default_db_collationP3THDPKc (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (1,179,648 bytes, 5.52%) +libc.so.. + + +libc.so.1`_brk_unlocked (2,359,296 bytes, 11.03%) +libc.so.1`_brk_u.. + + +mysqld`alloc_root (147,456 bytes, 0.69%) + + +libc.so.1`sbrk (147,456 bytes, 0.69%) + + +libmtmalloc.so.1`malloc (1,253,376 bytes, 5.86%) +libmtma.. + + +mysqld`_ZN4JOIN4execEv (2,211,840 bytes, 10.34%) +mysqld`_ZN4JOIN.. + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (2,359,296 bytes, 11.03%) +libmtmalloc.so.1.. + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`open_cached_file (1,032,192 bytes, 4.83%) +mysqld.. + + +mysqld`_ZN18Prepared_statement7executeEP6Stringb (3,170,304 bytes, 14.83%) +mysqld`_ZN18Prepared_s.. + + +mysqld`_Z22trx_allocate_for_mysqlv (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +mysqld`my_malloc (1,179,648 bytes, 5.52%) +mysqld`.. + + +mysqld`_Z17dict_stats_updateP12dict_table_t23dict_stats_upd_option_t (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +libc.so.1`_thrp_setup (20,422,656 bytes, 95.52%) +libc.so.1`_thrp_setup + + +mysqld`_Z15mysql_change_dbP3THDPK19st_mysql_lex_stringb (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (1,032,192 bytes, 4.83%) +libc.s.. + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +mysqld`_Z12make_db_listP3THDP4ListI19st_mysql_lex_stringEP22st_lookup_field_valuesPb (147,456 bytes, 0.69%) + + +mysqld`_ZN11ha_innobase5extraE17ha_extra_function (3,096,576 bytes, 14.48%) +mysqld`_ZN11ha_innobas.. + + +mysqld`_Z12mysql_selectP3THDP10TABLE_LISTjR4ListI4ItemEPS4_P10SQL_I_ListI8st_orderESB_S7_yP13select_resultP18st_select_lex_unitP13st_select_lex (2,580,480 bytes, 12.07%) +mysqld`_Z12mysql_s.. + + +mysqld`init_alloc_root (73,728 bytes, 0.34%) + + +mysqld`init_alloc_root (2,359,296 bytes, 11.03%) +mysqld`init_allo.. + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (2,285,568 bytes, 10.69%) +libc.so.1`_brk_.. + + +libc.so.1`sbrk (2,285,568 bytes, 10.69%) +libc.so.1`sbrk + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +mysqld`end_statement_v1 (73,728 bytes, 0.34%) + + +mysqld`_Z10open_tableP3THDP10TABLE_LISTP18Open_table_context (589,824 bytes, 2.76%) +my.. + + +mysqld`_Z13handle_selectP3THDP13select_resultm (589,824 bytes, 2.76%) +my.. + + +mysqld`my_malloc (1,105,920 bytes, 5.17%) +mysqld.. + + +libmtmalloc.so.1`morecore (1,179,648 bytes, 5.52%) +libmtma.. + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +mysqld`_ZL24server_mpvio_read_packetP13st_plugin_vioPPh (1,179,648 bytes, 5.52%) +mysqld`.. + + +libc.so.1`sbrk (1,105,920 bytes, 5.17%) +libc.s.. + + +libmtmalloc.so.1`morecore (1,179,648 bytes, 5.52%) +libmtma.. + + +libmtmalloc.so.1`morecore (147,456 bytes, 0.69%) + + +mysqld`_Z14get_all_tablesP3THDP10TABLE_LISTP4Item (368,640 bytes, 1.72%) + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`_ZL28send_server_handshake_packetP9MPVIO_EXTPKcj (1,179,648 bytes, 5.52%) +mysqld`.. + + +mysqld`my_malloc (2,285,568 bytes, 10.69%) +mysqld`my_malloc + + +mysqld`alloc_root (368,640 bytes, 1.72%) + + +libc.so.1`_lwp_start (20,422,656 bytes, 95.52%) +libc.so.1`_lwp_start + + +mysqld`_Z16create_tmp_tableP3THDP15TMP_TABLE_PARAMR4ListI4ItemEP8st_orderbbyyPKc (294,912 bytes, 1.38%) + + +libmtmalloc.so.1`malloc (1,179,648 bytes, 5.52%) +libmtma.. + + +mysqld`_Z30open_normal_and_derived_tablesP3THDP10TABLE_LISTj (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +mysqld`init_alloc_root (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (2,285,568 bytes, 10.69%) +libmtmalloc.so... + + +mysqld`_Z30open_normal_and_derived_tablesP3THDP10TABLE_LISTj (3,096,576 bytes, 14.48%) +mysqld`_Z30open_normal.. + + +mysqld`_Z27trx_allocate_for_backgroundv (3,096,576 bytes, 14.48%) +mysqld`_Z27trx_allocat.. + + +mysqld`_Z11mysqld_mainiPPc (958,464 bytes, 4.48%) +mysql.. + + +mysqld`_Z14init_sql_allocP11st_mem_rootjj (2,359,296 bytes, 11.03%) +mysqld`_Z14init_.. + + +mysqld`_Z26handle_connections_socketsv (958,464 bytes, 4.48%) +mysql.. + + +libc.so.1`_brk_unlocked (1,105,920 bytes, 5.17%) +libc.s.. + + +mysqld`_Z27trx_allocate_for_backgroundv (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (1,105,920 bytes, 5.17%) +libmtm.. + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (147,456 bytes, 0.69%) + + +mysqld`_Z28prepare_new_connection_stateP3THD (2,285,568 bytes, 10.69%) +mysqld`_Z28prep.. + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`_Z18mysqld_list_fieldsP3THDP10TABLE_LISTPKc (73,728 bytes, 0.34%) + + +mysqld`_Z30open_normal_and_derived_tablesP3THDP10TABLE_LISTj (221,184 bytes, 1.03%) + + +mysqld`_Z27trx_allocate_for_backgroundv (73,728 bytes, 0.34%) + + +mysqld`my_malloc (1,179,648 bytes, 5.52%) +mysqld`.. + + +mysqld`init_alloc_root (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +mysqld`_Z12mysql_selectP3THDP10TABLE_LISTjR4ListI4ItemEPS4_P10SQL_I_ListI8st_orderESB_S7_yP13select_resultP18st_select_lex_unitP13st_select_lex (589,824 bytes, 2.76%) +my.. + + +libmtmalloc.so.1`morecore (2,359,296 bytes, 11.03%) +libmtmalloc.so.1.. + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (2,285,568 bytes, 10.69%) +libmtmalloc.so... + + +mysqld`_ZL20make_join_statisticsP4JOINP10TABLE_LISTP4ItemP14Mem_root_arrayI7Key_useLb1EEb (368,640 bytes, 1.72%) + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +mysqld`_ZN18Prepared_statementC1EP3THD (2,359,296 bytes, 11.03%) +mysqld`_ZN18Prep.. + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`my_malloc (147,456 bytes, 0.69%) + + +libmtmalloc.so.1`malloc_internal (1,105,920 bytes, 5.17%) +libmtm.. + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`my_dir (73,728 bytes, 0.34%) + + +mysqld`_ZL29parse_client_handshake_packetP9MPVIO_EXTPPhm (1,179,648 bytes, 5.52%) +mysqld`.. + + +libc.so.1`_brk_unlocked (589,824 bytes, 2.76%) +li.. + + +mysqld`_Z20fill_schema_schemataP3THDP10TABLE_LISTP4Item (147,456 bytes, 0.69%) + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (1,179,648 bytes, 5.52%) +libmtma.. + + +mysqld`_Z15os_event_createv (1,032,192 bytes, 4.83%) +mysqld.. + + +libmtmalloc.so.1`morecore (1,105,920 bytes, 5.17%) +libmtm.. + + +mysqld`_Z18mysql_schema_tableP3THDP3LEXP10TABLE_LIST (294,912 bytes, 1.38%) + + +mysqld`my_malloc (589,824 bytes, 2.76%) +my.. + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +mysqld`_ZN9base_list10push_frontEPv (1,179,648 bytes, 5.52%) +mysqld`.. + + +libstdc++.so.6.0.17`_Znwm (294,912 bytes, 1.38%) + + +mysqld`_ZL25fill_schema_table_by_openP3THDbP5TABLEP15st_schema_tableP19st_mysql_lex_stringS6_P18Open_tables_backupb.isra.131 (221,184 bytes, 1.03%) + + +libmtmalloc.so.1`morecore (368,640 bytes, 1.72%) + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (1,032,192 bytes, 4.83%) +libc.s.. + + +mysqld`_Z10find_filesP3THDP4ListI19st_mysql_lex_stringEPKcS6_S6_b (147,456 bytes, 0.69%) + + +mysqld`_ZN12Warning_infoC1Eyb (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (1,179,648 bytes, 5.52%) +libc.so.. + + +libc.so.1`sbrk (2,359,296 bytes, 11.03%) +libc.so.1`sbrk + + +mysqld`alloc_root (73,728 bytes, 0.34%) + + +mysqld`my_strndup (1,179,648 bytes, 5.52%) +mysqld`.. + + +libmtmalloc.so.1`malloc_internal (147,456 bytes, 0.69%) + + +mysqld`_Z18buf_LRU_free_blockP10buf_page_tm (147,456 bytes, 0.69%) + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +mysqld`_Z19load_db_opt_by_nameP3THDPKcP24st_ha_create_information (73,728 bytes, 0.34%) + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +mysqld`my_malloc (1,179,648 bytes, 5.52%) +mysqld`.. + + +mysqld`_Z11open_tablesP3THDPP10TABLE_LISTPjjP19Prelocking_strategy (589,824 bytes, 2.76%) +my.. + + +mysqld`_Z16login_connectionP3THD (3,686,400 bytes, 17.24%) +mysqld`_Z16login_connectio.. + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (1,032,192 bytes, 4.83%) +libmtm.. + + +libmtmalloc.so.1`morecore (147,456 bytes, 0.69%) + + +libmtmalloc.so.1`morecore (1,105,920 bytes, 5.17%) +libmtm.. + + +mysqld`_Z15dict_load_tablePKcm17dict_err_ignore_t (73,728 bytes, 0.34%) + + +mysqld`_Z11mysql_parseP3THDPcjP12Parser_state (884,736 bytes, 4.14%) +mysq.. + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (1,179,648 bytes, 5.52%) +libmtma.. + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`init_alloc_root (73,728 bytes, 0.34%) + + +mysqld`my_dir (147,456 bytes, 0.69%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (1,179,648 bytes, 5.52%) +libc.so.. + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`my_malloc (1,032,192 bytes, 4.83%) +mysqld.. + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`_ZL21execute_sqlcom_selectP3THDP10TABLE_LIST (3,170,304 bytes, 14.83%) +mysqld`_ZL21execute_sq.. + + +mysqld`_ZL28native_password_authenticateP13st_plugin_vioP25st_mysql_server_auth_info (2,359,296 bytes, 11.03%) +mysqld`_ZL28nati.. + + +libstdc++.so.6.0.17`_Znwm (1,105,920 bytes, 5.17%) +libstd.. + + +mysqld`lf_hash_search (73,728 bytes, 0.34%) + + +mysqld`_Z14init_sql_allocP11st_mem_rootjj (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (1,179,648 bytes, 5.52%) +libc.so.. + + +mysqld`_Z20rec_get_offsets_funcPKhPK12dict_index_tPmmPP16mem_block_info_tPKcm (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (1,032,192 bytes, 4.83%) +libmtm.. + + +mysqld`_ZN10SQL_SELECT17test_quick_selectEP3THD6BitmapILj64EEyybN8st_order10enum_orderE (368,640 bytes, 1.72%) + + +libc.so.1`_brk_unlocked (1,105,920 bytes, 5.17%) +libc.s.. + + +mysqld`init_dynamic_array2 (73,728 bytes, 0.34%) + + +mysqld`_Z11open_tablesP3THDPP10TABLE_LISTPjjP19Prelocking_strategy (221,184 bytes, 1.03%) + + +libmtmalloc.so.1`morecore (589,824 bytes, 2.76%) +li.. + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`_start (958,464 bytes, 4.48%) +mysql.. + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`_Z16acl_authenticateP3THDj (2,433,024 bytes, 11.38%) +mysqld`_Z16acl_a.. + + +libmtmalloc.so.1`malloc_internal (294,912 bytes, 1.38%) + + +mysqld`_Z18buf_flush_LRU_tailv (147,456 bytes, 0.69%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (1,179,648 bytes, 5.52%) +libc.so.. + + +mysqld`_Z19mysqld_stmt_prepareP3THDPKcj (7,815,168 bytes, 36.55%) +mysqld`_Z19mysqld_stmt_prepareP3THDPKcj + + +libmtmalloc.so.1`malloc_internal (1,032,192 bytes, 4.83%) +libmtm.. + + +libmtmalloc.so.1`malloc_internal (1,179,648 bytes, 5.52%) +libmtma.. + + +mysqld`_Z19mysqld_stmt_executeP3THDPcj (3,170,304 bytes, 14.83%) +mysqld`_Z19mysqld_stmt.. + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`alloc_root (73,728 bytes, 0.34%) + + +mysqld`_Z13ut_malloc_lowmm (1,032,192 bytes, 4.83%) +mysqld.. + + +mysqld`_Z9parse_sqlP3THDP12Parser_stateP19Object_creation_ctx (1,253,376 bytes, 5.86%) +mysqld`.. + + +libc.so.1`sbrk (589,824 bytes, 2.76%) +li.. + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +mysqld`_ZN12Warning_infoC1Eyb (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (1,105,920 bytes, 5.17%) +libmtm.. + + +mysqld`_ZN16Diagnostics_areaC1Eyb (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (1,179,648 bytes, 5.52%) +libc.so.. + + +mysqld`_ZN18Prepared_statement7prepareEPKcj (4,349,952 bytes, 20.34%) +mysqld`_ZN18Prepared_statement7.. + + +mysqld`_Z21open_table_from_shareP3THDP11TABLE_SHAREPKcjjjP5TABLEb (147,456 bytes, 0.69%) + + +mysqld`_Z21join_init_read_recordP13st_join_table (2,211,840 bytes, 10.34%) +mysqld`_Z21join.. + + +mysqld`_Z10MYSQLparsePv (1,253,376 bytes, 5.86%) +mysqld`.. + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +mysqld`_Z30open_normal_and_derived_tablesP3THDP10TABLE_LISTj (589,824 bytes, 2.76%) +my.. + + +libc.so.1`_brk_unlocked (2,064,384 bytes, 9.66%) +libc.so.1`_brk.. + + +mysqld`_Z13handle_selectP3THDP13select_resultm (2,580,480 bytes, 12.07%) +mysqld`_Z13handle_.. + + +libmtmalloc.so.1`malloc (1,105,920 bytes, 5.17%) +libmtm.. + + +mysqld`_ZL25server_mpvio_write_packetP13st_plugin_vioPKhi (1,179,648 bytes, 5.52%) +mysqld`.. + + +libc.so.1`sbrk (368,640 bytes, 1.72%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +libc.so.1`_brk_unlocked (1,179,648 bytes, 5.52%) +libc.so.. + + +mysqld`_Z21mem_heap_create_blockP16mem_block_info_tmmPKcm (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (2,359,296 bytes, 11.03%) +libmtmalloc.so.1.. + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (589,824 bytes, 2.76%) +li.. + + +mysqld`_Z24get_schema_tables_resultP4JOIN23enum_schema_table_state (589,824 bytes, 2.76%) +my.. + + +mysqld`_Z11open_tablesP3THDPP10TABLE_LISTPjjP19Prelocking_strategy (73,728 bytes, 0.34%) + + +mysqld`_Z34init_new_connection_handler_threadv (1,105,920 bytes, 5.17%) +mysqld.. + + +mysqld`_ZNK10Eq_creator6createEP4ItemS1_ (1,105,920 bytes, 5.17%) +mysqld.. + + +mysqld`_Z22trx_allocate_for_mysqlv (3,096,576 bytes, 14.48%) +mysqld`_Z22trx_allocat.. + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (1,105,920 bytes, 5.17%) +libmtm.. + + +mysqld`_Z17mutex_create_funcP10ib_mutex_tPKcm (1,032,192 bytes, 4.83%) +mysqld.. + + +mysqld`_Z21mem_heap_create_blockP16mem_block_info_tmmPKcm (73,728 bytes, 0.34%) + + +mysqld`_Z21mem_heap_create_blockP16mem_block_info_tmmPKcm (73,728 bytes, 0.34%) + + +mysqld`_ZN13st_select_lex10init_queryEv (1,179,648 bytes, 5.52%) +mysqld`.. + + +libmtmalloc.so.1`malloc (368,640 bytes, 1.72%) + + +mysqld`_Z21innobase_trx_allocateP3THD (3,096,576 bytes, 14.48%) +mysqld`_Z21innobase_tr.. + + +mysqld`_ZN3THD16init_for_queriesEP14Relay_log_info (2,285,568 bytes, 10.69%) +mysqld`_ZN3THD1.. + + +libc.so.1`_brk_unlocked (589,824 bytes, 2.76%) +li.. + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libc.so.1`sbrk (1,105,920 bytes, 5.17%) +libc.s.. + + +mysqld`_Z21mysql_execute_commandP3THD (3,170,304 bytes, 14.83%) +mysqld`_Z21mysql_execu.. + + +libc.so.1`_brk_unlocked (147,456 bytes, 0.69%) + + +mysqld`init_io_cache (73,728 bytes, 0.34%) + + +mysqld`_Z10sub_selectP4JOINP13st_join_tableb (2,211,840 bytes, 10.34%) +mysqld`_Z10sub_.. + + +mysqld`alloc_root (1,105,920 bytes, 5.17%) +mysqld.. + + +mysqld`_Z10find_filesP3THDP4ListI19st_mysql_lex_stringEPKcS6_S6_b (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (1,032,192 bytes, 4.83%) +libmtm.. + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (1,179,648 bytes, 5.52%) +libmtma.. + + +mysqld`multi_alloc_root (73,728 bytes, 0.34%) + + +mysqld`_Z21mysql_execute_commandP3THD (884,736 bytes, 4.14%) +mysq.. + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`_Z31btr_search_drop_page_hash_indexP11buf_block_t (147,456 bytes, 0.69%) + + +mysqld`alloc_root (1,179,648 bytes, 5.52%) +mysqld`.. + + +mysqld`_Z14init_sql_allocP11st_mem_rootjj (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (147,456 bytes, 0.69%) + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (2,064,384 bytes, 9.66%) +libmtmalloc.so.. + + +mysqld`_ZL16check_connectionP3THD (3,686,400 bytes, 17.24%) +mysqld`_ZL16check_connecti.. + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +mysqld`_lf_dynarray_lvalue (73,728 bytes, 0.34%) + + +mysqld`_ZN3THDC1Eb (73,728 bytes, 0.34%) + + +mysqld`_Z11load_db_optP3THDPKcP24st_ha_create_information (73,728 bytes, 0.34%) + + +mysqld`my_net_init (589,824 bytes, 2.76%) +my.. + + +libmtmalloc.so.1`malloc (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc_internal (368,640 bytes, 1.72%) + + +mysqld`_Z8filesortP3THDP5TABLEP8FilesortbPyS5_ (2,211,840 bytes, 10.34%) +mysqld`_Z8files.. + + +libmtmalloc.so.1`malloc (1,105,920 bytes, 5.17%) +libmtm.. + + +mysqld`_Z21mem_heap_create_blockP16mem_block_info_tmmPKcm (73,728 bytes, 0.34%) + + +mysqld`buf_flush_page_cleaner_thread (147,456 bytes, 0.69%) + + +libc.so.1`sbrk (73,728 bytes, 0.34%) + + +mysqld`reset_root_defaults (2,285,568 bytes, 10.69%) +mysqld`reset_ro.. + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`my_malloc (1,179,648 bytes, 5.52%) +mysqld`.. + + +mysqld`my_malloc (589,824 bytes, 2.76%) +my.. + + +libmtmalloc.so.1`malloc_internal (1,253,376 bytes, 5.86%) +libmtma.. + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +mysqld`pfs_spawn_thread (20,275,200 bytes, 94.83%) +mysqld`pfs_spawn_thread + + +libmtmalloc.so.1`malloc (147,456 bytes, 0.69%) + + +mysqld`my_thread_init (1,105,920 bytes, 5.17%) +mysqld.. + + +libmtmalloc.so.1`malloc_internal (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`malloc (2,285,568 bytes, 10.69%) +libmtmalloc.so... + + +libmtmalloc.so.1`morecore (294,912 bytes, 1.38%) + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`_Z21mem_heap_create_blockP16mem_block_info_tmmPKcm (2,064,384 bytes, 9.66%) +mysqld`_Z21mem.. + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`_ZN4JOIN8optimizeEv (368,640 bytes, 1.72%) + + +mysqld`alloc_root (1,179,648 bytes, 5.52%) +mysqld`.. + + +mysqld`_ZN5FieldnwEm (147,456 bytes, 0.69%) + + +mysqld`memdup_root (1,179,648 bytes, 5.52%) +mysqld`.. + + +mysqld`_Z21innobase_trx_allocateP3THD (73,728 bytes, 0.34%) + + +mysqld`_ZL12do_auth_onceP3THDP19st_mysql_lex_stringP9MPVIO_EXT (2,359,296 bytes, 11.03%) +mysqld`_ZL12do_a.. + + +libc.so.1`sbrk (294,912 bytes, 1.38%) + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (73,728 bytes, 0.34%) + + +mysqld`my_malloc (147,456 bytes, 0.69%) + + +libc.so.1`_brk_unlocked (73,728 bytes, 0.34%) + + +mysqld`_ZN11ha_innobase5extraE17ha_extra_function (73,728 bytes, 0.34%) + + +libmtmalloc.so.1`morecore (1,032,192 bytes, 4.83%) +libmtm.. + + +libmtmalloc.so.1`malloc_internal (1,105,920 bytes, 5.17%) +libmtm.. + + +libmtmalloc.so.1`morecore (1,253,376 bytes, 5.86%) +libmtma.. + + +mysqld`_Z11open_tablesP3THDPP10TABLE_LISTPjjP19Prelocking_strategy (3,096,576 bytes, 14.48%) +mysqld`_Z11open_tables.. + + +libmtmalloc.so.1`malloc_internal (1,179,648 bytes, 5.52%) +libmtma.. + + +mysqld`my_malloc (73,728 bytes, 0.34%) + + +mysqld`_ZN4JOIN14prepare_resultEPP4ListI4ItemE (589,824 bytes, 2.76%) +my.. + + +libc.so.1`sbrk (1,105,920 bytes, 5.17%) +libc.s.. + + +mysqld`init_io_cache (1,032,192 bytes, 4.83%) +mysqld.. + + diff --git a/tools/FlameGraph/demos/cpu-grep.svg b/tools/FlameGraph/demos/cpu-grep.svg new file mode 100644 index 0000000..376f311 --- /dev/null +++ b/tools/FlameGraph/demos/cpu-grep.svg @@ -0,0 +1,135 @@ + + + + + + + + + + + + +Flame Graph + + +libc.so.1`_fwrite_unlocked (17 samples, 0.04%) + + +libc.so.1`memcpy (13 samples, 0.03%) + + +libc.so.1`_UTF8_mbrtowc (12,492 samples, 25.80%) +libc.so.1`_UTF8_mbrtowc + + +libc.so.1`_UTF8_mbrtowc (6,203 samples, 12.81%) +libc.so.1`.. + + +grep`check_multibyte_string (39,754 samples, 82.11%) +grep`check_multibyte_string + + +libc.so.1`memchr (16 samples, 0.03%) + + +libc.so.1`cancel_safe_mutex_unlock (14 samples, 0.03%) + + +grep`EGexecute (48,285 samples, 99.73%) +grep`EGexecute + + +grep`xmalloc (20 samples, 0.04%) + + +grep`_start (48,414 samples, 100.00%) +grep`_start + + +grep`main (48,414 samples, 100.00%) +grep`main + + +libc.so.1`mbrtowc (5,022 samples, 10.37%) +libc.so... + + +libc.so.1`memset (172 samples, 0.36%) + + +libc.so.1`mutex_lock_impl (14 samples, 0.03%) + + +libc.so.1`mutex_lock (14 samples, 0.03%) + + +libc.so.1`mutex_unlock (14 samples, 0.03%) + + +libc.so.1`_malloc_unlocked (7 samples, 0.01%) + + +libc.so.1`malloc (18 samples, 0.04%) + + +libc.so.1`free (46 samples, 0.10%) + + +all (48,414 samples, 100%) + + + +libc.so.1`cancel_active (8 samples, 0.02%) + + +libc.so.1`free (7 samples, 0.01%) + + +libc.so.1`mbrtowc (16,865 samples, 34.83%) +libc.so.1`mbrtowc + + +grep`0x4067d0 (3,243 samples, 6.70%) +grep.. + + +libc.so.1`mutex_unlock (8 samples, 0.02%) + + +grep`prtext (94 samples, 0.19%) + + +libc.so.1`fwrite (60 samples, 0.12%) + + +grep`grepbuf (48,411 samples, 99.99%) +grep`grepbuf + + +grep`kwsexec (10 samples, 0.02%) + + +grep`grepfile (48,414 samples, 100.00%) +grep`grepfile + + +grep`prline (76 samples, 0.16%) + + +grep`print_line_head (5 samples, 0.01%) + + +libc.so.1`mutex_unlock_queue (6 samples, 0.01%) + + diff --git a/tools/FlameGraph/demos/cpu-illumos-ipdce.svg b/tools/FlameGraph/demos/cpu-illumos-ipdce.svg new file mode 100644 index 0000000..373334c --- /dev/null +++ b/tools/FlameGraph/demos/cpu-illumos-ipdce.svg @@ -0,0 +1,2519 @@ + + + + + + + + + + + + +Flame Graph +Function: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`conn.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mac`mac_rx + + + + + + + + + + + + + + + + + + + +ip`ire_recv_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`ip_fanout.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`ip_s.. + +ip`ip_set_destination_.. + + + + + + + + + + + + + + + + + + + + + + + + +ip`dce_lookup_and_add_.. + + + + +ip`ip_input + + + + +dls`i_dls_link_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`tcp_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mac`mac_rx_del.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`sys_syscall + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`tcp_set_destination + + + + + + + + + + + + + + + + + + + +ip`tcp_.. + + + + + + + + + + + + + + + + + + + + + + + + + +ip`tcp_connect_ipv4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`wri.. + +ip`ip_s.. + + + + + + + + +mac`mac_rx_flow + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`ip_input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`ire_recv_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`squeue_e.. + + + + + + + + + + + + + + + + + + +ip`tcp_do_connect + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ixgbe`ixgbe_intr_ms.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mac`mac_soft_r.. + + + + + + + + + + + + + + + + + + +ip`conn.. + + + + + + + + + + + + + + + + + + + +genunix`d.. + + + + + + + + + + + + + + + + + + + + + + + +mac`mac_rx_deli.. + + + + + + + + + + + + + + + + + + +mac`mac_rx_soft.. + + + + + + + + + + + +mac`mac_rx_common + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`_sys_sysenter_post_swapgs + + + + + + + + + + + +ip`ip_fanout.. + + + + + + + + + + + + +mac`mac_rx_class.. + + + + +mac`mac_rx_sof.. + + + + + + + + + + +ip`ill_input_s.. + + + + + + + + + + + + + + + + +unix`thread_start + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`ill_input_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`so_connect + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`ip_a.. + + + + + + + + + + + + + + +ip`tcp_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`ioctl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mac`mac_rx_srs_d.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`switch_sp_and_cal.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`dce_.. + + + + + + + + + + + + + + + + + + + + + + + +sockfs`socket_connect + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`connect + + + +ip`ip_attr_connect + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`tcp_connect + +mac`mac_rx_srs_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`tcp_.. + + + + + + + + + + + + + + +ip`ip_a.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mac`mac_rx_ring + +mac`mac_rx_srs_p.. + + + + + + + + +unix`av_dispatch_au.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`write3.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`conn_connect + + + + + + + + + + + + + + + + + + + + + + + + +ip`dce_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`dispatch_hardi.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`squeue_e.. + + + + + + + + + + + + + + + + + + + + + + + + +dls`i_dls_link.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/FlameGraph/demos/cpu-illumos-syscalls.svg b/tools/FlameGraph/demos/cpu-illumos-syscalls.svg new file mode 100644 index 0000000..3f996aa --- /dev/null +++ b/tools/FlameGraph/demos/cpu-illumos-syscalls.svg @@ -0,0 +1,3555 @@ + + + + + + + + + + + + +Flame Graph +Function: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`fo.. + + + + + + + + + + + + + + + + + + + + + + + + +ip`ire_recv_local_.. + + + + + + + + + + +genunix`.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`wr.. + + + + + + + + + + + + + + + + + + + + + + + + +unix`_sys_sysenter_post_swapgs + + + + + + + + + + + + + + + + + + + + + + + + + + +mac`mac_soft_ring_wor.. + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`wr.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`sos.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`squ.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`dispatch_hardint + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`sn.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + +bnx`bnx.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +bnx`bnx_intr_1lv.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`soc.. + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`sendvec6.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`so_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +bnx`bnx.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`av_dispatch_autovec.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`thread_start + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`d.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +bnx`bnx.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`sys_syscall3.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + +ip`tcp_inpu.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mac`mac_rx_soft_ring_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`ill_input_short_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`sendfile.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`switch_sp_and_call + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`soc.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +bnx`bn.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +bnx`bn.. + + + + + + + + + + + + +genunix`sendvec_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`squeue_enter + + + +genuni.. + + + + + + + + + + +ip`tcp.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genuni.. + + + + + + + + + + + + + + + + + + + +ip`ip_fanout_v4 + + + + + + + + + + + + + + + + + + + + + + +genunix`.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ip`ip_input + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/FlameGraph/demos/cpu-illumos-tcpfuse.svg b/tools/FlameGraph/demos/cpu-illumos-tcpfuse.svg new file mode 100644 index 0000000..2315da2 --- /dev/null +++ b/tools/FlameGraph/demos/cpu-illumos-tcpfuse.svg @@ -0,0 +1,1411 @@ + + + + + + + + + + + + +Flame Graph + + +unix`mutex_vector_enter (45 samples, 0.16%) + + +FSS`fss_wakeup (3 samples, 0.01%) + + +unix`bcopy (40 samples, 0.14%) + + +genunix`freeb (4 samples, 0.01%) + + +unix`0xfffffffffb800ec1 (9 samples, 0.03%) + + +genunix`disp_lock_exit (19 samples, 0.07%) + + +genunix`releasef (43 samples, 0.15%) + + +unix`lwp_segregs_save (10 samples, 0.04%) + + +unix`lock_clear_splx (4 samples, 0.01%) + + +unix`_sys_sysenter_post_swapgs (24,695 samples, 87.26%) +unix`_sys_sysenter_post_swapgs + + +genunix`set_active_fd (36 samples, 0.13%) + + +unix`splr (90 samples, 0.32%) + + +genunix`restorectx (8 samples, 0.03%) + + +genunix`gethrtime_unscaled (9 samples, 0.03%) + + +genunix`syscall_exit (2,623 samples, 9.27%) +genunix.. + + +unix`lock_set (49 samples, 0.17%) + + +unix`pg_ev_thread_swtch (438 samples, 1.55%) + + +genunix`syscall_exit (3 samples, 0.01%) + + +unix`mutex_exit (16 samples, 0.06%) + + +unix`pagefault (3 samples, 0.01%) + + +unix`rw_exit (176 samples, 0.62%) + + +unix`atomic_add_32 (212 samples, 0.75%) + + +unix`do_copy_fault_nta (319 samples, 1.13%) + + +genunix`disp_lock_enter_high (5 samples, 0.02%) + + +unix`tsc_gethrtimeunscaled (7 samples, 0.02%) + + +unix`splr (107 samples, 0.38%) + + +genunix`gethrtime_unscaled (39 samples, 0.14%) + + +genunix`lbolt_cyclic_driven (4 samples, 0.01%) + + +unix`0xfffffffffb800ecb (131 samples, 0.46%) + + +unix`swtch (4 samples, 0.01%) + + +genunix`gethrtime_unscaled (4 samples, 0.01%) + + +unix`bitset_in_set (271 samples, 0.96%) + + +unix`mutex_delay_default (3 samples, 0.01%) + + +genunix`schedctl_cancel_pending (10 samples, 0.04%) + + +sockfs`socket_sendsig (7 samples, 0.02%) + + +genunix`new_mstate (274 samples, 0.97%) + + +unix`do_splx (1,002 samples, 3.54%) +u.. + + +genunix`scalehrtime (22 samples, 0.08%) + + +unix`mutex_exit (23 samples, 0.08%) + + +unix`splr (191 samples, 0.67%) + + +genunix`savectx (288 samples, 1.02%) + + +unix`lock_set_spl (7 samples, 0.02%) + + +unix`mutex_exit (4 samples, 0.01%) + + +genunix`syscall_mstate (52 samples, 0.18%) + + +unix`gdt_update_usegd (16 samples, 0.06%) + + +sockfs`sendit (11,647 samples, 41.16%) +sockfs`sendit + + +genunix`cpu_decay (42 samples, 0.15%) + + +sockfs`sendit (5 samples, 0.02%) + + +genunix`schedctl_set_cidpri (4 samples, 0.01%) + + +genunix`copyin_nowatch (123 samples, 0.43%) + + +genunix`disp_lock_exit_high (6 samples, 0.02%) + + +unix`i_ddi_splhigh (3 samples, 0.01%) + + +genunix`allocb (15 samples, 0.05%) + + +genunix`msgdsize (4 samples, 0.01%) + + +unix`tsc_read (34 samples, 0.12%) + + +genunix`set_active_fd (16 samples, 0.06%) + + +genunix`restorectx (311 samples, 1.10%) + + +unix`tsc_scalehrtime (6 samples, 0.02%) + + +unix`tsc_read (151 samples, 0.53%) + + +unix`prunstop (12 samples, 0.04%) + + +unix`swtch (22 samples, 0.08%) + + +genunix`freeb (191 samples, 0.67%) + + +genunix`lwp_stat_update (10 samples, 0.04%) + + +unix`_resume_from_idle (741 samples, 2.62%) + + +genunix`sigcheck (13 samples, 0.05%) + + +unix`default_lock_delay (6 samples, 0.02%) + + +sockfs`socopyinuio (1,263 samples, 4.46%) +so.. + + +unix`cpucaps_charge (792 samples, 2.80%) + + +ip`tcp_output (51 samples, 0.18%) + + +unix`gdt_ucode_model (5 samples, 0.02%) + + +unix`cmt_should_migrate (60 samples, 0.21%) + + +unix`clear_int_flag (5 samples, 0.02%) + + +genunix`scalehrtime (43 samples, 0.15%) + + +genunix`clear_active_fd (6 samples, 0.02%) + + +sockfs`socket_recvmsg (3 samples, 0.01%) + + +genunix`cpu_grow (57 samples, 0.20%) + + +unix`tsc_read (4 samples, 0.01%) + + +genunix`mstate_thread_onproc_time (3 samples, 0.01%) + + +sockfs`so_check_flow_control (8 samples, 0.03%) + + +unix`pg_ev_thread_swtch (4 samples, 0.01%) + + +genunix`disp_lock_exit_nopreempt (607 samples, 2.14%) + + +genunix`disp_lock_enter (3 samples, 0.01%) + + +ip`ip_output_verify_local (41 samples, 0.14%) + + +unix`lock_set_spl (357 samples, 1.26%) + + +genunix`copyin_nowatch (15 samples, 0.05%) + + +unix`copyin (30 samples, 0.11%) + + +unix`clear_int_flag (3 samples, 0.01%) + + +unix`preempt (8 samples, 0.03%) + + +genunix`watch_disable_addr (32 samples, 0.11%) + + +genunix`cv_signal (6,066 samples, 21.43%) +genunix`cv_signal + + +genunix`turnstile_wakeup (4 samples, 0.01%) + + +unix`sep_save (181 samples, 0.64%) + + +unix`tsc_scalehrtime (10 samples, 0.04%) + + +unix`cpucaps_charge (7 samples, 0.02%) + + +genunix`gethrtime_unscaled (6 samples, 0.02%) + + +unix`mutex_exit (35 samples, 0.12%) + + +unix`mutex_delay_default (13 samples, 0.05%) + + +genunix`getf (75 samples, 0.27%) + + +genunix`schedctl_save (3 samples, 0.01%) + + +genunix`cpu_update_pct (8 samples, 0.03%) + + +genunix`sigcheck (44 samples, 0.16%) + + +unix`sep_restore (156 samples, 0.55%) + + +unix`lock_set (246 samples, 0.87%) + + +FSS`fss_wakeup (4,407 samples, 15.57%) +FSS`fss_wakeup + + +unix`caps_charge_adjust (389 samples, 1.37%) + + +unix`mutex_exit (11 samples, 0.04%) + + +genunix`uiomove (6 samples, 0.02%) + + +genunix`disp_lock_enter (4 samples, 0.01%) + + +unix`cpu_wakeup_mwait (631 samples, 2.23%) + + +genunix`lbolt_cyclic_driven (4 samples, 0.01%) + + +genunix`kmem_cpucache_magazine_alloc (32 samples, 0.11%) + + +unix`mutex_enter (287 samples, 1.01%) + + +unix`mutex_enter (46 samples, 0.16%) + + +unix`tsc_gethrtimeunscaled (3 samples, 0.01%) + + +unix`cpu_resched (6 samples, 0.02%) + + +genunix`ddi_get_lbolt (4 samples, 0.01%) + + +genunix`kmem_cache_free (78 samples, 0.28%) + + +unix`mul32 (12 samples, 0.04%) + + +unix`tsc_read (33 samples, 0.12%) + + +unix`splr (3 samples, 0.01%) + + +unix`bcopy (19 samples, 0.07%) + + +unix`mutex_tryenter (10 samples, 0.04%) + + +FSS`fss_wakeup (61 samples, 0.22%) + + +genunix`avl_numnodes (14 samples, 0.05%) + + +genunix`lbolt_cyclic_driven (8 samples, 0.03%) + + +unix`_resume_from_idle (523 samples, 1.85%) + + +ip`squeue_enter (8,408 samples, 29.71%) +ip`squeue_enter + + +unix`swtch (3,593 samples, 12.70%) +unix`swtch + + +genunix`gethrtime_unscaled (49 samples, 0.17%) + + +sockfs`copyout_name (35 samples, 0.12%) + + +unix`mutex_exit (18 samples, 0.06%) + + +unix`mutex_enter (110 samples, 0.39%) + + +unix`mutex_enter (36 samples, 0.13%) + + +genunix`schedctl_restore (10 samples, 0.04%) + + +sockfs`recv (19 samples, 0.07%) + + +genunix`cpu_update_pct (146 samples, 0.52%) + + +unix`mutex_tryenter (16 samples, 0.06%) + + +genunix`copyin_args32 (221 samples, 0.78%) + + +genunix`gethrtime_unscaled (49 samples, 0.17%) + + +sockfs`recv32 (10 samples, 0.04%) + + +unix`tsc_read (48 samples, 0.17%) + + +sockfs`so_notify_data (6,118 samples, 21.62%) +sockfs`so_notify_data + + +unix`caps_charge_adjust (6 samples, 0.02%) + + +unix`cmt_ev_thread_swtch (26 samples, 0.09%) + + +unix`mutex_owner_running (6 samples, 0.02%) + + +genunix`kmem_depot_alloc (15 samples, 0.05%) + + +sockfs`so_process_new_message (63 samples, 0.22%) + + +unix`splx (3 samples, 0.01%) + + +unix`mutex_delay_default (26 samples, 0.09%) + + +sockfs`recvit (11,295 samples, 39.91%) +sockfs`recvit + + +unix`mutex_enter (311 samples, 1.10%) + + +unix`kcopy (13 samples, 0.05%) + + +genunix`lbolt_cyclic_driven (6 samples, 0.02%) + + +genunix`disp_lock_enter_high (3 samples, 0.01%) + + +sockfs`getsonode (145 samples, 0.51%) + + +genunix`schedctl_set_cidpri (7 samples, 0.02%) + + +unix`0xfffffffffb853893 (85 samples, 0.30%) + + +unix`bitset_atomic_del (5 samples, 0.02%) + + +unix`lwp_segregs_save (19 samples, 0.07%) + + +unix`mutex_enter (5 samples, 0.02%) + + +sockfs`copyout_name (18 samples, 0.06%) + + +unix`lwp_getdatamodel (14 samples, 0.05%) + + +genunix`cv_wait_sig (5 samples, 0.02%) + + +unix`membar_enter (327 samples, 1.16%) + + +unix`tsc_gethrtimeunscaled (5 samples, 0.02%) + + +genunix`syscall_entry (294 samples, 1.04%) + + +unix`setbackdq (3 samples, 0.01%) + + +sockfs`recv (11,410 samples, 40.32%) +sockfs`recv + + +genunix`restore_mstate (35 samples, 0.12%) + + +sockfs`getsonode (14 samples, 0.05%) + + +sockfs`send (11,693 samples, 41.32%) +sockfs`send + + +genunix`lwp_stat_update (11 samples, 0.04%) + + +unix`mutex_exit (8 samples, 0.03%) + + +genunix`disp_lock_enter (4 samples, 0.01%) + + +unix`mutex_vector_exit (7 samples, 0.02%) + + +genunix`exp_x (5 samples, 0.02%) + + +genunix`kmem_depot_alloc (10 samples, 0.04%) + + +genunix`gethrtime_unscaled (183 samples, 0.65%) + + +unix`xcopyin_nta (3 samples, 0.01%) + + +unix`tsc_gethrtimeunscaled (8 samples, 0.03%) + + +sockfs`send32 (11,729 samples, 41.45%) +sockfs`send32 + + +FSS`fss_active (45 samples, 0.16%) + + +unix`atomic_cas_64 (32 samples, 0.11%) + + +unix`mutex_enter (100 samples, 0.35%) + + +sockfs`getsonode (6 samples, 0.02%) + + +unix`rw_enter (43 samples, 0.15%) + + +genunix`cv_signal (4 samples, 0.01%) + + +unix`mutex_exit (15 samples, 0.05%) + + +unix`lock_set_spl_spin (3 samples, 0.01%) + + +unix`kcopy (6 samples, 0.02%) + + +unix`mul32 (16 samples, 0.06%) + + +genunix`disp_lock_exit_high (3 samples, 0.01%) + + +unix`cmt_ev_thread_swtch_pwr (10 samples, 0.04%) + + +unix`0xfffffffffb800ed9 (2,637 samples, 9.32%) +unix`0x.. + + +FSS`fss_trapret (416 samples, 1.47%) + + +sockfs`send (15 samples, 0.05%) + + +ip`tcp_sendmsg (9,284 samples, 32.81%) +ip`tcp_sendmsg + + +genunix`post_syscall (12 samples, 0.04%) + + +unix`tsc_scalehrtime (24 samples, 0.08%) + + +genunix`audit_getstate (19 samples, 0.07%) + + +genunix`kmem_cache_alloc (85 samples, 0.30%) + + +unix`do_splx (596 samples, 2.11%) + + +genunix`disp_lock_enter (348 samples, 1.23%) + + +unix`0xfffffffffb800ee8 (165 samples, 0.58%) + + +genunix`ddi_get_lbolt (7 samples, 0.02%) + + +genunix`disp_lock_exit (514 samples, 1.82%) + + +unix`do_splx (752 samples, 2.66%) + + +unix`lock_try (387 samples, 1.37%) + + +genunix`kmem_cache_alloc (8 samples, 0.03%) + + +ip`squeue_enter (41 samples, 0.14%) + + +sockfs`so_unlock_read (24 samples, 0.08%) + + +genunix`getf (4 samples, 0.01%) + + +FSS`fss_sleep (9 samples, 0.03%) + + +genunix`disp_lock_exit (6 samples, 0.02%) + + +genunix`pullupmsg (9 samples, 0.03%) + + +unix`atomic_cas_32 (18 samples, 0.06%) + + +unix`cpupm_utilization_event (4 samples, 0.01%) + + +unix`atomic_add_64 (161 samples, 0.57%) + + +unix`lock_set_spl (341 samples, 1.20%) + + +unix`mutex_exit (15 samples, 0.05%) + + +sockfs`so_lock_read_intr (24 samples, 0.08%) + + +genunix`cv_signal (21 samples, 0.07%) + + +genunix`lwp_stat_update (13 samples, 0.05%) + + +sockfs`so_queue_msg (6,647 samples, 23.49%) +sockfs`so_queue_msg + + +genunix`dblk_lastfree (168 samples, 0.59%) + + +genunix`cv_block (1,689 samples, 5.97%) +gen.. + + +unix`lock_set_spin (6 samples, 0.02%) + + +genunix`scalehrtime (31 samples, 0.11%) + + +unix`lock_try (279 samples, 0.99%) + + +genunix`getf (70 samples, 0.25%) + + +genunix`kmem_depot_alloc (4 samples, 0.01%) + + +genunix`sleepq_insert (19 samples, 0.07%) + + +FSS`fss_active (954 samples, 3.37%) +F.. + + +genunix`turnstile_block (5 samples, 0.02%) + + +unix`tsc_read (101 samples, 0.36%) + + +unix`disp_getwork (4 samples, 0.01%) + + +unix`tsc_gethrtimeunscaled (15 samples, 0.05%) + + +sockfs`send32 (11 samples, 0.04%) + + +genunix`ddi_get_lbolt (9 samples, 0.03%) + + +sockfs`so_queue_msg_impl (6,328 samples, 22.36%) +sockfs`so_queue_msg_.. + + +genunix`getf (6 samples, 0.02%) + + +unix`lock_set (102 samples, 0.36%) + + +genunix`cpu_decay (3 samples, 0.01%) + + +genunix`ddi_get_lbolt (4 samples, 0.01%) + + +sockfs`sod_rcv_done (57 samples, 0.20%) + + +unix`rw_enter (39 samples, 0.14%) + + +ip`tcp_sendmsg (87 samples, 0.31%) + + +unix`tsc_scalehrtime (13 samples, 0.05%) + + +genunix`disp_lock_exit (1,039 samples, 3.67%) +g.. + + +unix`resume (540 samples, 1.91%) + + +unix`0xfffffffffb85390a (19 samples, 0.07%) + + +sockfs`so_sendmsg (11,113 samples, 39.27%) +sockfs`so_sendmsg + + +genunix`gethrtime_unscaled (9 samples, 0.03%) + + +genunix`disp_lock_enter_high (4 samples, 0.01%) + + +ip`ip_output_verify_local (15 samples, 0.05%) + + +genunix`set_active_fd (13 samples, 0.05%) + + +genunix`cv_broadcast (6 samples, 0.02%) + + +unix`gdt_update_usegd (6 samples, 0.02%) + + +unix`do_splx (490 samples, 1.73%) + + +unix`tsc_gethrtimeunscaled (40 samples, 0.14%) + + +genunix`new_mstate (3 samples, 0.01%) + + +genunix`sleepq_wakeone_chan (3 samples, 0.01%) + + +unix`disp (10 samples, 0.04%) + + +unix`disp (2,346 samples, 8.29%) +unix`d.. + + +genunix`sigcheck (12 samples, 0.04%) + + +unix`mutex_enter (28 samples, 0.10%) + + +unix`tsc_gethrtimeunscaled (13 samples, 0.05%) + + +unix`lock_set_spl (10 samples, 0.04%) + + +genunix`cv_wait_sig (7,391 samples, 26.12%) +genunix`cv_wait_sig + + +genunix`syscall_mstate (566 samples, 2.00%) + + +genunix`disp_lock_enter_high (5 samples, 0.02%) + + +unix`rw_exit (23 samples, 0.08%) + + +unix`lock_set (198 samples, 0.70%) + + +unix`atomic_add_64 (259 samples, 0.92%) + + +unix`mutex_enter (379 samples, 1.34%) + + +unix`mutex_exit (7 samples, 0.02%) + + +unix`lock_set_spin (4 samples, 0.01%) + + +genunix`allocb (664 samples, 2.35%) + + +unix`mul32 (6 samples, 0.02%) + + +genunix`disp_lock_enter_high (3 samples, 0.01%) + + +genunix`cv_broadcast (3 samples, 0.01%) + + +genunix`exp_x (4 samples, 0.01%) + + +genunix`cv_broadcast (12 samples, 0.04%) + + +sockfs`socket_sendmsg (8 samples, 0.03%) + + +genunix`turnstile_lookup (3 samples, 0.01%) + + +genunix`schedctl_restore (11 samples, 0.04%) + + +genunix`sleepq_unlink (57 samples, 0.20%) + + +genunix`audit_getstate (37 samples, 0.13%) + + +unix`disp_getbest (7 samples, 0.02%) + + +genunix`thread_lock (7 samples, 0.02%) + + +unix`lwp_segregs_restore32 (28 samples, 0.10%) + + +unix`splr (15 samples, 0.05%) + + +genunix`set_active_fd (45 samples, 0.16%) + + +genunix`disp_lock_enter_high (8 samples, 0.03%) + + +FSS`fss_trapret (56 samples, 0.20%) + + +genunix`lbolt_cyclic_driven (4 samples, 0.01%) + + +unix`lock_set (260 samples, 0.92%) + + +all (28,300 samples, 100%) + + + +unix`xcopyout_nta (3 samples, 0.01%) + + +genunix`gethrtime_unscaled (38 samples, 0.13%) + + +genunix`disp_lock_exit_high (5 samples, 0.02%) + + +unix`clear_int_flag (6 samples, 0.02%) + + +unix`atomic_add_64 (31 samples, 0.11%) + + +genunix`disp_lock_exit_high (8 samples, 0.03%) + + +FSS`fss_preempt (3 samples, 0.01%) + + +unix`mutex_owner_running (7 samples, 0.02%) + + +unix`mutex_enter (28 samples, 0.10%) + + +unix`cpupm_utilization_event (23 samples, 0.08%) + + +unix`tsc_gethrtimeunscaled (14 samples, 0.05%) + + +unix`tsc_gethrtimeunscaled (5 samples, 0.02%) + + +unix`splr (4 samples, 0.01%) + + +genunix`cpu_decay (37 samples, 0.13%) + + +unix`clear_int_flag (4 samples, 0.01%) + + +unix`mutex_exit (13 samples, 0.05%) + + +unix`tsc_read (44 samples, 0.16%) + + +sockfs`so_queue_msg_impl (11 samples, 0.04%) + + +genunix`disp_lock_exit_high (6 samples, 0.02%) + + +sockfs`sod_rcv_init (20 samples, 0.07%) + + +sockfs`so_lock_read_intr (11 samples, 0.04%) + + +genunix`sigcheck (21 samples, 0.07%) + + +genunix`thread_lock (228 samples, 0.81%) + + +unix`cpu_wakeup_mwait (12 samples, 0.04%) + + +ip`tcp_fuse_output (7,829 samples, 27.66%) +ip`tcp_fuse_output + + +unix`cpu_resched (30 samples, 0.11%) + + +sockfs`so_check_flow_control (6 samples, 0.02%) + + +unix`tsc_read (156 samples, 0.55%) + + +genunix`disp_lock_exit_high (8 samples, 0.03%) + + +genunix`post_syscall (2,459 samples, 8.69%) +genuni.. + + +sockfs`so_recvmsg (5 samples, 0.02%) + + +genunix`gethrtime_unscaled (43 samples, 0.15%) + + +unix`0xfffffffffb8001d6 (3 samples, 0.01%) + + +genunix`sleepq_wakeone_chan (4,832 samples, 17.07%) +genunix`sleepq_.. + + +unix`mutex_enter (23 samples, 0.08%) + + +genunix`cv_broadcast (7 samples, 0.02%) + + +unix`prunstop (8 samples, 0.03%) + + +unix`splr (81 samples, 0.29%) + + +genunix`lbolt_cyclic_driven (10 samples, 0.04%) + + +sockfs`socket_sendmsg (11,290 samples, 39.89%) +sockfs`socket_sendmsg + + +genunix`dblk_lastfree (3 samples, 0.01%) + + +genunix`gethrtime_unscaled (5 samples, 0.02%) + + +sockfs`so_dequeue_msg (33 samples, 0.12%) + + +unix`mutex_enter (26 samples, 0.09%) + + +sockfs`recv32 (11,482 samples, 40.57%) +sockfs`recv32 + + +unix`clear_int_flag (4 samples, 0.01%) + + +unix`tsc_gethrtimeunscaled (8 samples, 0.03%) + + +genunix`clear_stale_fd (30 samples, 0.11%) + + +genunix`sleepq_insert (3 samples, 0.01%) + + +genunix`syscall_entry (3 samples, 0.01%) + + +genunix`turnstile_block (12 samples, 0.04%) + + +unix`atomic_cas_32 (22 samples, 0.08%) + + +unix`clear_int_flag (6 samples, 0.02%) + + +sockfs`getsonode (172 samples, 0.61%) + + +unix`gdt_update_usegd (11 samples, 0.04%) + + +unix`disp_getwork (1,287 samples, 4.55%) +un.. + + +genunix`gethrtime_unscaled (111 samples, 0.39%) + + +FSS`fss_sleep (909 samples, 3.21%) +F.. + + +genunix`mstate_thread_onproc_time (94 samples, 0.33%) + + +sockfs`socopyinuio (8 samples, 0.03%) + + +unix`tsc_gethrtimeunscaled (10 samples, 0.04%) + + +unix`bitset_in_set (43 samples, 0.15%) + + +unix`tsc_gethrtimeunscaled (20 samples, 0.07%) + + +unix`atomic_add_32_nv (64 samples, 0.23%) + + +genunix`thread_lock (102 samples, 0.36%) + + +genunix`clear_stale_fd (18 samples, 0.06%) + + +genunix`thread_lock (3 samples, 0.01%) + + +unix`cmt_ev_thread_swtch_pwr (51 samples, 0.18%) + + +genunix`disp_lock_exit (12 samples, 0.04%) + + +unix`xcopyin_nta (7 samples, 0.02%) + + +genunix`clear_active_fd (3 samples, 0.01%) + + +sockfs`so_enqueue_msg (3 samples, 0.01%) + + +genunix`cpu_update_pct (383 samples, 1.35%) + + +genunix`disp_lock_exit_nopreempt (8 samples, 0.03%) + + +unix`mutex_vector_enter (40 samples, 0.14%) + + +unix`membar_enter (33 samples, 0.12%) + + +unix`bitset_atomic_del (33 samples, 0.12%) + + +unix`send32 (22 samples, 0.08%) + + +genunix`avl_numnodes (10 samples, 0.04%) + + +genunix`disp_lock_enter_high (5 samples, 0.02%) + + +sockfs`socket_sendsig (9 samples, 0.03%) + + +unix`tsc_scalehrtime (3 samples, 0.01%) + + +genunix`savectx (3 samples, 0.01%) + + +genunix`cv_signal (12 samples, 0.04%) + + +unix`atomic_add_64 (33 samples, 0.12%) + + +unix`resume (26 samples, 0.09%) + + +ip`tcp_output (7,995 samples, 28.25%) +ip`tcp_output + + +unix`recv32 (25 samples, 0.09%) + + +unix`i_ddi_splhigh (6 samples, 0.02%) + + +unix`mutex_exit (5 samples, 0.02%) + + +sockfs`so_process_new_message (187 samples, 0.66%) + + +unix`tsc_read (36 samples, 0.13%) + + +genunix`gethrtime_unscaled (166 samples, 0.59%) + + +unix`copyin (13 samples, 0.05%) + + +genunix`releasef (13 samples, 0.05%) + + +unix`cmt_balance (525 samples, 1.86%) + + +genunix`disp_lock_exit (767 samples, 2.71%) + + +genunix`uiomove (501 samples, 1.77%) + + +sockfs`so_recvmsg (10,288 samples, 36.35%) +sockfs`so_recvmsg + + +genunix`releasef (19 samples, 0.07%) + + +genunix`schedctl_cancel_pending (9 samples, 0.03%) + + +unix`clear_int_flag (4 samples, 0.01%) + + +unix`xcopyout_nta (5 samples, 0.02%) + + +unix`cmt_ev_thread_swtch (18 samples, 0.06%) + + +unix`lwp_segregs_restore32 (95 samples, 0.34%) + + +genunix`exp_x (8 samples, 0.03%) + + +genunix`gethrtime_unscaled (55 samples, 0.19%) + + +sockfs`so_unlock_read (40 samples, 0.14%) + + +genunix`restore_mstate (10 samples, 0.04%) + + +genunix`syscall_mstate (129 samples, 0.46%) + + +genunix`kmem_cache_free (8 samples, 0.03%) + + +sockfs`sod_rcv_init (55 samples, 0.19%) + + +genunix`disp_lock_enter (369 samples, 1.30%) + + +unix`bcopy (226 samples, 0.80%) + + +unix`mutex_enter (173 samples, 0.61%) + + +genunix`lwp_stat_update (5 samples, 0.02%) + + +sockfs`so_queue_msg (46 samples, 0.16%) + + +unix`clear_int_flag (5 samples, 0.02%) + + +unix`gdt_ucode_model (77 samples, 0.27%) + + +genunix`copyin_args32 (7 samples, 0.02%) + + +unix`default_lock_delay (4 samples, 0.01%) + + +sockfs`sod_rcv_done (12 samples, 0.04%) + + +sockfs`socopyoutuio (644 samples, 2.28%) + + +unix`tsc_gethrtimeunscaled (5 samples, 0.02%) + + +unix`mutex_enter (4 samples, 0.01%) + + +unix`splr (107 samples, 0.38%) + + +unix`trap (3 samples, 0.01%) + + +ip`tcp_fuse_output (45 samples, 0.16%) + + +unix`0xfffffffffb8538a6 (14 samples, 0.05%) + + +unix`mutex_enter (62 samples, 0.22%) + + +genunix`watch_disable_addr (11 samples, 0.04%) + + +unix`mutex_enter (287 samples, 1.01%) + + +genunix`schedctl_save (3 samples, 0.01%) + + +genunix`uiomove (415 samples, 1.47%) + + +unix`tsc_read (44 samples, 0.16%) + + +genunix`syscall_mstate (99 samples, 0.35%) + + +genunix`exp_x (3 samples, 0.01%) + + +unix`tsc_scalehrtime (4 samples, 0.01%) + + +sockfs`recvit (9 samples, 0.03%) + + +sockfs`so_sendmsg (57 samples, 0.20%) + + +unix`do_splx (8 samples, 0.03%) + + +sockfs`so_dequeue_msg (9,836 samples, 34.76%) +sockfs`so_dequeue_msg + + +FSS`fss_inactive (72 samples, 0.25%) + + +unix`tsc_gethrtimeunscaled (5 samples, 0.02%) + + +unix`tsc_gethrtimeunscaled (3 samples, 0.01%) + + +unix`fpxsave_ctxt (29 samples, 0.10%) + + +sockfs`socket_recvmsg (10,844 samples, 38.32%) +sockfs`socket_recvmsg + + +unix`bitset_in_set (8 samples, 0.03%) + + +sockfs`so_enqueue_msg (54 samples, 0.19%) + + +unix`do_splx (519 samples, 1.83%) + + +FSS`fss_inactive (11 samples, 0.04%) + + +unix`setbackdq (3,055 samples, 10.80%) +unix`set.. + + diff --git a/tools/FlameGraph/demos/cpu-iozone.svg b/tools/FlameGraph/demos/cpu-iozone.svg new file mode 100644 index 0000000..3a268d2 --- /dev/null +++ b/tools/FlameGraph/demos/cpu-iozone.svg @@ -0,0 +1,2631 @@ + + + + + + + + + + + + +Flame Graph + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`_sys_sysenter_post_swapgs + + + + + + + + + + + + + + + +zfs`zfs_zone_io_throttle + + + +genunix`read3.. + + + + + + + + + + + + +zfs`zil_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +zfs`dmu_rea.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +zfs`dmu_tx_count_write + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`tsc_read + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`fop_write + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`write32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`.. + + + + + + + + + + + + + + + +unix`drv_usecwait + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +zfs.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +zfs`zil_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`fop_r.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix.. + + + + + + + + + +zfs`zfs_write + + + + + + +zfs`d.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genu.. + + + +unix`tsc_gethr.. + + + +zfs`.. + + + + + + + + + + + + + + + + + + + + + + + + +zfs`dmu_tx_hold_write + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genu.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`read + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +zfs`zfs_read + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`write + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`gethrtime + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/FlameGraph/demos/cpu-ipnet-diff.svg b/tools/FlameGraph/demos/cpu-ipnet-diff.svg new file mode 100644 index 0000000..4cf68ae --- /dev/null +++ b/tools/FlameGraph/demos/cpu-ipnet-diff.svg @@ -0,0 +1,512 @@ + + + + + + + + + + + + +Flame Graph +Function: + + + + + +mac`mac_rx_s.. + + + + + + + +ipnet`ipobs_boun.. + +hook`hook_r.. + +hook`hoo.. + + + + +hook`hook_run + + +hook`hook.. + +unix`dispatch_hardint + + +mac`mac_tx_send + +mac`mac_rx_srs_drain + + + +mac`mac_rx_srs_process + +mac`mac_tx + + + +mac`mac_promisc_d.. + + +ipnet`ip.. + +ip`ipobs_hook + + +mac`mac_tx_single_ring_mode + + +mac`mac_p.. + +mac`mac_promi.. + +genunix`write + + + + + + + + + +ip`squeue_enter + +mac`mac_r.. + + + + +ip`squeue_enter + + +ip`tcp_input_dat.. + + + + +ip`ipobs_.. + + + + + +ip`ip_xmit + +dls`dls_rx_pr.. + + + + + + + + +ip`ipobs_hook + +mac`mac_pro.. + + +ip`ill_input_short_v4 + + + + + + + + + + +ipnet`ipobs_bounce_func + + +ipnet`ipobs_bounc.. + + +ip`ill_inpu.. + + + +ip`ill_input_sho.. + + + + + + + + +ip`ip_xmit + + +ip`ip_inp.. + + +unix`thread_start + + + + +mac`mac_rx_common + + +sockfs`socket_vo.. + +ip`tcp_ack_timer + +sockfs`so_sendms.. + + + + +ip`ire_send_wire.. + + + + + + +mac`mac_rx_s.. + + + +ip`ip_xmit + + + +ip`ire_send_w.. + +ip`ill_in.. + + + +mac`mac_rx_soft_ring_process + + +ip`conn_ip_ou.. + + + +ip`ip_input + + + +ip`ire_send_wire_.. + + +ip`tcp_send_data + +ip`ire_recv_local_v4 + + +dls`dls_rx_promi.. + +ip`tcp_sendmsg + + + +ip`tcp_output + + +dls`dls_rx_promis.. + +ip`ip_input + + + +ip`tcp_send + + +mac`mac_rx_srs_drain + + + +dls`dls_rx_promisc + + + +mac`mac_tx_.. + +ip`ip_input + + + +mac`mac_srs_worker + + +ip`ipobs.. + + + + + + + + + + + + +ip`squeue_drain + +ip`tcp_output + + +ipnet`ipo.. + +dld`str_mdata_fastpath_put + + + + +dls`i_dls.. + +mac`mac_promisc_.. + + + + +ip`ip_inp.. + + + +ip`tcp_sendmsg + + + +unix`_sys_sysenter_post_swapgs + + + + +mac`mac_promisc_dispatch_one + + + + +igb`igb_intr_rx + +unix`av_dispatch_autovect + +ipnet`ipobs.. + + + +mac`mac_tx_send + +ip`ip_fanout_v4 + + +sockfs`socket_se.. + + +sockfs`socket_vop_writ.. + +dls`dls_r.. + + + +unix`switch_sp_and_call + +mac`mac_rx_srs_proto_fanout + + +mac`mac_tx + +mac`mac_rx_ring + + +ip`squeue_worker + + + +genunix`fop_writ.. + + + + + + + + + +mac`mac_tx_.. + + + +ip`ip_xmit + +mac`mac_promi.. + + +ip`tcp_wput_d.. + + +ip`ip_input + +ip`ill_input_short_v4 + + + + + + + + + + +ip`ill_in.. + + +mac`mac_tx_send + + +dld`str_mda.. + +ip`tcp_timer_handler + + + +mac`mac_rx + + + + +dld`str_mdata_fas.. + +ip`ill_input_shor.. + + + + +ip`ipobs_ho.. + +hook`hook_run + + + + + + + + + +genunix`writev32 + +mac`mac_promisc_.. + +ip`conn_ip_output + + + + + + + +mac`mac_rx_flow + + +dld`str_mdata_fa.. + + +mac`mac_p.. + +mac`mac_promisc_dispatch + + + + + + +mac`mac_tx + +genunix`fop_write + + +sockfs`socket_sendmsg + + + + + +genunix`writev + + + +mac`mac_tx_singl.. + + + + + +mac`mac_rx_classify + + +ip`ire_send_wire_v4 + + + + +mac`mac_tx + + + +ip`ip_input + + + + +ip`squeue_enter + +mac`mac_tx_single.. + + +sockfs`so_sendmsg + +mac`mac_promisc_d.. + +ip`ip_input + + +dls`dls_rx_.. + + +ip`conn_ip_output + + +hook`hook_run + + + + + +mac`mac_pro.. + +ip`ill_input_.. + +ip`conn_ip_outpu.. + +ip`ipobs_hook + +genunix`write32 + diff --git a/tools/FlameGraph/demos/cpu-linux-tar.svg b/tools/FlameGraph/demos/cpu-linux-tar.svg new file mode 100644 index 0000000..1068371 --- /dev/null +++ b/tools/FlameGraph/demos/cpu-linux-tar.svg @@ -0,0 +1,1418 @@ + + + + + + + + + + + + +Flame Graph + + +sch_direct_xmit (84 samples, 2.85%) + + +call_filldir (58 samples, 1.96%) + + +do_exit (6 samples, 0.20%) + + +sys_mmap_pgoff (2 samples, 0.07%) + + +__alloc_pages_nodemask (3 samples, 0.10%) + + +user_path_at_empty (1,177 samples, 39.87%) +user_path_at_empty + + +_copy_to_user (1 samples, 0.03%) + + +read_cache_page_async (4 samples, 0.14%) + + +do_last (57 samples, 1.93%) + + +__list_add (3 samples, 0.10%) + + +find_get_page (17 samples, 0.58%) + + +cap_file_alloc_security (1 samples, 0.03%) + + +user_path_at (1,184 samples, 40.11%) +user_path_at + + +path_init (17 samples, 0.58%) + + +flush_tlb_page (1 samples, 0.03%) + + +__do_softirq (1 samples, 0.03%) + + +unmap_region (2 samples, 0.07%) + + +__ext4_check_dir_entry (25 samples, 0.85%) + + +vfsmount_lock_local_lock (1 samples, 0.03%) + + +path_init (209 samples, 7.08%) +path_.. + + +n_tty_write (1 samples, 0.03%) + + +path_put (5 samples, 0.17%) + + +mem_cgroup_count_vm_event (2 samples, 0.07%) + + +page_add_file_rmap (1 samples, 0.03%) + + +copy_page (9 samples, 0.30%) + + +jiffies_to_usecs (1 samples, 0.03%) + + +__phys_addr (7 samples, 0.24%) + + +security_inode_permission (3 samples, 0.10%) + + +mntget (1 samples, 0.03%) + + +kern_path (1 samples, 0.03%) + + +__strncpy_from_user (2 samples, 0.07%) + + +security_inode_permission (74 samples, 2.51%) + + +writeback_single_inode (1 samples, 0.03%) + + +htree_dirblock_to_tree (408 samples, 13.82%) +htree_dirbl.. + + +__do_softirq (1 samples, 0.03%) + + +fd_install (3 samples, 0.10%) + + +sys_openat (230 samples, 7.79%) +sys_o.. + + +kfree (47 samples, 1.59%) + + +generic_file_aio_read (2 samples, 0.07%) + + +mntput_no_expire (2 samples, 0.07%) + + +copy_pte_range (1 samples, 0.03%) + + +module_put (1 samples, 0.03%) + + +get_empty_filp (107 samples, 3.62%) +g.. + + +__rb_rotate_right (3 samples, 0.10%) + + +virtqueue_kick (84 samples, 2.85%) + + +do_sync_read (2 samples, 0.07%) + + +__lookup_tag (1 samples, 0.03%) + + +page_put_link (1 samples, 0.03%) + + +cp_new_stat (88 samples, 2.98%) + + +do_fork (2 samples, 0.07%) + + +putname (9 samples, 0.30%) + + +rb_insert_color (38 samples, 1.29%) + + +exit_mmap (6 samples, 0.20%) + + +ext4_htree_fill_tree (410 samples, 13.89%) +ext4_htree_.. + + +____pagevec_lru_add (2 samples, 0.07%) + + +do_lookup (217 samples, 7.35%) +do_lo.. + + +inet_sendmsg (89 samples, 3.01%) +i.. + + +complete_walk (4 samples, 0.14%) + + +touch_atime (1 samples, 0.03%) + + +__dentry_open (23 samples, 0.78%) + + +file_ra_state_init (5 samples, 0.17%) + + +sys_readlinkat (107 samples, 3.62%) +s.. + + +security_file_fcntl (3 samples, 0.10%) + + +_cond_resched (3 samples, 0.10%) + + +writeback_sb_inodes (1 samples, 0.03%) + + +generic_fillattr (1 samples, 0.03%) + + +__writeback_inodes_wb (1 samples, 0.03%) + + +_raw_spin_lock (1 samples, 0.03%) + + +unix_find_other (1 samples, 0.03%) + + +__list_del_entry (5 samples, 0.17%) + + +__phys_addr (9 samples, 0.30%) + + +ip_finish_output (84 samples, 2.85%) + + +sys_clone (2 samples, 0.07%) + + +vfsmount_lock_local_unlock (8 samples, 0.27%) + + +wb_writeback (1 samples, 0.03%) + + +radix_tree_lookup_slot (1 samples, 0.03%) + + +copy_user_highpage (9 samples, 0.30%) + + +cap_file_permission (2 samples, 0.07%) + + +alloc_pages_current (2 samples, 0.07%) + + +free_rb_tree_fname (70 samples, 2.37%) + + +touch_atime (11 samples, 0.37%) + + +find_get_page (2 samples, 0.07%) + + +alloc_fd (15 samples, 0.51%) + + +kfree (3 samples, 0.10%) + + +page_add_new_anon_rmap (2 samples, 0.07%) + + +ip_output (84 samples, 2.85%) + + +sys_close (124 samples, 4.20%) +sy.. + + +sys_munmap (2 samples, 0.07%) + + +path_lookupat (1 samples, 0.03%) + + +tcp_transmit_skb (85 samples, 2.88%) + + +tlb_flush_mmu (1 samples, 0.03%) + + +security_file_free (2 samples, 0.07%) + + +lru_add_drain (2 samples, 0.07%) + + +put_page (5 samples, 0.17%) + + +__d_alloc (1 samples, 0.03%) + + +strncpy_from_user (6 samples, 0.20%) + + +put_pid (1 samples, 0.03%) + + +tcp_rcv_established (1 samples, 0.03%) + + +_copy_to_user (2 samples, 0.07%) + + +tlb_finish_mmu (1 samples, 0.03%) + + +path_lookupat (716 samples, 24.25%) +path_lookupat + + +__page_cache_release.part.1 (2 samples, 0.07%) + + +vfs_readlink (23 samples, 0.78%) + + +smp_apic_timer_interrupt (1 samples, 0.03%) + + +radix_tree_lookup_element (11 samples, 0.37%) + + +mntput_no_expire (2 samples, 0.07%) + + +do_read_cache_page (4 samples, 0.14%) + + +handle_mm_fault (14 samples, 0.47%) + + +tcp_v4_md5_lookup (1 samples, 0.03%) + + +kmem_cache_free (187 samples, 6.33%) +kmem.. + + +locks_remove_posix (7 samples, 0.24%) + + +path_init (7 samples, 0.24%) + + +system_call_after_swapgs (79 samples, 2.68%) + + +putname (15 samples, 0.51%) + + +_cond_resched (1 samples, 0.03%) + + +locks_remove_flock (2 samples, 0.07%) + + +path_put (3 samples, 0.10%) + + +vfs_getattr (174 samples, 5.89%) +vfs.. + + +ext4_getblk (61 samples, 2.07%) + + +files_lglock_local_lock_cpu (2 samples, 0.07%) + + +copy_user_generic_unrolled (11 samples, 0.37%) + + +do_sys_open (229 samples, 7.76%) +do_sy.. + + +__d_lookup_rcu (3 samples, 0.10%) + + +_raw_spin_unlock_irqrestore (1 samples, 0.03%) + + +sys_ioctl (1 samples, 0.03%) + + +ext4_bread (62 samples, 2.10%) + + +__slab_alloc (1 samples, 0.03%) + + +do_lookup (5 samples, 0.17%) + + +all (2,952 samples, 100%) + + + +__tcp_push_pending_frames (86 samples, 2.91%) + + +do_path_lookup (728 samples, 24.66%) +do_path_lookup + + +_raw_spin_unlock_irqrestore (2 samples, 0.07%) + + +pty_write (1 samples, 0.03%) + + +copy_user_generic_unrolled (24 samples, 0.81%) + + +pagevec_lru_move_fn (1 samples, 0.03%) + + +filp_close (119 samples, 4.03%) +fi.. + + +sys_newfstatat (1,598 samples, 54.13%) +sys_newfstatat + + +cap_inode_getattr (4 samples, 0.14%) + + +fsnotify_find_inode_mark (2 samples, 0.07%) + + +filemap_fault (2 samples, 0.07%) + + +read_cache_page (6 samples, 0.20%) + + +get_slab (12 samples, 0.41%) + + +tcp_write_xmit (86 samples, 2.91%) + + +kmem_cache_alloc (95 samples, 3.22%) +k.. + + +kthread (13 samples, 0.44%) + + +find_get_pages_tag (1 samples, 0.03%) + + +__kmalloc (49 samples, 1.66%) + + +__strncpy_from_user (5 samples, 0.17%) + + +radix_tree_gang_lookup_tag_slot (1 samples, 0.03%) + + +run_timer_softirq (1 samples, 0.03%) + + +start_xmit (84 samples, 2.85%) + + +copy_thread (1 samples, 0.03%) + + +__d_lookup_rcu (5 samples, 0.17%) + + +generic_permission (1 samples, 0.03%) + + +vfs_write (90 samples, 3.05%) +v.. + + +generic_fillattr (78 samples, 2.64%) + + +filldir (38 samples, 1.29%) + + +_cond_resched (1 samples, 0.03%) + + +generic_permission (3 samples, 0.10%) + + +fget_raw_light (4 samples, 0.14%) + + +current_kernel_time (1 samples, 0.03%) + + +mntget (2 samples, 0.07%) + + +do_path_lookup (1 samples, 0.03%) + + +ip_local_out (84 samples, 2.85%) + + +____pagevec_lru_add (1 samples, 0.03%) + + +dput (3 samples, 0.10%) + + +lru_add_drain (1 samples, 0.03%) + + +kmem_cache_alloc (51 samples, 1.73%) + + +do_mmap_pgoff (2 samples, 0.07%) + + +inode_permission (3 samples, 0.10%) + + +_raw_spin_lock (7 samples, 0.24%) + + +perf_event_mmap (1 samples, 0.03%) + + +__tlb_remove_page (5 samples, 0.17%) + + +cap_file_fcntl (2 samples, 0.07%) + + +queue_work (1 samples, 0.03%) + + +mntput_no_expire (23 samples, 0.78%) + + +fsnotify (2 samples, 0.07%) + + +rb_first (2 samples, 0.07%) + + +do_softirq (1 samples, 0.03%) + + +kmem_cache_alloc (1 samples, 0.03%) + + +mutex_lock_killable (2 samples, 0.07%) + + +bdi_writeback_thread (1 samples, 0.03%) + + +__do_fault (4 samples, 0.14%) + + +handle_pte_fault (11 samples, 0.37%) + + +security_inode_permission (8 samples, 0.27%) + + +inode_permission (11 samples, 0.37%) + + +kmem_cache_alloc (1 samples, 0.03%) + + +get_page_from_freelist (1 samples, 0.03%) + + +_cond_resched (6 samples, 0.20%) + + +ioread8 (1 samples, 0.03%) + + +schedule (1 samples, 0.03%) + + +__schedule (3 samples, 0.10%) + + +copy_user_generic_unrolled (4 samples, 0.14%) + + +touch_atime (1 samples, 0.03%) + + +tcp_v4_md5_do_lookup (1 samples, 0.03%) + + +dev_queue_xmit (84 samples, 2.85%) + + +__slab_free (10 samples, 0.34%) + + +path_openat (180 samples, 6.10%) +path.. + + +sys_newfstat (49 samples, 1.66%) + + +schedule (3 samples, 0.10%) + + +system_call_fastpath (2,834 samples, 96.00%) +system_call_fastpath + + +kmem_cache_free (14 samples, 0.47%) + + +getname_flags (7 samples, 0.24%) + + +putname (189 samples, 6.40%) +putn.. + + +up_read (1 samples, 0.03%) + + +get_page_from_freelist (2 samples, 0.07%) + + +__find_get_block (38 samples, 1.29%) + + +user_path_at_empty (59 samples, 2.00%) + + +security_inode_getattr (9 samples, 0.30%) + + +link_path_walk (118 samples, 4.00%) +l.. + + +finish_task_switch (1 samples, 0.03%) + + +d_alloc (1 samples, 0.03%) + + +fget (9 samples, 0.30%) + + +pagevec_lookup_tag (1 samples, 0.03%) + + +kernel_thread_helper (13 samples, 0.44%) + + +vfs_getattr (11 samples, 0.37%) + + +__alloc_pages_nodemask (2 samples, 0.07%) + + +_cond_resched (2 samples, 0.07%) + + +nameidata_to_filp (30 samples, 1.02%) + + +strlen (17 samples, 0.58%) + + +vfsmount_lock_local_lock (15 samples, 0.51%) + + +ptep_clear_flush (1 samples, 0.03%) + + +tty_write (1 samples, 0.03%) + + +link_path_walk (5 samples, 0.17%) + + +vfs_readdir (577 samples, 19.55%) +vfs_readdir + + +str2hashbuf_signed (59 samples, 2.00%) + + +tcp_ack (1 samples, 0.03%) + + +ext4_htree_free_dir_info (73 samples, 2.47%) + + +__getblk (38 samples, 1.29%) + + +release_sock (1 samples, 0.03%) + + +fsnotify (3 samples, 0.10%) + + +do_vfs_ioctl (1 samples, 0.03%) + + +do_munmap (1 samples, 0.03%) + + +do_filp_open (181 samples, 6.13%) +do_f.. + + +generic_readlink (40 samples, 1.36%) + + +sys_mmap (2 samples, 0.07%) + + +inode_permission (4 samples, 0.14%) + + +sys_open (2 samples, 0.07%) + + +memset (7 samples, 0.24%) + + +__percpu_counter_add (3 samples, 0.10%) + + +sock_aio_write (89 samples, 3.01%) +s.. + + +khugepaged (9 samples, 0.30%) + + +generic_permission (8 samples, 0.27%) + + +__rb_rotate_left (1 samples, 0.03%) + + +path_lookupat (37 samples, 1.25%) + + +ext4_da_writepages (1 samples, 0.03%) + + +security_file_alloc (11 samples, 0.37%) + + +complete_walk (37 samples, 1.25%) + + +ip_queue_xmit (84 samples, 2.85%) + + +tcp_send_mss (2 samples, 0.07%) + + +ext4_getattr (101 samples, 3.42%) +e.. + + +unmap_region (3 samples, 0.10%) + + +unix_stream_connect (1 samples, 0.03%) + + +sys_read (2 samples, 0.07%) + + +__fsnotify_parent (1 samples, 0.03%) + + +radix_tree_lookup_slot (11 samples, 0.37%) + + +fget_raw_light (3 samples, 0.10%) + + +dput (45 samples, 1.52%) + + +__lru_cache_add (1 samples, 0.03%) + + +n_tty_ioctl_helper (1 samples, 0.03%) + + +fget_raw_light (38 samples, 1.29%) + + +free_hot_cold_page (2 samples, 0.07%) + + +sys_getdents (592 samples, 20.05%) +sys_getdents + + +do_wp_page (1 samples, 0.03%) + + +do_lookup (7 samples, 0.24%) + + +mem_cgroup_pgfault (1 samples, 0.03%) + + +tcp_established_options (1 samples, 0.03%) + + +copy_user_generic_unrolled (16 samples, 0.54%) + + +current_fs_time (1 samples, 0.03%) + + +clocksource_watchdog (1 samples, 0.03%) + + +path_get (4 samples, 0.14%) + + +new_slab (2 samples, 0.07%) + + +path_openat (2 samples, 0.07%) + + +call_softirq (1 samples, 0.03%) + + +wait_on_page_read (1 samples, 0.03%) + + +_cond_resched (1 samples, 0.03%) + + +do_munmap (6 samples, 0.20%) + + +link_path_walk (8 samples, 0.27%) + + +ext4fs_dirhash (154 samples, 5.22%) +ext.. + + +cp_new_stat (23 samples, 0.78%) + + +inode_permission (22 samples, 0.75%) + + +cap_inode_permission (2 samples, 0.07%) + + +_raw_spin_unlock_irqrestore (1 samples, 0.03%) + + +sys_write (90 samples, 3.05%) +s.. + + +half_md4_transform (86 samples, 2.91%) + + +_raw_spin_lock (2 samples, 0.07%) + + +d_alloc_and_lookup (1 samples, 0.03%) + + +_cond_resched (1 samples, 0.03%) + + +mem_cgroup_update_page_stat (1 samples, 0.03%) + + +exit_mm (6 samples, 0.20%) + + +current_fs_time (6 samples, 0.20%) + + +mark_page_accessed (2 samples, 0.07%) + + +ext4_ext_map_blocks (15 samples, 0.51%) + + +sys_fcntl (17 samples, 0.58%) + + +mntput (3 samples, 0.10%) + + +put_page (1 samples, 0.03%) + + +fsnotify (2 samples, 0.07%) + + +find_get_page (4 samples, 0.14%) + + +tcp_v4_do_rcv (1 samples, 0.03%) + + +_raw_spin_lock (2 samples, 0.07%) + + +_raw_spin_lock (1 samples, 0.03%) + + +__d_lookup_rcu (1 samples, 0.03%) + + +copy_page_range (1 samples, 0.03%) + + +security_file_permission (13 samples, 0.44%) + + +sys_connect (1 samples, 0.03%) + + +do_path_lookup (38 samples, 1.29%) + + +_raw_spin_unlock_irqrestore (1 samples, 0.03%) + + +irq_exit (1 samples, 0.03%) + + +rb_erase (1 samples, 0.03%) + + +__memcpy (13 samples, 0.44%) + + +do_lookup (1 samples, 0.03%) + + +do_writepages (1 samples, 0.03%) + + +current_kernel_time (1 samples, 0.03%) + + +do_sync_write (89 samples, 3.01%) +d.. + + +mmput (6 samples, 0.20%) + + +ext4_htree_store_dirent (148 samples, 5.01%) +ext.. + + +_cond_resched (1 samples, 0.03%) + + +generic_permission (8 samples, 0.27%) + + +vp_notify (84 samples, 2.85%) + + +security_inode_getattr (6 samples, 0.20%) + + +security_inode_permission (1 samples, 0.03%) + + +unmap_vmas (1 samples, 0.03%) + + +__find_get_block_slow (25 samples, 0.85%) + + +_raw_spin_lock (1 samples, 0.03%) + + +do_group_exit (6 samples, 0.20%) + + +_raw_spin_lock (1 samples, 0.03%) + + +mark_page_accessed (1 samples, 0.03%) + + +schedule_work (1 samples, 0.03%) + + +fput (107 samples, 3.62%) +f.. + + +link_path_walk (1 samples, 0.03%) + + +do_lookup (1 samples, 0.03%) + + +alloc_pages_vma (4 samples, 0.14%) + + +getname (7 samples, 0.24%) + + +_raw_spin_lock (1 samples, 0.03%) + + +__strncpy_from_user (59 samples, 2.00%) + + +fget (7 samples, 0.24%) + + +__fsnotify_parent (1 samples, 0.03%) + + +__phys_addr (7 samples, 0.24%) + + +process_one_work (1 samples, 0.03%) + + +generic_permission (2 samples, 0.07%) + + +page_fault (19 samples, 0.64%) + + +clear_page (2 samples, 0.07%) + + +tcp_established_options (1 samples, 0.03%) + + +kmem_cache_alloc_trace (23 samples, 0.78%) + + +tty_ioctl (1 samples, 0.03%) + + +complete_walk (2 samples, 0.07%) + + +ext4_map_blocks (22 samples, 0.75%) + + +tcp_v4_md5_lookup (1 samples, 0.03%) + + +sys_exit_group (6 samples, 0.20%) + + +worker_thread (2 samples, 0.07%) + + +file_sb_list_add (7 samples, 0.24%) + + +vfs_fstatat (1,503 samples, 50.91%) +vfs_fstatat + + +mmap_region (2 samples, 0.07%) + + +tty_flip_buffer_push (1 samples, 0.03%) + + +lru_cache_add_lru (2 samples, 0.07%) + + +pagevec_lru_move_fn (1 samples, 0.03%) + + +do_sys_open (2 samples, 0.07%) + + +getname_flags (252 samples, 8.54%) +getnam.. + + +mntput (29 samples, 0.98%) + + +dup_mm (1 samples, 0.03%) + + +__slab_free (4 samples, 0.14%) + + +getname_flags (8 samples, 0.27%) + + +sys_ppoll (1 samples, 0.03%) + + +sysret_check (1 samples, 0.03%) + + +free_rb_tree_fname (9 samples, 0.30%) + + +copy_process (2 samples, 0.07%) + + +_cond_resched (1 samples, 0.03%) + + +unmap_region (1 samples, 0.03%) + + +rb_next (18 samples, 0.61%) + + +____pagevec_lru_add (1 samples, 0.03%) + + +queue_work_on (1 samples, 0.03%) + + +_copy_to_user (6 samples, 0.20%) + + +_cond_resched (5 samples, 0.17%) + + +mntget (11 samples, 0.37%) + + +generic_fillattr (17 samples, 0.58%) + + +relay_file_poll (1 samples, 0.03%) + + +path_put (135 samples, 4.57%) +pa.. + + +__schedule (1 samples, 0.03%) + + +kfree (5 samples, 0.17%) + + +vfs_fstat (24 samples, 0.81%) + + +current_fs_time (1 samples, 0.03%) + + +mntput (2 samples, 0.07%) + + +cap_inode_permission (2 samples, 0.07%) + + +fput (3 samples, 0.10%) + + +sysret_careful (3 samples, 0.10%) + + +pagevec_lru_move_fn (1 samples, 0.03%) + + +wb_do_writeback (1 samples, 0.03%) + + +do_munmap (2 samples, 0.07%) + + +dnotify_flush (2 samples, 0.07%) + + +mark_page_accessed (1 samples, 0.03%) + + +get_vma_policy (1 samples, 0.03%) + + +expand_files (4 samples, 0.14%) + + +__phys_addr (66 samples, 2.24%) + + +cap_inode_permission (7 samples, 0.24%) + + +run_ksoftirqd (1 samples, 0.03%) + + +ext4_ext_check_cache (4 samples, 0.14%) + + +link_path_walk (1 samples, 0.03%) + + +__put_single_page (4 samples, 0.14%) + + +unmap_vmas (6 samples, 0.20%) + + +memset (9 samples, 0.30%) + + +security_inode_permission (2 samples, 0.07%) + + +n_tty_ioctl (1 samples, 0.03%) + + +_copy_to_user (1 samples, 0.03%) + + +find_next_zero_bit (4 samples, 0.14%) + + +sys_brk (6 samples, 0.20%) + + +free_page_and_swap_cache (5 samples, 0.17%) + + +fput (1 samples, 0.03%) + + +ext4_data_block_valid (3 samples, 0.10%) + + +_raw_spin_unlock_irqrestore (1 samples, 0.03%) + + +tcp_sendmsg (89 samples, 3.01%) +t.. + + +__put_user_8 (1 samples, 0.03%) + + +vfsmount_lock_local_lock (9 samples, 0.30%) + + +kmem_cache_free (9 samples, 0.30%) + + +do_filp_open (2 samples, 0.07%) + + +anon_vma_clone (1 samples, 0.03%) + + +do_page_fault (19 samples, 0.64%) + + +__fsnotify_parent (1 samples, 0.03%) + + +_raw_spin_lock (2 samples, 0.07%) + + +__queue_work (1 samples, 0.03%) + + +iowrite16 (84 samples, 2.85%) + + +dput (1 samples, 0.03%) + + +strncpy_from_user (8 samples, 0.27%) + + +fsnotify (3 samples, 0.10%) + + +page_follow_link_light (13 samples, 0.44%) + + +finish_task_switch (3 samples, 0.10%) + + +security_dentry_open (4 samples, 0.14%) + + +__slab_alloc (4 samples, 0.14%) + + +tcp_current_mss (1 samples, 0.03%) + + +dev_hard_start_xmit (84 samples, 2.85%) + + +fget_raw (4 samples, 0.14%) + + +do_sys_poll (1 samples, 0.03%) + + +ext4_release_dir (73 samples, 2.47%) + + +stub_clone (2 samples, 0.07%) + + +apic_timer_interrupt (1 samples, 0.03%) + + +lru_add_drain (1 samples, 0.03%) + + +__split_vma (1 samples, 0.03%) + + +ext4_num_dirty_pages (1 samples, 0.03%) + + +inode_permission (89 samples, 3.01%) +i.. + + +fput (2 samples, 0.07%) + + +__call_rcu (5 samples, 0.17%) + + +page_getlink (13 samples, 0.44%) + + +ext4_readdir (548 samples, 18.56%) +ext4_readdir + + +vfs_read (2 samples, 0.07%) + + +strncpy_from_user (140 samples, 4.74%) +st.. + + +file_sb_list_del (7 samples, 0.24%) + + +ata_sff_check_status (1 samples, 0.03%) + + +__d_lookup_rcu (202 samples, 6.84%) +__d_.. + + +__slab_alloc (91 samples, 3.08%) +_.. + + +ata_sff_pio_task (1 samples, 0.03%) + + +call_rcu_sched (9 samples, 0.30%) + + diff --git a/tools/FlameGraph/demos/cpu-linux-tcpsend.svg b/tools/FlameGraph/demos/cpu-linux-tcpsend.svg new file mode 100644 index 0000000..2012b79 --- /dev/null +++ b/tools/FlameGraph/demos/cpu-linux-tcpsend.svg @@ -0,0 +1,449 @@ + + + + + + + + + + + + +Flame Graph +Function: + + + + + + + + + + + + + + + + + + +inet_sendmsg + + + + + + + + + + + +sch_direct_xmit + + + +vfs_write + + + + +start_xmit + + + +ip_queue_xmit + + + + + + + + + + +ip_finish_output + + + + + + + + +virtqueue_kick + + + + + +__do_softi.. + + + + + + + + + + + + + + + + + + + + + + + + + + + +nf_iter.. + + + + + + + + + + + + + + +__ip_loc.. + + + + + + + + + + + + + + + + + +sys_write + +local_bh_en.. + + + + + + + + + + + + + +sock_aio_write + + + + + + + + + + + + + + + + + + + + + + + + + +dev_hard_start_xmit + + + +tcp_sendmsg + + + + +ip_local_out + + + + + + +ip_rc.. + + + + + + + + + + + + + + + + + + + + + + + +system_call_fastpath + + +virtnet_po.. + + + + + + + + + + + +vp_notify + + + + + + + + + + +iowrite16 + + +tcp_write_xmit + + + + + + +tcp_transmit_skb + + + + + + + +do_sync_write + + + + + +nf_hook_.. + + + + + + + + + + + + + + + + + + + + +netif_r.. + + + + + + + + + + + + + + + + + + + + + + +net_rx_act.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +do_softirq + + + + + + + + + + + + +ip_output + + +call_softi.. + + + + + + + + + + + + + + + + + +__netif.. + + + + + + + + + +tcp_push_one + + + + + + + + + + + + + + + +dev_queue_xmit + + + + + + + + + + + + + + diff --git a/tools/FlameGraph/demos/cpu-mixedmode-flamegraph-java.svg b/tools/FlameGraph/demos/cpu-mixedmode-flamegraph-java.svg new file mode 100644 index 0000000..704339e --- /dev/null +++ b/tools/FlameGraph/demos/cpu-mixedmode-flamegraph-java.svg @@ -0,0 +1,3065 @@ + + + + + + + + + + + + +CPU Mixed-Mode Flame Graph: green == Java, yellow == C++, red == system + +Reset Zoom + +Lorg/mozilla/javascript/IdScriptableObject:.has (1 samples, 0.10%) + + + +mprotect_fixup (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.put (1 samples, 0.10%) + + + +Ljava/util/HashMap:.getNode (2 samples, 0.20%) + + + +read_tsc (1 samples, 0.10%) + + + +loopback_xmit (5 samples, 0.50%) + + + +Lorg/mozilla/javascript/ScriptableObject:.createSlot (15 samples, 1.51%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.bind (1 samples, 0.10%) + + + +netif_rx (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.setAttributes (5 samples, 0.50%) + + + +default_wake_function (25 samples, 2.51%) +de.. + + +Lorg/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +CardTableExtension::scavenge_contents_parallel (20 samples, 2.01%) +C.. + + +Lsun/nio/ch/FileDispatcherImpl:.write0 (203 samples, 20.40%) +Lsun/nio/ch/FileDispatcherImpl:... + + +Lorg/mozilla/javascript/IdScriptableObject:.get (7 samples, 0.70%) + + + +Lorg/mozilla/javascript/ScriptableObject$Slot:.getValue (1 samples, 0.10%) + + + +resched_task (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.10%) + + + +group_sched_in (4 samples, 0.40%) + + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.contains (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.10%) + + + +Lio/netty/channel/ChannelOutboundBuffer:.current (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.contains (1 samples, 0.10%) + + + +Lio/netty/buffer/AbstractByteBuf:.checkSrcIndex (3 samples, 0.30%) + + + +_raw_spin_lock (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +sys_read (28 samples, 2.81%) +sy.. + + +tcp_cleanup_rbuf (2 samples, 0.20%) + + + +effective_load.isra.35 (2 samples, 0.20%) + + + +Monitor::wait (1 samples, 0.10%) + + + +tcp_wfree (2 samples, 0.20%) + + + +Lio/netty/channel/ChannelOutboundBuffer:.progress (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp (4 samples, 0.40%) + + + +Lio/netty/handler/codec/http/HttpHeaders:.encodeAscii0 (2 samples, 0.20%) + + + +__netif_receive_skb_core (94 samples, 9.45%) +__netif_recei.. + + +Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype (1 samples, 0.10%) + + + +msecs_to_jiffies (1 samples, 0.10%) + + + +Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived (540 samples, 54.27%) +Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived + + +process_backlog (97 samples, 9.75%) +process_backlog + + +Lorg/mozilla/javascript/WrapFactory:.wrap (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype (7 samples, 0.70%) + + + +Lorg/mozilla/javascript/NativeCall:.init (16 samples, 1.61%) + + + +Ljava/nio/DirectByteBuffer:.duplicate (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getTopLevelScope (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.put (9 samples, 0.90%) + + + +Lorg/mozilla/javascript/ScriptableObject:.createSlot (5 samples, 0.50%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.toObjectOrNull (2 samples, 0.20%) + + + +lock_sock_nested (1 samples, 0.10%) + + + +__netif_receive_skb (94 samples, 9.45%) +__netif_recei.. + + +fput (1 samples, 0.10%) + + + +Lorg/vertx/java/core/http/impl/AssembledFullHttpResponse:.toLastContent (2 samples, 0.20%) + + + +__wake_up_common (25 samples, 2.51%) +__.. + + +tcp_rearm_rto (5 samples, 0.50%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction (3 samples, 0.30%) + + + +update_rq_clock.part.63 (1 samples, 0.10%) + + + +Lio/netty/util/internal/AppendableCharSequence:.substring (4 samples, 0.40%) + + + +JavaCalls::call_virtual (956 samples, 96.08%) +JavaCalls::call_virtual + + +tcp_ack (20 samples, 2.01%) +t.. + + +Ljava/util/HashMap:.getNode (1 samples, 0.10%) + + + +dev_queue_xmit (11 samples, 1.11%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.10%) + + + +__lll_unlock_wake (1 samples, 0.10%) + + + +tcp_try_rmem_schedule (2 samples, 0.20%) + + + +Lio/netty/buffer/UnpooledHeapByteBuf:.init (1 samples, 0.10%) + + + +internal_add_timer (1 samples, 0.10%) + + + +apparmor_socket_sendmsg (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeJavaObject:.initMembers (1 samples, 0.10%) + + + +Lio/netty/buffer/AbstractByteBuf:.forEachByteAsc0 (2 samples, 0.20%) + + + +__perf_event_enable (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype (5 samples, 0.50%) + + + +InstanceKlass::oop_push_contents (8 samples, 0.80%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.10%) + + + +Lio/netty/channel/DefaultChannelPromise:.trySuccess (3 samples, 0.30%) + + + +Lio/netty/buffer/AbstractByteBuf:.getByte (1 samples, 0.10%) + + + +[unknown] (30 samples, 3.02%) +[un.. + + +__wake_up_sync_key (27 samples, 2.71%) +__.. + + +Ljava/util/Arrays:.copyOf (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.add0 (1 samples, 0.10%) + + + +apparmor_file_permission (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeFunction:.initScriptFunction (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.10%) + + + +tcp_poll (1 samples, 0.10%) + + + +common_file_perm (1 samples, 0.10%) + + + +ep_poll_callback (27 samples, 2.71%) +ep.. + + +check_preempt_curr (2 samples, 0.20%) + + + +sock_aio_read (22 samples, 2.21%) +s.. + + +Lio/netty/handler/codec/http/HttpObjectDecoder:.findNonWhitespace (1 samples, 0.10%) + + + +bictcp_acked (1 samples, 0.10%) + + + +Ljava/util/concurrent/ConcurrentHashMap:.get (3 samples, 0.30%) + + + +inet_recvmsg (17 samples, 1.71%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp (3 samples, 0.30%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (2 samples, 0.20%) + + + +_raw_spin_unlock_bh (1 samples, 0.10%) + + + +Lsun/nio/ch/FileDispatcherImpl:.read0 (31 samples, 3.12%) +Lsu.. + + +Lio/netty/buffer/PooledByteBuf:.deallocate (2 samples, 0.20%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (1 samples, 0.10%) + + + +itable stub (1 samples, 0.10%) + + + +Lio/netty/buffer/AbstractByteBuf:.writeBytes (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (6 samples, 0.60%) + + + +tcp_set_skb_tso_segs (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (1 samples, 0.10%) + + + +ep_poll (4 samples, 0.40%) + + + +Lio/netty/buffer/AbstractByteBuf:.ensureWritable (2 samples, 0.20%) + + + +Interpreter (956 samples, 96.08%) +Interpreter + + +Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction (5 samples, 0.50%) + + + +Ljava/nio/charset/Charset:.lookup (2 samples, 0.20%) + + + +Ljava/lang/ThreadLocal:.get (1 samples, 0.10%) + + + +Lio/netty/buffer/AbstractByteBuf:.checkSrcIndex (1 samples, 0.10%) + + + +Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read (939 samples, 94.37%) +Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read + + +Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction (1 samples, 0.10%) + + + +tcp_clean_rtx_queue (14 samples, 1.41%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction (8 samples, 0.80%) + + + +Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.10%) + + + +Ljava/lang/String:.init (1 samples, 0.10%) + + + +Ljava/lang/ThreadLocal:.get (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeJavaObject:.initMembers (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.bind (1 samples, 0.10%) + + + +Lorg/vertx/java/core/impl/DefaultVertx:.setContext (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Lsun/nio/ch/SocketChannelImpl:.isConnected (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction (4 samples, 0.40%) + + + +frame::oops_do_internal (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.setName (5 samples, 0.50%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (3 samples, 0.30%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.setAttributes (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.put (6 samples, 0.60%) + + + +skb_release_all (3 samples, 0.30%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (30 samples, 3.02%) +Lor.. + + +sk_reset_timer (5 samples, 0.50%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (416 samples, 41.81%) +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_ver.. + + +Lio/netty/handler/codec/http/HttpHeaders:.hash (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +itable stub (1 samples, 0.10%) + + + +__slab_alloc (1 samples, 0.10%) + + + +vtable stub (1 samples, 0.10%) + + + +PSPromotionManager::drain_stacks_depth (2 samples, 0.20%) + + + +do_softirq (103 samples, 10.35%) +do_softirq + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.init (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.newPromise (1 samples, 0.10%) + + + +Lorg/vertx/java/core/impl/DefaultVertx:.setContext (1 samples, 0.10%) + + + +vfs_read (25 samples, 2.51%) +vf.. + + +change_protection_range (1 samples, 0.10%) + + + +__do_softirq (103 samples, 10.35%) +__do_softirq + + +ipv4_dst_check (1 samples, 0.10%) + + + +change_protection (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (7 samples, 0.70%) + + + +Lio/netty/util/Recycler:.get (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (1 samples, 0.10%) + + + +tcp_queue_rcv (2 samples, 0.20%) + + + +jlong_disjoint_arraycopy (1 samples, 0.10%) + + + +Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete (242 samples, 24.32%) +Lio/netty/handler/codec/ByteToMessageD.. + + +Lio/netty/buffer/AbstractByteBuf:.forEachByteAsc0 (3 samples, 0.30%) + + + +copy_user_generic_string (3 samples, 0.30%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (5 samples, 0.50%) + + + +sched_clock_cpu (1 samples, 0.10%) + + + +Lsun/nio/ch/SocketChannelImpl:.read (40 samples, 4.02%) +Lsun.. + + +Lorg/mozilla/javascript/ScriptRuntime:.setName (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/BaseFunction:.findInstanceIdInfo (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannel:.hashCode (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.20%) + + + +Lio/netty/buffer/AbstractByteBufAllocator:.heapBuffer (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Lio/netty/util/Recycler:.get (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/HttpObjectEncoder:.encode (17 samples, 1.71%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.flush (235 samples, 23.62%) +Lio/netty/channel/AbstractChannelHand.. + + +Lorg/mozilla/javascript/IdScriptableObject:.has (9 samples, 0.90%) + + + +Ljava/lang/ThreadLocal:.get (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.put (47 samples, 4.72%) +Lorg/.. + + +ClassLoaderDataGraph::oops_do (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeJavaMethod:.findCachedFunction (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (1 samples, 0.10%) + + + +Ljava/lang/String:.init (1 samples, 0.10%) + + + +sk_reset_timer (2 samples, 0.20%) + + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.add0 (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (5 samples, 0.50%) + + + +Lsun/nio/ch/NativeThread:.current (1 samples, 0.10%) + + + +netdev_pick_tx (1 samples, 0.10%) + + + +ParallelTaskTerminator::offer_termination (2 samples, 0.20%) + + + +itable stub (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.10%) + + + +__copy_skb_header (1 samples, 0.10%) + + + +pthread_self (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeFunction:.initScriptFunction (2 samples, 0.20%) + + + +Lio/netty/buffer/AbstractByteBuf:.checkIndex (3 samples, 0.30%) + + + +__tcp_ack_snd_check (5 samples, 0.50%) + + + +tcp_send_mss (6 samples, 0.60%) + + + +_raw_spin_unlock_bh (1 samples, 0.10%) + + + +system_call_fastpath (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Ljava/lang/Integer:.toString (1 samples, 0.10%) + + + +Interpreter (956 samples, 96.08%) +Interpreter + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (513 samples, 51.56%) +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0.. + + +Lorg/mozilla/javascript/IdScriptableObject:.get (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeJavaMethod:.call (10 samples, 1.01%) + + + +__GI___mprotect (1 samples, 0.10%) + + + +__libc_write (1 samples, 0.10%) + + + +Lio/netty/util/Recycler:.recycle (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +fput (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (6 samples, 0.60%) + + + +VMThread::run (1 samples, 0.10%) + + + +tcp_send_delayed_ack (5 samples, 0.50%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (24 samples, 2.41%) +Lo.. + + +_raw_spin_lock_irqsave (2 samples, 0.20%) + + + +Lsun/nio/ch/NativeThread:.current (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (12 samples, 1.21%) + + + +tcp_v4_md5_lookup (1 samples, 0.10%) + + + +tcp_check_space (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.setAttributes (7 samples, 0.70%) + + + +ip_local_deliver_finish (89 samples, 8.94%) +ip_local_del.. + + +Lio/netty/channel/AbstractChannelHandlerContext:.validatePromise (2 samples, 0.20%) + + + +SafepointSynchronize::begin (1 samples, 0.10%) + + + +tcp_data_queue (39 samples, 3.92%) +tcp_.. + + +tcp_clean_rtx_queue (1 samples, 0.10%) + + + +GCTaskThread::run (28 samples, 2.81%) +GC.. + + +_raw_spin_lock_bh (1 samples, 0.10%) + + + +security_file_permission (2 samples, 0.20%) + + + +call_stub (956 samples, 96.08%) +call_stub + + +Lorg/mozilla/javascript/IdScriptableObject:.setAttributes (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (156 samples, 15.68%) +Lorg/mozilla/javascript/.. + + +tcp_urg (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.10%) + + + +Lio/netty/channel/ChannelOutboundBuffer:.decrementPendingOutboundBytes (1 samples, 0.10%) + + + +Lio/netty/util/Recycler:.get (1 samples, 0.10%) + + + +lock_timer_base.isra.35 (1 samples, 0.10%) + + + +release_sock (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.flush (238 samples, 23.92%) +Lio/netty/channel/AbstractChannelHand.. + + +ip_rcv_finish (1 samples, 0.10%) + + + +account_entity_enqueue (1 samples, 0.10%) + + + +remote_function (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/ScriptableObject:.createSlot (8 samples, 0.80%) + + + +fdval (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.write (2 samples, 0.20%) + + + +aa_revalidate_sk (1 samples, 0.10%) + + + +rw_verify_area (2 samples, 0.20%) + + + +Lio/netty/channel/nio/NioEventLoop:.select (7 samples, 0.70%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.createSlot (11 samples, 1.11%) + + + +JavaCalls::call_helper (956 samples, 96.08%) +JavaCalls::call_helper + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/HttpObjectEncoder:.encode (1 samples, 0.10%) + + + +Ljava/lang/String:.trim (1 samples, 0.10%) + + + +vtable stub (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/NativeJavaMethod:.findCachedFunction (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (77 samples, 7.74%) +Lorg/mozil.. + + +x86_pmu_commit_txn (4 samples, 0.40%) + + + +skb_network_protocol (1 samples, 0.10%) + + + +Lorg/vertx/java/core/net/impl/ConnectionBase:.write (38 samples, 3.82%) +Lorg.. + + +Lio/netty/handler/codec/http/HttpMethod:.valueOf (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (9 samples, 0.90%) + + + +enqueue_to_backlog (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +security_socket_sendmsg (1 samples, 0.10%) + + + +[unknown] (10 samples, 1.01%) + + + +Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized (949 samples, 95.38%) +Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized + + +Lio/netty/channel/ChannelOutboundHandlerAdapter:.read (2 samples, 0.20%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.10%) + + + +__kmalloc_node_track_caller (1 samples, 0.10%) + + + +tcp_v4_send_check (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getPrototype (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.put (11 samples, 1.11%) + + + +Lsun/nio/ch/IOUtil:.readIntoNativeBuffer (31 samples, 3.12%) +Lsu.. + + +Lsun/nio/ch/SocketChannelImpl:.write (209 samples, 21.01%) +Lsun/nio/ch/SocketChannelImpl:.wr.. + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +enqueue_entity (5 samples, 0.50%) + + + +fget_light (2 samples, 0.20%) + + + +Lio/netty/handler/codec/http/DefaultHttpMessage:.init (2 samples, 0.20%) + + + +enqueue_task (7 samples, 0.70%) + + + +_raw_spin_lock (1 samples, 0.10%) + + + +ttwu_do_activate.constprop.74 (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.createSlot (33 samples, 3.32%) +Lor.. + + +Lorg/mozilla/javascript/WrapFactory:.setJavaPrimitiveWrap (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/HttpHeaders:.hash (4 samples, 0.40%) + + + +try_to_wake_up (24 samples, 2.41%) +tr.. + + +Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush (232 samples, 23.32%) +Lio/netty/channel/DefaultChannelPipe.. + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (12 samples, 1.21%) + + + +Lio/netty/handler/codec/http/HttpMethod:.valueOf (2 samples, 0.20%) + + + +__internal_add_timer (1 samples, 0.10%) + + + +_raw_spin_lock_irqsave (1 samples, 0.10%) + + + +generic_smp_call_function_single_interrupt (4 samples, 0.40%) + + + +mod_timer (5 samples, 0.50%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (21 samples, 2.11%) +L.. + + +InstanceKlass::oop_push_contents (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp (37 samples, 3.72%) +Lorg.. + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +tcp_rcv_established (73 samples, 7.34%) +tcp_rcv_es.. + + +Lsun/nio/ch/EPollSelectorImpl:.updateSelectedKeys (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.toObjectOrNull (1 samples, 0.10%) + + + +apparmor_file_permission (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.10%) + + + +kmalloc_slab (2 samples, 0.20%) + + + +lock_sock_nested (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.write (6 samples, 0.60%) + + + +sock_def_readable (32 samples, 3.22%) +soc.. + + +Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject$PrototypeValues:.ensureId (1 samples, 0.10%) + + + +sys_mprotect (1 samples, 0.10%) + + + +_raw_spin_lock (1 samples, 0.10%) + + + +Lsun/nio/ch/SelectorImpl:.select (7 samples, 0.70%) + + + +Lio/netty/handler/codec/http/HttpHeaders:.hash (1 samples, 0.10%) + + + +itable stub (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/BaseFunction:.execIdCall (48 samples, 4.82%) +Lorg/m.. + + +Lorg/mozilla/javascript/IdScriptableObject:.put (12 samples, 1.21%) + + + +release_sock (2 samples, 0.20%) + + + +Lio/netty/buffer/AbstractByteBuf:.writeBytes (5 samples, 0.50%) + + + +mod_timer (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (1 samples, 0.10%) + + + +select_task_rq_fair (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (17 samples, 1.71%) + + + +fget_light (3 samples, 0.30%) + + + +itable stub (1 samples, 0.10%) + + + +Lio/netty/buffer/UnreleasableByteBuf:.duplicate (1 samples, 0.10%) + + + +ttwu_do_activate.constprop.74 (12 samples, 1.21%) + + + +Lio/netty/handler/codec/http/HttpHeaders:.encode (1 samples, 0.10%) + + + +Ljava/util/Arrays:.copyOf (1 samples, 0.10%) + + + +skb_free_head (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getBase (4 samples, 0.40%) + + + +Lsun/nio/ch/FileDispatcherImpl:.read0 (1 samples, 0.10%) + + + +mod_timer (5 samples, 0.50%) + + + +Lio/netty/buffer/PooledByteBuf:.deallocate (5 samples, 0.50%) + + + +sys_write (195 samples, 19.60%) +sys_write + + +Lorg/mozilla/javascript/BaseFunction:.findPrototypeId (1 samples, 0.10%) + + + +Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys (949 samples, 95.38%) +Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys + + +getnstimeofday (3 samples, 0.30%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders (22 samples, 2.21%) +L.. + + +Lorg/mozilla/javascript/NativeJavaObject:.initMembers (1 samples, 0.10%) + + + +[unknown] (10 samples, 1.01%) + + + +skb_clone (4 samples, 0.40%) + + + +Lorg/vertx/java/platform/impl/RhinoContextFactory:.onContextCreated (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (3 samples, 0.30%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getParentScope (3 samples, 0.30%) + + + +Lio/netty/handler/codec/http/HttpVersion:.compareTo (1 samples, 0.10%) + + + +Lio/netty/buffer/PooledByteBufAllocator:.newDirectBuffer (2 samples, 0.20%) + + + +dst_release (1 samples, 0.10%) + + + +Lio/netty/buffer/PooledUnsafeDirectByteBuf:.setBytes (42 samples, 4.22%) +Lio/n.. + + +sock_put (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.put (23 samples, 2.31%) +L.. + + +OopMapSet::all_do (1 samples, 0.10%) + + + +__dev_queue_xmit (10 samples, 1.01%) + + + +tcp_schedule_loss_probe (3 samples, 0.30%) + + + +Ljava/nio/channels/spi/AbstractInterruptibleChannel:.end (1 samples, 0.10%) + + + +Ljava/lang/String:.equals (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/WrapFactory:.wrap (5 samples, 0.50%) + + + +system_call_fastpath (4 samples, 0.40%) + + + +Lio/netty/buffer/PooledByteBufAllocator:.newDirectBuffer (2 samples, 0.20%) + + + +eth_type_trans (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.add0 (2 samples, 0.20%) + + + +Lio/netty/buffer/AbstractByteBuf:.writeBytes (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (6 samples, 0.60%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (45 samples, 4.52%) +Lorg/.. + + +internal_add_timer (1 samples, 0.10%) + + + +Java_sun_nio_ch_FileDispatcherImpl_write0 (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeJavaObject:.get (1 samples, 0.10%) + + + +start_thread (985 samples, 98.99%) +start_thread + + +Ljava/util/HashMap:.getNode (2 samples, 0.20%) + + + +tcp_rcv_space_adjust (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (3 samples, 0.30%) + + + +system_call_after_swapgs (6 samples, 0.60%) + + + +__getnstimeofday (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.set (3 samples, 0.30%) + + + +Ljava/nio/channels/spi/AbstractInterruptibleChannel:.begin (1 samples, 0.10%) + + + +raw_local_deliver (1 samples, 0.10%) + + + +tcp_recvmsg (13 samples, 1.31%) + + + +Lio/netty/channel/ChannelDuplexHandler:.read (3 samples, 0.30%) + + + +_raw_spin_lock_bh (1 samples, 0.10%) + + + +sock_def_readable (2 samples, 0.20%) + + + +tcp_is_cwnd_limited (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.10%) + + + +Monitor::IWait (1 samples, 0.10%) + + + +detach_if_pending (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getBase (2 samples, 0.20%) + + + +local_bh_enable (104 samples, 10.45%) +local_bh_enable + + +Lio/netty/channel/ChannelDuplexHandler:.flush (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.setAttributes (12 samples, 1.21%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getTopScopeValue (1 samples, 0.10%) + + + +inet_ehashfn (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (2 samples, 0.20%) + + + +__slab_alloc (1 samples, 0.10%) + + + +__tcp_v4_send_check (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder$LineParser:.parse (6 samples, 0.60%) + + + +__pthread_disable_asynccancel (1 samples, 0.10%) + + + +sock_aio_write (185 samples, 18.59%) +sock_aio_write + + +ip_finish_output (119 samples, 11.96%) +ip_finish_output + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.init (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (1 samples, 0.10%) + + + +Lio/netty/channel/DefaultChannelPipeline$HeadContext:.read (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (21 samples, 2.11%) +L.. + + +Lorg/vertx/java/core/http/impl/ServerConnection:.handleRequest (526 samples, 52.86%) +Lorg/vertx/java/core/http/impl/ServerConnection:.handleRequest + + +ktime_get_real (1 samples, 0.10%) + + + +nmethod::fix_oop_relocations (1 samples, 0.10%) + + + +HandleArea::oops_do (1 samples, 0.10%) + + + +OldToYoungRootsTask::do_it (20 samples, 2.01%) +O.. + + +Ljava/util/HashMap:.getNode (1 samples, 0.10%) + + + +Ljava/lang/String:.getBytes (3 samples, 0.30%) + + + +java_start (985 samples, 98.99%) +java_start + + +__fsnotify_parent (1 samples, 0.10%) + + + +skb_push (1 samples, 0.10%) + + + +ttwu_do_wakeup (1 samples, 0.10%) + + + +ip_rcv (91 samples, 9.15%) +ip_rcv + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.add0 (3 samples, 0.30%) + + + +Lorg/mozilla/javascript/BaseFunction:.construct (156 samples, 15.68%) +Lorg/mozilla/javascript/.. + + +Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush (2 samples, 0.20%) + + + +system_call_fastpath (28 samples, 2.81%) +sy.. + + +Lorg/mozilla/javascript/ScriptableObject:.createSlot (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/WrapFactory:.wrapAsJavaObject (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder:.skipControlCharacters (1 samples, 0.10%) + + + +tcp_md5_do_lookup (1 samples, 0.10%) + + + +fsnotify (1 samples, 0.10%) + + + +ttwu_stat (1 samples, 0.10%) + + + +__srcu_read_lock (2 samples, 0.20%) + + + +__skb_clone (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (8 samples, 0.80%) + + + +tcp_current_mss (5 samples, 0.50%) + + + +Lio/netty/handler/codec/MessageToMessageEncoder:.write (31 samples, 3.12%) +Lio.. + + +ksize (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeJavaMethod:.findCachedFunction (2 samples, 0.20%) + + + +[unknown] (4 samples, 0.40%) + + + +sk_reset_timer (5 samples, 0.50%) + + + +system_call (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders (2 samples, 0.20%) + + + +Ljava/util/ArrayList:.ensureCapacityInternal (1 samples, 0.10%) + + + +Interpreter (956 samples, 96.08%) +Interpreter + + +_raw_spin_unlock_irqrestore (1 samples, 0.10%) + + + +Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush (235 samples, 23.62%) +Lio/netty/channel/ChannelOutboundHand.. + + +Lsun/nio/ch/FileDispatcherImpl:.write0 (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +unsafe_arraycopy (1 samples, 0.10%) + + + +Ljava/lang/ThreadLocal:.get (1 samples, 0.10%) + + + +Ljava/util/concurrent/ConcurrentHashMap:.get (1 samples, 0.10%) + + + +ObjArrayKlass::oop_push_contents (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (3 samples, 0.30%) + + + +Lio/netty/handler/codec/http/HttpHeaders:.hash (2 samples, 0.20%) + + + +sys_epoll_wait (4 samples, 0.40%) + + + +system_call_fastpath (196 samples, 19.70%) +system_call_fastpath + + +Lorg/mozilla/javascript/ScriptableObject:.createSlot (4 samples, 0.40%) + + + +Ljava/lang/String:.hashCode (2 samples, 0.20%) + + + +vfs_write (192 samples, 19.30%) +vfs_write + + +Lorg/mozilla/javascript/ScriptableObject$Slot:.setAttributes (12 samples, 1.21%) + + + +oopDesc* PSPromotionManager::copy_to_survivor_spacefalse (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (5 samples, 0.50%) + + + +Lsun/nio/ch/EPollArrayWrapper:.poll (5 samples, 0.50%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead (562 samples, 56.48%) +Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead + + +__dev_queue_xmit (1 samples, 0.10%) + + + +__kmalloc_reserve.isra.26 (3 samples, 0.30%) + + + +GCTaskManager::get_task (1 samples, 0.10%) + + + +ep_scan_ready_list.isra.9 (4 samples, 0.40%) + + + +security_file_permission (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject$Slot:.getValue (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (3 samples, 0.30%) + + + +do_softirq_own_stack (103 samples, 10.35%) +do_softirq_own_.. + + +call_function_single_interrupt (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/BaseFunction:.findPrototypeId (1 samples, 0.10%) + + + +vtable stub (1 samples, 0.10%) + + + +common_file_perm (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.put (3 samples, 0.30%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder$HeaderParser:.process (1 samples, 0.10%) + + + +intel_pmu_enable_all (4 samples, 0.40%) + + + +idle_cpu (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +x86_pmu_enable (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (14 samples, 1.41%) + + + +inet_sendmsg (177 samples, 17.79%) +inet_sendmsg + + +kfree_skbmem (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_Server2_js_1:.call (79 samples, 7.94%) +Lorg/mozill.. + + +Lio/netty/channel/AbstractChannelHandlerContext:.newPromise (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (4 samples, 0.40%) + + + +Lio/netty/util/internal/AppendableCharSequence:.substring (2 samples, 0.20%) + + + +ip_local_deliver (1 samples, 0.10%) + + + +Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush (1 samples, 0.10%) + + + +sock_aio_read.part.8 (22 samples, 2.21%) +s.. + + +Lio/netty/handler/codec/http/HttpHeaders:.encode (7 samples, 0.70%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getParentScope (1 samples, 0.10%) + + + +Lsun/reflect/DelegatingMethodAccessorImpl:.invoke (66 samples, 6.63%) +Lsun/refl.. + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (40 samples, 4.02%) +Lorg.. + + +Ljava/nio/channels/spi/AbstractInterruptibleChannel:.begin (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.write (35 samples, 3.52%) +Lio.. + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/NativeCall:.init (48 samples, 4.82%) +Lorg/m.. + + +Lorg/mozilla/javascript/NativeFunction:.initScriptFunction (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.init (1 samples, 0.10%) + + + +JavaCalls::call_virtual (956 samples, 96.08%) +JavaCalls::call_virtual + + +Lorg/mozilla/javascript/BaseFunction:.execIdCall (60 samples, 6.03%) +Lorg/moz.. + + +itable stub (1 samples, 0.10%) + + + +__alloc_skb (9 samples, 0.90%) + + + +SpinPause (1 samples, 0.10%) + + + +skb_release_data (3 samples, 0.30%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Ljava/nio/charset/CharsetEncoder:.replaceWith (2 samples, 0.20%) + + + +jni_fast_GetIntField (1 samples, 0.10%) + + + +tcp_transmit_skb (132 samples, 13.27%) +tcp_transmit_skb + + +Lorg/mozilla/javascript/ScriptRuntime:.toObjectOrNull (1 samples, 0.10%) + + + +_raw_spin_unlock_irqrestore (1 samples, 0.10%) + + + +StealTask::do_it (3 samples, 0.30%) + + + +tcp_sendmsg (176 samples, 17.69%) +tcp_sendmsg + + +Ljava/lang/ThreadLocal:.get (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.20%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace (1 samples, 0.10%) + + + +java-339 (995 samples, 100.00%) +java-339 + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (17 samples, 1.71%) + + + +oopDesc* PSPromotionManager::copy_to_survivor_spacefalse (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/BaseFunction:.findInstanceIdInfo (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.20%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.flush (1 samples, 0.10%) + + + +sk_stream_alloc_skb (10 samples, 1.01%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/HttpHeaders:.encodeAscii0 (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (10 samples, 1.01%) + + + +tcp_sendmsg (1 samples, 0.10%) + + + +Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead (635 samples, 63.82%) +Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead + + +Lio/netty/buffer/AbstractReferenceCountedByteBuf:.release (5 samples, 0.50%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder:.skipControlCharacters (2 samples, 0.20%) + + + +flush_tlb_mm_range (1 samples, 0.10%) + + + +sock_poll (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (9 samples, 0.90%) + + + +Lorg/mozilla/javascript/ScriptableObject$Slot:.setAttributes (2 samples, 0.20%) + + + +ip_local_deliver (89 samples, 8.94%) +ip_local_del.. + + +Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.10%) + + + +read_tsc (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getParentScope (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/BaseFunction:.construct (1 samples, 0.10%) + + + +ip_rcv_finish (89 samples, 8.94%) +ip_rcv_finish + + +net_rx_action (97 samples, 9.75%) +net_rx_action + + +Lorg/mozilla/javascript/ScriptableObject:.getParentScope (1 samples, 0.10%) + + + +vtable stub (1 samples, 0.10%) + + + +JavaThread::run (956 samples, 96.08%) +JavaThread::run + + +Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp (1 samples, 0.10%) + + + +ep_send_events_proc (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/NativeJavaObject:.initMembers (1 samples, 0.10%) + + + +vtable stub (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (409 samples, 41.11%) +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_ve.. + + +Lio/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject$Slot:.setAttributes (6 samples, 0.60%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (3 samples, 0.30%) + + + +perf_pmu_enable (4 samples, 0.40%) + + + +Lsun/nio/ch/SocketChannelImpl:.isConnected (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +PSRootsClosurefalse::do_oop (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.read (3 samples, 0.30%) + + + +Lio/netty/buffer/AbstractReferenceCountedByteBuf:.release (4 samples, 0.40%) + + + +ip_local_out (121 samples, 12.16%) +ip_local_out + + +__getnstimeofday (1 samples, 0.10%) + + + +ThreadRootsTask::do_it (3 samples, 0.30%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.10%) + + + +Lio/netty/channel/ChannelOutboundBuffer:.decrementPendingOutboundBytes (2 samples, 0.20%) + + + +__kfree_skb (3 samples, 0.30%) + + + +kfree (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (4 samples, 0.40%) + + + +__inet_lookup_established (4 samples, 0.40%) + + + +thread_entry (956 samples, 96.08%) +thread_entry + + +ip_output (119 samples, 11.96%) +ip_output + + +tcp_check_space (3 samples, 0.30%) + + + +_raw_spin_lock_irqsave (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.get (4 samples, 0.40%) + + + +inet_sendmsg (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.name (8 samples, 0.80%) + + + +ipv4_mtu (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.put (7 samples, 0.70%) + + + +aa_file_perm (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete (242 samples, 24.32%) +Lio/netty/channel/AbstractChannelHandl.. + + +_raw_spin_lock_bh (1 samples, 0.10%) + + + +tcp_v4_rcv (87 samples, 8.74%) +tcp_v4_rcv + + +Lsun/nio/cs/UTF_8$Encoder:.init (3 samples, 0.30%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.write (33 samples, 3.32%) +Lio.. + + +getnstimeofday (1 samples, 0.10%) + + + +tcp_established_options (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.bind (7 samples, 0.70%) + + + +update_curr (2 samples, 0.20%) + + + +Lio/netty/channel/ChannelDuplexHandler:.read (1 samples, 0.10%) + + + +bictcp_cong_avoid (3 samples, 0.30%) + + + +jlong_disjoint_arraycopy (1 samples, 0.10%) + + + +security_file_permission (1 samples, 0.10%) + + + +Lio/netty/buffer/AbstractByteBuf:.forEachByteAsc0 (3 samples, 0.30%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder:.splitInitialLine (5 samples, 0.50%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder:.splitHeader (8 samples, 0.80%) + + + +Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete (240 samples, 24.12%) +Lorg/vertx/java/core/net/impl/VertxHan.. + + +JavaThread::oops_do (3 samples, 0.30%) + + + +Lorg/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (2 samples, 0.20%) + + + +Lio/netty/channel/AdaptiveRecvByteBufAllocator$HandleImpl:.record (2 samples, 0.20%) + + + +Lio/netty/handler/codec/http/HttpVersion:.compareTo (2 samples, 0.20%) + + + +Lio/netty/handler/codec/http/HttpObjectDecoder:.decode (57 samples, 5.73%) +Lio/net.. + + +Lorg/mozilla/javascript/NativeJavaObject:.initMembers (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Ljava/nio/channels/spi/AbstractInterruptibleChannel:.end (3 samples, 0.30%) + + + +Ljava/lang/ThreadLocal:.get (1 samples, 0.10%) + + + +ktime_get_real (3 samples, 0.30%) + + + +ScavengeRootsTask::do_it (1 samples, 0.10%) + + + +dev_hard_start_xmit (9 samples, 0.90%) + + + +all (995 samples, 100%) + + + +msecs_to_jiffies (1 samples, 0.10%) + + + +Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead (1 samples, 0.10%) + + + +Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write (34 samples, 3.42%) +Lor.. + + +itable stub (1 samples, 0.10%) + + + +tcp_write_xmit (147 samples, 14.77%) +tcp_write_xmit + + +Lio/netty/buffer/UnpooledHeapByteBuf:.init (1 samples, 0.10%) + + + +apparmor_socket_recvmsg (5 samples, 0.50%) + + + +ksize (1 samples, 0.10%) + + + +lock_sock_nested (1 samples, 0.10%) + + + +PSScavengeKlassClosure::do_klass (1 samples, 0.10%) + + + +[unknown] (7 samples, 0.70%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeJavaMethod:.call (74 samples, 7.44%) +Lorg/mozil.. + + +Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp (86 samples, 8.64%) +Lorg/mozilla.. + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.toObjectOrNull (1 samples, 0.10%) + + + +__wake_up_locked (25 samples, 2.51%) +__.. + + +JavaThread::thread_main_inner (956 samples, 96.08%) +JavaThread::thread_main_inner + + +Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite (225 samples, 22.61%) +Lio/netty/channel/nio/AbstractNioBy.. + + +Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/DefaultHttpMessage:.init (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getBase (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (8 samples, 0.80%) + + + +update_cfs_rq_blocked_load (1 samples, 0.10%) + + + +Lio/netty/channel/DefaultChannelPipeline$HeadContext:.write (6 samples, 0.60%) + + + +skb_copy_datagram_iovec (3 samples, 0.30%) + + + +Lio/netty/buffer/PooledByteBuf:.deallocate (2 samples, 0.20%) + + + +Lsun/nio/ch/SocketChannelImpl:.isConnected (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.20%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (20 samples, 2.01%) +L.. + + +native_write_msr_safe (4 samples, 0.40%) + + + +tcp_v4_do_rcv (77 samples, 7.74%) +tcp_v4_do_.. + + +Lorg/mozilla/javascript/NativeCall:.init (20 samples, 2.01%) +L.. + + +Lio/netty/buffer/AbstractByteBuf:.writeBytes (3 samples, 0.30%) + + + +[unknown] (197 samples, 19.80%) +[unknown] + + +Ljava/nio/DirectByteBuffer:.duplicate (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (1 samples, 0.10%) + + + +_raw_spin_lock (2 samples, 0.20%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.flush (233 samples, 23.42%) +Lio/netty/channel/AbstractChannelHand.. + + +Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead (637 samples, 64.02%) +Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Ljava/lang/String:.init (4 samples, 0.40%) + + + +sys_futex (1 samples, 0.10%) + + + +__kmalloc_node_track_caller (1 samples, 0.10%) + + + +ttwu_do_wakeup (5 samples, 0.50%) + + + +Lsun/nio/ch/EPollArrayWrapper:.epollWait (4 samples, 0.40%) + + + +Lorg/vertx/java/core/http/impl/AssembledFullHttpResponse:.toLastContent (1 samples, 0.10%) + + + +native_read_tsc (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (11 samples, 1.11%) + + + +Lorg/mozilla/javascript/JavaMembers:.get (1 samples, 0.10%) + + + +_raw_spin_lock (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/NativeCall:.init (15 samples, 1.51%) + + + +Lorg/mozilla/javascript/NativeFunction:.initScriptFunction (6 samples, 0.60%) + + + +Lio/netty/handler/codec/http/DefaultHttpHeaders:.init (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.put (25 samples, 2.51%) +Lo.. + + +activate_task (7 samples, 0.70%) + + + +Lio/netty/util/internal/AppendableCharSequence:.substring (2 samples, 0.20%) + + + +__slab_free (1 samples, 0.10%) + + + +Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead (555 samples, 55.78%) +Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead + + +Lsun/nio/ch/SocketChannelImpl:.write (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/WrapFactory:.wrap (5 samples, 0.50%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (154 samples, 15.48%) +Lorg/mozilla/javascript.. + + +tcp_init_tso_segs (1 samples, 0.10%) + + + +Lio/netty/handler/codec/MessageToMessageEncoder:.write (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.read (2 samples, 0.20%) + + + +Lio/netty/channel/ChannelOutboundBuffer:.incrementPendingOutboundBytes (1 samples, 0.10%) + + + +sock_wfree (1 samples, 0.10%) + + + +Lio/netty/channel/AbstractChannelHandlerContext:.read (4 samples, 0.40%) + + + +__wake_up_common (27 samples, 2.71%) +__.. + + +Lorg/mozilla/javascript/ScriptableObject$Slot:.setAttributes (5 samples, 0.50%) + + + +tcp_event_new_data_sent (6 samples, 0.60%) + + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (4 samples, 0.40%) + + + +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (511 samples, 51.36%) +Lorg/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0.. + + +Lorg/mozilla/javascript/ScriptableObject:.createSlot (15 samples, 1.51%) + + + +Lorg/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject:.putImpl (8 samples, 0.80%) + + + +VMThread::loop (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptableObject$Slot:.getValue (1 samples, 0.10%) + + + +smp_call_function_single_interrupt (4 samples, 0.40%) + + + +do_sync_read (22 samples, 2.21%) +d.. + + +fdval (1 samples, 0.10%) + + + +Ljava/lang/String:.hashCode (1 samples, 0.10%) + + + +__tcp_push_pending_frames (149 samples, 14.97%) +__tcp_push_pending_fra.. + + +Lio/netty/buffer/AbstractByteBuf:.writeBytes (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp (28 samples, 2.81%) +Lo.. + + +Lorg/mozilla/javascript/ScriptableObject:.getSlot (3 samples, 0.30%) + + + +Lio/netty/util/Recycler:.get (2 samples, 0.20%) + + + +rw_verify_area (1 samples, 0.10%) + + + +Lorg/mozilla/javascript/IdScriptableObject:.has (1 samples, 0.10%) + + + +do_sync_write (186 samples, 18.69%) +do_sync_write + + +Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype (1 samples, 0.10%) + + + +Lio/netty/channel/ChannelDuplexHandler:.flush (237 samples, 23.82%) +Lio/netty/channel/ChannelDuplexHandle.. + + +Lorg/mozilla/javascript/NativeJavaMethod:.findFunction (2 samples, 0.20%) + + + +enqueue_task_fair (5 samples, 0.50%) + + + +kmem_cache_alloc_node (2 samples, 0.20%) + + + +itable stub (1 samples, 0.10%) + + + +Lio/netty/buffer/AbstractByteBufAllocator:.heapBuffer (3 samples, 0.30%) + + + +Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp (21 samples, 2.11%) +L.. + + +ip_queue_xmit (122 samples, 12.26%) +ip_queue_xmit + + +Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete (241 samples, 24.22%) +Lio/netty/channel/AbstractChannelHandl.. + + +Lorg/mozilla/javascript/NativeFunction:.initScriptFunction (10 samples, 1.01%) + + + +itable stub (1 samples, 0.10%) + + + +netif_skb_dev_features (1 samples, 0.10%) + + + +Lio/netty/handler/codec/http/HttpResponseEncoder:.acceptOutboundMessage (1 samples, 0.10%) + + + diff --git a/tools/FlameGraph/demos/cpu-mysql-filt.svg b/tools/FlameGraph/demos/cpu-mysql-filt.svg new file mode 100644 index 0000000..a6ad67e --- /dev/null +++ b/tools/FlameGraph/demos/cpu-mysql-filt.svg @@ -0,0 +1,9298 @@ + + + + + + + + + + + + +Flame Graph + + +mysqld`page_align (97 samples, 0.03%) + + +mysqld`insert_fields (962 samples, 0.28%) + + +mysqld`rec_get_n_owned_new (50 samples, 0.01%) + + +mysqld`dfield_set_data (64 samples, 0.02%) + + +libc.so.1`__open_syscall (49 samples, 0.01%) + + +mysqld`row_ins (1,076 samples, 0.31%) + + +mysqld`evaluate_join_record (913 samples, 0.26%) + + +mysqld`btr_pcur_store_position (43 samples, 0.01%) + + +mysqld`innobase_commit (114 samples, 0.03%) + + +mysqld`handler::ha_rnd_init (88 samples, 0.03%) + + +mysqld`btr_pcur_restore_position_func (97 samples, 0.03%) + + +mysqld`read_cached_record (600 samples, 0.17%) + + +mysqld`my_qsort2 (346 samples, 0.10%) + + +mysqld`my_malloc (53 samples, 0.02%) + + +mysqld`Item_cond_and::copy_andor_structure (57 samples, 0.02%) + + +mysqld`row_mysql_store_true_var_len (182 samples, 0.05%) + + +mysqld`btr_pcur_open_with_no_init_func (39 samples, 0.01%) + + +mysqld`page_rec_get_next_low (43 samples, 0.01%) + + +mysqld`rw_lock_get_writer (259 samples, 0.07%) + + +mysqld`create_tmp_table (164 samples, 0.05%) + + +mysqld`ha_innobase::index_init (84 samples, 0.02%) + + +mysqld`row_sel_field_store_in_mysql_format (1,001 samples, 0.29%) + + +mysqld`rec_get_status (122 samples, 0.04%) + + +mysqld`Item::const_item (115 samples, 0.03%) + + +mysqld`rw_lock_x_unlock_func (36 samples, 0.01%) + + +mysqld`Item_func_isnotnull::val_int (37 samples, 0.01%) + + +mysqld`dyn_array_create (147 samples, 0.04%) + + +mysqld`rec_get_offsets_func (61 samples, 0.02%) + + +mysqld`dict_index_is_clust (57 samples, 0.02%) + + +mysqld`handler::read_range_first (782 samples, 0.22%) + + +mysqld`page_cur_search_with_match (102 samples, 0.03%) + + +mysqld`Arg_comparator::set_cmp_func (111 samples, 0.03%) + + +mysqld`build_template (336 samples, 0.10%) + + +mysqld`find_field_in_tables (86 samples, 0.02%) + + +mysqld`Arg_comparator::compare_int_signed (72 samples, 0.02%) + + +mysqld`read_view_open_now (83 samples, 0.02%) + + +mysqld`Item_func_in::val_int (40 samples, 0.01%) + + +mysqld`ha_innobase::rnd_pos (45 samples, 0.01%) + + +mysqld`Item_cond_and::val_int (13,937 samples, 4.00%) +mys.. + + +mysqld`rec_get_offsets_func (145 samples, 0.04%) + + +libc.so.1`malloc (242 samples, 0.07%) + + +mysqld`sel_restore_position_for_mysql (835 samples, 0.24%) + + +mysqld`rw_lock_s_lock_spin (95 samples, 0.03%) + + +mysqld`rec_init_offsets (116 samples, 0.03%) + + +mysqld`Item_bool_func2::set_cmp_func (94 samples, 0.03%) + + +mysqld`innobase_get_slow_log (68 samples, 0.02%) + + +mysqld`parse_sql (4,766 samples, 1.37%) + + +mysqld`Item::val_bool (80 samples, 0.02%) + + +mysqld`check_quick_keys (53 samples, 0.02%) + + +mysqld`mtr_memo_pop_all (40 samples, 0.01%) + + +mysqld`rec_get_offsets_func (49 samples, 0.01%) + + +mysqld`rec_get_bit_field_1 (164 samples, 0.05%) + + +mysqld`create_myisam_tmp_table (91 samples, 0.03%) + + +libc.so.1`__write (504 samples, 0.14%) + + +mysqld`mutex_exit (40 samples, 0.01%) + + +mysqld`page_rec_get_next_low (515 samples, 0.15%) + + +mysqld`page_cmp_dtuple_rec_with_match (60 samples, 0.02%) + + +mysqld`dict_col_get_clust_pos (38 samples, 0.01%) + + +mysqld`rec_get_bit_field_1 (521 samples, 0.15%) + + +mysqld`io_handler_thread (321 samples, 0.09%) + + +mysqld`mi_rrnd (614 samples, 0.18%) + + +mysqld`rec_get_deleted_flag (113 samples, 0.03%) + + +mysqld`page_cur_search_with_match (302 samples, 0.09%) + + +mysqld`net_end_statement (1,952 samples, 0.56%) + + +mysqld`page_cur_search_with_match (1,242 samples, 0.36%) + + +mysqld`ha_innobase::change_active_index (89 samples, 0.03%) + + +mysqld`handler::index_read_map (295 samples, 0.08%) + + +mysqld`buf_page_get_known_nowait (2,651 samples, 0.76%) + + +mysqld`QUICK_RANGE_SELECT::QUICK_RANGE_SELECT (122 samples, 0.04%) + + +mysqld`List (61 samples, 0.02%) + + +mysqld`my_open (63 samples, 0.02%) + + +mysqld`page_rec_get_prev (159 samples, 0.05%) + + +mysqld`row_sel_push_cache_row_for_mysql (62 samples, 0.02%) + + +mysqld`my_long10_to_str_8bit (62 samples, 0.02%) + + +mysqld`page_rec_is_infimum (82 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (439 samples, 0.13%) + + +mysqld`find_field_in_table (85 samples, 0.02%) + + +mysqld`rec_get_offsets_func (179 samples, 0.05%) + + +mysqld`rec_get_nth_field_offs (284 samples, 0.08%) + + +mysqld`rec_get_status (103 samples, 0.03%) + + +mysqld`buf_page_in_file (121 samples, 0.03%) + + +mysqld`mach_read_from_2 (41 samples, 0.01%) + + +mysqld`Item_func_like::val_int (2,264 samples, 0.65%) + + +mysqld`row_ins_step (1,092 samples, 0.31%) + + +mysqld`thr_multi_lock (46 samples, 0.01%) + + +mysqld`row_undo_step (563 samples, 0.16%) + + +mysqld`buf_page_get_gen (96 samples, 0.03%) + + +libc.so.1`pthread_getspecific (51 samples, 0.01%) + + +mysqld`dict_field_get_col (43 samples, 0.01%) + + +mysqld`ha_innobase::general_fetch (402 samples, 0.12%) + + +libc.so.1`cleanfree (63 samples, 0.02%) + + +mysqld`my_delete_with_symlink (250 samples, 0.07%) + + +mysqld`base_list_iterator::init (37 samples, 0.01%) + + +mysqld`st_select_lex::init_query (84 samples, 0.02%) + + +mysqld`Item_func_eq::val_int (184 samples, 0.05%) + + +mysqld`Field_datetime::val_int (52 samples, 0.01%) + + +mysqld`get_full_func_mm_tree (84 samples, 0.02%) + + +mysqld`mach_read_from_6 (154 samples, 0.04%) + + +mysqld`rec_offs_set_n_fields (46 samples, 0.01%) + + +mysqld`mysql_unlock_read_tables (45 samples, 0.01%) + + +libc.so.1`memcpy (136 samples, 0.04%) + + +mysqld`buf_page_optimistic_get (49 samples, 0.01%) + + +mysqld`buf_block_get_modify_clock (84 samples, 0.02%) + + +mysqld`page_rec_is_user_rec (78 samples, 0.02%) + + +mysqld`rec_offs_set_n_alloc (44 samples, 0.01%) + + +mysqld`Item_cond::fix_fields (546 samples, 0.16%) + + +mysqld`my_realloc (43 samples, 0.01%) + + +mysqld`Item_func_between::val_int (1,480 samples, 0.42%) + + +mysqld`log_block_calc_checksum (187 samples, 0.05%) + + +mysqld`ut_delay (86 samples, 0.02%) + + +libc.so.1`__lwp_unpark (111 samples, 0.03%) + + +mysqld`dict_index_copy_rec_order_prefix (111 samples, 0.03%) + + +mysqld`page_cur_move_to_next (597 samples, 0.17%) + + +mysqld`mi_create (957 samples, 0.27%) + + +mysqld`_fil_io (73 samples, 0.02%) + + +mysqld`rec_offs_nth_extern (49 samples, 0.01%) + + +mysqld`row_get_rec_trx_id (311 samples, 0.09%) + + +mysqld`mutex_exit (169 samples, 0.05%) + + +mysqld`base_list_iterator::init (47 samples, 0.01%) + + +mysqld`dtuple_get_n_fields_cmp (47 samples, 0.01%) + + +mysqld`btr_pcur_open_with_no_init_func (363 samples, 0.10%) + + +mysqld`buf_page_get_gen (302 samples, 0.09%) + + +mysqld`cmp_dtuple_rec (63 samples, 0.02%) + + +mysqld`Item_in_subselect::val_bool (4,865 samples, 1.40%) + + +mysqld`handler::index_read_map (296 samples, 0.08%) + + +mysqld`Item::val_bool (8,071 samples, 2.32%) +m.. + + +mysqld`_fil_io (150 samples, 0.04%) + + +mysqld`btr_pcur_restore_position_func (47 samples, 0.01%) + + +mysqld`Item_field::val_int (78 samples, 0.02%) + + +mysqld`buf_block_get_state (174 samples, 0.05%) + + +mysqld`Arg_comparator::compare (988 samples, 0.28%) + + +mysqld`QUICK_ROR_INTERSECT_SELECT::get_next (534 samples, 0.15%) + + +mysqld`page_rec_is_comp (226 samples, 0.06%) + + +mysqld`rec_get_nth_field_offs (442 samples, 0.13%) + + +mysqld`row_sel_store_mysql_rec (84 samples, 0.02%) + + +mysqld`row_insert_for_mysql (1,756 samples, 0.50%) + + +mysqld`rec_get_offsets_func (173 samples, 0.05%) + + +mysqld`btr_search_check_guess (58 samples, 0.02%) + + +mysqld`ut_dulint_cmp (49 samples, 0.01%) + + +mysqld`MYSQLlex (1,513 samples, 0.43%) + + +mysqld`row_ins_index_entry (162 samples, 0.05%) + + +mysqld`row_sel_get_clust_rec_for_mysql (603 samples, 0.17%) + + +mysqld`rec_get_status (96 samples, 0.03%) + + +mysqld`Item_field::val_str (351 samples, 0.10%) + + +mysqld`page_offset (36 samples, 0.01%) + + +mysqld`Arg_comparator::compare (195 samples, 0.06%) + + +libc.so.1`memset (37 samples, 0.01%) + + +mysqld`evaluate_join_record (73 samples, 0.02%) + + +mysqld`row_sel_field_store_in_mysql_format (36 samples, 0.01%) + + +mysqld`btr_search_guess_on_hash (141 samples, 0.04%) + + +mysqld`_mi_write_blob_record (877 samples, 0.25%) + + +mysqld`ut_delay (201 samples, 0.06%) + + +mysqld`sel_restore_position_for_mysql (99 samples, 0.03%) + + +mysqld`rec_init_offsets_comp_ordinary (313 samples, 0.09%) + + +mysqld`strdup_root (199 samples, 0.06%) + + +mysqld`row_search_for_mysql (59 samples, 0.02%) + + +mysqld`mtr_commit (48 samples, 0.01%) + + +mysqld`rec_get_offsets_func (804 samples, 0.23%) + + +mysqld`THD::cleanup_after_query (494 samples, 0.14%) + + +mysqld`row_sel_store_mysql_rec (3,171 samples, 0.91%) + + +mysqld`handler::index_read_map (2,319 samples, 0.67%) + + +mysqld`trx_commit_off_kernel (51 samples, 0.01%) + + +mysqld`rec_offs_nth_extern (68 samples, 0.02%) + + +mysqld`Sql_alloc::operator new (41 samples, 0.01%) + + +mysqld`btr_pcur_open_with_no_init_func (518 samples, 0.15%) + + +mysqld`btr_search_check_guess (129 samples, 0.04%) + + +mysqld`btr_page_get_index_id (410 samples, 0.12%) + + +mysqld`Item_cond_or::val_int (36 samples, 0.01%) + + +mysqld`open_table (273 samples, 0.08%) + + +mysqld`row_sel_field_store_in_mysql_format (227 samples, 0.07%) + + +mysqld`rec_offs_set_n_fields (57 samples, 0.02%) + + +mysqld`Item_field::Item_field (635 samples, 0.18%) + + +mysqld`rec_init_offsets (59 samples, 0.02%) + + +mysqld`ha_innobase::unlock_row (52 samples, 0.01%) + + +mysqld`my_malloc (72 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (607 samples, 0.17%) + + +mysqld`net_store_length (54 samples, 0.02%) + + +mysqld`Query_arena::strmake (113 samples, 0.03%) + + +libc.so.1`memcpy (66 samples, 0.02%) + + +mysqld`Item_func_not::val_int (1,053 samples, 0.30%) + + +libc.so.1`atomic_cas_64 (75 samples, 0.02%) + + +mysqld`buf_page_optimistic_get (78 samples, 0.02%) + + +mysqld`Protocol::net_store_data (412 samples, 0.12%) + + +mysqld`dict_table_is_comp (37 samples, 0.01%) + + +mysqld`rw_lock_s_lock_func (81 samples, 0.02%) + + +mysqld`ha_search_and_get_data (273 samples, 0.08%) + + +mysqld`buf_page_get_state (137 samples, 0.04%) + + +mysqld`btr_cur_search_to_nth_level (51 samples, 0.01%) + + +mysqld`base_list_iterator::next_fast (294 samples, 0.08%) + + +mysqld`row_search_for_mysql (83,786 samples, 24.05%) +mysqld`row_search_for_mysql + + +mysqld`btr_cur_search_to_nth_level (635 samples, 0.18%) + + +mysqld`page_rec_get_next_const (371 samples, 0.11%) + + +mysqld`rw_lock_s_lock_low (714 samples, 0.20%) + + +mysqld`List_iterator_fast (36 samples, 0.01%) + + +mysqld`Item::save_in_field_no_warnings (47 samples, 0.01%) + + +libc.so.1`memcpy (99 samples, 0.03%) + + +mysqld`page_cur_move_to_next (50 samples, 0.01%) + + +mysqld`dict_col_get_clust_pos (52 samples, 0.01%) + + +mysqld`rec_copy_prefix_to_buf (41 samples, 0.01%) + + +mysqld`end_send (220 samples, 0.06%) + + +mysqld`ha_myisam::open (506 samples, 0.15%) + + +mysqld`mem_heap_free_func (42 samples, 0.01%) + + +mysqld`rec_get_next_offs (175 samples, 0.05%) + + +mysqld`find_keyword (234 samples, 0.07%) + + +mysqld`ha_chain_get_first (1,555 samples, 0.45%) + + +mysqld`cmp_dtuple_rec_with_match (112 samples, 0.03%) + + +mysqld`Protocol::net_store_data (36 samples, 0.01%) + + +mysqld`rec_init_offsets_comp_ordinary (409 samples, 0.12%) + + +mysqld`mach_read_from_1 (856 samples, 0.25%) + + +mysqld`dict_table_is_comp (89 samples, 0.03%) + + +mysqld`handle_one_connection (346,633 samples, 99.49%) +mysqld`handle_one_connection + + +mysqld`btr_cur_search_to_nth_level (228 samples, 0.07%) + + +mysqld`make_join_statistics (11,012 samples, 3.16%) +my.. + + +mysqld`my_strnncollsp_simple (190 samples, 0.05%) + + +mysqld`innobase_xa_prepare (55 samples, 0.02%) + + +mysqld`Field::new_field (56 samples, 0.02%) + + +mysqld`build_template (52 samples, 0.01%) + + +mysqld`btr_search_check_guess (153 samples, 0.04%) + + +mysqld`rec_init_offsets (56 samples, 0.02%) + + +libc.so.1`malloc (90 samples, 0.03%) + + +mysqld`mtr_start (112 samples, 0.03%) + + +mysqld`do_command (345,010 samples, 99.02%) +mysqld`do_command + + +mysqld`ha_release_temporary_latches (50 samples, 0.01%) + + +mysqld`row_sel_store_mysql_rec (107 samples, 0.03%) + + +mysqld`dict_col_copy_type (122 samples, 0.04%) + + +mysqld`row_search_for_mysql (1,047 samples, 0.30%) + + +mysqld`mtr_memo_slot_release (1,477 samples, 0.42%) + + +mysqld`net_send_eof (1,783 samples, 0.51%) + + +libc.so.1`malloc (48 samples, 0.01%) + + +mysqld`rw_lock_x_lock_func (55 samples, 0.02%) + + +mysqld`ha_search_and_get_data (96 samples, 0.03%) + + +mysqld`rec_init_offsets (341 samples, 0.10%) + + +mysqld`btr_pcur_restore_position_func (814 samples, 0.23%) + + +mysqld`join_read_always_key (1,640 samples, 0.47%) + + +mysqld`ut_dulint_cmp (49 samples, 0.01%) + + +mysqld`rec_init_offsets (10,525 samples, 3.02%) +my.. + + +mysqld`rec_init_offsets (60 samples, 0.02%) + + +mysqld`find_all_keys (105,265 samples, 30.21%) +mysqld`find_all_keys + + +libc.so.1`__write (196 samples, 0.06%) + + +mysqld`btr_cur_get_rec (37 samples, 0.01%) + + +mysqld`buf_page_get_gen (43 samples, 0.01%) + + +mysqld`rec_offs_set_n_alloc (37 samples, 0.01%) + + +mysqld`rw_lock_s_lock_spin (60 samples, 0.02%) + + +mysqld`page_rec_get_next_const (74 samples, 0.02%) + + +mysqld`alloc_root (42 samples, 0.01%) + + +mysqld`row_sel_push_cache_row_for_mysql (162 samples, 0.05%) + + +mysqld`row_sel_store_mysql_rec (345 samples, 0.10%) + + +mysqld`rec_get_offsets_func (41 samples, 0.01%) + + +mysqld`btr_pcur_open_with_no_init_func (180 samples, 0.05%) + + +mysqld`buf_page_get_state (58 samples, 0.02%) + + +mysqld`Field_datetime::val_int (46 samples, 0.01%) + + +mysqld`page_rec_is_supremum_low (48 samples, 0.01%) + + +mysqld`ha_innobase::index_read (294 samples, 0.08%) + + +mysqld`rec_get_status (591 samples, 0.17%) + + +mysqld`build_template (171 samples, 0.05%) + + +mysqld`buf_page_hash_get (299 samples, 0.09%) + + +mysqld`row_mysql_store_true_var_len (47 samples, 0.01%) + + +libc.so.1`memcpy (188 samples, 0.05%) + + +mysqld`Field_iterator_table::create_item (714 samples, 0.20%) + + +mysqld`Arg_comparator::compare (48 samples, 0.01%) + + +mysqld`mysql_unlock_some_tables (135 samples, 0.04%) + + +mysqld`innobase_get_trx (125 samples, 0.04%) + + +mysqld`page_cur_search_with_match (64 samples, 0.02%) + + +mysqld`build_equal_items_for_cond (431 samples, 0.12%) + + +mysqld`Item::operator new (45 samples, 0.01%) + + +mysqld`QUICK_RANGE_SELECT::get_next (921 samples, 0.26%) + + +mysqld`que_thr_stop_for_mysql_no_error (73 samples, 0.02%) + + +mysqld`ut_fold_dulint (89 samples, 0.03%) + + +mysqld`btr_cur_search_to_nth_level (50 samples, 0.01%) + + +mysqld`mem_heap_create_block (347 samples, 0.10%) + + +mysqld`page_rec_get_next_const (37 samples, 0.01%) + + +mysqld`rec_get_offsets_func (67 samples, 0.02%) + + +mysqld`mem_heap_create_func (135 samples, 0.04%) + + +mysqld`Field_long::val_int (51 samples, 0.01%) + + +mysqld`vio_write (117 samples, 0.03%) + + +mysqld`buf_flush_write_block_low (770 samples, 0.22%) + + +mysqld`page_cur_move_to_next (74 samples, 0.02%) + + +mysqld`Item_field::val_str (38 samples, 0.01%) + + +mysqld`ha_innobase::general_fetch (477 samples, 0.14%) + + +mysqld`dict_field_get_col (51 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (32,041 samples, 9.20%) +mysqld`btr.. + + +mysqld`mach_read_from_6 (193 samples, 0.06%) + + +mysqld`ha_commit_one_phase (299 samples, 0.09%) + + +mysqld`mach_read_from_2 (59 samples, 0.02%) + + +mysqld`rec_init_offsets_comp_ordinary (744 samples, 0.21%) + + +mysqld`page_offset (36 samples, 0.01%) + + +mysqld`ha_innobase::rnd_next (15,655 samples, 4.49%) +mysq.. + + +mysqld`Item_field::val_str (39 samples, 0.01%) + + +mysqld`my_wildcmp_bin (51 samples, 0.01%) + + +mysqld`Lex_input_stream::yyGet (207 samples, 0.06%) + + +mysqld`Item_in_optimizer::val_int (4,899 samples, 1.41%) + + +mysqld`open_and_lock_tables (75 samples, 0.02%) + + +mysqld`btr_cur_update_in_place (92 samples, 0.03%) + + +mysqld`ut_memcpy (111 samples, 0.03%) + + +libc.so.1`setparam (5,779 samples, 1.66%) + + +mysqld`mach_write_to_1 (329 samples, 0.09%) + + +mysqld`rr_quick (4,374 samples, 1.26%) + + +mysqld`change_refs_to_tmp_fields (85 samples, 0.02%) + + +mysqld`mtr_commit (57 samples, 0.02%) + + +libc.so.1`malloc (146 samples, 0.04%) + + +mysqld`rec_get_offsets_func (46 samples, 0.01%) + + +mysqld`btr_search_guess_on_hash (782 samples, 0.22%) + + +mysqld`handler::ha_open (528 samples, 0.15%) + + +mysqld`sortcmp (239 samples, 0.07%) + + +mysqld`btr_cur_search_to_nth_level (41 samples, 0.01%) + + +mysqld`page_dir_slot_get_rec (57 samples, 0.02%) + + +mysqld`cmp_dtuple_rec_with_match (47 samples, 0.01%) + + +mysqld`rec_init_offsets (1,013 samples, 0.29%) + + +mysqld`row_search_for_mysql (2,771 samples, 0.80%) + + +mysqld`row_sel_store_mysql_rec (90 samples, 0.03%) + + +libc.so.1`memcpy (38 samples, 0.01%) + + +mysqld`Arg_comparator::compare_int_signed (171 samples, 0.05%) + + +mysqld`rec_get_bit_field_1 (264 samples, 0.08%) + + +mysqld`rec_init_offsets_comp_ordinary (38 samples, 0.01%) + + +mysqld`ha_myisam::open (47 samples, 0.01%) + + +mysqld`base_list_iterator::next_fast (46 samples, 0.01%) + + +mysqld`handler::ha_write_row (1,790 samples, 0.51%) + + +mysqld`rec_init_offsets (57 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (498 samples, 0.14%) + + +mysqld`rec_init_offsets (53 samples, 0.02%) + + +mysqld`btr_pcur_store_position (116 samples, 0.03%) + + +mysqld`Item::Item (54 samples, 0.02%) + + +mysqld`Item_bool_rowready_func2::Item_bool_rowready_func2 (49 samples, 0.01%) + + +mysqld`handler::read_range_first (130 samples, 0.04%) + + +libc.so.1`__open_syscall (176 samples, 0.05%) + + +libc.so.1`resolvepath (77 samples, 0.02%) + + +mysqld`os_event_wait_low (42 samples, 0.01%) + + +mysqld`mysql_derived_filling (5,389 samples, 1.55%) + + +mysqld`read_view_create_low (43 samples, 0.01%) + + +mysqld`Field::is_null (71 samples, 0.02%) + + +mysqld`THD::is_error (51 samples, 0.01%) + + +mysqld`sel_restore_position_for_mysql (3,080 samples, 0.88%) + + +mysqld`Protocol::send_fields (4,380 samples, 1.26%) + + +mysqld`Field::make_field (40 samples, 0.01%) + + +mysqld`rec_offs_n_fields (66 samples, 0.02%) + + +mysqld`ha_innobase::index_next_same (252 samples, 0.07%) + + +mysqld`Item_func_like::val_int (478 samples, 0.14%) + + +mysqld`buf_page_peek_if_too_old (151 samples, 0.04%) + + +mysqld`ha_innobase::records_in_range (1,700 samples, 0.49%) + + +mysqld`ha_innobase::update_row (590 samples, 0.17%) + + +mysqld`_mi_write_part_record (87 samples, 0.02%) + + +mysqld`dict_index_is_clust (41 samples, 0.01%) + + +mysqld`mi_create (87 samples, 0.02%) + + +mysqld`page_offset (59 samples, 0.02%) + + +mysqld`Item_func_eq::val_int (54 samples, 0.02%) + + +mysqld`Field::is_null (114 samples, 0.03%) + + +mysqld`page_cur_search_with_match (72 samples, 0.02%) + + +mysqld`mi_nommap_pwrite (85 samples, 0.02%) + + +libc.so.1`memcpy (59 samples, 0.02%) + + +mysqld`dtuple_get_n_fields_cmp (75 samples, 0.02%) + + +mysqld`rw_lock_x_lock_func (383 samples, 0.11%) + + +mysqld`List_iterator_fast (42 samples, 0.01%) + + +mysqld`row_sel_field_store_in_mysql_format (142 samples, 0.04%) + + +libc.so.1`atomic_add_64_nv (226 samples, 0.06%) + + +mysqld`que_thr_step (571 samples, 0.16%) + + +mysqld`rec_get_offsets_func (248 samples, 0.07%) + + +mysqld`my_wildcmp_8bit (68 samples, 0.02%) + + +mysqld`btr_pcur_store_position (44 samples, 0.01%) + + +mysqld`handler::index_read_map (1,591 samples, 0.46%) + + +mysqld`btr_cur_search_to_nth_level (235 samples, 0.07%) + + +mysqld`btr_search_guess_on_hash (988 samples, 0.28%) + + +mysqld`get_best_combination (232 samples, 0.07%) + + +mysqld`mem_heap_create_func (43 samples, 0.01%) + + +mysqld`handle_select (291,929 samples, 83.78%) +mysqld`handle_select + + +mysqld`rec_init_offsets_comp_ordinary (39 samples, 0.01%) + + +libc.so.1`realfree (67 samples, 0.02%) + + +mysqld`mem_heap_create_func (57 samples, 0.02%) + + +mysqld`ut_pair_min (99 samples, 0.03%) + + +mysqld`btr_cur_search_to_nth_level (514 samples, 0.15%) + + +mysqld`strmake_root (130 samples, 0.04%) + + +libc.so.1`pthread_getspecific (67 samples, 0.02%) + + +mysqld`page_align (57 samples, 0.02%) + + +mysqld`mi_extra (45 samples, 0.01%) + + +mysqld`page_offset (38 samples, 0.01%) + + +mysqld`buf_page_get_gen (94 samples, 0.03%) + + +mysqld`init_dynamic_array2 (76 samples, 0.02%) + + +mysqld`mach_read_from_1 (73 samples, 0.02%) + + +libc.so.1`__write (49 samples, 0.01%) + + +libc.so.1`memcpy (41 samples, 0.01%) + + +mysqld`page_check_dir (76 samples, 0.02%) + + +mysqld`btr_cur_pessimistic_insert (64 samples, 0.02%) + + +mysqld`String::set (72 samples, 0.02%) + + +mysqld`buf_page_hash_get (108 samples, 0.03%) + + +mysqld`dict_index_get_n_unique (39 samples, 0.01%) + + +mysqld`get_datetime_value (1,029 samples, 0.30%) + + +mysqld`my_malloc (92 samples, 0.03%) + + +mysqld`btr_search_guess_on_hash (1,518 samples, 0.44%) + + +mysqld`btr_pcur_is_before_first_on_page (252 samples, 0.07%) + + +mysqld`Item_func_eq::val_int (46 samples, 0.01%) + + +mysqld`Field_datetime::val_str (106 samples, 0.03%) + + +mysqld`base_list_iterator::base_list_iterator (93 samples, 0.03%) + + +mysqld`row_sel_push_cache_row_for_mysql (1,277 samples, 0.37%) + + +mysqld`mi_write (942 samples, 0.27%) + + +mysqld`btr_search_guess_on_hash (293 samples, 0.08%) + + +mysqld`buf_block_get_state (61 samples, 0.02%) + + +mysqld`Arg_comparator::compare (40 samples, 0.01%) + + +mysqld`open_tables (770 samples, 0.22%) + + +mysqld`Item_func_between::val_int (72 samples, 0.02%) + + +mysqld`ut_fold_binary (347 samples, 0.10%) + + +mysqld`rec_get_nth_field_offs (166 samples, 0.05%) + + +mysqld`page_rec_get_prev (5,270 samples, 1.51%) + + +mysqld`Item_func_trig_cond::val_int (105 samples, 0.03%) + + +mysqld`row_sel_push_cache_row_for_mysql (46 samples, 0.01%) + + +mysqld`btr_page_reorganize_low (62 samples, 0.02%) + + +mysqld`Item_field::val_int (99 samples, 0.03%) + + +mysqld`mutex_exit (147 samples, 0.04%) + + +mysqld`btr_search_info_update (39 samples, 0.01%) + + +mysqld`Item_func_eq::val_int (1,383 samples, 0.40%) + + +mysqld`page_cur_move_to_next (69 samples, 0.02%) + + +mysqld`os_aio (70 samples, 0.02%) + + +mysqld`ut_dulint_create (48 samples, 0.01%) + + +mysqld`btr_pcur_restore_position_func (219 samples, 0.06%) + + +mysqld`rec_get_offsets_func (611 samples, 0.18%) + + +mysqld`sql_strmake_with_convert (120 samples, 0.03%) + + +mysqld`mtr_memo_slot_release (36 samples, 0.01%) + + +mysqld`rw_lock_s_lock_spin (69 samples, 0.02%) + + +mysqld`page_rec_is_infimum (126 samples, 0.04%) + + +mysqld`my_net_write (139 samples, 0.04%) + + +mysqld`JOIN::exec (272,959 samples, 78.34%) +mysqld`JOIN::exec + + +mysqld`ha_innobase::store_key_val_for_row (64 samples, 0.02%) + + +mysqld`my_decimal2binary (57 samples, 0.02%) + + +mysqld`page_cur_search_with_match (77 samples, 0.02%) + + +mysqld`cmp_dtuple_rec_with_match (1,098 samples, 0.32%) + + +mysqld`rw_lock_get_writer (46 samples, 0.01%) + + +mysqld`rec_get_status (48 samples, 0.01%) + + +mysqld`rec_get_info_bits (166 samples, 0.05%) + + +mysqld`page_cur_position (48 samples, 0.01%) + + +mysqld`dict_field_get_col (70 samples, 0.02%) + + +mysqld`ha_myisam::close (126 samples, 0.04%) + + +mysqld`mtr_memo_slot_release (56 samples, 0.02%) + + +mysqld`page_rec_is_supremum_low (42 samples, 0.01%) + + +mysqld`row_sel_get_clust_rec_for_mysql (554 samples, 0.16%) + + +mysqld`rec_offs_get_n_alloc (50 samples, 0.01%) + + +mysqld`dict_table_is_comp (45 samples, 0.01%) + + +mysqld`cmp_dtuple_rec_with_match (1,449 samples, 0.42%) + + +mysqld`btr_cur_get_rec (48 samples, 0.01%) + + +mysqld`rw_lock_s_lock_func (74 samples, 0.02%) + + +mysqld`cmp_dtuple_rec_with_match (1,986 samples, 0.57%) + + +mysqld`ut_memcpy (203 samples, 0.06%) + + +mysqld`dict_field_get_col (40 samples, 0.01%) + + +mysqld`mem_heap_free_func (50 samples, 0.01%) + + +mysqld`ha_innobase::position (52 samples, 0.01%) + + +mysqld`calc_hash (45 samples, 0.01%) + + +mysqld`rw_lock_s_lock_low (52 samples, 0.01%) + + +libc.so.1`atomic_swap_8 (174 samples, 0.05%) + + +mysqld`dict_col_get_clust_pos (37 samples, 0.01%) + + +mysqld`subselect_single_select_engine::exec (1,053 samples, 0.30%) + + +mysqld`sql_alloc (41 samples, 0.01%) + + +mysqld`Item_field::used_tables (67 samples, 0.02%) + + +mysqld`dict_field_get_col (60 samples, 0.02%) + + +mysqld`row_sel_store_mysql_rec (820 samples, 0.24%) + + +mysqld`page_dir_find_owner_slot (3,834 samples, 1.10%) + + +mysqld`String::String (89 samples, 0.03%) + + +mysqld`get_schema_column_record (165 samples, 0.05%) + + +mysqld`String::needs_conversion (146 samples, 0.04%) + + +libc.so.1`gethrtime (38 samples, 0.01%) + + +mysqld`buf_page_peek_if_too_old (39 samples, 0.01%) + + +mysqld`check_quick_keys (1,899 samples, 0.55%) + + +mysqld`btr_pcur_move_to_next (50 samples, 0.01%) + + +libc.so.1`getparam (9,895 samples, 2.84%) +l.. + + +mysqld`alloc_query (97 samples, 0.03%) + + +mysqld`mysql_select (5,389 samples, 1.55%) + + +mysqld`Field_varstring::reset (50 samples, 0.01%) + + +mysqld`Item_func_in::val_int (94 samples, 0.03%) + + +mysqld`ha_innobase::index_read (130 samples, 0.04%) + + +mysqld`row_sel_pop_cached_row_for_mysql (94 samples, 0.03%) + + +mysqld`row_search_for_mysql (14,732 samples, 4.23%) +mys.. + + +mysqld`rw_lock_s_unlock_func (44 samples, 0.01%) + + +mysqld`ha_chain_get_first (136 samples, 0.04%) + + +mysqld`mem_heap_create_block (67 samples, 0.02%) + + +mysqld`ha_chain_get_first (98 samples, 0.03%) + + +mysqld`row_build_row_ref_in_tuple (95 samples, 0.03%) + + +mysqld`innobase_get_slow_log (43 samples, 0.01%) + + +mysqld`page_header_get_field (57 samples, 0.02%) + + +mysqld`rec_get_offsets_func (351 samples, 0.10%) + + +mysqld`rec_copy_prefix_to_buf (56 samples, 0.02%) + + +mysqld`mtr_memo_pop_all (51 samples, 0.01%) + + +mysqld`Item_string::val_str (41 samples, 0.01%) + + +mysqld`mem_alloc_func (59 samples, 0.02%) + + +mysqld`my_realpath (85 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (171 samples, 0.05%) + + +mysqld`JOIN::cleanup (119 samples, 0.03%) + + +mysqld`my_hash_first (113 samples, 0.03%) + + +libc.so.1`atomic_cas_64 (64 samples, 0.02%) + + +mysqld`page_cur_search_with_match (197 samples, 0.06%) + + +mysqld`btr_cur_search_to_nth_level (306 samples, 0.09%) + + +mysqld`rec_get_bit_field_1 (47 samples, 0.01%) + + +mysqld`Item_cond_or::val_int (91 samples, 0.03%) + + +mysqld`rec_get_offsets_func (47 samples, 0.01%) + + +mysqld`alloc_root (64 samples, 0.02%) + + +mysqld`rw_lock_s_lock_func (90 samples, 0.03%) + + +mysqld`buf_block_buf_fix_inc_func (39 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (739 samples, 0.21%) + + +libc.so.1`mutex_lock (83 samples, 0.02%) + + +mysqld`thd_to_trx (82 samples, 0.02%) + + +mysqld`QUICK_RANGE_SELECT::get_next (304 samples, 0.09%) + + +mysqld`List_iterator_fast (65 samples, 0.02%) + + +mysqld`btr_search_guess_on_hash (380 samples, 0.11%) + + +mysqld`ptr_compare_2 (225 samples, 0.06%) + + +mysqld`page_rec_get_next_low (61 samples, 0.02%) + + +mysqld`ha_innobase::unlock_row (51 samples, 0.01%) + + +mysqld`join_read_next_same (253 samples, 0.07%) + + +mysqld`Item_bool_func2::set_cmp_func (154 samples, 0.04%) + + +mysqld`btr_search_guess_on_hash (105 samples, 0.03%) + + +mysqld`page_get_n_recs (95 samples, 0.03%) + + +mysqld`dict_table_is_comp (57 samples, 0.02%) + + +mysqld`btr_search_guess_on_hash (55 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (573 samples, 0.16%) + + +mysqld`dict_index_get_n_unique_in_tree (52 samples, 0.01%) + + +mysqld`page_cmp_dtuple_rec_with_match (2,078 samples, 0.60%) + + +mysqld`btr_pcur_restore_position_func (195 samples, 0.06%) + + +mysqld`btr_cur_search_to_nth_level (413 samples, 0.12%) + + +mysqld`rec_get_bit_field_1 (80 samples, 0.02%) + + +mysqld`ha_innobase::index_read (3,570 samples, 1.02%) + + +mysqld`btr_cur_search_to_nth_level (493 samples, 0.14%) + + +mysqld`String::String (47 samples, 0.01%) + + +mysqld`rw_lock_x_lock_func (141 samples, 0.04%) + + +mysqld`_current_thd (102 samples, 0.03%) + + +mysqld`row_sel_field_store_in_mysql_format (230 samples, 0.07%) + + +mysqld`base_list_iterator::next_fast (175 samples, 0.05%) + + +mysqld`ha_chain_get_next (93 samples, 0.03%) + + +mysqld`page_rec_get_next_low (700 samples, 0.20%) + + +mysqld`dict_field_get_col (50 samples, 0.01%) + + +mysqld`mtr_memo_slot_release (1,925 samples, 0.55%) + + +mysqld`thd_to_trx (85 samples, 0.02%) + + +mysqld`btr_cur_optimistic_update (178 samples, 0.05%) + + +mysqld`get_quick_keys (135 samples, 0.04%) + + +mysqld`rec_get_offsets_func (39 samples, 0.01%) + + +mysqld`page_cmp_dtuple_rec_with_match (135 samples, 0.04%) + + +mysqld`net_real_write (513 samples, 0.15%) + + +mysqld`row_sel_push_cache_row_for_mysql (67 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (118 samples, 0.03%) + + +libc.so.1`memset (42 samples, 0.01%) + + +mysqld`page_align (42 samples, 0.01%) + + +mysqld`recv_recovery_is_on (39 samples, 0.01%) + + +mysqld`page_offset (46 samples, 0.01%) + + +mysqld`mem_heap_free_func (75 samples, 0.02%) + + +mysqld`Arg_comparator::compare (218 samples, 0.06%) + + +mysqld`row_search_for_mysql (455 samples, 0.13%) + + +mysqld`mtr_commit (2,138 samples, 0.61%) + + +mysqld`row_purge_upd_exist_or_extern_func (224 samples, 0.06%) + + +mysqld`buf_page_get_state (295 samples, 0.08%) + + +mysqld`rec_copy_prefix_to_buf (37 samples, 0.01%) + + +mysqld`my_time (84 samples, 0.02%) + + +mysqld`_mi_safe_delete_file (46 samples, 0.01%) + + +libc.so.1`malloc (58 samples, 0.02%) + + +libc.so.1`__pwrite (82 samples, 0.02%) + + +mysqld`Item_ident::Item_ident (103 samples, 0.03%) + + +mysqld`row_vers_old_has_index_entry (45 samples, 0.01%) + + +mysqld`btr_search_info_update_slow (2,211 samples, 0.63%) + + +mysqld`make_sortkey (436 samples, 0.13%) + + +mysqld`row_sel_get_clust_rec_for_mysql (49 samples, 0.01%) + + +mysqld`ha_innobase::index_read (111 samples, 0.03%) + + +mysqld`page_dir_slot_get_rec (93 samples, 0.03%) + + +mysqld`buf_block_align (91 samples, 0.03%) + + +mysqld`rec_get_offsets_func (54 samples, 0.02%) + + +mysqld`dict_index_contains_col_or_prefix (40 samples, 0.01%) + + +mysqld`rec_init_offsets_comp_ordinary (78 samples, 0.02%) + + +mysqld`page_cur_search_with_match (144 samples, 0.04%) + + +mysqld`rec_init_offsets (36 samples, 0.01%) + + +mysqld`join_read_next_same (2,879 samples, 0.83%) + + +mysqld`rec_get_offsets_func (71 samples, 0.02%) + + +mysqld`Item_field::val_str (124 samples, 0.04%) + + +mysqld`Arg_comparator::set_cmp_func (145 samples, 0.04%) + + +libc.so.1`_malloc_unlocked (146 samples, 0.04%) + + +mysqld`rec_init_offsets (72 samples, 0.02%) + + +mysqld`rw_lock_s_lock_func (36 samples, 0.01%) + + +libc.so.1`pthread_setschedprio (15,882 samples, 4.56%) +libc.. + + +mysqld`mtr_memo_pop_all (120 samples, 0.03%) + + +mysqld`handler::ha_statistic_increment (128 samples, 0.04%) + + +mysqld`cmp_dtuple_rec_with_match (102 samples, 0.03%) + + +mysqld`buf_page_optimistic_get (299 samples, 0.09%) + + +mysqld`mem_area_alloc (96 samples, 0.03%) + + +libc.so.1`free (54 samples, 0.02%) + + +mysqld`cmp_buffer_with_ref (90 samples, 0.03%) + + +mysqld`trx_start (171 samples, 0.05%) + + +libc.so.1`_malloc_unlocked (66 samples, 0.02%) + + +mysqld`mutex_get_waiters (51 samples, 0.01%) + + +mysqld`rec_get_offsets_func (39 samples, 0.01%) + + +mysqld`sel_restore_position_for_mysql (4,075 samples, 1.17%) + + +mysqld`Item::val_bool (1,958 samples, 0.56%) + + +mysqld`page_is_comp (77 samples, 0.02%) + + +mysqld`alloc_root (87 samples, 0.02%) + + +mysqld`filesort (5,388 samples, 1.55%) + + +mysqld`String::realloc (86 samples, 0.02%) + + +mysqld`Item_func_ne::val_int (241 samples, 0.07%) + + +mysqld`check_quick_keys (6,985 samples, 2.00%) + + +mysqld`mtr_commit (128 samples, 0.04%) + + +mysqld`rw_lock_s_lock_low (48 samples, 0.01%) + + +mysqld`mem_alloc_func (59 samples, 0.02%) + + +mysqld`check_quick_select (7,019 samples, 2.01%) + + +mysqld`find_all_keys (5,376 samples, 1.54%) + + +mysqld`my_charset_same (62 samples, 0.02%) + + +mysqld`row_sel_field_store_in_mysql_format (592 samples, 0.17%) + + +mysqld`Item_field::val_int (109 samples, 0.03%) + + +mysqld`rw_lock_s_lock_func (58 samples, 0.02%) + + +mysqld`rec_init_offsets (152 samples, 0.04%) + + +mysqld`Arg_comparator::set_cmp_func (91 samples, 0.03%) + + +mysqld`mem_area_free (258 samples, 0.07%) + + +mysqld`buf_page_set_accessed_make_young (68 samples, 0.02%) + + +mysqld`dyn_array_free (55 samples, 0.02%) + + +mysqld`mi_open (41 samples, 0.01%) + + +mysqld`btr_page_reorganize (62 samples, 0.02%) + + +mysqld`rec_init_offsets_comp_ordinary (128 samples, 0.04%) + + +mysqld`List_iterator (86 samples, 0.02%) + + +mysqld`String::String (68 samples, 0.02%) + + +mysqld`lock_tables (37 samples, 0.01%) + + +mysqld`Item_func_eq::val_int (402 samples, 0.12%) + + +mysqld`buf_page_get_known_nowait (1,973 samples, 0.57%) + + +mysqld`ha_autocommit_or_rollback (993 samples, 0.28%) + + +mysqld`ut_hash_ulint (136 samples, 0.04%) + + +mysqld`Arg_comparator::compare_datetime (63 samples, 0.02%) + + +mysqld`btr_pcur_move_to_next_page (154 samples, 0.04%) + + +mysqld`dict_index_copy_rec_order_prefix (1,170 samples, 0.34%) + + +mysqld`page_rec_is_comp (340 samples, 0.10%) + + +mysqld`mach_read_from_4 (93 samples, 0.03%) + + +mysqld`sub_select (157,873 samples, 45.31%) +mysqld`sub_select + + +libc.so.1`strcmp (215 samples, 0.06%) + + +mysqld`mem_heap_block_free (46 samples, 0.01%) + + +mysqld`my_write (107 samples, 0.03%) + + +mysqld`rec_offs_get_n_alloc (43 samples, 0.01%) + + +mysqld`cmp_dtuple_rec_with_match (1,744 samples, 0.50%) + + +mysqld`mem_heap_free_func (303 samples, 0.09%) + + +mysqld`mi_delete_table (381 samples, 0.11%) + + +mysqld`mem_heap_create_func (55 samples, 0.02%) + + +mysqld`init_read_record (115 samples, 0.03%) + + +mysqld`trx_start_low (138 samples, 0.04%) + + +mysqld`row_build_row_ref_in_tuple (1,487 samples, 0.43%) + + +mysqld`Field::is_null (50 samples, 0.01%) + + +mysqld`rec_get_offsets_func (162 samples, 0.05%) + + +mysqld`net_real_write (70 samples, 0.02%) + + +mysqld`MYSQL_BIN_LOG::log_xid (152 samples, 0.04%) + + +mysqld`rec_get_offsets_func (268 samples, 0.08%) + + +mysqld`buf_page_get_gen (44 samples, 0.01%) + + +mysqld`mem_heap_create_func (124 samples, 0.04%) + + +mysqld`my_b_flush_io_cache (251 samples, 0.07%) + + +mysqld`join_read_key (3,209 samples, 0.92%) + + +mysqld`btr_search_guess_on_hash (99 samples, 0.03%) + + +mysqld`handler::ha_drop_table (64 samples, 0.02%) + + +mysqld`lock_clust_rec_cons_read_sees (39 samples, 0.01%) + + +mysqld`que_run_threads_low (597 samples, 0.17%) + + +mysqld`page_is_comp (102 samples, 0.03%) + + +mysqld`dict_table_is_comp (77 samples, 0.02%) + + +mysqld`rec_get_bit_field_1 (46 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (354 samples, 0.10%) + + +mysqld`rec_get_info_bits (37 samples, 0.01%) + + +mysqld`evaluate_join_record (33,084 samples, 9.50%) +mysqld`eval.. + + +libc.so.1`memcpy (45 samples, 0.01%) + + +mysqld`mtr_memo_pop_all (217 samples, 0.06%) + + +mysqld`end_io_cache (248 samples, 0.07%) + + +mysqld`row_sel_store_mysql_rec (70 samples, 0.02%) + + +mysqld`Item_field::Item_field (114 samples, 0.03%) + + +mysqld`base_list_iterator::base_list_iterator (49 samples, 0.01%) + + +mysqld`innobase_get_trx (131 samples, 0.04%) + + +mysqld`mi_write (117 samples, 0.03%) + + +mysqld`btr_cur_add_path_info (120 samples, 0.03%) + + +mysqld`row_sel_field_store_in_mysql_format (9,702 samples, 2.78%) +m.. + + +mysqld`ut_delay (82 samples, 0.02%) + + +mysqld`log_write_up_to (47 samples, 0.01%) + + +mysqld`buf_page_optimistic_get (63 samples, 0.02%) + + +mysqld`page_offset (73 samples, 0.02%) + + +mysqld`page_cur_search_with_match (107 samples, 0.03%) + + +mysqld`rec_init_offsets (599 samples, 0.17%) + + +mysqld`my_long10_to_str_8bit (643 samples, 0.18%) + + +mysqld`vio_write (506 samples, 0.15%) + + +mysqld`my_read (180 samples, 0.05%) + + +mysqld`greedy_search (106 samples, 0.03%) + + +mysqld`btr_pcur_restore_position_func (2,948 samples, 0.85%) + + +mysqld`btr_cur_search_to_nth_level (471 samples, 0.14%) + + +mysqld`row_sel_get_clust_rec_for_mysql (158 samples, 0.05%) + + +mysqld`Item_cond_and::Item_cond_and (44 samples, 0.01%) + + +mysqld`btr_search_guess_on_hash (53 samples, 0.02%) + + +mysqld`buf_page_optimistic_get (157 samples, 0.05%) + + +mysqld`btr_cur_search_to_nth_level (243 samples, 0.07%) + + +mysqld`mach_read_from_1 (211 samples, 0.06%) + + +mysqld`mach_read_from_4 (48 samples, 0.01%) + + +mysqld`Item_cond_and::val_int (544 samples, 0.16%) + + +mysqld`mem_heap_add_block (36 samples, 0.01%) + + +mysqld`Arg_comparator::compare_int_signed (185 samples, 0.05%) + + +mysqld`rec_get_offsets_func (10,813 samples, 3.10%) +my.. + + +mysqld`btr_search_update_block_hash_info (113 samples, 0.03%) + + +mysqld`page_cur_insert_rec_low (45 samples, 0.01%) + + +mysqld`rec_get_offsets_func (437 samples, 0.13%) + + +mysqld`mysql_select (291,872 samples, 83.77%) +mysqld`mysql_select + + +mysqld`String::charset (76 samples, 0.02%) + + +mysqld`Arg_comparator::compare_int_signed (47 samples, 0.01%) + + +mysqld`page_is_comp (179 samples, 0.05%) + + +mysqld`Item_equal::add (64 samples, 0.02%) + + +mysqld`join_read_next_same (1,368 samples, 0.39%) + + +mysqld`rec_get_nth_field_offs (84 samples, 0.02%) + + +libc.so.1`_lwp_start (348,199 samples, 99.93%) +libc.so.1`_lwp_start + + +mysqld`rec_copy_prefix_to_buf (924 samples, 0.27%) + + +mysqld`ha_search_and_get_data (233 samples, 0.07%) + + +mysqld`rec_offs_n_fields (61 samples, 0.02%) + + +mysqld`ut_hash_ulint (77 samples, 0.02%) + + +mysqld`buf_page_set_accessed_make_young (79 samples, 0.02%) + + +mysqld`_mi_read_rnd_dynamic_record (607 samples, 0.17%) + + +mysqld`mach_read_from_4 (39 samples, 0.01%) + + +libc.so.1`atomic_swap_8 (85 samples, 0.02%) + + +mysqld`row_sel_pop_cached_row_for_mysql (51 samples, 0.01%) + + +mysqld`Field::is_null (53 samples, 0.02%) + + +libc.so.1`memset (388 samples, 0.11%) + + +mysqld`dict_index_copy_types (45 samples, 0.01%) + + +mysqld`my_close (45 samples, 0.01%) + + +libc.so.1`atomic_swap_8 (238 samples, 0.07%) + + +mysqld`rec_get_status (184 samples, 0.05%) + + +mysqld`page_rec_is_supremum (105 samples, 0.03%) + + +mysqld`btr_pcur_open_with_no_init_func (92 samples, 0.03%) + + +mysqld`btr_cur_add_path_info (222 samples, 0.06%) + + +mysqld`page_offset (66 samples, 0.02%) + + +mysqld`rec_get_offsets_func (48 samples, 0.01%) + + +mysqld`rec_get_nth_field_offs (46 samples, 0.01%) + + +mysqld`ut_min (88 samples, 0.03%) + + +mysqld`ha_innobase::rnd_pos (515 samples, 0.15%) + + +mysqld`trx_start (81 samples, 0.02%) + + +mysqld`page_align (62 samples, 0.02%) + + +mysqld`log_block_calc_checksum (40 samples, 0.01%) + + +mysqld`trx_commit_for_mysql (78 samples, 0.02%) + + +mysqld`sub_select (3,041 samples, 0.87%) + + +mysqld`base_list::after (68 samples, 0.02%) + + +mysqld`mem_heap_block_free (281 samples, 0.08%) + + +mysqld`rw_lock_s_lock_low (70 samples, 0.02%) + + +mysqld`cmp_dtuple_rec_with_match (42 samples, 0.01%) + + +mysqld`rec_get_bit_field_1 (38 samples, 0.01%) + + +mysqld`btr_estimate_n_rows_in_range (2,850 samples, 0.82%) + + +mysqld`rec_init_offsets_comp_ordinary (117 samples, 0.03%) + + +mysqld`ha_innobase::position (60 samples, 0.02%) + + +mysqld`ror_intersect_add (59 samples, 0.02%) + + +mysqld`ha_innobase::index_next_same (672 samples, 0.19%) + + +mysqld`page_is_comp (48 samples, 0.01%) + + +mysqld`page_offset (47 samples, 0.01%) + + +mysqld`Field::is_null (48 samples, 0.01%) + + +mysqld`rec_get_offsets_func (1,891 samples, 0.54%) + + +mysqld`mem_area_alloc (85 samples, 0.02%) + + +mysqld`row_search_for_mysql (1,330 samples, 0.38%) + + +mysqld`rec_get_nth_field_offs (122 samples, 0.04%) + + +mysqld`rec_get_bit_field_1 (157 samples, 0.05%) + + +mysqld`rec_get_bit_field_1 (299 samples, 0.09%) + + +libc.so.1`__write (65 samples, 0.02%) + + +mysqld`Item_field::val_str (1,578 samples, 0.45%) + + +mysqld`page_header_get_field (38 samples, 0.01%) + + +libstdc++.so.6.0.3`operator new (59 samples, 0.02%) + + +mysqld`row_build_row_ref_in_tuple (1,538 samples, 0.44%) + + +libc.so.1`atomic_swap_8 (114 samples, 0.03%) + + +mysqld`rw_lock_s_lock_func (60 samples, 0.02%) + + +mysqld`Diagnostics_area::is_error (202 samples, 0.06%) + + +mysqld`row_sel_get_clust_rec_for_mysql (82 samples, 0.02%) + + +mysqld`mi_state_info_write (116 samples, 0.03%) + + +mysqld`row_upd_step (562 samples, 0.16%) + + +mysqld`btr_pcur_open_with_no_init_func (19,052 samples, 5.47%) +mysql.. + + +mysqld`Item_cond_or::val_int (42 samples, 0.01%) + + +mysqld`fill_record_n_invoke_before_triggers (39 samples, 0.01%) + + +libc.so.1`strlen (78 samples, 0.02%) + + +mysqld`ut_delay (40 samples, 0.01%) + + +mysqld`Arg_comparator::compare (988 samples, 0.28%) + + +mysqld`ha_innobase::index_next (2,665 samples, 0.76%) + + +mysqld`row_search_for_mysql (711 samples, 0.20%) + + +mysqld`btr_estimate_n_rows_in_range (487 samples, 0.14%) + + +mysqld`rec_init_offsets_comp_ordinary (392 samples, 0.11%) + + +mysqld`page_cmp_dtuple_rec_with_match (131 samples, 0.04%) + + +mysqld`JOIN::destroy (613 samples, 0.18%) + + +mysqld`Item::val_bool (441 samples, 0.13%) + + +mysqld`btr_cur_position (86 samples, 0.02%) + + +mysqld`Item_func_between::val_int (41 samples, 0.01%) + + +mysqld`rec_get_info_bits (197 samples, 0.06%) + + +mysqld`page_cur_search_with_match (304 samples, 0.09%) + + +mysqld`page_cmp_dtuple_rec_with_match (70 samples, 0.02%) + + +mysqld`_mi_write_part_record (286 samples, 0.08%) + + +mysqld`ha_innobase::external_lock (153 samples, 0.04%) + + +mysqld`mysql_unlock_tables (43 samples, 0.01%) + + +mysqld`dict_index_copy_rec_order_prefix (61 samples, 0.02%) + + +mysqld`Item_func_trig_cond::val_int (52 samples, 0.01%) + + +mysqld`init_dynamic_array2 (162 samples, 0.05%) + + +mysqld`rec_get_offsets_func (116 samples, 0.03%) + + +mysqld`rec_offs_n_fields (95 samples, 0.03%) + + +mysqld`rec_get_offsets_func (59 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (1,219 samples, 0.35%) + + +mysqld`init_sql_alloc (206 samples, 0.06%) + + +mysqld`Field::val_str (80 samples, 0.02%) + + +mysqld`Arg_comparator::compare (1,290 samples, 0.37%) + + +mysqld`rec_init_offsets_comp_ordinary (243 samples, 0.07%) + + +mysqld`mach_read_from_1 (123 samples, 0.04%) + + +mysqld`dict_field_get_col (92 samples, 0.03%) + + +mysqld`setup_natural_join_row_types (48 samples, 0.01%) + + +mysqld`rec_offs_nth_extern (166 samples, 0.05%) + + +mysqld`buf_block_get_state (340 samples, 0.10%) + + +mysqld`Item_cond_and::val_int (99 samples, 0.03%) + + +mysqld`innobase_get_trx (87 samples, 0.02%) + + +mysqld`handler::index_read_map (3,579 samples, 1.03%) + + +mysqld`ha_innobase::unlock_row (45 samples, 0.01%) + + +libc.so.1`_malloc_unlocked (36 samples, 0.01%) + + +mysqld`row_sel_pop_cached_row_for_mysql (2,634 samples, 0.76%) + + +mysqld`page_rec_is_supremum_low (41 samples, 0.01%) + + +mysqld`Field_datetime::sort_string (40 samples, 0.01%) + + +mysqld`thd_to_trx (152 samples, 0.04%) + + +mysqld`SQL_SELECT::skip_record (968 samples, 0.28%) + + +mysqld`row_search_for_mysql (913 samples, 0.26%) + + +mysqld`handler::drop_table (508 samples, 0.15%) + + +mysqld`my_long10_to_str_8bit (248 samples, 0.07%) + + +mysqld`btr_pcur_move_to_next (1,407 samples, 0.40%) + + +libc.so.1`atomic_swap_8 (97 samples, 0.03%) + + +mysqld`get_quick_record_count (8,270 samples, 2.37%) +m.. + + +mysqld`btr_cur_search_to_nth_level (60 samples, 0.02%) + + +mysqld`btr_cur_add_path_info (927 samples, 0.27%) + + +mysqld`Arg_comparator::compare_real (42 samples, 0.01%) + + +mysqld`Item::delete_self (362 samples, 0.10%) + + +mysqld`evaluate_null_complemented_join_record (137 samples, 0.04%) + + +mysqld`mach_read_from_2 (45 samples, 0.01%) + + +mysqld`buf_page_peek_if_too_old (219 samples, 0.06%) + + +mysqld`row_search_on_row_ref (141 samples, 0.04%) + + +mysqld`open_tmp_table (48 samples, 0.01%) + + +mysqld`rec_get_offsets_func (181 samples, 0.05%) + + +libc.so.1`mutex_lock (897 samples, 0.26%) + + +mysqld`mach_read_from_1 (224 samples, 0.06%) + + +mysqld`mem_heap_create_func (392 samples, 0.11%) + + +mysqld`select_send::send_data (4,139 samples, 1.19%) + + +mysqld`mtr_memo_pop_all (2,416 samples, 0.69%) + + +mysqld`log_block_store_checksum (188 samples, 0.05%) + + +mysqld`row_search_index_entry (161 samples, 0.05%) + + +mysqld`row_search_for_mysql (2,842 samples, 0.82%) + + +libc.so.1`mutex_lock_impl (83 samples, 0.02%) + + +mysqld`buf_page_release (84 samples, 0.02%) + + +mysqld`mem_heap_create_block (116 samples, 0.03%) + + +mysqld`page_dir_slot_get_rec (54 samples, 0.02%) + + +mysqld`rec_init_offsets_comp_ordinary (48 samples, 0.01%) + + +mysqld`evaluate_join_record (7,480 samples, 2.15%) + + +mysqld`btr_page_get_level (39 samples, 0.01%) + + +mysqld`rw_lock_s_lock_func (1,098 samples, 0.32%) + + +mysqld`btr_search_info_update_hash (42 samples, 0.01%) + + +mysqld`rec_get_next_offs (153 samples, 0.04%) + + +mysqld`handler::ha_drop_table (512 samples, 0.15%) + + +mysqld`rec_init_offsets (72 samples, 0.02%) + + +mysqld`row_search_for_mysql (333 samples, 0.10%) + + +mysqld`Field_long::type (67 samples, 0.02%) + + +mysqld`count_field_types (45 samples, 0.01%) + + +mysqld`row_search_for_mysql (2,793 samples, 0.80%) + + +mysqld`lock_external (128 samples, 0.04%) + + +mysqld`ha_innobase::index_read (2,300 samples, 0.66%) + + +mysqld`btr_search_check_guess (335 samples, 0.10%) + + +mysqld`rec_get_bit_field_1 (37 samples, 0.01%) + + +mysqld`page_header_get_field (65 samples, 0.02%) + + +libc.so.1`_malloc_unlocked (38 samples, 0.01%) + + +mysqld`page_cmp_dtuple_rec_with_match (44 samples, 0.01%) + + +mysqld`List_iterator_fast (129 samples, 0.04%) + + +mysqld`vio_write (138 samples, 0.04%) + + +mysqld`Item_func_eq::val_int (54 samples, 0.02%) + + +mysqld`open_and_lock_tables_derived (6,800 samples, 1.95%) + + +mysqld`Arg_comparator::compare_datetime (714 samples, 0.20%) + + +mysqld`rec_get_offsets_func (920 samples, 0.26%) + + +mysqld`dict_col_get_clust_pos (111 samples, 0.03%) + + +mysqld`mtr_memo_pop_all (190 samples, 0.05%) + + +mysqld`page_cur_search_with_match (44 samples, 0.01%) + + +mysqld`ut_dulint_cmp (38 samples, 0.01%) + + +mysqld`get_store_key (54 samples, 0.02%) + + +mysqld`page_rec_get_next (50 samples, 0.01%) + + +mysqld`ha_search_and_get_data (68 samples, 0.02%) + + +mysqld`net_write_buff (73 samples, 0.02%) + + +mysqld`ha_innobase::change_active_index (41 samples, 0.01%) + + +mysqld`build_equal_items (525 samples, 0.15%) + + +mysqld`Field::is_null (52 samples, 0.01%) + + +mysqld`mach_read_from_2 (91 samples, 0.03%) + + +mysqld`buf_page_get_known_nowait (154 samples, 0.04%) + + +mysqld`trx_start_if_not_started (171 samples, 0.05%) + + +mysqld`String::ptr (47 samples, 0.01%) + + +mysqld`rec_get_bit_field_1 (122 samples, 0.04%) + + +mysqld`btr_search_check_guess (332 samples, 0.10%) + + +mysqld`rec_get_status (102 samples, 0.03%) + + +libc.so.1`memcpy (53 samples, 0.02%) + + +libc.so.1`__write (1,684 samples, 0.48%) + + +mysqld`create_schema_table (168 samples, 0.05%) + + +mysqld`row_search_for_mysql (775 samples, 0.22%) + + +mysqld`page_get_max_trx_id (266 samples, 0.08%) + + +mysqld`page_cur_search_with_match (37 samples, 0.01%) + + +mysqld`page_rec_is_comp (99 samples, 0.03%) + + +mysqld`ha_myisam::write_row (118 samples, 0.03%) + + +mysqld`handler::read_range_next (3,442 samples, 0.99%) + + +mysqld`join_read_always_key (659 samples, 0.19%) + + +libc.so.1`memcpy (68 samples, 0.02%) + + +mysqld`row_sel_pop_cached_row_for_mysql (72 samples, 0.02%) + + +mysqld`ha_innobase::records_in_range (3,256 samples, 0.93%) + + +mysqld`cmp_dtuple_rec_with_match (54 samples, 0.02%) + + +mysqld`rec_offs_nth_extern (354 samples, 0.10%) + + +mysqld`row_search_for_mysql (682 samples, 0.20%) + + +mysqld`page_cur_search_with_match (124 samples, 0.04%) + + +mysqld`hash_calc_hash (229 samples, 0.07%) + + +mysqld`btr_pcur_open_with_no_init_func (120 samples, 0.03%) + + +mysqld`ha_insert_for_fold_func (47 samples, 0.01%) + + +mysqld`handler::index_read_map (640 samples, 0.18%) + + +mysqld`btr_pcur_get_rec (75 samples, 0.02%) + + +mysqld`rec_init_offsets_comp_ordinary (63 samples, 0.02%) + + +mysqld`Item::val_bool (4,112 samples, 1.18%) + + +mysqld`handler::read_range_first (1,076 samples, 0.31%) + + +mysqld`innodb_srv_conc_exit_innodb (36 samples, 0.01%) + + +mysqld`cmp_dtuple_rec_with_match (79 samples, 0.02%) + + +mysqld`find_field_in_table (53 samples, 0.02%) + + +mysqld`btr_search_check_guess (535 samples, 0.15%) + + +libc.so.1`mutex_trylock_adaptive (49 samples, 0.01%) + + +mysqld`row_purge_remove_sec_if_poss (218 samples, 0.06%) + + +mysqld`mtr_memo_pop_all (106 samples, 0.03%) + + +mysqld`btr_cur_upd_lock_and_undo (73 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (137 samples, 0.04%) + + +mysqld`mtr_s_lock_func (44 samples, 0.01%) + + +mysqld`row_ins_index_entry_low (162 samples, 0.05%) + + +mysqld`mutex_get_waiters (57 samples, 0.02%) + + +mysqld`handler::ha_external_lock (199 samples, 0.06%) + + +mysqld`ha_innobase::rnd_next (66 samples, 0.02%) + + +mysqld`Item_field::val_int (42 samples, 0.01%) + + +mysqld`_current_thd (36 samples, 0.01%) + + +mysqld`trx_read_trx_id (287 samples, 0.08%) + + +mysqld`store_key::store_key (39 samples, 0.01%) + + +mysqld`handler::index_read_map (885 samples, 0.25%) + + +mysqld`row_purge_step (287 samples, 0.08%) + + +mysqld`btr_cur_search_to_nth_level (193 samples, 0.06%) + + +mysqld`Protocol::store_string_aux (41 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (67 samples, 0.02%) + + +mysqld`cmp_dtuple_rec (1,572 samples, 0.45%) + + +mysqld`sel_restore_position_for_mysql (59 samples, 0.02%) + + +libc.so.1`__write (251 samples, 0.07%) + + +mysqld`rec_get_status (108 samples, 0.03%) + + +libc.so.1`lstat (44 samples, 0.01%) + + +mysqld`btr_search_check_guess (39 samples, 0.01%) + + +mysqld`thd_ha_data (86 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (575 samples, 0.17%) + + +mysqld`rec_get_offsets_func (42 samples, 0.01%) + + +mysqld`page_dir_slot_get_rec (156 samples, 0.04%) + + +mysqld`page_rec_get_n_recs_before (207 samples, 0.06%) + + +mysqld`hash_calc_hash (86 samples, 0.02%) + + +mysqld`Arg_comparator::compare_int_signed (247 samples, 0.07%) + + +libc.so.1`atomic_swap_8 (152 samples, 0.04%) + + +mysqld`ut_fold_binary (403 samples, 0.12%) + + +mysqld`sel_restore_position_for_mysql (191 samples, 0.05%) + + +mysqld`_increment_page_get_statistics (36 samples, 0.01%) + + +mysqld`ha_innobase::external_lock (87 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (136 samples, 0.04%) + + +mysqld`page_align (44 samples, 0.01%) + + +mysqld`ha_myisam::rnd_next (531 samples, 0.15%) + + +mysqld`check_quick_keys (1,173 samples, 0.34%) + + +mysqld`Item_func_eq::Item_func_eq (49 samples, 0.01%) + + +libc.so.1`atomic_add_64_nv (636 samples, 0.18%) + + +mysqld`String::free (37 samples, 0.01%) + + +libc.so.1`malloc (39 samples, 0.01%) + + +mysqld`hash_calc_hash (39 samples, 0.01%) + + +mysqld`base_list_iterator::base_list_iterator (62 samples, 0.02%) + + +mysqld`rec_init_offsets (461 samples, 0.13%) + + +mysqld`rec_offs_n_fields (61 samples, 0.02%) + + +mysqld`List_iterator_fast (49 samples, 0.01%) + + +mysqld`rec_get_nth_field_offs (47 samples, 0.01%) + + +mysqld`Item_field::cleanup (47 samples, 0.01%) + + +mysqld`add_key_part (80 samples, 0.02%) + + +mysqld`os_aio_simulated_handle (306 samples, 0.09%) + + +mysqld`sel_restore_position_for_mysql (98 samples, 0.03%) + + +mysqld`btr_cur_search_to_nth_level (70 samples, 0.02%) + + +mysqld`mach_read_from_2 (47 samples, 0.01%) + + +mysqld`List_iterator_fast (64 samples, 0.02%) + + +mysqld`page_check_dir (60 samples, 0.02%) + + +mysqld`btr_pcur_move_to_next_on_page (84 samples, 0.02%) + + +mysqld`Item_cond_or::val_int (5,556 samples, 1.59%) + + +mysqld`rr_sequential (15,786 samples, 4.53%) +mysq.. + + +mysqld`ut_align_offset (37 samples, 0.01%) + + +mysqld`rec_get_status (333 samples, 0.10%) + + +mysqld`buf_page_optimistic_get (2,447 samples, 0.70%) + + +mysqld`page_cur_search_with_match (50 samples, 0.01%) + + +mysqld`que_thr_move_to_run_state_for_mysql (113 samples, 0.03%) + + +mysqld`dict_index_get_n_fields (45 samples, 0.01%) + + +mysqld`handler::read_multi_range_next (85,650 samples, 24.58%) +mysqld`handler::read_multi_range.. + + +mysqld`row_undo_ins_remove_sec_low (165 samples, 0.05%) + + +mysqld`btr_search_check_guess (264 samples, 0.08%) + + +mysqld`fill_schema_show_cols_or_idxs (176 samples, 0.05%) + + +mysqld`get_quick_keys (55 samples, 0.02%) + + +mysqld`buf_page_in_file (36 samples, 0.01%) + + +mysqld`rec_offs_n_fields (49 samples, 0.01%) + + +mysqld`row_sel_push_cache_row_for_mysql (382 samples, 0.11%) + + +mysqld`base_list_iterator::base_list_iterator (104 samples, 0.03%) + + +mysqld`rec_get_deleted_flag (208 samples, 0.06%) + + +mysqld`dict_field_get_col (45 samples, 0.01%) + + +mysqld`mi_open_datafile (100 samples, 0.03%) + + +mysqld`JOIN::join_free (410 samples, 0.12%) + + +mysqld`make_join_select (453 samples, 0.13%) + + +mysqld`cmp_dtuple_rec_with_match (37 samples, 0.01%) + + +mysqld`dict_table_is_comp (46 samples, 0.01%) + + +libc.so.1`memcpy (1,003 samples, 0.29%) + + +mysqld`srv_purge_thread (287 samples, 0.08%) + + +mysqld`rec_init_offsets (152 samples, 0.04%) + + +mysqld`row_search_for_mysql (287 samples, 0.08%) + + +mysqld`rec_init_offsets (165 samples, 0.05%) + + +mysqld`QUICK_RANGE_SELECT::get_next (4,275 samples, 1.23%) + + +mysqld`unlock_external (80 samples, 0.02%) + + +mysqld`dict_field_get_col (52 samples, 0.01%) + + +mysqld`page_rec_get_next (63 samples, 0.02%) + + +mysqld`btr_pcur_move_to_next_on_page (50 samples, 0.01%) + + +mysqld`buf_page_optimistic_get (49 samples, 0.01%) + + +mysqld`ha_innobase::store_lock (71 samples, 0.02%) + + +mysqld`THD::set_time_after_lock (68 samples, 0.02%) + + +mysqld`mutex_enter_func (376 samples, 0.11%) + + +mysqld`my_write (244 samples, 0.07%) + + +mysqld`buf_page_optimistic_get (37 samples, 0.01%) + + +mysqld`row_purge_reposition_pcur (52 samples, 0.01%) + + +mysqld`propagate_cond_constants (55 samples, 0.02%) + + +mysqld`cmp_dtuple_rec_with_match (128 samples, 0.04%) + + +mysqld`rec_init_offsets_comp_ordinary (16,706 samples, 4.79%) +mysq.. + + +mysqld`mysql_execute_command (302,417 samples, 86.79%) +mysqld`mysql_execute_command + + +mysqld`rec_init_offsets_comp_ordinary (60 samples, 0.02%) + + +mysqld`my_charset_same (43 samples, 0.01%) + + +mysqld`rec_get_offsets_func (51 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (78 samples, 0.02%) + + +mysqld`rw_lock_s_lock_func (79 samples, 0.02%) + + +libc.so.1`memset (110 samples, 0.03%) + + +mysqld`buf_flush_batch (859 samples, 0.25%) + + +mysqld`btr_cur_search_to_nth_level (39 samples, 0.01%) + + +mysqld`ha_myisam::rnd_pos (65 samples, 0.02%) + + +mysqld`Field::is_null (47 samples, 0.01%) + + +mysqld`page_cur_search_with_match (58 samples, 0.02%) + + +mysqld`ha_chain_get_first (36 samples, 0.01%) + + +libc.so.1`fcntl (369 samples, 0.11%) + + +mysqld`mach_read_from_8 (184 samples, 0.05%) + + +mysqld`row_upd_sec_index_entry (286 samples, 0.08%) + + +mysqld`Item_field::result_as_longlong (63 samples, 0.02%) + + +mysqld`Item_field::val_int (119 samples, 0.03%) + + +mysqld`mem_area_free (59 samples, 0.02%) + + +mysqld`rec_offs_n_fields (110 samples, 0.03%) + + +mysqld`row_sel_store_mysql_rec (59 samples, 0.02%) + + +mysqld`page_align (89 samples, 0.03%) + + +mysqld`ha_insert_for_fold_func (41 samples, 0.01%) + + +mysqld`dict_field_get_col (826 samples, 0.24%) + + +mysqld`btr_block_get_func (81 samples, 0.02%) + + +mysqld`_increment_page_get_statistics (48 samples, 0.01%) + + +mysqld`str_to_datetime (326 samples, 0.09%) + + +mysqld`log_block_store_checksum (40 samples, 0.01%) + + +mysqld`Item_int_func::result_type (36 samples, 0.01%) + + +mysqld`base_list_iterator::base_list_iterator (99 samples, 0.03%) + + +mysqld`innobase_commit (41 samples, 0.01%) + + +mysqld`Item_field::fix_fields (174 samples, 0.05%) + + +mysqld`rec_init_offsets (142 samples, 0.04%) + + +mysqld`btr_leaf_page_release (60 samples, 0.02%) + + +mysqld`my_real_read (3,066 samples, 0.88%) + + +mysqld`mem_area_alloc (51 samples, 0.01%) + + +mysqld`page_rec_get_n_recs_before (55 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (60 samples, 0.02%) + + +libc.so.1`atomic_add_64_nv (69 samples, 0.02%) + + +mysqld`rec_get_status (138 samples, 0.04%) + + +mysqld`btr_pcur_get_rec (46 samples, 0.01%) + + +mysqld`page_rec_is_supremum (168 samples, 0.05%) + + +libc.so.1`mutex_lock_impl (893 samples, 0.26%) + + +mysqld`ha_innobase::rnd_pos (2,589 samples, 0.74%) + + +mysqld`my_net_write (86 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (123 samples, 0.04%) + + +mysqld`Field::is_null (632 samples, 0.18%) + + +mysqld`btr_cur_pessimistic_delete (47 samples, 0.01%) + + +mysqld`btr_pcur_open_with_no_init_func (418 samples, 0.12%) + + +mysqld`end_write (81 samples, 0.02%) + + +mysqld`btr_pcur_move_to_prev_on_page (5,404 samples, 1.55%) + + +libc.so.1`__fcntl_syscall (320 samples, 0.09%) + + +mysqld`my_malloc (92 samples, 0.03%) + + +libc.so.1`memcpy (58 samples, 0.02%) + + +mysqld`Field_varstring::val_str (61 samples, 0.02%) + + +mysqld`ha_innobase::change_active_index (73 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (92 samples, 0.03%) + + +mysqld`dict_field_get_col (77 samples, 0.02%) + + +mysqld`dict_table_is_comp (37 samples, 0.01%) + + +mysqld`ha_commit_one_phase (43 samples, 0.01%) + + +mysqld`sub_select (1,049 samples, 0.30%) + + +mysqld`mach_read_from_8 (333 samples, 0.10%) + + +mysqld`mem_area_alloc (52 samples, 0.01%) + + +mysqld`mach_write_to_2 (51 samples, 0.01%) + + +mysqld`my_utf8_uni (91 samples, 0.03%) + + +mysqld`Item::val_bool (69 samples, 0.02%) + + +mysqld`handler::index_read_map (361 samples, 0.10%) + + +mysqld`rec_get_next_offs (220 samples, 0.06%) + + +mysqld`buf_page_hash_get (54 samples, 0.02%) + + +mysqld`dict_index_get_n_unique_in_tree (89 samples, 0.03%) + + +mysqld`btr_pcur_store_position (2,393 samples, 0.69%) + + +mysqld`ha_innobase::general_fetch (84,967 samples, 24.39%) +mysqld`ha_innobase::general_fetch + + +mysqld`Item_cond::update_used_tables (48 samples, 0.01%) + + +libc.so.1`memcpy (38 samples, 0.01%) + + +mysqld`schema_table_store_record (120 samples, 0.03%) + + +mysqld`recv_recovery_is_on (56 samples, 0.02%) + + +mysqld`btr_cur_position (69 samples, 0.02%) + + +mysqld`build_template (70 samples, 0.02%) + + +mysqld`ha_myisam::write_row (959 samples, 0.28%) + + +mysqld`mtr_memo_push (179 samples, 0.05%) + + +mysqld`strmake_root (64 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (70 samples, 0.02%) + + +mysqld`buf_page_peek_if_too_old (190 samples, 0.05%) + + +mysqld`row_purge_remove_sec_if_poss_low (217 samples, 0.06%) + + +mysqld`dict_col_get_clust_pos (261 samples, 0.07%) + + +mysqld`mi_recinfo_write (364 samples, 0.10%) + + +mysqld`ut_fold_dulint (46 samples, 0.01%) + + +mysqld`rec_init_offsets_comp_ordinary (779 samples, 0.22%) + + +mysqld`ha_innobase::reset (40 samples, 0.01%) + + +mysqld`find_field_in_table (122 samples, 0.04%) + + +mysqld`binlog_end_trans (149 samples, 0.04%) + + +mysqld`rec_offs_set_n_alloc (36 samples, 0.01%) + + +mysqld`ha_innobase::unlock_row (68 samples, 0.02%) + + +mysqld`Field::is_null (40 samples, 0.01%) + + +mysqld`innobase_get_trx (50 samples, 0.01%) + + +libc.so.1`atomic_cas_64 (384 samples, 0.11%) + + +mysqld`mtr_commit (75 samples, 0.02%) + + +mysqld`build_template (1,467 samples, 0.42%) + + +mysqld`ha_innobase::position (108 samples, 0.03%) + + +mysqld`mtr_start (272 samples, 0.08%) + + +mysqld`ha_innobase::index_read (120 samples, 0.03%) + + +libc.so.1`memcpy (53 samples, 0.02%) + + +mysqld`mutex_get_waiters (41 samples, 0.01%) + + +mysqld`Arg_comparator::compare (188 samples, 0.05%) + + +mysqld`page_cur_search_with_match (5,959 samples, 1.71%) + + +mysqld`ut_dulint_create (44 samples, 0.01%) + + +mysqld`dtuple_get_info_bits (49 samples, 0.01%) + + +mysqld`cp_buffer_from_ref (66 samples, 0.02%) + + +mysqld`Item::Item (82 samples, 0.02%) + + +mysqld`handler::ha_update_row (44 samples, 0.01%) + + +mysqld`_mi_read_rnd_dynamic_record (521 samples, 0.15%) + + +libc.so.1`atomic_cas_64 (75 samples, 0.02%) + + +mysqld`Field::is_null (48 samples, 0.01%) + + +mysqld`lock_sec_rec_cons_read_sees (36 samples, 0.01%) + + +mysqld`page_rec_get_next_low (308 samples, 0.09%) + + +mysqld`page_get_max_trx_id (36 samples, 0.01%) + + +mysqld`simplify_joins (85 samples, 0.02%) + + +mysqld`rec_offs_nth_extern (301 samples, 0.09%) + + +mysqld`st_join_table::cleanup (67 samples, 0.02%) + + +mysqld`thd_increment_bytes_received (41 samples, 0.01%) + + +mysqld`SQL_SELECT::skip_record (1,685 samples, 0.48%) + + +mysqld`my_mb_wc_latin1 (103 samples, 0.03%) + + +mysqld`btr_pcur_open_func (54 samples, 0.02%) + + +mysqld`buf_page_get_gen (1,843 samples, 0.53%) + + +mysqld`_my_b_read (164 samples, 0.05%) + + +libc.so.1`atomic_add_64_nv (446 samples, 0.13%) + + +mysqld`Item::val_bool (785 samples, 0.23%) + + +mysqld`mysql_binlog_send (815 samples, 0.23%) + + +mysqld`buf_page_peek_if_too_old (43 samples, 0.01%) + + +mysqld`base_list_iterator::next_fast (56 samples, 0.02%) + + +libc.so.1`_malloc_unlocked (90 samples, 0.03%) + + +mysqld`optimize_cond (651 samples, 0.19%) + + +mysqld`mach_read_from_1 (49 samples, 0.01%) + + +mysqld`btr_pcur_move_to_next_on_page (76 samples, 0.02%) + + +mysqld`in_vector::find (81 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (69 samples, 0.02%) + + +mysqld`buf_page_peek_if_too_old (98 samples, 0.03%) + + +mysqld`btr_cur_search_to_nth_level (83 samples, 0.02%) + + +libc.so.1`memcpy (2,400 samples, 0.69%) + + +mysqld`_increment_page_get_statistics (54 samples, 0.02%) + + +mysqld`find_field_in_tables (164 samples, 0.05%) + + +mysqld`ha_innobase::general_fetch (249 samples, 0.07%) + + +libc.so.1`realfree (56 samples, 0.02%) + + +mysqld`Arg_comparator::compare_datetime (37 samples, 0.01%) + + +mysqld`row_search_for_mysql (113 samples, 0.03%) + + +mysqld`mach_read_from_2 (105 samples, 0.03%) + + +mysqld`get_key_scans_params (7,072 samples, 2.03%) + + +mysqld`rec_get_bit_field_1 (54 samples, 0.02%) + + +mysqld`rec_init_offsets (370 samples, 0.11%) + + +mysqld`page_rec_is_user_rec (135 samples, 0.04%) + + +mysqld`rec_copy_prefix_to_buf (62 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (829 samples, 0.24%) + + +mysqld`buf_page_optimistic_get (71 samples, 0.02%) + + +mysqld`mi_scan (529 samples, 0.15%) + + +mysqld`handler::read_multi_range_first (366 samples, 0.11%) + + +mysqld`create_sort_index (5,388 samples, 1.55%) + + +mysqld`Field::is_null (52 samples, 0.01%) + + +mysqld`mtr_memo_pop_all (61 samples, 0.02%) + + +libc.so.1`atomic_add_64_nv (158 samples, 0.05%) + + +mysqld`ha_innobase::index_read (67 samples, 0.02%) + + +mysqld`ut_hash_ulint (46 samples, 0.01%) + + +mysqld`mach_read_from_2 (64 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (248 samples, 0.07%) + + +mysqld`net_flush (209 samples, 0.06%) + + +mysqld`btr_pcur_restore_position_func (237 samples, 0.07%) + + +mysqld`ut_fold_ulint_pair (175 samples, 0.05%) + + +mysqld`Item_int_func::result_type (103 samples, 0.03%) + + +libc.so.1`__read (1,917 samples, 0.55%) + + +mysqld`Field_new_decimal::store_decimal (69 samples, 0.02%) + + +mysqld`dict_table_is_comp (62 samples, 0.02%) + + +mysqld`flush_cached_records (3,115 samples, 0.89%) + + +mysqld`ut_align_down (37 samples, 0.01%) + + +mysqld`Field_tiny::val_int (39 samples, 0.01%) + + +mysqld`QUICK_RANGE_SELECT::~QUICK_RANGE_SELECT (52 samples, 0.01%) + + +mysqld`dict_table_zip_size (41 samples, 0.01%) + + +mysqld`evaluate_join_record (3,233 samples, 0.93%) + + +mysqld`mtr_commit (2,650 samples, 0.76%) + + +mysqld`buf_page_get_gen (729 samples, 0.21%) + + +mysqld`page_offset (41 samples, 0.01%) + + +mysqld`mach_read_from_8 (162 samples, 0.05%) + + +mysqld`buf_page_get_known_nowait (49 samples, 0.01%) + + +mysqld`ha_innobase::index_read (636 samples, 0.18%) + + +mysqld`fill_record (45 samples, 0.01%) + + +mysqld`dict_index_get_n_unique_in_tree (127 samples, 0.04%) + + +mysqld`rec_offs_n_fields (37 samples, 0.01%) + + +mysqld`Protocol_text::store (2,699 samples, 0.77%) + + +mysqld`page_cur_search_with_match (173 samples, 0.05%) + + +libc.so.1`memcpy (73 samples, 0.02%) + + +mysqld`rec_get_offsets_func (3,743 samples, 1.07%) + + +mysqld`ha_innobase::index_read (924 samples, 0.27%) + + +mysqld`row_sel_field_store_in_mysql_format (535 samples, 0.15%) + + +mysqld`rec_init_offsets_comp_ordinary (50 samples, 0.01%) + + +mysqld`mach_read_from_2 (49 samples, 0.01%) + + +mysqld`ut_delay (71 samples, 0.02%) + + +mysqld`page_align (58 samples, 0.02%) + + +mysqld`dict_field_get_col (82 samples, 0.02%) + + +mysqld`row_sel_field_store_in_mysql_format (3,143 samples, 0.90%) + + +mysqld`mach_read_from_2 (38 samples, 0.01%) + + +libc.so.1`set_priority (5,761 samples, 1.65%) + + +mysqld`dict_index_get_nth_field_pos (47 samples, 0.01%) + + +mysqld`rec_init_offsets (1,008 samples, 0.29%) + + +mysqld`btr_pcur_restore_position_func (70 samples, 0.02%) + + +mysqld`Item_field::fix_fields (201 samples, 0.06%) + + +mysqld`innobase_get_slow_log (36 samples, 0.01%) + + +mysqld`0x724ca0 (44 samples, 0.01%) + + +mysqld`btr_pcur_open_func (139 samples, 0.04%) + + +mysqld`rec_get_nth_field_offs (379 samples, 0.11%) + + +mysqld`make_cond_for_table (54 samples, 0.02%) + + +mysqld`btr_pcur_is_before_first_on_page (45 samples, 0.01%) + + +mysqld`Protocol_text::store_null (42 samples, 0.01%) + + +mysqld`btr_pcur_open_with_no_init_func (583 samples, 0.17%) + + +mysqld`rec_get_offsets_func (80 samples, 0.02%) + + +mysqld`List_iterator_fast (307 samples, 0.09%) + + +mysqld`mach_read_from_2 (57 samples, 0.02%) + + +mysqld`ha_innobase::change_active_index (81 samples, 0.02%) + + +mysqld`mutex_spin_wait (107 samples, 0.03%) + + +mysqld`sel_restore_position_for_mysql (44 samples, 0.01%) + + +mysqld`Item_cond_and::val_int (83 samples, 0.02%) + + +mysqld`row_undo_search_clust_to_pcur (176 samples, 0.05%) + + +mysqld`btr_search_check_guess (6,592 samples, 1.89%) + + +mysqld`Protocol::write (153 samples, 0.04%) + + +mysqld`btr_pcur_open_with_no_init_func (236 samples, 0.07%) + + +mysqld`ha_innobase::general_fetch (83,723 samples, 24.03%) +mysqld`ha_innobase::general_fetch + + +mysqld`get_datetime_value (586 samples, 0.17%) + + +mysqld`buf_flush_init_for_writing (760 samples, 0.22%) + + +mysqld`buf_block_align (183 samples, 0.05%) + + +mysqld`MYSQL_BIN_LOG::write (146 samples, 0.04%) + + +libc.so.1`malloc (52 samples, 0.01%) + + +mysqld`Item_field::used_tables (41 samples, 0.01%) + + +mysqld`btr_pcur_get_rec (66 samples, 0.02%) + + +mysqld`Item_field::val_str (126 samples, 0.04%) + + +mysqld`select_send::send_eof (63 samples, 0.02%) + + +mysqld`row_sel_store_mysql_rec (1,356 samples, 0.39%) + + +mysqld`base_list_iterator::next_fast (153 samples, 0.04%) + + +mysqld`dict_index_copy_types (162 samples, 0.05%) + + +mysqld`Item_field::val_int (501 samples, 0.14%) + + +mysqld`Item_cond::Item_cond (36 samples, 0.01%) + + +mysqld`ha_innobase::index_next_same (2,923 samples, 0.84%) + + +mysqld`row_sel_get_clust_rec_for_mysql (32,843 samples, 9.43%) +mysqld`row_.. + + +mysqld`sortcmp (277 samples, 0.08%) + + +mysqld`btr_search_guess_on_hash (56 samples, 0.02%) + + +mysqld`my_mb_wc_latin1 (38 samples, 0.01%) + + +mysqld`rec_get_offsets_func (1,043 samples, 0.30%) + + +mysqld`mutex_enter_func (253 samples, 0.07%) + + +mysqld`btr_pcur_restore_position_func (77 samples, 0.02%) + + +mysqld`innobase_commit (38 samples, 0.01%) + + +mysqld`rec_init_offsets_comp_ordinary (708 samples, 0.20%) + + +mysqld`rec_get_offsets_func (53 samples, 0.02%) + + +mysqld`rec_get_deleted_flag (37 samples, 0.01%) + + +mysqld`net_real_write (141 samples, 0.04%) + + +mysqld`rw_lock_s_lock_func (227 samples, 0.07%) + + +mysqld`Item_cond_and::~Item_cond_and (49 samples, 0.01%) + + +mysqld`page_rec_get_next (507 samples, 0.15%) + + +mysqld`Item_cond_and::val_int (3,216 samples, 0.92%) + + +mysqld`buf_page_get_known_nowait (46 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (160 samples, 0.05%) + + +mysqld`buf_page_release (48 samples, 0.01%) + + +mysqld`row_upd_clust_rec (220 samples, 0.06%) + + +mysqld`ut_align_offset (38 samples, 0.01%) + + +mysqld`rec_offs_n_fields (643 samples, 0.18%) + + +mysqld`btr_search_info_update (680 samples, 0.20%) + + +mysqld`buf_page_optimistic_get (181 samples, 0.05%) + + +mysqld`lock_sec_rec_cons_read_sees (646 samples, 0.19%) + + +mysqld`base_list_iterator::init (82 samples, 0.02%) + + +mysqld`page_offset (94 samples, 0.03%) + + +mysqld`SQL_SELECT::skip_record (14,505 samples, 4.16%) +mys.. + + +mysqld`btr_pcur_open_with_no_init_func (2,096 samples, 0.60%) + + +mysqld`Arg_comparator::compare_int_signed (1,106 samples, 0.32%) + + +mysqld`page_rec_get_next_const (88 samples, 0.03%) + + +mysqld`btr_pcur_open_with_no_init_func (755 samples, 0.22%) + + +mysqld`btr_pcur_move_to_next_on_page (650 samples, 0.19%) + + +mysqld`Item_subselect::exec (1,053 samples, 0.30%) + + +mysqld`_increment_page_get_statistics (264 samples, 0.08%) + + +mysqld`buf_page_release (65 samples, 0.02%) + + +mysqld`dict_table_is_comp (46 samples, 0.01%) + + +libc.so.1`open (51 samples, 0.01%) + + +mysqld`ha_innobase::store_key_val_for_row (41 samples, 0.01%) + + +mysqld`mysql_update (114 samples, 0.03%) + + +mysqld`handler::drop_table (64 samples, 0.02%) + + +mysqld`page_cur_search_with_match (77 samples, 0.02%) + + +mysqld`my_net_read (3,090 samples, 0.89%) + + +mysqld`mach_encode_2 (110 samples, 0.03%) + + +mysqld`page_rec_is_comp (188 samples, 0.05%) + + +libc.so.1`memcpy (68 samples, 0.02%) + + +mysqld`thd_to_trx (110 samples, 0.03%) + + +mysqld`btr_cur_search_to_nth_level (119 samples, 0.03%) + + +mysqld`rw_lock_s_lock_low (165 samples, 0.05%) + + +mysqld`rw_lock_s_lock_low (210 samples, 0.06%) + + +mysqld`mutex_exit (47 samples, 0.01%) + + +mysqld`page_rec_is_infimum_low (49 samples, 0.01%) + + +mysqld`mach_read_from_6 (186 samples, 0.05%) + + +mysqld`String::String (48 samples, 0.01%) + + +mysqld`page_rec_get_next (693 samples, 0.20%) + + +mysqld`btr_cur_add_path_info (176 samples, 0.05%) + + +mysqld`row_sel_get_clust_rec_for_mysql (655 samples, 0.19%) + + +mysqld`cmp_dtuple_rec_with_match (41 samples, 0.01%) + + +mysqld`row_get_rec_trx_id (360 samples, 0.10%) + + +mysqld`row_sel_field_store_in_mysql_format (44 samples, 0.01%) + + +mysqld`rec_get_next_offs (107 samples, 0.03%) + + +mysqld`row_search_for_mysql (626 samples, 0.18%) + + +mysqld`List_iterator_fast (187 samples, 0.05%) + + +mysqld`lex_start (194 samples, 0.06%) + + +mysqld`read_view_sees_trx_id (112 samples, 0.03%) + + +mysqld`rec_fold (48 samples, 0.01%) + + +mysqld`dict_index_get_n_unique_in_tree (101 samples, 0.03%) + + +mysqld`Item_equal::compare_const (63 samples, 0.02%) + + +mysqld`write_dynamic_record (90 samples, 0.03%) + + +mysqld`rec_get_offsets_func (122 samples, 0.04%) + + +libc.so.1`__write (116 samples, 0.03%) + + +mysqld`row_update_for_mysql (581 samples, 0.17%) + + +mysqld`Field::is_null (89 samples, 0.03%) + + +mysqld`thd_ha_data (86 samples, 0.02%) + + +libc.so.1`atomic_swap_8 (191 samples, 0.05%) + + +mysqld`join_read_next_same (5,101 samples, 1.46%) + + +mysqld`btr_cur_search_to_nth_level (127 samples, 0.04%) + + +mysqld`buf_page_get_mutex_enter (321 samples, 0.09%) + + +mysqld`rec_get_offsets_func (95 samples, 0.03%) + + +mysqld`end_update (39 samples, 0.01%) + + +mysqld`mach_read_from_2 (71 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (2,720 samples, 0.78%) + + +libc.so.1`__write (243 samples, 0.07%) + + +mysqld`page_rec_is_supremum (85 samples, 0.02%) + + +mysqld`ut_delay (161 samples, 0.05%) + + +mysqld`Item_field::is_null (56 samples, 0.02%) + + +mysqld`buf_page_get_gen (39 samples, 0.01%) + + +mysqld`my_strnncollsp_simple (258 samples, 0.07%) + + +mysqld`btr_search_guess_on_hash (946 samples, 0.27%) + + +mysqld`base_list_iterator::base_list_iterator (39 samples, 0.01%) + + +mysqld`buf_page_get_known_nowait (132 samples, 0.04%) + + +mysqld`my_qsort (41 samples, 0.01%) + + +mysqld`page_cur_is_after_last (176 samples, 0.05%) + + +mysqld`THD::is_error (79 samples, 0.02%) + + +mysqld`Arg_comparator::compare_int_signed (83 samples, 0.02%) + + +mysqld`lock_clust_rec_cons_read_sees (607 samples, 0.17%) + + +mysqld`get_datetime_value (768 samples, 0.22%) + + +mysqld`rec_init_offsets (218 samples, 0.06%) + + +libc.so.1`__lwp_unpark (70 samples, 0.02%) + + +mysqld`rec_get_nth_field_offs (85 samples, 0.02%) + + +mysqld`page_dir_find_owner_slot (115 samples, 0.03%) + + +mysqld`row_sel_push_cache_row_for_mysql (1,500 samples, 0.43%) + + +mysqld`Item_field::collect_item_field_processor (50 samples, 0.01%) + + +mysqld`row_upd (560 samples, 0.16%) + + +mysqld`rw_lock_s_lock_low (49 samples, 0.01%) + + +mysqld`ut_align_down (37 samples, 0.01%) + + +libc.so.1`malloc (186 samples, 0.05%) + + +mysqld`rw_lock_s_lock_func (55 samples, 0.02%) + + +mysqld`ha_innobase::general_fetch (4,219 samples, 1.21%) + + +mysqld`row_sel_store_mysql_rec (2,306 samples, 0.66%) + + +mysqld`btr_pcur_open_with_no_init_func (84 samples, 0.02%) + + +mysqld`btr_cur_optimistic_insert (62 samples, 0.02%) + + +libc.so.1`gethrtime (52 samples, 0.01%) + + +libc.so.1`__lwp_park (62 samples, 0.02%) + + +mysqld`buf_page_set_accessed_make_young (388 samples, 0.11%) + + +mysqld`row_sel_push_cache_row_for_mysql (71 samples, 0.02%) + + +mysqld`SQL_SELECT::skip_record (84 samples, 0.02%) + + +mysqld`page_rec_get_next (64 samples, 0.02%) + + +mysqld`trx_undo_assign_undo (43 samples, 0.01%) + + +mysqld`ut_delay (43 samples, 0.01%) + + +mysqld`page_rec_get_next_low (364 samples, 0.10%) + + +libc.so.1`mutex_lock (55 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (94 samples, 0.03%) + + +mysqld`ut_fold_ulint_pair (393 samples, 0.11%) + + +mysqld`base_ilist_iterator::next (461 samples, 0.13%) + + +mysqld`Item::val_bool (65 samples, 0.02%) + + +mysqld`page_cur_search_with_match (124 samples, 0.04%) + + +mysqld`ut_align_offset (42 samples, 0.01%) + + +mysqld`row_ins_index_entry (1,061 samples, 0.30%) + + +mysqld`setup_fields (362 samples, 0.10%) + + +mysqld`btr_search_check_guess (5,027 samples, 1.44%) + + +mysqld`innobase_commit_low (89 samples, 0.03%) + + +mysqld`page_cur_try_search_shortcut (325 samples, 0.09%) + + +mysqld`Field::is_null (233 samples, 0.07%) + + +mysqld`btr_pcur_open_func (41 samples, 0.01%) + + +mysqld`dict_index_copy_rec_order_prefix (1,374 samples, 0.39%) + + +mysqld`rw_lock_get_writer (451 samples, 0.13%) + + +mysqld`btr_page_get_index_id (48 samples, 0.01%) + + +mysqld`rec_offs_n_fields (2,857 samples, 0.82%) + + +mysqld`row_sel_get_clust_rec_for_mysql (185 samples, 0.05%) + + +mysqld`rec_get_bit_field_1 (47 samples, 0.01%) + + +mysqld`dict_index_copy_types (371 samples, 0.11%) + + +mysqld`Item::const_item (66 samples, 0.02%) + + +mysqld`srv_error_monitor_thread (65 samples, 0.02%) + + +mysqld`row_sel_get_clust_rec_for_mysql (108 samples, 0.03%) + + +mysqld`Item_func_eq::val_int (70 samples, 0.02%) + + +mysqld`btr_search_check_guess (115 samples, 0.03%) + + +mysqld`rec_get_next_offs (94 samples, 0.03%) + + +mysqld`Item_string::Item_string (172 samples, 0.05%) + + +mysqld`rec_init_offsets (70 samples, 0.02%) + + +mysqld`btr_pcur_open_func (160 samples, 0.05%) + + +mysqld`rec_get_n_owned_new (197 samples, 0.06%) + + +mysqld`ha_chain_get_first (1,654 samples, 0.47%) + + +mysqld`QUICK_ROR_INTERSECT_SELECT::reset (41 samples, 0.01%) + + +libc.so.1`readlink (64 samples, 0.02%) + + +mysqld`get_mm_parts (153 samples, 0.04%) + + +mysqld`page_header_get_field (131 samples, 0.04%) + + +mysqld`Field::val_str (138 samples, 0.04%) + + +mysqld`page_cur_search_with_match (387 samples, 0.11%) + + +libc.so.1`_malloc_unlocked (68 samples, 0.02%) + + +mysqld`rec_offs_n_fields (143 samples, 0.04%) + + +mysqld`store_key::copy (39 samples, 0.01%) + + +mysqld`cmp_dtuple_rec (65 samples, 0.02%) + + +mysqld`mtr_memo_push (221 samples, 0.06%) + + +mysqld`buf_block_buf_fix_inc_func (43 samples, 0.01%) + + +mysqld`page_align (80 samples, 0.02%) + + +mysqld`Item_bool_func2::fix_length_and_dec (159 samples, 0.05%) + + +mysqld`rec_offs_nth_extern (75 samples, 0.02%) + + +mysqld`mtr_commit (216 samples, 0.06%) + + +mysqld`btr_search_check_guess (47 samples, 0.01%) + + +libc.so.1`mutex_lock_queue (60 samples, 0.02%) + + +mysqld`page_dir_find_owner_slot (38 samples, 0.01%) + + +libc.so.1`mutex_lock (84 samples, 0.02%) + + +libc.so.1`malloc (79 samples, 0.02%) + + +mysqld`row_search_on_row_ref (41 samples, 0.01%) + + +mysqld`ha_myisam::delete_table (381 samples, 0.11%) + + +mysqld`Item_cond_or::val_int (2,197 samples, 0.63%) + + +mysqld`page_rec_get_next_low (102 samples, 0.03%) + + +mysqld`sub_select (693 samples, 0.20%) + + +mysqld`buf_page_optimistic_get (77 samples, 0.02%) + + +mysqld`Item_func::fix_fields (203 samples, 0.06%) + + +mysqld`ha_innobase::index_init (234 samples, 0.07%) + + +mysqld`trx_prepare_for_mysql (52 samples, 0.01%) + + +mysqld`ut_delay (38 samples, 0.01%) + + +mysqld`TRP_RANGE::make_quick (357 samples, 0.10%) + + +mysqld`join_read_const (1,177 samples, 0.34%) + + +mysqld`rec_get_offsets_func (69 samples, 0.02%) + + +mysqld`buf_page_get_known_nowait (124 samples, 0.04%) + + +mysqld`hash_calc_hash (190 samples, 0.05%) + + +mysqld`Protocol::store_string_aux (3,656 samples, 1.05%) + + +libc.so.1`realloc (41 samples, 0.01%) + + +mysqld`rec_init_offsets_comp_ordinary (742 samples, 0.21%) + + +mysqld`rec_get_status (60 samples, 0.02%) + + +mysqld`row_sel_store_mysql_rec (51 samples, 0.01%) + + +mysqld`base_list_iterator::init (74 samples, 0.02%) + + +mysqld`do_select (1,050 samples, 0.30%) + + +mysqld`mutex_enter_func (61 samples, 0.02%) + + +mysqld`rr_unlock_row (178 samples, 0.05%) + + +mysqld`rec_init_offsets_comp_ordinary (51 samples, 0.01%) + + +mysqld`simplify_joins (45 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (69 samples, 0.02%) + + +mysqld`btr_search_info_update (2,289 samples, 0.66%) + + +mysqld`innobase_commit_low (88 samples, 0.03%) + + +mysqld`get_quick_select (345 samples, 0.10%) + + +mysqld`Arg_comparator::compare_string (40 samples, 0.01%) + + +mysqld`row_sel_store_mysql_rec (57 samples, 0.02%) + + +mysqld`Item_field::is_null (57 samples, 0.02%) + + +mysqld`trx_read_trx_id (227 samples, 0.07%) + + +mysqld`dtuple_get_n_fields_cmp (50 samples, 0.01%) + + +mysqld`rec_get_n_owned_new (226 samples, 0.06%) + + +mysqld`buf_block_get_state (47 samples, 0.01%) + + +libc.so.1`memcpy (78 samples, 0.02%) + + +mysqld`String::length (38 samples, 0.01%) + + +mysqld`cmp_dtuple_rec (85 samples, 0.02%) + + +libc.so.1`free (38 samples, 0.01%) + + +mysqld`innobase_commit (254 samples, 0.07%) + + +mysqld`mach_read_from_2 (41 samples, 0.01%) + + +mysqld`build_template (62 samples, 0.02%) + + +mysqld`hashcmp (52 samples, 0.01%) + + +libc.so.1`mutex_lock_impl (114 samples, 0.03%) + + +mysqld`mtr_release_s_latch_at_savepoint (74 samples, 0.02%) + + +mysqld`thr_lock (41 samples, 0.01%) + + +mysqld`row_sel_store_mysql_rec (6,281 samples, 1.80%) + + +mysqld`my_long10_to_str_8bit (40 samples, 0.01%) + + +mysqld`mach_read_from_8 (242 samples, 0.07%) + + +mysqld`Arg_comparator::compare_datetime (61 samples, 0.02%) + + +mysqld`rec_init_offsets_comp_ordinary (127 samples, 0.04%) + + +mysqld`rec_get_offsets_func (73 samples, 0.02%) + + +mysqld`row_sel_field_store_in_mysql_format (152 samples, 0.04%) + + +mysqld`rec_get_nth_field_offs (152 samples, 0.04%) + + +mysqld`dict_index_copy_rec_order_prefix (55 samples, 0.02%) + + +mysqld`Item_func_isnull::val_int (110 samples, 0.03%) + + +mysqld`rec_init_offsets (878 samples, 0.25%) + + +mysqld`dtuple_fold (60 samples, 0.02%) + + +mysqld`Item_cond_and::val_int (102 samples, 0.03%) + + +mysqld`String::set (56 samples, 0.02%) + + +mysqld`rec_get_bit_field_1 (133 samples, 0.04%) + + +mysqld`btr_pcur_open_with_no_init_func (80 samples, 0.02%) + + +mysqld`ha_search_and_get_data (4,910 samples, 1.41%) + + +mysqld`get_lock_data (209 samples, 0.06%) + + +mysqld`my_malloc (112 samples, 0.03%) + + +mysqld`sync_array_wait_event (46 samples, 0.01%) + + +mysqld`Item_func_like::val_int (319 samples, 0.09%) + + +libc.so.1`mutex_unlock (40 samples, 0.01%) + + +mysqld`que_run_threads (287 samples, 0.08%) + + +mysqld`btr_search_guess_on_hash (173 samples, 0.05%) + + +mysqld`rec_init_offsets_comp_ordinary (148 samples, 0.04%) + + +mysqld`page_rec_is_supremum (106 samples, 0.03%) + + +mysqld`Item_cond_or::val_int (53 samples, 0.02%) + + +mysqld`dict_index_get_n_unique_in_tree (58 samples, 0.02%) + + +mysqld`dict_table_is_comp (51 samples, 0.01%) + + +mysqld`dyn_array_push (121 samples, 0.03%) + + +libc.so.1`memset (221 samples, 0.06%) + + +mysqld`mtr_memo_slot_release (94 samples, 0.03%) + + +mysqld`create_ref_for_key (189 samples, 0.05%) + + +libc.so.1`mutex_trylock_adaptive (458 samples, 0.13%) + + +mysqld`Field_tiny::val_int (82 samples, 0.02%) + + +mysqld`my_open (51 samples, 0.01%) + + +mysqld`trx_prepare_off_kernel (52 samples, 0.01%) + + +mysqld`rec_get_offsets_func (516 samples, 0.15%) + + +libc.so.1`__read (153 samples, 0.04%) + + +mysqld`ha_innobase::info (109 samples, 0.03%) + + +mysqld`mach_read_from_2 (65 samples, 0.02%) + + +mysqld`rec_copy_prefix_to_buf (52 samples, 0.01%) + + +mysqld`row_sel_store_mysql_rec (70 samples, 0.02%) + + +mysqld`rec_get_offsets_func (18,815 samples, 5.40%) +mysql.. + + +mysqld`dict_field_get_col (46 samples, 0.01%) + + +mysqld`ha_myisam::extra_opt (45 samples, 0.01%) + + +mysqld`thd_to_trx (61 samples, 0.02%) + + +mysqld`ha_chain_get_first (78 samples, 0.02%) + + +mysqld`rec_get_offsets_func (47 samples, 0.01%) + + +mysqld`btr_estimate_n_rows_in_range (350 samples, 0.10%) + + +mysqld`Item_func_le::val_int (771 samples, 0.22%) + + +mysqld`open_and_lock_tables (6,808 samples, 1.95%) + + +mysqld`my_snprintf (54 samples, 0.02%) + + +mysqld`choose_plan (134 samples, 0.04%) + + +mysqld`mutex_exit (336 samples, 0.10%) + + +mysqld`btr_pcur_store_position (39 samples, 0.01%) + + +mysqld`my_write (353 samples, 0.10%) + + +mysqld`rr_quick (1,341 samples, 0.38%) + + +mysqld`os_file_write (70 samples, 0.02%) + + +mysqld`innobase_xa_prepare (418 samples, 0.12%) + + +mysqld`ha_innobase::index_next_same (938 samples, 0.27%) + + +mysqld`JOIN::JOIN (77 samples, 0.02%) + + +mysqld`trx_prepare_for_mysql (411 samples, 0.12%) + + +mysqld`rec_init_offsets (304 samples, 0.09%) + + +mysqld`my_read (179 samples, 0.05%) + + +mysqld`handler::ha_external_lock (118 samples, 0.03%) + + +mysqld`sortcmp (37 samples, 0.01%) + + +mysqld`rw_lock_s_unlock_func (700 samples, 0.20%) + + +libc.so.1`__read (180 samples, 0.05%) + + +mysqld`mi_rrnd (63 samples, 0.02%) + + +mysqld`mem_heap_block_free (38 samples, 0.01%) + + +mysqld`alloc_root (46 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (432 samples, 0.12%) + + +mysqld`sub_select_cache (3,145 samples, 0.90%) + + +mysqld`rec_init_offsets (36 samples, 0.01%) + + +mysqld`mach_read_from_1 (37 samples, 0.01%) + + +mysqld`row_sel_store_mysql_rec (134 samples, 0.04%) + + +mysqld`row_sel_store_mysql_rec (63 samples, 0.02%) + + +mysqld`row_get_rec_trx_id (52 samples, 0.01%) + + +mysqld`Eq_creator::create (71 samples, 0.02%) + + +mysqld`row_sel_push_cache_row_for_mysql (323 samples, 0.09%) + + +mysqld`thd_to_trx (108 samples, 0.03%) + + +mysqld`evaluate_null_complemented_join_record (58 samples, 0.02%) + + +mysqld`mtr_memo_slot_release (81 samples, 0.02%) + + +libc.so.1`memset (64 samples, 0.02%) + + +mysqld`innobase_get_trx (443 samples, 0.13%) + + +mysqld`mtr_memo_push (49 samples, 0.01%) + + +mysqld`buf_page_release (37 samples, 0.01%) + + +mysqld`end_send (53 samples, 0.02%) + + +mysqld`Item_func_isnull::val_int (115 samples, 0.03%) + + +mysqld`buf_block_get_state (89 samples, 0.03%) + + +mysqld`ha_innobase::general_fetch (164 samples, 0.05%) + + +mysqld`handler::ha_statistic_increment (135 samples, 0.04%) + + +mysqld`row_sel_push_cache_row_for_mysql (61 samples, 0.02%) + + +mysqld`page_rec_is_supremum (115 samples, 0.03%) + + +mysqld`row_mysql_store_true_var_len (120 samples, 0.03%) + + +libc.so.1`cond_wait_queue (127 samples, 0.04%) + + +mysqld`handler::index_read_map (931 samples, 0.27%) + + +mysqld`handler::ha_external_lock (78 samples, 0.02%) + + +libc.so.1`memset (2,927 samples, 0.84%) + + +mysqld`Arg_comparator::compare_string (81 samples, 0.02%) + + +libc.so.1`memcpy (57 samples, 0.02%) + + +libc.so.1`get_parms (917 samples, 0.26%) + + +libc.so.1`memcpy (107 samples, 0.03%) + + +mysqld`mtr_memo_push (62 samples, 0.02%) + + +mysqld`que_thr_step (287 samples, 0.08%) + + +mysqld`mysql_schema_table (171 samples, 0.05%) + + +mysqld`rec_init_offsets (42 samples, 0.01%) + + +mysqld`select_send::send_data (211 samples, 0.06%) + + +libc.so.1`cleanfree (57 samples, 0.02%) + + +mysqld`rec_init_offsets (170 samples, 0.05%) + + +mysqld`ha_innobase::records_in_range (58 samples, 0.02%) + + +mysqld`buf_page_get_state (52 samples, 0.01%) + + +libc.so.1`atomic_cas_64 (96 samples, 0.03%) + + +mysqld`trx_assign_read_view (94 samples, 0.03%) + + +mysqld`Item::val_bool (449 samples, 0.13%) + + +mysqld`btr_pcur_move_to_next (161 samples, 0.05%) + + +mysqld`rw_lock_s_lock_func (36 samples, 0.01%) + + +mysqld`dict_field_get_col (458 samples, 0.13%) + + +mysqld`handler::index_read_map (2,993 samples, 0.86%) + + +mysqld`row_sel_store_mysql_rec (290 samples, 0.08%) + + +mysqld`ha_search_and_get_data (69 samples, 0.02%) + + +mysqld`trx_commit_complete_for_mysql (133 samples, 0.04%) + + +mysqld`buf_page_peek_if_too_old (121 samples, 0.03%) + + +mysqld`trx_read_trx_id (268 samples, 0.08%) + + +mysqld`btr_node_ptr_get_child_page_no (54 samples, 0.02%) + + +mysqld`Item_field::fix_fields (103 samples, 0.03%) + + +mysqld`Item_cond_and::val_int (920 samples, 0.26%) + + +mysqld`_mi_rec_unpack (125 samples, 0.04%) + + +mysqld`dict_col_copy_type (252 samples, 0.07%) + + +mysqld`mutex_enter_func (149 samples, 0.04%) + + +mysqld`rec_init_offsets (68 samples, 0.02%) + + +mysqld`Arg_comparator::compare (746 samples, 0.21%) + + +libc.so.1`memcpy (41 samples, 0.01%) + + +mysqld`row_sel_store_mysql_rec (28,564 samples, 8.20%) +mysqld`ro.. + + +mysqld`Item_func_equal::val_int (1,053 samples, 0.30%) + + +mysqld`row_update_for_mysql (42 samples, 0.01%) + + +mysqld`ha_innobase::general_fetch (5,042 samples, 1.45%) + + +mysqld`ha_innobase::index_first (65 samples, 0.02%) + + +mysqld`create_table_def_key (36 samples, 0.01%) + + +mysqld`rec_init_offsets_comp_ordinary (51 samples, 0.01%) + + +mysqld`create_myisam_tmp_table (977 samples, 0.28%) + + +mysqld`thr_get_trx (82 samples, 0.02%) + + +mysqld`mutex_enter_func (59 samples, 0.02%) + + +mysqld`Lex_input_stream::yyGet (74 samples, 0.02%) + + +mysqld`Field::is_null (60 samples, 0.02%) + + +libc.so.1`_malloc_unlocked (49 samples, 0.01%) + + +mysqld`ha_chain_get_first (48 samples, 0.01%) + + +mysqld`ha_innobase::index_read (477 samples, 0.14%) + + +mysqld`JOIN::exec (1,050 samples, 0.30%) + + +mysqld`btr_pcur_move_to_next (40 samples, 0.01%) + + +mysqld`ut_align_offset (38 samples, 0.01%) + + +mysqld`sortcmp (416 samples, 0.12%) + + +mysqld`row_sel_store_mysql_rec (302 samples, 0.09%) + + +mysqld`mysql_insert (3,079 samples, 0.88%) + + +mysqld`evaluate_join_record (39 samples, 0.01%) + + +mysqld`rec_copy_prefix_to_buf (65 samples, 0.02%) + + +mysqld`String::~String (56 samples, 0.02%) + + +mysqld`get_mm_parts (37 samples, 0.01%) + + +mysqld`ha_search_and_get_data (41 samples, 0.01%) + + +mysqld`Item_field::val_int (38 samples, 0.01%) + + +mysqld`sel_restore_position_for_mysql (58 samples, 0.02%) + + +mysqld`List_iterator_fast (341 samples, 0.10%) + + +mysqld`sel_restore_position_for_mysql (232 samples, 0.07%) + + +mysqld`THD::set_time (77 samples, 0.02%) + + +mysqld`rec_init_offsets_comp_ordinary (105 samples, 0.03%) + + +libc.so.1`__write (106 samples, 0.03%) + + +mysqld`ha_search_and_get_data (145 samples, 0.04%) + + +mysqld`Item::val_bool (59 samples, 0.02%) + + +mysqld`thd_to_trx (56 samples, 0.02%) + + +mysqld`rec_offs_set_n_fields (40 samples, 0.01%) + + +mysqld`row_build_row_ref_in_tuple (72 samples, 0.02%) + + +mysqld`btr_pcur_move_to_next (81 samples, 0.02%) + + +mysqld`rec_get_offsets_func (343 samples, 0.10%) + + +mysqld`mutex_reset_lock_word (42 samples, 0.01%) + + +mysqld`rec_get_offsets_func (139 samples, 0.04%) + + +mysqld`rw_lock_s_lock_func (57 samples, 0.02%) + + +mysqld`rec_offs_n_fields (462 samples, 0.13%) + + +mysqld`end_send (4,253 samples, 1.22%) + + +mysqld`btr_pcur_restore_position_func (44 samples, 0.01%) + + +mysqld`handler::ha_write_row (1,010 samples, 0.29%) + + +mysqld`btr_search_build_page_hash_index (144 samples, 0.04%) + + +mysqld`btr_cur_search_to_nth_level (18,790 samples, 5.39%) +mysql.. + + +mysqld`ut_fold_ulint_pair (36 samples, 0.01%) + + +mysqld`rec_get_bit_field_1 (62 samples, 0.02%) + + +mysqld`page_cur_search_with_match (82 samples, 0.02%) + + +mysqld`ha_innobase::general_fetch (660 samples, 0.19%) + + +libc.so.1`__time (231 samples, 0.07%) + + +mysqld`Sql_alloc::operator new (67 samples, 0.02%) + + +mysqld`Item_field::val_str (97 samples, 0.03%) + + +mysqld`Item_field::send (2,847 samples, 0.82%) + + +mysqld`btr_pcur_store_position (75 samples, 0.02%) + + +mysqld`rw_lock_get_writer (44 samples, 0.01%) + + +mysqld`get_text (257 samples, 0.07%) + + +mysqld`ut_dulint_create (39 samples, 0.01%) + + +mysqld`ha_innobase::write_row (1,787 samples, 0.51%) + + +libc.so.1`pthread_getspecific (67 samples, 0.02%) + + +mysqld`ha_innobase::index_next_same (2,856 samples, 0.82%) + + +mysqld`row_search_for_mysql (3,502 samples, 1.01%) + + +mysqld`mutex_exit (125 samples, 0.04%) + + +mysqld`mach_read_from_2 (42 samples, 0.01%) + + +mysqld`rec_get_offsets_func (38 samples, 0.01%) + + +mysqld`thd_to_trx (38 samples, 0.01%) + + +libc.so.1`atomic_swap_8 (92 samples, 0.03%) + + +libc.so.1`gethrtime (65 samples, 0.02%) + + +mysqld`THD::binlog_query (69 samples, 0.02%) + + +libc.so.1`rw_rdlock_impl (49 samples, 0.01%) + + +mysqld`dict_table_is_comp (36 samples, 0.01%) + + +mysqld`btr_search_guess_on_hash (325 samples, 0.09%) + + +mysqld`handler::ha_external_lock (36 samples, 0.01%) + + +mysqld`mem_heap_create_block (51 samples, 0.01%) + + +mysqld`Arg_comparator::compare (1,528 samples, 0.44%) + + +mysqld`row_sel_push_cache_row_for_mysql (108 samples, 0.03%) + + +libc.so.1`atomic_swap_8 (80 samples, 0.02%) + + +mysqld`row_search_for_mysql (106 samples, 0.03%) + + +mysqld`row_get_rec_trx_id (406 samples, 0.12%) + + +mysqld`btr_cur_search_to_nth_level (90 samples, 0.03%) + + +mysqld`join_read_next_same (940 samples, 0.27%) + + +mysqld`Item_field::val_int (1,118 samples, 0.32%) + + +mysqld`mach_write_to_1 (92 samples, 0.03%) + + +mysqld`page_rec_is_comp (333 samples, 0.10%) + + +mysqld`my_strnncollsp_simple (165 samples, 0.05%) + + +mysqld`copy_and_convert (239 samples, 0.07%) + + +libc.so.1`atomic_swap_8 (36 samples, 0.01%) + + +mysqld`mutex_exit (187 samples, 0.05%) + + +mysqld`find_field_in_table_ref (145 samples, 0.04%) + + +mysqld`Item_func_trig_cond::val_int (95 samples, 0.03%) + + +mysqld`my_wc_mb_latin1 (88 samples, 0.03%) + + +mysqld`btr_pcur_restore_position_func (180 samples, 0.05%) + + +mysqld`setup_tables_and_check_access (108 samples, 0.03%) + + +mysqld`rec_get_bit_field_1 (47 samples, 0.01%) + + +libc.so.1`mutex_lock_impl (84 samples, 0.02%) + + +mysqld`ha_innobase::info_low (95 samples, 0.03%) + + +mysqld`Item_cond_and::val_int (487 samples, 0.14%) + + +mysqld`dict_index_copy_rec_order_prefix (37 samples, 0.01%) + + +mysqld`row_search_for_mysql (4,158 samples, 1.19%) + + +mysqld`Arg_comparator::compare_e_string (897 samples, 0.26%) + + +mysqld`ut_dulint_cmp (54 samples, 0.02%) + + +mysqld`dict_index_copy_rec_order_prefix (95 samples, 0.03%) + + +mysqld`mtr_memo_pop_all (1,933 samples, 0.55%) + + +mysqld`handler::ha_index_init (222 samples, 0.06%) + + +mysqld`rec_offs_get_n_alloc (37 samples, 0.01%) + + +mysqld`Protocol_text::store (3,766 samples, 1.08%) + + +mysqld`row_sel_convert_mysql_key_to_innobase (41 samples, 0.01%) + + +mysqld`dict_field_get_col (89 samples, 0.03%) + + +mysqld`Field::is_null (57 samples, 0.02%) + + +mysqld`rec_init_offsets (42 samples, 0.01%) + + +mysqld`rec_get_nth_field_offs (566 samples, 0.16%) + + +mysqld`Field_long::val_str (438 samples, 0.13%) + + +mysqld`cmp_dtuple_rec_with_match (45 samples, 0.01%) + + +mysqld`dict_table_is_comp (119 samples, 0.03%) + + +mysqld`page_align (38 samples, 0.01%) + + +mysqld`Field_long::val_str (58 samples, 0.02%) + + +mysqld`rec_get_bit_field_1 (48 samples, 0.01%) + + +mysqld`rw_lock_get_writer (243 samples, 0.07%) + + +mysqld`row_mysql_store_true_var_len (966 samples, 0.28%) + + +mysqld`os_aio (142 samples, 0.04%) + + +mysqld`btr_estimate_n_rows_in_range (53 samples, 0.02%) + + +mysqld`buf_page_get_state (66 samples, 0.02%) + + +mysqld`do_field_decimal (119 samples, 0.03%) + + +mysqld`page_cur_move_to_next (80 samples, 0.02%) + + +mysqld`sel_restore_position_for_mysql (51 samples, 0.01%) + + +mysqld`row_search_for_mysql (82,472 samples, 23.67%) +mysqld`row_search_for_mysql + + +mysqld`rw_lock_x_lock_low (332 samples, 0.10%) + + +mysqld`rec_offs_n_fields (303 samples, 0.09%) + + +mysqld`Item_field::val_str (225 samples, 0.06%) + + +mysqld`find_field_in_table_ref (68 samples, 0.02%) + + +mysqld`base_list_iterator::base_list_iterator (97 samples, 0.03%) + + +mysqld`mem_heap_create_block (55 samples, 0.02%) + + +mysqld`row_sel_get_clust_rec_for_mysql (174 samples, 0.05%) + + +libc.so.1`mutex_lock_impl (47 samples, 0.01%) + + +mysqld`rec_get_status (983 samples, 0.28%) + + +mysqld`mtr_memo_slot_release (153 samples, 0.04%) + + +mysqld`QUICK_ROR_INTERSECT_SELECT::init_ror_merged_scan (39 samples, 0.01%) + + +mysqld`trx_assign_read_view (39 samples, 0.01%) + + +mysqld`mtr_s_lock_func (116 samples, 0.03%) + + +mysqld`rec_offs_n_fields (57 samples, 0.02%) + + +mysqld`buf_page_optimistic_get (59 samples, 0.02%) + + +mysqld`end_send_group (49 samples, 0.01%) + + +mysqld`QUICK_ROR_INTERSECT_SELECT::get_next (68 samples, 0.02%) + + +mysqld`mem_heap_create_func (73 samples, 0.02%) + + +mysqld`_mi_rec_unpack (57 samples, 0.02%) + + +mysqld`rec_init_offsets_comp_ordinary (567 samples, 0.16%) + + +mysqld`unlock_external (41 samples, 0.01%) + + +mysqld`Item_func_like::turboBM_matches (166 samples, 0.05%) + + +mysqld`row_sel_get_clust_rec_for_mysql (47 samples, 0.01%) + + +mysqld`handler::index_read_map (1,066 samples, 0.31%) + + +mysqld`rec_offs_nth_extern (2,094 samples, 0.60%) + + +mysqld`row_sel_try_search_shortcut_for_mysql (199 samples, 0.06%) + + +mysqld`my_net_write (598 samples, 0.17%) + + +mysqld`page_align (45 samples, 0.01%) + + +libc.so.1`_malloc_unlocked (111 samples, 0.03%) + + +mysqld`rec_get_bit_field_1 (895 samples, 0.26%) + + +mysqld`btr_pcur_restore_position_func (56 samples, 0.02%) + + +mysqld`lock_sec_rec_cons_read_sees (489 samples, 0.14%) + + +mysqld`filesort (108,672 samples, 31.19%) +mysqld`filesort + + +mysqld`mach_read_from_1 (41 samples, 0.01%) + + +mysqld`String::set_charset (44 samples, 0.01%) + + +mysqld`rec_get_offsets_func (1,756 samples, 0.50%) + + +mysqld`rec_get_bit_field_1 (61 samples, 0.02%) + + +mysqld`dispatch_command (341,699 samples, 98.07%) +mysqld`dispatch_command + + +mysqld`mutex_enter_func (40 samples, 0.01%) + + +mysqld`mach_read_from_1 (119 samples, 0.03%) + + +mysqld`row_sel_push_cache_row_for_mysql (6,733 samples, 1.93%) + + +all (348,427 samples, 100%) + + + +mysqld`btr_cur_optimistic_insert (274 samples, 0.08%) + + +mysqld`page_header_get_field (70 samples, 0.02%) + + +mysqld`que_thr_stop_for_mysql_no_error (65 samples, 0.02%) + + +mysqld`mutex_enter_func (51 samples, 0.01%) + + +mysqld`row_get_rec_trx_id (41 samples, 0.01%) + + +mysqld`Item::set_name (60 samples, 0.02%) + + +mysqld`build_equal_items_for_cond (44 samples, 0.01%) + + +mysqld`page_cur_search_with_match (173 samples, 0.05%) + + +mysqld`page_rec_get_next_const (42 samples, 0.01%) + + +mysqld`Arg_comparator::compare (1,020 samples, 0.29%) + + +mysqld`Item_cond_and::val_int (52 samples, 0.01%) + + +mysqld`dict_index_get_n_unique_in_tree (49 samples, 0.01%) + + +mysqld`page_header_get_field (41 samples, 0.01%) + + +mysqld`rw_lock_x_lock_func (254 samples, 0.07%) + + +mysqld`mem_heap_create_func (59 samples, 0.02%) + + +mysqld`QUICK_RANGE_SELECT::init_ror_merged_scan (38 samples, 0.01%) + + +mysqld`ut_align_down (61 samples, 0.02%) + + +mysqld`Item_func_in::val_int (90 samples, 0.03%) + + +mysqld`ha_innobase::index_read (65 samples, 0.02%) + + +mysqld`btr_page_split_and_insert (49 samples, 0.01%) + + +mysqld`page_cur_is_after_last (41 samples, 0.01%) + + +mysqld`Arg_comparator::compare_string (59 samples, 0.02%) + + +mysqld`mysql_parse (308,366 samples, 88.50%) +mysqld`mysql_parse + + +mysqld`Item::operator new (55 samples, 0.02%) + + +mysqld`btr_cur_add_path_info (56 samples, 0.02%) + + +mysqld`st_table::clear_column_bitmaps (39 samples, 0.01%) + + +mysqld`write_record (2,753 samples, 0.79%) + + +mysqld`get_func_mm_tree (62 samples, 0.02%) + + +mysqld`page_align (77 samples, 0.02%) + + +libc.so.1`_malloc_unlocked (123 samples, 0.04%) + + +mysqld`handler::read_range_first (300 samples, 0.09%) + + +mysqld`btr_pcur_store_position (139 samples, 0.04%) + + +mysqld`os_file_write (141 samples, 0.04%) + + +mysqld`btr_search_check_guess (122 samples, 0.04%) + + +mysqld`rec_get_bit_field_1 (50 samples, 0.01%) + + +mysqld`btr_page_get_index_id (227 samples, 0.07%) + + +mysqld`setup_wild (994 samples, 0.29%) + + +libc.so.1`__priocntlset (8,947 samples, 2.57%) +l.. + + +mysqld`lock_clust_rec_cons_read_sees (557 samples, 0.16%) + + +mysqld`create_tmp_field (117 samples, 0.03%) + + +mysqld`btr_pcur_move_backward_from_page (246 samples, 0.07%) + + +mysqld`rec_get_offsets_func (47 samples, 0.01%) + + +mysqld`check_quick_keys (59 samples, 0.02%) + + +mysqld`Arg_comparator::compare (169 samples, 0.05%) + + +mysqld`page_rec_get_next_low (228 samples, 0.07%) + + +mysqld`ha_myisam::rnd_pos (622 samples, 0.18%) + + +mysqld`row_sel_field_store_in_mysql_format (98 samples, 0.03%) + + +libc.so.1`memcpy (155 samples, 0.04%) + + +mysqld`build_template (156 samples, 0.04%) + + +mysqld`Sql_alloc::operator new (36 samples, 0.01%) + + +mysqld`ha_innobase::general_fetch (15,453 samples, 4.44%) +mysq.. + + +mysqld`Field_tiny::val_int (122 samples, 0.04%) + + +mysqld`rec_init_offsets (39 samples, 0.01%) + + +mysqld`os_file_pwrite (141 samples, 0.04%) + + +mysqld`page_rec_is_infimum_low (52 samples, 0.01%) + + +mysqld`build_template (115 samples, 0.03%) + + +mysqld`page_rec_get_next_const (96 samples, 0.03%) + + +mysqld`build_template (169 samples, 0.05%) + + +mysqld`cmp_dtuple_rec_with_match (137 samples, 0.04%) + + +libc.so.1`lstat (110 samples, 0.03%) + + +mysqld`lock_sec_rec_cons_read_sees (40 samples, 0.01%) + + +mysqld`Item_bool_func2::Item_bool_func2 (46 samples, 0.01%) + + +mysqld`get_mm_tree (445 samples, 0.13%) + + +mysqld`rw_lock_s_lock_low (254 samples, 0.07%) + + +mysqld`row_sel_field_store_in_mysql_format (39 samples, 0.01%) + + +mysqld`btr_search_info_update_slow (39 samples, 0.01%) + + +mysqld`btr_search_get_info (42 samples, 0.01%) + + +mysqld`Arg_comparator::compare (37 samples, 0.01%) + + +mysqld`cmp_dtuple_rec_with_match (77 samples, 0.02%) + + +mysqld`buf_page_get_mutex_enter (39 samples, 0.01%) + + +mysqld`row_upd_sec_step (291 samples, 0.08%) + + +mysqld`_current_thd (94 samples, 0.03%) + + +mysqld`mysql_unlock_tables (99 samples, 0.03%) + + +mysqld`rec_get_status (77 samples, 0.02%) + + +mysqld`rec_get_offsets_func (91 samples, 0.03%) + + +mysqld`mem_area_alloc (256 samples, 0.07%) + + +mysqld`rec_get_offsets_func (391 samples, 0.11%) + + +mysqld`Item_field::val_int (136 samples, 0.04%) + + +mysqld`row_sel_store_mysql_rec (36 samples, 0.01%) + + +mysqld`my_strcasecmp_utf8 (81 samples, 0.02%) + + +mysqld`init_alloc_root (200 samples, 0.06%) + + +mysqld`dyn_array_push (103 samples, 0.03%) + + +libc.so.1`free (59 samples, 0.02%) + + +mysqld`rec_init_offsets (784 samples, 0.23%) + + +mysqld`substitute_for_best_equal_field (487 samples, 0.14%) + + +mysqld`row_sel_get_clust_rec_for_mysql (313 samples, 0.09%) + + +mysqld`dict_field_get_col (37 samples, 0.01%) + + +mysqld`mtr_memo_pop_all (54 samples, 0.02%) + + +mysqld`ut_fold_ulint_pair (104 samples, 0.03%) + + +libc.so.1`mutex_unlock (56 samples, 0.02%) + + +mysqld`Item_cond_and::val_int (4,852 samples, 1.39%) + + +mysqld`find_item_in_list (53 samples, 0.02%) + + +mysqld`buf_calc_page_new_checksum (756 samples, 0.22%) + + +mysqld`my_no_flags_free (54 samples, 0.02%) + + +mysqld`dict_index_get_n_unique_in_tree (160 samples, 0.05%) + + +mysqld`dyn_array_free (42 samples, 0.01%) + + +mysqld`rec_get_next_offs (208 samples, 0.06%) + + +mysqld`dict_index_get_n_fields (50 samples, 0.01%) + + +mysqld`page_check_dir (249 samples, 0.07%) + + +mysqld`copy_and_convert (99 samples, 0.03%) + + +libc.so.1`cleanfree (69 samples, 0.02%) + + +mysqld`mach_write_to_1 (57 samples, 0.02%) + + +mysqld`handler::ha_thd (96 samples, 0.03%) + + +mysqld`row_mysql_store_true_var_len (39 samples, 0.01%) + + +mysqld`Item::val_bool (62 samples, 0.02%) + + +mysqld`buf_page_get_state (58 samples, 0.02%) + + +mysqld`end_write (45 samples, 0.01%) + + +mysqld`rec_get_offsets_func (162 samples, 0.05%) + + +libc.so.1`__cond_wait (127 samples, 0.04%) + + +mysqld`Arg_comparator::compare (92 samples, 0.03%) + + +mysqld`mutex_enter_func (191 samples, 0.05%) + + +libc.so.1`mutex_trylock_adaptive (52 samples, 0.01%) + + +mysqld`btr_compress (38 samples, 0.01%) + + +libc.so.1`memcpy (161 samples, 0.05%) + + +mysqld`row_sel_field_store_in_mysql_format (41 samples, 0.01%) + + +mysqld`sql_alloc (67 samples, 0.02%) + + +mysqld`get_func_mm_tree (79 samples, 0.02%) + + +mysqld`rw_lock_get_writer (476 samples, 0.14%) + + +mysqld`List_iterator_fast (46 samples, 0.01%) + + +mysqld`btr_pcur_move_to_next (127 samples, 0.04%) + + +mysqld`innobase_get_trx (210 samples, 0.06%) + + +mysqld`page_rec_get_next_low (49 samples, 0.01%) + + +mysqld`cmp_dtuple_rec_with_match (81 samples, 0.02%) + + +mysqld`Item_func_gt::val_int (231 samples, 0.07%) + + +mysqld`Query_arena::strdup (298 samples, 0.09%) + + +mysqld`dict_index_copy_types (37 samples, 0.01%) + + +mysqld`cmp_dtuple_rec (76 samples, 0.02%) + + +mysqld`Field_datetime::val_int (44 samples, 0.01%) + + +libc.so.1`lseek (128 samples, 0.04%) + + +mysqld`page_cur_search_with_match (42 samples, 0.01%) + + +mysqld`btr_pcur_move_to_prev (6,064 samples, 1.74%) + + +libc.so.1`memcpy (68 samples, 0.02%) + + +mysqld`mach_read_from_2 (63 samples, 0.02%) + + +mysqld`join_read_prev (85,340 samples, 24.49%) +mysqld`join_read_prev + + +mysqld`page_rec_get_next (542 samples, 0.16%) + + +mysqld`rec_get_status (145 samples, 0.04%) + + +mysqld`ha_innobase::index_next_same (84,001 samples, 24.11%) +mysqld`ha_innobase::index_next_.. + + +mysqld`ut_fold_ulint_pair (96 samples, 0.03%) + + +mysqld`btr_cur_search_to_nth_level (2,074 samples, 0.60%) + + +libc.so.1`cond_wait (127 samples, 0.04%) + + +mysqld`rec_init_offsets (770 samples, 0.22%) + + +mysqld`rec_get_offsets_func (44 samples, 0.01%) + + +mysqld`page_cur_search_with_match (2,996 samples, 0.86%) + + +mysqld`rec_offs_nth_extern (115 samples, 0.03%) + + +mysqld`btr_cur_get_block (45 samples, 0.01%) + + +libc.so.1`memcpy (187 samples, 0.05%) + + +mysqld`row_sel_get_clust_rec_for_mysql (104 samples, 0.03%) + + +mysqld`rec_get_offsets_func (40 samples, 0.01%) + + +mysqld`trx_undo_report_row_operation (72 samples, 0.02%) + + +libc.so.1`__write (79 samples, 0.02%) + + +mysqld`que_fork_get_first_thr (43 samples, 0.01%) + + +mysqld`btr_pcur_move_to_next_on_page (86 samples, 0.02%) + + +mysqld`ut_hash_ulint (117 samples, 0.03%) + + +mysqld`Item_func_le::val_int (1,022 samples, 0.29%) + + +mysqld`sel_restore_position_for_mysql (204 samples, 0.06%) + + +mysqld`dict_table_is_comp (47 samples, 0.01%) + + +mysqld`mem_area_alloc (45 samples, 0.01%) + + +mysqld`JOIN::join_free (74 samples, 0.02%) + + +mysqld`SQL_SELECT::test_quick_select (129 samples, 0.04%) + + +mysqld`mutex_exit (74 samples, 0.02%) + + +mysqld`make_char_array (2,161 samples, 0.62%) + + +mysqld`thd_to_trx (105 samples, 0.03%) + + +mysqld`vio_write (1,695 samples, 0.49%) + + +mysqld`page_rec_get_next (749 samples, 0.21%) + + +mysqld`buf_page_release (131 samples, 0.04%) + + +mysqld`row_sel_get_clust_rec_for_mysql (2,766 samples, 0.79%) + + +mysqld`rec_offs_n_fields (74 samples, 0.02%) + + +mysqld`row_sel_field_store_in_mysql_format (60 samples, 0.02%) + + +mysqld`rec_get_nth_field_offs (4,248 samples, 1.22%) + + +mysqld`buf_block_get_state (62 samples, 0.02%) + + +libc.so.1`_malloc_unlocked (119 samples, 0.03%) + + +libc.so.1`mutex_lock (122 samples, 0.04%) + + +mysqld`ha_innobase::store_key_val_for_row (927 samples, 0.27%) + + +mysqld`btr_search_guess_on_hash (115 samples, 0.03%) + + +mysqld`row_search_for_mysql (242 samples, 0.07%) + + +mysqld`rec_get_bit_field_1 (43 samples, 0.01%) + + +mysqld`mtr_memo_push (172 samples, 0.05%) + + +mysqld`page_cur_move_to_next (40 samples, 0.01%) + + +libc.so.1`resolvepath (52 samples, 0.01%) + + +libc.so.1`__pwrite (61 samples, 0.02%) + + +mysqld`ut_min (36 samples, 0.01%) + + +mysqld`net_write_buff (87 samples, 0.02%) + + +mysqld`Protocol_text::store (40 samples, 0.01%) + + +mysqld`String::length (62 samples, 0.02%) + + +mysqld`mysql_prepare_insert (103 samples, 0.03%) + + +mysqld`page_cur_search_with_match (41 samples, 0.01%) + + +mysqld`ha_innobase::index_read (766 samples, 0.22%) + + +mysqld`thd_to_trx (37 samples, 0.01%) + + +mysqld`sync_array_print_long_waits (63 samples, 0.02%) + + +mysqld`ha_innobase::change_active_index (214 samples, 0.06%) + + +mysqld`btr_pcur_is_after_last_on_page (194 samples, 0.06%) + + +mysqld`my_write (80 samples, 0.02%) + + +mysqld`row_sel_store_mysql_rec (152 samples, 0.04%) + + +mysqld`rec_get_offsets_func (89 samples, 0.03%) + + +mysqld`rw_lock_lock_word_decr (76 samples, 0.02%) + + +mysqld`free_tmp_table (535 samples, 0.15%) + + +mysqld`net_flush (121 samples, 0.03%) + + +mysqld`my_utf8_uni (441 samples, 0.13%) + + +mysqld`rec_get_status (105 samples, 0.03%) + + +mysqld`_my_b_read (189 samples, 0.05%) + + +mysqld`Item_func::fix_fields (417 samples, 0.12%) + + +mysqld`Field_iterator_table_ref::create_item (724 samples, 0.21%) + + +mysqld`rec_get_status (39 samples, 0.01%) + + +mysqld`page_cur_move_to_prev (5,331 samples, 1.53%) + + +mysqld`btr_cur_get_index (38 samples, 0.01%) + + +mysqld`mach_read_from_1 (477 samples, 0.14%) + + +mysqld`save_index (892 samples, 0.26%) + + +mysqld`mutex_enter_func (282 samples, 0.08%) + + +mysqld`rw_lock_s_unlock_func (501 samples, 0.14%) + + +mysqld`check_equality (216 samples, 0.06%) + + +mysqld`row_search_for_mysql (59 samples, 0.02%) + + +mysqld`handler::index_read_map (130 samples, 0.04%) + + +mysqld`rec_get_bit_field_1 (94 samples, 0.03%) + + +mysqld`Field_datetime::sort_string (64 samples, 0.02%) + + +mysqld`row_sel_get_clust_rec_for_mysql (126 samples, 0.04%) + + +mysqld`build_template (58 samples, 0.02%) + + +mysqld`Arg_comparator::compare_int_signed (272 samples, 0.08%) + + +mysqld`cmp_dtuple_rec_with_match (102 samples, 0.03%) + + +mysqld`btr_pcur_move_to_next_on_page (43 samples, 0.01%) + + +mysqld`Arg_comparator::compare_int_signed (289 samples, 0.08%) + + +libc.so.1`__read (45 samples, 0.01%) + + +mysqld`Field_new_decimal::val_decimal (40 samples, 0.01%) + + +mysqld`Item_func_eq::val_int (51 samples, 0.01%) + + +mysqld`Item_field::result_as_longlong (42 samples, 0.01%) + + +mysqld`row_search_for_mysql (256 samples, 0.07%) + + +mysqld`rw_lock_s_lock_low (961 samples, 0.28%) + + +mysqld`row_sel_field_store_in_mysql_format (64 samples, 0.02%) + + +mysqld`row_upd_step (41 samples, 0.01%) + + +mysqld`add_key_fields (141 samples, 0.04%) + + +mysqld`mem_heap_alloc (42 samples, 0.01%) + + +mysqld`join_read_always_key (2,558 samples, 0.73%) + + +mysqld`Item_field::send (162 samples, 0.05%) + + +mysqld`Arg_comparator::compare_string (627 samples, 0.18%) + + +mysqld`btr_pcur_open_with_no_init_func (307 samples, 0.09%) + + +mysqld`cmp_dtuple_rec (90 samples, 0.03%) + + +mysqld`_increment_page_get_statistics (111 samples, 0.03%) + + +mysqld`Item_cond_or::val_int (101 samples, 0.03%) + + +mysqld`join_read_always_key (113 samples, 0.03%) + + +mysqld`mem_heap_create_block (117 samples, 0.03%) + + +mysqld`do_field_string (547 samples, 0.16%) + + +mysqld`dict_index_get_nth_field_pos (249 samples, 0.07%) + + +mysqld`row_sel_get_clust_rec_for_mysql (43 samples, 0.01%) + + +mysqld`rec_get_bit_field_1 (91 samples, 0.03%) + + +mysqld`mutex_get_waiters (36 samples, 0.01%) + + +mysqld`page_rec_is_comp (159 samples, 0.05%) + + +mysqld`btr_search_update_hash_ref (955 samples, 0.27%) + + +mysqld`row_search_for_mysql (1,534 samples, 0.44%) + + +mysqld`mach_read_from_2 (65 samples, 0.02%) + + +libc.so.1`atomic_swap_8 (216 samples, 0.06%) + + +libc.so.1`pthread_getspecific (59 samples, 0.02%) + + +libc.so.1`memcpy (39 samples, 0.01%) + + +mysqld`Arg_comparator::compare_datetime (954 samples, 0.27%) + + +mysqld`page_rec_is_comp (58 samples, 0.02%) + + +mysqld`btr_search_info_update_hash (84 samples, 0.02%) + + +mysqld`execute_sqlcom_select (298,819 samples, 85.76%) +mysqld`execute_sqlcom_select + + +mysqld`thd_opt_slow_log (43 samples, 0.01%) + + +mysqld`Item::val_bool (101 samples, 0.03%) + + +mysqld`mutex_test_and_set (36 samples, 0.01%) + + +mysqld`row_search_for_mysql (843 samples, 0.24%) + + +mysqld`create_tmp_field_from_field (86 samples, 0.02%) + + +mysqld`Item_cond_or::val_int (434 samples, 0.12%) + + +mysqld`page_cmp_dtuple_rec_with_match (54 samples, 0.02%) + + +mysqld`page_rec_get_next_low (305 samples, 0.09%) + + +mysqld`vio_write (49 samples, 0.01%) + + +mysqld`dict_table_is_comp (87 samples, 0.02%) + + +mysqld`rec_get_offsets_func (1,573 samples, 0.45%) + + +mysqld`dyn_array_get_data_size (58 samples, 0.02%) + + +mysqld`my_read (45 samples, 0.01%) + + +mysqld`Arg_comparator::compare (306 samples, 0.09%) + + +mysqld`que_fork_get_first_thr (45 samples, 0.01%) + + +mysqld`btr_pcur_move_to_next_page (47 samples, 0.01%) + + +mysqld`rec_get_offsets_func (104 samples, 0.03%) + + +mysqld`row_undo (561 samples, 0.16%) + + +mysqld`init_io_cache (41 samples, 0.01%) + + +mysqld`page_copy_rec_list_end_no_locks (56 samples, 0.02%) + + +mysqld`open_tmp_table (533 samples, 0.15%) + + +mysqld`page_align (79 samples, 0.02%) + + +mysqld`Item_cond_and::val_int (64 samples, 0.02%) + + +mysqld`rw_lock_s_unlock_func (44 samples, 0.01%) + + +mysqld`Item_field::val_int (73 samples, 0.02%) + + +mysqld`build_template (73 samples, 0.02%) + + +mysqld`Protocol_text::store (155 samples, 0.04%) + + +mysqld`base_list_iterator::next_fast (143 samples, 0.04%) + + +mysqld`page_rec_get_n_recs_before (505 samples, 0.14%) + + +mysqld`btr_cur_search_to_nth_level (341 samples, 0.10%) + + +mysqld`cmp_dtuple_rec_with_match (49 samples, 0.01%) + + +mysqld`thd_ha_data (123 samples, 0.04%) + + +mysqld`Field::val_str (1,128 samples, 0.32%) + + +mysqld`rec_get_offsets_func (172 samples, 0.05%) + + +libc.so.1`atomic_add_64_nv (46 samples, 0.01%) + + +libc.so.1`unlink (179 samples, 0.05%) + + +mysqld`rec_get_bit_field_1 (57 samples, 0.02%) + + +mysqld`handler::read_multi_range_next (4,251 samples, 1.22%) + + +mysqld`lock_clust_rec_cons_read_sees (66 samples, 0.02%) + + +mysqld`buf_page_optimistic_get (3,261 samples, 0.94%) + + +mysqld`btr_cur_ins_lock_and_undo (84 samples, 0.02%) + + +mysqld`base_list_iterator::next_fast (122 samples, 0.04%) + + +mysqld`rw_lock_s_lock_low (242 samples, 0.07%) + + +mysqld`mach_read_from_1 (84 samples, 0.02%) + + +mysqld`dict_col_copy_type (195 samples, 0.06%) + + +mysqld`rec_init_offsets (91 samples, 0.03%) + + +mysqld`handler::read_range_first (364 samples, 0.10%) + + +mysqld`rec_get_n_owned_new (60 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (79 samples, 0.02%) + + +mysqld`ha_innobase::records_in_range (379 samples, 0.11%) + + +mysqld`buf_page_release (1,625 samples, 0.47%) + + +mysqld`btr_cur_pessimistic_delete (42 samples, 0.01%) + + +mysqld`rec_get_next_offs (129 samples, 0.04%) + + +mysqld`btr_pcur_restore_position_func (355 samples, 0.10%) + + +mysqld`handler::read_range_next (749 samples, 0.21%) + + +mysqld`free_tmp_table (66 samples, 0.02%) + + +mysqld`rec_offs_n_fields (84 samples, 0.02%) + + +mysqld`btr_search_guess_on_hash (56 samples, 0.02%) + + +mysqld`ha_innobase::rnd_next (412 samples, 0.12%) + + +mysqld`my_vsnprintf (51 samples, 0.01%) + + +mysqld`btr_pcur_store_position (56 samples, 0.02%) + + +mysqld`mi_delete_table (47 samples, 0.01%) + + +mysqld`page_rec_get_n_recs_before (114 samples, 0.03%) + + +mysqld`innodb_srv_conc_exit_innodb (45 samples, 0.01%) + + +mysqld`trx_purge_fetch_next_rec (41 samples, 0.01%) + + +mysqld`make_join_readinfo (76 samples, 0.02%) + + +mysqld`Item_cond_and::val_int (115 samples, 0.03%) + + +mysqld`buf_page_get_gen (53 samples, 0.02%) + + +mysqld`btr_pcur_get_block (49 samples, 0.01%) + + +libc.so.1`atomic_swap_8 (63 samples, 0.02%) + + +mysqld`net_store_length (45 samples, 0.01%) + + +mysqld`rec_init_offsets (18,395 samples, 5.28%) +mysql.. + + +libc.so.1`__read (174 samples, 0.05%) + + +mysqld`ha_innobase::index_init (42 samples, 0.01%) + + +mysqld`create_tmp_table (1,867 samples, 0.54%) + + +mysqld`ut_pair_min (197 samples, 0.06%) + + +mysqld`rec_init_offsets (37 samples, 0.01%) + + +mysqld`free_root (46 samples, 0.01%) + + +mysqld`_mi_read_rnd_dynamic_record (62 samples, 0.02%) + + +mysqld`Field_long::val_int (81 samples, 0.02%) + + +mysqld`rw_lock_s_unlock_func (219 samples, 0.06%) + + +mysqld`rec_init_offsets (60 samples, 0.02%) + + +mysqld`page_cur_search_with_match (242 samples, 0.07%) + + +mysqld`ha_innobase::general_fetch (724 samples, 0.21%) + + +mysqld`page_rec_get_n_recs_before (164 samples, 0.05%) + + +mysqld`row_sel_pop_cached_row_for_mysql (125 samples, 0.04%) + + +mysqld`Diagnostics_area::is_error (77 samples, 0.02%) + + +mysqld`rw_lock_x_lock_low (117 samples, 0.03%) + + +mysqld`List_iterator_fast (37 samples, 0.01%) + + +mysqld`Item_func_ne::val_int (104 samples, 0.03%) + + +mysqld`btr_search_guess_on_hash (19,281 samples, 5.53%) +mysql.. + + +mysqld`Item_bool_func2::fix_length_and_dec (46 samples, 0.01%) + + +mysqld`handler::index_read_map (770 samples, 0.22%) + + +mysqld`trx_start_low (66 samples, 0.02%) + + +mysqld`mtr_memo_pop_all (42 samples, 0.01%) + + +mysqld`buf_page_release (137 samples, 0.04%) + + +mysqld`trx_purge (287 samples, 0.08%) + + +libc.so.1`pthread_getschedparam (10,011 samples, 2.87%) +l.. + + +mysqld`rec_get_offsets_func (119 samples, 0.03%) + + +mysqld`btr_cur_search_to_nth_level (134 samples, 0.04%) + + +libc.so.1`realfree (57 samples, 0.02%) + + +mysqld`SQL_SELECT::test_quick_select (8,247 samples, 2.37%) +m.. + + +mysqld`Item_field::is_null (38 samples, 0.01%) + + +mysqld`btr_pcur_move_to_next (153 samples, 0.04%) + + +mysqld`String::set_charset (52 samples, 0.01%) + + +mysqld`Item::val_bool_result (4,868 samples, 1.40%) + + +mysqld`page_align (40 samples, 0.01%) + + +mysqld`ut_delay (70 samples, 0.02%) + + +mysqld`rec_copy_prefix_to_buf (789 samples, 0.23%) + + +mysqld`mem_heap_create_block (37 samples, 0.01%) + + +mysqld`Arg_comparator::compare_string (1,156 samples, 0.33%) + + +mysqld`dyn_array_get_element (146 samples, 0.04%) + + +mysqld`_my_b_write (251 samples, 0.07%) + + +mysqld`cmp_dtuple_rec_with_match (167 samples, 0.05%) + + +mysqld`Item_equal::compare_const (41 samples, 0.01%) + + +mysqld`THD::is_error (59 samples, 0.02%) + + +mysqld`rec_get_bit_field_1 (53 samples, 0.02%) + + +mysqld`trx_undo_report_row_operation (62 samples, 0.02%) + + +mysqld`page_dir_get_n_slots (42 samples, 0.01%) + + +mysqld`btr_pcur_get_block (49 samples, 0.01%) + + +mysqld`page_rec_is_infimum (114 samples, 0.03%) + + +mysqld`trx_prepare_off_kernel (410 samples, 0.12%) + + +mysqld`lock_clust_rec_cons_read_sees (62 samples, 0.02%) + + +mysqld`page_align (62 samples, 0.02%) + + +mysqld`ut_fold_binary (47 samples, 0.01%) + + +mysqld`lock_clust_rec_cons_read_sees (473 samples, 0.14%) + + +mysqld`Item_cond_or::val_int (85 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (1,231 samples, 0.35%) + + +mysqld`rec_get_nth_field_offs (97 samples, 0.03%) + + +mysqld`my_strnncollsp_simple (47 samples, 0.01%) + + +mysqld`mtr_commit (140 samples, 0.04%) + + +libc.so.1`malloc (42 samples, 0.01%) + + +mysqld`rec_init_offsets (3,370 samples, 0.97%) + + +libc.so.1`memcpy (129 samples, 0.04%) + + +mysqld`mysql_handle_derived (5,395 samples, 1.55%) + + +mysqld`rec_init_offsets (126 samples, 0.04%) + + +mysqld`row_sel_push_cache_row_for_mysql (66 samples, 0.02%) + + +mysqld`mem_heap_block_free (65 samples, 0.02%) + + +mysqld`mtr_s_lock_func (69 samples, 0.02%) + + +mysqld`ha_innobase::position (1,540 samples, 0.44%) + + +mysqld`mtr_memo_slot_release (38 samples, 0.01%) + + +mysqld`dict_table_is_comp (66 samples, 0.02%) + + +mysqld`Item_func_eq::Item_func_eq (57 samples, 0.02%) + + +libc.so.1`atomic_cas_64 (41 samples, 0.01%) + + +mysqld`Item_cond_or::val_int (63 samples, 0.02%) + + +mysqld`Lex_input_stream::start_token (48 samples, 0.01%) + + +mysqld`Item::val_bool (41 samples, 0.01%) + + +mysqld`Item_equal::update_const (69 samples, 0.02%) + + +mysqld`dict_index_get_n_unique (54 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (232 samples, 0.07%) + + +mysqld`Item_cond_and::val_int (75 samples, 0.02%) + + +mysqld`ut_fold_dulint (108 samples, 0.03%) + + +mysqld`add_group_and_distinct_keys (73 samples, 0.02%) + + +mysqld`rec_get_bit_field_1 (83 samples, 0.02%) + + +mysqld`row_sel_pop_cached_row_for_mysql (93 samples, 0.03%) + + +mysqld`os_file_write (117 samples, 0.03%) + + +mysqld`Field::is_null (47 samples, 0.01%) + + +mysqld`page_cur_search_with_match (115 samples, 0.03%) + + +mysqld`page_align (66 samples, 0.02%) + + +mysqld`dict_table_is_comp (57 samples, 0.02%) + + +mysqld`page_header_get_field (52 samples, 0.01%) + + +mysqld`ha_innobase::update_row (44 samples, 0.01%) + + +mysqld`ha_innobase::index_read (293 samples, 0.08%) + + +mysqld`best_extension_by_limited_search (99 samples, 0.03%) + + +mysqld`JOIN::init (37 samples, 0.01%) + + +mysqld`rec_init_offsets_comp_ordinary (49 samples, 0.01%) + + +mysqld`fn_format (105 samples, 0.03%) + + +mysqld`Item_cond_and::val_int (8,929 samples, 2.56%) +m.. + + +mysqld`dtuple_get_info_bits (64 samples, 0.02%) + + +mysqld`page_offset (36 samples, 0.01%) + + +mysqld`String::free (36 samples, 0.01%) + + +mysqld`rec_get_nth_field_offs (140 samples, 0.04%) + + +mysqld`Item_bool_rowready_func2::Item_bool_rowready_func2 (53 samples, 0.02%) + + +mysqld`page_rec_get_next_const (187 samples, 0.05%) + + +libc.so.1`mutex_trylock_adaptive (74 samples, 0.02%) + + +mysqld`btr_estimate_n_rows_in_range (660 samples, 0.19%) + + +mysqld`row_mysql_store_true_var_len (76 samples, 0.02%) + + +mysqld`join_init_read_record (1,881 samples, 0.54%) + + +mysqld`rec_init_offsets (37 samples, 0.01%) + + +mysqld`mtr_commit (131 samples, 0.04%) + + +mysqld`btr_search_guess_on_hash (41 samples, 0.01%) + + +mysqld`row_mysql_handle_errors (617 samples, 0.18%) + + +mysqld`btr_pcur_store_position (62 samples, 0.02%) + + +mysqld`my_b_flush_io_cache (245 samples, 0.07%) + + +mysqld`btr_search_update_hash_ref (229 samples, 0.07%) + + +mysqld`rec_init_offsets (61 samples, 0.02%) + + +mysqld`dict_index_get_nth_field_pos (222 samples, 0.06%) + + +mysqld`ha_innobase::records_in_range (193 samples, 0.06%) + + +mysqld`Field::real_type (48 samples, 0.01%) + + +mysqld`handler::index_read_idx_map (310 samples, 0.09%) + + +mysqld`btr_pcur_open_with_no_init_func (50 samples, 0.01%) + + +mysqld`rec_init_offsets (37 samples, 0.01%) + + +mysqld`my_no_flags_free (61 samples, 0.02%) + + +mysqld`mtr_commit (50 samples, 0.01%) + + +mysqld`buf_page_set_accessed_make_young (274 samples, 0.08%) + + +mysqld`rec_get_bit_field_1 (51 samples, 0.01%) + + +mysqld`Query_arena::free_items (473 samples, 0.14%) + + +mysqld`handler::ha_thd (52 samples, 0.01%) + + +mysqld`thd_to_trx (150 samples, 0.04%) + + +mysqld`rw_lock_s_lock_func (69 samples, 0.02%) + + +mysqld`ha_innobase::index_init (89 samples, 0.03%) + + +mysqld`page_is_comp (53 samples, 0.02%) + + +mysqld`page_dir_slot_get_rec (121 samples, 0.03%) + + +mysqld`page_cur_insert_rec_low (48 samples, 0.01%) + + +mysqld`rec_get_offsets_func (128 samples, 0.04%) + + +mysqld`my_uni_utf8 (51 samples, 0.01%) + + +mysqld`page_cmp_dtuple_rec_with_match (213 samples, 0.06%) + + +mysqld`page_cur_is_after_last (264 samples, 0.08%) + + +mysqld`btr_search_guess_on_hash (78 samples, 0.02%) + + +mysqld`dict_col_get_clust_pos (1,034 samples, 0.30%) + + +libc.so.1`_malloc_unlocked (43 samples, 0.01%) + + +mysqld`base_list_iterator::next_fast (152 samples, 0.04%) + + +mysqld`base_list::push_front (50 samples, 0.01%) + + +mysqld`rw_lock_get_writer (292 samples, 0.08%) + + +mysqld`page_offset (43 samples, 0.01%) + + +mysqld`String::length (56 samples, 0.02%) + + +mysqld`page_rec_is_supremum (83 samples, 0.02%) + + +mysqld`btr_estimate_n_rows_in_range (1,527 samples, 0.44%) + + +mysqld`Field::real_type (94 samples, 0.03%) + + +mysqld`Item_func_eq::val_int (49 samples, 0.01%) + + +mysqld`page_align (37 samples, 0.01%) + + +mysqld`rr_unlock_row (353 samples, 0.10%) + + +mysqld`Arg_comparator::set_cmp_func (71 samples, 0.02%) + + +libc.so.1`memcpy (390 samples, 0.11%) + + +mysqld`copy_fields (1,046 samples, 0.30%) + + +mysqld`page_rec_is_supremum (107 samples, 0.03%) + + +mysqld`row_undo_ins (525 samples, 0.15%) + + +mysqld`page_cur_search_with_match (74 samples, 0.02%) + + +mysqld`open_cached_file (48 samples, 0.01%) + + +mysqld`log_group_write_buf (116 samples, 0.03%) + + +mysqld`rec_get_bit_field_1 (44 samples, 0.01%) + + +mysqld`buf_page_get_gen (77 samples, 0.02%) + + +mysqld`Arg_comparator::compare (63 samples, 0.02%) + + +mysqld`page_rec_is_infimum_low (39 samples, 0.01%) + + +mysqld`THD::is_error (295 samples, 0.08%) + + +mysqld`ut_hash_ulint (113 samples, 0.03%) + + +mysqld`update_const_equal_items (74 samples, 0.02%) + + +mysqld`String::charset (42 samples, 0.01%) + + +mysqld`Item_field::set_field (95 samples, 0.03%) + + +mysqld`row_sel_pop_cached_row_for_mysql (76 samples, 0.02%) + + +mysqld`_mi_rec_pack (93 samples, 0.03%) + + +mysqld`page_header_get_field (92 samples, 0.03%) + + +mysqld`List_iterator_fast (475 samples, 0.14%) + + +mysqld`Arg_comparator::compare (321 samples, 0.09%) + + +mysqld`mach_read_from_8 (40 samples, 0.01%) + + +mysqld`Item_func_like::val_int (60 samples, 0.02%) + + +mysqld`page_header_get_field (164 samples, 0.05%) + + +mysqld`rec_offs_nth_extern (61 samples, 0.02%) + + +mysqld`ha_chain_get_first (65 samples, 0.02%) + + +mysqld`cmp_dtuple_rec_with_match (292 samples, 0.08%) + + +mysqld`rw_lock_x_lock_wait (82 samples, 0.02%) + + +mysqld`store_key::copy (46 samples, 0.01%) + + +mysqld`subselect_indexsubquery_engine::exec (4,844 samples, 1.39%) + + +mysqld`net_real_write (204 samples, 0.06%) + + +mysqld`btr_pcur_move_to_next (66 samples, 0.02%) + + +mysqld`rec_init_offsets_comp_ordinary (59 samples, 0.02%) + + +mysqld`mtr_commit (36 samples, 0.01%) + + +mysqld`I_List_iterator (491 samples, 0.14%) + + +mysqld`page_is_comp (202 samples, 0.06%) + + +mysqld`rec_init_offsets_comp_ordinary (47 samples, 0.01%) + + +mysqld`row_sel_store_mysql_rec (38 samples, 0.01%) + + +mysqld`Item::set_name (134 samples, 0.04%) + + +mysqld`log_group_write_buf (344 samples, 0.10%) + + +mysqld`net_send_ok (151 samples, 0.04%) + + +mysqld`row_sel_push_cache_row_for_mysql (60 samples, 0.02%) + + +mysqld`rw_lock_s_unlock_func (81 samples, 0.02%) + + +mysqld`Item_func_isnotnull::val_int (118 samples, 0.03%) + + +mysqld`Query_arena::calloc (72 samples, 0.02%) + + +libc.so.1`memcpy (86 samples, 0.02%) + + +mysqld`store_key_item::store_key_item (48 samples, 0.01%) + + +mysqld`Lex_input_stream::yyPeek (39 samples, 0.01%) + + +mysqld`rec_get_next_offs (41 samples, 0.01%) + + +mysqld`dyn_array_get_data_size (56 samples, 0.02%) + + +mysqld`Field_long::val_int (221 samples, 0.06%) + + +mysqld`page_cur_search_with_match (106 samples, 0.03%) + + +mysqld`_mi_read_cache (200 samples, 0.06%) + + +mysqld`_increment_page_get_statistics (299 samples, 0.09%) + + +mysqld`Arg_comparator::compare_int_signed (86 samples, 0.02%) + + +mysqld`page_is_comp (125 samples, 0.04%) + + +mysqld`buf_page_peek_if_too_old (159 samples, 0.05%) + + +mysqld`row_sel_get_clust_rec_for_mysql (1,794 samples, 0.51%) + + +mysqld`check_table_name (47 samples, 0.01%) + + +mysqld`copy_and_convert (2,381 samples, 0.68%) + + +mysqld`ha_innobase::index_read (881 samples, 0.25%) + + +mysqld`dispatch_command (1,441 samples, 0.41%) + + +mysqld`btr_estimate_n_rows_in_range (172 samples, 0.05%) + + +mysqld`trx_start_if_not_started (84 samples, 0.02%) + + +mysqld`page_rec_get_next (76 samples, 0.02%) + + +mysqld`ptr_compare_3 (41 samples, 0.01%) + + +mysqld`Field_new_decimal::val_str (69 samples, 0.02%) + + +mysqld`base_list_iterator::init (68 samples, 0.02%) + + +mysqld`lock_sec_rec_cons_read_sees (68 samples, 0.02%) + + +mysqld`my_create (202 samples, 0.06%) + + +mysqld`btr_pcur_move_to_next_on_page (825 samples, 0.24%) + + +mysqld`btr_cur_search_to_nth_level (593 samples, 0.17%) + + +mysqld`end_trans (137 samples, 0.04%) + + +mysqld`Item::val_bool (2,504 samples, 0.72%) + + +mysqld`my_charset_same (62 samples, 0.02%) + + +mysqld`btr_pcur_get_low_match (44 samples, 0.01%) + + +mysqld`Arg_comparator::compare_int_signed (77 samples, 0.02%) + + +mysqld`ha_innobase::index_init (222 samples, 0.06%) + + +mysqld`dict_index_copy_rec_order_prefix (249 samples, 0.07%) + + +mysqld`btr_cur_search_to_nth_level (1,476 samples, 0.42%) + + +mysqld`btr_search_check_guess (274 samples, 0.08%) + + +mysqld`mtr_s_lock_func (60 samples, 0.02%) + + +mysqld`lock_tables (586 samples, 0.17%) + + +mysqld`dtuple_fold (863 samples, 0.25%) + + +mysqld`rec_offs_n_fields (52 samples, 0.01%) + + +mysqld`rec_get_offsets_func (70 samples, 0.02%) + + +mysqld`radixsort_for_str_ptr (512 samples, 0.15%) + + +mysqld`alloc_root (37 samples, 0.01%) + + +mysqld`get_datetime_value (52 samples, 0.01%) + + +mysqld`free_root (85 samples, 0.02%) + + +mysqld`page_get_n_recs (102 samples, 0.03%) + + +mysqld`ha_innobase::index_next (166 samples, 0.05%) + + +mysqld`Item_func_like::turboBM_matches (61 samples, 0.02%) + + +mysqld`rec_get_nth_field_offs (43 samples, 0.01%) + + +mysqld`dict_field_get_col (123 samples, 0.04%) + + +mysqld`btr_cur_search_to_nth_level (38 samples, 0.01%) + + +mysqld`btr_pcur_store_position (1,993 samples, 0.57%) + + +mysqld`lock_clust_rec_cons_read_sees (66 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (128 samples, 0.04%) + + +mysqld`btr_pcur_open_with_no_init_func (1,239 samples, 0.36%) + + +mysqld`vio_blocking (383 samples, 0.11%) + + +mysqld`ha_innobase::external_lock (50 samples, 0.01%) + + +mysqld`Field_num::make_field (56 samples, 0.02%) + + +mysqld`base_list_iterator::next_fast (68 samples, 0.02%) + + +mysqld`fill_used_fields_bitmap (38 samples, 0.01%) + + +mysqld`rec_offs_get_n_alloc (43 samples, 0.01%) + + +mysqld`ha_myisam::extra (268 samples, 0.08%) + + +mysqld`check_quick_keys (111 samples, 0.03%) + + +mysqld`get_mm_tree (298 samples, 0.09%) + + +mysqld`Item_field::result_as_longlong (64 samples, 0.02%) + + +libc.so.1`memset (125 samples, 0.04%) + + +mysqld`page_rec_get_next (58 samples, 0.02%) + + +mysqld`page_cur_tuple_insert (99 samples, 0.03%) + + +libc.so.1`__pwrite (136 samples, 0.04%) + + +mysqld`rec_get_status (68 samples, 0.02%) + + +libc.so.1`memcpy (49 samples, 0.01%) + + +mysqld`mutex_enter_func (144 samples, 0.04%) + + +mysqld`page_rec_get_next (41 samples, 0.01%) + + +mysqld`buf_page_set_accessed_make_young (45 samples, 0.01%) + + +mysqld`row_sel_store_mysql_rec (57 samples, 0.02%) + + +mysqld`Field_tiny::val_str (97 samples, 0.03%) + + +libc.so.1`_malloc_unlocked (62 samples, 0.02%) + + +mysqld`mi_extra (268 samples, 0.08%) + + +mysqld`sel_restore_position_for_mysql (79 samples, 0.02%) + + +mysqld`mi_open (467 samples, 0.13%) + + +mysqld`row_search_for_mysql (747 samples, 0.21%) + + +mysqld`cmp_dtuple_rec (36 samples, 0.01%) + + +mysqld`ha_innobase::index_next_same (740 samples, 0.21%) + + +mysqld`row_sel_store_mysql_rec (151 samples, 0.04%) + + +libc.so.1`pthread_cond_wait (128 samples, 0.04%) + + +mysqld`Item_func_le::val_int (41 samples, 0.01%) + + +mysqld`srv_master_thread (866 samples, 0.25%) + + +mysqld`row_search_for_mysql (122 samples, 0.04%) + + +mysqld`btr_search_guess_on_hash (51 samples, 0.01%) + + +mysqld`cmp_dtuple_rec_with_match (52 samples, 0.01%) + + +mysqld`dict_index_copy_rec_order_prefix (61 samples, 0.02%) + + +mysqld`btr_pcur_restore_position_func (3,901 samples, 1.12%) + + +mysqld`get_mm_leaf (92 samples, 0.03%) + + +mysqld`handler::index_read_map (479 samples, 0.14%) + + +mysqld`Field::is_null (39 samples, 0.01%) + + +mysqld`ut_dulint_create (36 samples, 0.01%) + + +libc.so.1`_thr_setparam (5,827 samples, 1.67%) + + +mysqld`row_sel_get_clust_rec_for_mysql (240 samples, 0.07%) + + +mysqld`row_sel_pop_cached_row_for_mysql (40 samples, 0.01%) + + +libc.so.1`pthread_rwlock_rdlock (57 samples, 0.02%) + + +mysqld`Arg_comparator::compare (1,323 samples, 0.38%) + + +mysqld`mem_heap_create_block (53 samples, 0.02%) + + +mysqld`buf_page_optimistic_get (157 samples, 0.05%) + + +mysqld`Item::val_bool (47 samples, 0.01%) + + +mysqld`sortcmp (85 samples, 0.02%) + + +mysqld`dict_table_is_comp (52 samples, 0.01%) + + +mysqld`mach_read_from_1 (49 samples, 0.01%) + + +mysqld`rec_init_offsets_comp_ordinary (335 samples, 0.10%) + + +mysqld`subselect_uniquesubquery_engine::copy_ref_key (54 samples, 0.02%) + + +mysqld`rec_get_deleted_flag (129 samples, 0.04%) + + +mysqld`_mi_get_block_info (317 samples, 0.09%) + + +mysqld`mach_read_from_2 (209 samples, 0.06%) + + +mysqld`rec_get_deleted_flag (88 samples, 0.03%) + + +mysqld`ha_insert_for_fold_func (170 samples, 0.05%) + + +mysqld`btr_search_guess_on_hash (12,933 samples, 3.71%) +mys.. + + +mysqld`dict_col_get_clust_pos (126 samples, 0.04%) + + +mysqld`rw_lock_get_writer (52 samples, 0.01%) + + +mysqld`check_table_access (139 samples, 0.04%) + + +mysqld`btr_pcur_restore_position_func (79 samples, 0.02%) + + +mysqld`rw_lock_s_lock_low (192 samples, 0.06%) + + +mysqld`net_write_buff (541 samples, 0.16%) + + +mysqld`page_header_get_field (63 samples, 0.02%) + + +mysqld`rw_lock_lock_word_decr (56 samples, 0.02%) + + +mysqld`_increment_page_get_statistics (326 samples, 0.09%) + + +mysqld`THD::is_error (105 samples, 0.03%) + + +mysqld`btr_pcur_open_with_no_init_func (87 samples, 0.02%) + + +mysqld`row_search_for_mysql (2,109 samples, 0.61%) + + +mysqld`trx_undo_assign_undo (37 samples, 0.01%) + + +mysqld`add_key_fields (94 samples, 0.03%) + + +mysqld`page_header_get_field (81 samples, 0.02%) + + +mysqld`mutex_test_and_set (37 samples, 0.01%) + + +mysqld`row_sel_push_cache_row_for_mysql (2,466 samples, 0.71%) + + +mysqld`btr_estimate_n_rows_in_range (43 samples, 0.01%) + + +mysqld`ha_innobase::change_active_index (227 samples, 0.07%) + + +libc.so.1`atomic_add_64_nv (36 samples, 0.01%) + + +mysqld`btr_pcur_store_position (436 samples, 0.13%) + + +mysqld`btr_pcur_restore_position_func (57 samples, 0.02%) + + +mysqld`Protocol::net_store_data (284 samples, 0.08%) + + +mysqld`mem_area_alloc (44 samples, 0.01%) + + +mysqld`Item_cond_and::val_int (1,874 samples, 0.54%) + + +mysqld`sel_restore_position_for_mysql (369 samples, 0.11%) + + +mysqld`rec_get_offsets_func (57 samples, 0.02%) + + +mysqld`dict_table_is_comp (39 samples, 0.01%) + + +mysqld`page_align (39 samples, 0.01%) + + +mysqld`thd_ha_data (74 samples, 0.02%) + + +mysqld`sub_select (4,542 samples, 1.30%) + + +libc.so.1`__priocntlset (5,714 samples, 1.64%) + + +mysqld`page_rec_get_prev_const (152 samples, 0.04%) + + +mysqld`my_no_flags_free (36 samples, 0.01%) + + +mysqld`dict_field_get_col (43 samples, 0.01%) + + +mysqld`rec_init_offsets (967 samples, 0.28%) + + +mysqld`rec_get_nth_field_offs (159 samples, 0.05%) + + +mysqld`row_sel_get_clust_rec_for_mysql (754 samples, 0.22%) + + +mysqld`btr_pcur_open_func (78 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (124 samples, 0.04%) + + +mysqld`Item::val_bool (515 samples, 0.15%) + + +mysqld`dyn_array_push (80 samples, 0.02%) + + +mysqld`buf_page_release (1,200 samples, 0.34%) + + +mysqld`rw_lock_s_lock_low (66 samples, 0.02%) + + +mysqld`buf_page_get_gen (38 samples, 0.01%) + + +mysqld`rec_offs_get_n_alloc (45 samples, 0.01%) + + +libc.so.1`malloc (92 samples, 0.03%) + + +mysqld`Arg_comparator::compare_string (44 samples, 0.01%) + + +libc.so.1`atomic_swap_8 (79 samples, 0.02%) + + +mysqld`rec_get_bit_field_1 (41 samples, 0.01%) + + +mysqld`rec_get_status (66 samples, 0.02%) + + +mysqld`join_read_key (919 samples, 0.26%) + + +mysqld`mem_area_free (39 samples, 0.01%) + + +libc.so.1`atomic_swap_8 (107 samples, 0.03%) + + +mysqld`log_group_write_buf (44 samples, 0.01%) + + +mysqld`row_sel_get_clust_rec_for_mysql (1,611 samples, 0.46%) + + +mysqld`rec_get_status (81 samples, 0.02%) + + +mysqld`trx_commit_off_kernel (85 samples, 0.02%) + + +mysqld`store_key::copy (47 samples, 0.01%) + + +mysqld`Item::val_bool (1,348 samples, 0.39%) + + +mysqld`rec_get_offsets_func (2,517 samples, 0.72%) + + +mysqld`ha_search_and_get_data (40 samples, 0.01%) + + +mysqld`Item_equal::Item_equal (78 samples, 0.02%) + + +mysqld`page_dir_slot_get_rec (44 samples, 0.01%) + + +mysqld`rec_get_status (63 samples, 0.02%) + + +mysqld`handler::ha_reset (53 samples, 0.02%) + + +mysqld`ha_innobase::records_in_range (535 samples, 0.15%) + + +mysqld`base_list_iterator::next_fast (223 samples, 0.06%) + + +mysqld`rec_offs_get_n_alloc (41 samples, 0.01%) + + +mysqld`rr_from_pointers (227 samples, 0.07%) + + +mysqld`ha_innobase::index_read (2,972 samples, 0.85%) + + +mysqld`get_hash_symbol (190 samples, 0.05%) + + +mysqld`sql_alloc (36 samples, 0.01%) + + +mysqld`buf_page_in_file (80 samples, 0.02%) + + +mysqld`my_wc_mb_latin1 (1,309 samples, 0.38%) + + +libc.so.1`atomic_swap_8 (42 samples, 0.01%) + + +mysqld`row_sel_field_store_in_mysql_format (879 samples, 0.25%) + + +mysqld`Field::is_null (77 samples, 0.02%) + + +mysqld`row_purge (287 samples, 0.08%) + + +mysqld`ha_search_and_get_data (160 samples, 0.05%) + + +mysqld`que_run_threads (599 samples, 0.17%) + + +mysqld`setup_fields (37 samples, 0.01%) + + +mysqld`make_cond_for_table (198 samples, 0.06%) + + +mysqld`rec_offs_n_fields (150 samples, 0.04%) + + +mysqld`rec_get_next_ptr_const (178 samples, 0.05%) + + +mysqld`List_iterator_fast (215 samples, 0.06%) + + +mysqld`handler::ha_index_init (43 samples, 0.01%) + + +mysqld`fill_record_n_invoke_before_triggers (47 samples, 0.01%) + + +mysqld`thr_get_trx (51 samples, 0.01%) + + +mysqld`rw_lock_s_lock_func (835 samples, 0.24%) + + +mysqld`buf_page_get_known_nowait (63 samples, 0.02%) + + +mysqld`btr_pcur_is_after_last_on_page (326 samples, 0.09%) + + +mysqld`cmp_dtuple_rec_with_match (42 samples, 0.01%) + + +mysqld`que_run_threads_low (287 samples, 0.08%) + + +mysqld`mtr_memo_slot_release (166 samples, 0.05%) + + +mysqld`Item::val_bool (51 samples, 0.01%) + + +mysqld`handler::read_multi_range_first (130 samples, 0.04%) + + +mysqld`rec_init_offsets_comp_ordinary (89 samples, 0.03%) + + +mysqld`dict_index_copy_types (36 samples, 0.01%) + + +mysqld`rec_offs_set_n_alloc (47 samples, 0.01%) + + +mysqld`Item::val_bool (4,815 samples, 1.38%) + + +mysqld`btr_cur_search_to_nth_level (38 samples, 0.01%) + + +mysqld`rec_offs_set_n_alloc (36 samples, 0.01%) + + +libc.so.1`malloc (96 samples, 0.03%) + + +mysqld`rw_lock_lock_word_decr (142 samples, 0.04%) + + +mysqld`rec_init_offsets_comp_ordinary (2,869 samples, 0.82%) + + +mysqld`page_rec_get_next_low (223 samples, 0.06%) + + +mysqld`rec_get_nth_field_offs (90 samples, 0.03%) + + +mysqld`rw_lock_lock_word_decr (81 samples, 0.02%) + + +mysqld`Item::val_bool (12,550 samples, 3.60%) +my.. + + +mysqld`Item::val_bool (97 samples, 0.03%) + + +mysqld`rec_get_next_offs (379 samples, 0.11%) + + +mysqld`btr_cur_search_to_nth_level (1,205 samples, 0.35%) + + +mysqld`page_cur_is_before_first (210 samples, 0.06%) + + +mysqld`create_ref_for_key (44 samples, 0.01%) + + +mysqld`ha_innobase::rnd_next (4,249 samples, 1.22%) + + +mysqld`page_cur_move_to_next (778 samples, 0.22%) + + +mysqld`ha_search_and_get_data (2,169 samples, 0.62%) + + +mysqld`update_const_equal_items (134 samples, 0.04%) + + +mysqld`rec_init_offsets_comp_ordinary (157 samples, 0.05%) + + +mysqld`mtr_memo_release (49 samples, 0.01%) + + +mysqld`row_sel_field_store_in_mysql_format (40 samples, 0.01%) + + +mysqld`Arg_comparator::compare (37 samples, 0.01%) + + +mysqld`get_key_scans_params (113 samples, 0.03%) + + +mysqld`get_full_func_mm_tree (64 samples, 0.02%) + + +mysqld`ha_innobase::index_read (1,585 samples, 0.45%) + + +mysqld`mtr_commit (44 samples, 0.01%) + + +mysqld`base_list_iterator::base_list_iterator (64 samples, 0.02%) + + +mysqld`Item_field::is_null (57 samples, 0.02%) + + +mysqld`Item_field::val_int (44 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (86 samples, 0.02%) + + +mysqld`Item_field::val_int (83 samples, 0.02%) + + +mysqld`my_read (181 samples, 0.05%) + + +libc.so.1`malloc (71 samples, 0.02%) + + +mysqld`ha_innobase::general_fetch (2,638 samples, 0.76%) + + +mysqld`rec_init_offsets_comp_ordinary (132 samples, 0.04%) + + +mysqld`page_dir_slot_get_rec (228 samples, 0.07%) + + +mysqld`page_cur_search_with_match (563 samples, 0.16%) + + +mysqld`String::copy (2,910 samples, 0.84%) + + +mysqld`String::~String (39 samples, 0.01%) + + +mysqld`rec_get_offsets_func (71 samples, 0.02%) + + +mysqld`read_view_sees_trx_id (95 samples, 0.03%) + + +mysqld`ha_innobase::index_read (359 samples, 0.10%) + + +mysqld`buf_block_get_state (76 samples, 0.02%) + + +mysqld`Item_field::val_int (141 samples, 0.04%) + + +mysqld`buf_page_get_gen (150 samples, 0.04%) + + +mysqld`page_rec_get_next_const (48 samples, 0.01%) + + +mysqld`rec_init_offsets (519 samples, 0.15%) + + +mysqld`page_rec_is_infimum (81 samples, 0.02%) + + +mysqld`String::set (165 samples, 0.05%) + + +libc.so.1`__write (137 samples, 0.04%) + + +mysqld`List_iterator_fast (265 samples, 0.08%) + + +mysqld`String::set (45 samples, 0.01%) + + +mysqld`ut_align_down (39 samples, 0.01%) + + +libc.so.1`strlen (129 samples, 0.04%) + + +mysqld`rec_init_offsets (1,045 samples, 0.30%) + + +mysqld`Item_ident::Item_ident (86 samples, 0.02%) + + +mysqld`String::ptr (72 samples, 0.02%) + + +mysqld`ha_innobase::general_fetch (1,358 samples, 0.39%) + + +mysqld`thd_ha_data (84 samples, 0.02%) + + +mysqld`row_sel_get_clust_rec_for_mysql (54,675 samples, 15.69%) +mysqld`row_sel_get_.. + + +mysqld`dyn_array_get_data_size (51 samples, 0.01%) + + +mysqld`ha_myisam::delete_table (48 samples, 0.01%) + + +mysqld`trx_commit_for_mysql (87 samples, 0.02%) + + +mysqld`base_list_iterator::after (83 samples, 0.02%) + + +libc.so.1`__time (117 samples, 0.03%) + + +mysqld`row_search_for_mysql (4,896 samples, 1.41%) + + +mysqld`base_list_iterator::base_list_iterator (75 samples, 0.02%) + + +mysqld`mach_read_from_4 (41 samples, 0.01%) + + +mysqld`cmp_dtuple_rec_with_match (72 samples, 0.02%) + + +mysqld`page_dir_get_n_slots (84 samples, 0.02%) + + +mysqld`mtr_memo_pop_all (42 samples, 0.01%) + + +mysqld`cmp_dtuple_rec_with_match (179 samples, 0.05%) + + +mysqld`row_sel_store_mysql_rec (1,228 samples, 0.35%) + + +mysqld`Arg_comparator::compare (65 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (85 samples, 0.02%) + + +mysqld`dyn_array_get_element (138 samples, 0.04%) + + +mysqld`btr_pcur_move_to_next_on_page (36 samples, 0.01%) + + +mysqld`QUICK_RANGE_SELECT::reset (90 samples, 0.03%) + + +mysqld`row_sel_pop_cached_row_for_mysql (525 samples, 0.15%) + + +mysqld`ut_hash_ulint (177 samples, 0.05%) + + +mysqld`log_slow_statement (114 samples, 0.03%) + + +mysqld`row_mysql_store_true_var_len (82 samples, 0.02%) + + +mysqld`buf_page_optimistic_get (37 samples, 0.01%) + + +mysqld`Item_func_isnotnull::val_int (84 samples, 0.02%) + + +mysqld`net_flush (1,760 samples, 0.51%) + + +mysqld`btr_cur_search_to_nth_level (1,029 samples, 0.30%) + + +mysqld`btr_pcur_open_with_no_init_func (194 samples, 0.06%) + + +mysqld`btr_cur_add_path_info (537 samples, 0.15%) + + +mysqld`rr_from_pointers (3,221 samples, 0.92%) + + +mysqld`rec_get_offsets_func (115 samples, 0.03%) + + +mysqld`alloc_root (102 samples, 0.03%) + + +mysqld`my_malloc (196 samples, 0.06%) + + +mysqld`rw_lock_s_unlock_func (54 samples, 0.02%) + + +mysqld`page_cur_search_with_match (94 samples, 0.03%) + + +mysqld`dict_table_is_comp (49 samples, 0.01%) + + +mysqld`vio_read (1,984 samples, 0.57%) + + +mysqld`buf_block_get_modify_clock (57 samples, 0.02%) + + +mysqld`buf_page_get_gen (39 samples, 0.01%) + + +mysqld`get_schema_tables_result (210 samples, 0.06%) + + +mysqld`get_all_tables (208 samples, 0.06%) + + +mysqld`mach_read_from_2 (44 samples, 0.01%) + + +mysqld`btr_pcur_get_rec (36 samples, 0.01%) + + +mysqld`page_offset (46 samples, 0.01%) + + +mysqld`mach_read_from_4 (139 samples, 0.04%) + + +mysqld`ha_innobase::index_prev (85,141 samples, 24.44%) +mysqld`ha_innobase::index_prev + + +mysqld`page_cmp_dtuple_rec_with_match (40 samples, 0.01%) + + +mysqld`_mi_write_blob_record (115 samples, 0.03%) + + +mysqld`Item_equal::update_const (48 samples, 0.01%) + + +mysqld`setup_tables (94 samples, 0.03%) + + +libc.so.1`memcpy (2,412 samples, 0.69%) + + +mysqld`sortcmp (41 samples, 0.01%) + + +mysqld`row_undo_ins_remove_clust_rec (159 samples, 0.05%) + + +mysqld`rec_get_bit_field_1 (69 samples, 0.02%) + + +mysqld`page_dir_get_n_slots (89 samples, 0.03%) + + +mysqld`find_field_in_tables (120 samples, 0.03%) + + +mysqld`base_list_iterator::base_list_iterator (42 samples, 0.01%) + + +mysqld`Field_tiny::val_int (40 samples, 0.01%) + + +mysqld`sel_restore_position_for_mysql (71 samples, 0.02%) + + +mysqld`best_access_path (43 samples, 0.01%) + + +mysqld`handler::ha_update_row (596 samples, 0.17%) + + +mysqld`page_cur_search_with_match (56 samples, 0.02%) + + +mysqld`rec_copy_prefix_to_buf (140 samples, 0.04%) + + +mysqld`mutex_exit (300 samples, 0.09%) + + +mysqld`setup_conds (856 samples, 0.25%) + + +mysqld`net_real_write (50 samples, 0.01%) + + +libc.so.1`atomic_add_64_nv (41 samples, 0.01%) + + +mysqld`row_search_for_mysql (385 samples, 0.11%) + + +mysqld`Arg_comparator::compare_string (46 samples, 0.01%) + + +mysqld`dyn_array_push (71 samples, 0.02%) + + +mysqld`ut_align_down (37 samples, 0.01%) + + +mysqld`mach_read_from_2 (133 samples, 0.04%) + + +mysqld`btr_pcur_move_to_next_page (37 samples, 0.01%) + + +mysqld`handler::index_read_idx_map (1,168 samples, 0.34%) + + +mysqld`dict_index_is_clust (49 samples, 0.01%) + + +mysqld`ha_innobase::index_next_same (5,067 samples, 1.45%) + + +mysqld`ha_innobase::index_read (810 samples, 0.23%) + + +mysqld`btr_pcur_move_to_next (1,126 samples, 0.32%) + + +mysqld`fill_record (39 samples, 0.01%) + + +mysqld`row_get_rec_trx_id (44 samples, 0.01%) + + +mysqld`ut_pair_min (37 samples, 0.01%) + + +mysqld`btr_pcur_store_position (195 samples, 0.06%) + + +mysqld`mach_read_from_2 (44 samples, 0.01%) + + +mysqld`rec_get_next_offs (127 samples, 0.04%) + + +mysqld`btr_search_update_block_hash_info (55 samples, 0.02%) + + +libc.so.1`malloc (108 samples, 0.03%) + + +mysqld`rec_offs_nth_extern (166 samples, 0.05%) + + +mysqld`page_cur_search_with_match (54 samples, 0.02%) + + +mysqld`rw_lock_lock_word_decr (168 samples, 0.05%) + + +mysqld`mtr_memo_push (43 samples, 0.01%) + + +mysqld`Item_func_between::val_int (1,423 samples, 0.41%) + + +libc.so.1`memcpy (624 samples, 0.18%) + + +mysqld`Arg_comparator::compare (65 samples, 0.02%) + + +mysqld`check_quick_keys (631 samples, 0.18%) + + +mysqld`QUICK_RANGE_SELECT::get_next (86,228 samples, 24.75%) +mysqld`QUICK_RANGE_SELECT::get_n.. + + +libc.so.1`memcpy (38 samples, 0.01%) + + +mysqld`buf_page_peek_if_too_old (43 samples, 0.01%) + + +mysqld`Field_varstring::val_str (90 samples, 0.03%) + + +mysqld`buf_page_get_gen (56 samples, 0.02%) + + +mysqld`get_mm_parts (39 samples, 0.01%) + + +mysqld`btr_search_guess_on_hash (100 samples, 0.03%) + + +mysqld`Item_func_eq::val_int (207 samples, 0.06%) + + +mysqld`btr_pcur_open_with_no_init_func (160 samples, 0.05%) + + +mysqld`dfield_set_data (87 samples, 0.02%) + + +mysqld`my_malloc (201 samples, 0.06%) + + +mysqld`dict_index_get_n_unique_in_tree (56 samples, 0.02%) + + +mysqld`handler::read_multi_range_first (301 samples, 0.09%) + + +mysqld`ha_innobase::general_fetch (2,904 samples, 0.83%) + + +mysqld`mysql_reset_thd_for_next_command (39 samples, 0.01%) + + +mysqld`btr_search_build_page_hash_index (478 samples, 0.14%) + + +mysqld`page_cur_try_search_shortcut (134 samples, 0.04%) + + +mysqld`row_build_row_ref_in_tuple (93 samples, 0.03%) + + +mysqld`row_sel_get_clust_rec_for_mysql (1,366 samples, 0.39%) + + +mysqld`add_item_to_list (39 samples, 0.01%) + + +mysqld`st_select_lex::cleanup (636 samples, 0.18%) + + +mysqld`ha_commit_trans (136 samples, 0.04%) + + +mysqld`btr_pcur_open_with_no_init_func (122 samples, 0.04%) + + +mysqld`mach_read_from_2 (134 samples, 0.04%) + + +mysqld`get_best_ror_intersect (97 samples, 0.03%) + + +mysqld`find_field_in_table_ref (98 samples, 0.03%) + + +mysqld`dict_index_is_clust (51 samples, 0.01%) + + +mysqld`thd_ha_data (135 samples, 0.04%) + + +mysqld`mtr_memo_push (155 samples, 0.04%) + + +mysqld`evaluate_null_complemented_join_record (113 samples, 0.03%) + + +mysqld`MYSQL_BIN_LOG::flush_and_sync (81 samples, 0.02%) + + +mysqld`unlock_external (203 samples, 0.06%) + + +mysqld`select_send::send_data (51 samples, 0.01%) + + +mysqld`QUICK_RANGE_SELECT::reset (53 samples, 0.02%) + + +mysqld`rec_offs_nth_extern (47 samples, 0.01%) + + +mysqld`JOIN::exec (5,389 samples, 1.55%) + + +mysqld`_increment_page_get_statistics (407 samples, 0.12%) + + +mysqld`dict_table_is_comp (93 samples, 0.03%) + + +mysqld`JOIN::optimize (15,307 samples, 4.39%) +mysq.. + + +mysqld`dict_index_get_n_unique_in_tree (67 samples, 0.02%) + + +mysqld`open_and_lock_tables_derived (75 samples, 0.02%) + + +mysqld`rec_get_deleted_flag (259 samples, 0.07%) + + +mysqld`page_align (37 samples, 0.01%) + + +mysqld`do_select (159,007 samples, 45.64%) +mysqld`do_select + + +mysqld`page_rec_is_infimum_low (50 samples, 0.01%) + + +mysqld`rec_get_status (96 samples, 0.03%) + + +mysqld`Field_varstring::val_str (143 samples, 0.04%) + + +mysqld`buf_page_optimistic_get (675 samples, 0.19%) + + +mysqld`rec_init_offsets (96 samples, 0.03%) + + +libc.so.1`free (52 samples, 0.01%) + + +mysqld`ha_innobase::index_next (481 samples, 0.14%) + + +mysqld`thr_alarm (149 samples, 0.04%) + + +mysqld`Item_field::val_str (189 samples, 0.05%) + + +mysqld`trx_general_rollback_for_mysql (615 samples, 0.18%) + + +mysqld`mtr_commit (44 samples, 0.01%) + + +mysqld`os_fast_mutex_lock (55 samples, 0.02%) + + +mysqld`rw_lock_s_lock_low (83 samples, 0.02%) + + +mysqld`handler::index_read_map (111 samples, 0.03%) + + +mysqld`btr_cur_search_to_nth_level (85 samples, 0.02%) + + +mysqld`handler::ha_write_row (120 samples, 0.03%) + + +mysqld`Item_field::send (41 samples, 0.01%) + + +mysqld`rr_sequential (82 samples, 0.02%) + + +mysqld`rec_fold (48 samples, 0.01%) + + +mysqld`row_sel_push_cache_row_for_mysql (148 samples, 0.04%) + + +mysqld`Diagnostics_area::is_error (69 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (69 samples, 0.02%) + + +mysqld`handler::ha_open (48 samples, 0.01%) + + +mysqld`row_upd_clust_step (260 samples, 0.07%) + + +mysqld`btr_cur_search_to_nth_level (79 samples, 0.02%) + + +mysqld`thd_ha_data (68 samples, 0.02%) + + +mysqld`mach_read_from_1 (51 samples, 0.01%) + + +mysqld`page_cmp_dtuple_rec_with_match (2,405 samples, 0.69%) + + +mysqld`rec_get_next_offs (91 samples, 0.03%) + + +mysqld`mach_read_from_1 (82 samples, 0.02%) + + +mysqld`cmp_dtuple_rec_with_match (55 samples, 0.02%) + + +mysqld`rec_get_bit_field_1 (148 samples, 0.04%) + + +mysqld`ha_innobase::records_in_range (715 samples, 0.21%) + + +mysqld`mtr_commit (68 samples, 0.02%) + + +mysqld`page_get_max_trx_id (356 samples, 0.10%) + + +mysqld`in_vector::find (71 samples, 0.02%) + + +mysqld`rec_get_nth_field_offs (43 samples, 0.01%) + + +mysqld`trx_read_trx_id (37 samples, 0.01%) + + +mysqld`check_grant (94 samples, 0.03%) + + +mysqld`select_send::send_fields (4,624 samples, 1.33%) + + +mysqld`setup_without_group (971 samples, 0.28%) + + +libc.so.1`__lwp_park (354 samples, 0.10%) + + +mysqld`mach_read_from_4 (104 samples, 0.03%) + + +libc.so.1`atomic_cas_64 (310 samples, 0.09%) + + +mysqld`btr_cur_compress_if_useful (38 samples, 0.01%) + + +mysqld`st_lex::push_context (61 samples, 0.02%) + + +mysqld`Item_field::val_str (297 samples, 0.09%) + + +mysqld`dict_index_get_n_unique_in_tree (94 samples, 0.03%) + + +mysqld`dict_field_get_col (1,267 samples, 0.36%) + + +mysqld`page_header_get_field (83 samples, 0.02%) + + +mysqld`mtr_memo_pop_all (68 samples, 0.02%) + + +mysqld`check_quick_keys (247 samples, 0.07%) + + +mysqld`my_string_ptr_sort (867 samples, 0.25%) + + +mysqld`ut_delay (45 samples, 0.01%) + + +mysqld`page_cmp_dtuple_rec_with_match (50 samples, 0.01%) + + +mysqld`close_thread_tables (313 samples, 0.09%) + + +mysqld`0x724cf0 (55 samples, 0.02%) + + +mysqld`write_dynamic_record (364 samples, 0.10%) + + +mysqld`my_create_with_symlink (207 samples, 0.06%) + + +mysqld`ha_innobase::change_active_index (91 samples, 0.03%) + + +mysqld`buf_page_get_known_nowait (109 samples, 0.03%) + + +mysqld`my_pwrite (83 samples, 0.02%) + + +mysqld`buf_page_get_known_nowait (38 samples, 0.01%) + + +mysqld`rec_get_n_owned_new (375 samples, 0.11%) + + +mysqld`os_file_pwrite (115 samples, 0.03%) + + +mysqld`ut_hash_ulint (43 samples, 0.01%) + + +mysqld`dict_field_get_col (491 samples, 0.14%) + + +mysqld`rec_init_offsets_comp_ordinary (9,554 samples, 2.74%) +m.. + + +mysqld`String::length (50 samples, 0.01%) + + +mysqld`String::append (111 samples, 0.03%) + + +mysqld`rec_init_offsets (55 samples, 0.02%) + + +mysqld`mtr_memo_slot_release (90 samples, 0.03%) + + +mysqld`Field_datetime::store (349 samples, 0.10%) + + +mysqld`vio_write (65 samples, 0.02%) + + +mysqld`page_cmp_dtuple_rec_with_match (118 samples, 0.03%) + + +mysqld`cmp_dtuple_rec_with_match (74 samples, 0.02%) + + +mysqld`row_search_index_entry (78 samples, 0.02%) + + +mysqld`mtr_commit (262 samples, 0.08%) + + +mysqld`rec_offs_nth_extern (71 samples, 0.02%) + + +mysqld`dict_index_get_n_unique (51 samples, 0.01%) + + +mysqld`update_ref_and_keys (541 samples, 0.16%) + + +mysqld`List_iterator_fast (322 samples, 0.09%) + + +mysqld`mysql_unlock_read_tables (253 samples, 0.07%) + + +mysqld`mtr_x_lock_func (254 samples, 0.07%) + + +mysqld`handler::ha_statistic_increment (62 samples, 0.02%) + + +mysqld`page_cur_search_with_match (67 samples, 0.02%) + + +mysqld`row_sel_get_clust_rec_for_mysql (127 samples, 0.04%) + + +mysqld`Item_func_equal::val_int (71 samples, 0.02%) + + +mysqld`row_ins_index_entry_step (1,072 samples, 0.31%) + + +mysqld`page_rec_get_next_const (966 samples, 0.28%) + + +mysqld`net_flush (143 samples, 0.04%) + + +mysqld`MYSQL_BIN_LOG::wait_for_update (153 samples, 0.04%) + + +libc.so.1`mutex_lock_impl (55 samples, 0.02%) + + +mysqld`Protocol::store_string_aux (824 samples, 0.24%) + + +libc.so.1`__open_syscall (41 samples, 0.01%) + + +mysqld`page_cur_search_with_match (223 samples, 0.06%) + + +mysqld`row_upd (41 samples, 0.01%) + + +mysqld`handler::ha_index_init (85 samples, 0.02%) + + +mysqld`get_datetime_value (46 samples, 0.01%) + + +mysqld`Field::is_null (214 samples, 0.06%) + + +mysqld`rw_lock_s_lock_low (72 samples, 0.02%) + + +libc.so.1`__write (348 samples, 0.10%) + + +mysqld`btr_pcur_move_to_prev (62 samples, 0.02%) + + +mysqld`List_iterator_fast (118 samples, 0.03%) + + +mysqld`Item_bool_func2::Item_bool_func2 (49 samples, 0.01%) + + +mysqld`rw_lock_lock_word_decr (62 samples, 0.02%) + + +mysqld`calc_sum_of_all_status (11,433 samples, 3.28%) +my.. + + +mysqld`os_file_pwrite (69 samples, 0.02%) + + +mysqld`my_b_flush_io_cache (81 samples, 0.02%) + + +mysqld`rec_init_offsets (134 samples, 0.04%) + + +mysqld`btr_pcur_open_with_no_init_func (833 samples, 0.24%) + + +mysqld`mach_read_from_2 (78 samples, 0.02%) + + +mysqld`buf_page_get_gen (66 samples, 0.02%) + + +mysqld`buf_flush_try_neighbors (822 samples, 0.24%) + + +mysqld`buf_block_buf_fix_inc_func (36 samples, 0.01%) + + +mysqld`page_rec_is_user_rec_low (49 samples, 0.01%) + + +libc.so.1`__read (174 samples, 0.05%) + + +mysqld`buf_page_optimistic_get (47 samples, 0.01%) + + +mysqld`rw_lock_s_unlock_func (49 samples, 0.01%) + + +mysqld`0x724ca0 (50 samples, 0.01%) + + +libc.so.1`mutex_trylock_adaptive (38 samples, 0.01%) + + +mysqld`Item_field::get_tmp_table_item (36 samples, 0.01%) + + +mysqld`QUICK_ROR_INTERSECT_SELECT::get_next (1,031 samples, 0.30%) + + +mysqld`ha_innobase::records_in_range (51 samples, 0.01%) + + +mysqld`buf_page_get_known_nowait (69 samples, 0.02%) + + +mysqld`rec_init_offsets (60 samples, 0.02%) + + +mysqld`row_search_for_mysql (160 samples, 0.05%) + + +mysqld`Item_cond_or::val_int (82 samples, 0.02%) + + +mysqld`Item_func_eq::val_int (1,143 samples, 0.33%) + + +mysqld`mtr_memo_push (36 samples, 0.01%) + + +mysqld`buf_block_get_state (80 samples, 0.02%) + + +mysqld`rw_lock_s_lock_spin (76 samples, 0.02%) + + +mysqld`Item_func_like::turboBM_matches (170 samples, 0.05%) + + +mysqld`join_read_always_key (501 samples, 0.14%) + + +mysqld`Arg_comparator::compare_string (247 samples, 0.07%) + + +mysqld`row_undo_ins_remove_sec (165 samples, 0.05%) + + +libc.so.1`memset (202 samples, 0.06%) + + +mysqld`ha_innobase::index_next_same (1,363 samples, 0.39%) + + +mysqld`Item::val_bool (50 samples, 0.01%) + + +mysqld`buf_page_get_known_nowait (264 samples, 0.08%) + + +mysqld`btr_pcur_open_with_no_init_func (38 samples, 0.01%) + + +mysqld`handler::ha_statistic_increment (76 samples, 0.02%) + + +mysqld`ha_innobase::rnd_init (76 samples, 0.02%) + + +mysqld`Field_long::val_str (55 samples, 0.02%) + + +mysqld`Field_long::val_str (1,060 samples, 0.30%) + + +mysqld`MYSQLparse (4,638 samples, 1.33%) + + +mysqld`rw_lock_lock_word_decr (51 samples, 0.01%) + + +mysqld`buf_flush_page (775 samples, 0.22%) + + +mysqld`mach_read_from_2 (77 samples, 0.02%) + + +mysqld`os_mutex_enter (55 samples, 0.02%) + + +mysqld`end_send_group (54 samples, 0.02%) + + +mysqld`lock_sec_rec_cons_read_sees (66 samples, 0.02%) + + +mysqld`page_rec_get_next_low (43 samples, 0.01%) + + +mysqld`Field_varstring::val_str (99 samples, 0.03%) + + +mysqld`read_view_open_now (36 samples, 0.01%) + + +mysqld`que_thr_stop_for_mysql_no_error (206 samples, 0.06%) + + +mysqld`rec_offs_n_fields (1,736 samples, 0.50%) + + +mysqld`fil_aio_wait (320 samples, 0.09%) + + +mysqld`eliminate_item_equal (345 samples, 0.10%) + + +mysqld`page_rec_get_next_low (36 samples, 0.01%) + + +mysqld`dtuple_fold (101 samples, 0.03%) + + +mysqld`btr_search_guess_on_hash (292 samples, 0.08%) + + +mysqld`Item_subselect::exec (4,860 samples, 1.39%) + + +mysqld`handler::read_multi_range_next (756 samples, 0.22%) + + +mysqld`rec_offs_set_n_alloc (80 samples, 0.02%) + + +mysqld`dict_field_get_col (2,376 samples, 0.68%) + + +mysqld`handler::ha_index_init (91 samples, 0.03%) + + +mysqld`mysql_lock_tables (518 samples, 0.15%) + + +mysqld`Item_equal::add (42 samples, 0.01%) + + +mysqld`btr_pcur_move_to_next (71 samples, 0.02%) + + +mysqld`dtuple_fold (51 samples, 0.01%) + + +mysqld`Log_event::read_log_event (405 samples, 0.12%) + + +mysqld`Copy_field::set (45 samples, 0.01%) + + +mysqld`rw_lock_s_unlock_func (300 samples, 0.09%) + + +mysqld`buf_page_get_mutex_enter (112 samples, 0.03%) + + +mysqld`my_malloc (148 samples, 0.04%) + + +mysqld`log_write_up_to (130 samples, 0.04%) + + +mysqld`btr_pcur_store_position (52 samples, 0.01%) + + +mysqld`ha_innobase::general_fetch (2,843 samples, 0.82%) + + +libc.so.1`open (181 samples, 0.05%) + + +mysqld`btr_node_ptr_get_child_page_no (78 samples, 0.02%) + + +mysqld`rec_get_nth_field_offs (148 samples, 0.04%) + + +mysqld`page_align (45 samples, 0.01%) + + +mysqld`row_ins_index_entry_low (1,059 samples, 0.30%) + + +mysqld`page_cur_search_with_match (109 samples, 0.03%) + + +mysqld`dtuple_fold (721 samples, 0.21%) + + +libc.so.1`free (241 samples, 0.07%) + + +mysqld`btr_search_guess_on_hash (42 samples, 0.01%) + + +mysqld`rec_get_deleted_flag (39 samples, 0.01%) + + +mysqld`log_write_up_to (353 samples, 0.10%) + + +mysqld`rec_get_next_offs (43 samples, 0.01%) + + +mysqld`row_sel_push_cache_row_for_mysql (124 samples, 0.04%) + + +mysqld`Arg_comparator::compare_int_signed (38 samples, 0.01%) + + +libc.so.1`__priocntlset (872 samples, 0.25%) + + +mysqld`rec_get_n_owned_new (75 samples, 0.02%) + + +mysqld`handler::ha_statistic_increment (94 samples, 0.03%) + + +libc.so.1`malloc (187 samples, 0.05%) + + +mysqld`btr_search_check_guess (95 samples, 0.03%) + + +mysqld`Item_cond_and::val_int (59 samples, 0.02%) + + +mysqld`base_list_iterator::init (76 samples, 0.02%) + + +mysqld`rw_lock_lock_word_decr (45 samples, 0.01%) + + +mysqld`rec_get_bit_field_1 (63 samples, 0.02%) + + +mysqld`Item::walk (54 samples, 0.02%) + + +mysqld`mach_read_from_2 (66 samples, 0.02%) + + +mysqld`Item::val_bool (66 samples, 0.02%) + + +mysqld`check_quick_keys (3,633 samples, 1.04%) + + +mysqld`JOIN::prepare (2,644 samples, 0.76%) + + +mysqld`Item::const_item (74 samples, 0.02%) + + +mysqld`join_read_const_table (1,327 samples, 0.38%) + + +mysqld`Item_exists_subselect::val_bool (1,053 samples, 0.30%) + + +mysqld`mtr_commit (66 samples, 0.02%) + + +mysqld`row_search_for_mysql (461 samples, 0.13%) + + +mysqld`row_build_row_ref_in_tuple (147 samples, 0.04%) + + +mysqld`Item_func_gt::val_int (349 samples, 0.10%) + + +mysqld`cmp_dtuple_rec (37 samples, 0.01%) + + +mysqld`Item_func_le::val_int (66 samples, 0.02%) + + +mysqld`Field_varstring::val_str (117 samples, 0.03%) + + +mysqld`Item_cond::fix_fields (47 samples, 0.01%) + + +mysqld`row_sel_field_store_in_mysql_format (70 samples, 0.02%) + + +mysqld`my_write (251 samples, 0.07%) + + +libc.so.1`readlink (41 samples, 0.01%) + + +mysqld`my_read (158 samples, 0.05%) + + +mysqld`Protocol::write (618 samples, 0.18%) + + +mysqld`dict_table_is_comp (55 samples, 0.02%) + + +mysqld`check_simple_equality (188 samples, 0.05%) + + +mysqld`cmp_dtuple_rec (147 samples, 0.04%) + + +mysqld`Item_cond_or::val_int (651 samples, 0.19%) + + +mysqld`rw_lock_get_writer (53 samples, 0.02%) + + +mysqld`btr_cur_search_to_nth_level (177 samples, 0.05%) + + +mysqld`0x724ca0 (47 samples, 0.01%) + + +mysqld`ha_commit_trans (966 samples, 0.28%) + + +mysqld`rec_get_nth_field_offs (109 samples, 0.03%) + + +mysqld`ut_hash_ulint (160 samples, 0.05%) + + +mysqld`row_search_for_mysql (628 samples, 0.18%) + + +mysqld`find_order_in_list (82 samples, 0.02%) + + +mysqld`cmp_dtuple_rec_with_match (59 samples, 0.02%) + + +mysqld`Item::val_bool (359 samples, 0.10%) + + +mysqld`rec_get_offsets_func (56 samples, 0.02%) + + +mysqld`ha_innobase::index_next_same (47 samples, 0.01%) + + +mysqld`st_select_lex::add_table_to_list (220 samples, 0.06%) + + +mysqld`btr_search_guess_on_hash (522 samples, 0.15%) + + +mysqld`read_view_sees_trx_id (85 samples, 0.02%) + + +mysqld`net_real_write (121 samples, 0.03%) + + +libc.so.1`open (44 samples, 0.01%) + + +mysqld`Item_cond_and::Item_cond_and (36 samples, 0.01%) + + +mysqld`join_read_next (2,682 samples, 0.77%) + + +mysqld`Arg_comparator::compare_int_signed (62 samples, 0.02%) + + +mysqld`close_thread_table (141 samples, 0.04%) + + +mysqld`page_cur_search_with_match (56 samples, 0.02%) + + +mysqld`btr_pcur_store_position (126 samples, 0.04%) + + +mysqld`row_sel_push_cache_row_for_mysql (40 samples, 0.01%) + + +mysqld`Item_func_eq::~Item_func_eq (37 samples, 0.01%) + + +mysqld`rec_get_offsets_func (1,418 samples, 0.41%) + + +mysqld`page_dir_slot_get_rec (204 samples, 0.06%) + + +mysqld`row_search_for_mysql (2,544 samples, 0.73%) + + +libc.so.1`atomic_add_64_nv (50 samples, 0.01%) + + +mysqld`ha_innobase::general_fetch (935 samples, 0.27%) + + +mysqld`my_realpath (54 samples, 0.02%) + + +mysqld`Field_new_decimal::store_value (64 samples, 0.02%) + + +mysqld`mtr_memo_pop_all (125 samples, 0.04%) + + +libc.so.1`__time (59 samples, 0.02%) + + +mysqld`dyn_array_create (61 samples, 0.02%) + + +mysqld`page_is_comp (83 samples, 0.02%) + + +mysqld`handler::read_range_next (84,399 samples, 24.22%) +mysqld`handler::read_range_next + + +mysqld`buf_page_get_gen (135 samples, 0.04%) + + +mysqld`row_ins_scan_sec_index_for_duplicate (93 samples, 0.03%) + + +mysqld`dict_index_copy_rec_order_prefix (75 samples, 0.02%) + + +mysqld`rec_get_offsets_func (172 samples, 0.05%) + + +mysqld`trx_read_trx_id (36 samples, 0.01%) + + +libc.so.1`_thrp_setup (348,199 samples, 99.93%) +libc.so.1`_thrp_setup + + +mysqld`page_cur_search_with_match (677 samples, 0.19%) + + +mysqld`page_rec_is_supremum_low (41 samples, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (54 samples, 0.02%) + + +mysqld`rec_init_offsets_comp_ordinary (537 samples, 0.15%) + + +mysqld`mach_read_from_2 (63 samples, 0.02%) + + +mysqld`sub_select (15,416 samples, 4.42%) +mysq.. + + +mysqld`rec_offs_n_fields (60 samples, 0.02%) + + +mysqld`innodb_srv_conc_exit_innodb (45 samples, 0.01%) + + +mysqld`row_sel_pop_cached_row_for_mysql (47 samples, 0.01%) + + +libc.so.1`__pwrite (115 samples, 0.03%) + + +mysqld`setup_order (84 samples, 0.02%) + + +mysqld`fn_format (56 samples, 0.02%) + + +mysqld`thr_end_alarm (368 samples, 0.11%) + + +mysqld`ut_fold_binary (659 samples, 0.19%) + + +mysqld`btr_pcur_open_with_no_init_func (1,041 samples, 0.30%) + + +mysqld`rec_get_nth_field_offs (63 samples, 0.02%) + + +mysqld`Item_int_func::result_type (132 samples, 0.04%) + + +mysqld`rec_get_offsets_func (114 samples, 0.03%) + + +mysqld`Field_long::val_int (45 samples, 0.01%) + + +mysqld`rec_get_offsets_func (105 samples, 0.03%) + + +mysqld`net_real_write (1,738 samples, 0.50%) + + +mysqld`mach_read_from_4 (239 samples, 0.07%) + + +mysqld`rec_get_offsets_func (45 samples, 0.01%) + + +mysqld`Arg_comparator::compare_datetime (1,262 samples, 0.36%) + + +mysqld`do_copy_null (895 samples, 0.26%) + + +mysqld`cmp_dtuple_rec_with_match (638 samples, 0.18%) + + +mysqld`rw_lock_lock_word_decr (129 samples, 0.04%) + + +libc.so.1`read (38 samples, 0.01%) + + +mysqld`close_open_tables (190 samples, 0.05%) + + +mysqld`buf_page_get_mutex (80 samples, 0.02%) + + +mysqld`btr_pcur_open_with_no_init_func (32,341 samples, 9.28%) +mysqld`btr.. + + +mysqld`dtuple_get_n_fields_cmp (53 samples, 0.02%) + + +mysqld`rw_lock_x_lock_wait (237 samples, 0.07%) + + +mysqld`ha_innobase::change_active_index (395 samples, 0.11%) + + +mysqld`dtuple_fold (40 samples, 0.01%) + + +mysqld`rec_init_offsets (120 samples, 0.03%) + + +mysqld`dict_col_get_clust_pos (55 samples, 0.02%) + + +mysqld`ut_fold_ulint_pair (151 samples, 0.04%) + + +mysqld`rec_get_status (87 samples, 0.02%) + + +mysqld`buf_page_get_state (60 samples, 0.02%) + + +mysqld`Field_datetime::val_str (323 samples, 0.09%) + + +mysqld`innobase_get_trx (312 samples, 0.09%) + + +mysqld`ha_innobase::change_active_index (1,766 samples, 0.51%) + + +mysqld`rec_init_offsets (100 samples, 0.03%) + + +mysqld`lock_sec_rec_cons_read_sees (41 samples, 0.01%) + + +mysqld`select_send::send_data (42 samples, 0.01%) + + +mysqld`page_rec_get_n_recs_before (869 samples, 0.25%) + + +mysqld`Arg_comparator::compare (44 samples, 0.01%) + + +mysqld`mtr_memo_slot_release (42 samples, 0.01%) + + +mysqld`rec_get_bit_field_1 (106 samples, 0.03%) + + +mysqld`Item::val_bool (75 samples, 0.02%) + + +mysqld`dict_index_get_n_unique (41 samples, 0.01%) + + +mysqld`buf_page_release (74 samples, 0.02%) + + +mysqld`row_sel_store_mysql_rec (65 samples, 0.02%) + + +mysqld`copy_fields (44 samples, 0.01%) + + +mysqld`mach_read_from_2 (47 samples, 0.01%) + + +mysqld`end_write (2,107 samples, 0.60%) + + +mysqld`Item_func_eq::val_int (48 samples, 0.01%) + + +mysqld`ha_innobase::index_read (1,063 samples, 0.31%) + + +mysqld`dtuple_get_info_bits (63 samples, 0.02%) + + +mysqld`rec_get_info_bits (86 samples, 0.02%) + + +mysqld`ha_innobase::rnd_pos (158 samples, 0.05%) + + +mysqld`rw_lock_s_lock_func (40 samples, 0.01%) + + +mysqld`rec_get_offsets_func (78 samples, 0.02%) + + +mysqld`my_close (38 samples, 0.01%) + + +mysqld`page_cur_search_with_match (42 samples, 0.01%) + + +libc.so.1`malloc (53 samples, 0.02%) + + +mysqld`create_sort_index (108,767 samples, 31.22%) +mysqld`create_sort_index + + +mysqld`row_sel_store_mysql_rec (119 samples, 0.03%) + + +mysqld`dict_field_get_col (158 samples, 0.05%) + + +mysqld`page_rec_get_prev_const (5,139 samples, 1.47%) + + +mysqld`Item_field::make_field (142 samples, 0.04%) + + +mysqld`btr_search_info_update_slow (654 samples, 0.19%) + + +mysqld`cmp_dtuple_rec_with_match (41 samples, 0.01%) + + +mysqld`String::charset (40 samples, 0.01%) + + +mysqld`btr_pcur_restore_position_func (95 samples, 0.03%) + + +mysqld`ut_fold_dulint (57 samples, 0.02%) + + +mysqld`add_to_status (10,790 samples, 3.10%) +my.. + + +mysqld`Item::val_bool (88 samples, 0.03%) + + +mysqld`que_thr_stop_for_mysql_no_error (51 samples, 0.01%) + + +mysqld`get_token (149 samples, 0.04%) + + +mysqld`_mi_safe_delete_file (362 samples, 0.10%) + + +mysqld`mutex_enter_func (202 samples, 0.06%) + + +mysqld`Item_func_like::val_int (57 samples, 0.02%) + + +mysqld`mtr_memo_pop_all (39 samples, 0.01%) + + +mysqld`mi_close (119 samples, 0.03%) + + +mysqld`ut_fold_ulint_pair (96 samples, 0.03%) + + +mysqld`Item_func_eq::val_int (1,667 samples, 0.48%) + + +mysqld`dict_field_get_col (67 samples, 0.02%) + + +mysqld`dict_index_copy_types (437 samples, 0.13%) + + +mysqld`Item_cond_and::val_int (48 samples, 0.01%) + + +mysqld`rec_offs_set_n_alloc (39 samples, 0.01%) + + +mysqld`vio_write (198 samples, 0.06%) + + +mysqld`row_sel_push_cache_row_for_mysql (129 samples, 0.04%) + + +mysqld`THD::convert_string (300 samples, 0.09%) + + +mysqld`btr_cur_search_to_nth_level (159 samples, 0.05%) + + +mysqld`ha_search_and_get_data (60 samples, 0.02%) + + +mysqld`check_quick_select (112 samples, 0.03%) + + +mysqld`btr_search_guess_on_hash (449 samples, 0.13%) + + diff --git a/tools/FlameGraph/demos/cpu-mysql.svg b/tools/FlameGraph/demos/cpu-mysql.svg new file mode 100644 index 0000000..328e5da --- /dev/null +++ b/tools/FlameGraph/demos/cpu-mysql.svg @@ -0,0 +1,3513 @@ + + + + + + + + + + + + +Flame Graph +Function: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z16dispatch_command19enum_server_commandP3THDPcj + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_ZN11ha_innobase13general_f.. + + +mysqld.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z13handle_selectP3THDP6st_lexP13select_resultm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z13find_all_keysP13st_sort_paramP1.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`.. + + + + + + + + + + + + + + +mysqld`row_sel_get_clu.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z21execute_sqlcom_selectP3THDP10TABLE_LIST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z10do_commandP3THD + + +mysqld`_Z9do_selectP4JOINP4ListI4ItemEP8st_tableP9Procedure + + + + + + + + + + +mysqld.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z14join_read_prevP11READ_R.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_ZN18QUICK_RANGE_SELECT8get.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld.. + + + +mysqld`_ZN4JOIN4execEv + + + + + + + + + + + + + + + + + + + + +mysqld`.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z20ev.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z11mysql_parseP3THDPcjPPKc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_ZN11ha_innobase10index_pre.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_ZN11ha_innobase13general_.. + + + + + + + + + + +mysqld`_Z10sub_selectP4JOINP13st_join_tableb + + + + + + + + + + + + +mysqld`_ZN11ha_innobase15index_ne.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z21mysql_execute_commandP3THD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`btr_c.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`row_.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +libc.so.1`_thrp_setup + + + +mysqld`handle_one_connection + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z12mysql_selectP3THDPPP4ItemP10TABLE_LISTjR4ListIS1_ES2_jP8st_orderSB_S2_SB_yP13select_resultP18st_select_lex.. + + + + + + + + + + + + + + +mysqld`_Z17create_sort_indexP3THDP4JOINP8st.. + + + + +libc.s.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`.. + + + + + + + + + + + + + + + + + +mysqld`btr_pc.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`row_search_for_mysql + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_ZN7handler15read_range_nex.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +libc.so.1`_lwp_start + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`row_se.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`row_search_for_mysql + + + + + + + + + + + + + +mysqld`_ZN7handler21read_multi_ran.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +mysqld`_Z8filesortP3THDP8st_tableP13st_sort.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/FlameGraph/demos/cpu-qemu-both.svg b/tools/FlameGraph/demos/cpu-qemu-both.svg new file mode 100644 index 0000000..b13870d --- /dev/null +++ b/tools/FlameGraph/demos/cpu-qemu-both.svg @@ -0,0 +1,2569 @@ + + + + + + + + + + + + +Flame Graph + + +unix`threadp (13 samples, 0.03%) + + +genunix`sigdiffset (11 samples, 0.02%) + + +kvm`kvm_emulate_pio (70 samples, 0.15%) + + +kvm`mapping_level (7 samples, 0.02%) + + +unix`dispatch_hilevel (452 samples, 0.98%) + + +kvm`is_protmode (5 samples, 0.01%) + + +unix`mutex_exit (21 samples, 0.05%) + + +kvm`native_read_msr (29 samples, 0.06%) + + +kvm`apic_update_ppr (49 samples, 0.11%) + + +libc.so.1`__sigtimedwait (336 samples, 0.73%) + + +unix`sys_syscall (10 samples, 0.02%) + + +genunix`syslwp_park (79 samples, 0.17%) + + +qemu-system-x86_64`qemu_notify_event (5 samples, 0.01%) + + +kvm`vmcs_readl (19 samples, 0.04%) + + +unix`do_splx (5 samples, 0.01%) + + +libc.so.1`queue_lock (7 samples, 0.02%) + + +unix`disp_getwork (90 samples, 0.20%) + + +unix`mutex_enter (61 samples, 0.13%) + + +kvm`vmcs_readl (8 samples, 0.02%) + + +kvm`emulator_write_emulated_onepage (17 samples, 0.04%) + + +unix`lock_try (10 samples, 0.02%) + + +qemu-system-x86_64`virtio_pci_config_writew (5 samples, 0.01%) + + +kvm`gfn_to_memslot_unaliased (7 samples, 0.02%) + + +kvm`vmcs_readl (18 samples, 0.04%) + + +unix`sys_syscall (83 samples, 0.18%) + + +unix`splr (6 samples, 0.01%) + + +kvm`do_fetch_insn_byte (9 samples, 0.02%) + + +unix`splr (5 samples, 0.01%) + + +kvm`kvm_read_ldt (5 samples, 0.01%) + + +genunix`sigcheck (5 samples, 0.01%) + + +unix`gethrestime_sec (12 samples, 0.03%) + + +kvm`vmx_vcpu_put (56 samples, 0.12%) + + +unix`atomic_add_64 (17 samples, 0.04%) + + +genunix`syslwp_park (569 samples, 1.24%) + + +- (51 samples, 0.11%) + + +kvm`clear_bit (60 samples, 0.13%) + + +genunix`schedctl_sigblock (36 samples, 0.08%) + + +kvm`pit_has_pending_timer (44 samples, 0.10%) + + +kvm`kvm_read_guest_page (102 samples, 0.22%) + + +qemu-system-x86_64`kvm_cpu_exec (44,756 samples, 97.49%) +qemu-system-x86_64`kvm_cpu_exec + + +unix`pc_gethrestime (15 samples, 0.03%) + + +unix`atomic_add_64 (12 samples, 0.03%) + + +genunix`cpu_grow (9 samples, 0.02%) + + +genunix`sigorset (8 samples, 0.02%) + + +libc.so.1`mutex_lock_queue (126 samples, 0.27%) + + +unix`gdt_ucode_model (5 samples, 0.01%) + + +genunix`restorectx (26 samples, 0.06%) + + +unix`lock_try (15 samples, 0.03%) + + +kvm`paging64_walk_addr (639 samples, 1.39%) + + +unix`mutex_vector_enter (5 samples, 0.01%) + + +kvm`apic_set_eoi (12 samples, 0.03%) + + +unix`sys_syscall (201 samples, 0.44%) + + +kvm`kvm_read_cr0_bits (6 samples, 0.01%) + + +kvm`next_segment (20 samples, 0.04%) + + +kvm`vcpu_clear (10 samples, 0.02%) + + +genunix`gethrtime_unscaled (6 samples, 0.01%) + + +kvm`vmcs_writel (7 samples, 0.02%) + + +unix`tsc_read (6 samples, 0.01%) + + +unix`preempt (16 samples, 0.03%) + + +kvm`mmu_topup_memory_cache_page (5 samples, 0.01%) + + +kvm`kvm_iodevice_write (21 samples, 0.05%) + + +kvm`kvm_read_cr0_bits (18 samples, 0.04%) + + +kvm`paging64_gpte_to_gfn_lvl (20 samples, 0.04%) + + +kvm`kvm_read_cr0_bits (6 samples, 0.01%) + + +qemu-system-x86_64`virtio_net_handle_tx_bh (9 samples, 0.02%) + + +unix`0xfffffffffb85a673 (12 samples, 0.03%) + + +unix`mutex_tryenter (11 samples, 0.02%) + + +unix`bcopy (35 samples, 0.08%) + + +FSS`fss_wakeup (175 samples, 0.38%) + + +qemu-system-x86_64`cpu_outw (6 samples, 0.01%) + + +genunix`syscall_mstate (10 samples, 0.02%) + + +unix`swtch (7 samples, 0.02%) + + +qemu-system-x86_64`virtio_net_handle_tx_bh (827 samples, 1.80%) + + +kvm`kvm_cpu_has_interrupt (38 samples, 0.08%) + + +libc.so.1`queue_lock (10 samples, 0.02%) + + +kvm`irqchip_in_kernel (5 samples, 0.01%) + + +unix`sys_syscall (15 samples, 0.03%) + + +genunix`gethrtime_unscaled (9 samples, 0.02%) + + +kvm`vmcs_readl (10 samples, 0.02%) + + +kvm`is_long_mode (5 samples, 0.01%) + + +kvm`kvm_get_gdt (5 samples, 0.01%) + + +genunix`schedctl_sigblock (6 samples, 0.01%) + + +libc.so.1`ioctl (41,104 samples, 89.54%) +libc.so.1`ioctl + + +kvm`kvm_arch_vcpu_runnable (8 samples, 0.02%) + + +unix`mutex_enter (5 samples, 0.01%) + + +kvm`kvm_ctx_save (62 samples, 0.14%) + + +unix`tsc_read (6 samples, 0.01%) + + +qemu-system-x86_64`get_highest_priority_int (12 samples, 0.03%) + + +kvm`kvm_read_cr0_bits (5 samples, 0.01%) + + +unix`0xfffffffffb800c91 (8 samples, 0.02%) + + +kvm`mmu_topup_memory_cache (5 samples, 0.01%) + + +unix`0xfffffffffb85a6b6 (5 samples, 0.01%) + + +genunix`cv_block (103 samples, 0.22%) + + +kvm`hva_to_pfn (391 samples, 0.85%) + + +kvm`vmx_set_rflags (17 samples, 0.04%) + + +qemu-system-x86_64`kvm_main_loop_cpu (45,902 samples, 99.99%) +qemu-system-x86_64`kvm_main_loop_cpu + + +unix`sys_syscall (9 samples, 0.02%) + + +unix`kcopy (17 samples, 0.04%) + + +- (38 samples, 0.08%) + + +qemu-system-x86_64`kvm_arch_push_nmi (5 samples, 0.01%) + + +unix`sys_syscall (12 samples, 0.03%) + + +kvm`seg_base (8 samples, 0.02%) + + +unix`fpxsave_ctxt (18 samples, 0.04%) + + +genunix`installctx (17 samples, 0.04%) + + +- (40,837 samples, 88.96%) +- + + +kvm`tdp_page_fault (1,225 samples, 2.67%) +k.. + + +kvm`is_rsvd_bits_set (24 samples, 0.05%) + + +kvm`is_paging (22 samples, 0.05%) + + +genunix`cpu_update_pct (5 samples, 0.01%) + + +kvm`native_write_msr (57 samples, 0.12%) + + +unix`disp_getwork (12 samples, 0.03%) + + +genunix`lwp_sigmask (31 samples, 0.07%) + + +unix`xc_common (8 samples, 0.02%) + + +kvm`kvm_get_rflags (22 samples, 0.05%) + + +kvm`irqchip_in_kernel (6 samples, 0.01%) + + +kvm`decode_register_operand (11 samples, 0.02%) + + +specfs`spec_ioctl (5 samples, 0.01%) + + +kvm`kvm_get_rflags (6 samples, 0.01%) + + +kvm`pic_irqchip (10 samples, 0.02%) + + +kvm`apic_mmio_write (505 samples, 1.10%) + + +genunix`uiomove (10 samples, 0.02%) + + +unix`swtch (31 samples, 0.07%) + + +kvm`is_present_gpte (6 samples, 0.01%) + + +libc.so.1`mutex_unlock (14 samples, 0.03%) + + +kvm`apic_enabled (6 samples, 0.01%) + + +unix`mutex_exit (8 samples, 0.02%) + + +libc.so.1`_sysconfig (41 samples, 0.09%) + + +kvm`kvm_arch_vcpu_put (29 samples, 0.06%) + + +kvm`vmcs_readl (22 samples, 0.05%) + + +kvm`__set_bit (6 samples, 0.01%) + + +kvm`pic_irqchip (21 samples, 0.05%) + + +pcplusmp`apic_send_ipi (5 samples, 0.01%) + + +kvm`is_rsvd_bits_set (30 samples, 0.07%) + + +genunix`gethrtime (7 samples, 0.02%) + + +kvm`apic_find_highest_irr (14 samples, 0.03%) + + +kvm`mmu_topup_memory_caches (7 samples, 0.02%) + + +kvm`vmcs_read64 (12 samples, 0.03%) + + +unix`caps_charge_adjust (35 samples, 0.08%) + + +genunix`sleepq_wakeone_chan (210 samples, 0.46%) + + +kvm`kvm_rip_write (21 samples, 0.05%) + + +qemu-system-x86_64`cpu_set_apic_tpr (25 samples, 0.05%) + + +genunix`thread_lock (6 samples, 0.01%) + + +libc.so.1`mutex_lock (417 samples, 0.91%) + + +kvm`vmcs_writel (9 samples, 0.02%) + + +kvm`vmx_save_host_state (218 samples, 0.47%) + + +kvm`find_highest_vector (14 samples, 0.03%) + + +kvm`kvm_mmu_gva_to_gpa_write (9 samples, 0.02%) + + +unix`disp (60 samples, 0.13%) + + +kvm`kvm_fire_urn (26 samples, 0.06%) + + +genunix`cv_block (18 samples, 0.04%) + + +kvm`read_msr (6 samples, 0.01%) + + +genunix`gethrestime (18 samples, 0.04%) + + +qemu-system-x86_64`msix_enabled (5 samples, 0.01%) + + +unix`sys_syscall (40,837 samples, 88.96%) +unix`sys_syscall + + +libc.so.1`sigaddset (6 samples, 0.01%) + + +libc.so.1`write (16 samples, 0.03%) + + +kvm`vmx_get_cs_db_l_bits (39 samples, 0.08%) + + +genunix`getf (18 samples, 0.04%) + + +kvm`vcpu_enter_guest (38,371 samples, 83.59%) +kvm`vcpu_enter_guest + + +unix`sys_syscall (576 samples, 1.25%) + + +genunix`savectx (22 samples, 0.05%) + + +unix`kcopy (19 samples, 0.04%) + + +kvm`__apic_accept_irq (8 samples, 0.02%) + + +unix`_resume_from_idle (8 samples, 0.02%) + + +kvm`vmx_cache_reg (17 samples, 0.04%) + + +kvm`apic_update_ppr (8 samples, 0.02%) + + +kvm`unalias_gfn_instantiation (25 samples, 0.05%) + + +genunix`disp_lock_exit (5 samples, 0.01%) + + +unix`_interrupt (461 samples, 1.00%) + + +kvm`handle_io (7 samples, 0.02%) + + +qemu-system-x86_64`cpu_physical_memory_is_dirty (9 samples, 0.02%) + + +genunix`thread_lock (8 samples, 0.02%) + + +kvm`vmcs_readl (18 samples, 0.04%) + + +genunix`thread_lock (13 samples, 0.03%) + + +kvm`vmx_get_rflags (15 samples, 0.03%) + + +genunix`cpu_grow (7 samples, 0.02%) + + +qemu-system-x86_64`post_kvm_run (2,348 samples, 5.11%) +qemu-.. + + +unix`x86pte_access_pagetable (5 samples, 0.01%) + + +unix`splr (10 samples, 0.02%) + + +kvm`x86_emulate_insn (1,762 samples, 3.84%) +kvm.. + + +genunix`cpu_update_pct (16 samples, 0.03%) + + +kvm`native_write_msr (11 samples, 0.02%) + + +unix`mutex_exit (21 samples, 0.05%) + + +unix`mutex_exit (9 samples, 0.02%) + + +unix`htable_getpage (305 samples, 0.66%) + + +kvm`native_read_msr (8 samples, 0.02%) + + +unix`sys_syscall (51 samples, 0.11%) + + +kvm`handle_external_interrupt (25 samples, 0.05%) + + +libc.so.1`mutex_lock (15 samples, 0.03%) + + +libc.so.1`__lwp_park (112 samples, 0.24%) + + +genunix`gethrtime_unscaled (15 samples, 0.03%) + + +kvm`native_load_tr_desc (18 samples, 0.04%) + + +kvm`vcpu_enter_guest (12 samples, 0.03%) + + +unix`membar_enter (21 samples, 0.05%) + + +kvm`pit_ioport_write (6 samples, 0.01%) + + +libc.so.1`set_parking_flag (6 samples, 0.01%) + + +qemu-system-x86_64`qemu_get_ram_ptr (6 samples, 0.01%) + + +kvm`is_protmode (7 samples, 0.02%) + + +genunix`cpu_decay (9 samples, 0.02%) + + +qemu-system-x86_64`kvm_flush_coalesced_mmio_buffer (8 samples, 0.02%) + + +unix`sys_syscall (38 samples, 0.08%) + + +kvm`gfn_to_gpa (17 samples, 0.04%) + + +kvm`__vcpu_run (40,015 samples, 87.17%) +kvm`__vcpu_run + + +unix`pg_ev_thread_swtch (12 samples, 0.03%) + + +libc.so.1`mutex_lock_impl (2,248 samples, 4.90%) +libc.. + + +kvm`is_protmode (14 samples, 0.03%) + + +qemu-system-x86_64`virtio_queue_notify_vq (863 samples, 1.88%) + + +libc.so.1`queue_lock (50 samples, 0.11%) + + +kvm`kvm_vcpu_is_bsp (32 samples, 0.07%) + + +unix`hat_getpfnum (334 samples, 0.73%) + + +kvm`kvm_ctx_restore (36 samples, 0.08%) + + +kvm`unalias_gfn_instantiation (8 samples, 0.02%) + + +kvm`kvm_emulate_pio (5 samples, 0.01%) + + +genunix`post_syscall (7 samples, 0.02%) + + +qemu-system-x86_64`kvm_irqchip_in_kernel (7 samples, 0.02%) + + +genunix`getf (6 samples, 0.01%) + + +kvm`dm_request_for_irq_injection (46 samples, 0.10%) + + +- (576 samples, 1.25%) + + +kvm`vmx_set_interrupt_shadow (30 samples, 0.07%) + + +kvm`gfn_to_memslot_unaliased (265 samples, 0.58%) + + +kvm`vmcs_read16 (16 samples, 0.03%) + + +kvm`hva_to_pfn (7 samples, 0.02%) + + +genunix`cv_waituntil_sig (63 samples, 0.14%) + + +kvm`kvm_mmu_page_fault (5,798 samples, 12.63%) +kvm`kvm_mmu_pag.. + + +genunix`kmem_cache_alloc (5 samples, 0.01%) + + +libc.so.1`mutex_unlock (6 samples, 0.01%) + + +unix`0xfffffffffb85a670 (5 samples, 0.01%) + + +fifofs`fifo_write (7 samples, 0.02%) + + +kvm`gfn_to_memslot_unaliased (14 samples, 0.03%) + + +genunix`lwp_kill (113 samples, 0.25%) + + +kvm`vmcs_writel (10 samples, 0.02%) + + +kvm`handle_ept_violation (5,921 samples, 12.90%) +kvm`handle_ept_.. + + +unix`0xfffffffffb800ca0 (13 samples, 0.03%) + + +kvm`vmcs_readl (16 samples, 0.03%) + + +kvm`gfn_to_hva (175 samples, 0.38%) + + +kvm`irqchip_in_kernel (42 samples, 0.09%) + + +unix`do_splx (8 samples, 0.02%) + + +genunix`cpu_update_pct (20 samples, 0.04%) + + +genunix`sigcheck (5 samples, 0.01%) + + +unix`0xfffffffffb85a670 (5 samples, 0.01%) + + +genunix`lwp_kill (5 samples, 0.01%) + + +genunix`disp_lock_exit (10 samples, 0.02%) + + +genunix`fop_ioctl (40,717 samples, 88.70%) +genunix`fop_ioctl + + +unix`sys_syscall (137 samples, 0.30%) + + +genunix`sigtimedwait (9 samples, 0.02%) + + +kvm`__vmx_load_host_state (13 samples, 0.03%) + + +libc.so.1`memcpy (97 samples, 0.21%) + + +kvm`apic_search_irr (12 samples, 0.03%) + + +genunix`gethrtime_unscaled (8 samples, 0.02%) + + +unix`sys_syscall (18 samples, 0.04%) + + +genunix`siginfofree (9 samples, 0.02%) + + +unix`mutex_enter (5 samples, 0.01%) + + +kvm`apic_get_reg (5 samples, 0.01%) + + +unix`sep_restore (15 samples, 0.03%) + + +libc.so.1`_lwp_kill (162 samples, 0.35%) + + +qemu-system-x86_64`kvm_main_loop_wait (1,061 samples, 2.31%) +q.. + + +genunix`thread_lock (6 samples, 0.01%) + + +kvm`vcpu_put (5 samples, 0.01%) + + +kvm`pit_has_pending_timer (15 samples, 0.03%) + + +qemu-system-x86_64`phys_page_find_alloc (24 samples, 0.05%) + + +kvm`gfn_to_memslot_unaliased (5 samples, 0.01%) + + +unix`lock_try (12 samples, 0.03%) + + +unix`atomic_add_32 (8 samples, 0.02%) + + +genunix`thread_lock (6 samples, 0.01%) + + +libc.so.1`set_parking_flag (24 samples, 0.05%) + + +kvm`reload_tss (5 samples, 0.01%) + + +kvm`kvm_is_error_hva (6 samples, 0.01%) + + +kvm`mmu_topup_memory_cache (21 samples, 0.05%) + + +kvm`vmx_flush_tlb (5 samples, 0.01%) + + +kvm`paging64_gpte_access (26 samples, 0.06%) + + +qemu-system-x86_64`virtio_ioport_write (881 samples, 1.92%) + + +kvm`kvm_apic_has_interrupt (34 samples, 0.07%) + + +unix`sep_save (7 samples, 0.02%) + + +kvm`kvm_get_rflags (9 samples, 0.02%) + + +genunix`gethrtime_unscaled (5 samples, 0.01%) + + +kvm`kvm_io_bus_write (37 samples, 0.08%) + + +kvm`kvm_rip_read (10 samples, 0.02%) + + +genunix`gethrtime_unscaled (5 samples, 0.01%) + + +unix`resume (54 samples, 0.12%) + + +kvm`apic_get_reg (6 samples, 0.01%) + + +kvm`x86_decode_insn (1,977 samples, 4.31%) +kvm.. + + +kvm`vmcs_readl (5 samples, 0.01%) + + +qemu-system-x86_64`lduw_le_p (8 samples, 0.02%) + + +kvm`gfn_to_memslot_unaliased (46 samples, 0.10%) + + +unix`atomic_add_64 (12 samples, 0.03%) + + +libc.so.1`__write (614 samples, 1.34%) + + +kvm`kvm_read_guest (10 samples, 0.02%) + + +genunix`sysconfig (5 samples, 0.01%) + + +kvm`mapping_level (407 samples, 0.89%) + + +genunix`memset (11 samples, 0.02%) + + +genunix`syscall_mstate (29 samples, 0.06%) + + +kvm`vmx_vcpu_load (11 samples, 0.02%) + + +unix`swtch (231 samples, 0.50%) + + +unix`caps_charge_adjust (22 samples, 0.05%) + + +libc.so.1`queue_unlock (9 samples, 0.02%) + + +kvm`vmx_cache_reg (37 samples, 0.08%) + + +qemu-system-x86_64`qemu_get_ram_ptr (27 samples, 0.06%) + + +genunix`issig (50 samples, 0.11%) + + +genunix`allocb (64 samples, 0.14%) + + +genunix`syscall_mstate (5 samples, 0.01%) + + +kvm`kvm_sigprocmask (8 samples, 0.02%) + + +genunix`new_mstate (17 samples, 0.04%) + + +kvm`x86_emulate_insn (14 samples, 0.03%) + + +genunix`syscall_mstate (8 samples, 0.02%) + + +unix`copyin (11 samples, 0.02%) + + +genunix`cyclic_reprogram (142 samples, 0.31%) + + +qemu-system-x86_64`phys_page_find_alloc (7 samples, 0.02%) + + +libc.so.1`__cerror (6 samples, 0.01%) + + +kvm`kvm_rip_read (10 samples, 0.02%) + + +genunix`cpu_decay (6 samples, 0.01%) + + +genunix`syscall_mstate (13 samples, 0.03%) + + +genunix`syscall_mstate (12 samples, 0.03%) + + +kvm`apic_get_reg (37 samples, 0.08%) + + +kvm`kvm_fetch_guest_virt (1,238 samples, 2.70%) +k.. + + +kvm`emulate_instruction (4,340 samples, 9.45%) +kvm`emulate.. + + +libc.so.1`mutex_unlock (11 samples, 0.02%) + + +genunix`timespecadd (6 samples, 0.01%) + + +kvm`kvm_set_shared_msr (45 samples, 0.10%) + + +unix`lock_try (8 samples, 0.02%) + + +kvm`gfn_to_gpa (5 samples, 0.01%) + + +kvm`gfn_to_hva (16 samples, 0.03%) + + +unix`bcopy (11 samples, 0.02%) + + +unix`0xfffffffffb85a60d (5 samples, 0.01%) + + +libc.so.1`mutex_trylock_adaptive (1,281 samples, 2.79%) +l.. + + +qemu-system-x86_64`vring_used_flags_set_bit (124 samples, 0.27%) + + +kvm`find_highest_vector (5 samples, 0.01%) + + +kvm`vmcs_readl (5 samples, 0.01%) + + +genunix`removectx (24 samples, 0.05%) + + +genunix`sleepq_unlink (9 samples, 0.02%) + + +kvm`apic_hw_enabled (7 samples, 0.02%) + + +qemu-system-x86_64`to_virtio_net (6 samples, 0.01%) + + +unix`sep_save (12 samples, 0.03%) + + +kvm`vmx_save_host_state (21 samples, 0.05%) + + +genunix`ioctl (6 samples, 0.01%) + + +kvm`vmcs_readl (9 samples, 0.02%) + + +genunix`sysconfig (5 samples, 0.01%) + + +kvm`vmcs_write16 (9 samples, 0.02%) + + +unix`lock_set_spl (10 samples, 0.02%) + + +genunix`memset (25 samples, 0.05%) + + +unix`resume (112 samples, 0.24%) + + +kvm`gfn_to_hva (40 samples, 0.09%) + + +genunix`disp_lock_exit (8 samples, 0.02%) + + +genunix`issig (28 samples, 0.06%) + + +genunix`write (539 samples, 1.17%) + + +qemu-system-x86_64`qemu_notify_event (659 samples, 1.44%) + + +genunix`sleepq_insert (29 samples, 0.06%) + + +libc.so.1`sysconf (10 samples, 0.02%) + + +qemu-system-x86_64`apic_irq_pending (15 samples, 0.03%) + + +unix`lwp_segregs_restore (16 samples, 0.03%) + + +libc.so.1`_syscall6 (58 samples, 0.13%) + + +FSS`fss_sleep (77 samples, 0.17%) + + +kvm`vmx_handle_exit (6,225 samples, 13.56%) +kvm`vmx_handle_e.. + + +kvm`test_and_clear_bit (73 samples, 0.16%) + + +genunix`schedctl_finish_sigblock (19 samples, 0.04%) + + +kvm`kvm_xcall (9 samples, 0.02%) + + +kvm`variable_test_bit (16 samples, 0.03%) + + +kvm`apic_enabled (40 samples, 0.09%) + + +unix`x86pte_access_pagetable (36 samples, 0.08%) + + +genunix`cv_waituntil_sig (86 samples, 0.19%) + + +kvm`kvm_lapic_sync_from_vapic (41 samples, 0.09%) + + +unix`send_dirint (5 samples, 0.01%) + + +kvm`kvm_register_read (22 samples, 0.05%) + + +unix`0xfffffffffb800c91 (38 samples, 0.08%) + + +kvm`kvm_ioctl (10 samples, 0.02%) + + +libc.so.1`mutex_lock_impl (417 samples, 0.91%) + + +libc.so.1`__lwp_park (799 samples, 1.74%) + + +kvm`kvm_inject_apic_timer_irqs (15 samples, 0.03%) + + +kvm`vmcs_readl (31 samples, 0.07%) + + +unix`tsc_read (5 samples, 0.01%) + + +unix`atomic_add_32 (5 samples, 0.01%) + + +kvm`mmu_topup_memory_cache (7 samples, 0.02%) + + +- (609 samples, 1.33%) + + +kvm`kvm_sigprocmask (41 samples, 0.09%) + + +kvm`mmu_topup_memory_cache (34 samples, 0.07%) + + +kvm`kvm_get_cr8 (7 samples, 0.02%) + + +kvm`vmcs_readl (5 samples, 0.01%) + + +kvm`is_error_pfn (9 samples, 0.02%) + + +unix`0xfffffffffb800c86 (7 samples, 0.02%) + + +kvm`vmcs_readl (5 samples, 0.01%) + + +kvm`is_protmode (6 samples, 0.01%) + + +genunix`mstate_thread_onproc_time (17 samples, 0.04%) + + +genunix`lwp_park (561 samples, 1.22%) + + +qemu-system-x86_64`phys_page_find (7 samples, 0.02%) + + +kvm`cache_all_regs (127 samples, 0.28%) + + +kvm`native_write_msr (20 samples, 0.04%) + + +kvm`skip_emulated_instruction (16 samples, 0.03%) + + +unix`sys_syscall (6 samples, 0.01%) + + +genunix`syscall_mstate (17 samples, 0.04%) + + +kvm`vcpu_mmio_write (10 samples, 0.02%) + + +unix`atomic_cas_32 (6 samples, 0.01%) + + +libc.so.1`sigismember (5 samples, 0.01%) + + +FSS`fss_active (5 samples, 0.01%) + + +genunix`lwp_park (78 samples, 0.17%) + + +unix`0xfffffffffb800ca0 (15 samples, 0.03%) + + +kvm`kvm_fire_urn (80 samples, 0.17%) + + +kvm`kvm_rip_read (5 samples, 0.01%) + + +genunix`undo_watch_step (5 samples, 0.01%) + + +unix`xc_sync (9 samples, 0.02%) + + +unix`mutex_enter (5 samples, 0.01%) + + +genunix`kmem_cache_alloc (10 samples, 0.02%) + + +unix`htable_lookup (19 samples, 0.04%) + + +genunix`gethrtime_unscaled (11 samples, 0.02%) + + +kvm`dm_request_for_irq_injection (47 samples, 0.10%) + + +genunix`sigpending (8 samples, 0.02%) + + +kvm`apic_get_reg (6 samples, 0.01%) + + +kvm`kvm_is_error_hva (13 samples, 0.03%) + + +qemu-system-x86_64`cpu_set_apic_tpr (8 samples, 0.02%) + + +unix`pc_gethrestime (8 samples, 0.02%) + + +kvm`writeback (1,525 samples, 3.32%) +kv.. + + +kvm`vmx_vcpu_load (22 samples, 0.05%) + + +qemu-system-x86_64`msix_enabled (6 samples, 0.01%) + + +qemu-system-x86_64`lduw_phys (9 samples, 0.02%) + + +kvm`x86_decode_insn (11 samples, 0.02%) + + +kvm`vmx_get_cs_db_l_bits (34 samples, 0.07%) + + +genunix`disp_lock_exit (6 samples, 0.01%) + + +specfs`spec_ioctl (40,704 samples, 88.67%) +specfs`spec_ioctl + + +unix`setfrontdq (99 samples, 0.22%) + + +kvm`vmcs_read16 (9 samples, 0.02%) + + +unix`do_interrupt (461 samples, 1.00%) + + +qemu-system-x86_64`pre_kvm_run (16 samples, 0.03%) + + +unix`tsc_read (9 samples, 0.02%) + + +unix`mutex_enter (10 samples, 0.02%) + + +kvm`kvm_register_read (6 samples, 0.01%) + + +qemu-system-x86_64`cpu_physical_memory_is_dirty (8 samples, 0.02%) + + +libc.so.1`mutex_lock_queue (22 samples, 0.05%) + + +- (83 samples, 0.18%) + + +- (21 samples, 0.05%) + + +unix`bcopy (11 samples, 0.02%) + + +kvm`vmx_get_rflags (7 samples, 0.02%) + + +kvm`do_fetch_insn_byte (1,293 samples, 2.82%) +k.. + + +qemu-system-x86_64`virtio_pci_config_writew (895 samples, 1.95%) + + +unix`splr (5 samples, 0.01%) + + +qemu-system-x86_64`kvm_arch_post_run (12 samples, 0.03%) + + +genunix`gethrtime_unscaled (5 samples, 0.01%) + + +genunix`ioctl (40,781 samples, 88.84%) +genunix`ioctl + + +unix`do_splx (8 samples, 0.02%) + + +genunix`cv_block (148 samples, 0.32%) + + +kvm`do_insn_fetch (1,339 samples, 2.92%) +kv.. + + +kvm`vmcs_writel (5 samples, 0.01%) + + +kvm`apic_has_pending_timer (7 samples, 0.02%) + + +kvm`vmcs_readl (24 samples, 0.05%) + + +unix`x86pte_release_pagetable (7 samples, 0.02%) + + +kvm`apic_hw_enabled (14 samples, 0.03%) + + +kvm`handle_interrupt_window (10 samples, 0.02%) + + +libc.so.1`sigpending (9 samples, 0.02%) + + +unix`do_splx (8 samples, 0.02%) + + +genunix`pollnotify (289 samples, 0.63%) + + +unix`0xfffffffffb800c86 (17 samples, 0.04%) + + +kvm`apic_find_highest_isr (7 samples, 0.02%) + + +libc.so.1`mutex_unlock (7 samples, 0.02%) + + +kvm`kvm_read_cr0_bits (9 samples, 0.02%) + + +kvm`kvm_is_error_hva (6 samples, 0.01%) + + +unix`mutex_enter (10 samples, 0.02%) + + +- (201 samples, 0.44%) + + +libc.so.1`mutex_trylock_adaptive (268 samples, 0.58%) + + +kvm`unalias_gfn_instantiation (5 samples, 0.01%) + + +fifofs`fifo_wakereader (336 samples, 0.73%) + + +genunix`memcpy (11 samples, 0.02%) + + +kvm`kvm_load_guest_fpu (18 samples, 0.04%) + + +kvm`kvm_xcall (15 samples, 0.03%) + + +kvm`vmx_get_rflags (5 samples, 0.01%) + + +kvm`do_fetch_insn_byte (59 samples, 0.13%) + + +kvm`native_read_msr (10 samples, 0.02%) + + +unix`x86pte_mapin (27 samples, 0.06%) + + +genunix`copyout_siginfo (9 samples, 0.02%) + + +genunix`syscall_mstate (13 samples, 0.03%) + + +genunix`pollwakeup (307 samples, 0.67%) + + +qemu-system-x86_64`kvm_handle_io (934 samples, 2.03%) + + +unix`splr (6 samples, 0.01%) + + +libc.so.1`_lwp_start (45,906 samples, 100.00%) +libc.so.1`_lwp_start + + +unix`atomic_add_64 (20 samples, 0.04%) + + +kvm`kvm_arch_vcpu_runnable (63 samples, 0.14%) + + +unix`mutex_enter (7 samples, 0.02%) + + +kvm`kvm_ioctl (40,666 samples, 88.59%) +kvm`kvm_ioctl + + +libc.so.1`enqueue (7 samples, 0.02%) + + +kvm`vmcs_readl (6 samples, 0.01%) + + +kvm`paging64_gpte_to_gfn_lvl (18 samples, 0.04%) + + +kvm`vmcs_read32 (18 samples, 0.04%) + + +kvm`paging64_gpte_access (13 samples, 0.03%) + + +kvm`vmx_vcpu_load (27 samples, 0.06%) + + +kvm`paging64_walk_addr (746 samples, 1.63%) + + +kvm`kvm_rip_read (6 samples, 0.01%) + + +kvm`__set_bit (16 samples, 0.03%) + + +qemu-system-x86_64`ioport_write (912 samples, 1.99%) + + +unix`0xfffffffffb800c86 (5 samples, 0.01%) + + +kvm`apic_mmio_in_range (11 samples, 0.02%) + + +kvm`kvm_read_guest_virt_helper (29 samples, 0.06%) + + +kvm`pit_ioport_write (5 samples, 0.01%) + + +FSS`fss_sleep (11 samples, 0.02%) + + +unix`_resume_from_idle (64 samples, 0.14%) + + +FSS`fss_inactive (8 samples, 0.02%) + + +kvm`test_and_clear_bit (273 samples, 0.59%) + + +kvm`cpu_has_virtual_nmis (8 samples, 0.02%) + + +kvm`kvm_cpu_has_pending_timer (241 samples, 0.52%) + + +genunix`issig_justlooking (192 samples, 0.42%) + + +kvm`apic_mmio_in_range (18 samples, 0.04%) + + +libc.so.1`no_preempt (5 samples, 0.01%) + + +genunix`cpu_decay (7 samples, 0.02%) + + +kvm`__vmx_load_host_state (32 samples, 0.07%) + + +qemu-system-x86_64`phys_page_find (26 samples, 0.06%) + + +FSS`fss_preempt (9 samples, 0.02%) + + +genunix`disp_lock_exit_nopreempt (11 samples, 0.02%) + + +genunix`sysconfig (5 samples, 0.01%) + + +qemu-system-x86_64`apic_update_irq (17 samples, 0.04%) + + +libc.so.1`sigtimedwait (14 samples, 0.03%) + + +unix`gdt_ucode_model (8 samples, 0.02%) + + +kvm`do_fetch_insn_byte (6 samples, 0.01%) + + +genunix`cv_wait_sig_swap (373 samples, 0.81%) + + +libc.so.1`mutex_unlock_queue (5 samples, 0.01%) + + +unix`0xfffffffffb800c91 (84 samples, 0.18%) + + +unix`x86pte_get (79 samples, 0.17%) + + +libc.so.1`write (9 samples, 0.02%) + + +kvm`kvm_is_error_hva (8 samples, 0.02%) + + +unix`splr (8 samples, 0.02%) + + +qemu-system-x86_64`virtio_queue_set_notification (135 samples, 0.29%) + + +kvm`kvm_on_user_return (6 samples, 0.01%) + + +genunix`new_mstate (46 samples, 0.10%) + + +kvm`gfn_to_memslot (303 samples, 0.66%) + + +genunix`sigaddqa (49 samples, 0.11%) + + +kvm`apic_sw_enabled (11 samples, 0.02%) + + +kvm`gfn_to_hva (6 samples, 0.01%) + + +genunix`syscall_mstate (20 samples, 0.04%) + + +kvm`gfn_to_memslot (22 samples, 0.05%) + + +genunix`issig (220 samples, 0.48%) + + +kvm`handle_ept_violation (19 samples, 0.04%) + + +qemu-system-x86_64`qemu_event_increment (631 samples, 1.37%) + + +unix`tsc_read (5 samples, 0.01%) + + +kvm`apic_set_eoi (225 samples, 0.49%) + + +unix`pc_gethrestime (5 samples, 0.01%) + + +kvm`kvm_arch_vcpu_load (38 samples, 0.08%) + + +genunix`syscall_mstate (19 samples, 0.04%) + + +kvm`emulate_instruction (36 samples, 0.08%) + + +kvm`kvm_lapic_sync_from_vapic (227 samples, 0.49%) + + +kvm`decode_register (8 samples, 0.02%) + + +kvm`paging64_gpte_access (22 samples, 0.05%) + + +kvm`vmx_get_rflags (30 samples, 0.07%) + + +unix`fpxsave_ctxt (28 samples, 0.06%) + + +kvm`vmcs_read16 (7 samples, 0.02%) + + +kvm`kvm_mmu_gva_to_gpa_write (814 samples, 1.77%) + + +kvm`seg_base (6 samples, 0.01%) + + +kvm`kvm_rip_write (11 samples, 0.02%) + + +unix`mutex_enter (5 samples, 0.01%) + + +kvm`irqchip_in_kernel (24 samples, 0.05%) + + +kvm`kvm_read_guest (11 samples, 0.02%) + + +kvm`apic_get_reg (6 samples, 0.01%) + + +genunix`issig_forreal (41 samples, 0.09%) + + +unix`mutex_enter (15 samples, 0.03%) + + +unix`do_splx (6 samples, 0.01%) + + +unix`mutex_enter (28 samples, 0.06%) + + +kvm`to_lapic (21 samples, 0.05%) + + +libc.so.1`sigtimedwait (11 samples, 0.02%) + + +genunix`cv_waituntil_sig (480 samples, 1.05%) + + +kvm`paging64_walk_addr (11 samples, 0.02%) + + +unix`mutex_enter (9 samples, 0.02%) + + +kvm`kvm_guest_exit (8 samples, 0.02%) + + +genunix`releasef (9 samples, 0.02%) + + +genunix`syscall_mstate (32 samples, 0.07%) + + +genunix`sigtoproc (44 samples, 0.10%) + + +kvm`kvm_read_guest (124 samples, 0.27%) + + +kvm`mmu_topup_memory_caches (41 samples, 0.09%) + + +genunix`post_syscall (31 samples, 0.07%) + + +genunix`sigorset (12 samples, 0.03%) + + +unix`do_splx (10 samples, 0.02%) + + +kvm`next_segment (11 samples, 0.02%) + + +kvm`kvm_put_guest_fpu (8 samples, 0.02%) + + +kvm`native_write_msr (19 samples, 0.04%) + + +FSS`fss_inactive (19 samples, 0.04%) + + +kvm`vmx_handle_exit (24 samples, 0.05%) + + +qemu-system-x86_64`kvm_arch_post_run (59 samples, 0.13%) + + +unix`av_dispatch_autovect (5 samples, 0.01%) + + +unix`cpucaps_charge (35 samples, 0.08%) + + +kvm`handle_external_interrupt (19 samples, 0.04%) + + +libc.so.1`spin_lock_set (6 samples, 0.01%) + + +genunix`cpu_update_pct (12 samples, 0.03%) + + +genunix`kmem_alloc (14 samples, 0.03%) + + +genunix`cv_wait_sig_swap_core (468 samples, 1.02%) + + +fifofs`fifo_write (446 samples, 0.97%) + + +kvm`paging64_gva_to_gpa (34 samples, 0.07%) + + +kvm`emulator_write_emulated_onepage (1,445 samples, 3.15%) +kv.. + + +kvm`is_protmode (14 samples, 0.03%) + + +unix`mutex_enter (70 samples, 0.15%) + + +qemu-system-x86_64`kvm_run (3,605 samples, 7.85%) +qemu-sys.. + + +kvm`kvm_iodevice_write (563 samples, 1.23%) + + +genunix`kmem_cache_free (5 samples, 0.01%) + + +genunix`cv_signal (264 samples, 0.58%) + + +genunix`disp_lock_exit_nopreempt (8 samples, 0.02%) + + +kvm`pic_irqchip (6 samples, 0.01%) + + +libc.so.1`sysconf (5 samples, 0.01%) + + +genunix`gethrestime (6 samples, 0.01%) + + +qemu-system-x86_64`ap_main_loop (45,906 samples, 100.00%) +qemu-system-x86_64`ap_main_loop + + +unix`lock_set_spl (11 samples, 0.02%) + + +kvm`kvm_arch_vcpu_load (24 samples, 0.05%) + + +unix`lock_set (14 samples, 0.03%) + + +qemu-system-x86_64`kvm_irqchip_in_kernel (8 samples, 0.02%) + + +kvm`paging64_gpte_access (23 samples, 0.05%) + + +kvm`tdp_page_fault (23 samples, 0.05%) + + +genunix`cv_wait_sig_swap (476 samples, 1.04%) + + +kvm`vmcs_readl (5 samples, 0.01%) + + +kvm`kvm_read_guest_virt_helper (1,096 samples, 2.39%) +k.. + + +kvm`cache_all_regs (8 samples, 0.02%) + + +kvm`kvm_mmu_page_fault (14 samples, 0.03%) + + +genunix`kmem_free (12 samples, 0.03%) + + +kvm`gfn_to_memslot_unaliased (38 samples, 0.08%) + + +kvm`find_highest_vector (12 samples, 0.03%) + + +qemu-system-x86_64`cpu_outw (919 samples, 2.00%) + + +kvm`host_mapping_level (5 samples, 0.01%) + + +genunix`ddi_get_soft_state (14 samples, 0.03%) + + +kvm`apic_has_pending_timer (104 samples, 0.23%) + + +kvm`kvm_read_guest (456 samples, 0.99%) + + +qemu-system-x86_64`kvm_arch_push_nmi (6 samples, 0.01%) + + +kvm`skip_emulated_instruction (12 samples, 0.03%) + + +kvm`vmx_vcpu_load (5 samples, 0.01%) + + +kvm`vmcs_readl (16 samples, 0.03%) + + +kvm`kvm_mmu_reload (46 samples, 0.10%) + + +kvm`apic_enabled (57 samples, 0.12%) + + +genunix`gethrtime_unscaled (6 samples, 0.01%) + + +unix`_resume_from_idle (15 samples, 0.03%) + + +genunix`gethrtime_unscaled (6 samples, 0.01%) + + +kvm`apic_mmio_write (6 samples, 0.01%) + + +qemu-system-x86_64`kvm_cpu_is_stopped (5 samples, 0.01%) + + +unix`_resume_from_idle (5 samples, 0.01%) + + +kvm`vmx_get_cpl (59 samples, 0.13%) + + +kvm`fls (6 samples, 0.01%) + + +unix`mutex_enter (11 samples, 0.02%) + + +kvm`kvm_on_user_return (21 samples, 0.05%) + + +kvm`gfn_to_hva (169 samples, 0.37%) + + +genunix`sigcheck (6 samples, 0.01%) + + +FSS`fss_active (30 samples, 0.07%) + + +kvm`unalias_gfn_instantiation (8 samples, 0.02%) + + +unix`htable_va2entry (7 samples, 0.02%) + + +qemu-system-x86_64`push_nmi (6 samples, 0.01%) + + +unix`tsc_read (11 samples, 0.02%) + + +kvm`vmx_set_rflags (9 samples, 0.02%) + + +kvm`kvm_arch_vcpu_put (69 samples, 0.15%) + + +qemu-system-x86_64`stw_phys (21 samples, 0.05%) + + +kvm`decode_modrm (9 samples, 0.02%) + + +kvm`variable_test_bit (17 samples, 0.04%) + + +unix`cbe_xcall (120 samples, 0.26%) + + +kvm`kvm_ioapic_update_eoi (7 samples, 0.02%) + + +unix`splr (21 samples, 0.05%) + + +genunix`syscall_mstate (9 samples, 0.02%) + + +kvm`find_highest_vector (29 samples, 0.06%) + + +kvm`vmx_set_interrupt_shadow (11 samples, 0.02%) + + +kvm`seg_override_base (6 samples, 0.01%) + + +FSS`fss_inactive (25 samples, 0.05%) + + +unix`atomic_add_64 (8 samples, 0.02%) + + +unix`tsc_read (5 samples, 0.01%) + + +kvm`kvm_iodevice_write (13 samples, 0.03%) + + +kvm`unalias_gfn (54 samples, 0.12%) + + +unix`cpu_wakeup_mwait (21 samples, 0.05%) + + +unix`lock_set (8 samples, 0.02%) + + +kvm`kernel_pio (51 samples, 0.11%) + + +genunix`cv_timedwait_sig_hires (66 samples, 0.14%) + + +unix`lock_try (16 samples, 0.03%) + + +libc.so.1`pthread_kill (8 samples, 0.02%) + + +kvm`do_insn_fetch (18 samples, 0.04%) + + +libc.so.1`sigemptyset (11 samples, 0.02%) + + +unix`0xfffffffffb800c91 (66 samples, 0.14%) + + +unix`xc_common (14 samples, 0.03%) + + +kvm`gfn_to_hva (12 samples, 0.03%) + + +kvm`apic_reg_write (443 samples, 0.97%) + + +unix`disp (20 samples, 0.04%) + + +kvm`apic_reg_write (12 samples, 0.03%) + + +genunix`syscall_mstate (14 samples, 0.03%) + + +kvm`gfn_to_memslot_unaliased (177 samples, 0.39%) + + +genunix`mstate_thread_onproc_time (13 samples, 0.03%) + + +kvm`kvm_apic_local_deliver (12 samples, 0.03%) + + +unix`bcopy (53 samples, 0.12%) + + +genunix`cyclic_reprogram_here (128 samples, 0.28%) + + +kvm`apic_find_highest_isr (28 samples, 0.06%) + + +kvm`vmcs_read32 (20 samples, 0.04%) + + +kvm`is_writable_pte (11 samples, 0.02%) + + +unix`mutex_exit (8 samples, 0.02%) + + +kvm`vcpu_mmio_write (579 samples, 1.26%) + + +libc.so.1`no_preempt (10 samples, 0.02%) + + +libc.so.1`_sysconfig (83 samples, 0.18%) + + +unix`atomic_add_64 (24 samples, 0.05%) + + +kvm`vapic_enter (5 samples, 0.01%) + + +kvm`vcpu_clear (15 samples, 0.03%) + + +genunix`fsig (7 samples, 0.02%) + + +qemu-system-x86_64`cpu_exit (5 samples, 0.01%) + + +kvm`kvm_arch_vcpu_ioctl_run (40,566 samples, 88.37%) +kvm`kvm_arch_vcpu_ioctl_run + + +kvm`do_insn_fetch (103 samples, 0.22%) + + +genunix`cv_wait_sig_swap_core (63 samples, 0.14%) + + +unix`sep_restore (6 samples, 0.01%) + + +kvm`kvm_read_guest (393 samples, 0.86%) + + +unix`htable_getpage (10 samples, 0.02%) + + +libc.so.1`spin_lock_set (24 samples, 0.05%) + + +genunix`lwp_hash_lookup (26 samples, 0.06%) + + +unix`bcopy (42 samples, 0.09%) + + +unix`x86pte_get (6 samples, 0.01%) + + +kvm`handle_interrupt_window (7 samples, 0.02%) + + +kvm`is_nx (6 samples, 0.01%) + + +genunix`idtot (26 samples, 0.06%) + + +unix`_resume_from_idle (44 samples, 0.10%) + + +kvm`kvm_set_rflags (45 samples, 0.10%) + + +kvm`decode_register_operand (14 samples, 0.03%) + + +unix`htable_lookup (63 samples, 0.14%) + + +unix`htable_getpte (212 samples, 0.46%) + + +genunix`post_syscall (58 samples, 0.13%) + + +unix`mutex_enter (17 samples, 0.04%) + + +unix`lwp_segregs_restore (7 samples, 0.02%) + + +libc.so.1`spin_lock_clear (8 samples, 0.02%) + + +unix`swtch (198 samples, 0.43%) + + +unix`lock_set (7 samples, 0.02%) + + +kvm`unalias_gfn_instantiation (27 samples, 0.06%) + + +kvm`emulator_write_emulated (5 samples, 0.01%) + + +kvm`kvm_vcpu_block (447 samples, 0.97%) + + +qemu-system-x86_64`qemu_bh_schedule (680 samples, 1.48%) + + +kvm`kvm_get_rflags (39 samples, 0.08%) + + +unix`splr (8 samples, 0.02%) + + +unix`lock_set (5 samples, 0.01%) + + +unix`sys_syscall (21 samples, 0.05%) + + +unix`bzero (112 samples, 0.24%) + + +kvm`emulator_write_emulated (1,488 samples, 3.24%) +kv.. + + +kvm`gfn_to_memslot_unaliased (11 samples, 0.02%) + + +unix`resume (6 samples, 0.01%) + + +unix`htable_release (14 samples, 0.03%) + + +kvm`decode_modrm (183 samples, 0.40%) + + +genunix`disp_lock_enter (36 samples, 0.08%) + + +kvm`gfn_to_pfn (18 samples, 0.04%) + + +unix`sys_syscall (609 samples, 1.33%) + + +qemu-system-x86_64`lduw_phys (71 samples, 0.15%) + + +kvm`apic_clear_vector (5 samples, 0.01%) + + +unix`atomic_add_64 (5 samples, 0.01%) + + +libc.so.1`mutex_lock (2,255 samples, 4.91%) +libc.. + + +kvm`kvm_read_cr0_bits (9 samples, 0.02%) + + +kvm`handle_halt (17 samples, 0.04%) + + +unix`pg_ev_thread_swtch (22 samples, 0.05%) + + +- (137 samples, 0.30%) + + +genunix`fop_write (471 samples, 1.03%) + + +genunix`gethrestime (10 samples, 0.02%) + + +genunix`cv_wait_sig_swap (63 samples, 0.14%) + + +libc.so.1`___errno (5 samples, 0.01%) + + +genunix`syscall_mstate (6 samples, 0.01%) + + +kvm`handle_io (95 samples, 0.21%) + + +genunix`thread_lock (10 samples, 0.02%) + + +kvm`paging64_gva_to_gpa (731 samples, 1.59%) + + +genunix`disp_lock_enter (11 samples, 0.02%) + + +kvm`gfn_to_pfn (648 samples, 1.41%) + + +unix`tsc_read (5 samples, 0.01%) + + +kvm`kvm_load_guest_fpu (81 samples, 0.18%) + + +all (45,906 samples, 100%) + + + +fifofs`fifo_rwunlock (5 samples, 0.01%) + + +unix`atomic_add_64 (8 samples, 0.02%) + + +kvm`is_protmode (10 samples, 0.02%) + + +kvm`kvm_register_read (83 samples, 0.18%) + + +FSS`fss_sleep (61 samples, 0.13%) + + +genunix`strpollwakeup (335 samples, 0.73%) + + +kvm`kvm_read_guest_page (6 samples, 0.01%) + + +kvm`paging64_gva_to_gpa (928 samples, 2.02%) + + +genunix`lwp_sigmask (5 samples, 0.01%) + + +kvm`vmx_vcpu_put (26 samples, 0.06%) + + +qemu-system-x86_64`kvm_flush_coalesced_mmio_buffer (13 samples, 0.03%) + + +genunix`set_active_fd (12 samples, 0.03%) + + +genunix`gethrtime_unscaled (5 samples, 0.01%) + + +unix`cpucaps_charge (54 samples, 0.12%) + + +unix`lock_set_spl (35 samples, 0.08%) + + +kvm`writeback (29 samples, 0.06%) + + +kvm`is_long_mode (10 samples, 0.02%) + + +unix`switch_sp_and_call (5 samples, 0.01%) + + +kvm`gfn_to_hva (220 samples, 0.48%) + + +kvm`kvm_inject_pending_timer_irqs (20 samples, 0.04%) + + +unix`mutex_enter (38 samples, 0.08%) + + +kvm`is_nx (29 samples, 0.06%) + + +unix`htable_release (10 samples, 0.02%) + + +genunix`memcpy (37 samples, 0.08%) + + +qemu-system-x86_64`cpu_set_apic_base (18 samples, 0.04%) + + +genunix`disp_lock_enter (12 samples, 0.03%) + + +unix`gdt_ucode_model (5 samples, 0.01%) + + +unix`copyin (17 samples, 0.04%) + + +unix`mutex_enter (8 samples, 0.02%) + + +genunix`restorectx (56 samples, 0.12%) + + +kvm`kvm_request_guest_time_update (7 samples, 0.02%) + + +kvm`vmx_get_cpl (58 samples, 0.13%) + + +unix`sys_syscall (12 samples, 0.03%) + + +kvm`vmx_get_cpl (8 samples, 0.02%) + + +kvm`vmx_get_rflags (25 samples, 0.05%) + + +kvm`apic_lvt_enabled (6 samples, 0.01%) + + +kvm`start_apic_timer (160 samples, 0.35%) + + +unix`disp (130 samples, 0.28%) + + +kvm`unalias_gfn_instantiation (9 samples, 0.02%) + + +genunix`post_syscall (77 samples, 0.17%) + + +unix`mutex_enter (5 samples, 0.01%) + + +genunix`kmem_free (7 samples, 0.02%) + + +kvm`native_write_msr (71 samples, 0.15%) + + +genunix`cdev_ioctl (40,688 samples, 88.63%) +genunix`cdev_ioctl + + +genunix`savectx (71 samples, 0.15%) + + +unix`xc_sync (14 samples, 0.03%) + + +kvm`vmx_get_rflags (14 samples, 0.03%) + + +kvm`kvm_read_guest_page (360 samples, 0.78%) + + +unix`0xfffffffffb800ca0 (11 samples, 0.02%) + + +unix`threadp (32 samples, 0.07%) + + +unix`bzero (12 samples, 0.03%) + + +genunix`new_mstate (20 samples, 0.04%) + + +genunix`cv_wait_sig_swap_core (355 samples, 0.77%) + + +unix`mutex_enter (9 samples, 0.02%) + + +kvm`post_kvm_run_save (33 samples, 0.07%) + + +kvm`kvm_read_guest_page (323 samples, 0.70%) + + +kvm`to_vmx (9 samples, 0.02%) + + +kvm`apic_find_highest_isr (40 samples, 0.09%) + + +unix`sys_syscall (8 samples, 0.02%) + + +kvm`clear_bit (18 samples, 0.04%) + + +genunix`memcpy (9 samples, 0.02%) + + +genunix`syscall_mstate (5 samples, 0.01%) + + +kvm`kvm_read_guest (21 samples, 0.05%) + + +kvm`kvm_fetch_guest_virt (15 samples, 0.03%) + + +genunix`gethrtime_unscaled (7 samples, 0.02%) + + +unix`bcopy_ck_size (12 samples, 0.03%) + + +unix`do_splx (13 samples, 0.03%) + + +kvm`vcpu_put (201 samples, 0.44%) + + +unix`tsc_read (8 samples, 0.02%) + + +unix`lock_set (10 samples, 0.02%) + + +libc.so.1`_thrp_setup (45,906 samples, 100.00%) +libc.so.1`_thrp_setup + + +genunix`new_mstate (12 samples, 0.03%) + + +FSS`fss_wakeup (10 samples, 0.02%) + + +kvm`kvm_arch_vcpu_load (5 samples, 0.01%) + + +kvm`kvm_mmu_reload (15 samples, 0.03%) + + +qemu-system-x86_64`virtio_queue_notify (874 samples, 1.90%) + + +genunix`scalehrtime (6 samples, 0.01%) + + +kvm`kvm_set_rflags (9 samples, 0.02%) + + +unix`disp_getwork (39 samples, 0.08%) + + +kvm`vcpu_load (82 samples, 0.18%) + + +unix`bitset_in_set (12 samples, 0.03%) + + +kvm`kvm_set_shared_msr (7 samples, 0.02%) + + +kvm`host_mapping_level (19 samples, 0.04%) + + +unix`copyin (12 samples, 0.03%) + + +unix`mutex_enter (11 samples, 0.02%) + + +kvm`apic_find_highest_isr (6 samples, 0.01%) + + +kvm`mmu_topup_memory_caches (43 samples, 0.09%) + + +kvm`vmx_interrupt_allowed (5 samples, 0.01%) + + +kvm`vmcs_readl (12 samples, 0.03%) + + +libc.so.1`___errno (12 samples, 0.03%) + + +genunix`kmem_zalloc (13 samples, 0.03%) + + +unix`atomic_add_64 (9 samples, 0.02%) + + +genunix`sigtimedwait (160 samples, 0.35%) + + diff --git a/tools/FlameGraph/demos/cpu-zoomable.html b/tools/FlameGraph/demos/cpu-zoomable.html new file mode 100644 index 0000000..0ec2677 --- /dev/null +++ b/tools/FlameGraph/demos/cpu-zoomable.html @@ -0,0 +1,14468 @@ + + + + + + Flame graph + + + + +

Flame graph

+
+ Hover over a block for summary information. Click a block for details. + Reset view +
+
+
+
+
+
+
+
+ + diff --git a/tools/FlameGraph/demos/hotcold-kernelthread.svg b/tools/FlameGraph/demos/hotcold-kernelthread.svg new file mode 100644 index 0000000..f6489c9 --- /dev/null +++ b/tools/FlameGraph/demos/hotcold-kernelthread.svg @@ -0,0 +1,535 @@ + + + + + + + + + + + + +Flame Graph +Function: + + + + + + + +sockfs`so_acceptq_dequeue + + + + + + + + +genunix.. + + + + + + + + + + + + + +genunix.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`so_acceptq_dequeue_locked + + + + + +genunix.. + + + + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`accept + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix`cv_wait_sig_swap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +genunix.. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`_sys_sysenter_post_swapgs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +unix`_s.. + + + + + + + + + + + + + + + + + + +genunix`cv_wait_sig_swap_core + + + + + + +sockfs`so_accept + + + + + + + + + + + + + + + + + + + + + + + + + + +sockfs`socket_accept + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/FlameGraph/demos/io-gzip.svg b/tools/FlameGraph/demos/io-gzip.svg new file mode 100644 index 0000000..1ff00b6 --- /dev/null +++ b/tools/FlameGraph/demos/io-gzip.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + +FS I/O Time Flame Graph + + +gzip`flush_outbuf (224 ms, 65.52%) +gzip`flush_outbuf + + +tail (2 ms, 0.58%) + + +gzip`send_bits (2 ms, 0.58%) + + +gzip`copy_block (224 ms, 65.52%) +gzip`copy_block + + +gzip`flush_outbuf (2 ms, 0.58%) + + +libc.so.1`_filbuf (1 ms, 0.29%) + + +zoneadmd`mcap_zone (6 ms, 1.75%) + + +tail`_start (2 ms, 0.58%) + + +zoneadmd`pageout_mapping (2 ms, 0.58%) + + +libc.so.1`_thrp_setup (6 ms, 1.75%) + + +gzip`fill_window (108 ms, 31.59%) +gzip`fill_window + + +gzip`file_read (108 ms, 31.59%) +gzip`file_read + + +libc.so.1`_syscall6 (1 ms, 0.29%) + + +libc.so.1`__write (2 ms, 0.58%) + + +all (342 ms, 100%) + + + +libproc.so.1`Psyscall (2 ms, 0.58%) + + +gzip`flush_block (226 ms, 66.10%) +gzip`flush_block + + +gzip`deflate (334 ms, 97.69%) +gzip`deflate + + +gzip`main (334 ms, 97.69%) +gzip`main + + +libc.so.1`__write (224 ms, 65.52%) +libc.so.1`__write + + +libc.so.1`__read (1 ms, 0.29%) + + +tail`follow (2 ms, 0.58%) + + +gzip (334 ms, 97.69%) +gzip + + +gzip`write_buf (224 ms, 65.52%) +gzip`write_buf + + +libc.so.1`__read (108 ms, 31.59%) +libc.so.1`__read + + +zoneadmd`pageout_process (6 ms, 1.75%) + + +libproc.so.1`pr_memcntl (2 ms, 0.58%) + + +tail`main (2 ms, 0.58%) + + +libc.so.1`syscall (1 ms, 0.29%) + + +zoneadmd (6 ms, 1.75%) + + +gzip`zip (334 ms, 97.69%) +gzip`zip + + +gzip`write_buf (2 ms, 0.58%) + + +gzip`_start (334 ms, 97.69%) +gzip`_start + + +zoneadmd`init_map (4 ms, 1.17%) + + +libc.so.1`__pread (2 ms, 0.58%) + + +libc.so.1`_lwp_start (6 ms, 1.75%) + + +libproc.so.1`Pscantext (2 ms, 0.58%) + + +libc.so.1`__read (3 ms, 0.88%) + + +tail`show (1 ms, 0.29%) + + +gzip`compress_block (2 ms, 0.58%) + + +gzip`treat_file (334 ms, 97.69%) +gzip`treat_file + + diff --git a/tools/FlameGraph/demos/io-mysql.svg b/tools/FlameGraph/demos/io-mysql.svg new file mode 100644 index 0000000..8367457 --- /dev/null +++ b/tools/FlameGraph/demos/io-mysql.svg @@ -0,0 +1,616 @@ + + + + + + + + + + + + +FS I/O Time Flame Graph + + +nss_dns.so.1`_nss_get_dns_ipnodes_name (0 ms, 0.00%) + + +libresolv_joy.so.2`__res_vinit (0 ms, 0.00%) + + +mysqld`make_join_statistics (733 ms, 75.47%) +mysqld`make_join_statistics + + +libc.so.1`__read (147 ms, 15.13%) +libc.so.1`__read + + +mysqld`buf_page_get_gen (26 ms, 2.68%) +m.. + + +mysqld (735 ms, 75.67%) +mysqld + + +mysqld`check_quick_select (255 ms, 26.25%) +mysqld`check_quick_select + + +libc.so.1`__read (1 ms, 0.10%) + + +libc.so.1`getdents64 (0 ms, 0.00%) + + +mysqld`os_file_pread (229 ms, 23.58%) +mysqld`os_file_pread + + +mysqld`buf_read_page (26 ms, 2.68%) +m.. + + +mysqld`fil_io (229 ms, 23.58%) +mysqld`fil_io + + +mysqld`buf_page_get_gen (13 ms, 1.34%) + + +libc.so.1`__pread (465 ms, 47.87%) +libc.so.1`__pread + + +rsyslogd`doWriteInternal (0 ms, 0.00%) + + +mysqld`buf_read_page_low (13 ms, 1.34%) + + +libresolv_joy.so.2`joy_res_ninit (0 ms, 0.00%) + + +tail`show (1 ms, 0.10%) + + +libc.so.1`__pwrite (0 ms, 0.00%) + + +mysqld`handler::multi_range_read_info_const (255 ms, 26.25%) +mysqld`handler::multi_range_read_i.. + + +rsyslogd`qqueueEnqObjDirectBatch (0 ms, 0.00%) + + +rsyslogd`processAction (0 ms, 0.00%) + + +rsyslogd`finishBatch (0 ms, 0.00%) + + +libc.so.1`_filbuf (5 ms, 0.51%) + + +libc.so.1`__pwrite (0 ms, 0.00%) + + +mysqld`fil_io (0 ms, 0.00%) + + +libc.so.1`__read (5 ms, 0.51%) + + +nscd`nss_psearch (1 ms, 0.10%) + + +nscd`nsc_lookup (23 ms, 2.37%) +n.. + + +tar`putfile (147 ms, 15.13%) +tar`putfile + + +mysqld`fil_io (26 ms, 2.68%) +m.. + + +libc.so.1`__pread (229 ms, 23.58%) +libc.so.1`__pread + + +mysqld`fil_io (0 ms, 0.00%) + + +mysqld`ha_innobase::index_read (478 ms, 49.21%) +mysqld`ha_innobase::index_read + + +rsyslogd`msgConsumer (0 ms, 0.00%) + + +mysqld`os_file_read_func (13 ms, 1.34%) + + +mysqld`buf_do_flush_list_batch (0 ms, 0.00%) + + +mysqld`get_key_scans_params (255 ms, 26.25%) +mysqld`get_key_scans_params + + +0x8265952 (0 ms, 0.00%) + + +mysqld`buf_dblwr_flush_buffered_writes (0 ms, 0.00%) + + +rsyslogd`doSubmitToActionQBatch (0 ms, 0.00%) + + +mysqld`srv_master_thread (0 ms, 0.00%) + + +mysqld`btr_estimate_n_rows_in_range (255 ms, 26.25%) +mysqld`btr_estimate_n_rows_in_range + + +nscd`check_db_file (23 ms, 2.37%) +n.. + + +mysqld`mysql_execute_command (733 ms, 75.47%) +mysqld`mysql_execute_command + + +rsyslogd`doWriteCall (0 ms, 0.00%) + + +mysqld`fil_io (0 ms, 0.00%) + + +mysqld`os_file_write_func (0 ms, 0.00%) + + +libc.so.1`syscall (1 ms, 0.10%) + + +mysqld`io_handler_thread (0 ms, 0.00%) + + +mysqld`dispatch_command (733 ms, 75.47%) +mysqld`dispatch_command + + +mysqld`buf_read_page_low (465 ms, 47.87%) +mysqld`buf_read_page_low + + +mysqld`JOIN::optimize (733 ms, 75.47%) +mysqld`JOIN::optimize + + +nscd (82 ms, 8.44%) +nscd + + +0x836cedf (0 ms, 0.00%) + + +nscd`lookup (23 ms, 2.37%) +n.. + + +rsyslogd (0 ms, 0.00%) + + +nss_files.so.1`getbyname (0 ms, 0.00%) + + +mysqld`mysql_select (733 ms, 75.47%) +mysqld`mysql_select + + +rsyslogd`submitBatch (0 ms, 0.00%) + + +mysqld`Prepared_statement::execute_loop (733 ms, 75.47%) +mysqld`Prepared_statement::execute_loop + + +mysqld`row_search_for_mysql (478 ms, 49.21%) +mysqld`row_search_for_mysql + + +mysqld`buf_read_page (465 ms, 47.87%) +mysqld`buf_read_page + + +rsyslogd`strmFlush (0 ms, 0.00%) + + +rsyslogd`strmSchedWrite (0 ms, 0.00%) + + +init`getcmd (5 ms, 0.51%) + + +libc.so.1`__pwrite (0 ms, 0.00%) + + +mysqld`handler::ha_index_read_idx_map (478 ms, 49.21%) +mysqld`handler::ha_index_read_idx_map + + +nss_files.so.1`__nss_files_XY_hostbyname (0 ms, 0.00%) + + +mysqld`os_file_pread (13 ms, 1.34%) + + +rsyslogd`processBatchDoActions (0 ms, 0.00%) + + +rsyslogd`doSubmitToActionQNotAllMarkBatch (0 ms, 0.00%) + + +mysqld`btr_cur_search_to_nth_level (229 ms, 23.58%) +mysqld`btr_cur_search_to_nth_l.. + + +rsyslogd`strmFlushInternal (0 ms, 0.00%) + + +0x8355ff5 (0 ms, 0.00%) + + +rsyslogd`llExecFunc (0 ms, 0.00%) + + +init`_start (5 ms, 0.51%) + + +mysqld`log_write_up_to (0 ms, 0.00%) + + +mysqld`fil_aio_wait (0 ms, 0.00%) + + +mysqld`buf_flush_list (1 ms, 0.10%) + + +mysqld`os_file_read_func (465 ms, 47.87%) +mysqld`os_file_read_func + + +libc.so.1`__write (0 ms, 0.00%) + + +rsyslogd`wtiWorker (0 ms, 0.00%) + + +rsyslogd`processBatch (0 ms, 0.00%) + + +libc.so.1`_lwp_start (735 ms, 75.67%) +libc.so.1`_lwp_start + + +rsyslogd`processBatchMain (0 ms, 0.00%) + + +rsyslogd`ConsumerReg (0 ms, 0.00%) + + +mysqld`buf_read_page (229 ms, 23.58%) +mysqld`buf_read_page + + +nscd`lookup_int (23 ms, 2.37%) +n.. + + +tail (2 ms, 0.21%) + + +mysqld`Prepared_statement::execute (733 ms, 75.47%) +mysqld`Prepared_statement::execute + + +mysqld`execute_sqlcom_select (733 ms, 75.47%) +mysqld`execute_sqlcom_select + + +mysqld`srv_sync_log_buffer_in_background (0 ms, 0.00%) + + +rsyslogd`strmPhysWrite (0 ms, 0.00%) + + +libc.so.1`__pread (13 ms, 1.34%) + + +rsyslogd`endTransaction (0 ms, 0.00%) + + +0x82a0e64 (0 ms, 0.00%) + + +mysqld`os_file_pread (465 ms, 47.87%) +mysqld`os_file_pread + + +mysqld`btr_pcur_move_to_next_page (13 ms, 1.34%) + + +mysqld`buf_read_page (13 ms, 1.34%) + + +libc.so.1`fgetc (5 ms, 0.51%) + + +libc.so.1`_filbuf (1 ms, 0.10%) + + +mysqld`fil_io (13 ms, 1.34%) + + +mysqld`ha_innobase::records_in_range (255 ms, 26.25%) +mysqld`ha_innobase::records_in_range + + +mysqld`os_aio_simulated_handle (0 ms, 0.00%) + + +mysqld`btr_cur_search_to_nth_level (465 ms, 47.87%) +mysqld`btr_cur_search_to_nth_level + + +postgres (0 ms, 0.00%) + + +mysqld`buf_page_get_gen (465 ms, 47.87%) +mysqld`buf_page_get_gen + + +libc.so.1`__door_return (82 ms, 8.44%) +libc.so.1.. + + +tail`main (2 ms, 0.21%) + + +tar`_start (147 ms, 15.13%) +tar`_start + + +mysqld`os_file_write_func (0 ms, 0.00%) + + +libc.so.1`__read (0 ms, 0.00%) + + +mysqld`mysqld_stmt_execute (733 ms, 75.47%) +mysqld`mysqld_stmt_execute + + +libc.so.1`fgets (0 ms, 0.00%) + + +libc.so.1`_filbuf (0 ms, 0.00%) + + +nss_files.so.1`_nss_files_read_line (0 ms, 0.00%) + + +libc.so.1`_lwp_start (0 ms, 0.00%) + + +libc.so.1`getc (5 ms, 0.51%) + + +mysqld`os_file_read_func (229 ms, 23.58%) +mysqld`os_file_read_func + + +mysqld`fil_io (465 ms, 47.87%) +mysqld`fil_io + + +rsyslogd`processBatchDoRules (0 ms, 0.00%) + + +mysqld`handler::index_read_idx_map (478 ms, 49.21%) +mysqld`handler::index_read_idx_map + + +0x80b5713 (0 ms, 0.00%) + + +mysqld`buf_flush_page_cleaner_thread (1 ms, 0.10%) + + +libc.so.1`__pread (26 ms, 2.68%) +l.. + + +mysqld`btr_pcur_move_to_next (13 ms, 1.34%) + + +mysqld`log_group_write_buf (0 ms, 0.00%) + + +libc.so.1`syscall (23 ms, 2.37%) +l.. + + +mysqld`log_write_up_to (0 ms, 0.00%) + + +libc.so.1`__pwrite (0 ms, 0.00%) + + +mysqld`log_group_write_buf (0 ms, 0.00%) + + +tail`follow (2 ms, 0.21%) + + +mysqld`buf_flush_page_and_try_neighbors (0 ms, 0.00%) + + +nss_dns.so.1`_nss_dns_gethost_withttl (0 ms, 0.00%) + + +rsyslogd`doQueueEnqObjDirectBatch (0 ms, 0.00%) + + +mysqld`os_file_write_func (0 ms, 0.00%) + + +tar`putfile (147 ms, 15.13%) +tar`putfile + + +nscd`switcher (82 ms, 8.44%) +nscd`swit.. + + +mysqld`pfs_spawn_thread (733 ms, 75.47%) +mysqld`pfs_spawn_thread + + +nscd`nss_search (1 ms, 0.10%) + + +init`remv (5 ms, 0.51%) + + +init (5 ms, 0.51%) + + +mysqld`buf_read_page_low (26 ms, 2.68%) +m.. + + +mysqld`os_file_read_func (26 ms, 2.68%) +m.. + + +0x8264ec6 (0 ms, 0.00%) + + +all (971 ms, 100%) + + + +tar (147 ms, 15.13%) +tar + + +libc.so.1`syscall (59 ms, 6.07%) +libc.s.. + + +tail`_start (2 ms, 0.21%) + + +init`main (5 ms, 0.51%) + + +nscd`search_dns_withttl (0 ms, 0.00%) + + +mysqld`buf_page_get_gen (229 ms, 23.58%) +mysqld`buf_page_get_gen + + +0x8391f3a (0 ms, 0.00%) + + +rsyslogd`wtpWorker (0 ms, 0.00%) + + +mysqld`join_read_const (478 ms, 49.21%) +mysqld`join_read_const + + +libc.so.1`_thrp_setup (0 ms, 0.00%) + + +mysqld`buf_read_page_low (229 ms, 23.58%) +mysqld`buf_read_page_low + + +mysqld`SQL_SELECT::test_quick_select (255 ms, 26.25%) +mysqld`SQL_SELECT::test_quick_select + + +rsyslogd`llExecFunc (0 ms, 0.00%) + + +mysqld`handle_one_connection (733 ms, 75.47%) +mysqld`handle_one_connection + + +mysqld`join_read_const_table (478 ms, 49.21%) +mysqld`join_read_const_table + + +tar`main (147 ms, 15.13%) +tar`main + + +mysqld`handle_select (733 ms, 75.47%) +mysqld`handle_select + + +mysqld`DsMrr_impl::dsmrr_info_const (255 ms, 26.25%) +mysqld`DsMrr_impl::dsmrr_info_const + + +mysqld`log_buffer_sync_in_background (0 ms, 0.00%) + + +libc.so.1`_thrp_setup (735 ms, 75.67%) +libc.so.1`_thrp_setup + + +nscd`_nscd_restart_if_cfgfile_changed (59 ms, 6.07%) +nscd`_.. + + +mysqld`buf_flush_page (0 ms, 0.00%) + + +tar`dorep (147 ms, 15.13%) +tar`dorep + + +mysqld`os_file_write_func (0 ms, 0.00%) + + +mysqld`os_file_pread (26 ms, 2.68%) +m.. + + +mysqld`do_handle_one_connection (733 ms, 75.47%) +mysqld`do_handle_one_connection + + +rsyslogd`processBatch (0 ms, 0.00%) + + diff --git a/tools/FlameGraph/demos/mallocbytes-bash.svg b/tools/FlameGraph/demos/mallocbytes-bash.svg new file mode 100644 index 0000000..37507b6 --- /dev/null +++ b/tools/FlameGraph/demos/mallocbytes-bash.svg @@ -0,0 +1,646 @@ + + + + + + + + + + + + +malloc() bytes + + +bash`rl_begin_undo_group (40 bytes, 0.08%) + + +bash`test_for_directory (5 bytes, 0.01%) + + +bash`xmalloc (132 bytes, 0.26%) + + +bash`execute_simple_command (4,517 bytes, 8.96%) +bash`e.. + + +bash`parameter_brace_remove_pattern (4,444 bytes, 8.82%) +bash`p.. + + +bash`malloc (92 bytes, 0.18%) + + +bash`main (50,408 bytes, 100.00%) +bash`main + + +bash`rl_completion_matches (394 bytes, 0.78%) + + +bash`malloc (100 bytes, 0.20%) + + +bash`rl_display_match_list (621 bytes, 1.23%) + + +bash`rl_end_undo_group (40 bytes, 0.08%) + + +bash`xdupmbstowcs (10,496 bytes, 20.82%) +bash`xdupmbstowcs + + +bash`postprocess_matches (3,036 bytes, 6.02%) +bash.. + + +bash`rl_filename_completion_function (3,510 bytes, 6.96%) +bash.. + + +bash`malloc (562 bytes, 1.11%) + + +bash`malloc (528 bytes, 1.05%) + + +bash`remove_pattern (4,444 bytes, 8.82%) +bash`r.. + + +bash`malloc (32 bytes, 0.06%) + + +bash`parse_and_execute (4,517 bytes, 8.96%) +bash`p.. + + +bash`history_filename (60 bytes, 0.12%) + + +bash`malloc (10 bytes, 0.02%) + + +bash`malloc (6,400 bytes, 12.70%) +bash`malloc + + +bash`readline_internal_teardown (32 bytes, 0.06%) + + +bash`alloc_undo_entry (20 bytes, 0.04%) + + +bash`xstrmatch (6,400 bytes, 12.70%) +bash`xstrm.. + + +bash`malloc (349 bytes, 0.69%) + + +bash`rl_completion_matches (20,171 bytes, 40.02%) +bash`rl_completion_matches + + +bash`xmalloc (5 bytes, 0.01%) + + +bash`rl_add_undo (40 bytes, 0.08%) + + +bash`yy_readline_get (25,774 bytes, 51.13%) +bash`yy_readline_get + + +bash`xmalloc (49 bytes, 0.10%) + + +bash`expand_word_internal (4,444 bytes, 8.82%) +bash`e.. + + +bash`execute_builtin (73 bytes, 0.14%) + + +libc.so.1`strcoll (480 bytes, 0.95%) + + +bash`execute_simple_command (17,728 bytes, 35.17%) +bash`execute_simple_command + + +bash`rl_add_undo (40 bytes, 0.08%) + + +bash`bash_tilde_expand (13 bytes, 0.03%) + + +bash`xmalloc (8 bytes, 0.02%) + + +bash`glob_pattern_p (16,512 bytes, 32.76%) +bash`glob_pattern_p + + +bash`xmalloc (44 bytes, 0.09%) + + +bash`bash_default_completion (20,304 bytes, 40.28%) +bash`bash_default_completion + + +bash`xmalloc (3,510 bytes, 6.96%) +bash.. + + +bash`xmalloc (20 bytes, 0.04%) + + +bash`_rl_qsort_string_compare (2,352 bytes, 4.67%) +ba.. + + +bash`xmalloc (528 bytes, 1.05%) + + +bash`rl_add_undo (40 bytes, 0.08%) + + +bash`alloc_undo_entry (40 bytes, 0.08%) + + +bash`tilde_expand (13 bytes, 0.03%) + + +bash`malloc (11 bytes, 0.02%) + + +bash`read_token (28,163 bytes, 55.87%) +bash`read_token + + +bash`bash_add_history (85 bytes, 0.17%) + + +bash`malloc (128 bytes, 0.25%) + + +libc.so.1`qsort (2,352 bytes, 4.67%) +li.. + + +bash`malloc (10,496 bytes, 20.82%) +bash`malloc + + +bash`readline (25,774 bytes, 51.13%) +bash`readline + + +bash`malloc (132 bytes, 0.26%) + + +bash`tilde_expand (621 bytes, 1.23%) + + +bash`execute_command_internal (4,517 bytes, 8.96%) +bash`e.. + + +bash`parse_command (32,680 bytes, 64.83%) +bash`parse_command + + +bash`history_builtin (73 bytes, 0.14%) + + +all (50,408 bytes, 100%) + + + +bash`malloc (40 bytes, 0.08%) + + +bash`malloc (128 bytes, 0.25%) + + +bash`malloc (16,512 bytes, 32.76%) +bash`malloc + + +bash`expand_word_list_internal (4,444 bytes, 8.82%) +bash`e.. + + +bash`xmalloc (32 bytes, 0.06%) + + +bash`rl_add_undo (100 bytes, 0.20%) + + +bash`shell_getc (28,163 bytes, 55.87%) +bash`shell_getc + + +bash`tilde_expand_word (59 bytes, 0.12%) + + +bash`maybe_append_history (73 bytes, 0.14%) + + +bash`append_history (73 bytes, 0.14%) + + +bash`_start (50,408 bytes, 100.00%) +bash`_start + + +bash`_rl_insert_char (100 bytes, 0.20%) + + +bash`malloc (3,510 bytes, 6.96%) +bash.. + + +bash`_rl_dispatch (24,686 bytes, 48.97%) +bash`_rl_dispatch + + +bash`xmalloc (562 bytes, 1.11%) + + +bash`append_to_match (25 bytes, 0.05%) + + +bash`glob_pattern_p (128 bytes, 0.25%) + + +bash`xmalloc (59 bytes, 0.12%) + + +bash`malloc (20 bytes, 0.04%) + + +libc.so.1`strcoll (2,352 bytes, 4.67%) +li.. + + +bash`malloc (40 bytes, 0.08%) + + +bash`alloc_undo_entry (20 bytes, 0.04%) + + +bash`param_expand (4,444 bytes, 8.82%) +bash`p.. + + +bash`test_for_directory (13 bytes, 0.03%) + + +bash`xdupmbstowcs (128 bytes, 0.25%) + + +bash`malloc (480 bytes, 0.95%) + + +bash`rl_set_prompt (1,056 bytes, 2.09%) + + +bash`xmalloc (40 bytes, 0.08%) + + +bash`rl_add_undo (20 bytes, 0.04%) + + +bash`xdupmbstowcs (128 bytes, 0.25%) + + +bash`history_do_write (73 bytes, 0.14%) + + +bash`xdupmbstowcs (128 bytes, 0.25%) + + +bash`pre_process_line (2,389 bytes, 4.74%) +ba.. + + +bash`xmalloc (36 bytes, 0.07%) + + +bash`xdupmbstowcs (6,400 bytes, 12.70%) +bash`xdupm.. + + +bash`alloc_history_entry (49 bytes, 0.10%) + + +bash`malloc (36 bytes, 0.07%) + + +bash`xmalloc (528 bytes, 1.05%) + + +bash`xmalloc (684 bytes, 1.36%) + + +bash`xmalloc (10 bytes, 0.02%) + + +bash`rl_insert_text (40 bytes, 0.08%) + + +bash`rl_add_undo (20 bytes, 0.04%) + + +bash`expand_word_list_internal (17,728 bytes, 35.17%) +bash`expand_word_list_internal + + +bash`xmalloc (20 bytes, 0.04%) + + +bash`xmalloc (60 bytes, 0.12%) + + +bash`command_word_completion_function (20,035 bytes, 39.75%) +bash`command_word_completion_function + + +bash`glob_vector (17,116 bytes, 33.95%) +bash`glob_vector + + +bash`malloc (8 bytes, 0.02%) + + +bash`bash_tilde_expand (5 bytes, 0.01%) + + +bash`_rl_replace_text (165 bytes, 0.33%) + + +bash`tilde_expand (5 bytes, 0.01%) + + +bash`reader_loop (50,408 bytes, 100.00%) +bash`reader_loop + + +bash`xmalloc (349 bytes, 0.69%) + + +bash`alloc_undo_entry (40 bytes, 0.08%) + + +bash`execute_command (17,728 bytes, 35.17%) +bash`execute_command + + +bash`_rl_dispatch_subseq (24,686 bytes, 48.97%) +bash`_rl_dispatch_subseq + + +bash`glob_filename (17,248 bytes, 34.22%) +bash`glob_filename + + +bash`alloc_undo_entry (40 bytes, 0.08%) + + +bash`malloc (2,352 bytes, 4.67%) +ba.. + + +bash`execute_command_internal (4,517 bytes, 8.96%) +bash`e.. + + +bash`execute_command (4,517 bytes, 8.96%) +bash`e.. + + +bash`rl_copy_text (8 bytes, 0.02%) + + +bash`maybe_add_history (2,389 bytes, 4.74%) +ba.. + + +bash`rl_delete_text (45 bytes, 0.09%) + + +bash`yyparse (28,163 bytes, 55.87%) +bash`yyparse + + +bash`malloc (59 bytes, 0.12%) + + +bash`really_add_history (85 bytes, 0.17%) + + +bash`expand_prompt (528 bytes, 1.05%) + + +bash`execute_variable_command (4,517 bytes, 8.96%) +bash`e.. + + +bash`gen_completion_matches (20,304 bytes, 40.28%) +bash`gen_completion_matches + + +bash`attempt_shell_completion (20,304 bytes, 40.28%) +bash`attempt_shell_completion + + +bash`rl_expand_prompt (528 bytes, 1.05%) + + +bash`malloc (40 bytes, 0.08%) + + +bash`rl_complete_internal (24,564 bytes, 48.73%) +bash`rl_complete_internal + + +bash`xmalloc (40 bytes, 0.08%) + + +bash`strvec_sort (480 bytes, 0.95%) + + +bash`malloc (528 bytes, 1.05%) + + +bash`tilde_expand (5 bytes, 0.01%) + + +bash`xmalloc (11 bytes, 0.02%) + + +bash`malloc (1,628 bytes, 3.23%) +b.. + + +bash`malloc (60 bytes, 0.12%) + + +bash`rl_delete_text (22 bytes, 0.04%) + + +bash`add_history (85 bytes, 0.17%) + + +bash`rl_copy_text (5 bytes, 0.01%) + + +bash`rl_insert_text (20 bytes, 0.04%) + + +bash`malloc (5 bytes, 0.01%) + + +bash`xdupmbstowcs (2,304 bytes, 4.57%) +ba.. + + +bash`xstrmatch (2,304 bytes, 4.57%) +ba.. + + +bash`print_filename (621 bytes, 1.23%) + + +bash`xdupmbstowcs (2,816 bytes, 5.59%) +bas.. + + +bash`xdupmbstowcs (16,512 bytes, 32.76%) +bash`xdupmbstowcs + + +bash`readline_internal_char (24,686 bytes, 48.97%) +bash`readline_internal_char + + +bash`execute_connection (4,517 bytes, 8.96%) +bash`e.. + + +bash`malloc (44 bytes, 0.09%) + + +bash`xmalloc (40 bytes, 0.08%) + + +libc.so.1`wcsdup (1,628 bytes, 3.23%) +l.. + + +bash`malloc (128 bytes, 0.25%) + + +bash`alloc_undo_entry (40 bytes, 0.08%) + + +bash`glob_pattern_p (128 bytes, 0.25%) + + +bash`rl_add_undo (40 bytes, 0.08%) + + +libc.so.1`qsort (480 bytes, 0.95%) + + +bash`shell_glob_filename (17,728 bytes, 35.17%) +bash`shell_glob_filename + + +bash`_rl_rubout_char (22 bytes, 0.04%) + + +bash`insert_match (165 bytes, 0.33%) + + +bash`xmalloc (40 bytes, 0.08%) + + +bash`parameter_brace_expand (4,444 bytes, 8.82%) +bash`p.. + + +bash`malloc (2,816 bytes, 5.59%) +bas.. + + +bash`read_command (32,680 bytes, 64.83%) +bash`read_command + + +bash`display_matches (621 bytes, 1.23%) + + +bash`xmalloc (100 bytes, 0.20%) + + +bash`expand_word_internal (4,444 bytes, 8.82%) +bash`e.. + + +bash`malloc (49 bytes, 0.10%) + + +bash`glob_pattern_p (128 bytes, 0.25%) + + +bash`rl_filename_completion_function (349 bytes, 0.69%) + + +bash`alloc_undo_entry (100 bytes, 0.20%) + + +bash`rl_insert_text (100 bytes, 0.20%) + + +bash`malloc (2,304 bytes, 4.57%) +ba.. + + +bash`malloc (40 bytes, 0.08%) + + +bash`strvec_strcmp (480 bytes, 0.95%) + + +bash`malloc (20 bytes, 0.04%) + + +bash`malloc (684 bytes, 1.36%) + + +bash`execute_command_internal (17,728 bytes, 35.17%) +bash`execute_command_internal + + +bash`malloc (13 bytes, 0.03%) + + +bash`check_add_history (2,389 bytes, 4.74%) +ba.. + + diff --git a/tools/FlameGraph/demos/off-bash.svg b/tools/FlameGraph/demos/off-bash.svg new file mode 100644 index 0000000..e5839f8 --- /dev/null +++ b/tools/FlameGraph/demos/off-bash.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + +Off-CPU Time Flame Graph + + +bash`shell_getc (12,589 ms, 91.29%) +bash`shell_getc + + +bash`yy_readline_get (12,589 ms, 91.29%) +bash`yy_readline_get + + +libc.so.1`__read (12,589 ms, 91.29%) +libc.so.1`__read + + +bash`execute_command (1,201 ms, 8.71%) +bash`.. + + +libc.so.1`waitpid (1,193 ms, 8.65%) +libc... + + +bash`execute_simple_command (8 ms, 0.06%) + + +all (13,790 ms, 100%) + + + +bash`read_token (12,589 ms, 91.29%) +bash`read_token + + +bash`rl_read_key (12,589 ms, 91.29%) +bash`rl_read_key + + +bash`main (13,790 ms, 100.00%) +bash`main + + +bash`file_status (8 ms, 0.06%) + + +bash`readline_internal_char (12,589 ms, 91.29%) +bash`readline_internal_char + + +bash`reader_loop (13,790 ms, 100.00%) +bash`reader_loop + + +bash`find_user_command_in_path (8 ms, 0.06%) + + +bash`read_command (12,589 ms, 91.29%) +bash`read_command + + +bash`search_for_command (8 ms, 0.06%) + + +bash`rl_getc (12,589 ms, 91.29%) +bash`rl_getc + + +bash`_start (13,790 ms, 100.00%) +bash`_start + + +bash`waitchld (1,193 ms, 8.65%) +bash`.. + + +libc.so.1`__waitid (1,193 ms, 8.65%) +libc... + + +bash`wait_for (1,193 ms, 8.65%) +bash`.. + + +bash`yyparse (12,589 ms, 91.29%) +bash`yyparse + + +libc.so.1`syscall (8 ms, 0.06%) + + +bash`find_user_command_internal (8 ms, 0.06%) + + +bash`readline (12,589 ms, 91.29%) +bash`readline + + +bash`find_in_path_element (8 ms, 0.06%) + + +bash`execute_command_internal (1,201 ms, 8.71%) +bash`.. + + +bash`parse_command (12,589 ms, 91.29%) +bash`parse_command + + diff --git a/tools/FlameGraph/demos/off-mysql-busy.svg b/tools/FlameGraph/demos/off-mysql-busy.svg new file mode 100644 index 0000000..e0e9e75 --- /dev/null +++ b/tools/FlameGraph/demos/off-mysql-busy.svg @@ -0,0 +1,904 @@ + + + + + + + + + + + + +Off-CPU Time Flame Graph + + +mysqld`evaluate_join_record (31,298 ms, 5.20%) +mysq.. + + +mysqld`net_send_eof (11,148 ms, 1.85%) + + +libc.so.1`__cond_timedwait (29,010 ms, 4.82%) +lib.. + + +mysqld`mysql_unlock_tables (458 ms, 0.08%) + + +libsocket.so.1`send (90 ms, 0.01%) + + +libc.so.1`pthread_cond_timedwait (29,008 ms, 4.82%) +lib.. + + +mysqld`row_search_for_mysql (175 ms, 0.03%) + + +mysqld`THD::enter_stage (359 ms, 0.06%) + + +mysqld`vio_socket_io_wait (289,523 ms, 48.09%) +mysqld`vio_socket_io_wait + + +mysqld`dict_stats_thread (20,000 ms, 3.32%) +my.. + + +mysqld`find_stage_class (329 ms, 0.05%) + + +mysqld`ib_wqueue_timedwait (25,005 ms, 4.15%) +mys.. + + +libc.so.1`cond_timedwait (20,000 ms, 3.32%) +li.. + + +libc.so.1`pthread_cond_timedwait (25,004 ms, 4.15%) +lib.. + + +mysqld`my_charpos_mb (9,892 ms, 1.64%) + + +mysqld`handler::index_read_idx_map (1,086 ms, 0.18%) + + +mysqld`net_read_packet (291,320 ms, 48.39%) +mysqld`net_read_packet + + +mysqld`buf_read_page_low (113 ms, 0.02%) + + +mysqld`hp_rec_hashnr (5,021 ms, 0.83%) + + +mysqld`close_thread_tables (1,656 ms, 0.28%) + + +libc.so.1`__so_recv (1,451 ms, 0.24%) + + +mysqld`os_thread_sleep (28,904 ms, 4.80%) +mys.. + + +mysqld`os_event_wait_time_low (20,000 ms, 3.32%) +my.. + + +mysqld`handler::multi_range_read_next (7,221 ms, 1.20%) + + +mysqld`log_slow_statement (764 ms, 0.13%) + + +mysqld`test_if_item_cache_changed (764 ms, 0.13%) + + +mysqld`inline_mysql_mutex_lock (203 ms, 0.03%) + + +mysqld`thr_multi_unlock (618 ms, 0.10%) + + +libc.so.1`select (28,904 ms, 4.80%) +lib.. + + +mysqld`Field_string::make_sort_key (1,486 ms, 0.25%) + + +mysqld`my_hash_sort_utf8 (178 ms, 0.03%) + + +libc.so.1`pselect (29,002 ms, 4.82%) +lib.. + + +mysqld`filesort (152 ms, 0.03%) + + +mysqld`calculate_key_len (135 ms, 0.02%) + + +mysqld`join_init_read_record (7,258 ms, 1.21%) + + +libc.so.1`__cond_wait (81 ms, 0.01%) + + +mysqld`QEP_tmp_table::end_send (288 ms, 0.05%) + + +mysqld`gtid_pre_statement_checks (1,050 ms, 0.17%) + + +mysqld`pfs_spawn_thread (365,930 ms, 60.79%) +mysqld`pfs_spawn_thread + + +mysqld`quick_range_seq_next (351 ms, 0.06%) + + +mysqld`inline_mysql_mutex_lock (84 ms, 0.01%) + + +mysqld`Protocol::send_result_set_metadata (681 ms, 0.11%) + + +mysqld`my_ismbchar_utf8 (201 ms, 0.03%) + + +libc.so.1`cond_wait_queue (20,000 ms, 3.32%) +li.. + + +mysqld`join_read_const (1,098 ms, 0.18%) + + +mysqld`handler::ha_index_next (7,033 ms, 1.17%) + + +mysqld`net_flush (92 ms, 0.02%) + + +mysqld`buf_read_page (113 ms, 0.02%) + + +mysqld`hp_write_key (22,916 ms, 3.81%) +my.. + + +libc.so.1`cond_wait_common (29,010 ms, 4.82%) +lib.. + + +libc.so.1`strlen (133 ms, 0.02%) + + +mysqld`mysql_lock_tables (448 ms, 0.07%) + + +mysqld`net_send_ok (93 ms, 0.02%) + + +libc.so.1`__lwp_park (29,008 ms, 4.82%) +lib.. + + +mysqld`log_slow_applicable (764 ms, 0.13%) + + +mysqld`row_sel_store_mysql_rec (4,099 ms, 0.68%) + + +mysqld`Field::send_binary (1,410 ms, 0.23%) + + +libc.so.1`mutex_lock_impl (82 ms, 0.01%) + + +mysqld`os_event_wait_time_low (25,005 ms, 4.15%) +mys.. + + +mysqld`hp_delete_key (5,063 ms, 0.84%) + + +mysqld`rr_quick (9,425 ms, 1.57%) + + +libc.so.1`__lwp_park (25,005 ms, 4.15%) +lib.. + + +mysqld`Prepared_statement::execute_loop (59,963 ms, 9.96%) +mysqld`Pre.. + + +mysqld`vio_write (91 ms, 0.02%) + + +libsocket.so.1`send (11,085 ms, 1.84%) + + +mysqld`btr_pcur_store_position (340 ms, 0.06%) + + +mysqld`dispatch_command (74,486 ms, 12.37%) +mysqld`dispat.. + + +mysqld`os_event_wait_low (81 ms, 0.01%) + + +mysqld`open_tables (3,179 ms, 0.53%) + + +mysqld`sub_select_op (290 ms, 0.05%) + + +mysqld`setup_conds (107 ms, 0.02%) + + +mysqld`os_aio_simulated_handle (50,008 ms, 8.31%) +mysqld`o.. + + +libc.so.1`pselect (28,904 ms, 4.80%) +lib.. + + +libc.so.1`_lwp_start (602,000 ms, 100.00%) +libc.so.1`_lwp_start + + +mysqld`srv_error_monitor_thread (29,011 ms, 4.82%) +mys.. + + +mysqld`heap_write (28,524 ms, 4.74%) +mys.. + + +mysqld`btr_estimate_n_rows_in_range (202 ms, 0.03%) + + +mysqld`handler::multi_range_read_info_const (235 ms, 0.04%) + + +libc.so.1`cond_wait_queue (25,005 ms, 4.15%) +lib.. + + +libc.so.1`gettimeofday (79 ms, 0.01%) + + +mysqld`handler::read_range_next (7,141 ms, 1.19%) + + +mysqld`end_send (1,640 ms, 0.27%) + + +libc.so.1`cond_timedwait (25,005 ms, 4.15%) +lib.. + + +libc.so.1`__pollsys (28,904 ms, 4.80%) +lib.. + + +mysqld`my_strnxfrm_unicode (1,367 ms, 0.23%) + + +libc.so.1`__lwp_park (50,008 ms, 8.31%) +libc.so... + + +libc.so.1`__pollsys (29,002 ms, 4.82%) +lib.. + + +libc.so.1`cond_wait_common (25,005 ms, 4.15%) +lib.. + + +mysqld`lock_tables (467 ms, 0.08%) + + +mysqld`0x71d1d8 (1,080 ms, 0.18%) + + +libc.so.1`__cond_wait (50,008 ms, 8.31%) +libc.so... + + +mysqld`row_sel_store_mysql_field_func (188 ms, 0.03%) + + +mysqld`sync_array_wait_event (81 ms, 0.01%) + + +mysqld`buf_flush_page_cleaner_thread (28,985 ms, 4.81%) +mys.. + + +libc.so.1`atomic_swap_32 (345 ms, 0.06%) + + +mysqld`JOIN::exec (49,402 ms, 8.21%) +mysqld`J.. + + +libc.so.1`pthread_cond_timedwait (25,005 ms, 4.15%) +lib.. + + +libc.so.1`__so_send (11,083 ms, 1.84%) + + +mysqld`lock_wait_timeout_thread (29,010 ms, 4.82%) +mys.. + + +mysqld`btr_search_guess_on_hash (77 ms, 0.01%) + + +mysqld`os_event_wait_low (50,008 ms, 8.31%) +mysqld`o.. + + +mysqld`join_init_read_record (263 ms, 0.04%) + + +libc.so.1`__lwp_park (25,004 ms, 4.15%) +lib.. + + +mysqld`get_key_scans_params (258 ms, 0.04%) + + +mysqld`ha_innobase::general_fetch (5,800 ms, 0.96%) + + +mysqld`JOIN::cleanup (84 ms, 0.01%) + + +mysqld`ha_commit_trans (406 ms, 0.07%) + + +mysqld`os_event_wait_time_low (25,004 ms, 4.15%) +mys.. + + +mysqld`thr_unlock (148 ms, 0.02%) + + +all (602,004 ms, 100%) + + + +mysqld`my_ismbchar_utf8 (444 ms, 0.07%) + + +mysqld`row_search_for_mysql (369 ms, 0.06%) + + +mysqld`filesort (7,170 ms, 1.19%) + + +mysqld`os_file_read_func (113 ms, 0.02%) + + +libc.so.1`__lwp_park (182 ms, 0.03%) + + +mysqld`handler::ha_index_read_idx_map (1,094 ms, 0.18%) + + +mysqld`JOIN::prepare (246 ms, 0.04%) + + +libc.so.1`__lwp_park (29,010 ms, 4.82%) +lib.. + + +mysqld`THD::enter_stage (136 ms, 0.02%) + + +libc.so.1`atomic_swap_32 (622 ms, 0.10%) + + +mysqld`row_sel_store_mysql_field_func (72 ms, 0.01%) + + +mysqld`rec_get_nth_field_offs (361 ms, 0.06%) + + +libc.so.1`pthread_cond_wait (81 ms, 0.01%) + + +mysqld`general_log_write (90 ms, 0.01%) + + +libc.so.1`select (29,002 ms, 4.82%) +lib.. + + +mysqld`hp_rec_key_cmp (12,096 ms, 2.01%) + + +mysqld`rw_lock_s_lock_spin (89 ms, 0.01%) + + +mysqld`net_read_raw_loop (291,026 ms, 48.34%) +mysqld`net_read_raw_loop + + +mysqld`handler::index_read_map (139 ms, 0.02%) + + +mysqld`QUICK_RANGE_SELECT::get_next (9,402 ms, 1.56%) + + +mysqld`os_event_wait_time_low (29,008 ms, 4.82%) +mys.. + + +mysqld`ha_commit_low (112 ms, 0.02%) + + +mysqld`end_write (28,630 ms, 4.76%) +mys.. + + +mysqld`handler::ha_write_row (28,554 ms, 4.74%) +mys.. + + +mysqld`handle_one_connection (365,930 ms, 60.79%) +mysqld`handle_one_connection + + +mysqld`select_send::send_result_set_metadata (720 ms, 0.12%) + + +mysqld`select_send::send_data (82 ms, 0.01%) + + +mysqld`select_precheck (411 ms, 0.07%) + + +mysqld`vio_io_wait (289,522 ms, 48.09%) +mysqld`vio_io_wait + + +mysqld`st_join_table::sort_table (250 ms, 0.04%) + + +mysqld`ha_heap::write_row (28,528 ms, 4.74%) +mys.. + + +mysqld`do_command (291,341 ms, 48.40%) +mysqld`do_command + + +libc.so.1`cond_wait_common (20,000 ms, 3.32%) +li.. + + +mysqld`JOIN::join_free (135 ms, 0.02%) + + +mysqld`hp_find_block (486 ms, 0.08%) + + +libc.so.1`__lwp_park (20,000 ms, 3.32%) +li.. + + +mysqld`JOIN::destroy (99 ms, 0.02%) + + +mysqld`setup_fields (76 ms, 0.01%) + + +mysqld`check_table_access (362 ms, 0.06%) + + +mysqld`my_strnncollsp_utf8 (1,700 ms, 0.28%) + + +mysqld`fil_io (113 ms, 0.02%) + + +libc.so.1`mutex_lock (79 ms, 0.01%) + + +mysqld`btr_cur_search_to_nth_level (212 ms, 0.04%) + + +mysqld`trans_register_ha (234 ms, 0.04%) + + +mysqld`my_ismbchar_utf8 (379 ms, 0.06%) + + +mysqld`ha_innobase::general_fetch (217 ms, 0.04%) + + +mysqld`thd_ha_data (1,103 ms, 0.18%) + + +mysqld`vio_write (11,096 ms, 1.84%) + + +libc.so.1`cond_timedwait (29,008 ms, 4.82%) +lib.. + + +mysqld`vio_read (291,023 ms, 48.34%) +mysqld`vio_read + + +libc.so.1`mutex_lock_impl (188 ms, 0.03%) + + +libc.so.1`__so_send (90 ms, 0.01%) + + +mysqld`make_join_statistics (1,699 ms, 0.28%) + + +mysqld`execute_sqlcom_select (56,499 ms, 9.39%) +mysqld`ex.. + + +mysqld`btr_cur_search_to_nth_level (188 ms, 0.03%) + + +mysqld`handler::read_range_next (4,363 ms, 0.72%) + + +mysqld`buf_page_get_gen (113 ms, 0.02%) + + +mysqld`net_write_packet (91 ms, 0.02%) + + +mysqld`Prepared_statement::execute (59,812 ms, 9.94%) +mysqld`Pre.. + + +mysqld`check_quick_select (255 ms, 0.04%) + + +mysqld`my_utf8_uni (677 ms, 0.11%) + + +mysqld`ha_innobase::index_read (892 ms, 0.15%) + + +libc.so.1`pthread_cond_timedwait (29,010 ms, 4.82%) +lib.. + + +libc.so.1`cond_timedwait (25,004 ms, 4.15%) +lib.. + + +mysqld`select_send::send_data (1,567 ms, 0.26%) + + +libc.so.1`cond_wait_queue (25,004 ms, 4.15%) +lib.. + + +libc.so.1`cond_wait_queue (81 ms, 0.01%) + + +mysqld`close_thread_table (238 ms, 0.04%) + + +mysqld`srv_monitor_thread (25,004 ms, 4.15%) +mys.. + + +libc.so.1`pthread_cond_timedwait (20,000 ms, 3.32%) +li.. + + +mysqld`mysql_parse (1,069 ms, 0.18%) + + +mysqld`fil_aio_wait (50,026 ms, 8.31%) +mysqld`f.. + + +mysqld`io_handler_thread (50,026 ms, 8.31%) +mysqld`i.. + + +mysqld`row_sel_field_store_in_mysql_format_func (163 ms, 0.03%) + + +mysqld`handler::read_range_next (1,075 ms, 0.18%) + + +mysqld`thr_multi_unlock (400 ms, 0.07%) + + +mysqld`mysql_select (53,262 ms, 8.85%) +mysqld`m.. + + +mysqld`handle_select (53,281 ms, 8.85%) +mysqld`ha.. + + +mysqld`DsMrr_impl::dsmrr_info_const (254 ms, 0.04%) + + +mysqld`row_search_for_mysql (4,483 ms, 0.74%) + + +mysqld`net_write_packet (11,116 ms, 1.85%) + + +mysqld`make_sortkey (1,587 ms, 0.26%) + + +mysqld`JOIN::optimize (2,514 ms, 0.42%) + + +mysqld`Protocol::send_result_set_row (109 ms, 0.02%) + + +libc.so.1`__cond_timedwait (29,008 ms, 4.82%) +lib.. + + +libc.so.1`_thrp_setup (602,000 ms, 100.00%) +libc.so.1`_thrp_setup + + +mysqld`TC_LOG_DUMMY::commit (114 ms, 0.02%) + + +mysqld`my_ismbchar_utf8 (3,199 ms, 0.53%) + + +libc.so.1`memcpy (837 ms, 0.14%) + + +libc.so.1`cond_wait_common (29,008 ms, 4.82%) +lib.. + + +mysqld`os_event_wait_time_low (29,010 ms, 4.82%) +mys.. + + +libc.so.1`cond_timedwait (29,010 ms, 4.82%) +lib.. + + +libc.so.1`__cond_timedwait (20,000 ms, 3.32%) +li.. + + +mysqld`my_ismbchar_utf8 (2,094 ms, 0.35%) + + +mysqld`page_cur_search_with_match (78 ms, 0.01%) + + +mysqld`os_file_pread (113 ms, 0.02%) + + +mysqld`QUICK_RANGE_SELECT::get_next (5,481 ms, 0.91%) + + +mysqld`st_join_table::sort_table (7,211 ms, 1.20%) + + +mysqld`my_net_read (291,331 ms, 48.39%) +mysqld`my_net_read + + +mysqld`my_utf8_uni (1,539 ms, 0.26%) + + +mysqld`open_table (202 ms, 0.03%) + + +mysqld`mysql_execute_command (59,609 ms, 9.90%) +mysqld`mys.. + + +mysqld`row_sel_store_mysql_rec (86 ms, 0.01%) + + +mysqld`my_ismbchar_utf8 (3,055 ms, 0.51%) + + +mysqld`join_read_const_table (1,177 ms, 0.20%) + + +libc.so.1`poll (289,515 ms, 48.09%) +libc.so.1`poll + + +mysqld`st_select_lex::cleanup (103 ms, 0.02%) + + +libc.so.1`__pread (113 ms, 0.02%) + + +mysqld`hp_rec_hashnr (10,779 ms, 1.79%) + + +libc.so.1`cond_wait_queue (29,010 ms, 4.82%) +lib.. + + +mysqld`my_hash_sort_utf8 (686 ms, 0.11%) + + +libc.so.1`cond_wait_queue (29,008 ms, 4.82%) +lib.. + + +libc.so.1`__lwp_park (81 ms, 0.01%) + + +mysqld`handler::ha_external_lock (248 ms, 0.04%) + + +libc.so.1`__cond_timedwait (25,005 ms, 4.15%) +lib.. + + +mysqld`mysqld_stmt_execute (60,001 ms, 9.97%) +mysqld`mys.. + + +libc.so.1`mutex_lock (84 ms, 0.01%) + + +mysqld`srv_master_thread (29,030 ms, 4.82%) +mys.. + + +libsocket.so.1`recv (1,465 ms, 0.24%) + + +libc.so.1`__cond_timedwait (25,004 ms, 4.15%) +lib.. + + +libc.so.1`__lwp_park (76 ms, 0.01%) + + +mysqld`my_charpos_mb (6,998 ms, 1.16%) + + +mysqld`start_table_io_wait_v1 (4,100 ms, 0.68%) + + +libc.so.1`pthread_cond_wait (50,008 ms, 8.31%) +libc.so... + + +mysqld`ha_innobase::records_in_range (217 ms, 0.04%) + + +mysqld`my_charpos_mb (2,732 ms, 0.45%) + + +mysqld`my_utf8_uni (283 ms, 0.05%) + + +mysqld`handler::multi_range_read_next (4,397 ms, 0.73%) + + +mysqld`my_utf8_uni (869 ms, 0.14%) + + +mysqld`Protocol::end_statement (11,244 ms, 1.87%) + + +libc.so.1`__pollsys (289,499 ms, 48.09%) +libc.so.1`__pollsys + + +mysqld`trans_commit_stmt (409 ms, 0.07%) + + +mysqld`Field::send_binary (90 ms, 0.01%) + + +mysqld`SQL_SELECT::test_quick_select (333 ms, 0.06%) + + +mysqld`handler::read_range_first (70 ms, 0.01%) + + +mysqld`ha_commit_trans (488 ms, 0.08%) + + +libc.so.1`cond_wait (50,008 ms, 8.31%) +libc.so... + + +libc.so.1`mutex_lock (189 ms, 0.03%) + + +mysqld`end_send (92 ms, 0.02%) + + +mysqld`os_thread_sleep (29,002 ms, 4.82%) +mys.. + + +mysqld`check_access (339 ms, 0.06%) + + +mysqld`handler::ha_index_next (4,343 ms, 0.72%) + + +libc.so.1`mutex_lock_impl (77 ms, 0.01%) + + +libc.so.1`cond_wait_queue (50,008 ms, 8.31%) +libc.so... + + +mysqld`net_flush (11,134 ms, 1.85%) + + +libc.so.1`cond_wait_common (25,004 ms, 4.15%) +lib.. + + +mysqld`sub_select (48,078 ms, 7.99%) +mysqld`.. + + +mysqld`inline_mysql_mutex_lock (281 ms, 0.05%) + + +mysqld`open_normal_and_derived_tables (3,201 ms, 0.53%) + + +mysqld`do_handle_one_connection (365,921 ms, 60.78%) +mysqld`do_handle_one_connection + + +mysqld`fts_optimize_thread (25,005 ms, 4.15%) +mys.. + + +mysqld`net_after_header_psi (219 ms, 0.04%) + + +libc.so.1`cond_wait (81 ms, 0.01%) + + diff --git a/tools/FlameGraph/demos/off-mysql-idle.svg b/tools/FlameGraph/demos/off-mysql-idle.svg new file mode 100644 index 0000000..abe73d0 --- /dev/null +++ b/tools/FlameGraph/demos/off-mysql-idle.svg @@ -0,0 +1,611 @@ + + + + + + + + + + + + +Off-CPU Time Flame Graph + + +mysqld`_start (27,295 ms, 5.19%) +mys.. + + +mysqld`hp_delete_key (504 ms, 0.10%) + + +libc.so.1`__lwp_park (25,000 ms, 4.76%) +lib.. + + +mysqld`fts_optimize_thread (25,000 ms, 4.76%) +mys.. + + +mysqld`os_thread_sleep (29,001 ms, 5.52%) +mys.. + + +mysqld`net_read_raw_loop (34,742 ms, 6.61%) +mysql.. + + +mysqld`os_event_wait_time_low (25,000 ms, 4.76%) +mys.. + + +mysqld`row_sel_field_store_in_mysql_format_func (115 ms, 0.02%) + + +mysqld`ha_innobase::records_in_range (100 ms, 0.02%) + + +libc.so.1`__cond_timedwait (29,000 ms, 5.52%) +lib.. + + +mysqld`check_quick_select (101 ms, 0.02%) + + +mysqld`make_join_statistics (329 ms, 0.06%) + + +mysqld`my_charpos_mb (301 ms, 0.06%) + + +mysqld`ha_innobase::general_fetch (296 ms, 0.06%) + + +libc.so.1`pthread_cond_timedwait (25,000 ms, 4.76%) +lib.. + + +mysqld`heap_write (1,716 ms, 0.33%) + + +mysqld`dispatch_command (5,390 ms, 1.03%) + + +libc.so.1`cond_wait_common (25,000 ms, 4.76%) +lib.. + + +mysqld`my_net_read (34,780 ms, 6.62%) +mysql.. + + +mysqld`mysql_select (3,224 ms, 0.61%) + + +mysqld`net_read_packet (34,780 ms, 6.62%) +mysql.. + + +libsocket.so.1`send (1,562 ms, 0.30%) + + +mysqld`mysqld_stmt_execute (3,575 ms, 0.68%) + + +libc.so.1`__pollsys (27,295 ms, 5.19%) +lib.. + + +mysqld`my_ismbchar_utf8 (100 ms, 0.02%) + + +mysqld`os_event_wait_time_low (25,000 ms, 4.76%) +mys.. + + +mysqld`sub_select (2,459 ms, 0.47%) + + +mysqld`JOIN::optimize (491 ms, 0.09%) + + +libc.so.1`cond_wait_queue (25,000 ms, 4.76%) +lib.. + + +mysqld`Item_equal::compare_const (113 ms, 0.02%) + + +mysqld`io_handler_thread (51,010 ms, 9.71%) +mysqld`i.. + + +libc.so.1`cond_wait_common (25,000 ms, 4.76%) +lib.. + + +libc.so.1`cond_wait_queue (220,981 ms, 42.05%) +libc.so.1`cond_wait_queue + + +mysqld`SQL_SELECT::test_quick_select (114 ms, 0.02%) + + +mysqld`handle_one_connection (261,191 ms, 49.70%) +mysqld`handle_one_connection + + +libc.so.1`__so_recv (106 ms, 0.02%) + + +mysqld`srv_monitor_thread (25,000 ms, 4.76%) +mys.. + + +mysqld`ib_wqueue_timedwait (25,000 ms, 4.76%) +mys.. + + +mysqld`fil_aio_wait (51,010 ms, 9.71%) +mysqld`f.. + + +mysqld`hp_rec_hashnr (633 ms, 0.12%) + + +libc.so.1`cond_wait_common (20,000 ms, 3.81%) +li.. + + +mysqld`one_thread_per_connection_end (220,981 ms, 42.05%) +mysqld`one_thread_per_connection_end + + +mysqld`lock_clust_rec_cons_read_sees (102 ms, 0.02%) + + +mysqld`dict_stats_thread (20,000 ms, 3.81%) +my.. + + +libc.so.1`pselect (29,001 ms, 5.52%) +lib.. + + +mysqld`my_utf8_uni (182 ms, 0.03%) + + +mysqld`Prepared_statement::execute_loop (3,572 ms, 0.68%) + + +libc.so.1`__pollsys (34,616 ms, 6.59%) +libc.. + + +mysqld`my_ismbchar_utf8 (74 ms, 0.01%) + + +libc.so.1`__cond_timedwait (29,000 ms, 5.52%) +lib.. + + +libc.so.1`__lwp_park (20,000 ms, 3.81%) +li.. + + +mysqld`ha_heap::write_row (1,717 ms, 0.33%) + + +mysqld`THD::set_query (74 ms, 0.01%) + + +mysqld`handler::multi_range_read_next (395 ms, 0.08%) + + +libc.so.1`cond_wait (51,007 ms, 9.71%) +libc.so... + + +mysqld`row_search_for_mysql (284 ms, 0.05%) + + +libc.so.1`cond_wait_common (29,000 ms, 5.52%) +lib.. + + +mysqld`handle_select (3,227 ms, 0.61%) + + +libc.so.1`select (29,001 ms, 5.52%) +lib.. + + +mysqld`net_flush (1,563 ms, 0.30%) + + +libc.so.1`pthread_cond_timedwait (29,000 ms, 5.52%) +lib.. + + +mysqld`handle_connections_sockets (27,295 ms, 5.19%) +mys.. + + +libc.so.1`cond_timedwait (29,000 ms, 5.52%) +lib.. + + +libc.so.1`__pollsys (29,001 ms, 5.52%) +lib.. + + +all (525,501 ms, 100%) + + + +mysqld`net_send_eof (1,564 ms, 0.30%) + + +libc.so.1`cond_wait_queue (29,000 ms, 5.52%) +lib.. + + +mysqld`mysql_execute_command (3,479 ms, 0.66%) + + +libc.so.1`__pollsys (28,998 ms, 5.52%) +lib.. + + +libc.so.1`pthread_cond_wait (220,981 ms, 42.05%) +libc.so.1`pthread_cond_wait + + +libc.so.1`_thrp_setup (498,205 ms, 94.81%) +libc.so.1`_thrp_setup + + +mysqld`Prepared_statement::execute (3,555 ms, 0.68%) + + +libc.so.1`__cond_wait (220,981 ms, 42.05%) +libc.so.1`__cond_wait + + +mysqld`handler::multi_range_read_info_const (101 ms, 0.02%) + + +mysqld`row_sel_store_mysql_field_func (133 ms, 0.03%) + + +mysqld`btr_estimate_n_rows_in_range (94 ms, 0.02%) + + +libc.so.1`pthread_cond_wait (51,007 ms, 9.71%) +libc.so... + + +mysqld`get_key_scans_params (101 ms, 0.02%) + + +mysqld`close_thread_tables (103 ms, 0.02%) + + +mysqld`srv_error_monitor_thread (29,000 ms, 5.52%) +mys.. + + +libc.so.1`cond_timedwait (25,000 ms, 4.76%) +lib.. + + +mysqld`handler::ha_index_next (350 ms, 0.07%) + + +mysqld`my_hash_sort_utf8 (78 ms, 0.01%) + + +mysqld`Item_func::type (110 ms, 0.02%) + + +mysqld`vio_write (1,563 ms, 0.30%) + + +libc.so.1`pthread_cond_timedwait (25,000 ms, 4.76%) +lib.. + + +mysqld`my_ismbchar_utf8 (146 ms, 0.03%) + + +mysqld`rr_quick (400 ms, 0.08%) + + +mysqld`set_thread_state_v1 (119 ms, 0.02%) + + +libc.so.1`_lwp_start (498,205 ms, 94.81%) +libc.so.1`_lwp_start + + +mysqld`my_ismbchar_utf8 (117 ms, 0.02%) + + +libc.so.1`cond_wait_common (29,000 ms, 5.52%) +lib.. + + +mysqld`my_charpos_mb (460 ms, 0.09%) + + +libc.so.1`__lwp_park (29,000 ms, 5.52%) +lib.. + + +mysqld`my_utf8_uni (165 ms, 0.03%) + + +mysqld`srv_master_thread (29,002 ms, 5.52%) +mys.. + + +mysqld`mysqld_main (27,295 ms, 5.19%) +mys.. + + +mysqld`vio_socket_io_wait (34,634 ms, 6.59%) +mysq.. + + +libc.so.1`pthread_cond_timedwait (20,000 ms, 3.81%) +li.. + + +mysqld`QUICK_RANGE_SELECT::get_next (400 ms, 0.08%) + + +libc.so.1`__cond_timedwait (25,000 ms, 4.76%) +lib.. + + +mysqld`row_sel_store_mysql_rec (136 ms, 0.03%) + + +mysqld`join_init_read_record (190 ms, 0.04%) + + +mysqld`my_strnncollsp_utf8 (113 ms, 0.02%) + + +mysqld`vio_io_wait (34,634 ms, 6.59%) +mysq.. + + +libc.so.1`cond_wait_queue (20,000 ms, 3.81%) +li.. + + +mysqld`DsMrr_impl::dsmrr_info_const (101 ms, 0.02%) + + +mysqld`my_strnxfrm_unicode (83 ms, 0.02%) + + +mysqld`my_utf8_uni (73 ms, 0.01%) + + +mysqld`st_join_table::sort_table (178 ms, 0.03%) + + +mysqld`hp_rec_hashnr (504 ms, 0.10%) + + +mysqld`Protocol::end_statement (1,577 ms, 0.30%) + + +mysqld`Field_string::make_sort_key (101 ms, 0.02%) + + +mysqld`execute_sqlcom_select (3,296 ms, 0.63%) + + +libc.so.1`poll (27,295 ms, 5.19%) +lib.. + + +libc.so.1`cond_timedwait (20,000 ms, 3.81%) +li.. + + +libc.so.1`__lwp_park (220,981 ms, 42.05%) +libc.so.1`__lwp_park + + +mysqld`my_hash_sort_utf8 (102 ms, 0.02%) + + +mysqld`join_read_const (71 ms, 0.01%) + + +libc.so.1`__cond_timedwait (25,000 ms, 4.76%) +lib.. + + +mysqld`make_sortkey (110 ms, 0.02%) + + +libc.so.1`cond_wait_queue (25,000 ms, 4.76%) +lib.. + + +mysqld`pfs_spawn_thread (261,191 ms, 49.70%) +mysqld`pfs_spawn_thread + + +mysqld`end_write (1,722 ms, 0.33%) + + +libc.so.1`__so_send (1,560 ms, 0.30%) + + +mysqld`end_send (84 ms, 0.02%) + + +mysqld`os_event_wait_time_low (29,000 ms, 5.52%) +mys.. + + +mysqld`os_thread_sleep (28,998 ms, 5.52%) +mys.. + + +mysqld`join_read_const_table (188 ms, 0.04%) + + +mysqld`my_charpos_mb (320 ms, 0.06%) + + +mysqld`os_event_wait_time_low (20,000 ms, 3.81%) +my.. + + +mysqld`buf_flush_page_cleaner_thread (29,001 ms, 5.52%) +mys.. + + +mysqld`evaluate_join_record (1,843 ms, 0.35%) + + +libc.so.1`__cond_wait (51,007 ms, 9.71%) +libc.so... + + +libsocket.so.1`recv (106 ms, 0.02%) + + +mysqld`os_event_wait_time_low (29,000 ms, 5.52%) +mys.. + + +libc.so.1`cond_wait (220,981 ms, 42.05%) +libc.so.1`cond_wait + + +libc.so.1`select (28,998 ms, 5.52%) +lib.. + + +libc.so.1`__lwp_park (25,000 ms, 4.76%) +lib.. + + +libc.so.1`cond_wait_queue (29,000 ms, 5.52%) +lib.. + + +mysqld`my_ismbchar_utf8 (103 ms, 0.02%) + + +mysqld`do_command (34,780 ms, 6.62%) +mysql.. + + +libc.so.1`cond_wait_queue (51,007 ms, 9.71%) +libc.so... + + +libc.so.1`poll (34,634 ms, 6.59%) +libc.. + + +mysqld`os_event_wait_low (51,007 ms, 9.71%) +mysqld`o.. + + +mysqld`Item_equal::update_const (114 ms, 0.02%) + + +mysqld`update_const_equal_items (114 ms, 0.02%) + + +mysqld`net_write_packet (1,563 ms, 0.30%) + + +mysqld`lock_wait_timeout_thread (29,000 ms, 5.52%) +mys.. + + +mysqld`vio_read (34,742 ms, 6.61%) +mysql.. + + +libc.so.1`cond_timedwait (29,000 ms, 5.52%) +lib.. + + +mysqld`os_aio_simulated_handle (51,007 ms, 9.71%) +mysqld`o.. + + +mysqld`PROFILING::status_change (92 ms, 0.02%) + + +mysqld`Arg_comparator::set_cmp_func (111 ms, 0.02%) + + +libc.so.1`pselect (28,998 ms, 5.52%) +lib.. + + +mysqld`JOIN::exec (2,561 ms, 0.49%) + + +mysqld`hp_write_key (1,187 ms, 0.23%) + + +libc.so.1`__lwp_park (51,007 ms, 9.71%) +libc.so... + + +libc.so.1`cond_timedwait (25,000 ms, 4.76%) +lib.. + + +libc.so.1`pthread_cond_timedwait (29,000 ms, 5.52%) +lib.. + + +mysqld`hp_rec_key_cmp (547 ms, 0.10%) + + +mysqld`do_handle_one_connection (261,191 ms, 49.70%) +mysqld`do_handle_one_connection + + +libc.so.1`__cond_timedwait (20,000 ms, 3.81%) +li.. + + +mysqld`filesort (174 ms, 0.03%) + + +libc.so.1`__lwp_park (29,000 ms, 5.52%) +lib.. + + +mysqld`handler::ha_write_row (1,719 ms, 0.33%) + + +mysqld`handler::read_range_next (372 ms, 0.07%) + + diff --git a/tools/FlameGraph/demos/palette-example-broken.svg b/tools/FlameGraph/demos/palette-example-broken.svg new file mode 100644 index 0000000..af8c50c --- /dev/null +++ b/tools/FlameGraph/demos/palette-example-broken.svg @@ -0,0 +1,3783 @@ + + + + + + + + + + + + +Flame Graph + + +read_tsc (285 samples, 0.06%) + + +mark_page_dirty_in_slot (64 samples, 0.01%) + + +hrtimer_interrupt (1,059 samples, 0.24%) + + +task_of (50 samples, 0.01%) + + +vmx_save_host_state (618 samples, 0.14%) + + +pick_next_task_idle (105 samples, 0.02%) + + +system_call_fastpath (41 samples, 0.01%) + + +_spin_lock (140 samples, 0.03%) + + +kvm_emulate_halt (74 samples, 0.02%) + + +delayed_work_timer_fn (101 samples, 0.02%) + + +enqueue_hrtimer (119 samples, 0.03%) + + +rcu_bh_qs (62 samples, 0.01%) + + +_spin_lock_irqsave (73 samples, 0.02%) + + +update_shares (42 samples, 0.01%) + + +render_sigset_t (46 samples, 0.01%) + + +vmx_get_msr (2,255 samples, 0.51%) + + +hrtimer_start (5,101 samples, 1.15%) + + +lapic_is_periodic (363 samples, 0.08%) + + +__GI___munmap (69 samples, 0.02%) + + +sys_ioctl (348,207 samples, 78.43%) +sys_ioctl + + +clockevents_program_event (55 samples, 0.01%) + + +apic_update_ppr (157 samples, 0.04%) + + +copy_to_user (102 samples, 0.02%) + + +do_futex (56 samples, 0.01%) + + +raise_softirq (710 samples, 0.16%) + + +kvm_write_guest_page (100 samples, 0.02%) + + +enqueue_entity (138 samples, 0.03%) + + +rebalance_domains (442 samples, 0.10%) + + +handle_external_interrupt (761 samples, 0.17%) + + +rcu_irq_exit (259 samples, 0.06%) + + +default_wake_function (10,485 samples, 2.36%) +d.. + + +kvm_emulate_halt (62 samples, 0.01%) + + +do_timer (1,061 samples, 0.24%) + + +getnstimeofday (141 samples, 0.03%) + + +__wake_up (662 samples, 0.15%) + + +vmx_interrupt_allowed (353 samples, 0.08%) + + +sched_clock (73 samples, 0.02%) + + +perf_pmu_enable (94 samples, 0.02%) + + +copy_user_generic_string (374 samples, 0.08%) + + +scsi_finish_command (54 samples, 0.01%) + + +__cond_resched (62 samples, 0.01%) + + +vmx_vcpu_run (579 samples, 0.13%) + + +kvm_cpu_get_interrupt (3,339 samples, 0.75%) + + +_spin_lock_irqsave (47 samples, 0.01%) + + +tick_check_oneshot_broadcast (72 samples, 0.02%) + + +update_shares (78 samples, 0.02%) + + +kvm_emulate_pio (87 samples, 0.02%) + + +vcpu_put (139 samples, 0.03%) + + +pit_has_pending_timer (117 samples, 0.03%) + + +gup_pud_range (100 samples, 0.02%) + + +__remove_hrtimer (2,187 samples, 0.49%) + + +schedule (4,153 samples, 0.94%) + + +tick_do_update_jiffies64 (99 samples, 0.02%) + + +do_timer (287 samples, 0.06%) + + +kvm_set_shared_msr (177 samples, 0.04%) + + +dequeue_task (103 samples, 0.02%) + + +generic_smp_call_function_single_interrupt (107 samples, 0.02%) + + +child_rip (1,282 samples, 0.29%) + + +cpu_idle (70,353 samples, 15.85%) +cpu_idle + + +_spin_lock (939 samples, 0.21%) + + +hrtimer_force_reprogram (366 samples, 0.08%) + + +lock_hrtimer_base (82 samples, 0.02%) + + +enqueue_task_fair (386 samples, 0.09%) + + +ntp_tick_length (45 samples, 0.01%) + + +thread_return (22,410 samples, 5.05%) +thread.. + + +kvm_read_guest (134 samples, 0.03%) + + +__remove_hrtimer (216 samples, 0.05%) + + +kvm_vcpu_block (112 samples, 0.03%) + + +vmx_set_msr (19,182 samples, 4.32%) +vmx_s.. + + +do_readv_writev (41 samples, 0.01%) + + +native_apic_mem_write (62 samples, 0.01%) + + +kvm_arch_vcpu_runnable (216 samples, 0.05%) + + +enqueue_task (102 samples, 0.02%) + + +msecs_to_jiffies (77 samples, 0.02%) + + +hrtimer_force_reprogram (1,554 samples, 0.35%) + + +drain_array (165 samples, 0.04%) + + +hrtimer_forward (51 samples, 0.01%) + + +do_softirq (19,385 samples, 4.37%) +do_so.. + + +find_first_bit (130 samples, 0.03%) + + +cpuidle_idle_call (175 samples, 0.04%) + + +_IO_vfscanf (89 samples, 0.02%) + + +smp_reschedule_interrupt (253 samples, 0.06%) + + +_spin_lock (96 samples, 0.02%) + + +irq_exit (205 samples, 0.05%) + + +_spin_lock (40 samples, 0.01%) + + +sched_clock_cpu (399 samples, 0.09%) + + +cpu_idle (6,407 samples, 1.44%) + + +this_cpu_load (50 samples, 0.01%) + + +_spin_lock_irqsave (254 samples, 0.06%) + + +__vmx_load_host_state (935 samples, 0.21%) + + +try_to_wake_up (78 samples, 0.02%) + + +native_apic_mem_write (788 samples, 0.18%) + + +__GI___libc_close (46 samples, 0.01%) + + +_spin_lock_irqsave (60 samples, 0.01%) + + +__hrtimer_start_range_ns (6,025 samples, 1.36%) + + +vmcs_writel (422 samples, 0.10%) + + +seq_printf (43 samples, 0.01%) + + +schedule (80 samples, 0.02%) + + +native_sched_clock (113 samples, 0.03%) + + +intel_pmu_enable_all (93 samples, 0.02%) + + +handle_io (88 samples, 0.02%) + + +rcu_process_dyntick (40 samples, 0.01%) + + +kvm_io_bus_write (82 samples, 0.02%) + + +_cond_resched (65 samples, 0.01%) + + +__run_hrtimer (782 samples, 0.18%) + + +read_tsc (162 samples, 0.04%) + + +kvm_put_guest_fpu (96 samples, 0.02%) + + +update_curr (52 samples, 0.01%) + + +find_busiest_group (224 samples, 0.05%) + + +intel_idle (2,606 samples, 0.59%) + + +smp_reschedule_interrupt (787 samples, 0.18%) + + +default_wake_function (92 samples, 0.02%) + + +native_read_tsc (63 samples, 0.01%) + + +intel_pmu_nhm_enable_all (814 samples, 0.18%) + + +mmu_set_spte.clone.0 (313 samples, 0.07%) + + +thread_return (42 samples, 0.01%) + + +find_busiest_queue (303 samples, 0.07%) + + +gfn_to_hva (96 samples, 0.02%) + + +try_to_wake_up (102 samples, 0.02%) + + +rcu_process_callbacks (8,950 samples, 2.02%) +r.. + + +vmx_interrupt_allowed (193 samples, 0.04%) + + +resched_task (131 samples, 0.03%) + + +printk_needs_cpu (98 samples, 0.02%) + + +native_apic_mem_write (103 samples, 0.02%) + + +__rb_rotate_right (348 samples, 0.08%) + + +x86_pmu_enable (971 samples, 0.22%) + + +idle_cpu (166 samples, 0.04%) + + +account_process_tick (2,938 samples, 0.66%) + + +ext4_da_write_begin (102 samples, 0.02%) + + +perf_adjust_freq_unthr_context (6,123 samples, 1.38%) + + +_spin_lock (90 samples, 0.02%) + + +intel_idle (125 samples, 0.03%) + + +schedule (107 samples, 0.02%) + + +do_sync_readv_writev (38 samples, 0.01%) + + +task_rq_lock (389 samples, 0.09%) + + +enqueue_hrtimer (220 samples, 0.05%) + + +rcu_check_callbacks (392 samples, 0.09%) + + +_spin_lock (416 samples, 0.09%) + + +put_prev_task_fair (59 samples, 0.01%) + + +hrtimer_start_range_ns (243 samples, 0.05%) + + +unalias_gfn (49 samples, 0.01%) + + +_spin_unlock_irqrestore (183 samples, 0.04%) + + +_spin_lock_irq (126 samples, 0.03%) + + +call_softirq (42 samples, 0.01%) + + +update_cr8_intercept (1,948 samples, 0.44%) + + +deactivate_task (98 samples, 0.02%) + + +hrtick_start_fair (192 samples, 0.04%) + + +tick_sched_timer (47 samples, 0.01%) + + +vmcs_writel (807 samples, 0.18%) + + +handle_pte_fault (1,846 samples, 0.42%) + + +tick_program_event (378 samples, 0.09%) + + +native_load_tr_desc (44 samples, 0.01%) + + +set_next_entity (121 samples, 0.03%) + + +cpumask_next_and (1,184 samples, 0.27%) + + +br_handle_frame (42 samples, 0.01%) + + +vsnprintf (93 samples, 0.02%) + + +rcu_enter_nohz (157 samples, 0.04%) + + +hrtimer_start (76 samples, 0.02%) + + +native_read_tsc (128 samples, 0.03%) + + +tick_program_event (220 samples, 0.05%) + + +vmx_set_interrupt_shadow (357 samples, 0.08%) + + +put_prev_task_fair (423 samples, 0.10%) + + +__local_bh_enable (58 samples, 0.01%) + + +read_tsc (179 samples, 0.04%) + + +ioeventfd_write (77 samples, 0.02%) + + +mmu_topup_memory_caches (50 samples, 0.01%) + + +update_process_times (51,499 samples, 11.60%) +update_process_ti.. + + +kvm_write_guest_page (879 samples, 0.20%) + + +finish_task_switch (39 samples, 0.01%) + + +update_cfs_load (596 samples, 0.13%) + + +unalias_gfn (50 samples, 0.01%) + + +apic_timer_interrupt (39 samples, 0.01%) + + +vfs_read (70 samples, 0.02%) + + +hrtimer_forward (248 samples, 0.06%) + + +[unknown] (162 samples, 0.04%) + + +_spin_lock_irqsave (234 samples, 0.05%) + + +find_busiest_group (85 samples, 0.02%) + + +tick_dev_program_event (274 samples, 0.06%) + + +sched_clock_idle_wakeup_event (94 samples, 0.02%) + + +sched_clock_tick (344 samples, 0.08%) + + +native_read_tsc (113 samples, 0.03%) + + +kvm_read_guest_page (92 samples, 0.02%) + + +native_read_tsc (50 samples, 0.01%) + + +idle_cpu (109 samples, 0.02%) + + +tick_check_idle (1,826 samples, 0.41%) + + +perf_event_task_sched_out (222 samples, 0.05%) + + +apic_set_eoi (1,627 samples, 0.37%) + + +x86_pmu_commit_txn (95 samples, 0.02%) + + +clockevents_program_event (274 samples, 0.06%) + + +copy_user_generic_string (99 samples, 0.02%) + + +irq_exit (761 samples, 0.17%) + + +mem_cgroup_newpage_charge (196 samples, 0.04%) + + +memcpy (213 samples, 0.05%) + + +get_pid_task (52 samples, 0.01%) + + +task_rq_lock (71 samples, 0.02%) + + +__switch_to (102 samples, 0.02%) + + +find_busiest_queue (44 samples, 0.01%) + + +apic_update_ppr (89 samples, 0.02%) + + +vmx_cache_reg (2,076 samples, 0.47%) + + +irq_exit (241 samples, 0.05%) + + +deactivate_task (8,910 samples, 2.01%) +d.. + + +ktime_get (93 samples, 0.02%) + + +__timer_stats_hrtimer_set_start_info (64 samples, 0.01%) + + +tick_dev_program_event (1,450 samples, 0.33%) + + +hrtimer_forward (88 samples, 0.02%) + + +kvm_write_guest_cached (898 samples, 0.20%) + + +force_quiescent_state (540 samples, 0.12%) + + +lapic_next_event (38 samples, 0.01%) + + +select_nohz_load_balancer (204 samples, 0.05%) + + +__mem_cgroup_commit_charge (66 samples, 0.01%) + + +update_cfs_shares (3,501 samples, 0.79%) + + +sched_clock_tick (58 samples, 0.01%) + + +calc_delta_mine (165 samples, 0.04%) + + +cpuidle_idle_call (46,869 samples, 10.56%) +cpuidle_idle_call + + +system_call_fastpath (59 samples, 0.01%) + + +kvm_inject_apic_timer_irqs (4,090 samples, 0.92%) + + +_spin_lock (192 samples, 0.04%) + + +update_cr8_intercept (3,935 samples, 0.89%) + + +select_task_rq_fair (892 samples, 0.20%) + + +read_tsc (47 samples, 0.01%) + + +kvm_arch_vcpu_runnable (1,836 samples, 0.41%) + + +kvm_timer_fn (706 samples, 0.16%) + + +__do_softirq (42 samples, 0.01%) + + +srcu_read_lock (115 samples, 0.03%) + + +_cond_resched (300 samples, 0.07%) + + +call_softirq (18,519 samples, 4.17%) +call.. + + +rb_erase (298 samples, 0.07%) + + +_spin_unlock_irqrestore (156 samples, 0.04%) + + +ns_to_timespec (50 samples, 0.01%) + + +enqueue_hrtimer (255 samples, 0.06%) + + +ktime_get (79 samples, 0.02%) + + +hrtimer_interrupt (764 samples, 0.17%) + + +sys_write (353 samples, 0.08%) + + +cpumask_next_and (250 samples, 0.06%) + + +run_posix_cpu_timers (217 samples, 0.05%) + + +system_call_fastpath (353 samples, 0.08%) + + +kvm_mmu_page_fault (3,675 samples, 0.83%) + + +kvm_resched (65 samples, 0.01%) + + +getnstimeofday (474 samples, 0.11%) + + +vmx_get_msr (99 samples, 0.02%) + + +profile_tick (911 samples, 0.21%) + + +__run_hrtimer (58 samples, 0.01%) + + +skip_emulated_instruction (839 samples, 0.19%) + + +__apic_accept_irq (991 samples, 0.22%) + + +proc_pid_status (109 samples, 0.02%) + + +irq_enter (68 samples, 0.02%) + + +vfs_readdir (54 samples, 0.01%) + + +_spin_lock (93 samples, 0.02%) + + +__local_bh_enable (375 samples, 0.08%) + + +rb_insert_color (74 samples, 0.02%) + + +hrtimer_run_pending (183 samples, 0.04%) + + +rb_next (74 samples, 0.02%) + + +_spin_unlock_irqrestore (85 samples, 0.02%) + + +lapic_next_event (56 samples, 0.01%) + + +native_write_msr_safe (242 samples, 0.05%) + + +do_softirq (682 samples, 0.15%) + + +hrtimer_force_reprogram (297 samples, 0.07%) + + +update_rq_clock (480 samples, 0.11%) + + +kvm_lapic_sync_to_vapic (790 samples, 0.18%) + + +bnx2_poll (84 samples, 0.02%) + + +hrtimer_force_reprogram (131 samples, 0.03%) + + +_spin_lock (97 samples, 0.02%) + + +_spin_unlock_irqrestore (111 samples, 0.03%) + + +worker_thread (523 samples, 0.12%) + + +smp_apic_timer_interrupt (412 samples, 0.09%) + + +prepare_to_wait (92 samples, 0.02%) + + +scsi_io_completion (51 samples, 0.01%) + + +native_read_msr_safe (135 samples, 0.03%) + + +kvm_load_guest_fpu (1,239 samples, 0.28%) + + +default_send_IPI_mask_sequence_phys (70 samples, 0.02%) + + +ntp_tick_length (40 samples, 0.01%) + + +ktime_get_real (693 samples, 0.16%) + + +update_cpu_load (1,351 samples, 0.30%) + + +irq_work_run (509 samples, 0.11%) + + +[unknown] (410 samples, 0.09%) + + +__remove_hrtimer (3,330 samples, 0.75%) + + +autoremove_wake_function (10,684 samples, 2.41%) +au.. + + +_spin_lock_irqsave (440 samples, 0.10%) + + +apic_timer_interrupt (58 samples, 0.01%) + + +rb_insert_color (345 samples, 0.08%) + + +perf_pmu_enable (1,003 samples, 0.23%) + + +__wake_up_common (10,920 samples, 2.46%) +__.. + + +thread_return (74 samples, 0.02%) + + +native_read_msr_safe (460 samples, 0.10%) + + +rcu_exit_nohz (65 samples, 0.01%) + + +__rb_rotate_left (363 samples, 0.08%) + + +____pagevec_lru_add (78 samples, 0.02%) + + +task_of (82 samples, 0.02%) + + +retint_restore_args (288 samples, 0.06%) + + +kvm_apic_has_interrupt (3,135 samples, 0.71%) + + +PyEval_EvalFrameEx (61 samples, 0.01%) + + +system_call_fastpath (93 samples, 0.02%) + + +dequeue_task (8,656 samples, 1.95%) +d.. + + +do_task_stat (153 samples, 0.03%) + + +kvm_cpu_has_interrupt (1,118 samples, 0.25%) + + +mutex_lock (123 samples, 0.03%) + + +pick_next_task_stop (209 samples, 0.05%) + + +_spin_unlock_irqrestore (103 samples, 0.02%) + + +get_user_pages_fast (2,390 samples, 0.54%) + + +__do_softirq (61 samples, 0.01%) + + +native_read_cr0 (279 samples, 0.06%) + + +sched_clock_cpu (326 samples, 0.07%) + + +hrtimer_cancel (2,175 samples, 0.49%) + + +rcu_needs_cpu (120 samples, 0.03%) + + +__list_add (143 samples, 0.03%) + + +try_to_wake_up (765 samples, 0.17%) + + +kvm_ioapic_handles_vector (656 samples, 0.15%) + + +rcu_process_gp_end (2,105 samples, 0.47%) + + +__perf_event_task_sched_out (162 samples, 0.04%) + + +generic_file_aio_write (345 samples, 0.08%) + + +_spin_lock_irqsave (60 samples, 0.01%) + + +__dequeue_entity (553 samples, 0.12%) + + +ret_from_intr (90 samples, 0.02%) + + +ktime_get_real (43 samples, 0.01%) + + +menu_select (106 samples, 0.02%) + + +activate_task (512 samples, 0.12%) + + +update_shares (2,966 samples, 0.67%) + + +do_softirq (198 samples, 0.04%) + + +run_timer_softirq (3,369 samples, 0.76%) + + +tick_dev_program_event (281 samples, 0.06%) + + +copy_user_generic_string (117 samples, 0.03%) + + +account_cfs_rq_runtime (39 samples, 0.01%) + + +lapic_next_event (128 samples, 0.03%) + + +vcpu_load (193 samples, 0.04%) + + +schedule (44 samples, 0.01%) + + +update_cfs_shares (91 samples, 0.02%) + + +call_softirq (64 samples, 0.01%) + + +read_tsc (54 samples, 0.01%) + + +generic_write_end (68 samples, 0.02%) + + +vcpu_load (1,423 samples, 0.32%) + + +kvm_ioapic_handles_vector (335 samples, 0.08%) + + +yield_to (156 samples, 0.04%) + + +lapic_next_event (93 samples, 0.02%) + + +generic_file_buffered_write (313 samples, 0.07%) + + +__remove_hrtimer (114 samples, 0.03%) + + +_spin_unlock_irqrestore (198 samples, 0.04%) + + +hrtimer_try_to_cancel (62 samples, 0.01%) + + +kvm_set_msr_common (17,145 samples, 3.86%) +kvm_.. + + +poll_idle (127 samples, 0.03%) + + +sched_clock (123 samples, 0.03%) + + +kvm_inject_apic_timer_irqs (403 samples, 0.09%) + + +select_task_rq_fair (69 samples, 0.02%) + + +do_sys_open (95 samples, 0.02%) + + +smp_apic_timer_interrupt (20,818 samples, 4.69%) +smp_a.. + + +account_entity_enqueue (63 samples, 0.01%) + + +__getdents64 (62 samples, 0.01%) + + +scsi_softirq_done (54 samples, 0.01%) + + +smp_apic_timer_interrupt (487 samples, 0.11%) + + +rebalance_domains (207 samples, 0.05%) + + +srcu_read_unlock (354 samples, 0.08%) + + +__do_softirq (193 samples, 0.04%) + + +sys_madvise (43 samples, 0.01%) + + +kvm_read_guest (1,416 samples, 0.32%) + + +futex_wait (55 samples, 0.01%) + + +rcu_needs_cpu (65 samples, 0.01%) + + +system_call_fastpath (66 samples, 0.01%) + + +native_load_sp0 (71 samples, 0.02%) + + +_spin_unlock_irqrestore (197 samples, 0.04%) + + +kvm_cpu_get_interrupt (84 samples, 0.02%) + + +atomic_notifier_call_chain (102 samples, 0.02%) + + +_cond_resched (99 samples, 0.02%) + + +irq_exit (21,997 samples, 4.95%) +irq_exit + + +rb_next (125 samples, 0.03%) + + +do_softirq (65 samples, 0.01%) + + +__wake_up_common (72 samples, 0.02%) + + +_spin_lock_irqsave (566 samples, 0.13%) + + +system_call_fastpath (398 samples, 0.09%) + + +task_tick_fair (672 samples, 0.15%) + + +update_curr (363 samples, 0.08%) + + +hrtimer_start (6,903 samples, 1.55%) + + +enqueue_entity (376 samples, 0.08%) + + +rcu_irq_enter (539 samples, 0.12%) + + +enqueue_entity (315 samples, 0.07%) + + +__remove_hrtimer (2,961 samples, 0.67%) + + +__do_softirq (168 samples, 0.04%) + + +__queue_work (92 samples, 0.02%) + + +gfn_to_memslot (199 samples, 0.04%) + + +printk_tick (529 samples, 0.12%) + + +_spin_unlock_irqrestore (425 samples, 0.10%) + + +smp_apic_timer_interrupt (64 samples, 0.01%) + + +ret_from_intr (80 samples, 0.02%) + + +kvm_apic_accept_pic_intr (67 samples, 0.02%) + + +_spin_lock_irqsave (230 samples, 0.05%) + + +__run_hrtimer (12,882 samples, 2.90%) +__.. + + +do_filp_open (80 samples, 0.02%) + + +schedule (48 samples, 0.01%) + + +pick_next_task_idle (94 samples, 0.02%) + + +account_idle_ticks (79 samples, 0.02%) + + +vmx_set_interrupt_shadow (105 samples, 0.02%) + + +apic_timer_interrupt (22,282 samples, 5.02%) +apic_t.. + + +pick_next_task_fair (223 samples, 0.05%) + + +clockevents_program_event (725 samples, 0.16%) + + +update_curr (14,656 samples, 3.30%) +upd.. + + +native_read_tsc (96 samples, 0.02%) + + +vfs_read (394 samples, 0.09%) + + +__rb_rotate_right (280 samples, 0.06%) + + +set_spte (123 samples, 0.03%) + + +__rb_rotate_right (52 samples, 0.01%) + + +kcs_event (427 samples, 0.10%) + + +native_sched_clock (530 samples, 0.12%) + + +hrtimer_interrupt (110,650 samples, 24.92%) +hrtimer_interrupt + + +native_smp_send_reschedule (132 samples, 0.03%) + + +kvm_lapic_sync_from_vapic (583 samples, 0.13%) + + +__wake_up (847 samples, 0.19%) + + +autoremove_wake_function (787 samples, 0.18%) + + +__run_hrtimer (310 samples, 0.07%) + + +rcu_exit_nohz (162 samples, 0.04%) + + +update_cfs_load (80 samples, 0.02%) + + +call_softirq (720 samples, 0.16%) + + +iov_iter_copy_from_user_atomic (101 samples, 0.02%) + + +raise_softirq (396 samples, 0.09%) + + +rcu_irq_exit (62 samples, 0.01%) + + +kthread (107 samples, 0.02%) + + +update_curr (984 samples, 0.22%) + + +hrtimer_force_reprogram (666 samples, 0.15%) + + +page_add_new_anon_rmap (157 samples, 0.04%) + + +get_user_pages (2,223 samples, 0.50%) + + +handle_ept_violation (3,723 samples, 0.84%) + + +native_apic_mem_write (42 samples, 0.01%) + + +read_tsc (79 samples, 0.02%) + + +lock_hrtimer_base (122 samples, 0.03%) + + +apic_update_ppr (64 samples, 0.01%) + + +enqueue_task_fair (458 samples, 0.10%) + + +enqueue_task (7,276 samples, 1.64%) + + +raise_softirq (488 samples, 0.11%) + + +__timer_stats_hrtimer_set_start_info (163 samples, 0.04%) + + +calc_global_load (40 samples, 0.01%) + + +autoremove_wake_function (82 samples, 0.02%) + + +mutex_unlock (51 samples, 0.01%) + + +save_args (91 samples, 0.02%) + + +kvm_write_guest_cached (961 samples, 0.22%) + + +clear_buddies (52 samples, 0.01%) + + +tick_nohz_stop_idle (89 samples, 0.02%) + + +rb_erase (454 samples, 0.10%) + + +rb_next (70 samples, 0.02%) + + +native_write_msr_safe (407 samples, 0.09%) + + +native_sched_clock (123 samples, 0.03%) + + +__switch_to (81 samples, 0.02%) + + +schedule (76 samples, 0.02%) + + +_spin_lock (76 samples, 0.02%) + + +force_quiescent_state (671 samples, 0.15%) + + +start_kernel (6,443 samples, 1.45%) + + +nr_iowait_cpu (61 samples, 0.01%) + + +kvm_ioapic_handles_vector (794 samples, 0.18%) + + +ext4_direct_IO (62 samples, 0.01%) + + +clear_buddies (76 samples, 0.02%) + + +ext4_file_write (346 samples, 0.08%) + + +_spin_lock (821 samples, 0.18%) + + +__wake_up_common (807 samples, 0.18%) + + +_spin_unlock_irqrestore (97 samples, 0.02%) + + +irq_exit (67 samples, 0.02%) + + +enqueue_task (511 samples, 0.12%) + + +lapic_is_periodic (890 samples, 0.20%) + + +intel_pmu_nhm_enable_all (93 samples, 0.02%) + + +irq_enter (1,699 samples, 0.38%) + + +irq_enter (2,638 samples, 0.59%) + + +tick_nohz_restart_sched_tick (563 samples, 0.13%) + + +kvm_apic_match_dest (110 samples, 0.02%) + + +pm_qos_requirement (149 samples, 0.03%) + + +rb_erase (233 samples, 0.05%) + + +place_entity (102 samples, 0.02%) + + +vfs_writev (41 samples, 0.01%) + + +run_rebalance_domains (221 samples, 0.05%) + + +native_sched_clock (230 samples, 0.05%) + + +__switch_to (645 samples, 0.15%) + + +tick_program_event (149 samples, 0.03%) + + +perf_event_task_sched_out (230 samples, 0.05%) + + +tick_sched_timer (118 samples, 0.03%) + + +mark_page_dirty_in_slot (100 samples, 0.02%) + + +rb_erase (43 samples, 0.01%) + + +hrtimer_get_next_event (119 samples, 0.03%) + + +vmx_vcpu_put (1,118 samples, 0.25%) + + +__dequeue_entity (89 samples, 0.02%) + + +tick_program_event (39 samples, 0.01%) + + +[unknown] (63 samples, 0.01%) + + +sys_select (116 samples, 0.03%) + + +dequeue_entity (72 samples, 0.02%) + + +enqueue_hrtimer (3,219 samples, 0.73%) + + +eventfd_signal (76 samples, 0.02%) + + +ktime_get_real (583 samples, 0.13%) + + +find_busiest_group (102 samples, 0.02%) + + +sys_pwritev (41 samples, 0.01%) + + +update_process_times (104 samples, 0.02%) + + +unalias_gfn_instantiation (39 samples, 0.01%) + + +__switch_to (709 samples, 0.16%) + + +exit_idle (298 samples, 0.07%) + + +do_futex (54 samples, 0.01%) + + +x86_64_start_kernel (6,443 samples, 1.45%) + + +run_rebalance_domains (463 samples, 0.10%) + + +tick_program_event (387 samples, 0.09%) + + +ktime_get (1,061 samples, 0.24%) + + +get_next_timer_interrupt (556 samples, 0.13%) + + +do_IRQ (249 samples, 0.06%) + + +notifier_call_chain (81 samples, 0.02%) + + +apic_has_pending_timer (839 samples, 0.19%) + + +update_stats_wait_end (104 samples, 0.02%) + + +sem_post (62 samples, 0.01%) + + +kvm_write_guest_cached (345 samples, 0.08%) + + +generic_file_aio_write (38 samples, 0.01%) + + +kvm_vcpu_kick (918 samples, 0.21%) + + +__perf_event_enable (100 samples, 0.02%) + + +intel_guest_get_msrs (621 samples, 0.14%) + + +tick_program_event (13,670 samples, 3.08%) +tic.. + + +handle_wrmsr (394 samples, 0.09%) + + +__rcu_process_callbacks (7,055 samples, 1.59%) + + +sys_munmap (65 samples, 0.01%) + + +finish_task_switch (307 samples, 0.07%) + + +account_system_time (406 samples, 0.09%) + + +finish_task_switch (214 samples, 0.05%) + + +task_waking_fair (235 samples, 0.05%) + + +run_timer_softirq (99 samples, 0.02%) + + +srcu_read_unlock (706 samples, 0.16%) + + +update_cfs_shares (482 samples, 0.11%) + + +__rb_rotate_left (369 samples, 0.08%) + + +apic_has_pending_timer (1,589 samples, 0.36%) + + +gfn_to_memslot (110 samples, 0.02%) + + +update_curr (829 samples, 0.19%) + + +_spin_unlock_irqrestore (41 samples, 0.01%) + + +rb_insert_color (43 samples, 0.01%) + + +kvm_set_shared_msr (283 samples, 0.06%) + + +system_call_fastpath (117 samples, 0.03%) + + +start_thread (171 samples, 0.04%) + + +kvm_x2apic_msr_write (572 samples, 0.13%) + + +do_sync_read (69 samples, 0.02%) + + +__wake_up (85 samples, 0.02%) + + +smp_apic_timer_interrupt (1,378 samples, 0.31%) + + +handle_external_interrupt (571 samples, 0.13%) + + +default_wake_function (777 samples, 0.18%) + + +__GI___libc_open (98 samples, 0.02%) + + +rcu_check_callbacks (2,146 samples, 0.48%) + + +__rb_rotate_left (199 samples, 0.04%) + + +find_first_bit (112 samples, 0.03%) + + +perf_event_task_sched_out (50 samples, 0.01%) + + +ktime_get (94 samples, 0.02%) + + +finish_wait (100 samples, 0.02%) + + +lock_hrtimer_base (825 samples, 0.19%) + + +poll_schedule_timeout (40 samples, 0.01%) + + +generic_file_aio_read (67 samples, 0.02%) + + +sched_clock_cpu (145 samples, 0.03%) + + +select_idle_sibling (166 samples, 0.04%) + + +update_shares (233 samples, 0.05%) + + +napi_gro_receive (57 samples, 0.01%) + + +pit_has_pending_timer (1,381 samples, 0.31%) + + +kvm_lapic_find_highest_irr (743 samples, 0.17%) + + +ktime_get (123 samples, 0.03%) + + +ktime_get (100 samples, 0.02%) + + +__hrtimer_start_range_ns (4,939 samples, 1.11%) + + +hrtimer_interrupt (242 samples, 0.05%) + + +__run_hrtimer (71,520 samples, 16.11%) +__run_hrtimer + + +__hrtimer_start_range_ns (2,967 samples, 0.67%) + + +rb_next (85 samples, 0.02%) + + +wake_up_state (45 samples, 0.01%) + + +[unknown] (103 samples, 0.02%) + + +rcu_irq_enter (293 samples, 0.07%) + + +_spin_unlock_irqrestore (149 samples, 0.03%) + + +__apic_accept_irq (467 samples, 0.11%) + + +proc_reg_read (39 samples, 0.01%) + + +pick_next_task_stop (189 samples, 0.04%) + + +scheduler_tick (43 samples, 0.01%) + + +native_write_msr_safe (542 samples, 0.12%) + + +hrtimer_get_next_event (205 samples, 0.05%) + + +sys_futex (55 samples, 0.01%) + + +vmcs_writel (128 samples, 0.03%) + + +kvm_get_apic_interrupt (657 samples, 0.15%) + + +__generic_file_aio_write (345 samples, 0.08%) + + +set_next_entity (129 samples, 0.03%) + + +unalias_gfn_instantiation (186 samples, 0.04%) + + +start_apic_timer (8,421 samples, 1.90%) +s.. + + +clear_buddies (47 samples, 0.01%) + + +do_softirq (42 samples, 0.01%) + + +put_prev_task_fair (39 samples, 0.01%) + + +apic_update_ppr (174 samples, 0.04%) + + +rb_insert_color (114 samples, 0.03%) + + +dequeue_task_fair (7,840 samples, 1.77%) + + +thread_return (53 samples, 0.01%) + + +run_rebalance_domains (132 samples, 0.03%) + + +autoremove_wake_function (103 samples, 0.02%) + + +apic_update_ppr (730 samples, 0.16%) + + +gfn_to_hva (136 samples, 0.03%) + + +kvm_vcpu_ioctl (348,207 samples, 78.43%) +kvm_vcpu_ioctl + + +schedule (86 samples, 0.02%) + + +_spin_lock_irqsave (68 samples, 0.02%) + + +mark_page_dirty (309 samples, 0.07%) + + +_spin_unlock_irqrestore (45 samples, 0.01%) + + +idle_cpu (127 samples, 0.03%) + + +__wake_up (11,139 samples, 2.51%) +__.. + + +proc_single_show (282 samples, 0.06%) + + +enqueue_task_fair (6,532 samples, 1.47%) + + +sched_clock (41 samples, 0.01%) + + +intel_idle (20,259 samples, 4.56%) +intel.. + + +vfs_write (349 samples, 0.08%) + + +sched_clock_tick (424 samples, 0.10%) + + +native_sched_clock (40 samples, 0.01%) + + +prepare_to_wait (788 samples, 0.18%) + + +kvm_apic_accept_pic_intr (1,393 samples, 0.31%) + + +irq_exit (220 samples, 0.05%) + + +kvm_vcpu_block (34,006 samples, 7.66%) +kvm_vcpu_b.. + + +account_process_tick (430 samples, 0.10%) + + +menu_reflect (105 samples, 0.02%) + + +kvm_apic_has_interrupt (92 samples, 0.02%) + + +hrtimer_cancel (237 samples, 0.05%) + + +__remove_hrtimer (51 samples, 0.01%) + + +_spin_lock (49 samples, 0.01%) + + +rb_erase (1,990 samples, 0.45%) + + +reschedule_interrupt (88 samples, 0.02%) + + +start_secondary (70,776 samples, 15.94%) +start_secondary + + +system_call_fastpath (57 samples, 0.01%) + + +do_softirq (217 samples, 0.05%) + + +vmstat_update (50 samples, 0.01%) + + +read_tsc (54 samples, 0.01%) + + +_spin_lock (642 samples, 0.14%) + + +rb_insert_color (331 samples, 0.07%) + + +tick_program_event (1,201 samples, 0.27%) + + +run_local_timers (1,074 samples, 0.24%) + + +read_tsc (439 samples, 0.10%) + + +enter_idle (251 samples, 0.06%) + + +vcpu_put (1,928 samples, 0.43%) + + +all (443,985 samples, 100%) + + + +irq_exit (79 samples, 0.02%) + + +task_tick_fair (21,979 samples, 4.95%) +task_t.. + + +resched_task (71 samples, 0.02%) + + +handle_tx_kick (48 samples, 0.01%) + + +kvm_apic_has_interrupt (863 samples, 0.19%) + + +__timer_stats_hrtimer_set_start_info (135 samples, 0.03%) + + +native_apic_mem_write (975 samples, 0.22%) + + +native_read_tsc (71 samples, 0.02%) + + +_spin_lock (138 samples, 0.03%) + + +_spin_lock_irq (96 samples, 0.02%) + + +exit_idle (134 samples, 0.03%) + + +kvm_set_msr_common (473 samples, 0.11%) + + +__remove_hrtimer (428 samples, 0.10%) + + +task_rq_lock (93 samples, 0.02%) + + +_spin_unlock_irqrestore (42 samples, 0.01%) + + +_spin_lock (137 samples, 0.03%) + + +enqueue_task (432 samples, 0.10%) + + +smp_apic_timer_interrupt (56 samples, 0.01%) + + +place_entity (291 samples, 0.07%) + + +clockevents_program_event (94 samples, 0.02%) + + +pick_next_task_fair (54 samples, 0.01%) + + +update_curr (69 samples, 0.02%) + + +__write_nocancel (362 samples, 0.08%) + + +sys_futex (57 samples, 0.01%) + + +hrtimer_start_range_ns (68 samples, 0.02%) + + +read_tsc (216 samples, 0.05%) + + +update_cfs_shares (68 samples, 0.02%) + + +__remove_hrtimer (151 samples, 0.03%) + + +refresh_cpu_vm_stats (39 samples, 0.01%) + + +_spin_lock_irqsave (81 samples, 0.02%) + + +kvm_apic_has_interrupt (511 samples, 0.12%) + + +hrtimer_cancel (3,284 samples, 0.74%) + + +hrtick_start_fair (51 samples, 0.01%) + + +kvm_apic_has_interrupt (645 samples, 0.15%) + + +perf_pmu_disable (388 samples, 0.09%) + + +__rb_rotate_right (265 samples, 0.06%) + + +tick_program_event (146 samples, 0.03%) + + +mem_cgroup_charge_common (175 samples, 0.04%) + + +rb_erase (321 samples, 0.07%) + + +check_for_new_grace_period (122 samples, 0.03%) + + +_spin_lock_irqsave (57 samples, 0.01%) + + +profile_tick (256 samples, 0.06%) + + +apic_timer_interrupt (1,467 samples, 0.33%) + + +blk_end_request (39 samples, 0.01%) + + +path_walk (39 samples, 0.01%) + + +apic_timer_interrupt (153,285 samples, 34.52%) +apic_timer_interrupt + + +fix_small_imbalance (107 samples, 0.02%) + + +kvm_vcpu_on_spin (275 samples, 0.06%) + + +__do_softirq (720 samples, 0.16%) + + +ktime_get_update_offsets (1,916 samples, 0.43%) + + +_cond_resched (76 samples, 0.02%) + + +x86_pmu_disable (701 samples, 0.16%) + + +pick_next_task_fair (57 samples, 0.01%) + + +find_next_bit (196 samples, 0.04%) + + +kvm_lapic_get_cr8 (306 samples, 0.07%) + + +tick_dev_program_event (97 samples, 0.02%) + + +do_select (98 samples, 0.02%) + + +_spin_lock_irqsave (258 samples, 0.06%) + + +hrtimer_run_queues (90 samples, 0.02%) + + +read_tsc (136 samples, 0.03%) + + +read_tsc (106 samples, 0.02%) + + +kvm_lapic_find_highest_irr (169 samples, 0.04%) + + +sched_clock (79 samples, 0.02%) + + +tick_program_event (197 samples, 0.04%) + + +idle_cpu (488 samples, 0.11%) + + +rb_erase (440 samples, 0.10%) + + +x86_64_start_reservations (6,443 samples, 1.45%) + + +gfn_to_pfn (138 samples, 0.03%) + + +__link_path_walk (38 samples, 0.01%) + + +__GI___ioctl (360,742 samples, 81.25%) +__GI___ioctl + + +kvm_arch_vcpu_put (124 samples, 0.03%) + + +calc_delta_mine (74 samples, 0.02%) + + +native_read_tsc (433 samples, 0.10%) + + +idle_cpu (188 samples, 0.04%) + + +kvm_apic_set_irq (1,005 samples, 0.23%) + + +tick_dev_program_event (99 samples, 0.02%) + + +kvm_apic_has_interrupt (92 samples, 0.02%) + + +__do_softirq (215 samples, 0.05%) + + +perf_guest_get_msrs (929 samples, 0.21%) + + +kvm_read_guest_page (604 samples, 0.14%) + + +__list_add (78 samples, 0.02%) + + +handle_halt (104 samples, 0.02%) + + +physflat_send_IPI_mask (86 samples, 0.02%) + + +thread_return (127 samples, 0.03%) + + +ret_from_intr (1,043 samples, 0.23%) + + +unmap_vmas (41 samples, 0.01%) + + +account_cfs_rq_runtime (132 samples, 0.03%) + + +vmx_interrupt_allowed (272 samples, 0.06%) + + +blk_end_bidi_request (39 samples, 0.01%) + + +core_sys_select (109 samples, 0.02%) + + +run_timer_softirq (543 samples, 0.12%) + + +vmx_vcpu_load (330 samples, 0.07%) + + +vmcs_writel (49 samples, 0.01%) + + +sys_open (95 samples, 0.02%) + + +__rb_rotate_left (198 samples, 0.04%) + + +[unknown] (97 samples, 0.02%) + + +update_rq_clock (99 samples, 0.02%) + + +kvm_cpu_has_pending_timer (1,212 samples, 0.27%) + + +perf_event_task_tick (8,825 samples, 1.99%) +p.. + + +native_apic_mem_write (1,222 samples, 0.28%) + + +native_sched_clock (99 samples, 0.02%) + + +system_call_fastpath (348,207 samples, 78.43%) +system_call_fastpath + + +__run_hrtimer (172 samples, 0.04%) + + +kvm_arch_vcpu_put (1,513 samples, 0.34%) + + +_spin_lock_irqsave (138 samples, 0.03%) + + +account_system_time (2,186 samples, 0.49%) + + +clockevents_program_event (551 samples, 0.12%) + + +copy_user_generic (378 samples, 0.09%) + + +enqueue_entity (5,411 samples, 1.22%) + + +copy_user_generic_string (126 samples, 0.03%) + + +__do_softirq (16,604 samples, 3.74%) +__do.. + + +run_rebalance_domains (51 samples, 0.01%) + + +_spin_lock (43 samples, 0.01%) + + +vmx_inject_irq (779 samples, 0.18%) + + +native_read_msr_safe (176 samples, 0.04%) + + +perf_event_task_tick (149 samples, 0.03%) + + +x86_pmu_disable (2,274 samples, 0.51%) + + +handle_mm_fault (1,904 samples, 0.43%) + + +reschedule_interrupt (802 samples, 0.18%) + + +smp_call_function_single_interrupt (139 samples, 0.03%) + + +unalias_gfn (38 samples, 0.01%) + + +apic_update_ppr (94 samples, 0.02%) + + +insert_work (90 samples, 0.02%) + + +hrtimer_interrupt (16,274 samples, 3.67%) +hrti.. + + +__local_bh_enable (260 samples, 0.06%) + + +native_read_tsc (52 samples, 0.01%) + + +lapic_is_periodic (294 samples, 0.07%) + + +update_curr (103 samples, 0.02%) + + +intel_pmu_disable_all (559 samples, 0.13%) + + +account_entity_enqueue (101 samples, 0.02%) + + +hrtimer_forward (92 samples, 0.02%) + + +hrtimer_run_queues (314 samples, 0.07%) + + +sys_pread64 (70 samples, 0.02%) + + +irq_enter (148 samples, 0.03%) + + +lru_cache_add_lru (105 samples, 0.02%) + + +rcu_sched_qs (655 samples, 0.15%) + + +native_read_tsc (45 samples, 0.01%) + + +mark_page_dirty_in_slot (197 samples, 0.04%) + + +_spin_lock (83 samples, 0.02%) + + +kvm_write_guest (80 samples, 0.02%) + + +hrtimer_run_pending (263 samples, 0.06%) + + +printk_tick (156 samples, 0.04%) + + +ktime_get (102 samples, 0.02%) + + +irq_enter (126 samples, 0.03%) + + +__rcu_pending (401 samples, 0.09%) + + +intel_pmu_disable_all (1,320 samples, 0.30%) + + +_spin_lock (376 samples, 0.08%) + + +_spin_lock_irqsave (595 samples, 0.13%) + + +idle_cpu (62 samples, 0.01%) + + +kvm_lapic_sync_to_vapic (6,121 samples, 1.38%) + + +[unknown] (193 samples, 0.04%) + + +mapping_level (2,723 samples, 0.61%) + + +pick_next_task_rt (41 samples, 0.01%) + + +hrtimer_try_to_cancel (1,471 samples, 0.33%) + + +update_curr (1,839 samples, 0.41%) + + +bnx2_poll_work (80 samples, 0.02%) + + +sched_clock_tick (72 samples, 0.02%) + + +sched_clock (574 samples, 0.13%) + + +futex_wait_queue_me (50 samples, 0.01%) + + +printk_needs_cpu (78 samples, 0.02%) + + +system_call_fastpath (44 samples, 0.01%) + + +tick_nohz_stop_idle (513 samples, 0.12%) + + +set_next_entity (1,632 samples, 0.37%) + + +__apic_accept_irq (2,567 samples, 0.58%) + + +vmx_set_interrupt_shadow (230 samples, 0.05%) + + +rest_init (6,443 samples, 1.45%) + + +activate_task (7,415 samples, 1.67%) + + +sys_read (397 samples, 0.09%) + + +schedule (316 samples, 0.07%) + + +rcu_process_gp_end (236 samples, 0.05%) + + +_spin_unlock_irqrestore (43 samples, 0.01%) + + +update_cfs_shares (91 samples, 0.02%) + + +rb_insert_color (1,813 samples, 0.41%) + + +__wake_up_locked_key (74 samples, 0.02%) + + +native_read_tsc (247 samples, 0.06%) + + +rebalance_domains (650 samples, 0.15%) + + +update_ts_time_stats (42 samples, 0.01%) + + +sched_clock_cpu (1,702 samples, 0.38%) + + +try_to_wake_up (10,145 samples, 2.28%) +t.. + + +kvm_write_guest (1,404 samples, 0.32%) + + +update_cfs_load (800 samples, 0.18%) + + +apic_timer_interrupt (513 samples, 0.12%) + + +sched_clock (264 samples, 0.06%) + + +kvm_apic_local_deliver (3,314 samples, 0.75%) + + +dequeue_task_fair (135 samples, 0.03%) + + +ns_to_timeval (52 samples, 0.01%) + + +task_of (203 samples, 0.05%) + + +seq_vprintf (110 samples, 0.02%) + + +mutex_unlock (111 samples, 0.03%) + + +hrtimer_force_reprogram (55 samples, 0.01%) + + +scheduler_tick (39,576 samples, 8.91%) +scheduler_tick + + +update_cfs_load (90 samples, 0.02%) + + +zap_page_range (43 samples, 0.01%) + + +enqueue_task_fair (95 samples, 0.02%) + + +update_cfs_load (160 samples, 0.04%) + + +update_rq_clock (2,595 samples, 0.58%) + + +bnx2_poll_msix (44 samples, 0.01%) + + +vmcs_writel (1,019 samples, 0.23%) + + +srcu_read_lock (3,468 samples, 0.78%) + + +hrtimer_cancel (300 samples, 0.07%) + + +call_softirq (169 samples, 0.04%) + + +mark_page_dirty_in_slot (56 samples, 0.01%) + + +sched_clock_idle_sleep_event (63 samples, 0.01%) + + +__dequeue_entity (48 samples, 0.01%) + + +kvm_timer_fn (498 samples, 0.11%) + + +atomic_notifier_call_chain (133 samples, 0.03%) + + +do_softirq (169 samples, 0.04%) + + +_spin_unlock_irqrestore (131 samples, 0.03%) + + +native_read_msr_safe (41 samples, 0.01%) + + +vmx_save_host_state (2,528 samples, 0.57%) + + +kvm_timer_fn (1,040 samples, 0.23%) + + +update_rq_clock (533 samples, 0.12%) + + +handle_pause (288 samples, 0.06%) + + +get_user_pages_fast (76 samples, 0.02%) + + +apic_update_ppr (70 samples, 0.02%) + + +hrtimer_interrupt (40 samples, 0.01%) + + +futex_wake (54 samples, 0.01%) + + +unalias_gfn_instantiation (202 samples, 0.05%) + + +__perf_event_task_sched_out (172 samples, 0.04%) + + +read_tsc (72 samples, 0.02%) + + +enqueue_hrtimer (564 samples, 0.13%) + + +irq_work_run (218 samples, 0.05%) + + +kvm_ioapic_handles_vector (339 samples, 0.08%) + + +__hrtimer_start_range_ns (186 samples, 0.04%) + + +ktime_get (196 samples, 0.04%) + + +kvm_lapic_enabled (337 samples, 0.08%) + + +update_cfs_load (86 samples, 0.02%) + + +timekeeping_update (46 samples, 0.01%) + + +unmap_region (52 samples, 0.01%) + + +tick_do_update_jiffies64 (1,376 samples, 0.31%) + + +hrtimer_interrupt (101 samples, 0.02%) + + +pwritev64 (41 samples, 0.01%) + + +pick_next_task_fair (185 samples, 0.04%) + + +napi_skb_finish (53 samples, 0.01%) + + +native_apic_mem_write (113 samples, 0.03%) + + +get_next_timer_interrupt (53 samples, 0.01%) + + +mark_page_dirty_in_slot (63 samples, 0.01%) + + +get_page_from_freelist (334 samples, 0.08%) + + +system_call_fastpath (55 samples, 0.01%) + + +native_load_tls (168 samples, 0.04%) + + +rb_erase (55 samples, 0.01%) + + +find_busiest_group (6,804 samples, 1.53%) + + +ktime_get (647 samples, 0.15%) + + +rcu_sched_qs (76 samples, 0.02%) + + +native_read_tsc (246 samples, 0.06%) + + +__hrtimer_start_range_ns (249 samples, 0.06%) + + +ktime_get (103 samples, 0.02%) + + +rebalance_domains (48 samples, 0.01%) + + +native_sched_clock (131 samples, 0.03%) + + +__rcu_process_callbacks (323 samples, 0.07%) + + +__lru_cache_add (98 samples, 0.02%) + + +autoremove_wake_function (629 samples, 0.14%) + + +kthread (1,174 samples, 0.26%) + + +do_timer (55 samples, 0.01%) + + +vmx_vcpu_run (19,545 samples, 4.40%) +vmx_v.. + + +kvm_apic_accept_pic_intr (469 samples, 0.11%) + + +__blockdev_direct_IO (62 samples, 0.01%) + + +rcu_irq_exit (582 samples, 0.13%) + + +kvm_irq_delivery_to_apic (1,284 samples, 0.29%) + + +__rb_rotate_right (42 samples, 0.01%) + + +alloc_pages_vma (1,316 samples, 0.30%) + + +copy_user_generic_string (1,633 samples, 0.37%) + + +hrtimer_interrupt (42 samples, 0.01%) + + +kvm_read_guest_cached (613 samples, 0.14%) + + +find_busiest_group (54 samples, 0.01%) + + +proc_tgid_stat (155 samples, 0.03%) + + +do_IRQ (81 samples, 0.02%) + + +do_softirq (227 samples, 0.05%) + + +dequeue_entity (6,942 samples, 1.56%) + + +update_cfs_load (685 samples, 0.15%) + + +kvm_arch_vcpu_load (211 samples, 0.05%) + + +__wake_up_common (644 samples, 0.15%) + + +do_vfs_ioctl (348,207 samples, 78.43%) +do_vfs_ioctl + + +tick_do_update_jiffies64 (531 samples, 0.12%) + + +tick_nohz_stop_sched_tick (64 samples, 0.01%) + + +group_sched_in (95 samples, 0.02%) + + +tdp_page_fault (3,636 samples, 0.82%) + + +update_cpu_load (291 samples, 0.07%) + + +ext4_ind_direct_IO (62 samples, 0.01%) + + +netif_receive_skb (53 samples, 0.01%) + + +grab_cache_page_write_begin (46 samples, 0.01%) + + +rcu_irq_exit (538 samples, 0.12%) + + +select_idle_sibling (42 samples, 0.01%) + + +mutex_lock (231 samples, 0.05%) + + +[unknown] (167 samples, 0.04%) + + +net_rx_action (40 samples, 0.01%) + + +clockevents_program_event (86 samples, 0.02%) + + +do_munmap (61 samples, 0.01%) + + +ns_to_timespec (79 samples, 0.02%) + + +default_wake_function (81 samples, 0.02%) + + +default_wake_function (618 samples, 0.14%) + + +vmx_cache_reg (686 samples, 0.15%) + + +kvm_read_guest_cached (1,072 samples, 0.24%) + + +try_to_wake_up (598 samples, 0.13%) + + +__do_softirq (226 samples, 0.05%) + + +notifier_call_chain (103 samples, 0.02%) + + +gfn_to_hva (43 samples, 0.01%) + + +_spin_lock_irqsave (124 samples, 0.03%) + + +__rmqueue (53 samples, 0.01%) + + +update_cfs_shares (112 samples, 0.03%) + + +kvm_vcpu_kick (595 samples, 0.13%) + + +remote_function (100 samples, 0.02%) + + +lock_hrtimer_base (60 samples, 0.01%) + + +rb_erase (337 samples, 0.08%) + + +_spin_lock_irq (215 samples, 0.05%) + + +__rb_rotate_right (255 samples, 0.06%) + + +update_cfs_load (554 samples, 0.12%) + + +preempt_notifier_unregister (83 samples, 0.02%) + + +get_next_timer_interrupt (65 samples, 0.01%) + + +apic_timer_interrupt (66 samples, 0.01%) + + +x86_pmu_enable (94 samples, 0.02%) + + +clear_buddies (60 samples, 0.01%) + + +__perf_event_task_sched_out (48 samples, 0.01%) + + +account_entity_enqueue (133 samples, 0.03%) + + +update_group_power (42 samples, 0.01%) + + +hva_to_pfn (2,409 samples, 0.54%) + + +vfs_ioctl (348,207 samples, 78.43%) +vfs_ioctl + + +ktime_get (729 samples, 0.16%) + + +ns_to_timeval (80 samples, 0.02%) + + +copy_user_generic_string (486 samples, 0.11%) + + +system_call_fastpath (43 samples, 0.01%) + + +seq_read (292 samples, 0.07%) + + +exit_idle (73 samples, 0.02%) + + +sched_clock (76 samples, 0.02%) + + +smp_apic_timer_interrupt (143,572 samples, 32.34%) +smp_apic_timer_interrupt + + +__vmx_load_host_state (92 samples, 0.02%) + + +_local_bh_enable (62 samples, 0.01%) + + +rb_insert_color (1,664 samples, 0.37%) + + +gfn_to_memslot (64 samples, 0.01%) + + +__alloc_pages_nodemask (1,209 samples, 0.27%) + + +kvm_apic_accept_pic_intr (135 samples, 0.03%) + + +kvm_timer_fn (11,691 samples, 2.63%) +kv.. + + +vmx_get_msr (2,169 samples, 0.49%) + + +vmx_handle_exit (31,968 samples, 7.20%) +vmx_handle.. + + +update_process_times (40 samples, 0.01%) + + +rb_next (62 samples, 0.01%) + + +sem_wait (84 samples, 0.02%) + + +ktime_get_update_offsets (102 samples, 0.02%) + + +ktime_get_update_offsets (278 samples, 0.06%) + + +hrtimer_start (217 samples, 0.05%) + + +lock_hrtimer_base (173 samples, 0.04%) + + +native_read_tsc (110 samples, 0.02%) + + +net_rx_action (158 samples, 0.04%) + + +wake_futex (47 samples, 0.01%) + + +rcu_sched_qs (283 samples, 0.06%) + + +kvm_arch_vcpu_load (681 samples, 0.15%) + + +call_softirq (226 samples, 0.05%) + + +update_cfs_shares (138 samples, 0.03%) + + +native_sched_clock (682 samples, 0.15%) + + +setup_vmcs_config (830 samples, 0.19%) + + +do_sync_write (346 samples, 0.08%) + + +vmx_inject_irq (775 samples, 0.17%) + + +free_block (57 samples, 0.01%) + + +bnx2_poll_work (43 samples, 0.01%) + + +clockevents_program_event (83 samples, 0.02%) + + +gup_pte_range (45 samples, 0.01%) + + +sys_getdents (58 samples, 0.01%) + + +do_path_lookup (44 samples, 0.01%) + + +kvm_x2apic_msr_write (14,992 samples, 3.38%) +kvm.. + + +ntp_tick_length (195 samples, 0.04%) + + +child_rip (107 samples, 0.02%) + + +native_read_cr0 (828 samples, 0.19%) + + +restore_args (269 samples, 0.06%) + + +kvm_cpu_has_interrupt (6,480 samples, 1.46%) + + +kvm_lapic_get_cr8 (785 samples, 0.18%) + + +notifier_call_chain (69 samples, 0.02%) + + +calc_delta_mine (375 samples, 0.08%) + + +native_apic_mem_write (350 samples, 0.08%) + + +native_write_msr_safe (357 samples, 0.08%) + + +vmx_set_msr (298 samples, 0.07%) + + +tick_nohz_restart_sched_tick (8,323 samples, 1.87%) +t.. + + +select_nohz_load_balancer (432 samples, 0.10%) + + +account_entity_enqueue (133 samples, 0.03%) + + +vmx_interrupt_allowed (518 samples, 0.12%) + + +__timer_stats_hrtimer_set_start_info (123 samples, 0.03%) + + +__wake_up_common (85 samples, 0.02%) + + +rb_next (793 samples, 0.18%) + + +ktime_get (366 samples, 0.08%) + + +rcu_irq_enter (145 samples, 0.03%) + + +native_sched_clock (60 samples, 0.01%) + + +list_del (47 samples, 0.01%) + + +__blockdev_direct_IO_newtrunc (61 samples, 0.01%) + + +perf_pmu_disable (2,912 samples, 0.66%) + + +vmx_vcpu_put (107 samples, 0.02%) + + +cache_reap (306 samples, 0.07%) + + +lock_hrtimer_base (81 samples, 0.02%) + + +touch_softlockup_watchdog (93 samples, 0.02%) + + +follow_page (212 samples, 0.05%) + + +seq_printf (110 samples, 0.02%) + + +select_nohz_load_balancer (39 samples, 0.01%) + + +native_load_tr_desc (247 samples, 0.06%) + + +tun_sendmsg (41 samples, 0.01%) + + +_spin_lock (94 samples, 0.02%) + + +tick_check_idle (89 samples, 0.02%) + + +apic_has_pending_timer (41 samples, 0.01%) + + +call_function_single_interrupt (141 samples, 0.03%) + + +rcu_process_callbacks (717 samples, 0.16%) + + +tick_dev_program_event (83 samples, 0.02%) + + +ns_to_timespec (76 samples, 0.02%) + + +enqueue_hrtimer (50 samples, 0.01%) + + +run_posix_cpu_timers (1,256 samples, 0.28%) + + +native_write_msr_safe (93 samples, 0.02%) + + +tick_dev_program_event (1,206 samples, 0.27%) + + +vmcs_writel (597 samples, 0.13%) + + +exit_intr (64 samples, 0.01%) + + +__direct_map (468 samples, 0.11%) + + +apic_update_ppr (1,198 samples, 0.27%) + + +tick_do_update_jiffies64 (76 samples, 0.02%) + + +idle_cpu (212 samples, 0.05%) + + +hrtick_start_fair (85 samples, 0.02%) + + +irq_exit (650 samples, 0.15%) + + +hrtimer_start_range_ns (3,619 samples, 0.82%) + + +__get_user_pages (2,200 samples, 0.50%) + + +tick_sched_timer (57,682 samples, 12.99%) +tick_sched_timer + + +ext4_file_write (38 samples, 0.01%) + + +account_entity_enqueue (460 samples, 0.10%) + + +activate_task (81 samples, 0.02%) + + +account_cfs_rq_runtime (57 samples, 0.01%) + + +save_args (84 samples, 0.02%) + + +sched_clock (413 samples, 0.09%) + + +tick_dev_program_event (10,191 samples, 2.30%) +t.. + + +update_shares (308 samples, 0.07%) + + +hrtimer_try_to_cancel (3,117 samples, 0.70%) + + +tick_nohz_restart_sched_tick (76 samples, 0.02%) + + +scheduler_ipi (253 samples, 0.06%) + + +run_rebalance_domains (712 samples, 0.16%) + + +rb_erase (39 samples, 0.01%) + + +handle_tx (48 samples, 0.01%) + + +kvm_lapic_sync_from_vapic (5,333 samples, 1.20%) + + +thread_return (1,239 samples, 0.28%) + + +apic_reg_write (14,140 samples, 3.18%) +api.. + + +rb_insert_color (283 samples, 0.06%) + + +pit_has_pending_timer (753 samples, 0.17%) + + +sched_clock_cpu (320 samples, 0.07%) + + +menu_select (1,223 samples, 0.28%) + + +kvm_vcpu_kick (424 samples, 0.10%) + + +ipmi_thread (541 samples, 0.12%) + + +vmx_handle_exit (1,484 samples, 0.33%) + + +ext4_da_write_end (83 samples, 0.02%) + + +handle_wrmsr (21,241 samples, 4.78%) +handl.. + + +native_write_msr_safe (302 samples, 0.07%) + + +system_call_fastpath (95 samples, 0.02%) + + +scheduler_tick (470 samples, 0.11%) + + +finish_wait (318 samples, 0.07%) + + +update_process_times (155 samples, 0.03%) + + +sched_clock_idle_sleep_event (162 samples, 0.04%) + + +kvm_timer_fn (182 samples, 0.04%) + + +tick_program_event (111 samples, 0.03%) + + +kvm_cpu_has_pending_timer (2,701 samples, 0.61%) + + +check_preempt_curr (407 samples, 0.09%) + + +tick_check_oneshot_broadcast (66 samples, 0.01%) + + +apic_update_ppr (157 samples, 0.04%) + + +pm_qos_requirement (50 samples, 0.01%) + + +update_cfs_load (42 samples, 0.01%) + + +madvise (43 samples, 0.01%) + + +update_cr8_intercept (599 samples, 0.13%) + + +call_softirq (197 samples, 0.04%) + + +_local_bh_enable (57 samples, 0.01%) + + +copy_to_user (165 samples, 0.04%) + + +_IO_vsscanf (103 samples, 0.02%) + + +__rb_rotate_left (87 samples, 0.02%) + + +_spin_unlock_irqrestore (199 samples, 0.04%) + + +kvm_inject_pending_timer_irqs (406 samples, 0.09%) + + +check_preempt_curr (44 samples, 0.01%) + + +__do_softirq (91 samples, 0.02%) + + +update_cfs_shares (229 samples, 0.05%) + + +hrtimer_try_to_cancel (226 samples, 0.05%) + + +schedule_hrtimeout_range (39 samples, 0.01%) + + +update_rq_clock (91 samples, 0.02%) + + +native_apic_mem_write (116 samples, 0.03%) + + +sched_clock (134 samples, 0.03%) + + +vmcs_writel (136 samples, 0.03%) + + +native_load_sp0 (158 samples, 0.04%) + + +idle_cpu (935 samples, 0.21%) + + +call_softirq (216 samples, 0.05%) + + +update_curr (190 samples, 0.04%) + + +__rcu_pending (609 samples, 0.14%) + + +rb_next (858 samples, 0.19%) + + +rb_erase (276 samples, 0.06%) + + +copy_from_user (83 samples, 0.02%) + + +tick_dev_program_event (964 samples, 0.22%) + + +__remove_hrtimer (44 samples, 0.01%) + + +preempt_notifier_unregister (44 samples, 0.01%) + + +tick_nohz_stop_sched_tick (7,607 samples, 1.71%) + + +intel_guest_get_msrs (1,498 samples, 0.34%) + + +atomic_notifier_call_chain (59 samples, 0.01%) + + +_spin_lock (41 samples, 0.01%) + + +perf_pmu_enable (47 samples, 0.01%) + + +kvm_inject_pending_timer_irqs (4,539 samples, 1.02%) + + +schedule (79 samples, 0.02%) + + +__hrtimer_start_range_ns (70 samples, 0.02%) + + +__GI___libc_read (414 samples, 0.09%) + + +lock_hrtimer_base (528 samples, 0.12%) + + +update_rq_clock (505 samples, 0.11%) + + +_spin_lock_irq (67 samples, 0.02%) + + +read_tsc (1,078 samples, 0.24%) + + +native_load_tls (104 samples, 0.02%) + + +mark_page_dirty (88 samples, 0.02%) + + +perf_guest_get_msrs (2,204 samples, 0.50%) + + +ktime_get_update_offsets (44 samples, 0.01%) + + +perf_adjust_freq_unthr_context (289 samples, 0.07%) + + +rcu_bh_qs (180 samples, 0.04%) + + +__local_bh_enable (77 samples, 0.02%) + + +__list_add (82 samples, 0.02%) + + +__netif_receive_skb (49 samples, 0.01%) + + +hrtimer_start (406 samples, 0.09%) + + +irq_exit (218 samples, 0.05%) + + +reschedule_interrupt (258 samples, 0.06%) + + +save_args (702 samples, 0.16%) + + +tick_program_event (1,432 samples, 0.32%) + + +update_curr (73 samples, 0.02%) + + +nr_iowait_cpu (103 samples, 0.02%) + + +update_ts_time_stats (215 samples, 0.05%) + + +tick_dev_program_event (96 samples, 0.02%) + + +gfn_to_hva (357 samples, 0.08%) + + +rb_next (105 samples, 0.02%) + + +rb_next (71 samples, 0.02%) + + +__block_prepare_write (43 samples, 0.01%) + + +enqueue_hrtimer (3,827 samples, 0.86%) + + +gup_pud_range (53 samples, 0.01%) + + +kvm_cpu_has_interrupt (1,232 samples, 0.28%) + + +block_write_begin (48 samples, 0.01%) + + +schedule (1,787 samples, 0.40%) + + +tick_dev_program_event (46 samples, 0.01%) + + +ktime_get (310 samples, 0.07%) + + +vmx_vcpu_run (10,645 samples, 2.40%) +v.. + + +native_write_msr_safe (1,261 samples, 0.28%) + + +tick_check_idle (39 samples, 0.01%) + + +clockevents_program_event (89 samples, 0.02%) + + +native_read_tsc (982 samples, 0.22%) + + +smp_apic_timer_interrupt (110 samples, 0.02%) + + +fix_small_imbalance (41 samples, 0.01%) + + +_spin_lock (166 samples, 0.04%) + + +tick_program_event (3,695 samples, 0.83%) + + +[unknown] (361,559 samples, 81.43%) +[unknown] + + +save_args (770 samples, 0.17%) + + +intel_pmu_enable_all (684 samples, 0.15%) + + +native_read_tsc (74 samples, 0.02%) + + +account_cfs_rq_runtime (527 samples, 0.12%) + + +pit_has_pending_timer (164 samples, 0.04%) + + +update_cfs_shares (1,912 samples, 0.43%) + + +ps_read_process (78 samples, 0.02%) + + +kvm_arch_vcpu_ioctl_run (176,115 samples, 39.67%) +kvm_arch_vcpu_ioctl_run + + +lock_hrtimer_base (329 samples, 0.07%) + + +__libc_start_main (412 samples, 0.09%) + + +try_to_wake_up (44 samples, 0.01%) + + +calc_delta_mine (477 samples, 0.11%) + + +hrtimer_try_to_cancel (384 samples, 0.09%) + + +kvm_cpu_has_pending_timer (223 samples, 0.05%) + + +__hrtimer_start_range_ns (46 samples, 0.01%) + + +scheduler_ipi (784 samples, 0.18%) + + +do_softirq (722 samples, 0.16%) + + +__hrtimer_start_range_ns (395 samples, 0.09%) + + +kvm_apic_present (112 samples, 0.03%) + + +check_for_new_grace_period (994 samples, 0.22%) + + +__mem_cgroup_try_charge (54 samples, 0.01%) + + +smi_event_handler (446 samples, 0.10%) + + +run_local_timers (64 samples, 0.01%) + + +_spin_unlock_irqrestore (43 samples, 0.01%) + + +rebalance_domains (124 samples, 0.03%) + + +pick_next_task_rt (169 samples, 0.04%) + + +ksoftirqd (43 samples, 0.01%) + + +tick_nohz_stop_sched_tick (633 samples, 0.14%) + + +rb_insert_color (203 samples, 0.05%) + + +kvm_put_guest_fpu (99 samples, 0.02%) + + +native_read_tsc (54 samples, 0.01%) + + +tick_sched_timer (158 samples, 0.04%) + + +native_read_tsc (43 samples, 0.01%) + + +kvm_cpu_has_interrupt (162 samples, 0.04%) + + +tick_program_event (102 samples, 0.02%) + + +ktime_get (402 samples, 0.09%) + + +activate_task (442 samples, 0.10%) + + +timekeeping_update (190 samples, 0.04%) + + +skip_emulated_instruction (214 samples, 0.05%) + + +apic_set_eoi (562 samples, 0.13%) + + +native_write_msr_safe (55 samples, 0.01%) + + +blk_done_softirq (54 samples, 0.01%) + + +lapic_is_periodic (141 samples, 0.03%) + + +clockevents_program_event (1,903 samples, 0.43%) + + +vhost_worker (106 samples, 0.02%) + + +vmx_vcpu_load (384 samples, 0.09%) + + +irq_exit (1,505 samples, 0.34%) + + +clear_page_c (603 samples, 0.14%) + + +start_apic_timer (199 samples, 0.04%) + + +thread_return (129 samples, 0.03%) + + +put_prev_task_idle (69 samples, 0.02%) + + +menu_select (86 samples, 0.02%) + + +kvm_apic_local_deliver (435 samples, 0.10%) + + +_spin_unlock_irqrestore (155 samples, 0.03%) + + +select_task_rq_fair (60 samples, 0.01%) + + +kvm_load_guest_fpu (787 samples, 0.18%) + + +update_stats_wait_end (511 samples, 0.12%) + + +kvm_get_apic_interrupt (3,029 samples, 0.68%) + + +kvm_lapic_enabled (826 samples, 0.19%) + + +main (412 samples, 0.09%) + + +skip_emulated_instruction (444 samples, 0.10%) + + +copy_to_user (479 samples, 0.11%) + + +rb_insert_color (129 samples, 0.03%) + + +tick_nohz_get_sleep_length (60 samples, 0.01%) + + +port_inb (419 samples, 0.09%) + + +update_ts_time_stats (65 samples, 0.01%) + + +rb_erase (40 samples, 0.01%) + + +handle_halt (339 samples, 0.08%) + + +__wake_up_common (72 samples, 0.02%) + + +find_next_bit (652 samples, 0.15%) + + +update_vsyscall (98 samples, 0.02%) + + +cpuidle_idle_call (4,680 samples, 1.05%) + + +finish_task_switch (86 samples, 0.02%) + + +call_softirq (514 samples, 0.12%) + + +pick_next_task_fair (2,526 samples, 0.57%) + + +block_write_begin_newtrunc (47 samples, 0.01%) + + +apic_reg_write (347 samples, 0.08%) + + +__select (137 samples, 0.03%) + + +hva_to_pfn (90 samples, 0.02%) + + +lapic_next_event (353 samples, 0.08%) + + +task_waking_fair (113 samples, 0.03%) + + +update_cfs_shares (2,863 samples, 0.64%) + + diff --git a/tools/FlameGraph/demos/palette-example-working.svg b/tools/FlameGraph/demos/palette-example-working.svg new file mode 100644 index 0000000..92a9b52 --- /dev/null +++ b/tools/FlameGraph/demos/palette-example-working.svg @@ -0,0 +1,3501 @@ + + + + + + + + + + + + +Flame Graph + + +sched_clock_cpu (155 samples, 0.04%) + + +system_call_fastpath (235 samples, 0.06%) + + +calc_delta_mine (155 samples, 0.04%) + + +apic_set_eoi (1,766 samples, 0.42%) + + +printk_tick (434 samples, 0.10%) + + +thread_return (24,845 samples, 5.84%) +thread_.. + + +kvm_lapic_enabled (337 samples, 0.08%) + + +_spin_lock_irq (218 samples, 0.05%) + + +enqueue_entity (5,576 samples, 1.31%) + + +do_timer (71 samples, 0.02%) + + +do_softirq (62 samples, 0.01%) + + +schedule (4,144 samples, 0.97%) + + +seq_printf (113 samples, 0.03%) + + +hrtimer_run_pending (255 samples, 0.06%) + + +rcu_bh_qs (135 samples, 0.03%) + + +__vmx_load_host_state (79 samples, 0.02%) + + +read_tsc (42 samples, 0.01%) + + +idle_cpu (181 samples, 0.04%) + + +poll_idle (130 samples, 0.03%) + + +sys_futex (42 samples, 0.01%) + + +native_read_tsc (37 samples, 0.01%) + + +run_rebalance_domains (60 samples, 0.01%) + + +sched_clock (78 samples, 0.02%) + + +ns_to_timespec (99 samples, 0.02%) + + +getnstimeofday (646 samples, 0.15%) + + +vmx_vcpu_load (356 samples, 0.08%) + + +enqueue_task_fair (6,607 samples, 1.55%) + + +update_shares (224 samples, 0.05%) + + +futex_wait (53 samples, 0.01%) + + +nr_iowait_cpu (104 samples, 0.02%) + + +__hrtimer_start_range_ns (4,286 samples, 1.01%) + + +save_args (749 samples, 0.18%) + + +clear_buddies (241 samples, 0.06%) + + +iov_iter_copy_from_user_atomic (68 samples, 0.02%) + + +do_softirq (235 samples, 0.06%) + + +kvm_x2apic_msr_write (643 samples, 0.15%) + + +intel_idle (125 samples, 0.03%) + + +resched_task (67 samples, 0.02%) + + +cpu_idle (3,302 samples, 0.78%) + + +clockevents_program_event (44 samples, 0.01%) + + +system_call_fastpath (60 samples, 0.01%) + + +_spin_lock_irqsave (659 samples, 0.16%) + + +seq_vprintf (113 samples, 0.03%) + + +rb_next (51 samples, 0.01%) + + +__queue_work (54 samples, 0.01%) + + +tick_program_event (170 samples, 0.04%) + + +find_busiest_group (363 samples, 0.09%) + + +_spin_lock_irqsave (56 samples, 0.01%) + + +x86_pmu_enable (817 samples, 0.19%) + + +perf_adjust_freq_unthr_context (5,222 samples, 1.23%) + + +__wake_up_common (10,889 samples, 2.56%) +__.. + + +native_apic_mem_write (47 samples, 0.01%) + + +_spin_lock_irq (73 samples, 0.02%) + + +__remove_hrtimer (2,086 samples, 0.49%) + + +retint_restore_args (323 samples, 0.08%) + + +_local_bh_enable (37 samples, 0.01%) + + +sched_clock_idle_sleep_event (170 samples, 0.04%) + + +tick_dev_program_event (166 samples, 0.04%) + + +__switch_to (583 samples, 0.14%) + + +native_read_tsc (41 samples, 0.01%) + + +timekeeping_update (57 samples, 0.01%) + + +smi_event_handler (581 samples, 0.14%) + + +_spin_lock (73 samples, 0.02%) + + +handle_external_interrupt (414 samples, 0.10%) + + +unmap_region (45 samples, 0.01%) + + +PyEval_EvalFrameEx (54 samples, 0.01%) + + +kvm_vcpu_kick (699 samples, 0.16%) + + +resched_task (62 samples, 0.01%) + + +apic_has_pending_timer (1,365 samples, 0.32%) + + +calc_delta_mine (287 samples, 0.07%) + + +rb_erase (237 samples, 0.06%) + + +run_rebalance_domains (71 samples, 0.02%) + + +enter_idle (288 samples, 0.07%) + + +kvm_write_guest_cached (1,090 samples, 0.26%) + + +hrtimer_try_to_cancel (57 samples, 0.01%) + + +generic_write_end (42 samples, 0.01%) + + +__rb_rotate_left (261 samples, 0.06%) + + +rb_erase (369 samples, 0.09%) + + +rcu_process_gp_end (330 samples, 0.08%) + + +get_next_timer_interrupt (533 samples, 0.13%) + + +mutex_lock (238 samples, 0.06%) + + +kvm_cpu_has_interrupt (183 samples, 0.04%) + + +srcu_read_unlock (534 samples, 0.13%) + + +account_entity_enqueue (39 samples, 0.01%) + + +__do_softirq (111 samples, 0.03%) + + +enqueue_entity (129 samples, 0.03%) + + +select_task_rq_fair (654 samples, 0.15%) + + +__wake_up (401 samples, 0.09%) + + +__rb_rotate_left (294 samples, 0.07%) + + +__vmx_load_host_state (812 samples, 0.19%) + + +worker_thread (427 samples, 0.10%) + + +update_curr (358 samples, 0.08%) + + +lock_hrtimer_base (75 samples, 0.02%) + + +lock_hrtimer_base (65 samples, 0.02%) + + +kvm_inject_apic_timer_irqs (4,450 samples, 1.05%) + + +__do_softirq (82 samples, 0.02%) + + +all (425,157 samples, 100%) + + + +unalias_gfn_instantiation (225 samples, 0.05%) + + +force_quiescent_state (410 samples, 0.10%) + + +schedule (59 samples, 0.01%) + + +_spin_lock (2,269 samples, 0.53%) + + +kvm_put_guest_fpu (85 samples, 0.02%) + + +__hrtimer_start_range_ns (146 samples, 0.03%) + + +__remove_hrtimer (536 samples, 0.13%) + + +exit_idle (158 samples, 0.04%) + + +enqueue_hrtimer (2,634 samples, 0.62%) + + +__remove_hrtimer (1,544 samples, 0.36%) + + +kvm_ioapic_handles_vector (303 samples, 0.07%) + + +physflat_send_IPI_mask (131 samples, 0.03%) + + +hrtimer_run_queues (157 samples, 0.04%) + + +rb_next (39 samples, 0.01%) + + +system_call_fastpath (63 samples, 0.01%) + + +mutex_unlock (85 samples, 0.02%) + + +task_waking_fair (212 samples, 0.05%) + + +__rb_rotate_left (56 samples, 0.01%) + + +handle_external_interrupt (598 samples, 0.14%) + + +ktime_get (198 samples, 0.05%) + + +vmcs_writel (856 samples, 0.20%) + + +__GI___munmap (62 samples, 0.01%) + + +kvm_write_guest_page (771 samples, 0.18%) + + +kvm_write_guest (1,185 samples, 0.28%) + + +group_sched_in (100 samples, 0.02%) + + +ktime_get (139 samples, 0.03%) + + +kvm_cpu_has_interrupt (1,038 samples, 0.24%) + + +native_read_tsc (99 samples, 0.02%) + + +idle_cpu (101 samples, 0.02%) + + +lapic_is_periodic (875 samples, 0.21%) + + +update_curr (699 samples, 0.16%) + + +__wake_up_common (394 samples, 0.09%) + + +ktime_get_update_offsets (300 samples, 0.07%) + + +ktime_get_update_offsets (2,418 samples, 0.57%) + + +finish_wait (89 samples, 0.02%) + + +br_handle_frame (40 samples, 0.01%) + + +__do_softirq (79 samples, 0.02%) + + +clockevents_program_event (73 samples, 0.02%) + + +thread_return (37 samples, 0.01%) + + +profile_tick (900 samples, 0.21%) + + +kvm_vcpu_kick (1,647 samples, 0.39%) + + +__list_add (119 samples, 0.03%) + + +hrtimer_forward (198 samples, 0.05%) + + +_spin_lock (362 samples, 0.09%) + + +vmstat_update (47 samples, 0.01%) + + +pick_next_task_stop (141 samples, 0.03%) + + +irq_exit (39 samples, 0.01%) + + +rb_erase (189 samples, 0.04%) + + +calc_global_load (51 samples, 0.01%) + + +read_tsc (118 samples, 0.03%) + + +force_quiescent_state (623 samples, 0.15%) + + +account_entity_enqueue (547 samples, 0.13%) + + +tick_program_event (3,844 samples, 0.90%) + + +lapic_is_periodic (329 samples, 0.08%) + + +native_read_tsc (58 samples, 0.01%) + + +[unknown] (285 samples, 0.07%) + + +place_entity (71 samples, 0.02%) + + +ktime_get (1,511 samples, 0.36%) + + +__do_softirq (235 samples, 0.06%) + + +dequeue_entity (5,688 samples, 1.34%) + + +clockevents_program_event (258 samples, 0.06%) + + +place_entity (104 samples, 0.02%) + + +tick_sched_timer (148 samples, 0.03%) + + +kthread (1,255 samples, 0.30%) + + +native_read_tsc (501 samples, 0.12%) + + +__run_hrtimer (86 samples, 0.02%) + + +kvm_read_guest (1,391 samples, 0.33%) + + +update_cfs_shares (67 samples, 0.02%) + + +[unknown] (64 samples, 0.02%) + + +vmx_get_msr (2,083 samples, 0.49%) + + +schedule (1,543 samples, 0.36%) + + +find_busiest_group (42 samples, 0.01%) + + +run_local_timers (1,085 samples, 0.26%) + + +read_tsc (37 samples, 0.01%) + + +__rb_rotate_left (182 samples, 0.04%) + + +__perf_event_enable (102 samples, 0.02%) + + +hrtimer_try_to_cancel (2,635 samples, 0.62%) + + +number (40 samples, 0.01%) + + +kvm_apic_local_deliver (3,664 samples, 0.86%) + + +rb_erase (389 samples, 0.09%) + + +napi_gro_receive (89 samples, 0.02%) + + +kvm_read_guest (169 samples, 0.04%) + + +tick_do_update_jiffies64 (87 samples, 0.02%) + + +__getdents64 (64 samples, 0.02%) + + +apic_timer_interrupt (51 samples, 0.01%) + + +[unknown] (98 samples, 0.02%) + + +apic_update_ppr (579 samples, 0.14%) + + +try_to_wake_up (45 samples, 0.01%) + + +native_write_msr_safe (343 samples, 0.08%) + + +x86_pmu_enable (96 samples, 0.02%) + + +netif_receive_skb (82 samples, 0.02%) + + +[unknown] (117 samples, 0.03%) + + +usb_hcd_poll_rh_status (54 samples, 0.01%) + + +sched_clock_cpu (283 samples, 0.07%) + + +account_entity_enqueue (119 samples, 0.03%) + + +update_rq_clock (429 samples, 0.10%) + + +child_rip (1,334 samples, 0.31%) + + +enqueue_entity (193 samples, 0.05%) + + +raise_softirq (700 samples, 0.16%) + + +__rcu_pending (397 samples, 0.09%) + + +vcpu_put (1,682 samples, 0.40%) + + +vfs_readdir (62 samples, 0.01%) + + +enqueue_task (254 samples, 0.06%) + + +atomic_notifier_call_chain (99 samples, 0.02%) + + +__wake_up_common (51 samples, 0.01%) + + +rebalance_domains (1,123 samples, 0.26%) + + +read_tsc (203 samples, 0.05%) + + +read_tsc (708 samples, 0.17%) + + +vmcs_writel (120 samples, 0.03%) + + +ktime_get (1,365 samples, 0.32%) + + +irq_exit (1,317 samples, 0.31%) + + +kvm_load_guest_fpu (1,143 samples, 0.27%) + + +call_function_single_interrupt (120 samples, 0.03%) + + +autoremove_wake_function (383 samples, 0.09%) + + +native_apic_mem_write (170 samples, 0.04%) + + +account_system_time (1,750 samples, 0.41%) + + +sys_ioctl (331,273 samples, 77.92%) +sys_ioctl + + +kvm_put_guest_fpu (115 samples, 0.03%) + + +vmx_inject_irq (758 samples, 0.18%) + + +native_sched_clock (88 samples, 0.02%) + + +vmx_vcpu_run (11,418 samples, 2.69%) +vm.. + + +kcs_event (567 samples, 0.13%) + + +sched_clock_tick (62 samples, 0.01%) + + +native_sched_clock (68 samples, 0.02%) + + +vmx_interrupt_allowed (263 samples, 0.06%) + + +ktime_get (74 samples, 0.02%) + + +ntp_tick_length (360 samples, 0.08%) + + +__remove_hrtimer (70 samples, 0.02%) + + +sem_post (49 samples, 0.01%) + + +bnx2_poll_msix (58 samples, 0.01%) + + +_spin_lock (44 samples, 0.01%) + + +_spin_unlock_irqrestore (116 samples, 0.03%) + + +_spin_unlock_irqrestore (62 samples, 0.01%) + + +intel_idle (21,401 samples, 5.03%) +intel_.. + + +apic_update_ppr (194 samples, 0.05%) + + +native_read_tsc (130 samples, 0.03%) + + +native_write_msr_safe (267 samples, 0.06%) + + +sys_munmap (59 samples, 0.01%) + + +perf_adjust_freq_unthr_context (113 samples, 0.03%) + + +ktime_get_real (725 samples, 0.17%) + + +_cond_resched (70 samples, 0.02%) + + +_spin_unlock_irqrestore (408 samples, 0.10%) + + +select_nohz_load_balancer (199 samples, 0.05%) + + +cpuidle_idle_call (49,086 samples, 11.55%) +cpuidle_idle_call + + +intel_idle (1,183 samples, 0.28%) + + +activate_task (42 samples, 0.01%) + + +_spin_lock_irq (62 samples, 0.01%) + + +__fput (37 samples, 0.01%) + + +perf_event_task_sched_out (234 samples, 0.06%) + + +hrtick_start_fair (51 samples, 0.01%) + + +ktime_get_real (796 samples, 0.19%) + + +start_thread (124 samples, 0.03%) + + +update_cpu_load (190 samples, 0.04%) + + +task_of (84 samples, 0.02%) + + +hrtimer_force_reprogram (712 samples, 0.17%) + + +seq_read (303 samples, 0.07%) + + +native_load_sp0 (76 samples, 0.02%) + + +system_call_fastpath (37 samples, 0.01%) + + +update_cfs_shares (2,863 samples, 0.67%) + + +__libc_start_main (293 samples, 0.07%) + + +autoremove_wake_function (1,421 samples, 0.33%) + + +__write_nocancel (239 samples, 0.06%) + + +rb_insert_color (106 samples, 0.02%) + + +native_sched_clock (456 samples, 0.11%) + + +cpuidle_idle_call (2,382 samples, 0.56%) + + +cpumask_next_and (337 samples, 0.08%) + + +hrtick_start_fair (75 samples, 0.02%) + + +native_smp_send_reschedule (201 samples, 0.05%) + + +mark_page_dirty_in_slot (210 samples, 0.05%) + + +rcu_process_callbacks (9,524 samples, 2.24%) +r.. + + +rcu_sched_qs (273 samples, 0.06%) + + +update_cfs_load (133 samples, 0.03%) + + +proc_pid_readdir (48 samples, 0.01%) + + +native_sched_clock (211 samples, 0.05%) + + +lock_hrtimer_base (385 samples, 0.09%) + + +sched_clock_tick (68 samples, 0.02%) + + +printk_needs_cpu (71 samples, 0.02%) + + +native_write_msr_safe (418 samples, 0.10%) + + +msecs_to_jiffies (69 samples, 0.02%) + + +port_inb (556 samples, 0.13%) + + +default_wake_function (64 samples, 0.02%) + + +finish_wait (279 samples, 0.07%) + + +update_cfs_shares (2,182 samples, 0.51%) + + +tick_nohz_stop_idle (78 samples, 0.02%) + + +perf_pmu_enable (96 samples, 0.02%) + + +__dequeue_entity (100 samples, 0.02%) + + +kvm_apic_accept_pic_intr (48 samples, 0.01%) + + +sys_read (412 samples, 0.10%) + + +_spin_lock (161 samples, 0.04%) + + +ktime_get (84 samples, 0.02%) + + +apic_update_ppr (70 samples, 0.02%) + + +tick_check_oneshot_broadcast (86 samples, 0.02%) + + +pick_next_task_idle (81 samples, 0.02%) + + +kvm_write_guest_page (96 samples, 0.02%) + + +rebalance_domains (56 samples, 0.01%) + + +read_tsc (161 samples, 0.04%) + + +hrtimer_cancel (103 samples, 0.02%) + + +notifier_call_chain (49 samples, 0.01%) + + +system_call_fastpath (331,273 samples, 77.92%) +system_call_fastpath + + +ktime_get (318 samples, 0.07%) + + +_spin_lock_irqsave (64 samples, 0.02%) + + +start_secondary (71,954 samples, 16.92%) +start_secondary + + +_spin_lock_irqsave (51 samples, 0.01%) + + +read_tsc (118 samples, 0.03%) + + +ktime_get_update_offsets (140 samples, 0.03%) + + +tick_dev_program_event (150 samples, 0.04%) + + +ksoftirqd (44 samples, 0.01%) + + +bnx2_poll_work (55 samples, 0.01%) + + +kvm_vcpu_on_spin (472 samples, 0.11%) + + +sched_clock_cpu (1,293 samples, 0.30%) + + +kvm_apic_has_interrupt (609 samples, 0.14%) + + +smp_apic_timer_interrupt (325 samples, 0.08%) + + +perf_pmu_disable (2,703 samples, 0.64%) + + +idle_cpu (90 samples, 0.02%) + + +__link_path_walk (62 samples, 0.01%) + + +kvm_emulate_halt (59 samples, 0.01%) + + +update_curr (160 samples, 0.04%) + + +proc_tgid_stat (161 samples, 0.04%) + + +do_lookup (48 samples, 0.01%) + + +enqueue_task_fair (231 samples, 0.05%) + + +__netif_receive_skb (80 samples, 0.02%) + + +getnstimeofday (193 samples, 0.05%) + + +double_rq_lock (127 samples, 0.03%) + + +irq_enter (60 samples, 0.01%) + + +raise_softirq (418 samples, 0.10%) + + +apic_timer_interrupt (143,644 samples, 33.79%) +apic_timer_interrupt + + +tick_program_event (67 samples, 0.02%) + + +perf_event_task_tick (101 samples, 0.02%) + + +calc_delta_mine (61 samples, 0.01%) + + +_spin_lock_irqsave (198 samples, 0.05%) + + +vfs_write (235 samples, 0.06%) + + +kvm_read_guest_cached (1,179 samples, 0.28%) + + +_IO_vfscanf (77 samples, 0.02%) + + +tick_nohz_restart_sched_tick (313 samples, 0.07%) + + +task_of (170 samples, 0.04%) + + +net_rx_action (219 samples, 0.05%) + + +deactivate_task (7,511 samples, 1.77%) + + +read_tsc (110 samples, 0.03%) + + +update_cfs_shares (74 samples, 0.02%) + + +intel_pmu_nhm_enable_all (95 samples, 0.02%) + + +get_next_timer_interrupt (75 samples, 0.02%) + + +sched_clock (85 samples, 0.02%) + + +pit_has_pending_timer (109 samples, 0.03%) + + +srcu_read_unlock (240 samples, 0.06%) + + +run_rebalance_domains (1,269 samples, 0.30%) + + +smp_apic_timer_interrupt (46 samples, 0.01%) + + +tick_nohz_stop_sched_tick (284 samples, 0.07%) + + +rcu_irq_exit (1,151 samples, 0.27%) + + +run_posix_cpu_timers (129 samples, 0.03%) + + +tick_dev_program_event (671 samples, 0.16%) + + +copy_from_user (66 samples, 0.02%) + + +tick_dev_program_event (718 samples, 0.17%) + + +_spin_lock_irqsave (102 samples, 0.02%) + + +rcu_process_gp_end (3,379 samples, 0.79%) + + +ext4_file_write (233 samples, 0.05%) + + +kvm_vcpu_kick (418 samples, 0.10%) + + +_spin_lock (51 samples, 0.01%) + + +find_first_bit (92 samples, 0.02%) + + +hrtimer_start (4,431 samples, 1.04%) + + +menu_select (58 samples, 0.01%) + + +tick_check_oneshot_broadcast (52 samples, 0.01%) + + +__rb_rotate_right (248 samples, 0.06%) + + +vmx_vcpu_put (79 samples, 0.02%) + + +hrtimer_interrupt (97,151 samples, 22.85%) +hrtimer_interrupt + + +tick_sched_timer (57 samples, 0.01%) + + +_spin_lock_irqsave (105 samples, 0.02%) + + +run_posix_cpu_timers (820 samples, 0.19%) + + +read_tsc (128 samples, 0.03%) + + +_spin_unlock_irqrestore (38 samples, 0.01%) + + +copy_to_user (112 samples, 0.03%) + + +apic_update_ppr (1,025 samples, 0.24%) + + +find_next_bit (801 samples, 0.19%) + + +pm_qos_requirement (54 samples, 0.01%) + + +do_timer (1,366 samples, 0.32%) + + +_spin_lock_irqsave (74 samples, 0.02%) + + +device_not_available (43 samples, 0.01%) + + +__do_softirq (61 samples, 0.01%) + + +schedule (82 samples, 0.02%) + + +scheduler_tick (36,458 samples, 8.58%) +scheduler_tick + + +clockevents_program_event (505 samples, 0.12%) + + +_spin_lock (93 samples, 0.02%) + + +vmx_vcpu_run (17,456 samples, 4.11%) +vmx_.. + + +update_cfs_shares (406 samples, 0.10%) + + +_spin_unlock_irqrestore (323 samples, 0.08%) + + +hrtimer_force_reprogram (274 samples, 0.06%) + + +irq_exit (86 samples, 0.02%) + + +vmx_cache_reg (619 samples, 0.15%) + + +_spin_unlock_irqrestore (81 samples, 0.02%) + + +do_filp_open (111 samples, 0.03%) + + +mark_page_dirty_in_slot (94 samples, 0.02%) + + +update_group_power (39 samples, 0.01%) + + +check_for_new_grace_period (791 samples, 0.19%) + + +_spin_lock_irq (87 samples, 0.02%) + + +kvm_apic_accept_pic_intr (293 samples, 0.07%) + + +irq_enter (2,883 samples, 0.68%) + + +kvm_timer_fn (427 samples, 0.10%) + + +apic_set_eoi (620 samples, 0.15%) + + +native_read_tsc (44 samples, 0.01%) + + +native_read_tsc (138 samples, 0.03%) + + +sys_write (235 samples, 0.06%) + + +gfn_to_hva (57 samples, 0.01%) + + +account_entity_enqueue (121 samples, 0.03%) + + +vmx_set_interrupt_shadow (350 samples, 0.08%) + + +set_next_entity (64 samples, 0.02%) + + +tick_program_event (66 samples, 0.02%) + + +put_prev_task_idle (51 samples, 0.01%) + + +enqueue_task_fair (64 samples, 0.02%) + + +apic_update_ppr (141 samples, 0.03%) + + +apic_timer_interrupt (271 samples, 0.06%) + + +find_busiest_group (105 samples, 0.02%) + + +update_ts_time_stats (44 samples, 0.01%) + + +tick_dev_program_event (83 samples, 0.02%) + + +native_read_msr_safe (112 samples, 0.03%) + + +schedule (88 samples, 0.02%) + + +kvm_inject_apic_timer_irqs (442 samples, 0.10%) + + +rebalance_domains (68 samples, 0.02%) + + +save_args (90 samples, 0.02%) + + +irq_enter (1,788 samples, 0.42%) + + +__timer_stats_hrtimer_set_start_info (68 samples, 0.02%) + + +ns_to_timespec (83 samples, 0.02%) + + +native_load_tr_desc (225 samples, 0.05%) + + +account_system_time (329 samples, 0.08%) + + +copy_to_user (183 samples, 0.04%) + + +tick_nohz_restart_sched_tick (7,717 samples, 1.82%) +t.. + + +kvm_resched (71 samples, 0.02%) + + +try_to_wake_up (1,398 samples, 0.33%) + + +sched_clock_cpu (318 samples, 0.07%) + + +vmcs_writel (630 samples, 0.15%) + + +tick_dev_program_event (56 samples, 0.01%) + + +irq_exit (2,792 samples, 0.66%) + + +apic_reg_write (444 samples, 0.10%) + + +prepare_to_wait (628 samples, 0.15%) + + +unalias_gfn_instantiation (177 samples, 0.04%) + + +kvm_cpu_has_pending_timer (2,323 samples, 0.55%) + + +enqueue_task (580 samples, 0.14%) + + +lapic_is_periodic (398 samples, 0.09%) + + +__wake_up (11,103 samples, 2.61%) +__.. + + +native_smp_send_reschedule (39 samples, 0.01%) + + +update_shares (2,701 samples, 0.64%) + + +hrtimer_start (328 samples, 0.08%) + + +do_IRQ (101 samples, 0.02%) + + +sched_clock (234 samples, 0.06%) + + +_cond_resched (94 samples, 0.02%) + + +kvm_timer_fn (11,725 samples, 2.76%) +kv.. + + +touch_softlockup_watchdog (86 samples, 0.02%) + + +kvm_write_guest_cached (367 samples, 0.09%) + + +__do_softirq (16,067 samples, 3.78%) +__do.. + + +update_rq_clock (69 samples, 0.02%) + + +kvm_cpu_has_interrupt (1,065 samples, 0.25%) + + +vcpu_load (1,484 samples, 0.35%) + + +_IO_vsscanf (89 samples, 0.02%) + + +hrtimer_interrupt (15,849 samples, 3.73%) +hrti.. + + +update_vsyscall (99 samples, 0.02%) + + +resched_task (48 samples, 0.01%) + + +kvm_timer_fn (609 samples, 0.14%) + + +_spin_lock (951 samples, 0.22%) + + +menu_select (1,315 samples, 0.31%) + + +rb_erase (44 samples, 0.01%) + + +native_apic_mem_write (99 samples, 0.02%) + + +_cond_resched (108 samples, 0.03%) + + +copy_user_generic_string (1,910 samples, 0.45%) + + +handle_halt (103 samples, 0.02%) + + +tick_do_update_jiffies64 (694 samples, 0.16%) + + +render_sigset_t (49 samples, 0.01%) + + +__perf_event_task_sched_out (38 samples, 0.01%) + + +task_rq_lock (109 samples, 0.03%) + + +printk_tick (86 samples, 0.02%) + + +kvm_lapic_sync_to_vapic (554 samples, 0.13%) + + +kvm_cpu_has_interrupt (5,261 samples, 1.24%) + + +schedule (49 samples, 0.01%) + + +exit_idle (302 samples, 0.07%) + + +rcu_needs_cpu (58 samples, 0.01%) + + +clockevents_program_event (230 samples, 0.05%) + + +update_cfs_shares (2,733 samples, 0.64%) + + +proc_root_readdir (49 samples, 0.01%) + + +idle_cpu (1,005 samples, 0.24%) + + +native_sched_clock (66 samples, 0.02%) + + +seq_printf (43 samples, 0.01%) + + +sched_clock_cpu (47 samples, 0.01%) + + +update_process_times (112 samples, 0.03%) + + +irq_exit (235 samples, 0.06%) + + +native_read_tsc (73 samples, 0.02%) + + +vmx_interrupt_allowed (196 samples, 0.05%) + + +finish_task_switch (56 samples, 0.01%) + + +kvm_inject_pending_timer_irqs (502 samples, 0.12%) + + +start_apic_timer (167 samples, 0.04%) + + +physflat_send_IPI_mask (39 samples, 0.01%) + + +__wake_up_common (67 samples, 0.02%) + + +_spin_unlock_irqrestore (54 samples, 0.01%) + + +__wake_up_common (1,470 samples, 0.35%) + + +__GI___ioctl (344,397 samples, 81.00%) +__GI___ioctl + + +hrtimer_start_range_ns (75 samples, 0.02%) + + +find_busiest_queue (1,070 samples, 0.25%) + + +read_tsc (60 samples, 0.01%) + + +pick_next_task_fair (220 samples, 0.05%) + + +ext4_da_write_begin (67 samples, 0.02%) + + +cache_reap (250 samples, 0.06%) + + +native_read_tsc (261 samples, 0.06%) + + +native_read_tsc (123 samples, 0.03%) + + +do_softirq (103 samples, 0.02%) + + +copy_user_generic (541 samples, 0.13%) + + +br_handle_frame (59 samples, 0.01%) + + +native_write_msr_safe (44 samples, 0.01%) + + +save_args (636 samples, 0.15%) + + +kvm_lapic_find_highest_irr (684 samples, 0.16%) + + +native_apic_mem_write (1,298 samples, 0.31%) + + +vmx_handle_exit (31,464 samples, 7.40%) +vmx_handle.. + + +pit_has_pending_timer (187 samples, 0.04%) + + +perf_event_task_sched_out (153 samples, 0.04%) + + +pit_has_pending_timer (1,155 samples, 0.27%) + + +kvm_ioapic_handles_vector (978 samples, 0.23%) + + +perf_pmu_enable (848 samples, 0.20%) + + +kvm_set_shared_msr (178 samples, 0.04%) + + +lock_hrtimer_base (880 samples, 0.21%) + + +run_timer_softirq (59 samples, 0.01%) + + +sched_clock_idle_wakeup_event (80 samples, 0.02%) + + +do_sys_open (124 samples, 0.03%) + + +atomic_notifier_call_chain (104 samples, 0.02%) + + +smp_apic_timer_interrupt (115 samples, 0.03%) + + +__run_hrtimer (40 samples, 0.01%) + + +tick_program_event (543 samples, 0.13%) + + +__netif_receive_skb (42 samples, 0.01%) + + +dequeue_task_fair (78 samples, 0.02%) + + +rb_erase (1,997 samples, 0.47%) + + +mark_page_dirty_in_slot (49 samples, 0.01%) + + +default_wake_function (10,499 samples, 2.47%) +de.. + + +update_cpu_load (1,240 samples, 0.29%) + + +vmcs_writel (120 samples, 0.03%) + + +rcu_irq_exit (88 samples, 0.02%) + + +tick_nohz_stop_idle (563 samples, 0.13%) + + +rb_insert_color (237 samples, 0.06%) + + +perf_event_task_sched_out (40 samples, 0.01%) + + +kvm_irq_delivery_to_apic (2,232 samples, 0.52%) + + +smp_reschedule_interrupt (69 samples, 0.02%) + + +rb_erase (222 samples, 0.05%) + + +rcu_needs_cpu (58 samples, 0.01%) + + +ktime_get_real (51 samples, 0.01%) + + +activate_task (7,481 samples, 1.76%) + + +_spin_unlock_irqrestore (151 samples, 0.04%) + + +atomic_notifier_call_chain (138 samples, 0.03%) + + +__wake_up (53 samples, 0.01%) + + +enqueue_hrtimer (60 samples, 0.01%) + + +put_prev_task_fair (295 samples, 0.07%) + + +netif_receive_skb (42 samples, 0.01%) + + +smp_apic_timer_interrupt (50 samples, 0.01%) + + +enqueue_hrtimer (260 samples, 0.06%) + + +kvm_inject_pending_timer_irqs (4,976 samples, 1.17%) + + +rb_insert_color (401 samples, 0.09%) + + +restore_args (278 samples, 0.07%) + + +hrtimer_start (75 samples, 0.02%) + + +_spin_unlock_irqrestore (45 samples, 0.01%) + + +ns_to_timespec (44 samples, 0.01%) + + +update_cr8_intercept (527 samples, 0.12%) + + +_spin_lock (126 samples, 0.03%) + + +kvm_lapic_find_highest_irr (172 samples, 0.04%) + + +napi_skb_finish (83 samples, 0.02%) + + +lock_hrtimer_base (615 samples, 0.14%) + + +__rb_rotate_left (217 samples, 0.05%) + + +mark_page_dirty_in_slot (128 samples, 0.03%) + + +hrtimer_interrupt (73 samples, 0.02%) + + +vcpu_load (168 samples, 0.04%) + + +tick_nohz_restart_sched_tick (104 samples, 0.02%) + + +kvm_write_guest (46 samples, 0.01%) + + +ntp_tick_length (119 samples, 0.03%) + + +[unknown] (344,897 samples, 81.12%) +[unknown] + + +hrtimer_get_next_event (196 samples, 0.05%) + + +copy_user_generic_string (121 samples, 0.03%) + + +kvm_arch_vcpu_put (1,302 samples, 0.31%) + + +hrtimer_force_reprogram (123 samples, 0.03%) + + +hrtimer_start_range_ns (142 samples, 0.03%) + + +ktime_get (907 samples, 0.21%) + + +thread_return (52 samples, 0.01%) + + +ext4_da_write_end (53 samples, 0.01%) + + +napi_skb_finish (42 samples, 0.01%) + + +native_read_cr0 (294 samples, 0.07%) + + +gfn_to_memslot (180 samples, 0.04%) + + +start_kernel (3,326 samples, 0.78%) + + +kvm_apic_accept_pic_intr (1,192 samples, 0.28%) + + +ktime_get (307 samples, 0.07%) + + +run_timer_softirq (2,866 samples, 0.67%) + + +kvm_vcpu_ioctl (331,273 samples, 77.92%) +kvm_vcpu_ioctl + + +enqueue_task (85 samples, 0.02%) + + +find_busiest_group (10,028 samples, 2.36%) +f.. + + +_spin_lock_irqsave (86 samples, 0.02%) + + +autoremove_wake_function (10,643 samples, 2.50%) +au.. + + +sched_clock (100 samples, 0.02%) + + +update_cr8_intercept (1,619 samples, 0.38%) + + +__run_hrtimer (13,080 samples, 3.08%) +__r.. + + +copy_user_generic_string (67 samples, 0.02%) + + +kvm_arch_vcpu_runnable (1,624 samples, 0.38%) + + +thread_return (123 samples, 0.03%) + + +do_futex (41 samples, 0.01%) + + +sched_clock (70 samples, 0.02%) + + +hrtimer_interrupt (831 samples, 0.20%) + + +kvm_set_msr_common (566 samples, 0.13%) + + +__perf_event_task_sched_out (160 samples, 0.04%) + + +hrtick_start_fair (148 samples, 0.03%) + + +do_path_lookup (72 samples, 0.02%) + + +__cond_resched (69 samples, 0.02%) + + +pick_next_task_fair (2,270 samples, 0.53%) + + +ktime_get (247 samples, 0.06%) + + +vcpu_put (147 samples, 0.03%) + + +pick_next_task_stop (154 samples, 0.04%) + + +update_cfs_load (567 samples, 0.13%) + + +handle_wrmsr (574 samples, 0.14%) + + +kvm_lapic_enabled (612 samples, 0.14%) + + +do_munmap (58 samples, 0.01%) + + +account_process_tick (291 samples, 0.07%) + + +seq_vprintf (39 samples, 0.01%) + + +rcu_irq_exit (938 samples, 0.22%) + + +hrtimer_start (151 samples, 0.04%) + + +native_load_tls (174 samples, 0.04%) + + +tick_nohz_stop_sched_tick (76 samples, 0.02%) + + +rb_erase (477 samples, 0.11%) + + +thread_return (108 samples, 0.03%) + + +place_entity (268 samples, 0.06%) + + +reschedule_interrupt (69 samples, 0.02%) + + +start_apic_timer (9,209 samples, 2.17%) +s.. + + +__switch_to (114 samples, 0.03%) + + +hrtimer_forward (65 samples, 0.02%) + + +update_curr (130 samples, 0.03%) + + +kvm_cpu_has_pending_timer (194 samples, 0.05%) + + +rebalance_domains (436 samples, 0.10%) + + +rcu_exit_nohz (157 samples, 0.04%) + + +__local_bh_enable (213 samples, 0.05%) + + +enqueue_hrtimer (3,125 samples, 0.74%) + + +check_preempt_curr (337 samples, 0.08%) + + +kvm_arch_vcpu_load (218 samples, 0.05%) + + +_spin_lock (65 samples, 0.02%) + + +update_cfs_shares (54 samples, 0.01%) + + +autoremove_wake_function (72 samples, 0.02%) + + +update_cfs_load (42 samples, 0.01%) + + +__run_hrtimer (118 samples, 0.03%) + + +update_rq_clock (475 samples, 0.11%) + + +_spin_lock_irqsave (320 samples, 0.08%) + + +exit_idle (81 samples, 0.02%) + + +tick_dev_program_event (74 samples, 0.02%) + + +ret_from_intr (992 samples, 0.23%) + + +call_softirq (490 samples, 0.12%) + + +update_rq_clock (1,779 samples, 0.42%) + + +select_nohz_load_balancer (40 samples, 0.01%) + + +kvm_apic_has_interrupt (529 samples, 0.12%) + + +activate_task (582 samples, 0.14%) + + +clockevents_program_event (1,405 samples, 0.33%) + + +update_stats_wait_end (127 samples, 0.03%) + + +pick_next_task_rt (139 samples, 0.03%) + + +try_to_wake_up (10,151 samples, 2.39%) +t.. + + +vfs_read (409 samples, 0.10%) + + +enqueue_task (7,337 samples, 1.73%) + + +kvm_vcpu_block (35,350 samples, 8.31%) +kvm_vcpu_bl.. + + +rcu_exit_nohz (71 samples, 0.02%) + + +call_softirq (235 samples, 0.06%) + + +task_rq_lock (89 samples, 0.02%) + + +__rb_rotate_right (221 samples, 0.05%) + + +sched_clock_tick (348 samples, 0.08%) + + +dequeue_task (79 samples, 0.02%) + + +set_next_entity (98 samples, 0.02%) + + +tick_program_event (225 samples, 0.05%) + + +kvm_lapic_sync_to_vapic (6,367 samples, 1.50%) + + +__rb_rotate_right (225 samples, 0.05%) + + +proc_single_show (295 samples, 0.07%) + + +native_load_tls (138 samples, 0.03%) + + +__remove_hrtimer (133 samples, 0.03%) + + +ns_to_timeval (82 samples, 0.02%) + + +update_cfs_load (130 samples, 0.03%) + + +update_ts_time_stats (95 samples, 0.02%) + + +enqueue_hrtimer (579 samples, 0.14%) + + +select_task_rq_fair (519 samples, 0.12%) + + +task_waking_fair (116 samples, 0.03%) + + +perf_event_task_tick (7,499 samples, 1.76%) + + +__perf_event_task_sched_out (109 samples, 0.03%) + + +_spin_lock (118 samples, 0.03%) + + +tick_program_event (7,651 samples, 1.80%) + + +preempt_notifier_register (56 samples, 0.01%) + + +irq_work_run (196 samples, 0.05%) + + +apic_update_ppr (86 samples, 0.02%) + + +tick_check_idle (2,178 samples, 0.51%) + + +drain_array (165 samples, 0.04%) + + +perf_guest_get_msrs (762 samples, 0.18%) + + +native_sched_clock (126 samples, 0.03%) + + +zap_page_range (37 samples, 0.01%) + + +try_to_wake_up (355 samples, 0.08%) + + +x86_pmu_disable (591 samples, 0.14%) + + +__apic_accept_irq (2,818 samples, 0.66%) + + +tick_do_update_jiffies64 (93 samples, 0.02%) + + +hrtimer_interrupt (127 samples, 0.03%) + + +pick_next_task_fair (97 samples, 0.02%) + + +ktime_get (132 samples, 0.03%) + + +native_write_msr_safe (94 samples, 0.02%) + + +gfn_to_memslot (105 samples, 0.02%) + + +__remove_hrtimer (3,219 samples, 0.76%) + + +run_local_timers (40 samples, 0.01%) + + +sched_clock (230 samples, 0.05%) + + +update_curr (143 samples, 0.03%) + + +proc_pid_status (116 samples, 0.03%) + + +br_handle_frame_finish (41 samples, 0.01%) + + +remote_function (102 samples, 0.02%) + + +system_call_fastpath (45 samples, 0.01%) + + +tick_program_event (82 samples, 0.02%) + + +do_softirq (18,415 samples, 4.33%) +do_so.. + + +vmx_vcpu_load (357 samples, 0.08%) + + +kvm_get_apic_interrupt (830 samples, 0.20%) + + +__do_softirq (103 samples, 0.02%) + + +pick_next_task_fair (68 samples, 0.02%) + + +setup_vmcs_config (683 samples, 0.16%) + + +kvm_cpu_get_interrupt (3,483 samples, 0.82%) + + +check_for_new_grace_period (66 samples, 0.02%) + + +kvm_set_shared_msr (256 samples, 0.06%) + + +smp_call_function_single_interrupt (120 samples, 0.03%) + + +update_cr8_intercept (3,028 samples, 0.71%) + + +kvm_x2apic_msr_write (17,182 samples, 4.04%) +kvm_.. + + +hrtimer_forward (94 samples, 0.02%) + + +mutex_unlock (126 samples, 0.03%) + + +apic_timer_interrupt (52 samples, 0.01%) + + +mark_page_dirty (58 samples, 0.01%) + + +kvm_read_guest_page (116 samples, 0.03%) + + +menu_reflect (122 samples, 0.03%) + + +pm_qos_requirement (164 samples, 0.04%) + + +tick_do_update_jiffies64 (1,783 samples, 0.42%) + + +madvise (37 samples, 0.01%) + + +system_call_fastpath (42 samples, 0.01%) + + +generic_smp_call_function_single_interrupt (111 samples, 0.03%) + + +__rcu_process_callbacks (222 samples, 0.05%) + + +call_softirq (112 samples, 0.03%) + + +_spin_lock_irqsave (294 samples, 0.07%) + + +rcu_bh_qs (46 samples, 0.01%) + + +__remove_hrtimer (45 samples, 0.01%) + + +vmx_interrupt_allowed (674 samples, 0.16%) + + +__timer_stats_hrtimer_set_start_info (200 samples, 0.05%) + + +do_softirq (112 samples, 0.03%) + + +scheduler_ipi (69 samples, 0.02%) + + +rh_timer_func (56 samples, 0.01%) + + +x86_64_start_reservations (3,326 samples, 0.78%) + + +vmx_vcpu_run (481 samples, 0.11%) + + +skip_emulated_instruction (458 samples, 0.11%) + + +hrtimer_try_to_cancel (1,571 samples, 0.37%) + + +native_apic_mem_write (94 samples, 0.02%) + + +rb_next (95 samples, 0.02%) + + +_spin_lock_irqsave (608 samples, 0.14%) + + +account_entity_enqueue (71 samples, 0.02%) + + +uhci_hub_status_data (49 samples, 0.01%) + + +vmx_set_interrupt_shadow (94 samples, 0.02%) + + +apic_timer_interrupt (872 samples, 0.21%) + + +memcpy (220 samples, 0.05%) + + +smp_apic_timer_interrupt (258 samples, 0.06%) + + +generic_file_buffered_write (214 samples, 0.05%) + + +__do_softirq (1,282 samples, 0.30%) + + +tick_dev_program_event (5,126 samples, 1.21%) + + +_spin_lock_irqsave (199 samples, 0.05%) + + +__local_bh_enable (201 samples, 0.05%) + + +update_curr (1,525 samples, 0.36%) + + +rb_insert_color (260 samples, 0.06%) + + +update_cfs_load (762 samples, 0.18%) + + +run_timer_softirq (449 samples, 0.11%) + + +tick_dev_program_event (415 samples, 0.10%) + + +scheduler_tick (342 samples, 0.08%) + + +update_rq_clock (64 samples, 0.02%) + + +ktime_get (41 samples, 0.01%) + + +do_futex (53 samples, 0.01%) + + +kvm_timer_fn (1,199 samples, 0.28%) + + +finish_task_switch (400 samples, 0.09%) + + +_spin_lock (386 samples, 0.09%) + + +update_cfs_shares (56 samples, 0.01%) + + +native_sched_clock (107 samples, 0.03%) + + +kvm_apic_has_interrupt (2,670 samples, 0.63%) + + +pick_next_task_fair (110 samples, 0.03%) + + +hrtimer_cancel (2,262 samples, 0.53%) + + +futex_wake (38 samples, 0.01%) + + +[unknown] (123 samples, 0.03%) + + +copy_to_user (666 samples, 0.16%) + + +perf_guest_get_msrs (1,978 samples, 0.47%) + + +find_next_bit (40 samples, 0.01%) + + +intel_pmu_enable_all (582 samples, 0.14%) + + +printk_needs_cpu (81 samples, 0.02%) + + +check_preempt_curr (76 samples, 0.02%) + + +hrtimer_forward (41 samples, 0.01%) + + +__wake_up (1,524 samples, 0.36%) + + +rb_insert_color (131 samples, 0.03%) + + +vmx_save_host_state (300 samples, 0.07%) + + +run_rebalance_domains (449 samples, 0.11%) + + +menu_select (95 samples, 0.02%) + + +gfn_to_hva (327 samples, 0.08%) + + +x86_64_start_kernel (3,326 samples, 0.78%) + + +__GI___libc_open (131 samples, 0.03%) + + +kvm_apic_has_interrupt (581 samples, 0.14%) + + +_spin_lock (68 samples, 0.02%) + + +__rb_rotate_left (90 samples, 0.02%) + + +kvm_cpu_has_pending_timer (1,177 samples, 0.28%) + + +_spin_unlock_irqrestore (134 samples, 0.03%) + + +kvm_lapic_sync_from_vapic (691 samples, 0.16%) + + +lock_hrtimer_base (85 samples, 0.02%) + + +ktime_get (73 samples, 0.02%) + + +native_smp_send_reschedule (42 samples, 0.01%) + + +kvm_apic_set_irq (1,760 samples, 0.41%) + + +mcount (42 samples, 0.01%) + + +irq_work_run (497 samples, 0.12%) + + +sys_open (124 samples, 0.03%) + + +ps_read_process (42 samples, 0.01%) + + +_spin_lock (52 samples, 0.01%) + + +ktime_get (89 samples, 0.02%) + + +set_next_entity (1,340 samples, 0.32%) + + +update_cfs_load (684 samples, 0.16%) + + +rcu_irq_enter (329 samples, 0.08%) + + +hrtimer_run_queues (341 samples, 0.08%) + + +call_softirq (103 samples, 0.02%) + + +ktime_get (77 samples, 0.02%) + + +nr_iowait_cpu (169 samples, 0.04%) + + +update_cfs_load (47 samples, 0.01%) + + +sys_futex (54 samples, 0.01%) + + +kvm_set_msr_common (19,717 samples, 4.64%) +kvm_s.. + + +handle_halt (274 samples, 0.06%) + + +__run_hrtimer (486 samples, 0.11%) + + +system_call_fastpath (37 samples, 0.01%) + + +rcu_irq_enter (134 samples, 0.03%) + + +cpumask_next_and (45 samples, 0.01%) + + +lock_hrtimer_base (165 samples, 0.04%) + + +__hrtimer_start_range_ns (113 samples, 0.03%) + + +native_write_msr_safe (1,198 samples, 0.28%) + + +lapic_is_periodic (156 samples, 0.04%) + + +_spin_lock_irq (62 samples, 0.01%) + + +mutex_lock (111 samples, 0.03%) + + +__timer_stats_hrtimer_set_start_info (42 samples, 0.01%) + + +kvm_read_guest_cached (797 samples, 0.19%) + + +account_cfs_rq_runtime (43 samples, 0.01%) + + +apic_update_ppr (259 samples, 0.06%) + + +rcu_sched_qs (563 samples, 0.13%) + + +native_read_tsc (210 samples, 0.05%) + + +tick_sched_timer (40 samples, 0.01%) + + +rb_erase (1,186 samples, 0.28%) + + +irq_exit (406 samples, 0.10%) + + +__switch_to (678 samples, 0.16%) + + +path_walk (68 samples, 0.02%) + + +sched_clock (489 samples, 0.12%) + + +irq_enter (132 samples, 0.03%) + + +yield_to (270 samples, 0.06%) + + +schedule (76 samples, 0.02%) + + +do_task_stat (161 samples, 0.04%) + + +rb_insert_color (78 samples, 0.02%) + + +skip_emulated_instruction (178 samples, 0.04%) + + +native_load_tr_desc (38 samples, 0.01%) + + +native_read_cr0 (619 samples, 0.15%) + + +clockevents_program_event (85 samples, 0.02%) + + +rcu_irq_enter (574 samples, 0.14%) + + +__remove_hrtimer (63 samples, 0.01%) + + +try_to_wake_up (82 samples, 0.02%) + + +kvm_write_guest_cached (873 samples, 0.21%) + + +tick_program_event (37 samples, 0.01%) + + +put_prev_task_fair (48 samples, 0.01%) + + +sys_madvise (37 samples, 0.01%) + + +native_read_tsc (43 samples, 0.01%) + + +read_tsc (938 samples, 0.22%) + + +vmx_vcpu_put (924 samples, 0.22%) + + +reschedule_interrupt (1,370 samples, 0.32%) + + +kvm_lapic_get_cr8 (253 samples, 0.06%) + + +profile_tick (103 samples, 0.02%) + + +select_idle_sibling (140 samples, 0.03%) + + +irq_exit (118 samples, 0.03%) + + +_spin_lock (491 samples, 0.12%) + + +copy_user_generic_string (346 samples, 0.08%) + + +native_sched_clock (50 samples, 0.01%) + + +idle_cpu (524 samples, 0.12%) + + +__rb_rotate_right (60 samples, 0.01%) + + +kvm_apic_local_deliver (514 samples, 0.12%) + + +vmx_set_interrupt_shadow (369 samples, 0.09%) + + +notifier_call_chain (102 samples, 0.02%) + + +bnx2_poll (124 samples, 0.03%) + + +enqueue_task_fair (527 samples, 0.12%) + + +intel_guest_get_msrs (1,334 samples, 0.31%) + + +kvm_arch_vcpu_load (711 samples, 0.17%) + + +kvm_lapic_sync_from_vapic (6,083 samples, 1.43%) + + +hrtimer_interrupt (81 samples, 0.02%) + + +x86_pmu_commit_txn (99 samples, 0.02%) + + +kvm_apic_accept_pic_intr (163 samples, 0.04%) + + +_spin_lock (43 samples, 0.01%) + + +rcu_check_callbacks (2,029 samples, 0.48%) + + +filp_close (43 samples, 0.01%) + + +select_nohz_load_balancer (774 samples, 0.18%) + + +__hrtimer_start_range_ns (109 samples, 0.03%) + + +effective_load (417 samples, 0.10%) + + +clockevents_program_event (41 samples, 0.01%) + + +reschedule_interrupt (75 samples, 0.02%) + + +kvm_ioapic_handles_vector (377 samples, 0.09%) + + +sched_clock_tick (435 samples, 0.10%) + + +perf_pmu_disable (392 samples, 0.09%) + + +apic_timer_interrupt (22,349 samples, 5.26%) +apic_t.. + + +futex_wait_queue_me (43 samples, 0.01%) + + +sched_clock_cpu (374 samples, 0.09%) + + +sem_wait (71 samples, 0.02%) + + +idle_cpu (56 samples, 0.01%) + + +preempt_notifier_unregister (104 samples, 0.02%) + + +tick_nohz_stop_sched_tick (7,134 samples, 1.68%) + + +__list_add (108 samples, 0.03%) + + +ns_to_timeval (77 samples, 0.02%) + + +rb_next (73 samples, 0.02%) + + +find_next_bit (199 samples, 0.05%) + + +native_read_msr_safe (398 samples, 0.09%) + + +skip_emulated_instruction (953 samples, 0.22%) + + +kvm_apic_has_interrupt (76 samples, 0.02%) + + +__apic_accept_irq (1,741 samples, 0.41%) + + +activate_task (260 samples, 0.06%) + + +bnx2_poll_work (117 samples, 0.03%) + + +getnstimeofday (37 samples, 0.01%) + + +update_cfs_load (207 samples, 0.05%) + + +tick_program_event (56 samples, 0.01%) + + +__select (40 samples, 0.01%) + + +vsnprintf (92 samples, 0.02%) + + +find_next_bit (62 samples, 0.01%) + + +_spin_lock (152 samples, 0.04%) + + +native_read_tsc (58 samples, 0.01%) + + +lapic_next_event (87 samples, 0.02%) + + +default_wake_function (375 samples, 0.09%) + + +native_sched_clock (591 samples, 0.14%) + + +kvm_ioapic_handles_vector (786 samples, 0.18%) + + +rcu_irq_exit (206 samples, 0.05%) + + +irq_enter (120 samples, 0.03%) + + +kvm_arch_vcpu_runnable (245 samples, 0.06%) + + +put_prev_task_fair (41 samples, 0.01%) + + +lock_hrtimer_base (56 samples, 0.01%) + + +vmx_get_msr (94 samples, 0.02%) + + +rb_insert_color (42 samples, 0.01%) + + +vmcs_writel (373 samples, 0.09%) + + +__timer_stats_hrtimer_set_start_info (132 samples, 0.03%) + + +_spin_lock (116 samples, 0.03%) + + +hrtimer_interrupt (604 samples, 0.14%) + + +do_sync_write (233 samples, 0.05%) + + +hrtimer_start_range_ns (3,292 samples, 0.77%) + + +vmx_set_msr (22,104 samples, 5.20%) +vmx_se.. + + +dequeue_entity (92 samples, 0.02%) + + +rb_erase (37 samples, 0.01%) + + +do_softirq (683 samples, 0.16%) + + +native_write_msr_safe (190 samples, 0.04%) + + +pit_has_pending_timer (614 samples, 0.14%) + + +unmap_vmas (37 samples, 0.01%) + + +timekeeping_update (191 samples, 0.04%) + + +ret_from_intr (90 samples, 0.02%) + + +__run_hrtimer (55 samples, 0.01%) + + +vmcs_writel (390 samples, 0.09%) + + +task_tick_fair (19,123 samples, 4.50%) +task_.. + + +calc_delta_mine (426 samples, 0.10%) + + +task_of (63 samples, 0.01%) + + +rb_insert_color (250 samples, 0.06%) + + +update_cfs_shares (55 samples, 0.01%) + + +rcu_check_callbacks (259 samples, 0.06%) + + +sched_clock_idle_sleep_event (75 samples, 0.02%) + + +tick_sched_timer (53,098 samples, 12.49%) +tick_sched_timer + + +check_preempt_curr (39 samples, 0.01%) + + +read_tsc (55 samples, 0.01%) + + +intel_pmu_disable_all (1,253 samples, 0.29%) + + +schedule (177 samples, 0.04%) + + +intel_pmu_enable_all (94 samples, 0.02%) + + +__GI___libc_close (54 samples, 0.01%) + + +irq_exit (65 samples, 0.02%) + + +finish_task_switch (164 samples, 0.04%) + + +account_cfs_rq_runtime (96 samples, 0.02%) + + +vhost_worker (78 samples, 0.02%) + + +smp_apic_timer_interrupt (131,540 samples, 30.94%) +smp_apic_timer_interrupt + + +update_process_times (46,596 samples, 10.96%) +update_process_t.. + + +__apic_accept_irq (468 samples, 0.11%) + + +kvm_arch_vcpu_ioctl_run (170,459 samples, 40.09%) +kvm_arch_vcpu_ioctl_run + + +sched_clock (78 samples, 0.02%) + + +_spin_lock_irqsave (300 samples, 0.07%) + + +finish_task_switch (109 samples, 0.03%) + + +update_curr (110 samples, 0.03%) + + +pick_next_task_idle (81 samples, 0.02%) + + +idle_cpu (369 samples, 0.09%) + + +kvm_lapic_get_cr8 (563 samples, 0.13%) + + +rb_next (45 samples, 0.01%) + + +deactivate_task (89 samples, 0.02%) + + +__GI___libc_read (433 samples, 0.10%) + + +ntp_tick_length (46 samples, 0.01%) + + +default_send_IPI_mask_sequence_phys (110 samples, 0.03%) + + +vmx_cache_reg (1,818 samples, 0.43%) + + +get_pid_task (77 samples, 0.02%) + + +hrtimer_try_to_cancel (96 samples, 0.02%) + + +task_tick_fair (426 samples, 0.10%) + + +hrtimer_run_pending (139 samples, 0.03%) + + +delayed_work_timer_fn (60 samples, 0.01%) + + +__rcu_process_callbacks (7,755 samples, 1.82%) +_.. + + +cpu_idle (71,488 samples, 16.81%) +cpu_idle + + +hrtimer_force_reprogram (91 samples, 0.02%) + + +system_call_fastpath (54 samples, 0.01%) + + +_spin_lock_irqsave (45 samples, 0.01%) + + +insert_work (54 samples, 0.01%) + + +rest_init (3,326 samples, 0.78%) + + +napi_gro_receive (42 samples, 0.01%) + + +generic_file_aio_write (233 samples, 0.05%) + + +fput (41 samples, 0.01%) + + +find_first_bit (124 samples, 0.03%) + + +update_process_times (52 samples, 0.01%) + + +rb_next (113 samples, 0.03%) + + +notifier_call_chain (96 samples, 0.02%) + + +account_cfs_rq_runtime (472 samples, 0.11%) + + +_spin_unlock_irqrestore (300 samples, 0.07%) + + +_spin_unlock_irqrestore (37 samples, 0.01%) + + +cpumask_next_and (1,598 samples, 0.38%) + + +exit_intr (42 samples, 0.01%) + + +smp_apic_timer_interrupt (115 samples, 0.03%) + + +dequeue_task (7,331 samples, 1.72%) + + +update_rq_clock (492 samples, 0.12%) + + +_spin_lock (297 samples, 0.07%) + + +kvm_vcpu_block (91 samples, 0.02%) + + +vmx_handle_exit (1,425 samples, 0.34%) + + +apic_update_ppr (62 samples, 0.01%) + + +default_wake_function (47 samples, 0.01%) + + +enqueue_hrtimer (179 samples, 0.04%) + + +do_softirq (83 samples, 0.02%) + + +kvm_get_apic_interrupt (3,216 samples, 0.76%) + + +tick_program_event (867 samples, 0.20%) + + +lapic_next_event (64 samples, 0.02%) + + +idle_cpu (224 samples, 0.05%) + + +__run_hrtimer (65,166 samples, 15.33%) +__run_hrtimer + + +__switch_to (74 samples, 0.02%) + + +update_shares (594 samples, 0.14%) + + +unalias_gfn (57 samples, 0.01%) + + +schedule (91 samples, 0.02%) + + +intel_pmu_nhm_enable_all (708 samples, 0.17%) + + +vmx_get_msr (2,215 samples, 0.52%) + + +apic_has_pending_timer (596 samples, 0.14%) + + +rb_next (775 samples, 0.18%) + + +schedule (68 samples, 0.02%) + + +native_apic_mem_write (596 samples, 0.14%) + + +ipmi_thread (695 samples, 0.16%) + + +update_stats_wait_end (430 samples, 0.10%) + + +kvm_apic_present (263 samples, 0.06%) + + +select_idle_sibling (47 samples, 0.01%) + + +native_apic_mem_write (694 samples, 0.16%) + + +tick_nohz_get_sleep_length (56 samples, 0.01%) + + +task_rq_lock (632 samples, 0.15%) + + +mark_page_dirty (283 samples, 0.07%) + + +rcu_process_callbacks (582 samples, 0.14%) + + +mark_page_dirty_in_slot (81 samples, 0.02%) + + +hrtimer_cancel (2,752 samples, 0.65%) + + +_spin_lock_irqsave (542 samples, 0.13%) + + +irq_exit (22,931 samples, 5.39%) +irq_exit + + +vmx_interrupt_allowed (283 samples, 0.07%) + + +net_rx_action (54 samples, 0.01%) + + +_spin_lock_irqsave (41 samples, 0.01%) + + +__rb_rotate_right (249 samples, 0.06%) + + +rcu_sched_qs (97 samples, 0.02%) + + +intel_guest_get_msrs (339 samples, 0.08%) + + +rb_next (765 samples, 0.18%) + + +call_softirq (82 samples, 0.02%) + + +kvm_apic_has_interrupt (65 samples, 0.02%) + + +sys_getdents (62 samples, 0.01%) + + +native_read_msr_safe (120 samples, 0.03%) + + +sys_close (45 samples, 0.01%) + + +call_softirq (1,286 samples, 0.30%) + + +__timer_stats_hrtimer_set_start_info (122 samples, 0.03%) + + +_spin_lock (322 samples, 0.08%) + + +hrtimer_try_to_cancel (461 samples, 0.11%) + + +kvm_timer_fn (207 samples, 0.05%) + + +enqueue_entity (466 samples, 0.11%) + + +free_block (43 samples, 0.01%) + + +__hrtimer_start_range_ns (2,748 samples, 0.65%) + + +child_rip (78 samples, 0.02%) + + +_spin_unlock_irqrestore (187 samples, 0.04%) + + +vmx_set_msr (332 samples, 0.08%) + + +kvm_arch_vcpu_put (105 samples, 0.02%) + + +update_ts_time_stats (297 samples, 0.07%) + + +rb_insert_color (1,597 samples, 0.38%) + + +_spin_unlock_irqrestore (65 samples, 0.02%) + + +update_rq_clock (90 samples, 0.02%) + + +_spin_lock (358 samples, 0.08%) + + +update_cfs_shares (87 samples, 0.02%) + + +scheduler_ipi (1,354 samples, 0.32%) + + +apic_reg_write (16,106 samples, 3.79%) +apic.. + + +__local_bh_enable (54 samples, 0.01%) + + +apic_update_ppr (115 samples, 0.03%) + + +notifier_call_chain (89 samples, 0.02%) + + +read_tsc (47 samples, 0.01%) + + +save_args (119 samples, 0.03%) + + +srcu_read_lock (3,362 samples, 0.79%) + + +do_softirq (1,290 samples, 0.30%) + + +kvm_apic_match_dest (142 samples, 0.03%) + + +__list_add (61 samples, 0.01%) + + +apic_timer_interrupt (129 samples, 0.03%) + + +x86_pmu_disable (2,142 samples, 0.50%) + + +kvm_read_guest_page (554 samples, 0.13%) + + +tick_nohz_stop_idle (56 samples, 0.01%) + + +thread_return (1,039 samples, 0.24%) + + +ret_from_intr (103 samples, 0.02%) + + +native_apic_mem_write (133 samples, 0.03%) + + +_spin_unlock_irqrestore (119 samples, 0.03%) + + +srcu_read_lock (77 samples, 0.02%) + + +grab_cache_page_write_begin (39 samples, 0.01%) + + +do_IRQ (265 samples, 0.06%) + + +update_curr (861 samples, 0.20%) + + +copy_user_generic_string (510 samples, 0.12%) + + +fix_small_imbalance (53 samples, 0.01%) + + +default_wake_function (1,408 samples, 0.33%) + + +handle_wrmsr (24,550 samples, 5.77%) +handle_.. + + +_cond_resched (311 samples, 0.07%) + + +smp_reschedule_interrupt (1,362 samples, 0.32%) + + +hrtimer_start (7,417 samples, 1.74%) + + +__generic_file_aio_write (231 samples, 0.05%) + + +autoremove_wake_function (47 samples, 0.01%) + + +native_write_msr_safe (468 samples, 0.11%) + + +lapic_next_event (188 samples, 0.04%) + + +_spin_unlock_irqrestore (120 samples, 0.03%) + + +_spin_lock (52 samples, 0.01%) + + +system_call_fastpath (412 samples, 0.10%) + + +this_cpu_load (90 samples, 0.02%) + + +system_call_fastpath (124 samples, 0.03%) + + +update_cfs_load (433 samples, 0.10%) + + +irq_exit (424 samples, 0.10%) + + +vmx_save_host_state (1,955 samples, 0.46%) + + +dequeue_task_fair (6,497 samples, 1.53%) + + +vmx_inject_irq (840 samples, 0.20%) + + +handle_pause (479 samples, 0.11%) + + +tick_check_idle (85 samples, 0.02%) + + +kthread (78 samples, 0.02%) + + +kvm_load_guest_fpu (706 samples, 0.17%) + + +native_load_sp0 (145 samples, 0.03%) + + +intel_pmu_disable_all (475 samples, 0.11%) + + +call_softirq (62 samples, 0.01%) + + +rb_next (63 samples, 0.01%) + + +smp_apic_timer_interrupt (810 samples, 0.19%) + + +native_read_tsc (959 samples, 0.23%) + + +restore_args (43 samples, 0.01%) + + +rcu_enter_nohz (127 samples, 0.03%) + + +__hrtimer_start_range_ns (6,394 samples, 1.50%) + + +gfn_to_hva (112 samples, 0.03%) + + +prepare_to_wait (107 samples, 0.03%) + + +read_tsc (245 samples, 0.06%) + + +copy_user_generic_string (90 samples, 0.02%) + + +raise_softirq (485 samples, 0.11%) + + +__rcu_pending (537 samples, 0.13%) + + +update_curr (12,697 samples, 2.99%) +up.. + + +smp_apic_timer_interrupt (20,741 samples, 4.88%) +smp_ap.. + + +hrtimer_cancel (455 samples, 0.11%) + + +call_softirq (17,577 samples, 4.13%) +call.. + + +hrtimer_get_next_event (117 samples, 0.03%) + + +__hrtimer_start_range_ns (259 samples, 0.06%) + + +__dequeue_entity (400 samples, 0.09%) + + +vfs_ioctl (331,273 samples, 77.92%) +vfs_ioctl + + +do_timer (450 samples, 0.11%) + + +do_vfs_ioctl (331,273 samples, 77.92%) +do_vfs_ioctl + + +_spin_lock_irq (64 samples, 0.02%) + + +update_cfs_load (65 samples, 0.02%) + + +rb_insert_color (1,255 samples, 0.30%) + + +cpuidle_idle_call (202 samples, 0.05%) + + +update_cfs_shares (276 samples, 0.06%) + + +account_process_tick (2,398 samples, 0.56%) + + +main (293 samples, 0.07%) + + +_spin_unlock_irqrestore (231 samples, 0.05%) + + diff --git a/tools/FlameGraph/dev/README b/tools/FlameGraph/dev/README new file mode 100644 index 0000000..599732e --- /dev/null +++ b/tools/FlameGraph/dev/README @@ -0,0 +1,13 @@ +EXPERIMENTAL: This includes some work in progress code, which may not work +properly. + +Hot Cold Graphs +=============== +These show both on-CPU time (in shades of red) and off-CPU time (blocked time; +in shades of blue) in a similar style to the Flame Graph. + +Thread Hot Cold Graphs +====================== +These are per-Thread Hot Cold Graphs, which helps separate logical functions +that are managed by their threads, and helps you estimate speed up for the +threads of interest. diff --git a/tools/FlameGraph/dev/gatherhc-kern.d b/tools/FlameGraph/dev/gatherhc-kern.d new file mode 100755 index 0000000..1188205 --- /dev/null +++ b/tools/FlameGraph/dev/gatherhc-kern.d @@ -0,0 +1,32 @@ +#!/usr/sbin/dtrace -s + +#pragma D option stackframes=100 +#pragma D option defaultargs + +profile:::profile-999 +/arg0/ +{ + @[stack(), 1] = sum(1000); +} + +sched:::off-cpu +{ + self->start = timestamp; +} + +sched:::on-cpu +/(this->start = self->start)/ +{ + this->delta = (timestamp - this->start) / 1000; + @[stack(), 0] = sum(this->delta); + self->start = 0; +} + +profile:::tick-60s, +dtrace:::END +{ + normalize(@, 1000); + printa("%koncpu:%d ms:%@d\n", @); + trunc(@); + exit(0); +} diff --git a/tools/FlameGraph/dev/gatherthc-kern.d b/tools/FlameGraph/dev/gatherthc-kern.d new file mode 100755 index 0000000..50ef891 --- /dev/null +++ b/tools/FlameGraph/dev/gatherthc-kern.d @@ -0,0 +1,32 @@ +#!/usr/sbin/dtrace -s + +#pragma D option stackframes=100 +#pragma D option defaultargs + +profile:::profile-999 +/arg0/ +{ + @[stack(), (uint64_t)curthread, pid, tid, execname, 1] = sum(1000); +} + +sched:::off-cpu +{ + self->start = timestamp; +} + +sched:::on-cpu +/(this->start = self->start)/ +{ + this->delta = (timestamp - this->start) / 1000; + @[stack(), (uint64_t)curthread, pid, tid, execname, 0] = sum(this->delta); + self->start = 0; +} + +profile:::tick-60s, +dtrace:::END +{ + normalize(@, 1000); + printa("%kthread:%d pid:%d tid:%d name:%s oncpu:%d ms:%@d\n", @); + trunc(@); + exit(0); +} diff --git a/tools/FlameGraph/dev/hcstackcollapse.pl b/tools/FlameGraph/dev/hcstackcollapse.pl new file mode 100755 index 0000000..9e56282 --- /dev/null +++ b/tools/FlameGraph/dev/hcstackcollapse.pl @@ -0,0 +1,87 @@ +#!/usr/bin/perl -w +# +# hcstackcollapse.pl collapse hot/cold multiline stacks into single lines. +# +# EXPERIMENTAL: This is a work in progress, and may not work properly. +# +# Parses a multiline stack followed by oncpu status and ms on a separate line +# (see example below) and outputs a comma separated stack followed by a space +# and the number. If memory addresses (+0xd) are present, they are stripped, +# and resulting identical stacks are colased with their counts summed. +# +# USAGE: ./hcstackcollapse.pl infile > outfile +# +# Example input: +# +# mysqld`_Z10do_commandP3THD+0xd4 +# mysqld`handle_one_connection+0x1a6 +# libc.so.1`_thrp_setup+0x8d +# libc.so.1`_lwp_start +# oncpu:1 ms:2664 +# +# Example output: +# +# libc.so.1`_lwp_start,libc.so.1`_thrp_setup,mysqld`handle_one_connection,mysqld`_Z10do_commandP3THD oncpu:1 ms:2664 +# +# Input may contain many stacks, and can be generated using DTrace. The +# first few lines of input are skipped (see $headerlines). +# +# Copyright 2013 Joyent, Inc. All rights reserved. +# Copyright 2013 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 14-Aug-2011 Brendan Gregg Created this. + +use strict; + +my %collapsed; +my $headerlines = 2; + +sub remember_stack { + my ($stack, $oncpu, $count) = @_; + $collapsed{"$stack $oncpu"} += $count; +} + +my $nr = 0; +my @stack; + +foreach (<>) { + next if $nr++ < $headerlines; + chomp; + + if (m/^oncpu:(\d+) ms:(\d+)$/) { + remember_stack(join(",", @stack), $1, $2) unless $2 == 0; + @stack = (); + next; + } + + next if (m/^\s*$/); + + my $frame = $_; + $frame =~ s/^\s*//; + $frame =~ s/\+.*$//; + $frame = "-" if $frame eq ""; + unshift @stack, $frame; +} + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + print "$k $collapsed{$k}\n"; +} diff --git a/tools/FlameGraph/dev/hotcoldgraph.pl b/tools/FlameGraph/dev/hotcoldgraph.pl new file mode 100755 index 0000000..1d53476 --- /dev/null +++ b/tools/FlameGraph/dev/hotcoldgraph.pl @@ -0,0 +1,267 @@ +#!/usr/bin/perl -w +# +# hotcoldgraph.pl flame/cold stack grapher. +# +# EXPERIMENTAL: This is a work in progress, and may not work properly. +# +# This takes on and off-cpu stack timings (see hcstackcollapse.pl) and +# renders a call graph, allowing latency in codepaths to be quickly identified. +# +# USAGE: ./hotcoldgraph.pl input.txt > graph.svg +# +# grep funcA input.txt | ./hotcoldgraph.pl > graph.svg +# +# The input is stack frames and sample counts formatted as single lines. Each +# frame in the stack is comma separated, with a space and count at the end of +# the line. These can be generated using DTrace with stackcollapse.pl. +# +# The output graph shows relative presense of functions in stack samples. The +# ordering on the x-axis has no meaning; since the data is samples, time order +# of events is not known. The order used sorts function names alphabeticly. +# +# HISTORY +# +# This was inspired by Neelakanth Nadgir's excellent function_call_graph.rb +# program, which visualized function entry and return trace events. As Neel +# wrote: "The output displayed is inspired by Roch's CallStackAnalyzer which +# was in turn inspired by the work on vftrace by Jan Boerhout". See: +# http://blogs.sun.com/realneel/entry/visualizing_callstacks_via_dtrace_and +# +# For the on-CPU graph only, see flamegraph.pl. +# +# Copyright 2013 Joyent, Inc. All rights reserved. +# Copyright 2013 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 10-Sep-2011 Brendan Gregg Created this. + +use strict; + +# tunables +my $fonttype = "Verdana"; +my $imagewidth = 1200; # max width, pixels +my $frameheight = 16; # max height is dynamic +my $fontsize = 12; # base text size +my $minwidth = 0.1; # min function width, pixels + +# internals +my $ypad1 = $fontsize * 4; # pad top, include title +my $ypad2 = $fontsize * 2 + 10; # pad bottom, include labels +my $xpad = 10; # pad lefm and right +my $timemax = 0; +my $depthmax = 0; +my %Events; + +# SVG functions +{ package SVG; + sub new { + my $class = shift; + my $self = {}; + bless ($self, $class); + return $self; + } + + sub header { + my ($self, $w, $h) = @_; + $self->{svg} .= < + + +SVG + } + + sub include { + my ($self, $content) = @_; + $self->{svg} .= $content; + } + + sub colorAllocate { + my ($self, $r, $g, $b) = @_; + return "rgb($r,$g,$b)"; + } + + sub filledRectangle { + my ($self, $x1, $y1, $x2, $y2, $fill, $extra) = @_; + $x1 = sprintf "%0.1f", $x1; + $x2 = sprintf "%0.1f", $x2; + my $w = sprintf "%0.1f", $x2 - $x1; + my $h = sprintf "%0.1f", $y2 - $y1; + $extra = defined $extra ? $extra : ""; + $self->{svg} .= qq/\n/; + } + + sub stringTTF { + my ($self, $color, $font, $size, $angle, $x, $y, $str, $loc, $extra) = @_; + $loc = defined $loc ? $loc : "left"; + $extra = defined $extra ? $extra : ""; + $self->{svg} .= qq/$str<\/text>\n/; + } + + sub svg { + my $self = shift; + return "$self->{svg}\n"; + } + 1; +} + +sub color { + my $type = shift; + if (defined $type and $type eq "hot") { + my $r = 205 + int(rand(50)); + my $g = 0 + int(rand(230)); + my $b = 0 + int(rand(55)); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "cold") { + my $r = 0 + int(rand(40)); + my $b = 205 + int(rand(50)); + my $g = 0 + int(rand(150)); + return "rgb($r,$g,$b)"; + } + return "rgb(0,0,0)"; +} + +my %Node; +my %Tmp; + +sub flow { + my ($a, $b, $ca, $cb, $v) = @_; + my @A = split ",", $a; + my @B = split ",", $b; + + my $len_a = $#A; + my $len_b = $#B; + $depthmax = $len_b if $len_b > $depthmax; + + my $i = 0; + my $len_same = 0; + for (; $i <= $len_a; $i++) { + last if $i > $len_b; + last if $A[$i] ne $B[$i]; + } + $len_same = $i; + $len_same = 0 if $ca != $cb; + + for ($i = $len_a; $i >= $len_same; $i--) { + my $k = "$A[$i]-$i"; + # a unique ID is constructed from func-depth-etime; + # func-depth isn't unique, it may be repeated later. + $Node{"$k-$v-$ca"}->{stime} = $Tmp{$k}->{stime}; + delete $Tmp{$k}->{stime}; + delete $Tmp{$k}; + } + + for ($i = $len_same; $i <= $len_b; $i++) { + my $k = "$B[$i]-$i"; + $Tmp{$k}->{stime} = $v; + } +} + +# Parse input +my @Data = <>; +my $laststack = ""; +my $lastcpu = 0; +my $time = 0; +foreach (sort @Data) { + chomp; + my ($stack, $cpu, $samples) = split ' '; + $stack = ",$stack"; + next unless defined $samples; + flow($laststack, $stack, $lastcpu, $cpu, $time); + $time += $samples; + $laststack = $stack; + $lastcpu = $cpu; +} +flow($laststack, "", $lastcpu, 0, $time); +$timemax = $time or die "ERROR: No stack counts found\n"; + +# Draw canvas +my $widthpertime = ($imagewidth - 2 * $xpad) / $timemax; +my $imageheight = ($depthmax * $frameheight) + $ypad1 + $ypad2; +my $im = SVG->new(); +$im->header($imagewidth, $imageheight); +my $inc = < + + + + + + + +INC +$im->include($inc); +$im->filledRectangle(0, 0, $imagewidth, $imageheight, 'url(#background)'); +my ($white, $black, $vvdgrey, $vdgrey) = ( + $im->colorAllocate(255, 255, 255), + $im->colorAllocate(0, 0, 0), + $im->colorAllocate(40, 40, 40), + $im->colorAllocate(160, 160, 160), + ); +$im->stringTTF($black, $fonttype, $fontsize + 5, 0.0, int($imagewidth / 2), $fontsize * 2, "Flame Graph", "middle"); +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $xpad, $imageheight - ($ypad2 / 2), 'Function:'); +$im->stringTTF($black, $fonttype, $fontsize, 0.0, $xpad + 60, $imageheight - ($ypad2 / 2), " ", "", 'id="details"'); + +# Draw frames +foreach my $id (keys %Node) { + my ($func, $depth, $etime, $cpu) = split "-", $id; + die "missing start for $id" if !defined $Node{$id}->{stime}; + my $stime = $Node{$id}->{stime}; + my $samples = $etime - $stime; + + my $x1 = $xpad + $stime * $widthpertime; + my $x2 = $xpad + $etime * $widthpertime; + my $width = $x2 - $x1; + next if $width < $minwidth; + + my $y1 = $imageheight - $ypad2 - ($depth + 1) * $frameheight + 1; + my $y2 = $imageheight - $ypad2 - $depth * $frameheight; + + my $info; + if ($func eq "" and $depth == 0) { + $info = "all ($samples ms, 100%)"; + } else { + my $pct = sprintf "%.2f", ((100 * $samples) / $timemax); + $info = "$func ($samples ms, $pct%)"; + } + my $color = $cpu ? "hot" : "cold"; + $im->filledRectangle($x1, $y1, $x2, $y2, color($color), 'rx="2" ry="2" onmouseover="s(' . "'$info'" . ')" onmouseout="c()"'); + + if ($width > 50) { + my $chars = int($width / (0.7 * $fontsize)); + my $text = substr $func, 0, $chars; + $text .= ".." if $chars < length $func; + $im->stringTTF($black, $fonttype, $fontsize, 0.0, $x1 + 3, 3 + ($y1 + $y2) / 2, $text, "", + 'onmouseover="s(' . "'$info'" . ')" onmouseout="c()"'); + } +} + +print $im->svg; diff --git a/tools/FlameGraph/dev/thcstackcollapse.pl b/tools/FlameGraph/dev/thcstackcollapse.pl new file mode 100755 index 0000000..2aa307e --- /dev/null +++ b/tools/FlameGraph/dev/thcstackcollapse.pl @@ -0,0 +1,89 @@ +#!/usr/bin/perl -w +# +# thcstackcollapse.pl collapse thread hot/cold multiline stacks into +# single lines. +# +# EXPERIMENTAL: This is a work in progress, and may not work properly. +# +# Parses a multiline stack followed by thread ID, PID, TID, name, oncpu status, +# and ms on a separate line (see example below) and outputs a comma separated +# stack followed by a space and the numbers. If memory addresses (+0xd) are +# present, they are stripped, and resulting identical stacks are colased with +# their counts summed. +# +# USAGE: ./thcstackcollapse.pl infile > outfile +# +# Example input: +# +# mysqld`_Z10do_commandP3THD+0xd4 +# mysqld`handle_one_connection+0x1a6 +# libc.so.1`_thrp_setup+0x8d +# libc.so.1`_lwp_start +# thread:0x78372480 pid:826 tid:3 name:mysqld oncpu:1 ms:2664 +# +# Example output: +# +# libc.so.1`_lwp_start,libc.so.1`_thrp_setup,mysqld`handle_one_connection,mysqld`_Z10do_commandP3THD 0x78372480 826 3 mysqld 1 2664 +# +# Input may contain many stacks, and can be generated using DTrace. The +# first few lines of input are skipped (see $headerlines). +# +# Copyright 2013 Joyent, Inc. All rights reserved. +# Copyright 2013 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 14-Aug-2011 Brendan Gregg Created this. + +use strict; + +my %collapsed; +my $headerlines = 2; + +sub remember_stack { + my ($stack, $thread, $pid, $tid, $name, $oncpu, $count) = @_; + $collapsed{"$stack $thread $pid $tid $name $oncpu"} += $count; +} + +my $nr = 0; +my @stack; + +foreach (<>) { + next if $nr++ < $headerlines; + chomp; + + next if (m/^\s*$/); + + if (m/^thread:(\d+) pid:(\d+) tid:(\d+) name:(.*?) oncpu:(\d+) ms:(\d+)$/) { + remember_stack(join(",", @stack), $1, $2, $3, $4, $5, $6) if $6 > 0; + @stack = (); + next; + } + + my $frame = $_; + $frame =~ s/^\s*//; + $frame =~ s/\+.*$//; + $frame = "-" if $frame eq ""; + unshift @stack, $frame; +} + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + print "$k $collapsed{$k}\n"; +} diff --git a/tools/FlameGraph/difffolded.pl b/tools/FlameGraph/difffolded.pl new file mode 100755 index 0000000..4c76c2e --- /dev/null +++ b/tools/FlameGraph/difffolded.pl @@ -0,0 +1,115 @@ +#!/usr/bin/perl -w +# +# difffolded.pl diff two folded stack files. Use this for generating +# flame graph differentials. +# +# USAGE: ./difffolded.pl [-hns] folded1 folded2 | ./flamegraph.pl > diff2.svg +# +# Options are described in the usage message (-h). +# +# The flamegraph will be colored based on higher samples (red) and smaller +# samples (blue). The frame widths will be based on the 2nd folded file. +# This might be confusing if stack frames disappear entirely; it will make +# the most sense to ALSO create a differential based on the 1st file widths, +# while switching the hues; eg: +# +# ./difffolded.pl folded2 folded1 | ./flamegraph.pl --negate > diff1.svg +# +# Here's what they mean when comparing a before and after profile: +# +# diff1.svg: widths show the before profile, colored by what WILL happen +# diff2.svg: widths show the after profile, colored by what DID happen +# +# INPUT: See stackcollapse* programs. +# +# OUTPUT: The full list of stacks, with two columns, one from each file. +# If a stack wasn't present in a file, the column value is zero. +# +# folded_stack_trace count_from_folded1 count_from_folded2 +# +# eg: +# +# funca;funcb;funcc 31 33 +# ... +# +# COPYRIGHT: Copyright (c) 2014 Brendan Gregg. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# (http://www.gnu.org/copyleft/gpl.html) +# +# 28-Oct-2014 Brendan Gregg Created this. + +use strict; +use Getopt::Std; + +# defaults +my $normalize = 0; # make sample counts equal +my $striphex = 0; # strip hex numbers + +sub usage { + print STDERR < diff2.svg + -h # help message + -n # normalize sample counts + -s # strip hex numbers (addresses) +See stackcollapse scripts for generating folded files. +Also consider flipping the files and hues to highlight reduced paths: +$0 folded2 folded1 | ./flamegraph.pl --negate > diff1.svg +USAGE_END + exit 2; +} + +usage() if @ARGV < 2; +our($opt_h, $opt_n, $opt_s); +getopts('ns') or usage(); +usage() if $opt_h; +$normalize = 1 if defined $opt_n; +$striphex = 1 if defined $opt_s; + +my ($total1, $total2) = (0, 0); +my %Folded; + +my $file1 = $ARGV[0]; +my $file2 = $ARGV[1]; + +open FILE, $file1 or die "ERROR: Can't read $file1\n"; +while () { + chomp; + my ($stack, $count) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + $stack =~ s/0x[0-9a-fA-F]+/0x.../g if $striphex; + $Folded{$stack}{1} += $count; + $total1 += $count; +} +close FILE; + +open FILE, $file2 or die "ERROR: Can't read $file2\n"; +while () { + chomp; + my ($stack, $count) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + $stack =~ s/0x[0-9a-fA-F]+/0x.../g if $striphex; + $Folded{$stack}{2} += $count; + $total2 += $count; +} +close FILE; + +foreach my $stack (keys %Folded) { + $Folded{$stack}{1} = 0 unless defined $Folded{$stack}{1}; + $Folded{$stack}{2} = 0 unless defined $Folded{$stack}{2}; + if ($normalize && $total1 != $total2) { + $Folded{$stack}{1} = int($Folded{$stack}{1} * $total2 / $total1); + } + print "$stack $Folded{$stack}{1} $Folded{$stack}{2}\n"; +} diff --git a/tools/FlameGraph/docs/cddl1.txt b/tools/FlameGraph/docs/cddl1.txt new file mode 100644 index 0000000..da23621 --- /dev/null +++ b/tools/FlameGraph/docs/cddl1.txt @@ -0,0 +1,384 @@ +Unless otherwise noted, all files in this distribution are released +under the Common Development and Distribution License (CDDL). +Exceptions are noted within the associated source files. + +-------------------------------------------------------------------- + + +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE Version 1.0 + +1. Definitions. + + 1.1. "Contributor" means each individual or entity that creates + or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Software, prior Modifications used by a Contributor (if any), + and the Modifications made by that particular Contributor. + + 1.3. "Covered Software" means (a) the Original Software, or (b) + Modifications, or (c) the combination of files containing + Original Software with files containing Modifications, in + each case including portions thereof. + + 1.4. "Executable" means the Covered Software in any form other + than Source Code. + + 1.5. "Initial Developer" means the individual or entity that first + makes Original Software available under this License. + + 1.6. "Larger Work" means a work which combines Covered Software or + portions thereof with code not governed by the terms of this + License. + + 1.7. "License" means this document. + + 1.8. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed + herein. + + 1.9. "Modifications" means the Source Code and Executable form of + any of the following: + + A. Any file that results from an addition to, deletion from or + modification of the contents of a file containing Original + Software or previous Modifications; + + B. Any new file that contains any part of the Original + Software or previous Modifications; or + + C. Any new file that is contributed or otherwise made + available under the terms of this License. + + 1.10. "Original Software" means the Source Code and Executable + form of computer software code that is originally released + under this License. + + 1.11. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, + process, and apparatus claims, in any patent Licensable by + grantor. + + 1.12. "Source Code" means (a) the common form of computer software + code in which modifications are made and (b) associated + documentation included in or with such code. + + 1.13. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms + of, this License. For legal entities, "You" includes any + entity which controls, is controlled by, or is under common + control with You. For purposes of this definition, + "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty + percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, the Initial + Developer hereby grants You a world-wide, royalty-free, + non-exclusive license: + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer, to use, + reproduce, modify, display, perform, sublicense and + distribute the Original Software (or portions thereof), + with or without Modifications, and/or as part of a Larger + Work; and + + (b) under Patent Claims infringed by the making, using or + selling of Original Software, to make, have made, use, + practice, sell, and offer for sale, and/or otherwise + dispose of the Original Software (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are + effective on the date Initial Developer first distributes + or otherwise makes the Original Software available to a + third party under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: (1) for code that You delete from the Original + Software, or (2) for infringements caused by: (i) the + modification of the Original Software, or (ii) the + combination of the Original Software with other software + or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and + subject to third party intellectual property claims, each + Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor to use, reproduce, + modify, display, perform, sublicense and distribute the + Modifications created by such Contributor (or portions + thereof), either on an unmodified basis, with other + Modifications, as Covered Software and/or as part of a + Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either + alone and/or in combination with its Contributor Version + (or portions of such combination), to make, use, sell, + offer for sale, have made, and/or otherwise dispose of: + (1) Modifications made by that Contributor (or portions + thereof); and (2) the combination of Modifications made by + that Contributor with its Contributor Version (or portions + of such combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first distributes or + otherwise makes the Modifications available to a third + party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: (1) for any code that Contributor has deleted + from the Contributor Version; (2) for infringements caused + by: (i) third party modifications of Contributor Version, + or (ii) the combination of Modifications made by that + Contributor with other software (except as part of the + Contributor Version) or other devices; or (3) under Patent + Claims infringed by Covered Software in the absence of + Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Availability of Source Code. + + Any Covered Software that You distribute or otherwise make + available in Executable form must also be made available in Source + Code form and that Source Code form must be distributed only under + the terms of this License. You must include a copy of this + License with every copy of the Source Code form of the Covered + Software You distribute or otherwise make available. You must + inform recipients of any such Covered Software in Executable form + as to how they can obtain such Covered Software in Source Code + form in a reasonable manner on or through a medium customarily + used for software exchange. + + 3.2. Modifications. + + The Modifications that You create or to which You contribute are + governed by the terms of this License. You represent that You + believe Your Modifications are Your original creation(s) and/or + You have sufficient rights to grant the rights conveyed by this + License. + + 3.3. Required Notices. + + You must include a notice in each of Your Modifications that + identifies You as the Contributor of the Modification. You may + not remove or alter any copyright, patent or trademark notices + contained within the Covered Software, or any notices of licensing + or any descriptive text giving attribution to any Contributor or + the Initial Developer. + + 3.4. Application of Additional Terms. + + You may not offer or impose any terms on any Covered Software in + Source Code form that alters or restricts the applicable version + of this License or the recipients' rights hereunder. You may + choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of + Covered Software. However, you may do so only on Your own behalf, + and not on behalf of the Initial Developer or any Contributor. + You must make it absolutely clear that any such warranty, support, + indemnity or liability obligation is offered by You alone, and You + hereby agree to indemnify the Initial Developer and every + Contributor for any liability incurred by the Initial Developer or + such Contributor as a result of warranty, support, indemnity or + liability terms You offer. + + 3.5. Distribution of Executable Versions. + + You may distribute the Executable form of the Covered Software + under the terms of this License or under the terms of a license of + Your choice, which may contain terms different from this License, + provided that You are in compliance with the terms of this License + and that the license for the Executable form does not attempt to + limit or alter the recipient's rights in the Source Code form from + the rights set forth in this License. If You distribute the + Covered Software in Executable form under a different license, You + must make it absolutely clear that any terms which differ from + this License are offered by You alone, not by the Initial + Developer or Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred + by the Initial Developer or such Contributor as a result of any + such terms You offer. + + 3.6. Larger Works. + + You may create a Larger Work by combining Covered Software with + other code not governed by the terms of this License and + distribute the Larger Work as a single product. In such a case, + You must make sure the requirements of this License are fulfilled + for the Covered Software. + +4. Versions of the License. + + 4.1. New Versions. + + Sun Microsystems, Inc. is the initial license steward and may + publish revised and/or new versions of this License from time to + time. Each version will be given a distinguishing version number. + Except as provided in Section 4.3, no one other than the license + steward has the right to modify this License. + + 4.2. Effect of New Versions. + + You may always continue to use, distribute or otherwise make the + Covered Software available under the terms of the version of the + License under which You originally received the Covered Software. + If the Initial Developer includes a notice in the Original + Software prohibiting it from being distributed or otherwise made + available under any subsequent version of the License, You must + distribute and make the Covered Software available under the terms + of the version of the License under which You originally received + the Covered Software. Otherwise, You may also choose to use, + distribute or otherwise make the Covered Software available under + the terms of any subsequent version of the License published by + the license steward. + + 4.3. Modified Versions. + + When You are an Initial Developer and You want to create a new + license for Your Original Software, You may create and use a + modified version of this License if You: (a) rename the license + and remove any references to the name of the license steward + (except to note that the license differs from this License); and + (b) otherwise make it clear that the license contains terms which + differ from this License. + +5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" + BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED + SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR + PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND + PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY + COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE + INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY + NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF + WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS + DISCLAIMER. + +6. TERMINATION. + + 6.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to + cure such breach within 30 days of becoming aware of the breach. + Provisions which, by their nature, must remain in effect beyond + the termination of this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding + declaratory judgment actions) against Initial Developer or a + Contributor (the Initial Developer or Contributor against whom You + assert such claim is referred to as "Participant") alleging that + the Participant Software (meaning the Contributor Version where + the Participant is a Contributor or the Original Software where + the Participant is the Initial Developer) directly or indirectly + infringes any patent, then any and all rights granted directly or + indirectly to You by such Participant, the Initial Developer (if + the Initial Developer is not the Participant) and all Contributors + under Sections 2.1 and/or 2.2 of this License shall, upon 60 days + notice from Participant terminate prospectively and automatically + at the expiration of such 60 day notice period, unless if within + such 60 day period You withdraw Your claim with respect to the + Participant Software against such Participant either unilaterally + or pursuant to a written agreement with Participant. + + 6.3. In the event of termination under Sections 6.1 or 6.2 above, + all end user licenses that have been validly granted by You or any + distributor hereunder prior to termination (excluding licenses + granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE + INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF + COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE + LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT + LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK + STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL + INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT + APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO + NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR + CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT + APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + + The Covered Software is a "commercial item," as that term is + defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial + computer software" (as that term is defined at 48 + C.F.R. 252.227-7014(a)(1)) and "commercial computer software + documentation" as such terms are used in 48 C.F.R. 12.212 + (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 + C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all + U.S. Government End Users acquire Covered Software with only those + rights set forth herein. This U.S. Government Rights clause is in + lieu of, and supersedes, any other FAR, DFAR, or other clause or + provision that addresses Government rights in computer software + under this License. + +9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed + by the law of the jurisdiction specified in a notice contained + within the Original Software (except to the extent applicable law, + if any, provides otherwise), excluding such jurisdiction's + conflict-of-law provisions. Any litigation relating to this + License shall be subject to the jurisdiction of the courts located + in the jurisdiction and venue specified in a notice contained + within the Original Software, with the losing party responsible + for costs, including, without limitation, court costs and + reasonable attorneys' fees and expenses. The application of the + United Nations Convention on Contracts for the International Sale + of Goods is expressly excluded. Any law or regulation which + provides that the language of a contract shall be construed + against the drafter shall not apply to this License. You agree + that You alone are responsible for compliance with the United + States export administration regulations (and the export control + laws and regulation of any other countries) when You use, + distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or + indirectly, out of its utilization of rights under this License + and You agree to work with Initial Developer and Contributors to + distribute such responsibility on an equitable basis. Nothing + herein is intended or shall be deemed to constitute any admission + of liability. + +-------------------------------------------------------------------- + +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND +DISTRIBUTION LICENSE (CDDL) + +For Covered Software in this distribution, this License shall +be governed by the laws of the State of California (excluding +conflict-of-law provisions). + +Any litigation relating to this License shall be subject to the +jurisdiction of the Federal Courts of the Northern District of +California and the state courts of the State of California, with +venue lying in Santa Clara County, California. diff --git a/tools/FlameGraph/example-dtrace-stacks.txt b/tools/FlameGraph/example-dtrace-stacks.txt new file mode 100644 index 0000000..04d8442 --- /dev/null +++ b/tools/FlameGraph/example-dtrace-stacks.txt @@ -0,0 +1,41913 @@ +CPU ID FUNCTION:NAME + 0 64091 :tick-60s + + + genunix`kmem_cpu_reload+0x20 + genunix`kmem_cache_free+0xce + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`cv_broadcast+0x1 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`tsc_gethrtimeunscaled+0x21 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 1 + + unix`mutex_exit+0x12 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_exit+0x12 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_init+0x32 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`tsc_read+0x3 + unix`mutex_vector_enter+0xcc + genunix`lookuppnatcred+0x89 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`zfs_lookup+0xa5 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookupnameatcred+0x76 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fop_lookup+0x16 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x46 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`crfree+0x76 + genunix`unfalloc+0x4a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_rele+0x27 + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fop_lookup+0x118 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`dispatch_hilevel+0x18 + unix`do_interrupt+0x120 + unix`_interrupt+0xba + unix`strlen+0x10 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cpu_reload+0x28 + genunix`kmem_cache_free+0xce + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cpu_reload+0x28 + genunix`kmem_cache_free+0xce + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + ufs`ufs_lookup+0x48 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnvp+0x1f9 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x49 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x49 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_exit+0x19 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_init+0x39 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`ufalloc_file+0x4b + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`setf+0xfb + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_free+0xb + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_rele+0x2c + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fop_lookup+0x1d + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cpu_reload+0x2d + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cpu_reload+0x2d + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x4e + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`dnlc_lookup+0xef + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`sigcheck+0x20 + genunix`post_syscall+0x3d3 + unix`0xfffffffffb800c91 + 1 + + ufs`ufs_getpage+0x1 + genunix`segvn_fault+0xdfa + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + genunix`dnlc_lookup+0xf2 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`pn_get_buf+0x13 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`specvp_check+0x24 + zfs`zfs_lookup+0xf4 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`openat+0x25 + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x56 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`post_syscall+0x1b7 + unix`0xfffffffffb800c91 + 1 + + genunix`cv_broadcast+0x17 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`zfs_fastaccesschk_execute+0x47 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`table_lock_enter+0x8 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_recycle+0x98 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`specvp_check+0x29 + zfs`zfs_lookup+0xf4 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fop_lookup+0x129 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x5a + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`table_lock_enter+0xc + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_rele+0x3d + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mtype_func+0x8e + unix`page_get_mnode_freelist+0x4f + unix`page_get_freelist+0x16d + unix`page_create_va+0x2ad + genunix`pvn_read_kluster+0x10c + ufs`ufs_getpage_ra+0x11c + ufs`ufs_getpage+0x866 + genunix`fop_getpage+0x7e + genunix`segvn_faulta+0x12b + genunix`as_faulta+0x143 + genunix`memcntl+0x53d + unix`sys_syscall+0x17a + 1 + + genunix`post_syscall+0x1bf + unix`0xfffffffffb800c91 + 1 + + genunix`lookuppnvp+0xf + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`dnlc_lookup+0x100 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`dnlc_lookup+0x104 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`copen+0x1a6 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`zfs_lookup+0xc7 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`setbackdq+0x258 + FSS`fss_preempt+0x241 + unix`preempt+0xd6 + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`kmem_cache_alloc+0x6a + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fd_find+0x9c + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`thread_lock+0x3f + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 1 + + genunix`disp_lock_exit+0x20 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 1 + + genunix`segvn_fault + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + lofs`lo_root+0x22 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x73 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`lo_lookup+0x54 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`open+0x14 + unix`sys_syscall+0x17a + 1 + + unix`htable_lookup+0x44 + unix`htable_walk+0x17e + unix`hat_unload_callback+0x138 + genunix`segvn_unmap+0x5b7 + genunix`as_unmap+0x19c + unix`mmapobj_map_elf+0x147 + unix`mmapobj_map_interpret+0x22c + unix`mmapobj+0x71 + genunix`mmapobjsys+0x1d0 + unix`sys_syscall+0x17a + 1 + + lofs`freelonode+0x1f9 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_free+0x3a + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_free+0x3a + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0xc + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`dnlc_lookup+0x11e + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_rele+0x60 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnvp+0x330 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xb0 + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_mountedvfs+0x1 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0x13 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`pn_getcomponent+0x84 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`bcopy+0x244 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x84 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xb4 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + ufs`ufs_lookup+0x84 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`audit_falloc+0x6 + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`bcopy+0x248 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnvp+0x138 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x89 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnvp+0x23a + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`disp_lock_exit+0x3b + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 1 + + genunix`vn_vfslocks_getlock+0x1b + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fd_reserve+0xb + genunix`ufalloc_file+0x103 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`table_lock_enter+0x3c + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`table_lock_enter+0x3c + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x8d + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x8d + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xbd + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0x1f + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_reinit+0xf + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0xff + unix`0xfffffffffb800c86 + 1 + + unix`page_numtopp_nolock+0x130 + unix`hat_pte_unmap+0xb8 + unix`hat_unload_callback+0x259 + genunix`segvn_unmap+0x5b7 + genunix`as_free+0xdc + genunix`relvm+0x220 + genunix`proc_exit+0x444 + genunix`exit+0x15 + genunix`rexit+0x18 + unix`sys_syscall+0x17a + 1 + + genunix`vn_mountedvfs+0x10 + genunix`lookuppnvp+0x217 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_exit + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_exit+0x1 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_free+0x52 + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_openat+0x83 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`table_lock_enter+0x45 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_exists+0x15 + lofs`makelonode+0x1e7 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`setbackdq+0x286 + FSS`fss_preempt+0x241 + unix`preempt+0xd6 + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`vn_openat+0x486 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_openat+0x87 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_free+0x57 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_destroy+0x78 + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0x29 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_openat+0x48a + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnatcred+0x13a + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_init+0x1b + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_destroy+0x7b + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`cv_init+0xd + genunix`rwst_init+0x47 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`cv_init+0xd + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0x2d + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xce + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`lwp_getdatamodel+0xf + genunix`post_syscall+0x2f5 + unix`0xfffffffffb800c91 + 1 + + unix`prunstop + unix`0xfffffffffb800c91 + 1 + + unix`hment_compare+0x10 + genunix`avl_find+0x72 + genunix`avl_add+0x27 + unix`hment_insert+0x8b + unix`hment_assign+0x3a + unix`hati_pte_map+0x343 + unix`hati_load_common+0x139 + unix`hat_memload+0x75 + unix`hat_memload_region+0x25 + genunix`segvn_fault+0x1079 + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + unix`bcopy+0x260 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0x10 + unix`sys_syscall+0x1a1 + 1 + + genunix`cv_init+0x11 + genunix`rwst_init+0x47 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`cv_init+0x11 + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_init+0x21 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_init+0x21 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`copen+0x1e2 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`membar_enter+0x3 + unix`disp+0x11e + unix`swtch+0xba + unix`preempt+0xec + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + lofs`table_lock_enter+0x54 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_openat+0x94 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`pn_getcomponent+0xa5 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0x35 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`cpucaps_charge+0x75 + FSS`fss_preempt+0x12f + unix`preempt+0xd6 + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + unix`bcopy+0x268 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnvp+0x58 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_enter_common+0x1e8 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0x39 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_alloc+0xd9 + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`lwp_getdatamodel+0x19 + genunix`post_syscall+0x2f5 + unix`0xfffffffffb800c91 + 1 + + unix`lwp_getdatamodel+0x1a + unix`0xfffffffffb800c91 + 1 + + genunix`fop_lookup+0x7b + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fop_lookup+0x7b + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xdb + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`crgetuid+0xb + ufs`ufs_iaccess+0xe5 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0x3c + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`copen+0xed + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`cv_init+0x1d + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`freelonode+0x2f + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`pn_getcomponent+0xb0 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`ufalloc_file+0xb0 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0x22 + unix`0xfffffffffb800c86 + 1 + + genunix`audit_falloc+0x34 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`cv_broadcast+0x76 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`lock_try+0x6 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 1 + + genunix`set_errno+0x17 + genunix`copen+0x4fa + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`copen+0x1f8 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`pn_getcomponent+0xba + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0x2a + unix`0xfffffffffb800c86 + 1 + + genunix`post_syscall+0x21b + unix`0xfffffffffb800c91 + 1 + + genunix`lookuppnatcred+0x5b + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`post_syscall+0x1b + unix`0xfffffffffb800c91 + 1 + + unix`prunstop+0x1c + unix`0xfffffffffb800c91 + 1 + + genunix`dnlc_lookup+0x5c + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookuppn+0x38 + genunix`resolvepath+0x86 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xed + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xed + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xed + genunix`kmem_free+0x4e + genunix`removectx+0xf5 + genunix`schedctl_lwp_cleanup+0x8e + genunix`exitlwps+0x73 + genunix`proc_exit+0x59 + genunix`exit+0x15 + genunix`rexit+0x18 + unix`sys_syscall+0x17a + 1 + + lofs`freelonode+0x23f + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`dnlc_lookup+0x160 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`copen+0x1 + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_invalid+0x1 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_invalid+0x1 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_enter_common+0x1 + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`do_splx+0x1 + unix`preempt+0xec + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`crhold+0x11 + genunix`falloc+0xbc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`dnlc_lookup+0x65 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`zfs_lookup+0x25 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnatcred+0x66 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`cv_destroy+0x8 + genunix`rwst_destroy+0x25 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_setpath+0xc9 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnatcred+0x6a + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xfa + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`cv_destroy+0xc + genunix`rwst_destroy+0x25 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_recycle+0xc + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fop_lookup+0x9c + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0x5d + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnvp+0x7d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0x13d + unix`0xfffffffffb800c86 + 1 + + genunix`syscall_mstate+0x13d + unix`sys_syscall+0x1a1 + 1 + + genunix`lookuppnatcred+0x6e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_reinit+0x4f + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`pn_fixslash+0x40 + genunix`lookuppnvp+0x105 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`do_splx+0x10 + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 1 + + genunix`kmem_cache_free + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`thread_lock+0xa1 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 1 + + genunix`memcmp+0x1 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_exit+0x41 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + doorfs`door_close+0x1 + namefs`nm_close+0xac + genunix`fop_close+0x61 + genunix`closef+0x5e + genunix`close_exec+0xfd + genunix`exec_common+0x7e4 + genunix`exece+0x1b + unix`_sys_sysenter_post_swapgs+0x149 + 1 + + unix`cpucaps_charge+0xa2 + FSS`fss_preempt+0x12f + unix`preempt+0xd6 + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`vn_vfslocks_rele+0x23 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`setf+0x83 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`dotoprocs+0xc4 + genunix`doprio+0x77 + genunix`priocntl_common+0x616 + genunix`priocntlsys+0x24 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_alloc+0x4 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0x45 + unix`sys_syscall+0x10e + 1 + + genunix`setf+0x87 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`lock_clear_splx+0x7 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 1 + + genunix`fop_lookup+0xaa + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fd_find+0xb + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`pn_fixslash+0x4c + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0xc + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_getlock+0x6e + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_zalloc+0x1e + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`post_syscall+0x13e + unix`0xfffffffffb800c91 + 1 + + genunix`copen+0x20 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`traverse+0x10 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x10 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x10 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x10 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + FSS`fss_preempt + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`vn_recycle+0x21 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`crfree+0x11 + genunix`unfalloc+0x4a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_enter_common+0x22 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`memcmp+0x13 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`zfs_lookup+0x43 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0x153 + unix`sys_syscall+0x1a1 + 1 + + genunix`lookuppnatcred+0x84 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`crfree+0x15 + genunix`unfalloc+0x4a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`bitset_in_set+0x6 + unix`cpu_wakeup_mwait+0x40 + unix`setbackdq+0x200 + FSS`fss_preempt+0x241 + unix`preempt+0xd6 + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`dnlc_lookup+0x186 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_zalloc+0x26 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`hment_insert+0x37 + unix`hment_assign+0x3a + unix`hati_pte_map+0x343 + unix`hati_load_common+0x139 + unix`hat_memload+0x75 + unix`hat_memload_region+0x25 + genunix`segvn_fault+0x1079 + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + genunix`kmem_cache_free+0x17 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`setf+0x98 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`post_syscall+0x34b + unix`0xfffffffffb800c91 + 1 + + genunix`traverse+0x1c + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_enter_common+0x2d + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_zalloc+0x2d + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`setbackdq+0x3de + FSS`fss_preempt+0x241 + unix`preempt+0xd6 + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + lofs`lo_inactive+0x1e + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_free+0x9e + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookupnameatcred+0x1e + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`falloc+0xaf + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fd_find+0x21 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`dnlc_lookup+0x92 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x22 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x22 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`secpolicy_vnode_access2+0x222 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_free+0xa3 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`cmt_balance+0xc3 + unix`setbackdq+0x3a3 + FSS`fss_preempt+0x241 + unix`preempt+0xd6 + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`rwst_enter_common+0x335 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_recycle+0x36 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookuppnvp+0x3a7 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0x167 + unix`sys_syscall+0x1a1 + 1 + + ufs`ufs_lookup+0xf7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_delay_default+0x7 + unix`mutex_vector_enter+0xcc + genunix`lookuppnatcred+0x89 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`page_create_va+0x218 + genunix`pvn_read_kluster+0x10c + ufs`ufs_getpage_ra+0x11c + ufs`ufs_getpage+0x866 + genunix`fop_getpage+0x7e + genunix`segvn_faulta+0x12b + genunix`as_faulta+0x143 + genunix`memcntl+0x53d + unix`sys_syscall+0x17a + 1 + + lofs`makelonode+0x6a + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`unfalloc+0x1a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fop_lookup+0x1cb + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fop_lookup+0x1cb + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x2b + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vmem_free+0x2b + genunix`segkp_release_internal+0x1ab + genunix`segkp_release+0xa0 + genunix`schedctl_freepage+0x34 + genunix`schedctl_proc_cleanup+0x68 + genunix`proc_exit+0x1ab + genunix`exit+0x15 + genunix`rexit+0x18 + unix`sys_syscall+0x17a + 1 + + genunix`crgetmapped+0xb + genunix`fop_lookup+0x1dc + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`copystr+0x2e + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x2f + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x2f + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`crgetmapped+0xf + genunix`fop_lookup+0x1dc + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x100 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x100 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + ufs`ufs_lookup+0x100 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`makelonode+0x71 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_openat+0xf1 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfsrlock+0x31 + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`ufalloc_file+0x1 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`swtch+0x14 + unix`preempt+0xec + unix`kpreempt+0x98 + unix`sys_rtt_common+0x1ba + unix`_sys_rtt_ints_disabled+0x8 + genunix`audit_getstate + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_recycle+0x45 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfslocks_rele+0x57 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x37 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`zfs_lookup+0x68 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`lookupnameatcred+0x3a + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_free+0x3a + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`schedctl_save+0x1b + genunix`savectx+0x35 + unix`resume+0x5b + unix`swtch+0x141 + unix`preempt+0xec + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`dnlc_lookup+0xac + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vsd_free+0xdc + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vsd_free+0xdc + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`thread_lock+0xdd + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 1 + + lofs`freelonode+0x18e + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + ufs`ufs_lookup+0xf + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + ufs`ufs_lookup+0x10f + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`pn_getcomponent+0x10 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x110 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_enter + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_enter + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`lgrp_mem_choose+0x1 + genunix`swap_getapage+0x113 + genunix`swap_getpage+0x90 + genunix`fop_getpage+0x7e + genunix`anon_zero+0xb6 + genunix`segvn_faultpage+0x6d2 + genunix`segvn_fault+0x8e6 + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + genunix`audit_getstate+0x1 + unix`0xfffffffffb800c91 + 1 + + genunix`rwst_destroy+0x32 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`disp_lock_exit_high+0x33 + unix`swtch+0xba + unix`preempt+0xec + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`lookuppnvp+0x3c3 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + ufs`ufs_lookup+0x13 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0x84 + unix`sys_syscall+0x1a1 + 1 + + zfs`zfs_lookup+0x76 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`unfalloc+0x37 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x118 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`lo_lookup+0x2f9 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vsd_free+0xe9 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_enter+0x9 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_enter+0x9 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_enter+0x9 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_enter+0x9 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_exit+0x8a + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_zalloc+0x5a + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x1b + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`copen+0x15c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`unfalloc+0x3c + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`zfs_fastaccesschk_execute+0xc + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`audit_getstate+0xd + genunix`setf+0x3f + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`audit_getstate+0xd + genunix`lookuppnvp+0x82 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + zfs`zfs_lookup+0x7e + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`traverse+0x4e + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x1e + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`hwblkclr+0x3f + unix`pfnzero+0x78 + unix`pagezero+0x2d + genunix`anon_zero+0xd2 + genunix`segvn_faultpage+0x6d2 + genunix`segvn_fault+0x8e6 + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + unix`tsc_gethrtimeunscaled + genunix`mstate_thread_onproc_time+0x59 + unix`caps_charge_adjust+0x32 + unix`cpucaps_charge+0x58 + FSS`fss_preempt+0x12f + unix`preempt+0xd6 + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + unix`page_lookup_create+0xf0 + unix`page_lookup+0x21 + genunix`swap_getapage+0xea + genunix`swap_getpage+0x90 + genunix`fop_getpage+0x7e + genunix`anon_zero+0xb6 + genunix`segvn_faultpage+0x6d2 + genunix`segvn_fault+0x8e6 + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + unix`page_lookup_create+0xf0 + unix`page_lookup+0x21 + ufs`ufs_getpage+0x762 + genunix`fop_getpage+0x7e + genunix`segvn_fault+0xdfa + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + unix`mutex_enter+0x10 + unix`page_get_mnode_freelist+0x32c + unix`page_get_freelist+0x16d + unix`page_create_va+0x2ad + genunix`swap_getapage+0x113 + genunix`swap_getpage+0x90 + genunix`fop_getpage+0x7e + genunix`anon_zero+0xb6 + genunix`segvn_faultpage+0x6d2 + genunix`segvn_fault+0x8e6 + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + unix`mutex_enter+0x10 + unix`page_get_mnode_freelist+0x32c + unix`page_get_freelist+0x16d + unix`page_create_va+0x2ad + genunix`pvn_read_kluster+0x10c + ufs`ufs_getpage_ra+0x11c + ufs`ufs_getpage+0x866 + genunix`fop_getpage+0x7e + genunix`segvn_faulta+0x12b + genunix`as_faulta+0x143 + genunix`memcntl+0x53d + unix`sys_syscall+0x17a + 1 + + ufs`ufs_iaccess+0x91 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_rele+0x1 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`fop_lookup+0xf1 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_destroy+0x1 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_destroy+0x1 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`rwst_enter_common+0x162 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`pvn_plist_init+0x42 + genunix`swap_getapage+0x323 + genunix`swap_getpage+0x90 + genunix`fop_getpage+0x7e + genunix`anon_zero+0xb6 + genunix`segvn_faultpage+0x6d2 + genunix`segvn_fault+0x8e6 + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + genunix`kmem_cache_alloc+0x22 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x22 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`copen+0x63 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`do_splx+0x65 + unix`swtch+0x17c + unix`preempt+0xec + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + unix`do_splx+0x65 + genunix`disp_lock_exit_nopreempt+0x42 + unix`preempt+0xe7 + unix`kpreempt+0x98 + genunix`disp_lock_exit+0x6f + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 1 + + unix`mutex_enter+0x16 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`cpu_decay+0x27 + genunix`cpu_grow+0x24 + genunix`cpu_update_pct+0x86 + genunix`new_mstate+0x73 + unix`trap+0x63e + unix`sys_rtt_common+0x55 + unix`_sys_rtt_ints_disabled+0x8 + 1 + + unix`tsc_gethrtimeunscaled+0x8 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 1 + + unix`do_splx+0x68 + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 1 + + genunix`traverse+0x5a + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x2a + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_init+0x1b + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_rele+0xc + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_destroy+0xc + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_destroy+0xc + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`lo_lookup+0xf + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`freelonode+0x1b0 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_rele+0x10 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`openat+0x1 + unix`sys_syscall+0x17a + 1 + + genunix`as_fault+0x381 + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + genunix`vn_vfsunlock+0x1 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`audit_getstate+0x21 + genunix`copen+0x59 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`hwblkclr+0x52 + unix`pfnzero+0x78 + unix`pagezero+0x2d + genunix`anon_zero+0xd2 + genunix`segvn_faultpage+0x6d2 + genunix`segvn_fault+0x8e6 + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + genunix`fop_lookup+0x103 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x33 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`savectx+0x24 + unix`resume+0x5b + unix`swtch+0x141 + unix`preempt+0xec + genunix`post_syscall+0x4cd + unix`0xfffffffffb800c91 + 1 + + genunix`kmem_cache_alloc+0x37 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`kmem_cache_alloc+0x37 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`thread_lock+0x8 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 1 + + genunix`lookuppnvp+0xe9 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_exit+0x9 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_exit+0x9 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`mutex_exit+0x9 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + unix`hwblkclr+0x5b + unix`pfnzero+0x78 + unix`pagezero+0x2d + genunix`anon_zero+0xd2 + genunix`segvn_faultpage+0x6d2 + genunix`segvn_fault+0x8e6 + genunix`as_fault+0x36a + unix`pagefault+0x96 + unix`trap+0x2c7 + unix`0xfffffffffb8001d6 + 1 + + genunix`vn_vfsunlock+0xc + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`audit_getstate+0x2d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + lofs`lo_lookup+0x1e + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`syscall_mstate+0x1ae + unix`sys_syscall+0x1a1 + 1 + + genunix`kmem_cache_alloc+0x3e + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_rele+0x1f + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1 + + genunix`vn_vfsunlock+0x10 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfsunlock+0x10 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`audit_getstate+0x30 + unix`0xfffffffffb800c91 + 2 + + genunix`kmem_cache_free+0x70 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`pn_get_buf+0x1 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_exit+0x12 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fd_find+0x73 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`audit_getstate+0x33 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`audit_getstate+0x33 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_rele+0x24 + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_setpath+0x144 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0xb4 + unix`sys_syscall+0x10e + 2 + + genunix`lookuppnvp+0xf5 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + zfs`zfs_fastaccesschk_execute+0x35 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_setpath+0x46 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`tsc_read+0x7 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 2 + + genunix`cv_broadcast+0x8 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`cv_broadcast+0x8 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_exit+0x19 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_init+0x39 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`bcopy+0xa + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`post_syscall+0x1ab + unix`0xfffffffffb800c91 + 2 + + genunix`kmem_free+0xb + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x8d + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookupnameatcred+0x7e + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`sys_syscall+0x104 + 2 + + genunix`kmem_free+0xf + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_free + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`disp_lock_exit+0x1 + unix`0xfffffffffb800c91 + 2 + + genunix`vn_rele+0x31 + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_rele+0x31 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`lo_lookup+0x132 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookupnameatcred+0x82 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`traverse+0x82 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0x82 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`falloc+0x13 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`tsc_gethrtimeunscaled+0x34 + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 2 + + unix`tsc_gethrtimeunscaled+0x34 + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 2 + + genunix`falloc+0x15 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`dnlc_lookup+0xf6 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x56 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`cv_broadcast+0x17 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`lo_root+0x8 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`disp_lock_exit+0x8 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 2 + + genunix`setf+0x8 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnvp+0x209 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`pn_get_buf+0x1b + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_openat+0x4b + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`cv_broadcast+0x1b + genunix`setf+0x8c + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_free+0x1b + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`disp_lock_exit+0xc + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 2 + + lofs`freelonode+0x1de + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_rele+0x3e + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x19f + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`setf+0x10 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fop_lookup+0x131 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x1a2 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`table_lock_enter+0x13 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_free+0x26 + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_free+0x26 + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_free+0x26 + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fop_lookup+0x139 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnvp+0x1a + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`table_lock_enter+0x1b + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`lo_root+0x1b + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fsop_root+0x3b + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`setf+0x1b + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnatcred+0xf + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + zfs`zfs_fastaccesschk_execute+0x5f + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_getlock+0x1 + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`open+0x12 + unix`sys_syscall+0x17a + 2 + + genunix`dnlc_lookup+0x113 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`setf+0x123 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x1b4 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`ufalloc+0x6 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x77 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x77 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x77 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`bzero+0x188 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`ufalloc+0xe + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`freelonode + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`bcopy+0x240 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_free+0x32 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_rele+0x63 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_getlock+0x13 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_free+0x43 + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 2 + + genunix`fsop_root+0x56 + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`rw_enter+0x26 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x1c7 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_getlock+0x17 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + zfs`zfs_lookup+0xe8 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnatcred+0x29 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnatcred+0x129 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x89 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_getlock+0x1b + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + zfs`zfs_lookup+0xec + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0xbd + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`audit_falloc+0xe + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0xc0 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`lwp_getdatamodel + unix`0xfffffffffb800c91 + 2 + + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`rwst_enter_common+0x2d3 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x203 + unix`0xfffffffffb800ca0 + 2 + + unix`mutex_destroy+0x74 + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fd_reserve+0x17 + genunix`ufalloc_file+0x103 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_free+0x57 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_free+0x57 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`bcopy+0x258 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x108 + unix`0xfffffffffb800c86 + 2 + + genunix`rwst_exit+0x8 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`freelonode+0x1b + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`rwst_enter_common+0x2db + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_destroy+0x7b + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_getlock+0x2d + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_exists+0x1f + lofs`makelonode+0x1e7 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`hment_compare+0x10 + genunix`avl_find+0x72 + unix`hment_remove+0xac + unix`hat_pte_unmap+0x159 + unix`hat_unload_callback+0xe8 + genunix`segvn_unmap+0x5b7 + genunix`as_free+0xdc + genunix`relvm+0x220 + genunix`proc_exit+0x444 + genunix`exit+0x15 + genunix`rexit+0x18 + unix`sys_syscall+0x17a + 2 + + lofs`lo_lookup+0x80 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`set_errno+0x1 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`cv_init+0x11 + genunix`rwst_init+0x47 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + ufs`ufs_iaccess+0x12 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`rwst_enter_common+0x1e2 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_destroy+0x84 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`cv_init+0x15 + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`set_errno+0x6 + genunix`copen+0x4fa + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnatcred+0x46 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`lo_root+0x58 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x1e8 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`crgetuid+0x8 + zfs`zfs_fastaccesschk_execute+0x2e + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_getlock+0x39 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_getlock+0x39 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_getlock+0x39 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 2 + + lofs`freelonode+0x2b + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x1b + unix`0xfffffffffb800c86 + 2 + + genunix`kmem_cache_free+0xdb + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`post_syscall+0xb + unix`0xfffffffffb800c91 + 2 + + genunix`vn_vfslocks_getlock+0x3c + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`lsave+0x4e + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x1ef + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_getlock+0x41 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0xf2 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`bcopy+0x272 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x22 + unix`sys_syscall+0x1a1 + 2 + + genunix`fd_reserve+0x33 + genunix`ufalloc_file+0x103 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`post_syscall+0x13 + unix`0xfffffffffb800c91 + 2 + + genunix`dnlc_lookup+0x154 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fop_lookup+0x85 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`dnlc_lookup+0x56 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`cv_broadcast+0x76 + genunix`setf+0x8c + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x26 + unix`sys_syscall+0x10e + 2 + + lofs`lsave+0x57 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`freelonode+0x37 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`post_syscall+0x17 + unix`0xfffffffffb800c91 + 2 + + genunix`vn_vfslocks_rele+0x8 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0xe8 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x4fa + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`cv_broadcast+0x7a + genunix`setf+0x8c + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0xed + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0xed + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`0xfffffffffb800c81 + 2 + + genunix`cv_destroy+0x1 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0xf1 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0xf1 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnatcred+0x62 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x33 + unix`0xfffffffffb800ca0 + 2 + + genunix`copen+0x204 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fop_lookup+0x97 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`cv_destroy+0x8 + genunix`rwst_destroy+0x2e + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnatcred+0x168 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`do_splx+0x8 + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 2 + + genunix`vn_vfslocks_getlock+0x59 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`set_errno+0x2e + genunix`copen+0x4fa + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`dnlc_lookup+0x6e + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`setf+0x7f + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_zalloc+0x10 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fd_find+0x1 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`dnlc_lookup+0x75 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`dnlc_lookup+0x175 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x45 + unix`0xfffffffffb800c86 + 2 + + zfs`zfs_lookup+0x37 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`memcmp+0x8 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0x8 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x19 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`dnlc_lookup+0x79 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`bcopy+0x399 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_rele+0x29 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`memcmp+0xb + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`do_splx+0x1b + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 2 + + genunix`dnlc_lookup+0x17f + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + zfs`zfs_lookup+0x3f + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`secpolicy_vnode_access2+0xf + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`lo_inactive+0x14 + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`rwst_exit+0x54 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0xe4 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x55 + unix`0xfffffffffb800c86 + 2 + + unix`strlen+0x16 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fd_find+0x17 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`crfree+0x18 + genunix`unfalloc+0x4a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_recycle+0x2b + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + zfs`zfs_lookup+0x4b + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fop_lookup+0xbb + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0x1b + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`setf+0x9c + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`copystr+0x1d + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`rwst_exit+0x5d + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + ufs`ufs_lookup+0xed + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`post_syscall+0x14d + unix`0xfffffffffb800c91 + 2 + + genunix`dnlc_lookup+0x8f + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`post_syscall+0x4f + unix`0xfffffffffb800c91 + 2 + + genunix`unfalloc+0x10 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`secpolicy_vnode_access2+0x22 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`traverse+0x23 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x163 + unix`sys_syscall+0x1a1 + 2 + + genunix`syscall_mstate+0x167 + unix`0xfffffffffb800c86 + 2 + + genunix`traverse+0x28 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`ufalloc_file+0xf8 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`unfalloc+0x18 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`setf+0xa9 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnvp+0xaa + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`secpolicy_vnode_access2+0x22a + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`lo_lookup+0x1db + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`copystr+0x2b + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0x2b + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0xfc + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookupnameatcred+0x2d + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x100 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x1 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`post_syscall+0x64 + unix`0xfffffffffb800c91 + 2 + + genunix`memcmp+0x35 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fop_inactive+0x35 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x46 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + ufs`ufs_lookup+0x106 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`copystr+0x37 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_openat+0xf7 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`dnlc_lookup+0x1a8 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`memcmp+0x38 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`freelonode+0x189 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_free+0x3a + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_vfslocks_rele+0x5c + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`falloc+0xcc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`syscall_mstate+0x17c + unix`sys_syscall+0x1a1 + 2 + + genunix`fd_find+0x40 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fop_lookup+0xe0 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_enter + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_enter + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_enter + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_enter + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_enter + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_enter + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnvp+0xc1 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`post_syscall+0x173 + unix`0xfffffffffb800c91 + 2 + + genunix`fop_lookup+0xe4 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_openat+0x106 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnvp+0x3c7 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x17 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`freelonode+0x98 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + ufs`ufs_lookup+0x118 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_enter+0x9 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_enter+0x9 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_enter+0x9 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookupnameatcred+0x4b + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x1b + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`dnlc_lookup+0xbe + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + ufs`ufs_lookup+0x11e + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fd_find+0x4f + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookuppnvp+0x3cf + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x22 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fd_find+0x53 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`rwst_enter_common+0x165 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_openat+0x16 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`lookupnameatcred+0x56 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_alloc+0x27 + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_rele+0x8 + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`audit_getstate+0x18 + genunix`lookuppnvp+0x82 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x2a + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x16c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_rele+0xc + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_openat+0x1c + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fop_lookup+0xfc + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`falloc+0xed + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + zfs`zfs_fastaccesschk_execute+0x11f + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`fop_inactive+0x60 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cpu_reload+0x10 + genunix`kmem_cache_free+0xce + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_exit + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_exit + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_exit + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_exit + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + lofs`lo_lookup+0x13 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_openat+0x24 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_rele+0x17 + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_rele+0x17 + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x37 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`mutex_destroy+0x17 + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`audit_getstate+0x28 + genunix`setf+0x3f + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cpu_reload+0x18 + genunix`kmem_cache_alloc+0x118 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`ufalloc_file+0x3a + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + unix`tsc_gethrtimeunscaled+0x1b + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 2 + + unix`mutex_exit+0xc + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`copen+0x17d + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`vn_openat+0x2e + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`kmem_cache_alloc+0x3e + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + zfs`zfs_lookup+0x9f + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 2 + + genunix`cv_broadcast + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`audit_getstate+0x30 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`audit_getstate+0x30 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0x70 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_free + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnatcred+0xe1 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookupnameatcred+0x72 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_exit+0x12 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_exit+0x12 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_rele+0x24 + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_rele+0x24 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`freelonode+0x1c5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`lo_lookup+0x25 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`openat+0x16 + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_openat+0x36 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`freelonode+0xc7 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`ufalloc_file+0x48 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_lookup+0x118 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_exit+0x19 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`lo_lookup+0x12a + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x18b + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`copyinstr+0xc + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`cv_broadcast+0xc + genunix`setf+0x8c + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnvp+0xfd + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_alloc+0x4e + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`freelonode+0x1cf + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x90 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`pn_get_buf+0x10 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_lookup+0x120 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`setf+0x103 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`tsc_gethrtimeunscaled+0x34 + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 3 + + genunix`fd_find+0x85 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vsd_free+0x26 + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`pn_get_buf+0x17 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_free+0x17 + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_free+0x8 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookupnameatcred+0x88 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x1c8 + unix`0xfffffffffb800c86 + 3 + + unix`sys_syscall+0x10e + 3 + + genunix`falloc+0x19 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_free+0x1b + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_lookup+0x12d + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`post_syscall+0x2bf + unix`0xfffffffffb800c91 + 3 + + lofs`lo_root+0x10 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`dnlc_lookup+0x1 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fd_find+0x91 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnvp+0x111 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`falloc+0x24 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_openat+0x55 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`thread_lock+0x36 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 3 + + genunix`vn_free+0x17 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fd_find+0x98 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`falloc+0x28 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_lookup+0x139 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`pn_get_buf+0x2a + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_alloc+0x6a + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_free+0x2a + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_free+0x2a + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnatcred+0xb + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`clear_stale_fd+0xd + genunix`post_syscall+0x1fe + unix`0xfffffffffb800c91 + 3 + + genunix`fop_lookup+0x13d + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`falloc+0x2f + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnatcred+0x110 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`ufalloc+0x1 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`table_lock_enter+0x22 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnatcred+0x13 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnvp+0x124 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`pn_get_buf+0x35 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`rw_enter+0x1c + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x2be + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_rele+0xce + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + zfs`zfs_fastaccesschk_execute+0x6e + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fd_reserve + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0xb0 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`thread_lock+0x53 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 3 + + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_getlock+0x13 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`setf+0x33 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_free+0x43 + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_alloc+0x84 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`dnlc_lookup+0x26 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x1f7 + unix`0xfffffffffb800ca0 + 3 + + lofs`freelonode+0x8 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0xf8 + unix`sys_syscall+0x10e + 3 + + genunix`kmem_cache_alloc+0x89 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x2ca + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_exists+0xc + lofs`makelonode+0x1e7 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnvp+0x43c + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0xbd + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x2ce + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_openat+0x47f + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_getlock+0x1f + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_getlock+0x1f + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x1d0 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`rwst_exit + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`disp_lock_exit+0x42 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 3 + + genunix`kmem_cache_alloc+0x92 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x1d3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x203 + unix`sys_syscall+0x1a1 + 3 + + genunix`lookuppnatcred+0x34 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnvp+0x444 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`audit_falloc+0x15 + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`freelonode+0x17 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x8 + unix`0xfffffffffb800c86 + 3 + + genunix`syscall_mstate+0x108 + unix`sys_syscall+0x10e + 3 + + genunix`rwst_exit+0x8 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`sys_syscall+0x14e + 3 + + genunix`fop_inactive+0xcb + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_inactive+0xcb + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_getlock+0x2d + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_openat+0x8e + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`freelonode+0x1f + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`splr+0x1f + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 3 + + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`table_lock_enter+0x50 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x4e0 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x10 + unix`0xfffffffffb800c86 + 3 + + genunix`crgetuid + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`sys_syscall+0x156 + 3 + + genunix`rwst_enter_common+0x1e2 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnatcred+0x147 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x17 + unix`0xfffffffffb800c86 + 3 + + genunix`dnlc_lookup+0x149 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x119 + unix`0xfffffffffb800ca0 + 3 + + genunix`syscall_mstate+0x1b + unix`0xfffffffffb800ca0 + 3 + + genunix`post_syscall+0x30c + unix`0xfffffffffb800c91 + 3 + + unix`sys_syscall+0x162 + 3 + + genunix`falloc+0x6f + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`crgetuid+0x10 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`lock_try + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 3 + + genunix`lookuppnatcred+0x151 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`cv_broadcast+0x72 + genunix`setf+0x8c + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + zfs`zfs_lookup+0x12 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x123 + unix`sys_syscall+0x10e + 3 + + zfs`zfs_lookup+0x16 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`pn_fixslash+0x28 + genunix`lookuppnvp+0x105 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0xe8 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnvp+0x36b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`table_lock_enter+0x6d + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`set_errno+0x1e + genunix`copen+0x4fa + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`cv_broadcast+0x7f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`cv_broadcast+0x7f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`cv_broadcast+0x7f + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`atomic_add_32_nv + genunix`unfalloc+0x4a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`pn_fixslash+0x32 + genunix`lookuppnvp+0x105 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x33 + unix`sys_syscall+0x1a1 + 3 + + genunix`syscall_mstate+0x135 + unix`0xfffffffffb800c86 + 3 + + genunix`syscall_mstate+0x135 + unix`0xfffffffffb800ca0 + 3 + + genunix`rwst_exit+0x35 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_zalloc+0x5 + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`0xfffffffffb800c86 + 3 + + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x207 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_rele+0x17 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_lookup+0x97 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_openat+0x2b8 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_free+0x78 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`dnlc_lookup+0x16c + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_lookup+0x9c + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`do_splx+0xc + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 3 + + genunix`post_syscall+0x32d + unix`0xfffffffffb800c91 + 3 + + genunix`syscall_mstate+0x13d + unix`sys_syscall+0x10e + 3 + + genunix`memcmp + genunix`dnlc_lookup+0x10d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + zfs`zfs_lookup+0x30 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`bcopy+0x391 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x41 + unix`0xfffffffffb800c86 + 3 + + genunix`lookuppnatcred+0x72 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`set_errno+0x35 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x45 + unix`sys_syscall+0x1a1 + 3 + + genunix`vn_vfslocks_getlock+0x66 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnatcred+0x77 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`do_splx+0x17 + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 3 + + genunix`audit_unfalloc+0x17 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_openat+0xc8 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_inactive+0x8 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_rele+0x29 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`crfree+0x9 + genunix`unfalloc+0x4a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`rwst_init+0x5a + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_inactive+0xc + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x1d + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fd_find+0xf + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`0xfffffffffb800ca0 + 3 + + genunix`rwst_destroy + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0x10 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x157 + unix`0xfffffffffb800c86 + 3 + + genunix`kmem_cache_free+0x17 + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0x17 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`secpolicy_vnode_access2+0x17 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_rele+0x38 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`traverse+0x18 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`unfalloc+0x8 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnvp+0x39a + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`dnlc_lookup+0x8b + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0x1b + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_getlock+0x7d + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`secpolicy_vnode_access2+0x21e + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x15f + unix`0xfffffffffb800c86 + 3 + + unix`bzero + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`dnlc_lookup+0x92 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_inactive+0x22 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`copystr+0x24 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fd_find+0x24 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`rwst_enter_common+0x35 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_lookup+0xc7 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x167 + unix`0xfffffffffb800ca0 + 3 + + genunix`rwst_destroy+0x17 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`dnlc_lookup+0x99 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x69 + unix`0xfffffffffb800c86 + 3 + + genunix`syscall_mstate+0x69 + unix`sys_syscall+0x1a1 + 3 + + genunix`kmem_cache_free+0x2b + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`post_syscall+0x35c + 3 + + genunix`copen+0x3d + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`dnlc_lookup+0x9d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0x2f + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + ufs`ufs_lookup+0x1 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_lookup+0xd2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`ufalloc_file+0x103 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnvp+0x3b5 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`crgetmapped+0x15 + genunix`fop_inactive+0x60 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`bzero+0x16 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0x37 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vsd_free+0xd8 + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_alloc+0x8 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`post_syscall+0x6b + unix`0xfffffffffb800c91 + 3 + + genunix`vn_vfsrlock+0x3c + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fd_find+0x3c + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnatcred+0xad + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`setf+0xbd + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`bcopy+0x3d0 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_enter + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_enter + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_enter + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x84 + unix`0xfffffffffb800ca0 + 3 + + genunix`post_syscall+0x75 + unix`0xfffffffffb800c91 + 3 + + genunix`ufalloc_file+0x17 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_lookup+0x1e7 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`bcopy+0x3d8 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fd_find+0x48 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_openat+0x9 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_rele+0x6b + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`ufalloc_file+0x1b + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_setpath+0x11c + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + lofs`makelonode+0x8d + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnatcred+0xbe + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + zfs`zfs_lookup+0x7f + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`bcopy+0x3e0 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookuppnvp+0x3d0 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_destroy + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`lookupnameatcred+0x52 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x193 + unix`sys_syscall+0x1a1 + 3 + + genunix`vn_openat+0x115 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`falloc+0xe5 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`copen+0x166 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`ufalloc_file+0x126 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_alloc+0x26 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_rele+0x8 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`tsc_gethrtimeunscaled+0x8 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 3 + + genunix`audit_getstate+0x18 + genunix`post_syscall+0xbe + unix`0xfffffffffb800c91 + 3 + + genunix`audit_getstate+0x18 + genunix`setf+0x3f + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_openat+0x11b + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`traverse+0x5b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfslocks_getlock+0xbc + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`tsc_gethrtimeunscaled+0xc + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 3 + + genunix`syscall_mstate+0x19d + unix`sys_syscall+0x1a1 + 3 + + unix`mutex_exit + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_exit + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`syscall_mstate+0x1a1 + unix`0xfffffffffb800ca0 + 3 + + genunix`syscall_mstate+0xa2 + unix`sys_syscall+0x1a1 + 3 + + genunix`vn_rele+0x17 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_rele+0x17 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_alloc+0x37 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`openat+0x8 + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_vfsunlock+0x8 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_free+0x68 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_exit+0x9 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_exit+0x9 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`kmem_cache_alloc+0x3a + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`tsc_gethrtimeunscaled+0x1b + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 3 + + genunix`vn_vfsunlock+0xc + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`falloc+0xfc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + unix`mutex_exit+0xc + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`fop_inactive+0x6d + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`vn_rele+0x1f + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 3 + + genunix`post_syscall+0x19f + unix`0xfffffffffb800c91 + 3 + + genunix`pn_get_buf + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`cv_broadcast + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0x70 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`freelonode+0x1c1 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_lookup+0x12 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit+0x12 + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit+0x12 + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit+0x12 + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit+0x12 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit+0x12 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit+0x12 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_free+0x5 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`pn_get_buf+0x6 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`bcopy+0x308 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`copyinstr+0x8 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit+0x19 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_lookup+0x1a + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`tsc_read+0xa + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 4 + + genunix`fsop_root+0x1b + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`crfree+0x7b + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_rele+0x9e + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`ufalloc_file+0x50 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x1c0 + unix`0xfffffffffb800c86 + 4 + + zfs`zfs_fastaccesschk_execute+0x140 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_rele+0x31 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_rele+0x31 + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`sys_syscall+0x109 + 4 + + genunix`lookuppnvp+0x105 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_rele+0xa6 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_rele+0xa6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive+0x86 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive+0x86 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`lookupnameatcred+0x87 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_free+0x17 + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x1c8 + unix`sys_syscall+0x10e + 4 + + genunix`vn_rele+0x39 + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_rele+0x39 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0xc9 + unix`0xfffffffffb800c86 + 4 + + genunix`post_syscall+0xb9 + unix`0xfffffffffb800c91 + 4 + + genunix`fsop_root+0x2a + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_free+0x1b + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_free+0x1b + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + zfs`zfs_lookup+0xbd + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`post_syscall+0xbe + unix`0xfffffffffb800c91 + 4 + + genunix`clear_stale_fd+0x1 + unix`0xfffffffffb800c91 + 4 + + genunix`dnlc_lookup+0x104 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`open+0x6 + unix`sys_syscall+0x17a + 4 + + genunix`pn_get_buf+0x26 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`setf+0x116 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_alloc+0x66 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`lo_root+0x17 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`lookuppnatcred+0x109 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + zfs`specvp_check+0x3a + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_free+0x2a + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive+0x9f + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`post_syscall+0x2d0 + unix`0xfffffffffb800c91 + 4 + + genunix`pn_get_buf+0x31 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`setf+0x22 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive+0xa3 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + zfs`zfs_lookup+0xd4 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_rele+0xc6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`setf+0x26 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`dnlc_lookup+0x118 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_alloc+0x79 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_alloc+0x79 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`copen+0x1bd + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_rele+0xce + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`lookuppnatcred+0x1e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_free+0x2f + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x1ef + unix`0xfffffffffb800ca0 + 4 + + genunix`fd_reserve + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xb0 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_free+0x43 + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`lo_lookup+0x64 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`lo_lookup+0x67 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_getlock+0x17 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_alloc+0x89 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fd_reserve+0xb + genunix`setf+0x123 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive+0xbb + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xbd + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`dnlc_lookup+0x2e + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`copen+0x2cf + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`post_syscall+0x1f0 + unix`0xfffffffffb800c91 + 4 + + ufs`ufs_lookup+0x93 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`lwp_getdatamodel+0x8 + genunix`post_syscall+0x2f5 + unix`0xfffffffffb800c91 + 4 + + genunix`vn_vfslocks_getlock+0x29 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`splr+0x1b + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 4 + + genunix`pn_fixslash+0xc + genunix`lookuppnvp+0x105 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`clear_stale_fd+0x3c + genunix`post_syscall+0x1fe + unix`0xfffffffffb800c91 + 4 + + genunix`vn_rele+0x7d + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_openat+0x48e + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`set_errno + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + ufs`ufs_iaccess+0x110 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_setpath+0xa0 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`gethrtime_unscaled + unix`0xfffffffffb800c86 + 4 + + genunix`cv_init+0x11 + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`lookuppnvp+0x51 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`rwst_enter_common+0x1e4 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`cv_init+0x15 + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`freelonode+0x27 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_openat+0x497 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_lookup+0x77 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x17 + unix`sys_syscall+0x1a1 + 4 + + genunix`copen+0xe8 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`rwst_exit+0x18 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_openat+0x9a + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xdb + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xdb + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`post_syscall+0x20c + unix`0xfffffffffb800c91 + 4 + + genunix`cv_init+0x1d + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`bcmp + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x22 + unix`0xfffffffffb800ca0 + 4 + + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`prunstop+0x14 + genunix`post_syscall+0x2d0 + unix`0xfffffffffb800c91 + 4 + + genunix`vn_vfslocks_rele+0x105 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_openat+0xa7 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fd_reserve+0x37 + genunix`ufalloc_file+0x103 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`lo_root+0x68 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_rele+0x8 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xe8 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + zfs`zfs_lookup+0x1a + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x2a + unix`sys_syscall+0x10e + 4 + + lofs`lo_root+0x70 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_zalloc + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`membar_consumer + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`membar_consumer + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xf1 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xf1 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xf1 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_lookup+0x93 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x135 + unix`sys_syscall+0x1a1 + 4 + + genunix`lookuppnvp+0x76 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`set_errno+0x27 + genunix`copen+0x4fa + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_rele+0x17 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fd_reserve+0x48 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x139 + unix`0xfffffffffb800c86 + 4 + + genunix`kmem_cache_free+0xfa + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xfa + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0xfa + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`sys_syscall+0x180 + 4 + + genunix`copen+0xb + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_openat+0xbc + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`table_lock_enter+0x7d + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x13d + unix`0xfffffffffb800ca0 + 4 + + genunix`lookuppnvp+0x37f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`lookupnameatcred + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`audit_unfalloc+0x10 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`lo_inactive+0x1 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`copen+0x13 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`rwst_exit+0x44 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`ufalloc_file+0xd7 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fd_find+0x8 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0x8 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_zalloc+0x1a + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`rwst_exit+0x4c + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`do_splx+0x1f + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 4 + + genunix`kmem_cache_free+0x10 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`strlen+0x10 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`strlen+0x13 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`copen+0x24 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfsrlock+0x14 + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`setf+0x94 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`rwst_exit+0x54 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_alloc+0xe4 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_lookup+0xb6 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`post_syscall+0x347 + unix`0xfffffffffb800c91 + 4 + + genunix`syscall_mstate+0x157 + unix`sys_syscall+0x10e + 4 + + genunix`kmem_cache_free+0x17 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`copen+0x28 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_rele+0x38 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x58 + unix`sys_syscall+0x1a1 + 4 + + genunix`rwst_destroy+0x8 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_openat+0x2d9 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_zalloc+0x29 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive+0x1b + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`sys_syscall+0x1a1 + 4 + + genunix`dnlc_lookup+0x18e + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`audit_unfalloc+0x2e + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`copen+0x2f + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`setf+0xa0 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`crgetmapped + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0x22 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0x22 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`post_syscall+0x353 + unix`0xfffffffffb800c91 + 4 + + genunix`falloc+0xb3 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`setf+0xa4 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_getlock+0x86 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_vfslocks_getlock+0x86 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x67 + unix`sys_syscall+0x1a1 + 4 + + genunix`syscall_mstate+0x167 + unix`sys_syscall+0x10e + 4 + + genunix`setf+0xa8 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_invalid+0x39 + lofs`freelonode+0x115 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x69 + unix`0xfffffffffb800ca0 + 4 + + unix`splr+0x79 + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 4 + + genunix`lookuppnatcred+0x9b + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_alloc+0xfc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive+0x2d + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`splr+0x7e + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 4 + + genunix`syscall_mstate+0x170 + unix`0xfffffffffb800ca0 + 4 + + genunix`rwst_destroy+0x20 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x71 + unix`0xfffffffffb800ca0 + 4 + + unix`clear_int_flag+0x1 + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 4 + + genunix`lookuppnvp+0xb4 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_lookup+0xd4 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`rwst_destroy+0x25 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive+0x35 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`memcmp+0x37 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`freelonode+0x88 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`ufalloc_file+0x8 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vsd_free+0xd8 + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`copystr+0x3c + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0x3f + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`ufalloc_file+0x10 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`unfalloc+0x30 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`audit_getstate + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_alloc+0x10 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_enter + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_enter + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_enter + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + zfs`zfs_fastaccesschk_execute + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`rwst_destroy+0x32 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`traverse+0x43 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`syscall_mstate+0x84 + unix`0xfffffffffb800c86 + 4 + + genunix`rwst_exit+0x86 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`ufalloc_file+0x117 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`copen+0x59 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_enter+0x9 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`bcopy+0x2db + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fd_find+0x4c + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`freelonode+0x9d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_inactive+0x4e + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + ufs`ufs_lookup+0x1e + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + zfs`zfs_fastaccesschk_execute+0x10f + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`freelonode+0xa0 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`copen+0x160 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cpu_reload + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`i_ddi_splhigh + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 4 + + lofs`makelonode+0x91 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`lo_lookup+0x1 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`lsave+0xc4 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`lookuppnatcred+0xc5 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`bcopy+0x3e8 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_rele+0x8 + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_rele+0x8 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vn_openat+0x18 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vfs_matchops+0x8 + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`copen+0x169 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`copystr+0x5a + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`ufalloc_file+0x2a + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`falloc+0xee + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`post_syscall+0x18f + unix`0xfffffffffb800c91 + 4 + + unix`mutex_exit + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`mutex_exit + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`lookupnameatcred+0x61 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`unfalloc+0x52 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`lookuppnvp+0x1e4 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fop_lookup+0x107 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + zfs`specvp_check+0x8 + zfs`zfs_lookup+0xf4 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`audit_getstate+0x28 + genunix`post_syscall+0xbe + unix`0xfffffffffb800c91 + 4 + + genunix`vsd_free+0x8 + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`vsd_free+0x8 + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0x68 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`kmem_cache_free+0x68 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + lofs`lo_lookup+0x11b + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + unix`tsc_gethrtimeunscaled+0x1b + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 4 + + genunix`fd_find+0x6f + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 4 + + genunix`fsop_root+0x10 + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`audit_getstate+0x30 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`lo_lookup+0x122 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x1b2 + unix`0xfffffffffb800ca0 + 5 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_exit+0x12 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_exit+0x12 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`audit_getstate+0x33 + unix`0xfffffffffb800c91 + 5 + + genunix`vn_rele+0x24 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0xb4 + unix`sys_syscall+0x1a1 + 5 + + genunix`fsop_root+0x17 + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`traverse+0x77 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`tsc_read+0x7 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 5 + + unix`tsc_gethrtimeunscaled+0x28 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 5 + + unix`mutex_exit+0x19 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x1bb + unix`sys_syscall+0x1a1 + 5 + + genunix`kmem_free+0xb + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_free+0xf + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_free+0xf + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0xf0 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_rele+0x31 + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`copyinstr+0x11 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`setf+0x1 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_init+0x41 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fsop_root+0x22 + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fd_find+0x82 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_openat+0x47 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`bcopy+0x318 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookuppnvp+0xb + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_free+0x1b + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`lo_root+0xc + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameatcred+0x8c + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fd_find+0x8d + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_rele+0x3e + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_rele+0x3e + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameatcred+0x93 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x1d4 + unix`0xfffffffffb800c86 + 5 + + genunix`kmem_free+0x26 + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`table_lock_enter+0x17 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_openat+0x59 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_free+0x2a + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0x10d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`pn_get_buf+0x2d + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_openat+0x60 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`falloc+0x33 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_openat+0x64 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0x15 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`lo_root+0x28 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`open+0x18 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_getlock+0x8 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_alloc+0x79 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_openat+0x6a + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`falloc+0x3a + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`thread_lock+0x4b + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 5 + + genunix`dnlc_lookup+0x11c + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0xb0 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0xb0 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_mountedvfs+0x1 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0x22 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_getlock+0x13 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_alloc+0x84 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_getlock+0x17 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookuppnvp+0x39 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0x2a + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`setf+0x3a + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_getlock+0x1b + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_destroy+0x6b + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_alloc+0x8d + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_getlock+0x1f + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`rwst_enter_common+0x2cf + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`freelonode+0x10 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`pn_fixslash+0x1 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`cv_init+0x8 + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x8 + unix`sys_syscall+0x10e + 5 + + genunix`syscall_mstate+0x108 + unix`sys_syscall+0x1a1 + 5 + + genunix`vn_vfslocks_getlock+0x29 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + ufs`ufs_iaccess+0xa + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0xc + unix`0xfffffffffb800c86 + 5 + + genunix`cv_init+0xd + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_getlock+0x2d + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_lookup+0x6d + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_zalloc+0xdf + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`gethrtime_unscaled + unix`sys_syscall+0x1a1 + 5 + + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`freelonode+0x23 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_destroy+0x84 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`sys_syscall+0x15a + 5 + + genunix`fd_reserve+0x26 + genunix`setf+0x123 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`table_lock_enter+0x57 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x17 + unix`0xfffffffffb800ca0 + 5 + + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 5 + + genunix`kmem_cache_free+0xdb + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0xdb + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0xdb + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`table_lock_enter+0x5c + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`pn_getcomponent+0xad + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookuppnvp+0x35e + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_alloc+0xdf + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`crhold + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`cv_broadcast+0x72 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x22 + unix`sys_syscall+0x10e + 5 + + genunix`syscall_mstate+0x123 + unix`0xfffffffffb800c86 + 5 + + genunix`rwst_exit+0x23 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`audit_falloc+0x33 + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_rele+0x105 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_lookup+0x85 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_free+0x66 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x26 + unix`sys_syscall+0x1a1 + 5 + + genunix`copen+0xf8 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0xe8 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0xe8 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0x159 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`crhold+0x9 + genunix`falloc+0xbc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_lookup+0x8e + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookuppnvp+0x6f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`lo_lookup+0x1a0 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookuppnatcred+0x60 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`audit_unfalloc + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`freelonode+0x42 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`post_syscall+0x23 + unix`0xfffffffffb800c91 + 5 + + unix`sys_syscall+0x17a + 5 + + genunix`crhold+0x16 + genunix`falloc+0xbc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`cv_destroy+0x8 + genunix`rwst_destroy+0x25 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`ufalloc_file+0xc8 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0x69 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_getlock+0x59 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x3a + unix`0xfffffffffb800ca0 + 5 + + genunix`post_syscall+0x2e + unix`0xfffffffffb800c91 + 5 + + lofs`freelonode+0x4f + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fd_find + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`crfree + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`table_lock_enter+0x82 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookuppnvp+0x82 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x45 + unix`0xfffffffffb800ca0 + 5 + + unix`lock_clear_splx+0x5 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 5 + + genunix`post_syscall+0x338 + unix`0xfffffffffb800c91 + 5 + + genunix`lookuppnatcred+0x78 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`traverse+0x8 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0x8 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_rele+0x29 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_rele+0x29 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`rwst_init+0x5b + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_lookup+0xad + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_alloc+0xe4 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`lo_lookup+0x1c5 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameatcred+0x17 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + zfs`zfs_lookup+0x47 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_rele+0x38 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x58 + unix`0xfffffffffb800c86 + 5 + + unix`rw_exit+0x8 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookuppnatcred+0x89 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`rwst_enter_common+0x29 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0x8b + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0x1b + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 5 + + genunix`crfree+0x1d + genunix`unfalloc+0x4a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameat+0x10 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_zalloc+0x31 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_openat+0xe2 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0x22 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0x22 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_rele+0x46 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_rele+0x46 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_rele+0x46 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`post_syscall+0x357 + unix`0xfffffffffb800c91 + 5 + + genunix`rwst_destroy+0x17 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0x198 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameat+0x18 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x168 + 5 + + genunix`crgetmapped+0x8 + genunix`fop_inactive+0x60 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_invalid+0x39 + lofs`freelonode+0x115 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameatcred+0x29 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + zfs`zfs_lookup+0x59 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`post_syscall+0x35b + unix`0xfffffffffb800c91 + 5 + + genunix`kmem_cache_free+0x2b + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0x2b + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`unfalloc+0x1d + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`atomic_add_32 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`atomic_add_32 + genunix`falloc+0xbc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_alloc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`clear_int_flag + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 5 + + genunix`syscall_mstate+0x71 + unix`sys_syscall+0x10e + 5 + + genunix`syscall_mstate+0x71 + unix`sys_syscall+0x1a1 + 5 + + genunix`fop_inactive+0x31 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_lookup+0xd2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`rwst_destroy+0x25 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`bcopy+0x3c8 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + zfs`zfs_lookup+0x6a + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfsrlock+0x3c + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_lookup+0xdd + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`rwst_destroy+0x2e + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0x3f + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0x3f + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`atomic_add_64 + unix`sys_syscall+0x10e + 5 + + unix`atomic_add_64 + unix`0xfffffffffb800ca0 + 5 + + unix`atomic_add_64 + unix`sys_syscall+0x1a1 + 5 + + genunix`vn_openat + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_setpath+0x10 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_enter + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_enter + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_enter + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_enter + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_enter + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_enter + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`makelonode+0x81 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_openat+0x1 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`bcopy+0x2d2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`rwst_destroy+0x33 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`copen+0x54 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameat+0x34 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + ufs`ufs_iaccess+0x86 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameatcred+0x47 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_lookup+0x1e7 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`freelonode+0x98 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vsd_free+0xe8 + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`falloc+0xd9 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_lookup+0xe9 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_enter+0x9 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`lookupnameat+0x3a + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_inactive+0x4a + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`crgetmapped+0x2a + genunix`fop_inactive+0x60 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_vfslocks_rele+0x6b + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_alloc+0x1b + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0x18c + unix`sys_syscall+0x1a1 + 5 + + genunix`audit_getstate+0xd + genunix`copen+0x59 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_rele + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`ufalloc_file+0x22 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + zfs`zfs_fastaccesschk_execute+0x16 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + lofs`freelonode+0xa8 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_rele+0x8 + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`falloc+0xe9 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`unfalloc+0x4a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`copystr+0x5d + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_setpath+0x2d + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`falloc+0xf0 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_exit + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_exit + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_exit + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_exit + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_exit + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_exit + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_exit + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`post_syscall+0x291 + unix`0xfffffffffb800c91 + 5 + + genunix`lookuppnatcred+0xd1 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`syscall_mstate+0xa2 + unix`sys_syscall+0x10e + 5 + + genunix`syscall_mstate+0xa2 + unix`0xfffffffffb800c86 + 5 + + genunix`lookuppnvp+0xe3 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`vn_rele+0x17 + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + zfs`zfs_lookup+0x97 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`mutex_destroy+0x17 + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`setf+0xe8 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`fop_lookup+0x208 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`audit_getstate+0x28 + genunix`lookuppnvp+0x82 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`audit_getstate+0x28 + genunix`copen+0x59 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0x68 + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`kmem_cache_free+0x68 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + unix`tsc_gethrtimeunscaled+0x1b + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 5 + + genunix`thread_lock+0xc + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 5 + + genunix`dnlc_lookup+0xdc + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`audit_getstate+0x2d + unix`0xfffffffffb800c91 + 5 + + genunix`kmem_cache_alloc+0x3e + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + zfs`zfs_fastaccesschk_execute+0x2e + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`dnlc_lookup+0xdf + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 5 + + genunix`cv_broadcast + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0x70 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_free + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_free + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`tsc_read + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 6 + + unix`splx + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 6 + + genunix`post_syscall+0x2a1 + unix`0xfffffffffb800c91 + 6 + + unix`copyinstr+0x1 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookuppnvp+0x1f1 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`ufalloc_file+0x41 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_exit+0x12 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_exit+0x12 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_exit+0x12 + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`syscall_mstate+0xb4 + unix`0xfffffffffb800c86 + 6 + + genunix`syscall_mstate+0xb4 + unix`0xfffffffffb800ca0 + 6 + + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_free+0x5 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`freelonode+0xc7 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vsd_free+0x17 + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`tsc_read+0x7 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 6 + + unix`tsc_read+0x7 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 6 + + genunix`cv_broadcast+0x8 + genunix`setf+0x8c + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`tsc_gethrtimeunscaled+0x28 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 6 + + unix`tsc_gethrtimeunscaled+0x28 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 6 + + genunix`fd_find+0x78 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_exit+0x19 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`openat+0x1a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_free+0xb + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_rele+0x9e + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`thread_lock+0x1f + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 6 + + genunix`syscall_mstate+0x1c0 + unix`sys_syscall+0x10e + 6 + + genunix`post_syscall+0x1b3 + unix`0xfffffffffb800c91 + 6 + + genunix`fsop_root+0x26 + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`copyinstr+0x16 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_rele+0xa6 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_rele+0x39 + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`setf+0xc + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`falloc+0x1d + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`openat+0x2f + unix`sys_syscall+0x17a + 6 + + genunix`pn_get_buf+0x1f + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`bcopy+0x320 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + zfs`specvp_check+0x30 + zfs`zfs_lookup+0xf4 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`clear_stale_fd + unix`0xfffffffffb800c91 + 6 + + genunix`dnlc_lookup+0x1 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookuppnatcred+0x104 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_alloc+0x66 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_alloc+0x66 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`table_lock_enter+0x17 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_free+0x17 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`thread_lock+0x39 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 6 + + genunix`fop_inactive+0x9f + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_getlock + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_getlock+0x1 + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`syscall_mstate+0xe3 + unix`sys_syscall+0x10e + 6 + + lofs`table_lock_enter+0x26 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_rele+0xc6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_getlock+0x8 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`traverse+0xa8 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookuppnatcred+0x1a + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_free+0x3a + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`freelonode+0xfb + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_getlock+0xc + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookuppnatcred+0x11c + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`_sys_rtt + 6 + + genunix`ufalloc_file+0x7e + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0xb0 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0xb0 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_free+0x43 + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_mountedvfs+0x8 + genunix`traverse+0x77 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_zalloc+0xc8 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`freelonode+0x109 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_alloc+0x89 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_alloc+0x8d + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0xbd + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0xbd + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`splr+0x10 + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 6 + + genunix`fsop_root+0x61 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_rele+0x71 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`dnlc_lookup+0x32 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_alloc+0x92 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_zalloc+0xd3 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`post_syscall+0x2f5 + unix`0xfffffffffb800c91 + 6 + + genunix`fd_reserve+0x17 + genunix`setf+0x123 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`rwst_init+0x17 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`splr+0x17 + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 6 + + genunix`kmem_free+0x57 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`copen+0x1d8 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookuppnatcred+0x138 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`falloc+0x5c + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_rele+0x7d + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + ufs`ufs_iaccess+0xe + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`syscall_mstate+0x10 + unix`sys_syscall+0x10e + 6 + + genunix`gethrtime_unscaled + unix`sys_syscall+0x10e + 6 + + genunix`dnlc_lookup+0x43 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_alloc+0xd4 + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`fd_reserve+0x26 + genunix`ufalloc_file+0x103 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`freelonode+0x27 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`sys_syscall+0x15e + 6 + + ufs`ufs_iaccess+0x19 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_zalloc+0xea + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 6 + + genunix`syscall_mstate+0x1b + unix`sys_syscall+0x1a1 + 6 + + lofs`table_lock_enter+0x5c + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_getlock+0x3c + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`prunstop+0xd + genunix`post_syscall+0x2d0 + unix`0xfffffffffb800c91 + 6 + + ufs`ufs_iaccess+0x1d + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_rele + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_openat+0xa1 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`lo_root+0x62 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`cv_broadcast+0x72 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`fd_reserve+0x33 + genunix`setf+0x123 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`rwst_exit+0x23 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`freelonode+0x37 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_rele+0x8 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_rele+0x8 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0xe8 + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`syscall_mstate+0x2a + unix`0xfffffffffb800ca0 + 6 + + genunix`post_syscall+0x31b + unix`0xfffffffffb800c91 + 6 + + genunix`post_syscall+0x1f + unix`0xfffffffffb800c91 + 6 + + genunix`vn_invalid + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + zfs`zfs_lookup+0x21 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0xf1 + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0xf1 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`dnlc_lookup+0x62 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`post_syscall+0x324 + unix`0xfffffffffb800c91 + 6 + + genunix`falloc+0x84 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_rele+0x17 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`rwst_init+0x47 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`post_syscall+0x27 + unix`0xfffffffffb800c91 + 6 + + genunix`cv_destroy+0x8 + genunix`rwst_destroy+0x2e + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`fd_reserve+0x48 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`syscall_mstate+0x139 + unix`sys_syscall+0x10e + 6 + + genunix`syscall_mstate+0x3a + unix`sys_syscall+0x1a1 + 6 + + genunix`kmem_cache_free+0xfa + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`cv_destroy+0xc + genunix`rwst_destroy+0x25 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`pn_fixslash+0x3d + genunix`lookuppnvp+0x105 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookuppnatcred+0x16f + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`lo_inactive + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_alloc + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`post_syscall+0x134 + unix`0xfffffffffb800c91 + 6 + + genunix`fop_lookup+0xa5 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`lo_inactive+0x8 + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0x8 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`lsave+0x7a + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`pn_fixslash+0x4b + genunix`lookuppnvp+0x105 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`sys_syscall+0x192 + 6 + + genunix`dnlc_lookup+0x7d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_getlock+0x6e + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`unfalloc + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`rwst_destroy + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`ufalloc_file+0xe3 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`memcmp+0x17 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`fop_inactive+0x17 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0x17 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0x17 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`fop_lookup+0xbb + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_getlock+0x7d + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 6 + + genunix`rwst_exit+0x5d + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`copen+0x33 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_rele+0x46 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`traverse+0x26 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0x2b + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_alloc+0xfc + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + ufs`ufs_lookup+0xfd + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`rw_exit+0x1e + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`copen+0x13f + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`bcopy+0x3c0 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookupnameat+0x20 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookuppnvp+0x1b7 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`syscall_mstate+0x177 + unix`sys_syscall+0x1a1 + 6 + + genunix`kmem_cache_alloc+0x8 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0x3a + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`dnlc_lookup+0x1ad + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`rwst_destroy+0x2e + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`fd_find+0x3f + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`ufalloc_file+0x10f + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`audit_getstate + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_enter + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_enter + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_enter + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_enter + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_enter + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_enter + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`audit_getstate+0x1 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookuppnvp+0xc3 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`rwst_destroy+0x33 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfslocks_getlock+0xa6 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`rwst_exit+0x86 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + ufs`ufs_lookup+0x17 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + zfs`zfs_fastaccesschk_execute+0x8 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + zfs`zfs_lookup+0x7a + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`audit_getstate+0xa + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`setf+0xcc + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`crgetmapped+0x2e + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`post_syscall+0x7f + unix`0xfffffffffb800c91 + 6 + + genunix`vn_rele + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_destroy + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`traverse+0x52 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`rwst_enter_common+0x162 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`ufalloc_file+0x26 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`tsc_gethrtimeunscaled+0x8 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 6 + + unix`mutex_destroy+0x8 + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`thread_lock + unix`0xfffffffffb800c91 + 6 + + genunix`vn_rele+0x10 + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + zfs`specvp_check + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vsd_free + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_exit + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_exit + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_exit + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`mutex_exit + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`syscall_mstate+0xa2 + unix`0xfffffffffb800ca0 + 6 + + unix`do_splx+0x74 + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 6 + + zfs`zfs_fastaccesschk_execute+0x26 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`vn_vfsunlock+0x8 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`kmem_cache_free+0x68 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`freelonode+0xb9 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + lofs`freelonode+0xb9 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`lookuppnvp+0x1e9 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + unix`do_splx+0x79 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 6 + + unix`bcopy+0x3fa + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`syscall_mstate+0x1ab + unix`sys_syscall+0x1a1 + 6 + + genunix`traverse+0x6f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 6 + + genunix`thread_lock+0x10 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 7 + + genunix`kmem_cache_free+0x70 + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_free+0x70 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`tsc_read + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 7 + + genunix`cv_broadcast+0x1 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`thread_lock+0x17 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 7 + + unix`tsc_gethrtimeunscaled+0x28 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 7 + + zfs`zfs_fastaccesschk_execute+0x138 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_openat+0x3d + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`dnlc_lookup+0xef + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`falloc+0xf + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`bcopy+0x310 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`lookuppnvp + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`lo_root+0x1 + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`tsc_gethrtimeunscaled+0x34 + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 7 + + genunix`lookuppnatcred+0xf5 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`cv_broadcast+0x17 + genunix`setf+0x8c + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_free+0x8 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_rele+0x39 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`copyinstr+0x1b + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_inactive+0x8b + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`dnlc_lookup+0xfc + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_lookup+0x12d + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + ufs`ufs_lookup+0x365 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_alloc+0x66 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_vfslocks_getlock + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`ufalloc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`clear_stale_fd+0x13 + genunix`post_syscall+0x1fe + unix`0xfffffffffb800c91 + 7 + + genunix`lookuppnvp+0x29 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`copen+0x2ba + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`freelonode+0xfb + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_free+0x2b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`setf+0x12b + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_inactive+0xab + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`sys_syscall+0x132 + 7 + + genunix`audit_falloc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`freelonode+0x1 + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`disp_lock_exit+0x32 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 7 + + genunix`open+0x26 + 7 + + genunix`thread_lock+0x57 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 7 + + genunix`syscall_mstate+0x1f7 + unix`sys_syscall+0x1a1 + 7 + + lofs`freelonode+0x8 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`rwst_enter_common+0x2cb + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`mutex_destroy+0x6b + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_mountedvfs+0xc + genunix`traverse+0x77 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_alloc+0x8d + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`pn_get_buf+0x4f + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`setf+0x3f + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`pn_get_buf+0x50 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`lookuppnatcred+0x30 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_mountedvfs+0x10 + genunix`traverse+0x77 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + zfs`zfs_lookup+0xf4 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`freelonode+0x115 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`lo_lookup+0x275 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`cv_init+0x8 + genunix`rwst_init+0x47 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`freelonode+0x21e + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`lookuppnatcred+0x3f + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`gethrtime_unscaled + unix`0xfffffffffb800ca0 + 7 + + genunix`fop_lookup+0x73 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_alloc+0xd4 + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`lookuppnvp+0x458 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`rwst_exit+0x18 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`rwst_init+0x28 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`syscall_mstate+0x119 + unix`0xfffffffffb800c86 + 7 + + genunix`syscall_mstate+0x1b + unix`sys_syscall+0x10e + 7 + + genunix`kmem_cache_free+0xdb + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`syscall_mstate+0x11c + unix`sys_syscall+0x1a1 + 7 + + lofs`freelonode+0x2f + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_free+0x66 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`syscall_mstate+0x26 + unix`0xfffffffffb800c86 + 7 + + genunix`syscall_mstate+0x26 + unix`0xfffffffffb800ca0 + 7 + + genunix`fd_reserve+0x37 + genunix`setf+0x123 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + ufs`ufs_iaccess+0x28 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_vfslocks_rele+0x8 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`syscall_mstate+0x2a + unix`sys_syscall+0x1a1 + 7 + + genunix`dnlc_lookup+0x5f + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`bcmp+0xf + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fd_reserve+0x40 + genunix`setf+0x123 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`do_splx+0x1 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 7 + + genunix`rwst_exit+0x35 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`lo_lookup+0xa6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_vfslocks_rele+0x17 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_invalid+0x8 + lofs`freelonode+0x115 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_free+0xfa + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_free+0xfa + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`rwst_enter_common+0xb + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`cv_destroy+0xc + genunix`rwst_destroy+0x2e + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + zfs`zfs_lookup+0x2c + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_vfsrlock + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`lock_clear_splx + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 7 + + unix`strlen+0x3 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`rwst_exit+0x44 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_vfslocks_getlock+0x66 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`falloc+0x97 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_free+0x8 + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_free+0x8 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_alloc+0xb + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`lookuppnatcred+0x7c + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`setf+0x8c + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_invalid+0x1d + lofs`freelonode+0x115 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_vfslocks_getlock+0x6e + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`ufalloc_file+0xde + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`lo_inactive+0x10 + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`copystr+0x14 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`makelfsnode+0x17 + lofs`makelonode+0x192 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_free+0x17 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`lo_inactive+0x18 + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`lo_inactive+0x18 + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_vfsrlock+0x18 + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`syscall_mstate+0x58 + unix`0xfffffffffb800ca0 + 7 + + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`secpolicy_vnode_access2+0x1e + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`rwst_enter_common+0x331 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`dnlc_lookup+0x195 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`memcmp+0x26 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_inactive+0x26 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`syscall_mstate+0x69 + unix`sys_syscall+0x10e + 7 + + genunix`falloc+0xbc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`syscall_mstate+0x170 + unix`sys_syscall+0x1a1 + 7 + + genunix`syscall_mstate+0x71 + unix`0xfffffffffb800c86 + 7 + + zfs`zfs_lookup+0x63 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`crgetmapped+0x15 + genunix`fop_inactive+0x60 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_free+0x3a + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_vfslocks_rele+0x5c + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_lookup+0x1e0 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`audit_getstate + unix`0xfffffffffb800c91 + 7 + + genunix`kmem_cache_alloc+0x10 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`mutex_enter + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`mutex_enter + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`mutex_enter + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`audit_getstate+0x1 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`pn_getcomponent+0x14 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_openat+0x307 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_alloc+0x17 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`makelonode+0x89 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`audit_getstate+0xa + unix`0xfffffffffb800c91 + 7 + + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_lookup+0xed + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`crgetmapped+0x2e + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`freelonode+0x1a0 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + zfs`zfs_lookup+0x80 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_alloc+0x22 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_inactive+0x53 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_inactive+0x53 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`post_syscall+0x85 + unix`0xfffffffffb800c91 + 7 + + genunix`vn_setpath+0x26 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_alloc+0x26 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`mutex_destroy+0x8 + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_alloc+0x2a + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_lookup+0xfc + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + lofs`makelonode+0x1a0 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`mutex_exit + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`mutex_exit + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`vn_rele+0x17 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`copystr+0x67 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + unix`mutex_init+0x27 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`kmem_cache_free+0x68 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_lookup+0x20b + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_lookup+0x10c + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`fop_inactive+0x6d + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 7 + + genunix`falloc + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0x70 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_exit+0x12 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_exit+0x12 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_exit+0x12 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_free+0x5 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`copen+0x86 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`unfalloc+0x66 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_alloc+0x46 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + zfs`specvp_check+0x17 + zfs`zfs_lookup+0xf4 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_alloc+0x49 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_exit+0x19 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_exit+0x19 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_exit+0x19 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`thread_lock+0x1b + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 8 + + unix`mutex_init+0x3d + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_alloc+0x4e + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`lo_lookup+0x30 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`copen+0x195 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_vfslocks_rele+0xa6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`freelonode+0xdd + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`freelonode+0xdd + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_rele+0x3e + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`fop_inactive+0x90 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_vfslocks_getlock+0xf2 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_vfslocks_rele+0xb3 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`syscall_mstate+0x1d4 + unix`sys_syscall+0x10e + 8 + + lofs`lsave+0x8 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`fop_lookup+0x13d + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`disp_lock_exit+0x1e + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 8 + + genunix`syscall_mstate+0xe3 + unix`0xfffffffffb800c86 + 8 + + lofs`lo_root+0x25 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`disp_lock_exit+0x30 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 8 + + genunix`rwst_init + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_free+0x43 + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_setpath+0x85 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`table_lock_enter+0x38 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_rele+0x68 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`rwst_enter_common+0x1c8 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`syscall_mstate+0xf8 + unix`0xfffffffffb800c86 + 8 + + genunix`kmem_cache_free+0xbd + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0xbd + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`lo_lookup+0x26f + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`pn_fixslash + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`lookuppnvp+0x240 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_mountedvfs+0x11 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`rwst_enter_common+0x2d7 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_free+0x57 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`syscall_mstate+0x108 + unix`0xfffffffffb800ca0 + 8 + + genunix`vn_vfslocks_getlock+0x29 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_vfslocks_getlock+0x29 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`rwst_enter_common+0x2db + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`fop_lookup+0x6d + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_destroy+0x7f + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`syscall_mstate+0x10 + unix`0xfffffffffb800ca0 + 8 + + genunix`kmem_alloc+0xd4 + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`table_lock_enter+0x57 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`syscall_mstate+0x17 + unix`sys_syscall+0x10e + 8 + + genunix`rwst_exit+0x18 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 8 + + lofs`makelonode+0x1b + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`rwst_enter_common+0x1ec + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`copen+0x4ee + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`post_syscall+0xf + unix`0xfffffffffb800c91 + 8 + + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 8 + + genunix`kmem_cache_free+0xe8 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`freelonode+0x23a + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`fop_lookup+0x8a + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0xf1 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0xf1 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`syscall_mstate+0x132 + unix`sys_syscall+0x1a1 + 8 + + genunix`syscall_mstate+0x135 + unix`sys_syscall+0x10e + 8 + + genunix`vn_free+0x78 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0xfa + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0xfa + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`cv_destroy+0xc + genunix`rwst_destroy+0x2e + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_zalloc+0xc + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`freelonode+0x4f + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`lo_inactive+0x8 + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0x8 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`secpolicy_vnode_access2+0x8 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`copen+0x21b + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + zfs`zfs_lookup+0x3b + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`lo_inactive+0xc + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`rwst_exit+0x4c + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`strlen+0x10 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`secpolicy_vnode_access2+0x13 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_alloc+0xe4 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`syscall_mstate+0x157 + unix`0xfffffffffb800ca0 + 8 + + genunix`kmem_cache_free+0x1b + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_vfslocks_getlock+0x7d + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 8 + + genunix`rwst_exit+0x5d + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`lookuppnvp+0xa2 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + zfs`zfs_lookup+0x52 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`memcmp+0x23 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_alloc+0xf3 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`lfind+0x16 + lofs`makelonode+0x47 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_vfslocks_getlock+0x86 + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`copen+0x37 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`rwst_destroy+0x17 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`fop_lookup+0x1c8 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`rwst_enter_common+0x38 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_alloc+0x2a + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`fop_lookup+0xcb + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`memcmp+0x2c + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`dnlc_lookup+0xa0 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`atomic_add_32 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_alloc + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`secpolicy_vnode_access2+0x34 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vsd_free+0xd8 + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`freelonode+0x189 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`fd_find+0x3a + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0x3a + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_alloc+0xc + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`audit_unfalloc+0x4d + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0x3f + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`fop_lookup+0xe0 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_enter + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_enter + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_enter + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + ufs`ufs_lookup+0x111 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`syscall_mstate+0x84 + unix`sys_syscall+0x10e + 8 + + genunix`kmem_cache_alloc+0x17 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_enter+0x9 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + lofs`freelonode+0x9d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`rwst_enter_common+0x15f + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_rele + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + ufs`ufs_lookup+0x22 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_init+0x17 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`audit_getstate+0x18 + genunix`copen+0x59 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_alloc+0x2a + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`ufalloc_file+0x12f + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`vn_vfsunlock + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_exit + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`mutex_exit + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`fd_find+0x62 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`post_syscall+0x93 + unix`0xfffffffffb800c91 + 8 + + genunix`vn_vfslocks_getlock+0xc4 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + unix`bcopy+0x3f5 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_alloc+0x3a + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`audit_getstate+0x2c + genunix`post_syscall+0xbe + unix`0xfffffffffb800c91 + 8 + + genunix`kmem_cache_alloc+0x3e + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 8 + + genunix`kmem_cache_free+0x70 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0x70 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`tsc_read + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 9 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`mutex_exit+0x12 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`mutex_exit+0x12 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`mutex_exit+0x12 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`audit_getstate+0x33 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vsd_free+0x17 + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`mutex_exit+0x19 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`openat+0x1e + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_recycle+0x90 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`fd_find+0x80 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`setf + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 9 + + genunix`kmem_free+0x17 + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`table_lock_enter+0x8 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_rele+0x39 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`lookuppnatcred + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`lookuppnvp+0x217 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_free+0x2a + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfslocks_getlock+0x106 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_alloc+0x77 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfslocks_getlock+0x8 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_enter_common+0x1b8 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`post_syscall+0xda + unix`0xfffffffffb800c91 + 9 + + genunix`fsop_root+0x4b + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_setops+0x30 + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0xb0 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`lookuppnvp+0x132 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`table_lock_enter+0x38 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_init+0x8 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0xbd + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_exit + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 9 + + genunix`rwst_enter_common+0x1d8 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_enter_common+0x2dc + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_enter_common+0x2dc + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`freelonode+0x21e + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`mutex_destroy+0x7f + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`table_lock_enter+0x50 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`makelonode+0x10 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + zfs`zfs_lookup+0x1 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`post_syscall+0x1 + 9 + + genunix`copen+0x4e3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + ufs`ufs_iaccess+0x15 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_enter_common+0x1e8 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`cv_init+0x19 + genunix`rwst_init+0x47 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`cv_init+0x19 + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0xdb + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0xdb + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfslocks_getlock+0x3c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`freelonode+0x22e + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfslocks_getlock+0x41 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfslocks_getlock+0x41 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`freelonode+0x33 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0xe8 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`cv_broadcast+0x7f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`cv_destroy+0x1 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_init+0x42 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`fop_lookup+0x93 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`lo_root+0x77 + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfslocks_getlock+0x59 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0xfa + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`cv_destroy+0xc + genunix`rwst_destroy+0x25 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`strlen + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`lookuppnvp+0x182 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_alloc+0x5 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`post_syscall+0x35 + unix`0xfffffffffb800c91 + 9 + + lofs`makelfsnode+0x8 + lofs`makelonode+0x192 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0x8 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfslocks_rele+0x29 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfsrlock+0x9 + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_enter_common+0x1b + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_enter_common+0x1b + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0xc + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`syscall_mstate+0x14d + unix`0xfffffffffb800c86 + 9 + + genunix`vn_openat+0xd1 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_exit+0x54 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_alloc+0xe4 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`lo_lookup+0xc7 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`fop_inactive+0x17 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0x17 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0x17 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_alloc+0x17 + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_setpath+0xea + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_alloc+0xf3 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_alloc+0xf3 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfslocks_getlock+0x88 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0x2b + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_openat+0x2ef + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_alloc + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`fd_find+0x36 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vfs_getops+0x3b + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_alloc+0x3b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`fop_lookup+0x1dc + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0x3f + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`secpolicy_vnode_access2+0x3f + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`mutex_enter + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`copen+0x156 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`secpolicy_vnode_access2+0x46 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`mutex_enter+0x9 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`freelonode+0x1a0 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_rele + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`traverse+0x52 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`lookuppnvp+0xd6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`freelonode+0xa8 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`mutex_exit + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_setpath+0x35 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0x68 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0x68 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_alloc+0x3a + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`vn_setpath+0x13b + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + unix`mutex_exit+0xc + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + lofs`freelonode+0x1bd + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 9 + + genunix`kmem_cache_free+0x70 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_exit+0x12 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_exit+0x12 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vsd_free+0x17 + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_exit+0x19 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`table_lock_enter + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`disp_lock_exit + unix`0xfffffffffb800c91 + 10 + + genunix`dnlc_lookup+0xf2 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_openat+0x43 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`cv_broadcast+0x17 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`lsave + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`open + 10 + + genunix`vn_vfslocks_rele+0xb3 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_setpath+0x66 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`table_lock_enter+0x17 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`sys_syscall+0x121 + 10 + + genunix`fop_inactive+0xa3 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`table_lock_enter+0x26 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_cache_alloc+0x77 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`syscall_mstate+0x1ef + unix`sys_syscall+0x1a1 + 10 + + genunix`vn_reinit + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_cache_free+0xb0 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`lookuppnatcred+0x25 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_vfslocks_getlock+0x17 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_rele+0x68 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`freelonode+0x109 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`cv_init+0x1 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_cache_alloc+0x92 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`thread_lock+0x167 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 10 + + genunix`rwst_enter_common+0x2d7 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_alloc+0xc8 + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`lookuppnatcred+0x3b + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + zfs`zfs_lookup + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`pn_fixslash+0x14 + genunix`lookuppnvp+0x105 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`table_lock_enter+0x57 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_vfslocks_getlock+0x3c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`rwst_enter_common+0x1ec + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`lookuppnvp+0x45f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_vfslocks_rele + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`syscall_mstate+0x123 + unix`sys_syscall+0x1a1 + 10 + + genunix`vn_setpath+0xb8 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`freelonode+0x23a + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`dnlc_lookup+0x5c + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`table_lock_enter+0x6d + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_openat+0xb1 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_cache_free+0xf1 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`cv_destroy+0xd + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`lo_inactive + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_vfsrlock + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`strlen + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`syscall_mstate+0x41 + unix`0xfffffffffb800ca0 + 10 + + genunix`rwst_init+0x51 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`lookupnameatcred+0xf + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`lfind + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_setpath+0xe2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_cache_alloc+0xe4 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vfs_getops+0x17 + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_cache_free+0x17 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_alloc+0x1b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`dnlc_lookup+0x8f + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`memcmp+0x20 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`lookupnameat+0x14 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_vfslocks_getlock+0x88 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`crgetmapped+0x8 + genunix`fop_inactive+0x60 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`fop_lookup+0xcd + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`secpolicy_vnode_access2+0x2d + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_alloc+0x2e + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_vfslocks_getlock+0x90 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_cache_alloc + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`lookupnameatcred+0x31 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`makelonode+0x17d + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`atomic_add_64 + unix`0xfffffffffb800c86 + 10 + + genunix`vfs_getops+0x40 + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`audit_getstate + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_enter + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_enter + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`secpolicy_vnode_access2+0x43 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`kmem_cache_alloc+0x17 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vsd_free+0xe8 + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_init+0x8 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`thread_lock+0xed + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 10 + + genunix`fop_inactive+0x4e + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + lofs`freelonode+0xa0 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`tsc_gethrtimeunscaled + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 10 + + unix`tsc_gethrtimeunscaled + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 10 + + unix`tsc_gethrtimeunscaled + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 10 + + genunix`vn_rele+0x8 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`openat + unix`sys_syscall+0x17a + 10 + + genunix`vsd_free + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_exit + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_exit + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_exit + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`vn_vfslocks_getlock+0xc4 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + genunix`fd_find+0x67 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`mutex_init+0x27 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 10 + + unix`bcopy+0x300 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + unix`tsc_read + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 11 + + lofs`freelonode+0x1c1 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_rele+0x24 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`post_syscall+0x1a5 + unix`0xfffffffffb800c91 + 11 + + genunix`kmem_cache_alloc+0x4e + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_free + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`fop_lookup+0x126 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`table_lock_enter+0x8 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_setops+0x8 + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_rele+0x3e + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_free+0x26 + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_vfslocks_getlock+0x106 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_cache_alloc+0x79 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_free+0x2b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_free+0x2f + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_rele+0x60 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_mountedvfs + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_cache_free+0xb0 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`syscall_mstate+0x1f3 + unix`sys_syscall+0x1a1 + 11 + + genunix`kmem_free+0x43 + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`lsave+0x26 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`ufalloc_file+0x86 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_vfslocks_getlock+0x17 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`rwst_enter_common+0x2c7 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_mountedvfs+0x8 + genunix`traverse+0x77 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_cache_free+0xbd + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`post_syscall+0x5f0 + unix`0xfffffffffb800c91 + 11 + + genunix`kmem_cache_alloc+0x92 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`makelonode+0x8 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_rele+0x78 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`syscall_mstate+0xc + unix`sys_syscall+0x10e + 11 + + genunix`post_syscall+0x1fe + unix`0xfffffffffb800c91 + 11 + + lofs`lsave+0x42 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`makelonode+0x26 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_cache_free+0xe8 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`pn_fixslash+0x2c + genunix`lookuppnvp+0x105 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`cv_destroy + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`lo_lookup+0x1a8 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_setpath+0xce + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`makelonode+0x42 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_vfsrlock+0x9 + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`rwst_init+0x5a + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_invalid+0x1d + lofs`freelonode+0x115 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`fop_lookup+0xb2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_alloc+0x17 + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`secpolicy_vnode_access2+0x218 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_cache_free+0x1b + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`unfalloc+0xc + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 11 + + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`rwst_enter_common+0x331 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_cache_alloc+0xf3 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`ufalloc_file + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_cache_alloc + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`rwst_enter_common+0x341 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`lfind+0x24 + lofs`makelonode+0x47 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`freelonode+0x88 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_setpath+0x8 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_cache_free+0x3a + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`fop_lookup+0xdd + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + unix`mutex_enter + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`rwst_destroy+0x33 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + lofs`lfind+0x35 + lofs`makelonode+0x47 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_vfslocks_getlock+0xa6 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`kmem_alloc+0x46 + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + unix`bcopy+0x2d7 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_setpath+0x17 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vsd_free+0xe8 + genunix`vn_free+0x8b + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + unix`mutex_enter+0x9 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + unix`mutex_enter+0x9 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`fop_lookup+0xea + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`crgetmapped+0x2a + genunix`fop_inactive+0x60 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`syscall_mstate+0x18c + unix`0xfffffffffb800ca0 + 11 + + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + unix`tsc_gethrtimeunscaled + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 11 + + genunix`vn_vfslocks_getlock+0xb4 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + ufs`ufs_lookup+0x2d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`rwst_tryenter+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`fop_inactive+0x60 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_setpath+0x31 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + genunix`vn_openat+0x124 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + ufs`ufs_lookup+0x34 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 11 + + unix`copyinstr + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_alloc+0x43 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_alloc+0x4e + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_rele+0x31 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + unix`mutex_init+0x42 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfslocks_rele+0xa6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_rele+0x39 + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`fop_inactive+0x90 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfsunlock+0x35 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`fop_lookup+0x135 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_setops+0x17 + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfslocks_getlock + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`dnlc_lookup+0x11 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + lofs`lsave+0x17 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + unix`rw_enter+0x17 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_alloc+0x79 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`dnlc_lookup+0x22 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + lofs`table_lock_enter+0x38 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_reinit+0x8 + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`rwst_enter_common+0x1c8 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + lofs`lsave+0x32 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + lofs`freelonode+0x115 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + lofs`table_lock_enter+0x50 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`fop_lookup+0x77 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`cv_init+0x19 + genunix`rwst_init+0x47 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_free+0xdb + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`dnlc_lookup+0x59 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + ufs`ufs_iaccess+0x2f + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_invalid + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + unix`membar_consumer + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_setpath+0x1c7 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_free+0xfa + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`dnlc_lookup+0x16c + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vfs_getops + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_alloc + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`ufalloc_file+0xd3 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`set_errno+0x34 + genunix`copen+0x4fa + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + lofs`makelonode+0x47 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`dnlc_lookup+0x17f + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_alloc+0xf + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_free+0x1b + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfslocks_getlock+0x7d + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_free+0xa3 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_alloc+0xf3 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfslocks_getlock+0x86 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfslocks_getlock+0x86 + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + lofs`makelonode+0x168 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_free+0x2b + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_free+0x2b + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`rwst_enter_common+0x341 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_alloc+0x32 + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_alloc+0x8 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfslocks_rele+0x5c + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`rwst_destroy+0x2e + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_free+0x3f + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + unix`mutex_enter + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`fop_inactive+0x41 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`rwst_enter_common+0x157 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`rwst_enter_common+0x157 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_alloc+0x17 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_alloc+0x17 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + lofs`lfind+0x3b + lofs`makelonode+0x47 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_setpath+0x1b + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`fop_lookup+0x1f0 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`fop_lookup+0xf1 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_alloc+0x26 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + unix`mutex_init+0x17 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + lofs`freelonode+0x1b0 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + unix`mutex_exit + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`dnlc_lookup+0xd3 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_vfsunlock+0x8 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + ufs`ufs_lookup+0x138 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`vn_setpath+0x3d + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 12 + + genunix`kmem_cache_free+0x70 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`traverse+0x77 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + unix`mutex_init+0x3d + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`fop_lookup+0x25 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_free+0x17 + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`freelonode+0x1de + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`fop_lookup+0x30 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfslocks_getlock+0xf2 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`fop_lookup+0x37 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`table_lock_enter+0x1b + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`lo_lookup+0x250 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`table_lock_enter+0x26 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`fop_lookup+0x47 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_mountedvfs + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`fop_lookup+0x55 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`dnlc_lookup+0x26 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_setops+0x3d + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_cache_free+0xbd + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`dnlc_lookup+0x2e + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`cv_init + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`freelonode+0x17 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`rwst_init+0x17 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`cv_init+0x8 + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`lo_lookup+0x283 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`rwst_enter_common+0x1e4 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`rwst_init+0x28 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`table_lock_enter+0x5c + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_setpath+0xb0 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`lsave+0x52 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`rwst_exit+0x23 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + ufs`ufs_iaccess+0x24 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_exists+0x36 + lofs`makelonode+0x1e7 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfslocks_rele+0x8 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_cache_free+0xe8 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_cache_free+0xe8 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`makelonode+0x2a + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`table_lock_enter+0x6d + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_recycle + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`post_syscall+0x221 + unix`0xfffffffffb800c91 + 13 + + genunix`cv_destroy+0x8 + genunix`rwst_destroy+0x25 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_invalid+0x8 + lofs`freelonode+0x115 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + ufs`ufs_iaccess+0x3c + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`audit_unfalloc+0xc + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`table_lock_enter+0x7d + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`lsave+0x6f + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`fop_lookup+0x9f + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`makelfsnode + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + unix`sys_syscall+0x186 + 13 + + lofs`table_lock_enter+0x82 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`rwst_exit+0x44 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`traverse+0x8 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_cache_free+0x8 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_alloc+0xb + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + unix`strlen+0xb + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfslocks_getlock+0x6e + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfslocks_rele+0x38 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`traverse+0x18 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfslocks_getlock+0x7d + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_cache_alloc+0xf3 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfslocks_rele+0x46 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`traverse+0x26 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`unfalloc+0x16 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_alloc+0x26 + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`fop_lookup+0xc7 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_cache_alloc+0xfc + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_cache_alloc + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfsrlock+0x3b + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_setpath+0x118 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + unix`mutex_init+0x8 + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + ufs`ufs_lookup+0x1a + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_vfslocks_rele+0x6b + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_setpath+0x22 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`makelonode+0x98 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`lo_lookup+0xb + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + ufs`ufs_iaccess+0x9d + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`makelfsnode+0x5f + lofs`makelonode+0x192 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + unix`mutex_exit + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_setpath+0x133 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_rele+0x17 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_cache_alloc+0x37 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`kmem_cache_alloc+0x3a + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`fd_find+0x6b + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`fop_lookup+0xb + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`audit_getstate+0x2c + genunix`lookuppnvp+0x82 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + lofs`freelonode+0x1bd + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 13 + + genunix`vn_setpath+0x140 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_exit+0x12 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_exit+0x12 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`dnlc_lookup+0xe5 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vfs_matchops+0x27 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`cv_broadcast+0x8 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0x1a + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0x21 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0x21 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_setpath+0x155 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_vfslocks_rele+0xa6 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_inactive+0x8b + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0x2c + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + lofs`makelonode+0x1d2 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_recycle+0xa2 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + lofs`table_lock_enter+0x13 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_setpath+0x163 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_cache_alloc+0x66 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0x3b + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0x43 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fd_find+0xa6 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_vfslocks_getlock+0x8 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_vfslocks_getlock+0x8 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0x4b + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_recycle+0xbd + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + lofs`table_lock_enter+0x2e + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + lofs`freelonode + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`rwst_init + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_cache_free+0xb0 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_cache_alloc+0x84 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_exists+0x8 + lofs`makelonode+0x1e7 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + ufs`ufs_lookup+0x9b + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_destroy+0x84 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + lofs`lsave+0x45 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_reinit+0x29 + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_setpath+0xb5 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`dnlc_lookup+0x56 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + lofs`makelonode+0x2e + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + ufs`ufs_iaccess+0x130 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`syscall_mstate+0x130 + unix`sys_syscall+0x1a1 + 14 + + genunix`rwst_init+0x42 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_vfslocks_rele+0x17 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_vfslocks_rele+0x17 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`rwst_init+0x47 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`rwst_enter_common+0xb + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + lofs`lo_lookup+0x1ae + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`traverse + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_inactive + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`0xfffffffffb800c91 + 14 + + genunix`lookupnameatcred+0x1 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`bcopy+0x395 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vfs_getops+0x8 + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_inactive+0x8 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_cache_free+0x8 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`rwst_init+0x5b + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0xb0 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_cache_free+0x17 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_vfsrlock+0x18 + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`secpolicy_vnode_access2+0x1a + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`crgetmapped + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_cache_alloc+0xf3 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + ufs`ufs_lookup+0xf4 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_inactive+0x26 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`rwst_enter_common+0x38 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_alloc+0x2a + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_cache_alloc+0xfc + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + lofs`makelonode+0x6d + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`post_syscall+0x5e + unix`0xfffffffffb800c91 + 14 + + genunix`secpolicy_vnode_access2+0x22f + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vfs_getops+0x32 + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_cache_free+0x3a + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`lookupnameat+0x30 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_enter + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_enter + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_enter + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_enter + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0xed + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + ufs`ufs_iaccess+0x8e + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vfs_matchops + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_destroy+0x8 + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vn_rele+0xc + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`vsd_free + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_exit + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_exit + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_exit + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_exit + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`kmem_cache_alloc+0x3a + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + genunix`fop_lookup+0x10c + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + ufs`ufs_lookup+0x3c + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 14 + + unix`mutex_exit+0x12 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + unix`mutex_exit+0x12 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`makelfsnode+0x77 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`makelfsnode+0x78 + lofs`makelonode+0x192 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`dnlc_lookup+0xeb + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vsd_free+0x1b + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vn_vfslocks_rele+0x9e + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`lo_root + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`makelonode+0xc2 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + unix`mutex_init+0x42 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x66 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x66 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_free+0x2a + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`table_lock_enter+0x22 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + ufs`ufs_iaccess+0xe5 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vn_setops+0x26 + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`lookupnameatcred+0xa8 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`rwst_enter_common+0x1b8 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x84 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`lookuppnvp+0x235 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`rwst_enter_common+0x2c7 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + ufs`ufs_lookup+0x88 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x89 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`fop_lookup+0x5a + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + unix`mutex_destroy+0x6b + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x92 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x92 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_free+0x57 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`disp_lock_exit+0x48 + unix`0xfffffffffb800c91 + 15 + + genunix`kmem_alloc+0xc8 + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`syscall_mstate+0xc + unix`sys_syscall+0x1a1 + 15 + + genunix`syscall_mstate+0x10f + unix`sys_syscall+0x1a1 + 15 + + genunix`vn_setops+0x50 + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`crgetuid + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`dnlc_lookup+0x43 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`post_syscall+0x205 + unix`0xfffffffffb800c91 + 15 + + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vn_rele+0x87 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`cv_init+0x19 + genunix`rwst_init+0x56 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`crgetuid+0x10 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`makelonode+0x22 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`cv_destroy + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`rwst_exit+0x35 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`cv_destroy+0x8 + genunix`rwst_destroy+0x2e + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vn_recycle+0x8 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`syscall_mstate+0x139 + unix`0xfffffffffb800ca0 + 15 + + lofs`table_lock_enter+0x7d + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`lo_lookup+0xaf + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`traverse + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + unix`lock_clear_splx+0x3 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 15 + + lofs`lo_lookup+0xb7 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`lfind+0xb + lofs`makelonode+0x47 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`makelonode+0x5e + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`rwst_destroy+0x25 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vn_alloc+0x6 + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`memcmp+0x37 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`pn_getcomponent+0x8 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x8 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x8 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + lofs`makelonode+0x79 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + ufs`ufs_lookup+0xb + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + unix`mutex_enter + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`syscall_mstate+0x183 + unix`sys_syscall+0x1a1 + 15 + + lofs`makelonode+0x186 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`rwst_exit+0x86 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x1b + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`crgetmapped+0x2e + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + unix`copystr+0x54 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_alloc+0x26 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vn_rele+0x8 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`traverse+0x5b + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vn_vfsunlock + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + unix`mutex_exit + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + unix`mutex_exit + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_free+0x68 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`kmem_cache_free+0x68 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`vn_setpath+0x39 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`fsop_root+0xc + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + unix`mutex_exit+0xc + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 15 + + genunix`cv_broadcast + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vsd_free+0x10 + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vn_rele+0x24 + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + lofs`lfind+0x67 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_cache_alloc+0x4e + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + lofs`table_lock_enter + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + lofs`lo_lookup+0x34 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`dnlc_lookup+0x100 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + lofs`lo_lookup+0x48 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`post_syscall+0x1d0 + unix`0xfffffffffb800c91 + 16 + + unix`bcopy+0x330 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vn_vfslocks_getlock + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + unix`bcopy+0x238 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vn_mountedvfs+0x8 + genunix`lookuppnvp+0x217 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`pn_get_buf+0x4b + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + unix`splr+0xc + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 16 + + genunix`kmem_cache_alloc+0x8d + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_cache_alloc+0x92 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`fop_lookup+0x64 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vn_setpath+0x97 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_alloc+0xc8 + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`syscall_mstate+0xc + unix`0xfffffffffb800ca0 + 16 + + genunix`vn_setops+0x5f + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + unix`bcmp + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vn_vfslocks_getlock+0x41 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`cv_broadcast+0x72 + genunix`rwst_exit+0x8f + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`fop_lookup+0x82 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + lofs`lo_lookup+0x198 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + lofs`lsave+0x61 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vn_setpath+0x1c2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + ufs`ufs_iaccess+0x137 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + unix`sys_syscall+0x17d + 16 + + genunix`rwst_init+0x51 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`lookuppnvp+0x185 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vn_vfslocks_getlock+0x66 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_cache_free+0x8 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_cache_alloc+0xe4 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`memcmp+0x17 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_cache_alloc+0xfc + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + unix`atomic_add_32 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_cache_alloc+0x8 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_cache_alloc+0x8 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + unix`mutex_enter + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vfs_getops+0x49 + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`lookuppnvp+0xcb + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + lofs`lsave+0xc0 + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + unix`mutex_destroy + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_cache_alloc+0x22 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`kmem_cache_alloc+0x26 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + ufs`ufs_iaccess+0xa2 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`fop_lookup+0x107 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + genunix`vsd_free+0x8 + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + lofs`lfind+0x5f + lofs`makelonode+0x47 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 16 + + unix`mutex_exit+0x12 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`fop_lookup+0x16 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vn_setpath+0x14d + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`kmem_cache_alloc+0x4e + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + lofs`makelonode+0x1bf + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`kmem_free+0x17 + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + lofs`lo_lookup+0x138 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`dnlc_lookup + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vn_vfslocks_rele+0xc6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`lookuppnvp+0x327 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`fop_lookup+0x47 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`fop_inactive+0xab + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`lookuppnvp+0x32e + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + lofs`lo_lookup+0x60 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vn_exists + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`rwst_init+0x8 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`rwst_enter_common+0x1d8 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vn_exists+0x1d + lofs`makelonode+0x1e7 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + lofs`makelonode+0x17 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`dnlc_lookup+0x50 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vn_vfslocks_getlock+0x41 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`cv_init+0x22 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + unix`membar_consumer + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + lofs`makelonode+0x31 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vn_reinit+0x47 + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`syscall_mstate+0x41 + unix`sys_syscall+0x1a1 + 17 + + lofs`table_lock_enter+0x82 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vn_recycle+0x17 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`memcmp+0x8 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`secpolicy_vnode_access2+0x108 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vn_vfslocks_rele+0x29 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`rwst_exit+0x4c + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`rwst_destroy+0x8 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`lookuppnvp+0x1ac + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`fop_lookup+0xcd + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + lofs`lo_lookup+0x2e0 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + unix`mutex_enter + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + unix`mutex_enter + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`traverse+0x43 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`fop_lookup+0xe9 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`crgetmapped+0x2a + genunix`fop_lookup+0x1dc + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vn_recycle+0x65 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`kmem_cache_alloc+0x26 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + lofs`lsave+0xca + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + lofs`makelonode+0x9f + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`rwst_tryenter+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + unix`mutex_exit + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`kmem_cache_alloc+0x33 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vfs_matchops+0x17 + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + unix`mutex_exit+0xc + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + lofs`makelfsnode+0x6e + lofs`makelonode+0x192 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 17 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`vfs_matchops+0x23 + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`vsd_free+0x1f + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`lookuppnvp+0x205 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + unix`bcopy+0x1f + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`fop_lookup+0x135 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`fop_lookup+0x3f + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + lofs`lo_lookup+0x50 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + ufs`ufs_lookup+0x70 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`kmem_cache_alloc+0x89 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`dnlc_lookup+0x2a + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + lofs`lo_lookup+0x26b + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`cv_init+0x1 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`vn_mountedvfs+0x11 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`dnlc_lookup+0x32 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`fop_lookup+0x64 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`cv_init+0x8 + genunix`rwst_init+0x47 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + lofs`lo_lookup+0x79 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + ufs`ufs_iaccess+0x10c + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`lookuppnvp+0x15e + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`kmem_alloc+0xdf + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`post_syscall+0x211 + unix`0xfffffffffb800c91 + 18 + + genunix`fop_lookup+0x82 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`fop_lookup+0x8e + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`rwst_enter_common + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + unix`do_splx + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 18 + + unix`strlen + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`dnlc_lookup+0x7d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`fop_lookup+0xb0 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`fop_lookup+0xb6 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`rwst_enter_common+0x29 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`lookupnameat+0xc + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`vn_vfslocks_rele+0x46 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`pn_getcomponent + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`vn_vfslocks_getlock+0x90 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`vn_vfsrlock+0x3b + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`kmem_alloc+0x3b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`rwst_destroy+0x32 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`rwst_tryenter+0x9 + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`crgetmapped+0x2a + genunix`fop_lookup+0x1dc + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + lofs`makelonode+0x192 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`vn_alloc+0x35 + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + genunix`audit_getstate+0x2c + genunix`copen+0x59 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + unix`mutex_exit+0xc + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + lofs`makelonode+0x1af + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 18 + + unix`mutex_exit+0x12 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`vn_rele+0x24 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`dnlc_lookup+0x9 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`fop_lookup+0x3f + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`fop_lookup+0x43 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`dnlc_lookup+0x15 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + lofs`lo_lookup+0x25d + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`vn_vfslocks_rele+0xce + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + unix`rw_enter+0x22 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`fop_lookup+0x55 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + lofs`makelonode + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`vn_mountedvfs+0x11 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`vn_vfslocks_rele+0x105 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`dnlc_lookup+0x160 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + unix`membar_consumer + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`audit_unfalloc+0x1 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`fop_lookup+0x9f + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`audit_unfalloc+0x24 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`vn_reinit+0x67 + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + lofs`lo_lookup+0x1d4 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`fop_lookup+0x1c8 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`crgetmapped+0x8 + genunix`fop_lookup+0x1dc + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`memcmp+0x30 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + unix`clear_int_flag + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 19 + + genunix`crgetmapped+0x15 + genunix`fop_lookup+0x1dc + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + ufs`ufs_iaccess+0x7f + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + unix`mutex_enter + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + unix`mutex_init + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`rwst_tryenter+0x9 + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + unix`i_ddi_splhigh+0x5 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 19 + + genunix`kmem_cache_alloc+0x26 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + unix`tsc_gethrtimeunscaled+0xc + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 19 + + unix`copystr+0x60 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + unix`mutex_exit + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + ufs`ufs_lookup+0x38 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + lofs`lo_lookup+0x1a + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`traverse+0x6f + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 19 + + genunix`kmem_free + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`traverse+0x7c + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`vn_setpath+0x4e + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`vn_setops + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`fop_lookup+0x25 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + lofs`lo_lookup+0x3c + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`vn_vfslocks_rele+0xb3 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`vn_vfslocks_getlock + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`traverse+0xa8 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`vn_recycle+0xbe + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`vn_setpath+0x190 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + lofs`table_lock_enter+0x41 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + unix`mutex_destroy+0x7f + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + ufs`ufs_iaccess+0x11c + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`kmem_alloc+0xdf + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`vn_setpath+0x1b0 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`dnlc_lookup+0x159 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`kmem_cache_free+0xf1 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`dnlc_lookup+0x65 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`cv_destroy+0xd + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`vn_vfslocks_rele+0x38 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`dnlc_lookup+0x198 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`crgetmapped+0x8 + genunix`fop_lookup+0x1dc + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`kmem_alloc+0x2a + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`crgetmapped+0x15 + genunix`fop_lookup+0x1dc + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`fop_lookup+0x1d7 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`rwst_tryenter + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + lofs`makelonode+0x92 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + unix`mutex_exit + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + genunix`dnlc_lookup+0xdf + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 20 + + ufs`ufs_lookup+0x40 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + lofs`lo_lookup+0x29 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`kmem_free+0xb + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`fop_lookup+0x126 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`kmem_free+0x17 + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`fop_lookup+0x13e + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + lofs`makelonode+0x1e7 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`vn_recycle+0xb9 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + ufs`ufs_lookup+0x80 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`vn_free+0x32 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + ufs`ufs_lookup+0x85 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`vn_setops+0x4a + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`crgetuid+0x8 + ufs`ufs_iaccess+0xe5 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + ufs`ufs_iaccess+0x33 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`dnlc_lookup+0x79 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + unix`strlen+0xb + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`vn_vfslocks_getlock+0x6e + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`rwst_destroy + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + unix`strlen+0x13 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + unix`strlen+0x13 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`crgetmapped + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + lofs`makelfsnode+0x26 + lofs`makelonode+0x192 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + unix`bcopy+0x3b8 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`vfs_getops+0x28 + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`dnlc_lookup+0x9d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`vn_recycle+0x41 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`rwst_enter_common+0x44 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`secpolicy_vnode_access2+0x38 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`kmem_cache_free+0x3a + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + lofs`lo_lookup+0x1ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`rwst_tryenter + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + unix`mutex_enter + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`fop_lookup+0x1f8 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + unix`mutex_destroy+0x17 + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 21 + + genunix`syscall_mstate+0x1b2 + unix`sys_syscall+0x1a1 + 22 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + lofs`lo_lookup+0x40 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`fop_lookup+0x30 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`lookuppnvp+0x31a + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`disp_lock_exit+0x1b + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 22 + + genunix`dnlc_lookup+0x11 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`vn_setpath+0x83 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`pn_getcomponent+0x90 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + ufs`ufs_iaccess+0x8 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + lofs`lsave+0x3a + lofs`makelonode+0x1df + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`rwst_init+0x38 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`secpolicy_vnode_access2+0x1 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`kmem_cache_alloc+0xfc + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`dnlc_lookup+0xa0 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + ufs`ufs_lookup + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`fop_lookup+0x1d7 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`dnlc_lookup+0xa9 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + ufs`ufs_iaccess+0x7a + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + unix`mutex_enter + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + unix`mutex_enter + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + genunix`rwst_enter_common+0x15f + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + ufs`ufs_lookup+0x29 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + unix`mutex_exit + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 22 + + unix`mutex_exit+0x12 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + unix`mutex_exit+0x19 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`lookuppnvp+0x308 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`dnlc_lookup+0x11c + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`pn_getcomponent+0x89 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`lookuppnvp+0x13e + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`pn_getcomponent+0xab + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`rwst_enter_common + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`cv_destroy+0x1 + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + lofs`lo_lookup+0x1bf + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + unix`rw_exit+0x3 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`secpolicy_vnode_access2+0x29 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`kmem_cache_alloc + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`dnlc_lookup+0x1ad + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`kmem_cache_alloc+0x17 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`pn_getcomponent+0x18 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`fop_lookup+0x1eb + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`crgetmapped+0x2e + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`fsop_root + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + unix`mutex_exit + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + unix`mutex_exit+0x9 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 23 + + genunix`falloc+0x1 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`vn_alloc+0x42 + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + lofs`lo_lookup+0x126 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`traverse+0x7f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + unix`bcopy+0x1b + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`vn_vfsunlock+0x35 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + ufs`ufs_iaccess+0xd8 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + ufs`ufs_iaccess+0x1 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`fop_lookup+0x73 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + ufs`ufs_lookup+0xb7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + lofs`lo_lookup+0x9d + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`pn_getcomponent+0xc1 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`syscall_mstate+0x139 + unix`sys_syscall+0x1a1 + 24 + + genunix`dnlc_lookup+0x175 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`fop_lookup+0xc2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`secpolicy_vnode_access2+0x226 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`fop_lookup+0xcb + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`dnlc_lookup+0x1a8 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + unix`copystr+0x45 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + zfs`zfs_lookup+0x88 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`fop_lookup+0xb + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 24 + + genunix`dnlc_lookup+0xeb + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`fop_lookup+0x1d + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`fop_lookup+0x2c + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`secpolicy_vnode_access2+0xa0 + ufs`ufs_iaccess+0x128 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`fop_lookup+0x5a + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`cv_init+0x22 + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + lofs`lo_lookup+0x1a4 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`post_syscall+0x22d + unix`0xfffffffffb800c91 + 25 + + genunix`lookupnameat + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`unfalloc+0x1 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + unix`strlen+0x16 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + ufs`ufs_lookup+0xe9 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + unix`mutex_enter + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`lookuppnvp+0x1c5 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`fop_lookup+0x1eb + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`vn_setpath+0x12b + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + unix`mutex_exit + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + unix`mutex_exit + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`vn_setpath+0x137 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + genunix`audit_getstate+0x2c + genunix`setf+0x3f + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 25 + + lofs`table_lock_enter + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`fop_lookup+0x3b + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`fop_lookup+0x13e + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`kmem_free+0x3a + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`cv_init + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`fop_inactive+0xc2 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`rwst_exit+0x8 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + lofs`lo_lookup+0x8f + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + unix`prunstop+0x1b + genunix`post_syscall+0x2d0 + unix`0xfffffffffb800c91 + 26 + + unix`bcmp+0xf + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + lofs`lo_lookup+0xa1 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`cv_destroy+0xd + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + ufs`ufs_iaccess+0x59 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`kmem_cache_alloc + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`dnlc_lookup+0xbe + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + unix`mutex_exit + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + unix`mutex_exit + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + lofs`lo_lookup+0x118 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 26 + + genunix`dnlc_lookup+0x149 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 27 + + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 27 + + ufs`ufs_iaccess+0x141 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 27 + + unix`bcopy+0x3b4 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 27 + + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 27 + + unix`rw_exit+0x24 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 27 + + genunix`thread_lock+0x1 + unix`0xfffffffffb800c91 + 27 + + unix`mutex_exit+0xc + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 27 + + genunix`lookuppnvp+0x1ed + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 27 + + unix`strlen + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 28 + + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 28 + + unix`strlen+0xb + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 28 + + genunix`vn_setpath+0xc + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 28 + + genunix`kmem_cache_alloc+0x10 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 28 + + genunix`fd_find+0x58 + genunix`ufalloc_file+0x91 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 28 + + genunix`fop_lookup+0x1 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 28 + + unix`mutex_exit+0xc + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 28 + + unix`mutex_exit+0xc + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 28 + + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 29 + + genunix`fop_lookup+0x37 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 29 + + unix`bcopy+0x234 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 29 + + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 29 + + genunix`fop_lookup+0x5e + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 29 + + genunix`rwst_enter_common+0x44 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 29 + + unix`tsc_gethrtimeunscaled+0x1 + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 29 + + genunix`syscall_mstate+0x1a1 + unix`sys_syscall+0x1a1 + 29 + + unix`mutex_exit+0xc + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 29 + + lofs`lo_lookup+0x133 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 30 + + unix`bcopy+0x32c + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 30 + + genunix`fop_inactive+0xc2 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 30 + + genunix`clear_stale_fd+0x46 + genunix`post_syscall+0x1fe + unix`0xfffffffffb800c91 + 30 + + genunix`vn_vfslocks_rele + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 30 + + genunix`syscall_mstate+0x14d + unix`0xfffffffffb800ca0 + 30 + + unix`rw_exit + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 30 + + genunix`rwst_enter_common+0x40 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 30 + + unix`mutex_enter + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 30 + + unix`mutex_exit + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 30 + + genunix`post_syscall+0x29a + unix`0xfffffffffb800c91 + 30 + + lofs`lo_lookup+0x38 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 31 + + unix`rw_enter+0x9 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 31 + + unix`splr + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 31 + + genunix`fop_lookup+0xc2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 31 + + genunix`memcmp+0x23 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 31 + + unix`mutex_init + genunix`vn_vfslocks_getlock+0xb0 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 31 + + lofs`lo_lookup + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 31 + + genunix`fop_lookup + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 31 + + unix`bcopy+0x17 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 32 + + genunix`pn_getcomponent+0x73 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 32 + + genunix`pn_getcomponent+0x81 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 32 + + unix`bcopy+0x38c + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 32 + + genunix`crgetmapped + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 32 + + ufs`ufs_lookup+0xfa + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 32 + + genunix`dnlc_lookup+0xd0 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 32 + + ufs`ufs_lookup+0x44 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 33 + + genunix`post_syscall+0x2b9 + unix`0xfffffffffb800c91 + 33 + + genunix`dnlc_lookup+0x75 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 33 + + ufs`ufs_iaccess+0x89 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 33 + + genunix`fsop_root+0x1 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 33 + + genunix`kmem_free + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + genunix`fop_lookup+0x113 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + lofs`lo_root+0x1f + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + genunix`fop_lookup+0x5e + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + lofs`table_lock_enter+0x41 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + genunix`dnlc_lookup+0x99 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + unix`clear_int_flag+0x2 + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 34 + + lofs`lfind+0x40 + lofs`makelonode+0x47 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + genunix`lookuppnvp+0x1db + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + genunix`fop_lookup + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 34 + + lofs`lo_lookup+0x58 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 35 + + genunix`memcmp + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 35 + + unix`strlen+0xe + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 35 + + unix`mutex_enter + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 35 + + genunix`fop_lookup+0x1ff + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 35 + + unix`mutex_exit+0xc + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 35 + + genunix`vn_setpath+0x6b + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 36 + + genunix`vn_setpath+0x9e + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 36 + + unix`membar_consumer+0x3 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 36 + + genunix`secpolicy_vnode_access2 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 36 + + unix`copystr+0x39 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 36 + + unix`mutex_exit + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 36 + + genunix`vn_mountedvfs + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 37 + + unix`mutex_enter+0x9 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 37 + + genunix`vn_reinit+0x7c + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 38 + + unix`mutex_exit+0xc + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 38 + + unix`mutex_exit+0xc + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 38 + + genunix`lookupnameat+0x1 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 39 + + unix`mutex_exit + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 39 + + genunix`pn_getcomponent+0x9e + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 40 + + unix`mutex_exit+0xc + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 40 + + unix`bcopy + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 41 + + unix`mutex_exit+0x12 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 41 + + unix`mutex_exit+0x12 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 41 + + genunix`dnlc_lookup + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 41 + + genunix`syscall_mstate+0x1 + 41 + + unix`bcopy+0x2cd + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 41 + + unix`bcopy+0x2fc + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 41 + + unix`0xfffffffffb800c7c + 42 + + genunix`dnlc_lookup+0x5f + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 42 + + genunix`cv_destroy + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 42 + + genunix`audit_getstate+0x1 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 42 + + unix`copystr+0x52 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 42 + + unix`mutex_exit+0xc + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 42 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 43 + + genunix`syscall_mstate + 43 + + genunix`vn_setpath+0xe7 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 43 + + unix`mutex_exit+0xc + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 43 + + unix`mutex_exit+0xc + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 43 + + genunix`vn_setpath + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 44 + + unix`mutex_exit+0xc + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 44 + + genunix`dnlc_lookup+0x6b + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 45 + + genunix`kmem_alloc + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 45 + + genunix`fop_lookup+0x1dc + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 46 + + unix`mutex_enter + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 46 + + genunix`dnlc_lookup+0x53 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 47 + + genunix`vn_rele + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 47 + + unix`mutex_exit+0xc + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 47 + + unix`mutex_exit+0xc + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 47 + + unix`mutex_exit+0xc + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 47 + + unix`mutex_exit+0x12 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 48 + + unix`rw_enter+0x14 + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 48 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 49 + + unix`mutex_exit+0xc + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 49 + + unix`atomic_cas_64 + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 50 + + unix`mutex_exit+0xc + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 50 + + ufs`ufs_iaccess + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 51 + + unix`strlen+0x8 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 51 + + unix`strlen+0xb + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 52 + + genunix`vn_setpath+0xee + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 52 + + unix`mutex_enter + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 52 + + unix`mutex_exit+0xc + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 52 + + unix`mutex_exit+0x12 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 53 + + genunix`vn_setpath+0x6f + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 53 + + unix`mutex_exit+0xc + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 53 + + unix`rw_enter + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 55 + + unix`mutex_exit+0xc + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 55 + + genunix`vn_setpath+0x126 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 56 + + genunix`kmem_free + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 57 + + unix`splr+0x1 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 57 + + genunix`dnlc_lookup+0x62 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 57 + + lofs`table_lock_enter+0x41 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 58 + + genunix`syscall_mstate+0x14d + unix`sys_syscall+0x10e + 58 + + unix`mutex_exit+0x12 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 59 + + unix`mutex_exit+0x12 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 59 + + genunix`vsd_free+0xc + genunix`vn_recycle+0xb5 + genunix`vn_reinit+0x7b + genunix`vn_alloc+0x3e + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 59 + + unix`bcopy+0x388 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 60 + + genunix`kmem_alloc+0x17 + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 60 + + unix`bcopy+0x3b0 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 60 + + unix`mutex_exit+0xc + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 61 + + unix`mutex_exit+0xc + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 61 + + unix`membar_consumer+0x3 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 62 + + unix`mutex_enter + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 62 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 64 + + unix`strlen+0x10 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 64 + + unix`bcopy+0x328 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 66 + + genunix`dnlc_lookup+0x6e + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 66 + + lofs`lo_lookup+0x279 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 67 + + genunix`vn_setpath+0x76 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 69 + + genunix`vn_setops+0x2b + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 69 + + genunix`vn_openat+0x7b + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 69 + + genunix`dnlc_lookup+0x69 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 69 + + unix`mutex_exit+0xc + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 69 + + unix`strlen+0xe + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 71 + + unix`mutex_exit+0xc + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 71 + + genunix`vfs_getops+0x20 + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 72 + + unix`bcopy+0x2c8 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 72 + + unix`mutex_exit+0x12 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 74 + + unix`bcopy+0x230 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 74 + + unix`bcopy+0x2f8 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 74 + + unix`mutex_enter+0x10 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 75 + + genunix`vn_setpath+0x15a + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 76 + + unix`mutex_exit+0xc + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 77 + + unix`mutex_exit+0xc + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 77 + + genunix`vn_setpath+0x199 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 78 + + genunix`fop_lookup+0xf8 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 78 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 79 + + genunix`memcmp+0x20 + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 80 + + unix`mutex_enter+0x10 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 82 + + genunix`memcmp+0x2c + unix`bcmp+0x9 + genunix`dnlc_lookup+0x10d + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 87 + + unix`mutex_enter+0x10 + genunix`lookuppnvp+0x39f + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 87 + + unix`atomic_add_64+0x4 + unix`0xfffffffffb800ca0 + 90 + + unix`mutex_enter+0x10 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 90 + + unix`mutex_enter+0x10 + genunix`unfalloc+0x61 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 91 + + unix`mutex_enter+0x10 + genunix`traverse+0x9f + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 91 + + unix`mutex_enter+0x10 + genunix`fsop_root+0x2d + genunix`traverse+0x87 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 92 + + unix`mutex_enter+0x10 + zfs`zfs_lookup+0xc2 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 92 + + unix`mutex_exit + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 92 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 93 + + unix`mutex_enter+0x10 + genunix`falloc+0x63 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 93 + + unix`mutex_enter+0x10 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 93 + + unix`mutex_enter+0x10 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 93 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 94 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 94 + + unix`mutex_exit+0x12 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 95 + + unix`mutex_enter+0x10 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 95 + + unix`mutex_enter+0x10 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 95 + + unix`mutex_enter+0x10 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 96 + + unix`atomic_add_32_nv+0x6 + genunix`unfalloc+0x4a + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 97 + + unix`atomic_add_64+0x4 + unix`sys_syscall+0x1a1 + 97 + + unix`mutex_exit+0xc + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 97 + + unix`atomic_add_64+0x4 + unix`sys_syscall+0x10e + 98 + + unix`mutex_exit+0xc + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 99 + + unix`mutex_exit+0x12 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 100 + + unix`membar_consumer+0x3 + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 100 + + unix`atomic_add_64+0x4 + unix`0xfffffffffb800c86 + 100 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 101 + + unix`mutex_destroy+0x74 + genunix`rwst_destroy+0x1c + genunix`vn_vfslocks_rele+0xd6 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 102 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 102 + + unix`atomic_add_32+0x3 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 105 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 105 + + unix`mutex_exit+0xc + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 105 + + unix`membar_consumer+0x3 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 106 + + unix`membar_consumer+0x3 + genunix`vfs_matchops+0x1c + lofs`lo_lookup+0x1e6 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 106 + + unix`mutex_exit+0xc + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 106 + + unix`mutex_exit+0xc + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 107 + + unix`mutex_enter+0x10 + ufs`ufs_lookup+0x36d + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 108 + + unix`mutex_exit+0xc + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 108 + + unix`mutex_enter+0x10 + genunix`kmem_free+0x4e + genunix`audit_unfalloc+0x44 + genunix`unfalloc+0x41 + genunix`copen+0x4f3 + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 109 + + genunix`pn_getcomponent+0xa8 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 110 + + unix`mutex_enter+0x10 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 111 + + genunix`dnlc_lookup+0x5c + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 114 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0x92 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 114 + + unix`mutex_enter+0x10 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 114 + + unix`mutex_exit+0xc + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 114 + + genunix`dnlc_lookup+0xe5 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 115 + + genunix`pn_getcomponent+0xb3 + genunix`lookuppnvp+0x16d + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 116 + + genunix`rwst_enter_common+0x40 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 116 + + unix`mutex_enter+0x10 + genunix`kmem_zalloc+0x47 + genunix`audit_falloc+0x1f + genunix`falloc+0xf8 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 121 + + unix`mutex_exit+0xc + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 123 + + unix`mutex_exit+0x12 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 124 + + unix`mutex_exit+0xc + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 126 + + unix`atomic_add_32+0x3 + genunix`falloc+0xbc + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 129 + + unix`tsc_read+0x3 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800ca0 + 145 + + unix`strlen+0x13 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 146 + + genunix`fop_lookup+0x113 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 154 + + unix`clear_int_flag+0x2 + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 157 + + unix`tsc_read+0x3 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x1a1 + 163 + + unix`copystr+0x34 + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 164 + + unix`mutex_exit+0xc + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 168 + + unix`tsc_read+0x3 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`0xfffffffffb800c86 + 169 + + unix`mutex_enter+0x10 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 169 + + lofs`lfind+0x38 + lofs`makelonode+0x47 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 171 + + unix`mutex_exit+0xc + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 172 + + unix`atomic_add_32+0x3 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 174 + + unix`mutex_enter+0x10 + lofs`freelonode+0x47 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 174 + + unix`mutex_exit+0xc + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 178 + + unix`tsc_read+0x3 + genunix`gethrtime_unscaled+0xa + genunix`syscall_mstate+0x5d + unix`sys_syscall+0x10e + 180 + + unix`mutex_enter+0x10 + lofs`freelonode+0x1fe + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 186 + + genunix`fop_lookup+0xf8 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 188 + + genunix`dnlc_lookup+0x50 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 190 + + unix`mutex_enter+0x10 + genunix`vn_free+0x9a + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 190 + + unix`mutex_enter+0x10 + genunix`ufalloc+0x13 + genunix`falloc+0x43 + genunix`copen+0x1ab + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 191 + + unix`mutex_enter+0x10 + genunix`kmem_free+0x4e + genunix`vn_free+0x37 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 193 + + unix`mutex_enter+0x10 + lofs`freelonode+0x1ed + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 196 + + unix`mutex_enter+0x10 + genunix`copen+0x4ea + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 196 + + unix`mutex_enter+0x10 + zfs`zfs_lookup+0xaa + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 201 + + unix`mutex_exit+0xc + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 210 + + unix`mutex_enter+0x10 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 233 + + unix`mutex_enter+0x10 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 237 + + unix`mutex_exit+0xc + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 258 + + unix`copystr+0x3e + genunix`pn_get_buf+0x43 + genunix`lookupnameatcred+0x69 + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 261 + + unix`atomic_cas_64+0x8 + lofs`makelonode+0x1c4 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 268 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 279 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x28 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 280 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x20 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 286 + + unix`mutex_enter+0x10 + genunix`vn_vfsunlock+0x15 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 290 + + unix`mutex_enter+0x10 + genunix`vn_alloc+0x1a + lofs`makelonode+0xb6 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 293 + + unix`mutex_enter+0x10 + lofs`makelonode+0x36 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 298 + + unix`mutex_enter+0x10 + lofs`makelonode+0xa9 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 298 + + unix`mutex_enter+0x10 + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 301 + + unix`mutex_enter+0x10 + genunix`rwst_tryenter+0x1a + genunix`vn_vfsrlock+0x2f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 305 + + unix`mutex_enter+0x10 + genunix`kmem_free+0x4e + genunix`vn_vfslocks_rele+0xe3 + genunix`vn_vfsunlock+0x30 + genunix`traverse+0xb3 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 308 + + unix`atomic_add_32+0x3 + lofs`lo_lookup+0x268 + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 309 + + unix`mutex_enter+0x10 + genunix`kmem_alloc+0x4b + genunix`vn_setpath+0xc2 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 318 + + unix`strlen+0x10 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 327 + + genunix`syscall_mstate+0x14d + unix`sys_syscall+0x1a1 + 330 + + unix`rw_exit+0xf + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 348 + + unix`mutex_enter+0x10 + genunix`kmem_alloc+0x4b + genunix`vn_vfslocks_getlock+0x9c + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 349 + + unix`rw_enter+0x2b + ufs`ufs_lookup+0xc7 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 355 + + unix`splr+0x6a + genunix`thread_lock+0x24 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 361 + + unix`mutex_enter+0x10 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 372 + + unix`strlen+0x8 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x387 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 407 + + unix`mutex_enter+0x10 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + genunix`lookuppnvp+0x229 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 420 + + unix`strlen+0x8 + lofs`freelonode+0x1f5 + lofs`lo_inactive+0x1d + genunix`fop_inactive+0x76 + genunix`vn_rele+0x82 + genunix`lookuppnvp+0x33b + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 534 + + unix`strlen+0xe + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 562 + + unix`sys_syscall+0xff + 565 + + unix`mutex_enter+0x10 + genunix`vn_vfsrlock+0x1f + genunix`traverse+0x30 + lofs`lo_lookup+0x2ee + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 673 + + unix`lock_try+0x8 + genunix`post_syscall+0x2e4 + unix`0xfffffffffb800c91 + 774 + + unix`mutex_enter+0x10 + ufs`ufs_lookup+0xa6 + genunix`fop_lookup+0xa2 + lofs`lo_lookup+0xbc + genunix`fop_lookup+0xa2 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 816 + + unix`mutex_enter+0x10 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 884 + + unix`strlen+0x8 + genunix`fop_lookup+0x210 + genunix`lookuppnvp+0x1f6 + genunix`lookuppnatcred+0x15e + genunix`lookupnameatcred+0xad + genunix`lookupnameat+0x39 + genunix`vn_openat+0x315 + genunix`copen+0x20c + genunix`openat+0x2a + genunix`open+0x25 + unix`sys_syscall+0x17a + 1535 + + unix`do_splx+0x65 + genunix`disp_lock_exit+0x47 + genunix`post_syscall+0x318 + unix`0xfffffffffb800c91 + 1971 diff --git a/tools/FlameGraph/example-dtrace.svg b/tools/FlameGraph/example-dtrace.svg new file mode 100644 index 0000000..6702dc8 --- /dev/null +++ b/tools/FlameGraph/example-dtrace.svg @@ -0,0 +1,1842 @@ + + + + + + + + + + + + + +Flame Graph + +Reset Zoom +Search + +unix`mutex_enter (195 samples, 0.34%) + + + +genunix`as_fault (12 samples, 0.02%) + + + +genunix`disp_lock_exit (27 samples, 0.05%) + + + +genunix`vsd_free (17 samples, 0.03%) + + + +genunix`pn_fixslash (44 samples, 0.08%) + + + +unix`mutex_exit (105 samples, 0.18%) + + + +genunix`falloc (1,363 samples, 2.37%) +g.. + + +genunix`traverse (30 samples, 0.05%) + + + +genunix`fop_lookup (55 samples, 0.10%) + + + +genunix`kmem_cache_free (29 samples, 0.05%) + + + +lofs`makelonode (39 samples, 0.07%) + + + +genunix`vsd_free (155 samples, 0.27%) + + + +unix`strlen (2,659 samples, 4.63%) +unix`.. + + +unix`clear_int_flag (180 samples, 0.31%) + + + +unix`mutex_exit (38 samples, 0.07%) + + + +genunix`kmem_cpu_reload (5 samples, 0.01%) + + + +unix`mutex_exit (26 samples, 0.05%) + + + +genunix`vn_vfslocks_getlock (47 samples, 0.08%) + + + +unix`bzero (8 samples, 0.01%) + + + +genunix`vn_exists (50 samples, 0.09%) + + + +unix`mutex_enter (727 samples, 1.27%) + + + +genunix`kmem_cache_alloc (179 samples, 0.31%) + + + +unix`mutex_enter (905 samples, 1.58%) + + + +genunix`ufalloc (10 samples, 0.02%) + + + +genunix`vn_rele (25 samples, 0.04%) + + + +genunix`vn_exists (17 samples, 0.03%) + + + +unix`lock_try (778 samples, 1.35%) + + + +genunix`rwst_enter_common (314 samples, 0.55%) + + + +genunix`fsop_root (62 samples, 0.11%) + + + +lofs`table_lock_enter (44 samples, 0.08%) + + + +unix`mutex_exit (138 samples, 0.24%) + + + +unix`mutex_enter (316 samples, 0.55%) + + + +genunix`kmem_cache_free (5 samples, 0.01%) + + + +unix`preempt (14 samples, 0.02%) + + + +genunix`vn_alloc (1,189 samples, 2.07%) +g.. + + +genunix`kmem_cache_alloc (126 samples, 0.22%) + + + +genunix`vfs_getops (157 samples, 0.27%) + + + +lofs`lsave (27 samples, 0.05%) + + + +unix`tsc_read (160 samples, 0.28%) + + + +lofs`lfind (26 samples, 0.05%) + + + +unix`atomic_add_64 (205 samples, 0.36%) + + + +unix`mutex_enter (320 samples, 0.56%) + + + +genunix`traverse (17 samples, 0.03%) + + + +unix`mutex_enter (197 samples, 0.34%) + + + +genunix`vn_mountedvfs (20 samples, 0.03%) + + + +genunix`audit_unfalloc (340 samples, 0.59%) + + + +genunix`kmem_cache_free (209 samples, 0.36%) + + + +genunix`kmem_zalloc (13 samples, 0.02%) + + + +genunix`thread_lock (33 samples, 0.06%) + + + +unix`tsc_read (186 samples, 0.32%) + + + +genunix`vn_vfsrlock (12 samples, 0.02%) + + + +lofs`lo_inactive (21 samples, 0.04%) + + + +genunix`rwst_destroy (20 samples, 0.03%) + + + +unix`mutex_enter (379 samples, 0.66%) + + + +genunix`vn_setops (41 samples, 0.07%) + + + +genunix`vn_recycle (33 samples, 0.06%) + + + +lofs`lo_inactive (6,307 samples, 10.98%) +lofs`lo_inactive + + +lofs`table_lock_enter (220 samples, 0.38%) + + + +genunix`cv_broadcast (25 samples, 0.04%) + + + +unix`mutex_exit (358 samples, 0.62%) + + + +genunix`kmem_cache_alloc (234 samples, 0.41%) + + + +unix`rw_enter (525 samples, 0.91%) + + + +unix`membar_consumer (237 samples, 0.41%) + + + +unix`swtch (5 samples, 0.01%) + + + +genunix`rwst_enter_common (32 samples, 0.06%) + + + +lofs`freelonode (5,313 samples, 9.25%) +lofs`freelonode + + +genunix`vn_openat (46,342 samples, 80.68%) +genunix`vn_openat + + +genunix`vn_rele (19 samples, 0.03%) + + + +genunix`proc_exit (5 samples, 0.01%) + + + +unix`mutex_exit (512 samples, 0.89%) + + + +genunix`kmem_free (35 samples, 0.06%) + + + +unix`mutex_enter (252 samples, 0.44%) + + + +genunix`rwst_exit (12 samples, 0.02%) + + + +genunix`crgetuid (22 samples, 0.04%) + + + +genunix`kmem_free (17 samples, 0.03%) + + + +unix`mutex_init (53 samples, 0.09%) + + + +ufs`ufs_iaccess (648 samples, 1.13%) + + + +all (57,441 samples, 100%) + + + +genunix`fop_inactive (6,689 samples, 11.64%) +genunix`fop_inact.. + + +genunix`kmem_cache_alloc (9 samples, 0.02%) + + + +genunix`kmem_cache_free (184 samples, 0.32%) + + + +genunix`pn_get_buf (13 samples, 0.02%) + + + +unix`strlen (107 samples, 0.19%) + + + +unix`mutex_exit (46 samples, 0.08%) + + + +genunix`post_syscall (12 samples, 0.02%) + + + +unix`mutex_init (38 samples, 0.07%) + + + +unix`rw_exit (439 samples, 0.76%) + + + +lofs`lo_lookup (65 samples, 0.11%) + + + +genunix`clear_stale_fd (44 samples, 0.08%) + + + +unix`mutex_enter (238 samples, 0.41%) + + + +genunix`pn_get_buf (687 samples, 1.20%) + + + +genunix`vn_free (1,663 samples, 2.90%) +ge.. + + +unix`mutex_enter (980 samples, 1.71%) + + + +genunix`crhold (5 samples, 0.01%) + + + +unix`mutex_exit (59 samples, 0.10%) + + + +genunix`vn_reinit (48 samples, 0.08%) + + + +genunix`vfs_getops (21 samples, 0.04%) + + + +genunix`open (49,669 samples, 86.47%) +genunix`open + + +genunix`kmem_cache_alloc (39 samples, 0.07%) + + + +genunix`vn_vfslocks_getlock (79 samples, 0.14%) + + + +unix`clear_int_flag (39 samples, 0.07%) + + + +genunix`kmem_cache_free (215 samples, 0.37%) + + + +unix`mutex_destroy (53 samples, 0.09%) + + + +genunix`vn_vfsunlock (3,578 samples, 6.23%) +genunix`.. + + +genunix`dnlc_lookup (1,843 samples, 3.21%) +gen.. + + +genunix`lookupnameatcred (45,978 samples, 80.04%) +genunix`lookupnameatcred + + +genunix`crgetmapped (41 samples, 0.07%) + + + +genunix`anon_zero (7 samples, 0.01%) + + + +genunix`rwst_tryenter (628 samples, 1.09%) + + + +unix`mutex_enter (309 samples, 0.54%) + + + +genunix`vn_rele (14 samples, 0.02%) + + + +genunix`vn_setpath (1,969 samples, 3.43%) +gen.. + + +unix`mutex_enter (111 samples, 0.19%) + + + +genunix`cv_broadcast (40 samples, 0.07%) + + + +genunix`kmem_cache_alloc (66 samples, 0.11%) + + + +genunix`audit_getstate (21 samples, 0.04%) + + + +genunix`vn_setpath (58 samples, 0.10%) + + + +genunix`open (17 samples, 0.03%) + + + +unix`bcopy (896 samples, 1.56%) + + + +unix`mutex_enter (99 samples, 0.17%) + + + +genunix`traverse (5,557 samples, 9.67%) +genunix`traverse + + +genunix`pn_getcomponent (41 samples, 0.07%) + + + +unix`mutex_enter (640 samples, 1.11%) + + + +unix`mutex_destroy (176 samples, 0.31%) + + + +unix`lwp_getdatamodel (6 samples, 0.01%) + + + +genunix`unfalloc (39 samples, 0.07%) + + + +genunix`syscall_mstate (355 samples, 0.62%) + + + +genunix`cv_init (65 samples, 0.11%) + + + +unix`mutex_enter (95 samples, 0.17%) + + + +unix`bcmp (42 samples, 0.07%) + + + +unix`mutex_exit (350 samples, 0.61%) + + + +genunix`kmem_free (288 samples, 0.50%) + + + +unix`mutex_exit (58 samples, 0.10%) + + + +genunix`kmem_alloc (32 samples, 0.06%) + + + +unix`mutex_exit (356 samples, 0.62%) + + + +unix`mutex_init (46 samples, 0.08%) + + + +genunix`rwst_init (173 samples, 0.30%) + + + +genunix`rwst_enter_common (28 samples, 0.05%) + + + +genunix`openat (49,647 samples, 86.43%) +genunix`openat + + +unix`mutex_enter (303 samples, 0.53%) + + + +lofs`lfind (278 samples, 0.48%) + + + +unix`mutex_exit (90 samples, 0.16%) + + + +genunix`cv_init (49 samples, 0.09%) + + + +unix`tsc_gethrtimeunscaled (43 samples, 0.07%) + + + +genunix`rwst_tryenter (32 samples, 0.06%) + + + +genunix`pn_fixslash (14 samples, 0.02%) + + + +genunix`gethrtime_unscaled (420 samples, 0.73%) + + + +genunix`post_syscall (4,245 samples, 7.39%) +genunix`po.. + + +genunix`kmem_zalloc (280 samples, 0.49%) + + + +genunix`vn_alloc (20 samples, 0.03%) + + + +genunix`vn_mountedvfs (43 samples, 0.07%) + + + +genunix`audit_getstate (15 samples, 0.03%) + + + +zfs`zfs_lookup (22 samples, 0.04%) + + + +genunix`crgetuid (6 samples, 0.01%) + + + +unix`copystr (598 samples, 1.04%) + + + +unix`i_ddi_splhigh (23 samples, 0.04%) + + + +unix`trap (13 samples, 0.02%) + + + +genunix`audit_getstate (27 samples, 0.05%) + + + +genunix`vn_mountedvfs (56 samples, 0.10%) + + + +unix`mutex_destroy (17 samples, 0.03%) + + + +genunix`cv_broadcast (14 samples, 0.02%) + + + +genunix`segvn_fault (11 samples, 0.02%) + + + +genunix`vn_rele (39 samples, 0.07%) + + + +genunix`kmem_free (457 samples, 0.80%) + + + +genunix`vn_vfsunlock (20 samples, 0.03%) + + + +genunix`vn_vfslocks_rele (34 samples, 0.06%) + + + +unix`atomic_cas_64 (318 samples, 0.55%) + + + +unix`mutex_enter (337 samples, 0.59%) + + + +unix`do_splx (31 samples, 0.05%) + + + +genunix`ufalloc_file (20 samples, 0.03%) + + + +genunix`fd_reserve (35 samples, 0.06%) + + + +genunix`copen (49,444 samples, 86.08%) +genunix`copen + + +unix`mutex_enter (279 samples, 0.49%) + + + +unix`0xfffffffffb800c91 (4,361 samples, 7.59%) +unix`0xfff.. + + +genunix`crgetmapped (55 samples, 0.10%) + + + +genunix`cv_init (56 samples, 0.10%) + + + +genunix`dnlc_lookup (26 samples, 0.05%) + + + +genunix`kmem_alloc (11 samples, 0.02%) + + + +genunix`cv_init (53 samples, 0.09%) + + + +unix`copyinstr (25 samples, 0.04%) + + + +genunix`gethrtime_unscaled (203 samples, 0.35%) + + + +genunix`kmem_cache_alloc (11 samples, 0.02%) + + + +genunix`vn_free (26 samples, 0.05%) + + + +unix`mutex_exit (149 samples, 0.26%) + + + +genunix`vn_recycle (319 samples, 0.56%) + + + +genunix`vn_rele (64 samples, 0.11%) + + + +unix`bcmp (11 samples, 0.02%) + + + +genunix`kmem_cache_free (154 samples, 0.27%) + + + +unix`lock_clear_splx (28 samples, 0.05%) + + + +genunix`unfalloc (729 samples, 1.27%) + + + +genunix`fop_lookup (85 samples, 0.15%) + + + +zfs`specvp_check (10 samples, 0.02%) + + + +genunix`lookupnameatcred (22 samples, 0.04%) + + + +unix`tsc_read (367 samples, 0.64%) + + + +genunix`memcmp (38 samples, 0.07%) + + + +unix`splx (6 samples, 0.01%) + + + +unix`mutex_exit (95 samples, 0.17%) + + + +genunix`gethrtime_unscaled (7 samples, 0.01%) + + + +genunix`rwst_init (13 samples, 0.02%) + + + +genunix`audit_getstate (31 samples, 0.05%) + + + +genunix`kmem_cache_alloc (32 samples, 0.06%) + + + +genunix`disp_lock_exit (2,096 samples, 3.65%) +genu.. + + +unix`mutex_exit (49 samples, 0.09%) + + + +unix`copyinstr (18 samples, 0.03%) + + + +ufs`ufs_lookup (46 samples, 0.08%) + + + +genunix`clear_stale_fd (10 samples, 0.02%) + + + +genunix`rwst_destroy (296 samples, 0.52%) + + + +genunix`syscall_mstate (1,336 samples, 2.33%) +g.. + + +genunix`kmem_alloc (934 samples, 1.63%) + + + +unix`atomic_add_32 (325 samples, 0.57%) + + + +unix`mutex_enter (947 samples, 1.65%) + + + +unix`mutex_exit (56 samples, 0.10%) + + + +unix`mutex_enter (318 samples, 0.55%) + + + +lofs`lo_root (80 samples, 0.14%) + + + +genunix`lookuppnvp (44,242 samples, 77.02%) +genunix`lookuppnvp + + +genunix`lookupnameat (46,075 samples, 80.21%) +genunix`lookupnameat + + +unix`setbackdq (5 samples, 0.01%) + + + +lofs`lo_root (31 samples, 0.05%) + + + +genunix`kmem_cache_alloc (17 samples, 0.03%) + + + +unix`mutex_exit (212 samples, 0.37%) + + + +genunix`vn_vfsrlock (2,414 samples, 4.20%) +genun.. + + +genunix`vfs_matchops (28 samples, 0.05%) + + + +unix`prunstop (36 samples, 0.06%) + + + +unix`mutex_exit (155 samples, 0.27%) + + + +unix`mutex_init (31 samples, 0.05%) + + + +unix`atomic_add_32_nv (100 samples, 0.17%) + + + +genunix`lookupnameat (69 samples, 0.12%) + + + +unix`_sys_rtt (6 samples, 0.01%) + + + +genunix`kmem_cache_alloc (49 samples, 0.09%) + + + +unix`tsc_gethrtimeunscaled (17 samples, 0.03%) + + + +genunix`fop_lookup (29,216 samples, 50.86%) +genunix`fop_lookup + + +unix`mutex_exit (142 samples, 0.25%) + + + +genunix`crgetmapped (31 samples, 0.05%) + + + +unix`do_splx (1,993 samples, 3.47%) +uni.. + + +genunix`kmem_cache_free (22 samples, 0.04%) + + + +unix`mutex_enter (95 samples, 0.17%) + + + +genunix`crhold (11 samples, 0.02%) + + + +unix`mutex_enter (823 samples, 1.43%) + + + +unix`mutex_exit (29 samples, 0.05%) + + + +genunix`vn_vfsrlock (3,342 samples, 5.82%) +genunix.. + + +unix`tsc_gethrtimeunscaled (13 samples, 0.02%) + + + +genunix`vn_rele (73 samples, 0.13%) + + + +unix`mutex_exit (337 samples, 0.59%) + + + +genunix`vn_vfslocks_getlock (973 samples, 1.69%) + + + +zfs`specvp_check (20 samples, 0.03%) + + + +genunix`vsd_free (14 samples, 0.02%) + + + +unix`mutex_enter (314 samples, 0.55%) + + + +genunix`cv_destroy (81 samples, 0.14%) + + + +genunix`cv_broadcast (25 samples, 0.04%) + + + +unix`mutex_enter (122 samples, 0.21%) + + + +unix`mutex_exit (55 samples, 0.10%) + + + +genunix`set_errno (24 samples, 0.04%) + + + +genunix`cv_destroy (42 samples, 0.07%) + + + +genunix`fd_find (13 samples, 0.02%) + + + +genunix`vn_invalid (47 samples, 0.08%) + + + +genunix`vfs_matchops (336 samples, 0.58%) + + + +unix`tsc_gethrtimeunscaled (59 samples, 0.10%) + + + +genunix`fop_inactive (39 samples, 0.07%) + + + +genunix`kmem_free (693 samples, 1.21%) + + + +genunix`syscall_mstate (412 samples, 0.72%) + + + +genunix`thread_lock (670 samples, 1.17%) + + + +lofs`lsave (162 samples, 0.28%) + + + +unix`atomic_add_64 (95 samples, 0.17%) + + + +genunix`audit_getstate (66 samples, 0.11%) + + + +genunix`dnlc_lookup (70 samples, 0.12%) + + + +genunix`vn_mountedvfs (30 samples, 0.05%) + + + +genunix`cv_broadcast (19 samples, 0.03%) + + + +genunix`kmem_alloc (533 samples, 0.93%) + + + +unix`mutex_exit (160 samples, 0.28%) + + + +genunix`memcmp (38 samples, 0.07%) + + + +unix`strlen (1,238 samples, 2.16%) +u.. + + +genunix`lookuppnatcred (12 samples, 0.02%) + + + +genunix`crfree (13 samples, 0.02%) + + + +lofs`table_lock_enter (43 samples, 0.07%) + + + +genunix`rwst_exit (18 samples, 0.03%) + + + +genunix`cv_destroy (31 samples, 0.05%) + + + +genunix`rwst_init (236 samples, 0.41%) + + + +genunix`vn_vfslocks_rele (1,420 samples, 2.47%) +ge.. + + +genunix`falloc (36 samples, 0.06%) + + + +genunix`setf (187 samples, 0.33%) + + + +zfs`zfs_fastaccesschk_execute (50 samples, 0.09%) + + + +genunix`vn_vfslocks_getlock (120 samples, 0.21%) + + + +genunix`fd_reserve (9 samples, 0.02%) + + + +genunix`vn_setops (160 samples, 0.28%) + + + +unix`sys_syscall (51,908 samples, 90.37%) +unix`sys_syscall + + +genunix`kmem_free (115 samples, 0.20%) + + + +genunix`vsd_free (48 samples, 0.08%) + + + +genunix`rexit (5 samples, 0.01%) + + + +genunix`vn_mountedvfs (11 samples, 0.02%) + + + +genunix`lookuppnatcred (44,681 samples, 77.79%) +genunix`lookuppnatcred + + +unix`splr (92 samples, 0.16%) + + + +genunix`vn_vfsrlock (13 samples, 0.02%) + + + +unix`mutex_exit (371 samples, 0.65%) + + + +genunix`kmem_cache_free (5 samples, 0.01%) + + + +genunix`dnlc_lookup (263 samples, 0.46%) + + + +genunix`audit_unfalloc (32 samples, 0.06%) + + + +unix`0xfffffffffb8001d6 (13 samples, 0.02%) + + + +genunix`rwst_destroy (146 samples, 0.25%) + + + +genunix`gethrtime_unscaled (182 samples, 0.32%) + + + +unix`mutex_enter (575 samples, 1.00%) + + + +unix`mutex_exit (148 samples, 0.26%) + + + +genunix`ufalloc_file (294 samples, 0.51%) + + + +unix`mutex_exit (163 samples, 0.28%) + + + +unix`membar_consumer (106 samples, 0.18%) + + + +genunix`crgetmapped (36 samples, 0.06%) + + + +genunix`memcmp (277 samples, 0.48%) + + + +genunix`cv_destroy (77 samples, 0.13%) + + + +genunix`kmem_cache_free (116 samples, 0.20%) + + + +genunix`kmem_cache_alloc (29 samples, 0.05%) + + + +genunix`fd_reserve (8 samples, 0.01%) + + + +zfs`zfs_lookup (946 samples, 1.65%) + + + +genunix`kmem_alloc (795 samples, 1.38%) + + + +unix`tsc_gethrtimeunscaled (11 samples, 0.02%) + + + +genunix`segvn_faultpage (7 samples, 0.01%) + + + +genunix`set_errno (9 samples, 0.02%) + + + +unix`splr (400 samples, 0.70%) + + + +genunix`rwst_destroy (32 samples, 0.06%) + + + +genunix`rwst_init (28 samples, 0.05%) + + + +unix`atomic_add_32 (292 samples, 0.51%) + + + +unix`0xfffffffffb800ca0 (517 samples, 0.90%) + + + +genunix`syscall_mstate (89 samples, 0.15%) + + + +genunix`kmem_alloc (73 samples, 0.13%) + + + +genunix`vn_vfsunlock (40 samples, 0.07%) + + + +unix`mutex_enter (1,202 samples, 2.09%) +u.. + + +lofs`makelfsnode (28 samples, 0.05%) + + + +unix`0xfffffffffb800c86 (472 samples, 0.82%) + + + +genunix`vn_rele (6,943 samples, 12.09%) +genunix`vn_rele + + +unix`mutex_exit (56 samples, 0.10%) + + + +genunix`kmem_cache_free (51 samples, 0.09%) + + + +genunix`gethrtime_unscaled (11 samples, 0.02%) + + + +unix`pagefault (13 samples, 0.02%) + + + +genunix`secpolicy_vnode_access2 (217 samples, 0.38%) + + + +genunix`vn_vfslocks_getlock (1,357 samples, 2.36%) +g.. + + +unix`bcmp (295 samples, 0.51%) + + + +unix`mutex_enter (97 samples, 0.17%) + + + +unix`membar_consumer (123 samples, 0.21%) + + + +genunix`audit_getstate (16 samples, 0.03%) + + + +unix`mutex_enter (455 samples, 0.79%) + + + +lofs`makelonode (4,212 samples, 7.33%) +lofs`makel.. + + +genunix`kmem_cache_alloc (168 samples, 0.29%) + + + +genunix`vn_vfslocks_getlock (62 samples, 0.11%) + + + +genunix`secpolicy_vnode_access2 (72 samples, 0.13%) + + + +genunix`kmem_cache_free (73 samples, 0.13%) + + + +genunix`vn_reinit (424 samples, 0.74%) + + + +genunix`pn_getcomponent (454 samples, 0.79%) + + + +genunix`fsop_root (297 samples, 0.52%) + + + +genunix`crgetuid (30 samples, 0.05%) + + + +genunix`kmem_free (785 samples, 1.37%) + + + +unix`mutex_exit (171 samples, 0.30%) + + + +genunix`crgetmapped (58 samples, 0.10%) + + + +unix`mutex_enter (299 samples, 0.52%) + + + +genunix`rwst_exit (167 samples, 0.29%) + + + +genunix`audit_falloc (8 samples, 0.01%) + + + +genunix`rwst_exit (110 samples, 0.19%) + + + +genunix`exit (5 samples, 0.01%) + + + +unix`mutex_exit (250 samples, 0.44%) + + + +lofs`freelonode (35 samples, 0.06%) + + + +genunix`rwst_tryenter (37 samples, 0.06%) + + + +ufs`ufs_iaccess (91 samples, 0.16%) + + + +unix`tsc_gethrtimeunscaled (12 samples, 0.02%) + + + +genunix`kmem_cache_alloc (241 samples, 0.42%) + + + +FSS`fss_preempt (8 samples, 0.01%) + + + +genunix`fd_reserve (15 samples, 0.03%) + + + +genunix`cv_broadcast (16 samples, 0.03%) + + + +genunix`crgetmapped (57 samples, 0.10%) + + + +unix`mutex_exit (379 samples, 0.66%) + + + +unix`mutex_destroy (31 samples, 0.05%) + + + +lofs`table_lock_enter (189 samples, 0.33%) + + + +genunix`rwst_enter_common (264 samples, 0.46%) + + + +genunix`kmem_free (11 samples, 0.02%) + + + +unix`atomic_add_32 (134 samples, 0.23%) + + + +genunix`ufalloc (551 samples, 0.96%) + + + +genunix`audit_falloc (313 samples, 0.54%) + + + +lofs`lo_lookup (19,887 samples, 34.62%) +lofs`lo_lookup + + +unix`atomic_add_64 (110 samples, 0.19%) + + + +genunix`vn_vfsunlock (2,372 samples, 4.13%) +genu.. + + +genunix`openat (17 samples, 0.03%) + + + +unix`bcmp (45 samples, 0.08%) + + + +genunix`audit_getstate (62 samples, 0.11%) + + + +genunix`crfree (9 samples, 0.02%) + + + +genunix`kmem_cache_free (18 samples, 0.03%) + + + +genunix`vn_vfslocks_rele (903 samples, 1.57%) + + + +genunix`vn_invalid (20 samples, 0.03%) + + + +genunix`vn_vfslocks_rele (50 samples, 0.09%) + + + +genunix`lookuppnvp (10 samples, 0.02%) + + + +genunix`fd_find (161 samples, 0.28%) + + + +ufs`ufs_lookup (5,399 samples, 9.40%) +ufs`ufs_lookup + + +unix`0xfffffffffb800c7c (42 samples, 0.07%) + + + +genunix`vn_openat (14 samples, 0.02%) + + + +genunix`setf (16 samples, 0.03%) + + + +genunix`traverse (7,243 samples, 12.61%) +genunix`traverse + + +genunix`rwst_tryenter (734 samples, 1.28%) + + + +unix`mutex_enter (366 samples, 0.64%) + + + +genunix`fop_lookup (6,470 samples, 11.26%) +genunix`fop_lookup + + +unix`mutex_exit (135 samples, 0.24%) + + + +lofs`makelfsnode (82 samples, 0.14%) + + + +genunix`copen (7 samples, 0.01%) + + + diff --git a/tools/FlameGraph/example-perf-stacks.txt.gz b/tools/FlameGraph/example-perf-stacks.txt.gz new file mode 100644 index 0000000..e7b762b Binary files /dev/null and b/tools/FlameGraph/example-perf-stacks.txt.gz differ diff --git a/tools/FlameGraph/example-perf.svg b/tools/FlameGraph/example-perf.svg new file mode 100644 index 0000000..d4896fc --- /dev/null +++ b/tools/FlameGraph/example-perf.svg @@ -0,0 +1,4895 @@ + + + + + + + + + + + + + +Flame Graph + +Reset Zoom +Search + + +rw_verify_area (9 samples, 0.68%) + + + +_raw_spin_lock_irqsave (2 samples, 0.15%) + + + +sun/nio/ch/FileDispatcherImpl:.read0 (31 samples, 2.36%) +s.. + + +do_sync_read (22 samples, 1.67%) + + + +sun/nio/ch/SocketChannelImpl:.write (209 samples, 15.89%) +sun/nio/ch/SocketChannel.. + + +timerqueue_del (1 samples, 0.08%) + + + +io/netty/channel/AdaptiveRecvByteBufAllocator$HandleImpl:.record (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptRuntime:.setObjectProp (86 samples, 6.54%) +org/mozi.. + + +read_tsc (1 samples, 0.08%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (14 samples, 1.06%) + + + +org/mozilla/javascript/ScriptableObject:.putImpl (45 samples, 3.42%) +org.. + + +netdev_pick_tx (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.write (33 samples, 2.51%) +io.. + + +java/lang/String:.equals (1 samples, 0.08%) + + + +system_call_fastpath (7 samples, 0.53%) + + + +GCTaskManager::get_task (1 samples, 0.08%) + + + +security_file_free (1 samples, 0.08%) + + + +apparmor_socket_recvmsg (5 samples, 0.38%) + + + +itable stub (1 samples, 0.08%) + + + +skb_release_data (3 samples, 0.23%) + + + +hrtimer_try_to_cancel (3 samples, 0.23%) + + + +default_wake_function (25 samples, 1.90%) +d.. + + +__remove_hrtimer (3 samples, 0.23%) + + + +epoll_ctl (1 samples, 0.08%) + + + +fsnotify (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.nameOrFunction (4 samples, 0.30%) + + + +tcp_clean_rtx_queue (1 samples, 0.08%) + + + +tcp_send_delayed_ack (5 samples, 0.38%) + + + +org/mozilla/javascript/ScriptRuntime:.nameOrFunction (1 samples, 0.08%) + + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +tcp_v4_rcv (87 samples, 6.62%) +tcp_v4_rcv + + +aeProcessEvents (1 samples, 0.08%) + + + +org/mozilla/javascript/NativeJavaObject:.initMembers (1 samples, 0.08%) + + + +schedule_preempt_disabled (2 samples, 0.15%) + + + +kfree (1 samples, 0.08%) + + + +sun/nio/ch/SocketChannelImpl:.write (1 samples, 0.08%) + + + +sk_reset_timer (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.putImpl (6 samples, 0.46%) + + + +remote_function (4 samples, 0.30%) + + + +io/netty/handler/codec/http/HttpObjectDecoder:.skipControlCharacters (1 samples, 0.08%) + + + +intel_pmu_enable_all (4 samples, 0.30%) + + + +mod_timer (5 samples, 0.38%) + + + +io/netty/handler/codec/MessageToMessageEncoder:.write (31 samples, 2.36%) +i.. + + +io/netty/buffer/UnpooledHeapByteBuf:.init (1 samples, 0.08%) + + + +intel_pmu_enable_all (4 samples, 0.30%) + + + +io/netty/channel/AbstractChannelHandlerContext:.write (2 samples, 0.15%) + + + +enqueue_hrtimer (1 samples, 0.08%) + + + +itable stub (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject$Slot:.setAttributes (12 samples, 0.91%) + + + +cpuidle_idle_call (6 samples, 0.46%) + + + +system_call (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.get (2 samples, 0.15%) + + + +[unknown] (6 samples, 0.46%) + + + +Monitor::IWait (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.bind (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (40 samples, 3.04%) +org.. + + +__wake_up_sync_key (3 samples, 0.23%) + + + +system_call_fastpath (1 samples, 0.08%) + + + +vfs_write (85 samples, 6.46%) +vfs_write + + +mod_timer (2 samples, 0.15%) + + + +rcu_sysidle_enter (1 samples, 0.08%) + + + +oopDesc* PSPromotionManager::copy_to_survivor_spacefalse (1 samples, 0.08%) + + + +__wake_up_common (2 samples, 0.15%) + + + +io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead (637 samples, 48.44%) +io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead + + +_raw_spin_lock_irqsave (2 samples, 0.15%) + + + +ScavengeRootsTask::do_it (1 samples, 0.08%) + + + +tcp_urg (1 samples, 0.08%) + + + +aa_file_perm (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.setObjectProp (21 samples, 1.60%) + + + +__remove_hrtimer (1 samples, 0.08%) + + + +put_filp (1 samples, 0.08%) + + + +skb_free_head (1 samples, 0.08%) + + + +apparmor_file_permission (1 samples, 0.08%) + + + +ktime_get (1 samples, 0.08%) + + + +JavaCalls::call_virtual (956 samples, 72.70%) +JavaCalls::call_virtual + + +__copy_skb_header (1 samples, 0.08%) + + + +__slab_alloc (1 samples, 0.08%) + + + +cpuidle_idle_call (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.has (30 samples, 2.28%) +o.. + + +ip_queue_xmit (51 samples, 3.88%) +ip_q.. + + +org/mozilla/javascript/NativeCall:.init (15 samples, 1.14%) + + + +tcp_ack (9 samples, 0.68%) + + + +sys_ioctl (5 samples, 0.38%) + + + +fsnotify (2 samples, 0.15%) + + + +sk_reset_timer (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.08%) + + + +lapic_next_deadline (2 samples, 0.15%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_Server2_js_1:.call (79 samples, 6.01%) +org/mozi.. + + +sys_execve (1 samples, 0.08%) + + + +perf_event_enable (5 samples, 0.38%) + + + +sys_futex (1 samples, 0.08%) + + + +java/lang/String:.init (1 samples, 0.08%) + + + +inet_recvmsg (7 samples, 0.53%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (2 samples, 0.15%) + + + +io/netty/util/internal/AppendableCharSequence:.substring (4 samples, 0.30%) + + + +_raw_spin_lock_irqsave (1 samples, 0.08%) + + + +x86_pmu_enable (4 samples, 0.30%) + + + +__libc_read (1 samples, 0.08%) + + + +tcp_sendmsg (77 samples, 5.86%) +tcp_sen.. + + +cpuidle_enter_state (12 samples, 0.91%) + + + +flush_tlb_mm_range (1 samples, 0.08%) + + + +ksize (1 samples, 0.08%) + + + +cpu_startup_entry (44 samples, 3.35%) +cpu.. + + +pthread_self (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +_raw_spin_lock_bh (1 samples, 0.08%) + + + +io/netty/channel/DefaultChannelPipeline$HeadContext:.flush (2 samples, 0.15%) + + + +tcp_rcv_established (23 samples, 1.75%) + + + +org/mozilla/javascript/BaseFunction:.execIdCall (48 samples, 3.65%) +org/.. + + +lapic_next_deadline (1 samples, 0.08%) + + + +[unknown] (197 samples, 14.98%) +[unknown] + + +io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete (242 samples, 18.40%) +io/netty/channel/AbstractCha.. + + +bictcp_cong_avoid (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.nameOrFunction (5 samples, 0.38%) + + + +JavaCalls::call_virtual (956 samples, 72.70%) +JavaCalls::call_virtual + + +resched_task (2 samples, 0.15%) + + + +sock_wfree (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (4 samples, 0.30%) + + + +io/netty/buffer/AbstractByteBuf:.getByte (1 samples, 0.08%) + + + +check_preempt_curr (2 samples, 0.15%) + + + +io/netty/channel/ChannelOutboundBuffer:.progress (1 samples, 0.08%) + + + +tcp_current_mss (1 samples, 0.08%) + + + +__execve (1 samples, 0.08%) + + + +hrtimer_force_reprogram (1 samples, 0.08%) + + + +__GI___mprotect (1 samples, 0.08%) + + + +ep_send_events_proc (9 samples, 0.68%) + + + +schedule (11 samples, 0.84%) + + + +org/mozilla/javascript/IdScriptableObject:.put (3 samples, 0.23%) + + + +org/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.08%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (409 samples, 31.10%) +org/mozilla/javascript/gen/file__root_vert_x_2_1_.. + + +io/netty/channel/ChannelOutboundBuffer:.decrementPendingOutboundBytes (2 samples, 0.15%) + + + +ktime_get_real (1 samples, 0.08%) + + + +aa_revalidate_sk (2 samples, 0.15%) + + + +stats_record (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +__perf_event_enable (4 samples, 0.30%) + + + +__alloc_skb (9 samples, 0.68%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (17 samples, 1.29%) + + + +socket_readable (2 samples, 0.15%) + + + +ns_to_timeval (1 samples, 0.08%) + + + +ip_rcv (33 samples, 2.51%) +ip.. + + +SafepointSynchronize::begin (1 samples, 0.08%) + + + +java/nio/DirectByteBuffer:.duplicate (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.15%) + + + +org/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.08%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (20 samples, 1.52%) + + + +io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read (939 samples, 71.41%) +io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read + + +raw_local_deliver (1 samples, 0.08%) + + + +__dev_queue_xmit (4 samples, 0.30%) + + + +skb_copy_datagram_iovec (3 samples, 0.23%) + + + +apic_timer_interrupt (1 samples, 0.08%) + + + +do_vfs_ioctl (5 samples, 0.38%) + + + +do_sync_read (8 samples, 0.61%) + + + +system_call_after_swapgs (1 samples, 0.08%) + + + +_raw_spin_lock_irqsave (1 samples, 0.08%) + + + +call_function_single_interrupt (4 samples, 0.30%) + + + +io/netty/handler/codec/http/HttpHeaders:.hash (4 samples, 0.30%) + + + +io/netty/handler/codec/http/DefaultHttpMessage:.init (2 samples, 0.15%) + + + +rcu_sysidle_enter (1 samples, 0.08%) + + + +java/nio/channels/spi/AbstractInterruptibleChannel:.end (3 samples, 0.23%) + + + +clockevents_program_event (2 samples, 0.15%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (9 samples, 0.68%) + + + +tcp_try_rmem_schedule (2 samples, 0.15%) + + + +__schedule (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.putImpl (10 samples, 0.76%) + + + +tcp_v4_md5_lookup (1 samples, 0.08%) + + + +CardTableExtension::scavenge_contents_parallel (20 samples, 1.52%) + + + +aa_revalidate_sk (1 samples, 0.08%) + + + +__fsnotify_parent (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.get (7 samples, 0.53%) + + + +sk_reset_timer (5 samples, 0.38%) + + + +__schedule (2 samples, 0.15%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.init (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +io/netty/channel/nio/AbstractNioByteChannel:.doWrite (225 samples, 17.11%) +io/netty/channel/nio/Abstr.. + + +timerqueue_add (1 samples, 0.08%) + + + +_raw_spin_unlock_irqrestore (2 samples, 0.15%) + + + +try_to_wake_up (24 samples, 1.83%) +t.. + + +org/mozilla/javascript/IdScriptableObject:.setAttributes (4 samples, 0.30%) + + + +io/netty/handler/codec/http/HttpResponseEncoder:.acceptOutboundMessage (1 samples, 0.08%) + + + +rw_verify_area (2 samples, 0.15%) + + + +x86_pmu_commit_txn (4 samples, 0.30%) + + + +alloc_pages_current (1 samples, 0.08%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.setAttributes (7 samples, 0.53%) + + + +org/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.08%) + + + +tcp_transmit_skb (1 samples, 0.08%) + + + +sock_aio_read.part.8 (7 samples, 0.53%) + + + +sys_read (28 samples, 2.13%) +s.. + + +org/mozilla/javascript/ScriptRuntime:.setObjectProp (28 samples, 2.13%) +o.. + + +JavaCalls::call_helper (956 samples, 72.70%) +JavaCalls::call_helper + + +ttwu_do_wakeup (1 samples, 0.08%) + + + +generic_smp_call_function_single_interrupt (4 samples, 0.30%) + + + +mutex_unlock (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpHeaders:.hash (2 samples, 0.15%) + + + +http_parser_execute (1 samples, 0.08%) + + + +mod_timer (5 samples, 0.38%) + + + +system_call_fastpath (1 samples, 0.08%) + + + +tcp_recvmsg (13 samples, 0.99%) + + + +__slab_alloc (1 samples, 0.08%) + + + +__alloc_skb (7 samples, 0.53%) + + + +clockevents_program_event (1 samples, 0.08%) + + + +vfs_read (18 samples, 1.37%) + + + +__internal_add_timer (1 samples, 0.08%) + + + +epoll_wait (1 samples, 0.08%) + + + +lock_sock_nested (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +native_write_msr_safe (4 samples, 0.30%) + + + +Interpreter (956 samples, 72.70%) +Interpreter + + +org/mozilla/javascript/ScriptableObject:.getBase (4 samples, 0.30%) + + + +dev_hard_start_xmit (9 samples, 0.68%) + + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +ip_output (46 samples, 3.50%) +ip_.. + + +account_entity_enqueue (1 samples, 0.08%) + + + +itable stub (1 samples, 0.08%) + + + +ip_rcv (1 samples, 0.08%) + + + +io/netty/buffer/AbstractByteBuf:.writeBytes (5 samples, 0.38%) + + + +tcp_clean_rtx_queue (14 samples, 1.06%) + + + +io/netty/channel/AbstractChannelHandlerContext:.flush (1 samples, 0.08%) + + + +sys_read (21 samples, 1.60%) + + + +[unknown] (10 samples, 0.76%) + + + +java/util/concurrent/ConcurrentHashMap:.get (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannel:.hashCode (4 samples, 0.30%) + + + +rcu_idle_enter (1 samples, 0.08%) + + + +gettimeofday@plt (1 samples, 0.08%) + + + +__do_softirq (103 samples, 7.83%) +__do_softirq + + +org/mozilla/javascript/ScriptRuntime:.nameOrFunction (8 samples, 0.61%) + + + +io/netty/buffer/AbstractByteBuf:.writeBytes (3 samples, 0.23%) + + + +inotify_add_watch (1 samples, 0.08%) + + + +fdval (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpHeaders:.encode (7 samples, 0.53%) + + + +unsafe_arraycopy (1 samples, 0.08%) + + + +sk_stream_alloc_skb (10 samples, 0.76%) + + + +lock_timer_base.isra.35 (1 samples, 0.08%) + + + +ip_local_out (121 samples, 9.20%) +ip_local_out + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +io/netty/util/internal/AppendableCharSequence:.substring (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptRuntime:.bind (1 samples, 0.08%) + + + +ep_poll (53 samples, 4.03%) +ep_p.. + + +lock_hrtimer_base.isra.19 (1 samples, 0.08%) + + + +InstanceKlass::oop_push_contents (1 samples, 0.08%) + + + +cpuacct_charge (1 samples, 0.08%) + + + +harmonize_features.isra.92.part.93 (1 samples, 0.08%) + + + +update_rq_clock.part.63 (1 samples, 0.08%) + + + +native_write_msr_safe (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpObjectDecoder:.findNonWhitespace (1 samples, 0.08%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (1 samples, 0.08%) + + + +org/mozilla/javascript/BaseFunction:.construct (156 samples, 11.86%) +org/mozilla/javas.. + + +_raw_spin_lock (2 samples, 0.15%) + + + +cpu_function_call (5 samples, 0.38%) + + + +fget_light (2 samples, 0.15%) + + + +start_kernel (24 samples, 1.83%) +s.. + + +native_write_msr_safe (2 samples, 0.15%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (511 samples, 38.86%) +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io.. + + +ipv4_mtu (1 samples, 0.08%) + + + +__schedule (11 samples, 0.84%) + + + +system_call_fastpath (88 samples, 6.69%) +system_ca.. + + +io/netty/channel/nio/NioEventLoop:.select (7 samples, 0.53%) + + + +org/mozilla/javascript/IdScriptableObject:.get (3 samples, 0.23%) + + + +org/mozilla/javascript/TopLevel:.getBuiltinPrototype (7 samples, 0.53%) + + + +sun/nio/ch/IOUtil:.readIntoNativeBuffer (31 samples, 2.36%) +s.. + + +itable stub (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.write (6 samples, 0.46%) + + + +timerqueue_del (1 samples, 0.08%) + + + +__tcp_v4_send_check (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.nameOrFunction (3 samples, 0.23%) + + + +io/netty/buffer/AbstractByteBuf:.writeBytes (4 samples, 0.30%) + + + +org/mozilla/javascript/WrapFactory:.wrapAsJavaObject (1 samples, 0.08%) + + + +io/netty/handler/codec/http/DefaultHttpMessage:.init (2 samples, 0.15%) + + + +_raw_spin_lock_irqsave (2 samples, 0.15%) + + + +org/mozilla/javascript/IdScriptableObject:.put (7 samples, 0.53%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.add0 (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (8 samples, 0.61%) + + + +java/util/ArrayList:.ensureCapacityInternal (1 samples, 0.08%) + + + +__wake_up_locked (25 samples, 1.90%) +_.. + + +java/util/HashMap:.getNode (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.toObjectOrNull (1 samples, 0.08%) + + + +__tcp_push_pending_frames (1 samples, 0.08%) + + + +[unknown] (61 samples, 4.64%) +[unkn.. + + +__slab_free (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.put (11 samples, 0.84%) + + + +sock_def_readable (5 samples, 0.38%) + + + +gmain (1 samples, 0.08%) + + + +_raw_spin_lock_irqsave (1 samples, 0.08%) + + + +__kmalloc_reserve.isra.26 (3 samples, 0.23%) + + + +org/mozilla/javascript/ScriptableObject:.putImpl (5 samples, 0.38%) + + + +org/mozilla/javascript/NativeCall:.init (20 samples, 1.52%) + + + +org/mozilla/javascript/WrapFactory:.wrap (1 samples, 0.08%) + + + +_raw_spin_lock_bh (1 samples, 0.08%) + + + +aeProcessEvents (3 samples, 0.23%) + + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.08%) + + + +fget_light (2 samples, 0.15%) + + + +io/netty/buffer/PooledByteBufAllocator:.newDirectBuffer (2 samples, 0.15%) + + + +menu_select (1 samples, 0.08%) + + + +generic_smp_call_function_single_interrupt (4 samples, 0.30%) + + + +org/mozilla/javascript/TopLevel:.getBuiltinPrototype (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.setAttributes (1 samples, 0.08%) + + + +schedule_hrtimeout_range_clock (20 samples, 1.52%) + + + +io/netty/buffer/UnreleasableByteBuf:.duplicate (1 samples, 0.08%) + + + +tick_program_event (2 samples, 0.15%) + + + +__netif_receive_skb_core (33 samples, 2.51%) +__.. + + +java/util/HashMap:.getNode (1 samples, 0.08%) + + + +io/netty/buffer/AbstractByteBuf:.forEachByteAsc0 (2 samples, 0.15%) + + + +get_next_timer_interrupt (2 samples, 0.15%) + + + +vtable stub (1 samples, 0.08%) + + + +start_secondary (44 samples, 3.35%) +sta.. + + +skb_release_all (3 samples, 0.23%) + + + +update_cfs_rq_blocked_load (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.08%) + + + +call_function_single_interrupt (4 samples, 0.30%) + + + +sun/nio/ch/SocketChannelImpl:.read (40 samples, 3.04%) +sun.. + + +sys_epoll_wait (1 samples, 0.08%) + + + +tcp_check_space (1 samples, 0.08%) + + + +__wake_up_common (25 samples, 1.90%) +_.. + + +native_sched_clock (1 samples, 0.08%) + + + +fget_light (3 samples, 0.23%) + + + +sys_inotify_add_watch (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject$Slot:.getValue (1 samples, 0.08%) + + + +_raw_spin_lock (1 samples, 0.08%) + + + +smp_call_function_single_interrupt (4 samples, 0.30%) + + + +__kmalloc_node_track_caller (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue (1 samples, 0.08%) + + + +tcp_send_mss (6 samples, 0.46%) + + + +sched_clock (1 samples, 0.08%) + + + +kmem_cache_alloc_node (4 samples, 0.30%) + + + +_raw_spin_lock_irqsave (1 samples, 0.08%) + + + +tick_sched_handle.isra.17 (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getBase (1 samples, 0.08%) + + + +[unknown] (6 samples, 0.46%) + + + +io/netty/util/internal/AppendableCharSequence:.substring (2 samples, 0.15%) + + + +__inet_lookup_established (2 samples, 0.15%) + + + +apparmor_file_permission (1 samples, 0.08%) + + + +dst_release (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpObjectEncoder:.encode (1 samples, 0.08%) + + + +open_exec (1 samples, 0.08%) + + + +tcp_transmit_skb (132 samples, 10.04%) +tcp_transmit_skb + + +ttwu_do_wakeup (5 samples, 0.38%) + + + +idle_cpu (1 samples, 0.08%) + + + +__lll_unlock_wake (1 samples, 0.08%) + + + +[unknown] (7 samples, 0.53%) + + + +security_file_permission (2 samples, 0.15%) + + + +[unknown] (1 samples, 0.08%) + + + +__switch_to (1 samples, 0.08%) + + + +io/netty/channel/DefaultChannelPromise:.trySuccess (3 samples, 0.23%) + + + +org/mozilla/javascript/IdScriptableObject:.has (7 samples, 0.53%) + + + +native_write_msr_safe (3 samples, 0.23%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.add0 (2 samples, 0.15%) + + + +do_softirq (103 samples, 7.83%) +do_softirq + + +rw_verify_area (1 samples, 0.08%) + + + +tcp_poll (1 samples, 0.08%) + + + +tcp_rearm_rto (5 samples, 0.38%) + + + +io/netty/channel/AbstractChannelHandlerContext:.newPromise (1 samples, 0.08%) + + + +tick_nohz_idle_exit (5 samples, 0.38%) + + + +org/mozilla/javascript/BaseFunction:.execIdCall (60 samples, 4.56%) +org/m.. + + +org/mozilla/javascript/ScriptableObject:.putImpl (1 samples, 0.08%) + + + +_copy_from_user (1 samples, 0.08%) + + + +__netif_receive_skb (34 samples, 2.59%) +__.. + + +java/util/concurrent/ConcurrentHashMap:.get (3 samples, 0.23%) + + + +fput (1 samples, 0.08%) + + + +JavaThread::thread_main_inner (956 samples, 72.70%) +JavaThread::thread_main_inner + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +io/netty/util/Recycler:.get (2 samples, 0.15%) + + + +[unknown] (6 samples, 0.46%) + + + +__dev_queue_xmit (1 samples, 0.08%) + + + +common_file_perm (1 samples, 0.08%) + + + +org/mozilla/javascript/JavaMembers:.get (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (6 samples, 0.46%) + + + +jiffies_to_timeval (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.setName (2 samples, 0.15%) + + + +PSRootsClosurefalse::do_oop (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +vtable stub (1 samples, 0.08%) + + + +skb_clone (4 samples, 0.30%) + + + +OldToYoungRootsTask::do_it (20 samples, 1.52%) + + + +io/netty/channel/ChannelDuplexHandler:.flush (237 samples, 18.02%) +io/netty/channel/ChannelDupl.. + + +org/mozilla/javascript/ScriptableObject:.putImpl (1 samples, 0.08%) + + + +mutex_unlock (1 samples, 0.08%) + + + +hrtimer_force_reprogram (1 samples, 0.08%) + + + +stub_execve (1 samples, 0.08%) + + + +sock_poll (3 samples, 0.23%) + + + +org/mozilla/javascript/IdScriptableObject:.setAttributes (5 samples, 0.38%) + + + +_raw_spin_lock_bh (1 samples, 0.08%) + + + +native_write_msr_safe (3 samples, 0.23%) + + + +sched_clock_cpu (1 samples, 0.08%) + + + +io/netty/channel/DefaultChannelPipeline$HeadContext:.flush (232 samples, 17.64%) +io/netty/channel/DefaultCha.. + + +org/mozilla/javascript/IdScriptableObject:.get (4 samples, 0.30%) + + + +rcu_idle_enter (1 samples, 0.08%) + + + +java (995 samples, 75.67%) +java + + +tcp_cleanup_rbuf (2 samples, 0.15%) + + + +org/mozilla/javascript/NativeJavaObject:.initMembers (4 samples, 0.30%) + + + +org/mozilla/javascript/NativeCall:.init (16 samples, 1.22%) + + + +http_parser_execute (2 samples, 0.15%) + + + +_raw_spin_unlock_irqrestore (1 samples, 0.08%) + + + +ThreadRootsTask::do_it (3 samples, 0.23%) + + + +mutex_lock (3 samples, 0.23%) + + + +cpu_startup_entry (23 samples, 1.75%) + + + +itable stub (1 samples, 0.08%) + + + +__srcu_read_lock (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (5 samples, 0.38%) + + + +org/vertx/java/core/impl/DefaultVertx:.setContext (1 samples, 0.08%) + + + +ip_rcv_finish (89 samples, 6.77%) +ip_rcv_fi.. + + +response_complete (13 samples, 0.99%) + + + +io/netty/handler/codec/http/HttpObjectDecoder:.skipControlCharacters (2 samples, 0.15%) + + + +tcp_v4_rcv (27 samples, 2.05%) +t.. + + +ktime_get_ts (2 samples, 0.15%) + + + +tick_nohz_restart (4 samples, 0.30%) + + + +io/netty/channel/ChannelOutboundHandlerAdapter:.flush (1 samples, 0.08%) + + + +sun/nio/ch/FileDispatcherImpl:.write0 (2 samples, 0.15%) + + + +GCTaskThread::run (28 samples, 2.13%) +G.. + + +io/netty/handler/codec/http/HttpHeaders:.encode (1 samples, 0.08%) + + + +__kmalloc_node_track_caller (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.put (25 samples, 1.90%) +o.. + + +org/mozilla/javascript/IdScriptableObject:.has (2 samples, 0.15%) + + + +atomic_notifier_call_chain (1 samples, 0.08%) + + + +remote_function (4 samples, 0.30%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +common_file_perm (1 samples, 0.08%) + + + +sun/nio/ch/SocketChannelImpl:.isConnected (2 samples, 0.15%) + + + +org/mozilla/javascript/IdScriptableObject:.has (9 samples, 0.68%) + + + +tcp_init_tso_segs (1 samples, 0.08%) + + + +org/mozilla/javascript/BaseFunction:.findInstanceIdInfo (1 samples, 0.08%) + + + +tcp_v4_do_rcv (77 samples, 5.86%) +tcp_v4_.. + + +__tcp_push_pending_frames (61 samples, 4.64%) +__tcp.. + + +org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.08%) + + + +native_read_tsc (1 samples, 0.08%) + + + +tcp_md5_do_lookup (1 samples, 0.08%) + + + +do_sync_write (186 samples, 14.14%) +do_sync_write + + +cpuidle_enter_state (4 samples, 0.30%) + + + +ep_poll_callback (1 samples, 0.08%) + + + +x86_pmu_enable (4 samples, 0.30%) + + + +copy_user_generic_string (3 samples, 0.23%) + + + +perf_pmu_enable (4 samples, 0.30%) + + + +vfs_read (25 samples, 1.90%) +v.. + + +x86_64_start_reservations (24 samples, 1.83%) +x.. + + +security_file_permission (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.08%) + + + +nr_iowait_cpu (1 samples, 0.08%) + + + +__hrtimer_start_range_ns (2 samples, 0.15%) + + + +system_call_after_swapgs (1 samples, 0.08%) + + + +release_sock (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (11 samples, 0.84%) + + + +_raw_spin_unlock_irqrestore (1 samples, 0.08%) + + + +itable stub (1 samples, 0.08%) + + + +call_stub (956 samples, 72.70%) +call_stub + + +dev_hard_start_xmit (3 samples, 0.23%) + + + +dev_queue_xmit (11 samples, 0.84%) + + + +task_nice (2 samples, 0.15%) + + + +ip_finish_output (119 samples, 9.05%) +ip_finish_out.. + + +__remove_hrtimer (1 samples, 0.08%) + + + +sys_epoll_wait (4 samples, 0.30%) + + + +rcu_cpu_has_callbacks (1 samples, 0.08%) + + + +java/lang/ThreadLocal:.get (1 samples, 0.08%) + + + +rcu_idle_exit (1 samples, 0.08%) + + + +net_rx_action (97 samples, 7.38%) +net_rx_act.. + + +lock_sock_nested (1 samples, 0.08%) + + + +mod_timer (2 samples, 0.15%) + + + +apparmor_file_free_security (1 samples, 0.08%) + + + +__remove_hrtimer (1 samples, 0.08%) + + + +tcp_established_options (4 samples, 0.30%) + + + +sk_reset_timer (5 samples, 0.38%) + + + +io/netty/channel/ChannelOutboundHandlerAdapter:.flush (235 samples, 17.87%) +io/netty/channel/ChannelOut.. + + +org/mozilla/javascript/NativeFunction:.initScriptFunction (1 samples, 0.08%) + + + +menu_reflect (1 samples, 0.08%) + + + +__slab_alloc (3 samples, 0.23%) + + + +PSScavengeKlassClosure::do_klass (1 samples, 0.08%) + + + +__ip_local_out (1 samples, 0.08%) + + + +org/mozilla/javascript/TopLevel:.getBuiltinPrototype (5 samples, 0.38%) + + + +tcp_send_delayed_ack (3 samples, 0.23%) + + + +arch_local_irq_save (1 samples, 0.08%) + + + +__kmalloc_node_track_caller (1 samples, 0.08%) + + + +java/nio/channels/spi/AbstractInterruptibleChannel:.end (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.createSlot (15 samples, 1.14%) + + + +apparmor_file_permission (2 samples, 0.15%) + + + +mutex_lock (2 samples, 0.15%) + + + +sys_epoll_ctl (5 samples, 0.38%) + + + +hrtimer_interrupt (1 samples, 0.08%) + + + +ParallelTaskTerminator::offer_termination (2 samples, 0.15%) + + + +dequeue_entity (4 samples, 0.30%) + + + +io/netty/buffer/PooledByteBuf:.deallocate (5 samples, 0.38%) + + + +org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.08%) + + + +wrk (240 samples, 18.25%) +wrk + + +perf_pmu_enable (4 samples, 0.30%) + + + +org/mozilla/javascript/IdScriptableObject:.get (2 samples, 0.15%) + + + +remote_function (4 samples, 0.30%) + + + +__GI___ioctl (5 samples, 0.38%) + + + +socket_readable (2 samples, 0.15%) + + + +epoll_ctl (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.putImpl (21 samples, 1.60%) + + + +tick_nohz_stop_sched_tick (4 samples, 0.30%) + + + +io/netty/channel/DefaultChannelPipeline$HeadContext:.write (6 samples, 0.46%) + + + +tcp_write_xmit (147 samples, 11.18%) +tcp_write_xmit + + +org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (5 samples, 0.38%) + + + +lock_hrtimer_base.isra.19 (1 samples, 0.08%) + + + +inet_recvmsg (17 samples, 1.29%) + + + +native_write_msr_safe (4 samples, 0.30%) + + + +ip_local_out (46 samples, 3.50%) +ip_.. + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.has (1 samples, 0.08%) + + + +local_bh_enable (42 samples, 3.19%) +loc.. + + +hrtimer_start_range_ns (3 samples, 0.23%) + + + +jlong_disjoint_arraycopy (1 samples, 0.08%) + + + +ep_send_events_proc (4 samples, 0.30%) + + + +org/mozilla/javascript/ScriptableObject:.getParentScope (3 samples, 0.23%) + + + +itable stub (1 samples, 0.08%) + + + +path_openat (1 samples, 0.08%) + + + +activate_task (7 samples, 0.53%) + + + +pick_next_task_fair (1 samples, 0.08%) + + + +security_file_permission (5 samples, 0.38%) + + + +io/netty/channel/ChannelOutboundBuffer:.decrementPendingOutboundBytes (1 samples, 0.08%) + + + +system_call_fastpath (56 samples, 4.26%) +syste.. + + +org/mozilla/javascript/NativeFunction:.initScriptFunction (6 samples, 0.46%) + + + +ip_local_deliver_finish (30 samples, 2.28%) +i.. + + +sock_read (2 samples, 0.15%) + + + +deactivate_task (7 samples, 0.53%) + + + +lock_sock_nested (1 samples, 0.08%) + + + +sock_put (1 samples, 0.08%) + + + +mod_timer (3 samples, 0.23%) + + + +aeProcessEvents (171 samples, 13.00%) +aeProcessEvents + + +io/netty/buffer/AbstractByteBuf:.ensureWritable (2 samples, 0.15%) + + + +tick_nohz_stop_sched_tick (5 samples, 0.38%) + + + +org/mozilla/javascript/NativeJavaMethod:.findCachedFunction (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpMethod:.valueOf (2 samples, 0.15%) + + + +hrtimer_try_to_cancel (1 samples, 0.08%) + + + +system_call (1 samples, 0.08%) + + + +hrtimer_cancel (1 samples, 0.08%) + + + +system_call_fastpath (196 samples, 14.90%) +system_call_fastpath + + +io/netty/channel/AbstractChannelHandlerContext:.read (2 samples, 0.15%) + + + +[unknown] (10 samples, 0.76%) + + + +io/netty/handler/codec/MessageToMessageEncoder:.write (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.put (47 samples, 3.57%) +org.. + + +jlong_disjoint_arraycopy (1 samples, 0.08%) + + + +[unknown] (1 samples, 0.08%) + + + +native_read_tsc (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpObjectDecoder:.splitHeader (8 samples, 0.61%) + + + +intel_pmu_enable_all (4 samples, 0.30%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.set (3 samples, 0.23%) + + + +read_tsc (1 samples, 0.08%) + + + +_raw_spin_lock (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.toObjectOrNull (1 samples, 0.08%) + + + +_raw_spin_lock_irqsave (1 samples, 0.08%) + + + +dequeue_task_fair (6 samples, 0.46%) + + + +org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (1 samples, 0.08%) + + + +do_softirq (38 samples, 2.89%) +do.. + + +response_complete (2 samples, 0.15%) + + + +get_next_timer_interrupt (3 samples, 0.23%) + + + +__perf_event_enable (4 samples, 0.30%) + + + +_raw_spin_lock_irqsave (1 samples, 0.08%) + + + +lapic_next_deadline (3 samples, 0.23%) + + + +org/mozilla/javascript/ScriptableObject:.createSlot (4 samples, 0.30%) + + + +fput (1 samples, 0.08%) + + + +tcp_rearm_rto (3 samples, 0.23%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.15%) + + + +group_sched_in (4 samples, 0.30%) + + + +__getnstimeofday (1 samples, 0.08%) + + + +java/util/Arrays:.copyOf (1 samples, 0.08%) + + + +local_bh_enable (104 samples, 7.91%) +local_bh_en.. + + +tcp_event_new_data_sent (3 samples, 0.23%) + + + +read_tsc (2 samples, 0.15%) + + + +system_call_fastpath (6 samples, 0.46%) + + + +tcp_prequeue (1 samples, 0.08%) + + + +call_function_single_interrupt (4 samples, 0.30%) + + + +get_page_from_freelist (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject$Slot:.setAttributes (5 samples, 0.38%) + + + +io/netty/channel/AbstractChannelHandlerContext:.read (4 samples, 0.30%) + + + +org/vertx/java/core/http/impl/VertxHttpHandler:.write (34 samples, 2.59%) +or.. + + +_raw_spin_lock_irqsave (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpObjectDecoder:.splitInitialLine (5 samples, 0.38%) + + + +org/mozilla/javascript/ScriptableObject:.getParentScope (4 samples, 0.30%) + + + +org/mozilla/javascript/IdScriptableObject:.get (3 samples, 0.23%) + + + +org/mozilla/javascript/ScriptRuntime:.getObjectProp (1 samples, 0.08%) + + + +swapper (72 samples, 5.48%) +swapper + + +ktime_get (1 samples, 0.08%) + + + +_raw_spin_unlock_irqrestore (1 samples, 0.08%) + + + +java/lang/ThreadLocal:.get (1 samples, 0.08%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (416 samples, 31.63%) +org/mozilla/javascript/gen/file__root_vert_x_2_1_5.. + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +__schedule (4 samples, 0.30%) + + + +bictcp_cong_avoid (3 samples, 0.23%) + + + +tcp_rcv_space_adjust (2 samples, 0.15%) + + + +JavaThread::run (956 samples, 72.70%) +JavaThread::run + + +apparmor_socket_sendmsg (1 samples, 0.08%) + + + +InstanceKlass::oop_push_contents (8 samples, 0.61%) + + + +sun/nio/ch/SocketChannelImpl:.isConnected (1 samples, 0.08%) + + + +__libc_start_main (6 samples, 0.46%) + + + +tcp_is_cwnd_limited (2 samples, 0.15%) + + + +sun/nio/ch/FileDispatcherImpl:.write0 (203 samples, 15.44%) +sun/nio/ch/FileDispatch.. + + +internal_add_timer (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject$Slot:.setAttributes (2 samples, 0.15%) + + + +[unknown] (30 samples, 2.28%) +[.. + + +io/netty/buffer/AbstractByteBufAllocator:.heapBuffer (3 samples, 0.23%) + + + +__tcp_push_pending_frames (149 samples, 11.33%) +__tcp_push_pendi.. + + +ClassLoaderDataGraph::oops_do (1 samples, 0.08%) + + + +tick_nohz_stop_idle (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.08%) + + + +__skb_clone (1 samples, 0.08%) + + + +tcp_ack (20 samples, 1.52%) + + + +__inet_lookup_established (4 samples, 0.30%) + + + +org/mozilla/javascript/NativeJavaMethod:.findFunction (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.createSlot (4 samples, 0.30%) + + + +enqueue_task (7 samples, 0.53%) + + + +sock_def_readable (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.08%) + + + +tcp_data_queue (39 samples, 2.97%) +tc.. + + +security_file_permission (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.08%) + + + +sun/reflect/DelegatingMethodAccessorImpl:.invoke (66 samples, 5.02%) +sun/re.. + + +__skb_clone (1 samples, 0.08%) + + + +org/vertx/java/platform/impl/RhinoContextFactory:.onContextCreated (1 samples, 0.08%) + + + +tcp_poll (1 samples, 0.08%) + + + +netif_skb_dev_features (1 samples, 0.08%) + + + +ep_scan_ready_list.isra.9 (4 samples, 0.30%) + + + +native_write_msr_safe (4 samples, 0.30%) + + + +copy_user_generic_string (1 samples, 0.08%) + + + +intel_pmu_enable_all (4 samples, 0.30%) + + + +__switch_to (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.has (4 samples, 0.30%) + + + +__hrtimer_start_range_ns (3 samples, 0.23%) + + + +__srcu_read_lock (2 samples, 0.15%) + + + +io/netty/channel/AbstractChannelHandlerContext:.validatePromise (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.createSlot (11 samples, 0.84%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (8 samples, 0.61%) + + + +org/mozilla/javascript/NativeJavaMethod:.findCachedFunction (2 samples, 0.15%) + + + +sock_poll (1 samples, 0.08%) + + + +tick_program_event (3 samples, 0.23%) + + + +tcp_transmit_skb (55 samples, 4.18%) +tcp_.. + + +org/mozilla/javascript/NativeFunction:.initScriptFunction (1 samples, 0.08%) + + + +org/mozilla/javascript/WrapFactory:.wrap (5 samples, 0.38%) + + + +java/lang/String:.getBytes (3 samples, 0.23%) + + + +org/mozilla/javascript/NativeJavaObject:.initMembers (4 samples, 0.30%) + + + +bictcp_cong_avoid (1 samples, 0.08%) + + + +ktime_get_real (3 samples, 0.23%) + + + +java/lang/ThreadLocal:.get (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (21 samples, 1.60%) + + + +rcu_sysidle_force_exit (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject$Slot:.getValue (2 samples, 0.15%) + + + +aa_file_perm (1 samples, 0.08%) + + + +tick_sched_timer (1 samples, 0.08%) + + + +sk_reset_timer (3 samples, 0.23%) + + + +org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.08%) + + + +msecs_to_jiffies (1 samples, 0.08%) + + + +ipv4_dst_check (1 samples, 0.08%) + + + +tcp_write_xmit (60 samples, 4.56%) +tcp_w.. + + +io/netty/util/Recycler:.recycle (1 samples, 0.08%) + + + +group_sched_in (4 samples, 0.30%) + + + +generic_exec_single (1 samples, 0.08%) + + + +menu_select (2 samples, 0.15%) + + + +org/mozilla/javascript/BaseFunction:.construct (1 samples, 0.08%) + + + +process_backlog (97 samples, 7.38%) +process_ba.. + + +__pthread_disable_asynccancel (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpObjectDecoder:.decode (57 samples, 4.33%) +io/ne.. + + +schedule_preempt_disabled (4 samples, 0.30%) + + + +rcu_idle_exit (2 samples, 0.15%) + + + +tcp_send_mss (1 samples, 0.08%) + + + +[unknown] (26 samples, 1.98%) +[.. + + +org/mozilla/javascript/ScriptRuntime:.nameOrFunction (1 samples, 0.08%) + + + +inet_sendmsg (78 samples, 5.93%) +inet_se.. + + +__getnstimeofday (1 samples, 0.08%) + + + +kfree_skbmem (1 samples, 0.08%) + + + +smp_apic_timer_interrupt (1 samples, 0.08%) + + + +kmalloc_slab (2 samples, 0.15%) + + + +[unknown] (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders (2 samples, 0.15%) + + + +ip_rcv_finish (32 samples, 2.43%) +ip.. + + +io/netty/channel/DefaultChannelPipeline$HeadContext:.read (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.putImpl (8 samples, 0.61%) + + + +inet_ehashfn (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.createSlot (33 samples, 2.51%) +or.. + + +frame::oops_do_internal (1 samples, 0.08%) + + + +thread_entry (956 samples, 72.70%) +thread_entry + + +sun/nio/ch/SelectorImpl:.select (7 samples, 0.53%) + + + +_raw_spin_lock_irq (1 samples, 0.08%) + + + +ttwu_do_activate.constprop.74 (12 samples, 0.91%) + + + +skb_copy_datagram_iovec (1 samples, 0.08%) + + + +Interpreter (956 samples, 72.70%) +Interpreter + + +io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders (22 samples, 1.67%) + + + +org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived (540 samples, 41.06%) +org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doM.. + + +_raw_spin_unlock_irqrestore (1 samples, 0.08%) + + + +fget_light (1 samples, 0.08%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.contains (1 samples, 0.08%) + + + +kfree_skbmem (1 samples, 0.08%) + + + +__alloc_pages_nodemask (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.08%) + + + +enqueue_task_fair (5 samples, 0.38%) + + + +perf_pmu_enable (4 samples, 0.30%) + + + +tcp_rcv_established (73 samples, 5.55%) +tcp_rcv.. + + +org/mozilla/javascript/NativeJavaObject:.initMembers (1 samples, 0.08%) + + + +vfs_write (192 samples, 14.60%) +vfs_write + + +fdval (1 samples, 0.08%) + + + +ip_queue_xmit (122 samples, 9.28%) +ip_queue_xmit + + +sock_aio_write (82 samples, 6.24%) +sock_aio.. + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (1 samples, 0.08%) + + + +aeMain (236 samples, 17.95%) +aeMain + + +io/netty/channel/ChannelDuplexHandler:.read (3 samples, 0.23%) + + + +org/vertx/java/core/http/impl/AssembledFullHttpResponse:.toLastContent (2 samples, 0.15%) + + + +internal_add_timer (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +vtable stub (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.getParentScope (1 samples, 0.08%) + + + +io/netty/buffer/PooledByteBufAllocator:.newDirectBuffer (2 samples, 0.15%) + + + +SpinPause (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.has (3 samples, 0.23%) + + + +java/nio/charset/CharsetEncoder:.replaceWith (2 samples, 0.15%) + + + +tcp_queue_rcv (2 samples, 0.15%) + + + +stats_record (3 samples, 0.23%) + + + +org/mozilla/javascript/WrapFactory:.wrap (5 samples, 0.38%) + + + +__wake_up_sync_key (27 samples, 2.05%) +_.. + + +__acct_update_integrals (1 samples, 0.08%) + + + +fget_light (1 samples, 0.08%) + + + +local_bh_enable (1 samples, 0.08%) + + + +eth_type_trans (1 samples, 0.08%) + + + +org/vertx/java/core/net/impl/VertxHandler:.channelRead (555 samples, 42.21%) +org/vertx/java/core/net/impl/VertxHandler:.channelRead + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +sock_put (1 samples, 0.08%) + + + +__kfree_skb (3 samples, 0.23%) + + + +dequeue_task (7 samples, 0.53%) + + + +io/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.08%) + + + +ip_rcv_finish (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.getObjectProp (4 samples, 0.30%) + + + +__tick_nohz_idle_enter (4 samples, 0.30%) + + + +__tcp_ack_snd_check (3 samples, 0.23%) + + + +[unknown] (4 samples, 0.30%) + + + +org/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.08%) + + + +org/mozilla/javascript/NativeFunction:.initScriptFunction (2 samples, 0.15%) + + + +int_sqrt (1 samples, 0.08%) + + + +nmethod::fix_oop_relocations (1 samples, 0.08%) + + + +tcp_sendmsg (1 samples, 0.08%) + + + +java/lang/ThreadLocal:.get (1 samples, 0.08%) + + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +org/mozilla/javascript/BaseFunction:.findPrototypeId (1 samples, 0.08%) + + + +native_write_msr_safe (3 samples, 0.23%) + + + +perf_pmu_enable (4 samples, 0.30%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (77 samples, 5.86%) +org/moz.. + + +__netif_receive_skb_core (94 samples, 7.15%) +__netif_r.. + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +hrtimer_start (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptRuntime:.setName (5 samples, 0.38%) + + + +__netif_receive_skb (94 samples, 7.15%) +__netif_r.. + + +change_protection (1 samples, 0.08%) + + + +io/netty/channel/ChannelOutboundBuffer:.current (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.flush (233 samples, 17.72%) +io/netty/channel/AbstractCh.. + + +do_softirq_own_stack (103 samples, 7.83%) +do_softirq_.. + + +do_filp_open (1 samples, 0.08%) + + + +x86_pmu_commit_txn (4 samples, 0.30%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +io/netty/util/Recycler:.get (1 samples, 0.08%) + + + +_raw_spin_lock (1 samples, 0.08%) + + + +sun/nio/ch/SocketChannelImpl:.isConnected (1 samples, 0.08%) + + + +change_protection_range (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.putImpl (12 samples, 0.91%) + + + +__libc_write (1 samples, 0.08%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (513 samples, 39.01%) +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_.. + + +raw_local_deliver (1 samples, 0.08%) + + + +apparmor_file_permission (1 samples, 0.08%) + + + +VMThread::loop (1 samples, 0.08%) + + + +_raw_spin_unlock_irqrestore (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.newPromise (1 samples, 0.08%) + + + +epoll_ctl (7 samples, 0.53%) + + + +io/netty/handler/codec/http/HttpVersion:.compareTo (1 samples, 0.08%) + + + +io/netty/channel/nio/NioEventLoop:.processSelectedKeys (949 samples, 72.17%) +io/netty/channel/nio/NioEventLoop:.processSelectedKeys + + +io/netty/handler/codec/http/DefaultHttpHeaders:.init (1 samples, 0.08%) + + + +java/lang/String:.hashCode (2 samples, 0.15%) + + + +org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.08%) + + + +effective_load.isra.35 (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.15%) + + + +rcu_sysidle_exit (1 samples, 0.08%) + + + +native_load_tls (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.08%) + + + +org/mozilla/javascript/BaseFunction:.findPrototypeId (1 samples, 0.08%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (6 samples, 0.46%) + + + +system_call_fastpath (22 samples, 1.67%) + + + +org/mozilla/javascript/TopLevel:.getBuiltinPrototype (1 samples, 0.08%) + + + +tcp_current_mss (5 samples, 0.38%) + + + +io/netty/channel/ChannelOutboundBuffer:.incrementPendingOutboundBytes (1 samples, 0.08%) + + + +oopDesc* PSPromotionManager::copy_to_survivor_spacefalse (2 samples, 0.15%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (156 samples, 11.86%) +org/mozilla/javas.. + + +StealTask::do_it (3 samples, 0.23%) + + + +Interpreter (956 samples, 72.70%) +Interpreter + + +PSPromotionManager::drain_stacks_depth (2 samples, 0.15%) + + + +sock_def_readable (32 samples, 2.43%) +so.. + + +org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.08%) + + + +perf (6 samples, 0.46%) + + + +__wake_up_common (27 samples, 2.05%) +_.. + + +org/mozilla/javascript/IdScriptableObject:.has (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpObjectDecoder$HeaderParser:.process (1 samples, 0.08%) + + + +common_file_perm (1 samples, 0.08%) + + + +io/netty/buffer/AbstractReferenceCountedByteBuf:.release (5 samples, 0.38%) + + + +hrtimer_force_reprogram (3 samples, 0.23%) + + + +org/vertx/java/core/impl/DefaultVertx:.setContext (1 samples, 0.08%) + + + +msecs_to_jiffies (1 samples, 0.08%) + + + +arch_cpu_idle (7 samples, 0.53%) + + + +[unknown] (91 samples, 6.92%) +[unknown] + + +tcp_cleanup_rbuf (1 samples, 0.08%) + + + +release_sock (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.flush (235 samples, 17.87%) +io/netty/channel/AbstractCh.. + + +io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete (1 samples, 0.08%) + + + +fput (2 samples, 0.15%) + + + +bictcp_acked (1 samples, 0.08%) + + + +java/nio/DirectByteBuffer:.duplicate (1 samples, 0.08%) + + + +io/netty/buffer/AbstractByteBuf:.checkIndex (3 samples, 0.23%) + + + +java/util/HashMap:.getNode (2 samples, 0.15%) + + + +ttwu_stat (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpHeaders:.hash (1 samples, 0.08%) + + + +org/vertx/java/core/net/impl/ConnectionBase:.write (38 samples, 2.89%) +or.. + + +local_apic_timer_interrupt (1 samples, 0.08%) + + + +inet_ehashfn (1 samples, 0.08%) + + + +__srcu_read_unlock (1 samples, 0.08%) + + + +java/nio/channels/spi/AbstractInterruptibleChannel:.begin (1 samples, 0.08%) + + + +skb_clone (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead (562 samples, 42.74%) +io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead + + +ip_local_deliver (89 samples, 6.77%) +ip_local_.. + + +org/mozilla/javascript/ScriptableObject:.createSlot (8 samples, 0.61%) + + + +itable stub (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +__do_softirq (36 samples, 2.74%) +__.. + + +io/netty/handler/codec/http/HttpMethod:.valueOf (2 samples, 0.15%) + + + +clockevents_program_event (3 samples, 0.23%) + + + +tcp_set_skb_tso_segs (1 samples, 0.08%) + + + +io/netty/buffer/AbstractByteBuf:.checkSrcIndex (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpVersion:.compareTo (2 samples, 0.15%) + + + +ttwu_do_activate.constprop.74 (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject$Slot:.setAttributes (6 samples, 0.46%) + + + +cpuidle_idle_call (21 samples, 1.60%) + + + +__hrtimer_start_range_ns (2 samples, 0.15%) + + + +io/netty/channel/ChannelOutboundHandlerAdapter:.read (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptRuntime:.bind (7 samples, 0.53%) + + + +x86_pmu_enable (4 samples, 0.30%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +sun/nio/ch/EPollArrayWrapper:.poll (5 samples, 0.38%) + + + +org/mozilla/javascript/IdScriptableObject:.setAttributes (12 samples, 0.91%) + + + +sock_read (3 samples, 0.23%) + + + +HandleArea::oops_do (1 samples, 0.08%) + + + +tcp_v4_send_check (1 samples, 0.08%) + + + +tcp_wfree (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject$Slot:.getValue (1 samples, 0.08%) + + + +sun/nio/ch/FileDispatcherImpl:.read0 (1 samples, 0.08%) + + + +org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete (240 samples, 18.25%) +org/vertx/java/core/net/impl.. + + +rcu_bh_qs (1 samples, 0.08%) + + + +lock_timer_base.isra.35 (1 samples, 0.08%) + + + +io/netty/buffer/PooledUnsafeDirectByteBuf:.setBytes (42 samples, 3.19%) +io/.. + + +sun/nio/cs/UTF_8$Encoder:.init (3 samples, 0.23%) + + + +io/netty/channel/ChannelDuplexHandler:.read (1 samples, 0.08%) + + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +account_entity_dequeue (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.executor (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (17 samples, 1.29%) + + + +io/netty/handler/codec/http/HttpObjectEncoder:.encode (17 samples, 1.29%) + + + +org/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (2 samples, 0.15%) + + + +ksize (1 samples, 0.08%) + + + +[unknown] (4 samples, 0.30%) + + + +org/mozilla/javascript/ScriptRuntime:.toObjectOrNull (2 samples, 0.15%) + + + +fget_light (1 samples, 0.08%) + + + +sched_clock_idle_sleep_event (1 samples, 0.08%) + + + +sock_aio_write (185 samples, 14.07%) +sock_aio_write + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_j (1 samples, 0.08%) + + + +smp_call_function_single (5 samples, 0.38%) + + + +org/mozilla/javascript/TopLevel:.getBuiltinPrototype (1 samples, 0.08%) + + + +ip_rcv (91 samples, 6.92%) +ip_rcv + + +tcp_sendmsg (176 samples, 13.38%) +tcp_sendmsg + + +release_sock (1 samples, 0.08%) + + + +ep_poll_callback (27 samples, 2.05%) +e.. + + +update_min_vruntime (1 samples, 0.08%) + + + +java/lang/Integer:.toString (1 samples, 0.08%) + + + +itable stub (1 samples, 0.08%) + + + +do_softirq_own_stack (37 samples, 2.81%) +do.. + + +io/netty/buffer/AbstractByteBufAllocator:.heapBuffer (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (3 samples, 0.23%) + + + +org/mozilla/javascript/ScriptableObject:.addKnownAbsentSlot (1 samples, 0.08%) + + + +sched_clock_cpu (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpHeaders:.encodeAscii0 (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptRuntime:.toObjectOrNull (1 samples, 0.08%) + + + +inet_sendmsg (1 samples, 0.08%) + + + +VMThread::run (1 samples, 0.08%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.init (1 samples, 0.08%) + + + +java/util/HashMap:.getNode (2 samples, 0.15%) + + + +__run_hrtimer (1 samples, 0.08%) + + + +java/nio/channels/spi/AbstractInterruptibleChannel:.begin (1 samples, 0.08%) + + + +io/netty/handler/codec/http/HttpHeaders:.hash (1 samples, 0.08%) + + + +sun/nio/ch/EPollSelectorImpl:.updateSelectedKeys (1 samples, 0.08%) + + + +x86_pmu_enable (4 samples, 0.30%) + + + +thread_main (237 samples, 18.02%) +thread_main + + +enqueue_hrtimer (1 samples, 0.08%) + + + +ep_poll (4 samples, 0.30%) + + + +sock_aio_read (7 samples, 0.53%) + + + +io/netty/buffer/AbstractByteBuf:.checkSrcIndex (3 samples, 0.23%) + + + +sock_aio_read (22 samples, 1.67%) + + + +io/netty/handler/codec/http/HttpObjectDecoder$LineParser:.parse (6 samples, 0.46%) + + + +sys_epoll_ctl (5 samples, 0.38%) + + + +java/lang/String:.init (4 samples, 0.30%) + + + +rb_erase (1 samples, 0.08%) + + + +select_estimate_accuracy (5 samples, 0.38%) + + + +link_path_walk (1 samples, 0.08%) + + + +sock_aio_read.part.8 (22 samples, 1.67%) + + + +local_bh_enable_ip (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.putImpl (3 samples, 0.23%) + + + +__tcp_select_window (1 samples, 0.08%) + + + +fget_light (1 samples, 0.08%) + + + +io/netty/buffer/AbstractReferenceCountedByteBuf:.release (4 samples, 0.30%) + + + +acct_account_cputime (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.put (1 samples, 0.08%) + + + +__perf_event_enable (4 samples, 0.30%) + + + +ip_finish_output (46 samples, 3.50%) +ip_.. + + +__tick_nohz_idle_enter (6 samples, 0.46%) + + + +__skb_clone (4 samples, 0.30%) + + + +org/mozilla/javascript/ScriptableObject:.getPrototype (1 samples, 0.08%) + + + +__switch_to (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.write (35 samples, 2.66%) +io.. + + +_raw_spin_lock (1 samples, 0.08%) + + + +_raw_spin_unlock_irqrestore (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.setObjectProp (3 samples, 0.23%) + + + +org/mozilla/javascript/IdScriptableObject:.has (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.15%) + + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +idle_cpu (2 samples, 0.15%) + + + +org/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.08%) + + + +io/netty/util/Recycler:.get (1 samples, 0.08%) + + + +native_write_msr_safe (4 samples, 0.30%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (2 samples, 0.15%) + + + +ip_output (119 samples, 9.05%) +ip_output + + +io/netty/buffer/AbstractByteBuf:.forEachByteAsc0 (3 samples, 0.23%) + + + +skb_network_protocol (1 samples, 0.08%) + + + +enqueue_entity (5 samples, 0.38%) + + + +tcp_established_options (1 samples, 0.08%) + + + +update_process_times (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.read (3 samples, 0.23%) + + + +update_rq_clock.part.63 (1 samples, 0.08%) + + + +sun/nio/ch/EPollArrayWrapper:.epollWait (4 samples, 0.30%) + + + +sock_poll (2 samples, 0.15%) + + + +io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized (949 samples, 72.17%) +io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized + + +java_start (985 samples, 74.90%) +java_start + + +mprotect_fixup (1 samples, 0.08%) + + + +ep_scan_ready_list.isra.9 (20 samples, 1.52%) + + + +tcp_v4_do_rcv (23 samples, 1.75%) + + + +sk_stream_alloc_skb (7 samples, 0.53%) + + + +update_curr (2 samples, 0.15%) + + + +tcp_wfree (2 samples, 0.15%) + + + +user_path_at_empty (1 samples, 0.08%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.init (1 samples, 0.08%) + + + +io/netty/buffer/AbstractByteBuf:.writeBytes (1 samples, 0.08%) + + + +sun/nio/ch/NativeThread:.current (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.get (1 samples, 0.08%) + + + +JavaThread::oops_do (3 samples, 0.23%) + + + +org/mozilla/javascript/ScriptableObject:.getBase (2 samples, 0.15%) + + + +ip_local_deliver (1 samples, 0.08%) + + + +org/vertx/java/core/http/impl/ServerConnection:.handleRequest (526 samples, 40.00%) +org/vertx/java/core/http/impl/ServerConnection:.handleRequest + + +__hrtimer_start_range_ns (3 samples, 0.23%) + + + +org/mozilla/javascript/NativeFunction:.initScriptFunction (10 samples, 0.76%) + + + +hrtimer_start (1 samples, 0.08%) + + + +intel_idle (11 samples, 0.84%) + + + +org/mozilla/javascript/IdScriptableObject:.has (3 samples, 0.23%) + + + +ktime_get (1 samples, 0.08%) + + + +update_cfs_rq_blocked_load (1 samples, 0.08%) + + + +org/mozilla/javascript/WrapFactory:.setJavaPrimitiveWrap (1 samples, 0.08%) + + + +sun/nio/ch/NativeThread:.current (1 samples, 0.08%) + + + +system_call_fastpath (28 samples, 2.13%) +s.. + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +sched_clock_cpu (1 samples, 0.08%) + + + +lapic_next_deadline (3 samples, 0.23%) + + + +io/netty/buffer/UnpooledHeapByteBuf:.init (1 samples, 0.08%) + + + +filename_lookup (1 samples, 0.08%) + + + +jni_fast_GetIntField (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.put (6 samples, 0.46%) + + + +x86_pmu_commit_txn (4 samples, 0.30%) + + + +__kfree_skb (1 samples, 0.08%) + + + +org/mozilla/javascript/NativeJavaMethod:.call (10 samples, 0.76%) + + + +process_backlog (34 samples, 2.59%) +pr.. + + +all (1,315 samples, 100%) + + + +io/netty/handler/codec/http/HttpHeaders:.encodeAscii0 (2 samples, 0.15%) + + + +system_call_after_swapgs (6 samples, 0.46%) + + + +_raw_spin_unlock_bh (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +tcp_event_new_data_sent (6 samples, 0.46%) + + + +_raw_spin_unlock_bh (1 samples, 0.08%) + + + +tcp_schedule_loss_probe (3 samples, 0.23%) + + + +tcp_check_space (3 samples, 0.23%) + + + +dev_queue_xmit (4 samples, 0.30%) + + + +tick_nohz_restart (6 samples, 0.46%) + + + +__tcp_ack_snd_check (5 samples, 0.38%) + + + +user_path_at (1 samples, 0.08%) + + + +socket_readable (60 samples, 4.56%) +socke.. + + +org/mozilla/javascript/ScriptableObject:.getSlot (4 samples, 0.30%) + + + +OopMapSet::all_do (1 samples, 0.08%) + + + +socket_writeable (1 samples, 0.08%) + + + +internal_add_timer (1 samples, 0.08%) + + + +select_task_rq_fair (4 samples, 0.30%) + + + +loopback_xmit (5 samples, 0.38%) + + + +sys_epoll_wait (56 samples, 4.26%) +sys_e.. + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +clockevents_program_event (3 samples, 0.23%) + + + +io/netty/buffer/PooledByteBuf:.deallocate (2 samples, 0.15%) + + + +io/netty/util/Recycler:.get (1 samples, 0.08%) + + + +fsnotify (1 samples, 0.08%) + + + +org/mozilla/javascript/NativeJavaMethod:.call (74 samples, 5.63%) +org/moz.. + + +org/mozilla/javascript/ScriptRuntime:.setObjectProp (37 samples, 2.81%) +or.. + + +schedule_preempt_disabled (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.flush (238 samples, 18.10%) +io/netty/channel/AbstractCha.. + + +tcp_queue_rcv (2 samples, 0.15%) + + + +org/mozilla/javascript/ScriptableObject:.createSlot (5 samples, 0.38%) + + + +tcp_recvmsg (7 samples, 0.53%) + + + +update_curr (1 samples, 0.08%) + + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +tcp_md5_do_lookup (1 samples, 0.08%) + + + +smp_call_function_single_interrupt (4 samples, 0.30%) + + + +netif_rx (2 samples, 0.15%) + + + +enqueue_to_backlog (1 samples, 0.08%) + + + +_raw_spin_unlock_bh (1 samples, 0.08%) + + + +perf_ioctl (5 samples, 0.38%) + + + +tick_program_event (3 samples, 0.23%) + + + +io/netty/handler/codec/ByteToMessageDecoder:.channelRead (635 samples, 48.29%) +io/netty/handler/codec/ByteToMessageDecoder:.channelRead + + +put_prev_task_fair (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.createSlot (15 samples, 1.14%) + + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +sys_mprotect (1 samples, 0.08%) + + + +Monitor::wait (1 samples, 0.08%) + + + +skb_push (1 samples, 0.08%) + + + +java/lang/ThreadLocal:.get (1 samples, 0.08%) + + + +vtable stub (1 samples, 0.08%) + + + +x86_64_start_kernel (24 samples, 1.83%) +x.. + + +[unknown] (1 samples, 0.08%) + + + +kfree (1 samples, 0.08%) + + + +io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete (241 samples, 18.33%) +io/netty/channel/AbstractCha.. + + +io/netty/buffer/AbstractByteBuf:.forEachByteAsc0 (3 samples, 0.23%) + + + +Java_sun_nio_ch_FileDispatcherImpl_write0 (1 samples, 0.08%) + + + +do_execve_common.isra.22 (1 samples, 0.08%) + + + +group_sched_in (4 samples, 0.30%) + + + +socket_writeable (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue (1 samples, 0.08%) + + + +java/lang/String:.hashCode (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getTopLevelScope (1 samples, 0.08%) + + + +kmem_cache_alloc_node (2 samples, 0.15%) + + + +org/mozilla/javascript/IdScriptableObject:.has (12 samples, 0.91%) + + + +getnstimeofday (1 samples, 0.08%) + + + +java/util/Arrays:.copyOf (1 samples, 0.08%) + + + +arch_cpu_idle (22 samples, 1.67%) + + + +http_parser_execute (30 samples, 2.28%) +h.. + + +new_slab (2 samples, 0.15%) + + + +io/netty/channel/ChannelDuplexHandler:.flush (1 samples, 0.08%) + + + +generic_smp_call_function_single_interrupt (4 samples, 0.30%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.contains (1 samples, 0.08%) + + + +java/lang/ThreadLocal:.get (1 samples, 0.08%) + + + +security_socket_sendmsg (1 samples, 0.08%) + + + +update_cpu_load_nohz (1 samples, 0.08%) + + + +__perf_event_enable (4 samples, 0.30%) + + + +skb_clone (1 samples, 0.08%) + + + +start_thread (237 samples, 18.02%) +start_thread + + +mod_timer (3 samples, 0.23%) + + + +tcp_data_queue (9 samples, 0.68%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (1 samples, 0.08%) + + + +java/lang/String:.trim (1 samples, 0.08%) + + + +net_rx_action (35 samples, 2.66%) +ne.. + + +inet_sendmsg (177 samples, 13.46%) +inet_sendmsg + + +getnstimeofday (3 samples, 0.23%) + + + +io/netty/buffer/AbstractByteBuf:.writeBytes (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getSlot (3 samples, 0.23%) + + + +[unknown] (1 samples, 0.08%) + + + +hrtimer_try_to_cancel (4 samples, 0.30%) + + + +java/nio/charset/Charset:.lookup (2 samples, 0.15%) + + + +org/mozilla/javascript/NativeJavaObject:.initMembers (1 samples, 0.08%) + + + +start_thread (985 samples, 74.90%) +start_thread + + +x86_pmu_commit_txn (4 samples, 0.30%) + + + +org/mozilla/javascript/ScriptableObject:.getParentScope (1 samples, 0.08%) + + + +system_call_fastpath (5 samples, 0.38%) + + + +_raw_spin_lock (1 samples, 0.08%) + + + +menu_select (4 samples, 0.30%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.add0 (3 samples, 0.23%) + + + +io/netty/buffer/PooledByteBuf:.deallocate (2 samples, 0.15%) + + + +org/mozilla/javascript/BaseFunction:.findInstanceIdInfo (4 samples, 0.30%) + + + +rest_init (24 samples, 1.83%) +r.. + + +ksoftirqd/3 (1 samples, 0.08%) + + + +group_sched_in (4 samples, 0.30%) + + + +account_user_time (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.name (8 samples, 0.61%) + + + +perf_event_for_each_child (5 samples, 0.38%) + + + +io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace (1 samples, 0.08%) + + + +java/lang/String:.init (1 samples, 0.08%) + + + +set_next_entity (2 samples, 0.15%) + + + +ip_local_deliver_finish (89 samples, 6.77%) +ip_local_.. + + +org/mozilla/javascript/NativeJavaMethod:.findCachedFunction (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.put (12 samples, 0.91%) + + + +hrtimer_start_range_ns (2 samples, 0.15%) + + + +__internal_add_timer (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (9 samples, 0.68%) + + + +smp_call_function_single_interrupt (4 samples, 0.30%) + + + +_raw_spin_lock_bh (1 samples, 0.08%) + + + +__hrtimer_start_range_ns (1 samples, 0.08%) + + + +lock_sock_nested (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject$PrototypeValues:.ensureId (1 samples, 0.08%) + + + +sk_reset_timer (3 samples, 0.23%) + + + +org/mozilla/javascript/gen/file__root_vert_x_2_1_5_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_2 (154 samples, 11.71%) +org/mozilla/javas.. + + +io/netty/handler/codec/ByteToMessageDecoder:.channelRead (1 samples, 0.08%) + + + +security_socket_sendmsg (2 samples, 0.15%) + + + +io/netty/handler/codec/http/DefaultHttpHeaders:.add0 (1 samples, 0.08%) + + + +system_call_after_swapgs (1 samples, 0.08%) + + + +hrtimer_cancel (4 samples, 0.30%) + + + +ObjArrayKlass::oop_push_contents (2 samples, 0.15%) + + + +org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (1 samples, 0.08%) + + + +org/mozilla/javascript/IdScriptableObject:.has (1 samples, 0.08%) + + + +schedule_hrtimeout_range (20 samples, 1.52%) + + + +org/mozilla/javascript/ScriptableObject:.putImpl (24 samples, 1.83%) +o.. + + +__fsnotify_parent (1 samples, 0.08%) + + + +vtable stub (1 samples, 0.08%) + + + +__dev_queue_xmit (10 samples, 0.76%) + + + +sys_write (88 samples, 6.69%) +sys_write + + +detach_if_pending (1 samples, 0.08%) + + + +socket_writeable (99 samples, 7.53%) +socket_wri.. + + +org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo (2 samples, 0.15%) + + + +epoll_ctl (6 samples, 0.46%) + + + +org/vertx/java/core/http/impl/AssembledFullHttpResponse:.toLastContent (1 samples, 0.08%) + + + +org/mozilla/javascript/NativeJavaObject:.get (1 samples, 0.08%) + + + +lock_hrtimer_base.isra.19 (1 samples, 0.08%) + + + +intel_idle (3 samples, 0.23%) + + + +ip_local_deliver (31 samples, 2.36%) +i.. + + +org/mozilla/javascript/IdScriptableObject:.put (23 samples, 1.75%) + + + +io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete (242 samples, 18.40%) +io/netty/handler/codec/ByteT.. + + +tcp_event_data_recv (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptableObject:.getTopScopeValue (1 samples, 0.08%) + + + +tcp_rearm_rto (3 samples, 0.23%) + + + +org/mozilla/javascript/NativeCall:.init (48 samples, 3.65%) +org/.. + + +tick_nohz_idle_enter (5 samples, 0.38%) + + + +system_call_fastpath (4 samples, 0.30%) + + + +system_call (1 samples, 0.08%) + + + +tick_nohz_idle_enter (6 samples, 0.46%) + + + +tick_program_event (1 samples, 0.08%) + + + +org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThisHelper (1 samples, 0.08%) + + + +remote_function (4 samples, 0.30%) + + + +tcp_clean_rtx_queue (1 samples, 0.08%) + + + +tick_nohz_idle_exit (7 samples, 0.53%) + + + +org/mozilla/javascript/IdScriptableObject:.put (9 samples, 0.68%) + + + +fsnotify (1 samples, 0.08%) + + + +pick_next_task_fair (2 samples, 0.15%) + + + +do_sync_write (82 samples, 6.24%) +do_sync_.. + + +sys_write (195 samples, 14.83%) +sys_write + + +common_file_perm (1 samples, 0.08%) + + + +account_process_tick (1 samples, 0.08%) + + + diff --git a/tools/FlameGraph/files.pl b/tools/FlameGraph/files.pl new file mode 100755 index 0000000..50426b2 --- /dev/null +++ b/tools/FlameGraph/files.pl @@ -0,0 +1,62 @@ +#!/usr/bin/perl -w +# +# files.pl Print file sizes in folded format, for a flame graph. +# +# This helps you understand storage consumed by a file system, by creating +# a flame graph visualization of space consumed. This is basically a Perl +# version of the "find" command, which emits in folded format for piping +# into flamegraph.pl. +# +# Copyright (c) 2017 Brendan Gregg. +# Licensed under the Apache License, Version 2.0 (the "License") +# +# 03-Feb-2017 Brendan Gregg Created this. + +use strict; +use File::Find; + +sub usage { + print STDERR "USAGE: $0 [--xdev] [DIRECTORY]...\n"; + print STDERR " eg, $0 /Users\n"; + print STDERR " To not descend directories on other filesystems:"; + print STDERR " eg, $0 --xdev /\n"; + print STDERR "Intended to be piped to flamegraph.pl. Full example:\n"; + print STDERR " $0 /Users | flamegraph.pl " . + "--hash --countname=bytes > files.svg\n"; + print STDERR " $0 /usr /home /root /etc | flamegraph.pl " . + "--hash --countname=bytes > files.svg\n"; + print STDERR " $0 --xdev / | flamegraph.pl " . + "--hash --countname=bytes > files.svg\n"; + exit 1; +} + +usage() if @ARGV == 0 or $ARGV[0] eq "--help" or $ARGV[0] eq "-h"; + +my $filter_xdev = 0; +my $xdev_id; + +foreach my $dir (@ARGV) { + if ($dir eq "--xdev") { + $filter_xdev = 1; + } else { + find(\&wanted, $dir); + } +} + +sub wanted { + my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_); + return unless defined $size; + if ($filter_xdev) { + if (!$xdev_id) { + $xdev_id = $dev; + } elsif ($xdev_id ne $dev) { + $File::Find::prune = 1; + return; + } + } + my $path = $File::Find::name; + $path =~ tr/\//;/; # delimiter + $path =~ tr/;.a-zA-Z0-9-/_/c; # ditch whitespace and other chars + $path =~ s/^;//; + print "$path $size\n"; +} diff --git a/tools/FlameGraph/flamegraph.pl b/tools/FlameGraph/flamegraph.pl new file mode 100755 index 0000000..d2172b6 --- /dev/null +++ b/tools/FlameGraph/flamegraph.pl @@ -0,0 +1,1252 @@ +#!/usr/bin/perl -w +# +# flamegraph.pl flame stack grapher. +# +# This takes stack samples and renders a call graph, allowing hot functions +# and codepaths to be quickly identified. Stack samples can be generated using +# tools such as DTrace, perf, SystemTap, and Instruments. +# +# USAGE: ./flamegraph.pl [options] input.txt > graph.svg +# +# grep funcA input.txt | ./flamegraph.pl [options] > graph.svg +# +# Then open the resulting .svg in a web browser, for interactivity: mouse-over +# frames for info, click to zoom, and ctrl-F to search. +# +# Options are listed in the usage message (--help). +# +# The input is stack frames and sample counts formatted as single lines. Each +# frame in the stack is semicolon separated, with a space and count at the end +# of the line. These can be generated for Linux perf script output using +# stackcollapse-perf.pl, for DTrace using stackcollapse.pl, and for other tools +# using the other stackcollapse programs. Example input: +# +# swapper;start_kernel;rest_init;cpu_idle;default_idle;native_safe_halt 1 +# +# An optional extra column of counts can be provided to generate a differential +# flame graph of the counts, colored red for more, and blue for less. This +# can be useful when using flame graphs for non-regression testing. +# See the header comment in the difffolded.pl program for instructions. +# +# The input functions can optionally have annotations at the end of each +# function name, following a precedent by some tools (Linux perf's _[k]): +# _[k] for kernel +# _[i] for inlined +# _[j] for jit +# _[w] for waker +# Some of the stackcollapse programs support adding these annotations, eg, +# stackcollapse-perf.pl --kernel --jit. They are used merely for colors by +# some palettes, eg, flamegraph.pl --color=java. +# +# The output flame graph shows relative presence of functions in stack samples. +# The ordering on the x-axis has no meaning; since the data is samples, time +# order of events is not known. The order used sorts function names +# alphabetically. +# +# While intended to process stack samples, this can also process stack traces. +# For example, tracing stacks for memory allocation, or resource usage. You +# can use --title to set the title to reflect the content, and --countname +# to change "samples" to "bytes" etc. +# +# There are a few different palettes, selectable using --color. By default, +# the colors are selected at random (except for differentials). Functions +# called "-" will be printed gray, which can be used for stack separators (eg, +# between user and kernel stacks). +# +# HISTORY +# +# This was inspired by Neelakanth Nadgir's excellent function_call_graph.rb +# program, which visualized function entry and return trace events. As Neel +# wrote: "The output displayed is inspired by Roch's CallStackAnalyzer which +# was in turn inspired by the work on vftrace by Jan Boerhout". See: +# https://blogs.oracle.com/realneel/entry/visualizing_callstacks_via_dtrace_and +# +# Copyright 2016 Netflix, Inc. +# Copyright 2011 Joyent, Inc. All rights reserved. +# Copyright 2011 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 11-Oct-2014 Adrien Mahieux Added zoom. +# 21-Nov-2013 Shawn Sterling Added consistent palette file option +# 17-Mar-2013 Tim Bunce Added options and more tunables. +# 15-Dec-2011 Dave Pacheco Support for frames with whitespace. +# 10-Sep-2011 Brendan Gregg Created this. + +use strict; + +use Getopt::Long; + +use open qw(:std :utf8); + +# tunables +my $encoding; +my $fonttype = "Verdana"; +my $imagewidth = 1200; # max width, pixels +my $frameheight = 16; # max height is dynamic +my $fontsize = 12; # base text size +my $fontwidth = 0.59; # avg width relative to fontsize +my $minwidth = 0.1; # min function width, pixels +my $nametype = "Function:"; # what are the names in the data? +my $countname = "samples"; # what are the counts in the data? +my $colors = "hot"; # color theme +my $bgcolors = ""; # background color theme +my $nameattrfile; # file holding function attributes +my $timemax; # (override the) sum of the counts +my $factor = 1; # factor to scale counts by +my $hash = 0; # color by function name +my $palette = 0; # if we use consistent palettes (default off) +my %palette_map; # palette map hash +my $pal_file = "palette.map"; # palette map file name +my $stackreverse = 0; # reverse stack order, switching merge end +my $inverted = 0; # icicle graph +my $flamechart = 0; # produce a flame chart (sort by time, do not merge stacks) +my $negate = 0; # switch differential hues +my $titletext = ""; # centered heading +my $titledefault = "Flame Graph"; # overwritten by --title +my $titleinverted = "Icicle Graph"; # " " +my $searchcolor = "rgb(230,0,230)"; # color for search highlighting +my $notestext = ""; # embedded notes in SVG +my $subtitletext = ""; # second level title (optional) +my $help = 0; + +sub usage { + die < outfile.svg\n + --title TEXT # change title text + --subtitle TEXT # second level title (optional) + --width NUM # width of image (default 1200) + --height NUM # height of each frame (default 16) + --minwidth NUM # omit smaller functions (default 0.1 pixels) + --fonttype FONT # font type (default "Verdana") + --fontsize NUM # font size (default 12) + --countname TEXT # count type label (default "samples") + --nametype TEXT # name type label (default "Function:") + --colors PALETTE # set color palette. choices are: hot (default), mem, + # io, wakeup, chain, java, js, perl, red, green, blue, + # aqua, yellow, purple, orange + --bgcolors COLOR # set background colors. gradient choices are yellow + # (default), blue, green, grey; flat colors use "#rrggbb" + --hash # colors are keyed by function name hash + --cp # use consistent palette (palette.map) + --reverse # generate stack-reversed flame graph + --inverted # icicle graph + --flamechart # produce a flame chart (sort by time, do not merge stacks) + --negate # switch differential hues (blue<->red) + --notes TEXT # add notes comment in SVG (for debugging) + --help # this message + + eg, + $0 --title="Flame Graph: malloc()" trace.txt > graph.svg +USAGE_END +} + +GetOptions( + 'fonttype=s' => \$fonttype, + 'width=i' => \$imagewidth, + 'height=i' => \$frameheight, + 'encoding=s' => \$encoding, + 'fontsize=f' => \$fontsize, + 'fontwidth=f' => \$fontwidth, + 'minwidth=f' => \$minwidth, + 'title=s' => \$titletext, + 'subtitle=s' => \$subtitletext, + 'nametype=s' => \$nametype, + 'countname=s' => \$countname, + 'nameattr=s' => \$nameattrfile, + 'total=s' => \$timemax, + 'factor=f' => \$factor, + 'colors=s' => \$colors, + 'bgcolors=s' => \$bgcolors, + 'hash' => \$hash, + 'cp' => \$palette, + 'reverse' => \$stackreverse, + 'inverted' => \$inverted, + 'flamechart' => \$flamechart, + 'negate' => \$negate, + 'notes=s' => \$notestext, + 'help' => \$help, +) or usage(); +$help && usage(); + +# internals +my $ypad1 = $fontsize * 3; # pad top, include title +my $ypad2 = $fontsize * 2 + 10; # pad bottom, include labels +my $ypad3 = $fontsize * 2; # pad top, include subtitle (optional) +my $xpad = 10; # pad lefm and right +my $framepad = 1; # vertical padding for frames +my $depthmax = 0; +my %Events; +my %nameattr; + +if ($flamechart && $titletext eq "") { + $titletext = "Flame Chart"; +} + +if ($titletext eq "") { + unless ($inverted) { + $titletext = $titledefault; + } else { + $titletext = $titleinverted; + } +} + +if ($nameattrfile) { + # The name-attribute file format is a function name followed by a tab then + # a sequence of tab separated name=value pairs. + open my $attrfh, $nameattrfile or die "Can't read $nameattrfile: $!\n"; + while (<$attrfh>) { + chomp; + my ($funcname, $attrstr) = split /\t/, $_, 2; + die "Invalid format in $nameattrfile" unless defined $attrstr; + $nameattr{$funcname} = { map { split /=/, $_, 2 } split /\t/, $attrstr }; + } +} + +if ($notestext =~ /[<>]/) { + die "Notes string can't contain < or >" +} + +# background colors: +# - yellow gradient: default (hot, java, js, perl) +# - green gradient: mem +# - blue gradient: io, wakeup, chain +# - gray gradient: flat colors (red, green, blue, ...) +if ($bgcolors eq "") { + # choose a default + if ($colors eq "mem") { + $bgcolors = "green"; + } elsif ($colors =~ /^(io|wakeup|chain)$/) { + $bgcolors = "blue"; + } elsif ($colors =~ /^(red|green|blue|aqua|yellow|purple|orange)$/) { + $bgcolors = "grey"; + } else { + $bgcolors = "yellow"; + } +} +my ($bgcolor1, $bgcolor2); +if ($bgcolors eq "yellow") { + $bgcolor1 = "#eeeeee"; # background color gradient start + $bgcolor2 = "#eeeeb0"; # background color gradient stop +} elsif ($bgcolors eq "blue") { + $bgcolor1 = "#eeeeee"; $bgcolor2 = "#e0e0ff"; +} elsif ($bgcolors eq "green") { + $bgcolor1 = "#eef2ee"; $bgcolor2 = "#e0ffe0"; +} elsif ($bgcolors eq "grey") { + $bgcolor1 = "#f8f8f8"; $bgcolor2 = "#e8e8e8"; +} elsif ($bgcolors =~ /^#......$/) { + $bgcolor1 = $bgcolor2 = $bgcolors; +} else { + die "Unrecognized bgcolor option \"$bgcolors\"" +} + +# SVG functions +{ package SVG; + sub new { + my $class = shift; + my $self = {}; + bless ($self, $class); + return $self; + } + + sub header { + my ($self, $w, $h) = @_; + my $enc_attr = ''; + if (defined $encoding) { + $enc_attr = qq{ encoding="$encoding"}; + } + $self->{svg} .= < + + + + +SVG + } + + sub include { + my ($self, $content) = @_; + $self->{svg} .= $content; + } + + sub colorAllocate { + my ($self, $r, $g, $b) = @_; + return "rgb($r,$g,$b)"; + } + + sub group_start { + my ($self, $attr) = @_; + + my @g_attr = map { + exists $attr->{$_} ? sprintf(qq/$_="%s"/, $attr->{$_}) : () + } qw(id class); + push @g_attr, $attr->{g_extra} if $attr->{g_extra}; + if ($attr->{href}) { + my @a_attr; + push @a_attr, sprintf qq/xlink:href="%s"/, $attr->{href} if $attr->{href}; + # default target=_top else links will open within SVG + push @a_attr, sprintf qq/target="%s"/, $attr->{target} || "_top"; + push @a_attr, $attr->{a_extra} if $attr->{a_extra}; + $self->{svg} .= sprintf qq/\n/, join(' ', (@a_attr, @g_attr)); + } else { + $self->{svg} .= sprintf qq/\n/, join(' ', @g_attr); + } + + $self->{svg} .= sprintf qq/%s<\/title>/, $attr->{title} + if $attr->{title}; # should be first element within g container + } + + sub group_end { + my ($self, $attr) = @_; + $self->{svg} .= $attr->{href} ? qq/<\/a>\n/ : qq/<\/g>\n/; + } + + sub filledRectangle { + my ($self, $x1, $y1, $x2, $y2, $fill, $extra) = @_; + $x1 = sprintf "%0.1f", $x1; + $x2 = sprintf "%0.1f", $x2; + my $w = sprintf "%0.1f", $x2 - $x1; + my $h = sprintf "%0.1f", $y2 - $y1; + $extra = defined $extra ? $extra : ""; + $self->{svg} .= qq/\n/; + } + + sub stringTTF { + my ($self, $id, $x, $y, $str, $extra) = @_; + $x = sprintf "%0.2f", $x; + $id = defined $id ? qq/id="$id"/ : ""; + $extra ||= ""; + $self->{svg} .= qq/$str<\/text>\n/; + } + + sub svg { + my $self = shift; + return "$self->{svg}\n"; + } + 1; +} + +sub namehash { + # Generate a vector hash for the name string, weighting early over + # later characters. We want to pick the same colors for function + # names across different flame graphs. + my $name = shift; + my $vector = 0; + my $weight = 1; + my $max = 1; + my $mod = 10; + # if module name present, trunc to 1st char + $name =~ s/.(.*?)`//; + foreach my $c (split //, $name) { + my $i = (ord $c) % $mod; + $vector += ($i / ($mod++ - 1)) * $weight; + $max += 1 * $weight; + $weight *= 0.70; + last if $mod > 12; + } + return (1 - $vector / $max) +} + +sub color { + my ($type, $hash, $name) = @_; + my ($v1, $v2, $v3); + + if ($hash) { + $v1 = namehash($name); + $v2 = $v3 = namehash(scalar reverse $name); + } else { + $v1 = rand(1); + $v2 = rand(1); + $v3 = rand(1); + } + + # theme palettes + if (defined $type and $type eq "hot") { + my $r = 205 + int(50 * $v3); + my $g = 0 + int(230 * $v1); + my $b = 0 + int(55 * $v2); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "mem") { + my $r = 0; + my $g = 190 + int(50 * $v2); + my $b = 0 + int(210 * $v1); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "io") { + my $r = 80 + int(60 * $v1); + my $g = $r; + my $b = 190 + int(55 * $v2); + return "rgb($r,$g,$b)"; + } + + # multi palettes + if (defined $type and $type eq "java") { + # Handle both annotations (_[j], _[i], ...; which are + # accurate), as well as input that lacks any annotations, as + # best as possible. Without annotations, we get a little hacky + # and match on java|org|com, etc. + if ($name =~ m:_\[j\]$:) { # jit annotation + $type = "green"; + } elsif ($name =~ m:_\[i\]$:) { # inline annotation + $type = "aqua"; + } elsif ($name =~ m:^L?(java|javax|jdk|net|org|com|io|sun)/:) { # Java + $type = "green"; + } elsif ($name =~ /:::/) { # Java, typical perf-map-agent method separator + $type = "green"; + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:_\[k\]$:) { # kernel annotation + $type = "orange"; + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "perl") { + if ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:Perl: or $name =~ m:\.pl:) { # Perl + $type = "green"; + } elsif ($name =~ m:_\[k\]$:) { # kernel + $type = "orange"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "js") { + # Handle both annotations (_[j], _[i], ...; which are + # accurate), as well as input that lacks any annotations, as + # best as possible. Without annotations, we get a little hacky, + # and match on a "/" with a ".js", etc. + if ($name =~ m:_\[j\]$:) { # jit annotation + if ($name =~ m:/:) { + $type = "green"; # source + } else { + $type = "aqua"; # builtin + } + } elsif ($name =~ /::/) { # C++ + $type = "yellow"; + } elsif ($name =~ m:/.*\.js:) { # JavaScript (match "/" in path) + $type = "green"; + } elsif ($name =~ m/:/) { # JavaScript (match ":" in builtin) + $type = "aqua"; + } elsif ($name =~ m/^ $/) { # Missing symbol + $type = "green"; + } elsif ($name =~ m:_\[k\]:) { # kernel + $type = "orange"; + } else { # system + $type = "red"; + } + # fall-through to color palettes + } + if (defined $type and $type eq "wakeup") { + $type = "aqua"; + # fall-through to color palettes + } + if (defined $type and $type eq "chain") { + if ($name =~ m:_\[w\]:) { # waker + $type = "aqua" + } else { # off-CPU + $type = "blue"; + } + # fall-through to color palettes + } + + # color palettes + if (defined $type and $type eq "red") { + my $r = 200 + int(55 * $v1); + my $x = 50 + int(80 * $v1); + return "rgb($r,$x,$x)"; + } + if (defined $type and $type eq "green") { + my $g = 200 + int(55 * $v1); + my $x = 50 + int(60 * $v1); + return "rgb($x,$g,$x)"; + } + if (defined $type and $type eq "blue") { + my $b = 205 + int(50 * $v1); + my $x = 80 + int(60 * $v1); + return "rgb($x,$x,$b)"; + } + if (defined $type and $type eq "yellow") { + my $x = 175 + int(55 * $v1); + my $b = 50 + int(20 * $v1); + return "rgb($x,$x,$b)"; + } + if (defined $type and $type eq "purple") { + my $x = 190 + int(65 * $v1); + my $g = 80 + int(60 * $v1); + return "rgb($x,$g,$x)"; + } + if (defined $type and $type eq "aqua") { + my $r = 50 + int(60 * $v1); + my $g = 165 + int(55 * $v1); + my $b = 165 + int(55 * $v1); + return "rgb($r,$g,$b)"; + } + if (defined $type and $type eq "orange") { + my $r = 190 + int(65 * $v1); + my $g = 90 + int(65 * $v1); + return "rgb($r,$g,0)"; + } + + return "rgb(0,0,0)"; +} + +sub color_scale { + my ($value, $max) = @_; + my ($r, $g, $b) = (255, 255, 255); + $value = -$value if $negate; + if ($value > 0) { + $g = $b = int(210 * ($max - $value) / $max); + } elsif ($value < 0) { + $r = $g = int(210 * ($max + $value) / $max); + } + return "rgb($r,$g,$b)"; +} + +sub color_map { + my ($colors, $func) = @_; + if (exists $palette_map{$func}) { + return $palette_map{$func}; + } else { + $palette_map{$func} = color($colors, $hash, $func); + return $palette_map{$func}; + } +} + +sub write_palette { + open(FILE, ">$pal_file"); + foreach my $key (sort keys %palette_map) { + print FILE $key."->".$palette_map{$key}."\n"; + } + close(FILE); +} + +sub read_palette { + if (-e $pal_file) { + open(FILE, $pal_file) or die "can't open file $pal_file: $!"; + while ( my $line = ) { + chomp($line); + (my $key, my $value) = split("->",$line); + $palette_map{$key}=$value; + } + close(FILE) + } +} + +my %Node; # Hash of merged frame data +my %Tmp; + +# flow() merges two stacks, storing the merged frames and value data in %Node. +sub flow { + my ($last, $this, $v, $d) = @_; + + my $len_a = @$last - 1; + my $len_b = @$this - 1; + + my $i = 0; + my $len_same; + for (; $i <= $len_a; $i++) { + last if $i > $len_b; + last if $last->[$i] ne $this->[$i]; + } + $len_same = $i; + + for ($i = $len_a; $i >= $len_same; $i--) { + my $k = "$last->[$i];$i"; + # a unique ID is constructed from "func;depth;etime"; + # func-depth isn't unique, it may be repeated later. + $Node{"$k;$v"}->{stime} = delete $Tmp{$k}->{stime}; + if (defined $Tmp{$k}->{delta}) { + $Node{"$k;$v"}->{delta} = delete $Tmp{$k}->{delta}; + } + delete $Tmp{$k}; + } + + for ($i = $len_same; $i <= $len_b; $i++) { + my $k = "$this->[$i];$i"; + $Tmp{$k}->{stime} = $v; + if (defined $d) { + $Tmp{$k}->{delta} += $i == $len_b ? $d : 0; + } + } + + return $this; +} + +# parse input +my @Data; +my @SortedData; +my $last = []; +my $time = 0; +my $delta = undef; +my $ignored = 0; +my $line; +my $maxdelta = 1; + +# reverse if needed +foreach (<>) { + chomp; + $line = $_; + if ($stackreverse) { + # there may be an extra samples column for differentials + # XXX todo: redo these REs as one. It's repeated below. + my($stack, $samples) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + my $samples2 = undef; + if ($stack =~ /^(.*)\s+?(\d+(?:\.\d*)?)$/) { + $samples2 = $samples; + ($stack, $samples) = $stack =~ (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + unshift @Data, join(";", reverse split(";", $stack)) . " $samples $samples2"; + } else { + unshift @Data, join(";", reverse split(";", $stack)) . " $samples"; + } + } else { + unshift @Data, $line; + } +} + +if ($flamechart) { + # In flame chart mode, just reverse the data so time moves from left to right. + @SortedData = reverse @Data; +} else { + @SortedData = sort @Data; +} + +# process and merge frames +foreach (@SortedData) { + chomp; + # process: folded_stack count + # eg: func_a;func_b;func_c 31 + my ($stack, $samples) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + unless (defined $samples and defined $stack) { + ++$ignored; + next; + } + + # there may be an extra samples column for differentials: + my $samples2 = undef; + if ($stack =~ /^(.*)\s+?(\d+(?:\.\d*)?)$/) { + $samples2 = $samples; + ($stack, $samples) = $stack =~ (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + } + $delta = undef; + if (defined $samples2) { + $delta = $samples2 - $samples; + $maxdelta = abs($delta) if abs($delta) > $maxdelta; + } + + # for chain graphs, annotate waker frames with "_[w]", for later + # coloring. This is a hack, but has a precedent ("_[k]" from perf). + if ($colors eq "chain") { + my @parts = split ";--;", $stack; + my @newparts = (); + $stack = shift @parts; + $stack .= ";--;"; + foreach my $part (@parts) { + $part =~ s/;/_[w];/g; + $part .= "_[w]"; + push @newparts, $part; + } + $stack .= join ";--;", @parts; + } + + # merge frames and populate %Node: + $last = flow($last, [ '', split ";", $stack ], $time, $delta); + + if (defined $samples2) { + $time += $samples2; + } else { + $time += $samples; + } +} +flow($last, [], $time, $delta); + +warn "Ignored $ignored lines with invalid format\n" if $ignored; +unless ($time) { + warn "ERROR: No stack counts found\n"; + my $im = SVG->new(); + # emit an error message SVG, for tools automating flamegraph use + my $imageheight = $fontsize * 5; + $im->header($imagewidth, $imageheight); + $im->stringTTF(undef, int($imagewidth / 2), $fontsize * 2, + "ERROR: No valid input provided to flamegraph.pl."); + print $im->svg; + exit 2; +} +if ($timemax and $timemax < $time) { + warn "Specified --total $timemax is less than actual total $time, so ignored\n" + if $timemax/$time > 0.02; # only warn is significant (e.g., not rounding etc) + undef $timemax; +} +$timemax ||= $time; + +my $widthpertime = ($imagewidth - 2 * $xpad) / $timemax; +my $minwidth_time = $minwidth / $widthpertime; + +# prune blocks that are too narrow and determine max depth +while (my ($id, $node) = each %Node) { + my ($func, $depth, $etime) = split ";", $id; + my $stime = $node->{stime}; + die "missing start for $id" if not defined $stime; + + if (($etime-$stime) < $minwidth_time) { + delete $Node{$id}; + next; + } + $depthmax = $depth if $depth > $depthmax; +} + +# draw canvas, and embed interactive JavaScript program +my $imageheight = (($depthmax + 1) * $frameheight) + $ypad1 + $ypad2; +$imageheight += $ypad3 if $subtitletext ne ""; +my $titlesize = $fontsize + 5; +my $im = SVG->new(); +my ($black, $vdgrey, $dgrey) = ( + $im->colorAllocate(0, 0, 0), + $im->colorAllocate(160, 160, 160), + $im->colorAllocate(200, 200, 200), + ); +$im->header($imagewidth, $imageheight); +my $inc = < + + + + + + + +INC +$im->include($inc); +$im->filledRectangle(0, 0, $imagewidth, $imageheight, 'url(#background)'); +$im->stringTTF("title", int($imagewidth / 2), $fontsize * 2, $titletext); +$im->stringTTF("subtitle", int($imagewidth / 2), $fontsize * 4, $subtitletext) if $subtitletext ne ""; +$im->stringTTF("details", $xpad, $imageheight - ($ypad2 / 2), " "); +$im->stringTTF("unzoom", $xpad, $fontsize * 2, "Reset Zoom", 'class="hide"'); +$im->stringTTF("search", $imagewidth - $xpad - 100, $fontsize * 2, "Search"); +$im->stringTTF("ignorecase", $imagewidth - $xpad - 16, $fontsize * 2, "ic"); +$im->stringTTF("matched", $imagewidth - $xpad - 100, $imageheight - ($ypad2 / 2), " "); + +if ($palette) { + read_palette(); +} + +# draw frames +$im->group_start({id => "frames"}); +while (my ($id, $node) = each %Node) { + my ($func, $depth, $etime) = split ";", $id; + my $stime = $node->{stime}; + my $delta = $node->{delta}; + + $etime = $timemax if $func eq "" and $depth == 0; + + my $x1 = $xpad + $stime * $widthpertime; + my $x2 = $xpad + $etime * $widthpertime; + my ($y1, $y2); + unless ($inverted) { + $y1 = $imageheight - $ypad2 - ($depth + 1) * $frameheight + $framepad; + $y2 = $imageheight - $ypad2 - $depth * $frameheight; + } else { + $y1 = $ypad1 + $depth * $frameheight; + $y2 = $ypad1 + ($depth + 1) * $frameheight - $framepad; + } + + my $samples = sprintf "%.0f", ($etime - $stime) * $factor; + (my $samples_txt = $samples) # add commas per perlfaq5 + =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; + + my $info; + if ($func eq "" and $depth == 0) { + $info = "all ($samples_txt $countname, 100%)"; + } else { + my $pct = sprintf "%.2f", ((100 * $samples) / ($timemax * $factor)); + my $escaped_func = $func; + # clean up SVG breaking characters: + $escaped_func =~ s/&/&/g; + $escaped_func =~ s//>/g; + $escaped_func =~ s/"/"/g; + $escaped_func =~ s/_\[[kwij]\]$//; # strip any annotation + unless (defined $delta) { + $info = "$escaped_func ($samples_txt $countname, $pct%)"; + } else { + my $d = $negate ? -$delta : $delta; + my $deltapct = sprintf "%.2f", ((100 * $d) / ($timemax * $factor)); + $deltapct = $d > 0 ? "+$deltapct" : $deltapct; + $info = "$escaped_func ($samples_txt $countname, $pct%; $deltapct%)"; + } + } + + my $nameattr = { %{ $nameattr{$func}||{} } }; # shallow clone + $nameattr->{title} ||= $info; + $im->group_start($nameattr); + + my $color; + if ($func eq "--") { + $color = $vdgrey; + } elsif ($func eq "-") { + $color = $dgrey; + } elsif (defined $delta) { + $color = color_scale($delta, $maxdelta); + } elsif ($palette) { + $color = color_map($colors, $func); + } else { + $color = color($colors, $hash, $func); + } + $im->filledRectangle($x1, $y1, $x2, $y2, $color, 'rx="2" ry="2"'); + + my $chars = int( ($x2 - $x1) / ($fontsize * $fontwidth)); + my $text = ""; + if ($chars >= 3) { # room for one char plus two dots + $func =~ s/_\[[kwij]\]$//; # strip any annotation + $text = substr $func, 0, $chars; + substr($text, -2, 2) = ".." if $chars < length $func; + $text =~ s/&/&/g; + $text =~ s//>/g; + } + $im->stringTTF(undef, $x1 + 3, 3 + ($y1 + $y2) / 2, $text); + + $im->group_end($nameattr); +} +$im->group_end(); + +print $im->svg; + +if ($palette) { + write_palette(); +} + +# vim: ts=8 sts=8 sw=8 noexpandtab diff --git a/tools/FlameGraph/jmaps b/tools/FlameGraph/jmaps new file mode 100755 index 0000000..f8014f5 --- /dev/null +++ b/tools/FlameGraph/jmaps @@ -0,0 +1,104 @@ +#!/bin/bash +# +# jmaps - creates java /tmp/perf-PID.map symbol maps for all java processes. +# +# This is a helper script that finds all running "java" processes, then executes +# perf-map-agent on them all, creating symbol map files in /tmp. These map files +# are read by perf_events (aka "perf") when doing system profiles (specifically, +# the "report" and "script" subcommands). +# +# USAGE: jmaps [-u] +# -u # unfoldall: include inlined symbols +# +# My typical workflow is this: +# +# perf record -F 99 -a -g -- sleep 30; jmaps +# perf script > out.stacks +# ./stackcollapse-perf.pl out.stacks | ./flamegraph.pl --color=java --hash > out.stacks.svg +# +# The stackcollapse-perf.pl and flamegraph.pl programs come from: +# https://github.com/brendangregg/FlameGraph +# +# REQUIREMENTS: +# Tune two environment settings below. +# +# 13-Feb-2015 Brendan Gregg Created this. +# 20-Feb-2017 " " Added -u for unfoldall. + +JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-8-oracle} +AGENT_HOME=${AGENT_HOME:-/usr/lib/jvm/perf-map-agent} # from https://github.com/jvm-profiling-tools/perf-map-agent +debug=0 + +if [[ "$USER" != root ]]; then + echo "ERROR: not root user? exiting..." + exit +fi + +if [[ ! -x $JAVA_HOME ]]; then + echo "ERROR: JAVA_HOME not set correctly; edit $0 and fix" + exit +fi + +if [[ ! -x $AGENT_HOME ]]; then + echo "ERROR: AGENT_HOME not set correctly; edit $0 and fix" + exit +fi + +if [[ "$1" == "-u" ]]; then + opts=unfoldall +fi + +# figure out where the agent files are: +AGENT_OUT="" +AGENT_JAR="" +if [[ -e $AGENT_HOME/out/attach-main.jar ]]; then + AGENT_JAR=$AGENT_HOME/out/attach-main.jar +elif [[ -e $AGENT_HOME/attach-main.jar ]]; then + AGENT_JAR=$AGENT_HOME/attach-main.jar +fi +if [[ -e $AGENT_HOME/out/libperfmap.so ]]; then + AGENT_OUT=$AGENT_HOME/out +elif [[ -e $AGENT_HOME/libperfmap.so ]]; then + AGENT_OUT=$AGENT_HOME +fi +if [[ "$AGENT_OUT" == "" || "$AGENT_JAR" == "" ]]; then + echo "ERROR: Missing perf-map-agent files in $AGENT_HOME. Check installation." + exit +fi + +# Fetch map for all "java" processes +echo "Fetching maps for all java processes..." +for pid in $(pgrep -x java); do + mapfile=/tmp/perf-$pid.map + [[ -e $mapfile ]] && rm $mapfile + + cmd="cd $AGENT_OUT; $JAVA_HOME/bin/java -Xms32m -Xmx128m -cp $AGENT_JAR:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $pid $opts" + (( debug )) && echo $cmd + + user=$(ps ho user -p $pid) + group=$(ps ho group -p $pid) + if [[ "$user" != root ]]; then + if [[ "$user" == [0-9]* ]]; then + # UID only, likely GID too, run sudo with #UID: + cmd="sudo -u '#'$user -g '#'$group sh -c '$cmd'" + else + cmd="sudo -u $user -g $group sh -c '$cmd'" + fi + fi + + echo "Mapping PID $pid (user $user):" + if (( debug )); then + time eval $cmd + else + eval $cmd + fi + if [[ -e "$mapfile" ]]; then + chown root $mapfile + chmod 666 $mapfile + else + echo "ERROR: $mapfile not created." + fi + + echo "wc(1): $(wc $mapfile)" + echo +done diff --git a/tools/FlameGraph/pkgsplit-perf.pl b/tools/FlameGraph/pkgsplit-perf.pl new file mode 100755 index 0000000..3a9902d --- /dev/null +++ b/tools/FlameGraph/pkgsplit-perf.pl @@ -0,0 +1,86 @@ +#!/usr/bin/perl -w +# +# pkgsplit-perf.pl Split IP samples on package names "/", eg, Java. +# +# This is for the creation of Java package flame graphs. Example steps: +# +# perf record -F 199 -a -- sleep 30; ./jmaps +# perf script | ./pkgsplit-perf.pl | ./flamegraph.pl > out.svg +# +# Note that stack traces are not sampled (no -g), as we split Java package +# names into frames rather than stack frames. +# +# (jmaps is a helper script for automating perf-map-agent: Java symbol dumps.) +# +# The default output of "perf script" varies between kernel versions, so we'll +# need to deal with that here. I could make people use the perf script option +# to pick fields, so our input is static, but A) I prefer the simplicity of +# just saying: run "perf script", and B) the option to choose fields itself +# changed between kernel versions! -f became -F. +# +# Copyright 2017 Netflix, Inc. +# Licensed under the Apache License, Version 2.0 (the "License") +# +# 20-Sep-2016 Brendan Gregg Created this. + +use strict; + +my $include_pname = 1; # include process names in stacks +my $include_pid = 0; # include process ID with process name +my $include_tid = 0; # include process & thread ID with process name + +while (<>) { + # filter comments + next if /^#/; + + # filter idle events + next if /xen_hypercall_sched_op|cpu_idle|native_safe_halt/; + + my ($pid, $tid, $pname); + + # Linux 3.13: + # java 13905 [000] 8048.096572: cpu-clock: 7fd781ac3053 Ljava/util/Arrays$ArrayList;::toArray (/tmp/perf-12149.map) + # java 8301 [050] 13527.392454: cycles: 7fa8a80d9bff Dictionary::find(int, unsigned int, Symbol*, ClassLoaderData*, Handle, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.121/jre/lib/amd64/server/libjvm.so) + # java 4567/8603 [023] 13527.389886: cycles: 7fa863349895 Lcom/google/gson/JsonObject;::add (/tmp/perf-4567.map) + # + # Linux 4.8: + # java 30894 [007] 452884.077440: 10101010 cpu-clock: 7f0acc8eff67 Lsun/nio/ch/SocketChannelImpl;::read+0x27 (/tmp/perf-30849.map) + # bash 26858/26858 [006] 5440237.995639: cpu-clock: 433573 [unknown] (/bin/bash) + # + if (/^\s+(\S.+?)\s+(\d+)\/*(\d+)*\s.*?:.*:/) { + # parse process name and pid/tid + if ($3) { + ($pid, $tid) = ($2, $3); + } else { + ($pid, $tid) = ("?", $2); + } + + if ($include_tid) { + $pname = "$1-$pid/$tid"; + } elsif ($include_pid) { + $pname = "$1-$pid"; + } else { + $pname = $1; + } + $pname =~ tr/ /_/; + } else { + # not a match + next; + } + + # parse rest of line + s/^.*?:.*?:\s+//; + s/ \(.*?\)$//; + chomp; + my ($addr, $func) = split(' ', $_, 2); + + # strip Java's leading "L" + $func =~ s/^L//; + + # replace numbers with X + $func =~ s/[0-9]/X/g; + + # colon delimitered + $func =~ s:/:;:g; + print "$pname;$func 1\n"; +} diff --git a/tools/FlameGraph/range-perf.pl b/tools/FlameGraph/range-perf.pl new file mode 100755 index 0000000..0fca6de --- /dev/null +++ b/tools/FlameGraph/range-perf.pl @@ -0,0 +1,137 @@ +#!/usr/bin/perl -w +# +# range-perf Extract a time range from Linux "perf script" output. +# +# USAGE EXAMPLE: +# +# perf record -F 100 -a -- sleep 60 +# perf script | ./perf2range.pl 10 20 # range 10 to 20 seconds only +# perf script | ./perf2range.pl 0 0.5 # first half second only +# +# MAKING A SERIES OF FLAME GRAPHS: +# +# Let's say you had the output of "perf script" in a file, out.stacks01, which +# was for a 180 second profile. The following command creates a series of +# flame graphs for each 10 second interval: +# +# for i in `seq 0 10 170`; do cat out.stacks01 | \ +# ./perf2range.pl $i $((i + 10)) | ./stackcollapse-perf.pl | \ +# grep -v cpu_idle | ./flamegraph.pl --hash --color=java \ +# --title="range $i $((i + 10))" > out.range_$i.svg; echo $i done; done +# +# In that example, I used "--color=java" for the Java palette, and excluded +# the idle CPU task. Customize as needed. +# +# Copyright 2017 Netflix, Inc. +# Licensed under the Apache License, Version 2.0 (the "License") +# +# 21-Feb-2017 Brendan Gregg Created this. + +use strict; +use Getopt::Long; +use POSIX 'floor'; + +sub usage { + die < \$timeraw, + 'timezerosecs' => \$timezerosecs, +) or usage(); + +if (@ARGV < 2 || $ARGV[0] eq "-h" || $ARGV[0] eq "--help") { + usage(); + exit; +} +my $begin = $ARGV[0]; +my $end = $ARGV[1]; + +# +# Parsing +# +# IP only examples: +# +# java 52025 [026] 99161.926202: cycles: +# java 14341 [016] 252732.474759: cycles: 7f36571947c0 nmethod::is_nmethod() const (/... +# java 14514 [022] 28191.353083: cpu-clock: 7f92b4fdb7d4 Ljava_util_List$size$0;::call (/tmp/perf-11936.map) +# swapper 0 [002] 6035557.056977: 10101010 cpu-clock: ffffffff810013aa xen_hypercall_sched_op+0xa (/lib/modules/4.9-virtual/build/vmlinux) +# bash 25370 603are 6036.991603: 10101010 cpu-clock: 4b931e [unknown] (/bin/bash) +# bash 25370/25370 6036036.799684: cpu-clock: 4b913b [unknown] (/bin/bash) +# other combinations are possible. +# +# Stack examples (-g): +# +# swapper 0 [021] 28648.467059: cpu-clock: +# ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) +# ffffffff8101cb2f default_idle ([kernel.kallsyms]) +# ffffffff8101d406 arch_cpu_idle ([kernel.kallsyms]) +# ffffffff810bf475 cpu_startup_entry ([kernel.kallsyms]) +# ffffffff81010228 cpu_bringup_and_idle ([kernel.kallsyms]) +# +# java 14375 [022] 28648.467079: cpu-clock: +# 7f92bdd98965 Ljava/io/OutputStream;::write (/tmp/perf-11936.map) +# 7f8808cae7a8 [unknown] ([unknown]) +# +# swapper 0 [005] 5076.836336: cpu-clock: +# ffffffff81051586 native_safe_halt ([kernel.kallsyms]) +# ffffffff8101db4f default_idle ([kernel.kallsyms]) +# ffffffff8101e466 arch_cpu_idle ([kernel.kallsyms]) +# ffffffff810c2b31 cpu_startup_entry ([kernel.kallsyms]) +# ffffffff810427cd start_secondary ([kernel.kallsyms]) +# +# swapper 0 [002] 6034779.719110: 10101010 cpu-clock: +# 2013aa xen_hypercall_sched_op+0xfe20000a (/lib/modules/4.9-virtual/build/vmlinux) +# a72f0e default_idle+0xfe20001e (/lib/modules/4.9-virtual/build/vmlinux) +# 2392bf arch_cpu_idle+0xfe20000f (/lib/modules/4.9-virtual/build/vmlinux) +# a73333 default_idle_call+0xfe200023 (/lib/modules/4.9-virtual/build/vmlinux) +# 2c91a4 cpu_startup_entry+0xfe2001c4 (/lib/modules/4.9-virtual/build/vmlinux) +# 22b64a cpu_bringup_and_idle+0xfe20002a (/lib/modules/4.9-virtual/build/vmlinux) +# +# bash 25370/25370 6035935.188539: cpu-clock: +# b9218 [unknown] (/bin/bash) +# 2037fe8 [unknown] ([unknown]) +# other combinations are possible. +# +# This regexp matches the event line, and puts time in $1, and the event name +# in $2: +# +my $event_regexp = qr/ +([0-9\.]+): *\S* *(\S+):/; + +my $line; +my $start = 0; +my $ok = 0; +my $time; + +while (1) { + $line = ; + last unless defined $line; + next if $line =~ /^#/; # skip comments + + if ($line =~ $event_regexp) { + my ($ts, $event) = ($1, $2, $3); + $start = $ts if $start == 0; + + if ($timezerosecs) { + $time = $ts - floor($start); + } elsif (!$timeraw) { + $time = $ts - $start; + } else { + $time = $ts; # raw times + } + + $ok = 1 if $time >= $begin; + # assume samples are in time order: + exit if $time > $end; + } + + print $line if $ok; +} diff --git a/tools/FlameGraph/record-test.sh b/tools/FlameGraph/record-test.sh new file mode 100755 index 0000000..569ecc9 --- /dev/null +++ b/tools/FlameGraph/record-test.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# +# record-test.sh - Overwrite flame graph test result files. +# +# See test.sh, which checks these resulting files. +# +# Currently only tests stackcollapse-perf.pl. + +set -v -x + +# ToDo: add some form of --inline, and --inline --context tests. These are +# tricky since they use addr2line, whose output will vary based on the test +# system's binaries and symbol tables. +for opt in pid tid kernel jit all addrs; do + for testfile in test/*.txt ; do + echo testing $testfile : $opt + outfile=${testfile#*/} + outfile=test/results/${outfile%.txt}"-collapsed-${opt}.txt" + ./stackcollapse-perf.pl --"${opt}" "${testfile}" 2> /dev/null > $outfile + done +done diff --git a/tools/FlameGraph/stackcollapse-aix.pl b/tools/FlameGraph/stackcollapse-aix.pl new file mode 100755 index 0000000..8456d56 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-aix.pl @@ -0,0 +1,61 @@ +#!/usr/bin/perl -ws +# +# stackcollapse-aix Collapse AIX /usr/bin/procstack backtraces +# +# Parse a list of backtraces as generated with the poor man's aix-perf.pl +# profiler +# + +use strict; + +my $process = ""; +my $current = ""; +my $previous_function = ""; + +my %stacks; + +while(<>) { + chomp; + if (m/^\d+:/) { + if(!($current eq "")) { + $current = $process . ";" . $current; + $stacks{$current} += 1; + $current = ""; + } + m/^\d+: ([^ ]*)/; + $process = $1; + $current = ""; + } + elsif(m/^---------- tid# \d+/){ + if(!($current eq "")) { + $current = $process . ";" . $current; + $stacks{$current} += 1; + } + $current = ""; + } + elsif(m/^(0x[0-9abcdef]*) *([^ ]*) ([^ ]*) ([^ ]*)/) { + my $function = $2; + my $alt = $1; + $function=~s/\(.*\)?//; + if($function =~ /^\[.*\]$/) { + $function = $alt; + } + if ($current) { + $current = $function . ";" . $current; + } + else { + $current = $function; + } + } +} + +if(!($current eq "")) { + $current = $process . ";" . $current; + $stacks{$current} += 1; + $current = ""; + $process = ""; +} + +foreach my $k (sort { $a cmp $b } keys %stacks) { + print "$k $stacks{$k}\n"; +} diff --git a/tools/FlameGraph/stackcollapse-bpftrace.pl b/tools/FlameGraph/stackcollapse-bpftrace.pl new file mode 100755 index 0000000..f458c3e --- /dev/null +++ b/tools/FlameGraph/stackcollapse-bpftrace.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl -w +# +# stackcollapse-bpftrace.pl collapse bpftrace samples into single lines. +# +# USAGE ./stackcollapse-bpftrace.pl infile > outfile +# +# Example input: +# +# @[ +# _raw_spin_lock_bh+0 +# tcp_recvmsg+808 +# inet_recvmsg+81 +# sock_recvmsg+67 +# sock_read_iter+144 +# new_sync_read+228 +# __vfs_read+41 +# vfs_read+142 +# sys_read+85 +# do_syscall_64+115 +# entry_SYSCALL_64_after_hwframe+61 +# ]: 3 +# +# Example output: +# +# entry_SYSCALL_64_after_hwframe+61;do_syscall_64+115;sys_read+85;vfs_read+142;__vfs_read+41;new_sync_read+228;sock_read_iter+144;sock_recvmsg+67;inet_recvmsg+81;tcp_recvmsg+808;_raw_spin_lock_bh+0 3 +# +# Copyright 2018 Peter Sanford. All rights reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# (http://www.gnu.org/copyleft/gpl.html) +# + +use strict; + +my @stack; +my $in_stack = 0; + +foreach (<>) { + chomp; + if (!$in_stack) { + if (/^@\[$/) { + $in_stack = 1; + } elsif (/^@\[,\s(.*)\]: (\d+)/) { + print $1 . " $2\n"; + } + } else { + if (m/^,?\s?(.*)\]: (\d+)/) { + if (length $1) { + push(@stack, $1); + } + print join(';', reverse(@stack)) . " $2\n"; + $in_stack = 0; + @stack = (); + } else { + $_ =~ s/^\s+//; + push(@stack, $_); + } + } +} diff --git a/tools/FlameGraph/stackcollapse-chrome-tracing.py b/tools/FlameGraph/stackcollapse-chrome-tracing.py new file mode 100755 index 0000000..b486978 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-chrome-tracing.py @@ -0,0 +1,144 @@ +#!/usr/bin/python +# +# stackcolllapse-chrome-tracing.py collapse Trace Event Format [1] +# callstack events into single lines. +# +# [1] https://github.com/catapult-project/catapult/wiki/Trace-Event-Format +# +# USAGE: ./stackcollapse-chrome-tracing.py input_json [input_json...] > outfile +# +# Example input: +# +# {"traceEvents":[ +# {"pid":1,"tid":2,"ts":0,"ph":"X","name":"Foo","dur":50}, +# {"pid":1,"tid":2,"ts":10,"ph":"X","name":"Bar","dur":30} +# ]} +# +# Example output: +# +# Foo 20.0 +# Foo;Bar 30.0 +# +# Input may contain many stack trace events from many processes/threads. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 4-Jan-2018 Marcin Kolny Created this. +import argparse +import json + +stack_identifiers = {} + + +class Event: + def __init__(self, label, timestamp, dur): + self.label = label + self.timestamp = timestamp + self.duration = dur + self.total_duration = dur + + def get_stop_timestamp(self): + return self.timestamp + self.duration + + +def cantor_pairing(a, b): + s = a + b + return s * (s + 1) / 2 + b + + +def get_trace_events(trace_file, events_dict): + json_data = json.load(trace_file) + + for entry in json_data['traceEvents']: + if entry['ph'] == 'X': + cantor_val = cantor_pairing(int(entry['tid']), int(entry['pid'])) + if 'dur' not in entry: + continue + if cantor_val not in events_dict: + events_dict[cantor_val] = [] + events_dict[cantor_val].append(Event(entry['name'], float(entry['ts']), float(entry['dur']))) + + +def load_events(trace_files): + events = {} + + for trace_file in trace_files: + get_trace_events(trace_file, events) + + for key in events: + events[key].sort(key=lambda x: x.timestamp) + + return events + + +def save_stack(stack): + first = True + event = None + identifier = '' + + for event in stack: + if first: + first = False + else: + identifier += ';' + identifier += event.label + + if not event: + return + + if identifier in stack_identifiers: + stack_identifiers[identifier] += event.total_duration + else: + stack_identifiers[identifier] = event.total_duration + + +def load_stack_identifiers(events): + event_stack = [] + + for e in events: + if not event_stack: + event_stack.append(e) + else: + while event_stack and event_stack[-1].get_stop_timestamp() <= e.timestamp: + save_stack(event_stack) + event_stack.pop() + + if event_stack: + event_stack[-1].total_duration -= e.duration + + event_stack.append(e) + + while event_stack: + save_stack(event_stack) + event_stack.pop() + + +parser = argparse.ArgumentParser() +parser.add_argument('input_file', nargs='+', + type=argparse.FileType('r'), + help='Chrome Tracing input files') +args = parser.parse_args() + +all_events = load_events(args.input_file) +for tid_pid in all_events: + load_stack_identifiers(all_events[tid_pid]) + +for identifiers, duration in stack_identifiers.items(): + print(identifiers + ' ' + str(duration)) diff --git a/tools/FlameGraph/stackcollapse-elfutils.pl b/tools/FlameGraph/stackcollapse-elfutils.pl new file mode 100755 index 0000000..c5e6b17 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-elfutils.pl @@ -0,0 +1,98 @@ +#!/usr/bin/perl -w +# +# stackcollapse-elfutils Collapse elfutils stack (eu-stack) backtraces +# +# Parse a list of elfutils backtraces as generated with the poor man's +# profiler [1]: +# +# for x in $(seq 1 "$nsamples"); do +# eu-stack -p "$pid" "$@" +# sleep "$sleeptime" +# done +# +# [1] http://poormansprofiler.org/ +# +# Copyright 2014 Gabriel Corona. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END + +use strict; +use Getopt::Long; + +my $with_pid = 0; +my $with_tid = 0; + +GetOptions('pid' => \$with_pid, + 'tid' => \$with_tid) +or die < outfile\n + --pid # include PID + --tid # include TID +USAGE_END + +my $pid = ""; +my $tid = ""; +my $current = ""; +my $previous_function = ""; + +my %stacks; + +sub add_current { + if(!($current eq "")) { + my $entry; + if ($with_tid) { + $current = "TID=$tid;$current"; + } + if ($with_pid) { + $current = "PID=$pid;$current"; + } + $stacks{$current} += 1; + $current = ""; + } +} + +while(<>) { + chomp; + if (m/^PID ([0-9]*)/) { + add_current(); + $pid = $1; + } + elsif(m/^TID ([0-9]*)/) { + add_current(); + $tid = $1; + } elsif(m/^#[0-9]* *0x[0-9a-f]* (.*)/) { + if ($current eq "") { + $current = $1; + } else { + $current = "$1;$current"; + } + } elsif(m/^#[0-9]* *0x[0-9a-f]*/) { + if ($current eq "") { + $current = "[unknown]"; + } else { + $current = "[unknown];$current"; + } + } +} +add_current(); + +foreach my $k (sort { $a cmp $b } keys %stacks) { + print "$k $stacks{$k}\n"; +} diff --git a/tools/FlameGraph/stackcollapse-gdb.pl b/tools/FlameGraph/stackcollapse-gdb.pl new file mode 100755 index 0000000..8e9831b --- /dev/null +++ b/tools/FlameGraph/stackcollapse-gdb.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl -ws +# +# stackcollapse-gdb Collapse GDB backtraces +# +# Parse a list of GDB backtraces as generated with the poor man's +# profiler [1]: +# +# for x in $(seq 1 500); do +# gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid 2> /dev/null +# sleep 0.01 +# done +# +# [1] http://poormansprofiler.org/ +# +# Copyright 2014 Gabriel Corona. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END + +use strict; + +my $current = ""; +my $previous_function = ""; + +my %stacks; + +while(<>) { + chomp; + if (m/^Thread/) { + $current="" + } + elsif(m/^#[0-9]* *([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*)/) { + my $function = $3; + my $alt = $1; + if(not($1 =~ /0x[a-zA-Z0-9]*/)) { + $function = $alt; + } + if ($current eq "") { + $current = $function; + } else { + $current = $function . ";" . $current; + } + } elsif(!($current eq "")) { + $stacks{$current} += 1; + $current = ""; + } +} + +if(!($current eq "")) { + $stacks{$current} += 1; + $current = ""; +} + +foreach my $k (sort { $a cmp $b } keys %stacks) { + print "$k $stacks{$k}\n"; +} diff --git a/tools/FlameGraph/stackcollapse-go.pl b/tools/FlameGraph/stackcollapse-go.pl new file mode 100755 index 0000000..3b2ce3c --- /dev/null +++ b/tools/FlameGraph/stackcollapse-go.pl @@ -0,0 +1,150 @@ +#!/usr/bin/perl -w +# +# stackcollapse-go.pl collapse golang samples into single lines. +# +# Parses golang smaples generated by "go tool pprof" and outputs stacks as +# single lines, with methods separated by semicolons, and then a space and an +# occurrence count. For use with flamegraph.pl. +# +# USAGE: ./stackcollapse-go.pl infile > outfile +# +# Example Input: +# ... +# Samples: +# samples/count cpu/nanoseconds +# 1 10000000: 1 2 +# 2 10000000: 3 2 +# 1 10000000: 4 2 +# ... +# Locations +# 1: 0x58b265 scanblock :0 s=0 +# 2: 0x599530 GC :0 s=0 +# 3: 0x58a999 flushptrbuf :0 s=0 +# 4: 0x58d6a8 runtime.MSpan_Sweep :0 s=0 +# ... +# Mappings +# ... +# +# Example Output: +# +# GC;flushptrbuf 2 +# GC;runtime.MSpan_Sweep 1 +# GC;scanblock 1 +# +# Input may contain many stacks as generated from go tool pprof: +# +# go tool pprof -seconds=60 -raw -output=a.pprof http://$ADDR/debug/pprof/profile +# +# For format of text profile, See golang/src/internal/pprof/profile/profile.go +# +# Copyright 2017 Sijie Yang (yangsijie@baidu.com). All rights reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# (http://www.gnu.org/copyleft/gpl.html) +# +# 16-Jan-2017 Sijie Yang Created this. + +use strict; + +use Getopt::Long; + +# tunables +my $help = 0; + +sub usage { + die < outfile\n +USAGE_END +} + +GetOptions( + 'help' => \$help, +) or usage(); +$help && usage(); + +# internals +my $state = "ignore"; +my %stacks; +my %frames; +my %collapsed; + +sub remember_stack { + my ($stack, $count) = @_; + $stacks{$stack} += $count; +} + +# +# Output stack string in required format. For example, for the following samples, +# format_statck() would return GC;runtime.MSpan_Sweep for stack "4 2" +# +# Locations +# 1: 0x58b265 scanblock :0 s=0 +# 2: 0x599530 GC :0 s=0 +# 3: 0x58a999 flushptrbuf :0 s=0 +# 4: 0x58d6a8 runtime.MSpan_Sweep :0 s=0 +# +sub format_statck { + my ($stack) = @_; + my @loc_list = split(/ /, $stack); + + for (my $i=0; $i<=$#loc_list; $i++) { + my $loc_name = $frames{$loc_list[$i]}; + $loc_list[$i] = $loc_name if ($loc_name); + } + return join(";", reverse(@loc_list)); +} + +foreach (<>) { + next if m/^#/; + chomp; + + if ($state eq "ignore") { + if (/Samples:/) { + $state = "sample"; + next; + } + + } elsif ($state eq "sample") { + if (/^\s*([0-9]+)\s*[0-9]+: ([0-9 ]+)/) { + my $samples = $1; + my $stack = $2; + remember_stack($stack, $samples); + } elsif (/Locations/) { + $state = "location"; + next; + } + + } elsif ($state eq "location") { + if (/^\s*([0-9]*): 0x[0-9a-f]+ (M=[0-9]+ )?([^ ]+) .*/) { + my $loc_id = $1; + my $loc_name = $3; + $frames{$loc_id} = $loc_name; + } elsif (/Mappings/) { + $state = "mapping"; + last; + } + } +} + +foreach my $k (keys %stacks) { + my $stack = format_statck($k); + my $count = $stacks{$k}; + $collapsed{$stack} += $count; +} + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + print "$k $collapsed{$k}\n"; +} diff --git a/tools/FlameGraph/stackcollapse-instruments.pl b/tools/FlameGraph/stackcollapse-instruments.pl new file mode 100755 index 0000000..3cbaa87 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-instruments.pl @@ -0,0 +1,34 @@ +#!/usr/bin/perl -w +# +# stackcollapse-instruments.pl +# +# Parses a file containing a call tree as produced by XCode Instruments +# (Edit > Deep Copy) and produces output suitable for flamegraph.pl. +# +# USAGE: ./stackcollapse-instruments.pl infile > outfile + +use strict; + +my @stack = (); + +<>; +foreach (<>) { + chomp; + /\d+\.\d+ (?:min|s|ms)\s+\d+\.\d+%\s+(\d+(?:\.\d+)?) (min|s|ms)\t \t(\s*)(.+)/ or die; + my $func = $4; + my $depth = length ($3); + $stack [$depth] = $4; + foreach my $i (0 .. $depth - 1) { + print $stack [$i]; + print ";"; + } + + my $time = 0 + $1; + if ($2 eq "min") { + $time *= 60*1000; + } elsif ($2 eq "s") { + $time *= 1000; + } + + printf("%s %.0f\n", $func, $time); +} diff --git a/tools/FlameGraph/stackcollapse-java-exceptions.pl b/tools/FlameGraph/stackcollapse-java-exceptions.pl new file mode 100755 index 0000000..19badbc --- /dev/null +++ b/tools/FlameGraph/stackcollapse-java-exceptions.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl -w +# +# stackcolllapse-java-exceptions.pl collapse java exceptions (found in logs) into single lines. +# +# Parses Java error stacks found in a log file and outputs them as +# single lines, with methods separated by semicolons, and then a space and an +# occurrence count. Inspired by stackcollapse-jstack.pl except that it does +# not act as a performance profiler. +# +# It can be useful if a Java process dumps a lot of different stacks in its logs +# and you want to quickly identify the biggest culprits. +# +# USAGE: ./stackcollapse-java-exceptions.pl infile > outfile +# +# Copyright 2018 Paul de Verdiere. All rights reserved. + +use strict; +use Getopt::Long; + +# tunables +my $shorten_pkgs = 0; # shorten package names +my $no_pkgs = 0; # really shorten package names!! +my $help = 0; + +sub usage { + die < outfile\n + --shorten-pkgs : shorten package names + --no-pkgs : suppress package names (makes SVG much more readable) + +USAGE_END +} + +GetOptions( + 'shorten-pkgs!' => \$shorten_pkgs, + 'no-pkgs!' => \$no_pkgs, + 'help' => \$help, +) or usage(); +$help && usage(); + +my %collapsed; + +sub remember_stack { + my ($stack, $count) = @_; + $collapsed{$stack} += $count; +} + +my @stack; + +foreach (<>) { + chomp; + + if (/^\s*at ([^\(]*)/) { + my $func = $1; + if ($shorten_pkgs || $no_pkgs) { + my ($pkgs, $clsFunc) = ( $func =~ m/(.*\.)([^.]+\.[^.]+)$/ ); + $pkgs =~ s/(\w)\w*/$1/g; + $func = $no_pkgs ? $clsFunc: $pkgs . $clsFunc; + } + unshift @stack, $func; + } elsif (@stack ) { + next if m/.*waiting on .*/; + remember_stack(join(";", @stack), 1) if @stack; + undef @stack; + } +} + +remember_stack(join(";", @stack), 1) if @stack; + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + print "$k $collapsed{$k}\n"; +} diff --git a/tools/FlameGraph/stackcollapse-jstack.pl b/tools/FlameGraph/stackcollapse-jstack.pl new file mode 100755 index 0000000..da5740b --- /dev/null +++ b/tools/FlameGraph/stackcollapse-jstack.pl @@ -0,0 +1,176 @@ +#!/usr/bin/perl -w +# +# stackcollapse-jstack.pl collapse jstack samples into single lines. +# +# Parses Java stacks generated by jstack(1) and outputs RUNNABLE stacks as +# single lines, with methods separated by semicolons, and then a space and an +# occurrence count. This also filters some other "RUNNABLE" states that we +# know are probably not running, such as epollWait. For use with flamegraph.pl. +# +# You want this to process the output of at least 100 jstack(1)s. ie, run it +# 100 times with a sleep interval, and append to a file. This is really a poor +# man's Java profiler, due to the overheads of jstack(1), and how it isn't +# capturing stacks asynchronously. For a better profiler, see: +# http://www.brendangregg.com/blog/2014-06-12/java-flame-graphs.html +# +# USAGE: ./stackcollapse-jstack.pl infile > outfile +# +# Example input: +# +# "MyProg" #273 daemon prio=9 os_prio=0 tid=0x00007f273c038800 nid=0xe3c runnable [0x00007f28a30f2000] +# java.lang.Thread.State: RUNNABLE +# at java.net.SocketInputStream.socketRead0(Native Method) +# at java.net.SocketInputStream.read(SocketInputStream.java:121) +# ... +# at java.lang.Thread.run(Thread.java:744) +# +# Example output: +# +# MyProg;java.lang.Thread.run;java.net.SocketInputStream.read;java.net.SocketInputStream.socketRead0 1 +# +# Input may be created and processed using: +# +# i=0; while (( i++ < 200 )); do jstack PID >> out.jstacks; sleep 10; done +# cat out.jstacks | ./stackcollapse-jstack.pl > out.stacks-folded +# +# WARNING: jstack(1) incurs overheads. Test before use, or use a real profiler. +# +# Copyright 2014 Brendan Gregg. All rights reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# (http://www.gnu.org/copyleft/gpl.html) +# +# 14-Sep-2014 Brendan Gregg Created this. + +use strict; + +use Getopt::Long; + +# tunables +my $include_tname = 1; # include thread names in stacks +my $include_tid = 0; # include thread IDs in stacks +my $shorten_pkgs = 0; # shorten package names +my $help = 0; + +sub usage { + die < outfile\n + --include-tname + --no-include-tname # include/omit thread names in stacks (default: include) + --include-tid + --no-include-tid # include/omit thread IDs in stacks (default: omit) + --shorten-pkgs + --no-shorten-pkgs # (don't) shorten package names (default: don't shorten) + + eg, + $0 --no-include-tname stacks.txt > collapsed.txt +USAGE_END +} + +GetOptions( + 'include-tname!' => \$include_tname, + 'include-tid!' => \$include_tid, + 'shorten-pkgs!' => \$shorten_pkgs, + 'help' => \$help, +) or usage(); +$help && usage(); + + +# internals +my %collapsed; + +sub remember_stack { + my ($stack, $count) = @_; + $collapsed{$stack} += $count; +} + +my @stack; +my $tname; +my $state = "?"; + +foreach (<>) { + next if m/^#/; + chomp; + + if (m/^$/) { + # only include RUNNABLE states + goto clear if $state ne "RUNNABLE"; + + # save stack + if (defined $tname) { unshift @stack, $tname; } + remember_stack(join(";", @stack), 1) if @stack; +clear: + undef @stack; + undef $tname; + $state = "?"; + next; + } + + # + # While parsing jstack output, the $state variable may be altered from + # RUNNABLE to other states. This causes the stacks to be filtered later, + # since only RUNNABLE stacks are included. + # + + if (/^"([^"]*)/) { + my $name = $1; + + if ($include_tname) { + $tname = $name; + unless ($include_tid) { + $tname =~ s/-\d+$//; + } + } + + # set state for various background threads + $state = "BACKGROUND" if $name =~ /C. CompilerThread/; + $state = "BACKGROUND" if $name =~ /Signal Dispatcher/; + $state = "BACKGROUND" if $name =~ /Service Thread/; + $state = "BACKGROUND" if $name =~ /Attach Listener/; + + } elsif (/java.lang.Thread.State: (\S+)/) { + $state = $1 if $state eq "?"; + } elsif (/^\s*at ([^\(]*)/) { + my $func = $1; + if ($shorten_pkgs) { + my ($pkgs, $clsFunc) = ( $func =~ m/(.*\.)([^.]+\.[^.]+)$/ ); + $pkgs =~ s/(\w)\w*/$1/g; + $func = $pkgs . $clsFunc; + } + unshift @stack, $func; + + # fix state for epollWait + $state = "WAITING" if $func =~ /epollWait/; + $state = "WAITING" if $func =~ /EPoll\.wait/; + + + # fix state for various networking functions + $state = "NETWORK" if $func =~ /socketAccept$/; + $state = "NETWORK" if $func =~ /Socket.*accept0$/; + $state = "NETWORK" if $func =~ /socketRead0$/; + + } elsif (/^\s*-/ or /^2\d\d\d-/ or /^Full thread dump/ or + /^JNI global references:/) { + # skip these info lines + next; + } else { + warn "Unrecognized line: $_"; + } +} + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + print "$k $collapsed{$k}\n"; +} diff --git a/tools/FlameGraph/stackcollapse-ljp.awk b/tools/FlameGraph/stackcollapse-ljp.awk new file mode 100755 index 0000000..59aaae3 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-ljp.awk @@ -0,0 +1,74 @@ +#!/usr/bin/awk -f +# +# stackcollapse-ljp.awk collapse lightweight java profile reports +# into single lines stacks. +# +# Parses a list of multiline stacks generated by: +# +# https://code.google.com/p/lightweight-java-profiler +# +# and outputs a semicolon separated stack followed by a space and a count. +# +# USAGE: ./stackcollapse-ljp.pl infile > outfile +# +# Example input: +# +# 42 3 my_func_b(prog.java:455) +# my_func_a(prog.java:123) +# java.lang.Thread.run(Thread.java:744) +# [...] +# +# Example output: +# +# java.lang.Thread.run;my_func_a;my_func_b 42 +# +# The unused number is the number of frames in each stack. +# +# Copyright 2014 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 12-Jun-2014 Brendan Gregg Created this. + +$1 == "Total" { + # We're done. Print last stack and exit. + print stack, count + exit +} + +{ + # Strip file location. Comment this out to keep. + gsub(/\(.*\)/, "") +} + +NF == 3 { + # New stack begins. Print previous buffered stack. + if (count) + print stack, count + + # Begin a new stack. + count = $1 + stack = $3 +} + +NF == 1 { + # Build stack. + stack = $1 ";" stack +} diff --git a/tools/FlameGraph/stackcollapse-perf-sched.awk b/tools/FlameGraph/stackcollapse-perf-sched.awk new file mode 100755 index 0000000..e1a122d --- /dev/null +++ b/tools/FlameGraph/stackcollapse-perf-sched.awk @@ -0,0 +1,228 @@ +#!/usr/bin/awk -f + +# +# This program generates collapsed off-cpu stacks fit for use by flamegraph.pl +# from scheduler data collected via perf_events. +# +# Outputs the cumulative time off cpu in us for each distinct stack observed. +# +# Some awk variables further control behavior: +# +# record_tid If truthy, causes all stack traces to include the +# command and LWP id. +# +# record_wake_stack If truthy, stacks include the frames from the wakeup +# event in addition to the sleep event. +# See http://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html#Wakeup +# +# recurse If truthy, attempt to recursively identify and +# visualize the full wakeup stack chain. +# See http://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html#ChainGraph +# +# Note that this is only an approximation, as only the +# last sleep event is recorded (e.g. if a thread slept +# multiple times before waking another thread, only the +# last sleep event is used). Implies record_wake_stack=1 +# +# To set any of these variables from the command line, run via: +# +# stackcollapse-perf-sched.awk -v recurse=1 +# +# == Important warning == +# +# WARNING: tracing all scheduler events is very high overhead in perf. Even +# more alarmingly, there appear to be bugs in perf that prevent it from reliably +# getting consistent traces (even with large trace buffers), causing it to +# produce empty perf.data files with error messages of the form: +# +# 0x952790 [0x736d]: failed to process type: 3410 +# +# This failure is not determinisitic, so re-executing perf record will +# eventually succeed. +# +# == Usage == +# +# First, record data via perf_events: +# +# sudo perf record -g -e 'sched:sched_switch' \ +# -e 'sched:sched_stat_sleep' -e 'sched:sched_stat_blocked' \ +# -p -o perf.data -- sleep 1 +# +# Then post process with this script: +# +# sudo perf script -f time,comm,pid,tid,event,ip,sym,dso,trace -i perf.data | \ +# stackcollapse-perf-sched.awk -v recurse=1 | \ +# flamegraph.pl --color=io --countname=us >out.svg +# + +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# +# Copyright (c) 2015 by MemSQL. All rights reserved. +# + +# +# Match a perf captured variable, returning just the contents. For example, for +# the following line, get_perf_captured_variable("pid") would return "27235": +# +# swapper 0 [006] 708189.626415: sched:sched_stat_sleep: comm=memsqld pid=27235 delay=100078421 [ns +# +function get_perf_captured_variable(variable) +{ + match($0, variable "=[^[:space:]]+") + return substr($0, RSTART + length(variable) + 1, + RLENGTH - length(variable) - 1) +} + +# +# The timestamp is the first field that ends in a colon, e.g.: +# +# swapper 0 [006] 708189.626415: sched:sched_stat_sleep: comm=memsqld pid=27235 delay=100078421 [ns +# +# or +# +# swapper 0/0 708189.626415: sched:sched_stat_sleep: comm=memsqld pid=27235 delay=100078421 [ns] +# +function get_perf_timestamp() +{ + match($0, " [^ :]+:") + return substr($0, RSTART + 1, RLENGTH - 2) +} + +!/^#/ && /sched:sched_switch/ { + switchcommand = get_perf_captured_variable("comm") + + switchpid = get_perf_captured_variable("prev_pid") + + switchtime=get_perf_timestamp() + + switchstack="" +} + +# +# Strip the function name from a stack entry +# +# Stack entry is expected to be formatted like: +# c60849 MyClass::Foo(unsigned long) (/home/areece/a.out) +# +function get_function_name() +{ + # We start from 2 since we don't need the hex offset. + # We stop at NF - 1 since we don't need the library path. + funcname = $2 + for (i = 3; i <= NF - 1; i++) { + funcname = funcname " " $i + } + return funcname +} + +(switchpid != 0 && /^\s/) { + if (switchstack == "") { + switchstack = get_function_name() + } else { + switchstack = get_function_name() ";" switchstack + } +} + +(switchpid != 0 && /^$/) { + switch_stacks[switchpid] = switchstack + delete last_switch_stacks[switchpid] + switch_time[switchpid] = switchtime + + switchpid=0 + switchcommand="" + switchstack="" +} + +!/^#/ && (/sched:sched_stat_sleep/ || /sched:sched_stat_blocked/) { + wakecommand=$1 + wakepid=$2 + + waketime=get_perf_timestamp() + + stat_next_command = get_perf_captured_variable("comm") + + stat_next_pid = get_perf_captured_variable("pid") + + stat_delay_ns = int(get_perf_captured_variable("delay")) + + wakestack="" +} + +(stat_next_pid != 0 && /^\s/) { + if (wakestack == "") { + wakestack = get_function_name() + } else { + # We build the wakestack in reverse order. + wakestack = wakestack ";" get_function_name() + } +} + +(stat_next_pid != 0 && /^$/) { + # + # For some reason, perf appears to output duplicate + # sched:sched_stat_sleep and sched:sched_stat_blocked events. We only + # handle the first event. + # + if (stat_next_pid in switch_stacks) { + last_wake_time[stat_next_pid] = waketime + + stack = switch_stacks[stat_next_pid] + if (recurse || record_wake_stack) { + stack = stack ";" wakestack + if (record_tid) { + stack = stack ";" wakecommand "-" wakepid + } else { + stack = stack ";" wakecommand + } + } + + if (recurse) { + if (last_wake_time[wakepid] > last_switch_time[stat_next_pid]) { + stack = stack ";-;" last_switch_stacks[wakepid] + } + last_switch_stacks[stat_next_pid] = stack + } + + delete switch_stacks[stat_next_pid] + + if (record_tid) { + stack_times[stat_next_command "-" stat_next_pid ";" stack] += stat_delay_ns + } else { + stack_times[stat_next_command ";" stack] += stat_delay_ns + } + } + + wakecommand="" + wakepid=0 + stat_next_pid=0 + stat_next_command="" + stat_delay_ms=0 +} + +END { + for (stack in stack_times) { + if (int(stack_times[stack] / 1000) > 0) { + print stack, int(stack_times[stack] / 1000) + } + } +} diff --git a/tools/FlameGraph/stackcollapse-perf.pl b/tools/FlameGraph/stackcollapse-perf.pl new file mode 100755 index 0000000..652b113 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-perf.pl @@ -0,0 +1,435 @@ +#!/usr/bin/perl -w +# +# stackcollapse-perf.pl collapse perf samples into single lines. +# +# Parses a list of multiline stacks generated by "perf script", and +# outputs a semicolon separated stack followed by a space and a count. +# If memory addresses (+0xd) are present, they are stripped, and resulting +# identical stacks are colased with their counts summed. +# +# USAGE: ./stackcollapse-perf.pl [options] infile > outfile +# +# Run "./stackcollapse-perf.pl -h" to list options. +# +# Example input: +# +# swapper 0 [000] 158665.570607: cpu-clock: +# ffffffff8103ce3b native_safe_halt ([kernel.kallsyms]) +# ffffffff8101c6a3 default_idle ([kernel.kallsyms]) +# ffffffff81013236 cpu_idle ([kernel.kallsyms]) +# ffffffff815bf03e rest_init ([kernel.kallsyms]) +# ffffffff81aebbfe start_kernel ([kernel.kallsyms].init.text) +# [...] +# +# Example output: +# +# swapper;start_kernel;rest_init;cpu_idle;default_idle;native_safe_halt 1 +# +# Input may be created and processed using: +# +# perf record -a -g -F 997 sleep 60 +# perf script | ./stackcollapse-perf.pl > out.stacks-folded +# +# The output of "perf script" should include stack traces. If these are missing +# for you, try manually selecting the perf script output; eg: +# +# perf script -f comm,pid,tid,cpu,time,event,ip,sym,dso,trace | ... +# +# This is also required for the --pid or --tid options, so that the output has +# both the PID and TID. +# +# Copyright 2012 Joyent, Inc. All rights reserved. +# Copyright 2012 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 02-Mar-2012 Brendan Gregg Created this. +# 02-Jul-2014 " " Added process name to stacks. + +use strict; +use Getopt::Long; + +my %collapsed; + +sub remember_stack { + my ($stack, $count) = @_; + $collapsed{$stack} += $count; +} +my $annotate_kernel = 0; # put an annotation on kernel function +my $annotate_jit = 0; # put an annotation on jit symbols +my $annotate_all = 0; # enale all annotations +my $include_pname = 1; # include process names in stacks +my $include_pid = 0; # include process ID with process name +my $include_tid = 0; # include process & thread ID with process name +my $include_addrs = 0; # include raw address where a symbol can't be found +my $tidy_java = 1; # condense Java signatures +my $tidy_generic = 1; # clean up function names a little +my $target_pname; # target process name from perf invocation +my $event_filter = ""; # event type filter, defaults to first encountered event +my $event_defaulted = 0; # whether we defaulted to an event (none provided) +my $event_warning = 0; # if we printed a warning for the event + +my $show_inline = 0; +my $show_context = 0; + +my $srcline_in_input = 0; # if there are extra lines with source location (perf script -F+srcline) +GetOptions('inline' => \$show_inline, + 'context' => \$show_context, + 'srcline' => \$srcline_in_input, + 'pid' => \$include_pid, + 'kernel' => \$annotate_kernel, + 'jit' => \$annotate_jit, + 'all' => \$annotate_all, + 'tid' => \$include_tid, + 'addrs' => \$include_addrs, + 'event-filter=s' => \$event_filter) +or die < outfile\n + --pid # include PID with process names [1] + --tid # include TID and PID with process names [1] + --inline # un-inline using addr2line + --all # all annotations (--kernel --jit) + --kernel # annotate kernel functions with a _[k] + --jit # annotate jit functions with a _[j] + --context # adds source context to --inline + --srcline # parses output of 'perf script -F+srcline' and adds source context + --addrs # include raw addresses where symbols can't be found + --event-filter=EVENT # event name filter\n +[1] perf script must emit both PID and TIDs for these to work; eg, Linux < 4.1: + perf script -f comm,pid,tid,cpu,time,event,ip,sym,dso,trace + for Linux >= 4.1: + perf script -F comm,pid,tid,cpu,time,event,ip,sym,dso,trace + If you save this output add --header on Linux >= 3.14 to include perf info. +USAGE_END + +if ($annotate_all) { + $annotate_kernel = $annotate_jit = 1; +} + +my %inlineCache; + +my %nmCache; + +sub inlineCacheAdd { + my ($pc, $mod, $result) = @_; + if (defined($inlineCache{$pc})) { + $inlineCache{$pc}{$mod} = $result; + } else { + $inlineCache{$pc} = {$mod => $result}; + } +} + +# for the --inline option +sub inline { + my ($pc, $rawfunc, $mod) = @_; + + return $inlineCache{$pc}{$mod} if defined($inlineCache{$pc}{$mod}); + + # capture addr2line output + my $a2l_output = `addr2line -a $pc -e $mod -i -f -s -C`; + + # remove first line + $a2l_output =~ s/^(.*\n){1}//; + + if ($a2l_output =~ /\?\?\n\?\?:0/) { + # if addr2line fails and rawfunc is func+offset, then fall back to it + if ($rawfunc =~ /^(.+)\+0x([0-9a-f]+)$/) { + my $func = $1; + my $addr = hex $2; + + $nmCache{$mod}=`nm $mod` unless defined $nmCache{$mod}; + + if ($nmCache{$mod} =~ /^([0-9a-f]+) . \Q$func\E$/m) { + my $base = hex $1; + my $newPc = sprintf "0x%x", $base+$addr; + my $result = inline($newPc, '', $mod); + inlineCacheAdd($pc, $mod, $result); + return $result; + } + } + } + + my @fullfunc; + my $one_item = ""; + for (split /^/, $a2l_output) { + chomp $_; + + # remove discriminator info if exists + $_ =~ s/ \(discriminator \S+\)//; + + if ($one_item eq "") { + $one_item = $_; + } else { + if ($show_context == 1) { + unshift @fullfunc, $one_item . ":$_"; + } else { + unshift @fullfunc, $one_item; + } + $one_item = ""; + } + } + + my $result = join ";" , @fullfunc; + + inlineCacheAdd($pc, $mod, $result); + + return $result; +} + +my @stack; +my $pname; +my $m_pid; +my $m_tid; +my $m_period; + +# +# Main loop +# +while (defined($_ = <>)) { + + # find the name of the process launched by perf, by stepping backwards + # over the args to find the first non-option (no dash): + if (/^# cmdline/) { + my @args = split ' ', $_; + foreach my $arg (reverse @args) { + if ($arg !~ /^-/) { + $target_pname = $arg; + $target_pname =~ s:.*/::; # strip pathname + last; + } + } + } + + # skip remaining comments + next if m/^#/; + chomp; + + # end of stack. save cached data. + if (m/^$/) { + # ignore filtered samples + next if not $pname; + + if ($include_pname) { + if (defined $pname) { + unshift @stack, $pname; + } else { + unshift @stack, ""; + } + } + remember_stack(join(";", @stack), $m_period) if @stack; + undef @stack; + undef $pname; + next; + } + + # + # event record start + # + if (/^(\S.+?)\s+(\d+)\/*(\d+)*\s+/) { + # default "perf script" output has TID but not PID + # eg, "java 25607 4794564.109216: 1 cycles:" + # eg, "java 12688 [002] 6544038.708352: 235 cpu-clock:" + # eg, "V8 WorkerThread 25607 4794564.109216: 104345 cycles:" + # eg, "java 24636/25607 [000] 4794564.109216: 1 cycles:" + # eg, "java 12688/12764 6544038.708352: 10309278 cpu-clock:" + # eg, "V8 WorkerThread 24636/25607 [000] 94564.109216: 100 cycles:" + # other combinations possible + my ($comm, $pid, $tid, $period) = ($1, $2, $3, ""); + if (not $tid) { + $tid = $pid; + $pid = "?"; + } + + if (/:\s*(\d+)*\s+(\S+):\s*$/) { + $period = $1; + my $event = $2; + + if ($event_filter eq "") { + # By default only show events of the first encountered + # event type. Merging together different types, such as + # instructions and cycles, produces misleading results. + $event_filter = $event; + $event_defaulted = 1; + } elsif ($event ne $event_filter) { + if ($event_defaulted and $event_warning == 0) { + # only print this warning if necessary: + # when we defaulted and there was + # multiple event types. + print STDERR "Filtering for events of type: $event\n"; + $event_warning = 1; + } + next; + } + } + + if (not $period) { + $period = 1 + } + ($m_pid, $m_tid, $m_period) = ($pid, $tid, $period); + + if ($include_tid) { + $pname = "$comm-$m_pid/$m_tid"; + } elsif ($include_pid) { + $pname = "$comm-$m_pid"; + } else { + $pname = "$comm"; + } + $pname =~ tr/ /_/; + + # + # stack line + # + } elsif (/^\s*(\w+)\s*(.+) \((\S*)\)/) { + # ignore filtered samples + next if not $pname; + + my ($pc, $rawfunc, $mod) = ($1, $2, $3); + + if ($show_inline == 1 && $mod !~ m/(perf-\d+.map|kernel\.|\[[^\]]+\])/) { + my $inlineRes = inline($pc, $rawfunc, $mod); + # - empty result this happens e.g., when $mod does not exist or is a path to a compressed kernel module + # if this happens, the user will see error message from addr2line written to stderr + # - if addr2line results in "??" , then it's much more sane to fall back than produce a '??' in graph + if($inlineRes ne "" and $inlineRes ne "??" and $inlineRes ne "??:??:0" ) { + unshift @stack, $inlineRes; + next; + } + } + + # Linux 4.8 included symbol offsets in perf script output by default, eg: + # 7fffb84c9afc cpu_startup_entry+0x800047c022ec ([kernel.kallsyms]) + # strip these off: + $rawfunc =~ s/\+0x[\da-f]+$//; + + next if $rawfunc =~ /^\(/; # skip process names + + my $is_unknown=0; + my @inline; + for (split /\->/, $rawfunc) { + my $func = $_; + + if ($func eq "[unknown]") { + if ($mod ne "[unknown]") { # use module name instead, if known + $func = $mod; + $func =~ s/.*\///; + } else { + $func = "unknown"; + $is_unknown=1; + } + + if ($include_addrs) { + $func = "\[$func \<$pc\>\]"; + } else { + $func = "\[$func\]"; + } + } + + if ($tidy_generic) { + $func =~ s/;/:/g; + if ($func !~ m/\.\(.*\)\./) { + # This doesn't look like a Go method name (such as + # "net/http.(*Client).Do"), so everything after the first open + # paren (that is not part of an "(anonymous namespace)") is + # just noise. + $func =~ s/\((?!anonymous namespace\)).*//; + } + # now tidy this horrible thing: + # 13a80b608e0a RegExp:[&<>\"\'] (/tmp/perf-7539.map) + $func =~ tr/"\'//d; + # fall through to $tidy_java + } + + if ($tidy_java and $pname eq "java") { + # along with $tidy_generic, converts the following: + # Lorg/mozilla/javascript/ContextFactory;.call(Lorg/mozilla/javascript/ContextAction;)Ljava/lang/Object; + # Lorg/mozilla/javascript/ContextFactory;.call(Lorg/mozilla/javascript/C + # Lorg/mozilla/javascript/MemberBox;.(Ljava/lang/reflect/Method;)V + # into: + # org/mozilla/javascript/ContextFactory:.call + # org/mozilla/javascript/ContextFactory:.call + # org/mozilla/javascript/MemberBox:.init + $func =~ s/^L// if $func =~ m:/:; + } + + # + # Annotations + # + # detect inlined from the @inline array + # detect kernel from the module name; eg, frames to parse include: + # ffffffff8103ce3b native_safe_halt ([kernel.kallsyms]) + # 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + # 7d8 ipv4_conntrack_local+0x7f8f80b8 ([nf_conntrack_ipv4]) + # detect jit from the module name; eg: + # 7f722d142778 Ljava/io/PrintStream;::print (/tmp/perf-19982.map) + if (scalar(@inline) > 0) { + $func .= "_[i]"; # inlined + } elsif ($annotate_kernel == 1 && $mod =~ m/(^\[|vmlinux$)/ && $mod !~ /unknown/) { + $func .= "_[k]"; # kernel + } elsif ($annotate_jit == 1 && $mod =~ m:/tmp/perf-\d+\.map:) { + $func .= "_[j]"; # jitted + } + + # + # Source lines + # + # + # Sample outputs: + # | a.out 35081 252436.005167: 667783 cycles: + # | 408ebb some_method_name+0x8b (/full/path/to/a.out) + # | uniform_int_dist.h:300 + # | 4069f5 main+0x935 (/full/path/to/a.out) + # | file.cpp:137 + # | 7f6d2148eb25 __libc_start_main+0xd5 (/lib64/libc-2.33.so) + # | libc-2.33.so[27b25] + # + # | a.out 35081 252435.738165: 306459 cycles: + # | 7f6d213c2750 [unknown] (/usr/lib64/libkmod.so.2.3.6) + # | libkmod.so.2.3.6[6750] + # + # | a.out 35081 252435.738373: 315813 cycles: + # | 7f6d215ca51b __strlen_avx2+0x4b (/lib64/libc-2.33.so) + # | libc-2.33.so[16351b] + # | 7ffc71ee9580 [unknown] ([unknown]) + # | + # + # | a.out 35081 252435.718940: 247984 cycles: + # | ffffffff814f9302 up_write+0x32 ([kernel.kallsyms]) + # | [kernel.kallsyms][ffffffff814f9302] + if($srcline_in_input and not $is_unknown){ + $_ = <>; + chomp; + s/\[.*?\]//g; + s/^\s*//g; + s/\s*$//g; + $func.=':'.$_ unless $_ eq ""; + } + + push @inline, $func; + } + + unshift @stack, @inline; + } else { + warn "Unrecognized line: $_"; + } +} + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + print "$k $collapsed{$k}\n"; +} diff --git a/tools/FlameGraph/stackcollapse-pmc.pl b/tools/FlameGraph/stackcollapse-pmc.pl new file mode 100755 index 0000000..5bd7c2d --- /dev/null +++ b/tools/FlameGraph/stackcollapse-pmc.pl @@ -0,0 +1,74 @@ +#!/usr/bin/env perl +# +# Copyright (c) 2014 Ed Maste. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# stackcollapse-pmc.pl collapse hwpmc samples into single lines. +# +# Parses a list of multiline stacks generated by "hwpmc -G", and outputs a +# semicolon-separated stack followed by a space and a count. +# +# Usage: +# pmcstat -S unhalted-cycles -O pmc.out +# pmcstat -R pmc.out -z16 -G pmc.graph +# stackcollapse-pmc.pl pmc.graph > pmc.stack +# +# Example input: +# +# 03.07% [17] witness_unlock @ /boot/kernel/kernel +# 70.59% [12] __mtx_unlock_flags +# 16.67% [2] selfdfree +# 100.0% [2] sys_poll +# 100.0% [2] amd64_syscall +# 08.33% [1] pmap_ts_referenced +# 100.0% [1] vm_pageout +# 100.0% [1] fork_exit +# ... +# +# Example output: +# +# amd64_syscall;sys_poll;selfdfree;__mtx_unlock_flags;witness_unlock 2 +# amd64_syscall;sys_poll;pmap_ts_referenced;__mtx_unlock_flagsgeout;fork_exit 1 +# ... + +use warnings; +use strict; + +my @stack; +my $prev_count; +my $prev_indent = -1; + +while (defined($_ = <>)) { + if (m/^( *)[0-9.]+% \[([0-9]+)\]\s*(\S+)/) { + my $indent = length($1); + if ($indent <= $prev_indent) { + print join(';', reverse(@stack[0 .. $prev_indent])) . + " $prev_count\n"; + } + $stack[$indent] = $3; + $prev_count = $2; + $prev_indent = $indent; + } +} +print join(';', reverse(@stack[0 .. $prev_indent])) . " $prev_count\n"; diff --git a/tools/FlameGraph/stackcollapse-recursive.pl b/tools/FlameGraph/stackcollapse-recursive.pl new file mode 100755 index 0000000..9eae545 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-recursive.pl @@ -0,0 +1,60 @@ +#!/usr/bin/perl -ws +# +# stackcollapse-recursive Collapse direct recursive backtraces +# +# Post-process a stack list and merge direct recursive calls: +# +# Example input: +# +# main;recursive;recursive;recursive;helper 1 +# +# Output: +# +# main;recursive;helper 1 +# +# Copyright 2014 Gabriel Corona. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END + +my %stacks; + +while(<>) { + chomp; + my ($stack_, $value) = (/^(.*)\s+?(\d+(?:\.\d*)?)$/); + if ($stack_) { + my @stack = split(/;/, $stack_); + + my @result = (); + my $i; + my $last=""; + for($i=0; $i!=@stack; ++$i) { + if(!($stack[$i] eq $last)) { + $result[@result] = $stack[$i]; + $last = $stack[$i]; + } + } + + $stacks{join(";", @result)} += $value; + } +} + +foreach my $k (sort { $a cmp $b } keys %stacks) { + print "$k $stacks{$k}\n"; +} diff --git a/tools/FlameGraph/stackcollapse-sample.awk b/tools/FlameGraph/stackcollapse-sample.awk new file mode 100755 index 0000000..bafc4af --- /dev/null +++ b/tools/FlameGraph/stackcollapse-sample.awk @@ -0,0 +1,231 @@ +#!/usr/bin/awk -f +# +# Uses MacOS' /usr/bin/sample to generate a flamegraph of a process +# +# Usage: +# +# sudo sample [pid] -file /dev/stdout | stackcollapse-sample.awk | flamegraph.pl +# +# Options: +# +# The output will show the name of the library/framework at the call-site +# with the form AppKit`NSApplication or libsystem`start_wqthread. +# +# If showing the framework or library name is not required, pass +# MODULES=0 as an argument of the sample program. +# +# The generated SVG will be written to the output stream, and can be piped +# into flamegraph.pl directly, or written to a file for conversion later. +# +# --- +# +# Copyright (c) 2017, Apple Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +BEGIN { + + # Command line options + MODULES = 1 # Allows the user to enable/disable printing of modules. + + # Internal variables + _FOUND_STACK = 0 # Found the stack traces in the output. + _LEVEL = -1 # The current level of indentation we are running. + + # The set of symbols to ignore for 'waiting' threads, for ease of use. + # This will hide waiting threads from the view, making it easier to + # see what is actually running in the sample. These may be adjusted + # as necessary or appended to if other symbols need to be filtered out. + + _IGNORE["libsystem_kernel`__psynch_cvwait"] = 1 + _IGNORE["libsystem_kernel`__select"] = 1 + _IGNORE["libsystem_kernel`__semwait_signal"] = 1 + _IGNORE["libsystem_kernel`__ulock_wait"] = 1 + _IGNORE["libsystem_kernel`__wait4"] = 1 + _IGNORE["libsystem_kernel`__workq_kernreturn"] = 1 + _IGNORE["libsystem_kernel`kevent"] = 1 + _IGNORE["libsystem_kernel`mach_msg_trap"] = 1 + _IGNORE["libsystem_kernel`read"] = 1 + _IGNORE["libsystem_kernel`semaphore_wait_trap"] = 1 + + # The same set of symbols as above, without the module name. + _IGNORE["__psynch_cvwait"] = 1 + _IGNORE["__select"] = 1 + _IGNORE["__semwait_signal"] = 1 + _IGNORE["__ulock_wait"] = 1 + _IGNORE["__wait4"] = 1 + _IGNORE["__workq_kernreturn"] = 1 + _IGNORE["kevent"] = 1 + _IGNORE["mach_msg_trap"] = 1 + _IGNORE["read"] = 1 + _IGNORE["semaphore_wait_trap"] = 1 + +} + +# This is the first line in the /usr/bin/sample output that indicates the +# samples follow subsequently. Until we see this line, the rest is ignored. + +/^Call graph/ { + _FOUND_STACK = 1 +} + +# This is found when we have reached the end of the stack output. +# Identified by the string "Total number in stack (...)". + +/^Total number/ { + _FOUND_STACK = 0 + printStack(_NEST,0) +} + +# Prints the stack from FROM to TO (where FROM > TO) +# Called when indenting back from a previous level, or at the end +# of processing to flush the last recorded sample + +function printStack(FROM,TO) { + + # We ignore certain blocking wait states, in the absence of being + # able to filter these threads from collection, otherwise + # we'll end up with many threads of equal length that represent + # the total time the sample was collected. + # + # Note that we need to collect the information to ensure that the + # timekeeping for the parental functions is appropriately adjusted + # so we just avoid printing it out when that occurs. + _PRINT_IT = !_IGNORE[_NAMES[FROM]] + + # We run through all the names, from the root to the leaf, so that + # we generate a line that flamegraph.pl will like, of the form: + # Thread1234;example`main;example`otherFn 1234 + + for(l = FROM; l>=TO; l--) { + if (_PRINT_IT) { + printf("%s", _NAMES[0]) + for(i=1; i<=l; i++) { + printf(";%s", _NAMES[i]) + } + print " " _TIMES[l] + } + + # We clean up our current state to avoid bugs. + delete _NAMES[l] + delete _TIMES[l] + } +} + +# This is where we process each line, of the form: +# 5130 Thread_8749954 +# + 5130 start_wqthread (in libsystem_pthread.dylib) ... +# + 4282 _pthread_wqthread (in libsystem_pthread.dylib) ... +# + ! 4282 __doworkq_kernreturn (in libsystem_kernel.dylib) ... +# + 848 _pthread_wqthread (in libsystem_pthread.dylib) ... +# + 848 __doworkq_kernreturn (in libsystem_kernel.dylib) ... + +_FOUND_STACK && match($0,/^ [^0-9]*[0-9]/) { + + # We maintain two counters: + # _LEVEL: the high water mark of the indentation level we have seen. + # _NEST: the current indentation level. + # + # We keep track of these two levels such that when the nesting level + # decreases, we print out the current state of where we are. + + _NEST=(RLENGTH-5)/2 + sub(/^[^0-9]*/,"") # Normalise the leading content so we start with time. + _TIME=$1 # The time recorded by 'sample', first integer value. + + # The function name is in one or two parts, depending on what kind of + # function it is. + # + # If it is a standard C or C++ function, it will be of the form: + # exampleFunction + # Example::Function + # + # If it is an Objective-C funtion, it will be of the form: + # -[NSExample function] + # +[NSExample staticFunction] + # -[NSExample function:withParameter] + # +[NSExample staticFunction:withParameter:andAnother] + + _FN1 = $2 + _FN2 = $3 + + # If it is a standard C or C++ function then the following word will + # either be blank, or the text '(in', so we jut use the first one: + + if (_FN2 == "(in" || _FN2 == "") { + _FN =_FN1 + } else { + # Otherwise we concatenate the first two parts with . + _FN = _FN1 "." _FN2 + } + + # Modules are shown with '(in libfoo.dylib)' or '(in AppKit)' + + _MODULE = "" + match($0, /\(in [^)]*\)/) + + if (RSTART > 0 && MODULES) { + + # Strip off the '(in ' (4 chars) and the final ')' char (1 char) + _MODULE = substr($0, RSTART+4, RLENGTH-5) + + # Remove the .dylib function, since it adds no value. + gsub(/\.dylib/, "", _MODULE) + + # The function name is 'module`functionName' + _FN = _MODULE "`" _FN + } + + # Now we have set up the variables, we can decide how to apply it + # If we are descending in the nesting, we don't print anything out: + # a + # ab + # abc + # + # We only print out something when we go back a level, or hit the end: + # abcd + # abe < prints out the stack up until this point, i.e. abcd + + # We store a pair of arrays, indexed by the nesting level: + # + # _TIMES - a list of the time reported to that function + # _NAMES - a list of the function names for each current stack trace + + # If we are backtracking, we need to flush the current output. + if (_NEST <= _LEVEL) { + printStack(_LEVEL,_NEST) + } + + # Record the name and time of the function where we are. + _NAMES[_NEST] = _FN + _TIMES[_NEST] = _TIME + + # We subtract the time we took from our parent so we don't double count. + if (_NEST > 0) { + _TIMES[_NEST-1] -= _TIME + } + + # Raise the high water mark of the level we have reached. + _LEVEL = _NEST +} diff --git a/tools/FlameGraph/stackcollapse-stap.pl b/tools/FlameGraph/stackcollapse-stap.pl new file mode 100755 index 0000000..bca4046 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-stap.pl @@ -0,0 +1,84 @@ +#!/usr/bin/perl -w +# +# stackcollapse-stap.pl collapse multiline SystemTap stacks +# into single lines. +# +# Parses a multiline stack followed by a number on a separate line, and +# outputs a semicolon separated stack followed by a space and the number. +# If memory addresses (+0xd) are present, they are stripped, and resulting +# identical stacks are colased with their counts summed. +# +# USAGE: ./stackcollapse.pl infile > outfile +# +# Example input: +# +# 0xffffffff8103ce3b : native_safe_halt+0xb/0x10 [kernel] +# 0xffffffff8101c6a3 : default_idle+0x53/0x1d0 [kernel] +# 0xffffffff81013236 : cpu_idle+0xd6/0x120 [kernel] +# 0xffffffff815bf03e : rest_init+0x72/0x74 [kernel] +# 0xffffffff81aebbfe : start_kernel+0x3ba/0x3c5 [kernel] +# 2404 +# +# Example output: +# +# start_kernel;rest_init;cpu_idle;default_idle;native_safe_halt 2404 +# +# Input may contain many stacks as generated from SystemTap. +# +# Copyright 2011 Joyent, Inc. All rights reserved. +# Copyright 2011 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 16-Feb-2012 Brendan Gregg Created this. + +use strict; + +my %collapsed; + +sub remember_stack { + my ($stack, $count) = @_; + $collapsed{$stack} += $count; +} + +my @stack; + +foreach (<>) { + chomp; + + if (m/^\s*(\d+)+$/) { + remember_stack(join(";", @stack), $1); + @stack = (); + next; + } + + next if (m/^\s*$/); + + my $frame = $_; + $frame =~ s/^\s*//; + $frame =~ s/\+[^+]*$//; + $frame =~ s/.* : //; + $frame = "-" if $frame eq ""; + unshift @stack, $frame; +} + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + printf "$k $collapsed{$k}\n"; +} diff --git a/tools/FlameGraph/stackcollapse-vsprof.pl b/tools/FlameGraph/stackcollapse-vsprof.pl new file mode 100755 index 0000000..a13c1da --- /dev/null +++ b/tools/FlameGraph/stackcollapse-vsprof.pl @@ -0,0 +1,98 @@ +#!/usr/bin/perl -w +# +# stackcollapse-vsprof.pl +# +# Parses the CSV file containing a call tree from a visual studio profiler and produces an output suitable for flamegraph.pl. +# +# USAGE: perl stackcollapse-vsprof.pl infile > outfile +# +# WORKFLOW: +# +# This example assumes you have visual studio 2015 installed. +# +# 1. Profile C++ your application using visual studio +# 2. On visual studio, choose export the call tree as csv +# 3. Generate a flamegraph: perl stackcollapse-vsprof CallTreeSummary.csv | perl flamegraph.pl > result_vsprof.svg +# +# INPUT EXAMPLE : +# +# Level,Function Name,Inclusive Samples,Exclusive Samples,Inclusive Samples %,Exclusive Samples %,Module Name, +# 1,"main","8,735",0,100.00,0.00,"an_executable.exe", +# 2,"testing::UnitTest::Run","8,735",0,100.00,0.00,"an_executable.exe", +# 3,"boost::trim_end_iter_select > >,boost::is_classifiedF>",306,16,3.50,0.18,"an_executable.exe", +# +# OUTPUT EXAMPLE : +# +# main;testing::UnitTest::Run;boost::trim_end_iter_select>>,boost::is_classifiedF> 306 + +use strict; + +sub massage_function_names; +sub parse_integer; +sub print_stack_trace; + +# data initialization +my @stack = (); +my $line_number = 0; +my $previous_samples = 0; + +my $num_args = $#ARGV + 1; +if ($num_args != 1) { + print "$ARGV[0]\n"; + print "Usage : stackcollapse-vsprof.pl > out.txt\n"; + exit; +} + +my $input_csv_file = $ARGV[0]; +my $line_parser_rx = qr{ + ^\s*(\d+?), # level in the stack + ("[^"]+" | [^,]+), # function name (beware of spaces) + ("[^"]+" | [^,]+), # number of samples (beware of locale number formatting) +}ox; + +open(my $fh, '<', $input_csv_file) or die "Can't read file '$input_csv_file' [$!]\n"; + +while (my $current_line = <$fh>){ + $line_number = $line_number + 1; + + # to discard first line which typically contains headers + next if $line_number == 1; + next if $current_line =~ /^\s*$/o; + + ($current_line =~ $line_parser_rx) or die "Error in regular expression at line $line_number : $current_line\n"; + + my $level = int $1; + my $function = massage_function_names($2); + my $samples = parse_integer($3); + my $stack_len = @stack; + + #print "[DEBUG] $line_number : $level $function $samples $stack_len\n"; + + next if not $level; + ($level <= $stack_len + 1) or die "Error in stack at line $line_number : $current_line\n"; + + if ($level <= $stack_len) { + print_stack_trace(\@stack, $previous_samples); + my $to_remove = $level - $stack_len - 1; + splice(@stack, $to_remove); + } + + $stack_len < 1000 or die "Stack overflow at line $line_number"; + push(@stack, $function); + $previous_samples = $samples; +} +print_stack_trace(\@stack, $previous_samples); + +sub massage_function_names { + return ($_[0] =~ s/\s*|^"|"$//gro); +} + +sub parse_integer { + return int ($_[0] =~ s/[., ]|^"|"$//gro); +} + +sub print_stack_trace { + my ($stack_ref, $sample) = @_; + my $stack_trace = join(";", @$stack_ref); + print "$stack_trace $sample\n"; +} diff --git a/tools/FlameGraph/stackcollapse-vtune-mc.pl b/tools/FlameGraph/stackcollapse-vtune-mc.pl new file mode 100755 index 0000000..e132ab0 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-vtune-mc.pl @@ -0,0 +1,103 @@ +#!/usr/bin/perl -w +# +# stackcollapse-vtune-mc.pl +# +# Parses the CSV file containing a call tree from Intel VTune memory-consumption profiler and produces an output suitable for flamegraph.pl. +# +# USAGE: perl stackcollapse-vtune-mc.pl [options] infile > outfile +# +# WORKFLOW: +# +# This assumes you have Intel VTune installed and on path (using Command Line) +# +# 1. Profile C++ application tachyon (example shipped with Intel VTune 2019): +# +# amplxe-cl -collect memory-consumption -r mc_tachyon -- ./tachyon +# +# 2. Export raw VTune data to csv file: +# ### for Intel VTune 2019 +# amplxe-cl -R top-down -call-stack-mode all \ +# -column="Allocations:Self","Allocation Size:Self","Module" \ +# -report-out allocations.csv -format csv \ +# -csv-delimiter comma -r mc_tachyon +# +# 3. Generate a flamegraph: +# ## Generate for allocations amount. +# perl stackcollapse-vtune-mc.pl allocations.csv > out.folded +# perl flamegraph.pl --countname=allocations out.folded > vtune_tachyon_mc.svg +# +# ## Or you can generate for allocation size in bytes. +# perl stackcollapse-vtune-mc.pl -s allocations.csv > out.folded +# perl flamegraph.pl --countname=allocations out.folded > vtune_tachyon_mc_size.svg +# +# AUTHOR: Rohith Bakkannagari +# 27-Nov-2019 UnpluggedCoder Forked from stackcollapse-vtune.pl, for memory-consumption flamegraph + +use strict; +use Getopt::Long; + +sub usage { + die < out.folded\n + --size # Accumulate allocation size in bytes instead of allocation counts.\n +NOTE : The csv file should exported by `amplxe-cl` tool with the exact -column parameter shows below. + amplxe-cl -R top-down -call-stack-mode all \ + -column="Allocations:Self","Allocation Size:Self","Module" \ + -report-out allocations.csv -format csv \ + -csv-delimiter comma -r mc_tachyon +USAGE_END +} + +# data initialization +my @stack = (); +my $rowCounter = 0; # flag for row number + +my $accSize = ''; +GetOptions ('size' => \$accSize) +or usage(); + +my $numArgs = $#ARGV + 1; +if ($numArgs != 1){ + usage(); + exit; +} + +my $inputCSVFile = $ARGV[0]; +open(my $fh, '<', $inputCSVFile) or die "Can't read file '$inputCSVFile' [$!]\n"; + +while (my $currLine = <$fh>){ + # discard warning line + next if $rowCounter == 0 && rindex($currLine, "war:", 0) == 0; + $rowCounter = $rowCounter + 1; + # to discard first row which typically contains headers + next if $rowCounter == 1; + chomp $currLine; + #VTune - sometimes the call stack information is enclosed in double quotes (?). To remove double quotes. + $currLine =~ s/\"//g; + + ### for Intel VTune 2019 + ### CSV header should be like below + ### Function Stack,Allocation Size:Self,Deallocation Size:Self,Allocations:Self,Module + $currLine =~ /(\s*)(.*?),([0-9]*?\.?[0-9]*?),([0-9]*?\.?[0-9]*?),([0-9]*?\.?[0-9]*?),(.*)/ or die "Error in regular expression on the current line $currLine\n"; + my $func = $2.'('.$6.')'; # function(module) + my $depth = length ($1); + my $allocBytes = $3; # allocation size + my $allocs = $5; # allocations + + my $tempString = ''; + $stack [$depth] = $func; + if ($accSize){ + next if $allocBytes eq ''; + foreach my $i (0 .. $depth - 1) { + $tempString = $tempString.$stack[$i].";"; + } + $tempString = $tempString.$func." $allocBytes\n"; + } else { + next if $allocs == 0; + foreach my $i (0 .. $depth - 1) { + $tempString = $tempString.$stack[$i].";"; + } + $tempString = $tempString.$func." $allocs\n"; + } + print "$tempString"; +} diff --git a/tools/FlameGraph/stackcollapse-vtune.pl b/tools/FlameGraph/stackcollapse-vtune.pl new file mode 100644 index 0000000..9488a40 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-vtune.pl @@ -0,0 +1,97 @@ +#!/usr/bin/perl -w +# +# stackcollapse-vtune.pl +# +# Parses the CSV file containing a call tree from Intel VTune hotspots profiler and produces an output suitable for flamegraph.pl. +# +# USAGE: perl stackcollapse-vtune.pl infile > outfile +# +# WORKFLOW: +# +# This assumes you have Intel VTune installed and on path (using Command Line) +# +# 1. Profile C++ application tachyon_find_hotspots (example shipped with Intel VTune 2013): +# +# amplxe-cl -collect hotspots -r result_vtune_tachyon -- ./tachyon_find_hotspots +# +# 2. Export raw VTune data to csv file: +# +##### VTune 2013 & 2015 +# amplxe-cl -R top-down -report-out result_vtune_tachyon.csv -filter "Function Stack" -format csv -csv-delimiter comma -r result_vtune_tachyon +#### VTune 2016 +# amplxe-cl.exe -R top-down -call-stack-mode all -column="CPU Time:Self","Module" -report-output result_vtune_tachyon.csv -filter "Function Stack" -format csv -csv-delimiter comma -r result_vtune_tachyon +# +# 3. Generate a flamegraph: +# +# perl stackcollapse-vtune result_vtune_tachyon.csv | perl flamegraph.pl > result_vtune_tachyon.svg +# +# AUTHOR: Rohith Bakkannagari + +use strict; + +# data initialization +my @stack = (); +my $rowCounter = 0; #flag for row number + +my $numArgs = $#ARGV + 1; +if ($numArgs != 1) +{ +print "$ARGV[0]\n"; +print "Usage : stackcollapse-vtune.pl > out.txt\n"; +exit; +} + +my $inputCSVFile = $ARGV[0]; +my $funcOnly = ''; +my $depth = 0; +my $selfTime = 0; +my $dllName = ''; + +open(my $fh, '<', $inputCSVFile) or die "Can't read file '$inputCSVFile' [$!]\n"; + +while (my $currLine = <$fh>){ + $rowCounter = $rowCounter + 1; + # to discard first row which typically contains headers + next if $rowCounter == 1; + chomp $currLine; + + ### VTune 2013 & 2015 + #VTune - sometimes the call stack information is enclosed in double quotes (?). To remove double quotes. Not necessary for XCode instruments (MAC) + $currLine =~ s/\"//g; + $currLine =~ /(\s*)(.*),(.*),.*,([0-9]*\.?[0-9]+)/ or die "Error in regular expression on the current line\n"; + $dllName = $3; + $func = $dllName.'!'.$2; # Eg : m_lxe.dll!MathWorks::lxe::IrEngineDecorator::Apply + $depth = length ($1); + $selfTime = $4*1000; # selfTime in msec + ### VTune 2013 & 2015 + + ### VTune 2016 + # $currLine =~ /(\s*)(.*?),([0-9]*\.?[0-9]+?),(.*)/ or die "Error in regular expression on the current line $currLine\n"; + # if ($2 =~ /\"/) + # { + # $currLine =~ /(\s*)\"(.*?)\",([0-9]*\.?[0-9]+?),(.*)/ or die "Error in regular expression on the current line $currLine\n"; + # $funcOnly = $2; + # $depth = length ($1); + # $selfTime = $3*1000; # selfTime in msec + # $dllName = $4; + # } + # else + # { + # $funcOnly = $2; + # $depth = length ($1); + # $selfTime = $3*1000; # selfTime in msec + # $dllName = $4; + # } + # my $func = $dllName.'!'.$funcOnly; # Eg : m_lxe.dll!MathWorks::lxe::IrEngineDecorator::Apply + ### VTune 2016 + + my $tempString = ''; + $stack [$depth] = $func; + foreach my $i (0 .. $depth - 1) { + $tempString = $tempString.$stack[$i].";"; + } + $tempString = $tempString.$func." $selfTime\n"; + if ($selfTime != 0){ + print "$tempString"; + } +} diff --git a/tools/FlameGraph/stackcollapse-wcp.pl b/tools/FlameGraph/stackcollapse-wcp.pl new file mode 100755 index 0000000..4d1d584 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-wcp.pl @@ -0,0 +1,69 @@ +#!/usr/bin/perl -ws +# +# stackcollapse-wcp Collapse wallClockProfiler backtraces +# +# Parse a list of GDB backtraces as generated by https://github.com/jasonrohrer/wallClockProfiler +# +# Copyright 2014 Gabriel Corona. All rights reserved. +# Portions Copyright 2020 Ștefan Talpalaru +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END + +use strict; + +my $current = ""; +my $start_processing = 0; +my $samples = 0; +my %stacks; + +while(<>) { + s/^\s+|\s+$//g; + + if (m/^Full stacks/) { + $start_processing = 1; + next; + } + + if (not $start_processing) { + next; + } + + if(m/^\d+\.\d+% =+ \((\d+) samples\)/) { + # 99.791% ===================================== (17194 samples) + $samples = $1; + next; + } elsif (m/^\d+: (.*)$/) { + # 1: poll__YNjd8fE6xG8CRNwfLnrx0g_2 (at /mnt/sde1/storage/nim-beacon-chain-clean/vendor/nim-chronos/chronos/asyncloop.nim:343) + my $function = $1; + if ($current eq "") { + $current = $function; + } else { + $current = $function . ";" . $current; + } + } elsif (m/^$/ and $current ne "") { + $stacks{$current} += $samples; + $current = ""; + } +} + +foreach my $k (sort { $a cmp $b } keys %stacks) { + print "$k $stacks{$k}\n"; +} + diff --git a/tools/FlameGraph/stackcollapse-xdebug.php b/tools/FlameGraph/stackcollapse-xdebug.php new file mode 100755 index 0000000..07b7df7 --- /dev/null +++ b/tools/FlameGraph/stackcollapse-xdebug.php @@ -0,0 +1,196 @@ +#!/usr/bin/php + outfile + -h --help Show this message + -t Weight stack counts by duration using the time index in the trace (default) + -c Invocation counts only. Simply count stacks in the trace and sum duplicates, don't weight by duration. + +Example input: +For more info on xdebug and generating traces see +https://xdebug.org/docs/execution_trace. + +Version: 2.0.0RC4-dev +TRACE START [2007-05-06 18:29:01] +1 0 0 0.010870 114112 {main} 1 ../trace.php 0 +2 1 0 0.032009 114272 str_split 0 ../trace.php 8 +2 1 1 0.032073 116632 +2 2 0 0.033505 117424 ret_ord 1 ../trace.php 10 +3 3 0 0.033531 117584 ord 0 ../trace.php 5 +3 3 1 0.033551 117584 +... +TRACE END [2007-05-06 18:29:01] + +Example output: + +- c +{main};str_split 1 +{main};ret_ord;ord 6 + +-t +{main} 23381 +{main};str_split 64 +{main};ret_ord 215 +{main};ret_ord;ord 106 + +EOT; + + exit($exit); +} + +function collapseStack(array $stack, string $func_name_key): string { + return implode(';', array_column($stack, $func_name_key)); +} + +function addCurrentStackToStacks(array $stack, float $dur, array &$stacks) { + $collapsed = implode(';', $stack); + $duration = SCALE_FACTOR * $dur; + + if (array_key_exists($collapsed, $stacks)) { + $stacks[$collapsed] += $duration; + } else { + $stacks[$collapsed] = $duration; + } +} + +function isEOTrace(string $l) { + $pattern = "/^(\\t|TRACE END)/"; + return preg_match($pattern, $l); +} + +$filename = $argv[$optind] ?? null; +if ($filename === null) { + usage(1); +} + +$do_time = !isset($args['c']); + +// First make sure our file is consistently formatted with only one \t delimiting each field +$out = []; +$retval = null; +exec("sed -in 's/\t\+/\t/g' " . escapeshellarg($filename), $out, $retval); +if ($retval !== 0) { + usage(1); +} + +$handle = fopen($filename, 'r'); + +if ($handle === false) { + echo "Unable to open $filename \n\n"; + usage(1); +} + +// Loop till we find TRACE START +while ($l = fgets($handle)) { + if (strpos($l, "TRACE START") === 0) { + break; + } +} + +const SCALE_FACTOR = 1000000; +$stacks = []; +$current_stack = []; +$was_exit = false; +$prev_start_time = 0; + +if ($do_time) { + // Weight counts by duration + // Xdebug trace time indices have 6 sigfigs of precision + // We have a perfect trace, but let's instead pretend that + // this was collected by sampling at 10^6 Hz + // then each millionth of a second this stack took to execute is 1 count + while ($l = fgets($handle)) { + if (isEOTrace($l)) { + break; + } + + $parts = explode("\t", $l); + list($level, $fn_no, $is_exit, $time) = $parts; + + if ($is_exit) { + if (empty($current_stack)) { + echo "[WARNING] Found function exit without corresponding entrance. Discarding line. Check your input.\n"; + continue; + } + + addCurrentStackToStacks($current_stack, $time - $prev_start_time, $stacks); + array_pop($current_stack); + } else { + $func_name = $parts[5]; + + if (!empty($current_stack)) { + addCurrentStackToStacks($current_stack, $time - $prev_start_time, $stacks); + } + + $current_stack[] = $func_name; + } + $prev_start_time = $time; + } +} else { + // Counts only + while ($l = fgets($handle)) { + if (isEOTrace($l)) { + break; + } + + $parts = explode("\t", $l); + list($level, $fn_no, $is_exit) = $parts; + + if ($is_exit === "1") { + if (!$was_exit) { + $collapsed = implode(";", $current_stack); + if (array_key_exists($collapsed, $stacks)) { + $stacks[$collapsed]++; + } else { + $stacks[$collapsed] = 1; + } + } + + array_pop($current_stack); + $was_exit = true; + } else { + $func_name = $parts[5]; + $current_stack[] = $func_name; + $was_exit = false; + } + } +} + +foreach ($stacks as $stack => $count) { + echo "$stack $count\n"; +} diff --git a/tools/FlameGraph/stackcollapse.pl b/tools/FlameGraph/stackcollapse.pl new file mode 100755 index 0000000..1e00c52 --- /dev/null +++ b/tools/FlameGraph/stackcollapse.pl @@ -0,0 +1,109 @@ +#!/usr/bin/perl -w +# +# stackcollapse.pl collapse multiline stacks into single lines. +# +# Parses a multiline stack followed by a number on a separate line, and +# outputs a semicolon separated stack followed by a space and the number. +# If memory addresses (+0xd) are present, they are stripped, and resulting +# identical stacks are colased with their counts summed. +# +# USAGE: ./stackcollapse.pl infile > outfile +# +# Example input: +# +# unix`i86_mwait+0xd +# unix`cpu_idle_mwait+0xf1 +# unix`idle+0x114 +# unix`thread_start+0x8 +# 1641 +# +# Example output: +# +# unix`thread_start;unix`idle;unix`cpu_idle_mwait;unix`i86_mwait 1641 +# +# Input may contain many stacks, and can be generated using DTrace. The +# first few lines of input are skipped (see $headerlines). +# +# Copyright 2011 Joyent, Inc. All rights reserved. +# Copyright 2011 Brendan Gregg. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at docs/cddl1.txt or +# http://opensource.org/licenses/CDDL-1.0. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at docs/cddl1.txt. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# 14-Aug-2011 Brendan Gregg Created this. + +use strict; + +my $headerlines = 3; # number of input lines to skip +my $includeoffset = 0; # include function offset (except leafs) +my %collapsed; + +sub remember_stack { + my ($stack, $count) = @_; + $collapsed{$stack} += $count; +} + +my $nr = 0; +my @stack; + +foreach (<>) { + next if $nr++ < $headerlines; + chomp; + + if (m/^\s*(\d+)+$/) { + my $count = $1; + my $joined = join(";", @stack); + + # trim leaf offset if these were retained: + $joined =~ s/\+[^+]*$// if $includeoffset; + + remember_stack($joined, $count); + @stack = (); + next; + } + + next if (m/^\s*$/); + + my $frame = $_; + $frame =~ s/^\s*//; + $frame =~ s/\+[^+]*$// unless $includeoffset; + + # Remove arguments from C++ function names: + $frame =~ s/(::.*)[(<].*/$1/; + + $frame = "-" if $frame eq ""; + + my @inline; + for (split /\->/, $frame) { + my $func = $_; + + # Strip out L and ; included in java stacks + $func =~ tr/\;/:/; + $func =~ s/^L//; + $func .= "_[i]" if scalar(@inline) > 0; #inlined + + push @inline, $func; + } + + unshift @stack, @inline; +} + +foreach my $k (sort { $a cmp $b } keys %collapsed) { + print "$k $collapsed{$k}\n"; +} diff --git a/tools/FlameGraph/test.sh b/tools/FlameGraph/test.sh new file mode 100755 index 0000000..3592f35 --- /dev/null +++ b/tools/FlameGraph/test.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# +# test.sh - Check flame graph software vs test result files. +# +# This is used to detect regressions in the flame graph software. +# See record-test.sh, which refreshes these files after intended software +# changes. +# +# Currently only tests stackcollapse-perf.pl. + +set -euo pipefail +set -x +set -v + +# ToDo: add some form of --inline, and --inline --context tests. These are +# tricky since they use addr2line, whose output will vary based on the test +# system's binaries and symbol tables. +for opt in pid tid kernel jit all addrs; do + for testfile in test/*.txt ; do + echo testing $testfile : $opt + outfile=${testfile#*/} + outfile=test/results/${outfile%.txt}"-collapsed-${opt}.txt" + perl ./stackcollapse-perf.pl --"${opt}" "${testfile}" 2> /dev/null | diff -u - "${outfile}" + perl ./flamegraph.pl "${outfile}" > /dev/null + done +done diff --git a/tools/FlameGraph/test/perf-cycles-instructions-01.txt b/tools/FlameGraph/test/perf-cycles-instructions-01.txt new file mode 100644 index 0000000..dc3754a --- /dev/null +++ b/tools/FlameGraph/test/perf-cycles-instructions-01.txt @@ -0,0 +1,1614 @@ +# ======== +# captured on: Thu Aug 17 14:14:43 2017 +# hostname : bgregg-lgud2 +# os release : 4.13.0-rc1 +# perf version : 4.13.0-rc1 +# arch : x86_64 +# nrcpus online : 8 +# nrcpus avail : 8 +# cpudesc : Intel(R) Xeon(R) CPU E3-1245 v5 @ 3.50GHz +# cpuid : GenuineIntel,6,94,3 +# total memory : 8058796 kB +# cmdline : /usr/bin/perf record -e cycles -e instructions -c 100000000 -a --call-graph=lbr -- sleep 1 +# event : name = cycles, , id = { 550, 551, 552, 553, 554, 555, 556, 557 }, size = 112, { sample_period, sample_freq } = 100000000, sample_type = IP|TID|TIME|CALLCHAIN|ID|CPU|BRANCH_STACK, read_format = ID, disabled = 1, inherit = 1, mmap = 1, comm = 1, task = 1, sample_id_all = 1, exclude_guest = 1, mmap2 = 1, comm_exec = 1, branch_sample_type = USER|CALL_STACK|NO_FLAGS|NO_CYCLES +# event : name = instructions, , id = { 558, 559, 560, 561, 562, 563, 564, 565 }, size = 112, config = 0x1, { sample_period, sample_freq } = 100000000, sample_type = IP|TID|TIME|CALLCHAIN|ID|CPU|BRANCH_STACK, read_format = ID, disabled = 1, inherit = 1, sample_id_all = 1, exclude_guest = 1, branch_sample_type = USER|CALL_STACK|NO_FLAGS|NO_CYCLES +# HEADER_CPU_TOPOLOGY info available, use -I to display +# HEADER_NUMA_TOPOLOGY info available, use -I to display +# pmu mappings: intel_pt = 7, intel_bts = 6, uncore_arb = 13, uncore_cbox_3 = 12, cstate_pkg = 16, breakpoint = 5, uncore_cbox_1 = 10, power = 14, cpu = 4, software = 1, uncore_cbox_2 = 11, uncore_cbox_0 = 9, cstate_core = 15, tracepoint = 2, msr = 8 +# HEADER_CACHE info available, use -I to display +# missing features: HEADER_TRACING_DATA HEADER_BRANCH_STACK HEADER_GROUP_DESC HEADER_AUXTRACE HEADER_STAT +# ======== +# +noploop 21796 [001] 1410597.984841: instructions: + 993 main (/root/noploop) + +noploop 21797 [002] 1410597.984850: instructions: + 69b main (/root/noploop) + +noploop 21796 [001] 1410597.992030: instructions: + 7df main (/root/noploop) + +noploop 21797 [002] 1410597.992037: instructions: + 883 main (/root/noploop) + +cksum 21804 [000] 1410597.994832: instructions: + 1ad1 cksum (/usr/bin/cksum) + +noploop 21796 [001] 1410597.999214: instructions: + 6e7 main (/root/noploop) + +noploop 21797 [002] 1410597.999221: instructions: + 917 main (/root/noploop) + +cksum 21804 [000] 1410598.006198: cycles: + 1ad1 cksum (/usr/bin/cksum) + +noploop 21796 [001] 1410598.006210: cycles: + 6a7 main (/root/noploop) + +noploop 21797 [002] 1410598.006219: cycles: + 68f main (/root/noploop) + +noploop 21796 [001] 1410598.006401: instructions: + 7a7 main (/root/noploop) + +noploop 21797 [002] 1410598.006407: instructions: + 78f main (/root/noploop) + +cksum 21804 [000] 1410598.011998: instructions: + 1ad1 cksum (/usr/bin/cksum) + +noploop 21796 [001] 1410598.013586: instructions: + 797 main (/root/noploop) + +noploop 21797 [002] 1410598.013593: instructions: + 857 main (/root/noploop) + +noploop 21796 [001] 1410598.020771: instructions: + 6d7 main (/root/noploop) + +noploop 21797 [002] 1410598.020778: instructions: + 763 main (/root/noploop) + +noploop 21796 [001] 1410598.027957: instructions: + 7bb main (/root/noploop) + +noploop 21797 [002] 1410598.027963: instructions: + 817 main (/root/noploop) + +cksum 21804 [000] 1410598.029069: instructions: + 1ad1 cksum (/usr/bin/cksum) + +cksum 21804 [000] 1410598.034839: cycles: + 4e85d9 ext4_file_read_iter (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21796 [001] 1410598.034851: cycles: + 9e7 main (/root/noploop) + +noploop 21797 [002] 1410598.034861: cycles: + 8df main (/root/noploop) + +noploop 21796 [001] 1410598.035143: instructions: + 7c7 main (/root/noploop) + +noploop 21797 [002] 1410598.035148: instructions: + 7fb main (/root/noploop) + +noploop 21796 [001] 1410598.042328: instructions: + 89f main (/root/noploop) + +noploop 21797 [002] 1410598.042333: instructions: + 98b main (/root/noploop) + +cksum 21804 [000] 1410598.046169: instructions: + 4e85d9 ext4_file_read_iter (/lib/modules/4.13.0-rc1/build/vmlinux) + 44b0fe __vfs_read (/lib/modules/4.13.0-rc1/build/vmlinux) + 44bd56 vfs_read (/lib/modules/4.13.0-rc1/build/vmlinux) + 44d495 sys_read (/lib/modules/4.13.0-rc1/build/vmlinux) + af30bb entry_SYSCALL_64_fastpath (/lib/modules/4.13.0-rc1/build/vmlinux) + 7afe0 _IO_file_read (/lib/x86_64-linux-gnu/libc-2.24.so) + 7ad41 _IO_file_xsgetn (/lib/x86_64-linux-gnu/libc-2.24.so) + 79b8f __GI___fread_unlocked (/lib/x86_64-linux-gnu/libc-2.24.so) + 1b23 cksum (/usr/bin/cksum) + +noploop 21796 [001] 1410598.049514: instructions: + 907 main (/root/noploop) + +noploop 21797 [002] 1410598.049518: instructions: + 9ff main (/root/noploop) + +noploop 21796 [001] 1410598.056699: instructions: + 87b main (/root/noploop) + +noploop 21797 [002] 1410598.056703: instructions: + 743 main (/root/noploop) + +cksum 21804 [000] 1410598.063350: instructions: + 1ad4 cksum (/usr/bin/cksum) + +cksum 21804 [000] 1410598.063483: cycles: + 1ab5 cksum (/usr/bin/cksum) + +noploop 21796 [001] 1410598.063493: cycles: + 773 main (/root/noploop) + +noploop 21797 [002] 1410598.063503: cycles: + 6e3 main (/root/noploop) + +noploop 21796 [001] 1410598.063886: instructions: + 6ff main (/root/noploop) + +noploop 21797 [002] 1410598.063890: instructions: + 8d3 main (/root/noploop) + +noploop 21796 [001] 1410598.071069: instructions: + 6eb main (/root/noploop) + +noploop 21797 [002] 1410598.071074: instructions: + 67b main (/root/noploop) + +noploop 21796 [001] 1410598.078254: instructions: + 8a3 main (/root/noploop) + +noploop 21797 [002] 1410598.078259: instructions: + 80b main (/root/noploop) + +cksum 21804 [000] 1410598.080529: instructions: + 1ad1 cksum (/usr/bin/cksum) + +noploop 21796 [001] 1410598.085439: instructions: + 823 main (/root/noploop) + +noploop 21797 [002] 1410598.085444: instructions: + 6f7 main (/root/noploop) + +cksum 21804 [000] 1410598.092123: cycles: + 552c0000552c [unknown] ([unknown]) + +noploop 21796 [001] 1410598.092134: cycles: + 81f main (/root/noploop) + +noploop 21797 [002] 1410598.092144: cycles: + 6ff main (/root/noploop) + +noploop 21796 [001] 1410598.092625: instructions: + 8ff main (/root/noploop) + +noploop 21797 [002] 1410598.092630: instructions: + 74b main (/root/noploop) + +noploop 21796 [001] 1410598.099811: instructions: + 6e7 main (/root/noploop) + +noploop 21797 [002] 1410598.099816: instructions: + 75f main (/root/noploop) + +noploop 21796 [001] 1410598.106996: instructions: + 8b3 main (/root/noploop) + +noploop 21797 [002] 1410598.107000: instructions: + 847 main (/root/noploop) + +noploop 21796 [001] 1410598.114182: instructions: + 7f3 main (/root/noploop) + +noploop 21797 [002] 1410598.114186: instructions: + 7ff main (/root/noploop) + +cksum 21807 [004] 1410598.116168: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.120777: cycles: + a23 main (/root/noploop) + +noploop 21797 [002] 1410598.120786: cycles: + 6ff main (/root/noploop) + +noploop 21796 [001] 1410598.121368: instructions: + 91b main (/root/noploop) + +noploop 21797 [002] 1410598.121372: instructions: + 893 main (/root/noploop) + +cksum 21807 [004] 1410598.127157: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.128553: instructions: + 8f3 main (/root/noploop) + +noploop 21797 [002] 1410598.128557: instructions: + a53 main (/root/noploop) + +cksum 21807 [004] 1410598.133347: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.135738: instructions: + 90b main (/root/noploop) + +noploop 21797 [002] 1410598.135743: instructions: + 9cf main (/root/noploop) + +noploop 21796 [001] 1410598.142921: instructions: + 6fb main (/root/noploop) + +noploop 21797 [002] 1410598.142926: instructions: + 823 main (/root/noploop) + +noploop 21796 [001] 1410598.149418: cycles: + 9ef main (/root/noploop) + +noploop 21797 [002] 1410598.149428: cycles: + 94f main (/root/noploop) + +noploop 21796 [001] 1410598.150108: instructions: + 8f3 main (/root/noploop) + +noploop 21797 [002] 1410598.150113: instructions: + 9cf main (/root/noploop) + +cksum 21807 [004] 1410598.150509: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +cksum 21807 [004] 1410598.155801: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.157294: instructions: + 69b main (/root/noploop) + +noploop 21797 [002] 1410598.157298: instructions: + 8e3 main (/root/noploop) + +noploop 21796 [001] 1410598.164479: instructions: + 673 main (/root/noploop) + +noploop 21797 [002] 1410598.164483: instructions: + 97b main (/root/noploop) + +cksum 21807 [004] 1410598.167744: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.171664: instructions: + 6e7 main (/root/noploop) + +noploop 21797 [002] 1410598.171668: instructions: + 977 main (/root/noploop) + +noploop 21796 [001] 1410598.178060: cycles: + a4b main (/root/noploop) + +noploop 21797 [002] 1410598.178069: cycles: + 79f main (/root/noploop) + +noploop 21796 [001] 1410598.178849: instructions: + 73f main (/root/noploop) + +noploop 21797 [002] 1410598.178853: instructions: + 96f main (/root/noploop) + +cksum 21807 [004] 1410598.184443: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +cksum 21807 [004] 1410598.184923: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.186034: instructions: + 723 main (/root/noploop) + +noploop 21797 [002] 1410598.186038: instructions: + a17 main (/root/noploop) + +noploop 21796 [001] 1410598.193219: instructions: + 70b main (/root/noploop) + +noploop 21797 [002] 1410598.193223: instructions: + 8af main (/root/noploop) + +noploop 21796 [001] 1410598.200405: instructions: + 9c7 main (/root/noploop) + +noploop 21797 [002] 1410598.200408: instructions: + 83f main (/root/noploop) + +cksum 21807 [004] 1410598.202111: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.206701: cycles: + 76b main (/root/noploop) + +noploop 21797 [002] 1410598.206711: cycles: + 807 main (/root/noploop) + +noploop 21796 [001] 1410598.207592: instructions: + 78b main (/root/noploop) + +noploop 21797 [002] 1410598.207595: instructions: + 7fb main (/root/noploop) + +cksum 21807 [004] 1410598.213085: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.214776: instructions: + 6d7 main (/root/noploop) + +noploop 21797 [002] 1410598.214779: instructions: + 6ef main (/root/noploop) + +cksum 21807 [004] 1410598.219228: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.221961: instructions: + 7eb main (/root/noploop) + +noploop 21797 [002] 1410598.221964: instructions: + 86f main (/root/noploop) + +noploop 21797 [002] 1410598.229149: instructions: + 96f main (/root/noploop) + +noploop 21796 [001] 1410598.229155: instructions: + 87f main (/root/noploop) + +noploop 21796 [001] 1410598.235343: cycles: + 8e7 main (/root/noploop) + +noploop 21797 [002] 1410598.235353: cycles: + 76b main (/root/noploop) + +cksum 21807 [004] 1410598.236321: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.236337: instructions: + 95f main (/root/noploop) + +noploop 21796 [001] 1410598.236342: instructions: + 8db main (/root/noploop) + +cksum 21807 [004] 1410598.241728: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.243521: instructions: + 993 main (/root/noploop) + +noploop 21796 [001] 1410598.243527: instructions: + 74b main (/root/noploop) + +noploop 21797 [002] 1410598.250705: instructions: + 8cf main (/root/noploop) + +noploop 21796 [001] 1410598.250711: instructions: + 74f main (/root/noploop) + +cksum 21807 [004] 1410598.253484: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.257890: instructions: + 937 main (/root/noploop) + +noploop 21796 [001] 1410598.257896: instructions: + 6ef main (/root/noploop) + +noploop 21796 [001] 1410598.263985: cycles: + 937 main (/root/noploop) + +noploop 21797 [002] 1410598.263994: cycles: + 867 main (/root/noploop) + +noploop 21797 [002] 1410598.265076: instructions: + 9b3 main (/root/noploop) + +noploop 21796 [001] 1410598.265082: instructions: + 953 main (/root/noploop) + +cksum 21807 [004] 1410598.270369: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +cksum 21807 [004] 1410598.270672: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.272261: instructions: + 6d7 main (/root/noploop) + +noploop 21796 [001] 1410598.272267: instructions: + 8ff main (/root/noploop) + +noploop 21797 [002] 1410598.279446: instructions: + 6c7 main (/root/noploop) + +noploop 21796 [001] 1410598.279452: instructions: + 91f main (/root/noploop) + +noploop 21797 [002] 1410598.286631: instructions: + 76f main (/root/noploop) + +noploop 21796 [001] 1410598.286636: instructions: + 813 main (/root/noploop) + +cksum 21807 [004] 1410598.287836: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.292627: cycles: + 973 main (/root/noploop) + +noploop 21797 [002] 1410598.292636: cycles: + 6cf main (/root/noploop) + +noploop 21797 [002] 1410598.293818: instructions: + 86b main (/root/noploop) + +noploop 21796 [001] 1410598.293823: instructions: + 953 main (/root/noploop) + +cksum 21807 [004] 1410598.299012: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.301003: instructions: + 85b main (/root/noploop) + +noploop 21796 [001] 1410598.301008: instructions: + 85b main (/root/noploop) + +cksum 21807 [004] 1410598.304899: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.308188: instructions: + 853 main (/root/noploop) + +noploop 21796 [001] 1410598.308194: instructions: + a4f main (/root/noploop) + +noploop 21797 [002] 1410598.315372: instructions: + 80b main (/root/noploop) + +noploop 21796 [001] 1410598.315377: instructions: + 8a7 main (/root/noploop) + +noploop 21796 [001] 1410598.321268: cycles: + 923 main (/root/noploop) + +noploop 21797 [002] 1410598.321278: cycles: + 943 main (/root/noploop) + +cksum 21807 [004] 1410598.322082: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.322558: instructions: + 7ab main (/root/noploop) + +noploop 21796 [001] 1410598.322564: instructions: + 9a3 main (/root/noploop) + +cksum 21807 [004] 1410598.327656: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.329743: instructions: + 93b main (/root/noploop) + +noploop 21796 [001] 1410598.329749: instructions: + 973 main (/root/noploop) + +noploop 21797 [002] 1410598.336927: instructions: + 6ab main (/root/noploop) + +noploop 21796 [001] 1410598.336934: instructions: + 8c7 main (/root/noploop) + +cksum 21807 [004] 1410598.339259: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.344113: instructions: + 7e3 main (/root/noploop) + +noploop 21796 [001] 1410598.344119: instructions: + 8cb main (/root/noploop) + +noploop 21796 [001] 1410598.349909: cycles: + 6d3 main (/root/noploop) + +noploop 21797 [002] 1410598.349919: cycles: + 877 main (/root/noploop) + +noploop 21797 [002] 1410598.351297: instructions: + 9b7 main (/root/noploop) + +noploop 21796 [001] 1410598.351304: instructions: + 68b main (/root/noploop) + +cksum 21807 [004] 1410598.356297: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +cksum 21807 [004] 1410598.356460: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.358482: instructions: + 75f main (/root/noploop) + +noploop 21796 [001] 1410598.358489: instructions: + a3b main (/root/noploop) + +noploop 21797 [002] 1410598.365667: instructions: + 8f3 main (/root/noploop) + +noploop 21796 [001] 1410598.365674: instructions: + a13 main (/root/noploop) + +noploop 21797 [002] 1410598.372852: instructions: + a3f main (/root/noploop) + +noploop 21796 [001] 1410598.372859: instructions: + 737 main (/root/noploop) + +cksum 21807 [004] 1410598.373647: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.378550: cycles: + 7d3 main (/root/noploop) + +noploop 21797 [002] 1410598.378560: cycles: + 873 main (/root/noploop) + +noploop 21797 [002] 1410598.380038: instructions: + 74f main (/root/noploop) + +noploop 21796 [001] 1410598.380045: instructions: + 91b main (/root/noploop) + +cksum 21807 [004] 1410598.384940: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.387221: instructions: + 8c7 main (/root/noploop) + +noploop 21796 [001] 1410598.387229: instructions: + 72f main (/root/noploop) + +cksum 21807 [004] 1410598.390867: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.394407: instructions: + 66b main (/root/noploop) + +noploop 21796 [001] 1410598.394414: instructions: + a23 main (/root/noploop) + +noploop 21797 [002] 1410598.401592: instructions: + 85f main (/root/noploop) + +noploop 21796 [001] 1410598.401598: instructions: + 7b7 main (/root/noploop) + +noploop 21796 [001] 1410598.407192: cycles: + 77f main (/root/noploop) + +noploop 21797 [002] 1410598.407201: cycles: + 9a7 main (/root/noploop) + +cksum 21807 [004] 1410598.408043: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.408778: instructions: + 757 main (/root/noploop) + +noploop 21796 [001] 1410598.408784: instructions: + 73f main (/root/noploop) + +cksum 21807 [004] 1410598.413583: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.415963: instructions: + 6c3 main (/root/noploop) + +noploop 21796 [001] 1410598.415969: instructions: + 75f main (/root/noploop) + +noploop 21797 [002] 1410598.423147: instructions: + 85b main (/root/noploop) + +noploop 21796 [001] 1410598.423153: instructions: + 953 main (/root/noploop) + +cksum 21807 [004] 1410598.425233: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.430332: instructions: + a17 main (/root/noploop) + +noploop 21796 [001] 1410598.430338: instructions: + a1f main (/root/noploop) + +noploop 21796 [001] 1410598.435833: cycles: + a4f main (/root/noploop) + +noploop 21797 [002] 1410598.435843: cycles: + 7e3 main (/root/noploop) + +noploop 21797 [002] 1410598.437519: instructions: + 8eb main (/root/noploop) + +noploop 21796 [001] 1410598.437525: instructions: + a17 main (/root/noploop) + +cksum 21807 [004] 1410598.442225: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +cksum 21807 [004] 1410598.442373: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.444704: instructions: + 7e7 main (/root/noploop) + +noploop 21796 [001] 1410598.444710: instructions: + 87f main (/root/noploop) + +noploop 21797 [002] 1410598.451889: instructions: + 6c7 main (/root/noploop) + +noploop 21796 [001] 1410598.451912: instructions: + 99f main (/root/noploop) + +noploop 21797 [002] 1410598.459073: instructions: + 87b main (/root/noploop) + +noploop 21796 [001] 1410598.459096: instructions: + 9cb main (/root/noploop) + +cksum 21807 [004] 1410598.459586: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.464475: cycles: + 6cf main (/root/noploop) + +noploop 21797 [002] 1410598.464485: cycles: + 76f main (/root/noploop) + +noploop 21797 [002] 1410598.466259: instructions: + 90b main (/root/noploop) + +noploop 21796 [001] 1410598.466283: instructions: + 9db main (/root/noploop) + +cksum 21807 [004] 1410598.470867: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.473443: instructions: + 877 main (/root/noploop) + +noploop 21796 [001] 1410598.473468: instructions: + a37 main (/root/noploop) + +cksum 21807 [004] 1410598.476672: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.480628: instructions: + 6f3 main (/root/noploop) + +noploop 21796 [001] 1410598.480652: instructions: + 9df main (/root/noploop) + +noploop 21797 [002] 1410598.487813: instructions: + 93b main (/root/noploop) + +noploop 21796 [001] 1410598.487837: instructions: + 9b7 main (/root/noploop) + +noploop 21796 [001] 1410598.493116: cycles: + 7ef main (/root/noploop) + +noploop 21797 [002] 1410598.493126: cycles: + 89b main (/root/noploop) + +cksum 21807 [004] 1410598.493741: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.494998: instructions: + 6db main (/root/noploop) + +noploop 21796 [001] 1410598.495022: instructions: + 7cf main (/root/noploop) + +cksum 21807 [004] 1410598.499510: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.502183: instructions: + 8c3 main (/root/noploop) + +noploop 21796 [001] 1410598.502207: instructions: + 797 main (/root/noploop) + +noploop 21797 [002] 1410598.509368: instructions: + 70f main (/root/noploop) + +noploop 21796 [001] 1410598.509392: instructions: + 987 main (/root/noploop) + +cksum 21807 [004] 1410598.510883: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.516553: instructions: + 70b main (/root/noploop) + +noploop 21796 [001] 1410598.516577: instructions: + a07 main (/root/noploop) + +noploop 21796 [001] 1410598.521758: cycles: + 9c7 main (/root/noploop) + +noploop 21797 [002] 1410598.521768: cycles: + 78f main (/root/noploop) + +noploop 21797 [002] 1410598.523740: instructions: + 8c3 main (/root/noploop) + +noploop 21796 [001] 1410598.523763: instructions: + 793 main (/root/noploop) + +cksum 21807 [004] 1410598.528071: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +cksum 21807 [004] 1410598.528153: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.530923: instructions: + 673 main (/root/noploop) + +noploop 21796 [001] 1410598.530947: instructions: + 8cb main (/root/noploop) + +noploop 21797 [002] 1410598.538108: instructions: + 7fb main (/root/noploop) + +noploop 21796 [001] 1410598.538132: instructions: + 887 main (/root/noploop) + +cksum 21807 [004] 1410598.545275: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.545293: instructions: + 703 main (/root/noploop) + +noploop 21796 [001] 1410598.545317: instructions: + 7db main (/root/noploop) + +noploop 21796 [001] 1410598.550399: cycles: + 9ab main (/root/noploop) + +noploop 21797 [002] 1410598.550409: cycles: + 9e7 main (/root/noploop) + +noploop 21797 [002] 1410598.552479: instructions: + 89f main (/root/noploop) + +noploop 21796 [001] 1410598.552503: instructions: + 9c7 main (/root/noploop) + +cksum 21807 [004] 1410598.556794: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.559664: instructions: + 9bf main (/root/noploop) + +noploop 21796 [001] 1410598.559688: instructions: + 947 main (/root/noploop) + +cksum 21807 [004] 1410598.562462: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.566847: instructions: + a13 main (/root/noploop) + +noploop 21796 [001] 1410598.566871: instructions: + 9af main (/root/noploop) + +noploop 21797 [002] 1410598.574032: instructions: + 7fb main (/root/noploop) + +noploop 21796 [001] 1410598.574056: instructions: + 8f0 main (/root/noploop) + +noploop 21796 [001] 1410598.579040: cycles: + 7af main (/root/noploop) + +noploop 21797 [002] 1410598.579050: cycles: + 75f main (/root/noploop) + +cksum 21807 [004] 1410598.579636: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.581218: instructions: + 8d7 main (/root/noploop) + +noploop 21796 [001] 1410598.581604: instructions: + 717 main (/root/noploop) + +cksum 21807 [004] 1410598.585437: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.588402: instructions: + 8db main (/root/noploop) + +noploop 21796 [001] 1410598.589229: instructions: + 9e4 main (/root/noploop) + +noploop 21797 [002] 1410598.595587: instructions: + 8d3 main (/root/noploop) + +cksum 21807 [004] 1410598.596815: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21796 [001] 1410598.596855: instructions: + 6ef main (/root/noploop) + +noploop 21797 [002] 1410598.602771: instructions: + 947 main (/root/noploop) + +swapper 0 [005] 1410598.603979: cycles: + af2bfe poll_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 956752 cpuidle_enter_state (/lib/modules/4.13.0-rc1/build/vmlinux) + 956957 cpuidle_enter (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8623 call_cpuidle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c88c9 do_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8b13 cpu_startup_entry (/lib/modules/4.13.0-rc1/build/vmlinux) + 252886 start_secondary (/lib/modules/4.13.0-rc1/build/vmlinux) + 2000cf verify_cpu (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21796 [001] 1410598.604482: instructions: + 928 main (/root/noploop) + +noploop 21796 [001] 1410598.607682: cycles: + 6c4 main (/root/noploop) + +noploop 21797 [002] 1410598.607691: cycles: + 893 main (/root/noploop) + +noploop 21797 [002] 1410598.609957: instructions: + 733 main (/root/noploop) + +noploop 21796 [001] 1410598.612110: instructions: + 67f main (/root/noploop) + +cksum 21807 [004] 1410598.613988: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +cksum 21807 [004] 1410598.614079: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.617142: instructions: + 75b main (/root/noploop) + +noploop 21796 [001] 1410598.619736: instructions: + 6b3 main (/root/noploop) + +noploop 21797 [002] 1410598.624328: instructions: + 8f7 main (/root/noploop) + +noploop 21796 [001] 1410598.627360: instructions: + a18 main (/root/noploop) + +cksum 21807 [004] 1410598.631186: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.631513: instructions: + a0b main (/root/noploop) + +swapper 0 [005] 1410598.632619: cycles: + af2bfe poll_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 956752 cpuidle_enter_state (/lib/modules/4.13.0-rc1/build/vmlinux) + 956957 cpuidle_enter (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8623 call_cpuidle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c88c9 do_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8b13 cpu_startup_entry (/lib/modules/4.13.0-rc1/build/vmlinux) + 252886 start_secondary (/lib/modules/4.13.0-rc1/build/vmlinux) + 2000cf verify_cpu (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21796 [001] 1410598.634987: instructions: + 66b main (/root/noploop) + +noploop 21796 [001] 1410598.636324: cycles: + 92c main (/root/noploop) + +noploop 21797 [002] 1410598.636333: cycles: + 6e7 main (/root/noploop) + +noploop 21797 [002] 1410598.638698: instructions: + 8a3 main (/root/noploop) + +noploop 21796 [001] 1410598.642614: instructions: + 8ef main (/root/noploop) + +cksum 21807 [004] 1410598.642721: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + 203ef __libc_start_main (/lib/x86_64-linux-gnu/libc-2.24.so) + 1724 _start (/usr/bin/cksum) + +noploop 21797 [002] 1410598.645883: instructions: + 7e7 main (/root/noploop) + +cksum 21807 [004] 1410598.648405: instructions: + 1adb cksum (/usr/bin/cksum) + +noploop 21796 [001] 1410598.650240: instructions: + 9c4 main (/root/noploop) + +noploop 21797 [002] 1410598.653067: instructions: + 94b main (/root/noploop) + +noploop 21796 [001] 1410598.657866: instructions: + 9e0 main (/root/noploop) + +noploop 21797 [002] 1410598.660253: instructions: + 957 main (/root/noploop) + +swapper 0 [005] 1410598.661259: cycles: + af2bfe poll_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 956752 cpuidle_enter_state (/lib/modules/4.13.0-rc1/build/vmlinux) + 956957 cpuidle_enter (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8623 call_cpuidle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c88c9 do_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8b13 cpu_startup_entry (/lib/modules/4.13.0-rc1/build/vmlinux) + 252886 start_secondary (/lib/modules/4.13.0-rc1/build/vmlinux) + 2000cf verify_cpu (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21796 [001] 1410598.664965: cycles: + 717 main (/root/noploop) + +noploop 21797 [002] 1410598.664975: cycles: + 69b main (/root/noploop) + +noploop 21796 [001] 1410598.665495: instructions: + a0c main (/root/noploop) + +cksum 21807 [004] 1410598.665552: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.667440: instructions: + 697 main (/root/noploop) + +cksum 21807 [004] 1410598.671379: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.673121: instructions: + 677 main (/root/noploop) + +noploop 21797 [002] 1410598.674624: instructions: + 837 main (/root/noploop) + +noploop 21796 [001] 1410598.680736: instructions: + a48 main (/root/noploop) + +noploop 21797 [002] 1410598.681808: instructions: + 6eb main (/root/noploop) + +cksum 21807 [004] 1410598.682522: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.688362: instructions: + 79b main (/root/noploop) + +noploop 21797 [002] 1410598.688994: instructions: + 94b main (/root/noploop) + +swapper 0 [005] 1410598.689898: cycles: + af2bfe poll_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 956752 cpuidle_enter_state (/lib/modules/4.13.0-rc1/build/vmlinux) + 956957 cpuidle_enter (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8623 call_cpuidle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c88c9 do_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8b13 cpu_startup_entry (/lib/modules/4.13.0-rc1/build/vmlinux) + 252886 start_secondary (/lib/modules/4.13.0-rc1/build/vmlinux) + 2000cf verify_cpu (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21796 [001] 1410598.693606: cycles: + 96f main (/root/noploop) + +noploop 21797 [002] 1410598.693617: cycles: + 87b main (/root/noploop) + +noploop 21796 [001] 1410598.695990: instructions: + 7c0 main (/root/noploop) + +noploop 21797 [002] 1410598.696180: instructions: + 86f main (/root/noploop) + +cksum 21807 [004] 1410598.699700: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +cksum 21807 [004] 1410598.700021: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.703364: instructions: + 737 main (/root/noploop) + +noploop 21796 [001] 1410598.703616: instructions: + 9c0 main (/root/noploop) + +noploop 21797 [002] 1410598.710549: instructions: + 867 main (/root/noploop) + +noploop 21796 [001] 1410598.711241: instructions: + 70b main (/root/noploop) + +cksum 21807 [004] 1410598.716851: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.717736: instructions: + 85b main (/root/noploop) + +swapper 0 [005] 1410598.718538: cycles: + af2c01 poll_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 956752 cpuidle_enter_state (/lib/modules/4.13.0-rc1/build/vmlinux) + 956957 cpuidle_enter (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8623 call_cpuidle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c88c9 do_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8b13 cpu_startup_entry (/lib/modules/4.13.0-rc1/build/vmlinux) + 252886 start_secondary (/lib/modules/4.13.0-rc1/build/vmlinux) + 2000cf verify_cpu (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21796 [001] 1410598.718864: instructions: + 71c main (/root/noploop) + +noploop 21796 [001] 1410598.722248: cycles: + 76b main (/root/noploop) + +noploop 21797 [002] 1410598.722259: cycles: + 99f main (/root/noploop) + +noploop 21797 [002] 1410598.724923: instructions: + 683 main (/root/noploop) + +noploop 21796 [001] 1410598.726493: instructions: + 6df main (/root/noploop) + +cksum 21807 [004] 1410598.728663: cycles: + ae2d1e copy_user_enhanced_fast_string (/lib/modules/4.13.0-rc1/build/vmlinux) + 651824 copy_page_to_iter (/lib/modules/4.13.0-rc1/build/vmlinux) + 3b5d64 generic_file_read_iter (/lib/modules/4.13.0-rc1/build/vmlinux) + 4e8626 ext4_file_read_iter (/lib/modules/4.13.0-rc1/build/vmlinux) + 44b0fe __vfs_read (/lib/modules/4.13.0-rc1/build/vmlinux) + 44bd56 vfs_read (/lib/modules/4.13.0-rc1/build/vmlinux) + 44d495 sys_read (/lib/modules/4.13.0-rc1/build/vmlinux) + af30bb entry_SYSCALL_64_fastpath (/lib/modules/4.13.0-rc1/build/vmlinux) + 7afe0 _IO_file_read (/lib/x86_64-linux-gnu/libc-2.24.so) + 7ad41 _IO_file_xsgetn (/lib/x86_64-linux-gnu/libc-2.24.so) + 79b8f __GI___fread_unlocked (/lib/x86_64-linux-gnu/libc-2.24.so) + 1b23 cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.732108: instructions: + 7cf main (/root/noploop) + +cksum 21807 [004] 1410598.733868: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.734119: instructions: + 8a8 main (/root/noploop) + +noploop 21797 [002] 1410598.739299: instructions: + 6a3 main (/root/noploop) + +noploop 21796 [001] 1410598.741746: instructions: + a1c main (/root/noploop) + +noploop 21797 [002] 1410598.746484: instructions: + 77f main (/root/noploop) + +swapper 0 [005] 1410598.747178: cycles: + af2bfe poll_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 956752 cpuidle_enter_state (/lib/modules/4.13.0-rc1/build/vmlinux) + 956957 cpuidle_enter (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8623 call_cpuidle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c88c9 do_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8b13 cpu_startup_entry (/lib/modules/4.13.0-rc1/build/vmlinux) + 252886 start_secondary (/lib/modules/4.13.0-rc1/build/vmlinux) + 2000cf verify_cpu (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21796 [001] 1410598.749373: instructions: + a44 main (/root/noploop) + +cksum 21807 [004] 1410598.750821: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.750890: cycles: + 7eb main (/root/noploop) + +noploop 21797 [002] 1410598.750900: cycles: + 98f main (/root/noploop) + +noploop 21797 [002] 1410598.753670: instructions: + 73f main (/root/noploop) + +noploop 21796 [001] 1410598.757000: instructions: + a4c main (/root/noploop) + +cksum 21807 [004] 1410598.757306: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.760856: instructions: + 8c7 main (/root/noploop) + +noploop 21796 [001] 1410598.764626: instructions: + 95b main (/root/noploop) + +cksum 21807 [004] 1410598.767889: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.768041: instructions: + 9fb main (/root/noploop) + +noploop 21796 [001] 1410598.771989: instructions: + 69b main (/root/noploop) + +noploop 21797 [002] 1410598.775226: instructions: + 727 main (/root/noploop) + +noploop 21796 [001] 1410598.779173: instructions: + 7ef main (/root/noploop) + +noploop 21796 [001] 1410598.779532: cycles: + 78b main (/root/noploop) + +noploop 21797 [002] 1410598.779543: cycles: + 853 main (/root/noploop) + +noploop 21797 [002] 1410598.782412: instructions: + 77f main (/root/noploop) + +cksum 21807 [004] 1410598.785060: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +cksum 21807 [004] 1410598.785948: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.786362: instructions: + 9fb main (/root/noploop) + +noploop 21797 [002] 1410598.789597: instructions: + 8e3 main (/root/noploop) + +noploop 21796 [001] 1410598.793547: instructions: + a1b main (/root/noploop) + +noploop 21797 [002] 1410598.796782: instructions: + 887 main (/root/noploop) + +noploop 21796 [001] 1410598.800732: instructions: + 923 main (/root/noploop) + +cksum 21807 [004] 1410598.802246: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.803967: instructions: + 93f main (/root/noploop) + +noploop 21796 [001] 1410598.807917: instructions: + 887 main (/root/noploop) + +noploop 21796 [001] 1410598.808173: cycles: + 913 main (/root/noploop) + +noploop 21797 [002] 1410598.808184: cycles: + a53 main (/root/noploop) + +noploop 21797 [002] 1410598.811152: instructions: + 807 main (/root/noploop) + +cksum 21807 [004] 1410598.814589: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.815102: instructions: + 72f main (/root/noploop) + +noploop 21797 [002] 1410598.818337: instructions: + 99f main (/root/noploop) + +cksum 21807 [004] 1410598.819414: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.822287: instructions: + 703 main (/root/noploop) + +noploop 21797 [002] 1410598.825521: instructions: + 73b main (/root/noploop) + +noploop 21796 [001] 1410598.829472: instructions: + a23 main (/root/noploop) + +noploop 21797 [002] 1410598.832706: instructions: + 803 main (/root/noploop) + +cksum 21807 [004] 1410598.836558: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.836657: instructions: + 7d3 main (/root/noploop) + +noploop 21796 [001] 1410598.836815: cycles: + 8d7 main (/root/noploop) + +noploop 21797 [002] 1410598.836825: cycles: + 95f main (/root/noploop) + +noploop 21797 [002] 1410598.839892: instructions: + 8cf main (/root/noploop) + +cksum 21807 [004] 1410598.843232: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.843843: instructions: + 89f main (/root/noploop) + +noploop 21797 [002] 1410598.847076: instructions: + a3f main (/root/noploop) + +noploop 21796 [001] 1410598.851027: instructions: + 76b main (/root/noploop) + +cksum 21807 [004] 1410598.853729: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.854261: instructions: + a03 main (/root/noploop) + +noploop 21796 [001] 1410598.858212: instructions: + 80b main (/root/noploop) + +noploop 21797 [002] 1410598.861446: instructions: + a07 main (/root/noploop) + +noploop 21796 [001] 1410598.865397: instructions: + 917 main (/root/noploop) + +noploop 21796 [001] 1410598.865456: cycles: + 7ef main (/root/noploop) + +noploop 21797 [002] 1410598.865466: cycles: + 92b main (/root/noploop) + +noploop 21797 [002] 1410598.868632: instructions: + 6db main (/root/noploop) + +cksum 21807 [004] 1410598.870889: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +cksum 21807 [004] 1410598.871891: cycles: + 1ac6 cksum (/usr/bin/cksum) + +noploop 21796 [001] 1410598.872583: instructions: + 9f7 main (/root/noploop) + +noploop 21797 [002] 1410598.875817: instructions: + 697 main (/root/noploop) + +noploop 21796 [001] 1410598.879768: instructions: + 7d3 main (/root/noploop) + +noploop 21797 [002] 1410598.883000: instructions: + 933 main (/root/noploop) + +noploop 21796 [001] 1410598.886951: instructions: + 9cc main (/root/noploop) + +cksum 21807 [004] 1410598.888074: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.890185: instructions: + 993 main (/root/noploop) + +noploop 21796 [001] 1410598.894096: cycles: + 6eb main (/root/noploop) + +noploop 21797 [002] 1410598.894108: cycles: + 6c3 main (/root/noploop) + +noploop 21796 [001] 1410598.894553: instructions: + 9e0 main (/root/noploop) + +swapper 0 [005] 1410598.895787: cycles: + af2bfe poll_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 956752 cpuidle_enter_state (/lib/modules/4.13.0-rc1/build/vmlinux) + 956957 cpuidle_enter (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8623 call_cpuidle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c88c9 do_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8b13 cpu_startup_entry (/lib/modules/4.13.0-rc1/build/vmlinux) + 252886 start_secondary (/lib/modules/4.13.0-rc1/build/vmlinux) + 2000cf verify_cpu (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21797 [002] 1410598.897371: instructions: + 7c3 main (/root/noploop) + +cksum 21807 [004] 1410598.900532: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.902180: instructions: + 9a4 main (/root/noploop) + +noploop 21797 [002] 1410598.904556: instructions: + 95f main (/root/noploop) + +cksum 21807 [004] 1410598.905217: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.909806: instructions: + 9c0 main (/root/noploop) + +noploop 21797 [002] 1410598.911741: instructions: + 95f main (/root/noploop) + +noploop 21796 [001] 1410598.917432: instructions: + 8e4 main (/root/noploop) + +noploop 21797 [002] 1410598.918925: instructions: + 8cb main (/root/noploop) + +cksum 21807 [004] 1410598.922385: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.922738: cycles: + a18 main (/root/noploop) + +noploop 21797 [002] 1410598.922749: cycles: + 7d3 main (/root/noploop) + +swapper 0 [005] 1410598.924427: cycles: + af2bfe poll_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 956752 cpuidle_enter_state (/lib/modules/4.13.0-rc1/build/vmlinux) + 956957 cpuidle_enter (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8623 call_cpuidle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c88c9 do_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8b13 cpu_startup_entry (/lib/modules/4.13.0-rc1/build/vmlinux) + 252886 start_secondary (/lib/modules/4.13.0-rc1/build/vmlinux) + 2000cf verify_cpu (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21796 [001] 1410598.925060: instructions: + 9e3 main (/root/noploop) + +noploop 21797 [002] 1410598.926110: instructions: + 953 main (/root/noploop) + +cksum 21807 [004] 1410598.929175: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.932685: instructions: + 9c4 main (/root/noploop) + +noploop 21797 [002] 1410598.933295: instructions: + 6cf main (/root/noploop) + +cksum 21807 [004] 1410598.939563: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21796 [001] 1410598.940311: instructions: + 8cb main (/root/noploop) + +noploop 21797 [002] 1410598.940480: instructions: + 867 main (/root/noploop) + +noploop 21797 [002] 1410598.947665: instructions: + a03 main (/root/noploop) + +noploop 21796 [001] 1410598.947923: instructions: + 893 main (/root/noploop) + +noploop 21796 [001] 1410598.951379: cycles: + 687 main (/root/noploop) + +noploop 21797 [002] 1410598.951390: cycles: + 78b main (/root/noploop) + +swapper 0 [005] 1410598.953066: cycles: + af2bfe poll_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 956752 cpuidle_enter_state (/lib/modules/4.13.0-rc1/build/vmlinux) + 956957 cpuidle_enter (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8623 call_cpuidle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c88c9 do_idle (/lib/modules/4.13.0-rc1/build/vmlinux) + 2c8b13 cpu_startup_entry (/lib/modules/4.13.0-rc1/build/vmlinux) + 252886 start_secondary (/lib/modules/4.13.0-rc1/build/vmlinux) + 2000cf verify_cpu (/lib/modules/4.13.0-rc1/build/vmlinux) + +noploop 21797 [002] 1410598.954849: instructions: + 6e3 main (/root/noploop) + +noploop 21796 [001] 1410598.955534: instructions: + 68b main (/root/noploop) + +cksum 21807 [004] 1410598.956752: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +cksum 21807 [004] 1410598.957817: cycles: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.962034: instructions: + 703 main (/root/noploop) + +noploop 21796 [001] 1410598.962952: instructions: + 9b3 main (/root/noploop) + +noploop 21797 [002] 1410598.969219: instructions: + 89f main (/root/noploop) + +noploop 21796 [001] 1410598.970137: instructions: + 707 main (/root/noploop) + +cksum 21807 [004] 1410598.973926: instructions: + 193b cksum (/usr/bin/cksum) + 1f52 main (/usr/bin/cksum) + +noploop 21797 [002] 1410598.976404: instructions: + 552f0000552f [unknown] ([unknown]) + +noploop 21796 [001] 1410598.977322: instructions: + 774db3aa23 [unknown] ([unknown]) + diff --git a/tools/FlameGraph/test/perf-dd-stacks-01.txt b/tools/FlameGraph/test/perf-dd-stacks-01.txt new file mode 100644 index 0000000..61bb2b5 --- /dev/null +++ b/tools/FlameGraph/test/perf-dd-stacks-01.txt @@ -0,0 +1,73 @@ +dd 29776 666709.771979: 10101010 cpu-clock: + 414b3b fsnotify (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d6b4c vfs_read (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d6b9f sys_read (/lib/modules/4.1.0-virtual/build/vmlinux) + 968f6e system_call (/lib/modules/4.1.0-virtual/build/vmlinux) + e5f70 read (/lib/x86_64-linux-gnu/libc-2.15.so) + 0 [unknown] ([unknown]) + +dd 29776 666709.782078: 10101010 cpu-clock: + 3d5d39 rw_verify_area (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d68f3 vfs_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d6c4f sys_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 968f6e system_call (/lib/modules/4.1.0-virtual/build/vmlinux) + e5fd0 write (/lib/x86_64-linux-gnu/libc-2.15.so) + 0 [unknown] ([unknown]) + +dd 29776 666709.792207: 10101010 cpu-clock: + 2d0c00 __srcu_read_unlock (/lib/modules/4.1.0-virtual/build/vmlinux) + 414d4c fsnotify (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d69de vfs_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d6c4f sys_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 968f6e system_call (/lib/modules/4.1.0-virtual/build/vmlinux) + e5fd0 write (/lib/x86_64-linux-gnu/libc-2.15.so) + 0 [unknown] ([unknown]) + +dd 29776 666709.802280: 10101010 cpu-clock: + e5f70 read (/lib/x86_64-linux-gnu/libc-2.15.so) + 0 [unknown] ([unknown]) + +dd 29776 666709.812381: 10101010 cpu-clock: + 3d6c5b sys_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 968f6e system_call (/lib/modules/4.1.0-virtual/build/vmlinux) + e5fd0 write (/lib/x86_64-linux-gnu/libc-2.15.so) + 0 [unknown] ([unknown]) + +dd 29776 666709.822526: 10101010 cpu-clock: + 2d0bfc __srcu_read_unlock (/lib/modules/4.1.0-virtual/build/vmlinux) + 414d4c fsnotify (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d69de vfs_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d6c4f sys_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 968f6e system_call (/lib/modules/4.1.0-virtual/build/vmlinux) + e5fd0 write (/lib/x86_64-linux-gnu/libc-2.15.so) + 0 [unknown] ([unknown]) + +dd 29776 666709.832583: 10101010 cpu-clock: + 2d0c0b __srcu_read_unlock (/lib/modules/4.1.0-virtual/build/vmlinux) + 414d4c fsnotify (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d69de vfs_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d6c4f sys_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 968f6e system_call (/lib/modules/4.1.0-virtual/build/vmlinux) + e5fd0 write (/lib/x86_64-linux-gnu/libc-2.15.so) + +dd 29776 666709.842684: 10101010 cpu-clock: + 3f2fa6 __fget_light (/lib/modules/4.1.0-virtual/build/vmlinux) + 3f2fe3 __fdget (/lib/modules/4.1.0-virtual/build/vmlinux) + 3f3ab2 __fdget_pos (/lib/modules/4.1.0-virtual/build/vmlinux) + 3d6c28 sys_write (/lib/modules/4.1.0-virtual/build/vmlinux) + 968f6e system_call (/lib/modules/4.1.0-virtual/build/vmlinux) + e5fd0 write (/lib/x86_64-linux-gnu/libc-2.15.so) + +dd 29776 666709.852785: 10101010 cpu-clock: + 31ef [unknown] (/bin/dd) + 7f2eb2b31c2c [unknown] ([unknown]) + +dd 29776 666709.862886: 10101010 cpu-clock: + 3f3aa0 __fdget_pos (/lib/modules/4.1.0-virtual/build/vmlinux) + 968f6e system_call (/lib/modules/4.1.0-virtual/build/vmlinux) + e5f70 read (/lib/x86_64-linux-gnu/libc-2.15.so) + 0 [unknown] ([unknown]) + +dd 29776 666709.872987: 10101010 cpu-clock: + 968f37 system_call (/lib/modules/4.1.0-virtual/build/vmlinux) + 246 [unknown] ([unknown]) diff --git a/tools/FlameGraph/test/perf-funcab-cmd-01.txt b/tools/FlameGraph/test/perf-funcab-cmd-01.txt new file mode 100644 index 0000000..530ac03 --- /dev/null +++ b/tools/FlameGraph/test/perf-funcab-cmd-01.txt @@ -0,0 +1,863 @@ +# ======== +# captured on: Thu Jul 7 20:47:43 2016 +# hostname : bgregg-test-i-xxxxxxxx +# os release : 3.13.0-49-generic +# perf version : 3.13.11-ckt17 +# arch : x86_64 +# nrcpus online : 2 +# nrcpus avail : 2 +# cpudesc : Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz +# cpuid : GenuineIntel,6,62,4 +# total memory : 7693752 kB +# cmdline : /usr/lib/linux-tools-3.13.0-49/perf record -F 99 -g ./func_ab +# event : name = cpu-clock, type = 1, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0, attr_mmap2 = 0, attr_mmap = 1, attr_mmap_data = 0 +# HEADER_CPU_TOPOLOGY info available, use -I to display +# HEADER_NUMA_TOPOLOGY info available, use -I to display +# pmu mappings: software = 1, tracepoint = 2, breakpoint = 5 +# ======== +# +func_ab 15285 28075374.517811: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.530122: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.542454: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.554769: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.567082: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.579396: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.591710: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.604026: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.615216: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.627530: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.639851: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.652209: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.664492: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.676807: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.689123: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.701438: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.713751: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.724990: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.737309: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.749628: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.761973: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.775638: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.787952: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.800267: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.812587: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.824901: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.837234: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.848441: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.860755: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.873052: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.885365: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.897680: cpu-clock: + 40056c func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.909993: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.922308: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.934639: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.946953: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.959267: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.970475: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.982769: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075374.995083: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.007397: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.019712: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.032056: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.044397: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.056721: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.069036: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.080244: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.092556: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.105076: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.117390: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.129691: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.142020: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.154335: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.166633: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.178947: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.191263: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.202470: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.214783: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.227079: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.239433: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.251747: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.264056: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.276375: cpu-clock: + 400541 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.288683: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.300999: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.313313: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.324520: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.336851: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.349164: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.361479: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.374963: cpu-clock: + 400568 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.387278: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.399592: cpu-clock: + 400545 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.411878: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.424221: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.435408: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.447766: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.460056: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.472392: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.484706: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.497070: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.509403: cpu-clock: + 400545 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.521718: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.534048: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.546363: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.557572: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.569886: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.582198: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.594491: cpu-clock: + 400568 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.606826: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.619110: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.631423: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.643754: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.656056: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.668383: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.679591: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.691906: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.704220: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.716535: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.728897: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.741228: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.753548: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.765902: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.778217: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.790578: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.801722: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.814042: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.826400: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.838733: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.851048: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.863362: cpu-clock: + 400541 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.875676: cpu-clock: + 400541 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.887990: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.900305: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.911513: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.923789: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.936193: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.948433: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.960746: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.973061: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.985376: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075375.997691: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.010006: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.022308: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.033606: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.045882: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.058195: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.070515: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.082829: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.095142: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.107456: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.119771: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.132056: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.144455: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.155623: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.167936: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.180224: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.192537: cpu-clock: + 400568 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.204850: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.217165: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.229481: cpu-clock: + 400541 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.241717: cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.254032: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.265201: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.277516: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.289829: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.302145: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.314460: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.326774: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.339106: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.351420: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.363736: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.376057: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.387267: cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.399550: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.411889: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.424209: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.436532: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.448852: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.461166: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.473480: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.485794: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.498151: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.509361: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.521675: cpu-clock: + 400568 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.533989: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.546259: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.558590: cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15285 28075376.570905: cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f9ca5486ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + diff --git a/tools/FlameGraph/test/perf-funcab-pid-01.txt b/tools/FlameGraph/test/perf-funcab-pid-01.txt new file mode 100644 index 0000000..6a168bd --- /dev/null +++ b/tools/FlameGraph/test/perf-funcab-pid-01.txt @@ -0,0 +1,1158 @@ +# ======== +# captured on: Thu Jul 7 20:48:39 2016 +# hostname : bgregg-test-i-xxxxxxxx +# os release : 3.13.0-49-generic +# perf version : 3.13.11-ckt17 +# arch : x86_64 +# nrcpus online : 2 +# nrcpus avail : 2 +# cpudesc : Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz +# cpuid : GenuineIntel,6,62,4 +# total memory : 7693752 kB +# cmdline : /usr/lib/linux-tools-3.13.0-49/perf record -F 99 -p 15294 -g +# event : name = cpu-clock, type = 1, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0, attr_mmap2 = 0, attr_mmap = 1, attr_mmap_data = 0 +# HEADER_CPU_TOPOLOGY info available, use -I to display +# HEADER_NUMA_TOPOLOGY info available, use -I to display +# pmu mappings: software = 1, tracepoint = 2, breakpoint = 5 +# ======== +# +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400541 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400568 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400568 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400568 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400541 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400541 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400568 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400541 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400541 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400549 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400550 func_a (/root/lang/func_ab) + 40059d main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400570 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +func_ab 15294 cpu-clock: + 400577 func_b (/root/lang/func_ab) + 4005b1 main (/root/lang/func_ab) + 7f10b9594ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + diff --git a/tools/FlameGraph/test/perf-iperf-stacks-pidtid-01.txt b/tools/FlameGraph/test/perf-iperf-stacks-pidtid-01.txt new file mode 100644 index 0000000..6c740d4 --- /dev/null +++ b/tools/FlameGraph/test/perf-iperf-stacks-pidtid-01.txt @@ -0,0 +1,3608 @@ +iperf 27409/28744 [000] 441995.133575: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28742 [001] 441995.133584: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + +iperf 27409/28741 [002] 441995.133589: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5264 __wake_up (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d0ee sk_stream_write_space (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c68aa tcp_check_space (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbd0f tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7790 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bff04 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.133599: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9714a6 preempt_schedule_common (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9714dc _cond_resched (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3cb301 kmem_cache_alloc_node (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8659ae __alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c2876 sk_stream_alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3763 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.143681: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28742 [001] 441995.143685: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28738 [002] 441995.143689: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.143703: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.153778: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.153785: cpu-clock: + 8647d5 skb_release_head_state (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 865447 kfree_skb_partial (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfb2 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.153788: cpu-clock: + 8cf2f7 tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.153798: cpu-clock: + 8c0efa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f258c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.163877: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.163886: cpu-clock: + 973cae schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.163895: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.163898: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28739 [000] 441995.173977: cpu-clock: + 8d6c86 tcp_v4_send_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.173991: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.173993: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.173999: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28742 [001] 441995.184057: cpu-clock: + 8cc0cb tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.184057: cpu-clock: + 8c63f5 tcp_event_data_recv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f258c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.184057: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.184057: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.194180: cpu-clock: + 8cf77b tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.194189: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.194197: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.194202: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.204245: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.204281: cpu-clock: + 8ddf55 raw_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.204290: cpu-clock: + 974bc6 _raw_spin_lock_irqsave (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.204303: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.214381: cpu-clock: + 8b2c2b ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bff04 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28736 [001] 441995.214394: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 203b13 prepare_exit_to_usermode (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 203bf5 syscall_return_slowpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974f98 int_ret_from_sys_call (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +run 28796/28796 [002] 441995.214395: cpu-clock: + 201028 xen_hypercall_mmu_update (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 39fc2a do_set_pte (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3731a5 filemap_map_pages (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3a19cc handle_mm_fault (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 262fba __do_page_fault (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 263280 do_page_fault (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976fb8 page_fault (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 141460 __GI___strncmp_ssse3 (/lib/x86_64-linux-gnu/libc-2.19.so) + 752f3a646e616d6d [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.214404: cpu-clock: + 8b6f42 ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.224484: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.224492: cpu-clock: + 864dfe __copy_skb_header (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 864ece __skb_clone (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8666c3 skb_clone (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf25c tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.224496: cpu-clock: + 865965 __alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c628b __tcp_ack_snd_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfa1 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28737 [003] 441995.224505: cpu-clock: + 8b6a50 __ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.234587: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.234598: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.234599: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.234606: cpu-clock: + 3bf63a policy_zonelist (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3bfa1f alloc_pages_current (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86086c skb_page_frag_refill (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861221 sk_page_frag_refill (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c31c3 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.244685: cpu-clock: + 405eb7 __fget_light (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85c9a7 sockfd_lookup_light (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d3e7 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.244695: cpu-clock: + 85d3e7 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.244698: cpu-clock: + 864290 kfree_skbmem (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfb2 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.244707: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.254786: cpu-clock: + 8c660c tcp_event_data_recv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbf3e tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.254798: cpu-clock: + 8d0485 tcp_release_cb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c149d tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28736 [001] 441995.254800: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.254807: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.264889: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.264898: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.264904: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.264912: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 203b13 prepare_exit_to_usermode (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 203bf5 syscall_return_slowpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974f98 int_ret_from_sys_call (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.274988: cpu-clock: + 974bc6 _raw_spin_lock_irqsave (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2ddd16 mod_timer (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 860938 sk_reset_timer (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ceb81 tcp_schedule_loss_probe (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf851 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.274997: cpu-clock: + 878075 netif_rx (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87aa49 dev_hard_start_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b126 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d1079 tcp_send_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c628b __tcp_ack_snd_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfa1 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.275000: cpu-clock: + 8c62c0 tcp_grow_window.isra.27 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbf3e tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.275010: cpu-clock: + 8add23 ipv4_dst_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85f92c __sk_dst_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6fd3 ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.285090: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.285099: cpu-clock: + 8d6037 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +run 28797/28797 [002] 441995.285101: cpu-clock: + 379edc free_hot_cold_page_list (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 380c63 release_pages (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3b2c8f free_pages_and_swap_cache (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 39d146 tlb_flush_mmu_free (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 39e0ec tlb_finish_mmu (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ef4a2 shift_arg_pages (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ef6c8 setup_arg_pages (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 43f328 load_elf_binary (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3effbe search_binary_handler (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 43d3ce load_script (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3effbe search_binary_handler (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3f15e6 do_execveat_common.isra.31 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3f19fa sys_execve (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9750d5 return_from_execve (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + c1337 __execve (/lib/x86_64-linux-gnu/libc-2.19.so) + +iperf 28735/28737 [003] 441995.285114: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.295195: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 203b13 prepare_exit_to_usermode (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 203bf5 syscall_return_slowpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974f98 int_ret_from_sys_call (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.295199: cpu-clock: + 87841a __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.295206: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.295212: cpu-clock: + 8d3833 tcp_md5_do_lookup (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cd64d tcp_established_options (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ce8b4 tcp_current_mss (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf86c tcp_send_mss (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3077 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.305291: cpu-clock: + 376bf9 __zone_watermark_ok (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 37acf9 get_page_from_freelist (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 37b6b7 __alloc_pages_nodemask (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3bfa31 alloc_pages_current (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86086c skb_page_frag_refill (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861221 sk_page_frag_refill (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c31c3 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.305300: cpu-clock: + 8d7793 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +multilog 28797/28797 [002] 441995.305305: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 263280 do_page_fault (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976fb8 page_fault (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + c684 _dl_relocate_object (/lib/x86_64-linux-gnu/ld-2.19.so) + 3afa dl_main (/lib/x86_64-linux-gnu/ld-2.19.so) + 17565 _dl_sysdep_start (/lib/x86_64-linux-gnu/ld-2.19.so) + +iperf 27409/28743 [003] 441995.305313: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28744 [000] 441995.315395: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.315401: cpu-clock: + 864faf __skb_clone (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8666c3 skb_clone (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf25c tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.315405: cpu-clock: + 2d13 [unknown] (/usr/bin/iperf) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.315414: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20bdd9 xen_irq_enable_direct_end (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + +iperf 27409/28744 [000] 441995.325493: cpu-clock: + 8d3794 sock_put (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc012 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.325502: cpu-clock: + 87adb5 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.325506: cpu-clock: + 8600e0 sock_def_readable (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.325515: cpu-clock: + 8618e0 release_sock (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.335594: cpu-clock: + 8d3840 tcp_v4_md5_lookup (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cede7 tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.335603: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28738 [002] 441995.335611: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.335616: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.345698: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5264 __wake_up (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d0ee sk_stream_write_space (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c68aa tcp_check_space (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbd0f tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7790 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bff04 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.345704: cpu-clock: + 8cf16d tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d1079 tcp_send_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c628b __tcp_ack_snd_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfa1 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28741 [002] 441995.345709: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.345717: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28739 [000] 441995.355797: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.355806: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.355809: cpu-clock: + f7a __vdso_gettimeofday ([vdso]) + 2c5f [unknown] (/usr/bin/iperf) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.355821: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.365859: cpu-clock: + 8d754d tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bff04 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.365897: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.365918: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.365920: cpu-clock: + 87b0c9 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d1079 tcp_send_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c628b __tcp_ack_snd_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfa1 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28744 [000] 441995.375998: cpu-clock: + 85d23c sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.376010: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.376010: cpu-clock: + 862bfc sk_free (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 76f33f loopback_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87aa49 dev_hard_start_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b126 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.376020: cpu-clock: + 87ab49 dev_hard_start_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b126 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d1079 tcp_send_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c628b __tcp_ack_snd_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfa1 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28739 [000] 441995.386052: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.386108: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.386112: cpu-clock: + 8792cd net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc012 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.386120: cpu-clock: + 8c14ad tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f258c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.396211: cpu-clock: + 5a5641 copy_from_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.396211: cpu-clock: + 396ed5 kmalloc_slab (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 864731 __kmalloc_reserve.isra.32 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8659de __alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0fc4 tcp_send_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c628b __tcp_ack_snd_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfa1 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.396212: cpu-clock: + 87a701 validate_xmit_skb.isra.102.part.103 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b1af __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.396222: cpu-clock: + 8b6d85 ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.406305: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.406310: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.406313: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28737 [003] 441995.406322: cpu-clock: + 860926 sk_reset_timer (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf851 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.416402: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.416411: cpu-clock: + 8792c9 net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.416415: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.416424: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f258c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.426503: cpu-clock: + 86598d __alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c2876 sk_stream_alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3763 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.426513: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.426516: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28737 [003] 441995.426525: cpu-clock: + 8bf626 tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.436604: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5264 __wake_up (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d0ee sk_stream_write_space (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c68aa tcp_check_space (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbd0f tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7790 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc012 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.436613: cpu-clock: + 8bc169 __inet_lookup_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d742a tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.436617: cpu-clock: + 76f325 loopback_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b126 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.436626: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28744 [000] 441995.446705: cpu-clock: + ee80 __pthread_disable_asynccancel (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28736 [001] 441995.446717: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.446718: cpu-clock: + 864705 __kmalloc_reserve.isra.32 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0fc4 tcp_send_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c628b __tcp_ack_snd_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfa1 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.446727: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.456807: cpu-clock: + 8b6714 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.456816: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.456820: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5264 __wake_up (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d0ee sk_stream_write_space (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c68aa tcp_check_space (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbd0f tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7790 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bff04 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.456829: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f258c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.466907: cpu-clock: + 86bbcb skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.466916: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.466926: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.466928: cpu-clock: + 862bfc sk_free (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 76f33f loopback_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87aa49 dev_hard_start_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b126 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.477008: cpu-clock: + 2e41d5 ktime_get_with_offset (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87808c netif_rx (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 76f388 loopback_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87aa49 dev_hard_start_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b126 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d1079 tcp_send_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c628b __tcp_ack_snd_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfa1 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.477017: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.477021: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.477032: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.487093: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + +iperf 28735/28736 [001] 441995.487119: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.487122: cpu-clock: + 5a1213 __memmove (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc012 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.487136: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9714a6 preempt_schedule_common (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9714dc _cond_resched (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3cb301 kmem_cache_alloc_node (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8659ae __alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c2876 sk_stream_alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3763 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.497210: cpu-clock: + 861af6 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28742 [001] 441995.497219: cpu-clock: + 8add23 ipv4_dst_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60f6 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.497223: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.497233: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.507315: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.507321: cpu-clock: + 27a000 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.507324: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + +iperf 28735/28737 [003] 441995.507333: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.517413: cpu-clock: + 8bf637 tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.517421: cpu-clock: + 2b547f finish_wait (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b0b sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28741 [002] 441995.517424: cpu-clock: + 8d6037 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28737 [003] 441995.517435: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.527513: cpu-clock: + 877fb4 netif_rx_internal (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87808c netif_rx (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 76f388 loopback_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87aa49 dev_hard_start_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b126 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d1079 tcp_send_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c628b __tcp_ack_snd_check (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbfa1 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.527523: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.527526: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.527536: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.537616: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28742 [001] 441995.537623: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc012 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.537626: cpu-clock: + 2bc681 __raw_callee_save___pv_queued_spin_unlock (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c2f86 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.537636: cpu-clock: + 3bfa55 alloc_pages_current (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86086c skb_page_frag_refill (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861221 sk_page_frag_refill (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c31c3 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.547716: cpu-clock: + 8b3317 ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.547725: cpu-clock: + 8cdfdb tcp_wfree (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 76f33f loopback_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87aa49 dev_hard_start_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b126 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.547733: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.547737: cpu-clock: + 8c9205 tcp_rcv_space_adjust (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f258c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.557817: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28736 [001] 441995.557826: cpu-clock: + 406bd5 __fdget_pos (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.557830: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9714a6 preempt_schedule_common (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9714dc _cond_resched (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3cb301 kmem_cache_alloc_node (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8659ae __alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c2876 sk_stream_alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3763 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.557838: cpu-clock: + 881435 dst_release (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d0753 tcp_push_one (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3585 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.567918: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.567927: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2ddda5 mod_timer (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 860938 sk_reset_timer (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ca418 tcp_rearm_rto (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8caa4b tcp_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbcd4 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7790 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bff04 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.567930: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3796eb free_compound_page (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3806d4 __put_compound_page (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 380716 put_compound_page (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3808b6 put_page (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 865228 skb_release_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8652b4 skb_release_all (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8652d2 __kfree_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cabfc tcp_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cbcd4 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7790 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bff04 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25980008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.567943: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.578021: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.578027: cpu-clock: + 974a9b _raw_spin_lock_bh (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c0e5b tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.578031: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28743 [003] 441995.578040: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28742 [001] 441995.588210: cpu-clock: + 8bc115 __inet_lookup_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d1079 tcp_send_ack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf9a6 tcp_cleanup_rbuf (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1495 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 27409/28743 [003] 441995.588210: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f258c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.588210: cpu-clock: + 879075 net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.588210: cpu-clock: + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28739 [000] 441995.598220: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.598230: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.598233: cpu-clock: + 2e41dc ktime_get_with_offset (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87808c netif_rx (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 76f388 loopback_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87aa49 dev_hard_start_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b126 __dev_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 87b253 dev_queue_xmit_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6862 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28743 [003] 441995.598244: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 861b29 sk_wait_data (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c1525 tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28739 [000] 441995.608322: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28736 [001] 441995.608332: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5580 __wake_up_sync_key (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d65f8 tcp_prequeue (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d7781 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28741 [002] 441995.608333: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +iperf 28735/28737 [003] 441995.608343: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28739 [000] 441995.618422: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3913 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.618431: cpu-clock: + 405eb5 __fget_light (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85c9a7 sockfd_lookup_light (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d3e7 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.618435: cpu-clock: + 865965 __alloc_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3763 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.618443: cpu-clock: + 8b35bc ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6782 ip_finish_output2 (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b7ab3 ip_finish_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b886d ip_output (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6b61 ip_local_out_sk (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b6eca ip_queue_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf1fa tcp_transmit_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cf725 tcp_write_xmit (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d067e __tcp_push_pending_frames (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bf70f tcp_push (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3021 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.628523: cpu-clock: + 8d7037 tcp_v4_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2f6f ip_local_deliver_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b3231 ip_local_deliver (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b2c2a ip_rcv_finish (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8b352d ip_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8789d7 __netif_receive_skb_core (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 878d48 __netif_receive_skb (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 879a0f process_backlog (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8791bc net_rx_action (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 279de7 __do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 976b4c do_softirq_own_stack (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a047 do_softirq (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 27a0cd __local_bh_enable_ip (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc012 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 27409/28742 [001] 441995.628533: cpu-clock: + 59fef5 copy_user_enhanced_fast_string (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86bb0e skb_copy_datagram_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8cc255 tcp_rcv_established (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8d60a0 tcp_v4_do_rcv (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8bfee7 tcp_prequeue_process (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c16aa tcp_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ec08f inet_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d23b sock_recvmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d455 SYSC_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85e63e sys_recvfrom (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f7eb __libc_recv (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f25900008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) + +iperf 28735/28738 [002] 441995.628543: cpu-clock: + 20122a xen_hypercall_xen_version (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 20be32 check_events (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 970cb7 __schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 9712a3 schedule (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 973c9a schedule_timeout (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d1e2 sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 28735/28737 [003] 441995.628545: cpu-clock: + 974bca _raw_spin_lock_irqsave (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 2b5456 finish_wait (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 86d36a sk_stream_wait_memory (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8c3453 tcp_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 8ebf17 inet_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d708 sock_sendmsg (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 85d798 sock_write_iter (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3e9b6a __vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3ea199 vfs_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 3eae86 sys_write (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + 974e36 entry_SYSCALL_64_fastpath (/lib/modules/4.3.0-rc1-virtual/build/vmlinux) + f35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 20000 [unknown] ([unknown]) + +iperf 27409/28744 [000] 441995.638625: cpu-clock: + 762f [unknown] (/usr/bin/iperf) + 7f259c0008f0 [unknown] ([unknown]) + 0 [unknown] ([unknown]) diff --git a/tools/FlameGraph/test/perf-java-faults-01.txt b/tools/FlameGraph/test/perf-java-faults-01.txt new file mode 100644 index 0000000..d12b764 --- /dev/null +++ b/tools/FlameGraph/test/perf-java-faults-01.txt @@ -0,0 +1,189 @@ +perf 47118 [011] 51499.088689: 1 page-faults: + 29ebc cmd_record (/usr/bin/perf) + 69695 run_builtin (/usr/bin/perf) + 1cfa6 main (/usr/bin/perf) + 21ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +perf 47118 [011] 51499.088702: 1 page-faults: + 29f65 cmd_record (/usr/bin/perf) + 69695 run_builtin (/usr/bin/perf) + 1cfa6 main (/usr/bin/perf) + 21ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +perf 47118 [011] 51499.088706: 1 page-faults: + 29f65 cmd_record (/usr/bin/perf) + 69695 run_builtin (/usr/bin/perf) + 1cfa6 main (/usr/bin/perf) + 21ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +perf 47118 [011] 51499.088709: 4 page-faults: + 29f65 cmd_record (/usr/bin/perf) + 69695 run_builtin (/usr/bin/perf) + 1cfa6 main (/usr/bin/perf) + 21ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +perf 47119 [029] 51499.088715: 1 page-faults: + 9ffa do_lookup_x (/lib/x86_64-linux-gnu/ld-2.19.so) + +perf 47118 [011] 51499.088718: 33 page-faults: + 29f65 cmd_record (/usr/bin/perf) + 69695 run_builtin (/usr/bin/perf) + 1cfa6 main (/usr/bin/perf) + 21ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +perf 47119 [029] 51499.088725: 1 page-faults: + 9ffa do_lookup_x (/lib/x86_64-linux-gnu/ld-2.19.so) + +perf 47119 [029] 51499.088733: 1 page-faults: + 9ffa do_lookup_x (/lib/x86_64-linux-gnu/ld-2.19.so) + +perf 47119 [029] 51499.088738: 4 page-faults: + 9ffa do_lookup_x (/lib/x86_64-linux-gnu/ld-2.19.so) + +perf 47119 [029] 51499.088764: 20 page-faults: + 9ffa do_lookup_x (/lib/x86_64-linux-gnu/ld-2.19.so) + +sleep 47119 [021] 51499.089086: 1 page-faults: + 5b0415 __clear_user (/lib/modules/4.4.9-virtual/build/vmlinux) + 5b046b clear_user (/lib/modules/4.4.9-virtual/build/vmlinux) + 447364 padzero (/lib/modules/4.4.9-virtual/build/vmlinux) + 449719 load_elf_binary (/lib/modules/4.4.9-virtual/build/vmlinux) + 3f938e search_binary_handler (/lib/modules/4.4.9-virtual/build/vmlinux) + 3fa9e7 do_execveat_common.isra.31 (/lib/modules/4.4.9-virtual/build/vmlinux) + 3fae1a sys_execve (/lib/modules/4.4.9-virtual/build/vmlinux) + 990b95 return_from_execve (/lib/modules/4.4.9-virtual/build/vmlinux) + c1337 __execve (/lib/x86_64-linux-gnu/libc-2.19.so) + +sleep 47119 [021] 51499.089108: 1 page-faults: + 5b0415 __clear_user (/lib/modules/4.4.9-virtual/build/vmlinux) + 5b046b clear_user (/lib/modules/4.4.9-virtual/build/vmlinux) + 447364 padzero (/lib/modules/4.4.9-virtual/build/vmlinux) + 44a419 load_elf_binary (/lib/modules/4.4.9-virtual/build/vmlinux) + 3f938e search_binary_handler (/lib/modules/4.4.9-virtual/build/vmlinux) + 3fa9e7 do_execveat_common.isra.31 (/lib/modules/4.4.9-virtual/build/vmlinux) + 3fae1a sys_execve (/lib/modules/4.4.9-virtual/build/vmlinux) + 990b95 return_from_execve (/lib/modules/4.4.9-virtual/build/vmlinux) + c1337 __execve (/lib/x86_64-linux-gnu/libc-2.19.so) + +sleep 47119 [021] 51499.089124: 1 page-faults: + 5aebb5 copy_user_enhanced_fast_string (/lib/modules/4.4.9-virtual/build/vmlinux) + 3f938e search_binary_handler (/lib/modules/4.4.9-virtual/build/vmlinux) + 3fa9e7 do_execveat_common.isra.31 (/lib/modules/4.4.9-virtual/build/vmlinux) + 3fae1a sys_execve (/lib/modules/4.4.9-virtual/build/vmlinux) + 990b95 return_from_execve (/lib/modules/4.4.9-virtual/build/vmlinux) + c1337 __execve (/lib/x86_64-linux-gnu/libc-2.19.so) + +sleep 47119 [021] 51499.089142: 3 page-faults: + 12d0 _start (/lib/x86_64-linux-gnu/ld-2.19.so) + +sleep 47119 [021] 51499.089157: 9 page-faults: + 4eba _dl_start (/lib/x86_64-linux-gnu/ld-2.19.so) + 12d8 _dl_start_user (/lib/x86_64-linux-gnu/ld-2.19.so) + +sleep 47119 [021] 51499.089220: 24 page-faults: + 1a41a memcmp (/lib/x86_64-linux-gnu/ld-2.19.so) + 6873756c66660036 [unknown] ([unknown]) + +sleep 47119 [021] 51499.089410: 72 page-faults: + a1a20 handle_intel (/lib/x86_64-linux-gnu/libc-2.19.so) + +java 43869 [025] 51499.133872: 1 page-faults: + 80786 _int_malloc (/lib/x86_64-linux-gnu/libc-2.19.so) + +java 43869 [025] 51499.133952: 1 page-faults: + 80786 _int_malloc (/lib/x86_64-linux-gnu/libc-2.19.so) + +java 43869 [025] 51499.133957: 1 page-faults: + 1501e4 __memmove_ssse3_back (/lib/x86_64-linux-gnu/libc-2.19.so) + bfa3 inflate (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/libzip.so) + 34da Java_java_util_zip_Inflater_inflateBytes (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/libzip.so) + 7fcf703ea8c6 Ljava/util/zip/Inflater;::inflateBytes (/tmp/perf-43287.map) + 7fcf7f388018 Lcom/XXX::XXX (/tmp/perf-43287.map) + 7fcf78101ab8 Lnet/spy/memcached/transcoders/TranscodeService$1;::call (/tmp/perf-43287.map) + 7fcf78bb95bc Lnet/spy/memcached/protocol/binary/GetOperationImpl;::decodePayload (/tmp/perf-43287.map) + 7fcf7786b600 Lnet/spy/memcached/protocol/binary/OperationImpl;::finishedPayload (/tmp/perf-43287.map) + 7fcf763ed7c8 Lnet/spy/memcached/protocol/binary/OperationImpl;::readFromBuffer (/tmp/perf-43287.map) + 7fcf8efb0540 Lnet/spy/memcached/MemcachedConnection;::handleReads (/tmp/perf-43287.map) + 7fcf8efc0630 Lnet/spy/memcached/MemcachedConnection;::handleIO (/tmp/perf-43287.map) + 7fcf743b01b4 Lnet/spy/memcached/MemcachedConnection;::handleIO (/tmp/perf-43287.map) + 7fcf75b155bc Lnet/spy/memcached/EVCacheConnection;::run (/tmp/perf-43287.map) + 7fcf700004e0 call_stub (/tmp/perf-43287.map) + 68c616 _ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 68cb21 _ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 68cfc7 _ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 723d80 _ZL12thread_entryP10JavaThreadP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + a69dcf _ZN10JavaThread17thread_main_innerEv (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + a69efc _ZN10JavaThread3runEv (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 91d9d8 _ZL10java_startP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 8182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 43869 [025] 51499.133962: 2 page-faults: + 1501e4 __memmove_ssse3_back (/lib/x86_64-linux-gnu/libc-2.19.so) + bfa3 inflate (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/libzip.so) + 34da Java_java_util_zip_Inflater_inflateBytes (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/libzip.so) + 7fcf703ea8c6 Ljava/util/zip/Inflater;::inflateBytes (/tmp/perf-43287.map) + 7fcf7f388018 XXX::XXX (/tmp/perf-43287.map) + 7fcf78101ab8 Lnet/spy/memcached/transcoders/TranscodeService$1;::call (/tmp/perf-43287.map) + 7fcf78bb95bc Lnet/spy/memcached/protocol/binary/GetOperationImpl;::decodePayload (/tmp/perf-43287.map) + 7fcf7786b600 Lnet/spy/memcached/protocol/binary/OperationImpl;::finishedPayload (/tmp/perf-43287.map) + 7fcf763ed7c8 Lnet/spy/memcached/protocol/binary/OperationImpl;::readFromBuffer (/tmp/perf-43287.map) + 7fcf8efb0540 Lnet/spy/memcached/MemcachedConnection;::handleReads (/tmp/perf-43287.map) + 7fcf8efc0630 Lnet/spy/memcached/MemcachedConnection;::handleIO (/tmp/perf-43287.map) + 7fcf743b01b4 Lnet/spy/memcached/MemcachedConnection;::handleIO (/tmp/perf-43287.map) + 7fcf75b155bc Lnet/spy/memcached/EVCacheConnection;::run (/tmp/perf-43287.map) + 7fcf700004e0 call_stub (/tmp/perf-43287.map) + 68c616 _ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 68cb21 _ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 68cfc7 _ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 723d80 _ZL12thread_entryP10JavaThreadP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + a69dcf _ZN10JavaThread17thread_main_innerEv (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + a69efc _ZN10JavaThread3runEv (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 91d9d8 _ZL10java_startP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 8182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 43869 [025] 51499.134005: 16 page-faults: + 1501e4 __memmove_ssse3_back (/lib/x86_64-linux-gnu/libc-2.19.so) + bfa3 inflate (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/libzip.so) + 34da Java_java_util_zip_Inflater_inflateBytes (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/libzip.so) + 7fcf703ea8c6 Ljava/util/zip/Inflater;::inflateBytes (/tmp/perf-43287.map) + 7fcf7f388018 XXX::XXX (/tmp/perf-43287.map) + 7fcf78101ab8 Lnet/spy/memcached/transcoders/TranscodeService$1;::call (/tmp/perf-43287.map) + 7fcf78bb95bc Lnet/spy/memcached/protocol/binary/GetOperationImpl;::decodePayload (/tmp/perf-43287.map) + 7fcf7786b600 Lnet/spy/memcached/protocol/binary/OperationImpl;::finishedPayload (/tmp/perf-43287.map) + 7fcf763ed7c8 Lnet/spy/memcached/protocol/binary/OperationImpl;::readFromBuffer (/tmp/perf-43287.map) + 7fcf8efb0540 Lnet/spy/memcached/MemcachedConnection;::handleReads (/tmp/perf-43287.map) + 7fcf8efc0630 Lnet/spy/memcached/MemcachedConnection;::handleIO (/tmp/perf-43287.map) + 7fcf743b01b4 Lnet/spy/memcached/MemcachedConnection;::handleIO (/tmp/perf-43287.map) + 7fcf75b155bc Lnet/spy/memcached/EVCacheConnection;::run (/tmp/perf-43287.map) + 7fcf700004e0 call_stub (/tmp/perf-43287.map) + 68c616 _ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 68cb21 _ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 68cfc7 _ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 723d80 _ZL12thread_entryP10JavaThreadP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + a69dcf _ZN10JavaThread17thread_main_innerEv (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + a69efc _ZN10JavaThread3runEv (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 91d9d8 _ZL10java_startP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 8182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 44406 [013] 51499.134798: 1 page-faults: + 7fcf73dcea29 Lorg/apache/tomcat/jni/Socket;::sendbb (/tmp/perf-43287.map) + 7fcf77b96440 Lorg/apache/coyote/http11/AbstractHttp11Processor;::action (/tmp/perf-43287.map) + 7fcf932a30e0 Lorg/apache/catalina/connector/CoyoteAdapter;::service (/tmp/perf-43287.map) + 7fcf79ac3840 Lorg/apache/coyote/http11/AbstractHttp11Processor;::process (/tmp/perf-43287.map) + 7fcf853cee48 Lorg/apache/coyote/AbstractProtocol$AbstractConnectionHandler;::process (/tmp/perf-43287.map) + 7fcf7f38306c Lorg/apache/tomcat/util/net/AprEndpoint$SocketProcessor;::doRun (/tmp/perf-43287.map) + 7fcf7f41faa8 Lorg/apache/tomcat/util/net/AprEndpoint$SocketProcessor;::run (/tmp/perf-43287.map) + 7fcf75c71028 Ljava/util/concurrent/ThreadPoolExecutor;::runWorker (/tmp/perf-43287.map) + 7fcf73173544 Ljava/util/concurrent/ThreadPoolExecutor$Worker;::run (/tmp/perf-43287.map) + 7fcf700079a9 Interpreter (/tmp/perf-43287.map) + 7fcf7316bbc4 Ljava/lang/Thread;::run (/tmp/perf-43287.map) + 7fcf700004e0 call_stub (/tmp/perf-43287.map) + 68c616 _ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 68cb21 _ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 68cfc7 _ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 723d80 _ZL12thread_entryP10JavaThreadP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + a69dcf _ZN10JavaThread17thread_main_innerEv (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + a69efc _ZN10JavaThread3runEv (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 91d9d8 _ZL10java_startP6Thread (/usr/lib/jvm/java-8-oracle-1.8.0.72/jre/lib/amd64/server/libjvm.so) + 8182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + diff --git a/tools/FlameGraph/test/perf-java-stacks-01.txt b/tools/FlameGraph/test/perf-java-stacks-01.txt new file mode 100644 index 0000000..423f937 --- /dev/null +++ b/tools/FlameGraph/test/perf-java-stacks-01.txt @@ -0,0 +1,1342 @@ +# ======== +# captured on: Sun Oct 25 23:31:43 2015 +# hostname : lgud-bgregg +# os release : 3.13.0-44-generic +# perf version : 3.13.11-ckt12 +# arch : x86_64 +# nrcpus online : 4 +# nrcpus avail : 4 +# cpudesc : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz +# cpuid : GenuineIntel,6,42,7 +# total memory : 4005800 kB +# cmdline : /usr/lib/linux-tools-3.13.0-44/perf record -F 99 -a -g -- sleep 30 +# event : name = cycles, type = 0, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0, attr_mmap2 = 0, attr_mmap = 1, attr_mmap_data = 0 +# HEADER_CPU_TOPOLOGY info available, use -I to display +# HEADER_NUMA_TOPOLOGY info available, use -I to display +# pmu mappings: cpu = 4, software = 1, tracepoint = 2, uncore_cbox_0 = 6, uncore_cbox_1 = 7, uncore_cbox_2 = 8, uncore_cbox_3 = 9, breakpoint = 5 +# ======== +# +ab 23927 [000] 184694.229089: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + ffffffff816937b4 inet_sendmsg ([kernel.kallsyms]) + ffffffff8160b55e sock_aio_write ([kernel.kallsyms]) + ffffffff811bd4aa do_sync_write ([kernel.kallsyms]) + ffffffff811bdd2d vfs_write ([kernel.kallsyms]) + ffffffff811be669 sys_write ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f26dc479340 __write_nocancel (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f26cab4c0b0 [unknown] ([unknown]) + +ab 23927 [000] 184694.229097: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + ffffffff816937b4 inet_sendmsg ([kernel.kallsyms]) + ffffffff8160b55e sock_aio_write ([kernel.kallsyms]) + ffffffff811bd4aa do_sync_write ([kernel.kallsyms]) + ffffffff811bdd2d vfs_write ([kernel.kallsyms]) + ffffffff811be669 sys_write ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f26dc479340 __write_nocancel (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f26cab4c0b0 [unknown] ([unknown]) + +ab 23927 [000] 184694.229099: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + ffffffff816937b4 inet_sendmsg ([kernel.kallsyms]) + ffffffff8160b55e sock_aio_write ([kernel.kallsyms]) + ffffffff811bd4aa do_sync_write ([kernel.kallsyms]) + ffffffff811bdd2d vfs_write ([kernel.kallsyms]) + ffffffff811be669 sys_write ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f26dc479340 __write_nocancel (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f26cab4c0b0 [unknown] ([unknown]) + +ab 23927 [000] 184694.229101: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + ffffffff816937b4 inet_sendmsg ([kernel.kallsyms]) + ffffffff8160b55e sock_aio_write ([kernel.kallsyms]) + ffffffff811bd4aa do_sync_write ([kernel.kallsyms]) + ffffffff811bdd2d vfs_write ([kernel.kallsyms]) + ffffffff811be669 sys_write ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f26dc479340 __write_nocancel (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f26cab4c0b0 [unknown] ([unknown]) + +java 23921 [001] 184694.229109: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + 7f6b2d259b1d Lorg/mozilla/javascript/WrapFactory;.wrap (/tmp/perf-23895.map) + 7f6b2d329384 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23921 [001] 184694.229114: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + 7f6b2d259b1d Lorg/mozilla/javascript/WrapFactory;.wrap (/tmp/perf-23895.map) + 7f6b2d329384 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23921 [001] 184694.229117: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + 7f6b2d259b1d Lorg/mozilla/javascript/WrapFactory;.wrap (/tmp/perf-23895.map) + 7f6b2d329384 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23921 [001] 184694.229119: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + 7f6b2d259b1d Lorg/mozilla/javascript/WrapFactory;.wrap (/tmp/perf-23895.map) + 7f6b2d329384 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +perf 23929 [002] 184694.229126: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dbfef smp_call_function_single ([kernel.kallsyms]) + ffffffff8113e044 cpu_function_call ([kernel.kallsyms]) + ffffffff811419f5 perf_event_enable ([kernel.kallsyms]) + ffffffff8113e0d8 perf_event_for_each_child ([kernel.kallsyms]) + ffffffff81141b1b perf_ioctl ([kernel.kallsyms]) + ffffffff811d0e80 do_vfs_ioctl ([kernel.kallsyms]) + ffffffff811d10e1 sys_ioctl ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f2ccba26ec7 __GI___ioctl (/lib/x86_64-linux-gnu/libc-2.19.so) + 415ad5 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 4081a5 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 407a40 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 7f2ccb956ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +swapper 0 [000] 184694.229130: cycles: + ffffffff810c8c9e rcu_idle_enter ([kernel.kallsyms]) + ffffffff810bef30 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8170f247 rest_init ([kernel.kallsyms]) + ffffffff81d35f70 start_kernel ([kernel.kallsyms]) + ffffffff81d355ee x86_64_start_reservations ([kernel.kallsyms]) + ffffffff81d35733 x86_64_start_kernel ([kernel.kallsyms]) + +perf 23929 [002] 184694.229130: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dbfef smp_call_function_single ([kernel.kallsyms]) + ffffffff8113e044 cpu_function_call ([kernel.kallsyms]) + ffffffff811419f5 perf_event_enable ([kernel.kallsyms]) + ffffffff8113e0d8 perf_event_for_each_child ([kernel.kallsyms]) + ffffffff81141b1b perf_ioctl ([kernel.kallsyms]) + ffffffff811d0e80 do_vfs_ioctl ([kernel.kallsyms]) + ffffffff811d10e1 sys_ioctl ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f2ccba26ec7 __GI___ioctl (/lib/x86_64-linux-gnu/libc-2.19.so) + 415ad5 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 4081a5 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 407a40 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 7f2ccb956ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +perf 23929 [002] 184694.229133: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dbfef smp_call_function_single ([kernel.kallsyms]) + ffffffff8113e044 cpu_function_call ([kernel.kallsyms]) + ffffffff811419f5 perf_event_enable ([kernel.kallsyms]) + ffffffff8113e0d8 perf_event_for_each_child ([kernel.kallsyms]) + ffffffff81141b1b perf_ioctl ([kernel.kallsyms]) + ffffffff811d0e80 do_vfs_ioctl ([kernel.kallsyms]) + ffffffff811d10e1 sys_ioctl ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f2ccba26ec7 __GI___ioctl (/lib/x86_64-linux-gnu/libc-2.19.so) + 415ad5 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 4081a5 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 407a40 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 7f2ccb956ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +perf 23929 [002] 184694.229135: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dbfef smp_call_function_single ([kernel.kallsyms]) + ffffffff8113e044 cpu_function_call ([kernel.kallsyms]) + ffffffff811419f5 perf_event_enable ([kernel.kallsyms]) + ffffffff8113e0d8 perf_event_for_each_child ([kernel.kallsyms]) + ffffffff81141b1b perf_ioctl ([kernel.kallsyms]) + ffffffff811d0e80 do_vfs_ioctl ([kernel.kallsyms]) + ffffffff811d10e1 sys_ioctl ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f2ccba26ec7 __GI___ioctl (/lib/x86_64-linux-gnu/libc-2.19.so) + 415ad5 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 4081a5 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 407a40 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 7f2ccb956ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +java 23923 [003] 184694.229142: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + 7f6b2d0bbad0 Lorg/mozilla/javascript/TopLevel;.getBuiltinPrototype (/tmp/perf-23895.map) + 7f6b2d0c8544 Lorg/mozilla/javascript/NativeFunction;.initScriptFunction (/tmp/perf-23895.map) + 7f6b2d1dd178 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;. (/tmp/perf-23895.map) + 7f6b2d595d2c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d4bbef8 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d4bc4bc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d4bbdfc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23923 [003] 184694.229148: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + 7f6b2d0bbad0 Lorg/mozilla/javascript/TopLevel;.getBuiltinPrototype (/tmp/perf-23895.map) + 7f6b2d0c8544 Lorg/mozilla/javascript/NativeFunction;.initScriptFunction (/tmp/perf-23895.map) + 7f6b2d1dd178 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;. (/tmp/perf-23895.map) + 7f6b2d595d2c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d4bbef8 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d4bc4bc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d4bbdfc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23923 [003] 184694.229150: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + 7f6b2d0bbad0 Lorg/mozilla/javascript/TopLevel;.getBuiltinPrototype (/tmp/perf-23895.map) + 7f6b2d0c8544 Lorg/mozilla/javascript/NativeFunction;.initScriptFunction (/tmp/perf-23895.map) + 7f6b2d1dd178 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;. (/tmp/perf-23895.map) + 7f6b2d595d2c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d4bbef8 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d4bc4bc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d4bbdfc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23923 [003] 184694.229153: cycles: + ffffffff8104f45a native_write_msr_safe ([kernel.kallsyms]) + ffffffff8102f8bc intel_pmu_enable_all ([kernel.kallsyms]) + ffffffff81029b14 x86_pmu_enable ([kernel.kallsyms]) + ffffffff81142a77 perf_pmu_enable ([kernel.kallsyms]) + ffffffff81027bfa x86_pmu_commit_txn ([kernel.kallsyms]) + ffffffff811434f0 group_sched_in ([kernel.kallsyms]) + ffffffff811439b2 __perf_event_enable ([kernel.kallsyms]) + ffffffff8113f620 remote_function ([kernel.kallsyms]) + ffffffff810dc880 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81040ac7 smp_call_function_single_interrupt ([kernel.kallsyms]) + ffffffff81732a5d call_function_single_interrupt ([kernel.kallsyms]) + 7f6b2d0bbad0 Lorg/mozilla/javascript/TopLevel;.getBuiltinPrototype (/tmp/perf-23895.map) + 7f6b2d0c8544 Lorg/mozilla/javascript/NativeFunction;.initScriptFunction (/tmp/perf-23895.map) + 7f6b2d1dd178 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;. (/tmp/perf-23895.map) + 7f6b2d595d2c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d4bbef8 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d4bc4bc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d4bbdfc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23921 [001] 184694.229157: cycles: + 7f6b2d0bad15 Lorg/mozilla/javascript/ScriptableObject;.createSlot (/tmp/perf-23895.map) + 7f6b2d0904a8 Lorg/mozilla/javascript/ScriptableObject;.getSlot (/tmp/perf-23895.map) + 7f6b2d0bdc1c Lorg/mozilla/javascript/IdScriptableObject;.put (/tmp/perf-23895.map) + 7f6b2d0ca488 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp (/tmp/perf-23895.map) + 7f6b2d5831dc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d41cac0 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d41d15c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d41c9c4 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +perf 23929 [002] 184694.229184: cycles: + ffffffff81729600 page_fault ([kernel.kallsyms]) + 415c96 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 4081a5 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 407a40 [unknown] (/usr/lib/linux-tools-3.13.0-44/perf) + 7f2ccb956ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.19.so) + +java 23923 [003] 184694.229188: cycles: + 7f6b2d0902c7 Lorg/mozilla/javascript/ScriptableObject;.getSlot (/tmp/perf-23895.map) + 7f6b2d0ca4f4 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp (/tmp/perf-23895.map) + 7f6b2d5614a8 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_47;.call (/tmp/perf-23895.map) + 7f6b2d21679c Lorg/mozilla/javascript/optimizer/OptRuntime;.call2 (/tmp/perf-23895.map) + 7f6b2d595ee4 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d4bbef8 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d4bc4bc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d4bbdfc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23923 [000] 184694.243059: cycles: + 7f6b2d416e87 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.getParamCount (/tmp/perf-23895.map) + 7f6b2d5946dc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d4bbef8 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d4bc4bc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d4bbdfc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23921 [001] 184694.246484: cycles: + 7f6b2d3d11b0 Lio/netty/handler/codec/http/HttpMethod;.valueOf (/tmp/perf-23895.map) + 7f6b2d3ffe24 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode (/tmp/perf-23895.map) + 7f6b2d417fd0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23922 [003] 184694.246867: cycles: + 7f6b2d0bad52 Lorg/mozilla/javascript/ScriptableObject;.createSlot (/tmp/perf-23895.map) + 7f6b2d0904a8 Lorg/mozilla/javascript/ScriptableObject;.getSlot (/tmp/perf-23895.map) + 7f6b2d0bdc1c Lorg/mozilla/javascript/IdScriptableObject;.put (/tmp/perf-23895.map) + 7f6b2d0ca488 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp (/tmp/perf-23895.map) + 7f6b2d5b3fdc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d493078 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d49363c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d492f7c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23921 [002] 184694.255900: cycles: + 7f6b2d54ff29 Lsun/nio/ch/SocketChannelImpl;.read (/tmp/perf-23895.map) + 7f6b2d519374 Lio/netty/buffer/AbstractByteBuf;.writeBytes (/tmp/perf-23895.map) + 7f6b2d55840c Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23920 [000] 184694.356511: cycles: + 7f6b2d329439 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23922 [003] 184694.363320: cycles: + 7f6b2d0d5c53 Ljava/lang/Thread;.blockedOn (/tmp/perf-23895.map) + 7f6b2d550194 Lsun/nio/ch/SocketChannelImpl;.read (/tmp/perf-23895.map) + 7f6b2d519374 Lio/netty/buffer/AbstractByteBuf;.writeBytes (/tmp/perf-23895.map) + 7f6b2d55840c Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23921 [001] 184694.365722: cycles: + 7f6b2d1f22c2 Lorg/mozilla/javascript/ScriptRuntime;.getPropFunctionAndThis (/tmp/perf-23895.map) + 7f6b2d5838ec Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d41cac0 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d41d15c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d41c9c4 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23920 [002] 184694.366480: cycles: + 7f6b2d0a4908 Lorg/mozilla/javascript/IdScriptableObject;.has (/tmp/perf-23895.map) + 7f6b2d0ca4f4 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp (/tmp/perf-23895.map) + 7f6b2d536bb4 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_31;.call (/tmp/perf-23895.map) + 7f6b2d21679c Lorg/mozilla/javascript/optimizer/OptRuntime;.call2 (/tmp/perf-23895.map) + 7f6b2d5a7658 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80;._c_anonymous_21 (/tmp/perf-23895.map) + 7f6b2d3d4158 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d59d6a0 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d3d4080 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d3d472c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80;.call (/tmp/perf-23895.map) + 7f6b2d3d3f84 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23922 [000] 184694.378688: cycles: + 7f6b2d0a4bcc Lorg/mozilla/javascript/IdScriptableObject;.has (/tmp/perf-23895.map) + 7f6b2d0ca4f4 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp (/tmp/perf-23895.map) + 7f6b2d5b469c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d493078 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d49363c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d492f7c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +ab 23927 [003] 184694.382687: cycles: + ffffffff81616449 __kfree_skb ([kernel.kallsyms]) + ffffffff81672c6a tcp_clean_rtx_queue ([kernel.kallsyms]) + ffffffff816739e8 tcp_ack ([kernel.kallsyms]) + ffffffff816741b2 tcp_rcv_established ([kernel.kallsyms]) + ffffffff8167e105 tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81680510 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff8165b268 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff8165b568 ip_local_deliver ([kernel.kallsyms]) + ffffffff8165aeed ip_rcv_finish ([kernel.kallsyms]) + ffffffff8165b838 ip_rcv ([kernel.kallsyms]) + ffffffff81625056 __netif_receive_skb_core ([kernel.kallsyms]) + ffffffff81625248 __netif_receive_skb ([kernel.kallsyms]) + ffffffff81625dde process_backlog ([kernel.kallsyms]) + ffffffff81625632 net_rx_action ([kernel.kallsyms]) + ffffffff8106cc1c __do_softirq ([kernel.kallsyms]) + ffffffff8173329c do_softirq_own_stack ([kernel.kallsyms]) + ffffffff8106ce95 do_softirq ([kernel.kallsyms]) + ffffffff8106cf24 local_bh_enable ([kernel.kallsyms]) + ffffffff8165f8c8 ip_finish_output ([kernel.kallsyms]) + ffffffff81660e28 ip_output ([kernel.kallsyms]) + ffffffff81660585 ip_local_out ([kernel.kallsyms]) + ffffffff816608ea ip_queue_xmit ([kernel.kallsyms]) + ffffffff816776a9 tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81677c50 tcp_write_xmit ([kernel.kallsyms]) + ffffffff8167888e __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81669ec8 tcp_sendmsg ([kernel.kallsyms]) + ffffffff816937b4 inet_sendmsg ([kernel.kallsyms]) + ffffffff8160b55e sock_aio_write ([kernel.kallsyms]) + ffffffff811bd4aa do_sync_write ([kernel.kallsyms]) + ffffffff811bdd2d vfs_write ([kernel.kallsyms]) + ffffffff811be669 sys_write ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f26dc479340 __write_nocancel (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f26cabd51d0 [unknown] ([unknown]) + +java 23921 [002] 184694.383958: cycles: + 7f6b2d0904b8 Lorg/mozilla/javascript/ScriptableObject;.getSlot (/tmp/perf-23895.map) + 7f6b2d0c48ac Lorg/mozilla/javascript/IdScriptableObject;.get (/tmp/perf-23895.map) + 7f6b2d0cd4fc Lorg/mozilla/javascript/ScriptRuntime;.nameOrFunction (/tmp/perf-23895.map) + 7f6b2d583528 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d41cac0 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d41d15c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d41c9c4 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23923 [001] 184694.384113: cycles: + 7f6b2d4bc341 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d4bbdfc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23922 [000] 184694.394803: cycles: + ffffffff8167edee __tcp_v4_send_check ([kernel.kallsyms]) + ffffffff8167ee3c tcp_v4_send_check ([kernel.kallsyms]) + ffffffff816775b5 tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81677c50 tcp_write_xmit ([kernel.kallsyms]) + ffffffff8167888e __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81669ec8 tcp_sendmsg ([kernel.kallsyms]) + ffffffff816937b4 inet_sendmsg ([kernel.kallsyms]) + ffffffff8160b55e sock_aio_write ([kernel.kallsyms]) + ffffffff811bd4aa do_sync_write ([kernel.kallsyms]) + ffffffff811bdd2d vfs_write ([kernel.kallsyms]) + ffffffff811be669 sys_write ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f6b42bfc35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f6b2d2eb14b Lsun/nio/ch/FileDispatcherImpl;.write0 (/tmp/perf-23895.map) + 7f6b2d3dee80 Lsun/nio/ch/SocketChannelImpl;.write (/tmp/perf-23895.map) + 7f6b2d3d1e74 Lio/netty/buffer/PooledUnsafeDirectByteBuf;.getBytes (/tmp/perf-23895.map) + 7f6b2d4d1e0c Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite (/tmp/perf-23895.map) + 7f6b2d3cac1c Lio/netty/channel/DefaultChannelPipeline$HeadHandler;.flush (/tmp/perf-23895.map) + 7f6b2d1b2534 Lio/netty/channel/DefaultChannelHandlerContext;.flush (/tmp/perf-23895.map) + 7f6b2d3d0224 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush (/tmp/perf-23895.map) + 7f6b2d1b2534 Lio/netty/channel/DefaultChannelHandlerContext;.flush (/tmp/perf-23895.map) + 7f6b2d3c40e4 Lio/netty/channel/ChannelDuplexHandler;.flush (/tmp/perf-23895.map) + 7f6b2d1b2534 Lio/netty/channel/DefaultChannelHandlerContext;.flush (/tmp/perf-23895.map) + 7f6b2d3c8ba8 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete (/tmp/perf-23895.map) + 7f6b2d25fb34 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelReadComplete (/tmp/perf-23895.map) + 7f6b2d3ebe58 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete (/tmp/perf-23895.map) + 7f6b2d25fb34 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelReadComplete (/tmp/perf-23895.map) + 7f6b2d5584c4 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +ab 23927 [003] 184694.397164: cycles: + ffffffff8161517e __kmalloc_reserve.isra.26 ([kernel.kallsyms]) + ffffffff81615b1e __alloc_skb ([kernel.kallsyms]) + ffffffff81669609 sk_stream_alloc_skb ([kernel.kallsyms]) + ffffffff8166a57b tcp_sendmsg ([kernel.kallsyms]) + ffffffff816937b4 inet_sendmsg ([kernel.kallsyms]) + ffffffff8160b55e sock_aio_write ([kernel.kallsyms]) + ffffffff811bd4aa do_sync_write ([kernel.kallsyms]) + ffffffff811bdd2d vfs_write ([kernel.kallsyms]) + ffffffff811be669 sys_write ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f26dc479340 __write_nocancel (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f26cabe2590 [unknown] ([unknown]) + +java 23921 [002] 184694.398792: cycles: + 7f6b2d2fd3e4 Ljava/lang/reflect/Method;.invoke (/tmp/perf-23895.map) + 7f6b2d3094bc Lorg/mozilla/javascript/MemberBox;.invoke (/tmp/perf-23895.map) + 7f6b2d4078bc Lorg/mozilla/javascript/NativeJavaMethod;.call (/tmp/perf-23895.map) + 7f6b2d41cecc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d57d43c Lorg/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4;._c_anonymous_1 (/tmp/perf-23895.map) + 7f6b2d56e75c Lorg/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4;.call (/tmp/perf-23895.map) + 7f6b2d41d234 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d41c9c4 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23923 [001] 184694.399637: cycles: + 7f6b42bf6900 pthread_self (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f6b2d3deddc Lsun/nio/ch/SocketChannelImpl;.write (/tmp/perf-23895.map) + 7f6b2d3d1e74 Lio/netty/buffer/PooledUnsafeDirectByteBuf;.getBytes (/tmp/perf-23895.map) + 7f6b2d4d1e0c Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite (/tmp/perf-23895.map) + 7f6b2d3cac1c Lio/netty/channel/DefaultChannelPipeline$HeadHandler;.flush (/tmp/perf-23895.map) + 7f6b2d1b2534 Lio/netty/channel/DefaultChannelHandlerContext;.flush (/tmp/perf-23895.map) + 7f6b2d3d0224 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush (/tmp/perf-23895.map) + 7f6b2d1b2534 Lio/netty/channel/DefaultChannelHandlerContext;.flush (/tmp/perf-23895.map) + 7f6b2d3c40e4 Lio/netty/channel/ChannelDuplexHandler;.flush (/tmp/perf-23895.map) + 7f6b2d1b2534 Lio/netty/channel/DefaultChannelHandlerContext;.flush (/tmp/perf-23895.map) + 7f6b2d3c8ba8 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete (/tmp/perf-23895.map) + 7f6b2d25fb34 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelReadComplete (/tmp/perf-23895.map) + 7f6b2d3ebe58 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete (/tmp/perf-23895.map) + 7f6b2d25fb34 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelReadComplete (/tmp/perf-23895.map) + 7f6b2d5584c4 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23922 [000] 184694.408782: cycles: + 7f6b2d20a8d3 Lio/netty/handler/codec/http/DefaultHttpHeaders;.add0 (/tmp/perf-23895.map) + 7f6b2d2fdccc Ljava/lang/reflect/Method;.invoke (/tmp/perf-23895.map) + 7f6b2d3094bc Lorg/mozilla/javascript/MemberBox;.invoke (/tmp/perf-23895.map) + 7f6b2d4078bc Lorg/mozilla/javascript/NativeJavaMethod;.call (/tmp/perf-23895.map) + 7f6b2d4933ac Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d57f17c Lorg/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_2;.call (/tmp/perf-23895.map) + 7f6b2d493714 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d492f7c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23921 [002] 184694.412007: cycles: + ffffffff81728c21 _raw_spin_unlock_irqrestore ([kernel.kallsyms]) + ffffffff8109a88a try_to_wake_up ([kernel.kallsyms]) + ffffffff8109a9c2 default_wake_function ([kernel.kallsyms]) + ffffffff810aa9c8 __wake_up_common ([kernel.kallsyms]) + ffffffff810aaa13 __wake_up_locked ([kernel.kallsyms]) + ffffffff812064b8 ep_poll_callback ([kernel.kallsyms]) + ffffffff810aa9c8 __wake_up_common ([kernel.kallsyms]) + ffffffff810aaf75 __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8160efca sock_def_readable ([kernel.kallsyms]) + ffffffff81671217 tcp_data_queue ([kernel.kallsyms]) + ffffffff816741f4 tcp_rcv_established ([kernel.kallsyms]) + ffffffff8167e105 tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81680510 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff8165b268 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff8165b568 ip_local_deliver ([kernel.kallsyms]) + ffffffff8165aeed ip_rcv_finish ([kernel.kallsyms]) + ffffffff8165b838 ip_rcv ([kernel.kallsyms]) + ffffffff81625056 __netif_receive_skb_core ([kernel.kallsyms]) + ffffffff81625248 __netif_receive_skb ([kernel.kallsyms]) + ffffffff81625dde process_backlog ([kernel.kallsyms]) + ffffffff81625632 net_rx_action ([kernel.kallsyms]) + ffffffff8106cc1c __do_softirq ([kernel.kallsyms]) + ffffffff8173329c do_softirq_own_stack ([kernel.kallsyms]) + ffffffff8106ce95 do_softirq ([kernel.kallsyms]) + ffffffff8106cf24 local_bh_enable ([kernel.kallsyms]) + ffffffff8165f8c8 ip_finish_output ([kernel.kallsyms]) + ffffffff81660e28 ip_output ([kernel.kallsyms]) + ffffffff81660585 ip_local_out ([kernel.kallsyms]) + ffffffff816608ea ip_queue_xmit ([kernel.kallsyms]) + ffffffff816776a9 tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81677c50 tcp_write_xmit ([kernel.kallsyms]) + ffffffff8167888e __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81669ec8 tcp_sendmsg ([kernel.kallsyms]) + ffffffff816937b4 inet_sendmsg ([kernel.kallsyms]) + ffffffff8160b55e sock_aio_write ([kernel.kallsyms]) + ffffffff811bd4aa do_sync_write ([kernel.kallsyms]) + ffffffff811bdd2d vfs_write ([kernel.kallsyms]) + ffffffff811be669 sys_write ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f6b42bfc35d [unknown] (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f6b2d2eb14b Lsun/nio/ch/FileDispatcherImpl;.write0 (/tmp/perf-23895.map) + 7f6b2d3dee80 Lsun/nio/ch/SocketChannelImpl;.write (/tmp/perf-23895.map) + 7f6b2d3d1e74 Lio/netty/buffer/PooledUnsafeDirectByteBuf;.getBytes (/tmp/perf-23895.map) + 7f6b2d4d1e0c Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite (/tmp/perf-23895.map) + 7f6b2d3cac1c Lio/netty/channel/DefaultChannelPipeline$HeadHandler;.flush (/tmp/perf-23895.map) + 7f6b2d1b2534 Lio/netty/channel/DefaultChannelHandlerContext;.flush (/tmp/perf-23895.map) + 7f6b2d3d0224 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush (/tmp/perf-23895.map) + 7f6b2d1b2534 Lio/netty/channel/DefaultChannelHandlerContext;.flush (/tmp/perf-23895.map) + 7f6b2d3c40e4 Lio/netty/channel/ChannelDuplexHandler;.flush (/tmp/perf-23895.map) + 7f6b2d1b2534 Lio/netty/channel/DefaultChannelHandlerContext;.flush (/tmp/perf-23895.map) + 7f6b2d3c8ba8 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete (/tmp/perf-23895.map) + 7f6b2d25fb34 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelReadComplete (/tmp/perf-23895.map) + 7f6b2d3ebe58 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete (/tmp/perf-23895.map) + 7f6b2d25fb34 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelReadComplete (/tmp/perf-23895.map) + 7f6b2d5584c4 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23923 [001] 184694.413293: cycles: + 7f6b2d090407 Lorg/mozilla/javascript/ScriptableObject;.getSlot (/tmp/perf-23895.map) + 7f6b2d0a4908 Lorg/mozilla/javascript/IdScriptableObject;.has (/tmp/perf-23895.map) + 7f6b2d0ca4f4 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp (/tmp/perf-23895.map) + 7f6b2d5952dc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d4bbef8 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d4bc4bc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d4bbdfc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +ab 23927 [003] 184694.413444: cycles: + ffffffff8167b9f0 tcp_v4_md5_lookup ([kernel.kallsyms]) + ffffffff81676d54 tcp_current_mss ([kernel.kallsyms]) + ffffffff816680ac tcp_send_mss ([kernel.kallsyms]) + ffffffff81669f09 tcp_sendmsg ([kernel.kallsyms]) + ffffffff816937b4 inet_sendmsg ([kernel.kallsyms]) + ffffffff8160b55e sock_aio_write ([kernel.kallsyms]) + ffffffff811bd4aa do_sync_write ([kernel.kallsyms]) + ffffffff811bdd2d vfs_write ([kernel.kallsyms]) + ffffffff811be669 sys_write ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f26dc479340 __write_nocancel (/lib/x86_64-linux-gnu/libpthread-2.19.so) + 7f26cabf0e30 [unknown] ([unknown]) + +java 23922 [000] 184694.420880: cycles: + 7f6b2d0902c0 Lorg/mozilla/javascript/ScriptableObject;.getSlot (/tmp/perf-23895.map) + 7f6b2d0ca428 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp (/tmp/perf-23895.map) + 7f6b2d552aac Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49;.call (/tmp/perf-23895.map) + 7f6b2d21679c Lorg/mozilla/javascript/optimizer/OptRuntime;.call2 (/tmp/perf-23895.map) + 7f6b2d55305c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49;.call (/tmp/perf-23895.map) + 7f6b2d21679c Lorg/mozilla/javascript/optimizer/OptRuntime;.call2 (/tmp/perf-23895.map) + 7f6b2d5ab698 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;._c_anonymous_21 (/tmp/perf-23895.map) + 7f6b2d493150 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d5b4be0 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d493078 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d49363c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d492f7c Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23921 [002] 184694.423471: cycles: + 7f6b42515d08 __libc_enable_asynccancel (/lib/x86_64-linux-gnu/libc-2.19.so) + 7f6b2d3de7f2 Lsun/nio/ch/EPollArrayWrapper;.epollWait (/tmp/perf-23895.map) + 7f6b2d591320 Lsun/nio/ch/EPollArrayWrapper;.poll (/tmp/perf-23895.map) + 7f6b2d5a4120 Lsun/nio/ch/EPollSelectorImpl;.doSelect (/tmp/perf-23895.map) + 7f6b2d58a348 Lsun/nio/ch/SelectorImpl;.lockAndDoSelect (/tmp/perf-23895.map) + 7f6b2d5c1420 Lio/netty/channel/nio/NioEventLoop;.select (/tmp/perf-23895.map) + 7f6b2d5c2b44 Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23922 [001] 184694.425117: cycles: + 7f6b2d25e374 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23923 [003] 184694.427558: cycles: + 7f6b2d13647c Lio/netty/handler/codec/http/HttpObjectDecoder;.findWhitespace (/tmp/perf-23895.map) + 7f6b2d3ffb20 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode (/tmp/perf-23895.map) + 7f6b2d417fd0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +java 23923 [000] 184694.432846: cycles: + 7f6b2d40f900 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.getParamAndVarCount (/tmp/perf-23895.map) + 7f6b2d5af318 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;._c_anonymous_21 (/tmp/perf-23895.map) + 7f6b2d4bbfd0 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d595ca0 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;._c_anonymous_3 (/tmp/perf-23895.map) + 7f6b2d4bbef8 Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d2f4068 Lorg/mozilla/javascript/BaseFunction;.construct (/tmp/perf-23895.map) + 7f6b2d4bc4bc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d4bbdfc Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93;.call (/tmp/perf-23895.map) + 7f6b2d329434 Lorg/vertx/java/core/http/impl/ServerConnection;.handleMessage (/tmp/perf-23895.map) + 7f6b2d350a70 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived (/tmp/perf-23895.map) + 7f6b2d325fac Lorg/vertx/java/core/http/impl/VertxHttpHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d341798 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d41812c Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead (/tmp/perf-23895.map) + 7f6b2d25e364 Lio/netty/channel/DefaultChannelHandlerContext;.fireChannelRead (/tmp/perf-23895.map) + 7f6b2d558468 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read (/tmp/perf-23895.map) + 7f6b2d55a664 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey (/tmp/perf-23895.map) + 7f6b2d58f7f0 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized (/tmp/perf-23895.map) + 7f6b2d5c324c Lio/netty/channel/nio/NioEventLoop;.run (/tmp/perf-23895.map) + 7f6b2cbe0c4d Interpreter (/tmp/perf-23895.map) + 7f6b2cbe0c92 Interpreter (/tmp/perf-23895.map) + 7f6b2cbd97a7 call_stub (/tmp/perf-23895.map) + 7f6b41abe926 JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abee31 JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41abf2d7 JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41b56010 thread_entry(JavaThread*, Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9bdbf JavaThread::thread_main_inner() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41e9beec JavaThread::run() (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b41d4fb08 java_start(Thread*) (/usr/lib/jvm/jdk1.8.0_60_b19/jre/lib/amd64/server/libjvm.so) + 7f6b42bf5182 start_thread (/lib/x86_64-linux-gnu/libpthread-2.19.so) + +ab 23927 [002] 184694.435091: cycles: + ffffffff81724b08 __schedule ([kernel.kallsyms]) + ffffffff817251a9 schedule ([kernel.kallsyms]) + ffffffff817247ec schedule_hrtimeout_range_clock ([kernel.kallsyms]) + ffffffff81724843 schedule_hrtimeout_range ([kernel.kallsyms]) + ffffffff81206332 ep_poll ([kernel.kallsyms]) + ffffffff81207575 sys_epoll_wait ([kernel.kallsyms]) + ffffffff8173186d system_call_fastpath ([kernel.kallsyms]) + 7f26dc19f683 __epoll_wait_nocancel (/lib/x86_64-linux-gnu/libc-2.19.so) + 7fffa95fe250 [unknown] ([vdso]) + 1000100000001 [unknown] ([unknown]) diff --git a/tools/FlameGraph/test/perf-java-stacks-02.txt b/tools/FlameGraph/test/perf-java-stacks-02.txt new file mode 100644 index 0000000..d331e6b --- /dev/null +++ b/tools/FlameGraph/test/perf-java-stacks-02.txt @@ -0,0 +1,52 @@ +java 19983 cycles: +ffffffff8103d0ca native_write_msr_safe ([kernel.kallsyms]) +ffffffff810275f1 intel_pmu_enable_all ([kernel.kallsyms]) +ffffffff81028021 intel_pmu_nhm_enable_all ([kernel.kallsyms]) +ffffffff81024282 x86_pmu_enable ([kernel.kallsyms]) +ffffffff8110ea8b perf_pmu_enable ([kernel.kallsyms]) +ffffffff81022966 x86_pmu_commit_txn ([kernel.kallsyms]) +ffffffff8110fb2a group_sched_in ([kernel.kallsyms]) +ffffffff811105ea __perf_event_enable ([kernel.kallsyms]) +ffffffff8110b928 remote_function ([kernel.kallsyms]) +ffffffff810a20e6 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) +ffffffff81030a57 smp_call_function_single_interrupt ([kernel.kallsyms]) +ffffffff816647de call_function_single_interrupt ([kernel.kallsyms]) +7f7241fbe6d8 arrayOopDesc::base(BasicType) const (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so) +7f7241239aec writeBytes (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/libjava.so) +7f724123176f Java_java_io_FileOutputStream_writeBytes (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/libjava.so) +7f722d119786 Ljava/io/FileOutputStream;::writeBytes (/tmp/perf-19982.map) +7f722d142778 Ljava/io/PrintStream;::print (/tmp/perf-19982.map) +7f722d12e1d4 LBusy;::main (/tmp/perf-19982.map) +7f722d0004e7 call_stub (/tmp/perf-19982.map) +7f72421d2d76 JavaCalls::call_helper(JavaValue, methodHandle, JavaCallArguments, Thread) (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so) +7f72421ed566 jni_invoke_static(JNIEnv_, JavaValue, _jobject, JNICallType, _jmethodID, JNI_ArgumentPusher, Thread) (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so) +7f72421f987a jni_CallStaticVoidMethod (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so) +7f724309ebdf JavaMain (/home/xguan/opt/jdk1.8.0_112/lib/amd64/jli/libjli.so) +7f72432b4e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 19983 cycles: +ffffffff8103d0ca native_write_msr_safe ([kernel.kallsyms]) +ffffffff810275f1 intel_pmu_enable_all ([kernel.kallsyms]) +ffffffff81028021 intel_pmu_nhm_enable_all ([kernel.kallsyms]) +ffffffff81024282 x86_pmu_enable ([kernel.kallsyms]) +ffffffff8110ea8b perf_pmu_enable ([kernel.kallsyms]) +ffffffff81022966 x86_pmu_commit_txn ([kernel.kallsyms]) +ffffffff8110fb2a group_sched_in ([kernel.kallsyms]) +ffffffff811105ea __perf_event_enable ([kernel.kallsyms]) +ffffffff8110b928 remote_function ([kernel.kallsyms]) +ffffffff810a20e6 generic_smp_call_function_single_interrupt ([kernel.kallsyms]) +ffffffff81030a57 smp_call_function_single_interrupt ([kernel.kallsyms]) +ffffffff816647de call_function_single_interrupt ([kernel.kallsyms]) +7f7241fbe6d8 arrayOopDesc::base(BasicType) const (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so) +7f7241239aec writeBytes (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/libjava.so) +7f724123176f Java_java_io_FileOutputStream_writeBytes (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/libjava.so) +7f722d119786 Ljava/io/FileOutputStream;::writeBytes (/tmp/perf-19982.map) +7f722d142778 Ljava/io/PrintStream;::print (/tmp/perf-19982.map) +7f722d12e1d4 LBusy;::main (/tmp/perf-19982.map) +7f722d0004e7 call_stub (/tmp/perf-19982.map) +7f72421d2d76 JavaCalls::call_helper(JavaValue, methodHandle, JavaCallArguments, Thread) (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so) +7f72421ed566 jni_invoke_static(JNIEnv_, JavaValue, _jobject, JNICallType, _jmethodID, JNI_ArgumentPusher, Thread) (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so) +7f72421f987a jni_CallStaticVoidMethod (/home/xguan/opt/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so) +7f724309ebdf JavaMain (/home/xguan/opt/jdk1.8.0_112/lib/amd64/jli/libjli.so) +7f72432b4e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + diff --git a/tools/FlameGraph/test/perf-js-stacks-01.txt b/tools/FlameGraph/test/perf-js-stacks-01.txt new file mode 100644 index 0000000..1e2306f --- /dev/null +++ b/tools/FlameGraph/test/perf-js-stacks-01.txt @@ -0,0 +1,38 @@ +node-v011 31912 cpu-clock: + 13a80b608e0a RegExp:[&<>\"\'] (/tmp/perf-7539.map) + c6d7895aac9 LazyCompile:~body_0 evalmachine.:1 (/tmp/perf-31912.map) + dd777 v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle, v8::internal::Handle, int, v8::internal::Handle*, bool) (/tmp/node-v011) + c6d788f8125 LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39 (/tmp/perf-31912.map) + c6d78490728 LazyCompile:_tickDomainCallback node.js:387 (/tmp/perf-31912.map) + c6d78146ea0 Builtin:A builtin from the snapshot (/tmp/perf-31912.map) + c6d78125f71 Stub:JSEntryStub (/tmp/perf-31912.map) + 7dbd0b v8::internal::Invoke(bool, v8::internal::Handle, v8::internal::Handle, int, v8::internal::Handle*) (/tmp/node-v011) + 7dd777 v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle, v8::internal::Handle, int, v8::internal::Handle*, bool) (/tmp/node-v011) + 74d468 v8::Function::Call(v8::Handle, int, v8::Handle*) (/tmp/node-v011) + af2fa1 node::After(uv_fs_s*) (/tmp/node-v011) + b53aad uv__work_done (/tmp/node-v011) + b551ed uv__async_event (/tmp/node-v011) + b55383 uv__async_io (/tmp/node-v011) + b63b72 uv__io_poll (/tmp/node-v011) + b55d17 uv_run (/tmp/node-v011) + ae5f31 node::Start(int, char**) (/tmp/node-v011) + 7f9c33ac176d __libc_start_main (/lib/x86_64-linux-gnu/libc-2.15.so) + +node-v011 31912 cpu-clock: + c6d78255e68 RegExp:\bFoo ?Bar(?:/[\d.]+|[ \w.]*) (/tmp/perf-31912.map) + c6d788f8125 LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39 (/tmp/perf-31912.map) + c6d78490728 LazyCompile:_tickDomainCallback node.js:387 (/tmp/perf-31912.map) + c6d78146ea0 Builtin:A builtin from the snapshot (/tmp/perf-31912.map) + c6d78125f71 Stub:JSEntryStub (/tmp/perf-31912.map) + 7dbd0b v8::internal::Invoke(bool, v8::internal::Handle, v8::internal::Handle, int, v8::internal::Handle*) (/tmp/node-v011) + 7dd777 v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle, v8::internal::Handle, int, v8::internal::Handle*, bool) (/tmp/node-v011) + 74d468 v8::Function::Call(v8::Handle, int, v8::Handle*) (/tmp/node-v011) + af2fa1 node::After(uv_fs_s*) (/tmp/node-v011) + b53aad uv__work_done (/tmp/node-v011) + b551ed uv__async_event (/tmp/node-v011) + b55383 uv__async_io (/tmp/node-v011) + b63b72 uv__io_poll (/tmp/node-v011) + b55d17 uv_run (/tmp/node-v011) + ae5f31 node::Start(int, char**) (/tmp/node-v011) + 7f9c33ac176d __libc_start_main (/lib/x86_64-linux-gnu/libc-2.15.so) + diff --git a/tools/FlameGraph/test/perf-mirageos-stacks-01.txt b/tools/FlameGraph/test/perf-mirageos-stacks-01.txt new file mode 100644 index 0000000..bbc7197 --- /dev/null +++ b/tools/FlameGraph/test/perf-mirageos-stacks-01.txt @@ -0,0 +1,351 @@ +# ======== +# captured on: Wed Jan 27 00:56:27 2016 +# hostname : lgud-bgregg +# os release : 3.13.0-44-generic +# perf version : 3.13.11-ckt12 +# arch : x86_64 +# nrcpus online : 4 +# nrcpus avail : 4 +# cpudesc : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz +# cpuid : GenuineIntel,6,42,7 +# total memory : 3130540 kB +# cmdline : /usr/lib/linux-tools-3.13.0-44/perf record -F 99 -a --call-graph=dwarf -- sleep 10 +# event : name = cpu-clock, type = 1, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0, attr_mmap2 = 0, attr_mmap = 1, attr_mmap_data = 0 +# HEADER_CPU_TOPOLOGY info available, use -I to display +# HEADER_NUMA_TOPOLOGY info available, use -I to display +# pmu mappings: software = 1, tracepoint = 2, breakpoint = 5 +# ======== +# +mir-console 23166 [000] 1333.768765: cpu-clock: + 44bee3 camlLwt__return_1285 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4093d0 camlMain__fun_1418 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + +swapper 0 [001] 1333.768770: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.768806: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.768847: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.778865: cpu-clock: + 44b1d0 camlLwt__repr_rec_1132 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 7f57a760d920 [unknown] ([unknown]) + +swapper 0 [001] 1333.778869: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.778907: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.778947: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.788966: cpu-clock: + 44c8f9 camlLwt__bind_1394 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + +swapper 0 [001] 1333.788979: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.789008: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.789054: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.799067: cpu-clock: + 44c8fe camlLwt__bind_1394 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + +swapper 0 [001] 1333.799077: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.799113: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.799155: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [001] 1333.809178: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.809182: cpu-clock: + 40955c camlUnikernel__fun_1396 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + +swapper 0 [002] 1333.809217: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.809257: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.819269: cpu-clock: + 44c92f camlLwt__bind_1394 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 6eaf28 [unknown] ([unknown]) + +swapper 0 [001] 1333.819279: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.819315: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.819357: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.829370: cpu-clock: + 409598 camlUnikernel____pa_lwt_loop_1382 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4093d0 camlMain__fun_1418 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + +swapper 0 [001] 1333.829381: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.829417: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.829458: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.839471: cpu-clock: + 44c918 camlLwt__bind_1394 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4095de camlUnikernel____pa_lwt_loop_1382 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 409533 camlMain__entry (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4059c9 caml_program (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4b43ca caml_start_program (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 7fff978f8dd0 [unknown] ([unknown]) + +swapper 0 [001] 1333.839481: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.839517: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.839559: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.849572: cpu-clock: + 44bef5 camlLwt__return_1285 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4093d0 camlMain__fun_1418 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + +swapper 0 [001] 1333.849583: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.849619: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.849661: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.859673: cpu-clock: + 44c918 camlLwt__bind_1394 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4095de camlUnikernel____pa_lwt_loop_1382 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 409533 camlMain__entry (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4059c9 caml_program (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4b43ca caml_start_program (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 7fff978f8dd0 [unknown] ([unknown]) + +swapper 0 [001] 1333.859683: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.859722: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.859761: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.869775: cpu-clock: + 44b1d0 camlLwt__repr_rec_1132 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 7f57a7549e40 [unknown] ([unknown]) + +swapper 0 [001] 1333.869785: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.869823: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.869863: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.879875: cpu-clock: + 44bef9 camlLwt__return_1285 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 6eaf28 [unknown] ([unknown]) + +swapper 0 [001] 1333.879885: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.879924: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.879965: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.889977: cpu-clock: + 44c92f camlLwt__bind_1394 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 6eaf28 [unknown] ([unknown]) + +swapper 0 [001] 1333.889987: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [002] 1333.890023: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +swapper 0 [003] 1333.890065: cpu-clock: + ffffffff810013aa xen_hypercall_sched_op ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810bef35 cpu_startup_entry ([kernel.kallsyms]) + ffffffff810101b8 cpu_bringup_and_idle ([kernel.kallsyms]) + +mir-console 23166 [000] 1333.900077: cpu-clock: + 44bee3 camlLwt__return_1285 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) + 4093d0 camlMain__fun_1418 (/mnt/mirage/mirage-skeleton/console.unix2/_build/main.native) diff --git a/tools/FlameGraph/test/perf-numa-stacks-01.txt b/tools/FlameGraph/test/perf-numa-stacks-01.txt new file mode 100644 index 0000000..0b4e9b7 --- /dev/null +++ b/tools/FlameGraph/test/perf-numa-stacks-01.txt @@ -0,0 +1,2762 @@ +# ======== +# captured on: Thu Nov 19 01:36:57 2015 +# hostname : xxxxxclusters-r38xl-i-xxxxxxxx +# os release : 3.13.0-49-generic +# perf version : 3.13.11-ckt17 +# arch : x86_64 +# nrcpus online : 32 +# nrcpus avail : 32 +# cpudesc : Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz +# cpuid : GenuineIntel,6,62,4 +# total memory : 251902420 kB +# cmdline : /usr/lib/linux-tools-3.13.0-49/perf record -F 99 -a -g -- sleep 20 +# event : name = cpu-clock, type = 1, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, excl_host = 0, excl_guest = 1, precise_ip = 0, attr_mmap2 = 0, attr_mmap = 1, attr_mmap_data = 0 +# HEADER_CPU_TOPOLOGY info available, use -I to display +# HEADER_NUMA_TOPOLOGY info available, use -I to display +# pmu mappings: software = 1, tracepoint = 2, breakpoint = 5 +# ======== +# +java 11008 [001] 30143.481555: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783b58 [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +java 11007 [000] 30143.481565: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e3d [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +swapper 0 [002] 30143.481591: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11011 [003] 30143.481612: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4a [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +swapper 0 [004] 30143.481637: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 10998 [005] 30143.481649: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +java 11020 [006] 30143.481655: cpu-clock: + 7f08b5817256 [unknown] (/tmp/perf-10939.map) + +java 11017 [007] 30143.481683: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b57ae255 [unknown] (/tmp/perf-10939.map) + +swapper 0 [008] 30143.481709: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 10993 [009] 30143.481720: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b50523da [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 10996 [010] 30143.481748: cpu-clock: + 7f08b57feb68 [unknown] (/tmp/perf-10939.map) + +java 11013 [011] 30143.481769: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578437b [unknown] (/tmp/perf-10939.map) + +java 11000 [012] 30143.481774: cpu-clock: + 7f08b57feb75 [unknown] (/tmp/perf-10939.map) + +java 11001 [013] 30143.481795: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b57ae255 [unknown] (/tmp/perf-10939.map) + +swapper 0 [014] 30143.481808: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11015 [015] 30143.481835: cpu-clock: + ffffffff81376e5d find_next_bit ([kernel.kallsyms]) + ffffffff813649c0 cpumask_next_and ([kernel.kallsyms]) + ffffffff8100fe0f __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08cc8f533e TypeArrayKlass::allocate_common(int, bool, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc8f5673 TypeArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc76d5aa ObjArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc824642 OptoRuntime::multianewarray2_C(Klass*, int, int, JavaThread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08b5331209 [unknown] (/tmp/perf-10939.map) + +swapper 0 [016] 30143.481883: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11002 [017] 30143.481895: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b50523da [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 10992 [019] 30143.481952: cpu-clock: + 7f08b50523ce [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11018 [018] 30143.481960: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4e [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11009 [020] 30143.482001: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b57ae255 [unknown] (/tmp/perf-10939.map) + +java 11012 [021] 30143.482014: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e3d [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +swapper 0 [022] 30143.482053: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [023] 30143.482082: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11003 [024] 30143.482172: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b57ae255 [unknown] (/tmp/perf-10939.map) + +swapper 0 [025] 30143.482217: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 10999 [026] 30143.482242: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783b58 [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +swapper 0 [027] 30143.482289: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [028] 30143.482319: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11021 [029] 30143.482328: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b50523ce [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +swapper 0 [030] 30143.482367: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [031] 30143.482412: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11007 [000] 30143.491646: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b50523b6 [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +swapper 0 [001] 30143.491660: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [002] 30143.491692: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [004] 30143.491731: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11011 [003] 30143.491743: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4a [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 10998 [005] 30143.491750: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4e [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11020 [006] 30143.491756: cpu-clock: + 7f08b5817256 [unknown] (/tmp/perf-10939.map) + +java 11017 [007] 30143.491767: cpu-clock: + 7f08b5783bfc [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +swapper 0 [008] 30143.491808: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 10993 [009] 30143.491819: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5784130 [unknown] (/tmp/perf-10939.map) + +java 10996 [010] 30143.491849: cpu-clock: + 7f08b57feb75 [unknown] (/tmp/perf-10939.map) + +java 11013 [011] 30143.491865: cpu-clock: + ffffffff81433511 notify_remote_via_irq ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b57ae255 [unknown] (/tmp/perf-10939.map) + +java 11000 [012] 30143.491875: cpu-clock: + 7f08b57feb3e [unknown] (/tmp/perf-10939.map) + +swapper 0 [014] 30143.491905: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11001 [013] 30143.491909: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11015 [015] 30143.491961: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08cc8f533e TypeArrayKlass::allocate_common(int, bool, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc8f5673 TypeArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc76d5aa ObjArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc824642 OptoRuntime::multianewarray2_C(Klass*, int, int, JavaThread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08b5331209 [unknown] (/tmp/perf-10939.map) + +java 11008 [016] 30143.491990: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +java 11002 [017] 30143.492004: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578411f [unknown] (/tmp/perf-10939.map) + +java 11018 [018] 30143.492031: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 10992 [019] 30143.492052: cpu-clock: + 7f08b5784383 [unknown] (/tmp/perf-10939.map) + +java 11009 [020] 30143.492056: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783b58 [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +java 11012 [021] 30143.492074: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +swapper 0 [022] 30143.492146: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [023] 30143.492182: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11003 [024] 30143.492267: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +swapper 0 [025] 30143.492321: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 10999 [026] 30143.492343: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4e [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +swapper 0 [027] 30143.492383: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [028] 30143.492417: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [029] 30143.492433: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [030] 30143.492473: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [031] 30143.492508: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [000] 30143.501751: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff81710037 rest_init ([kernel.kallsyms]) + ffffffff81d35f70 start_kernel ([kernel.kallsyms]) + ffffffff81d355ee x86_64_start_reservations ([kernel.kallsyms]) + ffffffff81d35733 x86_64_start_kernel ([kernel.kallsyms]) + +swapper 0 [001] 30143.501756: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [002] 30143.501795: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11011 [003] 30143.501800: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5784377 [unknown] (/tmp/perf-10939.map) + +swapper 0 [005] 30143.501855: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11020 [006] 30143.501858: cpu-clock: + 7f08b581723e [unknown] (/tmp/perf-10939.map) + +java 10998 [004] 30143.501867: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e3d [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +swapper 0 [007] 30143.501884: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11021 [008] 30143.501898: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b50523c2 [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 10993 [009] 30143.501903: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578411f [unknown] (/tmp/perf-10939.map) + +java 10996 [010] 30143.501949: cpu-clock: + 7f08b57feb3e [unknown] (/tmp/perf-10939.map) + +java 11013 [011] 30143.501970: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +java 11000 [012] 30143.501975: cpu-clock: + 7f08b57feb8f [unknown] (/tmp/perf-10939.map) + +java 11001 [013] 30143.501997: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4a [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 10999 [014] 30143.501999: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e3d [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11015 [015] 30143.502059: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08cc8f533e TypeArrayKlass::allocate_common(int, bool, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc8f5673 TypeArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc76d5aa ObjArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc824642 OptoRuntime::multianewarray2_C(Klass*, int, int, JavaThread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08b5331209 [unknown] (/tmp/perf-10939.map) + +java 11008 [016] 30143.502107: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4e [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11002 [017] 30143.502108: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5784130 [unknown] (/tmp/perf-10939.map) + +java 11018 [018] 30143.502132: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e3d [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11017 [019] 30143.502158: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +java 11009 [020] 30143.502205: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +java 11012 [021] 30143.502213: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4e [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 10992 [022] 30143.502235: cpu-clock: + 7f08b57842cb [unknown] (/tmp/perf-10939.map) + +java 11007 [023] 30143.502290: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578411f [unknown] (/tmp/perf-10939.map) + +java 11003 [024] 30143.502367: cpu-clock: + ffffffff81376e63 find_next_bit ([kernel.kallsyms]) + ffffffff8101056e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4e [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +swapper 0 [025] 30143.502420: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [026] 30143.502456: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [027] 30143.502482: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [028] 30143.502523: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [029] 30143.502549: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [030] 30143.502574: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [031] 30143.502610: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [000] 30143.511847: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff81710037 rest_init ([kernel.kallsyms]) + ffffffff81d35f70 start_kernel ([kernel.kallsyms]) + ffffffff81d355ee x86_64_start_reservations ([kernel.kallsyms]) + ffffffff81d35733 x86_64_start_kernel ([kernel.kallsyms]) + +java 10992 [001] 30143.511849: cpu-clock: + 7f08b5783e40 [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11017 [002] 30143.511884: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4a [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11011 [003] 30143.511901: cpu-clock: + ffffffff811824ec change_protection_range ([kernel.kallsyms]) + ffffffff81182705 change_protection ([kernel.kallsyms]) + ffffffff811988bb change_prot_numa ([kernel.kallsyms]) + ffffffff8109f082 task_numa_work ([kernel.kallsyms]) + ffffffff81088337 task_work_run ([kernel.kallsyms]) + ffffffff81013ee7 do_notify_resume ([kernel.kallsyms]) + ffffffff8172a1a2 retint_signal ([kernel.kallsyms]) + 7f08b5784261 [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11020 [006] 30143.511921: cpu-clock: + 7f08b581723e [unknown] (/tmp/perf-10939.map) + +java 10998 [004] 30143.511930: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b50523ce [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +swapper 0 [005] 30143.511960: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [007] 30143.511982: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11021 [008] 30143.512011: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578412c [unknown] (/tmp/perf-10939.map) + +java 10993 [009] 30143.512025: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783b58 [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +java 10996 [010] 30143.512049: cpu-clock: + 7f08b57feb9c [unknown] (/tmp/perf-10939.map) + +java 11000 [012] 30143.512058: cpu-clock: + 7f08b57feb5b [unknown] (/tmp/perf-10939.map) + +java 10999 [014] 30143.512058: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4a [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11001 [013] 30143.512060: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e3d [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11013 [011] 30143.512061: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4e [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11018 [018] 30143.512201: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11008 [016] 30143.512214: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4e [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11002 [017] 30143.512219: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b57ae255 [unknown] (/tmp/perf-10939.map) + +java 11015 [015] 30143.512226: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08cc8f533e TypeArrayKlass::allocate_common(int, bool, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc8f5673 TypeArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc76d5aa ObjArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc824642 OptoRuntime::multianewarray2_C(Klass*, int, int, JavaThread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08b5331209 [unknown] (/tmp/perf-10939.map) + +swapper 0 [019] 30143.512266: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11009 [020] 30143.512299: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11012 [021] 30143.512324: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578437b [unknown] (/tmp/perf-10939.map) + +swapper 0 [022] 30143.512347: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11007 [023] 30143.512420: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578411f [unknown] (/tmp/perf-10939.map) + +java 11003 [024] 30143.512471: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +swapper 0 [025] 30143.512523: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [026] 30143.512554: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [027] 30143.512586: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [028] 30143.512622: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [029] 30143.512647: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [030] 30143.512674: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [031] 30143.512712: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 10992 [000] 30143.521940: cpu-clock: + 7f08b578432f [unknown] (/tmp/perf-10939.map) + +swapper 0 [001] 30143.521964: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11017 [002] 30143.521991: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11011 [003] 30143.522003: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783b58 [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +java 10998 [004] 30143.522032: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4e [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +swapper 0 [005] 30143.522057: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11020 [006] 30143.522059: cpu-clock: + 7f08b5817256 [unknown] (/tmp/perf-10939.map) + +swapper 0 [007] 30143.522086: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11021 [008] 30143.522101: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578411f [unknown] (/tmp/perf-10939.map) + +java 10993 [009] 30143.522131: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +java 10996 [010] 30143.522150: cpu-clock: + 7f08b57feb3e [unknown] (/tmp/perf-10939.map) + +java 11013 [011] 30143.522173: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4a [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11000 [012] 30143.522178: cpu-clock: + 7f08b57feb8f [unknown] (/tmp/perf-10939.map) + +java 10999 [014] 30143.522206: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b50523c2 [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11001 [013] 30143.522214: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578411f [unknown] (/tmp/perf-10939.map) + +java 11015 [015] 30143.522264: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08cc8f533e TypeArrayKlass::allocate_common(int, bool, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc8f5673 TypeArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc76d5aa ObjArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc824642 OptoRuntime::multianewarray2_C(Klass*, int, int, JavaThread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08b5331209 [unknown] (/tmp/perf-10939.map) + +java 11008 [016] 30143.522284: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4a [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11002 [017] 30143.522306: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +java 11018 [018] 30143.522339: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578411f [unknown] (/tmp/perf-10939.map) + +swapper 0 [019] 30143.522367: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11009 [020] 30143.522413: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11012 [021] 30143.522415: cpu-clock: + ffffffff810dc426 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b57b5a5c [unknown] (/tmp/perf-10939.map) + +swapper 0 [022] 30143.522448: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11007 [023] 30143.522472: cpu-clock: + ffffffff817299bb _raw_spin_unlock_irqrestore ([kernel.kallsyms]) + ffffffff810dc462 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b57ae255 [unknown] (/tmp/perf-10939.map) + +java 11003 [024] 30143.522573: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578412c [unknown] (/tmp/perf-10939.map) + +swapper 0 [025] 30143.522620: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [026] 30143.522655: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [027] 30143.522684: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [028] 30143.522716: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [029] 30143.522742: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [030] 30143.522775: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [031] 30143.522811: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 10992 [000] 30143.532040: cpu-clock: + ffffffff8172dbd7 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e3d [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +swapper 0 [001] 30143.532061: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11017 [002] 30143.532062: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e4a [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 11011 [003] 30143.532066: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +swapper 0 [004] 30143.532134: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [007] 30143.532183: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11020 [006] 30143.532213: cpu-clock: + 7f08b5817256 [unknown] (/tmp/perf-10939.map) + +java 11008 [005] 30143.532214: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11021 [008] 30143.532219: cpu-clock: + ffffffff81369654 radix_tree_lookup_element ([kernel.kallsyms]) + ffffffff810bf187 irq_to_desc ([kernel.kallsyms]) + ffffffff810c26ae irq_get_irq_data ([kernel.kallsyms]) + ffffffff814326a6 evtchn_from_irq ([kernel.kallsyms]) + ffffffff814334f2 notify_remote_via_irq ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b57ae255 [unknown] (/tmp/perf-10939.map) + +java 10993 [009] 30143.532227: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783e3d [unknown] (/tmp/perf-10939.map) + 7f08c8a52338 [unknown] ([unknown]) + +java 10996 [010] 30143.532251: cpu-clock: + 7f08b57feb75 [unknown] (/tmp/perf-10939.map) + +java 11000 [012] 30143.532280: cpu-clock: + 7f08b57feb4b [unknown] (/tmp/perf-10939.map) + +java 11013 [011] 30143.532281: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5784130 [unknown] (/tmp/perf-10939.map) + +java 11001 [013] 30143.532304: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783bfc [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +java 10999 [014] 30143.532315: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5784130 [unknown] (/tmp/perf-10939.map) + +java 11015 [015] 30143.532340: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08cc8f533e TypeArrayKlass::allocate_common(int, bool, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc8f5673 TypeArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc76d5aa ObjArrayKlass::multi_allocate(int, int*, Thread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08cc824642 OptoRuntime::multianewarray2_C(Klass*, int, int, JavaThread*) (/usr/lib/jvm/java-8-oracle-1.8.0.45/jre/lib/amd64/server/libjvm.so) + 7f08b5331209 [unknown] (/tmp/perf-10939.map) + +swapper 0 [016] 30143.532386: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11002 [017] 30143.532404: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11018 [018] 30143.532442: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b578412c [unknown] (/tmp/perf-10939.map) + +java 10998 [019] 30143.532472: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b50523ce [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11009 [020] 30143.532507: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b50523ce [unknown] (/tmp/perf-10939.map) + 7f08b579f7e7 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11012 [021] 30143.532516: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783b58 [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +swapper 0 [022] 30143.532548: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 11007 [023] 30143.532571: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783b58 [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +java 11003 [024] 30143.532684: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5784377 [unknown] (/tmp/perf-10939.map) + +swapper 0 [025] 30143.532725: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [026] 30143.532761: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [027] 30143.532787: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [028] 30143.532819: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [029] 30143.532838: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [030] 30143.532875: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +swapper 0 [031] 30143.532915: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 10992 [000] 30143.542141: cpu-clock: + 7f08b57ae3b4 [unknown] (/tmp/perf-10939.map) + +java 11017 [001] 30143.542157: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +java 11011 [003] 30143.542163: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b579f8a4 [unknown] (/tmp/perf-10939.map) + 7f08c88c60a8 [unknown] ([unknown]) + +swapper 0 [002] 30143.542196: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) + +java 10999 [005] 30143.542223: cpu-clock: + ffffffff8172dbd7 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b5783b58 [unknown] (/tmp/perf-10939.map) + 7ecef8f2f480 [unknown] ([unknown]) + +java 11012 [004] 30143.542231: cpu-clock: + ffffffff81001408 xen_hypercall_event_channel_op ([kernel.kallsyms]) + ffffffff81434750 xen_send_IPI_one ([kernel.kallsyms]) + ffffffff8100fe02 __xen_send_IPI_mask ([kernel.kallsyms]) + ffffffff8101054e xen_smp_send_call_function_ipi ([kernel.kallsyms]) + ffffffff810dc471 smp_call_function_many ([kernel.kallsyms]) + ffffffff8105c8f7 native_flush_tlb_others ([kernel.kallsyms]) + ffffffff8105cbf6 flush_tlb_page ([kernel.kallsyms]) + ffffffff8118a5f8 ptep_clear_flush ([kernel.kallsyms]) + ffffffff81184c0f try_to_unmap_one ([kernel.kallsyms]) + ffffffff81185d87 try_to_unmap_anon ([kernel.kallsyms]) + ffffffff81185e4d try_to_unmap ([kernel.kallsyms]) + ffffffff811a893e migrate_pages ([kernel.kallsyms]) + ffffffff811a96b4 migrate_misplaced_page ([kernel.kallsyms]) + ffffffff81178eee do_numa_page ([kernel.kallsyms]) + ffffffff8117a0bf handle_mm_fault ([kernel.kallsyms]) + ffffffff8172db74 __do_page_fault ([kernel.kallsyms]) + ffffffff8172df7a do_page_fault ([kernel.kallsyms]) + ffffffff8172a3a8 page_fault ([kernel.kallsyms]) + 7f08b56bffa1 [unknown] (/tmp/perf-10939.map) + 7f08c880b5c8 [unknown] ([unknown]) + +java 11020 [006] 30143.542261: cpu-clock: + 7f08b5817290 [unknown] (/tmp/perf-10939.map) + +swapper 0 [007] 30143.542288: cpu-clock: + ffffffff8104f596 native_safe_halt ([kernel.kallsyms]) + ffffffff8101caaf default_idle ([kernel.kallsyms]) + ffffffff8101d376 arch_cpu_idle ([kernel.kallsyms]) + ffffffff810befa5 cpu_startup_entry ([kernel.kallsyms]) + ffffffff8104150d start_secondary ([kernel.kallsyms]) diff --git a/tools/FlameGraph/test/perf-rust-Yamakaky-dcpu.txt b/tools/FlameGraph/test/perf-rust-Yamakaky-dcpu.txt new file mode 100644 index 0000000..13876df --- /dev/null +++ b/tools/FlameGraph/test/perf-rust-Yamakaky-dcpu.txt @@ -0,0 +1,1054 @@ +emulator 4152 75695.008865: 1 cycles:u: + d70 _start+0xffff018fd5dce000 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.008879: 1 cycles:u: + d70 _start+0xffff018fd5dce000 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.008886: 3 cycles:u: + d70 _start+0xffff018fd5dce000 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.008892: 16 cycles:u: + d70 _start+0xffff018fd5dce000 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.008898: 98 cycles:u: + d70 _start+0xffff018fd5dce000 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.008904: 597 cycles:u: + d70 _start+0xffff018fd5dce000 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.008912: 3646 cycles:u: + 7d9750 page_fault+0xfe200000 ([kernel.kallsyms]) + d70 _start+0xffff018fd5dce000 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.008945: 17736 cycles:u: + 4f4f _dl_start+0xffff018fd5dce3df (/usr/lib/ld-2.24.so) + d78 _dl_start_user+0xffff018fd5dce000 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.009016: 32156 cycles:u: + 7f31 _dl_init_paths+0xffff018fd5dce001 (/usr/lib/ld-2.24.so) + 174ef _dl_sysdep_start+0xffff018fd5dce3df (/usr/lib/ld-2.24.so) + 40 [unknown] ([unknown]) + +emulator 4152 75695.009206: 42339 cycles:u: + 1654f _dl_load_cache_lookup+0xffff018fd5dce29f (/usr/lib/ld-2.24.so) + 88c0 _dl_map_object+0xffff018fd5dce550 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.009539: 44000 cycles:u: + 16387 _dl_load_cache_lookup+0xffff018fd5dce0d7 (/usr/lib/ld-2.24.so) + 88c0 _dl_map_object+0xffff018fd5dce550 (/usr/lib/ld-2.24.so) + +emulator 4152 75695.009667: 42632 cycles:u: + 105ae _dl_name_match_p+0xffff018fd5dce01e (/usr/lib/ld-2.24.so) + 2e747262696c0036 [unknown] ([unknown]) + +emulator 4152 75695.009762: 47729 cycles:u: + b96d _dl_relocate_object+0xffff018fd5dce40d (/usr/lib/ld-2.24.so) + 39b1 dl_main+0xffff018fd5dd0081 (/usr/lib/ld-2.24.so) + 174ef _dl_sysdep_start+0xffff018fd5dce3df (/usr/lib/ld-2.24.so) + 40 [unknown] ([unknown]) + +emulator 4152 75695.009874: 52068 cycles:u: + 844d7 __strcasecmp+0xffff018fd717a007 (/usr/lib/libc-2.24.so) + 39b1 dl_main+0xffff018fd5dd0081 (/usr/lib/ld-2.24.so) + 174ef _dl_sysdep_start+0xffff018fd5dce3df (/usr/lib/ld-2.24.so) + 40 [unknown] ([unknown]) + +emulator 4152 75695.010021: 60144 cycles:u: + 196b7 strcmp+0xffff018fd5dce077 (/usr/lib/ld-2.24.so) + 63636762696c0036 [unknown] ([unknown]) + +emulator 4152 75695.010239: 65345 cycles:u: + b8f2 _dl_relocate_object+0xffff018fd5dce392 (/usr/lib/ld-2.24.so) + 39b1 dl_main+0xffff018fd5dd0081 (/usr/lib/ld-2.24.so) + 174ef _dl_sysdep_start+0xffff018fd5dce3df (/usr/lib/ld-2.24.so) + 40 [unknown] ([unknown]) + +emulator 4152 75695.010508: 66557 cycles:u: + dcc45 __GI___readlink+0xffff018fd717a005 (/usr/lib/libc-2.24.so) + +emulator 4152 75695.010666: 65964 cycles:u: + 6681e7 je_tcache_boot+0xffff53cc2fce4227 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.010880: 70745 cycles:u: + 7d9750 page_fault+0xfe200000 ([kernel.kallsyms]) + 64c156 je_arena_tcache_fill_small+0xffff53cc2fce40b6 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.011165: 72243 cycles:u: + 37315 __GI_____strtoull_l_internal+0xffff018fd717a0f5 (/usr/lib/libc-2.24.so) + +emulator 4152 75695.011360: 71141 cycles:u: + 7d9750 page_fault+0xfe200000 ([kernel.kallsyms]) + 375990 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4000 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.011556: 73671 cycles:u: + 62e25d std::path::PathBuf::_push::h766d676eb9b04254+0xffff53cc2fce401d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b2eb0 term::terminfo::searcher::get_dbpath_for_term::hffa8fd0e9637bc76+0xffff53cc2fce4820 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ab2 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4042 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.011685: 76227 cycles:u: + 38e1c0 _$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf+0xffff53cc2fce4010 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3849e4 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce41a4 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.011788: 85066 cycles:u: + 38e1c9 _$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf+0xffff53cc2fce4019 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3849e4 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce41a4 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.011900: 100227 cycles:u: + 390da8 core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c+0xffff53cc2fce4038 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 394a27 core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40+0xffff53cc2fce4037 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384985 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce4145 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.012032: 115539 cycles:u: + 393fec core::ptr::write::haabbb39ab969e5ac+0xffff53cc2fce401c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384a01 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce41c1 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.012182: 128577 cycles:u: + 390870 _$LT$usize$u20$as$u20$core..iter..range..Step$GT$::add_one::h0701a52b56dc0bbb+0xffff53cc2fce4000 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384985 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce4145 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.012352: 139193 cycles:u: + 393fe9 core::ptr::write::haabbb39ab969e5ac+0xffff53cc2fce4019 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384a01 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce41c1 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.012533: 147440 cycles:u: + 390d93 core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c+0xffff53cc2fce4023 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 394a27 core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40+0xffff53cc2fce4037 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384985 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce4145 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.012723: 154471 cycles:u: + 38e1cc _$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf+0xffff53cc2fce401c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3849e4 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce41a4 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.012923: 160490 cycles:u: + 3858c0 _$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::hfd64239413386906+0xffff53cc2fce4000 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.013177: 161094 cycles:u: + 39448e core::str::next_code_point::hc208947b28200a26+0xffff53cc2fce402e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3abf9d _$LT$core..str..Chars$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h3192360e451206ea+0xffff53cc2fce401d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ae5f3 _$LT$core..str..CharIndices$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6d3c2b6db3f8302b+0xffff53cc2fce4043 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37aaff _$LT$core..str..pattern..CharEqSearcher$LT$$u27$a$C$$u20$C$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next::hbefb8ac4a49c1d1e+0xffff53cc2fce404f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39471c core::str::pattern::Searcher::next_match::h3b4c786aa5e821fc+0xffff53cc2fce402c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37997c _$LT$core..str..pattern..CharSearcher$LT$$u27$a$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next_match::ha7c6689628ca2406+0xffff53cc2fce402c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39aeb4 _$LT$core..str..SplitInternal$LT$$u27$a$C$$u20$P$GT$$GT$::next::h6ff90db1c517060d+0xffff53cc2fce4074 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3af16c _$LT$core..str..Split$LT$$u27$a$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h640ea8ab0b8e51ce+0xffff53cc2fce402c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ad6ac _$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h87371dcef7b54f45+0xffff53cc2fce402c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384155 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::hf30fd19863432c7b+0xffff53cc2fce4065 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b00e7 _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::he13ccf618f424fa8+0xffff53cc2fce43a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395d3d core::iter::iterator::Iterator::collect::h185e3c12af3fc754+0xffff53cc2fce40ad (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b4d84 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5254 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.013402: 160789 cycles:u: + 390d9a core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c+0xffff53cc2fce402a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 394a27 core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40+0xffff53cc2fce4037 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a762f _$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hb223ec6a8effeb5f+0xffff53cc2fce402f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3aeeb8 _$LT$core..iter..FilterMap$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::he1189ac8e3187a50+0xffff53cc2fce4078 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37f201 _$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h2d4f8260955f00a9+0xffff53cc2fce4051 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a74bf _$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h1191ad8aa35e2822+0xffff53cc2fce402f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37b9e4 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h42174e2928c223fa+0xffff53cc2fce4074 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d93e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h9375446625dcf9e8+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37c35f _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h72ebd1bc97b2075e+0xffff53cc2fce414f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395c62 core::iter::iterator::Iterator::collect::h08724396296cdea6+0xffff53cc2fce4062 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b534b term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce581b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.013613: 163021 cycles:u: + 39f09a _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 383da1 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f+0xffff53cc2fce4181 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3afc1e _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725+0xffff53cc2fce429e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37c744 _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a+0xffff53cc2fce4144 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395eca core::iter::iterator::Iterator::collect::h53b7863e73fadbfc+0xffff53cc2fce405a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b55c6 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5a96 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.013829: 166807 cycles:u: + 396798 core::slice::from_raw_parts::hf2d070766f9033b0+0xffff53cc2fce4038 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 396c58 core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..Range$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h4d1325c39b2e2225+0xffff53cc2fce40e8 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 396ce8 core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..RangeTo$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h9c7a1847e7ff452a+0xffff53cc2fce4068 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39a093 _$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::split_at::h80c52dadb70c5280+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37a36c collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::split_at::h9377899ac1bb5027+0xffff53cc2fce404c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38bb4a std::io::impls::_$LT$impl$u20$std..io..Read$u20$for$u20$$RF$$u27$a$u20$$u5b$u8$u5d$$GT$::read::he880dac0905a777b+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39fec8 _$LT$std..io..buffered..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$::read::h0092352920edf903+0xffff53cc2fce4238 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b3682 term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4+0xffff53cc2fce4112 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c28e2 term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e+0xffff53cc2fce4032 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3935ff core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a+0xffff53cc2fce403f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 380880 _$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e+0xffff53cc2fce4100 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ad654 _$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4+0xffff53cc2fce4044 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37fd40 _$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d+0xffff53cc2fce4040 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a7560 _$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a+0xffff53cc2fce4020 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 383c54 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f+0xffff53cc2fce4034 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3afc1e _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725+0xffff53cc2fce429e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37c744 _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a+0xffff53cc2fce4144 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395eca core::iter::iterator::Iterator::collect::h53b7863e73fadbfc+0xffff53cc2fce405a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b55c6 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5a96 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.014045: 170071 cycles:u: + 3996a8 _$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::get_unchecked_mut::h49fa6b2e956b2ceb+0xffff53cc2fce4018 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379f7d collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::get_unchecked_mut::hecb03b761e9b7d9e+0xffff53cc2fce403d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 383dc8 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f+0xffff53cc2fce41a8 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3afc1e _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725+0xffff53cc2fce429e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37c744 _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a+0xffff53cc2fce4144 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395eca core::iter::iterator::Iterator::collect::h53b7863e73fadbfc+0xffff53cc2fce405a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b55c6 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5a96 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.014265: 173377 cycles:u: + 64db3d je_arena_ralloc_no_move+0xffff53cc2fce40ed (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.014492: 176362 cycles:u: + 393920 core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::is_null::h0535f15cf1003af9+0xffff53cc2fce4010 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39f13a _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::hb94ba71a1dd47d71+0xffff53cc2fce402a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 385a6d _$LT$collections..vec..Vec$LT$T$GT$$GT$::truncate::h2f857c8801e6ea48+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38a406 std::io::read_to_end::heeed5f53db31e2d5+0xffff53cc2fce4336 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38abdc std::io::Read::read_to_end::hf3e43392e443d646+0xffff53cc2fce403c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b57bd term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5c8d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.014727: 178602 cycles:u: + 37d420 _$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$std..collections..hash..table..Put$LT$K$C$$u20$V$GT$$GT$::borrow_table_mut::h7b43ee0d3891fd5f+0xffff53cc2fce4000 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3860b5 std::collections::hash::map::robin_hood::h47885a7d58732a87+0xffff53cc2fce4625 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ac4da _$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8+0xffff53cc2fce41ca (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a0ce2 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d+0xffff53cc2fce43d2 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a293c _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7+0xffff53cc2fce417c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bd1d _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11+0xffff53cc2fce417d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d59e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37cb8b _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8+0xffff53cc2fce41bb (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395e27 core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490+0xffff53cc2fce40a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b59e9 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5eb9 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.014972: 180014 cycles:u: + 83d96 __memmove_sse2_unaligned_erms+0xffff018fd717a096 (/usr/lib/libc-2.24.so) + 3a3cc0 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf+0xffff53cc2fce4700 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a4a70 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7+0xffff53cc2fce40f0 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a28c3 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7+0xffff53cc2fce4103 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bd1d _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11+0xffff53cc2fce417d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d59e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37cb8b _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8+0xffff53cc2fce41bb (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395e27 core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490+0xffff53cc2fce40a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b59e9 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5eb9 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.015205: 180495 cycles:u: + 38837d std::collections::hash::map::search_hashed::hae33740b510f48a0+0xffff53cc2fce416d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a0a4b _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d+0xffff53cc2fce413b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a293c _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7+0xffff53cc2fce417c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bd1d _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11+0xffff53cc2fce417d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d59e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37cb8b _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8+0xffff53cc2fce41bb (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395e27 core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490+0xffff53cc2fce40a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b59e9 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5eb9 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.015439: 182088 cycles:u: + 3960c1 core::iter::iterator::Iterator::position::h71611bea69605be3+0xffff53cc2fce4131 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2c35 term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e+0xffff53cc2fce42c5 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39375f core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5+0xffff53cc2fce404f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 381abb _$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125+0xffff53cc2fce414b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ad7a4 _$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3+0xffff53cc2fce4044 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37f5a4 _$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a75af _$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f+0xffff53cc2fce402f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bc17 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11+0xffff53cc2fce4077 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d59e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37cb8b _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8+0xffff53cc2fce41bb (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395e27 core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490+0xffff53cc2fce40a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b59e9 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5eb9 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.015682: 183668 cycles:u: + 3a19ba _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_ordered::h7b9d42bf7a5f0d35+0xffff53cc2fce407a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a3c2e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf+0xffff53cc2fce466e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a4a70 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7+0xffff53cc2fce40f0 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a28c3 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7+0xffff53cc2fce4103 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bd1d _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11+0xffff53cc2fce417d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d59e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37cb8b _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8+0xffff53cc2fce41bb (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395e27 core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490+0xffff53cc2fce40a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b59e9 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5eb9 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.015920: 184354 cycles:u: + 393c78 core::ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::offset::hffec494e9fc99daf+0xffff53cc2fce4028 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3af497 _$LT$core..slice..Iter$LT$$u27$a$C$$u20$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::ha5ae786e76ac1132+0xffff53cc2fce40c7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a7480 _$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h01cfe524df2e1837+0xffff53cc2fce4020 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3abf38 _$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6382d5064d2f104a+0xffff53cc2fce4028 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 396032 core::iter::iterator::Iterator::position::h71611bea69605be3+0xffff53cc2fce40a2 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2c35 term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e+0xffff53cc2fce42c5 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39375f core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5+0xffff53cc2fce404f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 381abb _$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125+0xffff53cc2fce414b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ad7a4 _$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3+0xffff53cc2fce4044 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37f5a4 _$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a75af _$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f+0xffff53cc2fce402f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bc17 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11+0xffff53cc2fce4077 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d59e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37cb8b _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8+0xffff53cc2fce41bb (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395e27 core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490+0xffff53cc2fce40a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b59e9 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5eb9 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.016158: 185542 cycles:u: + 39b78f _$LT$$RF$$u27$a$u20$mut$u20$T$u20$as$u20$core..ops..Deref$GT$::deref::h9629b61700da8d48+0xffff53cc2fce401f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379734 _$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$core..ops..Deref$GT$::deref::hf5640e419faf6aa3+0xffff53cc2fce4024 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a8424 _$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::displacement::h23649dceee14681b+0xffff53cc2fce4074 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 385cb7 std::collections::hash::map::robin_hood::h47885a7d58732a87+0xffff53cc2fce4227 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ac4da _$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8+0xffff53cc2fce41ca (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a0ce2 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d+0xffff53cc2fce43d2 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a293c _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7+0xffff53cc2fce417c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bd1d _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11+0xffff53cc2fce417d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d59e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37cb8b _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8+0xffff53cc2fce41bb (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395e27 core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490+0xffff53cc2fce40a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b59e9 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5eb9 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.016398: 186650 cycles:u: + 3814d0 _$LT$core..option..Option$LT$T$GT$$GT$::map::h4d3efd64a17eb7e4+0xffff53cc2fce4140 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3abee0 _$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h503f07e91a8c70cc+0xffff53cc2fce4060 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a771f _$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hf6d2c4c5538b1320+0xffff53cc2fce402f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ae389 _$LT$core..iter..Filter$LT$I$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc46470b5838977c4+0xffff53cc2fce4069 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ad78c _$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3+0xffff53cc2fce402c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37f5a4 _$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a75af _$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f+0xffff53cc2fce402f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bc17 _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11+0xffff53cc2fce4077 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d59e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37cb8b _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8+0xffff53cc2fce41bb (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395e27 core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490+0xffff53cc2fce40a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b59e9 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5eb9 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c003a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0f93 term::stderr::h99e770fdfcb59b6c+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375a34 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4064 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.016703: 187543 cycles:u: + 394a2d core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40+0xffff53cc2fce403d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384985 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce4145 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.016947: 183381 cycles:u: + 38e1cc _$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf+0xffff53cc2fce401c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3849e4 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce41a4 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.017182: 183868 cycles:u: + 3922ce core::mem::swap::hcb834a1162e5ad6c+0xffff53cc2fce404e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 394a77 core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40+0xffff53cc2fce4087 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384985 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce4145 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.017418: 185267 cycles:u: + 394a2a core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40+0xffff53cc2fce403a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384985 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce4145 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.017651: 186625 cycles:u: + 394a2d core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40+0xffff53cc2fce403d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384985 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce4145 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.017847: 188406 cycles:u: + 390da3 core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c+0xffff53cc2fce4033 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 394a27 core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40+0xffff53cc2fce4037 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384985 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce4145 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 379bd0 collections::vec::from_elem::h0cb09490c5e14fb9+0xffff53cc2fce4080 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e54d _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694+0xffff53cc2fce405d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38e637 _$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5+0xffff53cc2fce4057 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1dd3 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4263 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.018094: 194816 cycles:u: + 39330f core::num::_$LT$impl$u20$usize$GT$::overflowing_add::h4bf465fac5e6d437+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 389868 std::collections::hash::table::calculate_offsets::hfe569e8904133a1b+0xffff53cc2fce4068 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39c714 _$LT$std..collections..hash..table..RawTable$LT$K$C$$u20$V$GT$$GT$::first_bucket_raw::hb9d07d7e2fb8d059+0xffff53cc2fce40f4 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a6bd5 _$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::at_index::h34ab787a9a6009ea+0xffff53cc2fce40c5 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a50cf _$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::new::h610d20a99611ae46+0xffff53cc2fce408f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 388a7b std::collections::hash::map::search_hashed::hb56562c80a350a98+0xffff53cc2fce415b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a10ba _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h98844db7b829b7c9+0xffff53cc2fce410a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a2c3c _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::hcb451fe86918197e+0xffff53cc2fce411c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37b86e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h0c6331f8890ff8d7+0xffff53cc2fce413e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d76e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h84d1c44a62ed8a23+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bf6f _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h16fe3c65a4c16e46+0xffff53cc2fce414f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395f62 core::iter::iterator::Iterator::collect::h6ce9ad9125cfc58e+0xffff53cc2fce4062 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b4fa7 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5477 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.018353: 195165 cycles:u: + 3966b8 core::slice::_$LT$impl$u20$core..ops..IndexMut$LT$core..ops..RangeFrom$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index_mut::hc2a47196a9b3dc9f+0xffff53cc2fce4058 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b364a term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4+0xffff53cc2fce40da (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c28e2 term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e+0xffff53cc2fce4032 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3935ff core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a+0xffff53cc2fce403f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 380880 _$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e+0xffff53cc2fce4100 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ad654 _$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4+0xffff53cc2fce4044 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37fd40 _$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d+0xffff53cc2fce4040 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a7560 _$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a+0xffff53cc2fce4020 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 383c54 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f+0xffff53cc2fce4034 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3afc1e _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725+0xffff53cc2fce429e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37c744 _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a+0xffff53cc2fce4144 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395eca core::iter::iterator::Iterator::collect::h53b7863e73fadbfc+0xffff53cc2fce405a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b55c6 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5a96 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.018605: 194314 cycles:u: + 385888 _$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::h32f778ca25724bf1+0xffff53cc2fce4028 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 383dfa _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f+0xffff53cc2fce41da (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3afc1e _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725+0xffff53cc2fce429e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37c744 _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a+0xffff53cc2fce4144 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395eca core::iter::iterator::Iterator::collect::h53b7863e73fadbfc+0xffff53cc2fce405a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b55c6 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5a96 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.018855: 194076 cycles:u: + 39f075 _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec+0xffff53cc2fce4025 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 383da1 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f+0xffff53cc2fce4181 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3afc1e _$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725+0xffff53cc2fce429e (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37c744 _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a+0xffff53cc2fce4144 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395eca core::iter::iterator::Iterator::collect::h53b7863e73fadbfc+0xffff53cc2fce405a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b55c6 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5a96 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.019105: 194077 cycles:u: + 3938bc core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::offset::h83331dc01d57b6ff+0xffff53cc2fce402c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 384914 _$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a+0xffff53cc2fce40d4 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38575a _$LT$collections..vec..Vec$LT$T$GT$$GT$::resize::h33edb9dae7314c90+0xffff53cc2fce408a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38a1ae std::io::read_to_end::heeed5f53db31e2d5+0xffff53cc2fce40de (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 38abdc std::io::Read::read_to_end::hf3e43392e443d646+0xffff53cc2fce403c (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b57bd term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5c8d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + +emulator 4152 75695.019356: 194103 cycles:u: + 392f34 core::num::_$LT$impl$u20$u64$GT$::wrapping_add::h021932e4ee83e791+0xffff53cc2fce4034 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39e93a _$LT$core..hash..sip..Sip13Rounds$u20$as$u20$core..hash..sip..Sip$GT$::d_rounds::hae93b8d08d9c9a13+0xffff53cc2fce434a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39fc6e _$LT$core..hash..sip..Hasher$LT$S$GT$$u20$as$u20$core..hash..Hasher$GT$::finish::ha781266cba0e4a7c+0xffff53cc2fce40ae (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 39dd3d _$LT$core..hash..sip..SipHasher13$u20$as$u20$core..hash..Hasher$GT$::finish::h73025af53645a0f3+0xffff53cc2fce401d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3ac04d _$LT$std..collections..hash..map..DefaultHasher$u20$as$u20$core..hash..Hasher$GT$::finish::h2c804330acc776d7+0xffff53cc2fce401d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 389a32 std::collections::hash::table::make_hash::h9f03ce4a8d5d1b78+0xffff53cc2fce4072 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a4d4d _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::make_hash::h992d9241b64fceb7+0xffff53cc2fce402d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3a285f _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7+0xffff53cc2fce409f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37bd1d _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11+0xffff53cc2fce417d (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37d59e _$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33+0xffff53cc2fce40fe (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37cb8b _$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8+0xffff53cc2fce41bb (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 395e27 core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490+0xffff53cc2fce40a7 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b59e9 term::terminfo::parser::compiled::parse::h0bfa24a8d6483291+0xffff53cc2fce5eb9 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1e07 term::terminfo::TermInfo::_from_path::h51064971a80093cd+0xffff53cc2fce4297 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1b54 term::terminfo::TermInfo::from_path::hc007f27f9c5301db+0xffff53cc2fce4054 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c2837 term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0+0xffff53cc2fce4047 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3906d1 _$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b+0xffff53cc2fce4161 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b1ae3 term::terminfo::TermInfo::from_name::h721edfed0d4e6840+0xffff53cc2fce4073 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3b17e6 term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d+0xffff53cc2fce4186 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3bff3a _$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3c0ee3 term::stdout::hc71a921b9549a869+0xffff53cc2fce4053 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 375b58 simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f+0xffff53cc2fce4188 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3788ea simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f+0xffff53cc2fce404a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37883b log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727+0xffff53cc2fce402b (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 37209a log::set_logger_raw::h2040ab7e0793ea3f+0xffff53cc2fce409a (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 371fc0 log::set_logger::hfce3bfc5d262a203+0xffff53cc2fce4030 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 3759b9 simplelog::termlog::TermLogger::init::ha7463b1622ff979e+0xffff53cc2fce4029 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 61223 emulator::main_ret::hc4b7fa9090639ebe+0xffff53cc2fce40c3 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 6351f emulator::main::hc2aaa9b4591a10c7+0xffff53cc2fce400f (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + 63c477 __rust_maybe_catch_panic+0xffff53cc2fce4017 (/home/yamakaky/dev/rust/dcpu/target/debug/emulator) + diff --git a/tools/FlameGraph/test/perf-vertx-stacks-01.txt b/tools/FlameGraph/test/perf-vertx-stacks-01.txt new file mode 100644 index 0000000..f1f0d7e --- /dev/null +++ b/tools/FlameGraph/test/perf-vertx-stacks-01.txt @@ -0,0 +1,9985 @@ +# ======== +# captured on: Thu Dec 4 18:23:53 2014 +# hostname : bgregg-test +# os release : 3.2.0-54-virtual +# perf version : 3.2.50 +# arch : x86_64 +# nrcpus online : 16 +# nrcpus avail : 16 +# cpudesc : Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz +# cpuid : GenuineIntel,6,62,4 +# total memory : 30759060 kB +# cmdline : /usr/bin/perf_3.2.0-54 record -F 99 -p 3236 -g +# event : name = cycles, type = 1, config = 0x0, config1 = 0x0, config2 = 0x0, excl_usr = 0, excl_kern = 0, id = { 15078, 15079, 15080, 15081, 15082, 15083, 15084, 15085, 15086, 15087, 15088, 15089, 15090, 15091, 15092, 15093, 15094, 15095, 15096, 15097, 15098, 15099, 15100, 15101, 15102, 15103, 15104, 15105, 15106, 15107, 15108, 15109, 15110, 15111, 15112, 15113, 15114, 15115 } +# HEADER_CPU_TOPOLOGY info available, use -I to display +# HEADER_NUMA_TOPOLOGY info available, use -I to display +# ======== +# +java 3244 cpu-clock: + 7f1e214c24d9 SpinPause (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3245 cpu-clock: + 7f1e216ccd20 ParallelTaskTerminator::offer_termination(TerminatorTerminator*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3245 cpu-clock: + 7f1e214c24d2 SpinPause (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3246 cpu-clock: + 7f1e216ccd20 ParallelTaskTerminator::offer_termination(TerminatorTerminator*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3247 cpu-clock: + 7f1e2162aff4 PSScavengeKlassClosure::do_klass(Klass*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e211dbf0c ClassLoaderData::oops_do(OopClosure*, KlassClosure*, bool) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e211dd6c9 ClassLoaderDataGraph::oops_do(OopClosure*, KlassClosure*, bool) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162aad8 ScavengeRootsTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3248 cpu-clock: + 7f1e214c24d0 SpinPause (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3249 cpu-clock: + 7f1e214c24d2 SpinPause (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3250 cpu-clock: + 7f1e2137bbed InstanceKlass::oop_push_contents(PSPromotionManager*, oopDesc*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21627a75 oopDesc* PSPromotionManager::copy_to_survivor_space(oopDesc*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21627328 PSPromotionManager::drain_stacks_depth(bool) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ac0e StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3251 cpu-clock: + 7f1e214c24d0 SpinPause (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3252 cpu-clock: + 7f1e214c24d2 SpinPause (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3253 cpu-clock: + 7f1e216ccd20 ParallelTaskTerminator::offer_termination(TerminatorTerminator*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3254 cpu-clock: + 7f1e216ccd20 ParallelTaskTerminator::offer_termination(TerminatorTerminator*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3255 cpu-clock: + 7f1e214c24d9 SpinPause (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3256 cpu-clock: + 7f1e216ccd23 ParallelTaskTerminator::offer_termination(TerminatorTerminator*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162ad6f StealTask::do_it(GCTaskManager*, unsigned int) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2130d999 GCTaskThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3257 cpu-clock: + ffffffff8109ea1a futex_wake_op ([kernel.kallsyms]) + ffffffff810a012e do_futex ([kernel.kallsyms]) + ffffffff810a02f2 sys_futex ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e21c46565 pthread_cond_signal@@GLIBC_2.3.2 (/lib/x86_64-linux-gnu/libpthread-2.15.so) + 7f1e21629971 PSScavenge::invoke_no_policy() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21629fa3 PSScavenge::invoke() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215e56cd ParallelScavengeHeap::failed_mem_allocate(unsigned long) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174b610 VM_ParallelGCFailedAllocation::doit() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174fe12 VM_Operation::evaluate() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174e537 VMThread::evaluate_operation(VM_Operation*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174eb96 VMThread::loop() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174f002 VMThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3257 cpu-clock: + 7f1e216c0611 StringTable::unlink_or_oops_do(BoolObjectClosure*, OopClosure*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162943a PSScavenge::invoke_no_policy() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21629fa3 PSScavenge::invoke() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215e56cd ParallelScavengeHeap::failed_mem_allocate(unsigned long) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174b610 VM_ParallelGCFailedAllocation::doit() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174fe12 VM_Operation::evaluate() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174e537 VMThread::evaluate_operation(VM_Operation*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174eb96 VMThread::loop() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174f002 VMThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3257 cpu-clock: + 7f1e2162a2f7 PSIsAliveClosure::do_object_b(oopDesc*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162943a PSScavenge::invoke_no_policy() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21629fa3 PSScavenge::invoke() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215e56cd ParallelScavengeHeap::failed_mem_allocate(unsigned long) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174b610 VM_ParallelGCFailedAllocation::doit() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174fe12 VM_Operation::evaluate() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174e537 VMThread::evaluate_operation(VM_Operation*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174eb96 VMThread::loop() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174f002 VMThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3257 cpu-clock: + 7f1e216c05e0 StringTable::unlink_or_oops_do(BoolObjectClosure*, OopClosure*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2162943a PSScavenge::invoke_no_policy() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21629fa3 PSScavenge::invoke() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215e56cd ParallelScavengeHeap::failed_mem_allocate(unsigned long) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174b610 VM_ParallelGCFailedAllocation::doit() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174fe12 VM_Operation::evaluate() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174e537 VMThread::evaluate_operation(VM_Operation*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174eb96 VMThread::loop() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2174f002 VMThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0feb7963 Lio/netty/handler/codec/http/HttpObjectDecoder;.splitHeader(Lio/netty/util/internal/AppendableCharS (/tmp/perf-3236.map) + 7f1e0df12508 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cda8edf Lorg/mozilla/javascript/IdScriptableObject;.setAttributes(Ljava/lang/String;I)V (/tmp/perf-3236.map) + 7f1e10405a2c Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd21ad0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81178f01 fget_light ([kernel.kallsyms]) + ffffffff81177928 sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8158a5f1 tcp_event_data_recv ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8153dae1 netif_skb_features ([kernel.kallsyms]) + ffffffff8154310a dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f49f2 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0f096c6c Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cd9742c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f096c52 Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cd96fd0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + +java 3278 cpu-clock: + ffffffff81540677 __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81177901 sys_write ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8157a421 ip_output ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e10405b02 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0d792b3c Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cda9c4c Lorg/mozilla/javascript/NativeFunction;.initScriptFunction(Lorg/mozilla/javascript/Context;Lorg/moz (/tmp/perf-3236.map) + 7f1e0d7931dc Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7efc0 Lorg/mozilla/javascript/IdScriptableObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cd225a4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8153c93b dev_queue_xmit_nit ([kernel.kallsyms]) + ffffffff81542985 dev_hard_start_xmit ([kernel.kallsyms]) + ffffffff8154310a dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81177871 sys_read ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7df1c Lorg/mozilla/javascript/TopLevel;.getBuiltinPrototype(Lorg/mozilla/javascript/Scriptable;Lorg/mozil (/tmp/perf-3236.map) + 7f1e10405c8c Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0e78a0ec Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d792284 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd98230 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd8964b Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97df0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81591eed tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff810df991 rcu_bh_qs ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cda9680 Lorg/mozilla/javascript/ScriptableObject$Slot;.getValue(Lorg/mozilla/javascript/Scriptable;)Ljava/l (/tmp/perf-3236.map) + 7f1e10087978 Lorg/mozilla/javascript/ScriptRuntime;.getObjectProp(Ljava/lang/Object;Ljava/lang/String;Lorg/mozil (/tmp/perf-3236.map) + 7f1e0cd981a4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd5f41f Lorg/mozilla/javascript/IdScriptableObject;.findInstanceIdInfo(Ljava/lang/String;)I (/tmp/perf-3236.map) + 7f1e0cd97f94 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8157d901 __inet_lookup_established ([kernel.kallsyms]) + ffffffff81598e45 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd898d9 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e10405a18 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd21ad0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d78edd1 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e104058d9 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0e9b312c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cccba7e vtable chunks (/tmp/perf-3236.map) + 7f1e10087978 Lorg/mozilla/javascript/ScriptRuntime;.getObjectProp(Ljava/lang/Object;Ljava/lang/String;Lorg/mozil (/tmp/perf-3236.map) + 7f1e109c56bc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0feb78c0 Lio/netty/handler/codec/http/HttpObjectDecoder;.splitHeader(Lio/netty/util/internal/AppendableCharS (/tmp/perf-3236.map) + 7f1e0df12508 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e101d8d87 Ljava/util/ArrayList;.ensureExplicitCapacity(I)V (/tmp/perf-3236.map) + 7f1e0ea9fce8 Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8158fb61 tcp_established_options ([kernel.kallsyms]) + ffffffff815917f4 tcp_current_mss ([kernel.kallsyms]) + ffffffff8158174b tcp_send_mss ([kernel.kallsyms]) + ffffffff81583334 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d8c1c9e Lorg/mozilla/javascript/WrapFactory;.wrap(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0cf48530 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e0cd97f08 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8157d8c0 __inet_lookup_established ([kernel.kallsyms]) + ffffffff81598e45 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8115f051 get_slab ([kernel.kallsyms]) + ffffffff81533118 __alloc_skb ([kernel.kallsyms]) + ffffffff815831a4 sk_stream_alloc_skb ([kernel.kallsyms]) + ffffffff81583678 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f4887 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cdaa10c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd2241c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8117728d rw_verify_area ([kernel.kallsyms]) + ffffffff81177775 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8109487b getnstimeofday ([kernel.kallsyms]) + ffffffff81094956 ktime_get_real ([kernel.kallsyms]) + ffffffff8158b15a tcp_clean_rtx_queue ([kernel.kallsyms]) + ffffffff8158e0a1 tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d7935b1 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd98230 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0e212b87 Lorg/mozilla/javascript/ScriptableObject;.getParentScope()Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e0cea3b54 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ff1f220 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd899c6 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd978e0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd899db Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd2214c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd8979a Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e10405fac Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd96c90 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81164da9 __kmalloc_node_track_caller ([kernel.kallsyms]) + ffffffff81533118 __alloc_skb ([kernel.kallsyms]) + ffffffff815831a4 sk_stream_alloc_skb ([kernel.kallsyms]) + ffffffff81583678 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + +java 3278 cpu-clock: + 7f1e11308583 Lio/netty/handler/codec/http/DefaultHttpHeaders;.set(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio (/tmp/perf-3236.map) + 7f1e0ce33c38 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cccbc3e vtable chunks (/tmp/perf-3236.map) + 7f1e0cdaa07c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd2253c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e2215d058 (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd625a8 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cda8edf Lorg/mozilla/javascript/IdScriptableObject;.setAttributes(Ljava/lang/String;I)V (/tmp/perf-3236.map) + 7f1e10405ee8 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0e78a0ec Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d792284 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd98230 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81471f79 loopback_xmit ([kernel.kallsyms]) + ffffffff81542b76 dev_hard_start_xmit ([kernel.kallsyms]) + ffffffff8154310a dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cdac8de Lio/netty/buffer/AbstractByteBuf;.forEachByteAsc0(IILio/netty/buffer/ByteBufProcessor;)I (/tmp/perf-3236.map) + 7f1e0df125a4 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d180f0a Lsun/nio/ch/SocketChannelImpl;.writerCleanup()V (/tmp/perf-3236.map) + 7f1e0cffe748 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f096f31 Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa10c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd978e0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd22001 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e10310707 Lio/netty/handler/codec/http/DefaultHttpHeaders;.add0(IILjava/lang/CharSequence;Ljava/lang/CharSequ (/tmp/perf-3236.map) + 7f1e0ce33c38 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + +java 3278 cpu-clock: + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81659ce1 _raw_spin_lock_bh ([kernel.kallsyms]) + ffffffff815850a2 tcp_recvmsg ([kernel.kallsyms]) + ffffffff815a94cb inet_recvmsg ([kernel.kallsyms]) + ffffffff81529e0c do_sock_read.isra.12 ([kernel.kallsyms]) + ffffffff81529e77 sock_aio_read.part.13 ([kernel.kallsyms]) + ffffffff81529ecd sock_aio_read ([kernel.kallsyms]) + ffffffff81176e3a do_sync_read ([kernel.kallsyms]) + ffffffff81177855 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ce334a7 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8158ac56 tcp_rtt_estimator ([kernel.kallsyms]) + ffffffff8158ae16 tcp_valid_rtt_meas ([kernel.kallsyms]) + ffffffff8158b30f tcp_clean_rtx_queue ([kernel.kallsyms]) + ffffffff8158e0a1 tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f4a84 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0f096c6c Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cd97050 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0e212b92 Lorg/mozilla/javascript/ScriptableObject;.getParentScope()Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e0e2bcf0c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0f6bf4b8 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cd97680 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89a78 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e10405fac Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd21ad0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff815330c8 __alloc_skb ([kernel.kallsyms]) + ffffffff815831a4 sk_stream_alloc_skb ([kernel.kallsyms]) + ffffffff81583678 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f49f2 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0f096c6c Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa07c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97d60 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff811b582b fsnotify ([kernel.kallsyms]) + ffffffff81177680 vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff815990b6 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7deac Lorg/mozilla/javascript/TopLevel;.getBuiltinPrototype(Lorg/mozilla/javascript/Scriptable;Lorg/mozil (/tmp/perf-3236.map) + 7f1e0cd0f30c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0f6bf568 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cd97cb0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e10086d87 Lorg/mozilla/javascript/ScriptRuntime;.getPropFunctionAndThis(Ljava/lang/Object;Ljava/lang/String;L (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81590410 tcp_set_skb_tso_segs ([kernel.kallsyms]) + ffffffff815927bf tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ce427b0 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81094941 ktime_get_real ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89e3d Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd21f9c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81591941 __tcp_select_window ([kernel.kallsyms]) + ffffffff8158482b tcp_cleanup_rbuf ([kernel.kallsyms]) + ffffffff815853d5 tcp_recvmsg ([kernel.kallsyms]) + ffffffff815a94cb inet_recvmsg ([kernel.kallsyms]) + ffffffff81529e0c do_sock_read.isra.12 ([kernel.kallsyms]) + ffffffff81529e77 sock_aio_read.part.13 ([kernel.kallsyms]) + ffffffff81529ecd sock_aio_read ([kernel.kallsyms]) + ffffffff81176e3a do_sync_read ([kernel.kallsyms]) + ffffffff81177855 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4980c7 Lorg/mozilla/javascript/Context;.getWrapFactory()Lorg/mozilla/javascript/WrapFactory; (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ce0ede8 Lio/netty/handler/codec/http/HttpHeaders;.isTransferEncodingChunked(Lio/netty/handler/codec/http/Ht (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff811611e1 ksize ([kernel.kallsyms]) + ffffffff815831a4 sk_stream_alloc_skb ([kernel.kallsyms]) + ffffffff81583678 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81580bd5 tcp_xmit_size_goal ([kernel.kallsyms]) + ffffffff81581760 tcp_send_mss ([kernel.kallsyms]) + ffffffff81583334 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f4a0e Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd978e0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81529ca0 sock_aio_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f664ec0 Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot;.getValue(Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e10087978 Lorg/mozilla/javascript/ScriptRuntime;.getObjectProp(Ljava/lang/Object;Ljava/lang/String;Lorg/mozil (/tmp/perf-3236.map) + 7f1e109c56bc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d48a3cc Ljava/nio/channels/spi/AbstractInterruptibleChannel;.end(Z)V (/tmp/perf-3236.map) + 7f1e0ea9cc9c Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d8c10a9 Lio/netty/util/Recycler;.recycle(Ljava/lang/Object;Lio/netty/util/Recycler$Handle;)Z (/tmp/perf-3236.map) + 7f1e0d6d53c0 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d615ee7 Lorg/mozilla/javascript/ScriptRuntime;.indexFromString(Ljava/lang/String;)J (/tmp/perf-3236.map) + 7f1e0e2b90f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100a7a4 xen_clocksource_read ([kernel.kallsyms]) + ffffffff8100a8a9 xen_clocksource_get_cycles ([kernel.kallsyms]) + ffffffff810948b7 getnstimeofday ([kernel.kallsyms]) + ffffffff81094956 ktime_get_real ([kernel.kallsyms]) + ffffffff8158b15a tcp_clean_rtx_queue ([kernel.kallsyms]) + ffffffff8158e0a1 tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cda8edf Lorg/mozilla/javascript/IdScriptableObject;.setAttributes(Ljava/lang/String;I)V (/tmp/perf-3236.map) + 7f1e10405a2c Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd21ad0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f4894 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0f096c6c Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa10c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0d7938ec Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd98230 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f48b9 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0f096c6c Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa07c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd978e0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8158de90 tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ce33da9 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81533ac2 skb_release_data ([kernel.kallsyms]) + ffffffff81533afe __kfree_skb ([kernel.kallsyms]) + ffffffff81585abf tcp_recvmsg ([kernel.kallsyms]) + ffffffff815a94cb inet_recvmsg ([kernel.kallsyms]) + ffffffff81529e0c do_sock_read.isra.12 ([kernel.kallsyms]) + ffffffff81529e77 sock_aio_read.part.13 ([kernel.kallsyms]) + ffffffff81529ecd sock_aio_read ([kernel.kallsyms]) + ffffffff81176e3a do_sync_read ([kernel.kallsyms]) + ffffffff81177855 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f096c0b Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa10c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97730 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0dc267f8 Ljava/util/concurrent/ConcurrentHashMap;.get(Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0ce42540 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7efc0 Lorg/mozilla/javascript/IdScriptableObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cd225a4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd896e0 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e9b336c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ea99d47 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e109c6371 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f4a84 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7efec Lorg/mozilla/javascript/IdScriptableObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e10087978 Lorg/mozilla/javascript/ScriptRuntime;.getObjectProp(Ljava/lang/Object;Ljava/lang/String;Lorg/mozil (/tmp/perf-3236.map) + 7f1e0cd22588 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8103dd44 pvclock_clocksource_read ([kernel.kallsyms]) + ffffffff8100a7c0 xen_clocksource_read ([kernel.kallsyms]) + ffffffff8100a8a9 xen_clocksource_get_cycles ([kernel.kallsyms]) + ffffffff810948b7 getnstimeofday ([kernel.kallsyms]) + ffffffff81094956 ktime_get_real ([kernel.kallsyms]) + ffffffff81591f03 tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e2215d058 (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ea90b23 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89a78 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e10405fac Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd96c90 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7d001 Lio/netty/util/internal/AppendableCharSequence;.append(C)Lio/netty/util/internal/AppendableCharSequ (/tmp/perf-3236.map) + 7f1e0cdac9d4 Lio/netty/buffer/AbstractByteBuf;.forEachByteAsc0(IILio/netty/buffer/ByteBufProcessor;)I (/tmp/perf-3236.map) + 7f1e106aa2d8 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8156ea84 ipv4_mtu ([kernel.kallsyms]) + ffffffff815917cd tcp_current_mss ([kernel.kallsyms]) + ffffffff8158174b tcp_send_mss ([kernel.kallsyms]) + ffffffff81583334 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0fa560e0 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e11987815 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0feb7663 Lio/netty/handler/codec/http/HttpObjectDecoder;.splitHeader(Lio/netty/util/internal/AppendableCharS (/tmp/perf-3236.map) + 7f1e0df12508 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f09701a Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa10c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97580 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ce3d7c0 Lio/netty/buffer/AbstractByteBufAllocator;.directBuffer(II)Lio/netty/buffer/ByteBuf; (/tmp/perf-3236.map) + 7f1e0cff7380 Lio/netty/handler/codec/http/HttpObjectEncoder;.encode(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0ea9fd28 Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e11300860 Lorg/mozilla/javascript/NativeJavaObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e0cd97ec4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7efa0 Lorg/mozilla/javascript/IdScriptableObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0facf358 Lorg/mozilla/javascript/ScriptRuntime;.name(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript (/tmp/perf-3236.map) + 7f1e109c56a0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81574e48 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff812d6971 apparmor_file_permission ([kernel.kallsyms]) + ffffffff811772c1 rw_verify_area ([kernel.kallsyms]) + ffffffff811775f8 vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81044b41 __phys_addr ([kernel.kallsyms]) + ffffffff8153312c __alloc_skb ([kernel.kallsyms]) + ffffffff815831a4 sk_stream_alloc_skb ([kernel.kallsyms]) + ffffffff81583678 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d0ce6e7 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cd97f08 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0e212ba1 Lorg/mozilla/javascript/ScriptableObject;.getParentScope()Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e0e9b33e4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d8bad76 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e10405908 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd96c90 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89771 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd2214c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e11309ba7 Lio/netty/handler/codec/http/HttpObjectDecoder;.findWhitespace(Ljava/lang/CharSequence;I)I (/tmp/perf-3236.map) + 7f1e106aa358 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f49f2 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cd97244 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8117787c sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100a8a0 xen_clocksource_get_cycles ([kernel.kallsyms]) + ffffffff81094956 ktime_get_real ([kernel.kallsyms]) + ffffffff81591f03 tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0facf728 Lio/netty/buffer/AbstractByteBuf;.writeBytes([B)Lio/netty/buffer/ByteBuf; (/tmp/perf-3236.map) + 7f1e0ea9fd28 Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f664ee9 Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot;.getValue(Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e0cd7f008 Lorg/mozilla/javascript/IdScriptableObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0f99a268 Lorg/mozilla/javascript/ScriptRuntime;.nameOrFunction(Lorg/mozilla/javascript/Context;Lorg/mozilla/ (/tmp/perf-3236.map) + 7f1e0facf358 Lorg/mozilla/javascript/ScriptRuntime;.name(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript (/tmp/perf-3236.map) + 7f1e109c61e0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0dc9c403 Lio/netty/buffer/PooledByteBuf;.internalNioBuffer()Ljava/nio/ByteBuffer; (/tmp/perf-3236.map) + 7f1e0d6db2e0 Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0e78b88b Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e109c5bc0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4980c7 Lorg/mozilla/javascript/Context;.getWrapFactory()Lorg/mozilla/javascript/WrapFactory; (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8158ac50 tcp_rtt_estimator ([kernel.kallsyms]) + ffffffff8158b30f tcp_clean_rtx_queue ([kernel.kallsyms]) + ffffffff8158e0a1 tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8108f76c __srcu_read_lock ([kernel.kallsyms]) + ffffffff811b5954 fsnotify ([kernel.kallsyms]) + ffffffff81177680 vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81580bc1 tcp_xmit_size_goal ([kernel.kallsyms]) + ffffffff81583334 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100ac8f xen_restore_fl_direct_end ([kernel.kallsyms]) + ffffffff81541fb5 netif_rx.part.82 ([kernel.kallsyms]) + ffffffff815420d0 netif_rx ([kernel.kallsyms]) + ffffffff81471fa5 loopback_xmit ([kernel.kallsyms]) + ffffffff81542b76 dev_hard_start_xmit ([kernel.kallsyms]) + ffffffff8154310a dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cccb960 vtable chunks (/tmp/perf-3236.map) + 7f1e0ea9febc Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f096d7e Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa10c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e9b3404 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8158478b tcp_cleanup_rbuf ([kernel.kallsyms]) + ffffffff815853d5 tcp_recvmsg ([kernel.kallsyms]) + ffffffff815a94cb inet_recvmsg ([kernel.kallsyms]) + ffffffff81529e0c do_sock_read.isra.12 ([kernel.kallsyms]) + ffffffff81529e77 sock_aio_read.part.13 ([kernel.kallsyms]) + ffffffff81529ecd sock_aio_read ([kernel.kallsyms]) + ffffffff81176e3a do_sync_read ([kernel.kallsyms]) + ffffffff81177855 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81583cbe tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0dc1788e Ljava/util/HashMap;.get(Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0d8c1f88 Lorg/mozilla/javascript/WrapFactory;.wrap(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0cea3b54 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cea27bb Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ea90a67 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7de60 Lorg/mozilla/javascript/TopLevel;.getBuiltinPrototype(Lorg/mozilla/javascript/Scriptable;Lorg/mozil (/tmp/perf-3236.map) + 7f1e10405c8c Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0e78a0ec Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d792284 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd98230 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81548e3c dst_release ([kernel.kallsyms]) + ffffffff81533d79 skb_release_head_state ([kernel.kallsyms]) + ffffffff81533af6 __kfree_skb ([kernel.kallsyms]) + ffffffff81585abf tcp_recvmsg ([kernel.kallsyms]) + ffffffff815a94cb inet_recvmsg ([kernel.kallsyms]) + ffffffff81529e0c do_sock_read.isra.12 ([kernel.kallsyms]) + ffffffff81529e77 sock_aio_read.part.13 ([kernel.kallsyms]) + ffffffff81529ecd sock_aio_read ([kernel.kallsyms]) + ffffffff81176e3a do_sync_read ([kernel.kallsyms]) + ffffffff81177855 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89b04 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97730 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cdac922 Lio/netty/buffer/AbstractByteBuf;.forEachByteAsc0(IILio/netty/buffer/ByteBufProcessor;)I (/tmp/perf-3236.map) + 7f1e0df12338 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cea447a Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff811626fa kmem_cache_alloc_node ([kernel.kallsyms]) + ffffffff815330eb __alloc_skb ([kernel.kallsyms]) + ffffffff815831a4 sk_stream_alloc_skb ([kernel.kallsyms]) + ffffffff81583678 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff813a2f29 dma_issue_pending_all ([kernel.kallsyms]) + ffffffff81541dd2 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8106d43c local_bh_disable ([kernel.kallsyms]) + ffffffff81659cf6 _raw_spin_lock_bh ([kernel.kallsyms]) + ffffffff8152df44 lock_sock_nested ([kernel.kallsyms]) + ffffffff815832a9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81574c80 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e113084c7 Lio/netty/handler/codec/http/DefaultHttpHeaders;.set(Ljava/lang/CharSequence;Ljava/lang/Object;)Lio (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ca1bf80 jbyte_disjoint_arraycopy (/tmp/perf-3236.map) + 7f1e0e9ac695 Lsun/nio/cs/UTF_8$Encoder;.(Ljava/nio/charset/Charset;Lsun/nio/cs/UTF_8$1;)V (/tmp/perf-3236.map) + 7f1e0ce3356c Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8158b620 tcp_rcv_space_adjust ([kernel.kallsyms]) + ffffffff815a94cb inet_recvmsg ([kernel.kallsyms]) + ffffffff81529e0c do_sock_read.isra.12 ([kernel.kallsyms]) + ffffffff81529e77 sock_aio_read.part.13 ([kernel.kallsyms]) + ffffffff81529ecd sock_aio_read ([kernel.kallsyms]) + ffffffff81176e3a do_sync_read ([kernel.kallsyms]) + ffffffff81177855 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cccba73 vtable chunks (/tmp/perf-3236.map) + 7f1e0f99a2e4 Lorg/mozilla/javascript/ScriptRuntime;.nameOrFunction(Lorg/mozilla/javascript/Context;Lorg/mozilla/ (/tmp/perf-3236.map) + 7f1e0facf358 Lorg/mozilla/javascript/ScriptRuntime;.name(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript (/tmp/perf-3236.map) + 7f1e0d79332c Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd98230 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0dcff928 Lio/netty/buffer/AbstractReferenceCountedByteBuf;.release()Z (/tmp/perf-3236.map) + 7f1e0d6d53c0 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81542920 dev_hard_start_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ff2068d Lio/netty/util/concurrent/FastThreadLocal;.get()Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0ce3d5a0 Lio/netty/buffer/AbstractByteBufAllocator;.directBuffer(II)Lio/netty/buffer/ByteBuf; (/tmp/perf-3236.map) + 7f1e0cff7380 Lio/netty/handler/codec/http/HttpObjectEncoder;.encode(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0ea9fd28 Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f096bd0 Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa10c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97cd0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + +java 3278 cpu-clock: + ffffffff8158af10 tcp_clean_rtx_queue ([kernel.kallsyms]) + ffffffff8158e0a1 tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81534f71 skb_clone ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89a78 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e9b32d4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8157a421 ip_output ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0feb78fb Lio/netty/handler/codec/http/HttpObjectDecoder;.splitHeader(Lio/netty/util/internal/AppendableCharS (/tmp/perf-3236.map) + 7f1e0df12508 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cf48335 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e0cd97f08 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff811772ab rw_verify_area ([kernel.kallsyms]) + ffffffff811775f8 vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f4aab Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7efec Lorg/mozilla/javascript/IdScriptableObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e10405df8 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd96c90 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd8962c Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e9b3404 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d3fc2e7 Lorg/mozilla/javascript/NativeJavaMethod;.findFunction(Lorg/mozilla/javascript/Context;[Lorg/mozill (/tmp/perf-3236.map) + 7f1e0cd97f08 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ff1ce1f Lsun/nio/ch/NativeThread;.current()J (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d615efd Lorg/mozilla/javascript/ScriptRuntime;.indexFromString(Ljava/lang/String;)J (/tmp/perf-3236.map) + 7f1e0e2bc514 Lorg/mozilla/javascript/ScriptRuntime;.setObjectElem(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e2b90f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ce336e2 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89707 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97df0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e11300ec8 Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e104057f2 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd21ad0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89752 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e78a1fc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d792284 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd98230 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ea99d47 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f096ba0 Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cd222fc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81176d61 do_sync_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e106a7dab Ljava/util/Arrays;.fill([Ljava/lang/Object;Ljava/lang/Object;)V (/tmp/perf-3236.map) + 7f1e0df123d4 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e11300860 Lorg/mozilla/javascript/NativeJavaObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e0cd97ec4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e001d9d9d Java_sun_nio_ch_FileDispatcherImpl_write0 (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/libnio.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8157d8a3 __inet_lookup_established ([kernel.kallsyms]) + ffffffff81598e45 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0df124f9 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8115f051 get_slab ([kernel.kallsyms]) + ffffffff81533118 __alloc_skb ([kernel.kallsyms]) + ffffffff815831a4 sk_stream_alloc_skb ([kernel.kallsyms]) + ffffffff81583678 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e10087933 Lorg/mozilla/javascript/ScriptRuntime;.getObjectProp(Ljava/lang/Object;Ljava/lang/String;Lorg/mozil (/tmp/perf-3236.map) + 7f1e109c56bc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e109c2ca7 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff815be638 bictcp_acked ([kernel.kallsyms]) + ffffffff8158b198 tcp_clean_rtx_queue ([kernel.kallsyms]) + ffffffff8158e0a1 tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f666be7 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd5f400 Lorg/mozilla/javascript/IdScriptableObject;.findInstanceIdInfo(Ljava/lang/String;)I (/tmp/perf-3236.map) + 7f1e0cdaa07c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd2214c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7c042 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd980c8 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f49f2 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0f096c6c Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa10c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97610 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89b2e Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e9b32d4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d615f3c Lorg/mozilla/javascript/ScriptRuntime;.indexFromString(Ljava/lang/String;)J (/tmp/perf-3236.map) + 7f1e0e2bc514 Lorg/mozilla/javascript/ScriptRuntime;.setObjectElem(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e2b90f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81316724 copy_user_enhanced_fast_string ([kernel.kallsyms]) + ffffffff81537937 skb_copy_datagram_iovec ([kernel.kallsyms]) + ffffffff81585a45 tcp_recvmsg ([kernel.kallsyms]) + ffffffff815a94cb inet_recvmsg ([kernel.kallsyms]) + ffffffff81529e0c do_sock_read.isra.12 ([kernel.kallsyms]) + ffffffff81529e77 sock_aio_read.part.13 ([kernel.kallsyms]) + ffffffff81529ecd sock_aio_read ([kernel.kallsyms]) + ffffffff81176e3a do_sync_read ([kernel.kallsyms]) + ffffffff81177855 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cda8e07 Lorg/mozilla/javascript/IdScriptableObject;.setAttributes(Ljava/lang/String;I)V (/tmp/perf-3236.map) + 7f1e0cd96c90 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81591be1 tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff815836dc tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89650 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97d60 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81533ae1 __kfree_skb ([kernel.kallsyms]) + ffffffff815a94cb inet_recvmsg ([kernel.kallsyms]) + ffffffff81529e0c do_sock_read.isra.12 ([kernel.kallsyms]) + ffffffff81529e77 sock_aio_read.part.13 ([kernel.kallsyms]) + ffffffff81529ecd sock_aio_read ([kernel.kallsyms]) + ffffffff81176e3a do_sync_read ([kernel.kallsyms]) + ffffffff81177855 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d0ce763 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89b2e Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e9b32d4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cc84a24 Lorg/mozilla/javascript/ScriptableObject;.getPrototype()Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e0cd96c90 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0dc1779d Ljava/util/HashMap;.get(Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0d788bb4 Lorg/mozilla/javascript/WrapFactory;.wrapAsJavaObject(Lorg/mozilla/javascript/Context;Lorg/mozilla/ (/tmp/perf-3236.map) + 7f1e0cea3b94 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d788a64 Lorg/mozilla/javascript/WrapFactory;.wrapAsJavaObject(Lorg/mozilla/javascript/Context;Lorg/mozilla/ (/tmp/perf-3236.map) + 7f1e0cea3b94 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e109c5b81 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7de4b Lorg/mozilla/javascript/TopLevel;.getBuiltinPrototype(Lorg/mozilla/javascript/Scriptable;Lorg/mozil (/tmp/perf-3236.map) + 7f1e0cea124c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0f6bf538 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cd97b00 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ff20648 Lio/netty/util/concurrent/FastThreadLocal;.get()Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e11302970 Lio/netty/util/internal/RecyclableArrayList;.newInstance()Lio/netty/util/internal/RecyclableArrayLi (/tmp/perf-3236.map) + 7f1e0ea9fce8 Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8153bbd1 dev_pick_tx ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7bf94 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd2226c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ce3d93d Lio/netty/buffer/AbstractByteBufAllocator;.directBuffer(II)Lio/netty/buffer/ByteBuf; (/tmp/perf-3236.map) + 7f1e0cff7380 Lio/netty/handler/codec/http/HttpObjectEncoder;.encode(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0ea9fd28 Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff812d67a4 common_file_perm ([kernel.kallsyms]) + ffffffff812d6988 apparmor_file_permission ([kernel.kallsyms]) + ffffffff8129c17c security_file_permission ([kernel.kallsyms]) + ffffffff811772c1 rw_verify_area ([kernel.kallsyms]) + ffffffff811775f8 vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f48b4 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0f096c6c Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa07c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97bb0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ce3d960 Lio/netty/buffer/AbstractByteBufAllocator;.directBuffer(II)Lio/netty/buffer/ByteBuf; (/tmp/perf-3236.map) + 7f1e0d39ae18 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8103dcb1 pvclock_clocksource_read ([kernel.kallsyms]) + ffffffff8100a8a9 xen_clocksource_get_cycles ([kernel.kallsyms]) + ffffffff810948b7 getnstimeofday ([kernel.kallsyms]) + ffffffff81094956 ktime_get_real ([kernel.kallsyms]) + ffffffff81591f03 tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81592bb1 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8158df0b tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cda9680 Lorg/mozilla/javascript/ScriptableObject$Slot;.getValue(Lorg/mozilla/javascript/Scriptable;)Ljava/l (/tmp/perf-3236.map) + 7f1e0f99a268 Lorg/mozilla/javascript/ScriptRuntime;.nameOrFunction(Lorg/mozilla/javascript/Context;Lorg/mozilla/ (/tmp/perf-3236.map) + 7f1e109c58b8 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f664ed8 Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot;.getValue(Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e0cd7f008 Lorg/mozilla/javascript/IdScriptableObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0f99a2e4 Lorg/mozilla/javascript/ScriptRuntime;.nameOrFunction(Lorg/mozilla/javascript/Context;Lorg/mozilla/ (/tmp/perf-3236.map) + 7f1e0cd2256c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0dcffaa4 Lio/netty/buffer/AbstractReferenceCountedByteBuf;.release()Z (/tmp/perf-3236.map) + 7f1e0e78b800 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff81548de1 skb_dst_set_noref ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89752 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97d60 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8158e090 tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd89707 Lorg/mozilla/javascript/ScriptableObject;.createSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/S (/tmp/perf-3236.map) + 7f1e0d4f4a70 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0cd7bff4 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e9b32d4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0feb77f3 Lio/netty/handler/codec/http/HttpObjectDecoder;.splitHeader(Lio/netty/util/internal/AppendableCharS (/tmp/perf-3236.map) + 7f1e0df12508 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e10405a59 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0e78a0ec Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d792284 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd98230 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0facf809 Lio/netty/buffer/AbstractByteBuf;.writeBytes([B)Lio/netty/buffer/ByteBuf; (/tmp/perf-3236.map) + 7f1e0cff73e4 Lio/netty/handler/codec/http/HttpObjectEncoder;.encode(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0ea9fd28 Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4f49c8 Lorg/mozilla/javascript/ScriptableObject;.getSlot(Ljava/lang/String;II)Lorg/mozilla/javascript/Scri (/tmp/perf-3236.map) + 7f1e0f096c6c Lorg/mozilla/javascript/IdScriptableObject;.has(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa10c Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0cd97cd0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ea9fc54 Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0f99bbfb Lio/netty/handler/codec/http/HttpHeaders;.hash(Ljava/lang/CharSequence;)I (/tmp/perf-3236.map) + 7f1e0df124b4 Lio/netty/handler/codec/http/HttpObjectDecoder;.readHeaders(Lio/netty/buffer/ByteBuf;)Lio/netty/han (/tmp/perf-3236.map) + 7f1e106aaac0 Lio/netty/handler/codec/http/HttpObjectDecoder;.decode(Lio/netty/channel/ChannelHandlerContext;Lio/ (/tmp/perf-3236.map) + 7f1e0e78b758 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7efd4 Lorg/mozilla/javascript/IdScriptableObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e10405da4 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0e9b312c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cd7bf94 Lorg/mozilla/javascript/IdScriptableObject;.put(Ljava/lang/String;Lorg/mozilla/javascript/Scriptabl (/tmp/perf-3236.map) + 7f1e0cdaa0e0 Lorg/mozilla/javascript/ScriptRuntime;.setObjectProp(Ljava/lang/Object;Ljava/lang/String;Ljava/lang (/tmp/perf-3236.map) + 7f1e0e9b336c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d7924e8 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cda909c Lorg/mozilla/javascript/IdScriptableObject;.setAttributes(Ljava/lang/String;I)V (/tmp/perf-3236.map) + 7f1e10405fc0 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0cd96c90 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0dc1779d Ljava/util/HashMap;.get(Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e113008b8 Lorg/mozilla/javascript/NativeJavaObject;.get(Ljava/lang/String;Lorg/mozilla/javascript/Scriptable; (/tmp/perf-3236.map) + 7f1e10086df8 Lorg/mozilla/javascript/ScriptRuntime;.getPropFunctionAndThis(Ljava/lang/Object;Ljava/lang/String;L (/tmp/perf-3236.map) + 7f1e0cd97ec4 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d6d585c Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cea3aa0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0ca1c281 jint_disjoint_arraycopy (/tmp/perf-3236.map) + 7f1e0cd22658 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2f50 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0dd024bc Lorg/mozilla/javascript/ScriptRuntime;.newObject(Ljava/lang/Object;Lorg/mozilla/javascript/Context; (/tmp/perf-3236.map) + 7f1e0cd980ac Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d180ec7 Lsun/nio/ch/SocketChannelImpl;.writerCleanup()V (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8115e5d1 arch_local_irq_save ([kernel.kallsyms]) + ffffffff81164dd4 __kmalloc_node_track_caller ([kernel.kallsyms]) + ffffffff81533118 __alloc_skb ([kernel.kallsyms]) + ffffffff815831a4 sk_stream_alloc_skb ([kernel.kallsyms]) + ffffffff81583678 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d6d5688 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100122a hypercall_page ([kernel.kallsyms]) + ffffffff8100aca2 check_events ([kernel.kallsyms]) + ffffffff8104dffe __wake_up_sync_key ([kernel.kallsyms]) + ffffffff8152f86e sock_def_readable ([kernel.kallsyms]) + ffffffff8158f4c8 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0cda909c Lorg/mozilla/javascript/IdScriptableObject;.setAttributes(Ljava/lang/String;I)V (/tmp/perf-3236.map) + 7f1e10405ee8 Lorg/mozilla/javascript/ScriptRuntime;.createFunctionActivation(Lorg/mozilla/javascript/NativeFunct (/tmp/perf-3236.map) + 7f1e0e78a0ec Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0d792284 Lorg/mozilla/javascript/optimizer/OptRuntime;.call2(Lorg/mozilla/javascript/Callable;Lorg/mozilla/j (/tmp/perf-3236.map) + 7f1e0cd98230 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2e30 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c5810 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d4577a3 Ljava/util/ArrayList;.add(Ljava/lang/Object;)Z (/tmp/perf-3236.map) + 7f1e0cff76e8 Lio/netty/handler/codec/http/HttpObjectEncoder;.encode(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0ea9fd28 Lio/netty/handler/codec/MessageToMessageEncoder;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ea90be8 Lorg/vertx/java/core/http/impl/VertxHttpHandler;.write(Lio/netty/channel/ChannelHandlerContext;Ljav (/tmp/perf-3236.map) + 7f1e0d78ee34 Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;ZLio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d78cb7c Lio/netty/channel/AbstractChannelHandlerContext;.write(Ljava/lang/Object;Lio/netty/channel/ChannelP (/tmp/perf-3236.map) + 7f1e0ce34264 Lsun/reflect/DelegatingMethodAccessorImpl;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/ (/tmp/perf-3236.map) + 7f1e0d0ce780 Lorg/mozilla/javascript/MemberBox;.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (/tmp/perf-3236.map) + 7f1e0cf48460 Lorg/mozilla/javascript/NativeJavaMethod;.call(Lorg/mozilla/javascript/Context;Lorg/mozilla/javascr (/tmp/perf-3236.map) + 7f1e109c62cc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0e2b91f0 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1;.call(Lorg/mozilla/javascript/Co (/tmp/perf-3236.map) + 7f1e109c5920 Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8108f741 __srcu_read_lock ([kernel.kallsyms]) + ffffffff81177680 vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff8100ac88 xen_restore_fl_direct ([kernel.kallsyms]) + ffffffff81541fb5 netif_rx.part.82 ([kernel.kallsyms]) + ffffffff815420d0 netif_rx ([kernel.kallsyms]) + ffffffff81471fa5 loopback_xmit ([kernel.kallsyms]) + ffffffff81542b76 dev_hard_start_xmit ([kernel.kallsyms]) + ffffffff8154310a dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e0d39b01b Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff815378ac skb_copy_datagram_iovec ([kernel.kallsyms]) + ffffffff81585a45 tcp_recvmsg ([kernel.kallsyms]) + ffffffff815a94cb inet_recvmsg ([kernel.kallsyms]) + ffffffff81529e0c do_sock_read.isra.12 ([kernel.kallsyms]) + ffffffff81529e77 sock_aio_read.part.13 ([kernel.kallsyms]) + ffffffff81529ecd sock_aio_read ([kernel.kallsyms]) + ffffffff81176e3a do_sync_read ([kernel.kallsyms]) + ffffffff81177855 vfs_read ([kernel.kallsyms]) + ffffffff811778ba sys_read ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f1d read (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e0d8c180b Lsun/nio/ch/FileDispatcherImpl;.read0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0ea9cb88 Lsun/nio/ch/SocketChannelImpl;.read(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0cd626d4 Lio/netty/channel/socket/nio/NioSocketChannel;.doReadBytes(Lio/netty/buffer/ByteBuf;)I (/tmp/perf-3236.map) + 7f1e0d39ae58 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e10087933 Lorg/mozilla/javascript/ScriptRuntime;.getObjectProp(Ljava/lang/Object;Ljava/lang/String;Lorg/mozil (/tmp/perf-3236.map) + 7f1e109c56bc Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e109c2d8c Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 (/tmp/perf-3236.map) + 7f1e0cea3bb0 Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler;.doMessageReceived(Lorg/vertx/java/c (/tmp/perf-3236.map) + 7f1e0ce42740 Lorg/vertx/java/core/net/impl/VertxHandler;.channelRead(Lio/netty/channel/ChannelHandlerContext;Lja (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0e78b8b0 Lio/netty/handler/codec/ByteToMessageDecoder;.channelRead(Lio/netty/channel/ChannelHandlerContext;L (/tmp/perf-3236.map) + 7f1e0d8bccb4 Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelRead(Ljava/lang/Object;)Lio/netty/chann (/tmp/perf-3236.map) + 7f1e0d39aefc Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + 7f1e2215d0c0 (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) + +java 3278 cpu-clock: + ffffffff815339b6 skb_release_data.part.45 ([kernel.kallsyms]) + ffffffff81533ad5 skb_release_data ([kernel.kallsyms]) + ffffffff81533afe __kfree_skb ([kernel.kallsyms]) + ffffffff8158afe3 tcp_clean_rtx_queue ([kernel.kallsyms]) + ffffffff8158e0a1 tcp_ack ([kernel.kallsyms]) + ffffffff8158f426 tcp_rcv_established ([kernel.kallsyms]) + ffffffff815978df tcp_v4_do_rcv ([kernel.kallsyms]) + ffffffff81599231 tcp_v4_rcv ([kernel.kallsyms]) + ffffffff81574d65 ip_local_deliver_finish ([kernel.kallsyms]) + ffffffff815750c8 ip_local_deliver ([kernel.kallsyms]) + ffffffff81574a1d ip_rcv_finish ([kernel.kallsyms]) + ffffffff81575305 ip_rcv ([kernel.kallsyms]) + ffffffff8154080e __netif_receive_skb ([kernel.kallsyms]) + ffffffff81540ad1 process_backlog ([kernel.kallsyms]) + ffffffff81541df4 net_rx_action ([kernel.kallsyms]) + ffffffff8106e428 __do_softirq ([kernel.kallsyms]) + ffffffff816643ac call_softirq ([kernel.kallsyms]) + ffffffff81016295 do_softirq ([kernel.kallsyms]) + ffffffff8106da94 local_bh_enable ([kernel.kallsyms]) + ffffffff81542fd9 dev_queue_xmit ([kernel.kallsyms]) + ffffffff8157996b ip_finish_output ([kernel.kallsyms]) + ffffffff8157a4b8 ip_output ([kernel.kallsyms]) + ffffffff81579bc9 ip_local_out ([kernel.kallsyms]) + ffffffff81579d21 ip_queue_xmit ([kernel.kallsyms]) + ffffffff81591e0d tcp_transmit_skb ([kernel.kallsyms]) + ffffffff81592927 tcp_write_xmit ([kernel.kallsyms]) + ffffffff81592bd6 __tcp_push_pending_frames ([kernel.kallsyms]) + ffffffff81583ae9 tcp_sendmsg ([kernel.kallsyms]) + ffffffff815a9544 inet_sendmsg ([kernel.kallsyms]) + ffffffff81529c84 do_sock_write.isra.10 ([kernel.kallsyms]) + ffffffff81529d03 sock_aio_write ([kernel.kallsyms]) + ffffffff81176d1a do_sync_write ([kernel.kallsyms]) + ffffffff811776dd vfs_write ([kernel.kallsyms]) + ffffffff8117794a sys_write ([kernel.kallsyms]) + ffffffff81662142 system_call_fastpath ([kernel.kallsyms]) + 7f1e22141f7d write (/lib/x86_64-linux-gnu/libc-2.15.so) + 7f1e11300e8b Lsun/nio/ch/FileDispatcherImpl;.write0(Ljava/io/FileDescriptor;JI)I (/tmp/perf-3236.map) + 7f1e0cffe6c8 Lsun/nio/ch/SocketChannelImpl;.write(Ljava/nio/ByteBuffer;)I (/tmp/perf-3236.map) + 7f1e0d6db35c Lio/netty/buffer/PooledUnsafeDirectByteBuf;.readBytes(Ljava/nio/channels/GatheringByteChannel;I)I (/tmp/perf-3236.map) + 7f1e0d6d5630 Lio/netty/channel/nio/AbstractNioByteChannel;.doWrite(Lio/netty/channel/ChannelOutboundBuffer;)V (/tmp/perf-3236.map) + 7f1e0cd133fc Lio/netty/channel/AbstractChannel$AbstractUnsafe;.flush0()V (/tmp/perf-3236.map) + 7f1e0da8fd28 Lio/netty/channel/DefaultChannelPipeline$HeadContext;.flush(Lio/netty/channel/ChannelHandlerContext (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0da8f3e4 Lio/netty/channel/ChannelOutboundHandlerAdapter;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0ea99d64 Lio/netty/channel/ChannelDuplexHandler;.flush(Lio/netty/channel/ChannelHandlerContext;)V (/tmp/perf-3236.map) + 7f1e0d77cdd4 Lio/netty/channel/AbstractChannelHandlerContext;.flush()Lio/netty/channel/ChannelHandlerContext; (/tmp/perf-3236.map) + 7f1e0fa56204 Lorg/vertx/java/core/net/impl/VertxHandler;.channelReadComplete(Lio/netty/channel/ChannelHandlerCon (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0ff1f264 Lio/netty/handler/codec/ByteToMessageDecoder;.channelReadComplete(Lio/netty/channel/ChannelHandlerC (/tmp/perf-3236.map) + 7f1e0f08fd0c Lio/netty/channel/AbstractChannelHandlerContext;.fireChannelReadComplete()Lio/netty/channel/Channel (/tmp/perf-3236.map) + 7f1e0d39af78 Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe;.read()V (/tmp/perf-3236.map) + 7f1e102a43a8 Lio/netty/channel/nio/NioEventLoop;.processSelectedKey(Ljava/nio/channels/SelectionKey;Lio/netty/ch (/tmp/perf-3236.map) + 7f1e0f666c14 Lio/netty/channel/nio/NioEventLoop;.processSelectedKeysOptimized([Ljava/nio/channels/SelectionKey;) (/tmp/perf-3236.map) + 7f1e0d49c9fc Lio/netty/channel/nio/NioEventLoop;.processSelectedKeys()V (/tmp/perf-3236.map) + 7f1e119a6974 Lio/netty/channel/nio/NioEventLoop;.run()V (/tmp/perf-3236.map) + 7f1e0c9d12e0 Interpreter (/tmp/perf-3236.map) + 7f1e0c9d1325 Interpreter (/tmp/perf-3236.map) + 7f1e0c9ca4e7 call_stub (/tmp/perf-3236.map) + 7f1e213b270e JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3a3f JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213b3edf JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e213ed668 thread_entry(JavaThread*, Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e217015c8 JavaThread::thread_main_inner() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e2170181c JavaThread::run() (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e215c2ba2 java_start(Thread*) (/mnt/openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so) + 7f1e21c41e9a start_thread (/lib/x86_64-linux-gnu/libpthread-2.15.so) diff --git a/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-addrs.txt new file mode 100644 index 0000000..80a5753 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-addrs.txt @@ -0,0 +1,7 @@ +cksum;_start;__libc_start_main;main;cksum 31 +cksum;cksum 6 +cksum;cksum;__GI___fread_unlocked;_IO_file_xsgetn;_IO_file_read;entry_SYSCALL_64_fastpath;sys_read;vfs_read;__vfs_read;ext4_file_read_iter 1 +cksum;main;cksum 19 +noploop;[unknown <552f0000552f>] 1 +noploop;[unknown <774db3aa23>] 1 +noploop;main 274 diff --git a/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-all.txt new file mode 100644 index 0000000..33a75a8 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-all.txt @@ -0,0 +1,6 @@ +cksum;_start;__libc_start_main;main;cksum 31 +cksum;cksum 6 +cksum;cksum;__GI___fread_unlocked;_IO_file_xsgetn;_IO_file_read;entry_SYSCALL_64_fastpath_[k];sys_read_[k];vfs_read_[k];__vfs_read_[k];ext4_file_read_iter_[k] 1 +cksum;main;cksum 19 +noploop;[unknown] 2 +noploop;main 274 diff --git a/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-jit.txt new file mode 100644 index 0000000..5b35270 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-jit.txt @@ -0,0 +1,6 @@ +cksum;_start;__libc_start_main;main;cksum 31 +cksum;cksum 6 +cksum;cksum;__GI___fread_unlocked;_IO_file_xsgetn;_IO_file_read;entry_SYSCALL_64_fastpath;sys_read;vfs_read;__vfs_read;ext4_file_read_iter 1 +cksum;main;cksum 19 +noploop;[unknown] 2 +noploop;main 274 diff --git a/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-kernel.txt new file mode 100644 index 0000000..33a75a8 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-kernel.txt @@ -0,0 +1,6 @@ +cksum;_start;__libc_start_main;main;cksum 31 +cksum;cksum 6 +cksum;cksum;__GI___fread_unlocked;_IO_file_xsgetn;_IO_file_read;entry_SYSCALL_64_fastpath_[k];sys_read_[k];vfs_read_[k];__vfs_read_[k];ext4_file_read_iter_[k] 1 +cksum;main;cksum 19 +noploop;[unknown] 2 +noploop;main 274 diff --git a/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-pid.txt new file mode 100644 index 0000000..5e17fe9 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-pid.txt @@ -0,0 +1,6 @@ +cksum-?;_start;__libc_start_main;main;cksum 31 +cksum-?;cksum 6 +cksum-?;cksum;__GI___fread_unlocked;_IO_file_xsgetn;_IO_file_read;entry_SYSCALL_64_fastpath;sys_read;vfs_read;__vfs_read;ext4_file_read_iter 1 +cksum-?;main;cksum 19 +noploop-?;[unknown] 2 +noploop-?;main 274 diff --git a/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-tid.txt new file mode 100644 index 0000000..a9c777f --- /dev/null +++ b/tools/FlameGraph/test/results/perf-cycles-instructions-01-collapsed-tid.txt @@ -0,0 +1,9 @@ +cksum-?/21804;cksum 5 +cksum-?/21804;cksum;__GI___fread_unlocked;_IO_file_xsgetn;_IO_file_read;entry_SYSCALL_64_fastpath;sys_read;vfs_read;__vfs_read;ext4_file_read_iter 1 +cksum-?/21807;_start;__libc_start_main;main;cksum 31 +cksum-?/21807;cksum 1 +cksum-?/21807;main;cksum 19 +noploop-?/21796;[unknown] 1 +noploop-?/21796;main 136 +noploop-?/21797;[unknown] 1 +noploop-?/21797;main 138 diff --git a/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-addrs.txt new file mode 100644 index 0000000..508256f --- /dev/null +++ b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-addrs.txt @@ -0,0 +1,9 @@ +dd;[unknown <0>];read 10101010 +dd;[unknown <0>];read;system_call;__fdget_pos 10101010 +dd;[unknown <0>];read;system_call;sys_read;vfs_read;fsnotify 10101010 +dd;[unknown <0>];write;system_call;sys_write 10101010 +dd;[unknown <0>];write;system_call;sys_write;vfs_write;fsnotify;__srcu_read_unlock 20202020 +dd;[unknown <0>];write;system_call;sys_write;vfs_write;rw_verify_area 10101010 +dd;[unknown <7f2eb2b31c2c>];[dd <31ef>] 10101010 +dd;write;system_call;sys_write;__fdget_pos;__fdget;__fget_light 10101010 +dd;write;system_call;sys_write;vfs_write;fsnotify;__srcu_read_unlock 10101010 diff --git a/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-all.txt new file mode 100644 index 0000000..2ee761a --- /dev/null +++ b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-all.txt @@ -0,0 +1,9 @@ +dd;[unknown];[dd] 10101010 +dd;[unknown];read 10101010 +dd;[unknown];read;system_call_[k];__fdget_pos_[k] 10101010 +dd;[unknown];read;system_call_[k];sys_read_[k];vfs_read_[k];fsnotify_[k] 10101010 +dd;[unknown];write;system_call_[k];sys_write_[k] 10101010 +dd;[unknown];write;system_call_[k];sys_write_[k];vfs_write_[k];fsnotify_[k];__srcu_read_unlock_[k] 20202020 +dd;[unknown];write;system_call_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k] 10101010 +dd;write;system_call_[k];sys_write_[k];__fdget_pos_[k];__fdget_[k];__fget_light_[k] 10101010 +dd;write;system_call_[k];sys_write_[k];vfs_write_[k];fsnotify_[k];__srcu_read_unlock_[k] 10101010 diff --git a/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-jit.txt new file mode 100644 index 0000000..12a2349 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-jit.txt @@ -0,0 +1,9 @@ +dd;[unknown];[dd] 10101010 +dd;[unknown];read 10101010 +dd;[unknown];read;system_call;__fdget_pos 10101010 +dd;[unknown];read;system_call;sys_read;vfs_read;fsnotify 10101010 +dd;[unknown];write;system_call;sys_write 10101010 +dd;[unknown];write;system_call;sys_write;vfs_write;fsnotify;__srcu_read_unlock 20202020 +dd;[unknown];write;system_call;sys_write;vfs_write;rw_verify_area 10101010 +dd;write;system_call;sys_write;__fdget_pos;__fdget;__fget_light 10101010 +dd;write;system_call;sys_write;vfs_write;fsnotify;__srcu_read_unlock 10101010 diff --git a/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-kernel.txt new file mode 100644 index 0000000..2ee761a --- /dev/null +++ b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-kernel.txt @@ -0,0 +1,9 @@ +dd;[unknown];[dd] 10101010 +dd;[unknown];read 10101010 +dd;[unknown];read;system_call_[k];__fdget_pos_[k] 10101010 +dd;[unknown];read;system_call_[k];sys_read_[k];vfs_read_[k];fsnotify_[k] 10101010 +dd;[unknown];write;system_call_[k];sys_write_[k] 10101010 +dd;[unknown];write;system_call_[k];sys_write_[k];vfs_write_[k];fsnotify_[k];__srcu_read_unlock_[k] 20202020 +dd;[unknown];write;system_call_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k] 10101010 +dd;write;system_call_[k];sys_write_[k];__fdget_pos_[k];__fdget_[k];__fget_light_[k] 10101010 +dd;write;system_call_[k];sys_write_[k];vfs_write_[k];fsnotify_[k];__srcu_read_unlock_[k] 10101010 diff --git a/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-pid.txt new file mode 100644 index 0000000..018705e --- /dev/null +++ b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-pid.txt @@ -0,0 +1,9 @@ +dd-?;[unknown];[dd] 10101010 +dd-?;[unknown];read 10101010 +dd-?;[unknown];read;system_call;__fdget_pos 10101010 +dd-?;[unknown];read;system_call;sys_read;vfs_read;fsnotify 10101010 +dd-?;[unknown];write;system_call;sys_write 10101010 +dd-?;[unknown];write;system_call;sys_write;vfs_write;fsnotify;__srcu_read_unlock 20202020 +dd-?;[unknown];write;system_call;sys_write;vfs_write;rw_verify_area 10101010 +dd-?;write;system_call;sys_write;__fdget_pos;__fdget;__fget_light 10101010 +dd-?;write;system_call;sys_write;vfs_write;fsnotify;__srcu_read_unlock 10101010 diff --git a/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-tid.txt new file mode 100644 index 0000000..ba0b648 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-dd-stacks-01-collapsed-tid.txt @@ -0,0 +1,9 @@ +dd-?/29776;[unknown];[dd] 10101010 +dd-?/29776;[unknown];read 10101010 +dd-?/29776;[unknown];read;system_call;__fdget_pos 10101010 +dd-?/29776;[unknown];read;system_call;sys_read;vfs_read;fsnotify 10101010 +dd-?/29776;[unknown];write;system_call;sys_write 10101010 +dd-?/29776;[unknown];write;system_call;sys_write;vfs_write;fsnotify;__srcu_read_unlock 20202020 +dd-?/29776;[unknown];write;system_call;sys_write;vfs_write;rw_verify_area 10101010 +dd-?/29776;write;system_call;sys_write;__fdget_pos;__fdget;__fget_light 10101010 +dd-?/29776;write;system_call;sys_write;vfs_write;fsnotify;__srcu_read_unlock 10101010 diff --git a/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-addrs.txt new file mode 100644 index 0000000..0cbe027 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-addrs.txt @@ -0,0 +1,2 @@ +func_ab;__libc_start_main;main;func_a 81 +func_ab;__libc_start_main;main;func_b 88 diff --git a/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-all.txt new file mode 100644 index 0000000..0cbe027 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-all.txt @@ -0,0 +1,2 @@ +func_ab;__libc_start_main;main;func_a 81 +func_ab;__libc_start_main;main;func_b 88 diff --git a/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-jit.txt new file mode 100644 index 0000000..0cbe027 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-jit.txt @@ -0,0 +1,2 @@ +func_ab;__libc_start_main;main;func_a 81 +func_ab;__libc_start_main;main;func_b 88 diff --git a/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-kernel.txt new file mode 100644 index 0000000..0cbe027 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-kernel.txt @@ -0,0 +1,2 @@ +func_ab;__libc_start_main;main;func_a 81 +func_ab;__libc_start_main;main;func_b 88 diff --git a/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-pid.txt new file mode 100644 index 0000000..efe39e0 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-pid.txt @@ -0,0 +1,2 @@ +func_ab-?;__libc_start_main;main;func_a 81 +func_ab-?;__libc_start_main;main;func_b 88 diff --git a/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-tid.txt new file mode 100644 index 0000000..eff1446 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-cmd-01-collapsed-tid.txt @@ -0,0 +1,2 @@ +func_ab-?/15285;__libc_start_main;main;func_a 81 +func_ab-?/15285;__libc_start_main;main;func_b 88 diff --git a/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-addrs.txt new file mode 100644 index 0000000..e8b35eb --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-addrs.txt @@ -0,0 +1,2 @@ +func_ab;__libc_start_main;main;func_a 112 +func_ab;__libc_start_main;main;func_b 116 diff --git a/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-all.txt new file mode 100644 index 0000000..e8b35eb --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-all.txt @@ -0,0 +1,2 @@ +func_ab;__libc_start_main;main;func_a 112 +func_ab;__libc_start_main;main;func_b 116 diff --git a/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-jit.txt new file mode 100644 index 0000000..e8b35eb --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-jit.txt @@ -0,0 +1,2 @@ +func_ab;__libc_start_main;main;func_a 112 +func_ab;__libc_start_main;main;func_b 116 diff --git a/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-kernel.txt new file mode 100644 index 0000000..e8b35eb --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-kernel.txt @@ -0,0 +1,2 @@ +func_ab;__libc_start_main;main;func_a 112 +func_ab;__libc_start_main;main;func_b 116 diff --git a/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-pid.txt new file mode 100644 index 0000000..7173128 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-pid.txt @@ -0,0 +1,2 @@ +func_ab-?;__libc_start_main;main;func_a 112 +func_ab-?;__libc_start_main;main;func_b 116 diff --git a/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-tid.txt new file mode 100644 index 0000000..da6a255 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-funcab-pid-01-collapsed-tid.txt @@ -0,0 +1,2 @@ +func_ab-?/15294;__libc_start_main;main;func_a 112 +func_ab-?/15294;__libc_start_main;main;func_b 116 diff --git a/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-addrs.txt new file mode 100644 index 0000000..9c49ff8 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-addrs.txt @@ -0,0 +1,114 @@ +iperf;[unknown <0>];[unknown <7f258c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg 1 +iperf;[unknown <0>];[unknown <7f258c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 1 +iperf;[unknown <0>];[unknown <7f258c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_event_data_recv 1 +iperf;[unknown <0>];[unknown <7f258c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 2 +iperf;[unknown <0>];[unknown <7f258c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_space_adjust 1 +iperf;[unknown <0>];[unknown <7f258c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;tcp_recvmsg 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;_raw_spin_lock_bh 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 2 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_rearm_rto;sk_reset_timer;mod_timer;check_events;xen_hypercall_xen_version 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;ipv4_dst_check 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;check_events;xen_hypercall_xen_version 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;netif_rx 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;kfree_skb_partial;skb_release_head_state 1 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 2 +iperf;[unknown <0>];[unknown <7f25900008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sockfd_lookup_light;__fget_light 1 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 7 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;__kfree_skb;skb_release_all;skb_release_data;put_page;put_compound_page;__put_compound_page;free_compound_page;check_events;xen_hypercall_xen_version 1 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 2 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;sock_def_readable 1 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action 1 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;__memmove 1 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;__kmalloc_reserve.isra.32 1 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;kfree_skbmem 1 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 3 +iperf;[unknown <0>];[unknown <7f25980008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;tcp_grow_window.isra.27 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 4 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;sock_put 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;__alloc_skb;__kmalloc_reserve.isra.32;kmalloc_slab 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;ktime_get_with_offset 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx_internal 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;tcp_event_data_recv 1 +iperf;[unknown <0>];[unknown <7f259c0008f0>];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sockfd_lookup_light;__fget_light 1 +iperf;[unknown <20000>];[iperf <2c5f>];__vdso_gettimeofday 1 +iperf;[unknown <20000>];[iperf <2d13>] 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;__fdget_pos 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;copy_from_iter 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;release_sock 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_push 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;__alloc_skb 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;__raw_callee_save___pv_queued_spin_unlock 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;copy_user_enhanced_fast_string 24 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current;__alloc_pages_nodemask;get_page_from_freelist;__zone_watermark_ok 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current;policy_zonelist 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;kmem_cache_alloc_node;_cond_resched;preempt_schedule_common;__schedule;check_events;xen_hypercall_xen_version 3 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;finish_wait;_raw_spin_lock_irqsave 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 18 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;sk_reset_timer 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv 2 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 8 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;_raw_spin_lock_irqsave 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;raw_local_deliver 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;net_rx_action 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;ktime_get_with_offset 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;sk_free 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;tcp_wfree 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;do_softirq 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_v4_send_check 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;ip_queue_xmit 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_schedule_loss_probe;sk_reset_timer;mod_timer;_raw_spin_lock_irqsave 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;__ip_local_out_sk 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;__sk_dst_check;ipv4_dst_check 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;check_events;xen_hypercall_xen_version 2 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;__inet_lookup_established 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;dst_release 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 2 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;sk_free 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;loopback_xmit 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;validate_xmit_skb.isra.102.part.103 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;skb_clone;__skb_clone 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;skb_clone;__skb_clone;__copy_skb_header 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;tcp_v4_md5_lookup 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_established_options;tcp_md5_do_lookup 1 +iperf;[unknown <20000>];[libpthread-2.19.so ];int_ret_from_sys_call;syscall_return_slowpath;prepare_exit_to_usermode;schedule;__schedule;check_events;xen_hypercall_xen_version 3 +iperf;__libc_recv 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;finish_wait 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 5 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;__inet_lookup_established 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;__alloc_skb 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 12 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_release_cb 1 +iperf;__pthread_disable_asynccancel 1 +iperf;check_events;xen_hypercall_xen_version 3 +iperf;xen_irq_enable_direct_end;check_events;xen_hypercall_xen_version 1 +multilog;_dl_sysdep_start;dl_main;_dl_relocate_object;page_fault;do_page_fault;check_events;xen_hypercall_xen_version 1 +run;[unknown <752f3a646e616d6d>];__GI___strncmp_ssse3;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;filemap_map_pages;do_set_pte;xen_hypercall_mmu_update 1 +run;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;load_script;search_binary_handler;load_elf_binary;setup_arg_pages;shift_arg_pages;tlb_finish_mmu;tlb_flush_mmu_free;free_pages_and_swap_cache;release_pages;free_hot_cold_page_list 1 diff --git a/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-all.txt new file mode 100644 index 0000000..513c668 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-all.txt @@ -0,0 +1,106 @@ +iperf;[unknown];[iperf] 1 +iperf;[unknown];[iperf];__vdso_gettimeofday_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];__fdget_pos_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];copy_from_iter_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];release_sock_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_push_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__alloc_skb_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__raw_callee_save___pv_queued_spin_unlock_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];copy_user_enhanced_fast_string_[k] 24 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_page_frag_refill_[k];skb_page_frag_refill_[k];alloc_pages_current_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_page_frag_refill_[k];skb_page_frag_refill_[k];alloc_pages_current_[k];__alloc_pages_nodemask_[k];get_page_from_freelist_[k];__zone_watermark_ok_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_page_frag_refill_[k];skb_page_frag_refill_[k];alloc_pages_current_[k];policy_zonelist_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];kmem_cache_alloc_node_[k];_cond_resched_[k];preempt_schedule_common_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 3 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_wait_memory_[k];finish_wait_[k];_raw_spin_lock_irqsave_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_wait_memory_[k];schedule_timeout_[k];schedule_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 18 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];sk_reset_timer_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k] 2 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_prequeue_[k];__wake_up_sync_key_[k];check_events_[k];xen_hypercall_xen_version_[k] 8 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_prequeue_[k];_raw_spin_lock_irqsave_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];raw_local_deliver_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];net_rx_action_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];ktime_get_with_offset_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];sk_free_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];tcp_wfree_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];do_softirq_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_v4_send_check_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];ip_queue_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_schedule_loss_probe_[k];sk_reset_timer_[k];mod_timer_[k];_raw_spin_lock_irqsave_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];__ip_local_out_sk_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];__sk_dst_check_[k];ipv4_dst_check_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];check_events_[k];xen_hypercall_xen_version_[k] 2 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];__inet_lookup_established_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];dst_release_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_prequeue_[k];__wake_up_sync_key_[k];check_events_[k];xen_hypercall_xen_version_[k] 2 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];sk_free_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];loopback_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];validate_xmit_skb.isra.102.part.103_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];skb_clone_[k];__skb_clone_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];skb_clone_[k];__skb_clone_[k];__copy_skb_header_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];tcp_v4_md5_lookup_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];tcp_established_options_[k];tcp_md5_do_lookup_[k] 1 +iperf;[unknown];[libpthread-2.19.so];int_ret_from_sys_call_[k];syscall_return_slowpath_[k];prepare_exit_to_usermode_[k];schedule_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 3 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];_raw_spin_lock_bh_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k];schedule_timeout_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k];schedule_timeout_[k];schedule_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 14 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];__kfree_skb_[k];skb_release_all_[k];skb_release_data_[k];put_page_[k];put_compound_page_[k];__put_compound_page_[k];free_compound_page_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_rearm_rto_[k];sk_reset_timer_[k];mod_timer_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_check_space_[k];sk_stream_write_space_[k];__wake_up_[k];check_events_[k];xen_hypercall_xen_version_[k] 3 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];ipv4_dst_check_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];sock_def_readable_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_event_data_recv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];__memmove_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];sock_put_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_check_space_[k];sk_stream_write_space_[k];__wake_up_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];__alloc_skb_[k];__kmalloc_reserve.isra.32_[k];kmalloc_slab_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];__kmalloc_reserve.isra.32_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];ktime_get_with_offset_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx_internal_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];netif_rx_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];kfree_skb_partial_[k];skb_release_head_state_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];kfree_skbmem_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];skb_copy_datagram_iter_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];skb_copy_datagram_iter_[k];copy_user_enhanced_fast_string_[k] 8 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_event_data_recv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_grow_window.isra.27_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_space_adjust_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];tcp_recvmsg_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sockfd_lookup_light_[k];__fget_light_[k] 2 +iperf;__libc_recv 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k];finish_wait_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k];schedule_timeout_[k];schedule_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 5 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];__inet_lookup_established_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];__alloc_skb_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];skb_copy_datagram_iter_[k];copy_user_enhanced_fast_string_[k] 12 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_release_cb_[k] 1 +iperf;__pthread_disable_asynccancel 1 +iperf;check_events_[k];xen_hypercall_xen_version_[k] 3 +iperf;xen_irq_enable_direct_end_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +multilog;_dl_sysdep_start;dl_main;_dl_relocate_object;page_fault_[k];do_page_fault_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +run;[unknown];__GI___strncmp_ssse3;page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];filemap_map_pages_[k];do_set_pte_[k];xen_hypercall_mmu_update_[k] 1 +run;__execve;return_from_execve_[k];sys_execve_[k];do_execveat_common.isra.31_[k];search_binary_handler_[k];load_script_[k];search_binary_handler_[k];load_elf_binary_[k];setup_arg_pages_[k];shift_arg_pages_[k];tlb_finish_mmu_[k];tlb_flush_mmu_free_[k];free_pages_and_swap_cache_[k];release_pages_[k];free_hot_cold_page_list_[k] 1 diff --git a/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-jit.txt new file mode 100644 index 0000000..c2743ec --- /dev/null +++ b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-jit.txt @@ -0,0 +1,106 @@ +iperf;[unknown];[iperf] 1 +iperf;[unknown];[iperf];__vdso_gettimeofday 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;__fdget_pos 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;copy_from_iter 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;release_sock 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_push 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;__alloc_skb 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;__raw_callee_save___pv_queued_spin_unlock 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;copy_user_enhanced_fast_string 24 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current;__alloc_pages_nodemask;get_page_from_freelist;__zone_watermark_ok 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current;policy_zonelist 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;kmem_cache_alloc_node;_cond_resched;preempt_schedule_common;__schedule;check_events;xen_hypercall_xen_version 3 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;finish_wait;_raw_spin_lock_irqsave 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 18 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;sk_reset_timer 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv 2 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 8 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;_raw_spin_lock_irqsave 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;raw_local_deliver 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;net_rx_action 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;ktime_get_with_offset 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;sk_free 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;tcp_wfree 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;do_softirq 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_v4_send_check 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;ip_queue_xmit 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_schedule_loss_probe;sk_reset_timer;mod_timer;_raw_spin_lock_irqsave 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;__ip_local_out_sk 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;__sk_dst_check;ipv4_dst_check 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;check_events;xen_hypercall_xen_version 2 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;__inet_lookup_established 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;dst_release 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 2 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;sk_free 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;loopback_xmit 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;validate_xmit_skb.isra.102.part.103 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;skb_clone;__skb_clone 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;skb_clone;__skb_clone;__copy_skb_header 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;tcp_v4_md5_lookup 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_established_options;tcp_md5_do_lookup 1 +iperf;[unknown];[libpthread-2.19.so];int_ret_from_sys_call;syscall_return_slowpath;prepare_exit_to_usermode;schedule;__schedule;check_events;xen_hypercall_xen_version 3 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;_raw_spin_lock_bh 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 14 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;__kfree_skb;skb_release_all;skb_release_data;put_page;put_compound_page;__put_compound_page;free_compound_page;check_events;xen_hypercall_xen_version 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_rearm_rto;sk_reset_timer;mod_timer;check_events;xen_hypercall_xen_version 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 3 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;ipv4_dst_check 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;sock_def_readable 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_event_data_recv 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;check_events;xen_hypercall_xen_version 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;__memmove 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;sock_put 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;__alloc_skb;__kmalloc_reserve.isra.32;kmalloc_slab 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;__kmalloc_reserve.isra.32 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;ktime_get_with_offset 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx_internal 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;netif_rx 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;kfree_skb_partial;skb_release_head_state 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;kfree_skbmem 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 8 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;tcp_event_data_recv 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;tcp_grow_window.isra.27 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_space_adjust 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;tcp_recvmsg 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sockfd_lookup_light;__fget_light 2 +iperf;__libc_recv 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;finish_wait 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 5 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;__inet_lookup_established 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;__alloc_skb 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 12 +iperf;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_release_cb 1 +iperf;__pthread_disable_asynccancel 1 +iperf;check_events;xen_hypercall_xen_version 3 +iperf;xen_irq_enable_direct_end;check_events;xen_hypercall_xen_version 1 +multilog;_dl_sysdep_start;dl_main;_dl_relocate_object;page_fault;do_page_fault;check_events;xen_hypercall_xen_version 1 +run;[unknown];__GI___strncmp_ssse3;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;filemap_map_pages;do_set_pte;xen_hypercall_mmu_update 1 +run;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;load_script;search_binary_handler;load_elf_binary;setup_arg_pages;shift_arg_pages;tlb_finish_mmu;tlb_flush_mmu_free;free_pages_and_swap_cache;release_pages;free_hot_cold_page_list 1 diff --git a/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-kernel.txt new file mode 100644 index 0000000..513c668 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-kernel.txt @@ -0,0 +1,106 @@ +iperf;[unknown];[iperf] 1 +iperf;[unknown];[iperf];__vdso_gettimeofday_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];__fdget_pos_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];copy_from_iter_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];release_sock_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_push_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__alloc_skb_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__raw_callee_save___pv_queued_spin_unlock_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];copy_user_enhanced_fast_string_[k] 24 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_page_frag_refill_[k];skb_page_frag_refill_[k];alloc_pages_current_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_page_frag_refill_[k];skb_page_frag_refill_[k];alloc_pages_current_[k];__alloc_pages_nodemask_[k];get_page_from_freelist_[k];__zone_watermark_ok_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_page_frag_refill_[k];skb_page_frag_refill_[k];alloc_pages_current_[k];policy_zonelist_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];kmem_cache_alloc_node_[k];_cond_resched_[k];preempt_schedule_common_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 3 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_wait_memory_[k];finish_wait_[k];_raw_spin_lock_irqsave_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_wait_memory_[k];schedule_timeout_[k];schedule_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 18 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];sk_reset_timer_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k] 2 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_prequeue_[k];__wake_up_sync_key_[k];check_events_[k];xen_hypercall_xen_version_[k] 8 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_prequeue_[k];_raw_spin_lock_irqsave_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];raw_local_deliver_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];net_rx_action_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];ktime_get_with_offset_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];sk_free_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];tcp_wfree_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];do_softirq_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_v4_send_check_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];ip_queue_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_schedule_loss_probe_[k];sk_reset_timer_[k];mod_timer_[k];_raw_spin_lock_irqsave_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];__ip_local_out_sk_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];__sk_dst_check_[k];ipv4_dst_check_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];check_events_[k];xen_hypercall_xen_version_[k] 2 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];__inet_lookup_established_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];dst_release_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_prequeue_[k];__wake_up_sync_key_[k];check_events_[k];xen_hypercall_xen_version_[k] 2 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];sk_free_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];loopback_xmit_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];validate_xmit_skb.isra.102.part.103_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];skb_clone_[k];__skb_clone_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];skb_clone_[k];__skb_clone_[k];__copy_skb_header_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_push_one_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];tcp_v4_md5_lookup_[k] 1 +iperf;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath_[k];sys_write_[k];vfs_write_[k];__vfs_write_[k];sock_write_iter_[k];sock_sendmsg_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];tcp_established_options_[k];tcp_md5_do_lookup_[k] 1 +iperf;[unknown];[libpthread-2.19.so];int_ret_from_sys_call_[k];syscall_return_slowpath_[k];prepare_exit_to_usermode_[k];schedule_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 3 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];_raw_spin_lock_bh_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k];schedule_timeout_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k];schedule_timeout_[k];schedule_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 14 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];__kfree_skb_[k];skb_release_all_[k];skb_release_data_[k];put_page_[k];put_compound_page_[k];__put_compound_page_[k];free_compound_page_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_rearm_rto_[k];sk_reset_timer_[k];mod_timer_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_check_space_[k];sk_stream_write_space_[k];__wake_up_[k];check_events_[k];xen_hypercall_xen_version_[k] 3 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];ipv4_dst_check_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];sock_def_readable_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_event_data_recv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];__memmove_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];sock_put_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_check_space_[k];sk_stream_write_space_[k];__wake_up_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];__alloc_skb_[k];__kmalloc_reserve.isra.32_[k];kmalloc_slab_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];__kmalloc_reserve.isra.32_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];ktime_get_with_offset_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx_internal_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k];netif_rx_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];kfree_skb_partial_[k];skb_release_head_state_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];kfree_skbmem_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];skb_copy_datagram_iter_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];skb_copy_datagram_iter_[k];copy_user_enhanced_fast_string_[k] 8 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_event_data_recv_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_grow_window.isra.27_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_space_adjust_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];tcp_recvmsg_[k] 1 +iperf;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sockfd_lookup_light_[k];__fget_light_[k] 2 +iperf;__libc_recv 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k];finish_wait_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];sk_wait_data_[k];schedule_timeout_[k];schedule_[k];__schedule_[k];check_events_[k];xen_hypercall_xen_version_[k] 5 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];__inet_lookup_established_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];__local_bh_enable_ip_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];__alloc_skb_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];__tcp_ack_snd_check_[k];tcp_send_ack_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_sk_[k];ip_output_[k];ip_finish_output_[k];ip_finish_output2_[k];dev_queue_xmit_sk_[k];__dev_queue_xmit_[k];dev_hard_start_xmit_[k] 1 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_prequeue_process_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];skb_copy_datagram_iter_[k];copy_user_enhanced_fast_string_[k] 12 +iperf;__libc_recv;entry_SYSCALL_64_fastpath_[k];sys_recvfrom_[k];SYSC_recvfrom_[k];sock_recvmsg_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_release_cb_[k] 1 +iperf;__pthread_disable_asynccancel 1 +iperf;check_events_[k];xen_hypercall_xen_version_[k] 3 +iperf;xen_irq_enable_direct_end_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +multilog;_dl_sysdep_start;dl_main;_dl_relocate_object;page_fault_[k];do_page_fault_[k];check_events_[k];xen_hypercall_xen_version_[k] 1 +run;[unknown];__GI___strncmp_ssse3;page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];filemap_map_pages_[k];do_set_pte_[k];xen_hypercall_mmu_update_[k] 1 +run;__execve;return_from_execve_[k];sys_execve_[k];do_execveat_common.isra.31_[k];search_binary_handler_[k];load_script_[k];search_binary_handler_[k];load_elf_binary_[k];setup_arg_pages_[k];shift_arg_pages_[k];tlb_finish_mmu_[k];tlb_flush_mmu_free_[k];free_pages_and_swap_cache_[k];release_pages_[k];free_hot_cold_page_list_[k] 1 diff --git a/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-pid.txt new file mode 100644 index 0000000..05248e3 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-pid.txt @@ -0,0 +1,106 @@ +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;_raw_spin_lock_bh 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 14 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;__kfree_skb;skb_release_all;skb_release_data;put_page;put_compound_page;__put_compound_page;free_compound_page;check_events;xen_hypercall_xen_version 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_rearm_rto;sk_reset_timer;mod_timer;check_events;xen_hypercall_xen_version 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 3 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;ipv4_dst_check 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;sock_def_readable 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_event_data_recv 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;check_events;xen_hypercall_xen_version 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;__memmove 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;sock_put 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;__alloc_skb;__kmalloc_reserve.isra.32;kmalloc_slab 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;__kmalloc_reserve.isra.32 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;ktime_get_with_offset 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx_internal 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;netif_rx 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;kfree_skb_partial;skb_release_head_state 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;kfree_skbmem 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 8 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;tcp_event_data_recv 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;tcp_grow_window.isra.27 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_space_adjust 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;tcp_recvmsg 1 +iperf-27409;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sockfd_lookup_light;__fget_light 2 +iperf-27409;__libc_recv 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;finish_wait 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 5 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;__inet_lookup_established 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;__alloc_skb 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit 1 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 12 +iperf-27409;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_release_cb 1 +iperf-27409;__pthread_disable_asynccancel 1 +iperf-27409;check_events;xen_hypercall_xen_version 3 +iperf-28735;[unknown];[iperf] 1 +iperf-28735;[unknown];[iperf];__vdso_gettimeofday 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;__fdget_pos 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;copy_from_iter 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;release_sock 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_push 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;__alloc_skb 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;__raw_callee_save___pv_queued_spin_unlock 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;copy_user_enhanced_fast_string 24 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current;__alloc_pages_nodemask;get_page_from_freelist;__zone_watermark_ok 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current;policy_zonelist 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;kmem_cache_alloc_node;_cond_resched;preempt_schedule_common;__schedule;check_events;xen_hypercall_xen_version 3 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;finish_wait;_raw_spin_lock_irqsave 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 18 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;sk_reset_timer 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv 2 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 8 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;_raw_spin_lock_irqsave 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;raw_local_deliver 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;net_rx_action 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;ktime_get_with_offset 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;sk_free 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;tcp_wfree 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;do_softirq 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_v4_send_check 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;ip_queue_xmit 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_schedule_loss_probe;sk_reset_timer;mod_timer;_raw_spin_lock_irqsave 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;__ip_local_out_sk 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;__sk_dst_check;ipv4_dst_check 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;check_events;xen_hypercall_xen_version 2 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;__inet_lookup_established 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;dst_release 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 2 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;sk_free 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;loopback_xmit 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;validate_xmit_skb.isra.102.part.103 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;skb_clone;__skb_clone 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;skb_clone;__skb_clone;__copy_skb_header 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;tcp_v4_md5_lookup 1 +iperf-28735;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_established_options;tcp_md5_do_lookup 1 +iperf-28735;[unknown];[libpthread-2.19.so];int_ret_from_sys_call;syscall_return_slowpath;prepare_exit_to_usermode;schedule;__schedule;check_events;xen_hypercall_xen_version 3 +iperf-28735;xen_irq_enable_direct_end;check_events;xen_hypercall_xen_version 1 +multilog-28797;_dl_sysdep_start;dl_main;_dl_relocate_object;page_fault;do_page_fault;check_events;xen_hypercall_xen_version 1 +run-28796;[unknown];__GI___strncmp_ssse3;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;filemap_map_pages;do_set_pte;xen_hypercall_mmu_update 1 +run-28797;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;load_script;search_binary_handler;load_elf_binary;setup_arg_pages;shift_arg_pages;tlb_finish_mmu;tlb_flush_mmu_free;free_pages_and_swap_cache;release_pages;free_hot_cold_page_list 1 diff --git a/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-tid.txt new file mode 100644 index 0000000..d44980e --- /dev/null +++ b/tools/FlameGraph/test/results/perf-iperf-stacks-pidtid-01-collapsed-tid.txt @@ -0,0 +1,134 @@ +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 7 +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;__kfree_skb;skb_release_all;skb_release_data;put_page;put_compound_page;__put_compound_page;free_compound_page;check_events;xen_hypercall_xen_version 1 +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 2 +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;sock_def_readable 1 +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action 1 +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;__memmove 1 +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;__kmalloc_reserve.isra.32 1 +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;kfree_skbmem 1 +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 3 +iperf-27409/28741;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;tcp_grow_window.isra.27 1 +iperf-27409/28741;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 1 +iperf-27409/28741;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv 1 +iperf-27409/28741;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;__alloc_skb 1 +iperf-27409/28741;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 3 +iperf-27409/28741;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_release_cb 1 +iperf-27409/28741;check_events;xen_hypercall_xen_version 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;_raw_spin_lock_bh 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 2 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_rearm_rto;sk_reset_timer;mod_timer;check_events;xen_hypercall_xen_version 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;ipv4_dst_check 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;check_events;xen_hypercall_xen_version 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;netif_rx 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;kfree_skb_partial;skb_release_head_state 1 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 2 +iperf-27409/28742;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sockfd_lookup_light;__fget_light 1 +iperf-27409/28742;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;finish_wait 1 +iperf-27409/28742;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 1 +iperf-27409/28742;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;__inet_lookup_established 1 +iperf-27409/28742;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb 1 +iperf-27409/28742;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 1 +iperf-27409/28742;check_events;xen_hypercall_xen_version 1 +iperf-27409/28743;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg 1 +iperf-27409/28743;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 1 +iperf-27409/28743;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_event_data_recv 1 +iperf-27409/28743;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 2 +iperf-27409/28743;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_space_adjust 1 +iperf-27409/28743;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;tcp_recvmsg 1 +iperf-27409/28743;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 1 +iperf-27409/28743;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit 1 +iperf-27409/28743;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit 1 +iperf-27409/28743;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 6 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 4 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;sock_put 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_check_space;sk_stream_write_space;__wake_up;check_events;xen_hypercall_xen_version 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;__alloc_skb;__kmalloc_reserve.isra.32;kmalloc_slab 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;ktime_get_with_offset 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;__tcp_ack_snd_check;tcp_send_ack;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx_internal 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;tcp_event_data_recv 1 +iperf-27409/28744;[unknown];[unknown];__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sockfd_lookup_light;__fget_light 1 +iperf-27409/28744;__libc_recv 1 +iperf-27409/28744;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data 1 +iperf-27409/28744;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;sk_wait_data;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 2 +iperf-27409/28744;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish 1 +iperf-27409/28744;__libc_recv;entry_SYSCALL_64_fastpath;sys_recvfrom;SYSC_recvfrom;sock_recvmsg;inet_recvmsg;tcp_recvmsg;tcp_prequeue_process;tcp_v4_do_rcv;tcp_rcv_established;skb_copy_datagram_iter;copy_user_enhanced_fast_string 2 +iperf-27409/28744;__pthread_disable_asynccancel 1 +iperf-27409/28744;check_events;xen_hypercall_xen_version 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;__fdget_pos 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;copy_from_iter 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;copy_user_enhanced_fast_string 8 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 4 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;_raw_spin_lock_irqsave 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;tcp_wfree 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;do_softirq 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;check_events;xen_hypercall_xen_version 2 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;__inet_lookup_established 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;skb_clone;__skb_clone 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;skb_clone;__skb_clone;__copy_skb_header 1 +iperf-28735/28736;[unknown];[libpthread-2.19.so];int_ret_from_sys_call;syscall_return_slowpath;prepare_exit_to_usermode;schedule;__schedule;check_events;xen_hypercall_xen_version 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;release_sock 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_push 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;copy_user_enhanced_fast_string 7 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current;policy_zonelist 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;kmem_cache_alloc_node;_cond_resched;preempt_schedule_common;__schedule;check_events;xen_hypercall_xen_version 2 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;finish_wait;_raw_spin_lock_irqsave 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 4 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;sk_reset_timer 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 3 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;ip_queue_xmit 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;__ip_local_out_sk 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;__sk_dst_check;ipv4_dst_check 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;dst_release 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 2 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;sk_free 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_established_options;tcp_md5_do_lookup 1 +iperf-28735/28737;[unknown];[libpthread-2.19.so];int_ret_from_sys_call;syscall_return_slowpath;prepare_exit_to_usermode;schedule;__schedule;check_events;xen_hypercall_xen_version 1 +iperf-28735/28737;xen_irq_enable_direct_end;check_events;xen_hypercall_xen_version 1 +iperf-28735/28738;[unknown];[iperf] 1 +iperf-28735/28738;[unknown];[iperf];__vdso_gettimeofday 1 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;__alloc_skb 1 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;__raw_callee_save___pv_queued_spin_unlock 1 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;copy_user_enhanced_fast_string 3 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;kmem_cache_alloc_node;_cond_resched;preempt_schedule_common;__schedule;check_events;xen_hypercall_xen_version 1 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 6 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;net_rx_action 1 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;ktime_get_with_offset 1 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;sk_free 1 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb 1 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;loopback_xmit 1 +iperf-28735/28738;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;dev_queue_xmit_sk;__dev_queue_xmit;validate_xmit_skb.isra.102.part.103 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;copy_user_enhanced_fast_string 6 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_page_frag_refill;skb_page_frag_refill;alloc_pages_current;__alloc_pages_nodemask;get_page_from_freelist;__zone_watermark_ok 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;sk_stream_wait_memory;schedule_timeout;schedule;__schedule;check_events;xen_hypercall_xen_version 4 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_prequeue;__wake_up_sync_key;check_events;xen_hypercall_xen_version 4 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2;__local_bh_enable_ip;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;raw_local_deliver 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push;__tcp_push_pending_frames;tcp_write_xmit;tcp_v4_send_check 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_schedule_loss_probe;sk_reset_timer;mod_timer;_raw_spin_lock_irqsave 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out_sk;ip_output;ip_finish_output;ip_finish_output2 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];entry_SYSCALL_64_fastpath;sys_write;vfs_write;__vfs_write;sock_write_iter;sock_sendmsg;inet_sendmsg;tcp_sendmsg;tcp_push_one;tcp_write_xmit;tcp_transmit_skb;tcp_v4_md5_lookup 1 +iperf-28735/28739;[unknown];[libpthread-2.19.so];int_ret_from_sys_call;syscall_return_slowpath;prepare_exit_to_usermode;schedule;__schedule;check_events;xen_hypercall_xen_version 1 +multilog-28797/28797;_dl_sysdep_start;dl_main;_dl_relocate_object;page_fault;do_page_fault;check_events;xen_hypercall_xen_version 1 +run-28796/28796;[unknown];__GI___strncmp_ssse3;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;filemap_map_pages;do_set_pte;xen_hypercall_mmu_update 1 +run-28797/28797;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;load_script;search_binary_handler;load_elf_binary;setup_arg_pages;shift_arg_pages;tlb_finish_mmu;tlb_flush_mmu_free;free_pages_and_swap_cache;release_pages;free_hot_cold_page_list 1 diff --git a/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-addrs.txt new file mode 100644 index 0000000..f5e6901 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-addrs.txt @@ -0,0 +1,12 @@ +java;_int_malloc 2 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;java/lang/Thread:::run;Interpreter;java/util/concurrent/ThreadPoolExecutor$Worker:::run;java/util/concurrent/ThreadPoolExecutor:::runWorker;org/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::run;org/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::doRun;org/apache/coyote/AbstractProtocol$AbstractConnectionHandler:::process;org/apache/coyote/http11/AbstractHttp11Processor:::process;org/apache/catalina/connector/CoyoteAdapter:::service;org/apache/coyote/http11/AbstractHttp11Processor:::action;org/apache/tomcat/jni/Socket:::sendbb 1 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;net/spy/memcached/EVCacheConnection:::run;net/spy/memcached/MemcachedConnection:::handleIO;net/spy/memcached/MemcachedConnection:::handleIO;net/spy/memcached/MemcachedConnection:::handleReads;net/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer;net/spy/memcached/protocol/binary/OperationImpl:::finishedPayload;net/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload;net/spy/memcached/transcoders/TranscodeService$1:::call;XXX::XXX;java/util/zip/Inflater:::inflateBytes;Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 18 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;net/spy/memcached/EVCacheConnection:::run;net/spy/memcached/MemcachedConnection:::handleIO;net/spy/memcached/MemcachedConnection:::handleIO;net/spy/memcached/MemcachedConnection:::handleReads;net/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer;net/spy/memcached/protocol/binary/OperationImpl:::finishedPayload;net/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload;net/spy/memcached/transcoders/TranscodeService$1:::call;com/XXX::XXX;java/util/zip/Inflater:::inflateBytes;Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 1 +perf;__libc_start_main;main;run_builtin;cmd_record 40 +perf;do_lookup_x 27 +sleep;[unknown <6873756c66660036>];memcmp 24 +sleep;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;copy_user_enhanced_fast_string 1 +sleep;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;load_elf_binary;padzero;clear_user;__clear_user 2 +sleep;_dl_start_user;_dl_start 9 +sleep;_start 3 +sleep;handle_intel 72 diff --git a/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-all.txt new file mode 100644 index 0000000..bf4e9b7 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-all.txt @@ -0,0 +1,12 @@ +java;_int_malloc 2 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub_[j];java/lang/Thread:::run_[j];Interpreter_[j];java/util/concurrent/ThreadPoolExecutor$Worker:::run_[j];java/util/concurrent/ThreadPoolExecutor:::runWorker_[j];org/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::run_[j];org/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::doRun_[j];org/apache/coyote/AbstractProtocol$AbstractConnectionHandler:::process_[j];org/apache/coyote/http11/AbstractHttp11Processor:::process_[j];org/apache/catalina/connector/CoyoteAdapter:::service_[j];org/apache/coyote/http11/AbstractHttp11Processor:::action_[j];org/apache/tomcat/jni/Socket:::sendbb_[j] 1 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub_[j];net/spy/memcached/EVCacheConnection:::run_[j];net/spy/memcached/MemcachedConnection:::handleIO_[j];net/spy/memcached/MemcachedConnection:::handleIO_[j];net/spy/memcached/MemcachedConnection:::handleReads_[j];net/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer_[j];net/spy/memcached/protocol/binary/OperationImpl:::finishedPayload_[j];net/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload_[j];net/spy/memcached/transcoders/TranscodeService$1:::call_[j];XXX::XXX_[j];java/util/zip/Inflater:::inflateBytes_[j];Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 18 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub_[j];net/spy/memcached/EVCacheConnection:::run_[j];net/spy/memcached/MemcachedConnection:::handleIO_[j];net/spy/memcached/MemcachedConnection:::handleIO_[j];net/spy/memcached/MemcachedConnection:::handleReads_[j];net/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer_[j];net/spy/memcached/protocol/binary/OperationImpl:::finishedPayload_[j];net/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload_[j];net/spy/memcached/transcoders/TranscodeService$1:::call_[j];com/XXX::XXX_[j];java/util/zip/Inflater:::inflateBytes_[j];Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 1 +perf;__libc_start_main;main;run_builtin;cmd_record 40 +perf;do_lookup_x 27 +sleep;[unknown];memcmp 24 +sleep;__execve;return_from_execve_[k];sys_execve_[k];do_execveat_common.isra.31_[k];search_binary_handler_[k];copy_user_enhanced_fast_string_[k] 1 +sleep;__execve;return_from_execve_[k];sys_execve_[k];do_execveat_common.isra.31_[k];search_binary_handler_[k];load_elf_binary_[k];padzero_[k];clear_user_[k];__clear_user_[k] 2 +sleep;_dl_start_user;_dl_start 9 +sleep;_start 3 +sleep;handle_intel 72 diff --git a/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-jit.txt new file mode 100644 index 0000000..688484f --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-jit.txt @@ -0,0 +1,12 @@ +java;_int_malloc 2 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub_[j];java/lang/Thread:::run_[j];Interpreter_[j];java/util/concurrent/ThreadPoolExecutor$Worker:::run_[j];java/util/concurrent/ThreadPoolExecutor:::runWorker_[j];org/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::run_[j];org/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::doRun_[j];org/apache/coyote/AbstractProtocol$AbstractConnectionHandler:::process_[j];org/apache/coyote/http11/AbstractHttp11Processor:::process_[j];org/apache/catalina/connector/CoyoteAdapter:::service_[j];org/apache/coyote/http11/AbstractHttp11Processor:::action_[j];org/apache/tomcat/jni/Socket:::sendbb_[j] 1 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub_[j];net/spy/memcached/EVCacheConnection:::run_[j];net/spy/memcached/MemcachedConnection:::handleIO_[j];net/spy/memcached/MemcachedConnection:::handleIO_[j];net/spy/memcached/MemcachedConnection:::handleReads_[j];net/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer_[j];net/spy/memcached/protocol/binary/OperationImpl:::finishedPayload_[j];net/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload_[j];net/spy/memcached/transcoders/TranscodeService$1:::call_[j];XXX::XXX_[j];java/util/zip/Inflater:::inflateBytes_[j];Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 18 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub_[j];net/spy/memcached/EVCacheConnection:::run_[j];net/spy/memcached/MemcachedConnection:::handleIO_[j];net/spy/memcached/MemcachedConnection:::handleIO_[j];net/spy/memcached/MemcachedConnection:::handleReads_[j];net/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer_[j];net/spy/memcached/protocol/binary/OperationImpl:::finishedPayload_[j];net/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload_[j];net/spy/memcached/transcoders/TranscodeService$1:::call_[j];com/XXX::XXX_[j];java/util/zip/Inflater:::inflateBytes_[j];Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 1 +perf;__libc_start_main;main;run_builtin;cmd_record 40 +perf;do_lookup_x 27 +sleep;[unknown];memcmp 24 +sleep;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;copy_user_enhanced_fast_string 1 +sleep;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;load_elf_binary;padzero;clear_user;__clear_user 2 +sleep;_dl_start_user;_dl_start 9 +sleep;_start 3 +sleep;handle_intel 72 diff --git a/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-kernel.txt new file mode 100644 index 0000000..ffa7f10 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-kernel.txt @@ -0,0 +1,12 @@ +java;_int_malloc 2 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;java/lang/Thread:::run;Interpreter;java/util/concurrent/ThreadPoolExecutor$Worker:::run;java/util/concurrent/ThreadPoolExecutor:::runWorker;org/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::run;org/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::doRun;org/apache/coyote/AbstractProtocol$AbstractConnectionHandler:::process;org/apache/coyote/http11/AbstractHttp11Processor:::process;org/apache/catalina/connector/CoyoteAdapter:::service;org/apache/coyote/http11/AbstractHttp11Processor:::action;org/apache/tomcat/jni/Socket:::sendbb 1 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;net/spy/memcached/EVCacheConnection:::run;net/spy/memcached/MemcachedConnection:::handleIO;net/spy/memcached/MemcachedConnection:::handleIO;net/spy/memcached/MemcachedConnection:::handleReads;net/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer;net/spy/memcached/protocol/binary/OperationImpl:::finishedPayload;net/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload;net/spy/memcached/transcoders/TranscodeService$1:::call;XXX::XXX;java/util/zip/Inflater:::inflateBytes;Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 18 +java;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;net/spy/memcached/EVCacheConnection:::run;net/spy/memcached/MemcachedConnection:::handleIO;net/spy/memcached/MemcachedConnection:::handleIO;net/spy/memcached/MemcachedConnection:::handleReads;net/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer;net/spy/memcached/protocol/binary/OperationImpl:::finishedPayload;net/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload;net/spy/memcached/transcoders/TranscodeService$1:::call;com/XXX::XXX;java/util/zip/Inflater:::inflateBytes;Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 1 +perf;__libc_start_main;main;run_builtin;cmd_record 40 +perf;do_lookup_x 27 +sleep;[unknown];memcmp 24 +sleep;__execve;return_from_execve_[k];sys_execve_[k];do_execveat_common.isra.31_[k];search_binary_handler_[k];copy_user_enhanced_fast_string_[k] 1 +sleep;__execve;return_from_execve_[k];sys_execve_[k];do_execveat_common.isra.31_[k];search_binary_handler_[k];load_elf_binary_[k];padzero_[k];clear_user_[k];__clear_user_[k] 2 +sleep;_dl_start_user;_dl_start 9 +sleep;_start 3 +sleep;handle_intel 72 diff --git a/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-pid.txt new file mode 100644 index 0000000..837a680 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-pid.txt @@ -0,0 +1,12 @@ +java-?;_int_malloc 2 +java-?;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;Ljava/lang/Thread:::run;Interpreter;Ljava/util/concurrent/ThreadPoolExecutor$Worker:::run;Ljava/util/concurrent/ThreadPoolExecutor:::runWorker;Lorg/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::run;Lorg/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::doRun;Lorg/apache/coyote/AbstractProtocol$AbstractConnectionHandler:::process;Lorg/apache/coyote/http11/AbstractHttp11Processor:::process;Lorg/apache/catalina/connector/CoyoteAdapter:::service;Lorg/apache/coyote/http11/AbstractHttp11Processor:::action;Lorg/apache/tomcat/jni/Socket:::sendbb 1 +java-?;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;Lnet/spy/memcached/EVCacheConnection:::run;Lnet/spy/memcached/MemcachedConnection:::handleIO;Lnet/spy/memcached/MemcachedConnection:::handleIO;Lnet/spy/memcached/MemcachedConnection:::handleReads;Lnet/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer;Lnet/spy/memcached/protocol/binary/OperationImpl:::finishedPayload;Lnet/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload;Lnet/spy/memcached/transcoders/TranscodeService$1:::call;Lcom/XXX::XXX;Ljava/util/zip/Inflater:::inflateBytes;Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 1 +java-?;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;Lnet/spy/memcached/EVCacheConnection:::run;Lnet/spy/memcached/MemcachedConnection:::handleIO;Lnet/spy/memcached/MemcachedConnection:::handleIO;Lnet/spy/memcached/MemcachedConnection:::handleReads;Lnet/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer;Lnet/spy/memcached/protocol/binary/OperationImpl:::finishedPayload;Lnet/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload;Lnet/spy/memcached/transcoders/TranscodeService$1:::call;XXX::XXX;Ljava/util/zip/Inflater:::inflateBytes;Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 18 +perf-?;__libc_start_main;main;run_builtin;cmd_record 40 +perf-?;do_lookup_x 27 +sleep-?;[unknown];memcmp 24 +sleep-?;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;copy_user_enhanced_fast_string 1 +sleep-?;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;load_elf_binary;padzero;clear_user;__clear_user 2 +sleep-?;_dl_start_user;_dl_start 9 +sleep-?;_start 3 +sleep-?;handle_intel 72 diff --git a/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-tid.txt new file mode 100644 index 0000000..ef37499 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-faults-01-collapsed-tid.txt @@ -0,0 +1,12 @@ +java-?/43869;_int_malloc 2 +java-?/43869;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;Lnet/spy/memcached/EVCacheConnection:::run;Lnet/spy/memcached/MemcachedConnection:::handleIO;Lnet/spy/memcached/MemcachedConnection:::handleIO;Lnet/spy/memcached/MemcachedConnection:::handleReads;Lnet/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer;Lnet/spy/memcached/protocol/binary/OperationImpl:::finishedPayload;Lnet/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload;Lnet/spy/memcached/transcoders/TranscodeService$1:::call;Lcom/XXX::XXX;Ljava/util/zip/Inflater:::inflateBytes;Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 1 +java-?/43869;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;Lnet/spy/memcached/EVCacheConnection:::run;Lnet/spy/memcached/MemcachedConnection:::handleIO;Lnet/spy/memcached/MemcachedConnection:::handleIO;Lnet/spy/memcached/MemcachedConnection:::handleReads;Lnet/spy/memcached/protocol/binary/OperationImpl:::readFromBuffer;Lnet/spy/memcached/protocol/binary/OperationImpl:::finishedPayload;Lnet/spy/memcached/protocol/binary/GetOperationImpl:::decodePayload;Lnet/spy/memcached/transcoders/TranscodeService$1:::call;XXX::XXX;Ljava/util/zip/Inflater:::inflateBytes;Java_java_util_zip_Inflater_inflateBytes;inflate;__memmove_ssse3_back 18 +java-?/44406;start_thread;_ZL10java_startP6Thread;_ZN10JavaThread3runEv;_ZN10JavaThread17thread_main_innerEv;_ZL12thread_entryP10JavaThreadP6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue6Handle11KlassHandleP6SymbolS5_P6Thread;_ZN9JavaCalls12call_virtualEP9JavaValue11KlassHandleP6SymbolS4_P17JavaCallArgumentsP6Thread;_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread;call_stub;Ljava/lang/Thread:::run;Interpreter;Ljava/util/concurrent/ThreadPoolExecutor$Worker:::run;Ljava/util/concurrent/ThreadPoolExecutor:::runWorker;Lorg/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::run;Lorg/apache/tomcat/util/net/AprEndpoint$SocketProcessor:::doRun;Lorg/apache/coyote/AbstractProtocol$AbstractConnectionHandler:::process;Lorg/apache/coyote/http11/AbstractHttp11Processor:::process;Lorg/apache/catalina/connector/CoyoteAdapter:::service;Lorg/apache/coyote/http11/AbstractHttp11Processor:::action;Lorg/apache/tomcat/jni/Socket:::sendbb 1 +perf-?/47118;__libc_start_main;main;run_builtin;cmd_record 40 +perf-?/47119;do_lookup_x 27 +sleep-?/47119;[unknown];memcmp 24 +sleep-?/47119;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;copy_user_enhanced_fast_string 1 +sleep-?/47119;__execve;return_from_execve;sys_execve;do_execveat_common.isra.31;search_binary_handler;load_elf_binary;padzero;clear_user;__clear_user 2 +sleep-?/47119;_dl_start_user;_dl_start 9 +sleep-?/47119;_start 3 +sleep-?/47119;handle_intel 72 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-addrs.txt new file mode 100644 index 0000000..7d96c1f --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-addrs.txt @@ -0,0 +1,33 @@ +ab;[unknown <7f26cab4c0b0>];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +ab;[unknown <7f26cabd51d0>];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;local_bh_enable;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;__kfree_skb 1 +ab;[unknown <7f26cabe2590>];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_reserve.isra.26 1 +ab;[unknown <7f26cabf0e30>];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_v4_md5_lookup 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/buffer/AbstractByteBuf:.writeBytes;sun/nio/ch/SocketChannelImpl:.read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/buffer/AbstractByteBuf:.writeBytes;sun/nio/ch/SocketChannelImpl:.read;java/lang/Thread:.blockedOn 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/WrapFactory:.wrap;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_3;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_21;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_31:.call;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:.call;org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:._c_anonymous_1;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;java/lang/reflect/Method:.invoke 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_21;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_2:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;java/lang/reflect/Method:.invoke;io/netty/handler/codec/http/DefaultHttpHeaders:.add0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_21;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamAndVarCount 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.;org/mozilla/javascript/NativeFunction:.initScriptFunction;org/mozilla/javascript/TopLevel:.getBuiltinPrototype;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamCount 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_47:.call;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpMethod:.valueOf 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;sun/nio/ch/SocketChannelImpl:.write;pthread_self 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;[libpthread-2.19.so <7f6b42bfc35d>];system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;local_bh_enable;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_data_queue;sock_def_readable;__wake_up_sync_key;__wake_up_common;ep_poll_callback;__wake_up_locked;__wake_up_common;default_wake_function;try_to_wake_up;_raw_spin_unlock_irqrestore 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;[libpthread-2.19.so <7f6b42bfc35d>];system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;tcp_v4_send_check;__tcp_v4_send_check 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.select;sun/nio/ch/SelectorImpl:.lockAndDoSelect;sun/nio/ch/EPollSelectorImpl:.doSelect;sun/nio/ch/EPollArrayWrapper:.poll;sun/nio/ch/EPollArrayWrapper:.epollWait;__libc_enable_asynccancel 1 +perf;__libc_start_main;[perf <407a40>];[perf <4081a5>];[perf <415ad5>];__GI___ioctl;system_call_fastpath;sys_ioctl;do_vfs_ioctl;perf_ioctl;perf_event_for_each_child;perf_event_enable;cpu_function_call;smp_call_function_single;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +perf;__libc_start_main;[perf <407a40>];[perf <4081a5>];[perf <415c96>];page_fault 1 +swapper;x86_64_start_kernel;x86_64_start_reservations;start_kernel;rest_init;cpu_startup_entry;rcu_idle_enter 1 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-all.txt new file mode 100644 index 0000000..6198aea --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-all.txt @@ -0,0 +1,33 @@ +ab;[unknown];__write_nocancel;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];call_function_single_interrupt_[k];smp_call_function_single_interrupt_[k];generic_smp_call_function_single_interrupt_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 4 +ab;[unknown];__write_nocancel;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];local_bh_enable_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];__kfree_skb_[k] 1 +ab;[unknown];__write_nocancel;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_reserve.isra.26_[k] 1 +ab;[unknown];__write_nocancel;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];tcp_v4_md5_lookup_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];java/lang/Thread:.blockedOn_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];pthread_self 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];[libpthread-2.19.so];system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];local_bh_enable_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_data_queue_[k];sock_def_readable_[k];__wake_up_sync_key_[k];__wake_up_common_[k];ep_poll_callback_[k];__wake_up_locked_[k];__wake_up_common_[k];default_wake_function_[k];try_to_wake_up_[k];_raw_spin_unlock_irqrestore_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];[libpthread-2.19.so];system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];tcp_v4_send_check_[k];__tcp_v4_send_check_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/WrapFactory:.wrap_[j];call_function_single_interrupt_[k];smp_call_function_single_interrupt_[k];generic_smp_call_function_single_interrupt_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_3_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_21_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_31:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:._c_anonymous_1_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];java/lang/reflect/Method:.invoke_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_21_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_2:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];java/lang/reflect/Method:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.add0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_21_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamAndVarCount_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._[j];org/mozilla/javascript/NativeFunction:.initScriptFunction_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j];call_function_single_interrupt_[k];smp_call_function_single_interrupt_[k];generic_smp_call_function_single_interrupt_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamCount_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_47:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpMethod:.valueOf_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.select_[j];sun/nio/ch/SelectorImpl:.lockAndDoSelect_[j];sun/nio/ch/EPollSelectorImpl:.doSelect_[j];sun/nio/ch/EPollArrayWrapper:.poll_[j];sun/nio/ch/EPollArrayWrapper:.epollWait_[j];__libc_enable_asynccancel 1 +perf;__libc_start_main;[perf];[perf];[perf];__GI___ioctl;system_call_fastpath_[k];sys_ioctl_[k];do_vfs_ioctl_[k];perf_ioctl_[k];perf_event_for_each_child_[k];perf_event_enable_[k];cpu_function_call_[k];smp_call_function_single_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 4 +perf;__libc_start_main;[perf];[perf];[perf];page_fault_[k] 1 +swapper;x86_64_start_kernel_[k];x86_64_start_reservations_[k];start_kernel_[k];rest_init_[k];cpu_startup_entry_[k];rcu_idle_enter_[k] 1 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-jit.txt new file mode 100644 index 0000000..2aee0bc --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-jit.txt @@ -0,0 +1,33 @@ +ab;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +ab;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;local_bh_enable;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;__kfree_skb 1 +ab;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_reserve.isra.26 1 +ab;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_v4_md5_lookup 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];java/lang/Thread:.blockedOn_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];pthread_self 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];[libpthread-2.19.so];system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;local_bh_enable;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_data_queue;sock_def_readable;__wake_up_sync_key;__wake_up_common;ep_poll_callback;__wake_up_locked;__wake_up_common;default_wake_function;try_to_wake_up;_raw_spin_unlock_irqrestore 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/DefaultChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];[libpthread-2.19.so];system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;tcp_v4_send_check;__tcp_v4_send_check 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/WrapFactory:.wrap_[j];call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_3_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_21_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_31:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:._c_anonymous_1_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];java/lang/reflect/Method:.invoke_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_21_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_2:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];java/lang/reflect/Method:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.add0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_21_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamAndVarCount_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._[j];org/mozilla/javascript/NativeFunction:.initScriptFunction_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j];call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamCount_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/vertx/java/core/http/impl/ServerConnection:.handleMessage_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/BaseFunction:.construct_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_47:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpMethod:.valueOf_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.select_[j];sun/nio/ch/SelectorImpl:.lockAndDoSelect_[j];sun/nio/ch/EPollSelectorImpl:.doSelect_[j];sun/nio/ch/EPollArrayWrapper:.poll_[j];sun/nio/ch/EPollArrayWrapper:.epollWait_[j];__libc_enable_asynccancel 1 +perf;__libc_start_main;[perf];[perf];[perf];__GI___ioctl;system_call_fastpath;sys_ioctl;do_vfs_ioctl;perf_ioctl;perf_event_for_each_child;perf_event_enable;cpu_function_call;smp_call_function_single;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +perf;__libc_start_main;[perf];[perf];[perf];page_fault 1 +swapper;x86_64_start_kernel;x86_64_start_reservations;start_kernel;rest_init;cpu_startup_entry;rcu_idle_enter 1 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-kernel.txt new file mode 100644 index 0000000..0b35cbe --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-kernel.txt @@ -0,0 +1,33 @@ +ab;[unknown];__write_nocancel;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];call_function_single_interrupt_[k];smp_call_function_single_interrupt_[k];generic_smp_call_function_single_interrupt_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 4 +ab;[unknown];__write_nocancel;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];local_bh_enable_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];__kfree_skb_[k] 1 +ab;[unknown];__write_nocancel;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_reserve.isra.26_[k] 1 +ab;[unknown];__write_nocancel;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];tcp_v4_md5_lookup_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/buffer/AbstractByteBuf:.writeBytes;sun/nio/ch/SocketChannelImpl:.read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/buffer/AbstractByteBuf:.writeBytes;sun/nio/ch/SocketChannelImpl:.read;java/lang/Thread:.blockedOn 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/WrapFactory:.wrap;call_function_single_interrupt_[k];smp_call_function_single_interrupt_[k];generic_smp_call_function_single_interrupt_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_3;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_21;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_31:.call;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:.call;org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:._c_anonymous_1;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;java/lang/reflect/Method:.invoke 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_21;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_2:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;java/lang/reflect/Method:.invoke;io/netty/handler/codec/http/DefaultHttpHeaders:.add0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_21;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamAndVarCount 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.;org/mozilla/javascript/NativeFunction:.initScriptFunction;org/mozilla/javascript/TopLevel:.getBuiltinPrototype;call_function_single_interrupt_[k];smp_call_function_single_interrupt_[k];generic_smp_call_function_single_interrupt_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamCount 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/vertx/java/core/http/impl/ServerConnection:.handleMessage;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/BaseFunction:.construct;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_47:.call;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpMethod:.valueOf 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;sun/nio/ch/SocketChannelImpl:.write;pthread_self 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;[libpthread-2.19.so];system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];local_bh_enable_[k];do_softirq_[k];do_softirq_own_stack_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];__netif_receive_skb_core_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_data_queue_[k];sock_def_readable_[k];__wake_up_sync_key_[k];__wake_up_common_[k];ep_poll_callback_[k];__wake_up_locked_[k];__wake_up_common_[k];default_wake_function_[k];try_to_wake_up_[k];_raw_spin_unlock_irqrestore_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/DefaultChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;[libpthread-2.19.so];system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];tcp_v4_send_check_[k];__tcp_v4_send_check_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.select;sun/nio/ch/SelectorImpl:.lockAndDoSelect;sun/nio/ch/EPollSelectorImpl:.doSelect;sun/nio/ch/EPollArrayWrapper:.poll;sun/nio/ch/EPollArrayWrapper:.epollWait;__libc_enable_asynccancel 1 +perf;__libc_start_main;[perf];[perf];[perf];__GI___ioctl;system_call_fastpath_[k];sys_ioctl_[k];do_vfs_ioctl_[k];perf_ioctl_[k];perf_event_for_each_child_[k];perf_event_enable_[k];cpu_function_call_[k];smp_call_function_single_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 4 +perf;__libc_start_main;[perf];[perf];[perf];page_fault_[k] 1 +swapper;x86_64_start_kernel_[k];x86_64_start_reservations_[k];start_kernel_[k];rest_init_[k];cpu_startup_entry_[k];rcu_idle_enter_[k] 1 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-pid.txt new file mode 100644 index 0000000..617fdfb --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-pid.txt @@ -0,0 +1,33 @@ +ab-?;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +ab-?;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;local_bh_enable;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;__kfree_skb 1 +ab-?;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_reserve.isra.26 1 +ab-?;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_v4_md5_lookup 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/buffer/AbstractByteBuf:.writeBytes;Lsun/nio/ch/SocketChannelImpl:.read 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/buffer/AbstractByteBuf:.writeBytes;Lsun/nio/ch/SocketChannelImpl:.read;Ljava/lang/Thread:.blockedOn 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/WrapFactory:.wrap;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_3;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_21;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_31:.call;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:._c_anonymous_1;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Ljava/lang/reflect/Method:.invoke 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_21;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_2:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Ljava/lang/reflect/Method:.invoke;Lio/netty/handler/codec/http/DefaultHttpHeaders:.add0 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_21;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamAndVarCount 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.;Lorg/mozilla/javascript/NativeFunction:.initScriptFunction;Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamCount 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_47:.call;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpMethod:.valueOf 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;[libpthread-2.19.so];system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;local_bh_enable;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_data_queue;sock_def_readable;__wake_up_sync_key;__wake_up_common;ep_poll_callback;__wake_up_locked;__wake_up_common;default_wake_function;try_to_wake_up;_raw_spin_unlock_irqrestore 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;[libpthread-2.19.so];system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;tcp_v4_send_check;__tcp_v4_send_check 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;Lsun/nio/ch/SocketChannelImpl:.write;pthread_self 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.select;Lsun/nio/ch/SelectorImpl:.lockAndDoSelect;Lsun/nio/ch/EPollSelectorImpl:.doSelect;Lsun/nio/ch/EPollArrayWrapper:.poll;Lsun/nio/ch/EPollArrayWrapper:.epollWait;__libc_enable_asynccancel 1 +perf-?;__libc_start_main;[perf];[perf];[perf];__GI___ioctl;system_call_fastpath;sys_ioctl;do_vfs_ioctl;perf_ioctl;perf_event_for_each_child;perf_event_enable;cpu_function_call;smp_call_function_single;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +perf-?;__libc_start_main;[perf];[perf];[perf];page_fault 1 +swapper-?;x86_64_start_kernel;x86_64_start_reservations;start_kernel;rest_init;cpu_startup_entry;rcu_idle_enter 1 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-tid.txt new file mode 100644 index 0000000..e167ac9 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-01-collapsed-tid.txt @@ -0,0 +1,33 @@ +ab-?/23927;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +ab-?/23927;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;local_bh_enable;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;__kfree_skb 1 +ab-?/23927;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_reserve.isra.26 1 +ab-?/23927;[unknown];__write_nocancel;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_v4_md5_lookup 1 +java-?/23920;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage 1 +java-?/23920;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_3;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_80:._c_anonymous_21;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_31:.call;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?/23921;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/buffer/AbstractByteBuf:.writeBytes;Lsun/nio/ch/SocketChannelImpl:.read 1 +java-?/23921;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/WrapFactory:.wrap;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +java-?/23921;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis 1 +java-?/23921;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/23921;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 1 +java-?/23921;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_4:._c_anonymous_1;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_90:.call;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Ljava/lang/reflect/Method:.invoke 1 +java-?/23921;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpMethod:.valueOf 1 +java-?/23921;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;[libpthread-2.19.so];system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;local_bh_enable;do_softirq;do_softirq_own_stack;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;__netif_receive_skb_core;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_data_queue;sock_def_readable;__wake_up_sync_key;__wake_up_common;ep_poll_callback;__wake_up_locked;__wake_up_common;default_wake_function;try_to_wake_up;_raw_spin_unlock_irqrestore 1 +java-?/23921;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.select;Lsun/nio/ch/SelectorImpl:.lockAndDoSelect;Lsun/nio/ch/EPollSelectorImpl:.doSelect;Lsun/nio/ch/EPollArrayWrapper:.poll;Lsun/nio/ch/EPollArrayWrapper:.epollWait;__libc_enable_asynccancel 1 +java-?/23922;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/buffer/AbstractByteBuf:.writeBytes;Lsun/nio/ch/SocketChannelImpl:.read;Ljava/lang/Thread:.blockedOn 1 +java-?/23922;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead 1 +java-?/23922;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_21;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_49:.call;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/23922;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?/23922;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 1 +java-?/23922;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_bench_Server_js_js_2:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_91:.call;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Ljava/lang/reflect/Method:.invoke;Lio/netty/handler/codec/http/DefaultHttpHeaders:.add0 1 +java-?/23922;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;[libpthread-2.19.so];system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;tcp_v4_send_check;__tcp_v4_send_check 1 +java-?/23923;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call 1 +java-?/23923;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_21;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamAndVarCount 1 +java-?/23923;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/23923;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.;Lorg/mozilla/javascript/NativeFunction:.initScriptFunction;Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +java-?/23923;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.getParamCount 1 +java-?/23923;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/vertx/java/core/http/impl/ServerConnection:.handleMessage;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/BaseFunction:.construct;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_http_js_93:._c_anonymous_3;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_vert_x_2_1_sys_mods_io_vertx_lang_js_1_1_0_vertx_streams_js_47:.call;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/23923;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace 1 +java-?/23923;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/DefaultChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadHandler:.flush;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.getBytes;Lsun/nio/ch/SocketChannelImpl:.write;pthread_self 1 +perf-?/23929;__libc_start_main;[perf];[perf];[perf];__GI___ioctl;system_call_fastpath;sys_ioctl;do_vfs_ioctl;perf_ioctl;perf_event_for_each_child;perf_event_enable;cpu_function_call;smp_call_function_single;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_enable_all;native_write_msr_safe 4 +perf-?/23929;__libc_start_main;[perf];[perf];[perf];page_fault 1 +swapper-?/0;x86_64_start_kernel;x86_64_start_reservations;start_kernel;rest_init;cpu_startup_entry;rcu_idle_enter 1 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-addrs.txt new file mode 100644 index 0000000..23770f2 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-addrs.txt @@ -0,0 +1 @@ +java;start_thread;JavaMain;jni_CallStaticVoidMethod;jni_invoke_static;JavaCalls::call_helper;call_stub;LBusy:::main;java/io/PrintStream:::print;java/io/FileOutputStream:::writeBytes;Java_java_io_FileOutputStream_writeBytes;writeBytes;arrayOopDesc::base;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_nhm_enable_all;intel_pmu_enable_all;native_write_msr_safe 2 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-all.txt b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-all.txt new file mode 100644 index 0000000..c87f8a4 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-all.txt @@ -0,0 +1 @@ +java;start_thread;JavaMain;jni_CallStaticVoidMethod;jni_invoke_static;JavaCalls::call_helper;call_stub_[j];LBusy:::main_[j];java/io/PrintStream:::print_[j];java/io/FileOutputStream:::writeBytes_[j];Java_java_io_FileOutputStream_writeBytes;writeBytes;arrayOopDesc::base;call_function_single_interrupt_[k];smp_call_function_single_interrupt_[k];generic_smp_call_function_single_interrupt_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_nhm_enable_all_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 2 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-jit.txt new file mode 100644 index 0000000..7e476f5 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-jit.txt @@ -0,0 +1 @@ +java;start_thread;JavaMain;jni_CallStaticVoidMethod;jni_invoke_static;JavaCalls::call_helper;call_stub_[j];LBusy:::main_[j];java/io/PrintStream:::print_[j];java/io/FileOutputStream:::writeBytes_[j];Java_java_io_FileOutputStream_writeBytes;writeBytes;arrayOopDesc::base;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_nhm_enable_all;intel_pmu_enable_all;native_write_msr_safe 2 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-kernel.txt new file mode 100644 index 0000000..bf8b70e --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-kernel.txt @@ -0,0 +1 @@ +java;start_thread;JavaMain;jni_CallStaticVoidMethod;jni_invoke_static;JavaCalls::call_helper;call_stub;LBusy:::main;java/io/PrintStream:::print;java/io/FileOutputStream:::writeBytes;Java_java_io_FileOutputStream_writeBytes;writeBytes;arrayOopDesc::base;call_function_single_interrupt_[k];smp_call_function_single_interrupt_[k];generic_smp_call_function_single_interrupt_[k];remote_function_[k];__perf_event_enable_[k];group_sched_in_[k];x86_pmu_commit_txn_[k];perf_pmu_enable_[k];x86_pmu_enable_[k];intel_pmu_nhm_enable_all_[k];intel_pmu_enable_all_[k];native_write_msr_safe_[k] 2 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-pid.txt new file mode 100644 index 0000000..6561651 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-pid.txt @@ -0,0 +1 @@ +java-?;start_thread;JavaMain;jni_CallStaticVoidMethod;jni_invoke_static;JavaCalls::call_helper;call_stub;LBusy:::main;Ljava/io/PrintStream:::print;Ljava/io/FileOutputStream:::writeBytes;Java_java_io_FileOutputStream_writeBytes;writeBytes;arrayOopDesc::base;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_nhm_enable_all;intel_pmu_enable_all;native_write_msr_safe 2 diff --git a/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-tid.txt new file mode 100644 index 0000000..1755220 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-java-stacks-02-collapsed-tid.txt @@ -0,0 +1 @@ +java-?/19983;start_thread;JavaMain;jni_CallStaticVoidMethod;jni_invoke_static;JavaCalls::call_helper;call_stub;LBusy:::main;Ljava/io/PrintStream:::print;Ljava/io/FileOutputStream:::writeBytes;Java_java_io_FileOutputStream_writeBytes;writeBytes;arrayOopDesc::base;call_function_single_interrupt;smp_call_function_single_interrupt;generic_smp_call_function_single_interrupt;remote_function;__perf_event_enable;group_sched_in;x86_pmu_commit_txn;perf_pmu_enable;x86_pmu_enable;intel_pmu_nhm_enable_all;intel_pmu_enable_all;native_write_msr_safe 2 diff --git a/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-addrs.txt new file mode 100644 index 0000000..3bd84b1 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-addrs.txt @@ -0,0 +1,2 @@ +node-v011;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub;Builtin:A builtin from the snapshot;LazyCompile:_tickDomainCallback node.js:387;LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39;RegExp:\bFoo ?Bar 1 +node-v011;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub;Builtin:A builtin from the snapshot;LazyCompile:_tickDomainCallback node.js:387;LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39;v8::internal::Execution::Call;LazyCompile:~body_0 evalmachine.:1;RegExp:[&<>\\] 1 diff --git a/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-all.txt new file mode 100644 index 0000000..554f511 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-all.txt @@ -0,0 +1,2 @@ +node-v011;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub_[j];Builtin:A builtin from the snapshot_[j];LazyCompile:_tickDomainCallback node.js:387_[j];LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39_[j];RegExp:\bFoo ?Bar_[j] 1 +node-v011;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub_[j];Builtin:A builtin from the snapshot_[j];LazyCompile:_tickDomainCallback node.js:387_[j];LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39_[j];v8::internal::Execution::Call;LazyCompile:~body_0 evalmachine.:1_[j];RegExp:[&<>\\]_[j] 1 diff --git a/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-jit.txt new file mode 100644 index 0000000..554f511 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-jit.txt @@ -0,0 +1,2 @@ +node-v011;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub_[j];Builtin:A builtin from the snapshot_[j];LazyCompile:_tickDomainCallback node.js:387_[j];LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39_[j];RegExp:\bFoo ?Bar_[j] 1 +node-v011;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub_[j];Builtin:A builtin from the snapshot_[j];LazyCompile:_tickDomainCallback node.js:387_[j];LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39_[j];v8::internal::Execution::Call;LazyCompile:~body_0 evalmachine.:1_[j];RegExp:[&<>\\]_[j] 1 diff --git a/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-kernel.txt new file mode 100644 index 0000000..3bd84b1 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-kernel.txt @@ -0,0 +1,2 @@ +node-v011;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub;Builtin:A builtin from the snapshot;LazyCompile:_tickDomainCallback node.js:387;LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39;RegExp:\bFoo ?Bar 1 +node-v011;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub;Builtin:A builtin from the snapshot;LazyCompile:_tickDomainCallback node.js:387;LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39;v8::internal::Execution::Call;LazyCompile:~body_0 evalmachine.:1;RegExp:[&<>\\] 1 diff --git a/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-pid.txt new file mode 100644 index 0000000..a62da4d --- /dev/null +++ b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-pid.txt @@ -0,0 +1,2 @@ +node-v011-?;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub;Builtin:A builtin from the snapshot;LazyCompile:_tickDomainCallback node.js:387;LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39;RegExp:\bFoo ?Bar 1 +node-v011-?;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub;Builtin:A builtin from the snapshot;LazyCompile:_tickDomainCallback node.js:387;LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39;v8::internal::Execution::Call;LazyCompile:~body_0 evalmachine.:1;RegExp:[&<>\\] 1 diff --git a/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-tid.txt new file mode 100644 index 0000000..07c0b27 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-js-stacks-01-collapsed-tid.txt @@ -0,0 +1,2 @@ +node-v011-?/31912;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub;Builtin:A builtin from the snapshot;LazyCompile:_tickDomainCallback node.js:387;LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39;RegExp:\bFoo ?Bar 1 +node-v011-?/31912;__libc_start_main;node::Start;uv_run;uv__io_poll;uv__async_io;uv__async_event;uv__work_done;node::After;v8::Function::Call;v8::internal::Execution::Call;v8::internal::Invoke;Stub:JSEntryStub;Builtin:A builtin from the snapshot;LazyCompile:_tickDomainCallback node.js:387;LazyCompile:*Async$consumeFunctionBuffer /apps/node/webapp/node_modules/xxxxx/js/main/async.js:39;v8::internal::Execution::Call;LazyCompile:~body_0 evalmachine.:1;RegExp:[&<>\\] 1 diff --git a/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-addrs.txt new file mode 100644 index 0000000..5a7258c --- /dev/null +++ b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-addrs.txt @@ -0,0 +1,10 @@ +mir-console;[unknown <6eaf28>];camlLwt__bind_1394 2 +mir-console;[unknown <6eaf28>];camlLwt__return_1285 1 +mir-console;[unknown <7f57a7549e40>];camlLwt__repr_rec_1132 1 +mir-console;[unknown <7f57a760d920>];camlLwt__repr_rec_1132 1 +mir-console;[unknown <7fff978f8dd0>];caml_start_program;caml_program;camlMain__entry;camlUnikernel____pa_lwt_loop_1382;camlLwt__bind_1394 2 +mir-console;camlLwt__bind_1394 2 +mir-console;camlMain__fun_1418;camlLwt__return_1285 2 +mir-console;camlMain__fun_1418;camlUnikernel____pa_lwt_loop_1382 1 +mir-console;camlUnikernel__fun_1396 1 +swapper;cpu_bringup_and_idle;cpu_startup_entry;arch_cpu_idle;default_idle;xen_hypercall_sched_op 39 diff --git a/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-all.txt new file mode 100644 index 0000000..15afec5 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-all.txt @@ -0,0 +1,9 @@ +mir-console;[unknown];camlLwt__bind_1394 2 +mir-console;[unknown];camlLwt__repr_rec_1132 2 +mir-console;[unknown];camlLwt__return_1285 1 +mir-console;[unknown];caml_start_program;caml_program;camlMain__entry;camlUnikernel____pa_lwt_loop_1382;camlLwt__bind_1394 2 +mir-console;camlLwt__bind_1394 2 +mir-console;camlMain__fun_1418;camlLwt__return_1285 2 +mir-console;camlMain__fun_1418;camlUnikernel____pa_lwt_loop_1382 1 +mir-console;camlUnikernel__fun_1396 1 +swapper;cpu_bringup_and_idle_[k];cpu_startup_entry_[k];arch_cpu_idle_[k];default_idle_[k];xen_hypercall_sched_op_[k] 39 diff --git a/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-jit.txt new file mode 100644 index 0000000..15a8bb3 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-jit.txt @@ -0,0 +1,9 @@ +mir-console;[unknown];camlLwt__bind_1394 2 +mir-console;[unknown];camlLwt__repr_rec_1132 2 +mir-console;[unknown];camlLwt__return_1285 1 +mir-console;[unknown];caml_start_program;caml_program;camlMain__entry;camlUnikernel____pa_lwt_loop_1382;camlLwt__bind_1394 2 +mir-console;camlLwt__bind_1394 2 +mir-console;camlMain__fun_1418;camlLwt__return_1285 2 +mir-console;camlMain__fun_1418;camlUnikernel____pa_lwt_loop_1382 1 +mir-console;camlUnikernel__fun_1396 1 +swapper;cpu_bringup_and_idle;cpu_startup_entry;arch_cpu_idle;default_idle;xen_hypercall_sched_op 39 diff --git a/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-kernel.txt new file mode 100644 index 0000000..15afec5 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-kernel.txt @@ -0,0 +1,9 @@ +mir-console;[unknown];camlLwt__bind_1394 2 +mir-console;[unknown];camlLwt__repr_rec_1132 2 +mir-console;[unknown];camlLwt__return_1285 1 +mir-console;[unknown];caml_start_program;caml_program;camlMain__entry;camlUnikernel____pa_lwt_loop_1382;camlLwt__bind_1394 2 +mir-console;camlLwt__bind_1394 2 +mir-console;camlMain__fun_1418;camlLwt__return_1285 2 +mir-console;camlMain__fun_1418;camlUnikernel____pa_lwt_loop_1382 1 +mir-console;camlUnikernel__fun_1396 1 +swapper;cpu_bringup_and_idle_[k];cpu_startup_entry_[k];arch_cpu_idle_[k];default_idle_[k];xen_hypercall_sched_op_[k] 39 diff --git a/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-pid.txt new file mode 100644 index 0000000..ca208b4 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-pid.txt @@ -0,0 +1,9 @@ +mir-console-?;[unknown];camlLwt__bind_1394 2 +mir-console-?;[unknown];camlLwt__repr_rec_1132 2 +mir-console-?;[unknown];camlLwt__return_1285 1 +mir-console-?;[unknown];caml_start_program;caml_program;camlMain__entry;camlUnikernel____pa_lwt_loop_1382;camlLwt__bind_1394 2 +mir-console-?;camlLwt__bind_1394 2 +mir-console-?;camlMain__fun_1418;camlLwt__return_1285 2 +mir-console-?;camlMain__fun_1418;camlUnikernel____pa_lwt_loop_1382 1 +mir-console-?;camlUnikernel__fun_1396 1 +swapper-?;cpu_bringup_and_idle;cpu_startup_entry;arch_cpu_idle;default_idle;xen_hypercall_sched_op 39 diff --git a/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-tid.txt new file mode 100644 index 0000000..355387f --- /dev/null +++ b/tools/FlameGraph/test/results/perf-mirageos-stacks-01-collapsed-tid.txt @@ -0,0 +1,9 @@ +mir-console-?/23166;[unknown];camlLwt__bind_1394 2 +mir-console-?/23166;[unknown];camlLwt__repr_rec_1132 2 +mir-console-?/23166;[unknown];camlLwt__return_1285 1 +mir-console-?/23166;[unknown];caml_start_program;caml_program;camlMain__entry;camlUnikernel____pa_lwt_loop_1382;camlLwt__bind_1394 2 +mir-console-?/23166;camlLwt__bind_1394 2 +mir-console-?/23166;camlMain__fun_1418;camlLwt__return_1285 2 +mir-console-?/23166;camlMain__fun_1418;camlUnikernel____pa_lwt_loop_1382 1 +mir-console-?/23166;camlUnikernel__fun_1396 1 +swapper-?/0;cpu_bringup_and_idle;cpu_startup_entry;arch_cpu_idle;default_idle;xen_hypercall_sched_op 39 diff --git a/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-addrs.txt new file mode 100644 index 0000000..aa910e3 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-addrs.txt @@ -0,0 +1,46 @@ +java;[perf-10939.map <7f08b5331209>];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;cpumask_next_and;find_next_bit 1 +java;[perf-10939.map <7f08b5331209>];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 5 +java;[perf-10939.map <7f08b578411f>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 7 +java;[perf-10939.map <7f08b578412c>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 3 +java;[perf-10939.map <7f08b5784130>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 4 +java;[perf-10939.map <7f08b57842cb>] 1 +java;[perf-10939.map <7f08b578432f>] 1 +java;[perf-10939.map <7f08b5784377>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java;[perf-10939.map <7f08b578437b>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java;[perf-10939.map <7f08b5784383>] 1 +java;[perf-10939.map <7f08b57ae255>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;_raw_spin_unlock_irqrestore 1 +java;[perf-10939.map <7f08b57ae255>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;notify_remote_via_irq 1 +java;[perf-10939.map <7f08b57ae255>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;notify_remote_via_irq;evtchn_from_irq;irq_get_irq_data;irq_to_desc;radix_tree_lookup_element 1 +java;[perf-10939.map <7f08b57ae255>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 5 +java;[perf-10939.map <7f08b57ae3b4>] 1 +java;[perf-10939.map <7f08b57b5a5c>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many 1 +java;[perf-10939.map <7f08b57feb3e>] 3 +java;[perf-10939.map <7f08b57feb4b>] 1 +java;[perf-10939.map <7f08b57feb5b>] 1 +java;[perf-10939.map <7f08b57feb68>] 1 +java;[perf-10939.map <7f08b57feb75>] 3 +java;[perf-10939.map <7f08b57feb8f>] 2 +java;[perf-10939.map <7f08b57feb9c>] 1 +java;[perf-10939.map <7f08b581723e>] 2 +java;[perf-10939.map <7f08b5817256>] 4 +java;[perf-10939.map <7f08b5817290>] 1 +java;[unknown <7ecef8f2f480>];[perf-10939.map <7f08b5783b58>];page_fault;do_page_fault;__do_page_fault 1 +java;[unknown <7ecef8f2f480>];[perf-10939.map <7f08b5783b58>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 7 +java;[unknown <7ecef8f2f480>];[perf-10939.map <7f08b5783bfc>] 1 +java;[unknown <7ecef8f2f480>];[perf-10939.map <7f08b5783bfc>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java;[unknown <7f08c880b5c8>];[perf-10939.map <7f08b56bffa1>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 10 +java;[unknown <7f08c88c60a8>];[perf-10939.map <7f08b579f7e7>];[perf-10939.map <7f08b50523b6>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java;[unknown <7f08c88c60a8>];[perf-10939.map <7f08b579f7e7>];[perf-10939.map <7f08b50523c2>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java;[unknown <7f08c88c60a8>];[perf-10939.map <7f08b579f7e7>];[perf-10939.map <7f08b50523ce>] 1 +java;[unknown <7f08c88c60a8>];[perf-10939.map <7f08b579f7e7>];[perf-10939.map <7f08b50523ce>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 4 +java;[unknown <7f08c88c60a8>];[perf-10939.map <7f08b579f7e7>];[perf-10939.map <7f08b50523da>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java;[unknown <7f08c88c60a8>];[perf-10939.map <7f08b579f8a4>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 12 +java;[unknown <7f08c8a52338>];[perf-10939.map <7f08b5783e3d>];page_fault;do_page_fault;__do_page_fault 1 +java;[unknown <7f08c8a52338>];[perf-10939.map <7f08b5783e3d>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 7 +java;[unknown <7f08c8a52338>];[perf-10939.map <7f08b5783e40>] 1 +java;[unknown <7f08c8a52338>];[perf-10939.map <7f08b5783e4a>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 8 +java;[unknown <7f08c8a52338>];[perf-10939.map <7f08b5783e4e>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 8 +java;[unknown <7f08c8a52338>];[perf-10939.map <7f08b5783e4e>];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;find_next_bit 1 +java;[unknown <7f08c8a52338>];[perf-10939.map <7f08b5784261>];retint_signal;do_notify_resume;task_work_run;task_numa_work;change_prot_numa;change_protection;change_protection_range 1 +swapper;start_secondary;cpu_startup_entry;arch_cpu_idle;default_idle;native_safe_halt 72 +swapper;x86_64_start_kernel;x86_64_start_reservations;start_kernel;rest_init;cpu_startup_entry;arch_cpu_idle;default_idle;native_safe_halt 2 diff --git a/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-all.txt new file mode 100644 index 0000000..9c085d0 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-all.txt @@ -0,0 +1,17 @@ +java;[perf-10939.map]_[j] 23 +java;[perf-10939.map]_[j];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];cpumask_next_and_[k];find_next_bit_[k] 1 +java;[perf-10939.map]_[j];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];xen_hypercall_event_channel_op_[k] 5 +java;[perf-10939.map]_[j];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k] 1 +java;[perf-10939.map]_[j];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];_raw_spin_unlock_irqrestore_[k] 1 +java;[perf-10939.map]_[j];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];notify_remote_via_irq_[k] 1 +java;[perf-10939.map]_[j];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];notify_remote_via_irq_[k];evtchn_from_irq_[k];irq_get_irq_data_[k];irq_to_desc_[k];radix_tree_lookup_element_[k] 1 +java;[perf-10939.map]_[j];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];xen_hypercall_event_channel_op_[k] 23 +java;[unknown];[perf-10939.map]_[j] 2 +java;[unknown];[perf-10939.map]_[j];[perf-10939.map]_[j] 1 +java;[unknown];[perf-10939.map]_[j];[perf-10939.map]_[j];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];xen_hypercall_event_channel_op_[k] 9 +java;[unknown];[perf-10939.map]_[j];page_fault_[k];do_page_fault_[k];__do_page_fault_[k] 2 +java;[unknown];[perf-10939.map]_[j];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];xen_hypercall_event_channel_op_[k] 53 +java;[unknown];[perf-10939.map]_[j];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];find_next_bit_[k] 1 +java;[unknown];[perf-10939.map]_[j];retint_signal_[k];do_notify_resume_[k];task_work_run_[k];task_numa_work_[k];change_prot_numa_[k];change_protection_[k];change_protection_range_[k] 1 +swapper;start_secondary_[k];cpu_startup_entry_[k];arch_cpu_idle_[k];default_idle_[k];native_safe_halt_[k] 72 +swapper;x86_64_start_kernel_[k];x86_64_start_reservations_[k];start_kernel_[k];rest_init_[k];cpu_startup_entry_[k];arch_cpu_idle_[k];default_idle_[k];native_safe_halt_[k] 2 diff --git a/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-jit.txt new file mode 100644 index 0000000..fc4c481 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-jit.txt @@ -0,0 +1,17 @@ +java;[perf-10939.map]_[j] 23 +java;[perf-10939.map]_[j];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;cpumask_next_and;find_next_bit 1 +java;[perf-10939.map]_[j];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 5 +java;[perf-10939.map]_[j];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many 1 +java;[perf-10939.map]_[j];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;_raw_spin_unlock_irqrestore 1 +java;[perf-10939.map]_[j];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;notify_remote_via_irq 1 +java;[perf-10939.map]_[j];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;notify_remote_via_irq;evtchn_from_irq;irq_get_irq_data;irq_to_desc;radix_tree_lookup_element 1 +java;[perf-10939.map]_[j];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 23 +java;[unknown];[perf-10939.map]_[j] 2 +java;[unknown];[perf-10939.map]_[j];[perf-10939.map]_[j] 1 +java;[unknown];[perf-10939.map]_[j];[perf-10939.map]_[j];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 9 +java;[unknown];[perf-10939.map]_[j];page_fault;do_page_fault;__do_page_fault 2 +java;[unknown];[perf-10939.map]_[j];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 53 +java;[unknown];[perf-10939.map]_[j];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;find_next_bit 1 +java;[unknown];[perf-10939.map]_[j];retint_signal;do_notify_resume;task_work_run;task_numa_work;change_prot_numa;change_protection;change_protection_range 1 +swapper;start_secondary;cpu_startup_entry;arch_cpu_idle;default_idle;native_safe_halt 72 +swapper;x86_64_start_kernel;x86_64_start_reservations;start_kernel;rest_init;cpu_startup_entry;arch_cpu_idle;default_idle;native_safe_halt 2 diff --git a/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-kernel.txt new file mode 100644 index 0000000..4e9f7b0 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-kernel.txt @@ -0,0 +1,17 @@ +java;[perf-10939.map] 23 +java;[perf-10939.map];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];cpumask_next_and_[k];find_next_bit_[k] 1 +java;[perf-10939.map];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];xen_hypercall_event_channel_op_[k] 5 +java;[perf-10939.map];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k] 1 +java;[perf-10939.map];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];_raw_spin_unlock_irqrestore_[k] 1 +java;[perf-10939.map];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];notify_remote_via_irq_[k] 1 +java;[perf-10939.map];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];notify_remote_via_irq_[k];evtchn_from_irq_[k];irq_get_irq_data_[k];irq_to_desc_[k];radix_tree_lookup_element_[k] 1 +java;[perf-10939.map];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];xen_hypercall_event_channel_op_[k] 23 +java;[unknown];[perf-10939.map] 2 +java;[unknown];[perf-10939.map];[perf-10939.map] 1 +java;[unknown];[perf-10939.map];[perf-10939.map];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];xen_hypercall_event_channel_op_[k] 9 +java;[unknown];[perf-10939.map];page_fault_[k];do_page_fault_[k];__do_page_fault_[k] 2 +java;[unknown];[perf-10939.map];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];__xen_send_IPI_mask_[k];xen_send_IPI_one_[k];xen_hypercall_event_channel_op_[k] 53 +java;[unknown];[perf-10939.map];page_fault_[k];do_page_fault_[k];__do_page_fault_[k];handle_mm_fault_[k];do_numa_page_[k];migrate_misplaced_page_[k];migrate_pages_[k];try_to_unmap_[k];try_to_unmap_anon_[k];try_to_unmap_one_[k];ptep_clear_flush_[k];flush_tlb_page_[k];native_flush_tlb_others_[k];smp_call_function_many_[k];xen_smp_send_call_function_ipi_[k];find_next_bit_[k] 1 +java;[unknown];[perf-10939.map];retint_signal_[k];do_notify_resume_[k];task_work_run_[k];task_numa_work_[k];change_prot_numa_[k];change_protection_[k];change_protection_range_[k] 1 +swapper;start_secondary_[k];cpu_startup_entry_[k];arch_cpu_idle_[k];default_idle_[k];native_safe_halt_[k] 72 +swapper;x86_64_start_kernel_[k];x86_64_start_reservations_[k];start_kernel_[k];rest_init_[k];cpu_startup_entry_[k];arch_cpu_idle_[k];default_idle_[k];native_safe_halt_[k] 2 diff --git a/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-pid.txt new file mode 100644 index 0000000..d451f7f --- /dev/null +++ b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-pid.txt @@ -0,0 +1,17 @@ +java-?;[perf-10939.map] 23 +java-?;[perf-10939.map];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;cpumask_next_and;find_next_bit 1 +java-?;[perf-10939.map];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 5 +java-?;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many 1 +java-?;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;_raw_spin_unlock_irqrestore 1 +java-?;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;notify_remote_via_irq 1 +java-?;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;notify_remote_via_irq;evtchn_from_irq;irq_get_irq_data;irq_to_desc;radix_tree_lookup_element 1 +java-?;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 23 +java-?;[unknown];[perf-10939.map] 2 +java-?;[unknown];[perf-10939.map];[perf-10939.map] 1 +java-?;[unknown];[perf-10939.map];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 9 +java-?;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault 2 +java-?;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 53 +java-?;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;find_next_bit 1 +java-?;[unknown];[perf-10939.map];retint_signal;do_notify_resume;task_work_run;task_numa_work;change_prot_numa;change_protection;change_protection_range 1 +swapper-?;start_secondary;cpu_startup_entry;arch_cpu_idle;default_idle;native_safe_halt 72 +swapper-?;x86_64_start_kernel;x86_64_start_reservations;start_kernel;rest_init;cpu_startup_entry;arch_cpu_idle;default_idle;native_safe_halt 2 diff --git a/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-tid.txt new file mode 100644 index 0000000..ca36afb --- /dev/null +++ b/tools/FlameGraph/test/results/perf-numa-stacks-01-collapsed-tid.txt @@ -0,0 +1,53 @@ +java-?/10992;[perf-10939.map] 4 +java-?/10992;[unknown];[perf-10939.map] 1 +java-?/10992;[unknown];[perf-10939.map];[perf-10939.map] 1 +java-?/10992;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault 1 +java-?/10993;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/10993;[unknown];[perf-10939.map];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/10993;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 3 +java-?/10996;[perf-10939.map] 6 +java-?/10998;[unknown];[perf-10939.map];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/10998;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 4 +java-?/10999;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/10999;[unknown];[perf-10939.map];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/10999;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault 1 +java-?/10999;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 4 +java-?/11000;[perf-10939.map] 6 +java-?/11001;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/11001;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 4 +java-?/11002;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 3 +java-?/11002;[unknown];[perf-10939.map];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/11002;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/11003;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 3 +java-?/11003;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/11003;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;find_next_bit 1 +java-?/11007;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;_raw_spin_unlock_irqrestore 1 +java-?/11007;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/11007;[unknown];[perf-10939.map];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/11007;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/11008;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 6 +java-?/11009;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/11009;[unknown];[perf-10939.map];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/11009;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 4 +java-?/11011;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/11011;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 5 +java-?/11011;[unknown];[perf-10939.map];retint_signal;do_notify_resume;task_work_run;task_numa_work;change_prot_numa;change_protection;change_protection_range 1 +java-?/11012;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many 1 +java-?/11012;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/11012;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 5 +java-?/11013;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;notify_remote_via_irq 1 +java-?/11013;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/11013;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 3 +java-?/11015;[perf-10939.map];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;cpumask_next_and;find_next_bit 1 +java-?/11015;[perf-10939.map];OptoRuntime::multianewarray2_C;ObjArrayKlass::multi_allocate;TypeArrayKlass::multi_allocate;TypeArrayKlass::allocate_common;page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 5 +java-?/11017;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 1 +java-?/11017;[unknown];[perf-10939.map] 1 +java-?/11017;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 5 +java-?/11018;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/11018;[unknown];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 4 +java-?/11020;[perf-10939.map] 7 +java-?/11021;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;notify_remote_via_irq;evtchn_from_irq;irq_get_irq_data;irq_to_desc;radix_tree_lookup_element 1 +java-?/11021;[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +java-?/11021;[unknown];[perf-10939.map];[perf-10939.map];page_fault;do_page_fault;__do_page_fault;handle_mm_fault;do_numa_page;migrate_misplaced_page;migrate_pages;try_to_unmap;try_to_unmap_anon;try_to_unmap_one;ptep_clear_flush;flush_tlb_page;native_flush_tlb_others;smp_call_function_many;xen_smp_send_call_function_ipi;__xen_send_IPI_mask;xen_send_IPI_one;xen_hypercall_event_channel_op 2 +swapper-?/0;start_secondary;cpu_startup_entry;arch_cpu_idle;default_idle;native_safe_halt 72 +swapper-?/0;x86_64_start_kernel;x86_64_start_reservations;start_kernel;rest_init;cpu_startup_entry;arch_cpu_idle;default_idle;native_safe_halt 2 diff --git a/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-addrs.txt new file mode 100644 index 0000000..29e4f6a --- /dev/null +++ b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-addrs.txt @@ -0,0 +1,45 @@ +emulator;[unknown <2e747262696c0036>];_dl_name_match_p 42632 +emulator;[unknown <40>];_dl_sysdep_start;_dl_init_paths 32156 +emulator;[unknown <40>];_dl_sysdep_start;dl_main;__strcasecmp 52068 +emulator;[unknown <40>];_dl_sysdep_start;dl_main;_dl_relocate_object 113074 +emulator;[unknown <63636762696c0036>];strcmp 60144 +emulator;__GI_____strtoull_l_internal 72243 +emulator;__GI___readlink 66557 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 315764 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$usize$u20$as$u20$core..iter..range..Step$GT$::add_one::h0701a52b56dc0bbb 128577 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 247667 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::write::haabbb39ab969e5ac 254732 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::hfd64239413386906 160490 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h08724396296cdea6;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h72ebd1bc97b2075e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h9375446625dcf9e8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h42174e2928c223fa;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h1191ad8aa35e2822;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h2d4f8260955f00a9;_$LT$core..iter..FilterMap$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::he1189ac8e3187a50;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hb223ec6a8effeb5f;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 160789 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h185e3c12af3fc754;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::he13ccf618f424fa8;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::hf30fd19863432c7b;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h87371dcef7b54f45;_$LT$core..str..Split$LT$$u27$a$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h640ea8ab0b8e51ce;_$LT$core..str..SplitInternal$LT$$u27$a$C$$u20$P$GT$$GT$::next::h6ff90db1c517060d;_$LT$core..str..pattern..CharSearcher$LT$$u27$a$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next_match::ha7c6689628ca2406;core::str::pattern::Searcher::next_match::h3b4c786aa5e821fc;_$LT$core..str..pattern..CharEqSearcher$LT$$u27$a$C$$u20$C$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next::hbefb8ac4a49c1d1e;_$LT$core..str..CharIndices$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6d3c2b6db3f8302b;_$LT$core..str..Chars$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h3192360e451206ea;core::str::next_code_point::hc208947b28200a26 161094 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..iter..Filter$LT$I$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc46470b5838977c4;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hf6d2c4c5538b1320;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h503f07e91a8c70cc;_$LT$core..option..Option$LT$T$GT$$GT$::map::h4d3efd64a17eb7e4 186650 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3 182088 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6382d5064d2f104a;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h01cfe524df2e1837;_$LT$core..slice..Iter$LT$$u27$a$C$$u20$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::ha5ae786e76ac1132;core::ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::offset::hffec494e9fc99daf 184354 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::displacement::h23649dceee14681b;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$core..ops..Deref$GT$::deref::hf5640e419faf6aa3;_$LT$$RF$$u27$a$u20$mut$u20$T$u20$as$u20$core..ops..Deref$GT$::deref::h9629b61700da8d48 185542 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$std..collections..hash..table..Put$LT$K$C$$u20$V$GT$$GT$::borrow_table_mut::h7b43ee0d3891fd5f 178602 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;std::collections::hash::map::search_hashed::hae33740b510f48a0 180495 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_ordered::h7b9d42bf7a5f0d35 183668 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;__memmove_sse2_unaligned_erms 180014 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;_$LT$std..io..buffered..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$::read::h0092352920edf903;std::io::impls::_$LT$impl$u20$std..io..Read$u20$for$u20$$RF$$u27$a$u20$$u5b$u8$u5d$$GT$::read::he880dac0905a777b;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::split_at::h9377899ac1bb5027;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::split_at::h80c52dadb70c5280;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..RangeTo$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h9c7a1847e7ff452a;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..Range$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h4d1325c39b2e2225;core::slice::from_raw_parts::hf2d070766f9033b0 166807 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 163021 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::get_unchecked_mut::hecb03b761e9b7d9e;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::get_unchecked_mut::h49fa6b2e956b2ceb 170071 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::truncate::h2f857c8801e6ea48;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::hb94ba71a1dd47d71;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::is_null::h0535f15cf1003af9 176362 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;term::terminfo::searcher::get_dbpath_for_term::hffa8fd0e9637bc76;std::path::PathBuf::_push::h766d676eb9b04254 73671 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 183381 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40 559435 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 188406 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::mem::swap::hcb834a1162e5ad6c 183868 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::make_hash::h992d9241b64fceb7;std::collections::hash::table::make_hash::h9f03ce4a8d5d1b78;_$LT$std..collections..hash..map..DefaultHasher$u20$as$u20$core..hash..Hasher$GT$::finish::h2c804330acc776d7;_$LT$core..hash..sip..SipHasher13$u20$as$u20$core..hash..Hasher$GT$::finish::h73025af53645a0f3;_$LT$core..hash..sip..Hasher$LT$S$GT$$u20$as$u20$core..hash..Hasher$GT$::finish::ha781266cba0e4a7c;_$LT$core..hash..sip..Sip13Rounds$u20$as$u20$core..hash..sip..Sip$GT$::d_rounds::hae93b8d08d9c9a13;core::num::_$LT$impl$u20$u64$GT$::wrapping_add::h021932e4ee83e791 194103 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;core::slice::_$LT$impl$u20$core..ops..IndexMut$LT$core..ops..RangeFrom$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index_mut::hc2a47196a9b3dc9f 195165 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::h32f778ca25724bf1 194314 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 194076 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h6ce9ad9125cfc58e;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h16fe3c65a4c16e46;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h84d1c44a62ed8a23;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h0c6331f8890ff8d7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::hcb451fe86918197e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h98844db7b829b7c9;std::collections::hash::map::search_hashed::hb56562c80a350a98;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::new::h610d20a99611ae46;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::at_index::h34ab787a9a6009ea;_$LT$std..collections..hash..table..RawTable$LT$K$C$$u20$V$GT$$GT$::first_bucket_raw::hb9d07d7e2fb8d059;std::collections::hash::table::calculate_offsets::hfe569e8904133a1b;core::num::_$LT$impl$u20$usize$GT$::overflowing_add::h4bf465fac5e6d437 194816 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::resize::h33edb9dae7314c90;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::offset::h83331dc01d57b6ff 194077 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;page_fault 71141 +emulator;_dl_map_object;_dl_load_cache_lookup 86339 +emulator;_dl_start_user;_dl_start 17736 +emulator;_start 716 +emulator;_start;page_fault 3646 +emulator;je_arena_ralloc_no_move 173377 +emulator;je_arena_tcache_fill_small;page_fault 70745 +emulator;je_tcache_boot 65964 diff --git a/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-all.txt b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-all.txt new file mode 100644 index 0000000..ddabc69 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-all.txt @@ -0,0 +1,45 @@ +emulator;[unknown];_dl_name_match_p 42632 +emulator;[unknown];_dl_sysdep_start;_dl_init_paths 32156 +emulator;[unknown];_dl_sysdep_start;dl_main;__strcasecmp 52068 +emulator;[unknown];_dl_sysdep_start;dl_main;_dl_relocate_object 113074 +emulator;[unknown];strcmp 60144 +emulator;__GI_____strtoull_l_internal 72243 +emulator;__GI___readlink 66557 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 315764 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$usize$u20$as$u20$core..iter..range..Step$GT$::add_one::h0701a52b56dc0bbb 128577 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 247667 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::write::haabbb39ab969e5ac 254732 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::hfd64239413386906 160490 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h08724396296cdea6;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h72ebd1bc97b2075e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h9375446625dcf9e8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h42174e2928c223fa;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h1191ad8aa35e2822;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h2d4f8260955f00a9;_$LT$core..iter..FilterMap$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::he1189ac8e3187a50;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hb223ec6a8effeb5f;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 160789 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h185e3c12af3fc754;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::he13ccf618f424fa8;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::hf30fd19863432c7b;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h87371dcef7b54f45;_$LT$core..str..Split$LT$$u27$a$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h640ea8ab0b8e51ce;_$LT$core..str..SplitInternal$LT$$u27$a$C$$u20$P$GT$$GT$::next::h6ff90db1c517060d;_$LT$core..str..pattern..CharSearcher$LT$$u27$a$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next_match::ha7c6689628ca2406;core::str::pattern::Searcher::next_match::h3b4c786aa5e821fc;_$LT$core..str..pattern..CharEqSearcher$LT$$u27$a$C$$u20$C$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next::hbefb8ac4a49c1d1e;_$LT$core..str..CharIndices$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6d3c2b6db3f8302b;_$LT$core..str..Chars$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h3192360e451206ea;core::str::next_code_point::hc208947b28200a26 161094 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..iter..Filter$LT$I$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc46470b5838977c4;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hf6d2c4c5538b1320;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h503f07e91a8c70cc;_$LT$core..option..Option$LT$T$GT$$GT$::map::h4d3efd64a17eb7e4 186650 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3 182088 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6382d5064d2f104a;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h01cfe524df2e1837;_$LT$core..slice..Iter$LT$$u27$a$C$$u20$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::ha5ae786e76ac1132;core::ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::offset::hffec494e9fc99daf 184354 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::displacement::h23649dceee14681b;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$core..ops..Deref$GT$::deref::hf5640e419faf6aa3;_$LT$$RF$$u27$a$u20$mut$u20$T$u20$as$u20$core..ops..Deref$GT$::deref::h9629b61700da8d48 185542 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$std..collections..hash..table..Put$LT$K$C$$u20$V$GT$$GT$::borrow_table_mut::h7b43ee0d3891fd5f 178602 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;std::collections::hash::map::search_hashed::hae33740b510f48a0 180495 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_ordered::h7b9d42bf7a5f0d35 183668 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;__memmove_sse2_unaligned_erms 180014 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;_$LT$std..io..buffered..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$::read::h0092352920edf903;std::io::impls::_$LT$impl$u20$std..io..Read$u20$for$u20$$RF$$u27$a$u20$$u5b$u8$u5d$$GT$::read::he880dac0905a777b;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::split_at::h9377899ac1bb5027;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::split_at::h80c52dadb70c5280;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..RangeTo$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h9c7a1847e7ff452a;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..Range$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h4d1325c39b2e2225;core::slice::from_raw_parts::hf2d070766f9033b0 166807 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 163021 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::get_unchecked_mut::hecb03b761e9b7d9e;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::get_unchecked_mut::h49fa6b2e956b2ceb 170071 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::truncate::h2f857c8801e6ea48;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::hb94ba71a1dd47d71;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::is_null::h0535f15cf1003af9 176362 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;term::terminfo::searcher::get_dbpath_for_term::hffa8fd0e9637bc76;std::path::PathBuf::_push::h766d676eb9b04254 73671 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 183381 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40 559435 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 188406 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::mem::swap::hcb834a1162e5ad6c 183868 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::make_hash::h992d9241b64fceb7;std::collections::hash::table::make_hash::h9f03ce4a8d5d1b78;_$LT$std..collections..hash..map..DefaultHasher$u20$as$u20$core..hash..Hasher$GT$::finish::h2c804330acc776d7;_$LT$core..hash..sip..SipHasher13$u20$as$u20$core..hash..Hasher$GT$::finish::h73025af53645a0f3;_$LT$core..hash..sip..Hasher$LT$S$GT$$u20$as$u20$core..hash..Hasher$GT$::finish::ha781266cba0e4a7c;_$LT$core..hash..sip..Sip13Rounds$u20$as$u20$core..hash..sip..Sip$GT$::d_rounds::hae93b8d08d9c9a13;core::num::_$LT$impl$u20$u64$GT$::wrapping_add::h021932e4ee83e791 194103 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;core::slice::_$LT$impl$u20$core..ops..IndexMut$LT$core..ops..RangeFrom$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index_mut::hc2a47196a9b3dc9f 195165 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::h32f778ca25724bf1 194314 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 194076 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h6ce9ad9125cfc58e;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h16fe3c65a4c16e46;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h84d1c44a62ed8a23;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h0c6331f8890ff8d7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::hcb451fe86918197e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h98844db7b829b7c9;std::collections::hash::map::search_hashed::hb56562c80a350a98;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::new::h610d20a99611ae46;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::at_index::h34ab787a9a6009ea;_$LT$std..collections..hash..table..RawTable$LT$K$C$$u20$V$GT$$GT$::first_bucket_raw::hb9d07d7e2fb8d059;std::collections::hash::table::calculate_offsets::hfe569e8904133a1b;core::num::_$LT$impl$u20$usize$GT$::overflowing_add::h4bf465fac5e6d437 194816 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::resize::h33edb9dae7314c90;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::offset::h83331dc01d57b6ff 194077 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;page_fault_[k] 71141 +emulator;_dl_map_object;_dl_load_cache_lookup 86339 +emulator;_dl_start_user;_dl_start 17736 +emulator;_start 716 +emulator;_start;page_fault_[k] 3646 +emulator;je_arena_ralloc_no_move 173377 +emulator;je_arena_tcache_fill_small;page_fault_[k] 70745 +emulator;je_tcache_boot 65964 diff --git a/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-jit.txt new file mode 100644 index 0000000..b4d343e --- /dev/null +++ b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-jit.txt @@ -0,0 +1,45 @@ +emulator;[unknown];_dl_name_match_p 42632 +emulator;[unknown];_dl_sysdep_start;_dl_init_paths 32156 +emulator;[unknown];_dl_sysdep_start;dl_main;__strcasecmp 52068 +emulator;[unknown];_dl_sysdep_start;dl_main;_dl_relocate_object 113074 +emulator;[unknown];strcmp 60144 +emulator;__GI_____strtoull_l_internal 72243 +emulator;__GI___readlink 66557 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 315764 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$usize$u20$as$u20$core..iter..range..Step$GT$::add_one::h0701a52b56dc0bbb 128577 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 247667 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::write::haabbb39ab969e5ac 254732 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::hfd64239413386906 160490 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h08724396296cdea6;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h72ebd1bc97b2075e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h9375446625dcf9e8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h42174e2928c223fa;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h1191ad8aa35e2822;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h2d4f8260955f00a9;_$LT$core..iter..FilterMap$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::he1189ac8e3187a50;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hb223ec6a8effeb5f;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 160789 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h185e3c12af3fc754;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::he13ccf618f424fa8;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::hf30fd19863432c7b;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h87371dcef7b54f45;_$LT$core..str..Split$LT$$u27$a$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h640ea8ab0b8e51ce;_$LT$core..str..SplitInternal$LT$$u27$a$C$$u20$P$GT$$GT$::next::h6ff90db1c517060d;_$LT$core..str..pattern..CharSearcher$LT$$u27$a$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next_match::ha7c6689628ca2406;core::str::pattern::Searcher::next_match::h3b4c786aa5e821fc;_$LT$core..str..pattern..CharEqSearcher$LT$$u27$a$C$$u20$C$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next::hbefb8ac4a49c1d1e;_$LT$core..str..CharIndices$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6d3c2b6db3f8302b;_$LT$core..str..Chars$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h3192360e451206ea;core::str::next_code_point::hc208947b28200a26 161094 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..iter..Filter$LT$I$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc46470b5838977c4;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hf6d2c4c5538b1320;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h503f07e91a8c70cc;_$LT$core..option..Option$LT$T$GT$$GT$::map::h4d3efd64a17eb7e4 186650 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3 182088 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6382d5064d2f104a;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h01cfe524df2e1837;_$LT$core..slice..Iter$LT$$u27$a$C$$u20$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::ha5ae786e76ac1132;core::ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::offset::hffec494e9fc99daf 184354 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::displacement::h23649dceee14681b;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$core..ops..Deref$GT$::deref::hf5640e419faf6aa3;_$LT$$RF$$u27$a$u20$mut$u20$T$u20$as$u20$core..ops..Deref$GT$::deref::h9629b61700da8d48 185542 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$std..collections..hash..table..Put$LT$K$C$$u20$V$GT$$GT$::borrow_table_mut::h7b43ee0d3891fd5f 178602 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;std::collections::hash::map::search_hashed::hae33740b510f48a0 180495 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_ordered::h7b9d42bf7a5f0d35 183668 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;__memmove_sse2_unaligned_erms 180014 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;_$LT$std..io..buffered..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$::read::h0092352920edf903;std::io::impls::_$LT$impl$u20$std..io..Read$u20$for$u20$$RF$$u27$a$u20$$u5b$u8$u5d$$GT$::read::he880dac0905a777b;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::split_at::h9377899ac1bb5027;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::split_at::h80c52dadb70c5280;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..RangeTo$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h9c7a1847e7ff452a;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..Range$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h4d1325c39b2e2225;core::slice::from_raw_parts::hf2d070766f9033b0 166807 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 163021 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::get_unchecked_mut::hecb03b761e9b7d9e;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::get_unchecked_mut::h49fa6b2e956b2ceb 170071 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::truncate::h2f857c8801e6ea48;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::hb94ba71a1dd47d71;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::is_null::h0535f15cf1003af9 176362 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;term::terminfo::searcher::get_dbpath_for_term::hffa8fd0e9637bc76;std::path::PathBuf::_push::h766d676eb9b04254 73671 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 183381 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40 559435 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 188406 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::mem::swap::hcb834a1162e5ad6c 183868 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::make_hash::h992d9241b64fceb7;std::collections::hash::table::make_hash::h9f03ce4a8d5d1b78;_$LT$std..collections..hash..map..DefaultHasher$u20$as$u20$core..hash..Hasher$GT$::finish::h2c804330acc776d7;_$LT$core..hash..sip..SipHasher13$u20$as$u20$core..hash..Hasher$GT$::finish::h73025af53645a0f3;_$LT$core..hash..sip..Hasher$LT$S$GT$$u20$as$u20$core..hash..Hasher$GT$::finish::ha781266cba0e4a7c;_$LT$core..hash..sip..Sip13Rounds$u20$as$u20$core..hash..sip..Sip$GT$::d_rounds::hae93b8d08d9c9a13;core::num::_$LT$impl$u20$u64$GT$::wrapping_add::h021932e4ee83e791 194103 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;core::slice::_$LT$impl$u20$core..ops..IndexMut$LT$core..ops..RangeFrom$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index_mut::hc2a47196a9b3dc9f 195165 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::h32f778ca25724bf1 194314 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 194076 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h6ce9ad9125cfc58e;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h16fe3c65a4c16e46;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h84d1c44a62ed8a23;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h0c6331f8890ff8d7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::hcb451fe86918197e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h98844db7b829b7c9;std::collections::hash::map::search_hashed::hb56562c80a350a98;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::new::h610d20a99611ae46;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::at_index::h34ab787a9a6009ea;_$LT$std..collections..hash..table..RawTable$LT$K$C$$u20$V$GT$$GT$::first_bucket_raw::hb9d07d7e2fb8d059;std::collections::hash::table::calculate_offsets::hfe569e8904133a1b;core::num::_$LT$impl$u20$usize$GT$::overflowing_add::h4bf465fac5e6d437 194816 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::resize::h33edb9dae7314c90;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::offset::h83331dc01d57b6ff 194077 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;page_fault 71141 +emulator;_dl_map_object;_dl_load_cache_lookup 86339 +emulator;_dl_start_user;_dl_start 17736 +emulator;_start 716 +emulator;_start;page_fault 3646 +emulator;je_arena_ralloc_no_move 173377 +emulator;je_arena_tcache_fill_small;page_fault 70745 +emulator;je_tcache_boot 65964 diff --git a/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-kernel.txt new file mode 100644 index 0000000..ddabc69 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-kernel.txt @@ -0,0 +1,45 @@ +emulator;[unknown];_dl_name_match_p 42632 +emulator;[unknown];_dl_sysdep_start;_dl_init_paths 32156 +emulator;[unknown];_dl_sysdep_start;dl_main;__strcasecmp 52068 +emulator;[unknown];_dl_sysdep_start;dl_main;_dl_relocate_object 113074 +emulator;[unknown];strcmp 60144 +emulator;__GI_____strtoull_l_internal 72243 +emulator;__GI___readlink 66557 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 315764 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$usize$u20$as$u20$core..iter..range..Step$GT$::add_one::h0701a52b56dc0bbb 128577 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 247667 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::write::haabbb39ab969e5ac 254732 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::hfd64239413386906 160490 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h08724396296cdea6;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h72ebd1bc97b2075e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h9375446625dcf9e8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h42174e2928c223fa;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h1191ad8aa35e2822;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h2d4f8260955f00a9;_$LT$core..iter..FilterMap$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::he1189ac8e3187a50;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hb223ec6a8effeb5f;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 160789 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h185e3c12af3fc754;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::he13ccf618f424fa8;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::hf30fd19863432c7b;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h87371dcef7b54f45;_$LT$core..str..Split$LT$$u27$a$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h640ea8ab0b8e51ce;_$LT$core..str..SplitInternal$LT$$u27$a$C$$u20$P$GT$$GT$::next::h6ff90db1c517060d;_$LT$core..str..pattern..CharSearcher$LT$$u27$a$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next_match::ha7c6689628ca2406;core::str::pattern::Searcher::next_match::h3b4c786aa5e821fc;_$LT$core..str..pattern..CharEqSearcher$LT$$u27$a$C$$u20$C$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next::hbefb8ac4a49c1d1e;_$LT$core..str..CharIndices$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6d3c2b6db3f8302b;_$LT$core..str..Chars$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h3192360e451206ea;core::str::next_code_point::hc208947b28200a26 161094 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..iter..Filter$LT$I$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc46470b5838977c4;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hf6d2c4c5538b1320;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h503f07e91a8c70cc;_$LT$core..option..Option$LT$T$GT$$GT$::map::h4d3efd64a17eb7e4 186650 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3 182088 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6382d5064d2f104a;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h01cfe524df2e1837;_$LT$core..slice..Iter$LT$$u27$a$C$$u20$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::ha5ae786e76ac1132;core::ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::offset::hffec494e9fc99daf 184354 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::displacement::h23649dceee14681b;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$core..ops..Deref$GT$::deref::hf5640e419faf6aa3;_$LT$$RF$$u27$a$u20$mut$u20$T$u20$as$u20$core..ops..Deref$GT$::deref::h9629b61700da8d48 185542 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$std..collections..hash..table..Put$LT$K$C$$u20$V$GT$$GT$::borrow_table_mut::h7b43ee0d3891fd5f 178602 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;std::collections::hash::map::search_hashed::hae33740b510f48a0 180495 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_ordered::h7b9d42bf7a5f0d35 183668 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;__memmove_sse2_unaligned_erms 180014 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;_$LT$std..io..buffered..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$::read::h0092352920edf903;std::io::impls::_$LT$impl$u20$std..io..Read$u20$for$u20$$RF$$u27$a$u20$$u5b$u8$u5d$$GT$::read::he880dac0905a777b;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::split_at::h9377899ac1bb5027;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::split_at::h80c52dadb70c5280;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..RangeTo$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h9c7a1847e7ff452a;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..Range$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h4d1325c39b2e2225;core::slice::from_raw_parts::hf2d070766f9033b0 166807 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 163021 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::get_unchecked_mut::hecb03b761e9b7d9e;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::get_unchecked_mut::h49fa6b2e956b2ceb 170071 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::truncate::h2f857c8801e6ea48;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::hb94ba71a1dd47d71;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::is_null::h0535f15cf1003af9 176362 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;term::terminfo::searcher::get_dbpath_for_term::hffa8fd0e9637bc76;std::path::PathBuf::_push::h766d676eb9b04254 73671 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 183381 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40 559435 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 188406 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::mem::swap::hcb834a1162e5ad6c 183868 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::make_hash::h992d9241b64fceb7;std::collections::hash::table::make_hash::h9f03ce4a8d5d1b78;_$LT$std..collections..hash..map..DefaultHasher$u20$as$u20$core..hash..Hasher$GT$::finish::h2c804330acc776d7;_$LT$core..hash..sip..SipHasher13$u20$as$u20$core..hash..Hasher$GT$::finish::h73025af53645a0f3;_$LT$core..hash..sip..Hasher$LT$S$GT$$u20$as$u20$core..hash..Hasher$GT$::finish::ha781266cba0e4a7c;_$LT$core..hash..sip..Sip13Rounds$u20$as$u20$core..hash..sip..Sip$GT$::d_rounds::hae93b8d08d9c9a13;core::num::_$LT$impl$u20$u64$GT$::wrapping_add::h021932e4ee83e791 194103 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;core::slice::_$LT$impl$u20$core..ops..IndexMut$LT$core..ops..RangeFrom$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index_mut::hc2a47196a9b3dc9f 195165 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::h32f778ca25724bf1 194314 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 194076 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h6ce9ad9125cfc58e;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h16fe3c65a4c16e46;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h84d1c44a62ed8a23;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h0c6331f8890ff8d7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::hcb451fe86918197e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h98844db7b829b7c9;std::collections::hash::map::search_hashed::hb56562c80a350a98;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::new::h610d20a99611ae46;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::at_index::h34ab787a9a6009ea;_$LT$std..collections..hash..table..RawTable$LT$K$C$$u20$V$GT$$GT$::first_bucket_raw::hb9d07d7e2fb8d059;std::collections::hash::table::calculate_offsets::hfe569e8904133a1b;core::num::_$LT$impl$u20$usize$GT$::overflowing_add::h4bf465fac5e6d437 194816 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::resize::h33edb9dae7314c90;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::offset::h83331dc01d57b6ff 194077 +emulator;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;page_fault_[k] 71141 +emulator;_dl_map_object;_dl_load_cache_lookup 86339 +emulator;_dl_start_user;_dl_start 17736 +emulator;_start 716 +emulator;_start;page_fault_[k] 3646 +emulator;je_arena_ralloc_no_move 173377 +emulator;je_arena_tcache_fill_small;page_fault_[k] 70745 +emulator;je_tcache_boot 65964 diff --git a/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-pid.txt new file mode 100644 index 0000000..88a21ed --- /dev/null +++ b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-pid.txt @@ -0,0 +1,45 @@ +emulator-?;[unknown];_dl_name_match_p 42632 +emulator-?;[unknown];_dl_sysdep_start;_dl_init_paths 32156 +emulator-?;[unknown];_dl_sysdep_start;dl_main;__strcasecmp 52068 +emulator-?;[unknown];_dl_sysdep_start;dl_main;_dl_relocate_object 113074 +emulator-?;[unknown];strcmp 60144 +emulator-?;__GI_____strtoull_l_internal 72243 +emulator-?;__GI___readlink 66557 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 315764 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$usize$u20$as$u20$core..iter..range..Step$GT$::add_one::h0701a52b56dc0bbb 128577 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 247667 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::write::haabbb39ab969e5ac 254732 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::hfd64239413386906 160490 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h08724396296cdea6;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h72ebd1bc97b2075e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h9375446625dcf9e8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h42174e2928c223fa;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h1191ad8aa35e2822;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h2d4f8260955f00a9;_$LT$core..iter..FilterMap$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::he1189ac8e3187a50;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hb223ec6a8effeb5f;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 160789 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h185e3c12af3fc754;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::he13ccf618f424fa8;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::hf30fd19863432c7b;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h87371dcef7b54f45;_$LT$core..str..Split$LT$$u27$a$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h640ea8ab0b8e51ce;_$LT$core..str..SplitInternal$LT$$u27$a$C$$u20$P$GT$$GT$::next::h6ff90db1c517060d;_$LT$core..str..pattern..CharSearcher$LT$$u27$a$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next_match::ha7c6689628ca2406;core::str::pattern::Searcher::next_match::h3b4c786aa5e821fc;_$LT$core..str..pattern..CharEqSearcher$LT$$u27$a$C$$u20$C$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next::hbefb8ac4a49c1d1e;_$LT$core..str..CharIndices$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6d3c2b6db3f8302b;_$LT$core..str..Chars$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h3192360e451206ea;core::str::next_code_point::hc208947b28200a26 161094 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..iter..Filter$LT$I$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc46470b5838977c4;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hf6d2c4c5538b1320;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h503f07e91a8c70cc;_$LT$core..option..Option$LT$T$GT$$GT$::map::h4d3efd64a17eb7e4 186650 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3 182088 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6382d5064d2f104a;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h01cfe524df2e1837;_$LT$core..slice..Iter$LT$$u27$a$C$$u20$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::ha5ae786e76ac1132;core::ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::offset::hffec494e9fc99daf 184354 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::displacement::h23649dceee14681b;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$core..ops..Deref$GT$::deref::hf5640e419faf6aa3;_$LT$$RF$$u27$a$u20$mut$u20$T$u20$as$u20$core..ops..Deref$GT$::deref::h9629b61700da8d48 185542 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$std..collections..hash..table..Put$LT$K$C$$u20$V$GT$$GT$::borrow_table_mut::h7b43ee0d3891fd5f 178602 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;std::collections::hash::map::search_hashed::hae33740b510f48a0 180495 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_ordered::h7b9d42bf7a5f0d35 183668 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;__memmove_sse2_unaligned_erms 180014 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;_$LT$std..io..buffered..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$::read::h0092352920edf903;std::io::impls::_$LT$impl$u20$std..io..Read$u20$for$u20$$RF$$u27$a$u20$$u5b$u8$u5d$$GT$::read::he880dac0905a777b;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::split_at::h9377899ac1bb5027;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::split_at::h80c52dadb70c5280;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..RangeTo$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h9c7a1847e7ff452a;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..Range$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h4d1325c39b2e2225;core::slice::from_raw_parts::hf2d070766f9033b0 166807 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 163021 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::get_unchecked_mut::hecb03b761e9b7d9e;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::get_unchecked_mut::h49fa6b2e956b2ceb 170071 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::truncate::h2f857c8801e6ea48;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::hb94ba71a1dd47d71;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::is_null::h0535f15cf1003af9 176362 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;term::terminfo::searcher::get_dbpath_for_term::hffa8fd0e9637bc76;std::path::PathBuf::_push::h766d676eb9b04254 73671 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 183381 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40 559435 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 188406 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::mem::swap::hcb834a1162e5ad6c 183868 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::make_hash::h992d9241b64fceb7;std::collections::hash::table::make_hash::h9f03ce4a8d5d1b78;_$LT$std..collections..hash..map..DefaultHasher$u20$as$u20$core..hash..Hasher$GT$::finish::h2c804330acc776d7;_$LT$core..hash..sip..SipHasher13$u20$as$u20$core..hash..Hasher$GT$::finish::h73025af53645a0f3;_$LT$core..hash..sip..Hasher$LT$S$GT$$u20$as$u20$core..hash..Hasher$GT$::finish::ha781266cba0e4a7c;_$LT$core..hash..sip..Sip13Rounds$u20$as$u20$core..hash..sip..Sip$GT$::d_rounds::hae93b8d08d9c9a13;core::num::_$LT$impl$u20$u64$GT$::wrapping_add::h021932e4ee83e791 194103 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;core::slice::_$LT$impl$u20$core..ops..IndexMut$LT$core..ops..RangeFrom$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index_mut::hc2a47196a9b3dc9f 195165 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::h32f778ca25724bf1 194314 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 194076 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h6ce9ad9125cfc58e;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h16fe3c65a4c16e46;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h84d1c44a62ed8a23;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h0c6331f8890ff8d7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::hcb451fe86918197e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h98844db7b829b7c9;std::collections::hash::map::search_hashed::hb56562c80a350a98;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::new::h610d20a99611ae46;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::at_index::h34ab787a9a6009ea;_$LT$std..collections..hash..table..RawTable$LT$K$C$$u20$V$GT$$GT$::first_bucket_raw::hb9d07d7e2fb8d059;std::collections::hash::table::calculate_offsets::hfe569e8904133a1b;core::num::_$LT$impl$u20$usize$GT$::overflowing_add::h4bf465fac5e6d437 194816 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::resize::h33edb9dae7314c90;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::offset::h83331dc01d57b6ff 194077 +emulator-?;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;page_fault 71141 +emulator-?;_dl_map_object;_dl_load_cache_lookup 86339 +emulator-?;_dl_start_user;_dl_start 17736 +emulator-?;_start 716 +emulator-?;_start;page_fault 3646 +emulator-?;je_arena_ralloc_no_move 173377 +emulator-?;je_arena_tcache_fill_small;page_fault 70745 +emulator-?;je_tcache_boot 65964 diff --git a/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-tid.txt new file mode 100644 index 0000000..f9aff5d --- /dev/null +++ b/tools/FlameGraph/test/results/perf-rust-Yamakaky-dcpu-collapsed-tid.txt @@ -0,0 +1,45 @@ +emulator-?/4152;[unknown];_dl_name_match_p 42632 +emulator-?/4152;[unknown];_dl_sysdep_start;_dl_init_paths 32156 +emulator-?/4152;[unknown];_dl_sysdep_start;dl_main;__strcasecmp 52068 +emulator-?/4152;[unknown];_dl_sysdep_start;dl_main;_dl_relocate_object 113074 +emulator-?/4152;[unknown];strcmp 60144 +emulator-?/4152;__GI_____strtoull_l_internal 72243 +emulator-?/4152;__GI___readlink 66557 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 315764 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$usize$u20$as$u20$core..iter..range..Step$GT$::add_one::h0701a52b56dc0bbb 128577 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 247667 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::write::haabbb39ab969e5ac 254732 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::hfd64239413386906 160490 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h08724396296cdea6;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h72ebd1bc97b2075e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h9375446625dcf9e8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h42174e2928c223fa;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h1191ad8aa35e2822;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h2d4f8260955f00a9;_$LT$core..iter..FilterMap$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::he1189ac8e3187a50;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hb223ec6a8effeb5f;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 160789 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h185e3c12af3fc754;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::he13ccf618f424fa8;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::hf30fd19863432c7b;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h87371dcef7b54f45;_$LT$core..str..Split$LT$$u27$a$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h640ea8ab0b8e51ce;_$LT$core..str..SplitInternal$LT$$u27$a$C$$u20$P$GT$$GT$::next::h6ff90db1c517060d;_$LT$core..str..pattern..CharSearcher$LT$$u27$a$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next_match::ha7c6689628ca2406;core::str::pattern::Searcher::next_match::h3b4c786aa5e821fc;_$LT$core..str..pattern..CharEqSearcher$LT$$u27$a$C$$u20$C$GT$$u20$as$u20$core..str..pattern..Searcher$LT$$u27$a$GT$$GT$::next::hbefb8ac4a49c1d1e;_$LT$core..str..CharIndices$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6d3c2b6db3f8302b;_$LT$core..str..Chars$LT$$u27$a$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h3192360e451206ea;core::str::next_code_point::hc208947b28200a26 161094 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..iter..Filter$LT$I$C$$u20$P$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc46470b5838977c4;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hf6d2c4c5538b1320;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h503f07e91a8c70cc;_$LT$core..option..Option$LT$T$GT$$GT$::map::h4d3efd64a17eb7e4 186650 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3 182088 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h7e7c4b3a79f55d8f;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5c98bd2640d176d7;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc8817fc039bbb0b3;_$LT$core..option..Option$LT$T$GT$$GT$::map::hbf38c6908f07f125;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::ha8cdcc06344fe1b5;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::hf95a5d0239e6304e;core::iter::iterator::Iterator::position::h71611bea69605be3;_$LT$core..iter..Enumerate$LT$I$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h6382d5064d2f104a;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h01cfe524df2e1837;_$LT$core..slice..Iter$LT$$u27$a$C$$u20$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::ha5ae786e76ac1132;core::ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::offset::hffec494e9fc99daf 184354 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::displacement::h23649dceee14681b;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$core..ops..Deref$GT$::deref::hf5640e419faf6aa3;_$LT$$RF$$u27$a$u20$mut$u20$T$u20$as$u20$core..ops..Deref$GT$::deref::h9629b61700da8d48 185542 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;_$LT$std..collections..hash..map..VacantEntry$LT$$u27$a$C$$u20$K$C$$u20$V$GT$$GT$::insert::h9082baf2d93a92c8;std::collections::hash::map::robin_hood::h47885a7d58732a87;_$LT$std..collections..hash..table..FullBucket$LT$K$C$$u20$V$C$$u20$M$GT$$u20$as$u20$std..collections..hash..table..Put$LT$K$C$$u20$V$GT$$GT$::borrow_table_mut::h7b43ee0d3891fd5f 178602 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h980e74df27f75c7d;std::collections::hash::map::search_hashed::hae33740b510f48a0 180495 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_ordered::h7b9d42bf7a5f0d35 183668 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::reserve::h5970cef3fb225dd7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::resize::h995383f95c6d03bf;__memmove_sse2_unaligned_erms 180014 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;_$LT$std..io..buffered..BufReader$LT$R$GT$$u20$as$u20$std..io..Read$GT$::read::h0092352920edf903;std::io::impls::_$LT$impl$u20$std..io..Read$u20$for$u20$$RF$$u27$a$u20$$u5b$u8$u5d$$GT$::read::he880dac0905a777b;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::split_at::h9377899ac1bb5027;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::split_at::h80c52dadb70c5280;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..RangeTo$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h9c7a1847e7ff452a;core::slice::_$LT$impl$u20$core..ops..Index$LT$core..ops..Range$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index::h4d1325c39b2e2225;core::slice::from_raw_parts::hf2d070766f9033b0 166807 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 163021 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;collections::slice::_$LT$impl$u20$$u5b$T$u5d$$GT$::get_unchecked_mut::hecb03b761e9b7d9e;_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$::get_unchecked_mut::h49fa6b2e956b2ceb 170071 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::truncate::h2f857c8801e6ea48;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::hb94ba71a1dd47d71;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::is_null::h0535f15cf1003af9 176362 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stderr::h99e770fdfcb59b6c;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::hcd1c44cd143417f6;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;term::terminfo::searcher::get_dbpath_for_term::hffa8fd0e9637bc76;std::path::PathBuf::_push::h766d676eb9b04254 73671 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;_$LT$u8$u20$as$u20$core..clone..Clone$GT$::clone::h7bfab8630dda96cf 183381 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40 559435 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::cmp::impls::_$LT$impl$u20$core..cmp..PartialOrd$u20$for$u20$usize$GT$::lt::hf4d08bdc2d45569c 188406 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::new::h893d205748cacdd5;_$LT$std..io..buffered..BufReader$LT$R$GT$$GT$::with_capacity::h149b1cb009d20694;collections::vec::from_elem::h0cb09490c5e14fb9;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::iter::range::_$LT$impl$u20$core..iter..iterator..Iterator$u20$for$u20$core..ops..Range$LT$A$GT$$GT$::next::hd0b7b2668add6c40;core::mem::swap::hcb834a1162e5ad6c 183868 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h3b339c4ccaa2a490;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::hfcc04b97f5e4cef8;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h3e3cdf90b15b4d33;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::hdf73438726a85d11;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::h111f2759872ecfc7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::make_hash::h992d9241b64fceb7;std::collections::hash::table::make_hash::h9f03ce4a8d5d1b78;_$LT$std..collections..hash..map..DefaultHasher$u20$as$u20$core..hash..Hasher$GT$::finish::h2c804330acc776d7;_$LT$core..hash..sip..SipHasher13$u20$as$u20$core..hash..Hasher$GT$::finish::h73025af53645a0f3;_$LT$core..hash..sip..Hasher$LT$S$GT$$u20$as$u20$core..hash..Hasher$GT$::finish::ha781266cba0e4a7c;_$LT$core..hash..sip..Sip13Rounds$u20$as$u20$core..hash..sip..Sip$GT$::d_rounds::hae93b8d08d9c9a13;core::num::_$LT$impl$u20$u64$GT$::wrapping_add::h021932e4ee83e791 194103 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h507e8ba941b3616a;_$LT$$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$..from_iter..Adapter$LT$Iter$C$$u20$E$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::hc915775adb42698d;_$LT$core..iter..Map$LT$I$C$$u20$F$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$::next::h5837a103f73c01d4;_$LT$core..option..Option$LT$T$GT$$GT$::map::h0de7409612e0b28e;core::ops::impls::_$LT$impl$u20$core..ops..FnOnce$LT$A$GT$$u20$for$u20$$RF$$u27$a$u20$mut$u20$F$GT$::call_once::h493b1835d917190a;term::terminfo::parser::compiled::parse::_$u7b$$u7b$closure$u7d$$u7d$::h503fb3ffeae6899e;term::terminfo::parser::compiled::read_le_u16::hd7bae50659ca04c4;core::slice::_$LT$impl$u20$core..ops..IndexMut$LT$core..ops..RangeFrom$LT$usize$GT$$GT$$u20$for$u20$$u5b$T$u5d$$GT$::index_mut::hc2a47196a9b3dc9f 195165 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$GT$::set_len::h32f778ca25724bf1 194314 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h53b7863e73fadbfc;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h7ad818accf02e73a;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$T$GT$$GT$::from_iter::h461e3a924bca1725;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_desugared::h5bbb8e6b5a245d7f;_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$::deref_mut::h1489b09ee24485ec 194076 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;core::iter::iterator::Iterator::collect::h6ce9ad9125cfc58e;_$LT$core..result..Result$LT$V$C$$u20$E$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$core..result..Result$LT$A$C$$u20$E$GT$$GT$$GT$::from_iter::h16fe3c65a4c16e46;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..FromIterator$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::from_iter::h84d1c44a62ed8a23;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$u20$as$u20$core..iter..traits..Extend$LT$$LP$K$C$$u20$V$RP$$GT$$GT$::extend::h0c6331f8890ff8d7;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert::hcb451fe86918197e;_$LT$std..collections..hash..map..HashMap$LT$K$C$$u20$V$C$$u20$S$GT$$GT$::insert_hashed_nocheck::h98844db7b829b7c9;std::collections::hash::map::search_hashed::hb56562c80a350a98;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::new::h610d20a99611ae46;_$LT$std..collections..hash..table..Bucket$LT$K$C$$u20$V$C$$u20$M$GT$$GT$::at_index::h34ab787a9a6009ea;_$LT$std..collections..hash..table..RawTable$LT$K$C$$u20$V$GT$$GT$::first_bucket_raw::hb9d07d7e2fb8d059;std::collections::hash::table::calculate_offsets::hfe569e8904133a1b;core::num::_$LT$impl$u20$usize$GT$::overflowing_add::h4bf465fac5e6d437 194816 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;emulator::main_ret::hc4b7fa9090639ebe;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;log::set_logger::hfce3bfc5d262a203;log::set_logger_raw::h2040ab7e0793ea3f;log::set_logger::_$u7b$$u7b$closure$u7d$$u7d$::hcb7821323b596727;simplelog::termlog::TermLogger::init::_$u7b$$u7b$closure$u7d$$u7d$::h347f6695ed91405f;simplelog::termlog::TermLogger::new::h94d15a7bc0cbc21f;term::stdout::hc71a921b9549a869;_$LT$term..terminfo..TerminfoTerminal$LT$T$GT$$GT$::new::h52a3a52cf0fd4041;term::terminfo::TermInfo::from_env::h7aa5bbfa652bcb0d;term::terminfo::TermInfo::from_name::h721edfed0d4e6840;_$LT$core..result..Result$LT$T$C$$u20$E$GT$$GT$::and_then::h47fa4b8545196b9b;term::terminfo::TermInfo::from_name::_$u7b$$u7b$closure$u7d$$u7d$::hbdb8aa57609652e0;term::terminfo::TermInfo::from_path::hc007f27f9c5301db;term::terminfo::TermInfo::_from_path::h51064971a80093cd;term::terminfo::parser::compiled::parse::h0bfa24a8d6483291;std::io::Read::read_to_end::hf3e43392e443d646;std::io::read_to_end::heeed5f53db31e2d5;_$LT$collections..vec..Vec$LT$T$GT$$GT$::resize::h33edb9dae7314c90;_$LT$collections..vec..Vec$LT$T$GT$$GT$::extend_with_element::hadc3afe1b04eb21a;core::ptr::_$LT$impl$u20$$BP$mut$u20$T$GT$::offset::h83331dc01d57b6ff 194077 +emulator-?/4152;__rust_maybe_catch_panic;emulator::main::hc2aaa9b4591a10c7;simplelog::termlog::TermLogger::init::ha7463b1622ff979e;page_fault 71141 +emulator-?/4152;_dl_map_object;_dl_load_cache_lookup 86339 +emulator-?/4152;_dl_start_user;_dl_start 17736 +emulator-?/4152;_start 716 +emulator-?/4152;_start;page_fault 3646 +emulator-?/4152;je_arena_ralloc_no_move 173377 +emulator-?/4152;je_arena_tcache_fill_small;page_fault 70745 +emulator-?/4152;je_tcache_boot 65964 diff --git a/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-addrs.txt b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-addrs.txt new file mode 100644 index 0000000..aaa6d95 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-addrs.txt @@ -0,0 +1,199 @@ +java;read;check_events;hypercall_page 1 +java;start_thread;java_start;GCTaskThread::run;ScavengeRootsTask::do_it;ClassLoaderDataGraph::oops_do;ClassLoaderData::oops_do;PSScavengeKlassClosure::do_klass 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;PSPromotionManager::drain_stacks_depth;oopDesc* PSPromotionManager::copy_to_survivor_space;InstanceKlass::oop_push_contents 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 5 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 7 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/buffer/AbstractByteBufAllocator:.directBuffer 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/buffer/AbstractReferenceCountedByteBuf:.release 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;java/util/concurrent/ConcurrentHashMap:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/mozilla/javascript/Context:.getWrapFactory 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/ScriptableObject:.getParentScope 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/WrapFactory:.wrap;java/util/HashMap:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/WrapFactory:.wrapAsJavaObject 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/WrapFactory:.wrapAsJavaObject;java/util/HashMap:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp;org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp;vtable chunks 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.name;org/mozilla/javascript/IdScriptableObject:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;org/mozilla/javascript/ScriptableObject$Slot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.has;org/mozilla/javascript/ScriptableObject:.getSlot 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.setAttributes 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/MemberBox:.invoke 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/WrapFactory:.wrap 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.findFunction 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaObject:.get 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.setAttributes 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp;org/mozilla/javascript/ScriptableObject$Slot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis;org/mozilla/javascript/NativeJavaObject:.get;java/util/HashMap:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;jint_disjoint_arraycopy 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.get 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.setAttributes 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;vtable chunks 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/NativeFunction:.initScriptFunction 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptableObject:.getParentScope 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has;org/mozilla/javascript/ScriptableObject:.getSlot 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptableObject:.getPrototype 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptableObject:.getParentScope 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/TopLevel:.getBuiltinPrototype 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/ScriptRuntime:.name;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;vtable chunks 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.setAttributes 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/TopLevel:.getBuiltinPrototype 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/ScriptRuntime:.indexFromString 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/ScriptRuntime:.setObjectElem;org/mozilla/javascript/ScriptRuntime:.indexFromString 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;io/netty/handler/codec/http/DefaultHttpHeaders:.set 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/buffer/AbstractByteBuf:.writeBytes 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/handler/codec/http/HttpObjectEncoder:.encode;io/netty/buffer/AbstractByteBuf:.writeBytes 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/handler/codec/http/HttpObjectEncoder:.encode;io/netty/buffer/AbstractByteBufAllocator:.directBuffer 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/handler/codec/http/HttpObjectEncoder:.encode;io/netty/buffer/AbstractByteBufAllocator:.directBuffer;io/netty/util/concurrent/FastThreadLocal:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/handler/codec/http/HttpObjectEncoder:.encode;java/util/ArrayList:.add 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/util/internal/RecyclableArrayList:.newInstance;io/netty/util/concurrent/FastThreadLocal:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;java/util/ArrayList:.ensureExplicitCapacity 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;vtable chunks 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/handler/codec/http/DefaultHttpHeaders:.add0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/handler/codec/http/DefaultHttpHeaders:.set 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;sun/nio/cs/UTF_8$Encoder:.;jbyte_disjoint_arraycopy 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.name;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/buffer/AbstractByteBuf:.forEachByteAsc0;io/netty/util/internal/AppendableCharSequence:.append 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpHeaders:.isTransferEncodingChunked 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;io/netty/buffer/AbstractByteBuf:.forEachByteAsc0 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;io/netty/handler/codec/http/HttpHeaders:.hash 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;io/netty/handler/codec/http/HttpObjectDecoder:.splitHeader 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;java/util/Arrays:.fill 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/AbstractReferenceCountedByteBuf:.release 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;io/netty/buffer/PooledByteBuf:.internalNioBuffer 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/NativeThread:.current 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0; 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;Java_sun_nio_ch_FileDispatcherImpl_write0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;sys_write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;fget_light 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;__srcu_read_lock 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;__tcp_push_pending_frames 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;ktime_get_real 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;skb_clone 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_set_skb_tso_segs 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_hard_start_xmit 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_pick_tx 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;dev_queue_xmit_nit 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx.part.82;xen_restore_fl_direct 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx.part.82;xen_restore_fl_direct_end 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;dma_issue_pending_all 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;__inet_lookup_established 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_event_data_recv 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;sock_def_readable;__wake_up_sync_key;check_events;hypercall_page 19 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;bictcp_acked 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;ktime_get_real;getnstimeofday 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;xen_clocksource_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;tcp_rtt_estimator 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;tcp_valid_rtt_meas;tcp_rtt_estimator 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver_finish 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;rcu_bh_qs 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;netif_skb_features 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_output 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;pvclock_clocksource_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;xen_clocksource_read;pvclock_clocksource_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;xen_clocksource_get_cycles 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;skb_dst_set_noref 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;lock_sock_nested;_raw_spin_lock_bh;local_bh_disable 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_node_track_caller 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_node_track_caller;arch_local_irq_save 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__phys_addr 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;get_slab 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;kmem_cache_alloc_node 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;ksize 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;ipv4_mtu 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_established_options 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_xmit_size_goal 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_xmit_size_goal 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;fsnotify 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;fsnotify;__srcu_read_lock 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;rw_verify_area 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;rw_verify_area;apparmor_file_permission 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;rw_verify_area;security_file_permission;apparmor_file_permission;common_file_perm 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;sock_aio_write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/SocketChannelImpl:.writerCleanup 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.writerCleanup 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/util/Recycler:.recycle 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/ChannelDuplexHandler:.flush 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;java/nio/channels/spi/AbstractInterruptibleChannel:.end 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;sys_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;do_sync_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;__kfree_skb 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_rcv_space_adjust 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;__kfree_skb;skb_release_data 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;__kfree_skb;skb_release_head_state;dst_release 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;_raw_spin_lock_bh 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;skb_copy_datagram_iovec 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;skb_copy_datagram_iovec;copy_user_enhanced_fast_string 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf;__tcp_select_window 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;rw_verify_area 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;PSIsAliveClosure::do_object_b 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;StringTable::unlink_or_oops_do 2 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;pthread_cond_signal@@GLIBC_2.3.2;system_call_fastpath;sys_futex;do_futex;futex_wake_op 1 +java;write;check_events;hypercall_page 3 diff --git a/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-all.txt b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-all.txt new file mode 100644 index 0000000..4b5f79f --- /dev/null +++ b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-all.txt @@ -0,0 +1,199 @@ +java;read;check_events_[k];hypercall_page_[k] 1 +java;start_thread;java_start;GCTaskThread::run;ScavengeRootsTask::do_it;ClassLoaderDataGraph::oops_do;ClassLoaderData::oops_do;PSScavengeKlassClosure::do_klass 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;PSPromotionManager::drain_stacks_depth;oopDesc* PSPromotionManager::copy_to_survivor_space;InstanceKlass::oop_push_contents 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 5 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 7 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];io/netty/buffer/PooledByteBuf:.internalNioBuffer_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/NativeThread:.current_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j]; 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];Java_sun_nio_ch_FileDispatcherImpl_write0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;sys_write_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];fget_light_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];__srcu_read_lock_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];__tcp_push_pending_frames_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];ktime_get_real_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];skb_clone_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_set_skb_tso_segs_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_hard_start_xmit_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_pick_tx_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];dev_queue_xmit_nit_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_end_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];dma_issue_pending_all_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];__inet_lookup_established_[k] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_event_data_recv_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];sock_def_readable_[k];__wake_up_sync_key_[k];check_events_[k];hypercall_page_[k] 19 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];bictcp_acked_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_rtt_estimator_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_valid_rtt_meas_[k];tcp_rtt_estimator_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_finish_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];rcu_bh_qs_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];netif_skb_features_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_output_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];pvclock_clocksource_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k];pvclock_clocksource_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];xen_clocksource_get_cycles_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];skb_dst_set_noref_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];lock_sock_nested_[k];_raw_spin_lock_bh_[k];local_bh_disable_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k];arch_local_irq_save_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__phys_addr_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];get_slab_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];kmem_cache_alloc_node_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];ksize_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];ipv4_mtu_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];tcp_established_options_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_xmit_size_goal_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_xmit_size_goal_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k];__srcu_read_lock_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];apparmor_file_permission_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];security_file_permission_[k];apparmor_file_permission_[k];common_file_perm_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];sock_aio_write_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/util/Recycler:.recycle_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];java/util/concurrent/ConcurrentHashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/mozilla/javascript/Context:.getWrapFactory_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j];java/util/HashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrap_[j];java/util/HashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/WrapFactory:.wrap_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.findFunction_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaObject:.get_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j];org/mozilla/javascript/NativeJavaObject:.get_[j];java/util/HashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];jint_disjoint_arraycopy_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/NativeFunction:.initScriptFunction_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getPrototype_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectElem_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];java/util/ArrayList:.add_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/util/internal/RecyclableArrayList:.newInstance_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];java/util/ArrayList:.ensureExplicitCapacity_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.add0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];sun/nio/cs/UTF_8$Encoder:._[j];jbyte_disjoint_arraycopy_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j];io/netty/util/internal/AppendableCharSequence:.append_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpHeaders:.isTransferEncodingChunked_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpHeaders:.hash_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpObjectDecoder:.splitHeader_[j] 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];java/util/Arrays:.fill_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];java/nio/channels/spi/AbstractInterruptibleChannel:.end_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;sys_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];do_sync_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];__kfree_skb_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_rcv_space_adjust_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_data_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_head_state_[k];dst_release_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];_raw_spin_lock_bh_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k];copy_user_enhanced_fast_string_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k];__tcp_select_window_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];rw_verify_area_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j] 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;PSIsAliveClosure::do_object_b 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;StringTable::unlink_or_oops_do 2 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;pthread_cond_signal@@GLIBC_2.3.2;system_call_fastpath_[k];sys_futex_[k];do_futex_[k];futex_wake_op_[k] 1 +java;write;check_events_[k];hypercall_page_[k] 3 diff --git a/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-jit.txt b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-jit.txt new file mode 100644 index 0000000..984044e --- /dev/null +++ b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-jit.txt @@ -0,0 +1,199 @@ +java;read;check_events;hypercall_page 1 +java;start_thread;java_start;GCTaskThread::run;ScavengeRootsTask::do_it;ClassLoaderDataGraph::oops_do;ClassLoaderData::oops_do;PSScavengeKlassClosure::do_klass 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;PSPromotionManager::drain_stacks_depth;oopDesc* PSPromotionManager::copy_to_survivor_space;InstanceKlass::oop_push_contents 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 5 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 7 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];io/netty/buffer/PooledByteBuf:.internalNioBuffer_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/NativeThread:.current_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j]; 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];Java_sun_nio_ch_FileDispatcherImpl_write0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;sys_write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;fget_light 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;__srcu_read_lock 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;__tcp_push_pending_frames 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;ktime_get_real 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;skb_clone 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_set_skb_tso_segs 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_hard_start_xmit 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_pick_tx 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;dev_queue_xmit_nit 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx.part.82;xen_restore_fl_direct 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx.part.82;xen_restore_fl_direct_end 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;dma_issue_pending_all 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;__inet_lookup_established 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_event_data_recv 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;sock_def_readable;__wake_up_sync_key;check_events;hypercall_page 19 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;bictcp_acked 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;ktime_get_real;getnstimeofday 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;xen_clocksource_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;tcp_rtt_estimator 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;tcp_valid_rtt_meas;tcp_rtt_estimator 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver_finish 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;rcu_bh_qs 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;netif_skb_features 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_output 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;pvclock_clocksource_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;xen_clocksource_read;pvclock_clocksource_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;xen_clocksource_get_cycles 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;skb_dst_set_noref 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;lock_sock_nested;_raw_spin_lock_bh;local_bh_disable 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_node_track_caller 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_node_track_caller;arch_local_irq_save 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__phys_addr 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;get_slab 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;kmem_cache_alloc_node 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;ksize 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;ipv4_mtu 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_established_options 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_xmit_size_goal 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_xmit_size_goal 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;fsnotify 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;fsnotify;__srcu_read_lock 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;rw_verify_area 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;rw_verify_area;apparmor_file_permission 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;rw_verify_area;security_file_permission;apparmor_file_permission;common_file_perm 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath;sys_write;vfs_write;sock_aio_write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/util/Recycler:.recycle_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];java/util/concurrent/ConcurrentHashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/mozilla/javascript/Context:.getWrapFactory_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j];java/util/HashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrap_[j];java/util/HashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/WrapFactory:.wrap_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.findFunction_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaObject:.get_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j];org/mozilla/javascript/NativeJavaObject:.get_[j];java/util/HashMap:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];jint_disjoint_arraycopy_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/NativeFunction:.initScriptFunction_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getPrototype_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectElem_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];java/util/ArrayList:.add_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/util/internal/RecyclableArrayList:.newInstance_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];java/util/ArrayList:.ensureExplicitCapacity_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];vtable chunks_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.add0_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];sun/nio/cs/UTF_8$Encoder:._[j];jbyte_disjoint_arraycopy_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j];io/netty/util/internal/AppendableCharSequence:.append_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpHeaders:.isTransferEncodingChunked_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpHeaders:.hash_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpObjectDecoder:.splitHeader_[j] 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];java/util/Arrays:.fill_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];java/nio/channels/spi/AbstractInterruptibleChannel:.end_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;sys_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;do_sync_read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;__kfree_skb 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_rcv_space_adjust 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;__kfree_skb;skb_release_data 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;__kfree_skb;skb_release_head_state;dst_release 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;_raw_spin_lock_bh 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;skb_copy_datagram_iovec 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;skb_copy_datagram_iovec;copy_user_enhanced_fast_string 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf;__tcp_select_window 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath;sys_read;vfs_read;rw_verify_area 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j] 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;PSIsAliveClosure::do_object_b 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;StringTable::unlink_or_oops_do 2 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;pthread_cond_signal@@GLIBC_2.3.2;system_call_fastpath;sys_futex;do_futex;futex_wake_op 1 +java;write;check_events;hypercall_page 3 diff --git a/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-kernel.txt b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-kernel.txt new file mode 100644 index 0000000..9d75b1e --- /dev/null +++ b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-kernel.txt @@ -0,0 +1,199 @@ +java;read;check_events_[k];hypercall_page_[k] 1 +java;start_thread;java_start;GCTaskThread::run;ScavengeRootsTask::do_it;ClassLoaderDataGraph::oops_do;ClassLoaderData::oops_do;PSScavengeKlassClosure::do_klass 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;PSPromotionManager::drain_stacks_depth;oopDesc* PSPromotionManager::copy_to_survivor_space;InstanceKlass::oop_push_contents 1 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 5 +java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 7 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/buffer/AbstractByteBufAllocator:.directBuffer 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/buffer/AbstractReferenceCountedByteBuf:.release 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;java/util/concurrent/ConcurrentHashMap:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/mozilla/javascript/Context:.getWrapFactory 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/ScriptableObject:.getParentScope 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/WrapFactory:.wrap;java/util/HashMap:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/WrapFactory:.wrapAsJavaObject 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/WrapFactory:.wrapAsJavaObject;java/util/HashMap:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp;org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp;vtable chunks 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.name;org/mozilla/javascript/IdScriptableObject:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;org/mozilla/javascript/ScriptableObject$Slot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.has;org/mozilla/javascript/ScriptableObject:.getSlot 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.setAttributes 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/MemberBox:.invoke 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/WrapFactory:.wrap 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.findFunction 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaObject:.get 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.setAttributes 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp;org/mozilla/javascript/ScriptableObject$Slot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis;org/mozilla/javascript/NativeJavaObject:.get;java/util/HashMap:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;jint_disjoint_arraycopy 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.get 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.setAttributes 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.getObjectProp;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;vtable chunks 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/NativeFunction:.initScriptFunction 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.newObject;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptableObject:.getParentScope 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has 4 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has;org/mozilla/javascript/ScriptableObject:.getSlot 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 6 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptableObject:.getPrototype 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptableObject:.getParentScope 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/TopLevel:.getBuiltinPrototype 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/ScriptRuntime:.name;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;vtable chunks 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.has;org/mozilla/javascript/ScriptableObject:.getSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/IdScriptableObject:.setAttributes 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.createFunctionActivation;org/mozilla/javascript/TopLevel:.getBuiltinPrototype 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/optimizer/OptRuntime:.call2;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.setObjectProp;org/mozilla/javascript/IdScriptableObject:.put;org/mozilla/javascript/ScriptableObject:.getSlot;org/mozilla/javascript/ScriptableObject:.createSlot 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/ScriptRuntime:.indexFromString 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/ScriptRuntime:.setObjectElem;org/mozilla/javascript/ScriptRuntime:.indexFromString 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;io/netty/handler/codec/http/DefaultHttpHeaders:.set 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/buffer/AbstractByteBuf:.writeBytes 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/handler/codec/http/HttpObjectEncoder:.encode;io/netty/buffer/AbstractByteBuf:.writeBytes 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/handler/codec/http/HttpObjectEncoder:.encode;io/netty/buffer/AbstractByteBufAllocator:.directBuffer 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/handler/codec/http/HttpObjectEncoder:.encode;io/netty/buffer/AbstractByteBufAllocator:.directBuffer;io/netty/util/concurrent/FastThreadLocal:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/handler/codec/http/HttpObjectEncoder:.encode;java/util/ArrayList:.add 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;io/netty/util/internal/RecyclableArrayList:.newInstance;io/netty/util/concurrent/FastThreadLocal:.get 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;java/util/ArrayList:.ensureExplicitCapacity 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write;io/netty/channel/AbstractChannelHandlerContext:.write;io/netty/handler/codec/MessageToMessageEncoder:.write;vtable chunks 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/channel/AbstractChannelHandlerContext:.write;org/vertx/java/core/http/impl/VertxHttpHandler:.write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/handler/codec/http/DefaultHttpHeaders:.add0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;io/netty/handler/codec/http/DefaultHttpHeaders:.set 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/NativeJavaMethod:.call;org/mozilla/javascript/MemberBox:.invoke;sun/reflect/DelegatingMethodAccessorImpl:.invoke;sun/nio/cs/UTF_8$Encoder:.;jbyte_disjoint_arraycopy 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;org/vertx/java/core/net/impl/VertxHandler:.channelRead;org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;org/mozilla/javascript/ScriptRuntime:.name;org/mozilla/javascript/ScriptRuntime:.nameOrFunction;org/mozilla/javascript/IdScriptableObject:.get;org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/buffer/AbstractByteBuf:.forEachByteAsc0;io/netty/util/internal/AppendableCharSequence:.append 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpHeaders:.isTransferEncodingChunked 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;io/netty/buffer/AbstractByteBuf:.forEachByteAsc0 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;io/netty/handler/codec/http/HttpHeaders:.hash 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;io/netty/handler/codec/http/HttpObjectDecoder:.splitHeader 5 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;io/netty/handler/codec/ByteToMessageDecoder:.channelRead;io/netty/handler/codec/http/HttpObjectDecoder:.decode;io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;java/util/Arrays:.fill 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/AbstractReferenceCountedByteBuf:.release 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;io/netty/buffer/PooledByteBuf:.internalNioBuffer 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/NativeThread:.current 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0; 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;Java_sun_nio_ch_FileDispatcherImpl_write0 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;sys_write_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];fget_light_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];__srcu_read_lock_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];__tcp_push_pending_frames_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];ktime_get_real_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];skb_clone_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_set_skb_tso_segs_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_hard_start_xmit_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_pick_tx_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];dev_queue_xmit_nit_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_end_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];dma_issue_pending_all_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];__inet_lookup_established_[k] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_event_data_recv_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];sock_def_readable_[k];__wake_up_sync_key_[k];check_events_[k];hypercall_page_[k] 19 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k] 3 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];bictcp_acked_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_rtt_estimator_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_valid_rtt_meas_[k];tcp_rtt_estimator_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_finish_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];rcu_bh_qs_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];netif_skb_features_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_output_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];pvclock_clocksource_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k];pvclock_clocksource_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];xen_clocksource_get_cycles_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];skb_dst_set_noref_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];lock_sock_nested_[k];_raw_spin_lock_bh_[k];local_bh_disable_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k];arch_local_irq_save_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__phys_addr_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];get_slab_[k] 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];kmem_cache_alloc_node_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];ksize_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];ipv4_mtu_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];tcp_established_options_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_xmit_size_goal_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_xmit_size_goal_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k];__srcu_read_lock_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];apparmor_file_permission_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];security_file_permission_[k];apparmor_file_permission_[k];common_file_perm_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];sock_aio_write_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.write;sun/nio/ch/SocketChannelImpl:.writerCleanup 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;sun/nio/ch/SocketChannelImpl:.writerCleanup 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelDuplexHandler:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/ChannelOutboundHandlerAdapter:.flush;io/netty/channel/AbstractChannelHandlerContext:.flush;io/netty/channel/DefaultChannelPipeline$HeadContext:.flush;io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;io/netty/channel/nio/AbstractNioByteChannel:.doWrite;io/netty/util/Recycler:.recycle 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;io/netty/channel/ChannelDuplexHandler:.flush 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;java/nio/channels/spi/AbstractInterruptibleChannel:.end 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read 2 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;sys_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];do_sync_read_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];__kfree_skb_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_rcv_space_adjust_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_data_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_head_state_[k];dst_release_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];_raw_spin_lock_bh_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k];copy_user_enhanced_fast_string_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k];__tcp_select_window_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;sun/nio/ch/SocketChannelImpl:.read;sun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];rw_verify_area_[k] 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete 1 +java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;io/netty/channel/nio/NioEventLoop:.run;io/netty/channel/nio/NioEventLoop:.processSelectedKeys;io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;io/netty/channel/nio/NioEventLoop:.processSelectedKey;io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;PSIsAliveClosure::do_object_b 1 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;StringTable::unlink_or_oops_do 2 +java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;pthread_cond_signal@@GLIBC_2.3.2;system_call_fastpath_[k];sys_futex_[k];do_futex_[k];futex_wake_op_[k] 1 +java;write;check_events_[k];hypercall_page_[k] 3 diff --git a/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-pid.txt b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-pid.txt new file mode 100644 index 0000000..161f1b5 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-pid.txt @@ -0,0 +1,199 @@ +java-?;read;check_events;hypercall_page 1 +java-?;start_thread;java_start;GCTaskThread::run;ScavengeRootsTask::do_it;ClassLoaderDataGraph::oops_do;ClassLoaderData::oops_do;PSScavengeKlassClosure::do_klass 1 +java-?;start_thread;java_start;GCTaskThread::run;StealTask::do_it;PSPromotionManager::drain_stacks_depth;oopDesc* PSPromotionManager::copy_to_survivor_space;InstanceKlass::oop_push_contents 1 +java-?;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 5 +java-?;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 7 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/buffer/AbstractByteBufAllocator:.directBuffer 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/buffer/AbstractReferenceCountedByteBuf:.release 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Ljava/util/concurrent/ConcurrentHashMap:.get 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/mozilla/javascript/Context:.getWrapFactory 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived 3 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/ScriptableObject:.getParentScope 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/WrapFactory:.wrap;Ljava/util/HashMap:.get 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/WrapFactory:.wrapAsJavaObject 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/WrapFactory:.wrapAsJavaObject;Ljava/util/HashMap:.get 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp;Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp;vtable chunks 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.name;Lorg/mozilla/javascript/IdScriptableObject:.get 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;Lorg/mozilla/javascript/ScriptableObject$Slot:.getValue 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.has;Lorg/mozilla/javascript/ScriptableObject:.getSlot 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.setAttributes 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/MemberBox:.invoke 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/WrapFactory:.wrap 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.findFunction 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaObject:.get 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.setAttributes 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp;Lorg/mozilla/javascript/ScriptableObject$Slot:.getValue 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis;Lorg/mozilla/javascript/NativeJavaObject:.get;Ljava/util/HashMap:.get 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.get 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.setAttributes 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 3 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;vtable chunks 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/NativeFunction:.initScriptFunction 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.get 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 6 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptableObject:.getParentScope 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;jint_disjoint_arraycopy 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has 4 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has;Lorg/mozilla/javascript/ScriptableObject:.getSlot 5 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 6 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptableObject:.getPrototype 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptableObject:.getParentScope 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/ScriptRuntime:.name;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;vtable chunks 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.setAttributes 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/ScriptRuntime:.indexFromString 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/ScriptRuntime:.setObjectElem;Lorg/mozilla/javascript/ScriptRuntime:.indexFromString 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lio/netty/handler/codec/http/DefaultHttpHeaders:.set 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke 3 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/buffer/AbstractByteBuf:.writeBytes 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/handler/codec/http/HttpObjectEncoder:.encode;Lio/netty/buffer/AbstractByteBuf:.writeBytes 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/handler/codec/http/HttpObjectEncoder:.encode;Lio/netty/buffer/AbstractByteBufAllocator:.directBuffer 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/handler/codec/http/HttpObjectEncoder:.encode;Lio/netty/buffer/AbstractByteBufAllocator:.directBuffer;Lio/netty/util/concurrent/FastThreadLocal:.get 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/handler/codec/http/HttpObjectEncoder:.encode;Ljava/util/ArrayList:.add 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/util/internal/RecyclableArrayList:.newInstance;Lio/netty/util/concurrent/FastThreadLocal:.get 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Ljava/util/ArrayList:.ensureExplicitCapacity 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;vtable chunks 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/handler/codec/http/DefaultHttpHeaders:.add0 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/handler/codec/http/DefaultHttpHeaders:.set 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lsun/nio/cs/UTF_8$Encoder:.;jbyte_disjoint_arraycopy 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.name;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/buffer/AbstractByteBuf:.forEachByteAsc0;Lio/netty/util/internal/AppendableCharSequence:.append 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpHeaders:.isTransferEncodingChunked 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;Lio/netty/buffer/AbstractByteBuf:.forEachByteAsc0 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;Lio/netty/handler/codec/http/HttpHeaders:.hash 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;Lio/netty/handler/codec/http/HttpObjectDecoder:.splitHeader 5 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;Ljava/util/Arrays:.fill 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/AbstractReferenceCountedByteBuf:.release 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lio/netty/buffer/PooledByteBuf:.internalNioBuffer 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/NativeThread:.current 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0; 3 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;Java_sun_nio_ch_FileDispatcherImpl_write0 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;sys_write 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;fget_light 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;__srcu_read_lock 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;__tcp_push_pending_frames 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;ktime_get_real 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;skb_clone 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_set_skb_tso_segs 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_hard_start_xmit 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_pick_tx 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;dev_queue_xmit_nit 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx.part.82;xen_restore_fl_direct 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx.part.82;xen_restore_fl_direct_end 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;dma_issue_pending_all 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;__inet_lookup_established 3 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_event_data_recv 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;sock_def_readable;__wake_up_sync_key;check_events;hypercall_page 19 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack 3 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;bictcp_acked 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;ktime_get_real;getnstimeofday 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;xen_clocksource_read 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;tcp_rtt_estimator 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;tcp_valid_rtt_meas;tcp_rtt_estimator 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver_finish 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;rcu_bh_qs 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;netif_skb_features 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_output 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;pvclock_clocksource_read 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;xen_clocksource_read;pvclock_clocksource_read 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;xen_clocksource_get_cycles 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;skb_dst_set_noref 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;lock_sock_nested;_raw_spin_lock_bh;local_bh_disable 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_node_track_caller 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_node_track_caller;arch_local_irq_save 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__phys_addr 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;get_slab 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;kmem_cache_alloc_node 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;ksize 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;ipv4_mtu 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_established_options 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_xmit_size_goal 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_xmit_size_goal 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;fsnotify 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;fsnotify;__srcu_read_lock 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;rw_verify_area 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;rw_verify_area;apparmor_file_permission 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;rw_verify_area;security_file_permission;apparmor_file_permission;common_file_perm 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;sock_aio_write 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/SocketChannelImpl:.writerCleanup 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.writerCleanup 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/util/Recycler:.recycle 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/ChannelDuplexHandler:.flush 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Ljava/nio/channels/spi/AbstractInterruptibleChannel:.end 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read 2 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;sys_read 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;do_sync_read 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;__kfree_skb 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_rcv_space_adjust 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;__kfree_skb;skb_release_data 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;__kfree_skb;skb_release_head_state;dst_release 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;_raw_spin_lock_bh 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;skb_copy_datagram_iovec 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;skb_copy_datagram_iovec;copy_user_enhanced_fast_string 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf;__tcp_select_window 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;rw_verify_area 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete 1 +java-?;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes 1 +java-?;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;PSIsAliveClosure::do_object_b 1 +java-?;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;StringTable::unlink_or_oops_do 2 +java-?;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;pthread_cond_signal@@GLIBC_2.3.2;system_call_fastpath;sys_futex;do_futex;futex_wake_op 1 +java-?;write;check_events;hypercall_page 3 diff --git a/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-tid.txt b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-tid.txt new file mode 100644 index 0000000..c27f0d7 --- /dev/null +++ b/tools/FlameGraph/test/results/perf-vertx-stacks-01-collapsed-tid.txt @@ -0,0 +1,209 @@ +java-?/3244;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 1 +java-?/3245;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 1 +java-?/3245;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 1 +java-?/3246;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 1 +java-?/3247;start_thread;java_start;GCTaskThread::run;ScavengeRootsTask::do_it;ClassLoaderDataGraph::oops_do;ClassLoaderData::oops_do;PSScavengeKlassClosure::do_klass 1 +java-?/3248;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 1 +java-?/3249;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 1 +java-?/3250;start_thread;java_start;GCTaskThread::run;StealTask::do_it;PSPromotionManager::drain_stacks_depth;oopDesc* PSPromotionManager::copy_to_survivor_space;InstanceKlass::oop_push_contents 1 +java-?/3251;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 1 +java-?/3252;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 1 +java-?/3253;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 1 +java-?/3254;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 1 +java-?/3255;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 1 +java-?/3256;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 1 +java-?/3257;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;PSIsAliveClosure::do_object_b 1 +java-?/3257;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;StringTable::unlink_or_oops_do 2 +java-?/3257;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;pthread_cond_signal@@GLIBC_2.3.2;system_call_fastpath;sys_futex;do_futex;futex_wake_op 1 +java-?/3278;read;check_events;hypercall_page 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/buffer/AbstractByteBufAllocator:.directBuffer 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/buffer/AbstractReferenceCountedByteBuf:.release 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Ljava/util/concurrent/ConcurrentHashMap:.get 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/mozilla/javascript/Context:.getWrapFactory 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived 3 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/ScriptableObject:.getParentScope 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/WrapFactory:.wrap;Ljava/util/HashMap:.get 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/WrapFactory:.wrapAsJavaObject 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/WrapFactory:.wrapAsJavaObject;Ljava/util/HashMap:.get 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp;Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp;vtable chunks 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.name;Lorg/mozilla/javascript/IdScriptableObject:.get 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;Lorg/mozilla/javascript/ScriptableObject$Slot:.getValue 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.has;Lorg/mozilla/javascript/ScriptableObject:.getSlot 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.setAttributes 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/MemberBox:.invoke 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/WrapFactory:.wrap 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.findFunction 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaObject:.get 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.setAttributes 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp;Lorg/mozilla/javascript/ScriptableObject$Slot:.getValue 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis;Lorg/mozilla/javascript/NativeJavaObject:.get;Ljava/util/HashMap:.get 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.get 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.setAttributes 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.getObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 3 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;vtable chunks 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/NativeFunction:.initScriptFunction 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.get 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 6 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptableObject:.getParentScope 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.newObject;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;jint_disjoint_arraycopy 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has 4 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has;Lorg/mozilla/javascript/ScriptableObject:.getSlot 5 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 6 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptableObject:.getPrototype 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptableObject:.getParentScope 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/ScriptRuntime:.name;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;vtable chunks 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.has;Lorg/mozilla/javascript/ScriptableObject:.getSlot 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/IdScriptableObject:.setAttributes 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.createFunctionActivation;Lorg/mozilla/javascript/TopLevel:.getBuiltinPrototype 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/optimizer/OptRuntime:.call2;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.setObjectProp;Lorg/mozilla/javascript/IdScriptableObject:.put;Lorg/mozilla/javascript/ScriptableObject:.getSlot;Lorg/mozilla/javascript/ScriptableObject:.createSlot 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/ScriptRuntime:.indexFromString 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/ScriptRuntime:.setObjectElem;Lorg/mozilla/javascript/ScriptRuntime:.indexFromString 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lio/netty/handler/codec/http/DefaultHttpHeaders:.set 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke 3 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/buffer/AbstractByteBuf:.writeBytes 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/handler/codec/http/HttpObjectEncoder:.encode;Lio/netty/buffer/AbstractByteBuf:.writeBytes 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/handler/codec/http/HttpObjectEncoder:.encode;Lio/netty/buffer/AbstractByteBufAllocator:.directBuffer 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/handler/codec/http/HttpObjectEncoder:.encode;Lio/netty/buffer/AbstractByteBufAllocator:.directBuffer;Lio/netty/util/concurrent/FastThreadLocal:.get 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/handler/codec/http/HttpObjectEncoder:.encode;Ljava/util/ArrayList:.add 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Lio/netty/util/internal/RecyclableArrayList:.newInstance;Lio/netty/util/concurrent/FastThreadLocal:.get 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;Ljava/util/ArrayList:.ensureExplicitCapacity 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lio/netty/handler/codec/MessageToMessageEncoder:.write;vtable chunks 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/channel/AbstractChannelHandlerContext:.write;Lorg/vertx/java/core/http/impl/VertxHttpHandler:.write 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/handler/codec/http/DefaultHttpHeaders:.add0 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lio/netty/handler/codec/http/DefaultHttpHeaders:.set 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/NativeJavaMethod:.call;Lorg/mozilla/javascript/MemberBox:.invoke;Lsun/reflect/DelegatingMethodAccessorImpl:.invoke;Lsun/nio/cs/UTF_8$Encoder:.;jbyte_disjoint_arraycopy 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lorg/vertx/java/core/net/impl/VertxHandler:.channelRead;Lorg/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call;Lorg/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0;Lorg/mozilla/javascript/ScriptRuntime:.name;Lorg/mozilla/javascript/ScriptRuntime:.nameOrFunction;Lorg/mozilla/javascript/IdScriptableObject:.get;Lorg/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/buffer/AbstractByteBuf:.forEachByteAsc0;Lio/netty/util/internal/AppendableCharSequence:.append 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpHeaders:.isTransferEncodingChunked 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;Lio/netty/buffer/AbstractByteBuf:.forEachByteAsc0 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;Lio/netty/handler/codec/http/HttpHeaders:.hash 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;Lio/netty/handler/codec/http/HttpObjectDecoder:.splitHeader 5 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelRead;Lio/netty/handler/codec/ByteToMessageDecoder:.channelRead;Lio/netty/handler/codec/http/HttpObjectDecoder:.decode;Lio/netty/handler/codec/http/HttpObjectDecoder:.readHeaders;Ljava/util/Arrays:.fill 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/AbstractReferenceCountedByteBuf:.release 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lio/netty/buffer/PooledByteBuf:.internalNioBuffer 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/NativeThread:.current 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0; 3 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;Java_sun_nio_ch_FileDispatcherImpl_write0 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;sys_write 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;fget_light 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;__srcu_read_lock 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;__tcp_push_pending_frames 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;ktime_get_real 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;skb_clone 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_set_skb_tso_segs 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_hard_start_xmit 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_pick_tx 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;dev_queue_xmit_nit 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx.part.82;xen_restore_fl_direct 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;dev_hard_start_xmit;loopback_xmit;netif_rx;netif_rx.part.82;xen_restore_fl_direct_end 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;dma_issue_pending_all 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;__inet_lookup_established 3 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_event_data_recv 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;sock_def_readable;__wake_up_sync_key;check_events;hypercall_page 19 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack 3 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;bictcp_acked 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;ktime_get_real;getnstimeofday 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;xen_clocksource_read 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;tcp_rtt_estimator 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver;ip_local_deliver_finish;tcp_v4_rcv;tcp_v4_do_rcv;tcp_rcv_established;tcp_ack;tcp_clean_rtx_queue;tcp_valid_rtt_meas;tcp_rtt_estimator 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;__do_softirq;net_rx_action;process_backlog;__netif_receive_skb;ip_rcv;ip_rcv_finish;ip_local_deliver_finish 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;local_bh_enable;do_softirq;call_softirq;rcu_bh_qs 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_local_out;ip_output;ip_finish_output;dev_queue_xmit;netif_skb_features 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ip_queue_xmit;ip_output 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;pvclock_clocksource_read 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;getnstimeofday;xen_clocksource_get_cycles;xen_clocksource_read;pvclock_clocksource_read 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;ktime_get_real;xen_clocksource_get_cycles 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;__tcp_push_pending_frames;tcp_write_xmit;tcp_transmit_skb;skb_dst_set_noref 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;lock_sock_nested;_raw_spin_lock_bh;local_bh_disable 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_node_track_caller 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__kmalloc_node_track_caller;arch_local_irq_save 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;__phys_addr 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;get_slab 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;__alloc_skb;kmem_cache_alloc_node 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;sk_stream_alloc_skb;ksize 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;ipv4_mtu 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_current_mss;tcp_established_options 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_send_mss;tcp_xmit_size_goal 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;do_sync_write;sock_aio_write;do_sock_write.isra.10;inet_sendmsg;tcp_sendmsg;tcp_xmit_size_goal 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;fsnotify 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;fsnotify;__srcu_read_lock 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;rw_verify_area 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;rw_verify_area;apparmor_file_permission 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;rw_verify_area;security_file_permission;apparmor_file_permission;common_file_perm 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/FileDispatcherImpl:.write0;write;system_call_fastpath;sys_write;vfs_write;sock_aio_write 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.write;Lsun/nio/ch/SocketChannelImpl:.writerCleanup 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes;Lsun/nio/ch/SocketChannelImpl:.writerCleanup 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelDuplexHandler:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/ChannelOutboundHandlerAdapter:.flush;Lio/netty/channel/AbstractChannelHandlerContext:.flush;Lio/netty/channel/DefaultChannelPipeline$HeadContext:.flush;Lio/netty/channel/AbstractChannel$AbstractUnsafe:.flush0;Lio/netty/channel/nio/AbstractNioByteChannel:.doWrite;Lio/netty/util/Recycler:.recycle 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete;Lio/netty/channel/ChannelDuplexHandler:.flush 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete;Lorg/vertx/java/core/net/impl/VertxHandler:.channelReadComplete 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Ljava/nio/channels/spi/AbstractInterruptibleChannel:.end 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read 2 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;sys_read 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;do_sync_read 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;__kfree_skb 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_rcv_space_adjust 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;__kfree_skb;skb_release_data 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;__kfree_skb;skb_release_head_state;dst_release 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;_raw_spin_lock_bh 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;skb_copy_datagram_iovec 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;skb_copy_datagram_iovec;copy_user_enhanced_fast_string 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;do_sync_read;sock_aio_read;sock_aio_read.part.13;do_sock_read.isra.12;inet_recvmsg;tcp_recvmsg;tcp_cleanup_rbuf;__tcp_select_window 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes;Lsun/nio/ch/SocketChannelImpl:.read;Lsun/nio/ch/FileDispatcherImpl:.read0;read;system_call_fastpath;sys_read;vfs_read;rw_verify_area 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read;Lio/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete 1 +java-?/3278;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub;Interpreter;Interpreter;Lio/netty/channel/nio/NioEventLoop:.run;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeys;Lio/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized;Lio/netty/channel/nio/NioEventLoop:.processSelectedKey;Lio/netty/channel/socket/nio/NioSocketChannel:.doReadBytes 1 +java-?/3278;write;check_events;hypercall_page 3 diff --git a/tools/android-platform-tools/linux/NOTICE.txt b/tools/android-platform-tools/linux/NOTICE.txt new file mode 100644 index 0000000..0be804a --- /dev/null +++ b/tools/android-platform-tools/linux/NOTICE.txt @@ -0,0 +1,20384 @@ +============================================================================== +Android used by: + sdk-repo-linux-platform-tools.zip + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +============================================================================== + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + +============================================================================== +Code in this repo uses one or more of the following licenses. +Refer to each file to determine which licenses apply. + +------------------------------------------------------------------------- + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +------------------------------------------------------------------------- + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +------------------------------------------------------------------------- + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +============================================================================== +BoringSSL is a fork of OpenSSL. As such, large parts of it fall under OpenSSL +licensing. Files that are completely new have a Google copyright and an ISC +license. This license is reproduced at the bottom of this file. + +Contributors to BoringSSL are required to follow the CLA rules for Chromium: +https://cla.developers.google.com/clas + +Files in third_party/ have their own licenses, as described therein. The MIT +license, for third_party/fiat, which, unlike other third_party directories, is +compiled into non-test libraries, is included below. + +The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the +OpenSSL License and the original SSLeay license apply to the toolkit. See below +for the actual license texts. Actually both licenses are BSD-style Open Source +licenses. In case of any license issues related to OpenSSL please contact +openssl-core@openssl.org. + +The following are Google-internal bug numbers where explicit permission from +some authors is recorded for use of their work. (This is purely for our own +record keeping.) + 27287199 + 27287880 + 27287883 + 263291445 + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + + +ISC license used for completely new code in BoringSSL: + +/* Copyright (c) 2015, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + + +The code in third_party/fiat carries the MIT license: + +Copyright (c) 2015-2016 the fiat-crypto authors (see +https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Licenses for support code +------------------------- + +Parts of the TLS test suite are under the Go license. This code is not included +in BoringSSL (i.e. libcrypto and libssl) when compiled, however, so +distributing code linked against BoringSSL does not trigger this license: + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +BoringSSL uses the Chromium test infrastructure to run a continuous build, +trybots etc. The scripts which manage this, and the script for generating build +metadata, are under the Chromium license. Distributing code linked against +BoringSSL does not trigger this license. + +Copyright 2015 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +============================================================================== +This package, the EXT2 filesystem utilities, are made available under +the GNU Public License version 2, with the exception of the lib/ext2fs +and lib/e2p libraries, which are made available under the GNU Library +General Public License Version 2, the lib/uuid library which is made +available under a BSD-style license and the lib/et and lib/ss +libraries which are made available under an MIT-style license. Please +see lib/uuid/COPYING for more details for the license for the files +comprising the libuuid library, and the source file headers of the +libet and libss libraries for more information. + +The most recent officially distributed version can be found at +http://e2fsprogs.sourceforge.net. If you need to make a distribution, +that's the one you should use. If there is some reason why you'd like +a more recent version that is still in ALPHA testing (i.e., either +using the "WIP" test distributions or one from the hg or git +repository from the development branch, please contact me +(tytso@mit.edu) before you ship. The release schedules for this +package are flexible, if you give me enough lead time. + + + Theodore Ts'o + 23-June-2007 + +---------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +---------------------------------------------------------------------- + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + +============================================================================== +Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper +Copyright (c) 2001-2022 Expat maintainers + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +============================================================================== +The tools for F2FS are covered by GNU Public License version 2. +Exceptionally, the following files are also covered by the GNU Lesser General +Public License Version 2.1 as the dual licenses. +- include/f2fs_fs.h +- lib/libf2fs.c +- lib/libf2fs_io.c +- mkfs/f2fs_format.c +- mkfs/f2fs_format_main.c +- mkfs/f2fs_format_utils.c +- mkfs/f2fs_format_utils.h + +================================================================================ +Copyright (c) 2012 Samsung Electronics Co., Ltd. + http://www.samsung.com/ + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +================================================================================ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +================================================================================ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + +============================================================================== +Copyright (c) 2012 - 2016, Victor Zverovich + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +Copyright (c) 2012 - present, Victor Zverovich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + +============================================================================== + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Android-specific code. == + ========================================================================= + +Android Code +Copyright 2005-2008 The Android Open Source Project + +This product includes software developed as part of +The Android Open Source Project (http://source.android.com). + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for Apache Commons code. == + ========================================================================= + +Apache Commons +Copyright 1999-2006 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for Jakarta Commons Logging. == + ========================================================================= + +Jakarta Commons Logging (JCL) +Copyright 2005,2006 The Apache Software Foundation. + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Nuance code. == + ========================================================================= + +These files are Copyright 2007 Nuance Communications, but released under +the Apache2 License. + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Media Codecs code. == + ========================================================================= + +Media Codecs +These files are Copyright 1998 - 2009 PacketVideo, but released under +the Apache2 License. + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the TagSoup code. == + ========================================================================= + +This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. + +TagSoup is licensed under the Apache License, +Version 2.0. You may obtain a copy of this license at +http://www.apache.org/licenses/LICENSE-2.0 . You may also have +additional legal rights not granted by this license. + +TagSoup is distributed in the hope that it will be useful, but +unless required by applicable law or agreed to in writing, TagSoup +is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +OF ANY KIND, either express or implied; not even the implied warranty +of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for Additional Codecs code. == + ========================================================================= + +Additional Codecs +These files are Copyright 2003-2010 VisualOn, but released under +the Apache2 License. + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Audio Effects code. == + ========================================================================= + +Audio Effects +These files are Copyright (C) 2004-2010 NXP Software and +Copyright (C) 2010 The Android Open Source Project, but released under +the Apache2 License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, +and http://www.unicode.org/cldr/data/ . Unicode Software includes any +source code published in the Unicode Standard or under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, and +http://www.unicode.org/cldr/data/. + +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA +FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY +ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF +THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, +DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2008 Unicode, Inc. All rights reserved. Distributed +under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation (the +"Data Files") or Unicode software and any associated documentation (the +"Software") to deal in the Data Files or Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, and/or sell copies of the Data Files or Software, +and to permit persons to whom the Data Files or Software are furnished to +do so, provided that (a) the above copyright notice(s) and this permission +notice appear with all copies of the Data Files or Software, (b) both the +above copyright notice(s) and this permission notice appear in associated +documentation, and (c) there is clear notice in each modified Data File +or in the Software as well as in the documentation associated with the +Data File(s) or Software that the data or software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS +INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT +OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE +OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, use +or other dealings in these Data Files or Software without prior written +authorization of the copyright holder. + +============================================================================== +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +============================================================================== +libc++ License +============================================================================== + +The libc++ library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2017 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== +============================================================================== +libc++abi License +============================================================================== + +The libc++abi library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2018 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== +============================================================================== +libc++abi License +============================================================================== + +The libc++abi library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE +========================================= + +PNG Reference Library License version 2 +--------------------------------------- + + * Copyright (c) 1995-2023 The PNG Reference Library Authors. + * Copyright (c) 2018-2023 Cosmin Truta. + * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + * Copyright (c) 1996-1997 Andreas Dilger. + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +The software is supplied "as is", without warranty of any kind, +express or implied, including, without limitation, the warranties +of merchantability, fitness for a particular purpose, title, and +non-infringement. In no event shall the Copyright owners, or +anyone distributing the software, be liable for any damages or +other liability, whether in contract, tort or otherwise, arising +from, out of, or in connection with the software, or the use or +other dealings in the software, even if advised of the possibility +of such damage. + +Permission is hereby granted to use, copy, modify, and distribute +this software, or portions hereof, for any purpose, without fee, +subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you + use this software in a product, an acknowledgment in the product + documentation would be appreciated, but is not required. + + 2. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + + +PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) +----------------------------------------------------------------------- + +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are +Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: + + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + Mandar Sahastrabuddhe + Google Inc. + Vadim Barkov + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of + the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is + with the user. + +Some files in the "contrib" directory and some configure-generated +files that are distributed with libpng have other copyright owners, and +are released under other open source licenses. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the +list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +Some files in the "scripts" directory have other copyright owners, +but are released under this license. + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing +Authors and Group 42, Inc. disclaim all warranties, expressed or +implied, including, without limitation, the warranties of +merchantability and of fitness for any purpose. The Contributing +Authors and Group 42, Inc. assume no liability for direct, indirect, +incidental, special, exemplary, or consequential damages, which may +result from the use of the PNG Reference Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + + 1. The origin of this source code must not be misrepresented. + + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, +without fee, and encourage the use of this source code as a component +to supporting the PNG file format in commercial products. If you use +this source code in a product, acknowledgment is not required but would +be appreciated. + +============================================================================== + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + +============================================================================== + + Copyright (c) 2005-2013, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Android-specific code. == + ========================================================================= + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + ========================================================================= + == NOTICE file for the x86 JIT libenc subdirectory. == + ========================================================================= + +Apache Harmony +Copyright 2006, 2010 The Apache Software Foundation. + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +Portions of Harmony were originally developed by +Intel Corporation and are licensed to the Apache Software +Foundation under the "Software Grant and Corporate Contribution +License Agreement" and for which the following copyright notices +apply + (C) Copyright 2005 Intel Corporation + (C) Copyright 2005-2006 Intel Corporation + (C) Copyright 2006 Intel Corporation + +Portions of the Apache Portable Runtime used by DRLVM were +developed at the National Center for Supercomputing Applications +(NCSA) at the University of Illinois at Urbana-Champaign. + +This software contains code derived from the RSA Data Security +Inc. MD5 Message-Digest Algorithm. + +This software contains code derived from UNIX V7, Copyright(C) +Caldera International Inc. + +============================================================================== +LZ4 Library +Copyright (c) 2011-2020, Yann Collet +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +The majority of the source code in the mDNSResponder project is licensed +under the terms of the Apache License, Version 2.0, available from: + + +To accommodate license compatibility with the widest possible range +of client code licenses, the shared library code, which is linked +at runtime into the same address space as the client using it, is +licensed under the terms of the "Three-Clause BSD License". + +The Linux Name Service Switch code, contributed by National ICT +Australia Ltd (NICTA) is licensed under the terms of the NICTA Public +Software Licence (which is substantially similar to the "Three-Clause +BSD License", with some additional language pertaining to Australian law). + +============================================================================== + + Copyright (c) 2006-2009, The Android Open Source Project + Copyright 2006, Brian Swetland + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== +// Copyright 2018 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +Notices for files contained in the tools directory: +============================================================ +Notices for file(s): +/bin/mksdcard +------------------------------------------------------------ +Copyright 2007, The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Google Inc. nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY Google Inc. ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL Google Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================ +Notices for file(s): +/framework/conscrypt-hostdex.jar +/framework/core-hostdex.jar +/framework/core-libart-hostdex.jar +/lib/libjavacore.so +/lib/libjavacrypto.so +------------------------------------------------------------ + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Android-specific code. == + ========================================================================= + +Android Code +Copyright 2005-2008 The Android Open Source Project + +This product includes software developed as part of +The Android Open Source Project (http://source.android.com). + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Apache Harmony distribution. == + ========================================================================= + +Apache Harmony +Copyright 2006 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +Portions of Harmony were originally developed by +Intel Corporation and are licensed to the Apache Software +Foundation under the "Software Grant and Corporate Contribution +License Agreement", informally known as the "Intel Harmony CLA". + + + ========================================================================= + == NOTICE file for the ICU License. == + ========================================================================= + +Copyright (c) 1995-2009 International Business Machines Corporation and others + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, provided that the above +copyright notice(s) and this permission notice appear in all copies of +the Software and that both the above copyright notice(s) and this +permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY +SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, use +or other dealings in this Software without prior written authorization +of the copyright holder. + +All trademarks and registered trademarks mentioned herein are the +property of their respective owners. + + + ========================================================================= + == NOTICE file for the JUnit License. == + ========================================================================= + +Common Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF +THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and + documentation distributed under this Agreement, and + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + + where such changes and/or additions to the Program originate + from and are distributed by that particular Contributor. A + Contribution 'originates' from a Contributor if it was added to + the Program by such Contributor itself or anyone acting on such + Contributor's behalf. Contributions do not include additions to + the Program which: (i) are separate modules of software + distributed in conjunction with the Program under their own + license agreement, and (ii) are not derivative works of the + Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor +which are necessarily infringed by the use or sale of its Contribution +alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this +Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor + hereby grants Recipient a non-exclusive, worldwide, royalty-free + copyright license to reproduce, prepare derivative works of, + publicly display, publicly perform, distribute and sublicense + the Contribution of such Contributor, if any, and such + derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor + hereby grants Recipient a non-exclusive, worldwide, royalty-free + patent license under Licensed Patents to make, use, sell, offer + to sell, import and otherwise transfer the Contribution of such + Contributor, if any, in source code and object code form. This + patent license shall apply to the combination of the + Contribution and the Program if, at the time the Contribution is + added by the Contributor, such addition of the Contribution + causes such combination to be covered by the Licensed Patents. + The patent license shall not apply to any other combinations + which include the Contribution. No hardware per se is licensed + hereunder. + + c) Recipient understands that although each Contributor grants + the licenses to its Contributions set forth herein, no + assurances are provided by any Contributor that the Program does + not infringe the patent or other intellectual property rights of + any other entity. Each Contributor disclaims any liability to + Recipient for claims brought by any other entity based on + infringement of intellectual property rights or otherwise. As a + condition to exercising the rights and licenses granted + hereunder, each Recipient hereby assumes sole responsibility to + secure any other intellectual property rights needed, if any. + For example, if a third party patent license is required to + allow Recipient to distribute the Program, it is Recipient's + responsibility to acquire that license before distributing the + Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to + grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form +under its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) states that any provisions which differ from this Agreement + are offered by that Contributor alone and not by any other + party; and + + iv) states that source code for the Program is available from + such Contributor, and informs licensees how to obtain it in a + reasonable manner on or through a medium customarily used for + software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of + the Program. + +Contributors may not remove or alter any copyright notices contained +within the Program. + +Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the +like. While this license is intended to facilitate the commercial use +of the Program, the Contributor who includes the Program in a +commercial product offering should do so in a manner which does not +create potential liability for other Contributors. Therefore, if a +Contributor includes the Program in a commercial product offering, +such Contributor ("Commercial Contributor") hereby agrees to defend +and indemnify every other Contributor ("Indemnified Contributor") +against any losses, damages and costs (collectively "Losses") arising +from claims, lawsuits and other legal actions brought by a third party +against the Indemnified Contributor to the extent caused by the acts +or omissions of such Commercial Contributor in connection with its +distribution of the Program in a commercial product offering. The +obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. +In order to qualify, an Indemnified Contributor must: a) promptly +notify the Commercial Contributor in writing of such claim, and b) +allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any such +claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY +WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement, including but not limited to +the risks and costs of program errors, compliance with applicable +laws, damage to or loss of data, programs or equipment, and +unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR +ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with +respect to a patent applicable to software (including a cross-claim or +counterclaim in a lawsuit), then any patent licenses granted by that +Contributor to such Recipient under this Agreement shall terminate as +of the date such litigation is filed. In addition, if Recipient +institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program +itself (excluding combinations of the Program with other software or +hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. IBM is the initial +Agreement Steward. IBM may assign the responsibility to serve as the +Agreement Steward to a suitable separate entity. Each new version of +the Agreement will be given a distinguishing version number. The +Program (including Contributions) may always be distributed subject to +the version of the Agreement under which it was received. In addition, +after a new version of the Agreement is published, Contributor may +elect to distribute the Program (including its Contributions) under +the new version. Except as expressly stated in Sections 2(a) and 2(b) +above, Recipient receives no rights or licenses to the intellectual +property of any Contributor under this Agreement, whether expressly, +by implication, estoppel or otherwise. All rights in the Program not +expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and +the intellectual property laws of the United States of America. No +party to this Agreement will bring a legal action under this Agreement +more than one year after the cause of action arose. Each party waives +its rights to a jury trial in any resulting litigation. + + + ========================================================================= + == NOTICE file for the KXML License. == + ========================================================================= + +Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + ========================================================================= + == NOTICE file for the SQLite Java Wrapper License. == + ========================================================================= + +This software is copyrighted by Christian Werner +and others. The following terms apply to all files associated with the +software unless explicitly disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + + + ========================================================================= + == NOTICE file for the W3C License. == + ========================================================================= + +Copyright (c) 2000 World Wide Web Consortium, (Massachusetts Institute +of Technology, Institut National de Recherche en Informatique et en +Automatique, Keio University). All Rights Reserved. This program is +distributed under the W3C's Software Intellectual Property License. +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See W3C License http://www.w3.org/Consortium/Legal/ for more details. + +============================================================ +Notices for file(s): +/usr/icu/icudt51l.dat +------------------------------------------------------------ +ICU License - ICU 1.8.1 and later + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1995-2008 International Business Machines Corporation and others + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. + +All trademarks and registered trademarks mentioned herein are the property of their respective owners. + +============================================================================== + +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + + Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, and +http://www.unicode.org/cldr/data/ . Unicode Software includes any source code +published in the Unicode Standard or under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, and +http://www.unicode.org/cldr/data/. + + NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES +("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND +AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU +DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES +OR SOFTWARE. + + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2007 Unicode, Inc. All rights reserved. Distributed under +the Terms of Use in http://www.unicode.org/copyright.html. + + Permission is hereby granted, free of charge, to any person obtaining a copy +of the Unicode data files and any associated documentation (the "Data Files") or +Unicode software and any associated documentation (the "Software") to deal in +the Data Files or Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files or +Software are furnished to do so, provided that (a) the above copyright notice(s) +and this permission notice appear with all copies of the Data Files or Software, +(b) both the above copyright notice(s) and this permission notice appear in +associated documentation, and (c) there is clear notice in each modified Data +File or in the Software as well as in the documentation associated with the Data +File(s) or Software that the data or software has been modified. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD +PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING +OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR +SOFTWARE. + + Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in these Data Files or Software without prior written authorization of the +copyright holder. + +=============================================================================== + + +/* This ICU code derived from: */ +/* +punycode.c 0.4.0 (2001-Nov-17-Sat) +http://www.cs.berkeley.edu/~amc/idn/ +Adam M. Costello +http://www.nicemice.net/amc/ + +Disclaimer and license + +Regarding this entire document or any portion of it (including +the pseudocode and C code), the author makes no guarantees and +is not responsible for any damage resulting from its use. The +author grants irrevocable permission to anyone to use, modify, +and distribute it in any way that does not diminish the rights +of anyone else to use, modify, and distribute it, provided that +redistributed derivative works do not contain misleading author or +version information. Derivative works need not be licensed under +similar terms. +*/ + + +/* +** This file is in the public domain, so clarified as of +** 2006-07-17 by Arthur David Olson. +*/ + +============================================================ +Notices for file(s): +/framework/jcommon-1.0.12.jar +/framework/jfreechart-1.0.9-swt.jar +/framework/jfreechart-1.0.9.jar +------------------------------------------------------------ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + +============================================================ +Notices for file(s): +/lib/third_party_icu_icudata_host_gyp.a +/lib/third_party_icu_icui18n_host_gyp.a +/lib/third_party_icu_icuuc_host_gyp.a +/lib/third_party_protobuf_protobuf_full_do_not_use_host_gyp.a +/lib/v8_tools_gyp_v8_base_arm_host_gyp.a +/lib/v8_tools_gyp_v8_nosnapshot_arm_host_gyp.a +/obj/GYP/shared_intermediates/mksnapshot.arm +/obj/GYP/shared_intermediates/protoc +------------------------------------------------------------ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/* Copyright (c) 2008-2009, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Kostya Serebryany + */ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Netscape Portable Runtime (NSPR). + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998-2000 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Notice that the following BSD-style license applies to the Valgrind header + files used by Chromium (valgrind.h and memcheck.h). However, the rest of + Valgrind is licensed under the terms of the GNU General Public License, + version 2, unless otherwise indicated. + + ---------------------------------------------------------------- + + Copyright (C) 2000-2008 Julian Seward. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Copyright (c) 2007 Red Hat, inc + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +Copyright 2003-2005 Colin Percival +All rights reserved + +Redistribution and use in source and binary forms, with or without +modification, are permitted providing that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2007-2009 Google Inc. + Copyright 2007-2009 WebDriver committers + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Copyright (C) 2009 by Tung Mac. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Netscape security libraries. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2000 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Netscape security libraries. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1994-2000 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +Copyright 2011, The Chromium Authors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +/* +** Copyright (c) 2007-2010 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2008, Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +(WebKit doesn't distribute an explicit license. This LICENSE is derived from +license text in the source.) + +Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007 Alexander Kellett, Alexey Proskuryakov, Alex Mathews, Allan +Sandfeld Jensen, Alp Toker, Anders Carlsson, Andrew Wellington, Antti +Koivisto, Apple Inc., Arthur Langereis, Baron Schwartz, Bjoern Graf, +Brent Fulgham, Cameron Zwarich, Charles Samuels, Christian Dywan, +Collabora Ltd., Cyrus Patel, Daniel Molkentin, Dave Maclachlan, David +Smith, Dawit Alemayehu, Dirk Mueller, Dirk Schulze, Don Gibson, Enrico +Ros, Eric Seidel, Frederik Holljen, Frerich Raabe, Friedmann Kleint, +George Staikos, Google Inc., Graham Dennis, Harri Porten, Henry Mason, +Hiroyuki Ikezoe, Holger Hans Peter Freyther, IBM, James G. Speth, Jan +Alonzo, Jean-Loup Gailly, John Reis, Jonas Witt, Jon Shier, Jonas +Witt, Julien Chaffraix, Justin Haygood, Kevin Ollivier, Kevin Watters, +Kimmo Kinnunen, Kouhei Sutou, Krzysztof Kowalczyk, Lars Knoll, Luca +Bruno, Maks Orlovich, Malte Starostik, Mark Adler, Martin Jones, +Marvin Decker, Matt Lilek, Michael Emmel, Mitz Pettel, mozilla.org, +Netscape Communications Corporation, Nicholas Shanks, Nikolas +Zimmermann, Nokia, Oliver Hunt, Opened Hand, Paul Johnston, Peter +Kelly, Pioneer Research Center USA, Rich Moore, Rob Buis, Robin Dunn, +Ronald Tschalär, Samuel Weinig, Simon Hausmann, Staikos Computing +Services Inc., Stefan Schimanski, Symantec Corporation, The Dojo +Foundation, The Karbon Developers, Thomas Boyer, Tim Copperfield, +Tobias Anton, Torben Weis, Trolltech, University of Cambridge, Vaclav +Slavik, Waldo Bastian, Xan Lopez, Zack Rusin + +The terms and conditions vary from file to file, but are one of: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + +*OR* + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. +3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + +// Copyright (C) 2002-2013 The ANGLE Project Authors. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of TransGaming Inc., Google Inc., 3DLabs Inc. +// Ltd., nor the names of their contributors may be used to endorse +// or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Copyright (c) 2012, Manfred Moitzi + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Deutsche Übersetzung: + +Copyright (c) 2012, Manfred Moitzi + +Hiermit wird unentgeltlich, jeder Person, die eine Kopie der Software +und der zugehörigen Dokumentationen (die "Software") erhält, die +Erlaubnis erteilt, uneingeschränkt zu benutzen, inklusive und ohne +Ausnahme, dem Recht, sie zu verwenden, kopieren, ändern, fusionieren, +verlegen, verbreiten, unterlizenzieren und/oder zu verkaufen, und +Personen, die diese Software erhalten, diese Rechte zu geben, unter den +folgenden Bedingungen: + +Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen +Kopien oder Teilkopien der Software beizulegen. + +DIE SOFTWARE WIRD OHNE JEDE AUSDRÜCKLICHE ODER IMPLIZIERTE GARANTIE +BEREITGESTELLT, EINSCHLIESSLICH DER GARANTIE ZUR BENUTZUNG FÜR DEN +VORGESEHENEN ODER EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER +RECHTSVERLETZUNG, JEDOCH NICHT DARAUF BESCHRÄNKT. IN KEINEM FALL SIND +DIE AUTOREN ODER COPYRIGHTINHABER FÜR JEGLICHEN SCHADEN ODER SONSTIGE +ANSPRÜCHE HAFTBAR ZU MACHEN, OB INFOLGE DER ERFÜLLUNG EINES VERTRAGES, +EINES DELIKTES ODER ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE ODER +SONSTIGER VERWENDUNG DER SOFTWARE ENTSTANDEN. + + +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] + + ---------------------------------------------------------------------- + + AMENDMENTS + + The Netscape Public License Version 1.1 ("NPL") consists of the + Mozilla Public License Version 1.1 with the following Amendments, + including Exhibit A-Netscape Public License. Files identified with + "Exhibit A-Netscape Public License" are governed by the Netscape + Public License Version 1.1. + + Additional Terms applicable to the Netscape Public License. + I. Effect. + These additional terms described in this Netscape Public + License -- Amendments shall apply to the Mozilla Communicator + client code and to all Covered Code under this License. + + II. "Netscape's Branded Code" means Covered Code that Netscape + distributes and/or permits others to distribute under one or more + trademark(s) which are controlled by Netscape but which are not + licensed for use under this License. + + III. Netscape and logo. + This License does not grant any rights to use the trademarks + "Netscape", the "Netscape N and horizon" logo or the "Netscape + lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript", + "Smart Browsing" even if such marks are included in the Original + Code or Modifications. + + IV. Inability to Comply Due to Contractual Obligation. + Prior to licensing the Original Code under this License, Netscape + has licensed third party code for use in Netscape's Branded Code. + To the extent that Netscape is limited contractually from making + such third party code available under this License, Netscape may + choose to reintegrate such code into Covered Code without being + required to distribute such code in Source Code form, even if + such code would otherwise be considered "Modifications" under + this License. + + V. Use of Modifications and Covered Code by Initial Developer. + V.1. In General. + The obligations of Section 3 apply to Netscape, except to + the extent specified in this Amendment, Section V.2 and V.3. + + V.2. Other Products. + Netscape may include Covered Code in products other than the + Netscape's Branded Code which are released by Netscape + during the two (2) years following the release date of the + Original Code, without such additional products becoming + subject to the terms of this License, and may license such + additional products on different terms from those contained + in this License. + + V.3. Alternative Licensing. + Netscape may license the Source Code of Netscape's Branded + Code, including Modifications incorporated therein, without + such Netscape Branded Code becoming subject to the terms of + this License, and may license such Netscape Branded Code on + different terms from those contained in this License. + + VI. Litigation. + Notwithstanding the limitations of Section 11 above, the + provisions regarding litigation in Section 11(a), (b) and (c) of + the License shall apply to all disputes relating to this License. + + EXHIBIT A-Netscape Public License. + + "The contents of this file are subject to the Netscape Public + License Version 1.1 (the "License"); you may not use this file + except in compliance with the License. You may obtain a copy of + the License at http://www.mozilla.org/NPL/ + + Software distributed under the License is distributed on an "AS + IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + implied. See the License for the specific language governing + rights and limitations under the License. + + The Original Code is Mozilla Communicator client code, released + March 31, 1998. + + The Initial Developer of the Original Code is Netscape + Communications Corporation. Portions created by Netscape are + Copyright (C) 1998-1999 Netscape Communications Corporation. All + Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the + terms of the _____ license (the "[___] License"), in which case + the provisions of [______] License are applicable instead of + those above. If you wish to allow use of your version of this + file only under the terms of the [____] License and not to allow + others to use your version of this file under the NPL, indicate + your decision by deleting the provisions above and replace them + with the notice and other provisions required by the [___] + License. If you do not delete the provisions above, a recipient + may use your version of this file under either the NPL or the + [___] License." + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2011 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Copyright (c) 2007-2009 IOLA and Ole Laursen + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +This software is based in part on the work of the FreeType Team. + +---------------------- + + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + http://www.freetype.org + + +--- end of FTL.TXT --- + +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + COPYRIGHTS + +Compilation copyright is held by the GPSD project. All rights reserved. + +GPSD project copyrights are assigned to the project lead, currently +Eric S. Raymond. Other portions of the GPSD code are Copyright (c) +1997, 1998, 1999, 2000, 2001, 2002 by Remco Treffkorn, and others +Copyright (c) 2005 by Eric S. Raymond. For other copyrights, see +individual files. + + BSD LICENSE + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met:

+ +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer.

+ +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution.

+ +Neither name of the GPSD project nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + +HarfBuzz is licensed under the so-called "Old MIT" license. Details follow. +For parts of HarfBuzz that are licensed under different licenses see individual +files names COPYING in subdirectories where applicable. + +Copyright © 2010,2011,2012 Google, Inc. +Copyright © 2012 Mozilla Foundation +Copyright © 2011 Codethink Limited +Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies) +Copyright © 2009 Keith Stribley +Copyright © 2009 Martin Hosken and SIL International +Copyright © 2007 Chris Wilson +Copyright © 2006 Behdad Esfahbod +Copyright © 2005 David Turner +Copyright © 2004,2007,2008,2009,2010 Red Hat, Inc. +Copyright © 1998-2004 David Turner and Werner Lemberg + +For full copyright notices consult the individual files in the package. + + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +/************************************************************************* + * + * IAccessible2 IDL Specification + * + * Copyright (c) 2007, 2010 Linux Foundation + * Copyright (c) 2006 IBM Corporation + * Copyright (c) 2000, 2006 Sun Microsystems, Inc. + * All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of the Linux Foundation nor the names of its + * contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This BSD License conforms to the Open Source Initiative "Simplified + * BSD License" as published at: + * http://www.opensource.org/licenses/bsd-license.php + * + * IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 + * mark may be used in accordance with the Linux Foundation Trademark + * Policy to indicate compliance with the IAccessible2 specification. + * + ************************************************************************/ + +LICENSE extracted from IJG's jpeg distribution: +----------------------------------------------- + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1998, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ICU License - ICU 1.8.1 and later + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1995-2010 International Business Machines Corporation and others + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Software, and to permit persons +to whom the Software is furnished to do so, provided that the above +copyright notice(s) and this permission notice appear in all copies +of the Software and that both the above copyright notice(s) and this +permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL +THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, +OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE +USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be +used in advertising or otherwise to promote the sale, use or other dealings in +this Software without prior written authorization of the copyright holder. + +All trademarks and registered trademarks mentioned herein are the property of their respective owners. + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +The following is the license for the jemalloc source code, as provided +in the initial section of the source files. + +Copyright (C) 2006-2008 Jason Evans . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice(s), this list of conditions and the following disclaimer as + the first lines of this file unmodified other than the possible + addition of one or more copyright notices. +2. Redistributions in binary form must reproduce the above copyright + notice(s), this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Copyright (c) 2007-2010 The Khronos Group Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and/or associated documentation files (the +"Materials"), to deal in the Materials without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Materials, and to +permit persons to whom the Materials are furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Materials. + +THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + + +SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) + +Copyright (C) 1992 Silicon Graphics, Inc. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice including the dates of first publication and either +this permission notice or a reference to http://oss.sgi.com/projects/FreeB/ +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SILICON +GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of Silicon Graphics, Inc. shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization from Silicon +Graphics, Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +License copied from bin/lcov: + +# +# Copyright (c) International Business Machines Corp., 2002,2007 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + +Copyright (c) 2011 The LevelDB Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* + * Copyright (c) 2008 NVIDIA, Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Copyright 2000-2007 Niels Provos +Copyright 2007-2009 Niels Provos and Nick Mathewson + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright (c) 2013, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +(Copied from the README.) + +-------------------------------------------------------------------------------- + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1998, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltconfig, ltmain.sh). Another support script, install-sh, is copyright +by M.I.T. but is also freely distributable. + +It appears that the arithmetic coding option of the JPEG spec is covered by +patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot +legally be used without obtaining one or more licenses. For this reason, +support for arithmetic coding has been removed from the free JPEG software. +(Since arithmetic coding provides only a marginal gain over the unpatented +Huffman mode, it is unlikely that very many implementations will support it.) +So far as we are aware, there are no patent restrictions on the remaining +code. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + +Copyright (C) 2011 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.2.45, July 7, 2011, are +Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.2.5 +with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the + library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is with + the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-0.96, +with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" +boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a +certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +July 7, 2011 + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sub license, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice (including the + next paragraph) shall be included in all copies or substantial portions + of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR + ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Copyright (c) 2010, Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the WebM Project. + +Google hereby grants to you a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer, and otherwise run, modify and propagate the contents of this +implementation of VP8, where such license applies only to those patent +claims, both currently owned by Google and acquired in the future, +licensable by Google that are necessarily infringed by this +implementation of VP8. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of VP8 or any code incorporated within this +implementation of VP8 constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of VP8 +shall terminate as of the date such litigation is filed. + +Except where otherwise noted in the source code (e.g. the files hash.c, +list.c and the trio files, which are covered by a similar licence but +with different Copyright notices) all the files are: + + Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is fur- +nished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- +NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- +NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of Daniel Veillard shall not +be used in advertising or otherwise to promote the sale, use or other deal- +ings in this Software without prior written authorization from him. + + +Licence for libxslt except libexslt +---------------------------------------------------------------------- + Copyright (C) 2001-2002 Daniel Veillard. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is fur- +nished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- +NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- +NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of Daniel Veillard shall not +be used in advertising or otherwise to promote the sale, use or other deal- +ings in this Software without prior written authorization from him. + +---------------------------------------------------------------------- + +Licence for libexslt +---------------------------------------------------------------------- + Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard. + All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is fur- +nished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- +NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- +NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the authors shall not +be used in advertising or otherwise to promote the sale, use or other deal- +ings in this Software without prior written authorization from him. +---------------------------------------------------------------------- + +LZMA SDK is placed in the public domain. + +Copyright (c) 2003-2009 Jonathan 'Wolf' Rentzsch: +Some rights reserved: + +The default Mesa license is as follows: + +Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +Some parts of Mesa are copyrighted under the GNU LGPL. See the +Mesa/docs/COPYRIGHT file for details. + +The following is the standard GNU copyright file. +---------------------------------------------------------------------- + + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + * MODP_B64 - High performance base64 encoder/decoder + * Version 1.3 -- 17-Mar-2006 + * http://modp.com/release/base64 + * + * Copyright (c) 2005, 2006 Nick Galbreath -- nickg [at] modp [dot] com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the modp.com nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright 2008 MolokoCacao +All rights reserved + +Redistribution and use in source and binary forms, with or without +modification, are permitted providing that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Copyright (c) 2004-2009 Sergey Lyubka +Portions Copyright (c) 2009 Gilbert Wellisch + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Copyright 2010-2011, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. +* Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Copyright (c) 2006-2009 The Chromium OS Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Version: MPL 1.1/GPL 2.0/LGPL 2.1 + +The contents of this file are subject to the Mozilla Public License Version +1.1 (the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the +License. + +The Original Code is mozilla.org code. + +The Initial Developer of the Original Code is +Netscape Communications Corporation. +Portions created by the Initial Developer are Copyright (C) 1998 +the Initial Developer. All Rights Reserved. + +Contributor(s): + +Alternatively, the contents of this file may be used under the terms of +either the GNU General Public License Version 2 or later (the "GPL"), or +the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +in which case the provisions of the GPL or the LGPL are applicable instead +of those above. If you wish to allow use of your version of this file only +under the terms of either the GPL or the LGPL, and not to allow others to +use your version of this file under the terms of the MPL, indicate your +decision by deleting the provisions above and replace them with the notice +and other provisions required by the GPL or the LGPL. If you do not delete +the provisions above, a recipient may use your version of this file under +the terms of any one of the MPL, the GPL or the LGPL. + + + Copyright (c) 2004-2012 by Mulle Kybernetik. All rights reserved. + + Permission to use, copy, modify and distribute this software and its documentation + is hereby granted, provided that both the copyright notice and this permission + notice appear in all copies of the software, derivative works or modified versions, + and any portions thereof, and that both notices appear in supporting documentation, + and that credit is given to Mulle Kybernetik in all documents and publicity + pertaining to direct or indirect use of this code or its derivatives. + + THIS IS EXPERIMENTAL SOFTWARE AND IT IS KNOWN TO HAVE BUGS, SOME OF WHICH MAY HAVE + SERIOUS CONSEQUENCES. THE COPYRIGHT HOLDER ALLOWS FREE USE OF THIS SOFTWARE IN ITS + "AS IS" CONDITION. THE COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY + DAMAGES WHATSOEVER RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE + OR OF ANY DERIVATIVE WORK. + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + + +Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic, + Jean-Marc Valin, Timothy B. Terriberry, + CSIRO, Gregory Maxwell, Mark Borgerding, + Erik de Castro Lopo + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Opus is subject to the royalty-free patent licenses which are +specified at: + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ + +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +PLY (Python Lex-Yacc) Version 3.4 + +Copyright (C) 2001-2011, +David M. Beazley (Dabeaz LLC) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the David Beazley or Dabeaz LLC may be used to + endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// Copyright (c) 2012 The Polymer Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. + +Copyright (c) 2003-2012, Michael Foord +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +qcms +Copyright (C) 2009 Mozilla Corporation +Copyright (C) 1998-2007 Marti Maria + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// Copyright (c) 2009 The RE2 Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2011 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Copyright (c) 2006 Bob Ippolito + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +// Copyright (c) 2011 Google Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +All MurmurHash source files are placed in the public domain. + +The license below applies to all other code in SMHasher: + +Copyright (c) 2011 Google, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +The author disclaims copyright to this source code. In place of +a legal notice, here is a blessing: + + May you do good and not evil. + May you find forgiveness for yourself and forgive others. + May you share freely, never taking more than you give. + +SWIG is distributed under the following terms: + +I. + +Copyright (c) 1995-1998 +The University of Utah and the Regents of the University of California +All Rights Reserved + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that +(1) The above copyright notice and the following two paragraphs +appear in all copies of the source code and (2) redistributions +including binaries reproduces these notices in the supporting +documentation. Substantial modifications to this software may be +copyrighted by their authors and need not follow the licensing terms +described here, provided that the new terms are clearly indicated in +all files where they apply. + +IN NO EVENT SHALL THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, THE +UNIVERSITY OF UTAH OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY +PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, +EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. + +THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, AND THE UNIVERSITY OF UTAH +SPECIFICALLY DISCLAIM ANY WARRANTIES,INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND +THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, +SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + + +II. + +This software includes contributions that are Copyright (c) 1998-2005 +University of Chicago. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. Redistributions +in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. Neither the name of +the University of Chicago nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF CHICAGO AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF +CHICAGO OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +III. + +This software includes contributions that are Copyright (c) 2005-2006 +Arizona Board of Regents (University of Arizona). +All Rights Reserved + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that +(1) The above copyright notice and the following two paragraphs +appear in all copies of the source code and (2) redistributions +including binaries reproduces these notices in the supporting +documentation. Substantial modifications to this software may be +copyrighted by their authors and need not follow the licensing terms +described here, provided that the new terms are clearly indicated in +all files where they apply. + +THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF ARIZONA AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF +ARIZONA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +All code here is public domain. + +Copyright (c) 2012, Linux USB Project +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +o Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +o Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +o Neither the name of the Linux USB Project nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(Copied from the COPYRIGHT file of +https://code.google.com/p/sctp-refimpl/source/browse/trunk/COPYRIGHT) +-------------------------------------------------------------------------------- + +Copyright (c) 2001, 2002 Cisco Systems, Inc. +Copyright (c) 2002-12 Randall R. Stewart +Copyright (c) 2002-12 Michael Tuexen +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +;***************************************************************************** +;* x86inc.asm +;***************************************************************************** +;* Copyright (C) 2005-2011 x264 project +;* +;* Authors: Loren Merritt +;* Anton Mitrofanov +;* Jason Garrett-Glaser +;* +;* Permission to use, copy, modify, and/or distribute this software for any +;* purpose with or without fee is hereby granted, provided that the above +;* copyright notice and this permission notice appear in all copies. +;* +;* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +;* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +;* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +;* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +;* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +;* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +;* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +;***************************************************************************** + +; This is a header file for the x264ASM assembly language, which uses +; NASM/YASM syntax combined with a large number of macros to provide easy +; abstraction between different calling conventions (x86_32, win64, linux64). +; It also has various other useful features to simplify writing the kind of +; DSP functions that are most often used in x264. + +; Unlike the rest of x264, this file is available under an ISC license, as it +; has significant usefulness outside of x264 and we want it to be available +; to the largest audience possible. Of course, if you modify it for your own +; purposes to add a new feature, we strongly encourage contributing a patch +; as this feature might be useful for others as well. Send patches or ideas +; to x264-devel@videolan.org . + +Yasm is Copyright (c) 2001-2010 Peter Johnson and other Yasm developers. + +Yasm developers and/or contributors include: + Peter Johnson + Michael Urman + Brian Gladman (Visual Studio build files, other fixes) + Stanislav Karchebny (options parser) + Mathieu Monnier (SSE4 instruction patches, NASM preprocessor additions) + Anonymous "NASM64" developer (NASM preprocessor fixes) + Stephen Polkowski (x86 instruction patches) + Henryk Richter (Mach-O object format) + Ben Skeggs (patches, bug reports) + Alexei Svitkine (GAS preprocessor) + Samuel Thibault (TASM parser and frontend) + +----------------------------------- +Yasm licensing overview and summary +----------------------------------- + +Note: This document does not provide legal advice nor is it the actual +license of any part of Yasm. See the individual licenses for complete +details. Consult a lawyer for legal advice. + +The primary license of Yasm is the 2-clause BSD license. Please use this +license if you plan on submitting code to the project. + +Yasm has absolutely no warranty; not even for merchantibility or fitness +for a particular purpose. + +------- +Libyasm +------- +Libyasm is 2-clause or 3-clause BSD licensed, with the exception of +bitvect, which is triple-licensed under the Artistic license, GPL, and +LGPL. Libyasm is thus GPL and LGPL compatible. In addition, this also +means that libyasm is free for binary-only distribution as long as the +terms of the 3-clause BSD license and Artistic license (as it applies to +bitvect) are fulfilled. + +------- +Modules +------- +The modules are 2-clause or 3-clause BSD licensed. + +--------- +Frontends +--------- +The frontends are 2-clause BSD licensed. + +------------- +License Texts +------------- +The full text of all licenses are provided in separate files in the source +distribution. Each source file may include the entire license (in the case +of the BSD and Artistic licenses), or may reference the GPL or LGPL license +file. + +BSD.txt - 2-clause and 3-clause BSD licenses +Artistic.txt - Artistic license +GNU_GPL-2.0 - GNU General Public License +GNU_LGPL-2.0 - GNU Library General Public License + +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.4, March 14th, 2010 + + Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly + Mark Adler + +*/ + +Copyright 2007, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- + +The file url_parse.cc is based on nsURLParsers.cc from Mozilla. This file is +licensed separately as follows: + +The contents of this file are subject to the Mozilla Public License Version +1.1 (the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the +License. + +The Original Code is mozilla.org code. + +The Initial Developer of the Original Code is +Netscape Communications Corporation. +Portions created by the Initial Developer are Copyright (C) 1998 +the Initial Developer. All Rights Reserved. + +Contributor(s): + Darin Fisher (original author) + +Alternatively, the contents of this file may be used under the terms of +either the GNU General Public License Version 2 or later (the "GPL"), or +the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +in which case the provisions of the GPL or the LGPL are applicable instead +of those above. If you wish to allow use of your version of this file only +under the terms of either the GPL or the LGPL, and not to allow others to +use your version of this file under the terms of the MPL, indicate your +decision by deleting the provisions above and replace them with the notice +and other provisions required by the GPL or the LGPL. If you do not delete +the provisions above, a recipient may use your version of this file under +the terms of any one of the MPL, the GPL or the LGPL. + +Copyright 2007, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- + +The file url_parse.cc is based on nsURLParsers.cc from Mozilla. This file is +licensed separately as follows: + +The contents of this file are subject to the Mozilla Public License Version +1.1 (the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the +License. + +The Original Code is mozilla.org code. + +The Initial Developer of the Original Code is +Netscape Communications Corporation. +Portions created by the Initial Developer are Copyright (C) 1998 +the Initial Developer. All Rights Reserved. + +Contributor(s): + Darin Fisher (original author) + +Alternatively, the contents of this file may be used under the terms of +either the GNU General Public License Version 2 or later (the "GPL"), or +the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +in which case the provisions of the GPL or the LGPL are applicable instead +of those above. If you wish to allow use of your version of this file only +under the terms of either the GPL or the LGPL, and not to allow others to +use your version of this file under the terms of the MPL, indicate your +decision by deleting the provisions above and replace them with the notice +and other provisions required by the GPL or the LGPL. If you do not delete +the provisions above, a recipient may use your version of this file under +the terms of any one of the MPL, the GPL or the LGPL. + +This license applies to all parts of V8 that are not externally +maintained libraries. The externally maintained libraries used by V8 +are: + + - PCRE test suite, located in + test/mjsunit/third_party/regexp-pcre.js. This is based on the + test suite from PCRE-7.3, which is copyrighted by the University + of Cambridge and Google, Inc. The copyright notice and license + are embedded in regexp-pcre.js. + + - Layout tests, located in test/mjsunit/third_party. These are + based on layout tests from webkit.org which are copyrighted by + Apple Computer, Inc. and released under a 3-clause BSD license. + + - Strongtalk assembler, the basis of the files assembler-arm-inl.h, + assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h, + assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h, + assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h, + assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h. + This code is copyrighted by Sun Microsystems Inc. and released + under a 3-clause BSD license. + + - Valgrind client API header, located at third_party/valgrind/valgrind.h + This is release under the BSD license. + +These libraries have their own licenses; we recommend you read them, +as their terms may differ from the terms below. + +Copyright 2006-2012, the V8 project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================ +Notices for file(s): +/bin/make_ext4fs +/bin/mkuserimg.sh +/lib/libext4_utils_host.a +------------------------------------------------------------ + + Copyright (c) 2010, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================ +Notices for file(s): +/lib/libsqlite_jni.so +------------------------------------------------------------ +This software is copyrighted by Christian Werner +and others. The following terms apply to all files associated with the +software unless explicitly disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +============================================================ +Notices for file(s): +/lib/libgccdemangle.so +------------------------------------------------------------ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +============================================================ +Notices for file(s): +/bin/aapt +/bin/aidl +/bin/dexdump +/bin/jasmin +/bin/split-select +/framework/android-mock-generatorlib.jar +/framework/jasmin.jar +/lib/lib64cutils.a +/lib/lib64log.a +/lib/lib64utils.a +/lib/libandroidfw.a +/lib/libcutils.a +/lib/liblog.a +/lib/liblog.so +/lib/libnativehelper.so +/lib/libsqlite3_android.a +/lib/libutils.a +/lib/libzipfile.a +------------------------------------------------------------ + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================ +Notices for file(s): +/framework/org.eclipse.core.commands_3.6.0.I20100512-1500.jar +/framework/org.eclipse.core.expressions_3.4.200.v20100505.jar +/framework/org.eclipse.core.runtime_3.6.0.v20100505.jar +/framework/org.eclipse.equinox.common_3.6.0.v20100503.jar +/framework/org.eclipse.jface_3.6.2.M20110210-1200.jar +/framework/org.eclipse.osgi_3.6.2.R36x_v20110210.jar +/framework/org.eclipse.ui.workbench.texteditor_3.6.1.r361_v20100714-0800.jar +/framework/org.eclipse.ui.workbench_3.6.2.M20110210-1200.jar +/framework/osgi.jar +/framework/propertysheet.jar +/framework/swt.jar +------------------------------------------------------------ + + Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF +THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +*1. DEFINITIONS* + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and +documentation distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and +are distributed by that particular Contributor. A Contribution +'originates' from a Contributor if it was added to the Program by such +Contributor itself or anyone acting on such Contributor's behalf. +Contributions do not include additions to the Program which: (i) are +separate modules of software distributed in conjunction with the Program +under their own license agreement, and (ii) are not derivative works of +the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +*2. GRANT OF RIGHTS* + +a) Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free copyright +license to reproduce, prepare derivative works of, publicly display, +publicly perform, distribute and sublicense the Contribution of such +Contributor, if any, and such derivative works, in source code and +object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free patent license +under Licensed Patents to make, use, sell, offer to sell, import and +otherwise transfer the Contribution of such Contributor, if any, in +source code and object code form. This patent license shall apply to the +combination of the Contribution and the Program if, at the time the +Contribution is added by the Contributor, such addition of the +Contribution causes such combination to be covered by the Licensed +Patents. The patent license shall not apply to any other combinations +which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the +licenses to its Contributions set forth herein, no assurances are +provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. Each +Contributor disclaims any liability to Recipient for claims brought by +any other entity based on infringement of intellectual property rights +or otherwise. As a condition to exercising the rights and licenses +granted hereunder, each Recipient hereby assumes sole responsibility to +secure any other intellectual property rights needed, if any. For +example, if a third party patent license is required to allow Recipient +to distribute the Program, it is Recipient's responsibility to acquire +that license before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient +copyright rights in its Contribution, if any, to grant the copyright +license set forth in this Agreement. + +*3. REQUIREMENTS* + +A Contributor may choose to distribute the Program in object code form +under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties +and conditions, express and implied, including warranties or conditions +of title and non-infringement, and implied warranties or conditions of +merchantability and fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for +damages, including direct, indirect, special, incidental and +consequential damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are +offered by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such +Contributor, and informs licensees how to obtain it in a reasonable +manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained +within the Program. + +Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution. + +*4. COMMERCIAL DISTRIBUTION* + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, the +Contributor who includes the Program in a commercial product offering +should do so in a manner which does not create potential liability for +other Contributors. Therefore, if a Contributor includes the Program in +a commercial product offering, such Contributor ("Commercial +Contributor") hereby agrees to defend and indemnify every other +Contributor ("Indemnified Contributor") against any losses, damages and +costs (collectively "Losses") arising from claims, lawsuits and other +legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the +Program in a commercial product offering. The obligations in this +section do not apply to any claims or Losses relating to any actual or +alleged intellectual property infringement. In order to qualify, an +Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial +Contributor to control, and cooperate with the Commercial Contributor +in, the defense and any related settlement negotiations. The Indemnified +Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages. + +*5. NO WARRANTY* + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED +ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES +OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR +A PARTICULAR PURPOSE. Each Recipient is solely responsible for +determining the appropriateness of using and distributing the Program +and assumes all risks associated with its exercise of rights under this +Agreement , including but not limited to the risks and costs of program +errors, compliance with applicable laws, damage to or loss of data, +programs or equipment, and unavailability or interruption of operations. + +*6. DISCLAIMER OF LIABILITY* + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR +ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +*7. GENERAL* + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further action +by the parties hereto, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including +a cross-claim or counterclaim in a lawsuit) alleging that the Program +itself (excluding combinations of the Program with other software or +hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails +to comply with any of the material terms or conditions of this Agreement +and does not cure such failure in a reasonable period of time after +becoming aware of such noncompliance. If all Recipient's rights under +this Agreement terminate, Recipient agrees to cease use and distribution +of the Program as soon as reasonably practicable. However, Recipient's +obligations under this Agreement and any licenses granted by Recipient +relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and may +only be modified in the following manner. The Agreement Steward reserves +the right to publish new versions (including revisions) of this +Agreement from time to time. No one other than the Agreement Steward has +the right to modify this Agreement. The Eclipse Foundation is the +initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is +published, Contributor may elect to distribute the Program (including +its Contributions) under the new version. Except as expressly stated in +Sections 2(a) and 2(b) above, Recipient receives no rights or licenses +to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in +the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to +this Agreement will bring a legal action under this Agreement more than +one year after the cause of action arose. Each party waives its rights +to a jury trial in any resulting litigation. + + +============================================================ +Notices for file(s): +/framework/bouncycastle-host.jar +/framework/bouncycastle-hostdex.jar +------------------------------------------------------------ +Copyright (c) 2000-2013 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +============================================================ +Notices for file(s): +/framework/commons-compress-1.0.jar +------------------------------------------------------------ +Apache Commons Compress +Copyright 2002-2009 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + +Original BZip2 classes contributed by Keiron Liddle +, Aftex Software to the Apache Ant project + +Original Tar classes from contributors of the Apache Ant project + +Original Zip classes from contributors of the Apache Ant project + +Original CPIO classes contributed by Markus Kuss and the jRPM project +(jrpm.sourceforge.net) + +============================================================ +Notices for file(s): +/lib/libbcc.so +------------------------------------------------------------ +========================== +NOTICE file for libbcc.git +========================== + +* NOTICE for lib/ExecutionEngine/, lib/ScriptCRT/, include and helper/. + + Copyright (c) 2005-2011, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + +* NOTICE for runtime/ and lib/CodeGen/. + Note: The NOTICE is the same for another git project, external/llvm.git. + +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- +Autoconf llvm/autoconf + llvm/projects/ModuleMaker/autoconf + llvm/projects/sample/autoconf +CellSPU backend llvm/lib/Target/CellSPU/README.txt +Google Test llvm/utils/unittest/googletest +OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} + + + +* NOTICE for tests/disassem.cpp and tests/disassem.h. + +/* $NetBSD: disassem.c,v 1.14 2003/03/27 16:58:36 mycroft Exp $ */ + +/*- + * Copyright (c) 1996 Mark Brinicombe. + * Copyright (c) 1996 Brini. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Brini. + * 4. The name of the company nor the name of the author may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * RiscBSD kernel project + * + * db_disasm.c + * + * Kernel disassembler + * + * Created : 10/02/96 + * + * Structured after the sparc/sparc/db_disasm.c by David S. Miller & + * Paul Kranenburg + * + * This code is not complete. Not all instructions are disassembled. + */ + +============================================================ +Notices for file(s): +/lib/libfdlibm.a +------------------------------------------------------------ +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + +Developed at SunSoft, a Sun Microsystems, Inc. business. +Permission to use, copy, modify, and distribute this +software is freely granted, provided that this notice +is preserved. + +============================================================ +Notices for file(s): +/bin/emulator-arm +/bin/emulator-mips +/bin/emulator-x86 +/bin/emulator +/bin/emulator64-arm +/bin/emulator64-mips +/bin/emulator64-x86 +/lib/emulator-common.a +/lib/emulator-libelff.a +/lib/emulator-libjpeg.a +/lib/emulator-libqemu.a +/lib/emulator-libui.a +/lib/emulator-target-arm.a +/lib/emulator-target-i386.a +/lib/emulator-target-mips.a +/lib/emulator64-common.a +/lib/emulator64-libelff.a +/lib/emulator64-libjpeg.a +/lib/emulator64-libqemu.a +/lib/emulator64-libui.a +/lib/emulator64-target-arm.a +/lib/emulator64-target-i386.a +/lib/emulator64-target-mips.a +------------------------------------------------------------ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +============================================================ +Notices for file(s): +/framework/groovy-all-1.7.0.jar +------------------------------------------------------------ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +============================================================ +Notices for file(s): +/lib/libcorkscrew.so +------------------------------------------------------------ + + Copyright (c) 2011, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================ +Notices for file(s): +/framework/liblzf.jar +------------------------------------------------------------ +Copyright (c) 2000-2009 Marc Alexander Lehmann + +Redistribution and use in source and binary forms, with or without modifica- +tion, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- +CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- +CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- +ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +Alternatively, the following files carry an additional notice that +explicitly allows relicensing under the GPLv2: lzf.c lzf.h lzfP.h lzf_c.c +lzf_d.c + + +============================================================ +Notices for file(s): +/lib/libLLVM.so +------------------------------------------------------------ +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- +Autoconf llvm/autoconf + llvm/projects/ModuleMaker/autoconf + llvm/projects/sample/autoconf +CellSPU backend llvm/lib/Target/CellSPU/README.txt +Google Test llvm/utils/unittest/googletest +OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} + +====================================================================== +== LICENSE.TXT for ./autoconf/LICENSE.TXT +====================================================================== + +------------------------------------------------------------------------------ +Autoconf Files +------------------------------------------------------------------------------ +All autoconf files are licensed under the LLVM license with the following +additions: + +llvm/autoconf/install-sh: + This script is licensed under the LLVM license, with the following + additional copyrights and restrictions: + + Copyright 1991 by the Massachusetts Institute of Technology + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of M.I.T. not be used in advertising or + publicity pertaining to distribution of the software without specific, + written prior permission. M.I.T. makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. + +Please see the source files for additional copyrights. + + +====================================================================== +== LICENSE.TXT for ./projects/sample/autoconf/LICENSE.TXT +====================================================================== + +------------------------------------------------------------------------------ +Autoconf Files +------------------------------------------------------------------------------ +All autoconf files are licensed under the LLVM license with the following +additions: + +llvm/autoconf/install-sh: + This script is licensed under the LLVM license, with the following + additional copyrights and restrictions: + + Copyright 1991 by the Massachusetts Institute of Technology + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of M.I.T. not be used in advertising or + publicity pertaining to distribution of the software without specific, + written prior permission. M.I.T. makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. + +Please see the source files for additional copyrights. + + +====================================================================== +== LICENSE.TXT for ./utils/unittest/googletest/LICENSE.TXT +====================================================================== + +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +====================================================================== +== LICENSE.TXT for ./include/llvm/Support/LICENSE.TXT +====================================================================== + +LLVM System Interface Library +------------------------------------------------------------------------------- +The LLVM System Interface Library is licensed under the Illinois Open Source +License and has the following additional copyright: + +Copyright (C) 2004 eXtensible Systems, Inc. + +============================================================ +Notices for file(s): +/framework/doclava.jar +------------------------------------------------------------ + + Copyright (C) 2010 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +====================================================================== + +jQuery 1.2.6 - New Wave Javascript + +Copyright (c) 2008 John Resig (jquery.com) +Dual licensed under the MIT (MIT-LICENSE.txt) +and GPL (GPL-LICENSE.txt) licenses. + +Copyright (c) 2009 John Resig, http://jquery.com/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +Notices for file(s): +/bin/sqlite3 +/lib/libsqlite.so +------------------------------------------------------------ +2001 September 15 + +The author disclaims copyright to this source code. In place of +a legal notice, here is a blessing: + + May you do good and not evil. + May you find forgiveness for yourself and forgive others. + May you share freely, never taking more than you give. + + +============================================================ +Notices for file(s): +/lib/libcrypto-host.so +/lib/libcrypto_static.a +/lib/libssl-host.so +------------------------------------------------------------ + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + + +============================================================ +Notices for file(s): +/lib/libexpat-host.so +/lib/libexpat.a +------------------------------------------------------------ +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +============================================================ +Notices for file(s): +/lib/libLLVMAnalysis.a +------------------------------------------------------------ +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- +Autoconf llvm/autoconf + llvm/projects/ModuleMaker/autoconf + llvm/projects/sample/autoconf +CellSPU backend llvm/lib/Target/CellSPU/README.txt +Google Test llvm/utils/unittest/googletest +OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} + +============================================================ +Notices for file(s): +/framework/emmalib.jar +------------------------------------------------------------ +Common Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S +ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was +added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules +of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative +works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, +use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the +combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered +by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + + c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the +Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other +entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole +responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the +Program, it is Recipient's responsibility to acquire that license before distributing the Program. + + d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this +Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, +and implied warranties or conditions of merchantability and fitness for a particular purpose; + + ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost +profits; + + iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + + iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium +customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the +Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the +commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other +Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a +third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a +commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to +qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate +with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor +then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this +section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, +WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for +determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to +the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this +Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any +patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes +patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other +software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a +reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the +Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following +manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the +right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new +version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under +which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new +version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal +action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. + +============================================================ +Notices for file(s): +/lib/libselinux.a +------------------------------------------------------------ +This library (libselinux) is public domain software, i.e. not copyrighted. + +Warranty Exclusion +------------------ +You agree that this software is a +non-commercially developed program that may contain "bugs" (as that +term is used in the industry) and that it may not function as intended. +The software is licensed "as is". NSA makes no, and hereby expressly +disclaims all, warranties, express, implied, statutory, or otherwise +with respect to the software, including noninfringement and the implied +warranties of merchantability and fitness for a particular purpose. + +Limitation of Liability +----------------------- +In no event will NSA be liable for any damages, including loss of data, +lost profits, cost of cover, or other special, incidental, +consequential, direct or indirect damages arising from the software or +the use thereof, however caused and on any theory of liability. This +limitation will apply even if NSA has been advised of the possibility +of such damage. You acknowledge that this is a reasonable allocation of +risk. + +============================================================ +Notices for file(s): +/framework/org-netbeans-api-visual.jar +/framework/org-openide-util.jar +------------------------------------------------------------ +The GNU General Public License (GPL) Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. + +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away +your freedom to share and change it. By contrast, the GNU +General Public License is intended to guarantee your freedom +to share and change free software--to make sure the software +is free for all its users. This General Public License +applies to most of the Free Software Foundation's software +and to any other program whose authors commit to using it. +(Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can +apply it to your programs, too. When we speak of free +software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and +charge for this service if you wish), that you receive +source code or can get it if you want it, that you can +change the software or use pieces of it in new free +programs; and that you know you can do these things. To +protect your rights, we need to make restrictions that +forbid anyone to deny you these rights or to ask you to +surrender the rights. These restrictions translate to +certain responsibilities for you if you distribute copies of +the software, or if you modify it. + +For example, if you distribute copies of such a program, +whether gratis or for a fee, you must give the recipients +all the rights that you have. You must make sure that they, +too, receive or can get the source code. And you must show +them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the +software, and (2) offer you this license which gives you +legal permission to copy, distribute and/or modify the +software. + +Also, for each author's protection and ours, we want to make +certain that everyone understands that there is no warranty +for this free software. If the software is modified by +someone else and passed on, we want its recipients to know +that what they have is not the original, so that any +problems introduced by others will not reflect on the +original authors' reputations. + +Finally, any free program is threatened constantly by +software patents. We wish to avoid the danger that +redistributors of a free program will individually obtain +patent licenses, in effect making the program proprietary. +To prevent this, we have made it clear that any patent must +be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution +and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND +MODIFICATION + +0. This License applies to any program or other work which +contains a notice placed by the copyright holder saying it +may be distributed under the terms of this General Public +License. The "Program", below, refers to any such program or +work, and a "work based on the Program" means either the +Program or any derivative work under copyright law: that is +to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into +another language. (Hereinafter, translation is included +without limitation in the term "modification".) Each +licensee is addressed as "you". + +Activities other than copying, distribution and modification +are not covered by this License; they are outside its scope. +The act of running the Program is not restricted, and the +output from the Program is covered only if its contents +constitute a work based on the Program (independent of +having been made by running the Program). Whether that is +true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the +Program's source code as you receive it, in any medium, +provided that you conspicuously and appropriately publish on +each copy an appropriate copyright notice and disclaimer of +warranty; keep intact all the notices that refer to this +License and to the absence of any warranty; and give any +other recipients of the Program a copy of this License along +with the Program. + +You may charge a fee for the physical act of transferring a +copy, and you may at your option offer warranty protection +in exchange for a fee. + +2. You may modify your copy or copies of the Program or any +portion of it, thus forming a work based on the Program, and +copy and distribute such modifications or work under the +terms of Section 1 above, provided that you also meet all of +these conditions: + +a) You must cause the modified files to carry prominent +notices stating that you changed the files and the date of +any change. + +b) You must cause any work that you distribute or publish, +that in whole or in part contains or is derived from the +Program or any part thereof, to be licensed as a whole at no +charge to all third parties under the terms of this License. + +c) If the modified program normally reads commands +interactively when run, you must cause it, when started +running for such interactive use in the most ordinary way, +to print or display an announcement including an appropriate +copyright notice and a notice that there is no warranty (or +else, saying that you provide a warranty) and that users may +redistribute the program under these conditions, and telling +the user how to view a copy of this License. (Exception: if +the Program itself is interactive but does not normally +print such an announcement, your work based on the Program +is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the +Program, and can be reasonably considered independent and +separate works in themselves, then this License, and its +terms, do not apply to those sections when you distribute +them as separate works. But when you distribute the same +sections as part of a whole which is a work based on the +Program, the distribution of the whole must be on the terms +of this License, whose permissions for other licensees +extend to the entire whole, and thus to each and every part +regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights +or contest your rights to work written entirely by you; +rather, the intent is to exercise the right to control the +distribution of derivative or collective works based on the +Program. In addition, mere aggregation of another work not +based on the Program with the Program (or with a work based +on the Program) on a volume of a storage or distribution +medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based +on it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you +also do one of the following: + +a) Accompany it with the complete corresponding +machine-readable source code, which must be distributed +under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least +three years, to give any third party, for a charge no more +than your cost of physically performing source distribution, +a complete machine-readable copy of the corresponding source +code, to be distributed under the terms of Sections 1 and 2 +above on a medium customarily used for software interchange; +or, + +c) Accompany it with the information you received as to the +offer to distribute corresponding source code. (This +alternative is allowed only for noncommercial distribution +and only if you received the program in object code or +executable form with such an offer, in accord with +Subsection b above.) + +The source code for a work means the preferred form of the +work for making modifications to it. For an executable work, +complete source code means all the source code for all +modules it contains, plus any associated interface +definition files, plus the scripts used to control +compilation and installation of the executable. However, as +a special exception, the source code distributed need not +include anything that is normally distributed (in either +source or binary form) with the major components (compiler, +kernel, and so on) of the operating system on which the +executable runs, unless that component itself accompanies +the executable. If distribution of executable or object code +is made by offering access to copy from a designated place, +then offering equivalent access to copy the source code from +the same place counts as distribution of the source code, +even though third parties are not compelled to copy the +source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the +Program except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense or distribute +the Program is void, and will automatically terminate your +rights under this License. However, parties who have +received copies, or rights, from you under this License will +not have their licenses terminated so long as such parties +remain in full compliance. + +5. You are not required to accept this License, since you +have not signed it. However, nothing else grants you +permission to modify or distribute the Program or its +derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or +distributing the Program (or any work based on the Program), +you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or +modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based +on the Program), the recipient automatically receives a +license from the original licensor to copy, distribute or +modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the +recipients' exercise of the rights granted herein. You are +not responsible for enforcing compliance by third parties to +this License. + +7. If, as a consequence of a court judgment or allegation of +patent infringement or for any other reason (not limited to +patent issues), conditions are imposed on you (whether by +court order, agreement or otherwise) that contradict the +conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as +to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a +consequence you may not distribute the Program at all. For +example, if a patent license would not permit royalty-free +redistribution of the Program by all those who receive +copies directly or indirectly through you, then the only way +you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or +unenforceable under any particular circumstance, the balance +of the section is intended to apply and the section as a +whole is intended to apply in other circumstances. It is not +the purpose of this section to induce you to infringe any +patents or other property right claims or to contest +validity of any such claims; this section has the sole +purpose of protecting the integrity of the free software +distribution system, which is implemented by public license +practices. Many people have made generous contributions to +the wide range of software distributed through that system +in reliance on consistent application of that system; it is +up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee +cannot impose that choice. + +This section is intended to make thoroughly clear what is +believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is +restricted in certain countries either by patents or by +copyrighted interfaces, the original copyright holder who +places the Program under this License may add an explicit +geographical distribution limitation excluding those +countries, so that distribution is permitted only in or +among countries not thus excluded. In such case, this +License incorporates the limitation as if written in the +body of this License. + +9. The Free Software Foundation may publish revised and/or +new versions of the General Public License from time to +time. Such new versions will be similar in spirit to the +present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If +the Program specifies a version number of this License which +applies to it and "any later version", you have the option +of following the terms and conditions either of that version +or of any later version published by the Free Software +Foundation. If the Program does not specify a version number +of this License, you may choose any version ever published +by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into +other free programs whose distribution conditions are +different, write to the author to ask for permission. For +software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we +sometimes make exceptions for this. Our decision will be +guided by the two goals of preserving the free status of all +derivatives of our free software and of promoting the +sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS +NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE +COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR +IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE +OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED +TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY +WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED +ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, +SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF +THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT +LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH +HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the +greatest possible use to the public, the best way to achieve +this is to make it free software which everyone can +redistribute and change under these terms. + +To do so, attach the following notices to the program. It is +safest to attach them to the start of each source file to +most effectively convey the exclusion of warranty; and each +file should have at least the "copyright" line and a pointer +to where the full notice is found. + +One line to give the program's name and a brief idea of what +it does. + +Copyright (C) +This program is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later +version. This program is distributed in the hope that it +will be useful, but WITHOUT ANY WARRANTY; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for +more details. You should have received a copy of the GNU +General Public License along with this program; if not, +write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and +paper mail. If the program is interactive, make it output a +short notice like this when it starts in an interactive +mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details +type `show w'. This is free software, and you are welcome to +redistribute it under certain conditions; type `show c' for +details. The hypothetical commands `show w' and `show c' +should show the appropriate parts of the General Public +License. Of course, the commands you use may be called +something other than `show w' and `show c'; they could even +be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a +programmer) or your school, if any, to sign a "copyright +disclaimer" for the program, if necessary. Here is a sample; +alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in +the program `Gnomovision' (which makes passes at compilers) +written by James Hacker. + +signature of Ty Coon, 1 April 1989 +Ty Coon, President of Vice +This General Public License does not permit incorporating +your program into proprietary programs. If your program is a +subroutine library, you may consider it more useful to +permit linking proprietary applications with the library. If +this is what you want to do, use the GNU Library General +Public License instead of this License. + +"CLASSPATH" EXCEPTION TO THE GPL VERSION 2 + +Certain source files distributed by Sun Microsystems, Inc. +are subject to the following clarification and special +exception to the GPL Version 2, but only where Sun has +expressly included in the particular source file's header +the words "Sun designates this particular file as subject +to the "Classpath" exception as provided by Sun in the +License file that accompanied this code." + + Linking this library statically or dynamically with other +modules is making a combined work based on this library. +Thus, the terms and conditions of the GNU General Public +License Version 2 cover the whole combination. + + As a special exception, the copyright holders of this +library give you permission to link this library with +independent modules to produce an executable, regardless of +the license terms of these independent modules, and to copy +and distribute the resulting executable under terms of your +choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license +of that module. An independent module is a module which is +not derived from or based on this library. If you modify +this library, you may extend this exception to your version +of the library, but you are not obligated to do so. If you +do not wish to do so, delete this exception statement from +your version. +============================================================ +Notices for file(s): +/bin/adb +------------------------------------------------------------ + + Copyright (c) 2006-2009, The Android Open Source Project + Copyright 2006, Brian Swetland + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================ +Notices for file(s): +/framework/apache-xml-hostdex.jar +------------------------------------------------------------ + ========================================================================= + == NOTICE file corresponding to section 4(d) of the Apache License, == + == Version 2.0, in this case for the Apache Xalan Java distribution. == + ========================================================================= + + Apache Xalan (Xalan XSLT processor) + Copyright 1999-2006 The Apache Software Foundation + + Apache Xalan (Xalan serializer) + Copyright 1999-2006 The Apache Software Foundation + + This product includes software developed at + The Apache Software Foundation (http://www.apache.org/). + + ========================================================================= + Portions of this software was originally based on the following: + - software copyright (c) 1999-2002, Lotus Development Corporation., + http://www.lotus.com. + - software copyright (c) 2001-2002, Sun Microsystems., + http://www.sun.com. + - software copyright (c) 2003, IBM Corporation., + http://www.ibm.com. + + ========================================================================= + The binary distribution package (ie. jars, samples and documentation) of + this product includes software developed by the following: + + - The Apache Software Foundation + - Xerces Java - see LICENSE.txt + - JAXP 1.3 APIs - see LICENSE.txt + - Bytecode Engineering Library - see LICENSE.txt + - Regular Expression - see LICENSE.txt + + - Scott Hudson, Frank Flannery, C. Scott Ananian + - CUP Parser Generator runtime (javacup\runtime) - see LICENSE.txt + + ========================================================================= + The source distribution package (ie. all source and tools required to build + Xalan Java) of this product includes software developed by the following: + + - The Apache Software Foundation + - Xerces Java - see LICENSE.txt + - JAXP 1.3 APIs - see LICENSE.txt + - Bytecode Engineering Library - see LICENSE.txt + - Regular Expression - see LICENSE.txt + - Ant - see LICENSE.txt + - Stylebook doc tool - see LICENSE.txt + + - Elliot Joel Berk and C. Scott Ananian + - Lexical Analyzer Generator (JLex) - see LICENSE.txt + + ========================================================================= + Apache Xerces Java + Copyright 1999-2006 The Apache Software Foundation + + This product includes software developed at + The Apache Software Foundation (http://www.apache.org/). + + Portions of Apache Xerces Java in xercesImpl.jar and xml-apis.jar + were originally based on the following: + - software copyright (c) 1999, IBM Corporation., http://www.ibm.com. + - software copyright (c) 1999, Sun Microsystems., http://www.sun.com. + - voluntary contributions made by Paul Eng on behalf of the + Apache Software Foundation that were originally developed at iClick, Inc., + software copyright (c) 1999. + + ========================================================================= + Apache xml-commons xml-apis (redistribution of xml-apis.jar) + + Apache XML Commons + Copyright 2001-2003,2006 The Apache Software Foundation. + + This product includes software developed at + The Apache Software Foundation (http://www.apache.org/). + + Portions of this software were originally based on the following: + - software copyright (c) 1999, IBM Corporation., http://www.ibm.com. + - software copyright (c) 1999, Sun Microsystems., http://www.sun.com. + - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org + + +============================================================ +Notices for file(s): +/bin/llvm-rs-cc +/bin/rs-spec-gen +/lib/libslang.a +------------------------------------------------------------ +========================= +NOTICE file for slang.git +========================= + + Copyright (c) 2005-2011, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + +=========================================== +NOTICE file for external/clang (clang.git). +Note: libclang*.a are statically linked. +=========================================== + +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2007-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- + + + + +========================================= +NOTICE file for external/llvm (llvm.git). +Note: libLLVM*.a are statically linked. +========================================= + +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- +Autoconf llvm/autoconf + llvm/projects/ModuleMaker/autoconf + llvm/projects/sample/autoconf +CellSPU backend llvm/lib/Target/CellSPU/README.txt +Google Test llvm/utils/unittest/googletest +OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} + +============================================================ +Notices for file(s): +/bin/minigzip +/lib/libunz.a +/lib/libz-host.so +/lib/libz.a +------------------------------------------------------------ + (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +============================================================ +Notices for file(s): +/bin/mksnapshot.arm +------------------------------------------------------------ +Copyright (c) 1994-2006 Sun Microsystems Inc. +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +- Redistribution in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of Sun Microsystems or the names of contributors may +be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The original source code covered by the above license above has been +modified significantly by Google Inc. +Copyright 2006-2008 the V8 project authors. All rights reserved. + +============================================================ +Notices for file(s): +/lib/libpng.a +------------------------------------------------------------ + +This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.2.46, July 9, 2011, are +Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.2.5 +with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the + library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is with + the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-0.96, +with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" +boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a +certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +July 9, 2011 + +============================================================ +Notices for file(s): +/framework/antlr-runtime.jar +------------------------------------------------------------ +[The "BSD license"] +Copyright (c) 201 Terence Parr +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================ +Notices for file(s): +/framework/junit.jar +------------------------------------------------------------ +Common Public License - v 1.0 + + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and +b) in the case of each subsequent Contributor: +i) changes to the Program, and +ii) additions to the Program; +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + + +"Program" means the Contributions distributed in accordance with this Agreement. + + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. +b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. +c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. +d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and +b) its license agreement: +i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; +ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; +iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and +iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. +============================================================ +Notices for file(s): +/framework/ant-glob.jar +------------------------------------------------------------ +/* + * Apache License + * Version 2.0, January 2004 + * http://www.apache.org/licenses/ + * + * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + * + * 1. Definitions. + * + * "License" shall mean the terms and conditions for use, reproduction, + * and distribution as defined by Sections 1 through 9 of this document. + * + * "Licensor" shall mean the copyright owner or entity authorized by + * the copyright owner that is granting the License. + * + * "Legal Entity" shall mean the union of the acting entity and all + * other entities that control, are controlled by, or are under common + * control with that entity. For the purposes of this definition, + * "control" means (i) the power, direct or indirect, to cause the + * direction or management of such entity, whether by contract or + * otherwise, or (ii) ownership of fifty percent (50%) or more of the + * outstanding shares, or (iii) beneficial ownership of such entity. + * + * "You" (or "Your") shall mean an individual or Legal Entity + * exercising permissions granted by this License. + * + * "Source" form shall mean the preferred form for making modifications, + * including but not limited to software source code, documentation + * source, and configuration files. + * + * "Object" form shall mean any form resulting from mechanical + * transformation or translation of a Source form, including but + * not limited to compiled object code, generated documentation, + * and conversions to other media types. + * + * "Work" shall mean the work of authorship, whether in Source or + * Object form, made available under the License, as indicated by a + * copyright notice that is included in or attached to the work + * (an example is provided in the Appendix below). + * + * "Derivative Works" shall mean any work, whether in Source or Object + * form, that is based on (or derived from) the Work and for which the + * editorial revisions, annotations, elaborations, or other modifications + * represent, as a whole, an original work of authorship. For the purposes + * of this License, Derivative Works shall not include works that remain + * separable from, or merely link (or bind by name) to the interfaces of, + * the Work and Derivative Works thereof. + * + * "Contribution" shall mean any work of authorship, including + * the original version of the Work and any modifications or additions + * to that Work or Derivative Works thereof, that is intentionally + * submitted to Licensor for inclusion in the Work by the copyright owner + * or by an individual or Legal Entity authorized to submit on behalf of + * the copyright owner. For the purposes of this definition, "submitted" + * means any form of electronic, verbal, or written communication sent + * to the Licensor or its representatives, including but not limited to + * communication on electronic mailing lists, source code control systems, + * and issue tracking systems that are managed by, or on behalf of, the + * Licensor for the purpose of discussing and improving the Work, but + * excluding communication that is conspicuously marked or otherwise + * designated in writing by the copyright owner as "Not a Contribution." + * + * "Contributor" shall mean Licensor and any individual or Legal Entity + * on behalf of whom a Contribution has been received by Licensor and + * subsequently incorporated within the Work. + * + * 2. Grant of Copyright License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * copyright license to reproduce, prepare Derivative Works of, + * publicly display, publicly perform, sublicense, and distribute the + * Work and such Derivative Works in Source or Object form. + * + * 3. Grant of Patent License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * (except as stated in this section) patent license to make, have made, + * use, offer to sell, sell, import, and otherwise transfer the Work, + * where such license applies only to those patent claims licensable + * by such Contributor that are necessarily infringed by their + * Contribution(s) alone or by combination of their Contribution(s) + * with the Work to which such Contribution(s) was submitted. If You + * institute patent litigation against any entity (including a + * cross-claim or counterclaim in a lawsuit) alleging that the Work + * or a Contribution incorporated within the Work constitutes direct + * or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate + * as of the date such litigation is filed. + * + * 4. Redistribution. You may reproduce and distribute copies of the + * Work or Derivative Works thereof in any medium, with or without + * modifications, and in Source or Object form, provided that You + * meet the following conditions: + * + * (a) You must give any other recipients of the Work or + * Derivative Works a copy of this License; and + * + * (b) You must cause any modified files to carry prominent notices + * stating that You changed the files; and + * + * (c) You must retain, in the Source form of any Derivative Works + * that You distribute, all copyright, patent, trademark, and + * attribution notices from the Source form of the Work, + * excluding those notices that do not pertain to any part of + * the Derivative Works; and + * + * (d) If the Work includes a "NOTICE" text file as part of its + * distribution, then any Derivative Works that You distribute must + * include a readable copy of the attribution notices contained + * within such NOTICE file, excluding those notices that do not + * pertain to any part of the Derivative Works, in at least one + * of the following places: within a NOTICE text file distributed + * as part of the Derivative Works; within the Source form or + * documentation, if provided along with the Derivative Works; or, + * within a display generated by the Derivative Works, if and + * wherever such third-party notices normally appear. The contents + * of the NOTICE file are for informational purposes only and + * do not modify the License. You may add Your own attribution + * notices within Derivative Works that You distribute, alongside + * or as an addendum to the NOTICE text from the Work, provided + * that such additional attribution notices cannot be construed + * as modifying the License. + * + * You may add Your own copyright statement to Your modifications and + * may provide additional or different license terms and conditions + * for use, reproduction, or distribution of Your modifications, or + * for any such Derivative Works as a whole, provided Your use, + * reproduction, and distribution of the Work otherwise complies with + * the conditions stated in this License. + * + * 5. Submission of Contributions. Unless You explicitly state otherwise, + * any Contribution intentionally submitted for inclusion in the Work + * by You to the Licensor shall be under the terms and conditions of + * this License, without any additional terms or conditions. + * Notwithstanding the above, nothing herein shall supersede or modify + * the terms of any separate license agreement you may have executed + * with Licensor regarding such Contributions. + * + * 6. Trademarks. This License does not grant permission to use the trade + * names, trademarks, service marks, or product names of the Licensor, + * except as required for reasonable and customary use in describing the + * origin of the Work and reproducing the content of the NOTICE file. + * + * 7. Disclaimer of Warranty. Unless required by applicable law or + * agreed to in writing, Licensor provides the Work (and each + * Contributor provides its Contributions) on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied, including, without limitation, any warranties or conditions + * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + * PARTICULAR PURPOSE. You are solely responsible for determining the + * appropriateness of using or redistributing the Work and assume any + * risks associated with Your exercise of permissions under this License. + * + * 8. Limitation of Liability. In no event and under no legal theory, + * whether in tort (including negligence), contract, or otherwise, + * unless required by applicable law (such as deliberate and grossly + * negligent acts) or agreed to in writing, shall any Contributor be + * liable to You for damages, including any direct, indirect, special, + * incidental, or consequential damages of any character arising as a + * result of this License or out of the use or inability to use the + * Work (including but not limited to damages for loss of goodwill, + * work stoppage, computer failure or malfunction, or any and all + * other commercial damages or losses), even if such Contributor + * has been advised of the possibility of such damages. + * + * 9. Accepting Warranty or Additional Liability. While redistributing + * the Work or Derivative Works thereof, You may choose to offer, + * and charge a fee for, acceptance of support, warranty, indemnity, + * or other liability obligations and/or rights consistent with this + * License. However, in accepting such obligations, You may act only + * on Your own behalf and on Your sole responsibility, not on behalf + * of any other Contributor, and only if You agree to indemnify, + * defend, and hold each Contributor harmless for any liability + * incurred by, or claims asserted against, such Contributor by reason + * of your accepting any such warranty or additional liability. + * + * END OF TERMS AND CONDITIONS + * + * APPENDIX: How to apply the Apache License to your work. + * + * To apply the Apache License to your work, attach the following + * boilerplate notice, with the fields enclosed by brackets "[]" + * replaced with your own identifying information. (Don't include + * the brackets!) The text should be enclosed in the appropriate + * comment syntax for the file format. We also recommend that a + * file or class name and description of purpose be included on the + * same "printed page" as the copyright notice for easier + * identification within third-party archives. + * + * Copyright [yyyy] [name of copyright owner] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +W3C® SOFTWARE NOTICE AND LICENSE +http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + +This work (and included software, documentation such as READMEs, or other +related items) is being provided by the copyright holders under the following +license. By obtaining, using and/or copying this work, you (the licensee) agree +that you have read, understood, and will comply with the following terms and +conditions. + +Permission to copy, modify, and distribute this software and its documentation, +with or without modification, for any purpose and without fee or royalty is +hereby granted, provided that you include the following on ALL copies of the +software and documentation or portions thereof, including modifications: + + 1. The full text of this NOTICE in a location viewable to users of the + redistributed or derivative work. + 2. Any pre-existing intellectual property disclaimers, notices, or terms + and conditions. If none exist, the W3C Software Short Notice should be + included (hypertext is preferred, text is permitted) within the body + of any redistributed or derivative code. + 3. Notice of any changes or modifications to the files, including the date + changes were made. (We recommend you provide URIs to the location from + which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE +NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT +THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY +PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in advertising or +publicity pertaining to the software without specific, written prior permission. +Title to copyright in this software and any associated documentation will at +all times remain with copyright holders. + +____________________________________ + +This formulation of W3C's notice and license became active on December 31 2002. +This version removes the copyright ownership notice such that this license can +be used with materials other than those owned by the W3C, reflects that ERCIM +is now a host of the W3C, includes references to this specific dated version of +the license, and removes the ambiguous grant of "use". Otherwise, this version +is the same as the previous version and is written so as to preserve the Free +Software Foundation's assessment of GPL compatibility and OSI's certification +under the Open Source Definition. Please see our Copyright FAQ for common +questions about using materials from our site, including specific terms and +conditions for packages like libwww, Amaya, and Jigsaw. Other questions about +this notice can be directed to site-policy@w3.org. + +Joseph Reagle + +This license came from: http://www.megginson.com/SAX/copying.html + However please note future versions of SAX may be covered + under http://saxproject.org/?selected=pd + +SAX2 is Free! + +I hereby abandon any property rights to SAX 2.0 (the Simple API for +XML), and release all of the SAX 2.0 source code, compiled code, and +documentation contained in this distribution into the Public Domain. +SAX comes with NO WARRANTY or guarantee of fitness for any +purpose. + +David Megginson, david@megginson.com +2000-05-05 + +============================================================ +Notices for file(s): +/lib/libclang.so +/lib/libclangAnalysis.a +------------------------------------------------------------ +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2007-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- + + +============================================================ +Notices for file(s): +/framework/guavalib.jar +------------------------------------------------------------ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +============================================================ +Notices for file(s): +/core-lambda-stubs.jar +------------------------------------------------------------ +The GNU General Public License (GPL) + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you +can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must +make sure that they, too, receive or can get the source code. And you must +show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program proprietary. +To prevent this, we have made it clear that any patent must be licensed for +everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included +without limitation in the term "modification".) Each licensee is addressed as +"you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is +not restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as +you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the +Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may +at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus +forming a work based on the Program, and copy and distribute such modifications +or work under the terms of Section 1 above, provided that you also meet all of +these conditions: + + a) You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or + in part contains or is derived from the Program or any part thereof, to be + licensed as a whole at no charge to all third parties under the terms of + this License. + + c) If the modified program normally reads commands interactively when run, + you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms +of this License, whose permissions for other licensees extend to the entire +whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on +the Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and +2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above + on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only + for noncommercial distribution and only if you received the program in + object code or executable form with such an offer, in accord with + Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code +distributed need not include anything that is normally distributed (in either +source or binary form) with the major components (compiler, kernel, and so on) +of the operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source +code from the same place counts as distribution of the source code, even though +third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the Program +or its derivative works. These actions are prohibited by law if you do not +accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor to +copy, distribute or modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the recipients' exercise of the +rights granted herein. You are not responsible for enforcing compliance by +third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through +you, then the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In +such case, this License incorporates the limitation as if written in the body +of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems +or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any later +version", you have the option of following the terms and conditions either of +that version or of any later version published by the Free Software Foundation. +If the Program does not specify a version number of this License, you may +choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE +PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL +ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE +PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively convey the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + + One line to give the program's name and a brief idea of what it does. + + Copyright (C) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., 59 + Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it +starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes + with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free + software, and you are welcome to redistribute it under certain conditions; + type 'show c' for details. + +The hypothetical commands 'show w' and 'show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than 'show w' and 'show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + 'Gnomovision' (which makes passes at compilers) written by James Hacker. + + signature of Ty Coon, 1 April 1989 + + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General Public +License instead of this License. + + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. + +============================================================ +Notices for file(s): +/lib/d8.jar +------------------------------------------------------------ +This file lists all licenses for code distributed. +All non-library code has the following 3-Clause BSD license. + + +Copyright (c) 2016, the R8 project authors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Summary of distributed libraries: + +- artifact: com.google.guava:guava:+ + name: Guava Google Core Libraries for Java + copyrightHolder: The Guava Authors + license: The Apache Software License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt +- artifact: com.google.code.gson:gson:+ + name: Gson + license: The Apache Software License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: https://github.com/google/gson +- artifact: it.unimi.dsi:fastutil:+ + name: fastutil + license: Apache License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.html + url: http://fasutil.di.unimi.it/ +- artifact: net.sf.jopt-simple:jopt-simple:+ + name: JOpt Simple + license: The MIT License + licenseUrl: http://www.opensource.org/licenses/mit-license.php + url: http://pholser.github.com/jopt-simple +- artifact: org.ow2.asm:asm-commons:+ + name: ASM Commons + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.ow2.asm:asm-tree:+ + name: ASM Tree + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.ow2.asm:asm-util:+ + name: ASM Util + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.ow2.asm:asm-analysis:+ + name: ASM Util + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.ow2.asm:asm:+ + name: ASM Core + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.jetbrains.kotlin:kotlin-stdlib:+ + name: org.jetbrains.kotlin:kotlin-stdlib + copyrightHolder: JetBrains s.r.o. + license: The Apache License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: https://kotlinlang.org/ +- artifact: org.jetbrains.kotlin:kotlin-stdlib-common:+ + name: org.jetbrains.kotlin:kotlin-stdlib + copyrightHolder: JetBrains s.r.o. + license: The Apache License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: https://kotlinlang.org/ +- artifact: org.jetbrains.kotlinx:kotlinx-metadata-jvm:+ + name: org.jetbrains.kotlinx:kotlinx-metadata-jvm + copyrightHolder: JetBrains s.r.o. + license: The Apache License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: https://kotlinlang.org/ +- artifact: org.jetbrains:annotations:+ + name: IntelliJ IDEA Annotations + copyrightHolder: JetBrains s.r.o. + license: The Apache Software License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: http://www.jetbrains.org + + +Licenses details: + + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Copyright (c) 2000-2011 INRIA, France Telecom +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. + +Apache Commons Compress +Copyright 2002-2016 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +The files in the package org.apache.commons.compress.archivers.sevenz +were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/), +which has been placed in the public domain: + +"LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html) + + + The MIT License + + Copyright (c) 2004-2016 Paul R. Holser, Jr. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +============================================================================== + + Copyright (c) 2005-2014, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== +Copyright 2008 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. + +============================================================================== +2001 September 15 + +The author disclaims copyright to this source code. In place of +a legal notice, here is a blessing: + + May you do good and not evil. + May you find forgiveness for yourself and forgive others. + May you share freely, never taking more than you give. + + +============================================================================== + + Copyright (c) 2010, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== + + Copyright (c) 2005-2019, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Copyright 2010 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +version 1.2.12, March 27th, 2022 + +Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +============================================================================== +BSD License + +For Zstandard software + +Copyright (c) 2016-present, Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/tools/android-platform-tools/linux/adb b/tools/android-platform-tools/linux/adb new file mode 100755 index 0000000..60a9ffb Binary files /dev/null and b/tools/android-platform-tools/linux/adb differ diff --git a/tools/android-platform-tools/linux/dmtracedump b/tools/android-platform-tools/linux/dmtracedump new file mode 100755 index 0000000..9344e8d Binary files /dev/null and b/tools/android-platform-tools/linux/dmtracedump differ diff --git a/tools/android-platform-tools/linux/etc1tool b/tools/android-platform-tools/linux/etc1tool new file mode 100755 index 0000000..230cb33 Binary files /dev/null and b/tools/android-platform-tools/linux/etc1tool differ diff --git a/tools/android-platform-tools/linux/fastboot b/tools/android-platform-tools/linux/fastboot new file mode 100755 index 0000000..5109e6d Binary files /dev/null and b/tools/android-platform-tools/linux/fastboot differ diff --git a/tools/android-platform-tools/linux/hprof-conv b/tools/android-platform-tools/linux/hprof-conv new file mode 100755 index 0000000..18c06ef Binary files /dev/null and b/tools/android-platform-tools/linux/hprof-conv differ diff --git a/tools/android-platform-tools/linux/lib64/libc++.so b/tools/android-platform-tools/linux/lib64/libc++.so new file mode 100755 index 0000000..e543942 Binary files /dev/null and b/tools/android-platform-tools/linux/lib64/libc++.so differ diff --git a/tools/android-platform-tools/linux/make_f2fs b/tools/android-platform-tools/linux/make_f2fs new file mode 100755 index 0000000..e61d065 Binary files /dev/null and b/tools/android-platform-tools/linux/make_f2fs differ diff --git a/tools/android-platform-tools/linux/make_f2fs_casefold b/tools/android-platform-tools/linux/make_f2fs_casefold new file mode 100755 index 0000000..816eec2 Binary files /dev/null and b/tools/android-platform-tools/linux/make_f2fs_casefold differ diff --git a/tools/android-platform-tools/linux/mke2fs b/tools/android-platform-tools/linux/mke2fs new file mode 100755 index 0000000..5d2ca55 Binary files /dev/null and b/tools/android-platform-tools/linux/mke2fs differ diff --git a/tools/android-platform-tools/linux/mke2fs.conf b/tools/android-platform-tools/linux/mke2fs.conf new file mode 100644 index 0000000..8ea960d --- /dev/null +++ b/tools/android-platform-tools/linux/mke2fs.conf @@ -0,0 +1,53 @@ +[defaults] + base_features = sparse_super,large_file,filetype,dir_index,ext_attr + default_mntopts = acl,user_xattr + enable_periodic_fsck = 0 + blocksize = 4096 + inode_size = 256 + inode_ratio = 16384 + reserved_ratio = 1.0 + +[fs_types] + ext3 = { + features = has_journal + } + ext4 = { + features = has_journal,extent,huge_file,dir_nlink,extra_isize,uninit_bg + inode_size = 256 + } + ext4dev = { + features = has_journal,extent,huge_file,flex_bg,inline_data,64bit,dir_nlink,extra_isize + inode_size = 256 + options = test_fs=1 + } + small = { + blocksize = 1024 + inode_size = 128 + inode_ratio = 4096 + } + floppy = { + blocksize = 1024 + inode_size = 128 + inode_ratio = 8192 + } + big = { + inode_ratio = 32768 + } + huge = { + inode_ratio = 65536 + } + news = { + inode_ratio = 4096 + } + largefile = { + inode_ratio = 1048576 + blocksize = -1 + } + largefile4 = { + inode_ratio = 4194304 + blocksize = -1 + } + hurd = { + blocksize = 4096 + inode_size = 128 + } diff --git a/tools/android-platform-tools/linux/source.properties b/tools/android-platform-tools/linux/source.properties new file mode 100644 index 0000000..779c925 --- /dev/null +++ b/tools/android-platform-tools/linux/source.properties @@ -0,0 +1,2 @@ +Pkg.UserSrc=false +Pkg.Revision=34.0.4 diff --git a/tools/android-platform-tools/linux/sqlite3 b/tools/android-platform-tools/linux/sqlite3 new file mode 100755 index 0000000..f10ea74 Binary files /dev/null and b/tools/android-platform-tools/linux/sqlite3 differ diff --git a/tools/android-platform-tools/windows/AdbWinApi.dll b/tools/android-platform-tools/windows/AdbWinApi.dll new file mode 100644 index 0000000..dd0d9a4 Binary files /dev/null and b/tools/android-platform-tools/windows/AdbWinApi.dll differ diff --git a/tools/android-platform-tools/windows/AdbWinUsbApi.dll b/tools/android-platform-tools/windows/AdbWinUsbApi.dll new file mode 100644 index 0000000..d791dbf Binary files /dev/null and b/tools/android-platform-tools/windows/AdbWinUsbApi.dll differ diff --git a/tools/android-platform-tools/windows/NOTICE.txt b/tools/android-platform-tools/windows/NOTICE.txt new file mode 100644 index 0000000..3cc2388 --- /dev/null +++ b/tools/android-platform-tools/windows/NOTICE.txt @@ -0,0 +1,20443 @@ +============================================================================== +Android used by: + sdk-repo-windows-platform-tools.zip + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +============================================================================== + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + +============================================================================== +Code in this repo uses one or more of the following licenses. +Refer to each file to determine which licenses apply. + +------------------------------------------------------------------------- + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +------------------------------------------------------------------------- + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +------------------------------------------------------------------------- + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +============================================================================== +BoringSSL is a fork of OpenSSL. As such, large parts of it fall under OpenSSL +licensing. Files that are completely new have a Google copyright and an ISC +license. This license is reproduced at the bottom of this file. + +Contributors to BoringSSL are required to follow the CLA rules for Chromium: +https://cla.developers.google.com/clas + +Files in third_party/ have their own licenses, as described therein. The MIT +license, for third_party/fiat, which, unlike other third_party directories, is +compiled into non-test libraries, is included below. + +The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the +OpenSSL License and the original SSLeay license apply to the toolkit. See below +for the actual license texts. Actually both licenses are BSD-style Open Source +licenses. In case of any license issues related to OpenSSL please contact +openssl-core@openssl.org. + +The following are Google-internal bug numbers where explicit permission from +some authors is recorded for use of their work. (This is purely for our own +record keeping.) + 27287199 + 27287880 + 27287883 + 263291445 + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + + +ISC license used for completely new code in BoringSSL: + +/* Copyright (c) 2015, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + + +The code in third_party/fiat carries the MIT license: + +Copyright (c) 2015-2016 the fiat-crypto authors (see +https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Licenses for support code +------------------------- + +Parts of the TLS test suite are under the Go license. This code is not included +in BoringSSL (i.e. libcrypto and libssl) when compiled, however, so +distributing code linked against BoringSSL does not trigger this license: + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +BoringSSL uses the Chromium test infrastructure to run a continuous build, +trybots etc. The scripts which manage this, and the script for generating build +metadata, are under the Chromium license. Distributing code linked against +BoringSSL does not trigger this license. + +Copyright 2015 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, and the entire permission notice in its entirety, + including the disclaimer of warranties. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF +WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +============================================================================== +This package, the EXT2 filesystem utilities, are made available under +the GNU Public License version 2, with the exception of the lib/ext2fs +and lib/e2p libraries, which are made available under the GNU Library +General Public License Version 2, the lib/uuid library which is made +available under a BSD-style license and the lib/et and lib/ss +libraries which are made available under an MIT-style license. Please +see lib/uuid/COPYING for more details for the license for the files +comprising the libuuid library, and the source file headers of the +libet and libss libraries for more information. + +The most recent officially distributed version can be found at +http://e2fsprogs.sourceforge.net. If you need to make a distribution, +that's the one you should use. If there is some reason why you'd like +a more recent version that is still in ALPHA testing (i.e., either +using the "WIP" test distributions or one from the hg or git +repository from the development branch, please contact me +(tytso@mit.edu) before you ship. The release schedules for this +package are flexible, if you give me enough lead time. + + + Theodore Ts'o + 23-June-2007 + +---------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +---------------------------------------------------------------------- + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + +============================================================================== +Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper +Copyright (c) 2001-2022 Expat maintainers + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +============================================================================== +The tools for F2FS are covered by GNU Public License version 2. +Exceptionally, the following files are also covered by the GNU Lesser General +Public License Version 2.1 as the dual licenses. +- include/f2fs_fs.h +- lib/libf2fs.c +- lib/libf2fs_io.c +- mkfs/f2fs_format.c +- mkfs/f2fs_format_main.c +- mkfs/f2fs_format_utils.c +- mkfs/f2fs_format_utils.h + +================================================================================ +Copyright (c) 2012 Samsung Electronics Co., Ltd. + http://www.samsung.com/ + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +================================================================================ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +================================================================================ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + +============================================================================== +Copyright (c) 2012 - 2016, Victor Zverovich + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +Copyright (c) 2012 - present, Victor Zverovich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + +============================================================================== + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Android-specific code. == + ========================================================================= + +Android Code +Copyright 2005-2008 The Android Open Source Project + +This product includes software developed as part of +The Android Open Source Project (http://source.android.com). + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for Apache Commons code. == + ========================================================================= + +Apache Commons +Copyright 1999-2006 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for Jakarta Commons Logging. == + ========================================================================= + +Jakarta Commons Logging (JCL) +Copyright 2005,2006 The Apache Software Foundation. + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Nuance code. == + ========================================================================= + +These files are Copyright 2007 Nuance Communications, but released under +the Apache2 License. + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Media Codecs code. == + ========================================================================= + +Media Codecs +These files are Copyright 1998 - 2009 PacketVideo, but released under +the Apache2 License. + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the TagSoup code. == + ========================================================================= + +This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. + +TagSoup is licensed under the Apache License, +Version 2.0. You may obtain a copy of this license at +http://www.apache.org/licenses/LICENSE-2.0 . You may also have +additional legal rights not granted by this license. + +TagSoup is distributed in the hope that it will be useful, but +unless required by applicable law or agreed to in writing, TagSoup +is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +OF ANY KIND, either express or implied; not even the implied warranty +of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for Additional Codecs code. == + ========================================================================= + +Additional Codecs +These files are Copyright 2003-2010 VisualOn, but released under +the Apache2 License. + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Audio Effects code. == + ========================================================================= + +Audio Effects +These files are Copyright (C) 2004-2010 NXP Software and +Copyright (C) 2010 The Android Open Source Project, but released under +the Apache2 License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, +and http://www.unicode.org/cldr/data/ . Unicode Software includes any +source code published in the Unicode Standard or under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, and +http://www.unicode.org/cldr/data/. + +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA +FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY +ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF +THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, +DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2008 Unicode, Inc. All rights reserved. Distributed +under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation (the +"Data Files") or Unicode software and any associated documentation (the +"Software") to deal in the Data Files or Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, and/or sell copies of the Data Files or Software, +and to permit persons to whom the Data Files or Software are furnished to +do so, provided that (a) the above copyright notice(s) and this permission +notice appear with all copies of the Data Files or Software, (b) both the +above copyright notice(s) and this permission notice appear in associated +documentation, and (c) there is clear notice in each modified Data File +or in the Software as well as in the documentation associated with the +Data File(s) or Software that the data or software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS +INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT +OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE +OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, use +or other dealings in these Data Files or Software without prior written +authorization of the copyright holder. + +============================================================================== +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +============================================================================== +libc++ License +============================================================================== + +The libc++ library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2017 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== +============================================================================== +libc++abi License +============================================================================== + +The libc++abi library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2018 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== +============================================================================== +libc++abi License +============================================================================== + +The libc++abi library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +============================================================================== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================================== +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE +========================================= + +PNG Reference Library License version 2 +--------------------------------------- + + * Copyright (c) 1995-2023 The PNG Reference Library Authors. + * Copyright (c) 2018-2023 Cosmin Truta. + * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + * Copyright (c) 1996-1997 Andreas Dilger. + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +The software is supplied "as is", without warranty of any kind, +express or implied, including, without limitation, the warranties +of merchantability, fitness for a particular purpose, title, and +non-infringement. In no event shall the Copyright owners, or +anyone distributing the software, be liable for any damages or +other liability, whether in contract, tort or otherwise, arising +from, out of, or in connection with the software, or the use or +other dealings in the software, even if advised of the possibility +of such damage. + +Permission is hereby granted to use, copy, modify, and distribute +this software, or portions hereof, for any purpose, without fee, +subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you + use this software in a product, an acknowledgment in the product + documentation would be appreciated, but is not required. + + 2. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + + +PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) +----------------------------------------------------------------------- + +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are +Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: + + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + Mandar Sahastrabuddhe + Google Inc. + Vadim Barkov + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of + the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is + with the user. + +Some files in the "contrib" directory and some configure-generated +files that are distributed with libpng have other copyright owners, and +are released under other open source licenses. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the +list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +Some files in the "scripts" directory have other copyright owners, +but are released under this license. + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing +Authors and Group 42, Inc. disclaim all warranties, expressed or +implied, including, without limitation, the warranties of +merchantability and of fitness for any purpose. The Contributing +Authors and Group 42, Inc. assume no liability for direct, indirect, +incidental, special, exemplary, or consequential damages, which may +result from the use of the PNG Reference Library, even if advised of +the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + + 1. The origin of this source code must not be misrepresented. + + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, +without fee, and encourage the use of this source code as a component +to supporting the PNG file format in commercial products. If you use +this source code in a product, acknowledgment is not required but would +be appreciated. + +============================================================================== + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + +============================================================================== +LZ4 Library +Copyright (c) 2011-2020, Yann Collet +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +The majority of the source code in the mDNSResponder project is licensed +under the terms of the Apache License, Version 2.0, available from: + + +To accommodate license compatibility with the widest possible range +of client code licenses, the shared library code, which is linked +at runtime into the same address space as the client using it, is +licensed under the terms of the "Three-Clause BSD License". + +The Linux Name Service Switch code, contributed by National ICT +Australia Ltd (NICTA) is licensed under the terms of the NICTA Public +Software Licence (which is substantially similar to the "Three-Clause +BSD License", with some additional language pertaining to Australian law). + +============================================================================== + + Copyright (c) 2006-2009, The Android Open Source Project + Copyright 2006, Brian Swetland + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== +// Copyright 2018 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== +Notices for files contained in the tools directory: +============================================================ +Notices for file(s): +/bin/mksdcard +------------------------------------------------------------ +Copyright 2007, The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Google Inc. nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY Google Inc. ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL Google Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================ +Notices for file(s): +/framework/conscrypt-hostdex.jar +/framework/core-hostdex.jar +/framework/core-libart-hostdex.jar +/lib/libjavacore.so +/lib/libjavacrypto.so +------------------------------------------------------------ + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Android-specific code. == + ========================================================================= + +Android Code +Copyright 2005-2008 The Android Open Source Project + +This product includes software developed as part of +The Android Open Source Project (http://source.android.com). + + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Apache Harmony distribution. == + ========================================================================= + +Apache Harmony +Copyright 2006 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +Portions of Harmony were originally developed by +Intel Corporation and are licensed to the Apache Software +Foundation under the "Software Grant and Corporate Contribution +License Agreement", informally known as the "Intel Harmony CLA". + + + ========================================================================= + == NOTICE file for the ICU License. == + ========================================================================= + +Copyright (c) 1995-2009 International Business Machines Corporation and others + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, provided that the above +copyright notice(s) and this permission notice appear in all copies of +the Software and that both the above copyright notice(s) and this +permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY +SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, use +or other dealings in this Software without prior written authorization +of the copyright holder. + +All trademarks and registered trademarks mentioned herein are the +property of their respective owners. + + + ========================================================================= + == NOTICE file for the JUnit License. == + ========================================================================= + +Common Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF +THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and + documentation distributed under this Agreement, and + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + + where such changes and/or additions to the Program originate + from and are distributed by that particular Contributor. A + Contribution 'originates' from a Contributor if it was added to + the Program by such Contributor itself or anyone acting on such + Contributor's behalf. Contributions do not include additions to + the Program which: (i) are separate modules of software + distributed in conjunction with the Program under their own + license agreement, and (ii) are not derivative works of the + Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor +which are necessarily infringed by the use or sale of its Contribution +alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this +Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor + hereby grants Recipient a non-exclusive, worldwide, royalty-free + copyright license to reproduce, prepare derivative works of, + publicly display, publicly perform, distribute and sublicense + the Contribution of such Contributor, if any, and such + derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor + hereby grants Recipient a non-exclusive, worldwide, royalty-free + patent license under Licensed Patents to make, use, sell, offer + to sell, import and otherwise transfer the Contribution of such + Contributor, if any, in source code and object code form. This + patent license shall apply to the combination of the + Contribution and the Program if, at the time the Contribution is + added by the Contributor, such addition of the Contribution + causes such combination to be covered by the Licensed Patents. + The patent license shall not apply to any other combinations + which include the Contribution. No hardware per se is licensed + hereunder. + + c) Recipient understands that although each Contributor grants + the licenses to its Contributions set forth herein, no + assurances are provided by any Contributor that the Program does + not infringe the patent or other intellectual property rights of + any other entity. Each Contributor disclaims any liability to + Recipient for claims brought by any other entity based on + infringement of intellectual property rights or otherwise. As a + condition to exercising the rights and licenses granted + hereunder, each Recipient hereby assumes sole responsibility to + secure any other intellectual property rights needed, if any. + For example, if a third party patent license is required to + allow Recipient to distribute the Program, it is Recipient's + responsibility to acquire that license before distributing the + Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to + grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form +under its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) states that any provisions which differ from this Agreement + are offered by that Contributor alone and not by any other + party; and + + iv) states that source code for the Program is available from + such Contributor, and informs licensees how to obtain it in a + reasonable manner on or through a medium customarily used for + software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of + the Program. + +Contributors may not remove or alter any copyright notices contained +within the Program. + +Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the +like. While this license is intended to facilitate the commercial use +of the Program, the Contributor who includes the Program in a +commercial product offering should do so in a manner which does not +create potential liability for other Contributors. Therefore, if a +Contributor includes the Program in a commercial product offering, +such Contributor ("Commercial Contributor") hereby agrees to defend +and indemnify every other Contributor ("Indemnified Contributor") +against any losses, damages and costs (collectively "Losses") arising +from claims, lawsuits and other legal actions brought by a third party +against the Indemnified Contributor to the extent caused by the acts +or omissions of such Commercial Contributor in connection with its +distribution of the Program in a commercial product offering. The +obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. +In order to qualify, an Indemnified Contributor must: a) promptly +notify the Commercial Contributor in writing of such claim, and b) +allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any such +claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY +WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement, including but not limited to +the risks and costs of program errors, compliance with applicable +laws, damage to or loss of data, programs or equipment, and +unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR +ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with +respect to a patent applicable to software (including a cross-claim or +counterclaim in a lawsuit), then any patent licenses granted by that +Contributor to such Recipient under this Agreement shall terminate as +of the date such litigation is filed. In addition, if Recipient +institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program +itself (excluding combinations of the Program with other software or +hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. IBM is the initial +Agreement Steward. IBM may assign the responsibility to serve as the +Agreement Steward to a suitable separate entity. Each new version of +the Agreement will be given a distinguishing version number. The +Program (including Contributions) may always be distributed subject to +the version of the Agreement under which it was received. In addition, +after a new version of the Agreement is published, Contributor may +elect to distribute the Program (including its Contributions) under +the new version. Except as expressly stated in Sections 2(a) and 2(b) +above, Recipient receives no rights or licenses to the intellectual +property of any Contributor under this Agreement, whether expressly, +by implication, estoppel or otherwise. All rights in the Program not +expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and +the intellectual property laws of the United States of America. No +party to this Agreement will bring a legal action under this Agreement +more than one year after the cause of action arose. Each party waives +its rights to a jury trial in any resulting litigation. + + + ========================================================================= + == NOTICE file for the KXML License. == + ========================================================================= + +Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + ========================================================================= + == NOTICE file for the SQLite Java Wrapper License. == + ========================================================================= + +This software is copyrighted by Christian Werner +and others. The following terms apply to all files associated with the +software unless explicitly disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + + + ========================================================================= + == NOTICE file for the W3C License. == + ========================================================================= + +Copyright (c) 2000 World Wide Web Consortium, (Massachusetts Institute +of Technology, Institut National de Recherche en Informatique et en +Automatique, Keio University). All Rights Reserved. This program is +distributed under the W3C's Software Intellectual Property License. +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See W3C License http://www.w3.org/Consortium/Legal/ for more details. + +============================================================ +Notices for file(s): +/usr/icu/icudt51l.dat +------------------------------------------------------------ +ICU License - ICU 1.8.1 and later + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1995-2008 International Business Machines Corporation and others + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. + +All trademarks and registered trademarks mentioned herein are the property of their respective owners. + +============================================================================== + +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + + Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, and +http://www.unicode.org/cldr/data/ . Unicode Software includes any source code +published in the Unicode Standard or under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, and +http://www.unicode.org/cldr/data/. + + NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES +("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND +AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU +DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES +OR SOFTWARE. + + COPYRIGHT AND PERMISSION NOTICE + + Copyright © 1991-2007 Unicode, Inc. All rights reserved. Distributed under +the Terms of Use in http://www.unicode.org/copyright.html. + + Permission is hereby granted, free of charge, to any person obtaining a copy +of the Unicode data files and any associated documentation (the "Data Files") or +Unicode software and any associated documentation (the "Software") to deal in +the Data Files or Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files or +Software are furnished to do so, provided that (a) the above copyright notice(s) +and this permission notice appear with all copies of the Data Files or Software, +(b) both the above copyright notice(s) and this permission notice appear in +associated documentation, and (c) there is clear notice in each modified Data +File or in the Software as well as in the documentation associated with the Data +File(s) or Software that the data or software has been modified. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD +PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING +OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR +SOFTWARE. + + Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in these Data Files or Software without prior written authorization of the +copyright holder. + +=============================================================================== + + +/* This ICU code derived from: */ +/* +punycode.c 0.4.0 (2001-Nov-17-Sat) +http://www.cs.berkeley.edu/~amc/idn/ +Adam M. Costello +http://www.nicemice.net/amc/ + +Disclaimer and license + +Regarding this entire document or any portion of it (including +the pseudocode and C code), the author makes no guarantees and +is not responsible for any damage resulting from its use. The +author grants irrevocable permission to anyone to use, modify, +and distribute it in any way that does not diminish the rights +of anyone else to use, modify, and distribute it, provided that +redistributed derivative works do not contain misleading author or +version information. Derivative works need not be licensed under +similar terms. +*/ + + +/* +** This file is in the public domain, so clarified as of +** 2006-07-17 by Arthur David Olson. +*/ + +============================================================ +Notices for file(s): +/framework/jcommon-1.0.12.jar +/framework/jfreechart-1.0.9-swt.jar +/framework/jfreechart-1.0.9.jar +------------------------------------------------------------ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + +============================================================ +Notices for file(s): +/lib/third_party_icu_icudata_host_gyp.a +/lib/third_party_icu_icui18n_host_gyp.a +/lib/third_party_icu_icuuc_host_gyp.a +/lib/third_party_protobuf_protobuf_full_do_not_use_host_gyp.a +/lib/v8_tools_gyp_v8_base_arm_host_gyp.a +/lib/v8_tools_gyp_v8_nosnapshot_arm_host_gyp.a +/obj/GYP/shared_intermediates/mksnapshot.arm +/obj/GYP/shared_intermediates/protoc +------------------------------------------------------------ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/* Copyright (c) 2008-2009, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Kostya Serebryany + */ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Netscape Portable Runtime (NSPR). + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998-2000 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Notice that the following BSD-style license applies to the Valgrind header + files used by Chromium (valgrind.h and memcheck.h). However, the rest of + Valgrind is licensed under the terms of the GNU General Public License, + version 2, unless otherwise indicated. + + ---------------------------------------------------------------- + + Copyright (C) 2000-2008 Julian Seward. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Copyright (c) 2007 Red Hat, inc + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +Copyright 2003-2005 Colin Percival +All rights reserved + +Redistribution and use in source and binary forms, with or without +modification, are permitted providing that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2007-2009 Google Inc. + Copyright 2007-2009 WebDriver committers + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Copyright (C) 2009 by Tung Mac. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Netscape security libraries. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2000 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Netscape security libraries. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1994-2000 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +Copyright 2011, The Chromium Authors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +/* +** Copyright (c) 2007-2010 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2008, Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +(WebKit doesn't distribute an explicit license. This LICENSE is derived from +license text in the source.) + +Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, +2006, 2007 Alexander Kellett, Alexey Proskuryakov, Alex Mathews, Allan +Sandfeld Jensen, Alp Toker, Anders Carlsson, Andrew Wellington, Antti +Koivisto, Apple Inc., Arthur Langereis, Baron Schwartz, Bjoern Graf, +Brent Fulgham, Cameron Zwarich, Charles Samuels, Christian Dywan, +Collabora Ltd., Cyrus Patel, Daniel Molkentin, Dave Maclachlan, David +Smith, Dawit Alemayehu, Dirk Mueller, Dirk Schulze, Don Gibson, Enrico +Ros, Eric Seidel, Frederik Holljen, Frerich Raabe, Friedmann Kleint, +George Staikos, Google Inc., Graham Dennis, Harri Porten, Henry Mason, +Hiroyuki Ikezoe, Holger Hans Peter Freyther, IBM, James G. Speth, Jan +Alonzo, Jean-Loup Gailly, John Reis, Jonas Witt, Jon Shier, Jonas +Witt, Julien Chaffraix, Justin Haygood, Kevin Ollivier, Kevin Watters, +Kimmo Kinnunen, Kouhei Sutou, Krzysztof Kowalczyk, Lars Knoll, Luca +Bruno, Maks Orlovich, Malte Starostik, Mark Adler, Martin Jones, +Marvin Decker, Matt Lilek, Michael Emmel, Mitz Pettel, mozilla.org, +Netscape Communications Corporation, Nicholas Shanks, Nikolas +Zimmermann, Nokia, Oliver Hunt, Opened Hand, Paul Johnston, Peter +Kelly, Pioneer Research Center USA, Rich Moore, Rob Buis, Robin Dunn, +Ronald Tschalär, Samuel Weinig, Simon Hausmann, Staikos Computing +Services Inc., Stefan Schimanski, Symantec Corporation, The Dojo +Foundation, The Karbon Developers, Thomas Boyer, Tim Copperfield, +Tobias Anton, Torben Weis, Trolltech, University of Cambridge, Vaclav +Slavik, Waldo Bastian, Xan Lopez, Zack Rusin + +The terms and conditions vary from file to file, but are one of: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + +*OR* + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. +3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + +// Copyright (C) 2002-2013 The ANGLE Project Authors. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of TransGaming Inc., Google Inc., 3DLabs Inc. +// Ltd., nor the names of their contributors may be used to endorse +// or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Copyright (c) 2012, Manfred Moitzi + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Deutsche Übersetzung: + +Copyright (c) 2012, Manfred Moitzi + +Hiermit wird unentgeltlich, jeder Person, die eine Kopie der Software +und der zugehörigen Dokumentationen (die "Software") erhält, die +Erlaubnis erteilt, uneingeschränkt zu benutzen, inklusive und ohne +Ausnahme, dem Recht, sie zu verwenden, kopieren, ändern, fusionieren, +verlegen, verbreiten, unterlizenzieren und/oder zu verkaufen, und +Personen, die diese Software erhalten, diese Rechte zu geben, unter den +folgenden Bedingungen: + +Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen +Kopien oder Teilkopien der Software beizulegen. + +DIE SOFTWARE WIRD OHNE JEDE AUSDRÜCKLICHE ODER IMPLIZIERTE GARANTIE +BEREITGESTELLT, EINSCHLIESSLICH DER GARANTIE ZUR BENUTZUNG FÜR DEN +VORGESEHENEN ODER EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER +RECHTSVERLETZUNG, JEDOCH NICHT DARAUF BESCHRÄNKT. IN KEINEM FALL SIND +DIE AUTOREN ODER COPYRIGHTINHABER FÜR JEGLICHEN SCHADEN ODER SONSTIGE +ANSPRÜCHE HAFTBAR ZU MACHEN, OB INFOLGE DER ERFÜLLUNG EINES VERTRAGES, +EINES DELIKTES ODER ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE ODER +SONSTIGER VERWENDUNG DER SOFTWARE ENTSTANDEN. + + +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] + + ---------------------------------------------------------------------- + + AMENDMENTS + + The Netscape Public License Version 1.1 ("NPL") consists of the + Mozilla Public License Version 1.1 with the following Amendments, + including Exhibit A-Netscape Public License. Files identified with + "Exhibit A-Netscape Public License" are governed by the Netscape + Public License Version 1.1. + + Additional Terms applicable to the Netscape Public License. + I. Effect. + These additional terms described in this Netscape Public + License -- Amendments shall apply to the Mozilla Communicator + client code and to all Covered Code under this License. + + II. "Netscape's Branded Code" means Covered Code that Netscape + distributes and/or permits others to distribute under one or more + trademark(s) which are controlled by Netscape but which are not + licensed for use under this License. + + III. Netscape and logo. + This License does not grant any rights to use the trademarks + "Netscape", the "Netscape N and horizon" logo or the "Netscape + lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript", + "Smart Browsing" even if such marks are included in the Original + Code or Modifications. + + IV. Inability to Comply Due to Contractual Obligation. + Prior to licensing the Original Code under this License, Netscape + has licensed third party code for use in Netscape's Branded Code. + To the extent that Netscape is limited contractually from making + such third party code available under this License, Netscape may + choose to reintegrate such code into Covered Code without being + required to distribute such code in Source Code form, even if + such code would otherwise be considered "Modifications" under + this License. + + V. Use of Modifications and Covered Code by Initial Developer. + V.1. In General. + The obligations of Section 3 apply to Netscape, except to + the extent specified in this Amendment, Section V.2 and V.3. + + V.2. Other Products. + Netscape may include Covered Code in products other than the + Netscape's Branded Code which are released by Netscape + during the two (2) years following the release date of the + Original Code, without such additional products becoming + subject to the terms of this License, and may license such + additional products on different terms from those contained + in this License. + + V.3. Alternative Licensing. + Netscape may license the Source Code of Netscape's Branded + Code, including Modifications incorporated therein, without + such Netscape Branded Code becoming subject to the terms of + this License, and may license such Netscape Branded Code on + different terms from those contained in this License. + + VI. Litigation. + Notwithstanding the limitations of Section 11 above, the + provisions regarding litigation in Section 11(a), (b) and (c) of + the License shall apply to all disputes relating to this License. + + EXHIBIT A-Netscape Public License. + + "The contents of this file are subject to the Netscape Public + License Version 1.1 (the "License"); you may not use this file + except in compliance with the License. You may obtain a copy of + the License at http://www.mozilla.org/NPL/ + + Software distributed under the License is distributed on an "AS + IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + implied. See the License for the specific language governing + rights and limitations under the License. + + The Original Code is Mozilla Communicator client code, released + March 31, 1998. + + The Initial Developer of the Original Code is Netscape + Communications Corporation. Portions created by Netscape are + Copyright (C) 1998-1999 Netscape Communications Corporation. All + Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the + terms of the _____ license (the "[___] License"), in which case + the provisions of [______] License are applicable instead of + those above. If you wish to allow use of your version of this + file only under the terms of the [____] License and not to allow + others to use your version of this file under the NPL, indicate + your decision by deleting the provisions above and replace them + with the notice and other provisions required by the [___] + License. If you do not delete the provisions above, a recipient + may use your version of this file under either the NPL or the + [___] License." + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2011 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Copyright (c) 2007-2009 IOLA and Ole Laursen + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +This software is based in part on the work of the FreeType Team. + +---------------------- + + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + http://www.freetype.org + + +--- end of FTL.TXT --- + +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + COPYRIGHTS + +Compilation copyright is held by the GPSD project. All rights reserved. + +GPSD project copyrights are assigned to the project lead, currently +Eric S. Raymond. Other portions of the GPSD code are Copyright (c) +1997, 1998, 1999, 2000, 2001, 2002 by Remco Treffkorn, and others +Copyright (c) 2005 by Eric S. Raymond. For other copyrights, see +individual files. + + BSD LICENSE + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met:

+ +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer.

+ +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution.

+ +Neither name of the GPSD project nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + +HarfBuzz is licensed under the so-called "Old MIT" license. Details follow. +For parts of HarfBuzz that are licensed under different licenses see individual +files names COPYING in subdirectories where applicable. + +Copyright © 2010,2011,2012 Google, Inc. +Copyright © 2012 Mozilla Foundation +Copyright © 2011 Codethink Limited +Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies) +Copyright © 2009 Keith Stribley +Copyright © 2009 Martin Hosken and SIL International +Copyright © 2007 Chris Wilson +Copyright © 2006 Behdad Esfahbod +Copyright © 2005 David Turner +Copyright © 2004,2007,2008,2009,2010 Red Hat, Inc. +Copyright © 1998-2004 David Turner and Werner Lemberg + +For full copyright notices consult the individual files in the package. + + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +/************************************************************************* + * + * IAccessible2 IDL Specification + * + * Copyright (c) 2007, 2010 Linux Foundation + * Copyright (c) 2006 IBM Corporation + * Copyright (c) 2000, 2006 Sun Microsystems, Inc. + * All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of the Linux Foundation nor the names of its + * contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This BSD License conforms to the Open Source Initiative "Simplified + * BSD License" as published at: + * http://www.opensource.org/licenses/bsd-license.php + * + * IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 + * mark may be used in accordance with the Linux Foundation Trademark + * Policy to indicate compliance with the IAccessible2 specification. + * + ************************************************************************/ + +LICENSE extracted from IJG's jpeg distribution: +----------------------------------------------- + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1998, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ICU License - ICU 1.8.1 and later + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1995-2010 International Business Machines Corporation and others + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Software, and to permit persons +to whom the Software is furnished to do so, provided that the above +copyright notice(s) and this permission notice appear in all copies +of the Software and that both the above copyright notice(s) and this +permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL +THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, +OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE +USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be +used in advertising or otherwise to promote the sale, use or other dealings in +this Software without prior written authorization of the copyright holder. + +All trademarks and registered trademarks mentioned herein are the property of their respective owners. + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +The following is the license for the jemalloc source code, as provided +in the initial section of the source files. + +Copyright (C) 2006-2008 Jason Evans . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice(s), this list of conditions and the following disclaimer as + the first lines of this file unmodified other than the possible + addition of one or more copyright notices. +2. Redistributions in binary form must reproduce the above copyright + notice(s), this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +The author (Baptiste Lepilleur) explicitly disclaims copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is +released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Copyright (c) 2007-2010 The Khronos Group Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and/or associated documentation files (the +"Materials"), to deal in the Materials without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Materials, and to +permit persons to whom the Materials are furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Materials. + +THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + + +SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) + +Copyright (C) 1992 Silicon Graphics, Inc. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice including the dates of first publication and either +this permission notice or a reference to http://oss.sgi.com/projects/FreeB/ +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SILICON +GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of Silicon Graphics, Inc. shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization from Silicon +Graphics, Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +License copied from bin/lcov: + +# +# Copyright (c) International Business Machines Corp., 2002,2007 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + +Copyright (c) 2011 The LevelDB Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* + * Copyright (c) 2008 NVIDIA, Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +Copyright 2000-2007 Niels Provos +Copyright 2007-2009 Niels Provos and Nick Mathewson + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright (c) 2013, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +(Copied from the README.) + +-------------------------------------------------------------------------------- + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1998, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltconfig, ltmain.sh). Another support script, install-sh, is copyright +by M.I.T. but is also freely distributable. + +It appears that the arithmetic coding option of the JPEG spec is covered by +patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot +legally be used without obtaining one or more licenses. For this reason, +support for arithmetic coding has been removed from the free JPEG software. +(Since arithmetic coding provides only a marginal gain over the unpatented +Huffman mode, it is unlikely that very many implementations will support it.) +So far as we are aware, there are no patent restrictions on the remaining +code. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + +Copyright (C) 2011 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.2.45, July 7, 2011, are +Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.2.5 +with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the + library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is with + the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-0.96, +with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" +boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a +certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +July 7, 2011 + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sub license, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice (including the + next paragraph) shall be included in all copies or substantial portions + of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR + ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Copyright (c) 2010, Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the WebM Project. + +Google hereby grants to you a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer, and otherwise run, modify and propagate the contents of this +implementation of VP8, where such license applies only to those patent +claims, both currently owned by Google and acquired in the future, +licensable by Google that are necessarily infringed by this +implementation of VP8. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of VP8 or any code incorporated within this +implementation of VP8 constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of VP8 +shall terminate as of the date such litigation is filed. + +Except where otherwise noted in the source code (e.g. the files hash.c, +list.c and the trio files, which are covered by a similar licence but +with different Copyright notices) all the files are: + + Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is fur- +nished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- +NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- +NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of Daniel Veillard shall not +be used in advertising or otherwise to promote the sale, use or other deal- +ings in this Software without prior written authorization from him. + + +Licence for libxslt except libexslt +---------------------------------------------------------------------- + Copyright (C) 2001-2002 Daniel Veillard. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is fur- +nished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- +NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- +NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of Daniel Veillard shall not +be used in advertising or otherwise to promote the sale, use or other deal- +ings in this Software without prior written authorization from him. + +---------------------------------------------------------------------- + +Licence for libexslt +---------------------------------------------------------------------- + Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard. + All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is fur- +nished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- +NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- +NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the authors shall not +be used in advertising or otherwise to promote the sale, use or other deal- +ings in this Software without prior written authorization from him. +---------------------------------------------------------------------- + +LZMA SDK is placed in the public domain. + +Copyright (c) 2003-2009 Jonathan 'Wolf' Rentzsch: +Some rights reserved: + +The default Mesa license is as follows: + +Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +Some parts of Mesa are copyrighted under the GNU LGPL. See the +Mesa/docs/COPYRIGHT file for details. + +The following is the standard GNU copyright file. +---------------------------------------------------------------------- + + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + + * MODP_B64 - High performance base64 encoder/decoder + * Version 1.3 -- 17-Mar-2006 + * http://modp.com/release/base64 + * + * Copyright (c) 2005, 2006 Nick Galbreath -- nickg [at] modp [dot] com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the modp.com nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright 2008 MolokoCacao +All rights reserved + +Redistribution and use in source and binary forms, with or without +modification, are permitted providing that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Copyright (c) 2004-2009 Sergey Lyubka +Portions Copyright (c) 2009 Gilbert Wellisch + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Copyright 2010-2011, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. +* Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Copyright (c) 2006-2009 The Chromium OS Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Version: MPL 1.1/GPL 2.0/LGPL 2.1 + +The contents of this file are subject to the Mozilla Public License Version +1.1 (the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the +License. + +The Original Code is mozilla.org code. + +The Initial Developer of the Original Code is +Netscape Communications Corporation. +Portions created by the Initial Developer are Copyright (C) 1998 +the Initial Developer. All Rights Reserved. + +Contributor(s): + +Alternatively, the contents of this file may be used under the terms of +either the GNU General Public License Version 2 or later (the "GPL"), or +the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +in which case the provisions of the GPL or the LGPL are applicable instead +of those above. If you wish to allow use of your version of this file only +under the terms of either the GPL or the LGPL, and not to allow others to +use your version of this file under the terms of the MPL, indicate your +decision by deleting the provisions above and replace them with the notice +and other provisions required by the GPL or the LGPL. If you do not delete +the provisions above, a recipient may use your version of this file under +the terms of any one of the MPL, the GPL or the LGPL. + + + Copyright (c) 2004-2012 by Mulle Kybernetik. All rights reserved. + + Permission to use, copy, modify and distribute this software and its documentation + is hereby granted, provided that both the copyright notice and this permission + notice appear in all copies of the software, derivative works or modified versions, + and any portions thereof, and that both notices appear in supporting documentation, + and that credit is given to Mulle Kybernetik in all documents and publicity + pertaining to direct or indirect use of this code or its derivatives. + + THIS IS EXPERIMENTAL SOFTWARE AND IT IS KNOWN TO HAVE BUGS, SOME OF WHICH MAY HAVE + SERIOUS CONSEQUENCES. THE COPYRIGHT HOLDER ALLOWS FREE USE OF THIS SOFTWARE IN ITS + "AS IS" CONDITION. THE COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY + DAMAGES WHATSOEVER RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE + OR OF ANY DERIVATIVE WORK. + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + + +Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic, + Jean-Marc Valin, Timothy B. Terriberry, + CSIRO, Gregory Maxwell, Mark Borgerding, + Erik de Castro Lopo + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Opus is subject to the royalty-free patent licenses which are +specified at: + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ + +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +PLY (Python Lex-Yacc) Version 3.4 + +Copyright (C) 2001-2011, +David M. Beazley (Dabeaz LLC) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the David Beazley or Dabeaz LLC may be used to + endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// Copyright (c) 2012 The Polymer Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. + +Copyright (c) 2003-2012, Michael Foord +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +qcms +Copyright (C) 2009 Mozilla Corporation +Copyright (C) 1998-2007 Marti Maria + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// Copyright (c) 2009 The RE2 Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2011 Google Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Copyright (c) 2006 Bob Ippolito + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +// Copyright (c) 2011 Google Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +All MurmurHash source files are placed in the public domain. + +The license below applies to all other code in SMHasher: + +Copyright (c) 2011 Google, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +The author disclaims copyright to this source code. In place of +a legal notice, here is a blessing: + + May you do good and not evil. + May you find forgiveness for yourself and forgive others. + May you share freely, never taking more than you give. + +SWIG is distributed under the following terms: + +I. + +Copyright (c) 1995-1998 +The University of Utah and the Regents of the University of California +All Rights Reserved + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that +(1) The above copyright notice and the following two paragraphs +appear in all copies of the source code and (2) redistributions +including binaries reproduces these notices in the supporting +documentation. Substantial modifications to this software may be +copyrighted by their authors and need not follow the licensing terms +described here, provided that the new terms are clearly indicated in +all files where they apply. + +IN NO EVENT SHALL THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, THE +UNIVERSITY OF UTAH OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY +PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, +EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. + +THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, AND THE UNIVERSITY OF UTAH +SPECIFICALLY DISCLAIM ANY WARRANTIES,INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND +THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, +SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + + +II. + +This software includes contributions that are Copyright (c) 1998-2005 +University of Chicago. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. Redistributions +in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. Neither the name of +the University of Chicago nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF CHICAGO AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF +CHICAGO OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +III. + +This software includes contributions that are Copyright (c) 2005-2006 +Arizona Board of Regents (University of Arizona). +All Rights Reserved + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that +(1) The above copyright notice and the following two paragraphs +appear in all copies of the source code and (2) redistributions +including binaries reproduces these notices in the supporting +documentation. Substantial modifications to this software may be +copyrighted by their authors and need not follow the licensing terms +described here, provided that the new terms are clearly indicated in +all files where they apply. + +THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF ARIZONA AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF +ARIZONA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +All code here is public domain. + +Copyright (c) 2012, Linux USB Project +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +o Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +o Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +o Neither the name of the Linux USB Project nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +(Copied from the COPYRIGHT file of +https://code.google.com/p/sctp-refimpl/source/browse/trunk/COPYRIGHT) +-------------------------------------------------------------------------------- + +Copyright (c) 2001, 2002 Cisco Systems, Inc. +Copyright (c) 2002-12 Randall R. Stewart +Copyright (c) 2002-12 Michael Tuexen +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +;***************************************************************************** +;* x86inc.asm +;***************************************************************************** +;* Copyright (C) 2005-2011 x264 project +;* +;* Authors: Loren Merritt +;* Anton Mitrofanov +;* Jason Garrett-Glaser +;* +;* Permission to use, copy, modify, and/or distribute this software for any +;* purpose with or without fee is hereby granted, provided that the above +;* copyright notice and this permission notice appear in all copies. +;* +;* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +;* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +;* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +;* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +;* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +;* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +;* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +;***************************************************************************** + +; This is a header file for the x264ASM assembly language, which uses +; NASM/YASM syntax combined with a large number of macros to provide easy +; abstraction between different calling conventions (x86_32, win64, linux64). +; It also has various other useful features to simplify writing the kind of +; DSP functions that are most often used in x264. + +; Unlike the rest of x264, this file is available under an ISC license, as it +; has significant usefulness outside of x264 and we want it to be available +; to the largest audience possible. Of course, if you modify it for your own +; purposes to add a new feature, we strongly encourage contributing a patch +; as this feature might be useful for others as well. Send patches or ideas +; to x264-devel@videolan.org . + +Yasm is Copyright (c) 2001-2010 Peter Johnson and other Yasm developers. + +Yasm developers and/or contributors include: + Peter Johnson + Michael Urman + Brian Gladman (Visual Studio build files, other fixes) + Stanislav Karchebny (options parser) + Mathieu Monnier (SSE4 instruction patches, NASM preprocessor additions) + Anonymous "NASM64" developer (NASM preprocessor fixes) + Stephen Polkowski (x86 instruction patches) + Henryk Richter (Mach-O object format) + Ben Skeggs (patches, bug reports) + Alexei Svitkine (GAS preprocessor) + Samuel Thibault (TASM parser and frontend) + +----------------------------------- +Yasm licensing overview and summary +----------------------------------- + +Note: This document does not provide legal advice nor is it the actual +license of any part of Yasm. See the individual licenses for complete +details. Consult a lawyer for legal advice. + +The primary license of Yasm is the 2-clause BSD license. Please use this +license if you plan on submitting code to the project. + +Yasm has absolutely no warranty; not even for merchantibility or fitness +for a particular purpose. + +------- +Libyasm +------- +Libyasm is 2-clause or 3-clause BSD licensed, with the exception of +bitvect, which is triple-licensed under the Artistic license, GPL, and +LGPL. Libyasm is thus GPL and LGPL compatible. In addition, this also +means that libyasm is free for binary-only distribution as long as the +terms of the 3-clause BSD license and Artistic license (as it applies to +bitvect) are fulfilled. + +------- +Modules +------- +The modules are 2-clause or 3-clause BSD licensed. + +--------- +Frontends +--------- +The frontends are 2-clause BSD licensed. + +------------- +License Texts +------------- +The full text of all licenses are provided in separate files in the source +distribution. Each source file may include the entire license (in the case +of the BSD and Artistic licenses), or may reference the GPL or LGPL license +file. + +BSD.txt - 2-clause and 3-clause BSD licenses +Artistic.txt - Artistic license +GNU_GPL-2.0 - GNU General Public License +GNU_LGPL-2.0 - GNU Library General Public License + +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.4, March 14th, 2010 + + Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly + Mark Adler + +*/ + +Copyright 2007, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- + +The file url_parse.cc is based on nsURLParsers.cc from Mozilla. This file is +licensed separately as follows: + +The contents of this file are subject to the Mozilla Public License Version +1.1 (the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the +License. + +The Original Code is mozilla.org code. + +The Initial Developer of the Original Code is +Netscape Communications Corporation. +Portions created by the Initial Developer are Copyright (C) 1998 +the Initial Developer. All Rights Reserved. + +Contributor(s): + Darin Fisher (original author) + +Alternatively, the contents of this file may be used under the terms of +either the GNU General Public License Version 2 or later (the "GPL"), or +the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +in which case the provisions of the GPL or the LGPL are applicable instead +of those above. If you wish to allow use of your version of this file only +under the terms of either the GPL or the LGPL, and not to allow others to +use your version of this file under the terms of the MPL, indicate your +decision by deleting the provisions above and replace them with the notice +and other provisions required by the GPL or the LGPL. If you do not delete +the provisions above, a recipient may use your version of this file under +the terms of any one of the MPL, the GPL or the LGPL. + +Copyright 2007, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- + +The file url_parse.cc is based on nsURLParsers.cc from Mozilla. This file is +licensed separately as follows: + +The contents of this file are subject to the Mozilla Public License Version +1.1 (the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the +License. + +The Original Code is mozilla.org code. + +The Initial Developer of the Original Code is +Netscape Communications Corporation. +Portions created by the Initial Developer are Copyright (C) 1998 +the Initial Developer. All Rights Reserved. + +Contributor(s): + Darin Fisher (original author) + +Alternatively, the contents of this file may be used under the terms of +either the GNU General Public License Version 2 or later (the "GPL"), or +the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +in which case the provisions of the GPL or the LGPL are applicable instead +of those above. If you wish to allow use of your version of this file only +under the terms of either the GPL or the LGPL, and not to allow others to +use your version of this file under the terms of the MPL, indicate your +decision by deleting the provisions above and replace them with the notice +and other provisions required by the GPL or the LGPL. If you do not delete +the provisions above, a recipient may use your version of this file under +the terms of any one of the MPL, the GPL or the LGPL. + +This license applies to all parts of V8 that are not externally +maintained libraries. The externally maintained libraries used by V8 +are: + + - PCRE test suite, located in + test/mjsunit/third_party/regexp-pcre.js. This is based on the + test suite from PCRE-7.3, which is copyrighted by the University + of Cambridge and Google, Inc. The copyright notice and license + are embedded in regexp-pcre.js. + + - Layout tests, located in test/mjsunit/third_party. These are + based on layout tests from webkit.org which are copyrighted by + Apple Computer, Inc. and released under a 3-clause BSD license. + + - Strongtalk assembler, the basis of the files assembler-arm-inl.h, + assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h, + assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h, + assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h, + assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h. + This code is copyrighted by Sun Microsystems Inc. and released + under a 3-clause BSD license. + + - Valgrind client API header, located at third_party/valgrind/valgrind.h + This is release under the BSD license. + +These libraries have their own licenses; we recommend you read them, +as their terms may differ from the terms below. + +Copyright 2006-2012, the V8 project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================ +Notices for file(s): +/bin/make_ext4fs +/bin/mkuserimg.sh +/lib/libext4_utils_host.a +------------------------------------------------------------ + + Copyright (c) 2010, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================ +Notices for file(s): +/lib/libsqlite_jni.so +------------------------------------------------------------ +This software is copyrighted by Christian Werner +and others. The following terms apply to all files associated with the +software unless explicitly disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +============================================================ +Notices for file(s): +/lib/libgccdemangle.so +------------------------------------------------------------ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +============================================================ +Notices for file(s): +/bin/aapt +/bin/aidl +/bin/dexdump +/bin/jasmin +/bin/split-select +/framework/android-mock-generatorlib.jar +/framework/jasmin.jar +/lib/lib64cutils.a +/lib/lib64log.a +/lib/lib64utils.a +/lib/libandroidfw.a +/lib/libcutils.a +/lib/liblog.a +/lib/liblog.so +/lib/libnativehelper.so +/lib/libsqlite3_android.a +/lib/libutils.a +/lib/libzipfile.a +------------------------------------------------------------ + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================ +Notices for file(s): +/framework/org.eclipse.core.commands_3.6.0.I20100512-1500.jar +/framework/org.eclipse.core.expressions_3.4.200.v20100505.jar +/framework/org.eclipse.core.runtime_3.6.0.v20100505.jar +/framework/org.eclipse.equinox.common_3.6.0.v20100503.jar +/framework/org.eclipse.jface_3.6.2.M20110210-1200.jar +/framework/org.eclipse.osgi_3.6.2.R36x_v20110210.jar +/framework/org.eclipse.ui.workbench.texteditor_3.6.1.r361_v20100714-0800.jar +/framework/org.eclipse.ui.workbench_3.6.2.M20110210-1200.jar +/framework/osgi.jar +/framework/propertysheet.jar +/framework/swt.jar +------------------------------------------------------------ + + Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF +THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +*1. DEFINITIONS* + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and +documentation distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and +are distributed by that particular Contributor. A Contribution +'originates' from a Contributor if it was added to the Program by such +Contributor itself or anyone acting on such Contributor's behalf. +Contributions do not include additions to the Program which: (i) are +separate modules of software distributed in conjunction with the Program +under their own license agreement, and (ii) are not derivative works of +the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +*2. GRANT OF RIGHTS* + +a) Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free copyright +license to reproduce, prepare derivative works of, publicly display, +publicly perform, distribute and sublicense the Contribution of such +Contributor, if any, and such derivative works, in source code and +object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free patent license +under Licensed Patents to make, use, sell, offer to sell, import and +otherwise transfer the Contribution of such Contributor, if any, in +source code and object code form. This patent license shall apply to the +combination of the Contribution and the Program if, at the time the +Contribution is added by the Contributor, such addition of the +Contribution causes such combination to be covered by the Licensed +Patents. The patent license shall not apply to any other combinations +which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the +licenses to its Contributions set forth herein, no assurances are +provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. Each +Contributor disclaims any liability to Recipient for claims brought by +any other entity based on infringement of intellectual property rights +or otherwise. As a condition to exercising the rights and licenses +granted hereunder, each Recipient hereby assumes sole responsibility to +secure any other intellectual property rights needed, if any. For +example, if a third party patent license is required to allow Recipient +to distribute the Program, it is Recipient's responsibility to acquire +that license before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient +copyright rights in its Contribution, if any, to grant the copyright +license set forth in this Agreement. + +*3. REQUIREMENTS* + +A Contributor may choose to distribute the Program in object code form +under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties +and conditions, express and implied, including warranties or conditions +of title and non-infringement, and implied warranties or conditions of +merchantability and fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for +damages, including direct, indirect, special, incidental and +consequential damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are +offered by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such +Contributor, and informs licensees how to obtain it in a reasonable +manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained +within the Program. + +Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution. + +*4. COMMERCIAL DISTRIBUTION* + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, the +Contributor who includes the Program in a commercial product offering +should do so in a manner which does not create potential liability for +other Contributors. Therefore, if a Contributor includes the Program in +a commercial product offering, such Contributor ("Commercial +Contributor") hereby agrees to defend and indemnify every other +Contributor ("Indemnified Contributor") against any losses, damages and +costs (collectively "Losses") arising from claims, lawsuits and other +legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the +Program in a commercial product offering. The obligations in this +section do not apply to any claims or Losses relating to any actual or +alleged intellectual property infringement. In order to qualify, an +Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial +Contributor to control, and cooperate with the Commercial Contributor +in, the defense and any related settlement negotiations. The Indemnified +Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages. + +*5. NO WARRANTY* + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED +ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES +OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR +A PARTICULAR PURPOSE. Each Recipient is solely responsible for +determining the appropriateness of using and distributing the Program +and assumes all risks associated with its exercise of rights under this +Agreement , including but not limited to the risks and costs of program +errors, compliance with applicable laws, damage to or loss of data, +programs or equipment, and unavailability or interruption of operations. + +*6. DISCLAIMER OF LIABILITY* + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR +ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +*7. GENERAL* + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further action +by the parties hereto, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including +a cross-claim or counterclaim in a lawsuit) alleging that the Program +itself (excluding combinations of the Program with other software or +hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails +to comply with any of the material terms or conditions of this Agreement +and does not cure such failure in a reasonable period of time after +becoming aware of such noncompliance. If all Recipient's rights under +this Agreement terminate, Recipient agrees to cease use and distribution +of the Program as soon as reasonably practicable. However, Recipient's +obligations under this Agreement and any licenses granted by Recipient +relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and may +only be modified in the following manner. The Agreement Steward reserves +the right to publish new versions (including revisions) of this +Agreement from time to time. No one other than the Agreement Steward has +the right to modify this Agreement. The Eclipse Foundation is the +initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is +published, Contributor may elect to distribute the Program (including +its Contributions) under the new version. Except as expressly stated in +Sections 2(a) and 2(b) above, Recipient receives no rights or licenses +to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in +the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to +this Agreement will bring a legal action under this Agreement more than +one year after the cause of action arose. Each party waives its rights +to a jury trial in any resulting litigation. + + +============================================================ +Notices for file(s): +/framework/bouncycastle-host.jar +/framework/bouncycastle-hostdex.jar +------------------------------------------------------------ +Copyright (c) 2000-2013 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +============================================================ +Notices for file(s): +/framework/commons-compress-1.0.jar +------------------------------------------------------------ +Apache Commons Compress +Copyright 2002-2009 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + +Original BZip2 classes contributed by Keiron Liddle +, Aftex Software to the Apache Ant project + +Original Tar classes from contributors of the Apache Ant project + +Original Zip classes from contributors of the Apache Ant project + +Original CPIO classes contributed by Markus Kuss and the jRPM project +(jrpm.sourceforge.net) + +============================================================ +Notices for file(s): +/lib/libbcc.so +------------------------------------------------------------ +========================== +NOTICE file for libbcc.git +========================== + +* NOTICE for lib/ExecutionEngine/, lib/ScriptCRT/, include and helper/. + + Copyright (c) 2005-2011, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + +* NOTICE for runtime/ and lib/CodeGen/. + Note: The NOTICE is the same for another git project, external/llvm.git. + +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- +Autoconf llvm/autoconf + llvm/projects/ModuleMaker/autoconf + llvm/projects/sample/autoconf +CellSPU backend llvm/lib/Target/CellSPU/README.txt +Google Test llvm/utils/unittest/googletest +OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} + + + +* NOTICE for tests/disassem.cpp and tests/disassem.h. + +/* $NetBSD: disassem.c,v 1.14 2003/03/27 16:58:36 mycroft Exp $ */ + +/*- + * Copyright (c) 1996 Mark Brinicombe. + * Copyright (c) 1996 Brini. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Brini. + * 4. The name of the company nor the name of the author may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * RiscBSD kernel project + * + * db_disasm.c + * + * Kernel disassembler + * + * Created : 10/02/96 + * + * Structured after the sparc/sparc/db_disasm.c by David S. Miller & + * Paul Kranenburg + * + * This code is not complete. Not all instructions are disassembled. + */ + +============================================================ +Notices for file(s): +/lib/libfdlibm.a +------------------------------------------------------------ +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + +Developed at SunSoft, a Sun Microsystems, Inc. business. +Permission to use, copy, modify, and distribute this +software is freely granted, provided that this notice +is preserved. + +============================================================ +Notices for file(s): +/bin/emulator-arm +/bin/emulator-mips +/bin/emulator-x86 +/bin/emulator +/bin/emulator64-arm +/bin/emulator64-mips +/bin/emulator64-x86 +/lib/emulator-common.a +/lib/emulator-libelff.a +/lib/emulator-libjpeg.a +/lib/emulator-libqemu.a +/lib/emulator-libui.a +/lib/emulator-target-arm.a +/lib/emulator-target-i386.a +/lib/emulator-target-mips.a +/lib/emulator64-common.a +/lib/emulator64-libelff.a +/lib/emulator64-libjpeg.a +/lib/emulator64-libqemu.a +/lib/emulator64-libui.a +/lib/emulator64-target-arm.a +/lib/emulator64-target-i386.a +/lib/emulator64-target-mips.a +------------------------------------------------------------ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + +============================================================ +Notices for file(s): +/framework/groovy-all-1.7.0.jar +------------------------------------------------------------ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +============================================================ +Notices for file(s): +/lib/libcorkscrew.so +------------------------------------------------------------ + + Copyright (c) 2011, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================ +Notices for file(s): +/framework/liblzf.jar +------------------------------------------------------------ +Copyright (c) 2000-2009 Marc Alexander Lehmann + +Redistribution and use in source and binary forms, with or without modifica- +tion, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- +CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- +CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH- +ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +Alternatively, the following files carry an additional notice that +explicitly allows relicensing under the GPLv2: lzf.c lzf.h lzfP.h lzf_c.c +lzf_d.c + + +============================================================ +Notices for file(s): +/lib/libLLVM.so +------------------------------------------------------------ +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- +Autoconf llvm/autoconf + llvm/projects/ModuleMaker/autoconf + llvm/projects/sample/autoconf +CellSPU backend llvm/lib/Target/CellSPU/README.txt +Google Test llvm/utils/unittest/googletest +OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} + +====================================================================== +== LICENSE.TXT for ./autoconf/LICENSE.TXT +====================================================================== + +------------------------------------------------------------------------------ +Autoconf Files +------------------------------------------------------------------------------ +All autoconf files are licensed under the LLVM license with the following +additions: + +llvm/autoconf/install-sh: + This script is licensed under the LLVM license, with the following + additional copyrights and restrictions: + + Copyright 1991 by the Massachusetts Institute of Technology + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of M.I.T. not be used in advertising or + publicity pertaining to distribution of the software without specific, + written prior permission. M.I.T. makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. + +Please see the source files for additional copyrights. + + +====================================================================== +== LICENSE.TXT for ./projects/sample/autoconf/LICENSE.TXT +====================================================================== + +------------------------------------------------------------------------------ +Autoconf Files +------------------------------------------------------------------------------ +All autoconf files are licensed under the LLVM license with the following +additions: + +llvm/autoconf/install-sh: + This script is licensed under the LLVM license, with the following + additional copyrights and restrictions: + + Copyright 1991 by the Massachusetts Institute of Technology + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of M.I.T. not be used in advertising or + publicity pertaining to distribution of the software without specific, + written prior permission. M.I.T. makes no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. + +Please see the source files for additional copyrights. + + +====================================================================== +== LICENSE.TXT for ./utils/unittest/googletest/LICENSE.TXT +====================================================================== + +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +====================================================================== +== LICENSE.TXT for ./include/llvm/Support/LICENSE.TXT +====================================================================== + +LLVM System Interface Library +------------------------------------------------------------------------------- +The LLVM System Interface Library is licensed under the Illinois Open Source +License and has the following additional copyright: + +Copyright (C) 2004 eXtensible Systems, Inc. + +============================================================ +Notices for file(s): +/framework/doclava.jar +------------------------------------------------------------ + + Copyright (C) 2010 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +====================================================================== + +jQuery 1.2.6 - New Wave Javascript + +Copyright (c) 2008 John Resig (jquery.com) +Dual licensed under the MIT (MIT-LICENSE.txt) +and GPL (GPL-LICENSE.txt) licenses. + +Copyright (c) 2009 John Resig, http://jquery.com/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +============================================================ +Notices for file(s): +/bin/sqlite3 +/lib/libsqlite.so +------------------------------------------------------------ +2001 September 15 + +The author disclaims copyright to this source code. In place of +a legal notice, here is a blessing: + + May you do good and not evil. + May you find forgiveness for yourself and forgive others. + May you share freely, never taking more than you give. + + +============================================================ +Notices for file(s): +/lib/libcrypto-host.so +/lib/libcrypto_static.a +/lib/libssl-host.so +------------------------------------------------------------ + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + + +============================================================ +Notices for file(s): +/lib/libexpat-host.so +/lib/libexpat.a +------------------------------------------------------------ +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +============================================================ +Notices for file(s): +/lib/libLLVMAnalysis.a +------------------------------------------------------------ +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- +Autoconf llvm/autoconf + llvm/projects/ModuleMaker/autoconf + llvm/projects/sample/autoconf +CellSPU backend llvm/lib/Target/CellSPU/README.txt +Google Test llvm/utils/unittest/googletest +OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} + +============================================================ +Notices for file(s): +/framework/emmalib.jar +------------------------------------------------------------ +Common Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S +ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was +added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules +of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative +works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, +use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the +combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered +by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + + c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the +Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other +entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole +responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the +Program, it is Recipient's responsibility to acquire that license before distributing the Program. + + d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this +Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, +and implied warranties or conditions of merchantability and fitness for a particular purpose; + + ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost +profits; + + iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + + iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium +customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the +Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the +commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other +Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a +third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a +commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to +qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate +with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor +then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this +section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, +WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for +determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to +the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this +Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any +patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes +patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other +software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a +reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the +Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following +manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the +right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new +version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under +which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new +version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal +action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. + +============================================================ +Notices for file(s): +/lib/libselinux.a +------------------------------------------------------------ +This library (libselinux) is public domain software, i.e. not copyrighted. + +Warranty Exclusion +------------------ +You agree that this software is a +non-commercially developed program that may contain "bugs" (as that +term is used in the industry) and that it may not function as intended. +The software is licensed "as is". NSA makes no, and hereby expressly +disclaims all, warranties, express, implied, statutory, or otherwise +with respect to the software, including noninfringement and the implied +warranties of merchantability and fitness for a particular purpose. + +Limitation of Liability +----------------------- +In no event will NSA be liable for any damages, including loss of data, +lost profits, cost of cover, or other special, incidental, +consequential, direct or indirect damages arising from the software or +the use thereof, however caused and on any theory of liability. This +limitation will apply even if NSA has been advised of the possibility +of such damage. You acknowledge that this is a reasonable allocation of +risk. + +============================================================ +Notices for file(s): +/framework/org-netbeans-api-visual.jar +/framework/org-openide-util.jar +------------------------------------------------------------ +The GNU General Public License (GPL) Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. + +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away +your freedom to share and change it. By contrast, the GNU +General Public License is intended to guarantee your freedom +to share and change free software--to make sure the software +is free for all its users. This General Public License +applies to most of the Free Software Foundation's software +and to any other program whose authors commit to using it. +(Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can +apply it to your programs, too. When we speak of free +software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and +charge for this service if you wish), that you receive +source code or can get it if you want it, that you can +change the software or use pieces of it in new free +programs; and that you know you can do these things. To +protect your rights, we need to make restrictions that +forbid anyone to deny you these rights or to ask you to +surrender the rights. These restrictions translate to +certain responsibilities for you if you distribute copies of +the software, or if you modify it. + +For example, if you distribute copies of such a program, +whether gratis or for a fee, you must give the recipients +all the rights that you have. You must make sure that they, +too, receive or can get the source code. And you must show +them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the +software, and (2) offer you this license which gives you +legal permission to copy, distribute and/or modify the +software. + +Also, for each author's protection and ours, we want to make +certain that everyone understands that there is no warranty +for this free software. If the software is modified by +someone else and passed on, we want its recipients to know +that what they have is not the original, so that any +problems introduced by others will not reflect on the +original authors' reputations. + +Finally, any free program is threatened constantly by +software patents. We wish to avoid the danger that +redistributors of a free program will individually obtain +patent licenses, in effect making the program proprietary. +To prevent this, we have made it clear that any patent must +be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution +and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND +MODIFICATION + +0. This License applies to any program or other work which +contains a notice placed by the copyright holder saying it +may be distributed under the terms of this General Public +License. The "Program", below, refers to any such program or +work, and a "work based on the Program" means either the +Program or any derivative work under copyright law: that is +to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into +another language. (Hereinafter, translation is included +without limitation in the term "modification".) Each +licensee is addressed as "you". + +Activities other than copying, distribution and modification +are not covered by this License; they are outside its scope. +The act of running the Program is not restricted, and the +output from the Program is covered only if its contents +constitute a work based on the Program (independent of +having been made by running the Program). Whether that is +true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the +Program's source code as you receive it, in any medium, +provided that you conspicuously and appropriately publish on +each copy an appropriate copyright notice and disclaimer of +warranty; keep intact all the notices that refer to this +License and to the absence of any warranty; and give any +other recipients of the Program a copy of this License along +with the Program. + +You may charge a fee for the physical act of transferring a +copy, and you may at your option offer warranty protection +in exchange for a fee. + +2. You may modify your copy or copies of the Program or any +portion of it, thus forming a work based on the Program, and +copy and distribute such modifications or work under the +terms of Section 1 above, provided that you also meet all of +these conditions: + +a) You must cause the modified files to carry prominent +notices stating that you changed the files and the date of +any change. + +b) You must cause any work that you distribute or publish, +that in whole or in part contains or is derived from the +Program or any part thereof, to be licensed as a whole at no +charge to all third parties under the terms of this License. + +c) If the modified program normally reads commands +interactively when run, you must cause it, when started +running for such interactive use in the most ordinary way, +to print or display an announcement including an appropriate +copyright notice and a notice that there is no warranty (or +else, saying that you provide a warranty) and that users may +redistribute the program under these conditions, and telling +the user how to view a copy of this License. (Exception: if +the Program itself is interactive but does not normally +print such an announcement, your work based on the Program +is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the +Program, and can be reasonably considered independent and +separate works in themselves, then this License, and its +terms, do not apply to those sections when you distribute +them as separate works. But when you distribute the same +sections as part of a whole which is a work based on the +Program, the distribution of the whole must be on the terms +of this License, whose permissions for other licensees +extend to the entire whole, and thus to each and every part +regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights +or contest your rights to work written entirely by you; +rather, the intent is to exercise the right to control the +distribution of derivative or collective works based on the +Program. In addition, mere aggregation of another work not +based on the Program with the Program (or with a work based +on the Program) on a volume of a storage or distribution +medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based +on it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you +also do one of the following: + +a) Accompany it with the complete corresponding +machine-readable source code, which must be distributed +under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least +three years, to give any third party, for a charge no more +than your cost of physically performing source distribution, +a complete machine-readable copy of the corresponding source +code, to be distributed under the terms of Sections 1 and 2 +above on a medium customarily used for software interchange; +or, + +c) Accompany it with the information you received as to the +offer to distribute corresponding source code. (This +alternative is allowed only for noncommercial distribution +and only if you received the program in object code or +executable form with such an offer, in accord with +Subsection b above.) + +The source code for a work means the preferred form of the +work for making modifications to it. For an executable work, +complete source code means all the source code for all +modules it contains, plus any associated interface +definition files, plus the scripts used to control +compilation and installation of the executable. However, as +a special exception, the source code distributed need not +include anything that is normally distributed (in either +source or binary form) with the major components (compiler, +kernel, and so on) of the operating system on which the +executable runs, unless that component itself accompanies +the executable. If distribution of executable or object code +is made by offering access to copy from a designated place, +then offering equivalent access to copy the source code from +the same place counts as distribution of the source code, +even though third parties are not compelled to copy the +source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the +Program except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense or distribute +the Program is void, and will automatically terminate your +rights under this License. However, parties who have +received copies, or rights, from you under this License will +not have their licenses terminated so long as such parties +remain in full compliance. + +5. You are not required to accept this License, since you +have not signed it. However, nothing else grants you +permission to modify or distribute the Program or its +derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or +distributing the Program (or any work based on the Program), +you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or +modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based +on the Program), the recipient automatically receives a +license from the original licensor to copy, distribute or +modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the +recipients' exercise of the rights granted herein. You are +not responsible for enforcing compliance by third parties to +this License. + +7. If, as a consequence of a court judgment or allegation of +patent infringement or for any other reason (not limited to +patent issues), conditions are imposed on you (whether by +court order, agreement or otherwise) that contradict the +conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as +to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a +consequence you may not distribute the Program at all. For +example, if a patent license would not permit royalty-free +redistribution of the Program by all those who receive +copies directly or indirectly through you, then the only way +you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or +unenforceable under any particular circumstance, the balance +of the section is intended to apply and the section as a +whole is intended to apply in other circumstances. It is not +the purpose of this section to induce you to infringe any +patents or other property right claims or to contest +validity of any such claims; this section has the sole +purpose of protecting the integrity of the free software +distribution system, which is implemented by public license +practices. Many people have made generous contributions to +the wide range of software distributed through that system +in reliance on consistent application of that system; it is +up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee +cannot impose that choice. + +This section is intended to make thoroughly clear what is +believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is +restricted in certain countries either by patents or by +copyrighted interfaces, the original copyright holder who +places the Program under this License may add an explicit +geographical distribution limitation excluding those +countries, so that distribution is permitted only in or +among countries not thus excluded. In such case, this +License incorporates the limitation as if written in the +body of this License. + +9. The Free Software Foundation may publish revised and/or +new versions of the General Public License from time to +time. Such new versions will be similar in spirit to the +present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If +the Program specifies a version number of this License which +applies to it and "any later version", you have the option +of following the terms and conditions either of that version +or of any later version published by the Free Software +Foundation. If the Program does not specify a version number +of this License, you may choose any version ever published +by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into +other free programs whose distribution conditions are +different, write to the author to ask for permission. For +software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we +sometimes make exceptions for this. Our decision will be +guided by the two goals of preserving the free status of all +derivatives of our free software and of promoting the +sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS +NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE +COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR +IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE +OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED +TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY +WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED +ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, +SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF +THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT +LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH +HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the +greatest possible use to the public, the best way to achieve +this is to make it free software which everyone can +redistribute and change under these terms. + +To do so, attach the following notices to the program. It is +safest to attach them to the start of each source file to +most effectively convey the exclusion of warranty; and each +file should have at least the "copyright" line and a pointer +to where the full notice is found. + +One line to give the program's name and a brief idea of what +it does. + +Copyright (C) +This program is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later +version. This program is distributed in the hope that it +will be useful, but WITHOUT ANY WARRANTY; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for +more details. You should have received a copy of the GNU +General Public License along with this program; if not, +write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and +paper mail. If the program is interactive, make it output a +short notice like this when it starts in an interactive +mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details +type `show w'. This is free software, and you are welcome to +redistribute it under certain conditions; type `show c' for +details. The hypothetical commands `show w' and `show c' +should show the appropriate parts of the General Public +License. Of course, the commands you use may be called +something other than `show w' and `show c'; they could even +be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a +programmer) or your school, if any, to sign a "copyright +disclaimer" for the program, if necessary. Here is a sample; +alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in +the program `Gnomovision' (which makes passes at compilers) +written by James Hacker. + +signature of Ty Coon, 1 April 1989 +Ty Coon, President of Vice +This General Public License does not permit incorporating +your program into proprietary programs. If your program is a +subroutine library, you may consider it more useful to +permit linking proprietary applications with the library. If +this is what you want to do, use the GNU Library General +Public License instead of this License. + +"CLASSPATH" EXCEPTION TO THE GPL VERSION 2 + +Certain source files distributed by Sun Microsystems, Inc. +are subject to the following clarification and special +exception to the GPL Version 2, but only where Sun has +expressly included in the particular source file's header +the words "Sun designates this particular file as subject +to the "Classpath" exception as provided by Sun in the +License file that accompanied this code." + + Linking this library statically or dynamically with other +modules is making a combined work based on this library. +Thus, the terms and conditions of the GNU General Public +License Version 2 cover the whole combination. + + As a special exception, the copyright holders of this +library give you permission to link this library with +independent modules to produce an executable, regardless of +the license terms of these independent modules, and to copy +and distribute the resulting executable under terms of your +choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license +of that module. An independent module is a module which is +not derived from or based on this library. If you modify +this library, you may extend this exception to your version +of the library, but you are not obligated to do so. If you +do not wish to do so, delete this exception statement from +your version. +============================================================ +Notices for file(s): +/bin/adb +------------------------------------------------------------ + + Copyright (c) 2006-2009, The Android Open Source Project + Copyright 2006, Brian Swetland + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================ +Notices for file(s): +/framework/apache-xml-hostdex.jar +------------------------------------------------------------ + ========================================================================= + == NOTICE file corresponding to section 4(d) of the Apache License, == + == Version 2.0, in this case for the Apache Xalan Java distribution. == + ========================================================================= + + Apache Xalan (Xalan XSLT processor) + Copyright 1999-2006 The Apache Software Foundation + + Apache Xalan (Xalan serializer) + Copyright 1999-2006 The Apache Software Foundation + + This product includes software developed at + The Apache Software Foundation (http://www.apache.org/). + + ========================================================================= + Portions of this software was originally based on the following: + - software copyright (c) 1999-2002, Lotus Development Corporation., + http://www.lotus.com. + - software copyright (c) 2001-2002, Sun Microsystems., + http://www.sun.com. + - software copyright (c) 2003, IBM Corporation., + http://www.ibm.com. + + ========================================================================= + The binary distribution package (ie. jars, samples and documentation) of + this product includes software developed by the following: + + - The Apache Software Foundation + - Xerces Java - see LICENSE.txt + - JAXP 1.3 APIs - see LICENSE.txt + - Bytecode Engineering Library - see LICENSE.txt + - Regular Expression - see LICENSE.txt + + - Scott Hudson, Frank Flannery, C. Scott Ananian + - CUP Parser Generator runtime (javacup\runtime) - see LICENSE.txt + + ========================================================================= + The source distribution package (ie. all source and tools required to build + Xalan Java) of this product includes software developed by the following: + + - The Apache Software Foundation + - Xerces Java - see LICENSE.txt + - JAXP 1.3 APIs - see LICENSE.txt + - Bytecode Engineering Library - see LICENSE.txt + - Regular Expression - see LICENSE.txt + - Ant - see LICENSE.txt + - Stylebook doc tool - see LICENSE.txt + + - Elliot Joel Berk and C. Scott Ananian + - Lexical Analyzer Generator (JLex) - see LICENSE.txt + + ========================================================================= + Apache Xerces Java + Copyright 1999-2006 The Apache Software Foundation + + This product includes software developed at + The Apache Software Foundation (http://www.apache.org/). + + Portions of Apache Xerces Java in xercesImpl.jar and xml-apis.jar + were originally based on the following: + - software copyright (c) 1999, IBM Corporation., http://www.ibm.com. + - software copyright (c) 1999, Sun Microsystems., http://www.sun.com. + - voluntary contributions made by Paul Eng on behalf of the + Apache Software Foundation that were originally developed at iClick, Inc., + software copyright (c) 1999. + + ========================================================================= + Apache xml-commons xml-apis (redistribution of xml-apis.jar) + + Apache XML Commons + Copyright 2001-2003,2006 The Apache Software Foundation. + + This product includes software developed at + The Apache Software Foundation (http://www.apache.org/). + + Portions of this software were originally based on the following: + - software copyright (c) 1999, IBM Corporation., http://www.ibm.com. + - software copyright (c) 1999, Sun Microsystems., http://www.sun.com. + - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org + + +============================================================ +Notices for file(s): +/bin/llvm-rs-cc +/bin/rs-spec-gen +/lib/libslang.a +------------------------------------------------------------ +========================= +NOTICE file for slang.git +========================= + + Copyright (c) 2005-2011, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + +=========================================== +NOTICE file for external/clang (clang.git). +Note: libclang*.a are statically linked. +=========================================== + +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2007-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- + + + + +========================================= +NOTICE file for external/llvm (llvm.git). +Note: libLLVM*.a are statically linked. +========================================= + +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- +Autoconf llvm/autoconf + llvm/projects/ModuleMaker/autoconf + llvm/projects/sample/autoconf +CellSPU backend llvm/lib/Target/CellSPU/README.txt +Google Test llvm/utils/unittest/googletest +OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} + +============================================================ +Notices for file(s): +/bin/minigzip +/lib/libunz.a +/lib/libz-host.so +/lib/libz.a +------------------------------------------------------------ + (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +============================================================ +Notices for file(s): +/bin/mksnapshot.arm +------------------------------------------------------------ +Copyright (c) 1994-2006 Sun Microsystems Inc. +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +- Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +- Redistribution in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of Sun Microsystems or the names of contributors may +be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The original source code covered by the above license above has been +modified significantly by Google Inc. +Copyright 2006-2008 the V8 project authors. All rights reserved. + +============================================================ +Notices for file(s): +/lib/libpng.a +------------------------------------------------------------ + +This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.2.46, July 9, 2011, are +Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.2.5 +with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the + library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is with + the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-0.96, +with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" +boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a +certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +July 9, 2011 + +============================================================ +Notices for file(s): +/framework/antlr-runtime.jar +------------------------------------------------------------ +[The "BSD license"] +Copyright (c) 201 Terence Parr +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================ +Notices for file(s): +/framework/junit.jar +------------------------------------------------------------ +Common Public License - v 1.0 + + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and +b) in the case of each subsequent Contributor: +i) changes to the Program, and +ii) additions to the Program; +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + + +"Program" means the Contributions distributed in accordance with this Agreement. + + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. +b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. +c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. +d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and +b) its license agreement: +i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; +ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; +iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and +iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. +============================================================ +Notices for file(s): +/framework/ant-glob.jar +------------------------------------------------------------ +/* + * Apache License + * Version 2.0, January 2004 + * http://www.apache.org/licenses/ + * + * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + * + * 1. Definitions. + * + * "License" shall mean the terms and conditions for use, reproduction, + * and distribution as defined by Sections 1 through 9 of this document. + * + * "Licensor" shall mean the copyright owner or entity authorized by + * the copyright owner that is granting the License. + * + * "Legal Entity" shall mean the union of the acting entity and all + * other entities that control, are controlled by, or are under common + * control with that entity. For the purposes of this definition, + * "control" means (i) the power, direct or indirect, to cause the + * direction or management of such entity, whether by contract or + * otherwise, or (ii) ownership of fifty percent (50%) or more of the + * outstanding shares, or (iii) beneficial ownership of such entity. + * + * "You" (or "Your") shall mean an individual or Legal Entity + * exercising permissions granted by this License. + * + * "Source" form shall mean the preferred form for making modifications, + * including but not limited to software source code, documentation + * source, and configuration files. + * + * "Object" form shall mean any form resulting from mechanical + * transformation or translation of a Source form, including but + * not limited to compiled object code, generated documentation, + * and conversions to other media types. + * + * "Work" shall mean the work of authorship, whether in Source or + * Object form, made available under the License, as indicated by a + * copyright notice that is included in or attached to the work + * (an example is provided in the Appendix below). + * + * "Derivative Works" shall mean any work, whether in Source or Object + * form, that is based on (or derived from) the Work and for which the + * editorial revisions, annotations, elaborations, or other modifications + * represent, as a whole, an original work of authorship. For the purposes + * of this License, Derivative Works shall not include works that remain + * separable from, or merely link (or bind by name) to the interfaces of, + * the Work and Derivative Works thereof. + * + * "Contribution" shall mean any work of authorship, including + * the original version of the Work and any modifications or additions + * to that Work or Derivative Works thereof, that is intentionally + * submitted to Licensor for inclusion in the Work by the copyright owner + * or by an individual or Legal Entity authorized to submit on behalf of + * the copyright owner. For the purposes of this definition, "submitted" + * means any form of electronic, verbal, or written communication sent + * to the Licensor or its representatives, including but not limited to + * communication on electronic mailing lists, source code control systems, + * and issue tracking systems that are managed by, or on behalf of, the + * Licensor for the purpose of discussing and improving the Work, but + * excluding communication that is conspicuously marked or otherwise + * designated in writing by the copyright owner as "Not a Contribution." + * + * "Contributor" shall mean Licensor and any individual or Legal Entity + * on behalf of whom a Contribution has been received by Licensor and + * subsequently incorporated within the Work. + * + * 2. Grant of Copyright License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * copyright license to reproduce, prepare Derivative Works of, + * publicly display, publicly perform, sublicense, and distribute the + * Work and such Derivative Works in Source or Object form. + * + * 3. Grant of Patent License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * (except as stated in this section) patent license to make, have made, + * use, offer to sell, sell, import, and otherwise transfer the Work, + * where such license applies only to those patent claims licensable + * by such Contributor that are necessarily infringed by their + * Contribution(s) alone or by combination of their Contribution(s) + * with the Work to which such Contribution(s) was submitted. If You + * institute patent litigation against any entity (including a + * cross-claim or counterclaim in a lawsuit) alleging that the Work + * or a Contribution incorporated within the Work constitutes direct + * or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate + * as of the date such litigation is filed. + * + * 4. Redistribution. You may reproduce and distribute copies of the + * Work or Derivative Works thereof in any medium, with or without + * modifications, and in Source or Object form, provided that You + * meet the following conditions: + * + * (a) You must give any other recipients of the Work or + * Derivative Works a copy of this License; and + * + * (b) You must cause any modified files to carry prominent notices + * stating that You changed the files; and + * + * (c) You must retain, in the Source form of any Derivative Works + * that You distribute, all copyright, patent, trademark, and + * attribution notices from the Source form of the Work, + * excluding those notices that do not pertain to any part of + * the Derivative Works; and + * + * (d) If the Work includes a "NOTICE" text file as part of its + * distribution, then any Derivative Works that You distribute must + * include a readable copy of the attribution notices contained + * within such NOTICE file, excluding those notices that do not + * pertain to any part of the Derivative Works, in at least one + * of the following places: within a NOTICE text file distributed + * as part of the Derivative Works; within the Source form or + * documentation, if provided along with the Derivative Works; or, + * within a display generated by the Derivative Works, if and + * wherever such third-party notices normally appear. The contents + * of the NOTICE file are for informational purposes only and + * do not modify the License. You may add Your own attribution + * notices within Derivative Works that You distribute, alongside + * or as an addendum to the NOTICE text from the Work, provided + * that such additional attribution notices cannot be construed + * as modifying the License. + * + * You may add Your own copyright statement to Your modifications and + * may provide additional or different license terms and conditions + * for use, reproduction, or distribution of Your modifications, or + * for any such Derivative Works as a whole, provided Your use, + * reproduction, and distribution of the Work otherwise complies with + * the conditions stated in this License. + * + * 5. Submission of Contributions. Unless You explicitly state otherwise, + * any Contribution intentionally submitted for inclusion in the Work + * by You to the Licensor shall be under the terms and conditions of + * this License, without any additional terms or conditions. + * Notwithstanding the above, nothing herein shall supersede or modify + * the terms of any separate license agreement you may have executed + * with Licensor regarding such Contributions. + * + * 6. Trademarks. This License does not grant permission to use the trade + * names, trademarks, service marks, or product names of the Licensor, + * except as required for reasonable and customary use in describing the + * origin of the Work and reproducing the content of the NOTICE file. + * + * 7. Disclaimer of Warranty. Unless required by applicable law or + * agreed to in writing, Licensor provides the Work (and each + * Contributor provides its Contributions) on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied, including, without limitation, any warranties or conditions + * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + * PARTICULAR PURPOSE. You are solely responsible for determining the + * appropriateness of using or redistributing the Work and assume any + * risks associated with Your exercise of permissions under this License. + * + * 8. Limitation of Liability. In no event and under no legal theory, + * whether in tort (including negligence), contract, or otherwise, + * unless required by applicable law (such as deliberate and grossly + * negligent acts) or agreed to in writing, shall any Contributor be + * liable to You for damages, including any direct, indirect, special, + * incidental, or consequential damages of any character arising as a + * result of this License or out of the use or inability to use the + * Work (including but not limited to damages for loss of goodwill, + * work stoppage, computer failure or malfunction, or any and all + * other commercial damages or losses), even if such Contributor + * has been advised of the possibility of such damages. + * + * 9. Accepting Warranty or Additional Liability. While redistributing + * the Work or Derivative Works thereof, You may choose to offer, + * and charge a fee for, acceptance of support, warranty, indemnity, + * or other liability obligations and/or rights consistent with this + * License. However, in accepting such obligations, You may act only + * on Your own behalf and on Your sole responsibility, not on behalf + * of any other Contributor, and only if You agree to indemnify, + * defend, and hold each Contributor harmless for any liability + * incurred by, or claims asserted against, such Contributor by reason + * of your accepting any such warranty or additional liability. + * + * END OF TERMS AND CONDITIONS + * + * APPENDIX: How to apply the Apache License to your work. + * + * To apply the Apache License to your work, attach the following + * boilerplate notice, with the fields enclosed by brackets "[]" + * replaced with your own identifying information. (Don't include + * the brackets!) The text should be enclosed in the appropriate + * comment syntax for the file format. We also recommend that a + * file or class name and description of purpose be included on the + * same "printed page" as the copyright notice for easier + * identification within third-party archives. + * + * Copyright [yyyy] [name of copyright owner] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +W3C® SOFTWARE NOTICE AND LICENSE +http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + +This work (and included software, documentation such as READMEs, or other +related items) is being provided by the copyright holders under the following +license. By obtaining, using and/or copying this work, you (the licensee) agree +that you have read, understood, and will comply with the following terms and +conditions. + +Permission to copy, modify, and distribute this software and its documentation, +with or without modification, for any purpose and without fee or royalty is +hereby granted, provided that you include the following on ALL copies of the +software and documentation or portions thereof, including modifications: + + 1. The full text of this NOTICE in a location viewable to users of the + redistributed or derivative work. + 2. Any pre-existing intellectual property disclaimers, notices, or terms + and conditions. If none exist, the W3C Software Short Notice should be + included (hypertext is preferred, text is permitted) within the body + of any redistributed or derivative code. + 3. Notice of any changes or modifications to the files, including the date + changes were made. (We recommend you provide URIs to the location from + which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE +NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT +THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY +PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in advertising or +publicity pertaining to the software without specific, written prior permission. +Title to copyright in this software and any associated documentation will at +all times remain with copyright holders. + +____________________________________ + +This formulation of W3C's notice and license became active on December 31 2002. +This version removes the copyright ownership notice such that this license can +be used with materials other than those owned by the W3C, reflects that ERCIM +is now a host of the W3C, includes references to this specific dated version of +the license, and removes the ambiguous grant of "use". Otherwise, this version +is the same as the previous version and is written so as to preserve the Free +Software Foundation's assessment of GPL compatibility and OSI's certification +under the Open Source Definition. Please see our Copyright FAQ for common +questions about using materials from our site, including specific terms and +conditions for packages like libwww, Amaya, and Jigsaw. Other questions about +this notice can be directed to site-policy@w3.org. + +Joseph Reagle + +This license came from: http://www.megginson.com/SAX/copying.html + However please note future versions of SAX may be covered + under http://saxproject.org/?selected=pd + +SAX2 is Free! + +I hereby abandon any property rights to SAX 2.0 (the Simple API for +XML), and release all of the SAX 2.0 source code, compiled code, and +documentation contained in this distribution into the Public Domain. +SAX comes with NO WARRANTY or guarantee of fitness for any +purpose. + +David Megginson, david@megginson.com +2000-05-05 + +============================================================ +Notices for file(s): +/lib/libclang.so +/lib/libclangAnalysis.a +------------------------------------------------------------ +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2007-2011 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- + + +============================================================ +Notices for file(s): +/framework/guavalib.jar +------------------------------------------------------------ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +============================================================ +Notices for file(s): +/core-lambda-stubs.jar +------------------------------------------------------------ +The GNU General Public License (GPL) + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you +can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must +make sure that they, too, receive or can get the source code. And you must +show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program proprietary. +To prevent this, we have made it clear that any patent must be licensed for +everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included +without limitation in the term "modification".) Each licensee is addressed as +"you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is +not restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as +you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the +Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may +at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus +forming a work based on the Program, and copy and distribute such modifications +or work under the terms of Section 1 above, provided that you also meet all of +these conditions: + + a) You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or + in part contains or is derived from the Program or any part thereof, to be + licensed as a whole at no charge to all third parties under the terms of + this License. + + c) If the modified program normally reads commands interactively when run, + you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms +of this License, whose permissions for other licensees extend to the entire +whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on +the Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and +2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above + on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only + for noncommercial distribution and only if you received the program in + object code or executable form with such an offer, in accord with + Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code +distributed need not include anything that is normally distributed (in either +source or binary form) with the major components (compiler, kernel, and so on) +of the operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source +code from the same place counts as distribution of the source code, even though +third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the Program +or its derivative works. These actions are prohibited by law if you do not +accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor to +copy, distribute or modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the recipients' exercise of the +rights granted herein. You are not responsible for enforcing compliance by +third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through +you, then the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In +such case, this License incorporates the limitation as if written in the body +of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems +or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any later +version", you have the option of following the terms and conditions either of +that version or of any later version published by the Free Software Foundation. +If the Program does not specify a version number of this License, you may +choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE +PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL +ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE +PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively convey the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + + One line to give the program's name and a brief idea of what it does. + + Copyright (C) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., 59 + Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it +starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes + with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free + software, and you are welcome to redistribute it under certain conditions; + type 'show c' for details. + +The hypothetical commands 'show w' and 'show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than 'show w' and 'show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + 'Gnomovision' (which makes passes at compilers) written by James Hacker. + + signature of Ty Coon, 1 April 1989 + + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General Public +License instead of this License. + + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. + +============================================================ +Notices for file(s): +/lib/d8.jar +------------------------------------------------------------ +This file lists all licenses for code distributed. +All non-library code has the following 3-Clause BSD license. + + +Copyright (c) 2016, the R8 project authors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Summary of distributed libraries: + +- artifact: com.google.guava:guava:+ + name: Guava Google Core Libraries for Java + copyrightHolder: The Guava Authors + license: The Apache Software License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt +- artifact: com.google.code.gson:gson:+ + name: Gson + license: The Apache Software License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: https://github.com/google/gson +- artifact: it.unimi.dsi:fastutil:+ + name: fastutil + license: Apache License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.html + url: http://fasutil.di.unimi.it/ +- artifact: net.sf.jopt-simple:jopt-simple:+ + name: JOpt Simple + license: The MIT License + licenseUrl: http://www.opensource.org/licenses/mit-license.php + url: http://pholser.github.com/jopt-simple +- artifact: org.ow2.asm:asm-commons:+ + name: ASM Commons + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.ow2.asm:asm-tree:+ + name: ASM Tree + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.ow2.asm:asm-util:+ + name: ASM Util + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.ow2.asm:asm-analysis:+ + name: ASM Util + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.ow2.asm:asm:+ + name: ASM Core + copyrightHolder: INRIA, France Telecom + license: ASM license + licenseUrl: http://asm.ow2.org/license.html + url: http://asm.ow2.org/index.html +- artifact: org.jetbrains.kotlin:kotlin-stdlib:+ + name: org.jetbrains.kotlin:kotlin-stdlib + copyrightHolder: JetBrains s.r.o. + license: The Apache License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: https://kotlinlang.org/ +- artifact: org.jetbrains.kotlin:kotlin-stdlib-common:+ + name: org.jetbrains.kotlin:kotlin-stdlib + copyrightHolder: JetBrains s.r.o. + license: The Apache License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: https://kotlinlang.org/ +- artifact: org.jetbrains.kotlinx:kotlinx-metadata-jvm:+ + name: org.jetbrains.kotlinx:kotlinx-metadata-jvm + copyrightHolder: JetBrains s.r.o. + license: The Apache License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: https://kotlinlang.org/ +- artifact: org.jetbrains:annotations:+ + name: IntelliJ IDEA Annotations + copyrightHolder: JetBrains s.r.o. + license: The Apache Software License, Version 2.0 + licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt + url: http://www.jetbrains.org + + +Licenses details: + + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Copyright (c) 2000-2011 INRIA, France Telecom +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. + +Apache Commons Compress +Copyright 2002-2016 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +The files in the package org.apache.commons.compress.archivers.sevenz +were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/), +which has been placed in the public domain: + +"LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html) + + + The MIT License + + Copyright (c) 2004-2016 Paul R. Holser, Jr. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +============================================================================== +Copyright (c) 2011 mingw-w64 project + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +/* + * Parts of this library are derived by: + * + * Posix Threads library for Microsoft Windows + * + * Use at own risk, there is no implied warranty to this code. + * It uses undocumented features of Microsoft Windows that can change + * at any time in the future. + * + * (C) 2010 Lockless Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Lockless Inc. nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AN + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +============================================================================== +Copyright 2008 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. + +============================================================================== +2001 September 15 + +The author disclaims copyright to this source code. In place of +a legal notice, here is a blessing: + + May you do good and not evil. + May you find forgiveness for yourself and forgive others. + May you share freely, never taking more than you give. + + +============================================================================== + + Copyright (c) 2010, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== + + Copyright (c) 2005-2019, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Copyright 2010 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== + + Copyright (c) 2005-2014, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== + + Copyright (c) 2005-2013, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +============================================================================== + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Android-specific code. == + ========================================================================= + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + ========================================================================= + == NOTICE file for the x86 JIT libenc subdirectory. == + ========================================================================= + +Apache Harmony +Copyright 2006, 2010 The Apache Software Foundation. + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +Portions of Harmony were originally developed by +Intel Corporation and are licensed to the Apache Software +Foundation under the "Software Grant and Corporate Contribution +License Agreement" and for which the following copyright notices +apply + (C) Copyright 2005 Intel Corporation + (C) Copyright 2005-2006 Intel Corporation + (C) Copyright 2006 Intel Corporation + +Portions of the Apache Portable Runtime used by DRLVM were +developed at the National Center for Supercomputing Applications +(NCSA) at the University of Illinois at Urbana-Champaign. + +This software contains code derived from the RSA Data Security +Inc. MD5 Message-Digest Algorithm. + +This software contains code derived from UNIX V7, Copyright(C) +Caldera International Inc. + +============================================================================== +version 1.2.12, March 27th, 2022 + +Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +============================================================================== +BSD License + +For Zstandard software + +Copyright (c) 2016-present, Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================== + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/tools/android-platform-tools/windows/adb.exe b/tools/android-platform-tools/windows/adb.exe new file mode 100644 index 0000000..55f65f9 Binary files /dev/null and b/tools/android-platform-tools/windows/adb.exe differ diff --git a/tools/android-platform-tools/windows/dmtracedump.exe b/tools/android-platform-tools/windows/dmtracedump.exe new file mode 100644 index 0000000..a5aa0b6 Binary files /dev/null and b/tools/android-platform-tools/windows/dmtracedump.exe differ diff --git a/tools/android-platform-tools/windows/etc1tool.exe b/tools/android-platform-tools/windows/etc1tool.exe new file mode 100644 index 0000000..f48fe06 Binary files /dev/null and b/tools/android-platform-tools/windows/etc1tool.exe differ diff --git a/tools/android-platform-tools/windows/fastboot.exe b/tools/android-platform-tools/windows/fastboot.exe new file mode 100644 index 0000000..5267a6e Binary files /dev/null and b/tools/android-platform-tools/windows/fastboot.exe differ diff --git a/tools/android-platform-tools/windows/hprof-conv.exe b/tools/android-platform-tools/windows/hprof-conv.exe new file mode 100644 index 0000000..786210e Binary files /dev/null and b/tools/android-platform-tools/windows/hprof-conv.exe differ diff --git a/tools/android-platform-tools/windows/libwinpthread-1.dll b/tools/android-platform-tools/windows/libwinpthread-1.dll new file mode 100644 index 0000000..2ee2901 Binary files /dev/null and b/tools/android-platform-tools/windows/libwinpthread-1.dll differ diff --git a/tools/android-platform-tools/windows/make_f2fs.exe b/tools/android-platform-tools/windows/make_f2fs.exe new file mode 100644 index 0000000..51cbaec Binary files /dev/null and b/tools/android-platform-tools/windows/make_f2fs.exe differ diff --git a/tools/android-platform-tools/windows/make_f2fs_casefold.exe b/tools/android-platform-tools/windows/make_f2fs_casefold.exe new file mode 100644 index 0000000..aa4110c Binary files /dev/null and b/tools/android-platform-tools/windows/make_f2fs_casefold.exe differ diff --git a/tools/android-platform-tools/windows/mke2fs.conf b/tools/android-platform-tools/windows/mke2fs.conf new file mode 100644 index 0000000..8ea960d --- /dev/null +++ b/tools/android-platform-tools/windows/mke2fs.conf @@ -0,0 +1,53 @@ +[defaults] + base_features = sparse_super,large_file,filetype,dir_index,ext_attr + default_mntopts = acl,user_xattr + enable_periodic_fsck = 0 + blocksize = 4096 + inode_size = 256 + inode_ratio = 16384 + reserved_ratio = 1.0 + +[fs_types] + ext3 = { + features = has_journal + } + ext4 = { + features = has_journal,extent,huge_file,dir_nlink,extra_isize,uninit_bg + inode_size = 256 + } + ext4dev = { + features = has_journal,extent,huge_file,flex_bg,inline_data,64bit,dir_nlink,extra_isize + inode_size = 256 + options = test_fs=1 + } + small = { + blocksize = 1024 + inode_size = 128 + inode_ratio = 4096 + } + floppy = { + blocksize = 1024 + inode_size = 128 + inode_ratio = 8192 + } + big = { + inode_ratio = 32768 + } + huge = { + inode_ratio = 65536 + } + news = { + inode_ratio = 4096 + } + largefile = { + inode_ratio = 1048576 + blocksize = -1 + } + largefile4 = { + inode_ratio = 4194304 + blocksize = -1 + } + hurd = { + blocksize = 4096 + inode_size = 128 + } diff --git a/tools/android-platform-tools/windows/mke2fs.exe b/tools/android-platform-tools/windows/mke2fs.exe new file mode 100644 index 0000000..0cb6acc Binary files /dev/null and b/tools/android-platform-tools/windows/mke2fs.exe differ diff --git a/tools/android-platform-tools/windows/source.properties b/tools/android-platform-tools/windows/source.properties new file mode 100644 index 0000000..779c925 --- /dev/null +++ b/tools/android-platform-tools/windows/source.properties @@ -0,0 +1,2 @@ +Pkg.UserSrc=false +Pkg.Revision=34.0.4 diff --git a/tools/android-platform-tools/windows/sqlite3.exe b/tools/android-platform-tools/windows/sqlite3.exe new file mode 100644 index 0000000..c232227 Binary files /dev/null and b/tools/android-platform-tools/windows/sqlite3.exe differ diff --git a/tools/cmake/FindBpfObject.cmake b/tools/cmake/FindBpfObject.cmake new file mode 100644 index 0000000..00c00ec --- /dev/null +++ b/tools/cmake/FindBpfObject.cmake @@ -0,0 +1,185 @@ +# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause + +#[=======================================================================[.rst: +FindBpfObject +-------- + +Find BpfObject + +This module finds if all the dependencies for eBPF Compile-Once-Run-Everywhere +programs are available and where all the components are located. + +The caller may set the following variables to disable automatic +search/processing for the associated component: + + ``BPFOBJECT_BPFTOOL_EXE`` + Path to ``bpftool`` binary + + ``BPFOBJECT_CLANG_EXE`` + Path to ``clang`` binary + + ``LIBBPF_INCLUDE_DIRS`` + Path to ``libbpf`` development headers + + ``LIBBPF_LIBRARIES`` + Path to `libbpf` library + + ``BPFOBJECT_VMLINUX_H`` + Path to ``vmlinux.h`` generated by ``bpftool``. If unset, this module will + attempt to automatically generate a copy. + +This module sets the following result variables: + +:: + + BpfObject_FOUND = TRUE if all components are found + + +This module also provides the ``bpf_object()`` macro. This macro generates a +cmake interface library for the BPF object's generated skeleton as well +as the associated dependencies. + +.. code-block:: cmake + + bpf_object( ) + +Given an abstract ```` for a BPF object and the associated ```` +file, generates an interface library target, ``_skel``, that may be +linked against by other cmake targets. + +Example Usage: + +:: + + find_package(BpfObject REQUIRED) + bpf_object(myobject myobject.bpf.c) + add_executable(myapp myapp.c) + target_link_libraries(myapp myobject_skel) + +#]=======================================================================] + +if(NOT BPFOBJECT_BPFTOOL_EXE) + find_program(BPFOBJECT_BPFTOOL_EXE NAMES bpftool DOC "Path to bpftool executable") +endif() + +if(NOT BPFOBJECT_CLANG_EXE) + find_program(BPFOBJECT_CLANG_EXE NAMES clang DOC "Path to clang executable") + + execute_process(COMMAND ${BPFOBJECT_CLANG_EXE} --version + OUTPUT_VARIABLE CLANG_version_output + ERROR_VARIABLE CLANG_version_error + RESULT_VARIABLE CLANG_version_result + OUTPUT_STRIP_TRAILING_WHITESPACE) + + # Check that clang is new enough + if(${CLANG_version_result} EQUAL 0) + if("${CLANG_version_output}" MATCHES "clang version ([^\n]+)\n") + # Transform X.Y.Z into X;Y;Z which can then be interpreted as a list + set(CLANG_VERSION "${CMAKE_MATCH_1}") + string(REPLACE "." ";" CLANG_VERSION_LIST ${CLANG_VERSION}) + list(GET CLANG_VERSION_LIST 0 CLANG_VERSION_MAJOR) + + # Anything older than clang 10 doesn't really work + string(COMPARE LESS ${CLANG_VERSION_MAJOR} 10 CLANG_VERSION_MAJOR_LT10) + if(${CLANG_VERSION_MAJOR_LT10}) + message(FATAL_ERROR "clang ${CLANG_VERSION} is too old for BPF CO-RE") + endif() + + message(STATUS "Found clang version: ${CLANG_VERSION}") + else() + message(FATAL_ERROR "Failed to parse clang version string: ${CLANG_version_output}") + endif() + else() + message(FATAL_ERROR "Command \"${BPFOBJECT_CLANG_EXE} --version\" failed with output:\n${CLANG_version_error}") + endif() +endif() + +if(NOT LIBBPF_INCLUDE_DIRS OR NOT LIBBPF_LIBRARIES) + find_package(LibBpf) +endif() + +if(BPFOBJECT_VMLINUX_H) + get_filename_component(GENERATED_VMLINUX_DIR ${BPFOBJECT_VMLINUX_H} DIRECTORY) +elseif(BPFOBJECT_BPFTOOL_EXE) + # Generate vmlinux.h + set(GENERATED_VMLINUX_DIR ${CMAKE_CURRENT_BINARY_DIR}) + set(BPFOBJECT_VMLINUX_H ${GENERATED_VMLINUX_DIR}/vmlinux.h) + execute_process(COMMAND ${BPFOBJECT_BPFTOOL_EXE} btf dump file /sys/kernel/btf/vmlinux format c + OUTPUT_FILE ${BPFOBJECT_VMLINUX_H} + ERROR_VARIABLE VMLINUX_error + RESULT_VARIABLE VMLINUX_result) + if(${VMLINUX_result} EQUAL 0) + set(VMLINUX ${BPFOBJECT_VMLINUX_H}) + else() + message(FATAL_ERROR "Failed to dump vmlinux.h from BTF: ${VMLINUX_error}") + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(BpfObject + REQUIRED_VARS + BPFOBJECT_BPFTOOL_EXE + BPFOBJECT_CLANG_EXE + LIBBPF_INCLUDE_DIRS + LIBBPF_LIBRARIES + GENERATED_VMLINUX_DIR) + +# Get clang bpf system includes +execute_process( + COMMAND bash -c "${BPFOBJECT_CLANG_EXE} -v -E - < /dev/null 2>&1 | + sed -n '/<...> search starts here:/,/End of search list./{ s| \\(/.*\\)|-idirafter \\1|p }'" + OUTPUT_VARIABLE CLANG_SYSTEM_INCLUDES_output + ERROR_VARIABLE CLANG_SYSTEM_INCLUDES_error + RESULT_VARIABLE CLANG_SYSTEM_INCLUDES_result + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(${CLANG_SYSTEM_INCLUDES_result} EQUAL 0) + separate_arguments(CLANG_SYSTEM_INCLUDES UNIX_COMMAND ${CLANG_SYSTEM_INCLUDES_output}) + message(STATUS "BPF system include flags: ${CLANG_SYSTEM_INCLUDES}") +else() + message(FATAL_ERROR "Failed to determine BPF system includes: ${CLANG_SYSTEM_INCLUDES_error}") +endif() + +# Get target arch +execute_process(COMMAND uname -m + COMMAND sed -e "s/x86_64/x86/" -e "s/aarch64/arm64/" -e "s/ppc64le/powerpc/" -e "s/mips.*/mips/" + OUTPUT_VARIABLE ARCH_output + ERROR_VARIABLE ARCH_error + RESULT_VARIABLE ARCH_result + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(${ARCH_result} EQUAL 0) + set(ARCH ${ARCH_output}) + message(STATUS "BPF target arch: ${ARCH}") +else() + message(FATAL_ERROR "Failed to determine target architecture: ${ARCH_error}") +endif() + +# Public macro +macro(bpf_object name input) + set(BPF_C_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${input}) + set(BPF_O_FILE ${CMAKE_CURRENT_BINARY_DIR}/${name}.bpf.o) + set(BPF_SKEL_FILE ${CMAKE_CURRENT_BINARY_DIR}/${name}.skel.h) + set(OUTPUT_TARGET ${name}_skel) + + # Build BPF object file + add_custom_command(OUTPUT ${BPF_O_FILE} + COMMAND ${BPFOBJECT_CLANG_EXE} -g -O2 -target bpf -D__TARGET_ARCH_${ARCH} + ${CLANG_SYSTEM_INCLUDES} -I${GENERATED_VMLINUX_DIR} + -isystem ${LIBBPF_INCLUDE_DIRS} -c ${BPF_C_FILE} -o ${BPF_O_FILE} + COMMAND_EXPAND_LISTS + VERBATIM + DEPENDS ${BPF_C_FILE} + COMMENT "[clang] Building BPF object: ${name}") + + # Build BPF skeleton header + add_custom_command(OUTPUT ${BPF_SKEL_FILE} + COMMAND bash -c "${BPFOBJECT_BPFTOOL_EXE} gen skeleton ${BPF_O_FILE} > ${BPF_SKEL_FILE}" + VERBATIM + DEPENDS ${BPF_O_FILE} + COMMENT "[skel] Building BPF skeleton: ${name}") + + add_library(${OUTPUT_TARGET} INTERFACE) + target_sources(${OUTPUT_TARGET} INTERFACE ${BPF_SKEL_FILE}) + target_include_directories(${OUTPUT_TARGET} INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) + target_include_directories(${OUTPUT_TARGET} SYSTEM INTERFACE ${LIBBPF_INCLUDE_DIRS}) + target_link_libraries(${OUTPUT_TARGET} INTERFACE ${LIBBPF_LIBRARIES} -lelf -lz) +endmacro() diff --git a/tools/cmake/FindLibBpf.cmake b/tools/cmake/FindLibBpf.cmake new file mode 100644 index 0000000..cd558f5 --- /dev/null +++ b/tools/cmake/FindLibBpf.cmake @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause + +find_path(LIBBPF_INCLUDE_DIRS + NAMES + bpf/bpf.h + bpf/btf.h + bpf/libbpf.h + PATHS + /usr/include + /usr/local/include + /opt/local/include + /sw/include + ENV CPATH) + +find_library(LIBBPF_LIBRARIES + NAMES + bpf + PATHS + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ENV LIBRARY_PATH + ENV LD_LIBRARY_PATH) + +include (FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibBpf "Please install the libbpf development package" + LIBBPF_LIBRARIES + LIBBPF_INCLUDE_DIRS) + +mark_as_advanced(LIBBPF_INCLUDE_DIRS LIBBPF_LIBRARIES) diff --git a/tools/gen_vmlinux_h.sh b/tools/gen_vmlinux_h.sh new file mode 100755 index 0000000..965045d --- /dev/null +++ b/tools/gen_vmlinux_h.sh @@ -0,0 +1,3 @@ +#/bin/sh + +$(dirname "$0")/bpftool btf dump file ${1:-/sys/kernel/btf/vmlinux} format c diff --git a/vmlinux/arm/vmlinux.h b/vmlinux/arm/vmlinux.h new file mode 120000 index 0000000..8375718 --- /dev/null +++ b/vmlinux/arm/vmlinux.h @@ -0,0 +1 @@ +vmlinux_62.h \ No newline at end of file diff --git a/vmlinux/arm/vmlinux_62.h b/vmlinux/arm/vmlinux_62.h new file mode 100644 index 0000000..95ec29a --- /dev/null +++ b/vmlinux/arm/vmlinux_62.h @@ -0,0 +1,119802 @@ +#ifndef __VMLINUX_H__ +#define __VMLINUX_H__ + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + +typedef signed char __s8; + +typedef unsigned char __u8; + +typedef short int __s16; + +typedef short unsigned int __u16; + +typedef int __s32; + +typedef unsigned int __u32; + +typedef long long int __s64; + +typedef long long unsigned int __u64; + +typedef __s8 s8; + +typedef __u8 u8; + +typedef __s16 s16; + +typedef __u16 u16; + +typedef __s32 s32; + +typedef __u32 u32; + +typedef __s64 s64; + +typedef __u64 u64; + +enum { + false = 0, + true = 1, +}; + +typedef long int __kernel_long_t; + +typedef long unsigned int __kernel_ulong_t; + +typedef int __kernel_pid_t; + +typedef unsigned int __kernel_uid32_t; + +typedef unsigned int __kernel_gid32_t; + +typedef unsigned int __kernel_size_t; + +typedef int __kernel_ssize_t; + +typedef long long int __kernel_loff_t; + +typedef long long int __kernel_time64_t; + +typedef __kernel_long_t __kernel_clock_t; + +typedef int __kernel_timer_t; + +typedef int __kernel_clockid_t; + +typedef __u16 __be16; + +typedef __u32 __le32; + +typedef __u32 __be32; + +typedef __u32 __wsum; + +typedef unsigned int __poll_t; + +typedef u32 __kernel_dev_t; + +typedef __kernel_dev_t dev_t; + +typedef short unsigned int umode_t; + +typedef __kernel_pid_t pid_t; + +typedef __kernel_clockid_t clockid_t; + +typedef _Bool bool; + +typedef __kernel_uid32_t uid_t; + +typedef __kernel_gid32_t gid_t; + +typedef long unsigned int uintptr_t; + +typedef __kernel_loff_t loff_t; + +typedef __kernel_size_t size_t; + +typedef __kernel_ssize_t ssize_t; + +typedef s32 int32_t; + +typedef u32 uint32_t; + +typedef u64 uint64_t; + +typedef u64 sector_t; + +typedef u64 blkcnt_t; + +typedef unsigned int gfp_t; + +typedef unsigned int fmode_t; + +typedef u64 phys_addr_t; + +typedef long unsigned int irq_hw_number_t; + +typedef struct { + int counter; +} atomic_t; + +struct list_head { + struct list_head *next; + struct list_head *prev; +}; + +struct hlist_node; + +struct hlist_head { + struct hlist_node *first; +}; + +struct hlist_node { + struct hlist_node *next; + struct hlist_node **pprev; +}; + +struct callback_head { + struct callback_head *next; + void (*func)(struct callback_head *); +}; + +struct cacheline_padding { + char x[0]; +}; + +struct pt_regs { + long unsigned int uregs[18]; +}; + +struct arch_hw_breakpoint_ctrl { + u32 __reserved: 9; + u32 mismatch: 1; + short: 6; + char: 3; + u32 len: 8; + u32 type: 2; + u32 privilege: 2; + u32 enabled: 1; +}; + +struct arch_hw_breakpoint { + u32 address; + u32 trigger; + struct arch_hw_breakpoint_ctrl step_ctrl; + struct arch_hw_breakpoint_ctrl ctrl; +}; + +struct perf_event; + +struct debug_info { + struct perf_event *hbp[32]; +}; + +struct rb_node { + long unsigned int __rb_parent_color; + struct rb_node *rb_right; + struct rb_node *rb_left; +}; + +enum perf_event_state { + PERF_EVENT_STATE_DEAD = 4294967292, + PERF_EVENT_STATE_EXIT = 4294967293, + PERF_EVENT_STATE_ERROR = 4294967294, + PERF_EVENT_STATE_OFF = 4294967295, + PERF_EVENT_STATE_INACTIVE = 0, + PERF_EVENT_STATE_ACTIVE = 1, +}; + +typedef struct { + s64 counter; +} atomic64_t; + +typedef struct { + atomic64_t a; +} local64_t; + +struct perf_event_attr { + __u32 type; + __u32 size; + __u64 config; + union { + __u64 sample_period; + __u64 sample_freq; + }; + __u64 sample_type; + __u64 read_format; + __u64 disabled: 1; + __u64 inherit: 1; + __u64 pinned: 1; + __u64 exclusive: 1; + __u64 exclude_user: 1; + __u64 exclude_kernel: 1; + __u64 exclude_hv: 1; + __u64 exclude_idle: 1; + __u64 mmap: 1; + __u64 comm: 1; + __u64 freq: 1; + __u64 inherit_stat: 1; + __u64 enable_on_exec: 1; + __u64 task: 1; + __u64 watermark: 1; + __u64 precise_ip: 2; + __u64 mmap_data: 1; + __u64 sample_id_all: 1; + __u64 exclude_host: 1; + __u64 exclude_guest: 1; + __u64 exclude_callchain_kernel: 1; + __u64 exclude_callchain_user: 1; + __u64 mmap2: 1; + __u64 comm_exec: 1; + __u64 use_clockid: 1; + __u64 context_switch: 1; + __u64 write_backward: 1; + __u64 namespaces: 1; + __u64 ksymbol: 1; + __u64 bpf_event: 1; + __u64 aux_output: 1; + __u64 cgroup: 1; + __u64 text_poke: 1; + __u64 build_id: 1; + __u64 inherit_thread: 1; + __u64 remove_on_exec: 1; + __u64 sigtrap: 1; + __u64 __reserved_1: 26; + union { + __u32 wakeup_events; + __u32 wakeup_watermark; + }; + __u32 bp_type; + union { + __u64 bp_addr; + __u64 kprobe_func; + __u64 uprobe_path; + __u64 config1; + }; + union { + __u64 bp_len; + __u64 kprobe_addr; + __u64 probe_offset; + __u64 config2; + }; + __u64 branch_sample_type; + __u64 sample_regs_user; + __u32 sample_stack_user; + __s32 clockid; + __u64 sample_regs_intr; + __u32 aux_watermark; + __u16 sample_max_stack; + __u16 __reserved_2; + __u32 aux_sample_size; + __u32 __reserved_3; + __u64 sig_data; +}; + +struct hw_perf_event_extra { + u64 config; + unsigned int reg; + int alloc; + int idx; + long: 32; +}; + +typedef s64 ktime_t; + +struct timerqueue_node { + struct rb_node node; + long: 32; + ktime_t expires; +}; + +enum hrtimer_restart { + HRTIMER_NORESTART = 0, + HRTIMER_RESTART = 1, +}; + +struct hrtimer_clock_base; + +struct hrtimer { + struct timerqueue_node node; + ktime_t _softexpires; + enum hrtimer_restart (*function)(struct hrtimer *); + struct hrtimer_clock_base *base; + u8 state; + u8 is_rel; + u8 is_soft; + u8 is_hard; + long: 32; +}; + +struct rhash_head { + struct rhash_head *next; +}; + +struct rhlist_head { + struct rhash_head rhead; + struct rhlist_head *next; +}; + +struct task_struct; + +struct hw_perf_event { + union { + struct { + u64 config; + u64 last_tag; + long unsigned int config_base; + long unsigned int event_base; + int event_base_rdpmc; + int idx; + int last_cpu; + int flags; + struct hw_perf_event_extra extra_reg; + struct hw_perf_event_extra branch_reg; + }; + struct { + struct hrtimer hrtimer; + }; + struct { + struct list_head tp_list; + }; + struct { + u64 pwr_acc; + u64 ptsc; + }; + struct { + struct arch_hw_breakpoint info; + struct rhlist_head bp_list; + }; + struct { + u8 iommu_bank; + u8 iommu_cntr; + u16 padding; + long: 32; + u64 conf; + u64 conf1; + }; + }; + struct task_struct *target; + void *addr_filters; + long unsigned int addr_filters_gen; + int state; + local64_t prev_count; + u64 sample_period; + union { + struct { + u64 last_period; + local64_t period_left; + }; + struct { + u64 saved_metric; + u64 saved_slots; + }; + }; + u64 interrupts_seq; + u64 interrupts; + u64 freq_time_stamp; + u64 freq_count_stamp; +}; + +typedef atomic_t atomic_long_t; + +struct __raw_tickets { + u16 owner; + u16 next; +}; + +typedef struct { + union { + u32 slock; + struct __raw_tickets tickets; + }; +} arch_spinlock_t; + +struct raw_spinlock { + arch_spinlock_t raw_lock; +}; + +typedef struct raw_spinlock raw_spinlock_t; + +struct optimistic_spin_queue { + atomic_t tail; +}; + +struct mutex { + atomic_long_t owner; + raw_spinlock_t wait_lock; + struct optimistic_spin_queue osq; + struct list_head wait_list; +}; + +struct spinlock { + union { + struct raw_spinlock rlock; + }; +}; + +typedef struct spinlock spinlock_t; + +struct wait_queue_head { + spinlock_t lock; + struct list_head head; +}; + +typedef struct wait_queue_head wait_queue_head_t; + +struct llist_node { + struct llist_node *next; +}; + +struct __call_single_node { + struct llist_node llist; + union { + unsigned int u_flags; + atomic_t a_flags; + }; +}; + +struct rcuwait { + struct task_struct *task; +}; + +struct irq_work { + struct __call_single_node node; + void (*func)(struct irq_work *); + struct rcuwait irqwait; +}; + +struct perf_addr_filters_head { + struct list_head list; + raw_spinlock_t lock; + unsigned int nr_file_filters; +}; + +struct perf_sample_data; + +typedef void (*perf_overflow_handler_t)(struct perf_event *, struct perf_sample_data *, struct pt_regs *); + +struct ftrace_ops; + +struct ftrace_regs; + +typedef void (*ftrace_func_t)(long unsigned int, long unsigned int, struct ftrace_ops *, struct ftrace_regs *); + +struct ftrace_hash; + +struct ftrace_ops_hash { + struct ftrace_hash *notrace_hash; + struct ftrace_hash *filter_hash; + struct mutex regex_lock; +}; + +enum ftrace_ops_cmd { + FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_SELF = 0, + FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_PEER = 1, + FTRACE_OPS_CMD_DISABLE_SHARE_IPMODIFY_PEER = 2, +}; + +typedef int (*ftrace_ops_func_t)(struct ftrace_ops *, enum ftrace_ops_cmd); + +struct ftrace_ops { + ftrace_func_t func; + struct ftrace_ops *next; + long unsigned int flags; + void *private; + ftrace_func_t saved_func; + struct ftrace_ops_hash local_hash; + struct ftrace_ops_hash *func_hash; + struct ftrace_ops_hash old_hash; + long unsigned int trampoline; + long unsigned int trampoline_size; + struct list_head list; + ftrace_ops_func_t ops_func; +}; + +struct pmu; + +struct perf_event_context; + +struct perf_event_pmu_context; + +struct perf_buffer; + +struct fasync_struct; + +struct perf_addr_filter_range; + +struct pid_namespace; + +struct bpf_prog; + +struct trace_event_call; + +struct event_filter; + +struct perf_cgroup; + +struct perf_event { + struct list_head event_entry; + struct list_head sibling_list; + struct list_head active_list; + struct rb_node group_node; + long: 32; + u64 group_index; + struct list_head migrate_entry; + struct hlist_node hlist_entry; + struct list_head active_entry; + int nr_siblings; + int event_caps; + int group_caps; + struct perf_event *group_leader; + struct pmu *pmu; + void *pmu_private; + enum perf_event_state state; + unsigned int attach_state; + local64_t count; + atomic64_t child_count; + u64 total_time_enabled; + u64 total_time_running; + u64 tstamp; + struct perf_event_attr attr; + u16 header_size; + u16 id_header_size; + u16 read_size; + struct hw_perf_event hw; + struct perf_event_context *ctx; + struct perf_event_pmu_context *pmu_ctx; + atomic_long_t refcount; + long: 32; + atomic64_t child_total_time_enabled; + atomic64_t child_total_time_running; + struct mutex child_mutex; + struct list_head child_list; + struct perf_event *parent; + int oncpu; + int cpu; + struct list_head owner_entry; + struct task_struct *owner; + struct mutex mmap_mutex; + atomic_t mmap_count; + struct perf_buffer *rb; + struct list_head rb_entry; + long unsigned int rcu_batches; + int rcu_pending; + wait_queue_head_t waitq; + struct fasync_struct *fasync; + unsigned int pending_wakeup; + unsigned int pending_kill; + unsigned int pending_disable; + unsigned int pending_sigtrap; + long unsigned int pending_addr; + struct irq_work pending_irq; + struct callback_head pending_task; + unsigned int pending_work; + atomic_t event_limit; + struct perf_addr_filters_head addr_filters; + struct perf_addr_filter_range *addr_filter_ranges; + long unsigned int addr_filters_gen; + struct perf_event *aux_event; + void (*destroy)(struct perf_event *); + struct callback_head callback_head; + struct pid_namespace *ns; + u64 id; + atomic64_t lost_samples; + u64 (*clock)(); + perf_overflow_handler_t overflow_handler; + void *overflow_handler_context; + perf_overflow_handler_t orig_overflow_handler; + struct bpf_prog *prog; + long: 32; + u64 bpf_cookie; + struct trace_event_call *tp_event; + struct event_filter *filter; + struct ftrace_ops ftrace_ops; + struct perf_cgroup *cgrp; + void *security; + struct list_head sb_list; + long: 32; +}; + +struct thread_struct { + long unsigned int address; + long unsigned int trap_no; + long unsigned int error_code; + struct debug_info debug; +}; + +typedef __s64 time64_t; + +struct __kernel_timespec { + __kernel_time64_t tv_sec; + long long int tv_nsec; +}; + +struct timespec64 { + time64_t tv_sec; + long int tv_nsec; + long: 32; +}; + +typedef s32 old_time32_t; + +struct old_timespec32 { + old_time32_t tv_sec; + s32 tv_nsec; +}; + +struct uid_gid_extent { + u32 first; + u32 lower_first; + u32 count; +}; + +struct uid_gid_map { + u32 nr_extents; + union { + struct uid_gid_extent extent[5]; + struct { + struct uid_gid_extent *forward; + struct uid_gid_extent *reverse; + }; + }; +}; + +typedef struct { + uid_t val; +} kuid_t; + +typedef struct { + gid_t val; +} kgid_t; + +struct refcount_struct { + atomic_t refs; +}; + +typedef struct refcount_struct refcount_t; + +struct proc_ns_operations; + +struct ns_common { + atomic_long_t stashed; + const struct proc_ns_operations *ops; + unsigned int inum; + refcount_t count; +}; + +struct rw_semaphore { + atomic_long_t count; + atomic_long_t owner; + struct optimistic_spin_queue osq; + raw_spinlock_t wait_lock; + struct list_head wait_list; +}; + +struct work_struct; + +typedef void (*work_func_t)(struct work_struct *); + +struct work_struct { + atomic_long_t data; + struct list_head entry; + work_func_t func; +}; + +struct ctl_table; + +struct completion; + +struct ctl_table_root; + +struct ctl_table_set; + +struct ctl_dir; + +struct ctl_node; + +struct ctl_table_header { + union { + struct { + struct ctl_table *ctl_table; + int used; + int count; + int nreg; + }; + struct callback_head rcu; + }; + struct completion *unregistering; + struct ctl_table *ctl_table_arg; + struct ctl_table_root *root; + struct ctl_table_set *set; + struct ctl_dir *parent; + struct ctl_node *node; + struct hlist_head inodes; +}; + +struct rb_root { + struct rb_node *rb_node; +}; + +struct ctl_dir { + struct ctl_table_header header; + struct rb_root root; +}; + +struct ctl_table_set { + int (*is_seen)(struct ctl_table_set *); + struct ctl_dir dir; +}; + +struct key; + +struct ucounts; + +struct user_namespace { + struct uid_gid_map uid_map; + struct uid_gid_map gid_map; + struct uid_gid_map projid_map; + struct user_namespace *parent; + int level; + kuid_t owner; + kgid_t group; + struct ns_common ns; + long unsigned int flags; + bool parent_could_setfcap; + struct list_head keyring_name_list; + struct key *user_keyring_register; + struct rw_semaphore keyring_sem; + struct key *persistent_keyring_register; + struct work_struct work; + struct ctl_table_set set; + struct ctl_table_header *sysctls; + struct ucounts *ucounts; + long int ucount_max[12]; + long int rlimit_max[4]; +}; + +struct kstat { + u32 result_mask; + umode_t mode; + unsigned int nlink; + uint32_t blksize; + u64 attributes; + u64 attributes_mask; + u64 ino; + dev_t dev; + dev_t rdev; + kuid_t uid; + kgid_t gid; + loff_t size; + struct timespec64 atime; + struct timespec64 mtime; + struct timespec64 ctime; + struct timespec64 btime; + u64 blocks; + u64 mnt_id; + u32 dio_mem_align; + u32 dio_offset_align; +}; + +struct kernel_symbol { + long unsigned int value; + const char *name; + const char *namespace; +}; + +typedef int (*initcall_t)(); + +typedef initcall_t initcall_entry_t; + +struct lock_class_key {}; + +struct fs_context; + +struct fs_parameter_spec; + +struct dentry; + +struct super_block; + +struct module; + +struct file_system_type { + const char *name; + int fs_flags; + int (*init_fs_context)(struct fs_context *); + const struct fs_parameter_spec *parameters; + struct dentry * (*mount)(struct file_system_type *, int, const char *, void *); + void (*kill_sb)(struct super_block *); + struct module *owner; + struct file_system_type *next; + struct hlist_head fs_supers; + struct lock_class_key s_lock_key; + struct lock_class_key s_umount_key; + struct lock_class_key s_vfs_rename_key; + struct lock_class_key s_writers_key[3]; + struct lock_class_key i_lock_key; + struct lock_class_key i_mutex_key; + struct lock_class_key invalidate_lock_key; + struct lock_class_key i_mutex_dir_key; +}; + +struct obs_kernel_param { + const char *str; + int (*setup_func)(char *); + int early; +}; + +typedef struct { + u32 lock; +} arch_rwlock_t; + +struct lockdep_map {}; + +struct ratelimit_state { + raw_spinlock_t lock; + int interval; + int burst; + int printed; + int missed; + long unsigned int begin; + long unsigned int flags; +}; + +typedef u32 jump_label_t; + +struct jump_entry { + jump_label_t code; + jump_label_t target; + jump_label_t key; +}; + +struct static_key_mod; + +struct static_key { + atomic_t enabled; + union { + long unsigned int type; + struct jump_entry *entries; + struct static_key_mod *next; + }; +}; + +struct static_key_true { + struct static_key key; +}; + +struct static_key_false { + struct static_key key; +}; + +struct _ddebug { + const char *modname; + const char *function; + const char *filename; + const char *format; + unsigned int lineno: 18; + unsigned int class_id: 6; + unsigned int flags: 8; + union { + struct static_key_true dd_key_true; + struct static_key_false dd_key_false; + } key; + long: 32; +}; + +enum module_state { + MODULE_STATE_LIVE = 0, + MODULE_STATE_COMING = 1, + MODULE_STATE_GOING = 2, + MODULE_STATE_UNFORMED = 3, +}; + +struct kref { + refcount_t refcount; +}; + +struct kset; + +struct kobj_type; + +struct kernfs_node; + +struct kobject { + const char *name; + struct list_head entry; + struct kobject *parent; + struct kset *kset; + const struct kobj_type *ktype; + struct kernfs_node *sd; + struct kref kref; + unsigned int state_initialized: 1; + unsigned int state_in_sysfs: 1; + unsigned int state_add_uevent_sent: 1; + unsigned int state_remove_uevent_sent: 1; + unsigned int uevent_suppress: 1; +}; + +struct module_param_attrs; + +struct module_kobject { + struct kobject kobj; + struct module *mod; + struct kobject *drivers_dir; + struct module_param_attrs *mp; + struct completion *kobj_completion; +}; + +struct latch_tree_node { + struct rb_node node[2]; +}; + +struct mod_tree_node { + struct module *mod; + struct latch_tree_node node; +}; + +struct module_layout { + void *base; + unsigned int size; + unsigned int text_size; + unsigned int ro_size; + unsigned int ro_after_init_size; + struct mod_tree_node mtn; +}; + +struct elf32_shdr; + +struct plt_entries; + +struct mod_plt_sec { + struct elf32_shdr *plt; + struct plt_entries *plt_ent; + int plt_count; +}; + +struct mod_arch_specific { + struct mod_plt_sec core; + struct mod_plt_sec init; +}; + +struct elf32_sym; + +typedef struct elf32_sym Elf32_Sym; + +struct mod_kallsyms { + Elf32_Sym *symtab; + unsigned int num_symtab; + char *strtab; + char *typetab; +}; + +struct module_attribute; + +struct kernel_param; + +struct exception_table_entry; + +struct bug_entry; + +struct module_sect_attrs; + +struct module_notes_attrs; + +struct tracepoint; + +typedef struct tracepoint * const tracepoint_ptr_t; + +struct srcu_struct; + +struct bpf_raw_event_map; + +struct trace_eval_map; + +struct module { + enum module_state state; + struct list_head list; + char name[60]; + struct module_kobject mkobj; + struct module_attribute *modinfo_attrs; + const char *version; + const char *srcversion; + struct kobject *holders_dir; + const struct kernel_symbol *syms; + const s32 *crcs; + unsigned int num_syms; + struct mutex param_lock; + struct kernel_param *kp; + unsigned int num_kp; + unsigned int num_gpl_syms; + const struct kernel_symbol *gpl_syms; + const s32 *gpl_crcs; + bool using_gplonly_symbols; + bool async_probe_requested; + unsigned int num_exentries; + struct exception_table_entry *extable; + int (*init)(); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct module_layout core_layout; + struct module_layout init_layout; + struct mod_arch_specific arch; + long unsigned int taints; + unsigned int num_bugs; + struct list_head bug_list; + struct bug_entry *bug_table; + struct mod_kallsyms *kallsyms; + struct mod_kallsyms core_kallsyms; + struct module_sect_attrs *sect_attrs; + struct module_notes_attrs *notes_attrs; + char *args; + void *percpu; + unsigned int percpu_size; + void *noinstr_text_start; + unsigned int noinstr_text_size; + unsigned int num_tracepoints; + tracepoint_ptr_t *tracepoints_ptrs; + unsigned int num_srcu_structs; + struct srcu_struct **srcu_struct_ptrs; + unsigned int num_bpf_raw_events; + struct bpf_raw_event_map *bpf_raw_events; + unsigned int btf_data_size; + void *btf_data; + struct jump_entry *jump_entries; + unsigned int num_jump_entries; + unsigned int num_trace_bprintk_fmt; + const char **trace_bprintk_fmt_start; + struct trace_event_call **trace_events; + unsigned int num_trace_events; + struct trace_eval_map **trace_evals; + unsigned int num_trace_evals; + unsigned int num_ftrace_callsites; + long unsigned int *ftrace_callsites; + void *kprobes_text_start; + unsigned int kprobes_text_size; + long unsigned int *kprobe_blacklist; + unsigned int num_kprobe_blacklist; + struct list_head source_list; + struct list_head target_list; + void (*exit)(); + atomic_t refcnt; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct kernel_param_ops { + unsigned int flags; + int (*set)(const char *, const struct kernel_param *); + int (*get)(char *, const struct kernel_param *); + void (*free)(void *); +}; + +typedef void *fl_owner_t; + +struct file; + +struct kiocb; + +struct iov_iter; + +struct io_comp_batch; + +struct dir_context; + +struct poll_table_struct; + +struct vm_area_struct; + +struct inode; + +struct file_lock; + +struct page; + +struct pipe_inode_info; + +struct seq_file; + +struct io_uring_cmd; + +struct file_operations { + struct module *owner; + loff_t (*llseek)(struct file *, loff_t, int); + ssize_t (*read)(struct file *, char *, size_t, loff_t *); + ssize_t (*write)(struct file *, const char *, size_t, loff_t *); + ssize_t (*read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*write_iter)(struct kiocb *, struct iov_iter *); + int (*iopoll)(struct kiocb *, struct io_comp_batch *, unsigned int); + int (*iterate)(struct file *, struct dir_context *); + int (*iterate_shared)(struct file *, struct dir_context *); + __poll_t (*poll)(struct file *, struct poll_table_struct *); + long int (*unlocked_ioctl)(struct file *, unsigned int, long unsigned int); + long int (*compat_ioctl)(struct file *, unsigned int, long unsigned int); + int (*mmap)(struct file *, struct vm_area_struct *); + long unsigned int mmap_supported_flags; + int (*open)(struct inode *, struct file *); + int (*flush)(struct file *, fl_owner_t); + int (*release)(struct inode *, struct file *); + int (*fsync)(struct file *, loff_t, loff_t, int); + int (*fasync)(int, struct file *, int); + int (*lock)(struct file *, int, struct file_lock *); + ssize_t (*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int); + long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + int (*check_flags)(int); + int (*flock)(struct file *, int, struct file_lock *); + ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); + ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + int (*setlease)(struct file *, long int, struct file_lock **, void **); + long int (*fallocate)(struct file *, int, loff_t, loff_t); + void (*show_fdinfo)(struct seq_file *, struct file *); + ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int); + loff_t (*remap_file_range)(struct file *, loff_t, struct file *, loff_t, loff_t, unsigned int); + int (*fadvise)(struct file *, loff_t, loff_t, int); + int (*uring_cmd)(struct io_uring_cmd *, unsigned int); + int (*uring_cmd_iopoll)(struct io_uring_cmd *, struct io_comp_batch *, unsigned int); +}; + +struct static_call_key { + void *func; +}; + +enum system_states { + SYSTEM_BOOTING = 0, + SYSTEM_SCHEDULING = 1, + SYSTEM_FREEING_INITMEM = 2, + SYSTEM_RUNNING = 3, + SYSTEM_HALT = 4, + SYSTEM_POWER_OFF = 5, + SYSTEM_RESTART = 6, + SYSTEM_SUSPEND = 7, +}; + +struct bug_entry { + long unsigned int bug_addr; + const char *file; + short unsigned int line; + short unsigned int flags; +}; + +struct cpumask { + long unsigned int bits[1]; +}; + +typedef struct cpumask cpumask_t; + +typedef struct cpumask cpumask_var_t[1]; + +typedef struct page *pgtable_t; + +struct address_space; + +struct page_pool; + +struct mm_struct; + +struct dev_pagemap; + +struct page { + long unsigned int flags; + union { + struct { + union { + struct list_head lru; + struct { + void *__filler; + unsigned int mlock_count; + }; + struct list_head buddy_list; + struct list_head pcp_list; + }; + struct address_space *mapping; + union { + long unsigned int index; + long unsigned int share; + }; + long unsigned int private; + }; + struct { + long unsigned int pp_magic; + struct page_pool *pp; + long unsigned int _pp_mapping_pad; + long unsigned int dma_addr; + union { + long unsigned int dma_addr_upper; + atomic_long_t pp_frag_count; + }; + }; + struct { + long unsigned int compound_head; + unsigned char compound_dtor; + unsigned char compound_order; + atomic_t compound_mapcount; + atomic_t subpages_mapcount; + atomic_t compound_pincount; + }; + struct { + long unsigned int _compound_pad_1; + long unsigned int _compound_pad_2; + struct list_head deferred_list; + }; + struct { + long unsigned int _hugetlb_pad_1; + void *hugetlb_subpool; + void *hugetlb_cgroup; + void *hugetlb_cgroup_rsvd; + void *hugetlb_hwpoison; + }; + struct { + long unsigned int _pt_pad_1; + pgtable_t pmd_huge_pte; + long unsigned int _pt_pad_2; + union { + struct mm_struct *pt_mm; + atomic_t pt_frag_refcount; + }; + spinlock_t ptl; + }; + struct { + struct dev_pagemap *pgmap; + void *zone_device_data; + }; + struct callback_head callback_head; + }; + union { + atomic_t _mapcount; + unsigned int page_type; + }; + atomic_t _refcount; + long unsigned int memcg_data; +}; + +typedef u64 pteval_t; + +typedef pteval_t pgprot_t; + +struct userfaultfd_ctx; + +struct vm_userfaultfd_ctx { + struct userfaultfd_ctx *ctx; +}; + +struct anon_vma; + +struct vm_operations_struct; + +struct vm_area_struct { + long unsigned int vm_start; + long unsigned int vm_end; + struct mm_struct *vm_mm; + long: 32; + pgprot_t vm_page_prot; + long unsigned int vm_flags; + struct { + struct rb_node rb; + long unsigned int rb_subtree_last; + } shared; + struct list_head anon_vma_chain; + struct anon_vma *anon_vma; + const struct vm_operations_struct *vm_ops; + long unsigned int vm_pgoff; + struct file *vm_file; + void *vm_private_data; + atomic_long_t swap_readahead_info; + struct vm_userfaultfd_ctx vm_userfaultfd_ctx; +}; + +typedef u64 pmdval_t; + +typedef u64 pgdval_t; + +typedef pteval_t pte_t; + +typedef pmdval_t pmd_t; + +typedef pgdval_t pgd_t; + +struct page_frag { + struct page *page; + __u16 offset; + __u16 size; +}; + +struct tlbflush_unmap_batch {}; + +enum timespec_type { + TT_NONE = 0, + TT_NATIVE = 1, + TT_COMPAT = 2, +}; + +struct pollfd { + int fd; + short int events; + short int revents; +}; + +struct restart_block { + long unsigned int arch_data; + long int (*fn)(struct restart_block *); + union { + struct { + u32 *uaddr; + u32 val; + u32 flags; + u32 bitset; + u64 time; + u32 *uaddr2; + long: 32; + } futex; + struct { + clockid_t clockid; + enum timespec_type type; + union { + struct __kernel_timespec *rmtp; + struct old_timespec32 *compat_rmtp; + }; + long: 32; + u64 expires; + } nanosleep; + struct { + struct pollfd *ufds; + int nfds; + int has_timeout; + long unsigned int tv_sec; + long unsigned int tv_nsec; + } poll; + }; +}; + +struct cpu_context_save { + __u32 r4; + __u32 r5; + __u32 r6; + __u32 r7; + __u32 r8; + __u32 r9; + __u32 sl; + __u32 fp; + __u32 sp; + __u32 pc; + __u32 extra[2]; +}; + +struct fp_hard_struct { + unsigned int save[35]; +}; + +struct fp_soft_struct { + unsigned int save[35]; +}; + +struct iwmmxt_struct { + unsigned int save[38]; +}; + +union fp_state { + struct fp_hard_struct hard; + struct fp_soft_struct soft; + struct iwmmxt_struct iwmmxt; +}; + +struct vfp_hard_struct { + __u64 fpregs[32]; + __u32 fpexc; + __u32 fpscr; + __u32 fpinst; + __u32 fpinst2; + __u32 cpu; + long: 32; +}; + +union vfp_state { + struct vfp_hard_struct hard; +}; + +struct thread_info { + long unsigned int flags; + int preempt_count; + __u32 cpu; + __u32 cpu_domain; + struct cpu_context_save cpu_context; + __u32 abi_syscall; + __u8 used_cp[16]; + long unsigned int tp_value[2]; + long: 32; + union fp_state fpstate; + union vfp_state vfpstate; + long unsigned int thumbee_state; + long: 32; +}; + +struct load_weight { + long unsigned int weight; + u32 inv_weight; +}; + +struct util_est { + unsigned int enqueued; + unsigned int ewma; +}; + +struct sched_avg { + u64 last_update_time; + u64 load_sum; + u64 runnable_sum; + u32 util_sum; + u32 period_contrib; + long unsigned int load_avg; + long unsigned int runnable_avg; + long unsigned int util_avg; + long: 32; + struct util_est util_est; + long: 32; + long: 32; +}; + +struct cfs_rq; + +struct sched_entity { + struct load_weight load; + struct rb_node run_node; + struct list_head group_node; + unsigned int on_rq; + u64 exec_start; + u64 sum_exec_runtime; + u64 vruntime; + u64 prev_sum_exec_runtime; + u64 nr_migrations; + int depth; + struct sched_entity *parent; + struct cfs_rq *cfs_rq; + struct cfs_rq *my_q; + long unsigned int runnable_weight; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct sched_avg avg; +}; + +struct sched_rt_entity { + struct list_head run_list; + long unsigned int timeout; + long unsigned int watchdog_stamp; + unsigned int time_slice; + short unsigned int on_rq; + short unsigned int on_list; + struct sched_rt_entity *back; +}; + +struct sched_dl_entity { + struct rb_node rb_node; + long: 32; + u64 dl_runtime; + u64 dl_deadline; + u64 dl_period; + u64 dl_bw; + u64 dl_density; + s64 runtime; + u64 deadline; + unsigned int flags; + unsigned int dl_throttled: 1; + unsigned int dl_yielded: 1; + unsigned int dl_non_contending: 1; + unsigned int dl_overrun: 1; + struct hrtimer dl_timer; + struct hrtimer inactive_timer; + struct sched_dl_entity *pi_se; + long: 32; +}; + +struct sched_statistics { + u64 wait_start; + u64 wait_max; + u64 wait_count; + u64 wait_sum; + u64 iowait_count; + u64 iowait_sum; + u64 sleep_start; + u64 sleep_max; + s64 sum_sleep_runtime; + u64 block_start; + u64 block_max; + s64 sum_block_runtime; + u64 exec_max; + u64 slice_max; + u64 nr_migrations_cold; + u64 nr_failed_migrations_affine; + u64 nr_failed_migrations_running; + u64 nr_failed_migrations_hot; + u64 nr_forced_migrations; + u64 nr_wakeups; + u64 nr_wakeups_sync; + u64 nr_wakeups_migrate; + u64 nr_wakeups_local; + u64 nr_wakeups_remote; + u64 nr_wakeups_affine; + u64 nr_wakeups_affine_attempts; + u64 nr_wakeups_passive; + u64 nr_wakeups_idle; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +union rcu_special { + struct { + u8 blocked; + u8 need_qs; + u8 exp_hint; + u8 need_mb; + } b; + u32 s; +}; + +struct sched_info { + long unsigned int pcount; + long: 32; + long long unsigned int run_delay; + long long unsigned int last_arrival; + long long unsigned int last_queued; +}; + +struct plist_node { + int prio; + struct list_head prio_list; + struct list_head node_list; +}; + +struct prev_cputime { + u64 utime; + u64 stime; + raw_spinlock_t lock; + long: 32; +}; + +struct rb_root_cached { + struct rb_root rb_root; + struct rb_node *rb_leftmost; +}; + +struct timerqueue_head { + struct rb_root_cached rb_root; +}; + +struct posix_cputimer_base { + u64 nextevt; + struct timerqueue_head tqhead; +}; + +struct posix_cputimers { + struct posix_cputimer_base bases[3]; + unsigned int timers_active; + unsigned int expiry_active; +}; + +struct sem_undo_list; + +struct sysv_sem { + struct sem_undo_list *undo_list; +}; + +struct sysv_shm { + struct list_head shm_clist; +}; + +typedef struct { + long unsigned int sig[2]; +} sigset_t; + +struct sigpending { + struct list_head list; + sigset_t signal; +}; + +struct seccomp_filter; + +struct seccomp { + int mode; + atomic_t filter_count; + struct seccomp_filter *filter; +}; + +struct syscall_user_dispatch {}; + +struct wake_q_node { + struct wake_q_node *next; +}; + +struct task_io_accounting { + u64 rchar; + u64 wchar; + u64 syscr; + u64 syscw; + u64 read_bytes; + u64 write_bytes; + u64 cancelled_write_bytes; +}; + +typedef struct { + long unsigned int bits[1]; +} nodemask_t; + +struct seqcount { + unsigned int sequence; +}; + +typedef struct seqcount seqcount_t; + +struct seqcount_spinlock { + seqcount_t seqcount; +}; + +typedef struct seqcount_spinlock seqcount_spinlock_t; + +struct kmap_ctrl { + int idx; + long: 32; + pte_t pteval[16]; +}; + +struct timer_list { + struct hlist_node entry; + long unsigned int expires; + void (*function)(struct timer_list *); + u32 flags; +}; + +struct llist_head { + struct llist_node *first; +}; + +struct sched_class; + +struct task_group; + +struct pid; + +struct cred; + +struct nameidata; + +struct fs_struct; + +struct files_struct; + +struct io_uring_task; + +struct nsproxy; + +struct signal_struct; + +struct sighand_struct; + +struct audit_context; + +struct rt_mutex_waiter; + +struct bio_list; + +struct blk_plug; + +struct reclaim_state; + +struct backing_dev_info; + +struct io_context; + +struct capture_control; + +struct kernel_siginfo; + +typedef struct kernel_siginfo kernel_siginfo_t; + +struct css_set; + +struct robust_list_head; + +struct futex_pi_state; + +struct rseq; + +struct task_delay_info; + +struct ftrace_ret_stack; + +struct mem_cgroup; + +struct request_queue; + +struct uprobe_task; + +struct vm_struct; + +struct bpf_local_storage; + +struct bpf_run_ctx; + +struct task_struct { + struct thread_info thread_info; + unsigned int __state; + void *stack; + refcount_t usage; + unsigned int flags; + unsigned int ptrace; + int on_cpu; + struct __call_single_node wake_entry; + unsigned int wakee_flips; + long unsigned int wakee_flip_decay_ts; + struct task_struct *last_wakee; + int recent_used_cpu; + int wake_cpu; + int on_rq; + int prio; + int static_prio; + int normal_prio; + unsigned int rt_priority; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct sched_entity se; + struct sched_rt_entity rt; + long: 32; + struct sched_dl_entity dl; + const struct sched_class *sched_class; + struct task_group *sched_task_group; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct sched_statistics stats; + unsigned int btrace_seq; + unsigned int policy; + int nr_cpus_allowed; + const cpumask_t *cpus_ptr; + cpumask_t *user_cpus_ptr; + cpumask_t cpus_mask; + void *migration_pending; + short unsigned int migration_disabled; + short unsigned int migration_flags; + int trc_reader_nesting; + int trc_ipi_to_cpu; + union rcu_special trc_reader_special; + struct list_head trc_holdout_list; + struct list_head trc_blkd_node; + int trc_blkd_cpu; + struct sched_info sched_info; + struct list_head tasks; + struct plist_node pushable_tasks; + struct rb_node pushable_dl_tasks; + struct mm_struct *mm; + struct mm_struct *active_mm; + int exit_state; + int exit_code; + int exit_signal; + int pdeath_signal; + long unsigned int jobctl; + unsigned int personality; + unsigned int sched_reset_on_fork: 1; + unsigned int sched_contributes_to_load: 1; + unsigned int sched_migrated: 1; + long: 29; + unsigned int sched_remote_wakeup: 1; + unsigned int in_execve: 1; + unsigned int in_iowait: 1; + unsigned int in_user_fault: 1; + unsigned int no_cgroup_migration: 1; + unsigned int frozen: 1; + unsigned int use_memdelay: 1; + unsigned int in_memstall: 1; + unsigned int in_eventfd: 1; + unsigned int in_thrashing: 1; + long unsigned int atomic_flags; + long: 32; + struct restart_block restart_block; + pid_t pid; + pid_t tgid; + long unsigned int stack_canary; + struct task_struct *real_parent; + struct task_struct *parent; + struct list_head children; + struct list_head sibling; + struct task_struct *group_leader; + struct list_head ptraced; + struct list_head ptrace_entry; + struct pid *thread_pid; + struct hlist_node pid_links[4]; + struct list_head thread_group; + struct list_head thread_node; + struct completion *vfork_done; + int *set_child_tid; + int *clear_child_tid; + void *worker_private; + long: 32; + u64 utime; + u64 stime; + u64 gtime; + struct prev_cputime prev_cputime; + long unsigned int nvcsw; + long unsigned int nivcsw; + u64 start_time; + u64 start_boottime; + long unsigned int min_flt; + long unsigned int maj_flt; + struct posix_cputimers posix_cputimers; + const struct cred *ptracer_cred; + const struct cred *real_cred; + const struct cred *cred; + struct key *cached_requested_key; + char comm[16]; + struct nameidata *nameidata; + struct sysv_sem sysvsem; + struct sysv_shm sysvshm; + long unsigned int last_switch_count; + long unsigned int last_switch_time; + struct fs_struct *fs; + struct files_struct *files; + struct io_uring_task *io_uring; + struct nsproxy *nsproxy; + struct signal_struct *signal; + struct sighand_struct *sighand; + sigset_t blocked; + sigset_t real_blocked; + sigset_t saved_sigmask; + struct sigpending pending; + long unsigned int sas_ss_sp; + size_t sas_ss_size; + unsigned int sas_ss_flags; + struct callback_head *task_works; + struct audit_context *audit_context; + kuid_t loginuid; + unsigned int sessionid; + struct seccomp seccomp; + struct syscall_user_dispatch syscall_dispatch; + u64 parent_exec_id; + u64 self_exec_id; + spinlock_t alloc_lock; + raw_spinlock_t pi_lock; + struct wake_q_node wake_q; + struct rb_root_cached pi_waiters; + struct task_struct *pi_top_task; + struct rt_mutex_waiter *pi_blocked_on; + void *journal_info; + struct bio_list *bio_list; + struct blk_plug *plug; + struct reclaim_state *reclaim_state; + struct backing_dev_info *backing_dev_info; + struct io_context *io_context; + struct capture_control *capture_control; + long unsigned int ptrace_message; + kernel_siginfo_t *last_siginfo; + struct task_io_accounting ioac; + unsigned int psi_flags; + long: 32; + u64 acct_rss_mem1; + u64 acct_vm_mem1; + u64 acct_timexpd; + nodemask_t mems_allowed; + seqcount_spinlock_t mems_allowed_seq; + int cpuset_mem_spread_rotor; + int cpuset_slab_spread_rotor; + struct css_set *cgroups; + struct list_head cg_list; + struct robust_list_head *robust_list; + struct list_head pi_state_list; + struct futex_pi_state *pi_state_cache; + struct mutex futex_exit_mutex; + unsigned int futex_state; + struct perf_event_context *perf_event_ctxp; + struct mutex perf_event_mutex; + struct list_head perf_event_list; + struct rseq *rseq; + u32 rseq_sig; + long unsigned int rseq_event_mask; + struct tlbflush_unmap_batch tlb_ubc; + union { + refcount_t rcu_users; + struct callback_head rcu; + }; + struct pipe_inode_info *splice_pipe; + struct page_frag task_frag; + struct task_delay_info *delays; + int nr_dirtied; + int nr_dirtied_pause; + long unsigned int dirty_paused_when; + long: 32; + u64 timer_slack_ns; + u64 default_timer_slack_ns; + int curr_ret_stack; + int curr_ret_depth; + struct ftrace_ret_stack *ret_stack; + long: 32; + long long unsigned int ftrace_timestamp; + atomic_t trace_overrun; + atomic_t tracing_graph_pause; + long unsigned int trace_recursion; + struct mem_cgroup *memcg_in_oom; + gfp_t memcg_oom_gfp_mask; + int memcg_oom_order; + unsigned int memcg_nr_pages_over_high; + struct mem_cgroup *active_memcg; + struct request_queue *throttle_queue; + struct uprobe_task *utask; + unsigned int sequential_io; + unsigned int sequential_io_avg; + struct kmap_ctrl kmap_ctrl; + int pagefault_disabled; + struct task_struct *oom_reaper_list; + struct timer_list oom_reaper_timer; + struct vm_struct *stack_vm_area; + refcount_t stack_refcount; + void *security; + struct bpf_local_storage *bpf_storage; + struct bpf_run_ctx *bpf_ctx; + struct llist_head kretprobe_instances; + struct thread_struct thread; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +typedef struct { + arch_rwlock_t raw_lock; +} rwlock_t; + +enum refcount_saturation_type { + REFCOUNT_ADD_NOT_ZERO_OVF = 0, + REFCOUNT_ADD_OVF = 1, + REFCOUNT_ADD_UAF = 2, + REFCOUNT_SUB_UAF = 3, + REFCOUNT_DEC_LEAK = 4, +}; + +typedef struct {} lockdep_map_p; + +struct maple_tree { + union { + spinlock_t ma_lock; + lockdep_map_p ma_external_lock; + }; + void *ma_root; + unsigned int ma_flags; +}; + +struct wait_queue_entry; + +typedef int (*wait_queue_func_t)(struct wait_queue_entry *, unsigned int, int, void *); + +struct wait_queue_entry { + unsigned int flags; + void *private; + wait_queue_func_t func; + struct list_head entry; +}; + +typedef struct wait_queue_entry wait_queue_entry_t; + +struct swait_queue_head { + raw_spinlock_t lock; + struct list_head task_list; +}; + +struct completion { + unsigned int done; + struct swait_queue_head wait; +}; + +struct percpu_counter { + raw_spinlock_t lock; + long: 32; + s64 count; + struct list_head list; + s32 *counters; + long: 32; +}; + +typedef struct { + atomic64_t id; + atomic_t vmalloc_seq; + long unsigned int sigpage; + long unsigned int vdso; + long: 32; +} mm_context_t; + +struct xol_area; + +struct uprobes_state { + struct xol_area *xol_area; +}; + +struct linux_binfmt; + +struct kioctx_table; + +struct mmu_notifier_subscriptions; + +struct mm_struct { + struct { + struct maple_tree mm_mt; + long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + long unsigned int mmap_base; + long unsigned int mmap_legacy_base; + long unsigned int task_size; + pgd_t *pgd; + atomic_t membarrier_state; + atomic_t mm_users; + atomic_t mm_count; + atomic_long_t pgtables_bytes; + int map_count; + spinlock_t page_table_lock; + struct rw_semaphore mmap_lock; + struct list_head mmlist; + long unsigned int hiwater_rss; + long unsigned int hiwater_vm; + long unsigned int total_vm; + long unsigned int locked_vm; + atomic64_t pinned_vm; + long unsigned int data_vm; + long unsigned int exec_vm; + long unsigned int stack_vm; + long unsigned int def_flags; + seqcount_t write_protect_seq; + spinlock_t arg_lock; + long unsigned int start_code; + long unsigned int end_code; + long unsigned int start_data; + long unsigned int end_data; + long unsigned int start_brk; + long unsigned int brk; + long unsigned int start_stack; + long unsigned int arg_start; + long unsigned int arg_end; + long unsigned int env_start; + long unsigned int env_end; + long unsigned int saved_auxv[42]; + long: 32; + struct percpu_counter rss_stat[4]; + struct linux_binfmt *binfmt; + long: 32; + mm_context_t context; + long unsigned int flags; + spinlock_t ioctx_lock; + struct kioctx_table *ioctx_table; + struct task_struct *owner; + struct user_namespace *user_ns; + struct file *exe_file; + struct mmu_notifier_subscriptions *notifier_subscriptions; + pgtable_t pmd_huge_pte; + atomic_t tlb_flush_pending; + struct uprobes_state uprobes_state; + atomic_long_t hugetlb_usage; + struct work_struct async_put_work; + long unsigned int ksm_merging_pages; + long unsigned int ksm_rmap_items; + long: 32; + }; + long unsigned int cpu_bitmap[0]; +}; + +struct arch_uprobe_task { + u32 backup; + long unsigned int saved_trap_no; +}; + +enum uprobe_task_state { + UTASK_RUNNING = 0, + UTASK_SSTEP = 1, + UTASK_SSTEP_ACK = 2, + UTASK_SSTEP_TRAPPED = 3, +}; + +struct uprobe; + +struct return_instance; + +struct uprobe_task { + enum uprobe_task_state state; + union { + struct { + struct arch_uprobe_task autask; + long unsigned int vaddr; + }; + struct { + struct callback_head dup_xol_work; + long unsigned int dup_xol_addr; + }; + }; + struct uprobe *active_uprobe; + long unsigned int xol_vaddr; + struct return_instance *return_instances; + unsigned int depth; +}; + +struct return_instance { + struct uprobe *uprobe; + long unsigned int func; + long unsigned int stack; + long unsigned int orig_ret_vaddr; + bool chained; + struct return_instance *next; +}; + +struct workqueue_struct; + +struct delayed_work { + struct work_struct work; + struct timer_list timer; + struct workqueue_struct *wq; + int cpu; +}; + +struct rcu_work { + struct work_struct work; + struct callback_head rcu; + struct workqueue_struct *wq; +}; + +struct seqcount_raw_spinlock { + seqcount_t seqcount; +}; + +typedef struct seqcount_raw_spinlock seqcount_raw_spinlock_t; + +typedef struct { + seqcount_spinlock_t seqcount; + spinlock_t lock; +} seqlock_t; + +struct xarray { + spinlock_t xa_lock; + gfp_t xa_flags; + void *xa_head; +}; + +typedef u32 errseq_t; + +struct address_space_operations; + +struct address_space { + struct inode *host; + struct xarray i_pages; + struct rw_semaphore invalidate_lock; + gfp_t gfp_mask; + atomic_t i_mmap_writable; + struct rb_root_cached i_mmap; + struct rw_semaphore i_mmap_rwsem; + long unsigned int nrpages; + long unsigned int writeback_index; + const struct address_space_operations *a_ops; + long unsigned int flags; + errseq_t wb_err; + spinlock_t private_lock; + struct list_head private_list; + void *private_data; +}; + +enum dma_data_direction { + DMA_BIDIRECTIONAL = 0, + DMA_TO_DEVICE = 1, + DMA_FROM_DEVICE = 2, + DMA_NONE = 3, +}; + +struct device; + +struct page_pool_params { + unsigned int flags; + unsigned int order; + unsigned int pool_size; + int nid; + struct device *dev; + enum dma_data_direction dma_dir; + unsigned int max_len; + unsigned int offset; + void (*init_callback)(struct page *, void *); + void *init_arg; +}; + +struct page_pool_alloc_stats { + u64 fast; + u64 slow; + u64 slow_high_order; + u64 empty; + u64 refill; + u64 waive; +}; + +struct pp_alloc_cache { + u32 count; + struct page *cache[128]; +}; + +struct ptr_ring { + int producer; + spinlock_t producer_lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + int consumer_head; + int consumer_tail; + spinlock_t consumer_lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + int size; + int batch; + void **queue; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct page_pool_recycle_stats; + +struct page_pool { + struct page_pool_params p; + struct delayed_work release_dw; + void (*disconnect)(void *); + long unsigned int defer_start; + long unsigned int defer_warn; + u32 pages_state_hold_cnt; + unsigned int frag_offset; + struct page *frag_page; + long int frag_users; + struct page_pool_alloc_stats alloc_stats; + u32 xdp_mem_id; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct pp_alloc_cache alloc; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct ptr_ring ring; + struct page_pool_recycle_stats *recycle_stats; + atomic_t pages_state_release_cnt; + refcount_t user_cnt; + long: 32; + u64 destroy_cnt; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct vmem_altmap { + long unsigned int base_pfn; + const long unsigned int end_pfn; + const long unsigned int reserve; + long unsigned int free; + long unsigned int align; + long unsigned int alloc; +}; + +struct percpu_ref_data; + +struct percpu_ref { + long unsigned int percpu_count_ptr; + struct percpu_ref_data *data; +}; + +enum memory_type { + MEMORY_DEVICE_PRIVATE = 1, + MEMORY_DEVICE_COHERENT = 2, + MEMORY_DEVICE_FS_DAX = 3, + MEMORY_DEVICE_GENERIC = 4, + MEMORY_DEVICE_PCI_P2PDMA = 5, +}; + +struct range { + u64 start; + u64 end; +}; + +struct dev_pagemap_ops; + +struct dev_pagemap { + struct vmem_altmap altmap; + struct percpu_ref ref; + struct completion done; + enum memory_type type; + unsigned int flags; + long unsigned int vmemmap_shift; + const struct dev_pagemap_ops *ops; + void *owner; + int nr_range; + union { + struct range range; + struct range ranges[0]; + }; +}; + +struct folio { + union { + struct { + long unsigned int flags; + union { + struct list_head lru; + struct { + void *__filler; + unsigned int mlock_count; + }; + }; + struct address_space *mapping; + long unsigned int index; + void *private; + atomic_t _mapcount; + atomic_t _refcount; + long unsigned int memcg_data; + }; + struct page page; + }; + union { + struct { + long unsigned int _flags_1; + long unsigned int _head_1; + unsigned char _folio_dtor; + unsigned char _folio_order; + atomic_t _compound_mapcount; + atomic_t _subpages_mapcount; + atomic_t _pincount; + }; + struct page __page_1; + }; + union { + struct { + long unsigned int _flags_2; + long unsigned int _head_2; + void *_hugetlb_subpool; + void *_hugetlb_cgroup; + void *_hugetlb_cgroup_rsvd; + void *_hugetlb_hwpoison; + }; + struct page __page_2; + }; +}; + +struct vfsmount; + +struct path { + struct vfsmount *mnt; + struct dentry *dentry; +}; + +enum pid_type { + PIDTYPE_PID = 0, + PIDTYPE_TGID = 1, + PIDTYPE_PGID = 2, + PIDTYPE_SID = 3, + PIDTYPE_MAX = 4, +}; + +struct fown_struct { + rwlock_t lock; + struct pid *pid; + enum pid_type pid_type; + kuid_t uid; + kuid_t euid; + int signum; +}; + +struct file_ra_state { + long unsigned int start; + unsigned int size; + unsigned int async_size; + unsigned int ra_pages; + unsigned int mmap_miss; + long: 32; + loff_t prev_pos; +}; + +struct file { + union { + struct llist_node f_llist; + struct callback_head f_rcuhead; + unsigned int f_iocb_flags; + }; + struct path f_path; + struct inode *f_inode; + const struct file_operations *f_op; + spinlock_t f_lock; + atomic_long_t f_count; + unsigned int f_flags; + fmode_t f_mode; + struct mutex f_pos_lock; + long: 32; + loff_t f_pos; + struct fown_struct f_owner; + const struct cred *f_cred; + long: 32; + struct file_ra_state f_ra; + u64 f_version; + void *f_security; + void *private_data; + struct hlist_head *f_ep; + struct address_space *f_mapping; + errseq_t f_wb_err; + errseq_t f_sb_err; +}; + +struct anon_vma { + struct anon_vma *root; + struct rw_semaphore rwsem; + atomic_t refcount; + long unsigned int num_children; + long unsigned int num_active_vmas; + struct anon_vma *parent; + struct rb_root_cached rb_root; +}; + +typedef unsigned int vm_fault_t; + +enum page_entry_size { + PE_SIZE_PTE = 0, + PE_SIZE_PMD = 1, + PE_SIZE_PUD = 2, +}; + +struct vm_fault; + +struct vm_operations_struct { + void (*open)(struct vm_area_struct *); + void (*close)(struct vm_area_struct *); + int (*may_split)(struct vm_area_struct *, long unsigned int); + int (*mremap)(struct vm_area_struct *); + int (*mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int, long unsigned int); + vm_fault_t (*fault)(struct vm_fault *); + vm_fault_t (*huge_fault)(struct vm_fault *, enum page_entry_size); + vm_fault_t (*map_pages)(struct vm_fault *, long unsigned int, long unsigned int); + long unsigned int (*pagesize)(struct vm_area_struct *); + vm_fault_t (*page_mkwrite)(struct vm_fault *); + vm_fault_t (*pfn_mkwrite)(struct vm_fault *); + int (*access)(struct vm_area_struct *, long unsigned int, void *, int, int); + const char * (*name)(struct vm_area_struct *); + struct page * (*find_special_page)(struct vm_area_struct *, long unsigned int); +}; + +struct linux_binprm; + +struct coredump_params; + +struct linux_binfmt { + struct list_head lh; + struct module *module; + int (*load_binary)(struct linux_binprm *); + int (*load_shlib)(struct file *); + int (*core_dump)(struct coredump_params *); + long unsigned int min_coredump; +}; + +enum fault_flag { + FAULT_FLAG_WRITE = 1, + FAULT_FLAG_MKWRITE = 2, + FAULT_FLAG_ALLOW_RETRY = 4, + FAULT_FLAG_RETRY_NOWAIT = 8, + FAULT_FLAG_KILLABLE = 16, + FAULT_FLAG_TRIED = 32, + FAULT_FLAG_USER = 64, + FAULT_FLAG_REMOTE = 128, + FAULT_FLAG_INSTRUCTION = 256, + FAULT_FLAG_INTERRUPTIBLE = 512, + FAULT_FLAG_UNSHARE = 1024, + FAULT_FLAG_ORIG_PTE_VALID = 2048, +}; + +typedef struct { + pgd_t pgd; +} p4d_t; + +typedef struct { + p4d_t p4d; +} pud_t; + +struct vm_fault { + const struct { + struct vm_area_struct *vma; + gfp_t gfp_mask; + long unsigned int pgoff; + long unsigned int address; + long unsigned int real_address; + }; + enum fault_flag flags; + pmd_t *pmd; + pud_t *pud; + union { + pte_t orig_pte; + pmd_t orig_pmd; + }; + struct page *cow_page; + struct page *page; + pte_t *pte; + spinlock_t *ptl; + pgtable_t prealloc_pte; + long: 32; +}; + +enum node_states { + N_POSSIBLE = 0, + N_ONLINE = 1, + N_NORMAL_MEMORY = 2, + N_HIGH_MEMORY = 3, + N_MEMORY = 4, + N_CPU = 5, + N_GENERIC_INITIATOR = 6, + NR_NODE_STATES = 7, +}; + +struct free_area { + struct list_head free_list[6]; + long unsigned int nr_free; +}; + +enum node_stat_item { + NR_LRU_BASE = 0, + NR_INACTIVE_ANON = 0, + NR_ACTIVE_ANON = 1, + NR_INACTIVE_FILE = 2, + NR_ACTIVE_FILE = 3, + NR_UNEVICTABLE = 4, + NR_SLAB_RECLAIMABLE_B = 5, + NR_SLAB_UNRECLAIMABLE_B = 6, + NR_ISOLATED_ANON = 7, + NR_ISOLATED_FILE = 8, + WORKINGSET_NODES = 9, + WORKINGSET_REFAULT_BASE = 10, + WORKINGSET_REFAULT_ANON = 10, + WORKINGSET_REFAULT_FILE = 11, + WORKINGSET_ACTIVATE_BASE = 12, + WORKINGSET_ACTIVATE_ANON = 12, + WORKINGSET_ACTIVATE_FILE = 13, + WORKINGSET_RESTORE_BASE = 14, + WORKINGSET_RESTORE_ANON = 14, + WORKINGSET_RESTORE_FILE = 15, + WORKINGSET_NODERECLAIM = 16, + NR_ANON_MAPPED = 17, + NR_FILE_MAPPED = 18, + NR_FILE_PAGES = 19, + NR_FILE_DIRTY = 20, + NR_WRITEBACK = 21, + NR_WRITEBACK_TEMP = 22, + NR_SHMEM = 23, + NR_SHMEM_THPS = 24, + NR_SHMEM_PMDMAPPED = 25, + NR_FILE_THPS = 26, + NR_FILE_PMDMAPPED = 27, + NR_ANON_THPS = 28, + NR_VMSCAN_WRITE = 29, + NR_VMSCAN_IMMEDIATE = 30, + NR_DIRTIED = 31, + NR_WRITTEN = 32, + NR_THROTTLED_WRITTEN = 33, + NR_KERNEL_MISC_RECLAIMABLE = 34, + NR_FOLL_PIN_ACQUIRED = 35, + NR_FOLL_PIN_RELEASED = 36, + NR_KERNEL_STACK_KB = 37, + NR_PAGETABLE = 38, + NR_SECONDARY_PAGETABLE = 39, + NR_SWAPCACHE = 40, + NR_VM_NODE_STAT_ITEMS = 41, +}; + +enum lru_list { + LRU_INACTIVE_ANON = 0, + LRU_ACTIVE_ANON = 1, + LRU_INACTIVE_FILE = 2, + LRU_ACTIVE_FILE = 3, + LRU_UNEVICTABLE = 4, + NR_LRU_LISTS = 5, +}; + +struct pglist_data; + +struct lruvec { + struct list_head lists[5]; + spinlock_t lru_lock; + long unsigned int anon_cost; + long unsigned int file_cost; + atomic_long_t nonresident_age; + long unsigned int refaults[2]; + long unsigned int flags; + struct pglist_data *pgdat; +}; + +struct per_cpu_pages; + +struct per_cpu_zonestat; + +struct zone { + long unsigned int _watermark[4]; + long unsigned int watermark_boost; + long unsigned int nr_reserved_highatomic; + long int lowmem_reserve[4]; + struct pglist_data *zone_pgdat; + struct per_cpu_pages *per_cpu_pageset; + struct per_cpu_zonestat *per_cpu_zonestats; + int pageset_high; + int pageset_batch; + long unsigned int *pageblock_flags; + long unsigned int zone_start_pfn; + atomic_long_t managed_pages; + long unsigned int spanned_pages; + long unsigned int present_pages; + long unsigned int cma_pages; + const char *name; + long unsigned int nr_isolate_pageblock; + int initialized; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct cacheline_padding _pad1_; + struct free_area free_area[12]; + long unsigned int flags; + spinlock_t lock; + long: 32; + long: 32; + struct cacheline_padding _pad2_; + long unsigned int percpu_drift_mark; + long unsigned int compact_cached_free_pfn; + long unsigned int compact_cached_migrate_pfn[2]; + long unsigned int compact_init_migrate_pfn; + long unsigned int compact_init_free_pfn; + unsigned int compact_considered; + unsigned int compact_defer_shift; + int compact_order_failed; + bool compact_blockskip_flush; + bool contiguous; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct cacheline_padding _pad3_; + atomic_long_t vm_stat[11]; + atomic_long_t vm_numa_event[0]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct zoneref { + struct zone *zone; + int zone_idx; +}; + +struct zonelist { + struct zoneref _zonerefs[5]; +}; + +enum zone_type { + ZONE_DMA = 0, + ZONE_NORMAL = 1, + ZONE_HIGHMEM = 2, + ZONE_MOVABLE = 3, + __MAX_NR_ZONES = 4, +}; + +struct deferred_split { + spinlock_t split_queue_lock; + struct list_head split_queue; + long unsigned int split_queue_len; +}; + +struct page_ext; + +struct per_cpu_nodestat; + +struct pglist_data { + struct zone node_zones[4]; + struct zonelist node_zonelists[1]; + int nr_zones; + struct page *node_mem_map; + struct page_ext *node_page_ext; + long unsigned int node_start_pfn; + long unsigned int node_present_pages; + long unsigned int node_spanned_pages; + int node_id; + wait_queue_head_t kswapd_wait; + wait_queue_head_t pfmemalloc_wait; + wait_queue_head_t reclaim_wait[4]; + atomic_t nr_writeback_throttled; + long unsigned int nr_reclaim_start; + struct task_struct *kswapd; + int kswapd_order; + enum zone_type kswapd_highest_zoneidx; + int kswapd_failures; + int kcompactd_max_order; + enum zone_type kcompactd_highest_zoneidx; + wait_queue_head_t kcompactd_wait; + struct task_struct *kcompactd; + bool proactive_compact_trigger; + long unsigned int totalreserve_pages; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct cacheline_padding _pad1_; + struct deferred_split deferred_split_queue; + struct lruvec __lruvec; + long unsigned int flags; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct cacheline_padding _pad2_; + struct per_cpu_nodestat *per_cpu_nodestats; + atomic_long_t vm_stat[41]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct per_cpu_pages { + spinlock_t lock; + int count; + int high; + int batch; + short int free_factor; + struct list_head lists[13]; + long: 32; +}; + +struct per_cpu_zonestat { + s8 vm_stat_diff[11]; + s8 stat_threshold; +}; + +struct per_cpu_nodestat { + s8 stat_threshold; + s8 vm_node_stat_diff[41]; +}; + +struct page_ext { + long unsigned int flags; +}; + +typedef struct pglist_data pg_data_t; + +struct rcu_segcblist { + struct callback_head *head; + struct callback_head **tails[4]; + long unsigned int gp_seq[4]; + long int len; + long int seglen[4]; + u8 flags; +}; + +struct srcu_node; + +struct srcu_data { + atomic_long_t srcu_lock_count[2]; + atomic_long_t srcu_unlock_count[2]; + int srcu_nmi_safety; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + spinlock_t lock; + struct rcu_segcblist srcu_cblist; + long unsigned int srcu_gp_seq_needed; + long unsigned int srcu_gp_seq_needed_exp; + bool srcu_cblist_invoking; + struct timer_list delay_work; + struct work_struct work; + struct callback_head srcu_barrier_head; + struct srcu_node *mynode; + long unsigned int grpmask; + int cpu; + struct srcu_struct *ssp; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct srcu_node { + spinlock_t lock; + long unsigned int srcu_have_cbs[4]; + long unsigned int srcu_data_have_cbs[4]; + long unsigned int srcu_gp_seq_needed_exp; + struct srcu_node *srcu_parent; + int grplo; + int grphi; +}; + +struct srcu_struct { + struct srcu_node *node; + struct srcu_node *level[2]; + int srcu_size_state; + struct mutex srcu_cb_mutex; + spinlock_t lock; + struct mutex srcu_gp_mutex; + unsigned int srcu_idx; + long unsigned int srcu_gp_seq; + long unsigned int srcu_gp_seq_needed; + long unsigned int srcu_gp_seq_needed_exp; + long unsigned int srcu_gp_start; + long unsigned int srcu_last_gp_end; + long unsigned int srcu_size_jiffies; + long unsigned int srcu_n_lock_retries; + long unsigned int srcu_n_exp_nodelay; + struct srcu_data *sda; + bool sda_is_static; + long unsigned int srcu_barrier_seq; + struct mutex srcu_barrier_mutex; + struct completion srcu_barrier_completion; + atomic_t srcu_barrier_cpu_cnt; + long unsigned int reschedule_jiffies; + long unsigned int reschedule_count; + struct delayed_work work; + struct lockdep_map dep_map; +}; + +struct notifier_block; + +typedef int (*notifier_fn_t)(struct notifier_block *, long unsigned int, void *); + +struct notifier_block { + notifier_fn_t notifier_call; + struct notifier_block *next; + int priority; +}; + +struct blocking_notifier_head { + struct rw_semaphore rwsem; + struct notifier_block *head; +}; + +struct raw_notifier_head { + struct notifier_block *head; +}; + +typedef int proc_handler(struct ctl_table *, int, void *, size_t *, loff_t *); + +struct ctl_table_poll; + +struct ctl_table { + const char *procname; + void *data; + int maxlen; + umode_t mode; + struct ctl_table *child; + proc_handler *proc_handler; + struct ctl_table_poll *poll; + void *extra1; + void *extra2; +}; + +struct ctl_table_poll { + atomic_t event; + wait_queue_head_t wait; +}; + +struct ctl_node { + struct rb_node node; + struct ctl_table_header *header; +}; + +struct ctl_table_root { + struct ctl_table_set default_set; + struct ctl_table_set * (*lookup)(struct ctl_table_root *); + void (*set_ownership)(struct ctl_table_header *, struct ctl_table *, kuid_t *, kgid_t *); + int (*permissions)(struct ctl_table_header *, struct ctl_table *); +}; + +struct kernel_cap_struct { + __u32 cap[2]; +}; + +typedef struct kernel_cap_struct kernel_cap_t; + +struct user_struct; + +struct group_info; + +struct cred { + atomic_t usage; + kuid_t uid; + kgid_t gid; + kuid_t suid; + kgid_t sgid; + kuid_t euid; + kgid_t egid; + kuid_t fsuid; + kgid_t fsgid; + unsigned int securebits; + kernel_cap_t cap_inheritable; + kernel_cap_t cap_permitted; + kernel_cap_t cap_effective; + kernel_cap_t cap_bset; + kernel_cap_t cap_ambient; + unsigned char jit_keyring; + struct key *session_keyring; + struct key *process_keyring; + struct key *thread_keyring; + struct key *request_key_auth; + void *security; + struct user_struct *user; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct group_info *group_info; + union { + int non_rcu; + struct callback_head rcu; + }; +}; + +typedef __u32 Elf32_Addr; + +typedef __u16 Elf32_Half; + +typedef __u32 Elf32_Off; + +typedef __u32 Elf32_Word; + +struct elf32_sym { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Half st_shndx; +}; + +struct elf32_shdr { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +}; + +struct upid { + int nr; + struct pid_namespace *ns; +}; + +struct idr { + struct xarray idr_rt; + unsigned int idr_base; + unsigned int idr_next; +}; + +struct kmem_cache; + +struct fs_pin; + +struct pid_namespace { + struct idr idr; + struct callback_head rcu; + unsigned int pid_allocated; + struct task_struct *child_reaper; + struct kmem_cache *pid_cachep; + unsigned int level; + struct pid_namespace *parent; + struct fs_pin *bacct; + struct user_namespace *user_ns; + struct ucounts *ucounts; + int reboot; + struct ns_common ns; +}; + +struct pid { + refcount_t count; + unsigned int level; + spinlock_t lock; + struct hlist_head tasks[4]; + struct hlist_head inodes; + wait_queue_head_t wait_pidfd; + struct callback_head rcu; + struct upid numbers[1]; +}; + +struct rhashtable; + +struct rhashtable_compare_arg { + struct rhashtable *ht; + const void *key; +}; + +typedef u32 (*rht_hashfn_t)(const void *, u32, u32); + +typedef u32 (*rht_obj_hashfn_t)(const void *, u32, u32); + +typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *, const void *); + +struct rhashtable_params { + u16 nelem_hint; + u16 key_len; + u16 key_offset; + u16 head_offset; + unsigned int max_size; + u16 min_size; + bool automatic_shrinking; + rht_hashfn_t hashfn; + rht_obj_hashfn_t obj_hashfn; + rht_obj_cmpfn_t obj_cmpfn; +}; + +struct bucket_table; + +struct rhashtable { + struct bucket_table *tbl; + unsigned int key_len; + unsigned int max_elems; + struct rhashtable_params p; + bool rhlist; + struct work_struct run_work; + struct mutex mutex; + spinlock_t lock; + atomic_t nelems; +}; + +struct hrtimer_cpu_base; + +struct hrtimer_clock_base { + struct hrtimer_cpu_base *cpu_base; + unsigned int index; + clockid_t clockid; + seqcount_raw_spinlock_t seq; + struct hrtimer *running; + struct timerqueue_head active; + ktime_t (*get_time)(); + ktime_t offset; +}; + +struct hrtimer_cpu_base { + raw_spinlock_t lock; + unsigned int cpu; + unsigned int active_bases; + unsigned int clock_was_set_seq; + unsigned int hres_active: 1; + unsigned int in_hrtirq: 1; + unsigned int hang_detected: 1; + unsigned int softirq_activated: 1; + unsigned int nr_events; + short unsigned int nr_retries; + short unsigned int nr_hangs; + unsigned int max_hang_time; + ktime_t expires_next; + struct hrtimer *next_timer; + long: 32; + ktime_t softirq_expires_next; + struct hrtimer *softirq_next_timer; + long: 32; + struct hrtimer_clock_base clock_base[8]; +}; + +struct rlimit { + __kernel_ulong_t rlim_cur; + __kernel_ulong_t rlim_max; +}; + +struct task_cputime { + u64 stime; + u64 utime; + long long unsigned int sum_exec_runtime; +}; + +typedef void __signalfn_t(int); + +typedef __signalfn_t *__sighandler_t; + +typedef void __restorefn_t(); + +typedef __restorefn_t *__sigrestore_t; + +union sigval { + int sival_int; + void *sival_ptr; +}; + +typedef union sigval sigval_t; + +union __sifields { + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + } _kill; + struct { + __kernel_timer_t _tid; + int _overrun; + sigval_t _sigval; + int _sys_private; + } _timer; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + sigval_t _sigval; + } _rt; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + int _status; + __kernel_clock_t _utime; + __kernel_clock_t _stime; + } _sigchld; + struct { + void *_addr; + union { + int _trapno; + short int _addr_lsb; + struct { + char _dummy_bnd[4]; + void *_lower; + void *_upper; + } _addr_bnd; + struct { + char _dummy_pkey[4]; + __u32 _pkey; + } _addr_pkey; + struct { + long unsigned int _data; + __u32 _type; + __u32 _flags; + } _perf; + }; + } _sigfault; + struct { + long int _band; + int _fd; + } _sigpoll; + struct { + void *_call_addr; + int _syscall; + unsigned int _arch; + } _sigsys; +}; + +struct kernel_siginfo { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; +}; + +struct ucounts { + struct hlist_node node; + struct user_namespace *ns; + kuid_t uid; + atomic_t count; + atomic_long_t ucount[12]; + atomic_long_t rlimit[4]; +}; + +struct sigaction { + __sighandler_t sa_handler; + long unsigned int sa_flags; + __sigrestore_t sa_restorer; + sigset_t sa_mask; +}; + +struct k_sigaction { + struct sigaction sa; +}; + +struct cpu_itimer { + u64 expires; + u64 incr; +}; + +struct task_cputime_atomic { + atomic64_t utime; + atomic64_t stime; + atomic64_t sum_exec_runtime; +}; + +struct thread_group_cputimer { + struct task_cputime_atomic cputime_atomic; +}; + +struct pacct_struct { + int ac_flag; + long int ac_exitcode; + long unsigned int ac_mem; + long: 32; + u64 ac_utime; + u64 ac_stime; + long unsigned int ac_minflt; + long unsigned int ac_majflt; +}; + +struct core_state; + +struct tty_struct; + +struct autogroup; + +struct taskstats; + +struct tty_audit_buf; + +struct signal_struct { + refcount_t sigcnt; + atomic_t live; + int nr_threads; + int quick_threads; + struct list_head thread_head; + wait_queue_head_t wait_chldexit; + struct task_struct *curr_target; + struct sigpending shared_pending; + struct hlist_head multiprocess; + int group_exit_code; + int notify_count; + struct task_struct *group_exec_task; + int group_stop_count; + unsigned int flags; + struct core_state *core_state; + unsigned int is_child_subreaper: 1; + unsigned int has_child_subreaper: 1; + int posix_timer_id; + struct list_head posix_timers; + long: 32; + struct hrtimer real_timer; + ktime_t it_real_incr; + struct cpu_itimer it[2]; + struct thread_group_cputimer cputimer; + struct posix_cputimers posix_cputimers; + struct pid *pids[4]; + struct pid *tty_old_pgrp; + int leader; + struct tty_struct *tty; + struct autogroup *autogroup; + seqlock_t stats_lock; + u64 utime; + u64 stime; + u64 cutime; + u64 cstime; + u64 gtime; + u64 cgtime; + struct prev_cputime prev_cputime; + long unsigned int nvcsw; + long unsigned int nivcsw; + long unsigned int cnvcsw; + long unsigned int cnivcsw; + long unsigned int min_flt; + long unsigned int maj_flt; + long unsigned int cmin_flt; + long unsigned int cmaj_flt; + long unsigned int inblock; + long unsigned int oublock; + long unsigned int cinblock; + long unsigned int coublock; + long unsigned int maxrss; + long unsigned int cmaxrss; + struct task_io_accounting ioac; + long long unsigned int sum_sched_runtime; + struct rlimit rlim[16]; + struct pacct_struct pacct; + struct taskstats *stats; + unsigned int audit_tty; + struct tty_audit_buf *tty_audit_buf; + bool oom_flag_origin; + short int oom_score_adj; + short int oom_score_adj_min; + struct mm_struct *oom_mm; + struct mutex cred_guard_mutex; + struct rw_semaphore exec_update_lock; + long: 32; +}; + +struct rseq { + __u32 cpu_id_start; + __u32 cpu_id; + __u64 rseq_cs; + __u32 flags; + long: 32; + long: 32; + long: 32; +}; + +struct rq; + +struct rq_flags; + +struct affinity_context; + +struct sched_class { + void (*enqueue_task)(struct rq *, struct task_struct *, int); + void (*dequeue_task)(struct rq *, struct task_struct *, int); + void (*yield_task)(struct rq *); + bool (*yield_to_task)(struct rq *, struct task_struct *); + void (*check_preempt_curr)(struct rq *, struct task_struct *, int); + struct task_struct * (*pick_next_task)(struct rq *); + void (*put_prev_task)(struct rq *, struct task_struct *); + void (*set_next_task)(struct rq *, struct task_struct *, bool); + int (*balance)(struct rq *, struct task_struct *, struct rq_flags *); + int (*select_task_rq)(struct task_struct *, int, int); + struct task_struct * (*pick_task)(struct rq *); + void (*migrate_task_rq)(struct task_struct *, int); + void (*task_woken)(struct rq *, struct task_struct *); + void (*set_cpus_allowed)(struct task_struct *, struct affinity_context *); + void (*rq_online)(struct rq *); + void (*rq_offline)(struct rq *); + struct rq * (*find_lock_rq)(struct task_struct *, struct rq *); + void (*task_tick)(struct rq *, struct task_struct *, int); + void (*task_fork)(struct task_struct *); + void (*task_dead)(struct task_struct *); + void (*switched_from)(struct rq *, struct task_struct *); + void (*switched_to)(struct rq *, struct task_struct *); + void (*prio_changed)(struct rq *, struct task_struct *, int); + unsigned int (*get_rr_interval)(struct rq *, struct task_struct *); + void (*update_curr)(struct rq *); + void (*task_change_group)(struct task_struct *); +}; + +typedef int32_t key_serial_t; + +typedef uint32_t key_perm_t; + +struct key_type; + +struct key_tag; + +struct keyring_index_key { + long unsigned int hash; + union { + struct { + u16 desc_len; + char desc[2]; + }; + long unsigned int x; + }; + struct key_type *type; + struct key_tag *domain_tag; + const char *description; +}; + +union key_payload { + void *rcu_data0; + void *data[4]; +}; + +struct assoc_array_ptr; + +struct assoc_array { + struct assoc_array_ptr *root; + long unsigned int nr_leaves_on_tree; +}; + +struct key_user; + +struct key_restriction; + +struct key { + refcount_t usage; + key_serial_t serial; + union { + struct list_head graveyard_link; + struct rb_node serial_node; + }; + struct rw_semaphore sem; + struct key_user *user; + void *security; + long: 32; + union { + time64_t expiry; + time64_t revoked_at; + }; + time64_t last_used_at; + kuid_t uid; + kgid_t gid; + key_perm_t perm; + short unsigned int quotalen; + short unsigned int datalen; + short int state; + long unsigned int flags; + union { + struct keyring_index_key index_key; + struct { + long unsigned int hash; + long unsigned int len_desc; + struct key_type *type; + struct key_tag *domain_tag; + char *description; + }; + }; + union { + union key_payload payload; + struct { + struct list_head name_link; + struct assoc_array keys; + }; + }; + struct key_restriction *restrict_link; +}; + +struct uts_namespace; + +struct ipc_namespace; + +struct mnt_namespace; + +struct net; + +struct time_namespace; + +struct cgroup_namespace; + +struct nsproxy { + atomic_t count; + struct uts_namespace *uts_ns; + struct ipc_namespace *ipc_ns; + struct mnt_namespace *mnt_ns; + struct pid_namespace *pid_ns_for_children; + struct net *net_ns; + struct time_namespace *time_ns; + struct time_namespace *time_ns_for_children; + struct cgroup_namespace *cgroup_ns; +}; + +struct sighand_struct { + spinlock_t siglock; + refcount_t count; + wait_queue_head_t signalfd_wqh; + struct k_sigaction action[64]; +}; + +struct bio; + +struct bio_list { + struct bio *head; + struct bio *tail; +}; + +struct request; + +struct blk_plug { + struct request *mq_list; + struct request *cached_rq; + short unsigned int nr_ios; + short unsigned int rq_count; + bool multiple_queues; + bool has_elevator; + bool nowait; + struct list_head cb_list; +}; + +struct reclaim_state { + long unsigned int reclaimed_slab; +}; + +struct fprop_local_percpu { + struct percpu_counter events; + unsigned int period; + raw_spinlock_t lock; +}; + +enum wb_reason { + WB_REASON_BACKGROUND = 0, + WB_REASON_VMSCAN = 1, + WB_REASON_SYNC = 2, + WB_REASON_PERIODIC = 3, + WB_REASON_LAPTOP_TIMER = 4, + WB_REASON_FS_FREE_SPACE = 5, + WB_REASON_FORKER_THREAD = 6, + WB_REASON_FOREIGN_FLUSH = 7, + WB_REASON_MAX = 8, +}; + +struct cgroup_subsys_state; + +struct bdi_writeback { + struct backing_dev_info *bdi; + long unsigned int state; + long unsigned int last_old_flush; + struct list_head b_dirty; + struct list_head b_io; + struct list_head b_more_io; + struct list_head b_dirty_time; + spinlock_t list_lock; + atomic_t writeback_inodes; + long: 32; + struct percpu_counter stat[4]; + long unsigned int bw_time_stamp; + long unsigned int dirtied_stamp; + long unsigned int written_stamp; + long unsigned int write_bandwidth; + long unsigned int avg_write_bandwidth; + long unsigned int dirty_ratelimit; + long unsigned int balanced_dirty_ratelimit; + long: 32; + struct fprop_local_percpu completions; + int dirty_exceeded; + enum wb_reason start_all_reason; + spinlock_t work_lock; + struct list_head work_list; + struct delayed_work dwork; + struct delayed_work bw_dwork; + long unsigned int dirty_sleep; + struct list_head bdi_node; + struct percpu_ref refcnt; + struct fprop_local_percpu memcg_completions; + struct cgroup_subsys_state *memcg_css; + struct cgroup_subsys_state *blkcg_css; + struct list_head memcg_node; + struct list_head blkcg_node; + struct list_head b_attached; + struct list_head offline_node; + union { + struct work_struct release_work; + struct callback_head rcu; + }; +}; + +struct backing_dev_info { + u64 id; + struct rb_node rb_node; + struct list_head bdi_list; + long unsigned int ra_pages; + long unsigned int io_pages; + struct kref refcnt; + unsigned int capabilities; + unsigned int min_ratio; + unsigned int max_ratio; + unsigned int max_prop_frac; + atomic_long_t tot_write_bandwidth; + long: 32; + struct bdi_writeback wb; + struct list_head wb_list; + struct xarray cgwb_tree; + struct mutex cgwb_release_mutex; + struct rw_semaphore wb_switch_rwsem; + wait_queue_head_t wb_waitq; + struct device *dev; + char dev_name[64]; + struct device *owner; + struct timer_list laptop_mode_wb_timer; + struct dentry *debug_dir; + long: 32; +}; + +struct io_cq; + +struct io_context { + atomic_long_t refcount; + atomic_t active_ref; + short unsigned int ioprio; + spinlock_t lock; + struct xarray icq_tree; + struct io_cq *icq_hint; + struct hlist_head icq_list; + struct work_struct release_work; +}; + +struct cgroup; + +struct css_set { + struct cgroup_subsys_state *subsys[13]; + refcount_t refcount; + struct css_set *dom_cset; + struct cgroup *dfl_cgrp; + int nr_tasks; + struct list_head tasks; + struct list_head mg_tasks; + struct list_head dying_tasks; + struct list_head task_iters; + struct list_head e_cset_node[13]; + struct list_head threaded_csets; + struct list_head threaded_csets_node; + struct hlist_node hlist; + struct list_head cgrp_links; + struct list_head mg_src_preload_node; + struct list_head mg_dst_preload_node; + struct list_head mg_node; + struct cgroup *mg_src_cgrp; + struct cgroup *mg_dst_cgrp; + struct css_set *mg_dst_cset; + bool dead; + struct callback_head callback_head; +}; + +struct perf_event_groups { + struct rb_root tree; + long: 32; + u64 index; +}; + +typedef struct { + atomic_long_t a; +} local_t; + +struct perf_event_context { + raw_spinlock_t lock; + struct mutex mutex; + struct list_head pmu_ctx_list; + struct perf_event_groups pinned_groups; + struct perf_event_groups flexible_groups; + struct list_head event_list; + int nr_events; + int nr_user; + int is_active; + int nr_task_data; + int nr_stat; + int nr_freq; + int rotate_disable; + refcount_t refcount; + struct task_struct *task; + long: 32; + u64 time; + u64 timestamp; + u64 timeoffset; + struct perf_event_context *parent_ctx; + long: 32; + u64 parent_gen; + u64 generation; + int pin_count; + int nr_cgroups; + struct callback_head callback_head; + local_t nr_pending; + long: 32; +}; + +struct task_delay_info { + raw_spinlock_t lock; + long: 32; + u64 blkio_start; + u64 blkio_delay; + u64 swapin_start; + u64 swapin_delay; + u32 blkio_count; + u32 swapin_count; + u64 freepages_start; + u64 freepages_delay; + u64 thrashing_start; + u64 thrashing_delay; + u64 compact_start; + u64 compact_delay; + u64 wpcopy_start; + u64 wpcopy_delay; + u32 freepages_count; + u32 thrashing_count; + u32 compact_count; + u32 wpcopy_count; +}; + +struct ftrace_ret_stack { + long unsigned int ret; + long unsigned int func; + long long unsigned int calltime; + long unsigned int fp; + long: 32; +}; + +struct cgroup_subsys; + +struct cgroup_subsys_state { + struct cgroup *cgroup; + struct cgroup_subsys *ss; + struct percpu_ref refcnt; + struct list_head sibling; + struct list_head children; + struct list_head rstat_css_node; + int id; + unsigned int flags; + u64 serial_nr; + atomic_t online_cnt; + struct work_struct destroy_work; + struct rcu_work destroy_rwork; + struct cgroup_subsys_state *parent; + long: 32; +}; + +struct mem_cgroup_id { + int id; + refcount_t ref; +}; + +struct page_counter { + atomic_long_t usage; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct cacheline_padding _pad1_; + long unsigned int emin; + atomic_long_t min_usage; + atomic_long_t children_min_usage; + long unsigned int elow; + atomic_long_t low_usage; + atomic_long_t children_low_usage; + long unsigned int watermark; + long unsigned int failcnt; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct cacheline_padding _pad2_; + long unsigned int min; + long unsigned int low; + long unsigned int high; + long unsigned int max; + struct page_counter *parent; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct vmpressure { + long unsigned int scanned; + long unsigned int reclaimed; + long unsigned int tree_scanned; + long unsigned int tree_reclaimed; + spinlock_t sr_lock; + struct list_head events; + struct mutex events_lock; + struct work_struct work; +}; + +struct cgroup_file { + struct kernfs_node *kn; + long unsigned int notified_at; + struct timer_list notify_timer; +}; + +struct mem_cgroup_threshold_ary; + +struct mem_cgroup_thresholds { + struct mem_cgroup_threshold_ary *primary; + struct mem_cgroup_threshold_ary *spare; +}; + +struct fprop_global { + struct percpu_counter events; + unsigned int period; + seqcount_t sequence; +}; + +struct wb_domain { + spinlock_t lock; + long: 32; + struct fprop_global completions; + struct timer_list period_timer; + long unsigned int period_time; + long unsigned int dirty_limit_tstamp; + long unsigned int dirty_limit; +}; + +struct wb_completion { + atomic_t cnt; + wait_queue_head_t *waitq; +}; + +struct memcg_cgwb_frn { + u64 bdi_id; + int memcg_id; + long: 32; + u64 at; + struct wb_completion done; +}; + +struct memcg_vmstats; + +struct obj_cgroup; + +struct memcg_vmstats_percpu; + +struct mem_cgroup_per_node; + +struct mem_cgroup { + struct cgroup_subsys_state css; + struct mem_cgroup_id id; + long: 32; + long: 32; + struct page_counter memory; + union { + struct page_counter swap; + struct page_counter memsw; + }; + struct page_counter kmem; + struct page_counter tcpmem; + struct work_struct high_work; + long unsigned int zswap_max; + long unsigned int soft_limit; + struct vmpressure vmpressure; + bool oom_group; + bool oom_lock; + int under_oom; + int swappiness; + int oom_kill_disable; + struct cgroup_file events_file; + struct cgroup_file events_local_file; + struct cgroup_file swap_events_file; + struct mutex thresholds_lock; + struct mem_cgroup_thresholds thresholds; + struct mem_cgroup_thresholds memsw_thresholds; + struct list_head oom_notify; + long unsigned int move_charge_at_immigrate; + spinlock_t move_lock; + long unsigned int move_lock_flags; + long: 32; + long: 32; + long: 32; + struct cacheline_padding _pad1_; + struct memcg_vmstats *vmstats; + atomic_long_t memory_events[9]; + atomic_long_t memory_events_local[9]; + long unsigned int socket_pressure; + bool tcpmem_active; + int tcpmem_pressure; + int kmemcg_id; + struct obj_cgroup *objcg; + struct list_head objcg_list; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct cacheline_padding _pad2_; + atomic_t moving_account; + struct task_struct *move_lock_task; + struct memcg_vmstats_percpu *vmstats_percpu; + struct list_head cgwb_list; + long: 32; + struct wb_domain cgwb_domain; + struct memcg_cgwb_frn cgwb_frn[4]; + struct list_head event_list; + spinlock_t event_list_lock; + struct deferred_split deferred_split_queue; + struct mem_cgroup_per_node *nodeinfo[0]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct blk_integrity_profile; + +struct blk_integrity { + const struct blk_integrity_profile *profile; + unsigned char flags; + unsigned char tuple_size; + unsigned char interval_exp; + unsigned char tag_size; +}; + +enum rpm_status { + RPM_INVALID = 4294967295, + RPM_ACTIVE = 0, + RPM_RESUMING = 1, + RPM_SUSPENDED = 2, + RPM_SUSPENDING = 3, +}; + +enum blk_bounce { + BLK_BOUNCE_NONE = 0, + BLK_BOUNCE_HIGH = 1, +}; + +enum blk_zoned_model { + BLK_ZONED_NONE = 0, + BLK_ZONED_HA = 1, + BLK_ZONED_HM = 2, +}; + +struct queue_limits { + enum blk_bounce bounce; + long unsigned int seg_boundary_mask; + long unsigned int virt_boundary_mask; + unsigned int max_hw_sectors; + unsigned int max_dev_sectors; + unsigned int chunk_sectors; + unsigned int max_sectors; + unsigned int max_segment_size; + unsigned int physical_block_size; + unsigned int logical_block_size; + unsigned int alignment_offset; + unsigned int io_min; + unsigned int io_opt; + unsigned int max_discard_sectors; + unsigned int max_hw_discard_sectors; + unsigned int max_secure_erase_sectors; + unsigned int max_write_zeroes_sectors; + unsigned int max_zone_append_sectors; + unsigned int discard_granularity; + unsigned int discard_alignment; + unsigned int zone_write_granularity; + short unsigned int max_segments; + short unsigned int max_integrity_segments; + short unsigned int max_discard_segments; + unsigned char misaligned; + unsigned char discard_misaligned; + unsigned char raid_partial_stripes_expensive; + enum blk_zoned_model zoned; + unsigned int dma_alignment; +}; + +struct elevator_queue; + +struct blk_queue_stats; + +struct rq_qos; + +struct blk_mq_ops; + +struct blk_mq_ctx; + +struct gendisk; + +struct blk_stat_callback; + +struct blk_rq_stat; + +struct blk_mq_tags; + +struct blkcg_gq; + +struct blk_trace; + +struct blk_flush_queue; + +struct throtl_data; + +struct blk_mq_tag_set; + +struct request_queue { + struct request *last_merge; + struct elevator_queue *elevator; + struct percpu_ref q_usage_counter; + struct blk_queue_stats *stats; + struct rq_qos *rq_qos; + const struct blk_mq_ops *mq_ops; + struct blk_mq_ctx *queue_ctx; + unsigned int queue_depth; + struct xarray hctx_table; + unsigned int nr_hw_queues; + void *queuedata; + long unsigned int queue_flags; + atomic_t pm_only; + int id; + spinlock_t queue_lock; + struct gendisk *disk; + refcount_t refs; + struct kobject *mq_kobj; + struct blk_integrity integrity; + struct device *dev; + enum rpm_status rpm_status; + long unsigned int nr_requests; + unsigned int dma_pad_mask; + unsigned int rq_timeout; + int poll_nsec; + struct blk_stat_callback *poll_cb; + struct blk_rq_stat *poll_stat; + struct timer_list timeout; + struct work_struct timeout_work; + atomic_t nr_active_requests_shared_tags; + struct blk_mq_tags *sched_shared_tags; + struct list_head icq_list; + long unsigned int blkcg_pols[1]; + struct blkcg_gq *root_blkg; + struct list_head blkg_list; + struct queue_limits limits; + unsigned int required_elevator_features; + int node; + struct blk_trace *blk_trace; + struct blk_flush_queue *fq; + struct list_head requeue_list; + spinlock_t requeue_lock; + struct delayed_work requeue_work; + struct mutex sysfs_lock; + struct mutex sysfs_dir_lock; + struct list_head unused_hctx_list; + spinlock_t unused_hctx_lock; + int mq_freeze_depth; + struct throtl_data *td; + struct callback_head callback_head; + wait_queue_head_t mq_freeze_wq; + struct mutex mq_freeze_lock; + int quiesce_depth; + struct blk_mq_tag_set *tag_set; + struct list_head tag_set_list; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct dentry *rqos_debugfs_dir; + struct mutex debugfs_mutex; + bool mq_sysfs_init_done; +}; + +struct vm_struct { + struct vm_struct *next; + void *addr; + long unsigned int size; + long unsigned int flags; + struct page **pages; + unsigned int nr_pages; + phys_addr_t phys_addr; + const void *caller; + long: 32; +}; + +struct list_lru_node; + +struct list_lru { + struct list_lru_node *node; + struct list_head list; + int shrinker_id; + bool memcg_aware; + struct xarray xa; +}; + +struct kernfs_root; + +struct kernfs_elem_dir { + long unsigned int subdirs; + struct rb_root children; + struct kernfs_root *root; + long unsigned int rev; +}; + +struct kernfs_elem_symlink { + struct kernfs_node *target_kn; +}; + +struct kernfs_ops; + +struct kernfs_open_node; + +struct kernfs_elem_attr { + const struct kernfs_ops *ops; + struct kernfs_open_node *open; + loff_t size; + struct kernfs_node *notify_next; + long: 32; +}; + +struct kernfs_iattrs; + +struct kernfs_node { + atomic_t count; + atomic_t active; + struct kernfs_node *parent; + const char *name; + struct rb_node rb; + const void *ns; + unsigned int hash; + long: 32; + union { + struct kernfs_elem_dir dir; + struct kernfs_elem_symlink symlink; + struct kernfs_elem_attr attr; + }; + void *priv; + long: 32; + u64 id; + short unsigned int flags; + umode_t mode; + struct kernfs_iattrs *iattr; +}; + +struct kernfs_open_file; + +struct kernfs_ops { + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + ssize_t (*read)(struct kernfs_open_file *, char *, size_t, loff_t); + size_t atomic_write_len; + bool prealloc; + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); + int (*mmap)(struct kernfs_open_file *, struct vm_area_struct *); +}; + +struct seq_operations; + +struct seq_file { + char *buf; + size_t size; + size_t from; + size_t count; + size_t pad_until; + long: 32; + loff_t index; + loff_t read_pos; + struct mutex lock; + const struct seq_operations *op; + int poll_event; + const struct file *file; + void *private; + long: 32; +}; + +struct kernfs_open_file { + struct kernfs_node *kn; + struct file *file; + struct seq_file *seq_file; + void *priv; + struct mutex mutex; + struct mutex prealloc_mutex; + int event; + struct list_head list; + char *prealloc_buf; + size_t atomic_write_len; + bool mmapped: 1; + bool released: 1; + const struct vm_operations_struct *vm_ops; +}; + +typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *); + +struct poll_table_struct { + poll_queue_proc _qproc; + __poll_t _key; +}; + +enum kobj_ns_type { + KOBJ_NS_TYPE_NONE = 0, + KOBJ_NS_TYPE_NET = 1, + KOBJ_NS_TYPES = 2, +}; + +struct sock; + +struct kobj_ns_type_operations { + enum kobj_ns_type type; + bool (*current_may_mount)(); + void * (*grab_current_ns)(); + const void * (*netlink_ns)(struct sock *); + const void * (*initial_ns)(); + void (*drop_ns)(void *); +}; + +struct attribute { + const char *name; + umode_t mode; +}; + +struct bin_attribute; + +struct attribute_group { + const char *name; + umode_t (*is_visible)(struct kobject *, struct attribute *, int); + umode_t (*is_bin_visible)(struct kobject *, struct bin_attribute *, int); + struct attribute **attrs; + struct bin_attribute **bin_attrs; +}; + +struct bin_attribute { + struct attribute attr; + size_t size; + void *private; + struct address_space * (*f_mapping)(); + ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + int (*mmap)(struct file *, struct kobject *, struct bin_attribute *, struct vm_area_struct *); +}; + +struct sysfs_ops { + ssize_t (*show)(struct kobject *, struct attribute *, char *); + ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); +}; + +struct kset_uevent_ops; + +struct kset { + struct list_head list; + spinlock_t list_lock; + struct kobject kobj; + const struct kset_uevent_ops *uevent_ops; +}; + +struct kobj_type { + void (*release)(struct kobject *); + const struct sysfs_ops *sysfs_ops; + const struct attribute_group **default_groups; + const struct kobj_ns_type_operations * (*child_ns_type)(const struct kobject *); + const void * (*namespace)(const struct kobject *); + void (*get_ownership)(const struct kobject *, kuid_t *, kgid_t *); +}; + +struct kobj_uevent_env { + char *argv[3]; + char *envp[64]; + int envp_idx; + char buf[2048]; + int buflen; +}; + +struct kset_uevent_ops { + int (* const filter)(const struct kobject *); + const char * (* const name)(const struct kobject *); + int (* const uevent)(struct kobject *, struct kobj_uevent_env *); +}; + +struct kparam_string; + +struct kparam_array; + +struct kernel_param { + const char *name; + struct module *mod; + const struct kernel_param_ops *ops; + const u16 perm; + s8 level; + u8 flags; + union { + void *arg; + const struct kparam_string *str; + const struct kparam_array *arr; + }; +}; + +struct kparam_string { + unsigned int maxlen; + char *string; +}; + +struct kparam_array { + unsigned int max; + unsigned int elemsize; + unsigned int *num; + const struct kernel_param_ops *ops; + void *elem; +}; + +struct tracepoint_func { + void *func; + void *data; + int prio; +}; + +struct tracepoint { + const char *name; + struct static_key key; + struct static_call_key *static_call_key; + void *static_call_tramp; + void *iterator; + int (*regfunc)(); + void (*unregfunc)(); + struct tracepoint_func *funcs; +}; + +struct bpf_raw_event_map { + struct tracepoint *tp; + void *bpf_func; + u32 num_args; + u32 writable_size; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct plt_entries { + u32 ldr[16]; + u32 lit[16]; +}; + +struct module_attribute { + struct attribute attr; + ssize_t (*show)(struct module_attribute *, struct module_kobject *, char *); + ssize_t (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t); + void (*setup)(struct module *, const char *); + int (*test)(struct module *); + void (*free)(struct module *); +}; + +struct exception_table_entry { + long unsigned int insn; + long unsigned int fixup; +}; + +struct trace_event_functions; + +struct trace_event { + struct hlist_node node; + int type; + struct trace_event_functions *funcs; +}; + +struct trace_event_class; + +struct bpf_prog_array; + +struct trace_event_call { + struct list_head list; + struct trace_event_class *class; + union { + char *name; + struct tracepoint *tp; + }; + struct trace_event event; + char *print_fmt; + struct event_filter *filter; + union { + void *module; + atomic_t refcnt; + }; + void *data; + int flags; + int perf_refcount; + struct hlist_head *perf_events; + struct bpf_prog_array *prog_array; + int (*perf_perm)(struct trace_event_call *, struct perf_event *); +}; + +struct trace_eval_map { + const char *system; + const char *eval_string; + long unsigned int eval_value; +}; + +struct hlist_bl_node; + +struct hlist_bl_head { + struct hlist_bl_node *first; +}; + +struct hlist_bl_node { + struct hlist_bl_node *next; + struct hlist_bl_node **pprev; +}; + +struct lockref { + union { + __u64 lock_count; + struct { + spinlock_t lock; + int count; + }; + }; +}; + +struct qstr { + union { + struct { + u32 hash; + u32 len; + }; + u64 hash_len; + }; + const unsigned char *name; + long: 32; +}; + +struct dentry_operations; + +struct dentry { + unsigned int d_flags; + seqcount_spinlock_t d_seq; + struct hlist_bl_node d_hash; + struct dentry *d_parent; + long: 32; + struct qstr d_name; + struct inode *d_inode; + unsigned char d_iname[36]; + struct lockref d_lockref; + const struct dentry_operations *d_op; + struct super_block *d_sb; + long unsigned int d_time; + void *d_fsdata; + union { + struct list_head d_lru; + wait_queue_head_t *d_wait; + }; + struct list_head d_child; + struct list_head d_subdirs; + union { + struct hlist_node d_alias; + struct hlist_bl_node d_in_lookup_hash; + struct callback_head d_rcu; + } d_u; +}; + +struct posix_acl; + +struct inode_operations; + +struct file_lock_context; + +struct cdev; + +struct fsnotify_mark_connector; + +struct fscrypt_info; + +struct fsverity_info; + +struct inode { + umode_t i_mode; + short unsigned int i_opflags; + kuid_t i_uid; + kgid_t i_gid; + unsigned int i_flags; + struct posix_acl *i_acl; + struct posix_acl *i_default_acl; + const struct inode_operations *i_op; + struct super_block *i_sb; + struct address_space *i_mapping; + void *i_security; + long unsigned int i_ino; + union { + const unsigned int i_nlink; + unsigned int __i_nlink; + }; + dev_t i_rdev; + long: 32; + loff_t i_size; + struct timespec64 i_atime; + struct timespec64 i_mtime; + struct timespec64 i_ctime; + spinlock_t i_lock; + short unsigned int i_bytes; + u8 i_blkbits; + u8 i_write_hint; + blkcnt_t i_blocks; + seqcount_t i_size_seqcount; + long unsigned int i_state; + struct rw_semaphore i_rwsem; + long unsigned int dirtied_when; + long unsigned int dirtied_time_when; + struct hlist_node i_hash; + struct list_head i_io_list; + struct bdi_writeback *i_wb; + int i_wb_frn_winner; + u16 i_wb_frn_avg_time; + u16 i_wb_frn_history; + struct list_head i_lru; + struct list_head i_sb_list; + struct list_head i_wb_list; + union { + struct hlist_head i_dentry; + struct callback_head i_rcu; + }; + long: 32; + atomic64_t i_version; + atomic64_t i_sequence; + atomic_t i_count; + atomic_t i_dio_count; + atomic_t i_writecount; + atomic_t i_readcount; + union { + const struct file_operations *i_fop; + void (*free_inode)(struct inode *); + }; + struct file_lock_context *i_flctx; + struct address_space i_data; + struct list_head i_devices; + union { + struct pipe_inode_info *i_pipe; + struct cdev *i_cdev; + char *i_link; + unsigned int i_dir_seq; + }; + __u32 i_generation; + __u32 i_fsnotify_mask; + struct fsnotify_mark_connector *i_fsnotify_marks; + struct fscrypt_info *i_crypt_info; + struct fsverity_info *i_verity_info; + void *i_private; +}; + +struct dentry_operations { + int (*d_revalidate)(struct dentry *, unsigned int); + int (*d_weak_revalidate)(struct dentry *, unsigned int); + int (*d_hash)(const struct dentry *, struct qstr *); + int (*d_compare)(const struct dentry *, unsigned int, const char *, const struct qstr *); + int (*d_delete)(const struct dentry *); + int (*d_init)(struct dentry *); + void (*d_release)(struct dentry *); + void (*d_prune)(struct dentry *); + void (*d_iput)(struct dentry *, struct inode *); + char * (*d_dname)(struct dentry *, char *, int); + struct vfsmount * (*d_automount)(struct path *); + int (*d_manage)(const struct path *, bool); + struct dentry * (*d_real)(struct dentry *, const struct inode *); + long: 32; + long: 32; + long: 32; +}; + +typedef long long int qsize_t; + +struct quota_format_type; + +struct mem_dqinfo { + struct quota_format_type *dqi_format; + int dqi_fmt_id; + struct list_head dqi_dirty_list; + long unsigned int dqi_flags; + unsigned int dqi_bgrace; + unsigned int dqi_igrace; + long: 32; + qsize_t dqi_max_spc_limit; + qsize_t dqi_max_ino_limit; + void *dqi_priv; + long: 32; +}; + +struct quota_format_ops; + +struct quota_info { + unsigned int flags; + struct rw_semaphore dqio_sem; + struct inode *files[3]; + struct mem_dqinfo info[3]; + const struct quota_format_ops *ops[3]; + long: 32; +}; + +struct rcu_sync { + int gp_state; + int gp_count; + wait_queue_head_t gp_wait; + struct callback_head cb_head; +}; + +struct percpu_rw_semaphore { + struct rcu_sync rss; + unsigned int *read_count; + struct rcuwait writer; + wait_queue_head_t waiters; + atomic_t block; +}; + +struct sb_writers { + int frozen; + wait_queue_head_t wait_unfrozen; + struct percpu_rw_semaphore rw_sem[3]; +}; + +typedef struct { + __u8 b[16]; +} uuid_t; + +struct shrink_control; + +struct shrinker { + long unsigned int (*count_objects)(struct shrinker *, struct shrink_control *); + long unsigned int (*scan_objects)(struct shrinker *, struct shrink_control *); + long int batch; + int seeks; + unsigned int flags; + struct list_head list; + int id; + atomic_long_t *nr_deferred; +}; + +struct super_operations; + +struct dquot_operations; + +struct quotactl_ops; + +struct export_operations; + +struct xattr_handler; + +struct fscrypt_operations; + +struct fscrypt_keyring; + +struct fsverity_operations; + +struct block_device; + +struct mtd_info; + +struct super_block { + struct list_head s_list; + dev_t s_dev; + unsigned char s_blocksize_bits; + long unsigned int s_blocksize; + long: 32; + loff_t s_maxbytes; + struct file_system_type *s_type; + const struct super_operations *s_op; + const struct dquot_operations *dq_op; + const struct quotactl_ops *s_qcop; + const struct export_operations *s_export_op; + long unsigned int s_flags; + long unsigned int s_iflags; + long unsigned int s_magic; + struct dentry *s_root; + struct rw_semaphore s_umount; + int s_count; + atomic_t s_active; + void *s_security; + const struct xattr_handler **s_xattr; + const struct fscrypt_operations *s_cop; + struct fscrypt_keyring *s_master_keys; + const struct fsverity_operations *s_vop; + struct hlist_bl_head s_roots; + struct list_head s_mounts; + struct block_device *s_bdev; + struct backing_dev_info *s_bdi; + struct mtd_info *s_mtd; + struct hlist_node s_instances; + unsigned int s_quota_types; + long: 32; + struct quota_info s_dquot; + struct sb_writers s_writers; + void *s_fs_info; + u32 s_time_gran; + long: 32; + time64_t s_time_min; + time64_t s_time_max; + __u32 s_fsnotify_mask; + struct fsnotify_mark_connector *s_fsnotify_marks; + char s_id[32]; + uuid_t s_uuid; + unsigned int s_max_links; + fmode_t s_mode; + struct mutex s_vfs_rename_mutex; + const char *s_subtype; + const struct dentry_operations *s_d_op; + struct shrinker s_shrink; + atomic_long_t s_remove_count; + atomic_long_t s_fsnotify_connectors; + int s_readonly_remount; + errseq_t s_wb_err; + struct workqueue_struct *s_dio_done_wq; + struct hlist_head s_pins; + struct user_namespace *s_user_ns; + struct list_lru s_dentry_lru; + struct list_lru s_inode_lru; + struct callback_head rcu; + struct work_struct destroy_work; + struct mutex s_sync_lock; + int s_stack_depth; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + spinlock_t s_inode_list_lock; + struct list_head s_inodes; + spinlock_t s_inode_wblist_lock; + struct list_head s_inodes_wb; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct mnt_idmap; + +struct vfsmount { + struct dentry *mnt_root; + struct super_block *mnt_sb; + int mnt_flags; + struct mnt_idmap *mnt_idmap; +}; + +struct shrink_control { + gfp_t gfp_mask; + int nid; + long unsigned int nr_to_scan; + long unsigned int nr_scanned; + struct mem_cgroup *memcg; +}; + +struct list_lru_one { + struct list_head list; + long int nr_items; +}; + +struct list_lru_node { + spinlock_t lock; + struct list_lru_one lru; + long int nr_items; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +enum migrate_mode { + MIGRATE_ASYNC = 0, + MIGRATE_SYNC_LIGHT = 1, + MIGRATE_SYNC = 2, + MIGRATE_SYNC_NO_COPY = 3, +}; + +struct cgroup_base_stat { + struct task_cputime cputime; +}; + +struct cgroup_bpf { + struct bpf_prog_array *effective[33]; + struct hlist_head progs[33]; + u8 flags[33]; + struct list_head storages; + struct bpf_prog_array *inactive; + struct percpu_ref refcnt; + struct work_struct release_work; +}; + +struct cgroup_freezer_state { + bool freeze; + int e_freeze; + int nr_frozen_descendants; + int nr_frozen_tasks; +}; + +struct cgroup_root; + +struct cgroup_rstat_cpu; + +struct psi_group; + +struct cgroup { + struct cgroup_subsys_state self; + long unsigned int flags; + int level; + int max_depth; + int nr_descendants; + int nr_dying_descendants; + int max_descendants; + int nr_populated_csets; + int nr_populated_domain_children; + int nr_populated_threaded_children; + int nr_threaded_children; + struct kernfs_node *kn; + struct cgroup_file procs_file; + struct cgroup_file events_file; + struct cgroup_file psi_files[3]; + u16 subtree_control; + u16 subtree_ss_mask; + u16 old_subtree_control; + u16 old_subtree_ss_mask; + struct cgroup_subsys_state *subsys[13]; + struct cgroup_root *root; + struct list_head cset_links; + struct list_head e_csets[13]; + struct cgroup *dom_cgrp; + struct cgroup *old_dom_cgrp; + struct cgroup_rstat_cpu *rstat_cpu; + struct list_head rstat_css_list; + long: 32; + struct cgroup_base_stat last_bstat; + struct cgroup_base_stat bstat; + struct prev_cputime prev_cputime; + struct list_head pidlists; + struct mutex pidlist_mutex; + wait_queue_head_t offline_waitq; + struct work_struct release_agent_work; + struct psi_group *psi; + struct cgroup_bpf bpf; + atomic_t congestion_count; + struct cgroup_freezer_state freezer; + struct bpf_local_storage *bpf_cgrp_storage; + struct cgroup *ancestors[0]; + long: 32; +}; + +struct key_tag { + struct callback_head rcu; + refcount_t usage; + bool removed; +}; + +typedef int (*request_key_actor_t)(struct key *, void *); + +struct key_preparsed_payload; + +struct key_match_data; + +struct kernel_pkey_params; + +struct kernel_pkey_query; + +struct key_type { + const char *name; + size_t def_datalen; + unsigned int flags; + int (*vet_description)(const char *); + int (*preparse)(struct key_preparsed_payload *); + void (*free_preparse)(struct key_preparsed_payload *); + int (*instantiate)(struct key *, struct key_preparsed_payload *); + int (*update)(struct key *, struct key_preparsed_payload *); + int (*match_preparse)(struct key_match_data *); + void (*match_free)(struct key_match_data *); + void (*revoke)(struct key *); + void (*destroy)(struct key *); + void (*describe)(const struct key *, struct seq_file *); + long int (*read)(const struct key *, char *, size_t); + request_key_actor_t request_key; + struct key_restriction * (*lookup_restriction)(const char *); + int (*asym_query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*asym_eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*asym_verify_signature)(struct kernel_pkey_params *, const void *, const void *); + struct list_head link; + struct lock_class_key lock_class; +}; + +typedef int (*key_restrict_link_func_t)(struct key *, const struct key_type *, const union key_payload *, struct key *); + +struct key_restriction { + key_restrict_link_func_t check; + struct key *key; + struct key_type *keytype; +}; + +struct user_struct { + refcount_t __count; + long: 32; + struct percpu_counter epoll_watches; + long unsigned int unix_inflight; + atomic_long_t pipe_bufs; + struct hlist_node uidhash_node; + kuid_t uid; + atomic_long_t locked_vm; + struct ratelimit_state ratelimit; + long: 32; +}; + +struct group_info { + atomic_t usage; + int ngroups; + kgid_t gid[0]; +}; + +struct core_thread { + struct task_struct *task; + struct core_thread *next; +}; + +struct core_state { + atomic_t nr_threads; + struct core_thread dumper; + struct completion startup; +}; + +struct taskstats { + __u16 version; + __u32 ac_exitcode; + __u8 ac_flag; + __u8 ac_nice; + long: 32; + __u64 cpu_count; + __u64 cpu_delay_total; + __u64 blkio_count; + __u64 blkio_delay_total; + __u64 swapin_count; + __u64 swapin_delay_total; + __u64 cpu_run_real_total; + __u64 cpu_run_virtual_total; + char ac_comm[32]; + __u8 ac_sched; + __u8 ac_pad[3]; + long: 32; + __u32 ac_uid; + __u32 ac_gid; + __u32 ac_pid; + __u32 ac_ppid; + __u32 ac_btime; + long: 32; + __u64 ac_etime; + __u64 ac_utime; + __u64 ac_stime; + __u64 ac_minflt; + __u64 ac_majflt; + __u64 coremem; + __u64 virtmem; + __u64 hiwater_rss; + __u64 hiwater_vm; + __u64 read_char; + __u64 write_char; + __u64 read_syscalls; + __u64 write_syscalls; + __u64 read_bytes; + __u64 write_bytes; + __u64 cancelled_write_bytes; + __u64 nvcsw; + __u64 nivcsw; + __u64 ac_utimescaled; + __u64 ac_stimescaled; + __u64 cpu_scaled_run_real_total; + __u64 freepages_count; + __u64 freepages_delay_total; + __u64 thrashing_count; + __u64 thrashing_delay_total; + __u64 ac_btime64; + __u64 compact_count; + __u64 compact_delay_total; + __u32 ac_tgid; + long: 32; + __u64 ac_tgetime; + __u64 ac_exe_dev; + __u64 ac_exe_inode; + __u64 wpcopy_count; + __u64 wpcopy_delay_total; +}; + +struct delayed_call { + void (*fn)(void *); + void *arg; +}; + +struct io_cq { + struct request_queue *q; + struct io_context *ioc; + union { + struct list_head q_node; + struct kmem_cache *__rcu_icq_cache; + }; + union { + struct hlist_node ioc_node; + struct callback_head __rcu_head; + }; + unsigned int flags; +}; + +typedef struct { + uid_t val; +} vfsuid_t; + +typedef struct { + gid_t val; +} vfsgid_t; + +typedef void percpu_ref_func_t(struct percpu_ref *); + +struct percpu_ref_data { + atomic_long_t count; + percpu_ref_func_t *release; + percpu_ref_func_t *confirm_switch; + bool force_atomic: 1; + bool allow_reinit: 1; + struct callback_head rcu; + struct percpu_ref *ref; +}; + +enum kmalloc_cache_type { + KMALLOC_NORMAL = 0, + KMALLOC_RECLAIM = 1, + KMALLOC_DMA = 2, + KMALLOC_CGROUP = 3, + NR_KMALLOC_TYPES = 4, +}; + +struct wait_page_queue; + +struct kiocb { + struct file *ki_filp; + long: 32; + loff_t ki_pos; + void (*ki_complete)(struct kiocb *, long int); + void *private; + int ki_flags; + u16 ki_ioprio; + struct wait_page_queue *ki_waitq; + long: 32; +}; + +struct iattr { + unsigned int ia_valid; + umode_t ia_mode; + union { + kuid_t ia_uid; + vfsuid_t ia_vfsuid; + }; + union { + kgid_t ia_gid; + vfsgid_t ia_vfsgid; + }; + loff_t ia_size; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct file *ia_file; + long: 32; +}; + +typedef __kernel_uid32_t projid_t; + +typedef struct { + projid_t val; +} kprojid_t; + +enum quota_type { + USRQUOTA = 0, + GRPQUOTA = 1, + PRJQUOTA = 2, +}; + +struct kqid { + union { + kuid_t uid; + kgid_t gid; + kprojid_t projid; + }; + enum quota_type type; +}; + +struct mem_dqblk { + qsize_t dqb_bhardlimit; + qsize_t dqb_bsoftlimit; + qsize_t dqb_curspace; + qsize_t dqb_rsvspace; + qsize_t dqb_ihardlimit; + qsize_t dqb_isoftlimit; + qsize_t dqb_curinodes; + time64_t dqb_btime; + time64_t dqb_itime; +}; + +struct dquot { + struct hlist_node dq_hash; + struct list_head dq_inuse; + struct list_head dq_free; + struct list_head dq_dirty; + struct mutex dq_lock; + spinlock_t dq_dqb_lock; + atomic_t dq_count; + struct super_block *dq_sb; + struct kqid dq_id; + loff_t dq_off; + long unsigned int dq_flags; + long: 32; + struct mem_dqblk dq_dqb; +}; + +struct quota_format_type { + int qf_fmt_id; + const struct quota_format_ops *qf_ops; + struct module *qf_owner; + struct quota_format_type *qf_next; +}; + +struct quota_format_ops { + int (*check_quota_file)(struct super_block *, int); + int (*read_file_info)(struct super_block *, int); + int (*write_file_info)(struct super_block *, int); + int (*free_file_info)(struct super_block *, int); + int (*read_dqblk)(struct dquot *); + int (*commit_dqblk)(struct dquot *); + int (*release_dqblk)(struct dquot *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct dquot_operations { + int (*write_dquot)(struct dquot *); + struct dquot * (*alloc_dquot)(struct super_block *, int); + void (*destroy_dquot)(struct dquot *); + int (*acquire_dquot)(struct dquot *); + int (*release_dquot)(struct dquot *); + int (*mark_dirty)(struct dquot *); + int (*write_info)(struct super_block *, int); + qsize_t * (*get_reserved_space)(struct inode *); + int (*get_projid)(struct inode *, kprojid_t *); + int (*get_inode_usage)(struct inode *, qsize_t *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct qc_dqblk { + int d_fieldmask; + long: 32; + u64 d_spc_hardlimit; + u64 d_spc_softlimit; + u64 d_ino_hardlimit; + u64 d_ino_softlimit; + u64 d_space; + u64 d_ino_count; + s64 d_ino_timer; + s64 d_spc_timer; + int d_ino_warns; + int d_spc_warns; + u64 d_rt_spc_hardlimit; + u64 d_rt_spc_softlimit; + u64 d_rt_space; + s64 d_rt_spc_timer; + int d_rt_spc_warns; + long: 32; +}; + +struct qc_type_state { + unsigned int flags; + unsigned int spc_timelimit; + unsigned int ino_timelimit; + unsigned int rt_spc_timelimit; + unsigned int spc_warnlimit; + unsigned int ino_warnlimit; + unsigned int rt_spc_warnlimit; + long: 32; + long long unsigned int ino; + blkcnt_t blocks; + blkcnt_t nextents; +}; + +struct qc_state { + unsigned int s_incoredqs; + long: 32; + struct qc_type_state s_state[3]; +}; + +struct qc_info { + int i_fieldmask; + unsigned int i_flags; + unsigned int i_spc_timelimit; + unsigned int i_ino_timelimit; + unsigned int i_rt_spc_timelimit; + unsigned int i_spc_warnlimit; + unsigned int i_ino_warnlimit; + unsigned int i_rt_spc_warnlimit; +}; + +struct quotactl_ops { + int (*quota_on)(struct super_block *, int, int, const struct path *); + int (*quota_off)(struct super_block *, int); + int (*quota_enable)(struct super_block *, unsigned int); + int (*quota_disable)(struct super_block *, unsigned int); + int (*quota_sync)(struct super_block *, int); + int (*set_info)(struct super_block *, int, struct qc_info *); + int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_nextdqblk)(struct super_block *, struct kqid *, struct qc_dqblk *); + int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_state)(struct super_block *, struct qc_state *); + int (*rm_xquota)(struct super_block *, unsigned int); +}; + +struct wait_page_queue { + struct folio *folio; + int bit_nr; + wait_queue_entry_t wait; +}; + +struct writeback_control; + +struct readahead_control; + +struct swap_info_struct; + +struct address_space_operations { + int (*writepage)(struct page *, struct writeback_control *); + int (*read_folio)(struct file *, struct folio *); + int (*writepages)(struct address_space *, struct writeback_control *); + bool (*dirty_folio)(struct address_space *, struct folio *); + void (*readahead)(struct readahead_control *); + int (*write_begin)(struct file *, struct address_space *, loff_t, unsigned int, struct page **, void **); + int (*write_end)(struct file *, struct address_space *, loff_t, unsigned int, unsigned int, struct page *, void *); + sector_t (*bmap)(struct address_space *, sector_t); + void (*invalidate_folio)(struct folio *, size_t, size_t); + bool (*release_folio)(struct folio *, gfp_t); + void (*free_folio)(struct folio *); + ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *); + int (*migrate_folio)(struct address_space *, struct folio *, struct folio *, enum migrate_mode); + int (*launder_folio)(struct folio *); + bool (*is_partially_uptodate)(struct folio *, size_t, size_t); + void (*is_dirty_writeback)(struct folio *, bool *, bool *); + int (*error_remove_page)(struct address_space *, struct page *); + int (*swap_activate)(struct swap_info_struct *, struct file *, sector_t *); + void (*swap_deactivate)(struct file *); + int (*swap_rw)(struct kiocb *, struct iov_iter *); +}; + +enum writeback_sync_modes { + WB_SYNC_NONE = 0, + WB_SYNC_ALL = 1, +}; + +struct swap_iocb; + +struct writeback_control { + long int nr_to_write; + long int pages_skipped; + loff_t range_start; + loff_t range_end; + enum writeback_sync_modes sync_mode; + unsigned int for_kupdate: 1; + unsigned int for_background: 1; + unsigned int tagged_writepages: 1; + unsigned int for_reclaim: 1; + unsigned int range_cyclic: 1; + unsigned int for_sync: 1; + unsigned int unpinned_fscache_wb: 1; + unsigned int no_cgroup_owner: 1; + unsigned int punt_to_cgroup: 1; + struct swap_iocb **swap_plug; + struct bdi_writeback *wb; + struct inode *inode; + int wb_id; + int wb_lcand_id; + int wb_tcand_id; + size_t wb_bytes; + size_t wb_lcand_bytes; + size_t wb_tcand_bytes; + long: 32; +}; + +struct readahead_control { + struct file *file; + struct address_space *mapping; + struct file_ra_state *ra; + long unsigned int _index; + unsigned int _nr_pages; + unsigned int _batch_count; + bool _workingset; + long unsigned int _pflags; +}; + +struct iovec; + +struct kvec; + +struct bio_vec; + +struct iov_iter { + u8 iter_type; + bool nofault; + bool data_source; + bool user_backed; + union { + size_t iov_offset; + int last_offset; + }; + size_t count; + union { + const struct iovec *iov; + const struct kvec *kvec; + const struct bio_vec *bvec; + struct xarray *xarray; + struct pipe_inode_info *pipe; + void *ubuf; + }; + union { + long unsigned int nr_segs; + struct { + unsigned int head; + unsigned int start_head; + }; + loff_t xarray_start; + }; +}; + +struct swap_cluster_info { + spinlock_t lock; + unsigned int data: 24; + unsigned int flags: 8; +}; + +struct swap_cluster_list { + struct swap_cluster_info head; + struct swap_cluster_info tail; +}; + +struct percpu_cluster; + +struct swap_info_struct { + struct percpu_ref users; + long unsigned int flags; + short int prio; + struct plist_node list; + signed char type; + unsigned int max; + unsigned char *swap_map; + struct swap_cluster_info *cluster_info; + struct swap_cluster_list free_clusters; + unsigned int lowest_bit; + unsigned int highest_bit; + unsigned int pages; + unsigned int inuse_pages; + unsigned int cluster_next; + unsigned int cluster_nr; + unsigned int *cluster_next_cpu; + struct percpu_cluster *percpu_cluster; + struct rb_root swap_extent_root; + struct block_device *bdev; + struct file *swap_file; + unsigned int old_block_size; + struct completion comp; + long unsigned int *frontswap_map; + atomic_t frontswap_pages; + spinlock_t lock; + spinlock_t cont_lock; + struct work_struct discard_work; + struct swap_cluster_list discard_clusters; + struct plist_node avail_lists[0]; +}; + +struct cdev { + struct kobject kobj; + struct module *owner; + const struct file_operations *ops; + struct list_head list; + dev_t dev; + unsigned int count; +}; + +struct fiemap_extent_info; + +struct fileattr; + +struct inode_operations { + struct dentry * (*lookup)(struct inode *, struct dentry *, unsigned int); + const char * (*get_link)(struct dentry *, struct inode *, struct delayed_call *); + int (*permission)(struct user_namespace *, struct inode *, int); + struct posix_acl * (*get_inode_acl)(struct inode *, int, bool); + int (*readlink)(struct dentry *, char *, int); + int (*create)(struct user_namespace *, struct inode *, struct dentry *, umode_t, bool); + int (*link)(struct dentry *, struct inode *, struct dentry *); + int (*unlink)(struct inode *, struct dentry *); + int (*symlink)(struct user_namespace *, struct inode *, struct dentry *, const char *); + int (*mkdir)(struct user_namespace *, struct inode *, struct dentry *, umode_t); + int (*rmdir)(struct inode *, struct dentry *); + int (*mknod)(struct user_namespace *, struct inode *, struct dentry *, umode_t, dev_t); + int (*rename)(struct user_namespace *, struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); + int (*setattr)(struct user_namespace *, struct dentry *, struct iattr *); + int (*getattr)(struct user_namespace *, const struct path *, struct kstat *, u32, unsigned int); + ssize_t (*listxattr)(struct dentry *, char *, size_t); + int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64, u64); + int (*update_time)(struct inode *, struct timespec64 *, int); + int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned int, umode_t); + int (*tmpfile)(struct user_namespace *, struct inode *, struct file *, umode_t); + struct posix_acl * (*get_acl)(struct user_namespace *, struct dentry *, int); + int (*set_acl)(struct user_namespace *, struct dentry *, struct posix_acl *, int); + int (*fileattr_set)(struct user_namespace *, struct dentry *, struct fileattr *); + int (*fileattr_get)(struct dentry *, struct fileattr *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct file_lock_context { + spinlock_t flc_lock; + struct list_head flc_flock; + struct list_head flc_posix; + struct list_head flc_lease; +}; + +struct file_lock_operations { + void (*fl_copy_lock)(struct file_lock *, struct file_lock *); + void (*fl_release_private)(struct file_lock *); +}; + +struct nlm_lockowner; + +struct nfs_lock_info { + u32 state; + struct nlm_lockowner *owner; + struct list_head list; +}; + +struct nfs4_lock_state; + +struct nfs4_lock_info { + struct nfs4_lock_state *owner; +}; + +struct lock_manager_operations; + +struct file_lock { + struct file_lock *fl_blocker; + struct list_head fl_list; + struct hlist_node fl_link; + struct list_head fl_blocked_requests; + struct list_head fl_blocked_member; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + unsigned int fl_pid; + int fl_link_cpu; + wait_queue_head_t fl_wait; + struct file *fl_file; + loff_t fl_start; + loff_t fl_end; + struct fasync_struct *fl_fasync; + long unsigned int fl_break_time; + long unsigned int fl_downgrade_time; + const struct file_lock_operations *fl_ops; + const struct lock_manager_operations *fl_lmops; + union { + struct nfs_lock_info nfs_fl; + struct nfs4_lock_info nfs4_fl; + struct { + struct list_head link; + int state; + unsigned int debug_id; + } afs; + struct { + struct inode *inode; + } ceph; + } fl_u; + long: 32; +}; + +struct lock_manager_operations { + void *lm_mod_owner; + fl_owner_t (*lm_get_owner)(fl_owner_t); + void (*lm_put_owner)(fl_owner_t); + void (*lm_notify)(struct file_lock *); + int (*lm_grant)(struct file_lock *, int); + bool (*lm_break)(struct file_lock *); + int (*lm_change)(struct file_lock *, int, struct list_head *); + void (*lm_setup)(struct file_lock *, void **); + bool (*lm_breaker_owns_lease)(struct file_lock *); + bool (*lm_lock_expirable)(struct file_lock *); + void (*lm_expire_lock)(); +}; + +struct fasync_struct { + rwlock_t fa_lock; + int magic; + int fa_fd; + struct fasync_struct *fa_next; + struct file *fa_file; + struct callback_head fa_rcu; +}; + +struct kstatfs; + +struct super_operations { + struct inode * (*alloc_inode)(struct super_block *); + void (*destroy_inode)(struct inode *); + void (*free_inode)(struct inode *); + void (*dirty_inode)(struct inode *, int); + int (*write_inode)(struct inode *, struct writeback_control *); + int (*drop_inode)(struct inode *); + void (*evict_inode)(struct inode *); + void (*put_super)(struct super_block *); + int (*sync_fs)(struct super_block *, int); + int (*freeze_super)(struct super_block *); + int (*freeze_fs)(struct super_block *); + int (*thaw_super)(struct super_block *); + int (*unfreeze_fs)(struct super_block *); + int (*statfs)(struct dentry *, struct kstatfs *); + int (*remount_fs)(struct super_block *, int *, char *); + void (*umount_begin)(struct super_block *); + int (*show_options)(struct seq_file *, struct dentry *); + int (*show_devname)(struct seq_file *, struct dentry *); + int (*show_path)(struct seq_file *, struct dentry *); + int (*show_stats)(struct seq_file *, struct dentry *); + ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); + ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); + struct dquot ** (*get_dquots)(struct inode *); + long int (*nr_cached_objects)(struct super_block *, struct shrink_control *); + long int (*free_cached_objects)(struct super_block *, struct shrink_control *); +}; + +struct iomap; + +struct fid; + +struct export_operations { + int (*encode_fh)(struct inode *, __u32 *, int *, struct inode *); + struct dentry * (*fh_to_dentry)(struct super_block *, struct fid *, int, int); + struct dentry * (*fh_to_parent)(struct super_block *, struct fid *, int, int); + int (*get_name)(struct dentry *, char *, struct dentry *); + struct dentry * (*get_parent)(struct dentry *); + int (*commit_metadata)(struct inode *); + int (*get_uuid)(struct super_block *, u8 *, u32 *, u64 *); + int (*map_blocks)(struct inode *, loff_t, u64, struct iomap *, bool, u32 *); + int (*commit_blocks)(struct inode *, struct iomap *, int, struct iattr *); + u64 (*fetch_iversion)(struct inode *); + long unsigned int flags; +}; + +struct xattr_handler { + const char *name; + const char *prefix; + int flags; + bool (*list)(struct dentry *); + int (*get)(const struct xattr_handler *, struct dentry *, struct inode *, const char *, void *, size_t); + int (*set)(const struct xattr_handler *, struct user_namespace *, struct dentry *, struct inode *, const char *, const void *, size_t, int); +}; + +union fscrypt_policy; + +struct fscrypt_operations { + unsigned int flags; + const char *key_prefix; + int (*get_context)(struct inode *, void *, size_t); + int (*set_context)(struct inode *, const void *, size_t, void *); + const union fscrypt_policy * (*get_dummy_policy)(struct super_block *); + bool (*empty_dir)(struct inode *); + bool (*has_stable_inodes)(struct super_block *); + void (*get_ino_and_lblk_bits)(struct super_block *, int *, int *); + struct block_device ** (*get_devices)(struct super_block *, unsigned int *); +}; + +struct fsverity_operations { + int (*begin_enable_verity)(struct file *); + int (*end_enable_verity)(struct file *, const void *, size_t, u64); + int (*get_verity_descriptor)(struct inode *, void *, size_t); + struct page * (*read_merkle_tree_page)(struct inode *, long unsigned int, long unsigned int); + int (*write_merkle_tree_block)(struct inode *, const void *, u64, int); +}; + +enum dl_dev_state { + DL_DEV_NO_DRIVER = 0, + DL_DEV_PROBING = 1, + DL_DEV_DRIVER_BOUND = 2, + DL_DEV_UNBINDING = 3, +}; + +struct dev_links_info { + struct list_head suppliers; + struct list_head consumers; + struct list_head defer_sync; + enum dl_dev_state status; +}; + +struct pm_message { + int event; +}; + +typedef struct pm_message pm_message_t; + +enum rpm_request { + RPM_REQ_NONE = 0, + RPM_REQ_IDLE = 1, + RPM_REQ_SUSPEND = 2, + RPM_REQ_AUTOSUSPEND = 3, + RPM_REQ_RESUME = 4, +}; + +struct wakeup_source; + +struct wake_irq; + +struct pm_subsys_data; + +struct dev_pm_qos; + +struct dev_pm_info { + pm_message_t power_state; + unsigned int can_wakeup: 1; + unsigned int async_suspend: 1; + bool in_dpm_list: 1; + bool is_prepared: 1; + bool is_suspended: 1; + bool is_noirq_suspended: 1; + bool is_late_suspended: 1; + bool no_pm: 1; + bool early_init: 1; + bool direct_complete: 1; + u32 driver_flags; + spinlock_t lock; + struct list_head entry; + struct completion completion; + struct wakeup_source *wakeup; + bool wakeup_path: 1; + bool syscore: 1; + bool no_pm_callbacks: 1; + unsigned int must_resume: 1; + unsigned int may_skip_resume: 1; + struct hrtimer suspend_timer; + u64 timer_expires; + struct work_struct work; + wait_queue_head_t wait_queue; + struct wake_irq *wakeirq; + atomic_t usage_count; + atomic_t child_count; + unsigned int disable_depth: 3; + unsigned int idle_notification: 1; + unsigned int request_pending: 1; + unsigned int deferred_resume: 1; + unsigned int needs_force_resume: 1; + unsigned int runtime_auto: 1; + bool ignore_children: 1; + unsigned int no_callbacks: 1; + unsigned int irq_safe: 1; + unsigned int use_autosuspend: 1; + unsigned int timer_autosuspends: 1; + unsigned int memalloc_noio: 1; + unsigned int links_count; + enum rpm_request request; + enum rpm_status runtime_status; + enum rpm_status last_status; + int runtime_error; + int autosuspend_delay; + long: 32; + u64 last_busy; + u64 active_time; + u64 suspended_time; + u64 accounting_timestamp; + struct pm_subsys_data *subsys_data; + void (*set_latency_tolerance)(struct device *, s32); + struct dev_pm_qos *qos; + long: 32; +}; + +struct irq_domain; + +struct msi_device_data; + +struct dev_msi_info { + struct irq_domain *domain; + struct msi_device_data *data; +}; + +struct dma_iommu_mapping; + +struct dev_archdata { + struct dma_iommu_mapping *mapping; + unsigned int dma_ops_setup: 1; +}; + +enum device_removable { + DEVICE_REMOVABLE_NOT_SUPPORTED = 0, + DEVICE_REMOVABLE_UNKNOWN = 1, + DEVICE_FIXED = 2, + DEVICE_REMOVABLE = 3, +}; + +struct device_private; + +struct device_type; + +struct bus_type; + +struct device_driver; + +struct dev_pm_domain; + +struct em_perf_domain; + +struct dev_pin_info; + +struct dma_map_ops; + +struct bus_dma_region; + +struct device_dma_parameters; + +struct dma_coherent_mem; + +struct cma; + +struct io_tlb_mem; + +struct device_node; + +struct fwnode_handle; + +struct class; + +struct iommu_group; + +struct dev_iommu; + +struct device_physical_location; + +struct device { + struct kobject kobj; + struct device *parent; + struct device_private *p; + const char *init_name; + const struct device_type *type; + struct bus_type *bus; + struct device_driver *driver; + void *platform_data; + void *driver_data; + struct mutex mutex; + struct dev_links_info links; + long: 32; + struct dev_pm_info power; + struct dev_pm_domain *pm_domain; + struct em_perf_domain *em_pd; + struct dev_pin_info *pins; + struct dev_msi_info msi; + const struct dma_map_ops *dma_ops; + u64 *dma_mask; + long: 32; + u64 coherent_dma_mask; + u64 bus_dma_limit; + const struct bus_dma_region *dma_range_map; + struct device_dma_parameters *dma_parms; + struct list_head dma_pools; + struct dma_coherent_mem *dma_mem; + struct cma *cma_area; + struct io_tlb_mem *dma_io_tlb_mem; + struct dev_archdata archdata; + struct device_node *of_node; + struct fwnode_handle *fwnode; + dev_t devt; + u32 id; + spinlock_t devres_lock; + struct list_head devres_head; + struct class *class; + const struct attribute_group **groups; + void (*release)(struct device *); + struct iommu_group *iommu_group; + struct dev_iommu *iommu; + struct device_physical_location *physical_location; + enum device_removable removable; + bool offline_disabled: 1; + bool offline: 1; + bool of_node_reused: 1; + bool state_synced: 1; + bool can_match: 1; + bool dma_coherent: 1; +}; + +struct disk_stats; + +struct partition_meta_info; + +struct block_device { + sector_t bd_start_sect; + sector_t bd_nr_sectors; + struct disk_stats *bd_stats; + long unsigned int bd_stamp; + bool bd_read_only; + dev_t bd_dev; + atomic_t bd_openers; + struct inode *bd_inode; + struct super_block *bd_super; + void *bd_claiming; + struct device bd_device; + void *bd_holder; + int bd_holders; + bool bd_write_holder; + struct kobject *bd_holder_dir; + u8 bd_partno; + spinlock_t bd_size_lock; + struct gendisk *bd_disk; + struct request_queue *bd_queue; + int bd_fsfreeze_count; + struct mutex bd_fsfreeze_mutex; + struct super_block *bd_fsfreeze_sb; + struct partition_meta_info *bd_meta_info; +}; + +typedef bool (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64, unsigned int); + +struct dir_context { + filldir_t actor; + long: 32; + loff_t pos; +}; + +struct io_comp_batch { + struct request *req_list; + bool need_ts; + void (*complete)(struct io_comp_batch *); +}; + +struct fc_log; + +struct p_log { + const char *prefix; + struct fc_log *log; +}; + +enum fs_context_purpose { + FS_CONTEXT_FOR_MOUNT = 0, + FS_CONTEXT_FOR_SUBMOUNT = 1, + FS_CONTEXT_FOR_RECONFIGURE = 2, +}; + +enum fs_context_phase { + FS_CONTEXT_CREATE_PARAMS = 0, + FS_CONTEXT_CREATING = 1, + FS_CONTEXT_AWAITING_MOUNT = 2, + FS_CONTEXT_AWAITING_RECONF = 3, + FS_CONTEXT_RECONF_PARAMS = 4, + FS_CONTEXT_RECONFIGURING = 5, + FS_CONTEXT_FAILED = 6, +}; + +struct fs_context_operations; + +struct fs_context { + const struct fs_context_operations *ops; + struct mutex uapi_mutex; + struct file_system_type *fs_type; + void *fs_private; + void *sget_key; + struct dentry *root; + struct user_namespace *user_ns; + struct net *net_ns; + const struct cred *cred; + struct p_log log; + const char *source; + void *security; + void *s_fs_info; + unsigned int sb_flags; + unsigned int sb_flags_mask; + unsigned int s_iflags; + unsigned int lsm_flags; + enum fs_context_purpose purpose: 8; + enum fs_context_phase phase: 8; + bool need_free: 1; + bool global: 1; + bool oldapi: 1; +}; + +struct fs_parameter; + +struct fs_parse_result; + +typedef int fs_param_type(struct p_log *, const struct fs_parameter_spec *, struct fs_parameter *, struct fs_parse_result *); + +struct fs_parameter_spec { + const char *name; + fs_param_type *type; + u8 opt; + short unsigned int flags; + const void *data; +}; + +struct audit_names; + +struct filename { + const char *name; + const char *uptr; + int refcnt; + struct audit_names *aname; + const char iname[0]; +}; + +typedef __u32 blk_opf_t; + +typedef u8 blk_status_t; + +struct bvec_iter { + sector_t bi_sector; + unsigned int bi_size; + unsigned int bi_idx; + unsigned int bi_bvec_done; +}; + +typedef unsigned int blk_qc_t; + +typedef void bio_end_io_t(struct bio *); + +struct bio_issue { + u64 value; +}; + +struct bio_vec { + struct page *bv_page; + unsigned int bv_len; + unsigned int bv_offset; +}; + +struct bio_integrity_payload; + +struct bio_set; + +struct bio { + struct bio *bi_next; + struct block_device *bi_bdev; + blk_opf_t bi_opf; + short unsigned int bi_flags; + short unsigned int bi_ioprio; + blk_status_t bi_status; + atomic_t __bi_remaining; + struct bvec_iter bi_iter; + blk_qc_t bi_cookie; + bio_end_io_t *bi_end_io; + void *bi_private; + struct blkcg_gq *bi_blkg; + long: 32; + struct bio_issue bi_issue; + u64 bi_iocost_cost; + union { + struct bio_integrity_payload *bi_integrity; + }; + short unsigned int bi_vcnt; + short unsigned int bi_max_vecs; + atomic_t __bi_cnt; + struct bio_vec *bi_io_vec; + struct bio_set *bi_pool; + struct bio_vec bi_inline_vecs[0]; + long: 32; +}; + +struct linux_binprm { + struct vm_area_struct *vma; + long unsigned int vma_pages; + struct mm_struct *mm; + long unsigned int p; + long unsigned int argmin; + unsigned int have_execfd: 1; + unsigned int execfd_creds: 1; + unsigned int secureexec: 1; + unsigned int point_of_no_return: 1; + struct file *executable; + struct file *interpreter; + struct file *file; + struct cred *cred; + int unsafe; + unsigned int per_clear; + int argc; + int envc; + const char *filename; + const char *interp; + const char *fdpath; + unsigned int interp_flags; + int execfd; + long unsigned int loader; + long unsigned int exec; + struct rlimit rlim_stack; + char buf[256]; +}; + +struct em_perf_state { + long unsigned int frequency; + long unsigned int power; + long unsigned int cost; + long unsigned int flags; +}; + +struct em_perf_domain { + struct em_perf_state *table; + int nr_perf_states; + long unsigned int flags; + long unsigned int cpus[0]; +}; + +struct dev_pm_ops { + int (*prepare)(struct device *); + void (*complete)(struct device *); + int (*suspend)(struct device *); + int (*resume)(struct device *); + int (*freeze)(struct device *); + int (*thaw)(struct device *); + int (*poweroff)(struct device *); + int (*restore)(struct device *); + int (*suspend_late)(struct device *); + int (*resume_early)(struct device *); + int (*freeze_late)(struct device *); + int (*thaw_early)(struct device *); + int (*poweroff_late)(struct device *); + int (*restore_early)(struct device *); + int (*suspend_noirq)(struct device *); + int (*resume_noirq)(struct device *); + int (*freeze_noirq)(struct device *); + int (*thaw_noirq)(struct device *); + int (*poweroff_noirq)(struct device *); + int (*restore_noirq)(struct device *); + int (*runtime_suspend)(struct device *); + int (*runtime_resume)(struct device *); + int (*runtime_idle)(struct device *); +}; + +struct pm_domain_data; + +struct pm_subsys_data { + spinlock_t lock; + unsigned int refcount; + unsigned int clock_op_might_sleep; + struct mutex clock_mutex; + struct list_head clock_list; + struct pm_domain_data *domain_data; +}; + +struct wakeup_source { + const char *name; + int id; + struct list_head entry; + spinlock_t lock; + struct wake_irq *wakeirq; + struct timer_list timer; + long unsigned int timer_expires; + ktime_t total_time; + ktime_t max_time; + ktime_t last_time; + ktime_t start_prevent_time; + ktime_t prevent_sleep_time; + long unsigned int event_count; + long unsigned int active_count; + long unsigned int relax_count; + long unsigned int expire_count; + long unsigned int wakeup_count; + struct device *dev; + bool active: 1; + bool autosleep_enabled: 1; + long: 32; +}; + +struct dev_pm_domain { + struct dev_pm_ops ops; + int (*start)(struct device *); + void (*detach)(struct device *, bool); + int (*activate)(struct device *); + void (*sync)(struct device *); + void (*dismiss)(struct device *); +}; + +struct iommu_ops; + +struct subsys_private; + +struct bus_type { + const char *name; + const char *dev_name; + struct device *dev_root; + const struct attribute_group **bus_groups; + const struct attribute_group **dev_groups; + const struct attribute_group **drv_groups; + int (*match)(struct device *, struct device_driver *); + int (*uevent)(struct device *, struct kobj_uevent_env *); + int (*probe)(struct device *); + void (*sync_state)(struct device *); + void (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*online)(struct device *); + int (*offline)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + int (*num_vf)(struct device *); + int (*dma_configure)(struct device *); + void (*dma_cleanup)(struct device *); + const struct dev_pm_ops *pm; + const struct iommu_ops *iommu_ops; + struct subsys_private *p; + struct lock_class_key lock_key; + bool need_parent_lock; +}; + +enum probe_type { + PROBE_DEFAULT_STRATEGY = 0, + PROBE_PREFER_ASYNCHRONOUS = 1, + PROBE_FORCE_SYNCHRONOUS = 2, +}; + +struct of_device_id; + +struct acpi_device_id; + +struct driver_private; + +struct device_driver { + const char *name; + struct bus_type *bus; + struct module *owner; + const char *mod_name; + bool suppress_bind_attrs; + enum probe_type probe_type; + const struct of_device_id *of_match_table; + const struct acpi_device_id *acpi_match_table; + int (*probe)(struct device *); + void (*sync_state)(struct device *); + int (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + const struct dev_pm_ops *pm; + void (*coredump)(struct device *); + struct driver_private *p; +}; + +enum iommu_cap { + IOMMU_CAP_CACHE_COHERENCY = 0, + IOMMU_CAP_INTR_REMAP = 1, + IOMMU_CAP_NOEXEC = 2, + IOMMU_CAP_PRE_BOOT_PROTECTION = 3, + IOMMU_CAP_ENFORCE_CACHE_COHERENCY = 4, +}; + +enum iommu_dev_features { + IOMMU_DEV_FEAT_SVA = 0, + IOMMU_DEV_FEAT_IOPF = 1, +}; + +typedef unsigned int ioasid_t; + +struct iommu_domain; + +struct iommu_device; + +struct of_phandle_args; + +struct iommu_fault_event; + +struct iommu_page_response; + +struct iommu_domain_ops; + +struct iommu_ops { + bool (*capable)(struct device *, enum iommu_cap); + struct iommu_domain * (*domain_alloc)(unsigned int); + struct iommu_device * (*probe_device)(struct device *); + void (*release_device)(struct device *); + void (*probe_finalize)(struct device *); + struct iommu_group * (*device_group)(struct device *); + void (*get_resv_regions)(struct device *, struct list_head *); + int (*of_xlate)(struct device *, struct of_phandle_args *); + bool (*is_attach_deferred)(struct device *); + int (*dev_enable_feat)(struct device *, enum iommu_dev_features); + int (*dev_disable_feat)(struct device *, enum iommu_dev_features); + int (*page_response)(struct device *, struct iommu_fault_event *, struct iommu_page_response *); + int (*def_domain_type)(struct device *); + void (*remove_dev_pasid)(struct device *, ioasid_t); + const struct iommu_domain_ops *default_domain_ops; + long unsigned int pgsize_bitmap; + struct module *owner; +}; + +struct device_type { + const char *name; + const struct attribute_group **groups; + int (*uevent)(struct device *, struct kobj_uevent_env *); + char * (*devnode)(struct device *, umode_t *, kuid_t *, kgid_t *); + void (*release)(struct device *); + const struct dev_pm_ops *pm; +}; + +struct class { + const char *name; + struct module *owner; + const struct attribute_group **class_groups; + const struct attribute_group **dev_groups; + struct kobject *dev_kobj; + int (*dev_uevent)(const struct device *, struct kobj_uevent_env *); + char * (*devnode)(const struct device *, umode_t *); + void (*class_release)(struct class *); + void (*dev_release)(struct device *); + int (*shutdown_pre)(struct device *); + const struct kobj_ns_type_operations *ns_type; + const void * (*namespace)(const struct device *); + void (*get_ownership)(const struct device *, kuid_t *, kgid_t *); + const struct dev_pm_ops *pm; + struct subsys_private *p; +}; + +struct of_device_id { + char name[32]; + char type[32]; + char compatible[128]; + const void *data; +}; + +typedef long unsigned int kernel_ulong_t; + +struct acpi_device_id { + __u8 id[16]; + kernel_ulong_t driver_data; + __u32 cls; + __u32 cls_msk; +}; + +struct device_dma_parameters { + unsigned int max_segment_size; + unsigned int min_align_mask; + long unsigned int segment_boundary_mask; +}; + +enum irq_domain_bus_token { + DOMAIN_BUS_ANY = 0, + DOMAIN_BUS_WIRED = 1, + DOMAIN_BUS_GENERIC_MSI = 2, + DOMAIN_BUS_PCI_MSI = 3, + DOMAIN_BUS_PLATFORM_MSI = 4, + DOMAIN_BUS_NEXUS = 5, + DOMAIN_BUS_IPI = 6, + DOMAIN_BUS_FSL_MC_MSI = 7, + DOMAIN_BUS_TI_SCI_INTA_MSI = 8, + DOMAIN_BUS_WAKEUP = 9, + DOMAIN_BUS_VMD_MSI = 10, + DOMAIN_BUS_PCI_DEVICE_MSI = 11, + DOMAIN_BUS_PCI_DEVICE_MSIX = 12, + DOMAIN_BUS_DMAR = 13, + DOMAIN_BUS_AMDVI = 14, + DOMAIN_BUS_PCI_DEVICE_IMS = 15, +}; + +struct irq_domain_ops; + +struct irq_domain_chip_generic; + +struct msi_parent_ops; + +struct irq_data; + +struct irq_domain { + struct list_head link; + const char *name; + const struct irq_domain_ops *ops; + void *host_data; + unsigned int flags; + unsigned int mapcount; + struct fwnode_handle *fwnode; + enum irq_domain_bus_token bus_token; + struct irq_domain_chip_generic *gc; + struct device *dev; + struct device *pm_dev; + struct irq_domain *parent; + const struct msi_parent_ops *msi_parent_ops; + irq_hw_number_t hwirq_max; + unsigned int revmap_size; + struct xarray revmap_tree; + struct mutex revmap_mutex; + struct irq_data *revmap[0]; +}; + +enum device_physical_location_panel { + DEVICE_PANEL_TOP = 0, + DEVICE_PANEL_BOTTOM = 1, + DEVICE_PANEL_LEFT = 2, + DEVICE_PANEL_RIGHT = 3, + DEVICE_PANEL_FRONT = 4, + DEVICE_PANEL_BACK = 5, + DEVICE_PANEL_UNKNOWN = 6, +}; + +enum device_physical_location_vertical_position { + DEVICE_VERT_POS_UPPER = 0, + DEVICE_VERT_POS_CENTER = 1, + DEVICE_VERT_POS_LOWER = 2, +}; + +enum device_physical_location_horizontal_position { + DEVICE_HORI_POS_LEFT = 0, + DEVICE_HORI_POS_CENTER = 1, + DEVICE_HORI_POS_RIGHT = 2, +}; + +struct device_physical_location { + enum device_physical_location_panel panel; + enum device_physical_location_vertical_position vertical_position; + enum device_physical_location_horizontal_position horizontal_position; + bool dock; + bool lid; +}; + +typedef u64 dma_addr_t; + +struct sg_table; + +struct scatterlist; + +struct dma_map_ops { + unsigned int flags; + void * (*alloc)(struct device *, size_t, dma_addr_t *, gfp_t, long unsigned int); + void (*free)(struct device *, size_t, void *, dma_addr_t, long unsigned int); + struct page * (*alloc_pages)(struct device *, size_t, dma_addr_t *, enum dma_data_direction, gfp_t); + void (*free_pages)(struct device *, size_t, struct page *, dma_addr_t, enum dma_data_direction); + struct sg_table * (*alloc_noncontiguous)(struct device *, size_t, enum dma_data_direction, gfp_t, long unsigned int); + void (*free_noncontiguous)(struct device *, size_t, struct sg_table *, enum dma_data_direction); + int (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t, size_t, long unsigned int); + int (*get_sgtable)(struct device *, struct sg_table *, void *, dma_addr_t, size_t, long unsigned int); + dma_addr_t (*map_page)(struct device *, struct page *, long unsigned int, size_t, enum dma_data_direction, long unsigned int); + void (*unmap_page)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); + int (*map_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); + void (*unmap_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); + dma_addr_t (*map_resource)(struct device *, phys_addr_t, size_t, enum dma_data_direction, long unsigned int); + void (*unmap_resource)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); + void (*sync_single_for_cpu)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_single_for_device)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_sg_for_cpu)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*sync_sg_for_device)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*cache_sync)(struct device *, void *, size_t, enum dma_data_direction); + int (*dma_supported)(struct device *, u64); + u64 (*get_required_mask)(struct device *); + size_t (*max_mapping_size)(struct device *); + size_t (*opt_mapping_size)(); + long unsigned int (*get_merge_boundary)(struct device *); +}; + +struct bus_dma_region { + phys_addr_t cpu_start; + dma_addr_t dma_start; + u64 size; + u64 offset; +}; + +typedef u32 phandle; + +struct fwnode_operations; + +struct fwnode_handle { + struct fwnode_handle *secondary; + const struct fwnode_operations *ops; + struct device *dev; + struct list_head suppliers; + struct list_head consumers; + u8 flags; +}; + +struct property; + +struct device_node { + const char *name; + phandle phandle; + const char *full_name; + struct fwnode_handle fwnode; + struct property *properties; + struct property *deadprops; + struct device_node *parent; + struct device_node *child; + struct device_node *sibling; + struct kobject kobj; + long unsigned int _flags; + void *data; +}; + +enum cpuhp_state { + CPUHP_INVALID = 4294967295, + CPUHP_OFFLINE = 0, + CPUHP_CREATE_THREADS = 1, + CPUHP_PERF_PREPARE = 2, + CPUHP_PERF_X86_PREPARE = 3, + CPUHP_PERF_X86_AMD_UNCORE_PREP = 4, + CPUHP_PERF_POWER = 5, + CPUHP_PERF_SUPERH = 6, + CPUHP_X86_HPET_DEAD = 7, + CPUHP_X86_APB_DEAD = 8, + CPUHP_X86_MCE_DEAD = 9, + CPUHP_VIRT_NET_DEAD = 10, + CPUHP_IBMVNIC_DEAD = 11, + CPUHP_SLUB_DEAD = 12, + CPUHP_DEBUG_OBJ_DEAD = 13, + CPUHP_MM_WRITEBACK_DEAD = 14, + CPUHP_MM_DEMOTION_DEAD = 15, + CPUHP_MM_VMSTAT_DEAD = 16, + CPUHP_SOFTIRQ_DEAD = 17, + CPUHP_NET_MVNETA_DEAD = 18, + CPUHP_CPUIDLE_DEAD = 19, + CPUHP_ARM64_FPSIMD_DEAD = 20, + CPUHP_ARM_OMAP_WAKE_DEAD = 21, + CPUHP_IRQ_POLL_DEAD = 22, + CPUHP_BLOCK_SOFTIRQ_DEAD = 23, + CPUHP_BIO_DEAD = 24, + CPUHP_ACPI_CPUDRV_DEAD = 25, + CPUHP_S390_PFAULT_DEAD = 26, + CPUHP_BLK_MQ_DEAD = 27, + CPUHP_FS_BUFF_DEAD = 28, + CPUHP_PRINTK_DEAD = 29, + CPUHP_MM_MEMCQ_DEAD = 30, + CPUHP_XFS_DEAD = 31, + CPUHP_PERCPU_CNT_DEAD = 32, + CPUHP_RADIX_DEAD = 33, + CPUHP_PAGE_ALLOC = 34, + CPUHP_NET_DEV_DEAD = 35, + CPUHP_PCI_XGENE_DEAD = 36, + CPUHP_IOMMU_IOVA_DEAD = 37, + CPUHP_LUSTRE_CFS_DEAD = 38, + CPUHP_AP_ARM_CACHE_B15_RAC_DEAD = 39, + CPUHP_PADATA_DEAD = 40, + CPUHP_AP_DTPM_CPU_DEAD = 41, + CPUHP_RANDOM_PREPARE = 42, + CPUHP_WORKQUEUE_PREP = 43, + CPUHP_POWER_NUMA_PREPARE = 44, + CPUHP_HRTIMERS_PREPARE = 45, + CPUHP_PROFILE_PREPARE = 46, + CPUHP_X2APIC_PREPARE = 47, + CPUHP_SMPCFD_PREPARE = 48, + CPUHP_RELAY_PREPARE = 49, + CPUHP_SLAB_PREPARE = 50, + CPUHP_MD_RAID5_PREPARE = 51, + CPUHP_RCUTREE_PREP = 52, + CPUHP_CPUIDLE_COUPLED_PREPARE = 53, + CPUHP_POWERPC_PMAC_PREPARE = 54, + CPUHP_POWERPC_MMU_CTX_PREPARE = 55, + CPUHP_XEN_PREPARE = 56, + CPUHP_XEN_EVTCHN_PREPARE = 57, + CPUHP_ARM_SHMOBILE_SCU_PREPARE = 58, + CPUHP_SH_SH3X_PREPARE = 59, + CPUHP_NET_FLOW_PREPARE = 60, + CPUHP_TOPOLOGY_PREPARE = 61, + CPUHP_NET_IUCV_PREPARE = 62, + CPUHP_ARM_BL_PREPARE = 63, + CPUHP_TRACE_RB_PREPARE = 64, + CPUHP_MM_ZS_PREPARE = 65, + CPUHP_MM_ZSWP_MEM_PREPARE = 66, + CPUHP_MM_ZSWP_POOL_PREPARE = 67, + CPUHP_KVM_PPC_BOOK3S_PREPARE = 68, + CPUHP_ZCOMP_PREPARE = 69, + CPUHP_TIMERS_PREPARE = 70, + CPUHP_MIPS_SOC_PREPARE = 71, + CPUHP_BP_PREPARE_DYN = 72, + CPUHP_BP_PREPARE_DYN_END = 92, + CPUHP_BRINGUP_CPU = 93, + CPUHP_AP_IDLE_DEAD = 94, + CPUHP_AP_OFFLINE = 95, + CPUHP_AP_CACHECTRL_STARTING = 96, + CPUHP_AP_SCHED_STARTING = 97, + CPUHP_AP_RCUTREE_DYING = 98, + CPUHP_AP_CPU_PM_STARTING = 99, + CPUHP_AP_IRQ_GIC_STARTING = 100, + CPUHP_AP_IRQ_HIP04_STARTING = 101, + CPUHP_AP_IRQ_APPLE_AIC_STARTING = 102, + CPUHP_AP_IRQ_ARMADA_XP_STARTING = 103, + CPUHP_AP_IRQ_BCM2836_STARTING = 104, + CPUHP_AP_IRQ_MIPS_GIC_STARTING = 105, + CPUHP_AP_IRQ_RISCV_STARTING = 106, + CPUHP_AP_IRQ_LOONGARCH_STARTING = 107, + CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING = 108, + CPUHP_AP_ARM_MVEBU_COHERENCY = 109, + CPUHP_AP_MICROCODE_LOADER = 110, + CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING = 111, + CPUHP_AP_PERF_X86_STARTING = 112, + CPUHP_AP_PERF_X86_AMD_IBS_STARTING = 113, + CPUHP_AP_PERF_X86_CQM_STARTING = 114, + CPUHP_AP_PERF_X86_CSTATE_STARTING = 115, + CPUHP_AP_PERF_XTENSA_STARTING = 116, + CPUHP_AP_MIPS_OP_LOONGSON3_STARTING = 117, + CPUHP_AP_ARM_SDEI_STARTING = 118, + CPUHP_AP_ARM_VFP_STARTING = 119, + CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING = 120, + CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING = 121, + CPUHP_AP_PERF_ARM_ACPI_STARTING = 122, + CPUHP_AP_PERF_ARM_STARTING = 123, + CPUHP_AP_PERF_RISCV_STARTING = 124, + CPUHP_AP_ARM_L2X0_STARTING = 125, + CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING = 126, + CPUHP_AP_ARM_ARCH_TIMER_STARTING = 127, + CPUHP_AP_ARM_GLOBAL_TIMER_STARTING = 128, + CPUHP_AP_JCORE_TIMER_STARTING = 129, + CPUHP_AP_ARM_TWD_STARTING = 130, + CPUHP_AP_QCOM_TIMER_STARTING = 131, + CPUHP_AP_TEGRA_TIMER_STARTING = 132, + CPUHP_AP_ARMADA_TIMER_STARTING = 133, + CPUHP_AP_MARCO_TIMER_STARTING = 134, + CPUHP_AP_MIPS_GIC_TIMER_STARTING = 135, + CPUHP_AP_ARC_TIMER_STARTING = 136, + CPUHP_AP_RISCV_TIMER_STARTING = 137, + CPUHP_AP_CLINT_TIMER_STARTING = 138, + CPUHP_AP_CSKY_TIMER_STARTING = 139, + CPUHP_AP_TI_GP_TIMER_STARTING = 140, + CPUHP_AP_HYPERV_TIMER_STARTING = 141, + CPUHP_AP_KVM_STARTING = 142, + CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING = 143, + CPUHP_AP_KVM_ARM_VGIC_STARTING = 144, + CPUHP_AP_KVM_ARM_TIMER_STARTING = 145, + CPUHP_AP_DUMMY_TIMER_STARTING = 146, + CPUHP_AP_ARM_XEN_STARTING = 147, + CPUHP_AP_ARM_CORESIGHT_STARTING = 148, + CPUHP_AP_ARM_CORESIGHT_CTI_STARTING = 149, + CPUHP_AP_ARM64_ISNDEP_STARTING = 150, + CPUHP_AP_SMPCFD_DYING = 151, + CPUHP_AP_X86_TBOOT_DYING = 152, + CPUHP_AP_ARM_CACHE_B15_RAC_DYING = 153, + CPUHP_AP_ONLINE = 154, + CPUHP_TEARDOWN_CPU = 155, + CPUHP_AP_ONLINE_IDLE = 156, + CPUHP_AP_SCHED_WAIT_EMPTY = 157, + CPUHP_AP_SMPBOOT_THREADS = 158, + CPUHP_AP_X86_VDSO_VMA_ONLINE = 159, + CPUHP_AP_IRQ_AFFINITY_ONLINE = 160, + CPUHP_AP_BLK_MQ_ONLINE = 161, + CPUHP_AP_ARM_MVEBU_SYNC_CLOCKS = 162, + CPUHP_AP_X86_INTEL_EPB_ONLINE = 163, + CPUHP_AP_PERF_ONLINE = 164, + CPUHP_AP_PERF_X86_ONLINE = 165, + CPUHP_AP_PERF_X86_UNCORE_ONLINE = 166, + CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE = 167, + CPUHP_AP_PERF_X86_AMD_POWER_ONLINE = 168, + CPUHP_AP_PERF_X86_RAPL_ONLINE = 169, + CPUHP_AP_PERF_X86_CQM_ONLINE = 170, + CPUHP_AP_PERF_X86_CSTATE_ONLINE = 171, + CPUHP_AP_PERF_X86_IDXD_ONLINE = 172, + CPUHP_AP_PERF_S390_CF_ONLINE = 173, + CPUHP_AP_PERF_S390_SF_ONLINE = 174, + CPUHP_AP_PERF_ARM_CCI_ONLINE = 175, + CPUHP_AP_PERF_ARM_CCN_ONLINE = 176, + CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE = 177, + CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE = 178, + CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE = 179, + CPUHP_AP_PERF_ARM_HISI_L3_ONLINE = 180, + CPUHP_AP_PERF_ARM_HISI_PA_ONLINE = 181, + CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE = 182, + CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE = 183, + CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE = 184, + CPUHP_AP_PERF_ARM_L2X0_ONLINE = 185, + CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE = 186, + CPUHP_AP_PERF_ARM_QCOM_L3_ONLINE = 187, + CPUHP_AP_PERF_ARM_APM_XGENE_ONLINE = 188, + CPUHP_AP_PERF_ARM_CAVIUM_TX2_UNCORE_ONLINE = 189, + CPUHP_AP_PERF_ARM_MARVELL_CN10K_DDR_ONLINE = 190, + CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE = 191, + CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE = 192, + CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE = 193, + CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE = 194, + CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE = 195, + CPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE = 196, + CPUHP_AP_PERF_CSKY_ONLINE = 197, + CPUHP_AP_WATCHDOG_ONLINE = 198, + CPUHP_AP_WORKQUEUE_ONLINE = 199, + CPUHP_AP_RANDOM_ONLINE = 200, + CPUHP_AP_RCUTREE_ONLINE = 201, + CPUHP_AP_BASE_CACHEINFO_ONLINE = 202, + CPUHP_AP_ONLINE_DYN = 203, + CPUHP_AP_ONLINE_DYN_END = 233, + CPUHP_AP_MM_DEMOTION_ONLINE = 234, + CPUHP_AP_X86_HPET_ONLINE = 235, + CPUHP_AP_X86_KVM_CLK_ONLINE = 236, + CPUHP_AP_ACTIVE = 237, + CPUHP_ONLINE = 238, +}; + +struct dev_pagemap_ops { + void (*page_free)(struct page *); + vm_fault_t (*migrate_to_ram)(struct vm_fault *); + int (*memory_failure)(struct dev_pagemap *, long unsigned int, long unsigned int, int); +}; + +struct seq_operations { + void * (*start)(struct seq_file *, loff_t *); + void (*stop)(struct seq_file *, void *); + void * (*next)(struct seq_file *, void *, loff_t *); + int (*show)(struct seq_file *, void *); +}; + +struct ring_buffer_event { + u32 type_len: 5; + u32 time_delta: 27; + u32 array[0]; +}; + +struct seq_buf { + char *buffer; + size_t size; + size_t len; + long: 32; + loff_t readpos; +}; + +struct trace_seq { + char buffer[4096]; + struct seq_buf seq; + int full; + long: 32; +}; + +struct irq_desc; + +typedef void (*irq_flow_handler_t)(struct irq_desc *); + +struct msi_desc; + +struct irq_common_data { + unsigned int state_use_accessors; + void *handler_data; + struct msi_desc *msi_desc; + cpumask_var_t affinity; + cpumask_var_t effective_affinity; + unsigned int ipi_offset; +}; + +struct irq_chip; + +struct irq_data { + u32 mask; + unsigned int irq; + long unsigned int hwirq; + struct irq_common_data *common; + struct irq_chip *chip; + struct irq_domain *domain; + struct irq_data *parent_data; + void *chip_data; +}; + +struct irqaction; + +struct irq_affinity_notify; + +struct proc_dir_entry; + +struct irq_desc { + struct irq_common_data irq_common_data; + struct irq_data irq_data; + unsigned int *kstat_irqs; + irq_flow_handler_t handle_irq; + struct irqaction *action; + unsigned int status_use_accessors; + unsigned int core_internal_state__do_not_mess_with_it; + unsigned int depth; + unsigned int wake_depth; + unsigned int tot_count; + unsigned int irq_count; + long unsigned int last_unhandled; + unsigned int irqs_unhandled; + atomic_t threads_handled; + int threads_handled_last; + raw_spinlock_t lock; + struct cpumask *percpu_enabled; + const struct cpumask *percpu_affinity; + const struct cpumask *affinity_hint; + struct irq_affinity_notify *affinity_notify; + long unsigned int threads_oneshot; + atomic_t threads_active; + wait_queue_head_t wait_for_threads; + unsigned int nr_actions; + unsigned int no_suspend_depth; + unsigned int cond_suspend_depth; + unsigned int force_resume_depth; + struct proc_dir_entry *dir; + struct callback_head rcu; + struct kobject kobj; + struct mutex request_mutex; + int parent_irq; + struct module *owner; + const char *name; + long: 32; + long: 32; + long: 32; +}; + +enum irqreturn { + IRQ_NONE = 0, + IRQ_HANDLED = 1, + IRQ_WAKE_THREAD = 2, +}; + +typedef enum irqreturn irqreturn_t; + +enum dev_dma_attr { + DEV_DMA_NOT_SUPPORTED = 0, + DEV_DMA_NON_COHERENT = 1, + DEV_DMA_COHERENT = 2, +}; + +struct fwnode_reference_args; + +struct fwnode_endpoint; + +struct fwnode_operations { + struct fwnode_handle * (*get)(struct fwnode_handle *); + void (*put)(struct fwnode_handle *); + bool (*device_is_available)(const struct fwnode_handle *); + const void * (*device_get_match_data)(const struct fwnode_handle *, const struct device *); + bool (*device_dma_supported)(const struct fwnode_handle *); + enum dev_dma_attr (*device_get_dma_attr)(const struct fwnode_handle *); + bool (*property_present)(const struct fwnode_handle *, const char *); + int (*property_read_int_array)(const struct fwnode_handle *, const char *, unsigned int, void *, size_t); + int (*property_read_string_array)(const struct fwnode_handle *, const char *, const char **, size_t); + const char * (*get_name)(const struct fwnode_handle *); + const char * (*get_name_prefix)(const struct fwnode_handle *); + struct fwnode_handle * (*get_parent)(const struct fwnode_handle *); + struct fwnode_handle * (*get_next_child_node)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*get_named_child_node)(const struct fwnode_handle *, const char *); + int (*get_reference_args)(const struct fwnode_handle *, const char *, const char *, unsigned int, unsigned int, struct fwnode_reference_args *); + struct fwnode_handle * (*graph_get_next_endpoint)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*graph_get_remote_endpoint)(const struct fwnode_handle *); + struct fwnode_handle * (*graph_get_port_parent)(struct fwnode_handle *); + int (*graph_parse_endpoint)(const struct fwnode_handle *, struct fwnode_endpoint *); + void * (*iomap)(struct fwnode_handle *, int); + int (*irq_get)(const struct fwnode_handle *, unsigned int); + int (*add_links)(struct fwnode_handle *); +}; + +struct fwnode_endpoint { + unsigned int port; + unsigned int id; + const struct fwnode_handle *local_fwnode; +}; + +struct fwnode_reference_args { + struct fwnode_handle *fwnode; + unsigned int nargs; + u64 args[8]; +}; + +enum irqchip_irq_state { + IRQCHIP_STATE_PENDING = 0, + IRQCHIP_STATE_ACTIVE = 1, + IRQCHIP_STATE_MASKED = 2, + IRQCHIP_STATE_LINE_LEVEL = 3, +}; + +struct msi_msg; + +struct irq_chip { + const char *name; + unsigned int (*irq_startup)(struct irq_data *); + void (*irq_shutdown)(struct irq_data *); + void (*irq_enable)(struct irq_data *); + void (*irq_disable)(struct irq_data *); + void (*irq_ack)(struct irq_data *); + void (*irq_mask)(struct irq_data *); + void (*irq_mask_ack)(struct irq_data *); + void (*irq_unmask)(struct irq_data *); + void (*irq_eoi)(struct irq_data *); + int (*irq_set_affinity)(struct irq_data *, const struct cpumask *, bool); + int (*irq_retrigger)(struct irq_data *); + int (*irq_set_type)(struct irq_data *, unsigned int); + int (*irq_set_wake)(struct irq_data *, unsigned int); + void (*irq_bus_lock)(struct irq_data *); + void (*irq_bus_sync_unlock)(struct irq_data *); + void (*irq_suspend)(struct irq_data *); + void (*irq_resume)(struct irq_data *); + void (*irq_pm_shutdown)(struct irq_data *); + void (*irq_calc_mask)(struct irq_data *); + void (*irq_print_chip)(struct irq_data *, struct seq_file *); + int (*irq_request_resources)(struct irq_data *); + void (*irq_release_resources)(struct irq_data *); + void (*irq_compose_msi_msg)(struct irq_data *, struct msi_msg *); + void (*irq_write_msi_msg)(struct irq_data *, struct msi_msg *); + int (*irq_get_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool *); + int (*irq_set_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool); + int (*irq_set_vcpu_affinity)(struct irq_data *, void *); + void (*ipi_send_single)(struct irq_data *, unsigned int); + void (*ipi_send_mask)(struct irq_data *, const struct cpumask *); + int (*irq_nmi_setup)(struct irq_data *); + void (*irq_nmi_teardown)(struct irq_data *); + long unsigned int flags; +}; + +typedef irqreturn_t (*irq_handler_t)(int, void *); + +struct irqaction { + irq_handler_t handler; + void *dev_id; + void *percpu_dev_id; + struct irqaction *next; + irq_handler_t thread_fn; + struct task_struct *thread; + struct irqaction *secondary; + unsigned int irq; + unsigned int flags; + long unsigned int thread_flags; + long unsigned int thread_mask; + const char *name; + struct proc_dir_entry *dir; + long: 32; + long: 32; + long: 32; +}; + +struct irq_affinity_notify { + unsigned int irq; + struct kref kref; + struct work_struct work; + void (*notify)(struct irq_affinity_notify *, const cpumask_t *); + void (*release)(struct kref *); +}; + +struct irq_chip_regs { + long unsigned int enable; + long unsigned int disable; + long unsigned int mask; + long unsigned int ack; + long unsigned int eoi; + long unsigned int type; + long unsigned int polarity; +}; + +struct irq_chip_type { + struct irq_chip chip; + struct irq_chip_regs regs; + irq_flow_handler_t handler; + u32 type; + u32 mask_cache_priv; + u32 *mask_cache; +}; + +struct irq_chip_generic { + raw_spinlock_t lock; + void *reg_base; + u32 (*reg_readl)(void *); + void (*reg_writel)(u32, void *); + void (*suspend)(struct irq_chip_generic *); + void (*resume)(struct irq_chip_generic *); + unsigned int irq_base; + unsigned int irq_cnt; + u32 mask_cache; + u32 type_cache; + u32 polarity_cache; + u32 wake_enabled; + u32 wake_active; + unsigned int num_ct; + void *private; + long unsigned int installed; + long unsigned int unused; + struct irq_domain *domain; + struct list_head list; + struct irq_chip_type chip_types[0]; +}; + +enum irq_gc_flags { + IRQ_GC_INIT_MASK_CACHE = 1, + IRQ_GC_INIT_NESTED_LOCK = 2, + IRQ_GC_MASK_CACHE_PER_TYPE = 4, + IRQ_GC_NO_MASK = 8, + IRQ_GC_BE_IO = 16, +}; + +struct irq_domain_chip_generic { + unsigned int irqs_per_chip; + unsigned int num_chips; + unsigned int irq_flags_to_clear; + unsigned int irq_flags_to_set; + enum irq_gc_flags gc_flags; + struct irq_chip_generic *gc[0]; +}; + +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_op: 5; + __u64 mem_lvl: 14; + __u64 mem_snoop: 5; + __u64 mem_lock: 2; + __u64 mem_dtlb: 7; + __u64 mem_lvl_num: 4; + __u64 mem_remote: 1; + __u64 mem_snoopx: 2; + __u64 mem_blk: 3; + __u64 mem_hops: 3; + __u64 mem_rsvd: 18; + }; +}; + +struct perf_branch_entry { + __u64 from; + __u64 to; + __u64 mispred: 1; + __u64 predicted: 1; + __u64 in_tx: 1; + __u64 abort: 1; + __u64 cycles: 16; + __u64 type: 4; + __u64 spec: 2; + __u64 new_type: 4; + __u64 priv: 3; + __u64 reserved: 31; +}; + +union perf_sample_weight { + __u64 full; + struct { + __u32 var1_dw; + __u16 var2_w; + __u16 var3_w; + }; +}; + +struct new_utsname { + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; + char domainname[65]; +}; + +struct uts_namespace { + struct new_utsname name; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; +}; + +struct ref_tracker_dir {}; + +struct prot_inuse; + +struct netns_core { + struct ctl_table_header *sysctl_hdr; + int sysctl_somaxconn; + u8 sysctl_txrehash; + struct prot_inuse *prot_inuse; +}; + +struct ipstats_mib; + +struct tcp_mib; + +struct linux_mib; + +struct udp_mib; + +struct linux_xfrm_mib; + +struct icmp_mib; + +struct icmpmsg_mib; + +struct icmpv6_mib; + +struct icmpv6msg_mib; + +struct netns_mib { + struct ipstats_mib *ip_statistics; + struct ipstats_mib *ipv6_statistics; + struct tcp_mib *tcp_statistics; + struct linux_mib *net_statistics; + struct udp_mib *udp_statistics; + struct udp_mib *udp_stats_in6; + struct linux_xfrm_mib *xfrm_statistics; + struct udp_mib *udplite_statistics; + struct udp_mib *udplite_stats_in6; + struct icmp_mib *icmp_statistics; + struct icmpmsg_mib *icmpmsg_statistics; + struct icmpv6_mib *icmpv6_statistics; + struct icmpv6msg_mib *icmpv6msg_statistics; + struct proc_dir_entry *proc_net_devsnmp6; +}; + +struct netns_packet { + struct mutex sklist_lock; + struct hlist_head sklist; +}; + +struct unix_table { + spinlock_t *locks; + struct hlist_head *buckets; +}; + +struct netns_unix { + struct unix_table table; + int sysctl_max_dgram_qlen; + struct ctl_table_header *ctl; +}; + +struct netns_nexthop { + struct rb_root rb_root; + struct hlist_head *devhash; + unsigned int seq; + u32 last_id_allocated; + struct blocking_notifier_head notifier_chain; +}; + +struct inet_hashinfo; + +struct inet_timewait_death_row { + refcount_t tw_refcount; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct inet_hashinfo *hashinfo; + int sysctl_max_tw_buckets; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct local_ports { + seqlock_t lock; + int range[2]; + bool warned; +}; + +struct ping_group_range { + seqlock_t lock; + kgid_t range[2]; +}; + +typedef struct { + u64 key[2]; +} siphash_key_t; + +struct udp_table; + +struct ipv4_devconf; + +struct ip_ra_chain; + +struct fib_rules_ops; + +struct fib_table; + +struct inet_peer_base; + +struct fqdir; + +struct tcp_congestion_ops; + +struct tcp_fastopen_context; + +struct fib_notifier_ops; + +struct netns_ipv4 { + struct inet_timewait_death_row tcp_death_row; + struct udp_table *udp_table; + struct ctl_table_header *forw_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *ipv4_hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *xfrm4_hdr; + struct ipv4_devconf *devconf_all; + struct ipv4_devconf *devconf_dflt; + struct ip_ra_chain *ra_chain; + struct mutex ra_mutex; + struct fib_rules_ops *rules_ops; + struct fib_table *fib_main; + struct fib_table *fib_default; + unsigned int fib_rules_require_fldissect; + bool fib_has_custom_rules; + bool fib_has_custom_local_routes; + bool fib_offload_disabled; + atomic_t fib_num_tclassid_users; + struct hlist_head *fib_table_hash; + struct sock *fibnl; + struct sock *mc_autojoin_sk; + struct inet_peer_base *peers; + struct fqdir *fqdir; + u8 sysctl_icmp_echo_ignore_all; + u8 sysctl_icmp_echo_enable_probe; + u8 sysctl_icmp_echo_ignore_broadcasts; + u8 sysctl_icmp_ignore_bogus_error_responses; + u8 sysctl_icmp_errors_use_inbound_ifaddr; + int sysctl_icmp_ratelimit; + int sysctl_icmp_ratemask; + u32 ip_rt_min_pmtu; + int ip_rt_mtu_expires; + int ip_rt_min_advmss; + struct local_ports ip_local_ports; + u8 sysctl_tcp_ecn; + u8 sysctl_tcp_ecn_fallback; + u8 sysctl_ip_default_ttl; + u8 sysctl_ip_no_pmtu_disc; + u8 sysctl_ip_fwd_use_pmtu; + u8 sysctl_ip_fwd_update_priority; + u8 sysctl_ip_nonlocal_bind; + u8 sysctl_ip_autobind_reuse; + u8 sysctl_ip_dynaddr; + u8 sysctl_ip_early_demux; + u8 sysctl_raw_l3mdev_accept; + u8 sysctl_tcp_early_demux; + u8 sysctl_udp_early_demux; + u8 sysctl_nexthop_compat_mode; + u8 sysctl_fwmark_reflect; + u8 sysctl_tcp_fwmark_accept; + u8 sysctl_tcp_l3mdev_accept; + u8 sysctl_tcp_mtu_probing; + int sysctl_tcp_mtu_probe_floor; + int sysctl_tcp_base_mss; + int sysctl_tcp_min_snd_mss; + int sysctl_tcp_probe_threshold; + u32 sysctl_tcp_probe_interval; + int sysctl_tcp_keepalive_time; + int sysctl_tcp_keepalive_intvl; + u8 sysctl_tcp_keepalive_probes; + u8 sysctl_tcp_syn_retries; + u8 sysctl_tcp_synack_retries; + u8 sysctl_tcp_syncookies; + u8 sysctl_tcp_migrate_req; + u8 sysctl_tcp_comp_sack_nr; + int sysctl_tcp_reordering; + u8 sysctl_tcp_retries1; + u8 sysctl_tcp_retries2; + u8 sysctl_tcp_orphan_retries; + u8 sysctl_tcp_tw_reuse; + int sysctl_tcp_fin_timeout; + unsigned int sysctl_tcp_notsent_lowat; + u8 sysctl_tcp_sack; + u8 sysctl_tcp_window_scaling; + u8 sysctl_tcp_timestamps; + u8 sysctl_tcp_early_retrans; + u8 sysctl_tcp_recovery; + u8 sysctl_tcp_thin_linear_timeouts; + u8 sysctl_tcp_slow_start_after_idle; + u8 sysctl_tcp_retrans_collapse; + u8 sysctl_tcp_stdurg; + u8 sysctl_tcp_rfc1337; + u8 sysctl_tcp_abort_on_overflow; + u8 sysctl_tcp_fack; + int sysctl_tcp_max_reordering; + int sysctl_tcp_adv_win_scale; + u8 sysctl_tcp_dsack; + u8 sysctl_tcp_app_win; + u8 sysctl_tcp_frto; + u8 sysctl_tcp_nometrics_save; + u8 sysctl_tcp_no_ssthresh_metrics_save; + u8 sysctl_tcp_moderate_rcvbuf; + u8 sysctl_tcp_tso_win_divisor; + u8 sysctl_tcp_workaround_signed_windows; + int sysctl_tcp_limit_output_bytes; + int sysctl_tcp_challenge_ack_limit; + int sysctl_tcp_min_rtt_wlen; + u8 sysctl_tcp_min_tso_segs; + u8 sysctl_tcp_tso_rtt_log; + u8 sysctl_tcp_autocorking; + u8 sysctl_tcp_reflect_tos; + int sysctl_tcp_invalid_ratelimit; + int sysctl_tcp_pacing_ss_ratio; + int sysctl_tcp_pacing_ca_ratio; + int sysctl_tcp_wmem[3]; + int sysctl_tcp_rmem[3]; + unsigned int sysctl_tcp_child_ehash_entries; + long unsigned int sysctl_tcp_comp_sack_delay_ns; + long unsigned int sysctl_tcp_comp_sack_slack_ns; + int sysctl_max_syn_backlog; + int sysctl_tcp_fastopen; + const struct tcp_congestion_ops *tcp_congestion_control; + struct tcp_fastopen_context *tcp_fastopen_ctx; + unsigned int sysctl_tcp_fastopen_blackhole_timeout; + atomic_t tfo_active_disable_times; + long unsigned int tfo_active_disable_stamp; + u32 tcp_challenge_timestamp; + u32 tcp_challenge_count; + u8 sysctl_tcp_plb_enabled; + u8 sysctl_tcp_plb_idle_rehash_rounds; + u8 sysctl_tcp_plb_rehash_rounds; + u8 sysctl_tcp_plb_suspend_rto_sec; + int sysctl_tcp_plb_cong_thresh; + int sysctl_udp_wmem_min; + int sysctl_udp_rmem_min; + u8 sysctl_fib_notify_on_flag_change; + u8 sysctl_udp_l3mdev_accept; + u8 sysctl_igmp_llm_reports; + int sysctl_igmp_max_memberships; + int sysctl_igmp_max_msf; + int sysctl_igmp_qrv; + struct ping_group_range ping_group_range; + atomic_t dev_addr_genid; + unsigned int sysctl_udp_child_hash_entries; + long unsigned int *sysctl_local_reserved_ports; + int sysctl_ip_prot_sock; + struct list_head mr_tables; + struct fib_rules_ops *mr_rules_ops; + u32 sysctl_fib_multipath_hash_fields; + u8 sysctl_fib_multipath_use_neigh; + u8 sysctl_fib_multipath_hash_policy; + struct fib_notifier_ops *notifier_ops; + unsigned int fib_seq; + struct fib_notifier_ops *ipmr_notifier_ops; + unsigned int ipmr_seq; + atomic_t rt_genid; + long: 32; + siphash_key_t ip_id_key; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct dst_entry; + +struct net_device; + +struct sk_buff; + +struct neighbour; + +struct dst_ops { + short unsigned int family; + unsigned int gc_thresh; + void (*gc)(struct dst_ops *); + struct dst_entry * (*check)(struct dst_entry *, __u32); + unsigned int (*default_advmss)(const struct dst_entry *); + unsigned int (*mtu)(const struct dst_entry *); + u32 * (*cow_metrics)(struct dst_entry *, long unsigned int); + void (*destroy)(struct dst_entry *); + void (*ifdown)(struct dst_entry *, struct net_device *, int); + struct dst_entry * (*negative_advice)(struct dst_entry *); + void (*link_failure)(struct sk_buff *); + void (*update_pmtu)(struct dst_entry *, struct sock *, struct sk_buff *, u32, bool); + void (*redirect)(struct dst_entry *, struct sock *, struct sk_buff *); + int (*local_out)(struct net *, struct sock *, struct sk_buff *); + struct neighbour * (*neigh_lookup)(const struct dst_entry *, struct sk_buff *, const void *); + void (*confirm_neigh)(const struct dst_entry *, const void *); + struct kmem_cache *kmem_cachep; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct percpu_counter pcpuc_entries; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct netns_sysctl_ipv6 { + struct ctl_table_header *hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *icmp_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *xfrm6_hdr; + int flush_delay; + int ip6_rt_max_size; + int ip6_rt_gc_min_interval; + int ip6_rt_gc_timeout; + int ip6_rt_gc_interval; + int ip6_rt_gc_elasticity; + int ip6_rt_mtu_expires; + int ip6_rt_min_advmss; + u32 multipath_hash_fields; + u8 multipath_hash_policy; + u8 bindv6only; + u8 flowlabel_consistency; + u8 auto_flowlabels; + int icmpv6_time; + u8 icmpv6_echo_ignore_all; + u8 icmpv6_echo_ignore_multicast; + u8 icmpv6_echo_ignore_anycast; + long unsigned int icmpv6_ratemask[8]; + long unsigned int *icmpv6_ratemask_ptr; + u8 anycast_src_echo_reply; + u8 ip_nonlocal_bind; + u8 fwmark_reflect; + u8 flowlabel_state_ranges; + int idgen_retries; + int idgen_delay; + int flowlabel_reflect; + int max_dst_opts_cnt; + int max_hbh_opts_cnt; + int max_dst_opts_len; + int max_hbh_opts_len; + int seg6_flowlabel; + u32 ioam6_id; + u64 ioam6_id_wide; + bool skip_notify_on_dev_down; + u8 fib_notify_on_flag_change; + long: 32; +}; + +struct ipv6_devconf; + +struct fib6_info; + +struct rt6_info; + +struct rt6_statistics; + +struct fib6_table; + +struct seg6_pernet_data; + +struct ioam6_pernet_data; + +struct netns_ipv6 { + struct dst_ops ip6_dst_ops; + struct netns_sysctl_ipv6 sysctl; + struct ipv6_devconf *devconf_all; + struct ipv6_devconf *devconf_dflt; + struct inet_peer_base *peers; + struct fqdir *fqdir; + struct fib6_info *fib6_null_entry; + struct rt6_info *ip6_null_entry; + struct rt6_statistics *rt6_stats; + struct timer_list ip6_fib_timer; + struct hlist_head *fib_table_hash; + struct fib6_table *fib6_main_tbl; + struct list_head fib6_walkers; + rwlock_t fib6_walker_lock; + spinlock_t fib6_gc_lock; + atomic_t ip6_rt_gc_expire; + long unsigned int ip6_rt_last_gc; + unsigned char flowlabel_has_excl; + bool fib6_has_custom_rules; + unsigned int fib6_rules_require_fldissect; + unsigned int fib6_routes_require_src; + struct rt6_info *ip6_prohibit_entry; + struct rt6_info *ip6_blk_hole_entry; + struct fib6_table *fib6_local_tbl; + struct fib_rules_ops *fib6_rules_ops; + struct sock *ndisc_sk; + struct sock *tcp_sk; + struct sock *igmp_sk; + struct sock *mc_autojoin_sk; + struct hlist_head *inet6_addr_lst; + spinlock_t addrconf_hash_lock; + struct delayed_work addr_chk_work; + struct list_head mr6_tables; + struct fib_rules_ops *mr6_rules_ops; + atomic_t dev_addr_genid; + atomic_t fib6_sernum; + struct seg6_pernet_data *seg6_data; + struct fib_notifier_ops *notifier_ops; + struct fib_notifier_ops *ip6mr_notifier_ops; + unsigned int ipmr_seq; + struct { + struct hlist_head head; + spinlock_t lock; + u32 seq; + } ip6addrlbl_table; + struct ioam6_pernet_data *ioam6_data; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct netns_sysctl_lowpan { + struct ctl_table_header *frags_hdr; +}; + +struct netns_ieee802154_lowpan { + struct netns_sysctl_lowpan sysctl; + struct fqdir *fqdir; +}; + +struct sctp_mib; + +struct netns_sctp { + struct sctp_mib *sctp_statistics; + struct proc_dir_entry *proc_net_sctp; + struct ctl_table_header *sysctl_header; + struct sock *ctl_sock; + struct sock *udp4_sock; + struct sock *udp6_sock; + int udp_port; + int encap_port; + struct list_head local_addr_list; + struct list_head addr_waitq; + struct timer_list addr_wq_timer; + struct list_head auto_asconf_splist; + spinlock_t addr_wq_lock; + spinlock_t local_addr_lock; + unsigned int rto_initial; + unsigned int rto_min; + unsigned int rto_max; + int rto_alpha; + int rto_beta; + int max_burst; + int cookie_preserve_enable; + char *sctp_hmac_alg; + unsigned int valid_cookie_life; + unsigned int sack_timeout; + unsigned int hb_interval; + unsigned int probe_interval; + int max_retrans_association; + int max_retrans_path; + int max_retrans_init; + int pf_retrans; + int ps_retrans; + int pf_enable; + int pf_expose; + int sndbuf_policy; + int rcvbuf_policy; + int default_auto_asconf; + int addip_enable; + int addip_noauth; + int prsctp_enable; + int reconf_enable; + int auth_enable; + int intl_enable; + int ecn_enable; + int scope_policy; + int rwnd_upd_shift; + long unsigned int max_autoclose; + int l3mdev_accept; +}; + +struct nf_logger; + +struct nf_hook_entries; + +struct netns_nf { + struct proc_dir_entry *proc_netfilter; + const struct nf_logger *nf_loggers[11]; + struct ctl_table_header *nf_log_dir_header; + struct nf_hook_entries *hooks_ipv4[5]; + struct nf_hook_entries *hooks_ipv6[5]; + struct nf_hook_entries *hooks_arp[3]; + struct nf_hook_entries *hooks_bridge[5]; + unsigned int defrag_ipv4_users; + unsigned int defrag_ipv6_users; +}; + +struct nf_generic_net { + unsigned int timeout; +}; + +struct nf_tcp_net { + unsigned int timeouts[14]; + u8 tcp_loose; + u8 tcp_be_liberal; + u8 tcp_max_retrans; + u8 tcp_ignore_invalid_rst; + unsigned int offload_timeout; +}; + +struct nf_udp_net { + unsigned int timeouts[2]; + unsigned int offload_timeout; +}; + +struct nf_icmp_net { + unsigned int timeout; +}; + +struct nf_dccp_net { + u8 dccp_loose; + unsigned int dccp_timeout[10]; +}; + +struct nf_sctp_net { + unsigned int timeouts[10]; +}; + +struct nf_gre_net { + struct list_head keymap_list; + unsigned int timeouts[2]; +}; + +struct nf_ip_net { + struct nf_generic_net generic; + struct nf_tcp_net tcp; + struct nf_udp_net udp; + struct nf_icmp_net icmp; + struct nf_icmp_net icmpv6; + struct nf_dccp_net dccp; + struct nf_sctp_net sctp; + struct nf_gre_net gre; +}; + +struct ip_conntrack_stat; + +struct nf_ct_event_notifier; + +struct netns_ct { + u8 ctnetlink_has_listener; + bool ecache_dwork_pending; + u8 sysctl_log_invalid; + u8 sysctl_events; + u8 sysctl_acct; + u8 sysctl_tstamp; + u8 sysctl_checksum; + struct ip_conntrack_stat *stat; + struct nf_ct_event_notifier *nf_conntrack_event_cb; + struct nf_ip_net nf_ct_proto; + unsigned int labels_used; +}; + +struct netns_nftables { + u8 gencursor; +}; + +struct nf_flow_table_stat; + +struct netns_ft { + struct nf_flow_table_stat *stat; +}; + +struct sk_buff_list { + struct sk_buff *next; + struct sk_buff *prev; +}; + +struct sk_buff_head { + union { + struct { + struct sk_buff *next; + struct sk_buff *prev; + }; + struct sk_buff_list list; + }; + __u32 qlen; + spinlock_t lock; +}; + +struct netns_bpf { + struct bpf_prog_array *run_array[2]; + struct bpf_prog *progs[2]; + struct list_head links[2]; +}; + +struct xfrm_policy_hash { + struct hlist_head *table; + unsigned int hmask; + u8 dbits4; + u8 sbits4; + u8 dbits6; + u8 sbits6; +}; + +struct xfrm_policy_hthresh { + struct work_struct work; + seqlock_t lock; + u8 lbits4; + u8 rbits4; + u8 lbits6; + u8 rbits6; +}; + +struct netns_xfrm { + struct list_head state_all; + struct hlist_head *state_bydst; + struct hlist_head *state_bysrc; + struct hlist_head *state_byspi; + struct hlist_head *state_byseq; + unsigned int state_hmask; + unsigned int state_num; + struct work_struct state_hash_work; + struct list_head policy_all; + struct hlist_head *policy_byidx; + unsigned int policy_idx_hmask; + struct hlist_head policy_inexact[3]; + struct xfrm_policy_hash policy_bydst[3]; + unsigned int policy_count[6]; + struct work_struct policy_hash_work; + struct xfrm_policy_hthresh policy_hthresh; + struct list_head inexact_bins; + struct sock *nlsk; + struct sock *nlsk_stash; + u32 sysctl_aevent_etime; + u32 sysctl_aevent_rseqth; + int sysctl_larval_drop; + u32 sysctl_acq_expires; + u8 policy_default[3]; + struct ctl_table_header *sysctl_hdr; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct dst_ops xfrm4_dst_ops; + struct dst_ops xfrm6_dst_ops; + spinlock_t xfrm_state_lock; + seqcount_spinlock_t xfrm_state_hash_generation; + seqcount_spinlock_t xfrm_policy_hash_generation; + spinlock_t xfrm_policy_lock; + struct mutex xfrm_cfg_mutex; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct netns_ipvs; + +struct mpls_route; + +struct netns_mpls { + int ip_ttl_propagate; + int default_ttl; + size_t platform_labels; + struct mpls_route **platform_label; + struct ctl_table_header *ctl; +}; + +struct can_dev_rcv_lists; + +struct can_pkg_stats; + +struct can_rcv_lists_stats; + +struct netns_can { + struct proc_dir_entry *proc_dir; + struct proc_dir_entry *pde_stats; + struct proc_dir_entry *pde_reset_stats; + struct proc_dir_entry *pde_rcvlist_all; + struct proc_dir_entry *pde_rcvlist_fil; + struct proc_dir_entry *pde_rcvlist_inv; + struct proc_dir_entry *pde_rcvlist_sff; + struct proc_dir_entry *pde_rcvlist_eff; + struct proc_dir_entry *pde_rcvlist_err; + struct proc_dir_entry *bcmproc_dir; + struct can_dev_rcv_lists *rx_alldev_list; + spinlock_t rcvlists_lock; + struct timer_list stattimer; + struct can_pkg_stats *pkg_stats; + struct can_rcv_lists_stats *rcv_lists_stats; + struct hlist_head cgw_list; +}; + +struct netns_xdp { + struct mutex lock; + struct hlist_head list; +}; + +struct smc_stats; + +struct smc_stats_rsn; + +struct netns_smc { + struct smc_stats *smc_stats; + struct mutex mutex_fback_rsn; + struct smc_stats_rsn *fback_rsn; + bool limit_smc_hs; + struct ctl_table_header *smc_hdr; + unsigned int sysctl_autocorking_size; + unsigned int sysctl_smcr_buf_type; + int sysctl_smcr_testlink_time; + int sysctl_wmem; + int sysctl_rmem; +}; + +struct uevent_sock; + +struct net_generic; + +struct net { + refcount_t passive; + spinlock_t rules_mod_lock; + atomic_t dev_unreg_count; + unsigned int dev_base_seq; + int ifindex; + spinlock_t nsid_lock; + atomic_t fnhe_genid; + struct list_head list; + struct list_head exit_list; + struct llist_node cleanup_list; + struct key_tag *key_domain; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct idr netns_ids; + struct ns_common ns; + struct ref_tracker_dir refcnt_tracker; + struct ref_tracker_dir notrefcnt_tracker; + struct list_head dev_base_head; + struct proc_dir_entry *proc_net; + struct proc_dir_entry *proc_net_stat; + struct ctl_table_set sysctls; + struct sock *rtnl; + struct sock *genl_sock; + struct uevent_sock *uevent_sock; + struct hlist_head *dev_name_head; + struct hlist_head *dev_index_head; + struct raw_notifier_head netdev_chain; + u32 hash_mix; + struct net_device *loopback_dev; + struct list_head rules_ops; + struct netns_core core; + struct netns_mib mib; + struct netns_packet packet; + struct netns_unix unx; + struct netns_nexthop nexthop; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct netns_ipv4 ipv4; + struct netns_ipv6 ipv6; + struct netns_ieee802154_lowpan ieee802154_lowpan; + struct netns_sctp sctp; + struct netns_nf nf; + struct netns_ct ct; + struct netns_nftables nft; + struct netns_ft ft; + struct sk_buff_head wext_nlevents; + struct net_generic *gen; + struct netns_bpf bpf; + long: 32; + long: 32; + long: 32; + long: 32; + struct netns_xfrm xfrm; + u64 net_cookie; + struct netns_ipvs *ipvs; + struct netns_mpls mpls; + struct netns_can can; + struct netns_xdp xdp; + struct sock *crypto_nlsk; + struct sock *diag_nlsk; + struct netns_smc smc; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct cgroup_namespace { + struct ns_common ns; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct css_set *root_cset; +}; + +struct nsset { + unsigned int flags; + struct nsproxy *nsproxy; + struct fs_struct *fs; + const struct cred *cred; +}; + +struct proc_ns_operations { + const char *name; + const char *real_ns_name; + int type; + struct ns_common * (*get)(struct task_struct *); + void (*put)(struct ns_common *); + int (*install)(struct nsset *, struct ns_common *); + struct user_namespace * (*owner)(struct ns_common *); + struct ns_common * (*get_parent)(struct ns_common *); +}; + +struct ftrace_regs { + struct pt_regs regs; +}; + +struct perf_regs { + __u64 abi; + struct pt_regs *regs; + long: 32; +}; + +struct u64_stats_sync { + seqcount_t seq; +}; + +struct psi_group_cpu { + seqcount_t seq; + unsigned int tasks[4]; + u32 state_mask; + u32 times[7]; + long: 32; + u64 state_start; + u32 times_prev[14]; + long: 32; + long: 32; +}; + +struct psi_group { + struct psi_group *parent; + bool enabled; + struct mutex avgs_lock; + struct psi_group_cpu *pcpu; + u64 avg_total[6]; + u64 avg_last_update; + u64 avg_next_update; + struct delayed_work avgs_work; + long: 32; + u64 total[12]; + long unsigned int avg[18]; + struct task_struct *poll_task; + struct timer_list poll_timer; + wait_queue_head_t poll_wait; + atomic_t poll_wakeup; + atomic_t poll_scheduled; + struct mutex trigger_lock; + struct list_head triggers; + u32 nr_triggers[6]; + u32 poll_states; + long: 32; + u64 poll_min_period; + u64 polling_total[6]; + u64 polling_next_update; + u64 polling_until; +}; + +struct cgroup_taskset; + +struct cftype; + +struct cgroup_subsys { + struct cgroup_subsys_state * (*css_alloc)(struct cgroup_subsys_state *); + int (*css_online)(struct cgroup_subsys_state *); + void (*css_offline)(struct cgroup_subsys_state *); + void (*css_released)(struct cgroup_subsys_state *); + void (*css_free)(struct cgroup_subsys_state *); + void (*css_reset)(struct cgroup_subsys_state *); + void (*css_rstat_flush)(struct cgroup_subsys_state *, int); + int (*css_extra_stat_show)(struct seq_file *, struct cgroup_subsys_state *); + int (*can_attach)(struct cgroup_taskset *); + void (*cancel_attach)(struct cgroup_taskset *); + void (*attach)(struct cgroup_taskset *); + void (*post_attach)(); + int (*can_fork)(struct task_struct *, struct css_set *); + void (*cancel_fork)(struct task_struct *, struct css_set *); + void (*fork)(struct task_struct *); + void (*exit)(struct task_struct *); + void (*release)(struct task_struct *); + void (*bind)(struct cgroup_subsys_state *); + bool early_init: 1; + bool implicit_on_dfl: 1; + bool threaded: 1; + int id; + const char *name; + const char *legacy_name; + struct cgroup_root *root; + struct idr css_idr; + struct list_head cfts; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + unsigned int depends_on; +}; + +struct cgroup_rstat_cpu { + struct u64_stats_sync bsync; + long: 32; + struct cgroup_base_stat bstat; + struct cgroup_base_stat last_bstat; + struct cgroup *updated_children; + struct cgroup *updated_next; +}; + +struct cgroup_root { + struct kernfs_root *kf_root; + unsigned int subsys_mask; + int hierarchy_id; + long: 32; + struct cgroup cgrp; + struct cgroup *cgrp_ancestor_storage; + atomic_t nr_cgrps; + struct list_head root_list; + unsigned int flags; + char release_agent_path[4096]; + char name[64]; + long: 32; +}; + +struct cftype { + char name[64]; + long unsigned int private; + size_t max_write_len; + unsigned int flags; + unsigned int file_offset; + struct cgroup_subsys *ss; + struct list_head node; + struct kernfs_ops *kf_ops; + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + u64 (*read_u64)(struct cgroup_subsys_state *, struct cftype *); + s64 (*read_s64)(struct cgroup_subsys_state *, struct cftype *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + int (*write_u64)(struct cgroup_subsys_state *, struct cftype *, u64); + int (*write_s64)(struct cgroup_subsys_state *, struct cftype *, s64); + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); +}; + +struct perf_callchain_entry { + __u64 nr; + __u64 ip[0]; +}; + +typedef long unsigned int (*perf_copy_f)(void *, const void *, long unsigned int, long unsigned int); + +struct perf_raw_frag { + union { + struct perf_raw_frag *next; + long unsigned int pad; + }; + perf_copy_f copy; + void *data; + u32 size; +}; + +struct perf_raw_record { + struct perf_raw_frag frag; + u32 size; +}; + +struct perf_branch_stack { + __u64 nr; + __u64 hw_idx; + struct perf_branch_entry entries[0]; +}; + +struct perf_cpu_pmu_context; + +struct perf_output_handle; + +struct pmu { + struct list_head entry; + struct module *module; + struct device *dev; + const struct attribute_group **attr_groups; + const struct attribute_group **attr_update; + const char *name; + int type; + int capabilities; + int *pmu_disable_count; + struct perf_cpu_pmu_context *cpu_pmu_context; + atomic_t exclusive_cnt; + int task_ctx_nr; + int hrtimer_interval_ms; + unsigned int nr_addr_filters; + void (*pmu_enable)(struct pmu *); + void (*pmu_disable)(struct pmu *); + int (*event_init)(struct perf_event *); + void (*event_mapped)(struct perf_event *, struct mm_struct *); + void (*event_unmapped)(struct perf_event *, struct mm_struct *); + int (*add)(struct perf_event *, int); + void (*del)(struct perf_event *, int); + void (*start)(struct perf_event *, int); + void (*stop)(struct perf_event *, int); + void (*read)(struct perf_event *); + void (*start_txn)(struct pmu *, unsigned int); + int (*commit_txn)(struct pmu *); + void (*cancel_txn)(struct pmu *); + int (*event_idx)(struct perf_event *); + void (*sched_task)(struct perf_event_pmu_context *, bool); + struct kmem_cache *task_ctx_cache; + void (*swap_task_ctx)(struct perf_event_pmu_context *, struct perf_event_pmu_context *); + void * (*setup_aux)(struct perf_event *, void **, int, bool); + void (*free_aux)(void *); + long int (*snapshot_aux)(struct perf_event *, struct perf_output_handle *, long unsigned int); + int (*addr_filters_validate)(struct list_head *); + void (*addr_filters_sync)(struct perf_event *); + int (*aux_output_match)(struct perf_event *); + bool (*filter)(struct pmu *, int); + int (*check_period)(struct perf_event *, u64); +}; + +struct perf_event_pmu_context { + struct pmu *pmu; + struct perf_event_context *ctx; + struct list_head pmu_ctx_entry; + struct list_head pinned_active; + struct list_head flexible_active; + unsigned int embedded: 1; + unsigned int nr_events; + atomic_t refcount; + struct callback_head callback_head; + void *task_ctx_data; + int rotate_necessary; +}; + +struct perf_cpu_pmu_context { + struct perf_event_pmu_context epc; + struct perf_event_pmu_context *task_epc; + struct list_head sched_cb_entry; + int sched_cb_usage; + int active_oncpu; + int exclusive; + raw_spinlock_t hrtimer_lock; + struct hrtimer hrtimer; + ktime_t hrtimer_interval; + unsigned int hrtimer_active; + long: 32; +}; + +struct perf_output_handle { + struct perf_event *event; + struct perf_buffer *rb; + long unsigned int wakeup; + long unsigned int size; + u64 aux_flags; + union { + void *addr; + long unsigned int head; + }; + int page; +}; + +struct perf_addr_filter_range { + long unsigned int start; + long unsigned int size; +}; + +struct perf_sample_data { + u64 sample_flags; + u64 period; + struct perf_branch_stack *br_stack; + long: 32; + union perf_sample_weight weight; + union perf_mem_data_src data_src; + u64 txn; + u64 addr; + struct perf_raw_record *raw; + long: 32; + u64 type; + u64 ip; + struct { + u32 pid; + u32 tid; + } tid_entry; + u64 time; + u64 id; + u64 stream_id; + struct { + u32 cpu; + u32 reserved; + } cpu_entry; + struct perf_callchain_entry *callchain; + long: 32; + u64 aux_size; + struct perf_regs regs_user; + struct perf_regs regs_intr; + u64 stack_user_size; + u64 phys_addr; + u64 cgroup; + u64 data_page_size; + u64 code_page_size; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct perf_cgroup_info; + +struct perf_cgroup { + struct cgroup_subsys_state css; + struct perf_cgroup_info *info; + long: 32; +}; + +struct perf_cgroup_info { + u64 time; + u64 timestamp; + u64 timeoffset; + int active; + long: 32; +}; + +struct trace_entry { + short unsigned int type; + unsigned char flags; + unsigned char preempt_count; + int pid; +}; + +struct trace_array; + +struct tracer; + +struct array_buffer; + +struct ring_buffer_iter; + +struct trace_iterator { + struct trace_array *tr; + struct tracer *trace; + struct array_buffer *array_buffer; + void *private; + int cpu_file; + struct mutex mutex; + struct ring_buffer_iter **buffer_iter; + long unsigned int iter_flags; + void *temp; + unsigned int temp_size; + char *fmt; + unsigned int fmt_size; + long int wait_index; + long: 32; + struct trace_seq tmp_seq; + cpumask_var_t started; + bool snapshot; + struct trace_seq seq; + struct trace_entry *ent; + long unsigned int lost_events; + int leftover; + int ent_size; + int cpu; + long: 32; + u64 ts; + loff_t pos; + long int idx; + long: 32; +}; + +enum print_line_t { + TRACE_TYPE_PARTIAL_LINE = 0, + TRACE_TYPE_HANDLED = 1, + TRACE_TYPE_UNHANDLED = 2, + TRACE_TYPE_NO_CONSUME = 3, +}; + +typedef enum print_line_t (*trace_print_func)(struct trace_iterator *, int, struct trace_event *); + +struct trace_event_functions { + trace_print_func trace; + trace_print_func raw; + trace_print_func hex; + trace_print_func binary; +}; + +enum trace_reg { + TRACE_REG_REGISTER = 0, + TRACE_REG_UNREGISTER = 1, + TRACE_REG_PERF_REGISTER = 2, + TRACE_REG_PERF_UNREGISTER = 3, + TRACE_REG_PERF_OPEN = 4, + TRACE_REG_PERF_CLOSE = 5, + TRACE_REG_PERF_ADD = 6, + TRACE_REG_PERF_DEL = 7, +}; + +struct trace_event_fields { + const char *type; + union { + struct { + const char *name; + const int size; + const int align; + const int is_signed; + const int filter_type; + }; + int (*define_fields)(struct trace_event_call *); + }; +}; + +struct trace_event_class { + const char *system; + void *probe; + void *perf_probe; + int (*reg)(struct trace_event_call *, enum trace_reg, void *); + struct trace_event_fields *fields_array; + struct list_head * (*get_fields)(struct trace_event_call *); + struct list_head fields; + int (*raw_init)(struct trace_event_call *); +}; + +struct trace_buffer; + +struct trace_event_file; + +struct trace_event_buffer { + struct trace_buffer *buffer; + struct ring_buffer_event *event; + struct trace_event_file *trace_file; + void *entry; + unsigned int trace_ctx; + struct pt_regs *regs; +}; + +struct trace_subsystem_dir; + +struct trace_event_file { + struct list_head list; + struct trace_event_call *event_call; + struct event_filter *filter; + struct dentry *dir; + struct trace_array *tr; + struct trace_subsystem_dir *system; + struct list_head triggers; + long unsigned int flags; + atomic_t sm_ref; + atomic_t tm_ref; +}; + +enum { + TRACE_EVENT_FL_FILTERED = 1, + TRACE_EVENT_FL_CAP_ANY = 2, + TRACE_EVENT_FL_NO_SET_FILTER = 4, + TRACE_EVENT_FL_IGNORE_ENABLE = 8, + TRACE_EVENT_FL_TRACEPOINT = 16, + TRACE_EVENT_FL_DYNAMIC = 32, + TRACE_EVENT_FL_KPROBE = 64, + TRACE_EVENT_FL_UPROBE = 128, + TRACE_EVENT_FL_EPROBE = 256, + TRACE_EVENT_FL_CUSTOM = 512, +}; + +enum { + EVENT_FILE_FL_ENABLED = 1, + EVENT_FILE_FL_RECORDED_CMD = 2, + EVENT_FILE_FL_RECORDED_TGID = 4, + EVENT_FILE_FL_FILTERED = 8, + EVENT_FILE_FL_NO_SET_FILTER = 16, + EVENT_FILE_FL_SOFT_MODE = 32, + EVENT_FILE_FL_SOFT_DISABLED = 64, + EVENT_FILE_FL_TRIGGER_MODE = 128, + EVENT_FILE_FL_TRIGGER_COND = 256, + EVENT_FILE_FL_PID_FILTER = 512, + EVENT_FILE_FL_WAS_ENABLED = 1024, +}; + +enum { + FILTER_OTHER = 0, + FILTER_STATIC_STRING = 1, + FILTER_DYN_STRING = 2, + FILTER_RDYN_STRING = 3, + FILTER_PTR_STRING = 4, + FILTER_TRACE_FN = 5, + FILTER_COMM = 6, + FILTER_CPU = 7, +}; + +struct property { + char *name; + int length; + void *value; + struct property *next; + struct bin_attribute attr; +}; + +struct irq_fwspec { + struct fwnode_handle *fwnode; + int param_count; + u32 param[16]; +}; + +struct irq_domain_ops { + int (*match)(struct irq_domain *, struct device_node *, enum irq_domain_bus_token); + int (*select)(struct irq_domain *, struct irq_fwspec *, enum irq_domain_bus_token); + int (*map)(struct irq_domain *, unsigned int, irq_hw_number_t); + void (*unmap)(struct irq_domain *, unsigned int); + int (*xlate)(struct irq_domain *, struct device_node *, const u32 *, unsigned int, long unsigned int *, unsigned int *); + int (*alloc)(struct irq_domain *, unsigned int, unsigned int, void *); + void (*free)(struct irq_domain *, unsigned int, unsigned int); + int (*activate)(struct irq_domain *, struct irq_data *, bool); + void (*deactivate)(struct irq_domain *, struct irq_data *); + int (*translate)(struct irq_domain *, struct irq_fwspec *, long unsigned int *, unsigned int *); +}; + +struct msi_domain_info; + +struct msi_parent_ops { + u32 supported_flags; + const char *prefix; + bool (*init_dev_msi_info)(struct device *, struct irq_domain *, struct irq_domain *, struct msi_domain_info *); +}; + +enum fixed_addresses { + FIX_EARLYCON_MEM_BASE = 0, + __end_of_permanent_fixed_addresses = 1, + FIX_KMAP_BEGIN = 1, + FIX_KMAP_END = 128, + FIX_TEXT_POKE0 = 129, + FIX_TEXT_POKE1 = 130, + __end_of_fixmap_region = 131, + FIX_BTMAP_END = 1, + FIX_BTMAP_BEGIN = 224, + __end_of_early_ioremap_region = 225, +}; + +typedef void *mempool_alloc_t(gfp_t, void *); + +typedef void mempool_free_t(void *, void *); + +struct mempool_s { + spinlock_t lock; + int min_nr; + int curr_nr; + void **elements; + void *pool_data; + mempool_alloc_t *alloc; + mempool_free_t *free; + wait_queue_head_t wait; +}; + +typedef struct mempool_s mempool_t; + +struct bio_alloc_cache; + +struct bio_set { + struct kmem_cache *bio_slab; + unsigned int front_pad; + struct bio_alloc_cache *cache; + mempool_t bio_pool; + mempool_t bvec_pool; + mempool_t bio_integrity_pool; + mempool_t bvec_integrity_pool; + unsigned int back_pad; + spinlock_t rescue_lock; + struct bio_list rescue_list; + struct work_struct rescue_work; + struct workqueue_struct *rescue_workqueue; + struct hlist_node cpuhp_dead; +}; + +struct cdrom_device_info; + +struct block_device_operations; + +struct timer_rand_state; + +struct disk_events; + +struct badblocks; + +struct blk_independent_access_ranges; + +struct gendisk { + int major; + int first_minor; + int minors; + char disk_name[32]; + short unsigned int events; + short unsigned int event_flags; + struct xarray part_tbl; + struct block_device *part0; + const struct block_device_operations *fops; + struct request_queue *queue; + void *private_data; + struct bio_set bio_split; + int flags; + long unsigned int state; + struct mutex open_mutex; + unsigned int open_partitions; + struct backing_dev_info *bdi; + struct kobject queue_kobj; + struct kobject *slave_dir; + struct list_head slave_bdevs; + struct timer_rand_state *random; + atomic_t sync_io; + struct disk_events *ev; + struct kobject integrity_kobj; + unsigned int nr_zones; + unsigned int max_open_zones; + unsigned int max_active_zones; + long unsigned int *conv_zones_bitmap; + long unsigned int *seq_zones_wlock; + struct cdrom_device_info *cdi; + int node_id; + struct badblocks *bb; + struct lockdep_map lockdep_map; + u64 diskseq; + struct blk_independent_access_ranges *ia_ranges; + long: 32; +}; + +struct partition_meta_info { + char uuid[37]; + u8 volname[64]; +}; + +struct bio_integrity_payload { + struct bio *bip_bio; + struct bvec_iter bip_iter; + short unsigned int bip_vcnt; + short unsigned int bip_max_vcnt; + short unsigned int bip_flags; + struct bvec_iter bio_iter; + long: 0; + struct work_struct bip_work; + struct bio_vec *bip_vec; + struct bio_vec bip_inline_vecs[0]; +} __attribute__((packed)); + +enum req_op { + REQ_OP_READ = 0, + REQ_OP_WRITE = 1, + REQ_OP_FLUSH = 2, + REQ_OP_DISCARD = 3, + REQ_OP_SECURE_ERASE = 5, + REQ_OP_WRITE_ZEROES = 9, + REQ_OP_ZONE_OPEN = 10, + REQ_OP_ZONE_CLOSE = 11, + REQ_OP_ZONE_FINISH = 12, + REQ_OP_ZONE_APPEND = 13, + REQ_OP_ZONE_RESET = 15, + REQ_OP_ZONE_RESET_ALL = 17, + REQ_OP_DRV_IN = 34, + REQ_OP_DRV_OUT = 35, + REQ_OP_LAST = 36, +}; + +struct blk_rq_stat { + u64 mean; + u64 min; + u64 max; + u32 nr_samples; + long: 32; + u64 batch; +}; + +struct iovec { + void *iov_base; + __kernel_size_t iov_len; +}; + +struct kvec { + void *iov_base; + size_t iov_len; +}; + +enum memcg_memory_event { + MEMCG_LOW = 0, + MEMCG_HIGH = 1, + MEMCG_MAX = 2, + MEMCG_OOM = 3, + MEMCG_OOM_KILL = 4, + MEMCG_OOM_GROUP_KILL = 5, + MEMCG_SWAP_HIGH = 6, + MEMCG_SWAP_MAX = 7, + MEMCG_SWAP_FAIL = 8, + MEMCG_NR_MEMORY_EVENTS = 9, +}; + +struct mem_cgroup_reclaim_iter { + struct mem_cgroup *position; + unsigned int generation; +}; + +struct shrinker_info { + struct callback_head rcu; + atomic_long_t *nr_deferred; + long unsigned int *map; +}; + +struct lruvec_stats_percpu { + long int state[41]; + long int state_prev[41]; +}; + +struct lruvec_stats { + long int state[41]; + long int state_pending[41]; +}; + +struct mem_cgroup_per_node { + struct lruvec lruvec; + struct lruvec_stats_percpu *lruvec_stats_percpu; + struct lruvec_stats lruvec_stats; + long unsigned int lru_zone_size[20]; + struct mem_cgroup_reclaim_iter iter; + struct shrinker_info *shrinker_info; + struct rb_node tree_node; + long unsigned int usage_in_excess; + bool on_tree; + struct mem_cgroup *memcg; +}; + +struct eventfd_ctx; + +struct mem_cgroup_threshold { + struct eventfd_ctx *eventfd; + long unsigned int threshold; +}; + +struct mem_cgroup_threshold_ary { + int current_threshold; + unsigned int size; + struct mem_cgroup_threshold entries[0]; +}; + +struct obj_cgroup { + struct percpu_ref refcnt; + struct mem_cgroup *memcg; + atomic_t nr_charged_bytes; + union { + struct list_head list; + struct callback_head rcu; + }; +}; + +struct percpu_cluster { + struct swap_cluster_info index; + unsigned int next; +}; + +enum fs_value_type { + fs_value_is_undefined = 0, + fs_value_is_flag = 1, + fs_value_is_string = 2, + fs_value_is_blob = 3, + fs_value_is_filename = 4, + fs_value_is_file = 5, +}; + +struct fs_parameter { + const char *key; + enum fs_value_type type: 8; + union { + char *string; + void *blob; + struct filename *name; + struct file *file; + }; + size_t size; + int dirfd; +}; + +struct fc_log { + refcount_t usage; + u8 head; + u8 tail; + u8 need_free; + struct module *owner; + char *buffer[8]; +}; + +struct fs_context_operations { + void (*free)(struct fs_context *); + int (*dup)(struct fs_context *, struct fs_context *); + int (*parse_param)(struct fs_context *, struct fs_parameter *); + int (*parse_monolithic)(struct fs_context *, void *); + int (*get_tree)(struct fs_context *); + int (*reconfigure)(struct fs_context *); +}; + +struct fs_parse_result { + bool negated; + long: 32; + union { + bool boolean; + int int_32; + unsigned int uint_32; + u64 uint_64; + }; +}; + +struct blk_zone { + __u64 start; + __u64 len; + __u64 wp; + __u8 type; + __u8 cond; + __u8 non_seq; + __u8 reset; + __u8 resv[4]; + __u64 capacity; + __u8 reserved[24]; +}; + +struct blk_integrity_iter; + +typedef blk_status_t integrity_processing_fn(struct blk_integrity_iter *); + +typedef void integrity_prepare_fn(struct request *); + +typedef void integrity_complete_fn(struct request *, unsigned int); + +struct blk_integrity_profile { + integrity_processing_fn *generate_fn; + integrity_processing_fn *verify_fn; + integrity_prepare_fn *prepare_fn; + integrity_complete_fn *complete_fn; + const char *name; +}; + +typedef int (*report_zones_cb)(struct blk_zone *, unsigned int, void *); + +enum blk_unique_id { + BLK_UID_T10 = 1, + BLK_UID_EUI64 = 2, + BLK_UID_NAA = 3, +}; + +struct hd_geometry; + +struct pr_ops; + +struct block_device_operations { + void (*submit_bio)(struct bio *); + int (*poll_bio)(struct bio *, struct io_comp_batch *, unsigned int); + int (*open)(struct block_device *, fmode_t); + void (*release)(struct gendisk *, fmode_t); + int (*rw_page)(struct block_device *, sector_t, struct page *, enum req_op); + int (*ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); + int (*compat_ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); + unsigned int (*check_events)(struct gendisk *, unsigned int); + void (*unlock_native_capacity)(struct gendisk *); + int (*getgeo)(struct block_device *, struct hd_geometry *); + int (*set_read_only)(struct block_device *, bool); + void (*free_disk)(struct gendisk *); + void (*swap_slot_free_notify)(struct block_device *, long unsigned int); + int (*report_zones)(struct gendisk *, sector_t, unsigned int, report_zones_cb, void *); + char * (*devnode)(struct gendisk *, umode_t *); + int (*get_unique_id)(struct gendisk *, u8 *, enum blk_unique_id); + struct module *owner; + const struct pr_ops *pr_ops; + int (*alternative_gpt_sector)(struct gendisk *, sector_t *); +}; + +struct blk_independent_access_range { + struct kobject kobj; + long: 32; + sector_t sector; + sector_t nr_sectors; +}; + +struct blk_independent_access_ranges { + struct kobject kobj; + bool sysfs_registered; + unsigned int nr_ia_ranges; + long: 32; + struct blk_independent_access_range ia_range[0]; +}; + +enum blk_eh_timer_return { + BLK_EH_DONE = 0, + BLK_EH_RESET_TIMER = 1, +}; + +struct blk_mq_hw_ctx; + +struct blk_mq_queue_data; + +struct blk_mq_ops { + blk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *); + void (*commit_rqs)(struct blk_mq_hw_ctx *); + void (*queue_rqs)(struct request **); + int (*get_budget)(struct request_queue *); + void (*put_budget)(struct request_queue *, int); + void (*set_rq_budget_token)(struct request *, int); + int (*get_rq_budget_token)(struct request *); + enum blk_eh_timer_return (*timeout)(struct request *); + int (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *); + void (*complete)(struct request *); + int (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + int (*init_request)(struct blk_mq_tag_set *, struct request *, unsigned int, unsigned int); + void (*exit_request)(struct blk_mq_tag_set *, struct request *, unsigned int); + void (*cleanup_rq)(struct request *); + bool (*busy)(struct request_queue *); + void (*map_queues)(struct blk_mq_tag_set *); + void (*show_rq)(struct seq_file *, struct request *); +}; + +enum pr_type { + PR_WRITE_EXCLUSIVE = 1, + PR_EXCLUSIVE_ACCESS = 2, + PR_WRITE_EXCLUSIVE_REG_ONLY = 3, + PR_EXCLUSIVE_ACCESS_REG_ONLY = 4, + PR_WRITE_EXCLUSIVE_ALL_REGS = 5, + PR_EXCLUSIVE_ACCESS_ALL_REGS = 6, +}; + +struct pr_ops { + int (*pr_register)(struct block_device *, u64, u64, u32); + int (*pr_reserve)(struct block_device *, u64, enum pr_type, u32); + int (*pr_release)(struct block_device *, u64, enum pr_type); + int (*pr_preempt)(struct block_device *, u64, u64, enum pr_type, bool); + int (*pr_clear)(struct block_device *, u64); +}; + +struct in6_addr { + union { + __u8 u6_addr8[16]; + __be16 u6_addr16[8]; + __be32 u6_addr32[4]; + } in6_u; +}; + +enum { + IPSTATS_MIB_NUM = 0, + IPSTATS_MIB_INPKTS = 1, + IPSTATS_MIB_INOCTETS = 2, + IPSTATS_MIB_INDELIVERS = 3, + IPSTATS_MIB_OUTFORWDATAGRAMS = 4, + IPSTATS_MIB_OUTPKTS = 5, + IPSTATS_MIB_OUTOCTETS = 6, + IPSTATS_MIB_INHDRERRORS = 7, + IPSTATS_MIB_INTOOBIGERRORS = 8, + IPSTATS_MIB_INNOROUTES = 9, + IPSTATS_MIB_INADDRERRORS = 10, + IPSTATS_MIB_INUNKNOWNPROTOS = 11, + IPSTATS_MIB_INTRUNCATEDPKTS = 12, + IPSTATS_MIB_INDISCARDS = 13, + IPSTATS_MIB_OUTDISCARDS = 14, + IPSTATS_MIB_OUTNOROUTES = 15, + IPSTATS_MIB_REASMTIMEOUT = 16, + IPSTATS_MIB_REASMREQDS = 17, + IPSTATS_MIB_REASMOKS = 18, + IPSTATS_MIB_REASMFAILS = 19, + IPSTATS_MIB_FRAGOKS = 20, + IPSTATS_MIB_FRAGFAILS = 21, + IPSTATS_MIB_FRAGCREATES = 22, + IPSTATS_MIB_INMCASTPKTS = 23, + IPSTATS_MIB_OUTMCASTPKTS = 24, + IPSTATS_MIB_INBCASTPKTS = 25, + IPSTATS_MIB_OUTBCASTPKTS = 26, + IPSTATS_MIB_INMCASTOCTETS = 27, + IPSTATS_MIB_OUTMCASTOCTETS = 28, + IPSTATS_MIB_INBCASTOCTETS = 29, + IPSTATS_MIB_OUTBCASTOCTETS = 30, + IPSTATS_MIB_CSUMERRORS = 31, + IPSTATS_MIB_NOECTPKTS = 32, + IPSTATS_MIB_ECT1PKTS = 33, + IPSTATS_MIB_ECT0PKTS = 34, + IPSTATS_MIB_CEPKTS = 35, + IPSTATS_MIB_REASM_OVERLAPS = 36, + __IPSTATS_MIB_MAX = 37, +}; + +enum { + ICMP_MIB_NUM = 0, + ICMP_MIB_INMSGS = 1, + ICMP_MIB_INERRORS = 2, + ICMP_MIB_INDESTUNREACHS = 3, + ICMP_MIB_INTIMEEXCDS = 4, + ICMP_MIB_INPARMPROBS = 5, + ICMP_MIB_INSRCQUENCHS = 6, + ICMP_MIB_INREDIRECTS = 7, + ICMP_MIB_INECHOS = 8, + ICMP_MIB_INECHOREPS = 9, + ICMP_MIB_INTIMESTAMPS = 10, + ICMP_MIB_INTIMESTAMPREPS = 11, + ICMP_MIB_INADDRMASKS = 12, + ICMP_MIB_INADDRMASKREPS = 13, + ICMP_MIB_OUTMSGS = 14, + ICMP_MIB_OUTERRORS = 15, + ICMP_MIB_OUTDESTUNREACHS = 16, + ICMP_MIB_OUTTIMEEXCDS = 17, + ICMP_MIB_OUTPARMPROBS = 18, + ICMP_MIB_OUTSRCQUENCHS = 19, + ICMP_MIB_OUTREDIRECTS = 20, + ICMP_MIB_OUTECHOS = 21, + ICMP_MIB_OUTECHOREPS = 22, + ICMP_MIB_OUTTIMESTAMPS = 23, + ICMP_MIB_OUTTIMESTAMPREPS = 24, + ICMP_MIB_OUTADDRMASKS = 25, + ICMP_MIB_OUTADDRMASKREPS = 26, + ICMP_MIB_CSUMERRORS = 27, + ICMP_MIB_RATELIMITGLOBAL = 28, + ICMP_MIB_RATELIMITHOST = 29, + __ICMP_MIB_MAX = 30, +}; + +enum { + ICMP6_MIB_NUM = 0, + ICMP6_MIB_INMSGS = 1, + ICMP6_MIB_INERRORS = 2, + ICMP6_MIB_OUTMSGS = 3, + ICMP6_MIB_OUTERRORS = 4, + ICMP6_MIB_CSUMERRORS = 5, + ICMP6_MIB_RATELIMITHOST = 6, + __ICMP6_MIB_MAX = 7, +}; + +enum { + TCP_MIB_NUM = 0, + TCP_MIB_RTOALGORITHM = 1, + TCP_MIB_RTOMIN = 2, + TCP_MIB_RTOMAX = 3, + TCP_MIB_MAXCONN = 4, + TCP_MIB_ACTIVEOPENS = 5, + TCP_MIB_PASSIVEOPENS = 6, + TCP_MIB_ATTEMPTFAILS = 7, + TCP_MIB_ESTABRESETS = 8, + TCP_MIB_CURRESTAB = 9, + TCP_MIB_INSEGS = 10, + TCP_MIB_OUTSEGS = 11, + TCP_MIB_RETRANSSEGS = 12, + TCP_MIB_INERRS = 13, + TCP_MIB_OUTRSTS = 14, + TCP_MIB_CSUMERRORS = 15, + __TCP_MIB_MAX = 16, +}; + +enum { + UDP_MIB_NUM = 0, + UDP_MIB_INDATAGRAMS = 1, + UDP_MIB_NOPORTS = 2, + UDP_MIB_INERRORS = 3, + UDP_MIB_OUTDATAGRAMS = 4, + UDP_MIB_RCVBUFERRORS = 5, + UDP_MIB_SNDBUFERRORS = 6, + UDP_MIB_CSUMERRORS = 7, + UDP_MIB_IGNOREDMULTI = 8, + UDP_MIB_MEMERRORS = 9, + __UDP_MIB_MAX = 10, +}; + +enum { + LINUX_MIB_NUM = 0, + LINUX_MIB_SYNCOOKIESSENT = 1, + LINUX_MIB_SYNCOOKIESRECV = 2, + LINUX_MIB_SYNCOOKIESFAILED = 3, + LINUX_MIB_EMBRYONICRSTS = 4, + LINUX_MIB_PRUNECALLED = 5, + LINUX_MIB_RCVPRUNED = 6, + LINUX_MIB_OFOPRUNED = 7, + LINUX_MIB_OUTOFWINDOWICMPS = 8, + LINUX_MIB_LOCKDROPPEDICMPS = 9, + LINUX_MIB_ARPFILTER = 10, + LINUX_MIB_TIMEWAITED = 11, + LINUX_MIB_TIMEWAITRECYCLED = 12, + LINUX_MIB_TIMEWAITKILLED = 13, + LINUX_MIB_PAWSACTIVEREJECTED = 14, + LINUX_MIB_PAWSESTABREJECTED = 15, + LINUX_MIB_DELAYEDACKS = 16, + LINUX_MIB_DELAYEDACKLOCKED = 17, + LINUX_MIB_DELAYEDACKLOST = 18, + LINUX_MIB_LISTENOVERFLOWS = 19, + LINUX_MIB_LISTENDROPS = 20, + LINUX_MIB_TCPHPHITS = 21, + LINUX_MIB_TCPPUREACKS = 22, + LINUX_MIB_TCPHPACKS = 23, + LINUX_MIB_TCPRENORECOVERY = 24, + LINUX_MIB_TCPSACKRECOVERY = 25, + LINUX_MIB_TCPSACKRENEGING = 26, + LINUX_MIB_TCPSACKREORDER = 27, + LINUX_MIB_TCPRENOREORDER = 28, + LINUX_MIB_TCPTSREORDER = 29, + LINUX_MIB_TCPFULLUNDO = 30, + LINUX_MIB_TCPPARTIALUNDO = 31, + LINUX_MIB_TCPDSACKUNDO = 32, + LINUX_MIB_TCPLOSSUNDO = 33, + LINUX_MIB_TCPLOSTRETRANSMIT = 34, + LINUX_MIB_TCPRENOFAILURES = 35, + LINUX_MIB_TCPSACKFAILURES = 36, + LINUX_MIB_TCPLOSSFAILURES = 37, + LINUX_MIB_TCPFASTRETRANS = 38, + LINUX_MIB_TCPSLOWSTARTRETRANS = 39, + LINUX_MIB_TCPTIMEOUTS = 40, + LINUX_MIB_TCPLOSSPROBES = 41, + LINUX_MIB_TCPLOSSPROBERECOVERY = 42, + LINUX_MIB_TCPRENORECOVERYFAIL = 43, + LINUX_MIB_TCPSACKRECOVERYFAIL = 44, + LINUX_MIB_TCPRCVCOLLAPSED = 45, + LINUX_MIB_TCPDSACKOLDSENT = 46, + LINUX_MIB_TCPDSACKOFOSENT = 47, + LINUX_MIB_TCPDSACKRECV = 48, + LINUX_MIB_TCPDSACKOFORECV = 49, + LINUX_MIB_TCPABORTONDATA = 50, + LINUX_MIB_TCPABORTONCLOSE = 51, + LINUX_MIB_TCPABORTONMEMORY = 52, + LINUX_MIB_TCPABORTONTIMEOUT = 53, + LINUX_MIB_TCPABORTONLINGER = 54, + LINUX_MIB_TCPABORTFAILED = 55, + LINUX_MIB_TCPMEMORYPRESSURES = 56, + LINUX_MIB_TCPMEMORYPRESSURESCHRONO = 57, + LINUX_MIB_TCPSACKDISCARD = 58, + LINUX_MIB_TCPDSACKIGNOREDOLD = 59, + LINUX_MIB_TCPDSACKIGNOREDNOUNDO = 60, + LINUX_MIB_TCPSPURIOUSRTOS = 61, + LINUX_MIB_TCPMD5NOTFOUND = 62, + LINUX_MIB_TCPMD5UNEXPECTED = 63, + LINUX_MIB_TCPMD5FAILURE = 64, + LINUX_MIB_SACKSHIFTED = 65, + LINUX_MIB_SACKMERGED = 66, + LINUX_MIB_SACKSHIFTFALLBACK = 67, + LINUX_MIB_TCPBACKLOGDROP = 68, + LINUX_MIB_PFMEMALLOCDROP = 69, + LINUX_MIB_TCPMINTTLDROP = 70, + LINUX_MIB_TCPDEFERACCEPTDROP = 71, + LINUX_MIB_IPRPFILTER = 72, + LINUX_MIB_TCPTIMEWAITOVERFLOW = 73, + LINUX_MIB_TCPREQQFULLDOCOOKIES = 74, + LINUX_MIB_TCPREQQFULLDROP = 75, + LINUX_MIB_TCPRETRANSFAIL = 76, + LINUX_MIB_TCPRCVCOALESCE = 77, + LINUX_MIB_TCPBACKLOGCOALESCE = 78, + LINUX_MIB_TCPOFOQUEUE = 79, + LINUX_MIB_TCPOFODROP = 80, + LINUX_MIB_TCPOFOMERGE = 81, + LINUX_MIB_TCPCHALLENGEACK = 82, + LINUX_MIB_TCPSYNCHALLENGE = 83, + LINUX_MIB_TCPFASTOPENACTIVE = 84, + LINUX_MIB_TCPFASTOPENACTIVEFAIL = 85, + LINUX_MIB_TCPFASTOPENPASSIVE = 86, + LINUX_MIB_TCPFASTOPENPASSIVEFAIL = 87, + LINUX_MIB_TCPFASTOPENLISTENOVERFLOW = 88, + LINUX_MIB_TCPFASTOPENCOOKIEREQD = 89, + LINUX_MIB_TCPFASTOPENBLACKHOLE = 90, + LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES = 91, + LINUX_MIB_BUSYPOLLRXPACKETS = 92, + LINUX_MIB_TCPAUTOCORKING = 93, + LINUX_MIB_TCPFROMZEROWINDOWADV = 94, + LINUX_MIB_TCPTOZEROWINDOWADV = 95, + LINUX_MIB_TCPWANTZEROWINDOWADV = 96, + LINUX_MIB_TCPSYNRETRANS = 97, + LINUX_MIB_TCPORIGDATASENT = 98, + LINUX_MIB_TCPHYSTARTTRAINDETECT = 99, + LINUX_MIB_TCPHYSTARTTRAINCWND = 100, + LINUX_MIB_TCPHYSTARTDELAYDETECT = 101, + LINUX_MIB_TCPHYSTARTDELAYCWND = 102, + LINUX_MIB_TCPACKSKIPPEDSYNRECV = 103, + LINUX_MIB_TCPACKSKIPPEDPAWS = 104, + LINUX_MIB_TCPACKSKIPPEDSEQ = 105, + LINUX_MIB_TCPACKSKIPPEDFINWAIT2 = 106, + LINUX_MIB_TCPACKSKIPPEDTIMEWAIT = 107, + LINUX_MIB_TCPACKSKIPPEDCHALLENGE = 108, + LINUX_MIB_TCPWINPROBE = 109, + LINUX_MIB_TCPKEEPALIVE = 110, + LINUX_MIB_TCPMTUPFAIL = 111, + LINUX_MIB_TCPMTUPSUCCESS = 112, + LINUX_MIB_TCPDELIVERED = 113, + LINUX_MIB_TCPDELIVEREDCE = 114, + LINUX_MIB_TCPACKCOMPRESSED = 115, + LINUX_MIB_TCPZEROWINDOWDROP = 116, + LINUX_MIB_TCPRCVQDROP = 117, + LINUX_MIB_TCPWQUEUETOOBIG = 118, + LINUX_MIB_TCPFASTOPENPASSIVEALTKEY = 119, + LINUX_MIB_TCPTIMEOUTREHASH = 120, + LINUX_MIB_TCPDUPLICATEDATAREHASH = 121, + LINUX_MIB_TCPDSACKRECVSEGS = 122, + LINUX_MIB_TCPDSACKIGNOREDDUBIOUS = 123, + LINUX_MIB_TCPMIGRATEREQSUCCESS = 124, + LINUX_MIB_TCPMIGRATEREQFAILURE = 125, + LINUX_MIB_TCPPLBREHASH = 126, + __LINUX_MIB_MAX = 127, +}; + +enum { + LINUX_MIB_XFRMNUM = 0, + LINUX_MIB_XFRMINERROR = 1, + LINUX_MIB_XFRMINBUFFERERROR = 2, + LINUX_MIB_XFRMINHDRERROR = 3, + LINUX_MIB_XFRMINNOSTATES = 4, + LINUX_MIB_XFRMINSTATEPROTOERROR = 5, + LINUX_MIB_XFRMINSTATEMODEERROR = 6, + LINUX_MIB_XFRMINSTATESEQERROR = 7, + LINUX_MIB_XFRMINSTATEEXPIRED = 8, + LINUX_MIB_XFRMINSTATEMISMATCH = 9, + LINUX_MIB_XFRMINSTATEINVALID = 10, + LINUX_MIB_XFRMINTMPLMISMATCH = 11, + LINUX_MIB_XFRMINNOPOLS = 12, + LINUX_MIB_XFRMINPOLBLOCK = 13, + LINUX_MIB_XFRMINPOLERROR = 14, + LINUX_MIB_XFRMOUTERROR = 15, + LINUX_MIB_XFRMOUTBUNDLEGENERROR = 16, + LINUX_MIB_XFRMOUTBUNDLECHECKERROR = 17, + LINUX_MIB_XFRMOUTNOSTATES = 18, + LINUX_MIB_XFRMOUTSTATEPROTOERROR = 19, + LINUX_MIB_XFRMOUTSTATEMODEERROR = 20, + LINUX_MIB_XFRMOUTSTATESEQERROR = 21, + LINUX_MIB_XFRMOUTSTATEEXPIRED = 22, + LINUX_MIB_XFRMOUTPOLBLOCK = 23, + LINUX_MIB_XFRMOUTPOLDEAD = 24, + LINUX_MIB_XFRMOUTPOLERROR = 25, + LINUX_MIB_XFRMFWDHDRERROR = 26, + LINUX_MIB_XFRMOUTSTATEINVALID = 27, + LINUX_MIB_XFRMACQUIREERROR = 28, + __LINUX_MIB_XFRMMAX = 29, +}; + +enum { + LINUX_MIB_TLSNUM = 0, + LINUX_MIB_TLSCURRTXSW = 1, + LINUX_MIB_TLSCURRRXSW = 2, + LINUX_MIB_TLSCURRTXDEVICE = 3, + LINUX_MIB_TLSCURRRXDEVICE = 4, + LINUX_MIB_TLSTXSW = 5, + LINUX_MIB_TLSRXSW = 6, + LINUX_MIB_TLSTXDEVICE = 7, + LINUX_MIB_TLSRXDEVICE = 8, + LINUX_MIB_TLSDECRYPTERROR = 9, + LINUX_MIB_TLSRXDEVICERESYNC = 10, + LINUX_MIB_TLSDECRYPTRETRY = 11, + LINUX_MIB_TLSRXNOPADVIOL = 12, + __LINUX_MIB_TLSMAX = 13, +}; + +struct ipstats_mib { + u64 mibs[37]; + struct u64_stats_sync syncp; + long: 32; +}; + +struct icmp_mib { + long unsigned int mibs[30]; +}; + +struct icmpmsg_mib { + atomic_long_t mibs[512]; +}; + +struct icmpv6_mib { + long unsigned int mibs[7]; +}; + +struct icmpv6msg_mib { + atomic_long_t mibs[512]; +}; + +struct tcp_mib { + long unsigned int mibs[16]; +}; + +struct udp_mib { + long unsigned int mibs[10]; +}; + +struct linux_mib { + long unsigned int mibs[127]; +}; + +struct linux_xfrm_mib { + long unsigned int mibs[29]; +}; + +struct inet_frags; + +struct fqdir { + long int high_thresh; + long int low_thresh; + int timeout; + int max_dist; + struct inet_frags *f; + struct net *net; + bool dead; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct rhashtable rhashtable; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + atomic_long_t mem; + struct work_struct destroy_work; + struct llist_node free_list; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct inet_frag_queue; + +struct inet_frags { + unsigned int qsize; + void (*constructor)(struct inet_frag_queue *, const void *); + void (*destructor)(struct inet_frag_queue *); + void (*frag_expire)(struct timer_list *); + struct kmem_cache *frags_cachep; + const char *frags_cache_name; + struct rhashtable_params rhash_params; + refcount_t refcnt; + struct completion completion; +}; + +struct frag_v4_compare_key { + __be32 saddr; + __be32 daddr; + u32 user; + u32 vif; + __be16 id; + u16 protocol; +}; + +struct frag_v6_compare_key { + struct in6_addr saddr; + struct in6_addr daddr; + u32 user; + __be32 id; + u32 iif; +}; + +struct inet_frag_queue { + struct rhash_head node; + union { + struct frag_v4_compare_key v4; + struct frag_v6_compare_key v6; + } key; + struct timer_list timer; + spinlock_t lock; + refcount_t refcnt; + struct rb_root rb_fragments; + struct sk_buff *fragments_tail; + struct sk_buff *last_run_head; + ktime_t stamp; + int len; + int meat; + u8 mono_delivery_time; + __u8 flags; + u16 max_size; + struct fqdir *fqdir; + struct callback_head rcu; +}; + +typedef unsigned char *sk_buff_data_t; + +struct skb_ext; + +struct sk_buff { + union { + struct { + struct sk_buff *next; + struct sk_buff *prev; + union { + struct net_device *dev; + long unsigned int dev_scratch; + }; + }; + struct rb_node rbnode; + struct list_head list; + struct llist_node ll_node; + }; + union { + struct sock *sk; + int ip_defrag_offset; + }; + union { + ktime_t tstamp; + u64 skb_mstamp_ns; + }; + char cb[48]; + union { + struct { + long unsigned int _skb_refdst; + void (*destructor)(struct sk_buff *); + }; + struct list_head tcp_tsorted_anchor; + long unsigned int _sk_redir; + }; + long unsigned int _nfct; + unsigned int len; + unsigned int data_len; + __u16 mac_len; + __u16 hdr_len; + __u16 queue_mapping; + __u8 __cloned_offset[0]; + __u8 cloned: 1; + __u8 nohdr: 1; + __u8 fclone: 2; + __u8 peeked: 1; + __u8 head_frag: 1; + __u8 pfmemalloc: 1; + __u8 pp_recycle: 1; + __u8 active_extensions; + union { + struct { + __u8 __pkt_type_offset[0]; + __u8 pkt_type: 3; + __u8 ignore_df: 1; + __u8 nf_trace: 1; + __u8 ip_summed: 2; + __u8 ooo_okay: 1; + __u8 l4_hash: 1; + __u8 sw_hash: 1; + __u8 wifi_acked_valid: 1; + __u8 wifi_acked: 1; + __u8 no_fcs: 1; + __u8 encapsulation: 1; + __u8 encap_hdr_csum: 1; + __u8 csum_valid: 1; + __u8 __pkt_vlan_present_offset[0]; + __u8 remcsum_offload: 1; + __u8 csum_complete_sw: 1; + __u8 csum_level: 2; + __u8 dst_pending_confirm: 1; + __u8 mono_delivery_time: 1; + __u8 tc_skip_classify: 1; + __u8 tc_at_ingress: 1; + __u8 ndisc_nodetype: 2; + __u8 ipvs_property: 1; + __u8 inner_protocol_type: 1; + __u8 offload_fwd_mark: 1; + __u8 offload_l3_fwd_mark: 1; + __u8 redirected: 1; + __u8 from_ingress: 1; + __u8 nf_skip_egress: 1; + __u8 slow_gro: 1; + __u8 csum_not_inet: 1; + __u8 scm_io_uring: 1; + __u16 tc_index; + union { + __wsum csum; + struct { + __u16 csum_start; + __u16 csum_offset; + }; + }; + __u32 priority; + int skb_iif; + __u32 hash; + union { + u32 vlan_all; + struct { + __be16 vlan_proto; + __u16 vlan_tci; + }; + }; + union { + unsigned int napi_id; + unsigned int sender_cpu; + }; + u16 alloc_cpu; + __u32 secmark; + union { + __u32 mark; + __u32 reserved_tailroom; + }; + union { + __be16 inner_protocol; + __u8 inner_ipproto; + }; + __u16 inner_transport_header; + __u16 inner_network_header; + __u16 inner_mac_header; + __be16 protocol; + __u16 transport_header; + __u16 network_header; + __u16 mac_header; + }; + struct { + __u8 __pkt_type_offset[0]; + __u8 pkt_type: 3; + __u8 ignore_df: 1; + __u8 nf_trace: 1; + __u8 ip_summed: 2; + __u8 ooo_okay: 1; + __u8 l4_hash: 1; + __u8 sw_hash: 1; + __u8 wifi_acked_valid: 1; + __u8 wifi_acked: 1; + __u8 no_fcs: 1; + __u8 encapsulation: 1; + __u8 encap_hdr_csum: 1; + __u8 csum_valid: 1; + __u8 __pkt_vlan_present_offset[0]; + __u8 remcsum_offload: 1; + __u8 csum_complete_sw: 1; + __u8 csum_level: 2; + __u8 dst_pending_confirm: 1; + __u8 mono_delivery_time: 1; + __u8 tc_skip_classify: 1; + __u8 tc_at_ingress: 1; + __u8 ndisc_nodetype: 2; + __u8 ipvs_property: 1; + __u8 inner_protocol_type: 1; + __u8 offload_fwd_mark: 1; + __u8 offload_l3_fwd_mark: 1; + __u8 redirected: 1; + __u8 from_ingress: 1; + __u8 nf_skip_egress: 1; + __u8 slow_gro: 1; + __u8 csum_not_inet: 1; + __u8 scm_io_uring: 1; + __u16 tc_index; + union { + __wsum csum; + struct { + __u16 csum_start; + __u16 csum_offset; + }; + }; + __u32 priority; + int skb_iif; + __u32 hash; + union { + u32 vlan_all; + struct { + __be16 vlan_proto; + __u16 vlan_tci; + }; + }; + union { + unsigned int napi_id; + unsigned int sender_cpu; + }; + u16 alloc_cpu; + __u32 secmark; + union { + __u32 mark; + __u32 reserved_tailroom; + }; + union { + __be16 inner_protocol; + __u8 inner_ipproto; + }; + __u16 inner_transport_header; + __u16 inner_network_header; + __u16 inner_mac_header; + __be16 protocol; + __u16 transport_header; + __u16 network_header; + __u16 mac_header; + } headers; + }; + sk_buff_data_t tail; + sk_buff_data_t end; + unsigned char *head; + unsigned char *data; + unsigned int truesize; + refcount_t users; + struct skb_ext *extensions; + long: 32; +}; + +enum tcp_ca_event { + CA_EVENT_TX_START = 0, + CA_EVENT_CWND_RESTART = 1, + CA_EVENT_COMPLETE_CWR = 2, + CA_EVENT_LOSS = 3, + CA_EVENT_ECN_NO_CE = 4, + CA_EVENT_ECN_IS_CE = 5, +}; + +struct ack_sample; + +struct rate_sample; + +union tcp_cc_info; + +struct tcp_congestion_ops { + u32 (*ssthresh)(struct sock *); + void (*cong_avoid)(struct sock *, u32, u32); + void (*set_state)(struct sock *, u8); + void (*cwnd_event)(struct sock *, enum tcp_ca_event); + void (*in_ack_event)(struct sock *, u32); + void (*pkts_acked)(struct sock *, const struct ack_sample *); + u32 (*min_tso_segs)(struct sock *); + void (*cong_control)(struct sock *, const struct rate_sample *); + u32 (*undo_cwnd)(struct sock *); + u32 (*sndbuf_expand)(struct sock *); + size_t (*get_info)(struct sock *, u32, int *, union tcp_cc_info *); + char name[16]; + struct module *owner; + struct list_head list; + u32 key; + u32 flags; + void (*init)(struct sock *); + void (*release)(struct sock *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +typedef struct {} netdevice_tracker; + +struct xfrm_state; + +struct lwtunnel_state; + +struct dst_entry { + struct net_device *dev; + struct dst_ops *ops; + long unsigned int _metrics; + long unsigned int expires; + struct xfrm_state *xfrm; + int (*input)(struct sk_buff *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + short unsigned int flags; + short int obsolete; + short unsigned int header_len; + short unsigned int trailer_len; + int __use; + long unsigned int lastuse; + struct lwtunnel_state *lwtstate; + struct callback_head callback_head; + short int error; + short int __pad; + __u32 tclassid; + atomic_t __refcnt; + netdevice_tracker dev_tracker; +}; + +enum nf_inet_hooks { + NF_INET_PRE_ROUTING = 0, + NF_INET_LOCAL_IN = 1, + NF_INET_FORWARD = 2, + NF_INET_LOCAL_OUT = 3, + NF_INET_POST_ROUTING = 4, + NF_INET_NUMHOOKS = 5, + NF_INET_INGRESS = 5, +}; + +enum { + NFPROTO_UNSPEC = 0, + NFPROTO_INET = 1, + NFPROTO_IPV4 = 2, + NFPROTO_ARP = 3, + NFPROTO_NETDEV = 5, + NFPROTO_BRIDGE = 7, + NFPROTO_IPV6 = 10, + NFPROTO_NUMPROTO = 11, +}; + +enum nf_log_type { + NF_LOG_TYPE_LOG = 0, + NF_LOG_TYPE_ULOG = 1, + NF_LOG_TYPE_MAX = 2, +}; + +typedef u8 u_int8_t; + +struct nf_loginfo; + +typedef void nf_logfn(struct net *, u_int8_t, unsigned int, const struct sk_buff *, const struct net_device *, const struct net_device *, const struct nf_loginfo *, const char *); + +struct nf_logger { + char *name; + enum nf_log_type type; + nf_logfn *logfn; + struct module *me; +}; + +enum tcp_conntrack { + TCP_CONNTRACK_NONE = 0, + TCP_CONNTRACK_SYN_SENT = 1, + TCP_CONNTRACK_SYN_RECV = 2, + TCP_CONNTRACK_ESTABLISHED = 3, + TCP_CONNTRACK_FIN_WAIT = 4, + TCP_CONNTRACK_CLOSE_WAIT = 5, + TCP_CONNTRACK_LAST_ACK = 6, + TCP_CONNTRACK_TIME_WAIT = 7, + TCP_CONNTRACK_CLOSE = 8, + TCP_CONNTRACK_LISTEN = 9, + TCP_CONNTRACK_MAX = 10, + TCP_CONNTRACK_IGNORE = 11, + TCP_CONNTRACK_RETRANS = 12, + TCP_CONNTRACK_UNACK = 13, + TCP_CONNTRACK_TIMEOUT_MAX = 14, +}; + +enum ct_dccp_states { + CT_DCCP_NONE = 0, + CT_DCCP_REQUEST = 1, + CT_DCCP_RESPOND = 2, + CT_DCCP_PARTOPEN = 3, + CT_DCCP_OPEN = 4, + CT_DCCP_CLOSEREQ = 5, + CT_DCCP_CLOSING = 6, + CT_DCCP_TIMEWAIT = 7, + CT_DCCP_IGNORE = 8, + CT_DCCP_INVALID = 9, + __CT_DCCP_MAX = 10, +}; + +struct ip_conntrack_stat { + unsigned int found; + unsigned int invalid; + unsigned int insert; + unsigned int insert_failed; + unsigned int clash_resolve; + unsigned int drop; + unsigned int early_drop; + unsigned int error; + unsigned int expect_new; + unsigned int expect_create; + unsigned int expect_delete; + unsigned int search_restart; + unsigned int chaintoolong; +}; + +enum ip_conntrack_dir { + IP_CT_DIR_ORIGINAL = 0, + IP_CT_DIR_REPLY = 1, + IP_CT_DIR_MAX = 2, +}; + +enum sctp_conntrack { + SCTP_CONNTRACK_NONE = 0, + SCTP_CONNTRACK_CLOSED = 1, + SCTP_CONNTRACK_COOKIE_WAIT = 2, + SCTP_CONNTRACK_COOKIE_ECHOED = 3, + SCTP_CONNTRACK_ESTABLISHED = 4, + SCTP_CONNTRACK_SHUTDOWN_SENT = 5, + SCTP_CONNTRACK_SHUTDOWN_RECD = 6, + SCTP_CONNTRACK_SHUTDOWN_ACK_SENT = 7, + SCTP_CONNTRACK_HEARTBEAT_SENT = 8, + SCTP_CONNTRACK_HEARTBEAT_ACKED = 9, + SCTP_CONNTRACK_MAX = 10, +}; + +enum udp_conntrack { + UDP_CT_UNREPLIED = 0, + UDP_CT_REPLIED = 1, + UDP_CT_MAX = 2, +}; + +enum gre_conntrack { + GRE_CT_UNREPLIED = 0, + GRE_CT_REPLIED = 1, + GRE_CT_MAX = 2, +}; + +struct nf_flow_table_stat { + unsigned int count_wq_add; + unsigned int count_wq_del; + unsigned int count_wq_stats; +}; + +enum { + XFRM_POLICY_IN = 0, + XFRM_POLICY_OUT = 1, + XFRM_POLICY_FWD = 2, + XFRM_POLICY_MASK = 3, + XFRM_POLICY_MAX = 3, +}; + +enum netns_bpf_attach_type { + NETNS_BPF_INVALID = 4294967295, + NETNS_BPF_FLOW_DISSECTOR = 0, + NETNS_BPF_SK_LOOKUP = 1, + MAX_NETNS_BPF_ATTACH_TYPE = 2, +}; + +enum flow_dissector_key_id { + FLOW_DISSECTOR_KEY_CONTROL = 0, + FLOW_DISSECTOR_KEY_BASIC = 1, + FLOW_DISSECTOR_KEY_IPV4_ADDRS = 2, + FLOW_DISSECTOR_KEY_IPV6_ADDRS = 3, + FLOW_DISSECTOR_KEY_PORTS = 4, + FLOW_DISSECTOR_KEY_PORTS_RANGE = 5, + FLOW_DISSECTOR_KEY_ICMP = 6, + FLOW_DISSECTOR_KEY_ETH_ADDRS = 7, + FLOW_DISSECTOR_KEY_TIPC = 8, + FLOW_DISSECTOR_KEY_ARP = 9, + FLOW_DISSECTOR_KEY_VLAN = 10, + FLOW_DISSECTOR_KEY_FLOW_LABEL = 11, + FLOW_DISSECTOR_KEY_GRE_KEYID = 12, + FLOW_DISSECTOR_KEY_MPLS_ENTROPY = 13, + FLOW_DISSECTOR_KEY_ENC_KEYID = 14, + FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS = 15, + FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS = 16, + FLOW_DISSECTOR_KEY_ENC_CONTROL = 17, + FLOW_DISSECTOR_KEY_ENC_PORTS = 18, + FLOW_DISSECTOR_KEY_MPLS = 19, + FLOW_DISSECTOR_KEY_TCP = 20, + FLOW_DISSECTOR_KEY_IP = 21, + FLOW_DISSECTOR_KEY_CVLAN = 22, + FLOW_DISSECTOR_KEY_ENC_IP = 23, + FLOW_DISSECTOR_KEY_ENC_OPTS = 24, + FLOW_DISSECTOR_KEY_META = 25, + FLOW_DISSECTOR_KEY_CT = 26, + FLOW_DISSECTOR_KEY_HASH = 27, + FLOW_DISSECTOR_KEY_NUM_OF_VLANS = 28, + FLOW_DISSECTOR_KEY_PPPOE = 29, + FLOW_DISSECTOR_KEY_L2TPV3 = 30, + FLOW_DISSECTOR_KEY_MAX = 31, +}; + +struct page_pool_recycle_stats { + u64 cached; + u64 cache_full; + u64 ring; + u64 ring_full; + u64 released_refcnt; +}; + +struct skb_ext { + refcount_t refcnt; + u8 offset[2]; + u8 chunks; + long: 0; + char data[0]; +}; + +enum skb_ext_id { + SKB_EXT_BRIDGE_NF = 0, + SKB_EXT_SEC_PATH = 1, + SKB_EXT_NUM = 2, +}; + +struct trace_event_raw_initcall_level { + struct trace_entry ent; + u32 __data_loc_level; + char __data[0]; +}; + +struct trace_event_raw_initcall_start { + struct trace_entry ent; + initcall_t func; + char __data[0]; +}; + +struct trace_event_raw_initcall_finish { + struct trace_entry ent; + initcall_t func; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_initcall_level { + u32 level; +}; + +struct trace_event_data_offsets_initcall_start {}; + +struct trace_event_data_offsets_initcall_finish {}; + +typedef void (*btf_trace_initcall_level)(void *, const char *); + +typedef void (*btf_trace_initcall_start)(void *, initcall_t); + +typedef void (*btf_trace_initcall_finish)(void *, initcall_t, int); + +struct blacklist_entry { + struct list_head next; + char *buf; +}; + +struct elf32_note { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +}; + +enum pcpu_fc { + PCPU_FC_AUTO = 0, + PCPU_FC_EMBED = 1, + PCPU_FC_PAGE = 2, + PCPU_FC_NR = 3, +}; + +enum hrtimer_base_type { + HRTIMER_BASE_MONOTONIC = 0, + HRTIMER_BASE_REALTIME = 1, + HRTIMER_BASE_BOOTTIME = 2, + HRTIMER_BASE_TAI = 3, + HRTIMER_BASE_MONOTONIC_SOFT = 4, + HRTIMER_BASE_REALTIME_SOFT = 5, + HRTIMER_BASE_BOOTTIME_SOFT = 6, + HRTIMER_BASE_TAI_SOFT = 7, + HRTIMER_MAX_CLOCK_BASES = 8, +}; + +enum rseq_cs_flags_bit { + RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT = 0, + RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT = 1, + RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT = 2, +}; + +enum { + TASK_COMM_LEN = 16, +}; + +enum rseq_event_mask_bits { + RSEQ_EVENT_PREEMPT_BIT = 0, + RSEQ_EVENT_SIGNAL_BIT = 1, + RSEQ_EVENT_MIGRATE_BIT = 2, +}; + +enum { + PROC_ROOT_INO = 1, + PROC_IPC_INIT_INO = 4026531839, + PROC_UTS_INIT_INO = 4026531838, + PROC_USER_INIT_INO = 4026531837, + PROC_PID_INIT_INO = 4026531836, + PROC_CGROUP_INIT_INO = 4026531835, + PROC_TIME_INIT_INO = 4026531834, +}; + +typedef __u64 __be64; + +typedef unsigned int slab_flags_t; + +struct fs_struct { + int users; + spinlock_t lock; + seqcount_spinlock_t seq; + int umask; + int in_exec; + struct path root; + struct path pwd; +}; + +typedef __u64 __addrpair; + +typedef __u32 __portpair; + +typedef struct { + struct net *net; +} possible_net_t; + +struct hlist_nulls_node { + struct hlist_nulls_node *next; + struct hlist_nulls_node **pprev; +}; + +struct proto; + +struct sock_common { + union { + __addrpair skc_addrpair; + struct { + __be32 skc_daddr; + __be32 skc_rcv_saddr; + }; + }; + union { + unsigned int skc_hash; + __u16 skc_u16hashes[2]; + }; + union { + __portpair skc_portpair; + struct { + __be16 skc_dport; + __u16 skc_num; + }; + }; + short unsigned int skc_family; + volatile unsigned char skc_state; + unsigned char skc_reuse: 4; + unsigned char skc_reuseport: 1; + unsigned char skc_ipv6only: 1; + unsigned char skc_net_refcnt: 1; + int skc_bound_dev_if; + union { + struct hlist_node skc_bind_node; + struct hlist_node skc_portaddr_node; + }; + struct proto *skc_prot; + possible_net_t skc_net; + struct in6_addr skc_v6_daddr; + struct in6_addr skc_v6_rcv_saddr; + atomic64_t skc_cookie; + union { + long unsigned int skc_flags; + struct sock *skc_listener; + struct inet_timewait_death_row *skc_tw_dr; + }; + int skc_dontcopy_begin[0]; + union { + struct hlist_node skc_node; + struct hlist_nulls_node skc_nulls_node; + }; + short unsigned int skc_tx_queue_mapping; + short unsigned int skc_rx_queue_mapping; + union { + int skc_incoming_cpu; + u32 skc_rcv_wnd; + u32 skc_tw_rcv_nxt; + }; + refcount_t skc_refcnt; + int skc_dontcopy_end[0]; + union { + u32 skc_rxhash; + u32 skc_window_clamp; + u32 skc_tw_snd_nxt; + }; + long: 32; +}; + +typedef struct { + spinlock_t slock; + int owned; + wait_queue_head_t wq; +} socket_lock_t; + +typedef u64 netdev_features_t; + +struct sock_cgroup_data { + struct cgroup *cgroup; + u32 classid; + u16 prioidx; +}; + +typedef struct {} netns_tracker; + +struct sk_filter; + +struct socket_wq; + +struct xfrm_policy; + +struct socket; + +struct sock_reuseport; + +struct sock { + struct sock_common __sk_common; + struct dst_entry *sk_rx_dst; + int sk_rx_dst_ifindex; + u32 sk_rx_dst_cookie; + socket_lock_t sk_lock; + atomic_t sk_drops; + int sk_rcvlowat; + struct sk_buff_head sk_error_queue; + struct sk_buff_head sk_receive_queue; + struct { + atomic_t rmem_alloc; + int len; + struct sk_buff *head; + struct sk_buff *tail; + } sk_backlog; + int sk_forward_alloc; + u32 sk_reserved_mem; + unsigned int sk_ll_usec; + unsigned int sk_napi_id; + int sk_rcvbuf; + struct sk_filter *sk_filter; + union { + struct socket_wq *sk_wq; + struct socket_wq *sk_wq_raw; + }; + struct xfrm_policy *sk_policy[2]; + struct dst_entry *sk_dst_cache; + atomic_t sk_omem_alloc; + int sk_sndbuf; + int sk_wmem_queued; + refcount_t sk_wmem_alloc; + long unsigned int sk_tsq_flags; + union { + struct sk_buff *sk_send_head; + struct rb_root tcp_rtx_queue; + }; + struct sk_buff_head sk_write_queue; + __s32 sk_peek_off; + int sk_write_pending; + __u32 sk_dst_pending_confirm; + u32 sk_pacing_status; + long int sk_sndtimeo; + struct timer_list sk_timer; + __u32 sk_priority; + __u32 sk_mark; + long unsigned int sk_pacing_rate; + long unsigned int sk_max_pacing_rate; + struct page_frag sk_frag; + netdev_features_t sk_route_caps; + int sk_gso_type; + unsigned int sk_gso_max_size; + gfp_t sk_allocation; + __u32 sk_txhash; + u8 sk_gso_disabled: 1; + u8 sk_kern_sock: 1; + u8 sk_no_check_tx: 1; + u8 sk_no_check_rx: 1; + u8 sk_userlocks: 4; + u8 sk_pacing_shift; + u16 sk_type; + u16 sk_protocol; + u16 sk_gso_max_segs; + long unsigned int sk_lingertime; + struct proto *sk_prot_creator; + rwlock_t sk_callback_lock; + int sk_err; + int sk_err_soft; + u32 sk_ack_backlog; + u32 sk_max_ack_backlog; + kuid_t sk_uid; + u8 sk_txrehash; + u8 sk_prefer_busy_poll; + u16 sk_busy_poll_budget; + spinlock_t sk_peer_lock; + int sk_bind_phc; + struct pid *sk_peer_pid; + const struct cred *sk_peer_cred; + long int sk_rcvtimeo; + ktime_t sk_stamp; + seqlock_t sk_stamp_seq; + atomic_t sk_tskey; + atomic_t sk_zckey; + u32 sk_tsflags; + u8 sk_shutdown; + u8 sk_clockid; + u8 sk_txtime_deadline_mode: 1; + u8 sk_txtime_report_errors: 1; + u8 sk_txtime_unused: 6; + bool sk_use_task_frag; + struct socket *sk_socket; + void *sk_user_data; + void *sk_security; + struct sock_cgroup_data sk_cgrp_data; + struct mem_cgroup *sk_memcg; + void (*sk_state_change)(struct sock *); + void (*sk_data_ready)(struct sock *); + void (*sk_write_space)(struct sock *); + void (*sk_error_report)(struct sock *); + int (*sk_backlog_rcv)(struct sock *, struct sk_buff *); + void (*sk_destruct)(struct sock *); + struct sock_reuseport *sk_reuseport_cb; + struct bpf_local_storage *sk_bpf_storage; + struct callback_head sk_rcu; + netns_tracker ns_tracker; + struct hlist_node sk_bind2_node; + long: 32; +}; + +struct ld_semaphore { + atomic_long_t count; + raw_spinlock_t wait_lock; + unsigned int wait_readers; + struct list_head read_wait; + struct list_head write_wait; +}; + +typedef unsigned int tcflag_t; + +typedef unsigned char cc_t; + +typedef unsigned int speed_t; + +struct ktermios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +struct winsize { + short unsigned int ws_row; + short unsigned int ws_col; + short unsigned int ws_xpixel; + short unsigned int ws_ypixel; +}; + +struct tty_driver; + +struct tty_operations; + +struct tty_ldisc; + +struct tty_port; + +struct tty_struct { + struct kref kref; + struct device *dev; + struct tty_driver *driver; + const struct tty_operations *ops; + int index; + struct ld_semaphore ldisc_sem; + struct tty_ldisc *ldisc; + struct mutex atomic_write_lock; + struct mutex legacy_mutex; + struct mutex throttle_mutex; + struct rw_semaphore termios_rwsem; + struct mutex winsize_mutex; + struct ktermios termios; + struct ktermios termios_locked; + char name[64]; + long unsigned int flags; + int count; + struct winsize winsize; + struct { + spinlock_t lock; + bool stopped; + bool tco_stopped; + long unsigned int unused[0]; + } flow; + struct { + spinlock_t lock; + struct pid *pgrp; + struct pid *session; + unsigned char pktstatus; + bool packet; + long unsigned int unused[0]; + } ctrl; + int hw_stopped; + unsigned int receive_room; + int flow_change; + struct tty_struct *link; + struct fasync_struct *fasync; + wait_queue_head_t write_wait; + wait_queue_head_t read_wait; + struct work_struct hangup_work; + void *disc_data; + void *driver_data; + spinlock_t files_lock; + struct list_head tty_files; + int closing; + unsigned char *write_buf; + int write_cnt; + struct work_struct SAK_work; + struct tty_port *port; +}; + +struct posix_acl_entry { + short int e_tag; + short unsigned int e_perm; + union { + kuid_t e_uid; + kgid_t e_gid; + }; +}; + +struct posix_acl { + refcount_t a_refcount; + struct callback_head a_rcu; + unsigned int a_count; + struct posix_acl_entry a_entries[0]; +}; + +struct tty_buffer { + union { + struct tty_buffer *next; + struct llist_node free; + }; + int used; + int size; + int commit; + int lookahead; + int read; + bool flags; + long unsigned int data[0]; +}; + +struct tty_bufhead { + struct tty_buffer *head; + struct work_struct work; + struct mutex lock; + atomic_t priority; + struct tty_buffer sentinel; + struct llist_head free; + atomic_t mem_used; + int mem_limit; + struct tty_buffer *tail; +}; + +struct serial_icounter_struct; + +struct serial_struct; + +struct tty_operations { + struct tty_struct * (*lookup)(struct tty_driver *, struct file *, int); + int (*install)(struct tty_driver *, struct tty_struct *); + void (*remove)(struct tty_driver *, struct tty_struct *); + int (*open)(struct tty_struct *, struct file *); + void (*close)(struct tty_struct *, struct file *); + void (*shutdown)(struct tty_struct *); + void (*cleanup)(struct tty_struct *); + int (*write)(struct tty_struct *, const unsigned char *, int); + int (*put_char)(struct tty_struct *, unsigned char); + void (*flush_chars)(struct tty_struct *); + unsigned int (*write_room)(struct tty_struct *); + unsigned int (*chars_in_buffer)(struct tty_struct *); + int (*ioctl)(struct tty_struct *, unsigned int, long unsigned int); + long int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int); + void (*set_termios)(struct tty_struct *, const struct ktermios *); + void (*throttle)(struct tty_struct *); + void (*unthrottle)(struct tty_struct *); + void (*stop)(struct tty_struct *); + void (*start)(struct tty_struct *); + void (*hangup)(struct tty_struct *); + int (*break_ctl)(struct tty_struct *, int); + void (*flush_buffer)(struct tty_struct *); + void (*set_ldisc)(struct tty_struct *); + void (*wait_until_sent)(struct tty_struct *, int); + void (*send_xchar)(struct tty_struct *, char); + int (*tiocmget)(struct tty_struct *); + int (*tiocmset)(struct tty_struct *, unsigned int, unsigned int); + int (*resize)(struct tty_struct *, struct winsize *); + int (*get_icount)(struct tty_struct *, struct serial_icounter_struct *); + int (*get_serial)(struct tty_struct *, struct serial_struct *); + int (*set_serial)(struct tty_struct *, struct serial_struct *); + void (*show_fdinfo)(struct tty_struct *, struct seq_file *); + int (*proc_show)(struct seq_file *, void *); +}; + +struct tty_driver { + struct kref kref; + struct cdev **cdevs; + struct module *owner; + const char *driver_name; + const char *name; + int name_base; + int major; + int minor_start; + unsigned int num; + short int type; + short int subtype; + struct ktermios init_termios; + long unsigned int flags; + struct proc_dir_entry *proc_entry; + struct tty_driver *other; + struct tty_struct **ttys; + struct tty_port **ports; + struct ktermios **termios; + void *driver_state; + const struct tty_operations *ops; + struct list_head tty_drivers; +}; + +struct __kfifo { + unsigned int in; + unsigned int out; + unsigned int mask; + unsigned int esize; + void *data; +}; + +struct tty_port_operations; + +struct tty_port_client_operations; + +struct tty_port { + struct tty_bufhead buf; + struct tty_struct *tty; + struct tty_struct *itty; + const struct tty_port_operations *ops; + const struct tty_port_client_operations *client_ops; + spinlock_t lock; + int blocked_open; + int count; + wait_queue_head_t open_wait; + wait_queue_head_t delta_msr_wait; + long unsigned int flags; + long unsigned int iflags; + unsigned char console: 1; + struct mutex mutex; + struct mutex buf_mutex; + unsigned char *xmit_buf; + struct { + union { + struct __kfifo kfifo; + unsigned char *type; + const unsigned char *const_type; + char (*rectype)[0]; + unsigned char *ptr; + const unsigned char *ptr_const; + }; + unsigned char buf[0]; + } xmit_fifo; + unsigned int close_delay; + unsigned int closing_wait; + int drain_delay; + struct kref kref; + void *client_data; +}; + +struct tty_ldisc_ops { + char *name; + int num; + int (*open)(struct tty_struct *); + void (*close)(struct tty_struct *); + void (*flush_buffer)(struct tty_struct *); + ssize_t (*read)(struct tty_struct *, struct file *, unsigned char *, size_t, void **, long unsigned int); + ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t); + int (*ioctl)(struct tty_struct *, unsigned int, long unsigned int); + int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int); + void (*set_termios)(struct tty_struct *, const struct ktermios *); + __poll_t (*poll)(struct tty_struct *, struct file *, struct poll_table_struct *); + void (*hangup)(struct tty_struct *); + void (*receive_buf)(struct tty_struct *, const unsigned char *, const char *, int); + void (*write_wakeup)(struct tty_struct *); + void (*dcd_change)(struct tty_struct *, unsigned int); + int (*receive_buf2)(struct tty_struct *, const unsigned char *, const char *, int); + void (*lookahead_buf)(struct tty_struct *, const unsigned char *, const unsigned char *, unsigned int); + struct module *owner; +}; + +struct tty_ldisc { + struct tty_ldisc_ops *ops; + struct tty_struct *tty; +}; + +struct scatterlist { + long unsigned int page_link; + unsigned int offset; + unsigned int length; + long: 32; + dma_addr_t dma_address; + unsigned int dma_length; + long: 32; +}; + +struct tty_port_operations { + int (*carrier_raised)(struct tty_port *); + void (*dtr_rts)(struct tty_port *, int); + void (*shutdown)(struct tty_port *); + int (*activate)(struct tty_port *, struct tty_struct *); + void (*destruct)(struct tty_port *); +}; + +struct tty_port_client_operations { + int (*receive_buf)(struct tty_port *, const unsigned char *, const unsigned char *, size_t); + void (*lookahead_buf)(struct tty_port *, const unsigned char *, const unsigned char *, unsigned int); + void (*write_wakeup)(struct tty_port *); +}; + +typedef struct { + u64 v; +} u64_stats_t; + +enum { + Root_NFS = 255, + Root_CIFS = 254, + Root_RAM0 = 1048576, + Root_RAM1 = 1048577, + Root_FD0 = 2097152, + Root_HDA1 = 3145729, + Root_HDA2 = 3145730, + Root_SDA1 = 8388609, + Root_SDA2 = 8388610, + Root_HDC1 = 23068673, + Root_SR0 = 11534336, +}; + +typedef struct { + union { + void *kernel; + void *user; + }; + bool is_kernel: 1; +} sockptr_t; + +typedef short unsigned int __kernel_sa_family_t; + +typedef __kernel_sa_family_t sa_family_t; + +struct sockaddr { + sa_family_t sa_family; + union { + char sa_data_min[14]; + struct { + struct {} __empty_sa_data; + char sa_data[0]; + }; + }; +}; + +struct ubuf_info; + +struct msghdr { + void *msg_name; + int msg_namelen; + int msg_inq; + long: 32; + struct iov_iter msg_iter; + union { + void *msg_control; + void *msg_control_user; + }; + bool msg_control_is_user: 1; + bool msg_get_inq: 1; + unsigned int msg_flags; + __kernel_size_t msg_controllen; + struct kiocb *msg_iocb; + struct ubuf_info *msg_ubuf; + int (*sg_from_iter)(struct sock *, struct sk_buff *, struct iov_iter *, size_t); + long: 32; +}; + +struct ubuf_info { + void (*callback)(struct sk_buff *, struct ubuf_info *, bool); + refcount_t refcnt; + u8 flags; +}; + +enum { + IPPROTO_IP = 0, + IPPROTO_ICMP = 1, + IPPROTO_IGMP = 2, + IPPROTO_IPIP = 4, + IPPROTO_TCP = 6, + IPPROTO_EGP = 8, + IPPROTO_PUP = 12, + IPPROTO_UDP = 17, + IPPROTO_IDP = 22, + IPPROTO_TP = 29, + IPPROTO_DCCP = 33, + IPPROTO_IPV6 = 41, + IPPROTO_RSVP = 46, + IPPROTO_GRE = 47, + IPPROTO_ESP = 50, + IPPROTO_AH = 51, + IPPROTO_MTP = 92, + IPPROTO_BEETPH = 94, + IPPROTO_ENCAP = 98, + IPPROTO_PIM = 103, + IPPROTO_COMP = 108, + IPPROTO_L2TP = 115, + IPPROTO_SCTP = 132, + IPPROTO_UDPLITE = 136, + IPPROTO_MPLS = 137, + IPPROTO_ETHERNET = 143, + IPPROTO_RAW = 255, + IPPROTO_MPTCP = 262, + IPPROTO_MAX = 263, +}; + +struct flowi_tunnel { + __be64 tun_id; +}; + +struct flowi_common { + int flowic_oif; + int flowic_iif; + int flowic_l3mdev; + __u32 flowic_mark; + __u8 flowic_tos; + __u8 flowic_scope; + __u8 flowic_proto; + __u8 flowic_flags; + __u32 flowic_secid; + kuid_t flowic_uid; + long: 32; + struct flowi_tunnel flowic_tun_key; + __u32 flowic_multipath_hash; + long: 32; +}; + +union flowi_uli { + struct { + __be16 dport; + __be16 sport; + } ports; + struct { + __u8 type; + __u8 code; + } icmpt; + __be32 gre_key; + struct { + __u8 type; + } mht; +}; + +struct flowi4 { + struct flowi_common __fl_common; + __be32 saddr; + __be32 daddr; + union flowi_uli uli; + long: 32; +}; + +struct flowi6 { + struct flowi_common __fl_common; + struct in6_addr daddr; + struct in6_addr saddr; + __be32 flowlabel; + union flowi_uli uli; + __u32 mp_hash; + long: 32; +}; + +struct flowi { + union { + struct flowi_common __fl_common; + struct flowi4 ip4; + struct flowi6 ip6; + } u; +}; + +struct prot_inuse { + int all; + int val[64]; +}; + +struct icmpv6_mib_device { + atomic_long_t mibs[7]; +}; + +struct icmpv6msg_mib_device { + atomic_long_t mibs[512]; +}; + +struct fib_rule; + +struct fib_lookup_arg; + +struct fib_rule_hdr; + +struct nlattr; + +struct netlink_ext_ack; + +struct fib_rules_ops { + int family; + struct list_head list; + int rule_size; + int addr_size; + int unresolved_rules; + int nr_goto_rules; + unsigned int fib_rules_seq; + int (*action)(struct fib_rule *, struct flowi *, int, struct fib_lookup_arg *); + bool (*suppress)(struct fib_rule *, int, struct fib_lookup_arg *); + int (*match)(struct fib_rule *, struct flowi *, int); + int (*configure)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *, struct nlattr **, struct netlink_ext_ack *); + int (*delete)(struct fib_rule *); + int (*compare)(struct fib_rule *, struct fib_rule_hdr *, struct nlattr **); + int (*fill)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *); + size_t (*nlmsg_payload)(struct fib_rule *); + void (*flush_cache)(struct fib_rules_ops *); + int nlgroup; + struct list_head rules_list; + struct module *owner; + struct net *fro_net; + struct callback_head rcu; +}; + +struct fib_notifier_ops { + int family; + struct list_head list; + unsigned int (*fib_seq_read)(struct net *); + int (*fib_dump)(struct net *, struct notifier_block *, struct netlink_ext_ack *); + struct module *owner; + struct callback_head rcu; +}; + +typedef u32 xdp_features_t; + +struct net_device_stats { + union { + long unsigned int rx_packets; + atomic_long_t __rx_packets; + }; + union { + long unsigned int tx_packets; + atomic_long_t __tx_packets; + }; + union { + long unsigned int rx_bytes; + atomic_long_t __rx_bytes; + }; + union { + long unsigned int tx_bytes; + atomic_long_t __tx_bytes; + }; + union { + long unsigned int rx_errors; + atomic_long_t __rx_errors; + }; + union { + long unsigned int tx_errors; + atomic_long_t __tx_errors; + }; + union { + long unsigned int rx_dropped; + atomic_long_t __rx_dropped; + }; + union { + long unsigned int tx_dropped; + atomic_long_t __tx_dropped; + }; + union { + long unsigned int multicast; + atomic_long_t __multicast; + }; + union { + long unsigned int collisions; + atomic_long_t __collisions; + }; + union { + long unsigned int rx_length_errors; + atomic_long_t __rx_length_errors; + }; + union { + long unsigned int rx_over_errors; + atomic_long_t __rx_over_errors; + }; + union { + long unsigned int rx_crc_errors; + atomic_long_t __rx_crc_errors; + }; + union { + long unsigned int rx_frame_errors; + atomic_long_t __rx_frame_errors; + }; + union { + long unsigned int rx_fifo_errors; + atomic_long_t __rx_fifo_errors; + }; + union { + long unsigned int rx_missed_errors; + atomic_long_t __rx_missed_errors; + }; + union { + long unsigned int tx_aborted_errors; + atomic_long_t __tx_aborted_errors; + }; + union { + long unsigned int tx_carrier_errors; + atomic_long_t __tx_carrier_errors; + }; + union { + long unsigned int tx_fifo_errors; + atomic_long_t __tx_fifo_errors; + }; + union { + long unsigned int tx_heartbeat_errors; + atomic_long_t __tx_heartbeat_errors; + }; + union { + long unsigned int tx_window_errors; + atomic_long_t __tx_window_errors; + }; + union { + long unsigned int rx_compressed; + atomic_long_t __rx_compressed; + }; + union { + long unsigned int tx_compressed; + atomic_long_t __tx_compressed; + }; +}; + +struct netdev_hw_addr_list { + struct list_head list; + int count; + struct rb_root tree; +}; + +struct tipc_bearer; + +struct mpls_dev; + +enum rx_handler_result { + RX_HANDLER_CONSUMED = 0, + RX_HANDLER_ANOTHER = 1, + RX_HANDLER_EXACT = 2, + RX_HANDLER_PASS = 3, +}; + +typedef enum rx_handler_result rx_handler_result_t; + +typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **); + +enum netdev_ml_priv_type { + ML_PRIV_NONE = 0, + ML_PRIV_CAN = 1, +}; + +struct pcpu_dstats; + +struct garp_port; + +struct mrp_port; + +struct dm_hw_stat_delta; + +struct netdev_tc_txq { + u16 count; + u16 offset; +}; + +struct udp_tunnel_nic; + +struct bpf_xdp_link; + +struct bpf_xdp_entity { + struct bpf_prog *prog; + struct bpf_xdp_link *link; +}; + +struct netdev_name_node; + +struct dev_ifalias; + +struct net_device_ops; + +struct xdp_metadata_ops; + +struct net_device_core_stats; + +struct iw_handler_def; + +struct iw_public_data; + +struct ethtool_ops; + +struct l3mdev_ops; + +struct ndisc_ops; + +struct xfrmdev_ops; + +struct header_ops; + +struct in_device; + +struct inet6_dev; + +struct vlan_info; + +struct dsa_port; + +struct wireless_dev; + +struct wpan_dev; + +struct netdev_rx_queue; + +struct mini_Qdisc; + +struct netdev_queue; + +struct cpu_rmap; + +struct Qdisc; + +struct xdp_dev_bulk_queue; + +struct xps_dev_maps; + +struct netpoll_info; + +struct pcpu_lstats; + +struct pcpu_sw_netstats; + +struct rtnl_link_ops; + +struct dcbnl_rtnl_ops; + +struct netprio_map; + +struct phy_device; + +struct sfp_bus; + +struct macsec_ops; + +struct udp_tunnel_nic_info; + +struct rtnl_hw_stats64; + +struct devlink_port; + +struct net_device { + char name[16]; + struct netdev_name_node *name_node; + struct dev_ifalias *ifalias; + long unsigned int mem_end; + long unsigned int mem_start; + long unsigned int base_addr; + long unsigned int state; + struct list_head dev_list; + struct list_head napi_list; + struct list_head unreg_list; + struct list_head close_list; + struct list_head ptype_all; + struct list_head ptype_specific; + struct { + struct list_head upper; + struct list_head lower; + } adj_list; + unsigned int flags; + xdp_features_t xdp_features; + long long unsigned int priv_flags; + const struct net_device_ops *netdev_ops; + const struct xdp_metadata_ops *xdp_metadata_ops; + int ifindex; + short unsigned int gflags; + short unsigned int hard_header_len; + unsigned int mtu; + short unsigned int needed_headroom; + short unsigned int needed_tailroom; + netdev_features_t features; + netdev_features_t hw_features; + netdev_features_t wanted_features; + netdev_features_t vlan_features; + netdev_features_t hw_enc_features; + netdev_features_t mpls_features; + netdev_features_t gso_partial_features; + unsigned int min_mtu; + unsigned int max_mtu; + short unsigned int type; + unsigned char min_header_len; + unsigned char name_assign_type; + int group; + struct net_device_stats stats; + struct net_device_core_stats *core_stats; + atomic_t carrier_up_count; + atomic_t carrier_down_count; + const struct iw_handler_def *wireless_handlers; + struct iw_public_data *wireless_data; + const struct ethtool_ops *ethtool_ops; + const struct l3mdev_ops *l3mdev_ops; + const struct ndisc_ops *ndisc_ops; + const struct xfrmdev_ops *xfrmdev_ops; + const struct header_ops *header_ops; + unsigned char operstate; + unsigned char link_mode; + unsigned char if_port; + unsigned char dma; + unsigned char perm_addr[32]; + unsigned char addr_assign_type; + unsigned char addr_len; + unsigned char upper_level; + unsigned char lower_level; + short unsigned int neigh_priv_len; + short unsigned int dev_id; + short unsigned int dev_port; + short unsigned int padded; + spinlock_t addr_list_lock; + int irq; + struct netdev_hw_addr_list uc; + struct netdev_hw_addr_list mc; + struct netdev_hw_addr_list dev_addrs; + struct kset *queues_kset; + unsigned int promiscuity; + unsigned int allmulti; + bool uc_promisc; + struct in_device *ip_ptr; + struct inet6_dev *ip6_ptr; + struct vlan_info *vlan_info; + struct dsa_port *dsa_ptr; + struct tipc_bearer *tipc_ptr; + void *atalk_ptr; + void *ax25_ptr; + struct wireless_dev *ieee80211_ptr; + struct wpan_dev *ieee802154_ptr; + struct mpls_dev *mpls_ptr; + const unsigned char *dev_addr; + struct netdev_rx_queue *_rx; + unsigned int num_rx_queues; + unsigned int real_num_rx_queues; + struct bpf_prog *xdp_prog; + long unsigned int gro_flush_timeout; + int napi_defer_hard_irqs; + unsigned int gro_max_size; + unsigned int gro_ipv4_max_size; + rx_handler_func_t *rx_handler; + void *rx_handler_data; + struct mini_Qdisc *miniq_ingress; + struct netdev_queue *ingress_queue; + struct nf_hook_entries *nf_hooks_ingress; + unsigned char broadcast[32]; + struct cpu_rmap *rx_cpu_rmap; + struct hlist_node index_hlist; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct netdev_queue *_tx; + unsigned int num_tx_queues; + unsigned int real_num_tx_queues; + struct Qdisc *qdisc; + unsigned int tx_queue_len; + spinlock_t tx_global_lock; + struct xdp_dev_bulk_queue *xdp_bulkq; + struct xps_dev_maps *xps_maps[2]; + struct mini_Qdisc *miniq_egress; + struct nf_hook_entries *nf_hooks_egress; + struct hlist_head qdisc_hash[16]; + struct timer_list watchdog_timer; + int watchdog_timeo; + u32 proto_down_reason; + struct list_head todo_list; + int *pcpu_refcnt; + struct ref_tracker_dir refcnt_tracker; + struct list_head link_watch_list; + enum { + NETREG_UNINITIALIZED = 0, + NETREG_REGISTERED = 1, + NETREG_UNREGISTERING = 2, + NETREG_UNREGISTERED = 3, + NETREG_RELEASED = 4, + NETREG_DUMMY = 5, + } reg_state: 8; + bool dismantle; + enum { + RTNL_LINK_INITIALIZED = 0, + RTNL_LINK_INITIALIZING = 1, + } rtnl_link_state: 16; + bool needs_free_netdev; + void (*priv_destructor)(struct net_device *); + struct netpoll_info *npinfo; + possible_net_t nd_net; + void *ml_priv; + enum netdev_ml_priv_type ml_priv_type; + union { + struct pcpu_lstats *lstats; + struct pcpu_sw_netstats *tstats; + struct pcpu_dstats *dstats; + }; + struct garp_port *garp_port; + struct mrp_port *mrp_port; + struct dm_hw_stat_delta *dm_private; + struct device dev; + const struct attribute_group *sysfs_groups[4]; + const struct attribute_group *sysfs_rx_queue_group; + const struct rtnl_link_ops *rtnl_link_ops; + unsigned int gso_max_size; + unsigned int tso_max_size; + u16 gso_max_segs; + u16 tso_max_segs; + unsigned int gso_ipv4_max_size; + const struct dcbnl_rtnl_ops *dcbnl_ops; + s16 num_tc; + struct netdev_tc_txq tc_to_txq[16]; + u8 prio_tc_map[16]; + unsigned int fcoe_ddp_xid; + struct netprio_map *priomap; + struct phy_device *phydev; + struct sfp_bus *sfp_bus; + struct lock_class_key *qdisc_tx_busylock; + bool proto_down; + unsigned int wol_enabled: 1; + unsigned int threaded: 1; + struct list_head net_notifier_list; + const struct macsec_ops *macsec_ops; + const struct udp_tunnel_nic_info *udp_tunnel_nic_info; + struct udp_tunnel_nic *udp_tunnel_nic; + struct bpf_xdp_entity xdp_state[3]; + u8 dev_addr_shadow[32]; + netdevice_tracker linkwatch_dev_tracker; + netdevice_tracker watchdog_dev_tracker; + netdevice_tracker dev_registered_tracker; + struct rtnl_hw_stats64 *offload_xstats_l3; + struct devlink_port *devlink_port; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct hh_cache { + unsigned int hh_len; + seqlock_t hh_lock; + long unsigned int hh_data[32]; +}; + +struct neigh_table; + +struct neigh_parms; + +struct neigh_ops; + +struct neighbour { + struct neighbour *next; + struct neigh_table *tbl; + struct neigh_parms *parms; + long unsigned int confirmed; + long unsigned int updated; + rwlock_t lock; + refcount_t refcnt; + unsigned int arp_queue_len_bytes; + struct sk_buff_head arp_queue; + struct timer_list timer; + long unsigned int used; + atomic_t probes; + u8 nud_state; + u8 type; + u8 dead; + u8 protocol; + u32 flags; + seqlock_t ha_lock; + long: 32; + unsigned char ha[32]; + struct hh_cache hh; + int (*output)(struct neighbour *, struct sk_buff *); + const struct neigh_ops *ops; + struct list_head gc_list; + struct list_head managed_list; + struct callback_head rcu; + struct net_device *dev; + netdevice_tracker dev_tracker; + u8 primary_key[0]; +}; + +struct ipv6_stable_secret { + bool initialized; + struct in6_addr secret; +}; + +struct ipv6_devconf { + __s32 forwarding; + __s32 hop_limit; + __s32 mtu6; + __s32 accept_ra; + __s32 accept_redirects; + __s32 autoconf; + __s32 dad_transmits; + __s32 rtr_solicits; + __s32 rtr_solicit_interval; + __s32 rtr_solicit_max_interval; + __s32 rtr_solicit_delay; + __s32 force_mld_version; + __s32 mldv1_unsolicited_report_interval; + __s32 mldv2_unsolicited_report_interval; + __s32 use_tempaddr; + __s32 temp_valid_lft; + __s32 temp_prefered_lft; + __s32 regen_max_retry; + __s32 max_desync_factor; + __s32 max_addresses; + __s32 accept_ra_defrtr; + __u32 ra_defrtr_metric; + __s32 accept_ra_min_hop_limit; + __s32 accept_ra_pinfo; + __s32 ignore_routes_with_linkdown; + __s32 accept_ra_rtr_pref; + __s32 rtr_probe_interval; + __s32 accept_ra_rt_info_min_plen; + __s32 accept_ra_rt_info_max_plen; + __s32 proxy_ndp; + __s32 accept_source_route; + __s32 accept_ra_from_local; + __s32 optimistic_dad; + __s32 use_optimistic; + atomic_t mc_forwarding; + __s32 disable_ipv6; + __s32 drop_unicast_in_l2_multicast; + __s32 accept_dad; + __s32 force_tllao; + __s32 ndisc_notify; + __s32 suppress_frag_ndisc; + __s32 accept_ra_mtu; + __s32 drop_unsolicited_na; + __s32 accept_untracked_na; + struct ipv6_stable_secret stable_secret; + __s32 use_oif_addrs_only; + __s32 keep_addr_on_down; + __s32 seg6_enabled; + __s32 seg6_require_hmac; + __u32 enhanced_dad; + __u32 addr_gen_mode; + __s32 disable_policy; + __s32 ndisc_tclass; + __s32 rpl_seg_enabled; + __u32 ioam6_id; + __u32 ioam6_id_wide; + __u8 ioam6_enabled; + __u8 ndisc_evict_nocarrier; + struct ctl_table_header *sysctl_header; +}; + +struct skb_shared_hwtstamps { + union { + ktime_t hwtstamp; + void *netdev_data; + }; +}; + +enum rpc_display_format_t { + RPC_DISPLAY_ADDR = 0, + RPC_DISPLAY_PORT = 1, + RPC_DISPLAY_PROTO = 2, + RPC_DISPLAY_HEX_ADDR = 3, + RPC_DISPLAY_HEX_PORT = 4, + RPC_DISPLAY_NETID = 5, + RPC_DISPLAY_MAX = 6, +}; + +struct dql { + unsigned int num_queued; + unsigned int adj_limit; + unsigned int last_obj_cnt; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + unsigned int limit; + unsigned int num_completed; + unsigned int prev_ovlimit; + unsigned int prev_num_queued; + unsigned int prev_last_obj_cnt; + unsigned int lowest_slack; + long unsigned int slack_start_time; + unsigned int max_limit; + unsigned int min_limit; + unsigned int slack_hold_time; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct ieee_ets { + __u8 willing; + __u8 ets_cap; + __u8 cbs; + __u8 tc_tx_bw[8]; + __u8 tc_rx_bw[8]; + __u8 tc_tsa[8]; + __u8 prio_tc[8]; + __u8 tc_reco_bw[8]; + __u8 tc_reco_tsa[8]; + __u8 reco_prio_tc[8]; +}; + +struct ieee_maxrate { + __u64 tc_maxrate[8]; +}; + +struct ieee_qcn { + __u8 rpg_enable[8]; + __u32 rppp_max_rps[8]; + __u32 rpg_time_reset[8]; + __u32 rpg_byte_reset[8]; + __u32 rpg_threshold[8]; + __u32 rpg_max_rate[8]; + __u32 rpg_ai_rate[8]; + __u32 rpg_hai_rate[8]; + __u32 rpg_gd[8]; + __u32 rpg_min_dec_fac[8]; + __u32 rpg_min_rate[8]; + __u32 cndd_state_machine[8]; +}; + +struct ieee_qcn_stats { + __u64 rppp_rp_centiseconds[8]; + __u32 rppp_created_rps[8]; +}; + +struct ieee_pfc { + __u8 pfc_cap; + __u8 pfc_en; + __u8 mbc; + __u16 delay; + __u64 requests[8]; + __u64 indications[8]; +}; + +struct dcbnl_buffer { + __u8 prio2buffer[8]; + __u32 buffer_size[8]; + __u32 total_size; +}; + +struct cee_pg { + __u8 willing; + __u8 error; + __u8 pg_en; + __u8 tcs_supported; + __u8 pg_bw[8]; + __u8 prio_pg[8]; +}; + +struct cee_pfc { + __u8 willing; + __u8 error; + __u8 pfc_en; + __u8 tcs_supported; +}; + +struct dcb_app { + __u8 selector; + __u8 priority; + __u16 protocol; +}; + +struct dcb_peer_app_info { + __u8 willing; + __u8 error; +}; + +struct dcbnl_rtnl_ops { + int (*ieee_getets)(struct net_device *, struct ieee_ets *); + int (*ieee_setets)(struct net_device *, struct ieee_ets *); + int (*ieee_getmaxrate)(struct net_device *, struct ieee_maxrate *); + int (*ieee_setmaxrate)(struct net_device *, struct ieee_maxrate *); + int (*ieee_getqcn)(struct net_device *, struct ieee_qcn *); + int (*ieee_setqcn)(struct net_device *, struct ieee_qcn *); + int (*ieee_getqcnstats)(struct net_device *, struct ieee_qcn_stats *); + int (*ieee_getpfc)(struct net_device *, struct ieee_pfc *); + int (*ieee_setpfc)(struct net_device *, struct ieee_pfc *); + int (*ieee_getapp)(struct net_device *, struct dcb_app *); + int (*ieee_setapp)(struct net_device *, struct dcb_app *); + int (*ieee_delapp)(struct net_device *, struct dcb_app *); + int (*ieee_peer_getets)(struct net_device *, struct ieee_ets *); + int (*ieee_peer_getpfc)(struct net_device *, struct ieee_pfc *); + u8 (*getstate)(struct net_device *); + u8 (*setstate)(struct net_device *, u8); + void (*getpermhwaddr)(struct net_device *, u8 *); + void (*setpgtccfgtx)(struct net_device *, int, u8, u8, u8, u8); + void (*setpgbwgcfgtx)(struct net_device *, int, u8); + void (*setpgtccfgrx)(struct net_device *, int, u8, u8, u8, u8); + void (*setpgbwgcfgrx)(struct net_device *, int, u8); + void (*getpgtccfgtx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); + void (*getpgbwgcfgtx)(struct net_device *, int, u8 *); + void (*getpgtccfgrx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); + void (*getpgbwgcfgrx)(struct net_device *, int, u8 *); + void (*setpfccfg)(struct net_device *, int, u8); + void (*getpfccfg)(struct net_device *, int, u8 *); + u8 (*setall)(struct net_device *); + u8 (*getcap)(struct net_device *, int, u8 *); + int (*getnumtcs)(struct net_device *, int, u8 *); + int (*setnumtcs)(struct net_device *, int, u8); + u8 (*getpfcstate)(struct net_device *); + void (*setpfcstate)(struct net_device *, u8); + void (*getbcncfg)(struct net_device *, int, u32 *); + void (*setbcncfg)(struct net_device *, int, u32); + void (*getbcnrp)(struct net_device *, int, u8 *); + void (*setbcnrp)(struct net_device *, int, u8); + int (*setapp)(struct net_device *, u8, u16, u8); + int (*getapp)(struct net_device *, u8, u16); + u8 (*getfeatcfg)(struct net_device *, int, u8 *); + u8 (*setfeatcfg)(struct net_device *, int, u8); + u8 (*getdcbx)(struct net_device *); + u8 (*setdcbx)(struct net_device *, u8); + int (*peer_getappinfo)(struct net_device *, struct dcb_peer_app_info *, u16 *); + int (*peer_getapptable)(struct net_device *, struct dcb_app *); + int (*cee_peer_getpg)(struct net_device *, struct cee_pg *); + int (*cee_peer_getpfc)(struct net_device *, struct cee_pfc *); + int (*dcbnl_getbuffer)(struct net_device *, struct dcbnl_buffer *); + int (*dcbnl_setbuffer)(struct net_device *, struct dcbnl_buffer *); + int (*dcbnl_setapptrust)(struct net_device *, u8 *, int); + int (*dcbnl_getapptrust)(struct net_device *, u8 *, int *); + int (*dcbnl_setrewr)(struct net_device *, struct dcb_app *); + int (*dcbnl_delrewr)(struct net_device *, struct dcb_app *); +}; + +struct netprio_map { + struct callback_head rcu; + u32 priomap_len; + u32 priomap[0]; +}; + +struct xdp_mem_info { + u32 type; + u32 id; +}; + +struct xdp_rxq_info { + struct net_device *dev; + u32 queue_index; + u32 reg_state; + struct xdp_mem_info mem; + unsigned int napi_id; + u32 frag_size; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct xdp_txq_info { + struct net_device *dev; +}; + +struct xdp_buff { + void *data; + void *data_end; + void *data_meta; + void *data_hard_start; + struct xdp_rxq_info *rxq; + struct xdp_txq_info *txq; + u32 frame_sz; + u32 flags; +}; + +struct xdp_frame { + void *data; + u16 len; + u16 headroom; + u32 metasize; + struct xdp_mem_info mem; + struct net_device *dev_rx; + u32 frame_sz; + u32 flags; +}; + +typedef enum { + SS_FREE = 0, + SS_UNCONNECTED = 1, + SS_CONNECTING = 2, + SS_CONNECTED = 3, + SS_DISCONNECTING = 4, +} socket_state; + +struct socket_wq { + wait_queue_head_t wait; + struct fasync_struct *fasync_list; + long unsigned int flags; + struct callback_head rcu; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct proto_ops; + +struct socket { + socket_state state; + short int type; + long unsigned int flags; + struct file *file; + struct sock *sk; + const struct proto_ops *ops; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct socket_wq wq; +}; + +typedef struct { + size_t written; + size_t count; + union { + char *buf; + void *data; + } arg; + int error; +} read_descriptor_t; + +typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *, unsigned int, size_t); + +typedef int (*skb_read_actor_t)(struct sock *, struct sk_buff *); + +struct proto_ops { + int family; + struct module *owner; + int (*release)(struct socket *); + int (*bind)(struct socket *, struct sockaddr *, int); + int (*connect)(struct socket *, struct sockaddr *, int, int); + int (*socketpair)(struct socket *, struct socket *); + int (*accept)(struct socket *, struct socket *, int, bool); + int (*getname)(struct socket *, struct sockaddr *, int); + __poll_t (*poll)(struct file *, struct socket *, struct poll_table_struct *); + int (*ioctl)(struct socket *, unsigned int, long unsigned int); + int (*gettstamp)(struct socket *, void *, bool, bool); + int (*listen)(struct socket *, int); + int (*shutdown)(struct socket *, int); + int (*setsockopt)(struct socket *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct socket *, int, int, char *, int *); + void (*show_fdinfo)(struct seq_file *, struct socket *); + int (*sendmsg)(struct socket *, struct msghdr *, size_t); + int (*recvmsg)(struct socket *, struct msghdr *, size_t, int); + int (*mmap)(struct file *, struct socket *, struct vm_area_struct *); + ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int); + ssize_t (*splice_read)(struct socket *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + int (*set_peek_off)(struct sock *, int); + int (*peek_len)(struct socket *); + int (*read_sock)(struct sock *, read_descriptor_t *, sk_read_actor_t); + int (*read_skb)(struct sock *, skb_read_actor_t); + int (*sendpage_locked)(struct sock *, struct page *, int, size_t, int); + int (*sendmsg_locked)(struct sock *, struct msghdr *, size_t); + int (*set_rcvlowat)(struct sock *, int); +}; + +struct nlmsghdr { + __u32 nlmsg_len; + __u16 nlmsg_type; + __u16 nlmsg_flags; + __u32 nlmsg_seq; + __u32 nlmsg_pid; +}; + +struct nlattr { + __u16 nla_len; + __u16 nla_type; +}; + +struct nla_policy; + +struct netlink_ext_ack { + const char *_msg; + const struct nlattr *bad_attr; + const struct nla_policy *policy; + const struct nlattr *miss_nest; + u16 miss_type; + u8 cookie[20]; + u8 cookie_len; + char _msg_buf[80]; +}; + +struct netlink_range_validation; + +struct netlink_range_validation_signed; + +struct nla_policy { + u8 type; + u8 validation_type; + u16 len; + union { + u16 strict_start_type; + const u32 bitfield32_valid; + const u32 mask; + const char *reject_message; + const struct nla_policy *nested_policy; + struct netlink_range_validation *range; + struct netlink_range_validation_signed *range_signed; + struct { + s16 min; + s16 max; + }; + int (*validate)(const struct nlattr *, struct netlink_ext_ack *); + }; +}; + +struct netlink_callback { + struct sk_buff *skb; + const struct nlmsghdr *nlh; + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + void *data; + struct module *module; + struct netlink_ext_ack *extack; + u16 family; + u16 answer_flags; + u32 min_dump_alloc; + unsigned int prev_seq; + unsigned int seq; + bool strict_check; + union { + u8 ctx[48]; + long int args[6]; + }; +}; + +struct ndmsg { + __u8 ndm_family; + __u8 ndm_pad1; + __u16 ndm_pad2; + __s32 ndm_ifindex; + __u16 ndm_state; + __u8 ndm_flags; + __u8 ndm_type; +}; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + short unsigned int loopback; +} sync_serial_settings; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + short unsigned int loopback; + unsigned int slot_map; +} te1_settings; + +typedef struct { + short unsigned int encoding; + short unsigned int parity; +} raw_hdlc_proto; + +typedef struct { + unsigned int t391; + unsigned int t392; + unsigned int n391; + unsigned int n392; + unsigned int n393; + short unsigned int lmi; + short unsigned int dce; +} fr_proto; + +typedef struct { + unsigned int dlci; +} fr_proto_pvc; + +typedef struct { + unsigned int dlci; + char master[16]; +} fr_proto_pvc_info; + +typedef struct { + unsigned int interval; + unsigned int timeout; +} cisco_proto; + +typedef struct { + short unsigned int dce; + unsigned int modulo; + unsigned int window; + unsigned int t1; + unsigned int t2; + unsigned int n2; +} x25_hdlc_proto; + +struct ifmap { + long unsigned int mem_start; + long unsigned int mem_end; + short unsigned int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct if_settings { + unsigned int type; + unsigned int size; + union { + raw_hdlc_proto *raw_hdlc; + cisco_proto *cisco; + fr_proto *fr; + fr_proto_pvc *fr_pvc; + fr_proto_pvc_info *fr_pvc_info; + x25_hdlc_proto *x25; + sync_serial_settings *sync; + te1_settings *te1; + } ifs_ifsu; +}; + +struct ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + void *ifru_data; + struct if_settings ifru_settings; + } ifr_ifru; +}; + +struct rtnl_link_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; + __u64 collisions; + __u64 rx_length_errors; + __u64 rx_over_errors; + __u64 rx_crc_errors; + __u64 rx_frame_errors; + __u64 rx_fifo_errors; + __u64 rx_missed_errors; + __u64 tx_aborted_errors; + __u64 tx_carrier_errors; + __u64 tx_fifo_errors; + __u64 tx_heartbeat_errors; + __u64 tx_window_errors; + __u64 rx_compressed; + __u64 tx_compressed; + __u64 rx_nohandler; + __u64 rx_otherhost_dropped; +}; + +struct rtnl_hw_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; +}; + +struct ifla_vf_guid { + __u32 vf; + long: 32; + __u64 guid; +}; + +struct ifla_vf_stats { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 broadcast; + __u64 multicast; + __u64 rx_dropped; + __u64 tx_dropped; +}; + +struct ifla_vf_info { + __u32 vf; + __u8 mac[32]; + __u32 vlan; + __u32 qos; + __u32 spoofchk; + __u32 linkstate; + __u32 min_tx_rate; + __u32 max_tx_rate; + __u32 rss_query_en; + __u32 trusted; + __be16 vlan_proto; +}; + +enum netdev_tx { + __NETDEV_TX_MIN = 2147483648, + NETDEV_TX_OK = 0, + NETDEV_TX_BUSY = 16, +}; + +typedef enum netdev_tx netdev_tx_t; + +struct net_device_core_stats { + long unsigned int rx_dropped; + long unsigned int tx_dropped; + long unsigned int rx_nohandler; + long unsigned int rx_otherhost_dropped; +}; + +struct header_ops { + int (*create)(struct sk_buff *, struct net_device *, short unsigned int, const void *, const void *, unsigned int); + int (*parse)(const struct sk_buff *, unsigned char *); + int (*cache)(const struct neighbour *, struct hh_cache *, __be16); + void (*cache_update)(struct hh_cache *, const struct net_device *, const unsigned char *); + bool (*validate)(const char *, unsigned int); + __be16 (*parse_protocol)(const struct sk_buff *); +}; + +enum { + NAPI_STATE_SCHED = 0, + NAPI_STATE_MISSED = 1, + NAPI_STATE_DISABLE = 2, + NAPI_STATE_NPSVC = 3, + NAPI_STATE_LISTED = 4, + NAPI_STATE_NO_BUSY_POLL = 5, + NAPI_STATE_IN_BUSY_POLL = 6, + NAPI_STATE_PREFER_BUSY_POLL = 7, + NAPI_STATE_THREADED = 8, + NAPI_STATE_SCHED_THREADED = 9, +}; + +struct xsk_buff_pool; + +struct netdev_queue { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct Qdisc *qdisc; + struct Qdisc *qdisc_sleeping; + struct kobject kobj; + long unsigned int tx_maxrate; + atomic_long_t trans_timeout; + struct net_device *sb_dev; + struct xsk_buff_pool *pool; + spinlock_t _xmit_lock; + int xmit_lock_owner; + long unsigned int trans_start; + long unsigned int state; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct dql dql; +}; + +struct rps_map { + unsigned int len; + struct callback_head rcu; + u16 cpus[0]; +}; + +struct rps_dev_flow { + u16 cpu; + u16 filter; + unsigned int last_qtail; +}; + +struct rps_dev_flow_table { + unsigned int mask; + struct callback_head rcu; + struct rps_dev_flow flows[0]; +}; + +struct netdev_rx_queue { + struct xdp_rxq_info xdp_rxq; + struct rps_map *rps_map; + struct rps_dev_flow_table *rps_flow_table; + struct kobject kobj; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct xsk_buff_pool *pool; + long: 32; + long: 32; + long: 32; +}; + +enum xps_map_type { + XPS_CPUS = 0, + XPS_RXQS = 1, + XPS_MAPS_MAX = 2, +}; + +struct xps_map { + unsigned int len; + unsigned int alloc_len; + struct callback_head rcu; + u16 queues[0]; +}; + +struct xps_dev_maps { + struct callback_head rcu; + unsigned int nr_ids; + s16 num_tc; + struct xps_map *attr_map[0]; +}; + +struct netdev_fcoe_hbainfo { + char manufacturer[64]; + char serial_number[64]; + char hardware_version[64]; + char driver_version[64]; + char optionrom_version[64]; + char firmware_version[64]; + char model[256]; + char model_description[256]; +}; + +struct netdev_phys_item_id { + unsigned char id[32]; + unsigned char id_len; +}; + +enum net_device_path_type { + DEV_PATH_ETHERNET = 0, + DEV_PATH_VLAN = 1, + DEV_PATH_BRIDGE = 2, + DEV_PATH_PPPOE = 3, + DEV_PATH_DSA = 4, + DEV_PATH_MTK_WDMA = 5, +}; + +struct net_device_path { + enum net_device_path_type type; + const struct net_device *dev; + union { + struct { + u16 id; + __be16 proto; + u8 h_dest[6]; + } encap; + struct { + enum { + DEV_PATH_BR_VLAN_KEEP = 0, + DEV_PATH_BR_VLAN_TAG = 1, + DEV_PATH_BR_VLAN_UNTAG = 2, + DEV_PATH_BR_VLAN_UNTAG_HW = 3, + } vlan_mode; + u16 vlan_id; + __be16 vlan_proto; + } bridge; + struct { + int port; + u16 proto; + } dsa; + struct { + u8 wdma_idx; + u8 queue; + u16 wcid; + u8 bss; + } mtk_wdma; + }; +}; + +struct net_device_path_ctx { + const struct net_device *dev; + u8 daddr[6]; + int num_vlans; + struct { + u16 id; + __be16 proto; + } vlan[2]; +}; + +enum tc_setup_type { + TC_QUERY_CAPS = 0, + TC_SETUP_QDISC_MQPRIO = 1, + TC_SETUP_CLSU32 = 2, + TC_SETUP_CLSFLOWER = 3, + TC_SETUP_CLSMATCHALL = 4, + TC_SETUP_CLSBPF = 5, + TC_SETUP_BLOCK = 6, + TC_SETUP_QDISC_CBS = 7, + TC_SETUP_QDISC_RED = 8, + TC_SETUP_QDISC_PRIO = 9, + TC_SETUP_QDISC_MQ = 10, + TC_SETUP_QDISC_ETF = 11, + TC_SETUP_ROOT_QDISC = 12, + TC_SETUP_QDISC_GRED = 13, + TC_SETUP_QDISC_TAPRIO = 14, + TC_SETUP_FT = 15, + TC_SETUP_QDISC_ETS = 16, + TC_SETUP_QDISC_TBF = 17, + TC_SETUP_QDISC_FIFO = 18, + TC_SETUP_QDISC_HTB = 19, + TC_SETUP_ACT = 20, +}; + +enum bpf_netdev_command { + XDP_SETUP_PROG = 0, + XDP_SETUP_PROG_HW = 1, + BPF_OFFLOAD_MAP_ALLOC = 2, + BPF_OFFLOAD_MAP_FREE = 3, + XDP_SETUP_XSK_POOL = 4, +}; + +enum bpf_xdp_mode { + XDP_MODE_SKB = 0, + XDP_MODE_DRV = 1, + XDP_MODE_HW = 2, + __MAX_XDP_MODE = 3, +}; + +struct bpf_offloaded_map; + +struct netdev_bpf { + enum bpf_netdev_command command; + union { + struct { + u32 flags; + struct bpf_prog *prog; + struct netlink_ext_ack *extack; + }; + struct { + struct bpf_offloaded_map *offmap; + }; + struct { + struct xsk_buff_pool *pool; + u16 queue_id; + } xsk; + }; +}; + +struct xfrmdev_ops { + int (*xdo_dev_state_add)(struct xfrm_state *, struct netlink_ext_ack *); + void (*xdo_dev_state_delete)(struct xfrm_state *); + void (*xdo_dev_state_free)(struct xfrm_state *); + bool (*xdo_dev_offload_ok)(struct sk_buff *, struct xfrm_state *); + void (*xdo_dev_state_advance_esn)(struct xfrm_state *); + void (*xdo_dev_state_update_curlft)(struct xfrm_state *); + int (*xdo_dev_policy_add)(struct xfrm_policy *, struct netlink_ext_ack *); + void (*xdo_dev_policy_delete)(struct xfrm_policy *); + void (*xdo_dev_policy_free)(struct xfrm_policy *); +}; + +struct dev_ifalias { + struct callback_head rcuhead; + char ifalias[0]; +}; + +struct ip_tunnel_parm; + +struct net_device_ops { + int (*ndo_init)(struct net_device *); + void (*ndo_uninit)(struct net_device *); + int (*ndo_open)(struct net_device *); + int (*ndo_stop)(struct net_device *); + netdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *); + netdev_features_t (*ndo_features_check)(struct sk_buff *, struct net_device *, netdev_features_t); + u16 (*ndo_select_queue)(struct net_device *, struct sk_buff *, struct net_device *); + void (*ndo_change_rx_flags)(struct net_device *, int); + void (*ndo_set_rx_mode)(struct net_device *); + int (*ndo_set_mac_address)(struct net_device *, void *); + int (*ndo_validate_addr)(struct net_device *); + int (*ndo_do_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_eth_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_siocbond)(struct net_device *, struct ifreq *, int); + int (*ndo_siocwandev)(struct net_device *, struct if_settings *); + int (*ndo_siocdevprivate)(struct net_device *, struct ifreq *, void *, int); + int (*ndo_set_config)(struct net_device *, struct ifmap *); + int (*ndo_change_mtu)(struct net_device *, int); + int (*ndo_neigh_setup)(struct net_device *, struct neigh_parms *); + void (*ndo_tx_timeout)(struct net_device *, unsigned int); + void (*ndo_get_stats64)(struct net_device *, struct rtnl_link_stats64 *); + bool (*ndo_has_offload_stats)(const struct net_device *, int); + int (*ndo_get_offload_stats)(int, const struct net_device *, void *); + struct net_device_stats * (*ndo_get_stats)(struct net_device *); + int (*ndo_vlan_rx_add_vid)(struct net_device *, __be16, u16); + int (*ndo_vlan_rx_kill_vid)(struct net_device *, __be16, u16); + void (*ndo_poll_controller)(struct net_device *); + int (*ndo_netpoll_setup)(struct net_device *, struct netpoll_info *); + void (*ndo_netpoll_cleanup)(struct net_device *); + int (*ndo_set_vf_mac)(struct net_device *, int, u8 *); + int (*ndo_set_vf_vlan)(struct net_device *, int, u16, u8, __be16); + int (*ndo_set_vf_rate)(struct net_device *, int, int, int); + int (*ndo_set_vf_spoofchk)(struct net_device *, int, bool); + int (*ndo_set_vf_trust)(struct net_device *, int, bool); + int (*ndo_get_vf_config)(struct net_device *, int, struct ifla_vf_info *); + int (*ndo_set_vf_link_state)(struct net_device *, int, int); + int (*ndo_get_vf_stats)(struct net_device *, int, struct ifla_vf_stats *); + int (*ndo_set_vf_port)(struct net_device *, int, struct nlattr **); + int (*ndo_get_vf_port)(struct net_device *, int, struct sk_buff *); + int (*ndo_get_vf_guid)(struct net_device *, int, struct ifla_vf_guid *, struct ifla_vf_guid *); + int (*ndo_set_vf_guid)(struct net_device *, int, u64, int); + int (*ndo_set_vf_rss_query_en)(struct net_device *, int, bool); + int (*ndo_setup_tc)(struct net_device *, enum tc_setup_type, void *); + int (*ndo_fcoe_enable)(struct net_device *); + int (*ndo_fcoe_disable)(struct net_device *); + int (*ndo_fcoe_ddp_setup)(struct net_device *, u16, struct scatterlist *, unsigned int); + int (*ndo_fcoe_ddp_done)(struct net_device *, u16); + int (*ndo_fcoe_ddp_target)(struct net_device *, u16, struct scatterlist *, unsigned int); + int (*ndo_fcoe_get_hbainfo)(struct net_device *, struct netdev_fcoe_hbainfo *); + int (*ndo_fcoe_get_wwn)(struct net_device *, u64 *, int); + int (*ndo_rx_flow_steer)(struct net_device *, const struct sk_buff *, u16, u32); + int (*ndo_add_slave)(struct net_device *, struct net_device *, struct netlink_ext_ack *); + int (*ndo_del_slave)(struct net_device *, struct net_device *); + struct net_device * (*ndo_get_xmit_slave)(struct net_device *, struct sk_buff *, bool); + struct net_device * (*ndo_sk_get_lower_dev)(struct net_device *, struct sock *); + netdev_features_t (*ndo_fix_features)(struct net_device *, netdev_features_t); + int (*ndo_set_features)(struct net_device *, netdev_features_t); + int (*ndo_neigh_construct)(struct net_device *, struct neighbour *); + void (*ndo_neigh_destroy)(struct net_device *, struct neighbour *); + int (*ndo_fdb_add)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, u16, struct netlink_ext_ack *); + int (*ndo_fdb_del)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, struct netlink_ext_ack *); + int (*ndo_fdb_del_bulk)(struct ndmsg *, struct nlattr **, struct net_device *, u16, struct netlink_ext_ack *); + int (*ndo_fdb_dump)(struct sk_buff *, struct netlink_callback *, struct net_device *, struct net_device *, int *); + int (*ndo_fdb_get)(struct sk_buff *, struct nlattr **, struct net_device *, const unsigned char *, u16, u32, u32, struct netlink_ext_ack *); + int (*ndo_bridge_setlink)(struct net_device *, struct nlmsghdr *, u16, struct netlink_ext_ack *); + int (*ndo_bridge_getlink)(struct sk_buff *, u32, u32, struct net_device *, u32, int); + int (*ndo_bridge_dellink)(struct net_device *, struct nlmsghdr *, u16); + int (*ndo_change_carrier)(struct net_device *, bool); + int (*ndo_get_phys_port_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_port_parent_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_phys_port_name)(struct net_device *, char *, size_t); + void * (*ndo_dfwd_add_station)(struct net_device *, struct net_device *); + void (*ndo_dfwd_del_station)(struct net_device *, void *); + int (*ndo_set_tx_maxrate)(struct net_device *, int, u32); + int (*ndo_get_iflink)(const struct net_device *); + int (*ndo_fill_metadata_dst)(struct net_device *, struct sk_buff *); + void (*ndo_set_rx_headroom)(struct net_device *, int); + int (*ndo_bpf)(struct net_device *, struct netdev_bpf *); + int (*ndo_xdp_xmit)(struct net_device *, int, struct xdp_frame **, u32); + struct net_device * (*ndo_xdp_get_xmit_slave)(struct net_device *, struct xdp_buff *); + int (*ndo_xsk_wakeup)(struct net_device *, u32, u32); + int (*ndo_tunnel_ctl)(struct net_device *, struct ip_tunnel_parm *, int); + struct net_device * (*ndo_get_peer_dev)(struct net_device *); + int (*ndo_fill_forward_path)(struct net_device_path_ctx *, struct net_device_path *); + ktime_t (*ndo_get_tstamp)(struct net_device *, const struct skb_shared_hwtstamps *, bool); +}; + +struct neigh_parms { + possible_net_t net; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head list; + int (*neigh_setup)(struct neighbour *); + struct neigh_table *tbl; + void *sysctl_table; + int dead; + refcount_t refcnt; + struct callback_head callback_head; + int reachable_time; + u32 qlen; + int data[14]; + long unsigned int data_state[1]; +}; + +struct xdp_md; + +struct xdp_metadata_ops { + int (*xmo_rx_timestamp)(const struct xdp_md *, u64 *); + int (*xmo_rx_hash)(const struct xdp_md *, u32 *); +}; + +struct xdp_md { + __u32 data; + __u32 data_end; + __u32 data_meta; + __u32 ingress_ifindex; + __u32 rx_queue_index; + __u32 egress_ifindex; +}; + +struct pcpu_lstats { + u64_stats_t packets; + u64_stats_t bytes; + struct u64_stats_sync syncp; + long: 32; + long: 32; + long: 32; +}; + +struct pcpu_sw_netstats { + u64_stats_t rx_packets; + u64_stats_t rx_bytes; + u64_stats_t tx_packets; + u64_stats_t tx_bytes; + struct u64_stats_sync syncp; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct iw_request_info; + +union iwreq_data; + +typedef int (*iw_handler)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *); + +struct iw_priv_args; + +struct iw_statistics; + +struct iw_handler_def { + const iw_handler *standard; + __u16 num_standard; + __u16 num_private; + __u16 num_private_args; + const iw_handler *private; + const struct iw_priv_args *private_args; + struct iw_statistics * (*get_wireless_stats)(struct net_device *); +}; + +enum ethtool_phys_id_state { + ETHTOOL_ID_INACTIVE = 0, + ETHTOOL_ID_ACTIVE = 1, + ETHTOOL_ID_ON = 2, + ETHTOOL_ID_OFF = 3, +}; + +struct ethtool_drvinfo; + +struct ethtool_regs; + +struct ethtool_wolinfo; + +struct ethtool_link_ext_state_info; + +struct ethtool_link_ext_stats; + +struct ethtool_eeprom; + +struct ethtool_coalesce; + +struct kernel_ethtool_coalesce; + +struct ethtool_ringparam; + +struct kernel_ethtool_ringparam; + +struct ethtool_pause_stats; + +struct ethtool_pauseparam; + +struct ethtool_test; + +struct ethtool_stats; + +struct ethtool_rxnfc; + +struct ethtool_flash; + +struct ethtool_channels; + +struct ethtool_dump; + +struct ethtool_ts_info; + +struct ethtool_modinfo; + +struct ethtool_eee; + +struct ethtool_tunable; + +struct ethtool_link_ksettings; + +struct ethtool_fec_stats; + +struct ethtool_fecparam; + +struct ethtool_module_eeprom; + +struct ethtool_eth_phy_stats; + +struct ethtool_eth_mac_stats; + +struct ethtool_eth_ctrl_stats; + +struct ethtool_rmon_stats; + +struct ethtool_rmon_hist_range; + +struct ethtool_module_power_mode_params; + +struct ethtool_mm_state; + +struct ethtool_mm_cfg; + +struct ethtool_mm_stats; + +struct ethtool_ops { + u32 cap_link_lanes_supported: 1; + u32 supported_coalesce_params; + u32 supported_ring_params; + void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); + int (*get_regs_len)(struct net_device *); + void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); + void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); + int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); + u32 (*get_msglevel)(struct net_device *); + void (*set_msglevel)(struct net_device *, u32); + int (*nway_reset)(struct net_device *); + u32 (*get_link)(struct net_device *); + int (*get_link_ext_state)(struct net_device *, struct ethtool_link_ext_state_info *); + void (*get_link_ext_stats)(struct net_device *, struct ethtool_link_ext_stats *); + int (*get_eeprom_len)(struct net_device *); + int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); + int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); + void (*get_pause_stats)(struct net_device *, struct ethtool_pause_stats *); + void (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + int (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); + void (*get_strings)(struct net_device *, u32, u8 *); + int (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state); + void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*begin)(struct net_device *); + void (*complete)(struct net_device *); + u32 (*get_priv_flags)(struct net_device *); + int (*set_priv_flags)(struct net_device *, u32); + int (*get_sset_count)(struct net_device *, int); + int (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, u32 *); + int (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); + int (*flash_device)(struct net_device *, struct ethtool_flash *); + int (*reset)(struct net_device *, u32 *); + u32 (*get_rxfh_key_size)(struct net_device *); + u32 (*get_rxfh_indir_size)(struct net_device *); + int (*get_rxfh)(struct net_device *, u32 *, u8 *, u8 *); + int (*set_rxfh)(struct net_device *, const u32 *, const u8 *, const u8); + int (*get_rxfh_context)(struct net_device *, u32 *, u8 *, u8 *, u32); + int (*set_rxfh_context)(struct net_device *, const u32 *, const u8 *, const u8, u32 *, bool); + void (*get_channels)(struct net_device *, struct ethtool_channels *); + int (*set_channels)(struct net_device *, struct ethtool_channels *); + int (*get_dump_flag)(struct net_device *, struct ethtool_dump *); + int (*get_dump_data)(struct net_device *, struct ethtool_dump *, void *); + int (*set_dump)(struct net_device *, struct ethtool_dump *); + int (*get_ts_info)(struct net_device *, struct ethtool_ts_info *); + int (*get_module_info)(struct net_device *, struct ethtool_modinfo *); + int (*get_module_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_eee)(struct net_device *, struct ethtool_eee *); + int (*set_eee)(struct net_device *, struct ethtool_eee *); + int (*get_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*set_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*get_link_ksettings)(struct net_device *, struct ethtool_link_ksettings *); + int (*set_link_ksettings)(struct net_device *, const struct ethtool_link_ksettings *); + void (*get_fec_stats)(struct net_device *, struct ethtool_fec_stats *); + int (*get_fecparam)(struct net_device *, struct ethtool_fecparam *); + int (*set_fecparam)(struct net_device *, struct ethtool_fecparam *); + void (*get_ethtool_phy_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*get_phy_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_phy_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_module_eeprom_by_page)(struct net_device *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *); + void (*get_eth_phy_stats)(struct net_device *, struct ethtool_eth_phy_stats *); + void (*get_eth_mac_stats)(struct net_device *, struct ethtool_eth_mac_stats *); + void (*get_eth_ctrl_stats)(struct net_device *, struct ethtool_eth_ctrl_stats *); + void (*get_rmon_stats)(struct net_device *, struct ethtool_rmon_stats *, const struct ethtool_rmon_hist_range **); + int (*get_module_power_mode)(struct net_device *, struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); + int (*set_module_power_mode)(struct net_device *, const struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); + int (*get_mm)(struct net_device *, struct ethtool_mm_state *); + int (*set_mm)(struct net_device *, struct ethtool_mm_cfg *, struct netlink_ext_ack *); + void (*get_mm_stats)(struct net_device *, struct ethtool_mm_stats *); +}; + +struct l3mdev_ops { + u32 (*l3mdev_fib_table)(const struct net_device *); + struct sk_buff * (*l3mdev_l3_rcv)(struct net_device *, struct sk_buff *, u16); + struct sk_buff * (*l3mdev_l3_out)(struct net_device *, struct sock *, struct sk_buff *, u16); + struct dst_entry * (*l3mdev_link_scope_lookup)(const struct net_device *, struct flowi6 *); +}; + +struct nd_opt_hdr; + +struct ndisc_options; + +struct prefix_info; + +struct ndisc_ops { + int (*is_useropt)(u8); + int (*parse_options)(const struct net_device *, struct nd_opt_hdr *, struct ndisc_options *); + void (*update)(const struct net_device *, struct neighbour *, u32, u8, const struct ndisc_options *); + int (*opt_addr_space)(const struct net_device *, u8, struct neighbour *, u8 *, u8 **); + void (*fill_addr_option)(const struct net_device *, struct sk_buff *, u8, const u8 *); + void (*prefix_rcv_add_addr)(struct net *, struct net_device *, const struct prefix_info *, struct inet6_dev *, struct in6_addr *, int, u32, bool, bool, __u32, u32, bool); +}; + +struct ipv6_devstat { + struct proc_dir_entry *proc_dir_entry; + struct ipstats_mib *ipv6; + struct icmpv6_mib_device *icmpv6dev; + struct icmpv6msg_mib_device *icmpv6msgdev; +}; + +struct ifmcaddr6; + +struct ifacaddr6; + +struct inet6_dev { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head addr_list; + struct ifmcaddr6 *mc_list; + struct ifmcaddr6 *mc_tomb; + unsigned char mc_qrv; + unsigned char mc_gq_running; + unsigned char mc_ifc_count; + unsigned char mc_dad_count; + long unsigned int mc_v1_seen; + long unsigned int mc_qi; + long unsigned int mc_qri; + long unsigned int mc_maxdelay; + struct delayed_work mc_gq_work; + struct delayed_work mc_ifc_work; + struct delayed_work mc_dad_work; + struct delayed_work mc_query_work; + struct delayed_work mc_report_work; + struct sk_buff_head mc_query_queue; + struct sk_buff_head mc_report_queue; + spinlock_t mc_query_lock; + spinlock_t mc_report_lock; + struct mutex mc_lock; + struct ifacaddr6 *ac_list; + rwlock_t lock; + refcount_t refcnt; + __u32 if_flags; + int dead; + u32 desync_factor; + struct list_head tempaddr_list; + struct in6_addr token; + struct neigh_parms *nd_parms; + struct ipv6_devconf cnf; + struct ipv6_devstat stats; + struct timer_list rs_timer; + __s32 rs_interval; + __u8 rs_probes; + long unsigned int tstamp; + struct callback_head rcu; + unsigned int ra_mtu; +}; + +struct rtnl_link_ops { + struct list_head list; + const char *kind; + size_t priv_size; + struct net_device * (*alloc)(struct nlattr **, const char *, unsigned char, unsigned int, unsigned int); + void (*setup)(struct net_device *); + bool netns_refund; + unsigned int maxtype; + const struct nla_policy *policy; + int (*validate)(struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*newlink)(struct net *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*changelink)(struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + void (*dellink)(struct net_device *, struct list_head *); + size_t (*get_size)(const struct net_device *); + int (*fill_info)(struct sk_buff *, const struct net_device *); + size_t (*get_xstats_size)(const struct net_device *); + int (*fill_xstats)(struct sk_buff *, const struct net_device *); + unsigned int (*get_num_tx_queues)(); + unsigned int (*get_num_rx_queues)(); + unsigned int slave_maxtype; + const struct nla_policy *slave_policy; + int (*slave_changelink)(struct net_device *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + size_t (*get_slave_size)(const struct net_device *, const struct net_device *); + int (*fill_slave_info)(struct sk_buff *, const struct net_device *, const struct net_device *); + struct net * (*get_link_net)(const struct net_device *); + size_t (*get_linkxstats_size)(const struct net_device *, int); + int (*fill_linkxstats)(struct sk_buff *, const struct net_device *, int *, int); +}; + +struct macsec_context; + +struct macsec_ops { + int (*mdo_dev_open)(struct macsec_context *); + int (*mdo_dev_stop)(struct macsec_context *); + int (*mdo_add_secy)(struct macsec_context *); + int (*mdo_upd_secy)(struct macsec_context *); + int (*mdo_del_secy)(struct macsec_context *); + int (*mdo_add_rxsc)(struct macsec_context *); + int (*mdo_upd_rxsc)(struct macsec_context *); + int (*mdo_del_rxsc)(struct macsec_context *); + int (*mdo_add_rxsa)(struct macsec_context *); + int (*mdo_upd_rxsa)(struct macsec_context *); + int (*mdo_del_rxsa)(struct macsec_context *); + int (*mdo_add_txsa)(struct macsec_context *); + int (*mdo_upd_txsa)(struct macsec_context *); + int (*mdo_del_txsa)(struct macsec_context *); + int (*mdo_get_dev_stats)(struct macsec_context *); + int (*mdo_get_tx_sc_stats)(struct macsec_context *); + int (*mdo_get_tx_sa_stats)(struct macsec_context *); + int (*mdo_get_rx_sc_stats)(struct macsec_context *); + int (*mdo_get_rx_sa_stats)(struct macsec_context *); +}; + +struct udp_tunnel_nic_table_info { + unsigned int n_entries; + unsigned int tunnel_types; +}; + +struct udp_tunnel_info; + +struct udp_tunnel_nic_shared; + +struct udp_tunnel_nic_info { + int (*set_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*unset_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*sync_table)(struct net_device *, unsigned int); + struct udp_tunnel_nic_shared *shared; + unsigned int flags; + struct udp_tunnel_nic_table_info tables[4]; +}; + +enum { + NETIF_MSG_DRV_BIT = 0, + NETIF_MSG_PROBE_BIT = 1, + NETIF_MSG_LINK_BIT = 2, + NETIF_MSG_TIMER_BIT = 3, + NETIF_MSG_IFDOWN_BIT = 4, + NETIF_MSG_IFUP_BIT = 5, + NETIF_MSG_RX_ERR_BIT = 6, + NETIF_MSG_TX_ERR_BIT = 7, + NETIF_MSG_TX_QUEUED_BIT = 8, + NETIF_MSG_INTR_BIT = 9, + NETIF_MSG_TX_DONE_BIT = 10, + NETIF_MSG_RX_STATUS_BIT = 11, + NETIF_MSG_PKTDATA_BIT = 12, + NETIF_MSG_HW_BIT = 13, + NETIF_MSG_WOL_BIT = 14, + NETIF_MSG_CLASS_COUNT = 15, +}; + +enum { + RTAX_UNSPEC = 0, + RTAX_LOCK = 1, + RTAX_MTU = 2, + RTAX_WINDOW = 3, + RTAX_RTT = 4, + RTAX_RTTVAR = 5, + RTAX_SSTHRESH = 6, + RTAX_CWND = 7, + RTAX_ADVMSS = 8, + RTAX_REORDERING = 9, + RTAX_HOPLIMIT = 10, + RTAX_INITCWND = 11, + RTAX_FEATURES = 12, + RTAX_RTO_MIN = 13, + RTAX_INITRWND = 14, + RTAX_QUICKACK = 15, + RTAX_CC_ALGO = 16, + RTAX_FASTOPEN_NO_COOKIE = 17, + __RTAX_MAX = 18, +}; + +struct netlink_range_validation { + u64 min; + u64 max; +}; + +struct netlink_range_validation_signed { + s64 min; + s64 max; +}; + +enum { + NEIGH_VAR_MCAST_PROBES = 0, + NEIGH_VAR_UCAST_PROBES = 1, + NEIGH_VAR_APP_PROBES = 2, + NEIGH_VAR_MCAST_REPROBES = 3, + NEIGH_VAR_RETRANS_TIME = 4, + NEIGH_VAR_BASE_REACHABLE_TIME = 5, + NEIGH_VAR_DELAY_PROBE_TIME = 6, + NEIGH_VAR_INTERVAL_PROBE_TIME_MS = 7, + NEIGH_VAR_GC_STALETIME = 8, + NEIGH_VAR_QUEUE_LEN_BYTES = 9, + NEIGH_VAR_PROXY_QLEN = 10, + NEIGH_VAR_ANYCAST_DELAY = 11, + NEIGH_VAR_PROXY_DELAY = 12, + NEIGH_VAR_LOCKTIME = 13, + NEIGH_VAR_QUEUE_LEN = 14, + NEIGH_VAR_RETRANS_TIME_MS = 15, + NEIGH_VAR_BASE_REACHABLE_TIME_MS = 16, + NEIGH_VAR_GC_INTERVAL = 17, + NEIGH_VAR_GC_THRESH1 = 18, + NEIGH_VAR_GC_THRESH2 = 19, + NEIGH_VAR_GC_THRESH3 = 20, + NEIGH_VAR_MAX = 21, +}; + +struct pneigh_entry; + +struct neigh_statistics; + +struct neigh_hash_table; + +struct neigh_table { + int family; + unsigned int entry_size; + unsigned int key_len; + __be16 protocol; + __u32 (*hash)(const void *, const struct net_device *, __u32 *); + bool (*key_eq)(const struct neighbour *, const void *); + int (*constructor)(struct neighbour *); + int (*pconstructor)(struct pneigh_entry *); + void (*pdestructor)(struct pneigh_entry *); + void (*proxy_redo)(struct sk_buff *); + int (*is_multicast)(const void *); + bool (*allow_add)(const struct net_device *, struct netlink_ext_ack *); + char *id; + struct neigh_parms parms; + struct list_head parms_list; + int gc_interval; + int gc_thresh1; + int gc_thresh2; + int gc_thresh3; + long unsigned int last_flush; + struct delayed_work gc_work; + struct delayed_work managed_work; + struct timer_list proxy_timer; + struct sk_buff_head proxy_queue; + atomic_t entries; + atomic_t gc_entries; + struct list_head gc_list; + struct list_head managed_list; + rwlock_t lock; + long unsigned int last_rand; + struct neigh_statistics *stats; + struct neigh_hash_table *nht; + struct pneigh_entry **phash_buckets; +}; + +struct neigh_statistics { + long unsigned int allocs; + long unsigned int destroys; + long unsigned int hash_grows; + long unsigned int res_failed; + long unsigned int lookups; + long unsigned int hits; + long unsigned int rcv_probes_mcast; + long unsigned int rcv_probes_ucast; + long unsigned int periodic_gc_runs; + long unsigned int forced_gc_runs; + long unsigned int unres_discards; + long unsigned int table_fulls; +}; + +struct neigh_ops { + int family; + void (*solicit)(struct neighbour *, struct sk_buff *); + void (*error_report)(struct neighbour *, struct sk_buff *); + int (*output)(struct neighbour *, struct sk_buff *); + int (*connected_output)(struct neighbour *, struct sk_buff *); +}; + +struct pneigh_entry { + struct pneigh_entry *next; + possible_net_t net; + struct net_device *dev; + netdevice_tracker dev_tracker; + u32 flags; + u8 protocol; + u8 key[0]; +}; + +struct neigh_hash_table { + struct neighbour **hash_buckets; + unsigned int hash_shift; + __u32 hash_rnd[4]; + struct callback_head rcu; +}; + +enum { + TCP_ESTABLISHED = 1, + TCP_SYN_SENT = 2, + TCP_SYN_RECV = 3, + TCP_FIN_WAIT1 = 4, + TCP_FIN_WAIT2 = 5, + TCP_TIME_WAIT = 6, + TCP_CLOSE = 7, + TCP_CLOSE_WAIT = 8, + TCP_LAST_ACK = 9, + TCP_LISTEN = 10, + TCP_CLOSING = 11, + TCP_NEW_SYN_RECV = 12, + TCP_MAX_STATES = 13, +}; + +struct fib_rule_hdr { + __u8 family; + __u8 dst_len; + __u8 src_len; + __u8 tos; + __u8 table; + __u8 res1; + __u8 res2; + __u8 action; + __u32 flags; +}; + +struct fib_rule_port_range { + __u16 start; + __u16 end; +}; + +struct fib_kuid_range { + kuid_t start; + kuid_t end; +}; + +struct fib_rule { + struct list_head list; + int iifindex; + int oifindex; + u32 mark; + u32 mark_mask; + u32 flags; + u32 table; + u8 action; + u8 l3mdev; + u8 proto; + u8 ip_proto; + u32 target; + __be64 tun_id; + struct fib_rule *ctarget; + struct net *fr_net; + refcount_t refcnt; + u32 pref; + int suppress_ifgroup; + int suppress_prefixlen; + char iifname[16]; + char oifname[16]; + struct fib_kuid_range uid_range; + struct fib_rule_port_range sport_range; + struct fib_rule_port_range dport_range; + struct callback_head rcu; +}; + +struct fib_lookup_arg { + void *lookup_ptr; + const void *lookup_data; + void *result; + struct fib_rule *rule; + u32 table; + int flags; +}; + +struct smc_hashinfo; + +struct sk_psock; + +struct request_sock_ops; + +struct timewait_sock_ops; + +struct raw_hashinfo; + +struct proto { + void (*close)(struct sock *, long int); + int (*pre_connect)(struct sock *, struct sockaddr *, int); + int (*connect)(struct sock *, struct sockaddr *, int); + int (*disconnect)(struct sock *, int); + struct sock * (*accept)(struct sock *, int, int *, bool); + int (*ioctl)(struct sock *, int, long unsigned int); + int (*init)(struct sock *); + void (*destroy)(struct sock *); + void (*shutdown)(struct sock *, int); + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*keepalive)(struct sock *, int); + int (*sendmsg)(struct sock *, struct msghdr *, size_t); + int (*recvmsg)(struct sock *, struct msghdr *, size_t, int, int *); + int (*sendpage)(struct sock *, struct page *, int, size_t, int); + int (*bind)(struct sock *, struct sockaddr *, int); + int (*bind_add)(struct sock *, struct sockaddr *, int); + int (*backlog_rcv)(struct sock *, struct sk_buff *); + bool (*bpf_bypass_getsockopt)(int, int); + void (*release_cb)(struct sock *); + int (*hash)(struct sock *); + void (*unhash)(struct sock *); + void (*rehash)(struct sock *); + int (*get_port)(struct sock *, short unsigned int); + void (*put_port)(struct sock *); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + unsigned int inuse_idx; + bool (*stream_memory_free)(const struct sock *, int); + bool (*sock_is_readable)(struct sock *); + void (*enter_memory_pressure)(struct sock *); + void (*leave_memory_pressure)(struct sock *); + atomic_long_t *memory_allocated; + int *per_cpu_fw_alloc; + struct percpu_counter *sockets_allocated; + long unsigned int *memory_pressure; + long int *sysctl_mem; + int *sysctl_wmem; + int *sysctl_rmem; + u32 sysctl_wmem_offset; + u32 sysctl_rmem_offset; + int max_header; + bool no_autobind; + struct kmem_cache *slab; + unsigned int obj_size; + slab_flags_t slab_flags; + unsigned int useroffset; + unsigned int usersize; + unsigned int *orphan_count; + struct request_sock_ops *rsk_prot; + struct timewait_sock_ops *twsk_prot; + union { + struct inet_hashinfo *hashinfo; + struct udp_table *udp_table; + struct raw_hashinfo *raw_hash; + struct smc_hashinfo *smc_hash; + } h; + struct module *owner; + char name[32]; + struct list_head node; + int (*diag_destroy)(struct sock *, int); +}; + +struct request_sock; + +struct request_sock_ops { + int family; + unsigned int obj_size; + struct kmem_cache *slab; + char *slab_name; + int (*rtx_syn_ack)(const struct sock *, struct request_sock *); + void (*send_ack)(const struct sock *, struct sk_buff *, struct request_sock *); + void (*send_reset)(const struct sock *, struct sk_buff *); + void (*destructor)(struct request_sock *); + void (*syn_ack_timeout)(const struct request_sock *); +}; + +struct timewait_sock_ops { + struct kmem_cache *twsk_slab; + char *twsk_slab_name; + unsigned int twsk_obj_size; + int (*twsk_unique)(struct sock *, struct sock *, void *); + void (*twsk_destructor)(struct sock *); +}; + +struct saved_syn; + +struct request_sock { + struct sock_common __req_common; + struct request_sock *dl_next; + u16 mss; + u8 num_retrans; + u8 syncookie: 1; + u8 num_timeout: 7; + u32 ts_recent; + struct timer_list rsk_timer; + const struct request_sock_ops *rsk_ops; + struct sock *sk; + struct saved_syn *saved_syn; + u32 secid; + u32 peer_secid; + u32 timeout; +}; + +struct saved_syn { + u32 mac_hdrlen; + u32 network_hdrlen; + u32 tcp_hdrlen; + u8 data[0]; +}; + +enum tsq_enum { + TSQ_THROTTLED = 0, + TSQ_QUEUED = 1, + TCP_TSQ_DEFERRED = 2, + TCP_WRITE_TIMER_DEFERRED = 3, + TCP_DELACK_TIMER_DEFERRED = 4, + TCP_MTU_REDUCED_DEFERRED = 5, +}; + +struct ip6_sf_list { + struct ip6_sf_list *sf_next; + struct in6_addr sf_addr; + long unsigned int sf_count[2]; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; + struct callback_head rcu; +}; + +struct ifmcaddr6 { + struct in6_addr mca_addr; + struct inet6_dev *idev; + struct ifmcaddr6 *next; + struct ip6_sf_list *mca_sources; + struct ip6_sf_list *mca_tomb; + unsigned int mca_sfmode; + unsigned char mca_crcount; + long unsigned int mca_sfcount[2]; + struct delayed_work mca_work; + unsigned int mca_flags; + int mca_users; + refcount_t mca_refcnt; + long unsigned int mca_cstamp; + long unsigned int mca_tstamp; + struct callback_head rcu; +}; + +struct ifacaddr6 { + struct in6_addr aca_addr; + struct fib6_info *aca_rt; + struct ifacaddr6 *aca_next; + struct hlist_node aca_addr_lst; + int aca_users; + refcount_t aca_refcnt; + long unsigned int aca_cstamp; + long unsigned int aca_tstamp; + struct callback_head rcu; +}; + +enum nfs_opnum4 { + OP_ACCESS = 3, + OP_CLOSE = 4, + OP_COMMIT = 5, + OP_CREATE = 6, + OP_DELEGPURGE = 7, + OP_DELEGRETURN = 8, + OP_GETATTR = 9, + OP_GETFH = 10, + OP_LINK = 11, + OP_LOCK = 12, + OP_LOCKT = 13, + OP_LOCKU = 14, + OP_LOOKUP = 15, + OP_LOOKUPP = 16, + OP_NVERIFY = 17, + OP_OPEN = 18, + OP_OPENATTR = 19, + OP_OPEN_CONFIRM = 20, + OP_OPEN_DOWNGRADE = 21, + OP_PUTFH = 22, + OP_PUTPUBFH = 23, + OP_PUTROOTFH = 24, + OP_READ = 25, + OP_READDIR = 26, + OP_READLINK = 27, + OP_REMOVE = 28, + OP_RENAME = 29, + OP_RENEW = 30, + OP_RESTOREFH = 31, + OP_SAVEFH = 32, + OP_SECINFO = 33, + OP_SETATTR = 34, + OP_SETCLIENTID = 35, + OP_SETCLIENTID_CONFIRM = 36, + OP_VERIFY = 37, + OP_WRITE = 38, + OP_RELEASE_LOCKOWNER = 39, + OP_BACKCHANNEL_CTL = 40, + OP_BIND_CONN_TO_SESSION = 41, + OP_EXCHANGE_ID = 42, + OP_CREATE_SESSION = 43, + OP_DESTROY_SESSION = 44, + OP_FREE_STATEID = 45, + OP_GET_DIR_DELEGATION = 46, + OP_GETDEVICEINFO = 47, + OP_GETDEVICELIST = 48, + OP_LAYOUTCOMMIT = 49, + OP_LAYOUTGET = 50, + OP_LAYOUTRETURN = 51, + OP_SECINFO_NO_NAME = 52, + OP_SEQUENCE = 53, + OP_SET_SSV = 54, + OP_TEST_STATEID = 55, + OP_WANT_DELEGATION = 56, + OP_DESTROY_CLIENTID = 57, + OP_RECLAIM_COMPLETE = 58, + OP_ALLOCATE = 59, + OP_COPY = 60, + OP_COPY_NOTIFY = 61, + OP_DEALLOCATE = 62, + OP_IO_ADVISE = 63, + OP_LAYOUTERROR = 64, + OP_LAYOUTSTATS = 65, + OP_OFFLOAD_CANCEL = 66, + OP_OFFLOAD_STATUS = 67, + OP_READ_PLUS = 68, + OP_SEEK = 69, + OP_WRITE_SAME = 70, + OP_CLONE = 71, + OP_GETXATTR = 72, + OP_SETXATTR = 73, + OP_LISTXATTRS = 74, + OP_REMOVEXATTR = 75, + OP_ILLEGAL = 10044, +}; + +enum { + UNAME26 = 131072, + ADDR_NO_RANDOMIZE = 262144, + FDPIC_FUNCPTRS = 524288, + MMAP_PAGE_ZERO = 1048576, + ADDR_COMPAT_LAYOUT = 2097152, + READ_IMPLIES_EXEC = 4194304, + ADDR_LIMIT_32BIT = 8388608, + SHORT_INODE = 16777216, + WHOLE_SECONDS = 33554432, + STICKY_TIMEOUTS = 67108864, + ADDR_LIMIT_3GB = 134217728, +}; + +enum perf_sw_ids { + PERF_COUNT_SW_CPU_CLOCK = 0, + PERF_COUNT_SW_TASK_CLOCK = 1, + PERF_COUNT_SW_PAGE_FAULTS = 2, + PERF_COUNT_SW_CONTEXT_SWITCHES = 3, + PERF_COUNT_SW_CPU_MIGRATIONS = 4, + PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, + PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, + PERF_COUNT_SW_EMULATION_FAULTS = 8, + PERF_COUNT_SW_DUMMY = 9, + PERF_COUNT_SW_BPF_OUTPUT = 10, + PERF_COUNT_SW_CGROUP_SWITCHES = 11, + PERF_COUNT_SW_MAX = 12, +}; + +enum perf_branch_sample_type_shift { + PERF_SAMPLE_BRANCH_USER_SHIFT = 0, + PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, + PERF_SAMPLE_BRANCH_HV_SHIFT = 2, + PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, + PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, + PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, + PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, + PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, + PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, + PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, + PERF_SAMPLE_BRANCH_COND_SHIFT = 10, + PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, + PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, + PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, + PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, + PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, + PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, + PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, + PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18, + PERF_SAMPLE_BRANCH_MAX_SHIFT = 19, +}; + +enum { + TRACE_EVENT_FL_FILTERED_BIT = 0, + TRACE_EVENT_FL_CAP_ANY_BIT = 1, + TRACE_EVENT_FL_NO_SET_FILTER_BIT = 2, + TRACE_EVENT_FL_IGNORE_ENABLE_BIT = 3, + TRACE_EVENT_FL_TRACEPOINT_BIT = 4, + TRACE_EVENT_FL_DYNAMIC_BIT = 5, + TRACE_EVENT_FL_KPROBE_BIT = 6, + TRACE_EVENT_FL_UPROBE_BIT = 7, + TRACE_EVENT_FL_EPROBE_BIT = 8, + TRACE_EVENT_FL_CUSTOM_BIT = 9, +}; + +enum { + EVENT_FILE_FL_ENABLED_BIT = 0, + EVENT_FILE_FL_RECORDED_CMD_BIT = 1, + EVENT_FILE_FL_RECORDED_TGID_BIT = 2, + EVENT_FILE_FL_FILTERED_BIT = 3, + EVENT_FILE_FL_NO_SET_FILTER_BIT = 4, + EVENT_FILE_FL_SOFT_MODE_BIT = 5, + EVENT_FILE_FL_SOFT_DISABLED_BIT = 6, + EVENT_FILE_FL_TRIGGER_MODE_BIT = 7, + EVENT_FILE_FL_TRIGGER_COND_BIT = 8, + EVENT_FILE_FL_PID_FILTER_BIT = 9, + EVENT_FILE_FL_WAS_ENABLED_BIT = 10, +}; + +struct uuidcmp { + const char *uuid; + int len; +}; + +struct subprocess_info { + struct work_struct work; + struct completion *complete; + const char *path; + char **argv; + char **envp; + int wait; + int retval; + int (*init)(struct subprocess_info *, struct cred *); + void (*cleanup)(struct subprocess_info *); + void *data; +}; + +typedef phys_addr_t resource_size_t; + +struct __va_list { + void *__ap; +}; + +typedef struct __va_list va_list; + +struct resource { + resource_size_t start; + resource_size_t end; + const char *name; + long unsigned int flags; + long unsigned int desc; + struct resource *parent; + struct resource *sibling; + struct resource *child; +}; + +enum umh_disable_depth { + UMH_ENABLED = 0, + UMH_FREEZING = 1, + UMH_DISABLED = 2, +}; + +typedef u64 async_cookie_t; + +typedef void (*async_func_t)(void *, async_cookie_t); + +struct async_domain { + struct list_head pending; + unsigned int registered: 1; +}; + +struct hash { + int ino; + int minor; + int major; + umode_t mode; + struct hash *next; + char name[4098]; +}; + +struct dir_entry { + struct list_head list; + time64_t mtime; + char name[0]; +}; + +enum state { + Start = 0, + Collect = 1, + GotHeader = 2, + SkipIt = 3, + GotName = 4, + CopyFile = 5, + GotSymlink = 6, + Reset = 7, +}; + +typedef int (*decompress_fn)(unsigned char *, long int, long int (*)(void *, long unsigned int), long int (*)(void *, long unsigned int), unsigned char *, long int *, void (*)(char *)); + +enum key_being_used_for { + VERIFYING_MODULE_SIGNATURE = 0, + VERIFYING_FIRMWARE_SIGNATURE = 1, + VERIFYING_KEXEC_PE_SIGNATURE = 2, + VERIFYING_KEY_SIGNATURE = 3, + VERIFYING_KEY_SELF_SIGNATURE = 4, + VERIFYING_UNSPECIFIED_SIGNATURE = 5, + NR__KEY_BEING_USED_FOR = 6, +}; + +struct arm_delay_ops { + void (*delay)(long unsigned int); + void (*const_udelay)(long unsigned int); + void (*udelay)(long unsigned int); + long unsigned int ticks_per_jiffy; +}; + +enum cpu_idle_type { + CPU_IDLE = 0, + CPU_NOT_IDLE = 1, + CPU_NEWLY_IDLE = 2, + CPU_MAX_IDLE_TYPES = 3, +}; + +enum { + __SD_BALANCE_NEWIDLE = 0, + __SD_BALANCE_EXEC = 1, + __SD_BALANCE_FORK = 2, + __SD_BALANCE_WAKE = 3, + __SD_WAKE_AFFINE = 4, + __SD_ASYM_CPUCAPACITY = 5, + __SD_ASYM_CPUCAPACITY_FULL = 6, + __SD_SHARE_CPUCAPACITY = 7, + __SD_SHARE_PKG_RESOURCES = 8, + __SD_SERIALIZE = 9, + __SD_ASYM_PACKING = 10, + __SD_PREFER_SIBLING = 11, + __SD_OVERLAP = 12, + __SD_NUMA = 13, + __SD_FLAG_CNT = 14, +}; + +enum audit_ntp_type { + AUDIT_NTP_OFFSET = 0, + AUDIT_NTP_FREQ = 1, + AUDIT_NTP_STATUS = 2, + AUDIT_NTP_TAI = 3, + AUDIT_NTP_TICK = 4, + AUDIT_NTP_ADJUST = 5, + AUDIT_NTP_NVALS = 6, +}; + +typedef void (*smp_call_func_t)(void *); + +typedef bool (*smp_cond_func_t)(int, void *); + +enum { + MM_FILEPAGES = 0, + MM_ANONPAGES = 1, + MM_SWAPENTS = 2, + MM_SHMEMPAGES = 3, + NR_MM_COUNTERS = 4, +}; + +enum migratetype { + MIGRATE_UNMOVABLE = 0, + MIGRATE_MOVABLE = 1, + MIGRATE_RECLAIMABLE = 2, + MIGRATE_PCPTYPES = 3, + MIGRATE_HIGHATOMIC = 3, + MIGRATE_CMA = 4, + MIGRATE_ISOLATE = 5, + MIGRATE_TYPES = 6, +}; + +enum zone_stat_item { + NR_FREE_PAGES = 0, + NR_ZONE_LRU_BASE = 1, + NR_ZONE_INACTIVE_ANON = 1, + NR_ZONE_ACTIVE_ANON = 2, + NR_ZONE_INACTIVE_FILE = 3, + NR_ZONE_ACTIVE_FILE = 4, + NR_ZONE_UNEVICTABLE = 5, + NR_ZONE_WRITE_PENDING = 6, + NR_MLOCK = 7, + NR_BOUNCE = 8, + NR_ZSPAGES = 9, + NR_FREE_CMA_PAGES = 10, + NR_VM_ZONE_STAT_ITEMS = 11, +}; + +enum vmscan_throttle_state { + VMSCAN_THROTTLE_WRITEBACK = 0, + VMSCAN_THROTTLE_ISOLATED = 1, + VMSCAN_THROTTLE_NOPROGRESS = 2, + VMSCAN_THROTTLE_CONGESTED = 3, + NR_VMSCAN_THROTTLE = 4, +}; + +enum zone_watermarks { + WMARK_MIN = 0, + WMARK_LOW = 1, + WMARK_HIGH = 2, + WMARK_PROMO = 3, + NR_WMARK = 4, +}; + +enum { + ZONELIST_FALLBACK = 0, + MAX_ZONELISTS = 1, +}; + +struct atomic_notifier_head { + spinlock_t lock; + struct notifier_block *head; +}; + +struct user_vfp { + long long unsigned int fpregs[32]; + long unsigned int fpscr; + long: 32; +}; + +struct user_vfp_exc { + long unsigned int fpexc; + long unsigned int fpinst; + long unsigned int fpinst2; +}; + +enum cpu_pm_event { + CPU_PM_ENTER = 0, + CPU_PM_ENTER_FAILED = 1, + CPU_PM_EXIT = 2, + CPU_CLUSTER_PM_ENTER = 3, + CPU_CLUSTER_PM_ENTER_FAILED = 4, + CPU_CLUSTER_PM_EXIT = 5, +}; + +struct undef_hook { + struct list_head node; + u32 instr_mask; + u32 instr_val; + u32 cpsr_mask; + u32 cpsr_val; + int (*fn)(struct pt_regs *, unsigned int); +}; + +struct vfp_single { + s16 exponent; + u16 sign; + u32 significand; +}; + +struct vfp_double { + s16 exponent; + u16 sign; + long: 32; + u64 significand; +}; + +struct op { + u32 (* const fn)(int, int, int, u32); + u32 flags; +}; + +typedef s8 int8_t; + +typedef s16 int16_t; + +typedef u8 uint8_t; + +typedef u16 uint16_t; + +typedef s64 int64_t; + +enum xen_domain_type { + XEN_NATIVE = 0, + XEN_PV_DOMAIN = 1, + XEN_HVM_DOMAIN = 2, +}; + +typedef uint64_t xen_pfn_t; + +typedef uint64_t xen_ulong_t; + +typedef int64_t xen_long_t; + +typedef struct { + union { + unsigned char *p; + uint64_t q; + }; +} __guest_handle_uchar; + +typedef struct { + union { + char *p; + uint64_t q; + }; +} __guest_handle_char; + +typedef struct { + union { + void *p; + uint64_t q; + }; +} __guest_handle_void; + +typedef struct { + union { + uint64_t *p; + uint64_t q; + }; +} __guest_handle_uint64_t; + +typedef struct { + union { + uint32_t *p; + uint64_t q; + }; +} __guest_handle_uint32_t; + +struct arch_vcpu_info {}; + +struct arch_shared_info {}; + +struct pvclock_vcpu_time_info { + u32 version; + u32 pad0; + u64 tsc_timestamp; + u64 system_time; + u32 tsc_to_system_mul; + s8 tsc_shift; + u8 flags; + u8 pad[2]; +}; + +struct pvclock_wall_clock { + u32 version; + u32 sec; + u32 nsec; + u32 sec_hi; +}; + +typedef uint16_t domid_t; + +struct multicall_entry { + xen_ulong_t op; + xen_long_t result; + xen_ulong_t args[6]; +}; + +struct vcpu_info { + uint8_t evtchn_upcall_pending; + uint8_t evtchn_upcall_mask; + long: 32; + xen_ulong_t evtchn_pending_sel; + struct arch_vcpu_info arch; + struct pvclock_vcpu_time_info time; +}; + +struct shared_info { + struct vcpu_info vcpu_info[1]; + xen_ulong_t evtchn_pending[64]; + xen_ulong_t evtchn_mask[64]; + struct pvclock_wall_clock wc; + uint32_t wc_sec_hi; + struct arch_shared_info arch; + long: 32; +}; + +struct start_info { + char magic[32]; + long unsigned int nr_pages; + long unsigned int shared_info; + uint32_t flags; + long: 32; + xen_pfn_t store_mfn; + uint32_t store_evtchn; + long: 32; + union { + struct { + xen_pfn_t mfn; + uint32_t evtchn; + long: 32; + } domU; + struct { + uint32_t info_off; + uint32_t info_size; + } dom0; + } console; + long unsigned int pt_base; + long unsigned int nr_pt_frames; + long unsigned int mfn_list; + long unsigned int mod_start; + long unsigned int mod_len; + int8_t cmd_line[1024]; + long unsigned int first_p2m_pfn; + long unsigned int nr_p2m_frames; + long: 32; +}; + +enum clocksource_ids { + CSID_GENERIC = 0, + CSID_ARM_ARCH_COUNTER = 1, + CSID_MAX = 2, +}; + +enum vdso_clock_mode { + VDSO_CLOCKMODE_NONE = 0, + VDSO_CLOCKMODE_ARCHTIMER = 1, + VDSO_CLOCKMODE_MAX = 2, + VDSO_CLOCKMODE_TIMENS = 2147483647, +}; + +struct clocksource { + u64 (*read)(struct clocksource *); + long: 32; + u64 mask; + u32 mult; + u32 shift; + u64 max_idle_ns; + u32 maxadj; + u32 uncertainty_margin; + u64 max_cycles; + const char *name; + struct list_head list; + int rating; + enum clocksource_ids id; + enum vdso_clock_mode vdso_clock_mode; + long unsigned int flags; + int (*enable)(struct clocksource *); + void (*disable)(struct clocksource *); + void (*suspend)(struct clocksource *); + void (*resume)(struct clocksource *); + void (*mark_unstable)(struct clocksource *); + void (*tick_stable)(struct clocksource *); + struct module *owner; +}; + +struct plist_head { + struct list_head node_list; +}; + +struct arch_msi_msg_addr_lo { + u32 address_lo; +}; + +typedef struct arch_msi_msg_addr_lo arch_msi_msg_addr_lo_t; + +struct arch_msi_msg_addr_hi { + u32 address_hi; +}; + +typedef struct arch_msi_msg_addr_hi arch_msi_msg_addr_hi_t; + +struct arch_msi_msg_data { + u32 data; +}; + +typedef struct arch_msi_msg_data arch_msi_msg_data_t; + +struct msi_msg { + union { + u32 address_lo; + arch_msi_msg_addr_lo_t arch_addr_lo; + }; + union { + u32 address_hi; + arch_msi_msg_addr_hi_t arch_addr_hi; + }; + union { + u32 data; + arch_msi_msg_data_t arch_data; + }; +}; + +struct pci_msi_desc { + union { + u32 msi_mask; + u32 msix_ctrl; + }; + struct { + u8 is_msix: 1; + u8 multiple: 3; + u8 multi_cap: 3; + u8 can_mask: 1; + u8 is_64: 1; + u8 is_virtual: 1; + unsigned int default_irq; + } msi_attrib; + union { + u8 mask_pos; + void *mask_base; + }; +}; + +union msi_domain_cookie { + u64 value; + void *ptr; + void *iobase; +}; + +union msi_instance_cookie { + u64 value; + void *ptr; +}; + +struct msi_desc_data { + union msi_domain_cookie dcookie; + union msi_instance_cookie icookie; +}; + +struct irq_affinity_desc; + +struct device_attribute; + +struct msi_desc { + unsigned int irq; + unsigned int nvec_used; + struct device *dev; + struct msi_msg msg; + struct irq_affinity_desc *affinity; + struct device_attribute *sysfs_attrs; + void (*write_msi_msg)(struct msi_desc *, void *); + void *write_msi_msg_data; + u16 msi_index; + long: 32; + union { + struct pci_msi_desc pci; + struct msi_desc_data data; + }; +}; + +struct irq_affinity_desc { + struct cpumask mask; + unsigned int is_managed: 1; +}; + +struct msi_alloc_info { + struct msi_desc *desc; + irq_hw_number_t hwirq; + long unsigned int flags; + union { + long unsigned int ul; + void *ptr; + } scratchpad[2]; +}; + +typedef struct msi_alloc_info msi_alloc_info_t; + +struct device_attribute { + struct attribute attr; + ssize_t (*show)(struct device *, struct device_attribute *, char *); + ssize_t (*store)(struct device *, struct device_attribute *, const char *, size_t); +}; + +struct msi_dev_domain { + struct xarray store; + struct irq_domain *domain; +}; + +struct platform_msi_priv_data; + +struct msi_device_data { + long unsigned int properties; + struct platform_msi_priv_data *platform_data; + struct mutex mutex; + struct msi_dev_domain __domains[2]; + long unsigned int __iter_idx; +}; + +struct msi_domain_ops { + irq_hw_number_t (*get_hwirq)(struct msi_domain_info *, msi_alloc_info_t *); + int (*msi_init)(struct irq_domain *, struct msi_domain_info *, unsigned int, irq_hw_number_t, msi_alloc_info_t *); + void (*msi_free)(struct irq_domain *, struct msi_domain_info *, unsigned int); + int (*msi_prepare)(struct irq_domain *, struct device *, int, msi_alloc_info_t *); + void (*prepare_desc)(struct irq_domain *, msi_alloc_info_t *, struct msi_desc *); + void (*set_desc)(msi_alloc_info_t *, struct msi_desc *); + int (*domain_alloc_irqs)(struct irq_domain *, struct device *, int); + void (*domain_free_irqs)(struct irq_domain *, struct device *); + void (*msi_post_free)(struct irq_domain *, struct device *); +}; + +struct msi_domain_info { + u32 flags; + enum irq_domain_bus_token bus_token; + unsigned int hwsize; + struct msi_domain_ops *ops; + struct irq_chip *chip; + void *chip_data; + irq_flow_handler_t handler; + void *handler_data; + const char *handler_name; + void *data; +}; + +struct sched_shutdown { + unsigned int reason; +}; + +struct xenpf_settime32 { + uint32_t secs; + uint32_t nsecs; + uint64_t system_time; +}; + +struct xenpf_settime64 { + uint64_t secs; + uint32_t nsecs; + uint32_t mbz; + uint64_t system_time; +}; + +struct xenpf_add_memtype { + xen_pfn_t mfn; + uint64_t nr_mfns; + uint32_t type; + uint32_t handle; + uint32_t reg; + long: 32; +}; + +struct xenpf_del_memtype { + uint32_t handle; + uint32_t reg; +}; + +struct xenpf_read_memtype { + uint32_t reg; + long: 32; + xen_pfn_t mfn; + uint64_t nr_mfns; + uint32_t type; + long: 32; +}; + +struct xenpf_microcode_update { + __guest_handle_void data; + uint32_t length; + long: 32; +}; + +struct xenpf_platform_quirk { + uint32_t quirk_id; +}; + +struct xenpf_efi_time { + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t min; + uint8_t sec; + uint32_t ns; + int16_t tz; + uint8_t daylight; +}; + +struct xenpf_efi_guid { + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +}; + +struct xenpf_efi_runtime_call { + uint32_t function; + uint32_t misc; + xen_ulong_t status; + union { + struct { + struct xenpf_efi_time time; + uint32_t resolution; + uint32_t accuracy; + } get_time; + struct xenpf_efi_time set_time; + struct xenpf_efi_time get_wakeup_time; + struct xenpf_efi_time set_wakeup_time; + struct { + __guest_handle_void name; + xen_ulong_t size; + __guest_handle_void data; + struct xenpf_efi_guid vendor_guid; + } get_variable; + struct { + __guest_handle_void name; + xen_ulong_t size; + __guest_handle_void data; + struct xenpf_efi_guid vendor_guid; + } set_variable; + struct { + xen_ulong_t size; + __guest_handle_void name; + struct xenpf_efi_guid vendor_guid; + } get_next_variable_name; + struct { + uint32_t attr; + long: 32; + uint64_t max_store_size; + uint64_t remain_store_size; + uint64_t max_size; + } query_variable_info; + struct { + __guest_handle_void capsule_header_array; + xen_ulong_t capsule_count; + uint64_t max_capsule_size; + uint32_t reset_type; + long: 32; + } query_capsule_capabilities; + struct { + __guest_handle_void capsule_header_array; + xen_ulong_t capsule_count; + uint64_t sg_list; + } update_capsule; + } u; +}; + +union xenpf_efi_info { + uint32_t version; + struct { + uint64_t addr; + uint32_t nent; + long: 32; + } cfg; + struct { + uint32_t revision; + uint32_t bufsz; + __guest_handle_void name; + } vendor; + struct { + uint64_t addr; + uint64_t size; + uint64_t attr; + uint32_t type; + long: 32; + } mem; +}; + +struct xenpf_firmware_info { + uint32_t type; + uint32_t index; + union { + struct { + uint8_t device; + uint8_t version; + uint16_t interface_support; + uint16_t legacy_max_cylinder; + uint8_t legacy_max_head; + uint8_t legacy_sectors_per_track; + __guest_handle_void edd_params; + } disk_info; + struct { + uint8_t device; + uint32_t mbr_signature; + } disk_mbr_signature; + struct { + uint8_t capabilities; + uint8_t edid_transfer_time; + long: 32; + __guest_handle_uchar edid; + } vbeddc_info; + union xenpf_efi_info efi_info; + uint8_t kbd_shift_flags; + } u; +}; + +struct xenpf_enter_acpi_sleep { + uint16_t val_a; + uint16_t val_b; + uint32_t sleep_state; + uint32_t flags; +}; + +struct xenpf_change_freq { + uint32_t flags; + uint32_t cpu; + uint64_t freq; +}; + +struct xenpf_getidletime { + __guest_handle_uchar cpumap_bitmap; + uint32_t cpumap_nr_cpus; + long: 32; + __guest_handle_uint64_t idletime; + uint64_t now; +}; + +struct xen_power_register { + uint32_t space_id; + uint32_t bit_width; + uint32_t bit_offset; + uint32_t access_size; + uint64_t address; +}; + +struct xen_processor_csd { + uint32_t domain; + uint32_t coord_type; + uint32_t num; +}; + +typedef struct { + union { + struct xen_processor_csd *p; + uint64_t q; + }; +} __guest_handle_xen_processor_csd; + +struct xen_processor_cx { + struct xen_power_register reg; + uint8_t type; + uint32_t latency; + uint32_t power; + uint32_t dpcnt; + __guest_handle_xen_processor_csd dp; +}; + +typedef struct { + union { + struct xen_processor_cx *p; + uint64_t q; + }; +} __guest_handle_xen_processor_cx; + +struct xen_processor_flags { + uint32_t bm_control: 1; + uint32_t bm_check: 1; + uint32_t has_cst: 1; + uint32_t power_setup_done: 1; + uint32_t bm_rld_set: 1; +}; + +struct xen_processor_power { + uint32_t count; + struct xen_processor_flags flags; + __guest_handle_xen_processor_cx states; +}; + +struct xen_pct_register { + uint8_t descriptor; + uint16_t length; + uint8_t space_id; + uint8_t bit_width; + uint8_t bit_offset; + uint8_t reserved; + uint64_t address; +}; + +struct xen_processor_px { + uint64_t core_frequency; + uint64_t power; + uint64_t transition_latency; + uint64_t bus_master_latency; + uint64_t control; + uint64_t status; +}; + +typedef struct { + union { + struct xen_processor_px *p; + uint64_t q; + }; +} __guest_handle_xen_processor_px; + +struct xen_psd_package { + uint64_t num_entries; + uint64_t revision; + uint64_t domain; + uint64_t coord_type; + uint64_t num_processors; +}; + +struct xen_processor_performance { + uint32_t flags; + uint32_t platform_limit; + struct xen_pct_register control_register; + struct xen_pct_register status_register; + uint32_t state_count; + long: 32; + __guest_handle_xen_processor_px states; + struct xen_psd_package domain_info; + uint32_t shared_type; + long: 32; +}; + +struct xenpf_set_processor_pminfo { + uint32_t id; + uint32_t type; + union { + struct xen_processor_power power; + struct xen_processor_performance perf; + __guest_handle_uint32_t pdc; + }; +}; + +struct xenpf_pcpuinfo { + uint32_t xen_cpuid; + uint32_t max_present; + uint32_t flags; + uint32_t apic_id; + uint32_t acpi_id; +}; + +struct xenpf_cpu_ol { + uint32_t cpuid; +}; + +struct xenpf_cpu_hotadd { + uint32_t apic_id; + uint32_t acpi_id; + uint32_t pxm; +}; + +struct xenpf_mem_hotadd { + uint64_t spfn; + uint64_t epfn; + uint32_t pxm; + uint32_t flags; +}; + +struct xenpf_core_parking { + uint32_t type; + uint32_t idle_nums; +}; + +struct xenpf_symdata { + uint32_t namelen; + uint32_t symnum; + __guest_handle_char name; + uint64_t address; + char type; + long: 32; +}; + +struct xen_platform_op { + uint32_t cmd; + uint32_t interface_version; + union { + struct xenpf_settime32 settime32; + struct xenpf_settime64 settime64; + struct xenpf_add_memtype add_memtype; + struct xenpf_del_memtype del_memtype; + struct xenpf_read_memtype read_memtype; + struct xenpf_microcode_update microcode; + struct xenpf_platform_quirk platform_quirk; + struct xenpf_efi_runtime_call efi_runtime_call; + struct xenpf_firmware_info firmware_info; + struct xenpf_enter_acpi_sleep enter_acpi_sleep; + struct xenpf_change_freq change_freq; + struct xenpf_getidletime getidletime; + struct xenpf_set_processor_pminfo set_pminfo; + struct xenpf_pcpuinfo pcpu_info; + struct xenpf_cpu_ol cpu_ol; + struct xenpf_cpu_hotadd cpu_add; + struct xenpf_mem_hotadd mem_add; + struct xenpf_core_parking core_parking; + struct xenpf_symdata symdata; + uint8_t pad[128]; + } u; +}; + +enum pm_qos_type { + PM_QOS_UNITIALIZED = 0, + PM_QOS_MAX = 1, + PM_QOS_MIN = 2, +}; + +struct pm_qos_constraints { + struct plist_head list; + s32 target_value; + s32 default_value; + s32 no_constraint_value; + enum pm_qos_type type; + struct blocking_notifier_head *notifiers; +}; + +struct freq_constraints { + struct pm_qos_constraints min_freq; + struct blocking_notifier_head min_freq_notifiers; + struct pm_qos_constraints max_freq; + struct blocking_notifier_head max_freq_notifiers; +}; + +struct pm_qos_flags { + struct list_head list; + s32 effective_flags; +}; + +struct dev_pm_qos_request; + +struct dev_pm_qos { + struct pm_qos_constraints resume_latency; + struct pm_qos_constraints latency_tolerance; + struct freq_constraints freq; + struct pm_qos_flags flags; + struct dev_pm_qos_request *resume_latency_req; + struct dev_pm_qos_request *latency_tolerance_req; + struct dev_pm_qos_request *flags_req; +}; + +typedef struct { + __u8 b[16]; +} guid_t; + +struct xen_memory_region { + long unsigned int start_pfn; + long unsigned int n_pfns; +}; + +struct grant_frames { + xen_pfn_t *pfn; + unsigned int count; + void *vaddr; +}; + +struct vcpu_register_vcpu_info { + uint64_t mfn; + uint32_t offset; + uint32_t rsvd; +}; + +struct xen_add_to_physmap { + domid_t domid; + uint16_t size; + unsigned int space; + xen_ulong_t idx; + xen_pfn_t gpfn; +}; + +struct xsd_errors { + int errnum; + const char *errstring; +}; + +typedef long unsigned int efi_status_t; + +typedef u8 efi_bool_t; + +typedef u16 efi_char16_t; + +typedef guid_t efi_guid_t; + +typedef struct { + u64 signature; + u32 revision; + u32 headersize; + u32 crc32; + u32 reserved; +} efi_table_hdr_t; + +typedef struct { + u32 type; + u32 pad; + u64 phys_addr; + u64 virt_addr; + u64 num_pages; + u64 attribute; +} efi_memory_desc_t; + +typedef struct { + efi_guid_t guid; + u32 headersize; + u32 flags; + u32 imagesize; +} efi_capsule_header_t; + +typedef struct { + u16 year; + u8 month; + u8 day; + u8 hour; + u8 minute; + u8 second; + u8 pad1; + u32 nanosecond; + s16 timezone; + u8 daylight; + u8 pad2; +} efi_time_t; + +typedef struct { + u32 resolution; + u32 accuracy; + u8 sets_to_zero; +} efi_time_cap_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 get_time; + u32 set_time; + u32 get_wakeup_time; + u32 set_wakeup_time; + u32 set_virtual_address_map; + u32 convert_pointer; + u32 get_variable; + u32 get_next_variable; + u32 set_variable; + u32 get_next_high_mono_count; + u32 reset_system; + u32 update_capsule; + u32 query_capsule_caps; + u32 query_variable_info; +} efi_runtime_services_32_t; + +typedef efi_status_t efi_get_time_t(efi_time_t *, efi_time_cap_t *); + +typedef efi_status_t efi_set_time_t(efi_time_t *); + +typedef efi_status_t efi_get_wakeup_time_t(efi_bool_t *, efi_bool_t *, efi_time_t *); + +typedef efi_status_t efi_set_wakeup_time_t(efi_bool_t, efi_time_t *); + +typedef efi_status_t efi_get_variable_t(efi_char16_t *, efi_guid_t *, u32 *, long unsigned int *, void *); + +typedef efi_status_t efi_get_next_variable_t(long unsigned int *, efi_char16_t *, efi_guid_t *); + +typedef efi_status_t efi_set_variable_t(efi_char16_t *, efi_guid_t *, u32, long unsigned int, void *); + +typedef efi_status_t efi_get_next_high_mono_count_t(u32 *); + +typedef void efi_reset_system_t(int, efi_status_t, long unsigned int, efi_char16_t *); + +typedef efi_status_t efi_set_virtual_address_map_t(long unsigned int, long unsigned int, u32, efi_memory_desc_t *); + +typedef efi_status_t efi_query_variable_info_t(u32, u64 *, u64 *, u64 *); + +typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **, long unsigned int, long unsigned int); + +typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **, long unsigned int, u64 *, int *); + +typedef union { + struct { + efi_table_hdr_t hdr; + efi_get_time_t *get_time; + efi_set_time_t *set_time; + efi_get_wakeup_time_t *get_wakeup_time; + efi_set_wakeup_time_t *set_wakeup_time; + efi_set_virtual_address_map_t *set_virtual_address_map; + void *convert_pointer; + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_get_next_high_mono_count_t *get_next_high_mono_count; + efi_reset_system_t *reset_system; + efi_update_capsule_t *update_capsule; + efi_query_capsule_caps_t *query_capsule_caps; + efi_query_variable_info_t *query_variable_info; + }; + efi_runtime_services_32_t mixed_mode; +} efi_runtime_services_t; + +struct efi_memory_map { + phys_addr_t phys_map; + void *map; + void *map_end; + int nr_map; + long unsigned int desc_version; + long unsigned int desc_size; + long unsigned int flags; +}; + +struct efi { + const efi_runtime_services_t *runtime; + unsigned int runtime_version; + unsigned int runtime_supported_mask; + long unsigned int acpi; + long unsigned int acpi20; + long unsigned int smbios; + long unsigned int smbios3; + long unsigned int esrt; + long unsigned int tpm_log; + long unsigned int tpm_final_log; + long unsigned int mokvar_table; + long unsigned int coco_secret; + efi_get_time_t *get_time; + efi_set_time_t *set_time; + efi_get_wakeup_time_t *get_wakeup_time; + efi_set_wakeup_time_t *set_wakeup_time; + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_info_t *query_variable_info; + efi_query_variable_info_t *query_variable_info_nonblocking; + efi_update_capsule_t *update_capsule; + efi_query_capsule_caps_t *query_capsule_caps; + efi_get_next_high_mono_count_t *get_next_high_mono_count; + efi_reset_system_t *reset_system; + struct efi_memory_map memmap; + long unsigned int flags; + long: 32; +}; + +struct pm_qos_flags_request { + struct list_head node; + s32 flags; +}; + +enum freq_qos_req_type { + FREQ_QOS_MIN = 1, + FREQ_QOS_MAX = 2, +}; + +struct freq_qos_request { + enum freq_qos_req_type type; + struct plist_node pnode; + struct freq_constraints *qos; +}; + +enum dev_pm_qos_req_type { + DEV_PM_QOS_RESUME_LATENCY = 1, + DEV_PM_QOS_LATENCY_TOLERANCE = 2, + DEV_PM_QOS_MIN_FREQUENCY = 3, + DEV_PM_QOS_MAX_FREQUENCY = 4, + DEV_PM_QOS_FLAGS = 5, +}; + +struct dev_pm_qos_request { + enum dev_pm_qos_req_type type; + union { + struct plist_node pnode; + struct pm_qos_flags_request flr; + struct freq_qos_request freq; + } data; + struct device *dev; +}; + +struct tk_read_base { + struct clocksource *clock; + long: 32; + u64 mask; + u64 cycle_last; + u32 mult; + u32 shift; + u64 xtime_nsec; + ktime_t base; + u64 base_real; +}; + +struct timekeeper { + struct tk_read_base tkr_mono; + struct tk_read_base tkr_raw; + u64 xtime_sec; + long unsigned int ktime_sec; + long: 32; + struct timespec64 wall_to_monotonic; + ktime_t offs_real; + ktime_t offs_boot; + ktime_t offs_tai; + s32 tai_offset; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; + long: 32; + ktime_t next_leap_ktime; + u64 raw_sec; + struct timespec64 monotonic_to_boot; + u64 cycle_interval; + u64 xtime_interval; + s64 xtime_remainder; + u64 raw_interval; + u64 ntp_tick; + s64 ntp_error; + u32 ntp_error_shift; + u32 ntp_err_mult; + u32 skip_second_overflow; + long: 32; +}; + +struct xen_dm_op_buf; + +typedef uint16_t grant_status_t; + +enum { + DQF_ROOT_SQUASH_B = 0, + DQF_SYS_FILE_B = 16, + DQF_PRIVATE = 17, +}; + +enum { + DQST_LOOKUPS = 0, + DQST_DROPS = 1, + DQST_READS = 2, + DQST_WRITES = 3, + DQST_CACHE_HITS = 4, + DQST_ALLOC_DQUOTS = 5, + DQST_FREE_DQUOTS = 6, + DQST_SYNCS = 7, + _DQST_DQSTAT_LAST = 8, +}; + +enum { + SB_UNFROZEN = 0, + SB_FREEZE_WRITE = 1, + SB_FREEZE_PAGEFAULT = 2, + SB_FREEZE_FS = 3, + SB_FREEZE_COMPLETE = 4, +}; + +enum compound_dtor_id { + NULL_COMPOUND_DTOR = 0, + COMPOUND_PAGE_DTOR = 1, + HUGETLB_PAGE_DTOR = 2, + TRANSHUGE_PAGE_DTOR = 3, + NR_COMPOUND_DTORS = 4, +}; + +enum vm_event_item { + PGPGIN = 0, + PGPGOUT = 1, + PSWPIN = 2, + PSWPOUT = 3, + PGALLOC_DMA = 4, + PGALLOC_NORMAL = 5, + PGALLOC_HIGH = 6, + PGALLOC_MOVABLE = 7, + ALLOCSTALL_DMA = 8, + ALLOCSTALL_NORMAL = 9, + ALLOCSTALL_HIGH = 10, + ALLOCSTALL_MOVABLE = 11, + PGSCAN_SKIP_DMA = 12, + PGSCAN_SKIP_NORMAL = 13, + PGSCAN_SKIP_HIGH = 14, + PGSCAN_SKIP_MOVABLE = 15, + PGFREE = 16, + PGACTIVATE = 17, + PGDEACTIVATE = 18, + PGLAZYFREE = 19, + PGFAULT = 20, + PGMAJFAULT = 21, + PGLAZYFREED = 22, + PGREFILL = 23, + PGREUSE = 24, + PGSTEAL_KSWAPD = 25, + PGSTEAL_DIRECT = 26, + PGSTEAL_KHUGEPAGED = 27, + PGDEMOTE_KSWAPD = 28, + PGDEMOTE_DIRECT = 29, + PGDEMOTE_KHUGEPAGED = 30, + PGSCAN_KSWAPD = 31, + PGSCAN_DIRECT = 32, + PGSCAN_KHUGEPAGED = 33, + PGSCAN_DIRECT_THROTTLE = 34, + PGSCAN_ANON = 35, + PGSCAN_FILE = 36, + PGSTEAL_ANON = 37, + PGSTEAL_FILE = 38, + PGINODESTEAL = 39, + SLABS_SCANNED = 40, + KSWAPD_INODESTEAL = 41, + KSWAPD_LOW_WMARK_HIT_QUICKLY = 42, + KSWAPD_HIGH_WMARK_HIT_QUICKLY = 43, + PAGEOUTRUN = 44, + PGROTATED = 45, + DROP_PAGECACHE = 46, + DROP_SLAB = 47, + OOM_KILL = 48, + PGMIGRATE_SUCCESS = 49, + PGMIGRATE_FAIL = 50, + THP_MIGRATION_SUCCESS = 51, + THP_MIGRATION_FAIL = 52, + THP_MIGRATION_SPLIT = 53, + COMPACTMIGRATE_SCANNED = 54, + COMPACTFREE_SCANNED = 55, + COMPACTISOLATED = 56, + COMPACTSTALL = 57, + COMPACTFAIL = 58, + COMPACTSUCCESS = 59, + KCOMPACTD_WAKE = 60, + KCOMPACTD_MIGRATE_SCANNED = 61, + KCOMPACTD_FREE_SCANNED = 62, + HTLB_BUDDY_PGALLOC = 63, + HTLB_BUDDY_PGALLOC_FAIL = 64, + CMA_ALLOC_SUCCESS = 65, + CMA_ALLOC_FAIL = 66, + UNEVICTABLE_PGCULLED = 67, + UNEVICTABLE_PGSCANNED = 68, + UNEVICTABLE_PGRESCUED = 69, + UNEVICTABLE_PGMLOCKED = 70, + UNEVICTABLE_PGMUNLOCKED = 71, + UNEVICTABLE_PGCLEARED = 72, + UNEVICTABLE_PGSTRANDED = 73, + THP_FAULT_ALLOC = 74, + THP_FAULT_FALLBACK = 75, + THP_FAULT_FALLBACK_CHARGE = 76, + THP_COLLAPSE_ALLOC = 77, + THP_COLLAPSE_ALLOC_FAILED = 78, + THP_FILE_ALLOC = 79, + THP_FILE_FALLBACK = 80, + THP_FILE_FALLBACK_CHARGE = 81, + THP_FILE_MAPPED = 82, + THP_SPLIT_PAGE = 83, + THP_SPLIT_PAGE_FAILED = 84, + THP_DEFERRED_SPLIT_PAGE = 85, + THP_SPLIT_PMD = 86, + THP_SCAN_EXCEED_NONE_PTE = 87, + THP_SCAN_EXCEED_SWAP_PTE = 88, + THP_SCAN_EXCEED_SHARED_PTE = 89, + THP_ZERO_PAGE_ALLOC = 90, + THP_ZERO_PAGE_ALLOC_FAILED = 91, + THP_SWPOUT = 92, + THP_SWPOUT_FALLBACK = 93, + BALLOON_INFLATE = 94, + BALLOON_DEFLATE = 95, + BALLOON_MIGRATE = 96, + SWAP_RA = 97, + SWAP_RA_HIT = 98, + KSM_SWPIN_COPY = 99, + COW_KSM = 100, + ZSWPIN = 101, + ZSWPOUT = 102, + NR_VM_EVENT_ITEMS = 103, +}; + +typedef uint32_t grant_ref_t; + +typedef uint32_t grant_handle_t; + +struct gnttab_map_grant_ref { + uint64_t host_addr; + uint32_t flags; + grant_ref_t ref; + domid_t dom; + int16_t status; + grant_handle_t handle; + uint64_t dev_bus_addr; +}; + +struct gnttab_unmap_grant_ref { + uint64_t host_addr; + uint64_t dev_bus_addr; + grant_handle_t handle; + int16_t status; +}; + +struct xen_p2m_entry { + long unsigned int pfn; + long unsigned int mfn; + long unsigned int nr_pages; + struct rb_node rbnode_phys; +}; + +struct io_tlb_area; + +struct io_tlb_slot; + +struct io_tlb_mem { + phys_addr_t start; + phys_addr_t end; + void *vaddr; + long unsigned int nslabs; + long unsigned int used; + struct dentry *debugfs; + bool late_alloc; + bool force_bounce; + bool for_alloc; + unsigned int nareas; + unsigned int area_nslabs; + struct io_tlb_area *areas; + struct io_tlb_slot *slots; + long: 32; +}; + +struct sg_table { + struct scatterlist *sgl; + unsigned int nents; + unsigned int orig_nents; +}; + +enum memblock_flags { + MEMBLOCK_NONE = 0, + MEMBLOCK_HOTPLUG = 1, + MEMBLOCK_MIRROR = 2, + MEMBLOCK_NOMAP = 4, + MEMBLOCK_DRIVER_MANAGED = 8, +}; + +struct memblock_region { + phys_addr_t base; + phys_addr_t size; + enum memblock_flags flags; + long: 32; +}; + +struct memblock_type { + long unsigned int cnt; + long unsigned int max; + phys_addr_t total_size; + struct memblock_region *regions; + char *name; +}; + +struct memblock { + bool bottom_up; + long: 32; + phys_addr_t current_limit; + struct memblock_type memory; + struct memblock_type reserved; +}; + +struct gnttab_cache_flush { + union { + uint64_t dev_bus_addr; + grant_ref_t ref; + } a; + uint16_t offset; + uint16_t length; + uint32_t op; +}; + +enum { + HI_SOFTIRQ = 0, + TIMER_SOFTIRQ = 1, + NET_TX_SOFTIRQ = 2, + NET_RX_SOFTIRQ = 3, + BLOCK_SOFTIRQ = 4, + IRQ_POLL_SOFTIRQ = 5, + TASKLET_SOFTIRQ = 6, + SCHED_SOFTIRQ = 7, + HRTIMER_SOFTIRQ = 8, + RCU_SOFTIRQ = 9, + NR_SOFTIRQS = 10, +}; + +enum { + PER_LINUX = 0, + PER_LINUX_32BIT = 8388608, + PER_LINUX_FDPIC = 524288, + PER_SVR4 = 68157441, + PER_SVR3 = 83886082, + PER_SCOSVR3 = 117440515, + PER_OSR5 = 100663299, + PER_WYSEV386 = 83886084, + PER_ISCR4 = 67108869, + PER_BSD = 6, + PER_SUNOS = 67108870, + PER_XENIX = 83886087, + PER_LINUX32 = 8, + PER_LINUX32_3GB = 134217736, + PER_IRIX32 = 67108873, + PER_IRIXN32 = 67108874, + PER_IRIX64 = 67108875, + PER_RISCOS = 12, + PER_SOLARIS = 67108877, + PER_UW7 = 68157454, + PER_OSF4 = 15, + PER_HPUX = 16, + PER_MASK = 255, +}; + +struct elf32_hdr { + unsigned char e_ident[16]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +}; + +struct smp_operations { + void (*smp_init_cpus)(); + void (*smp_prepare_cpus)(unsigned int); + void (*smp_secondary_init)(unsigned int); + int (*smp_boot_secondary)(unsigned int, struct task_struct *); + int (*cpu_kill)(unsigned int); + void (*cpu_die)(unsigned int); + bool (*cpu_can_disable)(unsigned int); + int (*cpu_disable)(unsigned int); +}; + +struct l2x0_regs { + long unsigned int phy_base; + long unsigned int aux_ctrl; + long unsigned int tag_latency; + long unsigned int data_latency; + long unsigned int filter_start; + long unsigned int filter_end; + long unsigned int prefetch_ctrl; + long unsigned int pwr_ctrl; + long unsigned int ctrl; + long unsigned int aux2_ctrl; +}; + +struct outer_cache_fns { + void (*inv_range)(long unsigned int, long unsigned int); + void (*clean_range)(long unsigned int, long unsigned int); + void (*flush_range)(long unsigned int, long unsigned int); + void (*flush_all)(); + void (*disable)(); + void (*sync)(); + void (*resume)(); + void (*write_sec)(long unsigned int, unsigned int); + void (*configure)(const struct l2x0_regs *); +}; + +enum reboot_mode { + REBOOT_UNDEFINED = 4294967295, + REBOOT_COLD = 0, + REBOOT_WARM = 1, + REBOOT_HARD = 2, + REBOOT_SOFT = 3, + REBOOT_GPIO = 4, +}; + +struct tag; + +struct machine_desc { + unsigned int nr; + const char *name; + long unsigned int atag_offset; + const char * const *dt_compat; + unsigned int nr_irqs; + long: 32; + phys_addr_t dma_zone_size; + unsigned int video_start; + unsigned int video_end; + unsigned char reserve_lp0: 1; + unsigned char reserve_lp1: 1; + unsigned char reserve_lp2: 1; + enum reboot_mode reboot_mode; + unsigned int l2c_aux_val; + unsigned int l2c_aux_mask; + void (*l2c_write_sec)(long unsigned int, unsigned int); + const struct smp_operations *smp; + bool (*smp_init)(); + void (*fixup)(struct tag *, char **); + void (*dt_fixup)(); + long long int (*pv_fixup)(); + void (*reserve)(); + void (*map_io)(); + void (*init_early)(); + void (*init_irq)(); + void (*init_time)(); + void (*init_machine)(); + void (*init_late)(); + void (*handle_irq)(struct pt_regs *); + void (*restart)(enum reboot_mode, const char *); + long: 32; +}; + +struct kernel_clone_args { + u64 flags; + int *pidfd; + int *child_tid; + int *parent_tid; + int exit_signal; + long unsigned int stack; + long unsigned int stack_size; + long unsigned int tls; + pid_t *set_tid; + size_t set_tid_size; + int cgroup; + int io_thread; + int kthread; + int idle; + int (*fn)(void *); + void *fn_arg; + struct cgroup *cgrp; + struct css_set *cset; + long: 32; +}; + +struct vm_special_mapping { + const char *name; + struct page **pages; + vm_fault_t (*fault)(const struct vm_special_mapping *, struct vm_area_struct *, struct vm_fault *); + int (*mremap)(const struct vm_special_mapping *, struct vm_area_struct *); +}; + +struct processor { + void (*_data_abort)(long unsigned int); + long unsigned int (*_prefetch_abort)(long unsigned int); + void (*_proc_init)(); + void (*check_bugs)(); + void (*_proc_fin)(); + void (*reset)(long unsigned int, bool); + int (*_do_idle)(); + void (*dcache_clean_area)(void *, int); + void (*switch_mm)(phys_addr_t, struct mm_struct *); + void (*set_pte_ext)(pte_t *, pte_t); + unsigned int suspend_size; + void (*do_suspend)(void *); + void (*do_resume)(void *); +}; + +enum cpu_led_event { + CPU_LED_IDLE_START = 0, + CPU_LED_IDLE_END = 1, + CPU_LED_START = 2, + CPU_LED_STOP = 3, + CPU_LED_HALTED = 4, +}; + +struct stackframe { + long unsigned int fp; + long unsigned int sp; + long unsigned int lr; + long unsigned int pc; + long unsigned int *lr_addr; + struct llist_node *kr_cur; + struct task_struct *tsk; + bool ex_frame; +}; + +struct seccomp_data { + int nr; + __u32 arch; + __u64 instruction_pointer; + __u64 args[6]; +}; + +enum perf_type_id { + PERF_TYPE_HARDWARE = 0, + PERF_TYPE_SOFTWARE = 1, + PERF_TYPE_TRACEPOINT = 2, + PERF_TYPE_HW_CACHE = 3, + PERF_TYPE_RAW = 4, + PERF_TYPE_BREAKPOINT = 5, + PERF_TYPE_MAX = 6, +}; + +enum { + TASKSTATS_CMD_UNSPEC = 0, + TASKSTATS_CMD_GET = 1, + TASKSTATS_CMD_NEW = 2, + __TASKSTATS_CMD_MAX = 3, +}; + +enum ucount_type { + UCOUNT_USER_NAMESPACES = 0, + UCOUNT_PID_NAMESPACES = 1, + UCOUNT_UTS_NAMESPACES = 2, + UCOUNT_IPC_NAMESPACES = 3, + UCOUNT_NET_NAMESPACES = 4, + UCOUNT_MNT_NAMESPACES = 5, + UCOUNT_CGROUP_NAMESPACES = 6, + UCOUNT_TIME_NAMESPACES = 7, + UCOUNT_INOTIFY_INSTANCES = 8, + UCOUNT_INOTIFY_WATCHES = 9, + UCOUNT_FANOTIFY_GROUPS = 10, + UCOUNT_FANOTIFY_MARKS = 11, + UCOUNT_COUNTS = 12, +}; + +enum rlimit_type { + UCOUNT_RLIMIT_NPROC = 0, + UCOUNT_RLIMIT_MSGQUEUE = 1, + UCOUNT_RLIMIT_SIGPENDING = 2, + UCOUNT_RLIMIT_MEMLOCK = 3, + UCOUNT_RLIMIT_COUNTS = 4, +}; + +enum cpu_usage_stat { + CPUTIME_USER = 0, + CPUTIME_NICE = 1, + CPUTIME_SYSTEM = 2, + CPUTIME_SOFTIRQ = 3, + CPUTIME_IRQ = 4, + CPUTIME_IDLE = 5, + CPUTIME_IOWAIT = 6, + CPUTIME_STEAL = 7, + CPUTIME_GUEST = 8, + CPUTIME_GUEST_NICE = 9, + NR_STATS = 10, +}; + +enum cgroup_bpf_attach_type { + CGROUP_BPF_ATTACH_TYPE_INVALID = 4294967295, + CGROUP_INET_INGRESS = 0, + CGROUP_INET_EGRESS = 1, + CGROUP_INET_SOCK_CREATE = 2, + CGROUP_SOCK_OPS = 3, + CGROUP_DEVICE = 4, + CGROUP_INET4_BIND = 5, + CGROUP_INET6_BIND = 6, + CGROUP_INET4_CONNECT = 7, + CGROUP_INET6_CONNECT = 8, + CGROUP_INET4_POST_BIND = 9, + CGROUP_INET6_POST_BIND = 10, + CGROUP_UDP4_SENDMSG = 11, + CGROUP_UDP6_SENDMSG = 12, + CGROUP_SYSCTL = 13, + CGROUP_UDP4_RECVMSG = 14, + CGROUP_UDP6_RECVMSG = 15, + CGROUP_GETSOCKOPT = 16, + CGROUP_SETSOCKOPT = 17, + CGROUP_INET4_GETPEERNAME = 18, + CGROUP_INET6_GETPEERNAME = 19, + CGROUP_INET4_GETSOCKNAME = 20, + CGROUP_INET6_GETSOCKNAME = 21, + CGROUP_INET_SOCK_RELEASE = 22, + CGROUP_LSM_START = 23, + CGROUP_LSM_END = 32, + MAX_CGROUP_BPF_ATTACH_TYPE = 33, +}; + +enum psi_task_count { + NR_IOWAIT = 0, + NR_MEMSTALL = 1, + NR_RUNNING = 2, + NR_MEMSTALL_RUNNING = 3, + NR_PSI_TASK_COUNTS = 4, +}; + +enum psi_res { + PSI_IO = 0, + PSI_MEM = 1, + PSI_CPU = 2, + NR_PSI_RESOURCES = 3, +}; + +enum psi_states { + PSI_IO_SOME = 0, + PSI_IO_FULL = 1, + PSI_MEM_SOME = 2, + PSI_MEM_FULL = 3, + PSI_CPU_SOME = 4, + PSI_CPU_FULL = 5, + PSI_NONIDLE = 6, + NR_PSI_STATES = 7, +}; + +enum psi_aggregators { + PSI_AVGS = 0, + PSI_POLL = 1, + NR_PSI_AGGREGATORS = 2, +}; + +enum cgroup_subsys_id { + cpuset_cgrp_id = 0, + cpu_cgrp_id = 1, + cpuacct_cgrp_id = 2, + io_cgrp_id = 3, + memory_cgrp_id = 4, + devices_cgrp_id = 5, + freezer_cgrp_id = 6, + net_cls_cgrp_id = 7, + perf_event_cgrp_id = 8, + net_prio_cgrp_id = 9, + hugetlb_cgrp_id = 10, + pids_cgrp_id = 11, + rdma_cgrp_id = 12, + CGROUP_SUBSYS_COUNT = 13, +}; + +enum { + HW_BREAKPOINT_LEN_1 = 1, + HW_BREAKPOINT_LEN_2 = 2, + HW_BREAKPOINT_LEN_3 = 3, + HW_BREAKPOINT_LEN_4 = 4, + HW_BREAKPOINT_LEN_5 = 5, + HW_BREAKPOINT_LEN_6 = 6, + HW_BREAKPOINT_LEN_7 = 7, + HW_BREAKPOINT_LEN_8 = 8, +}; + +enum { + HW_BREAKPOINT_EMPTY = 0, + HW_BREAKPOINT_R = 1, + HW_BREAKPOINT_W = 2, + HW_BREAKPOINT_RW = 3, + HW_BREAKPOINT_X = 4, + HW_BREAKPOINT_INVALID = 7, +}; + +enum bp_type_idx { + TYPE_INST = 0, + TYPE_DATA = 1, + TYPE_MAX = 2, +}; + +struct membuf { + void *p; + size_t left; +}; + +struct user_regset; + +typedef int user_regset_active_fn(struct task_struct *, const struct user_regset *); + +typedef int user_regset_get2_fn(struct task_struct *, const struct user_regset *, struct membuf); + +typedef int user_regset_set_fn(struct task_struct *, const struct user_regset *, unsigned int, unsigned int, const void *, const void *); + +typedef int user_regset_writeback_fn(struct task_struct *, const struct user_regset *, int); + +struct user_regset { + user_regset_get2_fn *regset_get; + user_regset_set_fn *set; + user_regset_active_fn *active; + user_regset_writeback_fn *writeback; + unsigned int n; + unsigned int size; + unsigned int align; + unsigned int bias; + unsigned int core_note_type; +}; + +struct user_regset_view { + const char *name; + const struct user_regset *regsets; + unsigned int n; + u32 e_flags; + u16 e_machine; + u8 ei_osabi; +}; + +struct trace_event_raw_sys_enter { + struct trace_entry ent; + long int id; + long unsigned int args[6]; + char __data[0]; +}; + +struct trace_event_raw_sys_exit { + struct trace_entry ent; + long int id; + long int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_sys_enter {}; + +struct trace_event_data_offsets_sys_exit {}; + +typedef void (*btf_trace_sys_enter)(void *, struct pt_regs *, long int); + +typedef void (*btf_trace_sys_exit)(void *, struct pt_regs *, long int); + +struct pt_regs_offset { + const char *name; + int offset; +}; + +enum arm_regset { + REGSET_GPR = 0, + REGSET_FPR = 1, + REGSET_VFP = 2, +}; + +enum ptrace_syscall_dir { + PTRACE_SYSCALL_ENTER = 0, + PTRACE_SYSCALL_EXIT = 1, +}; + +typedef void (*phys_reset_t)(long unsigned int, bool); + +struct cpu_user_fns { + void (*cpu_clear_user_highpage)(struct page *, long unsigned int); + void (*cpu_copy_user_highpage)(struct page *, struct page *, long unsigned int, struct vm_area_struct *); +}; + +struct screen_info { + __u8 orig_x; + __u8 orig_y; + __u16 ext_mem_k; + __u16 orig_video_page; + __u8 orig_video_mode; + __u8 orig_video_cols; + __u8 flags; + __u8 unused2; + __u16 orig_video_ega_bx; + __u16 unused3; + __u8 orig_video_lines; + __u8 orig_video_isVGA; + __u16 orig_video_points; + __u16 lfb_width; + __u16 lfb_height; + __u16 lfb_depth; + __u32 lfb_base; + __u32 lfb_size; + __u16 cl_magic; + __u16 cl_offset; + __u16 lfb_linelength; + __u8 red_size; + __u8 red_pos; + __u8 green_size; + __u8 green_pos; + __u8 blue_size; + __u8 blue_pos; + __u8 rsvd_size; + __u8 rsvd_pos; + __u16 vesapm_seg; + __u16 vesapm_off; + __u16 pages; + __u16 vesa_attributes; + __u32 capabilities; + __u32 ext_lfb_base; + __u8 _reserved[2]; +} __attribute__((packed)); + +struct cpu { + int node_id; + int hotpluggable; + struct device dev; +}; + +struct cpu_tlb_fns { + void (*flush_user_range)(long unsigned int, long unsigned int, struct vm_area_struct *); + void (*flush_kern_range)(long unsigned int, long unsigned int); + long unsigned int tlb_flags; +}; + +typedef __be32 fdt32_t; + +struct fdt_header { + fdt32_t magic; + fdt32_t totalsize; + fdt32_t off_dt_struct; + fdt32_t off_dt_strings; + fdt32_t off_mem_rsvmap; + fdt32_t version; + fdt32_t last_comp_version; + fdt32_t boot_cpuid_phys; + fdt32_t size_dt_strings; + fdt32_t size_dt_struct; +}; + +struct cpuinfo_arm { + struct cpu cpu; + u32 cpuid; + unsigned int loops_per_jiffy; +}; + +struct cpu_cache_fns { + void (*flush_icache_all)(); + void (*flush_kern_all)(); + void (*flush_kern_louis)(); + void (*flush_user_all)(); + void (*flush_user_range)(long unsigned int, long unsigned int, unsigned int); + void (*coherent_kern_range)(long unsigned int, long unsigned int); + int (*coherent_user_range)(long unsigned int, long unsigned int); + void (*flush_kern_dcache_area)(void *, size_t); + void (*dma_map_area)(const void *, size_t, int); + void (*dma_unmap_area)(const void *, size_t, int); + void (*dma_flush_range)(const void *, const void *); +}; + +struct mpidr_hash { + u32 mask; + u32 shift_aff[3]; + u32 bits; +}; + +struct proc_info_list { + unsigned int cpu_val; + unsigned int cpu_mask; + long unsigned int __cpu_mm_mmu_flags; + long unsigned int __cpu_io_mmu_flags; + long unsigned int __cpu_flush; + const char *arch_name; + const char *elf_name; + unsigned int elf_hwcap; + const char *cpu_name; + struct processor *proc; + struct cpu_tlb_fns *tlb; + struct cpu_user_fns *user; + struct cpu_cache_fns *cache; +}; + +struct tag_header { + __u32 size; + __u32 tag; +}; + +struct tag_core { + __u32 flags; + __u32 pagesize; + __u32 rootdev; +}; + +struct tag_mem32 { + __u32 size; + __u32 start; +}; + +struct tag_videotext { + __u8 x; + __u8 y; + __u16 video_page; + __u8 video_mode; + __u8 video_cols; + __u16 video_ega_bx; + __u8 video_lines; + __u8 video_isvga; + __u16 video_points; +}; + +struct tag_ramdisk { + __u32 flags; + __u32 size; + __u32 start; +}; + +struct tag_initrd { + __u32 start; + __u32 size; +}; + +struct tag_serialnr { + __u32 low; + __u32 high; +}; + +struct tag_revision { + __u32 rev; +}; + +struct tag_videolfb { + __u16 lfb_width; + __u16 lfb_height; + __u16 lfb_depth; + __u16 lfb_linelength; + __u32 lfb_base; + __u32 lfb_size; + __u8 red_size; + __u8 red_pos; + __u8 green_size; + __u8 green_pos; + __u8 blue_size; + __u8 blue_pos; + __u8 rsvd_size; + __u8 rsvd_pos; +}; + +struct tag_cmdline { + char cmdline[1]; +}; + +struct tag_acorn { + __u32 memc_control_reg; + __u32 vram_pages; + __u8 sounddefault; + __u8 adfsdrives; +}; + +struct tag_memclk { + __u32 fmemclk; +}; + +struct tag { + struct tag_header hdr; + union { + struct tag_core core; + struct tag_mem32 mem; + struct tag_videotext videotext; + struct tag_ramdisk ramdisk; + struct tag_initrd initrd; + struct tag_serialnr serialnr; + struct tag_revision revision; + struct tag_videolfb videolfb; + struct tag_cmdline cmdline; + struct tag_acorn acorn; + struct tag_memclk memclk; + } u; +}; + +struct stack { + u32 irq[4]; + u32 abt[4]; + u32 und[4]; + u32 fiq[4]; +}; + +struct sigaltstack { + void *ss_sp; + int ss_flags; + __kernel_size_t ss_size; +}; + +typedef struct sigaltstack stack_t; + +struct sigcontext { + long unsigned int trap_no; + long unsigned int error_code; + long unsigned int oldmask; + long unsigned int arm_r0; + long unsigned int arm_r1; + long unsigned int arm_r2; + long unsigned int arm_r3; + long unsigned int arm_r4; + long unsigned int arm_r5; + long unsigned int arm_r6; + long unsigned int arm_r7; + long unsigned int arm_r8; + long unsigned int arm_r9; + long unsigned int arm_r10; + long unsigned int arm_fp; + long unsigned int arm_ip; + long unsigned int arm_sp; + long unsigned int arm_lr; + long unsigned int arm_pc; + long unsigned int arm_cpsr; + long unsigned int fault_address; +}; + +struct siginfo { + union { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; + int _si_pad[32]; + }; +}; + +typedef struct siginfo siginfo_t; + +struct ksignal { + struct k_sigaction ka; + kernel_siginfo_t info; + int sig; +}; + +struct ucontext { + long unsigned int uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + struct sigcontext uc_mcontext; + sigset_t uc_sigmask; + int __unused[30]; + long unsigned int uc_regspace[128]; +}; + +struct iwmmxt_sigframe { + long unsigned int magic; + long unsigned int size; + struct iwmmxt_struct storage; +}; + +struct vfp_sigframe { + long unsigned int magic; + long unsigned int size; + struct user_vfp ufp; + struct user_vfp_exc ufp_exc; + long: 32; +}; + +struct aux_sigframe { + struct iwmmxt_sigframe iwmmxt; + struct vfp_sigframe vfp; + long unsigned int end_magic; + long: 32; +}; + +struct sigframe { + struct ucontext uc; + long unsigned int retcode[4]; +}; + +struct rt_sigframe { + struct siginfo info; + struct sigframe sig; +}; + +typedef bool (*stack_trace_consume_fn)(void *, long unsigned int); + +typedef void (*clock_access_fn)(struct timespec64 *); + +enum lockdep_ok { + LOCKDEP_STILL_OK = 0, + LOCKDEP_NOW_UNRELIABLE = 1, +}; + +enum bug_trap_type { + BUG_TRAP_TYPE_NONE = 0, + BUG_TRAP_TYPE_WARN = 1, + BUG_TRAP_TYPE_BUG = 2, +}; + +enum die_val { + DIE_UNUSED = 0, + DIE_OOPS = 1, +}; + +enum { + SPECTRE_UNAFFECTED = 0, + SPECTRE_MITIGATED = 1, + SPECTRE_VULNERABLE = 2, +}; + +enum { + __SPECTRE_V2_METHOD_BPIALL = 0, + __SPECTRE_V2_METHOD_ICIALLU = 1, + __SPECTRE_V2_METHOD_SMC = 2, + __SPECTRE_V2_METHOD_HVC = 3, + __SPECTRE_V2_METHOD_LOOP8 = 4, +}; + +enum { + SPECTRE_V2_METHOD_BPIALL = 1, + SPECTRE_V2_METHOD_ICIALLU = 2, + SPECTRE_V2_METHOD_SMC = 4, + SPECTRE_V2_METHOD_HVC = 8, + SPECTRE_V2_METHOD_LOOP8 = 16, +}; + +struct return_address_data { + unsigned int level; + void *addr; +}; + +struct tagtable { + __u32 tag; + int (*parse)(const struct tag *); +}; + +struct proc_ops { + unsigned int proc_flags; + int (*proc_open)(struct inode *, struct file *); + ssize_t (*proc_read)(struct file *, char *, size_t, loff_t *); + ssize_t (*proc_read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*proc_write)(struct file *, const char *, size_t, loff_t *); + loff_t (*proc_lseek)(struct file *, loff_t, int); + int (*proc_release)(struct inode *, struct file *); + __poll_t (*proc_poll)(struct file *, struct poll_table_struct *); + long int (*proc_ioctl)(struct file *, unsigned int, long unsigned int); + int (*proc_mmap)(struct file *, struct vm_area_struct *); + long unsigned int (*proc_get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); +}; + +struct buffer { + size_t size; + char data[0]; +}; + +struct fiq_handler { + struct fiq_handler *next; + const char *name; + int (*fiq_op)(void *, int); + void *dev_id; +}; + +struct arm_smccc_res { + long unsigned int a0; + long unsigned int a1; + long unsigned int a2; + long unsigned int a3; +}; + +struct arm_smccc_quirk { + int id; + union { + long unsigned int a6; + } state; +}; + +struct elf32_rel { + Elf32_Addr r_offset; + Elf32_Word r_info; +}; + +typedef struct elf32_rel Elf32_Rel; + +typedef struct elf32_hdr Elf32_Ehdr; + +typedef struct elf32_shdr Elf32_Shdr; + +typedef void (*swap_func_t)(void *, void *, int); + +typedef int (*cmp_func_t)(const void *, const void *); + +typedef unsigned int u_int; + +struct pci_device_id { + __u32 vendor; + __u32 device; + __u32 subvendor; + __u32 subdevice; + __u32 class; + __u32 class_mask; + kernel_ulong_t driver_data; + __u32 override_only; +}; + +struct resource_entry { + struct list_head node; + struct resource *res; + long: 32; + resource_size_t offset; + struct resource __res; +}; + +struct pci_bus; + +struct hotplug_slot; + +struct pci_slot { + struct pci_bus *bus; + struct list_head list; + struct hotplug_slot *hotplug; + unsigned char number; + struct kobject kobj; +}; + +typedef short unsigned int pci_bus_flags_t; + +struct pci_dev; + +struct pci_ops; + +struct pci_bus { + struct list_head node; + struct pci_bus *parent; + struct list_head children; + struct list_head devices; + struct pci_dev *self; + struct list_head slots; + struct resource *resource[4]; + struct list_head resources; + struct resource busn_res; + struct pci_ops *ops; + void *sysdata; + struct proc_dir_entry *procdir; + unsigned char number; + unsigned char primary; + unsigned char max_bus_speed; + unsigned char cur_bus_speed; + int domain_nr; + char name[48]; + short unsigned int bridge_ctl; + pci_bus_flags_t bus_flags; + struct device *bridge; + long: 32; + struct device dev; + struct bin_attribute *legacy_io; + struct bin_attribute *legacy_mem; + unsigned int is_added: 1; + unsigned int unsafe_warn: 1; + long: 32; +}; + +enum { + PCI_STD_RESOURCES = 0, + PCI_STD_RESOURCE_END = 5, + PCI_ROM_RESOURCE = 6, + PCI_BRIDGE_RESOURCES = 7, + PCI_BRIDGE_RESOURCE_END = 10, + PCI_NUM_RESOURCES = 11, + DEVICE_COUNT_RESOURCE = 11, +}; + +typedef int pci_power_t; + +typedef unsigned int pci_channel_state_t; + +typedef unsigned int pcie_reset_state_t; + +typedef short unsigned int pci_dev_flags_t; + +struct pci_vpd { + struct mutex lock; + unsigned int len; + u8 cap; +}; + +struct aer_stats; + +struct rcec_ea; + +struct pci_driver; + +struct pcie_link_state; + +struct pci_dev { + struct list_head bus_list; + struct pci_bus *bus; + struct pci_bus *subordinate; + void *sysdata; + struct proc_dir_entry *procent; + struct pci_slot *slot; + unsigned int devfn; + short unsigned int vendor; + short unsigned int device; + short unsigned int subsystem_vendor; + short unsigned int subsystem_device; + unsigned int class; + u8 revision; + u8 hdr_type; + u16 aer_cap; + struct aer_stats *aer_stats; + struct rcec_ea *rcec_ea; + struct pci_dev *rcec; + u32 devcap; + u8 pcie_cap; + u8 msi_cap; + u8 msix_cap; + u8 pcie_mpss: 3; + u8 rom_base_reg; + u8 pin; + u16 pcie_flags_reg; + long unsigned int *dma_alias_mask; + struct pci_driver *driver; + u64 dma_mask; + struct device_dma_parameters dma_parms; + pci_power_t current_state; + unsigned int imm_ready: 1; + u8 pm_cap; + unsigned int pme_support: 5; + unsigned int pme_poll: 1; + unsigned int d1_support: 1; + unsigned int d2_support: 1; + unsigned int no_d1d2: 1; + unsigned int no_d3cold: 1; + unsigned int bridge_d3: 1; + unsigned int d3cold_allowed: 1; + unsigned int mmio_always_on: 1; + unsigned int wakeup_prepared: 1; + unsigned int skip_bus_pm: 1; + unsigned int ignore_hotplug: 1; + unsigned int hotplug_user_indicators: 1; + unsigned int clear_retrain_link: 1; + unsigned int d3hot_delay; + unsigned int d3cold_delay; + struct pcie_link_state *link_state; + unsigned int ltr_path: 1; + u16 l1ss; + unsigned int pasid_no_tlp: 1; + unsigned int eetlp_prefix_path: 1; + pci_channel_state_t error_state; + struct device dev; + int cfg_size; + unsigned int irq; + struct resource resource[11]; + struct resource driver_exclusive_resource; + bool match_driver; + unsigned int transparent: 1; + unsigned int io_window: 1; + unsigned int pref_window: 1; + unsigned int pref_64_window: 1; + unsigned int multifunction: 1; + unsigned int is_busmaster: 1; + unsigned int no_msi: 1; + unsigned int no_64bit_msi: 1; + unsigned int block_cfg_access: 1; + unsigned int broken_parity_status: 1; + unsigned int irq_reroute_variant: 2; + unsigned int msi_enabled: 1; + unsigned int msix_enabled: 1; + unsigned int ari_enabled: 1; + unsigned int ats_enabled: 1; + unsigned int pasid_enabled: 1; + unsigned int pri_enabled: 1; + unsigned int is_managed: 1; + unsigned int is_msi_managed: 1; + unsigned int needs_freset: 1; + unsigned int state_saved: 1; + unsigned int is_physfn: 1; + unsigned int is_virtfn: 1; + unsigned int is_hotplug_bridge: 1; + unsigned int shpc_managed: 1; + unsigned int is_thunderbolt: 1; + unsigned int untrusted: 1; + unsigned int external_facing: 1; + unsigned int broken_intx_masking: 1; + unsigned int io_window_1k: 1; + unsigned int irq_managed: 1; + unsigned int non_compliant_bars: 1; + unsigned int is_probed: 1; + unsigned int link_active_reporting: 1; + unsigned int no_vf_scan: 1; + unsigned int no_command_memory: 1; + unsigned int rom_bar_overlap: 1; + pci_dev_flags_t dev_flags; + atomic_t enable_cnt; + u32 saved_config_space[16]; + struct hlist_head saved_cap_space; + int rom_attr_enabled; + struct bin_attribute *res_attr[11]; + struct bin_attribute *res_attr_wc[11]; + u16 ptm_cap; + unsigned int ptm_root: 1; + unsigned int ptm_enabled: 1; + u8 ptm_granularity; + void *msix_base; + raw_spinlock_t msi_lock; + struct pci_vpd vpd; + u16 dpc_cap; + unsigned int dpc_rp_extensions: 1; + u8 dpc_rp_log_size; + u16 acs_cap; + long: 32; + phys_addr_t rom; + size_t romlen; + const char *driver_override; + long unsigned int priv_flags; + u8 reset_methods[7]; + long: 32; +}; + +struct pci_dynids { + spinlock_t lock; + struct list_head list; +}; + +struct pci_error_handlers; + +struct pci_driver { + struct list_head node; + const char *name; + const struct pci_device_id *id_table; + int (*probe)(struct pci_dev *, const struct pci_device_id *); + void (*remove)(struct pci_dev *); + int (*suspend)(struct pci_dev *, pm_message_t); + int (*resume)(struct pci_dev *); + void (*shutdown)(struct pci_dev *); + int (*sriov_configure)(struct pci_dev *, int); + int (*sriov_set_msix_vec_count)(struct pci_dev *, int); + u32 (*sriov_get_vf_total_msix)(struct pci_dev *); + const struct pci_error_handlers *err_handler; + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + struct device_driver driver; + struct pci_dynids dynids; + bool driver_managed_dma; +}; + +struct pci_host_bridge { + struct device dev; + struct pci_bus *bus; + struct pci_ops *ops; + struct pci_ops *child_ops; + void *sysdata; + int busnr; + int domain_nr; + struct list_head windows; + struct list_head dma_ranges; + u8 (*swizzle_irq)(struct pci_dev *, u8 *); + int (*map_irq)(const struct pci_dev *, u8, u8); + void (*release_fn)(struct pci_host_bridge *); + void *release_data; + unsigned int ignore_reset_delay: 1; + unsigned int no_ext_tags: 1; + unsigned int native_aer: 1; + unsigned int native_pcie_hotplug: 1; + unsigned int native_shpc_hotplug: 1; + unsigned int native_pme: 1; + unsigned int native_ltr: 1; + unsigned int native_dpc: 1; + unsigned int preserve_config: 1; + unsigned int size_windows: 1; + unsigned int msi_domain: 1; + resource_size_t (*align_resource)(struct pci_dev *, const struct resource *, resource_size_t, resource_size_t, resource_size_t); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long unsigned int private[0]; +}; + +struct pci_ops { + int (*add_bus)(struct pci_bus *); + void (*remove_bus)(struct pci_bus *); + void * (*map_bus)(struct pci_bus *, unsigned int, int); + int (*read)(struct pci_bus *, unsigned int, int, int, u32 *); + int (*write)(struct pci_bus *, unsigned int, int, int, u32); +}; + +typedef unsigned int pci_ers_result_t; + +struct pci_error_handlers { + pci_ers_result_t (*error_detected)(struct pci_dev *, pci_channel_state_t); + pci_ers_result_t (*mmio_enabled)(struct pci_dev *); + pci_ers_result_t (*slot_reset)(struct pci_dev *); + void (*reset_prepare)(struct pci_dev *); + void (*reset_done)(struct pci_dev *); + void (*resume)(struct pci_dev *); + void (*cor_error_detected)(struct pci_dev *); +}; + +enum { + PCI_REASSIGN_ALL_RSRC = 1, + PCI_REASSIGN_ALL_BUS = 2, + PCI_PROBE_ONLY = 4, + PCI_CAN_SKIP_ISA_ALIGN = 8, + PCI_ENABLE_PROC_DOMAINS = 16, + PCI_COMPAT_DOMAIN_0 = 32, + PCI_SCAN_ALL_PCIE_DEVS = 64, +}; + +struct pci_sys_data; + +struct hw_pci { + struct pci_ops *ops; + int nr_controllers; + void **private_data; + int (*setup)(int, struct pci_sys_data *); + int (*scan)(int, struct pci_host_bridge *); + void (*preinit)(); + void (*postinit)(); + u8 (*swizzle)(struct pci_dev *, u8 *); + int (*map_irq)(const struct pci_dev *, u8, u8); +}; + +struct pci_sys_data { + struct list_head node; + int busnr; + long: 32; + u64 mem_offset; + long unsigned int io_offset; + struct pci_bus *bus; + struct list_head resources; + struct resource io_res; + char io_res_name[12]; + u8 (*swizzle)(struct pci_dev *, u8 *); + int (*map_irq)(const struct pci_dev *, u8, u8); + void *private_data; +}; + +struct pci_fixup { + u16 vendor; + u16 device; + u32 class; + unsigned int class_shift; + void (*hook)(struct pci_dev *); +}; + +struct map_desc { + long unsigned int virtual; + long unsigned int pfn; + long unsigned int length; + unsigned int type; +}; + +struct sleep_save_sp { + u32 *save_ptr_stash; + u32 save_ptr_stash_phys; +}; + +struct pbe { + void *address; + void *orig_address; + struct pbe *next; +}; + +struct mpu_rgn { + union { + u32 drbar; + u32 prbar; + }; + union { + u32 drsr; + u32 prlar; + }; + union { + u32 dracr; + u32 unused; + }; +}; + +struct mpu_rgn_info { + unsigned int used; + struct mpu_rgn rgns[16]; +}; + +struct secondary_data { + union { + struct mpu_rgn_info *mpu_rgn_info; + u64 pgdir; + }; + long unsigned int swapper_pg_dir; + void *stack; + struct task_struct *task; + long: 32; +}; + +typedef struct { + unsigned int __softirq_pending; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +} irq_cpustat_t; + +enum { + IRQ_TYPE_NONE = 0, + IRQ_TYPE_EDGE_RISING = 1, + IRQ_TYPE_EDGE_FALLING = 2, + IRQ_TYPE_EDGE_BOTH = 3, + IRQ_TYPE_LEVEL_HIGH = 4, + IRQ_TYPE_LEVEL_LOW = 8, + IRQ_TYPE_LEVEL_MASK = 12, + IRQ_TYPE_SENSE_MASK = 15, + IRQ_TYPE_DEFAULT = 15, + IRQ_TYPE_PROBE = 16, + IRQ_LEVEL = 256, + IRQ_PER_CPU = 512, + IRQ_NOPROBE = 1024, + IRQ_NOREQUEST = 2048, + IRQ_NOAUTOEN = 4096, + IRQ_NO_BALANCING = 8192, + IRQ_MOVE_PCNTXT = 16384, + IRQ_NESTED_THREAD = 32768, + IRQ_NOTHREAD = 65536, + IRQ_PER_CPU_DEVID = 131072, + IRQ_IS_POLLED = 262144, + IRQ_DISABLE_UNLAZY = 524288, + IRQ_HIDDEN = 1048576, + IRQ_NO_DEBUG = 2097152, +}; + +enum cpufreq_table_sorting { + CPUFREQ_TABLE_UNSORTED = 0, + CPUFREQ_TABLE_SORTED_ASCENDING = 1, + CPUFREQ_TABLE_SORTED_DESCENDING = 2, +}; + +struct cpufreq_cpuinfo { + unsigned int max_freq; + unsigned int min_freq; + unsigned int transition_latency; +}; + +struct clk; + +struct cpufreq_governor; + +struct cpufreq_frequency_table; + +struct cpufreq_stats; + +struct thermal_cooling_device; + +struct cpufreq_policy { + cpumask_var_t cpus; + cpumask_var_t related_cpus; + cpumask_var_t real_cpus; + unsigned int shared_type; + unsigned int cpu; + struct clk *clk; + struct cpufreq_cpuinfo cpuinfo; + unsigned int min; + unsigned int max; + unsigned int cur; + unsigned int suspend_freq; + unsigned int policy; + unsigned int last_policy; + struct cpufreq_governor *governor; + void *governor_data; + char last_governor[16]; + struct work_struct update; + struct freq_constraints constraints; + struct freq_qos_request *min_freq_req; + struct freq_qos_request *max_freq_req; + struct cpufreq_frequency_table *freq_table; + enum cpufreq_table_sorting freq_table_sorted; + struct list_head policy_list; + struct kobject kobj; + struct completion kobj_unregister; + struct rw_semaphore rwsem; + bool fast_switch_possible; + bool fast_switch_enabled; + bool strict_target; + bool efficiencies_available; + unsigned int transition_delay_us; + bool dvfs_possible_from_any_cpu; + unsigned int cached_target_freq; + unsigned int cached_resolved_idx; + bool transition_ongoing; + spinlock_t transition_lock; + wait_queue_head_t transition_wait; + struct task_struct *transition_task; + struct cpufreq_stats *stats; + void *driver_data; + struct thermal_cooling_device *cdev; + struct notifier_block nb_min; + struct notifier_block nb_max; +}; + +struct cpufreq_governor { + char name[16]; + int (*init)(struct cpufreq_policy *); + void (*exit)(struct cpufreq_policy *); + int (*start)(struct cpufreq_policy *); + void (*stop)(struct cpufreq_policy *); + void (*limits)(struct cpufreq_policy *); + ssize_t (*show_setspeed)(struct cpufreq_policy *, char *); + int (*store_setspeed)(struct cpufreq_policy *, unsigned int); + struct list_head governor_list; + struct module *owner; + u8 flags; +}; + +struct cpufreq_frequency_table { + unsigned int flags; + unsigned int driver_data; + unsigned int frequency; +}; + +struct cpufreq_freqs { + struct cpufreq_policy *policy; + unsigned int old; + unsigned int new; + u8 flags; +}; + +struct trace_event_raw_ipi_raise { + struct trace_entry ent; + u32 __data_loc_target_cpus; + const char *reason; + char __data[0]; +}; + +struct trace_event_raw_ipi_handler { + struct trace_entry ent; + const char *reason; + char __data[0]; +}; + +struct trace_event_data_offsets_ipi_raise { + u32 target_cpus; +}; + +struct trace_event_data_offsets_ipi_handler {}; + +typedef void (*btf_trace_ipi_raise)(void *, const struct cpumask *, const char *); + +typedef void (*btf_trace_ipi_entry)(void *, const char *); + +typedef void (*btf_trace_ipi_exit)(void *, const char *); + +enum ipi_msg_type { + IPI_WAKEUP = 0, + IPI_TIMER = 1, + IPI_RESCHEDULE = 2, + IPI_CALL_FUNC = 3, + IPI_CPU_STOP = 4, + IPI_IRQ_WORK = 5, + IPI_COMPLETION = 6, + NR_IPI = 7, + IPI_CPU_BACKTRACE = 7, + MAX_IPI = 8, +}; + +struct tlb_args { + struct vm_area_struct *ta_vma; + long unsigned int ta_start; + long unsigned int ta_end; +}; + +struct clk_notifier_data { + struct clk *clk; + long unsigned int old_rate; + long unsigned int new_rate; +}; + +typedef int (*of_init_fn_1_ret)(struct device_node *); + +enum clock_event_state { + CLOCK_EVT_STATE_DETACHED = 0, + CLOCK_EVT_STATE_SHUTDOWN = 1, + CLOCK_EVT_STATE_PERIODIC = 2, + CLOCK_EVT_STATE_ONESHOT = 3, + CLOCK_EVT_STATE_ONESHOT_STOPPED = 4, +}; + +struct clock_event_device { + void (*event_handler)(struct clock_event_device *); + int (*set_next_event)(long unsigned int, struct clock_event_device *); + int (*set_next_ktime)(ktime_t, struct clock_event_device *); + long: 32; + ktime_t next_event; + u64 max_delta_ns; + u64 min_delta_ns; + u32 mult; + u32 shift; + enum clock_event_state state_use_accessors; + unsigned int features; + long unsigned int retries; + int (*set_state_periodic)(struct clock_event_device *); + int (*set_state_oneshot)(struct clock_event_device *); + int (*set_state_oneshot_stopped)(struct clock_event_device *); + int (*set_state_shutdown)(struct clock_event_device *); + int (*tick_resume)(struct clock_event_device *); + void (*broadcast)(const struct cpumask *); + void (*suspend)(struct clock_event_device *); + void (*resume)(struct clock_event_device *); + long unsigned int min_delta_ticks; + long unsigned int max_delta_ticks; + const char *name; + int rating; + int irq; + int bound_on; + const struct cpumask *cpumask; + struct list_head list; + struct module *owner; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct delay_timer { + long unsigned int (*read_current_timer)(); + long unsigned int freq; +}; + +struct dyn_arch_ftrace { + struct module *mod; +}; + +struct dyn_ftrace { + long unsigned int ip; + long unsigned int flags; + struct dyn_arch_ftrace arch; +}; + +typedef int (*cpu_stop_fn_t)(void *); + +struct patch { + void *addr; + unsigned int insn; +}; + +enum jump_label_type { + JUMP_LABEL_NOP = 0, + JUMP_LABEL_JMP = 1, +}; + +struct kimage_arch { + u32 kernel_r2; +}; + +typedef long unsigned int kimage_entry_t; + +struct kexec_segment { + union { + void *buf; + void *kbuf; + }; + size_t bufsz; + long unsigned int mem; + size_t memsz; +}; + +struct kimage { + kimage_entry_t head; + kimage_entry_t *entry; + kimage_entry_t *last_entry; + long unsigned int start; + struct page *control_code_page; + struct page *swap_page; + void *vmcoreinfo_data_copy; + long unsigned int nr_segments; + struct kexec_segment segment[16]; + struct list_head control_pages; + struct list_head dest_pages; + struct list_head unusable_pages; + long unsigned int control_page; + unsigned int type: 1; + unsigned int preserve_context: 1; + unsigned int file_mode: 1; + struct kimage_arch arch; + void *elf_headers; + long unsigned int elf_headers_sz; + long unsigned int elf_load_addr; +}; + +enum { + IRQD_TRIGGER_MASK = 15, + IRQD_SETAFFINITY_PENDING = 256, + IRQD_ACTIVATED = 512, + IRQD_NO_BALANCING = 1024, + IRQD_PER_CPU = 2048, + IRQD_AFFINITY_SET = 4096, + IRQD_LEVEL = 8192, + IRQD_WAKEUP_STATE = 16384, + IRQD_MOVE_PCNTXT = 32768, + IRQD_IRQ_DISABLED = 65536, + IRQD_IRQ_MASKED = 131072, + IRQD_IRQ_INPROGRESS = 262144, + IRQD_WAKEUP_ARMED = 524288, + IRQD_FORWARDED_TO_VCPU = 1048576, + IRQD_AFFINITY_MANAGED = 2097152, + IRQD_IRQ_STARTED = 4194304, + IRQD_MANAGED_SHUTDOWN = 8388608, + IRQD_SINGLE_TARGET = 16777216, + IRQD_DEFAULT_TRIGGER_SET = 33554432, + IRQD_CAN_RESERVE = 67108864, + IRQD_MSI_NOMASK_QUIRK = 134217728, + IRQD_HANDLE_ENFORCE_IRQCTX = 268435456, + IRQD_AFFINITY_ON_ACTIVATE = 536870912, + IRQD_IRQ_ENABLED_ON_SUSPEND = 1073741824, +}; + +struct kexec_relocate_data { + long unsigned int kexec_start_address; + long unsigned int kexec_indirection_page; + long unsigned int kexec_mach_type; + long unsigned int kexec_r2; +}; + +struct of_cpu_method { + const char *method; + const struct smp_operations *ops; +}; + +enum perf_sample_regs_abi { + PERF_SAMPLE_REGS_ABI_NONE = 0, + PERF_SAMPLE_REGS_ABI_32 = 1, + PERF_SAMPLE_REGS_ABI_64 = 2, +}; + +enum perf_event_arm_regs { + PERF_REG_ARM_R0 = 0, + PERF_REG_ARM_R1 = 1, + PERF_REG_ARM_R2 = 2, + PERF_REG_ARM_R3 = 3, + PERF_REG_ARM_R4 = 4, + PERF_REG_ARM_R5 = 5, + PERF_REG_ARM_R6 = 6, + PERF_REG_ARM_R7 = 7, + PERF_REG_ARM_R8 = 8, + PERF_REG_ARM_R9 = 9, + PERF_REG_ARM_R10 = 10, + PERF_REG_ARM_FP = 11, + PERF_REG_ARM_IP = 12, + PERF_REG_ARM_SP = 13, + PERF_REG_ARM_LR = 14, + PERF_REG_ARM_PC = 15, + PERF_REG_ARM_MAX = 16, +}; + +struct perf_callchain_entry_ctx { + struct perf_callchain_entry *entry; + u32 max_stack; + u32 nr; + short int contexts; + bool contexts_maxed; +}; + +struct frame_tail { + struct frame_tail *fp; + long unsigned int sp; + long unsigned int lr; +}; + +struct platform_device_id { + char name[20]; + kernel_ulong_t driver_data; +}; + +enum perf_hw_id { + PERF_COUNT_HW_CPU_CYCLES = 0, + PERF_COUNT_HW_INSTRUCTIONS = 1, + PERF_COUNT_HW_CACHE_REFERENCES = 2, + PERF_COUNT_HW_CACHE_MISSES = 3, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, + PERF_COUNT_HW_BRANCH_MISSES = 5, + PERF_COUNT_HW_BUS_CYCLES = 6, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, + PERF_COUNT_HW_REF_CPU_CYCLES = 9, + PERF_COUNT_HW_MAX = 10, +}; + +enum perf_hw_cache_id { + PERF_COUNT_HW_CACHE_L1D = 0, + PERF_COUNT_HW_CACHE_L1I = 1, + PERF_COUNT_HW_CACHE_LL = 2, + PERF_COUNT_HW_CACHE_DTLB = 3, + PERF_COUNT_HW_CACHE_ITLB = 4, + PERF_COUNT_HW_CACHE_BPU = 5, + PERF_COUNT_HW_CACHE_NODE = 6, + PERF_COUNT_HW_CACHE_MAX = 7, +}; + +enum perf_hw_cache_op_id { + PERF_COUNT_HW_CACHE_OP_READ = 0, + PERF_COUNT_HW_CACHE_OP_WRITE = 1, + PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, + PERF_COUNT_HW_CACHE_OP_MAX = 3, +}; + +enum perf_hw_cache_op_result_id { + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, + PERF_COUNT_HW_CACHE_RESULT_MISS = 1, + PERF_COUNT_HW_CACHE_RESULT_MAX = 2, +}; + +enum perf_event_sample_format { + PERF_SAMPLE_IP = 1, + PERF_SAMPLE_TID = 2, + PERF_SAMPLE_TIME = 4, + PERF_SAMPLE_ADDR = 8, + PERF_SAMPLE_READ = 16, + PERF_SAMPLE_CALLCHAIN = 32, + PERF_SAMPLE_ID = 64, + PERF_SAMPLE_CPU = 128, + PERF_SAMPLE_PERIOD = 256, + PERF_SAMPLE_STREAM_ID = 512, + PERF_SAMPLE_RAW = 1024, + PERF_SAMPLE_BRANCH_STACK = 2048, + PERF_SAMPLE_REGS_USER = 4096, + PERF_SAMPLE_STACK_USER = 8192, + PERF_SAMPLE_WEIGHT = 16384, + PERF_SAMPLE_DATA_SRC = 32768, + PERF_SAMPLE_IDENTIFIER = 65536, + PERF_SAMPLE_TRANSACTION = 131072, + PERF_SAMPLE_REGS_INTR = 262144, + PERF_SAMPLE_PHYS_ADDR = 524288, + PERF_SAMPLE_AUX = 1048576, + PERF_SAMPLE_CGROUP = 2097152, + PERF_SAMPLE_DATA_PAGE_SIZE = 4194304, + PERF_SAMPLE_CODE_PAGE_SIZE = 8388608, + PERF_SAMPLE_WEIGHT_STRUCT = 16777216, + PERF_SAMPLE_MAX = 33554432, +}; + +struct omap_device; + +struct pdev_archdata { + struct omap_device *od; +}; + +struct perf_pmu_events_attr { + struct device_attribute attr; + u64 id; + const char *event_str; + long: 32; +}; + +struct mfd_cell; + +struct platform_device { + const char *name; + int id; + bool id_auto; + long: 32; + struct device dev; + u64 platform_dma_mask; + struct device_dma_parameters dma_parms; + u32 num_resources; + struct resource *resource; + const struct platform_device_id *id_entry; + const char *driver_override; + struct mfd_cell *mfd_cell; + struct pdev_archdata archdata; + long: 32; +}; + +struct platform_driver { + int (*probe)(struct platform_device *); + int (*remove)(struct platform_device *); + void (*shutdown)(struct platform_device *); + int (*suspend)(struct platform_device *, pm_message_t); + int (*resume)(struct platform_device *); + struct device_driver driver; + const struct platform_device_id *id_table; + bool prevent_deferred_probe; + bool driver_managed_dma; +}; + +struct arm_pmu; + +struct pmu_hw_events { + struct perf_event *events[32]; + long unsigned int used_mask[1]; + raw_spinlock_t pmu_lock; + struct arm_pmu *percpu_pmu; + int irq; +}; + +struct arm_pmu { + struct pmu pmu; + cpumask_t supported_cpus; + char *name; + int pmuver; + irqreturn_t (*handle_irq)(struct arm_pmu *); + void (*enable)(struct perf_event *); + void (*disable)(struct perf_event *); + int (*get_event_idx)(struct pmu_hw_events *, struct perf_event *); + void (*clear_event_idx)(struct pmu_hw_events *, struct perf_event *); + int (*set_event_filter)(struct hw_perf_event *, struct perf_event_attr *); + u64 (*read_counter)(struct perf_event *); + void (*write_counter)(struct perf_event *, u64); + void (*start)(struct arm_pmu *); + void (*stop)(struct arm_pmu *); + void (*reset)(void *); + int (*map_event)(struct perf_event *); + bool (*filter)(struct pmu *, int); + int num_events; + bool secure_access; + long unsigned int pmceid_bitmap[2]; + long unsigned int pmceid_ext_bitmap[2]; + struct platform_device *plat_device; + struct pmu_hw_events *hw_events; + struct hlist_node node; + struct notifier_block cpu_pm_nb; + const struct attribute_group *attr_groups[5]; + u64 reg_pmmir; + long unsigned int acpi_cpuid; + long: 32; +}; + +enum armpmu_attr_groups { + ARMPMU_ATTR_GROUP_COMMON = 0, + ARMPMU_ATTR_GROUP_EVENTS = 1, + ARMPMU_ATTR_GROUP_FORMATS = 2, + ARMPMU_ATTR_GROUP_CAPS = 3, + ARMPMU_NR_ATTR_GROUPS = 4, +}; + +typedef int (*armpmu_init_fn)(struct arm_pmu *); + +struct pmu_probe_info { + unsigned int cpuid; + unsigned int mask; + armpmu_init_fn init; +}; + +struct cpu_topology { + int thread_id; + int core_id; + int cluster_id; + int package_id; + cpumask_t thread_sibling; + cpumask_t core_sibling; + cpumask_t cluster_sibling; + cpumask_t llc_sibling; +}; + +struct cpu_efficiency { + const char *compatible; + long unsigned int efficiency; +}; + +struct timens_offset { + s64 sec; + u64 nsec; +}; + +struct arch_vdso_data {}; + +struct vdso_timestamp { + u64 sec; + u64 nsec; +}; + +struct vdso_data { + u32 seq; + s32 clock_mode; + u64 cycle_last; + u64 mask; + u32 mult; + u32 shift; + union { + struct vdso_timestamp basetime[12]; + struct timens_offset offset[12]; + }; + s32 tz_minuteswest; + s32 tz_dsttime; + u32 hrtimer_res; + u32 __unused; + struct arch_vdso_data arch_data; +}; + +union vdso_data_store { + struct vdso_data data[2]; + u8 page[4096]; +}; + +struct elfinfo { + Elf32_Ehdr *hdr; + Elf32_Sym *dynsym; + long unsigned int dynsymsize; + char *dynstr; +}; + +typedef struct { + efi_guid_t guid; + long unsigned int *ptr; + const char name[16]; +} efi_config_table_type_t; + +typedef int (*pte_fn_t)(pte_t *, long unsigned int, void *); + +enum { + MT_UNCACHED = 4, + MT_CACHECLEAN = 5, + MT_MINICLEAN = 6, + MT_LOW_VECTORS = 7, + MT_HIGH_VECTORS = 8, + MT_MEMORY_RWX = 9, + MT_MEMORY_RW = 10, + MT_MEMORY_RO = 11, + MT_ROM = 12, + MT_MEMORY_RWX_NONCACHED = 13, + MT_MEMORY_RW_DTCM = 14, + MT_MEMORY_RWX_ITCM = 15, + MT_MEMORY_RW_SO = 16, + MT_MEMORY_DMA_READY = 17, +}; + +struct efi_arm_entry_state { + u32 cpsr_before_ebs; + u32 sctlr_before_ebs; + u32 cpsr_after_ebs; + u32 sctlr_after_ebs; +}; + +struct psci_operations { + u32 (*get_version)(); + int (*cpu_suspend)(u32, long unsigned int); + int (*cpu_off)(u32); + int (*cpu_on)(long unsigned int, long unsigned int); + int (*migrate)(long unsigned int); + int (*affinity_info)(long unsigned int, long unsigned int); + int (*migrate_info_type)(); +}; + +struct bpf_insn { + __u8 code; + __u8 dst_reg: 4; + __u8 src_reg: 4; + __s16 off; + __s32 imm; +}; + +enum bpf_cgroup_iter_order { + BPF_CGROUP_ITER_ORDER_UNSPEC = 0, + BPF_CGROUP_ITER_SELF_ONLY = 1, + BPF_CGROUP_ITER_DESCENDANTS_PRE = 2, + BPF_CGROUP_ITER_DESCENDANTS_POST = 3, + BPF_CGROUP_ITER_ANCESTORS_UP = 4, +}; + +enum bpf_map_type { + BPF_MAP_TYPE_UNSPEC = 0, + BPF_MAP_TYPE_HASH = 1, + BPF_MAP_TYPE_ARRAY = 2, + BPF_MAP_TYPE_PROG_ARRAY = 3, + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 4, + BPF_MAP_TYPE_PERCPU_HASH = 5, + BPF_MAP_TYPE_PERCPU_ARRAY = 6, + BPF_MAP_TYPE_STACK_TRACE = 7, + BPF_MAP_TYPE_CGROUP_ARRAY = 8, + BPF_MAP_TYPE_LRU_HASH = 9, + BPF_MAP_TYPE_LRU_PERCPU_HASH = 10, + BPF_MAP_TYPE_LPM_TRIE = 11, + BPF_MAP_TYPE_ARRAY_OF_MAPS = 12, + BPF_MAP_TYPE_HASH_OF_MAPS = 13, + BPF_MAP_TYPE_DEVMAP = 14, + BPF_MAP_TYPE_SOCKMAP = 15, + BPF_MAP_TYPE_CPUMAP = 16, + BPF_MAP_TYPE_XSKMAP = 17, + BPF_MAP_TYPE_SOCKHASH = 18, + BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED = 19, + BPF_MAP_TYPE_CGROUP_STORAGE = 19, + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 20, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 21, + BPF_MAP_TYPE_QUEUE = 22, + BPF_MAP_TYPE_STACK = 23, + BPF_MAP_TYPE_SK_STORAGE = 24, + BPF_MAP_TYPE_DEVMAP_HASH = 25, + BPF_MAP_TYPE_STRUCT_OPS = 26, + BPF_MAP_TYPE_RINGBUF = 27, + BPF_MAP_TYPE_INODE_STORAGE = 28, + BPF_MAP_TYPE_TASK_STORAGE = 29, + BPF_MAP_TYPE_BLOOM_FILTER = 30, + BPF_MAP_TYPE_USER_RINGBUF = 31, + BPF_MAP_TYPE_CGRP_STORAGE = 32, +}; + +enum bpf_prog_type { + BPF_PROG_TYPE_UNSPEC = 0, + BPF_PROG_TYPE_SOCKET_FILTER = 1, + BPF_PROG_TYPE_KPROBE = 2, + BPF_PROG_TYPE_SCHED_CLS = 3, + BPF_PROG_TYPE_SCHED_ACT = 4, + BPF_PROG_TYPE_TRACEPOINT = 5, + BPF_PROG_TYPE_XDP = 6, + BPF_PROG_TYPE_PERF_EVENT = 7, + BPF_PROG_TYPE_CGROUP_SKB = 8, + BPF_PROG_TYPE_CGROUP_SOCK = 9, + BPF_PROG_TYPE_LWT_IN = 10, + BPF_PROG_TYPE_LWT_OUT = 11, + BPF_PROG_TYPE_LWT_XMIT = 12, + BPF_PROG_TYPE_SOCK_OPS = 13, + BPF_PROG_TYPE_SK_SKB = 14, + BPF_PROG_TYPE_CGROUP_DEVICE = 15, + BPF_PROG_TYPE_SK_MSG = 16, + BPF_PROG_TYPE_RAW_TRACEPOINT = 17, + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 18, + BPF_PROG_TYPE_LWT_SEG6LOCAL = 19, + BPF_PROG_TYPE_LIRC_MODE2 = 20, + BPF_PROG_TYPE_SK_REUSEPORT = 21, + BPF_PROG_TYPE_FLOW_DISSECTOR = 22, + BPF_PROG_TYPE_CGROUP_SYSCTL = 23, + BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 24, + BPF_PROG_TYPE_CGROUP_SOCKOPT = 25, + BPF_PROG_TYPE_TRACING = 26, + BPF_PROG_TYPE_STRUCT_OPS = 27, + BPF_PROG_TYPE_EXT = 28, + BPF_PROG_TYPE_LSM = 29, + BPF_PROG_TYPE_SK_LOOKUP = 30, + BPF_PROG_TYPE_SYSCALL = 31, +}; + +enum bpf_attach_type { + BPF_CGROUP_INET_INGRESS = 0, + BPF_CGROUP_INET_EGRESS = 1, + BPF_CGROUP_INET_SOCK_CREATE = 2, + BPF_CGROUP_SOCK_OPS = 3, + BPF_SK_SKB_STREAM_PARSER = 4, + BPF_SK_SKB_STREAM_VERDICT = 5, + BPF_CGROUP_DEVICE = 6, + BPF_SK_MSG_VERDICT = 7, + BPF_CGROUP_INET4_BIND = 8, + BPF_CGROUP_INET6_BIND = 9, + BPF_CGROUP_INET4_CONNECT = 10, + BPF_CGROUP_INET6_CONNECT = 11, + BPF_CGROUP_INET4_POST_BIND = 12, + BPF_CGROUP_INET6_POST_BIND = 13, + BPF_CGROUP_UDP4_SENDMSG = 14, + BPF_CGROUP_UDP6_SENDMSG = 15, + BPF_LIRC_MODE2 = 16, + BPF_FLOW_DISSECTOR = 17, + BPF_CGROUP_SYSCTL = 18, + BPF_CGROUP_UDP4_RECVMSG = 19, + BPF_CGROUP_UDP6_RECVMSG = 20, + BPF_CGROUP_GETSOCKOPT = 21, + BPF_CGROUP_SETSOCKOPT = 22, + BPF_TRACE_RAW_TP = 23, + BPF_TRACE_FENTRY = 24, + BPF_TRACE_FEXIT = 25, + BPF_MODIFY_RETURN = 26, + BPF_LSM_MAC = 27, + BPF_TRACE_ITER = 28, + BPF_CGROUP_INET4_GETPEERNAME = 29, + BPF_CGROUP_INET6_GETPEERNAME = 30, + BPF_CGROUP_INET4_GETSOCKNAME = 31, + BPF_CGROUP_INET6_GETSOCKNAME = 32, + BPF_XDP_DEVMAP = 33, + BPF_CGROUP_INET_SOCK_RELEASE = 34, + BPF_XDP_CPUMAP = 35, + BPF_SK_LOOKUP = 36, + BPF_XDP = 37, + BPF_SK_SKB_VERDICT = 38, + BPF_SK_REUSEPORT_SELECT = 39, + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE = 40, + BPF_PERF_EVENT = 41, + BPF_TRACE_KPROBE_MULTI = 42, + BPF_LSM_CGROUP = 43, + __MAX_BPF_ATTACH_TYPE = 44, +}; + +union bpf_attr { + struct { + __u32 map_type; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + __u32 inner_map_fd; + __u32 numa_node; + char map_name[16]; + __u32 map_ifindex; + __u32 btf_fd; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + __u64 map_extra; + }; + struct { + __u32 map_fd; + long: 32; + __u64 key; + union { + __u64 value; + __u64 next_key; + }; + __u64 flags; + }; + struct { + __u64 in_batch; + __u64 out_batch; + __u64 keys; + __u64 values; + __u32 count; + __u32 map_fd; + __u64 elem_flags; + __u64 flags; + } batch; + struct { + __u32 prog_type; + __u32 insn_cnt; + __u64 insns; + __u64 license; + __u32 log_level; + __u32 log_size; + __u64 log_buf; + __u32 kern_version; + __u32 prog_flags; + char prog_name[16]; + __u32 prog_ifindex; + __u32 expected_attach_type; + __u32 prog_btf_fd; + __u32 func_info_rec_size; + __u64 func_info; + __u32 func_info_cnt; + __u32 line_info_rec_size; + __u64 line_info; + __u32 line_info_cnt; + __u32 attach_btf_id; + union { + __u32 attach_prog_fd; + __u32 attach_btf_obj_fd; + }; + __u32 core_relo_cnt; + __u64 fd_array; + __u64 core_relos; + __u32 core_relo_rec_size; + long: 32; + }; + struct { + __u64 pathname; + __u32 bpf_fd; + __u32 file_flags; + }; + struct { + __u32 target_fd; + __u32 attach_bpf_fd; + __u32 attach_type; + __u32 attach_flags; + __u32 replace_bpf_fd; + }; + struct { + __u32 prog_fd; + __u32 retval; + __u32 data_size_in; + __u32 data_size_out; + __u64 data_in; + __u64 data_out; + __u32 repeat; + __u32 duration; + __u32 ctx_size_in; + __u32 ctx_size_out; + __u64 ctx_in; + __u64 ctx_out; + __u32 flags; + __u32 cpu; + __u32 batch_size; + long: 32; + } test; + struct { + union { + __u32 start_id; + __u32 prog_id; + __u32 map_id; + __u32 btf_id; + __u32 link_id; + }; + __u32 next_id; + __u32 open_flags; + }; + struct { + __u32 bpf_fd; + __u32 info_len; + __u64 info; + } info; + struct { + __u32 target_fd; + __u32 attach_type; + __u32 query_flags; + __u32 attach_flags; + __u64 prog_ids; + __u32 prog_cnt; + long: 32; + __u64 prog_attach_flags; + } query; + struct { + __u64 name; + __u32 prog_fd; + long: 32; + } raw_tracepoint; + struct { + __u64 btf; + __u64 btf_log_buf; + __u32 btf_size; + __u32 btf_log_size; + __u32 btf_log_level; + long: 32; + }; + struct { + __u32 pid; + __u32 fd; + __u32 flags; + __u32 buf_len; + __u64 buf; + __u32 prog_id; + __u32 fd_type; + __u64 probe_offset; + __u64 probe_addr; + } task_fd_query; + struct { + __u32 prog_fd; + union { + __u32 target_fd; + __u32 target_ifindex; + }; + __u32 attach_type; + __u32 flags; + union { + __u32 target_btf_id; + struct { + __u64 iter_info; + __u32 iter_info_len; + long: 32; + }; + struct { + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + __u64 syms; + __u64 addrs; + __u64 cookies; + } kprobe_multi; + struct { + __u32 target_btf_id; + long: 32; + __u64 cookie; + } tracing; + }; + } link_create; + struct { + __u32 link_fd; + __u32 new_prog_fd; + __u32 flags; + __u32 old_prog_fd; + } link_update; + struct { + __u32 link_fd; + } link_detach; + struct { + __u32 type; + } enable_stats; + struct { + __u32 link_fd; + __u32 flags; + } iter_create; + struct { + __u32 prog_fd; + __u32 map_fd; + __u32 flags; + } prog_bind_map; +}; + +struct bpf_func_info { + __u32 insn_off; + __u32 type_id; +}; + +struct bpf_line_info { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + +struct sock_filter { + __u16 code; + __u8 jt; + __u8 jf; + __u32 k; +}; + +struct bpf_run_ctx {}; + +struct btf_type { + __u32 name_off; + __u32 info; + union { + __u32 size; + __u32 type; + }; +}; + +enum btf_field_type { + BPF_SPIN_LOCK = 1, + BPF_TIMER = 2, + BPF_KPTR_UNREF = 4, + BPF_KPTR_REF = 8, + BPF_KPTR = 12, + BPF_LIST_HEAD = 16, + BPF_LIST_NODE = 32, + BPF_RB_ROOT = 64, + BPF_RB_NODE = 128, + BPF_GRAPH_NODE_OR_ROOT = 240, +}; + +typedef void (*btf_dtor_kfunc_t)(void *); + +struct btf; + +struct btf_field_kptr { + struct btf *btf; + struct module *module; + btf_dtor_kfunc_t dtor; + u32 btf_id; +}; + +struct btf_record; + +struct btf_field_graph_root { + struct btf *btf; + u32 value_btf_id; + u32 node_offset; + struct btf_record *value_rec; +}; + +struct btf_field { + u32 offset; + enum btf_field_type type; + union { + struct btf_field_kptr kptr; + struct btf_field_graph_root graph_root; + }; +}; + +struct btf_record { + u32 cnt; + u32 field_mask; + int spin_lock_off; + int timer_off; + struct btf_field fields[0]; +}; + +struct btf_field_offs { + u32 cnt; + u32 field_off[10]; + u8 field_sz[10]; +}; + +struct bpf_cgroup_storage; + +struct bpf_prog_array_item { + struct bpf_prog *prog; + long: 32; + union { + struct bpf_cgroup_storage *cgroup_storage[2]; + u64 bpf_cookie; + }; +}; + +struct bpf_prog_array { + struct callback_head rcu; + struct bpf_prog_array_item items[0]; +}; + +typedef u64 (*bpf_callback_t)(u64, u64, u64, u64, u64); + +struct bpf_iter_aux_info; + +typedef int (*bpf_iter_init_seq_priv_t)(void *, struct bpf_iter_aux_info *); + +enum bpf_iter_task_type { + BPF_TASK_ITER_ALL = 0, + BPF_TASK_ITER_TID = 1, + BPF_TASK_ITER_TGID = 2, +}; + +struct bpf_map; + +struct bpf_iter_aux_info { + struct bpf_map *map; + struct { + struct cgroup *start; + enum bpf_cgroup_iter_order order; + } cgroup; + struct { + enum bpf_iter_task_type type; + u32 pid; + } task; +}; + +typedef void (*bpf_iter_fini_seq_priv_t)(void *); + +struct bpf_iter_seq_info { + const struct seq_operations *seq_ops; + bpf_iter_init_seq_priv_t init_seq_private; + bpf_iter_fini_seq_priv_t fini_seq_private; + u32 seq_priv_size; +}; + +struct bpf_prog_aux; + +struct bpf_local_storage_map; + +struct bpf_verifier_env; + +struct bpf_func_state; + +struct bpf_map_ops { + int (*map_alloc_check)(union bpf_attr *); + struct bpf_map * (*map_alloc)(union bpf_attr *); + void (*map_release)(struct bpf_map *, struct file *); + void (*map_free)(struct bpf_map *); + int (*map_get_next_key)(struct bpf_map *, void *, void *); + void (*map_release_uref)(struct bpf_map *); + void * (*map_lookup_elem_sys_only)(struct bpf_map *, void *); + int (*map_lookup_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + int (*map_lookup_and_delete_elem)(struct bpf_map *, void *, void *, u64); + int (*map_lookup_and_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + int (*map_update_batch)(struct bpf_map *, struct file *, const union bpf_attr *, union bpf_attr *); + int (*map_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + void * (*map_lookup_elem)(struct bpf_map *, void *); + int (*map_update_elem)(struct bpf_map *, void *, void *, u64); + int (*map_delete_elem)(struct bpf_map *, void *); + int (*map_push_elem)(struct bpf_map *, void *, u64); + int (*map_pop_elem)(struct bpf_map *, void *); + int (*map_peek_elem)(struct bpf_map *, void *); + void * (*map_lookup_percpu_elem)(struct bpf_map *, void *, u32); + void * (*map_fd_get_ptr)(struct bpf_map *, struct file *, int); + void (*map_fd_put_ptr)(void *); + int (*map_gen_lookup)(struct bpf_map *, struct bpf_insn *); + u32 (*map_fd_sys_lookup_elem)(void *); + void (*map_seq_show_elem)(struct bpf_map *, void *, struct seq_file *); + int (*map_check_btf)(const struct bpf_map *, const struct btf *, const struct btf_type *, const struct btf_type *); + int (*map_poke_track)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_untrack)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_run)(struct bpf_map *, u32, struct bpf_prog *, struct bpf_prog *); + int (*map_direct_value_addr)(const struct bpf_map *, u64 *, u32); + int (*map_direct_value_meta)(const struct bpf_map *, u64, u32 *); + int (*map_mmap)(struct bpf_map *, struct vm_area_struct *); + __poll_t (*map_poll)(struct bpf_map *, struct file *, struct poll_table_struct *); + int (*map_local_storage_charge)(struct bpf_local_storage_map *, void *, u32); + void (*map_local_storage_uncharge)(struct bpf_local_storage_map *, void *, u32); + struct bpf_local_storage ** (*map_owner_storage_ptr)(void *); + int (*map_redirect)(struct bpf_map *, u64, u64); + bool (*map_meta_equal)(const struct bpf_map *, const struct bpf_map *); + int (*map_set_for_each_callback_args)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *); + int (*map_for_each_callback)(struct bpf_map *, bpf_callback_t, void *, u64); + int *map_btf_id; + const struct bpf_iter_seq_info *iter_seq_info; +}; + +struct bpf_map { + const struct bpf_map_ops *ops; + struct bpf_map *inner_map_meta; + void *security; + enum bpf_map_type map_type; + u32 key_size; + u32 value_size; + u32 max_entries; + long: 32; + u64 map_extra; + u32 map_flags; + u32 id; + struct btf_record *record; + int numa_node; + u32 btf_key_type_id; + u32 btf_value_type_id; + u32 btf_vmlinux_value_type_id; + struct btf *btf; + struct obj_cgroup *objcg; + char name[16]; + struct btf_field_offs *field_offs; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + atomic64_t refcnt; + atomic64_t usercnt; + struct work_struct work; + struct mutex freeze_mutex; + long: 32; + atomic64_t writecnt; + struct { + spinlock_t lock; + enum bpf_prog_type type; + bool jited; + bool xdp_has_frags; + } owner; + bool bypass_spec_v1; + bool frozen; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct btf_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + __u32 type_off; + __u32 type_len; + __u32 str_off; + __u32 str_len; +}; + +struct btf_kfunc_set_tab; + +struct btf_id_dtor_kfunc_tab; + +struct btf_struct_metas; + +struct btf { + void *data; + struct btf_type **types; + u32 *resolved_ids; + u32 *resolved_sizes; + const char *strings; + void *nohdr_data; + struct btf_header hdr; + u32 nr_types; + u32 types_size; + u32 data_size; + refcount_t refcnt; + u32 id; + struct callback_head rcu; + struct btf_kfunc_set_tab *kfunc_set_tab; + struct btf_id_dtor_kfunc_tab *dtor_kfunc_tab; + struct btf_struct_metas *struct_meta_tab; + struct btf *base_btf; + u32 start_id; + u32 start_str_off; + char name[60]; + bool kernel_btf; +}; + +struct bpf_ksym { + long unsigned int start; + long unsigned int end; + char name[512]; + struct list_head lnode; + struct latch_tree_node tnode; + bool prog; +}; + +struct bpf_ctx_arg_aux; + +struct bpf_trampoline; + +struct bpf_jit_poke_descriptor; + +struct bpf_kfunc_desc_tab; + +struct bpf_kfunc_btf_tab; + +struct bpf_prog_ops; + +struct btf_mod_pair; + +struct bpf_prog_offload; + +struct bpf_func_info_aux; + +struct bpf_prog_aux { + atomic64_t refcnt; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 max_ctx_offset; + u32 max_pkt_offset; + u32 max_tp_access; + u32 stack_depth; + u32 id; + u32 func_cnt; + u32 func_idx; + u32 attach_btf_id; + u32 ctx_arg_info_size; + u32 max_rdonly_access; + u32 max_rdwr_access; + struct btf *attach_btf; + const struct bpf_ctx_arg_aux *ctx_arg_info; + struct mutex dst_mutex; + struct bpf_prog *dst_prog; + struct bpf_trampoline *dst_trampoline; + enum bpf_prog_type saved_dst_prog_type; + enum bpf_attach_type saved_dst_attach_type; + bool verifier_zext; + bool dev_bound; + bool offload_requested; + bool attach_btf_trace; + bool func_proto_unreliable; + bool sleepable; + bool tail_call_reachable; + bool xdp_has_frags; + const struct btf_type *attach_func_proto; + const char *attach_func_name; + struct bpf_prog **func; + void *jit_data; + struct bpf_jit_poke_descriptor *poke_tab; + struct bpf_kfunc_desc_tab *kfunc_tab; + struct bpf_kfunc_btf_tab *kfunc_btf_tab; + u32 size_poke_tab; + struct bpf_ksym ksym; + const struct bpf_prog_ops *ops; + struct bpf_map **used_maps; + struct mutex used_maps_mutex; + struct btf_mod_pair *used_btfs; + struct bpf_prog *prog; + struct user_struct *user; + long: 32; + u64 load_time; + u32 verified_insns; + int cgroup_atype; + struct bpf_map *cgroup_storage[2]; + char name[16]; + void *security; + struct bpf_prog_offload *offload; + struct btf *btf; + struct bpf_func_info *func_info; + struct bpf_func_info_aux *func_info_aux; + struct bpf_line_info *linfo; + void **jited_linfo; + u32 func_info_cnt; + u32 nr_linfo; + u32 linfo_idx; + u32 num_exentries; + struct exception_table_entry *extable; + union { + struct work_struct work; + struct callback_head rcu; + }; +}; + +struct bpf_prog_stats; + +struct sock_fprog_kern; + +struct bpf_prog { + u16 pages; + u16 jited: 1; + u16 jit_requested: 1; + u16 gpl_compatible: 1; + u16 cb_access: 1; + u16 dst_needed: 1; + u16 blinding_requested: 1; + u16 blinded: 1; + u16 is_func: 1; + u16 kprobe_override: 1; + u16 has_callchain_buf: 1; + u16 enforce_expected_attach_type: 1; + u16 call_get_stack: 1; + u16 call_get_func_ip: 1; + u16 tstamp_type_access: 1; + enum bpf_prog_type type; + enum bpf_attach_type expected_attach_type; + u32 len; + u32 jited_len; + u8 tag[8]; + struct bpf_prog_stats *stats; + int *active; + unsigned int (*bpf_func)(const void *, const struct bpf_insn *); + struct bpf_prog_aux *aux; + struct sock_fprog_kern *orig_prog; + union { + struct { + struct {} __empty_insns; + struct sock_filter insns[0]; + }; + struct { + struct {} __empty_insnsi; + struct bpf_insn insnsi[0]; + }; + }; +}; + +enum { + BTF_FIELDS_MAX = 10, +}; + +enum bpf_type_flag { + PTR_MAYBE_NULL = 256, + MEM_RDONLY = 512, + MEM_RINGBUF = 1024, + MEM_USER = 2048, + MEM_PERCPU = 4096, + OBJ_RELEASE = 8192, + PTR_UNTRUSTED = 16384, + MEM_UNINIT = 32768, + DYNPTR_TYPE_LOCAL = 65536, + DYNPTR_TYPE_RINGBUF = 131072, + MEM_FIXED_SIZE = 262144, + MEM_ALLOC = 524288, + PTR_TRUSTED = 1048576, + MEM_RCU = 2097152, + NON_OWN_REF = 4194304, + __BPF_TYPE_FLAG_MAX = 4194305, + __BPF_TYPE_LAST_FLAG = 4194304, +}; + +enum bpf_arg_type { + ARG_DONTCARE = 0, + ARG_CONST_MAP_PTR = 1, + ARG_PTR_TO_MAP_KEY = 2, + ARG_PTR_TO_MAP_VALUE = 3, + ARG_PTR_TO_MEM = 4, + ARG_CONST_SIZE = 5, + ARG_CONST_SIZE_OR_ZERO = 6, + ARG_PTR_TO_CTX = 7, + ARG_ANYTHING = 8, + ARG_PTR_TO_SPIN_LOCK = 9, + ARG_PTR_TO_SOCK_COMMON = 10, + ARG_PTR_TO_INT = 11, + ARG_PTR_TO_LONG = 12, + ARG_PTR_TO_SOCKET = 13, + ARG_PTR_TO_BTF_ID = 14, + ARG_PTR_TO_RINGBUF_MEM = 15, + ARG_CONST_ALLOC_SIZE_OR_ZERO = 16, + ARG_PTR_TO_BTF_ID_SOCK_COMMON = 17, + ARG_PTR_TO_PERCPU_BTF_ID = 18, + ARG_PTR_TO_FUNC = 19, + ARG_PTR_TO_STACK = 20, + ARG_PTR_TO_CONST_STR = 21, + ARG_PTR_TO_TIMER = 22, + ARG_PTR_TO_KPTR = 23, + ARG_PTR_TO_DYNPTR = 24, + __BPF_ARG_TYPE_MAX = 25, + ARG_PTR_TO_MAP_VALUE_OR_NULL = 259, + ARG_PTR_TO_MEM_OR_NULL = 260, + ARG_PTR_TO_CTX_OR_NULL = 263, + ARG_PTR_TO_SOCKET_OR_NULL = 269, + ARG_PTR_TO_STACK_OR_NULL = 276, + ARG_PTR_TO_BTF_ID_OR_NULL = 270, + ARG_PTR_TO_UNINIT_MEM = 32772, + ARG_PTR_TO_FIXED_SIZE_MEM = 262148, + __BPF_ARG_TYPE_LIMIT = 8388607, +}; + +enum bpf_return_type { + RET_INTEGER = 0, + RET_VOID = 1, + RET_PTR_TO_MAP_VALUE = 2, + RET_PTR_TO_SOCKET = 3, + RET_PTR_TO_TCP_SOCK = 4, + RET_PTR_TO_SOCK_COMMON = 5, + RET_PTR_TO_MEM = 6, + RET_PTR_TO_MEM_OR_BTF_ID = 7, + RET_PTR_TO_BTF_ID = 8, + __BPF_RET_TYPE_MAX = 9, + RET_PTR_TO_MAP_VALUE_OR_NULL = 258, + RET_PTR_TO_SOCKET_OR_NULL = 259, + RET_PTR_TO_TCP_SOCK_OR_NULL = 260, + RET_PTR_TO_SOCK_COMMON_OR_NULL = 261, + RET_PTR_TO_RINGBUF_MEM_OR_NULL = 1286, + RET_PTR_TO_DYNPTR_MEM_OR_NULL = 262, + RET_PTR_TO_BTF_ID_OR_NULL = 264, + RET_PTR_TO_BTF_ID_TRUSTED = 1048584, + __BPF_RET_TYPE_LIMIT = 8388607, +}; + +enum bpf_reg_type { + NOT_INIT = 0, + SCALAR_VALUE = 1, + PTR_TO_CTX = 2, + CONST_PTR_TO_MAP = 3, + PTR_TO_MAP_VALUE = 4, + PTR_TO_MAP_KEY = 5, + PTR_TO_STACK = 6, + PTR_TO_PACKET_META = 7, + PTR_TO_PACKET = 8, + PTR_TO_PACKET_END = 9, + PTR_TO_FLOW_KEYS = 10, + PTR_TO_SOCKET = 11, + PTR_TO_SOCK_COMMON = 12, + PTR_TO_TCP_SOCK = 13, + PTR_TO_TP_BUFFER = 14, + PTR_TO_XDP_SOCK = 15, + PTR_TO_BTF_ID = 16, + PTR_TO_MEM = 17, + PTR_TO_BUF = 18, + PTR_TO_FUNC = 19, + CONST_PTR_TO_DYNPTR = 20, + __BPF_REG_TYPE_MAX = 21, + PTR_TO_MAP_VALUE_OR_NULL = 260, + PTR_TO_SOCKET_OR_NULL = 267, + PTR_TO_SOCK_COMMON_OR_NULL = 268, + PTR_TO_TCP_SOCK_OR_NULL = 269, + PTR_TO_BTF_ID_OR_NULL = 272, + __BPF_REG_TYPE_LIMIT = 8388607, +}; + +struct bpf_prog_ops { + int (*test_run)(struct bpf_prog *, const union bpf_attr *, union bpf_attr *); +}; + +struct bpf_offload_dev; + +struct bpf_prog_offload { + struct bpf_prog *prog; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + void *dev_priv; + struct list_head offloads; + bool dev_state; + bool opt_failed; + void *jited_image; + u32 jited_len; +}; + +enum bpf_cgroup_storage_type { + BPF_CGROUP_STORAGE_SHARED = 0, + BPF_CGROUP_STORAGE_PERCPU = 1, + __BPF_CGROUP_STORAGE_MAX = 2, +}; + +struct btf_func_model { + u8 ret_size; + u8 ret_flags; + u8 nr_args; + u8 arg_size[12]; + u8 arg_flags[12]; +}; + +enum { + BPF_MAX_TRAMP_LINKS = 38, +}; + +enum bpf_tramp_prog_type { + BPF_TRAMP_FENTRY = 0, + BPF_TRAMP_FEXIT = 1, + BPF_TRAMP_MODIFY_RETURN = 2, + BPF_TRAMP_MAX = 3, + BPF_TRAMP_REPLACE = 4, +}; + +struct bpf_tramp_image { + void *image; + struct bpf_ksym ksym; + struct percpu_ref pcref; + void *ip_after_call; + void *ip_epilogue; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +struct bpf_trampoline { + struct hlist_node hlist; + struct ftrace_ops *fops; + struct mutex mutex; + refcount_t refcnt; + u32 flags; + u64 key; + struct { + struct btf_func_model model; + void *addr; + bool ftrace_managed; + } func; + struct bpf_prog *extension_prog; + struct hlist_head progs_hlist[3]; + int progs_cnt[3]; + struct bpf_tramp_image *cur_image; + long: 32; + u64 selector; + struct module *mod; + long: 32; +}; + +struct bpf_func_info_aux { + u16 linkage; + bool unreliable; +}; + +struct bpf_jit_poke_descriptor { + void *tailcall_target; + void *tailcall_bypass; + void *bypass_addr; + void *aux; + union { + struct { + struct bpf_map *map; + u32 key; + } tail_call; + }; + bool tailcall_target_stable; + u8 adj_off; + u16 reason; + u32 insn_idx; +}; + +struct bpf_ctx_arg_aux { + u32 offset; + enum bpf_reg_type reg_type; + u32 btf_id; +}; + +struct btf_mod_pair { + struct btf *btf; + struct module *module; +}; + +typedef u32 probes_opcode_t; + +struct arch_probes_insn; + +typedef void probes_insn_handler_t(probes_opcode_t, struct arch_probes_insn *, struct pt_regs *); + +typedef long unsigned int probes_check_cc(long unsigned int); + +typedef void probes_insn_singlestep_t(probes_opcode_t, struct arch_probes_insn *, struct pt_regs *); + +typedef void probes_insn_fn_t(); + +struct arch_probes_insn { + probes_opcode_t *insn; + probes_insn_handler_t *insn_handler; + probes_check_cc *insn_check_cc; + probes_insn_singlestep_t *insn_singlestep; + probes_insn_fn_t *insn_fn; + int stack_space; + long unsigned int register_usage_flags; + bool kprobe_direct_exec; +}; + +enum vm_fault_reason { + VM_FAULT_OOM = 1, + VM_FAULT_SIGBUS = 2, + VM_FAULT_MAJOR = 4, + VM_FAULT_HWPOISON = 16, + VM_FAULT_HWPOISON_LARGE = 32, + VM_FAULT_SIGSEGV = 64, + VM_FAULT_NOPAGE = 256, + VM_FAULT_LOCKED = 512, + VM_FAULT_RETRY = 1024, + VM_FAULT_FALLBACK = 2048, + VM_FAULT_DONE_COW = 4096, + VM_FAULT_NEEDDSYNC = 8192, + VM_FAULT_COMPLETED = 16384, + VM_FAULT_HINDEX_MASK = 983040, +}; + +typedef u32 kprobe_opcode_t; + +struct kprobe; + +typedef int (*kprobe_pre_handler_t)(struct kprobe *, struct pt_regs *); + +typedef void (*kprobe_post_handler_t)(struct kprobe *, struct pt_regs *, long unsigned int); + +struct kprobe { + struct hlist_node hlist; + struct list_head list; + long unsigned int nmissed; + kprobe_opcode_t *addr; + const char *symbol_name; + unsigned int offset; + kprobe_pre_handler_t pre_handler; + kprobe_post_handler_t post_handler; + kprobe_opcode_t opcode; + struct arch_probes_insn ainsn; + u32 flags; +}; + +typedef void (*harden_branch_predictor_fn_t)(); + +struct fsr_info { + int (*fn)(long unsigned int, unsigned int, struct pt_regs *); + int sig; + int code; + const char *name; +}; + +enum pageflags { + PG_locked = 0, + PG_referenced = 1, + PG_uptodate = 2, + PG_dirty = 3, + PG_lru = 4, + PG_active = 5, + PG_workingset = 6, + PG_waiters = 7, + PG_error = 8, + PG_slab = 9, + PG_owner_priv_1 = 10, + PG_arch_1 = 11, + PG_reserved = 12, + PG_private = 13, + PG_private_2 = 14, + PG_writeback = 15, + PG_head = 16, + PG_mappedtodisk = 17, + PG_reclaim = 18, + PG_swapbacked = 19, + PG_unevictable = 20, + PG_mlocked = 21, + __NR_PAGEFLAGS = 22, + PG_readahead = 18, + PG_anon_exclusive = 17, + PG_checked = 10, + PG_swapcache = 10, + PG_fscache = 14, + PG_pinned = 10, + PG_savepinned = 3, + PG_foreign = 10, + PG_xen_remapped = 10, + PG_slob_free = 13, + PG_isolated = 18, + PG_reported = 2, +}; + +struct section_perm { + const char *name; + long unsigned int start; + long unsigned int end; + long: 32; + pmdval_t mask; + pmdval_t prot; + pmdval_t clear; +}; + +struct gen_pool; + +typedef long unsigned int (*genpool_algo_t)(long unsigned int *, long unsigned int, long unsigned int, unsigned int, void *, struct gen_pool *, long unsigned int); + +struct gen_pool { + spinlock_t lock; + struct list_head chunks; + int min_alloc_order; + genpool_algo_t algo; + void *data; + const char *name; +}; + +struct dma_iommu_mapping { + struct iommu_domain *domain; + long unsigned int **bitmaps; + unsigned int nr_bitmaps; + unsigned int extensions; + size_t bitmap_size; + size_t bits; + dma_addr_t base; + spinlock_t lock; + struct kref kref; +}; + +struct iopf_device_param; + +struct iommu_fault_param; + +struct iommu_fwspec; + +struct dev_iommu { + struct mutex lock; + struct iommu_fault_param *fault_param; + struct iopf_device_param *iopf_param; + struct iommu_fwspec *fwspec; + struct iommu_device *iommu_dev; + void *priv; + u32 max_pasids; +}; + +struct of_phandle_args { + struct device_node *np; + int args_count; + uint32_t args[16]; +}; + +struct iommu_fault_unrecoverable { + __u32 reason; + __u32 flags; + __u32 pasid; + __u32 perm; + __u64 addr; + __u64 fetch_addr; +}; + +struct iommu_fault_page_request { + __u32 flags; + __u32 pasid; + __u32 grpid; + __u32 perm; + __u64 addr; + __u64 private_data[2]; +}; + +struct iommu_fault { + __u32 type; + __u32 padding; + union { + struct iommu_fault_unrecoverable event; + struct iommu_fault_page_request prm; + __u8 padding2[56]; + }; +}; + +enum iommu_page_response_code { + IOMMU_PAGE_RESP_SUCCESS = 0, + IOMMU_PAGE_RESP_INVALID = 1, + IOMMU_PAGE_RESP_FAILURE = 2, +}; + +struct iommu_page_response { + __u32 argsz; + __u32 version; + __u32 flags; + __u32 pasid; + __u32 grpid; + __u32 code; +}; + +typedef int (*iommu_fault_handler_t)(struct iommu_domain *, struct device *, long unsigned int, int, void *); + +struct iommu_domain_geometry { + dma_addr_t aperture_start; + dma_addr_t aperture_end; + bool force_aperture; + long: 32; +}; + +struct iommu_dma_cookie; + +struct iommu_domain { + unsigned int type; + const struct iommu_domain_ops *ops; + long unsigned int pgsize_bitmap; + long: 32; + struct iommu_domain_geometry geometry; + struct iommu_dma_cookie *iova_cookie; + enum iommu_page_response_code (*iopf_handler)(struct iommu_fault *, void *); + void *fault_data; + union { + struct { + iommu_fault_handler_t handler; + void *handler_token; + }; + struct { + struct mm_struct *mm; + int users; + }; + }; + long: 32; +}; + +typedef int (*iommu_dev_fault_handler_t)(struct iommu_fault *, void *); + +struct iommu_iotlb_gather; + +struct iommu_domain_ops { + int (*attach_dev)(struct iommu_domain *, struct device *); + void (*detach_dev)(struct iommu_domain *, struct device *); + int (*set_dev_pasid)(struct iommu_domain *, struct device *, ioasid_t); + int (*map)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, int, gfp_t); + int (*map_pages)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, size_t, int, gfp_t, size_t *); + size_t (*unmap)(struct iommu_domain *, long unsigned int, size_t, struct iommu_iotlb_gather *); + size_t (*unmap_pages)(struct iommu_domain *, long unsigned int, size_t, size_t, struct iommu_iotlb_gather *); + void (*flush_iotlb_all)(struct iommu_domain *); + void (*iotlb_sync_map)(struct iommu_domain *, long unsigned int, size_t); + void (*iotlb_sync)(struct iommu_domain *, struct iommu_iotlb_gather *); + phys_addr_t (*iova_to_phys)(struct iommu_domain *, dma_addr_t); + bool (*enforce_cache_coherency)(struct iommu_domain *); + int (*enable_nesting)(struct iommu_domain *); + int (*set_pgtable_quirks)(struct iommu_domain *, long unsigned int); + void (*free)(struct iommu_domain *); +}; + +struct iommu_iotlb_gather { + long unsigned int start; + long unsigned int end; + size_t pgsize; + struct list_head freelist; + bool queued; +}; + +struct iommu_device { + struct list_head list; + const struct iommu_ops *ops; + struct fwnode_handle *fwnode; + struct device *dev; + u32 max_pasids; +}; + +struct iommu_fault_event { + struct iommu_fault fault; + struct list_head list; +}; + +struct iommu_fault_param { + iommu_dev_fault_handler_t handler; + void *data; + struct list_head faults; + struct mutex lock; +}; + +struct iommu_fwspec { + const struct iommu_ops *ops; + struct fwnode_handle *iommu_fwnode; + u32 flags; + unsigned int num_ids; + u32 ids[0]; +}; + +struct arm_dma_alloc_args { + struct device *dev; + size_t size; + gfp_t gfp; + long: 32; + pgprot_t prot; + const void *caller; + bool want_vaddr; + int coherent_flag; + long: 32; +}; + +struct arm_dma_free_args { + struct device *dev; + size_t size; + void *cpu_addr; + struct page *page; + bool want_vaddr; +}; + +struct arm_dma_allocator { + void * (*alloc)(struct arm_dma_alloc_args *, struct page **); + void (*free)(struct arm_dma_free_args *); +}; + +struct arm_dma_buffer { + struct list_head list; + void *virt; + struct arm_dma_allocator *allocator; +}; + +struct dma_contig_early_reserve { + phys_addr_t base; + long unsigned int size; + long: 32; +}; + +enum wb_stat_item { + WB_RECLAIMABLE = 0, + WB_WRITEBACK = 1, + WB_DIRTIED = 2, + WB_WRITTEN = 3, + NR_WB_STAT_ITEMS = 4, +}; + +struct mem_type { + pteval_t prot_pte; + pteval_t prot_pte_s2; + pmdval_t prot_l1; + pmdval_t prot_sect; + unsigned int domain; + long: 32; +}; + +struct static_vm { + struct vm_struct vm; + struct list_head list; +}; + +struct vm_unmapped_area_info { + long unsigned int flags; + long unsigned int length; + long unsigned int low_limit; + long unsigned int high_limit; + long unsigned int align_mask; + long unsigned int align_offset; +}; + +struct cachepolicy { + const char policy[16]; + unsigned int cr_mask; + long: 32; + pmdval_t pmd; + pteval_t pte; +}; + +struct page_change_data { + pgprot_t set_mask; + pgprot_t clear_mask; +}; + +struct addr_marker { + long unsigned int start_address; + char *name; +}; + +struct ptdump_info { + struct mm_struct *mm; + const struct addr_marker *markers; + long unsigned int base_addr; +}; + +struct pg_state { + struct seq_file *seq; + const struct addr_marker *marker; + long unsigned int start_address; + unsigned int level; + u64 current_prot; + bool check_wx; + long unsigned int wx_pages; + const char *current_domain; + long: 32; +}; + +struct prot_bits { + u64 mask; + u64 val; + const char *set; + const char *clear; + bool ro_bit; + bool nx_bit; + long: 32; +}; + +struct pg_level { + const char *name; + const struct prot_bits *bits; + size_t num; + long: 32; + u64 mask; + const struct prot_bits *ro_bit; + const struct prot_bits *nx_bit; +}; + +union offset_union { + long unsigned int un; + long int sn; +}; + +enum arm_smccc_conduit { + SMCCC_CONDUIT_NONE = 0, + SMCCC_CONDUIT_SMC = 1, + SMCCC_CONDUIT_HVC = 2, +}; + +struct l2c_init_data { + const char *type; + unsigned int way_size_0; + unsigned int num_lock; + void (*of_parse)(const struct device_node *, u32 *, u32 *); + void (*enable)(void *, unsigned int); + void (*fixup)(void *, u32, struct outer_cache_fns *); + void (*save)(void *); + void (*configure)(void *); + void (*unlock)(void *, unsigned int); + struct outer_cache_fns outer_cache; +}; + +struct firmware_ops { + int (*prepare_idle)(long unsigned int); + int (*do_idle)(long unsigned int); + int (*set_cpu_boot_addr)(int, long unsigned int); + int (*get_cpu_boot_addr)(int, long unsigned int *); + int (*cpu_boot)(int); + int (*l2x0_init)(); + int (*suspend)(); + int (*resume)(); +}; + +struct mcpm_platform_ops { + int (*cpu_powerup)(unsigned int, unsigned int); + int (*cluster_powerup)(unsigned int); + void (*cpu_suspend_prepare)(unsigned int, unsigned int); + void (*cpu_powerdown_prepare)(unsigned int, unsigned int); + void (*cluster_powerdown_prepare)(unsigned int); + void (*cpu_cache_disable)(); + void (*cluster_cache_disable)(); + void (*cpu_is_up)(unsigned int, unsigned int); + void (*cluster_is_up)(unsigned int); + int (*wait_for_powerdown)(unsigned int, unsigned int); +}; + +struct mcpm_sync_struct { + struct { + s8 cpu; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + } cpus[4]; + s8 cluster; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + s8 inbound; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct sync_struct { + struct mcpm_sync_struct clusters[2]; +}; + +typedef void (*phys_reset_t___2)(long unsigned int, bool); + +enum decode_type { + DECODE_TYPE_END = 0, + DECODE_TYPE_TABLE = 1, + DECODE_TYPE_CUSTOM = 2, + DECODE_TYPE_SIMULATE = 3, + DECODE_TYPE_EMULATE = 4, + DECODE_TYPE_OR = 5, + DECODE_TYPE_REJECT = 6, + NUM_DECODE_TYPES = 7, +}; + +enum decode_reg_type { + REG_TYPE_NONE = 0, + REG_TYPE_ANY = 1, + REG_TYPE_SAMEAS16 = 2, + REG_TYPE_SP = 3, + REG_TYPE_PC = 4, + REG_TYPE_NOSP = 5, + REG_TYPE_NOSPPC = 6, + REG_TYPE_NOPC = 7, + REG_TYPE_NOPCWB = 8, + REG_TYPE_NOPCX = 9, + REG_TYPE_NOSPPCX = 10, + REG_TYPE_0 = 0, +}; + +union decode_item { + u32 bits; + const union decode_item *table; + int action; +}; + +enum probes_insn { + INSN_REJECTED = 0, + INSN_GOOD = 1, + INSN_GOOD_NO_SLOT = 2, +}; + +struct decode_header; + +typedef enum probes_insn probes_custom_decode_t(probes_opcode_t, struct arch_probes_insn *, const struct decode_header *); + +struct decode_header { + union decode_item type_regs; + union decode_item mask; + union decode_item value; +}; + +union decode_action { + probes_insn_handler_t *handler; + probes_custom_decode_t *decoder; +}; + +typedef enum probes_insn probes_check_t(probes_opcode_t, struct arch_probes_insn *, const struct decode_header *); + +struct decode_checker { + probes_check_t *checker; +}; + +struct decode_table { + struct decode_header header; + union decode_item table; +}; + +struct decode_custom { + struct decode_header header; + union decode_item decoder; +}; + +struct decode_simulate { + struct decode_header header; + union decode_item handler; +}; + +struct decode_emulate { + struct decode_header header; + union decode_item handler; +}; + +enum probes_arm_action { + PROBES_PRELOAD_IMM = 0, + PROBES_PRELOAD_REG = 1, + PROBES_BRANCH_IMM = 2, + PROBES_BRANCH_REG = 3, + PROBES_MRS = 4, + PROBES_CLZ = 5, + PROBES_SATURATING_ARITHMETIC = 6, + PROBES_MUL1 = 7, + PROBES_MUL2 = 8, + PROBES_SWP = 9, + PROBES_LDRSTRD = 10, + PROBES_LOAD = 11, + PROBES_STORE = 12, + PROBES_LOAD_EXTRA = 13, + PROBES_STORE_EXTRA = 14, + PROBES_MOV_IP_SP = 15, + PROBES_DATA_PROCESSING_REG = 16, + PROBES_DATA_PROCESSING_IMM = 17, + PROBES_MOV_HALFWORD = 18, + PROBES_SEV = 19, + PROBES_WFE = 20, + PROBES_SATURATE = 21, + PROBES_REV = 22, + PROBES_MMI = 23, + PROBES_PACK = 24, + PROBES_EXTEND = 25, + PROBES_EXTEND_ADD = 26, + PROBES_MUL_ADD_LONG = 27, + PROBES_MUL_ADD = 28, + PROBES_BITFIELD = 29, + PROBES_BRANCH = 30, + PROBES_LDMSTM = 31, + NUM_PROBES_ARM_ACTIONS = 32, +}; + +typedef u32 uprobe_opcode_t; + +struct arch_uprobe { + u8 insn[4]; + long unsigned int ixol[2]; + uprobe_opcode_t bpinsn; + bool simulate; + u32 pcreg; + void (*prehandler)(struct arch_uprobe *, struct arch_uprobe_task *, struct pt_regs *); + void (*posthandler)(struct arch_uprobe *, struct arch_uprobe_task *, struct pt_regs *); + struct arch_probes_insn asi; +}; + +struct freelist_node { + atomic_t refs; + struct freelist_node *next; +}; + +struct freelist_head { + struct freelist_node *head; +}; + +struct prev_kprobe { + struct kprobe *kp; + unsigned int status; +}; + +struct kprobe_ctlblk { + unsigned int kprobe_status; + struct prev_kprobe prev_kprobe; +}; + +struct kretprobe_instance; + +typedef int (*kretprobe_handler_t)(struct kretprobe_instance *, struct pt_regs *); + +struct kretprobe_holder; + +struct kretprobe_instance { + union { + struct freelist_node freelist; + struct callback_head rcu; + }; + struct llist_node llist; + struct kretprobe_holder *rph; + kprobe_opcode_t *ret_addr; + void *fp; + char data[0]; +}; + +struct kretprobe; + +struct kretprobe_holder { + struct kretprobe *rp; + refcount_t ref; +}; + +struct kretprobe { + struct kprobe kp; + kretprobe_handler_t handler; + kretprobe_handler_t entry_handler; + int maxactive; + int nmissed; + size_t data_size; + struct freelist_head freelist; + struct kretprobe_holder *rph; +}; + +struct kprobe_insn_cache { + struct mutex mutex; + void * (*alloc)(); + void (*free)(void *); + const char *sym; + struct list_head pages; + size_t insn_size; + int nr_garbage; +}; + +typedef enum probes_insn kprobe_decode_insn_t(probes_opcode_t, struct arch_probes_insn *, bool, const union decode_action *, const struct decode_checker **); + +enum { + STACK_USE_NONE = 0, + STACK_USE_UNKNOWN = 1, + STACK_USE_FIXED_X0X = 2, + STACK_USE_FIXED_XXX = 3, + STACK_USE_STMDX = 4, + NUM_STACK_USE_TYPES = 5, +}; + +struct arch_optimized_insn { + kprobe_opcode_t copied_insn[1]; + kprobe_opcode_t *insn; +}; + +struct optimized_kprobe { + struct kprobe kp; + struct list_head list; + struct arch_optimized_insn optinsn; +}; + +enum { + BPF_REG_0 = 0, + BPF_REG_1 = 1, + BPF_REG_2 = 2, + BPF_REG_3 = 3, + BPF_REG_4 = 4, + BPF_REG_5 = 5, + BPF_REG_6 = 6, + BPF_REG_7 = 7, + BPF_REG_8 = 8, + BPF_REG_9 = 9, + BPF_REG_10 = 10, + __MAX_BPF_REG = 11, +}; + +enum { + DUMP_PREFIX_NONE = 0, + DUMP_PREFIX_ADDRESS = 1, + DUMP_PREFIX_OFFSET = 2, +}; + +struct bpf_map_dev_ops { + int (*map_get_next_key)(struct bpf_offloaded_map *, void *, void *); + int (*map_lookup_elem)(struct bpf_offloaded_map *, void *, void *); + int (*map_update_elem)(struct bpf_offloaded_map *, void *, void *, u64); + int (*map_delete_elem)(struct bpf_offloaded_map *, void *); +}; + +struct bpf_offloaded_map { + struct bpf_map map; + struct net_device *netdev; + const struct bpf_map_dev_ops *dev_ops; + void *dev_priv; + struct list_head offloads; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_prog_stats { + u64_stats_t cnt; + u64_stats_t nsecs; + u64_stats_t misses; + struct u64_stats_sync syncp; + long: 32; +}; + +struct sock_fprog_kern { + u16 len; + struct sock_filter *filter; +}; + +struct tc_stats { + __u64 bytes; + __u32 packets; + __u32 drops; + __u32 overlimits; + __u32 bps; + __u32 pps; + __u32 qlen; + __u32 backlog; + long: 32; +}; + +struct tc_sizespec { + unsigned char cell_log; + unsigned char size_log; + short int cell_align; + int overhead; + unsigned int linklayer; + unsigned int mpu; + unsigned int mtu; + unsigned int tsize; +}; + +struct net_rate_estimator; + +struct qdisc_skb_head { + struct sk_buff *head; + struct sk_buff *tail; + __u32 qlen; + spinlock_t lock; +}; + +struct gnet_stats_basic_sync { + u64_stats_t bytes; + u64_stats_t packets; + struct u64_stats_sync syncp; + long: 32; + long: 32; + long: 32; +}; + +struct gnet_stats_queue { + __u32 qlen; + __u32 backlog; + __u32 drops; + __u32 requeues; + __u32 overlimits; +}; + +struct Qdisc_ops; + +struct qdisc_size_table; + +struct Qdisc { + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + unsigned int flags; + u32 limit; + const struct Qdisc_ops *ops; + struct qdisc_size_table *stab; + struct hlist_node hash; + u32 handle; + u32 parent; + struct netdev_queue *dev_queue; + struct net_rate_estimator *rate_est; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_queue *cpu_qstats; + int pad; + refcount_t refcnt; + struct sk_buff_head gso_skb; + struct qdisc_skb_head q; + struct gnet_stats_basic_sync bstats; + struct gnet_stats_queue qstats; + long unsigned int state; + long unsigned int state2; + struct Qdisc *next_sched; + struct sk_buff_head skb_bad_txq; + long: 32; + long: 32; + long: 32; + long: 32; + spinlock_t busylock; + spinlock_t seqlock; + struct callback_head rcu; + netdevice_tracker dev_tracker; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long int privdata[0]; +}; + +struct tcf_proto; + +struct tcf_block; + +struct mini_Qdisc { + struct tcf_proto *filter_list; + struct tcf_block *block; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_queue *cpu_qstats; + long unsigned int rcu_state; +}; + +struct tcmsg { + unsigned char tcm_family; + unsigned char tcm__pad1; + short unsigned int tcm__pad2; + int tcm_ifindex; + __u32 tcm_handle; + __u32 tcm_parent; + __u32 tcm_info; +}; + +struct gnet_dump { + spinlock_t *lock; + struct sk_buff *skb; + struct nlattr *tail; + int compat_tc_stats; + int compat_xstats; + int padattr; + void *xstats; + int xstats_len; + struct tc_stats tc_stats; +}; + +enum flow_action_hw_stats_bit { + FLOW_ACTION_HW_STATS_IMMEDIATE_BIT = 0, + FLOW_ACTION_HW_STATS_DELAYED_BIT = 1, + FLOW_ACTION_HW_STATS_DISABLED_BIT = 2, + FLOW_ACTION_HW_STATS_NUM_BITS = 3, +}; + +struct flow_block { + struct list_head cb_list; +}; + +typedef int flow_setup_cb_t(enum tc_setup_type, void *, void *); + +struct qdisc_size_table { + struct callback_head rcu; + struct list_head list; + struct tc_sizespec szopts; + int refcnt; + u16 data[0]; +}; + +struct Qdisc_class_ops; + +struct Qdisc_ops { + struct Qdisc_ops *next; + const struct Qdisc_class_ops *cl_ops; + char id[16]; + int priv_size; + unsigned int static_flags; + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + struct sk_buff * (*peek)(struct Qdisc *); + int (*init)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*reset)(struct Qdisc *); + void (*destroy)(struct Qdisc *); + int (*change)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*attach)(struct Qdisc *); + int (*change_tx_queue_len)(struct Qdisc *, unsigned int); + void (*change_real_num_tx)(struct Qdisc *, unsigned int); + int (*dump)(struct Qdisc *, struct sk_buff *); + int (*dump_stats)(struct Qdisc *, struct gnet_dump *); + void (*ingress_block_set)(struct Qdisc *, u32); + void (*egress_block_set)(struct Qdisc *, u32); + u32 (*ingress_block_get)(struct Qdisc *); + u32 (*egress_block_get)(struct Qdisc *); + struct module *owner; +}; + +struct qdisc_walker; + +struct Qdisc_class_ops { + unsigned int flags; + struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *); + int (*graft)(struct Qdisc *, long unsigned int, struct Qdisc *, struct Qdisc **, struct netlink_ext_ack *); + struct Qdisc * (*leaf)(struct Qdisc *, long unsigned int); + void (*qlen_notify)(struct Qdisc *, long unsigned int); + long unsigned int (*find)(struct Qdisc *, u32); + int (*change)(struct Qdisc *, u32, u32, struct nlattr **, long unsigned int *, struct netlink_ext_ack *); + int (*delete)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); + void (*walk)(struct Qdisc *, struct qdisc_walker *); + struct tcf_block * (*tcf_block)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); + long unsigned int (*bind_tcf)(struct Qdisc *, long unsigned int, u32); + void (*unbind_tcf)(struct Qdisc *, long unsigned int); + int (*dump)(struct Qdisc *, long unsigned int, struct sk_buff *, struct tcmsg *); + int (*dump_stats)(struct Qdisc *, long unsigned int, struct gnet_dump *); +}; + +struct tcf_chain; + +struct tcf_block { + struct mutex lock; + struct list_head chain_list; + u32 index; + u32 classid; + refcount_t refcnt; + struct net *net; + struct Qdisc *q; + struct rw_semaphore cb_lock; + struct flow_block flow_block; + struct list_head owner_list; + bool keep_dst; + atomic_t offloadcnt; + unsigned int nooffloaddevcnt; + unsigned int lockeddevcnt; + struct { + struct tcf_chain *chain; + struct list_head filter_chain_list; + } chain0; + struct callback_head rcu; + struct hlist_head proto_destroy_ht[128]; + struct mutex proto_destroy_lock; +}; + +struct tcf_result; + +struct tcf_proto_ops; + +struct tcf_proto { + struct tcf_proto *next; + void *root; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + __be16 protocol; + u32 prio; + void *data; + const struct tcf_proto_ops *ops; + struct tcf_chain *chain; + spinlock_t lock; + bool deleting; + refcount_t refcnt; + struct callback_head rcu; + struct hlist_node destroy_ht_node; +}; + +struct tcf_result { + union { + struct { + long unsigned int class; + u32 classid; + }; + const struct tcf_proto *goto_tp; + }; +}; + +struct tcf_walker; + +struct tcf_proto_ops { + struct list_head head; + char kind[16]; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + int (*init)(struct tcf_proto *); + void (*destroy)(struct tcf_proto *, bool, struct netlink_ext_ack *); + void * (*get)(struct tcf_proto *, u32); + void (*put)(struct tcf_proto *, void *); + int (*change)(struct net *, struct sk_buff *, struct tcf_proto *, long unsigned int, u32, struct nlattr **, void **, u32, struct netlink_ext_ack *); + int (*delete)(struct tcf_proto *, void *, bool *, bool, struct netlink_ext_ack *); + bool (*delete_empty)(struct tcf_proto *); + void (*walk)(struct tcf_proto *, struct tcf_walker *, bool); + int (*reoffload)(struct tcf_proto *, bool, flow_setup_cb_t *, void *, struct netlink_ext_ack *); + void (*hw_add)(struct tcf_proto *, void *); + void (*hw_del)(struct tcf_proto *, void *); + void (*bind_class)(void *, u32, long unsigned int, void *, long unsigned int); + void * (*tmplt_create)(struct net *, struct tcf_chain *, struct nlattr **, struct netlink_ext_ack *); + void (*tmplt_destroy)(void *); + int (*dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*terse_dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*tmplt_dump)(struct sk_buff *, struct net *, void *); + struct module *owner; + int flags; +}; + +struct tcf_chain { + struct mutex filter_chain_lock; + struct tcf_proto *filter_chain; + struct list_head list; + struct tcf_block *block; + u32 index; + unsigned int refcnt; + unsigned int action_refcnt; + bool explicitly_created; + bool flushing; + const struct tcf_proto_ops *tmplt_ops; + void *tmplt_priv; + struct callback_head rcu; +}; + +struct bpf_binary_header { + u32 size; + long: 32; + u8 image[0]; +}; + +typedef void (*bpf_jit_fill_hole_t)(void *, unsigned int); + +enum { + BPF_R2_HI = 0, + BPF_R2_LO = 1, + BPF_R3_HI = 2, + BPF_R3_LO = 3, + BPF_R4_HI = 4, + BPF_R4_LO = 5, + BPF_R5_HI = 6, + BPF_R5_LO = 7, + BPF_R7_HI = 8, + BPF_R7_LO = 9, + BPF_R8_HI = 10, + BPF_R8_LO = 11, + BPF_R9_HI = 12, + BPF_R9_LO = 13, + BPF_FP_HI = 14, + BPF_FP_LO = 15, + BPF_TC_HI = 16, + BPF_TC_LO = 17, + BPF_AX_HI = 18, + BPF_AX_LO = 19, + BPF_JIT_SCRATCH_REGS = 20, +}; + +struct jit_ctx { + const struct bpf_prog *prog; + unsigned int idx; + unsigned int prologue_bytes; + unsigned int epilogue_offset; + unsigned int cpu_architecture; + u32 flags; + u32 *offsets; + u32 *target; + u32 stack_size; +}; + +enum blake2s_lengths { + BLAKE2S_BLOCK_SIZE = 64, + BLAKE2S_HASH_SIZE = 32, + BLAKE2S_KEY_SIZE = 32, + BLAKE2S_128_HASH_SIZE = 16, + BLAKE2S_160_HASH_SIZE = 20, + BLAKE2S_224_HASH_SIZE = 28, + BLAKE2S_256_HASH_SIZE = 32, +}; + +struct blake2s_state { + u32 h[8]; + u32 t[2]; + u32 f[2]; + u8 buf[64]; + unsigned int buflen; + unsigned int outlen; +}; + +enum { + FW_DO_IDLE_SLEEP = 0, + FW_DO_IDLE_AFTR = 1, +}; + +enum sys_powerdown { + SYS_AFTR = 0, + SYS_LPA = 1, + SYS_SLEEP = 2, + NUM_SYS_POWERDOWN = 3, +}; + +typedef int suspend_state_t; + +struct platform_suspend_ops { + int (*valid)(suspend_state_t); + int (*begin)(suspend_state_t); + int (*prepare)(); + int (*prepare_late)(); + int (*enter)(suspend_state_t); + void (*wake)(); + void (*finish)(); + bool (*suspend_again)(); + void (*end)(); + void (*recover)(); +}; + +struct syscore_ops { + struct list_head node; + int (*suspend)(); + void (*resume)(); + void (*shutdown)(); +}; + +typedef int (*of_init_fn_2)(struct device_node *, struct device_node *); + +typedef int (*of_irq_init_cb_t)(struct device_node *, struct device_node *); + +struct exynos_wkup_irq { + unsigned int hwirq; + u32 mask; +}; + +struct exynos_pm_data { + const struct exynos_wkup_irq *wkup_irq; + unsigned int wake_disable_mask; + void (*pm_prepare)(); + void (*pm_resume_prepare)(); + void (*pm_resume)(); + int (*pm_suspend)(); + int (*cpu_suspend)(long unsigned int); +}; + +struct exynos_pm_state { + int cpu_state; + unsigned int pmu_spare3; + void *sysram_base; + long: 32; + phys_addr_t sysram_phys; + bool secure_firmware; + long: 32; +}; + +struct mmp_device_desc { + const char *dev_name; + const char *drv_name; + int id; + int irq; + long unsigned int start; + long unsigned int size; + int dma[2]; +}; + +struct mvebu_system_controller { + u32 rstoutn_mask_offset; + u32 system_soft_reset_offset; + u32 rstoutn_mask_reset_out_en; + u32 system_soft_reset; + u32 resume_boot_addr; + u32 dev_id; + u32 rev_id; +}; + +struct soc_device_attribute { + const char *machine; + const char *family; + const char *revision; + const char *serial_number; + const char *soc_id; + const void *data; + const struct attribute_group *custom_attr_group; +}; + +struct soc_device; + +enum { + COHERENCY_FABRIC_TYPE_NONE = 0, + COHERENCY_FABRIC_TYPE_ARMADA_370_XP = 1, + COHERENCY_FABRIC_TYPE_ARMADA_375 = 2, + COHERENCY_FABRIC_TYPE_ARMADA_380 = 3, +}; + +enum pmsu_idle_prepare_flags { + PMSU_PREPARE_NORMAL = 0, + PMSU_PREPARE_DEEP_IDLE = 1, + PMSU_PREPARE_SNOOP_DISABLE = 2, +}; + +enum gpiod_flags { + GPIOD_ASIS = 0, + GPIOD_IN = 1, + GPIOD_OUT_LOW = 3, + GPIOD_OUT_HIGH = 7, + GPIOD_OUT_LOW_OPEN_DRAIN = 11, + GPIOD_OUT_HIGH_OPEN_DRAIN = 15, +}; + +typedef __u16 __le16; + +struct mxc_extra_irq { + int (*set_irq_fiq)(unsigned int, unsigned int); +}; + +enum mxc_cpu_pwr_mode { + WAIT_CLOCKED = 0, + WAIT_UNCLOCKED = 1, + WAIT_UNCLOCKED_POWER_OFF = 2, + STOP_POWER_ON = 3, + STOP_POWER_OFF = 4, +}; + +struct imx5_suspend_io_state { + u32 offset; + u32 clear; + u32 set; + u32 saved_value; +}; + +struct imx5_pm_data { + phys_addr_t ccm_addr; + phys_addr_t cortex_addr; + phys_addr_t gpc_addr; + phys_addr_t m4if_addr; + phys_addr_t iomuxc_addr; + void (*suspend_asm)(void *); + const u32 *suspend_asm_sz; + const struct imx5_suspend_io_state *suspend_io_config; + int suspend_io_count; +}; + +struct imx5_cpu_suspend_info { + void *m4if_base; + void *iomuxc_base; + u32 io_count; + struct imx5_suspend_io_state io_state[20]; + long: 32; +}; + +enum hrtimer_mode { + HRTIMER_MODE_ABS = 0, + HRTIMER_MODE_REL = 1, + HRTIMER_MODE_PINNED = 2, + HRTIMER_MODE_SOFT = 4, + HRTIMER_MODE_HARD = 8, + HRTIMER_MODE_ABS_PINNED = 2, + HRTIMER_MODE_REL_PINNED = 3, + HRTIMER_MODE_ABS_SOFT = 4, + HRTIMER_MODE_REL_SOFT = 5, + HRTIMER_MODE_ABS_PINNED_SOFT = 6, + HRTIMER_MODE_REL_PINNED_SOFT = 7, + HRTIMER_MODE_ABS_HARD = 8, + HRTIMER_MODE_REL_HARD = 9, + HRTIMER_MODE_ABS_PINNED_HARD = 10, + HRTIMER_MODE_REL_PINNED_HARD = 11, +}; + +enum perf_event_task_context { + perf_invalid_context = 4294967295, + perf_hw_context = 0, + perf_sw_context = 1, + perf_nr_task_contexts = 2, +}; + +typedef unsigned int xa_mark_t; + +enum xa_lock_type { + XA_LOCK_IRQ = 1, + XA_LOCK_BH = 2, +}; + +struct ida { + struct xarray xa; +}; + +struct fsl_mmdc_devtype_data { + unsigned int flags; +}; + +struct mmdc_pmu { + struct pmu pmu; + void *mmdc_base; + cpumask_t cpu; + struct hrtimer hrtimer; + unsigned int active_events; + struct device *dev; + struct perf_event *mmdc_events[6]; + struct hlist_node node; + struct fsl_mmdc_devtype_data *devtype_data; + struct clk *mmdc_ipg_clk; +}; + +struct reset_controller_dev; + +struct reset_control_ops { + int (*reset)(struct reset_controller_dev *, long unsigned int); + int (*assert)(struct reset_controller_dev *, long unsigned int); + int (*deassert)(struct reset_controller_dev *, long unsigned int); + int (*status)(struct reset_controller_dev *, long unsigned int); +}; + +struct reset_controller_dev { + const struct reset_control_ops *ops; + struct module *owner; + struct list_head list; + struct list_head reset_control_head; + struct device *dev; + struct device_node *of_node; + int of_reset_n_cells; + int (*of_xlate)(struct reset_controller_dev *, const struct of_phandle_args *); + unsigned int nr_resets; +}; + +struct clk_core; + +struct clk { + struct clk_core *core; + struct device *dev; + const char *dev_id; + const char *con_id; + long unsigned int min_rate; + long unsigned int max_rate; + unsigned int exclusive_count; + struct hlist_node clks_node; +}; + +enum dev_prop_type { + DEV_PROP_U8 = 0, + DEV_PROP_U16 = 1, + DEV_PROP_U32 = 2, + DEV_PROP_U64 = 3, + DEV_PROP_STRING = 4, + DEV_PROP_REF = 5, +}; + +struct property_entry { + const char *name; + size_t length; + bool is_inline; + enum dev_prop_type type; + union { + const void *pointer; + union { + u8 u8_data[8]; + u16 u16_data[4]; + u32 u32_data[2]; + u64 u64_data[1]; + const char *str[2]; + } value; + }; +}; + +enum device_link_state { + DL_STATE_NONE = 4294967295, + DL_STATE_DORMANT = 0, + DL_STATE_AVAILABLE = 1, + DL_STATE_CONSUMER_PROBE = 2, + DL_STATE_ACTIVE = 3, + DL_STATE_SUPPLIER_UNBIND = 4, +}; + +struct device_link { + struct device *supplier; + struct list_head s_node; + struct device *consumer; + struct list_head c_node; + struct device link_dev; + enum device_link_state status; + u32 flags; + refcount_t rpm_active; + struct kref kref; + struct work_struct rm_work; + bool supplier_preactivated; + long: 32; +}; + +struct platform_device_info { + struct device *parent; + struct fwnode_handle *fwnode; + bool of_node_reused; + const char *name; + int id; + const struct resource *res; + unsigned int num_res; + const void *data; + size_t size_data; + long: 32; + u64 dma_mask; + const struct property_entry *properties; + long: 32; +}; + +struct of_dev_auxdata { + char *compatible; + long: 32; + resource_size_t phys_addr; + char *name; + void *platform_data; +}; + +struct ethtool_wolinfo { + __u32 cmd; + __u32 supported; + __u32 wolopts; + __u8 sopass[6]; +}; + +struct ethtool_tunable { + __u32 cmd; + __u32 id; + __u32 type_id; + __u32 len; + void *data[0]; +}; + +struct ethtool_eeprom { + __u32 cmd; + __u32 magic; + __u32 offset; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_modinfo { + __u32 cmd; + __u32 type; + __u32 eeprom_len; + __u32 reserved[8]; +}; + +struct ethtool_stats { + __u32 cmd; + __u32 n_stats; + __u64 data[0]; +}; + +struct ethtool_ts_info { + __u32 cmd; + __u32 so_timestamping; + __s32 phc_index; + __u32 tx_types; + __u32 tx_reserved[3]; + __u32 rx_filters; + __u32 rx_reserved[3]; +}; + +enum ethtool_link_mode_bit_indices { + ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, + ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, + ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, + ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, + ETHTOOL_LINK_MODE_Autoneg_BIT = 6, + ETHTOOL_LINK_MODE_TP_BIT = 7, + ETHTOOL_LINK_MODE_AUI_BIT = 8, + ETHTOOL_LINK_MODE_MII_BIT = 9, + ETHTOOL_LINK_MODE_FIBRE_BIT = 10, + ETHTOOL_LINK_MODE_BNC_BIT = 11, + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, + ETHTOOL_LINK_MODE_Pause_BIT = 13, + ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, + ETHTOOL_LINK_MODE_Backplane_BIT = 16, + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31, + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32, + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33, + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34, + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35, + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36, + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37, + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38, + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39, + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40, + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41, + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42, + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43, + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, + ETHTOOL_LINK_MODE_FEC_NONE_BIT = 49, + ETHTOOL_LINK_MODE_FEC_RS_BIT = 50, + ETHTOOL_LINK_MODE_FEC_BASER_BIT = 51, + ETHTOOL_LINK_MODE_50000baseKR_Full_BIT = 52, + ETHTOOL_LINK_MODE_50000baseSR_Full_BIT = 53, + ETHTOOL_LINK_MODE_50000baseCR_Full_BIT = 54, + ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = 55, + ETHTOOL_LINK_MODE_50000baseDR_Full_BIT = 56, + ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = 57, + ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = 58, + ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = 59, + ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 60, + ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = 61, + ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = 62, + ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = 63, + ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 64, + ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = 65, + ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = 66, + ETHTOOL_LINK_MODE_100baseT1_Full_BIT = 67, + ETHTOOL_LINK_MODE_1000baseT1_Full_BIT = 68, + ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = 69, + ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = 70, + ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 71, + ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = 72, + ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = 73, + ETHTOOL_LINK_MODE_FEC_LLRS_BIT = 74, + ETHTOOL_LINK_MODE_100000baseKR_Full_BIT = 75, + ETHTOOL_LINK_MODE_100000baseSR_Full_BIT = 76, + ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = 77, + ETHTOOL_LINK_MODE_100000baseCR_Full_BIT = 78, + ETHTOOL_LINK_MODE_100000baseDR_Full_BIT = 79, + ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = 80, + ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = 81, + ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 82, + ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = 83, + ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = 84, + ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = 85, + ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = 86, + ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87, + ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 88, + ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 89, + ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 90, + ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 91, + ETHTOOL_LINK_MODE_10baseT1L_Full_BIT = 92, + ETHTOOL_LINK_MODE_800000baseCR8_Full_BIT = 93, + ETHTOOL_LINK_MODE_800000baseKR8_Full_BIT = 94, + ETHTOOL_LINK_MODE_800000baseDR8_Full_BIT = 95, + ETHTOOL_LINK_MODE_800000baseDR8_2_Full_BIT = 96, + ETHTOOL_LINK_MODE_800000baseSR8_Full_BIT = 97, + ETHTOOL_LINK_MODE_800000baseVR8_Full_BIT = 98, + ETHTOOL_LINK_MODE_10baseT1S_Full_BIT = 99, + ETHTOOL_LINK_MODE_10baseT1S_Half_BIT = 100, + ETHTOOL_LINK_MODE_10baseT1S_P2MP_Half_BIT = 101, + __ETHTOOL_LINK_MODE_MASK_NBITS = 102, +}; + +struct mii_bus; + +struct gpio_desc; + +struct reset_control; + +struct mdio_device { + struct device dev; + struct mii_bus *bus; + char modalias[32]; + int (*bus_match)(struct device *, struct device_driver *); + void (*device_free)(struct mdio_device *); + void (*device_remove)(struct mdio_device *); + int addr; + int flags; + struct gpio_desc *reset_gpio; + struct reset_control *reset_ctrl; + unsigned int reset_assert_delay; + unsigned int reset_deassert_delay; +}; + +struct phy_c45_device_ids { + u32 devices_in_package; + u32 mmds_present; + u32 device_ids[32]; +}; + +enum phy_state { + PHY_DOWN = 0, + PHY_READY = 1, + PHY_HALTED = 2, + PHY_UP = 3, + PHY_RUNNING = 4, + PHY_NOLINK = 5, + PHY_CABLETEST = 6, +}; + +typedef enum { + PHY_INTERFACE_MODE_NA = 0, + PHY_INTERFACE_MODE_INTERNAL = 1, + PHY_INTERFACE_MODE_MII = 2, + PHY_INTERFACE_MODE_GMII = 3, + PHY_INTERFACE_MODE_SGMII = 4, + PHY_INTERFACE_MODE_TBI = 5, + PHY_INTERFACE_MODE_REVMII = 6, + PHY_INTERFACE_MODE_RMII = 7, + PHY_INTERFACE_MODE_REVRMII = 8, + PHY_INTERFACE_MODE_RGMII = 9, + PHY_INTERFACE_MODE_RGMII_ID = 10, + PHY_INTERFACE_MODE_RGMII_RXID = 11, + PHY_INTERFACE_MODE_RGMII_TXID = 12, + PHY_INTERFACE_MODE_RTBI = 13, + PHY_INTERFACE_MODE_SMII = 14, + PHY_INTERFACE_MODE_XGMII = 15, + PHY_INTERFACE_MODE_XLGMII = 16, + PHY_INTERFACE_MODE_MOCA = 17, + PHY_INTERFACE_MODE_QSGMII = 18, + PHY_INTERFACE_MODE_TRGMII = 19, + PHY_INTERFACE_MODE_100BASEX = 20, + PHY_INTERFACE_MODE_1000BASEX = 21, + PHY_INTERFACE_MODE_2500BASEX = 22, + PHY_INTERFACE_MODE_5GBASER = 23, + PHY_INTERFACE_MODE_RXAUI = 24, + PHY_INTERFACE_MODE_XAUI = 25, + PHY_INTERFACE_MODE_10GBASER = 26, + PHY_INTERFACE_MODE_25GBASER = 27, + PHY_INTERFACE_MODE_USXGMII = 28, + PHY_INTERFACE_MODE_10GKR = 29, + PHY_INTERFACE_MODE_QUSGMII = 30, + PHY_INTERFACE_MODE_1000BASEKX = 31, + PHY_INTERFACE_MODE_MAX = 32, +} phy_interface_t; + +struct phylink; + +struct pse_control; + +struct phy_driver; + +struct phy_led_trigger; + +struct phy_package_shared; + +struct mii_timestamper; + +struct phy_device { + struct mdio_device mdio; + struct phy_driver *drv; + struct device_link *devlink; + u32 phy_id; + struct phy_c45_device_ids c45_ids; + unsigned int is_c45: 1; + unsigned int is_internal: 1; + unsigned int is_pseudo_fixed_link: 1; + unsigned int is_gigabit_capable: 1; + unsigned int has_fixups: 1; + unsigned int suspended: 1; + unsigned int suspended_by_mdio_bus: 1; + unsigned int sysfs_links: 1; + unsigned int loopback_enabled: 1; + unsigned int downshifted_rate: 1; + unsigned int is_on_sfp_module: 1; + unsigned int mac_managed_pm: 1; + unsigned int autoneg: 1; + unsigned int link: 1; + unsigned int autoneg_complete: 1; + unsigned int interrupts: 1; + unsigned int irq_suspended: 1; + unsigned int irq_rerun: 1; + int rate_matching; + enum phy_state state; + u32 dev_flags; + phy_interface_t interface; + int speed; + int duplex; + int port; + int pause; + int asym_pause; + u8 master_slave_get; + u8 master_slave_set; + u8 master_slave_state; + long unsigned int supported[4]; + long unsigned int advertising[4]; + long unsigned int lp_advertising[4]; + long unsigned int adv_old[4]; + long unsigned int host_interfaces[1]; + u32 eee_broken_modes; + struct phy_led_trigger *phy_led_triggers; + unsigned int phy_num_led_triggers; + struct phy_led_trigger *last_triggered; + struct phy_led_trigger *led_link_trigger; + int irq; + void *priv; + struct phy_package_shared *shared; + struct sk_buff *skb; + void *ehdr; + struct nlattr *nest; + struct delayed_work state_queue; + struct mutex lock; + bool sfp_bus_attached; + struct sfp_bus *sfp_bus; + struct phylink *phylink; + struct net_device *attached_dev; + struct mii_timestamper *mii_ts; + struct pse_control *psec; + u8 mdix; + u8 mdix_ctrl; + int pma_extable; + unsigned int link_down_events; + void (*phy_link_change)(struct phy_device *, bool); + void (*adjust_link)(struct net_device *); + const struct macsec_ops *macsec_ops; +}; + +struct phy_plca_cfg { + int version; + int enabled; + int node_id; + int node_cnt; + int to_tmr; + int burst_cnt; + int burst_tmr; +}; + +struct phy_plca_status { + bool pst; +}; + +struct phy_tdr_config { + u32 first; + u32 last; + u32 step; + s8 pair; +}; + +struct mdio_bus_stats { + u64_stats_t transfers; + u64_stats_t errors; + u64_stats_t writes; + u64_stats_t reads; + struct u64_stats_sync syncp; + long: 32; +}; + +struct mii_bus { + struct module *owner; + const char *name; + char id[61]; + void *priv; + int (*read)(struct mii_bus *, int, int); + int (*write)(struct mii_bus *, int, int, u16); + int (*read_c45)(struct mii_bus *, int, int, int); + int (*write_c45)(struct mii_bus *, int, int, int, u16); + int (*reset)(struct mii_bus *); + struct mdio_bus_stats stats[32]; + struct mutex mdio_lock; + struct device *parent; + enum { + MDIOBUS_ALLOCATED = 1, + MDIOBUS_REGISTERED = 2, + MDIOBUS_UNREGISTERED = 3, + MDIOBUS_RELEASED = 4, + } state; + long: 32; + struct device dev; + struct mdio_device *mdio_map[32]; + u32 phy_mask; + u32 phy_ignore_ta_mask; + int irq[32]; + int reset_delay_us; + int reset_post_delay_us; + struct gpio_desc *reset_gpiod; + struct mutex shared_lock; + struct phy_package_shared *shared[32]; +}; + +struct mdio_driver_common { + struct device_driver driver; + int flags; +}; + +struct mii_timestamper { + bool (*rxtstamp)(struct mii_timestamper *, struct sk_buff *, int); + void (*txtstamp)(struct mii_timestamper *, struct sk_buff *, int); + int (*hwtstamp)(struct mii_timestamper *, struct ifreq *); + void (*link_state)(struct mii_timestamper *, struct phy_device *); + int (*ts_info)(struct mii_timestamper *, struct ethtool_ts_info *); + struct device *device; +}; + +struct phy_package_shared { + int addr; + refcount_t refcnt; + long unsigned int flags; + size_t priv_size; + void *priv; +}; + +struct phy_driver { + struct mdio_driver_common mdiodrv; + u32 phy_id; + char *name; + u32 phy_id_mask; + const long unsigned int * const features; + u32 flags; + const void *driver_data; + int (*soft_reset)(struct phy_device *); + int (*config_init)(struct phy_device *); + int (*probe)(struct phy_device *); + int (*get_features)(struct phy_device *); + int (*get_rate_matching)(struct phy_device *, phy_interface_t); + int (*suspend)(struct phy_device *); + int (*resume)(struct phy_device *); + int (*config_aneg)(struct phy_device *); + int (*aneg_done)(struct phy_device *); + int (*read_status)(struct phy_device *); + int (*config_intr)(struct phy_device *); + irqreturn_t (*handle_interrupt)(struct phy_device *); + void (*remove)(struct phy_device *); + int (*match_phy_device)(struct phy_device *); + int (*set_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*get_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*link_change_notify)(struct phy_device *); + int (*read_mmd)(struct phy_device *, int, u16); + int (*write_mmd)(struct phy_device *, int, u16, u16); + int (*read_page)(struct phy_device *); + int (*write_page)(struct phy_device *, int); + int (*module_info)(struct phy_device *, struct ethtool_modinfo *); + int (*module_eeprom)(struct phy_device *, struct ethtool_eeprom *, u8 *); + int (*cable_test_start)(struct phy_device *); + int (*cable_test_tdr_start)(struct phy_device *, const struct phy_tdr_config *); + int (*cable_test_get_status)(struct phy_device *, bool *); + int (*get_sset_count)(struct phy_device *); + void (*get_strings)(struct phy_device *, u8 *); + void (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*get_tunable)(struct phy_device *, struct ethtool_tunable *, void *); + int (*set_tunable)(struct phy_device *, struct ethtool_tunable *, const void *); + int (*set_loopback)(struct phy_device *, bool); + int (*get_sqi)(struct phy_device *); + int (*get_sqi_max)(struct phy_device *); + int (*get_plca_cfg)(struct phy_device *, struct phy_plca_cfg *); + int (*set_plca_cfg)(struct phy_device *, const struct phy_plca_cfg *); + int (*get_plca_status)(struct phy_device *, struct phy_plca_status *); +}; + +struct imx6_pm_base { + phys_addr_t pbase; + void *vbase; + long: 32; +}; + +struct imx6_pm_socdata { + u32 ddr_type; + const char *mmdc_compat; + const char *src_compat; + const char *iomuxc_compat; + const char *gpc_compat; + const char *pl310_compat; + const u32 mmdc_io_num; + const u32 *mmdc_io_offset; +}; + +struct imx6_cpu_pm_info { + phys_addr_t pbase; + phys_addr_t resume_addr; + u32 ddr_type; + u32 pm_info_size; + struct imx6_pm_base mmdc_base; + struct imx6_pm_base src_base; + struct imx6_pm_base iomuxc_base; + struct imx6_pm_base ccm_base; + struct imx6_pm_base gpc_base; + struct imx6_pm_base l2_base; + u32 mmdc_io_num; + u32 mmdc_io_val[66]; + long: 32; +}; + +enum input_clock_type { + INPUT_CLK_REAL = 0, + INPUT_CLK_MONO = 1, + INPUT_CLK_BOOT = 2, + INPUT_CLK_MAX = 3, +}; + +enum twl_module_ids { + TWL_MODULE_USB = 0, + TWL_MODULE_PIH = 1, + TWL_MODULE_MAIN_CHARGE = 2, + TWL_MODULE_PM_MASTER = 3, + TWL_MODULE_PM_RECEIVER = 4, + TWL_MODULE_RTC = 5, + TWL_MODULE_PWM = 6, + TWL_MODULE_LED = 7, + TWL_MODULE_SECURED_REG = 8, + TWL_MODULE_LAST = 9, +}; + +struct omap_die_id { + u32 id_0; + u32 id_1; + u32 id_2; + u32 id_3; +}; + +struct omap_id { + u16 hawkeye; + u8 dev; + u32 type; +}; + +struct omap_hwmod_rst_info { + const char *name; + u8 rst_shift; + u8 st_shift; +}; + +struct omap_hwmod_opt_clk { + const char *role; + const char *clk; + struct clk *_clk; +}; + +struct omap_hwmod_omap2_firewall { + u8 l3_perm_bit; + u8 l4_fw_region; + u8 l4_prot_group; + u8 flags; +}; + +struct omap_hwmod_addr_space; + +struct omap_hwmod; + +struct omap_hwmod_ocp_if { + struct omap_hwmod *master; + struct omap_hwmod *slave; + struct omap_hwmod_addr_space *addr; + const char *clk; + struct clk *_clk; + struct list_head node; + union { + struct omap_hwmod_omap2_firewall omap2; + } fw; + u8 width; + u8 user; + u8 flags; + u8 _int_flags; +}; + +struct omap_hwmod_omap2_prcm { + s16 module_offs; + u8 idlest_reg_id; + u8 idlest_idle_bit; +}; + +struct omap_hwmod_omap4_prcm { + u16 clkctrl_offs; + u16 rstctrl_offs; + u16 rstst_offs; + u16 context_offs; + u32 lostcontext_mask; + u8 submodule_wkdep_bit; + u8 modulemode; + u8 flags; + int context_lost_counter; +}; + +struct omap_hwmod_class; + +struct clockdomain; + +struct omap_hwmod { + const char *name; + struct omap_hwmod_class *class; + struct omap_device *od; + struct omap_hwmod_rst_info *rst_lines; + union { + struct omap_hwmod_omap2_prcm omap2; + struct omap_hwmod_omap4_prcm omap4; + } prcm; + const char *main_clk; + struct clk *_clk; + struct omap_hwmod_opt_clk *opt_clks; + const char *clkdm_name; + struct clockdomain *clkdm; + struct list_head slave_ports; + void *dev_attr; + u32 _sysc_cache; + void *_mpu_rt_va; + spinlock_t _lock; + struct lock_class_key hwmod_key; + struct list_head node; + struct omap_hwmod_ocp_if *_mpu_port; + u32 flags; + u8 mpu_rt_idx; + u8 response_lat; + u8 rst_lines_cnt; + u8 opt_clks_cnt; + u8 slaves_cnt; + u8 hwmods_cnt; + u8 _int_flags; + u8 _state; + u8 _postsetup_state; + struct omap_hwmod *parent_hwmod; +}; + +struct sysc_regbits; + +struct omap_hwmod_class_sysconfig { + s32 rev_offs; + s32 sysc_offs; + s32 syss_offs; + u16 sysc_flags; + struct sysc_regbits *sysc_fields; + u8 srst_udelay; + u8 idlemodes; +}; + +struct omap_hwmod_class { + const char *name; + struct omap_hwmod_class_sysconfig *sysc; + int (*pre_shutdown)(struct omap_hwmod *); + int (*reset)(struct omap_hwmod *); + void (*lock)(struct omap_hwmod *); + void (*unlock)(struct omap_hwmod *); +}; + +struct powerdomain; + +struct clkdm_dep; + +struct clockdomain { + const char *name; + union { + const char *name; + struct powerdomain *ptr; + } pwrdm; + const u16 clktrctrl_mask; + const u8 flags; + u8 _flags; + const u8 dep_bit; + const u8 prcm_partition; + const u16 cm_inst; + const u16 clkdm_offs; + struct clkdm_dep *wkdep_srcs; + struct clkdm_dep *sleepdep_srcs; + int usecount; + int forcewake_count; + struct list_head node; + u32 context; +}; + +struct omap_volt_data { + u32 volt_nominal; + u32 sr_efuse_offs; + u8 sr_errminlimit; + u8 vp_errgain; +}; + +struct omap_vc_common { + u32 cmd_on_mask; + u32 valid; + u8 bypass_val_reg; + u8 data_shift; + u8 slaveaddr_shift; + u8 regaddr_shift; + u8 cmd_on_shift; + u8 cmd_onlp_shift; + u8 cmd_ret_shift; + u8 cmd_off_shift; + u8 i2c_cfg_reg; + u8 i2c_cfg_clear_mask; + u8 i2c_cfg_hsen_mask; + u8 i2c_mcode_mask; +}; + +struct omap_vc_channel { + u16 i2c_slave_addr; + u16 volt_reg_addr; + u16 cmd_reg_addr; + u8 cfg_channel; + bool i2c_high_speed; + const struct omap_vc_common *common; + u32 smps_sa_mask; + u32 smps_volra_mask; + u32 smps_cmdra_mask; + u8 cmdval_reg; + u8 smps_sa_reg; + u8 smps_volra_reg; + u8 smps_cmdra_reg; + u8 cfg_channel_reg; + u8 cfg_channel_sa_shift; + u8 flags; +}; + +struct omap_vc_param { + u32 on; + u32 onlp; + u32 ret; + u32 off; +}; + +struct omap_vp_ops { + u32 (*check_txdone)(u8); + void (*clear_txdone)(u8); +}; + +struct omap_vp_common { + u32 vpconfig_erroroffset_mask; + u32 vpconfig_errorgain_mask; + u32 vpconfig_initvoltage_mask; + u8 vpconfig_timeouten; + u8 vpconfig_initvdd; + u8 vpconfig_forceupdate; + u8 vpconfig_vpenable; + u8 vstepmin_stepmin_shift; + u8 vstepmin_smpswaittimemin_shift; + u8 vstepmax_stepmax_shift; + u8 vstepmax_smpswaittimemax_shift; + u8 vlimitto_vddmin_shift; + u8 vlimitto_vddmax_shift; + u8 vlimitto_timeout_shift; + u8 vpvoltage_mask; + const struct omap_vp_ops *ops; +}; + +struct omap_vp_instance { + const struct omap_vp_common *common; + u8 vpconfig; + u8 vstepmin; + u8 vstepmax; + u8 vlimitto; + u8 vstatus; + u8 voltage; + u8 id; + bool enabled; +}; + +struct omap_vp_param { + u32 vddmax; + u32 vddmin; +}; + +struct omap_vfsm_instance { + u32 voltsetup_mask; + u8 voltsetup_reg; + u8 voltsetup_off_reg; +}; + +struct omap_voltdm_pmic; + +struct voltagedomain { + char *name; + bool scalable; + struct list_head node; + struct omap_vc_channel *vc; + const struct omap_vfsm_instance *vfsm; + struct omap_vp_instance *vp; + struct omap_voltdm_pmic *pmic; + struct omap_vp_param *vp_param; + struct omap_vc_param *vc_param; + u32 (*read)(u8); + void (*write)(u32, u8); + u32 (*rmw)(u32, u32, u8); + union { + const char *name; + u32 rate; + } sys_clk; + int (*scale)(struct voltagedomain *, long unsigned int); + u32 nominal_volt; + struct omap_volt_data *volt_data; +}; + +struct omap_voltdm_pmic { + int slew_rate; + int step_size; + u16 i2c_slave_addr; + u16 volt_reg_addr; + u16 cmd_reg_addr; + u8 vp_erroroffset; + u8 vp_vstepmin; + u8 vp_vstepmax; + u32 vddmin; + u32 vddmax; + u8 vp_timeout_us; + bool i2c_high_speed; + u32 i2c_pad_load; + u8 i2c_mcode; + long unsigned int (*vsel_to_uv)(const u8); + u8 (*uv_to_vsel)(long unsigned int); +}; + +struct powerdomain { + const char *name; + union { + const char *name; + struct voltagedomain *ptr; + } voltdm; + const s16 prcm_offs; + const u8 pwrsts; + const u8 pwrsts_logic_ret; + const u8 flags; + const u8 banks; + const u8 pwrsts_mem_ret[5]; + const u8 pwrsts_mem_on[5]; + const u8 prcm_partition; + struct clockdomain *pwrdm_clkdms[11]; + struct list_head node; + struct list_head voltdm_node; + int state; + unsigned int state_counter[4]; + unsigned int ret_logic_off_counter; + unsigned int ret_mem_off_counter[5]; + spinlock_t _lock; + long unsigned int _lock_flags; + const u8 pwrstctrl_offs; + const u8 pwrstst_offs; + const u32 logicretstate_mask; + const u32 mem_on_mask[5]; + const u32 mem_ret_mask[5]; + const u32 mem_pwrst_mask[5]; + const u32 mem_retst_mask[5]; + long: 32; + s64 timer; + s64 state_timer[4]; + u32 context; + long: 32; +}; + +struct clkdm_dep { + const char *clkdm_name; + struct clockdomain *clkdm; + s16 wkdep_usecount; + s16 sleepdep_usecount; +}; + +struct omap_sdrc_params { + long unsigned int rate; + u32 actim_ctrla; + u32 actim_ctrlb; + u32 rfr_ctrl; + u32 mr; +}; + +struct omap_prcm_init_data { + int index; + void *mem; + u32 phys; + s16 offset; + u16 flags; + s32 device_inst_offset; + int (*init)(const struct omap_prcm_init_data *); + struct device_node *np; +}; + +enum { + TI_CLKM_CM = 0, + TI_CLKM_CM2 = 1, + TI_CLKM_PRM = 2, + TI_CLKM_SCRM = 3, + TI_CLKM_CTRL = 4, + TI_CLKM_CTRL_AUX = 5, + TI_CLKM_PLLSS = 6, + CLK_MAX_MEMMAPS = 7, +}; + +struct omap3_scratchpad { + u32 boot_config_ptr; + u32 public_restore_ptr; + u32 secure_ram_restore_ptr; + u32 sdrc_module_semaphore; + u32 prcm_block_offset; + u32 sdrc_block_offset; +}; + +struct omap3_scratchpad_prcm_block { + u32 prm_contents[2]; + u32 cm_contents[11]; + u32 prcm_block_size; +}; + +struct omap3_scratchpad_sdrc_block { + u16 sysconfig; + u16 cs_cfg; + u16 sharing; + u16 err_type; + u32 dll_a_ctrl; + u32 dll_b_ctrl; + u32 power; + u32 cs_0; + u32 mcfg_0; + u16 mr_0; + u16 emr_1_0; + u16 emr_2_0; + u16 emr_3_0; + u32 actim_ctrla_0; + u32 actim_ctrlb_0; + u32 rfr_ctrl_0; + u32 cs_1; + u32 mcfg_1; + u16 mr_1; + u16 emr_1_1; + u16 emr_2_1; + u16 emr_3_1; + u32 actim_ctrla_1; + u32 actim_ctrlb_1; + u32 rfr_ctrl_1; + u16 dcdl_1_ctrl; + u16 dcdl_2_ctrl; + u32 flags; + u32 block_size; +}; + +struct omap3_control_regs { + u32 sysconfig; + u32 devconf0; + u32 mem_dftrw0; + u32 mem_dftrw1; + u32 msuspendmux_0; + u32 msuspendmux_1; + u32 msuspendmux_2; + u32 msuspendmux_3; + u32 msuspendmux_4; + u32 msuspendmux_5; + u32 sec_ctrl; + u32 devconf1; + u32 csirxfe; + u32 iva2_bootaddr; + u32 iva2_bootmod; + u32 wkup_ctrl; + u32 debobs_0; + u32 debobs_1; + u32 debobs_2; + u32 debobs_3; + u32 debobs_4; + u32 debobs_5; + u32 debobs_6; + u32 debobs_7; + u32 debobs_8; + u32 prog_io0; + u32 prog_io1; + u32 dss_dpll_spreading; + u32 core_dpll_spreading; + u32 per_dpll_spreading; + u32 usbhost_dpll_spreading; + u32 pbias_lite; + u32 temp_sensor; + u32 sramldo4; + u32 sramldo5; + u32 csi; + u32 padconf_sys_nirq; +}; + +struct control_init_data { + int index; + void *mem; + s16 offset; +}; + +struct omap2_oscillator { + u32 startup_time; + u32 shutdown_time; +}; + +struct dma_slave_map { + const char *devname; + const char *slave; + void *param; +}; + +enum omap_reg_offsets { + GCR = 0, + GSCR = 1, + GRST1 = 2, + HW_ID = 3, + PCH2_ID = 4, + PCH0_ID = 5, + PCH1_ID = 6, + PCHG_ID = 7, + PCHD_ID = 8, + CAPS_0 = 9, + CAPS_1 = 10, + CAPS_2 = 11, + CAPS_3 = 12, + CAPS_4 = 13, + PCH2_SR = 14, + PCH0_SR = 15, + PCH1_SR = 16, + PCHD_SR = 17, + REVISION = 18, + IRQSTATUS_L0 = 19, + IRQSTATUS_L1 = 20, + IRQSTATUS_L2 = 21, + IRQSTATUS_L3 = 22, + IRQENABLE_L0 = 23, + IRQENABLE_L1 = 24, + IRQENABLE_L2 = 25, + IRQENABLE_L3 = 26, + SYSSTATUS = 27, + OCP_SYSCONFIG = 28, + CPC = 29, + CCR2 = 30, + LCH_CTRL = 31, + CSDP = 32, + CCR = 33, + CICR = 34, + CSR = 35, + CEN = 36, + CFN = 37, + CSFI = 38, + CSEI = 39, + CSAC = 40, + CDAC = 41, + CDEI = 42, + CDFI = 43, + CLNK_CTRL = 44, + CSSA = 45, + CDSA = 46, + COLOR = 47, + CCEN = 48, + CCFN = 49, + CDP = 50, + CNDP = 51, + CCDN = 52, +}; + +struct omap_dma_dev_attr { + u32 dev_caps; + u16 lch_count; + u16 chan_count; +}; + +enum { + OMAP_DMA_REG_NONE = 0, + OMAP_DMA_REG_16BIT = 1, + OMAP_DMA_REG_2X16BIT = 2, + OMAP_DMA_REG_32BIT = 3, +}; + +struct omap_dma_reg { + u16 offset; + u8 stride; + u8 type; +}; + +struct omap_system_dma_plat_info { + const struct omap_dma_reg *reg_map; + unsigned int channel_stride; + struct omap_dma_dev_attr *dma_attr; + u32 errata; + void (*show_dma_caps)(); + void (*clear_lch_regs)(int); + void (*clear_dma)(int); + void (*dma_write)(u32, int, int); + u32 (*dma_read)(int, int); + const struct dma_slave_map *slave_map; + int slavecnt; +}; + +struct clk_hw; + +struct clk_rate_request { + struct clk_core *core; + long unsigned int rate; + long unsigned int min_rate; + long unsigned int max_rate; + long unsigned int best_parent_rate; + struct clk_hw *best_parent_hw; +}; + +struct clk_init_data; + +struct clk_hw { + struct clk_core *core; + struct clk *clk; + const struct clk_init_data *init; +}; + +struct clk_duty { + unsigned int num; + unsigned int den; +}; + +struct clk_ops { + int (*prepare)(struct clk_hw *); + void (*unprepare)(struct clk_hw *); + int (*is_prepared)(struct clk_hw *); + void (*unprepare_unused)(struct clk_hw *); + int (*enable)(struct clk_hw *); + void (*disable)(struct clk_hw *); + int (*is_enabled)(struct clk_hw *); + void (*disable_unused)(struct clk_hw *); + int (*save_context)(struct clk_hw *); + void (*restore_context)(struct clk_hw *); + long unsigned int (*recalc_rate)(struct clk_hw *, long unsigned int); + long int (*round_rate)(struct clk_hw *, long unsigned int, long unsigned int *); + int (*determine_rate)(struct clk_hw *, struct clk_rate_request *); + int (*set_parent)(struct clk_hw *, u8); + u8 (*get_parent)(struct clk_hw *); + int (*set_rate)(struct clk_hw *, long unsigned int, long unsigned int); + int (*set_rate_and_parent)(struct clk_hw *, long unsigned int, long unsigned int, u8); + long unsigned int (*recalc_accuracy)(struct clk_hw *, long unsigned int); + int (*get_phase)(struct clk_hw *); + int (*set_phase)(struct clk_hw *, int); + int (*get_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*set_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*init)(struct clk_hw *); + void (*terminate)(struct clk_hw *); + void (*debug_init)(struct clk_hw *, struct dentry *); +}; + +struct clk_parent_data { + const struct clk_hw *hw; + const char *fw_name; + const char *name; + int index; +}; + +struct clk_init_data { + const char *name; + const struct clk_ops *ops; + const char * const *parent_names; + const struct clk_parent_data *parent_data; + const struct clk_hw **parent_hws; + u8 num_parents; + long unsigned int flags; +}; + +enum ti_sysc_module_type { + TI_SYSC_OMAP2 = 0, + TI_SYSC_OMAP2_TIMER = 1, + TI_SYSC_OMAP3_SHAM = 2, + TI_SYSC_OMAP3_AES = 3, + TI_SYSC_OMAP4 = 4, + TI_SYSC_OMAP4_TIMER = 5, + TI_SYSC_OMAP4_SIMPLE = 6, + TI_SYSC_OMAP34XX_SR = 7, + TI_SYSC_OMAP36XX_SR = 8, + TI_SYSC_OMAP4_SR = 9, + TI_SYSC_OMAP4_MCASP = 10, + TI_SYSC_OMAP4_USB_HOST_FS = 11, + TI_SYSC_DRA7_MCAN = 12, + TI_SYSC_PRUSS = 13, +}; + +struct ti_sysc_cookie { + void *data; + void *clkdm; +}; + +struct sysc_regbits { + s8 midle_shift; + s8 clkact_shift; + s8 sidle_shift; + s8 enwkup_shift; + s8 srst_shift; + s8 autoidle_shift; + s8 dmadisable_shift; + s8 emufree_shift; +}; + +struct sysc_capabilities { + const enum ti_sysc_module_type type; + const u32 sysc_mask; + const struct sysc_regbits *regbits; + const u32 mod_quirks; +}; + +struct sysc_config { + u32 sysc_val; + u32 syss_mask; + u8 midlemodes; + u8 sidlemodes; + u8 srst_udelay; + u32 quirks; +}; + +enum sysc_registers { + SYSC_REVISION = 0, + SYSC_SYSCONFIG = 1, + SYSC_SYSSTATUS = 2, + SYSC_MAX_REGS = 3, +}; + +struct ti_sysc_module_data { + const char *name; + long: 32; + u64 module_pa; + u32 module_size; + int *offsets; + int nr_offsets; + const struct sysc_capabilities *cap; + struct sysc_config *cfg; + long: 32; +}; + +struct clk_omap_reg { + void *ptr; + u16 offset; + u8 index; + u8 flags; +}; + +struct dpll_data { + struct clk_omap_reg mult_div1_reg; + u32 mult_mask; + u32 div1_mask; + struct clk_hw *clk_bypass; + struct clk_hw *clk_ref; + struct clk_omap_reg control_reg; + u32 enable_mask; + long unsigned int last_rounded_rate; + u16 last_rounded_m; + u8 last_rounded_m4xen; + u8 last_rounded_lpmode; + u16 max_multiplier; + u8 last_rounded_n; + u8 min_divider; + u16 max_divider; + long unsigned int max_rate; + u8 modes; + struct clk_omap_reg autoidle_reg; + struct clk_omap_reg idlest_reg; + u32 autoidle_mask; + u32 freqsel_mask; + u32 idlest_mask; + u32 dco_mask; + u32 sddiv_mask; + u32 dcc_mask; + long unsigned int dcc_rate; + u32 lpmode_mask; + u32 m4xen_mask; + u8 auto_recal_bit; + u8 recal_en_bit; + u8 recal_st_bit; + struct clk_omap_reg ssc_deltam_reg; + struct clk_omap_reg ssc_modfreq_reg; + u32 ssc_deltam_int_mask; + u32 ssc_deltam_frac_mask; + u32 ssc_modfreq_mant_mask; + u32 ssc_modfreq_exp_mask; + u32 ssc_enable_mask; + u32 ssc_downspread_mask; + u32 ssc_modfreq; + u32 ssc_deltam; + bool ssc_downspread; + u8 flags; +}; + +struct clk_hw_omap; + +struct clk_hw_omap_ops { + void (*find_idlest)(struct clk_hw_omap *, struct clk_omap_reg *, u8 *, u8 *); + void (*find_companion)(struct clk_hw_omap *, struct clk_omap_reg *, u8 *); + void (*allow_idle)(struct clk_hw_omap *); + void (*deny_idle)(struct clk_hw_omap *); +}; + +struct clk_hw_omap { + struct clk_hw hw; + struct list_head node; + long unsigned int fixed_rate; + u8 fixed_div; + struct clk_omap_reg enable_reg; + u8 enable_bit; + long unsigned int flags; + struct clk_omap_reg clksel_reg; + struct dpll_data *dpll_data; + const char *clkdm_name; + struct clockdomain *clkdm; + const struct clk_hw_omap_ops *ops; + u32 context; + int autoidle_count; +}; + +struct clkctrl_provider { + int num_addrs; + u32 *addr; + u32 *size; + struct device_node *node; + struct list_head link; +}; + +struct omap_hwmod_reset { + const char *match; + int len; + int (*reset)(struct omap_hwmod *); +}; + +struct omap_hwmod_soc_ops { + void (*enable_module)(struct omap_hwmod *); + int (*disable_module)(struct omap_hwmod *); + int (*wait_target_ready)(struct omap_hwmod *); + int (*assert_hardreset)(struct omap_hwmod *, struct omap_hwmod_rst_info *); + int (*deassert_hardreset)(struct omap_hwmod *, struct omap_hwmod_rst_info *); + int (*is_hardreset_asserted)(struct omap_hwmod *, struct omap_hwmod_rst_info *); + int (*init_clkdm)(struct omap_hwmod *); + void (*update_context_lost)(struct omap_hwmod *); + int (*get_context_lost)(struct omap_hwmod *); + int (*disable_direct_prcm)(struct omap_hwmod *); + u32 (*xlate_clkctrl)(struct omap_hwmod *); +}; + +struct omap_dss_dispc_dev_attr { + u8 manager_count; + bool has_framedonetv_irq; +}; + +struct pm_domain_data { + struct list_head list_node; + struct device *dev; +}; + +struct omap_device { + struct platform_device *pdev; + struct omap_hwmod **hwmods; + long unsigned int _driver_status; + u8 hwmods_cnt; + u8 _state; + u8 flags; +}; + +struct omap_mcbsp_ops { + void (*request)(unsigned int); + void (*free)(unsigned int); +}; + +struct omap_mcbsp_platform_data { + struct omap_mcbsp_ops *ops; + u16 buffer_size; + u8 reg_size; + u8 reg_step; + bool has_wakeup; + bool has_ccr; + int (*force_ick_on)(struct clk *, bool); +}; + +enum twl6030_module_ids { + TWL6030_MODULE_ID0 = 9, + TWL6030_MODULE_ID1 = 10, + TWL6030_MODULE_ID2 = 11, + TWL6030_MODULE_GPADC = 12, + TWL6030_MODULE_GASGAUGE = 13, + TWL6030_MODULE_LAST = 14, +}; + +struct omap2_sms_regs { + u32 sms_sysconfig; +}; + +enum { + IRQCHIP_SET_TYPE_MASKED = 1, + IRQCHIP_EOI_IF_HANDLED = 2, + IRQCHIP_MASK_ON_SUSPEND = 4, + IRQCHIP_ONOFFLINE_ENABLED = 8, + IRQCHIP_SKIP_SET_WAKE = 16, + IRQCHIP_ONESHOT_SAFE = 32, + IRQCHIP_EOI_THREADED = 64, + IRQCHIP_SUPPORTS_LEVEL_MSI = 128, + IRQCHIP_SUPPORTS_NMI = 256, + IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND = 512, + IRQCHIP_AFFINITY_PRE_STARTUP = 1024, + IRQCHIP_IMMUTABLE = 2048, +}; + +struct omap_wakeupgen_ops { + void (*save_context)(); + void (*restore_context)(); +}; + +struct omap_smp_config { + long unsigned int cpu1_rstctrl_pa; + void *cpu1_rstctrl_va; + void *scu_base; + void *wakeupgen_base; + void *startup_addr; +}; + +struct omap_domain_base { + u32 pa; + void *va; + s16 offset; +}; + +struct omap4_cpu_pm_info { + struct powerdomain *pwrdm; + void *scu_sar_addr; + void *wkup_sar_addr; + void *l2x0_sar_addr; +}; + +struct cpu_pm_ops { + int (*finish_suspend)(long unsigned int); + void (*resume)(); + void (*scu_prepare)(unsigned int, unsigned int); + void (*hotplug_restart)(); +}; + +struct power_state { + struct powerdomain *pwrdm; + u32 next_state; + u32 saved_state; + struct list_head node; +}; + +struct power_state___2 { + struct powerdomain *pwrdm; + u32 next_state; + u32 next_logic_state; + u32 saved_state; + u32 saved_logic_state; + struct list_head node; +}; + +struct static_dep_map { + const char *from; + const char *to; +}; + +struct am33xx_pm_sram_addr { + void (*do_wfi)(); + long unsigned int *do_wfi_sz; + long unsigned int *resume_offset; + long unsigned int *emif_sram_table; + long unsigned int *ro_sram_data; + long unsigned int resume_address; +}; + +struct am33xx_pm_platform_data { + int (*init)(int (*)(u32)); + int (*deinit)(); + int (*soc_suspend)(unsigned int, int (*)(long unsigned int), long unsigned int); + int (*cpu_suspend)(int (*)(long unsigned int), long unsigned int); + void (*begin_suspend)(); + void (*finish_suspend)(); + struct am33xx_pm_sram_addr * (*get_sram_addrs)(); + void (*save_context)(); + void (*restore_context)(); + int (*check_off_mode_enable)(); +}; + +struct cpuidle_ops { + int (*suspend)(long unsigned int); + int (*init)(struct device_node *, int); +}; + +struct of_cpuidle_method { + const char *method; + const struct cpuidle_ops *ops; +}; + +struct amx3_idle_state { + int wfi_flags; +}; + +enum sr_instance { + OMAP_SR_MPU = 0, + OMAP_SR_CORE = 1, + OMAP_SR_IVA = 2, + OMAP_SR_NR = 3, +}; + +struct omap_sr_nvalue_table { + u32 efuse_offs; + u32 nvalue; + u32 errminlimit; + long unsigned int volt_nominal; +}; + +struct omap_smartreflex_dev_attr { + const char *sensor_voltdm_name; +}; + +struct omap_sr_data { + const char *name; + int ip_type; + u32 senp_mod; + u32 senn_mod; + u32 err_weight; + u32 err_maxlimit; + u32 accum_data; + u32 senn_avgweight; + u32 senp_avgweight; + int nvalue_count; + bool enable_on_init; + struct omap_sr_nvalue_table *nvalue_table; + struct voltagedomain *voltdm; +}; + +struct omap_sr { + char *name; + struct list_head node; + struct platform_device *pdev; + struct omap_sr_nvalue_table *nvalue_table; + struct voltagedomain *voltdm; + struct dentry *dbg_dir; + unsigned int irq; + struct clk *fck; + int srid; + int ip_type; + int nvalue_count; + bool autocomp_active; + u32 clk_length; + u32 err_weight; + u32 err_minlimit; + u32 err_maxlimit; + u32 accum_data; + u32 senn_avgweight; + u32 senp_avgweight; + u32 senp_mod; + u32 senn_mod; + void *base; + long unsigned int enabled: 1; +}; + +struct omap_sr_class_data { + int (*enable)(struct omap_sr *); + int (*disable)(struct omap_sr *, int); + int (*configure)(struct omap_sr *); + int (*notify)(struct omap_sr *, u32); + u8 notify_flags; + u8 class_type; +}; + +struct omap_prcm_irq { + const char *name; + unsigned int offset; + bool priority; +}; + +struct omap_prcm_irq_setup { + u16 ack; + u16 mask; + u16 pm_ctrl; + u8 nr_regs; + u8 nr_irqs; + const struct omap_prcm_irq *irqs; + int irq; + void (*read_pending_irqs)(long unsigned int *); + void (*ocp_barrier)(); + void (*save_and_clear_irqen)(u32 *); + void (*restore_irqen)(u32 *); + void (*reconfigure_io_chain)(); + u32 *saved_mask; + u32 *priority_mask; + int base_irq; + bool suspended; + bool suspend_save_flag; +}; + +struct prm_ll_data { + u32 (*read_reset_sources)(); + bool (*was_any_context_lost_old)(u8, s16, u16); + void (*clear_context_loss_flags_old)(u8, s16, u16); + int (*late_init)(); + int (*assert_hardreset)(u8, u8, s16, u16); + int (*deassert_hardreset)(u8, u8, u8, s16, u16, u16); + int (*is_hardreset_asserted)(u8, u8, s16, u16); + void (*reset_system)(); + int (*clear_mod_irqs)(s16, u8, u32); + u32 (*vp_check_txdone)(u8); + void (*vp_clear_txdone)(u8); +}; + +struct cm_ll_data { + int (*split_idlest_reg)(struct clk_omap_reg *, s16 *, u8 *); + int (*wait_module_ready)(u8, s16, u16, u8); + int (*wait_module_idle)(u8, s16, u16, u8); + void (*module_enable)(u8, u8, u16, u16); + void (*module_disable)(u8, u16, u16); + u32 (*xlate_clkctrl)(u8, u16, u16); +}; + +typedef void (*exitcall_t)(); + +struct pwrdm_ops { + int (*pwrdm_set_next_pwrst)(struct powerdomain *, u8); + int (*pwrdm_read_next_pwrst)(struct powerdomain *); + int (*pwrdm_read_pwrst)(struct powerdomain *); + int (*pwrdm_read_prev_pwrst)(struct powerdomain *); + int (*pwrdm_set_logic_retst)(struct powerdomain *, u8); + int (*pwrdm_set_mem_onst)(struct powerdomain *, u8, u8); + int (*pwrdm_set_mem_retst)(struct powerdomain *, u8, u8); + int (*pwrdm_read_logic_pwrst)(struct powerdomain *); + int (*pwrdm_read_prev_logic_pwrst)(struct powerdomain *); + int (*pwrdm_read_logic_retst)(struct powerdomain *); + int (*pwrdm_read_mem_pwrst)(struct powerdomain *, u8); + int (*pwrdm_read_prev_mem_pwrst)(struct powerdomain *, u8); + int (*pwrdm_read_mem_retst)(struct powerdomain *, u8); + int (*pwrdm_clear_all_prev_pwrst)(struct powerdomain *); + int (*pwrdm_enable_hdwr_sar)(struct powerdomain *); + int (*pwrdm_disable_hdwr_sar)(struct powerdomain *); + int (*pwrdm_set_lowpwrstchange)(struct powerdomain *); + int (*pwrdm_wait_transition)(struct powerdomain *); + int (*pwrdm_has_voltdm)(); + void (*pwrdm_save_context)(struct powerdomain *); + void (*pwrdm_restore_context)(struct powerdomain *); +}; + +struct prm_reset_src_map { + s8 reg_shift; + s8 std_shift; +}; + +struct omap3_vp { + u32 tranxdone_status; +}; + +struct clkdm_ops { + int (*clkdm_add_wkdep)(struct clockdomain *, struct clockdomain *); + int (*clkdm_del_wkdep)(struct clockdomain *, struct clockdomain *); + int (*clkdm_read_wkdep)(struct clockdomain *, struct clockdomain *); + int (*clkdm_clear_all_wkdeps)(struct clockdomain *); + int (*clkdm_add_sleepdep)(struct clockdomain *, struct clockdomain *); + int (*clkdm_del_sleepdep)(struct clockdomain *, struct clockdomain *); + int (*clkdm_read_sleepdep)(struct clockdomain *, struct clockdomain *); + int (*clkdm_clear_all_sleepdeps)(struct clockdomain *); + int (*clkdm_sleep)(struct clockdomain *); + int (*clkdm_wakeup)(struct clockdomain *); + void (*clkdm_allow_idle)(struct clockdomain *); + void (*clkdm_deny_idle)(struct clockdomain *); + int (*clkdm_clk_enable)(struct clockdomain *); + int (*clkdm_clk_disable)(struct clockdomain *); + int (*clkdm_save_context)(struct clockdomain *); + int (*clkdm_restore_context)(struct clockdomain *); +}; + +struct omap3_cm_regs { + u32 iva2_cm_clksel1; + u32 iva2_cm_clksel2; + u32 cm_sysconfig; + u32 sgx_cm_clksel; + u32 dss_cm_clksel; + u32 cam_cm_clksel; + u32 per_cm_clksel; + u32 emu_cm_clksel; + u32 emu_cm_clkstctrl; + u32 pll_cm_autoidle; + u32 pll_cm_autoidle2; + u32 pll_cm_clksel4; + u32 pll_cm_clksel5; + u32 pll_cm_clken2; + u32 cm_polctrl; + u32 iva2_cm_fclken; + u32 iva2_cm_clken_pll; + u32 core_cm_fclken1; + u32 core_cm_fclken3; + u32 sgx_cm_fclken; + u32 wkup_cm_fclken; + u32 dss_cm_fclken; + u32 cam_cm_fclken; + u32 per_cm_fclken; + u32 usbhost_cm_fclken; + u32 core_cm_iclken1; + u32 core_cm_iclken2; + u32 core_cm_iclken3; + u32 sgx_cm_iclken; + u32 wkup_cm_iclken; + u32 dss_cm_iclken; + u32 cam_cm_iclken; + u32 per_cm_iclken; + u32 usbhost_cm_iclken; + u32 iva2_cm_autoidle2; + u32 mpu_cm_autoidle2; + u32 iva2_cm_clkstctrl; + u32 mpu_cm_clkstctrl; + u32 core_cm_clkstctrl; + u32 sgx_cm_clkstctrl; + u32 dss_cm_clkstctrl; + u32 cam_cm_clkstctrl; + u32 per_cm_clkstctrl; + u32 neon_cm_clkstctrl; + u32 usbhost_cm_clkstctrl; + u32 core_cm_autoidle1; + u32 core_cm_autoidle2; + u32 core_cm_autoidle3; + u32 wkup_cm_autoidle; + u32 dss_cm_autoidle; + u32 cam_cm_autoidle; + u32 per_cm_autoidle; + u32 usbhost_cm_autoidle; + u32 sgx_cm_sleepdep; + u32 dss_cm_sleepdep; + u32 cam_cm_sleepdep; + u32 per_cm_sleepdep; + u32 usbhost_cm_sleepdep; + u32 cm_clkout_ctrl; +}; + +struct omap_prm_irq_context { + long unsigned int irq_enable; + long unsigned int pm_ctrl; +}; + +struct omap4_vp { + u32 irqstatus_mpu; + u32 tranxdone_status; +}; + +struct omap_vc_channel_cfg { + u8 sa; + u8 rav; + u8 rac; + u8 racen; + u8 cmd; +}; + +struct omap3_vc_timings { + u32 voltsetup1; + u32 voltsetup2; +}; + +struct omap3_vc { + struct voltagedomain *vd; + u32 voltctrl; + u32 voltsetup1; + u32 voltsetup2; + struct omap3_vc_timings timings[2]; +}; + +struct i2c_init_data { + u8 loadbits; + u8 load; + u8 hsscll_38_4; + u8 hsscll_26; + u8 hsscll_19_2; + u8 hsscll_16_8; + u8 hsscll_12; +}; + +enum { + PWRDM_STATE_NOW = 0, + PWRDM_STATE_PREV = 1, +}; + +struct clkdm_autodep { + union { + const char *name; + struct clockdomain *ptr; + } clkdm; +}; + +struct omap_hwmod; + +struct ti_clk_ll_ops { + u32 (*clk_readl)(const struct clk_omap_reg *); + void (*clk_writel)(u32, const struct clk_omap_reg *); + void (*clk_rmw)(u32, u32, const struct clk_omap_reg *); + int (*clkdm_clk_enable)(struct clockdomain *, struct clk *); + int (*clkdm_clk_disable)(struct clockdomain *, struct clk *); + struct clockdomain * (*clkdm_lookup)(const char *); + int (*cm_wait_module_ready)(u8, s16, u16, u8); + int (*cm_split_idlest_reg)(struct clk_omap_reg *, s16 *, u8 *); +}; + +struct ti_clk_features { + u32 flags; + long int fint_min; + long int fint_max; + long int fint_band1_max; + long int fint_band2_min; + u8 dpll_bypass_vals; + u8 cm_idlest_val; +}; + +struct omap_hsmmc_dev_attr { + u8 flags; +}; + +struct emac_platform_data { + char mac_addr[6]; + u32 ctrl_reg_offset; + u32 ctrl_mod_reg_offset; + u32 ctrl_ram_offset; + u32 hw_ram_addr; + u32 ctrl_ram_size; + const char *phy_id; + u8 rmii_en; + u8 version; + bool no_bd_ram; + void (*interrupt_enable)(); + void (*interrupt_disable)(); +}; + +struct gpio { + unsigned int gpio; + long unsigned int flags; + const char *label; +}; + +enum blk_crypto_mode_num { + BLK_ENCRYPTION_MODE_INVALID = 0, + BLK_ENCRYPTION_MODE_AES_256_XTS = 1, + BLK_ENCRYPTION_MODE_AES_128_CBC_ESSIV = 2, + BLK_ENCRYPTION_MODE_ADIANTUM = 3, + BLK_ENCRYPTION_MODE_SM4_XTS = 4, + BLK_ENCRYPTION_MODE_MAX = 5, +}; + +enum mmc_err_stat { + MMC_ERR_CMD_TIMEOUT = 0, + MMC_ERR_CMD_CRC = 1, + MMC_ERR_DAT_TIMEOUT = 2, + MMC_ERR_DAT_CRC = 3, + MMC_ERR_AUTO_CMD = 4, + MMC_ERR_ADMA = 5, + MMC_ERR_TUNING = 6, + MMC_ERR_CMDQ_RED = 7, + MMC_ERR_CMDQ_GCE = 8, + MMC_ERR_CMDQ_ICCE = 9, + MMC_ERR_REQ_TIMEOUT = 10, + MMC_ERR_CMDQ_REQ_TIMEOUT = 11, + MMC_ERR_ICE_CFG = 12, + MMC_ERR_CTRL_TIMEOUT = 13, + MMC_ERR_UNEXPECTED_IRQ = 14, + MMC_ERR_MAX = 15, +}; + +struct pcs_pdata { + int irq; + void (*rearm)(); +}; + +struct omap_hsmmc_platform_data { + struct device *dev; + unsigned int max_freq; + u8 controller_flags; + u16 reg_offset; + u32 caps; + u32 pm_caps; + unsigned int nonremovable: 1; + unsigned int no_regulator_off_init: 1; + unsigned int features; + char *version; + const char *name; + u32 ocr_mask; +}; + +struct iommu_platform_data { + const char *reset_name; + int (*assert_reset)(struct platform_device *, const char *); + int (*deassert_reset)(struct platform_device *, const char *); + int (*device_enable)(struct platform_device *); + int (*device_idle)(struct platform_device *); + int (*set_pwrdm_constraint)(struct platform_device *, bool, u8 *); +}; + +struct ti_sysc_platform_data { + struct of_dev_auxdata *auxdata; + bool (*soc_type_gp)(); + int (*init_clockdomain)(struct device *, struct clk *, struct clk *, struct ti_sysc_cookie *); + void (*clkdm_deny_idle)(struct device *, const struct ti_sysc_cookie *); + void (*clkdm_allow_idle)(struct device *, const struct ti_sysc_cookie *); + int (*init_module)(struct device *, const struct ti_sysc_module_data *, struct ti_sysc_cookie *); + int (*enable_module)(struct device *, const struct ti_sysc_cookie *); + int (*idle_module)(struct device *, const struct ti_sysc_cookie *); + int (*shutdown_module)(struct device *, const struct ti_sysc_cookie *); +}; + +struct ti_prm_platform_data { + void (*clkdm_deny_idle)(struct clockdomain *); + void (*clkdm_allow_idle)(struct clockdomain *); + struct clockdomain * (*clkdm_lookup)(const char *); +}; + +struct twl4030_gpio_platform_data { + bool use_leds; + u8 mmc_cd; + u32 debounce; + u32 pullups; + u32 pulldowns; + int (*setup)(struct device *, unsigned int, unsigned int); +}; + +struct omap_system_dma_plat_info; + +struct pdata_init { + const char *compatible; + void (*fn)(); +}; + +struct omap_sdrc_params; + +enum musb_mode { + MUSB_UNDEFINED = 0, + MUSB_HOST = 1, + MUSB_PERIPHERAL = 2, + MUSB_OTG = 3, +}; + +struct pwrdm_link { + struct device *dev; + struct powerdomain *pwrdm; + struct list_head node; +}; + +enum rk3288_pwr_mode_con { + PMU_PWR_MODE_EN = 0, + PMU_CLK_CORE_SRC_GATE_EN = 1, + PMU_GLOBAL_INT_DISABLE = 2, + PMU_L2FLUSH_EN = 3, + PMU_BUS_PD_EN = 4, + PMU_A12_0_PD_EN = 5, + PMU_SCU_EN = 6, + PMU_PLL_PD_EN = 7, + PMU_CHIP_PD_EN = 8, + PMU_PWROFF_COMB = 9, + PMU_ALIVE_USE_LF = 10, + PMU_PMU_USE_LF = 11, + PMU_OSC_24M_DIS = 12, + PMU_INPUT_CLAMP_EN = 13, + PMU_WAKEUP_RESET_EN = 14, + PMU_SREF0_ENTER_EN = 15, + PMU_SREF1_ENTER_EN = 16, + PMU_DDR0IO_RET_EN = 17, + PMU_DDR1IO_RET_EN = 18, + PMU_DDR0_GATING_EN = 19, + PMU_DDR1_GATING_EN = 20, + PMU_DDR0IO_RET_DE_REQ = 21, + PMU_DDR1IO_RET_DE_REQ = 22, +}; + +enum rk3288_pwr_mode_con1 { + PMU_CLR_BUS = 0, + PMU_CLR_CORE = 1, + PMU_CLR_CPUP = 2, + PMU_CLR_ALIVE = 3, + PMU_CLR_DMA = 4, + PMU_CLR_PERI = 5, + PMU_CLR_GPU = 6, + PMU_CLR_VIDEO = 7, + PMU_CLR_HEVC = 8, + PMU_CLR_VIO = 9, +}; + +enum { + ROCKCHIP_ARM_OFF_LOGIC_NORMAL = 0, + ROCKCHIP_ARM_OFF_LOGIC_DEEP = 1, +}; + +struct rockchip_pm_data { + const struct platform_suspend_ops *ops; + int (*init)(struct device_node *); +}; + +enum regcache_type { + REGCACHE_NONE = 0, + REGCACHE_RBTREE = 1, + REGCACHE_COMPRESSED = 2, + REGCACHE_FLAT = 3, +}; + +struct reg_default { + unsigned int reg; + unsigned int def; +}; + +enum regmap_endian { + REGMAP_ENDIAN_DEFAULT = 0, + REGMAP_ENDIAN_BIG = 1, + REGMAP_ENDIAN_LITTLE = 2, + REGMAP_ENDIAN_NATIVE = 3, +}; + +struct regmap_range { + unsigned int range_min; + unsigned int range_max; +}; + +struct regmap_access_table { + const struct regmap_range *yes_ranges; + unsigned int n_yes_ranges; + const struct regmap_range *no_ranges; + unsigned int n_no_ranges; +}; + +typedef void (*regmap_lock)(void *); + +typedef void (*regmap_unlock)(void *); + +struct regmap_range_cfg; + +struct regmap_config { + const char *name; + int reg_bits; + int reg_stride; + int reg_downshift; + unsigned int reg_base; + int pad_bits; + int val_bits; + bool (*writeable_reg)(struct device *, unsigned int); + bool (*readable_reg)(struct device *, unsigned int); + bool (*volatile_reg)(struct device *, unsigned int); + bool (*precious_reg)(struct device *, unsigned int); + bool (*writeable_noinc_reg)(struct device *, unsigned int); + bool (*readable_noinc_reg)(struct device *, unsigned int); + bool disable_locking; + regmap_lock lock; + regmap_unlock unlock; + void *lock_arg; + int (*reg_read)(void *, unsigned int, unsigned int *); + int (*reg_write)(void *, unsigned int, unsigned int); + int (*reg_update_bits)(void *, unsigned int, unsigned int, unsigned int); + int (*read)(void *, const void *, size_t, void *, size_t); + int (*write)(void *, const void *, size_t); + size_t max_raw_read; + size_t max_raw_write; + bool fast_io; + bool io_port; + unsigned int max_register; + const struct regmap_access_table *wr_table; + const struct regmap_access_table *rd_table; + const struct regmap_access_table *volatile_table; + const struct regmap_access_table *precious_table; + const struct regmap_access_table *wr_noinc_table; + const struct regmap_access_table *rd_noinc_table; + const struct reg_default *reg_defaults; + unsigned int num_reg_defaults; + enum regcache_type cache_type; + const void *reg_defaults_raw; + unsigned int num_reg_defaults_raw; + long unsigned int read_flag_mask; + long unsigned int write_flag_mask; + bool zero_flag_mask; + bool use_single_read; + bool use_single_write; + bool use_relaxed_mmio; + bool can_multi_write; + enum regmap_endian reg_format_endian; + enum regmap_endian val_format_endian; + const struct regmap_range_cfg *ranges; + unsigned int num_ranges; + bool use_hwlock; + bool use_raw_spinlock; + unsigned int hwlock_id; + unsigned int hwlock_mode; + bool can_sleep; +}; + +struct regmap_range_cfg { + const char *name; + unsigned int range_min; + unsigned int range_max; + unsigned int selector_reg; + unsigned int selector_mask; + int selector_shift; + unsigned int window_start; + unsigned int window_len; +}; + +struct sunxi_mc_smp_nodes { + struct device_node *prcm_node; + struct device_node *cpucfg_node; + struct device_node *sram_node; + struct device_node *r_cpucfg_node; +}; + +struct sunxi_mc_smp_data { + const char *enable_method; + int (*get_smp_nodes)(struct sunxi_mc_smp_nodes *); + bool is_a83t; +}; + +struct tegra_cpu_car_ops { + void (*wait_for_reset)(u32); + void (*put_in_reset)(u32); + void (*out_of_reset)(u32); + void (*enable_clock)(u32); + void (*disable_clock)(u32); + bool (*rail_off_ready)(); + void (*suspend)(); + void (*resume)(); +}; + +enum tegra_suspend_mode { + TEGRA_SUSPEND_NONE = 0, + TEGRA_SUSPEND_LP2 = 1, + TEGRA_SUSPEND_LP1 = 2, + TEGRA_SUSPEND_LP0 = 3, + TEGRA_MAX_SUSPEND_MODE = 4, + TEGRA_SUSPEND_NOT_READY = 5, +}; + +struct tegra_lp1_iram { + void *start_addr; + void *end_addr; +}; + +struct serial_icounter_struct { + int cts; + int dsr; + int rng; + int dcd; + int rx; + int tx; + int frame; + int overrun; + int parity; + int brk; + int buf_overrun; + int reserved[9]; +}; + +struct serial_struct { + int type; + int line; + unsigned int port; + int irq; + int flags; + int xmit_fifo_size; + int custom_divisor; + int baud_base; + short unsigned int close_delay; + char io_type; + char reserved_char[1]; + int hub6; + short unsigned int closing_wait; + short unsigned int closing_wait2; + unsigned char *iomem_base; + short unsigned int iomem_reg_shift; + unsigned int port_high; + long unsigned int iomap_base; +}; + +struct trusted_foundations_platform_data { + unsigned int version_major; + unsigned int version_minor; +}; + +typedef void (*rcu_callback_t)(struct callback_head *); + +struct maple_alloc { + long unsigned int total; + unsigned char node_count; + unsigned int request_count; + struct maple_alloc *slot[61]; +}; + +struct maple_enode; + +struct ma_state { + struct maple_tree *tree; + long unsigned int index; + long unsigned int last; + struct maple_enode *node; + long unsigned int min; + long unsigned int max; + struct maple_alloc *alloc; + unsigned char depth; + unsigned char offset; + unsigned char mas_flags; +}; + +enum tk_offsets { + TK_OFFS_REAL = 0, + TK_OFFS_BOOT = 1, + TK_OFFS_TAI = 2, + TK_OFFS_MAX = 3, +}; + +enum { + WORK_STRUCT_PENDING_BIT = 0, + WORK_STRUCT_INACTIVE_BIT = 1, + WORK_STRUCT_PWQ_BIT = 2, + WORK_STRUCT_LINKED_BIT = 3, + WORK_STRUCT_COLOR_SHIFT = 4, + WORK_STRUCT_COLOR_BITS = 4, + WORK_STRUCT_PENDING = 1, + WORK_STRUCT_INACTIVE = 2, + WORK_STRUCT_PWQ = 4, + WORK_STRUCT_LINKED = 8, + WORK_STRUCT_STATIC = 0, + WORK_NR_COLORS = 16, + WORK_CPU_UNBOUND = 8, + WORK_STRUCT_FLAG_BITS = 8, + WORK_OFFQ_FLAG_BASE = 4, + __WORK_OFFQ_CANCELING = 4, + WORK_OFFQ_CANCELING = 16, + WORK_OFFQ_FLAG_BITS = 1, + WORK_OFFQ_POOL_SHIFT = 5, + WORK_OFFQ_LEFT = 27, + WORK_OFFQ_POOL_BITS = 27, + WORK_OFFQ_POOL_NONE = 134217727, + WORK_STRUCT_FLAG_MASK = 255, + WORK_STRUCT_WQ_DATA_MASK = 4294967040, + WORK_STRUCT_NO_POOL = 4294967264, + WORK_BUSY_PENDING = 1, + WORK_BUSY_RUNNING = 2, + WORKER_DESC_LEN = 24, +}; + +typedef long unsigned int vm_flags_t; + +struct vma_iterator { + struct ma_state mas; +}; + +struct clone_args { + __u64 flags; + __u64 pidfd; + __u64 child_tid; + __u64 parent_tid; + __u64 exit_signal; + __u64 stack; + __u64 stack_size; + __u64 tls; + __u64 set_tid; + __u64 set_tid_size; + __u64 cgroup; +}; + +struct fdtable { + unsigned int max_fds; + struct file **fd; + long unsigned int *close_on_exec; + long unsigned int *open_fds; + long unsigned int *full_fds_bits; + struct callback_head rcu; +}; + +struct files_struct { + atomic_t count; + bool resize_in_progress; + wait_queue_head_t resize_wait; + struct fdtable *fdt; + struct fdtable fdtab; + long: 32; + long: 32; + long: 32; + spinlock_t file_lock; + unsigned int next_fd; + long unsigned int close_on_exec_init[1]; + long unsigned int open_fds_init[1]; + long unsigned int full_fds_bits_init[1]; + struct file *fd_array[32]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct robust_list { + struct robust_list *next; +}; + +struct robust_list_head { + struct robust_list list; + long int futex_offset; + struct robust_list *list_op_pending; +}; + +struct multiprocess_signals { + sigset_t signal; + struct hlist_node node; +}; + +typedef int (*proc_visitor)(struct task_struct *, void *); + +struct io_uring_cmd { + struct file *file; + const void *cmd; + union { + void (*task_work_cb)(struct io_uring_cmd *); + void *cookie; + }; + u32 cmd_op; + u32 flags; + u8 pdu[32]; +}; + +struct mempolicy {}; + +typedef struct poll_table_struct poll_table; + +struct syscall_metadata { + const char *name; + int syscall_nr; + int nb_args; + const char **types; + const char **args; + struct list_head enter_fields; + struct trace_event_call *enter_event; + struct trace_event_call *exit_event; +}; + +enum { + FUTEX_STATE_OK = 0, + FUTEX_STATE_EXITING = 1, + FUTEX_STATE_DEAD = 2, +}; + +enum proc_hidepid { + HIDEPID_OFF = 0, + HIDEPID_NO_ACCESS = 1, + HIDEPID_INVISIBLE = 2, + HIDEPID_NOT_PTRACEABLE = 4, +}; + +enum proc_pidonly { + PROC_PIDONLY_OFF = 0, + PROC_PIDONLY_ON = 1, +}; + +struct proc_fs_info { + struct pid_namespace *pid_ns; + struct dentry *proc_self; + struct dentry *proc_thread_self; + kgid_t pid_gid; + enum proc_hidepid hide_pid; + enum proc_pidonly pidonly; +}; + +struct trace_event_raw_task_newtask { + struct trace_entry ent; + pid_t pid; + char comm[16]; + long unsigned int clone_flags; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_task_rename { + struct trace_entry ent; + pid_t pid; + char oldcomm[16]; + char newcomm[16]; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_data_offsets_task_newtask {}; + +struct trace_event_data_offsets_task_rename {}; + +typedef void (*btf_trace_task_newtask)(void *, struct task_struct *, long unsigned int); + +typedef void (*btf_trace_task_rename)(void *, struct task_struct *, const char *); + +struct vm_stack { + struct callback_head rcu; + struct vm_struct *stack_vm_area; +}; + +struct taint_flag { + char c_true; + char c_false; + bool module; +}; + +enum ftrace_dump_mode { + DUMP_NONE = 0, + DUMP_ALL = 1, + DUMP_ORIG = 2, +}; + +struct kobj_attribute { + struct attribute attr; + ssize_t (*show)(struct kobject *, struct kobj_attribute *, char *); + ssize_t (*store)(struct kobject *, struct kobj_attribute *, const char *, size_t); +}; + +enum kmsg_dump_reason { + KMSG_DUMP_UNDEF = 0, + KMSG_DUMP_PANIC = 1, + KMSG_DUMP_OOPS = 2, + KMSG_DUMP_EMERG = 3, + KMSG_DUMP_SHUTDOWN = 4, + KMSG_DUMP_MAX = 5, +}; + +enum con_flush_mode { + CONSOLE_FLUSH_PENDING = 0, + CONSOLE_REPLAY_ALL = 1, +}; + +enum error_detector { + ERROR_DETECTOR_KFENCE = 0, + ERROR_DETECTOR_KASAN = 1, + ERROR_DETECTOR_WARN = 2, +}; + +struct warn_args { + const char *fmt; + va_list args; +}; + +enum hk_type { + HK_TYPE_TIMER = 0, + HK_TYPE_RCU = 1, + HK_TYPE_MISC = 2, + HK_TYPE_SCHED = 3, + HK_TYPE_TICK = 4, + HK_TYPE_DOMAIN = 5, + HK_TYPE_WQ = 6, + HK_TYPE_MANAGED_IRQ = 7, + HK_TYPE_KTHREAD = 8, + HK_TYPE_MAX = 9, +}; + +enum cpuhp_smt_control { + CPU_SMT_ENABLED = 0, + CPU_SMT_DISABLED = 1, + CPU_SMT_FORCE_DISABLED = 2, + CPU_SMT_NOT_SUPPORTED = 3, + CPU_SMT_NOT_IMPLEMENTED = 4, +}; + +struct smp_hotplug_thread { + struct task_struct **store; + struct list_head list; + int (*thread_should_run)(unsigned int); + void (*thread_fn)(unsigned int); + void (*create)(unsigned int); + void (*setup)(unsigned int); + void (*cleanup)(unsigned int, bool); + void (*park)(unsigned int); + void (*unpark)(unsigned int); + bool selfparking; + const char *thread_comm; +}; + +enum cc_attr { + CC_ATTR_MEM_ENCRYPT = 0, + CC_ATTR_HOST_MEM_ENCRYPT = 1, + CC_ATTR_GUEST_MEM_ENCRYPT = 2, + CC_ATTR_GUEST_STATE_ENCRYPT = 3, + CC_ATTR_GUEST_UNROLL_STRING_IO = 4, + CC_ATTR_GUEST_SEV_SNP = 5, + CC_ATTR_HOTPLUG_DISABLED = 6, +}; + +struct trace_event_raw_cpuhp_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_multi_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_exit { + struct trace_entry ent; + unsigned int cpu; + int state; + int idx; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_cpuhp_enter {}; + +struct trace_event_data_offsets_cpuhp_multi_enter {}; + +struct trace_event_data_offsets_cpuhp_exit {}; + +typedef void (*btf_trace_cpuhp_enter)(void *, unsigned int, int, int, int (*)(unsigned int)); + +typedef void (*btf_trace_cpuhp_multi_enter)(void *, unsigned int, int, int, int (*)(unsigned int, struct hlist_node *), struct hlist_node *); + +typedef void (*btf_trace_cpuhp_exit)(void *, unsigned int, int, int, int); + +struct cpuhp_cpu_state { + enum cpuhp_state state; + enum cpuhp_state target; + enum cpuhp_state fail; + struct task_struct *thread; + bool should_run; + bool rollback; + bool single; + bool bringup; + struct hlist_node *node; + struct hlist_node *last; + enum cpuhp_state cb_state; + int result; + struct completion done_up; + struct completion done_down; +}; + +struct cpuhp_step { + const char *name; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } startup; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } teardown; + struct hlist_head list; + bool cant_stop; + bool multi_instance; +}; + +enum cpu_mitigations { + CPU_MITIGATIONS_OFF = 0, + CPU_MITIGATIONS_AUTO = 1, + CPU_MITIGATIONS_AUTO_NOSMT = 2, +}; + +struct __kernel_old_timeval { + __kernel_long_t tv_sec; + __kernel_long_t tv_usec; +}; + +struct rusage { + struct __kernel_old_timeval ru_utime; + struct __kernel_old_timeval ru_stime; + __kernel_long_t ru_maxrss; + __kernel_long_t ru_ixrss; + __kernel_long_t ru_idrss; + __kernel_long_t ru_isrss; + __kernel_long_t ru_minflt; + __kernel_long_t ru_majflt; + __kernel_long_t ru_nswap; + __kernel_long_t ru_inblock; + __kernel_long_t ru_oublock; + __kernel_long_t ru_msgsnd; + __kernel_long_t ru_msgrcv; + __kernel_long_t ru_nsignals; + __kernel_long_t ru_nvcsw; + __kernel_long_t ru_nivcsw; +}; + +struct pipe_buffer; + +struct pipe_inode_info { + struct mutex mutex; + wait_queue_head_t rd_wait; + wait_queue_head_t wr_wait; + unsigned int head; + unsigned int tail; + unsigned int max_usage; + unsigned int ring_size; + unsigned int nr_accounted; + unsigned int readers; + unsigned int writers; + unsigned int files; + unsigned int r_counter; + unsigned int w_counter; + bool poll_usage; + struct page *tmp_page; + struct fasync_struct *fasync_readers; + struct fasync_struct *fasync_writers; + struct pipe_buffer *bufs; + struct user_struct *user; +}; + +struct pipe_buf_operations; + +struct pipe_buffer { + struct page *page; + unsigned int offset; + unsigned int len; + const struct pipe_buf_operations *ops; + unsigned int flags; + long unsigned int private; +}; + +struct pipe_buf_operations { + int (*confirm)(struct pipe_inode_info *, struct pipe_buffer *); + void (*release)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*get)(struct pipe_inode_info *, struct pipe_buffer *); +}; + +struct waitid_info { + pid_t pid; + uid_t uid; + int status; + int cause; +}; + +struct wait_opts { + enum pid_type wo_type; + int wo_flags; + struct pid *wo_pid; + struct waitid_info *wo_info; + int wo_stat; + struct rusage *wo_rusage; + wait_queue_entry_t child_wait; + int notask_error; +}; + +struct softirq_action { + void (*action)(struct softirq_action *); +}; + +struct tasklet_struct { + struct tasklet_struct *next; + long unsigned int state; + atomic_t count; + bool use_callback; + union { + void (*func)(long unsigned int); + void (*callback)(struct tasklet_struct *); + }; + long unsigned int data; +}; + +enum { + TASKLET_STATE_SCHED = 0, + TASKLET_STATE_RUN = 1, +}; + +struct kernel_stat { + long unsigned int irqs_sum; + unsigned int softirqs[10]; +}; + +struct trace_print_flags { + long unsigned int mask; + const char *name; +}; + +struct wait_bit_key { + void *flags; + int bit_nr; + long unsigned int timeout; +}; + +struct wait_bit_queue_entry { + struct wait_bit_key key; + struct wait_queue_entry wq_entry; +}; + +struct trace_event_raw_irq_handler_entry { + struct trace_entry ent; + int irq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_irq_handler_exit { + struct trace_entry ent; + int irq; + int ret; + char __data[0]; +}; + +struct trace_event_raw_softirq { + struct trace_entry ent; + unsigned int vec; + char __data[0]; +}; + +struct trace_event_data_offsets_irq_handler_entry { + u32 name; +}; + +struct trace_event_data_offsets_irq_handler_exit {}; + +struct trace_event_data_offsets_softirq {}; + +typedef void (*btf_trace_irq_handler_entry)(void *, int, struct irqaction *); + +typedef void (*btf_trace_irq_handler_exit)(void *, int, struct irqaction *, int); + +typedef void (*btf_trace_softirq_entry)(void *, unsigned int); + +typedef void (*btf_trace_softirq_exit)(void *, unsigned int); + +typedef void (*btf_trace_softirq_raise)(void *, unsigned int); + +struct tasklet_head { + struct tasklet_struct *head; + struct tasklet_struct **tail; +}; + +enum { + IORES_DESC_NONE = 0, + IORES_DESC_CRASH_KERNEL = 1, + IORES_DESC_ACPI_TABLES = 2, + IORES_DESC_ACPI_NV_STORAGE = 3, + IORES_DESC_PERSISTENT_MEMORY = 4, + IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5, + IORES_DESC_DEVICE_PRIVATE_MEMORY = 6, + IORES_DESC_RESERVED = 7, + IORES_DESC_SOFT_RESERVED = 8, + IORES_DESC_CXL = 9, +}; + +enum { + REGION_INTERSECTS = 0, + REGION_DISJOINT = 1, + REGION_MIXED = 2, +}; + +struct pseudo_fs_context { + const struct super_operations *ops; + const struct xattr_handler **xattr; + const struct dentry_operations *dops; + long unsigned int magic; +}; + +typedef void (*dr_release_t)(struct device *, void *); + +typedef int (*dr_match_t)(struct device *, void *, void *); + +struct resource_constraint { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t (*alignf)(void *, const struct resource *, resource_size_t, resource_size_t); + void *alignf_data; +}; + +enum { + MAX_IORES_LEVEL = 5, +}; + +struct region_devres { + struct resource *parent; + long: 32; + resource_size_t start; + resource_size_t n; +}; + +typedef __kernel_clock_t clock_t; + +struct sk_filter { + refcount_t refcnt; + struct callback_head rcu; + struct bpf_prog *prog; +}; + +enum sysctl_writes_mode { + SYSCTL_WRITES_LEGACY = 4294967295, + SYSCTL_WRITES_WARN = 0, + SYSCTL_WRITES_STRICT = 1, +}; + +struct do_proc_dointvec_minmax_conv_param { + int *min; + int *max; +}; + +struct do_proc_douintvec_minmax_conv_param { + unsigned int *min; + unsigned int *max; +}; + +struct __user_cap_header_struct { + __u32 version; + int pid; +}; + +typedef struct __user_cap_header_struct *cap_user_header_t; + +struct __user_cap_data_struct { + __u32 effective; + __u32 permitted; + __u32 inheritable; +}; + +typedef struct __user_cap_data_struct *cap_user_data_t; + +struct sigqueue { + struct list_head list; + int flags; + kernel_siginfo_t info; + struct ucounts *ucounts; +}; + +typedef int wait_bit_action_f(struct wait_bit_key *, int); + +struct ptrace_peeksiginfo_args { + __u64 off; + __u32 flags; + __s32 nr; +}; + +struct ptrace_syscall_info { + __u8 op; + __u8 pad[3]; + __u32 arch; + __u64 instruction_pointer; + __u64 stack_pointer; + union { + struct { + __u64 nr; + __u64 args[6]; + } entry; + struct { + __s64 rval; + __u8 is_error; + long: 32; + } exit; + struct { + __u64 nr; + __u64 args[6]; + __u32 ret_data; + long: 32; + } seccomp; + }; +}; + +struct ptrace_rseq_configuration { + __u64 rseq_abi_pointer; + __u32 rseq_abi_size; + __u32 signature; + __u32 flags; + __u32 pad; +}; + +typedef long unsigned int old_sigset_t; + +struct old_sigaction { + __sighandler_t sa_handler; + old_sigset_t sa_mask; + long unsigned int sa_flags; + __sigrestore_t sa_restorer; +}; + +enum siginfo_layout { + SIL_KILL = 0, + SIL_TIMER = 1, + SIL_POLL = 2, + SIL_FAULT = 3, + SIL_FAULT_TRAPNO = 4, + SIL_FAULT_MCEERR = 5, + SIL_FAULT_BNDERR = 6, + SIL_FAULT_PKUERR = 7, + SIL_FAULT_PERF_EVENT = 8, + SIL_CHLD = 9, + SIL_RT = 10, + SIL_SYS = 11, +}; + +struct fd { + struct file *file; + unsigned int flags; +}; + +struct core_vma_metadata; + +struct coredump_params { + const kernel_siginfo_t *siginfo; + struct file *file; + long unsigned int limit; + long unsigned int mm_flags; + int cpu; + long: 32; + loff_t written; + loff_t pos; + loff_t to_skip; + int vma_count; + size_t vma_data_size; + struct core_vma_metadata *vma_meta; + long: 32; +}; + +struct core_vma_metadata { + long unsigned int start; + long unsigned int end; + long unsigned int flags; + long unsigned int dump_size; + long unsigned int pgoff; + struct file *file; +}; + +enum { + TRACE_SIGNAL_DELIVERED = 0, + TRACE_SIGNAL_IGNORED = 1, + TRACE_SIGNAL_ALREADY_PENDING = 2, + TRACE_SIGNAL_OVERFLOW_FAIL = 3, + TRACE_SIGNAL_LOSE_INFO = 4, +}; + +struct trace_event_raw_signal_generate { + struct trace_entry ent; + int sig; + int errno; + int code; + char comm[16]; + pid_t pid; + int group; + int result; + char __data[0]; +}; + +struct trace_event_raw_signal_deliver { + struct trace_entry ent; + int sig; + int errno; + int code; + long unsigned int sa_handler; + long unsigned int sa_flags; + char __data[0]; +}; + +struct trace_event_data_offsets_signal_generate {}; + +struct trace_event_data_offsets_signal_deliver {}; + +typedef void (*btf_trace_signal_generate)(void *, int, struct kernel_siginfo *, struct task_struct *, int, int); + +typedef void (*btf_trace_signal_deliver)(void *, int, struct kernel_siginfo *, struct k_sigaction *); + +enum sig_handler { + HANDLER_CURRENT = 0, + HANDLER_SIG_DFL = 1, + HANDLER_EXIT = 2, +}; + +struct sysinfo { + __kernel_long_t uptime; + __kernel_ulong_t loads[3]; + __kernel_ulong_t totalram; + __kernel_ulong_t freeram; + __kernel_ulong_t sharedram; + __kernel_ulong_t bufferram; + __kernel_ulong_t totalswap; + __kernel_ulong_t freeswap; + __u16 procs; + __u16 pad; + __kernel_ulong_t totalhigh; + __kernel_ulong_t freehigh; + __u32 mem_unit; + char _f[8]; +}; + +struct rlimit64 { + __u64 rlim_cur; + __u64 rlim_max; +}; + +struct timens_offsets { + struct timespec64 monotonic; + struct timespec64 boottime; +}; + +struct time_namespace { + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; + struct timens_offsets offsets; + struct page *vvar_page; + bool frozen_offsets; +}; + +enum uts_proc { + UTS_PROC_ARCH = 0, + UTS_PROC_OSTYPE = 1, + UTS_PROC_OSRELEASE = 2, + UTS_PROC_VERSION = 3, + UTS_PROC_HOSTNAME = 4, + UTS_PROC_DOMAINNAME = 5, +}; + +struct prctl_mm_map { + __u64 start_code; + __u64 end_code; + __u64 start_data; + __u64 end_data; + __u64 start_brk; + __u64 brk; + __u64 start_stack; + __u64 arg_start; + __u64 arg_end; + __u64 env_start; + __u64 env_end; + __u64 *auxv; + __u32 auxv_size; + __u32 exe_fd; + long: 32; +}; + +struct tms { + __kernel_clock_t tms_utime; + __kernel_clock_t tms_stime; + __kernel_clock_t tms_cutime; + __kernel_clock_t tms_cstime; +}; + +struct getcpu_cache { + long unsigned int blob[32]; +}; + +struct wq_flusher; + +struct worker; + +struct workqueue_attrs; + +struct pool_workqueue; + +struct wq_device; + +struct workqueue_struct { + struct list_head pwqs; + struct list_head list; + struct mutex mutex; + int work_color; + int flush_color; + atomic_t nr_pwqs_to_flush; + struct wq_flusher *first_flusher; + struct list_head flusher_queue; + struct list_head flusher_overflow; + struct list_head maydays; + struct worker *rescuer; + int nr_drainers; + int saved_max_active; + struct workqueue_attrs *unbound_attrs; + struct pool_workqueue *dfl_pwq; + struct wq_device *wq_dev; + char name[24]; + struct callback_head rcu; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + unsigned int flags; + struct pool_workqueue *cpu_pwqs; + struct pool_workqueue *numa_pwq_tbl[0]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct workqueue_attrs { + int nice; + cpumask_var_t cpumask; + bool no_numa; +}; + +struct execute_work { + struct work_struct work; +}; + +enum { + WQ_UNBOUND = 2, + WQ_FREEZABLE = 4, + WQ_MEM_RECLAIM = 8, + WQ_HIGHPRI = 16, + WQ_CPU_INTENSIVE = 32, + WQ_SYSFS = 64, + WQ_POWER_EFFICIENT = 128, + __WQ_DRAINING = 65536, + __WQ_ORDERED = 131072, + __WQ_LEGACY = 262144, + __WQ_ORDERED_EXPLICIT = 524288, + WQ_MAX_ACTIVE = 512, + WQ_MAX_UNBOUND_PER_CPU = 4, + WQ_DFL_ACTIVE = 256, +}; + +enum kobject_action { + KOBJ_ADD = 0, + KOBJ_REMOVE = 1, + KOBJ_CHANGE = 2, + KOBJ_MOVE = 3, + KOBJ_ONLINE = 4, + KOBJ_OFFLINE = 5, + KOBJ_BIND = 6, + KOBJ_UNBIND = 7, +}; + +struct __una_u32 { + u32 x; +}; + +struct worker_pool; + +struct worker { + union { + struct list_head entry; + struct hlist_node hentry; + }; + struct work_struct *current_work; + work_func_t current_func; + struct pool_workqueue *current_pwq; + unsigned int current_color; + struct list_head scheduled; + struct task_struct *task; + struct worker_pool *pool; + struct list_head node; + long unsigned int last_active; + unsigned int flags; + int id; + int sleeping; + char desc[24]; + struct workqueue_struct *rescue_wq; + work_func_t last_func; +}; + +struct pool_workqueue { + struct worker_pool *pool; + struct workqueue_struct *wq; + int work_color; + int flush_color; + int refcnt; + int nr_in_flight[16]; + int nr_active; + int max_active; + struct list_head inactive_works; + struct list_head pwqs_node; + struct list_head mayday_node; + struct work_struct unbound_release_work; + struct callback_head rcu; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct worker_pool { + raw_spinlock_t lock; + int cpu; + int node; + int id; + unsigned int flags; + long unsigned int watchdog_ts; + int nr_running; + struct list_head worklist; + int nr_workers; + int nr_idle; + struct list_head idle_list; + struct timer_list idle_timer; + struct timer_list mayday_timer; + struct hlist_head busy_hash[64]; + struct worker *manager; + struct list_head workers; + struct completion *detach_completion; + struct ida worker_ida; + struct workqueue_attrs *attrs; + struct hlist_node hash_node; + int refcnt; + struct callback_head rcu; +}; + +enum { + POOL_MANAGER_ACTIVE = 1, + POOL_DISASSOCIATED = 4, + WORKER_DIE = 2, + WORKER_IDLE = 4, + WORKER_PREP = 8, + WORKER_CPU_INTENSIVE = 64, + WORKER_UNBOUND = 128, + WORKER_REBOUND = 256, + WORKER_NOT_RUNNING = 456, + NR_STD_WORKER_POOLS = 2, + UNBOUND_POOL_HASH_ORDER = 6, + BUSY_WORKER_HASH_ORDER = 6, + MAX_IDLE_WORKERS_RATIO = 4, + IDLE_WORKER_TIMEOUT = 75000, + MAYDAY_INITIAL_TIMEOUT = 2, + MAYDAY_INTERVAL = 25, + CREATE_COOLDOWN = 250, + RESCUER_NICE_LEVEL = 4294967276, + HIGHPRI_NICE_LEVEL = 4294967276, + WQ_NAME_LEN = 24, +}; + +struct wq_flusher { + struct list_head list; + int flush_color; + struct completion done; +}; + +struct wq_device { + struct workqueue_struct *wq; + long: 32; + struct device dev; +}; + +struct trace_event_raw_workqueue_queue_work { + struct trace_entry ent; + void *work; + void *function; + u32 __data_loc_workqueue; + int req_cpu; + int cpu; + char __data[0]; +}; + +struct trace_event_raw_workqueue_activate_work { + struct trace_entry ent; + void *work; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_data_offsets_workqueue_queue_work { + u32 workqueue; +}; + +struct trace_event_data_offsets_workqueue_activate_work {}; + +struct trace_event_data_offsets_workqueue_execute_start {}; + +struct trace_event_data_offsets_workqueue_execute_end {}; + +typedef void (*btf_trace_workqueue_queue_work)(void *, int, struct pool_workqueue *, struct work_struct *); + +typedef void (*btf_trace_workqueue_activate_work)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_execute_start)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_execute_end)(void *, struct work_struct *, work_func_t); + +struct wq_barrier { + struct work_struct work; + struct completion done; + struct task_struct *task; +}; + +struct cwt_wait { + wait_queue_entry_t wait; + struct work_struct *work; +}; + +struct apply_wqattrs_ctx { + struct workqueue_struct *wq; + struct workqueue_attrs *attrs; + struct list_head list; + struct pool_workqueue *dfl_pwq; + struct pool_workqueue *pwq_tbl[0]; +}; + +struct work_for_cpu { + struct work_struct work; + long int (*fn)(void *); + void *arg; + long int ret; +}; + +typedef struct {} local_lock_t; + +struct xa_node { + unsigned char shift; + unsigned char offset; + unsigned char count; + unsigned char nr_values; + struct xa_node *parent; + struct xarray *array; + union { + struct list_head private_list; + struct callback_head callback_head; + }; + void *slots[64]; + union { + long unsigned int tags[6]; + long unsigned int marks[6]; + }; +}; + +struct radix_tree_preload { + local_lock_t lock; + unsigned int nr; + struct xa_node *nodes; +}; + +typedef void (*task_work_func_t)(struct callback_head *); + +enum task_work_notify_mode { + TWA_NONE = 0, + TWA_RESUME = 1, + TWA_SIGNAL = 2, + TWA_SIGNAL_NO_IPI = 3, +}; + +enum { + KERNEL_PARAM_OPS_FL_NOARG = 1, +}; + +enum { + KERNEL_PARAM_FL_UNSAFE = 1, + KERNEL_PARAM_FL_HWPARAM = 2, +}; + +struct param_attribute { + struct module_attribute mattr; + const struct kernel_param *param; +}; + +struct module_param_attrs { + unsigned int num; + struct attribute_group grp; + struct param_attribute attrs[0]; +}; + +struct module_version_attribute { + struct module_attribute mattr; + const char *module_name; + const char *version; +}; + +enum lockdown_reason { + LOCKDOWN_NONE = 0, + LOCKDOWN_MODULE_SIGNATURE = 1, + LOCKDOWN_DEV_MEM = 2, + LOCKDOWN_EFI_TEST = 3, + LOCKDOWN_KEXEC = 4, + LOCKDOWN_HIBERNATION = 5, + LOCKDOWN_PCI_ACCESS = 6, + LOCKDOWN_IOPORT = 7, + LOCKDOWN_MSR = 8, + LOCKDOWN_ACPI_TABLES = 9, + LOCKDOWN_DEVICE_TREE = 10, + LOCKDOWN_PCMCIA_CIS = 11, + LOCKDOWN_TIOCSSERIAL = 12, + LOCKDOWN_MODULE_PARAMETERS = 13, + LOCKDOWN_MMIOTRACE = 14, + LOCKDOWN_DEBUGFS = 15, + LOCKDOWN_XMON_WR = 16, + LOCKDOWN_BPF_WRITE_USER = 17, + LOCKDOWN_DBG_WRITE_KERNEL = 18, + LOCKDOWN_RTAS_ERROR_INJECTION = 19, + LOCKDOWN_INTEGRITY_MAX = 20, + LOCKDOWN_KCORE = 21, + LOCKDOWN_KPROBES = 22, + LOCKDOWN_BPF_READ_KERNEL = 23, + LOCKDOWN_DBG_READ_KERNEL = 24, + LOCKDOWN_PERF = 25, + LOCKDOWN_TRACEFS = 26, + LOCKDOWN_XMON_RW = 27, + LOCKDOWN_XFRM_SECRET = 28, + LOCKDOWN_CONFIDENTIALITY_MAX = 29, +}; + +struct kmalloced_param { + struct list_head list; + char val[0]; +}; + +struct sched_param { + int sched_priority; +}; + +enum { + __PERCPU_REF_ATOMIC = 1, + __PERCPU_REF_DEAD = 2, + __PERCPU_REF_ATOMIC_DEAD = 3, + __PERCPU_REF_FLAG_BITS = 2, +}; + +struct kthread_work; + +typedef void (*kthread_work_func_t)(struct kthread_work *); + +struct kthread_worker; + +struct kthread_work { + struct list_head node; + kthread_work_func_t func; + struct kthread_worker *worker; + int canceling; +}; + +enum { + KTW_FREEZABLE = 1, +}; + +struct kthread_worker { + unsigned int flags; + raw_spinlock_t lock; + struct list_head work_list; + struct list_head delayed_work_list; + struct task_struct *task; + struct kthread_work *current_work; +}; + +struct kthread_delayed_work { + struct kthread_work work; + struct timer_list timer; +}; + +enum { + CSS_NO_REF = 1, + CSS_ONLINE = 2, + CSS_RELEASED = 4, + CSS_VISIBLE = 8, + CSS_DYING = 16, +}; + +struct kthread_create_info { + int (*threadfn)(void *); + void *data; + int node; + struct task_struct *result; + struct completion *done; + struct list_head list; +}; + +struct kthread { + long unsigned int flags; + unsigned int cpu; + int result; + int (*threadfn)(void *); + void *data; + struct completion parked; + struct completion exited; + struct cgroup_subsys_state *blkcg_css; + char *full_name; +}; + +enum KTHREAD_BITS { + KTHREAD_IS_PER_CPU = 0, + KTHREAD_SHOULD_STOP = 1, + KTHREAD_SHOULD_PARK = 2, +}; + +struct kthread_flush_work { + struct kthread_work work; + struct completion done; +}; + +struct ipc_ids { + int in_use; + short unsigned int seq; + struct rw_semaphore rwsem; + struct idr ipcs_idr; + int max_idx; + int last_idx; + int next_id; + struct rhashtable key_ht; +}; + +struct ipc_namespace { + struct ipc_ids ids[3]; + int sem_ctls[4]; + int used_sems; + unsigned int msg_ctlmax; + unsigned int msg_ctlmnb; + unsigned int msg_ctlmni; + struct percpu_counter percpu_msg_bytes; + struct percpu_counter percpu_msg_hdrs; + size_t shm_ctlmax; + size_t shm_ctlall; + long unsigned int shm_tot; + int shm_ctlmni; + int shm_rmid_forced; + struct notifier_block ipcns_nb; + struct vfsmount *mq_mnt; + unsigned int mq_queues_count; + unsigned int mq_queues_max; + unsigned int mq_msg_max; + unsigned int mq_msgsize_max; + unsigned int mq_msg_default; + unsigned int mq_msgsize_default; + struct ctl_table_set mq_set; + struct ctl_table_header *mq_sysctls; + struct ctl_table_set ipc_set; + struct ctl_table_header *ipc_sysctls; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct llist_node mnt_llist; + struct ns_common ns; +}; + +struct die_args { + struct pt_regs *regs; + const char *str; + long int err; + int trapnr; + int signr; +}; + +struct srcu_notifier_head { + struct mutex mutex; + struct srcu_struct srcu; + struct notifier_block *head; +}; + +enum what { + PROC_EVENT_NONE = 0, + PROC_EVENT_FORK = 1, + PROC_EVENT_EXEC = 2, + PROC_EVENT_UID = 4, + PROC_EVENT_GID = 64, + PROC_EVENT_SID = 128, + PROC_EVENT_PTRACE = 256, + PROC_EVENT_COMM = 512, + PROC_EVENT_COREDUMP = 1073741824, + PROC_EVENT_EXIT = 2147483648, +}; + +enum reboot_type { + BOOT_TRIPLE = 116, + BOOT_KBD = 107, + BOOT_BIOS = 98, + BOOT_ACPI = 97, + BOOT_EFI = 101, + BOOT_CF9_FORCE = 112, + BOOT_CF9_SAFE = 113, +}; + +enum sys_off_mode { + SYS_OFF_MODE_POWER_OFF_PREPARE = 0, + SYS_OFF_MODE_POWER_OFF = 1, + SYS_OFF_MODE_RESTART_PREPARE = 2, + SYS_OFF_MODE_RESTART = 3, +}; + +struct sys_off_data { + int mode; + void *cb_data; + const char *cmd; +}; + +struct sys_off_handler { + struct notifier_block nb; + int (*sys_off_cb)(struct sys_off_data *); + void *cb_data; + enum sys_off_mode mode; + bool blocking; + void *list; +}; + +struct async_entry { + struct list_head domain_list; + struct list_head global_list; + struct work_struct work; + async_cookie_t cookie; + async_func_t func; + void *data; + struct async_domain *domain; + long: 32; +}; + +struct smpboot_thread_data { + unsigned int cpu; + unsigned int status; + struct smp_hotplug_thread *ht; +}; + +enum { + HP_THREAD_NONE = 0, + HP_THREAD_ACTIVE = 1, + HP_THREAD_PARKED = 2, +}; + +struct pin_cookie {}; + +enum { + CSD_FLAG_LOCK = 1, + IRQ_WORK_PENDING = 1, + IRQ_WORK_BUSY = 2, + IRQ_WORK_LAZY = 4, + IRQ_WORK_HARD_IRQ = 8, + IRQ_WORK_CLAIMED = 3, + CSD_TYPE_ASYNC = 0, + CSD_TYPE_SYNC = 16, + CSD_TYPE_IRQ_WORK = 32, + CSD_TYPE_TTWU = 48, + CSD_FLAG_TYPE_MASK = 240, +}; + +struct __call_single_data { + struct __call_single_node node; + smp_call_func_t func; + void *info; +}; + +typedef struct __call_single_data call_single_data_t; + +typedef int (*task_call_f)(struct task_struct *, void *); + +struct dl_bw { + raw_spinlock_t lock; + long: 32; + u64 bw; + u64 total_bw; +}; + +struct cpudl_item; + +struct cpudl { + raw_spinlock_t lock; + int size; + cpumask_var_t free_cpus; + struct cpudl_item *elements; +}; + +struct cpupri_vec { + atomic_t count; + cpumask_var_t mask; +}; + +struct cpupri { + struct cpupri_vec pri_to_cpu[101]; + int *cpu_to_pri; +}; + +struct perf_domain; + +struct root_domain { + atomic_t refcount; + atomic_t rto_count; + struct callback_head rcu; + cpumask_var_t span; + cpumask_var_t online; + int overload; + int overutilized; + cpumask_var_t dlo_mask; + atomic_t dlo_count; + struct dl_bw dl_bw; + struct cpudl cpudl; + u64 visit_gen; + struct irq_work rto_push_work; + raw_spinlock_t rto_lock; + int rto_loop; + int rto_cpu; + atomic_t rto_loop_next; + atomic_t rto_loop_start; + cpumask_var_t rto_mask; + struct cpupri cpupri; + long unsigned int max_cpu_capacity; + struct perf_domain *pd; + long: 32; +}; + +struct cfs_rq { + struct load_weight load; + unsigned int nr_running; + unsigned int h_nr_running; + unsigned int idle_nr_running; + unsigned int idle_h_nr_running; + u64 exec_clock; + u64 min_vruntime; + u64 min_vruntime_copy; + struct rb_root_cached tasks_timeline; + struct sched_entity *curr; + struct sched_entity *next; + struct sched_entity *last; + struct sched_entity *skip; + unsigned int nr_spread_over; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct sched_avg avg; + u64 last_update_time_copy; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct { + raw_spinlock_t lock; + int nr; + long unsigned int load_avg; + long unsigned int util_avg; + long unsigned int runnable_avg; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + } removed; + long unsigned int tg_load_avg_contrib; + long int propagate; + long int prop_runnable_sum; + long unsigned int h_load; + u64 last_h_load_update; + struct sched_entity *h_load_next; + struct rq *rq; + int on_list; + struct list_head leaf_cfs_rq_list; + struct task_group *tg; + int idle; + int runtime_enabled; + s64 runtime_remaining; + u64 throttled_pelt_idle; + u64 throttled_pelt_idle_copy; + u64 throttled_clock; + u64 throttled_clock_pelt; + u64 throttled_clock_pelt_time; + int throttled; + int throttle_count; + struct list_head throttled_list; + long: 32; + long: 32; +}; + +struct cfs_bandwidth { + raw_spinlock_t lock; + long: 32; + ktime_t period; + u64 quota; + u64 runtime; + u64 burst; + u64 runtime_snap; + s64 hierarchical_quota; + u8 idle; + u8 period_active; + u8 slack_started; + long: 32; + struct hrtimer period_timer; + struct hrtimer slack_timer; + struct list_head throttled_cfs_rq; + int nr_periods; + int nr_throttled; + int nr_burst; + long: 32; + u64 throttled_time; + u64 burst_time; +}; + +struct task_group { + struct cgroup_subsys_state css; + struct sched_entity **se; + struct cfs_rq **cfs_rq; + long unsigned int shares; + int idle; + atomic_long_t load_avg; + struct callback_head rcu; + struct list_head list; + struct task_group *parent; + struct list_head siblings; + struct list_head children; + struct autogroup *autogroup; + long: 32; + struct cfs_bandwidth cfs_bandwidth; + long: 32; + long: 32; +}; + +struct io_ring_ctx; + +struct io_wq; + +struct io_uring_task { + int cached_refs; + const struct io_ring_ctx *last; + struct io_wq *io_wq; + struct file *registered_rings[16]; + struct xarray xa; + struct wait_queue_head wait; + atomic_t in_idle; + atomic_t inflight_tracked; + long: 32; + struct percpu_counter inflight; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct { + struct llist_head task_list; + struct callback_head task_work; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; +}; + +enum { + MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY = 1, + MEMBARRIER_STATE_PRIVATE_EXPEDITED = 2, + MEMBARRIER_STATE_GLOBAL_EXPEDITED_READY = 4, + MEMBARRIER_STATE_GLOBAL_EXPEDITED = 8, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE_READY = 16, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ_READY = 64, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ = 128, +}; + +struct autogroup { + struct kref kref; + struct task_group *tg; + struct rw_semaphore lock; + long unsigned int id; + int nice; +}; + +typedef int __kernel_rwf_t; + +enum ctx_state { + CONTEXT_DISABLED = 4294967295, + CONTEXT_KERNEL = 0, + CONTEXT_IDLE = 1, + CONTEXT_USER = 2, + CONTEXT_GUEST = 3, + CONTEXT_MAX = 4, +}; + +struct sched_domain_attr { + int relax_domain_level; +}; + +struct sched_domain_shared { + atomic_t ref; + atomic_t nr_busy_cpus; + int has_idle_cores; + int nr_idle_scan; +}; + +struct sched_group; + +struct sched_domain { + struct sched_domain *parent; + struct sched_domain *child; + struct sched_group *groups; + long unsigned int min_interval; + long unsigned int max_interval; + unsigned int busy_factor; + unsigned int imbalance_pct; + unsigned int cache_nice_tries; + unsigned int imb_numa_nr; + int nohz_idle; + int flags; + int level; + long unsigned int last_balance; + unsigned int balance_interval; + unsigned int nr_balance_failed; + long: 32; + u64 max_newidle_lb_cost; + long unsigned int last_decay_max_lb_cost; + long: 32; + u64 avg_scan_cost; + unsigned int lb_count[3]; + unsigned int lb_failed[3]; + unsigned int lb_balanced[3]; + unsigned int lb_imbalance[3]; + unsigned int lb_gained[3]; + unsigned int lb_hot_gained[3]; + unsigned int lb_nobusyg[3]; + unsigned int lb_nobusyq[3]; + unsigned int alb_count; + unsigned int alb_failed; + unsigned int alb_pushed; + unsigned int sbe_count; + unsigned int sbe_balanced; + unsigned int sbe_pushed; + unsigned int sbf_count; + unsigned int sbf_balanced; + unsigned int sbf_pushed; + unsigned int ttwu_wake_remote; + unsigned int ttwu_move_affine; + unsigned int ttwu_move_balance; + char *name; + union { + void *private; + struct callback_head rcu; + }; + struct sched_domain_shared *shared; + unsigned int span_weight; + long unsigned int span[0]; + long: 32; +}; + +struct sched_group_capacity; + +struct sched_group { + struct sched_group *next; + atomic_t ref; + unsigned int group_weight; + struct sched_group_capacity *sgc; + int asym_prefer_cpu; + int flags; + long unsigned int cpumask[0]; +}; + +struct sched_group_capacity { + atomic_t ref; + long unsigned int capacity; + long unsigned int min_capacity; + long unsigned int max_capacity; + long unsigned int next_update; + int imbalance; + int id; + long unsigned int cpumask[0]; +}; + +struct kernel_cpustat { + u64 cpustat[10]; +}; + +enum { + CFTYPE_ONLY_ON_ROOT = 1, + CFTYPE_NOT_ON_ROOT = 2, + CFTYPE_NS_DELEGATABLE = 4, + CFTYPE_NO_PREFIX = 8, + CFTYPE_WORLD_WRITABLE = 16, + CFTYPE_DEBUG = 32, + __CFTYPE_ONLY_ON_DFL = 65536, + __CFTYPE_NOT_ON_DFL = 131072, + __CFTYPE_ADDED = 262144, +}; + +struct wake_q_head { + struct wake_q_node *first; + struct wake_q_node **lastp; +}; + +struct sched_attr { + __u32 size; + __u32 sched_policy; + __u64 sched_flags; + __s32 sched_nice; + __u32 sched_priority; + __u64 sched_runtime; + __u64 sched_deadline; + __u64 sched_period; + __u32 sched_util_min; + __u32 sched_util_max; +}; + +struct trace_event_raw_sched_kthread_stop { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_stop_ret { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_queue_work { + struct trace_entry ent; + void *work; + void *function; + void *worker; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_wakeup_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int target_cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_switch { + struct trace_entry ent; + char prev_comm[16]; + pid_t prev_pid; + int prev_prio; + long int prev_state; + char next_comm[16]; + pid_t next_pid; + int next_prio; + char __data[0]; +}; + +struct trace_event_raw_sched_migrate_task { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int orig_cpu; + int dest_cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_process_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_wait { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_fork { + struct trace_entry ent; + char parent_comm[16]; + pid_t parent_pid; + char child_comm[16]; + pid_t child_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_process_exec { + struct trace_entry ent; + u32 __data_loc_filename; + pid_t pid; + pid_t old_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_stat_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + long: 32; + u64 delay; + char __data[0]; +}; + +struct trace_event_raw_sched_stat_runtime { + struct trace_entry ent; + char comm[16]; + pid_t pid; + long: 32; + u64 runtime; + u64 vruntime; + char __data[0]; +}; + +struct trace_event_raw_sched_pi_setprio { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int oldprio; + int newprio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_hang { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_move_numa { + struct trace_entry ent; + pid_t pid; + pid_t tgid; + pid_t ngid; + int src_cpu; + int src_nid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_numa_pair_template { + struct trace_entry ent; + pid_t src_pid; + pid_t src_tgid; + pid_t src_ngid; + int src_cpu; + int src_nid; + pid_t dst_pid; + pid_t dst_tgid; + pid_t dst_ngid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_wake_idle_without_ipi { + struct trace_entry ent; + int cpu; + char __data[0]; +}; + +struct trace_event_data_offsets_sched_kthread_stop {}; + +struct trace_event_data_offsets_sched_kthread_stop_ret {}; + +struct trace_event_data_offsets_sched_kthread_work_queue_work {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_start {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_end {}; + +struct trace_event_data_offsets_sched_wakeup_template {}; + +struct trace_event_data_offsets_sched_switch {}; + +struct trace_event_data_offsets_sched_migrate_task {}; + +struct trace_event_data_offsets_sched_process_template {}; + +struct trace_event_data_offsets_sched_process_wait {}; + +struct trace_event_data_offsets_sched_process_fork {}; + +struct trace_event_data_offsets_sched_process_exec { + u32 filename; +}; + +struct trace_event_data_offsets_sched_stat_template {}; + +struct trace_event_data_offsets_sched_stat_runtime {}; + +struct trace_event_data_offsets_sched_pi_setprio {}; + +struct trace_event_data_offsets_sched_process_hang {}; + +struct trace_event_data_offsets_sched_move_numa {}; + +struct trace_event_data_offsets_sched_numa_pair_template {}; + +struct trace_event_data_offsets_sched_wake_idle_without_ipi {}; + +typedef void (*btf_trace_sched_kthread_stop)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_kthread_stop_ret)(void *, int); + +typedef void (*btf_trace_sched_kthread_work_queue_work)(void *, struct kthread_worker *, struct kthread_work *); + +typedef void (*btf_trace_sched_kthread_work_execute_start)(void *, struct kthread_work *); + +typedef void (*btf_trace_sched_kthread_work_execute_end)(void *, struct kthread_work *, kthread_work_func_t); + +typedef void (*btf_trace_sched_waking)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wakeup)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wakeup_new)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_switch)(void *, bool, struct task_struct *, struct task_struct *, unsigned int); + +typedef void (*btf_trace_sched_migrate_task)(void *, struct task_struct *, int); + +typedef void (*btf_trace_sched_process_free)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_exit)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wait_task)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_wait)(void *, struct pid *); + +typedef void (*btf_trace_sched_process_fork)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_process_exec)(void *, struct task_struct *, pid_t, struct linux_binprm *); + +typedef void (*btf_trace_sched_stat_wait)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_sleep)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_iowait)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_blocked)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_runtime)(void *, struct task_struct *, u64, u64); + +typedef void (*btf_trace_sched_pi_setprio)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_process_hang)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_move_numa)(void *, struct task_struct *, int, int); + +typedef void (*btf_trace_sched_stick_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_swap_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_wake_idle_without_ipi)(void *, int); + +typedef void (*btf_trace_pelt_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_pelt_rt_tp)(void *, struct rq *); + +struct rt_prio_array { + long unsigned int bitmap[4]; + struct list_head queue[100]; +}; + +struct rt_rq { + struct rt_prio_array active; + unsigned int rt_nr_running; + unsigned int rr_nr_running; + struct { + int curr; + int next; + } highest_prio; + unsigned int rt_nr_migratory; + unsigned int rt_nr_total; + int overloaded; + struct plist_head pushable_tasks; + int rt_queued; + int rt_throttled; + long: 32; + u64 rt_time; + u64 rt_runtime; + raw_spinlock_t rt_runtime_lock; + long: 32; +}; + +struct dl_rq { + struct rb_root_cached root; + unsigned int dl_nr_running; + long: 32; + struct { + u64 curr; + u64 next; + } earliest_dl; + unsigned int dl_nr_migratory; + int overloaded; + struct rb_root_cached pushable_dl_tasks_root; + u64 running_bw; + u64 this_bw; + u64 extra_bw; + u64 bw_ratio; +}; + +struct cpu_stop_done; + +struct cpu_stop_work { + struct list_head list; + cpu_stop_fn_t fn; + long unsigned int caller; + void *arg; + struct cpu_stop_done *done; +}; + +struct balance_callback; + +struct rq { + raw_spinlock_t __lock; + unsigned int nr_running; + long unsigned int last_blocked_load_update_tick; + unsigned int has_blocked_load; + call_single_data_t nohz_csd; + unsigned int nohz_tick_stopped; + atomic_t nohz_flags; + unsigned int ttwu_pending; + long: 32; + u64 nr_switches; + long: 32; + long: 32; + struct cfs_rq cfs; + struct rt_rq rt; + struct dl_rq dl; + struct list_head leaf_cfs_rq_list; + struct list_head *tmp_alone_branch; + unsigned int nr_uninterruptible; + struct task_struct *curr; + struct task_struct *idle; + struct task_struct *stop; + long unsigned int next_balance; + struct mm_struct *prev_mm; + unsigned int clock_update_flags; + u64 clock; + long: 32; + long: 32; + u64 clock_task; + u64 clock_pelt; + long unsigned int lost_idle_time; + long: 32; + u64 clock_pelt_idle; + u64 clock_idle; + u64 clock_pelt_idle_copy; + u64 clock_idle_copy; + atomic_t nr_iowait; + long: 32; + u64 last_seen_need_resched_ns; + int ticks_without_resched; + int membarrier_state; + struct root_domain *rd; + struct sched_domain *sd; + long unsigned int cpu_capacity; + long unsigned int cpu_capacity_orig; + long unsigned int cpu_capacity_inverted; + struct balance_callback *balance_callback; + unsigned char nohz_idle_balance; + unsigned char idle_balance; + long unsigned int misfit_task_load; + int active_balance; + int push_cpu; + struct cpu_stop_work active_balance_work; + int cpu; + int online; + struct list_head cfs_tasks; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct sched_avg avg_rt; + struct sched_avg avg_dl; + struct sched_avg avg_thermal; + u64 idle_stamp; + u64 avg_idle; + long unsigned int wake_stamp; + long: 32; + u64 wake_avg_idle; + u64 max_idle_balance_cost; + struct rcuwait hotplug_wait; + long: 32; + u64 prev_steal_time; + long unsigned int calc_load_update; + long int calc_load_active; + call_single_data_t hrtick_csd; + struct hrtimer hrtick_timer; + ktime_t hrtick_time; + struct sched_info rq_sched_info; + long long unsigned int rq_cpu_time; + unsigned int yld_count; + unsigned int sched_count; + unsigned int sched_goidle; + unsigned int ttwu_count; + unsigned int ttwu_local; + unsigned int nr_pinned; + unsigned int push_busy; + struct cpu_stop_work push_work; + cpumask_var_t scratch_mask; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +typedef void (*btf_trace_pelt_dl_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_thermal_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_irq_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_sched_cpu_capacity_tp)(void *, struct rq *); + +typedef void (*btf_trace_sched_overutilized_tp)(void *, struct root_domain *, bool); + +typedef void (*btf_trace_sched_util_est_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_sched_util_est_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_sched_update_nr_running_tp)(void *, struct rq *, int); + +struct cpudl_item { + u64 dl; + int cpu; + int idx; +}; + +struct rt_bandwidth { + raw_spinlock_t rt_runtime_lock; + long: 32; + ktime_t rt_period; + u64 rt_runtime; + struct hrtimer rt_period_timer; + unsigned int rt_period_active; + long: 32; +}; + +typedef int (*tg_visitor)(struct task_group *, void *); + +struct perf_domain { + struct em_perf_domain *em_pd; + struct perf_domain *next; + struct callback_head rcu; +}; + +struct balance_callback { + struct balance_callback *next; + void (*func)(struct rq *); +}; + +struct rq_flags { + long unsigned int flags; + struct pin_cookie cookie; + unsigned int clock_update_flags; +}; + +struct sched_entity_stats { + struct sched_entity se; + struct sched_statistics stats; +}; + +enum { + __SCHED_FEAT_GENTLE_FAIR_SLEEPERS = 0, + __SCHED_FEAT_START_DEBIT = 1, + __SCHED_FEAT_NEXT_BUDDY = 2, + __SCHED_FEAT_LAST_BUDDY = 3, + __SCHED_FEAT_CACHE_HOT_BUDDY = 4, + __SCHED_FEAT_WAKEUP_PREEMPTION = 5, + __SCHED_FEAT_HRTICK = 6, + __SCHED_FEAT_HRTICK_DL = 7, + __SCHED_FEAT_DOUBLE_TICK = 8, + __SCHED_FEAT_NONTASK_CAPACITY = 9, + __SCHED_FEAT_TTWU_QUEUE = 10, + __SCHED_FEAT_SIS_PROP = 11, + __SCHED_FEAT_SIS_UTIL = 12, + __SCHED_FEAT_WARN_DOUBLE_CLOCK = 13, + __SCHED_FEAT_RT_PUSH_IPI = 14, + __SCHED_FEAT_RT_RUNTIME_SHARE = 15, + __SCHED_FEAT_LB_MIN = 16, + __SCHED_FEAT_ATTACH_AGE_LOAD = 17, + __SCHED_FEAT_WA_IDLE = 18, + __SCHED_FEAT_WA_WEIGHT = 19, + __SCHED_FEAT_WA_BIAS = 20, + __SCHED_FEAT_UTIL_EST = 21, + __SCHED_FEAT_UTIL_EST_FASTUP = 22, + __SCHED_FEAT_LATENCY_WARN = 23, + __SCHED_FEAT_ALT_PERIOD = 24, + __SCHED_FEAT_BASE_SLICE = 25, + __SCHED_FEAT_NR = 26, +}; + +struct affinity_context { + const struct cpumask *new_mask; + struct cpumask *user_mask; + unsigned int flags; +}; + +enum cpu_util_type { + FREQUENCY_UTIL = 0, + ENERGY_UTIL = 1, +}; + +struct io_uring_sqe { + __u8 opcode; + __u8 flags; + __u16 ioprio; + __s32 fd; + union { + __u64 off; + __u64 addr2; + struct { + __u32 cmd_op; + __u32 __pad1; + }; + }; + union { + __u64 addr; + __u64 splice_off_in; + }; + __u32 len; + union { + __kernel_rwf_t rw_flags; + __u32 fsync_flags; + __u16 poll_events; + __u32 poll32_events; + __u32 sync_range_flags; + __u32 msg_flags; + __u32 timeout_flags; + __u32 accept_flags; + __u32 cancel_flags; + __u32 open_flags; + __u32 statx_flags; + __u32 fadvise_advice; + __u32 splice_flags; + __u32 rename_flags; + __u32 unlink_flags; + __u32 hardlink_flags; + __u32 xattr_flags; + __u32 msg_ring_flags; + __u32 uring_cmd_flags; + }; + __u64 user_data; + union { + __u16 buf_index; + __u16 buf_group; + }; + __u16 personality; + union { + __s32 splice_fd_in; + __u32 file_index; + struct { + __u16 addr_len; + __u16 __pad3[1]; + }; + }; + union { + struct { + __u64 addr3; + __u64 __pad2[1]; + }; + __u8 cmd[0]; + }; +}; + +enum { + IOSQE_FIXED_FILE_BIT = 0, + IOSQE_IO_DRAIN_BIT = 1, + IOSQE_IO_LINK_BIT = 2, + IOSQE_IO_HARDLINK_BIT = 3, + IOSQE_ASYNC_BIT = 4, + IOSQE_BUFFER_SELECT_BIT = 5, + IOSQE_CQE_SKIP_SUCCESS_BIT = 6, +}; + +enum io_uring_op { + IORING_OP_NOP = 0, + IORING_OP_READV = 1, + IORING_OP_WRITEV = 2, + IORING_OP_FSYNC = 3, + IORING_OP_READ_FIXED = 4, + IORING_OP_WRITE_FIXED = 5, + IORING_OP_POLL_ADD = 6, + IORING_OP_POLL_REMOVE = 7, + IORING_OP_SYNC_FILE_RANGE = 8, + IORING_OP_SENDMSG = 9, + IORING_OP_RECVMSG = 10, + IORING_OP_TIMEOUT = 11, + IORING_OP_TIMEOUT_REMOVE = 12, + IORING_OP_ACCEPT = 13, + IORING_OP_ASYNC_CANCEL = 14, + IORING_OP_LINK_TIMEOUT = 15, + IORING_OP_CONNECT = 16, + IORING_OP_FALLOCATE = 17, + IORING_OP_OPENAT = 18, + IORING_OP_CLOSE = 19, + IORING_OP_FILES_UPDATE = 20, + IORING_OP_STATX = 21, + IORING_OP_READ = 22, + IORING_OP_WRITE = 23, + IORING_OP_FADVISE = 24, + IORING_OP_MADVISE = 25, + IORING_OP_SEND = 26, + IORING_OP_RECV = 27, + IORING_OP_OPENAT2 = 28, + IORING_OP_EPOLL_CTL = 29, + IORING_OP_SPLICE = 30, + IORING_OP_PROVIDE_BUFFERS = 31, + IORING_OP_REMOVE_BUFFERS = 32, + IORING_OP_TEE = 33, + IORING_OP_SHUTDOWN = 34, + IORING_OP_RENAMEAT = 35, + IORING_OP_UNLINKAT = 36, + IORING_OP_MKDIRAT = 37, + IORING_OP_SYMLINKAT = 38, + IORING_OP_LINKAT = 39, + IORING_OP_MSG_RING = 40, + IORING_OP_FSETXATTR = 41, + IORING_OP_SETXATTR = 42, + IORING_OP_FGETXATTR = 43, + IORING_OP_GETXATTR = 44, + IORING_OP_SOCKET = 45, + IORING_OP_URING_CMD = 46, + IORING_OP_SEND_ZC = 47, + IORING_OP_SENDMSG_ZC = 48, + IORING_OP_LAST = 49, +}; + +struct io_uring_cqe { + __u64 user_data; + __s32 res; + __u32 flags; + __u64 big_cqe[0]; +}; + +enum { + IORING_REGISTER_BUFFERS = 0, + IORING_UNREGISTER_BUFFERS = 1, + IORING_REGISTER_FILES = 2, + IORING_UNREGISTER_FILES = 3, + IORING_REGISTER_EVENTFD = 4, + IORING_UNREGISTER_EVENTFD = 5, + IORING_REGISTER_FILES_UPDATE = 6, + IORING_REGISTER_EVENTFD_ASYNC = 7, + IORING_REGISTER_PROBE = 8, + IORING_REGISTER_PERSONALITY = 9, + IORING_UNREGISTER_PERSONALITY = 10, + IORING_REGISTER_RESTRICTIONS = 11, + IORING_REGISTER_ENABLE_RINGS = 12, + IORING_REGISTER_FILES2 = 13, + IORING_REGISTER_FILES_UPDATE2 = 14, + IORING_REGISTER_BUFFERS2 = 15, + IORING_REGISTER_BUFFERS_UPDATE = 16, + IORING_REGISTER_IOWQ_AFF = 17, + IORING_UNREGISTER_IOWQ_AFF = 18, + IORING_REGISTER_IOWQ_MAX_WORKERS = 19, + IORING_REGISTER_RING_FDS = 20, + IORING_UNREGISTER_RING_FDS = 21, + IORING_REGISTER_PBUF_RING = 22, + IORING_UNREGISTER_PBUF_RING = 23, + IORING_REGISTER_SYNC_CANCEL = 24, + IORING_REGISTER_FILE_ALLOC_RANGE = 25, + IORING_REGISTER_LAST = 26, +}; + +struct io_wq_work_node { + struct io_wq_work_node *next; +}; + +struct io_wq_work_list { + struct io_wq_work_node *first; + struct io_wq_work_node *last; +}; + +struct io_wq_work { + struct io_wq_work_node list; + unsigned int flags; + int cancel_seq; +}; + +struct io_fixed_file { + long unsigned int file_ptr; +}; + +struct io_file_table { + struct io_fixed_file *files; + long unsigned int *bitmap; + unsigned int alloc_hint; +}; + +struct io_hash_bucket { + spinlock_t lock; + struct hlist_head list; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct io_hash_table { + struct io_hash_bucket *hbs; + unsigned int hash_bits; +}; + +struct io_kiocb; + +struct io_submit_link { + struct io_kiocb *head; + struct io_kiocb *last; +}; + +struct io_submit_state { + struct io_wq_work_node free_list; + struct io_wq_work_list compl_reqs; + struct io_submit_link link; + bool plug_started; + bool need_plug; + short unsigned int submit_nr; + unsigned int cqes_count; + struct blk_plug plug; + long: 32; + struct io_uring_cqe cqes[16]; +}; + +struct io_alloc_cache { + struct hlist_head list; + unsigned int nr_cached; +}; + +struct io_restriction { + long unsigned int register_op[1]; + long unsigned int sqe_op[2]; + u8 sqe_flags_allowed; + u8 sqe_flags_required; + bool registered; +}; + +struct io_rings; + +struct io_rsrc_node; + +struct io_mapped_ubuf; + +struct io_buffer_list; + +struct io_sq_data; + +struct io_ev_fd; + +struct io_rsrc_data; + +struct io_wq_hash; + +struct io_ring_ctx { + struct { + struct percpu_ref refs; + struct io_rings *rings; + unsigned int flags; + enum task_work_notify_mode notify_method; + unsigned int compat: 1; + unsigned int drain_next: 1; + unsigned int restricted: 1; + unsigned int off_timeout_used: 1; + unsigned int drain_active: 1; + unsigned int drain_disabled: 1; + unsigned int has_evfd: 1; + unsigned int syscall_iopoll: 1; + unsigned int task_complete: 1; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + struct { + struct mutex uring_lock; + u32 *sq_array; + struct io_uring_sqe *sq_sqes; + unsigned int cached_sq_head; + unsigned int sq_entries; + struct io_rsrc_node *rsrc_node; + int rsrc_cached_refs; + atomic_t cancel_seq; + struct io_file_table file_table; + unsigned int nr_user_files; + unsigned int nr_user_bufs; + struct io_mapped_ubuf **user_bufs; + struct io_submit_state submit_state; + struct io_buffer_list *io_bl; + struct xarray io_bl_xa; + struct list_head io_buffers_cache; + struct io_hash_table cancel_table_locked; + struct list_head cq_overflow_list; + struct io_alloc_cache apoll_cache; + struct io_alloc_cache netmsg_cache; + long: 32; + long: 32; + }; + struct io_wq_work_list locked_free_list; + unsigned int locked_free_nr; + const struct cred *sq_creds; + struct io_sq_data *sq_data; + struct wait_queue_head sqo_sq_wait; + struct list_head sqd_list; + long unsigned int check_cq; + unsigned int file_alloc_start; + unsigned int file_alloc_end; + struct xarray personalities; + u32 pers_next; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct { + struct io_uring_cqe *cqe_cached; + struct io_uring_cqe *cqe_sentinel; + unsigned int cached_cq_tail; + unsigned int cq_entries; + struct io_ev_fd *io_ev_fd; + struct wait_queue_head cq_wait; + unsigned int cq_extra; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + struct { + spinlock_t completion_lock; + bool poll_multi_queue; + struct io_wq_work_list iopoll_list; + struct io_hash_table cancel_table; + struct llist_head work_llist; + struct list_head io_buffers_comp; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + struct { + spinlock_t timeout_lock; + atomic_t cq_timeouts; + struct list_head timeout_list; + struct list_head ltimeout_list; + unsigned int cq_last_tm_flush; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + struct io_restriction restrictions; + struct task_struct *submitter_task; + struct io_rsrc_node *rsrc_backup_node; + struct io_mapped_ubuf *dummy_ubuf; + struct io_rsrc_data *file_data; + struct io_rsrc_data *buf_data; + struct delayed_work rsrc_put_work; + struct callback_head rsrc_put_tw; + struct llist_head rsrc_put_llist; + struct list_head rsrc_ref_list; + spinlock_t rsrc_ref_lock; + struct list_head io_buffers_pages; + struct socket *ring_sock; + struct io_wq_hash *hash_map; + struct user_struct *user; + struct mm_struct *mm_account; + struct llist_head fallback_llist; + struct delayed_work fallback_work; + struct work_struct exit_work; + struct list_head tctx_list; + struct completion ref_comp; + u32 iowq_limits[2]; + bool iowq_limits_set; + struct list_head defer_list; + unsigned int sq_thread_idle; + unsigned int evfd_last_cq_tail; + long: 32; + long: 32; + long: 32; +}; + +struct io_uring { + u32 head; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + u32 tail; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct io_rings { + struct io_uring sq; + struct io_uring cq; + u32 sq_ring_mask; + u32 cq_ring_mask; + u32 sq_ring_entries; + u32 cq_ring_entries; + u32 sq_dropped; + atomic_t sq_flags; + u32 cq_flags; + u32 cq_overflow; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct io_uring_cqe cqes[0]; +}; + +struct io_cmd_data { + struct file *file; + __u8 data[56]; +}; + +struct io_cqe { + __u64 user_data; + __s32 res; + union { + __u32 flags; + int fd; + }; +}; + +typedef void (*io_req_tw_func_t)(struct io_kiocb *, bool *); + +struct io_task_work { + struct llist_node node; + io_req_tw_func_t func; +}; + +struct io_buffer; + +struct async_poll; + +struct io_kiocb { + union { + struct file *file; + struct io_cmd_data cmd; + }; + u8 opcode; + u8 iopoll_completed; + u16 buf_index; + unsigned int flags; + long: 32; + struct io_cqe cqe; + struct io_ring_ctx *ctx; + struct task_struct *task; + struct io_rsrc_node *rsrc_node; + union { + struct io_mapped_ubuf *imu; + struct io_buffer *kbuf; + struct io_buffer_list *buf_list; + }; + union { + struct io_wq_work_node comp_list; + __poll_t apoll_events; + }; + atomic_t refs; + atomic_t poll_refs; + struct io_task_work io_task_work; + long: 32; + union { + struct hlist_node hash_node; + struct { + u64 extra1; + u64 extra2; + }; + }; + struct async_poll *apoll; + void *async_data; + struct io_kiocb *link; + const struct cred *creds; + struct io_wq_work work; + long: 32; +}; + +struct io_ev_fd { + struct eventfd_ctx *cq_ev_fd; + unsigned int eventfd_async: 1; + struct callback_head rcu; + atomic_t refs; + atomic_t ops; +}; + +struct io_wq_hash { + refcount_t refs; + long unsigned int map; + struct wait_queue_head wait; +}; + +enum { + REQ_F_FIXED_FILE_BIT = 0, + REQ_F_IO_DRAIN_BIT = 1, + REQ_F_LINK_BIT = 2, + REQ_F_HARDLINK_BIT = 3, + REQ_F_FORCE_ASYNC_BIT = 4, + REQ_F_BUFFER_SELECT_BIT = 5, + REQ_F_CQE_SKIP_BIT = 6, + REQ_F_FAIL_BIT = 8, + REQ_F_INFLIGHT_BIT = 9, + REQ_F_CUR_POS_BIT = 10, + REQ_F_NOWAIT_BIT = 11, + REQ_F_LINK_TIMEOUT_BIT = 12, + REQ_F_NEED_CLEANUP_BIT = 13, + REQ_F_POLLED_BIT = 14, + REQ_F_BUFFER_SELECTED_BIT = 15, + REQ_F_BUFFER_RING_BIT = 16, + REQ_F_REISSUE_BIT = 17, + REQ_F_CREDS_BIT = 18, + REQ_F_REFCOUNT_BIT = 19, + REQ_F_ARM_LTIMEOUT_BIT = 20, + REQ_F_ASYNC_DATA_BIT = 21, + REQ_F_SKIP_LINK_CQES_BIT = 22, + REQ_F_SINGLE_POLL_BIT = 23, + REQ_F_DOUBLE_POLL_BIT = 24, + REQ_F_PARTIAL_IO_BIT = 25, + REQ_F_CQE32_INIT_BIT = 26, + REQ_F_APOLL_MULTISHOT_BIT = 27, + REQ_F_CLEAR_POLLIN_BIT = 28, + REQ_F_HASH_LOCKED_BIT = 29, + REQ_F_SUPPORT_NOWAIT_BIT = 30, + REQ_F_ISREG_BIT = 31, + __REQ_F_LAST_BIT = 32, +}; + +struct set_affinity_pending; + +struct migration_arg { + struct task_struct *task; + int dest_cpu; + struct set_affinity_pending *pending; +}; + +struct set_affinity_pending { + refcount_t refs; + unsigned int stop_pending; + struct completion done; + struct cpu_stop_work stop_work; + struct migration_arg arg; +}; + +struct cfs_schedulable_data { + struct task_group *tg; + long: 32; + u64 period; + u64 quota; +}; + +enum { + cpuset = 0, + possible = 1, + fail = 2, +}; + +union cpumask_rcuhead { + cpumask_t cpumask; + struct callback_head rcu; +}; + +enum uclamp_id { + UCLAMP_MIN = 0, + UCLAMP_MAX = 1, + UCLAMP_CNT = 2, +}; + +struct update_util_data { + void (*func)(struct update_util_data *, u64, unsigned int); +}; + +enum { + SD_BALANCE_NEWIDLE = 1, + SD_BALANCE_EXEC = 2, + SD_BALANCE_FORK = 4, + SD_BALANCE_WAKE = 8, + SD_WAKE_AFFINE = 16, + SD_ASYM_CPUCAPACITY = 32, + SD_ASYM_CPUCAPACITY_FULL = 64, + SD_SHARE_CPUCAPACITY = 128, + SD_SHARE_PKG_RESOURCES = 256, + SD_SERIALIZE = 512, + SD_ASYM_PACKING = 1024, + SD_PREFER_SIBLING = 2048, + SD_OVERLAP = 4096, + SD_NUMA = 8192, +}; + +struct cpuidle_state_usage { + long long unsigned int disable; + long long unsigned int usage; + u64 time_ns; + long long unsigned int above; + long long unsigned int below; + long long unsigned int rejected; + long long unsigned int s2idle_usage; + long long unsigned int s2idle_time; +}; + +struct cpuidle_device; + +struct cpuidle_driver; + +struct cpuidle_state { + char name[16]; + char desc[32]; + s64 exit_latency_ns; + s64 target_residency_ns; + unsigned int flags; + unsigned int exit_latency; + int power_usage; + unsigned int target_residency; + int (*enter)(struct cpuidle_device *, struct cpuidle_driver *, int); + int (*enter_dead)(struct cpuidle_device *, int); + int (*enter_s2idle)(struct cpuidle_device *, struct cpuidle_driver *, int); + long: 32; +}; + +struct cpuidle_state_kobj; + +struct cpuidle_driver_kobj; + +struct cpuidle_device_kobj; + +struct cpuidle_coupled; + +struct cpuidle_device { + unsigned int registered: 1; + unsigned int enabled: 1; + unsigned int poll_time_limit: 1; + unsigned int cpu; + ktime_t next_hrtimer; + int last_state_idx; + long: 32; + u64 last_residency_ns; + u64 poll_limit_ns; + u64 forced_idle_latency_limit_ns; + struct cpuidle_state_usage states_usage[10]; + struct cpuidle_state_kobj *kobjs[10]; + struct cpuidle_driver_kobj *kobj_driver; + struct cpuidle_device_kobj *kobj_dev; + struct list_head device_list; + cpumask_t coupled_cpus; + struct cpuidle_coupled *coupled; +}; + +struct cpuidle_driver { + const char *name; + struct module *owner; + unsigned int bctimer: 1; + long: 32; + struct cpuidle_state states[10]; + int state_count; + int safe_state_index; + struct cpumask *cpumask; + const char *governor; +}; + +enum sched_tunable_scaling { + SCHED_TUNABLESCALING_NONE = 0, + SCHED_TUNABLESCALING_LOG = 1, + SCHED_TUNABLESCALING_LINEAR = 2, + SCHED_TUNABLESCALING_END = 3, +}; + +struct energy_env { + long unsigned int task_busy_time; + long unsigned int pd_busy_time; + long unsigned int cpu_cap; + long unsigned int pd_cap; +}; + +enum fbq_type { + regular = 0, + remote = 1, + all = 2, +}; + +enum group_type { + group_has_spare = 0, + group_fully_busy = 1, + group_misfit_task = 2, + group_asym_packing = 3, + group_imbalanced = 4, + group_overloaded = 5, +}; + +enum migration_type { + migrate_load = 0, + migrate_util = 1, + migrate_task = 2, + migrate_misfit = 3, +}; + +struct lb_env { + struct sched_domain *sd; + struct rq *src_rq; + int src_cpu; + int dst_cpu; + struct rq *dst_rq; + struct cpumask *dst_grpmask; + int new_dst_cpu; + enum cpu_idle_type idle; + long int imbalance; + struct cpumask *cpus; + unsigned int flags; + unsigned int loop; + unsigned int loop_break; + unsigned int loop_max; + enum fbq_type fbq_type; + enum migration_type migration_type; + struct list_head tasks; +}; + +struct sg_lb_stats { + long unsigned int avg_load; + long unsigned int group_load; + long unsigned int group_capacity; + long unsigned int group_util; + long unsigned int group_runnable; + unsigned int sum_nr_running; + unsigned int sum_h_nr_running; + unsigned int idle_cpus; + unsigned int group_weight; + enum group_type group_type; + unsigned int group_asym_packing; + long unsigned int group_misfit_task_load; +}; + +struct sd_lb_stats { + struct sched_group *busiest; + struct sched_group *local; + long unsigned int total_load; + long unsigned int total_capacity; + long unsigned int avg_load; + unsigned int prefer_sibling; + struct sg_lb_stats busiest_stat; + struct sg_lb_stats local_stat; +}; + +enum s2idle_states { + S2IDLE_STATE_NONE = 0, + S2IDLE_STATE_ENTER = 1, + S2IDLE_STATE_WAKE = 2, +}; + +struct dl_bandwidth { + raw_spinlock_t dl_runtime_lock; + long: 32; + u64 dl_runtime; + u64 dl_period; +}; + +struct idle_timer { + struct hrtimer timer; + int done; + long: 32; +}; + +typedef struct rt_rq *rt_rq_iter_t; + +typedef __kernel_ulong_t ino_t; + +struct swait_queue { + struct task_struct *task; + struct list_head task_list; +}; + +enum { + MEMBARRIER_FLAG_SYNC_CORE = 1, + MEMBARRIER_FLAG_RSEQ = 2, +}; + +struct sd_flag_debug { + unsigned int meta_flags; + char *name; +}; + +typedef const struct cpumask * (*sched_domain_mask_f)(int); + +typedef int (*sched_domain_flags_f)(); + +struct sd_data { + struct sched_domain **sd; + struct sched_domain_shared **sds; + struct sched_group **sg; + struct sched_group_capacity **sgc; +}; + +struct sched_domain_topology_level { + sched_domain_mask_f mask; + sched_domain_flags_f sd_flags; + int flags; + int numa_level; + struct sd_data data; + char *name; +}; + +struct gov_attr_set { + struct kobject kobj; + struct list_head policy_list; + struct mutex update_lock; + int usage_count; +}; + +struct governor_attr { + struct attribute attr; + ssize_t (*show)(struct gov_attr_set *, char *); + ssize_t (*store)(struct gov_attr_set *, const char *, size_t); +}; + +enum membarrier_cmd { + MEMBARRIER_CMD_QUERY = 0, + MEMBARRIER_CMD_GLOBAL = 1, + MEMBARRIER_CMD_GLOBAL_EXPEDITED = 2, + MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = 4, + MEMBARRIER_CMD_PRIVATE_EXPEDITED = 8, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = 16, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = 64, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = 128, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = 256, + MEMBARRIER_CMD_SHARED = 1, +}; + +enum membarrier_cmd_flag { + MEMBARRIER_CMD_FLAG_CPU = 1, +}; + +struct psi_window { + u64 size; + u64 start_time; + u64 start_value; + u64 prev_growth; +}; + +struct psi_trigger { + enum psi_states state; + long: 32; + u64 threshold; + struct list_head node; + struct psi_group *group; + wait_queue_head_t event_wait; + int event; + long: 32; + struct psi_window win; + u64 last_event_time; + bool pending_event; + long: 32; +}; + +enum cpuacct_stat_index { + CPUACCT_STAT_USER = 0, + CPUACCT_STAT_SYSTEM = 1, + CPUACCT_STAT_NSTATS = 2, +}; + +struct cpuacct { + struct cgroup_subsys_state css; + u64 *cpuusage; + struct kernel_cpustat *cpustat; +}; + +struct sugov_tunables { + struct gov_attr_set attr_set; + unsigned int rate_limit_us; +}; + +struct sugov_policy { + struct cpufreq_policy *policy; + struct sugov_tunables *tunables; + struct list_head tunables_hook; + raw_spinlock_t update_lock; + long: 32; + u64 last_freq_update_time; + s64 freq_update_delay_ns; + unsigned int next_freq; + unsigned int cached_raw_freq; + struct irq_work irq_work; + struct kthread_work work; + struct mutex work_lock; + struct kthread_worker worker; + struct task_struct *thread; + bool work_in_progress; + bool limits_changed; + bool need_freq_update; +}; + +struct sugov_cpu { + struct update_util_data update_util; + struct sugov_policy *sg_policy; + unsigned int cpu; + bool iowait_boost_pending; + unsigned int iowait_boost; + long: 32; + u64 last_update; + long unsigned int util; + long unsigned int bw_dl; + long unsigned int max; + long unsigned int saved_idle_calls; +}; + +struct s_data { + struct sched_domain **sd; + struct root_domain *rd; +}; + +enum s_alloc { + sa_rootdomain = 0, + sa_sd = 1, + sa_sd_storage = 2, + sa_none = 3, +}; + +struct asym_cap_data { + struct list_head link; + long unsigned int capacity; + long unsigned int cpus[0]; +}; + +enum hk_flags { + HK_FLAG_TIMER = 1, + HK_FLAG_RCU = 2, + HK_FLAG_MISC = 4, + HK_FLAG_SCHED = 8, + HK_FLAG_TICK = 16, + HK_FLAG_DOMAIN = 32, + HK_FLAG_WQ = 64, + HK_FLAG_MANAGED_IRQ = 128, + HK_FLAG_KTHREAD = 256, +}; + +struct housekeeping { + struct cpumask cpumasks[9]; + long unsigned int flags; +}; + +struct ww_acquire_ctx; + +struct ww_mutex { + struct mutex base; + struct ww_acquire_ctx *ctx; +}; + +struct ww_acquire_ctx { + struct task_struct *task; + long unsigned int stamp; + unsigned int acquired; + short unsigned int wounded; + short unsigned int is_wait_die; +}; + +struct trace_event_raw_contention_begin { + struct trace_entry ent; + void *lock_addr; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_contention_end { + struct trace_entry ent; + void *lock_addr; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_contention_begin {}; + +struct trace_event_data_offsets_contention_end {}; + +typedef void (*btf_trace_contention_begin)(void *, void *, unsigned int); + +typedef void (*btf_trace_contention_end)(void *, void *, int); + +struct mutex_waiter { + struct list_head list; + struct task_struct *task; + struct ww_acquire_ctx *ww_ctx; +}; + +struct semaphore { + raw_spinlock_t lock; + unsigned int count; + struct list_head wait_list; +}; + +struct semaphore_waiter { + struct list_head list; + struct task_struct *task; + bool up; +}; + +enum rwsem_waiter_type { + RWSEM_WAITING_FOR_WRITE = 0, + RWSEM_WAITING_FOR_READ = 1, +}; + +struct rwsem_waiter { + struct list_head list; + struct task_struct *task; + enum rwsem_waiter_type type; + long unsigned int timeout; + bool handoff_set; +}; + +enum rwsem_wake_type { + RWSEM_WAKE_ANY = 0, + RWSEM_WAKE_READERS = 1, + RWSEM_WAKE_READ_OWNED = 2, +}; + +enum owner_state { + OWNER_NULL = 1, + OWNER_WRITER = 2, + OWNER_READER = 4, + OWNER_NONSPINNABLE = 8, +}; + +struct optimistic_spin_node { + struct optimistic_spin_node *next; + struct optimistic_spin_node *prev; + int locked; + int cpu; +}; + +struct hrtimer_sleeper { + struct hrtimer timer; + struct task_struct *task; + long: 32; +}; + +struct rt_mutex_base; + +struct rt_mutex_waiter { + struct rb_node tree_entry; + struct rb_node pi_tree_entry; + struct task_struct *task; + struct rt_mutex_base *lock; + unsigned int wake_state; + int prio; + u64 deadline; + struct ww_acquire_ctx *ww_ctx; + long: 32; +}; + +struct rt_mutex_base { + raw_spinlock_t wait_lock; + struct rb_root_cached waiters; + struct task_struct *owner; +}; + +struct rt_mutex { + struct rt_mutex_base rtmutex; +}; + +struct rt_wake_q_head { + struct wake_q_head head; + struct task_struct *rtlock_task; +}; + +enum rtmutex_chainwalk { + RT_MUTEX_MIN_CHAINWALK = 0, + RT_MUTEX_FULL_CHAINWALK = 1, +}; + +enum pm_qos_req_action { + PM_QOS_ADD_REQ = 0, + PM_QOS_UPDATE_REQ = 1, + PM_QOS_REMOVE_REQ = 2, +}; + +enum suspend_stat_step { + SUSPEND_FREEZE = 1, + SUSPEND_PREPARE = 2, + SUSPEND_SUSPEND = 3, + SUSPEND_SUSPEND_LATE = 4, + SUSPEND_SUSPEND_NOIRQ = 5, + SUSPEND_RESUME_NOIRQ = 6, + SUSPEND_RESUME_EARLY = 7, + SUSPEND_RESUME = 8, +}; + +struct suspend_stats { + int success; + int fail; + int failed_freeze; + int failed_prepare; + int failed_suspend; + int failed_suspend_late; + int failed_suspend_noirq; + int failed_resume; + int failed_resume_early; + int failed_resume_noirq; + int last_failed_dev; + char failed_devs[80]; + int last_failed_errno; + int errno[2]; + int last_failed_step; + enum suspend_stat_step failed_steps[2]; +}; + +enum { + TEST_NONE = 0, + TEST_CORE = 1, + TEST_CPUS = 2, + TEST_PLATFORM = 3, + TEST_DEVICES = 4, + TEST_FREEZER = 5, + __TEST_AFTER_LAST = 6, +}; + +struct pm_vt_switch { + struct list_head head; + struct device *dev; + bool required; +}; + +struct platform_s2idle_ops { + int (*begin)(); + int (*prepare)(); + int (*prepare_late)(); + void (*check)(); + bool (*wake)(); + void (*restore_early)(); + void (*restore)(); + void (*end)(); +}; + +struct platform_hibernation_ops { + int (*begin)(pm_message_t); + void (*end)(); + int (*pre_snapshot)(); + void (*finish)(); + int (*prepare)(); + int (*enter)(); + void (*leave)(); + int (*pre_restore)(); + void (*restore_cleanup)(); + void (*recover)(); +}; + +enum { + HIBERNATION_INVALID = 0, + HIBERNATION_PLATFORM = 1, + HIBERNATION_SHUTDOWN = 2, + HIBERNATION_REBOOT = 3, + HIBERNATION_SUSPEND = 4, + HIBERNATION_TEST_RESUME = 5, + __HIBERNATION_AFTER_LAST = 6, +}; + +struct swsusp_info { + struct new_utsname uts; + u32 version_code; + long unsigned int num_physpages; + int cpus; + long unsigned int image_pages; + long unsigned int pages; + long unsigned int size; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct snapshot_handle { + unsigned int cur; + void *buffer; + int sync_read; +}; + +struct linked_page { + struct linked_page *next; + char data[4092]; +}; + +struct chain_allocator { + struct linked_page *chain; + unsigned int used_space; + gfp_t gfp_mask; + int safe_needed; +}; + +struct rtree_node { + struct list_head list; + long unsigned int *data; +}; + +struct mem_zone_bm_rtree { + struct list_head list; + struct list_head nodes; + struct list_head leaves; + long unsigned int start_pfn; + long unsigned int end_pfn; + struct rtree_node *rtree; + int levels; + unsigned int blocks; +}; + +struct bm_position { + struct mem_zone_bm_rtree *zone; + struct rtree_node *node; + long unsigned int node_pfn; + int node_bit; +}; + +struct memory_bitmap { + struct list_head zones; + struct linked_page *p_list; + struct bm_position cur; +}; + +struct mem_extent { + struct list_head hook; + long unsigned int start; + long unsigned int end; +}; + +struct nosave_region { + struct list_head list; + long unsigned int start_pfn; + long unsigned int end_pfn; +}; + +struct highmem_pbe { + struct page *copy_page; + struct page *orig_page; + struct highmem_pbe *next; +}; + +typedef struct { + long unsigned int val; +} swp_entry_t; + +enum { + BIO_NO_PAGE_REF = 0, + BIO_CLONED = 1, + BIO_BOUNCED = 2, + BIO_QUIET = 3, + BIO_CHAIN = 4, + BIO_REFFED = 5, + BIO_BPS_THROTTLED = 6, + BIO_TRACE_COMPLETION = 7, + BIO_CGROUP_ACCT = 8, + BIO_QOS_THROTTLED = 9, + BIO_QOS_MERGED = 10, + BIO_REMAPPED = 11, + BIO_ZONE_WRITE_LOCKED = 12, + BIO_FLAG_LAST = 13, +}; + +enum req_flag_bits { + __REQ_FAILFAST_DEV = 8, + __REQ_FAILFAST_TRANSPORT = 9, + __REQ_FAILFAST_DRIVER = 10, + __REQ_SYNC = 11, + __REQ_META = 12, + __REQ_PRIO = 13, + __REQ_NOMERGE = 14, + __REQ_IDLE = 15, + __REQ_INTEGRITY = 16, + __REQ_FUA = 17, + __REQ_PREFLUSH = 18, + __REQ_RAHEAD = 19, + __REQ_BACKGROUND = 20, + __REQ_NOWAIT = 21, + __REQ_CGROUP_PUNT = 22, + __REQ_POLLED = 23, + __REQ_ALLOC_CACHE = 24, + __REQ_SWAP = 25, + __REQ_DRV = 26, + __REQ_NOUNMAP = 27, + __REQ_NR_BITS = 28, +}; + +struct swap_map_page { + sector_t entries[511]; + sector_t next_swap; +}; + +struct swap_map_page_list { + struct swap_map_page *map; + struct swap_map_page_list *next; +}; + +struct swap_map_handle { + struct swap_map_page *cur; + struct swap_map_page_list *maps; + sector_t cur_swap; + sector_t first_sector; + unsigned int k; + long unsigned int reqd_free_pages; + u32 crc32; + long: 32; +}; + +struct swsusp_header { + char reserved[4056]; + u32 hw_sig; + u32 crc32; + sector_t image; + unsigned int flags; + char orig_sig[10]; + char sig[10]; +}; + +struct swsusp_extent { + struct rb_node node; + long unsigned int start; + long unsigned int end; +}; + +struct hib_bio_batch { + atomic_t count; + wait_queue_head_t wait; + blk_status_t error; + struct blk_plug plug; +}; + +struct crc_data { + struct task_struct *thr; + atomic_t ready; + atomic_t stop; + unsigned int run_threads; + wait_queue_head_t go; + wait_queue_head_t done; + u32 *crc32; + size_t *unc_len[3]; + unsigned char *unc[3]; +}; + +struct cmp_data { + struct task_struct *thr; + atomic_t ready; + atomic_t stop; + int ret; + wait_queue_head_t go; + wait_queue_head_t done; + size_t unc_len; + size_t cmp_len; + unsigned char unc[131072]; + unsigned char cmp[143360]; + unsigned char wrk[16384]; +}; + +struct dec_data { + struct task_struct *thr; + atomic_t ready; + atomic_t stop; + int ret; + wait_queue_head_t go; + wait_queue_head_t done; + size_t unc_len; + size_t cmp_len; + unsigned char unc[131072]; + unsigned char cmp[143360]; +}; + +struct miscdevice { + int minor; + const char *name; + const struct file_operations *fops; + struct list_head list; + struct device *parent; + struct device *this_device; + const struct attribute_group **groups; + const char *nodename; + umode_t mode; +}; + +typedef s64 compat_loff_t; + +struct resume_swap_area { + __kernel_loff_t offset; + __u32 dev; +}; + +struct snapshot_data { + struct snapshot_handle handle; + int swap; + int mode; + bool frozen; + bool ready; + bool platform_support; + bool free_bitmaps; + dev_t dev; +}; + +struct compat_resume_swap_area { + compat_loff_t offset; + u32 dev; +}; + +struct sysrq_key_op { + void (* const handler)(int); + const char * const help_msg; + const char * const action_msg; + const int enable_mask; +}; + +struct em_data_callback { + int (*active_power)(struct device *, long unsigned int *, long unsigned int *); + int (*get_cost)(struct device *, long unsigned int, long unsigned int *); +}; + +typedef unsigned int uint; + +typedef struct { + seqcount_t seqcount; +} seqcount_latch_t; + +struct dev_printk_info { + char subsystem[16]; + char device[48]; +}; + +struct console { + char name[16]; + void (*write)(struct console *, const char *, unsigned int); + int (*read)(struct console *, char *, unsigned int); + struct tty_driver * (*device)(struct console *, int *); + void (*unblank)(); + int (*setup)(struct console *, char *); + int (*exit)(struct console *); + int (*match)(struct console *, char *, int, char *); + short int flags; + short int index; + int cflag; + uint ispeed; + uint ospeed; + long: 32; + u64 seq; + long unsigned int dropped; + void *data; + struct hlist_node node; +}; + +struct kmsg_dump_iter { + u64 cur_seq; + u64 next_seq; +}; + +struct kmsg_dumper { + struct list_head list; + void (*dump)(struct kmsg_dumper *, enum kmsg_dump_reason); + enum kmsg_dump_reason max_reason; + bool registered; +}; + +struct trace_event_raw_console { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_data_offsets_console { + u32 msg; +}; + +typedef void (*btf_trace_console)(void *, const char *, size_t); + +struct printk_info { + u64 seq; + u64 ts_nsec; + u16 text_len; + u8 facility; + u8 flags: 5; + u8 level: 3; + u32 caller_id; + struct dev_printk_info dev_info; +}; + +struct printk_record { + struct printk_info *info; + char *text_buf; + unsigned int text_buf_size; +}; + +struct prb_data_blk_lpos { + long unsigned int begin; + long unsigned int next; +}; + +struct prb_desc { + atomic_long_t state_var; + struct prb_data_blk_lpos text_blk_lpos; +}; + +struct prb_data_ring { + unsigned int size_bits; + char *data; + atomic_long_t head_lpos; + atomic_long_t tail_lpos; +}; + +struct prb_desc_ring { + unsigned int count_bits; + struct prb_desc *descs; + struct printk_info *infos; + atomic_long_t head_id; + atomic_long_t tail_id; + atomic_long_t last_finalized_id; +}; + +struct printk_ringbuffer { + struct prb_desc_ring desc_ring; + struct prb_data_ring text_data_ring; + atomic_long_t fail; +}; + +struct prb_reserved_entry { + struct printk_ringbuffer *rb; + long unsigned int irqflags; + long unsigned int id; + unsigned int text_space; +}; + +enum desc_state { + desc_miss = 4294967295, + desc_reserved = 0, + desc_committed = 1, + desc_finalized = 2, + desc_reusable = 3, +}; + +struct console_cmdline { + char name[16]; + int index; + bool user_specified; + char *options; + char *brl_options; +}; + +enum printk_info_flags { + LOG_NEWLINE = 2, + LOG_CONT = 8, +}; + +enum devkmsg_log_bits { + __DEVKMSG_LOG_BIT_ON = 0, + __DEVKMSG_LOG_BIT_OFF = 1, + __DEVKMSG_LOG_BIT_LOCK = 2, +}; + +enum devkmsg_log_masks { + DEVKMSG_LOG_MASK_ON = 1, + DEVKMSG_LOG_MASK_OFF = 2, + DEVKMSG_LOG_MASK_LOCK = 4, +}; + +enum con_msg_format_flags { + MSG_FORMAT_DEFAULT = 0, + MSG_FORMAT_SYSLOG = 1, +}; + +struct latched_seq { + seqcount_latch_t latch; + long: 32; + u64 val[2]; +}; + +struct devkmsg_user { + atomic64_t seq; + struct ratelimit_state rs; + struct mutex lock; + char buf[8192]; + struct printk_info info; + char text_buf[8192]; + struct printk_record record; + long: 32; +}; + +struct dev_printk_info; + +struct prb_data_block { + long unsigned int id; + char data[0]; +}; + +enum { + IRQS_AUTODETECT = 1, + IRQS_SPURIOUS_DISABLED = 2, + IRQS_POLL_INPROGRESS = 8, + IRQS_ONESHOT = 32, + IRQS_REPLAY = 64, + IRQS_WAITING = 128, + IRQS_PENDING = 512, + IRQS_SUSPENDED = 2048, + IRQS_TIMINGS = 4096, + IRQS_NMI = 8192, + IRQS_SYSFS = 16384, +}; + +enum { + _IRQ_DEFAULT_INIT_FLAGS = 3072, + _IRQ_PER_CPU = 512, + _IRQ_LEVEL = 256, + _IRQ_NOPROBE = 1024, + _IRQ_NOREQUEST = 2048, + _IRQ_NOTHREAD = 65536, + _IRQ_NOAUTOEN = 4096, + _IRQ_MOVE_PCNTXT = 16384, + _IRQ_NO_BALANCING = 8192, + _IRQ_NESTED_THREAD = 32768, + _IRQ_PER_CPU_DEVID = 131072, + _IRQ_IS_POLLED = 262144, + _IRQ_DISABLE_UNLAZY = 524288, + _IRQ_HIDDEN = 1048576, + _IRQ_NO_DEBUG = 2097152, + _IRQF_MODIFY_MASK = 2096911, +}; + +enum { + IRQTF_RUNTHREAD = 0, + IRQTF_WARNED = 1, + IRQTF_AFFINITY = 2, + IRQTF_FORCED_THREAD = 3, + IRQTF_READY = 4, +}; + +enum { + IRQ_SET_MASK_OK = 0, + IRQ_SET_MASK_OK_NOCOPY = 1, + IRQ_SET_MASK_OK_DONE = 2, +}; + +enum { + IRQC_IS_HARDIRQ = 0, + IRQC_IS_NESTED = 1, +}; + +enum msi_domain_ids { + MSI_DEFAULT_DOMAIN = 0, + MSI_SECONDARY_DOMAIN = 1, + MSI_MAX_DEVICE_IRQDOMAINS = 2, +}; + +enum { + IRQ_STARTUP_NORMAL = 0, + IRQ_STARTUP_MANAGED = 1, + IRQ_STARTUP_ABORT = 2, +}; + +struct irq_devres { + unsigned int irq; + void *dev_id; +}; + +struct irq_desc_devres { + unsigned int from; + unsigned int cnt; +}; + +struct irq_generic_chip_devres { + struct irq_chip_generic *gc; + u32 msk; + unsigned int clr; + unsigned int set; +}; + +enum { + IRQ_DOMAIN_FLAG_HIERARCHY = 1, + IRQ_DOMAIN_NAME_ALLOCATED = 2, + IRQ_DOMAIN_FLAG_IPI_PER_CPU = 4, + IRQ_DOMAIN_FLAG_IPI_SINGLE = 8, + IRQ_DOMAIN_FLAG_MSI = 16, + IRQ_DOMAIN_FLAG_MSI_REMAP = 32, + IRQ_DOMAIN_FLAG_NO_MAP = 64, + IRQ_DOMAIN_FLAG_MSI_PARENT = 256, + IRQ_DOMAIN_FLAG_MSI_DEVICE = 512, + IRQ_DOMAIN_FLAG_NONCORE = 65536, +}; + +enum { + IRQCHIP_FWNODE_REAL = 0, + IRQCHIP_FWNODE_NAMED = 1, + IRQCHIP_FWNODE_NAMED_ID = 2, +}; + +struct irqchip_fwid { + struct fwnode_handle fwnode; + unsigned int type; + char *name; + phys_addr_t *pa; +}; + +enum { + AFFINITY = 0, + AFFINITY_LIST = 1, + EFFECTIVE = 2, + EFFECTIVE_LIST = 3, +}; + +struct xa_limit { + u32 max; + u32 min; +}; + +struct msi_map { + int index; + int virq; +}; + +enum msi_desc_filter { + MSI_DESC_ALL = 0, + MSI_DESC_NOTASSOCIATED = 1, + MSI_DESC_ASSOCIATED = 2, +}; + +struct msi_domain_template { + char name[48]; + struct irq_chip chip; + struct msi_domain_ops ops; + struct msi_domain_info info; +}; + +enum { + MSI_FLAG_USE_DEF_DOM_OPS = 1, + MSI_FLAG_USE_DEF_CHIP_OPS = 2, + MSI_FLAG_ACTIVATE_EARLY = 4, + MSI_FLAG_MUST_REACTIVATE = 8, + MSI_FLAG_DEV_SYSFS = 16, + MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS = 32, + MSI_FLAG_FREE_MSI_DESCS = 64, + MSI_FLAG_NOMASK_QUIRK = 128, + MSI_GENERIC_FLAGS_MASK = 65535, + MSI_DOMAIN_FLAGS_MASK = 4294901760, + MSI_FLAG_MULTI_PCI_MSI = 65536, + MSI_FLAG_PCI_MSIX = 131072, + MSI_FLAG_LEVEL_CAPABLE = 262144, + MSI_FLAG_MSIX_CONTIGUOUS = 524288, + MSI_FLAG_PCI_MSIX_ALLOC_DYN = 1048576, + MSI_FLAG_PCI_IMS = 2097152, +}; + +struct msi_ctrl { + unsigned int domid; + unsigned int first; + unsigned int last; + unsigned int nirqs; +}; + +struct irq_affinity { + unsigned int pre_vectors; + unsigned int post_vectors; + unsigned int nr_sets; + unsigned int set_size[4]; + void (*calc_sets)(struct irq_affinity *, unsigned int); + void *priv; +}; + +struct node_vectors { + unsigned int id; + union { + unsigned int nvectors; + unsigned int ncpus; + }; +}; + +typedef void (*call_rcu_func_t)(struct callback_head *, rcu_callback_t); + +struct rcu_cblist { + struct callback_head *head; + struct callback_head **tail; + long int len; +}; + +struct rcu_synchronize { + struct callback_head head; + struct completion completion; +}; + +struct trace_event_raw_rcu_utilization { + struct trace_entry ent; + const char *s; + char __data[0]; +}; + +struct trace_event_raw_rcu_stall_warning { + struct trace_entry ent; + const char *rcuname; + const char *msg; + char __data[0]; +}; + +struct trace_event_data_offsets_rcu_utilization {}; + +struct trace_event_data_offsets_rcu_stall_warning {}; + +typedef void (*btf_trace_rcu_utilization)(void *, const char *); + +typedef void (*btf_trace_rcu_stall_warning)(void *, const char *, const char *); + +struct rcu_tasks; + +typedef void (*rcu_tasks_gp_func_t)(struct rcu_tasks *); + +typedef void (*pregp_func_t)(struct list_head *); + +typedef void (*pertask_func_t)(struct task_struct *, struct list_head *); + +typedef void (*postscan_func_t)(struct list_head *); + +typedef void (*holdouts_func_t)(struct list_head *, bool, bool *); + +typedef void (*postgp_func_t)(struct rcu_tasks *); + +struct rcu_tasks_percpu; + +struct rcu_tasks { + struct rcuwait cbs_wait; + raw_spinlock_t cbs_gbl_lock; + struct mutex tasks_gp_mutex; + int gp_state; + int gp_sleep; + int init_fract; + long unsigned int gp_jiffies; + long unsigned int gp_start; + long unsigned int tasks_gp_seq; + long unsigned int n_ipis; + long unsigned int n_ipis_fails; + struct task_struct *kthread_ptr; + rcu_tasks_gp_func_t gp_func; + pregp_func_t pregp_func; + pertask_func_t pertask_func; + postscan_func_t postscan_func; + holdouts_func_t holdouts_func; + postgp_func_t postgp_func; + call_rcu_func_t call_func; + struct rcu_tasks_percpu *rtpcpu; + int percpu_enqueue_shift; + int percpu_enqueue_lim; + int percpu_dequeue_lim; + long unsigned int percpu_dequeue_gpseq; + struct mutex barrier_q_mutex; + atomic_t barrier_q_count; + struct completion barrier_q_completion; + long unsigned int barrier_q_seq; + char *name; + char *kname; +}; + +struct rcu_tasks_percpu { + struct rcu_segcblist cblist; + raw_spinlock_t lock; + long unsigned int rtp_jiffies; + long unsigned int rtp_n_lock_retries; + struct work_struct rtp_work; + struct irq_work rtp_irq_work; + struct callback_head barrier_q_head; + struct list_head rtp_blkd_tasks; + int cpu; + struct rcu_tasks *rtpp; +}; + +struct trc_stall_chk_rdr { + int nesting; + int ipi_to_cpu; + u8 needqs; +}; + +enum { + GP_IDLE = 0, + GP_ENTER = 1, + GP_PASSED = 2, + GP_EXIT = 3, + GP_REPLAY = 4, +}; + +typedef long unsigned int ulong; + +enum rcutorture_type { + RCU_FLAVOR = 0, + RCU_TASKS_FLAVOR = 1, + RCU_TASKS_RUDE_FLAVOR = 2, + RCU_TASKS_TRACING_FLAVOR = 3, + RCU_TRIVIAL_FLAVOR = 4, + SRCU_FLAVOR = 5, + INVALID_RCU_FLAVOR = 6, +}; + +struct rcu_gp_oldstate { + long unsigned int rgos_norm; + long unsigned int rgos_exp; +}; + +struct context_tracking { + atomic_t state; + long int dynticks_nesting; + long int dynticks_nmi_nesting; +}; + +enum tick_dep_bits { + TICK_DEP_BIT_POSIX_TIMER = 0, + TICK_DEP_BIT_PERF_EVENTS = 1, + TICK_DEP_BIT_SCHED = 2, + TICK_DEP_BIT_CLOCK_UNSTABLE = 3, + TICK_DEP_BIT_RCU = 4, + TICK_DEP_BIT_RCU_EXP = 5, +}; + +struct rcu_exp_work { + long unsigned int rew_s; + struct work_struct rew_work; +}; + +struct rcu_node { + raw_spinlock_t lock; + long unsigned int gp_seq; + long unsigned int gp_seq_needed; + long unsigned int completedqs; + long unsigned int qsmask; + long unsigned int rcu_gp_init_mask; + long unsigned int qsmaskinit; + long unsigned int qsmaskinitnext; + long unsigned int expmask; + long unsigned int expmaskinit; + long unsigned int expmaskinitnext; + long unsigned int cbovldmask; + long unsigned int ffmask; + long unsigned int grpmask; + int grplo; + int grphi; + u8 grpnum; + u8 level; + bool wait_blkd_tasks; + struct rcu_node *parent; + struct list_head blkd_tasks; + struct list_head *gp_tasks; + struct list_head *exp_tasks; + struct list_head *boost_tasks; + struct rt_mutex boost_mtx; + long unsigned int boost_time; + struct mutex boost_kthread_mutex; + struct task_struct *boost_kthread_task; + unsigned int boost_kthread_status; + long unsigned int n_boosts; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + raw_spinlock_t fqslock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + spinlock_t exp_lock; + long unsigned int exp_seq_rq; + wait_queue_head_t exp_wq[4]; + struct rcu_exp_work rew; + bool exp_need_flush; + raw_spinlock_t exp_poll_lock; + long unsigned int exp_seq_poll_rq; + struct work_struct exp_poll_wq; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +union rcu_noqs { + struct { + u8 norm; + u8 exp; + } b; + u16 s; +}; + +struct rcu_data { + long unsigned int gp_seq; + long unsigned int gp_seq_needed; + union rcu_noqs cpu_no_qs; + bool core_needs_qs; + bool beenonline; + bool gpwrap; + bool cpu_started; + struct rcu_node *mynode; + long unsigned int grpmask; + long unsigned int ticks_this_gp; + struct irq_work defer_qs_iw; + bool defer_qs_iw_pending; + struct work_struct strict_work; + struct rcu_segcblist cblist; + long int qlen_last_fqs_check; + long unsigned int n_cbs_invoked; + long unsigned int n_force_qs_snap; + long int blimit; + int dynticks_snap; + bool rcu_need_heavy_qs; + bool rcu_urgent_qs; + bool rcu_forced_tick; + bool rcu_forced_tick_exp; + long unsigned int barrier_seq_snap; + struct callback_head barrier_head; + int exp_dynticks_snap; + struct task_struct *rcu_cpu_kthread_task; + unsigned int rcu_cpu_kthread_status; + char rcu_cpu_has_work; + long unsigned int rcuc_activity; + unsigned int softirq_snap; + struct irq_work rcu_iw; + bool rcu_iw_pending; + long unsigned int rcu_iw_gp_seq; + long unsigned int rcu_ofl_gp_seq; + short int rcu_ofl_gp_flags; + long unsigned int rcu_onl_gp_seq; + short int rcu_onl_gp_flags; + long unsigned int last_fqs_resched; + long unsigned int last_sched_clock; + long int lazy_len; + int cpu; +}; + +struct rcu_state { + struct rcu_node node[1]; + struct rcu_node *level[2]; + int ncpus; + int n_online_cpus; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long unsigned int gp_seq; + long unsigned int gp_max; + struct task_struct *gp_kthread; + struct swait_queue_head gp_wq; + short int gp_flags; + short int gp_state; + long unsigned int gp_wake_time; + long unsigned int gp_wake_seq; + long unsigned int gp_seq_polled; + long unsigned int gp_seq_polled_snap; + long unsigned int gp_seq_polled_exp_snap; + struct mutex barrier_mutex; + atomic_t barrier_cpu_count; + struct completion barrier_completion; + long unsigned int barrier_sequence; + raw_spinlock_t barrier_lock; + struct mutex exp_mutex; + struct mutex exp_wake_mutex; + long unsigned int expedited_sequence; + atomic_t expedited_need_qs; + struct swait_queue_head expedited_wq; + int ncpus_snap; + u8 cbovld; + u8 cbovldnext; + long unsigned int jiffies_force_qs; + long unsigned int jiffies_kick_kthreads; + long unsigned int n_force_qs; + long unsigned int gp_start; + long unsigned int gp_end; + long unsigned int gp_activity; + long unsigned int gp_req_activity; + long unsigned int jiffies_stall; + long unsigned int jiffies_resched; + long unsigned int n_force_qs_gpstart; + const char *name; + char abbr; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + arch_spinlock_t ofl_lock; + int nocb_is_setup; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct kvfree_rcu_bulk_data { + long unsigned int nr_records; + struct kvfree_rcu_bulk_data *next; + void *records[0]; +}; + +struct kfree_rcu_cpu; + +struct kfree_rcu_cpu_work { + struct rcu_work rcu_work; + struct callback_head *head_free; + struct kvfree_rcu_bulk_data *bkvhead_free[2]; + struct kfree_rcu_cpu *krcp; +}; + +struct kfree_rcu_cpu { + struct callback_head *head; + struct kvfree_rcu_bulk_data *bkvhead[2]; + struct kfree_rcu_cpu_work krw_arr[2]; + raw_spinlock_t lock; + struct delayed_work monitor_work; + bool initialized; + int count; + struct delayed_work page_cache_work; + atomic_t backoff_page_cache_fill; + atomic_t work_in_progress; + struct hrtimer hrtimer; + struct llist_head bkvcache; + int nr_bkv_objs; +}; + +struct dma_sgt_handle { + struct sg_table sgt; + struct page **pages; +}; + +struct dma_devres { + size_t size; + void *vaddr; + dma_addr_t dma_handle; + long unsigned int attrs; + long: 32; +}; + +enum pci_p2pdma_map_type { + PCI_P2PDMA_MAP_UNKNOWN = 0, + PCI_P2PDMA_MAP_NOT_SUPPORTED = 1, + PCI_P2PDMA_MAP_BUS_ADDR = 2, + PCI_P2PDMA_MAP_THRU_HOST_BRIDGE = 3, +}; + +struct pci_p2pdma_map_state { + struct dev_pagemap *pgmap; + int map; + u64 bus_off; +}; + +struct cma { + long unsigned int base_pfn; + long unsigned int count; + long unsigned int *bitmap; + unsigned int order_per_bit; + spinlock_t lock; + char name[64]; + bool reserve_pages_on_error; +}; + +struct reserved_mem_ops; + +struct reserved_mem { + const char *name; + long unsigned int fdt_node; + long unsigned int phandle; + const struct reserved_mem_ops *ops; + phys_addr_t base; + phys_addr_t size; + void *priv; + long: 32; +}; + +struct reserved_mem_ops { + int (*device_init)(struct reserved_mem *, struct device *); + void (*device_release)(struct reserved_mem *, struct device *); +}; + +typedef int (*reservedmem_of_init_fn)(struct reserved_mem *); + +enum { + MEMREMAP_WB = 1, + MEMREMAP_WT = 2, + MEMREMAP_WC = 4, + MEMREMAP_ENC = 8, + MEMREMAP_DEC = 16, +}; + +struct dma_coherent_mem { + void *virt_base; + long: 32; + dma_addr_t device_base; + long unsigned int pfn_base; + int size; + long unsigned int *bitmap; + spinlock_t spinlock; + bool use_dev_dma_pfn_offset; + long: 32; +}; + +struct io_tlb_area { + long unsigned int used; + unsigned int index; + spinlock_t lock; +}; + +struct io_tlb_slot { + phys_addr_t orig_addr; + size_t alloc_size; + unsigned int list; +}; + +struct trace_event_raw_swiotlb_bounced { + struct trace_entry ent; + u32 __data_loc_dev_name; + long: 32; + u64 dma_mask; + dma_addr_t dev_addr; + size_t size; + bool force; + char __data[0]; +}; + +struct trace_event_data_offsets_swiotlb_bounced { + u32 dev_name; +}; + +typedef void (*btf_trace_swiotlb_bounced)(void *, struct device *, dma_addr_t, size_t); + +enum class_map_type { + DD_CLASS_TYPE_DISJOINT_BITS = 0, + DD_CLASS_TYPE_LEVEL_NUM = 1, + DD_CLASS_TYPE_DISJOINT_NAMES = 2, + DD_CLASS_TYPE_LEVEL_NAMES = 3, +}; + +struct ddebug_class_map { + struct list_head link; + struct module *mod; + const char *mod_name; + const char **class_names; + const int length; + const int base; + enum class_map_type map_type; +}; + +struct _ddebug_info { + struct _ddebug *descs; + struct ddebug_class_map *classes; + unsigned int num_descs; + unsigned int num_classes; +}; + +struct latch_tree_root { + seqcount_latch_t seq; + struct rb_root tree[2]; +}; + +struct module_use { + struct list_head source_list; + struct list_head target_list; + struct module *source; + struct module *target; +}; + +enum kernel_read_file_id { + READING_UNKNOWN = 0, + READING_FIRMWARE = 1, + READING_MODULE = 2, + READING_KEXEC_IMAGE = 3, + READING_KEXEC_INITRAMFS = 4, + READING_POLICY = 5, + READING_X509_CERTIFICATE = 6, + READING_MAX_ID = 7, +}; + +enum kernel_load_data_id { + LOADING_UNKNOWN = 0, + LOADING_FIRMWARE = 1, + LOADING_MODULE = 2, + LOADING_KEXEC_IMAGE = 3, + LOADING_KEXEC_INITRAMFS = 4, + LOADING_POLICY = 5, + LOADING_X509_CERTIFICATE = 6, + LOADING_MAX_ID = 7, +}; + +struct load_info { + const char *name; + struct module *mod; + Elf32_Ehdr *hdr; + long unsigned int len; + Elf32_Shdr *sechdrs; + char *secstrings; + char *strtab; + long unsigned int symoffs; + long unsigned int stroffs; + long unsigned int init_typeoffs; + long unsigned int core_typeoffs; + struct _ddebug_info dyndbg; + bool sig_ok; + long unsigned int mod_kallsyms_init_off; + struct { + unsigned int sym; + unsigned int str; + unsigned int mod; + unsigned int vers; + unsigned int info; + unsigned int pcpu; + } index; +}; + +enum mod_license { + NOT_GPL_ONLY = 0, + GPL_ONLY = 1, +}; + +struct find_symbol_arg { + const char *name; + bool gplok; + bool warn; + struct module *owner; + const s32 *crc; + const struct kernel_symbol *sym; + enum mod_license license; +}; + +struct mod_tree_root { + struct latch_tree_root root; + long unsigned int addr_min; + long unsigned int addr_max; +}; + +struct trace_event_raw_module_load { + struct trace_entry ent; + unsigned int taints; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_free { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_refcnt { + struct trace_entry ent; + long unsigned int ip; + int refcnt; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_request { + struct trace_entry ent; + long unsigned int ip; + bool wait; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_data_offsets_module_load { + u32 name; +}; + +struct trace_event_data_offsets_module_free { + u32 name; +}; + +struct trace_event_data_offsets_module_refcnt { + u32 name; +}; + +struct trace_event_data_offsets_module_request { + u32 name; +}; + +typedef void (*btf_trace_module_load)(void *, struct module *); + +typedef void (*btf_trace_module_free)(void *, struct module *); + +typedef void (*btf_trace_module_get)(void *, struct module *, long unsigned int); + +typedef void (*btf_trace_module_put)(void *, struct module *, long unsigned int); + +typedef void (*btf_trace_module_request)(void *, char *, bool, long unsigned int); + +struct symsearch { + const struct kernel_symbol *start; + const struct kernel_symbol *stop; + const s32 *crcs; + enum mod_license license; +}; + +struct mod_initfree { + struct llist_node node; + void *module_init; +}; + +struct latch_tree_ops { + bool (*less)(struct latch_tree_node *, struct latch_tree_node *); + int (*comp)(void *, struct latch_tree_node *); +}; + +enum { + PROC_ENTRY_PERMANENT = 1, +}; + +struct module_sect_attr { + struct bin_attribute battr; + long unsigned int address; +}; + +struct module_sect_attrs { + struct attribute_group grp; + unsigned int nsections; + struct module_sect_attr attrs[0]; +}; + +struct module_notes_attrs { + struct kobject *dir; + unsigned int notes; + struct bin_attribute attrs[0]; +}; + +struct modversion_info { + long unsigned int crc; + char name[60]; +}; + +enum kcmp_type { + KCMP_FILE = 0, + KCMP_VM = 1, + KCMP_FILES = 2, + KCMP_FS = 3, + KCMP_SIGHAND = 4, + KCMP_IO = 5, + KCMP_SYSVSEM = 6, + KCMP_EPOLL_TFD = 7, + KCMP_TYPES = 8, +}; + +struct kcmp_epoll_slot { + __u32 efd; + __u32 tfd; + __u32 toff; +}; + +struct profile_hit { + u32 pc; + u32 hits; +}; + +struct stacktrace_cookie { + long unsigned int *store; + unsigned int size; + unsigned int skip; + unsigned int len; +}; + +typedef __kernel_long_t __kernel_suseconds_t; + +typedef __kernel_suseconds_t suseconds_t; + +typedef __u64 timeu64_t; + +struct __kernel_itimerspec { + struct __kernel_timespec it_interval; + struct __kernel_timespec it_value; +}; + +struct timezone { + int tz_minuteswest; + int tz_dsttime; +}; + +struct itimerspec64 { + struct timespec64 it_interval; + struct timespec64 it_value; +}; + +struct old_timeval32 { + old_time32_t tv_sec; + s32 tv_usec; +}; + +struct old_itimerspec32 { + struct old_timespec32 it_interval; + struct old_timespec32 it_value; +}; + +struct old_timex32 { + u32 modes; + s32 offset; + s32 freq; + s32 maxerror; + s32 esterror; + s32 status; + s32 constant; + s32 precision; + s32 tolerance; + struct old_timeval32 time; + s32 tick; + s32 ppsfreq; + s32 jitter; + s32 shift; + s32 stabil; + s32 jitcnt; + s32 calcnt; + s32 errcnt; + s32 stbcnt; + s32 tai; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct __kernel_timex_timeval { + __kernel_time64_t tv_sec; + long long int tv_usec; +}; + +struct __kernel_timex { + unsigned int modes; + long: 32; + long long int offset; + long long int freq; + long long int maxerror; + long long int esterror; + int status; + long: 32; + long long int constant; + long long int precision; + long long int tolerance; + struct __kernel_timex_timeval time; + long long int tick; + long long int ppsfreq; + long long int jitter; + int shift; + long: 32; + long long int stabil; + long long int jitcnt; + long long int calcnt; + long long int errcnt; + long long int stbcnt; + int tai; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct trace_event_raw_timer_class { + struct trace_entry ent; + void *timer; + char __data[0]; +}; + +struct trace_event_raw_timer_start { + struct trace_entry ent; + void *timer; + void *function; + long unsigned int expires; + long unsigned int now; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_timer_expire_entry { + struct trace_entry ent; + void *timer; + long unsigned int now; + void *function; + long unsigned int baseclk; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_init { + struct trace_entry ent; + void *hrtimer; + clockid_t clockid; + enum hrtimer_mode mode; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_start { + struct trace_entry ent; + void *hrtimer; + void *function; + s64 expires; + s64 softexpires; + enum hrtimer_mode mode; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_hrtimer_expire_entry { + struct trace_entry ent; + void *hrtimer; + long: 32; + s64 now; + void *function; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_hrtimer_class { + struct trace_entry ent; + void *hrtimer; + char __data[0]; +}; + +struct trace_event_raw_itimer_state { + struct trace_entry ent; + int which; + long: 32; + long long unsigned int expires; + long int value_sec; + long int value_nsec; + long int interval_sec; + long int interval_nsec; + char __data[0]; +}; + +struct trace_event_raw_itimer_expire { + struct trace_entry ent; + int which; + pid_t pid; + long long unsigned int now; + char __data[0]; +}; + +struct trace_event_raw_tick_stop { + struct trace_entry ent; + int success; + int dependency; + char __data[0]; +}; + +struct trace_event_data_offsets_timer_class {}; + +struct trace_event_data_offsets_timer_start {}; + +struct trace_event_data_offsets_timer_expire_entry {}; + +struct trace_event_data_offsets_hrtimer_init {}; + +struct trace_event_data_offsets_hrtimer_start {}; + +struct trace_event_data_offsets_hrtimer_expire_entry {}; + +struct trace_event_data_offsets_hrtimer_class {}; + +struct trace_event_data_offsets_itimer_state {}; + +struct trace_event_data_offsets_itimer_expire {}; + +struct trace_event_data_offsets_tick_stop {}; + +typedef void (*btf_trace_timer_init)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_start)(void *, struct timer_list *, long unsigned int, unsigned int); + +typedef void (*btf_trace_timer_expire_entry)(void *, struct timer_list *, long unsigned int); + +typedef void (*btf_trace_timer_expire_exit)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_cancel)(void *, struct timer_list *); + +typedef void (*btf_trace_hrtimer_init)(void *, struct hrtimer *, clockid_t, enum hrtimer_mode); + +typedef void (*btf_trace_hrtimer_start)(void *, struct hrtimer *, enum hrtimer_mode); + +typedef void (*btf_trace_hrtimer_expire_entry)(void *, struct hrtimer *, ktime_t *); + +typedef void (*btf_trace_hrtimer_expire_exit)(void *, struct hrtimer *); + +typedef void (*btf_trace_hrtimer_cancel)(void *, struct hrtimer *); + +typedef void (*btf_trace_itimer_state)(void *, int, const struct itimerspec64 * const, long long unsigned int); + +typedef void (*btf_trace_itimer_expire)(void *, int, struct pid *, long long unsigned int); + +typedef void (*btf_trace_tick_stop)(void *, int, int); + +struct timer_base { + raw_spinlock_t lock; + struct timer_list *running_timer; + long unsigned int clk; + long unsigned int next_expiry; + unsigned int cpu; + bool next_expiry_recalc; + bool is_idle; + bool timers_pending; + long unsigned int pending_map[18]; + struct hlist_head vectors[576]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct process_timer { + struct timer_list timer; + struct task_struct *task; +}; + +enum tick_device_mode { + TICKDEV_MODE_PERIODIC = 0, + TICKDEV_MODE_ONESHOT = 1, +}; + +struct tick_device { + struct clock_event_device *evtdev; + enum tick_device_mode mode; +}; + +struct ktime_timestamps { + u64 mono; + u64 boot; + u64 real; +}; + +struct system_time_snapshot { + u64 cycles; + ktime_t real; + ktime_t raw; + enum clocksource_ids cs_id; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; + long: 32; +}; + +struct system_device_crosststamp { + ktime_t device; + ktime_t sys_realtime; + ktime_t sys_monoraw; +}; + +struct system_counterval_t { + u64 cycles; + struct clocksource *cs; + long: 32; +}; + +struct audit_ntp_val { + long long int oldval; + long long int newval; +}; + +struct audit_ntp_data { + struct audit_ntp_val vals[6]; +}; + +enum timekeeping_adv_mode { + TK_ADV_TICK = 0, + TK_ADV_FREQ = 1, +}; + +struct tk_fast { + seqcount_latch_t seq; + long: 32; + struct tk_read_base base[2]; +}; + +struct rtc_time { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +}; + +struct rtc_wkalrm { + unsigned char enabled; + unsigned char pending; + struct rtc_time time; +}; + +struct rtc_param { + __u64 param; + union { + __u64 uvalue; + __s64 svalue; + __u64 ptr; + }; + __u32 index; + __u32 __pad; +}; + +struct rtc_class_ops { + int (*ioctl)(struct device *, unsigned int, long unsigned int); + int (*read_time)(struct device *, struct rtc_time *); + int (*set_time)(struct device *, struct rtc_time *); + int (*read_alarm)(struct device *, struct rtc_wkalrm *); + int (*set_alarm)(struct device *, struct rtc_wkalrm *); + int (*proc)(struct device *, struct seq_file *); + int (*alarm_irq_enable)(struct device *, unsigned int); + int (*read_offset)(struct device *, long int *); + int (*set_offset)(struct device *, long int); + int (*param_get)(struct device *, struct rtc_param *); + int (*param_set)(struct device *, struct rtc_param *); +}; + +struct rtc_device; + +struct rtc_timer { + struct timerqueue_node node; + ktime_t period; + void (*func)(struct rtc_device *); + struct rtc_device *rtc; + int enabled; + long: 32; +}; + +struct rtc_device { + struct device dev; + struct module *owner; + int id; + const struct rtc_class_ops *ops; + struct mutex ops_lock; + struct cdev char_dev; + long unsigned int flags; + long unsigned int irq_data; + spinlock_t irq_lock; + wait_queue_head_t irq_queue; + struct fasync_struct *async_queue; + int irq_freq; + int max_user_freq; + struct timerqueue_head timerqueue; + struct rtc_timer aie_timer; + struct rtc_timer uie_rtctimer; + struct hrtimer pie_timer; + int pie_enabled; + struct work_struct irqwork; + long unsigned int set_offset_nsec; + long unsigned int features[1]; + long: 32; + time64_t range_min; + timeu64_t range_max; + time64_t start_secs; + time64_t offset_secs; + bool set_start_time; + long: 32; +}; + +enum tick_nohz_mode { + NOHZ_MODE_INACTIVE = 0, + NOHZ_MODE_LOWRES = 1, + NOHZ_MODE_HIGHRES = 2, +}; + +struct tick_sched { + struct hrtimer sched_timer; + long unsigned int check_clocks; + enum tick_nohz_mode nohz_mode; + unsigned int inidle: 1; + unsigned int tick_stopped: 1; + unsigned int idle_active: 1; + unsigned int do_timer_last: 1; + unsigned int got_idle_tick: 1; + long: 32; + ktime_t last_tick; + ktime_t next_tick; + long unsigned int idle_jiffies; + long unsigned int idle_calls; + long unsigned int idle_sleeps; + long: 32; + ktime_t idle_entrytime; + ktime_t idle_waketime; + ktime_t idle_exittime; + ktime_t idle_sleeptime; + ktime_t iowait_sleeptime; + long unsigned int last_jiffies; + long: 32; + u64 timer_expires; + u64 timer_expires_base; + u64 next_timer; + ktime_t idle_expires; + atomic_t tick_dep_mask; + long unsigned int last_tick_jiffies; + unsigned int stalled_jiffies; + long: 32; +}; + +struct timer_list_iter { + int cpu; + bool second_pass; + u64 now; +}; + +struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + long int tm_year; + int tm_wday; + int tm_yday; +}; + +struct cyclecounter { + u64 (*read)(const struct cyclecounter *); + long: 32; + u64 mask; + u32 mult; + u32 shift; +}; + +struct timecounter { + const struct cyclecounter *cc; + long: 32; + u64 cycle_last; + u64 nsec; + u64 mask; + u64 frac; +}; + +typedef __kernel_timer_t timer_t; + +enum alarmtimer_type { + ALARM_REALTIME = 0, + ALARM_BOOTTIME = 1, + ALARM_NUMTYPE = 2, + ALARM_REALTIME_FREEZER = 3, + ALARM_BOOTTIME_FREEZER = 4, +}; + +enum alarmtimer_restart { + ALARMTIMER_NORESTART = 0, + ALARMTIMER_RESTART = 1, +}; + +struct alarm { + struct timerqueue_node node; + struct hrtimer timer; + enum alarmtimer_restart (*function)(struct alarm *, ktime_t); + enum alarmtimer_type type; + int state; + void *data; +}; + +struct cpu_timer { + struct timerqueue_node node; + struct timerqueue_head *head; + struct pid *pid; + struct list_head elist; + int firing; + long: 32; +}; + +struct k_clock; + +struct k_itimer { + struct list_head list; + struct hlist_node t_hash; + spinlock_t it_lock; + const struct k_clock *kclock; + clockid_t it_clock; + timer_t it_id; + int it_active; + long: 32; + s64 it_overrun; + s64 it_overrun_last; + int it_requeue_pending; + int it_sigev_notify; + ktime_t it_interval; + struct signal_struct *it_signal; + union { + struct pid *it_pid; + struct task_struct *it_process; + }; + struct sigqueue *sigq; + long: 32; + union { + struct { + struct hrtimer timer; + } real; + struct cpu_timer cpu; + struct { + struct alarm alarmtimer; + } alarm; + } it; + struct callback_head rcu; +}; + +struct k_clock { + int (*clock_getres)(const clockid_t, struct timespec64 *); + int (*clock_set)(const clockid_t, const struct timespec64 *); + int (*clock_get_timespec)(const clockid_t, struct timespec64 *); + ktime_t (*clock_get_ktime)(const clockid_t); + int (*clock_adj)(const clockid_t, struct __kernel_timex *); + int (*timer_create)(struct k_itimer *); + int (*nsleep)(const clockid_t, int, const struct timespec64 *); + int (*timer_set)(struct k_itimer *, int, struct itimerspec64 *, struct itimerspec64 *); + int (*timer_del)(struct k_itimer *); + void (*timer_get)(struct k_itimer *, struct itimerspec64 *); + void (*timer_rearm)(struct k_itimer *); + s64 (*timer_forward)(struct k_itimer *, ktime_t); + ktime_t (*timer_remaining)(struct k_itimer *, ktime_t); + int (*timer_try_to_cancel)(struct k_itimer *); + void (*timer_arm)(struct k_itimer *, ktime_t, bool, bool); + void (*timer_wait_running)(struct k_itimer *); +}; + +struct class_interface { + struct list_head node; + struct class *class; + int (*add_dev)(struct device *, struct class_interface *); + void (*remove_dev)(struct device *, struct class_interface *); +}; + +struct trace_event_raw_alarmtimer_suspend { + struct trace_entry ent; + s64 expires; + unsigned char alarm_type; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_alarm_class { + struct trace_entry ent; + void *alarm; + unsigned char alarm_type; + s64 expires; + s64 now; + char __data[0]; +}; + +struct trace_event_data_offsets_alarmtimer_suspend {}; + +struct trace_event_data_offsets_alarm_class {}; + +typedef void (*btf_trace_alarmtimer_suspend)(void *, ktime_t, int); + +typedef void (*btf_trace_alarmtimer_fired)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_start)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_cancel)(void *, struct alarm *, ktime_t); + +struct alarm_base { + spinlock_t lock; + struct timerqueue_head timerqueue; + ktime_t (*get_ktime)(); + void (*get_timespec)(struct timespec64 *); + clockid_t base_clockid; +}; + +struct sigevent { + sigval_t sigev_value; + int sigev_signo; + int sigev_notify; + union { + int _pad[13]; + int _tid; + struct { + void (*_function)(sigval_t); + void *_attribute; + } _sigev_thread; + } _sigev_un; +}; + +typedef struct sigevent sigevent_t; + +struct posix_clock; + +struct posix_clock_operations { + struct module *owner; + int (*clock_adjtime)(struct posix_clock *, struct __kernel_timex *); + int (*clock_gettime)(struct posix_clock *, struct timespec64 *); + int (*clock_getres)(struct posix_clock *, struct timespec64 *); + int (*clock_settime)(struct posix_clock *, const struct timespec64 *); + long int (*ioctl)(struct posix_clock *, unsigned int, long unsigned int); + int (*open)(struct posix_clock *, fmode_t); + __poll_t (*poll)(struct posix_clock *, struct file *, poll_table *); + int (*release)(struct posix_clock *); + ssize_t (*read)(struct posix_clock *, uint, char *, size_t); +}; + +struct posix_clock { + struct posix_clock_operations ops; + struct cdev cdev; + struct device *dev; + struct rw_semaphore rwsem; + bool zombie; +}; + +struct posix_clock_desc { + struct file *fp; + struct posix_clock *clk; +}; + +struct __kernel_old_itimerval { + struct __kernel_old_timeval it_interval; + struct __kernel_old_timeval it_value; +}; + +struct ce_unbind { + struct clock_event_device *ce; + int res; +}; + +enum tick_broadcast_state { + TICK_BROADCAST_EXIT = 0, + TICK_BROADCAST_ENTER = 1, +}; + +enum tick_broadcast_mode { + TICK_BROADCAST_OFF = 0, + TICK_BROADCAST_ON = 1, + TICK_BROADCAST_FORCE = 2, +}; + +struct clock_read_data { + u64 epoch_ns; + u64 epoch_cyc; + u64 sched_clock_mask; + u64 (*read_sched_clock)(); + u32 mult; + u32 shift; + long: 32; +}; + +struct clock_data { + seqcount_latch_t seq; + long: 32; + struct clock_read_data read_data[2]; + ktime_t wrap_kt; + long unsigned int rate; + u64 (*actual_read_sched_clock)(); +}; + +union futex_key { + struct { + u64 i_seq; + long unsigned int pgoff; + unsigned int offset; + } shared; + struct { + union { + struct mm_struct *mm; + u64 __tmp; + }; + long unsigned int address; + unsigned int offset; + } private; + struct { + u64 ptr; + long unsigned int word; + unsigned int offset; + } both; +}; + +struct futex_pi_state { + struct list_head list; + struct rt_mutex_base pi_mutex; + struct task_struct *owner; + refcount_t refcount; + union futex_key key; +}; + +struct futex_hash_bucket { + atomic_t waiters; + spinlock_t lock; + struct plist_head chain; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct futex_q { + struct plist_node list; + struct task_struct *task; + spinlock_t *lock_ptr; + long: 32; + union futex_key key; + struct futex_pi_state *pi_state; + struct rt_mutex_waiter *rt_waiter; + union futex_key *requeue_pi_key; + u32 bitset; + atomic_t requeue_state; + long: 32; +}; + +enum futex_access { + FUTEX_READ = 0, + FUTEX_WRITE = 1, +}; + +struct futex_waitv { + __u64 val; + __u64 uaddr; + __u32 flags; + __u32 __reserved; +}; + +struct futex_vector { + struct futex_waitv w; + struct futex_q q; +}; + +enum { + Q_REQUEUE_PI_NONE = 0, + Q_REQUEUE_PI_IGNORE = 1, + Q_REQUEUE_PI_IN_PROGRESS = 2, + Q_REQUEUE_PI_WAIT = 3, + Q_REQUEUE_PI_DONE = 4, + Q_REQUEUE_PI_LOCKED = 5, +}; + +struct cfd_percpu { + call_single_data_t csd; +}; + +struct call_function_data { + struct cfd_percpu *pcpu; + cpumask_var_t cpumask; + cpumask_var_t cpumask_ipi; +}; + +struct smp_call_on_cpu_struct { + struct work_struct work; + struct completion done; + int (*func)(void *); + void *data; + int ret; + int cpu; +}; + +typedef short unsigned int __kernel_uid_t; + +typedef short unsigned int __kernel_gid_t; + +typedef __kernel_uid_t __kernel_old_uid_t; + +typedef __kernel_gid_t __kernel_old_gid_t; + +typedef __kernel_old_uid_t old_uid_t; + +typedef __kernel_old_gid_t old_gid_t; + +union bpf_iter_link_info { + struct { + __u32 map_fd; + } map; + struct { + enum bpf_cgroup_iter_order order; + __u32 cgroup_fd; + __u64 cgroup_id; + } cgroup; + struct { + __u32 tid; + __u32 pid; + __u32 pid_fd; + } task; +}; + +enum bpf_func_id { + BPF_FUNC_unspec = 0, + BPF_FUNC_map_lookup_elem = 1, + BPF_FUNC_map_update_elem = 2, + BPF_FUNC_map_delete_elem = 3, + BPF_FUNC_probe_read = 4, + BPF_FUNC_ktime_get_ns = 5, + BPF_FUNC_trace_printk = 6, + BPF_FUNC_get_prandom_u32 = 7, + BPF_FUNC_get_smp_processor_id = 8, + BPF_FUNC_skb_store_bytes = 9, + BPF_FUNC_l3_csum_replace = 10, + BPF_FUNC_l4_csum_replace = 11, + BPF_FUNC_tail_call = 12, + BPF_FUNC_clone_redirect = 13, + BPF_FUNC_get_current_pid_tgid = 14, + BPF_FUNC_get_current_uid_gid = 15, + BPF_FUNC_get_current_comm = 16, + BPF_FUNC_get_cgroup_classid = 17, + BPF_FUNC_skb_vlan_push = 18, + BPF_FUNC_skb_vlan_pop = 19, + BPF_FUNC_skb_get_tunnel_key = 20, + BPF_FUNC_skb_set_tunnel_key = 21, + BPF_FUNC_perf_event_read = 22, + BPF_FUNC_redirect = 23, + BPF_FUNC_get_route_realm = 24, + BPF_FUNC_perf_event_output = 25, + BPF_FUNC_skb_load_bytes = 26, + BPF_FUNC_get_stackid = 27, + BPF_FUNC_csum_diff = 28, + BPF_FUNC_skb_get_tunnel_opt = 29, + BPF_FUNC_skb_set_tunnel_opt = 30, + BPF_FUNC_skb_change_proto = 31, + BPF_FUNC_skb_change_type = 32, + BPF_FUNC_skb_under_cgroup = 33, + BPF_FUNC_get_hash_recalc = 34, + BPF_FUNC_get_current_task = 35, + BPF_FUNC_probe_write_user = 36, + BPF_FUNC_current_task_under_cgroup = 37, + BPF_FUNC_skb_change_tail = 38, + BPF_FUNC_skb_pull_data = 39, + BPF_FUNC_csum_update = 40, + BPF_FUNC_set_hash_invalid = 41, + BPF_FUNC_get_numa_node_id = 42, + BPF_FUNC_skb_change_head = 43, + BPF_FUNC_xdp_adjust_head = 44, + BPF_FUNC_probe_read_str = 45, + BPF_FUNC_get_socket_cookie = 46, + BPF_FUNC_get_socket_uid = 47, + BPF_FUNC_set_hash = 48, + BPF_FUNC_setsockopt = 49, + BPF_FUNC_skb_adjust_room = 50, + BPF_FUNC_redirect_map = 51, + BPF_FUNC_sk_redirect_map = 52, + BPF_FUNC_sock_map_update = 53, + BPF_FUNC_xdp_adjust_meta = 54, + BPF_FUNC_perf_event_read_value = 55, + BPF_FUNC_perf_prog_read_value = 56, + BPF_FUNC_getsockopt = 57, + BPF_FUNC_override_return = 58, + BPF_FUNC_sock_ops_cb_flags_set = 59, + BPF_FUNC_msg_redirect_map = 60, + BPF_FUNC_msg_apply_bytes = 61, + BPF_FUNC_msg_cork_bytes = 62, + BPF_FUNC_msg_pull_data = 63, + BPF_FUNC_bind = 64, + BPF_FUNC_xdp_adjust_tail = 65, + BPF_FUNC_skb_get_xfrm_state = 66, + BPF_FUNC_get_stack = 67, + BPF_FUNC_skb_load_bytes_relative = 68, + BPF_FUNC_fib_lookup = 69, + BPF_FUNC_sock_hash_update = 70, + BPF_FUNC_msg_redirect_hash = 71, + BPF_FUNC_sk_redirect_hash = 72, + BPF_FUNC_lwt_push_encap = 73, + BPF_FUNC_lwt_seg6_store_bytes = 74, + BPF_FUNC_lwt_seg6_adjust_srh = 75, + BPF_FUNC_lwt_seg6_action = 76, + BPF_FUNC_rc_repeat = 77, + BPF_FUNC_rc_keydown = 78, + BPF_FUNC_skb_cgroup_id = 79, + BPF_FUNC_get_current_cgroup_id = 80, + BPF_FUNC_get_local_storage = 81, + BPF_FUNC_sk_select_reuseport = 82, + BPF_FUNC_skb_ancestor_cgroup_id = 83, + BPF_FUNC_sk_lookup_tcp = 84, + BPF_FUNC_sk_lookup_udp = 85, + BPF_FUNC_sk_release = 86, + BPF_FUNC_map_push_elem = 87, + BPF_FUNC_map_pop_elem = 88, + BPF_FUNC_map_peek_elem = 89, + BPF_FUNC_msg_push_data = 90, + BPF_FUNC_msg_pop_data = 91, + BPF_FUNC_rc_pointer_rel = 92, + BPF_FUNC_spin_lock = 93, + BPF_FUNC_spin_unlock = 94, + BPF_FUNC_sk_fullsock = 95, + BPF_FUNC_tcp_sock = 96, + BPF_FUNC_skb_ecn_set_ce = 97, + BPF_FUNC_get_listener_sock = 98, + BPF_FUNC_skc_lookup_tcp = 99, + BPF_FUNC_tcp_check_syncookie = 100, + BPF_FUNC_sysctl_get_name = 101, + BPF_FUNC_sysctl_get_current_value = 102, + BPF_FUNC_sysctl_get_new_value = 103, + BPF_FUNC_sysctl_set_new_value = 104, + BPF_FUNC_strtol = 105, + BPF_FUNC_strtoul = 106, + BPF_FUNC_sk_storage_get = 107, + BPF_FUNC_sk_storage_delete = 108, + BPF_FUNC_send_signal = 109, + BPF_FUNC_tcp_gen_syncookie = 110, + BPF_FUNC_skb_output = 111, + BPF_FUNC_probe_read_user = 112, + BPF_FUNC_probe_read_kernel = 113, + BPF_FUNC_probe_read_user_str = 114, + BPF_FUNC_probe_read_kernel_str = 115, + BPF_FUNC_tcp_send_ack = 116, + BPF_FUNC_send_signal_thread = 117, + BPF_FUNC_jiffies64 = 118, + BPF_FUNC_read_branch_records = 119, + BPF_FUNC_get_ns_current_pid_tgid = 120, + BPF_FUNC_xdp_output = 121, + BPF_FUNC_get_netns_cookie = 122, + BPF_FUNC_get_current_ancestor_cgroup_id = 123, + BPF_FUNC_sk_assign = 124, + BPF_FUNC_ktime_get_boot_ns = 125, + BPF_FUNC_seq_printf = 126, + BPF_FUNC_seq_write = 127, + BPF_FUNC_sk_cgroup_id = 128, + BPF_FUNC_sk_ancestor_cgroup_id = 129, + BPF_FUNC_ringbuf_output = 130, + BPF_FUNC_ringbuf_reserve = 131, + BPF_FUNC_ringbuf_submit = 132, + BPF_FUNC_ringbuf_discard = 133, + BPF_FUNC_ringbuf_query = 134, + BPF_FUNC_csum_level = 135, + BPF_FUNC_skc_to_tcp6_sock = 136, + BPF_FUNC_skc_to_tcp_sock = 137, + BPF_FUNC_skc_to_tcp_timewait_sock = 138, + BPF_FUNC_skc_to_tcp_request_sock = 139, + BPF_FUNC_skc_to_udp6_sock = 140, + BPF_FUNC_get_task_stack = 141, + BPF_FUNC_load_hdr_opt = 142, + BPF_FUNC_store_hdr_opt = 143, + BPF_FUNC_reserve_hdr_opt = 144, + BPF_FUNC_inode_storage_get = 145, + BPF_FUNC_inode_storage_delete = 146, + BPF_FUNC_d_path = 147, + BPF_FUNC_copy_from_user = 148, + BPF_FUNC_snprintf_btf = 149, + BPF_FUNC_seq_printf_btf = 150, + BPF_FUNC_skb_cgroup_classid = 151, + BPF_FUNC_redirect_neigh = 152, + BPF_FUNC_per_cpu_ptr = 153, + BPF_FUNC_this_cpu_ptr = 154, + BPF_FUNC_redirect_peer = 155, + BPF_FUNC_task_storage_get = 156, + BPF_FUNC_task_storage_delete = 157, + BPF_FUNC_get_current_task_btf = 158, + BPF_FUNC_bprm_opts_set = 159, + BPF_FUNC_ktime_get_coarse_ns = 160, + BPF_FUNC_ima_inode_hash = 161, + BPF_FUNC_sock_from_file = 162, + BPF_FUNC_check_mtu = 163, + BPF_FUNC_for_each_map_elem = 164, + BPF_FUNC_snprintf = 165, + BPF_FUNC_sys_bpf = 166, + BPF_FUNC_btf_find_by_name_kind = 167, + BPF_FUNC_sys_close = 168, + BPF_FUNC_timer_init = 169, + BPF_FUNC_timer_set_callback = 170, + BPF_FUNC_timer_start = 171, + BPF_FUNC_timer_cancel = 172, + BPF_FUNC_get_func_ip = 173, + BPF_FUNC_get_attach_cookie = 174, + BPF_FUNC_task_pt_regs = 175, + BPF_FUNC_get_branch_snapshot = 176, + BPF_FUNC_trace_vprintk = 177, + BPF_FUNC_skc_to_unix_sock = 178, + BPF_FUNC_kallsyms_lookup_name = 179, + BPF_FUNC_find_vma = 180, + BPF_FUNC_loop = 181, + BPF_FUNC_strncmp = 182, + BPF_FUNC_get_func_arg = 183, + BPF_FUNC_get_func_ret = 184, + BPF_FUNC_get_func_arg_cnt = 185, + BPF_FUNC_get_retval = 186, + BPF_FUNC_set_retval = 187, + BPF_FUNC_xdp_get_buff_len = 188, + BPF_FUNC_xdp_load_bytes = 189, + BPF_FUNC_xdp_store_bytes = 190, + BPF_FUNC_copy_from_user_task = 191, + BPF_FUNC_skb_set_tstamp = 192, + BPF_FUNC_ima_file_hash = 193, + BPF_FUNC_kptr_xchg = 194, + BPF_FUNC_map_lookup_percpu_elem = 195, + BPF_FUNC_skc_to_mptcp_sock = 196, + BPF_FUNC_dynptr_from_mem = 197, + BPF_FUNC_ringbuf_reserve_dynptr = 198, + BPF_FUNC_ringbuf_submit_dynptr = 199, + BPF_FUNC_ringbuf_discard_dynptr = 200, + BPF_FUNC_dynptr_read = 201, + BPF_FUNC_dynptr_write = 202, + BPF_FUNC_dynptr_data = 203, + BPF_FUNC_tcp_raw_gen_syncookie_ipv4 = 204, + BPF_FUNC_tcp_raw_gen_syncookie_ipv6 = 205, + BPF_FUNC_tcp_raw_check_syncookie_ipv4 = 206, + BPF_FUNC_tcp_raw_check_syncookie_ipv6 = 207, + BPF_FUNC_ktime_get_tai_ns = 208, + BPF_FUNC_user_ringbuf_drain = 209, + BPF_FUNC_cgrp_storage_get = 210, + BPF_FUNC_cgrp_storage_delete = 211, + __BPF_FUNC_MAX_ID = 212, +}; + +struct bpf_link_info { + __u32 type; + __u32 id; + __u32 prog_id; + long: 32; + union { + struct { + __u64 tp_name; + __u32 tp_name_len; + long: 32; + } raw_tracepoint; + struct { + __u32 attach_type; + __u32 target_obj_id; + __u32 target_btf_id; + } tracing; + struct { + __u64 cgroup_id; + __u32 attach_type; + long: 32; + } cgroup; + struct { + __u64 target_name; + __u32 target_name_len; + union { + struct { + __u32 map_id; + } map; + }; + union { + struct { + __u64 cgroup_id; + __u32 order; + long: 32; + } cgroup; + struct { + __u32 tid; + __u32 pid; + } task; + }; + } iter; + struct { + __u32 netns_ino; + __u32 attach_type; + } netns; + struct { + __u32 ifindex; + } xdp; + }; +}; + +struct bpf_func_proto { + u64 (*func)(u64, u64, u64, u64, u64); + bool gpl_only; + bool pkt_access; + bool might_sleep; + enum bpf_return_type ret_type; + union { + struct { + enum bpf_arg_type arg1_type; + enum bpf_arg_type arg2_type; + enum bpf_arg_type arg3_type; + enum bpf_arg_type arg4_type; + enum bpf_arg_type arg5_type; + }; + enum bpf_arg_type arg_type[5]; + }; + union { + struct { + u32 *arg1_btf_id; + u32 *arg2_btf_id; + u32 *arg3_btf_id; + u32 *arg4_btf_id; + u32 *arg5_btf_id; + }; + u32 *arg_btf_id[5]; + struct { + size_t arg1_size; + size_t arg2_size; + size_t arg3_size; + size_t arg4_size; + size_t arg5_size; + }; + size_t arg_size[5]; + }; + int *ret_btf_id; + bool (*allowed)(const struct bpf_prog *); +}; + +typedef int (*bpf_iter_attach_target_t)(struct bpf_prog *, union bpf_iter_link_info *, struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_detach_target_t)(struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_show_fdinfo_t)(const struct bpf_iter_aux_info *, struct seq_file *); + +typedef int (*bpf_iter_fill_link_info_t)(const struct bpf_iter_aux_info *, struct bpf_link_info *); + +typedef const struct bpf_func_proto * (*bpf_iter_get_func_proto_t)(enum bpf_func_id, const struct bpf_prog *); + +enum bpf_iter_feature { + BPF_ITER_RESCHED = 1, +}; + +struct bpf_iter_reg { + const char *target; + bpf_iter_attach_target_t attach_target; + bpf_iter_detach_target_t detach_target; + bpf_iter_show_fdinfo_t show_fdinfo; + bpf_iter_fill_link_info_t fill_link_info; + bpf_iter_get_func_proto_t get_func_proto; + u32 ctx_arg_info_size; + u32 feature; + struct bpf_ctx_arg_aux ctx_arg_info[2]; + const struct bpf_iter_seq_info *seq_info; +}; + +struct bpf_iter_meta { + union { + struct seq_file *seq; + }; + u64 session_id; + u64 seq_num; +}; + +struct kallsym_iter { + loff_t pos; + loff_t pos_arch_end; + loff_t pos_mod_end; + loff_t pos_ftrace_mod_end; + loff_t pos_bpf_end; + long unsigned int value; + unsigned int nameoff; + char type; + char name[512]; + char module_name[60]; + int exported; + int show_value; +}; + +struct bpf_iter__ksym { + union { + struct bpf_iter_meta *meta; + }; + union { + struct kallsym_iter *ksym; + }; +}; + +typedef struct { + int val[2]; +} __kernel_fsid_t; + +struct kstatfs { + long int f_type; + long int f_bsize; + u64 f_blocks; + u64 f_bfree; + u64 f_bavail; + u64 f_files; + u64 f_ffree; + __kernel_fsid_t f_fsid; + long int f_namelen; + long int f_frsize; + long int f_flags; + long int f_spare[4]; + long: 32; +}; + +typedef __u16 comp_t; + +struct acct_v3 { + char ac_flag; + char ac_version; + __u16 ac_tty; + __u32 ac_exitcode; + __u32 ac_uid; + __u32 ac_gid; + __u32 ac_pid; + __u32 ac_ppid; + __u32 ac_btime; + __u32 ac_etime; + comp_t ac_utime; + comp_t ac_stime; + comp_t ac_mem; + comp_t ac_io; + comp_t ac_rw; + comp_t ac_minflt; + comp_t ac_majflt; + comp_t ac_swaps; + char ac_comm[16]; +}; + +typedef struct acct_v3 acct_t; + +struct fs_pin { + wait_queue_head_t wait; + int done; + struct hlist_node s_list; + struct hlist_node m_list; + void (*kill)(struct fs_pin *); +}; + +struct bsd_acct_struct { + struct fs_pin pin; + atomic_long_t count; + struct callback_head rcu; + struct mutex lock; + int active; + long unsigned int needcheck; + struct file *file; + struct pid_namespace *ns; + struct work_struct work; + struct completion done; +}; + +typedef long unsigned int elf_greg_t; + +typedef elf_greg_t elf_gregset_t[18]; + +struct elf_siginfo { + int si_signo; + int si_code; + int si_errno; +}; + +struct elf_prstatus_common { + struct elf_siginfo pr_info; + short int pr_cursig; + long unsigned int pr_sigpend; + long unsigned int pr_sighold; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + struct __kernel_old_timeval pr_utime; + struct __kernel_old_timeval pr_stime; + struct __kernel_old_timeval pr_cutime; + struct __kernel_old_timeval pr_cstime; +}; + +struct elf_prstatus { + struct elf_prstatus_common common; + elf_gregset_t pr_reg; + int pr_fpvalid; +}; + +typedef u32 note_buf_t[45]; + +enum kernfs_node_type { + KERNFS_DIR = 1, + KERNFS_FILE = 2, + KERNFS_LINK = 4, +}; + +enum kernfs_root_flag { + KERNFS_ROOT_CREATE_DEACTIVATED = 1, + KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 2, + KERNFS_ROOT_SUPPORT_EXPORTOP = 4, + KERNFS_ROOT_SUPPORT_USER_XATTR = 8, +}; + +struct kernfs_syscall_ops { + int (*show_options)(struct seq_file *, struct kernfs_root *); + int (*mkdir)(struct kernfs_node *, const char *, umode_t); + int (*rmdir)(struct kernfs_node *); + int (*rename)(struct kernfs_node *, struct kernfs_node *, const char *); + int (*show_path)(struct seq_file *, struct kernfs_node *, struct kernfs_root *); +}; + +struct kernfs_fs_context { + struct kernfs_root *root; + void *ns_tag; + long unsigned int magic; + bool new_sb_created; +}; + +enum { + CGRP_NOTIFY_ON_RELEASE = 0, + CGRP_CPUSET_CLONE_CHILDREN = 1, + CGRP_FREEZE = 2, + CGRP_FROZEN = 3, + CGRP_KILL = 4, +}; + +enum { + CGRP_ROOT_NOPREFIX = 2, + CGRP_ROOT_XATTR = 4, + CGRP_ROOT_NS_DELEGATE = 8, + CGRP_ROOT_FAVOR_DYNMODS = 16, + CGRP_ROOT_CPUSET_V2_MODE = 65536, + CGRP_ROOT_MEMORY_LOCAL_EVENTS = 131072, + CGRP_ROOT_MEMORY_RECURSIVE_PROT = 262144, +}; + +struct cgroup_taskset { + struct list_head src_csets; + struct list_head dst_csets; + int nr_tasks; + int ssid; + struct list_head *csets; + struct css_set *cur_cset; + struct task_struct *cur_task; +}; + +struct css_task_iter { + struct cgroup_subsys *ss; + unsigned int flags; + struct list_head *cset_pos; + struct list_head *cset_head; + struct list_head *tcset_pos; + struct list_head *tcset_head; + struct list_head *task_pos; + struct list_head *cur_tasks_head; + struct css_set *cur_cset; + struct css_set *cur_dcset; + struct task_struct *cur_task; + struct list_head iters_node; +}; + +struct cgroup_fs_context { + struct kernfs_fs_context kfc; + struct cgroup_root *root; + struct cgroup_namespace *ns; + unsigned int flags; + bool cpuset_clone_children; + bool none; + bool all_ss; + u16 subsys_mask; + char *name; + char *release_agent; +}; + +struct cgroup_pidlist; + +struct cgroup_file_ctx { + struct cgroup_namespace *ns; + struct { + void *trigger; + } psi; + struct { + bool started; + struct css_task_iter iter; + } procs; + struct { + struct cgroup_pidlist *pidlist; + } procs1; +}; + +struct cgrp_cset_link { + struct cgroup *cgrp; + struct css_set *cset; + struct list_head cset_link; + struct list_head cgrp_link; +}; + +struct cgroup_mgctx { + struct list_head preloaded_src_csets; + struct list_head preloaded_dst_csets; + struct cgroup_taskset tset; + u16 ss_mask; +}; + +struct bpf_cgroup_storage_key { + __u64 cgroup_inode_id; + __u32 attach_type; + long: 32; +}; + +struct bpf_storage_buffer; + +struct bpf_cgroup_storage_map; + +struct bpf_cgroup_storage { + union { + struct bpf_storage_buffer *buf; + void *percpu_buf; + }; + struct bpf_cgroup_storage_map *map; + struct bpf_cgroup_storage_key key; + struct list_head list_map; + struct list_head list_cg; + struct rb_node node; + struct callback_head rcu; + long: 32; +}; + +struct bpf_storage_buffer { + struct callback_head rcu; + char data[0]; +}; + +struct trace_event_raw_cgroup_root { + struct trace_entry ent; + int root; + u16 ss_mask; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_cgroup { + struct trace_entry ent; + int root; + int level; + u64 id; + u32 __data_loc_path; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_cgroup_migrate { + struct trace_entry ent; + int dst_root; + int dst_level; + u64 dst_id; + int pid; + u32 __data_loc_dst_path; + u32 __data_loc_comm; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_cgroup_event { + struct trace_entry ent; + int root; + int level; + u64 id; + u32 __data_loc_path; + int val; + char __data[0]; +}; + +struct trace_event_data_offsets_cgroup_root { + u32 name; +}; + +struct trace_event_data_offsets_cgroup { + u32 path; +}; + +struct trace_event_data_offsets_cgroup_migrate { + u32 dst_path; + u32 comm; +}; + +struct trace_event_data_offsets_cgroup_event { + u32 path; +}; + +typedef void (*btf_trace_cgroup_setup_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_destroy_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_remount)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_mkdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rmdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_release)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rename)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_freeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_unfreeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_attach_task)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_transfer_tasks)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_notify_populated)(void *, struct cgroup *, const char *, int); + +typedef void (*btf_trace_cgroup_notify_frozen)(void *, struct cgroup *, const char *, int); + +enum cgroup_opt_features { + OPT_FEATURE_PRESSURE = 0, + OPT_FEATURE_COUNT = 1, +}; + +enum cgroup2_param { + Opt_nsdelegate = 0, + Opt_favordynmods = 1, + Opt_memory_localevents = 2, + Opt_memory_recursiveprot = 3, + nr__cgroup2_params = 4, +}; + +struct btf_id_set8 { + u32 cnt; + u32 flags; + struct { + u32 id; + u32 flags; + } pairs[0]; +}; + +struct btf_kfunc_id_set { + struct module *owner; + struct btf_id_set8 *set; +}; + +struct cgroupstats { + __u64 nr_sleeping; + __u64 nr_running; + __u64 nr_stopped; + __u64 nr_uninterruptible; + __u64 nr_io_wait; +}; + +enum cgroup_filetype { + CGROUP_FILE_PROCS = 0, + CGROUP_FILE_TASKS = 1, +}; + +struct cgroup_pidlist { + struct { + enum cgroup_filetype type; + struct pid_namespace *ns; + } key; + pid_t *list; + int length; + struct list_head links; + struct cgroup *owner; + struct delayed_work destroy_dwork; +}; + +enum cgroup1_param { + Opt_all = 0, + Opt_clone_children = 1, + Opt_cpuset_v2_mode = 2, + Opt_name = 3, + Opt_none = 4, + Opt_noprefix = 5, + Opt_release_agent = 6, + Opt_xattr = 7, + Opt_favordynmods___2 = 8, + Opt_nofavordynmods = 9, +}; + +enum freezer_state_flags { + CGROUP_FREEZER_ONLINE = 1, + CGROUP_FREEZING_SELF = 2, + CGROUP_FREEZING_PARENT = 4, + CGROUP_FROZEN = 8, + CGROUP_FREEZING = 6, +}; + +struct freezer { + struct cgroup_subsys_state css; + unsigned int state; + long: 32; +}; + +struct pids_cgroup { + struct cgroup_subsys_state css; + atomic64_t counter; + atomic64_t limit; + int64_t watermark; + struct cgroup_file events_file; + long: 32; + atomic64_t events_limit; +}; + +typedef struct { + char *from; + char *to; +} substring_t; + +enum rdmacg_resource_type { + RDMACG_RESOURCE_HCA_HANDLE = 0, + RDMACG_RESOURCE_HCA_OBJECT = 1, + RDMACG_RESOURCE_MAX = 2, +}; + +struct rdma_cgroup { + struct cgroup_subsys_state css; + struct list_head rpools; +}; + +struct rdmacg_device { + struct list_head dev_node; + struct list_head rpools; + char *name; +}; + +enum rdmacg_file_type { + RDMACG_RESOURCE_TYPE_MAX = 0, + RDMACG_RESOURCE_TYPE_STAT = 1, +}; + +struct rdmacg_resource { + int max; + int usage; +}; + +struct rdmacg_resource_pool { + struct rdmacg_device *device; + struct rdmacg_resource resources[2]; + struct list_head cg_node; + struct list_head dev_node; + long: 32; + u64 usage_sum; + int num_max_cnt; + long: 32; +}; + +struct root_domain; + +struct fmeter { + int cnt; + int val; + time64_t time; + spinlock_t lock; + long: 32; +}; + +enum prs_errcode { + PERR_NONE = 0, + PERR_INVCPUS = 1, + PERR_INVPARENT = 2, + PERR_NOTPART = 3, + PERR_NOTEXCL = 4, + PERR_NOCPUS = 5, + PERR_HOTPLUG = 6, + PERR_CPUSEMPTY = 7, +}; + +struct cpuset { + struct cgroup_subsys_state css; + long unsigned int flags; + cpumask_var_t cpus_allowed; + nodemask_t mems_allowed; + cpumask_var_t effective_cpus; + nodemask_t effective_mems; + cpumask_var_t subparts_cpus; + nodemask_t old_mems_allowed; + long: 32; + struct fmeter fmeter; + int attach_in_progress; + int pn; + int relax_domain_level; + int nr_subparts_cpus; + int partition_root_state; + int use_parent_ecpus; + int child_ecpus_count; + enum prs_errcode prs_err; + struct cgroup_file partition_file; + long: 32; +}; + +struct tmpmasks { + cpumask_var_t addmask; + cpumask_var_t delmask; + cpumask_var_t new_cpus; +}; + +typedef enum { + CS_ONLINE = 0, + CS_CPU_EXCLUSIVE = 1, + CS_MEM_EXCLUSIVE = 2, + CS_MEM_HARDWALL = 3, + CS_MEMORY_MIGRATE = 4, + CS_SCHED_LOAD_BALANCE = 5, + CS_SPREAD_PAGE = 6, + CS_SPREAD_SLAB = 7, +} cpuset_flagbits_t; + +enum subparts_cmd { + partcmd_enable = 0, + partcmd_disable = 1, + partcmd_update = 2, + partcmd_invalidate = 3, +}; + +struct cpuset_migrate_mm_work { + struct work_struct work; + struct mm_struct *mm; + nodemask_t from; + nodemask_t to; +}; + +typedef enum { + FILE_MEMORY_MIGRATE = 0, + FILE_CPULIST = 1, + FILE_MEMLIST = 2, + FILE_EFFECTIVE_CPULIST = 3, + FILE_EFFECTIVE_MEMLIST = 4, + FILE_SUBPARTS_CPULIST = 5, + FILE_CPU_EXCLUSIVE = 6, + FILE_MEM_EXCLUSIVE = 7, + FILE_MEM_HARDWALL = 8, + FILE_SCHED_LOAD_BALANCE = 9, + FILE_PARTITION_ROOT = 10, + FILE_SCHED_RELAX_DOMAIN_LEVEL = 11, + FILE_MEMORY_PRESSURE_ENABLED = 12, + FILE_MEMORY_PRESSURE = 13, + FILE_SPREAD_PAGE = 14, + FILE_SPREAD_SLAB = 15, +} cpuset_filetype_t; + +struct kernel_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; +}; + +enum kernel_pkey_operation { + kernel_pkey_encrypt = 0, + kernel_pkey_decrypt = 1, + kernel_pkey_sign = 2, + kernel_pkey_verify = 3, +}; + +struct kernel_pkey_params { + struct key *key; + const char *encoding; + const char *hash_algo; + char *info; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + enum kernel_pkey_operation op: 8; +}; + +struct key_preparsed_payload { + const char *orig_description; + char *description; + union key_payload payload; + const void *data; + size_t datalen; + size_t quotalen; + long: 32; + time64_t expiry; +}; + +struct key_match_data { + bool (*cmp)(const struct key *, const struct key_match_data *); + const void *raw_data; + void *preparsed; + unsigned int lookup_type; +}; + +struct idmap_key { + bool map_up; + u32 id; + u32 count; +}; + +struct ctl_path { + const char *procname; +}; + +struct cpu_stop_done { + atomic_t nr_todo; + int ret; + struct completion completion; +}; + +struct cpu_stopper { + struct task_struct *thread; + raw_spinlock_t lock; + bool enabled; + struct list_head works; + struct cpu_stop_work stop_work; + long unsigned int caller; + cpu_stop_fn_t fn; +}; + +enum multi_stop_state { + MULTI_STOP_NONE = 0, + MULTI_STOP_PREPARE = 1, + MULTI_STOP_DISABLE_IRQ = 2, + MULTI_STOP_RUN = 3, + MULTI_STOP_EXIT = 4, +}; + +struct multi_stop_data { + cpu_stop_fn_t fn; + void *data; + unsigned int num_threads; + const struct cpumask *active_cpus; + enum multi_stop_state state; + atomic_t thread_ack; +}; + +typedef int __kernel_mqd_t; + +typedef __kernel_mqd_t mqd_t; + +enum audit_state { + AUDIT_STATE_DISABLED = 0, + AUDIT_STATE_BUILD = 1, + AUDIT_STATE_RECORD = 2, +}; + +struct audit_cap_data { + kernel_cap_t permitted; + kernel_cap_t inheritable; + union { + unsigned int fE; + kernel_cap_t effective; + }; + kernel_cap_t ambient; + kuid_t rootid; +}; + +struct audit_names { + struct list_head list; + struct filename *name; + int name_len; + bool hidden; + long unsigned int ino; + dev_t dev; + umode_t mode; + kuid_t uid; + kgid_t gid; + dev_t rdev; + u32 osid; + struct audit_cap_data fcap; + unsigned int fcap_ver; + unsigned char type; + bool should_free; +}; + +struct mq_attr { + __kernel_long_t mq_flags; + __kernel_long_t mq_maxmsg; + __kernel_long_t mq_msgsize; + __kernel_long_t mq_curmsgs; + __kernel_long_t __reserved[4]; +}; + +struct open_how { + __u64 flags; + __u64 mode; + __u64 resolve; +}; + +struct audit_proctitle { + int len; + char *value; +}; + +struct audit_aux_data; + +struct __kernel_sockaddr_storage; + +struct audit_tree_refs; + +struct audit_context { + int dummy; + enum { + AUDIT_CTX_UNUSED = 0, + AUDIT_CTX_SYSCALL = 1, + AUDIT_CTX_URING = 2, + } context; + enum audit_state state; + enum audit_state current_state; + unsigned int serial; + int major; + int uring_op; + long: 32; + struct timespec64 ctime; + long unsigned int argv[4]; + long int return_code; + long: 32; + u64 prio; + int return_valid; + struct audit_names preallocated_names[5]; + int name_count; + struct list_head names_list; + char *filterkey; + struct path pwd; + struct audit_aux_data *aux; + struct audit_aux_data *aux_pids; + struct __kernel_sockaddr_storage *sockaddr; + size_t sockaddr_len; + pid_t ppid; + kuid_t uid; + kuid_t euid; + kuid_t suid; + kuid_t fsuid; + kgid_t gid; + kgid_t egid; + kgid_t sgid; + kgid_t fsgid; + long unsigned int personality; + int arch; + pid_t target_pid; + kuid_t target_auid; + kuid_t target_uid; + unsigned int target_sessionid; + u32 target_sid; + char target_comm[16]; + struct audit_tree_refs *trees; + struct audit_tree_refs *first_trees; + struct list_head killed_trees; + int tree_count; + int type; + union { + struct { + int nargs; + long int args[6]; + } socketcall; + struct { + kuid_t uid; + kgid_t gid; + umode_t mode; + u32 osid; + int has_perm; + uid_t perm_uid; + gid_t perm_gid; + umode_t perm_mode; + long unsigned int qbytes; + } ipc; + struct { + mqd_t mqdes; + struct mq_attr mqstat; + } mq_getsetattr; + struct { + mqd_t mqdes; + int sigev_signo; + } mq_notify; + struct { + mqd_t mqdes; + size_t msg_len; + unsigned int msg_prio; + long: 32; + struct timespec64 abs_timeout; + } mq_sendrecv; + struct { + int oflag; + umode_t mode; + struct mq_attr attr; + } mq_open; + struct { + pid_t pid; + struct audit_cap_data cap; + } capset; + struct { + int fd; + int flags; + } mmap; + struct open_how openat2; + struct { + int argc; + } execve; + struct { + char *name; + } module; + struct { + struct audit_ntp_data ntp_data; + struct timespec64 tk_injoffset; + } time; + }; + int fds[2]; + struct audit_proctitle proctitle; +}; + +enum audit_nlgrps { + AUDIT_NLGRP_NONE = 0, + AUDIT_NLGRP_READLOG = 1, + __AUDIT_NLGRP_MAX = 2, +}; + +struct audit_status { + __u32 mask; + __u32 enabled; + __u32 failure; + __u32 pid; + __u32 rate_limit; + __u32 backlog_limit; + __u32 lost; + __u32 backlog; + union { + __u32 version; + __u32 feature_bitmap; + }; + __u32 backlog_wait_time; + __u32 backlog_wait_time_actual; +}; + +struct audit_features { + __u32 vers; + __u32 mask; + __u32 features; + __u32 lock; +}; + +struct audit_tty_status { + __u32 enabled; + __u32 log_passwd; +}; + +struct audit_sig_info { + uid_t uid; + pid_t pid; + char ctx[0]; +}; + +enum skb_drop_reason { + SKB_NOT_DROPPED_YET = 0, + SKB_CONSUMED = 1, + SKB_DROP_REASON_NOT_SPECIFIED = 2, + SKB_DROP_REASON_NO_SOCKET = 3, + SKB_DROP_REASON_PKT_TOO_SMALL = 4, + SKB_DROP_REASON_TCP_CSUM = 5, + SKB_DROP_REASON_SOCKET_FILTER = 6, + SKB_DROP_REASON_UDP_CSUM = 7, + SKB_DROP_REASON_NETFILTER_DROP = 8, + SKB_DROP_REASON_OTHERHOST = 9, + SKB_DROP_REASON_IP_CSUM = 10, + SKB_DROP_REASON_IP_INHDR = 11, + SKB_DROP_REASON_IP_RPFILTER = 12, + SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST = 13, + SKB_DROP_REASON_XFRM_POLICY = 14, + SKB_DROP_REASON_IP_NOPROTO = 15, + SKB_DROP_REASON_SOCKET_RCVBUFF = 16, + SKB_DROP_REASON_PROTO_MEM = 17, + SKB_DROP_REASON_TCP_MD5NOTFOUND = 18, + SKB_DROP_REASON_TCP_MD5UNEXPECTED = 19, + SKB_DROP_REASON_TCP_MD5FAILURE = 20, + SKB_DROP_REASON_SOCKET_BACKLOG = 21, + SKB_DROP_REASON_TCP_FLAGS = 22, + SKB_DROP_REASON_TCP_ZEROWINDOW = 23, + SKB_DROP_REASON_TCP_OLD_DATA = 24, + SKB_DROP_REASON_TCP_OVERWINDOW = 25, + SKB_DROP_REASON_TCP_OFOMERGE = 26, + SKB_DROP_REASON_TCP_RFC7323_PAWS = 27, + SKB_DROP_REASON_TCP_INVALID_SEQUENCE = 28, + SKB_DROP_REASON_TCP_RESET = 29, + SKB_DROP_REASON_TCP_INVALID_SYN = 30, + SKB_DROP_REASON_TCP_CLOSE = 31, + SKB_DROP_REASON_TCP_FASTOPEN = 32, + SKB_DROP_REASON_TCP_OLD_ACK = 33, + SKB_DROP_REASON_TCP_TOO_OLD_ACK = 34, + SKB_DROP_REASON_TCP_ACK_UNSENT_DATA = 35, + SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE = 36, + SKB_DROP_REASON_TCP_OFO_DROP = 37, + SKB_DROP_REASON_IP_OUTNOROUTES = 38, + SKB_DROP_REASON_BPF_CGROUP_EGRESS = 39, + SKB_DROP_REASON_IPV6DISABLED = 40, + SKB_DROP_REASON_NEIGH_CREATEFAIL = 41, + SKB_DROP_REASON_NEIGH_FAILED = 42, + SKB_DROP_REASON_NEIGH_QUEUEFULL = 43, + SKB_DROP_REASON_NEIGH_DEAD = 44, + SKB_DROP_REASON_TC_EGRESS = 45, + SKB_DROP_REASON_QDISC_DROP = 46, + SKB_DROP_REASON_CPU_BACKLOG = 47, + SKB_DROP_REASON_XDP = 48, + SKB_DROP_REASON_TC_INGRESS = 49, + SKB_DROP_REASON_UNHANDLED_PROTO = 50, + SKB_DROP_REASON_SKB_CSUM = 51, + SKB_DROP_REASON_SKB_GSO_SEG = 52, + SKB_DROP_REASON_SKB_UCOPY_FAULT = 53, + SKB_DROP_REASON_DEV_HDR = 54, + SKB_DROP_REASON_DEV_READY = 55, + SKB_DROP_REASON_FULL_RING = 56, + SKB_DROP_REASON_NOMEM = 57, + SKB_DROP_REASON_HDR_TRUNC = 58, + SKB_DROP_REASON_TAP_FILTER = 59, + SKB_DROP_REASON_TAP_TXFILTER = 60, + SKB_DROP_REASON_ICMP_CSUM = 61, + SKB_DROP_REASON_INVALID_PROTO = 62, + SKB_DROP_REASON_IP_INADDRERRORS = 63, + SKB_DROP_REASON_IP_INNOROUTES = 64, + SKB_DROP_REASON_PKT_TOO_BIG = 65, + SKB_DROP_REASON_DUP_FRAG = 66, + SKB_DROP_REASON_FRAG_REASM_TIMEOUT = 67, + SKB_DROP_REASON_FRAG_TOO_FAR = 68, + SKB_DROP_REASON_TCP_MINTTL = 69, + SKB_DROP_REASON_MAX = 70, +}; + +struct __kernel_sockaddr_storage { + union { + struct { + __kernel_sa_family_t ss_family; + char __data[126]; + }; + void *__align; + }; +}; + +struct net_generic { + union { + struct { + unsigned int len; + struct callback_head rcu; + } s; + struct { + struct {} __empty_ptr; + void *ptr[0]; + }; + }; +}; + +struct pernet_operations { + struct list_head list; + int (*init)(struct net *); + void (*pre_exit)(struct net *); + void (*exit)(struct net *); + void (*exit_batch)(struct list_head *); + unsigned int *id; + size_t size; +}; + +struct scm_creds { + u32 pid; + kuid_t uid; + kgid_t gid; +}; + +struct netlink_skb_parms { + struct scm_creds creds; + __u32 portid; + __u32 dst_group; + __u32 flags; + struct sock *sk; + bool nsid_is_set; + int nsid; +}; + +struct netlink_kernel_cfg { + unsigned int groups; + unsigned int flags; + void (*input)(struct sk_buff *); + struct mutex *cb_mutex; + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); + bool (*compare)(struct net *, struct sock *); +}; + +struct audit_netlink_list { + __u32 portid; + struct net *net; + struct sk_buff_head q; +}; + +struct audit_net { + struct sock *sk; +}; + +struct auditd_connection { + struct pid *pid; + u32 portid; + struct net *net; + struct callback_head rcu; +}; + +struct audit_ctl_mutex { + struct mutex lock; + void *owner; +}; + +struct audit_buffer { + struct sk_buff *skb; + struct audit_context *ctx; + gfp_t gfp_mask; +}; + +struct audit_reply { + __u32 portid; + struct net *net; + struct sk_buff *skb; +}; + +enum { + Audit_equal = 0, + Audit_not_equal = 1, + Audit_bitmask = 2, + Audit_bittest = 3, + Audit_lt = 4, + Audit_gt = 5, + Audit_le = 6, + Audit_ge = 7, + Audit_bad = 8, +}; + +struct audit_rule_data { + __u32 flags; + __u32 action; + __u32 field_count; + __u32 mask[64]; + __u32 fields[64]; + __u32 values[64]; + __u32 fieldflags[64]; + __u32 buflen; + char buf[0]; +}; + +struct audit_field; + +struct audit_watch; + +struct audit_tree; + +struct audit_fsnotify_mark; + +struct audit_krule { + u32 pflags; + u32 flags; + u32 listnr; + u32 action; + u32 mask[64]; + u32 buflen; + u32 field_count; + char *filterkey; + struct audit_field *fields; + struct audit_field *arch_f; + struct audit_field *inode_f; + struct audit_watch *watch; + struct audit_tree *tree; + struct audit_fsnotify_mark *exe; + struct list_head rlist; + struct list_head list; + long: 32; + u64 prio; +}; + +struct audit_field { + u32 type; + union { + u32 val; + kuid_t uid; + kgid_t gid; + struct { + char *lsm_str; + void *lsm_rule; + }; + }; + u32 op; +}; + +struct audit_entry { + struct list_head list; + struct callback_head rcu; + struct audit_krule rule; +}; + +struct audit_buffer; + +typedef int __kernel_key_t; + +typedef __kernel_key_t key_t; + +struct kern_ipc_perm { + spinlock_t lock; + bool deleted; + int id; + key_t key; + kuid_t uid; + kgid_t gid; + kuid_t cuid; + kgid_t cgid; + umode_t mode; + long unsigned int seq; + void *security; + struct rhash_head khtnode; + struct callback_head rcu; + refcount_t refcount; + long: 32; +}; + +struct cpu_vfs_cap_data { + __u32 magic_etc; + kernel_cap_t permitted; + kernel_cap_t inheritable; + kuid_t rootid; +}; + +typedef struct fsnotify_mark_connector *fsnotify_connp_t; + +struct fsnotify_mark_connector { + spinlock_t lock; + short unsigned int type; + short unsigned int flags; + __kernel_fsid_t fsid; + union { + fsnotify_connp_t *obj; + struct fsnotify_mark_connector *destroy_next; + }; + struct hlist_head list; +}; + +enum auditsc_class_t { + AUDITSC_NATIVE = 0, + AUDITSC_COMPAT = 1, + AUDITSC_OPEN = 2, + AUDITSC_OPENAT = 3, + AUDITSC_SOCKETCALL = 4, + AUDITSC_EXECVE = 5, + AUDITSC_OPENAT2 = 6, + AUDITSC_NVALS = 7, +}; + +enum audit_nfcfgop { + AUDIT_XT_OP_REGISTER = 0, + AUDIT_XT_OP_REPLACE = 1, + AUDIT_XT_OP_UNREGISTER = 2, + AUDIT_NFT_OP_TABLE_REGISTER = 3, + AUDIT_NFT_OP_TABLE_UNREGISTER = 4, + AUDIT_NFT_OP_CHAIN_REGISTER = 5, + AUDIT_NFT_OP_CHAIN_UNREGISTER = 6, + AUDIT_NFT_OP_RULE_REGISTER = 7, + AUDIT_NFT_OP_RULE_UNREGISTER = 8, + AUDIT_NFT_OP_SET_REGISTER = 9, + AUDIT_NFT_OP_SET_UNREGISTER = 10, + AUDIT_NFT_OP_SETELEM_REGISTER = 11, + AUDIT_NFT_OP_SETELEM_UNREGISTER = 12, + AUDIT_NFT_OP_GEN_REGISTER = 13, + AUDIT_NFT_OP_OBJ_REGISTER = 14, + AUDIT_NFT_OP_OBJ_UNREGISTER = 15, + AUDIT_NFT_OP_OBJ_RESET = 16, + AUDIT_NFT_OP_FLOWTABLE_REGISTER = 17, + AUDIT_NFT_OP_FLOWTABLE_UNREGISTER = 18, + AUDIT_NFT_OP_INVALID = 19, +}; + +enum fsnotify_iter_type { + FSNOTIFY_ITER_TYPE_INODE = 0, + FSNOTIFY_ITER_TYPE_VFSMOUNT = 1, + FSNOTIFY_ITER_TYPE_SB = 2, + FSNOTIFY_ITER_TYPE_PARENT = 3, + FSNOTIFY_ITER_TYPE_INODE2 = 4, + FSNOTIFY_ITER_TYPE_COUNT = 5, +}; + +struct audit_aux_data { + struct audit_aux_data *next; + int type; +}; + +struct audit_chunk; + +struct audit_tree_refs { + struct audit_tree_refs *next; + struct audit_chunk *c[31]; +}; + +struct audit_aux_data_pids { + struct audit_aux_data d; + pid_t target_pid[16]; + kuid_t target_auid[16]; + kuid_t target_uid[16]; + unsigned int target_sessionid[16]; + u32 target_sid[16]; + char target_comm[256]; + int pid_count; +}; + +struct audit_aux_data_bprm_fcaps { + struct audit_aux_data d; + struct audit_cap_data fcap; + unsigned int fcap_ver; + struct audit_cap_data old_pcap; + struct audit_cap_data new_pcap; +}; + +struct audit_nfcfgop_tab { + enum audit_nfcfgop op; + const char *s; +}; + +struct audit_parent; + +struct audit_watch { + refcount_t count; + dev_t dev; + char *path; + long unsigned int ino; + struct audit_parent *parent; + struct list_head wlist; + struct list_head rules; +}; + +struct fsnotify_group; + +struct fsnotify_iter_info; + +struct fsnotify_mark; + +struct fsnotify_event; + +struct fsnotify_ops { + int (*handle_event)(struct fsnotify_group *, u32, const void *, int, struct inode *, const struct qstr *, u32, struct fsnotify_iter_info *); + int (*handle_inode_event)(struct fsnotify_mark *, u32, struct inode *, struct inode *, const struct qstr *, u32); + void (*free_group_priv)(struct fsnotify_group *); + void (*freeing_mark)(struct fsnotify_mark *, struct fsnotify_group *); + void (*free_event)(struct fsnotify_group *, struct fsnotify_event *); + void (*free_mark)(struct fsnotify_mark *); +}; + +struct inotify_group_private_data { + spinlock_t idr_lock; + struct idr idr; + struct ucounts *ucounts; +}; + +struct fanotify_group_private_data { + struct hlist_head *merge_hash; + struct list_head access_list; + wait_queue_head_t access_waitq; + int flags; + int f_flags; + struct ucounts *ucounts; + mempool_t error_events_pool; +}; + +struct fsnotify_group { + const struct fsnotify_ops *ops; + refcount_t refcnt; + spinlock_t notification_lock; + struct list_head notification_list; + wait_queue_head_t notification_waitq; + unsigned int q_len; + unsigned int max_events; + unsigned int priority; + bool shutdown; + int flags; + unsigned int owner_flags; + struct mutex mark_mutex; + atomic_t user_waits; + struct list_head marks_list; + struct fasync_struct *fsn_fa; + struct fsnotify_event *overflow_event; + struct mem_cgroup *memcg; + union { + void *private; + struct inotify_group_private_data inotify_data; + struct fanotify_group_private_data fanotify_data; + }; +}; + +struct fsnotify_iter_info { + struct fsnotify_mark *marks[5]; + struct fsnotify_group *current_group; + unsigned int report_mask; + int srcu_idx; +}; + +struct fsnotify_mark { + __u32 mask; + refcount_t refcnt; + struct fsnotify_group *group; + struct list_head g_list; + spinlock_t lock; + struct hlist_node obj_list; + struct fsnotify_mark_connector *connector; + __u32 ignore_mask; + unsigned int flags; +}; + +struct fsnotify_event { + struct list_head list; +}; + +enum fsnotify_obj_type { + FSNOTIFY_OBJ_TYPE_ANY = 4294967295, + FSNOTIFY_OBJ_TYPE_INODE = 0, + FSNOTIFY_OBJ_TYPE_VFSMOUNT = 1, + FSNOTIFY_OBJ_TYPE_SB = 2, + FSNOTIFY_OBJ_TYPE_COUNT = 3, + FSNOTIFY_OBJ_TYPE_DETACHED = 3, +}; + +struct audit_parent { + struct list_head watches; + struct fsnotify_mark mark; +}; + +struct audit_fsnotify_mark { + dev_t dev; + long unsigned int ino; + char *path; + struct fsnotify_mark mark; + struct audit_krule *rule; +}; + +struct audit_chunk; + +struct audit_tree { + refcount_t count; + int goner; + struct audit_chunk *root; + struct list_head chunks; + struct list_head rules; + struct list_head list; + struct list_head same_root; + struct callback_head head; + char pathname[0]; +}; + +struct audit_node { + struct list_head list; + struct audit_tree *owner; + unsigned int index; +}; + +struct audit_chunk { + struct list_head hash; + long unsigned int key; + struct fsnotify_mark *mark; + struct list_head trees; + int count; + atomic_long_t refs; + struct callback_head head; + struct audit_node owners[0]; +}; + +struct audit_tree_mark { + struct fsnotify_mark mark; + struct audit_chunk *chunk; +}; + +enum { + HASH_SIZE = 128, +}; + +struct kprobe_blacklist_entry { + struct list_head list; + long unsigned int start_addr; + long unsigned int end_addr; +}; + +enum perf_record_ksymbol_type { + PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, + PERF_RECORD_KSYMBOL_TYPE_BPF = 1, + PERF_RECORD_KSYMBOL_TYPE_OOL = 2, + PERF_RECORD_KSYMBOL_TYPE_MAX = 3, +}; + +struct kprobe_insn_page { + struct list_head list; + kprobe_opcode_t *insns; + struct kprobe_insn_cache *cache; + int nused; + int ngarbage; + char slot_used[0]; +}; + +enum kprobe_slot_state { + SLOT_CLEAN = 0, + SLOT_DIRTY = 1, + SLOT_USED = 2, +}; + +struct seccomp_notif_sizes { + __u16 seccomp_notif; + __u16 seccomp_notif_resp; + __u16 seccomp_data; +}; + +struct seccomp_notif { + __u64 id; + __u32 pid; + __u32 flags; + struct seccomp_data data; +}; + +struct seccomp_notif_resp { + __u64 id; + __s64 val; + __s32 error; + __u32 flags; +}; + +struct seccomp_notif_addfd { + __u64 id; + __u32 flags; + __u32 srcfd; + __u32 newfd; + __u32 newfd_flags; +}; + +struct action_cache { + long unsigned int allow_native[15]; +}; + +struct notification; + +struct seccomp_filter { + refcount_t refs; + refcount_t users; + bool log; + bool wait_killable_recv; + struct action_cache cache; + struct seccomp_filter *prev; + struct bpf_prog *prog; + struct notification *notif; + struct mutex notify_lock; + wait_queue_head_t wqh; +}; + +struct seccomp_metadata { + __u64 filter_off; + __u64 flags; +}; + +struct sock_fprog { + short unsigned int len; + struct sock_filter *filter; +}; + +typedef unsigned int (*bpf_func_t)(const void *, const struct bpf_insn *); + +typedef unsigned int (*bpf_dispatcher_fn)(const void *, const struct bpf_insn *, unsigned int (*)(const void *, const struct bpf_insn *)); + +typedef int (*bpf_aux_classic_check_t)(struct sock_filter *, unsigned int); + +enum notify_state { + SECCOMP_NOTIFY_INIT = 0, + SECCOMP_NOTIFY_SENT = 1, + SECCOMP_NOTIFY_REPLIED = 2, +}; + +struct seccomp_knotif { + struct task_struct *task; + long: 32; + u64 id; + const struct seccomp_data *data; + enum notify_state state; + int error; + long int val; + u32 flags; + struct completion ready; + struct list_head list; + struct list_head addfd; + long: 32; +}; + +struct seccomp_kaddfd { + struct file *file; + int fd; + unsigned int flags; + __u32 ioctl_flags; + union { + bool setfd; + int ret; + }; + struct completion completion; + struct list_head list; +}; + +struct notification { + struct semaphore request; + u64 next_id; + struct list_head notifications; +}; + +struct seccomp_log_name { + u32 log; + const char *name; +}; + +struct rchan; + +struct rchan_buf { + void *start; + void *data; + size_t offset; + size_t subbufs_produced; + size_t subbufs_consumed; + struct rchan *chan; + wait_queue_head_t read_wait; + struct irq_work wakeup_work; + struct dentry *dentry; + struct kref kref; + struct page **page_array; + unsigned int page_count; + unsigned int finalized; + size_t *padding; + size_t prev_padding; + size_t bytes_consumed; + size_t early_bytes; + unsigned int cpu; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct rchan_callbacks; + +struct rchan { + u32 version; + size_t subbuf_size; + size_t n_subbufs; + size_t alloc_size; + const struct rchan_callbacks *cb; + struct kref kref; + void *private_data; + size_t last_toobig; + struct rchan_buf **buf; + int is_global; + struct list_head list; + struct dentry *parent; + int has_base_filename; + char base_filename[255]; +}; + +struct rchan_callbacks { + int (*subbuf_start)(struct rchan_buf *, void *, void *, size_t); + struct dentry * (*create_buf_file)(const char *, struct dentry *, umode_t, struct rchan_buf *, int *); + int (*remove_buf_file)(struct dentry *); +}; + +struct partial_page { + unsigned int offset; + unsigned int len; + long unsigned int private; +}; + +struct splice_pipe_desc { + struct page **pages; + struct partial_page *partial; + int nr_pages; + unsigned int nr_pages_max; + const struct pipe_buf_operations *ops; + void (*spd_release)(struct splice_pipe_desc *, unsigned int); +}; + +struct rchan_percpu_buf_dispatcher { + struct rchan_buf *buf; + struct dentry *dentry; +}; + +enum { + TASKSTATS_TYPE_UNSPEC = 0, + TASKSTATS_TYPE_PID = 1, + TASKSTATS_TYPE_TGID = 2, + TASKSTATS_TYPE_STATS = 3, + TASKSTATS_TYPE_AGGR_PID = 4, + TASKSTATS_TYPE_AGGR_TGID = 5, + TASKSTATS_TYPE_NULL = 6, + __TASKSTATS_TYPE_MAX = 7, +}; + +enum { + TASKSTATS_CMD_ATTR_UNSPEC = 0, + TASKSTATS_CMD_ATTR_PID = 1, + TASKSTATS_CMD_ATTR_TGID = 2, + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 3, + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 4, + __TASKSTATS_CMD_ATTR_MAX = 5, +}; + +enum { + CGROUPSTATS_CMD_UNSPEC = 3, + CGROUPSTATS_CMD_GET = 4, + CGROUPSTATS_CMD_NEW = 5, + __CGROUPSTATS_CMD_MAX = 6, +}; + +enum { + CGROUPSTATS_TYPE_UNSPEC = 0, + CGROUPSTATS_TYPE_CGROUP_STATS = 1, + __CGROUPSTATS_TYPE_MAX = 2, +}; + +enum { + CGROUPSTATS_CMD_ATTR_UNSPEC = 0, + CGROUPSTATS_CMD_ATTR_FD = 1, + __CGROUPSTATS_CMD_ATTR_MAX = 2, +}; + +struct genlmsghdr { + __u8 cmd; + __u8 version; + __u16 reserved; +}; + +enum { + NLA_UNSPEC = 0, + NLA_U8 = 1, + NLA_U16 = 2, + NLA_U32 = 3, + NLA_U64 = 4, + NLA_STRING = 5, + NLA_FLAG = 6, + NLA_MSECS = 7, + NLA_NESTED = 8, + NLA_NESTED_ARRAY = 9, + NLA_NUL_STRING = 10, + NLA_BINARY = 11, + NLA_S8 = 12, + NLA_S16 = 13, + NLA_S32 = 14, + NLA_S64 = 15, + NLA_BITFIELD32 = 16, + NLA_REJECT = 17, + NLA_BE16 = 18, + NLA_BE32 = 19, + __NLA_TYPE_MAX = 20, +}; + +struct genl_multicast_group { + char name[16]; + u8 flags; +}; + +struct genl_split_ops; + +struct genl_info; + +struct genl_ops; + +struct genl_small_ops; + +struct genl_family { + unsigned int hdrsize; + char name[16]; + unsigned int version; + unsigned int maxattr; + u8 netnsok: 1; + u8 parallel_ops: 1; + u8 n_ops; + u8 n_small_ops; + u8 n_split_ops; + u8 n_mcgrps; + u8 resv_start_op; + const struct nla_policy *policy; + int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + const struct genl_ops *ops; + const struct genl_small_ops *small_ops; + const struct genl_split_ops *split_ops; + const struct genl_multicast_group *mcgrps; + struct module *module; + int id; + unsigned int mcgrp_offset; +}; + +struct genl_split_ops { + union { + struct { + int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + int (*doit)(struct sk_buff *, struct genl_info *); + void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + }; + struct { + int (*start)(struct netlink_callback *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + }; + }; + const struct nla_policy *policy; + unsigned int maxattr; + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genl_info { + u32 snd_seq; + u32 snd_portid; + struct nlmsghdr *nlhdr; + struct genlmsghdr *genlhdr; + void *userhdr; + struct nlattr **attrs; + possible_net_t _net; + void *user_ptr[2]; + struct netlink_ext_ack *extack; +}; + +struct genl_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*start)(struct netlink_callback *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + const struct nla_policy *policy; + unsigned int maxattr; + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genl_small_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +enum genl_validate_flags { + GENL_DONT_VALIDATE_STRICT = 1, + GENL_DONT_VALIDATE_DUMP = 2, + GENL_DONT_VALIDATE_DUMP_STRICT = 4, +}; + +struct listener { + struct list_head list; + pid_t pid; + char valid; +}; + +struct listener_list { + struct rw_semaphore sem; + struct list_head list; +}; + +enum actions { + REGISTER = 0, + DEREGISTER = 1, + CPU_DONT_CARE = 2, +}; + +struct tp_module { + struct list_head list; + struct module *mod; +}; + +enum tp_func_state { + TP_FUNC_0 = 0, + TP_FUNC_1 = 1, + TP_FUNC_2 = 2, + TP_FUNC_N = 3, +}; + +enum tp_transition_sync { + TP_TRANSITION_SYNC_1_0_1 = 0, + TP_TRANSITION_SYNC_N_2_1 = 1, + _NR_TP_TRANSITION_SYNC = 2, +}; + +struct tp_transition_snapshot { + long unsigned int rcu; + long unsigned int srcu; + bool ongoing; +}; + +struct tp_probes { + struct callback_head rcu; + struct tracepoint_func probes[0]; +}; + +enum { + TRACE_FTRACE_BIT = 0, + TRACE_FTRACE_NMI_BIT = 1, + TRACE_FTRACE_IRQ_BIT = 2, + TRACE_FTRACE_SIRQ_BIT = 3, + TRACE_FTRACE_TRANSITION_BIT = 4, + TRACE_INTERNAL_BIT = 5, + TRACE_INTERNAL_NMI_BIT = 6, + TRACE_INTERNAL_IRQ_BIT = 7, + TRACE_INTERNAL_SIRQ_BIT = 8, + TRACE_INTERNAL_TRANSITION_BIT = 9, + TRACE_BRANCH_BIT = 10, + TRACE_IRQ_BIT = 11, + TRACE_GRAPH_BIT = 12, + TRACE_GRAPH_DEPTH_START_BIT = 13, + TRACE_GRAPH_DEPTH_END_BIT = 14, + TRACE_GRAPH_NOTRACE_BIT = 15, + TRACE_RECORD_RECURSION_BIT = 16, +}; + +enum { + TRACE_CTX_NMI = 0, + TRACE_CTX_IRQ = 1, + TRACE_CTX_SOFTIRQ = 2, + TRACE_CTX_NORMAL = 3, + TRACE_CTX_TRANSITION = 4, +}; + +enum { + FTRACE_OPS_FL_ENABLED = 1, + FTRACE_OPS_FL_DYNAMIC = 2, + FTRACE_OPS_FL_SAVE_REGS = 4, + FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED = 8, + FTRACE_OPS_FL_RECURSION = 16, + FTRACE_OPS_FL_STUB = 32, + FTRACE_OPS_FL_INITIALIZED = 64, + FTRACE_OPS_FL_DELETED = 128, + FTRACE_OPS_FL_ADDING = 256, + FTRACE_OPS_FL_REMOVING = 512, + FTRACE_OPS_FL_MODIFYING = 1024, + FTRACE_OPS_FL_ALLOC_TRAMP = 2048, + FTRACE_OPS_FL_IPMODIFY = 4096, + FTRACE_OPS_FL_PID = 8192, + FTRACE_OPS_FL_RCU = 16384, + FTRACE_OPS_FL_TRACE_ARRAY = 32768, + FTRACE_OPS_FL_PERMANENT = 65536, + FTRACE_OPS_FL_DIRECT = 131072, +}; + +struct ftrace_hash { + long unsigned int size_bits; + struct hlist_head *buckets; + long unsigned int count; + long unsigned int flags; + struct callback_head rcu; +}; + +struct ftrace_func_entry { + struct hlist_node hlist; + long unsigned int ip; + long unsigned int direct; +}; + +enum ftrace_bug_type { + FTRACE_BUG_UNKNOWN = 0, + FTRACE_BUG_INIT = 1, + FTRACE_BUG_NOP = 2, + FTRACE_BUG_CALL = 3, + FTRACE_BUG_UPDATE = 4, +}; + +enum { + FTRACE_FL_ENABLED = 2147483648, + FTRACE_FL_REGS = 1073741824, + FTRACE_FL_REGS_EN = 536870912, + FTRACE_FL_TRAMP = 268435456, + FTRACE_FL_TRAMP_EN = 134217728, + FTRACE_FL_IPMODIFY = 67108864, + FTRACE_FL_DISABLED = 33554432, + FTRACE_FL_DIRECT = 16777216, + FTRACE_FL_DIRECT_EN = 8388608, +}; + +enum { + FTRACE_UPDATE_CALLS = 1, + FTRACE_DISABLE_CALLS = 2, + FTRACE_UPDATE_TRACE_FUNC = 4, + FTRACE_START_FUNC_RET = 8, + FTRACE_STOP_FUNC_RET = 16, + FTRACE_MAY_SLEEP = 32, +}; + +enum { + FTRACE_UPDATE_IGNORE = 0, + FTRACE_UPDATE_MAKE_CALL = 1, + FTRACE_UPDATE_MODIFY_CALL = 2, + FTRACE_UPDATE_MAKE_NOP = 3, +}; + +enum { + FTRACE_ITER_FILTER = 1, + FTRACE_ITER_NOTRACE = 2, + FTRACE_ITER_PRINTALL = 4, + FTRACE_ITER_DO_PROBES = 8, + FTRACE_ITER_PROBE = 16, + FTRACE_ITER_MOD = 32, + FTRACE_ITER_ENABLED = 64, +}; + +struct prog_entry; + +struct event_filter { + struct prog_entry *prog; + char *filter_string; +}; + +struct trace_array_cpu; + +struct array_buffer { + struct trace_array *tr; + struct trace_buffer *buffer; + struct trace_array_cpu *data; + long: 32; + u64 time_start; + int cpu; + long: 32; +}; + +struct trace_pid_list; + +struct trace_options; + +struct cond_snapshot; + +struct trace_func_repeats; + +struct trace_array { + struct list_head list; + char *name; + long: 32; + struct array_buffer array_buffer; + struct array_buffer max_buffer; + bool allocated_snapshot; + long unsigned int max_latency; + struct dentry *d_max_latency; + struct work_struct fsnotify_work; + struct irq_work fsnotify_irqwork; + struct trace_pid_list *filtered_pids; + struct trace_pid_list *filtered_no_pids; + arch_spinlock_t max_lock; + int buffer_disabled; + int sys_refcount_enter; + int sys_refcount_exit; + struct trace_event_file *enter_syscall_files[452]; + struct trace_event_file *exit_syscall_files[452]; + int stop_count; + int clock_id; + int nr_topts; + bool clear_trace; + int buffer_percent; + unsigned int n_err_log_entries; + struct tracer *current_trace; + unsigned int trace_flags; + unsigned char trace_flags_index[32]; + unsigned int flags; + raw_spinlock_t start_lock; + struct list_head err_log; + struct dentry *dir; + struct dentry *options; + struct dentry *percpu_dir; + struct dentry *event_dir; + struct trace_options *topts; + struct list_head systems; + struct list_head events; + struct trace_event_file *trace_marker_file; + cpumask_var_t tracing_cpumask; + int ref; + int trace_ref; + struct ftrace_ops *ops; + struct trace_pid_list *function_pids; + struct trace_pid_list *function_no_pids; + struct list_head func_probes; + struct list_head mod_trace; + struct list_head mod_notrace; + int function_enabled; + int no_filter_buffering_ref; + struct list_head hist_vars; + struct cond_snapshot *cond_snapshot; + struct trace_func_repeats *last_func_repeats; + long: 32; +}; + +struct tracer_flags; + +struct tracer { + const char *name; + int (*init)(struct trace_array *); + void (*reset)(struct trace_array *); + void (*start)(struct trace_array *); + void (*stop)(struct trace_array *); + int (*update_thresh)(struct trace_array *); + void (*open)(struct trace_iterator *); + void (*pipe_open)(struct trace_iterator *); + void (*close)(struct trace_iterator *); + void (*pipe_close)(struct trace_iterator *); + ssize_t (*read)(struct trace_iterator *, struct file *, char *, size_t, loff_t *); + ssize_t (*splice_read)(struct trace_iterator *, struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + void (*print_header)(struct seq_file *); + enum print_line_t (*print_line)(struct trace_iterator *); + int (*set_flag)(struct trace_array *, u32, u32, int); + int (*flag_changed)(struct trace_array *, u32, int); + struct tracer *next; + struct tracer_flags *flags; + int enabled; + bool print_max; + bool allow_instances; + bool use_max_tr; + bool noboot; +}; + +struct event_subsystem; + +struct trace_subsystem_dir { + struct list_head list; + struct event_subsystem *subsystem; + struct trace_array *tr; + struct dentry *entry; + int ref_count; + int nr_events; +}; + +union lower_chunk { + union lower_chunk *next; + long unsigned int data[512]; +}; + +union upper_chunk { + union upper_chunk *next; + union lower_chunk *data[256]; +}; + +struct trace_pid_list { + raw_spinlock_t lock; + struct irq_work refill_irqwork; + union upper_chunk *upper[256]; + union upper_chunk *upper_list; + union lower_chunk *lower_list; + int free_upper_chunks; + int free_lower_chunks; +}; + +struct trace_array_cpu { + atomic_t disabled; + void *buffer_page; + long unsigned int entries; + long unsigned int saved_latency; + long unsigned int critical_start; + long unsigned int critical_end; + long unsigned int critical_sequence; + long unsigned int nice; + long unsigned int policy; + long unsigned int rt_priority; + long unsigned int skipped_entries; + long: 32; + u64 preempt_timestamp; + pid_t pid; + kuid_t uid; + char comm[16]; + int ftrace_ignore_pid; + bool ignore_pid; +}; + +struct trace_option_dentry; + +struct trace_options { + struct tracer *tracer; + struct trace_option_dentry *topts; +}; + +struct tracer_opt; + +struct trace_option_dentry { + struct tracer_opt *opt; + struct tracer_flags *flags; + struct trace_array *tr; + struct dentry *entry; +}; + +enum { + TRACE_PIDS = 1, + TRACE_NO_PIDS = 2, +}; + +typedef bool (*cond_update_fn_t)(struct trace_array *, void *); + +struct cond_snapshot { + void *cond_data; + cond_update_fn_t update; +}; + +struct trace_func_repeats { + long unsigned int ip; + long unsigned int parent_ip; + long unsigned int count; + long: 32; + u64 ts_last_call; +}; + +enum { + TRACE_ARRAY_FL_GLOBAL = 1, +}; + +struct tracer_opt { + const char *name; + u32 bit; +}; + +struct tracer_flags { + u32 val; + struct tracer_opt *opts; + struct tracer *trace; +}; + +struct ftrace_mod_load { + struct list_head list; + char *func; + char *module; + int enable; +}; + +enum { + FTRACE_HASH_FL_MOD = 1, +}; + +struct ftrace_func_command { + struct list_head list; + char *name; + int (*func)(struct trace_array *, struct ftrace_hash *, char *, char *, char *, int); +}; + +struct ftrace_probe_ops { + void (*func)(long unsigned int, long unsigned int, struct trace_array *, struct ftrace_probe_ops *, void *); + int (*init)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *, void **); + void (*free)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *); + int (*print)(struct seq_file *, long unsigned int, struct ftrace_probe_ops *, void *); +}; + +typedef int (*ftrace_mapper_func)(void *); + +struct trace_parser { + bool cont; + char *buffer; + unsigned int idx; + unsigned int size; +}; + +enum trace_iterator_bits { + TRACE_ITER_PRINT_PARENT_BIT = 0, + TRACE_ITER_SYM_OFFSET_BIT = 1, + TRACE_ITER_SYM_ADDR_BIT = 2, + TRACE_ITER_VERBOSE_BIT = 3, + TRACE_ITER_RAW_BIT = 4, + TRACE_ITER_HEX_BIT = 5, + TRACE_ITER_BIN_BIT = 6, + TRACE_ITER_BLOCK_BIT = 7, + TRACE_ITER_PRINTK_BIT = 8, + TRACE_ITER_ANNOTATE_BIT = 9, + TRACE_ITER_USERSTACKTRACE_BIT = 10, + TRACE_ITER_SYM_USEROBJ_BIT = 11, + TRACE_ITER_PRINTK_MSGONLY_BIT = 12, + TRACE_ITER_CONTEXT_INFO_BIT = 13, + TRACE_ITER_LATENCY_FMT_BIT = 14, + TRACE_ITER_RECORD_CMD_BIT = 15, + TRACE_ITER_RECORD_TGID_BIT = 16, + TRACE_ITER_OVERWRITE_BIT = 17, + TRACE_ITER_STOP_ON_FREE_BIT = 18, + TRACE_ITER_IRQ_INFO_BIT = 19, + TRACE_ITER_MARKERS_BIT = 20, + TRACE_ITER_EVENT_FORK_BIT = 21, + TRACE_ITER_PAUSE_ON_TRACE_BIT = 22, + TRACE_ITER_HASH_PTR_BIT = 23, + TRACE_ITER_FUNCTION_BIT = 24, + TRACE_ITER_FUNC_FORK_BIT = 25, + TRACE_ITER_DISPLAY_GRAPH_BIT = 26, + TRACE_ITER_STACKTRACE_BIT = 27, + TRACE_ITER_LAST_BIT = 28, +}; + +struct event_subsystem { + struct list_head list; + const char *name; + struct event_filter *filter; + int ref_count; +}; + +enum regex_type { + MATCH_FULL = 0, + MATCH_FRONT_ONLY = 1, + MATCH_MIDDLE_ONLY = 2, + MATCH_END_ONLY = 3, + MATCH_GLOB = 4, + MATCH_INDEX = 5, +}; + +enum { + FTRACE_MODIFY_ENABLE_FL = 1, + FTRACE_MODIFY_MAY_SLEEP_FL = 2, +}; + +struct ftrace_func_probe { + struct ftrace_probe_ops *probe_ops; + struct ftrace_ops ops; + struct trace_array *tr; + struct list_head list; + void *data; + int ref; +}; + +struct ftrace_page { + struct ftrace_page *next; + struct dyn_ftrace *records; + int index; + int order; +}; + +struct ftrace_rec_iter { + struct ftrace_page *pg; + int index; +}; + +struct ftrace_iterator { + loff_t pos; + loff_t func_pos; + loff_t mod_pos; + struct ftrace_page *pg; + struct dyn_ftrace *func; + struct ftrace_func_probe *probe; + struct ftrace_func_entry *probe_entry; + struct trace_parser parser; + struct ftrace_hash *hash; + struct ftrace_ops *ops; + struct trace_array *tr; + struct list_head *mod_list; + int pidx; + int idx; + unsigned int flags; + long: 32; +}; + +struct ftrace_glob { + char *search; + unsigned int len; + int type; +}; + +struct ftrace_func_map { + struct ftrace_func_entry entry; + void *data; +}; + +struct ftrace_func_mapper { + struct ftrace_hash hash; +}; + +enum graph_filter_type { + GRAPH_FILTER_NOTRACE = 0, + GRAPH_FILTER_FUNCTION = 1, +}; + +struct ftrace_graph_data { + struct ftrace_hash *hash; + struct ftrace_func_entry *entry; + int idx; + enum graph_filter_type type; + struct ftrace_hash *new_hash; + const struct seq_operations *seq_ops; + struct trace_parser parser; +}; + +struct ftrace_mod_func { + struct list_head list; + char *name; + long unsigned int ip; + unsigned int size; +}; + +struct ftrace_mod_map { + struct callback_head rcu; + struct list_head list; + struct module *mod; + long unsigned int start_addr; + long unsigned int end_addr; + struct list_head funcs; + unsigned int num_funcs; +}; + +struct ftrace_init_func { + struct list_head list; + long unsigned int ip; +}; + +struct kallsyms_data { + long unsigned int *addrs; + const char **syms; + size_t cnt; + size_t found; +}; + +enum ring_buffer_type { + RINGBUF_TYPE_DATA_TYPE_LEN_MAX = 28, + RINGBUF_TYPE_PADDING = 29, + RINGBUF_TYPE_TIME_EXTEND = 30, + RINGBUF_TYPE_TIME_STAMP = 31, +}; + +enum ring_buffer_flags { + RB_FL_OVERWRITE = 1, +}; + +struct ring_buffer_per_cpu; + +struct buffer_page; + +struct ring_buffer_iter { + struct ring_buffer_per_cpu *cpu_buffer; + long unsigned int head; + long unsigned int next_event; + struct buffer_page *head_page; + struct buffer_page *cache_reader_page; + long unsigned int cache_read; + u64 read_stamp; + u64 page_stamp; + struct ring_buffer_event *event; + int missed_events; +}; + +struct rb_irq_work { + struct irq_work work; + wait_queue_head_t waiters; + wait_queue_head_t full_waiters; + long int wait_index; + bool waiters_pending; + bool full_waiters_pending; + bool wakeup_full; +}; + +struct trace_buffer { + unsigned int flags; + int cpus; + atomic_t record_disabled; + cpumask_var_t cpumask; + struct lock_class_key *reader_lock_key; + struct mutex mutex; + struct ring_buffer_per_cpu **buffers; + struct hlist_node node; + u64 (*clock)(); + struct rb_irq_work irq_work; + bool time_stamp_abs; +}; + +enum { + RB_LEN_TIME_EXTEND = 8, + RB_LEN_TIME_STAMP = 8, +}; + +struct buffer_data_page { + u64 time_stamp; + local_t commit; + unsigned char data[0]; + long: 32; +}; + +struct buffer_page { + struct list_head list; + local_t write; + unsigned int read; + local_t entries; + long unsigned int real_end; + struct buffer_data_page *page; +}; + +struct rb_event_info { + u64 ts; + u64 delta; + u64 before; + u64 after; + long unsigned int length; + struct buffer_page *tail_page; + int add_timestamp; + long: 32; +}; + +enum { + RB_ADD_STAMP_NONE = 0, + RB_ADD_STAMP_EXTEND = 2, + RB_ADD_STAMP_ABSOLUTE = 4, + RB_ADD_STAMP_FORCE = 8, +}; + +enum { + RB_CTX_TRANSITION = 0, + RB_CTX_NMI = 1, + RB_CTX_IRQ = 2, + RB_CTX_SOFTIRQ = 3, + RB_CTX_NORMAL = 4, + RB_CTX_MAX = 5, +}; + +struct rb_time_struct { + local_t cnt; + local_t top; + local_t bottom; + local_t msb; +}; + +typedef struct rb_time_struct rb_time_t; + +struct ring_buffer_per_cpu { + int cpu; + atomic_t record_disabled; + atomic_t resize_disabled; + struct trace_buffer *buffer; + raw_spinlock_t reader_lock; + arch_spinlock_t lock; + struct lock_class_key lock_key; + struct buffer_data_page *free_page; + long unsigned int nr_pages; + unsigned int current_context; + struct list_head *pages; + struct buffer_page *head_page; + struct buffer_page *tail_page; + struct buffer_page *commit_page; + struct buffer_page *reader_page; + long unsigned int lost_events; + long unsigned int last_overrun; + long unsigned int nest; + local_t entries_bytes; + local_t entries; + local_t overrun; + local_t commit_overrun; + local_t dropped_events; + local_t committing; + local_t commits; + local_t pages_touched; + local_t pages_lost; + local_t pages_read; + long int last_pages_touch; + size_t shortest_full; + long unsigned int read; + long unsigned int read_bytes; + rb_time_t write_stamp; + rb_time_t before_stamp; + long: 32; + u64 event_stamp[5]; + u64 read_stamp; + long int nr_pages_to_update; + struct list_head new_pages; + struct work_struct update_pages_work; + struct completion update_done; + struct rb_irq_work irq_work; + long: 32; +}; + +typedef struct vfsmount * (*debugfs_automount_t)(struct dentry *, void *); + +struct trace_export { + struct trace_export *next; + void (*write)(struct trace_export *, const void *, unsigned int); + int flags; +}; + +enum fsnotify_data_type { + FSNOTIFY_EVENT_NONE = 0, + FSNOTIFY_EVENT_PATH = 1, + FSNOTIFY_EVENT_INODE = 2, + FSNOTIFY_EVENT_DENTRY = 3, + FSNOTIFY_EVENT_ERROR = 4, +}; + +enum trace_iter_flags { + TRACE_FILE_LAT_FMT = 1, + TRACE_FILE_ANNOTATE = 2, + TRACE_FILE_TIME_IN_NS = 4, +}; + +enum trace_flag_type { + TRACE_FLAG_IRQS_OFF = 1, + TRACE_FLAG_IRQS_NOSUPPORT = 2, + TRACE_FLAG_NEED_RESCHED = 4, + TRACE_FLAG_HARDIRQ = 8, + TRACE_FLAG_SOFTIRQ = 16, + TRACE_FLAG_PREEMPT_RESCHED = 32, + TRACE_FLAG_NMI = 64, + TRACE_FLAG_BH_OFF = 128, +}; + +enum event_trigger_type { + ETT_NONE = 0, + ETT_TRACE_ONOFF = 1, + ETT_SNAPSHOT = 2, + ETT_STACKTRACE = 4, + ETT_EVENT_ENABLE = 8, + ETT_EVENT_HIST = 16, + ETT_HIST_ENABLE = 32, + ETT_EVENT_EPROBE = 64, +}; + +enum trace_type { + __TRACE_FIRST_TYPE = 0, + TRACE_FN = 1, + TRACE_CTX = 2, + TRACE_WAKE = 3, + TRACE_STACK = 4, + TRACE_PRINT = 5, + TRACE_BPRINT = 6, + TRACE_MMIO_RW = 7, + TRACE_MMIO_MAP = 8, + TRACE_BRANCH = 9, + TRACE_GRAPH_RET = 10, + TRACE_GRAPH_ENT = 11, + TRACE_USER_STACK = 12, + TRACE_BLK = 13, + TRACE_BPUTS = 14, + TRACE_HWLAT = 15, + TRACE_OSNOISE = 16, + TRACE_TIMERLAT = 17, + TRACE_RAW_DATA = 18, + TRACE_FUNC_REPEATS = 19, + __TRACE_LAST_TYPE = 20, +}; + +struct ftrace_entry { + struct trace_entry ent; + long unsigned int ip; + long unsigned int parent_ip; +}; + +struct stack_entry { + struct trace_entry ent; + int size; + long unsigned int caller[8]; +}; + +struct bprint_entry { + struct trace_entry ent; + long unsigned int ip; + const char *fmt; + u32 buf[0]; +}; + +struct print_entry { + struct trace_entry ent; + long unsigned int ip; + char buf[0]; +}; + +struct raw_data_entry { + struct trace_entry ent; + unsigned int id; + char buf[0]; +}; + +struct bputs_entry { + struct trace_entry ent; + long unsigned int ip; + const char *str; +}; + +struct func_repeats_entry { + struct trace_entry ent; + long unsigned int ip; + long unsigned int parent_ip; + u16 count; + u16 top_delta_ts; + u32 bottom_delta_ts; +}; + +enum trace_iterator_flags { + TRACE_ITER_PRINT_PARENT = 1, + TRACE_ITER_SYM_OFFSET = 2, + TRACE_ITER_SYM_ADDR = 4, + TRACE_ITER_VERBOSE = 8, + TRACE_ITER_RAW = 16, + TRACE_ITER_HEX = 32, + TRACE_ITER_BIN = 64, + TRACE_ITER_BLOCK = 128, + TRACE_ITER_PRINTK = 256, + TRACE_ITER_ANNOTATE = 512, + TRACE_ITER_USERSTACKTRACE = 1024, + TRACE_ITER_SYM_USEROBJ = 2048, + TRACE_ITER_PRINTK_MSGONLY = 4096, + TRACE_ITER_CONTEXT_INFO = 8192, + TRACE_ITER_LATENCY_FMT = 16384, + TRACE_ITER_RECORD_CMD = 32768, + TRACE_ITER_RECORD_TGID = 65536, + TRACE_ITER_OVERWRITE = 131072, + TRACE_ITER_STOP_ON_FREE = 262144, + TRACE_ITER_IRQ_INFO = 524288, + TRACE_ITER_MARKERS = 1048576, + TRACE_ITER_EVENT_FORK = 2097152, + TRACE_ITER_PAUSE_ON_TRACE = 4194304, + TRACE_ITER_HASH_PTR = 8388608, + TRACE_ITER_FUNCTION = 16777216, + TRACE_ITER_FUNC_FORK = 33554432, + TRACE_ITER_DISPLAY_GRAPH = 67108864, + TRACE_ITER_STACKTRACE = 134217728, +}; + +struct trace_min_max_param { + struct mutex *lock; + u64 *val; + u64 *min; + u64 *max; +}; + +struct saved_cmdlines_buffer { + unsigned int map_pid_to_cmdline[32769]; + unsigned int *map_cmdline_to_pid; + unsigned int cmdline_num; + int cmdline_idx; + char *saved_cmdlines; +}; + +struct ftrace_stack { + long unsigned int calls[1024]; +}; + +struct ftrace_stacks { + struct ftrace_stack stacks[4]; +}; + +struct trace_buffer_struct { + int nesting; + char buffer[4096]; +}; + +struct ftrace_buffer_info { + struct trace_iterator iter; + void *spare; + unsigned int spare_cpu; + unsigned int read; + long: 32; +}; + +struct err_info { + const char **errs; + u8 type; + u16 pos; + u64 ts; +}; + +struct tracing_log_err { + struct list_head list; + struct err_info info; + char loc[128]; + char *cmd; + long: 32; +}; + +struct buffer_ref { + struct trace_buffer *buffer; + void *page; + int cpu; + refcount_t refcount; +}; + +struct ftrace_func_mapper; + +struct trace_print_flags_u64 { + long long unsigned int mask; + const char *name; + long: 32; +}; + +struct ctx_switch_entry { + struct trace_entry ent; + unsigned int prev_pid; + unsigned int next_pid; + unsigned int next_cpu; + unsigned char prev_prio; + unsigned char prev_state; + unsigned char next_prio; + unsigned char next_state; +}; + +struct userstack_entry { + struct trace_entry ent; + unsigned int tgid; + long unsigned int caller[8]; +}; + +struct hwlat_entry { + struct trace_entry ent; + u64 duration; + u64 outer_duration; + u64 nmi_total_ts; + struct timespec64 timestamp; + unsigned int nmi_count; + unsigned int seqnum; + unsigned int count; + long: 32; +}; + +struct osnoise_entry { + struct trace_entry ent; + u64 noise; + u64 runtime; + u64 max_sample; + unsigned int hw_count; + unsigned int nmi_count; + unsigned int irq_count; + unsigned int softirq_count; + unsigned int thread_count; + long: 32; +}; + +struct timerlat_entry { + struct trace_entry ent; + unsigned int seqnum; + int context; + u64 timer_latency; +}; + +struct trace_mark { + long long unsigned int val; + char sym; + long: 32; +}; + +struct tracer_stat { + const char *name; + void * (*stat_start)(struct tracer_stat *); + void * (*stat_next)(void *, int); + cmp_func_t stat_cmp; + int (*stat_show)(struct seq_file *, void *); + void (*stat_release)(void *); + int (*stat_headers)(struct seq_file *); +}; + +struct stat_node { + struct rb_node node; + void *stat; +}; + +struct stat_session { + struct list_head session_list; + struct tracer_stat *ts; + struct rb_root stat_root; + struct mutex stat_mutex; + struct dentry *file; +}; + +struct trace_bprintk_fmt { + struct list_head list; + const char *fmt; +}; + +enum { + TRACE_FUNC_NO_OPTS = 0, + TRACE_FUNC_OPT_STACK = 1, + TRACE_FUNC_OPT_NO_REPEATS = 2, + TRACE_FUNC_OPT_HIGHEST_BIT = 4, +}; + +enum { + TRACE_NOP_OPT_ACCEPT = 1, + TRACE_NOP_OPT_REFUSE = 2, +}; + +struct ftrace_graph_ent { + long unsigned int func; + int depth; +}; + +struct ftrace_graph_ret { + long unsigned int func; + int depth; + unsigned int overrun; + long long unsigned int calltime; + long long unsigned int rettime; +}; + +typedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *); + +typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); + +struct fgraph_ops { + trace_func_graph_ent_t entryfunc; + trace_func_graph_ret_t retfunc; +}; + +struct ftrace_graph_ent_entry { + struct trace_entry ent; + struct ftrace_graph_ent graph_ent; +}; + +struct ftrace_graph_ret_entry { + struct trace_entry ent; + struct ftrace_graph_ret ret; +}; + +struct fgraph_cpu_data { + pid_t last_pid; + int depth; + int depth_irq; + int ignore; + long unsigned int enter_funcs[50]; +}; + +struct fgraph_data { + struct fgraph_cpu_data *cpu_data; + struct ftrace_graph_ent_entry ent; + struct ftrace_graph_ret_entry ret; + int failed; + int cpu; +}; + +enum { + FLAGS_FILL_FULL = 268435456, + FLAGS_FILL_START = 536870912, + FLAGS_FILL_END = 805306368, +}; + +struct sbitmap_word { + long unsigned int word; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long unsigned int cleared; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct sbitmap { + unsigned int depth; + unsigned int shift; + unsigned int map_nr; + bool round_robin; + struct sbitmap_word *map; + unsigned int *alloc_hint; +}; + +struct sbq_wait_state { + wait_queue_head_t wait; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct sbitmap_queue { + struct sbitmap sb; + unsigned int wake_batch; + atomic_t wake_index; + struct sbq_wait_state *ws; + atomic_t ws_active; + unsigned int min_shallow_depth; + atomic_t completion_cnt; + atomic_t wakeup_cnt; +}; + +typedef __u32 req_flags_t; + +enum mq_rq_state { + MQ_RQ_IDLE = 0, + MQ_RQ_IN_FLIGHT = 1, + MQ_RQ_COMPLETE = 2, +}; + +enum rq_end_io_ret { + RQ_END_IO_NONE = 0, + RQ_END_IO_FREE = 1, +}; + +typedef enum rq_end_io_ret rq_end_io_fn(struct request *, blk_status_t); + +struct request { + struct request_queue *q; + struct blk_mq_ctx *mq_ctx; + struct blk_mq_hw_ctx *mq_hctx; + blk_opf_t cmd_flags; + req_flags_t rq_flags; + int tag; + int internal_tag; + unsigned int timeout; + unsigned int __data_len; + long: 32; + sector_t __sector; + struct bio *bio; + struct bio *biotail; + union { + struct list_head queuelist; + struct request *rq_next; + }; + struct block_device *part; + long: 32; + u64 alloc_time_ns; + u64 start_time_ns; + u64 io_start_time_ns; + short unsigned int wbt_flags; + short unsigned int stats_sectors; + short unsigned int nr_phys_segments; + short unsigned int nr_integrity_segments; + short unsigned int ioprio; + enum mq_rq_state state; + atomic_t ref; + long unsigned int deadline; + union { + struct hlist_node hash; + struct llist_node ipi_list; + }; + union { + struct rb_node rb_node; + struct bio_vec special_vec; + void *completion_data; + }; + union { + struct { + struct io_cq *icq; + void *priv[2]; + } elv; + struct { + unsigned int seq; + struct list_head list; + rq_end_io_fn *saved_end_io; + } flush; + }; + long: 32; + union { + struct __call_single_data csd; + u64 fifo_time; + }; + rq_end_io_fn *end_io; + void *end_io_data; +}; + +struct blk_mq_tags { + unsigned int nr_tags; + unsigned int nr_reserved_tags; + atomic_t active_queues; + struct sbitmap_queue bitmap_tags; + struct sbitmap_queue breserved_tags; + struct request **rqs; + struct request **static_rqs; + struct list_head page_list; + spinlock_t lock; +}; + +struct blk_trace { + int trace_state; + struct rchan *rchan; + long unsigned int *sequence; + unsigned char *msg_data; + u16 act_mask; + long: 32; + u64 start_lba; + u64 end_lba; + u32 pid; + u32 dev; + struct dentry *dir; + struct list_head running_list; + atomic_t dropped; +}; + +struct blk_flush_queue { + unsigned int flush_pending_idx: 1; + unsigned int flush_running_idx: 1; + blk_status_t rq_status; + long unsigned int flush_pending_since; + struct list_head flush_queue[2]; + struct list_head flush_data_in_flight; + struct request *flush_rq; + spinlock_t mq_flush_lock; +}; + +struct blk_mq_queue_map { + unsigned int *mq_map; + unsigned int nr_queues; + unsigned int queue_offset; +}; + +struct blk_mq_tag_set { + struct blk_mq_queue_map map[3]; + unsigned int nr_maps; + const struct blk_mq_ops *ops; + unsigned int nr_hw_queues; + unsigned int queue_depth; + unsigned int reserved_tags; + unsigned int cmd_size; + int numa_node; + unsigned int timeout; + unsigned int flags; + void *driver_data; + struct blk_mq_tags **tags; + struct blk_mq_tags *shared_tags; + struct mutex tag_list_lock; + struct list_head tag_list; + struct srcu_struct *srcu; +}; + +struct blk_mq_hw_ctx { + struct { + spinlock_t lock; + struct list_head dispatch; + long unsigned int state; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + struct delayed_work run_work; + cpumask_var_t cpumask; + int next_cpu; + int next_cpu_batch; + long unsigned int flags; + void *sched_data; + struct request_queue *queue; + struct blk_flush_queue *fq; + void *driver_data; + struct sbitmap ctx_map; + struct blk_mq_ctx *dispatch_from; + unsigned int dispatch_busy; + short unsigned int type; + short unsigned int nr_ctx; + struct blk_mq_ctx **ctxs; + spinlock_t dispatch_wait_lock; + wait_queue_entry_t dispatch_wait; + atomic_t wait_index; + struct blk_mq_tags *tags; + struct blk_mq_tags *sched_tags; + long unsigned int queued; + long unsigned int run; + unsigned int numa_node; + unsigned int queue_num; + atomic_t nr_active; + struct hlist_node cpuhp_online; + struct hlist_node cpuhp_dead; + struct kobject kobj; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct list_head hctx_list; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct blk_mq_queue_data { + struct request *rq; + bool last; +}; + +enum blktrace_cat { + BLK_TC_READ = 1, + BLK_TC_WRITE = 2, + BLK_TC_FLUSH = 4, + BLK_TC_SYNC = 8, + BLK_TC_SYNCIO = 8, + BLK_TC_QUEUE = 16, + BLK_TC_REQUEUE = 32, + BLK_TC_ISSUE = 64, + BLK_TC_COMPLETE = 128, + BLK_TC_FS = 256, + BLK_TC_PC = 512, + BLK_TC_NOTIFY = 1024, + BLK_TC_AHEAD = 2048, + BLK_TC_META = 4096, + BLK_TC_DISCARD = 8192, + BLK_TC_DRV_DATA = 16384, + BLK_TC_FUA = 32768, + BLK_TC_END = 32768, +}; + +enum blktrace_act { + __BLK_TA_QUEUE = 1, + __BLK_TA_BACKMERGE = 2, + __BLK_TA_FRONTMERGE = 3, + __BLK_TA_GETRQ = 4, + __BLK_TA_SLEEPRQ = 5, + __BLK_TA_REQUEUE = 6, + __BLK_TA_ISSUE = 7, + __BLK_TA_COMPLETE = 8, + __BLK_TA_PLUG = 9, + __BLK_TA_UNPLUG_IO = 10, + __BLK_TA_UNPLUG_TIMER = 11, + __BLK_TA_INSERT = 12, + __BLK_TA_SPLIT = 13, + __BLK_TA_BOUNCE = 14, + __BLK_TA_REMAP = 15, + __BLK_TA_ABORT = 16, + __BLK_TA_DRV_DATA = 17, + __BLK_TA_CGROUP = 256, +}; + +enum blktrace_notify { + __BLK_TN_PROCESS = 0, + __BLK_TN_TIMESTAMP = 1, + __BLK_TN_MESSAGE = 2, + __BLK_TN_CGROUP = 256, +}; + +struct blk_io_trace { + __u32 magic; + __u32 sequence; + __u64 time; + __u64 sector; + __u32 bytes; + __u32 action; + __u32 pid; + __u32 device; + __u32 cpu; + __u16 error; + __u16 pdu_len; +}; + +struct blk_io_trace_remap { + __be32 device_from; + __be32 device_to; + __be64 sector_from; +}; + +enum { + Blktrace_setup = 1, + Blktrace_running = 2, + Blktrace_stopped = 3, +}; + +struct blk_user_trace_setup { + char name[32]; + __u16 act_mask; + __u32 buf_size; + __u32 buf_nr; + long: 32; + __u64 start_lba; + __u64 end_lba; + __u32 pid; + long: 32; +}; + +typedef void blk_log_action_t(struct trace_iterator *, const char *, bool); + +struct ftrace_event_field { + struct list_head link; + const char *name; + const char *type; + int filter_type; + int offset; + int size; + int is_signed; +}; + +struct module_string { + struct list_head next; + struct module *module; + char *str; +}; + +enum { + FORMAT_HEADER = 1, + FORMAT_FIELD_SEPERATOR = 2, + FORMAT_PRINTFMT = 3, +}; + +struct boot_triggers { + const char *event; + char *trigger; +}; + +struct event_probe_data { + struct trace_event_file *file; + long unsigned int count; + int ref; + bool enable; +}; + +struct syscall_trace_enter { + struct trace_entry ent; + int nr; + long unsigned int args[0]; +}; + +struct syscall_trace_exit { + struct trace_entry ent; + int nr; + long int ret; +}; + +struct syscall_tp_t { + long long unsigned int regs; + long unsigned int syscall_nr; + long unsigned int ret; +}; + +struct syscall_tp_t___2 { + long long unsigned int regs; + long unsigned int syscall_nr; + long unsigned int args[6]; + long: 32; +}; + +typedef long unsigned int perf_trace_t[2048]; + +struct filter_pred; + +struct prog_entry { + int target; + int when_to_branch; + struct filter_pred *pred; +}; + +struct regex; + +typedef int (*regex_match_func)(char *, struct regex *, int); + +struct regex { + char pattern[256]; + int len; + int field_len; + regex_match_func match; +}; + +enum filter_op_ids { + OP_GLOB = 0, + OP_NE = 1, + OP_EQ = 2, + OP_LE = 3, + OP_LT = 4, + OP_GE = 5, + OP_GT = 6, + OP_BAND = 7, + OP_MAX = 8, +}; + +enum filter_pred_fn { + FILTER_PRED_FN_NOP = 0, + FILTER_PRED_FN_64 = 1, + FILTER_PRED_FN_S64 = 2, + FILTER_PRED_FN_U64 = 3, + FILTER_PRED_FN_32 = 4, + FILTER_PRED_FN_S32 = 5, + FILTER_PRED_FN_U32 = 6, + FILTER_PRED_FN_16 = 7, + FILTER_PRED_FN_S16 = 8, + FILTER_PRED_FN_U16 = 9, + FILTER_PRED_FN_8 = 10, + FILTER_PRED_FN_S8 = 11, + FILTER_PRED_FN_U8 = 12, + FILTER_PRED_FN_COMM = 13, + FILTER_PRED_FN_STRING = 14, + FILTER_PRED_FN_STRLOC = 15, + FILTER_PRED_FN_STRRELLOC = 16, + FILTER_PRED_FN_PCHAR_USER = 17, + FILTER_PRED_FN_PCHAR = 18, + FILTER_PRED_FN_CPU = 19, + FILTER_PRED_FN_ = 20, + FILTER_PRED_TEST_VISITED = 21, +}; + +struct filter_pred { + enum filter_pred_fn fn_num; + long: 32; + u64 val; + struct regex regex; + short unsigned int *ops; + struct ftrace_event_field *field; + int offset; + int not; + int op; +}; + +enum { + FILT_ERR_NONE = 0, + FILT_ERR_INVALID_OP = 1, + FILT_ERR_TOO_MANY_OPEN = 2, + FILT_ERR_TOO_MANY_CLOSE = 3, + FILT_ERR_MISSING_QUOTE = 4, + FILT_ERR_OPERAND_TOO_LONG = 5, + FILT_ERR_EXPECT_STRING = 6, + FILT_ERR_EXPECT_DIGIT = 7, + FILT_ERR_ILLEGAL_FIELD_OP = 8, + FILT_ERR_FIELD_NOT_FOUND = 9, + FILT_ERR_ILLEGAL_INTVAL = 10, + FILT_ERR_BAD_SUBSYS_FILTER = 11, + FILT_ERR_TOO_MANY_PREDS = 12, + FILT_ERR_INVALID_FILTER = 13, + FILT_ERR_IP_FIELD_ONLY = 14, + FILT_ERR_INVALID_VALUE = 15, + FILT_ERR_ERRNO = 16, + FILT_ERR_NO_FILTER = 17, +}; + +struct filter_parse_error { + int lasterr; + int lasterr_pos; +}; + +typedef int (*parse_pred_fn)(const char *, void *, int, struct filter_parse_error *, struct filter_pred **); + +enum { + INVERT = 1, + PROCESS_AND = 2, + PROCESS_OR = 4, +}; + +struct ustring_buffer { + char buffer[1024]; +}; + +enum { + TOO_MANY_CLOSE = 4294967295, + TOO_MANY_OPEN = 4294967294, + MISSING_QUOTE = 4294967293, +}; + +struct filter_list { + struct list_head list; + struct event_filter *filter; +}; + +struct function_filter_data { + struct ftrace_ops *ops; + int first_filter; + int first_notrace; +}; + +enum { + EVENT_TRIGGER_FL_PROBE = 1, +}; + +struct event_trigger_ops; + +struct event_command; + +struct event_trigger_data { + long unsigned int count; + int ref; + int flags; + struct event_trigger_ops *ops; + struct event_command *cmd_ops; + struct event_filter *filter; + char *filter_str; + void *private_data; + bool paused; + bool paused_tmp; + struct list_head list; + char *name; + struct list_head named_list; + struct event_trigger_data *named_data; +}; + +struct event_trigger_ops { + void (*trigger)(struct event_trigger_data *, struct trace_buffer *, void *, struct ring_buffer_event *); + int (*init)(struct event_trigger_data *); + void (*free)(struct event_trigger_data *); + int (*print)(struct seq_file *, struct event_trigger_data *); +}; + +struct event_command { + struct list_head list; + char *name; + enum event_trigger_type trigger_type; + int flags; + int (*parse)(struct event_command *, struct trace_event_file *, char *, char *, char *); + int (*reg)(char *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg)(char *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg_all)(struct trace_event_file *); + int (*set_filter)(char *, struct event_trigger_data *, struct trace_event_file *); + struct event_trigger_ops * (*get_trigger_ops)(char *, char *); +}; + +struct enable_trigger_data { + struct trace_event_file *file; + bool enable; + bool hist; +}; + +enum event_command_flags { + EVENT_CMD_FL_POST_TRIGGER = 1, + EVENT_CMD_FL_NEEDS_REC = 2, +}; + +struct eprobe_trace_entry_head { + struct trace_entry ent; +}; + +struct dyn_event; + +struct dyn_event_operations { + struct list_head list; + int (*create)(const char *); + int (*show)(struct seq_file *, struct dyn_event *); + bool (*is_busy)(struct dyn_event *); + int (*free)(struct dyn_event *); + bool (*match)(const char *, const char *, int, const char **, struct dyn_event *); +}; + +struct dyn_event { + struct list_head list; + struct dyn_event_operations *ops; +}; + +typedef int (*print_type_func_t)(struct trace_seq *, void *, void *); + +enum fetch_op { + FETCH_OP_NOP = 0, + FETCH_OP_REG = 1, + FETCH_OP_STACK = 2, + FETCH_OP_STACKP = 3, + FETCH_OP_RETVAL = 4, + FETCH_OP_IMM = 5, + FETCH_OP_COMM = 6, + FETCH_OP_ARG = 7, + FETCH_OP_FOFFS = 8, + FETCH_OP_DATA = 9, + FETCH_OP_DEREF = 10, + FETCH_OP_UDEREF = 11, + FETCH_OP_ST_RAW = 12, + FETCH_OP_ST_MEM = 13, + FETCH_OP_ST_UMEM = 14, + FETCH_OP_ST_STRING = 15, + FETCH_OP_ST_USTRING = 16, + FETCH_OP_ST_SYMSTR = 17, + FETCH_OP_MOD_BF = 18, + FETCH_OP_LP_ARRAY = 19, + FETCH_OP_TP_ARG = 20, + FETCH_OP_END = 21, + FETCH_NOP_SYMBOL = 22, +}; + +struct fetch_insn { + enum fetch_op op; + union { + unsigned int param; + struct { + unsigned int size; + int offset; + }; + struct { + unsigned char basesize; + unsigned char lshift; + unsigned char rshift; + }; + long unsigned int immediate; + void *data; + }; +}; + +struct fetch_type { + const char *name; + size_t size; + bool is_signed; + bool is_string; + print_type_func_t print; + const char *fmt; + const char *fmttype; +}; + +struct probe_arg { + struct fetch_insn *code; + bool dynamic; + unsigned int offset; + unsigned int count; + const char *name; + const char *comm; + char *fmt; + const struct fetch_type *type; +}; + +struct trace_uprobe_filter { + rwlock_t rwlock; + int nr_systemwide; + struct list_head perf_events; +}; + +struct trace_probe_event { + unsigned int flags; + struct trace_event_class class; + struct trace_event_call call; + struct list_head files; + struct list_head probes; + struct trace_uprobe_filter filter[0]; +}; + +struct trace_probe { + struct list_head list; + struct trace_probe_event *event; + ssize_t size; + unsigned int nr_args; + struct probe_arg args[0]; +}; + +struct event_file_link { + struct trace_event_file *file; + struct list_head list; +}; + +enum probe_print_type { + PROBE_PRINT_NORMAL = 0, + PROBE_PRINT_RETURN = 1, + PROBE_PRINT_EVENT = 2, +}; + +enum { + TP_ERR_FILE_NOT_FOUND = 0, + TP_ERR_NO_REGULAR_FILE = 1, + TP_ERR_BAD_REFCNT = 2, + TP_ERR_REFCNT_OPEN_BRACE = 3, + TP_ERR_BAD_REFCNT_SUFFIX = 4, + TP_ERR_BAD_UPROBE_OFFS = 5, + TP_ERR_MAXACT_NO_KPROBE = 6, + TP_ERR_BAD_MAXACT = 7, + TP_ERR_MAXACT_TOO_BIG = 8, + TP_ERR_BAD_PROBE_ADDR = 9, + TP_ERR_BAD_RETPROBE = 10, + TP_ERR_BAD_ADDR_SUFFIX = 11, + TP_ERR_NO_GROUP_NAME = 12, + TP_ERR_GROUP_TOO_LONG = 13, + TP_ERR_BAD_GROUP_NAME = 14, + TP_ERR_NO_EVENT_NAME = 15, + TP_ERR_EVENT_TOO_LONG = 16, + TP_ERR_BAD_EVENT_NAME = 17, + TP_ERR_EVENT_EXIST = 18, + TP_ERR_RETVAL_ON_PROBE = 19, + TP_ERR_BAD_STACK_NUM = 20, + TP_ERR_BAD_ARG_NUM = 21, + TP_ERR_BAD_VAR = 22, + TP_ERR_BAD_REG_NAME = 23, + TP_ERR_BAD_MEM_ADDR = 24, + TP_ERR_BAD_IMM = 25, + TP_ERR_IMMSTR_NO_CLOSE = 26, + TP_ERR_FILE_ON_KPROBE = 27, + TP_ERR_BAD_FILE_OFFS = 28, + TP_ERR_SYM_ON_UPROBE = 29, + TP_ERR_TOO_MANY_OPS = 30, + TP_ERR_DEREF_NEED_BRACE = 31, + TP_ERR_BAD_DEREF_OFFS = 32, + TP_ERR_DEREF_OPEN_BRACE = 33, + TP_ERR_COMM_CANT_DEREF = 34, + TP_ERR_BAD_FETCH_ARG = 35, + TP_ERR_ARRAY_NO_CLOSE = 36, + TP_ERR_BAD_ARRAY_SUFFIX = 37, + TP_ERR_BAD_ARRAY_NUM = 38, + TP_ERR_ARRAY_TOO_BIG = 39, + TP_ERR_BAD_TYPE = 40, + TP_ERR_BAD_STRING = 41, + TP_ERR_BAD_SYMSTRING = 42, + TP_ERR_BAD_BITFIELD = 43, + TP_ERR_ARG_NAME_TOO_LONG = 44, + TP_ERR_NO_ARG_NAME = 45, + TP_ERR_BAD_ARG_NAME = 46, + TP_ERR_USED_ARG_NAME = 47, + TP_ERR_ARG_TOO_LONG = 48, + TP_ERR_NO_ARG_BODY = 49, + TP_ERR_BAD_INSN_BNDRY = 50, + TP_ERR_FAIL_REG_PROBE = 51, + TP_ERR_DIFF_PROBE_TYPE = 52, + TP_ERR_DIFF_ARG_TYPE = 53, + TP_ERR_SAME_PROBE = 54, + TP_ERR_NO_EVENT_INFO = 55, + TP_ERR_BAD_ATTACH_EVENT = 56, + TP_ERR_BAD_ATTACH_ARG = 57, + TP_ERR_NO_EP_FILTER = 58, +}; + +struct trace_eprobe { + const char *event_system; + const char *event_name; + char *filter_str; + struct trace_event_call *event; + struct dyn_event devent; + struct trace_probe tp; +}; + +struct eprobe_data { + struct trace_event_file *file; + struct trace_eprobe *ep; +}; + +enum { + BPF_F_INDEX_MASK = 4294967295, + BPF_F_CURRENT_CPU = 4294967295, + BPF_F_CTXLEN_MASK = 0, +}; + +enum { + BPF_F_GET_BRANCH_RECORDS_SIZE = 1, +}; + +struct bpf_perf_event_value { + __u64 counter; + __u64 enabled; + __u64 running; +}; + +struct bpf_raw_tracepoint_args { + __u64 args[0]; +}; + +enum bpf_task_fd_type { + BPF_FD_TYPE_RAW_TRACEPOINT = 0, + BPF_FD_TYPE_TRACEPOINT = 1, + BPF_FD_TYPE_KPROBE = 2, + BPF_FD_TYPE_KRETPROBE = 3, + BPF_FD_TYPE_UPROBE = 4, + BPF_FD_TYPE_URETPROBE = 5, +}; + +struct btf_ptr { + void *ptr; + __u32 type_id; + __u32 flags; +}; + +enum { + BTF_F_COMPACT = 1, + BTF_F_NONAME = 2, + BTF_F_PTR_RAW = 4, + BTF_F_ZERO = 8, +}; + +struct bpf_local_storage_data; + +struct bpf_local_storage { + struct bpf_local_storage_data *cache[16]; + struct hlist_head list; + void *owner; + struct callback_head rcu; + raw_spinlock_t lock; +}; + +enum key_need_perm { + KEY_NEED_UNSPECIFIED = 0, + KEY_NEED_VIEW = 1, + KEY_NEED_READ = 2, + KEY_NEED_WRITE = 3, + KEY_NEED_SEARCH = 4, + KEY_NEED_LINK = 5, + KEY_NEED_SETATTR = 6, + KEY_NEED_UNLINK = 7, + KEY_SYSADMIN_OVERRIDE = 8, + KEY_AUTHTOKEN_OVERRIDE = 9, + KEY_DEFER_PERM_CHECK = 10, +}; + +enum key_lookup_flag { + KEY_LOOKUP_CREATE = 1, + KEY_LOOKUP_PARTIAL = 2, + KEY_LOOKUP_ALL = 3, +}; + +struct __key_reference_with_attributes; + +typedef struct __key_reference_with_attributes *key_ref_t; + +typedef sockptr_t bpfptr_t; + +struct btf_id_set { + u32 cnt; + u32 ids[0]; +}; + +enum { + BTF_TRACING_TYPE_TASK = 0, + BTF_TRACING_TYPE_FILE = 1, + BTF_TRACING_TYPE_VMA = 2, + MAX_BTF_TRACING_TYPE = 3, +}; + +struct btf_struct_meta { + u32 btf_id; + struct btf_record *record; + struct btf_field_offs *field_offs; +}; + +struct bpf_local_storage_map_bucket; + +struct bpf_local_storage_map { + struct bpf_map map; + struct bpf_local_storage_map_bucket *buckets; + u32 bucket_log; + u16 elem_size; + u16 cache_idx; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_verifier_log { + u32 level; + char kbuf[1024]; + char *ubuf; + u32 len_used; + u32 len_total; +}; + +struct bpf_subprog_info { + u32 start; + u32 linfo_idx; + u16 stack_depth; + bool has_tail_call; + bool tail_call_reachable; + bool has_ld_abs; + bool is_async_cb; +}; + +struct bpf_id_pair { + u32 old; + u32 cur; +}; + +struct bpf_verifier_ops; + +struct bpf_verifier_stack_elem; + +struct bpf_verifier_state; + +struct bpf_verifier_state_list; + +struct bpf_insn_aux_data; + +struct bpf_verifier_env { + u32 insn_idx; + u32 prev_insn_idx; + struct bpf_prog *prog; + const struct bpf_verifier_ops *ops; + struct bpf_verifier_stack_elem *head; + int stack_size; + bool strict_alignment; + bool test_state_freq; + struct bpf_verifier_state *cur_state; + struct bpf_verifier_state_list **explored_states; + struct bpf_verifier_state_list *free_list; + struct bpf_map *used_maps[64]; + struct btf_mod_pair used_btfs[64]; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 id_gen; + bool explore_alu_limits; + bool allow_ptr_leaks; + bool allow_uninit_stack; + bool bpf_capable; + bool bypass_spec_v1; + bool bypass_spec_v4; + bool seen_direct_write; + bool rcu_tag_supported; + struct bpf_insn_aux_data *insn_aux_data; + const struct bpf_line_info *prev_linfo; + struct bpf_verifier_log log; + struct bpf_subprog_info subprog_info[257]; + struct bpf_id_pair idmap_scratch[600]; + struct { + int *insn_state; + int *insn_stack; + int cur_stack; + } cfg; + u32 pass_cnt; + u32 subprog_cnt; + u32 prev_insn_processed; + u32 insn_processed; + u32 prev_jmps_processed; + u32 jmps_processed; + u64 verification_time; + u32 max_states_per_insn; + u32 total_states; + u32 peak_states; + u32 longest_mark_read_walk; + bpfptr_t fd_array; + u32 scratched_regs; + long: 32; + u64 scratched_stack_slots; + u32 prev_log_len; + u32 prev_insn_print_len; + char type_str_buf[128]; +}; + +enum bpf_dynptr_type { + BPF_DYNPTR_TYPE_INVALID = 0, + BPF_DYNPTR_TYPE_LOCAL = 1, + BPF_DYNPTR_TYPE_RINGBUF = 2, +}; + +struct tnum { + u64 value; + u64 mask; +}; + +enum bpf_reg_liveness { + REG_LIVE_NONE = 0, + REG_LIVE_READ32 = 1, + REG_LIVE_READ64 = 2, + REG_LIVE_READ = 3, + REG_LIVE_WRITTEN = 4, + REG_LIVE_DONE = 8, +}; + +struct bpf_reg_state { + enum bpf_reg_type type; + s32 off; + union { + int range; + struct { + struct bpf_map *map_ptr; + u32 map_uid; + }; + struct { + struct btf *btf; + u32 btf_id; + }; + struct { + u32 mem_size; + u32 dynptr_id; + }; + struct { + enum bpf_dynptr_type type; + bool first_slot; + } dynptr; + struct { + long unsigned int raw1; + long unsigned int raw2; + } raw; + u32 subprogno; + }; + struct tnum var_off; + s64 smin_value; + s64 smax_value; + u64 umin_value; + u64 umax_value; + s32 s32_min_value; + s32 s32_max_value; + u32 u32_min_value; + u32 u32_max_value; + u32 id; + u32 ref_obj_id; + struct bpf_reg_state *parent; + u32 frameno; + s32 subreg_def; + enum bpf_reg_liveness live; + bool precise; + long: 32; +}; + +struct bpf_reference_state; + +struct bpf_stack_state; + +struct bpf_func_state { + struct bpf_reg_state regs[11]; + int callsite; + u32 frameno; + u32 subprogno; + u32 async_entry_cnt; + bool in_callback_fn; + long: 32; + struct tnum callback_ret_range; + bool in_async_callback_fn; + int acquired_refs; + struct bpf_reference_state *refs; + int allocated_stack; + struct bpf_stack_state *stack; + long: 32; +}; + +enum bpf_access_type { + BPF_READ = 1, + BPF_WRITE = 2, +}; + +struct bpf_insn_access_aux { + enum bpf_reg_type reg_type; + union { + int ctx_field_size; + struct { + struct btf *btf; + u32 btf_id; + }; + }; + struct bpf_verifier_log *log; +}; + +struct bpf_verifier_ops { + const struct bpf_func_proto * (*get_func_proto)(enum bpf_func_id, const struct bpf_prog *); + bool (*is_valid_access)(int, int, enum bpf_access_type, const struct bpf_prog *, struct bpf_insn_access_aux *); + int (*gen_prologue)(struct bpf_insn *, bool, const struct bpf_prog *); + int (*gen_ld_abs)(const struct bpf_insn *, struct bpf_insn *); + u32 (*convert_ctx_access)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + int (*btf_struct_access)(struct bpf_verifier_log *, const struct bpf_reg_state *, int, int, enum bpf_access_type, u32 *, enum bpf_type_flag *); +}; + +struct bpf_array_aux { + struct list_head poke_progs; + struct bpf_map *map; + struct mutex poke_mutex; + struct work_struct work; +}; + +struct bpf_array { + struct bpf_map map; + u32 elem_size; + u32 index_mask; + struct bpf_array_aux *aux; + long: 32; + union { + struct { + struct {} __empty_value; + char value[0]; + }; + struct { + struct {} __empty_ptrs; + void *ptrs[0]; + }; + struct { + struct {} __empty_pptrs; + void *pptrs[0]; + }; + }; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_event_entry { + struct perf_event *event; + struct file *perf_file; + struct file *map_file; + struct callback_head rcu; +}; + +typedef long unsigned int (*bpf_ctx_copy_t)(void *, const void *, long unsigned int, long unsigned int); + +struct bpf_trace_run_ctx { + struct bpf_run_ctx run_ctx; + u64 bpf_cookie; +}; + +typedef u32 (*bpf_prog_run_fn)(const struct bpf_prog *, const void *); + +struct bpf_bprintf_data { + u32 *bin_args; + char *buf; + bool get_bin_args; + bool get_buf; +}; + +struct bpf_dynptr_kern { + void *data; + u32 size; + u32 offset; + long: 32; +}; + +struct bpf_key { + struct key *key; + bool has_ref; +}; + +struct bpf_active_lock { + void *ptr; + u32 id; +}; + +struct bpf_stack_state { + struct bpf_reg_state spilled_ptr; + u8 slot_type[8]; +}; + +struct bpf_reference_state { + int id; + int insn_idx; + int callback_ref; +}; + +struct bpf_idx_pair { + u32 prev_idx; + u32 idx; +}; + +struct bpf_verifier_state { + struct bpf_func_state *frame[8]; + struct bpf_verifier_state *parent; + u32 branches; + u32 insn_idx; + u32 curframe; + struct bpf_active_lock active_lock; + bool speculative; + bool active_rcu_lock; + u32 first_insn_idx; + u32 last_insn_idx; + struct bpf_idx_pair *jmp_history; + u32 jmp_history_cnt; +}; + +struct bpf_verifier_state_list { + struct bpf_verifier_state state; + struct bpf_verifier_state_list *next; + int miss_cnt; + int hit_cnt; +}; + +struct bpf_loop_inline_state { + unsigned int initialized: 1; + unsigned int fit_for_inline: 1; + u32 callback_subprogno; +}; + +struct bpf_insn_aux_data { + union { + enum bpf_reg_type ptr_type; + long unsigned int map_ptr_state; + s32 call_imm; + u32 alu_limit; + struct { + u32 map_index; + u32 map_off; + }; + struct { + enum bpf_reg_type reg_type; + union { + struct { + struct btf *btf; + u32 btf_id; + }; + u32 mem_size; + }; + } btf_var; + struct bpf_loop_inline_state loop_inline_state; + }; + long: 32; + u64 obj_new_size; + struct btf_struct_meta *kptr_struct_meta; + long: 32; + u64 map_key_state; + int ctx_field_size; + u32 seen; + bool sanitize_stack_spill; + bool zext_dst; + bool storage_get_func_atomic; + u8 alu_state; + unsigned int orig_idx; + bool prune_point; + bool jmp_point; + long: 32; +}; + +typedef struct pt_regs bpf_user_pt_regs_t; + +struct bpf_perf_event_data { + bpf_user_pt_regs_t regs; + __u64 sample_period; + __u64 addr; +}; + +struct perf_event_query_bpf { + __u32 ids_len; + __u32 prog_cnt; + __u32 ids[0]; +}; + +struct bpf_perf_event_data_kern { + bpf_user_pt_regs_t *regs; + struct perf_sample_data *data; + struct perf_event *event; +}; + +struct bpf_local_storage_map_bucket { + struct hlist_head list; + raw_spinlock_t lock; +}; + +struct bpf_local_storage_data { + struct bpf_local_storage_map *smap; + long: 32; + u8 data[0]; +}; + +struct trace_event_raw_bpf_trace_printk { + struct trace_entry ent; + u32 __data_loc_bpf_string; + char __data[0]; +}; + +struct trace_event_data_offsets_bpf_trace_printk { + u32 bpf_string; +}; + +typedef void (*btf_trace_bpf_trace_printk)(void *, const char *); + +struct bpf_trace_module { + struct module *module; + struct list_head list; +}; + +typedef u64 (*btf_bpf_probe_read_user)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_user_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_compat)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_compat_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_write_user)(void *, const void *, u32); + +typedef u64 (*btf_bpf_trace_printk)(char *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_trace_vprintk)(char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_seq_printf)(struct seq_file *, char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_seq_write)(struct seq_file *, const void *, u32); + +typedef u64 (*btf_bpf_seq_printf_btf)(struct seq_file *, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_perf_event_read)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_perf_event_read_value)(struct bpf_map *, u64, struct bpf_perf_event_value *, u32); + +struct bpf_trace_sample_data { + struct perf_sample_data sds[3]; +}; + +typedef u64 (*btf_bpf_perf_event_output)(struct pt_regs *, struct bpf_map *, u64, void *, u64); + +struct bpf_nested_pt_regs { + struct pt_regs regs[3]; +}; + +typedef u64 (*btf_bpf_get_current_task)(); + +typedef u64 (*btf_bpf_get_current_task_btf)(); + +typedef u64 (*btf_bpf_task_pt_regs)(struct task_struct *); + +typedef u64 (*btf_bpf_current_task_under_cgroup)(struct bpf_map *, u32); + +struct send_signal_irq_work { + struct irq_work irq_work; + struct task_struct *task; + u32 sig; + enum pid_type type; +}; + +typedef u64 (*btf_bpf_send_signal)(u32); + +typedef u64 (*btf_bpf_send_signal_thread)(u32); + +typedef u64 (*btf_bpf_d_path)(struct path *, char *, u32); + +typedef u64 (*btf_bpf_snprintf_btf)(char *, u32, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_get_func_ip_tracing)(void *); + +typedef u64 (*btf_bpf_get_func_ip_kprobe)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_func_ip_kprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_attach_cookie_kprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_attach_cookie_trace)(void *); + +typedef u64 (*btf_bpf_get_attach_cookie_pe)(struct bpf_perf_event_data_kern *); + +typedef u64 (*btf_bpf_get_attach_cookie_tracing)(void *); + +typedef u64 (*btf_bpf_get_branch_snapshot)(void *, u32, u64); + +typedef u64 (*btf_get_func_arg)(void *, u32, u64 *); + +typedef u64 (*btf_get_func_ret)(void *, u64 *); + +typedef u64 (*btf_get_func_arg_cnt)(void *); + +typedef u64 (*btf_bpf_perf_event_output_tp)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_stackid_tp)(void *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack_tp)(void *, void *, u32, u64); + +typedef u64 (*btf_bpf_perf_prog_read_value)(struct bpf_perf_event_data_kern *, struct bpf_perf_event_value *, u32); + +typedef u64 (*btf_bpf_read_branch_records)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +struct bpf_raw_tp_regs { + struct pt_regs regs[3]; +}; + +typedef u64 (*btf_bpf_perf_event_output_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_stackid_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack_raw_tp)(struct bpf_raw_tracepoint_args *, void *, u32, u64); + +enum dynevent_type { + DYNEVENT_TYPE_SYNTH = 1, + DYNEVENT_TYPE_KPROBE = 2, + DYNEVENT_TYPE_NONE = 3, +}; + +struct dynevent_cmd; + +typedef int (*dynevent_create_fn_t)(struct dynevent_cmd *); + +struct dynevent_cmd { + struct seq_buf seq; + const char *event_name; + unsigned int n_fields; + enum dynevent_type type; + dynevent_create_fn_t run_command; + void *private_data; + long: 32; +}; + +struct kprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int ip; +}; + +struct kretprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int func; + long unsigned int ret_ip; +}; + +typedef int (*dynevent_check_arg_fn_t)(void *); + +struct dynevent_arg { + const char *str; + char separator; +}; + +struct trace_kprobe { + struct dyn_event devent; + struct kretprobe rp; + long unsigned int *nhit; + const char *symbol; + struct trace_probe tp; +}; + +struct trace_event_raw_error_report_template { + struct trace_entry ent; + enum error_detector error_detector; + long unsigned int id; + char __data[0]; +}; + +struct trace_event_data_offsets_error_report_template {}; + +typedef void (*btf_trace_error_report_end)(void *, enum error_detector, long unsigned int); + +struct trace_event_raw_cpu { + struct trace_entry ent; + u32 state; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_cpu_idle_miss { + struct trace_entry ent; + u32 cpu_id; + u32 state; + bool below; + char __data[0]; +}; + +struct trace_event_raw_powernv_throttle { + struct trace_entry ent; + int chip_id; + u32 __data_loc_reason; + int pmax; + char __data[0]; +}; + +struct trace_event_raw_pstate_sample { + struct trace_entry ent; + u32 core_busy; + u32 scaled_busy; + u32 from; + u32 to; + u64 mperf; + u64 aperf; + u64 tsc; + u32 freq; + u32 io_boost; + char __data[0]; +}; + +struct trace_event_raw_cpu_frequency_limits { + struct trace_entry ent; + u32 min_freq; + u32 max_freq; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_start { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + u32 __data_loc_parent; + u32 __data_loc_pm_ops; + int event; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_end { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + int error; + char __data[0]; +}; + +struct trace_event_raw_suspend_resume { + struct trace_entry ent; + const char *action; + int val; + bool start; + char __data[0]; +}; + +struct trace_event_raw_wakeup_source { + struct trace_entry ent; + u32 __data_loc_name; + long: 32; + u64 state; + char __data[0]; +}; + +struct trace_event_raw_clock { + struct trace_entry ent; + u32 __data_loc_name; + long: 32; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_power_domain { + struct trace_entry ent; + u32 __data_loc_name; + long: 32; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_cpu_latency_qos_request { + struct trace_entry ent; + s32 value; + char __data[0]; +}; + +struct trace_event_raw_pm_qos_update { + struct trace_entry ent; + enum pm_qos_req_action action; + int prev_value; + int curr_value; + char __data[0]; +}; + +struct trace_event_raw_dev_pm_qos_request { + struct trace_entry ent; + u32 __data_loc_name; + enum dev_pm_qos_req_type type; + s32 new_value; + char __data[0]; +}; + +struct trace_event_raw_guest_halt_poll_ns { + struct trace_entry ent; + bool grow; + unsigned int new; + unsigned int old; + char __data[0]; +}; + +struct trace_event_data_offsets_cpu {}; + +struct trace_event_data_offsets_cpu_idle_miss {}; + +struct trace_event_data_offsets_powernv_throttle { + u32 reason; +}; + +struct trace_event_data_offsets_pstate_sample {}; + +struct trace_event_data_offsets_cpu_frequency_limits {}; + +struct trace_event_data_offsets_device_pm_callback_start { + u32 device; + u32 driver; + u32 parent; + u32 pm_ops; +}; + +struct trace_event_data_offsets_device_pm_callback_end { + u32 device; + u32 driver; +}; + +struct trace_event_data_offsets_suspend_resume {}; + +struct trace_event_data_offsets_wakeup_source { + u32 name; +}; + +struct trace_event_data_offsets_clock { + u32 name; +}; + +struct trace_event_data_offsets_power_domain { + u32 name; +}; + +struct trace_event_data_offsets_cpu_latency_qos_request {}; + +struct trace_event_data_offsets_pm_qos_update {}; + +struct trace_event_data_offsets_dev_pm_qos_request { + u32 name; +}; + +struct trace_event_data_offsets_guest_halt_poll_ns {}; + +typedef void (*btf_trace_cpu_idle)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_cpu_idle_miss)(void *, unsigned int, unsigned int, bool); + +typedef void (*btf_trace_powernv_throttle)(void *, int, const char *, int); + +typedef void (*btf_trace_pstate_sample)(void *, u32, u32, u32, u32, u64, u64, u64, u32, u32); + +typedef void (*btf_trace_cpu_frequency)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_cpu_frequency_limits)(void *, struct cpufreq_policy *); + +typedef void (*btf_trace_device_pm_callback_start)(void *, struct device *, const char *, int); + +typedef void (*btf_trace_device_pm_callback_end)(void *, struct device *, int); + +typedef void (*btf_trace_suspend_resume)(void *, const char *, int, bool); + +typedef void (*btf_trace_wakeup_source_activate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_wakeup_source_deactivate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_clock_enable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_disable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_set_rate)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_power_domain_target)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_pm_qos_add_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_remove_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_target)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_pm_qos_update_flags)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_dev_pm_qos_add_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_update_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_remove_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_guest_halt_poll_ns)(void *, bool, unsigned int, unsigned int); + +struct trace_event_raw_rpm_internal { + struct trace_entry ent; + u32 __data_loc_name; + int flags; + int usage_count; + int disable_depth; + int runtime_auto; + int request_pending; + int irq_safe; + int child_count; + char __data[0]; +}; + +struct trace_event_raw_rpm_return_int { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int ip; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_rpm_internal { + u32 name; +}; + +struct trace_event_data_offsets_rpm_return_int { + u32 name; +}; + +typedef void (*btf_trace_rpm_suspend)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_resume)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_idle)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_usage)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_return_int)(void *, struct device *, long unsigned int, int); + +struct dynevent_arg_pair { + const char *lhs; + const char *rhs; + char operator; + char separator; +}; + +struct trace_probe_log { + const char *subsystem; + const char **argv; + int argc; + int index; +}; + +enum uprobe_filter_ctx { + UPROBE_FILTER_REGISTER = 0, + UPROBE_FILTER_UNREGISTER = 1, + UPROBE_FILTER_MMAP = 2, +}; + +struct uprobe_consumer { + int (*handler)(struct uprobe_consumer *, struct pt_regs *); + int (*ret_handler)(struct uprobe_consumer *, long unsigned int, struct pt_regs *); + bool (*filter)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); + struct uprobe_consumer *next; +}; + +struct uprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int vaddr[0]; +}; + +struct trace_uprobe { + struct dyn_event devent; + struct uprobe_consumer consumer; + struct path path; + struct inode *inode; + char *filename; + long unsigned int offset; + long unsigned int ref_ctr_offset; + long unsigned int nhit; + struct trace_probe tp; +}; + +struct uprobe_dispatch_data { + struct trace_uprobe *tu; + long unsigned int bp_addr; +}; + +struct uprobe_cpu_buffer { + struct mutex mutex; + void *buf; +}; + +typedef bool (*filter_func_t)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); + +typedef __u64 __le64; + +enum xdp_action { + XDP_ABORTED = 0, + XDP_DROP = 1, + XDP_PASS = 2, + XDP_TX = 3, + XDP_REDIRECT = 4, +}; + +struct rnd_state { + __u32 s1; + __u32 s2; + __u32 s3; + __u32 s4; +}; + +struct rhash_lock_head; + +struct bucket_table { + unsigned int size; + unsigned int nest; + u32 hash_rnd; + struct list_head walkers; + struct callback_head rcu; + struct bucket_table *future_tbl; + struct lockdep_map dep_map; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct rhash_lock_head *buckets[0]; +}; + +struct bpf_mem_caches; + +struct bpf_mem_cache; + +struct bpf_mem_alloc { + struct bpf_mem_caches *caches; + struct bpf_mem_cache *cache; + struct work_struct work; +}; + +enum bpf_jit_poke_reason { + BPF_POKE_REASON_TAIL_CALL = 0, +}; + +struct bpf_empty_prog_array { + struct bpf_prog_array hdr; + struct bpf_prog *null_prog; + long: 32; +}; + +enum bpf_text_poke_type { + BPF_MOD_CALL = 0, + BPF_MOD_JUMP = 1, +}; + +enum xdp_mem_type { + MEM_TYPE_PAGE_SHARED = 0, + MEM_TYPE_PAGE_ORDER0 = 1, + MEM_TYPE_PAGE_POOL = 2, + MEM_TYPE_XSK_BUFF_POOL = 3, + MEM_TYPE_MAX = 4, +}; + +struct xdp_cpumap_stats { + unsigned int redirect; + unsigned int pass; + unsigned int drop; +}; + +struct bpf_prog_pack { + struct list_head list; + void *ptr; + long unsigned int bitmap[0]; +}; + +struct bpf_prog_dummy { + struct bpf_prog prog; +}; + +typedef u64 (*btf_bpf_user_rnd_u32)(); + +typedef u64 (*btf_bpf_get_raw_cpu_id)(); + +struct _bpf_dtab_netdev { + struct net_device *dev; +}; + +struct rhash_lock_head {}; + +struct xdp_mem_allocator { + struct xdp_mem_info mem; + union { + void *allocator; + struct page_pool *page_pool; + }; + struct rhash_head node; + struct callback_head rcu; +}; + +struct trace_event_raw_xdp_exception { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_xdp_bulk_tx { + struct trace_entry ent; + int ifindex; + u32 act; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_xdp_redirect_template { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + int err; + int to_ifindex; + u32 map_id; + int map_index; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_kthread { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int sched; + unsigned int xdp_pass; + unsigned int xdp_drop; + unsigned int xdp_redirect; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_enqueue { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int to_cpu; + char __data[0]; +}; + +struct trace_event_raw_xdp_devmap_xmit { + struct trace_entry ent; + int from_ifindex; + u32 act; + int to_ifindex; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_mem_disconnect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + char __data[0]; +}; + +struct trace_event_raw_mem_connect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + const struct xdp_rxq_info *rxq; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_mem_return_failed { + struct trace_entry ent; + const struct page *page; + u32 mem_id; + u32 mem_type; + char __data[0]; +}; + +struct trace_event_data_offsets_xdp_exception {}; + +struct trace_event_data_offsets_xdp_bulk_tx {}; + +struct trace_event_data_offsets_xdp_redirect_template {}; + +struct trace_event_data_offsets_xdp_cpumap_kthread {}; + +struct trace_event_data_offsets_xdp_cpumap_enqueue {}; + +struct trace_event_data_offsets_xdp_devmap_xmit {}; + +struct trace_event_data_offsets_mem_disconnect {}; + +struct trace_event_data_offsets_mem_connect {}; + +struct trace_event_data_offsets_mem_return_failed {}; + +typedef void (*btf_trace_xdp_exception)(void *, const struct net_device *, const struct bpf_prog *, u32); + +typedef void (*btf_trace_xdp_bulk_tx)(void *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_xdp_redirect)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_cpumap_kthread)(void *, int, unsigned int, unsigned int, int, struct xdp_cpumap_stats *); + +typedef void (*btf_trace_xdp_cpumap_enqueue)(void *, int, unsigned int, unsigned int, int); + +typedef void (*btf_trace_xdp_devmap_xmit)(void *, const struct net_device *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_mem_disconnect)(void *, const struct xdp_mem_allocator *); + +typedef void (*btf_trace_mem_connect)(void *, const struct xdp_mem_allocator *, const struct xdp_rxq_info *); + +typedef void (*btf_trace_mem_return_failed)(void *, const struct xdp_mem_info *, const struct page *); + +enum bpf_cmd { + BPF_MAP_CREATE = 0, + BPF_MAP_LOOKUP_ELEM = 1, + BPF_MAP_UPDATE_ELEM = 2, + BPF_MAP_DELETE_ELEM = 3, + BPF_MAP_GET_NEXT_KEY = 4, + BPF_PROG_LOAD = 5, + BPF_OBJ_PIN = 6, + BPF_OBJ_GET = 7, + BPF_PROG_ATTACH = 8, + BPF_PROG_DETACH = 9, + BPF_PROG_TEST_RUN = 10, + BPF_PROG_RUN = 10, + BPF_PROG_GET_NEXT_ID = 11, + BPF_MAP_GET_NEXT_ID = 12, + BPF_PROG_GET_FD_BY_ID = 13, + BPF_MAP_GET_FD_BY_ID = 14, + BPF_OBJ_GET_INFO_BY_FD = 15, + BPF_PROG_QUERY = 16, + BPF_RAW_TRACEPOINT_OPEN = 17, + BPF_BTF_LOAD = 18, + BPF_BTF_GET_FD_BY_ID = 19, + BPF_TASK_FD_QUERY = 20, + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 21, + BPF_MAP_FREEZE = 22, + BPF_BTF_GET_NEXT_ID = 23, + BPF_MAP_LOOKUP_BATCH = 24, + BPF_MAP_LOOKUP_AND_DELETE_BATCH = 25, + BPF_MAP_UPDATE_BATCH = 26, + BPF_MAP_DELETE_BATCH = 27, + BPF_LINK_CREATE = 28, + BPF_LINK_UPDATE = 29, + BPF_LINK_GET_FD_BY_ID = 30, + BPF_LINK_GET_NEXT_ID = 31, + BPF_ENABLE_STATS = 32, + BPF_ITER_CREATE = 33, + BPF_LINK_DETACH = 34, + BPF_PROG_BIND_MAP = 35, +}; + +enum bpf_link_type { + BPF_LINK_TYPE_UNSPEC = 0, + BPF_LINK_TYPE_RAW_TRACEPOINT = 1, + BPF_LINK_TYPE_TRACING = 2, + BPF_LINK_TYPE_CGROUP = 3, + BPF_LINK_TYPE_ITER = 4, + BPF_LINK_TYPE_NETNS = 5, + BPF_LINK_TYPE_XDP = 6, + BPF_LINK_TYPE_PERF_EVENT = 7, + BPF_LINK_TYPE_KPROBE_MULTI = 8, + BPF_LINK_TYPE_STRUCT_OPS = 9, + MAX_BPF_LINK_TYPE = 10, +}; + +enum { + BPF_ANY = 0, + BPF_NOEXIST = 1, + BPF_EXIST = 2, + BPF_F_LOCK = 4, +}; + +enum { + BPF_F_NO_PREALLOC = 1, + BPF_F_NO_COMMON_LRU = 2, + BPF_F_NUMA_NODE = 4, + BPF_F_RDONLY = 8, + BPF_F_WRONLY = 16, + BPF_F_STACK_BUILD_ID = 32, + BPF_F_ZERO_SEED = 64, + BPF_F_RDONLY_PROG = 128, + BPF_F_WRONLY_PROG = 256, + BPF_F_CLONE = 512, + BPF_F_MMAPABLE = 1024, + BPF_F_PRESERVE_ELEMS = 2048, + BPF_F_INNER_MAP = 4096, +}; + +enum bpf_stats_type { + BPF_STATS_RUN_TIME = 0, +}; + +struct bpf_prog_info { + __u32 type; + __u32 id; + __u8 tag[8]; + __u32 jited_prog_len; + __u32 xlated_prog_len; + __u64 jited_prog_insns; + __u64 xlated_prog_insns; + __u64 load_time; + __u32 created_by_uid; + __u32 nr_map_ids; + __u64 map_ids; + char name[16]; + __u32 ifindex; + __u32 gpl_compatible: 1; + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; + __u32 nr_jited_func_lens; + __u64 jited_ksyms; + __u64 jited_func_lens; + __u32 btf_id; + __u32 func_info_rec_size; + __u64 func_info; + __u32 nr_func_info; + __u32 nr_line_info; + __u64 line_info; + __u64 jited_line_info; + __u32 nr_jited_line_info; + __u32 line_info_rec_size; + __u32 jited_line_info_rec_size; + __u32 nr_prog_tags; + __u64 prog_tags; + __u64 run_time_ns; + __u64 run_cnt; + __u64 recursion_misses; + __u32 verified_insns; + __u32 attach_btf_obj_id; + __u32 attach_btf_id; + long: 32; +}; + +struct bpf_map_info { + __u32 type; + __u32 id; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + char name[16]; + __u32 ifindex; + __u32 btf_vmlinux_value_type_id; + __u64 netns_dev; + __u64 netns_ino; + __u32 btf_id; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + long: 32; + __u64 map_extra; +}; + +struct bpf_btf_info { + __u64 btf; + __u32 btf_size; + __u32 id; + __u64 name; + __u32 name_len; + __u32 kernel_btf; +}; + +struct bpf_spin_lock { + __u32 val; +}; + +struct bpf_link_ops; + +struct bpf_link { + atomic64_t refcnt; + u32 id; + enum bpf_link_type type; + const struct bpf_link_ops *ops; + struct bpf_prog *prog; + struct work_struct work; +}; + +struct bpf_tramp_link { + struct bpf_link link; + struct hlist_node tramp_hlist; + u64 cookie; +}; + +struct bpf_tramp_run_ctx { + struct bpf_run_ctx run_ctx; + u64 bpf_cookie; + struct bpf_run_ctx *saved_run_ctx; + long: 32; +}; + +struct bpf_attach_target_info { + struct btf_func_model fmodel; + long int tgt_addr; + const char *tgt_name; + const struct btf_type *tgt_type; +}; + +struct bpf_link_ops { + void (*release)(struct bpf_link *); + void (*dealloc)(struct bpf_link *); + int (*detach)(struct bpf_link *); + int (*update_prog)(struct bpf_link *, struct bpf_prog *, struct bpf_prog *); + void (*show_fdinfo)(const struct bpf_link *, struct seq_file *); + int (*fill_link_info)(const struct bpf_link *, struct bpf_link_info *); +}; + +struct bpf_tracing_link { + struct bpf_tramp_link link; + enum bpf_attach_type attach_type; + struct bpf_trampoline *trampoline; + struct bpf_prog *tgt_prog; + long: 32; +}; + +struct bpf_link_primer { + struct bpf_link *link; + struct file *file; + int fd; + u32 id; +}; + +enum perf_bpf_event_type { + PERF_BPF_EVENT_UNKNOWN = 0, + PERF_BPF_EVENT_PROG_LOAD = 1, + PERF_BPF_EVENT_PROG_UNLOAD = 2, + PERF_BPF_EVENT_MAX = 3, +}; + +enum bpf_audit { + BPF_AUDIT_LOAD = 0, + BPF_AUDIT_UNLOAD = 1, + BPF_AUDIT_MAX = 2, +}; + +struct bpf_prog_kstats { + u64 nsecs; + u64 cnt; + u64 misses; +}; + +struct bpf_raw_tp_link { + struct bpf_link link; + struct bpf_raw_event_map *btp; + long: 32; +}; + +struct bpf_perf_link { + struct bpf_link link; + struct file *perf_file; + long: 32; +}; + +typedef u64 (*btf_bpf_sys_bpf)(int, union bpf_attr *, u32); + +typedef u64 (*btf_bpf_sys_close)(u32); + +typedef u64 (*btf_bpf_kallsyms_lookup_name)(const char *, int, int, u64 *); + +enum { + BTF_KIND_UNKN = 0, + BTF_KIND_INT = 1, + BTF_KIND_PTR = 2, + BTF_KIND_ARRAY = 3, + BTF_KIND_STRUCT = 4, + BTF_KIND_UNION = 5, + BTF_KIND_ENUM = 6, + BTF_KIND_FWD = 7, + BTF_KIND_TYPEDEF = 8, + BTF_KIND_VOLATILE = 9, + BTF_KIND_CONST = 10, + BTF_KIND_RESTRICT = 11, + BTF_KIND_FUNC = 12, + BTF_KIND_FUNC_PROTO = 13, + BTF_KIND_VAR = 14, + BTF_KIND_DATASEC = 15, + BTF_KIND_FLOAT = 16, + BTF_KIND_DECL_TAG = 17, + BTF_KIND_TYPE_TAG = 18, + BTF_KIND_ENUM64 = 19, + NR_BTF_KINDS = 20, + BTF_KIND_MAX = 19, +}; + +struct btf_array { + __u32 type; + __u32 index_type; + __u32 nelems; +}; + +struct btf_member { + __u32 name_off; + __u32 type; + __u32 offset; +}; + +struct btf_param { + __u32 name_off; + __u32 type; +}; + +enum btf_func_linkage { + BTF_FUNC_STATIC = 0, + BTF_FUNC_GLOBAL = 1, + BTF_FUNC_EXTERN = 2, +}; + +struct btf_var_secinfo { + __u32 type; + __u32 offset; + __u32 size; +}; + +enum sk_action { + SK_DROP = 0, + SK_PASS = 1, +}; + +enum bpf_core_relo_kind { + BPF_CORE_FIELD_BYTE_OFFSET = 0, + BPF_CORE_FIELD_BYTE_SIZE = 1, + BPF_CORE_FIELD_EXISTS = 2, + BPF_CORE_FIELD_SIGNED = 3, + BPF_CORE_FIELD_LSHIFT_U64 = 4, + BPF_CORE_FIELD_RSHIFT_U64 = 5, + BPF_CORE_TYPE_ID_LOCAL = 6, + BPF_CORE_TYPE_ID_TARGET = 7, + BPF_CORE_TYPE_EXISTS = 8, + BPF_CORE_TYPE_SIZE = 9, + BPF_CORE_ENUMVAL_EXISTS = 10, + BPF_CORE_ENUMVAL_VALUE = 11, + BPF_CORE_TYPE_MATCHES = 12, +}; + +struct bpf_core_relo { + __u32 insn_off; + __u32 type_id; + __u32 access_str_off; + enum bpf_core_relo_kind kind; +}; + +enum { + BTF_SOCK_TYPE_INET = 0, + BTF_SOCK_TYPE_INET_CONN = 1, + BTF_SOCK_TYPE_INET_REQ = 2, + BTF_SOCK_TYPE_INET_TW = 3, + BTF_SOCK_TYPE_REQ = 4, + BTF_SOCK_TYPE_SOCK = 5, + BTF_SOCK_TYPE_SOCK_COMMON = 6, + BTF_SOCK_TYPE_TCP = 7, + BTF_SOCK_TYPE_TCP_REQ = 8, + BTF_SOCK_TYPE_TCP_TW = 9, + BTF_SOCK_TYPE_TCP6 = 10, + BTF_SOCK_TYPE_UDP = 11, + BTF_SOCK_TYPE_UDP6 = 12, + BTF_SOCK_TYPE_UNIX = 13, + BTF_SOCK_TYPE_MPTCP = 14, + BTF_SOCK_TYPE_SOCKET = 15, + MAX_BTF_SOCK_TYPE = 16, +}; + +struct bpf_kfunc_desc { + struct btf_func_model func_model; + u32 func_id; + s32 imm; + u16 offset; +}; + +struct bpf_kfunc_desc_tab { + struct bpf_kfunc_desc descs[256]; + u32 nr_descs; +}; + +struct bpf_kfunc_btf { + struct btf *btf; + struct module *module; + u16 offset; +}; + +struct bpf_kfunc_btf_tab { + struct bpf_kfunc_btf descs[256]; + u32 nr_descs; +}; + +struct bpf_struct_ops { + const struct bpf_verifier_ops *verifier_ops; + int (*init)(struct btf *); + int (*check_member)(const struct btf_type *, const struct btf_member *, const struct bpf_prog *); + int (*init_member)(const struct btf_type *, const struct btf_member *, void *, const void *); + int (*reg)(void *); + void (*unreg)(void *); + const struct btf_type *type; + const struct btf_type *value_type; + const char *name; + struct btf_func_model func_models[64]; + u32 type_id; + u32 value_id; +}; + +typedef u32 (*bpf_convert_ctx_access_t)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + +struct bpf_core_ctx { + struct bpf_verifier_log *log; + const struct btf *btf; +}; + +enum bpf_stack_slot_type { + STACK_INVALID = 0, + STACK_SPILL = 1, + STACK_MISC = 2, + STACK_ZERO = 3, + STACK_DYNPTR = 4, +}; + +struct bpf_verifier_stack_elem { + struct bpf_verifier_state st; + int insn_idx; + int prev_insn_idx; + struct bpf_verifier_stack_elem *next; + u32 log_pos; +}; + +typedef void (*bpf_insn_print_t)(void *, const char *, ...); + +typedef const char * (*bpf_insn_revmap_call_t)(void *, const struct bpf_insn *); + +typedef const char * (*bpf_insn_print_imm_t)(void *, const struct bpf_insn *, __u64); + +struct bpf_insn_cbs { + bpf_insn_print_t cb_print; + bpf_insn_revmap_call_t cb_call; + bpf_insn_print_imm_t cb_imm; + void *private_data; +}; + +struct bpf_call_arg_meta { + struct bpf_map *map_ptr; + bool raw_mode; + bool pkt_access; + u8 release_regno; + int regno; + int access_size; + int mem_size; + long: 32; + u64 msize_max_value; + int ref_obj_id; + int dynptr_id; + int map_uid; + int func_id; + struct btf *btf; + u32 btf_id; + struct btf *ret_btf; + u32 ret_btf_id; + u32 subprogno; + struct btf_field *kptr_field; + u8 uninit_dynptr_regno; + long: 32; +}; + +enum reg_arg_type { + SRC_OP = 0, + DST_OP = 1, + DST_OP_NO_MARK = 2, +}; + +enum bpf_access_src { + ACCESS_DIRECT = 1, + ACCESS_HELPER = 2, +}; + +struct task_struct__safe_fields { + const cpumask_t *cpus_ptr; +}; + +struct bpf_reg_types { + const enum bpf_reg_type types[10]; + u32 *btf_id; +}; + +enum { + AT_PKT_END = 4294967295, + BEYOND_PKT_END = 4294967294, +}; + +typedef int (*set_callee_state_fn)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *, int); + +struct bpf_kfunc_call_arg_meta { + struct btf *btf; + u32 func_id; + u32 kfunc_flags; + const struct btf_type *func_proto; + const char *func_name; + u32 ref_obj_id; + u8 release_regno; + bool r0_rdonly; + u32 ret_btf_id; + u64 r0_size; + u32 subprogno; + long: 32; + struct { + u64 value; + bool found; + long: 32; + } arg_constant; + struct { + struct btf *btf; + u32 btf_id; + } arg_obj_drop; + struct { + struct btf_field *field; + } arg_list_head; + struct { + struct btf_field *field; + } arg_rbtree_root; +}; + +enum { + KF_ARG_DYNPTR_ID = 0, + KF_ARG_LIST_HEAD_ID = 1, + KF_ARG_LIST_NODE_ID = 2, + KF_ARG_RB_ROOT_ID = 3, + KF_ARG_RB_NODE_ID = 4, +}; + +enum kfunc_ptr_arg_type { + KF_ARG_PTR_TO_CTX = 0, + KF_ARG_PTR_TO_ALLOC_BTF_ID = 1, + KF_ARG_PTR_TO_KPTR = 2, + KF_ARG_PTR_TO_DYNPTR = 3, + KF_ARG_PTR_TO_LIST_HEAD = 4, + KF_ARG_PTR_TO_LIST_NODE = 5, + KF_ARG_PTR_TO_BTF_ID = 6, + KF_ARG_PTR_TO_MEM = 7, + KF_ARG_PTR_TO_MEM_SIZE = 8, + KF_ARG_PTR_TO_CALLBACK = 9, + KF_ARG_PTR_TO_RB_ROOT = 10, + KF_ARG_PTR_TO_RB_NODE = 11, +}; + +enum special_kfunc_type { + KF_bpf_obj_new_impl = 0, + KF_bpf_obj_drop_impl = 1, + KF_bpf_list_push_front = 2, + KF_bpf_list_push_back = 3, + KF_bpf_list_pop_front = 4, + KF_bpf_list_pop_back = 5, + KF_bpf_cast_to_kern_ctx = 6, + KF_bpf_rdonly_cast = 7, + KF_bpf_rcu_read_lock = 8, + KF_bpf_rcu_read_unlock = 9, + KF_bpf_rbtree_remove = 10, + KF_bpf_rbtree_add = 11, + KF_bpf_rbtree_first = 12, +}; + +enum { + REASON_BOUNDS = 4294967295, + REASON_TYPE = 4294967294, + REASON_PATHS = 4294967293, + REASON_LIMIT = 4294967292, + REASON_STACK = 4294967291, +}; + +struct bpf_sanitize_info { + struct bpf_insn_aux_data aux; + bool mask_to_left; + long: 32; +}; + +enum { + DISCOVERED = 16, + EXPLORED = 32, + FALLTHROUGH = 1, + BRANCH = 2, +}; + +enum { + DONE_EXPLORING = 0, + KEEP_EXPLORING = 1, +}; + +struct tree_descr { + const char *name; + const struct file_operations *ops; + int mode; +}; + +struct bpf_preload_info { + char link_name[16]; + struct bpf_link *link; +}; + +struct bpf_preload_ops { + int (*preload)(struct bpf_preload_info *); + struct module *owner; +}; + +enum bpf_type { + BPF_TYPE_UNSPEC = 0, + BPF_TYPE_PROG = 1, + BPF_TYPE_MAP = 2, + BPF_TYPE_LINK = 3, +}; + +struct map_iter { + void *key; + bool done; +}; + +enum { + OPT_MODE = 0, +}; + +struct bpf_mount_opts { + umode_t mode; +}; + +struct bpf_timer { + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_dynptr { + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_list_head { + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_list_node { + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_rb_root { + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_rb_node { + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_pidns_info { + __u32 pid; + __u32 tgid; +}; + +struct btf_id_dtor_kfunc { + u32 btf_id; + u32 kfunc_btf_id; +}; + +typedef u64 (*btf_bpf_map_lookup_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_update_elem)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_map_delete_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_push_elem)(struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_map_pop_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_peek_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_lookup_percpu_elem)(struct bpf_map *, void *, u32); + +typedef u64 (*btf_bpf_get_smp_processor_id)(); + +typedef u64 (*btf_bpf_get_numa_node_id)(); + +typedef u64 (*btf_bpf_ktime_get_ns)(); + +typedef u64 (*btf_bpf_ktime_get_boot_ns)(); + +typedef u64 (*btf_bpf_ktime_get_coarse_ns)(); + +typedef u64 (*btf_bpf_ktime_get_tai_ns)(); + +typedef u64 (*btf_bpf_get_current_pid_tgid)(); + +typedef u64 (*btf_bpf_get_current_uid_gid)(); + +typedef u64 (*btf_bpf_get_current_comm)(char *, u32); + +typedef u64 (*btf_bpf_spin_lock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_spin_unlock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_jiffies64)(); + +typedef u64 (*btf_bpf_get_current_cgroup_id)(); + +typedef u64 (*btf_bpf_get_current_ancestor_cgroup_id)(int); + +typedef u64 (*btf_bpf_strtol)(const char *, size_t, u64, long int *); + +typedef u64 (*btf_bpf_strtoul)(const char *, size_t, u64, long unsigned int *); + +typedef u64 (*btf_bpf_strncmp)(const char *, u32, const char *); + +typedef u64 (*btf_bpf_get_ns_current_pid_tgid)(u64, u64, struct bpf_pidns_info *, u32); + +typedef u64 (*btf_bpf_event_output_data)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_copy_from_user)(void *, u32, const void *); + +typedef u64 (*btf_bpf_copy_from_user_task)(void *, u32, const void *, struct task_struct *, u64); + +typedef u64 (*btf_bpf_per_cpu_ptr)(const void *, u32); + +typedef u64 (*btf_bpf_this_cpu_ptr)(const void *); + +struct bpf_bprintf_buffers { + char bin_args[512]; + char buf[1024]; +}; + +typedef u64 (*btf_bpf_snprintf)(char *, u32, char *, const void *, u32); + +struct bpf_hrtimer { + struct hrtimer timer; + struct bpf_map *map; + struct bpf_prog *prog; + void *callback_fn; + void *value; +}; + +struct bpf_timer_kern { + struct bpf_hrtimer *timer; + struct bpf_spin_lock lock; +}; + +typedef u64 (*btf_bpf_timer_init)(struct bpf_timer_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_timer_set_callback)(struct bpf_timer_kern *, void *, struct bpf_prog_aux *); + +typedef u64 (*btf_bpf_timer_start)(struct bpf_timer_kern *, u64, u64); + +typedef u64 (*btf_bpf_timer_cancel)(struct bpf_timer_kern *); + +typedef u64 (*btf_bpf_kptr_xchg)(void *, void *); + +typedef u64 (*btf_bpf_dynptr_from_mem)(void *, u32, u64, struct bpf_dynptr_kern *); + +typedef u64 (*btf_bpf_dynptr_read)(void *, u32, const struct bpf_dynptr_kern *, u32, u64); + +typedef u64 (*btf_bpf_dynptr_write)(const struct bpf_dynptr_kern *, u32, void *, u32, u64); + +typedef u64 (*btf_bpf_dynptr_data)(const struct bpf_dynptr_kern *, u32, u32); + +struct bpf_iter_target_info { + struct list_head list; + const struct bpf_iter_reg *reg_info; + u32 btf_id; +}; + +struct bpf_iter_link { + struct bpf_link link; + struct bpf_iter_aux_info aux; + struct bpf_iter_target_info *tinfo; +}; + +struct bpf_iter_priv_data { + struct bpf_iter_target_info *tinfo; + const struct bpf_iter_seq_info *seq_info; + struct bpf_prog *prog; + long: 32; + u64 session_id; + u64 seq_num; + bool done_stop; + long: 32; + u8 target_private[0]; +}; + +typedef u64 (*btf_bpf_for_each_map_elem)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_loop)(u32, void *, void *, u64); + +struct bpf_iter_seq_map_info { + u32 map_id; +}; + +struct bpf_iter__bpf_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; +}; + +struct mmap_unlock_irq_work { + struct irq_work irq_work; + struct mm_struct *mm; +}; + +struct bpf_iter_seq_task_common { + struct pid_namespace *ns; + enum bpf_iter_task_type type; + u32 pid; + u32 pid_visiting; +}; + +struct bpf_iter_seq_task_info { + struct bpf_iter_seq_task_common common; + u32 tid; +}; + +struct bpf_iter__task { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; +}; + +struct bpf_iter_seq_task_file_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + u32 tid; + u32 fd; +}; + +struct bpf_iter__task_file { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + u32 fd; + long: 32; + union { + struct file *file; + }; +}; + +struct bpf_iter_seq_task_vma_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + struct mm_struct *mm; + struct vm_area_struct *vma; + u32 tid; + long unsigned int prev_vm_start; + long unsigned int prev_vm_end; +}; + +enum bpf_task_vma_iter_find_op { + task_vma_iter_first_vma = 0, + task_vma_iter_next_vma = 1, + task_vma_iter_find_vma = 2, +}; + +struct bpf_iter__task_vma { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + union { + struct vm_area_struct *vma; + }; +}; + +typedef u64 (*btf_bpf_find_vma)(struct task_struct *, u64, bpf_callback_t, void *, u64); + +struct bpf_iter_seq_prog_info { + u32 prog_id; +}; + +struct bpf_iter__bpf_prog { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_prog *prog; + }; +}; + +struct bpf_iter_seq_link_info { + u32 link_id; +}; + +struct bpf_iter__bpf_link { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_link *link; + }; +}; + +struct bpf_iter__bpf_map_elem { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + void *value; + }; +}; + +struct hlist_nulls_head { + struct hlist_nulls_node *first; +}; + +struct pcpu_freelist_node; + +struct pcpu_freelist_head { + struct pcpu_freelist_node *first; + raw_spinlock_t lock; +}; + +struct pcpu_freelist_node { + struct pcpu_freelist_node *next; +}; + +struct pcpu_freelist { + struct pcpu_freelist_head *freelist; + struct pcpu_freelist_head extralist; +}; + +struct bpf_lru_node { + struct list_head list; + u16 cpu; + u8 type; + u8 ref; +}; + +struct bpf_lru_list { + struct list_head lists[3]; + unsigned int counts[2]; + struct list_head *next_inactive_rotation; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + raw_spinlock_t lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_lru_locallist { + struct list_head lists[2]; + u16 next_steal; + raw_spinlock_t lock; +}; + +struct bpf_common_lru { + struct bpf_lru_list lru_list; + struct bpf_lru_locallist *local_list; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +typedef bool (*del_from_htab_func)(void *, struct bpf_lru_node *); + +struct bpf_lru { + union { + struct bpf_common_lru common_lru; + struct bpf_lru_list *percpu_lru; + }; + del_from_htab_func del_from_htab; + void *del_arg; + unsigned int hash_offset; + unsigned int nr_scans; + bool percpu; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bucket { + struct hlist_nulls_head head; + raw_spinlock_t raw_lock; +}; + +struct htab_elem; + +struct bpf_htab { + struct bpf_map map; + struct bpf_mem_alloc ma; + struct bpf_mem_alloc pcpu_ma; + struct bucket *buckets; + void *elems; + long: 32; + long: 32; + union { + struct pcpu_freelist freelist; + struct bpf_lru lru; + }; + struct htab_elem **extra_elems; + long: 32; + struct percpu_counter pcount; + atomic_t count; + bool use_percpu_counter; + u32 n_buckets; + u32 elem_size; + u32 hashrnd; + struct lock_class_key lockdep_key; + int *map_locked[8]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct htab_elem { + union { + struct hlist_nulls_node hash_node; + struct { + void *padding; + union { + struct pcpu_freelist_node fnode; + struct htab_elem *batch_flink; + }; + }; + }; + union { + void *ptr_to_pptr; + struct bpf_lru_node lru_node; + }; + u32 hash; + char key[0]; +}; + +struct bpf_iter_seq_hash_map_info { + struct bpf_map *map; + struct bpf_htab *htab; + void *percpu_value_buf; + u32 bucket_id; + u32 skip_elems; +}; + +struct bpf_iter_seq_array_map_info { + struct bpf_map *map; + void *percpu_value_buf; + u32 index; +}; + +struct prog_poke_elem { + struct list_head list; + struct bpf_prog_aux *aux; +}; + +enum bpf_lru_list_type { + BPF_LRU_LIST_T_ACTIVE = 0, + BPF_LRU_LIST_T_INACTIVE = 1, + BPF_LRU_LIST_T_FREE = 2, + BPF_LRU_LOCAL_LIST_T_FREE = 3, + BPF_LRU_LOCAL_LIST_T_PENDING = 4, +}; + +struct bpf_lpm_trie_key { + __u32 prefixlen; + __u8 data[0]; +}; + +struct lpm_trie_node { + struct callback_head rcu; + struct lpm_trie_node *child[2]; + u32 prefixlen; + u32 flags; + u8 data[0]; +}; + +struct lpm_trie { + struct bpf_map map; + struct lpm_trie_node *root; + size_t n_entries; + size_t max_prefixlen; + size_t data_size; + spinlock_t lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_bloom_filter { + struct bpf_map map; + u32 bitset_mask; + u32 hash_seed; + u32 aligned_u32_count; + u32 nr_hash_funcs; + long unsigned int bitset[0]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_cgroup_storage_map { + struct bpf_map map; + spinlock_t lock; + struct rb_root root; + struct list_head list; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_queue_stack { + struct bpf_map map; + raw_spinlock_t lock; + u32 head; + u32 tail; + u32 size; + char elements[0]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +enum { + BPF_RB_NO_WAKEUP = 1, + BPF_RB_FORCE_WAKEUP = 2, +}; + +enum { + BPF_RB_AVAIL_DATA = 0, + BPF_RB_RING_SIZE = 1, + BPF_RB_CONS_POS = 2, + BPF_RB_PROD_POS = 3, +}; + +enum { + BPF_RINGBUF_BUSY_BIT = 2147483648, + BPF_RINGBUF_DISCARD_BIT = 1073741824, + BPF_RINGBUF_HDR_SZ = 8, +}; + +struct bpf_ringbuf { + wait_queue_head_t waitq; + struct irq_work work; + long: 32; + u64 mask; + struct page **pages; + int nr_pages; + long: 32; + long: 32; + long: 32; + long: 32; + spinlock_t spinlock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + atomic_t busy; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long unsigned int consumer_pos; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long unsigned int producer_pos; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + char data[0]; +}; + +struct bpf_ringbuf_map { + struct bpf_map map; + struct bpf_ringbuf *rb; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_ringbuf_hdr { + u32 len; + u32 pg_off; +}; + +typedef u64 (*btf_bpf_ringbuf_reserve)(struct bpf_map *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_submit)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_discard)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_output)(struct bpf_map *, void *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_query)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_ringbuf_reserve_dynptr)(struct bpf_map *, u32, u64, struct bpf_dynptr_kern *); + +typedef u64 (*btf_bpf_ringbuf_submit_dynptr)(struct bpf_dynptr_kern *, u64); + +typedef u64 (*btf_bpf_ringbuf_discard_dynptr)(struct bpf_dynptr_kern *, u64); + +typedef u64 (*btf_bpf_user_ringbuf_drain)(struct bpf_map *, void *, void *, u64); + +struct bpf_local_storage_elem { + struct hlist_node map_node; + struct hlist_node snode; + struct bpf_local_storage *local_storage; + struct callback_head rcu; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct bpf_local_storage_data sdata; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_local_storage_cache { + spinlock_t idx_lock; + long: 32; + u64 idx_usage_counts[16]; +}; + +enum { + BPF_LOCAL_STORAGE_GET_F_CREATE = 1, + BPF_SK_STORAGE_GET_F_CREATE = 1, +}; + +typedef u64 (*btf_bpf_task_storage_get_recur)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_task_storage_get)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_task_storage_delete_recur)(struct bpf_map *, struct task_struct *); + +typedef u64 (*btf_bpf_task_storage_delete)(struct bpf_map *, struct task_struct *); + +struct lsm_blob_sizes { + int lbs_cred; + int lbs_file; + int lbs_inode; + int lbs_superblock; + int lbs_ipc; + int lbs_msg_msg; + int lbs_task; +}; + +struct bpf_storage_blob { + struct bpf_local_storage *storage; +}; + +typedef u64 (*btf_bpf_inode_storage_get)(struct bpf_map *, struct inode *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_inode_storage_delete)(struct bpf_map *, struct inode *); + +struct bpf_tramp_links { + struct bpf_tramp_link *links[38]; + int nr_links; +}; + +typedef u64 (*bpf_trampoline_enter_t)(struct bpf_prog *, struct bpf_tramp_run_ctx *); + +typedef void (*bpf_trampoline_exit_t)(struct bpf_prog *, u64, struct bpf_tramp_run_ctx *); + +struct bpf_shim_tramp_link { + struct bpf_tramp_link link; + struct bpf_trampoline *trampoline; + long: 32; +}; + +typedef void (*swap_r_func_t)(void *, void *, int, const void *); + +typedef int (*cmp_r_func_t)(const void *, const void *, const void *); + +struct btf_enum { + __u32 name_off; + __s32 val; +}; + +enum { + BTF_VAR_STATIC = 0, + BTF_VAR_GLOBAL_ALLOCATED = 1, + BTF_VAR_GLOBAL_EXTERN = 2, +}; + +struct btf_var { + __u32 linkage; +}; + +struct btf_decl_tag { + __s32 component_idx; +}; + +struct btf_enum64 { + __u32 name_off; + __u32 val_lo32; + __u32 val_hi32; +}; + +struct bpf_flow_keys { + __u16 nhoff; + __u16 thoff; + __u16 addr_proto; + __u8 is_frag; + __u8 is_first_frag; + __u8 is_encap; + __u8 ip_proto; + __be16 n_proto; + __be16 sport; + __be16 dport; + union { + struct { + __be32 ipv4_src; + __be32 ipv4_dst; + }; + struct { + __u32 ipv6_src[4]; + __u32 ipv6_dst[4]; + }; + }; + __u32 flags; + __be32 flow_label; +}; + +struct bpf_sock { + __u32 bound_dev_if; + __u32 family; + __u32 type; + __u32 protocol; + __u32 mark; + __u32 priority; + __u32 src_ip4; + __u32 src_ip6[4]; + __u32 src_port; + __be16 dst_port; + __u32 dst_ip4; + __u32 dst_ip6[4]; + __u32 state; + __s32 rx_queue_mapping; +}; + +struct __sk_buff { + __u32 len; + __u32 pkt_type; + __u32 mark; + __u32 queue_mapping; + __u32 protocol; + __u32 vlan_present; + __u32 vlan_tci; + __u32 vlan_proto; + __u32 priority; + __u32 ingress_ifindex; + __u32 ifindex; + __u32 tc_index; + __u32 cb[5]; + __u32 hash; + __u32 tc_classid; + __u32 data; + __u32 data_end; + __u32 napi_id; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 data_meta; + union { + struct bpf_flow_keys *flow_keys; + }; + __u64 tstamp; + __u32 wire_len; + __u32 gso_segs; + union { + struct bpf_sock *sk; + }; + __u32 gso_size; + __u8 tstamp_type; + __u64 hwtstamp; +}; + +struct sk_msg_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 size; + union { + struct bpf_sock *sk; + }; +}; + +struct sk_reuseport_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 len; + __u32 eth_protocol; + __u32 ip_protocol; + __u32 bind_inany; + __u32 hash; + long: 32; + union { + struct bpf_sock *sk; + }; + union { + struct bpf_sock *migrating_sk; + }; +}; + +struct bpf_sock_addr { + __u32 user_family; + __u32 user_ip4; + __u32 user_ip6[4]; + __u32 user_port; + __u32 family; + __u32 type; + __u32 protocol; + __u32 msg_src_ip4; + __u32 msg_src_ip6[4]; + long: 32; + union { + struct bpf_sock *sk; + }; +}; + +struct bpf_sock_ops { + __u32 op; + union { + __u32 args[4]; + __u32 reply; + __u32 replylong[4]; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 is_fullsock; + __u32 snd_cwnd; + __u32 srtt_us; + __u32 bpf_sock_ops_cb_flags; + __u32 state; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u32 sk_txhash; + __u64 bytes_received; + __u64 bytes_acked; + union { + struct bpf_sock *sk; + }; + union { + void *skb_data; + }; + union { + void *skb_data_end; + }; + __u32 skb_len; + __u32 skb_tcp_flags; + __u64 skb_hwtstamp; +}; + +struct bpf_cgroup_dev_ctx { + __u32 access_type; + __u32 major; + __u32 minor; +}; + +struct bpf_sysctl { + __u32 write; + __u32 file_pos; +}; + +struct bpf_sockopt { + union { + struct bpf_sock *sk; + }; + union { + void *optval; + }; + union { + void *optval_end; + }; + __s32 level; + __s32 optname; + __s32 optlen; + __s32 retval; +}; + +struct bpf_sk_lookup { + union { + union { + struct bpf_sock *sk; + }; + __u64 cookie; + }; + __u32 family; + __u32 protocol; + __u32 remote_ip4; + __u32 remote_ip6[4]; + __be16 remote_port; + __u32 local_ip4; + __u32 local_ip6[4]; + __u32 local_port; + __u32 ingress_ifindex; + long: 32; +}; + +struct btf_struct_metas { + u32 cnt; + struct btf_struct_meta types[0]; +}; + +struct sk_reuseport_kern { + struct sk_buff *skb; + struct sock *sk; + struct sock *selected_sk; + struct sock *migrating_sk; + void *data_end; + u32 hash; + u32 reuseport_id; + bool bind_inany; +}; + +struct bpf_flow_dissector { + struct bpf_flow_keys *flow_keys; + const struct sk_buff *skb; + const void *data; + const void *data_end; +}; + +struct inet_ehash_bucket; + +struct inet_bind_hashbucket; + +struct inet_listen_hashbucket; + +struct inet_hashinfo { + struct inet_ehash_bucket *ehash; + spinlock_t *ehash_locks; + unsigned int ehash_mask; + unsigned int ehash_locks_mask; + struct kmem_cache *bind_bucket_cachep; + struct inet_bind_hashbucket *bhash; + struct kmem_cache *bind2_bucket_cachep; + struct inet_bind_hashbucket *bhash2; + unsigned int bhash_size; + unsigned int lhash2_mask; + struct inet_listen_hashbucket *lhash2; + bool pernet; +}; + +struct ip_ra_chain { + struct ip_ra_chain *next; + struct sock *sk; + union { + void (*destructor)(struct sock *); + struct sock *saved_sk; + }; + struct callback_head rcu; +}; + +struct fib_table { + struct hlist_node tb_hlist; + u32 tb_id; + int tb_num_default; + struct callback_head rcu; + long unsigned int *tb_data; + long unsigned int __data[0]; +}; + +struct inet_peer_base { + struct rb_root rb_root; + seqlock_t lock; + int total; +}; + +struct tcp_fastopen_context { + siphash_key_t key[2]; + int num; + struct callback_head rcu; + long: 32; +}; + +struct bpf_sock_addr_kern { + struct sock *sk; + struct sockaddr *uaddr; + u64 tmp_reg; + void *t_ctx; + long: 32; +}; + +struct bpf_sock_ops_kern { + struct sock *sk; + union { + u32 args[4]; + u32 reply; + u32 replylong[4]; + }; + struct sk_buff *syn_skb; + struct sk_buff *skb; + void *skb_data_end; + u8 op; + u8 is_fullsock; + u8 remaining_opt_len; + long: 32; + u64 temp; +}; + +struct bpf_sysctl_kern { + struct ctl_table_header *head; + struct ctl_table *table; + void *cur_val; + size_t cur_len; + void *new_val; + size_t new_len; + int new_updated; + int write; + loff_t *ppos; + long: 32; + u64 tmp_reg; +}; + +struct bpf_sockopt_kern { + struct sock *sk; + u8 *optval; + u8 *optval_end; + s32 level; + s32 optname; + s32 optlen; + struct task_struct *current_task; + long: 32; + u64 tmp_reg; +}; + +struct bpf_sk_lookup_kern { + u16 family; + u16 protocol; + __be16 sport; + u16 dport; + struct { + __be32 saddr; + __be32 daddr; + } v4; + struct { + const struct in6_addr *saddr; + const struct in6_addr *daddr; + } v6; + struct sock *selected_sk; + u32 ingress_ifindex; + bool no_reuseport; +}; + +struct lwtunnel_state { + __u16 type; + __u16 flags; + __u16 headroom; + atomic_t refcnt; + int (*orig_output)(struct net *, struct sock *, struct sk_buff *); + int (*orig_input)(struct sk_buff *); + struct callback_head rcu; + __u8 data[0]; +}; + +struct sock_reuseport { + struct callback_head rcu; + u16 max_socks; + u16 num_socks; + u16 num_closed_socks; + u16 incoming_cpu; + unsigned int synq_overflow_ts; + unsigned int reuseport_id; + unsigned int bind_inany: 1; + unsigned int has_conns: 1; + struct bpf_prog *prog; + struct sock *socks[0]; +}; + +struct sk_psock_progs { + struct bpf_prog *msg_parser; + struct bpf_prog *stream_parser; + struct bpf_prog *stream_verdict; + struct bpf_prog *skb_verdict; +}; + +struct strp_stats { + long long unsigned int msgs; + long long unsigned int bytes; + unsigned int mem_fail; + unsigned int need_more_hdr; + unsigned int msg_too_big; + unsigned int msg_timeouts; + unsigned int bad_hdr_len; + long: 32; +}; + +struct strparser; + +struct strp_callbacks { + int (*parse_msg)(struct strparser *, struct sk_buff *); + void (*rcv_msg)(struct strparser *, struct sk_buff *); + int (*read_sock_done)(struct strparser *, int); + void (*abort_parser)(struct strparser *, int); + void (*lock)(struct strparser *); + void (*unlock)(struct strparser *); +}; + +struct strparser { + struct sock *sk; + u32 stopped: 1; + u32 paused: 1; + u32 aborted: 1; + u32 interrupted: 1; + u32 unrecov_intr: 1; + struct sk_buff **skb_nextp; + struct sk_buff *skb_head; + unsigned int need_bytes; + struct delayed_work msg_timer_work; + struct work_struct work; + struct strp_stats stats; + struct strp_callbacks cb; +}; + +struct sk_psock_work_state { + struct sk_buff *skb; + u32 len; + u32 off; +}; + +struct sk_msg; + +struct sk_psock { + struct sock *sk; + struct sock *sk_redir; + u32 apply_bytes; + u32 cork_bytes; + u32 eval; + bool redir_ingress; + struct sk_msg *cork; + struct sk_psock_progs progs; + long: 32; + struct strparser strp; + struct sk_buff_head ingress_skb; + struct list_head ingress_msg; + spinlock_t ingress_lock; + long unsigned int state; + struct list_head link; + spinlock_t link_lock; + refcount_t refcnt; + void (*saved_unhash)(struct sock *); + void (*saved_destroy)(struct sock *); + void (*saved_close)(struct sock *, long int); + void (*saved_write_space)(struct sock *); + void (*saved_data_ready)(struct sock *); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + struct proto *sk_proto; + struct mutex work_mutex; + struct sk_psock_work_state work_state; + struct work_struct work; + struct rcu_work rwork; +}; + +enum { + __ND_OPT_PREFIX_INFO_END = 0, + ND_OPT_SOURCE_LL_ADDR = 1, + ND_OPT_TARGET_LL_ADDR = 2, + ND_OPT_PREFIX_INFO = 3, + ND_OPT_REDIRECT_HDR = 4, + ND_OPT_MTU = 5, + ND_OPT_NONCE = 14, + __ND_OPT_ARRAY_MAX = 15, + ND_OPT_ROUTE_INFO = 24, + ND_OPT_RDNSS = 25, + ND_OPT_DNSSL = 31, + ND_OPT_6CO = 34, + ND_OPT_CAPTIVE_PORTAL = 37, + ND_OPT_PREF64 = 38, + __ND_OPT_MAX = 39, +}; + +struct nd_opt_hdr { + __u8 nd_opt_type; + __u8 nd_opt_len; +}; + +struct ndisc_options { + struct nd_opt_hdr *nd_opt_array[15]; + struct nd_opt_hdr *nd_opts_ri; + struct nd_opt_hdr *nd_opts_ri_end; + struct nd_opt_hdr *nd_useropts; + struct nd_opt_hdr *nd_useropts_end; + struct nd_opt_hdr *nd_802154_opt_array[3]; +}; + +struct prefix_info { + __u8 type; + __u8 length; + __u8 prefix_len; + __u8 reserved: 6; + __u8 autoconf: 1; + __u8 onlink: 1; + __be32 valid; + __be32 prefered; + __be32 reserved2; + struct in6_addr prefix; +}; + +struct inet_ehash_bucket { + struct hlist_nulls_head chain; +}; + +struct inet_bind_hashbucket { + spinlock_t lock; + struct hlist_head chain; +}; + +struct inet_listen_hashbucket { + spinlock_t lock; + struct hlist_nulls_head nulls_head; +}; + +struct ack_sample { + u32 pkts_acked; + s32 rtt_us; + u32 in_flight; +}; + +struct rate_sample { + u64 prior_mstamp; + u32 prior_delivered; + u32 prior_delivered_ce; + s32 delivered; + s32 delivered_ce; + long int interval_us; + u32 snd_interval_us; + u32 rcv_interval_us; + long int rtt_us; + int losses; + u32 acked_sacked; + u32 prior_in_flight; + u32 last_end_seq; + bool is_app_limited; + bool is_retrans; + bool is_ack_delayed; + long: 32; +}; + +struct sk_msg_sg { + u32 start; + u32 curr; + u32 end; + u32 size; + u32 copybreak; + long unsigned int copy[1]; + struct scatterlist data[19]; +}; + +struct sk_msg { + struct sk_msg_sg sg; + void *data; + void *data_end; + u32 apply_bytes; + u32 cork_bytes; + u32 flags; + struct sk_buff *skb; + struct sock *sk_redir; + struct sock *sk; + struct list_head list; +}; + +struct bpf_core_cand { + const struct btf *btf; + __u32 id; +}; + +struct bpf_core_cand_list { + struct bpf_core_cand *cands; + int len; +}; + +struct bpf_core_accessor { + __u32 type_id; + __u32 idx; + const char *name; +}; + +struct bpf_core_spec { + const struct btf *btf; + struct bpf_core_accessor spec[64]; + __u32 root_type_id; + enum bpf_core_relo_kind relo_kind; + int len; + int raw_spec[64]; + int raw_len; + __u32 bit_offset; +}; + +struct bpf_core_relo_res { + __u64 orig_val; + __u64 new_val; + bool poison; + bool validate; + bool fail_memsz_adjust; + __u32 orig_sz; + __u32 orig_type_id; + __u32 new_sz; + __u32 new_type_id; + long: 32; +}; + +enum btf_kfunc_hook { + BTF_KFUNC_HOOK_COMMON = 0, + BTF_KFUNC_HOOK_XDP = 1, + BTF_KFUNC_HOOK_TC = 2, + BTF_KFUNC_HOOK_STRUCT_OPS = 3, + BTF_KFUNC_HOOK_TRACING = 4, + BTF_KFUNC_HOOK_SYSCALL = 5, + BTF_KFUNC_HOOK_FMODRET = 6, + BTF_KFUNC_HOOK_MAX = 7, +}; + +enum { + BTF_KFUNC_SET_MAX_CNT = 256, + BTF_DTOR_KFUNC_MAX_CNT = 256, +}; + +struct btf_kfunc_set_tab { + struct btf_id_set8 *sets[7]; +}; + +struct btf_id_dtor_kfunc_tab { + u32 cnt; + struct btf_id_dtor_kfunc dtors[0]; +}; + +enum verifier_phase { + CHECK_META = 0, + CHECK_TYPE = 1, +}; + +struct resolve_vertex { + const struct btf_type *t; + u32 type_id; + u16 next_member; +}; + +enum visit_state { + NOT_VISITED = 0, + VISITED = 1, + RESOLVED = 2, +}; + +enum resolve_mode { + RESOLVE_TBD = 0, + RESOLVE_PTR = 1, + RESOLVE_STRUCT_OR_ARRAY = 2, +}; + +struct btf_sec_info { + u32 off; + u32 len; +}; + +struct btf_verifier_env { + struct btf *btf; + u8 *visit_states; + struct resolve_vertex stack[32]; + struct bpf_verifier_log log; + u32 log_type_id; + u32 top_stack; + enum verifier_phase phase; + enum resolve_mode resolve_mode; +}; + +struct btf_show { + u64 flags; + void *target; + void (*showfn)(struct btf_show *, const char *, va_list); + const struct btf *btf; + struct { + u8 depth; + u8 depth_to_show; + u8 depth_check; + u8 array_member: 1; + u8 array_terminated: 1; + u16 array_encoding; + u32 type_id; + int status; + const struct btf_type *type; + const struct btf_member *member; + char name[80]; + } state; + struct { + u32 size; + void *head; + void *data; + u8 safe[32]; + } obj; +}; + +struct btf_kind_operations { + s32 (*check_meta)(struct btf_verifier_env *, const struct btf_type *, u32); + int (*resolve)(struct btf_verifier_env *, const struct resolve_vertex *); + int (*check_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + int (*check_kflag_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + void (*log_details)(struct btf_verifier_env *, const struct btf_type *); + void (*show)(const struct btf *, const struct btf_type *, u32, void *, u8, struct btf_show *); +}; + +enum { + BTF_FIELD_IGNORE = 0, + BTF_FIELD_FOUND = 1, +}; + +struct btf_field_info { + enum btf_field_type type; + u32 off; + union { + struct { + u32 type_id; + } kptr; + struct { + const char *node_name; + u32 value_btf_id; + } graph_root; + }; +}; + +struct bpf_ctx_convert { + struct __sk_buff BPF_PROG_TYPE_SOCKET_FILTER_prog; + struct sk_buff BPF_PROG_TYPE_SOCKET_FILTER_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_CLS_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_CLS_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_ACT_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_ACT_kern; + struct xdp_md BPF_PROG_TYPE_XDP_prog; + struct xdp_buff BPF_PROG_TYPE_XDP_kern; + struct __sk_buff BPF_PROG_TYPE_CGROUP_SKB_prog; + struct sk_buff BPF_PROG_TYPE_CGROUP_SKB_kern; + struct bpf_sock BPF_PROG_TYPE_CGROUP_SOCK_prog; + struct sock BPF_PROG_TYPE_CGROUP_SOCK_kern; + struct bpf_sock_addr BPF_PROG_TYPE_CGROUP_SOCK_ADDR_prog; + struct bpf_sock_addr_kern BPF_PROG_TYPE_CGROUP_SOCK_ADDR_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_IN_prog; + struct sk_buff BPF_PROG_TYPE_LWT_IN_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_OUT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_OUT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_XMIT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_XMIT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_prog; + struct sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_kern; + struct bpf_sock_ops BPF_PROG_TYPE_SOCK_OPS_prog; + struct bpf_sock_ops_kern BPF_PROG_TYPE_SOCK_OPS_kern; + struct __sk_buff BPF_PROG_TYPE_SK_SKB_prog; + struct sk_buff BPF_PROG_TYPE_SK_SKB_kern; + struct sk_msg_md BPF_PROG_TYPE_SK_MSG_prog; + struct sk_msg BPF_PROG_TYPE_SK_MSG_kern; + struct __sk_buff BPF_PROG_TYPE_FLOW_DISSECTOR_prog; + struct bpf_flow_dissector BPF_PROG_TYPE_FLOW_DISSECTOR_kern; + bpf_user_pt_regs_t BPF_PROG_TYPE_KPROBE_prog; + struct pt_regs BPF_PROG_TYPE_KPROBE_kern; + __u64 BPF_PROG_TYPE_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_TRACEPOINT_kern; + struct bpf_perf_event_data BPF_PROG_TYPE_PERF_EVENT_prog; + struct bpf_perf_event_data_kern BPF_PROG_TYPE_PERF_EVENT_kern; + long: 32; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_kern; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_kern; + void *BPF_PROG_TYPE_TRACING_prog; + void *BPF_PROG_TYPE_TRACING_kern; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_prog; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_kern; + struct bpf_sysctl BPF_PROG_TYPE_CGROUP_SYSCTL_prog; + struct bpf_sysctl_kern BPF_PROG_TYPE_CGROUP_SYSCTL_kern; + struct bpf_sockopt BPF_PROG_TYPE_CGROUP_SOCKOPT_prog; + struct bpf_sockopt_kern BPF_PROG_TYPE_CGROUP_SOCKOPT_kern; + struct sk_reuseport_md BPF_PROG_TYPE_SK_REUSEPORT_prog; + struct sk_reuseport_kern BPF_PROG_TYPE_SK_REUSEPORT_kern; + struct bpf_sk_lookup BPF_PROG_TYPE_SK_LOOKUP_prog; + struct bpf_sk_lookup_kern BPF_PROG_TYPE_SK_LOOKUP_kern; + void *BPF_PROG_TYPE_STRUCT_OPS_prog; + void *BPF_PROG_TYPE_STRUCT_OPS_kern; + void *BPF_PROG_TYPE_EXT_prog; + void *BPF_PROG_TYPE_EXT_kern; + void *BPF_PROG_TYPE_LSM_prog; + void *BPF_PROG_TYPE_LSM_kern; + void *BPF_PROG_TYPE_SYSCALL_prog; + void *BPF_PROG_TYPE_SYSCALL_kern; + long: 32; +}; + +enum { + __ctx_convertBPF_PROG_TYPE_SOCKET_FILTER = 0, + __ctx_convertBPF_PROG_TYPE_SCHED_CLS = 1, + __ctx_convertBPF_PROG_TYPE_SCHED_ACT = 2, + __ctx_convertBPF_PROG_TYPE_XDP = 3, + __ctx_convertBPF_PROG_TYPE_CGROUP_SKB = 4, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK = 5, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK_ADDR = 6, + __ctx_convertBPF_PROG_TYPE_LWT_IN = 7, + __ctx_convertBPF_PROG_TYPE_LWT_OUT = 8, + __ctx_convertBPF_PROG_TYPE_LWT_XMIT = 9, + __ctx_convertBPF_PROG_TYPE_LWT_SEG6LOCAL = 10, + __ctx_convertBPF_PROG_TYPE_SOCK_OPS = 11, + __ctx_convertBPF_PROG_TYPE_SK_SKB = 12, + __ctx_convertBPF_PROG_TYPE_SK_MSG = 13, + __ctx_convertBPF_PROG_TYPE_FLOW_DISSECTOR = 14, + __ctx_convertBPF_PROG_TYPE_KPROBE = 15, + __ctx_convertBPF_PROG_TYPE_TRACEPOINT = 16, + __ctx_convertBPF_PROG_TYPE_PERF_EVENT = 17, + __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT = 18, + __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 19, + __ctx_convertBPF_PROG_TYPE_TRACING = 20, + __ctx_convertBPF_PROG_TYPE_CGROUP_DEVICE = 21, + __ctx_convertBPF_PROG_TYPE_CGROUP_SYSCTL = 22, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCKOPT = 23, + __ctx_convertBPF_PROG_TYPE_SK_REUSEPORT = 24, + __ctx_convertBPF_PROG_TYPE_SK_LOOKUP = 25, + __ctx_convertBPF_PROG_TYPE_STRUCT_OPS = 26, + __ctx_convertBPF_PROG_TYPE_EXT = 27, + __ctx_convertBPF_PROG_TYPE_LSM = 28, + __ctx_convertBPF_PROG_TYPE_SYSCALL = 29, + __ctx_convert_unused = 30, +}; + +enum bpf_struct_walk_result { + WALK_SCALAR = 0, + WALK_PTR = 1, + WALK_STRUCT = 2, +}; + +struct btf_show_snprintf { + struct btf_show show; + int len_left; + int len; +}; + +enum { + BTF_MODULE_F_LIVE = 1, +}; + +struct btf_module { + struct list_head list; + struct module *module; + struct btf *btf; + struct bin_attribute *sysfs_attr; + int flags; +}; + +typedef u64 (*btf_bpf_btf_find_by_name_kind)(char *, int, u32, int); + +struct bpf_cand_cache { + const char *name; + u32 name_len; + u16 kind; + u16 cnt; + struct { + const struct btf *btf; + u32 id; + } cands[0]; +}; + +struct bpf_mem_cache { + struct llist_head free_llist; + local_t active; + struct llist_head free_llist_extra; + struct irq_work refill_work; + struct obj_cgroup *objcg; + int unit_size; + int free_cnt; + int low_watermark; + int high_watermark; + int batch; + int percpu_size; + struct callback_head rcu; + struct llist_head free_by_rcu; + struct llist_head waiting_for_gp; + atomic_t call_rcu_in_progress; +}; + +struct bpf_mem_caches { + struct bpf_mem_cache cache[11]; +}; + +struct bpf_dispatcher_prog { + struct bpf_prog *prog; + refcount_t users; +}; + +struct bpf_dispatcher { + struct mutex mutex; + void *func; + struct bpf_dispatcher_prog progs[48]; + int num_progs; + void *image; + void *rw_image; + u32 image_off; + struct bpf_ksym ksym; +}; + +enum { + BPF_F_BROADCAST = 8, + BPF_F_EXCLUDE_INGRESS = 16, +}; + +struct bpf_devmap_val { + __u32 ifindex; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +typedef struct bio_vec skb_frag_t; + +struct skb_shared_info { + __u8 flags; + __u8 meta_len; + __u8 nr_frags; + __u8 tx_flags; + short unsigned int gso_size; + short unsigned int gso_segs; + struct sk_buff *frag_list; + long: 32; + struct skb_shared_hwtstamps hwtstamps; + unsigned int gso_type; + u32 tskey; + atomic_t dataref; + unsigned int xdp_frags_size; + void *destructor_arg; + skb_frag_t frags[17]; +}; + +enum netdev_xdp_act { + NETDEV_XDP_ACT_BASIC = 1, + NETDEV_XDP_ACT_REDIRECT = 2, + NETDEV_XDP_ACT_NDO_XMIT = 4, + NETDEV_XDP_ACT_XSK_ZEROCOPY = 8, + NETDEV_XDP_ACT_HW_OFFLOAD = 16, + NETDEV_XDP_ACT_RX_SG = 32, + NETDEV_XDP_ACT_NDO_XMIT_SG = 64, +}; + +enum xdp_buff_flags { + XDP_FLAGS_HAS_FRAGS = 1, + XDP_FLAGS_FRAGS_PF_MEMALLOC = 2, +}; + +enum net_device_flags { + IFF_UP = 1, + IFF_BROADCAST = 2, + IFF_DEBUG = 4, + IFF_LOOPBACK = 8, + IFF_POINTOPOINT = 16, + IFF_NOTRAILERS = 32, + IFF_RUNNING = 64, + IFF_NOARP = 128, + IFF_PROMISC = 256, + IFF_ALLMULTI = 512, + IFF_MASTER = 1024, + IFF_SLAVE = 2048, + IFF_MULTICAST = 4096, + IFF_PORTSEL = 8192, + IFF_AUTOMEDIA = 16384, + IFF_DYNAMIC = 32768, + IFF_LOWER_UP = 65536, + IFF_DORMANT = 131072, + IFF_ECHO = 262144, +}; + +enum netdev_priv_flags { + IFF_802_1Q_VLAN = 1, + IFF_EBRIDGE = 2, + IFF_BONDING = 4, + IFF_ISATAP = 8, + IFF_WAN_HDLC = 16, + IFF_XMIT_DST_RELEASE = 32, + IFF_DONT_BRIDGE = 64, + IFF_DISABLE_NETPOLL = 128, + IFF_MACVLAN_PORT = 256, + IFF_BRIDGE_PORT = 512, + IFF_OVS_DATAPATH = 1024, + IFF_TX_SKB_SHARING = 2048, + IFF_UNICAST_FLT = 4096, + IFF_TEAM_PORT = 8192, + IFF_SUPP_NOFCS = 16384, + IFF_LIVE_ADDR_CHANGE = 32768, + IFF_MACVLAN = 65536, + IFF_XMIT_DST_RELEASE_PERM = 131072, + IFF_L3MDEV_MASTER = 262144, + IFF_NO_QUEUE = 524288, + IFF_OPENVSWITCH = 1048576, + IFF_L3MDEV_SLAVE = 2097152, + IFF_TEAM = 4194304, + IFF_RXFH_CONFIGURED = 8388608, + IFF_PHONY_HEADROOM = 16777216, + IFF_MACSEC = 33554432, + IFF_NO_RX_HANDLER = 67108864, + IFF_FAILOVER = 134217728, + IFF_FAILOVER_SLAVE = 268435456, + IFF_L3MDEV_RX_HANDLER = 536870912, + IFF_NO_ADDRCONF = 1073741824, + IFF_TX_SKB_NO_LINEAR = 2147483648, + IFF_CHANGE_PROTO_DOWN = 0, +}; + +struct xdp_dev_bulk_queue { + struct xdp_frame *q[16]; + struct list_head flush_node; + struct net_device *dev; + struct net_device *dev_rx; + struct bpf_prog *xdp_prog; + unsigned int count; +}; + +enum netdev_cmd { + NETDEV_UP = 1, + NETDEV_DOWN = 2, + NETDEV_REBOOT = 3, + NETDEV_CHANGE = 4, + NETDEV_REGISTER = 5, + NETDEV_UNREGISTER = 6, + NETDEV_CHANGEMTU = 7, + NETDEV_CHANGEADDR = 8, + NETDEV_PRE_CHANGEADDR = 9, + NETDEV_GOING_DOWN = 10, + NETDEV_CHANGENAME = 11, + NETDEV_FEAT_CHANGE = 12, + NETDEV_BONDING_FAILOVER = 13, + NETDEV_PRE_UP = 14, + NETDEV_PRE_TYPE_CHANGE = 15, + NETDEV_POST_TYPE_CHANGE = 16, + NETDEV_POST_INIT = 17, + NETDEV_PRE_UNINIT = 18, + NETDEV_RELEASE = 19, + NETDEV_NOTIFY_PEERS = 20, + NETDEV_JOIN = 21, + NETDEV_CHANGEUPPER = 22, + NETDEV_RESEND_IGMP = 23, + NETDEV_PRECHANGEMTU = 24, + NETDEV_CHANGEINFODATA = 25, + NETDEV_BONDING_INFO = 26, + NETDEV_PRECHANGEUPPER = 27, + NETDEV_CHANGELOWERSTATE = 28, + NETDEV_UDP_TUNNEL_PUSH_INFO = 29, + NETDEV_UDP_TUNNEL_DROP_INFO = 30, + NETDEV_CHANGE_TX_QUEUE_LEN = 31, + NETDEV_CVLAN_FILTER_PUSH_INFO = 32, + NETDEV_CVLAN_FILTER_DROP_INFO = 33, + NETDEV_SVLAN_FILTER_PUSH_INFO = 34, + NETDEV_SVLAN_FILTER_DROP_INFO = 35, + NETDEV_OFFLOAD_XSTATS_ENABLE = 36, + NETDEV_OFFLOAD_XSTATS_DISABLE = 37, + NETDEV_OFFLOAD_XSTATS_REPORT_USED = 38, + NETDEV_OFFLOAD_XSTATS_REPORT_DELTA = 39, + NETDEV_XDP_FEAT_CHANGE = 40, +}; + +struct netdev_notifier_info { + struct net_device *dev; + struct netlink_ext_ack *extack; +}; + +struct bpf_nh_params { + u32 nh_family; + union { + u32 ipv4_nh; + struct in6_addr ipv6_nh; + }; +}; + +struct bpf_redirect_info { + u64 tgt_index; + void *tgt_value; + struct bpf_map *map; + u32 flags; + u32 kern_flags; + u32 map_id; + enum bpf_map_type map_type; + struct bpf_nh_params nh; + long: 32; +}; + +struct bpf_dtab; + +struct bpf_dtab_netdev { + struct net_device *dev; + struct hlist_node index_hlist; + struct bpf_dtab *dtab; + struct bpf_prog *xdp_prog; + struct callback_head rcu; + unsigned int idx; + struct bpf_devmap_val val; +}; + +struct bpf_dtab { + struct bpf_map map; + struct bpf_dtab_netdev **netdev_map; + struct list_head list; + struct hlist_head *dev_index_head; + spinlock_t index_lock; + unsigned int items; + u32 n_buckets; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_cpumap_val { + __u32 qsize; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +struct bpf_cpu_map_entry; + +struct xdp_bulk_queue { + void *q[8]; + struct list_head flush_node; + struct bpf_cpu_map_entry *obj; + unsigned int count; +}; + +struct bpf_cpu_map; + +struct bpf_cpu_map_entry { + u32 cpu; + int map_id; + struct xdp_bulk_queue *bulkq; + struct bpf_cpu_map *cmap; + struct ptr_ring *queue; + struct task_struct *kthread; + struct bpf_cpumap_val value; + struct bpf_prog *prog; + atomic_t refcnt; + struct callback_head rcu; + struct work_struct kthread_stop_wq; +}; + +struct bpf_cpu_map { + struct bpf_map map; + struct bpf_cpu_map_entry **cpu_map; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_prog_offload_ops { + int (*insn_hook)(struct bpf_verifier_env *, int, int); + int (*finalize)(struct bpf_verifier_env *); + int (*replace_insn)(struct bpf_verifier_env *, u32, struct bpf_insn *); + int (*remove_insns)(struct bpf_verifier_env *, u32, u32); + int (*prepare)(struct bpf_prog *); + int (*translate)(struct bpf_prog *); + void (*destroy)(struct bpf_prog *); +}; + +struct bpf_offload_dev { + const struct bpf_prog_offload_ops *ops; + struct list_head netdevs; + void *priv; +}; + +enum { + XDP_METADATA_KFUNC_RX_TIMESTAMP = 0, + XDP_METADATA_KFUNC_RX_HASH = 1, + MAX_XDP_METADATA_KFUNC = 2, +}; + +typedef struct ns_common *ns_get_path_helper_t(void *); + +struct bpf_offload_netdev { + struct rhash_head l; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + struct list_head progs; + struct list_head maps; + struct list_head offdev_netdevs; +}; + +struct ns_get_path_bpf_prog_args { + struct bpf_prog *prog; + struct bpf_prog_info *info; +}; + +struct ns_get_path_bpf_map_args { + struct bpf_offloaded_map *offmap; + struct bpf_map_info *info; +}; + +struct bpf_netns_link { + struct bpf_link link; + enum bpf_attach_type type; + enum netns_bpf_attach_type netns_type; + struct net *net; + struct list_head node; + long: 32; +}; + +enum bpf_stack_build_id_status { + BPF_STACK_BUILD_ID_EMPTY = 0, + BPF_STACK_BUILD_ID_VALID = 1, + BPF_STACK_BUILD_ID_IP = 2, +}; + +struct bpf_stack_build_id { + __s32 status; + unsigned char build_id[20]; + union { + __u64 offset; + __u64 ip; + }; +}; + +enum { + BPF_F_SKIP_FIELD_MASK = 255, + BPF_F_USER_STACK = 256, + BPF_F_FAST_STACK_CMP = 512, + BPF_F_REUSE_STACKID = 1024, + BPF_F_USER_BUILD_ID = 2048, +}; + +enum perf_callchain_context { + PERF_CONTEXT_HV = 4294967264, + PERF_CONTEXT_KERNEL = 4294967168, + PERF_CONTEXT_USER = 4294966784, + PERF_CONTEXT_GUEST = 4294965248, + PERF_CONTEXT_GUEST_KERNEL = 4294965120, + PERF_CONTEXT_GUEST_USER = 4294964736, + PERF_CONTEXT_MAX = 4294963201, +}; + +struct stack_map_bucket { + struct pcpu_freelist_node fnode; + u32 hash; + u32 nr; + long: 32; + u64 data[0]; +}; + +struct bpf_stack_map { + struct bpf_map map; + void *elems; + struct pcpu_freelist freelist; + u32 n_buckets; + struct stack_map_bucket *buckets[0]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +typedef u64 (*btf_bpf_get_stackid)(struct pt_regs *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stackid_pe)(struct bpf_perf_event_data_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack)(struct pt_regs *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_task_stack)(struct task_struct *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_stack_pe)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +struct bpf_iter__cgroup { + union { + struct bpf_iter_meta *meta; + }; + union { + struct cgroup *cgroup; + }; +}; + +struct cgroup_iter_priv { + struct cgroup_subsys_state *start_css; + bool visited_all; + bool terminate; + int order; +}; + +typedef u64 (*btf_bpf_cgrp_storage_get)(struct bpf_map *, struct cgroup *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_cgrp_storage_delete)(struct bpf_map *, struct cgroup *); + +enum { + BPF_F_SYSCTL_BASE_NAME = 1, +}; + +struct bpf_cg_run_ctx { + struct bpf_run_ctx run_ctx; + const struct bpf_prog_array_item *prog_item; + int retval; +}; + +struct qdisc_skb_cb { + struct { + unsigned int pkt_len; + u16 slave_dev_queue_mapping; + u16 tc_classid; + }; + unsigned char data[20]; +}; + +struct bpf_skb_data_end { + struct qdisc_skb_cb qdisc_cb; + void *data_meta; + void *data_end; +}; + +struct bpf_sockopt_buf { + u8 data[32]; +}; + +enum { + TCPF_ESTABLISHED = 2, + TCPF_SYN_SENT = 4, + TCPF_SYN_RECV = 8, + TCPF_FIN_WAIT1 = 16, + TCPF_FIN_WAIT2 = 32, + TCPF_TIME_WAIT = 64, + TCPF_CLOSE = 128, + TCPF_CLOSE_WAIT = 256, + TCPF_LAST_ACK = 512, + TCPF_LISTEN = 1024, + TCPF_CLOSING = 2048, + TCPF_NEW_SYN_RECV = 4096, +}; + +struct bpf_cgroup_link { + struct bpf_link link; + struct cgroup *cgroup; + enum bpf_attach_type type; +}; + +struct bpf_prog_list { + struct hlist_node node; + struct bpf_prog *prog; + struct bpf_cgroup_link *link; + struct bpf_cgroup_storage *storage[2]; +}; + +struct cgroup_lsm_atype { + u32 attach_btf_id; + int refcnt; +}; + +typedef u64 (*btf_bpf_get_local_storage)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_retval)(); + +typedef u64 (*btf_bpf_set_retval)(int); + +typedef u64 (*btf_bpf_sysctl_get_name)(struct bpf_sysctl_kern *, char *, size_t, u64); + +typedef u64 (*btf_bpf_sysctl_get_current_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_get_new_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_set_new_value)(struct bpf_sysctl_kern *, const char *, size_t); + +typedef u64 (*btf_bpf_get_netns_cookie_sockopt)(struct bpf_sockopt_kern *); + +enum sock_type { + SOCK_STREAM = 1, + SOCK_DGRAM = 2, + SOCK_RAW = 3, + SOCK_RDM = 4, + SOCK_SEQPACKET = 5, + SOCK_DCCP = 6, + SOCK_PACKET = 10, +}; + +enum sock_flags { + SOCK_DEAD = 0, + SOCK_DONE = 1, + SOCK_URGINLINE = 2, + SOCK_KEEPOPEN = 3, + SOCK_LINGER = 4, + SOCK_DESTROY = 5, + SOCK_BROADCAST = 6, + SOCK_TIMESTAMP = 7, + SOCK_ZAPPED = 8, + SOCK_USE_WRITE_QUEUE = 9, + SOCK_DBG = 10, + SOCK_RCVTSTAMP = 11, + SOCK_RCVTSTAMPNS = 12, + SOCK_LOCALROUTE = 13, + SOCK_MEMALLOC = 14, + SOCK_TIMESTAMPING_RX_SOFTWARE = 15, + SOCK_FASYNC = 16, + SOCK_RXQ_OVFL = 17, + SOCK_ZEROCOPY = 18, + SOCK_WIFI_STATUS = 19, + SOCK_NOFCS = 20, + SOCK_FILTER_LOCKED = 21, + SOCK_SELECT_ERR_QUEUE = 22, + SOCK_RCU_FREE = 23, + SOCK_TXTIME = 24, + SOCK_XDP = 25, + SOCK_TSTAMP_NEW = 26, + SOCK_RCVMARK = 27, +}; + +struct reuseport_array { + struct bpf_map map; + struct sock *ptrs[0]; +}; + +struct bpf_dummy_ops_state { + int val; +}; + +struct bpf_dummy_ops { + int (*test_1)(struct bpf_dummy_ops_state *); + int (*test_2)(struct bpf_dummy_ops_state *, int, short unsigned int, char, long unsigned int); + int (*test_sleepable)(struct bpf_dummy_ops_state *); +}; + +enum bpf_struct_ops_state { + BPF_STRUCT_OPS_STATE_INIT = 0, + BPF_STRUCT_OPS_STATE_INUSE = 1, + BPF_STRUCT_OPS_STATE_TOBEFREE = 2, +}; + +struct bpf_struct_ops_value { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + char data[0]; +}; + +struct bpf_struct_ops_map { + struct bpf_map map; + struct callback_head rcu; + const struct bpf_struct_ops *st_ops; + struct mutex lock; + struct bpf_link **links; + void *image; + struct bpf_struct_ops_value *uvalue; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct bpf_struct_ops_value kvalue; +}; + +struct bpf_struct_ops_bpf_dummy_ops { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct bpf_dummy_ops data; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_struct_ops_tcp_congestion_ops { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct tcp_congestion_ops data; +}; + +enum { + BPF_STRUCT_OPS_TYPE_bpf_dummy_ops = 0, + BPF_STRUCT_OPS_TYPE_tcp_congestion_ops = 1, + __NR_BPF_STRUCT_OPS_TYPE = 2, +}; + +struct bpf_cpumask { + cpumask_t cpumask; + refcount_t usage; +}; + +enum { + BPF_F_BPRM_SECUREEXEC = 1, +}; + +struct sembuf { + short unsigned int sem_num; + short int sem_op; + short int sem_flg; +}; + +struct xfrm_sec_ctx { + __u8 ctx_doi; + __u8 ctx_alg; + __u16 ctx_len; + __u32 ctx_sid; + char ctx_str[0]; +}; + +struct xfrm_user_sec_ctx { + __u16 len; + __u16 exttype; + __u8 ctx_alg; + __u8 ctx_doi; + __u16 ctx_len; +}; + +enum hash_algo { + HASH_ALGO_MD4 = 0, + HASH_ALGO_MD5 = 1, + HASH_ALGO_SHA1 = 2, + HASH_ALGO_RIPE_MD_160 = 3, + HASH_ALGO_SHA256 = 4, + HASH_ALGO_SHA384 = 5, + HASH_ALGO_SHA512 = 6, + HASH_ALGO_SHA224 = 7, + HASH_ALGO_RIPE_MD_128 = 8, + HASH_ALGO_RIPE_MD_256 = 9, + HASH_ALGO_RIPE_MD_320 = 10, + HASH_ALGO_WP_256 = 11, + HASH_ALGO_WP_384 = 12, + HASH_ALGO_WP_512 = 13, + HASH_ALGO_TGR_128 = 14, + HASH_ALGO_TGR_160 = 15, + HASH_ALGO_TGR_192 = 16, + HASH_ALGO_SM3_256 = 17, + HASH_ALGO_STREEBOG_256 = 18, + HASH_ALGO_STREEBOG_512 = 19, + HASH_ALGO__LAST = 20, +}; + +typedef u64 (*btf_bpf_bprm_opts_set)(struct linux_binprm *, u64); + +typedef u64 (*btf_bpf_ima_inode_hash)(struct inode *, void *, u32); + +typedef u64 (*btf_bpf_ima_file_hash)(struct file *, void *, u32); + +typedef u64 (*btf_bpf_get_attach_cookie)(void *); + +enum perf_branch_sample_type { + PERF_SAMPLE_BRANCH_USER = 1, + PERF_SAMPLE_BRANCH_KERNEL = 2, + PERF_SAMPLE_BRANCH_HV = 4, + PERF_SAMPLE_BRANCH_ANY = 8, + PERF_SAMPLE_BRANCH_ANY_CALL = 16, + PERF_SAMPLE_BRANCH_ANY_RETURN = 32, + PERF_SAMPLE_BRANCH_IND_CALL = 64, + PERF_SAMPLE_BRANCH_ABORT_TX = 128, + PERF_SAMPLE_BRANCH_IN_TX = 256, + PERF_SAMPLE_BRANCH_NO_TX = 512, + PERF_SAMPLE_BRANCH_COND = 1024, + PERF_SAMPLE_BRANCH_CALL_STACK = 2048, + PERF_SAMPLE_BRANCH_IND_JUMP = 4096, + PERF_SAMPLE_BRANCH_CALL = 8192, + PERF_SAMPLE_BRANCH_NO_FLAGS = 16384, + PERF_SAMPLE_BRANCH_NO_CYCLES = 32768, + PERF_SAMPLE_BRANCH_TYPE_SAVE = 65536, + PERF_SAMPLE_BRANCH_HW_INDEX = 131072, + PERF_SAMPLE_BRANCH_PRIV_SAVE = 262144, + PERF_SAMPLE_BRANCH_MAX = 524288, +}; + +enum perf_event_read_format { + PERF_FORMAT_TOTAL_TIME_ENABLED = 1, + PERF_FORMAT_TOTAL_TIME_RUNNING = 2, + PERF_FORMAT_ID = 4, + PERF_FORMAT_GROUP = 8, + PERF_FORMAT_LOST = 16, + PERF_FORMAT_MAX = 32, +}; + +enum perf_event_ioc_flags { + PERF_IOC_FLAG_GROUP = 1, +}; + +struct perf_event_mmap_page { + __u32 version; + __u32 compat_version; + __u32 lock; + __u32 index; + __s64 offset; + __u64 time_enabled; + __u64 time_running; + union { + __u64 capabilities; + struct { + __u64 cap_bit0: 1; + __u64 cap_bit0_is_deprecated: 1; + __u64 cap_user_rdpmc: 1; + __u64 cap_user_time: 1; + __u64 cap_user_time_zero: 1; + __u64 cap_user_time_short: 1; + __u64 cap_____res: 58; + }; + }; + __u16 pmc_width; + __u16 time_shift; + __u32 time_mult; + __u64 time_offset; + __u64 time_zero; + __u32 size; + __u32 __reserved_1; + __u64 time_cycles; + __u64 time_mask; + __u8 __reserved[928]; + __u64 data_head; + __u64 data_tail; + __u64 data_offset; + __u64 data_size; + __u64 aux_head; + __u64 aux_tail; + __u64 aux_offset; + __u64 aux_size; +}; + +struct perf_event_header { + __u32 type; + __u16 misc; + __u16 size; +}; + +struct perf_ns_link_info { + __u64 dev; + __u64 ino; +}; + +enum { + NET_NS_INDEX = 0, + UTS_NS_INDEX = 1, + IPC_NS_INDEX = 2, + PID_NS_INDEX = 3, + USER_NS_INDEX = 4, + MNT_NS_INDEX = 5, + CGROUP_NS_INDEX = 6, + NR_NAMESPACES = 7, +}; + +enum perf_event_type { + PERF_RECORD_MMAP = 1, + PERF_RECORD_LOST = 2, + PERF_RECORD_COMM = 3, + PERF_RECORD_EXIT = 4, + PERF_RECORD_THROTTLE = 5, + PERF_RECORD_UNTHROTTLE = 6, + PERF_RECORD_FORK = 7, + PERF_RECORD_READ = 8, + PERF_RECORD_SAMPLE = 9, + PERF_RECORD_MMAP2 = 10, + PERF_RECORD_AUX = 11, + PERF_RECORD_ITRACE_START = 12, + PERF_RECORD_LOST_SAMPLES = 13, + PERF_RECORD_SWITCH = 14, + PERF_RECORD_SWITCH_CPU_WIDE = 15, + PERF_RECORD_NAMESPACES = 16, + PERF_RECORD_KSYMBOL = 17, + PERF_RECORD_BPF_EVENT = 18, + PERF_RECORD_CGROUP = 19, + PERF_RECORD_TEXT_POKE = 20, + PERF_RECORD_AUX_OUTPUT_HW_ID = 21, + PERF_RECORD_MAX = 22, +}; + +enum perf_addr_filter_action_t { + PERF_ADDR_FILTER_ACTION_STOP = 0, + PERF_ADDR_FILTER_ACTION_START = 1, + PERF_ADDR_FILTER_ACTION_FILTER = 2, +}; + +struct perf_addr_filter { + struct list_head entry; + struct path path; + long unsigned int offset; + long unsigned int size; + enum perf_addr_filter_action_t action; +}; + +struct swevent_hlist { + struct hlist_head heads[256]; + struct callback_head callback_head; +}; + +struct pmu_event_list { + raw_spinlock_t lock; + struct list_head list; +}; + +struct perf_buffer { + refcount_t refcount; + struct callback_head callback_head; + struct work_struct work; + int page_order; + int nr_pages; + int overwrite; + int paused; + atomic_t poll; + local_t head; + unsigned int nest; + local_t events; + local_t wakeup; + local_t lost; + long int watermark; + long int aux_watermark; + spinlock_t event_lock; + struct list_head event_list; + atomic_t mmap_count; + long unsigned int mmap_locked; + struct user_struct *mmap_user; + long int aux_head; + unsigned int aux_nest; + long int aux_wakeup; + long unsigned int aux_pgoff; + int aux_nr_pages; + int aux_overwrite; + atomic_t aux_mmap_count; + long unsigned int aux_mmap_locked; + void (*free_aux)(void *); + refcount_t aux_refcount; + int aux_in_sampling; + void **aux_pages; + void *aux_priv; + struct perf_event_mmap_page *user_page; + void *data_pages[0]; +}; + +struct perf_cpu_context { + struct perf_event_context ctx; + struct perf_event_context *task_ctx; + int online; + struct perf_cgroup *cgrp; + int heap_size; + struct perf_event **heap; + struct perf_event *heap_default[2]; + long: 32; +}; + +struct match_token { + int token; + const char *pattern; +}; + +enum { + MAX_OPT_ARGS = 3, +}; + +struct min_heap { + void *data; + int nr; + int size; +}; + +struct min_heap_callbacks { + int elem_size; + bool (*less)(const void *, const void *); + void (*swp)(void *, void *); +}; + +typedef int (*remote_function_f)(void *); + +struct remote_function_call { + struct task_struct *p; + remote_function_f func; + void *info; + int ret; +}; + +typedef void (*event_f)(struct perf_event *, struct perf_cpu_context *, struct perf_event_context *, void *); + +struct event_function_struct { + struct perf_event *event; + event_f func; + void *data; +}; + +enum event_type_t { + EVENT_FLEXIBLE = 1, + EVENT_PINNED = 2, + EVENT_TIME = 4, + EVENT_CPU = 8, + EVENT_ALL = 3, +}; + +struct __group_key { + int cpu; + struct pmu *pmu; + struct cgroup *cgroup; +}; + +struct stop_event_data { + struct perf_event *event; + unsigned int restart; +}; + +struct perf_read_data { + struct perf_event *event; + bool group; + int ret; +}; + +struct perf_read_event { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +typedef void perf_iterate_f(struct perf_event *, void *); + +struct remote_output { + struct perf_buffer *rb; + int err; +}; + +struct perf_task_event { + struct task_struct *task; + struct perf_event_context *task_ctx; + struct { + struct perf_event_header header; + u32 pid; + u32 ppid; + u32 tid; + u32 ptid; + u64 time; + } event_id; +}; + +struct perf_comm_event { + struct task_struct *task; + char *comm; + int comm_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + } event_id; +}; + +struct perf_namespaces_event { + struct task_struct *task; + long: 32; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 nr_namespaces; + struct perf_ns_link_info link_info[7]; + } event_id; +}; + +struct perf_cgroup_event { + char *path; + int path_size; + struct { + struct perf_event_header header; + u64 id; + char path[0]; + } event_id; +}; + +struct perf_mmap_event { + struct vm_area_struct *vma; + const char *file_name; + int file_size; + int maj; + int min; + long: 32; + u64 ino; + u64 ino_generation; + u32 prot; + u32 flags; + u8 build_id[20]; + u32 build_id_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 start; + u64 len; + u64 pgoff; + } event_id; +}; + +struct perf_switch_event { + struct task_struct *task; + struct task_struct *next_prev; + struct { + struct perf_event_header header; + u32 next_prev_pid; + u32 next_prev_tid; + } event_id; +}; + +struct perf_ksymbol_event { + const char *name; + int name_len; + struct { + struct perf_event_header header; + u64 addr; + u32 len; + u16 ksym_type; + u16 flags; + } event_id; +}; + +struct perf_bpf_event { + struct bpf_prog *prog; + struct { + struct perf_event_header header; + u16 type; + u16 flags; + u32 id; + u8 tag[8]; + } event_id; +}; + +struct perf_text_poke_event { + const void *old_bytes; + const void *new_bytes; + size_t pad; + u16 old_len; + u16 new_len; + struct { + struct perf_event_header header; + u64 addr; + } event_id; +}; + +struct swevent_htable { + struct swevent_hlist *swevent_hlist; + struct mutex hlist_mutex; + int hlist_refcount; + int recursion[4]; +}; + +enum perf_probe_config { + PERF_PROBE_CONFIG_IS_RETPROBE = 1, + PERF_UPROBE_REF_CTR_OFFSET_BITS = 32, + PERF_UPROBE_REF_CTR_OFFSET_SHIFT = 32, +}; + +enum { + IF_ACT_NONE = 4294967295, + IF_ACT_FILTER = 0, + IF_ACT_START = 1, + IF_ACT_STOP = 2, + IF_SRC_FILE = 3, + IF_SRC_KERNEL = 4, + IF_SRC_FILEADDR = 5, + IF_SRC_KERNELADDR = 6, +}; + +enum { + IF_STATE_ACTION = 0, + IF_STATE_SOURCE = 1, + IF_STATE_END = 2, +}; + +struct perf_aux_event { + struct perf_event_header header; + u64 hw_id; +}; + +struct perf_aux_event___2 { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +struct perf_aux_event___3 { + struct perf_event_header header; + u64 offset; + u64 size; + u64 flags; +}; + +struct callchain_cpus_entries { + struct callback_head callback_head; + struct perf_callchain_entry *cpu_entries[0]; +}; + +struct rhltable { + struct rhashtable ht; +}; + +struct bp_slots_histogram { + atomic_t *count; +}; + +struct bp_cpuinfo { + unsigned int cpu_pinned; + struct bp_slots_histogram tsk_pinned; +}; + +struct uprobe { + struct rb_node rb_node; + refcount_t ref; + struct rw_semaphore register_rwsem; + struct rw_semaphore consumer_rwsem; + struct list_head pending_list; + struct uprobe_consumer *consumers; + struct inode *inode; + loff_t offset; + loff_t ref_ctr_offset; + long unsigned int flags; + struct arch_uprobe arch; + long: 32; +}; + +enum rp_check { + RP_CHECK_CALL = 0, + RP_CHECK_CHAIN_CALL = 1, + RP_CHECK_RET = 2, +}; + +struct xol_area { + wait_queue_head_t wq; + atomic_t slot_count; + long unsigned int *bitmap; + struct vm_special_mapping xol_mapping; + struct page *pages[2]; + long unsigned int vaddr; +}; + +struct compact_control; + +struct capture_control { + struct compact_control *cc; + struct page *page; +}; + +typedef int filler_t(struct file *, struct folio *); + +struct page_vma_mapped_walk { + long unsigned int pfn; + long unsigned int nr_pages; + long unsigned int pgoff; + struct vm_area_struct *vma; + long unsigned int address; + pmd_t *pmd; + pte_t *pte; + spinlock_t *ptl; + unsigned int flags; +}; + +enum mmu_notifier_event { + MMU_NOTIFY_UNMAP = 0, + MMU_NOTIFY_CLEAR = 1, + MMU_NOTIFY_PROTECTION_VMA = 2, + MMU_NOTIFY_PROTECTION_PAGE = 3, + MMU_NOTIFY_SOFT_DIRTY = 4, + MMU_NOTIFY_RELEASE = 5, + MMU_NOTIFY_MIGRATE = 6, + MMU_NOTIFY_EXCLUSIVE = 7, +}; + +struct mmu_notifier_range { + struct vm_area_struct *vma; + struct mm_struct *mm; + long unsigned int start; + long unsigned int end; + unsigned int flags; + enum mmu_notifier_event event; + void *owner; +}; + +struct compact_control { + struct list_head freepages; + struct list_head migratepages; + unsigned int nr_freepages; + unsigned int nr_migratepages; + long unsigned int free_pfn; + long unsigned int migrate_pfn; + long unsigned int fast_start_pfn; + struct zone *zone; + long unsigned int total_migrate_scanned; + long unsigned int total_free_scanned; + short unsigned int fast_search_fail; + short int search_order; + const gfp_t gfp_mask; + int order; + int migratetype; + const unsigned int alloc_flags; + const int highest_zoneidx; + enum migrate_mode mode; + bool ignore_skip_hint; + bool no_set_skip_hint; + bool ignore_block_suitable; + bool direct_compaction; + bool proactive_compaction; + bool whole_zone; + bool contended; + bool rescan; + bool alloc_contig; +}; + +struct delayed_uprobe { + struct list_head list; + struct uprobe *uprobe; + struct mm_struct *mm; +}; + +struct __uprobe_key { + struct inode *inode; + long: 32; + loff_t offset; +}; + +struct map_info { + struct map_info *next; + struct mm_struct *mm; + long unsigned int vaddr; +}; + +struct parallel_data; + +struct padata_priv { + struct list_head list; + struct parallel_data *pd; + int cb_cpu; + unsigned int seq_nr; + int info; + void (*parallel)(struct padata_priv *); + void (*serial)(struct padata_priv *); +}; + +struct padata_cpumask { + cpumask_var_t pcpu; + cpumask_var_t cbcpu; +}; + +struct padata_shell; + +struct padata_list; + +struct padata_serial_queue; + +struct parallel_data { + struct padata_shell *ps; + struct padata_list *reorder_list; + struct padata_serial_queue *squeue; + refcount_t refcnt; + unsigned int seq_nr; + unsigned int processed; + int cpu; + struct padata_cpumask cpumask; + struct work_struct reorder_work; + long: 32; + long: 32; + long: 32; + spinlock_t lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct padata_list { + struct list_head list; + spinlock_t lock; +}; + +struct padata_serial_queue { + struct padata_list serial; + struct work_struct work; + struct parallel_data *pd; +}; + +struct padata_instance; + +struct padata_shell { + struct padata_instance *pinst; + struct parallel_data *pd; + struct parallel_data *opd; + struct list_head list; +}; + +struct padata_instance { + struct hlist_node cpu_online_node; + struct hlist_node cpu_dead_node; + struct workqueue_struct *parallel_wq; + struct workqueue_struct *serial_wq; + struct list_head pslist; + struct padata_cpumask cpumask; + struct kobject kobj; + struct mutex lock; + u8 flags; +}; + +struct padata_mt_job { + void (*thread_fn)(long unsigned int, long unsigned int, void *); + void *fn_arg; + long unsigned int start; + long unsigned int size; + long unsigned int align; + long unsigned int min_chunk; + int max_threads; +}; + +struct padata_work { + struct work_struct pw_work; + struct list_head pw_list; + void *pw_data; +}; + +struct padata_mt_job_state { + spinlock_t lock; + struct completion completion; + struct padata_mt_job *job; + int nworks; + int nworks_fini; + long unsigned int chunk_size; +}; + +struct padata_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct padata_instance *, struct attribute *, char *); + ssize_t (*store)(struct padata_instance *, struct attribute *, const char *, size_t); +}; + +struct static_key_mod { + struct static_key_mod *next; + struct jump_entry *entries; + struct module *mod; +}; + +struct static_key_deferred { + struct static_key key; + long unsigned int timeout; + struct delayed_work work; +}; + +enum rseq_cpu_id_state { + RSEQ_CPU_ID_UNINITIALIZED = 4294967295, + RSEQ_CPU_ID_REGISTRATION_FAILED = 4294967294, +}; + +enum rseq_flags { + RSEQ_FLAG_UNREGISTER = 1, +}; + +enum rseq_cs_flags { + RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT = 1, + RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = 2, + RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = 4, +}; + +struct rseq_cs { + __u32 version; + __u32 flags; + __u64 start_ip; + __u64 post_commit_offset; + __u64 abort_ip; +}; + +struct trace_event_raw_rseq_update { + struct trace_entry ent; + s32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_rseq_ip_fixup { + struct trace_entry ent; + long unsigned int regs_ip; + long unsigned int start_ip; + long unsigned int post_commit_offset; + long unsigned int abort_ip; + char __data[0]; +}; + +struct trace_event_data_offsets_rseq_update {}; + +struct trace_event_data_offsets_rseq_ip_fixup {}; + +typedef void (*btf_trace_rseq_update)(void *, struct task_struct *); + +typedef void (*btf_trace_rseq_ip_fixup)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +struct pkcs7_message; + +enum blacklist_hash_type { + BLACKLIST_HASH_X509_TBS = 1, + BLACKLIST_HASH_BINARY = 2, +}; + +typedef void (*xa_update_node_t)(struct xa_node *); + +struct xa_state { + struct xarray *xa; + long unsigned int xa_index; + unsigned char xa_shift; + unsigned char xa_sibs; + unsigned char xa_offset; + unsigned char xa_pad; + struct xa_node *xa_node; + struct xa_node *xa_alloc; + xa_update_node_t xa_update; + struct list_lru *xa_lru; +}; + +enum migrate_reason { + MR_COMPACTION = 0, + MR_MEMORY_FAILURE = 1, + MR_MEMORY_HOTPLUG = 2, + MR_SYSCALL = 3, + MR_MEMPOLICY_MBIND = 4, + MR_NUMA_MISPLACED = 5, + MR_CONTIG_RANGE = 6, + MR_LONGTERM_PIN = 7, + MR_DEMOTION = 8, + MR_TYPES = 9, +}; + +enum positive_aop_returns { + AOP_WRITEPAGE_ACTIVATE = 524288, + AOP_TRUNCATED_PAGE = 524289, +}; + +struct vm_event_state { + long unsigned int event[103]; +}; + +enum iter_type { + ITER_IOVEC = 0, + ITER_KVEC = 1, + ITER_BVEC = 2, + ITER_PIPE = 3, + ITER_XARRAY = 4, + ITER_DISCARD = 5, + ITER_UBUF = 6, +}; + +enum mapping_flags { + AS_EIO = 0, + AS_ENOSPC = 1, + AS_MM_ALL_LOCKS = 2, + AS_UNEVICTABLE = 3, + AS_EXITING = 4, + AS_NO_WRITEBACK_TAGS = 5, + AS_LARGE_FOLIO_SUPPORT = 6, +}; + +struct wait_page_key { + struct folio *folio; + int bit_nr; + int page_match; +}; + +struct pagevec { + unsigned char nr; + bool percpu_pvec_drained; + struct page *pages[15]; +}; + +struct folio_batch { + unsigned char nr; + bool percpu_pvec_drained; + struct folio *folios[15]; +}; + +struct trace_event_raw_mm_filemap_op_page_cache { + struct trace_entry ent; + long unsigned int pfn; + long unsigned int i_ino; + long unsigned int index; + dev_t s_dev; + unsigned char order; + char __data[0]; +}; + +struct trace_event_raw_filemap_set_wb_err { + struct trace_entry ent; + long unsigned int i_ino; + dev_t s_dev; + errseq_t errseq; + char __data[0]; +}; + +struct trace_event_raw_file_check_and_advance_wb_err { + struct trace_entry ent; + struct file *file; + long unsigned int i_ino; + dev_t s_dev; + errseq_t old; + errseq_t new; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_filemap_op_page_cache {}; + +struct trace_event_data_offsets_filemap_set_wb_err {}; + +struct trace_event_data_offsets_file_check_and_advance_wb_err {}; + +typedef void (*btf_trace_mm_filemap_delete_from_page_cache)(void *, struct folio *); + +typedef void (*btf_trace_mm_filemap_add_to_page_cache)(void *, struct folio *); + +typedef void (*btf_trace_filemap_set_wb_err)(void *, struct address_space *, errseq_t); + +typedef void (*btf_trace_file_check_and_advance_wb_err)(void *, struct file *, errseq_t); + +enum behavior { + EXCLUSIVE = 0, + SHARED = 1, + DROP = 2, +}; + +struct reciprocal_value { + u32 m; + u8 sh1; + u8 sh2; +}; + +struct kmem_cache_order_objects { + unsigned int x; +}; + +struct kmem_cache_cpu; + +struct kmem_cache_node; + +struct kmem_cache { + struct kmem_cache_cpu *cpu_slab; + slab_flags_t flags; + long unsigned int min_partial; + unsigned int size; + unsigned int object_size; + struct reciprocal_value reciprocal_size; + unsigned int offset; + unsigned int cpu_partial; + unsigned int cpu_partial_slabs; + struct kmem_cache_order_objects oo; + struct kmem_cache_order_objects min; + gfp_t allocflags; + int refcount; + void (*ctor)(void *); + unsigned int inuse; + unsigned int align; + unsigned int red_left_pad; + const char *name; + struct list_head list; + struct kobject kobj; + long unsigned int random; + unsigned int *random_seq; + unsigned int useroffset; + unsigned int usersize; + struct kmem_cache_node *node[1]; +}; + +struct slab { + long unsigned int __page_flags; + struct kmem_cache *slab_cache; + union { + struct { + union { + struct list_head slab_list; + struct { + struct slab *next; + int slabs; + }; + }; + void *freelist; + union { + long unsigned int counters; + struct { + unsigned int inuse: 16; + unsigned int objects: 15; + unsigned int frozen: 1; + }; + }; + }; + struct callback_head callback_head; + }; + unsigned int __unused; + atomic_t __page_refcount; + long unsigned int memcg_data; +}; + +struct kmem_cache_cpu { + void **freelist; + long unsigned int tid; + struct slab *slab; + struct slab *partial; + local_lock_t lock; +}; + +struct kmem_cache_node { + spinlock_t list_lock; + long unsigned int nr_partial; + struct list_head partial; + atomic_long_t nr_slabs; + atomic_long_t total_objects; + struct list_head full; +}; + +typedef unsigned int zap_flags_t; + +struct encoded_page; + +struct zap_details { + struct folio *single_folio; + bool even_cows; + zap_flags_t zap_flags; +}; + +enum oom_constraint { + CONSTRAINT_NONE = 0, + CONSTRAINT_CPUSET = 1, + CONSTRAINT_MEMORY_POLICY = 2, + CONSTRAINT_MEMCG = 3, +}; + +struct oom_control { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct mem_cgroup *memcg; + const gfp_t gfp_mask; + const int order; + long unsigned int totalpages; + struct task_struct *chosen; + long int chosen_points; + enum oom_constraint constraint; +}; + +struct mmu_table_batch { + struct callback_head rcu; + unsigned int nr; + void *tables[0]; +}; + +struct mmu_gather_batch { + struct mmu_gather_batch *next; + unsigned int nr; + unsigned int max; + struct encoded_page *encoded_pages[0]; +}; + +struct mmu_gather { + struct mm_struct *mm; + struct mmu_table_batch *batch; + long unsigned int start; + long unsigned int end; + unsigned int fullmm: 1; + unsigned int need_flush_all: 1; + unsigned int freed_tables: 1; + unsigned int delayed_rmap: 1; + unsigned int cleared_ptes: 1; + unsigned int cleared_pmds: 1; + unsigned int cleared_puds: 1; + unsigned int cleared_p4ds: 1; + unsigned int vma_exec: 1; + unsigned int vma_huge: 1; + unsigned int vma_pfn: 1; + unsigned int batch_count; + struct mmu_gather_batch *active; + struct mmu_gather_batch local; + struct page *__pages[8]; +}; + +enum compact_priority { + COMPACT_PRIO_SYNC_FULL = 0, + MIN_COMPACT_PRIORITY = 0, + COMPACT_PRIO_SYNC_LIGHT = 1, + MIN_COMPACT_COSTLY_PRIORITY = 1, + DEF_COMPACT_PRIORITY = 1, + COMPACT_PRIO_ASYNC = 2, + INIT_COMPACT_PRIORITY = 2, +}; + +enum compact_result { + COMPACT_NOT_SUITABLE_ZONE = 0, + COMPACT_SKIPPED = 1, + COMPACT_DEFERRED = 2, + COMPACT_NO_SUITABLE_PAGE = 3, + COMPACT_CONTINUE = 4, + COMPACT_COMPLETE = 5, + COMPACT_PARTIAL_SKIPPED = 6, + COMPACT_CONTENDED = 7, + COMPACT_SUCCESS = 8, +}; + +struct trace_event_raw_oom_score_adj_update { + struct trace_entry ent; + pid_t pid; + char comm[16]; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_reclaim_retry_zone { + struct trace_entry ent; + int node; + int zone_idx; + int order; + long unsigned int reclaimable; + long unsigned int available; + long unsigned int min_wmark; + int no_progress_loops; + bool wmark_check; + char __data[0]; +}; + +struct trace_event_raw_mark_victim { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_wake_reaper { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_start_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_finish_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_skip_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_compact_retry { + struct trace_entry ent; + int order; + int priority; + int result; + int retries; + int max_retries; + bool ret; + char __data[0]; +}; + +struct trace_event_data_offsets_oom_score_adj_update {}; + +struct trace_event_data_offsets_reclaim_retry_zone {}; + +struct trace_event_data_offsets_mark_victim {}; + +struct trace_event_data_offsets_wake_reaper {}; + +struct trace_event_data_offsets_start_task_reaping {}; + +struct trace_event_data_offsets_finish_task_reaping {}; + +struct trace_event_data_offsets_skip_task_reaping {}; + +struct trace_event_data_offsets_compact_retry {}; + +typedef void (*btf_trace_oom_score_adj_update)(void *, struct task_struct *); + +typedef void (*btf_trace_reclaim_retry_zone)(void *, struct zoneref *, int, long unsigned int, long unsigned int, long unsigned int, int, bool); + +typedef void (*btf_trace_mark_victim)(void *, int); + +typedef void (*btf_trace_wake_reaper)(void *, int); + +typedef void (*btf_trace_start_task_reaping)(void *, int); + +typedef void (*btf_trace_finish_task_reaping)(void *, int); + +typedef void (*btf_trace_skip_task_reaping)(void *, int); + +typedef void (*btf_trace_compact_retry)(void *, int, enum compact_priority, enum compact_result, int, int, bool); + +enum { + XA_CHECK_SCHED = 4096, +}; + +enum wb_state { + WB_registered = 0, + WB_writeback_running = 1, + WB_has_dirty_io = 2, + WB_start_all = 3, +}; + +struct wb_lock_cookie { + bool locked; + long unsigned int flags; +}; + +typedef int (*writepage_t)(struct page *, struct writeback_control *, void *); + +enum page_memcg_data_flags { + MEMCG_DATA_OBJCGS = 1, + MEMCG_DATA_KMEM = 2, + __NR_MEMCG_DATA_FLAGS = 4, +}; + +struct dirty_throttle_control { + struct wb_domain *dom; + struct dirty_throttle_control *gdtc; + struct bdi_writeback *wb; + struct fprop_local_percpu *wb_completions; + long unsigned int avail; + long unsigned int dirty; + long unsigned int thresh; + long unsigned int bg_thresh; + long unsigned int wb_dirty; + long unsigned int wb_thresh; + long unsigned int wb_bg_thresh; + long unsigned int pos_ratio; +}; + +typedef union { +} release_pages_arg; + +struct trace_event_raw_mm_lru_insertion { + struct trace_entry ent; + struct folio *folio; + long unsigned int pfn; + enum lru_list lru; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_mm_lru_activate { + struct trace_entry ent; + struct folio *folio; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_lru_insertion {}; + +struct trace_event_data_offsets_mm_lru_activate {}; + +typedef void (*btf_trace_mm_lru_insertion)(void *, struct folio *); + +typedef void (*btf_trace_mm_lru_activate)(void *, struct folio *); + +struct lru_rotate { + local_lock_t lock; + struct folio_batch fbatch; +}; + +struct cpu_fbatches { + local_lock_t lock; + struct folio_batch lru_add; + struct folio_batch lru_deactivate_file; + struct folio_batch lru_deactivate; + struct folio_batch lru_lazyfree; + struct folio_batch activate; +}; + +typedef void (*move_fn_t)(struct lruvec *, struct folio *); + +enum lruvec_flags { + LRUVEC_CONGESTED = 0, +}; + +typedef unsigned int isolate_mode_t; + +enum pgdat_flags { + PGDAT_DIRTY = 0, + PGDAT_WRITEBACK = 1, + PGDAT_RECLAIM_LOCKED = 2, +}; + +enum zone_flags { + ZONE_BOOSTED_WATERMARK = 0, + ZONE_RECLAIM_ACTIVE = 1, +}; + +struct reclaim_stat { + unsigned int nr_dirty; + unsigned int nr_unqueued_dirty; + unsigned int nr_congested; + unsigned int nr_writeback; + unsigned int nr_immediate; + unsigned int nr_pageout; + unsigned int nr_activate[2]; + unsigned int nr_ref_keep; + unsigned int nr_unmap_fail; + unsigned int nr_lazyfree_fail; +}; + +struct mem_cgroup_reclaim_cookie { + pg_data_t *pgdat; + unsigned int generation; +}; + +enum { + SWP_USED = 1, + SWP_WRITEOK = 2, + SWP_DISCARDABLE = 4, + SWP_DISCARDING = 8, + SWP_SOLIDSTATE = 16, + SWP_CONTINUED = 32, + SWP_BLKDEV = 64, + SWP_ACTIVATED = 128, + SWP_FS_OPS = 256, + SWP_AREA_DISCARD = 512, + SWP_PAGE_DISCARD = 1024, + SWP_STABLE_WRITES = 2048, + SWP_SYNCHRONOUS_IO = 4096, + SWP_SCANNING = 16384, +}; + +enum ttu_flags { + TTU_SPLIT_HUGE_PMD = 4, + TTU_IGNORE_MLOCK = 8, + TTU_SYNC = 16, + TTU_IGNORE_HWPOISON = 32, + TTU_BATCH_FLUSH = 64, + TTU_RMAP_LOCKED = 128, +}; + +typedef struct page *new_page_t(struct page *, long unsigned int); + +typedef void free_page_t(struct page *, long unsigned int); + +struct migration_target_control { + int nid; + nodemask_t *nmask; + gfp_t gfp_mask; +}; + +struct trace_event_raw_mm_vmscan_kswapd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_kswapd_wake { + struct trace_entry ent; + int nid; + int zid; + int order; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_wakeup_kswapd { + struct trace_entry ent; + int nid; + int zid; + int order; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_begin_template { + struct trace_entry ent; + int order; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_end_template { + struct trace_entry ent; + long unsigned int nr_reclaimed; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_start { + struct trace_entry ent; + struct shrinker *shr; + void *shrink; + int nid; + long int nr_objects_to_shrink; + long unsigned int gfp_flags; + long unsigned int cache_items; + long long unsigned int delta; + long unsigned int total_scan; + int priority; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_end { + struct trace_entry ent; + struct shrinker *shr; + int nid; + void *shrink; + long int unused_scan; + long int new_scan; + int retval; + long int total_scan; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_isolate { + struct trace_entry ent; + int highest_zoneidx; + int order; + long unsigned int nr_requested; + long unsigned int nr_scanned; + long unsigned int nr_skipped; + long unsigned int nr_taken; + unsigned int isolate_mode; + int lru; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_write_folio { + struct trace_entry ent; + long unsigned int pfn; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_inactive { + struct trace_entry ent; + int nid; + long unsigned int nr_scanned; + long unsigned int nr_reclaimed; + long unsigned int nr_dirty; + long unsigned int nr_writeback; + long unsigned int nr_congested; + long unsigned int nr_immediate; + unsigned int nr_activate0; + unsigned int nr_activate1; + long unsigned int nr_ref_keep; + long unsigned int nr_unmap_fail; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_active { + struct trace_entry ent; + int nid; + long unsigned int nr_taken; + long unsigned int nr_active; + long unsigned int nr_deactivated; + long unsigned int nr_referenced; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_node_reclaim_begin { + struct trace_entry ent; + int nid; + int order; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_throttled { + struct trace_entry ent; + int nid; + int usec_timeout; + int usec_delayed; + int reason; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_sleep {}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_wake {}; + +struct trace_event_data_offsets_mm_vmscan_wakeup_kswapd {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_begin_template {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_end_template {}; + +struct trace_event_data_offsets_mm_shrink_slab_start {}; + +struct trace_event_data_offsets_mm_shrink_slab_end {}; + +struct trace_event_data_offsets_mm_vmscan_lru_isolate {}; + +struct trace_event_data_offsets_mm_vmscan_write_folio {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_inactive {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_active {}; + +struct trace_event_data_offsets_mm_vmscan_node_reclaim_begin {}; + +struct trace_event_data_offsets_mm_vmscan_throttled {}; + +typedef void (*btf_trace_mm_vmscan_kswapd_sleep)(void *, int); + +typedef void (*btf_trace_mm_vmscan_kswapd_wake)(void *, int, int, int); + +typedef void (*btf_trace_mm_vmscan_wakeup_kswapd)(void *, int, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_shrink_slab_start)(void *, struct shrinker *, struct shrink_control *, long int, long unsigned int, long long unsigned int, long unsigned int, int); + +typedef void (*btf_trace_mm_shrink_slab_end)(void *, struct shrinker *, int, int, long int, long int, long int); + +typedef void (*btf_trace_mm_vmscan_lru_isolate)(void *, int, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, isolate_mode_t, int); + +typedef void (*btf_trace_mm_vmscan_write_folio)(void *, struct folio *); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_inactive)(void *, int, long unsigned int, long unsigned int, struct reclaim_stat *, int, int); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_active)(void *, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int, int); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_begin)(void *, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_throttled)(void *, int, int, int, int); + +struct scan_control { + long unsigned int nr_to_reclaim; + nodemask_t *nodemask; + struct mem_cgroup *target_mem_cgroup; + long unsigned int anon_cost; + long unsigned int file_cost; + unsigned int may_deactivate: 2; + unsigned int force_deactivate: 1; + unsigned int skipped_deactivate: 1; + unsigned int may_writepage: 1; + unsigned int may_unmap: 1; + unsigned int may_swap: 1; + unsigned int proactive: 1; + unsigned int memcg_low_reclaim: 1; + unsigned int memcg_low_skipped: 1; + unsigned int hibernation_mode: 1; + unsigned int compaction_ready: 1; + unsigned int cache_trim_mode: 1; + unsigned int file_is_tiny: 1; + unsigned int no_demotion: 1; + s8 order; + s8 priority; + s8 reclaim_idx; + gfp_t gfp_mask; + long unsigned int nr_scanned; + long unsigned int nr_reclaimed; + struct { + unsigned int dirty; + unsigned int unqueued_dirty; + unsigned int congested; + unsigned int writeback; + unsigned int immediate; + unsigned int file_taken; + unsigned int taken; + } nr; + struct reclaim_state reclaim_state; +}; + +typedef enum { + PAGE_KEEP = 0, + PAGE_ACTIVATE = 1, + PAGE_SUCCESS = 2, + PAGE_CLEAN = 3, +} pageout_t; + +enum folio_references { + FOLIOREF_RECLAIM = 0, + FOLIOREF_RECLAIM_CLEAN = 1, + FOLIOREF_KEEP = 2, + FOLIOREF_ACTIVATE = 3, +}; + +enum scan_balance { + SCAN_EQUAL = 0, + SCAN_FRACT = 1, + SCAN_ANON = 2, + SCAN_FILE = 3, +}; + +struct fileattr { + u32 flags; + u32 fsx_xflags; + u32 fsx_extsize; + u32 fsx_nextents; + u32 fsx_projid; + u32 fsx_cowextsize; + bool flags_valid: 1; + bool fsx_valid: 1; +}; + +struct xattr; + +typedef int (*initxattrs)(struct inode *, const struct xattr *, void *); + +struct xattr { + const char *name; + void *value; + size_t value_len; +}; + +struct constant_table { + const char *name; + int value; +}; + +typedef long unsigned int pte_marker; + +struct shared_policy {}; + +struct simple_xattrs { + struct rb_root rb_root; + rwlock_t lock; +}; + +struct simple_xattr { + struct rb_node rb_node; + char *name; + size_t size; + char value[0]; +}; + +enum fid_type { + FILEID_ROOT = 0, + FILEID_INO32_GEN = 1, + FILEID_INO32_GEN_PARENT = 2, + FILEID_BTRFS_WITHOUT_PARENT = 77, + FILEID_BTRFS_WITH_PARENT = 78, + FILEID_BTRFS_WITH_PARENT_ROOT = 79, + FILEID_UDF_WITHOUT_PARENT = 81, + FILEID_UDF_WITH_PARENT = 82, + FILEID_NILFS_WITHOUT_PARENT = 97, + FILEID_NILFS_WITH_PARENT = 98, + FILEID_FAT_WITHOUT_PARENT = 113, + FILEID_FAT_WITH_PARENT = 114, + FILEID_LUSTRE = 151, + FILEID_KERNFS = 254, + FILEID_INVALID = 255, +}; + +struct fid { + union { + struct { + u32 ino; + u32 gen; + u32 parent_ino; + u32 parent_gen; + } i32; + struct { + u32 block; + u16 partref; + u16 parent_partref; + u32 generation; + u32 parent_block; + u32 parent_generation; + } udf; + __u32 raw[0]; + }; +}; + +struct shmem_inode_info { + spinlock_t lock; + unsigned int seals; + long unsigned int flags; + long unsigned int alloced; + long unsigned int swapped; + long unsigned int fallocend; + struct list_head shrinklist; + struct list_head swaplist; + struct shared_policy policy; + struct simple_xattrs xattrs; + atomic_t stop_eviction; + long: 32; + struct timespec64 i_crtime; + unsigned int fsflags; + long: 32; + struct inode vfs_inode; +}; + +struct shmem_sb_info { + long unsigned int max_blocks; + long: 32; + struct percpu_counter used_blocks; + long unsigned int max_inodes; + long unsigned int free_inodes; + raw_spinlock_t stat_lock; + umode_t mode; + unsigned char huge; + kuid_t uid; + kgid_t gid; + bool full_inums; + ino_t next_ino; + ino_t *ino_batch; + struct mempolicy *mpol; + spinlock_t shrinklist_lock; + struct list_head shrinklist; + long unsigned int shrinklist_len; +}; + +enum sgp_type { + SGP_READ = 0, + SGP_NOALLOC = 1, + SGP_CACHE = 2, + SGP_WRITE = 3, + SGP_FALLOC = 4, +}; + +struct shmem_falloc { + wait_queue_head_t *waitq; + long unsigned int start; + long unsigned int next; + long unsigned int nr_falloced; + long unsigned int nr_unswapped; +}; + +struct shmem_options { + long long unsigned int blocks; + long long unsigned int inodes; + struct mempolicy *mpol; + kuid_t uid; + kgid_t gid; + umode_t mode; + bool full_inums; + int huge; + int seen; +}; + +enum shmem_param { + Opt_gid = 0, + Opt_huge = 1, + Opt_mode = 2, + Opt_mpol = 3, + Opt_nr_blocks = 4, + Opt_nr_inodes = 5, + Opt_size = 6, + Opt_uid = 7, + Opt_inode32 = 8, + Opt_inode64 = 9, +}; + +enum writeback_stat_item { + NR_DIRTY_THRESHOLD = 0, + NR_DIRTY_BG_THRESHOLD = 1, + NR_VM_WRITEBACK_STAT_ITEMS = 2, +}; + +struct contig_page_info { + long unsigned int free_pages; + long unsigned int free_blocks_total; + long unsigned int free_blocks_suitable; +}; + +struct radix_tree_iter { + long unsigned int index; + long unsigned int next_index; + long unsigned int tags; + struct xa_node *node; +}; + +enum { + RADIX_TREE_ITER_TAG_MASK = 15, + RADIX_TREE_ITER_TAGGED = 16, + RADIX_TREE_ITER_CONTIG = 32, +}; + +enum mminit_level { + MMINIT_WARNING = 0, + MMINIT_VERIFY = 1, + MMINIT_TRACE = 2, +}; + +struct pcpu_group_info { + int nr_units; + long unsigned int base_offset; + unsigned int *cpu_map; +}; + +struct pcpu_alloc_info { + size_t static_size; + size_t reserved_size; + size_t dyn_size; + size_t unit_size; + size_t atom_size; + size_t alloc_size; + size_t __ai_size; + int nr_groups; + struct pcpu_group_info groups[0]; +}; + +typedef int pcpu_fc_cpu_to_node_fn_t(int); + +typedef int pcpu_fc_cpu_distance_fn_t(unsigned int, unsigned int); + +enum memcg_stat_item { + MEMCG_SWAP = 41, + MEMCG_SOCK = 42, + MEMCG_PERCPU_B = 43, + MEMCG_VMALLOC = 44, + MEMCG_KMEM = 45, + MEMCG_ZSWAP_B = 46, + MEMCG_ZSWAPPED = 47, + MEMCG_NR_STAT = 48, +}; + +struct trace_event_raw_percpu_alloc_percpu { + struct trace_entry ent; + long unsigned int call_site; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + void *base_addr; + int off; + void *ptr; + size_t bytes_alloc; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_percpu_free_percpu { + struct trace_entry ent; + void *base_addr; + int off; + void *ptr; + char __data[0]; +}; + +struct trace_event_raw_percpu_alloc_percpu_fail { + struct trace_entry ent; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + char __data[0]; +}; + +struct trace_event_raw_percpu_create_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_raw_percpu_destroy_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_data_offsets_percpu_alloc_percpu {}; + +struct trace_event_data_offsets_percpu_free_percpu {}; + +struct trace_event_data_offsets_percpu_alloc_percpu_fail {}; + +struct trace_event_data_offsets_percpu_create_chunk {}; + +struct trace_event_data_offsets_percpu_destroy_chunk {}; + +typedef void (*btf_trace_percpu_alloc_percpu)(void *, long unsigned int, bool, bool, size_t, size_t, void *, int, void *, size_t, gfp_t); + +typedef void (*btf_trace_percpu_free_percpu)(void *, void *, int, void *); + +typedef void (*btf_trace_percpu_alloc_percpu_fail)(void *, bool, bool, size_t, size_t); + +typedef void (*btf_trace_percpu_create_chunk)(void *, void *); + +typedef void (*btf_trace_percpu_destroy_chunk)(void *, void *); + +struct pcpu_block_md { + int scan_hint; + int scan_hint_start; + int contig_hint; + int contig_hint_start; + int left_free; + int right_free; + int first_free; + int nr_bits; +}; + +struct pcpu_chunk { + struct list_head list; + int free_bytes; + struct pcpu_block_md chunk_md; + void *base_addr; + long unsigned int *alloc_map; + long unsigned int *bound_map; + struct pcpu_block_md *md_blocks; + void *data; + bool immutable; + bool isolated; + int start_offset; + int end_offset; + struct obj_cgroup **obj_cgroups; + int nr_pages; + int nr_populated; + int nr_empty_pop_pages; + long unsigned int populated[0]; +}; + +enum slab_state { + DOWN = 0, + PARTIAL = 1, + PARTIAL_NODE = 2, + UP = 3, + FULL = 4, +}; + +struct kmalloc_info_struct { + const char *name[4]; + unsigned int size; +}; + +struct slabinfo { + long unsigned int active_objs; + long unsigned int num_objs; + long unsigned int active_slabs; + long unsigned int num_slabs; + long unsigned int shared_avail; + unsigned int limit; + unsigned int batchcount; + unsigned int shared; + unsigned int objects_per_slab; + unsigned int cache_order; +}; + +struct kmem_obj_info { + void *kp_ptr; + struct slab *kp_slab; + void *kp_objp; + long unsigned int kp_data_offset; + struct kmem_cache *kp_slab_cache; + void *kp_ret; + void *kp_stack[16]; + void *kp_free_stack[16]; +}; + +struct trace_event_raw_kmem_cache_alloc { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + long unsigned int gfp_flags; + int node; + bool accounted; + char __data[0]; +}; + +struct trace_event_raw_kmalloc { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + long unsigned int gfp_flags; + int node; + char __data[0]; +}; + +struct trace_event_raw_kfree { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + char __data[0]; +}; + +struct trace_event_raw_kmem_cache_free { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free_batched { + struct trace_entry ent; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + long unsigned int gfp_flags; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + int migratetype; + int percpu_refill; + char __data[0]; +}; + +struct trace_event_raw_mm_page_pcpu_drain { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc_extfrag { + struct trace_entry ent; + long unsigned int pfn; + int alloc_order; + int fallback_order; + int alloc_migratetype; + int fallback_migratetype; + int change_ownership; + char __data[0]; +}; + +struct trace_event_raw_rss_stat { + struct trace_entry ent; + unsigned int mm_id; + unsigned int curr; + int member; + long int size; + char __data[0]; +}; + +struct trace_event_data_offsets_kmem_cache_alloc {}; + +struct trace_event_data_offsets_kmalloc {}; + +struct trace_event_data_offsets_kfree {}; + +struct trace_event_data_offsets_kmem_cache_free { + u32 name; +}; + +struct trace_event_data_offsets_mm_page_free {}; + +struct trace_event_data_offsets_mm_page_free_batched {}; + +struct trace_event_data_offsets_mm_page_alloc {}; + +struct trace_event_data_offsets_mm_page {}; + +struct trace_event_data_offsets_mm_page_pcpu_drain {}; + +struct trace_event_data_offsets_mm_page_alloc_extfrag {}; + +struct trace_event_data_offsets_rss_stat {}; + +typedef void (*btf_trace_kmem_cache_alloc)(void *, long unsigned int, const void *, struct kmem_cache *, gfp_t, int); + +typedef void (*btf_trace_kmalloc)(void *, long unsigned int, const void *, size_t, size_t, gfp_t, int); + +typedef void (*btf_trace_kfree)(void *, long unsigned int, const void *); + +typedef void (*btf_trace_kmem_cache_free)(void *, long unsigned int, const void *, const struct kmem_cache *); + +typedef void (*btf_trace_mm_page_free)(void *, struct page *, unsigned int); + +typedef void (*btf_trace_mm_page_free_batched)(void *, struct page *); + +typedef void (*btf_trace_mm_page_alloc)(void *, struct page *, unsigned int, gfp_t, int); + +typedef void (*btf_trace_mm_page_alloc_zone_locked)(void *, struct page *, unsigned int, int, int); + +typedef void (*btf_trace_mm_page_pcpu_drain)(void *, struct page *, unsigned int, int); + +typedef void (*btf_trace_mm_page_alloc_extfrag)(void *, struct page *, int, int, int, int); + +typedef void (*btf_trace_rss_stat)(void *, struct mm_struct *, int); + +enum pageblock_bits { + PB_migrate = 0, + PB_migrate_end = 2, + PB_migrate_skip = 3, + NR_PAGEBLOCK_BITS = 4, +}; + +struct movable_operations { + bool (*isolate_page)(struct page *, isolate_mode_t); + int (*migrate_page)(struct page *, struct page *, enum migrate_mode); + void (*putback_page)(struct page *); +}; + +struct alloc_context { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct zoneref *preferred_zoneref; + int migratetype; + enum zone_type highest_zoneidx; + bool spread_dirty_pages; +}; + +struct trace_event_raw_mm_compaction_isolate_template { + struct trace_entry ent; + long unsigned int start_pfn; + long unsigned int end_pfn; + long unsigned int nr_scanned; + long unsigned int nr_taken; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_migratepages { + struct trace_entry ent; + long unsigned int nr_migrated; + long unsigned int nr_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_begin { + struct trace_entry ent; + long unsigned int zone_start; + long unsigned int migrate_pfn; + long unsigned int free_pfn; + long unsigned int zone_end; + bool sync; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_end { + struct trace_entry ent; + long unsigned int zone_start; + long unsigned int migrate_pfn; + long unsigned int free_pfn; + long unsigned int zone_end; + bool sync; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_try_to_compact_pages { + struct trace_entry ent; + int order; + long unsigned int gfp_mask; + int prio; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_suitable_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + int ret; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_defer_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + unsigned int considered; + unsigned int defer_shift; + int order_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_kcompactd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_kcompactd_wake_template { + struct trace_entry ent; + int nid; + int order; + enum zone_type highest_zoneidx; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_compaction_isolate_template {}; + +struct trace_event_data_offsets_mm_compaction_migratepages {}; + +struct trace_event_data_offsets_mm_compaction_begin {}; + +struct trace_event_data_offsets_mm_compaction_end {}; + +struct trace_event_data_offsets_mm_compaction_try_to_compact_pages {}; + +struct trace_event_data_offsets_mm_compaction_suitable_template {}; + +struct trace_event_data_offsets_mm_compaction_defer_template {}; + +struct trace_event_data_offsets_mm_compaction_kcompactd_sleep {}; + +struct trace_event_data_offsets_kcompactd_wake_template {}; + +typedef void (*btf_trace_mm_compaction_isolate_migratepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_mm_compaction_isolate_freepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_mm_compaction_migratepages)(void *, struct compact_control *, unsigned int); + +typedef void (*btf_trace_mm_compaction_begin)(void *, struct compact_control *, long unsigned int, long unsigned int, bool); + +typedef void (*btf_trace_mm_compaction_end)(void *, struct compact_control *, long unsigned int, long unsigned int, bool, int); + +typedef void (*btf_trace_mm_compaction_try_to_compact_pages)(void *, int, gfp_t, int); + +typedef void (*btf_trace_mm_compaction_finished)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_suitable)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_deferred)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_defer_compaction)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_defer_reset)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_kcompactd_sleep)(void *, int); + +typedef void (*btf_trace_mm_compaction_wakeup_kcompactd)(void *, int, int, enum zone_type); + +typedef void (*btf_trace_mm_compaction_kcompactd_wake)(void *, int, int, enum zone_type); + +typedef enum { + ISOLATE_ABORT = 0, + ISOLATE_NONE = 1, + ISOLATE_SUCCESS = 2, +} isolate_migrate_t; + +struct anon_vma_chain { + struct vm_area_struct *vma; + struct anon_vma *anon_vma; + struct list_head same_vma; + struct rb_node rb; + long unsigned int rb_subtree_last; +}; + +struct rb_augment_callbacks { + void (*propagate)(struct rb_node *, struct rb_node *); + void (*copy)(struct rb_node *, struct rb_node *); + void (*rotate)(struct rb_node *, struct rb_node *); +}; + +enum lru_status { + LRU_REMOVED = 0, + LRU_REMOVED_RETRY = 1, + LRU_ROTATE = 2, + LRU_SKIP = 3, + LRU_RETRY = 4, +}; + +struct list_lru_memcg { + struct callback_head rcu; + struct list_lru_one node[0]; +}; + +typedef enum lru_status (*list_lru_walk_cb)(struct list_head *, struct list_lru_one *, spinlock_t *, void *); + +struct list_lru_memcg_table { + struct list_lru_memcg *mlru; + struct mem_cgroup *memcg; +}; + +typedef struct { + long unsigned int pd; +} hugepd_t; + +struct follow_page_context { + struct dev_pagemap *pgmap; + unsigned int page_mask; +}; + +struct trace_event_raw_mmap_lock { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + char __data[0]; +}; + +struct trace_event_raw_mmap_lock_acquire_returned { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + bool success; + char __data[0]; +}; + +struct trace_event_data_offsets_mmap_lock { + u32 memcg_path; +}; + +struct trace_event_data_offsets_mmap_lock_acquire_returned { + u32 memcg_path; +}; + +typedef void (*btf_trace_mmap_lock_start_locking)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_mmap_lock_released)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_mmap_lock_acquire_returned)(void *, struct mm_struct *, const char *, bool, bool); + +struct memcg_path { + local_lock_t lock; + char *buf; + local_t buf_idx; +}; + +struct page_address_map { + struct page *page; + void *virtual; + struct list_head list; +}; + +struct page_address_slot { + struct list_head lh; + spinlock_t lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +typedef struct { + u64 val; +} pfn_t; + +typedef unsigned int pgtbl_mod_mask; + +typedef int rmap_t; + +struct copy_subpage_arg { + struct page *dst; + struct page *src; + struct vm_area_struct *vma; +}; + +struct mm_walk; + +struct mm_walk_ops { + int (*pgd_entry)(pgd_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*p4d_entry)(p4d_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pud_entry)(pud_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pmd_entry)(pmd_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pte_entry)(pte_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pte_hole)(long unsigned int, long unsigned int, int, struct mm_walk *); + int (*hugetlb_entry)(pte_t *, long unsigned int, long unsigned int, long unsigned int, struct mm_walk *); + int (*test_walk)(long unsigned int, long unsigned int, struct mm_walk *); + int (*pre_vma)(long unsigned int, long unsigned int, struct mm_walk *); + void (*post_vma)(struct mm_walk *); +}; + +enum page_walk_action { + ACTION_SUBTREE = 0, + ACTION_CONTINUE = 1, + ACTION_AGAIN = 2, +}; + +struct mm_walk { + const struct mm_walk_ops *ops; + struct mm_struct *mm; + pgd_t *pgd; + struct vm_area_struct *vma; + enum page_walk_action action; + bool no_vma; + void *private; +}; + +struct anon_vma_name { + struct kref kref; + char name[0]; +}; + +struct mlock_pvec { + local_lock_t lock; + struct pagevec vec; +}; + +struct hstate; + +struct hugepage_subpool { + spinlock_t lock; + long int count; + long int max_hpages; + long int used_hpages; + struct hstate *hstate; + long int min_hpages; + long int rsv_hpages; +}; + +struct hstate { + struct mutex resize_lock; + int next_nid_to_alloc; + int next_nid_to_free; + unsigned int order; + unsigned int demote_order; + long unsigned int mask; + long unsigned int max_huge_pages; + long unsigned int nr_huge_pages; + long unsigned int free_huge_pages; + long unsigned int resv_huge_pages; + long unsigned int surplus_huge_pages; + long unsigned int nr_overcommit_huge_pages; + struct list_head hugepage_activelist; + struct list_head hugepage_freelists[1]; + unsigned int max_huge_pages_node[1]; + unsigned int nr_huge_pages_node[1]; + unsigned int free_huge_pages_node[1]; + unsigned int surplus_huge_pages_node[1]; + struct cftype cgroup_files_dfl[8]; + struct cftype cgroup_files_legacy[10]; + char name[32]; +}; + +enum { + HUGETLB_SHMFS_INODE = 1, + HUGETLB_ANONHUGE_INODE = 2, +}; + +struct hugetlbfs_sb_info { + long int max_inodes; + long int free_inodes; + spinlock_t stat_lock; + struct hstate *hstate; + struct hugepage_subpool *spool; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +struct trace_event_raw_vm_unmapped_area { + struct trace_entry ent; + long unsigned int addr; + long unsigned int total_vm; + long unsigned int flags; + long unsigned int length; + long unsigned int low_limit; + long unsigned int high_limit; + long unsigned int align_mask; + long unsigned int align_offset; + char __data[0]; +}; + +struct trace_event_raw_vma_mas_szero { + struct trace_entry ent; + struct maple_tree *mt; + long unsigned int start; + long unsigned int end; + char __data[0]; +}; + +struct trace_event_raw_vma_store { + struct trace_entry ent; + struct maple_tree *mt; + struct vm_area_struct *vma; + long unsigned int vm_start; + long unsigned int vm_end; + char __data[0]; +}; + +struct trace_event_raw_exit_mmap { + struct trace_entry ent; + struct mm_struct *mm; + struct maple_tree *mt; + char __data[0]; +}; + +struct trace_event_data_offsets_vm_unmapped_area {}; + +struct trace_event_data_offsets_vma_mas_szero {}; + +struct trace_event_data_offsets_vma_store {}; + +struct trace_event_data_offsets_exit_mmap {}; + +typedef void (*btf_trace_vm_unmapped_area)(void *, long unsigned int, struct vm_unmapped_area_info *); + +typedef void (*btf_trace_vma_mas_szero)(void *, struct maple_tree *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_vma_store)(void *, struct maple_tree *, struct vm_area_struct *); + +typedef void (*btf_trace_exit_mmap)(void *, struct mm_struct *); + +struct mmap_arg_struct { + long unsigned int addr; + long unsigned int len; + long unsigned int prot; + long unsigned int flags; + long unsigned int fd; + long unsigned int offset; +}; + +enum pgt_entry { + NORMAL_PMD = 0, + HPAGE_PMD = 1, + NORMAL_PUD = 2, + HPAGE_PUD = 3, +}; + +enum tlb_flush_reason { + TLB_FLUSH_ON_TASK_SWITCH = 0, + TLB_REMOTE_SHOOTDOWN = 1, + TLB_LOCAL_SHOOTDOWN = 2, + TLB_LOCAL_MM_SHOOTDOWN = 3, + TLB_REMOTE_SEND_IPI = 4, + NR_TLB_FLUSH_REASONS = 5, +}; + +struct rmap_walk_control { + void *arg; + bool try_lock; + bool contended; + bool (*rmap_one)(struct folio *, struct vm_area_struct *, long unsigned int, void *); + int (*done)(struct folio *); + struct anon_vma * (*anon_lock)(struct folio *, struct rmap_walk_control *); + bool (*invalid_vma)(struct vm_area_struct *, void *); +}; + +enum hugetlb_page_flags { + HPG_restore_reserve = 0, + HPG_migratable = 1, + HPG_temporary = 2, + HPG_freed = 3, + HPG_vmemmap_optimized = 4, + HPG_raw_hwp_unreliable = 5, + __NR_HPAGEFLAGS = 6, +}; + +struct trace_event_raw_tlb_flush { + struct trace_entry ent; + int reason; + long unsigned int pages; + char __data[0]; +}; + +struct trace_event_data_offsets_tlb_flush {}; + +typedef void (*btf_trace_tlb_flush)(void *, int, long unsigned int); + +struct trace_event_raw_mm_migrate_pages { + struct trace_entry ent; + long unsigned int succeeded; + long unsigned int failed; + long unsigned int thp_succeeded; + long unsigned int thp_failed; + long unsigned int thp_split; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_raw_mm_migrate_pages_start { + struct trace_entry ent; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_raw_migration_pte { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pte; + int order; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_migrate_pages {}; + +struct trace_event_data_offsets_mm_migrate_pages_start {}; + +struct trace_event_data_offsets_migration_pte {}; + +typedef void (*btf_trace_mm_migrate_pages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, enum migrate_mode, int); + +typedef void (*btf_trace_mm_migrate_pages_start)(void *, enum migrate_mode, int); + +typedef void (*btf_trace_set_migration_pte)(void *, long unsigned int, long unsigned int, int); + +typedef void (*btf_trace_remove_migration_pte)(void *, long unsigned int, long unsigned int, int); + +struct folio_referenced_arg { + int mapcount; + int referenced; + long unsigned int vm_flags; + struct mem_cgroup *memcg; +}; + +struct vmap_area { + long unsigned int va_start; + long unsigned int va_end; + struct rb_node rb_node; + struct list_head list; + union { + long unsigned int subtree_max_size; + struct vm_struct *vm; + }; +}; + +typedef unsigned int kasan_vmalloc_flags_t; + +struct trace_event_raw_alloc_vmap_area { + struct trace_entry ent; + long unsigned int addr; + long unsigned int size; + long unsigned int align; + long unsigned int vstart; + long unsigned int vend; + int failed; + char __data[0]; +}; + +struct trace_event_raw_purge_vmap_area_lazy { + struct trace_entry ent; + long unsigned int start; + long unsigned int end; + unsigned int npurged; + char __data[0]; +}; + +struct trace_event_raw_free_vmap_area_noflush { + struct trace_entry ent; + long unsigned int va_start; + long unsigned int nr_lazy; + long unsigned int nr_lazy_max; + char __data[0]; +}; + +struct trace_event_data_offsets_alloc_vmap_area {}; + +struct trace_event_data_offsets_purge_vmap_area_lazy {}; + +struct trace_event_data_offsets_free_vmap_area_noflush {}; + +typedef void (*btf_trace_alloc_vmap_area)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int); + +typedef void (*btf_trace_purge_vmap_area_lazy)(void *, long unsigned int, long unsigned int, unsigned int); + +typedef void (*btf_trace_free_vmap_area_noflush)(void *, long unsigned int, long unsigned int, long unsigned int); + +struct vfree_deferred { + struct llist_head list; + struct work_struct wq; +}; + +enum fit_type { + NOTHING_FIT = 0, + FL_FIT_TYPE = 1, + LE_FIT_TYPE = 2, + RE_FIT_TYPE = 3, + NE_FIT_TYPE = 4, +}; + +struct vmap_block_queue { + spinlock_t lock; + struct list_head free; +}; + +struct vmap_block { + spinlock_t lock; + struct vmap_area *va; + long unsigned int free; + long unsigned int dirty; + long unsigned int dirty_min; + long unsigned int dirty_max; + struct list_head free_list; + struct callback_head callback_head; + struct list_head purge; +}; + +struct va_format { + const char *fmt; + va_list *va; +}; + +struct page_frag_cache { + void *va; + __u16 offset; + __u16 size; + unsigned int pagecnt_bias; + bool pfmemalloc; +}; + +enum meminit_context { + MEMINIT_EARLY = 0, + MEMINIT_HOTPLUG = 1, +}; + +typedef void compound_page_dtor(struct page *); + +typedef int fpi_t; + +struct madvise_walk_private { + struct mmu_gather *tlb; + bool pageout; +}; + +struct swap_iocb { + struct kiocb iocb; + struct bio_vec bvec[32]; + int pages; + int len; +}; + +struct vma_swap_readahead { + short unsigned int win; + short unsigned int offset; + short unsigned int nr_pte; + pte_t ptes[8]; +}; + +enum { + PERCPU_REF_INIT_ATOMIC = 1, + PERCPU_REF_INIT_DEAD = 2, + PERCPU_REF_ALLOW_REINIT = 4, +}; + +union swap_header { + struct { + char reserved[4086]; + char magic[10]; + } magic; + struct { + char bootbits[1024]; + __u32 version; + __u32 last_page; + __u32 nr_badpages; + unsigned char sws_uuid[16]; + unsigned char sws_volume[16]; + __u32 padding[117]; + __u32 badpages[1]; + } info; +}; + +struct swap_extent { + struct rb_node rb_node; + long unsigned int start_page; + long unsigned int nr_pages; + long: 32; + sector_t start_block; +}; + +struct swap_slots_cache { + bool lock_initialized; + struct mutex alloc_lock; + swp_entry_t *slots; + int nr; + int cur; + spinlock_t free_lock; + swp_entry_t *slots_ret; + int n_ret; +}; + +struct frontswap_ops { + void (*init)(unsigned int); + int (*store)(unsigned int, long unsigned int, struct page *); + int (*load)(unsigned int, long unsigned int, struct page *); + void (*invalidate_page)(unsigned int, long unsigned int); + void (*invalidate_area)(unsigned int); +}; + +struct crypto_async_request; + +typedef void (*crypto_completion_t)(struct crypto_async_request *, int); + +struct crypto_tfm; + +struct crypto_async_request { + struct list_head list; + crypto_completion_t complete; + void *data; + struct crypto_tfm *tfm; + u32 flags; +}; + +struct crypto_alg; + +struct crypto_tfm { + u32 crt_flags; + int node; + void (*exit)(struct crypto_tfm *); + struct crypto_alg *__crt_alg; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + void *__crt_ctx[0]; +}; + +struct cipher_alg { + unsigned int cia_min_keysize; + unsigned int cia_max_keysize; + int (*cia_setkey)(struct crypto_tfm *, const u8 *, unsigned int); + void (*cia_encrypt)(struct crypto_tfm *, u8 *, const u8 *); + void (*cia_decrypt)(struct crypto_tfm *, u8 *, const u8 *); +}; + +struct compress_alg { + int (*coa_compress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); + int (*coa_decompress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); +}; + +struct crypto_type; + +struct crypto_alg { + struct list_head cra_list; + struct list_head cra_users; + u32 cra_flags; + unsigned int cra_blocksize; + unsigned int cra_ctxsize; + unsigned int cra_alignmask; + int cra_priority; + refcount_t cra_refcnt; + char cra_name[128]; + char cra_driver_name[128]; + const struct crypto_type *cra_type; + union { + struct cipher_alg cipher; + struct compress_alg compress; + } cra_u; + int (*cra_init)(struct crypto_tfm *); + void (*cra_exit)(struct crypto_tfm *); + void (*cra_destroy)(struct crypto_alg *); + struct module *cra_module; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct crypto_instance; + +struct crypto_type { + unsigned int (*ctxsize)(struct crypto_alg *, u32, u32); + unsigned int (*extsize)(struct crypto_alg *); + int (*init)(struct crypto_tfm *, u32, u32); + int (*init_tfm)(struct crypto_tfm *); + void (*show)(struct seq_file *, struct crypto_alg *); + int (*report)(struct sk_buff *, struct crypto_alg *); + void (*free)(struct crypto_instance *); + unsigned int type; + unsigned int maskclear; + unsigned int maskset; + unsigned int tfmsize; +}; + +struct crypto_wait { + struct completion completion; + int err; +}; + +struct zpool; + +struct zpool_ops { + int (*evict)(struct zpool *, long unsigned int); +}; + +enum zpool_mapmode { + ZPOOL_MM_RW = 0, + ZPOOL_MM_RO = 1, + ZPOOL_MM_WO = 2, + ZPOOL_MM_DEFAULT = 0, +}; + +struct acomp_req { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int slen; + unsigned int dlen; + u32 flags; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + void *__ctx[0]; +}; + +struct crypto_acomp { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + unsigned int reqsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_tfm base; +}; + +struct crypto_acomp_ctx { + struct crypto_acomp *acomp; + struct acomp_req *req; + struct crypto_wait wait; + u8 *dstmem; + struct mutex *mutex; +}; + +struct zswap_pool { + struct zpool *zpool; + struct crypto_acomp_ctx *acomp_ctx; + struct kref kref; + struct list_head list; + struct work_struct release_work; + struct work_struct shrink_work; + struct hlist_node node; + char tfm_name[128]; +}; + +struct zswap_entry { + struct rb_node rbnode; + long unsigned int offset; + int refcount; + unsigned int length; + struct zswap_pool *pool; + union { + long unsigned int handle; + long unsigned int value; + }; + struct obj_cgroup *objcg; +}; + +struct zswap_header { + swp_entry_t swpentry; +}; + +struct zswap_tree { + struct rb_root rbroot; + spinlock_t lock; +}; + +enum zswap_get_swap_ret { + ZSWAP_SWAPCACHE_NEW = 0, + ZSWAP_SWAPCACHE_EXIST = 1, + ZSWAP_SWAPCACHE_FAIL = 2, +}; + +struct dma_pool { + struct list_head page_list; + spinlock_t lock; + size_t size; + struct device *dev; + size_t allocation; + size_t boundary; + char name[32]; + struct list_head pools; +}; + +struct dma_page { + struct list_head page_list; + void *vaddr; + long: 32; + dma_addr_t dma; + unsigned int in_use; + unsigned int offset; +}; + +enum string_size_units { + STRING_UNITS_10 = 0, + STRING_UNITS_2 = 1, +}; + +enum mcopy_atomic_mode { + MCOPY_ATOMIC_NORMAL = 0, + MCOPY_ATOMIC_ZEROPAGE = 1, + MCOPY_ATOMIC_CONTINUE = 2, +}; + +struct resv_map { + struct kref refs; + spinlock_t lock; + struct list_head regions; + long int adds_in_progress; + struct list_head region_cache; + long int region_cache_count; + struct page_counter *reservation_counter; + long unsigned int pages_per_hpage; + struct cgroup_subsys_state *css; +}; + +struct file_region { + struct list_head link; + long int from; + long int to; + struct page_counter *reservation_counter; + struct cgroup_subsys_state *css; +}; + +struct hugetlb_vma_lock { + struct kref refs; + struct rw_semaphore rw_sema; + struct vm_area_struct *vma; +}; + +struct huge_bootmem_page { + struct list_head list; + struct hstate *hstate; +}; + +enum hugetlb_memory_event { + HUGETLB_MAX = 0, + HUGETLB_NR_MEMORY_EVENTS = 1, +}; + +struct hugetlb_cgroup_per_node { + long unsigned int usage[1]; +}; + +struct hugetlb_cgroup { + struct cgroup_subsys_state css; + long: 32; + long: 32; + long: 32; + long: 32; + struct page_counter hugepage[1]; + struct page_counter rsvd_hugepage[1]; + atomic_long_t events[1]; + atomic_long_t events_local[1]; + struct cgroup_file events_file[1]; + struct cgroup_file events_local_file[1]; + struct hugetlb_cgroup_per_node *nodeinfo[0]; +}; + +enum vma_resv_mode { + VMA_NEEDS_RESV = 0, + VMA_COMMIT_RESV = 1, + VMA_END_RESV = 2, + VMA_ADD_RESV = 3, + VMA_DEL_RESV = 4, +}; + +struct mmu_notifier_subscriptions { + struct hlist_head list; + bool has_itree; + spinlock_t lock; + long unsigned int invalidate_seq; + long unsigned int active_invalidate_ranges; + struct rb_root_cached itree; + wait_queue_head_t wq; + struct hlist_head deferred_list; +}; + +struct interval_tree_node { + struct rb_node rb; + long unsigned int start; + long unsigned int last; + long unsigned int __subtree_last; +}; + +struct mmu_notifier; + +struct mmu_notifier_ops { + void (*release)(struct mmu_notifier *, struct mm_struct *); + int (*clear_flush_young)(struct mmu_notifier *, struct mm_struct *, long unsigned int, long unsigned int); + int (*clear_young)(struct mmu_notifier *, struct mm_struct *, long unsigned int, long unsigned int); + int (*test_young)(struct mmu_notifier *, struct mm_struct *, long unsigned int); + void (*change_pte)(struct mmu_notifier *, struct mm_struct *, long unsigned int, pte_t); + int (*invalidate_range_start)(struct mmu_notifier *, const struct mmu_notifier_range *); + void (*invalidate_range_end)(struct mmu_notifier *, const struct mmu_notifier_range *); + void (*invalidate_range)(struct mmu_notifier *, struct mm_struct *, long unsigned int, long unsigned int); + struct mmu_notifier * (*alloc_notifier)(struct mm_struct *); + void (*free_notifier)(struct mmu_notifier *); +}; + +struct mmu_notifier { + struct hlist_node hlist; + const struct mmu_notifier_ops *ops; + struct mm_struct *mm; + struct callback_head rcu; + unsigned int users; +}; + +struct mmu_interval_notifier; + +struct mmu_interval_notifier_ops { + bool (*invalidate)(struct mmu_interval_notifier *, const struct mmu_notifier_range *, long unsigned int); +}; + +struct mmu_interval_notifier { + struct interval_tree_node interval_tree; + const struct mmu_interval_notifier_ops *ops; + struct mm_struct *mm; + struct hlist_node deferred_item; + long unsigned int invalidate_seq; +}; + +struct mm_slot { + struct hlist_node hash; + struct list_head mm_node; + struct mm_struct *mm; +}; + +struct ksm_rmap_item; + +struct ksm_mm_slot { + struct mm_slot slot; + struct ksm_rmap_item *rmap_list; +}; + +struct ksm_stable_node; + +struct ksm_rmap_item { + struct ksm_rmap_item *rmap_list; + union { + struct anon_vma *anon_vma; + }; + struct mm_struct *mm; + long unsigned int address; + unsigned int oldchecksum; + union { + struct rb_node node; + struct { + struct ksm_stable_node *head; + struct hlist_node hlist; + }; + }; +}; + +struct ksm_scan { + struct ksm_mm_slot *mm_slot; + long unsigned int address; + struct ksm_rmap_item **rmap_list; + long unsigned int seqnr; +}; + +struct ksm_stable_node { + union { + struct rb_node node; + struct { + struct list_head *head; + struct { + struct hlist_node hlist_dup; + struct list_head list; + }; + }; + }; + struct hlist_head hlist; + union { + long unsigned int kpfn; + long unsigned int chain_prune_time; + }; + int rmap_hlist_len; +}; + +enum get_ksm_page_flags { + GET_KSM_PAGE_NOLOCK = 0, + GET_KSM_PAGE_LOCK = 1, + GET_KSM_PAGE_TRYLOCK = 2, +}; + +typedef u32 depot_stack_handle_t; + +enum stat_item { + ALLOC_FASTPATH = 0, + ALLOC_SLOWPATH = 1, + FREE_FASTPATH = 2, + FREE_SLOWPATH = 3, + FREE_FROZEN = 4, + FREE_ADD_PARTIAL = 5, + FREE_REMOVE_PARTIAL = 6, + ALLOC_FROM_PARTIAL = 7, + ALLOC_SLAB = 8, + ALLOC_REFILL = 9, + ALLOC_NODE_MISMATCH = 10, + FREE_SLAB = 11, + CPUSLAB_FLUSH = 12, + DEACTIVATE_FULL = 13, + DEACTIVATE_EMPTY = 14, + DEACTIVATE_TO_HEAD = 15, + DEACTIVATE_TO_TAIL = 16, + DEACTIVATE_REMOTE_FREES = 17, + DEACTIVATE_BYPASS = 18, + ORDER_FALLBACK = 19, + CMPXCHG_DOUBLE_CPU_FAIL = 20, + CMPXCHG_DOUBLE_FAIL = 21, + CPU_PARTIAL_ALLOC = 22, + CPU_PARTIAL_FREE = 23, + CPU_PARTIAL_NODE = 24, + CPU_PARTIAL_DRAIN = 25, + NR_SLUB_STAT_ITEMS = 26, +}; + +struct memory_notify { + long unsigned int start_pfn; + long unsigned int nr_pages; + int status_change_nid_normal; + int status_change_nid; +}; + +struct partial_context { + struct slab **slab; + gfp_t flags; + unsigned int orig_size; +}; + +struct track { + long unsigned int addr; + depot_stack_handle_t handle; + int cpu; + int pid; + long unsigned int when; +}; + +enum track_item { + TRACK_ALLOC = 0, + TRACK_FREE = 1, +}; + +struct slub_flush_work { + struct work_struct work; + struct kmem_cache *s; + bool skip; +}; + +struct detached_freelist { + struct slab *slab; + void *tail; + void *freelist; + int cnt; + struct kmem_cache *s; +}; + +struct location { + depot_stack_handle_t handle; + long unsigned int count; + long unsigned int addr; + long unsigned int waste; + long long int sum_time; + long int min_time; + long int max_time; + long int min_pid; + long int max_pid; + long unsigned int cpus[1]; + nodemask_t nodes; +}; + +struct loc_track { + long unsigned int max; + long unsigned int count; + struct location *loc; + long: 32; + loff_t idx; +}; + +enum slab_stat_type { + SL_ALL = 0, + SL_PARTIAL = 1, + SL_CPU = 2, + SL_OBJECTS = 3, + SL_TOTAL = 4, +}; + +struct slab_attribute { + struct attribute attr; + ssize_t (*show)(struct kmem_cache *, char *); + ssize_t (*store)(struct kmem_cache *, const char *, size_t); +}; + +struct saved_alias { + struct kmem_cache *s; + const char *name; + struct saved_alias *next; +}; + +enum slab_modes { + M_NONE = 0, + M_PARTIAL = 1, + M_FREE = 2, + M_FULL_NOLIST = 3, +}; + +struct buffer_head; + +typedef void bh_end_io_t(struct buffer_head *, int); + +struct buffer_head { + long unsigned int b_state; + struct buffer_head *b_this_page; + struct page *b_page; + long: 32; + sector_t b_blocknr; + size_t b_size; + char *b_data; + struct block_device *b_bdev; + bh_end_io_t *b_end_io; + void *b_private; + struct list_head b_assoc_buffers; + struct address_space *b_assoc_map; + atomic_t b_count; + spinlock_t b_uptodate_lock; +}; + +enum bh_state_bits { + BH_Uptodate = 0, + BH_Dirty = 1, + BH_Lock = 2, + BH_Req = 3, + BH_Mapped = 4, + BH_New = 5, + BH_Async_Read = 6, + BH_Async_Write = 7, + BH_Delay = 8, + BH_Boundary = 9, + BH_Write_EIO = 10, + BH_Unwritten = 11, + BH_Quiet = 12, + BH_Meta = 13, + BH_Prio = 14, + BH_Defer_Completion = 15, + BH_PrivateStart = 16, +}; + +enum transparent_hugepage_flag { + TRANSPARENT_HUGEPAGE_NEVER_DAX = 0, + TRANSPARENT_HUGEPAGE_FLAG = 1, + TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG = 2, + TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG = 3, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG = 4, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG = 5, + TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG = 6, + TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG = 7, + TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG = 8, +}; + +struct trace_event_raw_hugepage_set_pmd { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pmd; + char __data[0]; +}; + +struct trace_event_raw_hugepage_update { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pte; + long unsigned int clr; + long unsigned int set; + char __data[0]; +}; + +struct trace_event_raw_migration_pmd { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pmd; + char __data[0]; +}; + +struct trace_event_data_offsets_hugepage_set_pmd {}; + +struct trace_event_data_offsets_hugepage_update {}; + +struct trace_event_data_offsets_migration_pmd {}; + +typedef void (*btf_trace_hugepage_set_pmd)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_hugepage_update)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_set_migration_pmd)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_remove_migration_pmd)(void *, long unsigned int, long unsigned int); + +enum scan_result { + SCAN_FAIL = 0, + SCAN_SUCCEED = 1, + SCAN_PMD_NULL = 2, + SCAN_PMD_NONE = 3, + SCAN_PMD_MAPPED = 4, + SCAN_EXCEED_NONE_PTE = 5, + SCAN_EXCEED_SWAP_PTE = 6, + SCAN_EXCEED_SHARED_PTE = 7, + SCAN_PTE_NON_PRESENT = 8, + SCAN_PTE_UFFD_WP = 9, + SCAN_PTE_MAPPED_HUGEPAGE = 10, + SCAN_PAGE_RO = 11, + SCAN_LACK_REFERENCED_PAGE = 12, + SCAN_PAGE_NULL = 13, + SCAN_SCAN_ABORT = 14, + SCAN_PAGE_COUNT = 15, + SCAN_PAGE_LRU = 16, + SCAN_PAGE_LOCK = 17, + SCAN_PAGE_ANON = 18, + SCAN_PAGE_COMPOUND = 19, + SCAN_ANY_PROCESS = 20, + SCAN_VMA_NULL = 21, + SCAN_VMA_CHECK = 22, + SCAN_ADDRESS_RANGE = 23, + SCAN_DEL_PAGE_LRU = 24, + SCAN_ALLOC_HUGE_PAGE_FAIL = 25, + SCAN_CGROUP_CHARGE_FAIL = 26, + SCAN_TRUNCATED = 27, + SCAN_PAGE_HAS_PRIVATE = 28, +}; + +struct trace_event_raw_mm_khugepaged_scan_pmd { + struct trace_entry ent; + struct mm_struct *mm; + long unsigned int pfn; + bool writable; + int referenced; + int none_or_zero; + int status; + int unmapped; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page { + struct trace_entry ent; + struct mm_struct *mm; + int isolated; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_isolate { + struct trace_entry ent; + long unsigned int pfn; + int none_or_zero; + int referenced; + bool writable; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_swapin { + struct trace_entry ent; + struct mm_struct *mm; + int swapped_in; + int referenced; + int ret; + char __data[0]; +}; + +struct trace_event_raw_mm_khugepaged_scan_file { + struct trace_entry ent; + struct mm_struct *mm; + long unsigned int pfn; + u32 __data_loc_filename; + int present; + int swap; + int result; + char __data[0]; +}; + +struct trace_event_raw_mm_khugepaged_collapse_file { + struct trace_entry ent; + struct mm_struct *mm; + long unsigned int hpfn; + long unsigned int index; + long unsigned int addr; + bool is_shmem; + u32 __data_loc_filename; + int nr; + int result; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_khugepaged_scan_pmd {}; + +struct trace_event_data_offsets_mm_collapse_huge_page {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_isolate {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_swapin {}; + +struct trace_event_data_offsets_mm_khugepaged_scan_file { + u32 filename; +}; + +struct trace_event_data_offsets_mm_khugepaged_collapse_file { + u32 filename; +}; + +typedef void (*btf_trace_mm_khugepaged_scan_pmd)(void *, struct mm_struct *, struct page *, bool, int, int, int, int); + +typedef void (*btf_trace_mm_collapse_huge_page)(void *, struct mm_struct *, int, int); + +typedef void (*btf_trace_mm_collapse_huge_page_isolate)(void *, struct page *, int, int, bool, int); + +typedef void (*btf_trace_mm_collapse_huge_page_swapin)(void *, struct mm_struct *, int, int, int); + +typedef void (*btf_trace_mm_khugepaged_scan_file)(void *, struct mm_struct *, struct page *, struct file *, int, int, int); + +typedef void (*btf_trace_mm_khugepaged_collapse_file)(void *, struct mm_struct *, struct page *, long unsigned int, bool, long unsigned int, struct file *, int, int); + +struct collapse_control { + bool is_khugepaged; + u32 node_load[1]; + nodemask_t alloc_nmask; +}; + +struct khugepaged_mm_slot { + struct mm_slot slot; + int nr_pte_mapped_thp; + long unsigned int pte_mapped_thp[8]; +}; + +struct khugepaged_scan { + struct list_head mm_head; + struct khugepaged_mm_slot *mm_slot; + long unsigned int address; +}; + +enum mem_cgroup_events_target { + MEM_CGROUP_TARGET_THRESH = 0, + MEM_CGROUP_TARGET_SOFTLIMIT = 1, + MEM_CGROUP_NTARGETS = 2, +}; + +struct memcg_vmstats { + long int state[48]; + long unsigned int events[19]; + long int state_pending[48]; + long unsigned int events_pending[19]; +}; + +struct memcg_vmstats_percpu { + long int state[48]; + long unsigned int events[19]; + long int state_prev[48]; + long unsigned int events_prev[19]; + long unsigned int nr_page_events; + long unsigned int targets[2]; +}; + +struct mem_cgroup_tree_per_node { + struct rb_root rb_root; + struct rb_node *rb_rightmost; + spinlock_t lock; +}; + +struct mem_cgroup_tree { + struct mem_cgroup_tree_per_node *rb_tree_per_node[1]; +}; + +struct mem_cgroup_eventfd_list { + struct list_head list; + struct eventfd_ctx *eventfd; +}; + +struct mem_cgroup_event { + struct mem_cgroup *memcg; + struct eventfd_ctx *eventfd; + struct list_head list; + int (*register_event)(struct mem_cgroup *, struct eventfd_ctx *, const char *); + void (*unregister_event)(struct mem_cgroup *, struct eventfd_ctx *); + poll_table pt; + wait_queue_head_t *wqh; + wait_queue_entry_t wait; + struct work_struct remove; +}; + +struct move_charge_struct { + spinlock_t lock; + struct mm_struct *mm; + struct mem_cgroup *from; + struct mem_cgroup *to; + long unsigned int flags; + long unsigned int precharge; + long unsigned int moved_charge; + long unsigned int moved_swap; + struct task_struct *moving_task; + wait_queue_head_t waitq; +}; + +enum res_type { + _MEM = 0, + _MEMSWAP = 1, + _KMEM = 2, + _TCP = 3, +}; + +struct memory_stat { + const char *name; + unsigned int idx; +}; + +struct oom_wait_info { + struct mem_cgroup *memcg; + wait_queue_entry_t wait; +}; + +struct memcg_stock_pcp { + local_lock_t stock_lock; + struct mem_cgroup *cached; + unsigned int nr_pages; + struct obj_cgroup *cached_objcg; + struct pglist_data *cached_pgdat; + unsigned int nr_bytes; + int nr_slab_reclaimable_b; + int nr_slab_unreclaimable_b; + struct work_struct work; + long unsigned int flags; +}; + +enum { + RES_USAGE = 0, + RES_LIMIT = 1, + RES_MAX_USAGE = 2, + RES_FAILCNT = 3, + RES_SOFT_LIMIT = 4, +}; + +union mc_target { + struct page *page; + swp_entry_t ent; +}; + +enum mc_target_type { + MC_TARGET_NONE = 0, + MC_TARGET_PAGE = 1, + MC_TARGET_SWAP = 2, + MC_TARGET_DEVICE = 3, +}; + +struct uncharge_gather { + struct mem_cgroup *memcg; + long unsigned int nr_memory; + long unsigned int pgpgout; + long unsigned int nr_kmem; + int nid; +}; + +enum vmpressure_levels { + VMPRESSURE_LOW = 0, + VMPRESSURE_MEDIUM = 1, + VMPRESSURE_CRITICAL = 2, + VMPRESSURE_NUM_LEVELS = 3, +}; + +enum vmpressure_modes { + VMPRESSURE_NO_PASSTHROUGH = 0, + VMPRESSURE_HIERARCHY = 1, + VMPRESSURE_LOCAL = 2, + VMPRESSURE_NUM_MODES = 3, +}; + +struct vmpressure_event { + struct eventfd_ctx *efd; + enum vmpressure_levels level; + enum vmpressure_modes mode; + struct list_head node; +}; + +struct swap_cgroup_ctrl { + struct page **map; + long unsigned int length; + spinlock_t lock; +}; + +struct swap_cgroup { + short unsigned int id; +}; + +enum { + RES_USAGE___2 = 0, + RES_RSVD_USAGE = 1, + RES_LIMIT___2 = 2, + RES_RSVD_LIMIT = 3, + RES_MAX_USAGE___2 = 4, + RES_RSVD_MAX_USAGE = 5, + RES_FAILCNT___2 = 6, + RES_RSVD_FAILCNT = 7, +}; + +struct trace_event_raw_test_pages_isolated { + struct trace_entry ent; + long unsigned int start_pfn; + long unsigned int end_pfn; + long unsigned int fin_pfn; + char __data[0]; +}; + +struct trace_event_data_offsets_test_pages_isolated {}; + +typedef void (*btf_trace_test_pages_isolated)(void *, long unsigned int, long unsigned int, long unsigned int); + +struct zpool_driver; + +struct zpool { + struct zpool_driver *driver; + void *pool; +}; + +struct zpool_driver { + char *type; + struct module *owner; + atomic_t refcount; + struct list_head list; + void * (*create)(const char *, gfp_t, const struct zpool_ops *, struct zpool *); + void (*destroy)(void *); + bool malloc_support_movable; + int (*malloc)(void *, size_t, gfp_t, long unsigned int *); + void (*free)(void *, long unsigned int); + int (*shrink)(void *, unsigned int, unsigned int *); + bool sleep_mapped; + void * (*map)(void *, long unsigned int, enum zpool_mapmode); + void (*unmap)(void *, long unsigned int); + u64 (*total_size)(void *); +}; + +struct zbud_pool { + spinlock_t lock; + union { + struct list_head buddied; + struct list_head unbuddied[63]; + }; + struct list_head lru; + long: 32; + u64 pages_nr; + struct zpool *zpool; + const struct zpool_ops *zpool_ops; +}; + +struct zbud_header { + struct list_head buddy; + struct list_head lru; + unsigned int first_chunks; + unsigned int last_chunks; + bool under_reclaim; +}; + +enum buddy { + FIRST = 0, + LAST = 1, +}; + +struct trace_event_raw_cma_alloc_class { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int pfn; + const struct page *page; + long unsigned int count; + unsigned int align; + char __data[0]; +}; + +struct trace_event_raw_cma_release { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int pfn; + const struct page *page; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_cma_alloc_start { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int count; + unsigned int align; + char __data[0]; +}; + +struct trace_event_data_offsets_cma_alloc_class { + u32 name; +}; + +struct trace_event_data_offsets_cma_release { + u32 name; +}; + +struct trace_event_data_offsets_cma_alloc_start { + u32 name; +}; + +typedef void (*btf_trace_cma_release)(void *, const char *, long unsigned int, const struct page *, long unsigned int); + +typedef void (*btf_trace_cma_alloc_start)(void *, const char *, long unsigned int, unsigned int); + +typedef void (*btf_trace_cma_alloc_finish)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int); + +typedef void (*btf_trace_cma_alloc_busy_retry)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int); + +struct balloon_dev_info { + long unsigned int isolated_pages; + spinlock_t pages_lock; + struct list_head pages; + int (*migratepage)(struct balloon_dev_info *, struct page *, struct page *, enum migrate_mode); +}; + +struct page_ext_operations { + size_t offset; + size_t size; + bool (*need)(); + void (*init)(); +}; + +enum { + BAD_STACK = 4294967295, + NOT_STACK = 0, + GOOD_FRAME = 1, + GOOD_STACK = 2, +}; + +enum hmm_pfn_flags { + HMM_PFN_VALID = 2147483648, + HMM_PFN_WRITE = 1073741824, + HMM_PFN_ERROR = 536870912, + HMM_PFN_ORDER_SHIFT = 24, + HMM_PFN_REQ_FAULT = 2147483648, + HMM_PFN_REQ_WRITE = 1073741824, + HMM_PFN_FLAGS = 4278190080, +}; + +struct hmm_range { + struct mmu_interval_notifier *notifier; + long unsigned int notifier_seq; + long unsigned int start; + long unsigned int end; + long unsigned int *hmm_pfns; + long unsigned int default_flags; + long unsigned int pfn_flags_mask; + void *dev_private_owner; +}; + +struct hmm_vma_walk { + struct hmm_range *range; + long unsigned int last; +}; + +enum { + HMM_NEED_FAULT = 1, + HMM_NEED_WRITE_FAULT = 2, + HMM_NEED_ALL_BITS = 3, +}; + +struct hugetlbfs_inode_info { + struct shared_policy policy; + struct inode vfs_inode; + unsigned int seals; + long: 32; +}; + +struct page_reporting_dev_info { + int (*report)(struct page_reporting_dev_info *, struct scatterlist *, unsigned int); + struct delayed_work work; + atomic_t state; + unsigned int order; +}; + +enum { + PAGE_REPORTING_IDLE = 0, + PAGE_REPORTING_REQUESTED = 1, + PAGE_REPORTING_ACTIVE = 2, +}; + +struct open_flags { + int open_flag; + umode_t mode; + int acc_mode; + int intent; + int lookup_flags; +}; + +typedef __kernel_long_t __kernel_off_t; + +typedef __kernel_off_t off_t; + +typedef __kernel_rwf_t rwf_t; + +struct files_stat_struct { + long unsigned int nr_files; + long unsigned int nr_free_files; + long unsigned int max_files; +}; + +struct fscrypt_policy_v1 { + __u8 version; + __u8 contents_encryption_mode; + __u8 filenames_encryption_mode; + __u8 flags; + __u8 master_key_descriptor[8]; +}; + +struct fscrypt_policy_v2 { + __u8 version; + __u8 contents_encryption_mode; + __u8 filenames_encryption_mode; + __u8 flags; + __u8 __reserved[4]; + __u8 master_key_identifier[16]; +}; + +union fscrypt_policy { + u8 version; + struct fscrypt_policy_v1 v1; + struct fscrypt_policy_v2 v2; +}; + +typedef struct kobject *kobj_probe_t(dev_t, int *, void *); + +struct kobj_map; + +struct char_device_struct { + struct char_device_struct *next; + unsigned int major; + unsigned int baseminor; + int minorct; + char name[64]; + struct cdev *cdev; +}; + +struct stat { + long unsigned int st_dev; + long unsigned int st_ino; + short unsigned int st_mode; + short unsigned int st_nlink; + short unsigned int st_uid; + short unsigned int st_gid; + long unsigned int st_rdev; + long unsigned int st_size; + long unsigned int st_blksize; + long unsigned int st_blocks; + long unsigned int st_atime; + long unsigned int st_atime_nsec; + long unsigned int st_mtime; + long unsigned int st_mtime_nsec; + long unsigned int st_ctime; + long unsigned int st_ctime_nsec; + long unsigned int __unused4; + long unsigned int __unused5; +}; + +struct stat64 { + long long unsigned int st_dev; + unsigned char __pad0[4]; + long unsigned int __st_ino; + unsigned int st_mode; + unsigned int st_nlink; + long unsigned int st_uid; + long unsigned int st_gid; + long long unsigned int st_rdev; + unsigned char __pad3[4]; + long: 32; + long long int st_size; + long unsigned int st_blksize; + long: 32; + long long unsigned int st_blocks; + long unsigned int st_atime; + long unsigned int st_atime_nsec; + long unsigned int st_mtime; + long unsigned int st_mtime_nsec; + long unsigned int st_ctime; + long unsigned int st_ctime_nsec; + long long unsigned int st_ino; +}; + +struct statx_timestamp { + __s64 tv_sec; + __u32 tv_nsec; + __s32 __reserved; +}; + +struct statx { + __u32 stx_mask; + __u32 stx_blksize; + __u64 stx_attributes; + __u32 stx_nlink; + __u32 stx_uid; + __u32 stx_gid; + __u16 stx_mode; + __u16 __spare0[1]; + __u64 stx_ino; + __u64 stx_size; + __u64 stx_blocks; + __u64 stx_attributes_mask; + struct statx_timestamp stx_atime; + struct statx_timestamp stx_btime; + struct statx_timestamp stx_ctime; + struct statx_timestamp stx_mtime; + __u32 stx_rdev_major; + __u32 stx_rdev_minor; + __u32 stx_dev_major; + __u32 stx_dev_minor; + __u64 stx_mnt_id; + __u32 stx_dio_mem_align; + __u32 stx_dio_offset_align; + __u64 __spare3[12]; +}; + +struct mount; + +struct mnt_namespace { + struct ns_common ns; + struct mount *root; + struct list_head list; + spinlock_t ns_lock; + struct user_namespace *user_ns; + struct ucounts *ucounts; + u64 seq; + wait_queue_head_t poll; + long: 32; + u64 event; + unsigned int mounts; + unsigned int pending_mounts; +}; + +struct mnt_pcp; + +struct mountpoint; + +struct mount { + struct hlist_node mnt_hash; + struct mount *mnt_parent; + struct dentry *mnt_mountpoint; + struct vfsmount mnt; + union { + struct callback_head mnt_rcu; + struct llist_node mnt_llist; + }; + struct mnt_pcp *mnt_pcp; + struct list_head mnt_mounts; + struct list_head mnt_child; + struct list_head mnt_instance; + const char *mnt_devname; + struct list_head mnt_list; + struct list_head mnt_expire; + struct list_head mnt_share; + struct list_head mnt_slave_list; + struct list_head mnt_slave; + struct mount *mnt_master; + struct mnt_namespace *mnt_ns; + struct mountpoint *mnt_mp; + union { + struct hlist_node mnt_mp_list; + struct hlist_node mnt_umount; + }; + struct list_head mnt_umounting; + struct fsnotify_mark_connector *mnt_fsnotify_marks; + __u32 mnt_fsnotify_mask; + int mnt_id; + int mnt_group_id; + int mnt_expiry_mark; + struct hlist_head mnt_pins; + struct hlist_head mnt_stuck_children; +}; + +struct mnt_pcp { + int mnt_count; + int mnt_writers; +}; + +struct mountpoint { + struct hlist_node m_hash; + struct dentry *m_dentry; + struct hlist_head m_list; + int m_count; +}; + +typedef short unsigned int ushort; + +struct user_arg_ptr { + union { + const char * const *native; + } ptr; +}; + +enum inode_i_mutex_lock_class { + I_MUTEX_NORMAL = 0, + I_MUTEX_PARENT = 1, + I_MUTEX_CHILD = 2, + I_MUTEX_XATTR = 3, + I_MUTEX_NONDIR2 = 4, + I_MUTEX_PARENT2 = 5, +}; + +struct name_snapshot { + struct qstr name; + unsigned char inline_name[36]; + long: 32; +}; + +struct saved { + struct path link; + struct delayed_call done; + const char *name; + unsigned int seq; +}; + +struct nameidata { + struct path path; + struct qstr last; + struct path root; + struct inode *inode; + unsigned int flags; + unsigned int state; + unsigned int seq; + unsigned int next_seq; + unsigned int m_seq; + unsigned int r_seq; + int last_type; + unsigned int depth; + int total_link_count; + struct saved *stack; + struct saved internal[2]; + struct filename *name; + struct nameidata *saved; + unsigned int root_seq; + int dfd; + vfsuid_t dir_vfsuid; + umode_t dir_mode; + long: 32; +}; + +struct renamedata { + struct user_namespace *old_mnt_userns; + struct inode *old_dir; + struct dentry *old_dentry; + struct user_namespace *new_mnt_userns; + struct inode *new_dir; + struct dentry *new_dentry; + struct inode **delegated_inode; + unsigned int flags; +}; + +enum { + LAST_NORM = 0, + LAST_ROOT = 1, + LAST_DOT = 2, + LAST_DOTDOT = 3, +}; + +enum { + WALK_TRAILING = 1, + WALK_MORE = 2, + WALK_NOFOLLOW = 4, +}; + +struct word_at_a_time { + const long unsigned int one_bits; + const long unsigned int high_bits; +}; + +struct f_owner_ex { + int type; + __kernel_pid_t pid; +}; + +struct flock { + short int l_type; + short int l_whence; + __kernel_off_t l_start; + __kernel_off_t l_len; + __kernel_pid_t l_pid; +}; + +struct flock64 { + short int l_type; + short int l_whence; + long: 32; + __kernel_loff_t l_start; + __kernel_loff_t l_len; + __kernel_pid_t l_pid; + long: 32; +}; + +enum rw_hint { + WRITE_LIFE_NOT_SET = 0, + WRITE_LIFE_NONE = 1, + WRITE_LIFE_SHORT = 2, + WRITE_LIFE_MEDIUM = 3, + WRITE_LIFE_LONG = 4, + WRITE_LIFE_EXTREME = 5, +}; + +struct file_clone_range { + __s64 src_fd; + __u64 src_offset; + __u64 src_length; + __u64 dest_offset; +}; + +struct file_dedupe_range_info { + __s64 dest_fd; + __u64 dest_offset; + __u64 bytes_deduped; + __s32 status; + __u32 reserved; +}; + +struct file_dedupe_range { + __u64 src_offset; + __u64 src_length; + __u16 dest_count; + __u16 reserved1; + __u32 reserved2; + struct file_dedupe_range_info info[0]; +}; + +struct fsxattr { + __u32 fsx_xflags; + __u32 fsx_extsize; + __u32 fsx_nextents; + __u32 fsx_projid; + __u32 fsx_cowextsize; + unsigned char fsx_pad[8]; +}; + +struct fiemap_extent; + +struct fiemap_extent_info { + unsigned int fi_flags; + unsigned int fi_extents_mapped; + unsigned int fi_extents_max; + struct fiemap_extent *fi_extents_start; +}; + +struct space_resv { + __s16 l_type; + __s16 l_whence; + long: 32; + __s64 l_start; + __s64 l_len; + __s32 l_sysid; + __u32 l_pid; + __s32 l_pad[4]; +}; + +struct fiemap_extent { + __u64 fe_logical; + __u64 fe_physical; + __u64 fe_length; + __u64 fe_reserved64[2]; + __u32 fe_flags; + __u32 fe_reserved[3]; +}; + +struct fiemap { + __u64 fm_start; + __u64 fm_length; + __u32 fm_flags; + __u32 fm_mapped_extents; + __u32 fm_extent_count; + __u32 fm_reserved; + struct fiemap_extent fm_extents[0]; +}; + +struct linux_dirent64 { + u64 d_ino; + s64 d_off; + short unsigned int d_reclen; + unsigned char d_type; + char d_name[0]; + long: 32; +}; + +struct linux_dirent { + long unsigned int d_ino; + long unsigned int d_off; + short unsigned int d_reclen; + char d_name[1]; +}; + +struct getdents_callback { + struct dir_context ctx; + struct linux_dirent *current_dir; + int prev_reclen; + int count; + int error; +}; + +struct getdents_callback64 { + struct dir_context ctx; + struct linux_dirent64 *current_dir; + int prev_reclen; + int count; + int error; +}; + +typedef struct { + long unsigned int fds_bits[32]; +} __kernel_fd_set; + +typedef __kernel_fd_set fd_set; + +struct poll_table_entry { + struct file *filp; + __poll_t key; + wait_queue_entry_t wait; + wait_queue_head_t *wait_address; +}; + +struct poll_table_page; + +struct poll_wqueues { + poll_table pt; + struct poll_table_page *table; + struct task_struct *polling_task; + int triggered; + int error; + int inline_index; + struct poll_table_entry inline_entries[18]; +}; + +struct poll_table_page { + struct poll_table_page *next; + struct poll_table_entry *entry; + struct poll_table_entry entries[0]; +}; + +enum poll_time_type { + PT_TIMEVAL = 0, + PT_OLD_TIMEVAL = 1, + PT_TIMESPEC = 2, + PT_OLD_TIMESPEC = 3, +}; + +typedef struct { + long unsigned int *in; + long unsigned int *out; + long unsigned int *ex; + long unsigned int *res_in; + long unsigned int *res_out; + long unsigned int *res_ex; +} fd_set_bits; + +struct sigset_argpack { + sigset_t *p; + size_t size; +}; + +struct sel_arg_struct { + long unsigned int n; + fd_set *inp; + fd_set *outp; + fd_set *exp; + struct __kernel_old_timeval *tvp; +}; + +struct poll_list { + struct poll_list *next; + int len; + struct pollfd entries[0]; +}; + +enum dentry_d_lock_class { + DENTRY_D_LOCK_NORMAL = 0, + DENTRY_D_LOCK_NESTED = 1, +}; + +struct dentry_stat_t { + long int nr_dentry; + long int nr_unused; + long int age_limit; + long int want_pages; + long int nr_negative; + long int dummy; +}; + +struct external_name { + union { + atomic_t count; + struct callback_head head; + } u; + unsigned char name[0]; +}; + +enum d_walk_ret { + D_WALK_CONTINUE = 0, + D_WALK_QUIT = 1, + D_WALK_NORETRY = 2, + D_WALK_SKIP = 3, +}; + +struct check_mount { + struct vfsmount *mnt; + unsigned int mounted; +}; + +struct select_data { + struct dentry *start; + union { + long int found; + struct dentry *victim; + }; + struct list_head dispose; +}; + +struct inodes_stat_t { + long int nr_inodes; + long int nr_unused; + long int dummy[5]; +}; + +enum file_time_flags { + S_ATIME = 1, + S_MTIME = 2, + S_CTIME = 4, + S_VERSION = 8, +}; + +struct mnt_idmap { + struct user_namespace *owner; + refcount_t count; +}; + +struct mount_attr { + __u64 attr_set; + __u64 attr_clr; + __u64 propagation; + __u64 userns_fd; +}; + +struct proc_mounts { + struct mnt_namespace *ns; + struct path root; + int (*show)(struct seq_file *, struct vfsmount *); + struct mount cursor; +}; + +struct mount_kattr { + unsigned int attr_set; + unsigned int attr_clr; + unsigned int propagation; + unsigned int lookup_flags; + bool recurse; + struct user_namespace *mnt_userns; + struct mnt_idmap *mnt_idmap; +}; + +enum umount_tree_flags { + UMOUNT_SYNC = 1, + UMOUNT_PROPAGATE = 2, + UMOUNT_CONNECTED = 4, +}; + +struct xattr_name { + char name[256]; +}; + +struct xattr_ctx { + union { + const void *cvalue; + void *value; + }; + void *kvalue; + size_t size; + struct xattr_name *kname; + unsigned int flags; +}; + +struct simple_transaction_argresp { + ssize_t size; + char data[0]; +}; + +enum utf8_normalization { + UTF8_NFDI = 0, + UTF8_NFDICF = 1, + UTF8_NMAX = 2, +}; + +struct simple_attr { + int (*get)(void *, u64 *); + int (*set)(void *, u64); + char get_buf[24]; + char set_buf[24]; + void *data; + const char *fmt; + struct mutex mutex; +}; + +struct wb_writeback_work { + long int nr_pages; + struct super_block *sb; + enum writeback_sync_modes sync_mode; + unsigned int tagged_writepages: 1; + unsigned int for_kupdate: 1; + unsigned int range_cyclic: 1; + unsigned int for_background: 1; + unsigned int for_sync: 1; + unsigned int auto_free: 1; + enum wb_reason reason; + struct list_head list; + struct wb_completion *done; +}; + +struct trace_event_raw_writeback_folio_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int index; + char __data[0]; +}; + +struct trace_event_raw_writeback_dirty_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_inode_foreign_history { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t cgroup_ino; + unsigned int history; + char __data[0]; +}; + +struct trace_event_raw_inode_switch_wbs { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t old_cgroup_ino; + ino_t new_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_track_foreign_dirty { + struct trace_entry ent; + char name[32]; + u64 bdi_id; + ino_t ino; + unsigned int memcg_id; + ino_t cgroup_ino; + ino_t page_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_flush_foreign { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + unsigned int frn_bdi_id; + unsigned int frn_memcg_id; + char __data[0]; +}; + +struct trace_event_raw_writeback_write_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + int sync_mode; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_work_class { + struct trace_entry ent; + char name[32]; + long int nr_pages; + dev_t sb_dev; + int sync_mode; + int for_kupdate; + int range_cyclic; + int for_background; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_pages_written { + struct trace_entry ent; + long int pages; + char __data[0]; +}; + +struct trace_event_raw_writeback_class { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_bdi_register { + struct trace_entry ent; + char name[32]; + char __data[0]; +}; + +struct trace_event_raw_wbc_class { + struct trace_entry ent; + char name[32]; + long int nr_to_write; + long int pages_skipped; + int sync_mode; + int for_kupdate; + int for_background; + int for_reclaim; + int range_cyclic; + long int range_start; + long int range_end; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_queue_io { + struct trace_entry ent; + char name[32]; + long unsigned int older; + long int age; + int moved; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_global_dirty_state { + struct trace_entry ent; + long unsigned int nr_dirty; + long unsigned int nr_writeback; + long unsigned int background_thresh; + long unsigned int dirty_thresh; + long unsigned int dirty_limit; + long unsigned int nr_dirtied; + long unsigned int nr_written; + char __data[0]; +}; + +struct trace_event_raw_bdi_dirty_ratelimit { + struct trace_entry ent; + char bdi[32]; + long unsigned int write_bw; + long unsigned int avg_write_bw; + long unsigned int dirty_rate; + long unsigned int dirty_ratelimit; + long unsigned int task_ratelimit; + long unsigned int balanced_dirty_ratelimit; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_balance_dirty_pages { + struct trace_entry ent; + char bdi[32]; + long unsigned int limit; + long unsigned int setpoint; + long unsigned int dirty; + long unsigned int bdi_setpoint; + long unsigned int bdi_dirty; + long unsigned int dirty_ratelimit; + long unsigned int task_ratelimit; + unsigned int dirtied; + unsigned int dirtied_pause; + long unsigned int paused; + long int pause; + long unsigned int period; + long int think; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_sb_inodes_requeue { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int dirtied_when; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_single_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int dirtied_when; + long unsigned int writeback_index; + long int nr_to_write; + long unsigned int wrote; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_inode_template { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int state; + __u16 mode; + long unsigned int dirtied_when; + char __data[0]; +}; + +struct trace_event_data_offsets_writeback_folio_template {}; + +struct trace_event_data_offsets_writeback_dirty_inode_template {}; + +struct trace_event_data_offsets_inode_foreign_history {}; + +struct trace_event_data_offsets_inode_switch_wbs {}; + +struct trace_event_data_offsets_track_foreign_dirty {}; + +struct trace_event_data_offsets_flush_foreign {}; + +struct trace_event_data_offsets_writeback_write_inode_template {}; + +struct trace_event_data_offsets_writeback_work_class {}; + +struct trace_event_data_offsets_writeback_pages_written {}; + +struct trace_event_data_offsets_writeback_class {}; + +struct trace_event_data_offsets_writeback_bdi_register {}; + +struct trace_event_data_offsets_wbc_class {}; + +struct trace_event_data_offsets_writeback_queue_io {}; + +struct trace_event_data_offsets_global_dirty_state {}; + +struct trace_event_data_offsets_bdi_dirty_ratelimit {}; + +struct trace_event_data_offsets_balance_dirty_pages {}; + +struct trace_event_data_offsets_writeback_sb_inodes_requeue {}; + +struct trace_event_data_offsets_writeback_single_inode_template {}; + +struct trace_event_data_offsets_writeback_inode_template {}; + +typedef void (*btf_trace_writeback_dirty_folio)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_folio_wait_writeback)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_writeback_mark_inode_dirty)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_dirty_inode_start)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_dirty_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_inode_foreign_history)(void *, struct inode *, struct writeback_control *, unsigned int); + +typedef void (*btf_trace_inode_switch_wbs)(void *, struct inode *, struct bdi_writeback *, struct bdi_writeback *); + +typedef void (*btf_trace_track_foreign_dirty)(void *, struct folio *, struct bdi_writeback *); + +typedef void (*btf_trace_flush_foreign)(void *, struct bdi_writeback *, unsigned int, unsigned int); + +typedef void (*btf_trace_writeback_write_inode_start)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_write_inode)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_queue)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_exec)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_start)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_written)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_wait)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_pages_written)(void *, long int); + +typedef void (*btf_trace_writeback_wake_background)(void *, struct bdi_writeback *); + +typedef void (*btf_trace_writeback_bdi_register)(void *, struct backing_dev_info *); + +typedef void (*btf_trace_wbc_writepage)(void *, struct writeback_control *, struct backing_dev_info *); + +typedef void (*btf_trace_writeback_queue_io)(void *, struct bdi_writeback *, struct wb_writeback_work *, long unsigned int, int); + +typedef void (*btf_trace_global_dirty_state)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_bdi_dirty_ratelimit)(void *, struct bdi_writeback *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_balance_dirty_pages)(void *, struct bdi_writeback *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long int, long unsigned int); + +typedef void (*btf_trace_writeback_sb_inodes_requeue)(void *, struct inode *); + +typedef void (*btf_trace_writeback_single_inode_start)(void *, struct inode *, struct writeback_control *, long unsigned int); + +typedef void (*btf_trace_writeback_single_inode)(void *, struct inode *, struct writeback_control *, long unsigned int); + +typedef void (*btf_trace_writeback_lazytime)(void *, struct inode *); + +typedef void (*btf_trace_writeback_lazytime_iput)(void *, struct inode *); + +typedef void (*btf_trace_writeback_dirty_inode_enqueue)(void *, struct inode *); + +typedef void (*btf_trace_sb_mark_inode_writeback)(void *, struct inode *); + +typedef void (*btf_trace_sb_clear_inode_writeback)(void *, struct inode *); + +struct inode_switch_wbs_context { + struct rcu_work work; + struct bdi_writeback *new_wb; + struct inode *inodes[0]; +}; + +struct splice_desc { + size_t total_len; + unsigned int len; + unsigned int flags; + union { + void *userptr; + struct file *file; + void *data; + } u; + loff_t pos; + loff_t *opos; + size_t num_spliced; + bool need_wakeup; + long: 32; +}; + +typedef int splice_actor(struct pipe_inode_info *, struct pipe_buffer *, struct splice_desc *); + +typedef int splice_direct_actor(struct pipe_inode_info *, struct splice_desc *); + +struct old_utimbuf32 { + old_time32_t actime; + old_time32_t modtime; +}; + +struct prepend_buffer { + char *buf; + int len; +}; + +typedef int __kernel_daddr_t; + +struct ustat { + __kernel_daddr_t f_tfree; + long unsigned int f_tinode; + char f_fname[6]; + char f_fpack[6]; +}; + +struct statfs { + __u32 f_type; + __u32 f_bsize; + __u32 f_blocks; + __u32 f_bfree; + __u32 f_bavail; + __u32 f_files; + __u32 f_ffree; + __kernel_fsid_t f_fsid; + __u32 f_namelen; + __u32 f_frsize; + __u32 f_flags; + __u32 f_spare[4]; +}; + +struct statfs64 { + __u32 f_type; + __u32 f_bsize; + __u64 f_blocks; + __u64 f_bfree; + __u64 f_bavail; + __u64 f_files; + __u64 f_ffree; + __kernel_fsid_t f_fsid; + __u32 f_namelen; + __u32 f_frsize; + __u32 f_flags; + __u32 f_spare[4]; +}; + +struct ns_get_path_task_args { + const struct proc_ns_operations *ns_ops; + struct task_struct *task; +}; + +enum legacy_fs_param { + LEGACY_FS_UNSET_PARAMS = 0, + LEGACY_FS_MONOLITHIC_PARAMS = 1, + LEGACY_FS_INDIVIDUAL_PARAMS = 2, +}; + +struct legacy_fs_context { + char *legacy_data; + size_t data_size; + enum legacy_fs_param param_type; +}; + +enum fsconfig_command { + FSCONFIG_SET_FLAG = 0, + FSCONFIG_SET_STRING = 1, + FSCONFIG_SET_BINARY = 2, + FSCONFIG_SET_PATH = 3, + FSCONFIG_SET_PATH_EMPTY = 4, + FSCONFIG_SET_FD = 5, + FSCONFIG_CMD_CREATE = 6, + FSCONFIG_CMD_RECONFIGURE = 7, +}; + +struct iomap_ops; + +typedef int get_block_t(struct inode *, sector_t, struct buffer_head *, int); + +typedef __u32 blk_mq_req_flags_t; + +struct dax_device; + +struct iomap_page_ops; + +struct iomap { + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + struct block_device *bdev; + struct dax_device *dax_dev; + void *inline_data; + void *private; + const struct iomap_page_ops *page_ops; + u64 validity_cookie; +}; + +struct iomap_page_ops { + int (*page_prepare)(struct inode *, loff_t, unsigned int); + void (*page_done)(struct inode *, loff_t, unsigned int, struct page *); + bool (*iomap_valid)(struct inode *, const struct iomap *); +}; + +enum hctx_type { + HCTX_TYPE_DEFAULT = 0, + HCTX_TYPE_READ = 1, + HCTX_TYPE_POLL = 2, + HCTX_MAX_TYPES = 3, +}; + +struct decrypt_bh_ctx { + struct work_struct work; + struct buffer_head *bh; +}; + +struct bh_lru { + struct buffer_head *bhs[16]; +}; + +struct bh_accounting { + int nr; + int ratelimit; +}; + +typedef int dio_iodone_t(struct kiocb *, loff_t, ssize_t, void *); + +typedef void dio_submit_t(struct bio *, struct inode *, loff_t); + +enum { + DIO_LOCKING = 1, + DIO_SKIP_HOLES = 2, +}; + +struct dio_submit { + struct bio *bio; + unsigned int blkbits; + unsigned int blkfactor; + unsigned int start_zero_done; + int pages_in_io; + long: 32; + sector_t block_in_file; + unsigned int blocks_available; + int reap_counter; + sector_t final_block_in_request; + int boundary; + get_block_t *get_block; + dio_submit_t *submit_io; + long: 32; + loff_t logical_offset_in_bio; + sector_t final_block_in_bio; + sector_t next_block_for_io; + struct page *cur_page; + unsigned int cur_page_offset; + unsigned int cur_page_len; + long: 32; + sector_t cur_page_block; + loff_t cur_page_fs_offset; + struct iov_iter *iter; + unsigned int head; + unsigned int tail; + size_t from; + size_t to; + long: 32; +}; + +struct dio { + int flags; + blk_opf_t opf; + struct gendisk *bio_disk; + struct inode *inode; + loff_t i_size; + dio_iodone_t *end_io; + void *private; + spinlock_t bio_lock; + int page_errors; + int is_async; + bool defer_completion; + bool should_dirty; + int io_error; + long unsigned int refcount; + struct bio *bio_list; + struct task_struct *waiter; + struct kiocb *iocb; + ssize_t result; + union { + struct page *pages[64]; + struct work_struct complete_work; + }; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bvec_iter_all { + struct bio_vec bv; + int idx; + unsigned int done; +}; + +struct mpage_readpage_args { + struct bio *bio; + struct folio *folio; + unsigned int nr_pages; + bool is_readahead; + sector_t last_block_in_bio; + struct buffer_head map_bh; + long unsigned int first_logical_block; + get_block_t *get_block; +}; + +struct mpage_data { + struct bio *bio; + long: 32; + sector_t last_block_in_bio; + get_block_t *get_block; + long: 32; +}; + +typedef u32 nlink_t; + +typedef int (*proc_write_t)(struct file *, char *, size_t); + +struct proc_dir_entry { + atomic_t in_use; + refcount_t refcnt; + struct list_head pde_openers; + spinlock_t pde_unload_lock; + struct completion *pde_unload_completion; + const struct inode_operations *proc_iops; + union { + const struct proc_ops *proc_ops; + const struct file_operations *proc_dir_ops; + }; + const struct dentry_operations *proc_dops; + union { + const struct seq_operations *seq_ops; + int (*single_show)(struct seq_file *, void *); + }; + proc_write_t write; + void *data; + unsigned int state_size; + unsigned int low_ino; + nlink_t nlink; + kuid_t uid; + kgid_t gid; + long: 32; + loff_t size; + struct proc_dir_entry *parent; + struct rb_root subdir; + struct rb_node subdir_node; + char *name; + umode_t mode; + u8 flags; + u8 namelen; + char inline_name[0]; + long: 32; +}; + +union proc_op { + int (*proc_get_link)(struct dentry *, struct path *); + int (*proc_show)(struct seq_file *, struct pid_namespace *, struct pid *, struct task_struct *); + const char *lsm; +}; + +struct proc_inode { + struct pid *pid; + unsigned int fd; + union proc_op op; + struct proc_dir_entry *pde; + struct ctl_table_header *sysctl; + struct ctl_table *sysctl_entry; + struct hlist_node sibling_inodes; + const struct proc_ns_operations *ns_ops; + long: 32; + struct inode vfs_inode; +}; + +struct proc_fs_opts { + int flag; + const char *str; +}; + +struct fs_error_report { + int error; + struct inode *inode; + struct super_block *sb; +}; + +struct file_handle { + __u32 handle_bytes; + int handle_type; + unsigned char f_handle[0]; +}; + +struct inotify_inode_mark { + struct fsnotify_mark fsn_mark; + int wd; +}; + +struct dnotify_struct { + struct dnotify_struct *dn_next; + __u32 dn_mask; + int dn_fd; + struct file *dn_filp; + fl_owner_t dn_owner; +}; + +struct dnotify_mark { + struct fsnotify_mark fsn_mark; + struct dnotify_struct *dn; +}; + +struct inotify_event_info { + struct fsnotify_event fse; + u32 mask; + int wd; + u32 sync_cookie; + int name_len; + char name[0]; +}; + +struct inotify_event { + __s32 wd; + __u32 mask; + __u32 cookie; + __u32 len; + char name[0]; +}; + +enum { + FAN_EVENT_INIT = 0, + FAN_EVENT_REPORTED = 1, + FAN_EVENT_ANSWERED = 2, + FAN_EVENT_CANCELED = 3, +}; + +struct fanotify_fh { + u8 type; + u8 len; + u8 flags; + u8 pad; + unsigned char buf[0]; +}; + +struct fanotify_info { + u8 dir_fh_totlen; + u8 dir2_fh_totlen; + u8 file_fh_totlen; + u8 name_len; + u8 name2_len; + u8 pad[3]; + unsigned char buf[0]; +}; + +enum fanotify_event_type { + FANOTIFY_EVENT_TYPE_FID = 0, + FANOTIFY_EVENT_TYPE_FID_NAME = 1, + FANOTIFY_EVENT_TYPE_PATH = 2, + FANOTIFY_EVENT_TYPE_PATH_PERM = 3, + FANOTIFY_EVENT_TYPE_OVERFLOW = 4, + FANOTIFY_EVENT_TYPE_FS_ERROR = 5, + __FANOTIFY_EVENT_TYPE_NUM = 6, +}; + +struct fanotify_event { + struct fsnotify_event fse; + struct hlist_node merge_list; + u32 mask; + struct { + unsigned int type: 3; + unsigned int hash: 29; + }; + struct pid *pid; +}; + +struct fanotify_fid_event { + struct fanotify_event fae; + __kernel_fsid_t fsid; + struct { + struct fanotify_fh object_fh; + unsigned char _inline_fh_buf[12]; + }; +}; + +struct fanotify_name_event { + struct fanotify_event fae; + __kernel_fsid_t fsid; + struct fanotify_info info; +}; + +struct fanotify_error_event { + struct fanotify_event fae; + s32 error; + u32 err_count; + __kernel_fsid_t fsid; + struct { + struct fanotify_fh object_fh; + unsigned char _inline_fh_buf[128]; + }; +}; + +struct fanotify_path_event { + struct fanotify_event fae; + struct path path; +}; + +struct fanotify_perm_event { + struct fanotify_event fae; + struct path path; + short unsigned int response; + short unsigned int state; + int fd; +}; + +struct fanotify_event_metadata { + __u32 event_len; + __u8 vers; + __u8 reserved; + __u16 metadata_len; + __u64 mask; + __s32 fd; + __s32 pid; +}; + +struct fanotify_event_info_header { + __u8 info_type; + __u8 pad; + __u16 len; +}; + +struct fanotify_event_info_fid { + struct fanotify_event_info_header hdr; + __kernel_fsid_t fsid; + unsigned char handle[0]; +}; + +struct fanotify_event_info_pidfd { + struct fanotify_event_info_header hdr; + __s32 pidfd; +}; + +struct fanotify_event_info_error { + struct fanotify_event_info_header hdr; + __s32 error; + __u32 error_count; +}; + +struct fanotify_response { + __s32 fd; + __u32 response; +}; + +struct epoll_event { + __poll_t events; + long: 32; + __u64 data; +}; + +struct epoll_filefd { + struct file *file; + int fd; +}; + +struct epitem; + +struct eppoll_entry { + struct eppoll_entry *next; + struct epitem *base; + wait_queue_entry_t wait; + wait_queue_head_t *whead; +}; + +struct eventpoll; + +struct epitem { + union { + struct rb_node rbn; + struct callback_head rcu; + }; + struct list_head rdllink; + struct epitem *next; + struct epoll_filefd ffd; + struct eppoll_entry *pwqlist; + struct eventpoll *ep; + struct hlist_node fllink; + struct wakeup_source *ws; + long: 32; + struct epoll_event event; +}; + +struct eventpoll { + struct mutex mtx; + wait_queue_head_t wq; + wait_queue_head_t poll_wait; + struct list_head rdllist; + rwlock_t lock; + struct rb_root_cached rbr; + struct epitem *ovflist; + struct wakeup_source *ws; + struct user_struct *user; + struct file *file; + u64 gen; + struct hlist_head refs; + unsigned int napi_id; +}; + +struct ep_pqueue { + poll_table pt; + struct epitem *epi; +}; + +struct epitems_head { + struct hlist_head epitems; + struct epitems_head *next; +}; + +struct signalfd_siginfo { + __u32 ssi_signo; + __s32 ssi_errno; + __s32 ssi_code; + __u32 ssi_pid; + __u32 ssi_uid; + __s32 ssi_fd; + __u32 ssi_tid; + __u32 ssi_band; + __u32 ssi_overrun; + __u32 ssi_trapno; + __s32 ssi_status; + __s32 ssi_int; + __u64 ssi_ptr; + __u64 ssi_utime; + __u64 ssi_stime; + __u64 ssi_addr; + __u16 ssi_addr_lsb; + __u16 __pad2; + __s32 ssi_syscall; + __u64 ssi_call_addr; + __u32 ssi_arch; + __u8 __pad[28]; +}; + +struct signalfd_ctx { + sigset_t sigmask; +}; + +struct timerfd_ctx { + union { + struct hrtimer tmr; + struct alarm alarm; + } t; + ktime_t tintv; + ktime_t moffs; + wait_queue_head_t wqh; + long: 32; + u64 ticks; + int clockid; + short unsigned int expired; + short unsigned int settime_flags; + struct callback_head rcu; + struct list_head clist; + spinlock_t cancel_lock; + bool might_cancel; +}; + +struct eventfd_ctx { + struct kref kref; + wait_queue_head_t wqh; + __u64 count; + unsigned int flags; + int id; +}; + +struct userfaultfd_ctx { + wait_queue_head_t fault_pending_wqh; + wait_queue_head_t fault_wqh; + wait_queue_head_t fd_wqh; + wait_queue_head_t event_wqh; + seqcount_spinlock_t refile_seq; + refcount_t refcount; + unsigned int flags; + unsigned int features; + bool released; + atomic_t mmap_changing; + struct mm_struct *mm; +}; + +struct uffd_msg { + __u8 event; + __u8 reserved1; + __u16 reserved2; + __u32 reserved3; + union { + struct { + __u64 flags; + __u64 address; + union { + __u32 ptid; + } feat; + long: 32; + } pagefault; + struct { + __u32 ufd; + } fork; + struct { + __u64 from; + __u64 to; + __u64 len; + } remap; + struct { + __u64 start; + __u64 end; + } remove; + struct { + __u64 reserved1; + __u64 reserved2; + __u64 reserved3; + } reserved; + } arg; +}; + +struct uffdio_api { + __u64 api; + __u64 features; + __u64 ioctls; +}; + +struct uffdio_range { + __u64 start; + __u64 len; +}; + +struct uffdio_register { + struct uffdio_range range; + __u64 mode; + __u64 ioctls; +}; + +struct uffdio_copy { + __u64 dst; + __u64 src; + __u64 len; + __u64 mode; + __s64 copy; +}; + +struct uffdio_zeropage { + struct uffdio_range range; + __u64 mode; + __s64 zeropage; +}; + +struct uffdio_writeprotect { + struct uffdio_range range; + __u64 mode; +}; + +struct uffdio_continue { + struct uffdio_range range; + __u64 mode; + __s64 mapped; +}; + +struct userfaultfd_fork_ctx { + struct userfaultfd_ctx *orig; + struct userfaultfd_ctx *new; + struct list_head list; +}; + +struct userfaultfd_unmap_ctx { + struct userfaultfd_ctx *ctx; + long unsigned int start; + long unsigned int end; + struct list_head list; +}; + +struct userfaultfd_wait_queue { + struct uffd_msg msg; + wait_queue_entry_t wq; + struct userfaultfd_ctx *ctx; + bool waken; +}; + +struct userfaultfd_wake_range { + long unsigned int start; + long unsigned int len; +}; + +struct kioctx; + +struct kioctx_table { + struct callback_head rcu; + unsigned int nr; + struct kioctx *table[0]; +}; + +typedef __kernel_ulong_t aio_context_t; + +enum { + IOCB_CMD_PREAD = 0, + IOCB_CMD_PWRITE = 1, + IOCB_CMD_FSYNC = 2, + IOCB_CMD_FDSYNC = 3, + IOCB_CMD_POLL = 5, + IOCB_CMD_NOOP = 6, + IOCB_CMD_PREADV = 7, + IOCB_CMD_PWRITEV = 8, +}; + +struct io_event { + __u64 data; + __u64 obj; + __s64 res; + __s64 res2; +}; + +struct iocb { + __u64 aio_data; + __u32 aio_key; + __kernel_rwf_t aio_rw_flags; + __u16 aio_lio_opcode; + __s16 aio_reqprio; + __u32 aio_fildes; + __u64 aio_buf; + __u64 aio_nbytes; + __s64 aio_offset; + __u64 aio_reserved2; + __u32 aio_flags; + __u32 aio_resfd; +}; + +typedef int kiocb_cancel_fn(struct kiocb *); + +struct aio_ring { + unsigned int id; + unsigned int nr; + unsigned int head; + unsigned int tail; + unsigned int magic; + unsigned int compat_features; + unsigned int incompat_features; + unsigned int header_length; + struct io_event io_events[0]; +}; + +struct kioctx_cpu; + +struct ctx_rq_wait; + +struct kioctx { + struct percpu_ref users; + atomic_t dead; + struct percpu_ref reqs; + long unsigned int user_id; + struct kioctx_cpu *cpu; + unsigned int req_batch; + unsigned int max_reqs; + unsigned int nr_events; + long unsigned int mmap_base; + long unsigned int mmap_size; + struct page **ring_pages; + long int nr_pages; + struct rcu_work free_rwork; + struct ctx_rq_wait *rq_wait; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct { + atomic_t reqs_available; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + struct { + spinlock_t ctx_lock; + struct list_head active_reqs; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + struct { + struct mutex ring_lock; + wait_queue_head_t wait; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + struct { + unsigned int tail; + unsigned int completed_events; + spinlock_t completion_lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + struct page *internal_pages[8]; + struct file *aio_ring_file; + unsigned int id; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct kioctx_cpu { + unsigned int reqs_available; +}; + +struct ctx_rq_wait { + struct completion comp; + atomic_t count; +}; + +struct fsync_iocb { + struct file *file; + struct work_struct work; + bool datasync; + struct cred *creds; +}; + +struct poll_iocb { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + bool cancelled; + bool work_scheduled; + bool work_need_resched; + struct wait_queue_entry wait; + struct work_struct work; +}; + +struct aio_kiocb { + union { + struct file *ki_filp; + struct kiocb rw; + struct fsync_iocb fsync; + struct poll_iocb poll; + }; + struct kioctx *ki_ctx; + kiocb_cancel_fn *ki_cancel; + struct io_event ki_res; + struct list_head ki_list; + refcount_t ki_refcnt; + struct eventfd_ctx *ki_eventfd; +}; + +struct aio_poll_table { + struct poll_table_struct pt; + struct aio_kiocb *iocb; + bool queued; + int error; +}; + +struct __aio_sigset { + const sigset_t *sigmask; + size_t sigsetsize; +}; + +struct crypto_skcipher; + +struct fscrypt_prepared_key { + struct crypto_skcipher *tfm; +}; + +struct fscrypt_mode; + +struct fscrypt_master_key; + +struct fscrypt_direct_key; + +struct fscrypt_info { + struct fscrypt_prepared_key ci_enc_key; + bool ci_owns_key; + struct fscrypt_mode *ci_mode; + struct inode *ci_inode; + struct fscrypt_master_key *ci_master_key; + struct list_head ci_master_key_link; + struct fscrypt_direct_key *ci_direct_key; + siphash_key_t ci_dirhash_key; + bool ci_dirhash_key_initialized; + union fscrypt_policy ci_policy; + u8 ci_nonce[16]; + u32 ci_hashed_ino; +}; + +struct skcipher_request { + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + struct crypto_async_request base; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + void *__ctx[0]; +}; + +struct crypto_skcipher { + unsigned int reqsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_tfm base; +}; + +struct fscrypt_key_specifier { + __u32 type; + __u32 __reserved; + union { + __u8 __reserved[32]; + __u8 descriptor[8]; + __u8 identifier[16]; + } u; +}; + +struct crypto_shash { + unsigned int descsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_tfm base; +}; + +struct fscrypt_mode { + const char *friendly_name; + const char *cipher_str; + int keysize; + int security_strength; + int ivsize; + int logged_cryptoapi_impl; + int logged_blk_crypto_native; + int logged_blk_crypto_fallback; + enum blk_crypto_mode_num blk_crypto_mode; +}; + +struct fscrypt_hkdf { + struct crypto_shash *hmac_tfm; +}; + +struct fscrypt_master_key_secret { + struct fscrypt_hkdf hkdf; + u32 size; + u8 raw[64]; +}; + +struct fscrypt_master_key { + struct hlist_node mk_node; + struct rw_semaphore mk_sem; + refcount_t mk_active_refs; + refcount_t mk_struct_refs; + struct callback_head mk_rcu_head; + struct fscrypt_master_key_secret mk_secret; + struct fscrypt_key_specifier mk_spec; + struct key *mk_users; + struct list_head mk_decrypted_inodes; + spinlock_t mk_decrypted_inodes_lock; + struct fscrypt_prepared_key mk_direct_keys[11]; + struct fscrypt_prepared_key mk_iv_ino_lblk_64_keys[11]; + struct fscrypt_prepared_key mk_iv_ino_lblk_32_keys[11]; + long: 32; + siphash_key_t mk_ino_hash_key; + bool mk_ino_hash_key_initialized; + long: 32; +}; + +typedef enum { + FS_DECRYPT = 0, + FS_ENCRYPT = 1, +} fscrypt_direction_t; + +union fscrypt_iv { + struct { + __le64 lblk_num; + u8 nonce[16]; + }; + u8 raw[32]; + __le64 dun[4]; +}; + +struct fscrypt_str { + unsigned char *name; + u32 len; +}; + +struct fscrypt_name { + const struct qstr *usr_fname; + struct fscrypt_str disk_name; + u32 hash; + u32 minor_hash; + struct fscrypt_str crypto_buf; + bool is_nokey_name; +}; + +struct fscrypt_nokey_name { + u32 dirhash[2]; + u8 bytes[149]; + u8 sha256[32]; +}; + +struct shash_desc { + struct crypto_shash *tfm; + long: 32; + void *__ctx[0]; +}; + +struct shash_alg { + int (*init)(struct shash_desc *); + int (*update)(struct shash_desc *, const u8 *, unsigned int); + int (*final)(struct shash_desc *, u8 *); + int (*finup)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*digest)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*export)(struct shash_desc *, void *); + int (*import)(struct shash_desc *, const void *); + int (*setkey)(struct crypto_shash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_shash *); + void (*exit_tfm)(struct crypto_shash *); + unsigned int descsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + unsigned int digestsize; + unsigned int statesize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_alg base; +}; + +struct fscrypt_symlink_data { + __le16 len; + char encrypted_path[1]; +} __attribute__((packed)); + +enum key_state { + KEY_IS_UNINSTANTIATED = 0, + KEY_IS_POSITIVE = 1, +}; + +struct fscrypt_keyring { + spinlock_t lock; + struct hlist_head key_hashtable[128]; +}; + +struct fscrypt_provisioning_key_payload { + __u32 type; + __u32 __reserved; + __u8 raw[0]; +}; + +struct fscrypt_add_key_arg { + struct fscrypt_key_specifier key_spec; + __u32 raw_size; + __u32 key_id; + __u32 __reserved[8]; + __u8 raw[0]; +}; + +struct fscrypt_remove_key_arg { + struct fscrypt_key_specifier key_spec; + __u32 removal_status_flags; + __u32 __reserved[5]; +}; + +struct fscrypt_get_key_status_arg { + struct fscrypt_key_specifier key_spec; + __u32 __reserved[6]; + __u32 status; + __u32 status_flags; + __u32 user_count; + __u32 __out_reserved[13]; +}; + +struct fscrypt_dummy_policy { + const union fscrypt_policy *policy; +}; + +struct skcipher_alg { + int (*setkey)(struct crypto_skcipher *, const u8 *, unsigned int); + int (*encrypt)(struct skcipher_request *); + int (*decrypt)(struct skcipher_request *); + int (*init)(struct crypto_skcipher *); + void (*exit)(struct crypto_skcipher *); + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; + unsigned int chunksize; + unsigned int walksize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_alg base; +}; + +struct fscrypt_context_v1 { + u8 version; + u8 contents_encryption_mode; + u8 filenames_encryption_mode; + u8 flags; + u8 master_key_descriptor[8]; + u8 nonce[16]; +}; + +struct fscrypt_context_v2 { + u8 version; + u8 contents_encryption_mode; + u8 filenames_encryption_mode; + u8 flags; + u8 __reserved[4]; + u8 master_key_identifier[16]; + u8 nonce[16]; +}; + +union fscrypt_context { + u8 version; + struct fscrypt_context_v1 v1; + struct fscrypt_context_v2 v2; +}; + +struct crypto_template; + +struct crypto_spawn; + +struct crypto_instance { + struct crypto_alg alg; + struct crypto_template *tmpl; + union { + struct hlist_node list; + struct crypto_spawn *spawns; + }; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + void *__ctx[0]; +}; + +struct crypto_spawn { + struct list_head list; + struct crypto_alg *alg; + union { + struct crypto_instance *inst; + struct crypto_spawn *next; + }; + const struct crypto_type *frontend; + u32 mask; + bool dead; + bool registered; +}; + +struct rtattr; + +struct crypto_template { + struct list_head list; + struct hlist_head instances; + struct module *module; + int (*create)(struct crypto_template *, struct rtattr **); + char name[128]; +}; + +struct user_key_payload { + struct callback_head rcu; + short unsigned int datalen; + long: 32; + char data[0]; +}; + +struct fscrypt_key { + __u32 mode; + __u8 raw[64]; + __u32 size; +}; + +struct fscrypt_direct_key { + struct super_block *dk_sb; + struct hlist_node dk_node; + refcount_t dk_refcount; + const struct fscrypt_mode *dk_mode; + struct fscrypt_prepared_key dk_key; + u8 dk_descriptor[8]; + u8 dk_raw[64]; +}; + +struct fscrypt_get_policy_ex_arg { + __u64 policy_size; + union { + __u8 version; + struct fscrypt_policy_v1 v1; + struct fscrypt_policy_v2 v2; + } policy; +}; + +struct fsverity_hash_alg; + +struct merkle_tree_params { + struct fsverity_hash_alg *hash_alg; + const u8 *hashstate; + unsigned int digest_size; + unsigned int block_size; + unsigned int hashes_per_block; + unsigned int log_blocksize; + unsigned int log_arity; + unsigned int num_levels; + u64 tree_size; + long unsigned int level0_blocks; + long: 32; + u64 level_start[8]; +}; + +struct fsverity_info { + struct merkle_tree_params tree_params; + u8 root_hash[64]; + u8 file_digest[64]; + const struct inode *inode; + long: 32; +}; + +struct fsverity_enable_arg { + __u32 version; + __u32 hash_algorithm; + __u32 block_size; + __u32 salt_size; + __u64 salt_ptr; + __u32 sig_size; + __u32 __reserved1; + __u64 sig_ptr; + __u64 __reserved2[11]; +}; + +struct fsverity_descriptor { + __u8 version; + __u8 hash_algorithm; + __u8 log_blocksize; + __u8 salt_size; + __le32 sig_size; + __le64 data_size; + __u8 root_hash[64]; + __u8 salt[32]; + __u8 __reserved[144]; + __u8 signature[0]; +}; + +struct crypto_ahash; + +struct fsverity_hash_alg { + struct crypto_ahash *tfm; + const char *name; + unsigned int digest_size; + unsigned int block_size; + mempool_t req_pool; + enum hash_algo algo_id; +}; + +struct ahash_request; + +struct crypto_ahash { + int (*init)(struct ahash_request *); + int (*update)(struct ahash_request *); + int (*final)(struct ahash_request *); + int (*finup)(struct ahash_request *); + int (*digest)(struct ahash_request *); + int (*export)(struct ahash_request *, void *); + int (*import)(struct ahash_request *, const void *); + int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); + unsigned int reqsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_tfm base; +}; + +struct ahash_request { + struct crypto_async_request base; + unsigned int nbytes; + struct scatterlist *src; + u8 *result; + void *priv; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + void *__ctx[0]; +}; + +struct hash_alg_common { + unsigned int digestsize; + unsigned int statesize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_alg base; +}; + +struct fsverity_digest { + __u16 digest_algorithm; + __u16 digest_size; + __u8 digest[0]; +}; + +struct fsverity_read_metadata_arg { + __u64 metadata_type; + __u64 offset; + __u64 length; + __u64 buf_ptr; + __u64 __reserved; +}; + +struct fsverity_formatted_digest { + char magic[8]; + __le16 digest_algorithm; + __le16 digest_size; + __u8 digest[0]; +}; + +struct trace_event_raw_locks_get_lock_context { + struct trace_entry ent; + long unsigned int i_ino; + dev_t s_dev; + unsigned char type; + struct file_lock_context *ctx; + char __data[0]; +}; + +struct trace_event_raw_filelock_lock { + struct trace_entry ent; + struct file_lock *fl; + long unsigned int i_ino; + dev_t s_dev; + struct file_lock *fl_blocker; + fl_owner_t fl_owner; + unsigned int fl_pid; + unsigned int fl_flags; + unsigned char fl_type; + loff_t fl_start; + loff_t fl_end; + int ret; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_filelock_lease { + struct trace_entry ent; + struct file_lock *fl; + long unsigned int i_ino; + dev_t s_dev; + struct file_lock *fl_blocker; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + long unsigned int fl_break_time; + long unsigned int fl_downgrade_time; + char __data[0]; +}; + +struct trace_event_raw_generic_add_lease { + struct trace_entry ent; + long unsigned int i_ino; + int wcount; + int rcount; + int icount; + dev_t s_dev; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + char __data[0]; +}; + +struct trace_event_raw_leases_conflict { + struct trace_entry ent; + void *lease; + void *breaker; + unsigned int l_fl_flags; + unsigned int b_fl_flags; + unsigned char l_fl_type; + unsigned char b_fl_type; + bool conflict; + char __data[0]; +}; + +struct trace_event_data_offsets_locks_get_lock_context {}; + +struct trace_event_data_offsets_filelock_lock {}; + +struct trace_event_data_offsets_filelock_lease {}; + +struct trace_event_data_offsets_generic_add_lease {}; + +struct trace_event_data_offsets_leases_conflict {}; + +typedef void (*btf_trace_locks_get_lock_context)(void *, struct inode *, int, struct file_lock_context *); + +typedef void (*btf_trace_posix_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_fcntl_setlk)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_locks_remove_posix)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_flock_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_break_lease_noblock)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_break_lease_block)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_break_lease_unblock)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_generic_delete_lease)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_time_out_leases)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_generic_add_lease)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_leases_conflict)(void *, bool, struct file_lock *, struct file_lock *); + +struct file_lock_list_struct { + spinlock_t lock; + struct hlist_head hlist; +}; + +struct locks_iterator { + int li_cpu; + long: 32; + loff_t li_pos; +}; + +struct elf32_phdr { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +}; + +struct elf_prpsinfo { + char pr_state; + char pr_sname; + char pr_zomb; + char pr_nice; + long unsigned int pr_flag; + __kernel_uid_t pr_uid; + __kernel_gid_t pr_gid; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + char pr_fname[16]; + char pr_psargs[80]; +}; + +struct arch_elf_state {}; + +struct memelfnote { + const char *name; + int type; + unsigned int datasz; + void *data; +}; + +struct elf_thread_core_info { + struct elf_thread_core_info *next; + struct task_struct *task; + struct elf_prstatus prstatus; + struct memelfnote notes[0]; +}; + +struct elf_note_info { + struct elf_thread_core_info *thread; + struct memelfnote psinfo; + struct memelfnote signote; + struct memelfnote auxv; + struct memelfnote files; + siginfo_t csigdata; + size_t size; + int thread_notes; +}; + +struct posix_acl_xattr_entry { + __le16 e_tag; + __le16 e_perm; + __le32 e_id; +}; + +struct posix_acl_xattr_header { + __le32 a_version; +}; + +struct rpc_timer { + struct list_head list; + long unsigned int expires; + struct delayed_work dwork; +}; + +struct rpc_wait_queue { + spinlock_t lock; + struct list_head tasks[4]; + unsigned char maxpriority; + unsigned char priority; + unsigned char nr; + short unsigned int qlen; + struct rpc_timer timer_list; + const char *name; +}; + +struct nfs_seqid_counter { + ktime_t create_time; + int owner_id; + int flags; + u32 counter; + spinlock_t lock; + struct list_head list; + struct rpc_wait_queue wait; +}; + +struct nfs4_stateid_struct { + union { + char data[16]; + struct { + __be32 seqid; + char other[12]; + }; + }; + enum { + NFS4_INVALID_STATEID_TYPE = 0, + NFS4_SPECIAL_STATEID_TYPE = 1, + NFS4_OPEN_STATEID_TYPE = 2, + NFS4_LOCK_STATEID_TYPE = 3, + NFS4_DELEGATION_STATEID_TYPE = 4, + NFS4_LAYOUT_STATEID_TYPE = 5, + NFS4_PNFS_DS_STATEID_TYPE = 6, + NFS4_REVOKED_STATEID_TYPE = 7, + } type; +}; + +typedef struct nfs4_stateid_struct nfs4_stateid; + +struct nfs4_state; + +struct nfs4_lock_state { + struct list_head ls_locks; + struct nfs4_state *ls_state; + long unsigned int ls_flags; + struct nfs_seqid_counter ls_seqid; + nfs4_stateid ls_stateid; + refcount_t ls_count; + fl_owner_t ls_owner; + long: 32; +}; + +struct xdr_netobj { + unsigned int len; + u8 *data; +}; + +struct xdr_buf { + struct kvec head[1]; + struct kvec tail[1]; + struct bio_vec *bvec; + struct page **pages; + unsigned int page_base; + unsigned int page_len; + unsigned int flags; + unsigned int buflen; + unsigned int len; +}; + +struct rpc_rqst; + +struct xdr_stream { + __be32 *p; + struct xdr_buf *buf; + __be32 *end; + struct kvec *iov; + struct kvec scratch; + struct page **page_ptr; + unsigned int nwords; + struct rpc_rqst *rqst; +}; + +struct rpc_xprt; + +struct rpc_task; + +struct rpc_cred; + +struct rpc_rqst { + struct rpc_xprt *rq_xprt; + struct xdr_buf rq_snd_buf; + struct xdr_buf rq_rcv_buf; + struct rpc_task *rq_task; + struct rpc_cred *rq_cred; + __be32 rq_xid; + int rq_cong; + u32 rq_seqno; + int rq_enc_pages_num; + struct page **rq_enc_pages; + void (*rq_release_snd_buf)(struct rpc_rqst *); + union { + struct list_head rq_list; + struct rb_node rq_recv; + }; + struct list_head rq_xmit; + struct list_head rq_xmit2; + void *rq_buffer; + size_t rq_callsize; + void *rq_rbuffer; + size_t rq_rcvsize; + size_t rq_xmit_bytes_sent; + size_t rq_reply_bytes_recvd; + struct xdr_buf rq_private_buf; + long unsigned int rq_majortimeo; + long unsigned int rq_minortimeo; + long unsigned int rq_timeout; + ktime_t rq_rtt; + unsigned int rq_retries; + unsigned int rq_connect_cookie; + atomic_t rq_pin; + u32 rq_bytes_sent; + ktime_t rq_xtime; + int rq_ntrans; + struct list_head rq_bc_list; + long unsigned int rq_bc_pa_state; + struct list_head rq_bc_pa_list; +}; + +typedef void (*kxdreproc_t)(struct rpc_rqst *, struct xdr_stream *, const void *); + +typedef int (*kxdrdproc_t)(struct rpc_rqst *, struct xdr_stream *, void *); + +struct rpc_procinfo; + +struct rpc_message { + const struct rpc_procinfo *rpc_proc; + void *rpc_argp; + void *rpc_resp; + const struct cred *rpc_cred; +}; + +struct rpc_procinfo { + u32 p_proc; + kxdreproc_t p_encode; + kxdrdproc_t p_decode; + unsigned int p_arglen; + unsigned int p_replen; + unsigned int p_timer; + u32 p_statidx; + const char *p_name; +}; + +struct rpc_wait { + struct list_head list; + struct list_head links; + struct list_head timer_list; +}; + +struct rpc_call_ops; + +struct rpc_clnt; + +struct rpc_task { + atomic_t tk_count; + int tk_status; + struct list_head tk_task; + void (*tk_callback)(struct rpc_task *); + void (*tk_action)(struct rpc_task *); + long unsigned int tk_timeout; + long unsigned int tk_runstate; + struct rpc_wait_queue *tk_waitqueue; + union { + struct work_struct tk_work; + struct rpc_wait tk_wait; + } u; + struct rpc_message tk_msg; + void *tk_calldata; + const struct rpc_call_ops *tk_ops; + struct rpc_clnt *tk_client; + struct rpc_xprt *tk_xprt; + struct rpc_cred *tk_op_cred; + struct rpc_rqst *tk_rqstp; + struct workqueue_struct *tk_workqueue; + ktime_t tk_start; + pid_t tk_owner; + int tk_rpc_status; + short unsigned int tk_flags; + short unsigned int tk_timeouts; + short unsigned int tk_pid; + unsigned char tk_priority: 2; + unsigned char tk_garb_retry: 2; + unsigned char tk_cred_retry: 2; + unsigned char tk_rebind_retry: 2; +}; + +struct rpc_call_ops { + void (*rpc_call_prepare)(struct rpc_task *, void *); + void (*rpc_call_done)(struct rpc_task *, void *); + void (*rpc_count_stats)(struct rpc_task *, void *); + void (*rpc_release)(void *); +}; + +struct rpc_iostats; + +struct rpc_pipe_dir_head { + struct list_head pdh_entries; + struct dentry *pdh_dentry; +}; + +struct rpc_rtt { + long unsigned int timeo; + long unsigned int srtt[5]; + long unsigned int sdrtt[5]; + int ntimeouts[5]; +}; + +struct rpc_timeout { + long unsigned int to_initval; + long unsigned int to_maxval; + long unsigned int to_increment; + unsigned int to_retries; + unsigned char to_exponential; +}; + +struct rpc_sysfs_client; + +struct rpc_xprt_switch; + +struct rpc_xprt_iter_ops; + +struct rpc_xprt_iter { + struct rpc_xprt_switch *xpi_xpswitch; + struct rpc_xprt *xpi_cursor; + const struct rpc_xprt_iter_ops *xpi_ops; +}; + +struct rpc_auth; + +struct rpc_stat; + +struct rpc_program; + +struct rpc_clnt { + refcount_t cl_count; + unsigned int cl_clid; + struct list_head cl_clients; + struct list_head cl_tasks; + atomic_t cl_pid; + spinlock_t cl_lock; + struct rpc_xprt *cl_xprt; + const struct rpc_procinfo *cl_procinfo; + u32 cl_prog; + u32 cl_vers; + u32 cl_maxproc; + struct rpc_auth *cl_auth; + struct rpc_stat *cl_stats; + struct rpc_iostats *cl_metrics; + unsigned int cl_softrtry: 1; + unsigned int cl_softerr: 1; + unsigned int cl_discrtry: 1; + unsigned int cl_noretranstimeo: 1; + unsigned int cl_autobind: 1; + unsigned int cl_chatty: 1; + struct rpc_rtt *cl_rtt; + const struct rpc_timeout *cl_timeout; + atomic_t cl_swapper; + int cl_nodelen; + char cl_nodename[65]; + struct rpc_pipe_dir_head cl_pipedir_objects; + struct rpc_clnt *cl_parent; + struct rpc_rtt cl_rtt_default; + struct rpc_timeout cl_timeout_default; + const struct rpc_program *cl_program; + const char *cl_principal; + struct dentry *cl_debugfs; + struct rpc_sysfs_client *cl_sysfs; + union { + struct rpc_xprt_iter cl_xpi; + struct work_struct cl_work; + }; + const struct cred *cl_cred; + unsigned int cl_max_connect; +}; + +struct svc_xprt; + +struct rpc_sysfs_xprt; + +struct rpc_xprt_ops; + +struct svc_serv; + +struct xprt_class; + +struct rpc_xprt { + struct kref kref; + const struct rpc_xprt_ops *ops; + unsigned int id; + const struct rpc_timeout *timeout; + struct __kernel_sockaddr_storage addr; + size_t addrlen; + int prot; + long unsigned int cong; + long unsigned int cwnd; + size_t max_payload; + struct rpc_wait_queue binding; + struct rpc_wait_queue sending; + struct rpc_wait_queue pending; + struct rpc_wait_queue backlog; + struct list_head free; + unsigned int max_reqs; + unsigned int min_reqs; + unsigned int num_reqs; + long unsigned int state; + unsigned char resvport: 1; + unsigned char reuseport: 1; + atomic_t swapper; + unsigned int bind_index; + struct list_head xprt_switch; + long unsigned int bind_timeout; + long unsigned int reestablish_timeout; + unsigned int connect_cookie; + struct work_struct task_cleanup; + struct timer_list timer; + long unsigned int last_used; + long unsigned int idle_timeout; + long unsigned int connect_timeout; + long unsigned int max_reconnect_timeout; + atomic_long_t queuelen; + spinlock_t transport_lock; + spinlock_t reserve_lock; + spinlock_t queue_lock; + u32 xid; + struct rpc_task *snd_task; + struct list_head xmit_queue; + atomic_long_t xmit_queuelen; + struct svc_xprt *bc_xprt; + struct svc_serv *bc_serv; + unsigned int bc_alloc_max; + unsigned int bc_alloc_count; + atomic_t bc_slot_count; + spinlock_t bc_pa_lock; + struct list_head bc_pa_list; + struct rb_root recv_queue; + struct { + long unsigned int bind_count; + long unsigned int connect_count; + long unsigned int connect_start; + long unsigned int connect_time; + long unsigned int sends; + long unsigned int recvs; + long unsigned int bad_xids; + long unsigned int max_slots; + long long unsigned int req_u; + long long unsigned int bklog_u; + long long unsigned int sending_u; + long long unsigned int pending_u; + } stat; + struct net *xprt_net; + netns_tracker ns_tracker; + const char *servername; + const char *address_strings[6]; + struct dentry *debugfs; + struct callback_head rcu; + const struct xprt_class *xprt_class; + struct rpc_sysfs_xprt *xprt_sysfs; + bool main; +}; + +struct rpc_credops; + +struct rpc_cred { + struct hlist_node cr_hash; + struct list_head cr_lru; + struct callback_head cr_rcu; + struct rpc_auth *cr_auth; + const struct rpc_credops *cr_ops; + long unsigned int cr_expire; + long unsigned int cr_flags; + refcount_t cr_count; + const struct cred *cr_cred; +}; + +typedef u32 rpc_authflavor_t; + +struct auth_cred { + const struct cred *cred; + const char *principal; +}; + +struct rpc_cred_cache; + +struct rpc_authops; + +struct rpc_auth { + unsigned int au_cslack; + unsigned int au_rslack; + unsigned int au_verfsize; + unsigned int au_ralign; + long unsigned int au_flags; + const struct rpc_authops *au_ops; + rpc_authflavor_t au_flavor; + refcount_t au_count; + struct rpc_cred_cache *au_credcache; +}; + +struct rpc_credops { + const char *cr_name; + int (*cr_init)(struct rpc_auth *, struct rpc_cred *); + void (*crdestroy)(struct rpc_cred *); + int (*crmatch)(struct auth_cred *, struct rpc_cred *, int); + int (*crmarshal)(struct rpc_task *, struct xdr_stream *); + int (*crrefresh)(struct rpc_task *); + int (*crvalidate)(struct rpc_task *, struct xdr_stream *); + int (*crwrap_req)(struct rpc_task *, struct xdr_stream *); + int (*crunwrap_resp)(struct rpc_task *, struct xdr_stream *); + int (*crkey_timeout)(struct rpc_cred *); + char * (*crstringify_acceptor)(struct rpc_cred *); + bool (*crneed_reencode)(struct rpc_task *); +}; + +struct rpc_auth_create_args; + +struct rpcsec_gss_info; + +struct rpc_authops { + struct module *owner; + rpc_authflavor_t au_flavor; + char *au_name; + struct rpc_auth * (*create)(const struct rpc_auth_create_args *, struct rpc_clnt *); + void (*destroy)(struct rpc_auth *); + int (*hash_cred)(struct auth_cred *, unsigned int); + struct rpc_cred * (*lookup_cred)(struct rpc_auth *, struct auth_cred *, int); + struct rpc_cred * (*crcreate)(struct rpc_auth *, struct auth_cred *, int, gfp_t); + rpc_authflavor_t (*info2flavor)(struct rpcsec_gss_info *); + int (*flavor2info)(rpc_authflavor_t, struct rpcsec_gss_info *); + int (*key_timeout)(struct rpc_auth *, struct rpc_cred *); +}; + +struct rpc_auth_create_args { + rpc_authflavor_t pseudoflavor; + const char *target_name; +}; + +struct rpcsec_gss_oid { + unsigned int len; + u8 data[32]; +}; + +struct rpcsec_gss_info { + struct rpcsec_gss_oid oid; + u32 qop; + u32 service; +}; + +struct rpc_xprt_ops { + void (*set_buffer_size)(struct rpc_xprt *, size_t, size_t); + int (*reserve_xprt)(struct rpc_xprt *, struct rpc_task *); + void (*release_xprt)(struct rpc_xprt *, struct rpc_task *); + void (*alloc_slot)(struct rpc_xprt *, struct rpc_task *); + void (*free_slot)(struct rpc_xprt *, struct rpc_rqst *); + void (*rpcbind)(struct rpc_task *); + void (*set_port)(struct rpc_xprt *, short unsigned int); + void (*connect)(struct rpc_xprt *, struct rpc_task *); + int (*get_srcaddr)(struct rpc_xprt *, char *, size_t); + short unsigned int (*get_srcport)(struct rpc_xprt *); + int (*buf_alloc)(struct rpc_task *); + void (*buf_free)(struct rpc_task *); + int (*prepare_request)(struct rpc_rqst *, struct xdr_buf *); + int (*send_request)(struct rpc_rqst *); + void (*wait_for_reply_request)(struct rpc_task *); + void (*timer)(struct rpc_xprt *, struct rpc_task *); + void (*release_request)(struct rpc_task *); + void (*close)(struct rpc_xprt *); + void (*destroy)(struct rpc_xprt *); + void (*set_connect_timeout)(struct rpc_xprt *, long unsigned int, long unsigned int); + void (*print_stats)(struct rpc_xprt *, struct seq_file *); + int (*enable_swap)(struct rpc_xprt *); + void (*disable_swap)(struct rpc_xprt *); + void (*inject_disconnect)(struct rpc_xprt *); + int (*bc_setup)(struct rpc_xprt *, unsigned int); + size_t (*bc_maxpayload)(struct rpc_xprt *); + unsigned int (*bc_num_slots)(struct rpc_xprt *); + void (*bc_free_rqst)(struct rpc_rqst *); + void (*bc_destroy)(struct rpc_xprt *, unsigned int); +}; + +struct svc_program; + +struct svc_stat; + +struct svc_pool; + +struct svc_serv { + struct svc_program *sv_program; + struct svc_stat *sv_stats; + spinlock_t sv_lock; + struct kref sv_refcnt; + unsigned int sv_nrthreads; + unsigned int sv_maxconn; + unsigned int sv_max_payload; + unsigned int sv_max_mesg; + unsigned int sv_xdrsize; + struct list_head sv_permsocks; + struct list_head sv_tempsocks; + int sv_tmpcnt; + struct timer_list sv_temptimer; + char *sv_name; + unsigned int sv_nrpools; + struct svc_pool *sv_pools; + int (*sv_threadfn)(void *); + struct list_head sv_cb_list; + spinlock_t sv_cb_lock; + wait_queue_head_t sv_cb_waitq; + bool sv_bc_enabled; +}; + +struct xprt_create; + +struct xprt_class { + struct list_head list; + int ident; + struct rpc_xprt * (*setup)(struct xprt_create *); + struct module *owner; + char name[32]; + const char *netid[0]; +}; + +struct xprt_create { + int ident; + struct net *net; + struct sockaddr *srcaddr; + struct sockaddr *dstaddr; + size_t addrlen; + const char *servername; + struct svc_xprt *bc_xprt; + struct rpc_xprt_switch *bc_xps; + unsigned int flags; +}; + +struct rpc_sysfs_xprt_switch; + +struct rpc_xprt_switch { + spinlock_t xps_lock; + struct kref xps_kref; + unsigned int xps_id; + unsigned int xps_nxprts; + unsigned int xps_nactive; + unsigned int xps_nunique_destaddr_xprts; + atomic_long_t xps_queuelen; + struct list_head xps_xprt_list; + struct net *xps_net; + const struct rpc_xprt_iter_ops *xps_iter_ops; + struct rpc_sysfs_xprt_switch *xps_sysfs; + struct callback_head xps_rcu; +}; + +struct rpc_stat { + const struct rpc_program *program; + unsigned int netcnt; + unsigned int netudpcnt; + unsigned int nettcpcnt; + unsigned int nettcpconn; + unsigned int netreconn; + unsigned int rpccnt; + unsigned int rpcretrans; + unsigned int rpcauthrefresh; + unsigned int rpcgarbage; +}; + +struct rpc_version; + +struct rpc_program { + const char *name; + u32 number; + unsigned int nrvers; + const struct rpc_version **version; + struct rpc_stat *stats; + const char *pipe_dir_name; +}; + +struct svc_stat { + struct svc_program *program; + unsigned int netcnt; + unsigned int netudpcnt; + unsigned int nettcpcnt; + unsigned int nettcpconn; + unsigned int rpccnt; + unsigned int rpcbadfmt; + unsigned int rpcbadauth; + unsigned int rpcbadclnt; +}; + +struct svc_version; + +struct svc_rqst; + +struct svc_process_info; + +struct svc_program { + struct svc_program *pg_next; + u32 pg_prog; + unsigned int pg_lovers; + unsigned int pg_hivers; + unsigned int pg_nvers; + const struct svc_version **pg_vers; + char *pg_name; + char *pg_class; + struct svc_stat *pg_stats; + int (*pg_authenticate)(struct svc_rqst *); + __be32 (*pg_init_request)(struct svc_rqst *, const struct svc_program *, struct svc_process_info *); + int (*pg_rpcbind_set)(struct net *, const struct svc_program *, u32, int, short unsigned int, short unsigned int); +}; + +struct rpc_xprt_iter_ops { + void (*xpi_rewind)(struct rpc_xprt_iter *); + struct rpc_xprt * (*xpi_xprt)(struct rpc_xprt_iter *); + struct rpc_xprt * (*xpi_next)(struct rpc_xprt_iter *); +}; + +struct rpc_version { + u32 number; + unsigned int nrprocs; + const struct rpc_procinfo *procs; + unsigned int *counts; +}; + +struct nfs_fh { + short unsigned int size; + unsigned char data[128]; +}; + +enum nfs3_stable_how { + NFS_UNSTABLE = 0, + NFS_DATA_SYNC = 1, + NFS_FILE_SYNC = 2, + NFS_INVALID_STABLE_HOW = 4294967295, +}; + +struct nfs4_label { + uint32_t lfs; + uint32_t pi; + u32 len; + char *label; +}; + +typedef struct { + char data[8]; +} nfs4_verifier; + +enum nfs4_change_attr_type { + NFS4_CHANGE_TYPE_IS_MONOTONIC_INCR = 0, + NFS4_CHANGE_TYPE_IS_VERSION_COUNTER = 1, + NFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS = 2, + NFS4_CHANGE_TYPE_IS_TIME_METADATA = 3, + NFS4_CHANGE_TYPE_IS_UNDEFINED = 4, +}; + +struct gss_api_mech; + +struct gss_ctx { + struct gss_api_mech *mech_type; + void *internal_ctx_id; + unsigned int slack; + unsigned int align; +}; + +struct gss_api_ops; + +struct pf_desc; + +struct gss_api_mech { + struct list_head gm_list; + struct module *gm_owner; + struct rpcsec_gss_oid gm_oid; + char *gm_name; + const struct gss_api_ops *gm_ops; + int gm_pf_num; + struct pf_desc *gm_pfs; + const char *gm_upcall_enctypes; +}; + +struct auth_domain; + +struct pf_desc { + u32 pseudoflavor; + u32 qop; + u32 service; + char *name; + char *auth_domain_name; + struct auth_domain *domain; + bool datatouch; +}; + +struct auth_ops; + +struct auth_domain { + struct kref ref; + struct hlist_node hash; + char *name; + struct auth_ops *flavour; + struct callback_head callback_head; +}; + +struct gss_api_ops { + int (*gss_import_sec_context)(const void *, size_t, struct gss_ctx *, time64_t *, gfp_t); + u32 (*gss_get_mic)(struct gss_ctx *, struct xdr_buf *, struct xdr_netobj *); + u32 (*gss_verify_mic)(struct gss_ctx *, struct xdr_buf *, struct xdr_netobj *); + u32 (*gss_wrap)(struct gss_ctx *, int, struct xdr_buf *, struct page **); + u32 (*gss_unwrap)(struct gss_ctx *, int, int, struct xdr_buf *); + void (*gss_delete_sec_context)(void *); +}; + +struct nfs4_string { + unsigned int len; + char *data; +}; + +struct nfs_fsid { + uint64_t major; + uint64_t minor; +}; + +struct nfs4_threshold { + __u32 bm; + __u32 l_type; + __u64 rd_sz; + __u64 wr_sz; + __u64 rd_io_sz; + __u64 wr_io_sz; +}; + +struct nfs_fattr { + unsigned int valid; + umode_t mode; + __u32 nlink; + kuid_t uid; + kgid_t gid; + dev_t rdev; + __u64 size; + union { + struct { + __u32 blocksize; + __u32 blocks; + } nfs2; + struct { + __u64 used; + } nfs3; + } du; + struct nfs_fsid fsid; + __u64 fileid; + __u64 mounted_on_fileid; + struct timespec64 atime; + struct timespec64 mtime; + struct timespec64 ctime; + __u64 change_attr; + __u64 pre_change_attr; + __u64 pre_size; + struct timespec64 pre_mtime; + struct timespec64 pre_ctime; + long unsigned int time_start; + long unsigned int gencount; + struct nfs4_string *owner_name; + struct nfs4_string *group_name; + struct nfs4_threshold *mdsthreshold; + struct nfs4_label *label; +}; + +struct nfs_fsinfo { + struct nfs_fattr *fattr; + __u32 rtmax; + __u32 rtpref; + __u32 rtmult; + __u32 wtmax; + __u32 wtpref; + __u32 wtmult; + __u32 dtpref; + __u64 maxfilesize; + struct timespec64 time_delta; + __u32 lease_time; + __u32 nlayouttypes; + __u32 layouttype[8]; + __u32 blksize; + __u32 clone_blksize; + enum nfs4_change_attr_type change_attr_type; + __u32 xattr_support; +}; + +struct nfs_fsstat { + struct nfs_fattr *fattr; + long: 32; + __u64 tbytes; + __u64 fbytes; + __u64 abytes; + __u64 tfiles; + __u64 ffiles; + __u64 afiles; +}; + +struct nfs_pathconf { + struct nfs_fattr *fattr; + __u32 max_link; + __u32 max_namelen; +}; + +struct nfs4_change_info { + u32 atomic; + long: 32; + u64 before; + u64 after; +}; + +struct nfs4_slot; + +struct nfs4_sequence_args { + struct nfs4_slot *sa_slot; + u8 sa_cache_this: 1; + u8 sa_privileged: 1; +}; + +struct nfs4_sequence_res { + struct nfs4_slot *sr_slot; + long unsigned int sr_timestamp; + int sr_status; + u32 sr_status_flags; + u32 sr_highest_slotid; + u32 sr_target_highest_slotid; +}; + +struct nfs_open_context; + +struct nfs_lock_context { + refcount_t count; + struct list_head list; + struct nfs_open_context *open_context; + fl_owner_t lockowner; + atomic_t io_count; + struct callback_head callback_head; +}; + +struct nfs_open_context { + struct nfs_lock_context lock_context; + fl_owner_t flock_owner; + struct dentry *dentry; + const struct cred *cred; + struct rpc_cred *ll_cred; + struct nfs4_state *state; + fmode_t mode; + long unsigned int flags; + int error; + struct list_head list; + struct nfs4_threshold *mdsthreshold; + struct callback_head callback_head; +}; + +struct nlm_host; + +struct nfs_iostats; + +struct nfs_auth_info { + unsigned int flavor_len; + rpc_authflavor_t flavors[12]; +}; + +struct fscache_volume; + +struct pnfs_layoutdriver_type; + +struct nfs_client; + +struct nfs_server { + struct nfs_client *nfs_client; + struct list_head client_link; + struct list_head master_link; + struct rpc_clnt *client; + struct rpc_clnt *client_acl; + struct nlm_host *nlm_host; + struct nfs_iostats *io_stats; + atomic_long_t writeback; + unsigned int write_congested; + unsigned int flags; + unsigned int fattr_valid; + unsigned int caps; + unsigned int rsize; + unsigned int rpages; + unsigned int wsize; + unsigned int wpages; + unsigned int wtmult; + unsigned int dtsize; + short unsigned int port; + unsigned int bsize; + unsigned int gxasize; + unsigned int sxasize; + unsigned int lxasize; + unsigned int acregmin; + unsigned int acregmax; + unsigned int acdirmin; + unsigned int acdirmax; + unsigned int namelen; + unsigned int options; + unsigned int clone_blksize; + enum nfs4_change_attr_type change_attr_type; + long: 32; + struct nfs_fsid fsid; + __u64 maxfilesize; + struct timespec64 time_delta; + long unsigned int mount_time; + struct super_block *super; + dev_t s_dev; + struct nfs_auth_info auth_info; + struct fscache_volume *fscache; + char *fscache_uniq; + u32 pnfs_blksize; + u32 attr_bitmask[3]; + u32 attr_bitmask_nl[3]; + u32 exclcreat_bitmask[3]; + u32 cache_consistency_bitmask[3]; + u32 acl_bitmask; + u32 fh_expire_type; + struct pnfs_layoutdriver_type *pnfs_curr_ld; + struct rpc_wait_queue roc_rpcwaitq; + void *pnfs_ld_data; + struct rb_root state_owners; + struct ida openowner_id; + struct ida lockowner_id; + struct list_head state_owners_lru; + struct list_head layouts; + struct list_head delegations; + struct list_head ss_copies; + long unsigned int mig_gen; + long unsigned int mig_status; + void (*destroy)(struct nfs_server *); + atomic_t active; + struct __kernel_sockaddr_storage mountd_address; + size_t mountd_addrlen; + u32 mountd_version; + short unsigned int mountd_port; + short unsigned int mountd_protocol; + struct rpc_wait_queue uoc_rpcwaitq; + unsigned int read_hdrsize; + const struct cred *cred; + bool has_sec_mnt_opts; +}; + +struct nfs_subversion; + +struct idmap; + +struct nfs4_slot_table; + +struct nfs4_session; + +struct nfs_rpc_ops; + +struct nfs4_minor_version_ops; + +struct nfs41_server_owner; + +struct nfs41_server_scope; + +struct nfs41_impl_id; + +struct nfs_client { + refcount_t cl_count; + atomic_t cl_mds_count; + int cl_cons_state; + long unsigned int cl_res_state; + long unsigned int cl_flags; + struct __kernel_sockaddr_storage cl_addr; + size_t cl_addrlen; + char *cl_hostname; + char *cl_acceptor; + struct list_head cl_share_link; + struct list_head cl_superblocks; + struct rpc_clnt *cl_rpcclient; + const struct nfs_rpc_ops *rpc_ops; + int cl_proto; + struct nfs_subversion *cl_nfs_mod; + u32 cl_minorversion; + unsigned int cl_nconnect; + unsigned int cl_max_connect; + const char *cl_principal; + struct list_head cl_ds_clients; + u64 cl_clientid; + nfs4_verifier cl_confirm; + long unsigned int cl_state; + spinlock_t cl_lock; + long unsigned int cl_lease_time; + long unsigned int cl_last_renewal; + struct delayed_work cl_renewd; + struct rpc_wait_queue cl_rpcwaitq; + struct idmap *cl_idmap; + const char *cl_owner_id; + u32 cl_cb_ident; + const struct nfs4_minor_version_ops *cl_mvops; + long unsigned int cl_mig_gen; + struct nfs4_slot_table *cl_slot_tbl; + u32 cl_seqid; + u32 cl_exchange_flags; + struct nfs4_session *cl_session; + bool cl_preserve_clid; + struct nfs41_server_owner *cl_serverowner; + struct nfs41_server_scope *cl_serverscope; + struct nfs41_impl_id *cl_implid; + long unsigned int cl_sp4_flags; + wait_queue_head_t cl_lock_waitq; + char cl_ipaddr[48]; + struct net *cl_net; + struct list_head pending_cb_stateids; + long: 32; +}; + +struct pnfs_layout_segment; + +struct nfs_seqid { + struct nfs_seqid_counter *sequence; + struct list_head list; + struct rpc_task *task; +}; + +struct nfs_write_verifier { + char data[8]; +}; + +struct nfs_writeverf { + struct nfs_write_verifier verifier; + enum nfs3_stable_how committed; +}; + +struct nfs_pgio_args { + struct nfs4_sequence_args seq_args; + struct nfs_fh *fh; + struct nfs_open_context *context; + struct nfs_lock_context *lock_context; + nfs4_stateid stateid; + __u64 offset; + __u32 count; + unsigned int pgbase; + struct page **pages; + union { + unsigned int replen; + struct { + const u32 *bitmask; + u32 bitmask_store[3]; + enum nfs3_stable_how stable; + }; + }; +}; + +struct nfs_pgio_res { + struct nfs4_sequence_res seq_res; + struct nfs_fattr *fattr; + long: 32; + __u64 count; + __u32 op_status; + union { + struct { + unsigned int replen; + int eof; + }; + struct { + struct nfs_writeverf *verf; + const struct nfs_server *server; + }; + }; + long: 32; +}; + +struct nfs_commitargs { + struct nfs4_sequence_args seq_args; + struct nfs_fh *fh; + long: 32; + __u64 offset; + __u32 count; + const u32 *bitmask; +}; + +struct nfs_commitres { + struct nfs4_sequence_res seq_res; + __u32 op_status; + struct nfs_fattr *fattr; + struct nfs_writeverf *verf; + const struct nfs_server *server; +}; + +struct nfs_removeargs { + struct nfs4_sequence_args seq_args; + const struct nfs_fh *fh; + long: 32; + struct qstr name; +}; + +struct nfs_removeres { + struct nfs4_sequence_res seq_res; + struct nfs_server *server; + struct nfs_fattr *dir_attr; + struct nfs4_change_info cinfo; +}; + +struct nfs_renameargs { + struct nfs4_sequence_args seq_args; + const struct nfs_fh *old_dir; + const struct nfs_fh *new_dir; + const struct qstr *old_name; + const struct qstr *new_name; +}; + +struct nfs_renameres { + struct nfs4_sequence_res seq_res; + struct nfs_server *server; + long: 32; + struct nfs4_change_info old_cinfo; + struct nfs_fattr *old_fattr; + long: 32; + struct nfs4_change_info new_cinfo; + struct nfs_fattr *new_fattr; + long: 32; +}; + +struct nfs_entry { + __u64 ino; + __u64 cookie; + const char *name; + unsigned int len; + int eof; + struct nfs_fh *fh; + struct nfs_fattr *fattr; + unsigned char d_type; + struct nfs_server *server; + long: 32; +}; + +struct nfs_readdir_arg { + struct dentry *dentry; + const struct cred *cred; + __be32 *verf; + long: 32; + u64 cookie; + struct page **pages; + unsigned int page_len; + bool plus; + long: 32; +}; + +struct nfs_readdir_res { + __be32 *verf; +}; + +struct nfs4_pathname { + unsigned int ncomponents; + struct nfs4_string components[512]; +}; + +struct nfs4_fs_location { + unsigned int nservers; + struct nfs4_string servers[10]; + struct nfs4_pathname rootpath; +}; + +struct nfs4_fs_locations { + struct nfs_fattr *fattr; + const struct nfs_server *server; + struct nfs4_pathname fs_path; + int nlocations; + struct nfs4_fs_location locations[10]; +}; + +struct nfstime4 { + u64 seconds; + u32 nseconds; + long: 32; +}; + +struct pnfs_commit_ops; + +struct pnfs_ds_commit_info { + struct list_head commits; + unsigned int nwritten; + unsigned int ncommitting; + const struct pnfs_commit_ops *ops; +}; + +struct nfs41_server_owner { + uint64_t minor_id; + uint32_t major_id_sz; + char major_id[1024]; + long: 32; +}; + +struct nfs41_server_scope { + uint32_t server_scope_sz; + char server_scope[1024]; +}; + +struct nfs41_impl_id { + char domain[1025]; + char name[1025]; + long: 32; + struct nfstime4 date; +}; + +struct nfs_page_array { + struct page **pagevec; + unsigned int npages; + struct page *page_array[8]; +}; + +struct nfs_page; + +struct nfs_rw_ops; + +struct nfs_io_completion; + +struct nfs_direct_req; + +struct nfs_pgio_completion_ops; + +struct nfs_pgio_header { + struct inode *inode; + const struct cred *cred; + struct list_head pages; + struct nfs_page *req; + struct nfs_writeverf verf; + fmode_t rw_mode; + struct pnfs_layout_segment *lseg; + loff_t io_start; + const struct rpc_call_ops *mds_ops; + void (*release)(struct nfs_pgio_header *); + const struct nfs_pgio_completion_ops *completion_ops; + const struct nfs_rw_ops *rw_ops; + struct nfs_io_completion *io_completion; + struct nfs_direct_req *dreq; + int pnfs_error; + int error; + unsigned int good_bytes; + long unsigned int flags; + struct rpc_task task; + struct nfs_fattr fattr; + struct nfs_pgio_args args; + struct nfs_pgio_res res; + long unsigned int timestamp; + int (*pgio_done_cb)(struct rpc_task *, struct nfs_pgio_header *); + __u64 mds_offset; + struct nfs_page_array page_array; + struct nfs_client *ds_clp; + u32 ds_commit_idx; + u32 pgio_mirror_idx; + long: 32; +}; + +struct nfs_pgio_completion_ops { + void (*error_cleanup)(struct list_head *, int); + void (*init_hdr)(struct nfs_pgio_header *); + void (*completion)(struct nfs_pgio_header *); + void (*reschedule_io)(struct nfs_pgio_header *); +}; + +struct nfs_mds_commit_info { + atomic_t rpcs_out; + atomic_long_t ncommit; + struct list_head list; +}; + +struct nfs_commit_data; + +struct nfs_commit_info; + +struct nfs_commit_completion_ops { + void (*completion)(struct nfs_commit_data *); + void (*resched_write)(struct nfs_commit_info *, struct nfs_page *); +}; + +struct nfs_commit_data { + struct rpc_task task; + struct inode *inode; + const struct cred *cred; + struct nfs_fattr fattr; + struct nfs_writeverf verf; + struct list_head pages; + struct list_head list; + struct nfs_direct_req *dreq; + struct nfs_commitargs args; + struct nfs_commitres res; + struct nfs_open_context *context; + struct pnfs_layout_segment *lseg; + struct nfs_client *ds_clp; + int ds_commit_index; + loff_t lwb; + const struct rpc_call_ops *mds_ops; + const struct nfs_commit_completion_ops *completion_ops; + int (*commit_done_cb)(struct rpc_task *, struct nfs_commit_data *); + long unsigned int flags; +}; + +struct nfs_commit_info { + struct inode *inode; + struct nfs_mds_commit_info *mds; + struct pnfs_ds_commit_info *ds; + struct nfs_direct_req *dreq; + const struct nfs_commit_completion_ops *completion_ops; +}; + +struct nfs_unlinkdata { + struct nfs_removeargs args; + struct nfs_removeres res; + struct dentry *dentry; + wait_queue_head_t wq; + const struct cred *cred; + long: 32; + struct nfs_fattr dir_attr; + long int timeout; + long: 32; +}; + +struct nfs_renamedata { + struct nfs_renameargs args; + struct nfs_renameres res; + struct rpc_task task; + const struct cred *cred; + struct inode *old_dir; + struct dentry *old_dentry; + long: 32; + struct nfs_fattr old_fattr; + struct inode *new_dir; + struct dentry *new_dentry; + struct nfs_fattr new_fattr; + void (*complete)(struct rpc_task *, struct nfs_renamedata *); + long int timeout; + bool cancelled; + long: 32; +}; + +struct nlmclnt_operations; + +struct nfs_client_initdata; + +struct nfs_access_entry; + +struct nfs_rpc_ops { + u32 version; + const struct dentry_operations *dentry_ops; + const struct inode_operations *dir_inode_ops; + const struct inode_operations *file_inode_ops; + const struct file_operations *file_ops; + const struct nlmclnt_operations *nlmclnt_ops; + int (*getroot)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); + int (*submount)(struct fs_context *, struct nfs_server *); + int (*try_get_tree)(struct fs_context *); + int (*getattr)(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct inode *); + int (*setattr)(struct dentry *, struct nfs_fattr *, struct iattr *); + int (*lookup)(struct inode *, struct dentry *, struct nfs_fh *, struct nfs_fattr *); + int (*lookupp)(struct inode *, struct nfs_fh *, struct nfs_fattr *); + int (*access)(struct inode *, struct nfs_access_entry *, const struct cred *); + int (*readlink)(struct inode *, struct page *, unsigned int, unsigned int); + int (*create)(struct inode *, struct dentry *, struct iattr *, int); + int (*remove)(struct inode *, struct dentry *); + void (*unlink_setup)(struct rpc_message *, struct dentry *, struct inode *); + void (*unlink_rpc_prepare)(struct rpc_task *, struct nfs_unlinkdata *); + int (*unlink_done)(struct rpc_task *, struct inode *); + void (*rename_setup)(struct rpc_message *, struct dentry *, struct dentry *); + void (*rename_rpc_prepare)(struct rpc_task *, struct nfs_renamedata *); + int (*rename_done)(struct rpc_task *, struct inode *, struct inode *); + int (*link)(struct inode *, struct inode *, const struct qstr *); + int (*symlink)(struct inode *, struct dentry *, struct page *, unsigned int, struct iattr *); + int (*mkdir)(struct inode *, struct dentry *, struct iattr *); + int (*rmdir)(struct inode *, const struct qstr *); + int (*readdir)(struct nfs_readdir_arg *, struct nfs_readdir_res *); + int (*mknod)(struct inode *, struct dentry *, struct iattr *, dev_t); + int (*statfs)(struct nfs_server *, struct nfs_fh *, struct nfs_fsstat *); + int (*fsinfo)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); + int (*pathconf)(struct nfs_server *, struct nfs_fh *, struct nfs_pathconf *); + int (*set_capabilities)(struct nfs_server *, struct nfs_fh *); + int (*decode_dirent)(struct xdr_stream *, struct nfs_entry *, bool); + int (*pgio_rpc_prepare)(struct rpc_task *, struct nfs_pgio_header *); + void (*read_setup)(struct nfs_pgio_header *, struct rpc_message *); + int (*read_done)(struct rpc_task *, struct nfs_pgio_header *); + void (*write_setup)(struct nfs_pgio_header *, struct rpc_message *, struct rpc_clnt **); + int (*write_done)(struct rpc_task *, struct nfs_pgio_header *); + void (*commit_setup)(struct nfs_commit_data *, struct rpc_message *, struct rpc_clnt **); + void (*commit_rpc_prepare)(struct rpc_task *, struct nfs_commit_data *); + int (*commit_done)(struct rpc_task *, struct nfs_commit_data *); + int (*lock)(struct file *, int, struct file_lock *); + int (*lock_check_bounds)(const struct file_lock *); + void (*clear_acl_cache)(struct inode *); + void (*close_context)(struct nfs_open_context *, int); + struct inode * (*open_context)(struct inode *, struct nfs_open_context *, int, struct iattr *, int *); + int (*have_delegation)(struct inode *, fmode_t); + struct nfs_client * (*alloc_client)(const struct nfs_client_initdata *); + struct nfs_client * (*init_client)(struct nfs_client *, const struct nfs_client_initdata *); + void (*free_client)(struct nfs_client *); + struct nfs_server * (*create_server)(struct fs_context *); + struct nfs_server * (*clone_server)(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, rpc_authflavor_t); + int (*discover_trunking)(struct nfs_server *, struct nfs_fh *); + void (*enable_swap)(struct inode *); + void (*disable_swap)(struct inode *); +}; + +struct nfs_access_entry { + struct rb_node rb_node; + struct list_head lru; + kuid_t fsuid; + kgid_t fsgid; + struct group_info *group_info; + u64 timestamp; + __u32 mask; + struct callback_head callback_head; + long: 32; +}; + +struct nfs4_state_recovery_ops; + +struct nfs4_state_maintenance_ops; + +struct nfs4_mig_recovery_ops; + +struct nfs4_minor_version_ops { + u32 minor_version; + unsigned int init_caps; + int (*init_client)(struct nfs_client *); + void (*shutdown_client)(struct nfs_client *); + bool (*match_stateid)(const nfs4_stateid *, const nfs4_stateid *); + int (*find_root_sec)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); + void (*free_lock_state)(struct nfs_server *, struct nfs4_lock_state *); + int (*test_and_free_expired)(struct nfs_server *, nfs4_stateid *, const struct cred *); + struct nfs_seqid * (*alloc_seqid)(struct nfs_seqid_counter *, gfp_t); + void (*session_trunk)(struct rpc_clnt *, struct rpc_xprt *, void *); + const struct rpc_call_ops *call_sync_ops; + const struct nfs4_state_recovery_ops *reboot_recovery_ops; + const struct nfs4_state_recovery_ops *nograce_recovery_ops; + const struct nfs4_state_maintenance_ops *state_renewal_ops; + const struct nfs4_mig_recovery_ops *mig_recovery_ops; +}; + +struct nfs4_state_owner; + +struct nfs4_state { + struct list_head open_states; + struct list_head inode_states; + struct list_head lock_states; + struct nfs4_state_owner *owner; + struct inode *inode; + long unsigned int flags; + spinlock_t state_lock; + seqlock_t seqlock; + nfs4_stateid stateid; + nfs4_stateid open_stateid; + unsigned int n_rdonly; + unsigned int n_wronly; + unsigned int n_rdwr; + fmode_t state; + refcount_t count; + wait_queue_head_t waitq; + struct callback_head callback_head; +}; + +struct cache_head { + struct hlist_node cache_list; + time64_t expiry_time; + time64_t last_refresh; + struct kref ref; + long unsigned int flags; +}; + +struct cache_deferred_req; + +struct cache_req { + struct cache_deferred_req * (*defer)(struct cache_req *); + long unsigned int thread_wait; +}; + +struct cache_deferred_req { + struct hlist_node hash; + struct list_head recent; + struct cache_head *item; + void *owner; + void (*revisit)(struct cache_deferred_req *, int); +}; + +struct svc_cred { + kuid_t cr_uid; + kgid_t cr_gid; + struct group_info *cr_group_info; + u32 cr_flavor; + char *cr_raw_principal; + char *cr_principal; + char *cr_targ_princ; + struct gss_api_mech *cr_gss_mech; +}; + +struct auth_ops { + char *name; + struct module *owner; + int flavour; + int (*accept)(struct svc_rqst *); + int (*release)(struct svc_rqst *); + void (*domain_release)(struct auth_domain *); + int (*set_client)(struct svc_rqst *); +}; + +struct svc_cacherep; + +struct svc_procedure; + +struct svc_deferred_req; + +struct svc_rqst { + struct list_head rq_all; + struct callback_head rq_rcu_head; + struct svc_xprt *rq_xprt; + struct __kernel_sockaddr_storage rq_addr; + size_t rq_addrlen; + struct __kernel_sockaddr_storage rq_daddr; + size_t rq_daddrlen; + struct svc_serv *rq_server; + struct svc_pool *rq_pool; + const struct svc_procedure *rq_procinfo; + struct auth_ops *rq_authop; + struct svc_cred rq_cred; + void *rq_xprt_ctxt; + struct svc_deferred_req *rq_deferred; + struct xdr_buf rq_arg; + struct xdr_stream rq_arg_stream; + struct xdr_stream rq_res_stream; + struct page *rq_scratch_page; + struct xdr_buf rq_res; + struct page *rq_pages[260]; + struct page **rq_respages; + struct page **rq_next_page; + struct page **rq_page_end; + struct pagevec rq_pvec; + struct kvec rq_vec[259]; + struct bio_vec rq_bvec[259]; + __be32 rq_xid; + u32 rq_prog; + u32 rq_vers; + u32 rq_proc; + u32 rq_prot; + int rq_cachetype; + long unsigned int rq_flags; + long: 32; + ktime_t rq_qtime; + void *rq_argp; + void *rq_resp; + void *rq_auth_data; + __be32 rq_auth_stat; + int rq_auth_slack; + int rq_reserved; + ktime_t rq_stime; + struct cache_req rq_chandle; + struct auth_domain *rq_client; + struct auth_domain *rq_gssclient; + struct svc_cacherep *rq_cacherep; + struct task_struct *rq_task; + struct net *rq_bc_net; + void **rq_lease_breaker; +}; + +struct svc_pool_stats { + atomic_long_t packets; + long unsigned int sockets_queued; + atomic_long_t threads_woken; + atomic_long_t threads_timedout; +}; + +struct svc_pool { + unsigned int sp_id; + spinlock_t sp_lock; + struct list_head sp_sockets; + unsigned int sp_nrthreads; + struct list_head sp_all_threads; + struct svc_pool_stats sp_stats; + long unsigned int sp_flags; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct svc_procedure { + __be32 (*pc_func)(struct svc_rqst *); + bool (*pc_decode)(struct svc_rqst *, struct xdr_stream *); + bool (*pc_encode)(struct svc_rqst *, struct xdr_stream *); + void (*pc_release)(struct svc_rqst *); + unsigned int pc_argsize; + unsigned int pc_argzero; + unsigned int pc_ressize; + unsigned int pc_cachetype; + unsigned int pc_xdrressize; + const char *pc_name; +}; + +struct svc_deferred_req { + u32 prot; + struct svc_xprt *xprt; + struct __kernel_sockaddr_storage addr; + size_t addrlen; + struct __kernel_sockaddr_storage daddr; + size_t daddrlen; + void *xprt_ctxt; + struct cache_deferred_req handle; + int argslen; + __be32 args[0]; +}; + +struct svc_process_info { + union { + int (*dispatch)(struct svc_rqst *, __be32 *); + struct { + unsigned int lovers; + unsigned int hivers; + } mismatch; + }; +}; + +struct svc_version { + u32 vs_vers; + u32 vs_nproc; + const struct svc_procedure *vs_proc; + unsigned int *vs_count; + u32 vs_xdrsize; + bool vs_hidden; + bool vs_rpcb_optnl; + bool vs_need_cong_ctrl; + int (*vs_dispatch)(struct svc_rqst *, __be32 *); +}; + +struct nfs4_ssc_client_ops; + +struct nfs_ssc_client_ops; + +struct nfs_ssc_client_ops_tbl { + const struct nfs4_ssc_client_ops *ssc_nfs4_ops; + const struct nfs_ssc_client_ops *ssc_nfs_ops; +}; + +struct nfs4_ssc_client_ops { + struct file * (*sco_open)(struct vfsmount *, struct nfs_fh *, nfs4_stateid *); + void (*sco_close)(struct file *); +}; + +struct nfs_ssc_client_ops { + void (*sco_sb_deactive)(struct super_block *); +}; + +struct nfs4_state_recovery_ops { + int owner_flag_bit; + int state_flag_bit; + int (*recover_open)(struct nfs4_state_owner *, struct nfs4_state *); + int (*recover_lock)(struct nfs4_state *, struct file_lock *); + int (*establish_clid)(struct nfs_client *, const struct cred *); + int (*reclaim_complete)(struct nfs_client *, const struct cred *); + int (*detect_trunking)(struct nfs_client *, struct nfs_client **, const struct cred *); +}; + +struct nfs4_state_maintenance_ops { + int (*sched_state_renewal)(struct nfs_client *, const struct cred *, unsigned int); + const struct cred * (*get_state_renewal_cred)(struct nfs_client *); + int (*renew_lease)(struct nfs_client *, const struct cred *); +}; + +struct nfs4_mig_recovery_ops { + int (*get_locations)(struct nfs_server *, struct nfs_fh *, struct nfs4_fs_locations *, struct page *, const struct cred *); + int (*fsid_present)(struct inode *, const struct cred *); +}; + +struct nfs4_state_owner { + struct nfs_server *so_server; + struct list_head so_lru; + long unsigned int so_expires; + struct rb_node so_server_node; + const struct cred *so_cred; + spinlock_t so_lock; + atomic_t so_count; + long unsigned int so_flags; + struct list_head so_states; + long: 32; + struct nfs_seqid_counter so_seqid; + seqcount_spinlock_t so_reclaim_seqcount; + struct mutex so_delegreturn_mutex; +}; + +struct core_name { + char *corename; + int used; + int size; +}; + +struct iomap_iter { + struct inode *inode; + long: 32; + loff_t pos; + u64 len; + s64 processed; + unsigned int flags; + long: 32; + struct iomap iomap; + struct iomap srcmap; + void *private; + long: 32; +}; + +struct trace_event_raw_iomap_readpage_class { + struct trace_entry ent; + dev_t dev; + long: 32; + u64 ino; + int nr_pages; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_iomap_range_class { + struct trace_entry ent; + dev_t dev; + long: 32; + u64 ino; + loff_t size; + loff_t offset; + u64 length; + char __data[0]; +}; + +struct trace_event_raw_iomap_class { + struct trace_entry ent; + dev_t dev; + long: 32; + u64 ino; + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + dev_t bdev; + char __data[0]; +}; + +struct trace_event_raw_iomap_iter { + struct trace_entry ent; + dev_t dev; + long: 32; + u64 ino; + loff_t pos; + u64 length; + unsigned int flags; + const void *ops; + long unsigned int caller; + char __data[0]; + long: 32; +}; + +struct trace_event_data_offsets_iomap_readpage_class {}; + +struct trace_event_data_offsets_iomap_range_class {}; + +struct trace_event_data_offsets_iomap_class {}; + +struct trace_event_data_offsets_iomap_iter {}; + +typedef void (*btf_trace_iomap_readpage)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_readahead)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_writepage)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_release_folio)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_invalidate_folio)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_dio_invalidate_fail)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_iter_dstmap)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_iter_srcmap)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_writepage_map)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_iter)(void *, struct iomap_iter *, const void *, long unsigned int); + +struct iomap_ops { + int (*iomap_begin)(struct inode *, loff_t, loff_t, unsigned int, struct iomap *, struct iomap *); + int (*iomap_end)(struct inode *, loff_t, loff_t, ssize_t, unsigned int, struct iomap *); +}; + +struct folio_iter { + struct folio *folio; + size_t offset; + size_t length; + struct folio *_next; + size_t _seg_count; + int _i; +}; + +enum { + BIOSET_NEED_BVECS = 1, + BIOSET_NEED_RESCUER = 2, + BIOSET_PERCPU_CACHE = 4, +}; + +struct iomap_ioend { + struct list_head io_list; + u16 io_type; + u16 io_flags; + u32 io_folios; + struct inode *io_inode; + size_t io_size; + loff_t io_offset; + sector_t io_sector; + struct bio *io_bio; + long: 32; + struct bio io_inline_bio; +}; + +struct iomap_writepage_ctx; + +struct iomap_writeback_ops { + int (*map_blocks)(struct iomap_writepage_ctx *, struct inode *, loff_t); + int (*prepare_ioend)(struct iomap_ioend *, int); + void (*discard_folio)(struct folio *, loff_t); +}; + +struct iomap_writepage_ctx { + struct iomap iomap; + struct iomap_ioend *ioend; + const struct iomap_writeback_ops *ops; +}; + +typedef int (*list_cmp_func_t)(void *, const struct list_head *, const struct list_head *); + +struct iomap_page { + atomic_t read_bytes_pending; + atomic_t write_bytes_pending; + spinlock_t uptodate_lock; + long unsigned int uptodate[0]; +}; + +struct iomap_readpage_ctx { + struct folio *cur_folio; + bool cur_folio_in_bio; + struct bio *bio; + struct readahead_control *rac; +}; + +struct iomap_dio_ops { + int (*end_io)(struct kiocb *, ssize_t, int, unsigned int); + void (*submit_io)(const struct iomap_iter *, struct bio *, loff_t); + struct bio_set *bio_set; +}; + +struct iomap_dio { + struct kiocb *iocb; + const struct iomap_dio_ops *dops; + loff_t i_size; + loff_t size; + atomic_t ref; + unsigned int flags; + int error; + size_t done_before; + bool wait_for_completion; + union { + struct { + struct iov_iter *iter; + struct task_struct *waiter; + struct bio *poll_bio; + } submit; + struct { + struct work_struct work; + } aio; + }; + long: 32; +}; + +struct iomap_swapfile_info { + struct iomap iomap; + struct swap_info_struct *sis; + long: 32; + uint64_t lowest_ppage; + uint64_t highest_ppage; + long unsigned int nr_pages; + int nr_extents; + struct file *file; + long: 32; +}; + +enum { + QIF_BLIMITS_B = 0, + QIF_SPACE_B = 1, + QIF_ILIMITS_B = 2, + QIF_INODES_B = 3, + QIF_BTIME_B = 4, + QIF_ITIME_B = 5, +}; + +typedef __kernel_uid32_t qid_t; + +enum { + DQF_INFO_DIRTY_B = 17, +}; + +struct dqstats { + long unsigned int stat[8]; + struct percpu_counter counter[8]; +}; + +enum { + _DQUOT_USAGE_ENABLED = 0, + _DQUOT_LIMITS_ENABLED = 1, + _DQUOT_SUSPENDED = 2, + _DQUOT_STATE_FLAGS = 3, +}; + +struct quota_module_name { + int qm_fmt_id; + char *qm_mod_name; +}; + +struct dquot_warn { + struct super_block *w_sb; + struct kqid w_dq_id; + short int w_type; +}; + +struct fs_disk_quota { + __s8 d_version; + __s8 d_flags; + __u16 d_fieldmask; + __u32 d_id; + __u64 d_blk_hardlimit; + __u64 d_blk_softlimit; + __u64 d_ino_hardlimit; + __u64 d_ino_softlimit; + __u64 d_bcount; + __u64 d_icount; + __s32 d_itimer; + __s32 d_btimer; + __u16 d_iwarns; + __u16 d_bwarns; + __s8 d_itimer_hi; + __s8 d_btimer_hi; + __s8 d_rtbtimer_hi; + __s8 d_padding2; + __u64 d_rtb_hardlimit; + __u64 d_rtb_softlimit; + __u64 d_rtbcount; + __s32 d_rtbtimer; + __u16 d_rtbwarns; + __s16 d_padding3; + char d_padding4[8]; +}; + +struct fs_qfilestat { + __u64 qfs_ino; + __u64 qfs_nblks; + __u32 qfs_nextents; + long: 32; +}; + +typedef struct fs_qfilestat fs_qfilestat_t; + +struct fs_quota_stat { + __s8 qs_version; + __u16 qs_flags; + __s8 qs_pad; + fs_qfilestat_t qs_uquota; + fs_qfilestat_t qs_gquota; + __u32 qs_incoredqs; + __s32 qs_btimelimit; + __s32 qs_itimelimit; + __s32 qs_rtbtimelimit; + __u16 qs_bwarnlimit; + __u16 qs_iwarnlimit; + long: 32; +}; + +struct fs_qfilestatv { + __u64 qfs_ino; + __u64 qfs_nblks; + __u32 qfs_nextents; + __u32 qfs_pad; +}; + +struct fs_quota_statv { + __s8 qs_version; + __u8 qs_pad1; + __u16 qs_flags; + __u32 qs_incoredqs; + struct fs_qfilestatv qs_uquota; + struct fs_qfilestatv qs_gquota; + struct fs_qfilestatv qs_pquota; + __s32 qs_btimelimit; + __s32 qs_itimelimit; + __s32 qs_rtbtimelimit; + __u16 qs_bwarnlimit; + __u16 qs_iwarnlimit; + __u16 qs_rtbwarnlimit; + __u16 qs_pad3; + __u32 qs_pad4; + __u64 qs_pad2[7]; +}; + +struct if_dqblk { + __u64 dqb_bhardlimit; + __u64 dqb_bsoftlimit; + __u64 dqb_curspace; + __u64 dqb_ihardlimit; + __u64 dqb_isoftlimit; + __u64 dqb_curinodes; + __u64 dqb_btime; + __u64 dqb_itime; + __u32 dqb_valid; + long: 32; +}; + +struct if_nextdqblk { + __u64 dqb_bhardlimit; + __u64 dqb_bsoftlimit; + __u64 dqb_curspace; + __u64 dqb_ihardlimit; + __u64 dqb_isoftlimit; + __u64 dqb_curinodes; + __u64 dqb_btime; + __u64 dqb_itime; + __u32 dqb_valid; + __u32 dqb_id; +}; + +struct if_dqinfo { + __u64 dqi_bgrace; + __u64 dqi_igrace; + __u32 dqi_flags; + __u32 dqi_valid; +}; + +typedef u32 compat_uint_t; + +typedef u64 compat_u64; + +struct compat_if_dqblk { + compat_u64 dqb_bhardlimit; + compat_u64 dqb_bsoftlimit; + compat_u64 dqb_curspace; + compat_u64 dqb_ihardlimit; + compat_u64 dqb_isoftlimit; + compat_u64 dqb_curinodes; + compat_u64 dqb_btime; + compat_u64 dqb_itime; + compat_uint_t dqb_valid; + long: 32; +}; + +enum { + QUOTA_NL_C_UNSPEC = 0, + QUOTA_NL_C_WARNING = 1, + __QUOTA_NL_C_MAX = 2, +}; + +enum { + QUOTA_NL_A_UNSPEC = 0, + QUOTA_NL_A_QTYPE = 1, + QUOTA_NL_A_EXCESS_ID = 2, + QUOTA_NL_A_WARNING = 3, + QUOTA_NL_A_DEV_MAJOR = 4, + QUOTA_NL_A_DEV_MINOR = 5, + QUOTA_NL_A_CAUSED_ID = 6, + QUOTA_NL_A_PAD = 7, + __QUOTA_NL_A_MAX = 8, +}; + +struct proc_maps_private { + struct inode *inode; + struct task_struct *task; + struct mm_struct *mm; + struct vma_iterator iter; +}; + +struct mem_size_stats { + long unsigned int resident; + long unsigned int shared_clean; + long unsigned int shared_dirty; + long unsigned int private_clean; + long unsigned int private_dirty; + long unsigned int referenced; + long unsigned int anonymous; + long unsigned int lazyfree; + long unsigned int anonymous_thp; + long unsigned int shmem_thp; + long unsigned int file_thp; + long unsigned int swap; + long unsigned int shared_hugetlb; + long unsigned int private_hugetlb; + u64 pss; + u64 pss_anon; + u64 pss_file; + u64 pss_shmem; + u64 pss_dirty; + u64 pss_locked; + u64 swap_pss; +}; + +enum clear_refs_types { + CLEAR_REFS_ALL = 1, + CLEAR_REFS_ANON = 2, + CLEAR_REFS_MAPPED = 3, + CLEAR_REFS_SOFT_DIRTY = 4, + CLEAR_REFS_MM_HIWATER_RSS = 5, + CLEAR_REFS_LAST = 6, +}; + +struct clear_refs_private { + enum clear_refs_types type; +}; + +typedef struct { + u64 pme; +} pagemap_entry_t; + +struct pagemapread { + int pos; + int len; + pagemap_entry_t *buffer; + bool show_pfn; +}; + +struct pde_opener { + struct list_head lh; + struct file *file; + bool closing; + struct completion *c; +}; + +enum { + BIAS = 2147483648, +}; + +struct proc_fs_context { + struct pid_namespace *pid_ns; + unsigned int mask; + enum proc_hidepid hidepid; + int gid; + enum proc_pidonly pidonly; +}; + +enum proc_param { + Opt_gid___2 = 0, + Opt_hidepid = 1, + Opt_subset = 2, +}; + +struct genradix_root; + +struct __genradix { + struct genradix_root *root; +}; + +struct syscall_info { + __u64 sp; + struct seccomp_data data; +}; + +enum resctrl_conf_type { + CDP_NONE = 0, + CDP_CODE = 1, + CDP_DATA = 2, +}; + +typedef struct dentry *instantiate_t(struct dentry *, struct task_struct *, const void *); + +struct pid_entry { + const char *name; + unsigned int len; + umode_t mode; + const struct inode_operations *iop; + const struct file_operations *fop; + union proc_op op; +}; + +struct limit_names { + const char *name; + const char *unit; +}; + +struct map_files_info { + long unsigned int start; + long unsigned int end; + fmode_t mode; +}; + +struct timers_private { + struct pid *pid; + struct task_struct *task; + struct sighand_struct *sighand; + struct pid_namespace *ns; + long unsigned int flags; +}; + +struct tgid_iter { + unsigned int tgid; + struct task_struct *task; +}; + +struct fd_data { + fmode_t mode; + unsigned int fd; +}; + +struct sysctl_alias { + const char *kernel_param; + const char *sysctl_param; +}; + +struct seq_net_private { + struct net *net; + netns_tracker ns_tracker; +}; + +struct bpf_iter_aux_info; + +struct vmcore { + struct list_head list; + long long unsigned int paddr; + long long unsigned int size; + loff_t offset; +}; + +typedef __u64 Elf64_Addr; + +typedef __u16 Elf64_Half; + +typedef __u64 Elf64_Off; + +typedef __u32 Elf64_Word; + +struct elf64_hdr { + unsigned char e_ident[16]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +}; + +typedef struct elf64_hdr Elf64_Ehdr; + +typedef struct elf32_phdr Elf32_Phdr; + +typedef struct elf32_note Elf32_Nhdr; + +struct vmcore_cb { + bool (*pfn_is_ram)(struct vmcore_cb *, long unsigned int); + struct list_head next; +}; + +struct kernfs_global_locks { + struct mutex open_file_mutex[64]; +}; + +struct kernfs_root { + struct kernfs_node *kn; + unsigned int flags; + struct idr ino_idr; + u32 last_id_lowbits; + u32 id_highbits; + struct kernfs_syscall_ops *syscall_ops; + struct list_head supers; + wait_queue_head_t deactivate_waitq; + struct rw_semaphore kernfs_rwsem; +}; + +struct kernfs_iattrs { + kuid_t ia_uid; + kgid_t ia_gid; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct simple_xattrs xattrs; + atomic_t nr_user_xattrs; + atomic_t user_xattr_size; +}; + +struct kernfs_super_info { + struct super_block *sb; + struct kernfs_root *root; + const void *ns; + struct list_head node; +}; + +enum kernfs_node_flag { + KERNFS_ACTIVATED = 16, + KERNFS_NS = 32, + KERNFS_HAS_SEQ_SHOW = 64, + KERNFS_HAS_MMAP = 128, + KERNFS_LOCKDEP = 256, + KERNFS_HIDDEN = 512, + KERNFS_SUICIDAL = 1024, + KERNFS_SUICIDED = 2048, + KERNFS_EMPTY_DIR = 4096, + KERNFS_HAS_RELEASE = 8192, + KERNFS_REMOVING = 16384, +}; + +struct kernfs_open_node { + struct callback_head callback_head; + atomic_t event; + wait_queue_head_t poll; + struct list_head files; + unsigned int nr_mmapped; + unsigned int nr_to_release; +}; + +struct pts_mount_opts { + int setuid; + int setgid; + kuid_t uid; + kgid_t gid; + umode_t mode; + umode_t ptmxmode; + int reserve; + int max; +}; + +enum { + Opt_uid___2 = 0, + Opt_gid___3 = 1, + Opt_mode___2 = 2, + Opt_ptmxmode = 3, + Opt_newinstance = 4, + Opt_max = 5, + Opt_err = 6, +}; + +struct pts_fs_info { + struct ida allocated_ptys; + struct pts_mount_opts mount_opts; + struct super_block *sb; + struct dentry *ptmx_dentry; +}; + +struct ramfs_mount_opts { + umode_t mode; +}; + +struct ramfs_fs_info { + struct ramfs_mount_opts mount_opts; +}; + +enum ramfs_param { + Opt_mode___3 = 0, +}; + +enum hugetlbfs_size_type { + NO_SIZE = 0, + SIZE_STD = 1, + SIZE_PERCENT = 2, +}; + +struct hugetlbfs_fs_context { + struct hstate *hstate; + long: 32; + long long unsigned int max_size_opt; + long long unsigned int min_size_opt; + long int max_hpages; + long int nr_inodes; + long int min_hpages; + enum hugetlbfs_size_type max_val_type; + enum hugetlbfs_size_type min_val_type; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +enum hugetlb_param { + Opt_gid___4 = 0, + Opt_min_size = 1, + Opt_mode___4 = 2, + Opt_nr_inodes___2 = 3, + Opt_pagesize = 4, + Opt_size___2 = 5, + Opt_uid___3 = 6, +}; + +struct getdents_callback___2 { + struct dir_context ctx; + char *name; + long: 32; + u64 ino; + int found; + int sequence; +}; + +typedef u16 wchar_t; + +typedef u32 unicode_t; + +struct nls_table { + const char *charset; + const char *alias; + int (*uni2char)(wchar_t, unsigned char *, int); + int (*char2uni)(const unsigned char *, int, wchar_t *); + const unsigned char *charset2lower; + const unsigned char *charset2upper; + struct module *owner; + struct nls_table *next; +}; + +enum utf16_endian { + UTF16_HOST_ENDIAN = 0, + UTF16_LITTLE_ENDIAN = 1, + UTF16_BIG_ENDIAN = 2, +}; + +struct utf8_table { + int cmask; + int cval; + int shift; + long int lmask; + long int lval; +}; + +struct debugfs_fsdata { + const struct file_operations *real_fops; + refcount_t active_users; + struct completion active_users_drained; +}; + +struct debugfs_mount_opts { + kuid_t uid; + kgid_t gid; + umode_t mode; + unsigned int opts; +}; + +enum { + Opt_uid___4 = 0, + Opt_gid___5 = 1, + Opt_mode___5 = 2, + Opt_err___2 = 3, +}; + +struct debugfs_fs_info { + struct debugfs_mount_opts mount_opts; +}; + +struct debugfs_blob_wrapper { + void *data; + long unsigned int size; +}; + +struct debugfs_reg32 { + char *name; + long unsigned int offset; +}; + +struct debugfs_regset32 { + const struct debugfs_reg32 *regs; + int nregs; + void *base; + struct device *dev; +}; + +struct debugfs_u32_array { + u32 *array; + u32 n_elements; +}; + +struct debugfs_devm_entry { + int (*read)(struct seq_file *, void *); + struct device *dev; +}; + +struct tracefs_dir_ops { + int (*mkdir)(const char *); + int (*rmdir)(const char *); +}; + +struct tracefs_mount_opts { + kuid_t uid; + kgid_t gid; + umode_t mode; + unsigned int opts; +}; + +struct tracefs_fs_info { + struct tracefs_mount_opts mount_opts; +}; + +typedef short unsigned int __kernel_mode_t; + +struct ipc_perm { + __kernel_key_t key; + __kernel_uid_t uid; + __kernel_gid_t gid; + __kernel_uid_t cuid; + __kernel_gid_t cgid; + __kernel_mode_t mode; + short unsigned int seq; +}; + +struct ipc64_perm { + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; + __kernel_mode_t mode; + unsigned char __pad1[2]; + short unsigned int seq; + short unsigned int __pad2; + __kernel_ulong_t __unused1; + __kernel_ulong_t __unused2; +}; + +struct ipc_params { + key_t key; + int flg; + union { + size_t size; + int nsems; + } u; +}; + +struct ipc_ops { + int (*getnew)(struct ipc_namespace *, struct ipc_params *); + int (*associate)(struct kern_ipc_perm *, int); + int (*more_checks)(struct kern_ipc_perm *, struct ipc_params *); +}; + +struct ipc_proc_iface { + const char *path; + const char *header; + int ids; + int (*show)(struct seq_file *, void *); +}; + +struct ipc_proc_iter { + struct ipc_namespace *ns; + struct pid_namespace *pid_ns; + struct ipc_proc_iface *iface; +}; + +struct msg_msgseg; + +struct msg_msg { + struct list_head m_list; + long int m_type; + size_t m_ts; + struct msg_msgseg *next; + void *security; +}; + +struct msg_msgseg { + struct msg_msgseg *next; +}; + +typedef short unsigned int __kernel_ipc_pid_t; + +typedef __kernel_long_t __kernel_old_time_t; + +struct msgbuf { + __kernel_long_t mtype; + char mtext[1]; +}; + +struct msg; + +struct msqid_ds { + struct ipc_perm msg_perm; + struct msg *msg_first; + struct msg *msg_last; + __kernel_old_time_t msg_stime; + __kernel_old_time_t msg_rtime; + __kernel_old_time_t msg_ctime; + long unsigned int msg_lcbytes; + long unsigned int msg_lqbytes; + short unsigned int msg_cbytes; + short unsigned int msg_qnum; + short unsigned int msg_qbytes; + __kernel_ipc_pid_t msg_lspid; + __kernel_ipc_pid_t msg_lrpid; +}; + +struct msqid64_ds { + struct ipc64_perm msg_perm; + long unsigned int msg_stime; + long unsigned int msg_stime_high; + long unsigned int msg_rtime; + long unsigned int msg_rtime_high; + long unsigned int msg_ctime; + long unsigned int msg_ctime_high; + long unsigned int msg_cbytes; + long unsigned int msg_qnum; + long unsigned int msg_qbytes; + __kernel_pid_t msg_lspid; + __kernel_pid_t msg_lrpid; + long unsigned int __unused4; + long unsigned int __unused5; +}; + +struct msginfo { + int msgpool; + int msgmap; + int msgmax; + int msgmnb; + int msgmni; + int msgssz; + int msgtql; + short unsigned int msgseg; +}; + +struct msg_queue { + struct kern_ipc_perm q_perm; + time64_t q_stime; + time64_t q_rtime; + time64_t q_ctime; + long unsigned int q_cbytes; + long unsigned int q_qnum; + long unsigned int q_qbytes; + struct pid *q_lspid; + struct pid *q_lrpid; + struct list_head q_messages; + struct list_head q_receivers; + struct list_head q_senders; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct msg_receiver { + struct list_head r_list; + struct task_struct *r_tsk; + int r_mode; + long int r_msgtype; + long int r_maxsize; + struct msg_msg *r_msg; +}; + +struct msg_sender { + struct list_head list; + struct task_struct *tsk; + size_t msgsz; +}; + +struct sem; + +struct sem_queue; + +struct sem_undo; + +struct semid_ds { + struct ipc_perm sem_perm; + __kernel_old_time_t sem_otime; + __kernel_old_time_t sem_ctime; + struct sem *sem_base; + struct sem_queue *sem_pending; + struct sem_queue **sem_pending_last; + struct sem_undo *undo; + short unsigned int sem_nsems; +}; + +struct sem { + int semval; + struct pid *sempid; + spinlock_t lock; + struct list_head pending_alter; + struct list_head pending_const; + long: 32; + time64_t sem_otime; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct sem_queue { + struct list_head list; + struct task_struct *sleeper; + struct sem_undo *undo; + struct pid *pid; + int status; + struct sembuf *sops; + struct sembuf *blocking; + int nsops; + bool alter; + bool dupsop; +}; + +struct sem_undo { + struct list_head list_proc; + struct callback_head rcu; + struct sem_undo_list *ulp; + struct list_head list_id; + int semid; + short int *semadj; +}; + +struct semid64_ds { + struct ipc64_perm sem_perm; + long unsigned int sem_otime; + long unsigned int sem_otime_high; + long unsigned int sem_ctime; + long unsigned int sem_ctime_high; + long unsigned int sem_nsems; + long unsigned int __unused3; + long unsigned int __unused4; +}; + +struct seminfo { + int semmap; + int semmni; + int semmns; + int semmnu; + int semmsl; + int semopm; + int semume; + int semusz; + int semvmx; + int semaem; +}; + +struct sem_undo_list { + refcount_t refcnt; + spinlock_t lock; + struct list_head list_proc; +}; + +struct sem_array { + struct kern_ipc_perm sem_perm; + time64_t sem_ctime; + struct list_head pending_alter; + struct list_head pending_const; + struct list_head list_id; + int sem_nsems; + int complex_count; + unsigned int use_global_lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct sem sems[0]; +}; + +struct shmid_ds { + struct ipc_perm shm_perm; + int shm_segsz; + __kernel_old_time_t shm_atime; + __kernel_old_time_t shm_dtime; + __kernel_old_time_t shm_ctime; + __kernel_ipc_pid_t shm_cpid; + __kernel_ipc_pid_t shm_lpid; + short unsigned int shm_nattch; + short unsigned int shm_unused; + void *shm_unused2; + void *shm_unused3; +}; + +struct shmid64_ds { + struct ipc64_perm shm_perm; + __kernel_size_t shm_segsz; + long unsigned int shm_atime; + long unsigned int shm_atime_high; + long unsigned int shm_dtime; + long unsigned int shm_dtime_high; + long unsigned int shm_ctime; + long unsigned int shm_ctime_high; + __kernel_pid_t shm_cpid; + __kernel_pid_t shm_lpid; + long unsigned int shm_nattch; + long unsigned int __unused4; + long unsigned int __unused5; +}; + +struct shminfo64 { + long unsigned int shmmax; + long unsigned int shmmin; + long unsigned int shmmni; + long unsigned int shmseg; + long unsigned int shmall; + long unsigned int __unused1; + long unsigned int __unused2; + long unsigned int __unused3; + long unsigned int __unused4; +}; + +struct shminfo { + int shmmax; + int shmmin; + int shmmni; + int shmseg; + int shmall; +}; + +struct shm_info { + int used_ids; + __kernel_ulong_t shm_tot; + __kernel_ulong_t shm_rss; + __kernel_ulong_t shm_swp; + __kernel_ulong_t swap_attempts; + __kernel_ulong_t swap_successes; +}; + +struct shmid_kernel { + struct kern_ipc_perm shm_perm; + struct file *shm_file; + long unsigned int shm_nattch; + long unsigned int shm_segsz; + long: 32; + time64_t shm_atim; + time64_t shm_dtim; + time64_t shm_ctim; + struct pid *shm_cprid; + struct pid *shm_lprid; + struct ucounts *mlock_ucounts; + struct task_struct *shm_creator; + struct list_head shm_clist; + struct ipc_namespace *ns; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct shm_file_data { + int id; + struct ipc_namespace *ns; + struct file *file; + const struct vm_operations_struct *vm_ops; +}; + +struct mqueue_fs_context { + struct ipc_namespace *ipc_ns; + bool newns; +}; + +struct posix_msg_tree_node { + struct rb_node rb_node; + struct list_head msg_list; + int priority; +}; + +struct ext_wait_queue { + struct task_struct *task; + struct list_head list; + struct msg_msg *msg; + int state; +}; + +struct mqueue_inode_info { + spinlock_t lock; + long: 32; + struct inode vfs_inode; + wait_queue_head_t wait_q; + struct rb_root msg_tree; + struct rb_node *msg_tree_rightmost; + struct posix_msg_tree_node *node_cache; + struct mq_attr attr; + struct sigevent notify; + struct pid *notify_owner; + u32 notify_self_exec_id; + struct user_namespace *notify_user_ns; + struct ucounts *ucounts; + struct sock *notify_sock; + struct sk_buff *notify_cookie; + struct ext_wait_queue e_wait_q[2]; + long unsigned int qsize; + long: 32; +}; + +struct key_user { + struct rb_node node; + struct mutex cons_lock; + spinlock_t lock; + refcount_t usage; + atomic_t nkeys; + atomic_t nikeys; + kuid_t uid; + int qnkeys; + int qnbytes; +}; + +enum key_notification_subtype { + NOTIFY_KEY_INSTANTIATED = 0, + NOTIFY_KEY_UPDATED = 1, + NOTIFY_KEY_LINKED = 2, + NOTIFY_KEY_UNLINKED = 3, + NOTIFY_KEY_CLEARED = 4, + NOTIFY_KEY_REVOKED = 5, + NOTIFY_KEY_INVALIDATED = 6, + NOTIFY_KEY_SETATTR = 7, +}; + +struct assoc_array_edit; + +struct assoc_array_ops { + long unsigned int (*get_key_chunk)(const void *, int); + long unsigned int (*get_object_key_chunk)(const void *, int); + bool (*compare_object)(const void *, const void *); + int (*diff_objects)(const void *, const void *); + void (*free_object)(void *); +}; + +struct assoc_array_node { + struct assoc_array_ptr *back_pointer; + u8 parent_slot; + struct assoc_array_ptr *slots[16]; + long unsigned int nr_leaves_on_branch; +}; + +struct assoc_array_shortcut { + struct assoc_array_ptr *back_pointer; + int parent_slot; + int skip_to_level; + struct assoc_array_ptr *next_node; + long unsigned int index_key[0]; +}; + +struct assoc_array_edit { + struct callback_head rcu; + struct assoc_array *array; + const struct assoc_array_ops *ops; + const struct assoc_array_ops *ops_for_excised_subtree; + struct assoc_array_ptr *leaf; + struct assoc_array_ptr **leaf_p; + struct assoc_array_ptr *dead_leaf; + struct assoc_array_ptr *new_meta[3]; + struct assoc_array_ptr *excised_meta[1]; + struct assoc_array_ptr *excised_subtree; + struct assoc_array_ptr **set_backpointers[16]; + struct assoc_array_ptr *set_backpointers_to; + struct assoc_array_node *adjust_count_on; + long int adjust_count_by; + struct { + struct assoc_array_ptr **ptr; + struct assoc_array_ptr *to; + } set[2]; + struct { + u8 *p; + u8 to; + } set_parent_slot[1]; + u8 segment_cache[17]; +}; + +struct keyring_search_context { + struct keyring_index_key index_key; + const struct cred *cred; + struct key_match_data match_data; + unsigned int flags; + int (*iterator)(const void *, void *); + int skipped_ret; + bool possessed; + key_ref_t result; + long: 32; + time64_t now; +}; + +struct keyring_read_iterator_context { + size_t buflen; + size_t count; + key_serial_t *buffer; +}; + +struct keyctl_dh_params { + union { + __s32 private; + __s32 priv; + }; + __s32 prime; + __s32 base; +}; + +struct keyctl_kdf_params { + char *hashname; + char *otherinfo; + __u32 otherinfolen; + __u32 __spare[8]; +}; + +struct keyctl_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; + __u32 __spare[10]; +}; + +struct keyctl_pkey_params { + __s32 key_id; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + __u32 __spare[7]; +}; + +struct request_key_auth { + struct callback_head rcu; + struct key *target_key; + struct key *dest_keyring; + const struct cred *cred; + void *callout_info; + size_t callout_len; + pid_t pid; + char op[8]; +}; + +struct kpp_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + void *__ctx[0]; +}; + +struct crypto_kpp { + unsigned int reqsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_tfm base; +}; + +struct kpp_alg { + int (*set_secret)(struct crypto_kpp *, const void *, unsigned int); + int (*generate_public_key)(struct kpp_request *); + int (*compute_shared_secret)(struct kpp_request *); + unsigned int (*max_size)(struct crypto_kpp *); + int (*init)(struct crypto_kpp *); + void (*exit)(struct crypto_kpp *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_alg base; +}; + +struct dh { + const void *key; + const void *p; + const void *g; + unsigned int key_size; + unsigned int p_size; + unsigned int g_size; +}; + +struct dh_completion { + struct completion completion; + int err; +}; + +enum { + Opt_err___3 = 0, + Opt_enc = 1, + Opt_hash = 2, +}; + +struct vfs_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; +}; + +struct vfs_ns_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; + __le32 rootid; +}; + +struct sctp_association; + +union security_list_options { + int (*binder_set_context_mgr)(const struct cred *); + int (*binder_transaction)(const struct cred *, const struct cred *); + int (*binder_transfer_binder)(const struct cred *, const struct cred *); + int (*binder_transfer_file)(const struct cred *, const struct cred *, struct file *); + int (*ptrace_access_check)(struct task_struct *, unsigned int); + int (*ptrace_traceme)(struct task_struct *); + int (*capget)(struct task_struct *, kernel_cap_t *, kernel_cap_t *, kernel_cap_t *); + int (*capset)(struct cred *, const struct cred *, const kernel_cap_t *, const kernel_cap_t *, const kernel_cap_t *); + int (*capable)(const struct cred *, struct user_namespace *, int, unsigned int); + int (*quotactl)(int, int, int, struct super_block *); + int (*quota_on)(struct dentry *); + int (*syslog)(int); + int (*settime)(const struct timespec64 *, const struct timezone *); + int (*vm_enough_memory)(struct mm_struct *, long int); + int (*bprm_creds_for_exec)(struct linux_binprm *); + int (*bprm_creds_from_file)(struct linux_binprm *, struct file *); + int (*bprm_check_security)(struct linux_binprm *); + void (*bprm_committing_creds)(struct linux_binprm *); + void (*bprm_committed_creds)(struct linux_binprm *); + int (*fs_context_dup)(struct fs_context *, struct fs_context *); + int (*fs_context_parse_param)(struct fs_context *, struct fs_parameter *); + int (*sb_alloc_security)(struct super_block *); + void (*sb_delete)(struct super_block *); + void (*sb_free_security)(struct super_block *); + void (*sb_free_mnt_opts)(void *); + int (*sb_eat_lsm_opts)(char *, void **); + int (*sb_mnt_opts_compat)(struct super_block *, void *); + int (*sb_remount)(struct super_block *, void *); + int (*sb_kern_mount)(struct super_block *); + int (*sb_show_options)(struct seq_file *, struct super_block *); + int (*sb_statfs)(struct dentry *); + int (*sb_mount)(const char *, const struct path *, const char *, long unsigned int, void *); + int (*sb_umount)(struct vfsmount *, int); + int (*sb_pivotroot)(const struct path *, const struct path *); + int (*sb_set_mnt_opts)(struct super_block *, void *, long unsigned int, long unsigned int *); + int (*sb_clone_mnt_opts)(const struct super_block *, struct super_block *, long unsigned int, long unsigned int *); + int (*move_mount)(const struct path *, const struct path *); + int (*dentry_init_security)(struct dentry *, int, const struct qstr *, const char **, void **, u32 *); + int (*dentry_create_files_as)(struct dentry *, int, struct qstr *, const struct cred *, struct cred *); + int (*path_unlink)(const struct path *, struct dentry *); + int (*path_mkdir)(const struct path *, struct dentry *, umode_t); + int (*path_rmdir)(const struct path *, struct dentry *); + int (*path_mknod)(const struct path *, struct dentry *, umode_t, unsigned int); + int (*path_truncate)(const struct path *); + int (*path_symlink)(const struct path *, struct dentry *, const char *); + int (*path_link)(struct dentry *, const struct path *, struct dentry *); + int (*path_rename)(const struct path *, struct dentry *, const struct path *, struct dentry *, unsigned int); + int (*path_chmod)(const struct path *, umode_t); + int (*path_chown)(const struct path *, kuid_t, kgid_t); + int (*path_chroot)(const struct path *); + int (*path_notify)(const struct path *, u64, unsigned int); + int (*inode_alloc_security)(struct inode *); + void (*inode_free_security)(struct inode *); + int (*inode_init_security)(struct inode *, struct inode *, const struct qstr *, const char **, void **, size_t *); + int (*inode_init_security_anon)(struct inode *, const struct qstr *, const struct inode *); + int (*inode_create)(struct inode *, struct dentry *, umode_t); + int (*inode_link)(struct dentry *, struct inode *, struct dentry *); + int (*inode_unlink)(struct inode *, struct dentry *); + int (*inode_symlink)(struct inode *, struct dentry *, const char *); + int (*inode_mkdir)(struct inode *, struct dentry *, umode_t); + int (*inode_rmdir)(struct inode *, struct dentry *); + int (*inode_mknod)(struct inode *, struct dentry *, umode_t, dev_t); + int (*inode_rename)(struct inode *, struct dentry *, struct inode *, struct dentry *); + int (*inode_readlink)(struct dentry *); + int (*inode_follow_link)(struct dentry *, struct inode *, bool); + int (*inode_permission)(struct inode *, int); + int (*inode_setattr)(struct dentry *, struct iattr *); + int (*inode_getattr)(const struct path *); + int (*inode_setxattr)(struct user_namespace *, struct dentry *, const char *, const void *, size_t, int); + void (*inode_post_setxattr)(struct dentry *, const char *, const void *, size_t, int); + int (*inode_getxattr)(struct dentry *, const char *); + int (*inode_listxattr)(struct dentry *); + int (*inode_removexattr)(struct user_namespace *, struct dentry *, const char *); + int (*inode_set_acl)(struct user_namespace *, struct dentry *, const char *, struct posix_acl *); + int (*inode_get_acl)(struct user_namespace *, struct dentry *, const char *); + int (*inode_remove_acl)(struct user_namespace *, struct dentry *, const char *); + int (*inode_need_killpriv)(struct dentry *); + int (*inode_killpriv)(struct user_namespace *, struct dentry *); + int (*inode_getsecurity)(struct user_namespace *, struct inode *, const char *, void **, bool); + int (*inode_setsecurity)(struct inode *, const char *, const void *, size_t, int); + int (*inode_listsecurity)(struct inode *, char *, size_t); + void (*inode_getsecid)(struct inode *, u32 *); + int (*inode_copy_up)(struct dentry *, struct cred **); + int (*inode_copy_up_xattr)(const char *); + int (*kernfs_init_security)(struct kernfs_node *, struct kernfs_node *); + int (*file_permission)(struct file *, int); + int (*file_alloc_security)(struct file *); + void (*file_free_security)(struct file *); + int (*file_ioctl)(struct file *, unsigned int, long unsigned int); + int (*mmap_addr)(long unsigned int); + int (*mmap_file)(struct file *, long unsigned int, long unsigned int, long unsigned int); + int (*file_mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int); + int (*file_lock)(struct file *, unsigned int); + int (*file_fcntl)(struct file *, unsigned int, long unsigned int); + void (*file_set_fowner)(struct file *); + int (*file_send_sigiotask)(struct task_struct *, struct fown_struct *, int); + int (*file_receive)(struct file *); + int (*file_open)(struct file *); + int (*file_truncate)(struct file *); + int (*task_alloc)(struct task_struct *, long unsigned int); + void (*task_free)(struct task_struct *); + int (*cred_alloc_blank)(struct cred *, gfp_t); + void (*cred_free)(struct cred *); + int (*cred_prepare)(struct cred *, const struct cred *, gfp_t); + void (*cred_transfer)(struct cred *, const struct cred *); + void (*cred_getsecid)(const struct cred *, u32 *); + int (*kernel_act_as)(struct cred *, u32); + int (*kernel_create_files_as)(struct cred *, struct inode *); + int (*kernel_module_request)(char *); + int (*kernel_load_data)(enum kernel_load_data_id, bool); + int (*kernel_post_load_data)(char *, loff_t, enum kernel_load_data_id, char *); + int (*kernel_read_file)(struct file *, enum kernel_read_file_id, bool); + int (*kernel_post_read_file)(struct file *, char *, loff_t, enum kernel_read_file_id); + int (*task_fix_setuid)(struct cred *, const struct cred *, int); + int (*task_fix_setgid)(struct cred *, const struct cred *, int); + int (*task_fix_setgroups)(struct cred *, const struct cred *); + int (*task_setpgid)(struct task_struct *, pid_t); + int (*task_getpgid)(struct task_struct *); + int (*task_getsid)(struct task_struct *); + void (*current_getsecid_subj)(u32 *); + void (*task_getsecid_obj)(struct task_struct *, u32 *); + int (*task_setnice)(struct task_struct *, int); + int (*task_setioprio)(struct task_struct *, int); + int (*task_getioprio)(struct task_struct *); + int (*task_prlimit)(const struct cred *, const struct cred *, unsigned int); + int (*task_setrlimit)(struct task_struct *, unsigned int, struct rlimit *); + int (*task_setscheduler)(struct task_struct *); + int (*task_getscheduler)(struct task_struct *); + int (*task_movememory)(struct task_struct *); + int (*task_kill)(struct task_struct *, struct kernel_siginfo *, int, const struct cred *); + int (*task_prctl)(int, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + void (*task_to_inode)(struct task_struct *, struct inode *); + int (*userns_create)(const struct cred *); + int (*ipc_permission)(struct kern_ipc_perm *, short int); + void (*ipc_getsecid)(struct kern_ipc_perm *, u32 *); + int (*msg_msg_alloc_security)(struct msg_msg *); + void (*msg_msg_free_security)(struct msg_msg *); + int (*msg_queue_alloc_security)(struct kern_ipc_perm *); + void (*msg_queue_free_security)(struct kern_ipc_perm *); + int (*msg_queue_associate)(struct kern_ipc_perm *, int); + int (*msg_queue_msgctl)(struct kern_ipc_perm *, int); + int (*msg_queue_msgsnd)(struct kern_ipc_perm *, struct msg_msg *, int); + int (*msg_queue_msgrcv)(struct kern_ipc_perm *, struct msg_msg *, struct task_struct *, long int, int); + int (*shm_alloc_security)(struct kern_ipc_perm *); + void (*shm_free_security)(struct kern_ipc_perm *); + int (*shm_associate)(struct kern_ipc_perm *, int); + int (*shm_shmctl)(struct kern_ipc_perm *, int); + int (*shm_shmat)(struct kern_ipc_perm *, char *, int); + int (*sem_alloc_security)(struct kern_ipc_perm *); + void (*sem_free_security)(struct kern_ipc_perm *); + int (*sem_associate)(struct kern_ipc_perm *, int); + int (*sem_semctl)(struct kern_ipc_perm *, int); + int (*sem_semop)(struct kern_ipc_perm *, struct sembuf *, unsigned int, int); + int (*netlink_send)(struct sock *, struct sk_buff *); + void (*d_instantiate)(struct dentry *, struct inode *); + int (*getprocattr)(struct task_struct *, const char *, char **); + int (*setprocattr)(const char *, void *, size_t); + int (*ismaclabel)(const char *); + int (*secid_to_secctx)(u32, char **, u32 *); + int (*secctx_to_secid)(const char *, u32, u32 *); + void (*release_secctx)(char *, u32); + void (*inode_invalidate_secctx)(struct inode *); + int (*inode_notifysecctx)(struct inode *, void *, u32); + int (*inode_setsecctx)(struct dentry *, void *, u32); + int (*inode_getsecctx)(struct inode *, void **, u32 *); + int (*unix_stream_connect)(struct sock *, struct sock *, struct sock *); + int (*unix_may_send)(struct socket *, struct socket *); + int (*socket_create)(int, int, int, int); + int (*socket_post_create)(struct socket *, int, int, int, int); + int (*socket_socketpair)(struct socket *, struct socket *); + int (*socket_bind)(struct socket *, struct sockaddr *, int); + int (*socket_connect)(struct socket *, struct sockaddr *, int); + int (*socket_listen)(struct socket *, int); + int (*socket_accept)(struct socket *, struct socket *); + int (*socket_sendmsg)(struct socket *, struct msghdr *, int); + int (*socket_recvmsg)(struct socket *, struct msghdr *, int, int); + int (*socket_getsockname)(struct socket *); + int (*socket_getpeername)(struct socket *); + int (*socket_getsockopt)(struct socket *, int, int); + int (*socket_setsockopt)(struct socket *, int, int); + int (*socket_shutdown)(struct socket *, int); + int (*socket_sock_rcv_skb)(struct sock *, struct sk_buff *); + int (*socket_getpeersec_stream)(struct socket *, sockptr_t, sockptr_t, unsigned int); + int (*socket_getpeersec_dgram)(struct socket *, struct sk_buff *, u32 *); + int (*sk_alloc_security)(struct sock *, int, gfp_t); + void (*sk_free_security)(struct sock *); + void (*sk_clone_security)(const struct sock *, struct sock *); + void (*sk_getsecid)(struct sock *, u32 *); + void (*sock_graft)(struct sock *, struct socket *); + int (*inet_conn_request)(const struct sock *, struct sk_buff *, struct request_sock *); + void (*inet_csk_clone)(struct sock *, const struct request_sock *); + void (*inet_conn_established)(struct sock *, struct sk_buff *); + int (*secmark_relabel_packet)(u32); + void (*secmark_refcount_inc)(); + void (*secmark_refcount_dec)(); + void (*req_classify_flow)(const struct request_sock *, struct flowi_common *); + int (*tun_dev_alloc_security)(void **); + void (*tun_dev_free_security)(void *); + int (*tun_dev_create)(); + int (*tun_dev_attach_queue)(void *); + int (*tun_dev_attach)(struct sock *, void *); + int (*tun_dev_open)(void *); + int (*sctp_assoc_request)(struct sctp_association *, struct sk_buff *); + int (*sctp_bind_connect)(struct sock *, int, struct sockaddr *, int); + void (*sctp_sk_clone)(struct sctp_association *, struct sock *, struct sock *); + int (*sctp_assoc_established)(struct sctp_association *, struct sk_buff *); + int (*xfrm_policy_alloc_security)(struct xfrm_sec_ctx **, struct xfrm_user_sec_ctx *, gfp_t); + int (*xfrm_policy_clone_security)(struct xfrm_sec_ctx *, struct xfrm_sec_ctx **); + void (*xfrm_policy_free_security)(struct xfrm_sec_ctx *); + int (*xfrm_policy_delete_security)(struct xfrm_sec_ctx *); + int (*xfrm_state_alloc)(struct xfrm_state *, struct xfrm_user_sec_ctx *); + int (*xfrm_state_alloc_acquire)(struct xfrm_state *, struct xfrm_sec_ctx *, u32); + void (*xfrm_state_free_security)(struct xfrm_state *); + int (*xfrm_state_delete_security)(struct xfrm_state *); + int (*xfrm_policy_lookup)(struct xfrm_sec_ctx *, u32); + int (*xfrm_state_pol_flow_match)(struct xfrm_state *, struct xfrm_policy *, const struct flowi_common *); + int (*xfrm_decode_session)(struct sk_buff *, u32 *, int); + int (*key_alloc)(struct key *, const struct cred *, long unsigned int); + void (*key_free)(struct key *); + int (*key_permission)(key_ref_t, const struct cred *, enum key_need_perm); + int (*key_getsecurity)(struct key *, char **); + int (*audit_rule_init)(u32, u32, char *, void **); + int (*audit_rule_known)(struct audit_krule *); + int (*audit_rule_match)(u32, u32, u32, void *); + void (*audit_rule_free)(void *); + int (*bpf)(int, union bpf_attr *, unsigned int); + int (*bpf_map)(struct bpf_map *, fmode_t); + int (*bpf_prog)(struct bpf_prog *); + int (*bpf_map_alloc_security)(struct bpf_map *); + void (*bpf_map_free_security)(struct bpf_map *); + int (*bpf_prog_alloc_security)(struct bpf_prog_aux *); + void (*bpf_prog_free_security)(struct bpf_prog_aux *); + int (*locked_down)(enum lockdown_reason); + int (*perf_event_open)(struct perf_event_attr *, int); + int (*perf_event_alloc)(struct perf_event *); + void (*perf_event_free)(struct perf_event *); + int (*perf_event_read)(struct perf_event *); + int (*perf_event_write)(struct perf_event *); + int (*uring_override_creds)(const struct cred *); + int (*uring_sqpoll)(); + int (*uring_cmd)(struct io_uring_cmd *); +}; + +struct security_hook_heads { + struct hlist_head binder_set_context_mgr; + struct hlist_head binder_transaction; + struct hlist_head binder_transfer_binder; + struct hlist_head binder_transfer_file; + struct hlist_head ptrace_access_check; + struct hlist_head ptrace_traceme; + struct hlist_head capget; + struct hlist_head capset; + struct hlist_head capable; + struct hlist_head quotactl; + struct hlist_head quota_on; + struct hlist_head syslog; + struct hlist_head settime; + struct hlist_head vm_enough_memory; + struct hlist_head bprm_creds_for_exec; + struct hlist_head bprm_creds_from_file; + struct hlist_head bprm_check_security; + struct hlist_head bprm_committing_creds; + struct hlist_head bprm_committed_creds; + struct hlist_head fs_context_dup; + struct hlist_head fs_context_parse_param; + struct hlist_head sb_alloc_security; + struct hlist_head sb_delete; + struct hlist_head sb_free_security; + struct hlist_head sb_free_mnt_opts; + struct hlist_head sb_eat_lsm_opts; + struct hlist_head sb_mnt_opts_compat; + struct hlist_head sb_remount; + struct hlist_head sb_kern_mount; + struct hlist_head sb_show_options; + struct hlist_head sb_statfs; + struct hlist_head sb_mount; + struct hlist_head sb_umount; + struct hlist_head sb_pivotroot; + struct hlist_head sb_set_mnt_opts; + struct hlist_head sb_clone_mnt_opts; + struct hlist_head move_mount; + struct hlist_head dentry_init_security; + struct hlist_head dentry_create_files_as; + struct hlist_head path_unlink; + struct hlist_head path_mkdir; + struct hlist_head path_rmdir; + struct hlist_head path_mknod; + struct hlist_head path_truncate; + struct hlist_head path_symlink; + struct hlist_head path_link; + struct hlist_head path_rename; + struct hlist_head path_chmod; + struct hlist_head path_chown; + struct hlist_head path_chroot; + struct hlist_head path_notify; + struct hlist_head inode_alloc_security; + struct hlist_head inode_free_security; + struct hlist_head inode_init_security; + struct hlist_head inode_init_security_anon; + struct hlist_head inode_create; + struct hlist_head inode_link; + struct hlist_head inode_unlink; + struct hlist_head inode_symlink; + struct hlist_head inode_mkdir; + struct hlist_head inode_rmdir; + struct hlist_head inode_mknod; + struct hlist_head inode_rename; + struct hlist_head inode_readlink; + struct hlist_head inode_follow_link; + struct hlist_head inode_permission; + struct hlist_head inode_setattr; + struct hlist_head inode_getattr; + struct hlist_head inode_setxattr; + struct hlist_head inode_post_setxattr; + struct hlist_head inode_getxattr; + struct hlist_head inode_listxattr; + struct hlist_head inode_removexattr; + struct hlist_head inode_set_acl; + struct hlist_head inode_get_acl; + struct hlist_head inode_remove_acl; + struct hlist_head inode_need_killpriv; + struct hlist_head inode_killpriv; + struct hlist_head inode_getsecurity; + struct hlist_head inode_setsecurity; + struct hlist_head inode_listsecurity; + struct hlist_head inode_getsecid; + struct hlist_head inode_copy_up; + struct hlist_head inode_copy_up_xattr; + struct hlist_head kernfs_init_security; + struct hlist_head file_permission; + struct hlist_head file_alloc_security; + struct hlist_head file_free_security; + struct hlist_head file_ioctl; + struct hlist_head mmap_addr; + struct hlist_head mmap_file; + struct hlist_head file_mprotect; + struct hlist_head file_lock; + struct hlist_head file_fcntl; + struct hlist_head file_set_fowner; + struct hlist_head file_send_sigiotask; + struct hlist_head file_receive; + struct hlist_head file_open; + struct hlist_head file_truncate; + struct hlist_head task_alloc; + struct hlist_head task_free; + struct hlist_head cred_alloc_blank; + struct hlist_head cred_free; + struct hlist_head cred_prepare; + struct hlist_head cred_transfer; + struct hlist_head cred_getsecid; + struct hlist_head kernel_act_as; + struct hlist_head kernel_create_files_as; + struct hlist_head kernel_module_request; + struct hlist_head kernel_load_data; + struct hlist_head kernel_post_load_data; + struct hlist_head kernel_read_file; + struct hlist_head kernel_post_read_file; + struct hlist_head task_fix_setuid; + struct hlist_head task_fix_setgid; + struct hlist_head task_fix_setgroups; + struct hlist_head task_setpgid; + struct hlist_head task_getpgid; + struct hlist_head task_getsid; + struct hlist_head current_getsecid_subj; + struct hlist_head task_getsecid_obj; + struct hlist_head task_setnice; + struct hlist_head task_setioprio; + struct hlist_head task_getioprio; + struct hlist_head task_prlimit; + struct hlist_head task_setrlimit; + struct hlist_head task_setscheduler; + struct hlist_head task_getscheduler; + struct hlist_head task_movememory; + struct hlist_head task_kill; + struct hlist_head task_prctl; + struct hlist_head task_to_inode; + struct hlist_head userns_create; + struct hlist_head ipc_permission; + struct hlist_head ipc_getsecid; + struct hlist_head msg_msg_alloc_security; + struct hlist_head msg_msg_free_security; + struct hlist_head msg_queue_alloc_security; + struct hlist_head msg_queue_free_security; + struct hlist_head msg_queue_associate; + struct hlist_head msg_queue_msgctl; + struct hlist_head msg_queue_msgsnd; + struct hlist_head msg_queue_msgrcv; + struct hlist_head shm_alloc_security; + struct hlist_head shm_free_security; + struct hlist_head shm_associate; + struct hlist_head shm_shmctl; + struct hlist_head shm_shmat; + struct hlist_head sem_alloc_security; + struct hlist_head sem_free_security; + struct hlist_head sem_associate; + struct hlist_head sem_semctl; + struct hlist_head sem_semop; + struct hlist_head netlink_send; + struct hlist_head d_instantiate; + struct hlist_head getprocattr; + struct hlist_head setprocattr; + struct hlist_head ismaclabel; + struct hlist_head secid_to_secctx; + struct hlist_head secctx_to_secid; + struct hlist_head release_secctx; + struct hlist_head inode_invalidate_secctx; + struct hlist_head inode_notifysecctx; + struct hlist_head inode_setsecctx; + struct hlist_head inode_getsecctx; + struct hlist_head unix_stream_connect; + struct hlist_head unix_may_send; + struct hlist_head socket_create; + struct hlist_head socket_post_create; + struct hlist_head socket_socketpair; + struct hlist_head socket_bind; + struct hlist_head socket_connect; + struct hlist_head socket_listen; + struct hlist_head socket_accept; + struct hlist_head socket_sendmsg; + struct hlist_head socket_recvmsg; + struct hlist_head socket_getsockname; + struct hlist_head socket_getpeername; + struct hlist_head socket_getsockopt; + struct hlist_head socket_setsockopt; + struct hlist_head socket_shutdown; + struct hlist_head socket_sock_rcv_skb; + struct hlist_head socket_getpeersec_stream; + struct hlist_head socket_getpeersec_dgram; + struct hlist_head sk_alloc_security; + struct hlist_head sk_free_security; + struct hlist_head sk_clone_security; + struct hlist_head sk_getsecid; + struct hlist_head sock_graft; + struct hlist_head inet_conn_request; + struct hlist_head inet_csk_clone; + struct hlist_head inet_conn_established; + struct hlist_head secmark_relabel_packet; + struct hlist_head secmark_refcount_inc; + struct hlist_head secmark_refcount_dec; + struct hlist_head req_classify_flow; + struct hlist_head tun_dev_alloc_security; + struct hlist_head tun_dev_free_security; + struct hlist_head tun_dev_create; + struct hlist_head tun_dev_attach_queue; + struct hlist_head tun_dev_attach; + struct hlist_head tun_dev_open; + struct hlist_head sctp_assoc_request; + struct hlist_head sctp_bind_connect; + struct hlist_head sctp_sk_clone; + struct hlist_head sctp_assoc_established; + struct hlist_head xfrm_policy_alloc_security; + struct hlist_head xfrm_policy_clone_security; + struct hlist_head xfrm_policy_free_security; + struct hlist_head xfrm_policy_delete_security; + struct hlist_head xfrm_state_alloc; + struct hlist_head xfrm_state_alloc_acquire; + struct hlist_head xfrm_state_free_security; + struct hlist_head xfrm_state_delete_security; + struct hlist_head xfrm_policy_lookup; + struct hlist_head xfrm_state_pol_flow_match; + struct hlist_head xfrm_decode_session; + struct hlist_head key_alloc; + struct hlist_head key_free; + struct hlist_head key_permission; + struct hlist_head key_getsecurity; + struct hlist_head audit_rule_init; + struct hlist_head audit_rule_known; + struct hlist_head audit_rule_match; + struct hlist_head audit_rule_free; + struct hlist_head bpf; + struct hlist_head bpf_map; + struct hlist_head bpf_prog; + struct hlist_head bpf_map_alloc_security; + struct hlist_head bpf_map_free_security; + struct hlist_head bpf_prog_alloc_security; + struct hlist_head bpf_prog_free_security; + struct hlist_head locked_down; + struct hlist_head perf_event_open; + struct hlist_head perf_event_alloc; + struct hlist_head perf_event_free; + struct hlist_head perf_event_read; + struct hlist_head perf_event_write; + struct hlist_head uring_override_creds; + struct hlist_head uring_sqpoll; + struct hlist_head uring_cmd; +}; + +struct security_hook_list { + struct hlist_node list; + struct hlist_head *head; + union security_list_options hook; + const char *lsm; +}; + +enum lsm_order { + LSM_ORDER_FIRST = 4294967295, + LSM_ORDER_MUTABLE = 0, +}; + +struct lsm_info { + const char *name; + enum lsm_order order; + long unsigned int flags; + int *enabled; + int (*init)(); + struct lsm_blob_sizes *blobs; +}; + +enum lsm_event { + LSM_POLICY_CHANGE = 0, +}; + +struct ethhdr { + unsigned char h_dest[6]; + unsigned char h_source[6]; + __be16 h_proto; +}; + +struct ethtool_drvinfo { + __u32 cmd; + char driver[32]; + char version[32]; + char fw_version[32]; + char bus_info[32]; + char erom_version[32]; + char reserved2[12]; + __u32 n_priv_flags; + __u32 n_stats; + __u32 testinfo_len; + __u32 eedump_len; + __u32 regdump_len; +}; + +struct ethtool_regs { + __u32 cmd; + __u32 version; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_eee { + __u32 cmd; + __u32 supported; + __u32 advertised; + __u32 lp_advertised; + __u32 eee_active; + __u32 eee_enabled; + __u32 tx_lpi_enabled; + __u32 tx_lpi_timer; + __u32 reserved[2]; +}; + +struct ethtool_coalesce { + __u32 cmd; + __u32 rx_coalesce_usecs; + __u32 rx_max_coalesced_frames; + __u32 rx_coalesce_usecs_irq; + __u32 rx_max_coalesced_frames_irq; + __u32 tx_coalesce_usecs; + __u32 tx_max_coalesced_frames; + __u32 tx_coalesce_usecs_irq; + __u32 tx_max_coalesced_frames_irq; + __u32 stats_block_coalesce_usecs; + __u32 use_adaptive_rx_coalesce; + __u32 use_adaptive_tx_coalesce; + __u32 pkt_rate_low; + __u32 rx_coalesce_usecs_low; + __u32 rx_max_coalesced_frames_low; + __u32 tx_coalesce_usecs_low; + __u32 tx_max_coalesced_frames_low; + __u32 pkt_rate_high; + __u32 rx_coalesce_usecs_high; + __u32 rx_max_coalesced_frames_high; + __u32 tx_coalesce_usecs_high; + __u32 tx_max_coalesced_frames_high; + __u32 rate_sample_interval; +}; + +struct ethtool_ringparam { + __u32 cmd; + __u32 rx_max_pending; + __u32 rx_mini_max_pending; + __u32 rx_jumbo_max_pending; + __u32 tx_max_pending; + __u32 rx_pending; + __u32 rx_mini_pending; + __u32 rx_jumbo_pending; + __u32 tx_pending; +}; + +struct ethtool_channels { + __u32 cmd; + __u32 max_rx; + __u32 max_tx; + __u32 max_other; + __u32 max_combined; + __u32 rx_count; + __u32 tx_count; + __u32 other_count; + __u32 combined_count; +}; + +struct ethtool_pauseparam { + __u32 cmd; + __u32 autoneg; + __u32 rx_pause; + __u32 tx_pause; +}; + +enum ethtool_link_ext_state { + ETHTOOL_LINK_EXT_STATE_AUTONEG = 0, + ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = 1, + ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = 2, + ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = 3, + ETHTOOL_LINK_EXT_STATE_NO_CABLE = 4, + ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = 5, + ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = 6, + ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = 7, + ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = 8, + ETHTOOL_LINK_EXT_STATE_OVERHEAT = 9, + ETHTOOL_LINK_EXT_STATE_MODULE = 10, +}; + +enum ethtool_link_ext_substate_autoneg { + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = 2, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = 3, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = 4, + ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = 5, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = 6, +}; + +enum ethtool_link_ext_substate_link_training { + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = 4, +}; + +enum ethtool_link_ext_substate_link_logical_mismatch { + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = 4, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = 5, +}; + +enum ethtool_link_ext_substate_bad_signal_integrity { + ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 2, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST = 3, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS = 4, +}; + +enum ethtool_link_ext_substate_cable_issue { + ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1, + ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 2, +}; + +enum ethtool_link_ext_substate_module { + ETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY = 1, +}; + +enum ethtool_mac_stats_src { + ETHTOOL_MAC_STATS_SRC_AGGREGATE = 0, + ETHTOOL_MAC_STATS_SRC_EMAC = 1, + ETHTOOL_MAC_STATS_SRC_PMAC = 2, +}; + +enum ethtool_module_power_mode_policy { + ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH = 1, + ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO = 2, +}; + +enum ethtool_module_power_mode { + ETHTOOL_MODULE_POWER_MODE_LOW = 1, + ETHTOOL_MODULE_POWER_MODE_HIGH = 2, +}; + +enum ethtool_mm_verify_status { + ETHTOOL_MM_VERIFY_STATUS_UNKNOWN = 0, + ETHTOOL_MM_VERIFY_STATUS_INITIAL = 1, + ETHTOOL_MM_VERIFY_STATUS_VERIFYING = 2, + ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED = 3, + ETHTOOL_MM_VERIFY_STATUS_FAILED = 4, + ETHTOOL_MM_VERIFY_STATUS_DISABLED = 5, +}; + +struct ethtool_test { + __u32 cmd; + __u32 flags; + __u32 reserved; + __u32 len; + __u64 data[0]; +}; + +struct ethtool_tcpip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be16 psrc; + __be16 pdst; + __u8 tos; +}; + +struct ethtool_ah_espip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 spi; + __u8 tos; +}; + +struct ethtool_usrip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 l4_4_bytes; + __u8 tos; + __u8 ip_ver; + __u8 proto; +}; + +struct ethtool_tcpip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be16 psrc; + __be16 pdst; + __u8 tclass; +}; + +struct ethtool_ah_espip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 spi; + __u8 tclass; +}; + +struct ethtool_usrip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 l4_4_bytes; + __u8 tclass; + __u8 l4_proto; +}; + +union ethtool_flow_union { + struct ethtool_tcpip4_spec tcp_ip4_spec; + struct ethtool_tcpip4_spec udp_ip4_spec; + struct ethtool_tcpip4_spec sctp_ip4_spec; + struct ethtool_ah_espip4_spec ah_ip4_spec; + struct ethtool_ah_espip4_spec esp_ip4_spec; + struct ethtool_usrip4_spec usr_ip4_spec; + struct ethtool_tcpip6_spec tcp_ip6_spec; + struct ethtool_tcpip6_spec udp_ip6_spec; + struct ethtool_tcpip6_spec sctp_ip6_spec; + struct ethtool_ah_espip6_spec ah_ip6_spec; + struct ethtool_ah_espip6_spec esp_ip6_spec; + struct ethtool_usrip6_spec usr_ip6_spec; + struct ethhdr ether_spec; + __u8 hdata[52]; +}; + +struct ethtool_flow_ext { + __u8 padding[2]; + unsigned char h_dest[6]; + __be16 vlan_etype; + __be16 vlan_tci; + __be32 data[2]; +}; + +struct ethtool_rx_flow_spec { + __u32 flow_type; + union ethtool_flow_union h_u; + struct ethtool_flow_ext h_ext; + union ethtool_flow_union m_u; + struct ethtool_flow_ext m_ext; + long: 32; + __u64 ring_cookie; + __u32 location; + long: 32; +}; + +struct ethtool_rxnfc { + __u32 cmd; + __u32 flow_type; + __u64 data; + struct ethtool_rx_flow_spec fs; + union { + __u32 rule_cnt; + __u32 rss_context; + }; + __u32 rule_locs[0]; + long: 32; +}; + +struct ethtool_flash { + __u32 cmd; + __u32 region; + char data[128]; +}; + +struct ethtool_dump { + __u32 cmd; + __u32 version; + __u32 flag; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_fecparam { + __u32 cmd; + __u32 active_fec; + __u32 fec; + __u32 reserved; +}; + +struct ethtool_link_settings { + __u32 cmd; + __u32 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 autoneg; + __u8 mdio_support; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __s8 link_mode_masks_nwords; + __u8 transceiver; + __u8 master_slave_cfg; + __u8 master_slave_state; + __u8 rate_matching; + __u32 reserved[7]; + __u32 link_mode_masks[0]; +}; + +struct kernel_ethtool_ringparam { + u32 rx_buf_len; + u8 tcp_data_split; + u8 tx_push; + u32 cqe_size; +}; + +struct ethtool_link_ext_state_info { + enum ethtool_link_ext_state link_ext_state; + union { + enum ethtool_link_ext_substate_autoneg autoneg; + enum ethtool_link_ext_substate_link_training link_training; + enum ethtool_link_ext_substate_link_logical_mismatch link_logical_mismatch; + enum ethtool_link_ext_substate_bad_signal_integrity bad_signal_integrity; + enum ethtool_link_ext_substate_cable_issue cable_issue; + enum ethtool_link_ext_substate_module module; + u32 __link_ext_substate; + }; +}; + +struct ethtool_link_ext_stats { + u64 link_down_events; +}; + +struct ethtool_link_ksettings { + struct ethtool_link_settings base; + struct { + long unsigned int supported[4]; + long unsigned int advertising[4]; + long unsigned int lp_advertising[4]; + } link_modes; + u32 lanes; +}; + +struct kernel_ethtool_coalesce { + u8 use_cqe_mode_tx; + u8 use_cqe_mode_rx; + u32 tx_aggr_max_bytes; + u32 tx_aggr_max_frames; + u32 tx_aggr_time_usecs; +}; + +struct ethtool_eth_mac_stats { + enum ethtool_mac_stats_src src; + long: 32; + union { + struct { + u64 FramesTransmittedOK; + u64 SingleCollisionFrames; + u64 MultipleCollisionFrames; + u64 FramesReceivedOK; + u64 FrameCheckSequenceErrors; + u64 AlignmentErrors; + u64 OctetsTransmittedOK; + u64 FramesWithDeferredXmissions; + u64 LateCollisions; + u64 FramesAbortedDueToXSColls; + u64 FramesLostDueToIntMACXmitError; + u64 CarrierSenseErrors; + u64 OctetsReceivedOK; + u64 FramesLostDueToIntMACRcvError; + u64 MulticastFramesXmittedOK; + u64 BroadcastFramesXmittedOK; + u64 FramesWithExcessiveDeferral; + u64 MulticastFramesReceivedOK; + u64 BroadcastFramesReceivedOK; + u64 InRangeLengthErrors; + u64 OutOfRangeLengthField; + u64 FrameTooLongErrors; + }; + struct { + u64 FramesTransmittedOK; + u64 SingleCollisionFrames; + u64 MultipleCollisionFrames; + u64 FramesReceivedOK; + u64 FrameCheckSequenceErrors; + u64 AlignmentErrors; + u64 OctetsTransmittedOK; + u64 FramesWithDeferredXmissions; + u64 LateCollisions; + u64 FramesAbortedDueToXSColls; + u64 FramesLostDueToIntMACXmitError; + u64 CarrierSenseErrors; + u64 OctetsReceivedOK; + u64 FramesLostDueToIntMACRcvError; + u64 MulticastFramesXmittedOK; + u64 BroadcastFramesXmittedOK; + u64 FramesWithExcessiveDeferral; + u64 MulticastFramesReceivedOK; + u64 BroadcastFramesReceivedOK; + u64 InRangeLengthErrors; + u64 OutOfRangeLengthField; + u64 FrameTooLongErrors; + } stats; + }; +}; + +struct ethtool_eth_phy_stats { + enum ethtool_mac_stats_src src; + long: 32; + union { + struct { + u64 SymbolErrorDuringCarrier; + }; + struct { + u64 SymbolErrorDuringCarrier; + } stats; + }; +}; + +struct ethtool_eth_ctrl_stats { + enum ethtool_mac_stats_src src; + long: 32; + union { + struct { + u64 MACControlFramesTransmitted; + u64 MACControlFramesReceived; + u64 UnsupportedOpcodesReceived; + }; + struct { + u64 MACControlFramesTransmitted; + u64 MACControlFramesReceived; + u64 UnsupportedOpcodesReceived; + } stats; + }; +}; + +struct ethtool_pause_stats { + enum ethtool_mac_stats_src src; + long: 32; + union { + struct { + u64 tx_pause_frames; + u64 rx_pause_frames; + }; + struct { + u64 tx_pause_frames; + u64 rx_pause_frames; + } stats; + }; +}; + +struct ethtool_fec_stat { + u64 total; + u64 lanes[8]; +}; + +struct ethtool_fec_stats { + struct ethtool_fec_stat corrected_blocks; + struct ethtool_fec_stat uncorrectable_blocks; + struct ethtool_fec_stat corrected_bits; +}; + +struct ethtool_rmon_hist_range { + u16 low; + u16 high; +}; + +struct ethtool_rmon_stats { + enum ethtool_mac_stats_src src; + long: 32; + union { + struct { + u64 undersize_pkts; + u64 oversize_pkts; + u64 fragments; + u64 jabbers; + u64 hist[10]; + u64 hist_tx[10]; + }; + struct { + u64 undersize_pkts; + u64 oversize_pkts; + u64 fragments; + u64 jabbers; + u64 hist[10]; + u64 hist_tx[10]; + } stats; + }; +}; + +struct ethtool_module_eeprom { + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; + u8 *data; +}; + +struct ethtool_module_power_mode_params { + enum ethtool_module_power_mode_policy policy; + enum ethtool_module_power_mode mode; +}; + +struct ethtool_mm_state { + u32 verify_time; + u32 max_verify_time; + enum ethtool_mm_verify_status verify_status; + bool tx_enabled; + bool tx_active; + bool pmac_enabled; + bool verify_enabled; + u32 tx_min_frag_size; + u32 rx_min_frag_size; +}; + +struct ethtool_mm_cfg { + u32 verify_time; + bool verify_enabled; + bool tx_enabled; + bool pmac_enabled; + u32 tx_min_frag_size; +}; + +struct ethtool_mm_stats { + u64 MACMergeFrameAssErrorCount; + u64 MACMergeFrameSmdErrorCount; + u64 MACMergeFrameAssOkCount; + u64 MACMergeFragCountRx; + u64 MACMergeFragCountTx; + u64 MACMergeHoldCount; +}; + +enum ib_uverbs_write_cmds { + IB_USER_VERBS_CMD_GET_CONTEXT = 0, + IB_USER_VERBS_CMD_QUERY_DEVICE = 1, + IB_USER_VERBS_CMD_QUERY_PORT = 2, + IB_USER_VERBS_CMD_ALLOC_PD = 3, + IB_USER_VERBS_CMD_DEALLOC_PD = 4, + IB_USER_VERBS_CMD_CREATE_AH = 5, + IB_USER_VERBS_CMD_MODIFY_AH = 6, + IB_USER_VERBS_CMD_QUERY_AH = 7, + IB_USER_VERBS_CMD_DESTROY_AH = 8, + IB_USER_VERBS_CMD_REG_MR = 9, + IB_USER_VERBS_CMD_REG_SMR = 10, + IB_USER_VERBS_CMD_REREG_MR = 11, + IB_USER_VERBS_CMD_QUERY_MR = 12, + IB_USER_VERBS_CMD_DEREG_MR = 13, + IB_USER_VERBS_CMD_ALLOC_MW = 14, + IB_USER_VERBS_CMD_BIND_MW = 15, + IB_USER_VERBS_CMD_DEALLOC_MW = 16, + IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL = 17, + IB_USER_VERBS_CMD_CREATE_CQ = 18, + IB_USER_VERBS_CMD_RESIZE_CQ = 19, + IB_USER_VERBS_CMD_DESTROY_CQ = 20, + IB_USER_VERBS_CMD_POLL_CQ = 21, + IB_USER_VERBS_CMD_PEEK_CQ = 22, + IB_USER_VERBS_CMD_REQ_NOTIFY_CQ = 23, + IB_USER_VERBS_CMD_CREATE_QP = 24, + IB_USER_VERBS_CMD_QUERY_QP = 25, + IB_USER_VERBS_CMD_MODIFY_QP = 26, + IB_USER_VERBS_CMD_DESTROY_QP = 27, + IB_USER_VERBS_CMD_POST_SEND = 28, + IB_USER_VERBS_CMD_POST_RECV = 29, + IB_USER_VERBS_CMD_ATTACH_MCAST = 30, + IB_USER_VERBS_CMD_DETACH_MCAST = 31, + IB_USER_VERBS_CMD_CREATE_SRQ = 32, + IB_USER_VERBS_CMD_MODIFY_SRQ = 33, + IB_USER_VERBS_CMD_QUERY_SRQ = 34, + IB_USER_VERBS_CMD_DESTROY_SRQ = 35, + IB_USER_VERBS_CMD_POST_SRQ_RECV = 36, + IB_USER_VERBS_CMD_OPEN_XRCD = 37, + IB_USER_VERBS_CMD_CLOSE_XRCD = 38, + IB_USER_VERBS_CMD_CREATE_XSRQ = 39, + IB_USER_VERBS_CMD_OPEN_QP = 40, +}; + +enum ib_uverbs_wc_opcode { + IB_UVERBS_WC_SEND = 0, + IB_UVERBS_WC_RDMA_WRITE = 1, + IB_UVERBS_WC_RDMA_READ = 2, + IB_UVERBS_WC_COMP_SWAP = 3, + IB_UVERBS_WC_FETCH_ADD = 4, + IB_UVERBS_WC_BIND_MW = 5, + IB_UVERBS_WC_LOCAL_INV = 6, + IB_UVERBS_WC_TSO = 7, + IB_UVERBS_WC_FLUSH = 8, + IB_UVERBS_WC_ATOMIC_WRITE = 9, +}; + +enum ib_uverbs_create_qp_mask { + IB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1, +}; + +enum ib_uverbs_wr_opcode { + IB_UVERBS_WR_RDMA_WRITE = 0, + IB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1, + IB_UVERBS_WR_SEND = 2, + IB_UVERBS_WR_SEND_WITH_IMM = 3, + IB_UVERBS_WR_RDMA_READ = 4, + IB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5, + IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6, + IB_UVERBS_WR_LOCAL_INV = 7, + IB_UVERBS_WR_BIND_MW = 8, + IB_UVERBS_WR_SEND_WITH_INV = 9, + IB_UVERBS_WR_TSO = 10, + IB_UVERBS_WR_RDMA_READ_WITH_INV = 11, + IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, + IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, + IB_UVERBS_WR_FLUSH = 14, + IB_UVERBS_WR_ATOMIC_WRITE = 15, +}; + +enum ib_uverbs_device_cap_flags { + IB_UVERBS_DEVICE_RESIZE_MAX_WR = 1, + IB_UVERBS_DEVICE_BAD_PKEY_CNTR = 2, + IB_UVERBS_DEVICE_BAD_QKEY_CNTR = 4, + IB_UVERBS_DEVICE_RAW_MULTI = 8, + IB_UVERBS_DEVICE_AUTO_PATH_MIG = 16, + IB_UVERBS_DEVICE_CHANGE_PHY_PORT = 32, + IB_UVERBS_DEVICE_UD_AV_PORT_ENFORCE = 64, + IB_UVERBS_DEVICE_CURR_QP_STATE_MOD = 128, + IB_UVERBS_DEVICE_SHUTDOWN_PORT = 256, + IB_UVERBS_DEVICE_PORT_ACTIVE_EVENT = 1024, + IB_UVERBS_DEVICE_SYS_IMAGE_GUID = 2048, + IB_UVERBS_DEVICE_RC_RNR_NAK_GEN = 4096, + IB_UVERBS_DEVICE_SRQ_RESIZE = 8192, + IB_UVERBS_DEVICE_N_NOTIFY_CQ = 16384, + IB_UVERBS_DEVICE_MEM_WINDOW = 131072, + IB_UVERBS_DEVICE_UD_IP_CSUM = 262144, + IB_UVERBS_DEVICE_XRC = 1048576, + IB_UVERBS_DEVICE_MEM_MGT_EXTENSIONS = 2097152, + IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2A = 8388608, + IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2B = 16777216, + IB_UVERBS_DEVICE_RC_IP_CSUM = 33554432, + IB_UVERBS_DEVICE_RAW_IP_CSUM = 67108864, + IB_UVERBS_DEVICE_MANAGED_FLOW_STEERING = 536870912, + IB_UVERBS_DEVICE_RAW_SCATTER_FCS = 0, + IB_UVERBS_DEVICE_PCI_WRITE_END_PADDING = 0, + IB_UVERBS_DEVICE_FLUSH_GLOBAL = 0, + IB_UVERBS_DEVICE_FLUSH_PERSISTENT = 0, + IB_UVERBS_DEVICE_ATOMIC_WRITE = 0, +}; + +enum ib_uverbs_raw_packet_caps { + IB_UVERBS_RAW_PACKET_CAP_CVLAN_STRIPPING = 1, + IB_UVERBS_RAW_PACKET_CAP_SCATTER_FCS = 2, + IB_UVERBS_RAW_PACKET_CAP_IP_CSUM = 4, + IB_UVERBS_RAW_PACKET_CAP_DELAY_DROP = 8, +}; + +enum ib_uverbs_access_flags { + IB_UVERBS_ACCESS_LOCAL_WRITE = 1, + IB_UVERBS_ACCESS_REMOTE_WRITE = 2, + IB_UVERBS_ACCESS_REMOTE_READ = 4, + IB_UVERBS_ACCESS_REMOTE_ATOMIC = 8, + IB_UVERBS_ACCESS_MW_BIND = 16, + IB_UVERBS_ACCESS_ZERO_BASED = 32, + IB_UVERBS_ACCESS_ON_DEMAND = 64, + IB_UVERBS_ACCESS_HUGETLB = 128, + IB_UVERBS_ACCESS_FLUSH_GLOBAL = 256, + IB_UVERBS_ACCESS_FLUSH_PERSISTENT = 512, + IB_UVERBS_ACCESS_RELAXED_ORDERING = 1048576, + IB_UVERBS_ACCESS_OPTIONAL_RANGE = 1072693248, +}; + +enum ib_uverbs_srq_type { + IB_UVERBS_SRQT_BASIC = 0, + IB_UVERBS_SRQT_XRC = 1, + IB_UVERBS_SRQT_TM = 2, +}; + +enum ib_uverbs_wq_type { + IB_UVERBS_WQT_RQ = 0, +}; + +enum ib_uverbs_wq_flags { + IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING = 1, + IB_UVERBS_WQ_FLAGS_SCATTER_FCS = 2, + IB_UVERBS_WQ_FLAGS_DELAY_DROP = 4, + IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING = 8, +}; + +enum ib_uverbs_qp_type { + IB_UVERBS_QPT_RC = 2, + IB_UVERBS_QPT_UC = 3, + IB_UVERBS_QPT_UD = 4, + IB_UVERBS_QPT_RAW_PACKET = 8, + IB_UVERBS_QPT_XRC_INI = 9, + IB_UVERBS_QPT_XRC_TGT = 10, + IB_UVERBS_QPT_DRIVER = 255, +}; + +enum ib_uverbs_qp_create_flags { + IB_UVERBS_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 2, + IB_UVERBS_QP_CREATE_SCATTER_FCS = 256, + IB_UVERBS_QP_CREATE_CVLAN_STRIPPING = 512, + IB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING = 2048, + IB_UVERBS_QP_CREATE_SQ_SIG_ALL = 4096, +}; + +enum ib_uverbs_gid_type { + IB_UVERBS_GID_TYPE_IB = 0, + IB_UVERBS_GID_TYPE_ROCE_V1 = 1, + IB_UVERBS_GID_TYPE_ROCE_V2 = 2, +}; + +enum ib_poll_context { + IB_POLL_SOFTIRQ = 0, + IB_POLL_WORKQUEUE = 1, + IB_POLL_UNBOUND_WORKQUEUE = 2, + IB_POLL_LAST_POOL_TYPE = 2, + IB_POLL_DIRECT = 3, +}; + +struct lsm_network_audit { + int netif; + const struct sock *sk; + u16 family; + __be16 dport; + __be16 sport; + union { + struct { + __be32 daddr; + __be32 saddr; + } v4; + struct { + struct in6_addr daddr; + struct in6_addr saddr; + } v6; + } fam; +}; + +struct lsm_ioctlop_audit { + struct path path; + u16 cmd; +}; + +struct lsm_ibpkey_audit { + u64 subnet_prefix; + u16 pkey; + long: 32; +}; + +struct lsm_ibendport_audit { + const char *dev_name; + u8 port; +}; + +struct selinux_state; + +struct selinux_audit_data { + u32 ssid; + u32 tsid; + u16 tclass; + u32 requested; + u32 audited; + u32 denied; + int result; + struct selinux_state *state; +}; + +struct apparmor_audit_data; + +struct common_audit_data { + char type; + union { + struct path path; + struct dentry *dentry; + struct inode *inode; + struct lsm_network_audit *net; + int cap; + int ipc_id; + struct task_struct *tsk; + struct { + key_serial_t key; + char *key_desc; + } key_struct; + char *kmod_name; + struct lsm_ioctlop_audit *op; + struct file *file; + struct lsm_ibpkey_audit *ibpkey; + struct lsm_ibendport_audit *ibendport; + int reason; + const char *anonclass; + } u; + union { + struct selinux_audit_data *selinux_audit_data; + struct apparmor_audit_data *apparmor_audit_data; + }; +}; + +enum { + POLICYDB_CAP_NETPEER = 0, + POLICYDB_CAP_OPENPERM = 1, + POLICYDB_CAP_EXTSOCKCLASS = 2, + POLICYDB_CAP_ALWAYSNETWORK = 3, + POLICYDB_CAP_CGROUPSECLABEL = 4, + POLICYDB_CAP_NNP_NOSUID_TRANSITION = 5, + POLICYDB_CAP_GENFS_SECLABEL_SYMLINKS = 6, + POLICYDB_CAP_IOCTL_SKIP_CLOEXEC = 7, + __POLICYDB_CAP_MAX = 8, +}; + +struct selinux_avc; + +struct selinux_policy; + +struct selinux_state { + bool enforcing; + bool checkreqprot; + bool initialized; + bool policycap[8]; + struct page *status_page; + struct mutex status_lock; + struct selinux_avc *avc; + struct selinux_policy *policy; + struct mutex policy_mutex; +}; + +struct avc_cache { + struct hlist_head slots[512]; + spinlock_t slots_lock[512]; + atomic_t lru_hint; + atomic_t active_nodes; + u32 latest_notif; +}; + +struct selinux_avc { + unsigned int avc_cache_threshold; + struct avc_cache avc_cache; +}; + +struct av_decision { + u32 allowed; + u32 auditallow; + u32 auditdeny; + u32 seqno; + u32 flags; +}; + +struct extended_perms_data { + u32 p[8]; +}; + +struct extended_perms_decision { + u8 used; + u8 driver; + struct extended_perms_data *allowed; + struct extended_perms_data *auditallow; + struct extended_perms_data *dontaudit; +}; + +struct extended_perms { + u16 len; + struct extended_perms_data drivers; +}; + +struct avc_cache_stats { + unsigned int lookups; + unsigned int misses; + unsigned int allocations; + unsigned int reclaims; + unsigned int frees; +}; + +struct security_class_mapping { + const char *name; + const char *perms[33]; +}; + +struct trace_event_raw_selinux_audited { + struct trace_entry ent; + u32 requested; + u32 denied; + u32 audited; + int result; + u32 __data_loc_scontext; + u32 __data_loc_tcontext; + u32 __data_loc_tclass; + char __data[0]; +}; + +struct trace_event_data_offsets_selinux_audited { + u32 scontext; + u32 tcontext; + u32 tclass; +}; + +typedef void (*btf_trace_selinux_audited)(void *, struct selinux_audit_data *, char *, char *, const char *); + +struct avc_xperms_node; + +struct avc_entry { + u32 ssid; + u32 tsid; + u16 tclass; + struct av_decision avd; + struct avc_xperms_node *xp_node; +}; + +struct avc_xperms_node { + struct extended_perms xp; + struct list_head xpd_head; +}; + +struct avc_node { + struct avc_entry ae; + struct hlist_node list; + struct callback_head rhead; +}; + +struct avc_xperms_decision_node { + struct extended_perms_decision xpd; + struct list_head xpd_list; +}; + +struct avc_callback_node { + int (*callback)(u32); + u32 events; + struct avc_callback_node *next; +}; + +typedef __u16 __sum16; + +enum sctp_endpoint_type { + SCTP_EP_TYPE_SOCKET = 0, + SCTP_EP_TYPE_ASSOCIATION = 1, +}; + +struct sctp_chunk; + +struct sctp_inq { + struct list_head in_chunk_list; + struct sctp_chunk *in_progress; + struct work_struct immediate; +}; + +struct sctp_bind_addr { + __u16 port; + struct list_head address_list; +}; + +struct sctp_ep_common { + enum sctp_endpoint_type type; + refcount_t refcnt; + bool dead; + struct sock *sk; + struct net *net; + struct sctp_inq inqueue; + struct sctp_bind_addr bind_addr; +}; + +typedef __s32 sctp_assoc_t; + +struct in_addr { + __be32 s_addr; +}; + +struct sockaddr_in { + __kernel_sa_family_t sin_family; + __be16 sin_port; + struct in_addr sin_addr; + unsigned char __pad[8]; +}; + +struct sockaddr_in6 { + short unsigned int sin6_family; + __be16 sin6_port; + __be32 sin6_flowinfo; + struct in6_addr sin6_addr; + __u32 sin6_scope_id; +}; + +union sctp_addr { + struct sockaddr_in v4; + struct sockaddr_in6 v6; + struct sockaddr sa; +}; + +struct sctp_chunkhdr { + __u8 type; + __u8 flags; + __be16 length; +}; + +struct sctp_inithdr { + __be32 init_tag; + __be32 a_rwnd; + __be16 num_outbound_streams; + __be16 num_inbound_streams; + __be32 initial_tsn; + __u8 params[0]; +}; + +struct sctp_init_chunk { + struct sctp_chunkhdr chunk_hdr; + struct sctp_inithdr init_hdr; +}; + +struct sctp_cookie { + __u32 my_vtag; + __u32 peer_vtag; + __u32 my_ttag; + __u32 peer_ttag; + ktime_t expiration; + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u32 initial_tsn; + union sctp_addr peer_addr; + __u16 my_port; + __u8 prsctp_capable; + __u8 padding; + __u32 adaptation_ind; + __u8 auth_random[36]; + __u8 auth_hmacs[10]; + __u8 auth_chunks[20]; + __u32 raw_addr_list_len; + struct sctp_init_chunk peer_init[0]; + long: 32; +}; + +struct sctp_tsnmap { + long unsigned int *tsn_map; + __u32 base_tsn; + __u32 cumulative_tsn_ack_point; + __u32 max_tsn_seen; + __u16 len; + __u16 pending_data; + __u16 num_dup_tsns; + __be32 dup_tsns[16]; +}; + +struct sctp_inithdr_host { + __u32 init_tag; + __u32 a_rwnd; + __u16 num_outbound_streams; + __u16 num_inbound_streams; + __u32 initial_tsn; +}; + +enum sctp_state { + SCTP_STATE_CLOSED = 0, + SCTP_STATE_COOKIE_WAIT = 1, + SCTP_STATE_COOKIE_ECHOED = 2, + SCTP_STATE_ESTABLISHED = 3, + SCTP_STATE_SHUTDOWN_PENDING = 4, + SCTP_STATE_SHUTDOWN_SENT = 5, + SCTP_STATE_SHUTDOWN_RECEIVED = 6, + SCTP_STATE_SHUTDOWN_ACK_SENT = 7, +}; + +struct sctp_stream_out_ext; + +struct sctp_stream_out { + union { + __u32 mid; + __u16 ssn; + }; + __u32 mid_uo; + struct sctp_stream_out_ext *ext; + __u8 state; +}; + +struct sctp_stream_in { + union { + __u32 mid; + __u16 ssn; + }; + __u32 mid_uo; + __u32 fsn; + __u32 fsn_uo; + char pd_mode; + char pd_mode_uo; +}; + +struct sctp_stream_interleave; + +struct sctp_stream { + struct { + struct __genradix tree; + struct sctp_stream_out type[0]; + } out; + struct { + struct __genradix tree; + struct sctp_stream_in type[0]; + } in; + __u16 outcnt; + __u16 incnt; + struct sctp_stream_out *out_curr; + union { + struct { + struct list_head prio_list; + }; + struct { + struct list_head rr_list; + struct sctp_stream_out_ext *rr_next; + }; + }; + struct sctp_stream_interleave *si; +}; + +struct sctp_sched_ops; + +struct sctp_outq { + struct sctp_association *asoc; + struct list_head out_chunk_list; + struct sctp_sched_ops *sched; + unsigned int out_qlen; + unsigned int error; + struct list_head control_chunk_list; + struct list_head sacked; + struct list_head retransmit; + struct list_head abandoned; + __u32 outstanding_bytes; + char fast_rtx; + char cork; +}; + +struct sctp_ulpq { + char pd_mode; + struct sctp_association *asoc; + struct sk_buff_head reasm; + struct sk_buff_head reasm_uo; + struct sk_buff_head lobby; +}; + +struct sctp_priv_assoc_stats { + struct __kernel_sockaddr_storage obs_rto_ipaddr; + __u64 max_obs_rto; + __u64 isacks; + __u64 osacks; + __u64 opackets; + __u64 ipackets; + __u64 rtxchunks; + __u64 outofseqtsns; + __u64 idupchunks; + __u64 gapcnt; + __u64 ouodchunks; + __u64 iuodchunks; + __u64 oodchunks; + __u64 iodchunks; + __u64 octrlchunks; + __u64 ictrlchunks; +}; + +struct sctp_endpoint; + +struct sctp_transport; + +struct sctp_random_param; + +struct sctp_chunks_param; + +struct sctp_hmac_algo_param; + +struct sctp_auth_bytes; + +struct sctp_shared_key; + +struct sctp_association { + struct sctp_ep_common base; + struct list_head asocs; + sctp_assoc_t assoc_id; + struct sctp_endpoint *ep; + long: 32; + struct sctp_cookie c; + struct { + struct list_head transport_addr_list; + __u32 rwnd; + __u16 transport_count; + __u16 port; + struct sctp_transport *primary_path; + union sctp_addr primary_addr; + struct sctp_transport *active_path; + struct sctp_transport *retran_path; + struct sctp_transport *last_sent_to; + struct sctp_transport *last_data_from; + struct sctp_tsnmap tsn_map; + __be16 addip_disabled_mask; + __u16 ecn_capable: 1; + __u16 ipv4_address: 1; + __u16 ipv6_address: 1; + __u16 hostname_address: 1; + __u16 asconf_capable: 1; + __u16 prsctp_capable: 1; + __u16 reconf_capable: 1; + __u16 intl_capable: 1; + __u16 auth_capable: 1; + __u16 sack_needed: 1; + __u16 sack_generation: 1; + __u16 zero_window_announced: 1; + __u32 sack_cnt; + __u32 adaptation_ind; + struct sctp_inithdr_host i; + void *cookie; + int cookie_len; + __u32 addip_serial; + struct sctp_random_param *peer_random; + struct sctp_chunks_param *peer_chunks; + struct sctp_hmac_algo_param *peer_hmacs; + } peer; + enum sctp_state state; + int overall_error_count; + long: 32; + ktime_t cookie_life; + long unsigned int rto_initial; + long unsigned int rto_max; + long unsigned int rto_min; + int max_burst; + int max_retrans; + __u16 pf_retrans; + __u16 ps_retrans; + __u16 max_init_attempts; + __u16 init_retries; + long unsigned int max_init_timeo; + long unsigned int hbinterval; + long unsigned int probe_interval; + __be16 encap_port; + __u16 pathmaxrxt; + __u32 flowlabel; + __u8 dscp; + __u8 pmtu_pending; + __u32 pathmtu; + __u32 param_flags; + __u32 sackfreq; + long unsigned int sackdelay; + long unsigned int timeouts[12]; + struct timer_list timers[12]; + struct sctp_transport *shutdown_last_sent_to; + struct sctp_transport *init_last_sent_to; + int shutdown_retries; + __u32 next_tsn; + __u32 ctsn_ack_point; + __u32 adv_peer_ack_point; + __u32 highest_sacked; + __u32 fast_recovery_exit; + __u8 fast_recovery; + __u16 unack_data; + __u32 rtx_data_chunks; + __u32 rwnd; + __u32 a_rwnd; + __u32 rwnd_over; + __u32 rwnd_press; + int sndbuf_used; + atomic_t rmem_alloc; + wait_queue_head_t wait; + __u32 frag_point; + __u32 user_frag; + int init_err_counter; + int init_cycle; + __u16 default_stream; + __u16 default_flags; + __u32 default_ppid; + __u32 default_context; + __u32 default_timetolive; + __u32 default_rcv_context; + struct sctp_stream stream; + struct sctp_outq outqueue; + struct sctp_ulpq ulpq; + __u32 last_ecne_tsn; + __u32 last_cwr_tsn; + int numduptsns; + struct sctp_chunk *addip_last_asconf; + struct list_head asconf_ack_list; + struct list_head addip_chunk_list; + __u32 addip_serial; + int src_out_of_asoc_ok; + union sctp_addr *asconf_addr_del_pending; + struct sctp_transport *new_transport; + struct list_head endpoint_shared_keys; + struct sctp_auth_bytes *asoc_shared_key; + struct sctp_shared_key *shkey; + __u16 default_hmac_id; + __u16 active_key_id; + __u8 need_ecne: 1; + __u8 temp: 1; + __u8 pf_expose: 2; + __u8 force_delay: 1; + __u8 strreset_enable; + __u8 strreset_outstanding; + __u32 strreset_outseq; + __u32 strreset_inseq; + __u32 strreset_result[2]; + struct sctp_chunk *strreset_chunk; + struct sctp_priv_assoc_stats stats; + int sent_cnt_removable; + __u16 subscribe; + __u64 abandoned_unsent[3]; + __u64 abandoned_sent[3]; + u32 secid; + u32 peer_secid; + struct callback_head rcu; +}; + +typedef union { + __be32 a4; + __be32 a6[4]; + struct in6_addr in6; +} xfrm_address_t; + +struct xfrm_id { + xfrm_address_t daddr; + __be32 spi; + __u8 proto; +}; + +struct xfrm_selector { + xfrm_address_t daddr; + xfrm_address_t saddr; + __be16 dport; + __be16 dport_mask; + __be16 sport; + __be16 sport_mask; + __u16 family; + __u8 prefixlen_d; + __u8 prefixlen_s; + __u8 proto; + int ifindex; + __kernel_uid32_t user; +}; + +struct xfrm_mark { + __u32 v; + __u32 m; +}; + +struct xfrm_address_filter; + +struct xfrm_state_walk { + struct list_head all; + u8 state; + u8 dying; + u8 proto; + u32 seq; + struct xfrm_address_filter *filter; +}; + +struct xfrm_lifetime_cfg { + __u64 soft_byte_limit; + __u64 hard_byte_limit; + __u64 soft_packet_limit; + __u64 hard_packet_limit; + __u64 soft_add_expires_seconds; + __u64 hard_add_expires_seconds; + __u64 soft_use_expires_seconds; + __u64 hard_use_expires_seconds; +}; + +struct xfrm_replay_state { + __u32 oseq; + __u32 seq; + __u32 bitmap; +}; + +enum xfrm_replay_mode { + XFRM_REPLAY_MODE_LEGACY = 0, + XFRM_REPLAY_MODE_BMP = 1, + XFRM_REPLAY_MODE_ESN = 2, +}; + +struct xfrm_stats { + __u32 replay_window; + __u32 replay; + __u32 integrity_failed; +}; + +struct xfrm_lifetime_cur { + __u64 bytes; + __u64 packets; + __u64 add_time; + __u64 use_time; +}; + +struct xfrm_dev_offload { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net_device *real_dev; + long unsigned int offload_handle; + u8 dir: 2; + u8 type: 2; +}; + +struct xfrm_mode { + u8 encap; + u8 family; + u8 flags; +}; + +struct xfrm_algo_auth; + +struct xfrm_algo; + +struct xfrm_algo_aead; + +struct xfrm_encap_tmpl; + +struct xfrm_replay_state_esn; + +struct xfrm_type; + +struct xfrm_type_offload; + +struct xfrm_state { + possible_net_t xs_net; + union { + struct hlist_node gclist; + struct hlist_node bydst; + }; + struct hlist_node bysrc; + struct hlist_node byspi; + struct hlist_node byseq; + refcount_t refcnt; + spinlock_t lock; + struct xfrm_id id; + struct xfrm_selector sel; + struct xfrm_mark mark; + u32 if_id; + u32 tfcpad; + u32 genid; + struct xfrm_state_walk km; + struct { + u32 reqid; + u8 mode; + u8 replay_window; + u8 aalgo; + u8 ealgo; + u8 calgo; + u8 flags; + u16 family; + xfrm_address_t saddr; + int header_len; + int trailer_len; + u32 extra_flags; + struct xfrm_mark smark; + } props; + long: 32; + struct xfrm_lifetime_cfg lft; + struct xfrm_algo_auth *aalg; + struct xfrm_algo *ealg; + struct xfrm_algo *calg; + struct xfrm_algo_aead *aead; + const char *geniv; + __be16 new_mapping_sport; + u32 new_mapping; + u32 mapping_maxage; + struct xfrm_encap_tmpl *encap; + struct sock *encap_sk; + xfrm_address_t *coaddr; + struct xfrm_state *tunnel; + atomic_t tunnel_users; + struct xfrm_replay_state replay; + struct xfrm_replay_state_esn *replay_esn; + struct xfrm_replay_state preplay; + struct xfrm_replay_state_esn *preplay_esn; + enum xfrm_replay_mode repl_mode; + u32 xflags; + u32 replay_maxage; + u32 replay_maxdiff; + struct timer_list rtimer; + struct xfrm_stats stats; + long: 32; + struct xfrm_lifetime_cur curlft; + struct hrtimer mtimer; + struct xfrm_dev_offload xso; + long int saved_tmo; + long: 32; + time64_t lastused; + struct page_frag xfrag; + const struct xfrm_type *type; + struct xfrm_mode inner_mode; + struct xfrm_mode inner_mode_iaf; + struct xfrm_mode outer_mode; + const struct xfrm_type_offload *type_offload; + struct xfrm_sec_ctx *security; + void *data; + long: 32; +}; + +struct xfrm_policy_walk_entry { + struct list_head all; + u8 dead; +}; + +struct xfrm_policy_queue { + struct sk_buff_head hold_queue; + struct timer_list hold_timer; + long unsigned int timeout; +}; + +struct xfrm_tmpl { + struct xfrm_id id; + xfrm_address_t saddr; + short unsigned int encap_family; + u32 reqid; + u8 mode; + u8 share; + u8 optional; + u8 allalgs; + u32 aalgos; + u32 ealgos; + u32 calgos; +}; + +struct xfrm_policy { + possible_net_t xp_net; + struct hlist_node bydst; + struct hlist_node byidx; + rwlock_t lock; + refcount_t refcnt; + u32 pos; + struct timer_list timer; + atomic_t genid; + u32 priority; + u32 index; + u32 if_id; + struct xfrm_mark mark; + struct xfrm_selector selector; + long: 32; + struct xfrm_lifetime_cfg lft; + struct xfrm_lifetime_cur curlft; + struct xfrm_policy_walk_entry walk; + struct xfrm_policy_queue polq; + bool bydst_reinsert; + u8 type; + u8 action; + u8 flags; + u8 xfrm_nr; + u16 family; + struct xfrm_sec_ctx *security; + struct xfrm_tmpl xfrm_vec[6]; + struct hlist_node bydst_inexact_list; + struct callback_head rcu; + struct xfrm_dev_offload xdo; +}; + +struct rt6key { + struct in6_addr addr; + int plen; +}; + +struct rtable; + +struct fnhe_hash_bucket; + +struct fib_nh_common { + struct net_device *nhc_dev; + netdevice_tracker nhc_dev_tracker; + int nhc_oif; + unsigned char nhc_scope; + u8 nhc_family; + u8 nhc_gw_family; + unsigned char nhc_flags; + struct lwtunnel_state *nhc_lwtstate; + union { + __be32 ipv4; + struct in6_addr ipv6; + } nhc_gw; + int nhc_weight; + atomic_t nhc_upper_bound; + struct rtable **nhc_pcpu_rth_output; + struct rtable *nhc_rth_input; + struct fnhe_hash_bucket *nhc_exceptions; +}; + +struct rt6_exception_bucket; + +struct fib6_nh { + struct fib_nh_common nh_common; + long unsigned int last_probe; + struct rt6_info **rt6i_pcpu; + struct rt6_exception_bucket *rt6i_exception_bucket; +}; + +struct fib6_node; + +struct dst_metrics; + +struct nexthop; + +struct fib6_info { + struct fib6_table *fib6_table; + struct fib6_info *fib6_next; + struct fib6_node *fib6_node; + union { + struct list_head fib6_siblings; + struct list_head nh_list; + }; + unsigned int fib6_nsiblings; + refcount_t fib6_ref; + long unsigned int expires; + struct dst_metrics *fib6_metrics; + struct rt6key fib6_dst; + u32 fib6_flags; + struct rt6key fib6_src; + struct rt6key fib6_prefsrc; + u32 fib6_metric; + u8 fib6_protocol; + u8 fib6_type; + u8 offload; + u8 trap; + u8 offload_failed; + u8 should_flush: 1; + u8 dst_nocount: 1; + u8 dst_nopolicy: 1; + u8 fib6_destroying: 1; + u8 unused: 4; + struct callback_head rcu; + struct nexthop *nh; + struct fib6_nh fib6_nh[0]; +}; + +struct uncached_list; + +struct rt6_info { + struct dst_entry dst; + struct fib6_info *from; + int sernum; + struct rt6key rt6i_dst; + struct rt6key rt6i_src; + struct in6_addr rt6i_gateway; + struct inet6_dev *rt6i_idev; + u32 rt6i_flags; + struct list_head rt6i_uncached; + struct uncached_list *rt6i_uncached_list; + short unsigned int rt6i_nfheader_len; +}; + +struct rt6_statistics { + __u32 fib_nodes; + __u32 fib_route_nodes; + __u32 fib_rt_entries; + __u32 fib_rt_cache; + __u32 fib_discarded_routes; + atomic_t fib_rt_alloc; +}; + +struct fib6_node { + struct fib6_node *parent; + struct fib6_node *left; + struct fib6_node *right; + struct fib6_node *subtree; + struct fib6_info *leaf; + __u16 fn_bit; + __u16 fn_flags; + int fn_sernum; + struct fib6_info *rr_ptr; + struct callback_head rcu; +}; + +struct fib6_table { + struct hlist_node tb6_hlist; + u32 tb6_id; + spinlock_t tb6_lock; + struct fib6_node tb6_root; + struct inet_peer_base tb6_peers; + unsigned int flags; + unsigned int fib_seq; +}; + +struct nf_hook_state; + +typedef unsigned int nf_hookfn(void *, struct sk_buff *, const struct nf_hook_state *); + +struct nf_hook_entry { + nf_hookfn *hook; + void *priv; +}; + +struct nf_hook_entries { + u16 num_hook_entries; + struct nf_hook_entry hooks[0]; +}; + +struct xfrm_replay_state_esn { + unsigned int bmp_len; + __u32 oseq; + __u32 seq; + __u32 oseq_hi; + __u32 seq_hi; + __u32 replay_window; + __u32 bmp[0]; +}; + +struct xfrm_algo { + char alg_name[64]; + unsigned int alg_key_len; + char alg_key[0]; +}; + +struct xfrm_algo_auth { + char alg_name[64]; + unsigned int alg_key_len; + unsigned int alg_trunc_len; + char alg_key[0]; +}; + +struct xfrm_algo_aead { + char alg_name[64]; + unsigned int alg_key_len; + unsigned int alg_icv_len; + char alg_key[0]; +}; + +enum { + XFRM_POLICY_TYPE_MAIN = 0, + XFRM_POLICY_TYPE_SUB = 1, + XFRM_POLICY_TYPE_MAX = 2, + XFRM_POLICY_TYPE_ANY = 255, +}; + +enum { + XFRM_MSG_BASE = 16, + XFRM_MSG_NEWSA = 16, + XFRM_MSG_DELSA = 17, + XFRM_MSG_GETSA = 18, + XFRM_MSG_NEWPOLICY = 19, + XFRM_MSG_DELPOLICY = 20, + XFRM_MSG_GETPOLICY = 21, + XFRM_MSG_ALLOCSPI = 22, + XFRM_MSG_ACQUIRE = 23, + XFRM_MSG_EXPIRE = 24, + XFRM_MSG_UPDPOLICY = 25, + XFRM_MSG_UPDSA = 26, + XFRM_MSG_POLEXPIRE = 27, + XFRM_MSG_FLUSHSA = 28, + XFRM_MSG_FLUSHPOLICY = 29, + XFRM_MSG_NEWAE = 30, + XFRM_MSG_GETAE = 31, + XFRM_MSG_REPORT = 32, + XFRM_MSG_MIGRATE = 33, + XFRM_MSG_NEWSADINFO = 34, + XFRM_MSG_GETSADINFO = 35, + XFRM_MSG_NEWSPDINFO = 36, + XFRM_MSG_GETSPDINFO = 37, + XFRM_MSG_MAPPING = 38, + XFRM_MSG_SETDEFAULT = 39, + XFRM_MSG_GETDEFAULT = 40, + __XFRM_MSG_MAX = 41, +}; + +struct xfrm_encap_tmpl { + __u16 encap_type; + __be16 encap_sport; + __be16 encap_dport; + xfrm_address_t encap_oa; +}; + +enum xfrm_attr_type_t { + XFRMA_UNSPEC = 0, + XFRMA_ALG_AUTH = 1, + XFRMA_ALG_CRYPT = 2, + XFRMA_ALG_COMP = 3, + XFRMA_ENCAP = 4, + XFRMA_TMPL = 5, + XFRMA_SA = 6, + XFRMA_POLICY = 7, + XFRMA_SEC_CTX = 8, + XFRMA_LTIME_VAL = 9, + XFRMA_REPLAY_VAL = 10, + XFRMA_REPLAY_THRESH = 11, + XFRMA_ETIMER_THRESH = 12, + XFRMA_SRCADDR = 13, + XFRMA_COADDR = 14, + XFRMA_LASTUSED = 15, + XFRMA_POLICY_TYPE = 16, + XFRMA_MIGRATE = 17, + XFRMA_ALG_AEAD = 18, + XFRMA_KMADDRESS = 19, + XFRMA_ALG_AUTH_TRUNC = 20, + XFRMA_MARK = 21, + XFRMA_TFCPAD = 22, + XFRMA_REPLAY_ESN_VAL = 23, + XFRMA_SA_EXTRA_FLAGS = 24, + XFRMA_PROTO = 25, + XFRMA_ADDRESS_FILTER = 26, + XFRMA_PAD = 27, + XFRMA_OFFLOAD_DEV = 28, + XFRMA_SET_MARK = 29, + XFRMA_SET_MARK_MASK = 30, + XFRMA_IF_ID = 31, + XFRMA_MTIMER_THRESH = 32, + __XFRMA_MAX = 33, +}; + +struct xfrm_address_filter { + xfrm_address_t saddr; + xfrm_address_t daddr; + __u16 family; + __u8 splen; + __u8 dplen; +}; + +struct nf_hook_state { + u8 hook; + u8 pf; + struct net_device *in; + struct net_device *out; + struct sock *sk; + struct net *net; + int (*okfn)(struct net *, struct sock *, struct sk_buff *); +}; + +enum nf_hook_ops_type { + NF_HOOK_OP_UNDEFINED = 0, + NF_HOOK_OP_NF_TABLES = 1, +}; + +struct nf_hook_ops { + nf_hookfn *hook; + struct net_device *dev; + void *priv; + u8 pf; + enum nf_hook_ops_type hook_ops_type: 8; + unsigned int hooknum; + int priority; +}; + +enum nf_ip_hook_priorities { + NF_IP_PRI_FIRST = 2147483648, + NF_IP_PRI_RAW_BEFORE_DEFRAG = 4294966846, + NF_IP_PRI_CONNTRACK_DEFRAG = 4294966896, + NF_IP_PRI_RAW = 4294966996, + NF_IP_PRI_SELINUX_FIRST = 4294967071, + NF_IP_PRI_CONNTRACK = 4294967096, + NF_IP_PRI_MANGLE = 4294967146, + NF_IP_PRI_NAT_DST = 4294967196, + NF_IP_PRI_FILTER = 0, + NF_IP_PRI_SECURITY = 50, + NF_IP_PRI_NAT_SRC = 100, + NF_IP_PRI_SELINUX_LAST = 225, + NF_IP_PRI_CONNTRACK_HELPER = 300, + NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, + NF_IP_PRI_LAST = 2147483647, +}; + +enum nf_ip6_hook_priorities { + NF_IP6_PRI_FIRST = 2147483648, + NF_IP6_PRI_RAW_BEFORE_DEFRAG = 4294966846, + NF_IP6_PRI_CONNTRACK_DEFRAG = 4294966896, + NF_IP6_PRI_RAW = 4294966996, + NF_IP6_PRI_SELINUX_FIRST = 4294967071, + NF_IP6_PRI_CONNTRACK = 4294967096, + NF_IP6_PRI_MANGLE = 4294967146, + NF_IP6_PRI_NAT_DST = 4294967196, + NF_IP6_PRI_FILTER = 0, + NF_IP6_PRI_SECURITY = 50, + NF_IP6_PRI_NAT_SRC = 100, + NF_IP6_PRI_SELINUX_LAST = 225, + NF_IP6_PRI_CONNTRACK_HELPER = 300, + NF_IP6_PRI_LAST = 2147483647, +}; + +struct dst_metrics { + u32 metrics[17]; + refcount_t refcnt; +}; + +struct socket_alloc { + struct socket socket; + struct inode vfs_inode; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct ip_options { + __be32 faddr; + __be32 nexthop; + unsigned char optlen; + unsigned char srr; + unsigned char rr; + unsigned char ts; + unsigned char is_strictroute: 1; + unsigned char srr_is_hit: 1; + unsigned char is_changed: 1; + unsigned char rr_needaddr: 1; + unsigned char ts_needtime: 1; + unsigned char ts_needaddr: 1; + unsigned char router_alert; + unsigned char cipso; + unsigned char __pad2; + unsigned char __data[0]; +}; + +struct ip_options_rcu { + struct callback_head rcu; + struct ip_options opt; +}; + +struct ipv6_opt_hdr; + +struct ipv6_rt_hdr; + +struct ipv6_txoptions { + refcount_t refcnt; + int tot_len; + __u16 opt_flen; + __u16 opt_nflen; + struct ipv6_opt_hdr *hopopt; + struct ipv6_opt_hdr *dst0opt; + struct ipv6_rt_hdr *srcrt; + struct ipv6_opt_hdr *dst1opt; + struct callback_head rcu; +}; + +struct inet_cork { + unsigned int flags; + __be32 addr; + struct ip_options *opt; + unsigned int fragsize; + int length; + struct dst_entry *dst; + u8 tx_flags; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; + u64 transmit_time; + u32 mark; + long: 32; +}; + +struct inet_cork_full { + struct inet_cork base; + struct flowi fl; +}; + +struct ipv6_pinfo; + +struct ip_mc_socklist; + +struct inet_sock { + struct sock sk; + struct ipv6_pinfo *pinet6; + __be32 inet_saddr; + __s16 uc_ttl; + __u16 cmsg_flags; + struct ip_options_rcu *inet_opt; + __be16 inet_sport; + __u16 inet_id; + __u8 tos; + __u8 min_ttl; + __u8 mc_ttl; + __u8 pmtudisc; + __u8 recverr: 1; + __u8 is_icsk: 1; + __u8 freebind: 1; + __u8 hdrincl: 1; + __u8 mc_loop: 1; + __u8 transparent: 1; + __u8 mc_all: 1; + __u8 nodefrag: 1; + __u8 bind_address_no_port: 1; + __u8 recverr_rfc4884: 1; + __u8 defer_connect: 1; + __u8 rcv_tos; + __u8 convert_csum; + int uc_index; + int mc_index; + __be32 mc_addr; + struct ip_mc_socklist *mc_list; + long: 32; + struct inet_cork_full cork; + struct { + __u16 lo; + __u16 hi; + } local_port_range; + long: 32; +}; + +struct in6_pktinfo { + struct in6_addr ipi6_addr; + int ipi6_ifindex; +}; + +struct inet6_cork { + struct ipv6_txoptions *opt; + u8 hop_limit; + u8 tclass; +}; + +struct ipv6_mc_socklist; + +struct ipv6_ac_socklist; + +struct ipv6_fl_socklist; + +struct ipv6_pinfo { + struct in6_addr saddr; + struct in6_pktinfo sticky_pktinfo; + const struct in6_addr *daddr_cache; + const struct in6_addr *saddr_cache; + __be32 flow_label; + __u32 frag_size; + __u16 __unused_1: 7; + __s16 hop_limit: 9; + __u16 mc_loop: 1; + __u16 __unused_2: 6; + __s16 mcast_hops: 9; + int ucast_oif; + int mcast_oif; + union { + struct { + __u16 srcrt: 1; + __u16 osrcrt: 1; + __u16 rxinfo: 1; + __u16 rxoinfo: 1; + __u16 rxhlim: 1; + __u16 rxohlim: 1; + __u16 hopopts: 1; + __u16 ohopopts: 1; + __u16 dstopts: 1; + __u16 odstopts: 1; + __u16 rxflow: 1; + __u16 rxtclass: 1; + __u16 rxpmtu: 1; + __u16 rxorigdstaddr: 1; + __u16 recvfragsize: 1; + } bits; + __u16 all; + } rxopt; + __u16 recverr: 1; + __u16 sndflow: 1; + __u16 repflow: 1; + __u16 pmtudisc: 3; + __u16 padding: 1; + __u16 srcprefs: 3; + __u16 dontfrag: 1; + __u16 autoflowlabel: 1; + __u16 autoflowlabel_set: 1; + __u16 mc_all: 1; + __u16 recverr_rfc4884: 1; + __u16 rtalert_isolate: 1; + __u8 min_hopcount; + __u8 tclass; + __be32 rcv_flowinfo; + __u32 dst_cookie; + struct ipv6_mc_socklist *ipv6_mc_list; + struct ipv6_ac_socklist *ipv6_ac_list; + struct ipv6_fl_socklist *ipv6_fl_list; + struct ipv6_txoptions *opt; + struct sk_buff *pktoptions; + struct sk_buff *rxpmtu; + struct inet6_cork cork; +}; + +struct tcphdr { + __be16 source; + __be16 dest; + __be32 seq; + __be32 ack_seq; + __u16 res1: 4; + __u16 doff: 4; + __u16 fin: 1; + __u16 syn: 1; + __u16 rst: 1; + __u16 psh: 1; + __u16 ack: 1; + __u16 urg: 1; + __u16 ece: 1; + __u16 cwr: 1; + __be16 window; + __sum16 check; + __be16 urg_ptr; +}; + +struct iphdr { + __u8 ihl: 4; + __u8 version: 4; + __u8 tos; + __be16 tot_len; + __be16 id; + __be16 frag_off; + __u8 ttl; + __u8 protocol; + __sum16 check; + union { + struct { + __be32 saddr; + __be32 daddr; + }; + struct { + __be32 saddr; + __be32 daddr; + } addrs; + }; +}; + +struct ipv6_rt_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; +}; + +struct ipv6_opt_hdr { + __u8 nexthdr; + __u8 hdrlen; +}; + +struct ipv6hdr { + __u8 priority: 4; + __u8 version: 4; + __u8 flow_lbl[3]; + __be16 payload_len; + __u8 nexthdr; + __u8 hop_limit; + union { + struct { + struct in6_addr saddr; + struct in6_addr daddr; + }; + struct { + struct in6_addr saddr; + struct in6_addr daddr; + } addrs; + }; +}; + +struct udphdr { + __be16 source; + __be16 dest; + __be16 len; + __sum16 check; +}; + +struct inet6_skb_parm { + int iif; + __be16 ra; + __u16 dst0; + __u16 srcrt; + __u16 dst1; + __u16 lastopt; + __u16 nhoff; + __u16 flags; + __u16 dsthao; + __u16 frag_max_size; + __u16 srhoff; +}; + +struct ip6_sf_socklist; + +struct ipv6_mc_socklist { + struct in6_addr addr; + int ifindex; + unsigned int sfmode; + struct ipv6_mc_socklist *next; + struct ip6_sf_socklist *sflist; + struct callback_head rcu; +}; + +struct ipv6_ac_socklist { + struct in6_addr acl_addr; + int acl_ifindex; + struct ipv6_ac_socklist *acl_next; +}; + +struct ip6_flowlabel; + +struct ipv6_fl_socklist { + struct ipv6_fl_socklist *next; + struct ip6_flowlabel *fl; + struct callback_head rcu; +}; + +struct ip6_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + struct in6_addr sl_addr[0]; +}; + +struct ip6_flowlabel { + struct ip6_flowlabel *next; + __be32 label; + atomic_t users; + struct in6_addr dst; + struct ipv6_txoptions *opt; + long unsigned int linger; + struct callback_head rcu; + u8 share; + union { + struct pid *pid; + kuid_t uid; + } owner; + long unsigned int lastuse; + long unsigned int expires; + struct net *fl_net; +}; + +struct fib_nh_exception { + struct fib_nh_exception *fnhe_next; + int fnhe_genid; + __be32 fnhe_daddr; + u32 fnhe_pmtu; + bool fnhe_mtu_locked; + __be32 fnhe_gw; + long unsigned int fnhe_expires; + struct rtable *fnhe_rth_input; + struct rtable *fnhe_rth_output; + long unsigned int fnhe_stamp; + struct callback_head rcu; +}; + +struct rtable { + struct dst_entry dst; + int rt_genid; + unsigned int rt_flags; + __u16 rt_type; + __u8 rt_is_input; + __u8 rt_uses_gateway; + int rt_iif; + u8 rt_gw_family; + union { + __be32 rt_gw4; + struct in6_addr rt_gw6; + }; + u32 rt_mtu_locked: 1; + u32 rt_pmtu: 31; + struct list_head rt_uncached; + struct uncached_list *rt_uncached_list; +}; + +struct fnhe_hash_bucket { + struct fib_nh_exception *chain; +}; + +struct inet_skb_parm { + int iif; + struct ip_options opt; + u16 flags; + u16 frag_max_size; +}; + +struct tty_file_private { + struct tty_struct *tty; + struct file *file; + struct list_head list; +}; + +struct netlbl_lsm_cache { + refcount_t refcount; + void (*free)(const void *); + void *data; +}; + +struct netlbl_lsm_catmap { + u32 startbit; + long: 32; + u64 bitmap[4]; + struct netlbl_lsm_catmap *next; + long: 32; +}; + +struct netlbl_lsm_secattr { + u32 flags; + u32 type; + char *domain; + struct netlbl_lsm_cache *cache; + struct { + struct { + struct netlbl_lsm_catmap *cat; + u32 lvl; + } mls; + u32 secid; + } attr; +}; + +struct dccp_hdr { + __be16 dccph_sport; + __be16 dccph_dport; + __u8 dccph_doff; + __u8 dccph_cscov: 4; + __u8 dccph_ccval: 4; + __sum16 dccph_checksum; + __u8 dccph_x: 1; + __u8 dccph_type: 4; + __u8 dccph_reserved: 3; + __u8 dccph_seq2; + __be16 dccph_seq; +}; + +enum dccp_state { + DCCP_OPEN = 1, + DCCP_REQUESTING = 2, + DCCP_LISTEN = 10, + DCCP_RESPOND = 3, + DCCP_ACTIVE_CLOSEREQ = 4, + DCCP_PASSIVE_CLOSE = 8, + DCCP_CLOSING = 11, + DCCP_TIME_WAIT = 6, + DCCP_CLOSED = 7, + DCCP_NEW_SYN_RECV = 12, + DCCP_PARTOPEN = 13, + DCCP_PASSIVE_CLOSEREQ = 14, + DCCP_MAX_STATES = 15, +}; + +enum sctp_msg_flags { + MSG_NOTIFICATION = 32768, +}; + +struct sctp_initmsg { + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u16 sinit_max_attempts; + __u16 sinit_max_init_timeo; +}; + +struct sctp_sndrcvinfo { + __u16 sinfo_stream; + __u16 sinfo_ssn; + __u16 sinfo_flags; + __u32 sinfo_ppid; + __u32 sinfo_context; + __u32 sinfo_timetolive; + __u32 sinfo_tsn; + __u32 sinfo_cumtsn; + sctp_assoc_t sinfo_assoc_id; +}; + +struct sctp_rtoinfo { + sctp_assoc_t srto_assoc_id; + __u32 srto_initial; + __u32 srto_max; + __u32 srto_min; +}; + +struct sctp_assocparams { + sctp_assoc_t sasoc_assoc_id; + __u16 sasoc_asocmaxrxt; + __u16 sasoc_number_peer_destinations; + __u32 sasoc_peer_rwnd; + __u32 sasoc_local_rwnd; + __u32 sasoc_cookie_life; +}; + +struct sctp_paddrparams { + sctp_assoc_t spp_assoc_id; + struct __kernel_sockaddr_storage spp_address; + __u32 spp_hbinterval; + __u16 spp_pathmaxrxt; + __u32 spp_pathmtu; + __u32 spp_sackdelay; + __u32 spp_flags; + __u32 spp_ipv6_flowlabel; + __u8 spp_dscp; + long: 0; +} __attribute__((packed)); + +struct sctphdr { + __be16 source; + __be16 dest; + __be32 vtag; + __le32 checksum; +}; + +enum sctp_cid { + SCTP_CID_DATA = 0, + SCTP_CID_INIT = 1, + SCTP_CID_INIT_ACK = 2, + SCTP_CID_SACK = 3, + SCTP_CID_HEARTBEAT = 4, + SCTP_CID_HEARTBEAT_ACK = 5, + SCTP_CID_ABORT = 6, + SCTP_CID_SHUTDOWN = 7, + SCTP_CID_SHUTDOWN_ACK = 8, + SCTP_CID_ERROR = 9, + SCTP_CID_COOKIE_ECHO = 10, + SCTP_CID_COOKIE_ACK = 11, + SCTP_CID_ECN_ECNE = 12, + SCTP_CID_ECN_CWR = 13, + SCTP_CID_SHUTDOWN_COMPLETE = 14, + SCTP_CID_AUTH = 15, + SCTP_CID_I_DATA = 64, + SCTP_CID_FWD_TSN = 192, + SCTP_CID_ASCONF = 193, + SCTP_CID_I_FWD_TSN = 194, + SCTP_CID_ASCONF_ACK = 128, + SCTP_CID_RECONF = 130, + SCTP_CID_PAD = 132, +}; + +struct sctp_paramhdr { + __be16 type; + __be16 length; +}; + +enum sctp_param { + SCTP_PARAM_HEARTBEAT_INFO = 256, + SCTP_PARAM_IPV4_ADDRESS = 1280, + SCTP_PARAM_IPV6_ADDRESS = 1536, + SCTP_PARAM_STATE_COOKIE = 1792, + SCTP_PARAM_UNRECOGNIZED_PARAMETERS = 2048, + SCTP_PARAM_COOKIE_PRESERVATIVE = 2304, + SCTP_PARAM_HOST_NAME_ADDRESS = 2816, + SCTP_PARAM_SUPPORTED_ADDRESS_TYPES = 3072, + SCTP_PARAM_ECN_CAPABLE = 128, + SCTP_PARAM_RANDOM = 640, + SCTP_PARAM_CHUNKS = 896, + SCTP_PARAM_HMAC_ALGO = 1152, + SCTP_PARAM_SUPPORTED_EXT = 2176, + SCTP_PARAM_FWD_TSN_SUPPORT = 192, + SCTP_PARAM_ADD_IP = 448, + SCTP_PARAM_DEL_IP = 704, + SCTP_PARAM_ERR_CAUSE = 960, + SCTP_PARAM_SET_PRIMARY = 1216, + SCTP_PARAM_SUCCESS_REPORT = 1472, + SCTP_PARAM_ADAPTATION_LAYER_IND = 1728, + SCTP_PARAM_RESET_OUT_REQUEST = 3328, + SCTP_PARAM_RESET_IN_REQUEST = 3584, + SCTP_PARAM_RESET_TSN_REQUEST = 3840, + SCTP_PARAM_RESET_RESPONSE = 4096, + SCTP_PARAM_RESET_ADD_OUT_STREAMS = 4352, + SCTP_PARAM_RESET_ADD_IN_STREAMS = 4608, +}; + +struct sctp_datahdr { + __be32 tsn; + __be16 stream; + __be16 ssn; + __u32 ppid; + __u8 payload[0]; +}; + +struct sctp_idatahdr { + __be32 tsn; + __be16 stream; + __be16 reserved; + __be32 mid; + union { + __u32 ppid; + __be32 fsn; + }; + __u8 payload[0]; +}; + +struct sctp_ipv4addr_param { + struct sctp_paramhdr param_hdr; + struct in_addr addr; +}; + +struct sctp_ipv6addr_param { + struct sctp_paramhdr param_hdr; + struct in6_addr addr; +}; + +struct sctp_cookie_preserve_param { + struct sctp_paramhdr param_hdr; + __be32 lifespan_increment; +}; + +struct sctp_hostname_param { + struct sctp_paramhdr param_hdr; + uint8_t hostname[0]; +}; + +struct sctp_supported_addrs_param { + struct sctp_paramhdr param_hdr; + __be16 types[0]; +}; + +struct sctp_adaptation_ind_param { + struct sctp_paramhdr param_hdr; + __be32 adaptation_ind; +}; + +struct sctp_supported_ext_param { + struct sctp_paramhdr param_hdr; + __u8 chunks[0]; +}; + +struct sctp_random_param { + struct sctp_paramhdr param_hdr; + __u8 random_val[0]; +}; + +struct sctp_chunks_param { + struct sctp_paramhdr param_hdr; + __u8 chunks[0]; +}; + +struct sctp_hmac_algo_param { + struct sctp_paramhdr param_hdr; + __be16 hmac_ids[0]; +}; + +struct sctp_cookie_param { + struct sctp_paramhdr p; + __u8 body[0]; +}; + +struct sctp_gap_ack_block { + __be16 start; + __be16 end; +}; + +union sctp_sack_variable { + struct sctp_gap_ack_block gab; + __be32 dup; +}; + +struct sctp_sackhdr { + __be32 cum_tsn_ack; + __be32 a_rwnd; + __be16 num_gap_ack_blocks; + __be16 num_dup_tsns; + union sctp_sack_variable variable[0]; +}; + +struct sctp_heartbeathdr { + struct sctp_paramhdr info; +}; + +struct sctp_shutdownhdr { + __be32 cum_tsn_ack; +}; + +struct sctp_errhdr { + __be16 cause; + __be16 length; + __u8 variable[0]; +}; + +struct sctp_ecnehdr { + __be32 lowest_tsn; +}; + +struct sctp_cwrhdr { + __be32 lowest_tsn; +}; + +struct sctp_fwdtsn_skip { + __be16 stream; + __be16 ssn; +}; + +struct sctp_fwdtsn_hdr { + __be32 new_cum_tsn; + struct sctp_fwdtsn_skip skip[0]; +}; + +struct sctp_ifwdtsn_skip { + __be16 stream; + __u8 reserved; + __u8 flags; + __be32 mid; +}; + +struct sctp_ifwdtsn_hdr { + __be32 new_cum_tsn; + struct sctp_ifwdtsn_skip skip[0]; +}; + +struct sctp_addip_param { + struct sctp_paramhdr param_hdr; + __be32 crr_id; +}; + +struct sctp_addiphdr { + __be32 serial; + __u8 params[0]; +}; + +struct sctp_authhdr { + __be16 shkey_id; + __be16 hmac_id; + __u8 hmac[0]; +}; + +struct sctp_auth_bytes { + refcount_t refcnt; + __u32 len; + __u8 data[0]; +}; + +struct sctp_shared_key { + struct list_head key_list; + struct sctp_auth_bytes *key; + refcount_t refcnt; + __u16 key_id; + __u8 deactivated; +}; + +enum { + SCTP_MAX_STREAM = 65535, +}; + +enum sctp_event_timeout { + SCTP_EVENT_TIMEOUT_NONE = 0, + SCTP_EVENT_TIMEOUT_T1_COOKIE = 1, + SCTP_EVENT_TIMEOUT_T1_INIT = 2, + SCTP_EVENT_TIMEOUT_T2_SHUTDOWN = 3, + SCTP_EVENT_TIMEOUT_T3_RTX = 4, + SCTP_EVENT_TIMEOUT_T4_RTO = 5, + SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD = 6, + SCTP_EVENT_TIMEOUT_HEARTBEAT = 7, + SCTP_EVENT_TIMEOUT_RECONF = 8, + SCTP_EVENT_TIMEOUT_PROBE = 9, + SCTP_EVENT_TIMEOUT_SACK = 10, + SCTP_EVENT_TIMEOUT_AUTOCLOSE = 11, +}; + +enum { + SCTP_MAX_DUP_TSNS = 16, +}; + +enum sctp_scope { + SCTP_SCOPE_GLOBAL = 0, + SCTP_SCOPE_PRIVATE = 1, + SCTP_SCOPE_LINK = 2, + SCTP_SCOPE_LOOPBACK = 3, + SCTP_SCOPE_UNUSABLE = 4, +}; + +enum { + SCTP_AUTH_HMAC_ID_RESERVED_0 = 0, + SCTP_AUTH_HMAC_ID_SHA1 = 1, + SCTP_AUTH_HMAC_ID_RESERVED_2 = 2, + SCTP_AUTH_HMAC_ID_SHA256 = 3, + __SCTP_AUTH_HMAC_MAX = 4, +}; + +struct sctp_ulpevent { + struct sctp_association *asoc; + struct sctp_chunk *chunk; + unsigned int rmem_len; + union { + __u32 mid; + __u16 ssn; + }; + union { + __u32 ppid; + __u32 fsn; + }; + __u32 tsn; + __u32 cumtsn; + __u16 stream; + __u16 flags; + __u16 msg_flags; +} __attribute__((packed)); + +union sctp_addr_param; + +union sctp_params { + void *v; + struct sctp_paramhdr *p; + struct sctp_cookie_preserve_param *life; + struct sctp_hostname_param *dns; + struct sctp_cookie_param *cookie; + struct sctp_supported_addrs_param *sat; + struct sctp_ipv4addr_param *v4; + struct sctp_ipv6addr_param *v6; + union sctp_addr_param *addr; + struct sctp_adaptation_ind_param *aind; + struct sctp_supported_ext_param *ext; + struct sctp_random_param *random; + struct sctp_chunks_param *chunks; + struct sctp_hmac_algo_param *hmac_algo; + struct sctp_addip_param *addip; +}; + +struct sctp_sender_hb_info; + +struct sctp_signed_cookie; + +struct sctp_datamsg; + +struct sctp_chunk { + struct list_head list; + refcount_t refcnt; + int sent_count; + union { + struct list_head transmitted_list; + struct list_head stream_list; + }; + struct list_head frag_list; + struct sk_buff *skb; + union { + struct sk_buff *head_skb; + struct sctp_shared_key *shkey; + }; + union sctp_params param_hdr; + union { + __u8 *v; + struct sctp_datahdr *data_hdr; + struct sctp_inithdr *init_hdr; + struct sctp_sackhdr *sack_hdr; + struct sctp_heartbeathdr *hb_hdr; + struct sctp_sender_hb_info *hbs_hdr; + struct sctp_shutdownhdr *shutdown_hdr; + struct sctp_signed_cookie *cookie_hdr; + struct sctp_ecnehdr *ecne_hdr; + struct sctp_cwrhdr *ecn_cwr_hdr; + struct sctp_errhdr *err_hdr; + struct sctp_addiphdr *addip_hdr; + struct sctp_fwdtsn_hdr *fwdtsn_hdr; + struct sctp_authhdr *auth_hdr; + struct sctp_idatahdr *idata_hdr; + struct sctp_ifwdtsn_hdr *ifwdtsn_hdr; + } subh; + __u8 *chunk_end; + struct sctp_chunkhdr *chunk_hdr; + struct sctphdr *sctp_hdr; + struct sctp_sndrcvinfo sinfo; + struct sctp_association *asoc; + struct sctp_ep_common *rcvr; + long unsigned int sent_at; + union sctp_addr source; + union sctp_addr dest; + struct sctp_datamsg *msg; + struct sctp_transport *transport; + struct sk_buff *auth_chunk; + __u16 rtt_in_progress: 1; + __u16 has_tsn: 1; + __u16 has_ssn: 1; + __u16 singleton: 1; + __u16 end_of_packet: 1; + __u16 ecn_ce_done: 1; + __u16 pdiscard: 1; + __u16 tsn_gap_acked: 1; + __u16 data_accepted: 1; + __u16 auth: 1; + __u16 has_asconf: 1; + __u16 pmtu_probe: 1; + __u16 tsn_missing_report: 2; + __u16 fast_retransmit: 2; +}; + +struct sctp_stream_interleave { + __u16 data_chunk_len; + __u16 ftsn_chunk_len; + struct sctp_chunk * (*make_datafrag)(const struct sctp_association *, const struct sctp_sndrcvinfo *, int, __u8, gfp_t); + void (*assign_number)(struct sctp_chunk *); + bool (*validate_data)(struct sctp_chunk *); + int (*ulpevent_data)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); + int (*enqueue_event)(struct sctp_ulpq *, struct sctp_ulpevent *); + void (*renege_events)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); + void (*start_pd)(struct sctp_ulpq *, gfp_t); + void (*abort_pd)(struct sctp_ulpq *, gfp_t); + void (*generate_ftsn)(struct sctp_outq *, __u32); + bool (*validate_ftsn)(struct sctp_chunk *); + void (*report_ftsn)(struct sctp_ulpq *, __u32); + void (*handle_ftsn)(struct sctp_ulpq *, struct sctp_chunk *); +}; + +struct sctp_bind_bucket { + short unsigned int port; + signed char fastreuse; + signed char fastreuseport; + kuid_t fastuid; + struct hlist_node node; + struct hlist_head owner; + struct net *net; +}; + +enum sctp_socket_type { + SCTP_SOCKET_UDP = 0, + SCTP_SOCKET_UDP_HIGH_BANDWIDTH = 1, + SCTP_SOCKET_TCP = 2, +}; + +struct crypto_shash; + +struct sctp_pf; + +struct sctp_sock { + struct inet_sock inet; + enum sctp_socket_type type; + struct sctp_pf *pf; + struct crypto_shash *hmac; + char *sctp_hmac_alg; + struct sctp_endpoint *ep; + struct sctp_bind_bucket *bind_hash; + __u16 default_stream; + __u32 default_ppid; + __u16 default_flags; + __u32 default_context; + __u32 default_timetolive; + __u32 default_rcv_context; + int max_burst; + __u32 hbinterval; + __u32 probe_interval; + __be16 udp_port; + __be16 encap_port; + __u16 pathmaxrxt; + __u32 flowlabel; + __u8 dscp; + __u16 pf_retrans; + __u16 ps_retrans; + __u32 pathmtu; + __u32 sackdelay; + __u32 sackfreq; + __u32 param_flags; + __u32 default_ss; + struct sctp_rtoinfo rtoinfo; + struct sctp_paddrparams paddrparam; + struct sctp_assocparams assocparams; + __u16 subscribe; + struct sctp_initmsg initmsg; + int user_frag; + __u32 autoclose; + __u32 adaptation_ind; + __u32 pd_point; + __u16 nodelay: 1; + __u16 pf_expose: 2; + __u16 reuse: 1; + __u16 disable_fragments: 1; + __u16 v4mapped: 1; + __u16 frag_interleave: 1; + __u16 recvrcvinfo: 1; + __u16 recvnxtinfo: 1; + __u16 data_ready_signalled: 1; + atomic_t pd_mode; + struct sk_buff_head pd_lobby; + struct list_head auto_asconf_list; + int do_auto_asconf; + long: 32; +}; + +struct sctp_af; + +struct sctp_pf { + void (*event_msgname)(struct sctp_ulpevent *, char *, int *); + void (*skb_msgname)(struct sk_buff *, char *, int *); + int (*af_supported)(sa_family_t, struct sctp_sock *); + int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *, struct sctp_sock *); + int (*bind_verify)(struct sctp_sock *, union sctp_addr *); + int (*send_verify)(struct sctp_sock *, union sctp_addr *); + int (*supported_addrs)(const struct sctp_sock *, __be16 *); + struct sock * (*create_accept_sk)(struct sock *, struct sctp_association *, bool); + int (*addr_to_user)(struct sctp_sock *, union sctp_addr *); + void (*to_sk_saddr)(union sctp_addr *, struct sock *); + void (*to_sk_daddr)(union sctp_addr *, struct sock *); + void (*copy_ip_options)(struct sock *, struct sock *); + struct sctp_af *af; +}; + +struct sctp_endpoint { + struct sctp_ep_common base; + struct hlist_node node; + int hashent; + struct list_head asocs; + __u8 secret_key[32]; + __u8 *digest; + __u32 sndbuf_policy; + __u32 rcvbuf_policy; + struct crypto_shash **auth_hmacs; + struct sctp_hmac_algo_param *auth_hmacs_list; + struct sctp_chunks_param *auth_chunk_list; + struct list_head endpoint_shared_keys; + __u16 active_key_id; + __u8 ecn_enable: 1; + __u8 auth_enable: 1; + __u8 intl_enable: 1; + __u8 prsctp_enable: 1; + __u8 asconf_enable: 1; + __u8 reconf_enable: 1; + __u8 strreset_enable; + struct callback_head rcu; +}; + +struct sctp_signed_cookie { + __u8 signature[32]; + __u32 __pad; + struct sctp_cookie c; +}; + +union sctp_addr_param { + struct sctp_paramhdr p; + struct sctp_ipv4addr_param v4; + struct sctp_ipv6addr_param v6; +}; + +struct sctp_sender_hb_info { + struct sctp_paramhdr param_hdr; + union sctp_addr daddr; + long unsigned int sent_at; + long: 32; + __u64 hb_nonce; + __u32 probe_size; + long: 32; +}; + +struct sctp_af { + int (*sctp_xmit)(struct sk_buff *, struct sctp_transport *); + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*get_dst)(struct sctp_transport *, union sctp_addr *, struct flowi *, struct sock *); + void (*get_saddr)(struct sctp_sock *, struct sctp_transport *, struct flowi *); + void (*copy_addrlist)(struct list_head *, struct net_device *); + int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *); + void (*addr_copy)(union sctp_addr *, union sctp_addr *); + void (*from_skb)(union sctp_addr *, struct sk_buff *, int); + void (*from_sk)(union sctp_addr *, struct sock *); + bool (*from_addr_param)(union sctp_addr *, union sctp_addr_param *, __be16, int); + int (*to_addr_param)(const union sctp_addr *, union sctp_addr_param *); + int (*addr_valid)(union sctp_addr *, struct sctp_sock *, const struct sk_buff *); + enum sctp_scope (*scope)(union sctp_addr *); + void (*inaddr_any)(union sctp_addr *, __be16); + int (*is_any)(const union sctp_addr *); + int (*available)(union sctp_addr *, struct sctp_sock *); + int (*skb_iif)(const struct sk_buff *); + int (*skb_sdif)(const struct sk_buff *); + int (*is_ce)(const struct sk_buff *); + void (*seq_dump_addr)(struct seq_file *, union sctp_addr *); + void (*ecn_capable)(struct sock *); + __u16 net_header_len; + int sockaddr_len; + int (*ip_options_len)(struct sock *); + sa_family_t sa_family; + struct list_head list; +}; + +struct sctp_packet { + __u16 source_port; + __u16 destination_port; + __u32 vtag; + struct list_head chunk_list; + size_t overhead; + size_t size; + size_t max_size; + struct sctp_transport *transport; + struct sctp_chunk *auth; + u8 has_cookie_echo: 1; + u8 has_sack: 1; + u8 has_auth: 1; + u8 has_data: 1; + u8 ipfragok: 1; +}; + +struct sctp_transport { + struct list_head transports; + struct rhlist_head node; + refcount_t refcnt; + __u32 rto_pending: 1; + __u32 hb_sent: 1; + __u32 pmtu_pending: 1; + __u32 dst_pending_confirm: 1; + __u32 sack_generation: 1; + u32 dst_cookie; + long: 32; + struct flowi fl; + union sctp_addr ipaddr; + struct sctp_af *af_specific; + struct sctp_association *asoc; + long unsigned int rto; + __u32 rtt; + __u32 rttvar; + __u32 srtt; + __u32 cwnd; + __u32 ssthresh; + __u32 partial_bytes_acked; + __u32 flight_size; + __u32 burst_limited; + struct dst_entry *dst; + union sctp_addr saddr; + long unsigned int hbinterval; + long unsigned int probe_interval; + long unsigned int sackdelay; + __u32 sackfreq; + atomic_t mtu_info; + long: 32; + ktime_t last_time_heard; + long unsigned int last_time_sent; + long unsigned int last_time_ecne_reduced; + __be16 encap_port; + __u16 pathmaxrxt; + __u32 flowlabel; + __u8 dscp; + __u16 pf_retrans; + __u16 ps_retrans; + __u32 pathmtu; + __u32 param_flags; + int init_sent_count; + int state; + short unsigned int error_count; + struct timer_list T3_rtx_timer; + struct timer_list hb_timer; + struct timer_list proto_unreach_timer; + struct timer_list reconf_timer; + struct timer_list probe_timer; + struct list_head transmitted; + struct sctp_packet packet; + struct list_head send_ready; + struct { + __u32 next_tsn_at_change; + char changeover_active; + char cycling_changeover; + char cacc_saw_newack; + } cacc; + struct { + __u16 pmtu; + __u16 probe_size; + __u16 probe_high; + __u8 probe_count; + __u8 state; + } pl; + __u64 hb_nonce; + struct callback_head rcu; +}; + +struct sctp_datamsg { + struct list_head chunks; + refcount_t refcnt; + long unsigned int expires_at; + int send_error; + u8 send_failed: 1; + u8 can_delay: 1; + u8 abandoned: 1; +}; + +struct sctp_stream_priorities { + struct list_head prio_sched; + struct list_head active; + struct sctp_stream_out_ext *next; + __u16 prio; +}; + +struct sctp_stream_out_ext { + __u64 abandoned_unsent[3]; + __u64 abandoned_sent[3]; + struct list_head outq; + union { + struct { + struct list_head prio_list; + struct sctp_stream_priorities *prio_head; + }; + struct { + struct list_head rr_list; + }; + }; + long: 32; +}; + +struct task_security_struct { + u32 osid; + u32 sid; + u32 exec_sid; + u32 create_sid; + u32 keycreate_sid; + u32 sockcreate_sid; +}; + +enum label_initialized { + LABEL_INVALID = 0, + LABEL_INITIALIZED = 1, + LABEL_PENDING = 2, +}; + +struct inode_security_struct { + struct inode *inode; + struct list_head list; + u32 task_sid; + u32 sid; + u16 sclass; + unsigned char initialized; + spinlock_t lock; +}; + +struct file_security_struct { + u32 sid; + u32 fown_sid; + u32 isid; + u32 pseqno; +}; + +struct superblock_security_struct { + u32 sid; + u32 def_sid; + u32 mntpoint_sid; + short unsigned int behavior; + short unsigned int flags; + struct mutex lock; + struct list_head isec_head; + spinlock_t isec_lock; +}; + +struct msg_security_struct { + u32 sid; +}; + +struct ipc_security_struct { + u16 sclass; + u32 sid; +}; + +struct sk_security_struct { + enum { + NLBL_UNSET = 0, + NLBL_REQUIRE = 1, + NLBL_LABELED = 2, + NLBL_REQSKB = 3, + NLBL_CONNLABELED = 4, + } nlbl_state; + struct netlbl_lsm_secattr *nlbl_secattr; + u32 sid; + u32 peer_sid; + u16 sclass; + enum { + SCTP_ASSOC_UNSET = 0, + SCTP_ASSOC_SET = 1, + } sctp_assoc_state; +}; + +struct tun_security_struct { + u32 sid; +}; + +struct key_security_struct { + u32 sid; +}; + +struct bpf_security_struct { + u32 sid; +}; + +struct perf_event_security_struct { + u32 sid; +}; + +struct rt6_exception_bucket { + struct hlist_head chain; + int depth; +}; + +struct xfrm_type { + struct module *owner; + u8 proto; + u8 flags; + int (*init_state)(struct xfrm_state *, struct netlink_ext_ack *); + void (*destructor)(struct xfrm_state *); + int (*input)(struct xfrm_state *, struct sk_buff *); + int (*output)(struct xfrm_state *, struct sk_buff *); + int (*reject)(struct xfrm_state *, struct sk_buff *, const struct flowi *); +}; + +struct xfrm_type_offload { + struct module *owner; + u8 proto; + void (*encap)(struct xfrm_state *, struct sk_buff *); + int (*input_tail)(struct xfrm_state *, struct sk_buff *); + int (*xmit)(struct xfrm_state *, struct sk_buff *, netdev_features_t); +}; + +struct selinux_mnt_opts { + u32 fscontext_sid; + u32 context_sid; + u32 rootcontext_sid; + u32 defcontext_sid; +}; + +enum { + Opt_error = 4294967295, + Opt_context = 0, + Opt_defcontext = 1, + Opt_fscontext = 2, + Opt_rootcontext = 3, + Opt_seclabel = 4, +}; + +struct selinux_policy_convert_data; + +struct selinux_load_state { + struct selinux_policy *policy; + struct selinux_policy_convert_data *convert_data; +}; + +enum sel_inos { + SEL_ROOT_INO = 2, + SEL_LOAD = 3, + SEL_ENFORCE = 4, + SEL_CONTEXT = 5, + SEL_ACCESS = 6, + SEL_CREATE = 7, + SEL_RELABEL = 8, + SEL_USER = 9, + SEL_POLICYVERS = 10, + SEL_COMMIT_BOOLS = 11, + SEL_MLS = 12, + SEL_DISABLE = 13, + SEL_MEMBER = 14, + SEL_CHECKREQPROT = 15, + SEL_COMPAT_NET = 16, + SEL_REJECT_UNKNOWN = 17, + SEL_DENY_UNKNOWN = 18, + SEL_STATUS = 19, + SEL_POLICY = 20, + SEL_VALIDATE_TRANS = 21, + SEL_INO_NEXT = 22, +}; + +struct selinux_fs_info { + struct dentry *bool_dir; + unsigned int bool_num; + char **bool_pending_names; + int *bool_pending_values; + struct dentry *class_dir; + long unsigned int last_class_ino; + bool policy_opened; + struct dentry *policycap_dir; + long unsigned int last_ino; + struct selinux_state *state; + struct super_block *sb; +}; + +struct policy_load_memory { + size_t len; + void *data; +}; + +enum { + SELNL_MSG_SETENFORCE = 16, + SELNL_MSG_POLICYLOAD = 17, + SELNL_MSG_MAX = 18, +}; + +enum selinux_nlgroups { + SELNLGRP_NONE = 0, + SELNLGRP_AVC = 1, + __SELNLGRP_MAX = 2, +}; + +struct selnl_msg_setenforce { + __s32 val; +}; + +struct selnl_msg_policyload { + __u32 seqno; +}; + +enum { + RTM_BASE = 16, + RTM_NEWLINK = 16, + RTM_DELLINK = 17, + RTM_GETLINK = 18, + RTM_SETLINK = 19, + RTM_NEWADDR = 20, + RTM_DELADDR = 21, + RTM_GETADDR = 22, + RTM_NEWROUTE = 24, + RTM_DELROUTE = 25, + RTM_GETROUTE = 26, + RTM_NEWNEIGH = 28, + RTM_DELNEIGH = 29, + RTM_GETNEIGH = 30, + RTM_NEWRULE = 32, + RTM_DELRULE = 33, + RTM_GETRULE = 34, + RTM_NEWQDISC = 36, + RTM_DELQDISC = 37, + RTM_GETQDISC = 38, + RTM_NEWTCLASS = 40, + RTM_DELTCLASS = 41, + RTM_GETTCLASS = 42, + RTM_NEWTFILTER = 44, + RTM_DELTFILTER = 45, + RTM_GETTFILTER = 46, + RTM_NEWACTION = 48, + RTM_DELACTION = 49, + RTM_GETACTION = 50, + RTM_NEWPREFIX = 52, + RTM_GETMULTICAST = 58, + RTM_GETANYCAST = 62, + RTM_NEWNEIGHTBL = 64, + RTM_GETNEIGHTBL = 66, + RTM_SETNEIGHTBL = 67, + RTM_NEWNDUSEROPT = 68, + RTM_NEWADDRLABEL = 72, + RTM_DELADDRLABEL = 73, + RTM_GETADDRLABEL = 74, + RTM_GETDCB = 78, + RTM_SETDCB = 79, + RTM_NEWNETCONF = 80, + RTM_DELNETCONF = 81, + RTM_GETNETCONF = 82, + RTM_NEWMDB = 84, + RTM_DELMDB = 85, + RTM_GETMDB = 86, + RTM_NEWNSID = 88, + RTM_DELNSID = 89, + RTM_GETNSID = 90, + RTM_NEWSTATS = 92, + RTM_GETSTATS = 94, + RTM_SETSTATS = 95, + RTM_NEWCACHEREPORT = 96, + RTM_NEWCHAIN = 100, + RTM_DELCHAIN = 101, + RTM_GETCHAIN = 102, + RTM_NEWNEXTHOP = 104, + RTM_DELNEXTHOP = 105, + RTM_GETNEXTHOP = 106, + RTM_NEWLINKPROP = 108, + RTM_DELLINKPROP = 109, + RTM_GETLINKPROP = 110, + RTM_NEWVLAN = 112, + RTM_DELVLAN = 113, + RTM_GETVLAN = 114, + RTM_NEWNEXTHOPBUCKET = 116, + RTM_DELNEXTHOPBUCKET = 117, + RTM_GETNEXTHOPBUCKET = 118, + RTM_NEWTUNNEL = 120, + RTM_DELTUNNEL = 121, + RTM_GETTUNNEL = 122, + __RTM_MAX = 123, +}; + +enum { + INET_DIAG_REQ_NONE = 0, + INET_DIAG_REQ_BYTECODE = 1, + INET_DIAG_REQ_SK_BPF_STORAGES = 2, + INET_DIAG_REQ_PROTOCOL = 3, + __INET_DIAG_REQ_MAX = 4, +}; + +struct nlmsg_perm { + u16 nlmsg_type; + u32 perm; +}; + +struct netif_security_struct { + struct net *ns; + int ifindex; + u32 sid; +}; + +struct sel_netif { + struct list_head list; + struct netif_security_struct nsec; + struct callback_head callback_head; +}; + +struct netnode_security_struct { + union { + __be32 ipv4; + struct in6_addr ipv6; + } addr; + u32 sid; + u16 family; +}; + +struct sel_netnode_bkt { + unsigned int size; + struct list_head list; +}; + +struct sel_netnode { + struct netnode_security_struct nsec; + struct list_head list; + struct callback_head rcu; +}; + +struct netport_security_struct { + u32 sid; + u16 port; + u8 protocol; +}; + +struct sel_netport_bkt { + int size; + struct list_head list; +}; + +struct sel_netport { + struct netport_security_struct psec; + struct list_head list; + struct callback_head rcu; +}; + +struct selinux_kernel_status { + u32 version; + u32 sequence; + u32 enforcing; + u32 policyload; + u32 deny_unknown; +}; + +struct ebitmap_node { + struct ebitmap_node *next; + long unsigned int maps[6]; + u32 startbit; +}; + +struct ebitmap { + struct ebitmap_node *node; + u32 highbit; +}; + +struct policy_file { + char *data; + size_t len; +}; + +struct hashtab_node { + void *key; + void *datum; + struct hashtab_node *next; +}; + +struct hashtab { + struct hashtab_node **htable; + u32 size; + u32 nel; +}; + +struct hashtab_info { + u32 slots_used; + u32 max_chain_len; +}; + +struct hashtab_key_params { + u32 (*hash)(const void *); + int (*cmp)(const void *, const void *); +}; + +struct symtab { + struct hashtab table; + u32 nprim; +}; + +struct avtab_node; + +struct avtab { + struct avtab_node **htable; + u32 nel; + u32 nslot; + u32 mask; +}; + +struct class_datum; + +struct role_datum; + +struct user_datum; + +struct type_datum; + +struct cond_bool_datum; + +struct cond_node; + +struct role_allow; + +struct ocontext; + +struct genfs; + +struct policydb { + int mls_enabled; + struct symtab symtab[8]; + char **sym_val_to_name[8]; + struct class_datum **class_val_to_struct; + struct role_datum **role_val_to_struct; + struct user_datum **user_val_to_struct; + struct type_datum **type_val_to_struct; + struct avtab te_avtab; + struct hashtab role_tr; + struct ebitmap filename_trans_ttypes; + struct hashtab filename_trans; + u32 compat_filename_trans_count; + struct cond_bool_datum **bool_val_to_struct; + struct avtab te_cond_avtab; + struct cond_node *cond_list; + u32 cond_list_len; + struct role_allow *role_allow; + struct ocontext *ocontexts[9]; + struct genfs *genfs; + struct hashtab range_tr; + struct ebitmap *type_attr_map_array; + struct ebitmap policycaps; + struct ebitmap permissive_map; + size_t len; + unsigned int policyvers; + unsigned int reject_unknown: 1; + unsigned int allow_unknown: 1; + u16 process_class; + u32 process_trans_perms; +}; + +struct selinux_mapping; + +struct selinux_map { + struct selinux_mapping *mapping; + u16 size; +}; + +struct sidtab; + +struct selinux_policy { + struct sidtab *sidtab; + struct policydb policydb; + struct selinux_map map; + u32 latest_granting; +}; + +struct mls_level { + u32 sens; + struct ebitmap cat; +}; + +struct mls_range { + struct mls_level level[2]; +}; + +struct context { + u32 user; + u32 role; + u32 type; + u32 len; + struct mls_range range; + char *str; +}; + +struct sidtab_str_cache; + +struct sidtab_entry { + u32 sid; + u32 hash; + struct context context; + struct sidtab_str_cache *cache; + struct hlist_node list; +}; + +struct sidtab_str_cache { + struct callback_head rcu_member; + struct list_head lru_member; + struct sidtab_entry *parent; + u32 len; + char str[0]; +}; + +struct sidtab_node_inner; + +struct sidtab_node_leaf; + +union sidtab_entry_inner { + struct sidtab_node_inner *ptr_inner; + struct sidtab_node_leaf *ptr_leaf; +}; + +struct sidtab_node_inner { + union sidtab_entry_inner entries[1024]; +}; + +struct sidtab_node_leaf { + struct sidtab_entry entries[64]; +}; + +struct sidtab_isid_entry { + int set; + struct sidtab_entry entry; +}; + +struct convert_context_args; + +struct sidtab_convert_params { + struct convert_context_args *args; + struct sidtab *target; +}; + +struct convert_context_args { + struct selinux_state *state; + struct policydb *oldp; + struct policydb *newp; +}; + +struct sidtab { + union sidtab_entry_inner roots[4]; + u32 count; + struct sidtab_convert_params *convert; + bool frozen; + spinlock_t lock; + u32 cache_free_slots; + struct list_head cache_lru_list; + spinlock_t cache_lock; + struct sidtab_isid_entry isids[27]; + struct hlist_head context_to_sid[512]; +}; + +struct avtab_key { + u16 source_type; + u16 target_type; + u16 target_class; + u16 specified; +}; + +struct avtab_extended_perms { + u8 specified; + u8 driver; + struct extended_perms_data perms; +}; + +struct avtab_datum { + union { + u32 data; + struct avtab_extended_perms *xperms; + } u; +}; + +struct avtab_node { + struct avtab_key key; + struct avtab_datum datum; + struct avtab_node *next; +}; + +struct type_set; + +struct constraint_expr { + u32 expr_type; + u32 attr; + u32 op; + struct ebitmap names; + struct type_set *type_names; + struct constraint_expr *next; +}; + +struct type_set { + struct ebitmap types; + struct ebitmap negset; + u32 flags; +}; + +struct constraint_node { + u32 permissions; + struct constraint_expr *expr; + struct constraint_node *next; +}; + +struct common_datum { + u32 value; + struct symtab permissions; +}; + +struct class_datum { + u32 value; + char *comkey; + struct common_datum *comdatum; + struct symtab permissions; + struct constraint_node *constraints; + struct constraint_node *validatetrans; + char default_user; + char default_role; + char default_type; + char default_range; +}; + +struct role_datum { + u32 value; + u32 bounds; + struct ebitmap dominates; + struct ebitmap types; +}; + +struct role_allow { + u32 role; + u32 new_role; + struct role_allow *next; +}; + +struct type_datum { + u32 value; + u32 bounds; + unsigned char primary; + unsigned char attribute; +}; + +struct user_datum { + u32 value; + u32 bounds; + struct ebitmap roles; + struct mls_range range; + struct mls_level dfltlevel; +}; + +struct cond_bool_datum { + __u32 value; + int state; +}; + +struct ocontext { + union { + char *name; + struct { + u8 protocol; + u16 low_port; + u16 high_port; + } port; + struct { + u32 addr; + u32 mask; + } node; + struct { + u32 addr[4]; + u32 mask[4]; + } node6; + struct { + u64 subnet_prefix; + u16 low_pkey; + u16 high_pkey; + long: 32; + } ibpkey; + struct { + char *dev_name; + u8 port; + } ibendport; + } u; + union { + u32 sclass; + u32 behavior; + } v; + struct context context[2]; + u32 sid[2]; + struct ocontext *next; +}; + +struct genfs { + char *fstype; + struct ocontext *head; + struct genfs *next; +}; + +struct selinux_mapping { + u16 value; + unsigned int num_perms; + u32 perms[32]; +}; + +struct perm_datum { + u32 value; +}; + +struct role_trans_key { + u32 role; + u32 type; + u32 tclass; +}; + +struct role_trans_datum { + u32 new_role; +}; + +struct filename_trans_key { + u32 ttype; + u16 tclass; + const char *name; +}; + +struct filename_trans_datum { + struct ebitmap stypes; + u32 otype; + struct filename_trans_datum *next; +}; + +struct level_datum { + struct mls_level *level; + unsigned char isalias; +}; + +struct cat_datum { + u32 value; + unsigned char isalias; +}; + +struct range_trans { + u32 source_type; + u32 target_type; + u32 target_class; +}; + +struct cond_expr_node; + +struct cond_expr { + struct cond_expr_node *nodes; + u32 len; +}; + +struct cond_av_list { + struct avtab_node **nodes; + u32 len; +}; + +struct cond_node { + int cur_state; + struct cond_expr expr; + struct cond_av_list true_list; + struct cond_av_list false_list; +}; + +struct policy_data { + struct policydb *p; + void *fp; +}; + +struct cond_expr_node { + u32 expr_type; + u32 bool; +}; + +struct policydb_compat_info { + int version; + int sym_num; + int ocon_num; +}; + +struct selinux_policy_convert_data { + struct convert_context_args args; + struct sidtab_convert_params sidtab_params; +}; + +struct selinux_audit_rule { + u32 au_seqno; + struct context au_ctxt; +}; + +struct cond_insertf_data { + struct policydb *p; + struct avtab_node **dst; + struct cond_av_list *other; +}; + +struct udp_hslot; + +struct udp_table { + struct udp_hslot *hash; + struct udp_hslot *hash2; + unsigned int mask; + unsigned int log; +}; + +struct xfrm_dst { + union { + struct dst_entry dst; + struct rtable rt; + struct rt6_info rt6; + } u; + struct dst_entry *route; + struct dst_entry *child; + struct dst_entry *path; + struct xfrm_policy *pols[2]; + int num_pols; + int num_xfrms; + u32 xfrm_genid; + u32 policy_genid; + u32 route_mtu_cached; + u32 child_mtu_cached; + u32 route_cookie; + u32 path_cookie; +}; + +struct xfrm_offload { + struct { + __u32 low; + __u32 hi; + } seq; + __u32 flags; + __u32 status; + __u8 proto; + __u8 inner_ipproto; +}; + +struct sec_path { + int len; + int olen; + struct xfrm_state *xvec[6]; + struct xfrm_offload ovec[1]; +}; + +struct udp_hslot { + struct hlist_head head; + int count; + spinlock_t lock; + long: 32; +}; + +struct sockaddr_un { + __kernel_sa_family_t sun_family; + char sun_path[108]; +}; + +struct unix_address { + refcount_t refcnt; + int len; + struct sockaddr_un name[0]; +}; + +struct scm_stat { + atomic_t nr_fds; +}; + +struct unix_sock { + struct sock sk; + struct unix_address *addr; + struct path path; + struct mutex iolock; + struct mutex bindlock; + struct sock *peer; + struct list_head link; + atomic_long_t inflight; + spinlock_t lock; + long unsigned int gc_flags; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct socket_wq peer_wq; + wait_queue_entry_t peer_wake; + struct scm_stat scm_stat; + struct sk_buff *oob_skb; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +enum tomoyo_conditions_index { + TOMOYO_TASK_UID = 0, + TOMOYO_TASK_EUID = 1, + TOMOYO_TASK_SUID = 2, + TOMOYO_TASK_FSUID = 3, + TOMOYO_TASK_GID = 4, + TOMOYO_TASK_EGID = 5, + TOMOYO_TASK_SGID = 6, + TOMOYO_TASK_FSGID = 7, + TOMOYO_TASK_PID = 8, + TOMOYO_TASK_PPID = 9, + TOMOYO_EXEC_ARGC = 10, + TOMOYO_EXEC_ENVC = 11, + TOMOYO_TYPE_IS_SOCKET = 12, + TOMOYO_TYPE_IS_SYMLINK = 13, + TOMOYO_TYPE_IS_FILE = 14, + TOMOYO_TYPE_IS_BLOCK_DEV = 15, + TOMOYO_TYPE_IS_DIRECTORY = 16, + TOMOYO_TYPE_IS_CHAR_DEV = 17, + TOMOYO_TYPE_IS_FIFO = 18, + TOMOYO_MODE_SETUID = 19, + TOMOYO_MODE_SETGID = 20, + TOMOYO_MODE_STICKY = 21, + TOMOYO_MODE_OWNER_READ = 22, + TOMOYO_MODE_OWNER_WRITE = 23, + TOMOYO_MODE_OWNER_EXECUTE = 24, + TOMOYO_MODE_GROUP_READ = 25, + TOMOYO_MODE_GROUP_WRITE = 26, + TOMOYO_MODE_GROUP_EXECUTE = 27, + TOMOYO_MODE_OTHERS_READ = 28, + TOMOYO_MODE_OTHERS_WRITE = 29, + TOMOYO_MODE_OTHERS_EXECUTE = 30, + TOMOYO_EXEC_REALPATH = 31, + TOMOYO_SYMLINK_TARGET = 32, + TOMOYO_PATH1_UID = 33, + TOMOYO_PATH1_GID = 34, + TOMOYO_PATH1_INO = 35, + TOMOYO_PATH1_MAJOR = 36, + TOMOYO_PATH1_MINOR = 37, + TOMOYO_PATH1_PERM = 38, + TOMOYO_PATH1_TYPE = 39, + TOMOYO_PATH1_DEV_MAJOR = 40, + TOMOYO_PATH1_DEV_MINOR = 41, + TOMOYO_PATH2_UID = 42, + TOMOYO_PATH2_GID = 43, + TOMOYO_PATH2_INO = 44, + TOMOYO_PATH2_MAJOR = 45, + TOMOYO_PATH2_MINOR = 46, + TOMOYO_PATH2_PERM = 47, + TOMOYO_PATH2_TYPE = 48, + TOMOYO_PATH2_DEV_MAJOR = 49, + TOMOYO_PATH2_DEV_MINOR = 50, + TOMOYO_PATH1_PARENT_UID = 51, + TOMOYO_PATH1_PARENT_GID = 52, + TOMOYO_PATH1_PARENT_INO = 53, + TOMOYO_PATH1_PARENT_PERM = 54, + TOMOYO_PATH2_PARENT_UID = 55, + TOMOYO_PATH2_PARENT_GID = 56, + TOMOYO_PATH2_PARENT_INO = 57, + TOMOYO_PATH2_PARENT_PERM = 58, + TOMOYO_MAX_CONDITION_KEYWORD = 59, + TOMOYO_NUMBER_UNION = 60, + TOMOYO_NAME_UNION = 61, + TOMOYO_ARGV_ENTRY = 62, + TOMOYO_ENVP_ENTRY = 63, +}; + +enum tomoyo_path_stat_index { + TOMOYO_PATH1 = 0, + TOMOYO_PATH1_PARENT = 1, + TOMOYO_PATH2 = 2, + TOMOYO_PATH2_PARENT = 3, + TOMOYO_MAX_PATH_STAT = 4, +}; + +enum tomoyo_mode_index { + TOMOYO_CONFIG_DISABLED = 0, + TOMOYO_CONFIG_LEARNING = 1, + TOMOYO_CONFIG_PERMISSIVE = 2, + TOMOYO_CONFIG_ENFORCING = 3, + TOMOYO_CONFIG_MAX_MODE = 4, + TOMOYO_CONFIG_WANT_REJECT_LOG = 64, + TOMOYO_CONFIG_WANT_GRANT_LOG = 128, + TOMOYO_CONFIG_USE_DEFAULT = 255, +}; + +enum tomoyo_policy_id { + TOMOYO_ID_GROUP = 0, + TOMOYO_ID_ADDRESS_GROUP = 1, + TOMOYO_ID_PATH_GROUP = 2, + TOMOYO_ID_NUMBER_GROUP = 3, + TOMOYO_ID_TRANSITION_CONTROL = 4, + TOMOYO_ID_AGGREGATOR = 5, + TOMOYO_ID_MANAGER = 6, + TOMOYO_ID_CONDITION = 7, + TOMOYO_ID_NAME = 8, + TOMOYO_ID_ACL = 9, + TOMOYO_ID_DOMAIN = 10, + TOMOYO_MAX_POLICY = 11, +}; + +enum tomoyo_domain_info_flags_index { + TOMOYO_DIF_QUOTA_WARNED = 0, + TOMOYO_DIF_TRANSITION_FAILED = 1, + TOMOYO_MAX_DOMAIN_INFO_FLAGS = 2, +}; + +enum tomoyo_grant_log { + TOMOYO_GRANTLOG_AUTO = 0, + TOMOYO_GRANTLOG_NO = 1, + TOMOYO_GRANTLOG_YES = 2, +}; + +enum tomoyo_group_id { + TOMOYO_PATH_GROUP = 0, + TOMOYO_NUMBER_GROUP = 1, + TOMOYO_ADDRESS_GROUP = 2, + TOMOYO_MAX_GROUP = 3, +}; + +enum tomoyo_path_acl_index { + TOMOYO_TYPE_EXECUTE = 0, + TOMOYO_TYPE_READ = 1, + TOMOYO_TYPE_WRITE = 2, + TOMOYO_TYPE_APPEND = 3, + TOMOYO_TYPE_UNLINK = 4, + TOMOYO_TYPE_GETATTR = 5, + TOMOYO_TYPE_RMDIR = 6, + TOMOYO_TYPE_TRUNCATE = 7, + TOMOYO_TYPE_SYMLINK = 8, + TOMOYO_TYPE_CHROOT = 9, + TOMOYO_TYPE_UMOUNT = 10, + TOMOYO_MAX_PATH_OPERATION = 11, +}; + +enum tomoyo_memory_stat_type { + TOMOYO_MEMORY_POLICY = 0, + TOMOYO_MEMORY_AUDIT = 1, + TOMOYO_MEMORY_QUERY = 2, + TOMOYO_MAX_MEMORY_STAT = 3, +}; + +enum tomoyo_mkdev_acl_index { + TOMOYO_TYPE_MKBLOCK = 0, + TOMOYO_TYPE_MKCHAR = 1, + TOMOYO_MAX_MKDEV_OPERATION = 2, +}; + +enum tomoyo_network_acl_index { + TOMOYO_NETWORK_BIND = 0, + TOMOYO_NETWORK_LISTEN = 1, + TOMOYO_NETWORK_CONNECT = 2, + TOMOYO_NETWORK_SEND = 3, + TOMOYO_MAX_NETWORK_OPERATION = 4, +}; + +enum tomoyo_path2_acl_index { + TOMOYO_TYPE_LINK = 0, + TOMOYO_TYPE_RENAME = 1, + TOMOYO_TYPE_PIVOT_ROOT = 2, + TOMOYO_MAX_PATH2_OPERATION = 3, +}; + +enum tomoyo_path_number_acl_index { + TOMOYO_TYPE_CREATE = 0, + TOMOYO_TYPE_MKDIR = 1, + TOMOYO_TYPE_MKFIFO = 2, + TOMOYO_TYPE_MKSOCK = 3, + TOMOYO_TYPE_IOCTL = 4, + TOMOYO_TYPE_CHMOD = 5, + TOMOYO_TYPE_CHOWN = 6, + TOMOYO_TYPE_CHGRP = 7, + TOMOYO_MAX_PATH_NUMBER_OPERATION = 8, +}; + +enum tomoyo_securityfs_interface_index { + TOMOYO_DOMAINPOLICY = 0, + TOMOYO_EXCEPTIONPOLICY = 1, + TOMOYO_PROCESS_STATUS = 2, + TOMOYO_STAT = 3, + TOMOYO_AUDIT = 4, + TOMOYO_VERSION = 5, + TOMOYO_PROFILE = 6, + TOMOYO_QUERY = 7, + TOMOYO_MANAGER = 8, +}; + +enum tomoyo_mac_index { + TOMOYO_MAC_FILE_EXECUTE = 0, + TOMOYO_MAC_FILE_OPEN = 1, + TOMOYO_MAC_FILE_CREATE = 2, + TOMOYO_MAC_FILE_UNLINK = 3, + TOMOYO_MAC_FILE_GETATTR = 4, + TOMOYO_MAC_FILE_MKDIR = 5, + TOMOYO_MAC_FILE_RMDIR = 6, + TOMOYO_MAC_FILE_MKFIFO = 7, + TOMOYO_MAC_FILE_MKSOCK = 8, + TOMOYO_MAC_FILE_TRUNCATE = 9, + TOMOYO_MAC_FILE_SYMLINK = 10, + TOMOYO_MAC_FILE_MKBLOCK = 11, + TOMOYO_MAC_FILE_MKCHAR = 12, + TOMOYO_MAC_FILE_LINK = 13, + TOMOYO_MAC_FILE_RENAME = 14, + TOMOYO_MAC_FILE_CHMOD = 15, + TOMOYO_MAC_FILE_CHOWN = 16, + TOMOYO_MAC_FILE_CHGRP = 17, + TOMOYO_MAC_FILE_IOCTL = 18, + TOMOYO_MAC_FILE_CHROOT = 19, + TOMOYO_MAC_FILE_MOUNT = 20, + TOMOYO_MAC_FILE_UMOUNT = 21, + TOMOYO_MAC_FILE_PIVOT_ROOT = 22, + TOMOYO_MAC_NETWORK_INET_STREAM_BIND = 23, + TOMOYO_MAC_NETWORK_INET_STREAM_LISTEN = 24, + TOMOYO_MAC_NETWORK_INET_STREAM_CONNECT = 25, + TOMOYO_MAC_NETWORK_INET_DGRAM_BIND = 26, + TOMOYO_MAC_NETWORK_INET_DGRAM_SEND = 27, + TOMOYO_MAC_NETWORK_INET_RAW_BIND = 28, + TOMOYO_MAC_NETWORK_INET_RAW_SEND = 29, + TOMOYO_MAC_NETWORK_UNIX_STREAM_BIND = 30, + TOMOYO_MAC_NETWORK_UNIX_STREAM_LISTEN = 31, + TOMOYO_MAC_NETWORK_UNIX_STREAM_CONNECT = 32, + TOMOYO_MAC_NETWORK_UNIX_DGRAM_BIND = 33, + TOMOYO_MAC_NETWORK_UNIX_DGRAM_SEND = 34, + TOMOYO_MAC_NETWORK_UNIX_SEQPACKET_BIND = 35, + TOMOYO_MAC_NETWORK_UNIX_SEQPACKET_LISTEN = 36, + TOMOYO_MAC_NETWORK_UNIX_SEQPACKET_CONNECT = 37, + TOMOYO_MAC_ENVIRON = 38, + TOMOYO_MAX_MAC_INDEX = 39, +}; + +enum tomoyo_mac_category_index { + TOMOYO_MAC_CATEGORY_FILE = 0, + TOMOYO_MAC_CATEGORY_NETWORK = 1, + TOMOYO_MAC_CATEGORY_MISC = 2, + TOMOYO_MAX_MAC_CATEGORY_INDEX = 3, +}; + +enum tomoyo_pref_index { + TOMOYO_PREF_MAX_AUDIT_LOG = 0, + TOMOYO_PREF_MAX_LEARNING_ENTRY = 1, + TOMOYO_MAX_PREF = 2, +}; + +struct tomoyo_shared_acl_head { + struct list_head list; + atomic_t users; +}; + +struct tomoyo_path_info { + const char *name; + u32 hash; + u16 const_len; + bool is_dir; + bool is_patterned; +}; + +struct tomoyo_obj_info; + +struct tomoyo_execve; + +struct tomoyo_domain_info; + +struct tomoyo_acl_info; + +struct tomoyo_request_info { + struct tomoyo_obj_info *obj; + struct tomoyo_execve *ee; + struct tomoyo_domain_info *domain; + union { + struct { + const struct tomoyo_path_info *filename; + const struct tomoyo_path_info *matched_path; + u8 operation; + } path; + struct { + const struct tomoyo_path_info *filename1; + const struct tomoyo_path_info *filename2; + u8 operation; + } path2; + struct { + const struct tomoyo_path_info *filename; + unsigned int mode; + unsigned int major; + unsigned int minor; + u8 operation; + } mkdev; + struct { + const struct tomoyo_path_info *filename; + long unsigned int number; + u8 operation; + } path_number; + struct { + const struct tomoyo_path_info *name; + } environ; + struct { + const __be32 *address; + u16 port; + u8 protocol; + u8 operation; + bool is_ipv6; + } inet_network; + struct { + const struct tomoyo_path_info *address; + u8 protocol; + u8 operation; + } unix_network; + struct { + const struct tomoyo_path_info *type; + const struct tomoyo_path_info *dir; + const struct tomoyo_path_info *dev; + long unsigned int flags; + int need_dev; + } mount; + struct { + const struct tomoyo_path_info *domainname; + } task; + } param; + struct tomoyo_acl_info *matched_acl; + u8 param_type; + bool granted; + u8 retry; + u8 profile; + u8 mode; + u8 type; +}; + +struct tomoyo_mini_stat { + kuid_t uid; + kgid_t gid; + ino_t ino; + umode_t mode; + dev_t dev; + dev_t rdev; +}; + +struct tomoyo_obj_info { + bool validate_done; + bool stat_valid[4]; + struct path path1; + struct path path2; + struct tomoyo_mini_stat stat[4]; + struct tomoyo_path_info *symlink_target; +}; + +struct tomoyo_page_dump { + struct page *page; + char *data; +}; + +struct tomoyo_execve { + struct tomoyo_request_info r; + struct tomoyo_obj_info obj; + struct linux_binprm *bprm; + const struct tomoyo_path_info *transition; + struct tomoyo_page_dump dump; + char *tmp; +}; + +struct tomoyo_policy_namespace; + +struct tomoyo_domain_info { + struct list_head list; + struct list_head acl_info_list; + const struct tomoyo_path_info *domainname; + struct tomoyo_policy_namespace *ns; + long unsigned int group[8]; + u8 profile; + bool is_deleted; + bool flags[2]; + atomic_t users; +}; + +struct tomoyo_condition; + +struct tomoyo_acl_info { + struct list_head list; + struct tomoyo_condition *cond; + s8 is_deleted; + u8 type; +} __attribute__((packed)); + +struct tomoyo_condition { + struct tomoyo_shared_acl_head head; + u32 size; + u16 condc; + u16 numbers_count; + u16 names_count; + u16 argc; + u16 envc; + u8 grant_log; + const struct tomoyo_path_info *transit; +}; + +struct tomoyo_profile; + +struct tomoyo_policy_namespace { + struct tomoyo_profile *profile_ptr[256]; + struct list_head group_list[3]; + struct list_head policy_list[11]; + struct list_head acl_group[256]; + struct list_head namespace_list; + unsigned int profile_version; + const char *name; +}; + +struct tomoyo_io_buffer { + void (*read)(struct tomoyo_io_buffer *); + int (*write)(struct tomoyo_io_buffer *); + __poll_t (*poll)(struct file *, poll_table *); + struct mutex io_sem; + char *read_user_buf; + size_t read_user_buf_avail; + struct { + struct list_head *ns; + struct list_head *domain; + struct list_head *group; + struct list_head *acl; + size_t avail; + unsigned int step; + unsigned int query_index; + u16 index; + u16 cond_index; + u8 acl_group_index; + u8 cond_step; + u8 bit; + u8 w_pos; + bool eof; + bool print_this_domain_only; + bool print_transition_related_only; + bool print_cond_part; + const char *w[64]; + } r; + struct { + struct tomoyo_policy_namespace *ns; + struct tomoyo_domain_info *domain; + size_t avail; + bool is_delete; + } w; + char *read_buf; + size_t readbuf_size; + char *write_buf; + size_t writebuf_size; + enum tomoyo_securityfs_interface_index type; + u8 users; + struct list_head list; +}; + +struct tomoyo_preference { + unsigned int learning_max_entry; + bool enforcing_verbose; + bool learning_verbose; + bool permissive_verbose; +}; + +struct tomoyo_profile { + const struct tomoyo_path_info *comment; + struct tomoyo_preference *learning; + struct tomoyo_preference *permissive; + struct tomoyo_preference *enforcing; + struct tomoyo_preference preference; + u8 default_config; + u8 config[42]; + unsigned int pref[2]; +}; + +struct tomoyo_time { + u16 year; + u8 month; + u8 day; + u8 hour; + u8 min; + u8 sec; +}; + +struct tomoyo_log { + struct list_head list; + char *log; + int size; +}; + +enum tomoyo_value_type { + TOMOYO_VALUE_TYPE_INVALID = 0, + TOMOYO_VALUE_TYPE_DECIMAL = 1, + TOMOYO_VALUE_TYPE_OCTAL = 2, + TOMOYO_VALUE_TYPE_HEXADECIMAL = 3, +}; + +enum tomoyo_transition_type { + TOMOYO_TRANSITION_CONTROL_NO_RESET = 0, + TOMOYO_TRANSITION_CONTROL_RESET = 1, + TOMOYO_TRANSITION_CONTROL_NO_INITIALIZE = 2, + TOMOYO_TRANSITION_CONTROL_INITIALIZE = 3, + TOMOYO_TRANSITION_CONTROL_NO_KEEP = 4, + TOMOYO_TRANSITION_CONTROL_KEEP = 5, + TOMOYO_MAX_TRANSITION_TYPE = 6, +}; + +enum tomoyo_acl_entry_type_index { + TOMOYO_TYPE_PATH_ACL = 0, + TOMOYO_TYPE_PATH2_ACL = 1, + TOMOYO_TYPE_PATH_NUMBER_ACL = 2, + TOMOYO_TYPE_MKDEV_ACL = 3, + TOMOYO_TYPE_MOUNT_ACL = 4, + TOMOYO_TYPE_INET_ACL = 5, + TOMOYO_TYPE_UNIX_ACL = 6, + TOMOYO_TYPE_ENV_ACL = 7, + TOMOYO_TYPE_MANUAL_TASK_ACL = 8, +}; + +enum tomoyo_policy_stat_type { + TOMOYO_STAT_POLICY_UPDATES = 0, + TOMOYO_STAT_POLICY_LEARNING = 1, + TOMOYO_STAT_POLICY_PERMISSIVE = 2, + TOMOYO_STAT_POLICY_ENFORCING = 3, + TOMOYO_MAX_POLICY_STAT = 4, +}; + +struct tomoyo_acl_head { + struct list_head list; + s8 is_deleted; +} __attribute__((packed)); + +struct tomoyo_name { + struct tomoyo_shared_acl_head head; + struct tomoyo_path_info entry; +}; + +struct tomoyo_group; + +struct tomoyo_name_union { + const struct tomoyo_path_info *filename; + struct tomoyo_group *group; +}; + +struct tomoyo_group { + struct tomoyo_shared_acl_head head; + const struct tomoyo_path_info *group_name; + struct list_head member_list; +}; + +struct tomoyo_number_union { + long unsigned int values[2]; + struct tomoyo_group *group; + u8 value_type[2]; +}; + +struct tomoyo_ipaddr_union { + struct in6_addr ip[2]; + struct tomoyo_group *group; + bool is_ipv6; +}; + +struct tomoyo_path_group { + struct tomoyo_acl_head head; + const struct tomoyo_path_info *member_name; +}; + +struct tomoyo_number_group { + struct tomoyo_acl_head head; + struct tomoyo_number_union number; +}; + +struct tomoyo_address_group { + struct tomoyo_acl_head head; + struct tomoyo_ipaddr_union address; +}; + +struct tomoyo_argv { + long unsigned int index; + const struct tomoyo_path_info *value; + bool is_not; +}; + +struct tomoyo_envp { + const struct tomoyo_path_info *name; + const struct tomoyo_path_info *value; + bool is_not; +}; + +struct tomoyo_condition_element { + u8 left; + u8 right; + bool equals; +}; + +struct tomoyo_task_acl { + struct tomoyo_acl_info head; + const struct tomoyo_path_info *domainname; +}; + +struct tomoyo_path_acl { + struct tomoyo_acl_info head; + u16 perm; + struct tomoyo_name_union name; +}; + +struct tomoyo_path_number_acl { + struct tomoyo_acl_info head; + u8 perm; + struct tomoyo_name_union name; + struct tomoyo_number_union number; +}; + +struct tomoyo_mkdev_acl { + struct tomoyo_acl_info head; + u8 perm; + struct tomoyo_name_union name; + struct tomoyo_number_union mode; + struct tomoyo_number_union major; + struct tomoyo_number_union minor; +}; + +struct tomoyo_path2_acl { + struct tomoyo_acl_info head; + u8 perm; + struct tomoyo_name_union name1; + struct tomoyo_name_union name2; +}; + +struct tomoyo_mount_acl { + struct tomoyo_acl_info head; + struct tomoyo_name_union dev_name; + struct tomoyo_name_union dir_name; + struct tomoyo_name_union fs_type; + struct tomoyo_number_union flags; +}; + +struct tomoyo_env_acl { + struct tomoyo_acl_info head; + const struct tomoyo_path_info *env; +}; + +struct tomoyo_inet_acl { + struct tomoyo_acl_info head; + u8 protocol; + u8 perm; + struct tomoyo_ipaddr_union address; + struct tomoyo_number_union port; +}; + +struct tomoyo_unix_acl { + struct tomoyo_acl_info head; + u8 protocol; + u8 perm; + struct tomoyo_name_union name; +}; + +struct tomoyo_acl_param { + char *data; + struct list_head *list; + struct tomoyo_policy_namespace *ns; + bool is_delete; +}; + +struct tomoyo_transition_control { + struct tomoyo_acl_head head; + u8 type; + bool is_last_name; + const struct tomoyo_path_info *domainname; + const struct tomoyo_path_info *program; +}; + +struct tomoyo_aggregator { + struct tomoyo_acl_head head; + const struct tomoyo_path_info *original_name; + const struct tomoyo_path_info *aggregated_name; +}; + +struct tomoyo_manager { + struct tomoyo_acl_head head; + const struct tomoyo_path_info *manager; +}; + +struct tomoyo_task { + struct tomoyo_domain_info *domain_info; + struct tomoyo_domain_info *old_domain_info; +}; + +struct tomoyo_query { + struct list_head list; + struct tomoyo_domain_info *domain; + char *query; + size_t query_len; + unsigned int serial; + u8 timer; + u8 answer; + u8 retry; +}; + +enum tomoyo_special_mount { + TOMOYO_MOUNT_BIND = 0, + TOMOYO_MOUNT_MOVE = 1, + TOMOYO_MOUNT_REMOUNT = 2, + TOMOYO_MOUNT_MAKE_UNBINDABLE = 3, + TOMOYO_MOUNT_MAKE_PRIVATE = 4, + TOMOYO_MOUNT_MAKE_SLAVE = 5, + TOMOYO_MOUNT_MAKE_SHARED = 6, + TOMOYO_MAX_SPECIAL_MOUNT = 7, +}; + +struct tomoyo_inet_addr_info { + __be16 port; + const __be32 *address; + bool is_ipv6; +}; + +struct tomoyo_unix_addr_info { + u8 *addr; + unsigned int addr_len; +}; + +struct tomoyo_addr_info { + u8 protocol; + u8 operation; + struct tomoyo_inet_addr_info inet; + struct tomoyo_unix_addr_info unix0; +}; + +struct ZSTD_DCtx_s; + +typedef struct ZSTD_DCtx_s ZSTD_DCtx; + +typedef void * (*ZSTD_allocFunction)(void *, size_t); + +typedef void (*ZSTD_freeFunction)(void *, void *); + +typedef struct { + ZSTD_allocFunction customAlloc; + ZSTD_freeFunction customFree; + void *opaque; +} ZSTD_customMem; + +typedef ZSTD_DCtx zstd_dctx; + +enum audit_mode { + AUDIT_NORMAL = 0, + AUDIT_QUIET_DENIED = 1, + AUDIT_QUIET = 2, + AUDIT_NOQUIET = 3, + AUDIT_ALL = 4, +}; + +enum aa_sfs_type { + AA_SFS_TYPE_BOOLEAN = 0, + AA_SFS_TYPE_STRING = 1, + AA_SFS_TYPE_U64 = 2, + AA_SFS_TYPE_FOPS = 3, + AA_SFS_TYPE_DIR = 4, +}; + +struct aa_sfs_entry { + const char *name; + struct dentry *dentry; + umode_t mode; + enum aa_sfs_type v_type; + union { + bool boolean; + char *string; + long unsigned int u64; + struct aa_sfs_entry *files; + } v; + const struct file_operations *file_ops; +}; + +enum aafs_ns_type { + AAFS_NS_DIR = 0, + AAFS_NS_PROFS = 1, + AAFS_NS_NS = 2, + AAFS_NS_RAW_DATA = 3, + AAFS_NS_LOAD = 4, + AAFS_NS_REPLACE = 5, + AAFS_NS_REMOVE = 6, + AAFS_NS_REVISION = 7, + AAFS_NS_COUNT = 8, + AAFS_NS_MAX_COUNT = 9, + AAFS_NS_SIZE = 10, + AAFS_NS_MAX_SIZE = 11, + AAFS_NS_OWNER = 12, + AAFS_NS_SIZEOF = 13, +}; + +enum aafs_prof_type { + AAFS_PROF_DIR = 0, + AAFS_PROF_PROFS = 1, + AAFS_PROF_NAME = 2, + AAFS_PROF_MODE = 3, + AAFS_PROF_ATTACH = 4, + AAFS_PROF_HASH = 5, + AAFS_PROF_RAW_DATA = 6, + AAFS_PROF_RAW_HASH = 7, + AAFS_PROF_RAW_ABI = 8, + AAFS_PROF_SIZEOF = 9, +}; + +struct table_header { + u16 td_id; + u16 td_flags; + u32 td_hilen; + u32 td_lolen; + char td_data[0]; +}; + +struct aa_dfa { + struct kref count; + u16 flags; + u32 max_oob; + struct table_header *tables[8]; +}; + +struct aa_str_table { + int size; + char **table; +}; + +struct aa_policy { + const char *name; + char *hname; + struct list_head list; + struct list_head profiles; +}; + +struct aa_labelset { + rwlock_t lock; + struct rb_root root; +}; + +enum label_flags { + FLAG_HAT = 1, + FLAG_UNCONFINED = 2, + FLAG_NULL = 4, + FLAG_IX_ON_NAME_ERROR = 8, + FLAG_IMMUTIBLE = 16, + FLAG_USER_DEFINED = 32, + FLAG_NO_LIST_REF = 64, + FLAG_NS_COUNT = 128, + FLAG_IN_TREE = 256, + FLAG_PROFILE = 512, + FLAG_EXPLICIT = 1024, + FLAG_STALE = 2048, + FLAG_RENAMED = 4096, + FLAG_REVOKED = 8192, + FLAG_DEBUG1 = 16384, + FLAG_DEBUG2 = 32768, +}; + +struct aa_label; + +struct aa_proxy { + struct kref count; + struct aa_label *label; +}; + +struct aa_profile; + +struct aa_label { + struct kref count; + struct rb_node node; + struct callback_head rcu; + struct aa_proxy *proxy; + char *hname; + long int flags; + u32 secid; + int size; + struct aa_profile *vec[0]; +}; + +struct label_it { + int i; + int j; +}; + +struct aa_perms; + +struct aa_policydb { + struct aa_dfa *dfa; + struct { + struct aa_perms *perms; + u32 size; + }; + struct aa_str_table trans; + unsigned int start[33]; +}; + +struct aa_attachment { + const char *xmatch_str; + struct aa_policydb xmatch; + unsigned int xmatch_len; + int xattr_count; + char **xattrs; +}; + +struct aa_ns; + +struct aa_loaddata; + +struct aa_profile { + struct aa_policy base; + struct aa_profile *parent; + struct aa_ns *ns; + const char *rename; + enum audit_mode audit; + long int mode; + u32 path_flags; + const char *disconnected; + struct aa_attachment attach; + struct list_head rules; + struct aa_loaddata *rawdata; + unsigned char *hash; + char *dirname; + struct dentry *dents[9]; + struct rhashtable *data; + struct aa_label label; +}; + +struct aa_perms { + u32 allow; + u32 deny; + u32 subtree; + u32 cond; + u32 kill; + u32 complain; + u32 prompt; + u32 audit; + u32 quiet; + u32 hide; + u32 xindex; + u32 tag; + u32 label; +}; + +struct path_cond { + kuid_t uid; + umode_t mode; +}; + +struct aa_caps { + kernel_cap_t allow; + kernel_cap_t audit; + kernel_cap_t denied; + kernel_cap_t quiet; + kernel_cap_t kill; + kernel_cap_t extended; +}; + +struct aa_secmark { + u8 audit; + u8 deny; + u32 secid; + char *label; +}; + +struct aa_rlimit { + unsigned int mask; + struct rlimit limits[16]; +}; + +enum profile_mode { + APPARMOR_ENFORCE = 0, + APPARMOR_COMPLAIN = 1, + APPARMOR_KILL = 2, + APPARMOR_UNCONFINED = 3, + APPARMOR_USER = 4, +}; + +struct aa_data { + char *key; + u32 size; + char *data; + struct rhash_head head; +}; + +struct aa_ruleset { + struct list_head list; + int size; + struct aa_policydb policy; + struct aa_policydb file; + struct aa_caps caps; + struct aa_rlimit rlimits; + int secmark_count; + struct aa_secmark *secmark; +}; + +struct aa_ns_acct { + int max_size; + int max_count; + int size; + int count; +}; + +struct aa_ns { + struct aa_policy base; + struct aa_ns *parent; + struct mutex lock; + struct aa_ns_acct acct; + struct aa_profile *unconfined; + struct list_head sub_ns; + atomic_t uniq_null; + long int uniq_id; + int level; + long int revision; + wait_queue_head_t wait; + struct aa_labelset labels; + struct list_head rawdata_list; + struct dentry *dents[13]; +}; + +struct aa_loaddata { + struct kref count; + struct list_head list; + struct work_struct work; + struct dentry *dents[6]; + struct aa_ns *ns; + char *name; + size_t size; + size_t compressed_size; + long int revision; + int abi; + unsigned char *hash; + char *data; +}; + +enum { + AAFS_LOADDATA_ABI = 0, + AAFS_LOADDATA_REVISION = 1, + AAFS_LOADDATA_HASH = 2, + AAFS_LOADDATA_DATA = 3, + AAFS_LOADDATA_COMPRESSED_SIZE = 4, + AAFS_LOADDATA_DIR = 5, + AAFS_LOADDATA_NDENTS = 6, +}; + +struct rawdata_f_data { + struct aa_loaddata *loaddata; +}; + +struct aa_revision { + struct aa_ns *ns; + long int last_read; +}; + +struct multi_transaction { + struct kref count; + ssize_t size; + char data[0]; +}; + +struct apparmor_audit_data { + int error; + int type; + u16 class; + const char *op; + struct aa_label *label; + const char *name; + const char *info; + u32 request; + u32 denied; + union { + struct { + struct aa_label *peer; + union { + struct { + const char *target; + kuid_t ouid; + } fs; + struct { + int rlim; + long unsigned int max; + } rlim; + struct { + int signal; + int unmappedsig; + }; + struct { + int type; + int protocol; + struct sock *peer_sk; + void *addr; + int addrlen; + } net; + }; + }; + struct { + struct aa_profile *profile; + const char *ns; + long int pos; + } iface; + struct { + const char *src_name; + const char *type; + const char *trans; + const char *data; + long unsigned int flags; + } mnt; + }; +}; + +enum audit_type { + AUDIT_APPARMOR_AUDIT = 0, + AUDIT_APPARMOR_ALLOWED = 1, + AUDIT_APPARMOR_DENIED = 2, + AUDIT_APPARMOR_HINT = 3, + AUDIT_APPARMOR_STATUS = 4, + AUDIT_APPARMOR_ERROR = 5, + AUDIT_APPARMOR_KILL = 6, + AUDIT_APPARMOR_AUTO = 7, +}; + +struct aa_audit_rule { + struct aa_label *label; +}; + +struct audit_cache { + struct aa_profile *profile; + kernel_cap_t caps; +}; + +struct aa_task_ctx { + struct aa_label *nnp; + struct aa_label *onexec; + struct aa_label *previous; + long: 32; + u64 token; +}; + +struct counted_str { + struct kref count; + char name[0]; +}; + +struct match_workbuf { + unsigned int count; + unsigned int pos; + unsigned int len; + unsigned int size; + unsigned int history[24]; +}; + +enum path_flags { + PATH_IS_DIR = 1, + PATH_CONNECT_PATH = 4, + PATH_CHROOT_REL = 8, + PATH_CHROOT_NSCONNECT = 16, + PATH_DELEGATE_DELETED = 65536, + PATH_MEDIATE_DELETED = 131072, +}; + +struct aa_load_ent { + struct list_head list; + struct aa_profile *new; + struct aa_profile *old; + struct aa_profile *rename; + const char *ns_name; +}; + +struct ZSTD_CCtx_s; + +typedef struct ZSTD_CCtx_s ZSTD_CCtx; + +typedef enum { + ZSTD_fast = 1, + ZSTD_dfast = 2, + ZSTD_greedy = 3, + ZSTD_lazy = 4, + ZSTD_lazy2 = 5, + ZSTD_btlazy2 = 6, + ZSTD_btopt = 7, + ZSTD_btultra = 8, + ZSTD_btultra2 = 9, +} ZSTD_strategy; + +typedef struct { + unsigned int windowLog; + unsigned int chainLog; + unsigned int hashLog; + unsigned int searchLog; + unsigned int minMatch; + unsigned int targetLength; + ZSTD_strategy strategy; +} ZSTD_compressionParameters; + +typedef struct { + int contentSizeFlag; + int checksumFlag; + int noDictIDFlag; +} ZSTD_frameParameters; + +typedef struct { + ZSTD_compressionParameters cParams; + ZSTD_frameParameters fParams; +} ZSTD_parameters; + +typedef ZSTD_compressionParameters zstd_compression_parameters; + +typedef ZSTD_parameters zstd_parameters; + +typedef ZSTD_CCtx zstd_cctx; + +enum aa_code { + AA_U8 = 0, + AA_U16 = 1, + AA_U32 = 2, + AA_U64 = 3, + AA_NAME = 4, + AA_STRING = 5, + AA_BLOB = 6, + AA_STRUCT = 7, + AA_STRUCTEND = 8, + AA_LIST = 9, + AA_LISTEND = 10, + AA_ARRAY = 11, + AA_ARRAYEND = 12, +}; + +struct aa_ext { + void *start; + void *end; + void *pos; + u32 version; +}; + +struct aa_file_ctx { + spinlock_t lock; + struct aa_label *label; + u32 allow; +}; + +struct aa_sk_ctx { + struct aa_label *label; + struct aa_label *peer; +}; + +union aa_buffer { + struct list_head list; + char buffer[1]; +}; + +struct ptrace_relation { + struct task_struct *tracer; + struct task_struct *tracee; + bool invalid; + struct list_head node; + struct callback_head rcu; +}; + +struct access_report_info { + struct callback_head work; + const char *access; + struct task_struct *target; + struct task_struct *agent; +}; + +enum devcg_behavior { + DEVCG_DEFAULT_NONE = 0, + DEVCG_DEFAULT_ALLOW = 1, + DEVCG_DEFAULT_DENY = 2, +}; + +struct dev_exception_item { + u32 major; + u32 minor; + short int type; + short int access; + struct list_head list; + struct callback_head rcu; +}; + +struct dev_cgroup { + struct cgroup_subsys_state css; + struct list_head exceptions; + enum devcg_behavior behavior; + long: 32; +}; + +enum { + CRYPTO_MSG_ALG_REQUEST = 0, + CRYPTO_MSG_ALG_REGISTER = 1, + CRYPTO_MSG_ALG_LOADED = 2, +}; + +struct crypto_larval { + struct crypto_alg alg; + struct crypto_alg *adult; + struct completion completion; + u32 mask; + bool test_started; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct crypto_cipher { + struct crypto_tfm base; +}; + +struct crypto_comp { + struct crypto_tfm base; +}; + +struct rtattr { + short unsigned int rta_len; + short unsigned int rta_type; +}; + +struct crypto_queue { + struct list_head list; + struct list_head *backlog; + unsigned int qlen; + unsigned int max_qlen; +}; + +struct crypto_attr_alg { + char name[128]; +}; + +struct crypto_attr_type { + u32 type; + u32 mask; +}; + +enum { + CRYPTOA_UNSPEC = 0, + CRYPTOA_ALG = 1, + CRYPTOA_TYPE = 2, + __CRYPTOA_MAX = 3, +}; + +struct scatter_walk { + struct scatterlist *sg; + unsigned int offset; +}; + +struct aead_request { + struct crypto_async_request base; + unsigned int assoclen; + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + void *__ctx[0]; +}; + +struct crypto_aead; + +struct aead_alg { + int (*setkey)(struct crypto_aead *, const u8 *, unsigned int); + int (*setauthsize)(struct crypto_aead *, unsigned int); + int (*encrypt)(struct aead_request *); + int (*decrypt)(struct aead_request *); + int (*init)(struct crypto_aead *); + void (*exit)(struct crypto_aead *); + unsigned int ivsize; + unsigned int maxauthsize; + unsigned int chunksize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_alg base; +}; + +struct crypto_aead { + unsigned int authsize; + unsigned int reqsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_tfm base; +}; + +struct aead_instance { + void (*free)(struct aead_instance *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + union { + struct { + char head[64]; + struct crypto_instance base; + } s; + struct aead_alg alg; + }; +}; + +struct crypto_aead_spawn { + struct crypto_spawn base; +}; + +enum crypto_attr_type_t { + CRYPTOCFGA_UNSPEC = 0, + CRYPTOCFGA_PRIORITY_VAL = 1, + CRYPTOCFGA_REPORT_LARVAL = 2, + CRYPTOCFGA_REPORT_HASH = 3, + CRYPTOCFGA_REPORT_BLKCIPHER = 4, + CRYPTOCFGA_REPORT_AEAD = 5, + CRYPTOCFGA_REPORT_COMPRESS = 6, + CRYPTOCFGA_REPORT_RNG = 7, + CRYPTOCFGA_REPORT_CIPHER = 8, + CRYPTOCFGA_REPORT_AKCIPHER = 9, + CRYPTOCFGA_REPORT_KPP = 10, + CRYPTOCFGA_REPORT_ACOMP = 11, + CRYPTOCFGA_STAT_LARVAL = 12, + CRYPTOCFGA_STAT_HASH = 13, + CRYPTOCFGA_STAT_BLKCIPHER = 14, + CRYPTOCFGA_STAT_AEAD = 15, + CRYPTOCFGA_STAT_COMPRESS = 16, + CRYPTOCFGA_STAT_RNG = 17, + CRYPTOCFGA_STAT_CIPHER = 18, + CRYPTOCFGA_STAT_AKCIPHER = 19, + CRYPTOCFGA_STAT_KPP = 20, + CRYPTOCFGA_STAT_ACOMP = 21, + __CRYPTOCFGA_MAX = 22, +}; + +struct crypto_report_aead { + char type[64]; + char geniv[64]; + unsigned int blocksize; + unsigned int maxauthsize; + unsigned int ivsize; +}; + +struct crypto_sync_skcipher; + +struct aead_geniv_ctx { + spinlock_t lock; + struct crypto_aead *child; + struct crypto_sync_skcipher *sknull; + u8 salt[0]; +}; + +struct crypto_rng; + +struct rng_alg { + int (*generate)(struct crypto_rng *, const u8 *, unsigned int, u8 *, unsigned int); + int (*seed)(struct crypto_rng *, const u8 *, unsigned int); + void (*set_ent)(struct crypto_rng *, const u8 *, unsigned int); + unsigned int seedsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_alg base; +}; + +struct crypto_rng { + struct crypto_tfm base; +}; + +struct crypto_cipher_spawn { + struct crypto_spawn base; +}; + +struct crypto_sync_skcipher { + struct crypto_skcipher base; +}; + +struct skcipher_instance { + void (*free)(struct skcipher_instance *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + union { + struct { + char head[64]; + struct crypto_instance base; + } s; + struct skcipher_alg alg; + }; +}; + +struct crypto_skcipher_spawn { + struct crypto_spawn base; +}; + +struct skcipher_walk { + union { + struct { + struct page *page; + long unsigned int offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } src; + union { + struct { + struct page *page; + long unsigned int offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } dst; + struct scatter_walk in; + unsigned int nbytes; + struct scatter_walk out; + unsigned int total; + struct list_head buffers; + u8 *page; + u8 *buffer; + u8 *oiv; + void *iv; + unsigned int ivsize; + int flags; + unsigned int blocksize; + unsigned int stride; + unsigned int alignmask; +}; + +struct skcipher_ctx_simple { + struct crypto_cipher *cipher; +}; + +struct crypto_report_blkcipher { + char type[64]; + char geniv[64]; + unsigned int blocksize; + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; +}; + +enum { + SKCIPHER_WALK_PHYS = 1, + SKCIPHER_WALK_SLOW = 2, + SKCIPHER_WALK_COPY = 4, + SKCIPHER_WALK_DIFF = 8, + SKCIPHER_WALK_SLEEP = 16, +}; + +struct skcipher_walk_buffer { + struct list_head entry; + struct scatter_walk dst; + unsigned int len; + u8 *data; + u8 buffer[0]; +}; + +struct ahash_alg { + int (*init)(struct ahash_request *); + int (*update)(struct ahash_request *); + int (*final)(struct ahash_request *); + int (*finup)(struct ahash_request *); + int (*digest)(struct ahash_request *); + int (*export)(struct ahash_request *, void *); + int (*import)(struct ahash_request *, const void *); + int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_ahash *); + void (*exit_tfm)(struct crypto_ahash *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct hash_alg_common halg; +}; + +struct crypto_hash_walk { + char *data; + unsigned int offset; + unsigned int alignmask; + struct page *pg; + unsigned int entrylen; + unsigned int total; + struct scatterlist *sg; + unsigned int flags; +}; + +struct ahash_instance { + void (*free)(struct ahash_instance *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + union { + struct { + char head[128]; + struct crypto_instance base; + } s; + struct ahash_alg alg; + }; +}; + +struct crypto_ahash_spawn { + struct crypto_spawn base; +}; + +struct crypto_report_hash { + char type[64]; + unsigned int blocksize; + unsigned int digestsize; +}; + +struct ahash_request_priv { + crypto_completion_t complete; + void *data; + u8 *result; + u32 flags; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + void *ubuf[0]; +}; + +struct shash_instance { + void (*free)(struct shash_instance *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + union { + struct { + char head[128]; + struct crypto_instance base; + } s; + struct shash_alg alg; + }; +}; + +struct crypto_shash_spawn { + struct crypto_spawn base; +}; + +struct crypto_report_akcipher { + char type[64]; +}; + +struct akcipher_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + void *__ctx[0]; +}; + +struct crypto_akcipher { + unsigned int reqsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_tfm base; +}; + +struct akcipher_alg { + int (*sign)(struct akcipher_request *); + int (*verify)(struct akcipher_request *); + int (*encrypt)(struct akcipher_request *); + int (*decrypt)(struct akcipher_request *); + int (*set_pub_key)(struct crypto_akcipher *, const void *, unsigned int); + int (*set_priv_key)(struct crypto_akcipher *, const void *, unsigned int); + unsigned int (*max_size)(struct crypto_akcipher *); + int (*init)(struct crypto_akcipher *); + void (*exit)(struct crypto_akcipher *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_alg base; +}; + +struct akcipher_instance { + void (*free)(struct akcipher_instance *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + union { + struct { + char head[64]; + struct crypto_instance base; + } s; + struct akcipher_alg alg; + }; +}; + +struct crypto_akcipher_spawn { + struct crypto_spawn base; +}; + +struct crypto_report_kpp { + char type[64]; +}; + +struct kpp_instance { + void (*free)(struct kpp_instance *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + union { + struct { + char head[64]; + struct crypto_instance base; + } s; + struct kpp_alg alg; + }; +}; + +struct crypto_kpp_spawn { + struct crypto_spawn base; +}; + +typedef long unsigned int mpi_limb_t; + +struct gcry_mpi { + int alloced; + int nlimbs; + int nbits; + int sign; + unsigned int flags; + mpi_limb_t *d; +}; + +typedef struct gcry_mpi *MPI; + +struct dh_ctx { + MPI p; + MPI g; + MPI xa; +}; + +enum { + CRYPTO_KPP_SECRET_TYPE_UNKNOWN = 0, + CRYPTO_KPP_SECRET_TYPE_DH = 1, + CRYPTO_KPP_SECRET_TYPE_ECDH = 2, +}; + +struct kpp_secret { + short unsigned int type; + short unsigned int len; +}; + +enum asn1_class { + ASN1_UNIV = 0, + ASN1_APPL = 1, + ASN1_CONT = 2, + ASN1_PRIV = 3, +}; + +enum asn1_method { + ASN1_PRIM = 0, + ASN1_CONS = 1, +}; + +enum asn1_tag { + ASN1_EOC = 0, + ASN1_BOOL = 1, + ASN1_INT = 2, + ASN1_BTS = 3, + ASN1_OTS = 4, + ASN1_NULL = 5, + ASN1_OID = 6, + ASN1_ODE = 7, + ASN1_EXT = 8, + ASN1_REAL = 9, + ASN1_ENUM = 10, + ASN1_EPDV = 11, + ASN1_UTF8STR = 12, + ASN1_RELOID = 13, + ASN1_SEQ = 16, + ASN1_SET = 17, + ASN1_NUMSTR = 18, + ASN1_PRNSTR = 19, + ASN1_TEXSTR = 20, + ASN1_VIDSTR = 21, + ASN1_IA5STR = 22, + ASN1_UNITIM = 23, + ASN1_GENTIM = 24, + ASN1_GRASTR = 25, + ASN1_VISSTR = 26, + ASN1_GENSTR = 27, + ASN1_UNISTR = 28, + ASN1_CHRSTR = 29, + ASN1_BMPSTR = 30, + ASN1_LONG_TAG = 31, +}; + +typedef int (*asn1_action_t)(void *, size_t, unsigned char, const void *, size_t); + +struct asn1_decoder { + const unsigned char *machine; + size_t machlen; + const asn1_action_t *actions; +}; + +enum asn1_opcode { + ASN1_OP_MATCH = 0, + ASN1_OP_MATCH_OR_SKIP = 1, + ASN1_OP_MATCH_ACT = 2, + ASN1_OP_MATCH_ACT_OR_SKIP = 3, + ASN1_OP_MATCH_JUMP = 4, + ASN1_OP_MATCH_JUMP_OR_SKIP = 5, + ASN1_OP_MATCH_ANY = 8, + ASN1_OP_MATCH_ANY_OR_SKIP = 9, + ASN1_OP_MATCH_ANY_ACT = 10, + ASN1_OP_MATCH_ANY_ACT_OR_SKIP = 11, + ASN1_OP_COND_MATCH_OR_SKIP = 17, + ASN1_OP_COND_MATCH_ACT_OR_SKIP = 19, + ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 21, + ASN1_OP_COND_MATCH_ANY = 24, + ASN1_OP_COND_MATCH_ANY_OR_SKIP = 25, + ASN1_OP_COND_MATCH_ANY_ACT = 26, + ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 27, + ASN1_OP_COND_FAIL = 28, + ASN1_OP_COMPLETE = 29, + ASN1_OP_ACT = 30, + ASN1_OP_MAYBE_ACT = 31, + ASN1_OP_END_SEQ = 32, + ASN1_OP_END_SET = 33, + ASN1_OP_END_SEQ_OF = 34, + ASN1_OP_END_SET_OF = 35, + ASN1_OP_END_SEQ_ACT = 36, + ASN1_OP_END_SET_ACT = 37, + ASN1_OP_END_SEQ_OF_ACT = 38, + ASN1_OP_END_SET_OF_ACT = 39, + ASN1_OP_RETURN = 40, + ASN1_OP__NR = 41, +}; + +enum rsapubkey_actions { + ACT_rsa_get_e = 0, + ACT_rsa_get_n = 1, + NR__rsapubkey_actions = 2, +}; + +enum rsaprivkey_actions { + ACT_rsa_get_d = 0, + ACT_rsa_get_dp = 1, + ACT_rsa_get_dq = 2, + ACT_rsa_get_e___2 = 3, + ACT_rsa_get_n___2 = 4, + ACT_rsa_get_p = 5, + ACT_rsa_get_q = 6, + ACT_rsa_get_qinv = 7, + NR__rsaprivkey_actions = 8, +}; + +struct rsa_key { + const u8 *n; + const u8 *e; + const u8 *d; + const u8 *p; + const u8 *q; + const u8 *dp; + const u8 *dq; + const u8 *qinv; + size_t n_sz; + size_t e_sz; + size_t d_sz; + size_t p_sz; + size_t q_sz; + size_t dp_sz; + size_t dq_sz; + size_t qinv_sz; +}; + +struct rsa_mpi_key { + MPI n; + MPI e; + MPI d; + MPI p; + MPI q; + MPI dp; + MPI dq; + MPI qinv; +}; + +struct asn1_decoder; + +struct rsa_asn1_template { + const char *name; + const u8 *data; + size_t size; +}; + +struct pkcs1pad_ctx { + struct crypto_akcipher *child; + unsigned int key_size; +}; + +struct pkcs1pad_inst_ctx { + struct crypto_akcipher_spawn spawn; + const struct rsa_asn1_template *digest_info; +}; + +struct pkcs1pad_request { + struct scatterlist in_sg[2]; + struct scatterlist out_sg[1]; + uint8_t *in_buf; + uint8_t *out_buf; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct akcipher_request child_req; +}; + +struct crypto_report_acomp { + char type[64]; +}; + +struct acomp_alg { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + int (*init)(struct crypto_acomp *); + void (*exit)(struct crypto_acomp *); + unsigned int reqsize; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_alg base; +}; + +struct crypto_report_comp { + char type[64]; +}; + +struct crypto_scomp { + struct crypto_tfm base; +}; + +struct scomp_alg { + void * (*alloc_ctx)(struct crypto_scomp *); + void (*free_ctx)(struct crypto_scomp *, void *); + int (*compress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + int (*decompress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct crypto_alg base; +}; + +struct scomp_scratch { + spinlock_t lock; + void *src; + void *dst; +}; + +struct cryptomgr_param { + struct rtattr *tb[34]; + struct { + struct rtattr attr; + struct crypto_attr_type data; + } type; + struct { + struct rtattr attr; + struct crypto_attr_alg data; + } attrs[32]; + char template[128]; + struct crypto_larval *larval; + u32 otype; + u32 omask; +}; + +struct crypto_test_param { + char driver[128]; + char alg[128]; + u32 type; +}; + +struct drbg_string { + const unsigned char *buf; + size_t len; + struct list_head list; +}; + +struct drbg_test_data { + struct drbg_string *testentropy; +}; + +enum OID { + OID_id_dsa_with_sha1 = 0, + OID_id_dsa = 1, + OID_id_ecPublicKey = 2, + OID_id_prime192v1 = 3, + OID_id_prime256v1 = 4, + OID_id_ecdsa_with_sha1 = 5, + OID_id_ecdsa_with_sha224 = 6, + OID_id_ecdsa_with_sha256 = 7, + OID_id_ecdsa_with_sha384 = 8, + OID_id_ecdsa_with_sha512 = 9, + OID_rsaEncryption = 10, + OID_md2WithRSAEncryption = 11, + OID_md3WithRSAEncryption = 12, + OID_md4WithRSAEncryption = 13, + OID_sha1WithRSAEncryption = 14, + OID_sha256WithRSAEncryption = 15, + OID_sha384WithRSAEncryption = 16, + OID_sha512WithRSAEncryption = 17, + OID_sha224WithRSAEncryption = 18, + OID_data = 19, + OID_signed_data = 20, + OID_email_address = 21, + OID_contentType = 22, + OID_messageDigest = 23, + OID_signingTime = 24, + OID_smimeCapabilites = 25, + OID_smimeAuthenticatedAttrs = 26, + OID_md2 = 27, + OID_md4 = 28, + OID_md5 = 29, + OID_mskrb5 = 30, + OID_krb5 = 31, + OID_krb5u2u = 32, + OID_msIndirectData = 33, + OID_msStatementType = 34, + OID_msSpOpusInfo = 35, + OID_msPeImageDataObjId = 36, + OID_msIndividualSPKeyPurpose = 37, + OID_msOutlookExpress = 38, + OID_ntlmssp = 39, + OID_spnego = 40, + OID_IAKerb = 41, + OID_PKU2U = 42, + OID_Scram = 43, + OID_certAuthInfoAccess = 44, + OID_sha1 = 45, + OID_id_ansip384r1 = 46, + OID_sha256 = 47, + OID_sha384 = 48, + OID_sha512 = 49, + OID_sha224 = 50, + OID_commonName = 51, + OID_surname = 52, + OID_countryName = 53, + OID_locality = 54, + OID_stateOrProvinceName = 55, + OID_organizationName = 56, + OID_organizationUnitName = 57, + OID_title = 58, + OID_description = 59, + OID_name = 60, + OID_givenName = 61, + OID_initials = 62, + OID_generationalQualifier = 63, + OID_subjectKeyIdentifier = 64, + OID_keyUsage = 65, + OID_subjectAltName = 66, + OID_issuerAltName = 67, + OID_basicConstraints = 68, + OID_crlDistributionPoints = 69, + OID_certPolicies = 70, + OID_authorityKeyIdentifier = 71, + OID_extKeyUsage = 72, + OID_NetlogonMechanism = 73, + OID_appleLocalKdcSupported = 74, + OID_gostCPSignA = 75, + OID_gostCPSignB = 76, + OID_gostCPSignC = 77, + OID_gost2012PKey256 = 78, + OID_gost2012PKey512 = 79, + OID_gost2012Digest256 = 80, + OID_gost2012Digest512 = 81, + OID_gost2012Signature256 = 82, + OID_gost2012Signature512 = 83, + OID_gostTC26Sign256A = 84, + OID_gostTC26Sign256B = 85, + OID_gostTC26Sign256C = 86, + OID_gostTC26Sign256D = 87, + OID_gostTC26Sign512A = 88, + OID_gostTC26Sign512B = 89, + OID_gostTC26Sign512C = 90, + OID_sm2 = 91, + OID_sm3 = 92, + OID_SM2_with_SM3 = 93, + OID_sm3WithRSAEncryption = 94, + OID_TPMLoadableKey = 95, + OID_TPMImportableKey = 96, + OID_TPMSealedData = 97, + OID__NR = 98, +}; + +struct hash_testvec { + const char *key; + const char *plaintext; + const char *digest; + unsigned int psize; + short unsigned int ksize; + int setkey_error; + int digest_error; + bool fips_skip; +}; + +struct cipher_testvec { + const char *key; + const char *iv; + const char *iv_out; + const char *ptext; + const char *ctext; + unsigned char wk; + short unsigned int klen; + unsigned int len; + bool fips_skip; + bool generates_iv; + int setkey_error; + int crypt_error; +}; + +struct aead_testvec { + const char *key; + const char *iv; + const char *ptext; + const char *assoc; + const char *ctext; + unsigned char novrfy; + unsigned char wk; + unsigned char klen; + unsigned int plen; + unsigned int clen; + unsigned int alen; + int setkey_error; + int setauthsize_error; + int crypt_error; +}; + +struct cprng_testvec { + const char *key; + const char *dt; + const char *v; + const char *result; + unsigned char klen; + short unsigned int dtlen; + short unsigned int vlen; + short unsigned int rlen; + short unsigned int loops; +}; + +struct drbg_testvec { + const unsigned char *entropy; + size_t entropylen; + const unsigned char *entpra; + const unsigned char *entprb; + size_t entprlen; + const unsigned char *addtla; + const unsigned char *addtlb; + size_t addtllen; + const unsigned char *pers; + size_t perslen; + const unsigned char *expected; + size_t expectedlen; +}; + +struct akcipher_testvec { + const unsigned char *key; + const unsigned char *params; + const unsigned char *m; + const unsigned char *c; + unsigned int key_len; + unsigned int param_len; + unsigned int m_size; + unsigned int c_size; + bool public_key_vec; + bool siggen_sigver_test; + enum OID algo; +}; + +struct kpp_testvec { + const unsigned char *secret; + const unsigned char *b_secret; + const unsigned char *b_public; + const unsigned char *expected_a_public; + const unsigned char *expected_ss; + short unsigned int secret_size; + short unsigned int b_secret_size; + short unsigned int b_public_size; + short unsigned int expected_a_public_size; + short unsigned int expected_ss_size; + bool genkey; +}; + +struct comp_testvec { + int inlen; + int outlen; + char input[512]; + char output[512]; +}; + +struct aead_test_suite { + const struct aead_testvec *vecs; + unsigned int count; + unsigned int einval_allowed: 1; + unsigned int aad_iv: 1; +}; + +struct cipher_test_suite { + const struct cipher_testvec *vecs; + unsigned int count; +}; + +struct comp_test_suite { + struct { + const struct comp_testvec *vecs; + unsigned int count; + } comp; + struct { + const struct comp_testvec *vecs; + unsigned int count; + } decomp; +}; + +struct hash_test_suite { + const struct hash_testvec *vecs; + unsigned int count; +}; + +struct cprng_test_suite { + const struct cprng_testvec *vecs; + unsigned int count; +}; + +struct drbg_test_suite { + const struct drbg_testvec *vecs; + unsigned int count; +}; + +struct akcipher_test_suite { + const struct akcipher_testvec *vecs; + unsigned int count; +}; + +struct kpp_test_suite { + const struct kpp_testvec *vecs; + unsigned int count; +}; + +struct alg_test_desc { + const char *alg; + const char *generic_driver; + int (*test)(const struct alg_test_desc *, const char *, u32, u32); + int fips_allowed; + union { + struct aead_test_suite aead; + struct cipher_test_suite cipher; + struct comp_test_suite comp; + struct hash_test_suite hash; + struct cprng_test_suite cprng; + struct drbg_test_suite drbg; + struct akcipher_test_suite akcipher; + struct kpp_test_suite kpp; + } suite; +}; + +enum flush_type { + FLUSH_TYPE_NONE = 0, + FLUSH_TYPE_FLUSH = 1, + FLUSH_TYPE_REIMPORT = 2, +}; + +enum finalization_type { + FINALIZATION_TYPE_FINAL = 0, + FINALIZATION_TYPE_FINUP = 1, + FINALIZATION_TYPE_DIGEST = 2, +}; + +enum inplace_mode { + OUT_OF_PLACE = 0, + INPLACE_ONE_SGLIST = 1, + INPLACE_TWO_SGLISTS = 2, +}; + +struct test_sg_division { + unsigned int proportion_of_total; + unsigned int offset; + bool offset_relative_to_alignmask; + enum flush_type flush_type; + bool nosimd; +}; + +struct testvec_config { + const char *name; + enum inplace_mode inplace_mode; + u32 req_flags; + struct test_sg_division src_divs[8]; + struct test_sg_division dst_divs[8]; + unsigned int iv_offset; + unsigned int key_offset; + bool iv_offset_relative_to_alignmask; + bool key_offset_relative_to_alignmask; + enum finalization_type finalization_type; + bool nosimd; +}; + +struct test_sglist { + char *bufs[8]; + struct scatterlist sgl[8]; + struct scatterlist sgl_saved[8]; + struct scatterlist *sgl_ptr; + unsigned int nents; +}; + +struct cipher_test_sglists { + struct test_sglist src; + struct test_sglist dst; +}; + +struct hmac_ctx { + struct crypto_shash *hash; +}; + +struct md5_state { + u32 hash[4]; + u32 block[16]; + u64 byte_count; +}; + +struct sha1_state { + u32 state[5]; + long: 32; + u64 count; + u8 buffer[64]; +}; + +typedef void sha1_block_fn(struct sha1_state *, const u8 *, int); + +struct sha256_state { + u32 state[8]; + u64 count; + u8 buf[64]; +}; + +struct lzo_ctx { + void *lzo_comp_mem; +}; + +struct lzorle_ctx { + void *lzorle_comp_mem; +}; + +struct crypto_report_rng { + char type[64]; + unsigned int seedsize; +}; + +enum asymmetric_payload_bits { + asym_crypto = 0, + asym_subtype = 1, + asym_key_ids = 2, + asym_auth = 3, +}; + +struct asymmetric_key_id { + short unsigned int len; + unsigned char data[0]; +}; + +struct asymmetric_key_ids { + void *id[3]; +}; + +struct public_key_signature; + +struct asymmetric_key_subtype { + struct module *owner; + const char *name; + short unsigned int name_len; + void (*describe)(const struct key *, struct seq_file *); + void (*destroy)(void *, void *); + int (*query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*verify_signature)(const struct key *, const struct public_key_signature *); +}; + +struct public_key_signature { + struct asymmetric_key_id *auth_ids[3]; + u8 *s; + u8 *digest; + u32 s_size; + u32 digest_size; + const char *pkey_algo; + const char *hash_algo; + const char *encoding; + const void *data; + unsigned int data_size; +}; + +struct asymmetric_key_parser { + struct list_head link; + struct module *owner; + const char *name; + int (*parse)(struct key_preparsed_payload *); +}; + +struct public_key { + void *key; + u32 keylen; + enum OID algo; + void *params; + u32 paramlen; + bool key_is_private; + const char *id_type; + const char *pkey_algo; +}; + +enum x509_actions { + ACT_x509_extract_key_data = 0, + ACT_x509_extract_name_segment = 1, + ACT_x509_note_OID = 2, + ACT_x509_note_issuer = 3, + ACT_x509_note_not_after = 4, + ACT_x509_note_not_before = 5, + ACT_x509_note_params = 6, + ACT_x509_note_serial = 7, + ACT_x509_note_sig_algo = 8, + ACT_x509_note_signature = 9, + ACT_x509_note_subject = 10, + ACT_x509_note_tbs_certificate = 11, + ACT_x509_process_extension = 12, + NR__x509_actions = 13, +}; + +enum x509_akid_actions { + ACT_x509_akid_note_kid = 0, + ACT_x509_akid_note_name = 1, + ACT_x509_akid_note_serial = 2, + ACT_x509_extract_name_segment___2 = 3, + ACT_x509_note_OID___2 = 4, + NR__x509_akid_actions = 5, +}; + +struct x509_certificate { + struct x509_certificate *next; + struct x509_certificate *signer; + struct public_key *pub; + struct public_key_signature *sig; + char *issuer; + char *subject; + struct asymmetric_key_id *id; + struct asymmetric_key_id *skid; + time64_t valid_from; + time64_t valid_to; + const void *tbs; + unsigned int tbs_size; + unsigned int raw_sig_size; + const void *raw_sig; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_subject; + unsigned int raw_subject_size; + unsigned int raw_skid_size; + const void *raw_skid; + unsigned int index; + bool seen; + bool verified; + bool self_signed; + bool unsupported_sig; + bool blacklisted; + long: 32; +}; + +struct x509_parse_context { + struct x509_certificate *cert; + long unsigned int data; + const void *key; + size_t key_size; + const void *params; + size_t params_size; + enum OID key_algo; + enum OID last_oid; + enum OID sig_algo; + u8 o_size; + u8 cn_size; + u8 email_size; + u16 o_offset; + u16 cn_offset; + u16 email_offset; + unsigned int raw_akid_size; + const void *raw_akid; + const void *akid_raw_issuer; + unsigned int akid_raw_issuer_size; +}; + +enum pkcs7_actions { + ACT_pkcs7_check_content_type = 0, + ACT_pkcs7_extract_cert = 1, + ACT_pkcs7_note_OID = 2, + ACT_pkcs7_note_certificate_list = 3, + ACT_pkcs7_note_content = 4, + ACT_pkcs7_note_data = 5, + ACT_pkcs7_note_signed_info = 6, + ACT_pkcs7_note_signeddata_version = 7, + ACT_pkcs7_note_signerinfo_version = 8, + ACT_pkcs7_sig_note_authenticated_attr = 9, + ACT_pkcs7_sig_note_digest_algo = 10, + ACT_pkcs7_sig_note_issuer = 11, + ACT_pkcs7_sig_note_pkey_algo = 12, + ACT_pkcs7_sig_note_serial = 13, + ACT_pkcs7_sig_note_set_of_authattrs = 14, + ACT_pkcs7_sig_note_signature = 15, + ACT_pkcs7_sig_note_skid = 16, + NR__pkcs7_actions = 17, +}; + +struct pkcs7_signed_info { + struct pkcs7_signed_info *next; + struct x509_certificate *signer; + unsigned int index; + bool unsupported_crypto; + bool blacklisted; + const void *msgdigest; + unsigned int msgdigest_len; + unsigned int authattrs_len; + const void *authattrs; + long unsigned int aa_set; + long: 32; + time64_t signing_time; + struct public_key_signature *sig; + long: 32; +}; + +struct pkcs7_message { + struct x509_certificate *certs; + struct x509_certificate *crl; + struct pkcs7_signed_info *signed_infos; + u8 version; + bool have_authattrs; + enum OID data_type; + size_t data_len; + size_t data_hdrlen; + const void *data; +}; + +struct pkcs7_parse_context { + struct pkcs7_message *msg; + struct pkcs7_signed_info *sinfo; + struct pkcs7_signed_info **ppsinfo; + struct x509_certificate *certs; + struct x509_certificate **ppcerts; + long unsigned int data; + enum OID last_oid; + unsigned int x509_index; + unsigned int sinfo_index; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_skid; + unsigned int raw_skid_size; + bool expect_skid; +}; + +struct kdf_testvec { + unsigned char *key; + size_t keylen; + unsigned char *ikm; + size_t ikmlen; + struct kvec info; + unsigned char *expected; + size_t expectedlen; +}; + +struct disk_stats { + u64 nsecs[4]; + long unsigned int sectors[4]; + long unsigned int ios[4]; + long unsigned int merges[4]; + long unsigned int io_ticks; + local_t in_flight[2]; + long: 32; +}; + +enum stat_group { + STAT_READ = 0, + STAT_WRITE = 1, + STAT_DISCARD = 2, + STAT_FLUSH = 3, + NR_STAT_GROUPS = 4, +}; + +enum { + DISK_EVENT_MEDIA_CHANGE = 1, + DISK_EVENT_EJECT_REQUEST = 2, +}; + +enum { + DISK_EVENT_FLAG_POLL = 1, + DISK_EVENT_FLAG_UEVENT = 2, + DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE = 4, +}; + +struct blk_integrity_iter { + void *prot_buf; + void *data_buf; + sector_t seed; + unsigned int data_size; + short unsigned int interval; + unsigned char tuple_size; + const char *disk_name; + long: 32; +}; + +struct bdev_inode { + struct block_device bdev; + struct inode vfs_inode; +}; + +enum { + DIO_SHOULD_DIRTY = 1, + DIO_IS_SYNC = 2, +}; + +struct blkdev_dio { + union { + struct kiocb *iocb; + struct task_struct *waiter; + }; + size_t size; + atomic_t ref; + unsigned int flags; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct bio bio; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct blkg_iostat { + u64 bytes[3]; + u64 ios[3]; +}; + +struct blkg_iostat_set { + struct u64_stats_sync sync; + struct blkcg_gq *blkg; + struct llist_node lnode; + int lqueued; + struct blkg_iostat cur; + struct blkg_iostat last; +}; + +struct blkcg; + +struct blkg_policy_data; + +struct blkcg_gq { + struct request_queue *q; + struct list_head q_node; + struct hlist_node blkcg_node; + struct blkcg *blkcg; + struct blkcg_gq *parent; + struct percpu_ref refcnt; + bool online; + struct blkg_iostat_set *iostat_cpu; + long: 32; + struct blkg_iostat_set iostat; + struct blkg_policy_data *pd[6]; + spinlock_t async_bio_lock; + struct bio_list async_bios; + union { + struct work_struct async_bio_work; + struct work_struct free_work; + }; + atomic_t use_delay; + atomic64_t delay_nsec; + atomic64_t delay_start; + u64 last_delay; + int last_use; + struct callback_head callback_head; + long: 32; +}; + +struct bio_alloc_cache { + struct bio *free_list; + struct bio *free_list_irq; + unsigned int nr; + unsigned int nr_irq; +}; + +enum rq_qos_id { + RQ_QOS_WBT = 0, + RQ_QOS_LATENCY = 1, + RQ_QOS_COST = 2, +}; + +struct rq_qos_ops; + +struct rq_qos { + struct rq_qos_ops *ops; + struct request_queue *q; + enum rq_qos_id id; + struct rq_qos *next; + struct dentry *debugfs_dir; +}; + +struct blk_mq_debugfs_attr { + const char *name; + umode_t mode; + int (*show)(void *, struct seq_file *); + ssize_t (*write)(void *, const char *, size_t, loff_t *); + const struct seq_operations *seq_ops; +}; + +struct rq_qos_ops { + void (*throttle)(struct rq_qos *, struct bio *); + void (*track)(struct rq_qos *, struct request *, struct bio *); + void (*merge)(struct rq_qos *, struct request *, struct bio *); + void (*issue)(struct rq_qos *, struct request *); + void (*requeue)(struct rq_qos *, struct request *); + void (*done)(struct rq_qos *, struct request *); + void (*done_bio)(struct rq_qos *, struct bio *); + void (*cleanup)(struct rq_qos *, struct bio *); + void (*queue_depth_changed)(struct rq_qos *); + void (*exit)(struct rq_qos *); + const struct blk_mq_debugfs_attr *debugfs_attrs; +}; + +enum blkg_iostat_type { + BLKG_IOSTAT_READ = 0, + BLKG_IOSTAT_WRITE = 1, + BLKG_IOSTAT_DISCARD = 2, + BLKG_IOSTAT_NR = 3, +}; + +struct blkcg_policy_data; + +struct blkcg { + struct cgroup_subsys_state css; + spinlock_t lock; + refcount_t online_pin; + struct xarray blkg_tree; + struct blkcg_gq *blkg_hint; + struct hlist_head blkg_list; + struct blkcg_policy_data *cpd[6]; + struct list_head all_blkcgs_node; + struct llist_head *lhead; + struct list_head cgwb_list; +}; + +struct blkg_policy_data { + struct blkcg_gq *blkg; + int plid; +}; + +struct blkcg_policy_data { + struct blkcg *blkcg; + int plid; +}; + +struct biovec_slab { + int nr_vecs; + char *name; + struct kmem_cache *slab; +}; + +struct bio_slab { + struct kmem_cache *slab; + unsigned int slab_ref; + unsigned int slab_size; + char name[8]; +}; + +struct elevator_type; + +struct elevator_queue { + struct elevator_type *type; + void *elevator_data; + struct kobject kobj; + struct mutex sysfs_lock; + long unsigned int flags; + struct hlist_head hash[64]; +}; + +struct blk_mq_ctxs; + +struct blk_mq_ctx { + struct { + spinlock_t lock; + struct list_head rq_lists[3]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + }; + unsigned int cpu; + short unsigned int index_hw[3]; + struct blk_mq_hw_ctx *hctxs[3]; + struct request_queue *queue; + struct blk_mq_ctxs *ctxs; + struct kobject kobj; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct blk_stat_callback { + struct list_head list; + struct timer_list timer; + struct blk_rq_stat *cpu_stat; + int (*bucket_fn)(const struct request *); + unsigned int buckets; + struct blk_rq_stat *stat; + void (*timer_fn)(struct blk_stat_callback *); + void *data; + struct callback_head rcu; +}; + +enum { + BLK_MQ_F_SHOULD_MERGE = 1, + BLK_MQ_F_TAG_QUEUE_SHARED = 2, + BLK_MQ_F_STACKING = 4, + BLK_MQ_F_TAG_HCTX_SHARED = 8, + BLK_MQ_F_BLOCKING = 32, + BLK_MQ_F_NO_SCHED = 64, + BLK_MQ_F_NO_SCHED_BY_DEFAULT = 128, + BLK_MQ_F_ALLOC_POLICY_START_BIT = 8, + BLK_MQ_F_ALLOC_POLICY_BITS = 1, + BLK_MQ_S_STOPPED = 0, + BLK_MQ_S_TAG_ACTIVE = 1, + BLK_MQ_S_SCHED_RESTART = 2, + BLK_MQ_S_INACTIVE = 3, + BLK_MQ_MAX_DEPTH = 10240, + BLK_MQ_CPU_WORK_BATCH = 8, +}; + +enum elv_merge { + ELEVATOR_NO_MERGE = 0, + ELEVATOR_FRONT_MERGE = 1, + ELEVATOR_BACK_MERGE = 2, + ELEVATOR_DISCARD_MERGE = 3, +}; + +struct blk_mq_alloc_data; + +struct elevator_mq_ops { + int (*init_sched)(struct request_queue *, struct elevator_type *); + void (*exit_sched)(struct elevator_queue *); + int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*depth_updated)(struct blk_mq_hw_ctx *); + bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); + bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int); + int (*request_merge)(struct request_queue *, struct request **, struct bio *); + void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); + void (*requests_merged)(struct request_queue *, struct request *, struct request *); + void (*limit_depth)(blk_opf_t, struct blk_mq_alloc_data *); + void (*prepare_request)(struct request *); + void (*finish_request)(struct request *); + void (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, bool); + struct request * (*dispatch_request)(struct blk_mq_hw_ctx *); + bool (*has_work)(struct blk_mq_hw_ctx *); + void (*completed_request)(struct request *, u64); + void (*requeue_request)(struct request *); + struct request * (*former_request)(struct request_queue *, struct request *); + struct request * (*next_request)(struct request_queue *, struct request *); + void (*init_icq)(struct io_cq *); + void (*exit_icq)(struct io_cq *); +}; + +struct elv_fs_entry; + +struct elevator_type { + struct kmem_cache *icq_cache; + struct elevator_mq_ops ops; + size_t icq_size; + size_t icq_align; + struct elv_fs_entry *elevator_attrs; + const char *elevator_name; + const char *elevator_alias; + const unsigned int elevator_features; + struct module *elevator_owner; + const struct blk_mq_debugfs_attr *queue_debugfs_attrs; + const struct blk_mq_debugfs_attr *hctx_debugfs_attrs; + char icq_cache_name[22]; + struct list_head list; +}; + +struct blk_mq_alloc_data { + struct request_queue *q; + blk_mq_req_flags_t flags; + unsigned int shallow_depth; + blk_opf_t cmd_flags; + req_flags_t rq_flags; + unsigned int nr_tags; + struct request **cached_rq; + struct blk_mq_ctx *ctx; + struct blk_mq_hw_ctx *hctx; +}; + +struct elv_fs_entry { + struct attribute attr; + ssize_t (*show)(struct elevator_queue *, char *); + ssize_t (*store)(struct elevator_queue *, const char *, size_t); +}; + +struct blk_mq_ctxs { + struct kobject kobj; + struct blk_mq_ctx *queue_ctx; +}; + +enum { + WBT_RWQ_BG = 0, + WBT_RWQ_KSWAPD = 1, + WBT_RWQ_DISCARD = 2, + WBT_NUM_RWQ = 3, +}; + +struct blk_plug_cb; + +typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool); + +struct blk_plug_cb { + struct list_head list; + blk_plug_cb_fn callback; + void *data; +}; + +enum { + BLK_MQ_REQ_NOWAIT = 1, + BLK_MQ_REQ_RESERVED = 2, + BLK_MQ_REQ_PM = 4, +}; + +struct trace_event_raw_block_buffer { + struct trace_entry ent; + dev_t dev; + long: 32; + sector_t sector; + size_t size; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_block_rq_requeue { + struct trace_entry ent; + dev_t dev; + long: 32; + sector_t sector; + unsigned int nr_sector; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_rq_completion { + struct trace_entry ent; + dev_t dev; + long: 32; + sector_t sector; + unsigned int nr_sector; + int error; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_block_rq { + struct trace_entry ent; + dev_t dev; + long: 32; + sector_t sector; + unsigned int nr_sector; + unsigned int bytes; + char rwbs[8]; + char comm[16]; + u32 __data_loc_cmd; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_block_bio_complete { + struct trace_entry ent; + dev_t dev; + long: 32; + sector_t sector; + unsigned int nr_sector; + int error; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_bio { + struct trace_entry ent; + dev_t dev; + long: 32; + sector_t sector; + unsigned int nr_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_block_plug { + struct trace_entry ent; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_unplug { + struct trace_entry ent; + int nr_rq; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_split { + struct trace_entry ent; + dev_t dev; + long: 32; + sector_t sector; + sector_t new_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_bio_remap { + struct trace_entry ent; + dev_t dev; + long: 32; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_rq_remap { + struct trace_entry ent; + dev_t dev; + long: 32; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + unsigned int nr_bios; + char rwbs[8]; + char __data[0]; + long: 32; +}; + +struct trace_event_data_offsets_block_buffer {}; + +struct trace_event_data_offsets_block_rq_requeue { + u32 cmd; +}; + +struct trace_event_data_offsets_block_rq_completion { + u32 cmd; +}; + +struct trace_event_data_offsets_block_rq { + u32 cmd; +}; + +struct trace_event_data_offsets_block_bio_complete {}; + +struct trace_event_data_offsets_block_bio {}; + +struct trace_event_data_offsets_block_plug {}; + +struct trace_event_data_offsets_block_unplug {}; + +struct trace_event_data_offsets_block_split {}; + +struct trace_event_data_offsets_block_bio_remap {}; + +struct trace_event_data_offsets_block_rq_remap {}; + +typedef void (*btf_trace_block_touch_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_dirty_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_rq_requeue)(void *, struct request *); + +typedef void (*btf_trace_block_rq_complete)(void *, struct request *, blk_status_t, unsigned int); + +typedef void (*btf_trace_block_rq_error)(void *, struct request *, blk_status_t, unsigned int); + +typedef void (*btf_trace_block_rq_insert)(void *, struct request *); + +typedef void (*btf_trace_block_rq_issue)(void *, struct request *); + +typedef void (*btf_trace_block_rq_merge)(void *, struct request *); + +typedef void (*btf_trace_block_bio_complete)(void *, struct request_queue *, struct bio *); + +typedef void (*btf_trace_block_bio_bounce)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_backmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_frontmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_queue)(void *, struct bio *); + +typedef void (*btf_trace_block_getrq)(void *, struct bio *); + +typedef void (*btf_trace_block_plug)(void *, struct request_queue *); + +typedef void (*btf_trace_block_unplug)(void *, struct request_queue *, unsigned int, bool); + +typedef void (*btf_trace_block_split)(void *, struct bio *, unsigned int); + +typedef void (*btf_trace_block_bio_remap)(void *, struct bio *, dev_t, sector_t); + +typedef void (*btf_trace_block_rq_remap)(void *, struct request *, dev_t, sector_t); + +typedef struct blkcg_policy_data *blkcg_pol_alloc_cpd_fn(gfp_t); + +typedef void blkcg_pol_init_cpd_fn(struct blkcg_policy_data *); + +typedef void blkcg_pol_free_cpd_fn(struct blkcg_policy_data *); + +typedef void blkcg_pol_bind_cpd_fn(struct blkcg_policy_data *); + +typedef struct blkg_policy_data *blkcg_pol_alloc_pd_fn(gfp_t, struct request_queue *, struct blkcg *); + +typedef void blkcg_pol_init_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_online_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_offline_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_free_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_reset_pd_stats_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_stat_pd_fn(struct blkg_policy_data *, struct seq_file *); + +struct blkcg_policy { + int plid; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + blkcg_pol_alloc_cpd_fn *cpd_alloc_fn; + blkcg_pol_init_cpd_fn *cpd_init_fn; + blkcg_pol_free_cpd_fn *cpd_free_fn; + blkcg_pol_bind_cpd_fn *cpd_bind_fn; + blkcg_pol_alloc_pd_fn *pd_alloc_fn; + blkcg_pol_init_pd_fn *pd_init_fn; + blkcg_pol_online_pd_fn *pd_online_fn; + blkcg_pol_offline_pd_fn *pd_offline_fn; + blkcg_pol_free_pd_fn *pd_free_fn; + blkcg_pol_reset_pd_stats_fn *pd_reset_stats_fn; + blkcg_pol_stat_pd_fn *pd_stat_fn; +}; + +enum blkg_rwstat_type { + BLKG_RWSTAT_READ = 0, + BLKG_RWSTAT_WRITE = 1, + BLKG_RWSTAT_SYNC = 2, + BLKG_RWSTAT_ASYNC = 3, + BLKG_RWSTAT_DISCARD = 4, + BLKG_RWSTAT_NR = 5, + BLKG_RWSTAT_TOTAL = 5, +}; + +struct blkg_rwstat { + struct percpu_counter cpu_cnt[5]; + atomic64_t aux_cnt[5]; +}; + +struct throtl_grp; + +struct throtl_qnode { + struct list_head node; + struct bio_list bios; + struct throtl_grp *tg; +}; + +struct throtl_service_queue { + struct throtl_service_queue *parent_sq; + struct list_head queued[2]; + unsigned int nr_queued[2]; + struct rb_root_cached pending_tree; + unsigned int nr_pending; + long unsigned int first_pending_disptime; + struct timer_list pending_timer; +}; + +struct throtl_grp { + struct blkg_policy_data pd; + struct rb_node rb_node; + struct throtl_data *td; + struct throtl_service_queue service_queue; + struct throtl_qnode qnode_on_self[2]; + struct throtl_qnode qnode_on_parent[2]; + long unsigned int disptime; + unsigned int flags; + bool has_rules_bps[2]; + bool has_rules_iops[2]; + long: 32; + uint64_t bps[4]; + uint64_t bps_conf[4]; + unsigned int iops[4]; + unsigned int iops_conf[4]; + uint64_t bytes_disp[2]; + unsigned int io_disp[2]; + long unsigned int last_low_overflow_time[2]; + uint64_t last_bytes_disp[2]; + unsigned int last_io_disp[2]; + uint64_t carryover_bytes[2]; + unsigned int carryover_ios[2]; + long unsigned int last_check_time; + long unsigned int latency_target; + long unsigned int latency_target_conf; + long unsigned int slice_start[2]; + long unsigned int slice_end[2]; + long unsigned int last_finish_time; + long unsigned int checked_last_finish_time; + long unsigned int avg_idletime; + long unsigned int idletime_threshold; + long unsigned int idletime_threshold_conf; + unsigned int bio_cnt; + unsigned int bad_bio_cnt; + long unsigned int bio_cnt_reset_time; + long: 32; + struct blkg_rwstat stat_bytes; + struct blkg_rwstat stat_ios; +}; + +enum { + LIMIT_LOW = 0, + LIMIT_MAX = 1, + LIMIT_CNT = 2, +}; + +struct queue_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct request_queue *, char *); + ssize_t (*store)(struct request_queue *, const char *, size_t); +}; + +enum { + BLK_MQ_NO_TAG = 4294967295, + BLK_MQ_TAG_MIN = 1, + BLK_MQ_TAG_MAX = 4294967294, +}; + +enum { + REQ_FSEQ_PREFLUSH = 1, + REQ_FSEQ_DATA = 2, + REQ_FSEQ_POSTFLUSH = 4, + REQ_FSEQ_DONE = 8, + REQ_FSEQ_ACTIONS = 7, + FLUSH_PENDING_TIMEOUT = 1250, +}; + +enum blk_default_limits { + BLK_MAX_SEGMENTS = 128, + BLK_SAFE_MAX_SECTORS = 255, + BLK_DEF_MAX_SECTORS = 2560, + BLK_MAX_SEGMENT_SIZE = 65536, + BLK_SEG_BOUNDARY_MASK = 4294967295, +}; + +enum { + ICQ_EXITED = 4, + ICQ_DESTROYED = 8, +}; + +enum { + IOPRIO_CLASS_NONE = 0, + IOPRIO_CLASS_RT = 1, + IOPRIO_CLASS_BE = 2, + IOPRIO_CLASS_IDLE = 3, +}; + +struct rq_map_data { + struct page **pages; + long unsigned int offset; + short unsigned int page_order; + short unsigned int nr_entries; + bool null_mapped; + bool from_user; +}; + +struct bio_map_data { + bool is_our_pages: 1; + bool is_null_mapped: 1; + long: 32; + struct iov_iter iter; + struct iovec iov[0]; +}; + +struct req_iterator { + struct bvec_iter iter; + struct bio *bio; +}; + +enum bio_merge_status { + BIO_MERGE_OK = 0, + BIO_MERGE_NONE = 1, + BIO_MERGE_FAILED = 2, +}; + +typedef bool (*sb_for_each_fn)(struct sbitmap *, unsigned int, void *); + +typedef bool busy_tag_iter_fn(struct request *, void *); + +enum { + BLK_MQ_UNIQUE_TAG_BITS = 16, + BLK_MQ_UNIQUE_TAG_MASK = 65535, +}; + +struct mq_inflight { + struct block_device *part; + unsigned int inflight[2]; +}; + +struct blk_rq_wait { + struct completion done; + blk_status_t ret; +}; + +struct blk_expired_data { + bool has_timedout_rq; + long unsigned int next; + long unsigned int timeout_start; +}; + +struct flush_busy_ctx_data { + struct blk_mq_hw_ctx *hctx; + struct list_head *list; +}; + +struct dispatch_rq_data { + struct blk_mq_hw_ctx *hctx; + struct request *rq; +}; + +enum prep_dispatch { + PREP_DISPATCH_OK = 0, + PREP_DISPATCH_NO_TAG = 1, + PREP_DISPATCH_NO_BUDGET = 2, +}; + +struct rq_iter_data { + struct blk_mq_hw_ctx *hctx; + bool has_rq; +}; + +struct blk_mq_qe_pair { + struct list_head node; + struct request_queue *q; + struct elevator_type *type; +}; + +struct sbq_wait { + struct sbitmap_queue *sbq; + struct wait_queue_entry wait; +}; + +struct bt_iter_data { + struct blk_mq_hw_ctx *hctx; + struct request_queue *q; + busy_tag_iter_fn *fn; + void *data; + bool reserved; +}; + +struct bt_tags_iter_data { + struct blk_mq_tags *tags; + busy_tag_iter_fn *fn; + void *data; + unsigned int flags; +}; + +struct blk_queue_stats { + struct list_head callbacks; + spinlock_t lock; + int accounting; +}; + +struct blk_mq_hw_ctx_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_mq_hw_ctx *, char *); + ssize_t (*store)(struct blk_mq_hw_ctx *, const char *, size_t); +}; + +struct hd_geometry { + unsigned char heads; + unsigned char sectors; + short unsigned int cylinders; + long unsigned int start; +}; + +struct blkpg_ioctl_arg { + int op; + int flags; + int datalen; + void *data; +}; + +struct blkpg_partition { + long long int start; + long long int length; + int pno; + char devname[64]; + char volname[64]; + long: 32; +}; + +struct pr_reservation { + __u64 key; + __u32 type; + __u32 flags; +}; + +struct pr_registration { + __u64 old_key; + __u64 new_key; + __u32 flags; + __u32 __pad; +}; + +struct pr_preempt { + __u64 old_key; + __u64 new_key; + __u32 type; + __u32 flags; +}; + +struct pr_clear { + __u64 key; + __u32 flags; + __u32 __pad; +}; + +struct klist_node; + +struct klist { + spinlock_t k_lock; + struct list_head k_list; + void (*get)(struct klist_node *); + void (*put)(struct klist_node *); +}; + +struct klist_node { + void *n_klist; + struct list_head n_node; + struct kref n_ref; +}; + +struct klist_iter { + struct klist *i_klist; + struct klist_node *i_cur; +}; + +struct class_dev_iter { + struct klist_iter ki; + const struct device_type *type; +}; + +enum { + GENHD_FL_REMOVABLE = 1, + GENHD_FL_HIDDEN = 2, + GENHD_FL_NO_PART = 4, +}; + +struct badblocks { + struct device *dev; + int count; + int unacked_exist; + int shift; + u64 *page; + int changed; + seqlock_t lock; + sector_t sector; + sector_t size; +}; + +struct blk_major_name { + struct blk_major_name *next; + int major; + char name[16]; + void (*probe)(dev_t); +}; + +enum { + IOPRIO_WHO_PROCESS = 1, + IOPRIO_WHO_PGRP = 2, + IOPRIO_WHO_USER = 3, +}; + +struct parsed_partitions { + struct gendisk *disk; + char name[32]; + struct { + sector_t from; + sector_t size; + int flags; + bool has_info; + struct partition_meta_info info; + long: 32; + } *parts; + int next; + int limit; + bool access_beyond_eod; + char *pp_buf; +}; + +typedef struct { + struct folio *v; +} Sector; + +struct fat_boot_sector { + __u8 ignored[3]; + __u8 system_id[8]; + __u8 sector_size[2]; + __u8 sec_per_clus; + __le16 reserved; + __u8 fats; + __u8 dir_entries[2]; + __u8 sectors[2]; + __u8 media; + __le16 fat_length; + __le16 secs_track; + __le16 heads; + __le32 hidden; + __le32 total_sect; + union { + struct { + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat16; + struct { + __le32 length; + __le16 flags; + __u8 version[2]; + __le32 root_cluster; + __le16 info_sector; + __le16 backup_boot; + __le16 reserved2[6]; + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat32; + }; +}; + +struct msdos_partition { + u8 boot_ind; + u8 head; + u8 sector; + u8 cyl; + u8 sys_ind; + u8 end_head; + u8 end_sector; + u8 end_cyl; + __le32 start_sect; + __le32 nr_sects; +}; + +enum msdos_sys_ind { + DOS_EXTENDED_PARTITION = 5, + LINUX_EXTENDED_PARTITION = 133, + WIN98_EXTENDED_PARTITION = 15, + LINUX_DATA_PARTITION = 131, + LINUX_LVM_PARTITION = 142, + LINUX_RAID_PARTITION = 253, + SOLARIS_X86_PARTITION = 130, + NEW_SOLARIS_X86_PARTITION = 191, + DM6_AUX1PARTITION = 81, + DM6_AUX3PARTITION = 83, + DM6_PARTITION = 84, + EZD_PARTITION = 85, + FREEBSD_PARTITION = 165, + OPENBSD_PARTITION = 166, + NETBSD_PARTITION = 169, + BSDI_PARTITION = 183, + MINIX_PARTITION = 129, + UNIXWARE_PARTITION = 99, +}; + +struct _gpt_header { + __le64 signature; + __le32 revision; + __le32 header_size; + __le32 header_crc32; + __le32 reserved1; + __le64 my_lba; + __le64 alternate_lba; + __le64 first_usable_lba; + __le64 last_usable_lba; + efi_guid_t disk_guid; + __le64 partition_entry_lba; + __le32 num_partition_entries; + __le32 sizeof_partition_entry; + __le32 partition_entry_array_crc32; +}; + +typedef struct _gpt_header gpt_header; + +struct _gpt_entry_attributes { + u64 required_to_function: 1; + u64 reserved: 47; + u64 type_guid_specific: 16; +}; + +typedef struct _gpt_entry_attributes gpt_entry_attributes; + +struct _gpt_entry { + efi_guid_t partition_type_guid; + efi_guid_t unique_partition_guid; + __le64 starting_lba; + __le64 ending_lba; + gpt_entry_attributes attributes; + __le16 partition_name[36]; +}; + +typedef struct _gpt_entry gpt_entry; + +struct _gpt_mbr_record { + u8 boot_indicator; + u8 start_head; + u8 start_sector; + u8 start_track; + u8 os_type; + u8 end_head; + u8 end_sector; + u8 end_track; + __le32 starting_lba; + __le32 size_in_lba; +}; + +typedef struct _gpt_mbr_record gpt_mbr_record; + +struct _legacy_mbr { + u8 boot_code[440]; + __le32 unique_mbr_signature; + __le16 unknown; + gpt_mbr_record partition_record[4]; + __le16 signature; +} __attribute__((packed)); + +typedef struct _legacy_mbr legacy_mbr; + +struct d_partition { + __le32 p_res; + u8 p_fstype; + u8 p_res2[3]; + __le32 p_offset; + __le32 p_size; +}; + +struct disklabel { + u8 d_reserved[270]; + struct d_partition d_partitions[2]; + u8 d_blank[208]; + __le16 d_magic; +} __attribute__((packed)); + +struct rq_wait { + wait_queue_head_t wait; + atomic_t inflight; +}; + +struct rq_depth { + unsigned int max_depth; + int scale_step; + bool scaled_max; + unsigned int queue_depth; + unsigned int default_depth; +}; + +typedef bool acquire_inflight_cb_t(struct rq_wait *, void *); + +typedef void cleanup_cb_t(struct rq_wait *, void *); + +struct rq_qos_wait_data { + struct wait_queue_entry wq; + struct task_struct *task; + struct rq_wait *rqw; + acquire_inflight_cb_t *cb; + void *private_data; + bool got_token; +}; + +struct disk_events { + struct list_head node; + struct gendisk *disk; + spinlock_t lock; + struct mutex block_mutex; + int block; + unsigned int pending; + unsigned int clearing; + long int poll_msecs; + struct delayed_work dwork; +}; + +struct blk_ia_range_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_independent_access_range *, char *); +}; + +struct sg_io_v4 { + __s32 guard; + __u32 protocol; + __u32 subprotocol; + __u32 request_len; + __u64 request; + __u64 request_tag; + __u32 request_attr; + __u32 request_priority; + __u32 request_extra; + __u32 max_response_len; + __u64 response; + __u32 dout_iovec_count; + __u32 dout_xfer_len; + __u32 din_iovec_count; + __u32 din_xfer_len; + __u64 dout_xferp; + __u64 din_xferp; + __u32 timeout; + __u32 flags; + __u64 usr_ptr; + __u32 spare_in; + __u32 driver_status; + __u32 transport_status; + __u32 device_status; + __u32 retry_delay; + __u32 info; + __u32 duration; + __u32 response_len; + __s32 din_resid; + __s32 dout_resid; + __u64 generated_tag; + __u32 spare_out; + __u32 padding; +}; + +typedef int bsg_sg_io_fn(struct request_queue *, struct sg_io_v4 *, fmode_t, unsigned int); + +struct bsg_device { + struct request_queue *queue; + long: 32; + struct device device; + struct cdev cdev; + int max_queue; + unsigned int timeout; + unsigned int reserved_size; + bsg_sg_io_fn *sg_io_fn; + long: 32; +}; + +struct bsg_job; + +typedef int bsg_job_fn(struct bsg_job *); + +struct bsg_buffer { + unsigned int payload_len; + int sg_cnt; + struct scatterlist *sg_list; +}; + +struct bsg_job { + struct device *dev; + struct kref kref; + unsigned int timeout; + void *request; + void *reply; + unsigned int request_len; + unsigned int reply_len; + struct bsg_buffer request_payload; + struct bsg_buffer reply_payload; + int result; + unsigned int reply_payload_rcv_len; + struct request *bidi_rq; + struct bio *bidi_bio; + void *dd_data; +}; + +typedef enum blk_eh_timer_return bsg_timeout_fn(struct request *); + +enum scsi_device_event { + SDEV_EVT_MEDIA_CHANGE = 1, + SDEV_EVT_INQUIRY_CHANGE_REPORTED = 2, + SDEV_EVT_CAPACITY_CHANGE_REPORTED = 3, + SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED = 4, + SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED = 5, + SDEV_EVT_LUN_CHANGE_REPORTED = 6, + SDEV_EVT_ALUA_STATE_CHANGE_REPORTED = 7, + SDEV_EVT_POWER_ON_RESET_OCCURRED = 8, + SDEV_EVT_FIRST = 1, + SDEV_EVT_LAST = 8, + SDEV_EVT_MAXBITS = 9, +}; + +struct bsg_device; + +struct bsg_set { + struct blk_mq_tag_set tag_set; + struct bsg_device *bd; + bsg_job_fn *job_fn; + bsg_timeout_fn *timeout_fn; +}; + +struct blkg_conf_ctx { + struct block_device *bdev; + struct blkcg_gq *blkg; + char *body; +}; + +struct blkg_rwstat_sample { + u64 cnt[5]; +}; + +struct latency_bucket { + long unsigned int total_latency; + int samples; +}; + +struct avg_latency_bucket { + long unsigned int latency; + bool valid; +}; + +struct throtl_data { + struct throtl_service_queue service_queue; + struct request_queue *queue; + unsigned int nr_queued[2]; + unsigned int throtl_slice; + struct work_struct dispatch_work; + unsigned int limit_index; + bool limit_valid[2]; + long unsigned int low_upgrade_time; + long unsigned int low_downgrade_time; + unsigned int scale; + struct latency_bucket tmp_buckets[18]; + struct avg_latency_bucket avg_buckets[18]; + struct latency_bucket *latency_buckets[2]; + long unsigned int last_calculate_time; + long unsigned int filtered_latency; + bool track_bio_latency; +}; + +enum tg_state_flags { + THROTL_TG_PENDING = 1, + THROTL_TG_WAS_EMPTY = 2, + THROTL_TG_CANCELING = 4, +}; + +enum { + MILLION = 1000000, + MIN_PERIOD = 1000, + MAX_PERIOD = 1000000, + MARGIN_MIN_PCT = 10, + MARGIN_LOW_PCT = 20, + MARGIN_TARGET_PCT = 50, + INUSE_ADJ_STEP_PCT = 25, + TIMER_SLACK_PCT = 1, + WEIGHT_ONE = 65536, +}; + +enum { + VTIME_PER_SEC_SHIFT = 37, + VTIME_PER_SEC = 0, + VTIME_PER_USEC = 137438, + VTIME_PER_NSEC = 137, + VRATE_MIN_PPM = 10000, + VRATE_MAX_PPM = 100000000, + VRATE_MIN = 1374, + VRATE_CLAMP_ADJ_PCT = 4, + RQ_WAIT_BUSY_PCT = 5, + UNBUSY_THR_PCT = 75, + MIN_DELAY_THR_PCT = 500, + MAX_DELAY_THR_PCT = 25000, + MIN_DELAY = 250, + MAX_DELAY = 250000, + DFGV_USAGE_PCT = 50, + DFGV_PERIOD = 100000, + MAX_LAGGING_PERIODS = 10, + AUTOP_CYCLE_NSEC = 1410065408, + IOC_PAGE_SHIFT = 12, + IOC_PAGE_SIZE = 4096, + IOC_SECT_TO_PAGE_SHIFT = 3, + LCOEF_RANDIO_PAGES = 4096, +}; + +enum ioc_running { + IOC_IDLE = 0, + IOC_RUNNING = 1, + IOC_STOP = 2, +}; + +enum { + QOS_ENABLE = 0, + QOS_CTRL = 1, + NR_QOS_CTRL_PARAMS = 2, +}; + +enum { + QOS_RPPM = 0, + QOS_RLAT = 1, + QOS_WPPM = 2, + QOS_WLAT = 3, + QOS_MIN = 4, + QOS_MAX = 5, + NR_QOS_PARAMS = 6, +}; + +enum { + COST_CTRL = 0, + COST_MODEL = 1, + NR_COST_CTRL_PARAMS = 2, +}; + +enum { + I_LCOEF_RBPS = 0, + I_LCOEF_RSEQIOPS = 1, + I_LCOEF_RRANDIOPS = 2, + I_LCOEF_WBPS = 3, + I_LCOEF_WSEQIOPS = 4, + I_LCOEF_WRANDIOPS = 5, + NR_I_LCOEFS = 6, +}; + +enum { + LCOEF_RPAGE = 0, + LCOEF_RSEQIO = 1, + LCOEF_RRANDIO = 2, + LCOEF_WPAGE = 3, + LCOEF_WSEQIO = 4, + LCOEF_WRANDIO = 5, + NR_LCOEFS = 6, +}; + +enum { + AUTOP_INVALID = 0, + AUTOP_HDD = 1, + AUTOP_SSD_QD1 = 2, + AUTOP_SSD_DFL = 3, + AUTOP_SSD_FAST = 4, +}; + +struct ioc_params { + u32 qos[6]; + u64 i_lcoefs[6]; + u64 lcoefs[6]; + u32 too_fast_vrate_pct; + u32 too_slow_vrate_pct; +}; + +struct ioc_margins { + s64 min; + s64 low; + s64 target; +}; + +struct ioc_missed { + local_t nr_met; + local_t nr_missed; + u32 last_met; + u32 last_missed; +}; + +struct ioc_pcpu_stat { + struct ioc_missed missed[2]; + local64_t rq_wait_ns; + u64 last_rq_wait_ns; +}; + +struct ioc { + struct rq_qos rqos; + bool enabled; + struct ioc_params params; + struct ioc_margins margins; + u32 period_us; + u32 timer_slack_ns; + u64 vrate_min; + u64 vrate_max; + spinlock_t lock; + struct timer_list timer; + struct list_head active_iocgs; + struct ioc_pcpu_stat *pcpu_stat; + enum ioc_running running; + atomic64_t vtime_rate; + u64 vtime_base_rate; + s64 vtime_err; + seqcount_spinlock_t period_seqcount; + long: 32; + u64 period_at; + u64 period_at_vtime; + atomic64_t cur_period; + int busy_level; + bool weights_updated; + atomic_t hweight_gen; + long: 32; + u64 dfgv_period_at; + u64 dfgv_period_rem; + u64 dfgv_usage_us_sum; + u64 autop_too_fast_at; + u64 autop_too_slow_at; + int autop_idx; + bool user_qos_params: 1; + bool user_cost_model: 1; +}; + +struct iocg_pcpu_stat { + local64_t abs_vusage; +}; + +struct iocg_stat { + u64 usage_us; + u64 wait_us; + u64 indebt_us; + u64 indelay_us; +}; + +struct ioc_gq { + struct blkg_policy_data pd; + struct ioc *ioc; + u32 cfg_weight; + u32 weight; + u32 active; + u32 inuse; + u32 last_inuse; + s64 saved_margin; + sector_t cursor; + atomic64_t vtime; + atomic64_t done_vtime; + u64 abs_vdebt; + u64 delay; + u64 delay_at; + atomic64_t active_period; + struct list_head active_list; + u64 child_active_sum; + u64 child_inuse_sum; + u64 child_adjusted_sum; + int hweight_gen; + u32 hweight_active; + u32 hweight_inuse; + u32 hweight_donating; + u32 hweight_after_donation; + struct list_head walk_list; + struct list_head surplus_list; + struct wait_queue_head waitq; + struct hrtimer waitq_timer; + u64 activated_at; + struct iocg_pcpu_stat *pcpu_stat; + long: 32; + struct iocg_stat stat; + struct iocg_stat last_stat; + u64 last_stat_abs_vusage; + u64 usage_delta_us; + u64 wait_since; + u64 indebt_since; + u64 indelay_since; + int level; + struct ioc_gq *ancestors[0]; + long: 32; +}; + +struct ioc_cgrp { + struct blkcg_policy_data cpd; + unsigned int dfl_weight; +}; + +struct ioc_now { + u64 now_ns; + u64 now; + u64 vnow; +}; + +struct iocg_wait { + struct wait_queue_entry wait; + struct bio *bio; + u64 abs_cost; + bool committed; + long: 32; +}; + +struct iocg_wake_ctx { + struct ioc_gq *iocg; + u32 hw_inuse; + s64 vbudget; +}; + +struct trace_event_raw_iocost_iocg_state { + struct trace_entry ent; + u32 __data_loc_devname; + u32 __data_loc_cgroup; + u64 now; + u64 vnow; + u64 vrate; + u64 last_period; + u64 cur_period; + u64 vtime; + u32 weight; + u32 inuse; + u64 hweight_active; + u64 hweight_inuse; + char __data[0]; +}; + +struct trace_event_raw_iocg_inuse_update { + struct trace_entry ent; + u32 __data_loc_devname; + u32 __data_loc_cgroup; + u64 now; + u32 old_inuse; + u32 new_inuse; + u64 old_hweight_inuse; + u64 new_hweight_inuse; + char __data[0]; +}; + +struct trace_event_raw_iocost_ioc_vrate_adj { + struct trace_entry ent; + u32 __data_loc_devname; + long: 32; + u64 old_vrate; + u64 new_vrate; + int busy_level; + u32 read_missed_ppm; + u32 write_missed_ppm; + u32 rq_wait_pct; + int nr_lagging; + int nr_shortages; + char __data[0]; +}; + +struct trace_event_raw_iocost_iocg_forgive_debt { + struct trace_entry ent; + u32 __data_loc_devname; + u32 __data_loc_cgroup; + u64 now; + u64 vnow; + u32 usage_pct; + long: 32; + u64 old_debt; + u64 new_debt; + u64 old_delay; + u64 new_delay; + char __data[0]; +}; + +struct trace_event_data_offsets_iocost_iocg_state { + u32 devname; + u32 cgroup; +}; + +struct trace_event_data_offsets_iocg_inuse_update { + u32 devname; + u32 cgroup; +}; + +struct trace_event_data_offsets_iocost_ioc_vrate_adj { + u32 devname; +}; + +struct trace_event_data_offsets_iocost_iocg_forgive_debt { + u32 devname; + u32 cgroup; +}; + +typedef void (*btf_trace_iocost_iocg_activate)(void *, struct ioc_gq *, const char *, struct ioc_now *, u64, u64, u64); + +typedef void (*btf_trace_iocost_iocg_idle)(void *, struct ioc_gq *, const char *, struct ioc_now *, u64, u64, u64); + +typedef void (*btf_trace_iocost_inuse_shortage)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64); + +typedef void (*btf_trace_iocost_inuse_transfer)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64); + +typedef void (*btf_trace_iocost_inuse_adjust)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64); + +typedef void (*btf_trace_iocost_ioc_vrate_adj)(void *, struct ioc *, u64, u32 *, u32, int, int); + +typedef void (*btf_trace_iocost_iocg_forgive_debt)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u64, u64, u64, u64); + +enum dd_data_dir { + DD_READ = 0, + DD_WRITE = 1, +}; + +enum { + DD_DIR_COUNT = 2, +}; + +enum dd_prio { + DD_RT_PRIO = 0, + DD_BE_PRIO = 1, + DD_IDLE_PRIO = 2, + DD_PRIO_MAX = 2, +}; + +enum { + DD_PRIO_COUNT = 3, +}; + +struct io_stats_per_prio { + uint32_t inserted; + uint32_t merged; + uint32_t dispatched; + atomic_t completed; +}; + +struct dd_per_prio { + struct list_head dispatch; + struct rb_root sort_list[2]; + struct list_head fifo_list[2]; + struct request *next_rq[2]; + struct io_stats_per_prio stats; +}; + +struct deadline_data { + struct dd_per_prio per_prio[3]; + enum dd_data_dir last_dir; + unsigned int batching; + unsigned int starved; + int fifo_expire[2]; + int fifo_batch; + int writes_starved; + int front_merges; + u32 async_depth; + int prio_aging_expire; + spinlock_t lock; + spinlock_t zone_lock; +}; + +enum bip_flags { + BIP_BLOCK_INTEGRITY = 1, + BIP_MAPPED_INTEGRITY = 2, + BIP_CTRL_NOCHECK = 4, + BIP_DISK_NOCHECK = 8, + BIP_IP_CHECKSUM = 16, +}; + +enum blk_integrity_flags { + BLK_INTEGRITY_VERIFY = 1, + BLK_INTEGRITY_GENERATE = 2, + BLK_INTEGRITY_DEVICE_CAPABLE = 4, + BLK_INTEGRITY_IP_CHECKSUM = 8, +}; + +struct integrity_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_integrity *, char *); + ssize_t (*store)(struct blk_integrity *, const char *, size_t); +}; + +struct virtio_device_id { + __u32 device; + __u32 vendor; +}; + +struct virtio_device; + +struct virtqueue { + struct list_head list; + void (*callback)(struct virtqueue *); + const char *name; + struct virtio_device *vdev; + unsigned int index; + unsigned int num_free; + unsigned int num_max; + void *priv; + bool reset; +}; + +struct vringh_config_ops; + +struct virtio_config_ops; + +struct virtio_device { + int index; + bool failed; + bool config_enabled; + bool config_change_pending; + spinlock_t config_lock; + spinlock_t vqs_list_lock; + struct device dev; + struct virtio_device_id id; + const struct virtio_config_ops *config; + const struct vringh_config_ops *vringh_config; + struct list_head vqs; + u64 features; + void *priv; + long: 32; +}; + +typedef void vq_callback_t(struct virtqueue *); + +struct irq_affinity; + +struct virtio_shm_region; + +struct virtio_config_ops { + void (*get)(struct virtio_device *, unsigned int, void *, unsigned int); + void (*set)(struct virtio_device *, unsigned int, const void *, unsigned int); + u32 (*generation)(struct virtio_device *); + u8 (*get_status)(struct virtio_device *); + void (*set_status)(struct virtio_device *, u8); + void (*reset)(struct virtio_device *); + int (*find_vqs)(struct virtio_device *, unsigned int, struct virtqueue **, vq_callback_t **, const char * const *, const bool *, struct irq_affinity *); + void (*del_vqs)(struct virtio_device *); + void (*synchronize_cbs)(struct virtio_device *); + u64 (*get_features)(struct virtio_device *); + int (*finalize_features)(struct virtio_device *); + const char * (*bus_name)(struct virtio_device *); + int (*set_vq_affinity)(struct virtqueue *, const struct cpumask *); + const struct cpumask * (*get_vq_affinity)(struct virtio_device *, int); + bool (*get_shm_region)(struct virtio_device *, struct virtio_shm_region *, u8); + int (*disable_vq_and_reset)(struct virtqueue *); + int (*enable_vq_after_reset)(struct virtqueue *); +}; + +struct virtio_shm_region { + u64 addr; + u64 len; +}; + +struct irq_poll; + +typedef int irq_poll_fn(struct irq_poll *, int); + +struct irq_poll { + struct list_head list; + long unsigned int state; + int weight; + irq_poll_fn *poll; +}; + +struct dim_sample { + ktime_t time; + u32 pkt_ctr; + u32 byte_ctr; + u16 event_ctr; + u32 comp_ctr; +}; + +struct dim_stats { + int ppms; + int bpms; + int epms; + int cpms; + int cpe_ratio; +}; + +struct dim { + u8 state; + struct dim_stats prev_stats; + struct dim_sample start_sample; + struct dim_sample measuring_sample; + struct work_struct work; + void *priv; + u8 profile_ix; + u8 mode; + u8 tune_state; + u8 steps_right; + u8 steps_left; + u8 tired; + long: 32; +}; + +enum rdma_nl_counter_mode { + RDMA_COUNTER_MODE_NONE = 0, + RDMA_COUNTER_MODE_AUTO = 1, + RDMA_COUNTER_MODE_MANUAL = 2, + RDMA_COUNTER_MODE_MAX = 3, +}; + +enum rdma_nl_counter_mask { + RDMA_COUNTER_MASK_QP_TYPE = 1, + RDMA_COUNTER_MASK_PID = 2, +}; + +enum rdma_restrack_type { + RDMA_RESTRACK_PD = 0, + RDMA_RESTRACK_CQ = 1, + RDMA_RESTRACK_QP = 2, + RDMA_RESTRACK_CM_ID = 3, + RDMA_RESTRACK_MR = 4, + RDMA_RESTRACK_CTX = 5, + RDMA_RESTRACK_COUNTER = 6, + RDMA_RESTRACK_SRQ = 7, + RDMA_RESTRACK_MAX = 8, +}; + +struct rdma_restrack_entry { + bool valid; + u8 no_track: 1; + struct kref kref; + struct completion comp; + struct task_struct *task; + const char *kern_name; + enum rdma_restrack_type type; + bool user; + u32 id; +}; + +struct rdma_link_ops { + struct list_head list; + const char *type; + int (*newlink)(const char *, struct net_device *); +}; + +struct auto_mode_param { + int qp_type; +}; + +struct rdma_counter_mode { + enum rdma_nl_counter_mode mode; + enum rdma_nl_counter_mask mask; + struct auto_mode_param param; +}; + +struct rdma_hw_stats; + +struct rdma_port_counter { + struct rdma_counter_mode mode; + struct rdma_hw_stats *hstats; + unsigned int num_counters; + struct mutex lock; +}; + +struct rdma_stat_desc; + +struct rdma_hw_stats { + struct mutex lock; + long unsigned int timestamp; + long unsigned int lifespan; + const struct rdma_stat_desc *descs; + long unsigned int *is_disabled; + int num_counters; + u64 value[0]; +}; + +struct ib_device; + +struct rdma_counter { + struct rdma_restrack_entry res; + struct ib_device *device; + uint32_t id; + struct kref kref; + struct rdma_counter_mode mode; + struct mutex lock; + struct rdma_hw_stats *stats; + u32 port; +}; + +enum rdma_driver_id { + RDMA_DRIVER_UNKNOWN = 0, + RDMA_DRIVER_MLX5 = 1, + RDMA_DRIVER_MLX4 = 2, + RDMA_DRIVER_CXGB3 = 3, + RDMA_DRIVER_CXGB4 = 4, + RDMA_DRIVER_MTHCA = 5, + RDMA_DRIVER_BNXT_RE = 6, + RDMA_DRIVER_OCRDMA = 7, + RDMA_DRIVER_NES = 8, + RDMA_DRIVER_I40IW = 9, + RDMA_DRIVER_IRDMA = 9, + RDMA_DRIVER_VMW_PVRDMA = 10, + RDMA_DRIVER_QEDR = 11, + RDMA_DRIVER_HNS = 12, + RDMA_DRIVER_USNIC = 13, + RDMA_DRIVER_RXE = 14, + RDMA_DRIVER_HFI1 = 15, + RDMA_DRIVER_QIB = 16, + RDMA_DRIVER_EFA = 17, + RDMA_DRIVER_SIW = 18, + RDMA_DRIVER_ERDMA = 19, + RDMA_DRIVER_MANA = 20, +}; + +enum ib_cq_notify_flags { + IB_CQ_SOLICITED = 1, + IB_CQ_NEXT_COMP = 2, + IB_CQ_SOLICITED_MASK = 3, + IB_CQ_REPORT_MISSED_EVENTS = 4, +}; + +struct ib_mad; + +enum rdma_link_layer { + IB_LINK_LAYER_UNSPECIFIED = 0, + IB_LINK_LAYER_INFINIBAND = 1, + IB_LINK_LAYER_ETHERNET = 2, +}; + +enum rdma_netdev_t { + RDMA_NETDEV_OPA_VNIC = 0, + RDMA_NETDEV_IPOIB = 1, +}; + +enum ib_srq_attr_mask { + IB_SRQ_MAX_WR = 1, + IB_SRQ_LIMIT = 2, +}; + +enum ib_mr_type { + IB_MR_TYPE_MEM_REG = 0, + IB_MR_TYPE_SG_GAPS = 1, + IB_MR_TYPE_DM = 2, + IB_MR_TYPE_USER = 3, + IB_MR_TYPE_DMA = 4, + IB_MR_TYPE_INTEGRITY = 5, +}; + +enum ib_uverbs_advise_mr_advice { + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH = 0, + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE = 1, + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT = 2, +}; + +struct uverbs_attr_bundle; + +struct rdma_cm_id; + +struct iw_cm_id; + +struct iw_cm_conn_param; + +struct ib_qp; + +struct ib_send_wr; + +struct ib_recv_wr; + +struct ib_cq; + +struct ib_wc; + +struct ib_srq; + +struct ib_grh; + +struct ib_device_attr; + +struct ib_udata; + +struct ib_device_modify; + +struct ib_port_attr; + +struct ib_port_modify; + +struct ib_port_immutable; + +struct rdma_netdev_alloc_params; + +union ib_gid; + +struct ib_gid_attr; + +struct ib_ucontext; + +struct rdma_user_mmap_entry; + +struct ib_pd; + +struct ib_ah; + +struct rdma_ah_init_attr; + +struct rdma_ah_attr; + +struct ib_srq_init_attr; + +struct ib_srq_attr; + +struct ib_qp_init_attr; + +struct ib_qp_attr; + +struct ib_cq_init_attr; + +struct ib_mr; + +struct ib_sge; + +struct ib_mr_status; + +struct ib_mw; + +struct ib_xrcd; + +struct ib_flow; + +struct ib_flow_attr; + +struct ib_flow_action; + +struct ib_wq; + +struct ib_wq_init_attr; + +struct ib_wq_attr; + +struct ib_rwq_ind_table; + +struct ib_rwq_ind_table_init_attr; + +struct ib_dm; + +struct ib_dm_alloc_attr; + +struct ib_dm_mr_attr; + +struct ib_counters; + +struct ib_counters_read_attr; + +struct ib_device_ops { + struct module *owner; + enum rdma_driver_id driver_id; + u32 uverbs_abi_ver; + unsigned int uverbs_no_driver_id_binding: 1; + const struct attribute_group *device_group; + const struct attribute_group **port_groups; + int (*post_send)(struct ib_qp *, const struct ib_send_wr *, const struct ib_send_wr **); + int (*post_recv)(struct ib_qp *, const struct ib_recv_wr *, const struct ib_recv_wr **); + void (*drain_rq)(struct ib_qp *); + void (*drain_sq)(struct ib_qp *); + int (*poll_cq)(struct ib_cq *, int, struct ib_wc *); + int (*peek_cq)(struct ib_cq *, int); + int (*req_notify_cq)(struct ib_cq *, enum ib_cq_notify_flags); + int (*post_srq_recv)(struct ib_srq *, const struct ib_recv_wr *, const struct ib_recv_wr **); + int (*process_mad)(struct ib_device *, int, u32, const struct ib_wc *, const struct ib_grh *, const struct ib_mad *, struct ib_mad *, size_t *, u16 *); + int (*query_device)(struct ib_device *, struct ib_device_attr *, struct ib_udata *); + int (*modify_device)(struct ib_device *, int, struct ib_device_modify *); + void (*get_dev_fw_str)(struct ib_device *, char *); + const struct cpumask * (*get_vector_affinity)(struct ib_device *, int); + int (*query_port)(struct ib_device *, u32, struct ib_port_attr *); + int (*modify_port)(struct ib_device *, u32, int, struct ib_port_modify *); + int (*get_port_immutable)(struct ib_device *, u32, struct ib_port_immutable *); + enum rdma_link_layer (*get_link_layer)(struct ib_device *, u32); + struct net_device * (*get_netdev)(struct ib_device *, u32); + struct net_device * (*alloc_rdma_netdev)(struct ib_device *, u32, enum rdma_netdev_t, const char *, unsigned char, void (*)(struct net_device *)); + int (*rdma_netdev_get_params)(struct ib_device *, u32, enum rdma_netdev_t, struct rdma_netdev_alloc_params *); + int (*query_gid)(struct ib_device *, u32, int, union ib_gid *); + int (*add_gid)(const struct ib_gid_attr *, void **); + int (*del_gid)(const struct ib_gid_attr *, void **); + int (*query_pkey)(struct ib_device *, u32, u16, u16 *); + int (*alloc_ucontext)(struct ib_ucontext *, struct ib_udata *); + void (*dealloc_ucontext)(struct ib_ucontext *); + int (*mmap)(struct ib_ucontext *, struct vm_area_struct *); + void (*mmap_free)(struct rdma_user_mmap_entry *); + void (*disassociate_ucontext)(struct ib_ucontext *); + int (*alloc_pd)(struct ib_pd *, struct ib_udata *); + int (*dealloc_pd)(struct ib_pd *, struct ib_udata *); + int (*create_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); + int (*create_user_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); + int (*modify_ah)(struct ib_ah *, struct rdma_ah_attr *); + int (*query_ah)(struct ib_ah *, struct rdma_ah_attr *); + int (*destroy_ah)(struct ib_ah *, u32); + int (*create_srq)(struct ib_srq *, struct ib_srq_init_attr *, struct ib_udata *); + int (*modify_srq)(struct ib_srq *, struct ib_srq_attr *, enum ib_srq_attr_mask, struct ib_udata *); + int (*query_srq)(struct ib_srq *, struct ib_srq_attr *); + int (*destroy_srq)(struct ib_srq *, struct ib_udata *); + int (*create_qp)(struct ib_qp *, struct ib_qp_init_attr *, struct ib_udata *); + int (*modify_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_udata *); + int (*query_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_qp_init_attr *); + int (*destroy_qp)(struct ib_qp *, struct ib_udata *); + int (*create_cq)(struct ib_cq *, const struct ib_cq_init_attr *, struct ib_udata *); + int (*modify_cq)(struct ib_cq *, u16, u16); + int (*destroy_cq)(struct ib_cq *, struct ib_udata *); + int (*resize_cq)(struct ib_cq *, int, struct ib_udata *); + struct ib_mr * (*get_dma_mr)(struct ib_pd *, int); + struct ib_mr * (*reg_user_mr)(struct ib_pd *, u64, u64, u64, int, struct ib_udata *); + struct ib_mr * (*reg_user_mr_dmabuf)(struct ib_pd *, u64, u64, u64, int, int, struct ib_udata *); + struct ib_mr * (*rereg_user_mr)(struct ib_mr *, int, u64, u64, u64, int, struct ib_pd *, struct ib_udata *); + int (*dereg_mr)(struct ib_mr *, struct ib_udata *); + struct ib_mr * (*alloc_mr)(struct ib_pd *, enum ib_mr_type, u32); + struct ib_mr * (*alloc_mr_integrity)(struct ib_pd *, u32, u32); + int (*advise_mr)(struct ib_pd *, enum ib_uverbs_advise_mr_advice, u32, struct ib_sge *, u32, struct uverbs_attr_bundle *); + int (*map_mr_sg)(struct ib_mr *, struct scatterlist *, int, unsigned int *); + int (*check_mr_status)(struct ib_mr *, u32, struct ib_mr_status *); + int (*alloc_mw)(struct ib_mw *, struct ib_udata *); + int (*dealloc_mw)(struct ib_mw *); + int (*attach_mcast)(struct ib_qp *, union ib_gid *, u16); + int (*detach_mcast)(struct ib_qp *, union ib_gid *, u16); + int (*alloc_xrcd)(struct ib_xrcd *, struct ib_udata *); + int (*dealloc_xrcd)(struct ib_xrcd *, struct ib_udata *); + struct ib_flow * (*create_flow)(struct ib_qp *, struct ib_flow_attr *, struct ib_udata *); + int (*destroy_flow)(struct ib_flow *); + int (*destroy_flow_action)(struct ib_flow_action *); + int (*set_vf_link_state)(struct ib_device *, int, u32, int); + int (*get_vf_config)(struct ib_device *, int, u32, struct ifla_vf_info *); + int (*get_vf_stats)(struct ib_device *, int, u32, struct ifla_vf_stats *); + int (*get_vf_guid)(struct ib_device *, int, u32, struct ifla_vf_guid *, struct ifla_vf_guid *); + int (*set_vf_guid)(struct ib_device *, int, u32, u64, int); + struct ib_wq * (*create_wq)(struct ib_pd *, struct ib_wq_init_attr *, struct ib_udata *); + int (*destroy_wq)(struct ib_wq *, struct ib_udata *); + int (*modify_wq)(struct ib_wq *, struct ib_wq_attr *, u32, struct ib_udata *); + int (*create_rwq_ind_table)(struct ib_rwq_ind_table *, struct ib_rwq_ind_table_init_attr *, struct ib_udata *); + int (*destroy_rwq_ind_table)(struct ib_rwq_ind_table *); + struct ib_dm * (*alloc_dm)(struct ib_device *, struct ib_ucontext *, struct ib_dm_alloc_attr *, struct uverbs_attr_bundle *); + int (*dealloc_dm)(struct ib_dm *, struct uverbs_attr_bundle *); + struct ib_mr * (*reg_dm_mr)(struct ib_pd *, struct ib_dm *, struct ib_dm_mr_attr *, struct uverbs_attr_bundle *); + int (*create_counters)(struct ib_counters *, struct uverbs_attr_bundle *); + int (*destroy_counters)(struct ib_counters *); + int (*read_counters)(struct ib_counters *, struct ib_counters_read_attr *, struct uverbs_attr_bundle *); + int (*map_mr_sg_pi)(struct ib_mr *, struct scatterlist *, int, unsigned int *, struct scatterlist *, int, unsigned int *); + struct rdma_hw_stats * (*alloc_hw_device_stats)(struct ib_device *); + struct rdma_hw_stats * (*alloc_hw_port_stats)(struct ib_device *, u32); + int (*get_hw_stats)(struct ib_device *, struct rdma_hw_stats *, u32, int); + int (*modify_hw_stat)(struct ib_device *, u32, unsigned int, bool); + int (*fill_res_mr_entry)(struct sk_buff *, struct ib_mr *); + int (*fill_res_mr_entry_raw)(struct sk_buff *, struct ib_mr *); + int (*fill_res_cq_entry)(struct sk_buff *, struct ib_cq *); + int (*fill_res_cq_entry_raw)(struct sk_buff *, struct ib_cq *); + int (*fill_res_qp_entry)(struct sk_buff *, struct ib_qp *); + int (*fill_res_qp_entry_raw)(struct sk_buff *, struct ib_qp *); + int (*fill_res_cm_id_entry)(struct sk_buff *, struct rdma_cm_id *); + int (*enable_driver)(struct ib_device *); + void (*dealloc_driver)(struct ib_device *); + void (*iw_add_ref)(struct ib_qp *); + void (*iw_rem_ref)(struct ib_qp *); + struct ib_qp * (*iw_get_qp)(struct ib_device *, int); + int (*iw_connect)(struct iw_cm_id *, struct iw_cm_conn_param *); + int (*iw_accept)(struct iw_cm_id *, struct iw_cm_conn_param *); + int (*iw_reject)(struct iw_cm_id *, const void *, u8); + int (*iw_create_listen)(struct iw_cm_id *, int); + int (*iw_destroy_listen)(struct iw_cm_id *); + int (*counter_bind_qp)(struct rdma_counter *, struct ib_qp *); + int (*counter_unbind_qp)(struct ib_qp *); + int (*counter_dealloc)(struct rdma_counter *); + struct rdma_hw_stats * (*counter_alloc_stats)(struct rdma_counter *); + int (*counter_update_stats)(struct rdma_counter *); + int (*fill_stat_mr_entry)(struct sk_buff *, struct ib_mr *); + int (*query_ucontext)(struct ib_ucontext *, struct uverbs_attr_bundle *); + int (*get_numa_node)(struct ib_device *); + size_t size_ib_ah; + size_t size_ib_counters; + size_t size_ib_cq; + size_t size_ib_mw; + size_t size_ib_pd; + size_t size_ib_qp; + size_t size_ib_rwq_ind_table; + size_t size_ib_srq; + size_t size_ib_ucontext; + size_t size_ib_xrcd; +}; + +struct ib_core_device { + struct device dev; + possible_net_t rdma_net; + struct kobject *ports_kobj; + struct list_head port_list; + struct ib_device *owner; + long: 32; +}; + +enum ib_atomic_cap { + IB_ATOMIC_NONE = 0, + IB_ATOMIC_HCA = 1, + IB_ATOMIC_GLOB = 2, +}; + +struct ib_odp_caps { + uint64_t general_caps; + struct { + uint32_t rc_odp_caps; + uint32_t uc_odp_caps; + uint32_t ud_odp_caps; + uint32_t xrc_odp_caps; + } per_transport_caps; +}; + +struct ib_rss_caps { + u32 supported_qpts; + u32 max_rwq_indirection_tables; + u32 max_rwq_indirection_table_size; +}; + +struct ib_tm_caps { + u32 max_rndv_hdr_size; + u32 max_num_tags; + u32 flags; + u32 max_ops; + u32 max_sge; +}; + +struct ib_cq_caps { + u16 max_cq_moderation_count; + u16 max_cq_moderation_period; +}; + +struct ib_device_attr { + u64 fw_ver; + __be64 sys_image_guid; + u64 max_mr_size; + u64 page_size_cap; + u32 vendor_id; + u32 vendor_part_id; + u32 hw_ver; + int max_qp; + int max_qp_wr; + long: 32; + u64 device_cap_flags; + u64 kernel_cap_flags; + int max_send_sge; + int max_recv_sge; + int max_sge_rd; + int max_cq; + int max_cqe; + int max_mr; + int max_pd; + int max_qp_rd_atom; + int max_ee_rd_atom; + int max_res_rd_atom; + int max_qp_init_rd_atom; + int max_ee_init_rd_atom; + enum ib_atomic_cap atomic_cap; + enum ib_atomic_cap masked_atomic_cap; + int max_ee; + int max_rdd; + int max_mw; + int max_raw_ipv6_qp; + int max_raw_ethy_qp; + int max_mcast_grp; + int max_mcast_qp_attach; + int max_total_mcast_qp_attach; + int max_ah; + int max_srq; + int max_srq_wr; + int max_srq_sge; + unsigned int max_fast_reg_page_list_len; + unsigned int max_pi_fast_reg_page_list_len; + u16 max_pkeys; + u8 local_ca_ack_delay; + int sig_prot_cap; + int sig_guard_cap; + long: 32; + struct ib_odp_caps odp_caps; + uint64_t timestamp_mask; + uint64_t hca_core_clock; + struct ib_rss_caps rss_caps; + u32 max_wq_type_rq; + u32 raw_packet_caps; + struct ib_tm_caps tm_caps; + struct ib_cq_caps cq_caps; + long: 32; + u64 max_dm_size; + u32 max_sgl_rd; + long: 32; +}; + +struct hw_stats_device_data; + +struct rdma_restrack_root; + +struct uapi_definition; + +struct ib_port_data; + +struct ib_device { + struct device *dma_device; + struct ib_device_ops ops; + char name[64]; + struct callback_head callback_head; + struct list_head event_handler_list; + struct rw_semaphore event_handler_rwsem; + spinlock_t qp_open_list_lock; + struct rw_semaphore client_data_rwsem; + struct xarray client_data; + struct mutex unregistration_lock; + rwlock_t cache_lock; + struct ib_port_data *port_data; + int num_comp_vectors; + union { + struct device dev; + struct ib_core_device coredev; + }; + const struct attribute_group *groups[4]; + u64 uverbs_cmd_mask; + char node_desc[64]; + __be64 node_guid; + u32 local_dma_lkey; + u16 is_switch: 1; + u16 kverbs_provider: 1; + u16 use_cq_dim: 1; + u8 node_type; + u32 phys_port_cnt; + long: 32; + struct ib_device_attr attrs; + struct hw_stats_device_data *hw_stats_data; + struct rdmacg_device cg_device; + u32 index; + spinlock_t cq_pools_lock; + struct list_head cq_pools[3]; + struct rdma_restrack_root *res; + const struct uapi_definition *driver_def; + refcount_t refcount; + struct completion unreg_completion; + struct work_struct unregistration_work; + const struct rdma_link_ops *link_ops; + struct mutex compat_devs_mutex; + struct xarray compat_devs; + char iw_ifname[16]; + u32 iw_driver_flags; + u32 lag_flags; +}; + +enum ib_signature_type { + IB_SIG_TYPE_NONE = 0, + IB_SIG_TYPE_T10_DIF = 1, +}; + +enum ib_t10_dif_bg_type { + IB_T10DIF_CRC = 0, + IB_T10DIF_CSUM = 1, +}; + +struct ib_t10_dif_domain { + enum ib_t10_dif_bg_type bg_type; + u16 pi_interval; + u16 bg; + u16 app_tag; + u32 ref_tag; + bool ref_remap; + bool app_escape; + bool ref_escape; + u16 apptag_check_mask; +}; + +struct ib_sig_domain { + enum ib_signature_type sig_type; + union { + struct ib_t10_dif_domain dif; + } sig; +}; + +struct ib_sig_attrs { + u8 check_mask; + struct ib_sig_domain mem; + struct ib_sig_domain wire; + int meta_length; +}; + +enum ib_sig_err_type { + IB_SIG_BAD_GUARD = 0, + IB_SIG_BAD_REFTAG = 1, + IB_SIG_BAD_APPTAG = 2, +}; + +struct ib_sig_err { + enum ib_sig_err_type err_type; + u32 expected; + u32 actual; + long: 32; + u64 sig_err_offset; + u32 key; + long: 32; +}; + +union ib_gid { + u8 raw[16]; + struct { + __be64 subnet_prefix; + __be64 interface_id; + } global; +}; + +enum ib_gid_type { + IB_GID_TYPE_IB = 0, + IB_GID_TYPE_ROCE = 1, + IB_GID_TYPE_ROCE_UDP_ENCAP = 2, + IB_GID_TYPE_SIZE = 3, +}; + +struct ib_gid_attr { + struct net_device *ndev; + struct ib_device *device; + union ib_gid gid; + enum ib_gid_type gid_type; + u16 index; + u32 port_num; + long: 32; +}; + +struct ib_cq_init_attr { + unsigned int cqe; + u32 comp_vector; + u32 flags; +}; + +struct ib_dm_mr_attr { + u64 length; + u64 offset; + u32 access_flags; + long: 32; +}; + +struct ib_dm_alloc_attr { + u64 length; + u32 alignment; + u32 flags; +}; + +enum ib_mtu { + IB_MTU_256 = 1, + IB_MTU_512 = 2, + IB_MTU_1024 = 3, + IB_MTU_2048 = 4, + IB_MTU_4096 = 5, +}; + +enum ib_port_state { + IB_PORT_NOP = 0, + IB_PORT_DOWN = 1, + IB_PORT_INIT = 2, + IB_PORT_ARMED = 3, + IB_PORT_ACTIVE = 4, + IB_PORT_ACTIVE_DEFER = 5, +}; + +struct rdma_stat_desc { + const char *name; + unsigned int flags; + const void *priv; +}; + +struct ib_port_attr { + u64 subnet_prefix; + enum ib_port_state state; + enum ib_mtu max_mtu; + enum ib_mtu active_mtu; + u32 phys_mtu; + int gid_tbl_len; + unsigned int ip_gids: 1; + u32 port_cap_flags; + u32 max_msg_sz; + u32 bad_pkey_cntr; + u32 qkey_viol_cntr; + u16 pkey_tbl_len; + u32 sm_lid; + u32 lid; + u8 lmc; + u8 max_vl_num; + u8 sm_sl; + u8 subnet_timeout; + u8 init_type_reply; + u8 active_width; + u16 active_speed; + u8 phys_state; + u16 port_cap_flags2; +}; + +struct ib_device_modify { + u64 sys_image_guid; + char node_desc[64]; +}; + +struct ib_port_modify { + u32 set_port_cap_mask; + u32 clr_port_cap_mask; + u8 init_type; +}; + +enum ib_event_type { + IB_EVENT_CQ_ERR = 0, + IB_EVENT_QP_FATAL = 1, + IB_EVENT_QP_REQ_ERR = 2, + IB_EVENT_QP_ACCESS_ERR = 3, + IB_EVENT_COMM_EST = 4, + IB_EVENT_SQ_DRAINED = 5, + IB_EVENT_PATH_MIG = 6, + IB_EVENT_PATH_MIG_ERR = 7, + IB_EVENT_DEVICE_FATAL = 8, + IB_EVENT_PORT_ACTIVE = 9, + IB_EVENT_PORT_ERR = 10, + IB_EVENT_LID_CHANGE = 11, + IB_EVENT_PKEY_CHANGE = 12, + IB_EVENT_SM_CHANGE = 13, + IB_EVENT_SRQ_ERR = 14, + IB_EVENT_SRQ_LIMIT_REACHED = 15, + IB_EVENT_QP_LAST_WQE_REACHED = 16, + IB_EVENT_CLIENT_REREGISTER = 17, + IB_EVENT_GID_CHANGE = 18, + IB_EVENT_WQ_FATAL = 19, +}; + +struct ib_ucq_object; + +typedef void (*ib_comp_handler)(struct ib_cq *, void *); + +struct ib_event; + +struct ib_cq { + struct ib_device *device; + struct ib_ucq_object *uobject; + ib_comp_handler comp_handler; + void (*event_handler)(struct ib_event *, void *); + void *cq_context; + int cqe; + unsigned int cqe_used; + atomic_t usecnt; + enum ib_poll_context poll_ctx; + struct ib_wc *wc; + struct list_head pool_entry; + union { + struct irq_poll iop; + struct work_struct work; + }; + struct workqueue_struct *comp_wq; + struct dim *dim; + long: 32; + ktime_t timestamp; + u8 interrupt: 1; + u8 shared: 1; + unsigned int comp_vector; + struct rdma_restrack_entry res; + long: 32; +}; + +struct ib_uqp_object; + +enum ib_qp_type { + IB_QPT_SMI = 0, + IB_QPT_GSI = 1, + IB_QPT_RC = 2, + IB_QPT_UC = 3, + IB_QPT_UD = 4, + IB_QPT_RAW_IPV6 = 5, + IB_QPT_RAW_ETHERTYPE = 6, + IB_QPT_RAW_PACKET = 8, + IB_QPT_XRC_INI = 9, + IB_QPT_XRC_TGT = 10, + IB_QPT_MAX = 11, + IB_QPT_DRIVER = 255, + IB_QPT_RESERVED1 = 4096, + IB_QPT_RESERVED2 = 4097, + IB_QPT_RESERVED3 = 4098, + IB_QPT_RESERVED4 = 4099, + IB_QPT_RESERVED5 = 4100, + IB_QPT_RESERVED6 = 4101, + IB_QPT_RESERVED7 = 4102, + IB_QPT_RESERVED8 = 4103, + IB_QPT_RESERVED9 = 4104, + IB_QPT_RESERVED10 = 4105, +}; + +struct ib_qp_security; + +struct ib_qp { + struct ib_device *device; + struct ib_pd *pd; + struct ib_cq *send_cq; + struct ib_cq *recv_cq; + spinlock_t mr_lock; + int mrs_used; + struct list_head rdma_mrs; + struct list_head sig_mrs; + struct ib_srq *srq; + struct ib_xrcd *xrcd; + struct list_head xrcd_list; + atomic_t usecnt; + struct list_head open_list; + struct ib_qp *real_qp; + struct ib_uqp_object *uobject; + void (*event_handler)(struct ib_event *, void *); + void *qp_context; + const struct ib_gid_attr *av_sgid_attr; + const struct ib_gid_attr *alt_path_sgid_attr; + u32 qp_num; + u32 max_write_sge; + u32 max_read_sge; + enum ib_qp_type qp_type; + struct ib_rwq_ind_table *rwq_ind_tbl; + struct ib_qp_security *qp_sec; + u32 port; + bool integrity_en; + struct rdma_restrack_entry res; + struct rdma_counter *counter; +}; + +struct ib_usrq_object; + +enum ib_srq_type { + IB_SRQT_BASIC = 0, + IB_SRQT_XRC = 1, + IB_SRQT_TM = 2, +}; + +struct ib_srq { + struct ib_device *device; + struct ib_pd *pd; + struct ib_usrq_object *uobject; + void (*event_handler)(struct ib_event *, void *); + void *srq_context; + enum ib_srq_type srq_type; + atomic_t usecnt; + struct { + struct ib_cq *cq; + union { + struct { + struct ib_xrcd *xrcd; + u32 srq_num; + } xrc; + }; + } ext; + struct rdma_restrack_entry res; +}; + +struct ib_uwq_object; + +enum ib_wq_state { + IB_WQS_RESET = 0, + IB_WQS_RDY = 1, + IB_WQS_ERR = 2, +}; + +enum ib_wq_type { + IB_WQT_RQ = 0, +}; + +struct ib_wq { + struct ib_device *device; + struct ib_uwq_object *uobject; + void *wq_context; + void (*event_handler)(struct ib_event *, void *); + struct ib_pd *pd; + struct ib_cq *cq; + u32 wq_num; + enum ib_wq_state state; + enum ib_wq_type wq_type; + atomic_t usecnt; +}; + +struct ib_event { + struct ib_device *device; + union { + struct ib_cq *cq; + struct ib_qp *qp; + struct ib_srq *srq; + struct ib_wq *wq; + u32 port_num; + } element; + enum ib_event_type event; +}; + +struct ib_global_route { + const struct ib_gid_attr *sgid_attr; + long: 32; + union ib_gid dgid; + u32 flow_label; + u8 sgid_index; + u8 hop_limit; + u8 traffic_class; +}; + +struct ib_grh { + __be32 version_tclass_flow; + __be16 paylen; + u8 next_hdr; + u8 hop_limit; + union ib_gid sgid; + union ib_gid dgid; +}; + +struct ib_mr_status { + u32 fail_status; + long: 32; + struct ib_sig_err sig_err; +}; + +struct rdma_ah_init_attr { + struct rdma_ah_attr *ah_attr; + u32 flags; + struct net_device *xmit_slave; +}; + +enum rdma_ah_attr_type { + RDMA_AH_ATTR_TYPE_UNDEFINED = 0, + RDMA_AH_ATTR_TYPE_IB = 1, + RDMA_AH_ATTR_TYPE_ROCE = 2, + RDMA_AH_ATTR_TYPE_OPA = 3, +}; + +struct ib_ah_attr { + u16 dlid; + u8 src_path_bits; +}; + +struct roce_ah_attr { + u8 dmac[6]; +}; + +struct opa_ah_attr { + u32 dlid; + u8 src_path_bits; + bool make_grd; +}; + +struct rdma_ah_attr { + struct ib_global_route grh; + u8 sl; + u8 static_rate; + u32 port_num; + u8 ah_flags; + enum rdma_ah_attr_type type; + union { + struct ib_ah_attr ib; + struct roce_ah_attr roce; + struct opa_ah_attr opa; + }; +}; + +enum ib_wc_status { + IB_WC_SUCCESS = 0, + IB_WC_LOC_LEN_ERR = 1, + IB_WC_LOC_QP_OP_ERR = 2, + IB_WC_LOC_EEC_OP_ERR = 3, + IB_WC_LOC_PROT_ERR = 4, + IB_WC_WR_FLUSH_ERR = 5, + IB_WC_MW_BIND_ERR = 6, + IB_WC_BAD_RESP_ERR = 7, + IB_WC_LOC_ACCESS_ERR = 8, + IB_WC_REM_INV_REQ_ERR = 9, + IB_WC_REM_ACCESS_ERR = 10, + IB_WC_REM_OP_ERR = 11, + IB_WC_RETRY_EXC_ERR = 12, + IB_WC_RNR_RETRY_EXC_ERR = 13, + IB_WC_LOC_RDD_VIOL_ERR = 14, + IB_WC_REM_INV_RD_REQ_ERR = 15, + IB_WC_REM_ABORT_ERR = 16, + IB_WC_INV_EECN_ERR = 17, + IB_WC_INV_EEC_STATE_ERR = 18, + IB_WC_FATAL_ERR = 19, + IB_WC_RESP_TIMEOUT_ERR = 20, + IB_WC_GENERAL_ERR = 21, +}; + +enum ib_wc_opcode { + IB_WC_SEND = 0, + IB_WC_RDMA_WRITE = 1, + IB_WC_RDMA_READ = 2, + IB_WC_COMP_SWAP = 3, + IB_WC_FETCH_ADD = 4, + IB_WC_BIND_MW = 5, + IB_WC_LOCAL_INV = 6, + IB_WC_LSO = 7, + IB_WC_ATOMIC_WRITE = 9, + IB_WC_REG_MR = 10, + IB_WC_MASKED_COMP_SWAP = 11, + IB_WC_MASKED_FETCH_ADD = 12, + IB_WC_FLUSH = 8, + IB_WC_RECV = 128, + IB_WC_RECV_RDMA_WITH_IMM = 129, +}; + +struct ib_cqe { + void (*done)(struct ib_cq *, struct ib_wc *); +}; + +struct ib_wc { + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + enum ib_wc_status status; + enum ib_wc_opcode opcode; + u32 vendor_err; + u32 byte_len; + struct ib_qp *qp; + union { + __be32 imm_data; + u32 invalidate_rkey; + } ex; + u32 src_qp; + u32 slid; + int wc_flags; + u16 pkey_index; + u8 sl; + u8 dlid_path_bits; + u32 port_num; + u8 smac[6]; + u16 vlan_id; + u8 network_hdr_type; +}; + +struct ib_srq_attr { + u32 max_wr; + u32 max_sge; + u32 srq_limit; +}; + +struct ib_xrcd { + struct ib_device *device; + atomic_t usecnt; + struct inode *inode; + struct rw_semaphore tgt_qps_rwsem; + struct xarray tgt_qps; +}; + +struct ib_srq_init_attr { + void (*event_handler)(struct ib_event *, void *); + void *srq_context; + struct ib_srq_attr attr; + enum ib_srq_type srq_type; + struct { + struct ib_cq *cq; + union { + struct { + struct ib_xrcd *xrcd; + } xrc; + struct { + u32 max_num_tags; + } tag_matching; + }; + } ext; +}; + +struct ib_qp_cap { + u32 max_send_wr; + u32 max_recv_wr; + u32 max_send_sge; + u32 max_recv_sge; + u32 max_inline_data; + u32 max_rdma_ctxs; +}; + +enum ib_sig_type { + IB_SIGNAL_ALL_WR = 0, + IB_SIGNAL_REQ_WR = 1, +}; + +struct ib_qp_init_attr { + void (*event_handler)(struct ib_event *, void *); + void *qp_context; + struct ib_cq *send_cq; + struct ib_cq *recv_cq; + struct ib_srq *srq; + struct ib_xrcd *xrcd; + struct ib_qp_cap cap; + enum ib_sig_type sq_sig_type; + enum ib_qp_type qp_type; + u32 create_flags; + u32 port_num; + struct ib_rwq_ind_table *rwq_ind_tbl; + u32 source_qpn; +}; + +struct ib_uobject; + +struct ib_rwq_ind_table { + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; + u32 ind_tbl_num; + u32 log_ind_tbl_size; + struct ib_wq **ind_tbl; +}; + +enum ib_qp_state { + IB_QPS_RESET = 0, + IB_QPS_INIT = 1, + IB_QPS_RTR = 2, + IB_QPS_RTS = 3, + IB_QPS_SQD = 4, + IB_QPS_SQE = 5, + IB_QPS_ERR = 6, +}; + +enum ib_mig_state { + IB_MIG_MIGRATED = 0, + IB_MIG_REARM = 1, + IB_MIG_ARMED = 2, +}; + +enum ib_mw_type { + IB_MW_TYPE_1 = 1, + IB_MW_TYPE_2 = 2, +}; + +struct ib_qp_attr { + enum ib_qp_state qp_state; + enum ib_qp_state cur_qp_state; + enum ib_mtu path_mtu; + enum ib_mig_state path_mig_state; + u32 qkey; + u32 rq_psn; + u32 sq_psn; + u32 dest_qp_num; + int qp_access_flags; + struct ib_qp_cap cap; + long: 32; + struct rdma_ah_attr ah_attr; + struct rdma_ah_attr alt_ah_attr; + u16 pkey_index; + u16 alt_pkey_index; + u8 en_sqd_async_notify; + u8 sq_draining; + u8 max_rd_atomic; + u8 max_dest_rd_atomic; + u8 min_rnr_timer; + u32 port_num; + u8 timeout; + u8 retry_cnt; + u8 rnr_retry; + u32 alt_port_num; + u8 alt_timeout; + u32 rate_limit; + struct net_device *xmit_slave; + long: 32; +}; + +enum ib_wr_opcode { + IB_WR_RDMA_WRITE = 0, + IB_WR_RDMA_WRITE_WITH_IMM = 1, + IB_WR_SEND = 2, + IB_WR_SEND_WITH_IMM = 3, + IB_WR_RDMA_READ = 4, + IB_WR_ATOMIC_CMP_AND_SWP = 5, + IB_WR_ATOMIC_FETCH_AND_ADD = 6, + IB_WR_BIND_MW = 8, + IB_WR_LSO = 10, + IB_WR_SEND_WITH_INV = 9, + IB_WR_RDMA_READ_WITH_INV = 11, + IB_WR_LOCAL_INV = 7, + IB_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, + IB_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, + IB_WR_FLUSH = 14, + IB_WR_ATOMIC_WRITE = 15, + IB_WR_REG_MR = 32, + IB_WR_REG_MR_INTEGRITY = 33, + IB_WR_RESERVED1 = 240, + IB_WR_RESERVED2 = 241, + IB_WR_RESERVED3 = 242, + IB_WR_RESERVED4 = 243, + IB_WR_RESERVED5 = 244, + IB_WR_RESERVED6 = 245, + IB_WR_RESERVED7 = 246, + IB_WR_RESERVED8 = 247, + IB_WR_RESERVED9 = 248, + IB_WR_RESERVED10 = 249, +}; + +struct ib_sge { + u64 addr; + u32 length; + u32 lkey; +}; + +struct ib_send_wr { + struct ib_send_wr *next; + long: 32; + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + struct ib_sge *sg_list; + int num_sge; + enum ib_wr_opcode opcode; + int send_flags; + union { + __be32 imm_data; + u32 invalidate_rkey; + } ex; + long: 32; +}; + +struct ib_ah { + struct ib_device *device; + struct ib_pd *pd; + struct ib_uobject *uobject; + const struct ib_gid_attr *sgid_attr; + enum rdma_ah_attr_type type; +}; + +struct ib_mr { + struct ib_device *device; + struct ib_pd *pd; + u32 lkey; + u32 rkey; + u64 iova; + u64 length; + unsigned int page_size; + enum ib_mr_type type; + bool need_inval; + union { + struct ib_uobject *uobject; + struct list_head qp_entry; + }; + struct ib_dm *dm; + struct ib_sig_attrs *sig_attrs; + struct rdma_restrack_entry res; +}; + +struct ib_recv_wr { + struct ib_recv_wr *next; + long: 32; + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + struct ib_sge *sg_list; + int num_sge; +}; + +struct ib_rdmacg_object { + struct rdma_cgroup *cg; +}; + +struct ib_uverbs_file; + +struct ib_ucontext { + struct ib_device *device; + struct ib_uverbs_file *ufile; + struct ib_rdmacg_object cg_obj; + struct rdma_restrack_entry res; + struct xarray mmap_xa; +}; + +struct uverbs_api_object; + +struct ib_uobject { + u64 user_handle; + struct ib_uverbs_file *ufile; + struct ib_ucontext *context; + void *object; + struct list_head list; + struct ib_rdmacg_object cg_obj; + int id; + struct kref ref; + atomic_t usecnt; + struct callback_head rcu; + const struct uverbs_api_object *uapi_object; +}; + +struct ib_udata { + const void *inbuf; + void *outbuf; + size_t inlen; + size_t outlen; +}; + +struct ib_pd { + u32 local_dma_lkey; + u32 flags; + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; + u32 unsafe_global_rkey; + struct ib_mr *__internal_mr; + struct rdma_restrack_entry res; +}; + +struct ib_wq_init_attr { + void *wq_context; + enum ib_wq_type wq_type; + u32 max_wr; + u32 max_sge; + struct ib_cq *cq; + void (*event_handler)(struct ib_event *, void *); + u32 create_flags; +}; + +struct ib_wq_attr { + enum ib_wq_state wq_state; + enum ib_wq_state curr_wq_state; + u32 flags; + u32 flags_mask; +}; + +struct ib_rwq_ind_table_init_attr { + u32 log_ind_tbl_size; + struct ib_wq **ind_tbl; +}; + +enum port_pkey_state { + IB_PORT_PKEY_NOT_VALID = 0, + IB_PORT_PKEY_VALID = 1, + IB_PORT_PKEY_LISTED = 2, +}; + +struct ib_port_pkey { + enum port_pkey_state state; + u16 pkey_index; + u32 port_num; + struct list_head qp_list; + struct list_head to_error_list; + struct ib_qp_security *sec; +}; + +struct ib_ports_pkeys; + +struct ib_qp_security { + struct ib_qp *qp; + struct ib_device *dev; + struct mutex mutex; + struct ib_ports_pkeys *ports_pkeys; + struct list_head shared_qp_list; + void *security; + bool destroying; + atomic_t error_list_count; + struct completion error_complete; + int error_comps_pending; +}; + +struct ib_ports_pkeys { + struct ib_port_pkey main; + struct ib_port_pkey alt; +}; + +struct ib_dm { + struct ib_device *device; + u32 length; + u32 flags; + struct ib_uobject *uobject; + atomic_t usecnt; +}; + +struct ib_mw { + struct ib_device *device; + struct ib_pd *pd; + struct ib_uobject *uobject; + u32 rkey; + enum ib_mw_type type; +}; + +enum ib_flow_attr_type { + IB_FLOW_ATTR_NORMAL = 0, + IB_FLOW_ATTR_ALL_DEFAULT = 1, + IB_FLOW_ATTR_MC_DEFAULT = 2, + IB_FLOW_ATTR_SNIFFER = 3, +}; + +enum ib_flow_spec_type { + IB_FLOW_SPEC_ETH = 32, + IB_FLOW_SPEC_IB = 34, + IB_FLOW_SPEC_IPV4 = 48, + IB_FLOW_SPEC_IPV6 = 49, + IB_FLOW_SPEC_ESP = 52, + IB_FLOW_SPEC_TCP = 64, + IB_FLOW_SPEC_UDP = 65, + IB_FLOW_SPEC_VXLAN_TUNNEL = 80, + IB_FLOW_SPEC_GRE = 81, + IB_FLOW_SPEC_MPLS = 96, + IB_FLOW_SPEC_INNER = 256, + IB_FLOW_SPEC_ACTION_TAG = 4096, + IB_FLOW_SPEC_ACTION_DROP = 4097, + IB_FLOW_SPEC_ACTION_HANDLE = 4098, + IB_FLOW_SPEC_ACTION_COUNT = 4099, +}; + +struct ib_flow_eth_filter { + u8 dst_mac[6]; + u8 src_mac[6]; + __be16 ether_type; + __be16 vlan_tag; + u8 real_sz[0]; +}; + +struct ib_flow_spec_eth { + u32 type; + u16 size; + struct ib_flow_eth_filter val; + struct ib_flow_eth_filter mask; +}; + +struct ib_flow_ib_filter { + __be16 dlid; + __u8 sl; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ib { + u32 type; + u16 size; + struct ib_flow_ib_filter val; + struct ib_flow_ib_filter mask; +}; + +struct ib_flow_ipv4_filter { + __be32 src_ip; + __be32 dst_ip; + u8 proto; + u8 tos; + u8 ttl; + u8 flags; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ipv4 { + u32 type; + u16 size; + struct ib_flow_ipv4_filter val; + struct ib_flow_ipv4_filter mask; +}; + +struct ib_flow_ipv6_filter { + u8 src_ip[16]; + u8 dst_ip[16]; + __be32 flow_label; + u8 next_hdr; + u8 traffic_class; + u8 hop_limit; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ipv6 { + u32 type; + u16 size; + struct ib_flow_ipv6_filter val; + struct ib_flow_ipv6_filter mask; +}; + +struct ib_flow_tcp_udp_filter { + __be16 dst_port; + __be16 src_port; + u8 real_sz[0]; +}; + +struct ib_flow_spec_tcp_udp { + u32 type; + u16 size; + struct ib_flow_tcp_udp_filter val; + struct ib_flow_tcp_udp_filter mask; +}; + +struct ib_flow_tunnel_filter { + __be32 tunnel_id; + u8 real_sz[0]; +}; + +struct ib_flow_spec_tunnel { + u32 type; + u16 size; + struct ib_flow_tunnel_filter val; + struct ib_flow_tunnel_filter mask; +}; + +struct ib_flow_esp_filter { + __be32 spi; + __be32 seq; + u8 real_sz[0]; +}; + +struct ib_flow_spec_esp { + u32 type; + u16 size; + struct ib_flow_esp_filter val; + struct ib_flow_esp_filter mask; +}; + +struct ib_flow_gre_filter { + __be16 c_ks_res0_ver; + __be16 protocol; + __be32 key; + u8 real_sz[0]; +}; + +struct ib_flow_spec_gre { + u32 type; + u16 size; + struct ib_flow_gre_filter val; + struct ib_flow_gre_filter mask; +}; + +struct ib_flow_mpls_filter { + __be32 tag; + u8 real_sz[0]; +}; + +struct ib_flow_spec_mpls { + u32 type; + u16 size; + struct ib_flow_mpls_filter val; + struct ib_flow_mpls_filter mask; +}; + +struct ib_flow_spec_action_tag { + enum ib_flow_spec_type type; + u16 size; + u32 tag_id; +}; + +struct ib_flow_spec_action_drop { + enum ib_flow_spec_type type; + u16 size; +}; + +struct ib_flow_spec_action_handle { + enum ib_flow_spec_type type; + u16 size; + struct ib_flow_action *act; +}; + +enum ib_flow_action_type { + IB_FLOW_ACTION_UNSPECIFIED = 0, + IB_FLOW_ACTION_ESP = 1, +}; + +struct ib_flow_action { + struct ib_device *device; + struct ib_uobject *uobject; + enum ib_flow_action_type type; + atomic_t usecnt; +}; + +struct ib_flow_spec_action_count { + enum ib_flow_spec_type type; + u16 size; + struct ib_counters *counters; +}; + +struct ib_counters { + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; +}; + +union ib_flow_spec { + struct { + u32 type; + u16 size; + }; + struct ib_flow_spec_eth eth; + struct ib_flow_spec_ib ib; + struct ib_flow_spec_ipv4 ipv4; + struct ib_flow_spec_tcp_udp tcp_udp; + struct ib_flow_spec_ipv6 ipv6; + struct ib_flow_spec_tunnel tunnel; + struct ib_flow_spec_esp esp; + struct ib_flow_spec_gre gre; + struct ib_flow_spec_mpls mpls; + struct ib_flow_spec_action_tag flow_tag; + struct ib_flow_spec_action_drop drop; + struct ib_flow_spec_action_handle action; + struct ib_flow_spec_action_count flow_count; +}; + +struct ib_flow_attr { + enum ib_flow_attr_type type; + u16 size; + u16 priority; + u32 flags; + u8 num_of_specs; + u32 port; + union ib_flow_spec flows[0]; +}; + +struct ib_flow { + struct ib_qp *qp; + struct ib_device *device; + struct ib_uobject *uobject; +}; + +struct ib_pkey_cache; + +struct ib_gid_table; + +struct ib_port_cache { + u64 subnet_prefix; + struct ib_pkey_cache *pkey; + struct ib_gid_table *gid; + u8 lmc; + enum ib_port_state port_state; +}; + +struct ib_port_immutable { + int pkey_tbl_len; + int gid_tbl_len; + u32 core_cap_flags; + u32 max_mad_size; +}; + +struct ib_port; + +struct ib_port_data { + struct ib_device *ib_dev; + struct ib_port_immutable immutable; + spinlock_t pkey_list_lock; + spinlock_t netdev_lock; + struct list_head pkey_list; + long: 32; + struct ib_port_cache cache; + struct net_device *netdev; + netdevice_tracker netdev_tracker; + struct hlist_node ndev_hash_link; + struct rdma_port_counter port_counter; + struct ib_port *sysfs; +}; + +struct rdma_netdev_alloc_params { + size_t sizeof_priv; + unsigned int txqs; + unsigned int rxqs; + void *param; + int (*initialize_rdma_netdev)(struct ib_device *, u32, struct net_device *, void *); +}; + +struct ib_counters_read_attr { + u64 *counters_buff; + u32 ncounters; + u32 flags; +}; + +struct rdma_user_mmap_entry { + struct kref ref; + struct ib_ucontext *ucontext; + long unsigned int start_pgoff; + size_t npages; + bool driver_removed; +}; + +enum blk_zone_type { + BLK_ZONE_TYPE_CONVENTIONAL = 1, + BLK_ZONE_TYPE_SEQWRITE_REQ = 2, + BLK_ZONE_TYPE_SEQWRITE_PREF = 3, +}; + +enum blk_zone_cond { + BLK_ZONE_COND_NOT_WP = 0, + BLK_ZONE_COND_EMPTY = 1, + BLK_ZONE_COND_IMP_OPEN = 2, + BLK_ZONE_COND_EXP_OPEN = 3, + BLK_ZONE_COND_CLOSED = 4, + BLK_ZONE_COND_READONLY = 13, + BLK_ZONE_COND_FULL = 14, + BLK_ZONE_COND_OFFLINE = 15, +}; + +enum blk_zone_report_flags { + BLK_ZONE_REP_CAPACITY = 1, +}; + +struct blk_zone_report { + __u64 sector; + __u32 nr_zones; + __u32 flags; + struct blk_zone zones[0]; +}; + +struct blk_zone_range { + __u64 sector; + __u64 nr_sectors; +}; + +struct zone_report_args { + struct blk_zone *zones; +}; + +struct blk_revalidate_zone_args { + struct gendisk *disk; + long unsigned int *conv_zones_bitmap; + long unsigned int *seq_zones_wlock; + unsigned int nr_zones; + sector_t zone_sectors; + sector_t sector; +}; + +enum wbt_flags { + WBT_TRACKED = 1, + WBT_READ = 2, + WBT_KSWAPD = 4, + WBT_DISCARD = 8, + WBT_NR_BITS = 4, +}; + +enum { + WBT_STATE_ON_DEFAULT = 1, + WBT_STATE_ON_MANUAL = 2, + WBT_STATE_OFF_DEFAULT = 3, + WBT_STATE_OFF_MANUAL = 4, +}; + +struct rq_wb { + unsigned int wb_background; + unsigned int wb_normal; + short int enable_state; + unsigned int unknown_cnt; + u64 win_nsec; + u64 cur_win_nsec; + struct blk_stat_callback *cb; + long: 32; + u64 sync_issue; + void *sync_cookie; + unsigned int wc; + long unsigned int last_issue; + long unsigned int last_comp; + long unsigned int min_lat_nsec; + struct rq_qos rqos; + struct rq_wait rq_wait[3]; + struct rq_depth rq_depth; + long: 32; +}; + +struct trace_event_raw_wbt_stat { + struct trace_entry ent; + char name[32]; + s64 rmean; + u64 rmin; + u64 rmax; + s64 rnr_samples; + s64 rtime; + s64 wmean; + u64 wmin; + u64 wmax; + s64 wnr_samples; + s64 wtime; + char __data[0]; +}; + +struct trace_event_raw_wbt_lat { + struct trace_entry ent; + char name[32]; + long unsigned int lat; + char __data[0]; +}; + +struct trace_event_raw_wbt_step { + struct trace_entry ent; + char name[32]; + const char *msg; + int step; + long unsigned int window; + unsigned int bg; + unsigned int normal; + unsigned int max; + char __data[0]; +}; + +struct trace_event_raw_wbt_timer { + struct trace_entry ent; + char name[32]; + unsigned int status; + int step; + unsigned int inflight; + char __data[0]; +}; + +struct trace_event_data_offsets_wbt_stat {}; + +struct trace_event_data_offsets_wbt_lat {}; + +struct trace_event_data_offsets_wbt_step {}; + +struct trace_event_data_offsets_wbt_timer {}; + +typedef void (*btf_trace_wbt_stat)(void *, struct backing_dev_info *, struct blk_rq_stat *); + +typedef void (*btf_trace_wbt_lat)(void *, struct backing_dev_info *, long unsigned int); + +typedef void (*btf_trace_wbt_step)(void *, struct backing_dev_info *, const char *, int, long unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_wbt_timer)(void *, struct backing_dev_info *, unsigned int, int, unsigned int); + +enum { + RWB_DEF_DEPTH = 16, + RWB_WINDOW_NSEC = 100000000, + RWB_MIN_WRITE_SAMPLES = 3, + RWB_UNKNOWN_BUMP = 5, +}; + +enum { + LAT_OK = 1, + LAT_UNKNOWN = 2, + LAT_UNKNOWN_WRITES = 3, + LAT_EXCEEDED = 4, +}; + +struct wbt_wait_data { + struct rq_wb *rwb; + enum wbt_flags wb_acct; + blk_opf_t opf; +}; + +struct show_busy_params { + struct seq_file *m; + struct blk_mq_hw_ctx *hctx; +}; + +enum opal_mbr { + OPAL_MBR_ENABLE = 0, + OPAL_MBR_DISABLE = 1, +}; + +enum opal_mbr_done_flag { + OPAL_MBR_NOT_DONE = 0, + OPAL_MBR_DONE = 1, +}; + +enum opal_user { + OPAL_ADMIN1 = 0, + OPAL_USER1 = 1, + OPAL_USER2 = 2, + OPAL_USER3 = 3, + OPAL_USER4 = 4, + OPAL_USER5 = 5, + OPAL_USER6 = 6, + OPAL_USER7 = 7, + OPAL_USER8 = 8, + OPAL_USER9 = 9, +}; + +enum opal_lock_state { + OPAL_RO = 1, + OPAL_RW = 2, + OPAL_LK = 4, +}; + +enum opal_lock_flags { + OPAL_SAVE_FOR_LOCK = 1, +}; + +struct opal_key { + __u8 lr; + __u8 key_len; + __u8 __align[6]; + __u8 key[256]; +}; + +struct opal_lr_act { + struct opal_key key; + __u32 sum; + __u8 num_lrs; + __u8 lr[9]; + __u8 align[2]; +}; + +struct opal_session_info { + __u32 sum; + __u32 who; + struct opal_key opal_key; +}; + +struct opal_user_lr_setup { + __u64 range_start; + __u64 range_length; + __u32 RLE; + __u32 WLE; + struct opal_session_info session; +}; + +struct opal_lock_unlock { + struct opal_session_info session; + __u32 l_state; + __u16 flags; + __u8 __align[2]; +}; + +struct opal_new_pw { + struct opal_session_info session; + struct opal_session_info new_user_pw; +}; + +struct opal_mbr_data { + struct opal_key key; + __u8 enable_disable; + __u8 __align[7]; +}; + +struct opal_mbr_done { + struct opal_key key; + __u8 done_flag; + __u8 __align[7]; +}; + +struct opal_shadow_mbr { + struct opal_key key; + const __u64 data; + __u64 offset; + __u64 size; +}; + +enum opal_table_ops { + OPAL_READ_TABLE = 0, + OPAL_WRITE_TABLE = 1, +}; + +struct opal_read_write_table { + struct opal_key key; + const __u64 data; + const __u8 table_uid[8]; + __u64 offset; + __u64 size; + __u64 flags; + __u64 priv; +}; + +struct opal_status { + __u32 flags; + __u32 reserved; +}; + +typedef int sec_send_recv(void *, u16, u8, void *, size_t, bool); + +enum { + TCG_SECP_00 = 0, + TCG_SECP_01 = 1, +}; + +enum opal_response_token { + OPAL_DTA_TOKENID_BYTESTRING = 224, + OPAL_DTA_TOKENID_SINT = 225, + OPAL_DTA_TOKENID_UINT = 226, + OPAL_DTA_TOKENID_TOKEN = 227, + OPAL_DTA_TOKENID_INVALID = 0, +}; + +enum opal_uid { + OPAL_SMUID_UID = 0, + OPAL_THISSP_UID = 1, + OPAL_ADMINSP_UID = 2, + OPAL_LOCKINGSP_UID = 3, + OPAL_ENTERPRISE_LOCKINGSP_UID = 4, + OPAL_ANYBODY_UID = 5, + OPAL_SID_UID = 6, + OPAL_ADMIN1_UID = 7, + OPAL_USER1_UID = 8, + OPAL_USER2_UID = 9, + OPAL_PSID_UID = 10, + OPAL_ENTERPRISE_BANDMASTER0_UID = 11, + OPAL_ENTERPRISE_ERASEMASTER_UID = 12, + OPAL_TABLE_TABLE = 13, + OPAL_LOCKINGRANGE_GLOBAL = 14, + OPAL_LOCKINGRANGE_ACE_RDLOCKED = 15, + OPAL_LOCKINGRANGE_ACE_WRLOCKED = 16, + OPAL_MBRCONTROL = 17, + OPAL_MBR = 18, + OPAL_AUTHORITY_TABLE = 19, + OPAL_C_PIN_TABLE = 20, + OPAL_LOCKING_INFO_TABLE = 21, + OPAL_ENTERPRISE_LOCKING_INFO_TABLE = 22, + OPAL_DATASTORE = 23, + OPAL_C_PIN_MSID = 24, + OPAL_C_PIN_SID = 25, + OPAL_C_PIN_ADMIN1 = 26, + OPAL_HALF_UID_AUTHORITY_OBJ_REF = 27, + OPAL_HALF_UID_BOOLEAN_ACE = 28, + OPAL_UID_HEXFF = 29, +}; + +enum opal_method { + OPAL_PROPERTIES = 0, + OPAL_STARTSESSION = 1, + OPAL_REVERT = 2, + OPAL_ACTIVATE = 3, + OPAL_EGET = 4, + OPAL_ESET = 5, + OPAL_NEXT = 6, + OPAL_EAUTHENTICATE = 7, + OPAL_GETACL = 8, + OPAL_GENKEY = 9, + OPAL_REVERTSP = 10, + OPAL_GET = 11, + OPAL_SET = 12, + OPAL_AUTHENTICATE = 13, + OPAL_RANDOM = 14, + OPAL_ERASE = 15, +}; + +enum opal_token { + OPAL_TRUE = 1, + OPAL_FALSE = 0, + OPAL_BOOLEAN_EXPR = 3, + OPAL_TABLE = 0, + OPAL_STARTROW = 1, + OPAL_ENDROW = 2, + OPAL_STARTCOLUMN = 3, + OPAL_ENDCOLUMN = 4, + OPAL_VALUES = 1, + OPAL_TABLE_UID = 0, + OPAL_TABLE_NAME = 1, + OPAL_TABLE_COMMON = 2, + OPAL_TABLE_TEMPLATE = 3, + OPAL_TABLE_KIND = 4, + OPAL_TABLE_COLUMN = 5, + OPAL_TABLE_COLUMNS = 6, + OPAL_TABLE_ROWS = 7, + OPAL_TABLE_ROWS_FREE = 8, + OPAL_TABLE_ROW_BYTES = 9, + OPAL_TABLE_LASTID = 10, + OPAL_TABLE_MIN = 11, + OPAL_TABLE_MAX = 12, + OPAL_PIN = 3, + OPAL_RANGESTART = 3, + OPAL_RANGELENGTH = 4, + OPAL_READLOCKENABLED = 5, + OPAL_WRITELOCKENABLED = 6, + OPAL_READLOCKED = 7, + OPAL_WRITELOCKED = 8, + OPAL_ACTIVEKEY = 10, + OPAL_LIFECYCLE = 6, + OPAL_MAXRANGES = 4, + OPAL_MBRENABLE = 1, + OPAL_MBRDONE = 2, + OPAL_HOSTPROPERTIES = 0, + OPAL_STARTLIST = 240, + OPAL_ENDLIST = 241, + OPAL_STARTNAME = 242, + OPAL_ENDNAME = 243, + OPAL_CALL = 248, + OPAL_ENDOFDATA = 249, + OPAL_ENDOFSESSION = 250, + OPAL_STARTTRANSACTON = 251, + OPAL_ENDTRANSACTON = 252, + OPAL_EMPTYATOM = 255, + OPAL_WHERE = 0, +}; + +enum opal_parameter { + OPAL_SUM_SET_LIST = 393216, +}; + +struct opal_compacket { + __be32 reserved0; + u8 extendedComID[4]; + __be32 outstandingData; + __be32 minTransfer; + __be32 length; +}; + +struct opal_packet { + __be32 tsn; + __be32 hsn; + __be32 seq_number; + __be16 reserved0; + __be16 ack_type; + __be32 acknowledgment; + __be32 length; +}; + +struct opal_data_subpacket { + u8 reserved0[6]; + __be16 kind; + __be32 length; +}; + +struct opal_header { + struct opal_compacket cp; + struct opal_packet pkt; + struct opal_data_subpacket subpkt; +}; + +struct d0_header { + __be32 length; + __be32 revision; + __be32 reserved01; + __be32 reserved02; + u8 ignored[32]; +}; + +struct d0_tper_features { + u8 supported_features; + u8 reserved01[3]; + __be32 reserved02; + __be32 reserved03; +}; + +struct d0_locking_features { + u8 supported_features; + u8 reserved01[3]; + __be32 reserved02; + __be32 reserved03; +}; + +struct d0_geometry_features { + u8 header[4]; + u8 reserved01; + u8 reserved02[7]; + __be32 logical_block_size; + __be64 alignment_granularity; + __be64 lowest_aligned_lba; +}; + +struct d0_opal_v100 { + __be16 baseComID; + __be16 numComIDs; +}; + +struct d0_single_user_mode { + __be32 num_locking_objects; + u8 reserved01; + u8 reserved02; + __be16 reserved03; + __be32 reserved04; +}; + +struct d0_opal_v200 { + __be16 baseComID; + __be16 numComIDs; + u8 range_crossing; + u8 num_locking_admin_auth[2]; + u8 num_locking_user_auth[2]; + u8 initialPIN; + u8 revertedPIN; + u8 reserved01; + __be32 reserved02; +}; + +struct d0_features { + __be16 code; + u8 r_version; + u8 length; + u8 features[0]; +}; + +struct opal_dev; + +struct opal_step { + int (*fn)(struct opal_dev *, void *); + void *data; +}; + +enum opal_atom_width { + OPAL_WIDTH_TINY = 0, + OPAL_WIDTH_SHORT = 1, + OPAL_WIDTH_MEDIUM = 2, + OPAL_WIDTH_LONG = 3, + OPAL_WIDTH_TOKEN = 4, +}; + +struct opal_resp_tok { + const u8 *pos; + size_t len; + enum opal_response_token type; + enum opal_atom_width width; + union { + u64 u; + s64 s; + } stored; +}; + +struct parsed_resp { + int num; + long: 32; + struct opal_resp_tok toks[64]; +}; + +struct opal_dev { + u32 flags; + void *data; + sec_send_recv *send_recv; + struct mutex dev_lock; + u16 comid; + u32 hsn; + u32 tsn; + long: 32; + u64 align; + u64 lowest_lba; + size_t pos; + u8 *cmd; + u8 *resp; + long: 32; + struct parsed_resp parsed; + size_t prev_d_len; + void *prev_data; + struct list_head unlk_lst; +}; + +typedef int cont_fn(struct opal_dev *); + +struct opal_suspend_data { + struct opal_lock_unlock unlk; + u8 lr; + struct list_head node; +}; + +struct bd_holder_disk { + struct list_head list; + struct kobject *holder_dir; + int refcnt; +}; + +typedef u32 compat_ulong_t; + +enum { + IORING_CQE_BUFFER_SHIFT = 16, +}; + +struct io_sqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 flags; + __u32 dropped; + __u32 array; + __u32 resv1; + __u64 resv2; +}; + +struct io_cqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 overflow; + __u32 cqes; + __u32 flags; + __u32 resv1; + __u64 resv2; +}; + +struct io_uring_params { + __u32 sq_entries; + __u32 cq_entries; + __u32 flags; + __u32 sq_thread_cpu; + __u32 sq_thread_idle; + __u32 features; + __u32 wq_fd; + __u32 resv[3]; + struct io_sqring_offsets sq_off; + struct io_cqring_offsets cq_off; +}; + +struct io_uring_probe_op { + __u8 op; + __u8 resv; + __u16 flags; + __u32 resv2; +}; + +struct io_uring_probe { + __u8 last_op; + __u8 ops_len; + __u16 resv; + __u32 resv2[3]; + struct io_uring_probe_op ops[0]; +}; + +struct io_uring_restriction { + __u16 opcode; + union { + __u8 register_op; + __u8 sqe_op; + __u8 sqe_flags; + }; + __u8 resv; + __u32 resv2[3]; +}; + +struct io_uring_buf { + __u64 addr; + __u32 len; + __u16 bid; + __u16 resv; +}; + +struct io_uring_buf_ring { + union { + struct { + __u64 resv1; + __u32 resv2; + __u16 resv3; + __u16 tail; + }; + struct io_uring_buf bufs[0]; + }; +}; + +enum { + IORING_RESTRICTION_REGISTER_OP = 0, + IORING_RESTRICTION_SQE_OP = 1, + IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, + IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3, + IORING_RESTRICTION_LAST = 4, +}; + +struct io_uring_getevents_arg { + __u64 sigmask; + __u32 sigmask_sz; + __u32 pad; + __u64 ts; +}; + +struct io_uring_file_index_range { + __u32 off; + __u32 len; + __u64 resv; +}; + +enum io_uring_cmd_flags { + IO_URING_F_COMPLETE_DEFER = 1, + IO_URING_F_UNLOCKED = 2, + IO_URING_F_MULTISHOT = 4, + IO_URING_F_IOWQ = 8, + IO_URING_F_NONBLOCK = 2147483648, + IO_URING_F_SQE128 = 256, + IO_URING_F_CQE32 = 512, + IO_URING_F_IOPOLL = 1024, +}; + +struct io_rsrc_node { + struct percpu_ref refs; + struct list_head node; + struct list_head rsrc_list; + struct io_rsrc_data *rsrc_data; + struct llist_node llist; + bool done; +}; + +struct io_mapped_ubuf { + u64 ubuf; + u64 ubuf_end; + unsigned int nr_bvecs; + long unsigned int acct_pages; + struct bio_vec bvec[0]; +}; + +struct io_buffer_list { + union { + struct list_head buf_list; + struct { + struct page **buf_pages; + struct io_uring_buf_ring *buf_ring; + }; + }; + __u16 bgid; + __u16 buf_nr_pages; + __u16 nr_entries; + __u16 head; + __u16 mask; +}; + +struct io_sq_data { + refcount_t refs; + atomic_t park_pending; + struct mutex lock; + struct list_head ctx_list; + struct task_struct *thread; + struct wait_queue_head wait; + unsigned int sq_thread_idle; + int sq_cpu; + pid_t task_pid; + pid_t task_tgid; + long unsigned int state; + struct completion exited; +}; + +struct io_rsrc_put; + +typedef void rsrc_put_fn(struct io_ring_ctx *, struct io_rsrc_put *); + +struct io_rsrc_data { + struct io_ring_ctx *ctx; + u64 **tags; + unsigned int nr; + rsrc_put_fn *do_put; + atomic_t refs; + struct completion done; + bool quiesce; +}; + +enum { + REQ_F_FIXED_FILE = 1, + REQ_F_IO_DRAIN = 2, + REQ_F_LINK = 4, + REQ_F_HARDLINK = 8, + REQ_F_FORCE_ASYNC = 16, + REQ_F_BUFFER_SELECT = 32, + REQ_F_CQE_SKIP = 64, + REQ_F_FAIL = 256, + REQ_F_INFLIGHT = 512, + REQ_F_CUR_POS = 1024, + REQ_F_NOWAIT = 2048, + REQ_F_LINK_TIMEOUT = 4096, + REQ_F_NEED_CLEANUP = 8192, + REQ_F_POLLED = 16384, + REQ_F_BUFFER_SELECTED = 32768, + REQ_F_BUFFER_RING = 65536, + REQ_F_REISSUE = 131072, + REQ_F_SUPPORT_NOWAIT = 1073741824, + REQ_F_ISREG = 2147483648, + REQ_F_CREDS = 262144, + REQ_F_REFCOUNT = 524288, + REQ_F_ARM_LTIMEOUT = 1048576, + REQ_F_ASYNC_DATA = 2097152, + REQ_F_SKIP_LINK_CQES = 4194304, + REQ_F_SINGLE_POLL = 8388608, + REQ_F_DOUBLE_POLL = 16777216, + REQ_F_PARTIAL_IO = 33554432, + REQ_F_APOLL_MULTISHOT = 134217728, + REQ_F_CQE32_INIT = 67108864, + REQ_F_CLEAR_POLLIN = 268435456, + REQ_F_HASH_LOCKED = 536870912, +}; + +struct io_buffer { + struct list_head list; + __u64 addr; + __u32 len; + __u16 bid; + __u16 bgid; +}; + +struct io_poll { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + struct wait_queue_entry wait; +}; + +struct io_cache_entry { + struct hlist_node node; +}; + +struct async_poll { + union { + struct io_poll poll; + struct io_cache_entry cache; + }; + struct io_poll *double_poll; +}; + +struct io_overflow_cqe { + struct list_head list; + struct io_uring_cqe cqe; +}; + +struct trace_event_raw_io_uring_create { + struct trace_entry ent; + int fd; + void *ctx; + u32 sq_entries; + u32 cq_entries; + u32 flags; + char __data[0]; +}; + +struct trace_event_raw_io_uring_register { + struct trace_entry ent; + void *ctx; + unsigned int opcode; + unsigned int nr_files; + unsigned int nr_bufs; + long int ret; + char __data[0]; +}; + +struct trace_event_raw_io_uring_file_get { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + int fd; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_io_uring_queue_async_work { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + u8 opcode; + unsigned int flags; + struct io_wq_work *work; + int rw; + u32 __data_loc_op_str; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_io_uring_defer { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int data; + u8 opcode; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_link { + struct trace_entry ent; + void *ctx; + void *req; + void *target_req; + char __data[0]; +}; + +struct trace_event_raw_io_uring_cqring_wait { + struct trace_entry ent; + void *ctx; + int min_events; + char __data[0]; +}; + +struct trace_event_raw_io_uring_fail_link { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + void *link; + u32 __data_loc_op_str; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_io_uring_complete { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + int res; + unsigned int cflags; + u64 extra1; + u64 extra2; + char __data[0]; +}; + +struct trace_event_raw_io_uring_submit_sqe { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + u32 flags; + bool force_nonblock; + bool sq_thread; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_poll_arm { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + int mask; + int events; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_task_add { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + int mask; + u32 __data_loc_op_str; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_io_uring_req_failed { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + u8 flags; + u8 ioprio; + long: 32; + u64 off; + u64 addr; + u32 len; + u32 op_flags; + u16 buf_index; + u16 personality; + u32 file_index; + u64 pad1; + u64 addr3; + int error; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_cqe_overflow { + struct trace_entry ent; + void *ctx; + long: 32; + long long unsigned int user_data; + s32 res; + u32 cflags; + void *ocqe; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_io_uring_task_work_run { + struct trace_entry ent; + void *tctx; + unsigned int count; + unsigned int loops; + char __data[0]; +}; + +struct trace_event_raw_io_uring_short_write { + struct trace_entry ent; + void *ctx; + long: 32; + u64 fpos; + u64 wanted; + u64 got; + char __data[0]; +}; + +struct trace_event_raw_io_uring_local_work_run { + struct trace_entry ent; + void *ctx; + int count; + unsigned int loops; + char __data[0]; +}; + +struct trace_event_data_offsets_io_uring_create {}; + +struct trace_event_data_offsets_io_uring_register {}; + +struct trace_event_data_offsets_io_uring_file_get {}; + +struct trace_event_data_offsets_io_uring_queue_async_work { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_defer { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_link {}; + +struct trace_event_data_offsets_io_uring_cqring_wait {}; + +struct trace_event_data_offsets_io_uring_fail_link { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_complete {}; + +struct trace_event_data_offsets_io_uring_submit_sqe { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_poll_arm { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_task_add { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_req_failed { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_cqe_overflow {}; + +struct trace_event_data_offsets_io_uring_task_work_run {}; + +struct trace_event_data_offsets_io_uring_short_write {}; + +struct trace_event_data_offsets_io_uring_local_work_run {}; + +typedef void (*btf_trace_io_uring_create)(void *, int, void *, u32, u32, u32); + +typedef void (*btf_trace_io_uring_register)(void *, void *, unsigned int, unsigned int, unsigned int, long int); + +typedef void (*btf_trace_io_uring_file_get)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_queue_async_work)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_defer)(void *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_link)(void *, struct io_kiocb *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_cqring_wait)(void *, void *, int); + +typedef void (*btf_trace_io_uring_fail_link)(void *, struct io_kiocb *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_complete)(void *, void *, void *, u64, int, unsigned int, u64, u64); + +typedef void (*btf_trace_io_uring_submit_sqe)(void *, struct io_kiocb *, bool); + +typedef void (*btf_trace_io_uring_poll_arm)(void *, struct io_kiocb *, int, int); + +typedef void (*btf_trace_io_uring_task_add)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_req_failed)(void *, const struct io_uring_sqe *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_cqe_overflow)(void *, void *, long long unsigned int, s32, u32, void *); + +typedef void (*btf_trace_io_uring_task_work_run)(void *, void *, unsigned int, unsigned int); + +typedef void (*btf_trace_io_uring_short_write)(void *, void *, u64, u64, u64); + +typedef void (*btf_trace_io_uring_local_work_run)(void *, void *, int, unsigned int); + +enum { + IO_WQ_WORK_CANCEL = 1, + IO_WQ_WORK_HASHED = 2, + IO_WQ_WORK_UNBOUND = 4, + IO_WQ_WORK_CONCURRENT = 16, + IO_WQ_HASH_SHIFT = 24, +}; + +enum io_wq_cancel { + IO_WQ_CANCEL_OK = 0, + IO_WQ_CANCEL_RUNNING = 1, + IO_WQ_CANCEL_NOTFOUND = 2, +}; + +typedef bool work_cancel_fn(struct io_wq_work *, void *); + +enum { + IOU_OK = 0, + IOU_ISSUE_SKIP_COMPLETE = 4294966767, + IOU_STOP_MULTISHOT = 4294967171, +}; + +struct io_op_def { + unsigned int needs_file: 1; + unsigned int plug: 1; + unsigned int hash_reg_file: 1; + unsigned int unbound_nonreg_file: 1; + unsigned int pollin: 1; + unsigned int pollout: 1; + unsigned int poll_exclusive: 1; + unsigned int buffer_select: 1; + unsigned int not_supported: 1; + unsigned int audit_skip: 1; + unsigned int ioprio: 1; + unsigned int iopoll: 1; + unsigned int iopoll_queue: 1; + unsigned int manual_alloc: 1; + short unsigned int async_size; + const char *name; + int (*prep)(struct io_kiocb *, const struct io_uring_sqe *); + int (*issue)(struct io_kiocb *, unsigned int); + int (*prep_async)(struct io_kiocb *); + void (*cleanup)(struct io_kiocb *); + void (*fail)(struct io_kiocb *); +}; + +struct io_tctx_node { + struct list_head ctx_node; + struct task_struct *task; + struct io_ring_ctx *ctx; +}; + +enum { + IORING_RSRC_FILE = 0, + IORING_RSRC_BUFFER = 1, +}; + +struct io_rsrc_put { + struct list_head list; + u64 tag; + union { + void *rsrc; + struct file *file; + struct io_mapped_ubuf *buf; + }; + long: 32; +}; + +enum { + IO_APOLL_OK = 0, + IO_APOLL_ABORTED = 1, + IO_APOLL_READY = 2, +}; + +enum { + IO_CHECK_CQ_OVERFLOW_BIT = 0, + IO_CHECK_CQ_DROPPED_BIT = 1, +}; + +enum { + IO_EVENTFD_OP_SIGNAL_BIT = 0, + IO_EVENTFD_OP_FREE_BIT = 1, +}; + +struct io_defer_entry { + struct list_head list; + struct io_kiocb *req; + u32 seq; +}; + +struct io_wait_queue { + struct wait_queue_entry wq; + struct io_ring_ctx *ctx; + unsigned int cq_tail; + unsigned int nr_timeouts; +}; + +struct io_tctx_exit { + struct callback_head task_work; + struct completion completion; + struct io_ring_ctx *ctx; +}; + +struct io_task_cancel { + struct task_struct *task; + bool all; +}; + +struct creds; + +struct io_xattr { + struct file *file; + struct xattr_ctx ctx; + struct filename *filename; +}; + +struct io_rename { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +struct io_unlink { + struct file *file; + int dfd; + int flags; + struct filename *filename; +}; + +struct io_mkdir { + struct file *file; + int dfd; + umode_t mode; + struct filename *filename; +}; + +struct io_link { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +struct io_splice { + struct file *file_out; + long: 32; + loff_t off_out; + loff_t off_in; + u64 len; + int splice_fd_in; + unsigned int flags; +}; + +struct io_sync { + struct file *file; + long: 32; + loff_t len; + loff_t off; + int flags; + int mode; +}; + +struct io_fadvise { + struct file *file; + long: 32; + u64 offset; + u32 len; + u32 advice; +}; + +struct io_madvise { + struct file *file; + long: 32; + u64 addr; + u32 len; + u32 advice; +}; + +struct io_open { + struct file *file; + int dfd; + u32 file_slot; + struct filename *filename; + struct open_how how; + long unsigned int nofile; + long: 32; +}; + +struct io_close { + struct file *file; + int fd; + u32 file_slot; +}; + +struct io_epoll { + struct file *file; + int epfd; + int op; + int fd; + struct epoll_event event; +}; + +struct io_statx { + struct file *file; + int dfd; + unsigned int mask; + unsigned int flags; + struct filename *filename; + struct statx *buffer; +}; + +struct user_msghdr { + void *msg_name; + int msg_namelen; + struct iovec *msg_iov; + __kernel_size_t msg_iovlen; + void *msg_control; + __kernel_size_t msg_controllen; + unsigned int msg_flags; +}; + +typedef u32 compat_size_t; + +typedef s32 compat_int_t; + +typedef u32 compat_uptr_t; + +struct compat_msghdr { + compat_uptr_t msg_name; + compat_int_t msg_namelen; + compat_uptr_t msg_iov; + compat_size_t msg_iovlen; + compat_uptr_t msg_control; + compat_size_t msg_controllen; + compat_uint_t msg_flags; +}; + +struct io_uring_recvmsg_out { + __u32 namelen; + __u32 controllen; + __u32 payloadlen; + __u32 flags; +}; + +struct io_async_msghdr { + union { + struct iovec fast_iov[8]; + struct { + struct iovec fast_iov_one; + __kernel_size_t controllen; + int namelen; + __kernel_size_t payloadlen; + }; + struct io_cache_entry cache; + }; + struct iovec *free_iov; + struct sockaddr *uaddr; + struct msghdr msg; + struct __kernel_sockaddr_storage addr; +}; + +struct io_async_connect { + struct __kernel_sockaddr_storage address; +}; + +enum { + SKBFL_ZEROCOPY_ENABLE = 1, + SKBFL_SHARED_FRAG = 2, + SKBFL_PURE_ZEROCOPY = 4, + SKBFL_DONT_ORPHAN = 8, + SKBFL_MANAGED_FRAG_REFS = 16, +}; + +struct io_notif_data { + struct file *file; + struct ubuf_info uarg; + long unsigned int account_pages; + bool zc_report; + bool zc_used; + bool zc_copied; +}; + +struct io_shutdown { + struct file *file; + int how; +}; + +struct io_accept { + struct file *file; + struct sockaddr *addr; + int *addr_len; + int flags; + u32 file_slot; + long unsigned int nofile; +}; + +struct io_socket { + struct file *file; + int domain; + int type; + int protocol; + int flags; + u32 file_slot; + long unsigned int nofile; +}; + +struct io_connect { + struct file *file; + struct sockaddr *addr; + int addr_len; + bool in_progress; +}; + +struct io_sr_msg { + struct file *file; + union { + struct compat_msghdr *umsg_compat; + struct user_msghdr *umsg; + void *buf; + }; + unsigned int len; + unsigned int done_io; + unsigned int msg_flags; + u16 flags; + u16 addr_len; + u16 buf_group; + void *addr; + struct io_kiocb *notif; +}; + +struct io_recvmsg_multishot_hdr { + struct io_uring_recvmsg_out msg; + struct __kernel_sockaddr_storage addr; +}; + +enum { + IORING_MSG_DATA = 0, + IORING_MSG_SEND_FD = 1, +}; + +struct io_msg { + struct file *file; + struct file *src_file; + struct callback_head tw; + u64 user_data; + u32 len; + u32 cmd; + u32 src_fd; + u32 dst_fd; + u32 flags; + long: 32; +}; + +struct io_cancel_data { + struct io_ring_ctx *ctx; + long: 32; + union { + u64 data; + struct file *file; + }; + u32 flags; + int seq; +}; + +struct io_timeout_data { + struct io_kiocb *req; + long: 32; + struct hrtimer timer; + struct timespec64 ts; + enum hrtimer_mode mode; + u32 flags; +}; + +struct io_timeout { + struct file *file; + u32 off; + u32 target_seq; + struct list_head list; + struct io_kiocb *head; + struct io_kiocb *prev; +}; + +struct io_timeout_rem { + struct file *file; + long: 32; + u64 addr; + struct timespec64 ts; + u32 flags; + bool ltimeout; +}; + +enum { + IO_SQ_THREAD_SHOULD_STOP = 0, + IO_SQ_THREAD_SHOULD_PARK = 1, +}; + +struct io_uring_rsrc_update { + __u32 offset; + __u32 resv; + __u64 data; +}; + +typedef struct io_wq_work *free_work_fn(struct io_wq_work *); + +typedef void io_wq_work_fn(struct io_wq_work *); + +struct io_wq_data { + struct io_wq_hash *hash; + struct task_struct *task; + io_wq_work_fn *do_work; + free_work_fn *free_work; +}; + +struct io_poll_update { + struct file *file; + long: 32; + u64 old_user_data; + u64 new_user_data; + __poll_t events; + bool update_events; + bool update_user_data; +}; + +struct io_poll_table { + struct poll_table_struct pt; + struct io_kiocb *req; + int nr_entries; + int error; + bool owning; + __poll_t result_mask; +}; + +enum { + IOU_POLL_DONE = 0, + IOU_POLL_NO_ACTION = 1, + IOU_POLL_REMOVE_POLL_USE_RES = 2, + IOU_POLL_REISSUE = 3, +}; + +struct io_uring_sync_cancel_reg { + __u64 addr; + __s32 fd; + __u32 flags; + struct __kernel_timespec timeout; + __u64 pad[4]; +}; + +struct io_cancel { + struct file *file; + long: 32; + u64 addr; + u32 flags; + s32 fd; +}; + +struct io_uring_buf_reg { + __u64 ring_addr; + __u32 ring_entries; + __u16 bgid; + __u16 pad; + __u64 resv[3]; +}; + +struct io_provide_buf { + struct file *file; + long: 32; + __u64 addr; + __u32 len; + __u32 bgid; + __u16 nbufs; + __u16 bid; + long: 32; +}; + +struct io_uring_rsrc_register { + __u32 nr; + __u32 flags; + __u64 resv2; + __u64 data; + __u64 tags; +}; + +struct io_uring_rsrc_update2 { + __u32 offset; + __u32 resv; + __u64 data; + __u64 tags; + __u32 nr; + __u32 resv2; +}; + +struct scm_fp_list { + short int count; + short int max; + struct user_struct *user; + struct file *fp[253]; +}; + +struct unix_skb_parms { + struct pid *pid; + kuid_t uid; + kgid_t gid; + struct scm_fp_list *fp; + u32 secid; + u32 consumed; +}; + +struct io_rsrc_update { + struct file *file; + long: 32; + u64 arg; + u32 nr_args; + u32 offset; +}; + +struct iov_iter_state { + size_t iov_offset; + size_t count; + long unsigned int nr_segs; +}; + +struct io_rw_state { + struct iov_iter iter; + struct iov_iter_state iter_state; + struct iovec fast_iov[8]; + long: 32; +}; + +struct io_async_rw { + struct io_rw_state s; + const struct iovec *free_iovec; + size_t bytes_done; + struct wait_page_queue wpq; + long: 32; +}; + +struct io_rw { + struct kiocb kiocb; + u64 addr; + u32 len; + rwf_t flags; +}; + +enum { + IO_WQ_BOUND = 0, + IO_WQ_UNBOUND = 1, +}; + +struct io_wqe; + +struct io_wq { + long unsigned int state; + free_work_fn *free_work; + io_wq_work_fn *do_work; + struct io_wq_hash *hash; + atomic_t worker_refs; + struct completion worker_done; + struct hlist_node cpuhp_node; + struct task_struct *task; + struct io_wqe *wqes[0]; +}; + +enum { + IO_WORKER_F_UP = 1, + IO_WORKER_F_RUNNING = 2, + IO_WORKER_F_FREE = 4, + IO_WORKER_F_BOUND = 8, +}; + +enum { + IO_WQ_BIT_EXIT = 0, +}; + +enum { + IO_ACCT_STALLED_BIT = 0, +}; + +struct io_worker { + refcount_t ref; + unsigned int flags; + struct hlist_nulls_node nulls_node; + struct list_head all_list; + struct task_struct *task; + struct io_wqe *wqe; + struct io_wq_work *cur_work; + struct io_wq_work *next_work; + raw_spinlock_t lock; + struct completion ref_done; + long unsigned int create_state; + struct callback_head create_work; + int create_index; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +struct io_wqe_acct { + unsigned int nr_workers; + unsigned int max_workers; + int index; + atomic_t nr_running; + raw_spinlock_t lock; + struct io_wq_work_list work_list; + long unsigned int flags; +}; + +struct io_wqe { + raw_spinlock_t lock; + struct io_wqe_acct acct[2]; + int node; + struct hlist_nulls_head free_list; + struct list_head all_list; + struct wait_queue_entry wait; + struct io_wq *wq; + struct io_wq_work *hash_tail[32]; + cpumask_var_t cpu_mask; +}; + +enum { + IO_WQ_ACCT_BOUND = 0, + IO_WQ_ACCT_UNBOUND = 1, + IO_WQ_ACCT_NR = 2, +}; + +struct io_cb_cancel_data { + work_cancel_fn *fn; + void *data; + int nr_running; + int nr_pending; + bool cancel_all; +}; + +struct online_data { + unsigned int cpu; + bool online; +}; + +struct wrapper { + cmp_func_t cmp; + swap_func_t swap; +}; + +typedef int __kernel_ptrdiff_t; + +typedef __kernel_ptrdiff_t ptrdiff_t; + +struct region { + unsigned int start; + unsigned int off; + unsigned int group_len; + unsigned int end; + unsigned int nbits; +}; + +enum { + REG_OP_ISFREE = 0, + REG_OP_ALLOC = 1, + REG_OP_RELEASE = 2, +}; + +struct sg_append_table { + struct sg_table sgt; + struct scatterlist *prv; + unsigned int total_nents; +}; + +typedef struct scatterlist *sg_alloc_fn(unsigned int, gfp_t); + +typedef void sg_free_fn(struct scatterlist *, unsigned int); + +struct sg_page_iter { + struct scatterlist *sg; + unsigned int sg_pgoffset; + unsigned int __nents; + int __pg_advance; +}; + +struct sg_dma_page_iter { + struct sg_page_iter base; +}; + +struct sg_mapping_iter { + struct page *page; + void *addr; + size_t length; + size_t consumed; + struct sg_page_iter piter; + unsigned int __offset; + unsigned int __remaining; + unsigned int __flags; +}; + +struct csum_state { + __wsum csum; + size_t off; +}; + +typedef s32 compat_ssize_t; + +struct compat_iovec { + compat_uptr_t iov_base; + compat_size_t iov_len; +}; + +struct rhashtable_walker { + struct list_head list; + struct bucket_table *tbl; +}; + +struct rhashtable_iter { + struct rhashtable *ht; + struct rhash_head *p; + struct rhlist_head *list; + struct rhashtable_walker walker; + unsigned int slot; + unsigned int skip; + bool end_of_table; +}; + +union nested_table { + union nested_table *table; + struct rhash_lock_head *bucket; +}; + +struct once_work { + struct work_struct work; + struct static_key_true *key; + struct module *module; +}; + +struct genradix_iter { + size_t offset; + size_t pos; +}; + +struct genradix_node { + union { + struct genradix_node *children[1024]; + u8 data[4096]; + }; +}; + +struct strarray { + char **array; + size_t n; +}; + +struct reciprocal_value_adv { + u32 m; + u8 sh; + u8 exp; + bool is_wide_m; +}; + +enum blake2s_iv { + BLAKE2S_IV0 = 1779033703, + BLAKE2S_IV1 = 3144134277, + BLAKE2S_IV2 = 1013904242, + BLAKE2S_IV3 = 2773480762, + BLAKE2S_IV4 = 1359893119, + BLAKE2S_IV5 = 2600822924, + BLAKE2S_IV6 = 528734635, + BLAKE2S_IV7 = 1541459225, +}; + +enum { + TEST_ALIGNMENT = 16, +}; + +enum devm_ioremap_type { + DEVM_IOREMAP = 0, + DEVM_IOREMAP_UC = 1, + DEVM_IOREMAP_WC = 2, + DEVM_IOREMAP_NP = 3, +}; + +struct pcim_iomap_devres { + void *table[6]; +}; + +struct arch_io_reserve_memtype_wc_devres { + resource_size_t start; + resource_size_t size; +}; + +struct btree_head { + long unsigned int *node; + mempool_t *mempool; + int height; +}; + +struct btree_geo { + int keylen; + int no_pairs; + int no_longs; +}; + +typedef void (*visitor128_t)(void *, long unsigned int, u64, u64, size_t); + +typedef void (*visitorl_t)(void *, long unsigned int, long unsigned int, size_t); + +typedef void (*visitor32_t)(void *, long unsigned int, u32, size_t); + +typedef void (*visitor64_t)(void *, long unsigned int, u64, size_t); + +enum assoc_array_walk_status { + assoc_array_walk_tree_empty = 0, + assoc_array_walk_found_terminal_node = 1, + assoc_array_walk_found_wrong_shortcut = 2, +}; + +struct assoc_array_walk_result { + struct { + struct assoc_array_node *node; + int level; + int slot; + } terminal_node; + struct { + struct assoc_array_shortcut *shortcut; + int level; + int sc_level; + long unsigned int sc_segments; + long unsigned int dissimilarity; + } wrong_shortcut; +}; + +struct assoc_array_delete_collapse_context { + struct assoc_array_node *node; + const void *skip_leaf; + int slot; +}; + +struct linear_range { + unsigned int min; + unsigned int min_sel; + unsigned int max_sel; + unsigned int step; +}; + +struct xxh32_state { + uint32_t total_len_32; + uint32_t large_len; + uint32_t v1; + uint32_t v2; + uint32_t v3; + uint32_t v4; + uint32_t mem32[4]; + uint32_t memsize; +}; + +struct xxh64_state { + uint64_t total_len; + uint64_t v1; + uint64_t v2; + uint64_t v3; + uint64_t v4; + uint64_t mem64[4]; + uint32_t memsize; + long: 32; +}; + +struct gen_pool_chunk { + struct list_head next_chunk; + atomic_long_t avail; + long: 32; + phys_addr_t phys_addr; + void *owner; + long unsigned int start_addr; + long unsigned int end_addr; + long unsigned int bits[0]; + long: 32; +}; + +struct genpool_data_align { + int align; +}; + +struct genpool_data_fixed { + long unsigned int offset; +}; + +typedef unsigned char Byte; + +typedef long unsigned int uLong; + +struct internal_state; + +struct z_stream_s { + const Byte *next_in; + uLong avail_in; + uLong total_in; + Byte *next_out; + uLong avail_out; + uLong total_out; + char *msg; + struct internal_state *state; + void *workspace; + int data_type; + uLong adler; + uLong reserved; +}; + +typedef struct z_stream_s z_stream; + +typedef z_stream *z_streamp; + +typedef struct { + unsigned char op; + unsigned char bits; + short unsigned int val; +} code; + +typedef enum { + HEAD = 0, + FLAGS = 1, + TIME = 2, + OS = 3, + EXLEN = 4, + EXTRA = 5, + NAME = 6, + COMMENT = 7, + HCRC = 8, + DICTID = 9, + DICT = 10, + TYPE = 11, + TYPEDO = 12, + STORED = 13, + COPY = 14, + TABLE = 15, + LENLENS = 16, + CODELENS = 17, + LEN = 18, + LENEXT = 19, + DIST = 20, + DISTEXT = 21, + MATCH = 22, + LIT = 23, + CHECK = 24, + LENGTH = 25, + DONE = 26, + BAD = 27, + MEM = 28, + SYNC = 29, +} inflate_mode; + +struct inflate_state { + inflate_mode mode; + int last; + int wrap; + int havedict; + int flags; + unsigned int dmax; + long unsigned int check; + long unsigned int total; + unsigned int wbits; + unsigned int wsize; + unsigned int whave; + unsigned int write; + unsigned char *window; + long unsigned int hold; + unsigned int bits; + unsigned int length; + unsigned int offset; + unsigned int extra; + const code *lencode; + const code *distcode; + unsigned int lenbits; + unsigned int distbits; + unsigned int ncode; + unsigned int nlen; + unsigned int ndist; + unsigned int have; + code *next; + short unsigned int lens[320]; + short unsigned int work[288]; + code codes[2048]; +}; + +union uu { + short unsigned int us; + unsigned char b[2]; +}; + +typedef unsigned int uInt; + +typedef enum { + CODES = 0, + LENS = 1, + DISTS = 2, +} codetype; + +struct inflate_workspace { + struct inflate_state inflate_state; + unsigned char working_window[32768]; +}; + +struct internal_state { + int dummy; +}; + +struct gf_poly; + +struct bch_control { + unsigned int m; + unsigned int n; + unsigned int t; + unsigned int ecc_bits; + unsigned int ecc_bytes; + uint16_t *a_pow_tab; + uint16_t *a_log_tab; + uint32_t *mod8_tab; + uint32_t *ecc_buf; + uint32_t *ecc_buf2; + unsigned int *xi_tab; + unsigned int *syn; + int *cache; + struct gf_poly *elp; + struct gf_poly *poly_2t[4]; + bool swap_bits; +}; + +struct gf_poly { + unsigned int deg; + unsigned int c[0]; +}; + +struct gf_poly_deg1 { + struct gf_poly poly; + unsigned int c[2]; +}; + +typedef struct { + const uint8_t *externalDict; + size_t extDictSize; + const uint8_t *prefixEnd; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +typedef union { + long long unsigned int table[4]; + LZ4_streamDecode_t_internal internal_donotuse; +} LZ4_streamDecode_t; + +typedef uint8_t BYTE; + +typedef uint16_t U16; + +typedef uint32_t U32; + +typedef uintptr_t uptrval; + +typedef enum { + noDict = 0, + withPrefix64k = 1, + usingExtDict = 2, +} dict_directive; + +typedef enum { + endOnOutputSize = 0, + endOnInputSize = 1, +} endCondition_directive; + +typedef enum { + decode_full_block = 0, + partial_decode = 1, +} earlyEnd_directive; + +typedef enum { + ZSTD_c_compressionLevel = 100, + ZSTD_c_windowLog = 101, + ZSTD_c_hashLog = 102, + ZSTD_c_chainLog = 103, + ZSTD_c_searchLog = 104, + ZSTD_c_minMatch = 105, + ZSTD_c_targetLength = 106, + ZSTD_c_strategy = 107, + ZSTD_c_enableLongDistanceMatching = 160, + ZSTD_c_ldmHashLog = 161, + ZSTD_c_ldmMinMatch = 162, + ZSTD_c_ldmBucketSizeLog = 163, + ZSTD_c_ldmHashRateLog = 164, + ZSTD_c_contentSizeFlag = 200, + ZSTD_c_checksumFlag = 201, + ZSTD_c_dictIDFlag = 202, + ZSTD_c_nbWorkers = 400, + ZSTD_c_jobSize = 401, + ZSTD_c_overlapLog = 402, + ZSTD_c_experimentalParam1 = 500, + ZSTD_c_experimentalParam2 = 10, + ZSTD_c_experimentalParam3 = 1000, + ZSTD_c_experimentalParam4 = 1001, + ZSTD_c_experimentalParam5 = 1002, + ZSTD_c_experimentalParam6 = 1003, + ZSTD_c_experimentalParam7 = 1004, + ZSTD_c_experimentalParam8 = 1005, + ZSTD_c_experimentalParam9 = 1006, + ZSTD_c_experimentalParam10 = 1007, + ZSTD_c_experimentalParam11 = 1008, + ZSTD_c_experimentalParam12 = 1009, + ZSTD_c_experimentalParam13 = 1010, + ZSTD_c_experimentalParam14 = 1011, + ZSTD_c_experimentalParam15 = 1012, +} ZSTD_cParameter; + +typedef enum { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3, +} ZSTD_ResetDirective; + +struct ZSTD_inBuffer_s { + const void *src; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_inBuffer_s ZSTD_inBuffer; + +struct ZSTD_outBuffer_s { + void *dst; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_outBuffer_s ZSTD_outBuffer; + +typedef ZSTD_CCtx ZSTD_CStream; + +typedef ZSTD_inBuffer zstd_in_buffer; + +typedef ZSTD_outBuffer zstd_out_buffer; + +typedef ZSTD_CStream zstd_cstream; + +typedef uint8_t U8; + +typedef int16_t S16; + +typedef uint64_t U64; + +typedef struct { + size_t bitContainer; + unsigned int bitPos; + char *startPtr; + char *ptr; + char *endPtr; +} BIT_CStream_t; + +typedef unsigned int FSE_CTable; + +typedef struct { + ptrdiff_t value; + const void *stateTable; + const void *symbolTT; + unsigned int stateLog; +} FSE_CState_t; + +typedef struct { + int deltaFindState; + U32 deltaNbBits; +} FSE_symbolCompressionTransform; + +typedef enum { + trustInput = 0, + checkMaxSymbolValue = 1, +} HIST_checkInput_e; + +typedef size_t HUF_CElt; + +typedef enum { + HUF_repeat_none = 0, + HUF_repeat_check = 1, + HUF_repeat_valid = 2, +} HUF_repeat; + +typedef struct { + FSE_CTable CTable[59]; + U32 scratchBuffer[41]; + unsigned int count[13]; + S16 norm[13]; +} HUF_CompressWeightsWksp; + +typedef struct { + HUF_CompressWeightsWksp wksp; + BYTE bitsToWeight[13]; + BYTE huffWeight[255]; +} HUF_WriteCTableWksp; + +struct nodeElt_s { + U32 count; + U16 parent; + BYTE byte; + BYTE nbBits; +}; + +typedef struct nodeElt_s nodeElt; + +typedef struct { + U16 base; + U16 curr; +} rankPos; + +typedef nodeElt huffNodeTable[512]; + +typedef struct { + huffNodeTable huffNodeTbl; + rankPos rankPosition[192]; +} HUF_buildCTable_wksp_tables; + +typedef struct { + size_t bitContainer[2]; + size_t bitPos[2]; + BYTE *startPtr; + BYTE *ptr; + BYTE *endPtr; +} HUF_CStream_t; + +typedef enum { + HUF_singleStream = 0, + HUF_fourStreams = 1, +} HUF_nbStreams_e; + +typedef struct { + unsigned int count[256]; + HUF_CElt CTable[257]; + union { + HUF_buildCTable_wksp_tables buildCTable_wksp; + HUF_WriteCTableWksp writeCTable_wksp; + U32 hist_wksp[1024]; + } wksps; +} HUF_compress_tables_t; + +typedef enum { + FSE_repeat_none = 0, + FSE_repeat_check = 1, + FSE_repeat_valid = 2, +} FSE_repeat; + +typedef struct { + U32 f1c; + U32 f1d; + U32 f7b; + U32 f7c; +} ZSTD_cpuid_t; + +typedef enum { + ZSTDcs_created = 0, + ZSTDcs_init = 1, + ZSTDcs_ongoing = 2, + ZSTDcs_ending = 3, +} ZSTD_compressionStage_e; + +typedef enum { + ZSTD_f_zstd1 = 0, + ZSTD_f_zstd1_magicless = 1, +} ZSTD_format_e; + +typedef enum { + ZSTD_dictDefaultAttach = 0, + ZSTD_dictForceAttach = 1, + ZSTD_dictForceCopy = 2, + ZSTD_dictForceLoad = 3, +} ZSTD_dictAttachPref_e; + +typedef enum { + ZSTD_ps_auto = 0, + ZSTD_ps_enable = 1, + ZSTD_ps_disable = 2, +} ZSTD_paramSwitch_e; + +typedef struct { + ZSTD_paramSwitch_e enableLdm; + U32 hashLog; + U32 bucketSizeLog; + U32 minMatchLength; + U32 hashRateLog; + U32 windowLog; +} ldmParams_t; + +typedef enum { + ZSTD_bm_buffered = 0, + ZSTD_bm_stable = 1, +} ZSTD_bufferMode_e; + +typedef enum { + ZSTD_sf_noBlockDelimiters = 0, + ZSTD_sf_explicitBlockDelimiters = 1, +} ZSTD_sequenceFormat_e; + +struct ZSTD_CCtx_params_s { + ZSTD_format_e format; + ZSTD_compressionParameters cParams; + ZSTD_frameParameters fParams; + int compressionLevel; + int forceWindow; + size_t targetCBlockSize; + int srcSizeHint; + ZSTD_dictAttachPref_e attachDictPref; + ZSTD_paramSwitch_e literalCompressionMode; + int nbWorkers; + size_t jobSize; + int overlapLog; + int rsyncable; + ldmParams_t ldmParams; + int enableDedicatedDictSearch; + ZSTD_bufferMode_e inBufferMode; + ZSTD_bufferMode_e outBufferMode; + ZSTD_sequenceFormat_e blockDelimiters; + int validateSequences; + ZSTD_paramSwitch_e useBlockSplitter; + ZSTD_paramSwitch_e useRowMatchFinder; + int deterministicRefPrefix; + ZSTD_customMem customMem; +}; + +typedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params; + +typedef enum { + ZSTD_cwksp_alloc_objects = 0, + ZSTD_cwksp_alloc_buffers = 1, + ZSTD_cwksp_alloc_aligned = 2, +} ZSTD_cwksp_alloc_phase_e; + +typedef enum { + ZSTD_cwksp_dynamic_alloc = 0, + ZSTD_cwksp_static_alloc = 1, +} ZSTD_cwksp_static_alloc_e; + +typedef struct { + void *workspace; + void *workspaceEnd; + void *objectEnd; + void *tableEnd; + void *tableValidEnd; + void *allocStart; + BYTE allocFailed; + int workspaceOversizedDuration; + ZSTD_cwksp_alloc_phase_e phase; + ZSTD_cwksp_static_alloc_e isStatic; +} ZSTD_cwksp; + +struct POOL_ctx_s; + +typedef struct POOL_ctx_s ZSTD_threadPool; + +typedef struct { + unsigned int offset; + unsigned int litLength; + unsigned int matchLength; + unsigned int rep; +} ZSTD_Sequence; + +typedef struct { + int collectSequences; + ZSTD_Sequence *seqStart; + size_t seqIndex; + size_t maxSequences; +} SeqCollector; + +typedef enum { + ZSTD_llt_none = 0, + ZSTD_llt_literalLength = 1, + ZSTD_llt_matchLength = 2, +} ZSTD_longLengthType_e; + +struct seqDef_s; + +typedef struct seqDef_s seqDef; + +typedef struct { + seqDef *sequencesStart; + seqDef *sequences; + BYTE *litStart; + BYTE *lit; + BYTE *llCode; + BYTE *mlCode; + BYTE *ofCode; + size_t maxNbSeq; + size_t maxNbLit; + ZSTD_longLengthType_e longLengthType; + U32 longLengthPos; +} seqStore_t; + +typedef struct { + const BYTE *nextSrc; + const BYTE *base; + const BYTE *dictBase; + U32 dictLimit; + U32 lowLimit; + U32 nbOverflowCorrections; +} ZSTD_window_t; + +typedef struct { + U32 offset; + U32 checksum; +} ldmEntry_t; + +typedef struct { + const BYTE *split; + U32 hash; + U32 checksum; + ldmEntry_t *bucket; +} ldmMatchCandidate_t; + +typedef struct { + ZSTD_window_t window; + ldmEntry_t *hashTable; + U32 loadedDictEnd; + BYTE *bucketOffsets; + size_t splitIndices[64]; + ldmMatchCandidate_t matchCandidates[64]; +} ldmState_t; + +typedef struct { + U32 offset; + U32 litLength; + U32 matchLength; +} rawSeq; + +typedef struct { + rawSeq *seq; + size_t pos; + size_t posInSequence; + size_t size; + size_t capacity; +} rawSeqStore_t; + +typedef struct { + HUF_CElt CTable[257]; + HUF_repeat repeatMode; +} ZSTD_hufCTables_t; + +typedef struct { + FSE_CTable offcodeCTable[193]; + FSE_CTable matchlengthCTable[363]; + FSE_CTable litlengthCTable[329]; + FSE_repeat offcode_repeatMode; + FSE_repeat matchlength_repeatMode; + FSE_repeat litlength_repeatMode; +} ZSTD_fseCTables_t; + +typedef struct { + ZSTD_hufCTables_t huf; + ZSTD_fseCTables_t fse; +} ZSTD_entropyCTables_t; + +typedef struct { + ZSTD_entropyCTables_t entropy; + U32 rep[3]; +} ZSTD_compressedBlockState_t; + +typedef struct { + U32 off; + U32 len; +} ZSTD_match_t; + +typedef struct { + int price; + U32 off; + U32 mlen; + U32 litlen; + U32 rep[3]; +} ZSTD_optimal_t; + +typedef enum { + zop_dynamic = 0, + zop_predef = 1, +} ZSTD_OptPrice_e; + +typedef struct { + unsigned int *litFreq; + unsigned int *litLengthFreq; + unsigned int *matchLengthFreq; + unsigned int *offCodeFreq; + ZSTD_match_t *matchTable; + ZSTD_optimal_t *priceTable; + U32 litSum; + U32 litLengthSum; + U32 matchLengthSum; + U32 offCodeSum; + U32 litSumBasePrice; + U32 litLengthSumBasePrice; + U32 matchLengthSumBasePrice; + U32 offCodeSumBasePrice; + ZSTD_OptPrice_e priceType; + const ZSTD_entropyCTables_t *symbolCosts; + ZSTD_paramSwitch_e literalCompressionMode; +} optState_t; + +struct ZSTD_matchState_t; + +typedef struct ZSTD_matchState_t ZSTD_matchState_t; + +struct ZSTD_matchState_t { + ZSTD_window_t window; + U32 loadedDictEnd; + U32 nextToUpdate; + U32 hashLog3; + U32 rowHashLog; + U16 *tagTable; + U32 hashCache[8]; + U32 *hashTable; + U32 *hashTable3; + U32 *chainTable; + U32 forceNonContiguous; + int dedicatedDictSearch; + optState_t opt; + const ZSTD_matchState_t *dictMatchState; + ZSTD_compressionParameters cParams; + const rawSeqStore_t *ldmSeqStore; +}; + +typedef struct { + ZSTD_compressedBlockState_t *prevCBlock; + ZSTD_compressedBlockState_t *nextCBlock; + ZSTD_matchState_t matchState; +} ZSTD_blockState_t; + +typedef enum { + ZSTDb_not_buffered = 0, + ZSTDb_buffered = 1, +} ZSTD_buffered_policy_e; + +typedef enum { + zcss_init = 0, + zcss_load = 1, + zcss_flush = 2, +} ZSTD_cStreamStage; + +typedef enum { + ZSTD_dct_auto = 0, + ZSTD_dct_rawContent = 1, + ZSTD_dct_fullDict = 2, +} ZSTD_dictContentType_e; + +struct ZSTD_CDict_s; + +typedef struct ZSTD_CDict_s ZSTD_CDict; + +typedef struct { + void *dictBuffer; + const void *dict; + size_t dictSize; + ZSTD_dictContentType_e dictContentType; + ZSTD_CDict *cdict; +} ZSTD_localDict; + +struct ZSTD_prefixDict_s { + const void *dict; + size_t dictSize; + ZSTD_dictContentType_e dictContentType; +}; + +typedef struct ZSTD_prefixDict_s ZSTD_prefixDict; + +typedef enum { + set_basic = 0, + set_rle = 1, + set_compressed = 2, + set_repeat = 3, +} symbolEncodingType_e; + +typedef struct { + symbolEncodingType_e hType; + BYTE hufDesBuffer[128]; + size_t hufDesSize; +} ZSTD_hufCTablesMetadata_t; + +typedef struct { + symbolEncodingType_e llType; + symbolEncodingType_e ofType; + symbolEncodingType_e mlType; + BYTE fseTablesBuffer[133]; + size_t fseTablesSize; + size_t lastCountSize; +} ZSTD_fseCTablesMetadata_t; + +typedef struct { + ZSTD_hufCTablesMetadata_t hufMetadata; + ZSTD_fseCTablesMetadata_t fseMetadata; +} ZSTD_entropyCTablesMetadata_t; + +typedef struct { + seqStore_t fullSeqStoreChunk; + seqStore_t firstHalfSeqStore; + seqStore_t secondHalfSeqStore; + seqStore_t currSeqStore; + seqStore_t nextSeqStore; + U32 partitions[196]; + ZSTD_entropyCTablesMetadata_t entropyMetadata; +} ZSTD_blockSplitCtx; + +struct ZSTD_CCtx_s { + ZSTD_compressionStage_e stage; + int cParamsChanged; + int bmi2; + ZSTD_CCtx_params requestedParams; + ZSTD_CCtx_params appliedParams; + ZSTD_CCtx_params simpleApiParams; + U32 dictID; + size_t dictContentSize; + ZSTD_cwksp workspace; + size_t blockSize; + long long unsigned int pledgedSrcSizePlusOne; + long long unsigned int consumedSrcSize; + long long unsigned int producedCSize; + struct xxh64_state xxhState; + ZSTD_customMem customMem; + ZSTD_threadPool *pool; + size_t staticSize; + SeqCollector seqCollector; + int isFirstBlock; + int initialized; + seqStore_t seqStore; + ldmState_t ldmState; + rawSeq *ldmSequences; + size_t maxNbLdmSequences; + rawSeqStore_t externSeqStore; + ZSTD_blockState_t blockState; + U32 *entropyWorkspace; + ZSTD_buffered_policy_e bufferedPolicy; + char *inBuff; + size_t inBuffSize; + size_t inToCompress; + size_t inBuffPos; + size_t inBuffTarget; + char *outBuff; + size_t outBuffSize; + size_t outBuffContentSize; + size_t outBuffFlushedSize; + ZSTD_cStreamStage streamStage; + U32 frameEnded; + ZSTD_inBuffer expectedInBuffer; + size_t expectedOutBufferSize; + ZSTD_localDict localDict; + const ZSTD_CDict *cdict; + ZSTD_prefixDict prefixDict; + ZSTD_blockSplitCtx blockSplitCtx; +}; + +typedef struct ZSTD_CCtx_s ZSTD_CCtx___2; + +typedef struct { + size_t error; + int lowerBound; + int upperBound; +} ZSTD_bounds; + +typedef ZSTD_CCtx___2 ZSTD_CStream___2; + +typedef enum { + ZSTD_e_continue = 0, + ZSTD_e_flush = 1, + ZSTD_e_end = 2, +} ZSTD_EndDirective; + +struct ZSTD_CDict_s { + const void *dictContent; + size_t dictContentSize; + ZSTD_dictContentType_e dictContentType; + U32 *entropyWorkspace; + ZSTD_cwksp workspace; + ZSTD_matchState_t matchState; + ZSTD_compressedBlockState_t cBlockState; + ZSTD_customMem customMem; + U32 dictID; + int compressionLevel; + ZSTD_paramSwitch_e useRowMatchFinder; +}; + +typedef enum { + ZSTD_dlm_byCopy = 0, + ZSTD_dlm_byRef = 1, +} ZSTD_dictLoadMethod_e; + +typedef struct { + long long unsigned int ingested; + long long unsigned int consumed; + long long unsigned int produced; + long long unsigned int flushed; + unsigned int currentJobID; + unsigned int nbActiveWorkers; +} ZSTD_frameProgression; + +typedef enum { + ZSTD_no_overlap = 0, + ZSTD_overlap_src_before_dst = 1, +} ZSTD_overlap_e; + +struct seqDef_s { + U32 offBase; + U16 litLength; + U16 mlBase; +}; + +typedef enum { + ZSTD_dtlm_fast = 0, + ZSTD_dtlm_full = 1, +} ZSTD_dictTableLoadMethod_e; + +typedef enum { + ZSTD_noDict = 0, + ZSTD_extDict = 1, + ZSTD_dictMatchState = 2, + ZSTD_dedicatedDictSearch = 3, +} ZSTD_dictMode_e; + +typedef enum { + ZSTD_cpm_noAttachDict = 0, + ZSTD_cpm_attachDict = 1, + ZSTD_cpm_createCDict = 2, + ZSTD_cpm_unknown = 3, +} ZSTD_cParamMode_e; + +typedef size_t (*ZSTD_blockCompressor)(ZSTD_matchState_t *, seqStore_t *, U32 *, const void *, size_t); + +struct repcodes_s { + U32 rep[3]; +}; + +typedef struct repcodes_s repcodes_t; + +typedef enum { + ZSTD_defaultDisallowed = 0, + ZSTD_defaultAllowed = 1, +} ZSTD_defaultPolicy_e; + +typedef enum { + ZSTDcrp_makeClean = 0, + ZSTDcrp_leaveDirty = 1, +} ZSTD_compResetPolicy_e; + +typedef enum { + ZSTDirp_continue = 0, + ZSTDirp_reset = 1, +} ZSTD_indexResetPolicy_e; + +typedef enum { + ZSTD_resetTarget_CDict = 0, + ZSTD_resetTarget_CCtx = 1, +} ZSTD_resetTarget_e; + +typedef struct { + U32 LLtype; + U32 Offtype; + U32 MLtype; + size_t size; + size_t lastCountSize; +} ZSTD_symbolEncodingTypeStats_t; + +enum { + ZSTDbss_compress = 0, + ZSTDbss_noCompress = 1, +}; + +typedef struct { + U32 *splitLocations; + size_t idx; +} seqStoreSplits; + +typedef struct { + U32 idx; + U32 posInSequence; + size_t posInSrc; +} ZSTD_sequencePosition; + +typedef size_t (*ZSTD_sequenceCopier)(ZSTD_CCtx___2 *, ZSTD_sequencePosition *, const ZSTD_Sequence * const, size_t, const void *, size_t); + +typedef struct { + S16 norm[53]; + U32 wksp[285]; +} ZSTD_BuildCTableWksp; + +typedef struct { + U32 litLength; + U32 matchLength; +} ZSTD_sequenceLength; + +typedef U64 ZSTD_VecMask; + +typedef enum { + search_hashChain = 0, + search_binaryTree = 1, + search_rowHash = 2, +} searchMethod_e; + +typedef struct { + U64 rolling; + U64 stopMask; +} ldmRollingHashState_t; + +typedef U32 (*ZSTD_getAllMatchesFn)(ZSTD_match_t *, ZSTD_matchState_t *, U32 *, const BYTE *, const BYTE *, const U32 *, const U32, const U32); + +typedef struct { + rawSeqStore_t seqStore; + U32 startPosInBlock; + U32 endPosInBlock; + U32 offset; +} ZSTD_optLdm_t; + +typedef enum { + ZSTD_error_no_error = 0, + ZSTD_error_GENERIC = 1, + ZSTD_error_prefix_unknown = 10, + ZSTD_error_version_unsupported = 12, + ZSTD_error_frameParameter_unsupported = 14, + ZSTD_error_frameParameter_windowTooLarge = 16, + ZSTD_error_corruption_detected = 20, + ZSTD_error_checksum_wrong = 22, + ZSTD_error_dictionary_corrupted = 30, + ZSTD_error_dictionary_wrong = 32, + ZSTD_error_dictionaryCreation_failed = 34, + ZSTD_error_parameter_unsupported = 40, + ZSTD_error_parameter_outOfBound = 42, + ZSTD_error_tableLog_tooLarge = 44, + ZSTD_error_maxSymbolValue_tooLarge = 46, + ZSTD_error_maxSymbolValue_tooSmall = 48, + ZSTD_error_stage_wrong = 60, + ZSTD_error_init_missing = 62, + ZSTD_error_memory_allocation = 64, + ZSTD_error_workSpace_tooSmall = 66, + ZSTD_error_dstSize_tooSmall = 70, + ZSTD_error_srcSize_wrong = 72, + ZSTD_error_dstBuffer_null = 74, + ZSTD_error_frameIndex_tooLarge = 100, + ZSTD_error_seekableIO = 102, + ZSTD_error_dstBuffer_wrong = 104, + ZSTD_error_srcBuffer_wrong = 105, + ZSTD_error_maxCode = 120, +} ZSTD_ErrorCode; + +typedef ZSTD_DCtx ZSTD_DStream; + +typedef enum { + ZSTD_frame = 0, + ZSTD_skippableFrame = 1, +} ZSTD_frameType_e; + +typedef struct { + long long unsigned int frameContentSize; + long long unsigned int windowSize; + unsigned int blockSizeMax; + ZSTD_frameType_e frameType; + unsigned int headerSize; + unsigned int dictID; + unsigned int checksumFlag; + long: 32; +} ZSTD_frameHeader; + +typedef ZSTD_ErrorCode zstd_error_code; + +typedef ZSTD_DStream zstd_dstream; + +typedef ZSTD_frameHeader zstd_frame_header; + +typedef struct { + size_t bitContainer; + unsigned int bitsConsumed; + const char *ptr; + const char *start; + const char *limitPtr; +} BIT_DStream_t; + +typedef enum { + BIT_DStream_unfinished = 0, + BIT_DStream_endOfBuffer = 1, + BIT_DStream_completed = 2, + BIT_DStream_overflow = 3, +} BIT_DStream_status; + +typedef U32 HUF_DTable; + +typedef struct { + BYTE maxTableLog; + BYTE tableType; + BYTE tableLog; + BYTE reserved; +} DTableDesc; + +typedef struct { + BYTE nbBits; + BYTE byte; +} HUF_DEltX1; + +typedef struct { + U32 rankVal[13]; + U32 rankStart[13]; + U32 statsWksp[218]; + BYTE symbols[256]; + BYTE huffWeight[256]; +} HUF_ReadDTableX1_Workspace; + +typedef struct { + U16 sequence; + BYTE nbBits; + BYTE length; +} HUF_DEltX2; + +typedef struct { + BYTE symbol; +} sortedSymbol_t; + +typedef U32 rankValCol_t[13]; + +typedef struct { + U32 rankVal[156]; + U32 rankStats[13]; + U32 rankStart0[15]; + sortedSymbol_t sortedSymbol[256]; + BYTE weightList[256]; + U32 calleeWksp[218]; +} HUF_ReadDTableX2_Workspace; + +typedef struct { + U32 tableTime; + U32 decode256Time; +} algo_time_t; + +typedef struct { + U16 nextState; + BYTE nbAdditionalBits; + BYTE nbBits; + U32 baseValue; +} ZSTD_seqSymbol; + +typedef struct { + ZSTD_seqSymbol LLTable[513]; + ZSTD_seqSymbol OFTable[257]; + ZSTD_seqSymbol MLTable[513]; + HUF_DTable hufTable[4097]; + U32 rep[3]; + U32 workspace[157]; +} ZSTD_entropyDTables_t; + +typedef enum { + bt_raw = 0, + bt_rle = 1, + bt_compressed = 2, + bt_reserved = 3, +} blockType_e; + +typedef enum { + ZSTDds_getFrameHeaderSize = 0, + ZSTDds_decodeFrameHeader = 1, + ZSTDds_decodeBlockHeader = 2, + ZSTDds_decompressBlock = 3, + ZSTDds_decompressLastBlock = 4, + ZSTDds_checkChecksum = 5, + ZSTDds_decodeSkippableHeader = 6, + ZSTDds_skipFrame = 7, +} ZSTD_dStage; + +typedef enum { + ZSTD_d_validateChecksum = 0, + ZSTD_d_ignoreChecksum = 1, +} ZSTD_forceIgnoreChecksum_e; + +typedef enum { + ZSTD_use_indefinitely = 4294967295, + ZSTD_dont_use = 0, + ZSTD_use_once = 1, +} ZSTD_dictUses_e; + +struct ZSTD_DDict_s; + +typedef struct ZSTD_DDict_s ZSTD_DDict; + +typedef struct { + const ZSTD_DDict **ddictPtrTable; + size_t ddictPtrTableSize; + size_t ddictPtrCount; +} ZSTD_DDictHashSet; + +typedef enum { + ZSTD_rmd_refSingleDDict = 0, + ZSTD_rmd_refMultipleDDicts = 1, +} ZSTD_refMultipleDDicts_e; + +typedef enum { + zdss_init = 0, + zdss_loadHeader = 1, + zdss_read = 2, + zdss_load = 3, + zdss_flush = 4, +} ZSTD_dStreamStage; + +typedef enum { + ZSTD_not_in_dst = 0, + ZSTD_in_dst = 1, + ZSTD_split = 2, +} ZSTD_litLocation_e; + +struct ZSTD_DCtx_s { + const ZSTD_seqSymbol *LLTptr; + const ZSTD_seqSymbol *MLTptr; + const ZSTD_seqSymbol *OFTptr; + const HUF_DTable *HUFptr; + ZSTD_entropyDTables_t entropy; + U32 workspace[640]; + const void *previousDstEnd; + const void *prefixStart; + const void *virtualStart; + const void *dictEnd; + size_t expected; + ZSTD_frameHeader fParams; + U64 processedCSize; + U64 decodedSize; + blockType_e bType; + ZSTD_dStage stage; + U32 litEntropy; + U32 fseEntropy; + struct xxh64_state xxhState; + size_t headerSize; + ZSTD_format_e format; + ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; + U32 validateChecksum; + const BYTE *litPtr; + ZSTD_customMem customMem; + size_t litSize; + size_t rleSize; + size_t staticSize; + ZSTD_DDict *ddictLocal; + const ZSTD_DDict *ddict; + U32 dictID; + int ddictIsCold; + ZSTD_dictUses_e dictUses; + ZSTD_DDictHashSet *ddictSet; + ZSTD_refMultipleDDicts_e refMultipleDDicts; + ZSTD_dStreamStage streamStage; + char *inBuff; + size_t inBuffSize; + size_t inPos; + size_t maxWindowSize; + char *outBuff; + size_t outBuffSize; + size_t outStart; + size_t outEnd; + size_t lhSize; + U32 hostageByte; + int noForwardProgress; + ZSTD_bufferMode_e outBufferMode; + ZSTD_outBuffer expectedOutBuffer; + BYTE *litBuffer; + const BYTE *litBufferEnd; + ZSTD_litLocation_e litBufferLocation; + BYTE litExtraBuffer[65568]; + BYTE headerBuffer[18]; + size_t oversizedDuration; + long: 32; +}; + +typedef struct ZSTD_DCtx_s ZSTD_DCtx___2; + +struct ZSTD_DDict_s { + void *dictBuffer; + const void *dictContent; + size_t dictSize; + ZSTD_entropyDTables_t entropy; + U32 dictID; + U32 entropyPresent; + ZSTD_customMem cMem; +}; + +typedef enum { + ZSTD_d_windowLogMax = 100, + ZSTD_d_experimentalParam1 = 1000, + ZSTD_d_experimentalParam2 = 1001, + ZSTD_d_experimentalParam3 = 1002, + ZSTD_d_experimentalParam4 = 1003, +} ZSTD_dParameter; + +typedef ZSTD_DCtx___2 ZSTD_DStream___2; + +typedef enum { + ZSTDnit_frameHeader = 0, + ZSTDnit_blockHeader = 1, + ZSTDnit_block = 2, + ZSTDnit_lastBlock = 3, + ZSTDnit_checksum = 4, + ZSTDnit_skippableFrame = 5, +} ZSTD_nextInputType_e; + +typedef struct { + size_t compressedSize; + long: 32; + long long unsigned int decompressedBound; +} ZSTD_frameSizeInfo; + +typedef struct { + blockType_e blockType; + U32 lastBlock; + U32 origSize; +} blockProperties_t; + +typedef enum { + not_streaming = 0, + is_streaming = 1, +} streaming_operation; + +typedef struct { + U32 fastMode; + U32 tableLog; +} ZSTD_seqSymbol_header; + +typedef struct { + size_t litLength; + size_t matchLength; + size_t offset; +} seq_t; + +typedef struct { + size_t state; + const ZSTD_seqSymbol *table; +} ZSTD_fseState; + +typedef struct { + BIT_DStream_t DStream; + ZSTD_fseState stateLL; + ZSTD_fseState stateOffb; + ZSTD_fseState stateML; + size_t prevOffset[3]; +} seqState_t; + +typedef enum { + ZSTD_lo_isRegularOffset = 0, + ZSTD_lo_isLongOffset = 1, +} ZSTD_longOffset_e; + +typedef ZSTD_ErrorCode ERR_enum; + +typedef unsigned int FSE_DTable; + +typedef struct { + size_t state; + const void *table; +} FSE_DState_t; + +typedef struct { + U16 tableLog; + U16 fastMode; +} FSE_DTableHeader; + +typedef struct { + short unsigned int newState; + unsigned char symbol; + unsigned char nbBits; +} FSE_decode_t; + +typedef struct { + short int ncount[256]; + FSE_DTable dtable[1]; +} FSE_DecompressWksp; + +enum xz_mode { + XZ_SINGLE = 0, + XZ_PREALLOC = 1, + XZ_DYNALLOC = 2, +}; + +enum xz_ret { + XZ_OK = 0, + XZ_STREAM_END = 1, + XZ_UNSUPPORTED_CHECK = 2, + XZ_MEM_ERROR = 3, + XZ_MEMLIMIT_ERROR = 4, + XZ_FORMAT_ERROR = 5, + XZ_OPTIONS_ERROR = 6, + XZ_DATA_ERROR = 7, + XZ_BUF_ERROR = 8, +}; + +struct xz_buf { + const uint8_t *in; + size_t in_pos; + size_t in_size; + uint8_t *out; + size_t out_pos; + size_t out_size; +}; + +struct xz_dec; + +typedef uint64_t vli_type; + +enum xz_check { + XZ_CHECK_NONE = 0, + XZ_CHECK_CRC32 = 1, + XZ_CHECK_CRC64 = 4, + XZ_CHECK_SHA256 = 10, +}; + +struct xz_dec_hash { + vli_type unpadded; + vli_type uncompressed; + uint32_t crc32; + long: 32; +}; + +struct xz_dec_lzma2; + +struct xz_dec_bcj; + +struct xz_dec { + enum { + SEQ_STREAM_HEADER = 0, + SEQ_BLOCK_START = 1, + SEQ_BLOCK_HEADER = 2, + SEQ_BLOCK_UNCOMPRESS = 3, + SEQ_BLOCK_PADDING = 4, + SEQ_BLOCK_CHECK = 5, + SEQ_INDEX = 6, + SEQ_INDEX_PADDING = 7, + SEQ_INDEX_CRC32 = 8, + SEQ_STREAM_FOOTER = 9, + } sequence; + uint32_t pos; + vli_type vli; + size_t in_start; + size_t out_start; + uint32_t crc32; + enum xz_check check_type; + enum xz_mode mode; + bool allow_buf_error; + struct { + vli_type compressed; + vli_type uncompressed; + uint32_t size; + long: 32; + } block_header; + struct { + vli_type compressed; + vli_type uncompressed; + vli_type count; + struct xz_dec_hash hash; + } block; + struct { + enum { + SEQ_INDEX_COUNT = 0, + SEQ_INDEX_UNPADDED = 1, + SEQ_INDEX_UNCOMPRESSED = 2, + } sequence; + long: 32; + vli_type size; + vli_type count; + struct xz_dec_hash hash; + } index; + struct { + size_t pos; + size_t size; + uint8_t buf[1024]; + } temp; + struct xz_dec_lzma2 *lzma2; + struct xz_dec_bcj *bcj; + bool bcj_active; + long: 32; +}; + +enum lzma_state { + STATE_LIT_LIT = 0, + STATE_MATCH_LIT_LIT = 1, + STATE_REP_LIT_LIT = 2, + STATE_SHORTREP_LIT_LIT = 3, + STATE_MATCH_LIT = 4, + STATE_REP_LIT = 5, + STATE_SHORTREP_LIT = 6, + STATE_LIT_MATCH = 7, + STATE_LIT_LONGREP = 8, + STATE_LIT_SHORTREP = 9, + STATE_NONLIT_MATCH = 10, + STATE_NONLIT_REP = 11, +}; + +struct dictionary { + uint8_t *buf; + size_t start; + size_t pos; + size_t full; + size_t limit; + size_t end; + uint32_t size; + uint32_t size_max; + uint32_t allocated; + enum xz_mode mode; +}; + +struct rc_dec { + uint32_t range; + uint32_t code; + uint32_t init_bytes_left; + const uint8_t *in; + size_t in_pos; + size_t in_limit; +}; + +struct lzma_len_dec { + uint16_t choice; + uint16_t choice2; + uint16_t low[128]; + uint16_t mid[128]; + uint16_t high[256]; +}; + +struct lzma_dec { + uint32_t rep0; + uint32_t rep1; + uint32_t rep2; + uint32_t rep3; + enum lzma_state state; + uint32_t len; + uint32_t lc; + uint32_t literal_pos_mask; + uint32_t pos_mask; + uint16_t is_match[192]; + uint16_t is_rep[12]; + uint16_t is_rep0[12]; + uint16_t is_rep1[12]; + uint16_t is_rep2[12]; + uint16_t is_rep0_long[192]; + uint16_t dist_slot[256]; + uint16_t dist_special[114]; + uint16_t dist_align[16]; + struct lzma_len_dec match_len_dec; + struct lzma_len_dec rep_len_dec; + uint16_t literal[12288]; +}; + +enum lzma2_seq { + SEQ_CONTROL = 0, + SEQ_UNCOMPRESSED_1 = 1, + SEQ_UNCOMPRESSED_2 = 2, + SEQ_COMPRESSED_0 = 3, + SEQ_COMPRESSED_1 = 4, + SEQ_PROPERTIES = 5, + SEQ_LZMA_PREPARE = 6, + SEQ_LZMA_RUN = 7, + SEQ_COPY = 8, +}; + +struct lzma2_dec { + enum lzma2_seq sequence; + enum lzma2_seq next_sequence; + uint32_t uncompressed; + uint32_t compressed; + bool need_dict_reset; + bool need_props; +}; + +struct xz_dec_lzma2 { + struct rc_dec rc; + struct dictionary dict; + struct lzma2_dec lzma2; + struct lzma_dec lzma; + struct { + uint32_t size; + uint8_t buf[63]; + } temp; +}; + +struct xz_dec_bcj { + enum { + BCJ_X86 = 4, + BCJ_POWERPC = 5, + BCJ_IA64 = 6, + BCJ_ARM = 7, + BCJ_ARMTHUMB = 8, + BCJ_SPARC = 9, + } type; + enum xz_ret ret; + bool single_call; + uint32_t pos; + uint32_t x86_prev_mask; + uint8_t *out; + size_t out_pos; + size_t out_size; + struct { + size_t filtered; + size_t size; + uint8_t buf[16]; + } temp; +}; + +struct ts_state { + unsigned int offset; + char cb[48]; +}; + +struct ts_config; + +struct ts_ops { + const char *name; + struct ts_config * (*init)(const void *, unsigned int, gfp_t, int); + unsigned int (*find)(struct ts_config *, struct ts_state *); + void (*destroy)(struct ts_config *); + void * (*get_pattern)(struct ts_config *); + unsigned int (*get_pattern_len)(struct ts_config *); + struct module *owner; + struct list_head list; +}; + +struct ts_config { + struct ts_ops *ops; + int flags; + unsigned int (*get_next_block)(unsigned int, const u8 **, struct ts_config *, struct ts_state *); + void (*finish)(struct ts_config *, struct ts_state *); +}; + +struct ts_linear_state { + unsigned int len; + const void *data; +}; + +struct ddebug_class_param { + union { + long unsigned int *bits; + unsigned int *lvl; + }; + char flags[8]; + const struct ddebug_class_map *map; +}; + +struct ddebug_table { + struct list_head link; + struct list_head maps; + const char *mod_name; + unsigned int num_ddebugs; + struct _ddebug *ddebugs; +}; + +struct ddebug_query { + const char *filename; + const char *module; + const char *function; + const char *format; + const char *class_string; + unsigned int first_lineno; + unsigned int last_lineno; +}; + +struct ddebug_iter { + struct ddebug_table *table; + int idx; +}; + +struct flag_settings { + unsigned int flags; + unsigned int mask; +}; + +struct flagsbuf { + char buf[7]; +}; + +struct nla_bitfield32 { + __u32 value; + __u32 selector; +}; + +enum nla_policy_validation { + NLA_VALIDATE_NONE = 0, + NLA_VALIDATE_RANGE = 1, + NLA_VALIDATE_RANGE_WARN_TOO_LONG = 2, + NLA_VALIDATE_MIN = 3, + NLA_VALIDATE_MAX = 4, + NLA_VALIDATE_MASK = 5, + NLA_VALIDATE_RANGE_PTR = 6, + NLA_VALIDATE_FUNCTION = 7, +}; + +enum netlink_validation { + NL_VALIDATE_LIBERAL = 0, + NL_VALIDATE_TRAILING = 1, + NL_VALIDATE_MAXTYPE = 2, + NL_VALIDATE_UNSPEC = 4, + NL_VALIDATE_STRICT_ATTRS = 8, + NL_VALIDATE_NESTED = 16, +}; + +struct cpu_rmap { + struct kref refcount; + u16 size; + u16 used; + void **obj; + struct { + u16 index; + u16 dist; + } near[0]; +}; + +struct irq_glue { + struct irq_affinity_notify notify; + struct cpu_rmap *rmap; + u16 index; +}; + +typedef mpi_limb_t *mpi_ptr_t; + +typedef int mpi_size_t; + +typedef unsigned int USItype; + +enum gcry_mpi_constants { + MPI_C_ZERO = 0, + MPI_C_ONE = 1, + MPI_C_TWO = 2, + MPI_C_THREE = 3, + MPI_C_FOUR = 4, + MPI_C_EIGHT = 5, +}; + +struct barrett_ctx_s; + +typedef struct barrett_ctx_s *mpi_barrett_t; + +struct gcry_mpi_point { + MPI x; + MPI y; + MPI z; +}; + +typedef struct gcry_mpi_point *MPI_POINT; + +enum gcry_mpi_ec_models { + MPI_EC_WEIERSTRASS = 0, + MPI_EC_MONTGOMERY = 1, + MPI_EC_EDWARDS = 2, +}; + +enum ecc_dialects { + ECC_DIALECT_STANDARD = 0, + ECC_DIALECT_ED25519 = 1, + ECC_DIALECT_SAFECURVE = 2, +}; + +struct mpi_ec_ctx { + enum gcry_mpi_ec_models model; + enum ecc_dialects dialect; + int flags; + unsigned int nbits; + MPI p; + MPI a; + MPI b; + MPI_POINT G; + MPI n; + unsigned int h; + MPI_POINT Q; + MPI d; + const char *name; + struct { + struct { + unsigned int a_is_pminus3: 1; + unsigned int two_inv_p: 1; + } valid; + int a_is_pminus3; + MPI two_inv_p; + mpi_barrett_t p_barrett; + MPI scratch[11]; + } t; + void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); + void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); +}; + +struct field_table { + const char *p; + void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); + void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); +}; + +enum gcry_mpi_format { + GCRYMPI_FMT_NONE = 0, + GCRYMPI_FMT_STD = 1, + GCRYMPI_FMT_PGP = 2, + GCRYMPI_FMT_SSH = 3, + GCRYMPI_FMT_HEX = 4, + GCRYMPI_FMT_USG = 5, + GCRYMPI_FMT_OPAQUE = 8, +}; + +struct barrett_ctx_s; + +typedef struct barrett_ctx_s *mpi_barrett_t___2; + +struct barrett_ctx_s { + MPI m; + int m_copied; + int k; + MPI y; + MPI r1; + MPI r2; + MPI r3; +}; + +typedef mpi_limb_t UWtype; + +struct karatsuba_ctx { + struct karatsuba_ctx *next; + mpi_ptr_t tspace; + mpi_size_t tspace_size; + mpi_ptr_t tp; + mpi_size_t tp_size; +}; + +typedef long int mpi_limb_signed_t; + +enum dim_tune_state { + DIM_PARKING_ON_TOP = 0, + DIM_PARKING_TIRED = 1, + DIM_GOING_RIGHT = 2, + DIM_GOING_LEFT = 3, +}; + +struct dim_cq_moder { + u16 usec; + u16 pkts; + u16 comps; + u8 cq_period_mode; +}; + +enum dim_cq_period_mode { + DIM_CQ_PERIOD_MODE_START_FROM_EQE = 0, + DIM_CQ_PERIOD_MODE_START_FROM_CQE = 1, + DIM_CQ_PERIOD_NUM_MODES = 2, +}; + +enum dim_state { + DIM_START_MEASURE = 0, + DIM_MEASURE_IN_PROGRESS = 1, + DIM_APPLY_NEW_PROFILE = 2, +}; + +enum dim_stats_state { + DIM_STATS_WORSE = 0, + DIM_STATS_SAME = 1, + DIM_STATS_BETTER = 2, +}; + +enum dim_step_result { + DIM_STEPPED = 0, + DIM_TOO_TIRED = 1, + DIM_ON_EDGE = 2, +}; + +struct sg_splitter { + struct scatterlist *in_sg0; + int nents; + off_t skip_sg0; + unsigned int length_last_sg; + struct scatterlist *out_sg; +}; + +struct sg_pool { + size_t size; + char *name; + struct kmem_cache *slab; + mempool_t *pool; +}; + +enum { + IRQ_POLL_F_SCHED = 0, + IRQ_POLL_F_DISABLE = 1, +}; + +union handle_parts { + depot_stack_handle_t handle; + struct { + u32 slabindex: 16; + u32 offset: 10; + u32 valid: 1; + u32 extra: 5; + }; +}; + +struct stack_record { + struct stack_record *next; + u32 hash; + u32 size; + union handle_parts handle; + long unsigned int entries[0]; +}; + +struct font_desc { + int idx; + const char *name; + unsigned int width; + unsigned int height; + unsigned int charcount; + const void *data; + int pref; +}; + +struct font_data { + unsigned int extra[4]; + const unsigned char data[0]; +}; + +typedef u16 ucs2_char_t; + +struct firmware { + size_t size; + const u8 *data; + void *priv; +}; + +struct pldmfw_record { + struct list_head entry; + struct list_head descs; + const u8 *version_string; + u8 version_type; + u8 version_len; + u16 package_data_len; + u32 device_update_flags; + const u8 *package_data; + long unsigned int *component_bitmap; + u16 component_bitmap_len; +}; + +struct pldmfw_desc_tlv { + struct list_head entry; + const u8 *data; + u16 type; + u16 size; +}; + +struct pldmfw_component { + struct list_head entry; + u16 classification; + u16 identifier; + u16 options; + u16 activation_method; + u32 comparison_stamp; + u32 component_size; + const u8 *component_data; + const u8 *version_string; + u8 version_type; + u8 version_len; + u8 index; +}; + +struct pldmfw_ops; + +struct pldmfw { + const struct pldmfw_ops *ops; + struct device *dev; +}; + +struct pldmfw_ops { + bool (*match_record)(struct pldmfw *, struct pldmfw_record *); + int (*send_package_data)(struct pldmfw *, const u8 *, u16); + int (*send_component_table)(struct pldmfw *, struct pldmfw_component *, u8); + int (*flash_component)(struct pldmfw *, struct pldmfw_component *); + int (*finalize_update)(struct pldmfw *); +}; + +struct __pldm_timestamp { + u8 b[13]; +}; + +struct __pldm_header { + uuid_t id; + u8 revision; + __le16 size; + struct __pldm_timestamp release_date; + __le16 component_bitmap_len; + u8 version_type; + u8 version_len; + u8 version_string[0]; +} __attribute__((packed)); + +struct __pldmfw_record_info { + __le16 record_len; + u8 descriptor_count; + __le32 device_update_flags; + u8 version_type; + u8 version_len; + __le16 package_data_len; + u8 variable_record_data[0]; +} __attribute__((packed)); + +struct __pldmfw_desc_tlv { + __le16 type; + __le16 size; + u8 data[0]; +}; + +struct __pldmfw_record_area { + u8 record_count; + u8 records[0]; +}; + +struct __pldmfw_component_info { + __le16 classification; + __le16 identifier; + __le32 comparison_stamp; + __le16 options; + __le16 activation_method; + __le32 location_offset; + __le32 size; + u8 version_type; + u8 version_len; + u8 version_string[0]; +} __attribute__((packed)); + +struct __pldmfw_component_area { + __le16 component_image_count; + u8 components[0]; +}; + +struct pldmfw_priv { + struct pldmfw *context; + const struct firmware *fw; + size_t offset; + struct list_head records; + struct list_head components; + const struct __pldm_header *header; + u16 total_header_size; + u16 component_bitmap_len; + u16 bitmap_size; + u16 component_count; + const u8 *component_start; + const u8 *record_start; + u8 record_count; + u32 header_crc; + struct pldmfw_record *matching_record; +}; + +struct pldm_pci_record_id { + int vendor; + int device; + int subsystem_vendor; + int subsystem_device; +}; + +struct armctrl_ic { + void *base; + void *pending[3]; + void *enable[3]; + void *disable[3]; + struct irq_domain *domain; +}; + +struct bcm2836_arm_irqchip_intc { + struct irq_domain *domain; + void *base; +}; + +struct combiner_chip_data { + unsigned int hwirq_offset; + unsigned int irq_mask; + void *base; + unsigned int parent_irq; + u32 pm_save; +}; + +struct icu_chip_data { + int nr_irqs; + unsigned int virq_base; + unsigned int cascade_irq; + void *reg_status; + void *reg_mask; + unsigned int conf_enable; + unsigned int conf_disable; + unsigned int conf_mask; + unsigned int conf2_mask; + unsigned int clr_mfp_irq_base; + unsigned int clr_mfp_hwirq; + struct irq_domain *domain; +}; + +struct mmp_intc_conf { + unsigned int conf_enable; + unsigned int conf_disable; + unsigned int conf_mask; + unsigned int conf2_mask; +}; + +struct tegra_ictlr_soc { + unsigned int num_ictlrs; +}; + +struct tegra_ictlr_info { + void *base[6]; + u32 cop_ier[6]; + u32 cop_iep[6]; + u32 cpu_ier[6]; + u32 cpu_iep[6]; + u32 ictlr_wake_mask[6]; +}; + +struct omap_intc_regs { + u32 sysconfig; + u32 protection; + u32 idle; + u32 threshold; + u32 ilr[128]; + u32 mir[4]; +}; + +struct sun4i_irq_chip_data { + void *irq_base; + struct irq_domain *irq_domain; + u32 enable_reg_offset; + u32 mask_reg_offset; +}; + +struct sun6i_r_intc_variant { + u32 first_mux_irq; + u32 nr_mux_irqs; + u32 mux_valid[4]; +}; + +enum { + SUNXI_SRC_TYPE_LEVEL_LOW = 0, + SUNXI_SRC_TYPE_EDGE_FALLING = 1, + SUNXI_SRC_TYPE_LEVEL_HIGH = 2, + SUNXI_SRC_TYPE_EDGE_RISING = 3, +}; + +struct sunxi_sc_nmi_reg_offs { + u32 ctrl; + u32 pend; + u32 enable; +}; + +enum gic_type { + GIC_V2 = 0, + GIC_V3 = 1, +}; + +struct gic_kvm_info { + enum gic_type type; + long: 32; + struct resource vcpu; + unsigned int maint_irq; + bool no_maint_irq_mask; + struct resource vctrl; + bool has_v4; + bool has_v4_1; + bool no_hw_deactivation; + long: 32; +}; + +struct gic_quirk { + const char *desc; + const char *compatible; + bool (*init)(void *); + u32 iidr; + u32 mask; +}; + +union gic_base { + void *common_base; + void **percpu_base; +}; + +struct gic_chip_data { + union gic_base dist_base; + union gic_base cpu_base; + void *raw_dist_base; + void *raw_cpu_base; + u32 percpu_offset; + u32 saved_spi_enable[32]; + u32 saved_spi_active[32]; + u32 saved_spi_conf[64]; + u32 saved_spi_target[255]; + u32 *saved_ppi_enable; + u32 *saved_ppi_active; + u32 *saved_ppi_conf; + struct irq_domain *domain; + unsigned int gic_irqs; +}; + +struct v2m_data { + struct list_head entry; + struct fwnode_handle *fwnode; + long: 32; + struct resource res; + void *base; + u32 spi_start; + u32 nr_spis; + u32 spi_offset; + long unsigned int *bm; + u32 flags; +}; + +struct rdists { + struct { + raw_spinlock_t rd_lock; + void *rd_base; + struct page *pend_page; + long: 32; + phys_addr_t phys_base; + u64 flags; + cpumask_t *vpe_table_mask; + void *vpe_l1_base; + } *rdist; + long: 32; + phys_addr_t prop_table_pa; + void *prop_table_va; + long: 32; + u64 flags; + u32 gicd_typer; + u32 gicd_typer2; + int cpuhp_memreserve_state; + bool has_vlpis; + bool has_rvpeid; + bool has_direct_lpi; + bool has_vpend_valid_dirty; +}; + +struct partition_affinity { + cpumask_t mask; + void *partition_id; +}; + +struct redist_region { + void *redist_base; + long: 32; + phys_addr_t phys_base; + bool single_redist; + long: 32; +}; + +struct partition_desc; + +struct gic_chip_data___2 { + struct fwnode_handle *fwnode; + void *dist_base; + struct redist_region *redist_regions; + long: 32; + struct rdists rdists; + struct irq_domain *domain; + long: 32; + u64 redist_stride; + u32 nr_redist_regions; + long: 32; + u64 flags; + bool has_rss; + unsigned int ppi_nr; + struct partition_desc **ppi_descs; + long: 32; +}; + +enum gic_intid_range { + SGI_RANGE = 0, + PPI_RANGE = 1, + SPI_RANGE = 2, + EPPI_RANGE = 3, + ESPI_RANGE = 4, + LPI_RANGE = 5, + __INVALID_RANGE__ = 6, +}; + +struct mbi_range { + u32 spi_start; + u32 nr_spis; + long unsigned int *bm; +}; + +struct its_vpe; + +struct its_vm { + struct fwnode_handle *fwnode; + struct irq_domain *domain; + struct page *vprop_page; + struct its_vpe **vpes; + int nr_vpes; + irq_hw_number_t db_lpi_base; + long unsigned int *db_bitmap; + int nr_db_lpis; + u32 vlpi_count[16]; +}; + +struct its_vpe { + struct page *vpt_page; + struct its_vm *its_vm; + atomic_t vlpi_count; + int irq; + irq_hw_number_t vpe_db_lpi; + bool resident; + bool ready; + union { + struct { + int vpe_proxy_event; + bool idai; + }; + struct { + struct fwnode_handle *fwnode; + struct irq_domain *sgi_domain; + struct { + u8 priority; + bool enabled; + bool group; + } sgi_config[16]; + atomic_t vmapp_count; + }; + }; + raw_spinlock_t vpe_lock; + u16 col_idx; + u16 vpe_id; + bool pending_last; +}; + +struct its_vlpi_map { + struct its_vm *vm; + struct its_vpe *vpe; + u32 vintid; + u8 properties; + bool db_enabled; +}; + +enum its_vcpu_info_cmd_type { + MAP_VLPI = 0, + GET_VLPI = 1, + PROP_UPDATE_VLPI = 2, + PROP_UPDATE_AND_INV_VLPI = 3, + SCHEDULE_VPE = 4, + DESCHEDULE_VPE = 5, + COMMIT_VPE = 6, + INVALL_VPE = 7, + PROP_UPDATE_VSGI = 8, +}; + +struct its_cmd_info { + enum its_vcpu_info_cmd_type cmd_type; + union { + struct its_vlpi_map *map; + u8 config; + bool req_db; + struct { + bool g0en; + bool g1en; + }; + struct { + u8 priority; + bool group; + }; + }; +}; + +struct its_collection { + u64 target_address; + u16 col_id; + long: 32; +}; + +struct its_baser { + void *base; + long: 32; + u64 val; + u32 order; + u32 psz; +}; + +struct its_cmd_block; + +struct its_device; + +struct its_node { + raw_spinlock_t lock; + struct mutex dev_alloc_lock; + struct list_head entry; + void *base; + void *sgir_base; + phys_addr_t phys_base; + struct its_cmd_block *cmd_base; + struct its_cmd_block *cmd_write; + struct its_baser tables[8]; + struct its_collection *collections; + struct fwnode_handle *fwnode_handle; + u64 (*get_msi_base)(struct its_device *); + long: 32; + u64 typer; + u64 cbaser_save; + u32 ctlr_save; + u32 mpidr; + struct list_head its_device_list; + u64 flags; + long unsigned int list_nr; + int numa_node; + unsigned int msi_domain_flags; + u32 pre_its_base; + int vlpi_redist_offset; + long: 32; +}; + +struct its_cmd_block { + union { + u64 raw_cmd[4]; + __le64 raw_cmd_le[4]; + }; +}; + +struct event_lpi_map { + long unsigned int *lpi_map; + u16 *col_map; + irq_hw_number_t lpi_base; + int nr_lpis; + raw_spinlock_t vlpi_lock; + struct its_vm *vm; + struct its_vlpi_map *vlpi_maps; + int nr_vlpis; +}; + +struct its_device { + struct list_head entry; + struct its_node *its; + struct event_lpi_map event_map; + void *itt; + u32 nr_ites; + u32 device_id; + bool shared; +}; + +struct cpu_lpi_count { + atomic_t managed; + atomic_t unmanaged; +}; + +struct its_cmd_desc { + union { + struct { + struct its_device *dev; + u32 event_id; + } its_inv_cmd; + struct { + struct its_device *dev; + u32 event_id; + } its_clear_cmd; + struct { + struct its_device *dev; + u32 event_id; + } its_int_cmd; + struct { + struct its_device *dev; + int valid; + } its_mapd_cmd; + struct { + struct its_collection *col; + int valid; + } its_mapc_cmd; + struct { + struct its_device *dev; + u32 phys_id; + u32 event_id; + } its_mapti_cmd; + struct { + struct its_device *dev; + struct its_collection *col; + u32 event_id; + } its_movi_cmd; + struct { + struct its_device *dev; + u32 event_id; + } its_discard_cmd; + struct { + struct its_collection *col; + } its_invall_cmd; + struct { + struct its_vpe *vpe; + } its_vinvall_cmd; + struct { + struct its_vpe *vpe; + struct its_collection *col; + bool valid; + } its_vmapp_cmd; + struct { + struct its_vpe *vpe; + struct its_device *dev; + u32 virt_id; + u32 event_id; + bool db_enabled; + } its_vmapti_cmd; + struct { + struct its_vpe *vpe; + struct its_device *dev; + u32 event_id; + bool db_enabled; + } its_vmovi_cmd; + struct { + struct its_vpe *vpe; + struct its_collection *col; + u16 seq_num; + u16 its_list; + } its_vmovp_cmd; + struct { + struct its_vpe *vpe; + } its_invdb_cmd; + struct { + struct its_vpe *vpe; + u8 sgi; + u8 priority; + bool enable; + bool group; + bool clear; + } its_vsgi_cmd; + }; +}; + +typedef struct its_collection * (*its_cmd_builder_t)(struct its_node *, struct its_cmd_block *, struct its_cmd_desc *); + +typedef struct its_vpe * (*its_cmd_vbuilder_t)(struct its_node *, struct its_cmd_block *, struct its_cmd_desc *); + +struct lpi_range { + struct list_head entry; + u32 base_id; + u32 span; +}; + +struct partition_desc { + int nr_parts; + struct partition_affinity *parts; + struct irq_domain *domain; + struct irq_desc *chained_desc; + long unsigned int *bitmap; + struct irq_domain_ops ops; +}; + +struct vt8500_irq_data { + void *base; + struct irq_domain *domain; +}; + +struct crossbar_device { + raw_spinlock_t lock; + uint int_max; + uint safe_map; + uint max_crossbar_sources; + uint *irq_map; + void *crossbar_base; + int *register_offsets; + void (*write)(int, int); +}; + +struct brcmstb_intc_init_params { + irq_flow_handler_t handler; + int cpu_status; + int cpu_clear; + int cpu_mask_status; + int cpu_mask_set; + int cpu_mask_clear; +}; + +struct brcmstb_l2_intc_data { + struct irq_domain *domain; + struct irq_chip_generic *gc; + int status_offset; + int mask_offset; + bool can_wake; + u32 saved_mask; +}; + +struct aspeed_vic { + void *base; + u32 edge_sources[2]; + struct irq_domain *dom; +}; + +struct aspeed_i2c_ic { + void *base; + int parent_irq; + struct irq_domain *irq_domain; +}; + +struct regmap; + +struct aspeed_scu_ic { + long unsigned int irq_enable; + long unsigned int irq_shift; + unsigned int num_irqs; + unsigned int reg; + struct regmap *scu; + struct irq_domain *irq_domain; +}; + +struct stm32_exti_bank { + u32 imr_ofst; + u32 emr_ofst; + u32 rtsr_ofst; + u32 ftsr_ofst; + u32 swier_ofst; + u32 rpr_ofst; + u32 fpr_ofst; + u32 trg_ofst; +}; + +struct stm32_exti_drv_data { + const struct stm32_exti_bank **exti_banks; + const u8 *desc_irqs; + u32 bank_nr; +}; + +struct stm32_exti_host_data; + +struct stm32_exti_chip_data { + struct stm32_exti_host_data *host_data; + const struct stm32_exti_bank *reg_bank; + struct raw_spinlock rlock; + u32 wake_active; + u32 mask_cache; + u32 rtsr_cache; + u32 ftsr_cache; +}; + +struct hwspinlock; + +struct stm32_exti_host_data { + void *base; + struct stm32_exti_chip_data *chips_data; + const struct stm32_exti_drv_data *drv_data; + struct hwspinlock *hwlock; +}; + +struct meson_gpio_irq_controller; + +struct irq_ctl_ops { + void (*gpio_irq_sel_pin)(struct meson_gpio_irq_controller *, unsigned int, long unsigned int); + void (*gpio_irq_init)(struct meson_gpio_irq_controller *); + int (*gpio_irq_set_type)(struct meson_gpio_irq_controller *, unsigned int, u32 *); +}; + +struct meson_gpio_irq_params; + +struct meson_gpio_irq_controller { + const struct meson_gpio_irq_params *params; + void *base; + u32 channel_irqs[64]; + long unsigned int channel_map[2]; + spinlock_t lock; +}; + +struct meson_gpio_irq_params { + unsigned int nr_hwirq; + unsigned int nr_channels; + bool support_edge_both; + unsigned int edge_both_offset; + unsigned int edge_single_offset; + unsigned int pol_low_offset; + unsigned int pin_sel_mask; + struct irq_ctl_ops ops; +}; + +struct irqsteer_data { + void *regs; + struct clk *ipg_clk; + int irq[8]; + int irq_count; + raw_spinlock_t lock; + int reg_num; + int channel; + struct irq_domain *domain; + u32 *saved_reg; +}; + +struct intmux_irqchip_data { + u32 saved_reg; + int chanidx; + int irq; + struct irq_domain *domain; +}; + +struct intmux_data { + raw_spinlock_t lock; + void *regs; + struct clk *ipg_clk; + int channum; + struct intmux_irqchip_data irqchip_data[0]; +}; + +struct cci_nb_ports { + unsigned int nb_ace; + unsigned int nb_ace_lite; +}; + +enum cci_ace_port_type { + ACE_INVALID_PORT = 0, + ACE_PORT = 1, + ACE_LITE_PORT = 2, +}; + +struct cci_ace_port { + void *base; + long unsigned int phys; + enum cci_ace_port_type type; + struct device_node *dn; +}; + +struct cpu_port { + u64 mpidr; + u32 port; + long: 32; +}; + +struct mbus_dram_window { + u8 cs_index; + u8 mbus_attr; + long: 32; + u64 base; + u64 size; +}; + +struct mbus_dram_target_info { + u8 mbus_dram_target_id; + int num_cs; + struct mbus_dram_window cs[4]; +}; + +struct mvebu_mbus_state; + +struct mvebu_mbus_soc_data { + unsigned int num_wins; + bool has_mbus_bridge; + unsigned int (*win_cfg_offset)(const int); + unsigned int (*win_remap_offset)(const int); + void (*setup_cpu_target)(struct mvebu_mbus_state *); + int (*save_cpu_target)(struct mvebu_mbus_state *, u32 *); + int (*show_cpu_target)(struct mvebu_mbus_state *, struct seq_file *, void *); +}; + +struct mvebu_mbus_win_data { + u32 ctrl; + u32 base; + u32 remap_lo; + u32 remap_hi; +}; + +struct mvebu_mbus_state { + void *mbuswins_base; + void *sdramwins_base; + void *mbusbridge_base; + long: 32; + phys_addr_t sdramwins_phys_base; + struct dentry *debugfs_root; + struct dentry *debugfs_sdram; + struct dentry *debugfs_devs; + long: 32; + struct resource pcie_mem_aperture; + struct resource pcie_io_aperture; + const struct mvebu_mbus_soc_data *soc; + int hw_io_coherency; + u32 mbus_bridge_ctrl; + u32 mbus_bridge_base; + struct mvebu_mbus_win_data wins[20]; +}; + +enum omap3_l3_initiator_id { + OMAP_L3_LCD = 29, + OMAP_L3_SAD2D = 28, + OMAP_L3_IA_MPU_SS_1 = 27, + OMAP_L3_IA_MPU_SS_2 = 26, + OMAP_L3_IA_MPU_SS_3 = 25, + OMAP_L3_IA_MPU_SS_4 = 24, + OMAP_L3_IA_MPU_SS_5 = 23, + OMAP_L3_IA_IVA_SS_1 = 22, + OMAP_L3_IA_IVA_SS_2 = 21, + OMAP_L3_IA_IVA_SS_3 = 20, + OMAP_L3_IA_IVA_SS_DMA_1 = 19, + OMAP_L3_IA_IVA_SS_DMA_2 = 18, + OMAP_L3_IA_IVA_SS_DMA_3 = 17, + OMAP_L3_IA_IVA_SS_DMA_4 = 16, + OMAP_L3_IA_IVA_SS_DMA_5 = 15, + OMAP_L3_IA_IVA_SS_DMA_6 = 14, + OMAP_L3_IA_SGX = 13, + OMAP_L3_IA_CAM_1 = 12, + OMAP_L3_IA_CAM_2 = 11, + OMAP_L3_IA_CAM_3 = 10, + OMAP_L3_IA_DAP = 9, + OMAP_L3_SDMA_WR_1 = 8, + OMAP_L3_SDMA_WR_2 = 7, + OMAP_L3_SDMA_RD_1 = 6, + OMAP_L3_SDMA_RD_2 = 5, + OMAP_L3_SDMA_RD_3 = 4, + OMAP_L3_SDMA_RD_4 = 3, + OMAP_L3_USBOTG = 2, + OMAP_L3_USBHOST = 1, +}; + +enum omap3_l3_code { + OMAP_L3_CODE_NOERROR = 0, + OMAP_L3_CODE_UNSUP_CMD = 1, + OMAP_L3_CODE_ADDR_HOLE = 2, + OMAP_L3_CODE_PROTECT_VIOLATION = 3, + OMAP_L3_CODE_IN_BAND_ERR = 4, + OMAP_L3_CODE_REQ_TOUT_NOT_ACCEPT = 7, + OMAP_L3_CODE_REQ_TOUT_NO_RESP = 8, +}; + +struct omap3_l3 { + struct device *dev; + struct clk *ick; + void *rt; + int debug_irq; + int app_irq; + unsigned int inband: 1; +}; + +struct l3_masters_data { + u32 id; + char *name; +}; + +struct l3_target_data { + u32 offset; + char *name; +}; + +struct l3_flagmux_data { + u32 offset; + struct l3_target_data *l3_targ; + u8 num_targ_data; + u32 mask_app_bits; + u32 mask_dbg_bits; +}; + +struct omap_l3 { + struct device *dev; + void *l3_base[3]; + struct l3_flagmux_data **l3_flagmux; + int num_modules; + struct l3_masters_data *l3_masters; + int num_masters; + u32 mst_addr_mask; + int debug_irq; + int app_irq; +}; + +typedef int (*regmap_hw_write)(void *, const void *, size_t); + +typedef int (*regmap_hw_gather_write)(void *, const void *, size_t, const void *, size_t); + +struct regmap_async; + +typedef int (*regmap_hw_async_write)(void *, const void *, size_t, const void *, size_t, struct regmap_async *); + +typedef int (*regmap_hw_read)(void *, const void *, size_t, void *, size_t); + +typedef int (*regmap_hw_reg_read)(void *, unsigned int, unsigned int *); + +typedef int (*regmap_hw_reg_noinc_read)(void *, unsigned int, void *, size_t); + +typedef int (*regmap_hw_reg_write)(void *, unsigned int, unsigned int); + +typedef int (*regmap_hw_reg_noinc_write)(void *, unsigned int, const void *, size_t); + +typedef int (*regmap_hw_reg_update_bits)(void *, unsigned int, unsigned int, unsigned int); + +typedef struct regmap_async * (*regmap_hw_async_alloc)(); + +typedef void (*regmap_hw_free_context)(void *); + +struct regmap_bus { + bool fast_io; + regmap_hw_write write; + regmap_hw_gather_write gather_write; + regmap_hw_async_write async_write; + regmap_hw_reg_write reg_write; + regmap_hw_reg_noinc_write reg_noinc_write; + regmap_hw_reg_update_bits reg_update_bits; + regmap_hw_read read; + regmap_hw_reg_read reg_read; + regmap_hw_reg_noinc_read reg_noinc_read; + regmap_hw_free_context free_context; + regmap_hw_async_alloc async_alloc; + u8 read_flag_mask; + enum regmap_endian reg_format_endian_default; + enum regmap_endian val_format_endian_default; + size_t max_raw_read; + size_t max_raw_write; + bool free_on_exit; +}; + +struct sunxi_rsb; + +struct sunxi_rsb_device { + struct device dev; + struct sunxi_rsb *rsb; + int irq; + u8 rtaddr; + u16 hwaddr; + long: 32; +}; + +struct sunxi_rsb { + struct device *dev; + void *regs; + struct clk *clk; + struct reset_control *rstc; + struct completion complete; + struct mutex lock; + unsigned int status; + u32 clk_freq; +}; + +struct sunxi_rsb_driver { + struct device_driver driver; + int (*probe)(struct sunxi_rsb_device *); + void (*remove)(struct sunxi_rsb_device *); +}; + +struct sunxi_rsb_addr_map { + u16 hwaddr; + u8 rtaddr; +}; + +struct sunxi_rsb_ctx { + struct sunxi_rsb_device *rdev; + int size; +}; + +struct clk_lookup { + struct list_head node; + const char *dev_id; + const char *con_id; + struct clk *clk; + struct clk_hw *clk_hw; +}; + +enum sysc_soc { + SOC_UNKNOWN = 0, + SOC_2420 = 1, + SOC_2430 = 2, + SOC_3430 = 3, + SOC_3630 = 4, + SOC_4430 = 5, + SOC_4460 = 6, + SOC_4470 = 7, + SOC_5430 = 8, + SOC_AM3 = 9, + SOC_AM4 = 10, + SOC_DRA7 = 11, +}; + +struct sysc_address { + long unsigned int base; + struct list_head node; +}; + +struct sysc; + +struct sysc_module { + struct sysc *ddata; + struct list_head node; +}; + +struct sysc { + struct device *dev; + long: 32; + u64 module_pa; + u32 module_size; + void *module_va; + int offsets[3]; + struct ti_sysc_module_data *mdata; + struct clk **clocks; + const char **clock_roles; + int nr_clocks; + struct reset_control *rsts; + const char *legacy_mode; + const struct sysc_capabilities *cap; + struct sysc_config cfg; + struct ti_sysc_cookie cookie; + const char *name; + u32 revision; + u32 sysconfig; + unsigned int reserved: 1; + unsigned int enabled: 1; + unsigned int needs_resume: 1; + unsigned int child_needs_resume: 1; + struct delayed_work idle_work; + void (*pre_reset_quirk)(struct sysc *); + void (*post_reset_quirk)(struct sysc *); + void (*reset_done_quirk)(struct sysc *); + void (*module_enable_quirk)(struct sysc *); + void (*module_disable_quirk)(struct sysc *); + void (*module_unlock_quirk)(struct sysc *); + void (*module_lock_quirk)(struct sysc *); +}; + +struct sysc_soc_info { + long unsigned int general_purpose: 1; + enum sysc_soc soc; + struct mutex list_lock; + struct list_head disabled_modules; + struct list_head restored_modules; + struct notifier_block nb; +}; + +enum sysc_clocks { + SYSC_FCK = 0, + SYSC_ICK = 1, + SYSC_OPTFCK0 = 2, + SYSC_OPTFCK1 = 3, + SYSC_OPTFCK2 = 4, + SYSC_OPTFCK3 = 5, + SYSC_OPTFCK4 = 6, + SYSC_OPTFCK5 = 7, + SYSC_OPTFCK6 = 8, + SYSC_OPTFCK7 = 9, + SYSC_MAX_CLOCKS = 10, +}; + +struct sysc_revision_quirk { + const char *name; + u32 base; + int rev_offset; + int sysc_offset; + int syss_offset; + u32 revision; + u32 revision_mask; + u32 quirks; +}; + +struct sysc_dts_quirk { + const char *name; + u32 mask; +}; + +struct vexpress_syscfg { + struct device *dev; + void *base; + struct list_head funcs; +}; + +struct vexpress_syscfg_func { + struct list_head list; + struct vexpress_syscfg *syscfg; + struct regmap *regmap; + int num_templates; + u32 template[0]; +}; + +struct vexpress_config_bridge_ops { + struct regmap * (*regmap_init)(struct device *, void *); + void (*regmap_exit)(struct regmap *, void *); +}; + +struct vexpress_config_bridge { + struct vexpress_config_bridge_ops *ops; + void *context; +}; + +struct phy_configure_opts_dp { + unsigned int link_rate; + unsigned int lanes; + unsigned int voltage[4]; + unsigned int pre[4]; + u8 ssc: 1; + u8 set_rate: 1; + u8 set_lanes: 1; + u8 set_voltages: 1; +}; + +struct phy_configure_opts_lvds { + unsigned int bits_per_lane_and_dclk_cycle; + long unsigned int differential_clk_rate; + unsigned int lanes; + bool is_slave; +}; + +struct phy_configure_opts_mipi_dphy { + unsigned int clk_miss; + unsigned int clk_post; + unsigned int clk_pre; + unsigned int clk_prepare; + unsigned int clk_settle; + unsigned int clk_term_en; + unsigned int clk_trail; + unsigned int clk_zero; + unsigned int d_term_en; + unsigned int eot; + unsigned int hs_exit; + unsigned int hs_prepare; + unsigned int hs_settle; + unsigned int hs_skip; + unsigned int hs_trail; + unsigned int hs_zero; + unsigned int init; + unsigned int lpx; + unsigned int ta_get; + unsigned int ta_go; + unsigned int ta_sure; + unsigned int wakeup; + long unsigned int hs_clk_rate; + long unsigned int lp_clk_rate; + unsigned char lanes; +}; + +enum phy_mode { + PHY_MODE_INVALID = 0, + PHY_MODE_USB_HOST = 1, + PHY_MODE_USB_HOST_LS = 2, + PHY_MODE_USB_HOST_FS = 3, + PHY_MODE_USB_HOST_HS = 4, + PHY_MODE_USB_HOST_SS = 5, + PHY_MODE_USB_DEVICE = 6, + PHY_MODE_USB_DEVICE_LS = 7, + PHY_MODE_USB_DEVICE_FS = 8, + PHY_MODE_USB_DEVICE_HS = 9, + PHY_MODE_USB_DEVICE_SS = 10, + PHY_MODE_USB_OTG = 11, + PHY_MODE_UFS_HS_A = 12, + PHY_MODE_UFS_HS_B = 13, + PHY_MODE_PCIE = 14, + PHY_MODE_ETHERNET = 15, + PHY_MODE_MIPI_DPHY = 16, + PHY_MODE_SATA = 17, + PHY_MODE_LVDS = 18, + PHY_MODE_DP = 19, +}; + +enum phy_media { + PHY_MEDIA_DEFAULT = 0, + PHY_MEDIA_SR = 1, + PHY_MEDIA_DAC = 2, +}; + +union phy_configure_opts { + struct phy_configure_opts_mipi_dphy mipi_dphy; + struct phy_configure_opts_dp dp; + struct phy_configure_opts_lvds lvds; +}; + +struct phy; + +struct phy_ops { + int (*init)(struct phy *); + int (*exit)(struct phy *); + int (*power_on)(struct phy *); + int (*power_off)(struct phy *); + int (*set_mode)(struct phy *, enum phy_mode, int); + int (*set_media)(struct phy *, enum phy_media); + int (*set_speed)(struct phy *, int); + int (*configure)(struct phy *, union phy_configure_opts *); + int (*validate)(struct phy *, enum phy_mode, int, union phy_configure_opts *); + int (*reset)(struct phy *); + int (*calibrate)(struct phy *); + void (*release)(struct phy *); + struct module *owner; +}; + +struct phy_attrs { + u32 bus_width; + u32 max_link_rate; + enum phy_mode mode; +}; + +struct regulator; + +struct phy { + struct device dev; + int id; + const struct phy_ops *ops; + struct mutex mutex; + int init_count; + int power_count; + struct phy_attrs attrs; + struct regulator *pwr; + long: 32; +}; + +struct phy_provider { + struct device *dev; + struct device_node *children; + struct module *owner; + struct list_head list; + struct phy * (*of_xlate)(struct device *, struct of_phandle_args *); +}; + +struct phy_lookup { + struct list_head node; + const char *dev_id; + const char *con_id; + struct phy *phy; +}; + +enum usb_dr_mode { + USB_DR_MODE_UNKNOWN = 0, + USB_DR_MODE_HOST = 1, + USB_DR_MODE_PERIPHERAL = 2, + USB_DR_MODE_OTG = 3, +}; + +struct phy_meson8b_usb2_match_data { + bool host_enable_aca; +}; + +struct phy_meson8b_usb2_priv { + struct regmap *regmap; + enum usb_dr_mode dr_mode; + struct clk *clk_usb_general; + struct clk *clk_usb; + struct reset_control *reset; + const struct phy_meson8b_usb2_match_data *match; +}; + +struct phy_meson_gxl_usb2_priv { + struct regmap *regmap; + enum phy_mode mode; + int is_enabled; + struct clk *clk; + struct reset_control *reset; +}; + +enum meson_soc_id { + MESON_SOC_G12A = 0, + MESON_SOC_A1 = 1, +}; + +struct phy_meson_g12a_usb2_priv { + struct device *dev; + struct regmap *regmap; + struct clk *clk; + struct reset_control *reset; + int soc_id; +}; + +struct phy_g12a_usb3_pcie_priv { + struct regmap *regmap; + struct regmap *regmap_cr; + struct clk *clk_ref; + struct reset_control *reset; + struct phy *phy; + unsigned int mode; +}; + +struct phy_g12a_mipi_dphy_analog_priv { + struct phy *phy; + struct regmap *regmap; + struct phy_configure_opts_mipi_dphy config; +}; + +struct phy_axg_pcie_priv { + struct phy *phy; + struct phy *analog; + struct regmap *regmap; + struct reset_control *reset; +}; + +struct phy_axg_mipi_pcie_analog_priv { + struct phy *phy; + struct regmap *regmap; + bool dsi_configured; + bool dsi_enabled; + bool powered; + struct phy_configure_opts_mipi_dphy config; +}; + +struct phy_meson_axg_mipi_dphy_priv { + struct device *dev; + struct regmap *regmap; + struct clk *clk; + struct reset_control *reset; + struct phy *analog; + struct phy_configure_opts_mipi_dphy config; +}; + +struct armada375_cluster_phy { + struct phy *phy; + void *reg; + bool use_usb3; + int phy_provided; +}; + +struct mvebu_a3700_comphy_conf { + unsigned int lane; + enum phy_mode mode; + int submode; +}; + +struct mvebu_a3700_comphy_priv { + void *comphy_regs; + void *lane0_phy_regs; + void *lane1_phy_regs; + void *lane2_phy_indirect; + spinlock_t lock; + bool xtal_is_40m; +}; + +struct mvebu_a3700_comphy_lane { + struct mvebu_a3700_comphy_priv *priv; + struct device *dev; + unsigned int id; + enum phy_mode mode; + int submode; + bool invert_tx; + bool invert_rx; +}; + +struct gbe_phy_init_data_fix { + u16 addr; + u16 value; +}; + +struct mvebu_a3700_utmi_caps { + int usb32; + const struct phy_ops *ops; +}; + +struct mvebu_a3700_utmi { + void *regs; + struct regmap *usb_misc; + const struct mvebu_a3700_utmi_caps *caps; + struct phy *phy; +}; + +struct priv { + struct clk *clk; + void *base; +}; + +enum omap_control_phy_type { + OMAP_CTRL_TYPE_OTGHS = 1, + OMAP_CTRL_TYPE_USB2 = 2, + OMAP_CTRL_TYPE_PIPE3 = 3, + OMAP_CTRL_TYPE_PCIE = 4, + OMAP_CTRL_TYPE_DRA7USB2 = 5, + OMAP_CTRL_TYPE_AM437USB2 = 6, +}; + +struct omap_control_phy { + struct device *dev; + u32 *otghs_control; + u32 *power; + u32 *power_aux; + u32 *pcie_pcs; + struct clk *sys_clk; + enum omap_control_phy_type type; +}; + +enum omap_control_usb_mode { + USB_MODE_UNDEFINED = 0, + USB_MODE_HOST = 1, + USB_MODE_DEVICE = 2, + USB_MODE_DISCONNECT = 3, +}; + +enum pipe3_mode { + PIPE3_MODE_PCIE = 1, + PIPE3_MODE_SATA = 2, + PIPE3_MODE_USBSS = 3, +}; + +struct pipe3_dpll_params { + u16 m; + u8 n; + u8 freq: 3; + u8 sd; + u32 mf; +}; + +struct pipe3_dpll_map { + long unsigned int rate; + struct pipe3_dpll_params params; +}; + +struct pipe3_settings { + u8 ana_interface; + u8 ana_losd; + u8 dig_fastlock; + u8 dig_lbw; + u8 dig_stepcnt; + u8 dig_stl; + u8 dig_thr; + u8 dig_thr_mode; + u8 dig_2ndo_sdm_mode; + u8 dig_hs_rate; + u8 dig_ovrd_hs_rate; + u8 dll_trim_sel; + u8 dll_phint_rate; + u8 eq_lev; + u8 eq_ftc; + u8 eq_ctl; + u8 eq_ovrd_lev; + u8 eq_ovrd_ftc; +}; + +struct ti_pipe3 { + void *pll_ctrl_base; + void *phy_rx; + void *phy_tx; + struct device *dev; + struct device *control_dev; + struct clk *wkupclk; + struct clk *sys_clk; + struct clk *refclk; + struct clk *div_clk; + struct pipe3_dpll_map *dpll_map; + struct regmap *phy_power_syscon; + struct regmap *pcs_syscon; + struct regmap *dpll_reset_syscon; + unsigned int dpll_reset_reg; + unsigned int power_reg; + unsigned int pcie_pcs_reg; + bool sata_refclk_enabled; + enum pipe3_mode mode; + struct pipe3_settings settings; +}; + +struct pipe3_data { + enum pipe3_mode mode; + struct pipe3_dpll_map *dpll_map; + struct pipe3_settings settings; +}; + +struct pinctrl; + +struct pinctrl_state; + +struct dev_pin_info { + struct pinctrl *p; + struct pinctrl_state *default_state; + struct pinctrl_state *init_state; + struct pinctrl_state *sleep_state; + struct pinctrl_state *idle_state; +}; + +struct pinctrl { + struct list_head node; + struct device *dev; + struct list_head states; + struct pinctrl_state *state; + struct list_head dt_maps; + struct kref users; +}; + +struct pinctrl_state { + struct list_head node; + const char *name; + struct list_head settings; +}; + +enum pinctrl_map_type { + PIN_MAP_TYPE_INVALID = 0, + PIN_MAP_TYPE_DUMMY_STATE = 1, + PIN_MAP_TYPE_MUX_GROUP = 2, + PIN_MAP_TYPE_CONFIGS_PIN = 3, + PIN_MAP_TYPE_CONFIGS_GROUP = 4, +}; + +struct pinctrl_map_mux { + const char *group; + const char *function; +}; + +struct pinctrl_map_configs { + const char *group_or_pin; + long unsigned int *configs; + unsigned int num_configs; +}; + +struct pinctrl_map { + const char *dev_name; + const char *name; + enum pinctrl_map_type type; + const char *ctrl_dev_name; + union { + struct pinctrl_map_mux mux; + struct pinctrl_map_configs configs; + } data; +}; + +struct pinctrl_pin_desc { + unsigned int number; + const char *name; + void *drv_data; +}; + +struct gpio_chip; + +struct pinctrl_gpio_range { + struct list_head node; + const char *name; + unsigned int id; + unsigned int base; + unsigned int pin_base; + unsigned int npins; + const unsigned int *pins; + struct gpio_chip *gc; +}; + +union gpio_irq_fwspec; + +struct gpio_irq_chip { + struct irq_chip *chip; + struct irq_domain *domain; + const struct irq_domain_ops *domain_ops; + struct fwnode_handle *fwnode; + struct irq_domain *parent_domain; + int (*child_to_parent_hwirq)(struct gpio_chip *, unsigned int, unsigned int, unsigned int *, unsigned int *); + int (*populate_parent_alloc_arg)(struct gpio_chip *, union gpio_irq_fwspec *, unsigned int, unsigned int); + unsigned int (*child_offset_to_irq)(struct gpio_chip *, unsigned int); + struct irq_domain_ops child_irq_domain_ops; + irq_flow_handler_t handler; + unsigned int default_type; + struct lock_class_key *lock_key; + struct lock_class_key *request_key; + irq_flow_handler_t parent_handler; + union { + void *parent_handler_data; + void **parent_handler_data_array; + }; + unsigned int num_parents; + unsigned int *parents; + unsigned int *map; + bool threaded; + bool per_parent_data; + bool initialized; + int (*init_hw)(struct gpio_chip *); + void (*init_valid_mask)(struct gpio_chip *, long unsigned int *, unsigned int); + long unsigned int *valid_mask; + unsigned int first; + void (*irq_enable)(struct irq_data *); + void (*irq_disable)(struct irq_data *); + void (*irq_unmask)(struct irq_data *); + void (*irq_mask)(struct irq_data *); +}; + +struct gpio_device; + +struct gpio_chip { + const char *label; + struct gpio_device *gpiodev; + struct device *parent; + struct fwnode_handle *fwnode; + struct module *owner; + int (*request)(struct gpio_chip *, unsigned int); + void (*free)(struct gpio_chip *, unsigned int); + int (*get_direction)(struct gpio_chip *, unsigned int); + int (*direction_input)(struct gpio_chip *, unsigned int); + int (*direction_output)(struct gpio_chip *, unsigned int, int); + int (*get)(struct gpio_chip *, unsigned int); + int (*get_multiple)(struct gpio_chip *, long unsigned int *, long unsigned int *); + void (*set)(struct gpio_chip *, unsigned int, int); + void (*set_multiple)(struct gpio_chip *, long unsigned int *, long unsigned int *); + int (*set_config)(struct gpio_chip *, unsigned int, long unsigned int); + int (*to_irq)(struct gpio_chip *, unsigned int); + void (*dbg_show)(struct seq_file *, struct gpio_chip *); + int (*init_valid_mask)(struct gpio_chip *, long unsigned int *, unsigned int); + int (*add_pin_ranges)(struct gpio_chip *); + int (*en_hw_timestamp)(struct gpio_chip *, u32, long unsigned int); + int (*dis_hw_timestamp)(struct gpio_chip *, u32, long unsigned int); + int base; + u16 ngpio; + u16 offset; + const char * const *names; + bool can_sleep; + long unsigned int (*read_reg)(void *); + void (*write_reg)(void *, long unsigned int); + bool be_bits; + void *reg_dat; + void *reg_set; + void *reg_clr; + void *reg_dir_out; + void *reg_dir_in; + bool bgpio_dir_unreadable; + int bgpio_bits; + raw_spinlock_t bgpio_lock; + long unsigned int bgpio_data; + long unsigned int bgpio_dir; + struct gpio_irq_chip irq; + long unsigned int *valid_mask; + struct device_node *of_node; + unsigned int of_gpio_n_cells; + int (*of_xlate)(struct gpio_chip *, const struct of_phandle_args *, u32 *); + int (*of_gpio_ranges_fallback)(struct gpio_chip *, struct device_node *); +}; + +struct pinctrl_dev; + +struct pinctrl_ops { + int (*get_groups_count)(struct pinctrl_dev *); + const char * (*get_group_name)(struct pinctrl_dev *, unsigned int); + int (*get_group_pins)(struct pinctrl_dev *, unsigned int, const unsigned int **, unsigned int *); + void (*pin_dbg_show)(struct pinctrl_dev *, struct seq_file *, unsigned int); + int (*dt_node_to_map)(struct pinctrl_dev *, struct device_node *, struct pinctrl_map **, unsigned int *); + void (*dt_free_map)(struct pinctrl_dev *, struct pinctrl_map *, unsigned int); +}; + +struct pinctrl_desc; + +struct pinctrl_dev { + struct list_head node; + struct pinctrl_desc *desc; + struct xarray pin_desc_tree; + struct xarray pin_group_tree; + unsigned int num_groups; + struct xarray pin_function_tree; + unsigned int num_functions; + struct list_head gpio_ranges; + struct device *dev; + struct module *owner; + void *driver_data; + struct pinctrl *p; + struct pinctrl_state *hog_default; + struct pinctrl_state *hog_sleep; + struct mutex mutex; + struct dentry *device_root; +}; + +struct pinmux_ops; + +struct pinconf_ops; + +struct pinconf_generic_params; + +struct pin_config_item; + +struct pinctrl_desc { + const char *name; + const struct pinctrl_pin_desc *pins; + unsigned int npins; + const struct pinctrl_ops *pctlops; + const struct pinmux_ops *pmxops; + const struct pinconf_ops *confops; + struct module *owner; + unsigned int num_custom_params; + const struct pinconf_generic_params *custom_params; + const struct pin_config_item *custom_conf_items; + bool link_consumers; +}; + +struct pinmux_ops { + int (*request)(struct pinctrl_dev *, unsigned int); + int (*free)(struct pinctrl_dev *, unsigned int); + int (*get_functions_count)(struct pinctrl_dev *); + const char * (*get_function_name)(struct pinctrl_dev *, unsigned int); + int (*get_function_groups)(struct pinctrl_dev *, unsigned int, const char * const **, unsigned int *); + int (*set_mux)(struct pinctrl_dev *, unsigned int, unsigned int); + int (*gpio_request_enable)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int); + void (*gpio_disable_free)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int); + int (*gpio_set_direction)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int, bool); + bool strict; +}; + +struct pinconf_ops { + bool is_generic; + int (*pin_config_get)(struct pinctrl_dev *, unsigned int, long unsigned int *); + int (*pin_config_set)(struct pinctrl_dev *, unsigned int, long unsigned int *, unsigned int); + int (*pin_config_group_get)(struct pinctrl_dev *, unsigned int, long unsigned int *); + int (*pin_config_group_set)(struct pinctrl_dev *, unsigned int, long unsigned int *, unsigned int); + void (*pin_config_dbg_show)(struct pinctrl_dev *, struct seq_file *, unsigned int); + void (*pin_config_group_dbg_show)(struct pinctrl_dev *, struct seq_file *, unsigned int); + void (*pin_config_config_dbg_show)(struct pinctrl_dev *, struct seq_file *, long unsigned int); +}; + +enum pin_config_param { + PIN_CONFIG_BIAS_BUS_HOLD = 0, + PIN_CONFIG_BIAS_DISABLE = 1, + PIN_CONFIG_BIAS_HIGH_IMPEDANCE = 2, + PIN_CONFIG_BIAS_PULL_DOWN = 3, + PIN_CONFIG_BIAS_PULL_PIN_DEFAULT = 4, + PIN_CONFIG_BIAS_PULL_UP = 5, + PIN_CONFIG_DRIVE_OPEN_DRAIN = 6, + PIN_CONFIG_DRIVE_OPEN_SOURCE = 7, + PIN_CONFIG_DRIVE_PUSH_PULL = 8, + PIN_CONFIG_DRIVE_STRENGTH = 9, + PIN_CONFIG_DRIVE_STRENGTH_UA = 10, + PIN_CONFIG_INPUT_DEBOUNCE = 11, + PIN_CONFIG_INPUT_ENABLE = 12, + PIN_CONFIG_INPUT_SCHMITT = 13, + PIN_CONFIG_INPUT_SCHMITT_ENABLE = 14, + PIN_CONFIG_MODE_LOW_POWER = 15, + PIN_CONFIG_MODE_PWM = 16, + PIN_CONFIG_OUTPUT = 17, + PIN_CONFIG_OUTPUT_ENABLE = 18, + PIN_CONFIG_OUTPUT_IMPEDANCE_OHMS = 19, + PIN_CONFIG_PERSIST_STATE = 20, + PIN_CONFIG_POWER_SOURCE = 21, + PIN_CONFIG_SKEW_DELAY = 22, + PIN_CONFIG_SLEEP_HARDWARE_STATE = 23, + PIN_CONFIG_SLEW_RATE = 24, + PIN_CONFIG_END = 127, + PIN_CONFIG_MAX = 255, +}; + +struct pinconf_generic_params { + const char * const property; + enum pin_config_param param; + u32 default_value; +}; + +struct pin_config_item { + const enum pin_config_param param; + const char * const display; + const char * const format; + bool has_arg; +}; + +union gpio_irq_fwspec { + struct irq_fwspec fwspec; + msi_alloc_info_t msiinfo; +}; + +struct gpio_device { + struct device dev; + struct cdev chrdev; + int id; + struct device *mockdev; + struct module *owner; + struct gpio_chip *chip; + struct gpio_desc *descs; + int base; + u16 ngpio; + const char *label; + void *data; + struct list_head list; + struct blocking_notifier_head notifier; + struct rw_semaphore sem; + struct list_head pin_ranges; + long: 32; +}; + +struct gpio_desc { + struct gpio_device *gdev; + long unsigned int flags; + const char *label; + const char *name; + unsigned int debounce_period_us; +}; + +struct pinctrl_setting_mux { + unsigned int group; + unsigned int func; +}; + +struct pinctrl_setting_configs { + unsigned int group_or_pin; + long unsigned int *configs; + unsigned int num_configs; +}; + +struct pinctrl_setting { + struct list_head node; + enum pinctrl_map_type type; + struct pinctrl_dev *pctldev; + const char *dev_name; + union { + struct pinctrl_setting_mux mux; + struct pinctrl_setting_configs configs; + } data; +}; + +struct pin_desc { + struct pinctrl_dev *pctldev; + const char *name; + bool dynamic_name; + void *drv_data; + unsigned int mux_usecount; + const char *mux_owner; + const struct pinctrl_setting_mux *mux_setting; + const char *gpio_owner; +}; + +struct pinctrl_maps { + struct list_head node; + const struct pinctrl_map *maps; + unsigned int num_maps; +}; + +struct group_desc { + const char *name; + int *pins; + int num_pins; + void *data; +}; + +struct pctldev; + +struct function_desc { + const char *name; + const char * const *group_names; + int num_group_names; + void *data; +}; + +struct pinctrl_dt_map { + struct list_head node; + struct pinctrl_dev *pctldev; + struct pinctrl_map *map; + unsigned int num_maps; +}; + +struct regmap_irq_chip_data; + +struct as3722 { + struct device *dev; + struct regmap *regmap; + int chip_irq; + long unsigned int irq_flags; + bool en_intern_int_pullup; + bool en_intern_i2c_pullup; + bool en_ac_ok_pwr_on; + struct regmap_irq_chip_data *irq_data; +}; + +struct as3722_pin_function { + const char *name; + const char * const *groups; + unsigned int ngroups; + int mux_option; +}; + +struct as3722_gpio_pin_control { + unsigned int mode_prop; + int io_function; +}; + +struct as3722_pingroup { + const char *name; + const unsigned int pins[1]; + unsigned int npins; +}; + +struct as3722_pctrl_info { + struct device *dev; + struct pinctrl_dev *pctl; + struct as3722 *as3722; + struct gpio_chip gpio_chip; + int pins_current_opt[8]; + const struct as3722_pin_function *functions; + unsigned int num_functions; + const struct as3722_pingroup *pin_groups; + int num_pin_groups; + const struct pinctrl_pin_desc *pins; + unsigned int num_pins; + struct as3722_gpio_pin_control gpio_control[8]; +}; + +enum as3722_pinmux_option { + AS3722_PINMUX_GPIO = 0, + AS3722_PINMUX_INTERRUPT_OUT = 1, + AS3722_PINMUX_VSUB_VBAT_UNDEB_LOW_OUT = 2, + AS3722_PINMUX_GPIO_INTERRUPT = 3, + AS3722_PINMUX_PWM_INPUT = 4, + AS3722_PINMUX_VOLTAGE_IN_STBY = 5, + AS3722_PINMUX_OC_PG_SD0 = 6, + AS3722_PINMUX_PG_OUT = 7, + AS3722_PINMUX_CLK32K_OUT = 8, + AS3722_PINMUX_WATCHDOG_INPUT = 9, + AS3722_PINMUX_SOFT_RESET_IN = 11, + AS3722_PINMUX_PWM_OUTPUT = 12, + AS3722_PINMUX_VSUB_VBAT_LOW_DEB_OUT = 13, + AS3722_PINMUX_OC_PG_SD6 = 14, +}; + +struct extcon_dev; + +struct regulator_dev; + +struct regulator_ops { + int (*list_voltage)(struct regulator_dev *, unsigned int); + int (*set_voltage)(struct regulator_dev *, int, int, unsigned int *); + int (*map_voltage)(struct regulator_dev *, int, int); + int (*set_voltage_sel)(struct regulator_dev *, unsigned int); + int (*get_voltage)(struct regulator_dev *); + int (*get_voltage_sel)(struct regulator_dev *); + int (*set_current_limit)(struct regulator_dev *, int, int); + int (*get_current_limit)(struct regulator_dev *); + int (*set_input_current_limit)(struct regulator_dev *, int); + int (*set_over_current_protection)(struct regulator_dev *, int, int, bool); + int (*set_over_voltage_protection)(struct regulator_dev *, int, int, bool); + int (*set_under_voltage_protection)(struct regulator_dev *, int, int, bool); + int (*set_thermal_protection)(struct regulator_dev *, int, int, bool); + int (*set_active_discharge)(struct regulator_dev *, bool); + int (*enable)(struct regulator_dev *); + int (*disable)(struct regulator_dev *); + int (*is_enabled)(struct regulator_dev *); + int (*set_mode)(struct regulator_dev *, unsigned int); + unsigned int (*get_mode)(struct regulator_dev *); + int (*get_error_flags)(struct regulator_dev *, unsigned int *); + int (*enable_time)(struct regulator_dev *); + int (*set_ramp_delay)(struct regulator_dev *, int); + int (*set_voltage_time)(struct regulator_dev *, int, int); + int (*set_voltage_time_sel)(struct regulator_dev *, unsigned int, unsigned int); + int (*set_soft_start)(struct regulator_dev *); + int (*get_status)(struct regulator_dev *); + unsigned int (*get_optimum_mode)(struct regulator_dev *, int, int, int); + int (*set_load)(struct regulator_dev *, int); + int (*set_bypass)(struct regulator_dev *, bool); + int (*get_bypass)(struct regulator_dev *, bool *); + int (*set_suspend_voltage)(struct regulator_dev *, int); + int (*set_suspend_enable)(struct regulator_dev *); + int (*set_suspend_disable)(struct regulator_dev *); + int (*set_suspend_mode)(struct regulator_dev *, unsigned int); + int (*resume)(struct regulator_dev *); + int (*set_pull_down)(struct regulator_dev *); +}; + +struct regulator_coupler; + +struct coupling_desc { + struct regulator_dev **coupled_rdevs; + struct regulator_coupler *coupler; + int n_resolved; + int n_coupled; +}; + +struct regulator_desc; + +struct regulation_constraints; + +struct regulator_enable_gpio; + +struct regulator_dev { + const struct regulator_desc *desc; + int exclusive; + u32 use_count; + u32 open_count; + u32 bypass_count; + struct list_head list; + struct list_head consumer_list; + struct coupling_desc coupling_desc; + struct blocking_notifier_head notifier; + struct ww_mutex mutex; + struct task_struct *mutex_owner; + int ref_cnt; + struct module *owner; + long: 32; + struct device dev; + struct regulation_constraints *constraints; + struct regulator *supply; + const char *supply_name; + struct regmap *regmap; + struct delayed_work disable_work; + void *reg_data; + struct dentry *debugfs; + struct regulator_enable_gpio *ena_pin; + unsigned int ena_gpio_state: 1; + unsigned int is_switch: 1; + long: 32; + ktime_t last_off; + int cached_err; + bool use_cached_err; + spinlock_t err_lock; + long: 32; +}; + +enum regulator_type { + REGULATOR_VOLTAGE = 0, + REGULATOR_CURRENT = 1, +}; + +struct regulator_config; + +struct regulator_desc { + const char *name; + const char *supply_name; + const char *of_match; + bool of_match_full_name; + const char *regulators_node; + int (*of_parse_cb)(struct device_node *, const struct regulator_desc *, struct regulator_config *); + int id; + unsigned int continuous_voltage_range: 1; + unsigned int n_voltages; + unsigned int n_current_limits; + const struct regulator_ops *ops; + int irq; + enum regulator_type type; + struct module *owner; + unsigned int min_uV; + unsigned int uV_step; + unsigned int linear_min_sel; + int fixed_uV; + unsigned int ramp_delay; + int min_dropout_uV; + const struct linear_range *linear_ranges; + const unsigned int *linear_range_selectors; + int n_linear_ranges; + const unsigned int *volt_table; + const unsigned int *curr_table; + unsigned int vsel_range_reg; + unsigned int vsel_range_mask; + unsigned int vsel_reg; + unsigned int vsel_mask; + unsigned int vsel_step; + unsigned int csel_reg; + unsigned int csel_mask; + unsigned int apply_reg; + unsigned int apply_bit; + unsigned int enable_reg; + unsigned int enable_mask; + unsigned int enable_val; + unsigned int disable_val; + bool enable_is_inverted; + unsigned int bypass_reg; + unsigned int bypass_mask; + unsigned int bypass_val_on; + unsigned int bypass_val_off; + unsigned int active_discharge_on; + unsigned int active_discharge_off; + unsigned int active_discharge_mask; + unsigned int active_discharge_reg; + unsigned int soft_start_reg; + unsigned int soft_start_mask; + unsigned int soft_start_val_on; + unsigned int pull_down_reg; + unsigned int pull_down_mask; + unsigned int pull_down_val_on; + unsigned int ramp_reg; + unsigned int ramp_mask; + const unsigned int *ramp_delay_table; + unsigned int n_ramp_values; + unsigned int enable_time; + unsigned int off_on_delay; + unsigned int poll_enabled_time; + unsigned int (*of_map_mode)(unsigned int); +}; + +struct regulator_init_data; + +struct regulator_config { + struct device *dev; + const struct regulator_init_data *init_data; + void *driver_data; + struct device_node *of_node; + struct regmap *regmap; + struct gpio_desc *ena_gpiod; +}; + +struct regulator_state { + int uV; + int min_uV; + int max_uV; + unsigned int mode; + int enabled; + bool changeable; +}; + +struct notification_limit { + int prot; + int err; + int warn; +}; + +struct regulation_constraints { + const char *name; + int min_uV; + int max_uV; + int uV_offset; + int min_uA; + int max_uA; + int ilim_uA; + int system_load; + u32 *max_spread; + int max_uV_step; + unsigned int valid_modes_mask; + unsigned int valid_ops_mask; + int input_uV; + struct regulator_state state_disk; + struct regulator_state state_mem; + struct regulator_state state_standby; + struct notification_limit over_curr_limits; + struct notification_limit over_voltage_limits; + struct notification_limit under_voltage_limits; + struct notification_limit temp_limits; + suspend_state_t initial_state; + unsigned int initial_mode; + unsigned int ramp_delay; + unsigned int settling_time; + unsigned int settling_time_up; + unsigned int settling_time_down; + unsigned int enable_time; + unsigned int active_discharge; + unsigned int always_on: 1; + unsigned int boot_on: 1; + unsigned int apply_uV: 1; + unsigned int ramp_disable: 1; + unsigned int soft_start: 1; + unsigned int pull_down: 1; + unsigned int over_current_protection: 1; + unsigned int over_current_detection: 1; + unsigned int over_voltage_detection: 1; + unsigned int under_voltage_detection: 1; + unsigned int over_temp_detection: 1; +}; + +struct regulator_consumer_supply; + +struct regulator_init_data { + const char *supply_regulator; + struct regulation_constraints constraints; + int num_consumer_supplies; + struct regulator_consumer_supply *consumer_supplies; + int (*regulator_init)(void *); + void *driver_data; +}; + +enum palmas_usb_state { + PALMAS_USB_STATE_DISCONNECT = 0, + PALMAS_USB_STATE_VBUS = 1, + PALMAS_USB_STATE_ID = 2, +}; + +struct palmas_gpadc; + +struct i2c_client; + +struct palmas_pmic_driver_data; + +struct palmas_pmic; + +struct palmas_resource; + +struct palmas_usb; + +struct palmas { + struct device *dev; + struct i2c_client *i2c_clients[3]; + struct regmap *regmap[3]; + int id; + unsigned int features; + int irq; + u32 irq_mask; + struct mutex irq_lock; + struct regmap_irq_chip_data *irq_data; + struct palmas_pmic_driver_data *pmic_ddata; + struct palmas_pmic *pmic; + struct palmas_gpadc *gpadc; + struct palmas_resource *resource; + struct palmas_usb *usb; + u8 gpio_muxed; + u8 led_muxed; + u8 pwm_muxed; +}; + +struct palmas_regs_info; + +struct of_regulator_match; + +struct palmas_sleep_requestor_info; + +struct palmas_pmic_platform_data; + +struct palmas_pmic_driver_data { + int smps_start; + int smps_end; + int ldo_begin; + int ldo_end; + int max_reg; + bool has_regen3; + struct palmas_regs_info *palmas_regs_info; + struct of_regulator_match *palmas_matches; + struct palmas_sleep_requestor_info *sleep_req_info; + int (*smps_register)(struct palmas_pmic *, struct palmas_pmic_driver_data *, struct palmas_pmic_platform_data *, const char *, struct regulator_config); + int (*ldo_register)(struct palmas_pmic *, struct palmas_pmic_driver_data *, struct palmas_pmic_platform_data *, const char *, struct regulator_config); +}; + +struct palmas_pmic { + struct palmas *palmas; + struct device *dev; + struct regulator_desc desc[27]; + struct mutex mutex; + int smps123; + int smps457; + int smps12; + int range[10]; + unsigned int ramp_delay[10]; + unsigned int current_reg_mode[10]; +}; + +struct palmas_resource { + struct palmas *palmas; + struct device *dev; +}; + +struct palmas_usb { + struct palmas *palmas; + struct device *dev; + struct extcon_dev *edev; + int id_otg_irq; + int id_irq; + int vbus_otg_irq; + int vbus_irq; + int gpio_id_irq; + int gpio_vbus_irq; + struct gpio_desc *id_gpiod; + struct gpio_desc *vbus_gpiod; + long unsigned int sw_debounce_jiffies; + struct delayed_work wq_detectid; + enum palmas_usb_state linkstat; + int wakeup; + bool enable_vbus_detection; + bool enable_id_detection; + bool enable_gpio_id_detection; + bool enable_gpio_vbus_detection; +}; + +struct palmas_sleep_requestor_info { + int id; + int reg_offset; + int bit_pos; +}; + +struct palmas_regs_info { + char *name; + char *sname; + u8 vsel_addr; + u8 ctrl_addr; + u8 tstep_addr; + int sleep_id; +}; + +struct palmas_reg_init; + +struct palmas_pmic_platform_data { + struct regulator_init_data *reg_data[27]; + struct palmas_reg_init *reg_init[27]; + int ldo6_vibrator; + bool enable_ldo8_tracking; +}; + +struct palmas_reg_init { + int warm_reset; + int roof_floor; + int mode_sleep; + u8 vsel; +}; + +enum palmas_regulators { + PALMAS_REG_SMPS12 = 0, + PALMAS_REG_SMPS123 = 1, + PALMAS_REG_SMPS3 = 2, + PALMAS_REG_SMPS45 = 3, + PALMAS_REG_SMPS457 = 4, + PALMAS_REG_SMPS6 = 5, + PALMAS_REG_SMPS7 = 6, + PALMAS_REG_SMPS8 = 7, + PALMAS_REG_SMPS9 = 8, + PALMAS_REG_SMPS10_OUT2 = 9, + PALMAS_REG_SMPS10_OUT1 = 10, + PALMAS_REG_LDO1 = 11, + PALMAS_REG_LDO2 = 12, + PALMAS_REG_LDO3 = 13, + PALMAS_REG_LDO4 = 14, + PALMAS_REG_LDO5 = 15, + PALMAS_REG_LDO6 = 16, + PALMAS_REG_LDO7 = 17, + PALMAS_REG_LDO8 = 18, + PALMAS_REG_LDO9 = 19, + PALMAS_REG_LDOLN = 20, + PALMAS_REG_LDOUSB = 21, + PALMAS_REG_REGEN1 = 22, + PALMAS_REG_REGEN2 = 23, + PALMAS_REG_REGEN3 = 24, + PALMAS_REG_SYSEN1 = 25, + PALMAS_REG_SYSEN2 = 26, + PALMAS_NUM_REGS = 27, +}; + +struct palmas_pin_function { + const char *name; + const char * const *groups; + unsigned int ngroups; +}; + +struct palmas_pingroup; + +struct palmas_pctrl_chip_info { + struct device *dev; + struct pinctrl_dev *pctl; + struct palmas *palmas; + int pins_current_opt[26]; + const struct palmas_pin_function *functions; + unsigned int num_functions; + const struct palmas_pingroup *pin_groups; + int num_pin_groups; + const struct pinctrl_pin_desc *pins; + unsigned int num_pins; +}; + +struct palmas_pin_info; + +struct palmas_pingroup { + const char *name; + const unsigned int pins[1]; + unsigned int npins; + unsigned int mux_reg_base; + unsigned int mux_reg_add; + unsigned int mux_reg_mask; + unsigned int mux_bit_shift; + const struct palmas_pin_info *opt[4]; +}; + +enum palmas_pinmux { + PALMAS_PINMUX_OPTION0 = 0, + PALMAS_PINMUX_OPTION1 = 1, + PALMAS_PINMUX_OPTION2 = 2, + PALMAS_PINMUX_OPTION3 = 3, + PALMAS_PINMUX_GPIO = 4, + PALMAS_PINMUX_LED = 5, + PALMAS_PINMUX_PWM = 6, + PALMAS_PINMUX_REGEN = 7, + PALMAS_PINMUX_SYSEN = 8, + PALMAS_PINMUX_CLK32KGAUDIO = 9, + PALMAS_PINMUX_ID = 10, + PALMAS_PINMUX_VBUS_DET = 11, + PALMAS_PINMUX_CHRG_DET = 12, + PALMAS_PINMUX_VAC = 13, + PALMAS_PINMUX_VACOK = 14, + PALMAS_PINMUX_POWERGOOD = 15, + PALMAS_PINMUX_USB_PSEL = 16, + PALMAS_PINMUX_MSECURE = 17, + PALMAS_PINMUX_PWRHOLD = 18, + PALMAS_PINMUX_INT = 19, + PALMAS_PINMUX_NRESWARM = 20, + PALMAS_PINMUX_SIMRSTO = 21, + PALMAS_PINMUX_SIMRSTI = 22, + PALMAS_PINMUX_LOW_VBAT = 23, + PALMAS_PINMUX_WIRELESS_CHRG1 = 24, + PALMAS_PINMUX_RCM = 25, + PALMAS_PINMUX_PWRDOWN = 26, + PALMAS_PINMUX_GPADC_START = 27, + PALMAS_PINMUX_RESET_IN = 28, + PALMAS_PINMUX_NSLEEP = 29, + PALMAS_PINMUX_ENABLE = 30, + PALMAS_PINMUX_NA = 65535, +}; + +struct palmas_pins_pullup_dn_info { + int pullup_dn_reg_base; + int pullup_dn_reg_add; + int pullup_dn_mask; + int normal_val; + int pull_up_val; + int pull_dn_val; +}; + +struct palmas_pins_od_info { + int od_reg_base; + int od_reg_add; + int od_mask; + int od_enable; + int od_disable; +}; + +struct palmas_pin_info { + enum palmas_pinmux mux_opt; + const struct palmas_pins_pullup_dn_info *pud_info; + const struct palmas_pins_od_info *od_info; +}; + +struct palmas_pinctrl_data { + const struct palmas_pingroup *pin_groups; + int num_pin_groups; +}; + +enum rockchip_pinctrl_type { + PX30 = 0, + RV1108 = 1, + RV1126 = 2, + RK2928 = 3, + RK3066B = 4, + RK3128 = 5, + RK3188 = 6, + RK3288 = 7, + RK3308 = 8, + RK3368 = 9, + RK3399 = 10, + RK3568 = 11, + RK3588 = 12, +}; + +struct rockchip_gpio_regs { + u32 port_dr; + u32 port_ddr; + u32 int_en; + u32 int_mask; + u32 int_type; + u32 int_polarity; + u32 int_bothedge; + u32 int_status; + u32 int_rawstatus; + u32 debounce; + u32 dbclk_div_en; + u32 dbclk_div_con; + u32 port_eoi; + u32 ext_port; + u32 version_id; +}; + +struct rockchip_iomux { + int type; + int offset; +}; + +enum rockchip_pin_drv_type { + DRV_TYPE_IO_DEFAULT = 0, + DRV_TYPE_IO_1V8_OR_3V0 = 1, + DRV_TYPE_IO_1V8_ONLY = 2, + DRV_TYPE_IO_1V8_3V0_AUTO = 3, + DRV_TYPE_IO_3V3_ONLY = 4, + DRV_TYPE_MAX = 5, +}; + +enum rockchip_pin_pull_type { + PULL_TYPE_IO_DEFAULT = 0, + PULL_TYPE_IO_1V8_ONLY = 1, + PULL_TYPE_MAX = 2, +}; + +struct rockchip_drv { + enum rockchip_pin_drv_type drv_type; + int offset; +}; + +struct rockchip_pinctrl; + +struct rockchip_pin_bank { + struct device *dev; + void *reg_base; + struct regmap *regmap_pull; + struct clk *clk; + struct clk *db_clk; + int irq; + u32 saved_masks; + u32 pin_base; + u8 nr_pins; + char *name; + u8 bank_num; + struct rockchip_iomux iomux[4]; + struct rockchip_drv drv[4]; + enum rockchip_pin_pull_type pull_type[4]; + bool valid; + struct device_node *of_node; + struct rockchip_pinctrl *drvdata; + struct irq_domain *domain; + struct gpio_chip gpio_chip; + struct pinctrl_gpio_range grange; + raw_spinlock_t slock; + const struct rockchip_gpio_regs *gpio_regs; + u32 gpio_type; + u32 toggle_edge_mode; + u32 recalced_mask; + u32 route_mask; + struct list_head deferred_pins; + struct mutex deferred_lock; +}; + +struct rockchip_pin_ctrl; + +struct rockchip_pin_group; + +struct rockchip_pmx_func; + +struct rockchip_pinctrl { + struct regmap *regmap_base; + int reg_size; + struct regmap *regmap_pull; + struct regmap *regmap_pmu; + struct device *dev; + struct rockchip_pin_ctrl *ctrl; + struct pinctrl_desc pctl; + struct pinctrl_dev *pctl_dev; + struct rockchip_pin_group *groups; + unsigned int ngroups; + struct rockchip_pmx_func *functions; + unsigned int nfunctions; +}; + +struct rockchip_mux_recalced_data { + u8 num; + u8 pin; + u32 reg; + u8 bit; + u8 mask; +}; + +enum rockchip_mux_route_location { + ROCKCHIP_ROUTE_SAME = 0, + ROCKCHIP_ROUTE_PMU = 1, + ROCKCHIP_ROUTE_GRF = 2, +}; + +struct rockchip_mux_route_data { + u8 bank_num; + u8 pin; + u8 func; + enum rockchip_mux_route_location route_location; + u32 route_offset; + u32 route_val; +}; + +struct rockchip_pin_ctrl { + struct rockchip_pin_bank *pin_banks; + u32 nr_banks; + u32 nr_pins; + char *label; + enum rockchip_pinctrl_type type; + int grf_mux_offset; + int pmu_mux_offset; + int grf_drv_offset; + int pmu_drv_offset; + struct rockchip_mux_recalced_data *iomux_recalced; + u32 niomux_recalced; + struct rockchip_mux_route_data *iomux_routes; + u32 niomux_routes; + int (*pull_calc_reg)(struct rockchip_pin_bank *, int, struct regmap **, int *, u8 *); + int (*drv_calc_reg)(struct rockchip_pin_bank *, int, struct regmap **, int *, u8 *); + int (*schmitt_calc_reg)(struct rockchip_pin_bank *, int, struct regmap **, int *, u8 *); +}; + +struct rockchip_pin_config { + unsigned int func; + long unsigned int *configs; + unsigned int nconfigs; +}; + +struct rockchip_pin_deferred { + struct list_head head; + unsigned int pin; + enum pin_config_param param; + u32 arg; +}; + +struct rockchip_pin_group { + const char *name; + unsigned int npins; + unsigned int *pins; + struct rockchip_pin_config *data; +}; + +struct rockchip_pmx_func { + const char *name; + const char **groups; + u8 ngroups; +}; + +struct pcs_func_vals { + void *reg; + unsigned int val; + unsigned int mask; +}; + +struct pcs_conf_vals { + enum pin_config_param param; + unsigned int val; + unsigned int enable; + unsigned int disable; + unsigned int mask; +}; + +struct pcs_conf_type { + const char *name; + enum pin_config_param param; +}; + +struct pcs_function { + const char *name; + struct pcs_func_vals *vals; + unsigned int nvals; + const char **pgnames; + int npgnames; + struct pcs_conf_vals *conf; + int nconfs; + struct list_head node; +}; + +struct pcs_gpiofunc_range { + unsigned int offset; + unsigned int npins; + unsigned int gpiofunc; + struct list_head node; +}; + +struct pcs_data { + struct pinctrl_pin_desc *pa; + int cur; +}; + +struct pcs_soc_data { + unsigned int flags; + int irq; + unsigned int irq_enable_mask; + unsigned int irq_status_mask; + void (*rearm)(); +}; + +struct pcs_device { + struct resource *res; + void *base; + void *saved_vals; + unsigned int size; + struct device *dev; + struct device_node *np; + struct pinctrl_dev *pctl; + unsigned int flags; + struct property *missing_nr_pinctrl_cells; + struct pcs_soc_data socdata; + raw_spinlock_t lock; + struct mutex mutex; + unsigned int width; + unsigned int fmask; + unsigned int fshift; + unsigned int foff; + unsigned int fmax; + bool bits_per_mux; + unsigned int bits_per_pin; + struct pcs_data pins; + struct list_head gpiofuncs; + struct list_head irqs; + struct irq_chip chip; + struct irq_domain *domain; + struct pinctrl_desc desc; + unsigned int (*read)(void *); + void (*write)(unsigned int, void *); +}; + +struct pcs_interrupt { + void *reg; + irq_hw_number_t hwirq; + unsigned int irq; + struct list_head node; +}; + +struct aspeed_sig_desc { + unsigned int ip; + unsigned int reg; + u32 mask; + u32 enable; + u32 disable; +}; + +struct aspeed_sig_expr { + const char *signal; + const char *function; + int ndescs; + const struct aspeed_sig_desc *descs; +}; + +struct aspeed_pin_desc { + const char *name; + const struct aspeed_sig_expr ***prios; +}; + +struct aspeed_pin_group { + const char *name; + const unsigned int *pins; + const unsigned int npins; +}; + +struct aspeed_pin_function { + const char *name; + const char * const *groups; + unsigned int ngroups; +}; + +struct aspeed_pinmux_data; + +struct aspeed_pinmux_ops { + int (*eval)(struct aspeed_pinmux_data *, const struct aspeed_sig_expr *, bool); + int (*set)(struct aspeed_pinmux_data *, const struct aspeed_sig_expr *, bool); +}; + +struct aspeed_pinmux_data { + struct device *dev; + struct regmap *maps[3]; + const struct aspeed_pinmux_ops *ops; + const struct aspeed_pin_group *groups; + const unsigned int ngroups; + const struct aspeed_pin_function *functions; + const unsigned int nfunctions; +}; + +struct aspeed_pin_config { + enum pin_config_param param; + unsigned int pins[2]; + unsigned int reg; + u32 mask; +}; + +struct aspeed_pin_config_map { + enum pin_config_param param; + s32 arg; + u32 val; + u32 mask; +}; + +struct aspeed_pinctrl_data { + struct regmap *scu; + const struct pinctrl_pin_desc *pins; + const unsigned int npins; + const struct aspeed_pin_config *configs; + const unsigned int nconfigs; + struct aspeed_pinmux_data pinmux; + const struct aspeed_pin_config_map *confmaps; + const unsigned int nconfmaps; +}; + +enum aspeed_pin_config_map_type { + MAP_TYPE_ARG = 0, + MAP_TYPE_VAL = 1, +}; + +struct bcm2835_pinctrl { + struct device *dev; + void *base; + int *wake_irq; + long unsigned int enabled_irq_map[2]; + unsigned int irq_type[58]; + struct pinctrl_dev *pctl_dev; + struct gpio_chip gpio_chip; + struct pinctrl_desc pctl_desc; + struct pinctrl_gpio_range gpio_range; + raw_spinlock_t irq_lock[2]; +}; + +enum bcm2835_fsel { + BCM2835_FSEL_COUNT = 8, + BCM2835_FSEL_MASK = 7, +}; + +struct bcm_plat_data { + const struct gpio_chip *gpio_chip; + const struct pinctrl_desc *pctl_desc; + const struct pinctrl_gpio_range *gpio_range; +}; + +struct imx_pin_mmio { + unsigned int mux_mode; + u16 input_reg; + unsigned int input_val; + long unsigned int config; +}; + +struct imx_pin_scu { + unsigned int mux_mode; + long unsigned int config; +}; + +struct imx_pin { + unsigned int pin; + union { + struct imx_pin_mmio mmio; + struct imx_pin_scu scu; + } conf; +}; + +struct imx_pin_reg { + s16 mux_reg; + s16 conf_reg; +}; + +struct imx_cfg_params_decode { + enum pin_config_param param; + u32 mask; + u8 shift; + bool invert; +}; + +struct imx_pinctrl_soc_info; + +struct imx_pinctrl { + struct device *dev; + struct pinctrl_dev *pctl; + void *base; + void *input_sel_base; + const struct imx_pinctrl_soc_info *info; + struct imx_pin_reg *pin_regs; + unsigned int group_index; + struct mutex mutex; +}; + +struct imx_pinctrl_soc_info { + const struct pinctrl_pin_desc *pins; + unsigned int npins; + unsigned int flags; + const char *gpr_compatible; + unsigned int mux_mask; + u8 mux_shift; + bool generic_pinconf; + const struct pinconf_generic_params *custom_params; + unsigned int num_custom_params; + const struct imx_cfg_params_decode *decodes; + unsigned int num_decodes; + void (*fixup)(long unsigned int *, unsigned int, u32 *); + int (*gpio_set_direction)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int, bool); + int (*imx_pinconf_get)(struct pinctrl_dev *, unsigned int, long unsigned int *); + int (*imx_pinconf_set)(struct pinctrl_dev *, unsigned int, long unsigned int *, unsigned int); + void (*imx_pinctrl_parse_pin)(struct imx_pinctrl *, unsigned int *, struct imx_pin *, const __be32 **); +}; + +enum imx51_pads { + MX51_PAD_RESERVE0 = 0, + MX51_PAD_RESERVE1 = 1, + MX51_PAD_RESERVE2 = 2, + MX51_PAD_RESERVE3 = 3, + MX51_PAD_RESERVE4 = 4, + MX51_PAD_RESERVE5 = 5, + MX51_PAD_RESERVE6 = 6, + MX51_PAD_EIM_DA0 = 7, + MX51_PAD_EIM_DA1 = 8, + MX51_PAD_EIM_DA2 = 9, + MX51_PAD_EIM_DA3 = 10, + MX51_PAD_EIM_DA4 = 11, + MX51_PAD_EIM_DA5 = 12, + MX51_PAD_EIM_DA6 = 13, + MX51_PAD_EIM_DA7 = 14, + MX51_PAD_EIM_DA8 = 15, + MX51_PAD_EIM_DA9 = 16, + MX51_PAD_EIM_DA10 = 17, + MX51_PAD_EIM_DA11 = 18, + MX51_PAD_EIM_DA12 = 19, + MX51_PAD_EIM_DA13 = 20, + MX51_PAD_EIM_DA14 = 21, + MX51_PAD_EIM_DA15 = 22, + MX51_PAD_EIM_D16 = 23, + MX51_PAD_EIM_D17 = 24, + MX51_PAD_EIM_D18 = 25, + MX51_PAD_EIM_D19 = 26, + MX51_PAD_EIM_D20 = 27, + MX51_PAD_EIM_D21 = 28, + MX51_PAD_EIM_D22 = 29, + MX51_PAD_EIM_D23 = 30, + MX51_PAD_EIM_D24 = 31, + MX51_PAD_EIM_D25 = 32, + MX51_PAD_EIM_D26 = 33, + MX51_PAD_EIM_D27 = 34, + MX51_PAD_EIM_D28 = 35, + MX51_PAD_EIM_D29 = 36, + MX51_PAD_EIM_D30 = 37, + MX51_PAD_EIM_D31 = 38, + MX51_PAD_EIM_A16 = 39, + MX51_PAD_EIM_A17 = 40, + MX51_PAD_EIM_A18 = 41, + MX51_PAD_EIM_A19 = 42, + MX51_PAD_EIM_A20 = 43, + MX51_PAD_EIM_A21 = 44, + MX51_PAD_EIM_A22 = 45, + MX51_PAD_EIM_A23 = 46, + MX51_PAD_EIM_A24 = 47, + MX51_PAD_EIM_A25 = 48, + MX51_PAD_EIM_A26 = 49, + MX51_PAD_EIM_A27 = 50, + MX51_PAD_EIM_EB0 = 51, + MX51_PAD_EIM_EB1 = 52, + MX51_PAD_EIM_EB2 = 53, + MX51_PAD_EIM_EB3 = 54, + MX51_PAD_EIM_OE = 55, + MX51_PAD_EIM_CS0 = 56, + MX51_PAD_EIM_CS1 = 57, + MX51_PAD_EIM_CS2 = 58, + MX51_PAD_EIM_CS3 = 59, + MX51_PAD_EIM_CS4 = 60, + MX51_PAD_EIM_CS5 = 61, + MX51_PAD_EIM_DTACK = 62, + MX51_PAD_EIM_LBA = 63, + MX51_PAD_EIM_CRE = 64, + MX51_PAD_DRAM_CS1 = 65, + MX51_PAD_NANDF_WE_B = 66, + MX51_PAD_NANDF_RE_B = 67, + MX51_PAD_NANDF_ALE = 68, + MX51_PAD_NANDF_CLE = 69, + MX51_PAD_NANDF_WP_B = 70, + MX51_PAD_NANDF_RB0 = 71, + MX51_PAD_NANDF_RB1 = 72, + MX51_PAD_NANDF_RB2 = 73, + MX51_PAD_NANDF_RB3 = 74, + MX51_PAD_GPIO_NAND = 75, + MX51_PAD_NANDF_CS0 = 76, + MX51_PAD_NANDF_CS1 = 77, + MX51_PAD_NANDF_CS2 = 78, + MX51_PAD_NANDF_CS3 = 79, + MX51_PAD_NANDF_CS4 = 80, + MX51_PAD_NANDF_CS5 = 81, + MX51_PAD_NANDF_CS6 = 82, + MX51_PAD_NANDF_CS7 = 83, + MX51_PAD_NANDF_RDY_INT = 84, + MX51_PAD_NANDF_D15 = 85, + MX51_PAD_NANDF_D14 = 86, + MX51_PAD_NANDF_D13 = 87, + MX51_PAD_NANDF_D12 = 88, + MX51_PAD_NANDF_D11 = 89, + MX51_PAD_NANDF_D10 = 90, + MX51_PAD_NANDF_D9 = 91, + MX51_PAD_NANDF_D8 = 92, + MX51_PAD_NANDF_D7 = 93, + MX51_PAD_NANDF_D6 = 94, + MX51_PAD_NANDF_D5 = 95, + MX51_PAD_NANDF_D4 = 96, + MX51_PAD_NANDF_D3 = 97, + MX51_PAD_NANDF_D2 = 98, + MX51_PAD_NANDF_D1 = 99, + MX51_PAD_NANDF_D0 = 100, + MX51_PAD_CSI1_D8 = 101, + MX51_PAD_CSI1_D9 = 102, + MX51_PAD_CSI1_D10 = 103, + MX51_PAD_CSI1_D11 = 104, + MX51_PAD_CSI1_D12 = 105, + MX51_PAD_CSI1_D13 = 106, + MX51_PAD_CSI1_D14 = 107, + MX51_PAD_CSI1_D15 = 108, + MX51_PAD_CSI1_D16 = 109, + MX51_PAD_CSI1_D17 = 110, + MX51_PAD_CSI1_D18 = 111, + MX51_PAD_CSI1_D19 = 112, + MX51_PAD_CSI1_VSYNC = 113, + MX51_PAD_CSI1_HSYNC = 114, + MX51_PAD_CSI2_D12 = 115, + MX51_PAD_CSI2_D13 = 116, + MX51_PAD_CSI2_D14 = 117, + MX51_PAD_CSI2_D15 = 118, + MX51_PAD_CSI2_D16 = 119, + MX51_PAD_CSI2_D17 = 120, + MX51_PAD_CSI2_D18 = 121, + MX51_PAD_CSI2_D19 = 122, + MX51_PAD_CSI2_VSYNC = 123, + MX51_PAD_CSI2_HSYNC = 124, + MX51_PAD_CSI2_PIXCLK = 125, + MX51_PAD_I2C1_CLK = 126, + MX51_PAD_I2C1_DAT = 127, + MX51_PAD_AUD3_BB_TXD = 128, + MX51_PAD_AUD3_BB_RXD = 129, + MX51_PAD_AUD3_BB_CK = 130, + MX51_PAD_AUD3_BB_FS = 131, + MX51_PAD_CSPI1_MOSI = 132, + MX51_PAD_CSPI1_MISO = 133, + MX51_PAD_CSPI1_SS0 = 134, + MX51_PAD_CSPI1_SS1 = 135, + MX51_PAD_CSPI1_RDY = 136, + MX51_PAD_CSPI1_SCLK = 137, + MX51_PAD_UART1_RXD = 138, + MX51_PAD_UART1_TXD = 139, + MX51_PAD_UART1_RTS = 140, + MX51_PAD_UART1_CTS = 141, + MX51_PAD_UART2_RXD = 142, + MX51_PAD_UART2_TXD = 143, + MX51_PAD_UART3_RXD = 144, + MX51_PAD_UART3_TXD = 145, + MX51_PAD_OWIRE_LINE = 146, + MX51_PAD_KEY_ROW0 = 147, + MX51_PAD_KEY_ROW1 = 148, + MX51_PAD_KEY_ROW2 = 149, + MX51_PAD_KEY_ROW3 = 150, + MX51_PAD_KEY_COL0 = 151, + MX51_PAD_KEY_COL1 = 152, + MX51_PAD_KEY_COL2 = 153, + MX51_PAD_KEY_COL3 = 154, + MX51_PAD_KEY_COL4 = 155, + MX51_PAD_KEY_COL5 = 156, + MX51_PAD_RESERVE7 = 157, + MX51_PAD_USBH1_CLK = 158, + MX51_PAD_USBH1_DIR = 159, + MX51_PAD_USBH1_STP = 160, + MX51_PAD_USBH1_NXT = 161, + MX51_PAD_USBH1_DATA0 = 162, + MX51_PAD_USBH1_DATA1 = 163, + MX51_PAD_USBH1_DATA2 = 164, + MX51_PAD_USBH1_DATA3 = 165, + MX51_PAD_USBH1_DATA4 = 166, + MX51_PAD_USBH1_DATA5 = 167, + MX51_PAD_USBH1_DATA6 = 168, + MX51_PAD_USBH1_DATA7 = 169, + MX51_PAD_DI1_PIN11 = 170, + MX51_PAD_DI1_PIN12 = 171, + MX51_PAD_DI1_PIN13 = 172, + MX51_PAD_DI1_D0_CS = 173, + MX51_PAD_DI1_D1_CS = 174, + MX51_PAD_DISPB2_SER_DIN = 175, + MX51_PAD_DISPB2_SER_DIO = 176, + MX51_PAD_DISPB2_SER_CLK = 177, + MX51_PAD_DISPB2_SER_RS = 178, + MX51_PAD_DISP1_DAT0 = 179, + MX51_PAD_DISP1_DAT1 = 180, + MX51_PAD_DISP1_DAT2 = 181, + MX51_PAD_DISP1_DAT3 = 182, + MX51_PAD_DISP1_DAT4 = 183, + MX51_PAD_DISP1_DAT5 = 184, + MX51_PAD_DISP1_DAT6 = 185, + MX51_PAD_DISP1_DAT7 = 186, + MX51_PAD_DISP1_DAT8 = 187, + MX51_PAD_DISP1_DAT9 = 188, + MX51_PAD_DISP1_DAT10 = 189, + MX51_PAD_DISP1_DAT11 = 190, + MX51_PAD_DISP1_DAT12 = 191, + MX51_PAD_DISP1_DAT13 = 192, + MX51_PAD_DISP1_DAT14 = 193, + MX51_PAD_DISP1_DAT15 = 194, + MX51_PAD_DISP1_DAT16 = 195, + MX51_PAD_DISP1_DAT17 = 196, + MX51_PAD_DISP1_DAT18 = 197, + MX51_PAD_DISP1_DAT19 = 198, + MX51_PAD_DISP1_DAT20 = 199, + MX51_PAD_DISP1_DAT21 = 200, + MX51_PAD_DISP1_DAT22 = 201, + MX51_PAD_DISP1_DAT23 = 202, + MX51_PAD_DI1_PIN3 = 203, + MX51_PAD_DI1_PIN2 = 204, + MX51_PAD_RESERVE8 = 205, + MX51_PAD_DI_GP2 = 206, + MX51_PAD_DI_GP3 = 207, + MX51_PAD_DI2_PIN4 = 208, + MX51_PAD_DI2_PIN2 = 209, + MX51_PAD_DI2_PIN3 = 210, + MX51_PAD_DI2_DISP_CLK = 211, + MX51_PAD_DI_GP4 = 212, + MX51_PAD_DISP2_DAT0 = 213, + MX51_PAD_DISP2_DAT1 = 214, + MX51_PAD_DISP2_DAT2 = 215, + MX51_PAD_DISP2_DAT3 = 216, + MX51_PAD_DISP2_DAT4 = 217, + MX51_PAD_DISP2_DAT5 = 218, + MX51_PAD_DISP2_DAT6 = 219, + MX51_PAD_DISP2_DAT7 = 220, + MX51_PAD_DISP2_DAT8 = 221, + MX51_PAD_DISP2_DAT9 = 222, + MX51_PAD_DISP2_DAT10 = 223, + MX51_PAD_DISP2_DAT11 = 224, + MX51_PAD_DISP2_DAT12 = 225, + MX51_PAD_DISP2_DAT13 = 226, + MX51_PAD_DISP2_DAT14 = 227, + MX51_PAD_DISP2_DAT15 = 228, + MX51_PAD_SD1_CMD = 229, + MX51_PAD_SD1_CLK = 230, + MX51_PAD_SD1_DATA0 = 231, + MX51_PAD_SD1_DATA1 = 232, + MX51_PAD_SD1_DATA2 = 233, + MX51_PAD_SD1_DATA3 = 234, + MX51_PAD_GPIO1_0 = 235, + MX51_PAD_GPIO1_1 = 236, + MX51_PAD_SD2_CMD = 237, + MX51_PAD_SD2_CLK = 238, + MX51_PAD_SD2_DATA0 = 239, + MX51_PAD_SD2_DATA1 = 240, + MX51_PAD_SD2_DATA2 = 241, + MX51_PAD_SD2_DATA3 = 242, + MX51_PAD_GPIO1_2 = 243, + MX51_PAD_GPIO1_3 = 244, + MX51_PAD_PMIC_INT_REQ = 245, + MX51_PAD_GPIO1_4 = 246, + MX51_PAD_GPIO1_5 = 247, + MX51_PAD_GPIO1_6 = 248, + MX51_PAD_GPIO1_7 = 249, + MX51_PAD_GPIO1_8 = 250, + MX51_PAD_GPIO1_9 = 251, + MX51_PAD_RESERVE9 = 252, + MX51_PAD_RESERVE10 = 253, + MX51_PAD_RESERVE11 = 254, + MX51_PAD_RESERVE12 = 255, + MX51_PAD_RESERVE13 = 256, + MX51_PAD_RESERVE14 = 257, + MX51_PAD_RESERVE15 = 258, + MX51_PAD_RESERVE16 = 259, + MX51_PAD_RESERVE17 = 260, + MX51_PAD_RESERVE18 = 261, + MX51_PAD_RESERVE19 = 262, + MX51_PAD_RESERVE20 = 263, + MX51_PAD_RESERVE21 = 264, + MX51_PAD_RESERVE22 = 265, + MX51_PAD_RESERVE23 = 266, + MX51_PAD_RESERVE24 = 267, + MX51_PAD_RESERVE25 = 268, + MX51_PAD_RESERVE26 = 269, + MX51_PAD_RESERVE27 = 270, + MX51_PAD_RESERVE28 = 271, + MX51_PAD_RESERVE29 = 272, + MX51_PAD_RESERVE30 = 273, + MX51_PAD_RESERVE31 = 274, + MX51_PAD_RESERVE32 = 275, + MX51_PAD_RESERVE33 = 276, + MX51_PAD_RESERVE34 = 277, + MX51_PAD_RESERVE35 = 278, + MX51_PAD_RESERVE36 = 279, + MX51_PAD_RESERVE37 = 280, + MX51_PAD_RESERVE38 = 281, + MX51_PAD_RESERVE39 = 282, + MX51_PAD_RESERVE40 = 283, + MX51_PAD_RESERVE41 = 284, + MX51_PAD_RESERVE42 = 285, + MX51_PAD_RESERVE43 = 286, + MX51_PAD_RESERVE44 = 287, + MX51_PAD_RESERVE45 = 288, + MX51_PAD_RESERVE46 = 289, + MX51_PAD_RESERVE47 = 290, + MX51_PAD_RESERVE48 = 291, + MX51_PAD_RESERVE49 = 292, + MX51_PAD_RESERVE50 = 293, + MX51_PAD_RESERVE51 = 294, + MX51_PAD_RESERVE52 = 295, + MX51_PAD_RESERVE53 = 296, + MX51_PAD_RESERVE54 = 297, + MX51_PAD_RESERVE55 = 298, + MX51_PAD_RESERVE56 = 299, + MX51_PAD_RESERVE57 = 300, + MX51_PAD_RESERVE58 = 301, + MX51_PAD_RESERVE59 = 302, + MX51_PAD_RESERVE60 = 303, + MX51_PAD_RESERVE61 = 304, + MX51_PAD_RESERVE62 = 305, + MX51_PAD_RESERVE63 = 306, + MX51_PAD_RESERVE64 = 307, + MX51_PAD_RESERVE65 = 308, + MX51_PAD_RESERVE66 = 309, + MX51_PAD_RESERVE67 = 310, + MX51_PAD_RESERVE68 = 311, + MX51_PAD_RESERVE69 = 312, + MX51_PAD_RESERVE70 = 313, + MX51_PAD_RESERVE71 = 314, + MX51_PAD_RESERVE72 = 315, + MX51_PAD_RESERVE73 = 316, + MX51_PAD_RESERVE74 = 317, + MX51_PAD_RESERVE75 = 318, + MX51_PAD_RESERVE76 = 319, + MX51_PAD_RESERVE77 = 320, + MX51_PAD_RESERVE78 = 321, + MX51_PAD_RESERVE79 = 322, + MX51_PAD_RESERVE80 = 323, + MX51_PAD_RESERVE81 = 324, + MX51_PAD_RESERVE82 = 325, + MX51_PAD_RESERVE83 = 326, + MX51_PAD_RESERVE84 = 327, + MX51_PAD_RESERVE85 = 328, + MX51_PAD_RESERVE86 = 329, + MX51_PAD_RESERVE87 = 330, + MX51_PAD_RESERVE88 = 331, + MX51_PAD_RESERVE89 = 332, + MX51_PAD_RESERVE90 = 333, + MX51_PAD_RESERVE91 = 334, + MX51_PAD_RESERVE92 = 335, + MX51_PAD_RESERVE93 = 336, + MX51_PAD_RESERVE94 = 337, + MX51_PAD_RESERVE95 = 338, + MX51_PAD_RESERVE96 = 339, + MX51_PAD_RESERVE97 = 340, + MX51_PAD_RESERVE98 = 341, + MX51_PAD_RESERVE99 = 342, + MX51_PAD_RESERVE100 = 343, + MX51_PAD_RESERVE101 = 344, + MX51_PAD_RESERVE102 = 345, + MX51_PAD_RESERVE103 = 346, + MX51_PAD_RESERVE104 = 347, + MX51_PAD_RESERVE105 = 348, + MX51_PAD_RESERVE106 = 349, + MX51_PAD_RESERVE107 = 350, + MX51_PAD_RESERVE108 = 351, + MX51_PAD_RESERVE109 = 352, + MX51_PAD_RESERVE110 = 353, + MX51_PAD_RESERVE111 = 354, + MX51_PAD_RESERVE112 = 355, + MX51_PAD_RESERVE113 = 356, + MX51_PAD_RESERVE114 = 357, + MX51_PAD_RESERVE115 = 358, + MX51_PAD_RESERVE116 = 359, + MX51_PAD_RESERVE117 = 360, + MX51_PAD_RESERVE118 = 361, + MX51_PAD_RESERVE119 = 362, + MX51_PAD_RESERVE120 = 363, + MX51_PAD_RESERVE121 = 364, + MX51_PAD_CSI1_PIXCLK = 365, + MX51_PAD_CSI1_MCLK = 366, +}; + +enum imx53_pads { + MX53_PAD_RESERVE0 = 0, + MX53_PAD_RESERVE1 = 1, + MX53_PAD_RESERVE2 = 2, + MX53_PAD_RESERVE3 = 3, + MX53_PAD_RESERVE4 = 4, + MX53_PAD_RESERVE5 = 5, + MX53_PAD_RESERVE6 = 6, + MX53_PAD_RESERVE7 = 7, + MX53_PAD_GPIO_19 = 8, + MX53_PAD_KEY_COL0 = 9, + MX53_PAD_KEY_ROW0 = 10, + MX53_PAD_KEY_COL1 = 11, + MX53_PAD_KEY_ROW1 = 12, + MX53_PAD_KEY_COL2 = 13, + MX53_PAD_KEY_ROW2 = 14, + MX53_PAD_KEY_COL3 = 15, + MX53_PAD_KEY_ROW3 = 16, + MX53_PAD_KEY_COL4 = 17, + MX53_PAD_KEY_ROW4 = 18, + MX53_PAD_DI0_DISP_CLK = 19, + MX53_PAD_DI0_PIN15 = 20, + MX53_PAD_DI0_PIN2 = 21, + MX53_PAD_DI0_PIN3 = 22, + MX53_PAD_DI0_PIN4 = 23, + MX53_PAD_DISP0_DAT0 = 24, + MX53_PAD_DISP0_DAT1 = 25, + MX53_PAD_DISP0_DAT2 = 26, + MX53_PAD_DISP0_DAT3 = 27, + MX53_PAD_DISP0_DAT4 = 28, + MX53_PAD_DISP0_DAT5 = 29, + MX53_PAD_DISP0_DAT6 = 30, + MX53_PAD_DISP0_DAT7 = 31, + MX53_PAD_DISP0_DAT8 = 32, + MX53_PAD_DISP0_DAT9 = 33, + MX53_PAD_DISP0_DAT10 = 34, + MX53_PAD_DISP0_DAT11 = 35, + MX53_PAD_DISP0_DAT12 = 36, + MX53_PAD_DISP0_DAT13 = 37, + MX53_PAD_DISP0_DAT14 = 38, + MX53_PAD_DISP0_DAT15 = 39, + MX53_PAD_DISP0_DAT16 = 40, + MX53_PAD_DISP0_DAT17 = 41, + MX53_PAD_DISP0_DAT18 = 42, + MX53_PAD_DISP0_DAT19 = 43, + MX53_PAD_DISP0_DAT20 = 44, + MX53_PAD_DISP0_DAT21 = 45, + MX53_PAD_DISP0_DAT22 = 46, + MX53_PAD_DISP0_DAT23 = 47, + MX53_PAD_CSI0_PIXCLK = 48, + MX53_PAD_CSI0_MCLK = 49, + MX53_PAD_CSI0_DATA_EN = 50, + MX53_PAD_CSI0_VSYNC = 51, + MX53_PAD_CSI0_DAT4 = 52, + MX53_PAD_CSI0_DAT5 = 53, + MX53_PAD_CSI0_DAT6 = 54, + MX53_PAD_CSI0_DAT7 = 55, + MX53_PAD_CSI0_DAT8 = 56, + MX53_PAD_CSI0_DAT9 = 57, + MX53_PAD_CSI0_DAT10 = 58, + MX53_PAD_CSI0_DAT11 = 59, + MX53_PAD_CSI0_DAT12 = 60, + MX53_PAD_CSI0_DAT13 = 61, + MX53_PAD_CSI0_DAT14 = 62, + MX53_PAD_CSI0_DAT15 = 63, + MX53_PAD_CSI0_DAT16 = 64, + MX53_PAD_CSI0_DAT17 = 65, + MX53_PAD_CSI0_DAT18 = 66, + MX53_PAD_CSI0_DAT19 = 67, + MX53_PAD_EIM_A25 = 68, + MX53_PAD_EIM_EB2 = 69, + MX53_PAD_EIM_D16 = 70, + MX53_PAD_EIM_D17 = 71, + MX53_PAD_EIM_D18 = 72, + MX53_PAD_EIM_D19 = 73, + MX53_PAD_EIM_D20 = 74, + MX53_PAD_EIM_D21 = 75, + MX53_PAD_EIM_D22 = 76, + MX53_PAD_EIM_D23 = 77, + MX53_PAD_EIM_EB3 = 78, + MX53_PAD_EIM_D24 = 79, + MX53_PAD_EIM_D25 = 80, + MX53_PAD_EIM_D26 = 81, + MX53_PAD_EIM_D27 = 82, + MX53_PAD_EIM_D28 = 83, + MX53_PAD_EIM_D29 = 84, + MX53_PAD_EIM_D30 = 85, + MX53_PAD_EIM_D31 = 86, + MX53_PAD_EIM_A24 = 87, + MX53_PAD_EIM_A23 = 88, + MX53_PAD_EIM_A22 = 89, + MX53_PAD_EIM_A21 = 90, + MX53_PAD_EIM_A20 = 91, + MX53_PAD_EIM_A19 = 92, + MX53_PAD_EIM_A18 = 93, + MX53_PAD_EIM_A17 = 94, + MX53_PAD_EIM_A16 = 95, + MX53_PAD_EIM_CS0 = 96, + MX53_PAD_EIM_CS1 = 97, + MX53_PAD_EIM_OE = 98, + MX53_PAD_EIM_RW = 99, + MX53_PAD_EIM_LBA = 100, + MX53_PAD_EIM_EB0 = 101, + MX53_PAD_EIM_EB1 = 102, + MX53_PAD_EIM_DA0 = 103, + MX53_PAD_EIM_DA1 = 104, + MX53_PAD_EIM_DA2 = 105, + MX53_PAD_EIM_DA3 = 106, + MX53_PAD_EIM_DA4 = 107, + MX53_PAD_EIM_DA5 = 108, + MX53_PAD_EIM_DA6 = 109, + MX53_PAD_EIM_DA7 = 110, + MX53_PAD_EIM_DA8 = 111, + MX53_PAD_EIM_DA9 = 112, + MX53_PAD_EIM_DA10 = 113, + MX53_PAD_EIM_DA11 = 114, + MX53_PAD_EIM_DA12 = 115, + MX53_PAD_EIM_DA13 = 116, + MX53_PAD_EIM_DA14 = 117, + MX53_PAD_EIM_DA15 = 118, + MX53_PAD_NANDF_WE_B = 119, + MX53_PAD_NANDF_RE_B = 120, + MX53_PAD_EIM_WAIT = 121, + MX53_PAD_RESERVE8 = 122, + MX53_PAD_LVDS1_TX3_P = 123, + MX53_PAD_LVDS1_TX2_P = 124, + MX53_PAD_LVDS1_CLK_P = 125, + MX53_PAD_LVDS1_TX1_P = 126, + MX53_PAD_LVDS1_TX0_P = 127, + MX53_PAD_LVDS0_TX3_P = 128, + MX53_PAD_LVDS0_CLK_P = 129, + MX53_PAD_LVDS0_TX2_P = 130, + MX53_PAD_LVDS0_TX1_P = 131, + MX53_PAD_LVDS0_TX0_P = 132, + MX53_PAD_GPIO_10 = 133, + MX53_PAD_GPIO_11 = 134, + MX53_PAD_GPIO_12 = 135, + MX53_PAD_GPIO_13 = 136, + MX53_PAD_GPIO_14 = 137, + MX53_PAD_NANDF_CLE = 138, + MX53_PAD_NANDF_ALE = 139, + MX53_PAD_NANDF_WP_B = 140, + MX53_PAD_NANDF_RB0 = 141, + MX53_PAD_NANDF_CS0 = 142, + MX53_PAD_NANDF_CS1 = 143, + MX53_PAD_NANDF_CS2 = 144, + MX53_PAD_NANDF_CS3 = 145, + MX53_PAD_FEC_MDIO = 146, + MX53_PAD_FEC_REF_CLK = 147, + MX53_PAD_FEC_RX_ER = 148, + MX53_PAD_FEC_CRS_DV = 149, + MX53_PAD_FEC_RXD1 = 150, + MX53_PAD_FEC_RXD0 = 151, + MX53_PAD_FEC_TX_EN = 152, + MX53_PAD_FEC_TXD1 = 153, + MX53_PAD_FEC_TXD0 = 154, + MX53_PAD_FEC_MDC = 155, + MX53_PAD_PATA_DIOW = 156, + MX53_PAD_PATA_DMACK = 157, + MX53_PAD_PATA_DMARQ = 158, + MX53_PAD_PATA_BUFFER_EN = 159, + MX53_PAD_PATA_INTRQ = 160, + MX53_PAD_PATA_DIOR = 161, + MX53_PAD_PATA_RESET_B = 162, + MX53_PAD_PATA_IORDY = 163, + MX53_PAD_PATA_DA_0 = 164, + MX53_PAD_PATA_DA_1 = 165, + MX53_PAD_PATA_DA_2 = 166, + MX53_PAD_PATA_CS_0 = 167, + MX53_PAD_PATA_CS_1 = 168, + MX53_PAD_PATA_DATA0 = 169, + MX53_PAD_PATA_DATA1 = 170, + MX53_PAD_PATA_DATA2 = 171, + MX53_PAD_PATA_DATA3 = 172, + MX53_PAD_PATA_DATA4 = 173, + MX53_PAD_PATA_DATA5 = 174, + MX53_PAD_PATA_DATA6 = 175, + MX53_PAD_PATA_DATA7 = 176, + MX53_PAD_PATA_DATA8 = 177, + MX53_PAD_PATA_DATA9 = 178, + MX53_PAD_PATA_DATA10 = 179, + MX53_PAD_PATA_DATA11 = 180, + MX53_PAD_PATA_DATA12 = 181, + MX53_PAD_PATA_DATA13 = 182, + MX53_PAD_PATA_DATA14 = 183, + MX53_PAD_PATA_DATA15 = 184, + MX53_PAD_SD1_DATA0 = 185, + MX53_PAD_SD1_DATA1 = 186, + MX53_PAD_SD1_CMD = 187, + MX53_PAD_SD1_DATA2 = 188, + MX53_PAD_SD1_CLK = 189, + MX53_PAD_SD1_DATA3 = 190, + MX53_PAD_SD2_CLK = 191, + MX53_PAD_SD2_CMD = 192, + MX53_PAD_SD2_DATA3 = 193, + MX53_PAD_SD2_DATA2 = 194, + MX53_PAD_SD2_DATA1 = 195, + MX53_PAD_SD2_DATA0 = 196, + MX53_PAD_GPIO_0 = 197, + MX53_PAD_GPIO_1 = 198, + MX53_PAD_GPIO_9 = 199, + MX53_PAD_GPIO_3 = 200, + MX53_PAD_GPIO_6 = 201, + MX53_PAD_GPIO_2 = 202, + MX53_PAD_GPIO_4 = 203, + MX53_PAD_GPIO_5 = 204, + MX53_PAD_GPIO_7 = 205, + MX53_PAD_GPIO_8 = 206, + MX53_PAD_GPIO_16 = 207, + MX53_PAD_GPIO_17 = 208, + MX53_PAD_GPIO_18 = 209, +}; + +enum imx6q_pads { + MX6Q_PAD_RESERVE0 = 0, + MX6Q_PAD_RESERVE1 = 1, + MX6Q_PAD_RESERVE2 = 2, + MX6Q_PAD_RESERVE3 = 3, + MX6Q_PAD_RESERVE4 = 4, + MX6Q_PAD_RESERVE5 = 5, + MX6Q_PAD_RESERVE6 = 6, + MX6Q_PAD_RESERVE7 = 7, + MX6Q_PAD_RESERVE8 = 8, + MX6Q_PAD_RESERVE9 = 9, + MX6Q_PAD_RESERVE10 = 10, + MX6Q_PAD_RESERVE11 = 11, + MX6Q_PAD_RESERVE12 = 12, + MX6Q_PAD_RESERVE13 = 13, + MX6Q_PAD_RESERVE14 = 14, + MX6Q_PAD_RESERVE15 = 15, + MX6Q_PAD_RESERVE16 = 16, + MX6Q_PAD_RESERVE17 = 17, + MX6Q_PAD_RESERVE18 = 18, + MX6Q_PAD_SD2_DAT1 = 19, + MX6Q_PAD_SD2_DAT2 = 20, + MX6Q_PAD_SD2_DAT0 = 21, + MX6Q_PAD_RGMII_TXC = 22, + MX6Q_PAD_RGMII_TD0 = 23, + MX6Q_PAD_RGMII_TD1 = 24, + MX6Q_PAD_RGMII_TD2 = 25, + MX6Q_PAD_RGMII_TD3 = 26, + MX6Q_PAD_RGMII_RX_CTL = 27, + MX6Q_PAD_RGMII_RD0 = 28, + MX6Q_PAD_RGMII_TX_CTL = 29, + MX6Q_PAD_RGMII_RD1 = 30, + MX6Q_PAD_RGMII_RD2 = 31, + MX6Q_PAD_RGMII_RD3 = 32, + MX6Q_PAD_RGMII_RXC = 33, + MX6Q_PAD_EIM_A25 = 34, + MX6Q_PAD_EIM_EB2 = 35, + MX6Q_PAD_EIM_D16 = 36, + MX6Q_PAD_EIM_D17 = 37, + MX6Q_PAD_EIM_D18 = 38, + MX6Q_PAD_EIM_D19 = 39, + MX6Q_PAD_EIM_D20 = 40, + MX6Q_PAD_EIM_D21 = 41, + MX6Q_PAD_EIM_D22 = 42, + MX6Q_PAD_EIM_D23 = 43, + MX6Q_PAD_EIM_EB3 = 44, + MX6Q_PAD_EIM_D24 = 45, + MX6Q_PAD_EIM_D25 = 46, + MX6Q_PAD_EIM_D26 = 47, + MX6Q_PAD_EIM_D27 = 48, + MX6Q_PAD_EIM_D28 = 49, + MX6Q_PAD_EIM_D29 = 50, + MX6Q_PAD_EIM_D30 = 51, + MX6Q_PAD_EIM_D31 = 52, + MX6Q_PAD_EIM_A24 = 53, + MX6Q_PAD_EIM_A23 = 54, + MX6Q_PAD_EIM_A22 = 55, + MX6Q_PAD_EIM_A21 = 56, + MX6Q_PAD_EIM_A20 = 57, + MX6Q_PAD_EIM_A19 = 58, + MX6Q_PAD_EIM_A18 = 59, + MX6Q_PAD_EIM_A17 = 60, + MX6Q_PAD_EIM_A16 = 61, + MX6Q_PAD_EIM_CS0 = 62, + MX6Q_PAD_EIM_CS1 = 63, + MX6Q_PAD_EIM_OE = 64, + MX6Q_PAD_EIM_RW = 65, + MX6Q_PAD_EIM_LBA = 66, + MX6Q_PAD_EIM_EB0 = 67, + MX6Q_PAD_EIM_EB1 = 68, + MX6Q_PAD_EIM_DA0 = 69, + MX6Q_PAD_EIM_DA1 = 70, + MX6Q_PAD_EIM_DA2 = 71, + MX6Q_PAD_EIM_DA3 = 72, + MX6Q_PAD_EIM_DA4 = 73, + MX6Q_PAD_EIM_DA5 = 74, + MX6Q_PAD_EIM_DA6 = 75, + MX6Q_PAD_EIM_DA7 = 76, + MX6Q_PAD_EIM_DA8 = 77, + MX6Q_PAD_EIM_DA9 = 78, + MX6Q_PAD_EIM_DA10 = 79, + MX6Q_PAD_EIM_DA11 = 80, + MX6Q_PAD_EIM_DA12 = 81, + MX6Q_PAD_EIM_DA13 = 82, + MX6Q_PAD_EIM_DA14 = 83, + MX6Q_PAD_EIM_DA15 = 84, + MX6Q_PAD_EIM_WAIT = 85, + MX6Q_PAD_EIM_BCLK = 86, + MX6Q_PAD_DI0_DISP_CLK = 87, + MX6Q_PAD_DI0_PIN15 = 88, + MX6Q_PAD_DI0_PIN2 = 89, + MX6Q_PAD_DI0_PIN3 = 90, + MX6Q_PAD_DI0_PIN4 = 91, + MX6Q_PAD_DISP0_DAT0 = 92, + MX6Q_PAD_DISP0_DAT1 = 93, + MX6Q_PAD_DISP0_DAT2 = 94, + MX6Q_PAD_DISP0_DAT3 = 95, + MX6Q_PAD_DISP0_DAT4 = 96, + MX6Q_PAD_DISP0_DAT5 = 97, + MX6Q_PAD_DISP0_DAT6 = 98, + MX6Q_PAD_DISP0_DAT7 = 99, + MX6Q_PAD_DISP0_DAT8 = 100, + MX6Q_PAD_DISP0_DAT9 = 101, + MX6Q_PAD_DISP0_DAT10 = 102, + MX6Q_PAD_DISP0_DAT11 = 103, + MX6Q_PAD_DISP0_DAT12 = 104, + MX6Q_PAD_DISP0_DAT13 = 105, + MX6Q_PAD_DISP0_DAT14 = 106, + MX6Q_PAD_DISP0_DAT15 = 107, + MX6Q_PAD_DISP0_DAT16 = 108, + MX6Q_PAD_DISP0_DAT17 = 109, + MX6Q_PAD_DISP0_DAT18 = 110, + MX6Q_PAD_DISP0_DAT19 = 111, + MX6Q_PAD_DISP0_DAT20 = 112, + MX6Q_PAD_DISP0_DAT21 = 113, + MX6Q_PAD_DISP0_DAT22 = 114, + MX6Q_PAD_DISP0_DAT23 = 115, + MX6Q_PAD_ENET_MDIO = 116, + MX6Q_PAD_ENET_REF_CLK = 117, + MX6Q_PAD_ENET_RX_ER = 118, + MX6Q_PAD_ENET_CRS_DV = 119, + MX6Q_PAD_ENET_RXD1 = 120, + MX6Q_PAD_ENET_RXD0 = 121, + MX6Q_PAD_ENET_TX_EN = 122, + MX6Q_PAD_ENET_TXD1 = 123, + MX6Q_PAD_ENET_TXD0 = 124, + MX6Q_PAD_ENET_MDC = 125, + MX6Q_PAD_KEY_COL0 = 126, + MX6Q_PAD_KEY_ROW0 = 127, + MX6Q_PAD_KEY_COL1 = 128, + MX6Q_PAD_KEY_ROW1 = 129, + MX6Q_PAD_KEY_COL2 = 130, + MX6Q_PAD_KEY_ROW2 = 131, + MX6Q_PAD_KEY_COL3 = 132, + MX6Q_PAD_KEY_ROW3 = 133, + MX6Q_PAD_KEY_COL4 = 134, + MX6Q_PAD_KEY_ROW4 = 135, + MX6Q_PAD_GPIO_0 = 136, + MX6Q_PAD_GPIO_1 = 137, + MX6Q_PAD_GPIO_9 = 138, + MX6Q_PAD_GPIO_3 = 139, + MX6Q_PAD_GPIO_6 = 140, + MX6Q_PAD_GPIO_2 = 141, + MX6Q_PAD_GPIO_4 = 142, + MX6Q_PAD_GPIO_5 = 143, + MX6Q_PAD_GPIO_7 = 144, + MX6Q_PAD_GPIO_8 = 145, + MX6Q_PAD_GPIO_16 = 146, + MX6Q_PAD_GPIO_17 = 147, + MX6Q_PAD_GPIO_18 = 148, + MX6Q_PAD_GPIO_19 = 149, + MX6Q_PAD_CSI0_PIXCLK = 150, + MX6Q_PAD_CSI0_MCLK = 151, + MX6Q_PAD_CSI0_DATA_EN = 152, + MX6Q_PAD_CSI0_VSYNC = 153, + MX6Q_PAD_CSI0_DAT4 = 154, + MX6Q_PAD_CSI0_DAT5 = 155, + MX6Q_PAD_CSI0_DAT6 = 156, + MX6Q_PAD_CSI0_DAT7 = 157, + MX6Q_PAD_CSI0_DAT8 = 158, + MX6Q_PAD_CSI0_DAT9 = 159, + MX6Q_PAD_CSI0_DAT10 = 160, + MX6Q_PAD_CSI0_DAT11 = 161, + MX6Q_PAD_CSI0_DAT12 = 162, + MX6Q_PAD_CSI0_DAT13 = 163, + MX6Q_PAD_CSI0_DAT14 = 164, + MX6Q_PAD_CSI0_DAT15 = 165, + MX6Q_PAD_CSI0_DAT16 = 166, + MX6Q_PAD_CSI0_DAT17 = 167, + MX6Q_PAD_CSI0_DAT18 = 168, + MX6Q_PAD_CSI0_DAT19 = 169, + MX6Q_PAD_SD3_DAT7 = 170, + MX6Q_PAD_SD3_DAT6 = 171, + MX6Q_PAD_SD3_DAT5 = 172, + MX6Q_PAD_SD3_DAT4 = 173, + MX6Q_PAD_SD3_CMD = 174, + MX6Q_PAD_SD3_CLK = 175, + MX6Q_PAD_SD3_DAT0 = 176, + MX6Q_PAD_SD3_DAT1 = 177, + MX6Q_PAD_SD3_DAT2 = 178, + MX6Q_PAD_SD3_DAT3 = 179, + MX6Q_PAD_SD3_RST = 180, + MX6Q_PAD_NANDF_CLE = 181, + MX6Q_PAD_NANDF_ALE = 182, + MX6Q_PAD_NANDF_WP_B = 183, + MX6Q_PAD_NANDF_RB0 = 184, + MX6Q_PAD_NANDF_CS0 = 185, + MX6Q_PAD_NANDF_CS1 = 186, + MX6Q_PAD_NANDF_CS2 = 187, + MX6Q_PAD_NANDF_CS3 = 188, + MX6Q_PAD_SD4_CMD = 189, + MX6Q_PAD_SD4_CLK = 190, + MX6Q_PAD_NANDF_D0 = 191, + MX6Q_PAD_NANDF_D1 = 192, + MX6Q_PAD_NANDF_D2 = 193, + MX6Q_PAD_NANDF_D3 = 194, + MX6Q_PAD_NANDF_D4 = 195, + MX6Q_PAD_NANDF_D5 = 196, + MX6Q_PAD_NANDF_D6 = 197, + MX6Q_PAD_NANDF_D7 = 198, + MX6Q_PAD_SD4_DAT0 = 199, + MX6Q_PAD_SD4_DAT1 = 200, + MX6Q_PAD_SD4_DAT2 = 201, + MX6Q_PAD_SD4_DAT3 = 202, + MX6Q_PAD_SD4_DAT4 = 203, + MX6Q_PAD_SD4_DAT5 = 204, + MX6Q_PAD_SD4_DAT6 = 205, + MX6Q_PAD_SD4_DAT7 = 206, + MX6Q_PAD_SD1_DAT1 = 207, + MX6Q_PAD_SD1_DAT0 = 208, + MX6Q_PAD_SD1_DAT3 = 209, + MX6Q_PAD_SD1_CMD = 210, + MX6Q_PAD_SD1_DAT2 = 211, + MX6Q_PAD_SD1_CLK = 212, + MX6Q_PAD_SD2_CLK = 213, + MX6Q_PAD_SD2_CMD = 214, + MX6Q_PAD_SD2_DAT3 = 215, +}; + +enum imx6dl_pads { + MX6DL_PAD_RESERVE0 = 0, + MX6DL_PAD_RESERVE1 = 1, + MX6DL_PAD_RESERVE2 = 2, + MX6DL_PAD_RESERVE3 = 3, + MX6DL_PAD_RESERVE4 = 4, + MX6DL_PAD_RESERVE5 = 5, + MX6DL_PAD_RESERVE6 = 6, + MX6DL_PAD_RESERVE7 = 7, + MX6DL_PAD_RESERVE8 = 8, + MX6DL_PAD_RESERVE9 = 9, + MX6DL_PAD_RESERVE10 = 10, + MX6DL_PAD_RESERVE11 = 11, + MX6DL_PAD_RESERVE12 = 12, + MX6DL_PAD_RESERVE13 = 13, + MX6DL_PAD_RESERVE14 = 14, + MX6DL_PAD_RESERVE15 = 15, + MX6DL_PAD_RESERVE16 = 16, + MX6DL_PAD_RESERVE17 = 17, + MX6DL_PAD_RESERVE18 = 18, + MX6DL_PAD_CSI0_DAT10 = 19, + MX6DL_PAD_CSI0_DAT11 = 20, + MX6DL_PAD_CSI0_DAT12 = 21, + MX6DL_PAD_CSI0_DAT13 = 22, + MX6DL_PAD_CSI0_DAT14 = 23, + MX6DL_PAD_CSI0_DAT15 = 24, + MX6DL_PAD_CSI0_DAT16 = 25, + MX6DL_PAD_CSI0_DAT17 = 26, + MX6DL_PAD_CSI0_DAT18 = 27, + MX6DL_PAD_CSI0_DAT19 = 28, + MX6DL_PAD_CSI0_DAT4 = 29, + MX6DL_PAD_CSI0_DAT5 = 30, + MX6DL_PAD_CSI0_DAT6 = 31, + MX6DL_PAD_CSI0_DAT7 = 32, + MX6DL_PAD_CSI0_DAT8 = 33, + MX6DL_PAD_CSI0_DAT9 = 34, + MX6DL_PAD_CSI0_DATA_EN = 35, + MX6DL_PAD_CSI0_MCLK = 36, + MX6DL_PAD_CSI0_PIXCLK = 37, + MX6DL_PAD_CSI0_VSYNC = 38, + MX6DL_PAD_DI0_DISP_CLK = 39, + MX6DL_PAD_DI0_PIN15 = 40, + MX6DL_PAD_DI0_PIN2 = 41, + MX6DL_PAD_DI0_PIN3 = 42, + MX6DL_PAD_DI0_PIN4 = 43, + MX6DL_PAD_DISP0_DAT0 = 44, + MX6DL_PAD_DISP0_DAT1 = 45, + MX6DL_PAD_DISP0_DAT10 = 46, + MX6DL_PAD_DISP0_DAT11 = 47, + MX6DL_PAD_DISP0_DAT12 = 48, + MX6DL_PAD_DISP0_DAT13 = 49, + MX6DL_PAD_DISP0_DAT14 = 50, + MX6DL_PAD_DISP0_DAT15 = 51, + MX6DL_PAD_DISP0_DAT16 = 52, + MX6DL_PAD_DISP0_DAT17 = 53, + MX6DL_PAD_DISP0_DAT18 = 54, + MX6DL_PAD_DISP0_DAT19 = 55, + MX6DL_PAD_DISP0_DAT2 = 56, + MX6DL_PAD_DISP0_DAT20 = 57, + MX6DL_PAD_DISP0_DAT21 = 58, + MX6DL_PAD_DISP0_DAT22 = 59, + MX6DL_PAD_DISP0_DAT23 = 60, + MX6DL_PAD_DISP0_DAT3 = 61, + MX6DL_PAD_DISP0_DAT4 = 62, + MX6DL_PAD_DISP0_DAT5 = 63, + MX6DL_PAD_DISP0_DAT6 = 64, + MX6DL_PAD_DISP0_DAT7 = 65, + MX6DL_PAD_DISP0_DAT8 = 66, + MX6DL_PAD_DISP0_DAT9 = 67, + MX6DL_PAD_EIM_A16 = 68, + MX6DL_PAD_EIM_A17 = 69, + MX6DL_PAD_EIM_A18 = 70, + MX6DL_PAD_EIM_A19 = 71, + MX6DL_PAD_EIM_A20 = 72, + MX6DL_PAD_EIM_A21 = 73, + MX6DL_PAD_EIM_A22 = 74, + MX6DL_PAD_EIM_A23 = 75, + MX6DL_PAD_EIM_A24 = 76, + MX6DL_PAD_EIM_A25 = 77, + MX6DL_PAD_EIM_BCLK = 78, + MX6DL_PAD_EIM_CS0 = 79, + MX6DL_PAD_EIM_CS1 = 80, + MX6DL_PAD_EIM_D16 = 81, + MX6DL_PAD_EIM_D17 = 82, + MX6DL_PAD_EIM_D18 = 83, + MX6DL_PAD_EIM_D19 = 84, + MX6DL_PAD_EIM_D20 = 85, + MX6DL_PAD_EIM_D21 = 86, + MX6DL_PAD_EIM_D22 = 87, + MX6DL_PAD_EIM_D23 = 88, + MX6DL_PAD_EIM_D24 = 89, + MX6DL_PAD_EIM_D25 = 90, + MX6DL_PAD_EIM_D26 = 91, + MX6DL_PAD_EIM_D27 = 92, + MX6DL_PAD_EIM_D28 = 93, + MX6DL_PAD_EIM_D29 = 94, + MX6DL_PAD_EIM_D30 = 95, + MX6DL_PAD_EIM_D31 = 96, + MX6DL_PAD_EIM_DA0 = 97, + MX6DL_PAD_EIM_DA1 = 98, + MX6DL_PAD_EIM_DA10 = 99, + MX6DL_PAD_EIM_DA11 = 100, + MX6DL_PAD_EIM_DA12 = 101, + MX6DL_PAD_EIM_DA13 = 102, + MX6DL_PAD_EIM_DA14 = 103, + MX6DL_PAD_EIM_DA15 = 104, + MX6DL_PAD_EIM_DA2 = 105, + MX6DL_PAD_EIM_DA3 = 106, + MX6DL_PAD_EIM_DA4 = 107, + MX6DL_PAD_EIM_DA5 = 108, + MX6DL_PAD_EIM_DA6 = 109, + MX6DL_PAD_EIM_DA7 = 110, + MX6DL_PAD_EIM_DA8 = 111, + MX6DL_PAD_EIM_DA9 = 112, + MX6DL_PAD_EIM_EB0 = 113, + MX6DL_PAD_EIM_EB1 = 114, + MX6DL_PAD_EIM_EB2 = 115, + MX6DL_PAD_EIM_EB3 = 116, + MX6DL_PAD_EIM_LBA = 117, + MX6DL_PAD_EIM_OE = 118, + MX6DL_PAD_EIM_RW = 119, + MX6DL_PAD_EIM_WAIT = 120, + MX6DL_PAD_ENET_CRS_DV = 121, + MX6DL_PAD_ENET_MDC = 122, + MX6DL_PAD_ENET_MDIO = 123, + MX6DL_PAD_ENET_REF_CLK = 124, + MX6DL_PAD_ENET_RX_ER = 125, + MX6DL_PAD_ENET_RXD0 = 126, + MX6DL_PAD_ENET_RXD1 = 127, + MX6DL_PAD_ENET_TX_EN = 128, + MX6DL_PAD_ENET_TXD0 = 129, + MX6DL_PAD_ENET_TXD1 = 130, + MX6DL_PAD_GPIO_0 = 131, + MX6DL_PAD_GPIO_1 = 132, + MX6DL_PAD_GPIO_16 = 133, + MX6DL_PAD_GPIO_17 = 134, + MX6DL_PAD_GPIO_18 = 135, + MX6DL_PAD_GPIO_19 = 136, + MX6DL_PAD_GPIO_2 = 137, + MX6DL_PAD_GPIO_3 = 138, + MX6DL_PAD_GPIO_4 = 139, + MX6DL_PAD_GPIO_5 = 140, + MX6DL_PAD_GPIO_6 = 141, + MX6DL_PAD_GPIO_7 = 142, + MX6DL_PAD_GPIO_8 = 143, + MX6DL_PAD_GPIO_9 = 144, + MX6DL_PAD_KEY_COL0 = 145, + MX6DL_PAD_KEY_COL1 = 146, + MX6DL_PAD_KEY_COL2 = 147, + MX6DL_PAD_KEY_COL3 = 148, + MX6DL_PAD_KEY_COL4 = 149, + MX6DL_PAD_KEY_ROW0 = 150, + MX6DL_PAD_KEY_ROW1 = 151, + MX6DL_PAD_KEY_ROW2 = 152, + MX6DL_PAD_KEY_ROW3 = 153, + MX6DL_PAD_KEY_ROW4 = 154, + MX6DL_PAD_NANDF_ALE = 155, + MX6DL_PAD_NANDF_CLE = 156, + MX6DL_PAD_NANDF_CS0 = 157, + MX6DL_PAD_NANDF_CS1 = 158, + MX6DL_PAD_NANDF_CS2 = 159, + MX6DL_PAD_NANDF_CS3 = 160, + MX6DL_PAD_NANDF_D0 = 161, + MX6DL_PAD_NANDF_D1 = 162, + MX6DL_PAD_NANDF_D2 = 163, + MX6DL_PAD_NANDF_D3 = 164, + MX6DL_PAD_NANDF_D4 = 165, + MX6DL_PAD_NANDF_D5 = 166, + MX6DL_PAD_NANDF_D6 = 167, + MX6DL_PAD_NANDF_D7 = 168, + MX6DL_PAD_NANDF_RB0 = 169, + MX6DL_PAD_NANDF_WP_B = 170, + MX6DL_PAD_RGMII_RD0 = 171, + MX6DL_PAD_RGMII_RD1 = 172, + MX6DL_PAD_RGMII_RD2 = 173, + MX6DL_PAD_RGMII_RD3 = 174, + MX6DL_PAD_RGMII_RX_CTL = 175, + MX6DL_PAD_RGMII_RXC = 176, + MX6DL_PAD_RGMII_TD0 = 177, + MX6DL_PAD_RGMII_TD1 = 178, + MX6DL_PAD_RGMII_TD2 = 179, + MX6DL_PAD_RGMII_TD3 = 180, + MX6DL_PAD_RGMII_TX_CTL = 181, + MX6DL_PAD_RGMII_TXC = 182, + MX6DL_PAD_SD1_CLK = 183, + MX6DL_PAD_SD1_CMD = 184, + MX6DL_PAD_SD1_DAT0 = 185, + MX6DL_PAD_SD1_DAT1 = 186, + MX6DL_PAD_SD1_DAT2 = 187, + MX6DL_PAD_SD1_DAT3 = 188, + MX6DL_PAD_SD2_CLK = 189, + MX6DL_PAD_SD2_CMD = 190, + MX6DL_PAD_SD2_DAT0 = 191, + MX6DL_PAD_SD2_DAT1 = 192, + MX6DL_PAD_SD2_DAT2 = 193, + MX6DL_PAD_SD2_DAT3 = 194, + MX6DL_PAD_SD3_CLK = 195, + MX6DL_PAD_SD3_CMD = 196, + MX6DL_PAD_SD3_DAT0 = 197, + MX6DL_PAD_SD3_DAT1 = 198, + MX6DL_PAD_SD3_DAT2 = 199, + MX6DL_PAD_SD3_DAT3 = 200, + MX6DL_PAD_SD3_DAT4 = 201, + MX6DL_PAD_SD3_DAT5 = 202, + MX6DL_PAD_SD3_DAT6 = 203, + MX6DL_PAD_SD3_DAT7 = 204, + MX6DL_PAD_SD3_RST = 205, + MX6DL_PAD_SD4_CLK = 206, + MX6DL_PAD_SD4_CMD = 207, + MX6DL_PAD_SD4_DAT0 = 208, + MX6DL_PAD_SD4_DAT1 = 209, + MX6DL_PAD_SD4_DAT2 = 210, + MX6DL_PAD_SD4_DAT3 = 211, + MX6DL_PAD_SD4_DAT4 = 212, + MX6DL_PAD_SD4_DAT5 = 213, + MX6DL_PAD_SD4_DAT6 = 214, + MX6DL_PAD_SD4_DAT7 = 215, +}; + +enum imx6sl_pads { + MX6SL_PAD_RESERVE0 = 0, + MX6SL_PAD_RESERVE1 = 1, + MX6SL_PAD_RESERVE2 = 2, + MX6SL_PAD_RESERVE3 = 3, + MX6SL_PAD_RESERVE4 = 4, + MX6SL_PAD_RESERVE5 = 5, + MX6SL_PAD_RESERVE6 = 6, + MX6SL_PAD_RESERVE7 = 7, + MX6SL_PAD_RESERVE8 = 8, + MX6SL_PAD_RESERVE9 = 9, + MX6SL_PAD_RESERVE10 = 10, + MX6SL_PAD_RESERVE11 = 11, + MX6SL_PAD_RESERVE12 = 12, + MX6SL_PAD_RESERVE13 = 13, + MX6SL_PAD_RESERVE14 = 14, + MX6SL_PAD_RESERVE15 = 15, + MX6SL_PAD_RESERVE16 = 16, + MX6SL_PAD_RESERVE17 = 17, + MX6SL_PAD_RESERVE18 = 18, + MX6SL_PAD_AUD_MCLK = 19, + MX6SL_PAD_AUD_RXC = 20, + MX6SL_PAD_AUD_RXD = 21, + MX6SL_PAD_AUD_RXFS = 22, + MX6SL_PAD_AUD_TXC = 23, + MX6SL_PAD_AUD_TXD = 24, + MX6SL_PAD_AUD_TXFS = 25, + MX6SL_PAD_ECSPI1_MISO = 26, + MX6SL_PAD_ECSPI1_MOSI = 27, + MX6SL_PAD_ECSPI1_SCLK = 28, + MX6SL_PAD_ECSPI1_SS0 = 29, + MX6SL_PAD_ECSPI2_MISO = 30, + MX6SL_PAD_ECSPI2_MOSI = 31, + MX6SL_PAD_ECSPI2_SCLK = 32, + MX6SL_PAD_ECSPI2_SS0 = 33, + MX6SL_PAD_EPDC_BDR0 = 34, + MX6SL_PAD_EPDC_BDR1 = 35, + MX6SL_PAD_EPDC_D0 = 36, + MX6SL_PAD_EPDC_D1 = 37, + MX6SL_PAD_EPDC_D10 = 38, + MX6SL_PAD_EPDC_D11 = 39, + MX6SL_PAD_EPDC_D12 = 40, + MX6SL_PAD_EPDC_D13 = 41, + MX6SL_PAD_EPDC_D14 = 42, + MX6SL_PAD_EPDC_D15 = 43, + MX6SL_PAD_EPDC_D2 = 44, + MX6SL_PAD_EPDC_D3 = 45, + MX6SL_PAD_EPDC_D4 = 46, + MX6SL_PAD_EPDC_D5 = 47, + MX6SL_PAD_EPDC_D6 = 48, + MX6SL_PAD_EPDC_D7 = 49, + MX6SL_PAD_EPDC_D8 = 50, + MX6SL_PAD_EPDC_D9 = 51, + MX6SL_PAD_EPDC_GDCLK = 52, + MX6SL_PAD_EPDC_GDOE = 53, + MX6SL_PAD_EPDC_GDRL = 54, + MX6SL_PAD_EPDC_GDSP = 55, + MX6SL_PAD_EPDC_PWRCOM = 56, + MX6SL_PAD_EPDC_PWRCTRL0 = 57, + MX6SL_PAD_EPDC_PWRCTRL1 = 58, + MX6SL_PAD_EPDC_PWRCTRL2 = 59, + MX6SL_PAD_EPDC_PWRCTRL3 = 60, + MX6SL_PAD_EPDC_PWRINT = 61, + MX6SL_PAD_EPDC_PWRSTAT = 62, + MX6SL_PAD_EPDC_PWRWAKEUP = 63, + MX6SL_PAD_EPDC_SDCE0 = 64, + MX6SL_PAD_EPDC_SDCE1 = 65, + MX6SL_PAD_EPDC_SDCE2 = 66, + MX6SL_PAD_EPDC_SDCE3 = 67, + MX6SL_PAD_EPDC_SDCLK = 68, + MX6SL_PAD_EPDC_SDLE = 69, + MX6SL_PAD_EPDC_SDOE = 70, + MX6SL_PAD_EPDC_SDSHR = 71, + MX6SL_PAD_EPDC_VCOM0 = 72, + MX6SL_PAD_EPDC_VCOM1 = 73, + MX6SL_PAD_FEC_CRS_DV = 74, + MX6SL_PAD_FEC_MDC = 75, + MX6SL_PAD_FEC_MDIO = 76, + MX6SL_PAD_FEC_REF_CLK = 77, + MX6SL_PAD_FEC_RX_ER = 78, + MX6SL_PAD_FEC_RXD0 = 79, + MX6SL_PAD_FEC_RXD1 = 80, + MX6SL_PAD_FEC_TX_CLK = 81, + MX6SL_PAD_FEC_TX_EN = 82, + MX6SL_PAD_FEC_TXD0 = 83, + MX6SL_PAD_FEC_TXD1 = 84, + MX6SL_PAD_HSIC_DAT = 85, + MX6SL_PAD_HSIC_STROBE = 86, + MX6SL_PAD_I2C1_SCL = 87, + MX6SL_PAD_I2C1_SDA = 88, + MX6SL_PAD_I2C2_SCL = 89, + MX6SL_PAD_I2C2_SDA = 90, + MX6SL_PAD_KEY_COL0 = 91, + MX6SL_PAD_KEY_COL1 = 92, + MX6SL_PAD_KEY_COL2 = 93, + MX6SL_PAD_KEY_COL3 = 94, + MX6SL_PAD_KEY_COL4 = 95, + MX6SL_PAD_KEY_COL5 = 96, + MX6SL_PAD_KEY_COL6 = 97, + MX6SL_PAD_KEY_COL7 = 98, + MX6SL_PAD_KEY_ROW0 = 99, + MX6SL_PAD_KEY_ROW1 = 100, + MX6SL_PAD_KEY_ROW2 = 101, + MX6SL_PAD_KEY_ROW3 = 102, + MX6SL_PAD_KEY_ROW4 = 103, + MX6SL_PAD_KEY_ROW5 = 104, + MX6SL_PAD_KEY_ROW6 = 105, + MX6SL_PAD_KEY_ROW7 = 106, + MX6SL_PAD_LCD_CLK = 107, + MX6SL_PAD_LCD_DAT0 = 108, + MX6SL_PAD_LCD_DAT1 = 109, + MX6SL_PAD_LCD_DAT10 = 110, + MX6SL_PAD_LCD_DAT11 = 111, + MX6SL_PAD_LCD_DAT12 = 112, + MX6SL_PAD_LCD_DAT13 = 113, + MX6SL_PAD_LCD_DAT14 = 114, + MX6SL_PAD_LCD_DAT15 = 115, + MX6SL_PAD_LCD_DAT16 = 116, + MX6SL_PAD_LCD_DAT17 = 117, + MX6SL_PAD_LCD_DAT18 = 118, + MX6SL_PAD_LCD_DAT19 = 119, + MX6SL_PAD_LCD_DAT2 = 120, + MX6SL_PAD_LCD_DAT20 = 121, + MX6SL_PAD_LCD_DAT21 = 122, + MX6SL_PAD_LCD_DAT22 = 123, + MX6SL_PAD_LCD_DAT23 = 124, + MX6SL_PAD_LCD_DAT3 = 125, + MX6SL_PAD_LCD_DAT4 = 126, + MX6SL_PAD_LCD_DAT5 = 127, + MX6SL_PAD_LCD_DAT6 = 128, + MX6SL_PAD_LCD_DAT7 = 129, + MX6SL_PAD_LCD_DAT8 = 130, + MX6SL_PAD_LCD_DAT9 = 131, + MX6SL_PAD_LCD_ENABLE = 132, + MX6SL_PAD_LCD_HSYNC = 133, + MX6SL_PAD_LCD_RESET = 134, + MX6SL_PAD_LCD_VSYNC = 135, + MX6SL_PAD_PWM1 = 136, + MX6SL_PAD_REF_CLK_24M = 137, + MX6SL_PAD_REF_CLK_32K = 138, + MX6SL_PAD_SD1_CLK = 139, + MX6SL_PAD_SD1_CMD = 140, + MX6SL_PAD_SD1_DAT0 = 141, + MX6SL_PAD_SD1_DAT1 = 142, + MX6SL_PAD_SD1_DAT2 = 143, + MX6SL_PAD_SD1_DAT3 = 144, + MX6SL_PAD_SD1_DAT4 = 145, + MX6SL_PAD_SD1_DAT5 = 146, + MX6SL_PAD_SD1_DAT6 = 147, + MX6SL_PAD_SD1_DAT7 = 148, + MX6SL_PAD_SD2_CLK = 149, + MX6SL_PAD_SD2_CMD = 150, + MX6SL_PAD_SD2_DAT0 = 151, + MX6SL_PAD_SD2_DAT1 = 152, + MX6SL_PAD_SD2_DAT2 = 153, + MX6SL_PAD_SD2_DAT3 = 154, + MX6SL_PAD_SD2_DAT4 = 155, + MX6SL_PAD_SD2_DAT5 = 156, + MX6SL_PAD_SD2_DAT6 = 157, + MX6SL_PAD_SD2_DAT7 = 158, + MX6SL_PAD_SD2_RST = 159, + MX6SL_PAD_SD3_CLK = 160, + MX6SL_PAD_SD3_CMD = 161, + MX6SL_PAD_SD3_DAT0 = 162, + MX6SL_PAD_SD3_DAT1 = 163, + MX6SL_PAD_SD3_DAT2 = 164, + MX6SL_PAD_SD3_DAT3 = 165, + MX6SL_PAD_UART1_RXD = 166, + MX6SL_PAD_UART1_TXD = 167, + MX6SL_PAD_WDOG_B = 168, +}; + +enum imx6sll_pads { + MX6SLL_PAD_RESERVE0 = 0, + MX6SLL_PAD_RESERVE1 = 1, + MX6SLL_PAD_RESERVE2 = 2, + MX6SLL_PAD_RESERVE3 = 3, + MX6SLL_PAD_RESERVE4 = 4, + MX6SLL_PAD_WDOG_B = 5, + MX6SLL_PAD_REF_CLK_24M = 6, + MX6SLL_PAD_REF_CLK_32K = 7, + MX6SLL_PAD_PWM1 = 8, + MX6SLL_PAD_KEY_COL0 = 9, + MX6SLL_PAD_KEY_ROW0 = 10, + MX6SLL_PAD_KEY_COL1 = 11, + MX6SLL_PAD_KEY_ROW1 = 12, + MX6SLL_PAD_KEY_COL2 = 13, + MX6SLL_PAD_KEY_ROW2 = 14, + MX6SLL_PAD_KEY_COL3 = 15, + MX6SLL_PAD_KEY_ROW3 = 16, + MX6SLL_PAD_KEY_COL4 = 17, + MX6SLL_PAD_KEY_ROW4 = 18, + MX6SLL_PAD_KEY_COL5 = 19, + MX6SLL_PAD_KEY_ROW5 = 20, + MX6SLL_PAD_KEY_COL6 = 21, + MX6SLL_PAD_KEY_ROW6 = 22, + MX6SLL_PAD_KEY_COL7 = 23, + MX6SLL_PAD_KEY_ROW7 = 24, + MX6SLL_PAD_EPDC_DATA00 = 25, + MX6SLL_PAD_EPDC_DATA01 = 26, + MX6SLL_PAD_EPDC_DATA02 = 27, + MX6SLL_PAD_EPDC_DATA03 = 28, + MX6SLL_PAD_EPDC_DATA04 = 29, + MX6SLL_PAD_EPDC_DATA05 = 30, + MX6SLL_PAD_EPDC_DATA06 = 31, + MX6SLL_PAD_EPDC_DATA07 = 32, + MX6SLL_PAD_EPDC_DATA08 = 33, + MX6SLL_PAD_EPDC_DATA09 = 34, + MX6SLL_PAD_EPDC_DATA10 = 35, + MX6SLL_PAD_EPDC_DATA11 = 36, + MX6SLL_PAD_EPDC_DATA12 = 37, + MX6SLL_PAD_EPDC_DATA13 = 38, + MX6SLL_PAD_EPDC_DATA14 = 39, + MX6SLL_PAD_EPDC_DATA15 = 40, + MX6SLL_PAD_EPDC_SDCLK = 41, + MX6SLL_PAD_EPDC_SDLE = 42, + MX6SLL_PAD_EPDC_SDOE = 43, + MX6SLL_PAD_EPDC_SDSHR = 44, + MX6SLL_PAD_EPDC_SDCE0 = 45, + MX6SLL_PAD_EPDC_SDCE1 = 46, + MX6SLL_PAD_EPDC_SDCE2 = 47, + MX6SLL_PAD_EPDC_SDCE3 = 48, + MX6SLL_PAD_EPDC_GDCLK = 49, + MX6SLL_PAD_EPDC_GDOE = 50, + MX6SLL_PAD_EPDC_GDRL = 51, + MX6SLL_PAD_EPDC_GDSP = 52, + MX6SLL_PAD_EPDC_VCOM0 = 53, + MX6SLL_PAD_EPDC_VCOM1 = 54, + MX6SLL_PAD_EPDC_BDR0 = 55, + MX6SLL_PAD_EPDC_BDR1 = 56, + MX6SLL_PAD_EPDC_PWR_CTRL0 = 57, + MX6SLL_PAD_EPDC_PWR_CTRL1 = 58, + MX6SLL_PAD_EPDC_PWR_CTRL2 = 59, + MX6SLL_PAD_EPDC_PWR_CTRL3 = 60, + MX6SLL_PAD_EPDC_PWR_COM = 61, + MX6SLL_PAD_EPDC_PWR_INT = 62, + MX6SLL_PAD_EPDC_PWR_STAT = 63, + MX6SLL_PAD_EPDC_PWR_WAKE = 64, + MX6SLL_PAD_LCD_CLK = 65, + MX6SLL_PAD_LCD_ENABLE = 66, + MX6SLL_PAD_LCD_HSYNC = 67, + MX6SLL_PAD_LCD_VSYNC = 68, + MX6SLL_PAD_LCD_RESET = 69, + MX6SLL_PAD_LCD_DATA00 = 70, + MX6SLL_PAD_LCD_DATA01 = 71, + MX6SLL_PAD_LCD_DATA02 = 72, + MX6SLL_PAD_LCD_DATA03 = 73, + MX6SLL_PAD_LCD_DATA04 = 74, + MX6SLL_PAD_LCD_DATA05 = 75, + MX6SLL_PAD_LCD_DATA06 = 76, + MX6SLL_PAD_LCD_DATA07 = 77, + MX6SLL_PAD_LCD_DATA08 = 78, + MX6SLL_PAD_LCD_DATA09 = 79, + MX6SLL_PAD_LCD_DATA10 = 80, + MX6SLL_PAD_LCD_DATA11 = 81, + MX6SLL_PAD_LCD_DATA12 = 82, + MX6SLL_PAD_LCD_DATA13 = 83, + MX6SLL_PAD_LCD_DATA14 = 84, + MX6SLL_PAD_LCD_DATA15 = 85, + MX6SLL_PAD_LCD_DATA16 = 86, + MX6SLL_PAD_LCD_DATA17 = 87, + MX6SLL_PAD_LCD_DATA18 = 88, + MX6SLL_PAD_LCD_DATA19 = 89, + MX6SLL_PAD_LCD_DATA20 = 90, + MX6SLL_PAD_LCD_DATA21 = 91, + MX6SLL_PAD_LCD_DATA22 = 92, + MX6SLL_PAD_LCD_DATA23 = 93, + MX6SLL_PAD_AUD_RXFS = 94, + MX6SLL_PAD_AUD_RXC = 95, + MX6SLL_PAD_AUD_RXD = 96, + MX6SLL_PAD_AUD_TXC = 97, + MX6SLL_PAD_AUD_TXFS = 98, + MX6SLL_PAD_AUD_TXD = 99, + MX6SLL_PAD_AUD_MCLK = 100, + MX6SLL_PAD_UART1_RXD = 101, + MX6SLL_PAD_UART1_TXD = 102, + MX6SLL_PAD_I2C1_SCL = 103, + MX6SLL_PAD_I2C1_SDA = 104, + MX6SLL_PAD_I2C2_SCL = 105, + MX6SLL_PAD_I2C2_SDA = 106, + MX6SLL_PAD_ECSPI1_SCLK = 107, + MX6SLL_PAD_ECSPI1_MOSI = 108, + MX6SLL_PAD_ECSPI1_MISO = 109, + MX6SLL_PAD_ECSPI1_SS0 = 110, + MX6SLL_PAD_ECSPI2_SCLK = 111, + MX6SLL_PAD_ECSPI2_MOSI = 112, + MX6SLL_PAD_ECSPI2_MISO = 113, + MX6SLL_PAD_ECSPI2_SS0 = 114, + MX6SLL_PAD_SD1_CLK = 115, + MX6SLL_PAD_SD1_CMD = 116, + MX6SLL_PAD_SD1_DATA0 = 117, + MX6SLL_PAD_SD1_DATA1 = 118, + MX6SLL_PAD_SD1_DATA2 = 119, + MX6SLL_PAD_SD1_DATA3 = 120, + MX6SLL_PAD_SD1_DATA4 = 121, + MX6SLL_PAD_SD1_DATA5 = 122, + MX6SLL_PAD_SD1_DATA6 = 123, + MX6SLL_PAD_SD1_DATA7 = 124, + MX6SLL_PAD_SD2_RESET = 125, + MX6SLL_PAD_SD2_CLK = 126, + MX6SLL_PAD_SD2_CMD = 127, + MX6SLL_PAD_SD2_DATA0 = 128, + MX6SLL_PAD_SD2_DATA1 = 129, + MX6SLL_PAD_SD2_DATA2 = 130, + MX6SLL_PAD_SD2_DATA3 = 131, + MX6SLL_PAD_SD2_DATA4 = 132, + MX6SLL_PAD_SD2_DATA5 = 133, + MX6SLL_PAD_SD2_DATA6 = 134, + MX6SLL_PAD_SD2_DATA7 = 135, + MX6SLL_PAD_SD3_CLK = 136, + MX6SLL_PAD_SD3_CMD = 137, + MX6SLL_PAD_SD3_DATA0 = 138, + MX6SLL_PAD_SD3_DATA1 = 139, + MX6SLL_PAD_SD3_DATA2 = 140, + MX6SLL_PAD_SD3_DATA3 = 141, + MX6SLL_PAD_GPIO4_IO20 = 142, + MX6SLL_PAD_GPIO4_IO21 = 143, + MX6SLL_PAD_GPIO4_IO19 = 144, + MX6SLL_PAD_GPIO4_IO25 = 145, + MX6SLL_PAD_GPIO4_IO18 = 146, + MX6SLL_PAD_GPIO4_IO24 = 147, + MX6SLL_PAD_GPIO4_IO23 = 148, + MX6SLL_PAD_GPIO4_IO17 = 149, + MX6SLL_PAD_GPIO4_IO22 = 150, + MX6SLL_PAD_GPIO4_IO16 = 151, + MX6SLL_PAD_GPIO4_IO26 = 152, +}; + +enum imx6sx_pads { + MX6Sx_PAD_RESERVE0 = 0, + MX6Sx_PAD_RESERVE1 = 1, + MX6Sx_PAD_RESERVE2 = 2, + MX6Sx_PAD_RESERVE3 = 3, + MX6Sx_PAD_RESERVE4 = 4, + MX6SX_PAD_GPIO1_IO00 = 5, + MX6SX_PAD_GPIO1_IO01 = 6, + MX6SX_PAD_GPIO1_IO02 = 7, + MX6SX_PAD_GPIO1_IO03 = 8, + MX6SX_PAD_GPIO1_IO04 = 9, + MX6SX_PAD_GPIO1_IO05 = 10, + MX6SX_PAD_GPIO1_IO06 = 11, + MX6SX_PAD_GPIO1_IO07 = 12, + MX6SX_PAD_GPIO1_IO08 = 13, + MX6SX_PAD_GPIO1_IO09 = 14, + MX6SX_PAD_GPIO1_IO10 = 15, + MX6SX_PAD_GPIO1_IO11 = 16, + MX6SX_PAD_GPIO1_IO12 = 17, + MX6SX_PAD_GPIO1_IO13 = 18, + MX6SX_PAD_CSI_DATA00 = 19, + MX6SX_PAD_CSI_DATA01 = 20, + MX6SX_PAD_CSI_DATA02 = 21, + MX6SX_PAD_CSI_DATA03 = 22, + MX6SX_PAD_CSI_DATA04 = 23, + MX6SX_PAD_CSI_DATA05 = 24, + MX6SX_PAD_CSI_DATA06 = 25, + MX6SX_PAD_CSI_DATA07 = 26, + MX6SX_PAD_CSI_HSYNC = 27, + MX6SX_PAD_CSI_MCLK = 28, + MX6SX_PAD_CSI_PIXCLK = 29, + MX6SX_PAD_CSI_VSYNC = 30, + MX6SX_PAD_ENET1_COL = 31, + MX6SX_PAD_ENET1_CRS = 32, + MX6SX_PAD_ENET1_MDC = 33, + MX6SX_PAD_ENET1_MDIO = 34, + MX6SX_PAD_ENET1_RX_CLK = 35, + MX6SX_PAD_ENET1_TX_CLK = 36, + MX6SX_PAD_ENET2_COL = 37, + MX6SX_PAD_ENET2_CRS = 38, + MX6SX_PAD_ENET2_RX_CLK = 39, + MX6SX_PAD_ENET2_TX_CLK = 40, + MX6SX_PAD_KEY_COL0 = 41, + MX6SX_PAD_KEY_COL1 = 42, + MX6SX_PAD_KEY_COL2 = 43, + MX6SX_PAD_KEY_COL3 = 44, + MX6SX_PAD_KEY_COL4 = 45, + MX6SX_PAD_KEY_ROW0 = 46, + MX6SX_PAD_KEY_ROW1 = 47, + MX6SX_PAD_KEY_ROW2 = 48, + MX6SX_PAD_KEY_ROW3 = 49, + MX6SX_PAD_KEY_ROW4 = 50, + MX6SX_PAD_LCD1_CLK = 51, + MX6SX_PAD_LCD1_DATA00 = 52, + MX6SX_PAD_LCD1_DATA01 = 53, + MX6SX_PAD_LCD1_DATA02 = 54, + MX6SX_PAD_LCD1_DATA03 = 55, + MX6SX_PAD_LCD1_DATA04 = 56, + MX6SX_PAD_LCD1_DATA05 = 57, + MX6SX_PAD_LCD1_DATA06 = 58, + MX6SX_PAD_LCD1_DATA07 = 59, + MX6SX_PAD_LCD1_DATA08 = 60, + MX6SX_PAD_LCD1_DATA09 = 61, + MX6SX_PAD_LCD1_DATA10 = 62, + MX6SX_PAD_LCD1_DATA11 = 63, + MX6SX_PAD_LCD1_DATA12 = 64, + MX6SX_PAD_LCD1_DATA13 = 65, + MX6SX_PAD_LCD1_DATA14 = 66, + MX6SX_PAD_LCD1_DATA15 = 67, + MX6SX_PAD_LCD1_DATA16 = 68, + MX6SX_PAD_LCD1_DATA17 = 69, + MX6SX_PAD_LCD1_DATA18 = 70, + MX6SX_PAD_LCD1_DATA19 = 71, + MX6SX_PAD_LCD1_DATA20 = 72, + MX6SX_PAD_LCD1_DATA21 = 73, + MX6SX_PAD_LCD1_DATA22 = 74, + MX6SX_PAD_LCD1_DATA23 = 75, + MX6SX_PAD_LCD1_ENABLE = 76, + MX6SX_PAD_LCD1_HSYNC = 77, + MX6SX_PAD_LCD1_RESET = 78, + MX6SX_PAD_LCD1_VSYNC = 79, + MX6SX_PAD_NAND_ALE = 80, + MX6SX_PAD_NAND_CE0_B = 81, + MX6SX_PAD_NAND_CE1_B = 82, + MX6SX_PAD_NAND_CLE = 83, + MX6SX_PAD_NAND_DATA00 = 84, + MX6SX_PAD_NAND_DATA01 = 85, + MX6SX_PAD_NAND_DATA02 = 86, + MX6SX_PAD_NAND_DATA03 = 87, + MX6SX_PAD_NAND_DATA04 = 88, + MX6SX_PAD_NAND_DATA05 = 89, + MX6SX_PAD_NAND_DATA06 = 90, + MX6SX_PAD_NAND_DATA07 = 91, + MX6SX_PAD_NAND_RE_B = 92, + MX6SX_PAD_NAND_READY_B = 93, + MX6SX_PAD_NAND_WE_B = 94, + MX6SX_PAD_NAND_WP_B = 95, + MX6SX_PAD_QSPI1A_DATA0 = 96, + MX6SX_PAD_QSPI1A_DATA1 = 97, + MX6SX_PAD_QSPI1A_DATA2 = 98, + MX6SX_PAD_QSPI1A_DATA3 = 99, + MX6SX_PAD_QSPI1A_DQS = 100, + MX6SX_PAD_QSPI1A_SCLK = 101, + MX6SX_PAD_QSPI1A_SS0_B = 102, + MX6SX_PAD_QSPI1A_SS1_B = 103, + MX6SX_PAD_QSPI1B_DATA0 = 104, + MX6SX_PAD_QSPI1B_DATA1 = 105, + MX6SX_PAD_QSPI1B_DATA2 = 106, + MX6SX_PAD_QSPI1B_DATA3 = 107, + MX6SX_PAD_QSPI1B_DQS = 108, + MX6SX_PAD_QSPI1B_SCLK = 109, + MX6SX_PAD_QSPI1B_SS0_B = 110, + MX6SX_PAD_QSPI1B_SS1_B = 111, + MX6SX_PAD_RGMII1_RD0 = 112, + MX6SX_PAD_RGMII1_RD1 = 113, + MX6SX_PAD_RGMII1_RD2 = 114, + MX6SX_PAD_RGMII1_RD3 = 115, + MX6SX_PAD_RGMII1_RX_CTL = 116, + MX6SX_PAD_RGMII1_RXC = 117, + MX6SX_PAD_RGMII1_TD0 = 118, + MX6SX_PAD_RGMII1_TD1 = 119, + MX6SX_PAD_RGMII1_TD2 = 120, + MX6SX_PAD_RGMII1_TD3 = 121, + MX6SX_PAD_RGMII1_TX_CTL = 122, + MX6SX_PAD_RGMII1_TXC = 123, + MX6SX_PAD_RGMII2_RD0 = 124, + MX6SX_PAD_RGMII2_RD1 = 125, + MX6SX_PAD_RGMII2_RD2 = 126, + MX6SX_PAD_RGMII2_RD3 = 127, + MX6SX_PAD_RGMII2_RX_CTL = 128, + MX6SX_PAD_RGMII2_RXC = 129, + MX6SX_PAD_RGMII2_TD0 = 130, + MX6SX_PAD_RGMII2_TD1 = 131, + MX6SX_PAD_RGMII2_TD2 = 132, + MX6SX_PAD_RGMII2_TD3 = 133, + MX6SX_PAD_RGMII2_TX_CTL = 134, + MX6SX_PAD_RGMII2_TXC = 135, + MX6SX_PAD_SD1_CLK = 136, + MX6SX_PAD_SD1_CMD = 137, + MX6SX_PAD_SD1_DATA0 = 138, + MX6SX_PAD_SD1_DATA1 = 139, + MX6SX_PAD_SD1_DATA2 = 140, + MX6SX_PAD_SD1_DATA3 = 141, + MX6SX_PAD_SD2_CLK = 142, + MX6SX_PAD_SD2_CMD = 143, + MX6SX_PAD_SD2_DATA0 = 144, + MX6SX_PAD_SD2_DATA1 = 145, + MX6SX_PAD_SD2_DATA2 = 146, + MX6SX_PAD_SD2_DATA3 = 147, + MX6SX_PAD_SD3_CLK = 148, + MX6SX_PAD_SD3_CMD = 149, + MX6SX_PAD_SD3_DATA0 = 150, + MX6SX_PAD_SD3_DATA1 = 151, + MX6SX_PAD_SD3_DATA2 = 152, + MX6SX_PAD_SD3_DATA3 = 153, + MX6SX_PAD_SD3_DATA4 = 154, + MX6SX_PAD_SD3_DATA5 = 155, + MX6SX_PAD_SD3_DATA6 = 156, + MX6SX_PAD_SD3_DATA7 = 157, + MX6SX_PAD_SD4_CLK = 158, + MX6SX_PAD_SD4_CMD = 159, + MX6SX_PAD_SD4_DATA0 = 160, + MX6SX_PAD_SD4_DATA1 = 161, + MX6SX_PAD_SD4_DATA2 = 162, + MX6SX_PAD_SD4_DATA3 = 163, + MX6SX_PAD_SD4_DATA4 = 164, + MX6SX_PAD_SD4_DATA5 = 165, + MX6SX_PAD_SD4_DATA6 = 166, + MX6SX_PAD_SD4_DATA7 = 167, + MX6SX_PAD_SD4_RESET_B = 168, + MX6SX_PAD_USB_H_DATA = 169, + MX6SX_PAD_USB_H_STROBE = 170, +}; + +enum imx6ul_pads { + MX6UL_PAD_RESERVE0 = 0, + MX6UL_PAD_RESERVE1 = 1, + MX6UL_PAD_RESERVE2 = 2, + MX6UL_PAD_RESERVE3 = 3, + MX6UL_PAD_RESERVE4 = 4, + MX6UL_PAD_RESERVE5 = 5, + MX6UL_PAD_RESERVE6 = 6, + MX6UL_PAD_RESERVE7 = 7, + MX6UL_PAD_RESERVE8 = 8, + MX6UL_PAD_RESERVE9 = 9, + MX6UL_PAD_RESERVE10 = 10, + MX6UL_PAD_SNVS_TAMPER4 = 11, + MX6UL_PAD_RESERVE12 = 12, + MX6UL_PAD_RESERVE13 = 13, + MX6UL_PAD_RESERVE14 = 14, + MX6UL_PAD_RESERVE15 = 15, + MX6UL_PAD_RESERVE16 = 16, + MX6UL_PAD_JTAG_MOD = 17, + MX6UL_PAD_JTAG_TMS = 18, + MX6UL_PAD_JTAG_TDO = 19, + MX6UL_PAD_JTAG_TDI = 20, + MX6UL_PAD_JTAG_TCK = 21, + MX6UL_PAD_JTAG_TRST_B = 22, + MX6UL_PAD_GPIO1_IO00 = 23, + MX6UL_PAD_GPIO1_IO01 = 24, + MX6UL_PAD_GPIO1_IO02 = 25, + MX6UL_PAD_GPIO1_IO03 = 26, + MX6UL_PAD_GPIO1_IO04 = 27, + MX6UL_PAD_GPIO1_IO05 = 28, + MX6UL_PAD_GPIO1_IO06 = 29, + MX6UL_PAD_GPIO1_IO07 = 30, + MX6UL_PAD_GPIO1_IO08 = 31, + MX6UL_PAD_GPIO1_IO09 = 32, + MX6UL_PAD_UART1_TX_DATA = 33, + MX6UL_PAD_UART1_RX_DATA = 34, + MX6UL_PAD_UART1_CTS_B = 35, + MX6UL_PAD_UART1_RTS_B = 36, + MX6UL_PAD_UART2_TX_DATA = 37, + MX6UL_PAD_UART2_RX_DATA = 38, + MX6UL_PAD_UART2_CTS_B = 39, + MX6UL_PAD_UART2_RTS_B = 40, + MX6UL_PAD_UART3_TX_DATA = 41, + MX6UL_PAD_UART3_RX_DATA = 42, + MX6UL_PAD_UART3_CTS_B = 43, + MX6UL_PAD_UART3_RTS_B = 44, + MX6UL_PAD_UART4_TX_DATA = 45, + MX6UL_PAD_UART4_RX_DATA = 46, + MX6UL_PAD_UART5_TX_DATA = 47, + MX6UL_PAD_UART5_RX_DATA = 48, + MX6UL_PAD_ENET1_RX_DATA0 = 49, + MX6UL_PAD_ENET1_RX_DATA1 = 50, + MX6UL_PAD_ENET1_RX_EN = 51, + MX6UL_PAD_ENET1_TX_DATA0 = 52, + MX6UL_PAD_ENET1_TX_DATA1 = 53, + MX6UL_PAD_ENET1_TX_EN = 54, + MX6UL_PAD_ENET1_TX_CLK = 55, + MX6UL_PAD_ENET1_RX_ER = 56, + MX6UL_PAD_ENET2_RX_DATA0 = 57, + MX6UL_PAD_ENET2_RX_DATA1 = 58, + MX6UL_PAD_ENET2_RX_EN = 59, + MX6UL_PAD_ENET2_TX_DATA0 = 60, + MX6UL_PAD_ENET2_TX_DATA1 = 61, + MX6UL_PAD_ENET2_TX_EN = 62, + MX6UL_PAD_ENET2_TX_CLK = 63, + MX6UL_PAD_ENET2_RX_ER = 64, + MX6UL_PAD_LCD_CLK = 65, + MX6UL_PAD_LCD_ENABLE = 66, + MX6UL_PAD_LCD_HSYNC = 67, + MX6UL_PAD_LCD_VSYNC = 68, + MX6UL_PAD_LCD_RESET = 69, + MX6UL_PAD_LCD_DATA00 = 70, + MX6UL_PAD_LCD_DATA01 = 71, + MX6UL_PAD_LCD_DATA02 = 72, + MX6UL_PAD_LCD_DATA03 = 73, + MX6UL_PAD_LCD_DATA04 = 74, + MX6UL_PAD_LCD_DATA05 = 75, + MX6UL_PAD_LCD_DATA06 = 76, + MX6UL_PAD_LCD_DATA07 = 77, + MX6UL_PAD_LCD_DATA08 = 78, + MX6UL_PAD_LCD_DATA09 = 79, + MX6UL_PAD_LCD_DATA10 = 80, + MX6UL_PAD_LCD_DATA11 = 81, + MX6UL_PAD_LCD_DATA12 = 82, + MX6UL_PAD_LCD_DATA13 = 83, + MX6UL_PAD_LCD_DATA14 = 84, + MX6UL_PAD_LCD_DATA15 = 85, + MX6UL_PAD_LCD_DATA16 = 86, + MX6UL_PAD_LCD_DATA17 = 87, + MX6UL_PAD_LCD_DATA18 = 88, + MX6UL_PAD_LCD_DATA19 = 89, + MX6UL_PAD_LCD_DATA20 = 90, + MX6UL_PAD_LCD_DATA21 = 91, + MX6UL_PAD_LCD_DATA22 = 92, + MX6UL_PAD_LCD_DATA23 = 93, + MX6UL_PAD_NAND_RE_B = 94, + MX6UL_PAD_NAND_WE_B = 95, + MX6UL_PAD_NAND_DATA00 = 96, + MX6UL_PAD_NAND_DATA01 = 97, + MX6UL_PAD_NAND_DATA02 = 98, + MX6UL_PAD_NAND_DATA03 = 99, + MX6UL_PAD_NAND_DATA04 = 100, + MX6UL_PAD_NAND_DATA05 = 101, + MX6UL_PAD_NAND_DATA06 = 102, + MX6UL_PAD_NAND_DATA07 = 103, + MX6UL_PAD_NAND_ALE = 104, + MX6UL_PAD_NAND_WP_B = 105, + MX6UL_PAD_NAND_READY_B = 106, + MX6UL_PAD_NAND_CE0_B = 107, + MX6UL_PAD_NAND_CE1_B = 108, + MX6UL_PAD_NAND_CLE = 109, + MX6UL_PAD_NAND_DQS = 110, + MX6UL_PAD_SD1_CMD = 111, + MX6UL_PAD_SD1_CLK = 112, + MX6UL_PAD_SD1_DATA0 = 113, + MX6UL_PAD_SD1_DATA1 = 114, + MX6UL_PAD_SD1_DATA2 = 115, + MX6UL_PAD_SD1_DATA3 = 116, + MX6UL_PAD_CSI_MCLK = 117, + MX6UL_PAD_CSI_PIXCLK = 118, + MX6UL_PAD_CSI_VSYNC = 119, + MX6UL_PAD_CSI_HSYNC = 120, + MX6UL_PAD_CSI_DATA00 = 121, + MX6UL_PAD_CSI_DATA01 = 122, + MX6UL_PAD_CSI_DATA02 = 123, + MX6UL_PAD_CSI_DATA03 = 124, + MX6UL_PAD_CSI_DATA04 = 125, + MX6UL_PAD_CSI_DATA05 = 126, + MX6UL_PAD_CSI_DATA06 = 127, + MX6UL_PAD_CSI_DATA07 = 128, +}; + +enum imx6ull_lpsr_pads { + MX6ULL_PAD_BOOT_MODE0 = 0, + MX6ULL_PAD_BOOT_MODE1 = 1, + MX6ULL_PAD_SNVS_TAMPER0 = 2, + MX6ULL_PAD_SNVS_TAMPER1 = 3, + MX6ULL_PAD_SNVS_TAMPER2 = 4, + MX6ULL_PAD_SNVS_TAMPER3 = 5, + MX6ULL_PAD_SNVS_TAMPER4 = 6, + MX6ULL_PAD_SNVS_TAMPER5 = 7, + MX6ULL_PAD_SNVS_TAMPER6 = 8, + MX6ULL_PAD_SNVS_TAMPER7 = 9, + MX6ULL_PAD_SNVS_TAMPER8 = 10, + MX6ULL_PAD_SNVS_TAMPER9 = 11, +}; + +struct meson_pmx_group { + const char *name; + const unsigned int *pins; + unsigned int num_pins; + const void *data; +}; + +struct meson_pmx_func { + const char *name; + const char * const *groups; + unsigned int num_groups; +}; + +struct meson_reg_desc { + unsigned int reg; + unsigned int bit; +}; + +enum meson_reg_type { + MESON_REG_PULLEN = 0, + MESON_REG_PULL = 1, + MESON_REG_DIR = 2, + MESON_REG_OUT = 3, + MESON_REG_IN = 4, + MESON_REG_DS = 5, + MESON_NUM_REG = 6, +}; + +enum meson_pinconf_drv { + MESON_PINCONF_DRV_500UA = 0, + MESON_PINCONF_DRV_2500UA = 1, + MESON_PINCONF_DRV_3000UA = 2, + MESON_PINCONF_DRV_4000UA = 3, +}; + +struct meson_bank { + const char *name; + unsigned int first; + unsigned int last; + int irq_first; + int irq_last; + struct meson_reg_desc regs[6]; +}; + +struct meson_pinctrl; + +struct meson_pinctrl_data { + const char *name; + const struct pinctrl_pin_desc *pins; + struct meson_pmx_group *groups; + struct meson_pmx_func *funcs; + unsigned int num_pins; + unsigned int num_groups; + unsigned int num_funcs; + struct meson_bank *banks; + unsigned int num_banks; + const struct pinmux_ops *pmx_ops; + void *pmx_data; + int (*parse_dt)(struct meson_pinctrl *); +}; + +struct meson_pinctrl { + struct device *dev; + struct pinctrl_dev *pcdev; + struct pinctrl_desc desc; + struct meson_pinctrl_data *data; + struct regmap *reg_mux; + struct regmap *reg_pullen; + struct regmap *reg_pull; + struct regmap *reg_gpio; + struct regmap *reg_ds; + struct gpio_chip chip; + struct fwnode_handle *fwnode; +}; + +struct meson8_pmx_data { + bool is_gpio; + unsigned int reg; + unsigned int bit; +}; + +struct mvebu_mpp_ctrl_data { + union { + void *base; + struct { + struct regmap *map; + u32 offset; + } regmap; + }; +}; + +struct mvebu_mpp_ctrl { + const char *name; + u8 pid; + u8 npins; + unsigned int *pins; + int (*mpp_get)(struct mvebu_mpp_ctrl_data *, unsigned int, long unsigned int *); + int (*mpp_set)(struct mvebu_mpp_ctrl_data *, unsigned int, long unsigned int); + int (*mpp_gpio_req)(struct mvebu_mpp_ctrl_data *, unsigned int); + int (*mpp_gpio_dir)(struct mvebu_mpp_ctrl_data *, unsigned int, bool); +}; + +struct mvebu_mpp_ctrl_setting { + u8 val; + const char *name; + const char *subname; + u8 variant; + u8 flags; +}; + +struct mvebu_mpp_mode { + u8 pid; + struct mvebu_mpp_ctrl_setting *settings; +}; + +struct mvebu_pinctrl_soc_info { + u8 variant; + const struct mvebu_mpp_ctrl *controls; + struct mvebu_mpp_ctrl_data *control_data; + int ncontrols; + struct mvebu_mpp_mode *modes; + int nmodes; + struct pinctrl_gpio_range *gpioranges; + int ngpioranges; +}; + +struct mvebu_pinctrl_function { + const char *name; + const char **groups; + unsigned int num_groups; +}; + +struct mvebu_pinctrl_group { + const char *name; + const struct mvebu_mpp_ctrl *ctrl; + struct mvebu_mpp_ctrl_data *data; + struct mvebu_mpp_ctrl_setting *settings; + unsigned int num_settings; + unsigned int gid; + unsigned int *pins; + unsigned int npins; +}; + +struct mvebu_pinctrl { + struct device *dev; + struct pinctrl_dev *pctldev; + struct pinctrl_desc desc; + struct mvebu_pinctrl_group *groups; + unsigned int num_groups; + struct mvebu_pinctrl_function *functions; + unsigned int num_functions; + u8 variant; +}; + +enum { + V_88F6810 = 1, + V_88F6820 = 2, + V_88F6828 = 4, + V_88F6810_PLUS = 7, + V_88F6820_PLUS = 6, +}; + +enum { + V_88F6920 = 1, + V_88F6925 = 2, + V_88F6928 = 4, + V_88F6920_PLUS = 7, + V_88F6925_PLUS = 6, +}; + +enum armada_xp_variant { + V_MV78230 = 1, + V_MV78260 = 2, + V_MV78460 = 4, + V_MV78230_PLUS = 7, + V_MV78260_PLUS = 6, + V_98DX3236 = 8, + V_98DX3336 = 16, + V_98DX4251 = 32, + V_98DX3236_PLUS = 56, +}; + +enum pincfg_type { + PINCFG_TYPE_FUNC = 0, + PINCFG_TYPE_DAT = 1, + PINCFG_TYPE_PUD = 2, + PINCFG_TYPE_DRV = 3, + PINCFG_TYPE_CON_PDN = 4, + PINCFG_TYPE_PUD_PDN = 5, + PINCFG_TYPE_NUM = 6, +}; + +enum eint_type { + EINT_TYPE_NONE = 0, + EINT_TYPE_GPIO = 1, + EINT_TYPE_WKUP = 2, + EINT_TYPE_WKUP_MUX = 3, +}; + +struct samsung_pin_bank_type { + u8 fld_width[6]; + u8 reg_offset[6]; +}; + +struct samsung_pin_bank_data { + const struct samsung_pin_bank_type *type; + u32 pctl_offset; + u8 pctl_res_idx; + u8 nr_pins; + u8 eint_func; + enum eint_type eint_type; + u32 eint_mask; + u32 eint_offset; + const char *name; +}; + +struct samsung_pinctrl_drv_data; + +struct exynos_irq_chip; + +struct samsung_pin_bank { + const struct samsung_pin_bank_type *type; + void *pctl_base; + u32 pctl_offset; + u8 nr_pins; + void *eint_base; + u8 eint_func; + enum eint_type eint_type; + u32 eint_mask; + u32 eint_offset; + const char *name; + u32 pin_base; + void *soc_priv; + struct fwnode_handle *fwnode; + struct samsung_pinctrl_drv_data *drvdata; + struct irq_domain *irq_domain; + struct gpio_chip gpio_chip; + struct pinctrl_gpio_range grange; + struct exynos_irq_chip *irq_chip; + raw_spinlock_t slock; + u32 pm_save[7]; +}; + +struct samsung_pin_group; + +struct samsung_pmx_func; + +struct samsung_retention_ctrl; + +struct samsung_pinctrl_drv_data { + struct list_head node; + void *virt_base; + struct device *dev; + int irq; + struct pinctrl_desc pctl; + struct pinctrl_dev *pctl_dev; + const struct samsung_pin_group *pin_groups; + unsigned int nr_groups; + const struct samsung_pmx_func *pmx_functions; + unsigned int nr_functions; + struct samsung_pin_bank *pin_banks; + unsigned int nr_banks; + unsigned int pin_base; + unsigned int nr_pins; + struct samsung_retention_ctrl *retention_ctrl; + void (*suspend)(struct samsung_pinctrl_drv_data *); + void (*resume)(struct samsung_pinctrl_drv_data *); +}; + +struct samsung_retention_ctrl { + const u32 *regs; + int nr_regs; + u32 value; + atomic_t *refcnt; + void *priv; + void (*enable)(struct samsung_pinctrl_drv_data *); + void (*disable)(struct samsung_pinctrl_drv_data *); +}; + +struct samsung_retention_data { + const u32 *regs; + int nr_regs; + u32 value; + atomic_t *refcnt; + struct samsung_retention_ctrl * (*init)(struct samsung_pinctrl_drv_data *, const struct samsung_retention_data *); +}; + +struct samsung_pin_ctrl { + const struct samsung_pin_bank_data *pin_banks; + unsigned int nr_banks; + unsigned int nr_ext_resources; + const struct samsung_retention_data *retention_data; + int (*eint_gpio_init)(struct samsung_pinctrl_drv_data *); + int (*eint_wkup_init)(struct samsung_pinctrl_drv_data *); + void (*suspend)(struct samsung_pinctrl_drv_data *); + void (*resume)(struct samsung_pinctrl_drv_data *); +}; + +struct samsung_pin_group { + const char *name; + const unsigned int *pins; + u8 num_pins; + u8 func; +}; + +struct samsung_pmx_func { + const char *name; + const char **groups; + u8 num_groups; + u32 val; +}; + +struct samsung_pinctrl_of_match_data { + const struct samsung_pin_ctrl *ctrl; + unsigned int num_ctrl; +}; + +struct pin_config { + const char *property; + enum pincfg_type param; +}; + +struct exynos_irq_chip { + struct irq_chip chip; + u32 eint_con; + u32 eint_mask; + u32 eint_pend; + u32 *eint_wake_mask_value; + u32 eint_wake_mask_reg; + void (*set_eint_wakeup_mask)(struct samsung_pinctrl_drv_data *, struct exynos_irq_chip *); +}; + +struct exynos_weint_data { + unsigned int irq; + struct samsung_pin_bank *bank; +}; + +struct exynos_muxed_weint_data { + unsigned int nr_banks; + struct samsung_pin_bank *banks[0]; +}; + +struct exynos_eint_gpio_save { + u32 eint_con; + u32 eint_fltcon0; + u32 eint_fltcon1; + u32 eint_mask; +}; + +struct reg_field { + unsigned int reg; + unsigned int lsb; + unsigned int msb; + unsigned int id_size; + unsigned int id_offset; +}; + +struct stm32_desc_function { + const char *name; + const unsigned char num; +}; + +struct stm32_desc_pin { + struct pinctrl_pin_desc pin; + const struct stm32_desc_function functions[18]; + const unsigned int pkg; +}; + +struct stm32_pinctrl_match_data { + const struct stm32_desc_pin *pins; + const unsigned int npins; + bool secure_control; +}; + +struct stm32_pinctrl_group { + const char *name; + long unsigned int config; + unsigned int pin; +}; + +struct stm32_gpio_bank { + void *base; + struct clk *clk; + struct reset_control *rstc; + spinlock_t lock; + struct gpio_chip gpio_chip; + struct pinctrl_gpio_range range; + struct fwnode_handle *fwnode; + struct irq_domain *domain; + u32 bank_nr; + u32 bank_ioport_nr; + u32 pin_backup[16]; + u8 irq_type[16]; + bool secure_control; +}; + +struct regmap_field; + +struct stm32_pinctrl { + struct device *dev; + struct pinctrl_dev *pctl_dev; + struct pinctrl_desc pctl_desc; + struct stm32_pinctrl_group *groups; + unsigned int ngroups; + const char **grp_names; + struct stm32_gpio_bank *banks; + unsigned int nbanks; + const struct stm32_pinctrl_match_data *match_data; + struct irq_domain *domain; + struct regmap *regmap; + struct regmap_field *irqmux[16]; + struct hwspinlock *hwlock; + struct stm32_desc_pin *pins; + u32 npins; + u32 pkg; + u16 irqmux_map; + spinlock_t irqmux_lock; +}; + +enum sunxi_desc_bias_voltage { + BIAS_VOLTAGE_NONE = 0, + BIAS_VOLTAGE_GRP_CONFIG = 1, + BIAS_VOLTAGE_PIO_POW_MODE_SEL = 2, + BIAS_VOLTAGE_PIO_POW_MODE_CTL = 3, +}; + +struct sunxi_desc_function { + long unsigned int variant; + const char *name; + u8 muxval; + u8 irqbank; + u8 irqnum; +}; + +struct sunxi_desc_pin { + struct pinctrl_pin_desc pin; + long unsigned int variant; + struct sunxi_desc_function *functions; +}; + +struct sunxi_pinctrl_desc { + const struct sunxi_desc_pin *pins; + int npins; + unsigned int pin_base; + unsigned int irq_banks; + const unsigned int *irq_bank_map; + bool irq_read_needs_mux; + bool disable_strict_mode; + enum sunxi_desc_bias_voltage io_bias_cfg_variant; +}; + +struct sunxi_pinctrl_function { + const char *name; + const char **groups; + unsigned int ngroups; +}; + +struct sunxi_pinctrl_group { + const char *name; + unsigned int pin; +}; + +struct sunxi_pinctrl_regulator { + struct regulator *regulator; + refcount_t refcount; +}; + +struct sunxi_pinctrl { + void *membase; + struct gpio_chip *chip; + const struct sunxi_pinctrl_desc *desc; + struct device *dev; + struct sunxi_pinctrl_regulator regulators[9]; + struct irq_domain *domain; + struct sunxi_pinctrl_function *functions; + unsigned int nfunctions; + struct sunxi_pinctrl_group *groups; + unsigned int ngroups; + int *irq; + unsigned int *irq_array; + raw_spinlock_t lock; + struct pinctrl_dev *pctl_dev; + long unsigned int variant; + u32 bank_mem_size; + u32 pull_regs_offset; + u32 dlevel_field_width; +}; + +struct tegra_pinctrl_soc_data; + +struct tegra_pmx { + struct device *dev; + struct pinctrl_dev *pctl; + const struct tegra_pinctrl_soc_data *soc; + const char **group_pins; + struct pinctrl_gpio_range gpio_range; + struct pinctrl_desc desc; + int nbanks; + void **regs; + u32 *backup_regs; +}; + +struct tegra_function; + +struct tegra_pingroup; + +struct tegra_pinctrl_soc_data { + unsigned int ngpios; + const char *gpio_compatible; + const struct pinctrl_pin_desc *pins; + unsigned int npins; + struct tegra_function *functions; + unsigned int nfunctions; + const struct tegra_pingroup *groups; + unsigned int ngroups; + bool hsm_in_mux; + bool schmitt_in_mux; + bool drvtype_in_mux; + bool sfsel_in_mux; +}; + +enum tegra_pinconf_param { + TEGRA_PINCONF_PARAM_PULL = 0, + TEGRA_PINCONF_PARAM_TRISTATE = 1, + TEGRA_PINCONF_PARAM_ENABLE_INPUT = 2, + TEGRA_PINCONF_PARAM_OPEN_DRAIN = 3, + TEGRA_PINCONF_PARAM_LOCK = 4, + TEGRA_PINCONF_PARAM_IORESET = 5, + TEGRA_PINCONF_PARAM_RCV_SEL = 6, + TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE = 7, + TEGRA_PINCONF_PARAM_SCHMITT = 8, + TEGRA_PINCONF_PARAM_LOW_POWER_MODE = 9, + TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH = 10, + TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH = 11, + TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING = 12, + TEGRA_PINCONF_PARAM_SLEW_RATE_RISING = 13, + TEGRA_PINCONF_PARAM_DRIVE_TYPE = 14, +}; + +struct tegra_function { + const char *name; + const char **groups; + unsigned int ngroups; +}; + +struct tegra_pingroup { + const char *name; + const unsigned int *pins; + u8 npins; + u8 funcs[4]; + s32 mux_reg; + s32 pupd_reg; + s32 tri_reg; + s32 drv_reg; + u32 mux_bank: 2; + u32 pupd_bank: 2; + u32 tri_bank: 2; + u32 drv_bank: 2; + s32 mux_bit: 6; + s32 pupd_bit: 6; + s32 tri_bit: 6; + s32 einput_bit: 6; + s32 odrain_bit: 6; + s32 lock_bit: 6; + s32 ioreset_bit: 6; + s32 rcv_sel_bit: 6; + s32 hsm_bit: 6; + long: 2; + s32 sfsel_bit: 6; + s32 schmitt_bit: 6; + s32 lpmd_bit: 6; + s32 drvdn_bit: 6; + s32 drvup_bit: 6; + long: 2; + s32 slwr_bit: 6; + s32 slwf_bit: 6; + s32 lpdr_bit: 6; + s32 drvtype_bit: 6; + s32 drvdn_width: 6; + long: 2; + s32 drvup_width: 6; + s32 slwr_width: 6; + s32 slwf_width: 6; + u32 parked_bitmask; +}; + +struct cfg_param { + const char *property; + enum tegra_pinconf_param param; +}; + +enum tegra_mux { + TEGRA_MUX_BLINK = 0, + TEGRA_MUX_CCLA = 1, + TEGRA_MUX_CEC = 2, + TEGRA_MUX_CLDVFS = 3, + TEGRA_MUX_CLK = 4, + TEGRA_MUX_CLK12 = 5, + TEGRA_MUX_CPU = 6, + TEGRA_MUX_CSI = 7, + TEGRA_MUX_DAP = 8, + TEGRA_MUX_DAP1 = 9, + TEGRA_MUX_DAP2 = 10, + TEGRA_MUX_DEV3 = 11, + TEGRA_MUX_DISPLAYA = 12, + TEGRA_MUX_DISPLAYA_ALT = 13, + TEGRA_MUX_DISPLAYB = 14, + TEGRA_MUX_DP = 15, + TEGRA_MUX_DSI_B = 16, + TEGRA_MUX_DTV = 17, + TEGRA_MUX_EXTPERIPH1 = 18, + TEGRA_MUX_EXTPERIPH2 = 19, + TEGRA_MUX_EXTPERIPH3 = 20, + TEGRA_MUX_GMI = 21, + TEGRA_MUX_GMI_ALT = 22, + TEGRA_MUX_HDA = 23, + TEGRA_MUX_HSI = 24, + TEGRA_MUX_I2C1 = 25, + TEGRA_MUX_I2C2 = 26, + TEGRA_MUX_I2C3 = 27, + TEGRA_MUX_I2C4 = 28, + TEGRA_MUX_I2CPWR = 29, + TEGRA_MUX_I2S0 = 30, + TEGRA_MUX_I2S1 = 31, + TEGRA_MUX_I2S2 = 32, + TEGRA_MUX_I2S3 = 33, + TEGRA_MUX_I2S4 = 34, + TEGRA_MUX_IRDA = 35, + TEGRA_MUX_KBC = 36, + TEGRA_MUX_OWR = 37, + TEGRA_MUX_PE = 38, + TEGRA_MUX_PE0 = 39, + TEGRA_MUX_PE1 = 40, + TEGRA_MUX_PMI = 41, + TEGRA_MUX_PWM0 = 42, + TEGRA_MUX_PWM1 = 43, + TEGRA_MUX_PWM2 = 44, + TEGRA_MUX_PWM3 = 45, + TEGRA_MUX_PWRON = 46, + TEGRA_MUX_RESET_OUT_N = 47, + TEGRA_MUX_RSVD1 = 48, + TEGRA_MUX_RSVD2 = 49, + TEGRA_MUX_RSVD3 = 50, + TEGRA_MUX_RSVD4 = 51, + TEGRA_MUX_RTCK = 52, + TEGRA_MUX_SATA = 53, + TEGRA_MUX_SDMMC1 = 54, + TEGRA_MUX_SDMMC2 = 55, + TEGRA_MUX_SDMMC3 = 56, + TEGRA_MUX_SDMMC4 = 57, + TEGRA_MUX_SOC = 58, + TEGRA_MUX_SPDIF = 59, + TEGRA_MUX_SPI1 = 60, + TEGRA_MUX_SPI2 = 61, + TEGRA_MUX_SPI3 = 62, + TEGRA_MUX_SPI4 = 63, + TEGRA_MUX_SPI5 = 64, + TEGRA_MUX_SPI6 = 65, + TEGRA_MUX_SYS = 66, + TEGRA_MUX_TMDS = 67, + TEGRA_MUX_TRACE = 68, + TEGRA_MUX_UARTA = 69, + TEGRA_MUX_UARTB = 70, + TEGRA_MUX_UARTC = 71, + TEGRA_MUX_UARTD = 72, + TEGRA_MUX_ULPI = 73, + TEGRA_MUX_USB = 74, + TEGRA_MUX_VGP1 = 75, + TEGRA_MUX_VGP2 = 76, + TEGRA_MUX_VGP3 = 77, + TEGRA_MUX_VGP4 = 78, + TEGRA_MUX_VGP5 = 79, + TEGRA_MUX_VGP6 = 80, + TEGRA_MUX_VI = 81, + TEGRA_MUX_VI_ALT1 = 82, + TEGRA_MUX_VI_ALT3 = 83, + TEGRA_MUX_VIMCLK2 = 84, + TEGRA_MUX_VIMCLK2_ALT = 85, +}; + +struct tegra_xusb_padctl_function { + const char *name; + const char * const *groups; + unsigned int num_groups; +}; + +struct tegra_xusb_padctl_lane; + +struct tegra_xusb_padctl_soc { + const struct pinctrl_pin_desc *pins; + unsigned int num_pins; + const struct tegra_xusb_padctl_function *functions; + unsigned int num_functions; + const struct tegra_xusb_padctl_lane *lanes; + unsigned int num_lanes; +}; + +struct tegra_xusb_padctl_lane { + const char *name; + unsigned int offset; + unsigned int shift; + unsigned int mask; + unsigned int iddq; + const unsigned int *funcs; + unsigned int num_funcs; +}; + +struct tegra_xusb_padctl { + struct device *dev; + void *regs; + struct mutex lock; + struct reset_control *rst; + const struct tegra_xusb_padctl_soc *soc; + struct pinctrl_dev *pinctrl; + struct pinctrl_desc desc; + struct phy_provider *provider; + struct phy *phys[2]; + unsigned int enable; +}; + +enum tegra_xusb_padctl_param { + TEGRA_XUSB_PADCTL_IDDQ = 0, +}; + +struct tegra_xusb_padctl_property { + const char *name; + enum tegra_xusb_padctl_param param; +}; + +enum tegra124_function { + TEGRA124_FUNC_SNPS = 0, + TEGRA124_FUNC_XUSB = 1, + TEGRA124_FUNC_UART = 2, + TEGRA124_FUNC_PCIE = 3, + TEGRA124_FUNC_USB3 = 4, + TEGRA124_FUNC_SATA = 5, + TEGRA124_FUNC_RSVD = 6, +}; + +struct ti_iodelay_reg_data { + u32 signature_mask; + u32 signature_value; + u32 lock_mask; + u32 lock_val; + u32 unlock_val; + u32 binary_data_coarse_mask; + u32 binary_data_fine_mask; + u32 reg_refclk_offset; + u32 refclk_period_mask; + u32 reg_coarse_offset; + u32 coarse_delay_count_mask; + u32 coarse_ref_count_mask; + u32 reg_fine_offset; + u32 fine_delay_count_mask; + u32 fine_ref_count_mask; + u32 reg_global_lock_offset; + u32 global_lock_mask; + u32 global_unlock_val; + u32 global_lock_val; + u32 reg_start_offset; + u32 reg_nr_per_pin; + struct regmap_config *regmap_config; +}; + +struct ti_iodelay_reg_values { + u16 coarse_ref_count; + u16 coarse_delay_count; + u16 fine_ref_count; + u16 fine_delay_count; + u16 ref_clk_period; + u32 cdpe; + u32 fdpe; +}; + +struct ti_iodelay_cfg { + u16 offset; + u16 a_delay; + u16 g_delay; +}; + +struct ti_iodelay_pingroup { + struct ti_iodelay_cfg *cfg; + int ncfg; + long unsigned int config; +}; + +struct ti_iodelay_device { + struct device *dev; + long unsigned int phys_base; + void *reg_base; + struct regmap *regmap; + struct pinctrl_dev *pctl; + struct pinctrl_desc desc; + struct pinctrl_pin_desc *pa; + const struct ti_iodelay_reg_data *reg_data; + struct ti_iodelay_reg_values reg_init_conf_values; +}; + +struct wmt_pinctrl_bank_registers { + u32 reg_en; + u32 reg_dir; + u32 reg_data_out; + u32 reg_data_in; + u32 reg_pull_en; + u32 reg_pull_cfg; +}; + +struct wmt_pinctrl_data { + struct device *dev; + struct pinctrl_dev *pctl_dev; + void *base; + const struct wmt_pinctrl_bank_registers *banks; + const struct pinctrl_pin_desc *pins; + const char * const *groups; + u32 nbanks; + u32 npins; + u32 ngroups; + struct gpio_chip gpio_chip; + struct pinctrl_gpio_range gpio_range; +}; + +enum wmt_func_sel { + WMT_FSEL_GPIO_IN = 0, + WMT_FSEL_GPIO_OUT = 1, + WMT_FSEL_ALT = 2, + WMT_FSEL_COUNT = 3, +}; + +struct gpio_pin_range { + struct list_head node; + struct pinctrl_dev *pctldev; + struct pinctrl_gpio_range range; +}; + +struct gpio_array; + +struct gpio_descs { + struct gpio_array *info; + unsigned int ndescs; + struct gpio_desc *desc[0]; +}; + +struct gpio_array { + struct gpio_desc **desc; + unsigned int size; + struct gpio_chip *chip; + long unsigned int *get_mask; + long unsigned int *set_mask; + long unsigned int invert_mask[0]; +}; + +enum gpio_lookup_flags { + GPIO_ACTIVE_HIGH = 0, + GPIO_ACTIVE_LOW = 1, + GPIO_OPEN_DRAIN = 2, + GPIO_OPEN_SOURCE = 4, + GPIO_PERSISTENT = 0, + GPIO_TRANSITORY = 8, + GPIO_PULL_UP = 16, + GPIO_PULL_DOWN = 32, + GPIO_PULL_DISABLE = 64, + GPIO_LOOKUP_FLAGS_DEFAULT = 0, +}; + +struct gpiod_lookup { + const char *key; + u16 chip_hwnum; + const char *con_id; + unsigned int idx; + long unsigned int flags; +}; + +struct gpiod_lookup_table { + struct list_head list; + const char *dev_id; + struct gpiod_lookup table[0]; +}; + +struct gpiod_hog { + struct list_head list; + const char *chip_label; + u16 chip_hwnum; + const char *line_name; + long unsigned int lflags; + int dflags; +}; + +enum { + GPIOLINE_CHANGED_REQUESTED = 1, + GPIOLINE_CHANGED_RELEASED = 2, + GPIOLINE_CHANGED_CONFIG = 3, +}; + +struct trace_event_raw_gpio_direction { + struct trace_entry ent; + unsigned int gpio; + int in; + int err; + char __data[0]; +}; + +struct trace_event_raw_gpio_value { + struct trace_entry ent; + unsigned int gpio; + int get; + int value; + char __data[0]; +}; + +struct trace_event_data_offsets_gpio_direction {}; + +struct trace_event_data_offsets_gpio_value {}; + +typedef void (*btf_trace_gpio_direction)(void *, unsigned int, int, int); + +typedef void (*btf_trace_gpio_value)(void *, unsigned int, int, int); + +struct devres; + +enum of_gpio_flags { + OF_GPIO_ACTIVE_LOW = 1, + OF_GPIO_SINGLE_ENDED = 2, + OF_GPIO_OPEN_DRAIN = 4, + OF_GPIO_TRANSITORY = 8, + OF_GPIO_PULL_UP = 16, + OF_GPIO_PULL_DOWN = 32, + OF_GPIO_PULL_DISABLE = 64, +}; + +struct of_mm_gpio_chip { + struct gpio_chip gc; + void (*save_regs)(struct of_mm_gpio_chip *); + void *regs; +}; + +typedef struct gpio_desc * (*of_find_gpio_quirk)(struct device_node *, const char *, unsigned int, enum of_gpio_flags *); + +struct of_rename_gpio { + const char *con_id; + const char *legacy_id; + const char *compatible; +}; + +struct gpiochip_info { + char name[32]; + char label[32]; + __u32 lines; +}; + +enum gpio_v2_line_flag { + GPIO_V2_LINE_FLAG_USED = 1, + GPIO_V2_LINE_FLAG_ACTIVE_LOW = 2, + GPIO_V2_LINE_FLAG_INPUT = 4, + GPIO_V2_LINE_FLAG_OUTPUT = 8, + GPIO_V2_LINE_FLAG_EDGE_RISING = 16, + GPIO_V2_LINE_FLAG_EDGE_FALLING = 32, + GPIO_V2_LINE_FLAG_OPEN_DRAIN = 64, + GPIO_V2_LINE_FLAG_OPEN_SOURCE = 128, + GPIO_V2_LINE_FLAG_BIAS_PULL_UP = 256, + GPIO_V2_LINE_FLAG_BIAS_PULL_DOWN = 512, + GPIO_V2_LINE_FLAG_BIAS_DISABLED = 1024, + GPIO_V2_LINE_FLAG_EVENT_CLOCK_REALTIME = 2048, + GPIO_V2_LINE_FLAG_EVENT_CLOCK_HTE = 4096, +}; + +struct gpio_v2_line_values { + __u64 bits; + __u64 mask; +}; + +enum gpio_v2_line_attr_id { + GPIO_V2_LINE_ATTR_ID_FLAGS = 1, + GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES = 2, + GPIO_V2_LINE_ATTR_ID_DEBOUNCE = 3, +}; + +struct gpio_v2_line_attribute { + __u32 id; + __u32 padding; + union { + __u64 flags; + __u64 values; + __u32 debounce_period_us; + }; +}; + +struct gpio_v2_line_config_attribute { + struct gpio_v2_line_attribute attr; + __u64 mask; +}; + +struct gpio_v2_line_config { + __u64 flags; + __u32 num_attrs; + __u32 padding[5]; + struct gpio_v2_line_config_attribute attrs[10]; +}; + +struct gpio_v2_line_request { + __u32 offsets[64]; + char consumer[32]; + struct gpio_v2_line_config config; + __u32 num_lines; + __u32 event_buffer_size; + __u32 padding[5]; + __s32 fd; +}; + +struct gpio_v2_line_info { + char name[32]; + char consumer[32]; + __u32 offset; + __u32 num_attrs; + __u64 flags; + struct gpio_v2_line_attribute attrs[10]; + __u32 padding[4]; +}; + +enum gpio_v2_line_changed_type { + GPIO_V2_LINE_CHANGED_REQUESTED = 1, + GPIO_V2_LINE_CHANGED_RELEASED = 2, + GPIO_V2_LINE_CHANGED_CONFIG = 3, +}; + +struct gpio_v2_line_info_changed { + struct gpio_v2_line_info info; + __u64 timestamp_ns; + __u32 event_type; + __u32 padding[5]; +}; + +enum gpio_v2_line_event_id { + GPIO_V2_LINE_EVENT_RISING_EDGE = 1, + GPIO_V2_LINE_EVENT_FALLING_EDGE = 2, +}; + +struct gpio_v2_line_event { + __u64 timestamp_ns; + __u32 id; + __u32 offset; + __u32 seqno; + __u32 line_seqno; + __u32 padding[6]; +}; + +struct gpioline_info { + __u32 line_offset; + __u32 flags; + char name[32]; + char consumer[32]; +}; + +struct gpioline_info_changed { + struct gpioline_info info; + __u64 timestamp; + __u32 event_type; + __u32 padding[5]; +}; + +struct gpiohandle_request { + __u32 lineoffsets[64]; + __u32 flags; + __u8 default_values[64]; + char consumer_label[32]; + __u32 lines; + int fd; +}; + +struct gpiohandle_config { + __u32 flags; + __u8 default_values[64]; + __u32 padding[4]; +}; + +struct gpiohandle_data { + __u8 values[64]; +}; + +struct gpioevent_request { + __u32 lineoffset; + __u32 handleflags; + __u32 eventflags; + char consumer_label[32]; + int fd; +}; + +struct gpioevent_data { + __u64 timestamp; + __u32 id; + long: 32; +}; + +typedef __poll_t (*poll_fn)(struct file *, struct poll_table_struct *); + +typedef long int (*ioctl_fn)(struct file *, unsigned int, long unsigned int); + +typedef ssize_t (*read_fn)(struct file *, char *, size_t, loff_t *); + +struct linehandle_state { + struct gpio_device *gdev; + const char *label; + struct gpio_desc *descs[64]; + u32 num_descs; +}; + +struct linereq; + +struct line { + struct gpio_desc *desc; + struct linereq *req; + unsigned int irq; + long: 32; + u64 edflags; + u64 timestamp_ns; + u32 req_seqno; + u32 line_seqno; + struct delayed_work work; + unsigned int sw_debounced; + unsigned int level; + long: 32; +}; + +struct linereq { + struct gpio_device *gdev; + const char *label; + u32 num_lines; + wait_queue_head_t wait; + u32 event_buffer_size; + long: 32; + struct { + union { + struct __kfifo kfifo; + struct gpio_v2_line_event *type; + const struct gpio_v2_line_event *const_type; + char (*rectype)[0]; + struct gpio_v2_line_event *ptr; + const struct gpio_v2_line_event *ptr_const; + }; + long: 32; + struct gpio_v2_line_event buf[0]; + } events; + atomic_t seqno; + struct mutex config_mutex; + struct line lines[0]; +}; + +struct lineevent_state { + struct gpio_device *gdev; + const char *label; + struct gpio_desc *desc; + u32 eflags; + int irq; + wait_queue_head_t wait; + struct { + union { + struct __kfifo kfifo; + struct gpioevent_data *type; + const struct gpioevent_data *const_type; + char (*rectype)[0]; + struct gpioevent_data *ptr; + const struct gpioevent_data *ptr_const; + }; + long: 32; + struct gpioevent_data buf[16]; + } events; + u64 timestamp; +}; + +struct gpio_chardev_data { + struct gpio_device *gdev; + wait_queue_head_t wait; + struct { + union { + struct __kfifo kfifo; + struct gpio_v2_line_info_changed *type; + const struct gpio_v2_line_info_changed *const_type; + char (*rectype)[0]; + struct gpio_v2_line_info_changed *ptr; + const struct gpio_v2_line_info_changed *ptr_const; + }; + long: 32; + struct gpio_v2_line_info_changed buf[32]; + } events; + struct notifier_block lineinfo_changed_nb; + long unsigned int *watched_lines; + atomic_t watch_abi_version; + long: 32; +}; + +struct class_attribute { + struct attribute attr; + ssize_t (*show)(struct class *, struct class_attribute *, char *); + ssize_t (*store)(struct class *, struct class_attribute *, const char *, size_t); +}; + +struct gpiod_data { + struct gpio_desc *desc; + struct mutex mutex; + struct kernfs_node *value_kn; + int irq; + unsigned char irq_flags; + bool direction_can_change; +}; + +struct software_node { + const char *name; + const struct software_node *parent; + const struct property_entry *properties; +}; + +struct bgpio_pdata { + const char *label; + int base; + int ngpio; +}; + +enum pwm_polarity { + PWM_POLARITY_NORMAL = 0, + PWM_POLARITY_INVERSED = 1, +}; + +struct pwm_args { + u64 period; + enum pwm_polarity polarity; + long: 32; +}; + +struct pwm_state { + u64 period; + u64 duty_cycle; + enum pwm_polarity polarity; + bool enabled; + bool usage_power; +}; + +struct pwm_chip; + +struct pwm_device { + const char *label; + long unsigned int flags; + unsigned int hwpwm; + unsigned int pwm; + struct pwm_chip *chip; + void *chip_data; + struct pwm_args args; + struct pwm_state state; + struct pwm_state last; +}; + +struct pwm_ops; + +struct pwm_chip { + struct device *dev; + const struct pwm_ops *ops; + int base; + unsigned int npwm; + struct pwm_device * (*of_xlate)(struct pwm_chip *, const struct of_phandle_args *); + unsigned int of_pwm_n_cells; + struct list_head list; + struct pwm_device *pwms; +}; + +struct pwm_capture { + unsigned int period; + unsigned int duty_cycle; +}; + +struct pwm_ops { + int (*request)(struct pwm_chip *, struct pwm_device *); + void (*free)(struct pwm_chip *, struct pwm_device *); + int (*capture)(struct pwm_chip *, struct pwm_device *, struct pwm_capture *, long unsigned int); + int (*apply)(struct pwm_chip *, struct pwm_device *, const struct pwm_state *); + int (*get_state)(struct pwm_chip *, struct pwm_device *, struct pwm_state *); + struct module *owner; +}; + +struct mvebu_gpio_chip; + +struct mvebu_pwm { + struct regmap *regs; + u32 offset; + long unsigned int clk_rate; + struct gpio_desc *gpiod; + struct pwm_chip chip; + spinlock_t lock; + struct mvebu_gpio_chip *mvchip; + u32 blink_select; + u32 blink_on_duration; + u32 blink_off_duration; +}; + +struct mvebu_gpio_chip { + struct gpio_chip chip; + struct regmap *regs; + u32 offset; + struct regmap *percpu_regs; + int irqbase; + struct irq_domain *domain; + int soc_variant; + struct clk *clk; + struct mvebu_pwm *mvpwm; + u32 out_reg; + u32 io_conf_reg; + u32 blink_en_reg; + u32 in_pol_reg; + u32 edge_mask_regs[4]; + u32 level_mask_regs[4]; +}; + +struct omap_gpio_reg_offs { + u16 revision; + u16 sysconfig; + u16 direction; + u16 datain; + u16 dataout; + u16 set_dataout; + u16 clr_dataout; + u16 irqstatus; + u16 irqstatus2; + u16 irqstatus_raw0; + u16 irqstatus_raw1; + u16 irqenable; + u16 irqenable2; + u16 set_irqenable; + u16 clr_irqenable; + u16 debounce; + u16 debounce_en; + u16 ctrl; + u16 wkup_en; + u16 leveldetect0; + u16 leveldetect1; + u16 risingdetect; + u16 fallingdetect; + u16 irqctrl; + u16 edgectrl1; + u16 edgectrl2; + u16 pinctrl; + bool irqenable_inv; +}; + +struct omap_gpio_platform_data { + int bank_type; + int bank_width; + int bank_stride; + bool dbck_flag; + bool loses_context; + bool is_mpuio; + u32 non_wakeup_gpios; + const struct omap_gpio_reg_offs *regs; + int (*get_context_loss_count)(struct device *); +}; + +struct gpio_regs { + u32 sysconfig; + u32 irqenable1; + u32 irqenable2; + u32 wake_en; + u32 ctrl; + u32 oe; + u32 leveldetect0; + u32 leveldetect1; + u32 risingdetect; + u32 fallingdetect; + u32 dataout; + u32 debounce; + u32 debounce_en; +}; + +struct gpio_bank { + void *base; + const struct omap_gpio_reg_offs *regs; + int irq; + u32 non_wakeup_gpios; + u32 enabled_non_wakeup_gpios; + struct gpio_regs context; + u32 saved_datain; + u32 level_mask; + u32 toggle_mask; + raw_spinlock_t lock; + raw_spinlock_t wa_lock; + struct gpio_chip chip; + struct clk *dbck; + struct notifier_block nb; + unsigned int is_suspended: 1; + unsigned int needs_resume: 1; + u32 mod_usage; + u32 irq_usage; + u32 dbck_enable_mask; + bool dbck_enabled; + bool is_mpuio; + bool dbck_flag; + bool loses_context; + bool context_valid; + int stride; + u32 width; + int context_loss_count; + void (*set_dataout)(struct gpio_bank *, unsigned int, int); + int (*get_context_loss_count)(struct device *); +}; + +struct palmas_adc_wakeup_property { + int adc_channel_number; + int adc_high_threshold; + int adc_low_threshold; +}; + +struct palmas_gpadc_platform_data { + int ch3_current; + int ch0_current; + bool extended_delay; + int bat_removal; + int start_polarity; + int auto_conversion_period_ms; + struct palmas_adc_wakeup_property *adc_wakeup1_data; + struct palmas_adc_wakeup_property *adc_wakeup2_data; +}; + +struct palmas_usb_platform_data { + int wakeup; +}; + +struct palmas_resource_platform_data { + int regen1_mode_sleep; + int regen2_mode_sleep; + int sysen1_mode_sleep; + int sysen2_mode_sleep; + u8 nsleep_res; + u8 nsleep_smps; + u8 nsleep_ldo1; + u8 nsleep_ldo2; + u8 enable1_res; + u8 enable1_smps; + u8 enable1_ldo1; + u8 enable1_ldo2; + u8 enable2_res; + u8 enable2_smps; + u8 enable2_ldo1; + u8 enable2_ldo2; +}; + +struct palmas_clk_platform_data { + int clk32kg_mode_sleep; + int clk32kgaudio_mode_sleep; +}; + +struct palmas_platform_data { + int irq_flags; + int gpio_base; + u8 power_ctrl; + int mux_from_pdata; + u8 pad1; + u8 pad2; + bool pm_off; + struct palmas_pmic_platform_data *pmic_pdata; + struct palmas_gpadc_platform_data *gpadc_pdata; + struct palmas_usb_platform_data *usb_pdata; + struct palmas_resource_platform_data *resource_pdata; + struct palmas_clk_platform_data *clk_pdata; +}; + +enum palmas_irqs { + PALMAS_CHARG_DET_N_VBUS_OVV_IRQ = 0, + PALMAS_PWRON_IRQ = 1, + PALMAS_LONG_PRESS_KEY_IRQ = 2, + PALMAS_RPWRON_IRQ = 3, + PALMAS_PWRDOWN_IRQ = 4, + PALMAS_HOTDIE_IRQ = 5, + PALMAS_VSYS_MON_IRQ = 6, + PALMAS_VBAT_MON_IRQ = 7, + PALMAS_RTC_ALARM_IRQ = 8, + PALMAS_RTC_TIMER_IRQ = 9, + PALMAS_WDT_IRQ = 10, + PALMAS_BATREMOVAL_IRQ = 11, + PALMAS_RESET_IN_IRQ = 12, + PALMAS_FBI_BB_IRQ = 13, + PALMAS_SHORT_IRQ = 14, + PALMAS_VAC_ACOK_IRQ = 15, + PALMAS_GPADC_AUTO_0_IRQ = 16, + PALMAS_GPADC_AUTO_1_IRQ = 17, + PALMAS_GPADC_EOC_SW_IRQ = 18, + PALMAS_GPADC_EOC_RT_IRQ = 19, + PALMAS_ID_OTG_IRQ = 20, + PALMAS_ID_IRQ = 21, + PALMAS_VBUS_OTG_IRQ = 22, + PALMAS_VBUS_IRQ = 23, + PALMAS_GPIO_0_IRQ = 24, + PALMAS_GPIO_1_IRQ = 25, + PALMAS_GPIO_2_IRQ = 26, + PALMAS_GPIO_3_IRQ = 27, + PALMAS_GPIO_4_IRQ = 28, + PALMAS_GPIO_5_IRQ = 29, + PALMAS_GPIO_6_IRQ = 30, + PALMAS_GPIO_7_IRQ = 31, + PALMAS_NUM_IRQ = 32, +}; + +struct palmas_gpio { + struct gpio_chip gpio_chip; + struct palmas *palmas; +}; + +struct palmas_device_data { + int ngpio; +}; + +struct amba_id { + unsigned int id; + unsigned int mask; + void *data; +}; + +struct amba_cs_uci_id { + unsigned int devarch; + unsigned int devarch_mask; + unsigned int devtype; + void *data; +}; + +struct amba_device { + struct device dev; + struct resource res; + struct clk *pclk; + struct device_dma_parameters dma_parms; + unsigned int periphid; + struct mutex periphid_lock; + unsigned int cid; + struct amba_cs_uci_id uci; + unsigned int irq[9]; + const char *driver_override; + long: 32; +}; + +struct amba_driver { + struct device_driver drv; + int (*probe)(struct amba_device *, const struct amba_id *); + void (*remove)(struct amba_device *); + void (*shutdown)(struct amba_device *); + const struct amba_id *id_table; + bool driver_managed_dma; +}; + +struct pl061_context_save_regs { + u8 gpio_data; + u8 gpio_dir; + u8 gpio_is; + u8 gpio_ibe; + u8 gpio_iev; + u8 gpio_ie; +}; + +struct pl061 { + raw_spinlock_t lock; + void *base; + struct gpio_chip gc; + int parent_irq; + struct pl061_context_save_regs csave_regs; +}; + +struct pxa_gpio_platform_data { + int irq_base; + int (*gpio_set_wake)(unsigned int, unsigned int); +}; + +struct pxa_gpio_bank { + void *regbase; + long unsigned int irq_mask; + long unsigned int irq_edge_rise; + long unsigned int irq_edge_fall; + long unsigned int saved_gplr; + long unsigned int saved_gpdr; + long unsigned int saved_grer; + long unsigned int saved_gfer; +}; + +struct pxa_gpio_chip { + struct device *dev; + struct gpio_chip chip; + struct pxa_gpio_bank *banks; + struct irq_domain *irqdomain; + int irq0; + int irq1; + int (*set_wake)(unsigned int, unsigned int); +}; + +enum pxa_gpio_type { + PXA25X_GPIO = 0, + PXA26X_GPIO = 1, + PXA27X_GPIO = 2, + PXA3XX_GPIO = 3, + PXA93X_GPIO = 4, + MMP_GPIO = 16, + MMP2_GPIO = 17, + PXA1928_GPIO = 18, +}; + +struct pxa_gpio_id { + enum pxa_gpio_type type; + int gpio_nums; +}; + +enum rpi_firmware_property_tag { + RPI_FIRMWARE_PROPERTY_END = 0, + RPI_FIRMWARE_GET_FIRMWARE_REVISION = 1, + RPI_FIRMWARE_SET_CURSOR_INFO = 32784, + RPI_FIRMWARE_SET_CURSOR_STATE = 32785, + RPI_FIRMWARE_GET_BOARD_MODEL = 65537, + RPI_FIRMWARE_GET_BOARD_REVISION = 65538, + RPI_FIRMWARE_GET_BOARD_MAC_ADDRESS = 65539, + RPI_FIRMWARE_GET_BOARD_SERIAL = 65540, + RPI_FIRMWARE_GET_ARM_MEMORY = 65541, + RPI_FIRMWARE_GET_VC_MEMORY = 65542, + RPI_FIRMWARE_GET_CLOCKS = 65543, + RPI_FIRMWARE_GET_POWER_STATE = 131073, + RPI_FIRMWARE_GET_TIMING = 131074, + RPI_FIRMWARE_SET_POWER_STATE = 163841, + RPI_FIRMWARE_GET_CLOCK_STATE = 196609, + RPI_FIRMWARE_GET_CLOCK_RATE = 196610, + RPI_FIRMWARE_GET_VOLTAGE = 196611, + RPI_FIRMWARE_GET_MAX_CLOCK_RATE = 196612, + RPI_FIRMWARE_GET_MAX_VOLTAGE = 196613, + RPI_FIRMWARE_GET_TEMPERATURE = 196614, + RPI_FIRMWARE_GET_MIN_CLOCK_RATE = 196615, + RPI_FIRMWARE_GET_MIN_VOLTAGE = 196616, + RPI_FIRMWARE_GET_TURBO = 196617, + RPI_FIRMWARE_GET_MAX_TEMPERATURE = 196618, + RPI_FIRMWARE_GET_STC = 196619, + RPI_FIRMWARE_ALLOCATE_MEMORY = 196620, + RPI_FIRMWARE_LOCK_MEMORY = 196621, + RPI_FIRMWARE_UNLOCK_MEMORY = 196622, + RPI_FIRMWARE_RELEASE_MEMORY = 196623, + RPI_FIRMWARE_EXECUTE_CODE = 196624, + RPI_FIRMWARE_EXECUTE_QPU = 196625, + RPI_FIRMWARE_SET_ENABLE_QPU = 196626, + RPI_FIRMWARE_GET_DISPMANX_RESOURCE_MEM_HANDLE = 196628, + RPI_FIRMWARE_GET_EDID_BLOCK = 196640, + RPI_FIRMWARE_GET_CUSTOMER_OTP = 196641, + RPI_FIRMWARE_GET_DOMAIN_STATE = 196656, + RPI_FIRMWARE_GET_THROTTLED = 196678, + RPI_FIRMWARE_GET_CLOCK_MEASURED = 196679, + RPI_FIRMWARE_NOTIFY_REBOOT = 196680, + RPI_FIRMWARE_SET_CLOCK_STATE = 229377, + RPI_FIRMWARE_SET_CLOCK_RATE = 229378, + RPI_FIRMWARE_SET_VOLTAGE = 229379, + RPI_FIRMWARE_SET_TURBO = 229385, + RPI_FIRMWARE_SET_CUSTOMER_OTP = 229409, + RPI_FIRMWARE_SET_DOMAIN_STATE = 229424, + RPI_FIRMWARE_GET_GPIO_STATE = 196673, + RPI_FIRMWARE_SET_GPIO_STATE = 229441, + RPI_FIRMWARE_SET_SDHOST_CLOCK = 229442, + RPI_FIRMWARE_GET_GPIO_CONFIG = 196675, + RPI_FIRMWARE_SET_GPIO_CONFIG = 229443, + RPI_FIRMWARE_GET_PERIPH_REG = 196677, + RPI_FIRMWARE_SET_PERIPH_REG = 229445, + RPI_FIRMWARE_GET_POE_HAT_VAL = 196681, + RPI_FIRMWARE_SET_POE_HAT_VAL = 196688, + RPI_FIRMWARE_NOTIFY_XHCI_RESET = 196696, + RPI_FIRMWARE_NOTIFY_DISPLAY_DONE = 196710, + RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 262145, + RPI_FIRMWARE_FRAMEBUFFER_BLANK = 262146, + RPI_FIRMWARE_FRAMEBUFFER_GET_PHYSICAL_WIDTH_HEIGHT = 262147, + RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_WIDTH_HEIGHT = 262148, + RPI_FIRMWARE_FRAMEBUFFER_GET_DEPTH = 262149, + RPI_FIRMWARE_FRAMEBUFFER_GET_PIXEL_ORDER = 262150, + RPI_FIRMWARE_FRAMEBUFFER_GET_ALPHA_MODE = 262151, + RPI_FIRMWARE_FRAMEBUFFER_GET_PITCH = 262152, + RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_OFFSET = 262153, + RPI_FIRMWARE_FRAMEBUFFER_GET_OVERSCAN = 262154, + RPI_FIRMWARE_FRAMEBUFFER_GET_PALETTE = 262155, + RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF = 262159, + RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF = 262160, + RPI_FIRMWARE_FRAMEBUFFER_RELEASE = 294913, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PHYSICAL_WIDTH_HEIGHT = 278531, + RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_WIDTH_HEIGHT = 278532, + RPI_FIRMWARE_FRAMEBUFFER_TEST_DEPTH = 278533, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PIXEL_ORDER = 278534, + RPI_FIRMWARE_FRAMEBUFFER_TEST_ALPHA_MODE = 278535, + RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_OFFSET = 278537, + RPI_FIRMWARE_FRAMEBUFFER_TEST_OVERSCAN = 278538, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PALETTE = 278539, + RPI_FIRMWARE_FRAMEBUFFER_TEST_VSYNC = 278542, + RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT = 294915, + RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT = 294916, + RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH = 294917, + RPI_FIRMWARE_FRAMEBUFFER_SET_PIXEL_ORDER = 294918, + RPI_FIRMWARE_FRAMEBUFFER_SET_ALPHA_MODE = 294919, + RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET = 294921, + RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN = 294922, + RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE = 294923, + RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF = 294943, + RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF = 294944, + RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC = 294926, + RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT = 294927, + RPI_FIRMWARE_VCHIQ_INIT = 294928, + RPI_FIRMWARE_GET_COMMAND_LINE = 327681, + RPI_FIRMWARE_GET_DMA_CHANNELS = 393217, +}; + +struct rpi_firmware; + +struct rpi_exp_gpio { + struct gpio_chip gc; + struct rpi_firmware *fw; +}; + +struct gpio_set_config { + u32 gpio; + u32 direction; + u32 polarity; + u32 term_en; + u32 term_pull_up; + u32 state; +}; + +struct gpio_get_config { + u32 gpio; + u32 direction; + u32 polarity; + u32 term_en; + u32 term_pull_up; +}; + +struct gpio_get_set_state { + u32 gpio; + u32 state; +}; + +struct tegra_gpio_bank { + unsigned int bank; + raw_spinlock_t lvl_lock[4]; + spinlock_t dbc_lock[4]; + u32 cnf[4]; + u32 out[4]; + u32 oe[4]; + u32 int_enb[4]; + u32 int_lvl[4]; + u32 wake_enb[4]; + u32 dbc_enb[4]; + u32 dbc_cnt[4]; +}; + +struct tegra_gpio_soc_config { + bool debounce_supported; + u32 bank_stride; + u32 upper_offset; +}; + +struct tegra_gpio_info { + struct device *dev; + void *regs; + struct tegra_gpio_bank *bank_info; + const struct tegra_gpio_soc_config *soc; + struct gpio_chip gc; + u32 bank_count; + unsigned int *irqs; +}; + +enum twl4030_module_ids { + TWL4030_MODULE_AUDIO_VOICE = 9, + TWL4030_MODULE_GPIO = 10, + TWL4030_MODULE_INTBR = 11, + TWL4030_MODULE_TEST = 12, + TWL4030_MODULE_KEYPAD = 13, + TWL4030_MODULE_MADC = 14, + TWL4030_MODULE_INTERRUPTS = 15, + TWL4030_MODULE_PRECHARGE = 16, + TWL4030_MODULE_BACKUP = 17, + TWL4030_MODULE_INT = 18, + TWL5031_MODULE_ACCESSORY = 19, + TWL5031_MODULE_INTERRUPTS = 20, + TWL4030_MODULE_LAST = 21, +}; + +struct gpio_twl4030_priv { + struct gpio_chip gpio_chip; + struct mutex mutex; + int irq_base; + unsigned int usage_count; + unsigned int direction; + unsigned int out_state; +}; + +struct mfd_cell_acpi_match; + +struct mfd_cell { + const char *name; + int id; + int level; + int (*enable)(struct platform_device *); + int (*disable)(struct platform_device *); + int (*suspend)(struct platform_device *); + int (*resume)(struct platform_device *); + void *platform_data; + size_t pdata_size; + const struct software_node *swnode; + const char *of_compatible; + long: 32; + const u64 of_reg; + bool use_of_reg; + const struct mfd_cell_acpi_match *acpi_match; + int num_resources; + const struct resource *resources; + bool ignore_resource_conflicts; + bool pm_runtime_no_callbacks; + const char * const *parent_supplies; + int num_parent_supplies; + long: 32; +}; + +struct mfd_cell_acpi_match { + const char *pnpid; + long: 32; + const long long unsigned int adr; +}; + +struct regulator_bulk_data { + const char *supply; + int init_load_uA; + struct regulator *consumer; + int ret; +}; + +struct twl6040 { + struct device *dev; + struct regmap *regmap; + struct regmap_irq_chip_data *irq_data; + struct regulator_bulk_data supplies[2]; + struct clk *clk32k; + struct clk *mclk; + struct mutex mutex; + struct mutex irq_mutex; + long: 32; + struct mfd_cell cells[4]; + struct completion ready; + struct gpio_desc *audpwron; + int power_count; + int rev; + int pll; + unsigned int sysclk_rate; + unsigned int mclk_rate; + unsigned int irq; + unsigned int irq_ready; + unsigned int irq_th; + long: 32; +}; + +struct fsl_gpio_soc_data { + bool have_paddr; +}; + +struct vf610_gpio_port { + struct gpio_chip gc; + struct irq_chip ic; + void *base; + void *gpio_base; + const struct fsl_gpio_soc_data *sdata; + u8 irqc[32]; + struct clk *clk_port; + struct clk *clk_gpio; + int irq; +}; + +enum { + PWMF_REQUESTED = 1, + PWMF_EXPORTED = 2, +}; + +struct pwm_lookup { + struct list_head list; + const char *provider; + unsigned int index; + const char *dev_id; + const char *con_id; + unsigned int period; + enum pwm_polarity polarity; + const char *module; +}; + +struct trace_event_raw_pwm { + struct trace_entry ent; + struct pwm_device *pwm; + long: 32; + u64 period; + u64 duty_cycle; + enum pwm_polarity polarity; + bool enabled; + int err; + char __data[0]; + long: 32; +}; + +struct trace_event_data_offsets_pwm {}; + +typedef void (*btf_trace_pwm_apply)(void *, struct pwm_device *, const struct pwm_state *, int); + +typedef void (*btf_trace_pwm_get)(void *, struct pwm_device *, const struct pwm_state *, int); + +struct pwm_export { + struct device child; + struct pwm_device *pwm; + struct mutex lock; + struct pwm_state suspend; +}; + +enum { + pci_channel_io_normal = 1, + pci_channel_io_frozen = 2, + pci_channel_io_perm_failure = 3, +}; + +struct rcec_ea { + u8 nextbusn; + u8 lastbusn; + u32 bitmap; +}; + +struct pci_bus_resource { + struct list_head list; + struct resource *res; + unsigned int flags; +}; + +typedef u64 pci_bus_addr_t; + +struct pci_bus_region { + pci_bus_addr_t start; + pci_bus_addr_t end; +}; + +enum pci_fixup_pass { + pci_fixup_early = 0, + pci_fixup_header = 1, + pci_fixup_final = 2, + pci_fixup_enable = 3, + pci_fixup_resume = 4, + pci_fixup_suspend = 5, + pci_fixup_resume_early = 6, + pci_fixup_suspend_late = 7, +}; + +struct hotplug_slot_ops; + +struct hotplug_slot { + const struct hotplug_slot_ops *ops; + struct list_head slot_list; + struct pci_slot *pci_slot; + struct module *owner; + const char *mod_name; +}; + +enum pci_dev_flags { + PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = 1, + PCI_DEV_FLAGS_NO_D3 = 2, + PCI_DEV_FLAGS_ASSIGNED = 4, + PCI_DEV_FLAGS_ACS_ENABLED_QUIRK = 8, + PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = 32, + PCI_DEV_FLAGS_NO_BUS_RESET = 64, + PCI_DEV_FLAGS_NO_PM_RESET = 128, + PCI_DEV_FLAGS_VPD_REF_F0 = 256, + PCI_DEV_FLAGS_BRIDGE_XLATE_ROOT = 512, + PCI_DEV_FLAGS_NO_FLR_RESET = 1024, + PCI_DEV_FLAGS_NO_RELAXED_ORDERING = 2048, + PCI_DEV_FLAGS_HAS_MSI_MASKING = 4096, +}; + +enum pci_bus_flags { + PCI_BUS_FLAGS_NO_MSI = 1, + PCI_BUS_FLAGS_NO_MMRBC = 2, + PCI_BUS_FLAGS_NO_AERSID = 4, + PCI_BUS_FLAGS_NO_EXTCFG = 8, +}; + +enum pci_bus_speed { + PCI_SPEED_33MHz = 0, + PCI_SPEED_66MHz = 1, + PCI_SPEED_66MHz_PCIX = 2, + PCI_SPEED_100MHz_PCIX = 3, + PCI_SPEED_133MHz_PCIX = 4, + PCI_SPEED_66MHz_PCIX_ECC = 5, + PCI_SPEED_100MHz_PCIX_ECC = 6, + PCI_SPEED_133MHz_PCIX_ECC = 7, + PCI_SPEED_66MHz_PCIX_266 = 9, + PCI_SPEED_100MHz_PCIX_266 = 10, + PCI_SPEED_133MHz_PCIX_266 = 11, + AGP_UNKNOWN = 12, + AGP_1X = 13, + AGP_2X = 14, + AGP_4X = 15, + AGP_8X = 16, + PCI_SPEED_66MHz_PCIX_533 = 17, + PCI_SPEED_100MHz_PCIX_533 = 18, + PCI_SPEED_133MHz_PCIX_533 = 19, + PCIE_SPEED_2_5GT = 20, + PCIE_SPEED_5_0GT = 21, + PCIE_SPEED_8_0GT = 22, + PCIE_SPEED_16_0GT = 23, + PCIE_SPEED_32_0GT = 24, + PCIE_SPEED_64_0GT = 25, + PCI_SPEED_UNKNOWN = 255, +}; + +enum pcie_bus_config_types { + PCIE_BUS_TUNE_OFF = 0, + PCIE_BUS_DEFAULT = 1, + PCIE_BUS_SAFE = 2, + PCIE_BUS_PERFORMANCE = 3, + PCIE_BUS_PEER2PEER = 4, +}; + +struct hotplug_slot_ops { + int (*enable_slot)(struct hotplug_slot *); + int (*disable_slot)(struct hotplug_slot *); + int (*set_attention_status)(struct hotplug_slot *, u8); + int (*hardware_test)(struct hotplug_slot *, u32); + int (*get_power_status)(struct hotplug_slot *, u8 *); + int (*get_attention_status)(struct hotplug_slot *, u8 *); + int (*get_latch_status)(struct hotplug_slot *, u8 *); + int (*get_adapter_status)(struct hotplug_slot *, u8 *); + int (*reset_slot)(struct hotplug_slot *, bool); +}; + +enum pci_bar_type { + pci_bar_unknown = 0, + pci_bar_io = 1, + pci_bar_mem32 = 2, + pci_bar_mem64 = 3, +}; + +struct pci_domain_busn_res { + struct list_head list; + struct resource res; + int domain_nr; + long: 32; +}; + +struct dmi_strmatch { + unsigned char slot: 7; + unsigned char exact_match: 1; + char substr[79]; +}; + +struct dmi_system_id { + int (*callback)(const struct dmi_system_id *); + const char *ident; + struct dmi_strmatch matches[4]; + void *driver_data; +}; + +struct bus_attribute { + struct attribute attr; + ssize_t (*show)(struct bus_type *, char *); + ssize_t (*store)(struct bus_type *, const char *, size_t); +}; + +enum { + LOGIC_PIO_INDIRECT = 0, + LOGIC_PIO_CPU_MMIO = 1, +}; + +struct logic_pio_host_ops; + +struct logic_pio_hwaddr { + struct list_head list; + struct fwnode_handle *fwnode; + long: 32; + resource_size_t hw_start; + resource_size_t io_start; + resource_size_t size; + long unsigned int flags; + void *hostdata; + const struct logic_pio_host_ops *ops; + long: 32; +}; + +struct logic_pio_host_ops { + u32 (*in)(void *, long unsigned int, size_t); + void (*out)(void *, long unsigned int, u32, size_t); + u32 (*ins)(void *, long unsigned int, void *, size_t, unsigned int); + void (*outs)(void *, long unsigned int, const void *, size_t, unsigned int); +}; + +enum pcie_reset_state { + pcie_deassert_reset = 1, + pcie_warm_reset = 2, + pcie_hot_reset = 3, +}; + +enum pcie_link_width { + PCIE_LNK_WIDTH_RESRV = 0, + PCIE_LNK_X1 = 1, + PCIE_LNK_X2 = 2, + PCIE_LNK_X4 = 4, + PCIE_LNK_X8 = 8, + PCIE_LNK_X12 = 12, + PCIE_LNK_X16 = 16, + PCIE_LNK_X32 = 32, + PCIE_LNK_WIDTH_UNKNOWN = 255, +}; + +typedef int (*arch_set_vga_state_t)(struct pci_dev *, bool, unsigned int, u32); + +struct pci_cap_saved_data { + u16 cap_nr; + bool cap_extended; + unsigned int size; + u32 data[0]; +}; + +struct pci_cap_saved_state { + struct hlist_node next; + struct pci_cap_saved_data cap; +}; + +struct pci_reset_fn_method { + int (*reset_fn)(struct pci_dev *, bool); + char *name; +}; + +struct pci_pme_device { + struct list_head list; + struct pci_dev *dev; +}; + +struct pci_saved_state { + u32 config_space[16]; + struct pci_cap_saved_data cap[0]; +}; + +struct pci_devres { + unsigned int enabled: 1; + unsigned int pinned: 1; + unsigned int orig_intx: 1; + unsigned int restore_intx: 1; + unsigned int mwi: 1; + u32 region_mask; +}; + +struct driver_attribute { + struct attribute attr; + ssize_t (*show)(struct device_driver *, char *); + ssize_t (*store)(struct device_driver *, const char *, size_t); +}; + +enum pci_ers_result { + PCI_ERS_RESULT_NONE = 1, + PCI_ERS_RESULT_CAN_RECOVER = 2, + PCI_ERS_RESULT_NEED_RESET = 3, + PCI_ERS_RESULT_DISCONNECT = 4, + PCI_ERS_RESULT_RECOVERED = 5, + PCI_ERS_RESULT_NO_AER_DRIVER = 6, +}; + +struct pcie_device { + int irq; + struct pci_dev *port; + u32 service; + void *priv_data; + struct device device; +}; + +struct pcie_port_service_driver { + const char *name; + int (*probe)(struct pcie_device *); + void (*remove)(struct pcie_device *); + int (*suspend)(struct pcie_device *); + int (*resume_noirq)(struct pcie_device *); + int (*resume)(struct pcie_device *); + int (*runtime_suspend)(struct pcie_device *); + int (*runtime_resume)(struct pcie_device *); + int (*slot_reset)(struct pcie_device *); + int port_type; + u32 service; + struct device_driver driver; +}; + +struct pci_dynid { + struct list_head node; + struct pci_device_id id; +}; + +struct drv_dev_and_id { + struct pci_driver *drv; + struct pci_dev *dev; + const struct pci_device_id *id; +}; + +struct acpi_device; + +enum pci_mmap_state { + pci_mmap_io = 0, + pci_mmap_mem = 1, +}; + +enum pci_mmap_api { + PCI_MMAP_SYSFS = 0, + PCI_MMAP_PROCFS = 1, +}; + +struct pci_dev_resource { + struct list_head list; + struct resource *res; + struct pci_dev *dev; + resource_size_t start; + resource_size_t end; + resource_size_t add_size; + resource_size_t min_align; + long unsigned int flags; + long: 32; +}; + +enum release_type { + leaf_only = 0, + whole_subtree = 1, +}; + +enum enable_type { + undefined = 4294967295, + user_disabled = 0, + auto_disabled = 1, + user_enabled = 2, + auto_enabled = 3, +}; + +struct msix_entry { + u32 vector; + u16 entry; +}; + +enum support_mode { + ALLOW_LEGACY = 0, + DENY_LEGACY = 1, +}; + +enum dmi_field { + DMI_NONE = 0, + DMI_BIOS_VENDOR = 1, + DMI_BIOS_VERSION = 2, + DMI_BIOS_DATE = 3, + DMI_BIOS_RELEASE = 4, + DMI_EC_FIRMWARE_RELEASE = 5, + DMI_SYS_VENDOR = 6, + DMI_PRODUCT_NAME = 7, + DMI_PRODUCT_VERSION = 8, + DMI_PRODUCT_SERIAL = 9, + DMI_PRODUCT_UUID = 10, + DMI_PRODUCT_SKU = 11, + DMI_PRODUCT_FAMILY = 12, + DMI_BOARD_VENDOR = 13, + DMI_BOARD_NAME = 14, + DMI_BOARD_VERSION = 15, + DMI_BOARD_SERIAL = 16, + DMI_BOARD_ASSET_TAG = 17, + DMI_CHASSIS_VENDOR = 18, + DMI_CHASSIS_TYPE = 19, + DMI_CHASSIS_VERSION = 20, + DMI_CHASSIS_SERIAL = 21, + DMI_CHASSIS_ASSET_TAG = 22, + DMI_STRING_MAX = 23, + DMI_OEM_STRING = 24, +}; + +struct portdrv_service_data { + struct pcie_port_service_driver *drv; + struct device *dev; + u32 service; +}; + +typedef int (*pcie_callback_t)(struct pcie_device *); + +struct walk_rcec_data { + struct pci_dev *rcec; + int (*user_callback)(struct pci_dev *, void *); + void *user_data; +}; + +struct pcie_link_state { + struct pci_dev *pdev; + struct pci_dev *downstream; + struct pcie_link_state *root; + struct pcie_link_state *parent; + struct list_head sibling; + u32 aspm_support: 7; + u32 aspm_enabled: 7; + u32 aspm_capable: 7; + u32 aspm_default: 7; + long: 4; + u32 aspm_disable: 7; + u32 clkpm_capable: 1; + u32 clkpm_enabled: 1; + u32 clkpm_default: 1; + u32 clkpm_disable: 1; +}; + +struct aer_stats { + u64 dev_cor_errs[16]; + u64 dev_fatal_errs[27]; + u64 dev_nonfatal_errs[27]; + u64 dev_total_cor_errs; + u64 dev_total_fatal_errs; + u64 dev_total_nonfatal_errs; + u64 rootport_total_cor_errs; + u64 rootport_total_fatal_errs; + u64 rootport_total_nonfatal_errs; +}; + +struct aer_header_log_regs { + unsigned int dw0; + unsigned int dw1; + unsigned int dw2; + unsigned int dw3; +}; + +struct aer_err_info { + struct pci_dev *dev[5]; + int error_dev_num; + unsigned int id: 16; + unsigned int severity: 2; + unsigned int __pad1: 5; + unsigned int multi_error_valid: 1; + unsigned int first_error: 5; + unsigned int __pad2: 2; + unsigned int tlp_header_valid: 1; + unsigned int status; + unsigned int mask; + struct aer_header_log_regs tlp; +}; + +struct aer_err_source { + unsigned int status; + unsigned int id; +}; + +struct aer_rpc { + struct pci_dev *rpd; + struct { + union { + struct __kfifo kfifo; + struct aer_err_source *type; + const struct aer_err_source *const_type; + char (*rectype)[0]; + struct aer_err_source *ptr; + const struct aer_err_source *ptr_const; + }; + struct aer_err_source buf[128]; + } aer_fifo; +}; + +struct pcie_pme_service_data { + spinlock_t lock; + struct pcie_device *srv; + struct work_struct work; + bool noirq; +}; + +struct pci_filp_private { + enum pci_mmap_state mmap_state; + int write_combine; +}; + +struct pci_slot_attribute { + struct attribute attr; + ssize_t (*show)(struct pci_slot *, char *); + ssize_t (*store)(struct pci_slot *, const char *, size_t); +}; + +struct of_bus; + +struct of_pci_range_parser { + struct device_node *node; + struct of_bus *bus; + const __be32 *range; + const __be32 *end; + int na; + int ns; + int pna; + bool dma; +}; + +struct of_pci_range { + union { + u64 pci_addr; + u64 bus_addr; + }; + u64 cpu_addr; + u64 size; + u32 flags; + long: 32; +}; + +enum { + NVME_REG_CAP = 0, + NVME_REG_VS = 8, + NVME_REG_INTMS = 12, + NVME_REG_INTMC = 16, + NVME_REG_CC = 20, + NVME_REG_CSTS = 28, + NVME_REG_NSSR = 32, + NVME_REG_AQA = 36, + NVME_REG_ASQ = 40, + NVME_REG_ACQ = 48, + NVME_REG_CMBLOC = 56, + NVME_REG_CMBSZ = 60, + NVME_REG_BPINFO = 64, + NVME_REG_BPRSEL = 68, + NVME_REG_BPMBL = 72, + NVME_REG_CMBMSC = 80, + NVME_REG_CRTO = 104, + NVME_REG_PMRCAP = 3584, + NVME_REG_PMRCTL = 3588, + NVME_REG_PMRSTS = 3592, + NVME_REG_PMREBS = 3596, + NVME_REG_PMRSWTP = 3600, + NVME_REG_DBS = 4096, +}; + +enum { + NVME_CC_ENABLE = 1, + NVME_CC_EN_SHIFT = 0, + NVME_CC_CSS_SHIFT = 4, + NVME_CC_MPS_SHIFT = 7, + NVME_CC_AMS_SHIFT = 11, + NVME_CC_SHN_SHIFT = 14, + NVME_CC_IOSQES_SHIFT = 16, + NVME_CC_IOCQES_SHIFT = 20, + NVME_CC_CSS_NVM = 0, + NVME_CC_CSS_CSI = 96, + NVME_CC_CSS_MASK = 112, + NVME_CC_AMS_RR = 0, + NVME_CC_AMS_WRRU = 2048, + NVME_CC_AMS_VS = 14336, + NVME_CC_SHN_NONE = 0, + NVME_CC_SHN_NORMAL = 16384, + NVME_CC_SHN_ABRUPT = 32768, + NVME_CC_SHN_MASK = 49152, + NVME_CC_IOSQES = 393216, + NVME_CC_IOCQES = 4194304, + NVME_CC_CRIME = 16777216, +}; + +enum { + NVME_CSTS_RDY = 1, + NVME_CSTS_CFS = 2, + NVME_CSTS_NSSRO = 16, + NVME_CSTS_PP = 32, + NVME_CSTS_SHST_NORMAL = 0, + NVME_CSTS_SHST_OCCUR = 4, + NVME_CSTS_SHST_CMPLT = 8, + NVME_CSTS_SHST_MASK = 12, +}; + +enum { + SWITCHTEC_GAS_MRPC_OFFSET = 0, + SWITCHTEC_GAS_TOP_CFG_OFFSET = 4096, + SWITCHTEC_GAS_SW_EVENT_OFFSET = 6144, + SWITCHTEC_GAS_SYS_INFO_OFFSET = 8192, + SWITCHTEC_GAS_FLASH_INFO_OFFSET = 8704, + SWITCHTEC_GAS_PART_CFG_OFFSET = 16384, + SWITCHTEC_GAS_NTB_OFFSET = 65536, + SWITCHTEC_GAS_PFF_CSR_OFFSET = 1261568, +}; + +enum { + SWITCHTEC_NTB_REG_INFO_OFFSET = 0, + SWITCHTEC_NTB_REG_CTRL_OFFSET = 16384, + SWITCHTEC_NTB_REG_DBMSG_OFFSET = 409600, +}; + +struct nt_partition_info { + u32 xlink_enabled; + u32 target_part_low; + u32 target_part_high; + u32 reserved; +}; + +struct ntb_info_regs { + u8 partition_count; + u8 partition_id; + u16 reserved1; + u64 ep_map; + u16 requester_id; + u16 reserved2; + u32 reserved3[4]; + struct nt_partition_info ntp_info[48]; +}; + +struct ntb_ctrl_regs { + u32 partition_status; + u32 partition_op; + u32 partition_ctrl; + u32 bar_setup; + u32 bar_error; + u16 lut_table_entries; + u16 lut_table_offset; + u32 lut_error; + u16 req_id_table_size; + u16 req_id_table_offset; + u32 req_id_error; + u32 reserved1[7]; + struct { + u32 ctl; + u32 win_size; + u64 xlate_addr; + } bar_entry[6]; + struct { + u32 win_size; + u32 reserved[3]; + } bar_ext_entry[6]; + u32 reserved2[192]; + u32 req_id_table[512]; + u32 reserved3[256]; + u64 lut_entry[512]; +}; + +struct pci_dev_reset_methods { + u16 vendor; + u16 device; + int (*reset)(struct pci_dev *, bool); +}; + +struct pci_dev_acs_enabled { + u16 vendor; + u16 device; + int (*acs_enabled)(struct pci_dev *, u16); +}; + +struct pci_dev_acs_ops { + u16 vendor; + u16 device; + int (*enable_acs)(struct pci_dev *); + int (*disable_acs_redir)(struct pci_dev *); +}; + +struct pci_bridge_emul_conf { + __le16 vendor; + __le16 device; + __le16 command; + __le16 status; + __le32 class_revision; + u8 cache_line_size; + u8 latency_timer; + u8 header_type; + u8 bist; + __le32 bar[2]; + u8 primary_bus; + u8 secondary_bus; + u8 subordinate_bus; + u8 secondary_latency_timer; + u8 iobase; + u8 iolimit; + __le16 secondary_status; + __le16 membase; + __le16 memlimit; + __le16 pref_mem_base; + __le16 pref_mem_limit; + __le32 prefbaseupper; + __le32 preflimitupper; + __le16 iobaseupper; + __le16 iolimitupper; + u8 capabilities_pointer; + u8 reserve[3]; + __le32 romaddr; + u8 intline; + u8 intpin; + __le16 bridgectrl; +}; + +struct pci_bridge_emul_pcie_conf { + u8 cap_id; + u8 next; + __le16 cap; + __le32 devcap; + __le16 devctl; + __le16 devsta; + __le32 lnkcap; + __le16 lnkctl; + __le16 lnksta; + __le32 slotcap; + __le16 slotctl; + __le16 slotsta; + __le16 rootctl; + __le16 rootcap; + __le32 rootsta; + __le32 devcap2; + __le16 devctl2; + __le16 devsta2; + __le32 lnkcap2; + __le16 lnkctl2; + __le16 lnksta2; + __le32 slotcap2; + __le16 slotctl2; + __le16 slotsta2; +}; + +typedef enum { + PCI_BRIDGE_EMUL_HANDLED = 0, + PCI_BRIDGE_EMUL_NOT_HANDLED = 1, +} pci_bridge_emul_read_status_t; + +struct pci_bridge_emul; + +struct pci_bridge_emul_ops { + pci_bridge_emul_read_status_t (*read_base)(struct pci_bridge_emul *, int, u32 *); + pci_bridge_emul_read_status_t (*read_pcie)(struct pci_bridge_emul *, int, u32 *); + pci_bridge_emul_read_status_t (*read_ext)(struct pci_bridge_emul *, int, u32 *); + void (*write_base)(struct pci_bridge_emul *, int, u32, u32, u32); + void (*write_pcie)(struct pci_bridge_emul *, int, u32, u32, u32); + void (*write_ext)(struct pci_bridge_emul *, int, u32, u32, u32); +}; + +struct pci_bridge_reg_behavior; + +struct pci_bridge_emul { + struct pci_bridge_emul_conf conf; + struct pci_bridge_emul_pcie_conf pcie_conf; + const struct pci_bridge_emul_ops *ops; + struct pci_bridge_reg_behavior *pci_regs_behavior; + struct pci_bridge_reg_behavior *pcie_cap_regs_behavior; + void *data; + u8 pcie_start; + u8 ssid_start; + bool has_pcie; + u16 subsystem_vendor_id; + u16 subsystem_id; +}; + +struct pci_bridge_reg_behavior { + u32 ro; + u32 rw; + u32 w1c; +}; + +enum { + PCI_BRIDGE_EMUL_NO_PREFMEM_FORWARD = 1, + PCI_BRIDGE_EMUL_NO_IO_FORWARD = 2, +}; + +enum dmi_device_type { + DMI_DEV_TYPE_ANY = 0, + DMI_DEV_TYPE_OTHER = 1, + DMI_DEV_TYPE_UNKNOWN = 2, + DMI_DEV_TYPE_VIDEO = 3, + DMI_DEV_TYPE_SCSI = 4, + DMI_DEV_TYPE_ETHERNET = 5, + DMI_DEV_TYPE_TOKENRING = 6, + DMI_DEV_TYPE_SOUND = 7, + DMI_DEV_TYPE_PATA = 8, + DMI_DEV_TYPE_SATA = 9, + DMI_DEV_TYPE_SAS = 10, + DMI_DEV_TYPE_IPMI = 4294967295, + DMI_DEV_TYPE_OEM_STRING = 4294967294, + DMI_DEV_TYPE_DEV_ONBOARD = 4294967293, + DMI_DEV_TYPE_DEV_SLOT = 4294967292, +}; + +struct dmi_device { + struct list_head list; + int type; + const char *name; + void *device_data; +}; + +struct dmi_dev_onboard { + struct dmi_device dev; + int instance; + int segment; + int bus; + int devfn; +}; + +enum smbios_attr_enum { + SMBIOS_ATTR_NONE = 0, + SMBIOS_ATTR_LABEL_SHOW = 1, + SMBIOS_ATTR_INSTANCE_SHOW = 2, +}; + +struct pci_config_window; + +struct pci_ecam_ops { + unsigned int bus_shift; + struct pci_ops pci_ops; + int (*init)(struct pci_config_window *); +}; + +struct pci_config_window { + struct resource res; + struct resource busr; + unsigned int bus_shift; + void *priv; + const struct pci_ecam_ops *ops; + union { + void *win; + void **winp; + }; + struct device *parent; + long: 32; +}; + +struct vga_device { + struct list_head list; + struct pci_dev *pdev; + unsigned int decodes; + unsigned int owns; + unsigned int locks; + unsigned int io_lock_cnt; + unsigned int mem_lock_cnt; + unsigned int io_norm_cnt; + unsigned int mem_norm_cnt; + bool bridge_has_one_vga; + bool is_firmware_default; + unsigned int (*set_decode)(struct pci_dev *, bool); +}; + +struct vga_arb_user_card { + struct pci_dev *pdev; + unsigned int mem_cnt; + unsigned int io_cnt; +}; + +struct vga_arb_private { + struct list_head list; + struct pci_dev *target; + struct vga_arb_user_card cards[16]; + spinlock_t lock; +}; + +struct mvebu_pcie_port; + +struct mvebu_pcie { + struct platform_device *pdev; + struct mvebu_pcie_port *ports; + struct resource io; + struct resource realio; + struct resource mem; + struct resource busn; + int nports; + long: 32; +}; + +struct mvebu_pcie_window { + phys_addr_t base; + phys_addr_t remap; + size_t size; + long: 32; +}; + +struct mvebu_pcie_port { + char *name; + void *base; + u32 port; + u32 lane; + bool is_x4; + int devfn; + unsigned int mem_target; + unsigned int mem_attr; + unsigned int io_target; + unsigned int io_attr; + struct clk *clk; + struct gpio_desc *reset_gpio; + char *reset_name; + struct pci_bridge_emul bridge; + struct device_node *dn; + struct mvebu_pcie *pcie; + struct mvebu_pcie_window memwin; + struct mvebu_pcie_window iowin; + u32 saved_pcie_stat; + long: 32; + struct resource regs; + u8 slot_power_limit_value; + u8 slot_power_limit_scale; + struct irq_domain *intx_irq_domain; + raw_spinlock_t irq_lock; + int intx_irq; +}; + +struct tegra_msi { + long unsigned int used[8]; + struct irq_domain *domain; + struct mutex map_lock; + spinlock_t mask_lock; + void *virt; + dma_addr_t phys; + int irq; + long: 32; +}; + +struct tegra_pcie_port_soc { + struct { + u8 turnoff_bit; + u8 ack_bit; + } pme; +}; + +struct tegra_pcie_soc { + unsigned int num_ports; + const struct tegra_pcie_port_soc *ports; + unsigned int msi_base_shift; + long unsigned int afi_pex2_ctrl; + u32 pads_pll_ctl; + u32 tx_ref_sel; + u32 pads_refclk_cfg0; + u32 pads_refclk_cfg1; + u32 update_fc_threshold; + bool has_pex_clkreq_en; + bool has_pex_bias_ctrl; + bool has_intr_prsnt_sense; + bool has_cml_clk; + bool has_gen2; + bool force_pca_enable; + bool program_uphy; + bool update_clamp_threshold; + bool program_deskew_time; + bool update_fc_timer; + bool has_cache_bars; + struct { + struct { + u32 rp_ectl_2_r1; + u32 rp_ectl_4_r1; + u32 rp_ectl_5_r1; + u32 rp_ectl_6_r1; + u32 rp_ectl_2_r2; + u32 rp_ectl_4_r2; + u32 rp_ectl_5_r2; + u32 rp_ectl_6_r2; + } regs; + bool enable; + } ectl; +}; + +struct tegra_pcie { + struct device *dev; + void *pads; + void *afi; + void *cfg; + int irq; + long: 32; + struct resource cs; + struct clk *pex_clk; + struct clk *afi_clk; + struct clk *pll_e; + struct clk *cml_clk; + struct reset_control *pex_rst; + struct reset_control *afi_rst; + struct reset_control *pcie_xrst; + bool legacy_phy; + struct phy *phy; + long: 32; + struct tegra_msi msi; + struct list_head ports; + u32 xbar_config; + struct regulator_bulk_data *supplies; + unsigned int num_supplies; + const struct tegra_pcie_soc *soc; + struct dentry *debugfs; + long: 32; +}; + +struct tegra_pcie_port { + struct tegra_pcie *pcie; + struct device_node *np; + struct list_head list; + struct resource regs; + void *base; + unsigned int index; + unsigned int lanes; + struct phy **phys; + struct gpio_desc *reset_gpio; + long: 32; +}; + +struct clk_bulk_data { + const char *id; + struct clk *clk; +}; + +enum pci_interrupt_pin { + PCI_INTERRUPT_UNKNOWN = 0, + PCI_INTERRUPT_INTA = 1, + PCI_INTERRUPT_INTB = 2, + PCI_INTERRUPT_INTC = 3, + PCI_INTERRUPT_INTD = 4, +}; + +struct reset_control_bulk_data { + const char *id; + struct reset_control *rstc; +}; + +struct config_group; + +struct config_item_type; + +struct config_item { + char *ci_name; + char ci_namebuf[20]; + struct kref ci_kref; + struct list_head ci_entry; + struct config_item *ci_parent; + struct config_group *ci_group; + const struct config_item_type *ci_type; + struct dentry *ci_dentry; +}; + +struct configfs_subsystem; + +struct config_group { + struct config_item cg_item; + struct list_head cg_children; + struct configfs_subsystem *cg_subsys; + struct list_head default_groups; + struct list_head group_entry; +}; + +struct configfs_item_operations; + +struct configfs_group_operations; + +struct configfs_attribute; + +struct configfs_bin_attribute; + +struct config_item_type { + struct module *ct_owner; + struct configfs_item_operations *ct_item_ops; + struct configfs_group_operations *ct_group_ops; + struct configfs_attribute **ct_attrs; + struct configfs_bin_attribute **ct_bin_attrs; +}; + +struct configfs_item_operations { + void (*release)(struct config_item *); + int (*allow_link)(struct config_item *, struct config_item *); + void (*drop_link)(struct config_item *, struct config_item *); +}; + +struct configfs_group_operations { + struct config_item * (*make_item)(struct config_group *, const char *); + struct config_group * (*make_group)(struct config_group *, const char *); + void (*disconnect_notify)(struct config_group *, struct config_item *); + void (*drop_item)(struct config_group *, struct config_item *); +}; + +struct configfs_attribute { + const char *ca_name; + struct module *ca_owner; + umode_t ca_mode; + ssize_t (*show)(struct config_item *, char *); + ssize_t (*store)(struct config_item *, const char *, size_t); +}; + +struct configfs_bin_attribute { + struct configfs_attribute cb_attr; + void *cb_private; + size_t cb_max_size; + ssize_t (*read)(struct config_item *, void *, size_t); + ssize_t (*write)(struct config_item *, const void *, size_t); +}; + +struct configfs_subsystem { + struct config_group su_group; + struct mutex su_mutex; +}; + +enum pci_barno { + NO_BAR = 4294967295, + BAR_0 = 0, + BAR_1 = 1, + BAR_2 = 2, + BAR_3 = 3, + BAR_4 = 4, + BAR_5 = 5, +}; + +struct pci_epf_header { + u16 vendorid; + u16 deviceid; + u8 revid; + u8 progif_code; + u8 subclass_code; + u8 baseclass_code; + u8 cache_line_size; + u16 subsys_vendor_id; + u16 subsys_id; + enum pci_interrupt_pin interrupt_pin; +}; + +struct pci_epf_bar { + dma_addr_t phys_addr; + void *addr; + size_t size; + enum pci_barno barno; + int flags; +}; + +struct pci_epc_ops; + +struct pci_epc_mem; + +struct pci_epc { + struct device dev; + struct list_head pci_epf; + const struct pci_epc_ops *ops; + struct pci_epc_mem **windows; + struct pci_epc_mem *mem; + unsigned int num_windows; + u8 max_functions; + u8 *max_vfs; + struct config_group *group; + struct mutex lock; + long unsigned int function_num_map; + struct atomic_notifier_head notifier; + long: 32; +}; + +enum pci_epc_irq_type { + PCI_EPC_IRQ_UNKNOWN = 0, + PCI_EPC_IRQ_LEGACY = 1, + PCI_EPC_IRQ_MSI = 2, + PCI_EPC_IRQ_MSIX = 3, +}; + +struct pci_epc_features; + +struct pci_epc_ops { + int (*write_header)(struct pci_epc *, u8, u8, struct pci_epf_header *); + int (*set_bar)(struct pci_epc *, u8, u8, struct pci_epf_bar *); + void (*clear_bar)(struct pci_epc *, u8, u8, struct pci_epf_bar *); + int (*map_addr)(struct pci_epc *, u8, u8, phys_addr_t, u64, size_t); + void (*unmap_addr)(struct pci_epc *, u8, u8, phys_addr_t); + int (*set_msi)(struct pci_epc *, u8, u8, u8); + int (*get_msi)(struct pci_epc *, u8, u8); + int (*set_msix)(struct pci_epc *, u8, u8, u16, enum pci_barno, u32); + int (*get_msix)(struct pci_epc *, u8, u8); + int (*raise_irq)(struct pci_epc *, u8, u8, enum pci_epc_irq_type, u16); + int (*map_msi_irq)(struct pci_epc *, u8, u8, phys_addr_t, u8, u32, u32 *, u32 *); + int (*start)(struct pci_epc *); + void (*stop)(struct pci_epc *); + const struct pci_epc_features * (*get_features)(struct pci_epc *, u8, u8); + struct module *owner; +}; + +struct pci_epc_features { + unsigned int linkup_notifier: 1; + unsigned int core_init_notifier: 1; + unsigned int msi_capable: 1; + unsigned int msix_capable: 1; + u8 reserved_bar; + u8 bar_fixed_64bit; + long: 32; + u64 bar_fixed_size[6]; + size_t align; + long: 32; +}; + +struct pci_epc_mem_window { + phys_addr_t phys_base; + size_t size; + size_t page_size; +}; + +struct pci_epc_mem { + struct pci_epc_mem_window window; + long unsigned int *bitmap; + int pages; + struct mutex lock; + long: 32; +}; + +enum dw_pcie_app_clk { + DW_PCIE_DBI_CLK = 0, + DW_PCIE_MSTR_CLK = 1, + DW_PCIE_SLV_CLK = 2, + DW_PCIE_NUM_APP_CLKS = 3, +}; + +enum dw_pcie_core_clk { + DW_PCIE_PIPE_CLK = 0, + DW_PCIE_CORE_CLK = 1, + DW_PCIE_AUX_CLK = 2, + DW_PCIE_REF_CLK = 3, + DW_PCIE_NUM_CORE_CLKS = 4, +}; + +enum dw_pcie_app_rst { + DW_PCIE_DBI_RST = 0, + DW_PCIE_MSTR_RST = 1, + DW_PCIE_SLV_RST = 2, + DW_PCIE_NUM_APP_RSTS = 3, +}; + +enum dw_pcie_core_rst { + DW_PCIE_NON_STICKY_RST = 0, + DW_PCIE_STICKY_RST = 1, + DW_PCIE_CORE_RST = 2, + DW_PCIE_PIPE_RST = 3, + DW_PCIE_PHY_RST = 4, + DW_PCIE_HOT_RST = 5, + DW_PCIE_PWR_RST = 6, + DW_PCIE_NUM_CORE_RSTS = 7, +}; + +struct dw_pcie_rp; + +struct dw_pcie_host_ops { + int (*host_init)(struct dw_pcie_rp *); + void (*host_deinit)(struct dw_pcie_rp *); + int (*msi_host_init)(struct dw_pcie_rp *); +}; + +struct dw_pcie_rp { + bool has_msi_ctrl: 1; + bool cfg0_io_shared: 1; + long: 32; + u64 cfg0_base; + void *va_cfg0_base; + u32 cfg0_size; + resource_size_t io_base; + phys_addr_t io_bus_addr; + u32 io_size; + int irq; + const struct dw_pcie_host_ops *ops; + int msi_irq[8]; + struct irq_domain *irq_domain; + struct irq_domain *msi_domain; + long: 32; + dma_addr_t msi_data; + struct irq_chip *msi_irq_chip; + u32 num_vectors; + u32 irq_mask[8]; + struct pci_host_bridge *bridge; + raw_spinlock_t lock; + long unsigned int msi_irq_in_use[8]; +}; + +struct dw_pcie_ep; + +struct dw_pcie_ep_ops { + void (*ep_init)(struct dw_pcie_ep *); + int (*raise_irq)(struct dw_pcie_ep *, u8, enum pci_epc_irq_type, u16); + const struct pci_epc_features * (*get_features)(struct dw_pcie_ep *); + unsigned int (*func_conf_select)(struct dw_pcie_ep *, u8); +}; + +struct dw_pcie_ep { + struct pci_epc *epc; + struct list_head func_list; + const struct dw_pcie_ep_ops *ops; + phys_addr_t phys_base; + size_t addr_size; + size_t page_size; + u8 bar_to_atu[6]; + phys_addr_t *outbound_addr; + long unsigned int *ib_window_map; + long unsigned int *ob_window_map; + void *msi_mem; + phys_addr_t msi_mem_phys; + struct pci_epf_bar *epf_bar[6]; +}; + +struct dw_pcie; + +struct dw_pcie_ops { + u64 (*cpu_addr_fixup)(struct dw_pcie *, u64); + u32 (*read_dbi)(struct dw_pcie *, void *, u32, size_t); + void (*write_dbi)(struct dw_pcie *, void *, u32, size_t, u32); + void (*write_dbi2)(struct dw_pcie *, void *, u32, size_t, u32); + int (*link_up)(struct dw_pcie *); + int (*start_link)(struct dw_pcie *); + void (*stop_link)(struct dw_pcie *); +}; + +struct dw_pcie { + struct device *dev; + void *dbi_base; + void *dbi_base2; + void *atu_base; + size_t atu_size; + u32 num_ib_windows; + u32 num_ob_windows; + u32 region_align; + u64 region_limit; + struct dw_pcie_rp pp; + struct dw_pcie_ep ep; + const struct dw_pcie_ops *ops; + u32 version; + u32 type; + long unsigned int caps; + int num_lanes; + int link_gen; + u8 n_fts[2]; + struct clk_bulk_data app_clks[3]; + struct clk_bulk_data core_clks[4]; + struct reset_control_bulk_data app_rsts[3]; + struct reset_control_bulk_data core_rsts[7]; + struct gpio_desc *pe_rst; +}; + +enum dw_pcie_device_mode { + DW_PCIE_UNKNOWN_TYPE = 0, + DW_PCIE_EP_TYPE = 1, + DW_PCIE_LEG_EP_TYPE = 2, + DW_PCIE_RC_TYPE = 3, +}; + +struct dra7xx_pcie { + struct dw_pcie *pci; + void *base; + int phy_count; + struct phy **phy; + struct irq_domain *irq_domain; + struct clk *clk; + enum dw_pcie_device_mode mode; +}; + +struct dra7xx_pcie_of_data { + enum dw_pcie_device_mode mode; + u32 b1co_mode_sel_mask; +}; + +enum imx6_pcie_variants { + IMX6Q = 0, + IMX6SX = 1, + IMX6QP = 2, + IMX7D = 3, + IMX8MQ = 4, + IMX8MM = 5, + IMX8MP = 6, +}; + +struct imx6_pcie_drvdata { + enum imx6_pcie_variants variant; + u32 flags; + int dbi_length; + const char *gpr; +}; + +struct imx6_pcie { + struct dw_pcie *pci; + int reset_gpio; + bool gpio_active_high; + bool link_is_up; + struct clk *pcie_bus; + struct clk *pcie_phy; + struct clk *pcie_inbound_axi; + struct clk *pcie; + struct clk *pcie_aux; + struct regmap *iomuxc_gpr; + u32 controller_id; + struct reset_control *pciephy_reset; + struct reset_control *apps_reset; + struct reset_control *turnoff_reset; + u32 tx_deemph_gen1; + u32 tx_deemph_gen2_3p5db; + u32 tx_deemph_gen2_6db; + u32 tx_swing_full; + u32 tx_swing_low; + struct regulator *vpcie; + struct regulator *vph; + void *phy_base; + struct device *pd_pcie; + struct device *pd_pcie_phy; + struct phy *phy; + const struct imx6_pcie_drvdata *drvdata; +}; + +struct aperture_range { + struct device *dev; + long: 32; + resource_size_t base; + resource_size_t size; + struct list_head lh; + void (*detach)(struct device *); + long: 32; +}; + +struct dp_sdp_header { + u8 HB0; + u8 HB1; + u8 HB2; + u8 HB3; +}; + +struct dp_sdp { + struct dp_sdp_header sdp_header; + u8 db[32]; +}; + +enum hdmi_infoframe_type { + HDMI_INFOFRAME_TYPE_VENDOR = 129, + HDMI_INFOFRAME_TYPE_AVI = 130, + HDMI_INFOFRAME_TYPE_SPD = 131, + HDMI_INFOFRAME_TYPE_AUDIO = 132, + HDMI_INFOFRAME_TYPE_DRM = 135, +}; + +struct hdmi_any_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; +}; + +enum hdmi_colorspace { + HDMI_COLORSPACE_RGB = 0, + HDMI_COLORSPACE_YUV422 = 1, + HDMI_COLORSPACE_YUV444 = 2, + HDMI_COLORSPACE_YUV420 = 3, + HDMI_COLORSPACE_RESERVED4 = 4, + HDMI_COLORSPACE_RESERVED5 = 5, + HDMI_COLORSPACE_RESERVED6 = 6, + HDMI_COLORSPACE_IDO_DEFINED = 7, +}; + +enum hdmi_scan_mode { + HDMI_SCAN_MODE_NONE = 0, + HDMI_SCAN_MODE_OVERSCAN = 1, + HDMI_SCAN_MODE_UNDERSCAN = 2, + HDMI_SCAN_MODE_RESERVED = 3, +}; + +enum hdmi_colorimetry { + HDMI_COLORIMETRY_NONE = 0, + HDMI_COLORIMETRY_ITU_601 = 1, + HDMI_COLORIMETRY_ITU_709 = 2, + HDMI_COLORIMETRY_EXTENDED = 3, +}; + +enum hdmi_picture_aspect { + HDMI_PICTURE_ASPECT_NONE = 0, + HDMI_PICTURE_ASPECT_4_3 = 1, + HDMI_PICTURE_ASPECT_16_9 = 2, + HDMI_PICTURE_ASPECT_64_27 = 3, + HDMI_PICTURE_ASPECT_256_135 = 4, + HDMI_PICTURE_ASPECT_RESERVED = 5, +}; + +enum hdmi_active_aspect { + HDMI_ACTIVE_ASPECT_16_9_TOP = 2, + HDMI_ACTIVE_ASPECT_14_9_TOP = 3, + HDMI_ACTIVE_ASPECT_16_9_CENTER = 4, + HDMI_ACTIVE_ASPECT_PICTURE = 8, + HDMI_ACTIVE_ASPECT_4_3 = 9, + HDMI_ACTIVE_ASPECT_16_9 = 10, + HDMI_ACTIVE_ASPECT_14_9 = 11, + HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13, + HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14, + HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15, +}; + +enum hdmi_extended_colorimetry { + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601 = 0, + HDMI_EXTENDED_COLORIMETRY_XV_YCC_709 = 1, + HDMI_EXTENDED_COLORIMETRY_S_YCC_601 = 2, + HDMI_EXTENDED_COLORIMETRY_OPYCC_601 = 3, + HDMI_EXTENDED_COLORIMETRY_OPRGB = 4, + HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM = 5, + HDMI_EXTENDED_COLORIMETRY_BT2020 = 6, + HDMI_EXTENDED_COLORIMETRY_RESERVED = 7, +}; + +enum hdmi_quantization_range { + HDMI_QUANTIZATION_RANGE_DEFAULT = 0, + HDMI_QUANTIZATION_RANGE_LIMITED = 1, + HDMI_QUANTIZATION_RANGE_FULL = 2, + HDMI_QUANTIZATION_RANGE_RESERVED = 3, +}; + +enum hdmi_nups { + HDMI_NUPS_UNKNOWN = 0, + HDMI_NUPS_HORIZONTAL = 1, + HDMI_NUPS_VERTICAL = 2, + HDMI_NUPS_BOTH = 3, +}; + +enum hdmi_ycc_quantization_range { + HDMI_YCC_QUANTIZATION_RANGE_LIMITED = 0, + HDMI_YCC_QUANTIZATION_RANGE_FULL = 1, +}; + +enum hdmi_content_type { + HDMI_CONTENT_TYPE_GRAPHICS = 0, + HDMI_CONTENT_TYPE_PHOTO = 1, + HDMI_CONTENT_TYPE_CINEMA = 2, + HDMI_CONTENT_TYPE_GAME = 3, +}; + +enum hdmi_metadata_type { + HDMI_STATIC_METADATA_TYPE1 = 0, +}; + +enum hdmi_eotf { + HDMI_EOTF_TRADITIONAL_GAMMA_SDR = 0, + HDMI_EOTF_TRADITIONAL_GAMMA_HDR = 1, + HDMI_EOTF_SMPTE_ST2084 = 2, + HDMI_EOTF_BT_2100_HLG = 3, +}; + +struct hdmi_avi_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + enum hdmi_colorspace colorspace; + enum hdmi_scan_mode scan_mode; + enum hdmi_colorimetry colorimetry; + enum hdmi_picture_aspect picture_aspect; + enum hdmi_active_aspect active_aspect; + bool itc; + enum hdmi_extended_colorimetry extended_colorimetry; + enum hdmi_quantization_range quantization_range; + enum hdmi_nups nups; + unsigned char video_code; + enum hdmi_ycc_quantization_range ycc_quantization_range; + enum hdmi_content_type content_type; + unsigned char pixel_repeat; + short unsigned int top_bar; + short unsigned int bottom_bar; + short unsigned int left_bar; + short unsigned int right_bar; +}; + +struct hdmi_drm_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + enum hdmi_eotf eotf; + enum hdmi_metadata_type metadata_type; + struct { + u16 x; + u16 y; + } display_primaries[3]; + struct { + u16 x; + u16 y; + } white_point; + u16 max_display_mastering_luminance; + u16 min_display_mastering_luminance; + u16 max_cll; + u16 max_fall; +}; + +enum hdmi_spd_sdi { + HDMI_SPD_SDI_UNKNOWN = 0, + HDMI_SPD_SDI_DSTB = 1, + HDMI_SPD_SDI_DVDP = 2, + HDMI_SPD_SDI_DVHS = 3, + HDMI_SPD_SDI_HDDVR = 4, + HDMI_SPD_SDI_DVC = 5, + HDMI_SPD_SDI_DSC = 6, + HDMI_SPD_SDI_VCD = 7, + HDMI_SPD_SDI_GAME = 8, + HDMI_SPD_SDI_PC = 9, + HDMI_SPD_SDI_BD = 10, + HDMI_SPD_SDI_SACD = 11, + HDMI_SPD_SDI_HDDVD = 12, + HDMI_SPD_SDI_PMP = 13, +}; + +struct hdmi_spd_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + char vendor[8]; + char product[16]; + enum hdmi_spd_sdi sdi; +}; + +enum hdmi_audio_coding_type { + HDMI_AUDIO_CODING_TYPE_STREAM = 0, + HDMI_AUDIO_CODING_TYPE_PCM = 1, + HDMI_AUDIO_CODING_TYPE_AC3 = 2, + HDMI_AUDIO_CODING_TYPE_MPEG1 = 3, + HDMI_AUDIO_CODING_TYPE_MP3 = 4, + HDMI_AUDIO_CODING_TYPE_MPEG2 = 5, + HDMI_AUDIO_CODING_TYPE_AAC_LC = 6, + HDMI_AUDIO_CODING_TYPE_DTS = 7, + HDMI_AUDIO_CODING_TYPE_ATRAC = 8, + HDMI_AUDIO_CODING_TYPE_DSD = 9, + HDMI_AUDIO_CODING_TYPE_EAC3 = 10, + HDMI_AUDIO_CODING_TYPE_DTS_HD = 11, + HDMI_AUDIO_CODING_TYPE_MLP = 12, + HDMI_AUDIO_CODING_TYPE_DST = 13, + HDMI_AUDIO_CODING_TYPE_WMA_PRO = 14, + HDMI_AUDIO_CODING_TYPE_CXT = 15, +}; + +enum hdmi_audio_sample_size { + HDMI_AUDIO_SAMPLE_SIZE_STREAM = 0, + HDMI_AUDIO_SAMPLE_SIZE_16 = 1, + HDMI_AUDIO_SAMPLE_SIZE_20 = 2, + HDMI_AUDIO_SAMPLE_SIZE_24 = 3, +}; + +enum hdmi_audio_sample_frequency { + HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM = 0, + HDMI_AUDIO_SAMPLE_FREQUENCY_32000 = 1, + HDMI_AUDIO_SAMPLE_FREQUENCY_44100 = 2, + HDMI_AUDIO_SAMPLE_FREQUENCY_48000 = 3, + HDMI_AUDIO_SAMPLE_FREQUENCY_88200 = 4, + HDMI_AUDIO_SAMPLE_FREQUENCY_96000 = 5, + HDMI_AUDIO_SAMPLE_FREQUENCY_176400 = 6, + HDMI_AUDIO_SAMPLE_FREQUENCY_192000 = 7, +}; + +enum hdmi_audio_coding_type_ext { + HDMI_AUDIO_CODING_TYPE_EXT_CT = 0, + HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC = 1, + HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2 = 2, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND = 3, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC = 4, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_V2 = 5, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC = 6, + HDMI_AUDIO_CODING_TYPE_EXT_DRA = 7, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_SURROUND = 8, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC_SURROUND = 10, +}; + +struct hdmi_audio_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + unsigned char channels; + enum hdmi_audio_coding_type coding_type; + enum hdmi_audio_sample_size sample_size; + enum hdmi_audio_sample_frequency sample_frequency; + enum hdmi_audio_coding_type_ext coding_type_ext; + unsigned char channel_allocation; + unsigned char level_shift_value; + bool downmix_inhibit; +}; + +enum hdmi_3d_structure { + HDMI_3D_STRUCTURE_INVALID = 4294967295, + HDMI_3D_STRUCTURE_FRAME_PACKING = 0, + HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE = 1, + HDMI_3D_STRUCTURE_LINE_ALTERNATIVE = 2, + HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL = 3, + HDMI_3D_STRUCTURE_L_DEPTH = 4, + HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH = 5, + HDMI_3D_STRUCTURE_TOP_AND_BOTTOM = 6, + HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8, +}; + +struct hdmi_vendor_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + unsigned int oui; + u8 vic; + enum hdmi_3d_structure s3d_struct; + unsigned int s3d_ext_data; +}; + +union hdmi_vendor_any_infoframe { + struct { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + unsigned int oui; + } any; + struct hdmi_vendor_infoframe hdmi; +}; + +union hdmi_infoframe { + struct hdmi_any_infoframe any; + struct hdmi_avi_infoframe avi; + struct hdmi_spd_infoframe spd; + union hdmi_vendor_any_infoframe vendor; + struct hdmi_audio_infoframe audio; + struct hdmi_drm_infoframe drm; +}; + +enum con_scroll { + SM_UP = 0, + SM_DOWN = 1, +}; + +enum vc_intensity { + VCI_HALF_BRIGHT = 0, + VCI_NORMAL = 1, + VCI_BOLD = 2, + VCI_MASK = 3, +}; + +struct vc_data; + +struct console_font; + +struct consw { + struct module *owner; + const char * (*con_startup)(); + void (*con_init)(struct vc_data *, int); + void (*con_deinit)(struct vc_data *); + void (*con_clear)(struct vc_data *, int, int, int, int); + void (*con_putc)(struct vc_data *, int, int, int); + void (*con_putcs)(struct vc_data *, const short unsigned int *, int, int, int); + void (*con_cursor)(struct vc_data *, int); + bool (*con_scroll)(struct vc_data *, unsigned int, unsigned int, enum con_scroll, unsigned int); + int (*con_switch)(struct vc_data *); + int (*con_blank)(struct vc_data *, int, int); + int (*con_font_set)(struct vc_data *, struct console_font *, unsigned int); + int (*con_font_get)(struct vc_data *, struct console_font *); + int (*con_font_default)(struct vc_data *, struct console_font *, char *); + int (*con_resize)(struct vc_data *, unsigned int, unsigned int, unsigned int); + void (*con_set_palette)(struct vc_data *, const unsigned char *); + void (*con_scrolldelta)(struct vc_data *, int); + int (*con_set_origin)(struct vc_data *); + void (*con_save_screen)(struct vc_data *); + u8 (*con_build_attr)(struct vc_data *, u8, enum vc_intensity, bool, bool, bool, bool); + void (*con_invert_region)(struct vc_data *, u16 *, int); + u16 * (*con_screen_pos)(const struct vc_data *, int); + long unsigned int (*con_getxy)(struct vc_data *, long unsigned int, int *, int *); + void (*con_flush_scrollback)(struct vc_data *); + int (*con_debug_enter)(struct vc_data *); + int (*con_debug_leave)(struct vc_data *); +}; + +struct vc_state { + unsigned int x; + unsigned int y; + unsigned char color; + unsigned char Gx_charset[2]; + unsigned int charset: 1; + enum vc_intensity intensity; + bool italic; + bool underline; + bool blink; + bool reverse; +}; + +struct console_font { + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char *data; +}; + +struct vt_mode { + char mode; + char waitv; + short int relsig; + short int acqsig; + short int frsig; +}; + +struct uni_pagedict; + +struct uni_screen; + +struct vc_data { + struct tty_port port; + struct vc_state state; + struct vc_state saved_state; + short unsigned int vc_num; + unsigned int vc_cols; + unsigned int vc_rows; + unsigned int vc_size_row; + unsigned int vc_scan_lines; + unsigned int vc_cell_height; + long unsigned int vc_origin; + long unsigned int vc_scr_end; + long unsigned int vc_visible_origin; + unsigned int vc_top; + unsigned int vc_bottom; + const struct consw *vc_sw; + short unsigned int *vc_screenbuf; + unsigned int vc_screenbuf_size; + unsigned char vc_mode; + unsigned char vc_attr; + unsigned char vc_def_color; + unsigned char vc_ulcolor; + unsigned char vc_itcolor; + unsigned char vc_halfcolor; + unsigned int vc_cursor_type; + short unsigned int vc_complement_mask; + short unsigned int vc_s_complement_mask; + long unsigned int vc_pos; + short unsigned int vc_hi_font_mask; + struct console_font vc_font; + short unsigned int vc_video_erase_char; + unsigned int vc_state; + unsigned int vc_npar; + unsigned int vc_par[16]; + struct vt_mode vt_mode; + struct pid *vt_pid; + int vt_newvt; + wait_queue_head_t paste_wait; + unsigned int vc_disp_ctrl: 1; + unsigned int vc_toggle_meta: 1; + unsigned int vc_decscnm: 1; + unsigned int vc_decom: 1; + unsigned int vc_decawm: 1; + unsigned int vc_deccm: 1; + unsigned int vc_decim: 1; + unsigned int vc_priv: 3; + unsigned int vc_need_wrap: 1; + unsigned int vc_can_do_color: 1; + unsigned int vc_report_mouse: 2; + unsigned char vc_utf: 1; + unsigned char vc_utf_count; + int vc_utf_char; + long unsigned int vc_tab_stop[8]; + unsigned char vc_palette[48]; + short unsigned int *vc_translate; + unsigned int vc_resize_user; + unsigned int vc_bell_pitch; + unsigned int vc_bell_duration; + short unsigned int vc_cur_blink_ms; + struct vc_data **vc_display_fg; + struct uni_pagedict *uni_pagedict; + struct uni_pagedict **uni_pagedict_loc; + struct uni_screen *vc_uni_screen; +}; + +struct fb_fix_screeninfo { + char id[16]; + long unsigned int smem_start; + __u32 smem_len; + __u32 type; + __u32 type_aux; + __u32 visual; + __u16 xpanstep; + __u16 ypanstep; + __u16 ywrapstep; + __u32 line_length; + long unsigned int mmio_start; + __u32 mmio_len; + __u32 accel; + __u16 capabilities; + __u16 reserved[2]; +}; + +struct fb_bitfield { + __u32 offset; + __u32 length; + __u32 msb_right; +}; + +struct fb_var_screeninfo { + __u32 xres; + __u32 yres; + __u32 xres_virtual; + __u32 yres_virtual; + __u32 xoffset; + __u32 yoffset; + __u32 bits_per_pixel; + __u32 grayscale; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + __u32 nonstd; + __u32 activate; + __u32 height; + __u32 width; + __u32 accel_flags; + __u32 pixclock; + __u32 left_margin; + __u32 right_margin; + __u32 upper_margin; + __u32 lower_margin; + __u32 hsync_len; + __u32 vsync_len; + __u32 sync; + __u32 vmode; + __u32 rotate; + __u32 colorspace; + __u32 reserved[4]; +}; + +struct fb_cmap { + __u32 start; + __u32 len; + __u16 *red; + __u16 *green; + __u16 *blue; + __u16 *transp; +}; + +enum { + FB_BLANK_UNBLANK = 0, + FB_BLANK_NORMAL = 1, + FB_BLANK_VSYNC_SUSPEND = 2, + FB_BLANK_HSYNC_SUSPEND = 3, + FB_BLANK_POWERDOWN = 4, +}; + +struct fb_copyarea { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 sx; + __u32 sy; +}; + +struct fb_fillrect { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 color; + __u32 rop; +}; + +struct fb_image { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 fg_color; + __u32 bg_color; + __u8 depth; + const char *data; + struct fb_cmap cmap; +}; + +struct fbcurpos { + __u16 x; + __u16 y; +}; + +struct fb_cursor { + __u16 set; + __u16 enable; + __u16 rop; + const char *mask; + struct fbcurpos hot; + struct fb_image image; +}; + +struct fb_chroma { + __u32 redx; + __u32 greenx; + __u32 bluex; + __u32 whitex; + __u32 redy; + __u32 greeny; + __u32 bluey; + __u32 whitey; +}; + +struct fb_videomode; + +struct fb_monspecs { + struct fb_chroma chroma; + struct fb_videomode *modedb; + __u8 manufacturer[4]; + __u8 monitor[14]; + __u8 serial_no[14]; + __u8 ascii[14]; + __u32 modedb_len; + __u32 model; + __u32 serial; + __u32 year; + __u32 week; + __u32 hfmin; + __u32 hfmax; + __u32 dclkmin; + __u32 dclkmax; + __u16 input; + __u16 dpms; + __u16 signal; + __u16 vfmin; + __u16 vfmax; + __u16 gamma; + __u16 gtf: 1; + __u16 misc; + __u8 version; + __u8 revision; + __u8 max_x; + __u8 max_y; +}; + +struct fb_videomode { + const char *name; + u32 refresh; + u32 xres; + u32 yres; + u32 pixclock; + u32 left_margin; + u32 right_margin; + u32 upper_margin; + u32 lower_margin; + u32 hsync_len; + u32 vsync_len; + u32 sync; + u32 vmode; + u32 flag; +}; + +struct fb_info; + +struct fb_event { + struct fb_info *info; + void *data; +}; + +struct fb_pixmap { + u8 *addr; + u32 size; + u32 offset; + u32 buf_align; + u32 scan_align; + u32 access_align; + u32 flags; + u32 blit_x; + u32 blit_y; + void (*writeio)(struct fb_info *, void *, void *, unsigned int); + void (*readio)(struct fb_info *, void *, void *, unsigned int); +}; + +struct fb_deferred_io_pageref; + +struct fb_deferred_io; + +struct fb_ops; + +struct fb_tile_ops; + +struct apertures_struct; + +struct fb_info { + refcount_t count; + int node; + int flags; + int fbcon_rotate_hint; + struct mutex lock; + struct mutex mm_lock; + struct fb_var_screeninfo var; + struct fb_fix_screeninfo fix; + struct fb_monspecs monspecs; + struct fb_pixmap pixmap; + struct fb_pixmap sprite; + struct fb_cmap cmap; + struct list_head modelist; + struct fb_videomode *mode; + struct delayed_work deferred_work; + long unsigned int npagerefs; + struct fb_deferred_io_pageref *pagerefs; + struct fb_deferred_io *fbdefio; + const struct fb_ops *fbops; + struct device *device; + struct device *dev; + int class_flag; + struct fb_tile_ops *tileops; + union { + char *screen_base; + char *screen_buffer; + }; + long unsigned int screen_size; + void *pseudo_palette; + u32 state; + void *fbcon_par; + void *par; + struct apertures_struct *apertures; + bool skip_vt_switch; +}; + +struct fb_blit_caps { + u32 x; + u32 y; + u32 len; + u32 flags; +}; + +struct fb_deferred_io_pageref { + struct page *page; + long unsigned int offset; + struct list_head list; +}; + +struct fb_deferred_io { + long unsigned int delay; + bool sort_pagereflist; + struct mutex lock; + struct list_head pagereflist; + void (*first_io)(struct fb_info *); + void (*deferred_io)(struct fb_info *, struct list_head *); +}; + +struct fb_ops { + struct module *owner; + int (*fb_open)(struct fb_info *, int); + int (*fb_release)(struct fb_info *, int); + ssize_t (*fb_read)(struct fb_info *, char *, size_t, loff_t *); + ssize_t (*fb_write)(struct fb_info *, const char *, size_t, loff_t *); + int (*fb_check_var)(struct fb_var_screeninfo *, struct fb_info *); + int (*fb_set_par)(struct fb_info *); + int (*fb_setcolreg)(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, struct fb_info *); + int (*fb_setcmap)(struct fb_cmap *, struct fb_info *); + int (*fb_blank)(int, struct fb_info *); + int (*fb_pan_display)(struct fb_var_screeninfo *, struct fb_info *); + void (*fb_fillrect)(struct fb_info *, const struct fb_fillrect *); + void (*fb_copyarea)(struct fb_info *, const struct fb_copyarea *); + void (*fb_imageblit)(struct fb_info *, const struct fb_image *); + int (*fb_cursor)(struct fb_info *, struct fb_cursor *); + int (*fb_sync)(struct fb_info *); + int (*fb_ioctl)(struct fb_info *, unsigned int, long unsigned int); + int (*fb_compat_ioctl)(struct fb_info *, unsigned int, long unsigned int); + int (*fb_mmap)(struct fb_info *, struct vm_area_struct *); + void (*fb_get_caps)(struct fb_info *, struct fb_blit_caps *, struct fb_var_screeninfo *); + void (*fb_destroy)(struct fb_info *); + int (*fb_debug_enter)(struct fb_info *); + int (*fb_debug_leave)(struct fb_info *); +}; + +struct fb_tilemap { + __u32 width; + __u32 height; + __u32 depth; + __u32 length; + const __u8 *data; +}; + +struct fb_tilerect { + __u32 sx; + __u32 sy; + __u32 width; + __u32 height; + __u32 index; + __u32 fg; + __u32 bg; + __u32 rop; +}; + +struct fb_tilearea { + __u32 sx; + __u32 sy; + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; +}; + +struct fb_tileblit { + __u32 sx; + __u32 sy; + __u32 width; + __u32 height; + __u32 fg; + __u32 bg; + __u32 length; + __u32 *indices; +}; + +struct fb_tilecursor { + __u32 sx; + __u32 sy; + __u32 mode; + __u32 shape; + __u32 fg; + __u32 bg; +}; + +struct fb_tile_ops { + void (*fb_settile)(struct fb_info *, struct fb_tilemap *); + void (*fb_tilecopy)(struct fb_info *, struct fb_tilearea *); + void (*fb_tilefill)(struct fb_info *, struct fb_tilerect *); + void (*fb_tileblit)(struct fb_info *, struct fb_tileblit *); + void (*fb_tilecursor)(struct fb_info *, struct fb_tilecursor *); + int (*fb_get_tilemax)(struct fb_info *); +}; + +struct aperture { + resource_size_t base; + resource_size_t size; +}; + +struct apertures_struct { + unsigned int count; + long: 32; + struct aperture ranges[0]; +}; + +enum backlight_update_reason { + BACKLIGHT_UPDATE_HOTKEY = 0, + BACKLIGHT_UPDATE_SYSFS = 1, +}; + +enum backlight_type { + BACKLIGHT_RAW = 1, + BACKLIGHT_PLATFORM = 2, + BACKLIGHT_FIRMWARE = 3, + BACKLIGHT_TYPE_MAX = 4, +}; + +enum backlight_notification { + BACKLIGHT_REGISTERED = 0, + BACKLIGHT_UNREGISTERED = 1, +}; + +enum backlight_scale { + BACKLIGHT_SCALE_UNKNOWN = 0, + BACKLIGHT_SCALE_LINEAR = 1, + BACKLIGHT_SCALE_NON_LINEAR = 2, +}; + +struct backlight_device; + +struct backlight_ops { + unsigned int options; + int (*update_status)(struct backlight_device *); + int (*get_brightness)(struct backlight_device *); + int (*check_fb)(struct backlight_device *, struct fb_info *); +}; + +struct backlight_properties { + int brightness; + int max_brightness; + int power; + int fb_blank; + enum backlight_type type; + unsigned int state; + enum backlight_scale scale; +}; + +struct backlight_device { + struct backlight_properties props; + struct mutex update_lock; + struct mutex ops_lock; + const struct backlight_ops *ops; + struct notifier_block fb_notif; + struct list_head entry; + long: 32; + struct device dev; + bool fb_bl_on[32]; + int use_count; + long: 32; +}; + +struct fb_cmap_user { + __u32 start; + __u32 len; + __u16 *red; + __u16 *green; + __u16 *blue; + __u16 *transp; +}; + +struct fb_modelist { + struct list_head list; + struct fb_videomode mode; +}; + +struct dmt_videomode { + u32 dmt_id; + u32 std_2byte_code; + u32 cvt_3byte_code; + const struct fb_videomode *mode; +}; + +enum display_flags { + DISPLAY_FLAGS_HSYNC_LOW = 1, + DISPLAY_FLAGS_HSYNC_HIGH = 2, + DISPLAY_FLAGS_VSYNC_LOW = 4, + DISPLAY_FLAGS_VSYNC_HIGH = 8, + DISPLAY_FLAGS_DE_LOW = 16, + DISPLAY_FLAGS_DE_HIGH = 32, + DISPLAY_FLAGS_PIXDATA_POSEDGE = 64, + DISPLAY_FLAGS_PIXDATA_NEGEDGE = 128, + DISPLAY_FLAGS_INTERLACED = 256, + DISPLAY_FLAGS_DOUBLESCAN = 512, + DISPLAY_FLAGS_DOUBLECLK = 1024, + DISPLAY_FLAGS_SYNC_POSEDGE = 2048, + DISPLAY_FLAGS_SYNC_NEGEDGE = 4096, +}; + +struct videomode { + long unsigned int pixelclock; + u32 hactive; + u32 hfront_porch; + u32 hback_porch; + u32 hsync_len; + u32 vactive; + u32 vfront_porch; + u32 vback_porch; + u32 vsync_len; + enum display_flags flags; +}; + +struct broken_edid { + u8 manufacturer[4]; + u32 model; + u32 fix; +}; + +struct __fb_timings { + u32 dclk; + u32 hfreq; + u32 vfreq; + u32 hactive; + u32 vactive; + u32 hblank; + u32 vblank; + u32 htotal; + u32 vtotal; +}; + +struct fb_cvt_data { + u32 xres; + u32 yres; + u32 refresh; + u32 f_refresh; + u32 pixclock; + u32 hperiod; + u32 hblank; + u32 hfreq; + u32 htotal; + u32 vtotal; + u32 vsync; + u32 hsync; + u32 h_front_porch; + u32 h_back_porch; + u32 v_front_porch; + u32 v_back_porch; + u32 h_margin; + u32 v_margin; + u32 interlace; + u32 aspect_ratio; + u32 active_pixels; + u32 flags; + u32 status; +}; + +typedef unsigned char u_char; + +typedef short unsigned int u_short; + +struct fb_con2fbmap { + __u32 console; + __u32 framebuffer; +}; + +struct vc { + struct vc_data *d; + struct work_struct SAK_work; +}; + +struct fbcon_display { + const u_char *fontdata; + int userfont; + u_short inverse; + short int yscroll; + int vrows; + int cursor_shape; + int con_rotate; + u32 xres_virtual; + u32 yres_virtual; + u32 height; + u32 width; + u32 bits_per_pixel; + u32 grayscale; + u32 nonstd; + u32 accel_flags; + u32 rotate; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + const struct fb_videomode *mode; +}; + +struct fbcon_ops { + void (*bmove)(struct vc_data *, struct fb_info *, int, int, int, int, int, int); + void (*clear)(struct vc_data *, struct fb_info *, int, int, int, int); + void (*putcs)(struct vc_data *, struct fb_info *, const short unsigned int *, int, int, int, int, int); + void (*clear_margins)(struct vc_data *, struct fb_info *, int, int); + void (*cursor)(struct vc_data *, struct fb_info *, int, int, int); + int (*update_start)(struct fb_info *); + int (*rotate_font)(struct fb_info *, struct vc_data *); + struct fb_var_screeninfo var; + struct delayed_work cursor_work; + struct fb_cursor cursor_state; + struct fbcon_display *p; + struct fb_info *info; + int currcon; + int cur_blink_jiffies; + int cursor_flash; + int cursor_reset; + int blank_state; + int graphics; + int save_graphics; + bool initialized; + int rotate; + int cur_rotate; + char *cursor_data; + u8 *fontbuffer; + u8 *fontdata; + u8 *cursor_src; + u32 cursor_size; + u32 fd_size; +}; + +enum { + FBCON_LOGO_CANSHOW = 4294967295, + FBCON_LOGO_DRAW = 4294967294, + FBCON_LOGO_DONTSHOW = 4294967293, +}; + +enum { + CLCD_CAP_RGB444 = 1, + CLCD_CAP_RGB5551 = 2, + CLCD_CAP_RGB565 = 4, + CLCD_CAP_RGB888 = 8, + CLCD_CAP_BGR444 = 16, + CLCD_CAP_BGR5551 = 32, + CLCD_CAP_BGR565 = 64, + CLCD_CAP_BGR888 = 128, + CLCD_CAP_444 = 17, + CLCD_CAP_5551 = 34, + CLCD_CAP_565 = 68, + CLCD_CAP_888 = 136, + CLCD_CAP_RGB = 15, + CLCD_CAP_BGR = 240, + CLCD_CAP_ALL = 255, +}; + +struct clcd_panel { + struct fb_videomode mode; + short int width; + short int height; + u32 tim2; + u32 tim3; + u32 cntl; + u32 caps; + unsigned int bpp: 8; + unsigned int fixedtimings: 1; + unsigned int grayscale: 1; + unsigned int connector; + struct backlight_device *backlight; + bool bgr_connection; +}; + +struct clcd_regs { + u32 tim0; + u32 tim1; + u32 tim2; + u32 tim3; + u32 cntl; + long unsigned int pixclock; +}; + +struct clcd_fb; + +struct clcd_board { + const char *name; + u32 caps; + int (*check)(struct clcd_fb *, struct fb_var_screeninfo *); + void (*decode)(struct clcd_fb *, struct clcd_regs *); + void (*disable)(struct clcd_fb *); + void (*enable)(struct clcd_fb *); + int (*setup)(struct clcd_fb *); + int (*mmap)(struct clcd_fb *, struct vm_area_struct *); + void (*remove)(struct clcd_fb *); +}; + +struct clcd_fb { + struct fb_info fb; + struct amba_device *dev; + struct clk *clk; + struct clcd_panel *panel; + struct clcd_board *board; + void *board_data; + void *regs; + u16 off_ienb; + u16 off_cntl; + u32 clcd_cntl; + u32 cmap[16]; + bool clk_enabled; +}; + +struct timing_entry { + u32 min; + u32 typ; + u32 max; +}; + +struct display_timing { + struct timing_entry pixelclock; + struct timing_entry hactive; + struct timing_entry hfront_porch; + struct timing_entry hback_porch; + struct timing_entry hsync_len; + struct timing_entry vactive; + struct timing_entry vfront_porch; + struct timing_entry vback_porch; + struct timing_entry vsync_len; + enum display_flags flags; +}; + +struct vt8500lcd_info { + struct fb_info fb; + void *regbase; + void *palette_cpu; + dma_addr_t palette_phys; + size_t palette_size; + wait_queue_head_t wait; +}; + +struct display_timings; + +struct wm8505fb_info { + struct fb_info fb; + void *regbase; + unsigned int contrast; +}; + +typedef uint32_t evtchn_port_t; + +struct xenfb_update { + uint8_t type; + int32_t x; + int32_t y; + int32_t width; + int32_t height; +}; + +struct xenfb_resize { + uint8_t type; + int32_t width; + int32_t height; + int32_t stride; + int32_t depth; + int32_t offset; +}; + +union xenfb_out_event { + uint8_t type; + struct xenfb_update update; + struct xenfb_resize resize; + char pad[40]; +}; + +struct xenfb_page { + uint32_t in_cons; + uint32_t in_prod; + uint32_t out_cons; + uint32_t out_prod; + int32_t width; + int32_t height; + uint32_t line_length; + uint32_t mem_length; + uint8_t depth; + long unsigned int pd[256]; +}; + +enum xenbus_state { + XenbusStateUnknown = 0, + XenbusStateInitialising = 1, + XenbusStateInitWait = 2, + XenbusStateInitialised = 3, + XenbusStateConnected = 4, + XenbusStateClosing = 5, + XenbusStateClosed = 6, + XenbusStateReconfiguring = 7, + XenbusStateReconfigured = 8, +}; + +struct xenbus_watch { + struct list_head list; + const char *node; + unsigned int nr_pending; + bool (*will_handle)(struct xenbus_watch *, const char *, const char *); + void (*callback)(struct xenbus_watch *, const char *, const char *); +}; + +struct xenbus_device { + const char *devicetype; + const char *nodename; + const char *otherend; + int otherend_id; + struct xenbus_watch otherend_watch; + struct device dev; + enum xenbus_state state; + struct completion down; + struct work_struct work; + struct semaphore reclaim_sem; + atomic_t event_channels; + atomic_t events; + atomic_t spurious_events; + atomic_t jiffies_eoi_delayed; + unsigned int spurious_threshold; +}; + +struct xenbus_device_id { + char devicetype[32]; +}; + +struct xenbus_driver { + const char *name; + const struct xenbus_device_id *ids; + bool allow_rebind; + bool not_essential; + int (*probe)(struct xenbus_device *, const struct xenbus_device_id *); + void (*otherend_changed)(struct xenbus_device *, enum xenbus_state); + void (*remove)(struct xenbus_device *); + int (*suspend)(struct xenbus_device *); + int (*resume)(struct xenbus_device *); + int (*uevent)(struct xenbus_device *, struct kobj_uevent_env *); + struct device_driver driver; + int (*read_otherend_details)(struct xenbus_device *); + int (*is_ready)(struct xenbus_device *); + void (*reclaim_memory)(struct xenbus_device *); +}; + +struct xenbus_transaction { + u32 id; +}; + +struct xenfb_info { + unsigned char *fb; + struct fb_info *fb_info; + int x1; + int y1; + int x2; + int y2; + spinlock_t dirty_lock; + int nr_pages; + int irq; + struct xenfb_page *page; + long unsigned int *gfns; + int update_wanted; + int feature_resize; + struct xenfb_resize resize; + int resize_dpy; + spinlock_t resize_lock; + struct xenbus_device *xbdev; +}; + +enum { + KPARAM_MEM = 0, + KPARAM_WIDTH = 1, + KPARAM_HEIGHT = 2, + KPARAM_CNT = 3, +}; + +enum drm_panel_orientation { + DRM_MODE_PANEL_ORIENTATION_UNKNOWN = 4294967295, + DRM_MODE_PANEL_ORIENTATION_NORMAL = 0, + DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP = 1, + DRM_MODE_PANEL_ORIENTATION_LEFT_UP = 2, + DRM_MODE_PANEL_ORIENTATION_RIGHT_UP = 3, +}; + +typedef s32 dma_cookie_t; + +enum dma_status { + DMA_COMPLETE = 0, + DMA_IN_PROGRESS = 1, + DMA_PAUSED = 2, + DMA_ERROR = 3, + DMA_OUT_OF_ORDER = 4, +}; + +enum dma_transaction_type { + DMA_MEMCPY = 0, + DMA_XOR = 1, + DMA_PQ = 2, + DMA_XOR_VAL = 3, + DMA_PQ_VAL = 4, + DMA_MEMSET = 5, + DMA_MEMSET_SG = 6, + DMA_INTERRUPT = 7, + DMA_PRIVATE = 8, + DMA_ASYNC_TX = 9, + DMA_SLAVE = 10, + DMA_CYCLIC = 11, + DMA_INTERLEAVE = 12, + DMA_COMPLETION_NO_ORDER = 13, + DMA_REPEAT = 14, + DMA_LOAD_EOT = 15, + DMA_TX_TYPE_END = 16, +}; + +enum dma_transfer_direction { + DMA_MEM_TO_MEM = 0, + DMA_MEM_TO_DEV = 1, + DMA_DEV_TO_MEM = 2, + DMA_DEV_TO_DEV = 3, + DMA_TRANS_NONE = 4, +}; + +struct data_chunk { + size_t size; + size_t icg; + size_t dst_icg; + size_t src_icg; +}; + +struct dma_interleaved_template { + dma_addr_t src_start; + dma_addr_t dst_start; + enum dma_transfer_direction dir; + bool src_inc; + bool dst_inc; + bool src_sgl; + bool dst_sgl; + size_t numf; + size_t frame_size; + struct data_chunk sgl[0]; +}; + +enum dma_ctrl_flags { + DMA_PREP_INTERRUPT = 1, + DMA_CTRL_ACK = 2, + DMA_PREP_PQ_DISABLE_P = 4, + DMA_PREP_PQ_DISABLE_Q = 8, + DMA_PREP_CONTINUE = 16, + DMA_PREP_FENCE = 32, + DMA_CTRL_REUSE = 64, + DMA_PREP_CMD = 128, + DMA_PREP_REPEAT = 256, + DMA_PREP_LOAD_EOT = 512, +}; + +enum sum_check_bits { + SUM_CHECK_P = 0, + SUM_CHECK_Q = 1, +}; + +enum sum_check_flags { + SUM_CHECK_P_RESULT = 1, + SUM_CHECK_Q_RESULT = 2, +}; + +typedef struct { + long unsigned int bits[1]; +} dma_cap_mask_t; + +enum dma_desc_metadata_mode { + DESC_METADATA_NONE = 0, + DESC_METADATA_CLIENT = 1, + DESC_METADATA_ENGINE = 2, +}; + +struct dma_chan_percpu { + long unsigned int memcpy_count; + long unsigned int bytes_transferred; +}; + +struct dma_router { + struct device *dev; + void (*route_free)(struct device *, void *); +}; + +struct dma_device; + +struct dma_chan_dev; + +struct dma_chan { + struct dma_device *device; + struct device *slave; + dma_cookie_t cookie; + dma_cookie_t completed_cookie; + int chan_id; + struct dma_chan_dev *dev; + const char *name; + char *dbg_client_name; + struct list_head device_node; + struct dma_chan_percpu *local; + int client_count; + int table_count; + struct dma_router *router; + void *route_data; + void *private; +}; + +typedef bool (*dma_filter_fn)(struct dma_chan *, void *); + +struct dma_filter { + dma_filter_fn fn; + int mapcnt; + const struct dma_slave_map *map; +}; + +enum dmaengine_alignment { + DMAENGINE_ALIGN_1_BYTE = 0, + DMAENGINE_ALIGN_2_BYTES = 1, + DMAENGINE_ALIGN_4_BYTES = 2, + DMAENGINE_ALIGN_8_BYTES = 3, + DMAENGINE_ALIGN_16_BYTES = 4, + DMAENGINE_ALIGN_32_BYTES = 5, + DMAENGINE_ALIGN_64_BYTES = 6, + DMAENGINE_ALIGN_128_BYTES = 7, + DMAENGINE_ALIGN_256_BYTES = 8, +}; + +enum dma_residue_granularity { + DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0, + DMA_RESIDUE_GRANULARITY_SEGMENT = 1, + DMA_RESIDUE_GRANULARITY_BURST = 2, +}; + +struct dma_async_tx_descriptor; + +struct dma_slave_caps; + +struct dma_slave_config; + +struct dma_tx_state; + +struct dma_device { + struct kref ref; + unsigned int chancnt; + unsigned int privatecnt; + struct list_head channels; + struct list_head global_node; + struct dma_filter filter; + dma_cap_mask_t cap_mask; + enum dma_desc_metadata_mode desc_metadata_modes; + short unsigned int max_xor; + short unsigned int max_pq; + enum dmaengine_alignment copy_align; + enum dmaengine_alignment xor_align; + enum dmaengine_alignment pq_align; + enum dmaengine_alignment fill_align; + int dev_id; + struct device *dev; + struct module *owner; + struct ida chan_ida; + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool descriptor_reuse; + enum dma_residue_granularity residue_granularity; + int (*device_alloc_chan_resources)(struct dma_chan *); + int (*device_router_config)(struct dma_chan *); + void (*device_free_chan_resources)(struct dma_chan *); + struct dma_async_tx_descriptor * (*device_prep_dma_memcpy)(struct dma_chan *, dma_addr_t, dma_addr_t, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_xor)(struct dma_chan *, dma_addr_t, dma_addr_t *, unsigned int, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_xor_val)(struct dma_chan *, dma_addr_t *, unsigned int, size_t, enum sum_check_flags *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_pq)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_pq_val)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, enum sum_check_flags *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_memset)(struct dma_chan *, dma_addr_t, int, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_memset_sg)(struct dma_chan *, struct scatterlist *, unsigned int, int, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_interrupt)(struct dma_chan *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_slave_sg)(struct dma_chan *, struct scatterlist *, unsigned int, enum dma_transfer_direction, long unsigned int, void *); + struct dma_async_tx_descriptor * (*device_prep_dma_cyclic)(struct dma_chan *, dma_addr_t, size_t, size_t, enum dma_transfer_direction, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_interleaved_dma)(struct dma_chan *, struct dma_interleaved_template *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_imm_data)(struct dma_chan *, dma_addr_t, u64, long unsigned int); + void (*device_caps)(struct dma_chan *, struct dma_slave_caps *); + int (*device_config)(struct dma_chan *, struct dma_slave_config *); + int (*device_pause)(struct dma_chan *); + int (*device_resume)(struct dma_chan *); + int (*device_terminate_all)(struct dma_chan *); + void (*device_synchronize)(struct dma_chan *); + enum dma_status (*device_tx_status)(struct dma_chan *, dma_cookie_t, struct dma_tx_state *); + void (*device_issue_pending)(struct dma_chan *); + void (*device_release)(struct dma_device *); + void (*dbg_summary_show)(struct seq_file *, struct dma_device *); + struct dentry *dbg_dev_root; +}; + +struct dma_chan_dev { + struct dma_chan *chan; + long: 32; + struct device device; + int dev_id; + bool chan_dma_dev; +}; + +enum dma_slave_buswidth { + DMA_SLAVE_BUSWIDTH_UNDEFINED = 0, + DMA_SLAVE_BUSWIDTH_1_BYTE = 1, + DMA_SLAVE_BUSWIDTH_2_BYTES = 2, + DMA_SLAVE_BUSWIDTH_3_BYTES = 3, + DMA_SLAVE_BUSWIDTH_4_BYTES = 4, + DMA_SLAVE_BUSWIDTH_8_BYTES = 8, + DMA_SLAVE_BUSWIDTH_16_BYTES = 16, + DMA_SLAVE_BUSWIDTH_32_BYTES = 32, + DMA_SLAVE_BUSWIDTH_64_BYTES = 64, + DMA_SLAVE_BUSWIDTH_128_BYTES = 128, +}; + +struct dma_slave_config { + enum dma_transfer_direction direction; + long: 32; + phys_addr_t src_addr; + phys_addr_t dst_addr; + enum dma_slave_buswidth src_addr_width; + enum dma_slave_buswidth dst_addr_width; + u32 src_maxburst; + u32 dst_maxburst; + u32 src_port_window_size; + u32 dst_port_window_size; + bool device_fc; + void *peripheral_config; + size_t peripheral_size; + long: 32; +}; + +struct dma_slave_caps { + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool cmd_pause; + bool cmd_resume; + bool cmd_terminate; + enum dma_residue_granularity residue_granularity; + bool descriptor_reuse; +}; + +typedef void (*dma_async_tx_callback)(void *); + +enum dmaengine_tx_result { + DMA_TRANS_NOERROR = 0, + DMA_TRANS_READ_FAILED = 1, + DMA_TRANS_WRITE_FAILED = 2, + DMA_TRANS_ABORTED = 3, +}; + +struct dmaengine_result { + enum dmaengine_tx_result result; + u32 residue; +}; + +typedef void (*dma_async_tx_callback_result)(void *, const struct dmaengine_result *); + +struct dmaengine_unmap_data { + u16 map_cnt; + u8 to_cnt; + u8 from_cnt; + u8 bidi_cnt; + struct device *dev; + struct kref kref; + size_t len; + long: 32; + dma_addr_t addr[0]; +}; + +struct dma_descriptor_metadata_ops { + int (*attach)(struct dma_async_tx_descriptor *, void *, size_t); + void * (*get_ptr)(struct dma_async_tx_descriptor *, size_t *, size_t *); + int (*set_len)(struct dma_async_tx_descriptor *, size_t); +}; + +struct dma_async_tx_descriptor { + dma_cookie_t cookie; + enum dma_ctrl_flags flags; + dma_addr_t phys; + struct dma_chan *chan; + dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *); + int (*desc_free)(struct dma_async_tx_descriptor *); + dma_async_tx_callback callback; + dma_async_tx_callback_result callback_result; + void *callback_param; + struct dmaengine_unmap_data *unmap; + enum dma_desc_metadata_mode desc_metadata_mode; + struct dma_descriptor_metadata_ops *metadata_ops; + struct dma_async_tx_descriptor *next; + struct dma_async_tx_descriptor *parent; + spinlock_t lock; +}; + +struct dma_tx_state { + dma_cookie_t last; + dma_cookie_t used; + u32 residue; + u32 in_flight_bytes; +}; + +enum ipu_channel { + IDMAC_IC_0 = 0, + IDMAC_IC_1 = 1, + IDMAC_ADC_0 = 1, + IDMAC_IC_2 = 2, + IDMAC_ADC_1 = 2, + IDMAC_IC_3 = 3, + IDMAC_IC_4 = 4, + IDMAC_IC_5 = 5, + IDMAC_IC_6 = 6, + IDMAC_IC_7 = 7, + IDMAC_IC_8 = 8, + IDMAC_IC_9 = 9, + IDMAC_IC_10 = 10, + IDMAC_IC_11 = 11, + IDMAC_IC_12 = 12, + IDMAC_IC_13 = 13, + IDMAC_SDC_0 = 14, + IDMAC_SDC_1 = 15, + IDMAC_SDC_2 = 16, + IDMAC_SDC_3 = 17, + IDMAC_ADC_2 = 18, + IDMAC_ADC_3 = 19, + IDMAC_ADC_4 = 20, + IDMAC_ADC_5 = 21, + IDMAC_ADC_6 = 22, + IDMAC_ADC_7 = 23, + IDMAC_PF_0 = 24, + IDMAC_PF_1 = 25, + IDMAC_PF_2 = 26, + IDMAC_PF_3 = 27, + IDMAC_PF_4 = 28, + IDMAC_PF_5 = 29, + IDMAC_PF_6 = 30, + IDMAC_PF_7 = 31, +}; + +enum ipu_channel_status { + IPU_CHANNEL_FREE = 0, + IPU_CHANNEL_INITIALIZED = 1, + IPU_CHANNEL_READY = 2, + IPU_CHANNEL_ENABLED = 3, +}; + +enum pixel_fmt { + IPU_PIX_FMT_GENERIC = 0, + IPU_PIX_FMT_RGB332 = 1, + IPU_PIX_FMT_YUV420P = 2, + IPU_PIX_FMT_YUV422P = 3, + IPU_PIX_FMT_YUV420P2 = 4, + IPU_PIX_FMT_YVU422P = 5, + IPU_PIX_FMT_RGB565 = 6, + IPU_PIX_FMT_RGB666 = 7, + IPU_PIX_FMT_BGR666 = 8, + IPU_PIX_FMT_YUYV = 9, + IPU_PIX_FMT_UYVY = 10, + IPU_PIX_FMT_RGB24 = 11, + IPU_PIX_FMT_BGR24 = 12, + IPU_PIX_FMT_GENERIC_32 = 13, + IPU_PIX_FMT_RGB32 = 14, + IPU_PIX_FMT_BGR32 = 15, + IPU_PIX_FMT_ABGR32 = 16, + IPU_PIX_FMT_BGRA32 = 17, + IPU_PIX_FMT_RGBA32 = 18, +}; + +enum display_port { + DISP0 = 0, + DISP1 = 1, + DISP2 = 2, + DISP3 = 3, +}; + +struct idmac_video_param { + short unsigned int in_width; + short unsigned int in_height; + uint32_t in_pixel_fmt; + short unsigned int out_width; + short unsigned int out_height; + uint32_t out_pixel_fmt; + short unsigned int out_stride; + bool graphics_combine_en; + bool global_alpha_en; + bool key_color_en; + enum display_port disp; + short unsigned int out_left; + short unsigned int out_top; +}; + +union ipu_channel_param { + struct idmac_video_param video; +}; + +struct idmac_tx_desc { + struct dma_async_tx_descriptor txd; + struct scatterlist *sg; + unsigned int sg_len; + struct list_head list; +}; + +struct idmac_channel { + struct dma_chan dma_chan; + dma_cookie_t completed; + union ipu_channel_param params; + enum ipu_channel link; + enum ipu_channel_status status; + void *client; + unsigned int n_tx_desc; + struct idmac_tx_desc *desc; + struct scatterlist *sg[2]; + struct list_head free_list; + struct list_head queue; + spinlock_t lock; + struct mutex chan_mutex; + bool sec_chan_en; + int active_buffer; + unsigned int eof_irq; + char eof_name[16]; +}; + +enum disp_data_mapping { + IPU_DISP_DATA_MAPPING_RGB666 = 0, + IPU_DISP_DATA_MAPPING_RGB565 = 1, + IPU_DISP_DATA_MAPPING_RGB888 = 2, +}; + +struct mx3fb_platform_data { + struct device *dma_dev; + const char *name; + const struct fb_videomode *mode; + int num_modes; + enum disp_data_mapping disp_data_fmt; +}; + +enum ipu_panel { + IPU_PANEL_SHARP_TFT = 0, + IPU_PANEL_TFT = 1, +}; + +struct ipu_di_signal_cfg { + unsigned int datamask_en: 1; + unsigned int clksel_en: 1; + unsigned int clkidle_en: 1; + unsigned int data_pol: 1; + unsigned int clk_pol: 1; + unsigned int enable_pol: 1; + unsigned int Hsync_pol: 1; + unsigned int Vsync_pol: 1; +}; + +struct mx3fb_data { + struct fb_info *fbi; + int backlight_level; + void *reg_base; + spinlock_t lock; + struct device *dev; + struct backlight_device *bl; + uint32_t h_start_width; + uint32_t v_start_width; + enum disp_data_mapping disp_data_fmt; +}; + +struct dma_chan_request { + struct mx3fb_data *mx3fb; + enum ipu_channel id; +}; + +struct mx3fb_info { + int blank; + enum ipu_channel ipu_ch; + uint32_t cur_ipu_buf; + u32 pseudo_palette[16]; + struct completion flip_cmpl; + struct mutex mutex; + struct mx3fb_data *mx3fb; + struct idmac_channel *idmac_channel; + struct dma_async_tx_descriptor *txd; + dma_cookie_t cookie; + struct scatterlist sg[2]; + struct fb_var_screeninfo cur_var; +}; + +struct di_mapping { + uint32_t b0; + uint32_t b1; + uint32_t b2; +}; + +struct simplefb_format { + const char *name; + u32 bits_per_pixel; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + u32 fourcc; +}; + +struct simplefb_platform_data { + u32 width; + u32 height; + u32 stride; + const char *format; +}; + +struct simplefb_par { + u32 palette[16]; + struct resource *mem; + bool clks_enabled; + unsigned int clk_count; + struct clk **clks; + bool regulators_enabled; + u32 regulator_count; + struct regulator **regulators; +}; + +struct simplefb_params { + u32 width; + u32 height; + u32 stride; + struct simplefb_format *format; +}; + +struct display_timings { + unsigned int num_timings; + unsigned int native_mode; + struct display_timing **timings; +}; + +struct tegra_ahb { + void *regs; + struct device *dev; + u32 ctx[0]; +}; + +struct devm_clk_state { + struct clk *clk; + void (*exit)(struct clk *); +}; + +struct clk_bulk_devres { + struct clk_bulk_data *clks; + int num_clks; +}; + +struct clk_lookup_alloc { + struct clk_lookup cl; + char dev_id[20]; + char con_id[16]; +}; + +struct clk_notifier { + struct clk *clk; + struct srcu_notifier_head notifier_head; + struct list_head node; +}; + +struct clk_parent_map; + +struct clk_core { + const char *name; + const struct clk_ops *ops; + struct clk_hw *hw; + struct module *owner; + struct device *dev; + struct device_node *of_node; + struct clk_core *parent; + struct clk_parent_map *parents; + u8 num_parents; + u8 new_parent_index; + long unsigned int rate; + long unsigned int req_rate; + long unsigned int new_rate; + struct clk_core *new_parent; + struct clk_core *new_child; + long unsigned int flags; + bool orphan; + bool rpm_enabled; + unsigned int enable_count; + unsigned int prepare_count; + unsigned int protect_count; + long unsigned int min_rate; + long unsigned int max_rate; + long unsigned int accuracy; + int phase; + struct clk_duty duty; + struct hlist_head children; + struct hlist_node child_node; + struct hlist_head clks; + unsigned int notifier_count; + struct dentry *dentry; + struct hlist_node debug_node; + struct kref ref; +}; + +struct clk_onecell_data { + struct clk **clks; + unsigned int clk_num; +}; + +struct clk_hw_onecell_data { + unsigned int num; + struct clk_hw *hws[0]; +}; + +struct clk_parent_map { + const struct clk_hw *hw; + struct clk_core *core; + const char *fw_name; + const char *name; + int index; +}; + +struct trace_event_raw_clk { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_clk_rate { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int rate; + char __data[0]; +}; + +struct trace_event_raw_clk_rate_range { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int min; + long unsigned int max; + char __data[0]; +}; + +struct trace_event_raw_clk_parent { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_pname; + char __data[0]; +}; + +struct trace_event_raw_clk_phase { + struct trace_entry ent; + u32 __data_loc_name; + int phase; + char __data[0]; +}; + +struct trace_event_raw_clk_duty_cycle { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int num; + unsigned int den; + char __data[0]; +}; + +struct trace_event_raw_clk_rate_request { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_pname; + long unsigned int min; + long unsigned int max; + long unsigned int prate; + char __data[0]; +}; + +struct trace_event_data_offsets_clk { + u32 name; +}; + +struct trace_event_data_offsets_clk_rate { + u32 name; +}; + +struct trace_event_data_offsets_clk_rate_range { + u32 name; +}; + +struct trace_event_data_offsets_clk_parent { + u32 name; + u32 pname; +}; + +struct trace_event_data_offsets_clk_phase { + u32 name; +}; + +struct trace_event_data_offsets_clk_duty_cycle { + u32 name; +}; + +struct trace_event_data_offsets_clk_rate_request { + u32 name; + u32 pname; +}; + +typedef void (*btf_trace_clk_enable)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_enable_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_disable)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_disable_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_prepare)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_prepare_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_unprepare)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_unprepare_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_set_rate)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_rate_complete)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_min_rate)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_max_rate)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_rate_range)(void *, struct clk_core *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_clk_set_parent)(void *, struct clk_core *, struct clk_core *); + +typedef void (*btf_trace_clk_set_parent_complete)(void *, struct clk_core *, struct clk_core *); + +typedef void (*btf_trace_clk_set_phase)(void *, struct clk_core *, int); + +typedef void (*btf_trace_clk_set_phase_complete)(void *, struct clk_core *, int); + +typedef void (*btf_trace_clk_set_duty_cycle)(void *, struct clk_core *, struct clk_duty *); + +typedef void (*btf_trace_clk_set_duty_cycle_complete)(void *, struct clk_core *, struct clk_duty *); + +typedef void (*btf_trace_clk_rate_request_start)(void *, struct clk_rate_request *); + +typedef void (*btf_trace_clk_rate_request_done)(void *, struct clk_rate_request *); + +struct clk_notifier_devres { + struct clk *clk; + struct notifier_block *nb; +}; + +struct of_clk_provider { + struct list_head link; + struct device_node *node; + struct clk * (*get)(struct of_phandle_args *, void *); + struct clk_hw * (*get_hw)(struct of_phandle_args *, void *); + void *data; +}; + +struct clock_provider { + void (*clk_init_cb)(struct device_node *); + struct device_node *np; + struct list_head node; +}; + +struct clk_div_table { + unsigned int val; + unsigned int div; +}; + +struct clk_divider { + struct clk_hw hw; + void *reg; + u8 shift; + u8 width; + u8 flags; + const struct clk_div_table *table; + spinlock_t *lock; +}; + +typedef void (*of_init_fn_1)(struct device_node *); + +struct clk_fixed_factor { + struct clk_hw hw; + unsigned int mult; + unsigned int div; +}; + +struct clk_fixed_rate { + struct clk_hw hw; + long unsigned int fixed_rate; + long unsigned int fixed_accuracy; + long unsigned int flags; +}; + +struct clk_gate { + struct clk_hw hw; + void *reg; + u8 bit_idx; + u8 flags; + spinlock_t *lock; +}; + +struct clk_multiplier { + struct clk_hw hw; + void *reg; + u8 shift; + u8 width; + u8 flags; + spinlock_t *lock; +}; + +struct clk_mux { + struct clk_hw hw; + void *reg; + const u32 *table; + u32 mask; + u8 shift; + u8 flags; + spinlock_t *lock; +}; + +struct clk_composite { + struct clk_hw hw; + struct clk_ops ops; + struct clk_hw *mux_hw; + struct clk_hw *rate_hw; + struct clk_hw *gate_hw; + const struct clk_ops *mux_ops; + const struct clk_ops *rate_ops; + const struct clk_ops *gate_ops; +}; + +struct u32_fract { + __u32 numerator; + __u32 denominator; +}; + +struct clk_fractional_divider { + struct clk_hw hw; + void *reg; + u8 mshift; + u8 mwidth; + u32 mmask; + u8 nshift; + u8 nwidth; + u32 nmask; + u8 flags; + void (*approximation)(struct clk_hw *, long unsigned int, long unsigned int *, long unsigned int *, long unsigned int *); + spinlock_t *lock; +}; + +struct clk_gpio { + struct clk_hw hw; + struct gpio_desc *gpiod; +}; + +struct aspeed_gate_data { + u8 clock_idx; + s8 reset_idx; + const char *name; + const char *parent_name; + long unsigned int flags; +}; + +struct aspeed_clk_gate { + struct clk_hw hw; + struct regmap *map; + u8 clock_idx; + s8 reset_idx; + u8 flags; + spinlock_t *lock; +}; + +struct aspeed_reset { + struct regmap *map; + struct reset_controller_dev rcdev; +}; + +struct aspeed_clk_soc_data { + const struct clk_div_table *div_table; + const struct clk_div_table *eclk_div_table; + const struct clk_div_table *mac_div_table; + struct clk_hw * (*calc_pll)(const char *, u32); +}; + +struct hb_clk { + struct clk_hw hw; + void *reg; + char *parent_name; +}; + +struct stm32_mmux { + u8 nbr_clk; + struct clk_hw *hws[2]; +}; + +struct stm32_clk_mmux { + struct clk_mux mux; + struct stm32_mmux *mmux; +}; + +struct stm32_mgate { + u8 nbr_clk; + u32 flag; +}; + +struct stm32_clk_mgate { + struct clk_gate gate; + struct stm32_mgate *mgate; + u32 mask; +}; + +struct clock_config { + u32 id; + const char *name; + const char *parent_name; + const char * const *parent_names; + const struct clk_parent_data *parent_data; + int num_parents; + long unsigned int flags; + void *cfg; + struct clk_hw * (*func)(struct device *, struct clk_hw_onecell_data *, void *, spinlock_t *, const struct clock_config *); +}; + +struct gate_cfg { + u32 reg_off; + u8 bit_idx; + u8 gate_flags; +}; + +struct fixed_factor_cfg { + unsigned int mult; + unsigned int div; +}; + +struct div_cfg { + u32 reg_off; + u8 shift; + u8 width; + u8 div_flags; + const struct clk_div_table *table; +}; + +struct mux_cfg { + u32 reg_off; + u8 shift; + u8 width; + u8 mux_flags; + u32 *table; +}; + +struct stm32_gate_cfg { + struct gate_cfg *gate; + struct stm32_mgate *mgate; + const struct clk_ops *ops; +}; + +struct stm32_div_cfg { + struct div_cfg *div; + const struct clk_ops *ops; +}; + +struct stm32_mux_cfg { + struct mux_cfg *mux; + struct stm32_mmux *mmux; + const struct clk_ops *ops; +}; + +struct stm32_composite_cfg { + const struct stm32_gate_cfg *gate; + const struct stm32_div_cfg *div; + const struct stm32_mux_cfg *mux; +}; + +struct stm32_pll_obj { + spinlock_t *lock; + void *reg; + struct clk_hw hw; + struct clk_mux mux; +}; + +struct timer_cker { + spinlock_t *lock; + void *apbdiv; + void *timpre; + struct clk_hw hw; +}; + +struct stm32_pll_cfg { + u32 offset; + u32 muxoff; +}; + +struct stm32_cktim_cfg { + u32 offset_apbdiv; + u32 offset_timpre; +}; + +enum { + G_SAI1 = 0, + G_SAI2 = 1, + G_SAI3 = 2, + G_SAI4 = 3, + G_SPI1 = 4, + G_SPI2 = 5, + G_SPI3 = 6, + G_SPI4 = 7, + G_SPI5 = 8, + G_SPI6 = 9, + G_SPDIF = 10, + G_I2C1 = 11, + G_I2C2 = 12, + G_I2C3 = 13, + G_I2C4 = 14, + G_I2C5 = 15, + G_I2C6 = 16, + G_USART2 = 17, + G_UART4 = 18, + G_USART3 = 19, + G_UART5 = 20, + G_USART1 = 21, + G_USART6 = 22, + G_UART7 = 23, + G_UART8 = 24, + G_LPTIM1 = 25, + G_LPTIM2 = 26, + G_LPTIM3 = 27, + G_LPTIM4 = 28, + G_LPTIM5 = 29, + G_LTDC = 30, + G_DSI = 31, + G_QSPI = 32, + G_FMC = 33, + G_SDMMC1 = 34, + G_SDMMC2 = 35, + G_SDMMC3 = 36, + G_USBO = 37, + G_USBPHY = 38, + G_RNG1 = 39, + G_RNG2 = 40, + G_FDCAN = 41, + G_DAC12 = 42, + G_CEC = 43, + G_ADC12 = 44, + G_GPU = 45, + G_STGEN = 46, + G_DFSDM = 47, + G_ADFSDM = 48, + G_TIM2 = 49, + G_TIM3 = 50, + G_TIM4 = 51, + G_TIM5 = 52, + G_TIM6 = 53, + G_TIM7 = 54, + G_TIM12 = 55, + G_TIM13 = 56, + G_TIM14 = 57, + G_MDIO = 58, + G_TIM1 = 59, + G_TIM8 = 60, + G_TIM15 = 61, + G_TIM16 = 62, + G_TIM17 = 63, + G_SYSCFG = 64, + G_VREF = 65, + G_TMPSENS = 66, + G_PMBCTRL = 67, + G_HDP = 68, + G_IWDG2 = 69, + G_STGENRO = 70, + G_DMA1 = 71, + G_DMA2 = 72, + G_DMAMUX = 73, + G_DCMI = 74, + G_CRYP2 = 75, + G_HASH2 = 76, + G_CRC2 = 77, + G_HSEM = 78, + G_IPCC = 79, + G_GPIOA = 80, + G_GPIOB = 81, + G_GPIOC = 82, + G_GPIOD = 83, + G_GPIOE = 84, + G_GPIOF = 85, + G_GPIOG = 86, + G_GPIOH = 87, + G_GPIOI = 88, + G_GPIOJ = 89, + G_GPIOK = 90, + G_MDMA = 91, + G_ETHCK = 92, + G_ETHTX = 93, + G_ETHRX = 94, + G_ETHMAC = 95, + G_CRC1 = 96, + G_USBH = 97, + G_ETHSTP = 98, + G_RTCAPB = 99, + G_TZC1 = 100, + G_TZC2 = 101, + G_TZPC = 102, + G_IWDG1 = 103, + G_BSEC = 104, + G_GPIOZ = 105, + G_CRYP1 = 106, + G_HASH1 = 107, + G_BKPSRAM = 108, + G_DDRPERFM = 109, + G_LAST = 110, +}; + +enum { + M_SDMMC12 = 0, + M_SDMMC3 = 1, + M_FMC = 2, + M_QSPI = 3, + M_RNG1 = 4, + M_RNG2 = 5, + M_USBPHY = 6, + M_USBO = 7, + M_STGEN = 8, + M_SPDIF = 9, + M_SPI1 = 10, + M_SPI23 = 11, + M_SPI45 = 12, + M_SPI6 = 13, + M_CEC = 14, + M_I2C12 = 15, + M_I2C35 = 16, + M_I2C46 = 17, + M_LPTIM1 = 18, + M_LPTIM23 = 19, + M_LPTIM45 = 20, + M_USART1 = 21, + M_UART24 = 22, + M_UART35 = 23, + M_USART6 = 24, + M_UART78 = 25, + M_SAI1 = 26, + M_SAI2 = 27, + M_SAI3 = 28, + M_SAI4 = 29, + M_DSI = 30, + M_FDCAN = 31, + M_ADC12 = 32, + M_ETHCK = 33, + M_CKPER = 34, + M_LAST = 35, +}; + +struct stm32_rcc_match_data { + const struct clock_config *cfg; + unsigned int num; + unsigned int maxbinding; + u32 clear_offset; + bool (*check_security)(const struct clock_config *); +}; + +struct stm32_reset_data { + spinlock_t lock; + struct reset_controller_dev rcdev; + void *membase; + u32 clear_offset; +}; + +struct clk_device { + struct clk_hw hw; + void *div_reg; + unsigned int div_mask; + void *en_reg; + int en_bit; + spinlock_t *lock; +}; + +struct clk_pll { + struct clk_hw hw; + void *reg; + spinlock_t *lock; + int type; +}; + +struct reset_simple_data { + spinlock_t lock; + void *membase; + struct reset_controller_dev rcdev; + bool active_low; + bool status_active_low; + unsigned int reset_us; +}; + +struct clk_dvp { + struct clk_hw_onecell_data *data; + struct reset_simple_data reset; +}; + +struct bcm2835_cprman { + struct device *dev; + void *regs; + spinlock_t regs_lock; + unsigned int soc; + const char *real_parent_names[7]; + struct clk_hw_onecell_data onecell; +}; + +struct cprman_plat_data { + unsigned int soc; +}; + +struct bcm2835_pll_ana_bits; + +struct bcm2835_pll_data { + const char *name; + u32 cm_ctrl_reg; + u32 a2w_ctrl_reg; + u32 frac_reg; + u32 ana_reg_base; + u32 reference_enable_mask; + u32 lock_mask; + u32 flags; + const struct bcm2835_pll_ana_bits *ana; + long unsigned int min_rate; + long unsigned int max_rate; + long unsigned int max_fb_rate; +}; + +struct bcm2835_pll_ana_bits { + u32 mask0; + u32 set0; + u32 mask1; + u32 set1; + u32 mask3; + u32 set3; + u32 fb_prediv_mask; +}; + +struct bcm2835_pll_divider_data { + const char *name; + const char *source_pll; + u32 cm_reg; + u32 a2w_reg; + u32 load_mask; + u32 hold_mask; + u32 fixed_divider; + u32 flags; +}; + +struct bcm2835_clock_data { + const char *name; + const char * const *parents; + int num_mux_parents; + unsigned int set_rate_parent; + u32 ctl_reg; + u32 div_reg; + u32 int_bits; + u32 frac_bits; + u32 flags; + bool is_vpu_clock; + bool is_mash_clock; + bool low_jitter; + u32 tcnt_mux; + bool round_up; +}; + +struct bcm2835_gate_data { + const char *name; + const char *parent; + u32 ctl_reg; +}; + +struct bcm2835_pll { + struct clk_hw hw; + struct bcm2835_cprman *cprman; + const struct bcm2835_pll_data *data; +}; + +struct bcm2835_pll_divider { + struct clk_divider div; + struct bcm2835_cprman *cprman; + const struct bcm2835_pll_divider_data *data; +}; + +struct bcm2835_clock { + struct clk_hw hw; + struct bcm2835_cprman *cprman; + const struct bcm2835_clock_data *data; +}; + +struct bcm2835_clk_desc { + struct clk_hw * (*clk_register)(struct bcm2835_cprman *, const void *); + unsigned int supported; + const void *data; +}; + +enum rpi_firmware_clk_id { + RPI_FIRMWARE_EMMC_CLK_ID = 1, + RPI_FIRMWARE_UART_CLK_ID = 2, + RPI_FIRMWARE_ARM_CLK_ID = 3, + RPI_FIRMWARE_CORE_CLK_ID = 4, + RPI_FIRMWARE_V3D_CLK_ID = 5, + RPI_FIRMWARE_H264_CLK_ID = 6, + RPI_FIRMWARE_ISP_CLK_ID = 7, + RPI_FIRMWARE_SDRAM_CLK_ID = 8, + RPI_FIRMWARE_PIXEL_CLK_ID = 9, + RPI_FIRMWARE_PWM_CLK_ID = 10, + RPI_FIRMWARE_HEVC_CLK_ID = 11, + RPI_FIRMWARE_EMMC2_CLK_ID = 12, + RPI_FIRMWARE_M2MC_CLK_ID = 13, + RPI_FIRMWARE_PIXEL_BVB_CLK_ID = 14, + RPI_FIRMWARE_VEC_CLK_ID = 15, + RPI_FIRMWARE_NUM_CLK_ID = 16, +}; + +struct raspberrypi_clk { + struct device *dev; + struct rpi_firmware *firmware; + struct platform_device *cpufreq; +}; + +struct raspberrypi_clk_variant; + +struct raspberrypi_clk_data { + struct clk_hw hw; + unsigned int id; + struct raspberrypi_clk_variant *variant; + struct raspberrypi_clk *rpi; +}; + +struct raspberrypi_clk_variant { + bool export; + char *clkdev; + long unsigned int min_rate; + bool minimize; +}; + +struct raspberrypi_firmware_prop { + __le32 id; + __le32 val; + __le32 disable_turbo; +}; + +struct rpi_firmware_get_clocks_response { + u32 parent; + u32 id; +}; + +struct clk_busy_divider { + struct clk_divider div; + const struct clk_ops *div_ops; + void *reg; + u8 shift; +}; + +struct clk_busy_mux { + struct clk_mux mux; + const struct clk_ops *mux_ops; + void *reg; + u8 shift; +}; + +struct imx_fracn_gppll_rate_table { + unsigned int rate; + unsigned int mfi; + unsigned int mfn; + unsigned int mfd; + unsigned int rdiv; + unsigned int odiv; +}; + +struct imx_fracn_gppll_clk { + const struct imx_fracn_gppll_rate_table *rate_table; + int rate_count; + int flags; +}; + +struct clk_fracn_gppll { + struct clk_hw hw; + void *base; + const struct imx_fracn_gppll_rate_table *rate_table; + int rate_count; +}; + +struct clk_cpu { + struct clk_hw hw; + struct clk *div; + struct clk *mux; + struct clk *pll; + struct clk *step; +}; + +struct clk_divider_gate { + struct clk_divider divider; + u32 cached_val; +}; + +struct clk_fixup_div { + struct clk_divider divider; + const struct clk_ops *ops; + void (*fixup)(u32 *); +}; + +struct clk_fixup_mux { + struct clk_mux mux; + const struct clk_ops *ops; + void (*fixup)(u32 *); +}; + +struct clk_frac_pll { + struct clk_hw hw; + void *base; +}; + +struct clk_gate2 { + struct clk_hw hw; + void *reg; + u8 bit_idx; + u8 cgr_val; + u8 cgr_mask; + u8 flags; + spinlock_t *lock; + unsigned int *share_count; +}; + +struct imx93_clk_gate { + struct clk_hw hw; + void *reg; + u32 bit_idx; + u32 val; + u32 mask; + spinlock_t *lock; + unsigned int *share_count; +}; + +struct clk_gate_exclusive { + struct clk_gate gate; + u32 exclusive_mask; +}; + +struct clk_pfd { + struct clk_hw hw; + void *reg; + u8 idx; +}; + +enum imx_pfdv2_type { + IMX_PFDV2_IMX7ULP = 0, + IMX_PFDV2_IMX8ULP = 1, +}; + +struct clk_pfdv2 { + struct clk_hw hw; + void *reg; + u8 gate_bit; + u8 vld_bit; + u8 frac_off; +}; + +enum imx_pllv1_type { + IMX_PLLV1_IMX1 = 0, + IMX_PLLV1_IMX21 = 1, + IMX_PLLV1_IMX25 = 2, + IMX_PLLV1_IMX27 = 3, + IMX_PLLV1_IMX31 = 4, + IMX_PLLV1_IMX35 = 5, +}; + +struct clk_pllv1 { + struct clk_hw hw; + void *base; + enum imx_pllv1_type type; +}; + +struct clk_pllv2 { + struct clk_hw hw; + void *base; +}; + +enum imx_pllv3_type { + IMX_PLLV3_GENERIC = 0, + IMX_PLLV3_SYS = 1, + IMX_PLLV3_USB = 2, + IMX_PLLV3_USB_VF610 = 3, + IMX_PLLV3_AV = 4, + IMX_PLLV3_ENET = 5, + IMX_PLLV3_ENET_IMX7 = 6, + IMX_PLLV3_SYS_VF610 = 7, + IMX_PLLV3_DDR_IMX7 = 8, + IMX_PLLV3_AV_IMX7 = 9, +}; + +struct clk_pllv3 { + struct clk_hw hw; + void *base; + u32 power_bit; + bool powerup_set; + u32 div_mask; + u32 div_shift; + long unsigned int ref_clock; + u32 num_offset; + u32 denom_offset; +}; + +struct clk_pllv3_vf610_mf { + u32 mfi; + u32 mfn; + u32 mfd; +}; + +enum imx_pllv4_type { + IMX_PLLV4_IMX7ULP = 0, + IMX_PLLV4_IMX8ULP = 1, +}; + +struct clk_pllv4 { + struct clk_hw hw; + void *base; + u32 cfg_offset; + u32 num_offset; + u32 denom_offset; +}; + +enum imx_pll14xx_type { + PLL_1416X = 0, + PLL_1443X = 1, +}; + +struct imx_pll14xx_rate_table { + unsigned int rate; + unsigned int pdiv; + unsigned int mdiv; + unsigned int sdiv; + unsigned int kdiv; +}; + +struct imx_pll14xx_clk { + enum imx_pll14xx_type type; + const struct imx_pll14xx_rate_table *rate_table; + int rate_count; + int flags; +}; + +struct clk_pll14xx { + struct clk_hw hw; + void *base; + enum imx_pll14xx_type type; + const struct imx_pll14xx_rate_table *rate_table; + int rate_count; +}; + +struct clk_sscg_pll_setup { + int divr1; + int divf1; + int divr2; + int divf2; + int divq; + int bypass; + uint64_t vco1; + uint64_t vco2; + uint64_t fout; + uint64_t ref; + uint64_t ref_div1; + uint64_t ref_div2; + uint64_t fout_request; + int fout_error; + long: 32; +}; + +struct clk_sscg_pll { + struct clk_hw hw; + const struct clk_ops ops; + void *base; + long: 32; + struct clk_sscg_pll_setup setup; + u8 parent; + u8 bypass1; + u8 bypass2; + long: 32; +}; + +struct reg_sequence { + unsigned int reg; + unsigned int def; + unsigned int delay_us; +}; + +struct clk_regmap { + struct clk_hw hw; + struct regmap *map; + void *data; +}; + +struct parm { + u16 reg_off; + u8 shift; + u8 width; +}; + +struct meson_clk_mpll_data { + struct parm sdm; + struct parm sdm_en; + struct parm n2; + struct parm ssen; + struct parm misc; + const struct reg_sequence *init_regs; + unsigned int init_count; + spinlock_t *lock; + u8 flags; +}; + +struct pll_params_table { + unsigned int m; + unsigned int n; +}; + +struct pll_mult_range { + unsigned int min; + unsigned int max; +}; + +struct meson_clk_pll_data { + struct parm en; + struct parm m; + struct parm n; + struct parm frac; + struct parm l; + struct parm rst; + const struct reg_sequence *init_regs; + unsigned int init_count; + const struct pll_params_table *table; + const struct pll_mult_range *range; + u8 flags; +}; + +struct clk_regmap_gate_data { + unsigned int offset; + u8 bit_idx; + u8 flags; +}; + +struct clk_regmap_div_data { + unsigned int offset; + u8 shift; + u8 width; + u8 flags; + const struct clk_div_table *table; +}; + +struct clk_regmap_mux_data { + unsigned int offset; + u32 *table; + u32 mask; + u8 shift; + u8 flags; +}; + +struct meson8b_clk_reset { + struct reset_controller_dev reset; + struct regmap *regmap; +}; + +struct meson8b_clk_reset_line { + u32 reg; + u8 bit_idx; + bool active_low; +}; + +struct meson8b_nb_data { + struct notifier_block nb; + struct clk_hw *cpu_clk; +}; + +struct clk_apbc { + struct clk_hw hw; + void *base; + unsigned int delay; + unsigned int flags; + spinlock_t *lock; +}; + +struct clk_apmu { + struct clk_hw hw; + void *base; + u32 rst_mask; + u32 enable_mask; + spinlock_t *lock; +}; + +struct mmp_clk_factor_masks { + unsigned int factor; + unsigned int num_mask; + unsigned int den_mask; + unsigned int num_shift; + unsigned int den_shift; + unsigned int enable_mask; +}; + +struct mmp_clk_factor_tbl { + unsigned int num; + unsigned int den; +}; + +struct mmp_clk_factor { + struct clk_hw hw; + void *base; + struct mmp_clk_factor_masks *masks; + struct mmp_clk_factor_tbl *ftbl; + unsigned int ftbl_cnt; + spinlock_t *lock; +}; + +enum { + MMP_CLK_MIX_TYPE_V1 = 0, + MMP_CLK_MIX_TYPE_V2 = 1, + MMP_CLK_MIX_TYPE_V3 = 2, +}; + +struct mmp_clk_mix_reg_info { + void *reg_clk_ctrl; + void *reg_clk_sel; + u8 width_div; + u8 shift_div; + u8 width_mux; + u8 shift_mux; + u8 bit_fc; +}; + +struct mmp_clk_mix_clk_table { + long unsigned int rate; + u8 parent_index; + unsigned int divisor; + unsigned int valid; +}; + +struct mmp_clk_mix_config { + struct mmp_clk_mix_reg_info reg_info; + struct mmp_clk_mix_clk_table *table; + unsigned int table_size; + u32 *mux_table; + struct clk_div_table *div_table; + u8 div_flags; + u8 mux_flags; +}; + +struct mmp_clk_mix { + struct clk_hw hw; + struct mmp_clk_mix_reg_info reg_info; + struct mmp_clk_mix_clk_table *table; + u32 *mux_table; + struct clk_div_table *div_table; + unsigned int table_size; + u8 div_flags; + u8 mux_flags; + unsigned int type; + spinlock_t *lock; +}; + +struct mmp_clk_gate { + struct clk_hw hw; + void *reg; + u32 mask; + u32 val_enable; + u32 val_disable; + unsigned int flags; + spinlock_t *lock; +}; + +struct mmp_clk_unit { + unsigned int nr_clks; + struct clk **clk_table; + struct clk_onecell_data clk_data; +}; + +struct mmp_param_fixed_rate_clk { + unsigned int id; + char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int fixed_rate; +}; + +struct mmp_param_fixed_factor_clk { + unsigned int id; + char *name; + const char *parent_name; + long unsigned int mult; + long unsigned int div; + long unsigned int flags; +}; + +struct mmp_param_general_gate_clk { + unsigned int id; + const char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int offset; + u8 bit_idx; + u8 gate_flags; + spinlock_t *lock; +}; + +struct mmp_param_gate_clk { + unsigned int id; + char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int offset; + u32 mask; + u32 val_enable; + u32 val_disable; + unsigned int gate_flags; + spinlock_t *lock; +}; + +struct mmp_param_mux_clk { + unsigned int id; + char *name; + const char * const *parent_name; + u8 num_parents; + long unsigned int flags; + long unsigned int offset; + u8 shift; + u8 width; + u8 mux_flags; + spinlock_t *lock; +}; + +struct mmp_param_div_clk { + unsigned int id; + char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int offset; + u8 shift; + u8 width; + u8 div_flags; + spinlock_t *lock; +}; + +struct mmp_clk_reset_cell { + unsigned int clk_id; + void *reg; + u32 bits; + unsigned int flags; + spinlock_t *lock; +}; + +struct mmp_clk_reset_unit { + struct reset_controller_dev rcdev; + struct mmp_clk_reset_cell *cells; +}; + +enum gpd_status { + GENPD_STATE_ON = 0, + GENPD_STATE_OFF = 1, +}; + +struct dev_power_governor { + bool (*power_down_ok)(struct dev_pm_domain *); + bool (*suspend_ok)(struct device *); +}; + +struct gpd_dev_ops { + int (*start)(struct device *); + int (*stop)(struct device *); +}; + +struct genpd_governor_data { + s64 max_off_time_ns; + bool max_off_time_changed; + long: 32; + ktime_t next_wakeup; + ktime_t next_hrtimer; + bool cached_power_down_ok; + bool cached_power_down_state_idx; + long: 32; +}; + +struct genpd_power_state { + s64 power_off_latency_ns; + s64 power_on_latency_ns; + s64 residency_ns; + u64 usage; + u64 rejected; + struct fwnode_handle *fwnode; + long: 32; + u64 idle_time; + void *data; + long: 32; +}; + +struct opp_table; + +struct dev_pm_opp; + +struct genpd_lock_ops; + +struct generic_pm_domain { + struct device dev; + struct dev_pm_domain domain; + struct list_head gpd_list_node; + struct list_head parent_links; + struct list_head child_links; + struct list_head dev_list; + struct dev_power_governor *gov; + struct genpd_governor_data *gd; + struct work_struct power_off_work; + struct fwnode_handle *provider; + bool has_provider; + const char *name; + atomic_t sd_count; + enum gpd_status status; + unsigned int device_count; + unsigned int suspended_count; + unsigned int prepared_count; + unsigned int performance_state; + cpumask_var_t cpus; + int (*power_off)(struct generic_pm_domain *); + int (*power_on)(struct generic_pm_domain *); + struct raw_notifier_head power_notifiers; + struct opp_table *opp_table; + unsigned int (*opp_to_performance_state)(struct generic_pm_domain *, struct dev_pm_opp *); + int (*set_performance_state)(struct generic_pm_domain *, unsigned int); + struct gpd_dev_ops dev_ops; + int (*attach_dev)(struct generic_pm_domain *, struct device *); + void (*detach_dev)(struct generic_pm_domain *, struct device *); + unsigned int flags; + struct genpd_power_state *states; + void (*free_states)(struct genpd_power_state *, unsigned int); + unsigned int state_count; + unsigned int state_idx; + long: 32; + u64 on_time; + u64 accounting_time; + const struct genpd_lock_ops *lock_ops; + union { + struct mutex mlock; + struct { + spinlock_t slock; + long unsigned int lock_flags; + }; + }; +}; + +struct genpd_lock_ops { + void (*lock)(struct generic_pm_domain *); + void (*lock_nested)(struct generic_pm_domain *, int); + int (*lock_interruptible)(struct generic_pm_domain *); + void (*unlock)(struct generic_pm_domain *); +}; + +typedef struct generic_pm_domain * (*genpd_xlate_t)(struct of_phandle_args *, void *); + +struct genpd_onecell_data { + struct generic_pm_domain **domains; + unsigned int num_domains; + genpd_xlate_t xlate; +}; + +struct mmp_param_pll_clk { + unsigned int id; + char *name; + long unsigned int default_rate; + long unsigned int enable_offset; + u32 enable; + long unsigned int offset; + u8 shift; + long unsigned int input_rate; + long unsigned int postdiv_offset; + long unsigned int postdiv_shift; +}; + +enum mmp2_clk_model { + CLK_MODEL_MMP2 = 0, + CLK_MODEL_MMP3 = 1, +}; + +struct mmp2_clk_unit { + struct mmp_clk_unit unit; + enum mmp2_clk_model model; + struct genpd_onecell_data pd_data; + struct generic_pm_domain *pm_domains[3]; + void *mpmu_base; + void *apmu_base; + void *apbc_base; +}; + +struct mmp_clk_pll { + struct clk_hw hw; + long unsigned int default_rate; + void *enable_reg; + u32 enable; + void *reg; + u8 shift; + long unsigned int input_rate; + void *postdiv_reg; + u8 postdiv_shift; +}; + +struct mmp_pm_domain { + struct generic_pm_domain genpd; + void *reg; + spinlock_t *lock; + u32 power_on; + u32 reset; + u32 clock_enable; + unsigned int flags; +}; + +struct pxa1928_clk_unit { + struct mmp_clk_unit unit; + void *mpmu_base; + void *apmu_base; + void *apbc_base; + void *apbcp_base; +}; + +struct coreclk_ratio { + int id; + const char *name; +}; + +struct coreclk_soc_desc { + u32 (*get_tclk_freq)(void *); + u32 (*get_cpu_freq)(void *); + void (*get_clk_ratio)(void *, int, int *, int *); + u32 (*get_refclk_freq)(void *); + bool (*is_sscg_enabled)(void *); + u32 (*fix_sscg_deviation)(u32); + const struct coreclk_ratio *ratios; + int num_ratios; +}; + +struct clk_gating_soc_desc { + const char *name; + const char *parent; + int bit_idx; + long unsigned int flags; +}; + +struct clk_gating_ctrl { + spinlock_t *lock; + struct clk **gates; + int num_gates; + void *base; + u32 saved_reg; +}; + +struct cpu_clk { + struct clk_hw hw; + int cpu; + const char *clk_name; + const char *parent_name; + void *reg_base; + void *pmu_dfs; +}; + +struct clk_corediv_desc { + unsigned int mask; + unsigned int offset; + unsigned int fieldbit; +}; + +struct clk_corediv_soc_desc { + const struct clk_corediv_desc *descs; + unsigned int ndescs; + const struct clk_ops ops; + u32 ratio_reload; + u32 enable_bit_offset; + u32 ratio_offset; +}; + +struct clk_corediv { + struct clk_hw hw; + void *reg; + const struct clk_corediv_desc *desc; + const struct clk_corediv_soc_desc *soc_desc; + spinlock_t lock; +}; + +enum { + A370_CPU_TO_NBCLK = 0, + A370_CPU_TO_HCLK = 1, + A370_CPU_TO_DRAMCLK = 2, +}; + +enum { + A375_CPU_TO_DDR = 0, + A375_CPU_TO_L2 = 1, +}; + +enum { + A380_CPU_TO_DDR = 0, + A380_CPU_TO_L2 = 1, +}; + +enum { + A390_CPU_TO_NBCLK = 0, + A390_CPU_TO_HCLK = 1, + A390_CPU_TO_DCLK = 2, +}; + +enum { + AXP_CPU_TO_NBCLK = 0, + AXP_CPU_TO_HCLK = 1, + AXP_CPU_TO_DRAMCLK = 2, +}; + +enum { + MV98DX3236_CPU_TO_DDR = 0, + MV98DX3236_CPU_TO_MPLL = 1, +}; + +enum { + DOVE_CPU_TO_L2 = 0, + DOVE_CPU_TO_DDR = 1, +}; + +struct dove_clk { + const char *name; + struct clk_hw hw; + void *base; + spinlock_t *lock; + u8 div_bit_start; + u8 div_bit_end; + u8 div_bit_load; + u8 div_bit_size; + u32 *divider_table; +}; + +enum { + DIV_CTRL0 = 0, + DIV_CTRL1 = 4, + DIV_CTRL1_N_RESET_MASK = 1024, +}; + +enum rockchip_pll_type { + pll_rk3036 = 0, + pll_rk3066 = 1, + pll_rk3328 = 2, + pll_rk3399 = 3, + pll_rk3588 = 4, + pll_rk3588_core = 5, +}; + +struct rockchip_clk_provider { + void *reg_base; + struct clk_onecell_data clk_data; + struct device_node *cru_node; + struct regmap *grf; + spinlock_t lock; +}; + +struct rockchip_pll_rate_table { + long unsigned int rate; + union { + struct { + unsigned int nr; + unsigned int nf; + unsigned int no; + unsigned int nb; + }; + struct { + unsigned int fbdiv; + unsigned int postdiv1; + unsigned int refdiv; + unsigned int postdiv2; + unsigned int dsmpd; + unsigned int frac; + }; + struct { + unsigned int m; + unsigned int p; + unsigned int s; + unsigned int k; + }; + }; +}; + +struct rockchip_pll_clock { + unsigned int id; + const char *name; + const char * const *parent_names; + u8 num_parents; + long unsigned int flags; + int con_offset; + int mode_offset; + int mode_shift; + int lock_shift; + enum rockchip_pll_type type; + u8 pll_flags; + struct rockchip_pll_rate_table *rate_table; +}; + +struct rockchip_cpuclk_clksel { + int reg; + u32 val; +}; + +struct rockchip_cpuclk_rate_table { + long unsigned int prate; + struct rockchip_cpuclk_clksel divs[6]; + struct rockchip_cpuclk_clksel pre_muxs[6]; + struct rockchip_cpuclk_clksel post_muxs[6]; +}; + +struct rockchip_cpuclk_reg_data { + int core_reg[4]; + u8 div_core_shift[4]; + u32 div_core_mask[4]; + int num_cores; + int mux_core_reg; + u8 mux_core_alt; + u8 mux_core_main; + u8 mux_core_shift; + u32 mux_core_mask; +}; + +enum rockchip_clk_branch_type { + branch_composite = 0, + branch_mux = 1, + branch_muxgrf = 2, + branch_divider = 3, + branch_fraction_divider = 4, + branch_gate = 5, + branch_mmc = 6, + branch_inverter = 7, + branch_factor = 8, + branch_ddrclk = 9, + branch_half_divider = 10, +}; + +struct rockchip_clk_branch { + unsigned int id; + enum rockchip_clk_branch_type branch_type; + const char *name; + const char * const *parent_names; + u8 num_parents; + long unsigned int flags; + int muxdiv_offset; + u8 mux_shift; + u8 mux_width; + u8 mux_flags; + u32 *mux_table; + int div_offset; + u8 div_shift; + u8 div_width; + u8 div_flags; + struct clk_div_table *div_table; + int gate_offset; + u8 gate_shift; + u8 gate_flags; + struct rockchip_clk_branch *child; +}; + +struct rockchip_clk_frac { + struct notifier_block clk_nb; + struct clk_fractional_divider div; + struct clk_gate gate; + struct clk_mux mux; + const struct clk_ops *mux_ops; + int mux_frac_idx; + bool rate_change_remuxed; + int rate_change_idx; +}; + +struct rockchip_clk_pll { + struct clk_hw hw; + struct clk_mux pll_mux; + const struct clk_ops *pll_mux_ops; + struct notifier_block clk_nb; + void *reg_base; + int lock_offset; + unsigned int lock_shift; + enum rockchip_pll_type type; + u8 flags; + const struct rockchip_pll_rate_table *rate_table; + unsigned int rate_count; + spinlock_t *lock; + struct rockchip_clk_provider *ctx; +}; + +struct rockchip_cpuclk { + struct clk_hw hw; + struct clk *alt_parent; + void *reg_base; + struct notifier_block clk_nb; + unsigned int rate_count; + struct rockchip_cpuclk_rate_table *rate_table; + const struct rockchip_cpuclk_reg_data *reg_data; + spinlock_t *lock; +}; + +struct rockchip_inv_clock { + struct clk_hw hw; + void *reg; + int shift; + int flags; + spinlock_t *lock; +}; + +struct rockchip_mmc_clock { + struct clk_hw hw; + void *reg; + int id; + int shift; + int cached_phase; + struct notifier_block clk_rate_change_nb; +}; + +struct rockchip_muxgrf_clock { + struct clk_hw hw; + struct regmap *regmap; + u32 reg; + u32 shift; + u32 width; + int flags; +}; + +struct rockchip_ddrclk { + struct clk_hw hw; + void *reg_base; + int mux_offset; + int mux_shift; + int mux_width; + int div_shift; + int div_width; + int ddr_flag; + spinlock_t *lock; +}; + +struct rockchip_softrst { + struct reset_controller_dev rcdev; + const int *lut; + void *reg_base; + int num_regs; + int num_per_reg; + u8 flags; + spinlock_t lock; +}; + +enum rv1108_plls { + apll = 0, + dpll = 1, + gpll = 2, +}; + +enum rv1126_pmu_plls { + gpll___2 = 0, +}; + +enum rv1126_plls { + apll___2 = 0, + dpll___2 = 1, + cpll = 2, + hpll = 3, +}; + +struct clk_rv1126_inits { + void (*inits)(struct device_node *); +}; + +enum rk3036_plls { + apll___3 = 0, + dpll___3 = 1, + gpll___3 = 2, +}; + +enum rk3128_plls { + apll___4 = 0, + dpll___4 = 1, + cpll___2 = 2, + gpll___4 = 3, +}; + +enum rk3188_plls { + apll___5 = 0, + cpll___3 = 1, + dpll___5 = 2, + gpll___5 = 3, +}; + +enum rk3228_plls { + apll___6 = 0, + dpll___6 = 1, + cpll___4 = 2, + gpll___6 = 3, +}; + +enum rk3288_variant { + RK3288_CRU = 0, + RK3288W_CRU = 1, +}; + +enum rk3288_plls { + apll___7 = 0, + dpll___7 = 1, + cpll___5 = 2, + gpll___7 = 3, + npll = 4, +}; + +enum samsung_pll_type { + pll_2126 = 0, + pll_3000 = 1, + pll_35xx = 2, + pll_36xx = 3, + pll_2550 = 4, + pll_2650 = 5, + pll_4500 = 6, + pll_4502 = 7, + pll_4508 = 8, + pll_4600 = 9, + pll_4650 = 10, + pll_4650c = 11, + pll_6552 = 12, + pll_6552_s3c2416 = 13, + pll_6553 = 14, + pll_s3c2410_mpll = 15, + pll_s3c2410_upll = 16, + pll_s3c2440_mpll = 17, + pll_2550x = 18, + pll_2550xx = 19, + pll_2650x = 20, + pll_2650xx = 21, + pll_1417x = 22, + pll_1450x = 23, + pll_1451x = 24, + pll_1452x = 25, + pll_1460x = 26, + pll_0822x = 27, + pll_0831x = 28, + pll_142xx = 29, +}; + +struct samsung_pll_rate_table { + unsigned int rate; + unsigned int pdiv; + unsigned int mdiv; + unsigned int sdiv; + unsigned int kdiv; + unsigned int afc; + unsigned int mfr; + unsigned int mrr; + unsigned int vsel; +}; + +struct samsung_clk_provider { + void *reg_base; + struct device *dev; + spinlock_t lock; + struct clk_hw_onecell_data clk_data; +}; + +struct samsung_clock_alias { + unsigned int id; + const char *dev_name; + const char *alias; +}; + +struct samsung_fixed_rate_clock { + unsigned int id; + char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int fixed_rate; +}; + +struct samsung_fixed_factor_clock { + unsigned int id; + char *name; + const char *parent_name; + long unsigned int mult; + long unsigned int div; + long unsigned int flags; +}; + +struct samsung_mux_clock { + unsigned int id; + const char *name; + const char * const *parent_names; + u8 num_parents; + long unsigned int flags; + long unsigned int offset; + u8 shift; + u8 width; + u8 mux_flags; +}; + +struct samsung_div_clock { + unsigned int id; + const char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int offset; + u8 shift; + u8 width; + u8 div_flags; + struct clk_div_table *table; +}; + +struct samsung_gate_clock { + unsigned int id; + const char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int offset; + u8 bit_idx; + u8 gate_flags; +}; + +struct samsung_clk_reg_dump { + u32 offset; + u32 value; +}; + +struct samsung_pll_clock { + unsigned int id; + const char *name; + const char *parent_name; + long unsigned int flags; + int con_offset; + int lock_offset; + enum samsung_pll_type type; + const struct samsung_pll_rate_table *rate_table; +}; + +struct exynos_cpuclk_cfg_data; + +struct samsung_cpu_clock { + unsigned int id; + const char *name; + unsigned int parent_id; + unsigned int alt_parent_id; + long unsigned int flags; + int offset; + const struct exynos_cpuclk_cfg_data *cfg; +}; + +struct exynos_cpuclk_cfg_data { + long unsigned int prate; + long unsigned int div0; + long unsigned int div1; +}; + +struct samsung_clock_reg_cache { + struct list_head node; + void *reg_base; + struct samsung_clk_reg_dump *rdump; + unsigned int rd_num; + const struct samsung_clk_reg_dump *rsuspend; + unsigned int rsuspend_num; +}; + +struct samsung_cmu_info { + const struct samsung_pll_clock *pll_clks; + unsigned int nr_pll_clks; + const struct samsung_mux_clock *mux_clks; + unsigned int nr_mux_clks; + const struct samsung_div_clock *div_clks; + unsigned int nr_div_clks; + const struct samsung_gate_clock *gate_clks; + unsigned int nr_gate_clks; + const struct samsung_fixed_rate_clock *fixed_clks; + unsigned int nr_fixed_clks; + const struct samsung_fixed_factor_clock *fixed_factor_clks; + unsigned int nr_fixed_factor_clks; + unsigned int nr_clk_ids; + const struct samsung_cpu_clock *cpu_clks; + unsigned int nr_cpu_clks; + const long unsigned int *clk_regs; + unsigned int nr_clk_regs; + const struct samsung_clk_reg_dump *suspend_regs; + unsigned int nr_suspend_regs; + const char *clk_name; +}; + +struct samsung_clk_pll { + struct clk_hw hw; + void *lock_reg; + void *con_reg; + short unsigned int enable_offs; + short unsigned int lock_offs; + enum samsung_pll_type type; + unsigned int rate_count; + const struct samsung_pll_rate_table *rate_table; +}; + +struct exynos_cpuclk { + struct clk_hw hw; + const struct clk_hw *alt_parent; + void *ctrl_base; + spinlock_t *lock; + const struct exynos_cpuclk_cfg_data *cfg; + const long unsigned int num_cfgs; + struct notifier_block clk_nb; + long unsigned int flags; +}; + +enum exynos4_soc { + EXYNOS4210 = 0, + EXYNOS4X12 = 1, +}; + +enum exynos4_plls { + apll___8 = 0, + mpll = 1, + epll = 2, + vpll = 3, + nr_plls = 4, +}; + +struct exynos5_subcmu_reg_dump { + u32 offset; + u32 value; + u32 mask; + u32 save; +}; + +struct exynos5_subcmu_info { + const struct samsung_div_clock *div_clks; + unsigned int nr_div_clks; + const struct samsung_gate_clock *gate_clks; + unsigned int nr_gate_clks; + struct exynos5_subcmu_reg_dump *suspend_regs; + unsigned int nr_suspend_regs; + const char *pd_name; +}; + +enum exynos5250_plls { + apll___9 = 0, + mpll___2 = 1, + cpll___6 = 2, + epll___2 = 3, + vpll___2 = 4, + gpll___8 = 5, + bpll = 6, + nr_plls___2 = 7, +}; + +enum exynos5410_plls { + apll___10 = 0, + cpll___7 = 1, + epll___3 = 2, + mpll___3 = 3, + bpll___2 = 4, + kpll = 5, + nr_plls___3 = 6, +}; + +enum exynos5x_soc { + EXYNOS5420 = 0, + EXYNOS5800 = 1, +}; + +enum exynos5x_plls { + apll___11 = 0, + cpll___8 = 1, + dpll___8 = 2, + epll___4 = 3, + rpll = 4, + ipll = 5, + spll = 6, + vpll___3 = 7, + mpll___4 = 8, + bpll___3 = 9, + kpll___2 = 10, + nr_plls___4 = 11, +}; + +struct exynos_audss_clk_drvdata { + unsigned int has_adma_clk: 1; + unsigned int has_mst_clk: 1; + unsigned int enable_epll: 1; + unsigned int num_clks; +}; + +struct exynos_clkout { + struct clk_gate gate; + struct clk_mux mux; + spinlock_t slock; + void *reg; + struct device_node *np; + u32 pmu_debug_save; + struct clk_hw_onecell_data data; +}; + +struct exynos_clkout_variant { + u32 mux_mask; +}; + +struct stm32_mux_cfg___2 { + u16 offset; + u8 shift; + u8 width; + u8 flags; + u32 *table; + u8 ready; +}; + +struct stm32_gate_cfg___2 { + u16 offset; + u8 bit_idx; + u8 set_clr; +}; + +struct stm32_div_cfg___2 { + u16 offset; + u8 shift; + u8 width; + u8 flags; + u8 ready; + const struct clk_div_table *table; +}; + +struct stm32_rcc_match_data___2; + +struct clock_config___2 { + long unsigned int id; + int sec_id; + void *clock_cfg; + struct clk_hw * (*func)(struct device *, const struct stm32_rcc_match_data___2 *, void *, spinlock_t *, const struct clock_config___2 *); +}; + +struct clk_stm32_clock_data; + +struct stm32_rcc_match_data___2 { + struct clk_hw_onecell_data *hw_clks; + unsigned int num_clocks; + const struct clock_config___2 *tab_clocks; + unsigned int maxbinding; + struct clk_stm32_clock_data *clock_data; + u32 clear_offset; + int (*check_security)(void *, const struct clock_config___2 *); + int (*multi_mux)(void *, const struct clock_config___2 *); +}; + +struct clk_stm32_clock_data { + u16 *gate_cpt; + const struct stm32_gate_cfg___2 *gates; + const struct stm32_mux_cfg___2 *muxes; + const struct stm32_div_cfg___2 *dividers; + struct clk_hw * (*is_multi_mux)(struct clk_hw *); +}; + +struct clk_stm32_mux { + u16 mux_id; + struct clk_hw hw; + void *base; + struct clk_stm32_clock_data *clock_data; + spinlock_t *lock; +}; + +struct clk_stm32_gate { + u16 gate_id; + struct clk_hw hw; + void *base; + struct clk_stm32_clock_data *clock_data; + spinlock_t *lock; +}; + +struct clk_stm32_div { + u16 div_id; + struct clk_hw hw; + void *base; + struct clk_stm32_clock_data *clock_data; + spinlock_t *lock; +}; + +struct clk_stm32_composite { + u16 gate_id; + u16 mux_id; + u16 div_id; + struct clk_hw hw; + void *base; + struct clk_stm32_clock_data *clock_data; + spinlock_t *lock; +}; + +enum enum_gate_cfg { + GATE_MCO1 = 0, + GATE_MCO2 = 1, + GATE_DBGCK = 2, + GATE_TRACECK = 3, + GATE_DDRC1 = 4, + GATE_DDRC1LP = 5, + GATE_DDRPHYC = 6, + GATE_DDRPHYCLP = 7, + GATE_DDRCAPB = 8, + GATE_DDRCAPBLP = 9, + GATE_AXIDCG = 10, + GATE_DDRPHYCAPB = 11, + GATE_DDRPHYCAPBLP = 12, + GATE_TIM2 = 13, + GATE_TIM3 = 14, + GATE_TIM4 = 15, + GATE_TIM5 = 16, + GATE_TIM6 = 17, + GATE_TIM7 = 18, + GATE_LPTIM1 = 19, + GATE_SPI2 = 20, + GATE_SPI3 = 21, + GATE_USART3 = 22, + GATE_UART4 = 23, + GATE_UART5 = 24, + GATE_UART7 = 25, + GATE_UART8 = 26, + GATE_I2C1 = 27, + GATE_I2C2 = 28, + GATE_SPDIF = 29, + GATE_TIM1 = 30, + GATE_TIM8 = 31, + GATE_SPI1 = 32, + GATE_USART6 = 33, + GATE_SAI1 = 34, + GATE_SAI2 = 35, + GATE_DFSDM = 36, + GATE_ADFSDM = 37, + GATE_FDCAN = 38, + GATE_LPTIM2 = 39, + GATE_LPTIM3 = 40, + GATE_LPTIM4 = 41, + GATE_LPTIM5 = 42, + GATE_VREF = 43, + GATE_DTS = 44, + GATE_PMBCTRL = 45, + GATE_HDP = 46, + GATE_SYSCFG = 47, + GATE_DCMIPP = 48, + GATE_DDRPERFM = 49, + GATE_IWDG2APB = 50, + GATE_USBPHY = 51, + GATE_STGENRO = 52, + GATE_LTDC = 53, + GATE_RTCAPB = 54, + GATE_TZC = 55, + GATE_ETZPC = 56, + GATE_IWDG1APB = 57, + GATE_BSEC = 58, + GATE_STGENC = 59, + GATE_USART1 = 60, + GATE_USART2 = 61, + GATE_SPI4 = 62, + GATE_SPI5 = 63, + GATE_I2C3 = 64, + GATE_I2C4 = 65, + GATE_I2C5 = 66, + GATE_TIM12 = 67, + GATE_TIM13 = 68, + GATE_TIM14 = 69, + GATE_TIM15 = 70, + GATE_TIM16 = 71, + GATE_TIM17 = 72, + GATE_DMA1 = 73, + GATE_DMA2 = 74, + GATE_DMAMUX1 = 75, + GATE_DMA3 = 76, + GATE_DMAMUX2 = 77, + GATE_ADC1 = 78, + GATE_ADC2 = 79, + GATE_USBO = 80, + GATE_TSC = 81, + GATE_GPIOA = 82, + GATE_GPIOB = 83, + GATE_GPIOC = 84, + GATE_GPIOD = 85, + GATE_GPIOE = 86, + GATE_GPIOF = 87, + GATE_GPIOG = 88, + GATE_GPIOH = 89, + GATE_GPIOI = 90, + GATE_PKA = 91, + GATE_SAES = 92, + GATE_CRYP1 = 93, + GATE_HASH1 = 94, + GATE_RNG1 = 95, + GATE_BKPSRAM = 96, + GATE_AXIMC = 97, + GATE_MCE = 98, + GATE_ETH1CK = 99, + GATE_ETH1TX = 100, + GATE_ETH1RX = 101, + GATE_ETH1MAC = 102, + GATE_FMC = 103, + GATE_QSPI = 104, + GATE_SDMMC1 = 105, + GATE_SDMMC2 = 106, + GATE_CRC1 = 107, + GATE_USBH = 108, + GATE_ETH2CK = 109, + GATE_ETH2TX = 110, + GATE_ETH2RX = 111, + GATE_ETH2MAC = 112, + GATE_ETH1STP = 113, + GATE_ETH2STP = 114, + GATE_MDMA = 115, + GATE_NB = 116, +}; + +enum enum_div_cfg { + DIV_RTC = 0, + DIV_HSI = 1, + DIV_MCO1 = 2, + DIV_MCO2 = 3, + DIV_TRACE = 4, + DIV_ETH1PTP = 5, + DIV_ETH2PTP = 6, + DIV_NB = 7, +}; + +enum enum_mux_cfg { + MUX_ADC1 = 0, + MUX_ADC2 = 1, + MUX_DCMIPP = 2, + MUX_ETH1 = 3, + MUX_ETH2 = 4, + MUX_FDCAN = 5, + MUX_FMC = 6, + MUX_I2C12 = 7, + MUX_I2C3 = 8, + MUX_I2C4 = 9, + MUX_I2C5 = 10, + MUX_LPTIM1 = 11, + MUX_LPTIM2 = 12, + MUX_LPTIM3 = 13, + MUX_LPTIM45 = 14, + MUX_MCO1 = 15, + MUX_MCO2 = 16, + MUX_QSPI = 17, + MUX_RNG1 = 18, + MUX_SAES = 19, + MUX_SAI1 = 20, + MUX_SAI2 = 21, + MUX_SDMMC1 = 22, + MUX_SDMMC2 = 23, + MUX_SPDIF = 24, + MUX_SPI1 = 25, + MUX_SPI23 = 26, + MUX_SPI4 = 27, + MUX_SPI5 = 28, + MUX_STGEN = 29, + MUX_UART1 = 30, + MUX_UART2 = 31, + MUX_UART4 = 32, + MUX_UART6 = 33, + MUX_UART35 = 34, + MUX_UART78 = 35, + MUX_USBO = 36, + MUX_USBPHY = 37, + MUX_NB = 38, +}; + +struct clk_stm32_securiy { + u32 offset; + u8 bit_idx; + long unsigned int scmi_id; +}; + +enum security_clk { + SECF_NONE = 0, + SECF_LPTIM2 = 1, + SECF_LPTIM3 = 2, + SECF_VREF = 3, + SECF_DCMIPP = 4, + SECF_USBPHY = 5, + SECF_TZC = 6, + SECF_ETZPC = 7, + SECF_IWDG1 = 8, + SECF_BSEC = 9, + SECF_STGENC = 10, + SECF_STGENRO = 11, + SECF_USART1 = 12, + SECF_USART2 = 13, + SECF_SPI4 = 14, + SECF_SPI5 = 15, + SECF_I2C3 = 16, + SECF_I2C4 = 17, + SECF_I2C5 = 18, + SECF_TIM12 = 19, + SECF_TIM13 = 20, + SECF_TIM14 = 21, + SECF_TIM15 = 22, + SECF_TIM16 = 23, + SECF_TIM17 = 24, + SECF_DMA3 = 25, + SECF_DMAMUX2 = 26, + SECF_ADC1 = 27, + SECF_ADC2 = 28, + SECF_USBO = 29, + SECF_TSC = 30, + SECF_PKA = 31, + SECF_SAES = 32, + SECF_CRYP1 = 33, + SECF_HASH1 = 34, + SECF_RNG1 = 35, + SECF_BKPSRAM = 36, + SECF_MCE = 37, + SECF_FMC = 38, + SECF_QSPI = 39, + SECF_SDMMC1 = 40, + SECF_SDMMC2 = 41, + SECF_ETH1CK = 42, + SECF_ETH1TX = 43, + SECF_ETH1RX = 44, + SECF_ETH1MAC = 45, + SECF_ETH1STP = 46, + SECF_ETH2CK = 47, + SECF_ETH2TX = 48, + SECF_ETH2RX = 49, + SECF_ETH2MAC = 50, + SECF_ETH2STP = 51, + SECF_MCO1 = 52, + SECF_MCO2 = 53, +}; + +struct multi_mux { + struct clk_hw *hw1; + struct clk_hw *hw2; +}; + +struct clk_factors_config { + u8 nshift; + u8 nwidth; + u8 kshift; + u8 kwidth; + u8 mshift; + u8 mwidth; + u8 pshift; + u8 pwidth; + u8 n_start; +}; + +struct factors_request { + long unsigned int rate; + long unsigned int parent_rate; + u8 parent_index; + u8 n; + u8 k; + u8 m; + u8 p; +}; + +struct factors_data { + int enable; + int mux; + int muxmask; + const struct clk_factors_config *table; + void (*getter)(struct factors_request *); + void (*recalc)(struct factors_request *); + const char *name; +}; + +struct clk_factors { + struct clk_hw hw; + void *reg; + const struct clk_factors_config *config; + void (*get_factors)(struct factors_request *); + void (*recalc)(struct factors_request *); + spinlock_t *lock; + struct clk_mux *mux; + struct clk_gate *gate; +}; + +struct mux_data { + u8 shift; +}; + +struct div_data { + u8 shift; + u8 pow; + u8 width; + const struct clk_div_table *table; +}; + +struct divs_data { + const struct factors_data *factors; + int ndivs; + struct { + u8 self; + u8 fixed; + struct clk_div_table *table; + u8 shift; + u8 pow; + u8 gate; + bool critical; + } div[4]; +}; + +struct ve_reset_data { + void *reg; + spinlock_t *lock; + struct reset_controller_dev rcdev; +}; + +struct mmc_phase { + struct clk_hw hw; + u8 offset; + void *reg; + spinlock_t *lock; +}; + +struct sun4i_a10_display_clk_data { + bool has_div; + u8 num_rst; + u8 parents; + u8 offset_en; + u8 offset_div; + u8 offset_mux; + u8 offset_rst; + u8 width_div; + u8 width_mux; + u32 flags; +}; + +struct reset_data { + void *reg; + spinlock_t *lock; + struct reset_controller_dev rcdev; + u8 offset; +}; + +struct tcon_ch1_clk { + struct clk_hw hw; + spinlock_t lock; + void *reg; +}; + +enum { + AHB1 = 0, + AHB2 = 1, + APB1 = 2, + APB2 = 3, + PARENT_MAX = 4, +}; + +struct sun9i_mmc_clk_data { + spinlock_t lock; + void *membase; + struct clk *clk; + struct reset_control *reset; + struct clk_onecell_data clk_data; + struct reset_controller_dev rcdev; +}; + +struct usb_reset_data { + void *reg; + spinlock_t *lock; + struct clk *clk; + struct reset_controller_dev rcdev; +}; + +struct usb_clk_data { + u32 clk_mask; + u32 reset_mask; + bool reset_needs_clk; +}; + +struct sun9i_a80_cpus_clk { + struct clk_hw hw; + void *reg; +}; + +struct gates_data { + long unsigned int mask[1]; +}; + +struct ccu_common { + void *base; + u16 reg; + u16 lock_reg; + u32 prediv; + long unsigned int features; + spinlock_t *lock; + struct clk_hw hw; +}; + +struct ccu_reset_map; + +struct sunxi_ccu_desc { + struct ccu_common **ccu_clks; + long unsigned int num_ccu_clks; + struct clk_hw_onecell_data *hw_clks; + struct ccu_reset_map *resets; + long unsigned int num_resets; +}; + +struct ccu_reset_map { + u16 reg; + u32 bit; +}; + +struct ccu_pll_nb { + struct notifier_block clk_nb; + struct ccu_common *common; + u32 enable; + u32 lock; +}; + +struct ccu_reset { + void *base; + struct ccu_reset_map *reset_map; + spinlock_t *lock; + struct reset_controller_dev rcdev; +}; + +struct sunxi_ccu { + const struct sunxi_ccu_desc *desc; + spinlock_t lock; + struct ccu_reset reset; +}; + +struct ccu_mux_fixed_prediv { + u8 index; + u16 div; +}; + +struct ccu_mux_var_prediv { + u8 index; + u8 shift; + u8 width; +}; + +struct ccu_mux_internal { + u8 shift; + u8 width; + const u8 *table; + const struct ccu_mux_fixed_prediv *fixed_predivs; + u8 n_predivs; + const struct ccu_mux_var_prediv *var_predivs; + u8 n_var_predivs; +}; + +struct ccu_div_internal { + u8 shift; + u8 width; + u32 max; + u32 offset; + u32 flags; + struct clk_div_table *table; +}; + +struct ccu_div { + u32 enable; + struct ccu_div_internal div; + struct ccu_mux_internal mux; + struct ccu_common common; + unsigned int fixed_post_div; +}; + +struct ccu_frac_internal { + u32 enable; + u32 select; + long unsigned int rates[2]; +}; + +struct ccu_gate { + u32 enable; + struct ccu_common common; +}; + +struct ccu_mux { + u32 enable; + struct ccu_mux_internal mux; + struct ccu_common common; +}; + +struct ccu_mux_nb { + struct notifier_block clk_nb; + struct ccu_common *common; + struct ccu_mux_internal *cm; + u32 delay_us; + u8 bypass_index; + u8 original_index; +}; + +struct ccu_mult_internal { + u8 offset; + u8 shift; + u8 width; + u8 min; + u8 max; +}; + +struct ccu_mult { + u32 enable; + u32 lock; + struct ccu_frac_internal frac; + struct ccu_mult_internal mult; + struct ccu_mux_internal mux; + struct ccu_common common; +}; + +struct _ccu_mult { + long unsigned int mult; + long unsigned int min; + long unsigned int max; +}; + +struct ccu_phase { + u8 shift; + u8 width; + struct ccu_common common; +}; + +struct ccu_sdm_setting { + long unsigned int rate; + u32 pattern; + u32 m; + u32 n; +}; + +struct ccu_sdm_internal { + struct ccu_sdm_setting *table; + u32 table_size; + u32 enable; + u32 tuning_enable; + u16 tuning_reg; +}; + +struct ccu_nk { + u16 reg; + u32 enable; + u32 lock; + struct ccu_mult_internal n; + struct ccu_mult_internal k; + unsigned int fixed_post_div; + struct ccu_common common; +}; + +struct _ccu_nk { + long unsigned int n; + long unsigned int min_n; + long unsigned int max_n; + long unsigned int k; + long unsigned int min_k; + long unsigned int max_k; +}; + +struct ccu_nkm { + u32 enable; + u32 lock; + struct ccu_mult_internal n; + struct ccu_mult_internal k; + struct ccu_div_internal m; + struct ccu_mux_internal mux; + unsigned int fixed_post_div; + struct ccu_common common; +}; + +struct _ccu_nkm { + long unsigned int n; + long unsigned int min_n; + long unsigned int max_n; + long unsigned int k; + long unsigned int min_k; + long unsigned int max_k; + long unsigned int m; + long unsigned int min_m; + long unsigned int max_m; +}; + +struct ccu_nkmp { + u32 enable; + u32 lock; + struct ccu_mult_internal n; + struct ccu_mult_internal k; + struct ccu_div_internal m; + struct ccu_div_internal p; + unsigned int fixed_post_div; + unsigned int max_rate; + struct ccu_common common; +}; + +struct _ccu_nkmp { + long unsigned int n; + long unsigned int min_n; + long unsigned int max_n; + long unsigned int k; + long unsigned int min_k; + long unsigned int max_k; + long unsigned int m; + long unsigned int min_m; + long unsigned int max_m; + long unsigned int p; + long unsigned int min_p; + long unsigned int max_p; +}; + +struct ccu_nm { + u32 enable; + u32 lock; + struct ccu_mult_internal n; + struct ccu_div_internal m; + struct ccu_frac_internal frac; + struct ccu_sdm_internal sdm; + unsigned int fixed_post_div; + unsigned int min_rate; + unsigned int max_rate; + struct ccu_common common; +}; + +struct _ccu_nm { + long unsigned int n; + long unsigned int min_n; + long unsigned int max_n; + long unsigned int m; + long unsigned int min_m; + long unsigned int max_m; +}; + +struct ccu_mp { + u32 enable; + struct ccu_div_internal m; + struct ccu_div_internal p; + struct ccu_mux_internal mux; + unsigned int fixed_post_div; + struct ccu_common common; +}; + +struct sun6i_rtc_match_data { + bool have_ext_osc32k: 1; + bool have_iosc_calibration: 1; + bool rtc_32k_single_parent: 1; + const struct clk_parent_data *osc32k_fanout_parents; + u8 osc32k_fanout_nparents; +}; + +struct tegra_clk_periph_regs { + u32 enb_reg; + u32 enb_set_reg; + u32 enb_clr_reg; + u32 rst_reg; + u32 rst_set_reg; + u32 rst_clr_reg; +}; + +struct tegra_clk_init_table { + unsigned int clk_id; + unsigned int parent_id; + long unsigned int rate; + int state; +}; + +struct tegra_clk_duplicate { + int clk_id; + struct clk_lookup lookup; +}; + +struct tegra_clk { + int dt_id; + bool present; +}; + +struct tegra_devclk { + int dt_id; + char *dev_id; + char *con_id; +}; + +typedef void (*tegra_clk_apply_init_table_func)(); + +struct tegra_clk_sync_source { + struct clk_hw hw; + long unsigned int rate; + long unsigned int max_rate; +}; + +struct tegra_core_opp_params { + bool init_state; +}; + +struct tegra_clk_device { + struct notifier_block clk_nb; + struct device *dev; + struct clk_hw *hw; + struct mutex lock; +}; + +struct i2c_msg { + __u16 addr; + __u16 flags; + __u16 len; + __u8 *buf; +}; + +union i2c_smbus_data { + __u8 byte; + __u16 word; + __u8 block[34]; +}; + +enum i2c_slave_event { + I2C_SLAVE_READ_REQUESTED = 0, + I2C_SLAVE_WRITE_REQUESTED = 1, + I2C_SLAVE_READ_PROCESSED = 2, + I2C_SLAVE_WRITE_RECEIVED = 3, + I2C_SLAVE_STOP = 4, +}; + +typedef int (*i2c_slave_cb_t)(struct i2c_client *, enum i2c_slave_event, u8 *); + +struct i2c_adapter; + +struct i2c_client { + short unsigned int flags; + short unsigned int addr; + char name[20]; + struct i2c_adapter *adapter; + long: 32; + struct device dev; + int init_irq; + int irq; + struct list_head detected; + i2c_slave_cb_t slave_cb; + void *devres_group_id; +}; + +struct i2c_algorithm; + +struct i2c_lock_operations; + +struct i2c_bus_recovery_info; + +struct i2c_adapter_quirks; + +struct i2c_adapter { + struct module *owner; + unsigned int class; + const struct i2c_algorithm *algo; + void *algo_data; + const struct i2c_lock_operations *lock_ops; + struct rt_mutex bus_lock; + struct rt_mutex mux_lock; + int timeout; + int retries; + long: 32; + struct device dev; + long unsigned int locked_flags; + int nr; + char name[48]; + struct completion dev_released; + struct mutex userspace_clients_lock; + struct list_head userspace_clients; + struct i2c_bus_recovery_info *bus_recovery_info; + const struct i2c_adapter_quirks *quirks; + struct irq_domain *host_notify_domain; + struct regulator *bus_regulator; + long: 32; +}; + +struct i2c_algorithm { + int (*master_xfer)(struct i2c_adapter *, struct i2c_msg *, int); + int (*master_xfer_atomic)(struct i2c_adapter *, struct i2c_msg *, int); + int (*smbus_xfer)(struct i2c_adapter *, u16, short unsigned int, char, u8, int, union i2c_smbus_data *); + int (*smbus_xfer_atomic)(struct i2c_adapter *, u16, short unsigned int, char, u8, int, union i2c_smbus_data *); + u32 (*functionality)(struct i2c_adapter *); + int (*reg_slave)(struct i2c_client *); + int (*unreg_slave)(struct i2c_client *); +}; + +struct i2c_lock_operations { + void (*lock_bus)(struct i2c_adapter *, unsigned int); + int (*trylock_bus)(struct i2c_adapter *, unsigned int); + void (*unlock_bus)(struct i2c_adapter *, unsigned int); +}; + +struct i2c_bus_recovery_info { + int (*recover_bus)(struct i2c_adapter *); + int (*get_scl)(struct i2c_adapter *); + void (*set_scl)(struct i2c_adapter *, int); + int (*get_sda)(struct i2c_adapter *); + void (*set_sda)(struct i2c_adapter *, int); + int (*get_bus_free)(struct i2c_adapter *); + void (*prepare_recovery)(struct i2c_adapter *); + void (*unprepare_recovery)(struct i2c_adapter *); + struct gpio_desc *scl_gpiod; + struct gpio_desc *sda_gpiod; + struct pinctrl *pinctrl; + struct pinctrl_state *pins_default; + struct pinctrl_state *pins_gpio; +}; + +struct i2c_adapter_quirks { + u64 flags; + int max_num_msgs; + u16 max_write_len; + u16 max_read_len; + u16 max_comb_1st_msg_len; + u16 max_comb_2nd_msg_len; + long: 32; +}; + +struct rail_alignment { + int offset_uv; + int step_uv; +}; + +struct cvb_coefficients { + int c0; + int c1; + int c2; +}; + +struct cvb_table_freq_entry { + long unsigned int freq; + struct cvb_coefficients coefficients; +}; + +struct cvb_cpu_dfll_data { + u32 tune0_low; + u32 tune0_high; + u32 tune1; + unsigned int tune_high_min_millivolts; +}; + +struct cvb_table { + int speedo_id; + int process_id; + int min_millivolts; + int max_millivolts; + int speedo_scale; + int voltage_scale; + struct cvb_table_freq_entry entries[40]; + struct cvb_cpu_dfll_data cpu_dfll_data; +}; + +struct tegra_dfll_soc_data { + struct device *dev; + long unsigned int max_freq; + const struct cvb_table *cvb; + struct rail_alignment alignment; + void (*init_clock_trimmers)(); + void (*set_clock_trimmers_high)(); + void (*set_clock_trimmers_low)(); +}; + +enum dfll_ctrl_mode { + DFLL_UNINITIALIZED = 0, + DFLL_DISABLED = 1, + DFLL_OPEN_LOOP = 2, + DFLL_CLOSED_LOOP = 3, +}; + +enum dfll_tune_range { + DFLL_TUNE_UNINITIALIZED = 0, + DFLL_TUNE_LOW = 1, +}; + +enum tegra_dfll_pmu_if { + TEGRA_DFLL_PMU_I2C = 0, + TEGRA_DFLL_PMU_PWM = 1, +}; + +struct dfll_rate_req { + long unsigned int rate; + long unsigned int dvco_target_rate; + int lut_index; + u8 mult_bits; + u8 scale_bits; +}; + +struct tegra_dfll { + struct device *dev; + struct tegra_dfll_soc_data *soc; + void *base; + void *i2c_base; + void *i2c_controller_base; + void *lut_base; + struct regulator *vdd_reg; + struct clk *soc_clk; + struct clk *ref_clk; + struct clk *i2c_clk; + struct clk *dfll_clk; + struct reset_control *dfll_rst; + struct reset_control *dvco_rst; + long unsigned int ref_rate; + long unsigned int i2c_clk_rate; + long unsigned int dvco_rate_min; + enum dfll_ctrl_mode mode; + enum dfll_tune_range tune_range; + struct dentry *debugfs_dir; + struct clk_hw dfll_clk_hw; + const char *output_clock_name; + struct dfll_rate_req last_req; + long unsigned int last_unrounded_rate; + u32 droop_ctrl; + u32 sample_rate; + u32 force_mode; + u32 cf; + u32 ci; + u32 cg; + bool cg_scale; + u32 i2c_fs_rate; + u32 i2c_reg; + u32 i2c_slave_addr; + unsigned int lut[33]; + long unsigned int lut_uv[33]; + int lut_size; + u8 lut_bottom; + u8 lut_min; + u8 lut_max; + u8 lut_safe; + enum tegra_dfll_pmu_if pmu_if; + long unsigned int pwm_rate; + struct pinctrl *pwm_pin; + struct pinctrl_state *pwm_enable_state; + struct pinctrl_state *pwm_disable_state; + u32 reg_init_uV; +}; + +struct tegra_clk_frac_div { + struct clk_hw hw; + void *reg; + u8 flags; + u8 shift; + u8 width; + u8 frac_width; + spinlock_t *lock; +}; + +struct tegra_clk_periph_gate { + u32 magic; + struct clk_hw hw; + void *clk_base; + u8 flags; + int clk_num; + int *enable_refcnt; + const struct tegra_clk_periph_regs *regs; +}; + +struct tegra_clk_periph { + u32 magic; + struct clk_hw hw; + struct clk_mux mux; + struct tegra_clk_frac_div divider; + struct tegra_clk_periph_gate gate; + const struct clk_ops *mux_ops; + const struct clk_ops *div_ops; + const struct clk_ops *gate_ops; +}; + +struct tegra_periph_init_data { + const char *name; + int clk_id; + union { + const char * const *parent_names; + const char *parent_name; + } p; + int num_parents; + struct tegra_clk_periph periph; + u32 offset; + const char *con_id; + const char *dev_id; + long unsigned int flags; +}; + +struct tegra_clk_periph_fixed { + struct clk_hw hw; + void *base; + const struct tegra_clk_periph_regs *regs; + unsigned int mul; + unsigned int div; + unsigned int num; +}; + +struct tegra_clk_pll_freq_table { + long unsigned int input_rate; + long unsigned int output_rate; + u32 n; + u32 m; + u8 p; + u8 cpcon; + u16 sdm_data; +}; + +struct pdiv_map { + u8 pdiv; + u8 hw_val; +}; + +struct div_nmp { + u8 divn_shift; + u8 divn_width; + u8 divm_shift; + u8 divm_width; + u8 divp_shift; + u8 divp_width; + u8 override_divn_shift; + u8 override_divm_shift; + u8 override_divp_shift; +}; + +struct tegra_clk_pll; + +struct tegra_clk_pll_params { + long unsigned int input_min; + long unsigned int input_max; + long unsigned int cf_min; + long unsigned int cf_max; + long unsigned int vco_min; + long unsigned int vco_max; + u32 base_reg; + u32 misc_reg; + u32 lock_reg; + u32 lock_mask; + u32 lock_enable_bit_idx; + u32 iddq_reg; + u32 iddq_bit_idx; + u32 reset_reg; + u32 reset_bit_idx; + u32 sdm_din_reg; + u32 sdm_din_mask; + u32 sdm_ctrl_reg; + u32 sdm_ctrl_en_mask; + u32 ssc_ctrl_reg; + u32 ssc_ctrl_en_mask; + u32 aux_reg; + u32 dyn_ramp_reg; + u32 ext_misc_reg[6]; + u32 pmc_divnm_reg; + u32 pmc_divp_reg; + u32 flags; + int stepa_shift; + int stepb_shift; + int lock_delay; + int max_p; + bool defaults_set; + const struct pdiv_map *pdiv_tohw; + struct div_nmp *div_nmp; + struct tegra_clk_pll_freq_table *freq_table; + long unsigned int fixed_rate; + u16 mdiv_default; + u32 (*round_p_to_pdiv)(u32, u32 *); + void (*set_gain)(struct tegra_clk_pll_freq_table *); + int (*calc_rate)(struct clk_hw *, struct tegra_clk_pll_freq_table *, long unsigned int, long unsigned int); + long unsigned int (*adjust_vco)(struct tegra_clk_pll_params *, long unsigned int); + void (*set_defaults)(struct tegra_clk_pll *); + int (*dyn_ramp)(struct tegra_clk_pll *, struct tegra_clk_pll_freq_table *); + int (*pre_rate_change)(); + void (*post_rate_change)(); +}; + +struct tegra_clk_pll { + struct clk_hw hw; + void *clk_base; + void *pmc; + spinlock_t *lock; + struct tegra_clk_pll_params *params; +}; + +struct utmi_clk_param { + u32 osc_frequency; + u8 enable_delay_count; + u8 stable_count; + u8 active_delay_count; + u8 xtal_freq_count; +}; + +struct tegra_clk_pll_out { + struct clk_hw hw; + void *reg; + u8 enb_bit_idx; + u8 rst_bit_idx; + spinlock_t *lock; + u8 flags; +}; + +struct tegra_sdmmc_mux { + struct clk_hw hw; + void *reg; + spinlock_t *lock; + const struct clk_ops *gate_ops; + struct tegra_clk_periph_gate gate; + u8 div_flags; +}; + +struct tegra_clk_super_mux { + struct clk_hw hw; + void *reg; + struct tegra_clk_frac_div frac_div; + const struct clk_ops *div_ops; + u8 width; + u8 flags; + u8 div2_index; + u8 pllx_index; + spinlock_t *lock; +}; + +struct tegra_audio_clk_info { + char *name; + struct tegra_clk_pll_params *pll_params; + int clk_id; + char *parent; +}; + +enum clk_id { + tegra_clk_actmon = 0, + tegra_clk_adx = 1, + tegra_clk_adx1 = 2, + tegra_clk_afi = 3, + tegra_clk_amx = 4, + tegra_clk_amx1 = 5, + tegra_clk_apb2ape = 6, + tegra_clk_ahbdma = 7, + tegra_clk_apbdma = 8, + tegra_clk_apbif = 9, + tegra_clk_ape = 10, + tegra_clk_audio0 = 11, + tegra_clk_audio0_2x = 12, + tegra_clk_audio0_mux = 13, + tegra_clk_audio1 = 14, + tegra_clk_audio1_2x = 15, + tegra_clk_audio1_mux = 16, + tegra_clk_audio2 = 17, + tegra_clk_audio2_2x = 18, + tegra_clk_audio2_mux = 19, + tegra_clk_audio3 = 20, + tegra_clk_audio3_2x = 21, + tegra_clk_audio3_mux = 22, + tegra_clk_audio4 = 23, + tegra_clk_audio4_2x = 24, + tegra_clk_audio4_mux = 25, + tegra_clk_bsea = 26, + tegra_clk_bsev = 27, + tegra_clk_cclk_g = 28, + tegra_clk_cclk_lp = 29, + tegra_clk_cilab = 30, + tegra_clk_cilcd = 31, + tegra_clk_cile = 32, + tegra_clk_clk_32k = 33, + tegra_clk_clk72Mhz = 34, + tegra_clk_clk72Mhz_8 = 35, + tegra_clk_clk_m = 36, + tegra_clk_osc = 37, + tegra_clk_osc_div2 = 38, + tegra_clk_osc_div4 = 39, + tegra_clk_cml0 = 40, + tegra_clk_cml1 = 41, + tegra_clk_csi = 42, + tegra_clk_csite = 43, + tegra_clk_csite_8 = 44, + tegra_clk_csus = 45, + tegra_clk_cve = 46, + tegra_clk_dam0 = 47, + tegra_clk_dam1 = 48, + tegra_clk_dam2 = 49, + tegra_clk_d_audio = 50, + tegra_clk_dbgapb = 51, + tegra_clk_dds = 52, + tegra_clk_dfll_ref = 53, + tegra_clk_dfll_soc = 54, + tegra_clk_disp1 = 55, + tegra_clk_disp1_8 = 56, + tegra_clk_disp2 = 57, + tegra_clk_disp2_8 = 58, + tegra_clk_dp2 = 59, + tegra_clk_dpaux = 60, + tegra_clk_dpaux1 = 61, + tegra_clk_dsialp = 62, + tegra_clk_dsia_mux = 63, + tegra_clk_dsiblp = 64, + tegra_clk_dsib_mux = 65, + tegra_clk_dtv = 66, + tegra_clk_emc = 67, + tegra_clk_entropy = 68, + tegra_clk_entropy_8 = 69, + tegra_clk_epp = 70, + tegra_clk_epp_8 = 71, + tegra_clk_extern1 = 72, + tegra_clk_extern2 = 73, + tegra_clk_extern3 = 74, + tegra_clk_fuse = 75, + tegra_clk_fuse_burn = 76, + tegra_clk_gpu = 77, + tegra_clk_gr2d = 78, + tegra_clk_gr2d_8 = 79, + tegra_clk_gr3d = 80, + tegra_clk_gr3d_8 = 81, + tegra_clk_hclk = 82, + tegra_clk_hda = 83, + tegra_clk_hda_8 = 84, + tegra_clk_hda2codec_2x = 85, + tegra_clk_hda2codec_2x_8 = 86, + tegra_clk_hda2hdmi = 87, + tegra_clk_hdmi = 88, + tegra_clk_hdmi_audio = 89, + tegra_clk_host1x = 90, + tegra_clk_host1x_8 = 91, + tegra_clk_host1x_9 = 92, + tegra_clk_hsic_trk = 93, + tegra_clk_i2c1 = 94, + tegra_clk_i2c2 = 95, + tegra_clk_i2c3 = 96, + tegra_clk_i2c4 = 97, + tegra_clk_i2c5 = 98, + tegra_clk_i2c6 = 99, + tegra_clk_i2cslow = 100, + tegra_clk_i2s0 = 101, + tegra_clk_i2s0_sync = 102, + tegra_clk_i2s1 = 103, + tegra_clk_i2s1_sync = 104, + tegra_clk_i2s2 = 105, + tegra_clk_i2s2_sync = 106, + tegra_clk_i2s3 = 107, + tegra_clk_i2s3_sync = 108, + tegra_clk_i2s4 = 109, + tegra_clk_i2s4_sync = 110, + tegra_clk_isp = 111, + tegra_clk_isp_8 = 112, + tegra_clk_isp_9 = 113, + tegra_clk_ispb = 114, + tegra_clk_kbc = 115, + tegra_clk_kfuse = 116, + tegra_clk_la = 117, + tegra_clk_maud = 118, + tegra_clk_mipi = 119, + tegra_clk_mipibif = 120, + tegra_clk_mipi_cal = 121, + tegra_clk_mpe = 122, + tegra_clk_mselect = 123, + tegra_clk_msenc = 124, + tegra_clk_ndflash = 125, + tegra_clk_ndflash_8 = 126, + tegra_clk_ndspeed = 127, + tegra_clk_ndspeed_8 = 128, + tegra_clk_nor = 129, + tegra_clk_nvdec = 130, + tegra_clk_nvenc = 131, + tegra_clk_nvjpg = 132, + tegra_clk_owr = 133, + tegra_clk_owr_8 = 134, + tegra_clk_pcie = 135, + tegra_clk_pclk = 136, + tegra_clk_pll_a = 137, + tegra_clk_pll_a_out0 = 138, + tegra_clk_pll_a1 = 139, + tegra_clk_pll_c = 140, + tegra_clk_pll_c2 = 141, + tegra_clk_pll_c3 = 142, + tegra_clk_pll_c4 = 143, + tegra_clk_pll_c4_out0 = 144, + tegra_clk_pll_c4_out1 = 145, + tegra_clk_pll_c4_out2 = 146, + tegra_clk_pll_c4_out3 = 147, + tegra_clk_pll_c_out1 = 148, + tegra_clk_pll_d = 149, + tegra_clk_pll_d2 = 150, + tegra_clk_pll_d2_out0 = 151, + tegra_clk_pll_d_out0 = 152, + tegra_clk_pll_dp = 153, + tegra_clk_pll_e_out0 = 154, + tegra_clk_pll_g_ref = 155, + tegra_clk_pll_m = 156, + tegra_clk_pll_m_out1 = 157, + tegra_clk_pll_mb = 158, + tegra_clk_pll_p = 159, + tegra_clk_pll_p_out1 = 160, + tegra_clk_pll_p_out2 = 161, + tegra_clk_pll_p_out2_int = 162, + tegra_clk_pll_p_out3 = 163, + tegra_clk_pll_p_out4 = 164, + tegra_clk_pll_p_out4_cpu = 165, + tegra_clk_pll_p_out5 = 166, + tegra_clk_pll_p_out_hsio = 167, + tegra_clk_pll_p_out_xusb = 168, + tegra_clk_pll_p_out_cpu = 169, + tegra_clk_pll_p_out_adsp = 170, + tegra_clk_pll_ref = 171, + tegra_clk_pll_re_out = 172, + tegra_clk_pll_re_vco = 173, + tegra_clk_pll_u = 174, + tegra_clk_pll_u_out = 175, + tegra_clk_pll_u_out1 = 176, + tegra_clk_pll_u_out2 = 177, + tegra_clk_pll_u_12m = 178, + tegra_clk_pll_u_480m = 179, + tegra_clk_pll_u_48m = 180, + tegra_clk_pll_u_60m = 181, + tegra_clk_pll_x = 182, + tegra_clk_pll_x_out0 = 183, + tegra_clk_pwm = 184, + tegra_clk_qspi = 185, + tegra_clk_rtc = 186, + tegra_clk_sata = 187, + tegra_clk_sata_8 = 188, + tegra_clk_sata_cold = 189, + tegra_clk_sata_oob = 190, + tegra_clk_sata_oob_8 = 191, + tegra_clk_sbc1 = 192, + tegra_clk_sbc1_8 = 193, + tegra_clk_sbc1_9 = 194, + tegra_clk_sbc2 = 195, + tegra_clk_sbc2_8 = 196, + tegra_clk_sbc2_9 = 197, + tegra_clk_sbc3 = 198, + tegra_clk_sbc3_8 = 199, + tegra_clk_sbc3_9 = 200, + tegra_clk_sbc4 = 201, + tegra_clk_sbc4_8 = 202, + tegra_clk_sbc4_9 = 203, + tegra_clk_sbc5 = 204, + tegra_clk_sbc5_8 = 205, + tegra_clk_sbc6 = 206, + tegra_clk_sbc6_8 = 207, + tegra_clk_sclk = 208, + tegra_clk_sdmmc_legacy = 209, + tegra_clk_sdmmc1 = 210, + tegra_clk_sdmmc1_8 = 211, + tegra_clk_sdmmc1_9 = 212, + tegra_clk_sdmmc2 = 213, + tegra_clk_sdmmc2_8 = 214, + tegra_clk_sdmmc3 = 215, + tegra_clk_sdmmc3_8 = 216, + tegra_clk_sdmmc3_9 = 217, + tegra_clk_sdmmc4 = 218, + tegra_clk_sdmmc4_8 = 219, + tegra_clk_se = 220, + tegra_clk_se_10 = 221, + tegra_clk_soc_therm = 222, + tegra_clk_soc_therm_8 = 223, + tegra_clk_sor0 = 224, + tegra_clk_sor0_out = 225, + tegra_clk_sor1 = 226, + tegra_clk_sor1_out = 227, + tegra_clk_spdif = 228, + tegra_clk_spdif_2x = 229, + tegra_clk_spdif_in = 230, + tegra_clk_spdif_in_8 = 231, + tegra_clk_spdif_in_sync = 232, + tegra_clk_spdif_mux = 233, + tegra_clk_spdif_out = 234, + tegra_clk_timer = 235, + tegra_clk_trace = 236, + tegra_clk_tsec = 237, + tegra_clk_tsec_8 = 238, + tegra_clk_tsecb = 239, + tegra_clk_tsensor = 240, + tegra_clk_tvdac = 241, + tegra_clk_tvo = 242, + tegra_clk_uarta = 243, + tegra_clk_uarta_8 = 244, + tegra_clk_uartb = 245, + tegra_clk_uartb_8 = 246, + tegra_clk_uartc = 247, + tegra_clk_uartc_8 = 248, + tegra_clk_uartd = 249, + tegra_clk_uartd_8 = 250, + tegra_clk_uarte = 251, + tegra_clk_uarte_8 = 252, + tegra_clk_uartape = 253, + tegra_clk_usb2 = 254, + tegra_clk_usb2_hsic_trk = 255, + tegra_clk_usb2_trk = 256, + tegra_clk_usb3 = 257, + tegra_clk_usbd = 258, + tegra_clk_vcp = 259, + tegra_clk_vde = 260, + tegra_clk_vde_8 = 261, + tegra_clk_vfir = 262, + tegra_clk_vi = 263, + tegra_clk_vi_8 = 264, + tegra_clk_vi_9 = 265, + tegra_clk_vi_10 = 266, + tegra_clk_vi_i2c = 267, + tegra_clk_vic03 = 268, + tegra_clk_vic03_8 = 269, + tegra_clk_vim2_clk = 270, + tegra_clk_vimclk_sync = 271, + tegra_clk_vi_sensor = 272, + tegra_clk_vi_sensor_8 = 273, + tegra_clk_vi_sensor_9 = 274, + tegra_clk_vi_sensor2 = 275, + tegra_clk_vi_sensor2_8 = 276, + tegra_clk_xusb_dev = 277, + tegra_clk_xusb_dev_src = 278, + tegra_clk_xusb_dev_src_8 = 279, + tegra_clk_xusb_falcon_src = 280, + tegra_clk_xusb_falcon_src_8 = 281, + tegra_clk_xusb_fs_src = 282, + tegra_clk_xusb_gate = 283, + tegra_clk_xusb_host = 284, + tegra_clk_xusb_host_src = 285, + tegra_clk_xusb_host_src_8 = 286, + tegra_clk_xusb_hs_src = 287, + tegra_clk_xusb_hs_src_4 = 288, + tegra_clk_xusb_ss = 289, + tegra_clk_xusb_ss_src = 290, + tegra_clk_xusb_ss_src_8 = 291, + tegra_clk_xusb_ss_div2 = 292, + tegra_clk_xusb_ssp_src = 293, + tegra_clk_sclk_mux = 294, + tegra_clk_sor_safe = 295, + tegra_clk_cec = 296, + tegra_clk_ispa = 297, + tegra_clk_dmic1 = 298, + tegra_clk_dmic2 = 299, + tegra_clk_dmic3 = 300, + tegra_clk_dmic1_sync_clk = 301, + tegra_clk_dmic2_sync_clk = 302, + tegra_clk_dmic3_sync_clk = 303, + tegra_clk_dmic1_sync_clk_mux = 304, + tegra_clk_dmic2_sync_clk_mux = 305, + tegra_clk_dmic3_sync_clk_mux = 306, + tegra_clk_iqc1 = 307, + tegra_clk_iqc2 = 308, + tegra_clk_pll_a_out_adsp = 309, + tegra_clk_pll_a_out0_out_adsp = 310, + tegra_clk_adsp = 311, + tegra_clk_adsp_neon = 312, + tegra_clk_max = 313, +}; + +struct tegra_sync_source_initdata { + char *name; + long unsigned int rate; + long unsigned int max_rate; + int clk_id; +}; + +struct tegra_audio_clk_initdata { + char *gate_name; + char *mux_name; + u32 offset; + int gate_clk_id; + int mux_clk_id; +}; + +struct tegra_audio2x_clk_initdata { + char *parent; + char *gate_name; + char *name_2x; + char *div_name; + int clk_id; + int clk_num; + u8 div_offset; +}; + +struct pll_out_data { + char *div_name; + char *pll_out_name; + u32 offset; + int clk_id; + u8 div_shift; + u8 div_flags; + u8 rst_shift; + spinlock_t *lock; +}; + +enum tegra_super_gen { + gen4 = 4, + gen5 = 5, +}; + +struct tegra_super_gen_info { + enum tegra_super_gen gen; + const char **sclk_parents; + const char **cclk_g_parents; + const char **cclk_lp_parents; + int num_sclk_parents; + int num_cclk_g_parents; + int num_cclk_lp_parents; +}; + +struct cpu_clk_suspend_context { + u32 clk_csite_src; + u32 cclkg_burst; + u32 cclkg_divider; +}; + +enum tegra_revision { + TEGRA_REVISION_UNKNOWN = 0, + TEGRA_REVISION_A01 = 1, + TEGRA_REVISION_A02 = 2, + TEGRA_REVISION_A03 = 3, + TEGRA_REVISION_A03p = 4, + TEGRA_REVISION_A04 = 5, + TEGRA_REVISION_MAX = 6, +}; + +enum tegra_platform { + TEGRA_PLATFORM_SILICON = 0, + TEGRA_PLATFORM_QT = 1, + TEGRA_PLATFORM_SYSTEM_FPGA = 2, + TEGRA_PLATFORM_UNIT_FPGA = 3, + TEGRA_PLATFORM_ASIM_QT = 4, + TEGRA_PLATFORM_ASIM_LINSIM = 5, + TEGRA_PLATFORM_DSIM_ASIM_LINSIM = 6, + TEGRA_PLATFORM_VERIFICATION_SIMULATION = 7, + TEGRA_PLATFORM_VDK = 8, + TEGRA_PLATFORM_VSP = 9, + TEGRA_PLATFORM_MAX = 10, +}; + +struct tegra_sku_info { + int sku_id; + int cpu_process_id; + int cpu_speedo_id; + int cpu_speedo_value; + int cpu_iddq_value; + int soc_process_id; + int soc_speedo_id; + int soc_speedo_value; + int gpu_process_id; + int gpu_speedo_id; + int gpu_speedo_value; + enum tegra_revision revision; + enum tegra_platform platform; +}; + +struct dfll_fcpu_data { + const long unsigned int *cpu_max_freq_table; + unsigned int cpu_max_freq_table_size; + const struct cvb_table *cpu_cvb_tables; + unsigned int cpu_cvb_tables_size; +}; + +struct tegra_emc; + +typedef int tegra124_emc_prepare_timing_change_cb(struct tegra_emc *, long unsigned int); + +typedef void tegra124_emc_complete_timing_change_cb(struct tegra_emc *, long unsigned int); + +struct emc_timing { + long unsigned int rate; + long unsigned int parent_rate; + u8 parent_index; + struct clk *parent; + u32 ram_code; +}; + +struct tegra_clk_emc { + struct clk_hw hw; + void *clk_regs; + struct clk *prev_parent; + bool changing_timing; + struct device_node *emc_node; + struct tegra_emc *emc; + int num_timings; + struct emc_timing *timings; + spinlock_t *lock; + tegra124_emc_prepare_timing_change_cb *prepare_timing_change; + tegra124_emc_complete_timing_change_cb *complete_timing_change; +}; + +enum { + DOWN___2 = 0, + UP___2 = 1, +}; + +struct ti_dt_clk { + struct clk_lookup lk; + char *node_name; +}; + +typedef void (*ti_of_clk_init_cb_t)(void *, struct device_node *); + +struct clk_iomap { + struct regmap *regmap; + void *mem; +}; + +struct clk_init_item { + struct device_node *node; + void *user; + ti_of_clk_init_cb_t func; + struct list_head link; +}; + +struct clk_ti_autoidle { + struct clk_omap_reg reg; + u8 shift; + u8 flags; + const char *name; + struct list_head node; +}; + +enum { + CLK_COMPONENT_TYPE_GATE = 0, + CLK_COMPONENT_TYPE_DIVIDER = 1, + CLK_COMPONENT_TYPE_MUX = 2, + CLK_COMPONENT_TYPE_MAX = 3, +}; + +struct component_clk { + int num_parents; + const char **parent_names; + struct device_node *node; + int type; + struct clk_hw *hw; + struct list_head link; +}; + +struct clk_hw_omap_comp { + struct clk_hw hw; + struct device_node *comp_nodes[3]; + struct component_clk *comp_clks[3]; +}; + +struct clk_omap_divider { + struct clk_hw hw; + struct clk_omap_reg reg; + u8 shift; + u8 flags; + s8 latch; + u16 min; + u16 max; + u16 mask; + const struct clk_div_table *table; + u32 context; +}; + +struct clk_omap_mux { + struct clk_hw hw; + struct clk_omap_reg reg; + u32 *table; + u32 mask; + u8 shift; + s8 latch; + u8 flags; + u8 saved_parent; +}; + +struct ti_clk_mux { + u8 bit_shift; + int num_parents; + u16 reg; + u8 module; + const char * const *parents; + u16 flags; +}; + +enum { + TI_CLK_FIXED = 0, + TI_CLK_MUX = 1, + TI_CLK_DIVIDER = 2, + TI_CLK_COMPOSITE = 3, + TI_CLK_FIXED_FACTOR = 4, + TI_CLK_GATE = 5, + TI_CLK_DPLL = 6, +}; + +struct omap_clkctrl_div_data { + const int *dividers; + int max_div; + u32 flags; +}; + +struct omap_clkctrl_bit_data { + u8 bit; + u8 type; + const char * const *parents; + const void *data; +}; + +struct omap_clkctrl_reg_data { + u16 offset; + const struct omap_clkctrl_bit_data *bit_data; + u16 flags; + const char *parent; + const char *clkdm_name; +}; + +struct omap_clkctrl_data { + u32 addr; + const struct omap_clkctrl_reg_data *regs; +}; + +struct omap_clkctrl_provider { + void *base; + struct list_head clocks; + char *clkdm_name; +}; + +struct omap_clkctrl_clk { + struct clk_hw *clk; + u16 reg_offset; + int bit_offset; + struct list_head node; +}; + +union omap4_timeout { + u32 cycles; + ktime_t start; +}; + +struct omap3_dpll5_settings { + unsigned int rate; + unsigned int m; + unsigned int n; +}; + +struct fapll_data { + struct clk_hw hw; + void *base; + const char *name; + struct clk *clk_ref; + struct clk *clk_bypass; + struct clk_onecell_data outputs; + bool bypass_bit_inverted; +}; + +struct fapll_synth { + struct clk_hw hw; + struct fapll_data *fd; + int index; + void *freq; + void *div; + const char *name; + struct clk *clk_pll; +}; + +enum { + OMAP3_SOC_AM35XX = 0, + OMAP3_SOC_OMAP3430_ES1 = 1, + OMAP3_SOC_OMAP3430_ES2_PLUS = 2, + OMAP3_SOC_OMAP3630 = 3, +}; + +struct dra7_atl_clock_info; + +struct dra7_atl_desc { + struct clk *clk; + struct clk_hw hw; + struct dra7_atl_clock_info *cinfo; + int id; + bool probed; + bool valid; + bool enabled; + u32 bws; + u32 aws; + u32 divider; +}; + +struct dra7_atl_clock_info { + struct device *dev; + void *iobase; + struct dra7_atl_desc *cdesc; +}; + +enum ti_adpll_clocks { + TI_ADPLL_DCO = 0, + TI_ADPLL_DCO_GATE = 1, + TI_ADPLL_N2 = 2, + TI_ADPLL_M2 = 3, + TI_ADPLL_M2_GATE = 4, + TI_ADPLL_BYPASS = 5, + TI_ADPLL_HIF = 6, + TI_ADPLL_DIV2 = 7, + TI_ADPLL_CLKOUT = 8, + TI_ADPLL_CLKOUT2 = 9, + TI_ADPLL_M3 = 10, +}; + +enum ti_adpll_inputs { + TI_ADPLL_CLKINP = 0, + TI_ADPLL_CLKINPULOW = 1, + TI_ADPLL_CLKINPHIF = 2, +}; + +enum ti_adpll_s_outputs { + TI_ADPLL_S_DCOCLKLDO = 0, + TI_ADPLL_S_CLKOUT = 1, + TI_ADPLL_S_CLKOUTX2 = 2, + TI_ADPLL_S_CLKOUTHIF = 3, +}; + +enum ti_adpll_lj_outputs { + TI_ADPLL_LJ_CLKDCOLDO = 0, + TI_ADPLL_LJ_CLKOUT = 1, + TI_ADPLL_LJ_CLKOUTLDO = 2, +}; + +struct ti_adpll_platform_data { + const bool is_type_s; + const int nr_max_inputs; + const int nr_max_outputs; + const int output_index; +}; + +struct ti_adpll_clock { + struct clk *clk; + struct clk_lookup *cl; + void (*unregister)(struct clk *); +}; + +struct ti_adpll_dco_data { + struct clk_hw hw; +}; + +struct ti_adpll_data; + +struct ti_adpll_clkout_data { + struct ti_adpll_data *adpll; + struct clk_gate gate; + struct clk_hw hw; +}; + +struct ti_adpll_data { + struct device *dev; + const struct ti_adpll_platform_data *c; + struct device_node *np; + long unsigned int pa; + void *iobase; + void *regs; + spinlock_t lock; + const char *parent_names[3]; + struct clk *parent_clocks[3]; + struct ti_adpll_clock *clocks; + struct clk_onecell_data outputs; + struct ti_adpll_dco_data dco; +}; + +struct icst_params { + long unsigned int ref; + long unsigned int vco_max; + long unsigned int vco_min; + short unsigned int vd_min; + short unsigned int vd_max; + unsigned char rd_min; + unsigned char rd_max; + const unsigned char *s2div; + const unsigned char *idx2s; +}; + +struct icst_vco { + short unsigned int v; + unsigned char r; + unsigned char s; +}; + +enum icst_control_type { + ICST_VERSATILE = 0, + ICST_INTEGRATOR_AP_CM = 1, + ICST_INTEGRATOR_AP_SYS = 2, + ICST_INTEGRATOR_AP_PCI = 3, + ICST_INTEGRATOR_CP_CM_CORE = 4, + ICST_INTEGRATOR_CP_CM_MEM = 5, + ICST_INTEGRATOR_IM_PD1 = 6, +}; + +struct clk_icst_desc { + const struct icst_params *params; + u32 vco_offset; + u32 lock_offset; +}; + +struct clk_icst { + struct clk_hw hw; + struct regmap *map; + u32 vcoreg_off; + u32 lockreg_off; + struct icst_params *params; + long unsigned int rate; + enum icst_control_type ctype; +}; + +struct clk_sp810; + +struct clk_sp810_timerclken { + struct clk_hw hw; + struct clk *clk; + struct clk_sp810 *sp810; + int channel; +}; + +struct clk_sp810 { + struct device_node *node; + void *base; + spinlock_t lock; + struct clk_sp810_timerclken timerclken[4]; +}; + +struct vexpress_osc { + struct regmap *reg; + struct clk_hw hw; + long unsigned int rate_min; + long unsigned int rate_max; +}; + +struct dma_chan_tbl_ent { + struct dma_chan *chan; +}; + +struct dmaengine_unmap_pool { + struct kmem_cache *cache; + const char *name; + mempool_t *pool; + size_t size; +}; + +struct dmaengine_desc_callback { + dma_async_tx_callback callback; + dma_async_tx_callback_result callback_result; + void *callback_param; +}; + +struct virt_dma_desc { + struct dma_async_tx_descriptor tx; + struct dmaengine_result tx_result; + struct list_head node; +}; + +struct virt_dma_chan { + struct dma_chan chan; + struct tasklet_struct task; + void (*desc_free)(struct virt_dma_desc *); + spinlock_t lock; + struct list_head desc_allocated; + struct list_head desc_submitted; + struct list_head desc_issued; + struct list_head desc_completed; + struct list_head desc_terminated; + struct virt_dma_desc *cyclic; +}; + +struct of_dma { + struct list_head of_dma_controllers; + struct device_node *of_node; + struct dma_chan * (*of_dma_xlate)(struct of_phandle_args *, struct of_dma *); + void * (*of_dma_route_allocate)(struct of_phandle_args *, struct of_dma *); + struct dma_router *dma_router; + void *of_dma_data; +}; + +struct of_dma_filter_info { + dma_cap_mask_t dma_cap; + dma_filter_fn filter_fn; +}; + +enum { + PL08X_AHB1 = 1, + PL08X_AHB2 = 2, +}; + +struct pl08x_channel_data { + const char *bus_id; + int min_signal; + int max_signal; + u32 muxval; + dma_addr_t addr; + bool single; + u8 periph_buses; + long: 32; +}; + +enum pl08x_burst_size { + PL08X_BURST_SZ_1 = 0, + PL08X_BURST_SZ_4 = 1, + PL08X_BURST_SZ_8 = 2, + PL08X_BURST_SZ_16 = 3, + PL08X_BURST_SZ_32 = 4, + PL08X_BURST_SZ_64 = 5, + PL08X_BURST_SZ_128 = 6, + PL08X_BURST_SZ_256 = 7, +}; + +enum pl08x_bus_width { + PL08X_BUS_WIDTH_8_BITS = 0, + PL08X_BUS_WIDTH_16_BITS = 1, + PL08X_BUS_WIDTH_32_BITS = 2, +}; + +struct pl08x_platform_data { + struct pl08x_channel_data *slave_channels; + unsigned int num_slave_channels; + enum pl08x_burst_size memcpy_burst_size; + enum pl08x_bus_width memcpy_bus_width; + bool memcpy_prot_buff; + bool memcpy_prot_cache; + int (*get_xfer_signal)(const struct pl08x_channel_data *); + void (*put_xfer_signal)(const struct pl08x_channel_data *, int); + u8 lli_buses; + u8 mem_buses; + const struct dma_slave_map *slave_map; + int slave_map_len; +}; + +struct vendor_data { + u8 config_offset; + u8 channels; + u8 signals; + bool dualmaster; + bool nomadik; + bool pl080s; + bool ftdmac020; + u32 max_transfer_size; +}; + +struct pl08x_bus_data { + dma_addr_t addr; + u8 maxwidth; + u8 buswidth; + long: 32; +}; + +struct pl08x_dma_chan; + +struct pl08x_phy_chan { + unsigned int id; + void *base; + void *reg_config; + void *reg_control; + void *reg_src; + void *reg_dst; + void *reg_lli; + void *reg_busy; + spinlock_t lock; + struct pl08x_dma_chan *serving; + bool locked; + bool ftdmac020; + bool pl080s; +}; + +enum pl08x_dma_chan_state { + PL08X_CHAN_IDLE = 0, + PL08X_CHAN_RUNNING = 1, + PL08X_CHAN_PAUSED = 2, + PL08X_CHAN_WAITING = 3, +}; + +struct pl08x_txd; + +struct pl08x_driver_data; + +struct pl08x_dma_chan { + struct virt_dma_chan vc; + struct pl08x_phy_chan *phychan; + const char *name; + struct pl08x_channel_data *cd; + struct dma_slave_config cfg; + struct pl08x_txd *at; + struct pl08x_driver_data *host; + enum pl08x_dma_chan_state state; + bool slave; + int signal; + unsigned int mux_use; + long unsigned int waiting_at; + long: 32; +}; + +struct pl08x_sg { + dma_addr_t src_addr; + dma_addr_t dst_addr; + size_t len; + struct list_head node; + long: 32; +}; + +struct pl08x_txd { + struct virt_dma_desc vd; + struct list_head dsg_list; + dma_addr_t llis_bus; + u32 *llis_va; + u32 cctl; + u32 ccfg; + bool done; + bool cyclic; +}; + +struct dma_pool; + +struct pl08x_driver_data { + struct dma_device slave; + struct dma_device memcpy; + bool has_slave; + void *base; + struct amba_device *adev; + const struct vendor_data *vd; + struct pl08x_platform_data *pd; + struct pl08x_phy_chan *phy_chans; + struct dma_pool *pool; + u8 lli_buses; + u8 mem_buses; + u8 lli_words; +}; + +struct pl08x_lli_build_data { + struct pl08x_txd *txd; + long: 32; + struct pl08x_bus_data srcbus; + struct pl08x_bus_data dstbus; + size_t remainder; + u32 lli_bus; +}; + +struct burst_table { + u32 burstwords; + u32 reg; +}; + +struct bcm2835_dmadev { + struct dma_device ddev; + void *base; + dma_addr_t zero_page; +}; + +struct bcm2835_dma_cb { + uint32_t info; + uint32_t src; + uint32_t dst; + uint32_t length; + uint32_t stride; + uint32_t next; + uint32_t pad[2]; +}; + +struct bcm2835_cb_entry { + struct bcm2835_dma_cb *cb; + long: 32; + dma_addr_t paddr; +}; + +struct bcm2835_desc; + +struct bcm2835_chan { + struct virt_dma_chan vc; + long: 32; + struct dma_slave_config cfg; + unsigned int dreq; + int ch; + struct bcm2835_desc *desc; + struct dma_pool *cb_pool; + void *chan_base; + int irq_number; + unsigned int irq_flags; + bool is_lite_channel; +}; + +struct bcm2835_desc { + struct bcm2835_chan *c; + long: 32; + struct virt_dma_desc vd; + enum dma_transfer_direction dir; + unsigned int frames; + size_t size; + bool cyclic; + struct bcm2835_cb_entry cb_list[0]; +}; + +struct sun4i_dma_vchan; + +struct sun4i_dma_pchan { + void *base; + struct sun4i_dma_vchan *vchan; + int is_dedicated; +}; + +struct sun4i_dma_promise; + +struct sun4i_dma_contract; + +struct sun4i_dma_vchan { + struct virt_dma_chan vc; + long: 32; + struct dma_slave_config cfg; + struct sun4i_dma_pchan *pchan; + struct sun4i_dma_promise *processing; + struct sun4i_dma_contract *contract; + u8 endpoint; + int is_dedicated; + long: 32; +}; + +struct sun4i_dma_promise { + u32 cfg; + u32 para; + dma_addr_t src; + dma_addr_t dst; + size_t len; + struct list_head list; + long: 32; +}; + +struct sun4i_dma_contract { + struct virt_dma_desc vd; + struct list_head demands; + struct list_head completed_demands; + bool is_cyclic: 1; + bool use_half_int: 1; + long: 32; +}; + +struct sun4i_dma_dev { + long unsigned int pchans_used[1]; + struct dma_device slave; + struct sun4i_dma_pchan *pchans; + struct sun4i_dma_vchan *vchans; + void *base; + struct clk *clk; + int irq; + spinlock_t lock; +}; + +enum sdma_peripheral_type { + IMX_DMATYPE_SSI = 0, + IMX_DMATYPE_SSI_SP = 1, + IMX_DMATYPE_MMC = 2, + IMX_DMATYPE_SDHC = 3, + IMX_DMATYPE_UART = 4, + IMX_DMATYPE_UART_SP = 5, + IMX_DMATYPE_FIRI = 6, + IMX_DMATYPE_CSPI = 7, + IMX_DMATYPE_CSPI_SP = 8, + IMX_DMATYPE_SIM = 9, + IMX_DMATYPE_ATA = 10, + IMX_DMATYPE_CCM = 11, + IMX_DMATYPE_EXT = 12, + IMX_DMATYPE_MSHC = 13, + IMX_DMATYPE_MSHC_SP = 14, + IMX_DMATYPE_DSP = 15, + IMX_DMATYPE_MEMORY = 16, + IMX_DMATYPE_FIFO_MEMORY = 17, + IMX_DMATYPE_SPDIF = 18, + IMX_DMATYPE_IPU_MEMORY = 19, + IMX_DMATYPE_ASRC = 20, + IMX_DMATYPE_ESAI = 21, + IMX_DMATYPE_SSI_DUAL = 22, + IMX_DMATYPE_ASRC_SP = 23, + IMX_DMATYPE_SAI = 24, + IMX_DMATYPE_MULTI_SAI = 25, +}; + +struct imx_dma_data { + int dma_request; + int dma_request2; + enum sdma_peripheral_type peripheral_type; + int priority; +}; + +enum imxdma_prep_type { + IMXDMA_DESC_MEMCPY = 0, + IMXDMA_DESC_INTERLEAVED = 1, + IMXDMA_DESC_SLAVE_SG = 2, + IMXDMA_DESC_CYCLIC = 3, +}; + +struct imx_dma_2d_config { + u16 xsr; + u16 ysr; + u16 wsr; + int count; +}; + +struct imxdma_desc { + struct list_head node; + struct dma_async_tx_descriptor desc; + enum dma_status status; + long: 32; + dma_addr_t src; + dma_addr_t dest; + size_t len; + enum dma_transfer_direction direction; + enum imxdma_prep_type type; + unsigned int config_port; + unsigned int config_mem; + unsigned int x; + unsigned int y; + unsigned int w; + struct scatterlist *sg; + unsigned int sgcount; +}; + +struct imxdma_engine; + +struct imxdma_channel { + int hw_chaining; + struct timer_list watchdog; + struct imxdma_engine *imxdma; + unsigned int channel; + struct tasklet_struct dma_tasklet; + struct list_head ld_free; + struct list_head ld_queue; + struct list_head ld_active; + int descs_allocated; + enum dma_slave_buswidth word_size; + dma_addr_t per_address; + u32 watermark_level; + struct dma_chan chan; + long: 32; + struct dma_async_tx_descriptor desc; + enum dma_status status; + int dma_request; + struct scatterlist *sg_list; + u32 ccr_from_device; + u32 ccr_to_device; + bool enabled_2d; + int slot_2d; + unsigned int irq; + struct dma_slave_config config; +}; + +enum imx_dma_type { + IMX1_DMA = 0, + IMX21_DMA = 1, + IMX27_DMA = 2, +}; + +struct imxdma_engine { + struct device *dev; + struct dma_device dma_device; + void *base; + struct clk *dma_ahb; + struct clk *dma_ipg; + spinlock_t lock; + struct imx_dma_2d_config slots_2d[2]; + struct imxdma_channel channel[16]; + enum imx_dma_type devtype; + unsigned int irq; + unsigned int irq_err; + long: 32; +}; + +struct imxdma_filter_data { + struct imxdma_engine *imxdma; + int request; +}; + +enum imx_dma_prio { + DMA_PRIO_HIGH = 0, + DMA_PRIO_MEDIUM = 1, + DMA_PRIO_LOW = 2, +}; + +struct sdma_peripheral_config { + int n_fifos_src; + int n_fifos_dst; + int stride_fifos_src; + int stride_fifos_dst; + int words_per_fifo; + bool sw_done; +}; + +struct sdma_script_start_addrs { + s32 ap_2_ap_addr; + s32 ap_2_bp_addr; + s32 ap_2_ap_fixed_addr; + s32 bp_2_ap_addr; + s32 loopback_on_dsp_side_addr; + s32 mcu_interrupt_only_addr; + s32 firi_2_per_addr; + s32 firi_2_mcu_addr; + s32 per_2_firi_addr; + s32 mcu_2_firi_addr; + s32 uart_2_per_addr; + s32 uart_2_mcu_addr; + s32 per_2_app_addr; + s32 mcu_2_app_addr; + s32 per_2_per_addr; + s32 uartsh_2_per_addr; + s32 uartsh_2_mcu_addr; + s32 per_2_shp_addr; + s32 mcu_2_shp_addr; + s32 ata_2_mcu_addr; + s32 mcu_2_ata_addr; + s32 app_2_per_addr; + s32 app_2_mcu_addr; + s32 shp_2_per_addr; + s32 shp_2_mcu_addr; + s32 mshc_2_mcu_addr; + s32 mcu_2_mshc_addr; + s32 spdif_2_mcu_addr; + s32 mcu_2_spdif_addr; + s32 asrc_2_mcu_addr; + s32 ext_mem_2_ipu_addr; + s32 descrambler_addr; + s32 dptc_dvfs_addr; + s32 utra_addr; + s32 ram_code_start_addr; + s32 mcu_2_ssish_addr; + s32 ssish_2_mcu_addr; + s32 hdmi_dma_addr; + s32 zcanfd_2_mcu_addr; + s32 zqspi_2_mcu_addr; + s32 mcu_2_ecspi_addr; + s32 mcu_2_sai_addr; + s32 sai_2_mcu_addr; + s32 uart_2_mcu_rom_addr; + s32 uartsh_2_mcu_rom_addr; + s32 mcu_2_zqspi_addr; +}; + +struct sdma_mode_count { + u32 count: 16; + u32 status: 8; + u32 command: 8; +}; + +struct sdma_buffer_descriptor { + struct sdma_mode_count mode; + u32 buffer_addr; + u32 ext_buffer_addr; +}; + +struct sdma_channel_control { + u32 current_bd_ptr; + u32 base_bd_ptr; + u32 unused[2]; +}; + +struct sdma_state_registers { + u32 pc: 14; + u32 unused1: 1; + u32 t: 1; + u32 rpc: 14; + u32 unused0: 1; + u32 sf: 1; + u32 spc: 14; + u32 unused2: 1; + u32 df: 1; + u32 epc: 14; + u32 lm: 2; +}; + +struct sdma_context_data { + struct sdma_state_registers channel_state; + u32 gReg[8]; + u32 mda; + u32 msa; + u32 ms; + u32 md; + u32 pda; + u32 psa; + u32 ps; + u32 pd; + u32 ca; + u32 cs; + u32 dda; + u32 dsa; + u32 ds; + u32 dd; + u32 scratch0; + u32 scratch1; + u32 scratch2; + u32 scratch3; + u32 scratch4; + u32 scratch5; + u32 scratch6; + u32 scratch7; +}; + +struct sdma_channel; + +struct sdma_desc { + struct virt_dma_desc vd; + unsigned int num_bd; + long: 32; + dma_addr_t bd_phys; + unsigned int buf_tail; + unsigned int buf_ptail; + unsigned int period_len; + unsigned int chn_real_count; + unsigned int chn_count; + struct sdma_channel *sdmac; + struct sdma_buffer_descriptor *bd; + long: 32; +}; + +struct sdma_engine; + +struct sdma_channel { + struct virt_dma_chan vc; + struct sdma_desc *desc; + struct sdma_engine *sdma; + unsigned int channel; + enum dma_transfer_direction direction; + long: 32; + struct dma_slave_config slave_config; + enum sdma_peripheral_type peripheral_type; + unsigned int event_id0; + unsigned int event_id1; + enum dma_slave_buswidth word_size; + unsigned int pc_from_device; + unsigned int pc_to_device; + unsigned int device_to_device; + unsigned int pc_to_pc; + long unsigned int flags; + long: 32; + dma_addr_t per_address; + dma_addr_t per_address2; + long unsigned int event_mask[2]; + long unsigned int watermark_level; + u32 shp_addr; + u32 per_addr; + enum dma_status status; + struct imx_dma_data data; + struct work_struct terminate_worker; + struct list_head terminated; + bool is_ram_script; + unsigned int n_fifos_src; + unsigned int n_fifos_dst; + unsigned int stride_fifos_src; + unsigned int stride_fifos_dst; + unsigned int words_per_fifo; + bool sw_done; + long: 32; +}; + +struct sdma_driver_data; + +struct sdma_engine { + struct device *dev; + long: 32; + struct sdma_channel channel[32]; + struct sdma_channel_control *channel_control; + void *regs; + struct sdma_context_data *context; + long: 32; + dma_addr_t context_phys; + struct dma_device dma_device; + struct clk *clk_ipg; + struct clk *clk_ahb; + spinlock_t channel_0_lock; + u32 script_number; + struct sdma_script_start_addrs *script_addrs; + const struct sdma_driver_data *drvdata; + u32 spba_start_addr; + u32 spba_end_addr; + unsigned int irq; + dma_addr_t bd0_phys; + struct sdma_buffer_descriptor *bd0; + bool clk_ratio; + bool fw_loaded; +}; + +struct sdma_firmware_header { + u32 magic; + u32 version_major; + u32 version_minor; + u32 script_addrs_start; + u32 num_script_addrs; + u32 ram_code_start; + u32 ram_code_size; +}; + +struct sdma_driver_data { + int chnenbl0; + int num_events; + struct sdma_script_start_addrs *script_addrs; + bool check_ratio; + bool ecspi_fixed; +}; + +struct mv_xor_channel_data { + dma_cap_mask_t cap_mask; +}; + +struct mv_xor_platform_data { + struct mv_xor_channel_data *channels; +}; + +struct mv_xor_chan; + +struct mv_xor_device { + void *xor_base; + void *xor_high_base; + struct clk *clk; + struct mv_xor_chan *channels[2]; + int xor_type; + u32 win_start[8]; + u32 win_end[8]; +}; + +struct mv_xor_chan { + int pending; + spinlock_t lock; + void *mmr_base; + void *mmr_high_base; + unsigned int idx; + int irq; + struct list_head chain; + struct list_head free_slots; + struct list_head allocated_slots; + struct list_head completed_slots; + dma_addr_t dma_desc_pool; + void *dma_desc_pool_virt; + size_t pool_size; + struct dma_device dmadev; + struct dma_chan dmachan; + int slots_allocated; + struct tasklet_struct irq_tasklet; + int op_in_desc; + char dummy_src[128]; + char dummy_dst[128]; + long: 32; + dma_addr_t dummy_src_addr; + dma_addr_t dummy_dst_addr; + u32 saved_config_reg; + u32 saved_int_mask_reg; + struct mv_xor_device *xordev; + long: 32; +}; + +struct mv_xor_desc_slot { + struct list_head node; + struct list_head sg_tx_list; + enum dma_transaction_type type; + void *hw_desc; + u16 idx; + long: 32; + struct dma_async_tx_descriptor async_tx; +}; + +struct mv_xor_desc { + u32 status; + u32 crc32_result; + u32 desc_command; + u32 phy_next_desc; + u32 byte_count; + u32 phy_dest_addr; + u32 phy_src_addr[8]; + u32 reserved0; + u32 reserved1; +}; + +enum mv_xor_type { + XOR_ORION = 0, + XOR_ARMADA_38X = 1, + XOR_ARMADA_37XX = 2, +}; + +enum mv_xor_mode { + XOR_MODE_IN_REG = 0, + XOR_MODE_IN_DESC = 1, +}; + +struct mxs_dma_ccw { + u32 next; + u16 bits; + u16 xfer_bytes; + u32 bufaddr; + u32 pio_words[16]; +}; + +struct mxs_dma_engine; + +struct mxs_dma_chan { + struct mxs_dma_engine *mxs_dma; + struct dma_chan chan; + long: 32; + struct dma_async_tx_descriptor desc; + struct tasklet_struct tasklet; + unsigned int chan_irq; + struct mxs_dma_ccw *ccw; + dma_addr_t ccw_phys; + int desc_count; + enum dma_status status; + unsigned int flags; + bool reset; +}; + +enum mxs_dma_id { + IMX23_DMA = 0, + IMX28_DMA = 1, +}; + +enum mxs_dma_devtype { + MXS_DMA_APBH = 0, + MXS_DMA_APBX = 1, +}; + +struct mxs_dma_engine { + enum mxs_dma_id dev_id; + enum mxs_dma_devtype type; + void *base; + struct clk *clk; + struct dma_device dma_device; + long: 32; + struct mxs_dma_chan mxs_chans[16]; + struct platform_device *pdev; + unsigned int nr_channels; +}; + +struct mxs_dma_type { + enum mxs_dma_id id; + enum mxs_dma_devtype type; +}; + +struct mxs_dma_filter_param { + unsigned int chan_id; +}; + +struct idmac { + struct dma_device dma; +}; + +struct ipu { + void *reg_ipu; + void *reg_ic; + unsigned int irq_fn; + unsigned int irq_err; + unsigned int irq_base; + long unsigned int channel_init_mask; + spinlock_t lock; + struct clk *ipu_clk; + struct device *dev; + struct idmac idmac; + struct idmac_channel channel[32]; + struct tasklet_struct tasklet; +}; + +struct ipu_irq_bank { + unsigned int control; + unsigned int status; + struct ipu *ipu; +}; + +struct ipu_irq_map { + unsigned int irq; + int source; + struct ipu_irq_bank *bank; + struct ipu *ipu; +}; + +enum ipu_color_space { + IPU_COLORSPACE_RGB = 0, + IPU_COLORSPACE_YCBCR = 1, + IPU_COLORSPACE_YUV = 2, +}; + +enum ipu_rotate_mode { + IPU_ROTATE_NONE = 0, + IPU_ROTATE_VERT_FLIP = 1, + IPU_ROTATE_HORIZ_FLIP = 2, + IPU_ROTATE_180 = 3, + IPU_ROTATE_90_RIGHT = 4, + IPU_ROTATE_90_RIGHT_VFLIP = 5, + IPU_ROTATE_90_RIGHT_HFLIP = 6, + IPU_ROTATE_90_LEFT = 7, +}; + +struct chan_param_mem_planar { + u32 xv: 10; + u32 yv: 10; + u32 xb: 12; + u32 yb: 12; + u32 res1: 2; + u32 nsb: 1; + u32 lnpb: 6; + u32 ubo_l: 11; + u32 ubo_h: 15; + u32 vbo_l: 17; + u32 vbo_h: 9; + u32 res2: 3; + u32 fw: 12; + u32 fh_l: 8; + u32 fh_h: 4; + u32 res3: 28; + u32 eba0; + u32 eba1; + u32 bpp: 3; + u32 sl: 14; + u32 pfs: 3; + u32 bam: 3; + u32 res4: 2; + u32 npb: 6; + u32 res5: 1; + u32 sat: 2; + u32 res6: 30; +}; + +struct chan_param_mem_interleaved { + u32 xv: 10; + u32 yv: 10; + u32 xb: 12; + u32 yb: 12; + u32 sce: 1; + u32 res1: 1; + u32 nsb: 1; + u32 lnpb: 6; + u32 sx: 10; + u32 sy_l: 1; + u32 sy_h: 9; + u32 ns: 10; + u32 sm: 10; + u32 sdx_l: 3; + u32 sdx_h: 2; + u32 sdy: 5; + u32 sdrx: 1; + u32 sdry: 1; + u32 sdr1: 1; + u32 res2: 2; + u32 fw: 12; + u32 fh_l: 8; + u32 fh_h: 4; + u32 res3: 28; + u32 eba0; + u32 eba1; + u32 bpp: 3; + u32 sl: 14; + u32 pfs: 3; + u32 bam: 3; + u32 res4: 2; + u32 npb: 6; + u32 res5: 1; + u32 sat: 2; + u32 scc: 1; + u32 ofs0: 5; + u32 ofs1: 5; + u32 ofs2: 5; + u32 ofs3: 5; + u32 wid0: 3; + u32 wid1: 3; + u32 wid2: 3; + u32 wid3: 3; + u32 dec_sel: 1; + u32 res6: 28; +}; + +union chan_param_mem { + struct chan_param_mem_planar pp; + struct chan_param_mem_interleaved ip; +}; + +enum pl330_cachectrl { + CCTRL0 = 0, + CCTRL1 = 1, + CCTRL2 = 2, + CCTRL3 = 3, + INVALID1 = 4, + INVALID2 = 5, + CCTRL6 = 6, + CCTRL7 = 7, +}; + +enum pl330_byteswap { + SWAP_NO = 0, + SWAP_2 = 1, + SWAP_4 = 2, + SWAP_8 = 3, + SWAP_16 = 4, +}; + +struct pl330_config { + u32 periph_id; + unsigned int mode; + unsigned int data_bus_width: 10; + unsigned int data_buf_dep: 11; + unsigned int num_chan: 4; + unsigned int num_peri: 6; + u32 peri_ns; + unsigned int num_events: 6; + u32 irq_ns; +}; + +struct pl330_reqcfg { + unsigned int dst_inc: 1; + unsigned int src_inc: 1; + bool nonsecure; + bool privileged; + bool insnaccess; + unsigned int brst_len: 5; + unsigned int brst_size: 3; + enum pl330_cachectrl dcctl; + enum pl330_cachectrl scctl; + enum pl330_byteswap swap; + struct pl330_config *pcfg; +}; + +struct pl330_xfer { + u32 src_addr; + u32 dst_addr; + u32 bytes; +}; + +enum pl330_op_err { + PL330_ERR_NONE = 0, + PL330_ERR_ABORT = 1, + PL330_ERR_FAIL = 2, +}; + +enum dmamov_dst { + SAR = 0, + CCR___2 = 1, + DAR = 2, +}; + +enum pl330_cond { + SINGLE = 0, + BURST = 1, + ALWAYS = 2, +}; + +struct dma_pl330_desc; + +struct _pl330_req { + u32 mc_bus; + void *mc_cpu; + struct dma_pl330_desc *desc; +}; + +enum desc_status { + FREE = 0, + PREP = 1, + BUSY = 2, + DONE___2 = 3, +}; + +struct dma_pl330_chan; + +struct dma_pl330_desc { + struct list_head node; + struct dma_async_tx_descriptor txd; + struct pl330_xfer px; + struct pl330_reqcfg rqcfg; + enum desc_status status; + int bytes_requested; + bool last; + struct dma_pl330_chan *pchan; + enum dma_transfer_direction rqtype; + unsigned int peri: 5; + struct list_head rqd; + long: 32; +}; + +struct _pl330_tbd { + bool reset_dmac; + bool reset_mngr; + u8 reset_chan; +}; + +struct pl330_dmac; + +struct pl330_thread { + u8 id; + int ev; + bool free; + struct pl330_dmac *dmac; + struct _pl330_req req[2]; + unsigned int lstenq; + int req_running; +}; + +enum pl330_dmac_state { + UNINIT = 0, + INIT = 1, + DYING = 2, +}; + +struct pl330_dmac { + struct dma_device ddma; + struct list_head desc_pool; + spinlock_t pool_lock; + unsigned int mcbufsz; + void *base; + struct pl330_config pcfg; + spinlock_t lock; + int events[32]; + long: 32; + dma_addr_t mcode_bus; + void *mcode_cpu; + struct pl330_thread *channels; + struct pl330_thread *manager; + struct tasklet_struct tasks; + struct _pl330_tbd dmac_tbd; + enum pl330_dmac_state state; + struct list_head req_done; + unsigned int num_peripherals; + struct dma_pl330_chan *peripherals; + int quirks; + struct reset_control *rstc; + struct reset_control *rstc_ocp; +}; + +struct dma_pl330_chan { + struct tasklet_struct task; + struct dma_chan chan; + struct list_head submitted_list; + struct list_head work_list; + struct list_head completed_list; + struct pl330_dmac *dmac; + spinlock_t lock; + struct pl330_thread *thread; + int burst_sz; + int burst_len; + long: 32; + phys_addr_t fifo_addr; + dma_addr_t fifo_dma; + enum dma_data_direction dir; + long: 32; + struct dma_slave_config slave_config; + bool cyclic; + bool active; + long: 32; +}; + +struct pl330_of_quirks { + char *quirk; + int id; +}; + +struct _xfer_spec { + u32 ccr; + struct dma_pl330_desc *desc; +}; + +struct _arg_LPEND { + enum pl330_cond cond; + bool forever; + unsigned int loop; + u8 bjump; +}; + +struct _arg_GO { + u8 chan; + u32 addr; + unsigned int ns; +}; + +enum stm32_dma_width { + STM32_DMA_BYTE = 0, + STM32_DMA_HALF_WORD = 1, + STM32_DMA_WORD = 2, +}; + +enum stm32_dma_burst_size { + STM32_DMA_BURST_SINGLE = 0, + STM32_DMA_BURST_INCR4 = 1, + STM32_DMA_BURST_INCR8 = 2, + STM32_DMA_BURST_INCR16 = 3, +}; + +struct stm32_dma_cfg { + u32 channel_id; + u32 request_line; + u32 stream_config; + u32 features; +}; + +struct stm32_dma_chan_reg { + u32 dma_lisr; + u32 dma_hisr; + u32 dma_lifcr; + u32 dma_hifcr; + u32 dma_scr; + u32 dma_sndtr; + u32 dma_spar; + u32 dma_sm0ar; + u32 dma_sm1ar; + u32 dma_sfcr; +}; + +struct stm32_dma_sg_req { + u32 len; + struct stm32_dma_chan_reg chan_reg; +}; + +struct stm32_dma_desc { + struct virt_dma_desc vdesc; + bool cyclic; + u32 num_sgs; + struct stm32_dma_sg_req sg_req[0]; +}; + +struct stm32_dma_mdma_config { + u32 stream_id; + u32 ifcr; + u32 tcf; +}; + +struct stm32_dma_chan { + struct virt_dma_chan vchan; + bool config_init; + bool busy; + u32 id; + u32 irq; + struct stm32_dma_desc *desc; + u32 next_sg; + struct dma_slave_config dma_sconfig; + struct stm32_dma_chan_reg chan_reg; + u32 threshold; + u32 mem_burst; + u32 mem_width; + enum dma_status status; + bool trig_mdma; + struct stm32_dma_mdma_config mdma_config; +}; + +struct stm32_dma_device { + struct dma_device ddev; + void *base; + struct clk *clk; + bool mem2mem; + struct stm32_dma_chan chan[8]; +}; + +struct stm32_dmamux { + u32 master; + u32 request; + u32 chan_id; +}; + +struct stm32_dmamux_data { + struct dma_router dmarouter; + struct clk *clk; + void *iomem; + u32 dma_requests; + u32 dmamux_requests; + spinlock_t lock; + long unsigned int dma_inuse[1]; + u32 ccr[32]; + u32 dma_reqs[0]; +}; + +enum stm32_mdma_trigger_mode { + STM32_MDMA_BUFFER = 0, + STM32_MDMA_BLOCK = 1, + STM32_MDMA_BLOCK_REP = 2, + STM32_MDMA_LINKED_LIST = 3, +}; + +enum stm32_mdma_inc_mode { + STM32_MDMA_FIXED = 0, + STM32_MDMA_INC = 2, + STM32_MDMA_DEC = 3, +}; + +struct stm32_mdma_chan_config { + u32 request; + u32 priority_level; + u32 transfer_config; + u32 mask_addr; + u32 mask_data; + bool m2m_hw; +}; + +struct stm32_mdma_hwdesc { + u32 ctcr; + u32 cbndtr; + u32 csar; + u32 cdar; + u32 cbrur; + u32 clar; + u32 ctbr; + u32 dummy; + u32 cmar; + u32 cmdr; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct stm32_mdma_desc_node { + struct stm32_mdma_hwdesc *hwdesc; + long: 32; + dma_addr_t hwdesc_phys; +}; + +struct stm32_mdma_desc { + struct virt_dma_desc vdesc; + u32 ccr; + bool cyclic; + u32 count; + long: 32; + struct stm32_mdma_desc_node node[0]; +}; + +struct stm32_mdma_dma_config { + u32 request; + u32 cmar; + u32 cmdr; +}; + +struct stm32_mdma_chan { + struct virt_dma_chan vchan; + struct dma_pool *desc_pool; + u32 id; + struct stm32_mdma_desc *desc; + u32 curr_hwdesc; + long: 32; + struct dma_slave_config dma_config; + struct stm32_mdma_chan_config chan_config; + bool busy; + u32 mem_burst; + u32 mem_width; + long: 32; +}; + +struct stm32_mdma_device { + struct dma_device ddev; + void *base; + struct clk *clk; + int irq; + u32 nr_channels; + u32 nr_requests; + u32 nr_ahb_addr_masks; + u32 chan_reserved; + struct stm32_mdma_chan chan[32]; + u32 ahb_addr_masks[0]; +}; + +struct trace_event_raw_tegra_dma_tx_status { + struct trace_entry ent; + u32 __data_loc_chan; + dma_cookie_t cookie; + __u32 residue; + char __data[0]; +}; + +struct trace_event_raw_tegra_dma_complete_cb { + struct trace_entry ent; + u32 __data_loc_chan; + int count; + void *ptr; + char __data[0]; +}; + +struct trace_event_raw_tegra_dma_isr { + struct trace_entry ent; + u32 __data_loc_chan; + int irq; + char __data[0]; +}; + +struct trace_event_data_offsets_tegra_dma_tx_status { + u32 chan; +}; + +struct trace_event_data_offsets_tegra_dma_complete_cb { + u32 chan; +}; + +struct trace_event_data_offsets_tegra_dma_isr { + u32 chan; +}; + +typedef void (*btf_trace_tegra_dma_tx_status)(void *, struct dma_chan *, dma_cookie_t, struct dma_tx_state *); + +typedef void (*btf_trace_tegra_dma_complete_cb)(void *, struct dma_chan *, int, void *); + +typedef void (*btf_trace_tegra_dma_isr)(void *, struct dma_chan *, int); + +struct tegra_dma_chip_data { + unsigned int nr_channels; + unsigned int channel_reg_size; + unsigned int max_dma_count; + bool support_channel_pause; + bool support_separate_wcount_reg; +}; + +struct tegra_dma_channel_regs { + u32 csr; + u32 ahb_ptr; + u32 apb_ptr; + u32 ahb_seq; + u32 apb_seq; + u32 wcount; +}; + +struct tegra_dma_desc; + +struct tegra_dma_sg_req { + struct tegra_dma_channel_regs ch_regs; + unsigned int req_len; + bool configured; + bool last_sg; + struct list_head node; + struct tegra_dma_desc *dma_desc; + unsigned int words_xferred; +}; + +struct tegra_dma_desc { + struct dma_async_tx_descriptor txd; + unsigned int bytes_requested; + unsigned int bytes_transferred; + enum dma_status dma_status; + struct list_head node; + struct list_head tx_list; + struct list_head cb_node; + unsigned int cb_count; +}; + +struct tegra_dma_channel; + +typedef void (*dma_isr_handler)(struct tegra_dma_channel *, bool); + +struct tegra_dma; + +struct tegra_dma_channel { + struct dma_chan dma_chan; + char name[12]; + bool config_init; + unsigned int id; + void *chan_addr; + spinlock_t lock; + bool busy; + struct tegra_dma *tdma; + bool cyclic; + struct list_head free_sg_req; + struct list_head pending_sg_req; + struct list_head free_dma_desc; + struct list_head cb_desc; + dma_isr_handler isr_handler; + struct tasklet_struct tasklet; + unsigned int slave_id; + struct dma_slave_config dma_sconfig; + struct tegra_dma_channel_regs channel_reg; + struct wait_queue_head wq; + long: 32; +}; + +struct tegra_dma { + struct dma_device dma_dev; + struct device *dev; + struct clk *dma_clk; + struct reset_control *rst; + spinlock_t global_lock; + void *base_addr; + const struct tegra_dma_chip_data *chip_data; + u32 global_pause_count; + struct tegra_dma_channel channels[0]; +}; + +enum dma_event_q { + EVENTQ_0 = 0, + EVENTQ_1 = 1, + EVENTQ_2 = 2, + EVENTQ_3 = 3, + EVENTQ_DEFAULT = 4294967295, +}; + +struct edma_rsv_info { + const s16 (*rsv_chans)[2]; + const s16 (*rsv_slots)[2]; +}; + +struct edma_soc_info { + enum dma_event_q default_queue; + struct edma_rsv_info *rsv; + s32 *memcpy_channels; + s8 (*queue_priority_mapping)[2]; + const s16 (*xbar_chans)[2]; + const struct dma_slave_map *slave_map; + int slavecnt; +}; + +struct edmacc_param { + u32 opt; + u32 src; + u32 a_b_cnt; + u32 dst; + u32 src_dst_bidx; + u32 link_bcntrld; + u32 src_dst_cidx; + u32 ccnt; +}; + +struct edma_pset { + u32 len; + long: 32; + dma_addr_t addr; + struct edmacc_param param; +}; + +struct edma_chan; + +struct edma_desc { + struct virt_dma_desc vdesc; + struct list_head node; + enum dma_transfer_direction direction; + int cyclic; + bool polled; + int absync; + int pset_nr; + struct edma_chan *echan; + int processed; + int processed_stat; + u32 sg_len; + u32 residue; + u32 residue_stat; + long: 32; + struct edma_pset pset[0]; +}; + +struct edma_cc; + +struct edma_tc; + +struct edma_chan { + struct virt_dma_chan vchan; + struct list_head node; + struct edma_desc *edesc; + struct edma_cc *ecc; + struct edma_tc *tc; + int ch_num; + bool alloced; + bool hw_triggered; + int slot[20]; + int missed; + long: 32; + struct dma_slave_config cfg; +}; + +struct edma_tc { + struct device_node *node; + u16 id; +}; + +struct edma_cc { + struct device *dev; + struct edma_soc_info *info; + void *base; + int id; + bool legacy_mode; + unsigned int num_channels; + unsigned int num_qchannels; + unsigned int num_region; + unsigned int num_slots; + unsigned int num_tc; + bool chmap_exist; + enum dma_event_q default_queue; + unsigned int ccint; + unsigned int ccerrint; + long unsigned int *slot_inuse; + long unsigned int *channels_mask; + struct dma_device dma_slave; + struct dma_device *dma_memcpy; + struct edma_chan *slave_chans; + struct edma_tc *tc_list; + int dummy_slot; +}; + +struct omap_dma_config { + int lch_end; + unsigned int rw_priority: 1; + unsigned int needs_busy_check: 1; + unsigned int may_lose_context: 1; + unsigned int needs_lch_clear: 1; +}; + +struct omap_dma_context { + u32 irqenable_l0; + u32 irqenable_l1; + u32 ocp_sysconfig; + u32 gcr; +}; + +struct omap_chan; + +struct omap_dmadev { + struct dma_device ddev; + spinlock_t lock; + void *base; + const struct omap_dma_reg *reg_map; + struct omap_system_dma_plat_info *plat; + const struct omap_dma_config *cfg; + struct notifier_block nb; + struct omap_dma_context context; + int lch_count; + long unsigned int lch_bitmap[1]; + struct mutex lch_lock; + bool legacy; + bool ll123_supported; + struct dma_pool *desc_pool; + unsigned int dma_requests; + spinlock_t irq_lock; + uint32_t irq_enable_mask; + struct omap_chan **lch_map; +}; + +struct omap_desc; + +struct omap_chan { + struct virt_dma_chan vc; + void *channel_base; + const struct omap_dma_reg *reg_map; + uint32_t ccr; + struct dma_slave_config cfg; + unsigned int dma_sig; + bool cyclic; + bool paused; + bool running; + int dma_ch; + struct omap_desc *desc; + unsigned int sgidx; + long: 32; +}; + +struct omap_type2_desc; + +struct omap_sg { + dma_addr_t addr; + uint32_t en; + uint32_t fn; + int32_t fi; + int16_t ei; + struct omap_type2_desc *t2_desc; + long: 32; + dma_addr_t t2_desc_paddr; +}; + +struct omap_desc { + struct virt_dma_desc vd; + bool using_ll; + enum dma_transfer_direction dir; + dma_addr_t dev_addr; + bool polled; + int32_t fi; + int16_t ei; + uint8_t es; + uint32_t ccr; + uint16_t clnk_ctrl; + uint16_t cicr; + uint32_t csdp; + unsigned int sglen; + long: 32; + struct omap_sg sg[0]; +}; + +struct omap_type2_desc { + uint32_t next_desc; + uint32_t en; + uint32_t addr; + uint16_t fn; + uint16_t cicr; + int16_t cdei; + int16_t csei; + int32_t cdfi; + int32_t csfi; +}; + +enum { + CAPS_0_SUPPORT_LL123 = 1048576, + CAPS_0_SUPPORT_LL4 = 2097152, + CCR_FS = 32, + CCR_READ_PRIORITY = 64, + CCR_ENABLE = 128, + CCR_AUTO_INIT = 256, + CCR_REPEAT = 512, + CCR_OMAP31_DISABLE = 1024, + CCR_SUSPEND_SENSITIVE = 256, + CCR_RD_ACTIVE = 512, + CCR_WR_ACTIVE = 1024, + CCR_SRC_AMODE_CONSTANT = 0, + CCR_SRC_AMODE_POSTINC = 4096, + CCR_SRC_AMODE_SGLIDX = 8192, + CCR_SRC_AMODE_DBLIDX = 12288, + CCR_DST_AMODE_CONSTANT = 0, + CCR_DST_AMODE_POSTINC = 16384, + CCR_DST_AMODE_SGLIDX = 32768, + CCR_DST_AMODE_DBLIDX = 49152, + CCR_CONSTANT_FILL = 65536, + CCR_TRANSPARENT_COPY = 131072, + CCR_BS = 262144, + CCR_SUPERVISOR = 4194304, + CCR_PREFETCH = 8388608, + CCR_TRIGGER_SRC = 16777216, + CCR_BUFFERING_DISABLE = 33554432, + CCR_WRITE_PRIORITY = 67108864, + CCR_SYNC_ELEMENT = 0, + CCR_SYNC_FRAME = 32, + CCR_SYNC_BLOCK = 262144, + CCR_SYNC_PACKET = 262176, + CSDP_DATA_TYPE_8 = 0, + CSDP_DATA_TYPE_16 = 1, + CSDP_DATA_TYPE_32 = 2, + CSDP_SRC_PORT_EMIFF = 0, + CSDP_SRC_PORT_EMIFS = 4, + CSDP_SRC_PORT_OCP_T1 = 8, + CSDP_SRC_PORT_TIPB = 12, + CSDP_SRC_PORT_OCP_T2 = 16, + CSDP_SRC_PORT_MPUI = 20, + CSDP_SRC_PACKED = 64, + CSDP_SRC_BURST_1 = 0, + CSDP_SRC_BURST_16 = 128, + CSDP_SRC_BURST_32 = 256, + CSDP_SRC_BURST_64 = 384, + CSDP_DST_PORT_EMIFF = 0, + CSDP_DST_PORT_EMIFS = 512, + CSDP_DST_PORT_OCP_T1 = 1024, + CSDP_DST_PORT_TIPB = 1536, + CSDP_DST_PORT_OCP_T2 = 2048, + CSDP_DST_PORT_MPUI = 2560, + CSDP_DST_PACKED = 8192, + CSDP_DST_BURST_1 = 0, + CSDP_DST_BURST_16 = 16384, + CSDP_DST_BURST_32 = 32768, + CSDP_DST_BURST_64 = 49152, + CSDP_WRITE_NON_POSTED = 0, + CSDP_WRITE_POSTED = 65536, + CSDP_WRITE_LAST_NON_POSTED = 131072, + CICR_TOUT_IE = 1, + CICR_DROP_IE = 2, + CICR_HALF_IE = 4, + CICR_FRAME_IE = 8, + CICR_LAST_IE = 16, + CICR_BLOCK_IE = 32, + CICR_PKT_IE = 128, + CICR_TRANS_ERR_IE = 256, + CICR_SUPERVISOR_ERR_IE = 1024, + CICR_MISALIGNED_ERR_IE = 2048, + CICR_DRAIN_IE = 4096, + CICR_SUPER_BLOCK_IE = 16384, + CLNK_CTRL_ENABLE_LNK = 32768, + CDP_DST_VALID_INC = 0, + CDP_DST_VALID_RELOAD = 1, + CDP_DST_VALID_REUSE = 2, + CDP_SRC_VALID_INC = 0, + CDP_SRC_VALID_RELOAD = 4, + CDP_SRC_VALID_REUSE = 8, + CDP_NTYPE_TYPE1 = 16, + CDP_NTYPE_TYPE2 = 32, + CDP_NTYPE_TYPE3 = 48, + CDP_TMODE_NORMAL = 0, + CDP_TMODE_LLIST = 256, + CDP_FAST = 1024, +}; + +struct ti_am335x_xbar_data { + void *iomem; + struct dma_router dmarouter; + u32 xbar_events; + u32 dma_requests; +}; + +struct ti_am335x_xbar_map { + u16 dma_line; + u8 mux_val; +}; + +struct ti_dra7_xbar_data { + void *iomem; + struct dma_router dmarouter; + struct mutex mutex; + long unsigned int *dma_inuse; + u16 safe_val; + u32 xbar_requests; + u32 dma_requests; + u32 dma_offset; +}; + +struct ti_dra7_xbar_map { + u16 xbar_in; + int xbar_out; +}; + +struct aspeed_uart_routing { + struct regmap *map; + const struct attribute_group *attr_grp; +}; + +struct aspeed_uart_routing_selector { + struct device_attribute dev_attr; + uint8_t reg; + uint8_t mask; + uint8_t shift; + const char * const options[0]; +}; + +struct bcm2835_pm { + struct device *dev; + void *base; + void *asb; + void *rpivid_asb; +}; + +struct bcm2835_power; + +struct bcm2835_power_domain { + struct generic_pm_domain base; + struct bcm2835_power *power; + u32 domain; + struct clk *clk; + long: 32; +}; + +struct bcm2835_power { + struct device *dev; + void *base; + void *asb; + void *rpivid_asb; + struct genpd_onecell_data pd_xlate; + long: 32; + struct bcm2835_power_domain domains[13]; + struct reset_controller_dev reset; + long: 32; +}; + +struct rpi_power_domain { + u32 domain; + bool enabled; + bool old_interface; + struct generic_pm_domain base; + struct rpi_firmware *fw; + long: 32; +}; + +struct rpi_power_domains { + bool has_new_interface; + struct genpd_onecell_data xlate; + struct rpi_firmware *fw; + long: 32; + struct rpi_power_domain domains[23]; +}; + +struct rpi_power_domain_packet { + u32 domain; + u32 on; +}; + +struct dove_pmu_domain_initdata { + u32 pwr_mask; + u32 rst_mask; + u32 iso_mask; + const char *name; +}; + +struct dove_pmu_initdata { + void *pmc_base; + void *pmu_base; + int irq; + int irq_domain_start; + const struct dove_pmu_domain_initdata *domains; +}; + +struct pmu_data { + spinlock_t lock; + struct device_node *of_node; + void *pmc_base; + void *pmu_base; + struct irq_chip_generic *irq_gc; + struct irq_domain *irq_domain; + struct reset_controller_dev reset; +}; + +struct pmu_domain { + struct pmu_data *pmu; + u32 pwr_mask; + u32 rst_mask; + u32 iso_mask; + struct generic_pm_domain base; +}; + +struct imx_pm_domain { + struct generic_pm_domain base; + struct regmap *regmap; + struct regulator *supply; + struct clk *clk[7]; + int num_clks; + unsigned int reg_offs; + signed char cntr_pdn_bit; + unsigned int ipg_rate_mhz; + long: 32; +}; + +struct imx_gpc_dt_data { + int num_domains; + bool err009619_present; + bool err006287_present; +}; + +enum { + MFP_PIN_INVALID = 4294967295, + MFP_PIN_GPIO0 = 0, + MFP_PIN_GPIO1 = 1, + MFP_PIN_GPIO2 = 2, + MFP_PIN_GPIO3 = 3, + MFP_PIN_GPIO4 = 4, + MFP_PIN_GPIO5 = 5, + MFP_PIN_GPIO6 = 6, + MFP_PIN_GPIO7 = 7, + MFP_PIN_GPIO8 = 8, + MFP_PIN_GPIO9 = 9, + MFP_PIN_GPIO10 = 10, + MFP_PIN_GPIO11 = 11, + MFP_PIN_GPIO12 = 12, + MFP_PIN_GPIO13 = 13, + MFP_PIN_GPIO14 = 14, + MFP_PIN_GPIO15 = 15, + MFP_PIN_GPIO16 = 16, + MFP_PIN_GPIO17 = 17, + MFP_PIN_GPIO18 = 18, + MFP_PIN_GPIO19 = 19, + MFP_PIN_GPIO20 = 20, + MFP_PIN_GPIO21 = 21, + MFP_PIN_GPIO22 = 22, + MFP_PIN_GPIO23 = 23, + MFP_PIN_GPIO24 = 24, + MFP_PIN_GPIO25 = 25, + MFP_PIN_GPIO26 = 26, + MFP_PIN_GPIO27 = 27, + MFP_PIN_GPIO28 = 28, + MFP_PIN_GPIO29 = 29, + MFP_PIN_GPIO30 = 30, + MFP_PIN_GPIO31 = 31, + MFP_PIN_GPIO32 = 32, + MFP_PIN_GPIO33 = 33, + MFP_PIN_GPIO34 = 34, + MFP_PIN_GPIO35 = 35, + MFP_PIN_GPIO36 = 36, + MFP_PIN_GPIO37 = 37, + MFP_PIN_GPIO38 = 38, + MFP_PIN_GPIO39 = 39, + MFP_PIN_GPIO40 = 40, + MFP_PIN_GPIO41 = 41, + MFP_PIN_GPIO42 = 42, + MFP_PIN_GPIO43 = 43, + MFP_PIN_GPIO44 = 44, + MFP_PIN_GPIO45 = 45, + MFP_PIN_GPIO46 = 46, + MFP_PIN_GPIO47 = 47, + MFP_PIN_GPIO48 = 48, + MFP_PIN_GPIO49 = 49, + MFP_PIN_GPIO50 = 50, + MFP_PIN_GPIO51 = 51, + MFP_PIN_GPIO52 = 52, + MFP_PIN_GPIO53 = 53, + MFP_PIN_GPIO54 = 54, + MFP_PIN_GPIO55 = 55, + MFP_PIN_GPIO56 = 56, + MFP_PIN_GPIO57 = 57, + MFP_PIN_GPIO58 = 58, + MFP_PIN_GPIO59 = 59, + MFP_PIN_GPIO60 = 60, + MFP_PIN_GPIO61 = 61, + MFP_PIN_GPIO62 = 62, + MFP_PIN_GPIO63 = 63, + MFP_PIN_GPIO64 = 64, + MFP_PIN_GPIO65 = 65, + MFP_PIN_GPIO66 = 66, + MFP_PIN_GPIO67 = 67, + MFP_PIN_GPIO68 = 68, + MFP_PIN_GPIO69 = 69, + MFP_PIN_GPIO70 = 70, + MFP_PIN_GPIO71 = 71, + MFP_PIN_GPIO72 = 72, + MFP_PIN_GPIO73 = 73, + MFP_PIN_GPIO74 = 74, + MFP_PIN_GPIO75 = 75, + MFP_PIN_GPIO76 = 76, + MFP_PIN_GPIO77 = 77, + MFP_PIN_GPIO78 = 78, + MFP_PIN_GPIO79 = 79, + MFP_PIN_GPIO80 = 80, + MFP_PIN_GPIO81 = 81, + MFP_PIN_GPIO82 = 82, + MFP_PIN_GPIO83 = 83, + MFP_PIN_GPIO84 = 84, + MFP_PIN_GPIO85 = 85, + MFP_PIN_GPIO86 = 86, + MFP_PIN_GPIO87 = 87, + MFP_PIN_GPIO88 = 88, + MFP_PIN_GPIO89 = 89, + MFP_PIN_GPIO90 = 90, + MFP_PIN_GPIO91 = 91, + MFP_PIN_GPIO92 = 92, + MFP_PIN_GPIO93 = 93, + MFP_PIN_GPIO94 = 94, + MFP_PIN_GPIO95 = 95, + MFP_PIN_GPIO96 = 96, + MFP_PIN_GPIO97 = 97, + MFP_PIN_GPIO98 = 98, + MFP_PIN_GPIO99 = 99, + MFP_PIN_GPIO100 = 100, + MFP_PIN_GPIO101 = 101, + MFP_PIN_GPIO102 = 102, + MFP_PIN_GPIO103 = 103, + MFP_PIN_GPIO104 = 104, + MFP_PIN_GPIO105 = 105, + MFP_PIN_GPIO106 = 106, + MFP_PIN_GPIO107 = 107, + MFP_PIN_GPIO108 = 108, + MFP_PIN_GPIO109 = 109, + MFP_PIN_GPIO110 = 110, + MFP_PIN_GPIO111 = 111, + MFP_PIN_GPIO112 = 112, + MFP_PIN_GPIO113 = 113, + MFP_PIN_GPIO114 = 114, + MFP_PIN_GPIO115 = 115, + MFP_PIN_GPIO116 = 116, + MFP_PIN_GPIO117 = 117, + MFP_PIN_GPIO118 = 118, + MFP_PIN_GPIO119 = 119, + MFP_PIN_GPIO120 = 120, + MFP_PIN_GPIO121 = 121, + MFP_PIN_GPIO122 = 122, + MFP_PIN_GPIO123 = 123, + MFP_PIN_GPIO124 = 124, + MFP_PIN_GPIO125 = 125, + MFP_PIN_GPIO126 = 126, + MFP_PIN_GPIO127 = 127, + MFP_PIN_GPIO128 = 128, + MFP_PIN_GPIO129 = 129, + MFP_PIN_GPIO130 = 130, + MFP_PIN_GPIO131 = 131, + MFP_PIN_GPIO132 = 132, + MFP_PIN_GPIO133 = 133, + MFP_PIN_GPIO134 = 134, + MFP_PIN_GPIO135 = 135, + MFP_PIN_GPIO136 = 136, + MFP_PIN_GPIO137 = 137, + MFP_PIN_GPIO138 = 138, + MFP_PIN_GPIO139 = 139, + MFP_PIN_GPIO140 = 140, + MFP_PIN_GPIO141 = 141, + MFP_PIN_GPIO142 = 142, + MFP_PIN_GPIO143 = 143, + MFP_PIN_GPIO144 = 144, + MFP_PIN_GPIO145 = 145, + MFP_PIN_GPIO146 = 146, + MFP_PIN_GPIO147 = 147, + MFP_PIN_GPIO148 = 148, + MFP_PIN_GPIO149 = 149, + MFP_PIN_GPIO150 = 150, + MFP_PIN_GPIO151 = 151, + MFP_PIN_GPIO152 = 152, + MFP_PIN_GPIO153 = 153, + MFP_PIN_GPIO154 = 154, + MFP_PIN_GPIO155 = 155, + MFP_PIN_GPIO156 = 156, + MFP_PIN_GPIO157 = 157, + MFP_PIN_GPIO158 = 158, + MFP_PIN_GPIO159 = 159, + MFP_PIN_GPIO160 = 160, + MFP_PIN_GPIO161 = 161, + MFP_PIN_GPIO162 = 162, + MFP_PIN_GPIO163 = 163, + MFP_PIN_GPIO164 = 164, + MFP_PIN_GPIO165 = 165, + MFP_PIN_GPIO166 = 166, + MFP_PIN_GPIO167 = 167, + MFP_PIN_GPIO168 = 168, + MFP_PIN_GPIO169 = 169, + MFP_PIN_GPIO170 = 170, + MFP_PIN_GPIO171 = 171, + MFP_PIN_GPIO172 = 172, + MFP_PIN_GPIO173 = 173, + MFP_PIN_GPIO174 = 174, + MFP_PIN_GPIO175 = 175, + MFP_PIN_GPIO176 = 176, + MFP_PIN_GPIO177 = 177, + MFP_PIN_GPIO178 = 178, + MFP_PIN_GPIO179 = 179, + MFP_PIN_GPIO180 = 180, + MFP_PIN_GPIO181 = 181, + MFP_PIN_GPIO182 = 182, + MFP_PIN_GPIO183 = 183, + MFP_PIN_GPIO184 = 184, + MFP_PIN_GPIO185 = 185, + MFP_PIN_GPIO186 = 186, + MFP_PIN_GPIO187 = 187, + MFP_PIN_GPIO188 = 188, + MFP_PIN_GPIO189 = 189, + MFP_PIN_GPIO190 = 190, + MFP_PIN_GPIO191 = 191, + MFP_PIN_GPIO255 = 255, + MFP_PIN_GPIO0_2 = 256, + MFP_PIN_GPIO1_2 = 257, + MFP_PIN_GPIO2_2 = 258, + MFP_PIN_GPIO3_2 = 259, + MFP_PIN_GPIO4_2 = 260, + MFP_PIN_GPIO5_2 = 261, + MFP_PIN_GPIO6_2 = 262, + MFP_PIN_GPIO7_2 = 263, + MFP_PIN_GPIO8_2 = 264, + MFP_PIN_GPIO9_2 = 265, + MFP_PIN_GPIO10_2 = 266, + MFP_PIN_GPIO11_2 = 267, + MFP_PIN_GPIO12_2 = 268, + MFP_PIN_GPIO13_2 = 269, + MFP_PIN_GPIO14_2 = 270, + MFP_PIN_GPIO15_2 = 271, + MFP_PIN_GPIO16_2 = 272, + MFP_PIN_GPIO17_2 = 273, + MFP_PIN_ULPI_STP = 274, + MFP_PIN_ULPI_NXT = 275, + MFP_PIN_ULPI_DIR = 276, + MFP_PIN_nXCVREN = 277, + MFP_PIN_DF_CLE_nOE = 278, + MFP_PIN_DF_nADV1_ALE = 279, + MFP_PIN_DF_SCLK_E = 280, + MFP_PIN_DF_SCLK_S = 281, + MFP_PIN_nBE0 = 282, + MFP_PIN_nBE1 = 283, + MFP_PIN_DF_nADV2_ALE = 284, + MFP_PIN_DF_INT_RnB = 285, + MFP_PIN_DF_nCS0 = 286, + MFP_PIN_DF_nCS1 = 287, + MFP_PIN_nLUA = 288, + MFP_PIN_nLLA = 289, + MFP_PIN_DF_nWE = 290, + MFP_PIN_DF_ALE_nWE = 291, + MFP_PIN_DF_nRE_nOE = 292, + MFP_PIN_DF_ADDR0 = 293, + MFP_PIN_DF_ADDR1 = 294, + MFP_PIN_DF_ADDR2 = 295, + MFP_PIN_DF_ADDR3 = 296, + MFP_PIN_DF_IO0 = 297, + MFP_PIN_DF_IO1 = 298, + MFP_PIN_DF_IO2 = 299, + MFP_PIN_DF_IO3 = 300, + MFP_PIN_DF_IO4 = 301, + MFP_PIN_DF_IO5 = 302, + MFP_PIN_DF_IO6 = 303, + MFP_PIN_DF_IO7 = 304, + MFP_PIN_DF_IO8 = 305, + MFP_PIN_DF_IO9 = 306, + MFP_PIN_DF_IO10 = 307, + MFP_PIN_DF_IO11 = 308, + MFP_PIN_DF_IO12 = 309, + MFP_PIN_DF_IO13 = 310, + MFP_PIN_DF_IO14 = 311, + MFP_PIN_DF_IO15 = 312, + MFP_PIN_DF_nCS0_SM_nCS2 = 313, + MFP_PIN_DF_nCS1_SM_nCS3 = 314, + MFP_PIN_SM_nCS0 = 315, + MFP_PIN_SM_nCS1 = 316, + MFP_PIN_DF_WEn = 317, + MFP_PIN_DF_REn = 318, + MFP_PIN_DF_CLE_SM_OEn = 319, + MFP_PIN_DF_ALE_SM_WEn = 320, + MFP_PIN_DF_RDY0 = 321, + MFP_PIN_DF_RDY1 = 322, + MFP_PIN_SM_SCLK = 323, + MFP_PIN_SM_BE0 = 324, + MFP_PIN_SM_BE1 = 325, + MFP_PIN_SM_ADV = 326, + MFP_PIN_SM_ADVMUX = 327, + MFP_PIN_SM_RDY = 328, + MFP_PIN_MMC1_DAT7 = 329, + MFP_PIN_MMC1_DAT6 = 330, + MFP_PIN_MMC1_DAT5 = 331, + MFP_PIN_MMC1_DAT4 = 332, + MFP_PIN_MMC1_DAT3 = 333, + MFP_PIN_MMC1_DAT2 = 334, + MFP_PIN_MMC1_DAT1 = 335, + MFP_PIN_MMC1_DAT0 = 336, + MFP_PIN_MMC1_CMD = 337, + MFP_PIN_MMC1_CLK = 338, + MFP_PIN_MMC1_CD = 339, + MFP_PIN_MMC1_WP = 340, + MFP_PIN_GSIM_UIO = 341, + MFP_PIN_GSIM_UCLK = 342, + MFP_PIN_GSIM_UDET = 343, + MFP_PIN_GSIM_nURST = 344, + MFP_PIN_PMIC_INT = 345, + MFP_PIN_RDY = 346, + MFP_PIN_TWSI1_SCL = 347, + MFP_PIN_TWSI1_SDA = 348, + MFP_PIN_TWSI4_SCL = 349, + MFP_PIN_TWSI4_SDA = 350, + MFP_PIN_CLK_REQ = 351, + MFP_PIN_MAX = 352, +}; + +struct mfp_addr_map { + unsigned int start; + unsigned int end; + long unsigned int offset; +}; + +struct mfp_pin { + long unsigned int config; + long unsigned int mfpr_off; + long unsigned int mfpr_run; + long unsigned int mfpr_lpm; +}; + +struct meson_msr; + +struct meson_msr_id { + struct meson_msr *priv; + unsigned int id; + const char *name; +}; + +struct meson_msr { + struct regmap *regmap; + struct meson_msr_id msr_table[128]; +}; + +struct meson_gx_pwrc_vpu { + struct generic_pm_domain genpd; + struct regmap *regmap_ao; + struct regmap *regmap_hhi; + struct reset_control *rstc; + struct clk *vpu_clk; + struct clk *vapb_clk; + long: 32; +}; + +struct meson_ee_pwrc_mem_domain { + unsigned int reg; + unsigned int mask; +}; + +struct meson_ee_pwrc_top_domain { + unsigned int sleep_reg; + unsigned int sleep_mask; + unsigned int iso_reg; + unsigned int iso_mask; +}; + +struct meson_ee_pwrc_domain; + +struct meson_ee_pwrc_domain_desc { + char *name; + unsigned int reset_names_count; + unsigned int clk_names_count; + struct meson_ee_pwrc_top_domain *top_pd; + unsigned int mem_pd_count; + struct meson_ee_pwrc_mem_domain *mem_pd; + bool (*is_powered_off)(struct meson_ee_pwrc_domain *); +}; + +struct meson_ee_pwrc; + +struct meson_ee_pwrc_domain { + struct generic_pm_domain base; + bool enabled; + struct meson_ee_pwrc *pwrc; + struct meson_ee_pwrc_domain_desc desc; + struct clk_bulk_data *clks; + int num_clks; + struct reset_control *rstc; + int num_rstc; + long: 32; +}; + +struct meson_ee_pwrc_domain_data { + unsigned int count; + struct meson_ee_pwrc_domain_desc *domains; +}; + +struct meson_ee_pwrc { + struct regmap *regmap_ao; + struct regmap *regmap_hhi; + struct meson_ee_pwrc_domain *domains; + struct genpd_onecell_data xlate; +}; + +struct rockchip_grf_value { + const char *desc; + u32 reg; + u32 val; +}; + +struct rockchip_grf_info { + const struct rockchip_grf_value *values; + int num_values; +}; + +struct rockchip_domain_info { + const char *name; + int pwr_mask; + int status_mask; + int req_mask; + int idle_mask; + int ack_mask; + bool active_wakeup; + int pwr_w_mask; + int req_w_mask; + int repair_status_mask; + u32 pwr_offset; + u32 req_offset; +}; + +struct rockchip_pmu_info { + u32 pwr_offset; + u32 status_offset; + u32 req_offset; + u32 idle_offset; + u32 ack_offset; + u32 repair_status_offset; + u32 core_pwrcnt_offset; + u32 gpu_pwrcnt_offset; + unsigned int core_power_transition_time; + unsigned int gpu_power_transition_time; + int num_domains; + const struct rockchip_domain_info *domain_info; +}; + +struct rockchip_pmu; + +struct rockchip_pm_domain { + struct generic_pm_domain genpd; + const struct rockchip_domain_info *info; + struct rockchip_pmu *pmu; + int num_qos; + struct regmap **qos_regmap; + u32 *qos_save_regs[5]; + int num_clks; + struct clk_bulk_data *clks; + long: 32; +}; + +struct rockchip_pmu { + struct device *dev; + struct regmap *regmap; + const struct rockchip_pmu_info *info; + struct mutex mutex; + struct genpd_onecell_data genpd_data; + struct generic_pm_domain *domains[0]; +}; + +struct asv_limit_entry { + unsigned int hpm; + unsigned int ids; +}; + +struct exynos_asv_table { + unsigned int num_rows; + unsigned int num_cols; + u32 *buf; +}; + +struct exynos_asv; + +struct exynos_asv_subsys { + struct exynos_asv *asv; + const char *cpu_dt_compat; + int id; + struct exynos_asv_table table; + unsigned int base_volt; + unsigned int offset_volt_h; + unsigned int offset_volt_l; +}; + +struct exynos_asv { + struct device *dev; + struct regmap *chipid_regmap; + struct exynos_asv_subsys subsys[2]; + int (*opp_get_voltage)(const struct exynos_asv_subsys *, int, unsigned int); + unsigned int group; + unsigned int table; + bool use_sg; + int of_bin; +}; + +enum { + EXYNOS_ASV_SUBSYS_ID_ARM = 0, + EXYNOS_ASV_SUBSYS_ID_KFC = 1, + EXYNOS_ASV_SUBSYS_ID_MAX = 2, +}; + +struct exynos_chipid_variant { + unsigned int rev_reg; + unsigned int main_rev_shift; + unsigned int sub_rev_shift; +}; + +struct exynos_chipid_info { + u32 product_id; + u32 revision; +}; + +struct exynos_soc_id { + const char *name; + unsigned int id; +}; + +struct exynos_pmu_conf { + unsigned int offset; + u8 val[3]; +}; + +struct exynos_pmu_data { + const struct exynos_pmu_conf *pmu_config; + void (*pmu_init)(); + void (*powerdown_conf)(enum sys_powerdown); + void (*powerdown_conf_extra)(enum sys_powerdown); +}; + +struct exynos_pmu_context { + struct device *dev; + const struct exynos_pmu_data *pmu_data; +}; + +struct exynos_pm_domain_config { + u32 local_pwr_cfg; +}; + +struct exynos_pm_domain { + void *base; + long: 32; + struct generic_pm_domain pd; + u32 local_pwr_cfg; + long: 32; +}; + +struct regulator_coupler { + struct list_head list; + int (*attach_regulator)(struct regulator_coupler *, struct regulator_dev *); + int (*detach_regulator)(struct regulator_coupler *, struct regulator_dev *); + int (*balance_voltage)(struct regulator_coupler *, struct regulator_dev *, suspend_state_t); +}; + +struct regulator_consumer_supply { + const char *dev_name; + const char *supply; +}; + +struct sunxi_sram_func { + char *func; + u8 val; + u32 reg_val; +}; + +struct sunxi_sram_data { + char *name; + u8 reg; + u8 offset; + u8 width; + struct sunxi_sram_func *func; + struct list_head list; +}; + +struct sunxi_sram_desc { + struct sunxi_sram_data data; + bool claimed; +}; + +struct sunxi_sramc_variant { + int num_emac_clocks; + bool has_ldo_ctrl; +}; + +struct nvmem_cell_info { + const char *name; + unsigned int offset; + unsigned int bytes; + unsigned int bit_offset; + unsigned int nbits; + struct device_node *np; +}; + +struct nvmem_cell_lookup { + const char *nvmem_name; + const char *cell_name; + const char *dev_id; + const char *con_id; + struct list_head node; +}; + +typedef int (*nvmem_reg_read_t)(void *, unsigned int, void *, size_t); + +typedef int (*nvmem_reg_write_t)(void *, unsigned int, void *, size_t); + +typedef int (*nvmem_cell_post_process_t)(void *, const char *, unsigned int, void *, size_t); + +enum nvmem_type { + NVMEM_TYPE_UNKNOWN = 0, + NVMEM_TYPE_EEPROM = 1, + NVMEM_TYPE_OTP = 2, + NVMEM_TYPE_BATTERY_BACKED = 3, + NVMEM_TYPE_FRAM = 4, +}; + +struct nvmem_keepout { + unsigned int start; + unsigned int end; + unsigned char value; +}; + +struct nvmem_config { + struct device *dev; + const char *name; + int id; + struct module *owner; + const struct nvmem_cell_info *cells; + int ncells; + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + enum nvmem_type type; + bool read_only; + bool root_only; + bool ignore_wp; + struct device_node *of_node; + bool no_of_node; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + nvmem_cell_post_process_t cell_post_process; + int size; + int word_size; + int stride; + void *priv; + bool compat; + struct device *base_dev; +}; + +struct tegra_fuse; + +struct tegra_fuse_info { + u32 (*read)(struct tegra_fuse *, unsigned int); + unsigned int size; + unsigned int spare; +}; + +struct nvmem_device; + +struct tegra_fuse_soc; + +struct tegra_fuse { + struct device *dev; + void *base; + phys_addr_t phys; + struct clk *clk; + struct reset_control *rst; + u32 (*read_early)(struct tegra_fuse *, unsigned int); + u32 (*read)(struct tegra_fuse *, unsigned int); + const struct tegra_fuse_soc *soc; + long: 32; + struct { + struct mutex lock; + struct completion wait; + struct dma_chan *chan; + struct dma_slave_config config; + dma_addr_t phys; + u32 *virt; + long: 32; + } apbdma; + struct nvmem_device *nvmem; + struct nvmem_cell_lookup *lookups; +}; + +struct tegra_fuse_soc { + void (*init)(struct tegra_fuse *); + void (*speedo_init)(struct tegra_sku_info *); + int (*probe)(struct tegra_fuse *); + const struct tegra_fuse_info *info; + const struct nvmem_cell_lookup *lookups; + unsigned int num_lookups; + const struct nvmem_cell_info *cells; + unsigned int num_cells; + const struct nvmem_keepout *keepouts; + unsigned int num_keepouts; + const struct attribute_group *soc_attr_group; + bool clk_suspend_on; +}; + +enum { + THRESHOLD_INDEX_0 = 0, + THRESHOLD_INDEX_1 = 1, + THRESHOLD_INDEX_COUNT = 2, +}; + +typedef int (*config_regulators_t)(struct device *, struct dev_pm_opp *, struct dev_pm_opp *, struct regulator **, unsigned int); + +typedef int (*config_clks_t)(struct device *, struct opp_table *, struct dev_pm_opp *, void *, bool); + +struct dev_pm_opp_config { + const char * const *clk_names; + config_clks_t config_clks; + const char *prop_name; + config_regulators_t config_regulators; + const unsigned int *supported_hw; + unsigned int supported_hw_count; + const char * const *regulator_names; + const char * const *genpd_names; + struct device ***virt_devs; +}; + +enum tegra_io_pad { + TEGRA_IO_PAD_AUDIO = 0, + TEGRA_IO_PAD_AUDIO_HV = 1, + TEGRA_IO_PAD_BB = 2, + TEGRA_IO_PAD_CAM = 3, + TEGRA_IO_PAD_COMP = 4, + TEGRA_IO_PAD_CONN = 5, + TEGRA_IO_PAD_CSIA = 6, + TEGRA_IO_PAD_CSIB = 7, + TEGRA_IO_PAD_CSIC = 8, + TEGRA_IO_PAD_CSID = 9, + TEGRA_IO_PAD_CSIE = 10, + TEGRA_IO_PAD_CSIF = 11, + TEGRA_IO_PAD_CSIG = 12, + TEGRA_IO_PAD_CSIH = 13, + TEGRA_IO_PAD_DAP3 = 14, + TEGRA_IO_PAD_DAP5 = 15, + TEGRA_IO_PAD_DBG = 16, + TEGRA_IO_PAD_DEBUG_NONAO = 17, + TEGRA_IO_PAD_DMIC = 18, + TEGRA_IO_PAD_DMIC_HV = 19, + TEGRA_IO_PAD_DP = 20, + TEGRA_IO_PAD_DSI = 21, + TEGRA_IO_PAD_DSIB = 22, + TEGRA_IO_PAD_DSIC = 23, + TEGRA_IO_PAD_DSID = 24, + TEGRA_IO_PAD_EDP = 25, + TEGRA_IO_PAD_EMMC = 26, + TEGRA_IO_PAD_EMMC2 = 27, + TEGRA_IO_PAD_EQOS = 28, + TEGRA_IO_PAD_GPIO = 29, + TEGRA_IO_PAD_GP_PWM2 = 30, + TEGRA_IO_PAD_GP_PWM3 = 31, + TEGRA_IO_PAD_HDMI = 32, + TEGRA_IO_PAD_HDMI_DP0 = 33, + TEGRA_IO_PAD_HDMI_DP1 = 34, + TEGRA_IO_PAD_HDMI_DP2 = 35, + TEGRA_IO_PAD_HDMI_DP3 = 36, + TEGRA_IO_PAD_HSIC = 37, + TEGRA_IO_PAD_HV = 38, + TEGRA_IO_PAD_LVDS = 39, + TEGRA_IO_PAD_MIPI_BIAS = 40, + TEGRA_IO_PAD_NAND = 41, + TEGRA_IO_PAD_PEX_BIAS = 42, + TEGRA_IO_PAD_PEX_CLK_BIAS = 43, + TEGRA_IO_PAD_PEX_CLK1 = 44, + TEGRA_IO_PAD_PEX_CLK2 = 45, + TEGRA_IO_PAD_PEX_CLK3 = 46, + TEGRA_IO_PAD_PEX_CLK_2_BIAS = 47, + TEGRA_IO_PAD_PEX_CLK_2 = 48, + TEGRA_IO_PAD_PEX_CNTRL = 49, + TEGRA_IO_PAD_PEX_CTL2 = 50, + TEGRA_IO_PAD_PEX_L0_RST = 51, + TEGRA_IO_PAD_PEX_L1_RST = 52, + TEGRA_IO_PAD_PEX_L5_RST = 53, + TEGRA_IO_PAD_PWR_CTL = 54, + TEGRA_IO_PAD_SDMMC1 = 55, + TEGRA_IO_PAD_SDMMC1_HV = 56, + TEGRA_IO_PAD_SDMMC2 = 57, + TEGRA_IO_PAD_SDMMC2_HV = 58, + TEGRA_IO_PAD_SDMMC3 = 59, + TEGRA_IO_PAD_SDMMC3_HV = 60, + TEGRA_IO_PAD_SDMMC4 = 61, + TEGRA_IO_PAD_SOC_GPIO10 = 62, + TEGRA_IO_PAD_SOC_GPIO12 = 63, + TEGRA_IO_PAD_SOC_GPIO13 = 64, + TEGRA_IO_PAD_SOC_GPIO53 = 65, + TEGRA_IO_PAD_SPI = 66, + TEGRA_IO_PAD_SPI_HV = 67, + TEGRA_IO_PAD_SYS_DDC = 68, + TEGRA_IO_PAD_UART = 69, + TEGRA_IO_PAD_UART4 = 70, + TEGRA_IO_PAD_UART5 = 71, + TEGRA_IO_PAD_UFS = 72, + TEGRA_IO_PAD_USB0 = 73, + TEGRA_IO_PAD_USB1 = 74, + TEGRA_IO_PAD_USB2 = 75, + TEGRA_IO_PAD_USB3 = 76, + TEGRA_IO_PAD_USB_BIAS = 77, + TEGRA_IO_PAD_AO_HV = 78, +}; + +struct pmc_clk { + struct clk_hw hw; + long unsigned int offs; + u32 mux_shift; + u32 force_en_shift; +}; + +struct pmc_clk_gate { + struct clk_hw hw; + long unsigned int offs; + u32 shift; +}; + +struct pmc_clk_init_data { + char *name; + const char * const *parents; + int num_parents; + int clk_id; + u8 mux_shift; + u8 force_en_shift; +}; + +struct tegra_pmc; + +struct tegra_powergate { + struct generic_pm_domain genpd; + struct tegra_pmc *pmc; + unsigned int id; + struct clk **clks; + unsigned int num_clks; + long unsigned int *clk_rates; + struct reset_control *reset; +}; + +struct tegra_pmc_soc; + +struct tegra_pmc { + struct device *dev; + void *base; + void *wake; + void *aotag; + void *scratch; + struct clk *clk; + struct dentry *debugfs; + const struct tegra_pmc_soc *soc; + bool tz_only; + long unsigned int rate; + enum tegra_suspend_mode suspend_mode; + u32 cpu_good_time; + u32 cpu_off_time; + u32 core_osc_time; + u32 core_pmu_time; + u32 core_off_time; + bool corereq_high; + bool sysclkreq_high; + bool combined_req; + bool cpu_pwr_good_en; + u32 lp0_vec_phys; + u32 lp0_vec_size; + long unsigned int powergates_available[1]; + struct mutex powergates_lock; + struct pinctrl_dev *pctl_dev; + struct irq_domain *domain; + struct irq_chip irq; + struct notifier_block clk_nb; + bool core_domain_state_synced; + bool core_domain_registered; + long unsigned int *wake_type_level_map; + long unsigned int *wake_type_dual_edge_map; + long unsigned int *wake_sw_status_map; + long unsigned int *wake_cntrl_level_map; + struct syscore_ops syscore; +}; + +struct tegra_io_pad_soc { + enum tegra_io_pad id; + unsigned int dpd; + unsigned int request; + unsigned int status; + unsigned int voltage; + const char *name; +}; + +struct tegra_pmc_regs { + unsigned int scratch0; + unsigned int rst_status; + unsigned int rst_source_shift; + unsigned int rst_source_mask; + unsigned int rst_level_shift; + unsigned int rst_level_mask; +}; + +struct tegra_wake_event { + const char *name; + unsigned int id; + unsigned int irq; + struct { + unsigned int instance; + unsigned int pin; + } gpio; +}; + +struct tegra_pmc_soc { + unsigned int num_powergates; + const char * const *powergates; + unsigned int num_cpu_powergates; + const u8 *cpu_powergates; + bool has_tsense_reset; + bool has_gpu_clamps; + bool needs_mbist_war; + bool has_impl_33v_pwr; + bool maybe_tz_only; + const struct tegra_io_pad_soc *io_pads; + unsigned int num_io_pads; + const struct pinctrl_pin_desc *pin_descs; + unsigned int num_pin_descs; + const struct tegra_pmc_regs *regs; + void (*init)(struct tegra_pmc *); + void (*setup_irq_polarity)(struct tegra_pmc *, struct device_node *, bool); + int (*irq_set_wake)(struct irq_data *, unsigned int); + int (*irq_set_type)(struct irq_data *, unsigned int); + int (*powergate_set)(struct tegra_pmc *, unsigned int, bool); + const char * const *reset_sources; + unsigned int num_reset_sources; + const char * const *reset_levels; + unsigned int num_reset_levels; + const struct tegra_wake_event *wake_events; + unsigned int num_wake_events; + unsigned int max_wake_events; + unsigned int max_wake_vectors; + const struct pmc_clk_init_data *pmc_clks_data; + unsigned int num_pmc_clks; + bool has_blink_output; + bool has_usb_sleepwalk; + bool supports_core_domain; +}; + +struct gpd_timing_data { + s64 suspend_latency_ns; + s64 resume_latency_ns; + s64 effective_constraint_ns; + ktime_t next_wakeup; + bool constraint_changed; + bool cached_suspend_ok; + long: 32; +}; + +struct generic_pm_domain_data { + struct pm_domain_data base; + struct gpd_timing_data *td; + struct notifier_block nb; + struct notifier_block *power_nb; + int cpu; + unsigned int performance_state; + unsigned int default_pstate; + unsigned int rpm_pstate; + void *data; +}; + +enum omap_prm_domain_mode { + OMAP_PRMD_OFF = 0, + OMAP_PRMD_RETENTION = 1, + OMAP_PRMD_ON_INACTIVE = 2, + OMAP_PRMD_ON_ACTIVE = 3, +}; + +struct omap_prm_domain_map { + unsigned int usable_modes; + long unsigned int statechange: 1; + long unsigned int logicretstate: 1; +}; + +struct omap_prm; + +struct omap_prm_domain { + struct device *dev; + struct omap_prm *prm; + struct generic_pm_domain pd; + u16 pwrstctrl; + u16 pwrstst; + const struct omap_prm_domain_map *cap; + u32 pwrstctrl_saved; + unsigned int uses_pm_clk: 1; +}; + +struct omap_prm_data; + +struct omap_prm { + const struct omap_prm_data *data; + void *base; + struct omap_prm_domain *prmd; +}; + +struct omap_rst_map { + s8 rst; + s8 st; +}; + +struct omap_prm_data { + u32 base; + const char *name; + const char *clkdm_name; + u16 pwrstctrl; + u16 pwrstst; + const struct omap_prm_domain_map *dmap; + u16 rstctrl; + u16 rstst; + const struct omap_rst_map *rstmap; + u8 flags; +}; + +struct omap_reset_data { + struct reset_controller_dev rcdev; + struct omap_prm *prm; + u32 mask; + spinlock_t lock; + struct clockdomain *clkdm; + struct device *dev; +}; + +struct virtio_driver { + struct device_driver driver; + const struct virtio_device_id *id_table; + const unsigned int *feature_table; + unsigned int feature_table_size; + const unsigned int *feature_table_legacy; + unsigned int feature_table_size_legacy; + int (*validate)(struct virtio_device *); + int (*probe)(struct virtio_device *); + void (*scan)(struct virtio_device *); + void (*remove)(struct virtio_device *); + void (*config_changed)(struct virtio_device *); + int (*freeze)(struct virtio_device *); + int (*restore)(struct virtio_device *); +}; + +typedef __u16 __virtio16; + +typedef __u32 __virtio32; + +typedef __u64 __virtio64; + +struct vring_desc { + __virtio64 addr; + __virtio32 len; + __virtio16 flags; + __virtio16 next; +}; + +struct vring_avail { + __virtio16 flags; + __virtio16 idx; + __virtio16 ring[0]; +}; + +struct vring_used_elem { + __virtio32 id; + __virtio32 len; +}; + +typedef struct vring_used_elem vring_used_elem_t; + +struct vring_used { + __virtio16 flags; + __virtio16 idx; + vring_used_elem_t ring[0]; +}; + +typedef struct vring_desc vring_desc_t; + +typedef struct vring_avail vring_avail_t; + +typedef struct vring_used vring_used_t; + +struct vring { + unsigned int num; + vring_desc_t *desc; + vring_avail_t *avail; + vring_used_t *used; +}; + +struct vring_packed_desc_event { + __le16 off_wrap; + __le16 flags; +}; + +struct vring_packed_desc { + __le64 addr; + __le32 len; + __le16 id; + __le16 flags; +}; + +struct vring_desc_state_split { + void *data; + struct vring_desc *indir_desc; +}; + +struct vring_desc_state_packed { + void *data; + struct vring_packed_desc *indir_desc; + u16 num; + u16 last; +}; + +struct vring_desc_extra { + dma_addr_t addr; + u32 len; + u16 flags; + u16 next; +}; + +struct vring_virtqueue_split { + struct vring vring; + u16 avail_flags_shadow; + u16 avail_idx_shadow; + struct vring_desc_state_split *desc_state; + struct vring_desc_extra *desc_extra; + long: 32; + dma_addr_t queue_dma_addr; + size_t queue_size_in_bytes; + u32 vring_align; + bool may_reduce_num; + long: 32; +}; + +struct vring_virtqueue_packed { + struct { + unsigned int num; + struct vring_packed_desc *desc; + struct vring_packed_desc_event *driver; + struct vring_packed_desc_event *device; + } vring; + bool avail_wrap_counter; + u16 avail_used_flags; + u16 next_avail_idx; + u16 event_flags_shadow; + struct vring_desc_state_packed *desc_state; + struct vring_desc_extra *desc_extra; + dma_addr_t ring_dma_addr; + dma_addr_t driver_event_dma_addr; + dma_addr_t device_event_dma_addr; + size_t ring_size_in_bytes; + size_t event_size_in_bytes; +}; + +struct vring_virtqueue { + struct virtqueue vq; + bool packed_ring; + bool use_dma_api; + bool weak_barriers; + bool broken; + bool indirect; + bool event; + unsigned int free_head; + unsigned int num_added; + u16 last_used_idx; + bool event_triggered; + long: 32; + union { + struct vring_virtqueue_split split; + struct vring_virtqueue_packed packed; + }; + bool (*notify)(struct virtqueue *); + bool we_own_ring; +}; + +typedef struct { + union { + xen_pfn_t *p; + uint64_t q; + }; +} __guest_handle_xen_pfn_t; + +struct grant_entry_v1 { + uint16_t flags; + domid_t domid; + uint32_t frame; +}; + +struct grant_entry_header { + uint16_t flags; + domid_t domid; +}; + +union grant_entry_v2 { + struct grant_entry_header hdr; + struct { + struct grant_entry_header hdr; + uint32_t pad0; + uint64_t frame; + } full_page; + struct { + struct grant_entry_header hdr; + uint16_t page_off; + uint16_t length; + uint64_t frame; + } sub_page; + struct { + struct grant_entry_header hdr; + domid_t trans_domid; + uint16_t pad0; + grant_ref_t gref; + } transitive; + uint32_t __spacer[4]; +}; + +struct gnttab_setup_table { + domid_t dom; + uint32_t nr_frames; + int16_t status; + long: 32; + __guest_handle_xen_pfn_t frame_list; +}; + +struct gnttab_copy_ptr { + union { + grant_ref_t ref; + xen_pfn_t gmfn; + } u; + domid_t domid; + uint16_t offset; + long: 32; +}; + +struct gnttab_copy { + struct gnttab_copy_ptr source; + struct gnttab_copy_ptr dest; + uint16_t len; + uint16_t flags; + int16_t status; +}; + +struct gnttab_query_size { + domid_t dom; + uint32_t nr_frames; + uint32_t max_nr_frames; + int16_t status; +}; + +struct gnttab_set_version { + uint32_t version; +}; + +struct gnttab_get_status_frames { + uint32_t nr_frames; + domid_t dom; + int16_t status; + __guest_handle_uint64_t frame_list; +}; + +struct gnttab_free_callback { + struct gnttab_free_callback *next; + void (*fn)(void *); + void *arg; + u16 count; +}; + +struct gntab_unmap_queue_data; + +typedef void (*gnttab_unmap_refs_done)(int, struct gntab_unmap_queue_data *); + +struct gntab_unmap_queue_data { + struct delayed_work gnttab_work; + void *data; + gnttab_unmap_refs_done done; + struct gnttab_unmap_grant_ref *unmap_ops; + struct gnttab_unmap_grant_ref *kunmap_ops; + struct page **pages; + unsigned int count; + unsigned int age; +}; + +struct gnttab_page_cache { + spinlock_t lock; + struct list_head pages; + unsigned int num_pages; +}; + +struct xen_page_foreign { + domid_t domid; + grant_ref_t gref; +}; + +typedef void (*xen_grant_fn_t)(long unsigned int, unsigned int, unsigned int, void *); + +struct gnttab_ops { + unsigned int version; + unsigned int grefs_per_grant_frame; + int (*map_frames)(xen_pfn_t *, unsigned int); + void (*unmap_frames)(); + void (*update_entry)(grant_ref_t, domid_t, long unsigned int, unsigned int); + int (*end_foreign_access_ref)(grant_ref_t); + long unsigned int (*read_frame)(grant_ref_t); +}; + +struct unmap_refs_callback_data { + struct completion completion; + int result; +}; + +struct deferred_entry { + struct list_head list; + grant_ref_t ref; + uint16_t warn_delay; + struct page *page; +}; + +struct xen_feature_info { + unsigned int submap_idx; + uint32_t submap; +}; + +struct balloon_stats { + long unsigned int current_pages; + long unsigned int target_pages; + long unsigned int target_unpopulated; + long unsigned int balloon_low; + long unsigned int balloon_high; + long unsigned int total_pages; + long unsigned int schedule_delay; + long unsigned int max_schedule_delay; + long unsigned int retry_count; + long unsigned int max_retry_count; +}; + +enum bp_state { + BP_DONE = 0, + BP_WAIT = 1, + BP_EAGAIN = 2, + BP_ECANCELED = 3, +}; + +enum shutdown_state { + SHUTDOWN_INVALID = 4294967295, + SHUTDOWN_POWEROFF = 0, + SHUTDOWN_SUSPEND = 2, + SHUTDOWN_HALT = 4, +}; + +struct suspend_info { + int cancelled; +}; + +struct shutdown_handler { + const char command[11]; + bool flag; + void (*cb)(); +}; + +struct vcpu_runstate_info { + int state; + long: 32; + uint64_t state_entry_time; + uint64_t time[4]; +}; + +typedef struct { + union { + struct vcpu_runstate_info *p; + uint64_t q; + }; +} __guest_handle_vcpu_runstate_info; + +struct vcpu_register_runstate_memory_area { + union { + __guest_handle_vcpu_runstate_info h; + struct vcpu_runstate_info *v; + uint64_t p; + } addr; +}; + +struct xen_memory_reservation { + __guest_handle_xen_pfn_t extent_start; + xen_ulong_t nr_extents; + unsigned int extent_order; + unsigned int address_bits; + domid_t domid; + long: 32; +}; + +typedef struct { + union { + evtchn_port_t *p; + uint64_t q; + }; +} __guest_handle_evtchn_port_t; + +struct evtchn_bind_interdomain { + domid_t remote_dom; + evtchn_port_t remote_port; + evtchn_port_t local_port; +}; + +struct evtchn_bind_virq { + uint32_t virq; + uint32_t vcpu; + evtchn_port_t port; +}; + +struct evtchn_bind_pirq { + uint32_t pirq; + uint32_t flags; + evtchn_port_t port; +}; + +struct evtchn_bind_ipi { + uint32_t vcpu; + evtchn_port_t port; +}; + +struct evtchn_close { + evtchn_port_t port; +}; + +struct evtchn_send { + evtchn_port_t port; +}; + +struct evtchn_status { + domid_t dom; + evtchn_port_t port; + uint32_t status; + uint32_t vcpu; + union { + struct { + domid_t dom; + } unbound; + struct { + domid_t dom; + evtchn_port_t port; + } interdomain; + uint32_t pirq; + uint32_t virq; + } u; +}; + +struct evtchn_bind_vcpu { + evtchn_port_t port; + uint32_t vcpu; +}; + +struct evtchn_set_priority { + evtchn_port_t port; + uint32_t priority; +}; + +struct sched_poll { + __guest_handle_evtchn_port_t ports; + unsigned int nr_ports; + long: 32; + uint64_t timeout; +}; + +enum ipi_vector { + XEN_PLACEHOLDER_VECTOR = 0, + XEN_NR_IPIS = 1, +}; + +struct physdev_eoi { + uint32_t irq; +}; + +struct physdev_irq_status_query { + uint32_t irq; + uint32_t flags; +}; + +struct physdev_irq { + uint32_t irq; + uint32_t vector; +}; + +struct physdev_map_pirq { + domid_t domid; + int type; + int index; + int pirq; + int bus; + int devfn; + int entry_nr; + long: 32; + uint64_t table_base; +}; + +struct physdev_unmap_pirq { + domid_t domid; + int pirq; +}; + +struct physdev_get_free_pirq { + int type; + uint32_t pirq; +}; + +struct evtchn_loop_ctrl; + +struct evtchn_ops { + unsigned int (*max_channels)(); + unsigned int (*nr_channels)(); + int (*setup)(evtchn_port_t); + void (*remove)(evtchn_port_t, unsigned int); + void (*bind_to_cpu)(evtchn_port_t, unsigned int, unsigned int); + void (*clear_pending)(evtchn_port_t); + void (*set_pending)(evtchn_port_t); + bool (*is_pending)(evtchn_port_t); + void (*mask)(evtchn_port_t); + void (*unmask)(evtchn_port_t); + void (*handle_events)(unsigned int, struct evtchn_loop_ctrl *); + void (*resume)(); + int (*percpu_init)(unsigned int); + int (*percpu_deinit)(unsigned int); +}; + +struct evtchn_loop_ctrl { + ktime_t timeout; + unsigned int count; + bool defer_eoi; +}; + +enum xen_irq_type { + IRQT_UNBOUND = 0, + IRQT_PIRQ = 1, + IRQT_VIRQ = 2, + IRQT_IPI = 3, + IRQT_EVTCHN = 4, +}; + +struct irq_info { + struct list_head list; + struct list_head eoi_list; + short int refcnt; + u8 spurious_cnt; + u8 is_accounted; + short int type; + u8 mask_reason; + u8 is_active; + unsigned int irq; + evtchn_port_t evtchn; + short unsigned int cpu; + short unsigned int eoi_cpu; + unsigned int irq_epoch; + u64 eoi_time; + raw_spinlock_t lock; + union { + short unsigned int virq; + enum ipi_vector ipi; + struct { + short unsigned int pirq; + short unsigned int gsi; + unsigned char vector; + unsigned char flags; + uint16_t domid; + } pirq; + struct xenbus_device *interdomain; + } u; + long: 32; +}; + +struct lateeoi_work { + struct delayed_work delayed; + spinlock_t eoi_list_lock; + struct list_head eoi_list; +}; + +struct evtchn_unmask { + evtchn_port_t port; +}; + +struct evtchn_init_control { + uint64_t control_gfn; + uint32_t offset; + uint32_t vcpu; + uint8_t link_bits; + uint8_t _pad[7]; +}; + +struct evtchn_expand_array { + uint64_t array_gfn; +}; + +typedef uint32_t event_word_t; + +struct evtchn_fifo_control_block { + uint32_t ready; + uint32_t _rsvd; + event_word_t head[16]; +}; + +struct evtchn_fifo_queue { + uint32_t head[16]; +}; + +struct evtchn_alloc_unbound { + domid_t dom; + domid_t remote_dom; + evtchn_port_t port; +}; + +struct xenbus_map_node { + struct list_head next; + union { + struct { + struct vm_struct *area; + } pv; + struct { + struct page *pages[16]; + long unsigned int addrs[16]; + void *addr; + } hvm; + }; + grant_handle_t handles[16]; + unsigned int nr_handles; +}; + +struct map_ring_valloc { + struct xenbus_map_node *node; + long unsigned int addrs[16]; + long: 32; + phys_addr_t phys_addrs[16]; + struct gnttab_map_grant_ref map[16]; + struct gnttab_unmap_grant_ref unmap[16]; + unsigned int idx; + long: 32; +}; + +struct xenbus_ring_ops { + int (*map)(struct xenbus_device *, struct map_ring_valloc *, grant_ref_t *, unsigned int, void **); + int (*unmap)(struct xenbus_device *, void *); +}; + +struct unmap_ring_hvm { + unsigned int idx; + long unsigned int addrs[16]; +}; + +enum xsd_sockmsg_type { + XS_CONTROL = 0, + XS_DIRECTORY = 1, + XS_READ = 2, + XS_GET_PERMS = 3, + XS_WATCH = 4, + XS_UNWATCH = 5, + XS_TRANSACTION_START = 6, + XS_TRANSACTION_END = 7, + XS_INTRODUCE = 8, + XS_RELEASE = 9, + XS_GET_DOMAIN_PATH = 10, + XS_WRITE = 11, + XS_MKDIR = 12, + XS_RM = 13, + XS_SET_PERMS = 14, + XS_WATCH_EVENT = 15, + XS_ERROR = 16, + XS_IS_DOMAIN_INTRODUCED = 17, + XS_RESUME = 18, + XS_SET_TARGET = 19, + XS_RESET_WATCHES = 21, + XS_DIRECTORY_PART = 22, + XS_TYPE_COUNT = 23, + XS_INVALID = 65535, +}; + +struct xsd_sockmsg { + uint32_t type; + uint32_t req_id; + uint32_t tx_id; + uint32_t len; +}; + +typedef uint32_t XENSTORE_RING_IDX; + +struct xenstore_domain_interface { + char req[1024]; + char rsp[1024]; + XENSTORE_RING_IDX req_cons; + XENSTORE_RING_IDX req_prod; + XENSTORE_RING_IDX rsp_cons; + XENSTORE_RING_IDX rsp_prod; + uint32_t server_features; + uint32_t connection; + uint32_t error; +}; + +struct xs_watch_event { + struct list_head list; + unsigned int len; + struct xenbus_watch *handle; + const char *path; + const char *token; + char body[0]; +}; + +enum xb_req_state { + xb_req_state_queued = 0, + xb_req_state_wait_reply = 1, + xb_req_state_got_reply = 2, + xb_req_state_aborted = 3, +}; + +struct xb_req_data { + struct list_head list; + wait_queue_head_t wq; + struct xsd_sockmsg msg; + uint32_t caller_req_id; + enum xsd_sockmsg_type type; + char *body; + const struct kvec *vec; + int num_vecs; + int err; + enum xb_req_state state; + bool user_req; + void (*cb)(struct xb_req_data *); + void *par; +}; + +enum xenstore_init { + XS_UNKNOWN = 0, + XS_PV = 1, + XS_HVM = 2, + XS_LOCAL = 3, +}; + +struct xen_hvm_param { + domid_t domid; + uint32_t index; + uint64_t value; +}; + +struct xen_bus_type { + char *root; + unsigned int levels; + int (*get_bus_id)(char *, const char *); + int (*probe)(struct xen_bus_type *, const char *, const char *); + bool (*otherend_will_handle)(struct xenbus_watch *, const char *, const char *); + void (*otherend_changed)(struct xenbus_watch *, const char *, const char *); + struct bus_type bus; +}; + +struct xb_find_info { + struct xenbus_device *dev; + const char *nodename; +}; + +struct xenbus_transaction_holder { + struct list_head list; + struct xenbus_transaction handle; + unsigned int generation_id; +}; + +struct read_buffer { + struct list_head list; + unsigned int cons; + unsigned int len; + char msg[0]; +}; + +struct xenbus_file_priv { + struct mutex msgbuffer_mutex; + struct list_head transactions; + struct list_head watches; + unsigned int len; + union { + struct xsd_sockmsg msg; + char buffer[4096]; + } u; + struct mutex reply_mutex; + struct list_head read_buffers; + wait_queue_head_t read_waitq; + struct kref kref; + struct work_struct wq; +}; + +struct watch_adapter { + struct list_head list; + struct xenbus_watch watch; + struct xenbus_file_priv *dev_data; + char *token; +}; + +struct physdev_manage_pci { + uint8_t bus; + uint8_t devfn; +}; + +struct physdev_manage_pci_ext { + uint8_t bus; + uint8_t devfn; + unsigned int is_extfn; + unsigned int is_virtfn; + struct { + uint8_t bus; + uint8_t devfn; + } physfn; +}; + +struct physdev_pci_device_add { + uint16_t seg; + uint8_t bus; + uint8_t devfn; + uint32_t flags; + struct { + uint8_t bus; + uint8_t devfn; + } physfn; + uint32_t optarr[0]; +}; + +struct physdev_pci_device { + uint16_t seg; + uint8_t bus; + uint8_t devfn; +}; + +struct xen_device_domain_owner { + domid_t domain; + struct pci_dev *dev; + struct list_head list; +}; + +struct usb_device_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 bcdUSB; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bMaxPacketSize0; + __le16 idVendor; + __le16 idProduct; + __le16 bcdDevice; + __u8 iManufacturer; + __u8 iProduct; + __u8 iSerialNumber; + __u8 bNumConfigurations; +}; + +struct usb_config_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wTotalLength; + __u8 bNumInterfaces; + __u8 bConfigurationValue; + __u8 iConfiguration; + __u8 bmAttributes; + __u8 bMaxPower; +} __attribute__((packed)); + +struct usb_interface_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bInterfaceNumber; + __u8 bAlternateSetting; + __u8 bNumEndpoints; + __u8 bInterfaceClass; + __u8 bInterfaceSubClass; + __u8 bInterfaceProtocol; + __u8 iInterface; +}; + +struct usb_endpoint_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bEndpointAddress; + __u8 bmAttributes; + __le16 wMaxPacketSize; + __u8 bInterval; + __u8 bRefresh; + __u8 bSynchAddress; +} __attribute__((packed)); + +struct usb_ssp_isoc_ep_comp_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wReseved; + __le32 dwBytesPerInterval; +}; + +struct usb_ss_ep_comp_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bMaxBurst; + __u8 bmAttributes; + __le16 wBytesPerInterval; +}; + +struct usb_interface_assoc_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bFirstInterface; + __u8 bInterfaceCount; + __u8 bFunctionClass; + __u8 bFunctionSubClass; + __u8 bFunctionProtocol; + __u8 iFunction; +}; + +struct usb_bos_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wTotalLength; + __u8 bNumDeviceCaps; +} __attribute__((packed)); + +struct usb_ext_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __le32 bmAttributes; +} __attribute__((packed)); + +struct usb_ss_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __u8 bmAttributes; + __le16 wSpeedSupported; + __u8 bFunctionalitySupport; + __u8 bU1devExitLat; + __le16 bU2DevExitLat; +}; + +struct usb_ss_container_id_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __u8 bReserved; + __u8 ContainerID[16]; +}; + +struct usb_ssp_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __u8 bReserved; + __le32 bmAttributes; + __le16 wFunctionalitySupport; + __le16 wReserved; + __le32 bmSublinkSpeedAttr[1]; +}; + +struct usb_ptm_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; +}; + +enum usb_device_speed { + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW = 1, + USB_SPEED_FULL = 2, + USB_SPEED_HIGH = 3, + USB_SPEED_WIRELESS = 4, + USB_SPEED_SUPER = 5, + USB_SPEED_SUPER_PLUS = 6, +}; + +enum usb_device_state { + USB_STATE_NOTATTACHED = 0, + USB_STATE_ATTACHED = 1, + USB_STATE_POWERED = 2, + USB_STATE_RECONNECTING = 3, + USB_STATE_UNAUTHENTICATED = 4, + USB_STATE_DEFAULT = 5, + USB_STATE_ADDRESS = 6, + USB_STATE_CONFIGURED = 7, + USB_STATE_SUSPENDED = 8, +}; + +enum usb3_link_state { + USB3_LPM_U0 = 0, + USB3_LPM_U1 = 1, + USB3_LPM_U2 = 2, + USB3_LPM_U3 = 3, +}; + +enum usb_ssp_rate { + USB_SSP_GEN_UNKNOWN = 0, + USB_SSP_GEN_2x1 = 1, + USB_SSP_GEN_1x2 = 2, + USB_SSP_GEN_2x2 = 3, +}; + +struct ep_device; + +struct usb_host_endpoint { + struct usb_endpoint_descriptor desc; + struct usb_ss_ep_comp_descriptor ss_ep_comp; + struct usb_ssp_isoc_ep_comp_descriptor ssp_isoc_ep_comp; + long: 0; + struct list_head urb_list; + void *hcpriv; + struct ep_device *ep_dev; + unsigned char *extra; + int extralen; + int enabled; + int streams; +} __attribute__((packed)); + +struct usb_host_interface { + struct usb_interface_descriptor desc; + int extralen; + unsigned char *extra; + struct usb_host_endpoint *endpoint; + char *string; +}; + +enum usb_interface_condition { + USB_INTERFACE_UNBOUND = 0, + USB_INTERFACE_BINDING = 1, + USB_INTERFACE_BOUND = 2, + USB_INTERFACE_UNBINDING = 3, +}; + +struct usb_interface { + struct usb_host_interface *altsetting; + struct usb_host_interface *cur_altsetting; + unsigned int num_altsetting; + struct usb_interface_assoc_descriptor *intf_assoc; + int minor; + enum usb_interface_condition condition; + unsigned int sysfs_files_created: 1; + unsigned int ep_devs_created: 1; + unsigned int unregistering: 1; + unsigned int needs_remote_wakeup: 1; + unsigned int needs_altsetting0: 1; + unsigned int needs_binding: 1; + unsigned int resetting_device: 1; + unsigned int authorized: 1; + long: 32; + struct device dev; + struct device *usb_dev; + struct work_struct reset_ws; + long: 32; +}; + +struct usb_interface_cache { + unsigned int num_altsetting; + struct kref ref; + struct usb_host_interface altsetting[0]; +}; + +struct usb_host_config { + struct usb_config_descriptor desc; + char *string; + struct usb_interface_assoc_descriptor *intf_assoc[16]; + struct usb_interface *interface[32]; + struct usb_interface_cache *intf_cache[32]; + unsigned char *extra; + int extralen; +}; + +struct usb_host_bos { + struct usb_bos_descriptor *desc; + struct usb_ext_cap_descriptor *ext_cap; + struct usb_ss_cap_descriptor *ss_cap; + struct usb_ssp_cap_descriptor *ssp_cap; + struct usb_ss_container_id_descriptor *ss_id; + struct usb_ptm_cap_descriptor *ptm_cap; +}; + +struct usb_devmap { + long unsigned int devicemap[4]; +}; + +struct mon_bus; + +struct usb_device; + +struct usb_bus { + struct device *controller; + struct device *sysdev; + int busnum; + const char *bus_name; + u8 uses_pio_for_control; + u8 otg_port; + unsigned int is_b_host: 1; + unsigned int b_hnp_enable: 1; + unsigned int no_stop_on_short: 1; + unsigned int no_sg_constraint: 1; + unsigned int sg_tablesize; + int devnum_next; + struct mutex devnum_next_mutex; + struct usb_devmap devmap; + struct usb_device *root_hub; + struct usb_bus *hs_companion; + int bandwidth_allocated; + int bandwidth_int_reqs; + int bandwidth_isoc_reqs; + unsigned int resuming_ports; + struct mon_bus *mon_bus; + int monitored; +}; + +struct wusb_dev; + +struct usb2_lpm_parameters { + unsigned int besl; + int timeout; +}; + +struct usb3_lpm_parameters { + unsigned int mel; + unsigned int pel; + unsigned int sel; + int timeout; +}; + +struct usb_tt; + +struct usb_device { + int devnum; + char devpath[16]; + u32 route; + enum usb_device_state state; + enum usb_device_speed speed; + unsigned int rx_lanes; + unsigned int tx_lanes; + enum usb_ssp_rate ssp_rate; + struct usb_tt *tt; + int ttport; + unsigned int toggle[2]; + struct usb_device *parent; + struct usb_bus *bus; + struct usb_host_endpoint ep0; + long: 32; + struct device dev; + struct usb_device_descriptor descriptor; + struct usb_host_bos *bos; + struct usb_host_config *config; + struct usb_host_config *actconfig; + struct usb_host_endpoint *ep_in[16]; + struct usb_host_endpoint *ep_out[16]; + char **rawdescriptors; + short unsigned int bus_mA; + u8 portnum; + u8 level; + u8 devaddr; + unsigned int can_submit: 1; + unsigned int persist_enabled: 1; + unsigned int reset_in_progress: 1; + unsigned int have_langid: 1; + unsigned int authorized: 1; + unsigned int authenticated: 1; + unsigned int wusb: 1; + unsigned int lpm_capable: 1; + unsigned int lpm_devinit_allow: 1; + unsigned int usb2_hw_lpm_capable: 1; + unsigned int usb2_hw_lpm_besl_capable: 1; + unsigned int usb2_hw_lpm_enabled: 1; + unsigned int usb2_hw_lpm_allowed: 1; + unsigned int usb3_lpm_u1_enabled: 1; + unsigned int usb3_lpm_u2_enabled: 1; + int string_langid; + char *product; + char *manufacturer; + char *serial; + struct list_head filelist; + int maxchild; + u32 quirks; + atomic_t urbnum; + long unsigned int active_duration; + long unsigned int connect_time; + unsigned int do_remote_wakeup: 1; + unsigned int reset_resume: 1; + unsigned int port_is_suspended: 1; + struct wusb_dev *wusb_dev; + int slot_id; + struct usb2_lpm_parameters l1_params; + struct usb3_lpm_parameters u1_params; + struct usb3_lpm_parameters u2_params; + unsigned int lpm_disable_count; + u16 hub_delay; + unsigned int use_generic_driver: 1; + long: 32; +}; + +struct usb_tt { + struct usb_device *hub; + int multi; + unsigned int think_time; + void *hcpriv; + spinlock_t lock; + struct list_head clear_list; + struct work_struct clear_work; +}; + +struct usb_iso_packet_descriptor { + unsigned int offset; + unsigned int length; + unsigned int actual_length; + int status; +}; + +struct usb_anchor { + struct list_head urb_list; + wait_queue_head_t wait; + spinlock_t lock; + atomic_t suspend_wakeups; + unsigned int poisoned: 1; +}; + +struct urb; + +typedef void (*usb_complete_t)(struct urb *); + +struct urb { + struct kref kref; + int unlinked; + void *hcpriv; + atomic_t use_count; + atomic_t reject; + struct list_head urb_list; + struct list_head anchor_list; + struct usb_anchor *anchor; + struct usb_device *dev; + struct usb_host_endpoint *ep; + unsigned int pipe; + unsigned int stream_id; + int status; + unsigned int transfer_flags; + void *transfer_buffer; + long: 32; + dma_addr_t transfer_dma; + struct scatterlist *sg; + int num_mapped_sgs; + int num_sgs; + u32 transfer_buffer_length; + u32 actual_length; + unsigned char *setup_packet; + dma_addr_t setup_dma; + int start_frame; + int number_of_packets; + int interval; + int error_count; + void *context; + usb_complete_t complete; + struct usb_iso_packet_descriptor iso_frame_desc[0]; +}; + +struct giveback_urb_bh { + bool running; + bool high_prio; + spinlock_t lock; + struct list_head head; + struct tasklet_struct bh; + struct usb_host_endpoint *completing_ep; +}; + +enum usb_dev_authorize_policy { + USB_DEVICE_AUTHORIZE_NONE = 0, + USB_DEVICE_AUTHORIZE_ALL = 1, + USB_DEVICE_AUTHORIZE_INTERNAL = 2, +}; + +struct usb_phy; + +struct usb_phy_roothub; + +struct gen_pool; + +struct hc_driver; + +struct usb_hcd { + struct usb_bus self; + struct kref kref; + const char *product_desc; + int speed; + char irq_descr[24]; + struct timer_list rh_timer; + struct urb *status_urb; + struct work_struct wakeup_work; + struct work_struct died_work; + const struct hc_driver *driver; + struct usb_phy *usb_phy; + struct usb_phy_roothub *phy_roothub; + long unsigned int flags; + enum usb_dev_authorize_policy dev_policy; + unsigned int rh_registered: 1; + unsigned int rh_pollable: 1; + unsigned int msix_enabled: 1; + unsigned int msi_enabled: 1; + unsigned int skip_phy_initialization: 1; + unsigned int uses_new_polling: 1; + unsigned int wireless: 1; + unsigned int has_tt: 1; + unsigned int amd_resume_bug: 1; + unsigned int can_do_streams: 1; + unsigned int tpl_support: 1; + unsigned int cant_recv_wakeups: 1; + unsigned int irq; + void *regs; + long: 32; + resource_size_t rsrc_start; + resource_size_t rsrc_len; + unsigned int power_budget; + struct giveback_urb_bh high_prio_bh; + struct giveback_urb_bh low_prio_bh; + struct mutex *address0_mutex; + struct mutex *bandwidth_mutex; + struct usb_hcd *shared_hcd; + struct usb_hcd *primary_hcd; + struct dma_pool *pool[4]; + int state; + struct gen_pool *localmem_pool; + long: 32; + long unsigned int hcd_priv[0]; +}; + +struct hc_driver { + const char *description; + const char *product_desc; + size_t hcd_priv_size; + irqreturn_t (*irq)(struct usb_hcd *); + int flags; + int (*reset)(struct usb_hcd *); + int (*start)(struct usb_hcd *); + int (*pci_suspend)(struct usb_hcd *, bool); + int (*pci_resume)(struct usb_hcd *, bool); + int (*pci_poweroff_late)(struct usb_hcd *, bool); + void (*stop)(struct usb_hcd *); + void (*shutdown)(struct usb_hcd *); + int (*get_frame_number)(struct usb_hcd *); + int (*urb_enqueue)(struct usb_hcd *, struct urb *, gfp_t); + int (*urb_dequeue)(struct usb_hcd *, struct urb *, int); + int (*map_urb_for_dma)(struct usb_hcd *, struct urb *, gfp_t); + void (*unmap_urb_for_dma)(struct usb_hcd *, struct urb *); + void (*endpoint_disable)(struct usb_hcd *, struct usb_host_endpoint *); + void (*endpoint_reset)(struct usb_hcd *, struct usb_host_endpoint *); + int (*hub_status_data)(struct usb_hcd *, char *); + int (*hub_control)(struct usb_hcd *, u16, u16, u16, char *, u16); + int (*bus_suspend)(struct usb_hcd *); + int (*bus_resume)(struct usb_hcd *); + int (*start_port_reset)(struct usb_hcd *, unsigned int); + long unsigned int (*get_resuming_ports)(struct usb_hcd *); + void (*relinquish_port)(struct usb_hcd *, int); + int (*port_handed_over)(struct usb_hcd *, int); + void (*clear_tt_buffer_complete)(struct usb_hcd *, struct usb_host_endpoint *); + int (*alloc_dev)(struct usb_hcd *, struct usb_device *); + void (*free_dev)(struct usb_hcd *, struct usb_device *); + int (*alloc_streams)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint **, unsigned int, unsigned int, gfp_t); + int (*free_streams)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint **, unsigned int, gfp_t); + int (*add_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*drop_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*check_bandwidth)(struct usb_hcd *, struct usb_device *); + void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *); + int (*address_device)(struct usb_hcd *, struct usb_device *); + int (*enable_device)(struct usb_hcd *, struct usb_device *); + int (*update_hub_device)(struct usb_hcd *, struct usb_device *, struct usb_tt *, gfp_t); + int (*reset_device)(struct usb_hcd *, struct usb_device *); + int (*update_device)(struct usb_hcd *, struct usb_device *); + int (*set_usb2_hw_lpm)(struct usb_hcd *, struct usb_device *, int); + int (*enable_usb3_lpm_timeout)(struct usb_hcd *, struct usb_device *, enum usb3_link_state); + int (*disable_usb3_lpm_timeout)(struct usb_hcd *, struct usb_device *, enum usb3_link_state); + int (*find_raw_port_number)(struct usb_hcd *, int); + int (*port_power)(struct usb_hcd *, int, bool); + int (*submit_single_step_set_feature)(struct usb_hcd *, struct urb *, int); +}; + +struct physdev_dbgp_op { + uint8_t op; + uint8_t bus; + union { + struct physdev_pci_device pci; + } u; +}; + +struct dev_ext_attribute { + struct device_attribute attr; + void *var; +}; + +typedef uint8_t xen_domain_handle_t[16]; + +struct xen_compile_info { + char compiler[64]; + char compile_by[16]; + char compile_domain[32]; + char compile_date[32]; +}; + +struct xen_platform_parameters { + xen_ulong_t virt_start; +}; + +struct xen_build_id { + uint32_t len; + unsigned char buf[0]; +}; + +struct hyp_sysfs_attr { + struct attribute attr; + ssize_t (*show)(struct hyp_sysfs_attr *, char *); + ssize_t (*store)(struct hyp_sysfs_attr *, const char *, size_t); + void *hyp_attr_data; +}; + +typedef struct { + union { + int *p; + uint64_t q; + }; +} __guest_handle_int; + +typedef struct { + union { + xen_ulong_t *p; + uint64_t q; + }; +} __guest_handle_xen_ulong_t; + +struct xen_add_to_physmap_range { + domid_t domid; + uint16_t space; + uint16_t size; + domid_t foreign_domid; + __guest_handle_xen_ulong_t idxs; + __guest_handle_xen_pfn_t gpfns; + __guest_handle_int errs; +}; + +struct xen_remove_from_physmap { + domid_t domid; + long: 32; + xen_pfn_t gpfn; +}; + +typedef void (*xen_gfn_fn_t)(long unsigned int, void *); + +struct xen_remap_gfn_info; + +struct remap_data { + xen_pfn_t *fgfn; + int nr_fgfn; + pgprot_t prot; + domid_t domid; + struct vm_area_struct *vma; + int index; + struct page **pages; + struct xen_remap_gfn_info *info; + int *err_ptr; + int mapped; + int h_errs[1]; + xen_ulong_t h_idxs[1]; + xen_pfn_t h_gpfns[1]; + int h_iter; + long: 32; +}; + +struct map_balloon_pages { + xen_pfn_t *pfns; + unsigned int idx; +}; + +struct remap_pfn { + struct mm_struct *mm; + struct page **pages; + pgprot_t prot; + long unsigned int i; + long: 32; +}; + +struct pre_voltage_change_data { + long unsigned int old_uV; + long unsigned int min_uV; + long unsigned int max_uV; +}; + +struct regulator_voltage { + int min_uV; + int max_uV; +}; + +struct regulator { + struct device *dev; + struct list_head list; + unsigned int always_on: 1; + unsigned int bypass: 1; + unsigned int device_link: 1; + int uA_load; + unsigned int enable_count; + unsigned int deferred_disables; + struct regulator_voltage voltage[5]; + const char *supply_name; + struct device_attribute dev_attr; + struct regulator_dev *rdev; + struct dentry *debugfs; +}; + +struct ww_class { + atomic_long_t stamp; + struct lock_class_key acquire_key; + struct lock_class_key mutex_key; + const char *acquire_name; + const char *mutex_name; + unsigned int is_wait_die; +}; + +enum regulator_status { + REGULATOR_STATUS_OFF = 0, + REGULATOR_STATUS_ON = 1, + REGULATOR_STATUS_ERROR = 2, + REGULATOR_STATUS_FAST = 3, + REGULATOR_STATUS_NORMAL = 4, + REGULATOR_STATUS_IDLE = 5, + REGULATOR_STATUS_STANDBY = 6, + REGULATOR_STATUS_BYPASS = 7, + REGULATOR_STATUS_UNDEFINED = 8, +}; + +enum regulator_detection_severity { + REGULATOR_SEVERITY_PROT = 0, + REGULATOR_SEVERITY_ERR = 1, + REGULATOR_SEVERITY_WARN = 2, +}; + +struct regulator_enable_gpio { + struct list_head list; + struct gpio_desc *gpiod; + u32 enable_count; + u32 request_count; +}; + +enum regulator_active_discharge { + REGULATOR_ACTIVE_DISCHARGE_DEFAULT = 0, + REGULATOR_ACTIVE_DISCHARGE_DISABLE = 1, + REGULATOR_ACTIVE_DISCHARGE_ENABLE = 2, +}; + +struct trace_event_raw_regulator_basic { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_regulator_range { + struct trace_entry ent; + u32 __data_loc_name; + int min; + int max; + char __data[0]; +}; + +struct trace_event_raw_regulator_value { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int val; + char __data[0]; +}; + +struct trace_event_data_offsets_regulator_basic { + u32 name; +}; + +struct trace_event_data_offsets_regulator_range { + u32 name; +}; + +struct trace_event_data_offsets_regulator_value { + u32 name; +}; + +typedef void (*btf_trace_regulator_enable)(void *, const char *); + +typedef void (*btf_trace_regulator_enable_delay)(void *, const char *); + +typedef void (*btf_trace_regulator_enable_complete)(void *, const char *); + +typedef void (*btf_trace_regulator_disable)(void *, const char *); + +typedef void (*btf_trace_regulator_disable_complete)(void *, const char *); + +typedef void (*btf_trace_regulator_bypass_enable)(void *, const char *); + +typedef void (*btf_trace_regulator_bypass_enable_complete)(void *, const char *); + +typedef void (*btf_trace_regulator_bypass_disable)(void *, const char *); + +typedef void (*btf_trace_regulator_bypass_disable_complete)(void *, const char *); + +typedef void (*btf_trace_regulator_set_voltage)(void *, const char *, int, int); + +typedef void (*btf_trace_regulator_set_voltage_complete)(void *, const char *, unsigned int); + +enum regulator_get_type { + NORMAL_GET = 0, + EXCLUSIVE_GET = 1, + OPTIONAL_GET = 2, + MAX_GET_TYPE = 3, +}; + +struct regulator_map { + struct list_head list; + const char *dev_name; + const char *supply; + struct regulator_dev *regulator; +}; + +struct regulator_supply_alias { + struct list_head list; + struct device *src_dev; + const char *src_supply; + struct device *alias_dev; + const char *alias_supply; +}; + +struct summary_data { + struct seq_file *s; + struct regulator_dev *parent; + int level; +}; + +struct summary_lock_data { + struct ww_acquire_ctx *ww_ctx; + struct regulator_dev **new_contended_rdev; + struct regulator_dev **old_contended_rdev; +}; + +struct fixed_voltage_config { + const char *supply_name; + const char *input_supply; + int microvolts; + unsigned int startup_delay; + unsigned int off_on_delay; + unsigned int enabled_at_boot: 1; + struct regulator_init_data *init_data; +}; + +struct fixed_regulator_data { + struct fixed_voltage_config cfg; + struct regulator_init_data init_data; + struct platform_device pdev; +}; + +struct regulator_err_state { + struct regulator_dev *rdev; + long unsigned int notifs; + long unsigned int errors; + int possible_errs; +}; + +struct regulator_irq_data { + struct regulator_err_state *states; + int num_states; + void *data; + long int opaque; +}; + +struct regulator_irq_desc { + const char *name; + int fatal_cnt; + int reread_ms; + int irq_off_ms; + bool skip_off; + bool high_prio; + void *data; + int (*die)(struct regulator_irq_data *); + int (*map_event)(int, struct regulator_irq_data *, long unsigned int *); + int (*renable)(struct regulator_irq_data *); +}; + +struct regulator_bulk_devres { + struct regulator_bulk_data *consumers; + int num_consumers; +}; + +struct regulator_supply_alias_match { + struct device *dev; + const char *id; +}; + +struct regulator_notifier_match { + struct regulator *regulator; + struct notifier_block *nb; +}; + +enum { + REGULATOR_ERROR_CLEARED = 0, + REGULATOR_FAILED_RETRY = 1, + REGULATOR_ERROR_ON = 2, +}; + +struct regulator_irq { + struct regulator_irq_data rdata; + struct regulator_irq_desc desc; + int irq; + int retry_cnt; + struct delayed_work isr_work; +}; + +struct of_regulator_match { + const char *name; + void *driver_data; + struct regulator_init_data *init_data; + struct device_node *of_node; + const struct regulator_desc *desc; +}; + +struct devm_of_regulator_matches { + struct of_regulator_match *matches; + unsigned int num_matches; +}; + +struct fixed_voltage_data { + struct regulator_desc desc; + struct regulator_dev *dev; + struct clk *enable_clock; + unsigned int enable_counter; + int performance_state; +}; + +struct fixed_dev_type { + bool has_enable_clock; + bool has_performance_state; +}; + +enum as3722_regulators_id { + AS3722_REGULATOR_ID_SD0 = 0, + AS3722_REGULATOR_ID_SD1 = 1, + AS3722_REGULATOR_ID_SD2 = 2, + AS3722_REGULATOR_ID_SD3 = 3, + AS3722_REGULATOR_ID_SD4 = 4, + AS3722_REGULATOR_ID_SD5 = 5, + AS3722_REGULATOR_ID_SD6 = 6, + AS3722_REGULATOR_ID_LDO0 = 7, + AS3722_REGULATOR_ID_LDO1 = 8, + AS3722_REGULATOR_ID_LDO2 = 9, + AS3722_REGULATOR_ID_LDO3 = 10, + AS3722_REGULATOR_ID_LDO4 = 11, + AS3722_REGULATOR_ID_LDO5 = 12, + AS3722_REGULATOR_ID_LDO6 = 13, + AS3722_REGULATOR_ID_LDO7 = 14, + AS3722_REGULATOR_ID_LDO9 = 15, + AS3722_REGULATOR_ID_LDO10 = 16, + AS3722_REGULATOR_ID_LDO11 = 17, + AS3722_REGULATOR_ID_MAX = 18, +}; + +struct as3722_register_mapping { + u8 regulator_id; + const char *name; + const char *sname; + u8 vsel_reg; + u8 vsel_mask; + int n_voltages; + u32 enable_reg; + u8 enable_mask; + u32 control_reg; + u8 mode_mask; + u32 sleep_ctrl_reg; + u8 sleep_ctrl_mask; +}; + +struct as3722_regulator_config_data { + struct regulator_init_data *reg_init; + bool enable_tracking; + int ext_control; +}; + +struct as3722_regulators { + struct device *dev; + struct as3722 *as3722; + struct regulator_desc desc[18]; + struct as3722_regulator_config_data reg_config_data[18]; +}; + +enum tps65917_regulators { + TPS65917_REG_SMPS1 = 0, + TPS65917_REG_SMPS2 = 1, + TPS65917_REG_SMPS3 = 2, + TPS65917_REG_SMPS4 = 3, + TPS65917_REG_SMPS5 = 4, + TPS65917_REG_SMPS12 = 5, + TPS65917_REG_LDO1 = 6, + TPS65917_REG_LDO2 = 7, + TPS65917_REG_LDO3 = 8, + TPS65917_REG_LDO4 = 9, + TPS65917_REG_LDO5 = 10, + TPS65917_REG_REGEN1 = 11, + TPS65917_REG_REGEN2 = 12, + TPS65917_REG_REGEN3 = 13, + TPS65917_NUM_REGS = 14, +}; + +enum { + PALMAS_EXT_CONTROL_ENABLE1 = 1, + PALMAS_EXT_CONTROL_ENABLE2 = 2, + PALMAS_EXT_CONTROL_NSLEEP = 4, +}; + +enum palmas_external_requestor_id { + PALMAS_EXTERNAL_REQSTR_ID_REGEN1 = 0, + PALMAS_EXTERNAL_REQSTR_ID_REGEN2 = 1, + PALMAS_EXTERNAL_REQSTR_ID_SYSEN1 = 2, + PALMAS_EXTERNAL_REQSTR_ID_SYSEN2 = 3, + PALMAS_EXTERNAL_REQSTR_ID_CLK32KG = 4, + PALMAS_EXTERNAL_REQSTR_ID_CLK32KGAUDIO = 5, + PALMAS_EXTERNAL_REQSTR_ID_REGEN3 = 6, + PALMAS_EXTERNAL_REQSTR_ID_SMPS12 = 7, + PALMAS_EXTERNAL_REQSTR_ID_SMPS3 = 8, + PALMAS_EXTERNAL_REQSTR_ID_SMPS45 = 9, + PALMAS_EXTERNAL_REQSTR_ID_SMPS6 = 10, + PALMAS_EXTERNAL_REQSTR_ID_SMPS7 = 11, + PALMAS_EXTERNAL_REQSTR_ID_SMPS8 = 12, + PALMAS_EXTERNAL_REQSTR_ID_SMPS9 = 13, + PALMAS_EXTERNAL_REQSTR_ID_SMPS10 = 14, + PALMAS_EXTERNAL_REQSTR_ID_LDO1 = 15, + PALMAS_EXTERNAL_REQSTR_ID_LDO2 = 16, + PALMAS_EXTERNAL_REQSTR_ID_LDO3 = 17, + PALMAS_EXTERNAL_REQSTR_ID_LDO4 = 18, + PALMAS_EXTERNAL_REQSTR_ID_LDO5 = 19, + PALMAS_EXTERNAL_REQSTR_ID_LDO6 = 20, + PALMAS_EXTERNAL_REQSTR_ID_LDO7 = 21, + PALMAS_EXTERNAL_REQSTR_ID_LDO8 = 22, + PALMAS_EXTERNAL_REQSTR_ID_LDO9 = 23, + PALMAS_EXTERNAL_REQSTR_ID_LDOLN = 24, + PALMAS_EXTERNAL_REQSTR_ID_LDOUSB = 25, + PALMAS_EXTERNAL_REQSTR_ID_MAX = 26, +}; + +enum tps65917_external_requestor_id { + TPS65917_EXTERNAL_REQSTR_ID_REGEN1 = 0, + TPS65917_EXTERNAL_REQSTR_ID_REGEN2 = 1, + TPS65917_EXTERNAL_REQSTR_ID_REGEN3 = 2, + TPS65917_EXTERNAL_REQSTR_ID_SMPS1 = 3, + TPS65917_EXTERNAL_REQSTR_ID_SMPS2 = 4, + TPS65917_EXTERNAL_REQSTR_ID_SMPS3 = 5, + TPS65917_EXTERNAL_REQSTR_ID_SMPS4 = 6, + TPS65917_EXTERNAL_REQSTR_ID_SMPS5 = 7, + TPS65917_EXTERNAL_REQSTR_ID_SMPS12 = 8, + TPS65917_EXTERNAL_REQSTR_ID_LDO1 = 9, + TPS65917_EXTERNAL_REQSTR_ID_LDO2 = 10, + TPS65917_EXTERNAL_REQSTR_ID_LDO3 = 11, + TPS65917_EXTERNAL_REQSTR_ID_LDO4 = 12, + TPS65917_EXTERNAL_REQSTR_ID_LDO5 = 13, + TPS65917_EXTERNAL_REQSTR_ID_MAX = 14, +}; + +enum { + PWR_REG11 = 0, + PWR_REG18 = 1, + PWR_USB33 = 2, + STM32PWR_REG_NUM_REGS = 3, +}; + +struct stm32_pwr_reg { + void *base; + u32 ready_mask; +}; + +struct twlreg_info { + u8 base; + u8 id; + u8 table_len; + const u16 *table; + u8 remap; + struct regulator_desc desc; + long unsigned int features; + void *data; +}; + +struct twlreg_info___2 { + u8 base; + u8 id; + u8 flags; + struct regulator_desc desc; + long unsigned int features; + void *data; +}; + +struct reset_control { + struct reset_controller_dev *rcdev; + struct list_head list; + unsigned int id; + struct kref refcnt; + bool acquired; + bool shared; + bool array; + atomic_t deassert_count; + atomic_t triggered_count; +}; + +struct reset_control_lookup { + struct list_head list; + const char *provider; + unsigned int index; + const char *dev_id; + const char *con_id; +}; + +struct reset_control_array { + struct reset_control base; + unsigned int num_rstcs; + struct reset_control *rstc[0]; +}; + +struct reset_control_bulk_devres { + int num_rstcs; + struct reset_control_bulk_data *rstcs; +}; + +struct meson_reset_param { + int reg_count; + int level_offset; +}; + +struct meson_reset { + void *reg_base; + const struct meson_reset_param *param; + struct reset_controller_dev rcdev; + spinlock_t lock; +}; + +struct reset_simple_devdata { + u32 reg_offset; + u32 nr_resets; + bool active_low; + bool status_active_low; +}; + +struct n_tty_data { + size_t read_head; + size_t commit_head; + size_t canon_head; + size_t echo_head; + size_t echo_commit; + size_t echo_mark; + long unsigned int char_map[8]; + long unsigned int overrun_time; + int num_overrun; + bool no_room; + unsigned char lnext: 1; + unsigned char erasing: 1; + unsigned char raw: 1; + unsigned char real_raw: 1; + unsigned char icanon: 1; + unsigned char push: 1; + char read_buf[4096]; + long unsigned int read_flags[128]; + unsigned char echo_buf[4096]; + size_t read_tail; + size_t line_start; + size_t lookahead_count; + unsigned int column; + unsigned int canon_column; + size_t echo_tail; + struct mutex atomic_read_lock; + struct mutex output_lock; +}; + +enum { + ERASE = 0, + WERASE = 1, + KILL = 2, +}; + +struct termios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; +}; + +struct termios2 { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +struct termio { + short unsigned int c_iflag; + short unsigned int c_oflag; + short unsigned int c_cflag; + short unsigned int c_lflag; + unsigned char c_line; + unsigned char c_cc[8]; +}; + +struct ldsem_waiter { + struct list_head list; + struct task_struct *task; +}; + +struct pts_fs_info; + +struct tty_audit_buf { + struct mutex mutex; + dev_t dev; + unsigned int icanon: 1; + size_t valid; + unsigned char *data; +}; + +struct input_id { + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; +}; + +struct input_absinfo { + __s32 value; + __s32 minimum; + __s32 maximum; + __s32 fuzz; + __s32 flat; + __s32 resolution; +}; + +struct input_keymap_entry { + __u8 flags; + __u8 len; + __u16 index; + __u32 keycode; + __u8 scancode[32]; +}; + +struct ff_replay { + __u16 length; + __u16 delay; +}; + +struct ff_trigger { + __u16 button; + __u16 interval; +}; + +struct ff_envelope { + __u16 attack_length; + __u16 attack_level; + __u16 fade_length; + __u16 fade_level; +}; + +struct ff_constant_effect { + __s16 level; + struct ff_envelope envelope; +}; + +struct ff_ramp_effect { + __s16 start_level; + __s16 end_level; + struct ff_envelope envelope; +}; + +struct ff_condition_effect { + __u16 right_saturation; + __u16 left_saturation; + __s16 right_coeff; + __s16 left_coeff; + __u16 deadband; + __s16 center; +}; + +struct ff_periodic_effect { + __u16 waveform; + __u16 period; + __s16 magnitude; + __s16 offset; + __u16 phase; + struct ff_envelope envelope; + __u32 custom_len; + __s16 *custom_data; +}; + +struct ff_rumble_effect { + __u16 strong_magnitude; + __u16 weak_magnitude; +}; + +struct ff_effect { + __u16 type; + __s16 id; + __u16 direction; + struct ff_trigger trigger; + struct ff_replay replay; + union { + struct ff_constant_effect constant; + struct ff_ramp_effect ramp; + struct ff_periodic_effect periodic; + struct ff_condition_effect condition[2]; + struct ff_rumble_effect rumble; + } u; +}; + +struct input_device_id { + kernel_ulong_t flags; + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; + kernel_ulong_t evbit[1]; + kernel_ulong_t keybit[24]; + kernel_ulong_t relbit[1]; + kernel_ulong_t absbit[2]; + kernel_ulong_t mscbit[1]; + kernel_ulong_t ledbit[1]; + kernel_ulong_t sndbit[1]; + kernel_ulong_t ffbit[4]; + kernel_ulong_t swbit[1]; + kernel_ulong_t propbit[1]; + kernel_ulong_t driver_info; +}; + +struct input_value { + __u16 type; + __u16 code; + __s32 value; +}; + +struct ff_device; + +struct input_dev_poller; + +struct input_mt; + +struct input_handle; + +struct input_dev { + const char *name; + const char *phys; + const char *uniq; + struct input_id id; + long unsigned int propbit[1]; + long unsigned int evbit[1]; + long unsigned int keybit[24]; + long unsigned int relbit[1]; + long unsigned int absbit[2]; + long unsigned int mscbit[1]; + long unsigned int ledbit[1]; + long unsigned int sndbit[1]; + long unsigned int ffbit[4]; + long unsigned int swbit[1]; + unsigned int hint_events_per_packet; + unsigned int keycodemax; + unsigned int keycodesize; + void *keycode; + int (*setkeycode)(struct input_dev *, const struct input_keymap_entry *, unsigned int *); + int (*getkeycode)(struct input_dev *, struct input_keymap_entry *); + struct ff_device *ff; + struct input_dev_poller *poller; + unsigned int repeat_key; + struct timer_list timer; + int rep[2]; + struct input_mt *mt; + struct input_absinfo *absinfo; + long unsigned int key[24]; + long unsigned int led[1]; + long unsigned int snd[1]; + long unsigned int sw[1]; + int (*open)(struct input_dev *); + void (*close)(struct input_dev *); + int (*flush)(struct input_dev *, struct file *); + int (*event)(struct input_dev *, unsigned int, unsigned int, int); + struct input_handle *grab; + spinlock_t event_lock; + struct mutex mutex; + unsigned int users; + bool going_away; + struct device dev; + struct list_head h_list; + struct list_head node; + unsigned int num_vals; + unsigned int max_vals; + struct input_value *vals; + bool devres_managed; + ktime_t timestamp[3]; + bool inhibited; + long: 32; +}; + +struct ff_device { + int (*upload)(struct input_dev *, struct ff_effect *, struct ff_effect *); + int (*erase)(struct input_dev *, int); + int (*playback)(struct input_dev *, int, int); + void (*set_gain)(struct input_dev *, u16); + void (*set_autocenter)(struct input_dev *, u16); + void (*destroy)(struct ff_device *); + void *private; + long unsigned int ffbit[4]; + struct mutex mutex; + int max_effects; + struct ff_effect *effects; + struct file *effect_owners[0]; +}; + +struct input_handler; + +struct input_handle { + void *private; + int open; + const char *name; + struct input_dev *dev; + struct input_handler *handler; + struct list_head d_node; + struct list_head h_node; +}; + +struct input_handler { + void *private; + void (*event)(struct input_handle *, unsigned int, unsigned int, int); + void (*events)(struct input_handle *, const struct input_value *, unsigned int); + bool (*filter)(struct input_handle *, unsigned int, unsigned int, int); + bool (*match)(struct input_handler *, struct input_dev *); + int (*connect)(struct input_handler *, struct input_dev *, const struct input_device_id *); + void (*disconnect)(struct input_handle *); + void (*start)(struct input_handle *); + bool legacy_minors; + int minor; + const char *name; + const struct input_device_id *id_table; + struct list_head h_list; + struct list_head node; +}; + +struct sysrq_state { + struct input_handle handle; + struct work_struct reinject_work; + long unsigned int key_down[24]; + unsigned int alt; + unsigned int alt_use; + unsigned int shift; + unsigned int shift_use; + bool active; + bool need_reinject; + bool reinjecting; + bool reset_canceled; + bool reset_requested; + long unsigned int reset_keybit[24]; + int reset_seq_len; + int reset_seq_cnt; + int reset_seq_version; + struct timer_list keyreset_timer; +}; + +struct unipair { + short unsigned int unicode; + short unsigned int fontpos; +}; + +struct unimapdesc { + short unsigned int entry_ct; + struct unipair *entries; +}; + +struct kbentry { + unsigned char kb_table; + unsigned char kb_index; + short unsigned int kb_value; +}; + +struct kbsentry { + unsigned char kb_func; + unsigned char kb_string[512]; +}; + +struct kbkeycode { + unsigned int scancode; + unsigned int keycode; +}; + +struct kbd_repeat { + int delay; + int period; +}; + +struct console_font_op { + unsigned int op; + unsigned int flags; + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char *data; +}; + +struct vt_stat { + short unsigned int v_active; + short unsigned int v_signal; + short unsigned int v_state; +}; + +struct vt_sizes { + short unsigned int v_rows; + short unsigned int v_cols; + short unsigned int v_scrollsize; +}; + +struct vt_consize { + short unsigned int v_rows; + short unsigned int v_cols; + short unsigned int v_vlin; + short unsigned int v_clin; + short unsigned int v_vcol; + short unsigned int v_ccol; +}; + +struct vt_event { + unsigned int event; + unsigned int oldev; + unsigned int newev; + unsigned int pad[4]; +}; + +struct vt_setactivate { + unsigned int console; + struct vt_mode mode; +}; + +struct vt_spawn_console { + spinlock_t lock; + struct pid *pid; + int sig; +}; + +struct vt_event_wait { + struct list_head list; + struct vt_event event; + int done; +}; + +struct vt_notifier_param { + struct vc_data *vc; + unsigned int c; +}; + +struct vcs_poll_data { + struct notifier_block notifier; + unsigned int cons_num; + int event; + wait_queue_head_t waitq; + struct fasync_struct *fasync; +}; + +struct tiocl_selection { + short unsigned int xs; + short unsigned int ys; + short unsigned int xe; + short unsigned int ye; + short unsigned int sel_mode; +}; + +struct vc_selection { + struct mutex lock; + struct vc_data *cons; + char *buffer; + unsigned int buf_len; + volatile int start; + int end; +}; + +struct kbdiacr { + unsigned char diacr; + unsigned char base; + unsigned char result; +}; + +struct kbdiacrs { + unsigned int kb_cnt; + struct kbdiacr kbdiacr[256]; +}; + +struct kbdiacruc { + unsigned int diacr; + unsigned int base; + unsigned int result; +}; + +struct kbdiacrsuc { + unsigned int kb_cnt; + struct kbdiacruc kbdiacruc[256]; +}; + +struct keyboard_notifier_param { + struct vc_data *vc; + int down; + int shift; + int ledstate; + unsigned int value; +}; + +struct kbd_struct { + unsigned char lockstate; + unsigned char slockstate; + unsigned char ledmode: 1; + unsigned char ledflagstate: 4; + char: 3; + unsigned char default_ledflagstate: 4; + unsigned char kbdmode: 3; + long: 1; + unsigned char modeflags: 5; +}; + +enum led_brightness { + LED_OFF = 0, + LED_ON = 1, + LED_HALF = 127, + LED_FULL = 255, +}; + +struct led_hw_trigger_type { + int dummy; +}; + +struct led_pattern; + +struct led_trigger; + +struct led_classdev { + const char *name; + unsigned int brightness; + unsigned int max_brightness; + int flags; + long unsigned int work_flags; + void (*brightness_set)(struct led_classdev *, enum led_brightness); + int (*brightness_set_blocking)(struct led_classdev *, enum led_brightness); + enum led_brightness (*brightness_get)(struct led_classdev *); + int (*blink_set)(struct led_classdev *, long unsigned int *, long unsigned int *); + int (*pattern_set)(struct led_classdev *, struct led_pattern *, u32, int); + int (*pattern_clear)(struct led_classdev *); + struct device *dev; + const struct attribute_group **groups; + struct list_head node; + const char *default_trigger; + long unsigned int blink_delay_on; + long unsigned int blink_delay_off; + struct timer_list blink_timer; + int blink_brightness; + int new_blink_brightness; + void (*flash_resume)(struct led_classdev *); + struct work_struct set_brightness_work; + int delayed_set_value; + struct rw_semaphore trigger_lock; + struct led_trigger *trigger; + struct list_head trig_list; + void *trigger_data; + bool activated; + struct led_hw_trigger_type *trigger_type; + int brightness_hw_changed; + struct kernfs_node *brightness_hw_changed_kn; + struct mutex led_access; +}; + +struct led_pattern { + u32 delta_t; + int brightness; +}; + +struct led_trigger { + const char *name; + int (*activate)(struct led_classdev *); + void (*deactivate)(struct led_classdev *); + struct led_hw_trigger_type *trigger_type; + spinlock_t leddev_list_lock; + struct list_head led_cdevs; + struct list_head next_trig; + const struct attribute_group **groups; +}; + +typedef void k_handler_fn(struct vc_data *, unsigned char, char); + +typedef void fn_handler_fn(struct vc_data *); + +struct getset_keycode_data { + struct input_keymap_entry ke; + int error; +}; + +struct kbd_led_trigger { + struct led_trigger trigger; + unsigned int mask; +}; + +enum translation_map { + LAT1_MAP = 0, + GRAF_MAP = 1, + IBMPC_MAP = 2, + USER_MAP = 3, + FIRST_MAP = 0, + LAST_MAP = 3, +}; + +struct uni_pagedict { + u16 **uni_pgdir[32]; + long unsigned int refcount; + long unsigned int sum; + unsigned char *inverse_translations[4]; + u16 *inverse_trans_unicode; +}; + +typedef uint32_t char32_t; + +struct uni_screen { + char32_t *lines[0]; +}; + +struct con_driver { + const struct consw *con; + const char *desc; + struct device *dev; + int node; + int first; + int last; + int flag; +}; + +enum { + blank_off = 0, + blank_normal_wait = 1, + blank_vesa_wait = 2, +}; + +enum { + EPecma = 0, + EPdec = 1, + EPeq = 2, + EPgt = 3, + EPlt = 4, +}; + +struct rgb { + u8 r; + u8 g; + u8 b; +}; + +enum { + ESnormal = 0, + ESesc = 1, + ESsquare = 2, + ESgetpars = 3, + ESfunckey = 4, + EShash = 5, + ESsetG0 = 6, + ESsetG1 = 7, + ESpercent = 8, + EScsiignore = 9, + ESnonstd = 10, + ESpalette = 11, + ESosc = 12, + ESapc = 13, + ESpm = 14, + ESdcs = 15, +}; + +struct interval { + uint32_t first; + uint32_t last; +}; + +struct vc_draw_region { + long unsigned int from; + long unsigned int to; + int x; +}; + +struct hv_ops; + +struct hvc_struct { + struct tty_port port; + spinlock_t lock; + int index; + int do_wakeup; + char *outbuf; + int outbuf_size; + int n_outbuf; + uint32_t vtermno; + const struct hv_ops *ops; + int irq_requested; + int data; + struct winsize ws; + struct work_struct tty_resize; + struct list_head next; + long unsigned int flags; +}; + +struct hv_ops { + int (*get_chars)(uint32_t, char *, int); + int (*put_chars)(uint32_t, const char *, int); + int (*flush)(uint32_t, bool); + int (*notifier_add)(struct hvc_struct *, int); + void (*notifier_del)(struct hvc_struct *, int); + void (*notifier_hangup)(struct hvc_struct *, int); + int (*tiocmget)(struct hvc_struct *); + int (*tiocmset)(struct hvc_struct *, unsigned int, unsigned int); + void (*dtr_rts)(struct hvc_struct *, int); +}; + +struct circ_buf { + char *buf; + int head; + int tail; +}; + +struct serial_rs485 { + __u32 flags; + __u32 delay_rts_before_send; + __u32 delay_rts_after_send; + union { + __u32 padding[5]; + struct { + __u8 addr_recv; + __u8 addr_dest; + __u8 padding0[2]; + __u32 padding1[4]; + }; + }; +}; + +struct serial_iso7816 { + __u32 flags; + __u32 tg; + __u32 sc_fi; + __u32 sc_di; + __u32 clk; + __u32 reserved[5]; +}; + +struct uart_port; + +struct uart_ops { + unsigned int (*tx_empty)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_mctrl)(struct uart_port *); + void (*stop_tx)(struct uart_port *); + void (*start_tx)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + void (*send_xchar)(struct uart_port *, char); + void (*stop_rx)(struct uart_port *); + void (*start_rx)(struct uart_port *); + void (*enable_ms)(struct uart_port *); + void (*break_ctl)(struct uart_port *, int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*flush_buffer)(struct uart_port *); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + const char * (*type)(struct uart_port *); + void (*release_port)(struct uart_port *); + int (*request_port)(struct uart_port *); + void (*config_port)(struct uart_port *, int); + int (*verify_port)(struct uart_port *, struct serial_struct *); + int (*ioctl)(struct uart_port *, unsigned int, long unsigned int); +}; + +struct uart_icount { + __u32 cts; + __u32 dsr; + __u32 rng; + __u32 dcd; + __u32 rx; + __u32 tx; + __u32 frame; + __u32 overrun; + __u32 parity; + __u32 brk; + __u32 buf_overrun; +}; + +typedef u64 upf_t; + +typedef unsigned int upstat_t; + +struct uart_state; + +struct uart_port { + spinlock_t lock; + long unsigned int iobase; + unsigned char *membase; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_divisor)(struct uart_port *, unsigned int, unsigned int *); + void (*set_divisor)(struct uart_port *, unsigned int, unsigned int, unsigned int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); + int (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *); + int (*iso7816_config)(struct uart_port *, struct serial_iso7816 *); + unsigned int irq; + long unsigned int irqflags; + unsigned int uartclk; + unsigned int fifosize; + unsigned char x_char; + unsigned char regshift; + unsigned char iotype; + unsigned char quirks; + unsigned int read_status_mask; + unsigned int ignore_status_mask; + struct uart_state *state; + struct uart_icount icount; + struct console *cons; + upf_t flags; + upstat_t status; + int hw_stopped; + unsigned int mctrl; + unsigned int frame_time; + unsigned int type; + const struct uart_ops *ops; + unsigned int custom_divisor; + unsigned int line; + unsigned int minor; + long: 32; + resource_size_t mapbase; + resource_size_t mapsize; + struct device *dev; + long unsigned int sysrq; + unsigned int sysrq_ch; + unsigned char has_sysrq; + unsigned char sysrq_seq; + unsigned char hub6; + unsigned char suspended; + unsigned char console_reinit; + const char *name; + struct attribute_group *attr_group; + const struct attribute_group **tty_groups; + struct serial_rs485 rs485; + struct serial_rs485 rs485_supported; + struct gpio_desc *rs485_term_gpio; + struct serial_iso7816 iso7816; + void *private_data; +}; + +enum uart_pm_state { + UART_PM_STATE_ON = 0, + UART_PM_STATE_OFF = 3, + UART_PM_STATE_UNDEFINED = 4, +}; + +struct uart_state { + struct tty_port port; + enum uart_pm_state pm_state; + struct circ_buf xmit; + atomic_t refcount; + wait_queue_head_t remove_wait; + struct uart_port *uart_port; +}; + +struct earlycon_device { + struct console *con; + long: 32; + struct uart_port port; + char options[16]; + unsigned int baud; + long: 32; +}; + +struct earlycon_id { + char name[15]; + char name_term; + char compatible[128]; + int (*setup)(struct earlycon_device *, const char *); +}; + +typedef uint32_t XENCONS_RING_IDX; + +struct xencons_interface { + char in[1024]; + char out[2048]; + XENCONS_RING_IDX in_cons; + XENCONS_RING_IDX in_prod; + XENCONS_RING_IDX out_cons; + XENCONS_RING_IDX out_prod; +}; + +struct xencons_info { + struct list_head list; + struct xenbus_device *xbdev; + struct xencons_interface *intf; + unsigned int evtchn; + XENCONS_RING_IDX out_cons; + unsigned int out_cons_same; + struct hvc_struct *hvc; + int irq; + int vtermno; + grant_ref_t gntref; +}; + +struct uart_driver { + struct module *owner; + const char *driver_name; + const char *dev_name; + int major; + int minor; + int nr; + struct console *cons; + struct uart_state *state; + struct tty_driver *tty_driver; +}; + +struct uart_match { + struct uart_port *port; + struct uart_driver *driver; +}; + +enum hwparam_type { + hwparam_ioport = 0, + hwparam_iomem = 1, + hwparam_ioport_or_iomem = 2, + hwparam_irq = 3, + hwparam_dma = 4, + hwparam_dma_addr = 5, + hwparam_other = 6, +}; + +struct plat_serial8250_port { + long unsigned int iobase; + void *membase; + resource_size_t mapbase; + unsigned int irq; + long unsigned int irqflags; + unsigned int uartclk; + void *private_data; + unsigned char regshift; + unsigned char iotype; + unsigned char hub6; + unsigned char has_sysrq; + long: 32; + upf_t flags; + unsigned int type; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); + long: 32; +}; + +enum { + PLAT8250_DEV_LEGACY = 4294967295, + PLAT8250_DEV_PLATFORM = 0, + PLAT8250_DEV_PLATFORM1 = 1, + PLAT8250_DEV_PLATFORM2 = 2, + PLAT8250_DEV_FOURPORT = 3, + PLAT8250_DEV_ACCENT = 4, + PLAT8250_DEV_BOCA = 5, + PLAT8250_DEV_EXAR_ST16C554 = 6, + PLAT8250_DEV_HUB6 = 7, + PLAT8250_DEV_AU1X00 = 8, + PLAT8250_DEV_SM501 = 9, +}; + +struct uart_8250_port; + +struct uart_8250_ops { + int (*setup_irq)(struct uart_8250_port *); + void (*release_irq)(struct uart_8250_port *); + void (*setup_timer)(struct uart_8250_port *); +}; + +struct mctrl_gpios; + +struct uart_8250_dma; + +struct uart_8250_em485; + +struct uart_8250_port { + struct uart_port port; + struct timer_list timer; + struct list_head list; + u32 capabilities; + short unsigned int bugs; + bool fifo_bug; + unsigned int tx_loadsz; + unsigned char acr; + unsigned char fcr; + unsigned char ier; + unsigned char lcr; + unsigned char mcr; + unsigned char cur_iotype; + unsigned int rpm_tx_active; + unsigned char canary; + unsigned char probe; + struct mctrl_gpios *gpios; + u16 lsr_saved_flags; + u16 lsr_save_mask; + unsigned char msr_saved_flags; + struct uart_8250_dma *dma; + const struct uart_8250_ops *ops; + int (*dl_read)(struct uart_8250_port *); + void (*dl_write)(struct uart_8250_port *, int); + struct uart_8250_em485 *em485; + void (*rs485_start_tx)(struct uart_8250_port *); + void (*rs485_stop_tx)(struct uart_8250_port *); + struct delayed_work overrun_backoff; + u32 overrun_backoff_time_ms; +}; + +struct uart_8250_em485 { + struct hrtimer start_tx_timer; + struct hrtimer stop_tx_timer; + struct hrtimer *active_timer; + struct uart_8250_port *port; + unsigned int tx_stopped: 1; + long: 32; +}; + +struct uart_8250_dma { + int (*tx_dma)(struct uart_8250_port *); + int (*rx_dma)(struct uart_8250_port *); + void (*prepare_tx_dma)(struct uart_8250_port *); + void (*prepare_rx_dma)(struct uart_8250_port *); + dma_filter_fn fn; + void *rx_param; + void *tx_param; + long: 32; + struct dma_slave_config rxconf; + struct dma_slave_config txconf; + struct dma_chan *rxchan; + struct dma_chan *txchan; + phys_addr_t rx_dma_addr; + phys_addr_t tx_dma_addr; + dma_addr_t rx_addr; + dma_addr_t tx_addr; + dma_cookie_t rx_cookie; + dma_cookie_t tx_cookie; + void *rx_buf; + size_t rx_size; + size_t tx_size; + unsigned char tx_running; + unsigned char tx_err; + unsigned char rx_running; +}; + +struct old_serial_port { + unsigned int uart; + unsigned int baud_base; + unsigned int port; + unsigned int irq; + upf_t flags; + unsigned char io_type; + unsigned char *iomem_base; + short unsigned int iomem_reg_shift; + long: 32; +}; + +struct irq_info___2 { + struct hlist_node node; + int irq; + spinlock_t lock; + struct list_head *head; +}; + +struct serial8250_config { + const char *name; + short unsigned int fifo_size; + short unsigned int tx_loadsz; + unsigned char fcr; + unsigned char rxtrig_bytes[4]; + unsigned int flags; +}; + +struct dw8250_port_data { + int line; + long: 32; + struct uart_8250_dma dma; + u8 dlf_size; + bool hw_rs485_support; + long: 32; +}; + +struct dw8250_platform_data { + u8 usr_reg; + u32 cpr_val; + unsigned int quirks; +}; + +struct dw8250_data { + struct dw8250_port_data data; + const struct dw8250_platform_data *pdata; + int msr_mask_on; + int msr_mask_off; + struct clk *clk; + struct clk *pclk; + struct notifier_block clk_notifier; + struct work_struct clk_work; + struct reset_control *rst; + unsigned int skip_autocfg: 1; + unsigned int uart_16550_compatible: 1; +}; + +struct pciserial_board { + unsigned int flags; + unsigned int num_ports; + unsigned int base_baud; + unsigned int uart_offset; + unsigned int reg_shift; + unsigned int first_offset; +}; + +struct serial_private; + +struct pci_serial_quirk { + u32 vendor; + u32 device; + u32 subvendor; + u32 subdevice; + int (*probe)(struct pci_dev *); + int (*init)(struct pci_dev *); + int (*setup)(struct serial_private *, const struct pciserial_board *, struct uart_8250_port *, int); + void (*exit)(struct pci_dev *); +}; + +struct serial_private { + struct pci_dev *dev; + unsigned int nr; + struct pci_serial_quirk *quirk; + const struct pciserial_board *board; + int line[0]; +}; + +struct f815xxa_data { + spinlock_t lock; + int idx; +}; + +struct timedia_struct { + int num; + const short unsigned int *ids; +}; + +enum pci_board_num_t { + pbn_default = 0, + pbn_b0_1_115200 = 1, + pbn_b0_2_115200 = 2, + pbn_b0_4_115200 = 3, + pbn_b0_5_115200 = 4, + pbn_b0_8_115200 = 5, + pbn_b0_1_921600 = 6, + pbn_b0_2_921600 = 7, + pbn_b0_4_921600 = 8, + pbn_b0_2_1130000 = 9, + pbn_b0_4_1152000 = 10, + pbn_b0_4_1250000 = 11, + pbn_b0_2_1843200 = 12, + pbn_b0_4_1843200 = 13, + pbn_b0_1_15625000 = 14, + pbn_b0_bt_1_115200 = 15, + pbn_b0_bt_2_115200 = 16, + pbn_b0_bt_4_115200 = 17, + pbn_b0_bt_8_115200 = 18, + pbn_b0_bt_1_460800 = 19, + pbn_b0_bt_2_460800 = 20, + pbn_b0_bt_4_460800 = 21, + pbn_b0_bt_1_921600 = 22, + pbn_b0_bt_2_921600 = 23, + pbn_b0_bt_4_921600 = 24, + pbn_b0_bt_8_921600 = 25, + pbn_b1_1_115200 = 26, + pbn_b1_2_115200 = 27, + pbn_b1_4_115200 = 28, + pbn_b1_8_115200 = 29, + pbn_b1_16_115200 = 30, + pbn_b1_1_921600 = 31, + pbn_b1_2_921600 = 32, + pbn_b1_4_921600 = 33, + pbn_b1_8_921600 = 34, + pbn_b1_2_1250000 = 35, + pbn_b1_bt_1_115200 = 36, + pbn_b1_bt_2_115200 = 37, + pbn_b1_bt_4_115200 = 38, + pbn_b1_bt_2_921600 = 39, + pbn_b1_1_1382400 = 40, + pbn_b1_2_1382400 = 41, + pbn_b1_4_1382400 = 42, + pbn_b1_8_1382400 = 43, + pbn_b2_1_115200 = 44, + pbn_b2_2_115200 = 45, + pbn_b2_4_115200 = 46, + pbn_b2_8_115200 = 47, + pbn_b2_1_460800 = 48, + pbn_b2_4_460800 = 49, + pbn_b2_8_460800 = 50, + pbn_b2_16_460800 = 51, + pbn_b2_1_921600 = 52, + pbn_b2_4_921600 = 53, + pbn_b2_8_921600 = 54, + pbn_b2_8_1152000 = 55, + pbn_b2_bt_1_115200 = 56, + pbn_b2_bt_2_115200 = 57, + pbn_b2_bt_4_115200 = 58, + pbn_b2_bt_2_921600 = 59, + pbn_b2_bt_4_921600 = 60, + pbn_b3_2_115200 = 61, + pbn_b3_4_115200 = 62, + pbn_b3_8_115200 = 63, + pbn_b4_bt_2_921600 = 64, + pbn_b4_bt_4_921600 = 65, + pbn_b4_bt_8_921600 = 66, + pbn_panacom = 67, + pbn_panacom2 = 68, + pbn_panacom4 = 69, + pbn_plx_romulus = 70, + pbn_oxsemi = 71, + pbn_oxsemi_1_15625000 = 72, + pbn_oxsemi_2_15625000 = 73, + pbn_oxsemi_4_15625000 = 74, + pbn_oxsemi_8_15625000 = 75, + pbn_intel_i960 = 76, + pbn_sgi_ioc3 = 77, + pbn_computone_4 = 78, + pbn_computone_6 = 79, + pbn_computone_8 = 80, + pbn_sbsxrsio = 81, + pbn_pasemi_1682M = 82, + pbn_ni8430_2 = 83, + pbn_ni8430_4 = 84, + pbn_ni8430_8 = 85, + pbn_ni8430_16 = 86, + pbn_ADDIDATA_PCIe_1_3906250 = 87, + pbn_ADDIDATA_PCIe_2_3906250 = 88, + pbn_ADDIDATA_PCIe_4_3906250 = 89, + pbn_ADDIDATA_PCIe_8_3906250 = 90, + pbn_ce4100_1_115200 = 91, + pbn_omegapci = 92, + pbn_NETMOS9900_2s_115200 = 93, + pbn_brcm_trumanage = 94, + pbn_fintek_4 = 95, + pbn_fintek_8 = 96, + pbn_fintek_12 = 97, + pbn_fintek_F81504A = 98, + pbn_fintek_F81508A = 99, + pbn_fintek_F81512A = 100, + pbn_wch382_2 = 101, + pbn_wch384_4 = 102, + pbn_wch384_8 = 103, + pbn_sunix_pci_1s = 104, + pbn_sunix_pci_2s = 105, + pbn_sunix_pci_4s = 106, + pbn_sunix_pci_8s = 107, + pbn_sunix_pci_16s = 108, + pbn_titan_1_4000000 = 109, + pbn_titan_2_4000000 = 110, + pbn_titan_4_4000000 = 111, + pbn_titan_8_4000000 = 112, + pbn_moxa8250_2p = 113, + pbn_moxa8250_4p = 114, + pbn_moxa8250_8p = 115, +}; + +struct bcm2835aux_data { + struct clk *clk; + int line; + u32 cntl; +}; + +struct bcm2835_aux_serial_driver_data { + resource_size_t offset; +}; + +struct pericom8250 { + void *virt; + unsigned int nr; + int line[0]; +}; + +struct tegra_uart { + struct clk *clk; + struct reset_control *rst; + int line; +}; + +struct of_serial_info { + struct clk *clk; + struct reset_control *rst; + int type; + int line; +}; + +struct amba_pl010_data { + void (*set_mctrl)(struct amba_device *, void *, unsigned int); +}; + +struct uart_amba_port { + struct uart_port port; + struct clk *clk; + struct amba_device *dev; + struct amba_pl010_data *data; + unsigned int old_status; +}; + +struct amba_pl011_data { + bool (*dma_filter)(struct dma_chan *, void *); + void *dma_rx_param; + void *dma_tx_param; + bool dma_rx_poll_enable; + unsigned int dma_rx_poll_rate; + unsigned int dma_rx_poll_timeout; + void (*init)(); + void (*exit)(); +}; + +enum { + REG_DR = 0, + REG_ST_DMAWM = 1, + REG_ST_TIMEOUT = 2, + REG_FR = 3, + REG_LCRH_RX = 4, + REG_LCRH_TX = 5, + REG_IBRD = 6, + REG_FBRD = 7, + REG_CR = 8, + REG_IFLS = 9, + REG_IMSC = 10, + REG_RIS = 11, + REG_MIS = 12, + REG_ICR = 13, + REG_DMACR = 14, + REG_ST_XFCR = 15, + REG_ST_XON1 = 16, + REG_ST_XON2 = 17, + REG_ST_XOFF1 = 18, + REG_ST_XOFF2 = 19, + REG_ST_ITCR = 20, + REG_ST_ITIP = 21, + REG_ST_ABCR = 22, + REG_ST_ABIMSC = 23, + REG_ARRAY_SIZE = 24, +}; + +struct vendor_data___2 { + const u16 *reg_offset; + unsigned int ifls; + unsigned int fr_busy; + unsigned int fr_dsr; + unsigned int fr_cts; + unsigned int fr_ri; + unsigned int inv_fr; + bool access_32b; + bool oversampling; + bool dma_threshold; + bool cts_event_workaround; + bool always_enabled; + bool fixed_options; + unsigned int (*get_fifosize)(struct amba_device *); +}; + +struct pl011_sgbuf { + struct scatterlist sg; + char *buf; + long: 32; +}; + +struct pl011_dmarx_data { + struct dma_chan *chan; + struct completion complete; + bool use_buf_b; + struct pl011_sgbuf sgbuf_a; + struct pl011_sgbuf sgbuf_b; + dma_cookie_t cookie; + bool running; + struct timer_list timer; + unsigned int last_residue; + long unsigned int last_jiffies; + bool auto_poll_rate; + unsigned int poll_rate; + unsigned int poll_timeout; +}; + +struct pl011_dmatx_data { + struct dma_chan *chan; + long: 32; + struct scatterlist sg; + char *buf; + bool queued; +}; + +struct uart_amba_port___2 { + struct uart_port port; + const u16 *reg_offset; + struct clk *clk; + const struct vendor_data___2 *vendor; + unsigned int dmacr; + unsigned int im; + unsigned int old_status; + unsigned int fifosize; + unsigned int fixed_baud; + char type[12]; + bool rs485_tx_started; + unsigned int rs485_tx_drain_interval; + bool using_tx_dma; + bool using_rx_dma; + struct pl011_dmarx_data dmarx; + struct pl011_dmatx_data dmatx; + bool dma_probed; + long: 32; +}; + +struct s3c2410_uartcfg { + unsigned char hwport; + unsigned char unused; + short unsigned int flags; + long: 32; + upf_t uart_flags; + unsigned int clk_sel; + unsigned int has_fracval; + long unsigned int ucon; + long unsigned int ulcon; + long unsigned int ufcon; + long: 32; +}; + +enum s3c24xx_port_type { + TYPE_S3C24XX = 0, + TYPE_S3C6400 = 1, + TYPE_APPLE_S5L = 2, +}; + +struct s3c24xx_uart_info { + const char *name; + enum s3c24xx_port_type type; + unsigned int port_type; + unsigned int fifosize; + long unsigned int rx_fifomask; + long unsigned int rx_fifoshift; + long unsigned int rx_fifofull; + long unsigned int tx_fifomask; + long unsigned int tx_fifoshift; + long unsigned int tx_fifofull; + unsigned int def_clk_sel; + long unsigned int num_clks; + long unsigned int clksel_mask; + long unsigned int clksel_shift; + long unsigned int ucon_mask; + unsigned int has_divslot: 1; +}; + +struct s3c24xx_serial_drv_data { + const struct s3c24xx_uart_info info; + const struct s3c2410_uartcfg def_cfg; + const unsigned int fifosize[4]; +}; + +struct s3c24xx_uart_dma { + unsigned int rx_chan_id; + unsigned int tx_chan_id; + struct dma_slave_config rx_conf; + struct dma_slave_config tx_conf; + struct dma_chan *rx_chan; + struct dma_chan *tx_chan; + dma_addr_t rx_addr; + dma_addr_t tx_addr; + dma_cookie_t rx_cookie; + dma_cookie_t tx_cookie; + char *rx_buf; + long: 32; + dma_addr_t tx_transfer_addr; + size_t rx_size; + size_t tx_size; + struct dma_async_tx_descriptor *tx_desc; + struct dma_async_tx_descriptor *rx_desc; + int tx_bytes_requested; + int rx_bytes_requested; +}; + +struct s3c24xx_uart_port { + unsigned char rx_claimed; + unsigned char tx_claimed; + unsigned char rx_enabled; + unsigned char tx_enabled; + unsigned int pm_level; + long unsigned int baudclk_rate; + unsigned int min_dma_size; + unsigned int rx_irq; + unsigned int tx_irq; + unsigned int tx_in_progress; + unsigned int tx_mode; + unsigned int rx_mode; + const struct s3c24xx_uart_info *info; + struct clk *clk; + struct clk *baudclk; + struct uart_port port; + const struct s3c24xx_serial_drv_data *drv_data; + const struct s3c2410_uartcfg *cfg; + struct s3c24xx_uart_dma *dma; + long: 32; +}; + +struct samsung_early_console_data { + u32 txfull_mask; + u32 rxfifo_mask; +}; + +enum imx_uart_type { + IMX1_UART = 0, + IMX21_UART = 1, + IMX53_UART = 2, + IMX6Q_UART = 3, +}; + +struct imx_uart_data { + unsigned int uts_reg; + enum imx_uart_type devtype; +}; + +enum imx_tx_state { + OFF = 0, + WAIT_AFTER_RTS = 1, + SEND = 2, + WAIT_AFTER_SEND = 3, +}; + +struct imx_port { + struct uart_port port; + struct timer_list timer; + unsigned int old_status; + unsigned int have_rtscts: 1; + unsigned int have_rtsgpio: 1; + unsigned int dte_mode: 1; + unsigned int inverted_tx: 1; + unsigned int inverted_rx: 1; + struct clk *clk_ipg; + struct clk *clk_per; + const struct imx_uart_data *devdata; + struct mctrl_gpios *gpios; + unsigned int ucr1; + unsigned int ucr2; + unsigned int ucr3; + unsigned int ucr4; + unsigned int ufcr; + unsigned int dma_is_enabled: 1; + unsigned int dma_is_rxing: 1; + unsigned int dma_is_txing: 1; + struct dma_chan *dma_chan_rx; + struct dma_chan *dma_chan_tx; + long: 32; + struct scatterlist rx_sgl; + struct scatterlist tx_sgl[2]; + void *rx_buf; + struct circ_buf rx_ring; + unsigned int rx_buf_size; + unsigned int rx_period_length; + unsigned int rx_periods; + dma_cookie_t rx_cookie; + unsigned int tx_bytes; + unsigned int dma_tx_nents; + unsigned int saved_reg[10]; + bool context_saved; + enum imx_tx_state tx_state; + struct hrtimer trigger_start_tx; + struct hrtimer trigger_stop_tx; +}; + +struct imx_port_ucrs { + unsigned int ucr1; + unsigned int ucr2; + unsigned int ucr3; +}; + +struct meson_uart_data { + bool has_xtal_div2; +}; + +struct pm_qos_request { + struct plist_node node; + struct pm_qos_constraints *qos; +}; + +struct omap_uart_port_info { + bool dma_enabled; + unsigned int uartclk; + upf_t flags; + unsigned int dma_rx_buf_size; + unsigned int dma_rx_timeout; + unsigned int autosuspend_timeout; + unsigned int dma_rx_poll_rate; + int (*get_context_loss_count)(struct device *); + void (*enable_wakeup)(struct device *, bool); +}; + +struct uart_omap_dma { + u8 uart_dma_tx; + u8 uart_dma_rx; + int rx_dma_channel; + int tx_dma_channel; + long: 32; + dma_addr_t rx_buf_dma_phys; + dma_addr_t tx_buf_dma_phys; + unsigned int uart_base; + unsigned char *rx_buf; + unsigned int prev_rx_dma_pos; + int tx_buf_size; + int tx_dma_used; + int rx_dma_used; + spinlock_t tx_lock; + spinlock_t rx_lock; + struct timer_list rx_timer; + unsigned int rx_buf_size; + unsigned int rx_poll_rate; + unsigned int rx_timeout; +}; + +struct uart_omap_port { + struct uart_port port; + struct uart_omap_dma uart_dma; + struct device *dev; + int wakeirq; + unsigned char ier; + unsigned char lcr; + unsigned char mcr; + unsigned char fcr; + unsigned char efr; + unsigned char dll; + unsigned char dlh; + unsigned char mdr1; + unsigned char scr; + unsigned char wer; + int use_dma; + unsigned int lsr_break_flag; + unsigned char msr_saved_flags; + char name[20]; + long unsigned int port_activity; + int context_loss_cnt; + u32 errata; + u32 features; + struct gpio_desc *rts_gpiod; + struct pm_qos_request pm_qos_request; + u32 latency; + u32 calc_latency; + struct work_struct qos_work; + bool is_suspending; + unsigned int rs485_tx_filter_count; +}; + +struct vt8500_port { + struct uart_port uart; + char name[16]; + struct clk *clk; + unsigned int clk_predivisor; + unsigned int ier; + unsigned int vt8500_uart_flags; +}; + +struct tegra_uart_chip_data { + bool tx_fifo_full_status; + bool allow_txfifo_reset_fifo_mode; + bool support_clk_src_div; + bool fifo_mode_enable_status; + int uart_max_port; + int max_dma_burst_bytes; + int error_tolerance_low_range; + int error_tolerance_high_range; +}; + +struct tegra_baud_tolerance { + u32 lower_range_baud; + u32 upper_range_baud; + s32 tolerance; +}; + +struct tegra_uart_port { + struct uart_port uport; + const struct tegra_uart_chip_data *cdata; + struct clk *uart_clk; + struct reset_control *rst; + unsigned int current_baud; + long unsigned int fcr_shadow; + long unsigned int mcr_shadow; + long unsigned int lcr_shadow; + long unsigned int ier_shadow; + bool rts_active; + int tx_in_progress; + unsigned int tx_bytes; + bool enable_modem_interrupt; + bool rx_timeout; + int rx_in_progress; + int symb_bit; + struct dma_chan *rx_dma_chan; + struct dma_chan *tx_dma_chan; + dma_addr_t rx_dma_buf_phys; + dma_addr_t tx_dma_buf_phys; + unsigned char *rx_dma_buf_virt; + unsigned char *tx_dma_buf_virt; + struct dma_async_tx_descriptor *tx_dma_desc; + struct dma_async_tx_descriptor *rx_dma_desc; + dma_cookie_t tx_cookie; + dma_cookie_t rx_cookie; + unsigned int tx_bytes_requested; + unsigned int rx_bytes_requested; + struct tegra_baud_tolerance *baud_tolerance; + int n_adjustable_baud_rates; + int required_rate; + int configured_rate; + bool use_rx_pio; + bool use_tx_pio; + bool rx_dma_active; + long: 32; +}; + +struct arc_uart_port { + struct uart_port port; + long unsigned int baud; + long: 32; +}; + +enum mctrl_gpio_idx { + UART_GPIO_CTS = 0, + UART_GPIO_DSR = 1, + UART_GPIO_DCD = 2, + UART_GPIO_RNG = 3, + UART_GPIO_RI = 3, + UART_GPIO_RTS = 4, + UART_GPIO_DTR = 5, + UART_GPIO_MAX = 6, +}; + +struct stm32_usart_offsets { + u8 cr1; + u8 cr2; + u8 cr3; + u8 brr; + u8 gtpr; + u8 rtor; + u8 rqr; + u8 isr; + u8 icr; + u8 rdr; + u8 tdr; +}; + +struct stm32_usart_config { + u8 uart_enable_bit; + bool has_7bits_data; + bool has_swap; + bool has_wakeup; + bool has_fifo; + int fifosize; +}; + +struct stm32_usart_info { + struct stm32_usart_offsets ofs; + struct stm32_usart_config cfg; +}; + +struct stm32_port { + struct uart_port port; + struct clk *clk; + const struct stm32_usart_info *info; + struct dma_chan *rx_ch; + long: 32; + dma_addr_t rx_dma_buf; + unsigned char *rx_buf; + struct dma_chan *tx_ch; + dma_addr_t tx_dma_buf; + unsigned char *tx_buf; + u32 cr1_irq; + u32 cr3_irq; + int last_res; + bool tx_dma_busy; + bool throttled; + bool hw_flow_control; + bool swap; + bool fifoen; + bool txdone; + int rxftcfg; + int txftcfg; + bool wakeup_src; + int rdr_mask; + struct mctrl_gpios *gpios; + struct dma_tx_state rx_dma_state; + long: 32; +}; + +struct mctrl_gpios { + struct uart_port *port; + struct gpio_desc *gpio[6]; + int irq[6]; + unsigned int mctrl_prev; + bool mctrl_on; +}; + +struct serdev_device; + +struct serdev_device_ops { + int (*receive_buf)(struct serdev_device *, const unsigned char *, size_t); + void (*write_wakeup)(struct serdev_device *); +}; + +struct serdev_controller; + +struct serdev_device { + struct device dev; + int nr; + struct serdev_controller *ctrl; + const struct serdev_device_ops *ops; + struct completion write_comp; + struct mutex write_lock; +}; + +struct serdev_controller_ops; + +struct serdev_controller { + struct device dev; + unsigned int nr; + struct serdev_device *serdev; + const struct serdev_controller_ops *ops; + long: 32; +}; + +struct serdev_device_driver { + struct device_driver driver; + int (*probe)(struct serdev_device *); + void (*remove)(struct serdev_device *); +}; + +enum serdev_parity { + SERDEV_PARITY_NONE = 0, + SERDEV_PARITY_EVEN = 1, + SERDEV_PARITY_ODD = 2, +}; + +struct serdev_controller_ops { + int (*write_buf)(struct serdev_controller *, const unsigned char *, size_t); + void (*write_flush)(struct serdev_controller *); + int (*write_room)(struct serdev_controller *); + int (*open)(struct serdev_controller *); + void (*close)(struct serdev_controller *); + void (*set_flow_control)(struct serdev_controller *, bool); + int (*set_parity)(struct serdev_controller *, enum serdev_parity); + unsigned int (*set_baudrate)(struct serdev_controller *, unsigned int); + void (*wait_until_sent)(struct serdev_controller *, long int); + int (*get_tiocm)(struct serdev_controller *); + int (*set_tiocm)(struct serdev_controller *, unsigned int, unsigned int); +}; + +struct serport { + struct tty_port *port; + struct tty_struct *tty; + struct tty_driver *tty_drv; + int tty_idx; + long unsigned int flags; +}; + +struct memdev { + const char *name; + umode_t mode; + const struct file_operations *fops; + fmode_t fmode; +}; + +typedef long unsigned int cycles_t; + +struct timer_rand_state { + long unsigned int last_time; + long int last_delta; + long int last_delta2; +}; + +enum chacha_constants { + CHACHA_CONSTANT_EXPA = 1634760805, + CHACHA_CONSTANT_ND_3 = 857760878, + CHACHA_CONSTANT_2_BY = 2036477234, + CHACHA_CONSTANT_TE_K = 1797285236, +}; + +enum { + CRNG_EMPTY = 0, + CRNG_EARLY = 1, + CRNG_READY = 2, +}; + +enum { + CRNG_RESEED_START_INTERVAL = 250, + CRNG_RESEED_INTERVAL = 15000, +}; + +struct crng { + u8 key[32]; + long unsigned int generation; + local_lock_t lock; +}; + +struct batch_u8 { + u8 entropy[96]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +struct batch_u16 { + u16 entropy[48]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +struct batch_u32 { + u32 entropy[24]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +struct batch_u64 { + u64 entropy[12]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +enum { + POOL_BITS = 256, + POOL_READY_BITS = 256, + POOL_EARLY_BITS = 128, +}; + +struct fast_pool { + long unsigned int pool[4]; + long unsigned int last; + unsigned int count; + struct timer_list mix; +}; + +struct entropy_timer_state { + long unsigned int entropy; + struct timer_list timer; + atomic_t samples; + unsigned int samples_per_bit; +}; + +enum { + NUM_TRIAL_SAMPLES = 8192, + MAX_SAMPLES_PER_BIT = 16, +}; + +enum { + MIX_INFLIGHT = 2147483648, +}; + +typedef long unsigned int u_long; + +typedef short unsigned int apm_event_t; + +struct apm_power_info { + unsigned char ac_line_status; + unsigned char battery_status; + unsigned char battery_flag; + int battery_life; + int time; + int units; +}; + +struct apm_queue { + unsigned int event_head; + unsigned int event_tail; + apm_event_t events[16]; +}; + +enum apm_suspend_state { + SUSPEND_NONE = 0, + SUSPEND_PENDING = 1, + SUSPEND_READ = 2, + SUSPEND_ACKED = 3, + SUSPEND_ACKTO = 4, + SUSPEND_WAIT = 5, + SUSPEND_DONE = 6, +}; + +struct apm_user { + struct list_head list; + unsigned int suser: 1; + unsigned int writer: 1; + unsigned int reader: 1; + int suspend_result; + enum apm_suspend_state suspend_state; + struct apm_queue queue; +}; + +enum iommu_resv_type { + IOMMU_RESV_DIRECT = 0, + IOMMU_RESV_DIRECT_RELAXABLE = 1, + IOMMU_RESV_RESERVED = 2, + IOMMU_RESV_MSI = 3, + IOMMU_RESV_SW_MSI = 4, +}; + +struct iommu_resv_region { + struct list_head list; + phys_addr_t start; + size_t length; + int prot; + enum iommu_resv_type type; + void (*free)(struct device *, struct iommu_resv_region *); +}; + +struct iommu_iort_rmr_data { + struct iommu_resv_region rr; + const u32 *sids; + u32 num_sids; +}; + +enum io_pgtable_fmt { + ARM_32_LPAE_S1 = 0, + ARM_32_LPAE_S2 = 1, + ARM_64_LPAE_S1 = 2, + ARM_64_LPAE_S2 = 3, + ARM_V7S = 4, + ARM_MALI_LPAE = 5, + AMD_IOMMU_V1 = 6, + AMD_IOMMU_V2 = 7, + APPLE_DART = 8, + APPLE_DART2 = 9, + IO_PGTABLE_NUM_FMTS = 10, +}; + +struct iommu_flush_ops { + void (*tlb_flush_all)(void *); + void (*tlb_flush_walk)(long unsigned int, size_t, size_t, void *); + void (*tlb_add_page)(struct iommu_iotlb_gather *, long unsigned int, size_t, void *); +}; + +struct io_pgtable_cfg { + long unsigned int quirks; + long unsigned int pgsize_bitmap; + unsigned int ias; + unsigned int oas; + bool coherent_walk; + const struct iommu_flush_ops *tlb; + struct device *iommu_dev; + long: 32; + union { + struct { + u64 ttbr; + struct { + u32 ips: 3; + u32 tg: 2; + u32 sh: 2; + u32 orgn: 2; + u32 irgn: 2; + u32 tsz: 6; + } tcr; + long: 32; + u64 mair; + } arm_lpae_s1_cfg; + struct { + u64 vttbr; + struct { + u32 ps: 3; + u32 tg: 2; + u32 sh: 2; + u32 orgn: 2; + u32 irgn: 2; + u32 sl: 2; + u32 tsz: 6; + } vtcr; + long: 32; + } arm_lpae_s2_cfg; + struct { + u32 ttbr; + u32 tcr; + u32 nmrr; + u32 prrr; + } arm_v7s_cfg; + struct { + u64 transtab; + u64 memattr; + } arm_mali_lpae_cfg; + struct { + u64 ttbr[4]; + u32 n_ttbrs; + long: 32; + } apple_dart_cfg; + }; +}; + +struct io_pgtable_ops { + int (*map_pages)(struct io_pgtable_ops *, long unsigned int, phys_addr_t, size_t, size_t, int, gfp_t, size_t *); + size_t (*unmap_pages)(struct io_pgtable_ops *, long unsigned int, size_t, size_t, struct iommu_iotlb_gather *); + phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *, long unsigned int); +}; + +enum arm_smmu_s2cr_privcfg { + S2CR_PRIVCFG_DEFAULT = 0, + S2CR_PRIVCFG_DIPAN = 1, + S2CR_PRIVCFG_UNPRIV = 2, + S2CR_PRIVCFG_PRIV = 3, +}; + +enum arm_smmu_s2cr_type { + S2CR_TYPE_TRANS = 0, + S2CR_TYPE_BYPASS = 1, + S2CR_TYPE_FAULT = 2, +}; + +enum arm_smmu_cbar_type { + CBAR_TYPE_S2_TRANS = 0, + CBAR_TYPE_S1_TRANS_S2_BYPASS = 1, + CBAR_TYPE_S1_TRANS_S2_FAULT = 2, + CBAR_TYPE_S1_TRANS_S2_TRANS = 3, +}; + +enum arm_smmu_arch_version { + ARM_SMMU_V1 = 0, + ARM_SMMU_V1_64K = 1, + ARM_SMMU_V2 = 2, +}; + +enum arm_smmu_implementation { + GENERIC_SMMU = 0, + ARM_MMU500 = 1, + CAVIUM_SMMUV2 = 2, + QCOM_SMMUV2 = 3, +}; + +struct arm_smmu_s2cr { + struct iommu_group *group; + int count; + enum arm_smmu_s2cr_type type; + enum arm_smmu_s2cr_privcfg privcfg; + u8 cbndx; +}; + +struct arm_smmu_smr { + u16 mask; + u16 id; + bool valid; + bool pinned; +}; + +struct arm_smmu_impl; + +struct arm_smmu_cb; + +struct arm_smmu_device { + struct device *dev; + void *base; + phys_addr_t ioaddr; + unsigned int numpage; + unsigned int pgshift; + u32 features; + enum arm_smmu_arch_version version; + enum arm_smmu_implementation model; + const struct arm_smmu_impl *impl; + u32 num_context_banks; + u32 num_s2_context_banks; + long unsigned int context_map[4]; + struct arm_smmu_cb *cbs; + atomic_t irptndx; + u32 num_mapping_groups; + u16 streamid_mask; + u16 smr_mask_mask; + struct arm_smmu_smr *smrs; + struct arm_smmu_s2cr *s2crs; + struct mutex stream_map_mutex; + long unsigned int va_size; + long unsigned int ipa_size; + long unsigned int pa_size; + long unsigned int pgsize_bitmap; + int num_context_irqs; + int num_clks; + unsigned int *irqs; + struct clk_bulk_data *clks; + spinlock_t global_sync_lock; + struct iommu_device iommu; +}; + +struct arm_smmu_domain; + +struct arm_smmu_impl { + u32 (*read_reg)(struct arm_smmu_device *, int, int); + void (*write_reg)(struct arm_smmu_device *, int, int, u32); + u64 (*read_reg64)(struct arm_smmu_device *, int, int); + void (*write_reg64)(struct arm_smmu_device *, int, int, u64); + int (*cfg_probe)(struct arm_smmu_device *); + int (*reset)(struct arm_smmu_device *); + int (*init_context)(struct arm_smmu_domain *, struct io_pgtable_cfg *, struct device *); + void (*tlb_sync)(struct arm_smmu_device *, int, int, int); + int (*def_domain_type)(struct device *); + irqreturn_t (*global_fault)(int, void *); + irqreturn_t (*context_fault)(int, void *); + int (*alloc_context_bank)(struct arm_smmu_domain *, struct arm_smmu_device *, struct device *, int); + void (*write_s2cr)(struct arm_smmu_device *, int); + void (*write_sctlr)(struct arm_smmu_device *, int, u32); + void (*probe_finalize)(struct arm_smmu_device *, struct device *); +}; + +struct arm_smmu_cfg; + +struct arm_smmu_cb { + u64 ttbr[2]; + u32 tcr[2]; + u32 mair[2]; + struct arm_smmu_cfg *cfg; + long: 32; +}; + +enum arm_smmu_context_fmt { + ARM_SMMU_CTX_FMT_NONE = 0, + ARM_SMMU_CTX_FMT_AARCH64 = 1, + ARM_SMMU_CTX_FMT_AARCH32_L = 2, + ARM_SMMU_CTX_FMT_AARCH32_S = 3, +}; + +struct arm_smmu_cfg { + u8 cbndx; + u8 irptndx; + union { + u16 asid; + u16 vmid; + }; + enum arm_smmu_cbar_type cbar; + enum arm_smmu_context_fmt fmt; + bool flush_walk_prefer_tlbiasid; +}; + +enum arm_smmu_domain_stage { + ARM_SMMU_DOMAIN_S1 = 0, + ARM_SMMU_DOMAIN_S2 = 1, + ARM_SMMU_DOMAIN_NESTED = 2, + ARM_SMMU_DOMAIN_BYPASS = 3, +}; + +struct arm_smmu_domain { + struct arm_smmu_device *smmu; + struct io_pgtable_ops *pgtbl_ops; + long unsigned int pgtbl_quirks; + const struct iommu_flush_ops *flush_ops; + struct arm_smmu_cfg cfg; + enum arm_smmu_domain_stage stage; + struct mutex init_mutex; + spinlock_t cb_lock; + long: 32; + struct iommu_domain domain; +}; + +struct arm_smmu_master_cfg { + struct arm_smmu_device *smmu; + s16 smendx[0]; +}; + +struct arm_smmu_match_data { + enum arm_smmu_arch_version version; + enum arm_smmu_implementation model; +}; + +struct cavium_smmu { + struct arm_smmu_device smmu; + u32 id_base; + long: 32; +}; + +struct icc_node; + +struct icc_node_data { + struct icc_node *node; + u32 tag; +}; + +struct icc_provider; + +struct icc_node { + int id; + const char *name; + struct icc_node **links; + size_t num_links; + struct icc_provider *provider; + struct list_head node_list; + struct list_head search_list; + struct icc_node *reverse; + u8 is_traversed: 1; + struct hlist_head req_list; + u32 avg_bw; + u32 peak_bw; + u32 init_avg; + u32 init_peak; + void *data; +}; + +struct icc_provider { + struct list_head provider_list; + struct list_head nodes; + int (*set)(struct icc_node *, struct icc_node *); + int (*aggregate)(struct icc_node *, u32, u32, u32, u32 *, u32 *); + void (*pre_aggregate)(struct icc_node *); + int (*get_bw)(struct icc_node *, u32 *, u32 *); + struct icc_node * (*xlate)(struct of_phandle_args *, void *); + struct icc_node_data * (*xlate_extended)(struct of_phandle_args *, void *); + struct device *dev; + int users; + bool inter_set; + void *data; +}; + +struct tegra_mc_timing { + long unsigned int rate; + u32 *emem_data; +}; + +struct tegra_mc_client { + unsigned int id; + const char *name; + union { + unsigned int swgroup; + unsigned int sid; + }; + unsigned int fifo_size; + struct { + struct { + unsigned int reg; + unsigned int bit; + } smmu; + struct { + unsigned int reg; + unsigned int shift; + unsigned int mask; + unsigned int def; + } la; + struct { + unsigned int override; + unsigned int security; + } sid; + } regs; +}; + +struct tegra_smmu_swgroup { + const char *name; + unsigned int swgroup; + unsigned int reg; +}; + +struct tegra_smmu_group_soc { + const char *name; + const unsigned int *swgroups; + unsigned int num_swgroups; +}; + +struct tegra_smmu_soc { + const struct tegra_mc_client *clients; + unsigned int num_clients; + const struct tegra_smmu_swgroup *swgroups; + unsigned int num_swgroups; + const struct tegra_smmu_group_soc *groups; + unsigned int num_groups; + bool supports_round_robin_arbitration; + bool supports_request_limit; + unsigned int num_tlb_lines; + unsigned int num_asids; +}; + +struct tegra_mc_reset { + const char *name; + long unsigned int id; + unsigned int control; + unsigned int status; + unsigned int reset; + unsigned int bit; +}; + +struct tegra_mc; + +struct tegra_mc_reset_ops { + int (*hotreset_assert)(struct tegra_mc *, const struct tegra_mc_reset *); + int (*hotreset_deassert)(struct tegra_mc *, const struct tegra_mc_reset *); + int (*block_dma)(struct tegra_mc *, const struct tegra_mc_reset *); + bool (*dma_idling)(struct tegra_mc *, const struct tegra_mc_reset *); + int (*unblock_dma)(struct tegra_mc *, const struct tegra_mc_reset *); + int (*reset_status)(struct tegra_mc *, const struct tegra_mc_reset *); +}; + +struct gart_device; + +struct tegra_smmu; + +struct tegra_mc_soc; + +struct tegra_mc { + struct device *dev; + struct tegra_smmu *smmu; + struct gart_device *gart; + void *regs; + void *bcast_ch_regs; + void **ch_regs; + struct clk *clk; + int irq; + const struct tegra_mc_soc *soc; + long unsigned int tick; + struct tegra_mc_timing *timings; + unsigned int num_timings; + struct reset_controller_dev reset; + struct icc_provider provider; + spinlock_t lock; + struct { + struct dentry *root; + } debugfs; +}; + +struct tegra_mc_icc_ops { + int (*set)(struct icc_node *, struct icc_node *); + int (*aggregate)(struct icc_node *, u32, u32, u32, u32 *, u32 *); + struct icc_node_data * (*xlate_extended)(struct of_phandle_args *, void *); +}; + +struct tegra_mc_ops { + int (*probe)(struct tegra_mc *); + void (*remove)(struct tegra_mc *); + int (*suspend)(struct tegra_mc *); + int (*resume)(struct tegra_mc *); + irqreturn_t (*handle_irq)(int, void *); + int (*probe_device)(struct tegra_mc *, struct device *); +}; + +struct tegra_mc_soc { + const struct tegra_mc_client *clients; + unsigned int num_clients; + const long unsigned int *emem_regs; + unsigned int num_emem_regs; + unsigned int num_address_bits; + unsigned int atom_size; + unsigned int num_carveouts; + u16 client_id_mask; + u8 num_channels; + const struct tegra_smmu_soc *smmu; + u32 intmask; + u32 ch_intmask; + u32 global_intstatus_channel_shift; + bool has_addr_hi_reg; + const struct tegra_mc_reset_ops *reset_ops; + const struct tegra_mc_reset *resets; + unsigned int num_resets; + const struct tegra_mc_icc_ops *icc_ops; + const struct tegra_mc_ops *ops; +}; + +struct nvidia_smmu { + struct arm_smmu_device smmu; + void *bases[2]; + unsigned int num_instances; + struct tegra_mc *mc; +}; + +struct iommu_group { + struct kobject kobj; + struct kobject *devices_kobj; + struct list_head devices; + struct xarray pasid_array; + struct mutex mutex; + void *iommu_data; + void (*iommu_data_release)(void *); + char *name; + int id; + struct iommu_domain *default_domain; + struct iommu_domain *blocking_domain; + struct iommu_domain *domain; + struct list_head entry; + unsigned int owner_cnt; + void *owner; +}; + +enum iommu_fault_type { + IOMMU_FAULT_DMA_UNRECOV = 1, + IOMMU_FAULT_PAGE_REQ = 2, +}; + +struct fsl_mc_obj_desc { + char type[16]; + int id; + u16 vendor; + u16 ver_major; + u16 ver_minor; + u8 irq_count; + u8 region_count; + u32 state; + char label[16]; + u16 flags; +}; + +struct fsl_mc_io; + +struct fsl_mc_device_irq; + +struct fsl_mc_resource; + +struct fsl_mc_device { + struct device dev; + u64 dma_mask; + u16 flags; + u32 icid; + u16 mc_handle; + struct fsl_mc_io *mc_io; + struct fsl_mc_obj_desc obj_desc; + struct resource *regions; + struct fsl_mc_device_irq **irqs; + struct fsl_mc_resource *resource; + struct device_link *consumer_link; + const char *driver_override; +}; + +enum fsl_mc_pool_type { + FSL_MC_POOL_DPMCP = 0, + FSL_MC_POOL_DPBP = 1, + FSL_MC_POOL_DPCON = 2, + FSL_MC_POOL_IRQ = 3, + FSL_MC_NUM_POOL_TYPES = 4, +}; + +struct fsl_mc_resource_pool; + +struct fsl_mc_resource { + enum fsl_mc_pool_type type; + s32 id; + void *data; + struct fsl_mc_resource_pool *parent_pool; + struct list_head node; +}; + +struct fsl_mc_device_irq { + unsigned int virq; + struct fsl_mc_device *mc_dev; + u8 dev_irq_index; + struct fsl_mc_resource resource; +}; + +struct fsl_mc_io { + struct device *dev; + u16 flags; + u32 portal_size; + long: 32; + phys_addr_t portal_phys_addr; + void *portal_virt_addr; + struct fsl_mc_device *dpmcp_dev; + union { + struct mutex mutex; + raw_spinlock_t spinlock; + }; + long: 32; +}; + +struct group_device { + struct list_head list; + struct device *dev; + char *name; +}; + +struct iommu_group_attribute { + struct attribute attr; + ssize_t (*show)(struct iommu_group *, char *); + ssize_t (*store)(struct iommu_group *, const char *, size_t); +}; + +struct group_for_pci_data { + struct pci_dev *pdev; + struct iommu_group *group; +}; + +struct __group_domain_type { + struct device *dev; + unsigned int type; +}; + +struct trace_event_raw_iommu_group_event { + struct trace_entry ent; + int gid; + u32 __data_loc_device; + char __data[0]; +}; + +struct trace_event_raw_iommu_device_event { + struct trace_entry ent; + u32 __data_loc_device; + char __data[0]; +}; + +struct trace_event_raw_map { + struct trace_entry ent; + u64 iova; + u64 paddr; + size_t size; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_unmap { + struct trace_entry ent; + u64 iova; + size_t size; + size_t unmapped_size; + char __data[0]; +}; + +struct trace_event_raw_iommu_error { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + u64 iova; + int flags; + char __data[0]; + long: 32; +}; + +struct trace_event_data_offsets_iommu_group_event { + u32 device; +}; + +struct trace_event_data_offsets_iommu_device_event { + u32 device; +}; + +struct trace_event_data_offsets_map {}; + +struct trace_event_data_offsets_unmap {}; + +struct trace_event_data_offsets_iommu_error { + u32 device; + u32 driver; +}; + +typedef void (*btf_trace_add_device_to_group)(void *, int, struct device *); + +typedef void (*btf_trace_remove_device_from_group)(void *, int, struct device *); + +typedef void (*btf_trace_attach_device_to_domain)(void *, struct device *); + +typedef void (*btf_trace_detach_device_from_domain)(void *, struct device *); + +typedef void (*btf_trace_map)(void *, long unsigned int, phys_addr_t, size_t); + +typedef void (*btf_trace_unmap)(void *, long unsigned int, size_t, size_t); + +typedef void (*btf_trace_io_page_fault)(void *, struct device *, long unsigned int, int); + +struct io_pgtable { + enum io_pgtable_fmt fmt; + void *cookie; + struct io_pgtable_cfg cfg; + struct io_pgtable_ops ops; + long: 32; +}; + +struct io_pgtable_init_fns { + struct io_pgtable * (*alloc)(struct io_pgtable_cfg *, void *); + void (*free)(struct io_pgtable *); +}; + +struct arm_lpae_io_pgtable { + struct io_pgtable iop; + int pgd_bits; + int start_level; + int bits_per_level; + void *pgd; +}; + +typedef u64 arm_lpae_iopte; + +struct of_pci_iommu_alias_info { + struct device *dev; + struct device_node *np; +}; + +struct iotlb_entry { + u32 da; + u32 pa; + u32 pgsz; + u32 prsvd; + u32 valid; + u32 endian; + u32 elsz; + u32 mixed; +}; + +struct omap_iommu; + +struct omap_iommu_device { + u32 *pgtable; + struct omap_iommu *iommu_dev; +}; + +struct cr_regs; + +struct omap_iommu { + const char *name; + void *regbase; + struct regmap *syscfg; + struct device *dev; + struct iommu_domain *domain; + struct dentry *debug_dir; + spinlock_t iommu_lock; + u32 *iopgd; + spinlock_t page_table_lock; + long: 32; + dma_addr_t pd_dma; + int nr_tlb_entries; + void *ctx; + struct cr_regs *cr_ctx; + u32 num_cr_ctx; + int has_bus_err_back; + u32 id; + struct iommu_device iommu; + struct iommu_group *group; + u8 pwrst; +}; + +struct omap_iommu_domain { + u32 num_iommus; + struct omap_iommu_device *iommus; + struct device *dev; + spinlock_t lock; + struct iommu_domain domain; +}; + +struct cr_regs { + u32 cam; + u32 ram; +}; + +struct omap_iommu_arch_data { + struct omap_iommu *iommu_dev; + struct device *dev; +}; + +struct iotlb_lock { + short int base; + short int vict; +}; + +struct rk_iommu_domain { + struct list_head iommus; + u32 *dt; + long: 32; + dma_addr_t dt_dma; + spinlock_t iommus_lock; + spinlock_t dt_lock; + struct iommu_domain domain; +}; + +struct rk_iommu_ops { + phys_addr_t (*pt_address)(u32); + u32 (*mk_dtentries)(dma_addr_t); + u32 (*mk_ptentries)(phys_addr_t, int); + phys_addr_t (*dte_addr_phys)(u32); + u32 (*dma_addr_dte)(dma_addr_t); + long: 32; + u64 dma_bit_mask; +}; + +struct rk_iommu { + struct device *dev; + void **bases; + int num_mmu; + int num_irq; + struct clk_bulk_data *clocks; + int num_clocks; + bool reset_disabled; + struct iommu_device iommu; + struct list_head node; + struct iommu_domain *domain; + struct iommu_group *group; +}; + +struct rk_iommudata { + struct device_link *link; + struct rk_iommu *iommu; +}; + +struct tegra_smmu { + void *regs; + struct device *dev; + struct tegra_mc *mc; + const struct tegra_smmu_soc *soc; + struct list_head groups; + long unsigned int pfn_mask; + long unsigned int tlb_mask; + long unsigned int *asids; + struct mutex lock; + struct list_head list; + struct dentry *debugfs; + struct iommu_device iommu; +}; + +struct tegra_smmu_group { + struct list_head list; + struct tegra_smmu *smmu; + const struct tegra_smmu_group_soc *soc; + struct iommu_group *group; + unsigned int swgroup; +}; + +struct tegra_smmu_as { + struct iommu_domain domain; + struct tegra_smmu *smmu; + unsigned int use_count; + spinlock_t lock; + u32 *count; + struct page **pts; + struct page *pd; + dma_addr_t pd_dma; + unsigned int id; + u32 attr; +}; + +struct drm_dmi_panel_orientation_data { + int width; + int height; + const char * const *bios_dates; + int orientation; +}; + +struct drm_dsc_rc_range_parameters { + u8 range_min_qp; + u8 range_max_qp; + u8 range_bpg_offset; +}; + +struct drm_dsc_config { + u8 line_buf_depth; + u8 bits_per_component; + bool convert_rgb; + u8 slice_count; + u16 slice_width; + u16 slice_height; + bool simple_422; + u16 pic_width; + u16 pic_height; + u8 rc_tgt_offset_high; + u8 rc_tgt_offset_low; + u16 bits_per_pixel; + u8 rc_edge_factor; + u8 rc_quant_incr_limit1; + u8 rc_quant_incr_limit0; + u16 initial_xmit_delay; + u16 initial_dec_delay; + bool block_pred_enable; + u8 first_line_bpg_offset; + u16 initial_offset; + u16 rc_buf_thresh[14]; + struct drm_dsc_rc_range_parameters rc_range_params[15]; + u16 rc_model_size; + u8 flatness_min_qp; + u8 flatness_max_qp; + u8 initial_scale_value; + u16 scale_decrement_interval; + u16 scale_increment_interval; + u16 nfl_bpg_offset; + u16 slice_bpg_offset; + u16 final_offset; + bool vbr_enable; + u8 mux_word_size; + u16 slice_chunk_size; + u16 rc_bits; + u8 dsc_version_minor; + u8 dsc_version_major; + bool native_422; + bool native_420; + u8 second_line_bpg_offset; + u16 nsl_bpg_offset; + u16 second_line_offset_adj; +}; + +struct drm_dsc_picture_parameter_set { + u8 dsc_version; + u8 pps_identifier; + u8 pps_reserved; + u8 pps_3; + u8 pps_4; + u8 bits_per_pixel_low; + __be16 pic_height; + __be16 pic_width; + __be16 slice_height; + __be16 slice_width; + __be16 chunk_size; + u8 initial_xmit_delay_high; + u8 initial_xmit_delay_low; + __be16 initial_dec_delay; + u8 pps20_reserved; + u8 initial_scale_value; + __be16 scale_increment_interval; + u8 scale_decrement_interval_high; + u8 scale_decrement_interval_low; + u8 pps26_reserved; + u8 first_line_bpg_offset; + __be16 nfl_bpg_offset; + __be16 slice_bpg_offset; + __be16 initial_offset; + __be16 final_offset; + u8 flatness_min_qp; + u8 flatness_max_qp; + __be16 rc_model_size; + u8 rc_edge_factor; + u8 rc_quant_incr_limit0; + u8 rc_quant_incr_limit1; + u8 rc_tgt_offset; + u8 rc_buf_thresh[14]; + __be16 rc_range_parameters[15]; + u8 native_422_420; + u8 second_line_bpg_offset; + __be16 nsl_bpg_offset; + __be16 second_line_offset_adj; + u32 pps_long_94_reserved; + u32 pps_long_98_reserved; + u32 pps_long_102_reserved; + u32 pps_long_106_reserved; + u32 pps_long_110_reserved; + u32 pps_long_114_reserved; + u32 pps_long_118_reserved; + u32 pps_long_122_reserved; + __be16 pps_short_126_reserved; +} __attribute__((packed)); + +struct mipi_dsi_msg { + u8 channel; + u8 type; + u16 flags; + size_t tx_len; + const void *tx_buf; + size_t rx_len; + void *rx_buf; +}; + +struct mipi_dsi_packet { + size_t size; + u8 header[4]; + size_t payload_length; + const u8 *payload; +}; + +struct mipi_dsi_host; + +struct mipi_dsi_device; + +struct mipi_dsi_host_ops { + int (*attach)(struct mipi_dsi_host *, struct mipi_dsi_device *); + int (*detach)(struct mipi_dsi_host *, struct mipi_dsi_device *); + ssize_t (*transfer)(struct mipi_dsi_host *, const struct mipi_dsi_msg *); +}; + +struct mipi_dsi_host { + struct device *dev; + const struct mipi_dsi_host_ops *ops; + struct list_head list; +}; + +enum mipi_dsi_pixel_format { + MIPI_DSI_FMT_RGB888 = 0, + MIPI_DSI_FMT_RGB666 = 1, + MIPI_DSI_FMT_RGB666_PACKED = 2, + MIPI_DSI_FMT_RGB565 = 3, +}; + +struct mipi_dsi_device { + struct mipi_dsi_host *host; + long: 32; + struct device dev; + char name[20]; + unsigned int channel; + unsigned int lanes; + enum mipi_dsi_pixel_format format; + long unsigned int mode_flags; + long unsigned int hs_rate; + long unsigned int lp_rate; + struct drm_dsc_config *dsc; +}; + +struct mipi_dsi_device_info { + char type[20]; + u32 channel; + struct device_node *node; +}; + +enum mipi_dsi_dcs_tear_mode { + MIPI_DSI_DCS_TEAR_MODE_VBLANK = 0, + MIPI_DSI_DCS_TEAR_MODE_VHBLANK = 1, +}; + +struct mipi_dsi_driver { + struct device_driver driver; + int (*probe)(struct mipi_dsi_device *); + void (*remove)(struct mipi_dsi_device *); + void (*shutdown)(struct mipi_dsi_device *); +}; + +enum { + MIPI_DSI_V_SYNC_START = 1, + MIPI_DSI_V_SYNC_END = 17, + MIPI_DSI_H_SYNC_START = 33, + MIPI_DSI_H_SYNC_END = 49, + MIPI_DSI_COMPRESSION_MODE = 7, + MIPI_DSI_END_OF_TRANSMISSION = 8, + MIPI_DSI_COLOR_MODE_OFF = 2, + MIPI_DSI_COLOR_MODE_ON = 18, + MIPI_DSI_SHUTDOWN_PERIPHERAL = 34, + MIPI_DSI_TURN_ON_PERIPHERAL = 50, + MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM = 3, + MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM = 19, + MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM = 35, + MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM = 4, + MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM = 20, + MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM = 36, + MIPI_DSI_DCS_SHORT_WRITE = 5, + MIPI_DSI_DCS_SHORT_WRITE_PARAM = 21, + MIPI_DSI_DCS_READ = 6, + MIPI_DSI_EXECUTE_QUEUE = 22, + MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE = 55, + MIPI_DSI_NULL_PACKET = 9, + MIPI_DSI_BLANKING_PACKET = 25, + MIPI_DSI_GENERIC_LONG_WRITE = 41, + MIPI_DSI_DCS_LONG_WRITE = 57, + MIPI_DSI_PICTURE_PARAMETER_SET = 10, + MIPI_DSI_COMPRESSED_PIXEL_STREAM = 11, + MIPI_DSI_LOOSELY_PACKED_PIXEL_STREAM_YCBCR20 = 12, + MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR24 = 28, + MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16 = 44, + MIPI_DSI_PACKED_PIXEL_STREAM_30 = 13, + MIPI_DSI_PACKED_PIXEL_STREAM_36 = 29, + MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12 = 61, + MIPI_DSI_PACKED_PIXEL_STREAM_16 = 14, + MIPI_DSI_PACKED_PIXEL_STREAM_18 = 30, + MIPI_DSI_PIXEL_STREAM_3BYTE_18 = 46, + MIPI_DSI_PACKED_PIXEL_STREAM_24 = 62, +}; + +enum { + MIPI_DCS_NOP = 0, + MIPI_DCS_SOFT_RESET = 1, + MIPI_DCS_GET_COMPRESSION_MODE = 3, + MIPI_DCS_GET_DISPLAY_ID = 4, + MIPI_DCS_GET_ERROR_COUNT_ON_DSI = 5, + MIPI_DCS_GET_RED_CHANNEL = 6, + MIPI_DCS_GET_GREEN_CHANNEL = 7, + MIPI_DCS_GET_BLUE_CHANNEL = 8, + MIPI_DCS_GET_DISPLAY_STATUS = 9, + MIPI_DCS_GET_POWER_MODE = 10, + MIPI_DCS_GET_ADDRESS_MODE = 11, + MIPI_DCS_GET_PIXEL_FORMAT = 12, + MIPI_DCS_GET_DISPLAY_MODE = 13, + MIPI_DCS_GET_SIGNAL_MODE = 14, + MIPI_DCS_GET_DIAGNOSTIC_RESULT = 15, + MIPI_DCS_ENTER_SLEEP_MODE = 16, + MIPI_DCS_EXIT_SLEEP_MODE = 17, + MIPI_DCS_ENTER_PARTIAL_MODE = 18, + MIPI_DCS_ENTER_NORMAL_MODE = 19, + MIPI_DCS_GET_IMAGE_CHECKSUM_RGB = 20, + MIPI_DCS_GET_IMAGE_CHECKSUM_CT = 21, + MIPI_DCS_EXIT_INVERT_MODE = 32, + MIPI_DCS_ENTER_INVERT_MODE = 33, + MIPI_DCS_SET_GAMMA_CURVE = 38, + MIPI_DCS_SET_DISPLAY_OFF = 40, + MIPI_DCS_SET_DISPLAY_ON = 41, + MIPI_DCS_SET_COLUMN_ADDRESS = 42, + MIPI_DCS_SET_PAGE_ADDRESS = 43, + MIPI_DCS_WRITE_MEMORY_START = 44, + MIPI_DCS_WRITE_LUT = 45, + MIPI_DCS_READ_MEMORY_START = 46, + MIPI_DCS_SET_PARTIAL_ROWS = 48, + MIPI_DCS_SET_PARTIAL_COLUMNS = 49, + MIPI_DCS_SET_SCROLL_AREA = 51, + MIPI_DCS_SET_TEAR_OFF = 52, + MIPI_DCS_SET_TEAR_ON = 53, + MIPI_DCS_SET_ADDRESS_MODE = 54, + MIPI_DCS_SET_SCROLL_START = 55, + MIPI_DCS_EXIT_IDLE_MODE = 56, + MIPI_DCS_ENTER_IDLE_MODE = 57, + MIPI_DCS_SET_PIXEL_FORMAT = 58, + MIPI_DCS_WRITE_MEMORY_CONTINUE = 60, + MIPI_DCS_SET_3D_CONTROL = 61, + MIPI_DCS_READ_MEMORY_CONTINUE = 62, + MIPI_DCS_GET_3D_CONTROL = 63, + MIPI_DCS_SET_VSYNC_TIMING = 64, + MIPI_DCS_SET_TEAR_SCANLINE = 68, + MIPI_DCS_GET_SCANLINE = 69, + MIPI_DCS_SET_DISPLAY_BRIGHTNESS = 81, + MIPI_DCS_GET_DISPLAY_BRIGHTNESS = 82, + MIPI_DCS_WRITE_CONTROL_DISPLAY = 83, + MIPI_DCS_GET_CONTROL_DISPLAY = 84, + MIPI_DCS_WRITE_POWER_SAVE = 85, + MIPI_DCS_GET_POWER_SAVE = 86, + MIPI_DCS_SET_CABC_MIN_BRIGHTNESS = 94, + MIPI_DCS_GET_CABC_MIN_BRIGHTNESS = 95, + MIPI_DCS_READ_DDB_START = 161, + MIPI_DCS_READ_PPS_START = 162, + MIPI_DCS_READ_DDB_CONTINUE = 168, + MIPI_DCS_READ_PPS_CONTINUE = 169, +}; + +struct cb_id { + __u32 idx; + __u32 val; +}; + +struct cn_msg { + struct cb_id id; + __u32 seq; + __u32 ack; + __u16 len; + __u16 flags; + __u8 data[0]; +}; + +struct cn_queue_dev { + atomic_t refcnt; + unsigned char name[32]; + struct list_head queue_list; + spinlock_t queue_lock; + struct sock *nls; +}; + +struct cn_callback_id { + unsigned char name[32]; + struct cb_id id; +}; + +struct cn_callback_entry { + struct list_head callback_entry; + refcount_t refcnt; + struct cn_queue_dev *pdev; + struct cn_callback_id id; + void (*callback)(struct cn_msg *, struct netlink_skb_parms *); + u32 seq; + u32 group; +}; + +struct cn_dev { + struct cb_id id; + u32 seq; + u32 groups; + struct sock *nls; + struct cn_queue_dev *cbdev; +}; + +enum proc_cn_mcast_op { + PROC_CN_MCAST_LISTEN = 1, + PROC_CN_MCAST_IGNORE = 2, +}; + +struct fork_proc_event { + __kernel_pid_t parent_pid; + __kernel_pid_t parent_tgid; + __kernel_pid_t child_pid; + __kernel_pid_t child_tgid; +}; + +struct exec_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; +}; + +struct id_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + union { + __u32 ruid; + __u32 rgid; + } r; + union { + __u32 euid; + __u32 egid; + } e; +}; + +struct sid_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; +}; + +struct ptrace_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + __kernel_pid_t tracer_pid; + __kernel_pid_t tracer_tgid; +}; + +struct comm_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + char comm[16]; +}; + +struct coredump_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + __kernel_pid_t parent_pid; + __kernel_pid_t parent_tgid; +}; + +struct exit_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + __u32 exit_code; + __u32 exit_signal; + __kernel_pid_t parent_pid; + __kernel_pid_t parent_tgid; +}; + +struct proc_event { + enum what what; + __u32 cpu; + __u64 timestamp_ns; + union { + struct { + __u32 err; + } ack; + struct fork_proc_event fork; + struct exec_proc_event exec; + struct id_proc_event id; + struct sid_proc_event sid; + struct ptrace_proc_event ptrace; + struct comm_proc_event comm; + struct coredump_proc_event coredump; + struct exit_proc_event exit; + } event_data; +}; + +struct local_event { + local_lock_t lock; + __u32 count; +}; + +struct component_ops { + int (*bind)(struct device *, struct device *, void *); + void (*unbind)(struct device *, struct device *, void *); +}; + +struct component_master_ops { + int (*bind)(struct device *); + void (*unbind)(struct device *); +}; + +struct component; + +struct component_match_array { + void *data; + int (*compare)(struct device *, void *); + int (*compare_typed)(struct device *, int, void *); + void (*release)(struct device *, void *); + struct component *component; + bool duplicate; +}; + +struct aggregate_device; + +struct component { + struct list_head node; + struct aggregate_device *adev; + bool bound; + const struct component_ops *ops; + int subcomponent; + struct device *dev; +}; + +struct component_match { + size_t alloc; + size_t num; + struct component_match_array *compare; +}; + +struct aggregate_device { + struct list_head node; + bool bound; + const struct component_master_ops *ops; + struct device *parent; + struct component_match *match; +}; + +struct fwnode_link { + struct fwnode_handle *supplier; + struct list_head s_hook; + struct fwnode_handle *consumer; + struct list_head c_hook; +}; + +struct wake_irq { + struct device *dev; + unsigned int status; + int irq; + const char *name; +}; + +enum dpm_order { + DPM_ORDER_NONE = 0, + DPM_ORDER_DEV_AFTER_PARENT = 1, + DPM_ORDER_PARENT_BEFORE_DEV = 2, + DPM_ORDER_DEV_LAST = 3, +}; + +struct subsys_private { + struct kset subsys; + struct kset *devices_kset; + struct list_head interfaces; + struct mutex mutex; + struct kset *drivers_kset; + struct klist klist_devices; + struct klist klist_drivers; + struct blocking_notifier_head bus_notifier; + unsigned int drivers_autoprobe: 1; + struct bus_type *bus; + struct kset glue_dirs; + struct class *class; +}; + +struct driver_private { + struct kobject kobj; + struct klist klist_devices; + struct klist_node knode_bus; + struct module_kobject *mkobj; + struct device_driver *driver; +}; + +struct device_private { + struct klist klist_children; + struct klist_node knode_parent; + struct klist_node knode_driver; + struct klist_node knode_bus; + struct klist_node knode_class; + struct list_head deferred_probe; + struct device_driver *async_driver; + char *deferred_probe_reason; + struct device *device; + u8 dead: 1; +}; + +union device_attr_group_devres { + const struct attribute_group *group; + const struct attribute_group **groups; +}; + +struct class_dir { + struct kobject kobj; + struct class *class; +}; + +struct root_device { + struct device dev; + struct module *owner; + long: 32; +}; + +struct subsys_dev_iter { + struct klist_iter ki; + const struct device_type *type; +}; + +struct subsys_interface { + const char *name; + struct bus_type *subsys; + struct list_head node; + int (*add_dev)(struct device *, struct subsys_interface *); + void (*remove_dev)(struct device *, struct subsys_interface *); +}; + +struct device_attach_data { + struct device *dev; + bool check_async; + bool want_async; + bool have_async; +}; + +struct class_attribute_string { + struct class_attribute attr; + char *str; +}; + +struct class_compat { + struct kobject *kobj; +}; + +typedef void *acpi_handle; + +struct irq_affinity_devres { + unsigned int count; + unsigned int irq[0]; +}; + +struct platform_object { + struct platform_device pdev; + char name[0]; +}; + +struct cpu_attr { + struct device_attribute attr; + const struct cpumask * const map; +}; + +struct probe { + struct probe *next; + dev_t dev; + long unsigned int range; + struct module *owner; + kobj_probe_t *get; + int (*lock)(dev_t, void *); + void *data; +}; + +struct kobj_map { + struct probe *probes[255]; + struct mutex *lock; +}; + +struct devres_node { + struct list_head entry; + dr_release_t release; + const char *name; + size_t size; +}; + +struct devres { + struct devres_node node; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + u8 data[0]; +}; + +struct devres_group { + struct devres_node node[2]; + void *id; + int color; +}; + +struct action_devres { + void *data; + void (*action)(void *); +}; + +struct pages_devres { + long unsigned int addr; + unsigned int order; +}; + +struct attribute_container { + struct list_head node; + struct klist containers; + struct class *class; + const struct attribute_group *grp; + struct device_attribute **attrs; + int (*match)(struct attribute_container *, struct device *); + long unsigned int flags; +}; + +struct internal_container { + struct klist_node node; + struct attribute_container *cont; + long: 32; + struct device classdev; +}; + +struct transport_container; + +struct transport_class { + struct class class; + int (*setup)(struct transport_container *, struct device *, struct device *); + int (*configure)(struct transport_container *, struct device *, struct device *); + int (*remove)(struct transport_container *, struct device *, struct device *); +}; + +struct transport_container { + struct attribute_container ac; + const struct attribute_group *statistics; +}; + +struct anon_transport_class { + struct transport_class tclass; + struct attribute_container container; +}; + +struct container_dev { + struct device dev; + int (*offline)(struct container_dev *); + long: 32; +}; + +typedef void * (*devcon_match_fn_t)(const struct fwnode_handle *, const char *, void *); + +enum cache_type { + CACHE_TYPE_NOCACHE = 0, + CACHE_TYPE_INST = 1, + CACHE_TYPE_DATA = 2, + CACHE_TYPE_SEPARATE = 3, + CACHE_TYPE_UNIFIED = 4, +}; + +struct cacheinfo { + unsigned int id; + enum cache_type type; + unsigned int level; + unsigned int coherency_line_size; + unsigned int number_of_sets; + unsigned int ways_of_associativity; + unsigned int physical_line_partition; + unsigned int size; + cpumask_t shared_cpu_map; + unsigned int attributes; + void *fw_token; + bool disable_sysfs; + void *priv; +}; + +struct cpu_cacheinfo { + struct cacheinfo *info_list; + unsigned int num_levels; + unsigned int num_leaves; + bool cpu_map_populated; +}; + +struct cache_type_info { + const char *size_prop; + const char *line_size_props[2]; + const char *nr_sets_prop; +}; + +struct software_node_ref_args { + const struct software_node *node; + unsigned int nargs; + u64 args[8]; +}; + +struct swnode { + struct kobject kobj; + struct fwnode_handle fwnode; + const struct software_node *node; + int id; + struct ida child_ids; + struct list_head entry; + struct list_head children; + struct swnode *parent; + unsigned int allocated: 1; + unsigned int managed: 1; +}; + +struct auxiliary_device_id { + char name[32]; + kernel_ulong_t driver_data; +}; + +struct auxiliary_device { + struct device dev; + const char *name; + u32 id; +}; + +struct auxiliary_driver { + int (*probe)(struct auxiliary_device *, const struct auxiliary_device_id *); + void (*remove)(struct auxiliary_device *); + void (*shutdown)(struct auxiliary_device *); + int (*suspend)(struct auxiliary_device *, pm_message_t); + int (*resume)(struct auxiliary_device *); + const char *name; + struct device_driver driver; + const struct auxiliary_device_id *id_table; +}; + +struct req { + struct req *next; + struct completion done; + int err; + const char *name; + umode_t mode; + kuid_t uid; + kgid_t gid; + struct device *dev; +}; + +enum pm_qos_flags_status { + PM_QOS_FLAGS_UNDEFINED = 4294967295, + PM_QOS_FLAGS_NONE = 0, + PM_QOS_FLAGS_SOME = 1, + PM_QOS_FLAGS_ALL = 2, +}; + +typedef int (*pm_callback_t)(struct device *); + +struct of_phandle_iterator { + const char *cells_name; + int cell_count; + const struct device_node *parent; + const __be32 *list_end; + const __be32 *phandle_end; + const __be32 *cur; + uint32_t cur_count; + phandle phandle; + struct device_node *node; +}; + +enum genpd_notication { + GENPD_NOTIFY_PRE_OFF = 0, + GENPD_NOTIFY_OFF = 1, + GENPD_NOTIFY_PRE_ON = 2, + GENPD_NOTIFY_ON = 3, +}; + +struct gpd_link { + struct generic_pm_domain *parent; + struct list_head parent_node; + struct generic_pm_domain *child; + struct list_head child_node; + unsigned int performance_state; + unsigned int prev_performance_state; +}; + +struct of_genpd_provider { + struct list_head link; + struct device_node *node; + genpd_xlate_t xlate; + void *data; +}; + +struct pm_clk_notifier_block { + struct notifier_block nb; + struct dev_pm_domain *pm_domain; + char *con_ids[0]; +}; + +enum pce_status { + PCE_STATUS_NONE = 0, + PCE_STATUS_ACQUIRED = 1, + PCE_STATUS_PREPARED = 2, + PCE_STATUS_ENABLED = 3, + PCE_STATUS_ERROR = 4, +}; + +struct pm_clock_entry { + struct list_head node; + char *con_id; + struct clk *clk; + enum pce_status status; + bool enabled_when_prepared; +}; + +enum fw_opt { + FW_OPT_UEVENT = 1, + FW_OPT_NOWAIT = 2, + FW_OPT_USERHELPER = 4, + FW_OPT_NO_WARN = 8, + FW_OPT_NOCACHE = 16, + FW_OPT_NOFALLBACK_SYSFS = 32, + FW_OPT_FALLBACK_PLATFORM = 64, + FW_OPT_PARTIAL = 128, +}; + +enum fw_status { + FW_STATUS_UNKNOWN = 0, + FW_STATUS_LOADING = 1, + FW_STATUS_DONE = 2, + FW_STATUS_ABORTED = 3, +}; + +struct fw_state { + struct completion completion; + enum fw_status status; +}; + +struct firmware_cache; + +struct fw_priv { + struct kref ref; + struct list_head list; + struct firmware_cache *fwc; + struct fw_state fw_st; + void *data; + size_t size; + size_t allocated_size; + size_t offset; + u32 opt_flags; + const char *fw_name; +}; + +struct firmware_cache { + spinlock_t lock; + struct list_head head; + int state; + spinlock_t name_lock; + struct list_head fw_names; + struct delayed_work work; + struct notifier_block pm_notify; +}; + +struct fw_cache_entry { + struct list_head list; + const char *name; +}; + +struct fw_name_devm { + long unsigned int magic; + const char *name; +}; + +struct firmware_work { + struct work_struct work; + struct module *module; + const char *name; + struct device *device; + void *context; + void (*cont)(const struct firmware *, void *); + u32 opt_flags; +}; + +struct builtin_fw { + char *name; + void *data; + long unsigned int size; +}; + +struct regmap_async { + struct list_head list; + struct regmap *map; + void *work_buf; +}; + +struct regmap_format { + size_t buf_size; + size_t reg_bytes; + size_t pad_bytes; + size_t reg_downshift; + size_t val_bytes; + void (*format_write)(struct regmap *, unsigned int, unsigned int); + void (*format_reg)(void *, unsigned int, unsigned int); + void (*format_val)(void *, unsigned int, unsigned int); + unsigned int (*parse_val)(const void *); + void (*parse_inplace)(void *); +}; + +struct regcache_ops; + +struct regmap { + union { + struct mutex mutex; + struct { + spinlock_t spinlock; + long unsigned int spinlock_flags; + }; + struct { + raw_spinlock_t raw_spinlock; + long unsigned int raw_spinlock_flags; + }; + }; + regmap_lock lock; + regmap_unlock unlock; + void *lock_arg; + gfp_t alloc_flags; + unsigned int reg_base; + struct device *dev; + void *work_buf; + struct regmap_format format; + const struct regmap_bus *bus; + void *bus_context; + const char *name; + bool async; + spinlock_t async_lock; + wait_queue_head_t async_waitq; + struct list_head async_list; + struct list_head async_free; + int async_ret; + bool debugfs_disable; + struct dentry *debugfs; + const char *debugfs_name; + unsigned int debugfs_reg_len; + unsigned int debugfs_val_len; + unsigned int debugfs_tot_len; + struct list_head debugfs_off_cache; + struct mutex cache_lock; + unsigned int max_register; + bool (*writeable_reg)(struct device *, unsigned int); + bool (*readable_reg)(struct device *, unsigned int); + bool (*volatile_reg)(struct device *, unsigned int); + bool (*precious_reg)(struct device *, unsigned int); + bool (*writeable_noinc_reg)(struct device *, unsigned int); + bool (*readable_noinc_reg)(struct device *, unsigned int); + const struct regmap_access_table *wr_table; + const struct regmap_access_table *rd_table; + const struct regmap_access_table *volatile_table; + const struct regmap_access_table *precious_table; + const struct regmap_access_table *wr_noinc_table; + const struct regmap_access_table *rd_noinc_table; + int (*reg_read)(void *, unsigned int, unsigned int *); + int (*reg_write)(void *, unsigned int, unsigned int); + int (*reg_update_bits)(void *, unsigned int, unsigned int, unsigned int); + int (*read)(void *, const void *, size_t, void *, size_t); + int (*write)(void *, const void *, size_t); + bool defer_caching; + long unsigned int read_flag_mask; + long unsigned int write_flag_mask; + int reg_shift; + int reg_stride; + int reg_stride_order; + const struct regcache_ops *cache_ops; + enum regcache_type cache_type; + unsigned int cache_size_raw; + unsigned int cache_word_size; + unsigned int num_reg_defaults; + unsigned int num_reg_defaults_raw; + bool cache_only; + bool cache_bypass; + bool cache_free; + struct reg_default *reg_defaults; + const void *reg_defaults_raw; + void *cache; + bool cache_dirty; + bool no_sync_defaults; + struct reg_sequence *patch; + int patch_regs; + bool use_single_read; + bool use_single_write; + bool can_multi_write; + size_t max_raw_read; + size_t max_raw_write; + struct rb_root range_tree; + void *selector_work_buf; + struct hwspinlock *hwlock; + bool can_sleep; +}; + +struct regcache_ops { + const char *name; + enum regcache_type type; + int (*init)(struct regmap *); + int (*exit)(struct regmap *); + void (*debugfs_init)(struct regmap *); + int (*read)(struct regmap *, unsigned int, unsigned int *); + int (*write)(struct regmap *, unsigned int, unsigned int); + int (*sync)(struct regmap *, unsigned int, unsigned int); + int (*drop)(struct regmap *, unsigned int, unsigned int); +}; + +struct regmap_range_node { + struct rb_node node; + const char *name; + struct regmap *map; + unsigned int range_min; + unsigned int range_max; + unsigned int selector_reg; + unsigned int selector_mask; + int selector_shift; + unsigned int window_start; + unsigned int window_len; +}; + +struct regmap_field { + struct regmap *regmap; + unsigned int mask; + unsigned int shift; + unsigned int reg; + unsigned int id_size; + unsigned int id_offset; +}; + +struct trace_event_raw_regmap_reg { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int reg; + unsigned int val; + char __data[0]; +}; + +struct trace_event_raw_regmap_bulk { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int reg; + u32 __data_loc_buf; + int val_len; + char __data[0]; +}; + +struct trace_event_raw_regmap_block { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int reg; + int count; + char __data[0]; +}; + +struct trace_event_raw_regcache_sync { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_status; + u32 __data_loc_type; + char __data[0]; +}; + +struct trace_event_raw_regmap_bool { + struct trace_entry ent; + u32 __data_loc_name; + int flag; + char __data[0]; +}; + +struct trace_event_raw_regmap_async { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_regcache_drop_region { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int from; + unsigned int to; + char __data[0]; +}; + +struct trace_event_data_offsets_regmap_reg { + u32 name; +}; + +struct trace_event_data_offsets_regmap_bulk { + u32 name; + u32 buf; +}; + +struct trace_event_data_offsets_regmap_block { + u32 name; +}; + +struct trace_event_data_offsets_regcache_sync { + u32 name; + u32 status; + u32 type; +}; + +struct trace_event_data_offsets_regmap_bool { + u32 name; +}; + +struct trace_event_data_offsets_regmap_async { + u32 name; +}; + +struct trace_event_data_offsets_regcache_drop_region { + u32 name; +}; + +typedef void (*btf_trace_regmap_reg_write)(void *, struct regmap *, unsigned int, unsigned int); + +typedef void (*btf_trace_regmap_reg_read)(void *, struct regmap *, unsigned int, unsigned int); + +typedef void (*btf_trace_regmap_reg_read_cache)(void *, struct regmap *, unsigned int, unsigned int); + +typedef void (*btf_trace_regmap_bulk_write)(void *, struct regmap *, unsigned int, const void *, int); + +typedef void (*btf_trace_regmap_bulk_read)(void *, struct regmap *, unsigned int, const void *, int); + +typedef void (*btf_trace_regmap_hw_read_start)(void *, struct regmap *, unsigned int, int); + +typedef void (*btf_trace_regmap_hw_read_done)(void *, struct regmap *, unsigned int, int); + +typedef void (*btf_trace_regmap_hw_write_start)(void *, struct regmap *, unsigned int, int); + +typedef void (*btf_trace_regmap_hw_write_done)(void *, struct regmap *, unsigned int, int); + +typedef void (*btf_trace_regcache_sync)(void *, struct regmap *, const char *, const char *); + +typedef void (*btf_trace_regmap_cache_only)(void *, struct regmap *, bool); + +typedef void (*btf_trace_regmap_cache_bypass)(void *, struct regmap *, bool); + +typedef void (*btf_trace_regmap_async_write_start)(void *, struct regmap *, unsigned int, int); + +typedef void (*btf_trace_regmap_async_io_complete)(void *, struct regmap *); + +typedef void (*btf_trace_regmap_async_complete_start)(void *, struct regmap *); + +typedef void (*btf_trace_regmap_async_complete_done)(void *, struct regmap *); + +typedef void (*btf_trace_regcache_drop_region)(void *, struct regmap *, unsigned int, unsigned int); + +struct regcache_rbtree_node { + void *block; + long int *cache_present; + unsigned int base_reg; + unsigned int blklen; + struct rb_node node; +}; + +struct regcache_rbtree_ctx { + struct rb_root root; + struct regcache_rbtree_node *cached_rbnode; +}; + +struct regmap_debugfs_off_cache { + struct list_head list; + off_t min; + off_t max; + unsigned int base_reg; + unsigned int max_reg; +}; + +struct regmap_debugfs_node { + struct regmap *map; + struct list_head link; +}; + +struct spi_statistics { + struct u64_stats_sync syncp; + long: 32; + u64_stats_t messages; + u64_stats_t transfers; + u64_stats_t errors; + u64_stats_t timedout; + u64_stats_t spi_sync; + u64_stats_t spi_sync_immediate; + u64_stats_t spi_async; + u64_stats_t bytes; + u64_stats_t bytes_rx; + u64_stats_t bytes_tx; + u64_stats_t transfer_bytes_histo[17]; + u64_stats_t transfers_split_maxsize; +}; + +struct spi_delay { + u16 value; + u8 unit; +}; + +struct spi_controller; + +struct spi_device { + struct device dev; + struct spi_controller *controller; + struct spi_controller *master; + u32 max_speed_hz; + u8 chip_select; + u8 bits_per_word; + bool rt; + u32 mode; + int irq; + void *controller_state; + void *controller_data; + char modalias[32]; + const char *driver_override; + struct gpio_desc *cs_gpiod; + struct spi_delay word_delay; + struct spi_delay cs_setup; + struct spi_delay cs_hold; + struct spi_delay cs_inactive; + struct spi_statistics *pcpu_statistics; + long: 32; +}; + +struct spi_message; + +struct spi_transfer; + +struct spi_controller_mem_ops; + +struct spi_controller_mem_caps; + +struct spi_controller { + struct device dev; + struct list_head list; + s16 bus_num; + u16 num_chipselect; + u16 dma_alignment; + u32 mode_bits; + u32 buswidth_override_bits; + u32 bits_per_word_mask; + u32 min_speed_hz; + u32 max_speed_hz; + u16 flags; + bool devm_allocated; + union { + bool slave; + bool target; + }; + size_t (*max_transfer_size)(struct spi_device *); + size_t (*max_message_size)(struct spi_device *); + struct mutex io_mutex; + struct mutex add_lock; + spinlock_t bus_lock_spinlock; + struct mutex bus_lock_mutex; + bool bus_lock_flag; + int (*setup)(struct spi_device *); + int (*set_cs_timing)(struct spi_device *); + int (*transfer)(struct spi_device *, struct spi_message *); + void (*cleanup)(struct spi_device *); + bool (*can_dma)(struct spi_controller *, struct spi_device *, struct spi_transfer *); + struct device *dma_map_dev; + struct device *cur_rx_dma_dev; + struct device *cur_tx_dma_dev; + bool queued; + struct kthread_worker *kworker; + struct kthread_work pump_messages; + spinlock_t queue_lock; + struct list_head queue; + struct spi_message *cur_msg; + struct completion cur_msg_completion; + bool cur_msg_incomplete; + bool cur_msg_need_completion; + bool busy; + bool running; + bool rt; + bool auto_runtime_pm; + bool cur_msg_mapped; + char last_cs; + bool last_cs_mode_high; + bool fallback; + struct completion xfer_completion; + size_t max_dma_len; + int (*prepare_transfer_hardware)(struct spi_controller *); + int (*transfer_one_message)(struct spi_controller *, struct spi_message *); + int (*unprepare_transfer_hardware)(struct spi_controller *); + int (*prepare_message)(struct spi_controller *, struct spi_message *); + int (*unprepare_message)(struct spi_controller *, struct spi_message *); + union { + int (*slave_abort)(struct spi_controller *); + int (*target_abort)(struct spi_controller *); + }; + void (*set_cs)(struct spi_device *, bool); + int (*transfer_one)(struct spi_controller *, struct spi_device *, struct spi_transfer *); + void (*handle_err)(struct spi_controller *, struct spi_message *); + const struct spi_controller_mem_ops *mem_ops; + const struct spi_controller_mem_caps *mem_caps; + struct gpio_desc **cs_gpiods; + bool use_gpio_descriptors; + s8 unused_native_cs; + s8 max_native_cs; + struct spi_statistics *pcpu_statistics; + struct dma_chan *dma_tx; + struct dma_chan *dma_rx; + void *dummy_rx; + void *dummy_tx; + int (*fw_translate_cs)(struct spi_controller *, unsigned int); + bool ptp_sts_supported; + long unsigned int irq_flags; + bool queue_empty; + bool must_async; +}; + +struct spi_message { + struct list_head transfers; + struct spi_device *spi; + unsigned int is_dma_mapped: 1; + void (*complete)(void *); + void *context; + unsigned int frame_length; + unsigned int actual_length; + int status; + struct list_head queue; + void *state; + struct list_head resources; + bool prepared; +}; + +struct ptp_system_timestamp; + +struct spi_transfer { + const void *tx_buf; + void *rx_buf; + unsigned int len; + long: 32; + dma_addr_t tx_dma; + dma_addr_t rx_dma; + struct sg_table tx_sg; + struct sg_table rx_sg; + unsigned int dummy_data: 1; + unsigned int cs_off: 1; + unsigned int cs_change: 1; + unsigned int tx_nbits: 3; + unsigned int rx_nbits: 3; + u8 bits_per_word; + struct spi_delay delay; + struct spi_delay cs_change_delay; + struct spi_delay word_delay; + u32 speed_hz; + u32 effective_speed_hz; + unsigned int ptp_sts_word_pre; + unsigned int ptp_sts_word_post; + struct ptp_system_timestamp *ptp_sts; + bool timestamped; + struct list_head transfer_list; + u16 error; + long: 32; +}; + +struct spi_mem; + +struct spi_mem_op; + +struct spi_mem_dirmap_desc; + +struct spi_controller_mem_ops { + int (*adjust_op_size)(struct spi_mem *, struct spi_mem_op *); + bool (*supports_op)(struct spi_mem *, const struct spi_mem_op *); + int (*exec_op)(struct spi_mem *, const struct spi_mem_op *); + const char * (*get_name)(struct spi_mem *); + int (*dirmap_create)(struct spi_mem_dirmap_desc *); + void (*dirmap_destroy)(struct spi_mem_dirmap_desc *); + ssize_t (*dirmap_read)(struct spi_mem_dirmap_desc *, u64, size_t, void *); + ssize_t (*dirmap_write)(struct spi_mem_dirmap_desc *, u64, size_t, const void *); + int (*poll_status)(struct spi_mem *, const struct spi_mem_op *, u16, u16, long unsigned int, long unsigned int, long unsigned int); +}; + +struct spi_controller_mem_caps { + bool dtr; + bool ecc; +}; + +struct regmap_async_spi { + struct regmap_async core; + struct spi_message m; + long: 32; + struct spi_transfer t[2]; +}; + +struct regmap_mmio_context { + void *regs; + unsigned int val_bytes; + bool big_endian; + bool attached_clk; + struct clk *clk; + void (*reg_write)(struct regmap_mmio_context *, unsigned int, unsigned int); + unsigned int (*reg_read)(struct regmap_mmio_context *, unsigned int); +}; + +struct regmap_irq_type { + unsigned int type_reg_offset; + unsigned int type_reg_mask; + unsigned int type_rising_val; + unsigned int type_falling_val; + unsigned int type_level_low_val; + unsigned int type_level_high_val; + unsigned int types_supported; +}; + +struct regmap_irq { + unsigned int reg_offset; + unsigned int mask; + struct regmap_irq_type type; +}; + +struct regmap_irq_sub_irq_map { + unsigned int num_regs; + unsigned int *offset; +}; + +struct regmap_irq_chip { + const char *name; + unsigned int main_status; + unsigned int num_main_status_bits; + struct regmap_irq_sub_irq_map *sub_reg_offsets; + int num_main_regs; + unsigned int status_base; + unsigned int mask_base; + unsigned int unmask_base; + unsigned int ack_base; + unsigned int wake_base; + unsigned int type_base; + unsigned int *virt_reg_base; + const unsigned int *config_base; + unsigned int irq_reg_stride; + unsigned int init_ack_masked: 1; + unsigned int mask_invert: 1; + unsigned int mask_unmask_non_inverted: 1; + unsigned int use_ack: 1; + unsigned int ack_invert: 1; + unsigned int clear_ack: 1; + unsigned int wake_invert: 1; + unsigned int runtime_pm: 1; + unsigned int type_invert: 1; + unsigned int type_in_mask: 1; + unsigned int clear_on_unmask: 1; + unsigned int not_fixed_stride: 1; + unsigned int status_invert: 1; + int num_regs; + const struct regmap_irq *irqs; + int num_irqs; + int num_type_reg; + int num_virt_regs; + int num_config_bases; + int num_config_regs; + int (*handle_pre_irq)(void *); + int (*handle_post_irq)(void *); + int (*handle_mask_sync)(struct regmap *, int, unsigned int, unsigned int, void *); + int (*set_type_virt)(unsigned int **, unsigned int, long unsigned int, int); + int (*set_type_config)(unsigned int **, unsigned int, const struct regmap_irq *, int); + unsigned int (*get_irq_reg)(struct regmap_irq_chip_data *, unsigned int, int); + void *irq_drv_data; +}; + +struct regmap_irq_chip_data { + struct mutex lock; + struct irq_chip irq_chip; + struct regmap *map; + const struct regmap_irq_chip *chip; + int irq_base; + struct irq_domain *domain; + int irq; + int wake_count; + unsigned int mask_base; + unsigned int unmask_base; + void *status_reg_buf; + unsigned int *main_status_buf; + unsigned int *status_buf; + unsigned int *mask_buf; + unsigned int *mask_buf_def; + unsigned int *wake_buf; + unsigned int *type_buf; + unsigned int *type_buf_def; + unsigned int **virt_buf; + unsigned int **config_buf; + unsigned int irq_reg_stride; + unsigned int (*get_irq_reg)(struct regmap_irq_chip_data *, unsigned int, int); + unsigned int clear_status: 1; +}; + +struct soc_device { + struct device dev; + struct soc_device_attribute *attr; + int soc_dev_num; +}; + +struct devcd_entry { + struct device devcd_dev; + void *data; + size_t datalen; + struct mutex mutex; + bool delete_work; + struct module *owner; + ssize_t (*read)(char *, loff_t, size_t, void *, size_t); + void (*free)(void *); + struct delayed_work del_wk; + struct device *failing_dev; + long: 32; +}; + +typedef void (*irq_write_msi_msg_t)(struct msi_desc *, struct msi_msg *); + +struct platform_msi_priv_data { + struct device *dev; + void *host_data; + msi_alloc_info_t arg; + irq_write_msi_msg_t write_msg; + int devid; +}; + +enum scale_freq_source { + SCALE_FREQ_SOURCE_CPUFREQ = 0, + SCALE_FREQ_SOURCE_ARCH = 1, + SCALE_FREQ_SOURCE_CPPC = 2, +}; + +struct scale_freq_data { + enum scale_freq_source source; + void (*set_freq_scale)(); +}; + +struct trace_event_raw_thermal_pressure_update { + struct trace_entry ent; + long unsigned int thermal_pressure; + int cpu; + char __data[0]; +}; + +struct trace_event_data_offsets_thermal_pressure_update {}; + +typedef void (*btf_trace_thermal_pressure_update)(void *, int, long unsigned int); + +struct trace_event_raw_devres { + struct trace_entry ent; + u32 __data_loc_devname; + struct device *dev; + const char *op; + void *node; + const char *name; + size_t size; + char __data[0]; +}; + +struct trace_event_data_offsets_devres { + u32 devname; +}; + +typedef void (*btf_trace_devres_log)(void *, struct device *, const char *, void *, const char *, size_t); + +struct sram_config { + int (*init)(); + bool map_only_reserved; +}; + +struct sram_partition { + void *base; + struct gen_pool *pool; + struct bin_attribute battr; + struct mutex lock; + struct list_head list; +}; + +struct sram_dev { + const struct sram_config *config; + struct device *dev; + void *virt_base; + bool no_memory_wc; + struct gen_pool *pool; + struct clk *clk; + struct sram_partition *partition; + u32 partitions; +}; + +struct sram_reserve { + struct list_head list; + u32 start; + u32 size; + struct resource res; + bool export; + bool pool; + bool protect_exec; + const char *label; +}; + +enum stmpe_block { + STMPE_BLOCK_GPIO = 1, + STMPE_BLOCK_KEYPAD = 2, + STMPE_BLOCK_TOUCHSCREEN = 4, + STMPE_BLOCK_ADC = 8, + STMPE_BLOCK_PWM = 16, + STMPE_BLOCK_ROTATOR = 32, +}; + +enum stmpe_partnum { + STMPE610 = 0, + STMPE801 = 1, + STMPE811 = 2, + STMPE1600 = 3, + STMPE1601 = 4, + STMPE1801 = 5, + STMPE2401 = 6, + STMPE2403 = 7, + STMPE_NBR_PARTS = 8, +}; + +enum { + STMPE_IDX_CHIP_ID = 0, + STMPE_IDX_SYS_CTRL = 1, + STMPE_IDX_SYS_CTRL2 = 2, + STMPE_IDX_ICR_LSB = 3, + STMPE_IDX_IER_LSB = 4, + STMPE_IDX_IER_MSB = 5, + STMPE_IDX_ISR_LSB = 6, + STMPE_IDX_ISR_MSB = 7, + STMPE_IDX_GPMR_LSB = 8, + STMPE_IDX_GPMR_CSB = 9, + STMPE_IDX_GPMR_MSB = 10, + STMPE_IDX_GPSR_LSB = 11, + STMPE_IDX_GPSR_CSB = 12, + STMPE_IDX_GPSR_MSB = 13, + STMPE_IDX_GPCR_LSB = 14, + STMPE_IDX_GPCR_CSB = 15, + STMPE_IDX_GPCR_MSB = 16, + STMPE_IDX_GPDR_LSB = 17, + STMPE_IDX_GPDR_CSB = 18, + STMPE_IDX_GPDR_MSB = 19, + STMPE_IDX_GPEDR_LSB = 20, + STMPE_IDX_GPEDR_CSB = 21, + STMPE_IDX_GPEDR_MSB = 22, + STMPE_IDX_GPRER_LSB = 23, + STMPE_IDX_GPRER_CSB = 24, + STMPE_IDX_GPRER_MSB = 25, + STMPE_IDX_GPFER_LSB = 26, + STMPE_IDX_GPFER_CSB = 27, + STMPE_IDX_GPFER_MSB = 28, + STMPE_IDX_GPPUR_LSB = 29, + STMPE_IDX_GPPDR_LSB = 30, + STMPE_IDX_GPAFR_U_MSB = 31, + STMPE_IDX_IEGPIOR_LSB = 32, + STMPE_IDX_IEGPIOR_CSB = 33, + STMPE_IDX_IEGPIOR_MSB = 34, + STMPE_IDX_ISGPIOR_LSB = 35, + STMPE_IDX_ISGPIOR_CSB = 36, + STMPE_IDX_ISGPIOR_MSB = 37, + STMPE_IDX_MAX = 38, +}; + +struct stmpe_client_info; + +struct stmpe_variant_info; + +struct stmpe_platform_data; + +struct stmpe { + struct regulator *vcc; + struct regulator *vio; + struct mutex lock; + struct mutex irq_lock; + struct device *dev; + struct irq_domain *domain; + void *client; + struct stmpe_client_info *ci; + enum stmpe_partnum partnum; + struct stmpe_variant_info *variant; + const u8 *regs; + int irq; + int num_gpios; + u8 ier[2]; + u8 oldier[2]; + struct stmpe_platform_data *pdata; + u8 sample_time; + u8 mod_12b; + u8 ref_sel; + u8 adc_freq; +}; + +struct stmpe_client_info { + void *data; + int irq; + void *client; + struct device *dev; + int (*read_byte)(struct stmpe *, u8); + int (*write_byte)(struct stmpe *, u8, u8); + int (*read_block)(struct stmpe *, u8, u8, u8 *); + int (*write_block)(struct stmpe *, u8, u8, const u8 *); + void (*init)(struct stmpe *); +}; + +struct stmpe_variant_block; + +struct stmpe_variant_info { + const char *name; + u16 id_val; + u16 id_mask; + int num_gpios; + int af_bits; + const u8 *regs; + struct stmpe_variant_block *blocks; + int num_blocks; + int num_irqs; + int (*enable)(struct stmpe *, unsigned int, bool); + int (*get_altfunc)(struct stmpe *, enum stmpe_block); + int (*enable_autosleep)(struct stmpe *, int); +}; + +struct stmpe_platform_data { + int id; + unsigned int blocks; + unsigned int irq_trigger; + bool autosleep; + int autosleep_timeout; +}; + +struct stmpe_variant_block { + const struct mfd_cell *cell; + int irq; + enum stmpe_block block; +}; + +struct i2c_device_id { + char name[20]; + kernel_ulong_t driver_data; +}; + +enum i2c_alert_protocol { + I2C_PROTOCOL_SMBUS_ALERT = 0, + I2C_PROTOCOL_SMBUS_HOST_NOTIFY = 1, +}; + +struct i2c_board_info; + +struct i2c_driver { + unsigned int class; + int (*probe)(struct i2c_client *, const struct i2c_device_id *); + void (*remove)(struct i2c_client *); + int (*probe_new)(struct i2c_client *); + void (*shutdown)(struct i2c_client *); + void (*alert)(struct i2c_client *, enum i2c_alert_protocol, unsigned int); + int (*command)(struct i2c_client *, unsigned int, void *); + struct device_driver driver; + const struct i2c_device_id *id_table; + int (*detect)(struct i2c_client *, struct i2c_board_info *); + const short unsigned int *address_list; + struct list_head clients; + u32 flags; +}; + +struct i2c_board_info { + char type[20]; + short unsigned int flags; + short unsigned int addr; + const char *dev_name; + void *platform_data; + struct device_node *of_node; + struct fwnode_handle *fwnode; + const struct software_node *swnode; + const struct resource *resources; + unsigned int num_resources; + int irq; +}; + +struct prcm_data { + int nsubdevs; + const struct mfd_cell *subdevs; +}; + +struct twl_client { + struct i2c_client *client; + struct regmap *regmap; +}; + +struct twl_mapping { + unsigned char sid; + unsigned char base; +}; + +struct twl_private { + bool ready; + u32 twl_idcode; + unsigned int twl_id; + struct twl_mapping *twl_map; + struct twl_client *twl_modules; +}; + +struct sih_irq_data { + u8 isr_offset; + u8 imr_offset; +}; + +struct sih { + char name[8]; + u8 module; + u8 control_offset; + bool set_cor; + u8 bits; + u8 bytes_ixr; + u8 edr_offset; + u8 bytes_edr; + u8 irq_lines; + struct sih_irq_data mask[2]; +}; + +struct sih_agent { + int irq_base; + const struct sih *sih; + u32 imr; + bool imr_change_pending; + u32 edge_change; + struct mutex irq_lock; + char *irq_name; +}; + +struct twl6030_irq { + unsigned int irq_base; + int twl_irq; + bool irq_wake_enabled; + atomic_t wakeirqs; + struct notifier_block pm_nb; + struct irq_chip irq_chip; + struct irq_domain *irq_domain; + const int *irq_mapping_tbl; +}; + +struct twl4030_ins { + u16 pmb_message; + u8 delay; +}; + +struct twl4030_script { + struct twl4030_ins *script; + unsigned int size; + u8 flags; +}; + +struct twl4030_resconfig { + u8 resource; + u8 devgroup; + u8 type; + u8 type2; + u8 remap_off; + u8 remap_sleep; +}; + +struct twl4030_power_data { + struct twl4030_script **scripts; + unsigned int num; + struct twl4030_resconfig *resource_config; + struct twl4030_resconfig *board_config; + bool use_poweroff; + bool ac_charger_quirk; +}; + +enum { + TWL_REMAP_OFF = 0, + TWL_REMAP_SLEEP = 8, + TWL_REMAP_ACTIVE = 9, +}; + +struct twl4030_codec_data { + unsigned int digimic_delay; + unsigned int ramp_delay_value; + unsigned int offset_cncl_path; + unsigned int hs_extmute: 1; + int hs_extmute_gpio; +}; + +struct twl4030_vibra_data { + unsigned int coexist; +}; + +struct twl4030_audio_data { + unsigned int audio_mclk; + struct twl4030_codec_data *codec; + struct twl4030_vibra_data *vibra; + int audpwron_gpio; + int naudint_irq; + unsigned int irq_base; +}; + +enum twl4030_audio_res { + TWL4030_AUDIO_RES_POWER = 0, + TWL4030_AUDIO_RES_APLL = 1, + TWL4030_AUDIO_RES_MAX = 2, +}; + +struct twl4030_audio_resource { + int request_count; + u8 reg; + u8 mask; +}; + +struct twl4030_audio { + unsigned int audio_mclk; + struct mutex mutex; + struct twl4030_audio_resource resource[2]; + struct mfd_cell cells[2]; +}; + +struct mfd_of_node_entry { + struct list_head list; + struct device *dev; + struct device_node *np; +}; + +struct da9052 { + struct device *dev; + struct regmap *regmap; + struct mutex auxadc_lock; + struct completion done; + int irq_base; + struct regmap_irq_chip_data *irq_data; + u8 chip_id; + int chip_irq; + int (*fix_io)(struct da9052 *, unsigned char); +}; + +struct led_platform_data; + +struct da9052_pdata { + struct led_platform_data *pled; + int (*init)(struct da9052 *); + int irq_base; + int gpio_base; + int use_for_apm; + struct regulator_init_data *regulators[14]; +}; + +struct spi_device_id { + char name[32]; + kernel_ulong_t driver_data; +}; + +struct spi_driver { + const struct spi_device_id *id_table; + int (*probe)(struct spi_device *); + void (*remove)(struct spi_device *); + void (*shutdown)(struct spi_device *); + struct device_driver driver; +}; + +enum da9052_chip_id { + DA9052 = 0, + DA9053_AA = 1, + DA9053_BA = 2, + DA9053_BB = 3, + DA9053_BC = 4, +}; + +struct ac100_dev { + struct device *dev; + struct regmap *regmap; +}; + +enum axp20x_variants { + AXP152_ID = 0, + AXP202_ID = 1, + AXP209_ID = 2, + AXP221_ID = 3, + AXP223_ID = 4, + AXP288_ID = 5, + AXP803_ID = 6, + AXP806_ID = 7, + AXP809_ID = 8, + AXP813_ID = 9, + NR_AXP20X_VARIANTS = 10, +}; + +enum { + AXP152_IRQ_LDO0IN_CONNECT = 1, + AXP152_IRQ_LDO0IN_REMOVAL = 2, + AXP152_IRQ_ALDO0IN_CONNECT = 3, + AXP152_IRQ_ALDO0IN_REMOVAL = 4, + AXP152_IRQ_DCDC1_V_LOW = 5, + AXP152_IRQ_DCDC2_V_LOW = 6, + AXP152_IRQ_DCDC3_V_LOW = 7, + AXP152_IRQ_DCDC4_V_LOW = 8, + AXP152_IRQ_PEK_SHORT = 9, + AXP152_IRQ_PEK_LONG = 10, + AXP152_IRQ_TIMER = 11, + AXP152_IRQ_PEK_RIS_EDGE = 12, + AXP152_IRQ_PEK_FAL_EDGE = 13, + AXP152_IRQ_GPIO3_INPUT = 14, + AXP152_IRQ_GPIO2_INPUT = 15, + AXP152_IRQ_GPIO1_INPUT = 16, + AXP152_IRQ_GPIO0_INPUT = 17, +}; + +enum { + AXP20X_IRQ_ACIN_OVER_V = 1, + AXP20X_IRQ_ACIN_PLUGIN = 2, + AXP20X_IRQ_ACIN_REMOVAL = 3, + AXP20X_IRQ_VBUS_OVER_V = 4, + AXP20X_IRQ_VBUS_PLUGIN = 5, + AXP20X_IRQ_VBUS_REMOVAL = 6, + AXP20X_IRQ_VBUS_V_LOW = 7, + AXP20X_IRQ_BATT_PLUGIN = 8, + AXP20X_IRQ_BATT_REMOVAL = 9, + AXP20X_IRQ_BATT_ENT_ACT_MODE = 10, + AXP20X_IRQ_BATT_EXIT_ACT_MODE = 11, + AXP20X_IRQ_CHARG = 12, + AXP20X_IRQ_CHARG_DONE = 13, + AXP20X_IRQ_BATT_TEMP_HIGH = 14, + AXP20X_IRQ_BATT_TEMP_LOW = 15, + AXP20X_IRQ_DIE_TEMP_HIGH = 16, + AXP20X_IRQ_CHARG_I_LOW = 17, + AXP20X_IRQ_DCDC1_V_LONG = 18, + AXP20X_IRQ_DCDC2_V_LONG = 19, + AXP20X_IRQ_DCDC3_V_LONG = 20, + AXP20X_IRQ_PEK_SHORT = 22, + AXP20X_IRQ_PEK_LONG = 23, + AXP20X_IRQ_N_OE_PWR_ON = 24, + AXP20X_IRQ_N_OE_PWR_OFF = 25, + AXP20X_IRQ_VBUS_VALID = 26, + AXP20X_IRQ_VBUS_NOT_VALID = 27, + AXP20X_IRQ_VBUS_SESS_VALID = 28, + AXP20X_IRQ_VBUS_SESS_END = 29, + AXP20X_IRQ_LOW_PWR_LVL1 = 30, + AXP20X_IRQ_LOW_PWR_LVL2 = 31, + AXP20X_IRQ_TIMER = 32, + AXP20X_IRQ_PEK_RIS_EDGE = 33, + AXP20X_IRQ_PEK_FAL_EDGE = 34, + AXP20X_IRQ_GPIO3_INPUT = 35, + AXP20X_IRQ_GPIO2_INPUT = 36, + AXP20X_IRQ_GPIO1_INPUT = 37, + AXP20X_IRQ_GPIO0_INPUT = 38, +}; + +enum axp22x_irqs { + AXP22X_IRQ_ACIN_OVER_V = 1, + AXP22X_IRQ_ACIN_PLUGIN = 2, + AXP22X_IRQ_ACIN_REMOVAL = 3, + AXP22X_IRQ_VBUS_OVER_V = 4, + AXP22X_IRQ_VBUS_PLUGIN = 5, + AXP22X_IRQ_VBUS_REMOVAL = 6, + AXP22X_IRQ_VBUS_V_LOW = 7, + AXP22X_IRQ_BATT_PLUGIN = 8, + AXP22X_IRQ_BATT_REMOVAL = 9, + AXP22X_IRQ_BATT_ENT_ACT_MODE = 10, + AXP22X_IRQ_BATT_EXIT_ACT_MODE = 11, + AXP22X_IRQ_CHARG = 12, + AXP22X_IRQ_CHARG_DONE = 13, + AXP22X_IRQ_BATT_TEMP_HIGH = 14, + AXP22X_IRQ_BATT_TEMP_LOW = 15, + AXP22X_IRQ_DIE_TEMP_HIGH = 16, + AXP22X_IRQ_PEK_SHORT = 17, + AXP22X_IRQ_PEK_LONG = 18, + AXP22X_IRQ_LOW_PWR_LVL1 = 19, + AXP22X_IRQ_LOW_PWR_LVL2 = 20, + AXP22X_IRQ_TIMER = 21, + AXP22X_IRQ_PEK_RIS_EDGE = 22, + AXP22X_IRQ_PEK_FAL_EDGE = 23, + AXP22X_IRQ_GPIO1_INPUT = 24, + AXP22X_IRQ_GPIO0_INPUT = 25, +}; + +enum axp288_irqs { + AXP288_IRQ_VBUS_FALL = 2, + AXP288_IRQ_VBUS_RISE = 3, + AXP288_IRQ_OV = 4, + AXP288_IRQ_FALLING_ALT = 5, + AXP288_IRQ_RISING_ALT = 6, + AXP288_IRQ_OV_ALT = 7, + AXP288_IRQ_DONE = 10, + AXP288_IRQ_CHARGING = 11, + AXP288_IRQ_SAFE_QUIT = 12, + AXP288_IRQ_SAFE_ENTER = 13, + AXP288_IRQ_ABSENT = 14, + AXP288_IRQ_APPEND = 15, + AXP288_IRQ_QWBTU = 16, + AXP288_IRQ_WBTU = 17, + AXP288_IRQ_QWBTO = 18, + AXP288_IRQ_WBTO = 19, + AXP288_IRQ_QCBTU = 20, + AXP288_IRQ_CBTU = 21, + AXP288_IRQ_QCBTO = 22, + AXP288_IRQ_CBTO = 23, + AXP288_IRQ_WL2 = 24, + AXP288_IRQ_WL1 = 25, + AXP288_IRQ_GPADC = 26, + AXP288_IRQ_OT = 31, + AXP288_IRQ_GPIO0 = 32, + AXP288_IRQ_GPIO1 = 33, + AXP288_IRQ_POKO = 34, + AXP288_IRQ_POKL = 35, + AXP288_IRQ_POKS = 36, + AXP288_IRQ_POKN = 37, + AXP288_IRQ_POKP = 38, + AXP288_IRQ_TIMER = 39, + AXP288_IRQ_MV_CHNG = 40, + AXP288_IRQ_BC_USB_CHNG = 41, +}; + +enum axp803_irqs { + AXP803_IRQ_ACIN_OVER_V = 1, + AXP803_IRQ_ACIN_PLUGIN = 2, + AXP803_IRQ_ACIN_REMOVAL = 3, + AXP803_IRQ_VBUS_OVER_V = 4, + AXP803_IRQ_VBUS_PLUGIN = 5, + AXP803_IRQ_VBUS_REMOVAL = 6, + AXP803_IRQ_BATT_PLUGIN = 7, + AXP803_IRQ_BATT_REMOVAL = 8, + AXP803_IRQ_BATT_ENT_ACT_MODE = 9, + AXP803_IRQ_BATT_EXIT_ACT_MODE = 10, + AXP803_IRQ_CHARG = 11, + AXP803_IRQ_CHARG_DONE = 12, + AXP803_IRQ_BATT_CHG_TEMP_HIGH = 13, + AXP803_IRQ_BATT_CHG_TEMP_HIGH_END = 14, + AXP803_IRQ_BATT_CHG_TEMP_LOW = 15, + AXP803_IRQ_BATT_CHG_TEMP_LOW_END = 16, + AXP803_IRQ_BATT_ACT_TEMP_HIGH = 17, + AXP803_IRQ_BATT_ACT_TEMP_HIGH_END = 18, + AXP803_IRQ_BATT_ACT_TEMP_LOW = 19, + AXP803_IRQ_BATT_ACT_TEMP_LOW_END = 20, + AXP803_IRQ_DIE_TEMP_HIGH = 21, + AXP803_IRQ_GPADC = 22, + AXP803_IRQ_LOW_PWR_LVL1 = 23, + AXP803_IRQ_LOW_PWR_LVL2 = 24, + AXP803_IRQ_TIMER = 25, + AXP803_IRQ_PEK_RIS_EDGE = 26, + AXP803_IRQ_PEK_FAL_EDGE = 27, + AXP803_IRQ_PEK_SHORT = 28, + AXP803_IRQ_PEK_LONG = 29, + AXP803_IRQ_PEK_OVER_OFF = 30, + AXP803_IRQ_GPIO1_INPUT = 31, + AXP803_IRQ_GPIO0_INPUT = 32, + AXP803_IRQ_BC_USB_CHNG = 33, + AXP803_IRQ_MV_CHNG = 34, +}; + +enum axp806_irqs { + AXP806_IRQ_DIE_TEMP_HIGH_LV1 = 0, + AXP806_IRQ_DIE_TEMP_HIGH_LV2 = 1, + AXP806_IRQ_DCDCA_V_LOW = 2, + AXP806_IRQ_DCDCB_V_LOW = 3, + AXP806_IRQ_DCDCC_V_LOW = 4, + AXP806_IRQ_DCDCD_V_LOW = 5, + AXP806_IRQ_DCDCE_V_LOW = 6, + AXP806_IRQ_POK_LONG = 7, + AXP806_IRQ_POK_SHORT = 8, + AXP806_IRQ_WAKEUP = 9, + AXP806_IRQ_POK_FALL = 10, + AXP806_IRQ_POK_RISE = 11, +}; + +enum axp809_irqs { + AXP809_IRQ_ACIN_OVER_V = 1, + AXP809_IRQ_ACIN_PLUGIN = 2, + AXP809_IRQ_ACIN_REMOVAL = 3, + AXP809_IRQ_VBUS_OVER_V = 4, + AXP809_IRQ_VBUS_PLUGIN = 5, + AXP809_IRQ_VBUS_REMOVAL = 6, + AXP809_IRQ_VBUS_V_LOW = 7, + AXP809_IRQ_BATT_PLUGIN = 8, + AXP809_IRQ_BATT_REMOVAL = 9, + AXP809_IRQ_BATT_ENT_ACT_MODE = 10, + AXP809_IRQ_BATT_EXIT_ACT_MODE = 11, + AXP809_IRQ_CHARG = 12, + AXP809_IRQ_CHARG_DONE = 13, + AXP809_IRQ_BATT_CHG_TEMP_HIGH = 14, + AXP809_IRQ_BATT_CHG_TEMP_HIGH_END = 15, + AXP809_IRQ_BATT_CHG_TEMP_LOW = 16, + AXP809_IRQ_BATT_CHG_TEMP_LOW_END = 17, + AXP809_IRQ_BATT_ACT_TEMP_HIGH = 18, + AXP809_IRQ_BATT_ACT_TEMP_HIGH_END = 19, + AXP809_IRQ_BATT_ACT_TEMP_LOW = 20, + AXP809_IRQ_BATT_ACT_TEMP_LOW_END = 21, + AXP809_IRQ_DIE_TEMP_HIGH = 22, + AXP809_IRQ_LOW_PWR_LVL1 = 23, + AXP809_IRQ_LOW_PWR_LVL2 = 24, + AXP809_IRQ_TIMER = 25, + AXP809_IRQ_PEK_RIS_EDGE = 26, + AXP809_IRQ_PEK_FAL_EDGE = 27, + AXP809_IRQ_PEK_SHORT = 28, + AXP809_IRQ_PEK_LONG = 29, + AXP809_IRQ_PEK_OVER_OFF = 30, + AXP809_IRQ_GPIO1_INPUT = 31, + AXP809_IRQ_GPIO0_INPUT = 32, +}; + +struct axp20x_dev { + struct device *dev; + int irq; + long unsigned int irq_flags; + struct regmap *regmap; + struct regmap_irq_chip_data *regmap_irqc; + long int variant; + int nr_cells; + const struct mfd_cell *cells; + const struct regmap_config *regmap_cfg; + const struct regmap_irq_chip *regmap_irq_chip; +}; + +enum max77686_pmic_reg { + MAX77686_REG_DEVICE_ID = 0, + MAX77686_REG_INTSRC = 1, + MAX77686_REG_INT1 = 2, + MAX77686_REG_INT2 = 3, + MAX77686_REG_INT1MSK = 4, + MAX77686_REG_INT2MSK = 5, + MAX77686_REG_STATUS1 = 6, + MAX77686_REG_STATUS2 = 7, + MAX77686_REG_PWRON = 8, + MAX77686_REG_ONOFF_DELAY = 9, + MAX77686_REG_MRSTB = 10, + MAX77686_REG_BUCK1CTRL = 16, + MAX77686_REG_BUCK1OUT = 17, + MAX77686_REG_BUCK2CTRL1 = 18, + MAX77686_REG_BUCK234FREQ = 19, + MAX77686_REG_BUCK2DVS1 = 20, + MAX77686_REG_BUCK2DVS2 = 21, + MAX77686_REG_BUCK2DVS3 = 22, + MAX77686_REG_BUCK2DVS4 = 23, + MAX77686_REG_BUCK2DVS5 = 24, + MAX77686_REG_BUCK2DVS6 = 25, + MAX77686_REG_BUCK2DVS7 = 26, + MAX77686_REG_BUCK2DVS8 = 27, + MAX77686_REG_BUCK3CTRL1 = 28, + MAX77686_REG_BUCK3DVS1 = 30, + MAX77686_REG_BUCK3DVS2 = 31, + MAX77686_REG_BUCK3DVS3 = 32, + MAX77686_REG_BUCK3DVS4 = 33, + MAX77686_REG_BUCK3DVS5 = 34, + MAX77686_REG_BUCK3DVS6 = 35, + MAX77686_REG_BUCK3DVS7 = 36, + MAX77686_REG_BUCK3DVS8 = 37, + MAX77686_REG_BUCK4CTRL1 = 38, + MAX77686_REG_BUCK4DVS1 = 40, + MAX77686_REG_BUCK4DVS2 = 41, + MAX77686_REG_BUCK4DVS3 = 42, + MAX77686_REG_BUCK4DVS4 = 43, + MAX77686_REG_BUCK4DVS5 = 44, + MAX77686_REG_BUCK4DVS6 = 45, + MAX77686_REG_BUCK4DVS7 = 46, + MAX77686_REG_BUCK4DVS8 = 47, + MAX77686_REG_BUCK5CTRL = 48, + MAX77686_REG_BUCK5OUT = 49, + MAX77686_REG_BUCK6CTRL = 50, + MAX77686_REG_BUCK6OUT = 51, + MAX77686_REG_BUCK7CTRL = 52, + MAX77686_REG_BUCK7OUT = 53, + MAX77686_REG_BUCK8CTRL = 54, + MAX77686_REG_BUCK8OUT = 55, + MAX77686_REG_BUCK9CTRL = 56, + MAX77686_REG_BUCK9OUT = 57, + MAX77686_REG_LDO1CTRL1 = 64, + MAX77686_REG_LDO2CTRL1 = 65, + MAX77686_REG_LDO3CTRL1 = 66, + MAX77686_REG_LDO4CTRL1 = 67, + MAX77686_REG_LDO5CTRL1 = 68, + MAX77686_REG_LDO6CTRL1 = 69, + MAX77686_REG_LDO7CTRL1 = 70, + MAX77686_REG_LDO8CTRL1 = 71, + MAX77686_REG_LDO9CTRL1 = 72, + MAX77686_REG_LDO10CTRL1 = 73, + MAX77686_REG_LDO11CTRL1 = 74, + MAX77686_REG_LDO12CTRL1 = 75, + MAX77686_REG_LDO13CTRL1 = 76, + MAX77686_REG_LDO14CTRL1 = 77, + MAX77686_REG_LDO15CTRL1 = 78, + MAX77686_REG_LDO16CTRL1 = 79, + MAX77686_REG_LDO17CTRL1 = 80, + MAX77686_REG_LDO18CTRL1 = 81, + MAX77686_REG_LDO19CTRL1 = 82, + MAX77686_REG_LDO20CTRL1 = 83, + MAX77686_REG_LDO21CTRL1 = 84, + MAX77686_REG_LDO22CTRL1 = 85, + MAX77686_REG_LDO23CTRL1 = 86, + MAX77686_REG_LDO24CTRL1 = 87, + MAX77686_REG_LDO25CTRL1 = 88, + MAX77686_REG_LDO26CTRL1 = 89, + MAX77686_REG_LDO1CTRL2 = 96, + MAX77686_REG_LDO2CTRL2 = 97, + MAX77686_REG_LDO3CTRL2 = 98, + MAX77686_REG_LDO4CTRL2 = 99, + MAX77686_REG_LDO5CTRL2 = 100, + MAX77686_REG_LDO6CTRL2 = 101, + MAX77686_REG_LDO7CTRL2 = 102, + MAX77686_REG_LDO8CTRL2 = 103, + MAX77686_REG_LDO9CTRL2 = 104, + MAX77686_REG_LDO10CTRL2 = 105, + MAX77686_REG_LDO11CTRL2 = 106, + MAX77686_REG_LDO12CTRL2 = 107, + MAX77686_REG_LDO13CTRL2 = 108, + MAX77686_REG_LDO14CTRL2 = 109, + MAX77686_REG_LDO15CTRL2 = 110, + MAX77686_REG_LDO16CTRL2 = 111, + MAX77686_REG_LDO17CTRL2 = 112, + MAX77686_REG_LDO18CTRL2 = 113, + MAX77686_REG_LDO19CTRL2 = 114, + MAX77686_REG_LDO20CTRL2 = 115, + MAX77686_REG_LDO21CTRL2 = 116, + MAX77686_REG_LDO22CTRL2 = 117, + MAX77686_REG_LDO23CTRL2 = 118, + MAX77686_REG_LDO24CTRL2 = 119, + MAX77686_REG_LDO25CTRL2 = 120, + MAX77686_REG_LDO26CTRL2 = 121, + MAX77686_REG_BBAT_CHG = 126, + MAX77686_REG_32KHZ = 127, + MAX77686_REG_PMIC_END = 128, +}; + +enum max77802_pmic_reg { + MAX77802_REG_DEVICE_ID = 0, + MAX77802_REG_INTSRC = 1, + MAX77802_REG_INT1 = 2, + MAX77802_REG_INT2 = 3, + MAX77802_REG_INT1MSK = 4, + MAX77802_REG_INT2MSK = 5, + MAX77802_REG_STATUS1 = 6, + MAX77802_REG_STATUS2 = 7, + MAX77802_REG_PWRON = 8, + MAX77802_REG_MRSTB = 10, + MAX77802_REG_EPWRHOLD = 11, + MAX77802_REG_BOOSTCTRL = 14, + MAX77802_REG_BOOSTOUT = 15, + MAX77802_REG_BUCK1CTRL = 16, + MAX77802_REG_BUCK1DVS1 = 17, + MAX77802_REG_BUCK1DVS2 = 18, + MAX77802_REG_BUCK1DVS3 = 19, + MAX77802_REG_BUCK1DVS4 = 20, + MAX77802_REG_BUCK1DVS5 = 21, + MAX77802_REG_BUCK1DVS6 = 22, + MAX77802_REG_BUCK1DVS7 = 23, + MAX77802_REG_BUCK1DVS8 = 24, + MAX77802_REG_BUCK2CTRL1 = 26, + MAX77802_REG_BUCK2CTRL2 = 27, + MAX77802_REG_BUCK2PHTRAN = 28, + MAX77802_REG_BUCK2DVS1 = 29, + MAX77802_REG_BUCK2DVS2 = 30, + MAX77802_REG_BUCK2DVS3 = 31, + MAX77802_REG_BUCK2DVS4 = 32, + MAX77802_REG_BUCK2DVS5 = 33, + MAX77802_REG_BUCK2DVS6 = 34, + MAX77802_REG_BUCK2DVS7 = 35, + MAX77802_REG_BUCK2DVS8 = 36, + MAX77802_REG_BUCK3CTRL1 = 39, + MAX77802_REG_BUCK3DVS1 = 40, + MAX77802_REG_BUCK3DVS2 = 41, + MAX77802_REG_BUCK3DVS3 = 42, + MAX77802_REG_BUCK3DVS4 = 43, + MAX77802_REG_BUCK3DVS5 = 44, + MAX77802_REG_BUCK3DVS6 = 45, + MAX77802_REG_BUCK3DVS7 = 46, + MAX77802_REG_BUCK3DVS8 = 47, + MAX77802_REG_BUCK4CTRL1 = 55, + MAX77802_REG_BUCK4DVS1 = 56, + MAX77802_REG_BUCK4DVS2 = 57, + MAX77802_REG_BUCK4DVS3 = 58, + MAX77802_REG_BUCK4DVS4 = 59, + MAX77802_REG_BUCK4DVS5 = 60, + MAX77802_REG_BUCK4DVS6 = 61, + MAX77802_REG_BUCK4DVS7 = 62, + MAX77802_REG_BUCK4DVS8 = 63, + MAX77802_REG_BUCK5CTRL = 65, + MAX77802_REG_BUCK5OUT = 66, + MAX77802_REG_BUCK6CTRL = 68, + MAX77802_REG_BUCK6DVS1 = 69, + MAX77802_REG_BUCK6DVS2 = 70, + MAX77802_REG_BUCK6DVS3 = 71, + MAX77802_REG_BUCK6DVS4 = 72, + MAX77802_REG_BUCK6DVS5 = 73, + MAX77802_REG_BUCK6DVS6 = 74, + MAX77802_REG_BUCK6DVS7 = 75, + MAX77802_REG_BUCK6DVS8 = 76, + MAX77802_REG_BUCK7CTRL = 78, + MAX77802_REG_BUCK7OUT = 79, + MAX77802_REG_BUCK8CTRL = 81, + MAX77802_REG_BUCK8OUT = 82, + MAX77802_REG_BUCK9CTRL = 84, + MAX77802_REG_BUCK9OUT = 85, + MAX77802_REG_BUCK10CTRL = 87, + MAX77802_REG_BUCK10OUT = 88, + MAX77802_REG_LDO1CTRL1 = 96, + MAX77802_REG_LDO2CTRL1 = 97, + MAX77802_REG_LDO3CTRL1 = 98, + MAX77802_REG_LDO4CTRL1 = 99, + MAX77802_REG_LDO5CTRL1 = 100, + MAX77802_REG_LDO6CTRL1 = 101, + MAX77802_REG_LDO7CTRL1 = 102, + MAX77802_REG_LDO8CTRL1 = 103, + MAX77802_REG_LDO9CTRL1 = 104, + MAX77802_REG_LDO10CTRL1 = 105, + MAX77802_REG_LDO11CTRL1 = 106, + MAX77802_REG_LDO12CTRL1 = 107, + MAX77802_REG_LDO13CTRL1 = 108, + MAX77802_REG_LDO14CTRL1 = 109, + MAX77802_REG_LDO15CTRL1 = 110, + MAX77802_REG_LDO17CTRL1 = 112, + MAX77802_REG_LDO18CTRL1 = 113, + MAX77802_REG_LDO19CTRL1 = 114, + MAX77802_REG_LDO20CTRL1 = 115, + MAX77802_REG_LDO21CTRL1 = 116, + MAX77802_REG_LDO22CTRL1 = 117, + MAX77802_REG_LDO23CTRL1 = 118, + MAX77802_REG_LDO24CTRL1 = 119, + MAX77802_REG_LDO25CTRL1 = 120, + MAX77802_REG_LDO26CTRL1 = 121, + MAX77802_REG_LDO27CTRL1 = 122, + MAX77802_REG_LDO28CTRL1 = 123, + MAX77802_REG_LDO29CTRL1 = 124, + MAX77802_REG_LDO30CTRL1 = 125, + MAX77802_REG_LDO32CTRL1 = 127, + MAX77802_REG_LDO33CTRL1 = 128, + MAX77802_REG_LDO34CTRL1 = 129, + MAX77802_REG_LDO35CTRL1 = 130, + MAX77802_REG_LDO1CTRL2 = 144, + MAX77802_REG_LDO2CTRL2 = 145, + MAX77802_REG_LDO3CTRL2 = 146, + MAX77802_REG_LDO4CTRL2 = 147, + MAX77802_REG_LDO5CTRL2 = 148, + MAX77802_REG_LDO6CTRL2 = 149, + MAX77802_REG_LDO7CTRL2 = 150, + MAX77802_REG_LDO8CTRL2 = 151, + MAX77802_REG_LDO9CTRL2 = 152, + MAX77802_REG_LDO10CTRL2 = 153, + MAX77802_REG_LDO11CTRL2 = 154, + MAX77802_REG_LDO12CTRL2 = 155, + MAX77802_REG_LDO13CTRL2 = 156, + MAX77802_REG_LDO14CTRL2 = 157, + MAX77802_REG_LDO15CTRL2 = 158, + MAX77802_REG_LDO17CTRL2 = 160, + MAX77802_REG_LDO18CTRL2 = 161, + MAX77802_REG_LDO19CTRL2 = 162, + MAX77802_REG_LDO20CTRL2 = 163, + MAX77802_REG_LDO21CTRL2 = 164, + MAX77802_REG_LDO22CTRL2 = 165, + MAX77802_REG_LDO23CTRL2 = 166, + MAX77802_REG_LDO24CTRL2 = 167, + MAX77802_REG_LDO25CTRL2 = 168, + MAX77802_REG_LDO26CTRL2 = 169, + MAX77802_REG_LDO27CTRL2 = 170, + MAX77802_REG_LDO28CTRL2 = 171, + MAX77802_REG_LDO29CTRL2 = 172, + MAX77802_REG_LDO30CTRL2 = 173, + MAX77802_REG_LDO32CTRL2 = 175, + MAX77802_REG_LDO33CTRL2 = 176, + MAX77802_REG_LDO34CTRL2 = 177, + MAX77802_REG_LDO35CTRL2 = 178, + MAX77802_REG_BBAT_CHG = 180, + MAX77802_REG_32KHZ = 181, + MAX77802_REG_PMIC_END = 182, +}; + +enum max77802_rtc_reg { + MAX77802_RTC_INT = 192, + MAX77802_RTC_INTM = 193, + MAX77802_RTC_CONTROLM = 194, + MAX77802_RTC_CONTROL = 195, + MAX77802_RTC_UPDATE0 = 196, + MAX77802_RTC_UPDATE1 = 197, + MAX77802_WTSR_SMPL_CNTL = 198, + MAX77802_RTC_SEC = 199, + MAX77802_RTC_MIN = 200, + MAX77802_RTC_HOUR = 201, + MAX77802_RTC_WEEKDAY = 202, + MAX77802_RTC_MONTH = 203, + MAX77802_RTC_YEAR = 204, + MAX77802_RTC_MONTHDAY = 205, + MAX77802_RTC_AE1 = 206, + MAX77802_ALARM1_SEC = 207, + MAX77802_ALARM1_MIN = 208, + MAX77802_ALARM1_HOUR = 209, + MAX77802_ALARM1_WEEKDAY = 210, + MAX77802_ALARM1_MONTH = 211, + MAX77802_ALARM1_YEAR = 212, + MAX77802_ALARM1_DATE = 213, + MAX77802_RTC_AE2 = 214, + MAX77802_ALARM2_SEC = 215, + MAX77802_ALARM2_MIN = 216, + MAX77802_ALARM2_HOUR = 217, + MAX77802_ALARM2_WEEKDAY = 218, + MAX77802_ALARM2_MONTH = 219, + MAX77802_ALARM2_YEAR = 220, + MAX77802_ALARM2_DATE = 221, + MAX77802_RTC_END = 223, +}; + +enum max77686_irq_source { + PMIC_INT1 = 0, + PMIC_INT2 = 1, + RTC_INT = 2, + MAX77686_IRQ_GROUP_NR = 3, +}; + +struct max77686_dev { + struct device *dev; + struct i2c_client *i2c; + long unsigned int type; + struct regmap *regmap; + struct regmap_irq_chip_data *irq_data; + int irq; + struct mutex irqlock; + int irq_masks_cur[3]; + int irq_masks_cache[3]; +}; + +enum max77686_types { + TYPE_MAX77686 = 0, + TYPE_MAX77802 = 1, +}; + +enum usbhs_omap_port_mode { + OMAP_USBHS_PORT_MODE_UNUSED = 0, + OMAP_EHCI_PORT_MODE_PHY = 1, + OMAP_EHCI_PORT_MODE_TLL = 2, + OMAP_EHCI_PORT_MODE_HSIC = 3, + OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0 = 4, + OMAP_OHCI_PORT_MODE_PHY_6PIN_DPDM = 5, + OMAP_OHCI_PORT_MODE_PHY_3PIN_DATSE0 = 6, + OMAP_OHCI_PORT_MODE_PHY_4PIN_DPDM = 7, + OMAP_OHCI_PORT_MODE_TLL_6PIN_DATSE0 = 8, + OMAP_OHCI_PORT_MODE_TLL_6PIN_DPDM = 9, + OMAP_OHCI_PORT_MODE_TLL_3PIN_DATSE0 = 10, + OMAP_OHCI_PORT_MODE_TLL_4PIN_DPDM = 11, + OMAP_OHCI_PORT_MODE_TLL_2PIN_DATSE0 = 12, + OMAP_OHCI_PORT_MODE_TLL_2PIN_DPDM = 13, +}; + +struct ehci_hcd_omap_platform_data { + enum usbhs_omap_port_mode port_mode[3]; + int reset_gpio_port[3]; + struct regulator *regulator[3]; + unsigned int phy_reset: 1; +}; + +struct ohci_hcd_omap_platform_data { + enum usbhs_omap_port_mode port_mode[3]; + unsigned int es2_compatibility: 1; +}; + +struct usbhs_omap_platform_data { + int nports; + enum usbhs_omap_port_mode port_mode[3]; + int reset_gpio_port[3]; + struct regulator *regulator[3]; + struct ehci_hcd_omap_platform_data *ehci_data; + struct ohci_hcd_omap_platform_data *ohci_data; + unsigned int single_ulpi_bypass: 1; + unsigned int es2_compatibility: 1; + unsigned int phy_reset: 1; +}; + +struct usbhs_hcd_omap { + int nports; + struct clk **utmi_clk; + struct clk **hsic60m_clk; + struct clk **hsic480m_clk; + struct clk *xclk60mhsp1_ck; + struct clk *xclk60mhsp2_ck; + struct clk *utmi_p1_gfclk; + struct clk *utmi_p2_gfclk; + struct clk *init_60m_fclk; + struct clk *ehci_logic_fck; + void *uhh_base; + struct usbhs_omap_platform_data *pdata; + u32 usbhs_rev; +}; + +struct usbtll_omap { + void *base; + int nch; + struct clk *ch_clk[0]; +}; + +enum tps65917_irqs { + TPS65917_RESERVED1 = 0, + TPS65917_PWRON_IRQ = 1, + TPS65917_LONG_PRESS_KEY_IRQ = 2, + TPS65917_RESERVED2 = 3, + TPS65917_PWRDOWN_IRQ = 4, + TPS65917_HOTDIE_IRQ = 5, + TPS65917_VSYS_MON_IRQ = 6, + TPS65917_RESERVED3 = 7, + TPS65917_RESERVED4 = 8, + TPS65917_OTP_ERROR_IRQ = 9, + TPS65917_WDT_IRQ = 10, + TPS65917_RESERVED5 = 11, + TPS65917_RESET_IN_IRQ = 12, + TPS65917_FSD_IRQ = 13, + TPS65917_SHORT_IRQ = 14, + TPS65917_RESERVED6 = 15, + TPS65917_GPADC_AUTO_0_IRQ = 16, + TPS65917_GPADC_AUTO_1_IRQ = 17, + TPS65917_GPADC_EOC_SW_IRQ = 18, + TPS65917_RESREVED6 = 19, + TPS65917_RESERVED7 = 20, + TPS65917_RESERVED8 = 21, + TPS65917_RESERVED9 = 22, + TPS65917_VBUS_IRQ = 23, + TPS65917_GPIO_0_IRQ = 24, + TPS65917_GPIO_1_IRQ = 25, + TPS65917_GPIO_2_IRQ = 26, + TPS65917_GPIO_3_IRQ = 27, + TPS65917_GPIO_4_IRQ = 28, + TPS65917_GPIO_5_IRQ = 29, + TPS65917_GPIO_6_IRQ = 30, + TPS65917_RESERVED10 = 31, + TPS65917_NUM_IRQ = 32, +}; + +struct palmas_driver_data { + unsigned int *features; + struct regmap_irq_chip *irq_chip; +}; + +enum rk817_reg_id { + RK817_ID_DCDC1 = 0, + RK817_ID_DCDC2 = 1, + RK817_ID_DCDC3 = 2, + RK817_ID_DCDC4 = 3, + RK817_ID_LDO1 = 4, + RK817_ID_LDO2 = 5, + RK817_ID_LDO3 = 6, + RK817_ID_LDO4 = 7, + RK817_ID_LDO5 = 8, + RK817_ID_LDO6 = 9, + RK817_ID_LDO7 = 10, + RK817_ID_LDO8 = 11, + RK817_ID_LDO9 = 12, + RK817_ID_BOOST = 13, + RK817_ID_BOOST_OTG_SW = 14, + RK817_NUM_REGULATORS = 15, +}; + +enum { + BUCK_ILMIN_50MA = 0, + BUCK_ILMIN_100MA = 1, + BUCK_ILMIN_150MA = 2, + BUCK_ILMIN_200MA = 3, + BUCK_ILMIN_250MA = 4, + BUCK_ILMIN_300MA = 5, + BUCK_ILMIN_350MA = 6, + BUCK_ILMIN_400MA = 7, +}; + +enum { + BOOST_ILMIN_75MA = 0, + BOOST_ILMIN_100MA = 1, + BOOST_ILMIN_125MA = 2, + BOOST_ILMIN_150MA = 3, + BOOST_ILMIN_175MA = 4, + BOOST_ILMIN_200MA = 5, + BOOST_ILMIN_225MA = 6, + BOOST_ILMIN_250MA = 7, +}; + +enum { + RK805_BUCK1_2_ILMAX_2500MA = 0, + RK805_BUCK1_2_ILMAX_3000MA = 1, + RK805_BUCK1_2_ILMAX_3500MA = 2, + RK805_BUCK1_2_ILMAX_4000MA = 3, +}; + +enum { + RK805_BUCK3_ILMAX_1500MA = 0, + RK805_BUCK3_ILMAX_2000MA = 1, + RK805_BUCK3_ILMAX_2500MA = 2, + RK805_BUCK3_ILMAX_3000MA = 3, +}; + +enum { + RK805_BUCK4_ILMAX_2000MA = 0, + RK805_BUCK4_ILMAX_2500MA = 1, + RK805_BUCK4_ILMAX_3000MA = 2, + RK805_BUCK4_ILMAX_3500MA = 3, +}; + +enum { + RK805_ID = 32848, + RK808_ID = 0, + RK809_ID = 32912, + RK817_ID = 33136, + RK818_ID = 33152, +}; + +struct rk808 { + struct i2c_client *i2c; + struct regmap_irq_chip_data *irq_data; + struct regmap *regmap; + long int variant; + const struct regmap_config *regmap_cfg; + const struct regmap_irq_chip *regmap_irq_chip; +}; + +struct rk808_reg_data { + int addr; + int mask; + int value; +}; + +enum sec_device_type { + S5M8751X = 0, + S5M8763X = 1, + S5M8767X = 2, + S2MPA01 = 3, + S2MPS11X = 4, + S2MPS13X = 5, + S2MPS14X = 6, + S2MPS15X = 7, + S2MPU02 = 8, +}; + +struct sec_platform_data; + +struct sec_pmic_dev { + struct device *dev; + struct sec_platform_data *pdata; + struct regmap *regmap_pmic; + struct i2c_client *i2c; + long unsigned int device_type; + int irq; + struct regmap_irq_chip_data *irq_data; +}; + +struct sec_regulator_data; + +struct sec_opmode_data; + +struct sec_platform_data { + struct sec_regulator_data *regulators; + struct sec_opmode_data *opmode; + int num_regulators; + int buck_gpios[3]; + int buck_ds[3]; + unsigned int buck2_voltage[8]; + bool buck2_gpiodvs; + unsigned int buck3_voltage[8]; + bool buck3_gpiodvs; + unsigned int buck4_voltage[8]; + bool buck4_gpiodvs; + int buck_default_idx; + int buck_ramp_delay; + bool buck2_ramp_enable; + bool buck3_ramp_enable; + bool buck4_ramp_enable; + int buck2_init; + int buck3_init; + int buck4_init; + bool manual_poweroff; + bool disable_wrstbi; +}; + +struct sec_regulator_data { + int id; + struct regulator_init_data *initdata; + struct device_node *reg_node; + struct gpio_desc *ext_control_gpiod; +}; + +struct sec_opmode_data { + int id; + unsigned int mode; +}; + +enum s2mpa01_reg { + S2MPA01_REG_ID = 0, + S2MPA01_REG_INT1 = 1, + S2MPA01_REG_INT2 = 2, + S2MPA01_REG_INT3 = 3, + S2MPA01_REG_INT1M = 4, + S2MPA01_REG_INT2M = 5, + S2MPA01_REG_INT3M = 6, + S2MPA01_REG_ST1 = 7, + S2MPA01_REG_ST2 = 8, + S2MPA01_REG_PWRONSRC = 9, + S2MPA01_REG_OFFSRC = 10, + S2MPA01_REG_RTC_BUF = 11, + S2MPA01_REG_CTRL1 = 12, + S2MPA01_REG_ETC_TEST = 13, + S2MPA01_REG_RSVD1 = 14, + S2MPA01_REG_BU_CHG = 15, + S2MPA01_REG_RAMP1 = 16, + S2MPA01_REG_RAMP2 = 17, + S2MPA01_REG_LDO_DSCH1 = 18, + S2MPA01_REG_LDO_DSCH2 = 19, + S2MPA01_REG_LDO_DSCH3 = 20, + S2MPA01_REG_LDO_DSCH4 = 21, + S2MPA01_REG_OTP_ADRL = 22, + S2MPA01_REG_OTP_ADRH = 23, + S2MPA01_REG_OTP_DATA = 24, + S2MPA01_REG_MON1SEL = 25, + S2MPA01_REG_MON2SEL = 26, + S2MPA01_REG_LEE = 27, + S2MPA01_REG_RSVD2 = 28, + S2MPA01_REG_RSVD3 = 29, + S2MPA01_REG_RSVD4 = 30, + S2MPA01_REG_RSVD5 = 31, + S2MPA01_REG_RSVD6 = 32, + S2MPA01_REG_TOP_RSVD = 33, + S2MPA01_REG_DVS_SEL = 34, + S2MPA01_REG_DVS_PTR = 35, + S2MPA01_REG_DVS_DATA = 36, + S2MPA01_REG_RSVD_NO = 37, + S2MPA01_REG_UVLO = 38, + S2MPA01_REG_LEE_NO = 39, + S2MPA01_REG_B1CTRL1 = 40, + S2MPA01_REG_B1CTRL2 = 41, + S2MPA01_REG_B2CTRL1 = 42, + S2MPA01_REG_B2CTRL2 = 43, + S2MPA01_REG_B3CTRL1 = 44, + S2MPA01_REG_B3CTRL2 = 45, + S2MPA01_REG_B4CTRL1 = 46, + S2MPA01_REG_B4CTRL2 = 47, + S2MPA01_REG_B5CTRL1 = 48, + S2MPA01_REG_B5CTRL2 = 49, + S2MPA01_REG_B5CTRL3 = 50, + S2MPA01_REG_B5CTRL4 = 51, + S2MPA01_REG_B5CTRL5 = 52, + S2MPA01_REG_B5CTRL6 = 53, + S2MPA01_REG_B6CTRL1 = 54, + S2MPA01_REG_B6CTRL2 = 55, + S2MPA01_REG_B7CTRL1 = 56, + S2MPA01_REG_B7CTRL2 = 57, + S2MPA01_REG_B8CTRL1 = 58, + S2MPA01_REG_B8CTRL2 = 59, + S2MPA01_REG_B9CTRL1 = 60, + S2MPA01_REG_B9CTRL2 = 61, + S2MPA01_REG_B10CTRL1 = 62, + S2MPA01_REG_B10CTRL2 = 63, + S2MPA01_REG_L1CTRL = 64, + S2MPA01_REG_L2CTRL = 65, + S2MPA01_REG_L3CTRL = 66, + S2MPA01_REG_L4CTRL = 67, + S2MPA01_REG_L5CTRL = 68, + S2MPA01_REG_L6CTRL = 69, + S2MPA01_REG_L7CTRL = 70, + S2MPA01_REG_L8CTRL = 71, + S2MPA01_REG_L9CTRL = 72, + S2MPA01_REG_L10CTRL = 73, + S2MPA01_REG_L11CTRL = 74, + S2MPA01_REG_L12CTRL = 75, + S2MPA01_REG_L13CTRL = 76, + S2MPA01_REG_L14CTRL = 77, + S2MPA01_REG_L15CTRL = 78, + S2MPA01_REG_L16CTRL = 79, + S2MPA01_REG_L17CTRL = 80, + S2MPA01_REG_L18CTRL = 81, + S2MPA01_REG_L19CTRL = 82, + S2MPA01_REG_L20CTRL = 83, + S2MPA01_REG_L21CTRL = 84, + S2MPA01_REG_L22CTRL = 85, + S2MPA01_REG_L23CTRL = 86, + S2MPA01_REG_L24CTRL = 87, + S2MPA01_REG_L25CTRL = 88, + S2MPA01_REG_L26CTRL = 89, + S2MPA01_REG_LDO_OVCB1 = 90, + S2MPA01_REG_LDO_OVCB2 = 91, + S2MPA01_REG_LDO_OVCB3 = 92, + S2MPA01_REG_LDO_OVCB4 = 93, +}; + +enum s2mps11_reg { + S2MPS11_REG_ID = 0, + S2MPS11_REG_INT1 = 1, + S2MPS11_REG_INT2 = 2, + S2MPS11_REG_INT3 = 3, + S2MPS11_REG_INT1M = 4, + S2MPS11_REG_INT2M = 5, + S2MPS11_REG_INT3M = 6, + S2MPS11_REG_ST1 = 7, + S2MPS11_REG_ST2 = 8, + S2MPS11_REG_OFFSRC = 9, + S2MPS11_REG_PWRONSRC = 10, + S2MPS11_REG_RTC_CTRL = 11, + S2MPS11_REG_CTRL1 = 12, + S2MPS11_REG_ETC_TEST = 13, + S2MPS11_REG_RSVD3 = 14, + S2MPS11_REG_BU_CHG = 15, + S2MPS11_REG_RAMP = 16, + S2MPS11_REG_RAMP_BUCK = 17, + S2MPS11_REG_LDO1_8 = 18, + S2MPS11_REG_LDO9_16 = 19, + S2MPS11_REG_LDO17_24 = 20, + S2MPS11_REG_LDO25_32 = 21, + S2MPS11_REG_LDO33_38 = 22, + S2MPS11_REG_LDO1_8_1 = 23, + S2MPS11_REG_LDO9_16_1 = 24, + S2MPS11_REG_LDO17_24_1 = 25, + S2MPS11_REG_LDO25_32_1 = 26, + S2MPS11_REG_LDO33_38_1 = 27, + S2MPS11_REG_OTP_ADRL = 28, + S2MPS11_REG_OTP_ADRH = 29, + S2MPS11_REG_OTP_DATA = 30, + S2MPS11_REG_MON1SEL = 31, + S2MPS11_REG_MON2SEL = 32, + S2MPS11_REG_LEE = 33, + S2MPS11_REG_RSVD_NO = 34, + S2MPS11_REG_UVLO = 35, + S2MPS11_REG_LEE_NO = 36, + S2MPS11_REG_B1CTRL1 = 37, + S2MPS11_REG_B1CTRL2 = 38, + S2MPS11_REG_B2CTRL1 = 39, + S2MPS11_REG_B2CTRL2 = 40, + S2MPS11_REG_B3CTRL1 = 41, + S2MPS11_REG_B3CTRL2 = 42, + S2MPS11_REG_B4CTRL1 = 43, + S2MPS11_REG_B4CTRL2 = 44, + S2MPS11_REG_B5CTRL1 = 45, + S2MPS11_REG_BUCK5_SW = 46, + S2MPS11_REG_B5CTRL2 = 47, + S2MPS11_REG_B5CTRL3 = 48, + S2MPS11_REG_B5CTRL4 = 49, + S2MPS11_REG_B5CTRL5 = 50, + S2MPS11_REG_B6CTRL1 = 51, + S2MPS11_REG_B6CTRL2 = 52, + S2MPS11_REG_B7CTRL1 = 53, + S2MPS11_REG_B7CTRL2 = 54, + S2MPS11_REG_B8CTRL1 = 55, + S2MPS11_REG_B8CTRL2 = 56, + S2MPS11_REG_B9CTRL1 = 57, + S2MPS11_REG_B9CTRL2 = 58, + S2MPS11_REG_B10CTRL1 = 59, + S2MPS11_REG_B10CTRL2 = 60, + S2MPS11_REG_L1CTRL = 61, + S2MPS11_REG_L2CTRL = 62, + S2MPS11_REG_L3CTRL = 63, + S2MPS11_REG_L4CTRL = 64, + S2MPS11_REG_L5CTRL = 65, + S2MPS11_REG_L6CTRL = 66, + S2MPS11_REG_L7CTRL = 67, + S2MPS11_REG_L8CTRL = 68, + S2MPS11_REG_L9CTRL = 69, + S2MPS11_REG_L10CTRL = 70, + S2MPS11_REG_L11CTRL = 71, + S2MPS11_REG_L12CTRL = 72, + S2MPS11_REG_L13CTRL = 73, + S2MPS11_REG_L14CTRL = 74, + S2MPS11_REG_L15CTRL = 75, + S2MPS11_REG_L16CTRL = 76, + S2MPS11_REG_L17CTRL = 77, + S2MPS11_REG_L18CTRL = 78, + S2MPS11_REG_L19CTRL = 79, + S2MPS11_REG_L20CTRL = 80, + S2MPS11_REG_L21CTRL = 81, + S2MPS11_REG_L22CTRL = 82, + S2MPS11_REG_L23CTRL = 83, + S2MPS11_REG_L24CTRL = 84, + S2MPS11_REG_L25CTRL = 85, + S2MPS11_REG_L26CTRL = 86, + S2MPS11_REG_L27CTRL = 87, + S2MPS11_REG_L28CTRL = 88, + S2MPS11_REG_L29CTRL = 89, + S2MPS11_REG_L30CTRL = 90, + S2MPS11_REG_L31CTRL = 91, + S2MPS11_REG_L32CTRL = 92, + S2MPS11_REG_L33CTRL = 93, + S2MPS11_REG_L34CTRL = 94, + S2MPS11_REG_L35CTRL = 95, + S2MPS11_REG_L36CTRL = 96, + S2MPS11_REG_L37CTRL = 97, + S2MPS11_REG_L38CTRL = 98, +}; + +enum s2mps13_reg { + S2MPS13_REG_ID = 0, + S2MPS13_REG_INT1 = 1, + S2MPS13_REG_INT2 = 2, + S2MPS13_REG_INT3 = 3, + S2MPS13_REG_INT1M = 4, + S2MPS13_REG_INT2M = 5, + S2MPS13_REG_INT3M = 6, + S2MPS13_REG_ST1 = 7, + S2MPS13_REG_ST2 = 8, + S2MPS13_REG_PWRONSRC = 9, + S2MPS13_REG_OFFSRC = 10, + S2MPS13_REG_BU_CHG = 11, + S2MPS13_REG_RTCCTRL = 12, + S2MPS13_REG_CTRL1 = 13, + S2MPS13_REG_CTRL2 = 14, + S2MPS13_REG_RSVD1 = 15, + S2MPS13_REG_RSVD2 = 16, + S2MPS13_REG_RSVD3 = 17, + S2MPS13_REG_RSVD4 = 18, + S2MPS13_REG_RSVD5 = 19, + S2MPS13_REG_RSVD6 = 20, + S2MPS13_REG_CTRL3 = 21, + S2MPS13_REG_RSVD7 = 22, + S2MPS13_REG_RSVD8 = 23, + S2MPS13_REG_WRSTBI = 24, + S2MPS13_REG_B1CTRL = 25, + S2MPS13_REG_B1OUT = 26, + S2MPS13_REG_B2CTRL = 27, + S2MPS13_REG_B2OUT = 28, + S2MPS13_REG_B3CTRL = 29, + S2MPS13_REG_B3OUT = 30, + S2MPS13_REG_B4CTRL = 31, + S2MPS13_REG_B4OUT = 32, + S2MPS13_REG_B5CTRL = 33, + S2MPS13_REG_B5OUT = 34, + S2MPS13_REG_B6CTRL = 35, + S2MPS13_REG_B6OUT = 36, + S2MPS13_REG_B7CTRL = 37, + S2MPS13_REG_B7SW = 38, + S2MPS13_REG_B7OUT = 39, + S2MPS13_REG_B8CTRL = 40, + S2MPS13_REG_B8OUT = 41, + S2MPS13_REG_B9CTRL = 42, + S2MPS13_REG_B9OUT = 43, + S2MPS13_REG_B10CTRL = 44, + S2MPS13_REG_B10OUT = 45, + S2MPS13_REG_BB1CTRL = 46, + S2MPS13_REG_BB1OUT = 47, + S2MPS13_REG_BUCK_RAMP1 = 48, + S2MPS13_REG_BUCK_RAMP2 = 49, + S2MPS13_REG_LDO_DVS1 = 50, + S2MPS13_REG_LDO_DVS2 = 51, + S2MPS13_REG_LDO_DVS3 = 52, + S2MPS13_REG_B6OUT2 = 53, + S2MPS13_REG_L1CTRL = 54, + S2MPS13_REG_L2CTRL = 55, + S2MPS13_REG_L3CTRL = 56, + S2MPS13_REG_L4CTRL = 57, + S2MPS13_REG_L5CTRL = 58, + S2MPS13_REG_L6CTRL = 59, + S2MPS13_REG_L7CTRL = 60, + S2MPS13_REG_L8CTRL = 61, + S2MPS13_REG_L9CTRL = 62, + S2MPS13_REG_L10CTRL = 63, + S2MPS13_REG_L11CTRL = 64, + S2MPS13_REG_L12CTRL = 65, + S2MPS13_REG_L13CTRL = 66, + S2MPS13_REG_L14CTRL = 67, + S2MPS13_REG_L15CTRL = 68, + S2MPS13_REG_L16CTRL = 69, + S2MPS13_REG_L17CTRL = 70, + S2MPS13_REG_L18CTRL = 71, + S2MPS13_REG_L19CTRL = 72, + S2MPS13_REG_L20CTRL = 73, + S2MPS13_REG_L21CTRL = 74, + S2MPS13_REG_L22CTRL = 75, + S2MPS13_REG_L23CTRL = 76, + S2MPS13_REG_L24CTRL = 77, + S2MPS13_REG_L25CTRL = 78, + S2MPS13_REG_L26CTRL = 79, + S2MPS13_REG_L27CTRL = 80, + S2MPS13_REG_L28CTRL = 81, + S2MPS13_REG_L29CTRL = 82, + S2MPS13_REG_L30CTRL = 83, + S2MPS13_REG_L31CTRL = 84, + S2MPS13_REG_L32CTRL = 85, + S2MPS13_REG_L33CTRL = 86, + S2MPS13_REG_L34CTRL = 87, + S2MPS13_REG_L35CTRL = 88, + S2MPS13_REG_L36CTRL = 89, + S2MPS13_REG_L37CTRL = 90, + S2MPS13_REG_L38CTRL = 91, + S2MPS13_REG_L39CTRL = 92, + S2MPS13_REG_L40CTRL = 93, + S2MPS13_REG_LDODSCH1 = 94, + S2MPS13_REG_LDODSCH2 = 95, + S2MPS13_REG_LDODSCH3 = 96, + S2MPS13_REG_LDODSCH4 = 97, + S2MPS13_REG_LDODSCH5 = 98, +}; + +enum s2mps14_reg { + S2MPS14_REG_ID = 0, + S2MPS14_REG_INT1 = 1, + S2MPS14_REG_INT2 = 2, + S2MPS14_REG_INT3 = 3, + S2MPS14_REG_INT1M = 4, + S2MPS14_REG_INT2M = 5, + S2MPS14_REG_INT3M = 6, + S2MPS14_REG_ST1 = 7, + S2MPS14_REG_ST2 = 8, + S2MPS14_REG_PWRONSRC = 9, + S2MPS14_REG_OFFSRC = 10, + S2MPS14_REG_BU_CHG = 11, + S2MPS14_REG_RTCCTRL = 12, + S2MPS14_REG_CTRL1 = 13, + S2MPS14_REG_CTRL2 = 14, + S2MPS14_REG_RSVD1 = 15, + S2MPS14_REG_RSVD2 = 16, + S2MPS14_REG_RSVD3 = 17, + S2MPS14_REG_RSVD4 = 18, + S2MPS14_REG_RSVD5 = 19, + S2MPS14_REG_RSVD6 = 20, + S2MPS14_REG_CTRL3 = 21, + S2MPS14_REG_RSVD7 = 22, + S2MPS14_REG_RSVD8 = 23, + S2MPS14_REG_WRSTBI = 24, + S2MPS14_REG_B1CTRL1 = 25, + S2MPS14_REG_B1CTRL2 = 26, + S2MPS14_REG_B2CTRL1 = 27, + S2MPS14_REG_B2CTRL2 = 28, + S2MPS14_REG_B3CTRL1 = 29, + S2MPS14_REG_B3CTRL2 = 30, + S2MPS14_REG_B4CTRL1 = 31, + S2MPS14_REG_B4CTRL2 = 32, + S2MPS14_REG_B5CTRL1 = 33, + S2MPS14_REG_B5CTRL2 = 34, + S2MPS14_REG_L1CTRL = 35, + S2MPS14_REG_L2CTRL = 36, + S2MPS14_REG_L3CTRL = 37, + S2MPS14_REG_L4CTRL = 38, + S2MPS14_REG_L5CTRL = 39, + S2MPS14_REG_L6CTRL = 40, + S2MPS14_REG_L7CTRL = 41, + S2MPS14_REG_L8CTRL = 42, + S2MPS14_REG_L9CTRL = 43, + S2MPS14_REG_L10CTRL = 44, + S2MPS14_REG_L11CTRL = 45, + S2MPS14_REG_L12CTRL = 46, + S2MPS14_REG_L13CTRL = 47, + S2MPS14_REG_L14CTRL = 48, + S2MPS14_REG_L15CTRL = 49, + S2MPS14_REG_L16CTRL = 50, + S2MPS14_REG_L17CTRL = 51, + S2MPS14_REG_L18CTRL = 52, + S2MPS14_REG_L19CTRL = 53, + S2MPS14_REG_L20CTRL = 54, + S2MPS14_REG_L21CTRL = 55, + S2MPS14_REG_L22CTRL = 56, + S2MPS14_REG_L23CTRL = 57, + S2MPS14_REG_L24CTRL = 58, + S2MPS14_REG_L25CTRL = 59, + S2MPS14_REG_LDODSCH1 = 60, + S2MPS14_REG_LDODSCH2 = 61, + S2MPS14_REG_LDODSCH3 = 62, +}; + +enum s2mps15_reg { + S2MPS15_REG_ID = 0, + S2MPS15_REG_INT1 = 1, + S2MPS15_REG_INT2 = 2, + S2MPS15_REG_INT3 = 3, + S2MPS15_REG_INT1M = 4, + S2MPS15_REG_INT2M = 5, + S2MPS15_REG_INT3M = 6, + S2MPS15_REG_ST1 = 7, + S2MPS15_REG_ST2 = 8, + S2MPS15_REG_PWRONSRC = 9, + S2MPS15_REG_OFFSRC = 10, + S2MPS15_REG_BU_CHG = 11, + S2MPS15_REG_RTC_BUF = 12, + S2MPS15_REG_CTRL1 = 13, + S2MPS15_REG_CTRL2 = 14, + S2MPS15_REG_RSVD1 = 15, + S2MPS15_REG_RSVD2 = 16, + S2MPS15_REG_RSVD3 = 17, + S2MPS15_REG_RSVD4 = 18, + S2MPS15_REG_RSVD5 = 19, + S2MPS15_REG_RSVD6 = 20, + S2MPS15_REG_CTRL3 = 21, + S2MPS15_REG_RSVD7 = 22, + S2MPS15_REG_RSVD8 = 23, + S2MPS15_REG_RSVD9 = 24, + S2MPS15_REG_B1CTRL1 = 25, + S2MPS15_REG_B1CTRL2 = 26, + S2MPS15_REG_B2CTRL1 = 27, + S2MPS15_REG_B2CTRL2 = 28, + S2MPS15_REG_B3CTRL1 = 29, + S2MPS15_REG_B3CTRL2 = 30, + S2MPS15_REG_B4CTRL1 = 31, + S2MPS15_REG_B4CTRL2 = 32, + S2MPS15_REG_B5CTRL1 = 33, + S2MPS15_REG_B5CTRL2 = 34, + S2MPS15_REG_B6CTRL1 = 35, + S2MPS15_REG_B6CTRL2 = 36, + S2MPS15_REG_B7CTRL1 = 37, + S2MPS15_REG_B7CTRL2 = 38, + S2MPS15_REG_B8CTRL1 = 39, + S2MPS15_REG_B8CTRL2 = 40, + S2MPS15_REG_B9CTRL1 = 41, + S2MPS15_REG_B9CTRL2 = 42, + S2MPS15_REG_B10CTRL1 = 43, + S2MPS15_REG_B10CTRL2 = 44, + S2MPS15_REG_BBCTRL1 = 45, + S2MPS15_REG_BBCTRL2 = 46, + S2MPS15_REG_BRAMP = 47, + S2MPS15_REG_LDODVS1 = 48, + S2MPS15_REG_LDODVS2 = 49, + S2MPS15_REG_LDODVS3 = 50, + S2MPS15_REG_LDODVS4 = 51, + S2MPS15_REG_L1CTRL = 52, + S2MPS15_REG_L2CTRL = 53, + S2MPS15_REG_L3CTRL = 54, + S2MPS15_REG_L4CTRL = 55, + S2MPS15_REG_L5CTRL = 56, + S2MPS15_REG_L6CTRL = 57, + S2MPS15_REG_L7CTRL = 58, + S2MPS15_REG_L8CTRL = 59, + S2MPS15_REG_L9CTRL = 60, + S2MPS15_REG_L10CTRL = 61, + S2MPS15_REG_L11CTRL = 62, + S2MPS15_REG_L12CTRL = 63, + S2MPS15_REG_L13CTRL = 64, + S2MPS15_REG_L14CTRL = 65, + S2MPS15_REG_L15CTRL = 66, + S2MPS15_REG_L16CTRL = 67, + S2MPS15_REG_L17CTRL = 68, + S2MPS15_REG_L18CTRL = 69, + S2MPS15_REG_L19CTRL = 70, + S2MPS15_REG_L20CTRL = 71, + S2MPS15_REG_L21CTRL = 72, + S2MPS15_REG_L22CTRL = 73, + S2MPS15_REG_L23CTRL = 74, + S2MPS15_REG_L24CTRL = 75, + S2MPS15_REG_L25CTRL = 76, + S2MPS15_REG_L26CTRL = 77, + S2MPS15_REG_L27CTRL = 78, + S2MPS15_REG_LDODSCH1 = 79, + S2MPS15_REG_LDODSCH2 = 80, + S2MPS15_REG_LDODSCH3 = 81, + S2MPS15_REG_LDODSCH4 = 82, +}; + +enum S2MPU02_reg { + S2MPU02_REG_ID = 0, + S2MPU02_REG_INT1 = 1, + S2MPU02_REG_INT2 = 2, + S2MPU02_REG_INT3 = 3, + S2MPU02_REG_INT1M = 4, + S2MPU02_REG_INT2M = 5, + S2MPU02_REG_INT3M = 6, + S2MPU02_REG_ST1 = 7, + S2MPU02_REG_ST2 = 8, + S2MPU02_REG_PWRONSRC = 9, + S2MPU02_REG_OFFSRC = 10, + S2MPU02_REG_BU_CHG = 11, + S2MPU02_REG_RTCCTRL = 12, + S2MPU02_REG_PMCTRL1 = 13, + S2MPU02_REG_RSVD1 = 14, + S2MPU02_REG_RSVD2 = 15, + S2MPU02_REG_RSVD3 = 16, + S2MPU02_REG_RSVD4 = 17, + S2MPU02_REG_RSVD5 = 18, + S2MPU02_REG_RSVD6 = 19, + S2MPU02_REG_RSVD7 = 20, + S2MPU02_REG_WRSTEN = 21, + S2MPU02_REG_RSVD8 = 22, + S2MPU02_REG_RSVD9 = 23, + S2MPU02_REG_RSVD10 = 24, + S2MPU02_REG_B1CTRL1 = 25, + S2MPU02_REG_B1CTRL2 = 26, + S2MPU02_REG_B2CTRL1 = 27, + S2MPU02_REG_B2CTRL2 = 28, + S2MPU02_REG_B3CTRL1 = 29, + S2MPU02_REG_B3CTRL2 = 30, + S2MPU02_REG_B4CTRL1 = 31, + S2MPU02_REG_B4CTRL2 = 32, + S2MPU02_REG_B5CTRL1 = 33, + S2MPU02_REG_B5CTRL2 = 34, + S2MPU02_REG_B5CTRL3 = 35, + S2MPU02_REG_B5CTRL4 = 36, + S2MPU02_REG_B5CTRL5 = 37, + S2MPU02_REG_B6CTRL1 = 38, + S2MPU02_REG_B6CTRL2 = 39, + S2MPU02_REG_B7CTRL1 = 40, + S2MPU02_REG_B7CTRL2 = 41, + S2MPU02_REG_RAMP1 = 42, + S2MPU02_REG_RAMP2 = 43, + S2MPU02_REG_L1CTRL = 44, + S2MPU02_REG_L2CTRL1 = 45, + S2MPU02_REG_L2CTRL2 = 46, + S2MPU02_REG_L2CTRL3 = 47, + S2MPU02_REG_L2CTRL4 = 48, + S2MPU02_REG_L3CTRL = 49, + S2MPU02_REG_L4CTRL = 50, + S2MPU02_REG_L5CTRL = 51, + S2MPU02_REG_L6CTRL = 52, + S2MPU02_REG_L7CTRL = 53, + S2MPU02_REG_L8CTRL = 54, + S2MPU02_REG_L9CTRL = 55, + S2MPU02_REG_L10CTRL = 56, + S2MPU02_REG_L11CTRL = 57, + S2MPU02_REG_L12CTRL = 58, + S2MPU02_REG_L13CTRL = 59, + S2MPU02_REG_L14CTRL = 60, + S2MPU02_REG_L15CTRL = 61, + S2MPU02_REG_L16CTRL = 62, + S2MPU02_REG_L17CTRL = 63, + S2MPU02_REG_L18CTRL = 64, + S2MPU02_REG_L19CTRL = 65, + S2MPU02_REG_L20CTRL = 66, + S2MPU02_REG_L21CTRL = 67, + S2MPU02_REG_L22CTRL = 68, + S2MPU02_REG_L23CTRL = 69, + S2MPU02_REG_L24CTRL = 70, + S2MPU02_REG_L25CTRL = 71, + S2MPU02_REG_L26CTRL = 72, + S2MPU02_REG_L27CTRL = 73, + S2MPU02_REG_L28CTRL = 74, + S2MPU02_REG_LDODSCH1 = 75, + S2MPU02_REG_LDODSCH2 = 76, + S2MPU02_REG_LDODSCH3 = 77, + S2MPU02_REG_LDODSCH4 = 78, + S2MPU02_REG_SELMIF = 79, + S2MPU02_REG_RSVD11 = 80, + S2MPU02_REG_RSVD12 = 81, + S2MPU02_REG_RSVD13 = 82, + S2MPU02_REG_DVSSEL = 83, + S2MPU02_REG_DVSPTR = 84, + S2MPU02_REG_DVSDATA = 85, +}; + +enum s5m8763_reg { + S5M8763_REG_IRQ1 = 0, + S5M8763_REG_IRQ2 = 1, + S5M8763_REG_IRQ3 = 2, + S5M8763_REG_IRQ4 = 3, + S5M8763_REG_IRQM1 = 4, + S5M8763_REG_IRQM2 = 5, + S5M8763_REG_IRQM3 = 6, + S5M8763_REG_IRQM4 = 7, + S5M8763_REG_STATUS1 = 8, + S5M8763_REG_STATUS2 = 9, + S5M8763_REG_STATUSM1 = 10, + S5M8763_REG_STATUSM2 = 11, + S5M8763_REG_CHGR1 = 12, + S5M8763_REG_CHGR2 = 13, + S5M8763_REG_LDO_ACTIVE_DISCHARGE1 = 14, + S5M8763_REG_LDO_ACTIVE_DISCHARGE2 = 15, + S5M8763_REG_BUCK_ACTIVE_DISCHARGE3 = 16, + S5M8763_REG_ONOFF1 = 17, + S5M8763_REG_ONOFF2 = 18, + S5M8763_REG_ONOFF3 = 19, + S5M8763_REG_ONOFF4 = 20, + S5M8763_REG_BUCK1_VOLTAGE1 = 21, + S5M8763_REG_BUCK1_VOLTAGE2 = 22, + S5M8763_REG_BUCK1_VOLTAGE3 = 23, + S5M8763_REG_BUCK1_VOLTAGE4 = 24, + S5M8763_REG_BUCK2_VOLTAGE1 = 25, + S5M8763_REG_BUCK2_VOLTAGE2 = 26, + S5M8763_REG_BUCK3 = 27, + S5M8763_REG_BUCK4 = 28, + S5M8763_REG_LDO1_LDO2 = 29, + S5M8763_REG_LDO3 = 30, + S5M8763_REG_LDO4 = 31, + S5M8763_REG_LDO5 = 32, + S5M8763_REG_LDO6 = 33, + S5M8763_REG_LDO7 = 34, + S5M8763_REG_LDO7_LDO8 = 35, + S5M8763_REG_LDO9_LDO10 = 36, + S5M8763_REG_LDO11 = 37, + S5M8763_REG_LDO12 = 38, + S5M8763_REG_LDO13 = 39, + S5M8763_REG_LDO14 = 40, + S5M8763_REG_LDO15 = 41, + S5M8763_REG_LDO16 = 42, + S5M8763_REG_BKCHR = 43, + S5M8763_REG_LBCNFG1 = 44, + S5M8763_REG_LBCNFG2 = 45, +}; + +enum s5m8767_reg { + S5M8767_REG_ID = 0, + S5M8767_REG_INT1 = 1, + S5M8767_REG_INT2 = 2, + S5M8767_REG_INT3 = 3, + S5M8767_REG_INT1M = 4, + S5M8767_REG_INT2M = 5, + S5M8767_REG_INT3M = 6, + S5M8767_REG_STATUS1 = 7, + S5M8767_REG_STATUS2 = 8, + S5M8767_REG_STATUS3 = 9, + S5M8767_REG_CTRL1 = 10, + S5M8767_REG_CTRL2 = 11, + S5M8767_REG_LOWBAT1 = 12, + S5M8767_REG_LOWBAT2 = 13, + S5M8767_REG_BUCHG = 14, + S5M8767_REG_DVSRAMP = 15, + S5M8767_REG_DVSTIMER2 = 16, + S5M8767_REG_DVSTIMER3 = 17, + S5M8767_REG_DVSTIMER4 = 18, + S5M8767_REG_LDO1 = 19, + S5M8767_REG_LDO2 = 20, + S5M8767_REG_LDO3 = 21, + S5M8767_REG_LDO4 = 22, + S5M8767_REG_LDO5 = 23, + S5M8767_REG_LDO6 = 24, + S5M8767_REG_LDO7 = 25, + S5M8767_REG_LDO8 = 26, + S5M8767_REG_LDO9 = 27, + S5M8767_REG_LDO10 = 28, + S5M8767_REG_LDO11 = 29, + S5M8767_REG_LDO12 = 30, + S5M8767_REG_LDO13 = 31, + S5M8767_REG_LDO14 = 32, + S5M8767_REG_LDO15 = 33, + S5M8767_REG_LDO16 = 34, + S5M8767_REG_LDO17 = 35, + S5M8767_REG_LDO18 = 36, + S5M8767_REG_LDO19 = 37, + S5M8767_REG_LDO20 = 38, + S5M8767_REG_LDO21 = 39, + S5M8767_REG_LDO22 = 40, + S5M8767_REG_LDO23 = 41, + S5M8767_REG_LDO24 = 42, + S5M8767_REG_LDO25 = 43, + S5M8767_REG_LDO26 = 44, + S5M8767_REG_LDO27 = 45, + S5M8767_REG_LDO28 = 46, + S5M8767_REG_UVLO = 49, + S5M8767_REG_BUCK1CTRL1 = 50, + S5M8767_REG_BUCK1CTRL2 = 51, + S5M8767_REG_BUCK2CTRL = 52, + S5M8767_REG_BUCK2DVS1 = 53, + S5M8767_REG_BUCK2DVS2 = 54, + S5M8767_REG_BUCK2DVS3 = 55, + S5M8767_REG_BUCK2DVS4 = 56, + S5M8767_REG_BUCK2DVS5 = 57, + S5M8767_REG_BUCK2DVS6 = 58, + S5M8767_REG_BUCK2DVS7 = 59, + S5M8767_REG_BUCK2DVS8 = 60, + S5M8767_REG_BUCK3CTRL = 61, + S5M8767_REG_BUCK3DVS1 = 62, + S5M8767_REG_BUCK3DVS2 = 63, + S5M8767_REG_BUCK3DVS3 = 64, + S5M8767_REG_BUCK3DVS4 = 65, + S5M8767_REG_BUCK3DVS5 = 66, + S5M8767_REG_BUCK3DVS6 = 67, + S5M8767_REG_BUCK3DVS7 = 68, + S5M8767_REG_BUCK3DVS8 = 69, + S5M8767_REG_BUCK4CTRL = 70, + S5M8767_REG_BUCK4DVS1 = 71, + S5M8767_REG_BUCK4DVS2 = 72, + S5M8767_REG_BUCK4DVS3 = 73, + S5M8767_REG_BUCK4DVS4 = 74, + S5M8767_REG_BUCK4DVS5 = 75, + S5M8767_REG_BUCK4DVS6 = 76, + S5M8767_REG_BUCK4DVS7 = 77, + S5M8767_REG_BUCK4DVS8 = 78, + S5M8767_REG_BUCK5CTRL1 = 79, + S5M8767_REG_BUCK5CTRL2 = 80, + S5M8767_REG_BUCK5CTRL3 = 81, + S5M8767_REG_BUCK5CTRL4 = 82, + S5M8767_REG_BUCK5CTRL5 = 83, + S5M8767_REG_BUCK6CTRL1 = 84, + S5M8767_REG_BUCK6CTRL2 = 85, + S5M8767_REG_BUCK7CTRL1 = 86, + S5M8767_REG_BUCK7CTRL2 = 87, + S5M8767_REG_BUCK8CTRL1 = 88, + S5M8767_REG_BUCK8CTRL2 = 89, + S5M8767_REG_BUCK9CTRL1 = 90, + S5M8767_REG_BUCK9CTRL2 = 91, + S5M8767_REG_LDO1CTRL = 92, + S5M8767_REG_LDO2_1CTRL = 93, + S5M8767_REG_LDO2_2CTRL = 94, + S5M8767_REG_LDO2_3CTRL = 95, + S5M8767_REG_LDO2_4CTRL = 96, + S5M8767_REG_LDO3CTRL = 97, + S5M8767_REG_LDO4CTRL = 98, + S5M8767_REG_LDO5CTRL = 99, + S5M8767_REG_LDO6CTRL = 100, + S5M8767_REG_LDO7CTRL = 101, + S5M8767_REG_LDO8CTRL = 102, + S5M8767_REG_LDO9CTRL = 103, + S5M8767_REG_LDO10CTRL = 104, + S5M8767_REG_LDO11CTRL = 105, + S5M8767_REG_LDO12CTRL = 106, + S5M8767_REG_LDO13CTRL = 107, + S5M8767_REG_LDO14CTRL = 108, + S5M8767_REG_LDO15CTRL = 109, + S5M8767_REG_LDO16CTRL = 110, + S5M8767_REG_LDO17CTRL = 111, + S5M8767_REG_LDO18CTRL = 112, + S5M8767_REG_LDO19CTRL = 113, + S5M8767_REG_LDO20CTRL = 114, + S5M8767_REG_LDO21CTRL = 115, + S5M8767_REG_LDO22CTRL = 116, + S5M8767_REG_LDO23CTRL = 117, + S5M8767_REG_LDO24CTRL = 118, + S5M8767_REG_LDO25CTRL = 119, + S5M8767_REG_LDO26CTRL = 120, + S5M8767_REG_LDO27CTRL = 121, + S5M8767_REG_LDO28CTRL = 122, +}; + +enum s2mps11_irq { + S2MPS11_IRQ_PWRONF = 0, + S2MPS11_IRQ_PWRONR = 1, + S2MPS11_IRQ_JIGONBF = 2, + S2MPS11_IRQ_JIGONBR = 3, + S2MPS11_IRQ_ACOKBF = 4, + S2MPS11_IRQ_ACOKBR = 5, + S2MPS11_IRQ_PWRON1S = 6, + S2MPS11_IRQ_MRB = 7, + S2MPS11_IRQ_RTC60S = 8, + S2MPS11_IRQ_RTCA1 = 9, + S2MPS11_IRQ_RTCA0 = 10, + S2MPS11_IRQ_SMPL = 11, + S2MPS11_IRQ_RTC1S = 12, + S2MPS11_IRQ_WTSR = 13, + S2MPS11_IRQ_INT120C = 14, + S2MPS11_IRQ_INT140C = 15, + S2MPS11_IRQ_NR = 16, +}; + +enum s2mps14_irq { + S2MPS14_IRQ_PWRONF = 0, + S2MPS14_IRQ_PWRONR = 1, + S2MPS14_IRQ_JIGONBF = 2, + S2MPS14_IRQ_JIGONBR = 3, + S2MPS14_IRQ_ACOKBF = 4, + S2MPS14_IRQ_ACOKBR = 5, + S2MPS14_IRQ_PWRON1S = 6, + S2MPS14_IRQ_MRB = 7, + S2MPS14_IRQ_RTC60S = 8, + S2MPS14_IRQ_RTCA1 = 9, + S2MPS14_IRQ_RTCA0 = 10, + S2MPS14_IRQ_SMPL = 11, + S2MPS14_IRQ_RTC1S = 12, + S2MPS14_IRQ_WTSR = 13, + S2MPS14_IRQ_INT120C = 14, + S2MPS14_IRQ_INT140C = 15, + S2MPS14_IRQ_TSD = 16, + S2MPS14_IRQ_NR = 17, +}; + +enum s2mpu02_irq { + S2MPU02_IRQ_PWRONF = 0, + S2MPU02_IRQ_PWRONR = 1, + S2MPU02_IRQ_JIGONBF = 2, + S2MPU02_IRQ_JIGONBR = 3, + S2MPU02_IRQ_ACOKBF = 4, + S2MPU02_IRQ_ACOKBR = 5, + S2MPU02_IRQ_PWRON1S = 6, + S2MPU02_IRQ_MRB = 7, + S2MPU02_IRQ_RTC60S = 8, + S2MPU02_IRQ_RTCA1 = 9, + S2MPU02_IRQ_RTCA0 = 10, + S2MPU02_IRQ_SMPL = 11, + S2MPU02_IRQ_RTC1S = 12, + S2MPU02_IRQ_WTSR = 13, + S2MPU02_IRQ_INT120C = 14, + S2MPU02_IRQ_INT140C = 15, + S2MPU02_IRQ_TSD = 16, + S2MPU02_IRQ_NR = 17, +}; + +enum s5m8767_irq { + S5M8767_IRQ_PWRR = 0, + S5M8767_IRQ_PWRF = 1, + S5M8767_IRQ_PWR1S = 2, + S5M8767_IRQ_JIGR = 3, + S5M8767_IRQ_JIGF = 4, + S5M8767_IRQ_LOWBAT2 = 5, + S5M8767_IRQ_LOWBAT1 = 6, + S5M8767_IRQ_MRB = 7, + S5M8767_IRQ_DVSOK2 = 8, + S5M8767_IRQ_DVSOK3 = 9, + S5M8767_IRQ_DVSOK4 = 10, + S5M8767_IRQ_RTC60S = 11, + S5M8767_IRQ_RTCA1 = 12, + S5M8767_IRQ_RTCA2 = 13, + S5M8767_IRQ_SMPL = 14, + S5M8767_IRQ_RTC1S = 15, + S5M8767_IRQ_WTSR = 16, + S5M8767_IRQ_NR = 17, +}; + +enum s5m8763_irq { + S5M8763_IRQ_DCINF = 0, + S5M8763_IRQ_DCINR = 1, + S5M8763_IRQ_JIGF = 2, + S5M8763_IRQ_JIGR = 3, + S5M8763_IRQ_PWRONF = 4, + S5M8763_IRQ_PWRONR = 5, + S5M8763_IRQ_WTSREVNT = 6, + S5M8763_IRQ_SMPLEVNT = 7, + S5M8763_IRQ_ALARM1 = 8, + S5M8763_IRQ_ALARM0 = 9, + S5M8763_IRQ_ONKEY1S = 10, + S5M8763_IRQ_TOPOFFR = 11, + S5M8763_IRQ_DCINOVPR = 12, + S5M8763_IRQ_CHGRSTF = 13, + S5M8763_IRQ_DONER = 14, + S5M8763_IRQ_CHGFAULT = 15, + S5M8763_IRQ_LOBAT1 = 16, + S5M8763_IRQ_LOBAT2 = 17, + S5M8763_IRQ_NR = 18, +}; + +struct syscon_platform_data { + const char *label; +}; + +struct syscon { + struct device_node *np; + struct regmap *regmap; + struct list_head list; +}; + +enum as3722_irq { + AS3722_IRQ_LID = 0, + AS3722_IRQ_ACOK = 1, + AS3722_IRQ_ENABLE1 = 2, + AS3722_IRQ_OCCUR_ALARM_SD0 = 3, + AS3722_IRQ_ONKEY_LONG_PRESS = 4, + AS3722_IRQ_ONKEY = 5, + AS3722_IRQ_OVTMP = 6, + AS3722_IRQ_LOWBAT = 7, + AS3722_IRQ_SD0_LV = 8, + AS3722_IRQ_SD1_LV = 9, + AS3722_IRQ_SD2_LV = 10, + AS3722_IRQ_PWM1_OV_PROT = 11, + AS3722_IRQ_PWM2_OV_PROT = 12, + AS3722_IRQ_ENABLE2 = 13, + AS3722_IRQ_SD6_LV = 14, + AS3722_IRQ_RTC_REP = 15, + AS3722_IRQ_RTC_ALARM = 16, + AS3722_IRQ_GPIO1 = 17, + AS3722_IRQ_GPIO2 = 18, + AS3722_IRQ_GPIO3 = 19, + AS3722_IRQ_GPIO4 = 20, + AS3722_IRQ_GPIO5 = 21, + AS3722_IRQ_WATCHDOG = 22, + AS3722_IRQ_ENABLE3 = 23, + AS3722_IRQ_TEMP_SD0_SHUTDOWN = 24, + AS3722_IRQ_TEMP_SD1_SHUTDOWN = 25, + AS3722_IRQ_TEMP_SD2_SHUTDOWN = 26, + AS3722_IRQ_TEMP_SD0_ALARM = 27, + AS3722_IRQ_TEMP_SD1_ALARM = 28, + AS3722_IRQ_TEMP_SD6_ALARM = 29, + AS3722_IRQ_OCCUR_ALARM_SD6 = 30, + AS3722_IRQ_ADC = 31, + AS3722_IRQ_MAX = 32, +}; + +struct iosys_map { + union { + void *vaddr_iomem; + void *vaddr; + }; + bool is_iomem; +}; + +struct dma_fence_ops; + +struct dma_fence { + spinlock_t *lock; + const struct dma_fence_ops *ops; + union { + struct list_head cb_list; + ktime_t timestamp; + struct callback_head rcu; + }; + u64 context; + u64 seqno; + long unsigned int flags; + struct kref refcount; + int error; + long: 32; +}; + +struct dma_fence_ops { + bool use_64bit_seqno; + const char * (*get_driver_name)(struct dma_fence *); + const char * (*get_timeline_name)(struct dma_fence *); + bool (*enable_signaling)(struct dma_fence *); + bool (*signaled)(struct dma_fence *); + long int (*wait)(struct dma_fence *, bool, long int); + void (*release)(struct dma_fence *); + void (*fence_value_str)(struct dma_fence *, char *, int); + void (*timeline_value_str)(struct dma_fence *, char *, int); +}; + +struct dma_fence_cb; + +typedef void (*dma_fence_func_t)(struct dma_fence *, struct dma_fence_cb *); + +struct dma_fence_cb { + struct list_head node; + dma_fence_func_t func; +}; + +struct dma_buf; + +struct dma_buf_attachment; + +struct dma_buf_ops { + bool cache_sgt_mapping; + int (*attach)(struct dma_buf *, struct dma_buf_attachment *); + void (*detach)(struct dma_buf *, struct dma_buf_attachment *); + int (*pin)(struct dma_buf_attachment *); + void (*unpin)(struct dma_buf_attachment *); + struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *, enum dma_data_direction); + void (*unmap_dma_buf)(struct dma_buf_attachment *, struct sg_table *, enum dma_data_direction); + void (*release)(struct dma_buf *); + int (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*end_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*mmap)(struct dma_buf *, struct vm_area_struct *); + int (*vmap)(struct dma_buf *, struct iosys_map *); + void (*vunmap)(struct dma_buf *, struct iosys_map *); +}; + +struct dma_buf_poll_cb_t { + struct dma_fence_cb cb; + wait_queue_head_t *poll; + __poll_t active; +}; + +struct dma_resv; + +struct dma_buf { + size_t size; + struct file *file; + struct list_head attachments; + const struct dma_buf_ops *ops; + unsigned int vmapping_counter; + struct iosys_map vmap_ptr; + const char *exp_name; + const char *name; + spinlock_t name_lock; + struct module *owner; + struct list_head list_node; + void *priv; + struct dma_resv *resv; + wait_queue_head_t poll; + struct dma_buf_poll_cb_t cb_in; + struct dma_buf_poll_cb_t cb_out; +}; + +struct dma_buf_attach_ops; + +struct dma_buf_attachment { + struct dma_buf *dmabuf; + struct device *dev; + struct list_head node; + struct sg_table *sgt; + enum dma_data_direction dir; + bool peer2peer; + const struct dma_buf_attach_ops *importer_ops; + void *importer_priv; + void *priv; +}; + +struct dma_resv_list; + +struct dma_resv { + struct ww_mutex lock; + struct dma_resv_list *fences; +}; + +struct dma_buf_attach_ops { + bool allow_peer2peer; + void (*move_notify)(struct dma_buf_attachment *); +}; + +struct dma_buf_export_info { + const char *exp_name; + struct module *owner; + const struct dma_buf_ops *ops; + size_t size; + int flags; + struct dma_resv *resv; + void *priv; +}; + +struct dma_fence_unwrap { + struct dma_fence *chain; + struct dma_fence *array; + unsigned int index; +}; + +struct sync_file { + struct file *file; + char user_name[32]; + struct list_head sync_file_list; + wait_queue_head_t wq; + long unsigned int flags; + struct dma_fence *fence; + struct dma_fence_cb cb; +}; + +enum dma_resv_usage { + DMA_RESV_USAGE_KERNEL = 0, + DMA_RESV_USAGE_WRITE = 1, + DMA_RESV_USAGE_READ = 2, + DMA_RESV_USAGE_BOOKKEEP = 3, +}; + +struct dma_resv_iter { + struct dma_resv *obj; + enum dma_resv_usage usage; + struct dma_fence *fence; + enum dma_resv_usage fence_usage; + unsigned int index; + struct dma_resv_list *fences; + unsigned int num_fences; + bool is_restarted; +}; + +struct dma_buf_sync { + __u64 flags; +}; + +struct dma_buf_export_sync_file { + __u32 flags; + __s32 fd; +}; + +struct dma_buf_import_sync_file { + __u32 flags; + __s32 fd; +}; + +struct dma_buf_list { + struct list_head head; + struct mutex lock; +}; + +enum dma_fence_flag_bits { + DMA_FENCE_FLAG_SIGNALED_BIT = 0, + DMA_FENCE_FLAG_TIMESTAMP_BIT = 1, + DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT = 2, + DMA_FENCE_FLAG_USER_BITS = 3, +}; + +struct trace_event_raw_dma_fence { + struct trace_entry ent; + u32 __data_loc_driver; + u32 __data_loc_timeline; + unsigned int context; + unsigned int seqno; + char __data[0]; +}; + +struct trace_event_data_offsets_dma_fence { + u32 driver; + u32 timeline; +}; + +typedef void (*btf_trace_dma_fence_emit)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_init)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_destroy)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_enable_signal)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_signaled)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_start)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_end)(void *, struct dma_fence *); + +struct default_wait_cb { + struct dma_fence_cb base; + struct task_struct *task; +}; + +struct dma_fence_array; + +struct dma_fence_array_cb { + struct dma_fence_cb cb; + struct dma_fence_array *array; +}; + +struct dma_fence_array { + struct dma_fence base; + spinlock_t lock; + unsigned int num_fences; + atomic_t num_pending; + struct dma_fence **fences; + struct irq_work work; +}; + +struct dma_fence_chain { + struct dma_fence base; + struct dma_fence *prev; + long: 32; + u64 prev_seqno; + struct dma_fence *fence; + union { + struct dma_fence_cb cb; + struct irq_work work; + }; + spinlock_t lock; +}; + +struct dma_resv_list { + struct callback_head rcu; + u32 num_fences; + u32 max_fences; + struct dma_fence *table[0]; +}; + +struct sync_merge_data { + char name[32]; + __s32 fd2; + __s32 fence; + __u32 flags; + __u32 pad; +}; + +struct sync_fence_info { + char obj_name[32]; + char driver_name[32]; + __s32 status; + __u32 flags; + __u64 timestamp_ns; +}; + +struct sync_file_info { + char name[32]; + __s32 status; + __u32 flags; + __u32 num_fences; + __u32 pad; + __u64 sync_fence_info; +}; + +struct mtd_ecc_stats { + __u32 corrected; + __u32 failed; + __u32 badblocks; + __u32 bbtblocks; +}; + +struct mtd_debug_info { + struct dentry *dfs_dir; +}; + +struct mtd_part { + struct list_head node; + u64 offset; + u64 size; + u32 flags; + long: 32; +}; + +struct mtd_master { + struct mutex partitions_lock; + struct mutex chrdev_lock; + unsigned int suspended: 1; +}; + +struct mtd_ooblayout_ops; + +struct mtd_pairing_scheme; + +struct mtd_erase_region_info; + +struct erase_info; + +struct mtd_oob_ops; + +struct otp_info; + +struct mtd_info { + u_char type; + uint32_t flags; + uint64_t size; + uint32_t erasesize; + uint32_t writesize; + uint32_t writebufsize; + uint32_t oobsize; + uint32_t oobavail; + unsigned int erasesize_shift; + unsigned int writesize_shift; + unsigned int erasesize_mask; + unsigned int writesize_mask; + unsigned int bitflip_threshold; + const char *name; + int index; + const struct mtd_ooblayout_ops *ooblayout; + const struct mtd_pairing_scheme *pairing; + unsigned int ecc_step_size; + unsigned int ecc_strength; + int numeraseregions; + struct mtd_erase_region_info *eraseregions; + int (*_erase)(struct mtd_info *, struct erase_info *); + int (*_point)(struct mtd_info *, loff_t, size_t, size_t *, void **, resource_size_t *); + int (*_unpoint)(struct mtd_info *, loff_t, size_t); + int (*_read)(struct mtd_info *, loff_t, size_t, size_t *, u_char *); + int (*_write)(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); + int (*_panic_write)(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); + int (*_read_oob)(struct mtd_info *, loff_t, struct mtd_oob_ops *); + int (*_write_oob)(struct mtd_info *, loff_t, struct mtd_oob_ops *); + int (*_get_fact_prot_info)(struct mtd_info *, size_t, size_t *, struct otp_info *); + int (*_read_fact_prot_reg)(struct mtd_info *, loff_t, size_t, size_t *, u_char *); + int (*_get_user_prot_info)(struct mtd_info *, size_t, size_t *, struct otp_info *); + int (*_read_user_prot_reg)(struct mtd_info *, loff_t, size_t, size_t *, u_char *); + int (*_write_user_prot_reg)(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); + int (*_lock_user_prot_reg)(struct mtd_info *, loff_t, size_t); + int (*_erase_user_prot_reg)(struct mtd_info *, loff_t, size_t); + int (*_writev)(struct mtd_info *, const struct kvec *, long unsigned int, loff_t, size_t *); + void (*_sync)(struct mtd_info *); + int (*_lock)(struct mtd_info *, loff_t, uint64_t); + int (*_unlock)(struct mtd_info *, loff_t, uint64_t); + int (*_is_locked)(struct mtd_info *, loff_t, uint64_t); + int (*_block_isreserved)(struct mtd_info *, loff_t); + int (*_block_isbad)(struct mtd_info *, loff_t); + int (*_block_markbad)(struct mtd_info *, loff_t); + int (*_max_bad_blocks)(struct mtd_info *, loff_t, size_t); + int (*_suspend)(struct mtd_info *); + void (*_resume)(struct mtd_info *); + void (*_reboot)(struct mtd_info *); + int (*_get_device)(struct mtd_info *); + void (*_put_device)(struct mtd_info *); + bool oops_panic_write; + struct notifier_block reboot_notifier; + struct mtd_ecc_stats ecc_stats; + int subpage_sft; + void *priv; + struct module *owner; + struct device dev; + int usecount; + struct mtd_debug_info dbg; + struct nvmem_device *nvmem; + struct nvmem_device *otp_user_nvmem; + struct nvmem_device *otp_factory_nvmem; + struct mtd_info *parent; + struct list_head partitions; + struct mtd_part part; + struct mtd_master master; + long: 32; +}; + +enum { + MTD_OPS_PLACE_OOB = 0, + MTD_OPS_AUTO_OOB = 1, + MTD_OPS_RAW = 2, +}; + +struct otp_info { + __u32 start; + __u32 length; + __u32 locked; +}; + +struct erase_info { + uint64_t addr; + uint64_t len; + uint64_t fail_addr; +}; + +struct mtd_erase_region_info { + uint64_t offset; + uint32_t erasesize; + uint32_t numblocks; + long unsigned int *lockmap; + long: 32; +}; + +struct mtd_req_stats { + unsigned int uncorrectable_errors; + unsigned int corrected_bitflips; + unsigned int max_bitflips; +}; + +struct mtd_oob_ops { + unsigned int mode; + size_t len; + size_t retlen; + size_t ooblen; + size_t oobretlen; + uint32_t ooboffs; + uint8_t *datbuf; + uint8_t *oobbuf; + struct mtd_req_stats *stats; +}; + +struct mtd_oob_region { + u32 offset; + u32 length; +}; + +struct mtd_ooblayout_ops { + int (*ecc)(struct mtd_info *, int, struct mtd_oob_region *); + int (*free)(struct mtd_info *, int, struct mtd_oob_region *); +}; + +struct mtd_pairing_info { + int pair; + int group; +}; + +struct mtd_pairing_scheme { + int ngroups; + int (*get_info)(struct mtd_info *, int, struct mtd_pairing_info *); + int (*get_wunit)(struct mtd_info *, const struct mtd_pairing_info *); +}; + +struct mtd_notifier { + void (*add)(struct mtd_info *); + void (*remove)(struct mtd_info *); + struct list_head list; +}; + +struct mtd_partition { + const char *name; + const char * const *types; + uint64_t size; + uint64_t offset; + uint32_t mask_flags; + uint32_t add_flags; + struct device_node *of_node; + long: 32; +}; + +struct mtd_part_parser_data { + long unsigned int origin; +}; + +struct mtd_concat { + struct mtd_info mtd; + int num_subdev; + struct mtd_info **subdev; +}; + +struct mtd_part_parser { + struct list_head list; + struct module *owner; + const char *name; + const struct of_device_id *of_match_table; + int (*parse_fn)(struct mtd_info *, const struct mtd_partition **, struct mtd_part_parser_data *); + void (*cleanup)(const struct mtd_partition *, int); +}; + +struct mtd_partitions { + const struct mtd_partition *parts; + int nr_parts; + const struct mtd_part_parser *parser; +}; + +struct erase_info_user { + __u32 start; + __u32 length; +}; + +struct erase_info_user64 { + __u64 start; + __u64 length; +}; + +struct mtd_oob_buf { + __u32 start; + __u32 length; + unsigned char *ptr; +}; + +struct mtd_oob_buf64 { + __u64 start; + __u32 pad; + __u32 length; + __u64 usr_ptr; +}; + +struct mtd_write_req { + __u64 start; + __u64 len; + __u64 ooblen; + __u64 usr_data; + __u64 usr_oob; + __u8 mode; + __u8 padding[7]; +}; + +struct mtd_read_req_ecc_stats { + __u32 uncorrectable_errors; + __u32 corrected_bitflips; + __u32 max_bitflips; +}; + +struct mtd_read_req { + __u64 start; + __u64 len; + __u64 ooblen; + __u64 usr_data; + __u64 usr_oob; + __u8 mode; + __u8 padding[7]; + struct mtd_read_req_ecc_stats ecc_stats; + long: 32; +}; + +struct mtd_info_user { + __u8 type; + __u32 flags; + __u32 size; + __u32 erasesize; + __u32 writesize; + __u32 oobsize; + __u64 padding; +}; + +struct region_info_user { + __u32 offset; + __u32 erasesize; + __u32 numblocks; + __u32 regionindex; +}; + +struct nand_oobinfo { + __u32 useecc; + __u32 eccbytes; + __u32 oobfree[16]; + __u32 eccpos[32]; +}; + +struct nand_oobfree { + __u32 offset; + __u32 length; +}; + +struct nand_ecclayout_user { + __u32 eccbytes; + __u32 eccpos[64]; + __u32 oobavail; + struct nand_oobfree oobfree[8]; +}; + +enum mtd_file_modes { + MTD_FILE_MODE_NORMAL = 0, + MTD_FILE_MODE_OTP_FACTORY = 1, + MTD_FILE_MODE_OTP_USER = 2, + MTD_FILE_MODE_RAW = 3, +}; + +struct mtd_chip_driver; + +struct map_info___2 { + const char *name; + long unsigned int size; + resource_size_t phys; + void *virt; + void *cached; + int swap; + int bankwidth; + void (*inval_cache)(struct map_info___2 *, long unsigned int, ssize_t); + void (*set_vpp)(struct map_info___2 *, int); + long unsigned int pfow_base; + long unsigned int map_priv_1; + long unsigned int map_priv_2; + struct device_node *device_node; + void *fldrv_priv; + struct mtd_chip_driver *fldrv; +}; + +struct mtd_chip_driver { + struct mtd_info * (*probe)(struct map_info___2 *); + void (*destroy)(struct mtd_info *); + struct module *module; + char *name; + struct list_head list; +}; + +struct mtd_file_info { + struct mtd_info *mtd; + enum mtd_file_modes mode; +}; + +struct nand_memory_organization { + unsigned int bits_per_cell; + unsigned int pagesize; + unsigned int oobsize; + unsigned int pages_per_eraseblock; + unsigned int eraseblocks_per_lun; + unsigned int max_bad_eraseblocks_per_lun; + unsigned int planes_per_lun; + unsigned int luns_per_target; + unsigned int ntargets; +}; + +struct nand_row_converter { + unsigned int lun_addr_shift; + unsigned int eraseblock_addr_shift; +}; + +struct nand_pos { + unsigned int target; + unsigned int lun; + unsigned int plane; + unsigned int eraseblock; + unsigned int page; +}; + +enum nand_page_io_req_type { + NAND_PAGE_READ = 0, + NAND_PAGE_WRITE = 1, +}; + +struct nand_page_io_req { + enum nand_page_io_req_type type; + struct nand_pos pos; + unsigned int dataoffs; + unsigned int datalen; + union { + const void *out; + void *in; + } databuf; + unsigned int ooboffs; + unsigned int ooblen; + union { + const void *out; + void *in; + } oobbuf; + int mode; +}; + +enum nand_ecc_engine_type { + NAND_ECC_ENGINE_TYPE_INVALID = 0, + NAND_ECC_ENGINE_TYPE_NONE = 1, + NAND_ECC_ENGINE_TYPE_SOFT = 2, + NAND_ECC_ENGINE_TYPE_ON_HOST = 3, + NAND_ECC_ENGINE_TYPE_ON_DIE = 4, +}; + +enum nand_ecc_placement { + NAND_ECC_PLACEMENT_UNKNOWN = 0, + NAND_ECC_PLACEMENT_OOB = 1, + NAND_ECC_PLACEMENT_INTERLEAVED = 2, +}; + +enum nand_ecc_algo { + NAND_ECC_ALGO_UNKNOWN = 0, + NAND_ECC_ALGO_HAMMING = 1, + NAND_ECC_ALGO_BCH = 2, + NAND_ECC_ALGO_RS = 3, +}; + +struct nand_ecc_props { + enum nand_ecc_engine_type engine_type; + enum nand_ecc_placement placement; + enum nand_ecc_algo algo; + unsigned int strength; + unsigned int step_size; + unsigned int flags; +}; + +struct nand_bbt { + long unsigned int *cache; +}; + +struct nand_device; + +struct nand_ops { + int (*erase)(struct nand_device *, const struct nand_pos *); + int (*markbad)(struct nand_device *, const struct nand_pos *); + bool (*isbad)(struct nand_device *, const struct nand_pos *); +}; + +struct nand_ecc_context { + struct nand_ecc_props conf; + unsigned int nsteps; + unsigned int total; + void *priv; +}; + +struct nand_ecc_engine; + +struct nand_ecc { + struct nand_ecc_props defaults; + struct nand_ecc_props requirements; + struct nand_ecc_props user_conf; + struct nand_ecc_context ctx; + struct nand_ecc_engine *ondie_engine; + struct nand_ecc_engine *engine; +}; + +struct nand_device { + struct mtd_info mtd; + struct nand_memory_organization memorg; + struct nand_ecc ecc; + struct nand_row_converter rowconv; + struct nand_bbt bbt; + const struct nand_ops *ops; +}; + +struct nand_ecc_engine_ops { + int (*init_ctx)(struct nand_device *); + void (*cleanup_ctx)(struct nand_device *); + int (*prepare_io_req)(struct nand_device *, struct nand_page_io_req *); + int (*finish_io_req)(struct nand_device *, struct nand_page_io_req *); +}; + +enum nand_ecc_engine_integration { + NAND_ECC_ENGINE_INTEGRATION_INVALID = 0, + NAND_ECC_ENGINE_INTEGRATION_PIPELINED = 1, + NAND_ECC_ENGINE_INTEGRATION_EXTERNAL = 2, +}; + +struct nand_ecc_engine { + struct device *dev; + struct list_head node; + struct nand_ecc_engine_ops *ops; + enum nand_ecc_engine_integration integration; + void *priv; +}; + +enum nand_bbt_block_status { + NAND_BBT_BLOCK_STATUS_UNKNOWN = 0, + NAND_BBT_BLOCK_GOOD = 1, + NAND_BBT_BLOCK_WORN = 2, + NAND_BBT_BLOCK_RESERVED = 3, + NAND_BBT_BLOCK_FACTORY_BAD = 4, + NAND_BBT_BLOCK_NUM_STATUS = 5, +}; + +struct nand_ecc_req_tweak_ctx { + struct nand_page_io_req orig_req; + struct nand_device *nand; + unsigned int page_buffer_size; + unsigned int oob_buffer_size; + void *spare_databuf; + void *spare_oobbuf; + bool bounce_data; + bool bounce_oob; +}; + +struct nand_ecc_sw_hamming_conf { + struct nand_ecc_req_tweak_ctx req_ctx; + unsigned int code_size; + u8 *calc_buf; + u8 *code_buf; + unsigned int sm_order; +}; + +struct nand_ecc_sw_bch_conf { + struct nand_ecc_req_tweak_ctx req_ctx; + unsigned int code_size; + u8 *calc_buf; + u8 *code_buf; + struct bch_control *bch; + unsigned int *errloc; + unsigned char *eccmask; +}; + +typedef enum { + FL_READY = 0, + FL_STATUS = 1, + FL_CFI_QUERY = 2, + FL_JEDEC_QUERY = 3, + FL_ERASING = 4, + FL_ERASE_SUSPENDING = 5, + FL_ERASE_SUSPENDED = 6, + FL_WRITING = 7, + FL_WRITING_TO_BUFFER = 8, + FL_OTP_WRITE = 9, + FL_WRITE_SUSPENDING = 10, + FL_WRITE_SUSPENDED = 11, + FL_PM_SUSPENDED = 12, + FL_SYNCING = 13, + FL_UNLOADING = 14, + FL_LOCKING = 15, + FL_UNLOCKING = 16, + FL_POINT = 17, + FL_XIP_WHILE_ERASING = 18, + FL_XIP_WHILE_WRITING = 19, + FL_SHUTDOWN = 20, + FL_READING = 21, + FL_CACHEDPRG = 22, + FL_RESETTING = 23, + FL_OTPING = 24, + FL_PREPARING_ERASE = 25, + FL_VERIFYING_ERASE = 26, + FL_UNKNOWN = 27, +} flstate_t; + +struct nand_bbt_descr { + int options; + int pages[8]; + int offs; + int veroffs; + uint8_t version[8]; + int len; + int maxblocks; + int reserved_block_code; + uint8_t *pattern; +}; + +struct bbm_info { + int bbt_erase_shift; + int options; + uint8_t *bbt; + int (*isbad_bbt)(struct mtd_info *, loff_t, int); + struct nand_bbt_descr *badblock_pattern; + void *priv; +}; + +struct onenand_bufferram { + int blockpage; +}; + +struct onenand_chip { + void *base; + unsigned int dies; + unsigned int boundary[2]; + loff_t diesize[2]; + unsigned int chipsize; + unsigned int device_id; + unsigned int version_id; + unsigned int technology; + unsigned int density_mask; + unsigned int options; + unsigned int badblockpos; + unsigned int erase_shift; + unsigned int page_shift; + unsigned int page_mask; + unsigned int writesize; + unsigned int bufferram_index; + struct onenand_bufferram bufferram[2]; + int (*command)(struct mtd_info *, int, loff_t, size_t); + int (*wait)(struct mtd_info *, int); + int (*bbt_wait)(struct mtd_info *, int); + void (*unlock_all)(struct mtd_info *); + int (*read_bufferram)(struct mtd_info *, int, unsigned char *, int, size_t); + int (*write_bufferram)(struct mtd_info *, int, const unsigned char *, int, size_t); + short unsigned int (*read_word)(void *); + void (*write_word)(short unsigned int, void *); + void (*mmcontrol)(struct mtd_info *, int); + int (*chip_probe)(struct mtd_info *); + int (*block_markbad)(struct mtd_info *, loff_t); + int (*scan_bbt)(struct mtd_info *); + int (*enable)(struct mtd_info *); + int (*disable)(struct mtd_info *); + struct completion complete; + int irq; + spinlock_t chip_lock; + wait_queue_head_t wq; + flstate_t state; + unsigned char *page_buf; + unsigned char *oob_buf; + unsigned char *verify_buf; + int subpagesize; + void *bbm; + void *priv; + unsigned int ongoing; + long: 32; +}; + +struct onenand_manufacturers { + int id; + char *name; +}; + +struct nand_onfi_params { + u8 sig[4]; + __le16 revision; + __le16 features; + __le16 opt_cmd; + u8 reserved0[2]; + __le16 ext_param_page_length; + u8 num_of_param_pages; + u8 reserved1[17]; + char manufacturer[12]; + char model[20]; + u8 jedec_id; + __le16 date_code; + u8 reserved2[13]; + __le32 byte_per_page; + __le16 spare_bytes_per_page; + __le32 data_bytes_per_ppage; + __le16 spare_bytes_per_ppage; + __le32 pages_per_block; + __le32 blocks_per_lun; + u8 lun_count; + u8 addr_cycles; + u8 bits_per_cell; + __le16 bb_per_lun; + __le16 block_endurance; + u8 guaranteed_good_blocks; + __le16 guaranteed_block_endurance; + u8 programs_per_page; + u8 ppage_attr; + u8 ecc_bits; + u8 interleaved_bits; + u8 interleaved_ops; + u8 reserved3[13]; + u8 io_pin_capacitance_max; + __le16 sdr_timing_modes; + __le16 program_cache_timing_mode; + __le16 t_prog; + __le16 t_bers; + __le16 t_r; + __le16 t_ccs; + u8 nvddr_timing_modes; + u8 nvddr2_timing_modes; + u8 nvddr_nvddr2_features; + __le16 clk_pin_capacitance_typ; + __le16 io_pin_capacitance_typ; + __le16 input_pin_capacitance_typ; + u8 input_pin_capacitance_max; + u8 driver_strength_support; + __le16 t_int_r; + __le16 t_adl; + u8 reserved4[8]; + __le16 vendor_revision; + u8 vendor[88]; + __le16 crc; +} __attribute__((packed)); + +struct onfi_params { + int version; + u16 tPROG; + u16 tBERS; + u16 tR; + u16 tCCS; + bool fast_tCAD; + u16 sdr_timing_modes; + u16 nvddr_timing_modes; + u16 vendor_revision; + u8 vendor[88]; +}; + +struct nand_parameters { + const char *model; + bool supports_set_get_features; + long unsigned int set_feature_list[8]; + long unsigned int get_feature_list[8]; + struct onfi_params *onfi; +}; + +struct nand_id { + u8 data[8]; + int len; +}; + +struct nand_ecc_step_info { + int stepsize; + const int *strengths; + int nstrengths; +}; + +struct nand_ecc_caps { + const struct nand_ecc_step_info *stepinfos; + int nstepinfos; + int (*calc_ecc_bytes)(int, int); +}; + +struct nand_chip; + +struct nand_ecc_ctrl { + enum nand_ecc_engine_type engine_type; + enum nand_ecc_placement placement; + enum nand_ecc_algo algo; + int steps; + int size; + int bytes; + int total; + int strength; + int prepad; + int postpad; + unsigned int options; + u8 *calc_buf; + u8 *code_buf; + void (*hwctl)(struct nand_chip *, int); + int (*calculate)(struct nand_chip *, const uint8_t *, uint8_t *); + int (*correct)(struct nand_chip *, uint8_t *, uint8_t *, uint8_t *); + int (*read_page_raw)(struct nand_chip *, uint8_t *, int, int); + int (*write_page_raw)(struct nand_chip *, const uint8_t *, int, int); + int (*read_page)(struct nand_chip *, uint8_t *, int, int); + int (*read_subpage)(struct nand_chip *, uint32_t, uint32_t, uint8_t *, int); + int (*write_subpage)(struct nand_chip *, uint32_t, uint32_t, const uint8_t *, int, int); + int (*write_page)(struct nand_chip *, const uint8_t *, int, int); + int (*write_oob_raw)(struct nand_chip *, int); + int (*read_oob_raw)(struct nand_chip *, int); + int (*read_oob)(struct nand_chip *, int); + int (*write_oob)(struct nand_chip *, int); +}; + +struct nand_manufacturer_desc; + +struct nand_manufacturer { + const struct nand_manufacturer_desc *desc; + void *priv; +}; + +struct nand_interface_config; + +struct nand_chip_ops { + int (*suspend)(struct nand_chip *); + void (*resume)(struct nand_chip *); + int (*lock_area)(struct nand_chip *, loff_t, uint64_t); + int (*unlock_area)(struct nand_chip *, loff_t, uint64_t); + int (*setup_read_retry)(struct nand_chip *, int); + int (*choose_interface_config)(struct nand_chip *, struct nand_interface_config *); +}; + +struct nand_controller_ops; + +struct nand_controller { + struct mutex lock; + const struct nand_controller_ops *ops; +}; + +struct nand_legacy { + void *IO_ADDR_R; + void *IO_ADDR_W; + void (*select_chip)(struct nand_chip *, int); + u8 (*read_byte)(struct nand_chip *); + void (*write_byte)(struct nand_chip *, u8); + void (*write_buf)(struct nand_chip *, const u8 *, int); + void (*read_buf)(struct nand_chip *, u8 *, int); + void (*cmd_ctrl)(struct nand_chip *, int, unsigned int); + void (*cmdfunc)(struct nand_chip *, unsigned int, int, int); + int (*dev_ready)(struct nand_chip *); + int (*waitfunc)(struct nand_chip *); + int (*block_bad)(struct nand_chip *, loff_t); + int (*block_markbad)(struct nand_chip *, loff_t); + int (*set_features)(struct nand_chip *, int, u8 *); + int (*get_features)(struct nand_chip *, int, u8 *); + int chip_delay; + struct nand_controller dummy_controller; +}; + +struct nand_secure_region; + +struct nand_chip { + struct nand_device base; + struct nand_id id; + struct nand_parameters parameters; + struct nand_manufacturer manufacturer; + struct nand_chip_ops ops; + struct nand_legacy legacy; + unsigned int options; + const struct nand_interface_config *current_interface_config; + struct nand_interface_config *best_interface_config; + unsigned int bbt_erase_shift; + unsigned int bbt_options; + unsigned int badblockpos; + unsigned int badblockbits; + struct nand_bbt_descr *bbt_td; + struct nand_bbt_descr *bbt_md; + struct nand_bbt_descr *badblock_pattern; + u8 *bbt; + unsigned int page_shift; + unsigned int phys_erase_shift; + unsigned int chip_shift; + unsigned int pagemask; + unsigned int subpagesize; + u8 *data_buf; + u8 *oob_poi; + struct { + unsigned int bitflips; + int page; + } pagecache; + long unsigned int buf_align; + struct mutex lock; + unsigned int suspended: 1; + wait_queue_head_t resume_wq; + int cur_cs; + int read_retries; + struct nand_secure_region *secure_regions; + u8 nr_secure_regions; + struct nand_controller *controller; + struct nand_ecc_ctrl ecc; + void *priv; +}; + +struct nand_sdr_timings { + u64 tBERS_max; + u32 tCCS_min; + long: 32; + u64 tPROG_max; + u64 tR_max; + u32 tALH_min; + u32 tADL_min; + u32 tALS_min; + u32 tAR_min; + u32 tCEA_max; + u32 tCEH_min; + u32 tCH_min; + u32 tCHZ_max; + u32 tCLH_min; + u32 tCLR_min; + u32 tCLS_min; + u32 tCOH_min; + u32 tCS_min; + u32 tDH_min; + u32 tDS_min; + u32 tFEAT_max; + u32 tIR_min; + u32 tITC_max; + u32 tRC_min; + u32 tREA_max; + u32 tREH_min; + u32 tRHOH_min; + u32 tRHW_min; + u32 tRHZ_max; + u32 tRLOH_min; + u32 tRP_min; + u32 tRR_min; + long: 32; + u64 tRST_max; + u32 tWB_max; + u32 tWC_min; + u32 tWH_min; + u32 tWHR_min; + u32 tWP_min; + u32 tWW_min; +}; + +struct nand_nvddr_timings { + u64 tBERS_max; + u32 tCCS_min; + long: 32; + u64 tPROG_max; + u64 tR_max; + u32 tAC_min; + u32 tAC_max; + u32 tADL_min; + u32 tCAD_min; + u32 tCAH_min; + u32 tCALH_min; + u32 tCALS_min; + u32 tCAS_min; + u32 tCEH_min; + u32 tCH_min; + u32 tCK_min; + u32 tCS_min; + u32 tDH_min; + u32 tDQSCK_min; + u32 tDQSCK_max; + u32 tDQSD_min; + u32 tDQSD_max; + u32 tDQSHZ_max; + u32 tDQSQ_max; + u32 tDS_min; + u32 tDSC_min; + u32 tFEAT_max; + u32 tITC_max; + u32 tQHS_max; + u32 tRHW_min; + u32 tRR_min; + u32 tRST_max; + u32 tWB_max; + u32 tWHR_min; + u32 tWRCK_min; + u32 tWW_min; + long: 32; +}; + +enum nand_interface_type { + NAND_SDR_IFACE = 0, + NAND_NVDDR_IFACE = 1, +}; + +struct nand_timings { + unsigned int mode; + long: 32; + union { + struct nand_sdr_timings sdr; + struct nand_nvddr_timings nvddr; + }; +}; + +struct nand_interface_config { + enum nand_interface_type type; + long: 32; + struct nand_timings timings; +}; + +struct nand_op_cmd_instr { + u8 opcode; +}; + +struct nand_op_addr_instr { + unsigned int naddrs; + const u8 *addrs; +}; + +struct nand_op_data_instr { + unsigned int len; + union { + void *in; + const void *out; + } buf; + bool force_8bit; +}; + +struct nand_op_waitrdy_instr { + unsigned int timeout_ms; +}; + +enum nand_op_instr_type { + NAND_OP_CMD_INSTR = 0, + NAND_OP_ADDR_INSTR = 1, + NAND_OP_DATA_IN_INSTR = 2, + NAND_OP_DATA_OUT_INSTR = 3, + NAND_OP_WAITRDY_INSTR = 4, +}; + +struct nand_op_instr { + enum nand_op_instr_type type; + union { + struct nand_op_cmd_instr cmd; + struct nand_op_addr_instr addr; + struct nand_op_data_instr data; + struct nand_op_waitrdy_instr waitrdy; + } ctx; + unsigned int delay_ns; +}; + +struct nand_subop { + unsigned int cs; + const struct nand_op_instr *instrs; + unsigned int ninstrs; + unsigned int first_instr_start_off; + unsigned int last_instr_end_off; +}; + +struct nand_op_parser_addr_constraints { + unsigned int maxcycles; +}; + +struct nand_op_parser_data_constraints { + unsigned int maxlen; +}; + +struct nand_op_parser_pattern_elem { + enum nand_op_instr_type type; + bool optional; + union { + struct nand_op_parser_addr_constraints addr; + struct nand_op_parser_data_constraints data; + } ctx; +}; + +struct nand_op_parser_pattern { + const struct nand_op_parser_pattern_elem *elems; + unsigned int nelems; + int (*exec)(struct nand_chip *, const struct nand_subop *); +}; + +struct nand_op_parser { + const struct nand_op_parser_pattern *patterns; + unsigned int npatterns; +}; + +struct nand_operation { + unsigned int cs; + const struct nand_op_instr *instrs; + unsigned int ninstrs; +}; + +struct nand_controller_ops { + int (*attach_chip)(struct nand_chip *); + void (*detach_chip)(struct nand_chip *); + int (*exec_op)(struct nand_chip *, const struct nand_operation *, bool); + int (*setup_interface)(struct nand_chip *, int, const struct nand_interface_config *); +}; + +struct nand_manufacturer_ops; + +struct nand_manufacturer_desc { + int id; + char *name; + const struct nand_manufacturer_ops *ops; +}; + +struct nand_secure_region { + u64 offset; + u64 size; +}; + +struct nand_flash_dev { + char *name; + union { + struct { + uint8_t mfr_id; + uint8_t dev_id; + }; + uint8_t id[8]; + }; + unsigned int pagesize; + unsigned int chipsize; + unsigned int erasesize; + unsigned int options; + uint16_t id_len; + uint16_t oobsize; + struct { + uint16_t strength_ds; + uint16_t step_ds; + } ecc; +}; + +struct nand_manufacturer_ops { + void (*detect)(struct nand_chip *); + int (*init)(struct nand_chip *); + void (*cleanup)(struct nand_chip *); + void (*fixup_onfi_param_page)(struct nand_chip *, struct nand_onfi_params *); +}; + +struct nand_op_parser_ctx { + const struct nand_op_instr *instrs; + unsigned int ninstrs; + struct nand_subop subop; +}; + +enum nand_ecc_legacy_mode { + NAND_ECC_INVALID = 0, + NAND_ECC_NONE = 1, + NAND_ECC_SOFT = 2, + NAND_ECC_SOFT_BCH = 3, + NAND_ECC_HW = 4, + NAND_ECC_HW_SYNDROME = 5, + NAND_ECC_ON_DIE = 6, +}; + +struct onfi_ext_ecc_info { + u8 ecc_bits; + u8 codeword_size; + __le16 bb_per_lun; + __le16 block_endurance; + u8 reserved[2]; +}; + +struct onfi_ext_section { + u8 type; + u8 length; +}; + +struct onfi_ext_param_page { + __le16 crc; + u8 sig[4]; + u8 reserved0[10]; + struct onfi_ext_section sections[8]; +}; + +struct jedec_ecc_info { + u8 ecc_bits; + u8 codeword_size; + __le16 bb_per_lun; + __le16 block_endurance; + u8 reserved[2]; +}; + +struct nand_jedec_params { + u8 sig[4]; + __le16 revision; + __le16 features; + u8 opt_cmd[3]; + __le16 sec_cmd; + u8 num_of_param_pages; + u8 reserved0[18]; + char manufacturer[12]; + char model[20]; + u8 jedec_id[6]; + u8 reserved1[10]; + __le32 byte_per_page; + __le16 spare_bytes_per_page; + u8 reserved2[6]; + __le32 pages_per_block; + __le32 blocks_per_lun; + u8 lun_count; + u8 addr_cycles; + u8 bits_per_cell; + u8 programs_per_page; + u8 multi_plane_addr; + u8 multi_plane_op_attr; + u8 reserved3[38]; + __le16 async_sdr_speed_grade; + __le16 toggle_ddr_speed_grade; + __le16 sync_ddr_speed_grade; + u8 async_sdr_features; + u8 toggle_ddr_features; + u8 sync_ddr_features; + __le16 t_prog; + __le16 t_bers; + __le16 t_r; + __le16 t_r_multi_plane; + __le16 t_ccs; + __le16 io_pin_capacitance_typ; + __le16 input_pin_capacitance_typ; + __le16 clk_pin_capacitance_typ; + u8 driver_strength_support; + __le16 t_adl; + u8 reserved4[36]; + u8 guaranteed_good_blocks; + __le16 guaranteed_block_endurance; + struct jedec_ecc_info ecc_info[4]; + u8 reserved5[29]; + u8 reserved6[148]; + __le16 vendor_rev_num; + u8 reserved7[88]; + __le16 crc; +} __attribute__((packed)); + +struct hynix_read_retry { + int nregs; + const u8 *regs; + u8 values[0]; +}; + +struct hynix_nand { + const struct hynix_read_retry *read_retry; +}; + +struct hynix_read_retry_otp { + int nregs; + const u8 *regs; + const u8 *values; + int page; + int size; +}; + +struct nand_onfi_vendor_macronix { + u8 reserved; + u8 reliability_func; +}; + +struct nand_onfi_vendor_micron { + u8 two_plane_read; + u8 read_cache; + u8 read_unique_id; + u8 dq_imped; + u8 dq_imped_num_settings; + u8 dq_imped_feat_addr; + u8 rb_pulldown_strength; + u8 rb_pulldown_strength_feat_addr; + u8 rb_pulldown_strength_num_settings; + u8 otp_mode; + u8 otp_page_start; + u8 otp_data_prot_addr; + u8 otp_num_pages; + u8 otp_feat_addr; + u8 read_retry_options; + u8 reserved[72]; + u8 param_revision; +}; + +struct micron_on_die_ecc { + bool forced; + bool enabled; + void *rawbuf; +}; + +struct micron_nand { + struct micron_on_die_ecc ecc; +}; + +enum { + MICRON_ON_DIE_UNSUPPORTED = 0, + MICRON_ON_DIE_SUPPORTED = 1, + MICRON_ON_DIE_MANDATORY = 2, +}; + +typedef void (*spi_res_release_t)(struct spi_controller *, struct spi_message *, void *); + +struct spi_res { + struct list_head entry; + spi_res_release_t release; + long: 32; + long long unsigned int data[0]; +}; + +struct ptp_system_timestamp { + struct timespec64 pre_ts; + struct timespec64 post_ts; +}; + +struct spi_replaced_transfers; + +typedef void (*spi_replaced_release_t)(struct spi_controller *, struct spi_message *, struct spi_replaced_transfers *); + +struct spi_replaced_transfers { + spi_replaced_release_t release; + void *extradata; + struct list_head replaced_transfers; + struct list_head *replaced_after; + size_t inserted; + struct spi_transfer inserted_transfers[0]; +}; + +struct spi_board_info { + char modalias[32]; + const void *platform_data; + const struct software_node *swnode; + void *controller_data; + int irq; + u32 max_speed_hz; + u16 bus_num; + u16 chip_select; + u32 mode; +}; + +enum spi_mem_data_dir { + SPI_MEM_NO_DATA = 0, + SPI_MEM_DATA_IN = 1, + SPI_MEM_DATA_OUT = 2, +}; + +struct spi_mem_op { + struct { + u8 nbytes; + u8 buswidth; + u8 dtr: 1; + u16 opcode; + } cmd; + struct { + u8 nbytes; + u8 buswidth; + u8 dtr: 1; + long: 32; + u64 val; + } addr; + struct { + u8 nbytes; + u8 buswidth; + u8 dtr: 1; + } dummy; + struct { + u8 buswidth; + u8 dtr: 1; + u8 ecc: 1; + enum spi_mem_data_dir dir; + unsigned int nbytes; + union { + void *in; + const void *out; + } buf; + } data; + long: 32; +}; + +struct spi_mem_dirmap_info { + struct spi_mem_op op_tmpl; + u64 offset; + u64 length; +}; + +struct spi_mem_dirmap_desc { + struct spi_mem *mem; + long: 32; + struct spi_mem_dirmap_info info; + unsigned int nodirmap; + void *priv; +}; + +struct spi_mem { + struct spi_device *spi; + void *drvpriv; + const char *name; +}; + +struct trace_event_raw_spi_controller { + struct trace_entry ent; + int bus_num; + char __data[0]; +}; + +struct trace_event_raw_spi_setup { + struct trace_entry ent; + int bus_num; + int chip_select; + long unsigned int mode; + unsigned int bits_per_word; + unsigned int max_speed_hz; + int status; + char __data[0]; +}; + +struct trace_event_raw_spi_set_cs { + struct trace_entry ent; + int bus_num; + int chip_select; + long unsigned int mode; + bool enable; + char __data[0]; +}; + +struct trace_event_raw_spi_message { + struct trace_entry ent; + int bus_num; + int chip_select; + struct spi_message *msg; + char __data[0]; +}; + +struct trace_event_raw_spi_message_done { + struct trace_entry ent; + int bus_num; + int chip_select; + struct spi_message *msg; + unsigned int frame; + unsigned int actual; + char __data[0]; +}; + +struct trace_event_raw_spi_transfer { + struct trace_entry ent; + int bus_num; + int chip_select; + struct spi_transfer *xfer; + int len; + u32 __data_loc_rx_buf; + u32 __data_loc_tx_buf; + char __data[0]; +}; + +struct trace_event_data_offsets_spi_controller {}; + +struct trace_event_data_offsets_spi_setup {}; + +struct trace_event_data_offsets_spi_set_cs {}; + +struct trace_event_data_offsets_spi_message {}; + +struct trace_event_data_offsets_spi_message_done {}; + +struct trace_event_data_offsets_spi_transfer { + u32 rx_buf; + u32 tx_buf; +}; + +typedef void (*btf_trace_spi_controller_idle)(void *, struct spi_controller *); + +typedef void (*btf_trace_spi_controller_busy)(void *, struct spi_controller *); + +typedef void (*btf_trace_spi_setup)(void *, struct spi_device *, int); + +typedef void (*btf_trace_spi_set_cs)(void *, struct spi_device *, bool); + +typedef void (*btf_trace_spi_message_submit)(void *, struct spi_message *); + +typedef void (*btf_trace_spi_message_start)(void *, struct spi_message *); + +typedef void (*btf_trace_spi_message_done)(void *, struct spi_message *); + +typedef void (*btf_trace_spi_transfer_start)(void *, struct spi_message *, struct spi_transfer *); + +typedef void (*btf_trace_spi_transfer_stop)(void *, struct spi_message *, struct spi_transfer *); + +struct boardinfo { + struct list_head list; + struct spi_board_info board_info; +}; + +struct spi_mem_driver { + struct spi_driver spidrv; + int (*probe)(struct spi_mem *); + int (*remove)(struct spi_mem *); + void (*shutdown)(struct spi_mem *); +}; + +struct spi_ioc_transfer { + __u64 tx_buf; + __u64 rx_buf; + __u32 len; + __u32 speed_hz; + __u16 delay_usecs; + __u8 bits_per_word; + __u8 cs_change; + __u8 tx_nbits; + __u8 rx_nbits; + __u8 word_delay_usecs; + __u8 pad; +}; + +struct spidev_data { + dev_t devt; + struct mutex spi_lock; + struct spi_device *spi; + struct list_head device_entry; + struct mutex buf_lock; + unsigned int users; + u8 *tx_buffer; + u8 *rx_buffer; + u32 speed_hz; +}; + +struct spi_bitbang { + struct mutex lock; + u8 busy; + u8 use_dma; + u16 flags; + struct spi_controller *master; + int (*setup_transfer)(struct spi_device *, struct spi_transfer *); + void (*chipselect)(struct spi_device *, int); + int (*txrx_bufs)(struct spi_device *, struct spi_transfer *); + u32 (*txrx_word[4])(struct spi_device *, unsigned int, u32, u8, unsigned int); + int (*set_line_direction)(struct spi_device *, bool); +}; + +struct spi_bitbang_cs { + unsigned int nsecs; + u32 (*txrx_word)(struct spi_device *, unsigned int, u32, u8, unsigned int); + unsigned int (*txrx_bufs)(struct spi_device *, u32 (*)(struct spi_device *, unsigned int, u32, u8, unsigned int), unsigned int, struct spi_transfer *, unsigned int); +}; + +struct spi_gpio_platform_data { + u16 num_chipselect; +}; + +struct spi_gpio { + struct spi_bitbang bitbang; + struct gpio_desc *sck; + struct gpio_desc *miso; + struct gpio_desc *mosi; + struct gpio_desc **cs_gpios; +}; + +enum { + NETIF_F_SG_BIT = 0, + NETIF_F_IP_CSUM_BIT = 1, + __UNUSED_NETIF_F_1 = 2, + NETIF_F_HW_CSUM_BIT = 3, + NETIF_F_IPV6_CSUM_BIT = 4, + NETIF_F_HIGHDMA_BIT = 5, + NETIF_F_FRAGLIST_BIT = 6, + NETIF_F_HW_VLAN_CTAG_TX_BIT = 7, + NETIF_F_HW_VLAN_CTAG_RX_BIT = 8, + NETIF_F_HW_VLAN_CTAG_FILTER_BIT = 9, + NETIF_F_VLAN_CHALLENGED_BIT = 10, + NETIF_F_GSO_BIT = 11, + NETIF_F_LLTX_BIT = 12, + NETIF_F_NETNS_LOCAL_BIT = 13, + NETIF_F_GRO_BIT = 14, + NETIF_F_LRO_BIT = 15, + NETIF_F_GSO_SHIFT = 16, + NETIF_F_TSO_BIT = 16, + NETIF_F_GSO_ROBUST_BIT = 17, + NETIF_F_TSO_ECN_BIT = 18, + NETIF_F_TSO_MANGLEID_BIT = 19, + NETIF_F_TSO6_BIT = 20, + NETIF_F_FSO_BIT = 21, + NETIF_F_GSO_GRE_BIT = 22, + NETIF_F_GSO_GRE_CSUM_BIT = 23, + NETIF_F_GSO_IPXIP4_BIT = 24, + NETIF_F_GSO_IPXIP6_BIT = 25, + NETIF_F_GSO_UDP_TUNNEL_BIT = 26, + NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT = 27, + NETIF_F_GSO_PARTIAL_BIT = 28, + NETIF_F_GSO_TUNNEL_REMCSUM_BIT = 29, + NETIF_F_GSO_SCTP_BIT = 30, + NETIF_F_GSO_ESP_BIT = 31, + NETIF_F_GSO_UDP_BIT = 32, + NETIF_F_GSO_UDP_L4_BIT = 33, + NETIF_F_GSO_FRAGLIST_BIT = 34, + NETIF_F_GSO_LAST = 34, + NETIF_F_FCOE_CRC_BIT = 35, + NETIF_F_SCTP_CRC_BIT = 36, + NETIF_F_FCOE_MTU_BIT = 37, + NETIF_F_NTUPLE_BIT = 38, + NETIF_F_RXHASH_BIT = 39, + NETIF_F_RXCSUM_BIT = 40, + NETIF_F_NOCACHE_COPY_BIT = 41, + NETIF_F_LOOPBACK_BIT = 42, + NETIF_F_RXFCS_BIT = 43, + NETIF_F_RXALL_BIT = 44, + NETIF_F_HW_VLAN_STAG_TX_BIT = 45, + NETIF_F_HW_VLAN_STAG_RX_BIT = 46, + NETIF_F_HW_VLAN_STAG_FILTER_BIT = 47, + NETIF_F_HW_L2FW_DOFFLOAD_BIT = 48, + NETIF_F_HW_TC_BIT = 49, + NETIF_F_HW_ESP_BIT = 50, + NETIF_F_HW_ESP_TX_CSUM_BIT = 51, + NETIF_F_RX_UDP_TUNNEL_PORT_BIT = 52, + NETIF_F_HW_TLS_TX_BIT = 53, + NETIF_F_HW_TLS_RX_BIT = 54, + NETIF_F_GRO_HW_BIT = 55, + NETIF_F_HW_TLS_RECORD_BIT = 56, + NETIF_F_GRO_FRAGLIST_BIT = 57, + NETIF_F_HW_MACSEC_BIT = 58, + NETIF_F_GRO_UDP_FWD_BIT = 59, + NETIF_F_HW_HSR_TAG_INS_BIT = 60, + NETIF_F_HW_HSR_TAG_RM_BIT = 61, + NETIF_F_HW_HSR_FWD_BIT = 62, + NETIF_F_HW_HSR_DUP_BIT = 63, + NETDEV_FEATURE_COUNT = 64, +}; + +enum { + SKBTX_HW_TSTAMP = 1, + SKBTX_SW_TSTAMP = 2, + SKBTX_IN_PROGRESS = 4, + SKBTX_HW_TSTAMP_USE_CYCLES = 8, + SKBTX_WIFI_STATUS = 16, + SKBTX_HW_TSTAMP_NETDEV = 32, + SKBTX_SCHED_TSTAMP = 64, +}; + +struct mdio_board_info { + const char *bus_id; + char modalias[32]; + int mdio_addr; + const void *platform_data; +}; + +struct mdio_board_entry { + struct list_head list; + struct mdio_board_info board_info; +}; + +struct mdiobus_devres { + struct mii_bus *mii; +}; + +enum netdev_state_t { + __LINK_STATE_START = 0, + __LINK_STATE_PRESENT = 1, + __LINK_STATE_NOCARRIER = 2, + __LINK_STATE_LINKWATCH_PENDING = 3, + __LINK_STATE_DORMANT = 4, + __LINK_STATE_TESTING = 5, +}; + +struct mii_ioctl_data { + __u16 phy_id; + __u16 reg_num; + __u16 val_in; + __u16 val_out; +}; + +enum { + ETHTOOL_MSG_KERNEL_NONE = 0, + ETHTOOL_MSG_STRSET_GET_REPLY = 1, + ETHTOOL_MSG_LINKINFO_GET_REPLY = 2, + ETHTOOL_MSG_LINKINFO_NTF = 3, + ETHTOOL_MSG_LINKMODES_GET_REPLY = 4, + ETHTOOL_MSG_LINKMODES_NTF = 5, + ETHTOOL_MSG_LINKSTATE_GET_REPLY = 6, + ETHTOOL_MSG_DEBUG_GET_REPLY = 7, + ETHTOOL_MSG_DEBUG_NTF = 8, + ETHTOOL_MSG_WOL_GET_REPLY = 9, + ETHTOOL_MSG_WOL_NTF = 10, + ETHTOOL_MSG_FEATURES_GET_REPLY = 11, + ETHTOOL_MSG_FEATURES_SET_REPLY = 12, + ETHTOOL_MSG_FEATURES_NTF = 13, + ETHTOOL_MSG_PRIVFLAGS_GET_REPLY = 14, + ETHTOOL_MSG_PRIVFLAGS_NTF = 15, + ETHTOOL_MSG_RINGS_GET_REPLY = 16, + ETHTOOL_MSG_RINGS_NTF = 17, + ETHTOOL_MSG_CHANNELS_GET_REPLY = 18, + ETHTOOL_MSG_CHANNELS_NTF = 19, + ETHTOOL_MSG_COALESCE_GET_REPLY = 20, + ETHTOOL_MSG_COALESCE_NTF = 21, + ETHTOOL_MSG_PAUSE_GET_REPLY = 22, + ETHTOOL_MSG_PAUSE_NTF = 23, + ETHTOOL_MSG_EEE_GET_REPLY = 24, + ETHTOOL_MSG_EEE_NTF = 25, + ETHTOOL_MSG_TSINFO_GET_REPLY = 26, + ETHTOOL_MSG_CABLE_TEST_NTF = 27, + ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 28, + ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 29, + ETHTOOL_MSG_FEC_GET_REPLY = 30, + ETHTOOL_MSG_FEC_NTF = 31, + ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY = 32, + ETHTOOL_MSG_STATS_GET_REPLY = 33, + ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY = 34, + ETHTOOL_MSG_MODULE_GET_REPLY = 35, + ETHTOOL_MSG_MODULE_NTF = 36, + ETHTOOL_MSG_PSE_GET_REPLY = 37, + ETHTOOL_MSG_RSS_GET_REPLY = 38, + ETHTOOL_MSG_PLCA_GET_CFG_REPLY = 39, + ETHTOOL_MSG_PLCA_GET_STATUS_REPLY = 40, + ETHTOOL_MSG_PLCA_NTF = 41, + ETHTOOL_MSG_MM_GET_REPLY = 42, + ETHTOOL_MSG_MM_NTF = 43, + __ETHTOOL_MSG_KERNEL_CNT = 44, + ETHTOOL_MSG_KERNEL_MAX = 43, +}; + +enum { + ETHTOOL_A_STATS_UNSPEC = 0, + ETHTOOL_A_STATS_PAD = 1, + ETHTOOL_A_STATS_HEADER = 2, + ETHTOOL_A_STATS_GROUPS = 3, + ETHTOOL_A_STATS_GRP = 4, + ETHTOOL_A_STATS_SRC = 5, + __ETHTOOL_A_STATS_CNT = 6, + ETHTOOL_A_STATS_MAX = 5, +}; + +struct phy_led_trigger { + struct led_trigger trigger; + char name[76]; + unsigned int speed; +}; + +struct phy_setting { + u32 speed; + u8 duplex; + u8 bit; +}; + +struct ethtool_phy_ops { + int (*get_sset_count)(struct phy_device *); + int (*get_strings)(struct phy_device *, u8 *); + int (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*get_plca_cfg)(struct phy_device *, struct phy_plca_cfg *); + int (*set_plca_cfg)(struct phy_device *, const struct phy_plca_cfg *, struct netlink_ext_ack *); + int (*get_plca_status)(struct phy_device *, struct phy_plca_status *); + int (*start_cable_test)(struct phy_device *, struct netlink_ext_ack *); + int (*start_cable_test_tdr)(struct phy_device *, struct netlink_ext_ack *, const struct phy_tdr_config *); +}; + +struct phy_fixup { + struct list_head list; + char bus_id[64]; + u32 phy_uid; + u32 phy_uid_mask; + int (*run)(struct phy_device *); +}; + +struct sfp_eeprom_base { + u8 phys_id; + u8 phys_ext_id; + u8 connector; + u8 if_1x_copper_passive: 1; + u8 if_1x_copper_active: 1; + u8 if_1x_lx: 1; + u8 if_1x_sx: 1; + u8 e10g_base_sr: 1; + u8 e10g_base_lr: 1; + u8 e10g_base_lrm: 1; + u8 e10g_base_er: 1; + u8 sonet_oc3_short_reach: 1; + u8 sonet_oc3_smf_intermediate_reach: 1; + u8 sonet_oc3_smf_long_reach: 1; + u8 unallocated_5_3: 1; + u8 sonet_oc12_short_reach: 1; + u8 sonet_oc12_smf_intermediate_reach: 1; + u8 sonet_oc12_smf_long_reach: 1; + u8 unallocated_5_7: 1; + u8 sonet_oc48_short_reach: 1; + u8 sonet_oc48_intermediate_reach: 1; + u8 sonet_oc48_long_reach: 1; + u8 sonet_reach_bit2: 1; + u8 sonet_reach_bit1: 1; + u8 sonet_oc192_short_reach: 1; + u8 escon_smf_1310_laser: 1; + u8 escon_mmf_1310_led: 1; + u8 e1000_base_sx: 1; + u8 e1000_base_lx: 1; + u8 e1000_base_cx: 1; + u8 e1000_base_t: 1; + u8 e100_base_lx: 1; + u8 e100_base_fx: 1; + u8 e_base_bx10: 1; + u8 e_base_px: 1; + u8 fc_tech_electrical_inter_enclosure: 1; + u8 fc_tech_lc: 1; + u8 fc_tech_sa: 1; + u8 fc_ll_m: 1; + u8 fc_ll_l: 1; + u8 fc_ll_i: 1; + u8 fc_ll_s: 1; + u8 fc_ll_v: 1; + u8 unallocated_8_0: 1; + u8 unallocated_8_1: 1; + u8 sfp_ct_passive: 1; + u8 sfp_ct_active: 1; + u8 fc_tech_ll: 1; + u8 fc_tech_sl: 1; + u8 fc_tech_sn: 1; + u8 fc_tech_electrical_intra_enclosure: 1; + u8 fc_media_sm: 1; + u8 unallocated_9_1: 1; + u8 fc_media_m5: 1; + u8 fc_media_m6: 1; + u8 fc_media_tv: 1; + u8 fc_media_mi: 1; + u8 fc_media_tp: 1; + u8 fc_media_tw: 1; + u8 fc_speed_100: 1; + u8 unallocated_10_1: 1; + u8 fc_speed_200: 1; + u8 fc_speed_3200: 1; + u8 fc_speed_400: 1; + u8 fc_speed_1600: 1; + u8 fc_speed_800: 1; + u8 fc_speed_1200: 1; + u8 encoding; + u8 br_nominal; + u8 rate_id; + u8 link_len[6]; + char vendor_name[16]; + u8 extended_cc; + char vendor_oui[3]; + char vendor_pn[16]; + char vendor_rev[4]; + union { + __be16 optical_wavelength; + __be16 cable_compliance; + struct { + u8 sff8431_app_e: 1; + u8 fc_pi_4_app_h: 1; + u8 reserved60_2: 6; + u8 reserved61: 8; + } passive; + struct { + u8 sff8431_app_e: 1; + u8 fc_pi_4_app_h: 1; + u8 sff8431_lim: 1; + u8 fc_pi_4_lim: 1; + u8 reserved60_4: 4; + u8 reserved61: 8; + } active; + }; + u8 reserved62; + u8 cc_base; +}; + +struct sfp_eeprom_ext { + __be16 options; + u8 br_max; + u8 br_min; + char vendor_sn[16]; + char datecode[8]; + u8 diagmon; + u8 enhopts; + u8 sff8472_compliance; + u8 cc_ext; +}; + +struct sfp_eeprom_id { + struct sfp_eeprom_base base; + struct sfp_eeprom_ext ext; +}; + +struct sfp_upstream_ops { + void (*attach)(void *, struct sfp_bus *); + void (*detach)(void *, struct sfp_bus *); + int (*module_insert)(void *, const struct sfp_eeprom_id *); + void (*module_remove)(void *); + int (*module_start)(void *); + void (*module_stop)(void *); + void (*link_down)(void *); + void (*link_up)(void *); + int (*connect_phy)(void *, struct phy_device *); + void (*disconnect_phy)(void *); +}; + +struct mdio_driver { + struct mdio_driver_common mdiodrv; + int (*probe)(struct mdio_device *); + void (*remove)(struct mdio_device *); + void (*shutdown)(struct mdio_device *); +}; + +struct trace_event_raw_mdio_access { + struct trace_entry ent; + char busid[61]; + char read; + u8 addr; + u16 val; + unsigned int regnum; + char __data[0]; +}; + +struct trace_event_data_offsets_mdio_access {}; + +typedef void (*btf_trace_mdio_access)(void *, struct mii_bus *, char, u8, unsigned int, u16, int); + +struct mdio_bus_stat_attr { + int addr; + unsigned int field_offset; +}; + +struct fixed_phy_status { + int link; + int speed; + int duplex; + int pause; + int asym_pause; +}; + +struct swmii_regs { + u16 bmsr; + u16 lpa; + u16 lpagb; + u16 estat; +}; + +enum { + SWMII_SPEED_10 = 0, + SWMII_SPEED_100 = 1, + SWMII_SPEED_1000 = 2, + SWMII_DUPLEX_HALF = 0, + SWMII_DUPLEX_FULL = 1, +}; + +struct sfp; + +struct sfp_socket_ops; + +struct sfp_quirk; + +struct sfp_bus { + struct kref kref; + struct list_head node; + struct fwnode_handle *fwnode; + const struct sfp_socket_ops *socket_ops; + struct device *sfp_dev; + struct sfp *sfp; + const struct sfp_quirk *sfp_quirk; + const struct sfp_upstream_ops *upstream_ops; + void *upstream; + struct phy_device *phydev; + bool registered; + bool started; +}; + +enum { + SFF8024_ID_UNK = 0, + SFF8024_ID_SFF_8472 = 2, + SFF8024_ID_SFP = 3, + SFF8024_ID_DWDM_SFP = 11, + SFF8024_ID_QSFP_8438 = 12, + SFF8024_ID_QSFP_8436_8636 = 13, + SFF8024_ID_QSFP28_8636 = 17, + SFF8024_ENCODING_UNSPEC = 0, + SFF8024_ENCODING_8B10B = 1, + SFF8024_ENCODING_4B5B = 2, + SFF8024_ENCODING_NRZ = 3, + SFF8024_ENCODING_8472_MANCHESTER = 4, + SFF8024_ENCODING_8472_SONET = 5, + SFF8024_ENCODING_8472_64B66B = 6, + SFF8024_ENCODING_8436_MANCHESTER = 6, + SFF8024_ENCODING_8436_SONET = 4, + SFF8024_ENCODING_8436_64B66B = 5, + SFF8024_ENCODING_256B257B = 7, + SFF8024_ENCODING_PAM4 = 8, + SFF8024_CONNECTOR_UNSPEC = 0, + SFF8024_CONNECTOR_SC = 1, + SFF8024_CONNECTOR_FIBERJACK = 6, + SFF8024_CONNECTOR_LC = 7, + SFF8024_CONNECTOR_MT_RJ = 8, + SFF8024_CONNECTOR_MU = 9, + SFF8024_CONNECTOR_SG = 10, + SFF8024_CONNECTOR_OPTICAL_PIGTAIL = 11, + SFF8024_CONNECTOR_MPO_1X12 = 12, + SFF8024_CONNECTOR_MPO_2X16 = 13, + SFF8024_CONNECTOR_HSSDC_II = 32, + SFF8024_CONNECTOR_COPPER_PIGTAIL = 33, + SFF8024_CONNECTOR_RJ45 = 34, + SFF8024_CONNECTOR_NOSEPARATE = 35, + SFF8024_CONNECTOR_MXC_2X16 = 36, + SFF8024_ECC_UNSPEC = 0, + SFF8024_ECC_100G_25GAUI_C2M_AOC = 1, + SFF8024_ECC_100GBASE_SR4_25GBASE_SR = 2, + SFF8024_ECC_100GBASE_LR4_25GBASE_LR = 3, + SFF8024_ECC_100GBASE_ER4_25GBASE_ER = 4, + SFF8024_ECC_100GBASE_SR10 = 5, + SFF8024_ECC_100GBASE_CR4 = 11, + SFF8024_ECC_25GBASE_CR_S = 12, + SFF8024_ECC_25GBASE_CR_N = 13, + SFF8024_ECC_10GBASE_T_SFI = 22, + SFF8024_ECC_10GBASE_T_SR = 28, + SFF8024_ECC_5GBASE_T = 29, + SFF8024_ECC_2_5GBASE_T = 30, +}; + +struct sfp_quirk { + const char *vendor; + const char *part; + void (*modes)(const struct sfp_eeprom_id *, long unsigned int *, long unsigned int *); + void (*fixup)(struct sfp *); +}; + +struct sfp_socket_ops { + void (*attach)(struct sfp *); + void (*detach)(struct sfp *); + void (*start)(struct sfp *); + void (*stop)(struct sfp *); + int (*module_info)(struct sfp *, struct ethtool_modinfo *); + int (*module_eeprom)(struct sfp *, struct ethtool_eeprom *, u8 *); + int (*module_eeprom_by_page)(struct sfp *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *); +}; + +struct fixed_mdio_bus { + struct mii_bus *mii_bus; + struct list_head phys; +}; + +struct fixed_phy { + int addr; + struct phy_device *phydev; + struct fixed_phy_status status; + bool no_carrier; + int (*link_update)(struct net_device *, struct fixed_phy_status *); + struct list_head node; + struct gpio_desc *link_gpiod; +}; + +struct sun4i_mdio_data { + void *membase; + struct regulator *regulator; +}; + +enum usb_otg_state { + OTG_STATE_UNDEFINED = 0, + OTG_STATE_B_IDLE = 1, + OTG_STATE_B_SRP_INIT = 2, + OTG_STATE_B_PERIPHERAL = 3, + OTG_STATE_B_WAIT_ACON = 4, + OTG_STATE_B_HOST = 5, + OTG_STATE_A_IDLE = 6, + OTG_STATE_A_WAIT_VRISE = 7, + OTG_STATE_A_WAIT_BCON = 8, + OTG_STATE_A_HOST = 9, + OTG_STATE_A_SUSPEND = 10, + OTG_STATE_A_PERIPHERAL = 11, + OTG_STATE_A_WAIT_VFALL = 12, + OTG_STATE_A_VBUS_ERR = 13, +}; + +struct usb_otg_caps { + u16 otg_rev; + bool hnp_support; + bool srp_support; + bool adp_support; +}; + +enum usb_led_event { + USB_LED_EVENT_HOST = 0, + USB_LED_EVENT_GADGET = 1, +}; + +enum usb_charger_type { + UNKNOWN_TYPE = 0, + SDP_TYPE = 1, + DCP_TYPE = 2, + CDP_TYPE = 3, + ACA_TYPE = 4, +}; + +enum usb_charger_state { + USB_CHARGER_DEFAULT = 0, + USB_CHARGER_PRESENT = 1, + USB_CHARGER_ABSENT = 2, +}; + +enum usb_phy_events { + USB_EVENT_NONE = 0, + USB_EVENT_VBUS = 1, + USB_EVENT_ID = 2, + USB_EVENT_CHARGER = 3, + USB_EVENT_ENUMERATED = 4, +}; + +enum usb_phy_type { + USB_PHY_TYPE_UNDEFINED = 0, + USB_PHY_TYPE_USB2 = 1, + USB_PHY_TYPE_USB3 = 2, +}; + +struct usb_phy; + +struct usb_phy_io_ops { + int (*read)(struct usb_phy *, u32); + int (*write)(struct usb_phy *, u32, u32); +}; + +struct usb_charger_current { + unsigned int sdp_min; + unsigned int sdp_max; + unsigned int dcp_min; + unsigned int dcp_max; + unsigned int cdp_min; + unsigned int cdp_max; + unsigned int aca_min; + unsigned int aca_max; +}; + +struct usb_otg; + +struct usb_phy { + struct device *dev; + const char *label; + unsigned int flags; + enum usb_phy_type type; + enum usb_phy_events last_event; + struct usb_otg *otg; + struct device *io_dev; + struct usb_phy_io_ops *io_ops; + void *io_priv; + struct extcon_dev *edev; + struct extcon_dev *id_edev; + struct notifier_block vbus_nb; + struct notifier_block id_nb; + struct notifier_block type_nb; + enum usb_charger_type chg_type; + enum usb_charger_state chg_state; + struct usb_charger_current chg_cur; + struct work_struct chg_work; + struct atomic_notifier_head notifier; + u16 port_status; + u16 port_change; + struct list_head head; + int (*init)(struct usb_phy *); + void (*shutdown)(struct usb_phy *); + int (*set_vbus)(struct usb_phy *, int); + int (*set_power)(struct usb_phy *, unsigned int); + int (*set_suspend)(struct usb_phy *, int); + int (*set_wakeup)(struct usb_phy *, bool); + int (*notify_connect)(struct usb_phy *, enum usb_device_speed); + int (*notify_disconnect)(struct usb_phy *, enum usb_device_speed); + enum usb_charger_type (*charger_detect)(struct usb_phy *); +}; + +struct phy_devm { + struct usb_phy *phy; + struct notifier_block *nb; +}; + +enum usb_phy_interface { + USBPHY_INTERFACE_MODE_UNKNOWN = 0, + USBPHY_INTERFACE_MODE_UTMI = 1, + USBPHY_INTERFACE_MODE_UTMIW = 2, + USBPHY_INTERFACE_MODE_ULPI = 3, + USBPHY_INTERFACE_MODE_SERIAL = 4, + USBPHY_INTERFACE_MODE_HSIC = 5, +}; + +struct usb_gadget; + +struct usb_otg { + u8 default_a; + struct phy *phy; + struct usb_phy *usb_phy; + struct usb_bus *host; + struct usb_gadget *gadget; + enum usb_otg_state state; + int (*set_host)(struct usb_otg *, struct usb_bus *); + int (*set_peripheral)(struct usb_otg *, struct usb_gadget *); + int (*set_vbus)(struct usb_otg *, bool); + int (*start_srp)(struct usb_otg *); + int (*start_hnp)(struct usb_otg *); +}; + +struct ulpi_info { + unsigned int id; + char *name; +}; + +enum amd_chipset_gen { + NOT_AMD_CHIPSET = 0, + AMD_CHIPSET_SB600 = 1, + AMD_CHIPSET_SB700 = 2, + AMD_CHIPSET_SB800 = 3, + AMD_CHIPSET_HUDSON2 = 4, + AMD_CHIPSET_BOLTON = 5, + AMD_CHIPSET_YANGTZE = 6, + AMD_CHIPSET_TAISHAN = 7, + AMD_CHIPSET_UNKNOWN = 8, +}; + +struct amd_chipset_type { + enum amd_chipset_gen gen; + u8 rev; +}; + +struct amd_chipset_info { + struct pci_dev *nb_dev; + struct pci_dev *smbus_dev; + int nb_type; + struct amd_chipset_type sb_type; + int isoc_reqs; + int probe_count; + bool need_pll_quirk; +}; + +struct serio_device_id { + __u8 type; + __u8 extra; + __u8 id; + __u8 proto; +}; + +struct serio_driver; + +struct serio { + void *port_data; + char name[32]; + char phys[32]; + char firmware_id[128]; + bool manual_bind; + struct serio_device_id id; + spinlock_t lock; + int (*write)(struct serio *, unsigned char); + int (*open)(struct serio *); + void (*close)(struct serio *); + int (*start)(struct serio *); + void (*stop)(struct serio *); + struct serio *parent; + struct list_head child_node; + struct list_head children; + unsigned int depth; + struct serio_driver *drv; + struct mutex drv_mutex; + long: 32; + struct device dev; + struct list_head node; + struct mutex *ps2_cmd_mutex; + long: 32; +}; + +struct serio_driver { + const char *description; + const struct serio_device_id *id_table; + bool manual_bind; + void (*write_wakeup)(struct serio *); + irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int); + int (*connect)(struct serio *, struct serio_driver *); + int (*reconnect)(struct serio *); + int (*fast_reconnect)(struct serio *); + void (*disconnect)(struct serio *); + void (*cleanup)(struct serio *); + struct device_driver driver; +}; + +enum serio_event_type { + SERIO_RESCAN_PORT = 0, + SERIO_RECONNECT_PORT = 1, + SERIO_RECONNECT_SUBTREE = 2, + SERIO_REGISTER_PORT = 3, + SERIO_ATTACH_DRIVER = 4, +}; + +struct serio_event { + enum serio_event_type type; + void *object; + struct module *owner; + struct list_head node; +}; + +struct serport___2 { + struct tty_struct *tty; + wait_queue_head_t wait; + struct serio *serio; + struct serio_device_id id; + spinlock_t lock; + long unsigned int flags; +}; + +struct ps2dev { + struct serio *serio; + struct mutex cmd_mutex; + wait_queue_head_t wait; + long unsigned int flags; + u8 cmdbuf[8]; + u8 cmdcnt; + u8 nak; +}; + +struct input_mt_slot { + int abs[14]; + unsigned int frame; + unsigned int key; +}; + +struct input_mt { + int trkid; + int num_slots; + int slot; + unsigned int flags; + unsigned int frame; + int *red; + struct input_mt_slot slots[0]; +}; + +union input_seq_state { + struct { + short unsigned int pos; + bool mutex_acquired; + }; + void *p; +}; + +struct input_devres { + struct input_dev *input; +}; + +struct input_event { + __kernel_ulong_t __sec; + __kernel_ulong_t __usec; + __u16 type; + __u16 code; + __s32 value; +}; + +struct input_mt_pos { + s16 x; + s16 y; +}; + +struct input_dev_poller { + void (*poll)(struct input_dev *); + unsigned int poll_interval; + unsigned int poll_interval_max; + unsigned int poll_interval_min; + struct input_dev *input; + struct delayed_work work; +}; + +struct touchscreen_properties { + unsigned int max_x; + unsigned int max_y; + bool invert_x; + bool invert_y; + bool swap_x_y; +}; + +struct vivaldi_data { + u32 function_row_physmap[24]; + unsigned int num_function_row_keys; +}; + +struct led_init_data { + struct fwnode_handle *fwnode; + const char *default_label; + const char *devicename; + bool devname_mandatory; +}; + +struct input_led { + struct led_classdev cdev; + struct input_handle *handle; + unsigned int code; +}; + +struct input_leds { + struct input_handle handle; + unsigned int num_leds; + struct input_led leds[0]; +}; + +struct mousedev_hw_data { + int dx; + int dy; + int dz; + int x; + int y; + int abs_event; + long unsigned int buttons; +}; + +struct mousedev { + int open; + struct input_handle handle; + wait_queue_head_t wait; + struct list_head client_list; + spinlock_t client_lock; + struct mutex mutex; + long: 32; + struct device dev; + struct cdev cdev; + bool exist; + struct list_head mixdev_node; + bool opened_by_mixdev; + struct mousedev_hw_data packet; + unsigned int pkt_count; + int old_x[4]; + int old_y[4]; + int frac_dx; + int frac_dy; + long unsigned int touch; + int (*open_device)(struct mousedev *); + void (*close_device)(struct mousedev *); +}; + +enum mousedev_emul { + MOUSEDEV_EMUL_PS2 = 0, + MOUSEDEV_EMUL_IMPS = 1, + MOUSEDEV_EMUL_EXPS = 2, +}; + +struct mousedev_motion { + int dx; + int dy; + int dz; + long unsigned int buttons; +}; + +struct mousedev_client { + struct fasync_struct *fasync; + struct mousedev *mousedev; + struct list_head node; + struct mousedev_motion packets[16]; + unsigned int head; + unsigned int tail; + spinlock_t packet_lock; + int pos_x; + int pos_y; + u8 ps2[6]; + unsigned char ready; + unsigned char buffer; + unsigned char bufsiz; + unsigned char imexseq; + unsigned char impsseq; + enum mousedev_emul mode; + long unsigned int last_buttons; +}; + +enum { + FRACTION_DENOM = 128, +}; + +struct atkbd { + struct ps2dev ps2dev; + struct input_dev *dev; + char name[64]; + char phys[32]; + short unsigned int id; + short unsigned int keycode[512]; + long unsigned int force_release_mask[16]; + unsigned char set; + bool translated; + bool extra; + bool write; + bool softrepeat; + bool softraw; + bool scroll; + bool enabled; + unsigned char emul; + bool resend; + bool release; + long unsigned int xl_bit; + unsigned int last; + long unsigned int time; + long unsigned int err_count; + struct delayed_work event_work; + long unsigned int event_jiffies; + long unsigned int event_mask; + struct mutex mutex; + struct vivaldi_data vdata; +}; + +struct gpio_keys_button { + unsigned int code; + int gpio; + int active_low; + const char *desc; + unsigned int type; + int wakeup; + int wakeup_event_action; + int debounce_interval; + bool can_disable; + int value; + unsigned int irq; +}; + +struct gpio_keys_platform_data { + const struct gpio_keys_button *buttons; + int nbuttons; + unsigned int poll_interval; + unsigned int rep: 1; + int (*enable)(struct device *); + void (*disable)(struct device *); + const char *name; +}; + +struct gpio_button_data { + const struct gpio_keys_button *button; + struct input_dev *input; + struct gpio_desc *gpiod; + short unsigned int *code; + struct hrtimer release_timer; + unsigned int release_delay; + struct delayed_work work; + struct hrtimer debounce_timer; + unsigned int software_debounce; + unsigned int irq; + unsigned int wakeup_trigger_type; + spinlock_t lock; + bool disabled; + bool key_pressed; + bool suspended; + bool debounce_use_hrtimer; + long: 32; +}; + +struct gpio_keys_drvdata { + const struct gpio_keys_platform_data *pdata; + struct input_dev *input; + struct mutex disable_lock; + short unsigned int *keymap; + struct gpio_button_data data[0]; +}; + +struct xenkbd_motion { + uint8_t type; + int32_t rel_x; + int32_t rel_y; + int32_t rel_z; +}; + +struct xenkbd_key { + uint8_t type; + uint8_t pressed; + uint32_t keycode; +}; + +struct xenkbd_position { + uint8_t type; + int32_t abs_x; + int32_t abs_y; + int32_t rel_z; +}; + +struct xenkbd_mtouch { + uint8_t type; + uint8_t event_type; + uint8_t contact_id; + uint8_t reserved[5]; + union { + struct { + int32_t abs_x; + int32_t abs_y; + } pos; + struct { + uint32_t major; + uint32_t minor; + } shape; + int16_t orientation; + } u; +}; + +union xenkbd_in_event { + uint8_t type; + struct xenkbd_motion motion; + struct xenkbd_key key; + struct xenkbd_position pos; + struct xenkbd_mtouch mtouch; + char pad[40]; +}; + +struct xenkbd_page { + uint32_t in_cons; + uint32_t in_prod; + uint32_t out_cons; + uint32_t out_prod; +}; + +struct xenkbd_info { + struct input_dev *kbd; + struct input_dev *ptr; + struct input_dev *mtouch; + struct xenkbd_page *page; + int gref; + int irq; + struct xenbus_device *xbdev; + char phys[32]; + int mtouch_cur_contact_id; +}; + +enum { + KPARAM_X = 0, + KPARAM_Y = 1, + KPARAM_CNT___2 = 2, +}; + +struct trace_event_raw_rtc_time_alarm_class { + struct trace_entry ent; + time64_t secs; + int err; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_rtc_irq_set_freq { + struct trace_entry ent; + int freq; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_irq_set_state { + struct trace_entry ent; + int enabled; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_alarm_irq_enable { + struct trace_entry ent; + unsigned int enabled; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_offset_class { + struct trace_entry ent; + long int offset; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_timer_class { + struct trace_entry ent; + struct rtc_timer *timer; + long: 32; + ktime_t expires; + ktime_t period; + char __data[0]; +}; + +struct trace_event_data_offsets_rtc_time_alarm_class {}; + +struct trace_event_data_offsets_rtc_irq_set_freq {}; + +struct trace_event_data_offsets_rtc_irq_set_state {}; + +struct trace_event_data_offsets_rtc_alarm_irq_enable {}; + +struct trace_event_data_offsets_rtc_offset_class {}; + +struct trace_event_data_offsets_rtc_timer_class {}; + +typedef void (*btf_trace_rtc_set_time)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_read_time)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_set_alarm)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_read_alarm)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_irq_set_freq)(void *, int, int); + +typedef void (*btf_trace_rtc_irq_set_state)(void *, int, int); + +typedef void (*btf_trace_rtc_alarm_irq_enable)(void *, unsigned int, int); + +typedef void (*btf_trace_rtc_set_offset)(void *, long int, int); + +typedef void (*btf_trace_rtc_read_offset)(void *, long int, int); + +typedef void (*btf_trace_rtc_timer_enqueue)(void *, struct rtc_timer *); + +typedef void (*btf_trace_rtc_timer_dequeue)(void *, struct rtc_timer *); + +typedef void (*btf_trace_rtc_timer_fired)(void *, struct rtc_timer *); + +enum { + none = 0, + day = 1, + month = 2, + year = 3, +}; + +struct mc146818_get_time_callback_param { + struct rtc_time *time; + unsigned char ctrl; +}; + +struct ac100_clkout { + struct clk_hw hw; + struct regmap *regmap; + u8 offset; +}; + +struct ac100_rtc_dev { + struct rtc_device *rtc; + struct device *dev; + struct regmap *regmap; + int irq; + long unsigned int alarm; + struct clk_hw *rtc_32k_clk; + struct ac100_clkout clks[3]; + struct clk_hw_onecell_data *clk_data; +}; + +struct value_to_freq { + u32 value; + u8 freq; +}; + +struct armada38x_rtc_data; + +struct armada38x_rtc { + struct rtc_device *rtc_dev; + void *regs; + void *regs_soc; + spinlock_t lock; + int irq; + bool initialized; + struct value_to_freq *val_to_freq; + const struct armada38x_rtc_data *data; +}; + +struct armada38x_rtc_data { + void (*update_mbus_timing)(struct armada38x_rtc *); + u32 (*read_rtc_reg)(struct armada38x_rtc *, u8); + void (*clear_isr)(struct armada38x_rtc *); + void (*unmask_interrupt)(struct armada38x_rtc *); + u32 alarm; +}; + +struct as3722_rtc { + struct rtc_device *rtc; + struct device *dev; + struct as3722 *as3722; + int alarm_irq; + bool irq_enable; +}; + +struct da9052_rtc { + struct rtc_device *rtc; + struct da9052 *da9052; +}; + +struct ds1307_platform_data { + u8 trickle_charger_setup; +}; + +struct sensor_device_attribute { + struct device_attribute dev_attr; + int index; +}; + +struct watchdog_info { + __u32 options; + __u32 firmware_version; + __u8 identity[32]; +}; + +struct watchdog_device; + +struct watchdog_ops { + struct module *owner; + int (*start)(struct watchdog_device *); + int (*stop)(struct watchdog_device *); + int (*ping)(struct watchdog_device *); + unsigned int (*status)(struct watchdog_device *); + int (*set_timeout)(struct watchdog_device *, unsigned int); + int (*set_pretimeout)(struct watchdog_device *, unsigned int); + unsigned int (*get_timeleft)(struct watchdog_device *); + int (*restart)(struct watchdog_device *, long unsigned int, void *); + long int (*ioctl)(struct watchdog_device *, unsigned int, long unsigned int); +}; + +struct watchdog_governor; + +struct watchdog_core_data; + +struct watchdog_device { + int id; + struct device *parent; + const struct attribute_group **groups; + const struct watchdog_info *info; + const struct watchdog_ops *ops; + const struct watchdog_governor *gov; + unsigned int bootstatus; + unsigned int timeout; + unsigned int pretimeout; + unsigned int min_timeout; + unsigned int max_timeout; + unsigned int min_hw_heartbeat_ms; + unsigned int max_hw_heartbeat_ms; + struct notifier_block reboot_nb; + struct notifier_block restart_nb; + struct notifier_block pm_nb; + void *driver_data; + struct watchdog_core_data *wd_data; + long unsigned int status; + struct list_head deferred; +}; + +struct watchdog_governor { + const char name[20]; + void (*pretimeout)(struct watchdog_device *); +}; + +enum ds_type { + unknown_ds_type = 0, + ds_1307 = 1, + ds_1308 = 2, + ds_1337 = 3, + ds_1338 = 4, + ds_1339 = 5, + ds_1340 = 6, + ds_1341 = 7, + ds_1388 = 8, + ds_3231 = 9, + m41t0 = 10, + m41t00 = 11, + m41t11 = 12, + mcp794xx = 13, + rx_8025 = 14, + rx_8130 = 15, + last_ds_type = 16, +}; + +struct ds1307 { + enum ds_type type; + struct device *dev; + struct regmap *regmap; + const char *name; + struct rtc_device *rtc; + struct clk_hw clks[2]; +}; + +struct chip_desc { + unsigned int alarm: 1; + u16 nvram_offset; + u16 nvram_size; + u8 offset; + u8 century_reg; + u8 century_enable_bit; + u8 century_bit; + u8 bbsqi_bit; + irq_handler_t irq_handler; + const struct rtc_class_ops *rtc_ops; + u16 trickle_charger_reg; + u8 (*do_trickle_setup)(struct ds1307 *, u32, bool); + bool requires_trickle_resistor; + bool charge_default; +}; + +enum { + DS3231_CLK_SQW = 0, + DS3231_CLK_32KHZ = 1, +}; + +struct imxdi_dev { + struct platform_device *pdev; + struct rtc_device *rtc; + void *ioaddr; + struct clk *clk; + u32 dsr; + spinlock_t irq_lock; + wait_queue_head_t write_wait; + struct mutex write_mutex; + struct work_struct work; +}; + +enum max77686_rtc_reg { + MAX77686_RTC_INT = 0, + MAX77686_RTC_INTM = 1, + MAX77686_RTC_CONTROLM = 2, + MAX77686_RTC_CONTROL = 3, + MAX77686_RTC_UPDATE0 = 4, + MAX77686_WTSR_SMPL_CNTL = 6, + MAX77686_RTC_SEC = 7, + MAX77686_RTC_MIN = 8, + MAX77686_RTC_HOUR = 9, + MAX77686_RTC_WEEKDAY = 10, + MAX77686_RTC_MONTH = 11, + MAX77686_RTC_YEAR = 12, + MAX77686_RTC_MONTHDAY = 13, + MAX77686_ALARM1_SEC = 14, + MAX77686_ALARM1_MIN = 15, + MAX77686_ALARM1_HOUR = 16, + MAX77686_ALARM1_WEEKDAY = 17, + MAX77686_ALARM1_MONTH = 18, + MAX77686_ALARM1_YEAR = 19, + MAX77686_ALARM1_DATE = 20, + MAX77686_ALARM2_SEC = 21, + MAX77686_ALARM2_MIN = 22, + MAX77686_ALARM2_HOUR = 23, + MAX77686_ALARM2_WEEKDAY = 24, + MAX77686_ALARM2_MONTH = 25, + MAX77686_ALARM2_YEAR = 26, + MAX77686_ALARM2_DATE = 27, +}; + +enum max77686_irq { + MAX77686_PMICIRQ_PWRONF = 0, + MAX77686_PMICIRQ_PWRONR = 1, + MAX77686_PMICIRQ_JIGONBF = 2, + MAX77686_PMICIRQ_JIGONBR = 3, + MAX77686_PMICIRQ_ACOKBF = 4, + MAX77686_PMICIRQ_ACOKBR = 5, + MAX77686_PMICIRQ_ONKEY1S = 6, + MAX77686_PMICIRQ_MRSTB = 7, + MAX77686_PMICIRQ_140C = 8, + MAX77686_PMICIRQ_120C = 9, + MAX77686_RTCIRQ_RTC60S = 0, + MAX77686_RTCIRQ_RTCA1 = 1, + MAX77686_RTCIRQ_RTCA2 = 2, + MAX77686_RTCIRQ_SMPL = 3, + MAX77686_RTCIRQ_RTC1S = 4, + MAX77686_RTCIRQ_WTSR = 5, +}; + +enum { + RTC_SEC = 0, + RTC_MIN = 1, + RTC_HOUR = 2, + RTC_WEEKDAY = 3, + RTC_MONTH = 4, + RTC_YEAR = 5, + RTC_MONTHDAY = 6, + RTC_NR_TIME = 7, +}; + +struct max77686_rtc_driver_data { + long unsigned int delay; + u8 mask; + const unsigned int *map; + bool alarm_enable_reg; + int rtc_i2c_addr; + bool rtc_irq_from_platform; + int alarm_pending_status_reg; + const struct regmap_irq_chip *rtc_irq_chip; + const struct regmap_config *regmap_config; +}; + +struct max77686_rtc_info { + struct device *dev; + struct i2c_client *rtc; + struct rtc_device *rtc_dev; + struct mutex lock; + struct regmap *regmap; + struct regmap *rtc_regmap; + const struct max77686_rtc_driver_data *drv_data; + struct regmap_irq_chip_data *rtc_irq_data; + int rtc_irq; + int virq; +}; + +enum MAX77686_RTC_OP { + MAX77686_RTC_WRITE = 0, + MAX77686_RTC_READ = 1, +}; + +enum max77686_rtc_reg_offset { + REG_RTC_CONTROLM = 0, + REG_RTC_CONTROL = 1, + REG_RTC_UPDATE0 = 2, + REG_WTSR_SMPL_CNTL = 3, + REG_RTC_SEC = 4, + REG_RTC_MIN = 5, + REG_RTC_HOUR = 6, + REG_RTC_WEEKDAY = 7, + REG_RTC_MONTH = 8, + REG_RTC_YEAR = 9, + REG_RTC_MONTHDAY = 10, + REG_ALARM1_SEC = 11, + REG_ALARM1_MIN = 12, + REG_ALARM1_HOUR = 13, + REG_ALARM1_WEEKDAY = 14, + REG_ALARM1_MONTH = 15, + REG_ALARM1_YEAR = 16, + REG_ALARM1_DATE = 17, + REG_ALARM2_SEC = 18, + REG_ALARM2_MIN = 19, + REG_ALARM2_HOUR = 20, + REG_ALARM2_WEEKDAY = 21, + REG_ALARM2_MONTH = 22, + REG_ALARM2_YEAR = 23, + REG_ALARM2_DATE = 24, + REG_RTC_AE1 = 25, + REG_RTC_END = 26, +}; + +struct rtc_plat_data { + struct rtc_device *rtc; + void *ioaddr; + int irq; + struct clk *clk; +}; + +enum imx_rtc_type { + IMX1_RTC = 0, + IMX21_RTC = 1, +}; + +struct rtc_plat_data___2 { + struct rtc_device *rtc; + void *ioaddr; + int irq; + struct clk *clk_ref; + struct clk *clk_ipg; + struct rtc_time g_rtc_alarm; + enum imx_rtc_type devtype; +}; + +struct omap_rtc; + +struct omap_rtc_device_type { + bool has_32kclk_en; + bool has_irqwakeen; + bool has_pmic_mode; + bool has_power_up_reset; + void (*lock)(struct omap_rtc *); + void (*unlock)(struct omap_rtc *); +}; + +struct omap_rtc { + struct rtc_device *rtc; + void *base; + struct clk *clk; + int irq_alarm; + int irq_timer; + u8 interrupts_reg; + bool is_pmic_controller; + bool has_ext_clk; + bool is_suspending; + const struct omap_rtc_device_type *type; + struct pinctrl_dev *pctldev; +}; + +struct palmas_rtc { + struct rtc_device *rtc; + struct device *dev; + unsigned int irq; +}; + +struct pcf8523 { + struct rtc_device *rtc; + struct regmap *regmap; +}; + +struct pcf8563 { + struct rtc_device *rtc; + int c_polarity; + struct i2c_client *client; + struct clk_hw clkout_hw; +}; + +struct pl030_rtc { + struct rtc_device *rtc; + void *base; +}; + +struct pl031_vendor_data { + struct rtc_class_ops ops; + bool clockwatch; + bool st_weekday; + long unsigned int irqflags; + long: 32; + time64_t range_min; + timeu64_t range_max; +}; + +struct pl031_local { + struct pl031_vendor_data *vendor; + struct rtc_device *rtc; + void *base; +}; + +struct rk_rtc_compat_reg { + unsigned int ctrl_reg; + unsigned int status_reg; + unsigned int alarm_seconds_reg; + unsigned int int_reg; + unsigned int seconds_reg; +}; + +struct rk808_rtc { + struct regmap *regmap; + struct rtc_device *rtc; + struct rk_rtc_compat_reg *creg; + int irq; +}; + +enum s5m_rtc_reg { + S5M_RTC_SEC = 0, + S5M_RTC_MIN = 1, + S5M_RTC_HOUR = 2, + S5M_RTC_WEEKDAY = 3, + S5M_RTC_DATE = 4, + S5M_RTC_MONTH = 5, + S5M_RTC_YEAR1 = 6, + S5M_RTC_YEAR2 = 7, + S5M_ALARM0_SEC = 8, + S5M_ALARM0_MIN = 9, + S5M_ALARM0_HOUR = 10, + S5M_ALARM0_WEEKDAY = 11, + S5M_ALARM0_DATE = 12, + S5M_ALARM0_MONTH = 13, + S5M_ALARM0_YEAR1 = 14, + S5M_ALARM0_YEAR2 = 15, + S5M_ALARM1_SEC = 16, + S5M_ALARM1_MIN = 17, + S5M_ALARM1_HOUR = 18, + S5M_ALARM1_WEEKDAY = 19, + S5M_ALARM1_DATE = 20, + S5M_ALARM1_MONTH = 21, + S5M_ALARM1_YEAR1 = 22, + S5M_ALARM1_YEAR2 = 23, + S5M_ALARM0_CONF = 24, + S5M_ALARM1_CONF = 25, + S5M_RTC_STATUS = 26, + S5M_WTSR_SMPL_CNTL = 27, + S5M_RTC_UDR_CON = 28, + S5M_RTC_REG_MAX = 29, +}; + +enum s2mps_rtc_reg { + S2MPS_RTC_CTRL = 0, + S2MPS_WTSR_SMPL_CNTL = 1, + S2MPS_RTC_UDR_CON = 2, + S2MPS_RSVD = 3, + S2MPS_RTC_SEC = 4, + S2MPS_RTC_MIN = 5, + S2MPS_RTC_HOUR = 6, + S2MPS_RTC_WEEKDAY = 7, + S2MPS_RTC_DATE = 8, + S2MPS_RTC_MONTH = 9, + S2MPS_RTC_YEAR = 10, + S2MPS_ALARM0_SEC = 11, + S2MPS_ALARM0_MIN = 12, + S2MPS_ALARM0_HOUR = 13, + S2MPS_ALARM0_WEEKDAY = 14, + S2MPS_ALARM0_DATE = 15, + S2MPS_ALARM0_MONTH = 16, + S2MPS_ALARM0_YEAR = 17, + S2MPS_ALARM1_SEC = 18, + S2MPS_ALARM1_MIN = 19, + S2MPS_ALARM1_HOUR = 20, + S2MPS_ALARM1_WEEKDAY = 21, + S2MPS_ALARM1_DATE = 22, + S2MPS_ALARM1_MONTH = 23, + S2MPS_ALARM1_YEAR = 24, + S2MPS_OFFSRC = 25, + S2MPS_RTC_REG_MAX = 26, +}; + +enum { + RTC_SEC___2 = 0, + RTC_MIN___2 = 1, + RTC_HOUR___2 = 2, + RTC_WEEKDAY___2 = 3, + RTC_DATE = 4, + RTC_MONTH___2 = 5, + RTC_YEAR1 = 6, + RTC_YEAR2 = 7, + RTC_MAX_NUM_TIME_REGS = 8, +}; + +struct s5m_rtc_reg_config { + unsigned int regs_count; + unsigned int time; + unsigned int ctrl; + unsigned int alarm0; + unsigned int alarm1; + unsigned int udr_update; + unsigned int autoclear_udr_mask; + unsigned int read_time_udr_mask; + unsigned int write_time_udr_mask; + unsigned int write_alarm_udr_mask; +}; + +struct s5m_rtc_info { + struct device *dev; + struct i2c_client *i2c; + struct sec_pmic_dev *s5m87xx; + struct regmap *regmap; + struct rtc_device *rtc_dev; + int irq; + enum sec_device_type device_type; + int rtc_24hr_mode; + const struct s5m_rtc_reg_config *regs; +}; + +struct snvs_rtc_data { + struct rtc_device *rtc; + struct regmap *regmap; + int offset; + int irq; + struct clk *clk; +}; + +struct stm32_rtc_registers { + u16 tr; + u16 dr; + u16 cr; + u16 isr; + u16 prer; + u16 alrmar; + u16 wpr; + u16 sr; + u16 scr; + u16 verr; +}; + +struct stm32_rtc_events { + u32 alra; +}; + +struct stm32_rtc; + +struct stm32_rtc_data { + const struct stm32_rtc_registers regs; + const struct stm32_rtc_events events; + void (*clear_events)(struct stm32_rtc *, unsigned int); + bool has_pclk; + bool need_dbp; + bool has_wakeirq; +}; + +struct stm32_rtc { + struct rtc_device *rtc_dev; + void *base; + struct regmap *dbp; + unsigned int dbp_reg; + unsigned int dbp_mask; + struct clk *pclk; + struct clk *rtc_ck; + const struct stm32_rtc_data *data; + int irq_alarm; + int wakeirq_alarm; +}; + +struct sun6i_rtc_clk_data { + long unsigned int rc_osc_rate; + unsigned int fixed_prescaler: 16; + unsigned int has_prescaler: 1; + unsigned int has_out_clk: 1; + unsigned int export_iosc: 1; + unsigned int has_losc_en: 1; + unsigned int has_auto_swt: 1; +}; + +struct sun6i_rtc_dev { + struct rtc_device *rtc; + const struct sun6i_rtc_clk_data *data; + void *base; + int irq; + time64_t alarm; + long unsigned int flags; + struct clk_hw hw; + struct clk_hw *int_osc; + struct clk *losc; + struct clk *ext_losc; + spinlock_t lock; +}; + +struct sunxi_rtc_data_year { + unsigned int min; + unsigned int max; + unsigned int mask; + unsigned char leap_shift; +}; + +struct sunxi_rtc_dev { + struct rtc_device *rtc; + struct device *dev; + const struct sunxi_rtc_data_year *data_year; + void *base; + int irq; +}; + +struct tegra_rtc_info { + struct platform_device *pdev; + struct rtc_device *rtc; + void *base; + struct clk *clk; + int irq; + spinlock_t lock; +}; + +enum twl_class { + TWL_4030 = 0, + TWL_6030 = 1, +}; + +enum { + REG_SECONDS_REG = 0, + REG_MINUTES_REG = 1, + REG_HOURS_REG = 2, + REG_DAYS_REG = 3, + REG_MONTHS_REG = 4, + REG_YEARS_REG = 5, + REG_WEEKS_REG = 6, + REG_ALARM_SECONDS_REG = 7, + REG_ALARM_MINUTES_REG = 8, + REG_ALARM_HOURS_REG = 9, + REG_ALARM_DAYS_REG = 10, + REG_ALARM_MONTHS_REG = 11, + REG_ALARM_YEARS_REG = 12, + REG_RTC_CTRL_REG = 13, + REG_RTC_STATUS_REG = 14, + REG_RTC_INTERRUPTS_REG = 15, + REG_RTC_COMP_LSB_REG = 16, + REG_RTC_COMP_MSB_REG = 17, +}; + +struct twl_rtc { + struct device *dev; + struct rtc_device *rtc; + u8 *reg_map; + unsigned char rtc_irq_bits; + bool wake_enabled; + unsigned char irqstat; + enum twl_class class; +}; + +struct vt8500_rtc { + void *regbase; + int irq_alarm; + struct rtc_device *rtc; + spinlock_t lock; +}; + +struct i2c_devinfo { + struct list_head list; + int busnum; + struct i2c_board_info board_info; +}; + +struct i2c_device_identity { + u16 manufacturer_id; + u16 part_id; + u8 die_revision; +}; + +struct i2c_timings { + u32 bus_freq_hz; + u32 scl_rise_ns; + u32 scl_fall_ns; + u32 scl_int_delay_ns; + u32 sda_fall_ns; + u32 sda_hold_ns; + u32 digital_filter_width_ns; + u32 analog_filter_cutoff_freq_hz; +}; + +struct trace_event_raw_i2c_write { + struct trace_entry ent; + int adapter_nr; + __u16 msg_nr; + __u16 addr; + __u16 flags; + __u16 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_i2c_read { + struct trace_entry ent; + int adapter_nr; + __u16 msg_nr; + __u16 addr; + __u16 flags; + __u16 len; + char __data[0]; +}; + +struct trace_event_raw_i2c_reply { + struct trace_entry ent; + int adapter_nr; + __u16 msg_nr; + __u16 addr; + __u16 flags; + __u16 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_i2c_result { + struct trace_entry ent; + int adapter_nr; + __u16 nr_msgs; + __s16 ret; + char __data[0]; +}; + +struct trace_event_data_offsets_i2c_write { + u32 buf; +}; + +struct trace_event_data_offsets_i2c_read {}; + +struct trace_event_data_offsets_i2c_reply { + u32 buf; +}; + +struct trace_event_data_offsets_i2c_result {}; + +typedef void (*btf_trace_i2c_write)(void *, const struct i2c_adapter *, const struct i2c_msg *, int); + +typedef void (*btf_trace_i2c_read)(void *, const struct i2c_adapter *, const struct i2c_msg *, int); + +typedef void (*btf_trace_i2c_reply)(void *, const struct i2c_adapter *, const struct i2c_msg *, int); + +typedef void (*btf_trace_i2c_result)(void *, const struct i2c_adapter *, int, int); + +struct class_compat; + +struct i2c_cmd_arg { + unsigned int cmd; + void *arg; +}; + +struct i2c_smbus_alert_setup { + int irq; +}; + +struct trace_event_raw_smbus_write { + struct trace_entry ent; + int adapter_nr; + __u16 addr; + __u16 flags; + __u8 command; + __u8 len; + __u32 protocol; + __u8 buf[34]; + char __data[0]; +}; + +struct trace_event_raw_smbus_read { + struct trace_entry ent; + int adapter_nr; + __u16 flags; + __u16 addr; + __u8 command; + __u32 protocol; + __u8 buf[34]; + char __data[0]; +}; + +struct trace_event_raw_smbus_reply { + struct trace_entry ent; + int adapter_nr; + __u16 addr; + __u16 flags; + __u8 command; + __u8 len; + __u32 protocol; + __u8 buf[34]; + char __data[0]; +}; + +struct trace_event_raw_smbus_result { + struct trace_entry ent; + int adapter_nr; + __u16 addr; + __u16 flags; + __u8 read_write; + __u8 command; + __s16 res; + __u32 protocol; + char __data[0]; +}; + +struct trace_event_data_offsets_smbus_write {}; + +struct trace_event_data_offsets_smbus_read {}; + +struct trace_event_data_offsets_smbus_reply {}; + +struct trace_event_data_offsets_smbus_result {}; + +typedef void (*btf_trace_smbus_write)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int, const union i2c_smbus_data *); + +typedef void (*btf_trace_smbus_read)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int); + +typedef void (*btf_trace_smbus_reply)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int, const union i2c_smbus_data *, int); + +typedef void (*btf_trace_smbus_result)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int, int); + +struct trace_event_raw_i2c_slave { + struct trace_entry ent; + int adapter_nr; + int ret; + __u16 addr; + __u16 len; + enum i2c_slave_event event; + __u8 buf[1]; + char __data[0]; +}; + +struct trace_event_data_offsets_i2c_slave {}; + +typedef void (*btf_trace_i2c_slave)(void *, const struct i2c_client *, enum i2c_slave_event, __u8 *, int); + +struct i2c_mux_core { + struct i2c_adapter *parent; + struct device *dev; + unsigned int mux_locked: 1; + unsigned int arbitrator: 1; + unsigned int gate: 1; + void *priv; + int (*select)(struct i2c_mux_core *, u32); + int (*deselect)(struct i2c_mux_core *, u32); + int num_adapters; + int max_adapters; + struct i2c_adapter *adapter[0]; +}; + +struct i2c_mux_priv { + struct i2c_adapter adap; + struct i2c_algorithm algo; + struct i2c_mux_core *muxc; + u32 chan_id; + long: 32; +}; + +struct i2c_algo_bit_data { + void *data; + void (*setsda)(void *, int); + void (*setscl)(void *, int); + int (*getsda)(void *); + int (*getscl)(void *); + int (*pre_xfer)(struct i2c_adapter *); + void (*post_xfer)(struct i2c_adapter *); + int udelay; + int timeout; + bool can_do_atomic; +}; + +struct i2c_gpio_platform_data { + int udelay; + int timeout; + unsigned int sda_is_open_drain: 1; + unsigned int scl_is_open_drain: 1; + unsigned int scl_is_output_only: 1; +}; + +struct i2c_gpio_private_data { + struct gpio_desc *sda; + struct gpio_desc *scl; + struct i2c_adapter adap; + struct i2c_algo_bit_data bit_data; + struct i2c_gpio_platform_data pdata; + long: 32; +}; + +struct omap_i2c_bus_platform_data { + u32 clkrate; + u32 rev; + u32 flags; + void (*set_mpu_wkup_lat)(struct device *, long int); +}; + +enum { + OMAP_I2C_REV_REG = 0, + OMAP_I2C_IE_REG = 1, + OMAP_I2C_STAT_REG = 2, + OMAP_I2C_IV_REG = 3, + OMAP_I2C_WE_REG = 4, + OMAP_I2C_SYSS_REG = 5, + OMAP_I2C_BUF_REG = 6, + OMAP_I2C_CNT_REG = 7, + OMAP_I2C_DATA_REG = 8, + OMAP_I2C_SYSC_REG = 9, + OMAP_I2C_CON_REG = 10, + OMAP_I2C_OA_REG = 11, + OMAP_I2C_SA_REG = 12, + OMAP_I2C_PSC_REG = 13, + OMAP_I2C_SCLL_REG = 14, + OMAP_I2C_SCLH_REG = 15, + OMAP_I2C_SYSTEST_REG = 16, + OMAP_I2C_BUFSTAT_REG = 17, + OMAP_I2C_IP_V2_REVNB_LO = 18, + OMAP_I2C_IP_V2_REVNB_HI = 19, + OMAP_I2C_IP_V2_IRQSTATUS_RAW = 20, + OMAP_I2C_IP_V2_IRQENABLE_SET = 21, + OMAP_I2C_IP_V2_IRQENABLE_CLR = 22, +}; + +struct omap_i2c_dev { + struct device *dev; + void *base; + int irq; + int reg_shift; + struct completion cmd_complete; + struct resource *ioarea; + u32 latency; + void (*set_mpu_wkup_lat)(struct device *, long int); + u32 speed; + u32 flags; + u16 scheme; + u16 cmd_err; + u8 *buf; + u8 *regs; + size_t buf_len; + long: 32; + struct i2c_adapter adapter; + u8 threshold; + u8 fifo_size; + u32 rev; + unsigned int b_hw: 1; + unsigned int bb_valid: 1; + unsigned int receiver: 1; + u16 iestate; + u16 pscstate; + u16 scllstate; + u16 sclhstate; + u16 syscstate; + u16 westate; + u16 errata; +}; + +struct s3c2410_platform_i2c { + int bus_num; + unsigned int flags; + unsigned int slave_addr; + long unsigned int frequency; + unsigned int sda_delay; + void (*cfg_gpio)(struct platform_device *); +}; + +enum s3c24xx_i2c_state { + STATE_IDLE = 0, + STATE_START = 1, + STATE_READ = 2, + STATE_WRITE = 3, + STATE_STOP = 4, +}; + +struct s3c24xx_i2c { + wait_queue_head_t wait; + kernel_ulong_t quirks; + struct i2c_msg *msg; + unsigned int msg_num; + unsigned int msg_idx; + unsigned int msg_ptr; + unsigned int tx_setup; + unsigned int irq; + enum s3c24xx_i2c_state state; + long unsigned int clkrate; + void *regs; + struct clk *clk; + struct device *dev; + long: 32; + struct i2c_adapter adap; + struct s3c2410_platform_i2c *pdata; + struct gpio_desc *gpios[2]; + struct pinctrl *pctrl; + struct regmap *sysreg; + unsigned int sys_i2c_cfg; +}; + +typedef u32 acpi_size; + +typedef u64 acpi_io_address; + +typedef u32 acpi_status; + +typedef char *acpi_string; + +typedef u32 acpi_object_type; + +union acpi_object { + acpi_object_type type; + struct { + acpi_object_type type; + long: 32; + u64 value; + } integer; + struct { + acpi_object_type type; + u32 length; + char *pointer; + } string; + struct { + acpi_object_type type; + u32 length; + u8 *pointer; + } buffer; + struct { + acpi_object_type type; + u32 count; + union acpi_object *elements; + } package; + struct { + acpi_object_type type; + acpi_object_type actual_type; + acpi_handle handle; + } reference; + struct { + acpi_object_type type; + u32 proc_id; + acpi_io_address pblk_address; + u32 pblk_length; + long: 32; + } processor; + struct { + acpi_object_type type; + u32 system_level; + u32 resource_order; + } power_resource; +}; + +struct acpi_object_list { + u32 count; + union acpi_object *pointer; +}; + +struct acpi_buffer { + acpi_size length; + void *pointer; +}; + +enum msg_end_type { + MSG_END_STOP = 0, + MSG_END_REPEAT_START = 1, + MSG_END_CONTINUE = 2, +}; + +struct tegra_i2c_hw_feature { + bool has_continue_xfer_support; + bool has_per_pkt_xfer_complete_irq; + bool has_config_load_reg; + u32 clk_divisor_hs_mode; + u32 clk_divisor_std_mode; + u32 clk_divisor_fast_mode; + u32 clk_divisor_fast_plus_mode; + bool has_multi_master_mode; + bool has_slcg_override_reg; + bool has_mst_fifo; + const struct i2c_adapter_quirks *quirks; + bool supports_bus_clear; + bool has_apb_dma; + u32 tlow_std_mode; + u32 thigh_std_mode; + u32 tlow_fast_fastplus_mode; + u32 thigh_fast_fastplus_mode; + u32 setup_hold_time_std_mode; + u32 setup_hold_time_fast_fast_plus_mode; + u32 setup_hold_time_hs_mode; + bool has_interface_timing_reg; +}; + +struct tegra_i2c_dev { + struct device *dev; + long: 32; + struct i2c_adapter adapter; + const struct tegra_i2c_hw_feature *hw; + struct reset_control *rst; + unsigned int cont_id; + unsigned int irq; + phys_addr_t base_phys; + void *base; + struct clk_bulk_data clocks[2]; + unsigned int nclocks; + struct clk *div_clk; + struct i2c_timings timings; + struct completion msg_complete; + size_t msg_buf_remaining; + int msg_err; + u8 *msg_buf; + struct completion dma_complete; + struct dma_chan *tx_dma_chan; + struct dma_chan *rx_dma_chan; + unsigned int dma_buf_size; + struct device *dma_dev; + dma_addr_t dma_phys; + void *dma_buf; + bool multimaster_mode; + bool atomic_mode; + bool dma_mode; + bool msg_read; + bool is_dvc; + bool is_vi; + long: 32; +}; + +struct bsc_regs { + u32 chip_address; + u32 data_in[8]; + u32 cnt_reg; + u32 ctl_reg; + u32 iic_enable; + u32 data_out[8]; + u32 ctlhi_reg; + u32 scl_param; +}; + +struct bsc_clk_param { + u32 hz; + u32 scl_mask; + u32 div_mask; +}; + +enum bsc_xfer_cmd { + CMD_WR = 0, + CMD_RD = 1, + CMD_WR_NOACK = 2, + CMD_RD_NOACK = 3, +}; + +enum bus_speeds { + SPD_375K = 0, + SPD_390K = 1, + SPD_187K = 2, + SPD_200K = 3, + SPD_93K = 4, + SPD_97K = 5, + SPD_46K = 6, + SPD_50K = 7, +}; + +struct brcmstb_i2c_dev { + struct device *device; + void *base; + int irq; + struct bsc_regs *bsc_regmap; + struct i2c_adapter adapter; + struct completion done; + u32 clk_freq_hz; + int data_regsz; +}; + +enum fe_caps { + FE_IS_STUPID = 0, + FE_CAN_INVERSION_AUTO = 1, + FE_CAN_FEC_1_2 = 2, + FE_CAN_FEC_2_3 = 4, + FE_CAN_FEC_3_4 = 8, + FE_CAN_FEC_4_5 = 16, + FE_CAN_FEC_5_6 = 32, + FE_CAN_FEC_6_7 = 64, + FE_CAN_FEC_7_8 = 128, + FE_CAN_FEC_8_9 = 256, + FE_CAN_FEC_AUTO = 512, + FE_CAN_QPSK = 1024, + FE_CAN_QAM_16 = 2048, + FE_CAN_QAM_32 = 4096, + FE_CAN_QAM_64 = 8192, + FE_CAN_QAM_128 = 16384, + FE_CAN_QAM_256 = 32768, + FE_CAN_QAM_AUTO = 65536, + FE_CAN_TRANSMISSION_MODE_AUTO = 131072, + FE_CAN_BANDWIDTH_AUTO = 262144, + FE_CAN_GUARD_INTERVAL_AUTO = 524288, + FE_CAN_HIERARCHY_AUTO = 1048576, + FE_CAN_8VSB = 2097152, + FE_CAN_16VSB = 4194304, + FE_HAS_EXTENDED_CAPS = 8388608, + FE_CAN_MULTISTREAM = 67108864, + FE_CAN_TURBO_FEC = 134217728, + FE_CAN_2G_MODULATION = 268435456, + FE_NEEDS_BENDING = 536870912, + FE_CAN_RECOVER = 1073741824, + FE_CAN_MUTE_TS = 2147483648, +}; + +struct dvb_diseqc_master_cmd { + __u8 msg[6]; + __u8 msg_len; +}; + +struct dvb_diseqc_slave_reply { + __u8 msg[4]; + __u8 msg_len; + int timeout; +}; + +enum fe_sec_voltage { + SEC_VOLTAGE_13 = 0, + SEC_VOLTAGE_18 = 1, + SEC_VOLTAGE_OFF = 2, +}; + +enum fe_sec_tone_mode { + SEC_TONE_ON = 0, + SEC_TONE_OFF = 1, +}; + +enum fe_sec_mini_cmd { + SEC_MINI_A = 0, + SEC_MINI_B = 1, +}; + +enum fe_status { + FE_NONE = 0, + FE_HAS_SIGNAL = 1, + FE_HAS_CARRIER = 2, + FE_HAS_VITERBI = 4, + FE_HAS_SYNC = 8, + FE_HAS_LOCK = 16, + FE_TIMEDOUT = 32, + FE_REINIT = 64, +}; + +enum fe_spectral_inversion { + INVERSION_OFF = 0, + INVERSION_ON = 1, + INVERSION_AUTO = 2, +}; + +enum fe_code_rate { + FEC_NONE = 0, + FEC_1_2 = 1, + FEC_2_3 = 2, + FEC_3_4 = 3, + FEC_4_5 = 4, + FEC_5_6 = 5, + FEC_6_7 = 6, + FEC_7_8 = 7, + FEC_8_9 = 8, + FEC_AUTO = 9, + FEC_3_5 = 10, + FEC_9_10 = 11, + FEC_2_5 = 12, + FEC_1_3 = 13, + FEC_1_4 = 14, + FEC_5_9 = 15, + FEC_7_9 = 16, + FEC_8_15 = 17, + FEC_11_15 = 18, + FEC_13_18 = 19, + FEC_9_20 = 20, + FEC_11_20 = 21, + FEC_23_36 = 22, + FEC_25_36 = 23, + FEC_13_45 = 24, + FEC_26_45 = 25, + FEC_28_45 = 26, + FEC_32_45 = 27, + FEC_77_90 = 28, +}; + +enum fe_modulation { + QPSK = 0, + QAM_16 = 1, + QAM_32 = 2, + QAM_64 = 3, + QAM_128 = 4, + QAM_256 = 5, + QAM_AUTO = 6, + VSB_8 = 7, + VSB_16 = 8, + PSK_8 = 9, + APSK_16 = 10, + APSK_32 = 11, + DQPSK = 12, + QAM_4_NR = 13, + QAM_1024 = 14, + QAM_4096 = 15, + APSK_8_L = 16, + APSK_16_L = 17, + APSK_32_L = 18, + APSK_64 = 19, + APSK_64_L = 20, +}; + +enum fe_transmit_mode { + TRANSMISSION_MODE_2K = 0, + TRANSMISSION_MODE_8K = 1, + TRANSMISSION_MODE_AUTO = 2, + TRANSMISSION_MODE_4K = 3, + TRANSMISSION_MODE_1K = 4, + TRANSMISSION_MODE_16K = 5, + TRANSMISSION_MODE_32K = 6, + TRANSMISSION_MODE_C1 = 7, + TRANSMISSION_MODE_C3780 = 8, +}; + +enum fe_guard_interval { + GUARD_INTERVAL_1_32 = 0, + GUARD_INTERVAL_1_16 = 1, + GUARD_INTERVAL_1_8 = 2, + GUARD_INTERVAL_1_4 = 3, + GUARD_INTERVAL_AUTO = 4, + GUARD_INTERVAL_1_128 = 5, + GUARD_INTERVAL_19_128 = 6, + GUARD_INTERVAL_19_256 = 7, + GUARD_INTERVAL_PN420 = 8, + GUARD_INTERVAL_PN595 = 9, + GUARD_INTERVAL_PN945 = 10, + GUARD_INTERVAL_1_64 = 11, +}; + +enum fe_hierarchy { + HIERARCHY_NONE = 0, + HIERARCHY_1 = 1, + HIERARCHY_2 = 2, + HIERARCHY_4 = 3, + HIERARCHY_AUTO = 4, +}; + +enum fe_interleaving { + INTERLEAVING_NONE = 0, + INTERLEAVING_AUTO = 1, + INTERLEAVING_240 = 2, + INTERLEAVING_720 = 3, +}; + +enum fe_pilot { + PILOT_ON = 0, + PILOT_OFF = 1, + PILOT_AUTO = 2, +}; + +enum fe_rolloff { + ROLLOFF_35 = 0, + ROLLOFF_20 = 1, + ROLLOFF_25 = 2, + ROLLOFF_AUTO = 3, + ROLLOFF_15 = 4, + ROLLOFF_10 = 5, + ROLLOFF_5 = 6, +}; + +enum fe_delivery_system { + SYS_UNDEFINED = 0, + SYS_DVBC_ANNEX_A = 1, + SYS_DVBC_ANNEX_B = 2, + SYS_DVBT = 3, + SYS_DSS = 4, + SYS_DVBS = 5, + SYS_DVBS2 = 6, + SYS_DVBH = 7, + SYS_ISDBT = 8, + SYS_ISDBS = 9, + SYS_ISDBC = 10, + SYS_ATSC = 11, + SYS_ATSCMH = 12, + SYS_DTMB = 13, + SYS_CMMB = 14, + SYS_DAB = 15, + SYS_DVBT2 = 16, + SYS_TURBO = 17, + SYS_DVBC_ANNEX_C = 18, + SYS_DVBC2 = 19, +}; + +struct dtv_stats { + __u8 scale; + union { + __u64 uvalue; + __s64 svalue; + }; +} __attribute__((packed)); + +struct dtv_fe_stats { + __u8 len; + struct dtv_stats stat[4]; +}; + +struct media_file_operations { + struct module *owner; + ssize_t (*read)(struct file *, char *, size_t, loff_t *); + ssize_t (*write)(struct file *, const char *, size_t, loff_t *); + __poll_t (*poll)(struct file *, struct poll_table_struct *); + long int (*ioctl)(struct file *, unsigned int, long unsigned int); + long int (*compat_ioctl)(struct file *, unsigned int, long unsigned int); + int (*open)(struct file *); + int (*release)(struct file *); +}; + +struct media_device; + +struct media_devnode { + struct media_device *media_dev; + const struct media_file_operations *fops; + struct device dev; + struct cdev cdev; + struct device *parent; + int minor; + long unsigned int flags; + void (*release)(struct media_devnode *); + long: 32; +}; + +struct media_entity_enum { + long unsigned int *bmap; + int idx_max; +}; + +struct media_entity; + +struct media_graph { + struct { + struct media_entity *entity; + struct list_head *link; + } stack[16]; + struct media_entity_enum ent_enum; + int top; +}; + +struct media_pipeline; + +struct media_device_ops; + +struct media_device { + struct device *dev; + struct media_devnode *devnode; + char model[32]; + char driver_name[32]; + char serial[40]; + char bus_info[32]; + u32 hw_revision; + long: 32; + u64 topology_version; + u32 id; + struct ida entity_internal_idx; + int entity_internal_idx_max; + struct list_head entities; + struct list_head interfaces; + struct list_head pads; + struct list_head links; + struct list_head entity_notify; + struct mutex graph_mutex; + struct media_graph pm_count_walk; + void *source_priv; + int (*enable_source)(struct media_entity *, struct media_pipeline *); + void (*disable_source)(struct media_entity *); + const struct media_device_ops *ops; + struct mutex req_queue_mutex; + atomic_t request_id; + long: 32; +}; + +struct media_gobj { + struct media_device *mdev; + u32 id; + struct list_head list; +}; + +enum media_entity_type { + MEDIA_ENTITY_TYPE_BASE = 0, + MEDIA_ENTITY_TYPE_VIDEO_DEVICE = 1, + MEDIA_ENTITY_TYPE_V4L2_SUBDEV = 2, +}; + +struct media_pad; + +struct media_entity_operations; + +struct media_entity { + struct media_gobj graph_obj; + const char *name; + enum media_entity_type obj_type; + u32 function; + long unsigned int flags; + u16 num_pads; + u16 num_links; + u16 num_backlinks; + int internal_idx; + struct media_pad *pads; + struct list_head links; + const struct media_entity_operations *ops; + int use_count; + union { + struct { + u32 major; + u32 minor; + } dev; + } info; +}; + +struct media_pipeline { + bool allocated; + struct media_device *mdev; + struct list_head pads; + int start_count; +}; + +enum media_pad_signal_type { + PAD_SIGNAL_DEFAULT = 0, + PAD_SIGNAL_ANALOG = 1, + PAD_SIGNAL_DV = 2, + PAD_SIGNAL_AUDIO = 3, +}; + +struct media_pad { + struct media_gobj graph_obj; + struct media_entity *entity; + u16 index; + enum media_pad_signal_type sig_type; + long unsigned int flags; + struct media_pipeline *pipe; +}; + +struct media_interface { + struct media_gobj graph_obj; + struct list_head links; + u32 type; + u32 flags; +}; + +struct media_link { + struct media_gobj graph_obj; + struct list_head list; + union { + struct media_gobj *gobj0; + struct media_pad *source; + struct media_interface *intf; + }; + union { + struct media_gobj *gobj1; + struct media_pad *sink; + struct media_entity *entity; + }; + struct media_link *reverse; + long unsigned int flags; + bool is_backlink; +}; + +struct media_entity_operations { + int (*get_fwnode_pad)(struct media_entity *, struct fwnode_endpoint *); + int (*link_setup)(struct media_entity *, const struct media_pad *, const struct media_pad *, u32); + int (*link_validate)(struct media_link *); + bool (*has_pad_interdep)(struct media_entity *, unsigned int, unsigned int); +}; + +struct media_intf_devnode { + struct media_interface intf; + u32 major; + u32 minor; +}; + +struct media_request; + +struct media_device_ops { + int (*link_notify)(struct media_link *, u32, unsigned int); + struct media_request * (*req_alloc)(struct media_device *); + void (*req_free)(struct media_request *); + int (*req_validate)(struct media_request *); + void (*req_queue)(struct media_request *); +}; + +enum dvb_device_type { + DVB_DEVICE_SEC = 0, + DVB_DEVICE_FRONTEND = 1, + DVB_DEVICE_DEMUX = 2, + DVB_DEVICE_DVR = 3, + DVB_DEVICE_CA = 4, + DVB_DEVICE_NET = 5, + DVB_DEVICE_VIDEO = 6, + DVB_DEVICE_AUDIO = 7, + DVB_DEVICE_OSD = 8, +}; + +struct dvb_device; + +struct dvb_adapter { + int num; + struct list_head list_head; + struct list_head device_list; + const char *name; + u8 proposed_mac[6]; + void *priv; + struct device *device; + struct module *module; + int mfe_shared; + struct dvb_device *mfe_dvbdev; + struct mutex mfe_lock; + struct mutex mdev_lock; + struct media_device *mdev; + struct media_entity *conn; + struct media_pad *conn_pads; +}; + +struct dvb_device { + struct list_head list_head; + struct kref ref; + const struct file_operations *fops; + struct dvb_adapter *adapter; + enum dvb_device_type type; + int minor; + u32 id; + int readers; + int writers; + int users; + wait_queue_head_t wait_queue; + int (*kernel_ioctl)(struct file *, unsigned int, void *); + const char *name; + struct media_intf_devnode *intf_devnode; + unsigned int tsout_num_entities; + struct media_entity *entity; + struct media_entity *tsout_entity; + struct media_pad *pads; + struct media_pad *tsout_pads; + void *priv; +}; + +struct dvb_frontend_tune_settings { + int min_delay_ms; + int step_size; + int max_drift; +}; + +struct dvb_tuner_info { + char name[128]; + u32 frequency_min_hz; + u32 frequency_max_hz; + u32 frequency_step_hz; + u32 bandwidth_min; + u32 bandwidth_max; + u32 bandwidth_step; +}; + +struct analog_parameters { + unsigned int frequency; + unsigned int mode; + unsigned int audmode; + long: 32; + u64 std; +}; + +enum dvbfe_algo { + DVBFE_ALGO_HW = 1, + DVBFE_ALGO_SW = 2, + DVBFE_ALGO_CUSTOM = 4, + DVBFE_ALGO_RECOVERY = 2147483648, +}; + +enum dvbfe_search { + DVBFE_ALGO_SEARCH_SUCCESS = 1, + DVBFE_ALGO_SEARCH_ASLEEP = 2, + DVBFE_ALGO_SEARCH_FAILED = 4, + DVBFE_ALGO_SEARCH_INVALID = 8, + DVBFE_ALGO_SEARCH_AGAIN = 16, + DVBFE_ALGO_SEARCH_ERROR = 2147483648, +}; + +struct dvb_frontend; + +struct dvb_tuner_ops { + struct dvb_tuner_info info; + void (*release)(struct dvb_frontend *); + int (*init)(struct dvb_frontend *); + int (*sleep)(struct dvb_frontend *); + int (*suspend)(struct dvb_frontend *); + int (*resume)(struct dvb_frontend *); + int (*set_params)(struct dvb_frontend *); + int (*set_analog_params)(struct dvb_frontend *, struct analog_parameters *); + int (*set_config)(struct dvb_frontend *, void *); + int (*get_frequency)(struct dvb_frontend *, u32 *); + int (*get_bandwidth)(struct dvb_frontend *, u32 *); + int (*get_if_frequency)(struct dvb_frontend *, u32 *); + int (*get_status)(struct dvb_frontend *, u32 *); + int (*get_rf_strength)(struct dvb_frontend *, u16 *); + int (*get_afc)(struct dvb_frontend *, s32 *); + int (*calc_regs)(struct dvb_frontend *, u8 *, int); + int (*set_frequency)(struct dvb_frontend *, u32); + int (*set_bandwidth)(struct dvb_frontend *, u32); +}; + +struct dvb_frontend_internal_info { + char name[128]; + u32 frequency_min_hz; + u32 frequency_max_hz; + u32 frequency_stepsize_hz; + u32 frequency_tolerance_hz; + u32 symbol_rate_min; + u32 symbol_rate_max; + u32 symbol_rate_tolerance; + enum fe_caps caps; +}; + +struct analog_demod_info { + char *name; +}; + +struct analog_demod_ops { + struct analog_demod_info info; + void (*set_params)(struct dvb_frontend *, struct analog_parameters *); + int (*has_signal)(struct dvb_frontend *, u16 *); + int (*get_afc)(struct dvb_frontend *, s32 *); + void (*tuner_status)(struct dvb_frontend *); + void (*standby)(struct dvb_frontend *); + void (*release)(struct dvb_frontend *); + int (*i2c_gate_ctrl)(struct dvb_frontend *, int); + int (*set_config)(struct dvb_frontend *, void *); +}; + +struct dtv_frontend_properties; + +struct dvb_frontend_ops { + struct dvb_frontend_internal_info info; + u8 delsys[8]; + void (*detach)(struct dvb_frontend *); + void (*release)(struct dvb_frontend *); + void (*release_sec)(struct dvb_frontend *); + int (*init)(struct dvb_frontend *); + int (*sleep)(struct dvb_frontend *); + int (*suspend)(struct dvb_frontend *); + int (*resume)(struct dvb_frontend *); + int (*write)(struct dvb_frontend *, const u8 *, int); + int (*tune)(struct dvb_frontend *, bool, unsigned int, unsigned int *, enum fe_status *); + enum dvbfe_algo (*get_frontend_algo)(struct dvb_frontend *); + int (*set_frontend)(struct dvb_frontend *); + int (*get_tune_settings)(struct dvb_frontend *, struct dvb_frontend_tune_settings *); + int (*get_frontend)(struct dvb_frontend *, struct dtv_frontend_properties *); + int (*read_status)(struct dvb_frontend *, enum fe_status *); + int (*read_ber)(struct dvb_frontend *, u32 *); + int (*read_signal_strength)(struct dvb_frontend *, u16 *); + int (*read_snr)(struct dvb_frontend *, u16 *); + int (*read_ucblocks)(struct dvb_frontend *, u32 *); + int (*diseqc_reset_overload)(struct dvb_frontend *); + int (*diseqc_send_master_cmd)(struct dvb_frontend *, struct dvb_diseqc_master_cmd *); + int (*diseqc_recv_slave_reply)(struct dvb_frontend *, struct dvb_diseqc_slave_reply *); + int (*diseqc_send_burst)(struct dvb_frontend *, enum fe_sec_mini_cmd); + int (*set_tone)(struct dvb_frontend *, enum fe_sec_tone_mode); + int (*set_voltage)(struct dvb_frontend *, enum fe_sec_voltage); + int (*enable_high_lnb_voltage)(struct dvb_frontend *, long int); + int (*dishnetwork_send_legacy_command)(struct dvb_frontend *, long unsigned int); + int (*i2c_gate_ctrl)(struct dvb_frontend *, int); + int (*ts_bus_ctrl)(struct dvb_frontend *, int); + int (*set_lna)(struct dvb_frontend *); + enum dvbfe_search (*search)(struct dvb_frontend *); + struct dvb_tuner_ops tuner_ops; + struct analog_demod_ops analog_ops; +}; + +struct dtv_frontend_properties { + u32 frequency; + enum fe_modulation modulation; + enum fe_sec_voltage voltage; + enum fe_sec_tone_mode sectone; + enum fe_spectral_inversion inversion; + enum fe_code_rate fec_inner; + enum fe_transmit_mode transmission_mode; + u32 bandwidth_hz; + enum fe_guard_interval guard_interval; + enum fe_hierarchy hierarchy; + u32 symbol_rate; + enum fe_code_rate code_rate_HP; + enum fe_code_rate code_rate_LP; + enum fe_pilot pilot; + enum fe_rolloff rolloff; + enum fe_delivery_system delivery_system; + enum fe_interleaving interleaving; + u8 isdbt_partial_reception; + u8 isdbt_sb_mode; + u8 isdbt_sb_subchannel; + u32 isdbt_sb_segment_idx; + u32 isdbt_sb_segment_count; + u8 isdbt_layer_enabled; + struct { + u8 segment_count; + enum fe_code_rate fec; + enum fe_modulation modulation; + u8 interleaving; + } layer[3]; + u32 stream_id; + u32 scrambling_sequence_index; + u8 atscmh_fic_ver; + u8 atscmh_parade_id; + u8 atscmh_nog; + u8 atscmh_tnog; + u8 atscmh_sgn; + u8 atscmh_prc; + u8 atscmh_rs_frame_mode; + u8 atscmh_rs_frame_ensemble; + u8 atscmh_rs_code_mode_pri; + u8 atscmh_rs_code_mode_sec; + u8 atscmh_sccc_block_mode; + u8 atscmh_sccc_code_mode_a; + u8 atscmh_sccc_code_mode_b; + u8 atscmh_sccc_code_mode_c; + u8 atscmh_sccc_code_mode_d; + u32 lna; + struct dtv_fe_stats strength; + struct dtv_fe_stats cnr; + struct dtv_fe_stats pre_bit_error; + struct dtv_fe_stats pre_bit_count; + struct dtv_fe_stats post_bit_error; + struct dtv_fe_stats post_bit_count; + struct dtv_fe_stats block_error; + struct dtv_fe_stats block_count; +}; + +struct dvb_frontend { + struct kref refcount; + struct dvb_frontend_ops ops; + struct dvb_adapter *dvb; + void *demodulator_priv; + void *tuner_priv; + void *frontend_priv; + void *sec_priv; + void *analog_demod_priv; + struct dtv_frontend_properties dtv_property_cache; + int (*callback)(void *, int, int, int); + int id; + unsigned int exit; +}; + +struct mc44s803_config { + u8 i2c_address; + u8 dig_out; +}; + +struct mc44s803_priv { + struct mc44s803_config *cfg; + struct i2c_adapter *i2c; + struct dvb_frontend *fe; + u32 frequency; +}; + +enum v4l2_preemphasis { + V4L2_PREEMPHASIS_DISABLED = 0, + V4L2_PREEMPHASIS_50_uS = 1, + V4L2_PREEMPHASIS_75_uS = 2, +}; + +enum v4l2_tuner_type { + V4L2_TUNER_RADIO = 1, + V4L2_TUNER_ANALOG_TV = 2, + V4L2_TUNER_DIGITAL_TV = 3, + V4L2_TUNER_SDR = 4, + V4L2_TUNER_RF = 5, +}; + +typedef __u64 v4l2_std_id; + +struct tuner_i2c_props { + u8 addr; + struct i2c_adapter *adap; + int count; + char *name; +}; + +struct microtune_priv { + struct tuner_i2c_props i2c_props; + unsigned int xogc; + u32 frequency; +}; + +struct v4l2_priv_tun_config { + int tuner; + void *priv; +}; + +enum param_type { + TUNER_PARAM_TYPE_RADIO = 0, + TUNER_PARAM_TYPE_PAL = 1, + TUNER_PARAM_TYPE_SECAM = 2, + TUNER_PARAM_TYPE_NTSC = 3, + TUNER_PARAM_TYPE_DIGITAL = 4, +}; + +struct tuner_range { + short unsigned int limit; + unsigned char config; + unsigned char cb; +}; + +struct tuner_params { + enum param_type type; + unsigned int cb_first_if_lower_freq: 1; + unsigned int has_tda9887: 1; + unsigned int port1_fm_high_sensitivity: 1; + unsigned int port2_fm_high_sensitivity: 1; + unsigned int fm_gain_normal: 1; + unsigned int intercarrier_mode: 1; + unsigned int port1_active: 1; + unsigned int port2_active: 1; + unsigned int port1_invert_for_secam_lc: 1; + unsigned int port2_invert_for_secam_lc: 1; + unsigned int port1_set_for_fm_mono: 1; + unsigned int default_pll_gating_18: 1; + unsigned int radio_if: 2; + int default_top_low: 5; + int default_top_mid: 5; + int default_top_high: 5; + long: 3; + int default_top_secam_low: 5; + int default_top_secam_mid: 5; + int default_top_secam_high: 5; + u16 iffreq; + unsigned int count; + struct tuner_range *ranges; +}; + +struct tunertype { + char *name; + unsigned int count; + struct tuner_params *params; + u16 min; + u16 max; + u32 stepsize; + u8 *initdata; + u8 *sleepdata; +}; + +struct tuner_simple_priv { + unsigned int nr; + u16 last_div; + struct tuner_i2c_props i2c_props; + struct list_head hybrid_tuner_instance_list; + unsigned int type; + struct tunertype *tun; + u32 frequency; + u32 bandwidth; + bool radio_mode; +}; + +struct tda18271_std_map_item { + u16 if_freq; + unsigned int agc_mode: 2; + unsigned int std: 3; + unsigned int fm_rfn: 1; + unsigned int if_lvl: 3; + unsigned int rfagc_top: 7; +}; + +struct tda18271_std_map { + struct tda18271_std_map_item fm_radio; + struct tda18271_std_map_item atv_b; + struct tda18271_std_map_item atv_dk; + struct tda18271_std_map_item atv_gh; + struct tda18271_std_map_item atv_i; + struct tda18271_std_map_item atv_l; + struct tda18271_std_map_item atv_lc; + struct tda18271_std_map_item atv_mn; + struct tda18271_std_map_item atsc_6; + struct tda18271_std_map_item dvbt_6; + struct tda18271_std_map_item dvbt_7; + struct tda18271_std_map_item dvbt_8; + struct tda18271_std_map_item qam_6; + struct tda18271_std_map_item qam_7; + struct tda18271_std_map_item qam_8; +}; + +enum tda18271_role { + TDA18271_MASTER = 0, + TDA18271_SLAVE = 1, +}; + +enum tda18271_i2c_gate { + TDA18271_GATE_AUTO = 0, + TDA18271_GATE_ANALOG = 1, + TDA18271_GATE_DIGITAL = 2, +}; + +enum tda18271_output_options { + TDA18271_OUTPUT_LT_XT_ON = 0, + TDA18271_OUTPUT_LT_OFF = 1, + TDA18271_OUTPUT_XT_OFF = 2, +}; + +enum tda18271_small_i2c { + TDA18271_39_BYTE_CHUNK_INIT = 0, + TDA18271_16_BYTE_CHUNK_INIT = 16, + TDA18271_08_BYTE_CHUNK_INIT = 8, + TDA18271_03_BYTE_CHUNK_INIT = 3, +}; + +enum tda18271_mode { + TDA18271_ANALOG = 0, + TDA18271_DIGITAL = 1, +}; + +struct tda18271_rf_tracking_filter_cal { + u32 rfmax; + u8 rfband; + u32 rf1_def; + u32 rf2_def; + u32 rf3_def; + u32 rf1; + u32 rf2; + u32 rf3; + s32 rf_a1; + s32 rf_b1; + s32 rf_a2; + s32 rf_b2; +}; + +enum tda18271_ver { + TDA18271HDC1 = 0, + TDA18271HDC2 = 1, +}; + +struct tda18271_map_layout; + +struct tda18271_priv { + unsigned char tda18271_regs[39]; + struct list_head hybrid_tuner_instance_list; + struct tuner_i2c_props i2c_props; + enum tda18271_mode mode; + enum tda18271_role role; + enum tda18271_i2c_gate gate; + enum tda18271_ver id; + enum tda18271_output_options output_opt; + enum tda18271_small_i2c small_i2c; + unsigned int config; + unsigned int cal_initialized: 1; + u8 tm_rfcal; + struct tda18271_map_layout *maps; + struct tda18271_std_map std; + struct tda18271_rf_tracking_filter_cal rf_cal_state[8]; + struct mutex lock; + u16 if_freq; + u32 frequency; + u32 bandwidth; +}; + +struct tda18271_pll_map; + +struct tda18271_map; + +struct tda18271_map_layout { + struct tda18271_pll_map *main_pll; + struct tda18271_pll_map *cal_pll; + struct tda18271_map *rf_cal; + struct tda18271_map *rf_cal_kmco; + struct tda18271_map *rf_cal_dc_over_dt; + struct tda18271_map *bp_filter; + struct tda18271_map *rf_band; + struct tda18271_map *gain_taper; + struct tda18271_map *ir_measure; +}; + +enum tda18271_map_type { + MAIN_PLL = 0, + CAL_PLL = 1, + RF_CAL = 2, + RF_CAL_KMCO = 3, + RF_CAL_DC_OVER_DT = 4, + BP_FILTER = 5, + RF_BAND = 6, + GAIN_TAPER = 7, + IR_MEASURE = 8, +}; + +struct tda18271_pll_map { + u32 lomax; + u8 pd; + u8 d; +}; + +struct tda18271_map { + u32 rfmax; + u8 val; +}; + +struct tda18271_thermo_map { + u8 d; + u8 r0; + u8 r1; +}; + +struct tda18271_cid_target_map { + u32 rfmax; + u8 target; + u16 limit; +}; + +enum tda18271_pll { + TDA18271_MAIN_PLL = 0, + TDA18271_CAL_PLL = 1, +}; + +struct tda18271_config { + struct tda18271_std_map *std_map; + enum tda18271_role role; + enum tda18271_i2c_gate gate; + enum tda18271_output_options output_opt; + enum tda18271_small_i2c small_i2c; + unsigned int rf_cal_on_startup: 1; + unsigned int delay_cal: 1; + unsigned int config; +}; + +enum tda8290_lna { + TDA8290_LNA_OFF = 0, + TDA8290_LNA_GP0_HIGH_ON = 1, + TDA8290_LNA_GP0_HIGH_OFF = 2, + TDA8290_LNA_ON_BRIDGE = 3, +}; + +struct tda827x_config { + int (*init)(struct dvb_frontend *); + int (*sleep)(struct dvb_frontend *); + enum tda8290_lna config; + int switch_addr; + void (*agcf)(struct dvb_frontend *); +}; + +struct tda827x_priv { + int i2c_addr; + struct i2c_adapter *i2c_adap; + struct tda827x_config *cfg; + unsigned int sgIF; + unsigned char lpsel; + u32 frequency; + u32 bandwidth; +}; + +struct tda827x_data { + u32 lomax; + u8 spd; + u8 bs; + u8 bp; + u8 cp; + u8 gc3; + u8 div1p5; +}; + +struct tda827xa_data { + u32 lomax; + u8 svco; + u8 spd; + u8 scr; + u8 sbs; + u8 gc3; +}; + +struct tda829x_config { + enum tda8290_lna lna_cfg; + unsigned int probe_tuner: 1; + unsigned int no_i2c_gate: 1; + struct tda18271_std_map *tda18271_std_map; +}; + +struct tda8290_priv { + struct tuner_i2c_props i2c_props; + unsigned char tda8290_easy_mode; + unsigned char tda827x_addr; + unsigned char ver; + struct tda827x_config cfg; + struct tda18271_std_map *tda18271_std_map; +}; + +struct tda9887_priv { + struct tuner_i2c_props i2c_props; + struct list_head hybrid_tuner_instance_list; + unsigned char data[4]; + unsigned int config; + unsigned int mode; + unsigned int audmode; + v4l2_std_id std; + bool standby; + long: 32; +}; + +struct tvnorm { + v4l2_std_id std; + char *name; + unsigned char b; + unsigned char c; + unsigned char e; +}; + +struct tea5761_priv { + struct tuner_i2c_props i2c_props; + u32 frequency; + bool standby; +}; + +enum tea5767_xtal { + TEA5767_LOW_LO_32768 = 0, + TEA5767_HIGH_LO_32768 = 1, + TEA5767_LOW_LO_13MHz = 2, + TEA5767_HIGH_LO_13MHz = 3, +}; + +struct tea5767_ctrl { + unsigned int port1: 1; + unsigned int port2: 1; + unsigned int high_cut: 1; + unsigned int st_noise: 1; + unsigned int soft_mute: 1; + unsigned int japan_band: 1; + unsigned int deemph_75: 1; + unsigned int pllref: 1; + enum tea5767_xtal xtal_freq; +}; + +struct tea5767_priv { + struct tuner_i2c_props i2c_props; + u32 frequency; + struct tea5767_ctrl ctrl; +}; + +enum firmware_type { + XC2028_AUTO = 0, + XC2028_D2633 = 1, + XC2028_D2620 = 2, +}; + +struct xc2028_ctrl { + char *fname; + int max_len; + int msleep; + unsigned int scode_table; + unsigned int mts: 1; + unsigned int input1: 1; + unsigned int vhfbw7: 1; + unsigned int uhfbw8: 1; + unsigned int disable_power_mgmt: 1; + unsigned int read_not_reliable: 1; + unsigned int demod; + enum firmware_type type: 2; +}; + +struct xc2028_config { + struct i2c_adapter *i2c_adap; + u8 i2c_addr; + struct xc2028_ctrl *ctrl; +}; + +struct firmware_description { + unsigned int type; + long: 32; + v4l2_std_id id; + __u16 int_freq; + unsigned char *ptr; + unsigned int size; + long: 32; +}; + +struct firmware_properties { + unsigned int type; + long: 32; + v4l2_std_id id; + v4l2_std_id std_req; + __u16 int_freq; + unsigned int scode_table; + int scode_nr; + long: 32; +}; + +enum xc2028_state { + XC2028_NO_FIRMWARE = 0, + XC2028_WAITING_FIRMWARE = 1, + XC2028_ACTIVE = 2, + XC2028_SLEEP = 3, + XC2028_NODEV = 4, +}; + +struct xc2028_data { + struct list_head hybrid_tuner_instance_list; + struct tuner_i2c_props i2c_props; + __u32 frequency; + enum xc2028_state state; + const char *fname; + struct firmware_description *firm; + int firm_size; + __u16 firm_version; + __u16 hwmodel; + __u16 hwvers; + struct xc2028_ctrl ctrl; + struct firmware_properties cur_fw; + struct mutex lock; + long: 32; +}; + +struct xc4000_config { + u8 i2c_address; + u8 default_pm; + u8 dvb_amplitude; + u8 set_smoothedcvbs; + u32 if_khz; +}; + +struct xc4000_priv { + struct tuner_i2c_props i2c_props; + struct list_head hybrid_tuner_instance_list; + struct firmware_description *firm; + int firm_size; + u32 if_khz; + u32 freq_hz; + u32 freq_offset; + u32 bandwidth; + u8 video_standard; + u8 rf_mode; + u8 default_pm; + u8 dvb_amplitude; + u8 set_smoothedcvbs; + u8 ignore_i2c_write_errors; + __u16 firm_version; + struct firmware_properties cur_fw; + __u16 hwmodel; + __u16 hwvers; + struct mutex lock; +}; + +struct XC_TV_STANDARD { + const char *Name; + u16 audio_mode; + u16 video_mode; + u16 int_freq; +}; + +struct xc5000_config { + u8 i2c_address; + u32 if_khz; + u8 radio_input; + u16 xtal_khz; + u16 output_amp; + int chip_id; +}; + +struct xc5000_priv { + struct tuner_i2c_props i2c_props; + struct list_head hybrid_tuner_instance_list; + u32 if_khz; + u16 xtal_khz; + u32 freq_hz; + u32 freq_offset; + u32 bandwidth; + u8 video_standard; + unsigned int mode; + u8 rf_mode; + u8 radio_input; + u16 output_amp; + int chip_id; + u16 pll_register_no; + u8 init_status_supported; + u8 fw_checksum_supported; + struct dvb_frontend *fe; + struct delayed_work timer_sleep; + const struct firmware *firmware; +}; + +struct XC_TV_STANDARD___2 { + char *name; + u16 audio_mode; + u16 video_mode; +}; + +struct xc5000_fw_cfg { + char *name; + u16 size; + u16 pll_reg; + u8 init_status_supported; + u8 fw_checksum_supported; +}; + +struct media_device_info { + char driver[16]; + char model[32]; + char serial[40]; + char bus_info[32]; + __u32 media_version; + __u32 hw_revision; + __u32 driver_version; + __u32 reserved[31]; +}; + +struct media_entity_desc { + __u32 id; + char name[32]; + __u32 type; + __u32 revision; + __u32 flags; + __u32 group_id; + __u16 pads; + __u16 links; + __u32 reserved[4]; + union { + struct { + __u32 major; + __u32 minor; + } dev; + __u8 raw[184]; + }; +}; + +struct media_pad_desc { + __u32 entity; + __u16 index; + __u32 flags; + __u32 reserved[2]; +}; + +struct media_link_desc { + struct media_pad_desc source; + struct media_pad_desc sink; + __u32 flags; + __u32 reserved[2]; +}; + +struct media_links_enum { + __u32 entity; + struct media_pad_desc *pads; + struct media_link_desc *links; + __u32 reserved[4]; +}; + +struct media_v2_entity { + __u32 id; + char name[64]; + __u32 function; + __u32 flags; + __u32 reserved[5]; +}; + +struct media_v2_intf_devnode { + __u32 major; + __u32 minor; +}; + +struct media_v2_interface { + __u32 id; + __u32 intf_type; + __u32 flags; + __u32 reserved[9]; + union { + struct media_v2_intf_devnode devnode; + __u32 raw[16]; + }; +}; + +struct media_v2_pad { + __u32 id; + __u32 entity_id; + __u32 flags; + __u32 index; + __u32 reserved[4]; +}; + +struct media_v2_link { + __u32 id; + __u32 source_id; + __u32 sink_id; + __u32 flags; + __u32 reserved[6]; +}; + +struct media_v2_topology { + __u64 topology_version; + __u32 num_entities; + __u32 reserved1; + __u64 ptr_entities; + __u32 num_interfaces; + __u32 reserved2; + __u64 ptr_interfaces; + __u32 num_pads; + __u32 reserved3; + __u64 ptr_pads; + __u32 num_links; + __u32 reserved4; + __u64 ptr_links; +}; + +enum media_gobj_type { + MEDIA_GRAPH_ENTITY = 0, + MEDIA_GRAPH_PAD = 1, + MEDIA_GRAPH_LINK = 2, + MEDIA_GRAPH_INTF_DEVNODE = 3, +}; + +struct media_entity_notify { + struct list_head list; + void *notify_data; + void (*notify)(struct media_entity *, void *); +}; + +enum media_request_state { + MEDIA_REQUEST_STATE_IDLE = 0, + MEDIA_REQUEST_STATE_VALIDATING = 1, + MEDIA_REQUEST_STATE_QUEUED = 2, + MEDIA_REQUEST_STATE_COMPLETE = 3, + MEDIA_REQUEST_STATE_CLEANING = 4, + MEDIA_REQUEST_STATE_UPDATING = 5, + NR_OF_MEDIA_REQUEST_STATE = 6, +}; + +struct media_request { + struct media_device *mdev; + struct kref kref; + char debug_str[27]; + enum media_request_state state; + unsigned int updating_count; + unsigned int access_count; + struct list_head objects; + unsigned int num_incomplete_objects; + wait_queue_head_t poll_wait; + spinlock_t lock; +}; + +struct media_ioctl_info { + unsigned int cmd; + short unsigned int flags; + long int (*fn)(struct media_device *, void *); + long int (*arg_from_user)(void *, void *, unsigned int); + long int (*arg_to_user)(void *, void *, unsigned int); +}; + +struct media_pipeline_pad { + struct list_head list; + struct media_pipeline *pipe; + struct media_pad *pad; +}; + +struct media_pipeline_walk_entry { + struct media_pad *pad; + struct list_head *links; +}; + +struct media_pipeline_walk { + struct media_device *mdev; + struct { + unsigned int size; + int top; + struct media_pipeline_walk_entry *entries; + } stack; +}; + +struct media_request_object; + +struct media_request_object_ops { + int (*prepare)(struct media_request_object *); + void (*unprepare)(struct media_request_object *); + void (*queue)(struct media_request_object *); + void (*unbind)(struct media_request_object *); + void (*release)(struct media_request_object *); +}; + +struct media_request_object { + const struct media_request_object_ops *ops; + void *priv; + struct media_request *req; + struct list_head list; + struct kref kref; + bool completed; +}; + +struct media_device_instance { + struct media_device mdev; + struct module *owner; + struct list_head list; + struct kref refcount; +}; + +enum v4l2_colorspace { + V4L2_COLORSPACE_DEFAULT = 0, + V4L2_COLORSPACE_SMPTE170M = 1, + V4L2_COLORSPACE_SMPTE240M = 2, + V4L2_COLORSPACE_REC709 = 3, + V4L2_COLORSPACE_BT878 = 4, + V4L2_COLORSPACE_470_SYSTEM_M = 5, + V4L2_COLORSPACE_470_SYSTEM_BG = 6, + V4L2_COLORSPACE_JPEG = 7, + V4L2_COLORSPACE_SRGB = 8, + V4L2_COLORSPACE_OPRGB = 9, + V4L2_COLORSPACE_BT2020 = 10, + V4L2_COLORSPACE_RAW = 11, + V4L2_COLORSPACE_DCI_P3 = 12, + V4L2_COLORSPACE_LAST = 13, +}; + +enum v4l2_xfer_func { + V4L2_XFER_FUNC_DEFAULT = 0, + V4L2_XFER_FUNC_709 = 1, + V4L2_XFER_FUNC_SRGB = 2, + V4L2_XFER_FUNC_OPRGB = 3, + V4L2_XFER_FUNC_SMPTE240M = 4, + V4L2_XFER_FUNC_NONE = 5, + V4L2_XFER_FUNC_DCI_P3 = 6, + V4L2_XFER_FUNC_SMPTE2084 = 7, + V4L2_XFER_FUNC_LAST = 8, +}; + +enum v4l2_ycbcr_encoding { + V4L2_YCBCR_ENC_DEFAULT = 0, + V4L2_YCBCR_ENC_601 = 1, + V4L2_YCBCR_ENC_709 = 2, + V4L2_YCBCR_ENC_XV601 = 3, + V4L2_YCBCR_ENC_XV709 = 4, + V4L2_YCBCR_ENC_BT2020 = 6, + V4L2_YCBCR_ENC_BT2020_CONST_LUM = 7, + V4L2_YCBCR_ENC_SMPTE240M = 8, + V4L2_YCBCR_ENC_LAST = 9, +}; + +enum v4l2_quantization { + V4L2_QUANTIZATION_DEFAULT = 0, + V4L2_QUANTIZATION_FULL_RANGE = 1, + V4L2_QUANTIZATION_LIM_RANGE = 2, +}; + +struct v4l2_fract { + __u32 numerator; + __u32 denominator; +}; + +struct v4l2_bt_timings { + __u32 width; + __u32 height; + __u32 interlaced; + __u32 polarities; + __u64 pixelclock; + __u32 hfrontporch; + __u32 hsync; + __u32 hbackporch; + __u32 vfrontporch; + __u32 vsync; + __u32 vbackporch; + __u32 il_vfrontporch; + __u32 il_vsync; + __u32 il_vbackporch; + __u32 standards; + __u32 flags; + struct v4l2_fract picture_aspect; + __u8 cea861_vic; + __u8 hdmi_vic; + __u8 reserved[46]; +}; + +struct v4l2_dv_timings { + __u32 type; + union { + struct v4l2_bt_timings bt; + __u32 reserved[32]; + }; +}; + +struct v4l2_enum_dv_timings { + __u32 index; + __u32 pad; + __u32 reserved[2]; + struct v4l2_dv_timings timings; +}; + +struct v4l2_bt_timings_cap { + __u32 min_width; + __u32 max_width; + __u32 min_height; + __u32 max_height; + __u64 min_pixelclock; + __u64 max_pixelclock; + __u32 standards; + __u32 capabilities; + __u32 reserved[16]; +}; + +struct v4l2_dv_timings_cap { + __u32 type; + __u32 pad; + __u32 reserved[2]; + union { + struct v4l2_bt_timings_cap bt; + __u32 raw_data[32]; + }; +}; + +typedef bool v4l2_check_dv_timings_fnc(const struct v4l2_dv_timings *, void *); + +struct v4l2_hdmi_colorimetry { + enum v4l2_colorspace colorspace; + enum v4l2_ycbcr_encoding ycbcr_enc; + enum v4l2_quantization quantization; + enum v4l2_xfer_func xfer_func; +}; + +struct v4l2_edid { + __u32 pad; + __u32 start_block; + __u32 blocks; + __u32 reserved[5]; + __u8 *edid; +}; + +struct v4l2_ctrl_h264_sps { + __u8 profile_idc; + __u8 constraint_set_flags; + __u8 level_idc; + __u8 seq_parameter_set_id; + __u8 chroma_format_idc; + __u8 bit_depth_luma_minus8; + __u8 bit_depth_chroma_minus8; + __u8 log2_max_frame_num_minus4; + __u8 pic_order_cnt_type; + __u8 log2_max_pic_order_cnt_lsb_minus4; + __u8 max_num_ref_frames; + __u8 num_ref_frames_in_pic_order_cnt_cycle; + __s32 offset_for_ref_frame[255]; + __s32 offset_for_non_ref_pic; + __s32 offset_for_top_to_bottom_field; + __u16 pic_width_in_mbs_minus1; + __u16 pic_height_in_map_units_minus1; + __u32 flags; +}; + +struct v4l2_ctrl_h264_pps { + __u8 pic_parameter_set_id; + __u8 seq_parameter_set_id; + __u8 num_slice_groups_minus1; + __u8 num_ref_idx_l0_default_active_minus1; + __u8 num_ref_idx_l1_default_active_minus1; + __u8 weighted_bipred_idc; + __s8 pic_init_qp_minus26; + __s8 pic_init_qs_minus26; + __s8 chroma_qp_index_offset; + __s8 second_chroma_qp_index_offset; + __u16 flags; +}; + +struct v4l2_ctrl_h264_scaling_matrix { + __u8 scaling_list_4x4[96]; + __u8 scaling_list_8x8[384]; +}; + +struct v4l2_h264_weight_factors { + __s16 luma_weight[32]; + __s16 luma_offset[32]; + __s16 chroma_weight[64]; + __s16 chroma_offset[64]; +}; + +struct v4l2_ctrl_h264_pred_weights { + __u16 luma_log2_weight_denom; + __u16 chroma_log2_weight_denom; + struct v4l2_h264_weight_factors weight_factors[2]; +}; + +struct v4l2_h264_reference { + __u8 fields; + __u8 index; +}; + +struct v4l2_ctrl_h264_slice_params { + __u32 header_bit_size; + __u32 first_mb_in_slice; + __u8 slice_type; + __u8 colour_plane_id; + __u8 redundant_pic_cnt; + __u8 cabac_init_idc; + __s8 slice_qp_delta; + __s8 slice_qs_delta; + __u8 disable_deblocking_filter_idc; + __s8 slice_alpha_c0_offset_div2; + __s8 slice_beta_offset_div2; + __u8 num_ref_idx_l0_active_minus1; + __u8 num_ref_idx_l1_active_minus1; + __u8 reserved; + struct v4l2_h264_reference ref_pic_list0[32]; + struct v4l2_h264_reference ref_pic_list1[32]; + __u32 flags; +}; + +struct v4l2_h264_dpb_entry { + __u64 reference_ts; + __u32 pic_num; + __u16 frame_num; + __u8 fields; + __u8 reserved[5]; + __s32 top_field_order_cnt; + __s32 bottom_field_order_cnt; + __u32 flags; +}; + +struct v4l2_ctrl_h264_decode_params { + struct v4l2_h264_dpb_entry dpb[16]; + __u16 nal_ref_idc; + __u16 frame_num; + __s32 top_field_order_cnt; + __s32 bottom_field_order_cnt; + __u16 idr_pic_id; + __u16 pic_order_cnt_lsb; + __s32 delta_pic_order_cnt_bottom; + __s32 delta_pic_order_cnt0; + __s32 delta_pic_order_cnt1; + __u32 dec_ref_pic_marking_bit_size; + __u32 pic_order_cnt_bit_size; + __u32 slice_group_change_cycle; + __u32 reserved; + __u32 flags; +}; + +struct v4l2_ctrl_fwht_params { + __u64 backward_ref_ts; + __u32 version; + __u32 width; + __u32 height; + __u32 flags; + __u32 colorspace; + __u32 xfer_func; + __u32 ycbcr_enc; + __u32 quantization; +}; + +struct v4l2_vp8_segment { + __s8 quant_update[4]; + __s8 lf_update[4]; + __u8 segment_probs[3]; + __u8 padding; + __u32 flags; +}; + +struct v4l2_vp8_loop_filter { + __s8 ref_frm_delta[4]; + __s8 mb_mode_delta[4]; + __u8 sharpness_level; + __u8 level; + __u16 padding; + __u32 flags; +}; + +struct v4l2_vp8_quantization { + __u8 y_ac_qi; + __s8 y_dc_delta; + __s8 y2_dc_delta; + __s8 y2_ac_delta; + __s8 uv_dc_delta; + __s8 uv_ac_delta; + __u16 padding; +}; + +struct v4l2_vp8_entropy { + __u8 coeff_probs[1056]; + __u8 y_mode_probs[4]; + __u8 uv_mode_probs[3]; + __u8 mv_probs[38]; + __u8 padding[3]; +}; + +struct v4l2_vp8_entropy_coder_state { + __u8 range; + __u8 value; + __u8 bit_count; + __u8 padding; +}; + +struct v4l2_ctrl_vp8_frame { + struct v4l2_vp8_segment segment; + struct v4l2_vp8_loop_filter lf; + struct v4l2_vp8_quantization quant; + struct v4l2_vp8_entropy entropy; + struct v4l2_vp8_entropy_coder_state coder_state; + __u16 width; + __u16 height; + __u8 horizontal_scale; + __u8 vertical_scale; + __u8 version; + __u8 prob_skip_false; + __u8 prob_intra; + __u8 prob_last; + __u8 prob_gf; + __u8 num_dct_parts; + __u32 first_part_size; + __u32 first_part_header_bits; + __u32 dct_part_sizes[8]; + __u64 last_frame_ts; + __u64 golden_frame_ts; + __u64 alt_frame_ts; + __u64 flags; +}; + +struct v4l2_ctrl_mpeg2_sequence { + __u16 horizontal_size; + __u16 vertical_size; + __u32 vbv_buffer_size; + __u16 profile_and_level_indication; + __u8 chroma_format; + __u8 flags; +}; + +struct v4l2_ctrl_mpeg2_picture { + __u64 backward_ref_ts; + __u64 forward_ref_ts; + __u32 flags; + __u8 f_code[4]; + __u8 picture_coding_type; + __u8 picture_structure; + __u8 intra_dc_precision; + __u8 reserved[5]; +}; + +struct v4l2_ctrl_mpeg2_quantisation { + __u8 intra_quantiser_matrix[64]; + __u8 non_intra_quantiser_matrix[64]; + __u8 chroma_intra_quantiser_matrix[64]; + __u8 chroma_non_intra_quantiser_matrix[64]; +}; + +struct v4l2_ctrl_hevc_sps { + __u8 video_parameter_set_id; + __u8 seq_parameter_set_id; + __u16 pic_width_in_luma_samples; + __u16 pic_height_in_luma_samples; + __u8 bit_depth_luma_minus8; + __u8 bit_depth_chroma_minus8; + __u8 log2_max_pic_order_cnt_lsb_minus4; + __u8 sps_max_dec_pic_buffering_minus1; + __u8 sps_max_num_reorder_pics; + __u8 sps_max_latency_increase_plus1; + __u8 log2_min_luma_coding_block_size_minus3; + __u8 log2_diff_max_min_luma_coding_block_size; + __u8 log2_min_luma_transform_block_size_minus2; + __u8 log2_diff_max_min_luma_transform_block_size; + __u8 max_transform_hierarchy_depth_inter; + __u8 max_transform_hierarchy_depth_intra; + __u8 pcm_sample_bit_depth_luma_minus1; + __u8 pcm_sample_bit_depth_chroma_minus1; + __u8 log2_min_pcm_luma_coding_block_size_minus3; + __u8 log2_diff_max_min_pcm_luma_coding_block_size; + __u8 num_short_term_ref_pic_sets; + __u8 num_long_term_ref_pics_sps; + __u8 chroma_format_idc; + __u8 sps_max_sub_layers_minus1; + __u8 reserved[6]; + __u64 flags; +}; + +struct v4l2_ctrl_hevc_pps { + __u8 pic_parameter_set_id; + __u8 num_extra_slice_header_bits; + __u8 num_ref_idx_l0_default_active_minus1; + __u8 num_ref_idx_l1_default_active_minus1; + __s8 init_qp_minus26; + __u8 diff_cu_qp_delta_depth; + __s8 pps_cb_qp_offset; + __s8 pps_cr_qp_offset; + __u8 num_tile_columns_minus1; + __u8 num_tile_rows_minus1; + __u8 column_width_minus1[20]; + __u8 row_height_minus1[22]; + __s8 pps_beta_offset_div2; + __s8 pps_tc_offset_div2; + __u8 log2_parallel_merge_level_minus2; + __u8 reserved; + __u64 flags; +}; + +struct v4l2_hevc_dpb_entry { + __u64 timestamp; + __u8 flags; + __u8 field_pic; + __u16 reserved; + __s32 pic_order_cnt_val; +}; + +struct v4l2_hevc_pred_weight_table { + __s8 delta_luma_weight_l0[16]; + __s8 luma_offset_l0[16]; + __s8 delta_chroma_weight_l0[32]; + __s8 chroma_offset_l0[32]; + __s8 delta_luma_weight_l1[16]; + __s8 luma_offset_l1[16]; + __s8 delta_chroma_weight_l1[32]; + __s8 chroma_offset_l1[32]; + __u8 luma_log2_weight_denom; + __s8 delta_chroma_log2_weight_denom; +}; + +struct v4l2_ctrl_hevc_slice_params { + __u32 bit_size; + __u32 data_byte_offset; + __u32 num_entry_point_offsets; + __u8 nal_unit_type; + __u8 nuh_temporal_id_plus1; + __u8 slice_type; + __u8 colour_plane_id; + __s32 slice_pic_order_cnt; + __u8 num_ref_idx_l0_active_minus1; + __u8 num_ref_idx_l1_active_minus1; + __u8 collocated_ref_idx; + __u8 five_minus_max_num_merge_cand; + __s8 slice_qp_delta; + __s8 slice_cb_qp_offset; + __s8 slice_cr_qp_offset; + __s8 slice_act_y_qp_offset; + __s8 slice_act_cb_qp_offset; + __s8 slice_act_cr_qp_offset; + __s8 slice_beta_offset_div2; + __s8 slice_tc_offset_div2; + __u8 pic_struct; + __u8 reserved0[3]; + __u32 slice_segment_addr; + __u8 ref_idx_l0[16]; + __u8 ref_idx_l1[16]; + __u16 short_term_ref_pic_set_size; + __u16 long_term_ref_pic_set_size; + struct v4l2_hevc_pred_weight_table pred_weight_table; + __u8 reserved1[2]; + __u64 flags; +}; + +struct v4l2_ctrl_hevc_decode_params { + __s32 pic_order_cnt_val; + __u16 short_term_ref_pic_set_size; + __u16 long_term_ref_pic_set_size; + __u8 num_active_dpb_entries; + __u8 num_poc_st_curr_before; + __u8 num_poc_st_curr_after; + __u8 num_poc_lt_curr; + __u8 poc_st_curr_before[16]; + __u8 poc_st_curr_after[16]; + __u8 poc_lt_curr[16]; + __u8 reserved[4]; + struct v4l2_hevc_dpb_entry dpb[16]; + __u64 flags; +}; + +struct v4l2_ctrl_hevc_scaling_matrix { + __u8 scaling_list_4x4[96]; + __u8 scaling_list_8x8[384]; + __u8 scaling_list_16x16[384]; + __u8 scaling_list_32x32[128]; + __u8 scaling_list_dc_coef_16x16[6]; + __u8 scaling_list_dc_coef_32x32[2]; +}; + +struct v4l2_vp9_loop_filter { + __s8 ref_deltas[4]; + __s8 mode_deltas[2]; + __u8 level; + __u8 sharpness; + __u8 flags; + __u8 reserved[7]; +}; + +struct v4l2_vp9_quantization { + __u8 base_q_idx; + __s8 delta_q_y_dc; + __s8 delta_q_uv_dc; + __s8 delta_q_uv_ac; + __u8 reserved[4]; +}; + +struct v4l2_vp9_segmentation { + __s16 feature_data[32]; + __u8 feature_enabled[8]; + __u8 tree_probs[7]; + __u8 pred_probs[3]; + __u8 flags; + __u8 reserved[5]; +}; + +struct v4l2_ctrl_vp9_frame { + struct v4l2_vp9_loop_filter lf; + struct v4l2_vp9_quantization quant; + struct v4l2_vp9_segmentation seg; + __u32 flags; + __u16 compressed_header_size; + __u16 uncompressed_header_size; + __u16 frame_width_minus_1; + __u16 frame_height_minus_1; + __u16 render_width_minus_1; + __u16 render_height_minus_1; + __u64 last_frame_ts; + __u64 golden_frame_ts; + __u64 alt_frame_ts; + __u8 ref_frame_sign_bias; + __u8 reset_frame_context; + __u8 frame_context_idx; + __u8 profile; + __u8 bit_depth; + __u8 interpolation_filter; + __u8 tile_cols_log2; + __u8 tile_rows_log2; + __u8 reference_mode; + __u8 reserved[7]; +}; + +struct v4l2_vp9_mv_probs { + __u8 joint[3]; + __u8 sign[2]; + __u8 classes[20]; + __u8 class0_bit[2]; + __u8 bits[20]; + __u8 class0_fr[12]; + __u8 fr[6]; + __u8 class0_hp[2]; + __u8 hp[2]; +}; + +struct v4l2_ctrl_vp9_compressed_hdr { + __u8 tx_mode; + __u8 tx8[2]; + __u8 tx16[4]; + __u8 tx32[6]; + __u8 coef[1728]; + __u8 skip[3]; + __u8 inter_mode[21]; + __u8 interp_filter[8]; + __u8 is_inter[4]; + __u8 comp_mode[5]; + __u8 single_ref[10]; + __u8 comp_ref[5]; + __u8 y_mode[36]; + __u8 uv_mode[90]; + __u8 partition[48]; + struct v4l2_vp9_mv_probs mv; +}; + +enum v4l2_buf_type { + V4L2_BUF_TYPE_VIDEO_CAPTURE = 1, + V4L2_BUF_TYPE_VIDEO_OUTPUT = 2, + V4L2_BUF_TYPE_VIDEO_OVERLAY = 3, + V4L2_BUF_TYPE_VBI_CAPTURE = 4, + V4L2_BUF_TYPE_VBI_OUTPUT = 5, + V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6, + V4L2_BUF_TYPE_SLICED_VBI_OUTPUT = 7, + V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8, + V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 9, + V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE = 10, + V4L2_BUF_TYPE_SDR_CAPTURE = 11, + V4L2_BUF_TYPE_SDR_OUTPUT = 12, + V4L2_BUF_TYPE_META_CAPTURE = 13, + V4L2_BUF_TYPE_META_OUTPUT = 14, + V4L2_BUF_TYPE_PRIVATE = 128, +}; + +enum v4l2_priority { + V4L2_PRIORITY_UNSET = 0, + V4L2_PRIORITY_BACKGROUND = 1, + V4L2_PRIORITY_INTERACTIVE = 2, + V4L2_PRIORITY_RECORD = 3, + V4L2_PRIORITY_DEFAULT = 2, +}; + +struct v4l2_rect { + __s32 left; + __s32 top; + __u32 width; + __u32 height; +}; + +struct v4l2_area { + __u32 width; + __u32 height; +}; + +struct v4l2_capability { + __u8 driver[16]; + __u8 card[32]; + __u8 bus_info[32]; + __u32 version; + __u32 capabilities; + __u32 device_caps; + __u32 reserved[3]; +}; + +struct v4l2_pix_format { + __u32 width; + __u32 height; + __u32 pixelformat; + __u32 field; + __u32 bytesperline; + __u32 sizeimage; + __u32 colorspace; + __u32 priv; + __u32 flags; + union { + __u32 ycbcr_enc; + __u32 hsv_enc; + }; + __u32 quantization; + __u32 xfer_func; +}; + +struct v4l2_fmtdesc { + __u32 index; + __u32 type; + __u32 flags; + __u8 description[32]; + __u32 pixelformat; + __u32 mbus_code; + __u32 reserved[3]; +}; + +struct v4l2_frmsize_discrete { + __u32 width; + __u32 height; +}; + +struct v4l2_frmsize_stepwise { + __u32 min_width; + __u32 max_width; + __u32 step_width; + __u32 min_height; + __u32 max_height; + __u32 step_height; +}; + +struct v4l2_frmsizeenum { + __u32 index; + __u32 pixel_format; + __u32 type; + union { + struct v4l2_frmsize_discrete discrete; + struct v4l2_frmsize_stepwise stepwise; + }; + __u32 reserved[2]; +}; + +struct v4l2_frmival_stepwise { + struct v4l2_fract min; + struct v4l2_fract max; + struct v4l2_fract step; +}; + +struct v4l2_frmivalenum { + __u32 index; + __u32 pixel_format; + __u32 width; + __u32 height; + __u32 type; + union { + struct v4l2_fract discrete; + struct v4l2_frmival_stepwise stepwise; + }; + __u32 reserved[2]; +}; + +struct v4l2_timecode { + __u32 type; + __u32 flags; + __u8 frames; + __u8 seconds; + __u8 minutes; + __u8 hours; + __u8 userbits[4]; +}; + +struct v4l2_jpegcompression { + int quality; + int APPn; + int APP_len; + char APP_data[60]; + int COM_len; + char COM_data[60]; + __u32 jpeg_markers; +}; + +struct __kernel_v4l2_timeval { + long long int tv_sec; + long long int tv_usec; +}; + +struct v4l2_requestbuffers { + __u32 count; + __u32 type; + __u32 memory; + __u32 capabilities; + __u8 flags; + __u8 reserved[3]; +}; + +struct v4l2_plane { + __u32 bytesused; + __u32 length; + union { + __u32 mem_offset; + long unsigned int userptr; + __s32 fd; + } m; + __u32 data_offset; + __u32 reserved[11]; +}; + +struct v4l2_buffer { + __u32 index; + __u32 type; + __u32 bytesused; + __u32 flags; + __u32 field; + long: 32; + struct __kernel_v4l2_timeval timestamp; + struct v4l2_timecode timecode; + __u32 sequence; + __u32 memory; + union { + __u32 offset; + long unsigned int userptr; + struct v4l2_plane *planes; + __s32 fd; + } m; + __u32 length; + __u32 reserved2; + union { + __s32 request_fd; + __u32 reserved; + }; +}; + +struct v4l2_exportbuffer { + __u32 type; + __u32 index; + __u32 plane; + __u32 flags; + __s32 fd; + __u32 reserved[11]; +}; + +struct v4l2_framebuffer { + __u32 capability; + __u32 flags; + void *base; + struct { + __u32 width; + __u32 height; + __u32 pixelformat; + __u32 field; + __u32 bytesperline; + __u32 sizeimage; + __u32 colorspace; + __u32 priv; + } fmt; +}; + +struct v4l2_clip { + struct v4l2_rect c; + struct v4l2_clip *next; +}; + +struct v4l2_window { + struct v4l2_rect w; + __u32 field; + __u32 chromakey; + struct v4l2_clip *clips; + __u32 clipcount; + void *bitmap; + __u8 global_alpha; +}; + +struct v4l2_captureparm { + __u32 capability; + __u32 capturemode; + struct v4l2_fract timeperframe; + __u32 extendedmode; + __u32 readbuffers; + __u32 reserved[4]; +}; + +struct v4l2_outputparm { + __u32 capability; + __u32 outputmode; + struct v4l2_fract timeperframe; + __u32 extendedmode; + __u32 writebuffers; + __u32 reserved[4]; +}; + +struct v4l2_selection { + __u32 type; + __u32 target; + __u32 flags; + struct v4l2_rect r; + __u32 reserved[9]; +}; + +struct v4l2_input { + __u32 index; + __u8 name[32]; + __u32 type; + __u32 audioset; + __u32 tuner; + v4l2_std_id std; + __u32 status; + __u32 capabilities; + __u32 reserved[3]; + long: 32; +}; + +struct v4l2_output { + __u32 index; + __u8 name[32]; + __u32 type; + __u32 audioset; + __u32 modulator; + v4l2_std_id std; + __u32 capabilities; + __u32 reserved[3]; +}; + +struct v4l2_control { + __u32 id; + __s32 value; +}; + +struct v4l2_ext_control { + __u32 id; + __u32 size; + __u32 reserved2[1]; + union { + __s32 value; + __s64 value64; + char *string; + __u8 *p_u8; + __u16 *p_u16; + __u32 *p_u32; + __u32 *p_s32; + __u32 *p_s64; + struct v4l2_area *p_area; + struct v4l2_ctrl_h264_sps *p_h264_sps; + struct v4l2_ctrl_h264_pps *p_h264_pps; + struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix; + struct v4l2_ctrl_h264_pred_weights *p_h264_pred_weights; + struct v4l2_ctrl_h264_slice_params *p_h264_slice_params; + struct v4l2_ctrl_h264_decode_params *p_h264_decode_params; + struct v4l2_ctrl_fwht_params *p_fwht_params; + struct v4l2_ctrl_vp8_frame *p_vp8_frame; + struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence; + struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture; + struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quantisation; + struct v4l2_ctrl_vp9_compressed_hdr *p_vp9_compressed_hdr_probs; + struct v4l2_ctrl_vp9_frame *p_vp9_frame; + struct v4l2_ctrl_hevc_sps *p_hevc_sps; + struct v4l2_ctrl_hevc_pps *p_hevc_pps; + struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params; + struct v4l2_ctrl_hevc_scaling_matrix *p_hevc_scaling_matrix; + struct v4l2_ctrl_hevc_decode_params *p_hevc_decode_params; + void *ptr; + }; +}; + +struct v4l2_ext_controls { + union { + __u32 which; + }; + __u32 count; + __u32 error_idx; + __s32 request_fd; + __u32 reserved[1]; + struct v4l2_ext_control *controls; +}; + +struct v4l2_queryctrl { + __u32 id; + __u32 type; + __u8 name[32]; + __s32 minimum; + __s32 maximum; + __s32 step; + __s32 default_value; + __u32 flags; + __u32 reserved[2]; +}; + +struct v4l2_query_ext_ctrl { + __u32 id; + __u32 type; + char name[32]; + __s64 minimum; + __s64 maximum; + __u64 step; + __s64 default_value; + __u32 flags; + __u32 elem_size; + __u32 elems; + __u32 nr_of_dims; + __u32 dims[4]; + __u32 reserved[32]; +}; + +struct v4l2_querymenu { + __u32 id; + __u32 index; + union { + __u8 name[32]; + __s64 value; + }; + __u32 reserved; +}; + +struct v4l2_tuner { + __u32 index; + __u8 name[32]; + __u32 type; + __u32 capability; + __u32 rangelow; + __u32 rangehigh; + __u32 rxsubchans; + __u32 audmode; + __s32 signal; + __s32 afc; + __u32 reserved[4]; +}; + +struct v4l2_modulator { + __u32 index; + __u8 name[32]; + __u32 capability; + __u32 rangelow; + __u32 rangehigh; + __u32 txsubchans; + __u32 type; + __u32 reserved[3]; +}; + +struct v4l2_frequency { + __u32 tuner; + __u32 type; + __u32 frequency; + __u32 reserved[8]; +}; + +struct v4l2_frequency_band { + __u32 tuner; + __u32 type; + __u32 index; + __u32 capability; + __u32 rangelow; + __u32 rangehigh; + __u32 modulation; + __u32 reserved[9]; +}; + +struct v4l2_hw_freq_seek { + __u32 tuner; + __u32 type; + __u32 seek_upward; + __u32 wrap_around; + __u32 spacing; + __u32 rangelow; + __u32 rangehigh; + __u32 reserved[5]; +}; + +struct v4l2_audio { + __u32 index; + __u8 name[32]; + __u32 capability; + __u32 mode; + __u32 reserved[2]; +}; + +struct v4l2_audioout { + __u32 index; + __u8 name[32]; + __u32 capability; + __u32 mode; + __u32 reserved[2]; +}; + +struct v4l2_enc_idx_entry { + __u64 offset; + __u64 pts; + __u32 length; + __u32 flags; + __u32 reserved[2]; +}; + +struct v4l2_enc_idx { + __u32 entries; + __u32 entries_cap; + __u32 reserved[4]; + struct v4l2_enc_idx_entry entry[64]; +}; + +struct v4l2_encoder_cmd { + __u32 cmd; + __u32 flags; + union { + struct { + __u32 data[8]; + } raw; + }; +}; + +struct v4l2_decoder_cmd { + __u32 cmd; + __u32 flags; + union { + struct { + __u64 pts; + } stop; + struct { + __s32 speed; + __u32 format; + } start; + struct { + __u32 data[16]; + } raw; + }; +}; + +struct v4l2_vbi_format { + __u32 sampling_rate; + __u32 offset; + __u32 samples_per_line; + __u32 sample_format; + __s32 start[2]; + __u32 count[2]; + __u32 flags; + __u32 reserved[2]; +}; + +struct v4l2_sliced_vbi_format { + __u16 service_set; + __u16 service_lines[48]; + __u32 io_size; + __u32 reserved[2]; +}; + +struct v4l2_sliced_vbi_cap { + __u16 service_set; + __u16 service_lines[48]; + __u32 type; + __u32 reserved[3]; +}; + +struct v4l2_sliced_vbi_data { + __u32 id; + __u32 field; + __u32 line; + __u32 reserved; + __u8 data[48]; +}; + +struct v4l2_plane_pix_format { + __u32 sizeimage; + __u32 bytesperline; + __u16 reserved[6]; +}; + +struct v4l2_pix_format_mplane { + __u32 width; + __u32 height; + __u32 pixelformat; + __u32 field; + __u32 colorspace; + struct v4l2_plane_pix_format plane_fmt[8]; + __u8 num_planes; + __u8 flags; + union { + __u8 ycbcr_enc; + __u8 hsv_enc; + }; + __u8 quantization; + __u8 xfer_func; + __u8 reserved[7]; +}; + +struct v4l2_sdr_format { + __u32 pixelformat; + __u32 buffersize; + __u8 reserved[24]; +}; + +struct v4l2_meta_format { + __u32 dataformat; + __u32 buffersize; +}; + +struct v4l2_format { + __u32 type; + union { + struct v4l2_pix_format pix; + struct v4l2_pix_format_mplane pix_mp; + struct v4l2_window win; + struct v4l2_vbi_format vbi; + struct v4l2_sliced_vbi_format sliced; + struct v4l2_sdr_format sdr; + struct v4l2_meta_format meta; + __u8 raw_data[200]; + } fmt; +}; + +struct v4l2_streamparm { + __u32 type; + union { + struct v4l2_captureparm capture; + struct v4l2_outputparm output; + __u8 raw_data[200]; + } parm; +}; + +struct v4l2_event_subscription { + __u32 type; + __u32 id; + __u32 flags; + __u32 reserved[5]; +}; + +struct v4l2_create_buffers { + __u32 index; + __u32 count; + __u32 memory; + struct v4l2_format format; + __u32 capabilities; + __u32 flags; + __u32 reserved[6]; +}; + +enum vfl_devnode_type { + VFL_TYPE_VIDEO = 0, + VFL_TYPE_VBI = 1, + VFL_TYPE_RADIO = 2, + VFL_TYPE_SUBDEV = 3, + VFL_TYPE_SDR = 4, + VFL_TYPE_TOUCH = 5, + VFL_TYPE_MAX = 6, +}; + +enum vfl_devnode_direction { + VFL_DIR_RX = 0, + VFL_DIR_TX = 1, + VFL_DIR_M2M = 2, +}; + +enum v4l2_video_device_flags { + V4L2_FL_REGISTERED = 0, + V4L2_FL_USES_V4L2_FH = 1, + V4L2_FL_QUIRK_INVERTED_CROP = 2, + V4L2_FL_SUBDEV_RO_DEVNODE = 3, +}; + +struct v4l2_prio_state { + atomic_t prios[4]; +}; + +struct v4l2_file_operations { + struct module *owner; + ssize_t (*read)(struct file *, char *, size_t, loff_t *); + ssize_t (*write)(struct file *, const char *, size_t, loff_t *); + __poll_t (*poll)(struct file *, struct poll_table_struct *); + long int (*unlocked_ioctl)(struct file *, unsigned int, long unsigned int); + long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + int (*mmap)(struct file *, struct vm_area_struct *); + int (*open)(struct file *); + int (*release)(struct file *); +}; + +struct v4l2_device; + +struct v4l2_ctrl_handler; + +struct vb2_queue; + +struct v4l2_ioctl_ops; + +struct video_device { + struct media_entity entity; + struct media_intf_devnode *intf_devnode; + struct media_pipeline pipe; + const struct v4l2_file_operations *fops; + u32 device_caps; + struct device dev; + struct cdev *cdev; + struct v4l2_device *v4l2_dev; + struct device *dev_parent; + struct v4l2_ctrl_handler *ctrl_handler; + struct vb2_queue *queue; + struct v4l2_prio_state *prio; + char name[32]; + enum vfl_devnode_type vfl_type; + enum vfl_devnode_direction vfl_dir; + int minor; + u16 num; + long unsigned int flags; + int index; + spinlock_t fh_lock; + struct list_head fh_list; + int dev_debug; + v4l2_std_id tvnorms; + void (*release)(struct video_device *); + const struct v4l2_ioctl_ops *ioctl_ops; + long unsigned int valid_ioctls[6]; + struct mutex *lock; + long: 32; +}; + +struct v4l2_subdev; + +struct v4l2_device { + struct device *dev; + struct media_device *mdev; + struct list_head subdevs; + spinlock_t lock; + char name[36]; + void (*notify)(struct v4l2_subdev *, unsigned int, void *); + struct v4l2_ctrl_handler *ctrl_handler; + struct v4l2_prio_state prio; + struct kref ref; + void (*release)(struct v4l2_device *); +}; + +struct v4l2_fh; + +struct v4l2_ioctl_ops { + int (*vidioc_querycap)(struct file *, void *, struct v4l2_capability *); + int (*vidioc_enum_fmt_vid_cap)(struct file *, void *, struct v4l2_fmtdesc *); + int (*vidioc_enum_fmt_vid_overlay)(struct file *, void *, struct v4l2_fmtdesc *); + int (*vidioc_enum_fmt_vid_out)(struct file *, void *, struct v4l2_fmtdesc *); + int (*vidioc_enum_fmt_sdr_cap)(struct file *, void *, struct v4l2_fmtdesc *); + int (*vidioc_enum_fmt_sdr_out)(struct file *, void *, struct v4l2_fmtdesc *); + int (*vidioc_enum_fmt_meta_cap)(struct file *, void *, struct v4l2_fmtdesc *); + int (*vidioc_enum_fmt_meta_out)(struct file *, void *, struct v4l2_fmtdesc *); + int (*vidioc_g_fmt_vid_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_vid_overlay)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_vid_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_vid_out_overlay)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_vbi_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_vbi_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_sliced_vbi_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_sliced_vbi_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_vid_cap_mplane)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_vid_out_mplane)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_sdr_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_sdr_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_meta_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_g_fmt_meta_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_vid_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_vid_overlay)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_vid_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_vid_out_overlay)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_vbi_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_vbi_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_sliced_vbi_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_sliced_vbi_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_vid_cap_mplane)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_vid_out_mplane)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_sdr_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_sdr_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_meta_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_s_fmt_meta_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_vid_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_vid_overlay)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_vid_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_vid_out_overlay)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_vbi_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_vbi_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_sliced_vbi_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_sliced_vbi_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_vid_cap_mplane)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_vid_out_mplane)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_sdr_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_sdr_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_meta_cap)(struct file *, void *, struct v4l2_format *); + int (*vidioc_try_fmt_meta_out)(struct file *, void *, struct v4l2_format *); + int (*vidioc_reqbufs)(struct file *, void *, struct v4l2_requestbuffers *); + int (*vidioc_querybuf)(struct file *, void *, struct v4l2_buffer *); + int (*vidioc_qbuf)(struct file *, void *, struct v4l2_buffer *); + int (*vidioc_expbuf)(struct file *, void *, struct v4l2_exportbuffer *); + int (*vidioc_dqbuf)(struct file *, void *, struct v4l2_buffer *); + int (*vidioc_create_bufs)(struct file *, void *, struct v4l2_create_buffers *); + int (*vidioc_prepare_buf)(struct file *, void *, struct v4l2_buffer *); + int (*vidioc_overlay)(struct file *, void *, unsigned int); + int (*vidioc_g_fbuf)(struct file *, void *, struct v4l2_framebuffer *); + int (*vidioc_s_fbuf)(struct file *, void *, const struct v4l2_framebuffer *); + int (*vidioc_streamon)(struct file *, void *, enum v4l2_buf_type); + int (*vidioc_streamoff)(struct file *, void *, enum v4l2_buf_type); + int (*vidioc_g_std)(struct file *, void *, v4l2_std_id *); + int (*vidioc_s_std)(struct file *, void *, v4l2_std_id); + int (*vidioc_querystd)(struct file *, void *, v4l2_std_id *); + int (*vidioc_enum_input)(struct file *, void *, struct v4l2_input *); + int (*vidioc_g_input)(struct file *, void *, unsigned int *); + int (*vidioc_s_input)(struct file *, void *, unsigned int); + int (*vidioc_enum_output)(struct file *, void *, struct v4l2_output *); + int (*vidioc_g_output)(struct file *, void *, unsigned int *); + int (*vidioc_s_output)(struct file *, void *, unsigned int); + int (*vidioc_queryctrl)(struct file *, void *, struct v4l2_queryctrl *); + int (*vidioc_query_ext_ctrl)(struct file *, void *, struct v4l2_query_ext_ctrl *); + int (*vidioc_g_ctrl)(struct file *, void *, struct v4l2_control *); + int (*vidioc_s_ctrl)(struct file *, void *, struct v4l2_control *); + int (*vidioc_g_ext_ctrls)(struct file *, void *, struct v4l2_ext_controls *); + int (*vidioc_s_ext_ctrls)(struct file *, void *, struct v4l2_ext_controls *); + int (*vidioc_try_ext_ctrls)(struct file *, void *, struct v4l2_ext_controls *); + int (*vidioc_querymenu)(struct file *, void *, struct v4l2_querymenu *); + int (*vidioc_enumaudio)(struct file *, void *, struct v4l2_audio *); + int (*vidioc_g_audio)(struct file *, void *, struct v4l2_audio *); + int (*vidioc_s_audio)(struct file *, void *, const struct v4l2_audio *); + int (*vidioc_enumaudout)(struct file *, void *, struct v4l2_audioout *); + int (*vidioc_g_audout)(struct file *, void *, struct v4l2_audioout *); + int (*vidioc_s_audout)(struct file *, void *, const struct v4l2_audioout *); + int (*vidioc_g_modulator)(struct file *, void *, struct v4l2_modulator *); + int (*vidioc_s_modulator)(struct file *, void *, const struct v4l2_modulator *); + int (*vidioc_g_pixelaspect)(struct file *, void *, int, struct v4l2_fract *); + int (*vidioc_g_selection)(struct file *, void *, struct v4l2_selection *); + int (*vidioc_s_selection)(struct file *, void *, struct v4l2_selection *); + int (*vidioc_g_jpegcomp)(struct file *, void *, struct v4l2_jpegcompression *); + int (*vidioc_s_jpegcomp)(struct file *, void *, const struct v4l2_jpegcompression *); + int (*vidioc_g_enc_index)(struct file *, void *, struct v4l2_enc_idx *); + int (*vidioc_encoder_cmd)(struct file *, void *, struct v4l2_encoder_cmd *); + int (*vidioc_try_encoder_cmd)(struct file *, void *, struct v4l2_encoder_cmd *); + int (*vidioc_decoder_cmd)(struct file *, void *, struct v4l2_decoder_cmd *); + int (*vidioc_try_decoder_cmd)(struct file *, void *, struct v4l2_decoder_cmd *); + int (*vidioc_g_parm)(struct file *, void *, struct v4l2_streamparm *); + int (*vidioc_s_parm)(struct file *, void *, struct v4l2_streamparm *); + int (*vidioc_g_tuner)(struct file *, void *, struct v4l2_tuner *); + int (*vidioc_s_tuner)(struct file *, void *, const struct v4l2_tuner *); + int (*vidioc_g_frequency)(struct file *, void *, struct v4l2_frequency *); + int (*vidioc_s_frequency)(struct file *, void *, const struct v4l2_frequency *); + int (*vidioc_enum_freq_bands)(struct file *, void *, struct v4l2_frequency_band *); + int (*vidioc_g_sliced_vbi_cap)(struct file *, void *, struct v4l2_sliced_vbi_cap *); + int (*vidioc_log_status)(struct file *, void *); + int (*vidioc_s_hw_freq_seek)(struct file *, void *, const struct v4l2_hw_freq_seek *); + int (*vidioc_enum_framesizes)(struct file *, void *, struct v4l2_frmsizeenum *); + int (*vidioc_enum_frameintervals)(struct file *, void *, struct v4l2_frmivalenum *); + int (*vidioc_s_dv_timings)(struct file *, void *, struct v4l2_dv_timings *); + int (*vidioc_g_dv_timings)(struct file *, void *, struct v4l2_dv_timings *); + int (*vidioc_query_dv_timings)(struct file *, void *, struct v4l2_dv_timings *); + int (*vidioc_enum_dv_timings)(struct file *, void *, struct v4l2_enum_dv_timings *); + int (*vidioc_dv_timings_cap)(struct file *, void *, struct v4l2_dv_timings_cap *); + int (*vidioc_g_edid)(struct file *, void *, struct v4l2_edid *); + int (*vidioc_s_edid)(struct file *, void *, struct v4l2_edid *); + int (*vidioc_subscribe_event)(struct v4l2_fh *, const struct v4l2_event_subscription *); + int (*vidioc_unsubscribe_event)(struct v4l2_fh *, const struct v4l2_event_subscription *); + long int (*vidioc_default)(struct file *, void *, bool, unsigned int, void *); +}; + +struct v4l2_mbus_framefmt { + __u32 width; + __u32 height; + __u32 code; + __u32 field; + __u32 colorspace; + union { + __u16 ycbcr_enc; + __u16 hsv_enc; + }; + __u16 quantization; + __u16 xfer_func; + __u16 flags; + __u16 reserved[10]; +}; + +struct v4l2_subdev_format { + __u32 which; + __u32 pad; + struct v4l2_mbus_framefmt format; + __u32 reserved[8]; +}; + +struct v4l2_subdev_mbus_code_enum { + __u32 pad; + __u32 index; + __u32 code; + __u32 which; + __u32 flags; + __u32 reserved[7]; +}; + +struct v4l2_subdev_frame_size_enum { + __u32 index; + __u32 pad; + __u32 code; + __u32 min_width; + __u32 max_width; + __u32 min_height; + __u32 max_height; + __u32 which; + __u32 reserved[8]; +}; + +struct v4l2_subdev_frame_interval { + __u32 pad; + struct v4l2_fract interval; + __u32 reserved[9]; +}; + +struct v4l2_subdev_frame_interval_enum { + __u32 index; + __u32 pad; + __u32 code; + __u32 width; + __u32 height; + struct v4l2_fract interval; + __u32 which; + __u32 reserved[8]; +}; + +struct v4l2_subdev_selection { + __u32 which; + __u32 pad; + __u32 target; + __u32 flags; + struct v4l2_rect r; + __u32 reserved[8]; +}; + +enum v4l2_async_match_type { + V4L2_ASYNC_MATCH_I2C = 0, + V4L2_ASYNC_MATCH_FWNODE = 1, +}; + +struct v4l2_async_subdev { + enum v4l2_async_match_type match_type; + union { + struct fwnode_handle *fwnode; + struct { + int adapter_id; + short unsigned int address; + } i2c; + } match; + struct list_head list; + struct list_head asd_list; +}; + +struct v4l2_async_notifier; + +struct v4l2_async_notifier_operations { + int (*bound)(struct v4l2_async_notifier *, struct v4l2_subdev *, struct v4l2_async_subdev *); + int (*complete)(struct v4l2_async_notifier *); + void (*unbind)(struct v4l2_async_notifier *, struct v4l2_subdev *, struct v4l2_async_subdev *); + void (*destroy)(struct v4l2_async_subdev *); +}; + +struct v4l2_async_notifier { + const struct v4l2_async_notifier_operations *ops; + struct v4l2_device *v4l2_dev; + struct v4l2_subdev *sd; + struct v4l2_async_notifier *parent; + struct list_head asd_list; + struct list_head waiting; + struct list_head done; + struct list_head list; +}; + +struct v4l2_subdev_ops; + +struct v4l2_subdev_internal_ops; + +struct v4l2_subdev_platform_data; + +struct v4l2_subdev_state; + +struct v4l2_subdev { + struct media_entity entity; + struct list_head list; + struct module *owner; + bool owner_v4l2_dev; + u32 flags; + struct v4l2_device *v4l2_dev; + const struct v4l2_subdev_ops *ops; + const struct v4l2_subdev_internal_ops *internal_ops; + struct v4l2_ctrl_handler *ctrl_handler; + char name[32]; + u32 grp_id; + void *dev_priv; + void *host_priv; + struct video_device *devnode; + struct device *dev; + struct fwnode_handle *fwnode; + struct list_head async_list; + struct v4l2_async_subdev *asd; + struct v4l2_async_notifier *notifier; + struct v4l2_async_notifier *subdev_notifier; + struct v4l2_subdev_platform_data *pdata; + struct mutex *state_lock; + struct v4l2_subdev_state *active_state; +}; + +struct v4l2_m2m_ctx; + +struct v4l2_fh { + struct list_head list; + struct video_device *vdev; + struct v4l2_ctrl_handler *ctrl_handler; + enum v4l2_priority prio; + wait_queue_head_t wait; + struct mutex subscribe_lock; + struct list_head subscribed; + struct list_head available; + unsigned int navailable; + u32 sequence; + struct v4l2_m2m_ctx *m2m_ctx; +}; + +struct v4l2_mbus_config_mipi_csi2 { + unsigned int flags; + unsigned char data_lanes[8]; + unsigned char clock_lane; + unsigned char num_data_lanes; + bool lane_polarities[9]; +}; + +struct v4l2_mbus_config_parallel { + unsigned int flags; + unsigned char bus_width; + unsigned char data_shift; +}; + +struct v4l2_mbus_config_mipi_csi1 { + unsigned char clock_inv: 1; + unsigned char strobe: 1; + bool lane_polarity[2]; + unsigned char data_lane; + unsigned char clock_lane; +}; + +enum v4l2_mbus_type { + V4L2_MBUS_UNKNOWN = 0, + V4L2_MBUS_PARALLEL = 1, + V4L2_MBUS_BT656 = 2, + V4L2_MBUS_CSI1 = 3, + V4L2_MBUS_CCP2 = 4, + V4L2_MBUS_CSI2_DPHY = 5, + V4L2_MBUS_CSI2_CPHY = 6, + V4L2_MBUS_DPI = 7, + V4L2_MBUS_INVALID = 8, +}; + +struct v4l2_mbus_config { + enum v4l2_mbus_type type; + union { + struct v4l2_mbus_config_parallel parallel; + struct v4l2_mbus_config_mipi_csi1 mipi_csi1; + struct v4l2_mbus_config_mipi_csi2 mipi_csi2; + } bus; +}; + +struct v4l2_decode_vbi_line { + u32 is_second_field; + u8 *p; + u32 line; + u32 type; +}; + +struct v4l2_subdev_io_pin_config { + u32 flags; + u8 pin; + u8 function; + u8 value; + u8 strength; +}; + +struct v4l2_subdev_core_ops { + int (*log_status)(struct v4l2_subdev *); + int (*s_io_pin_config)(struct v4l2_subdev *, size_t, struct v4l2_subdev_io_pin_config *); + int (*init)(struct v4l2_subdev *, u32); + int (*load_fw)(struct v4l2_subdev *); + int (*reset)(struct v4l2_subdev *, u32); + int (*s_gpio)(struct v4l2_subdev *, u32); + long int (*command)(struct v4l2_subdev *, unsigned int, void *); + long int (*ioctl)(struct v4l2_subdev *, unsigned int, void *); + int (*s_power)(struct v4l2_subdev *, int); + int (*interrupt_service_routine)(struct v4l2_subdev *, u32, bool *); + int (*subscribe_event)(struct v4l2_subdev *, struct v4l2_fh *, struct v4l2_event_subscription *); + int (*unsubscribe_event)(struct v4l2_subdev *, struct v4l2_fh *, struct v4l2_event_subscription *); +}; + +struct tuner_setup; + +struct v4l2_subdev_tuner_ops { + int (*standby)(struct v4l2_subdev *); + int (*s_radio)(struct v4l2_subdev *); + int (*s_frequency)(struct v4l2_subdev *, const struct v4l2_frequency *); + int (*g_frequency)(struct v4l2_subdev *, struct v4l2_frequency *); + int (*enum_freq_bands)(struct v4l2_subdev *, struct v4l2_frequency_band *); + int (*g_tuner)(struct v4l2_subdev *, struct v4l2_tuner *); + int (*s_tuner)(struct v4l2_subdev *, const struct v4l2_tuner *); + int (*g_modulator)(struct v4l2_subdev *, struct v4l2_modulator *); + int (*s_modulator)(struct v4l2_subdev *, const struct v4l2_modulator *); + int (*s_type_addr)(struct v4l2_subdev *, struct tuner_setup *); + int (*s_config)(struct v4l2_subdev *, const struct v4l2_priv_tun_config *); +}; + +struct v4l2_subdev_audio_ops { + int (*s_clock_freq)(struct v4l2_subdev *, u32); + int (*s_i2s_clock_freq)(struct v4l2_subdev *, u32); + int (*s_routing)(struct v4l2_subdev *, u32, u32, u32); + int (*s_stream)(struct v4l2_subdev *, int); +}; + +struct v4l2_mbus_frame_desc_entry_csi2 { + u8 vc; + u8 dt; +}; + +enum v4l2_mbus_frame_desc_flags { + V4L2_MBUS_FRAME_DESC_FL_LEN_MAX = 1, + V4L2_MBUS_FRAME_DESC_FL_BLOB = 2, +}; + +struct v4l2_mbus_frame_desc_entry { + enum v4l2_mbus_frame_desc_flags flags; + u32 pixelcode; + u32 length; + union { + struct v4l2_mbus_frame_desc_entry_csi2 csi2; + } bus; +}; + +enum v4l2_mbus_frame_desc_type { + V4L2_MBUS_FRAME_DESC_TYPE_UNDEFINED = 0, + V4L2_MBUS_FRAME_DESC_TYPE_PARALLEL = 1, + V4L2_MBUS_FRAME_DESC_TYPE_CSI2 = 2, +}; + +struct v4l2_mbus_frame_desc { + enum v4l2_mbus_frame_desc_type type; + struct v4l2_mbus_frame_desc_entry entry[8]; + short unsigned int num_entries; +}; + +struct v4l2_subdev_video_ops { + int (*s_routing)(struct v4l2_subdev *, u32, u32, u32); + int (*s_crystal_freq)(struct v4l2_subdev *, u32, u32); + int (*g_std)(struct v4l2_subdev *, v4l2_std_id *); + int (*s_std)(struct v4l2_subdev *, v4l2_std_id); + int (*s_std_output)(struct v4l2_subdev *, v4l2_std_id); + int (*g_std_output)(struct v4l2_subdev *, v4l2_std_id *); + int (*querystd)(struct v4l2_subdev *, v4l2_std_id *); + int (*g_tvnorms)(struct v4l2_subdev *, v4l2_std_id *); + int (*g_tvnorms_output)(struct v4l2_subdev *, v4l2_std_id *); + int (*g_input_status)(struct v4l2_subdev *, u32 *); + int (*s_stream)(struct v4l2_subdev *, int); + int (*g_pixelaspect)(struct v4l2_subdev *, struct v4l2_fract *); + int (*g_frame_interval)(struct v4l2_subdev *, struct v4l2_subdev_frame_interval *); + int (*s_frame_interval)(struct v4l2_subdev *, struct v4l2_subdev_frame_interval *); + int (*s_dv_timings)(struct v4l2_subdev *, struct v4l2_dv_timings *); + int (*g_dv_timings)(struct v4l2_subdev *, struct v4l2_dv_timings *); + int (*query_dv_timings)(struct v4l2_subdev *, struct v4l2_dv_timings *); + int (*s_rx_buffer)(struct v4l2_subdev *, void *, unsigned int *); + int (*pre_streamon)(struct v4l2_subdev *, u32); + int (*post_streamoff)(struct v4l2_subdev *); +}; + +struct v4l2_subdev_vbi_ops { + int (*decode_vbi_line)(struct v4l2_subdev *, struct v4l2_decode_vbi_line *); + int (*s_vbi_data)(struct v4l2_subdev *, const struct v4l2_sliced_vbi_data *); + int (*g_vbi_data)(struct v4l2_subdev *, struct v4l2_sliced_vbi_data *); + int (*g_sliced_vbi_cap)(struct v4l2_subdev *, struct v4l2_sliced_vbi_cap *); + int (*s_raw_fmt)(struct v4l2_subdev *, struct v4l2_vbi_format *); + int (*g_sliced_fmt)(struct v4l2_subdev *, struct v4l2_sliced_vbi_format *); + int (*s_sliced_fmt)(struct v4l2_subdev *, struct v4l2_sliced_vbi_format *); +}; + +struct v4l2_subdev_sensor_ops { + int (*g_skip_top_lines)(struct v4l2_subdev *, u32 *); + int (*g_skip_frames)(struct v4l2_subdev *, u32 *); +}; + +enum v4l2_subdev_ir_mode { + V4L2_SUBDEV_IR_MODE_PULSE_WIDTH = 0, +}; + +struct v4l2_subdev_ir_parameters { + unsigned int bytes_per_data_element; + enum v4l2_subdev_ir_mode mode; + bool enable; + bool interrupt_enable; + bool shutdown; + bool modulation; + u32 max_pulse_width; + unsigned int carrier_freq; + unsigned int duty_cycle; + bool invert_level; + bool invert_carrier_sense; + u32 noise_filter_min_width; + unsigned int carrier_range_lower; + unsigned int carrier_range_upper; + u32 resolution; +}; + +struct v4l2_subdev_ir_ops { + int (*rx_read)(struct v4l2_subdev *, u8 *, size_t, ssize_t *); + int (*rx_g_parameters)(struct v4l2_subdev *, struct v4l2_subdev_ir_parameters *); + int (*rx_s_parameters)(struct v4l2_subdev *, struct v4l2_subdev_ir_parameters *); + int (*tx_write)(struct v4l2_subdev *, u8 *, size_t, ssize_t *); + int (*tx_g_parameters)(struct v4l2_subdev *, struct v4l2_subdev_ir_parameters *); + int (*tx_s_parameters)(struct v4l2_subdev *, struct v4l2_subdev_ir_parameters *); +}; + +struct v4l2_subdev_pad_config { + struct v4l2_mbus_framefmt try_fmt; + struct v4l2_rect try_crop; + struct v4l2_rect try_compose; +}; + +struct v4l2_subdev_state { + struct mutex _lock; + struct mutex *lock; + struct v4l2_subdev_pad_config *pads; +}; + +struct v4l2_subdev_pad_ops { + int (*init_cfg)(struct v4l2_subdev *, struct v4l2_subdev_state *); + int (*enum_mbus_code)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_mbus_code_enum *); + int (*enum_frame_size)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_frame_size_enum *); + int (*enum_frame_interval)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_frame_interval_enum *); + int (*get_fmt)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_format *); + int (*set_fmt)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_format *); + int (*get_selection)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_selection *); + int (*set_selection)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_selection *); + int (*get_edid)(struct v4l2_subdev *, struct v4l2_edid *); + int (*set_edid)(struct v4l2_subdev *, struct v4l2_edid *); + int (*dv_timings_cap)(struct v4l2_subdev *, struct v4l2_dv_timings_cap *); + int (*enum_dv_timings)(struct v4l2_subdev *, struct v4l2_enum_dv_timings *); + int (*link_validate)(struct v4l2_subdev *, struct media_link *, struct v4l2_subdev_format *, struct v4l2_subdev_format *); + int (*get_frame_desc)(struct v4l2_subdev *, unsigned int, struct v4l2_mbus_frame_desc *); + int (*set_frame_desc)(struct v4l2_subdev *, unsigned int, struct v4l2_mbus_frame_desc *); + int (*get_mbus_config)(struct v4l2_subdev *, unsigned int, struct v4l2_mbus_config *); +}; + +struct v4l2_subdev_ops { + const struct v4l2_subdev_core_ops *core; + const struct v4l2_subdev_tuner_ops *tuner; + const struct v4l2_subdev_audio_ops *audio; + const struct v4l2_subdev_video_ops *video; + const struct v4l2_subdev_vbi_ops *vbi; + const struct v4l2_subdev_ir_ops *ir; + const struct v4l2_subdev_sensor_ops *sensor; + const struct v4l2_subdev_pad_ops *pad; +}; + +struct v4l2_subdev_fh; + +struct v4l2_subdev_internal_ops { + int (*registered)(struct v4l2_subdev *); + void (*unregistered)(struct v4l2_subdev *); + int (*open)(struct v4l2_subdev *, struct v4l2_subdev_fh *); + int (*close)(struct v4l2_subdev *, struct v4l2_subdev_fh *); + void (*release)(struct v4l2_subdev *); +}; + +struct v4l2_subdev_fh { + struct v4l2_fh vfh; + struct module *owner; + struct v4l2_subdev_state *state; +}; + +struct v4l2_subdev_platform_data { + struct regulator_bulk_data *regulators; + int num_regulators; + void *host_priv; +}; + +struct v4l2_ctrl_hdr10_cll_info { + __u16 max_content_light_level; + __u16 max_pic_average_light_level; +}; + +struct v4l2_ctrl_hdr10_mastering_display { + __u16 display_primaries_x[3]; + __u16 display_primaries_y[3]; + __u16 white_point_x; + __u16 white_point_y; + __u32 max_display_mastering_luminance; + __u32 min_display_mastering_luminance; +}; + +enum v4l2_field { + V4L2_FIELD_ANY = 0, + V4L2_FIELD_NONE = 1, + V4L2_FIELD_TOP = 2, + V4L2_FIELD_BOTTOM = 3, + V4L2_FIELD_INTERLACED = 4, + V4L2_FIELD_SEQ_TB = 5, + V4L2_FIELD_SEQ_BT = 6, + V4L2_FIELD_ALTERNATE = 7, + V4L2_FIELD_INTERLACED_TB = 8, + V4L2_FIELD_INTERLACED_BT = 9, +}; + +enum v4l2_memory { + V4L2_MEMORY_MMAP = 1, + V4L2_MEMORY_USERPTR = 2, + V4L2_MEMORY_OVERLAY = 3, + V4L2_MEMORY_DMABUF = 4, +}; + +enum v4l2_hsv_encoding { + V4L2_HSV_ENC_180 = 128, + V4L2_HSV_ENC_256 = 129, +}; + +enum v4l2_frmsizetypes { + V4L2_FRMSIZE_TYPE_DISCRETE = 1, + V4L2_FRMSIZE_TYPE_CONTINUOUS = 2, + V4L2_FRMSIZE_TYPE_STEPWISE = 3, +}; + +enum v4l2_frmivaltypes { + V4L2_FRMIVAL_TYPE_DISCRETE = 1, + V4L2_FRMIVAL_TYPE_CONTINUOUS = 2, + V4L2_FRMIVAL_TYPE_STEPWISE = 3, +}; + +struct v4l2_cropcap { + __u32 type; + struct v4l2_rect bounds; + struct v4l2_rect defrect; + struct v4l2_fract pixelaspect; +}; + +struct v4l2_crop { + __u32 type; + struct v4l2_rect c; +}; + +struct v4l2_standard { + __u32 index; + long: 32; + v4l2_std_id id; + __u8 name[24]; + struct v4l2_fract frameperiod; + __u32 framelines; + __u32 reserved[4]; + long: 32; +}; + +enum v4l2_ctrl_type { + V4L2_CTRL_TYPE_INTEGER = 1, + V4L2_CTRL_TYPE_BOOLEAN = 2, + V4L2_CTRL_TYPE_MENU = 3, + V4L2_CTRL_TYPE_BUTTON = 4, + V4L2_CTRL_TYPE_INTEGER64 = 5, + V4L2_CTRL_TYPE_CTRL_CLASS = 6, + V4L2_CTRL_TYPE_STRING = 7, + V4L2_CTRL_TYPE_BITMASK = 8, + V4L2_CTRL_TYPE_INTEGER_MENU = 9, + V4L2_CTRL_COMPOUND_TYPES = 256, + V4L2_CTRL_TYPE_U8 = 256, + V4L2_CTRL_TYPE_U16 = 257, + V4L2_CTRL_TYPE_U32 = 258, + V4L2_CTRL_TYPE_AREA = 262, + V4L2_CTRL_TYPE_HDR10_CLL_INFO = 272, + V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY = 273, + V4L2_CTRL_TYPE_H264_SPS = 512, + V4L2_CTRL_TYPE_H264_PPS = 513, + V4L2_CTRL_TYPE_H264_SCALING_MATRIX = 514, + V4L2_CTRL_TYPE_H264_SLICE_PARAMS = 515, + V4L2_CTRL_TYPE_H264_DECODE_PARAMS = 516, + V4L2_CTRL_TYPE_H264_PRED_WEIGHTS = 517, + V4L2_CTRL_TYPE_FWHT_PARAMS = 544, + V4L2_CTRL_TYPE_VP8_FRAME = 576, + V4L2_CTRL_TYPE_MPEG2_QUANTISATION = 592, + V4L2_CTRL_TYPE_MPEG2_SEQUENCE = 593, + V4L2_CTRL_TYPE_MPEG2_PICTURE = 594, + V4L2_CTRL_TYPE_VP9_COMPRESSED_HDR = 608, + V4L2_CTRL_TYPE_VP9_FRAME = 609, + V4L2_CTRL_TYPE_HEVC_SPS = 624, + V4L2_CTRL_TYPE_HEVC_PPS = 625, + V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS = 626, + V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX = 627, + V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS = 628, +}; + +struct v4l2_event_vsync { + __u8 field; +}; + +struct v4l2_event_ctrl { + __u32 changes; + __u32 type; + union { + __s32 value; + __s64 value64; + }; + __u32 flags; + __s32 minimum; + __s32 maximum; + __s32 step; + __s32 default_value; + long: 32; +}; + +struct v4l2_event_frame_sync { + __u32 frame_sequence; +}; + +struct v4l2_event_src_change { + __u32 changes; +}; + +struct v4l2_event_motion_det { + __u32 flags; + __u32 frame_sequence; + __u32 region_mask; +}; + +struct v4l2_event { + __u32 type; + long: 32; + union { + struct v4l2_event_vsync vsync; + struct v4l2_event_ctrl ctrl; + struct v4l2_event_frame_sync frame_sync; + struct v4l2_event_src_change src_change; + struct v4l2_event_motion_det motion_det; + __u8 data[64]; + } u; + __u32 pending; + __u32 sequence; + struct __kernel_timespec timestamp; + __u32 id; + __u32 reserved[8]; + long: 32; +}; + +struct v4l2_dbg_match { + __u32 type; + union { + __u32 addr; + char name[32]; + }; +}; + +struct v4l2_dbg_register { + struct v4l2_dbg_match match; + __u32 size; + __u64 reg; + __u64 val; +}; + +struct v4l2_dbg_chip_info { + struct v4l2_dbg_match match; + char name[32]; + __u32 flags; + __u32 reserved[32]; +}; + +struct v4l2_ctrl; + +typedef void (*v4l2_ctrl_notify_fnc)(struct v4l2_ctrl *, void *); + +struct v4l2_ctrl_ref; + +struct v4l2_ctrl_handler { + struct mutex _lock; + struct mutex *lock; + struct list_head ctrls; + struct list_head ctrl_refs; + struct v4l2_ctrl_ref *cached; + struct v4l2_ctrl_ref **buckets; + v4l2_ctrl_notify_fnc notify; + void *notify_priv; + u16 nr_of_buckets; + int error; + bool request_is_queued; + struct list_head requests; + struct list_head requests_queued; + struct media_request_object req_obj; +}; + +struct vb2_fileio_data; + +struct vb2_threadio_data; + +struct vb2_ops; + +struct vb2_mem_ops; + +struct vb2_buf_ops; + +struct vb2_buffer; + +struct vb2_queue { + unsigned int type; + unsigned int io_modes; + struct device *dev; + long unsigned int dma_attrs; + unsigned int bidirectional: 1; + unsigned int fileio_read_once: 1; + unsigned int fileio_write_immediately: 1; + unsigned int allow_zero_bytesused: 1; + unsigned int quirk_poll_must_check_waiting_for_buffers: 1; + unsigned int supports_requests: 1; + unsigned int requires_requests: 1; + unsigned int uses_qbuf: 1; + unsigned int uses_requests: 1; + unsigned int allow_cache_hints: 1; + unsigned int non_coherent_mem: 1; + struct mutex *lock; + void *owner; + const struct vb2_ops *ops; + const struct vb2_mem_ops *mem_ops; + const struct vb2_buf_ops *buf_ops; + void *drv_priv; + u32 subsystem_flags; + unsigned int buf_struct_size; + u32 timestamp_flags; + gfp_t gfp_flags; + u32 min_buffers_needed; + struct device *alloc_devs[8]; + struct mutex mmap_lock; + unsigned int memory; + enum dma_data_direction dma_dir; + struct vb2_buffer *bufs[32]; + unsigned int num_buffers; + struct list_head queued_list; + unsigned int queued_count; + atomic_t owned_by_drv_count; + struct list_head done_list; + spinlock_t done_lock; + wait_queue_head_t done_wq; + unsigned int streaming: 1; + unsigned int start_streaming_called: 1; + unsigned int error: 1; + unsigned int waiting_for_buffers: 1; + unsigned int waiting_in_dqbuf: 1; + unsigned int is_multiplanar: 1; + unsigned int is_output: 1; + unsigned int copy_timestamp: 1; + unsigned int last_buffer_dequeued: 1; + struct vb2_fileio_data *fileio; + struct vb2_threadio_data *threadio; + char name[32]; +}; + +typedef long int (*v4l2_kioctl)(struct file *, unsigned int, void *); + +struct v4l2_event_time32 { + __u32 type; + long: 32; + union { + struct v4l2_event_vsync vsync; + struct v4l2_event_ctrl ctrl; + struct v4l2_event_frame_sync frame_sync; + struct v4l2_event_src_change src_change; + struct v4l2_event_motion_det motion_det; + __u8 data[64]; + } u; + __u32 pending; + __u32 sequence; + struct old_timespec32 timestamp; + __u32 id; + __u32 reserved[8]; + long: 32; +}; + +struct v4l2_buffer_time32 { + __u32 index; + __u32 type; + __u32 bytesused; + __u32 flags; + __u32 field; + struct old_timeval32 timestamp; + struct v4l2_timecode timecode; + __u32 sequence; + __u32 memory; + union { + __u32 offset; + long unsigned int userptr; + struct v4l2_plane *planes; + __s32 fd; + } m; + __u32 length; + __u32 reserved2; + union { + __s32 request_fd; + __u32 reserved; + }; +}; + +union v4l2_ctrl_ptr { + s32 *p_s32; + s64 *p_s64; + u8 *p_u8; + u16 *p_u16; + u32 *p_u32; + char *p_char; + struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence; + struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture; + struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quantisation; + struct v4l2_ctrl_fwht_params *p_fwht_params; + struct v4l2_ctrl_h264_sps *p_h264_sps; + struct v4l2_ctrl_h264_pps *p_h264_pps; + struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix; + struct v4l2_ctrl_h264_slice_params *p_h264_slice_params; + struct v4l2_ctrl_h264_decode_params *p_h264_decode_params; + struct v4l2_ctrl_h264_pred_weights *p_h264_pred_weights; + struct v4l2_ctrl_vp8_frame *p_vp8_frame; + struct v4l2_ctrl_hevc_sps *p_hevc_sps; + struct v4l2_ctrl_hevc_pps *p_hevc_pps; + struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params; + struct v4l2_ctrl_vp9_compressed_hdr *p_vp9_compressed_hdr_probs; + struct v4l2_ctrl_vp9_frame *p_vp9_frame; + struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll; + struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering; + struct v4l2_area *p_area; + void *p; + const void *p_const; +}; + +struct v4l2_ctrl_ops { + int (*g_volatile_ctrl)(struct v4l2_ctrl *); + int (*try_ctrl)(struct v4l2_ctrl *); + int (*s_ctrl)(struct v4l2_ctrl *); +}; + +struct v4l2_ctrl_type_ops; + +struct v4l2_ctrl { + struct list_head node; + struct list_head ev_subs; + struct v4l2_ctrl_handler *handler; + struct v4l2_ctrl **cluster; + unsigned int ncontrols; + unsigned int done: 1; + unsigned int is_new: 1; + unsigned int has_changed: 1; + unsigned int is_private: 1; + unsigned int is_auto: 1; + unsigned int is_int: 1; + unsigned int is_string: 1; + unsigned int is_ptr: 1; + unsigned int is_array: 1; + unsigned int is_dyn_array: 1; + unsigned int has_volatiles: 1; + unsigned int call_notify: 1; + unsigned int manual_mode_value: 8; + const struct v4l2_ctrl_ops *ops; + const struct v4l2_ctrl_type_ops *type_ops; + u32 id; + const char *name; + enum v4l2_ctrl_type type; + long: 32; + s64 minimum; + s64 maximum; + s64 default_value; + u32 elems; + u32 elem_size; + u32 new_elems; + u32 dims[4]; + u32 nr_of_dims; + union { + u64 step; + u64 menu_skip_mask; + }; + union { + const char * const *qmenu; + const s64 *qmenu_int; + }; + long unsigned int flags; + void *priv; + void *p_array; + u32 p_array_alloc_elems; + s32 val; + struct { + s32 val; + } cur; + union v4l2_ctrl_ptr p_def; + union v4l2_ctrl_ptr p_new; + union v4l2_ctrl_ptr p_cur; +}; + +struct v4l2_ctrl_type_ops { + bool (*equal)(const struct v4l2_ctrl *, union v4l2_ctrl_ptr, union v4l2_ctrl_ptr); + void (*init)(const struct v4l2_ctrl *, u32, union v4l2_ctrl_ptr); + void (*log)(const struct v4l2_ctrl *); + int (*validate)(const struct v4l2_ctrl *, union v4l2_ctrl_ptr); +}; + +struct v4l2_ctrl_helper; + +struct v4l2_ctrl_ref { + struct list_head node; + struct v4l2_ctrl_ref *next; + struct v4l2_ctrl *ctrl; + struct v4l2_ctrl_helper *helper; + bool from_other_dev; + bool req_done; + bool p_req_valid; + bool p_req_array_enomem; + u32 p_req_array_alloc_elems; + u32 p_req_elems; + union v4l2_ctrl_ptr p_req; +}; + +struct v4l2_m2m_dev; + +struct v4l2_m2m_queue_ctx { + struct vb2_queue q; + struct list_head rdy_queue; + spinlock_t rdy_spinlock; + u8 num_rdy; + bool buffered; +}; + +struct vb2_v4l2_buffer; + +struct v4l2_m2m_ctx { + struct mutex *q_lock; + bool new_frame; + bool is_draining; + struct vb2_v4l2_buffer *last_src_buf; + bool next_buf_last; + bool has_stopped; + struct v4l2_m2m_dev *m2m_dev; + struct v4l2_m2m_queue_ctx cap_q_ctx; + struct v4l2_m2m_queue_ctx out_q_ctx; + struct list_head queue; + long unsigned int job_flags; + wait_queue_head_t finished; + void *priv; +}; + +struct vb2_mem_ops { + void * (*alloc)(struct vb2_buffer *, struct device *, long unsigned int); + void (*put)(void *); + struct dma_buf * (*get_dmabuf)(struct vb2_buffer *, void *, long unsigned int); + void * (*get_userptr)(struct vb2_buffer *, struct device *, long unsigned int, long unsigned int); + void (*put_userptr)(void *); + void (*prepare)(void *); + void (*finish)(void *); + void * (*attach_dmabuf)(struct vb2_buffer *, struct device *, struct dma_buf *, long unsigned int); + void (*detach_dmabuf)(void *); + int (*map_dmabuf)(void *); + void (*unmap_dmabuf)(void *); + void * (*vaddr)(struct vb2_buffer *, void *); + void * (*cookie)(struct vb2_buffer *, void *); + unsigned int (*num_users)(void *); + int (*mmap)(void *, struct vm_area_struct *); +}; + +enum vb2_buffer_state { + VB2_BUF_STATE_DEQUEUED = 0, + VB2_BUF_STATE_IN_REQUEST = 1, + VB2_BUF_STATE_PREPARING = 2, + VB2_BUF_STATE_QUEUED = 3, + VB2_BUF_STATE_ACTIVE = 4, + VB2_BUF_STATE_DONE = 5, + VB2_BUF_STATE_ERROR = 6, +}; + +struct vb2_plane { + void *mem_priv; + struct dma_buf *dbuf; + unsigned int dbuf_mapped; + unsigned int bytesused; + unsigned int length; + unsigned int min_length; + union { + unsigned int offset; + long unsigned int userptr; + int fd; + } m; + unsigned int data_offset; +}; + +struct vb2_buffer { + struct vb2_queue *vb2_queue; + unsigned int index; + unsigned int type; + unsigned int memory; + unsigned int num_planes; + long: 32; + u64 timestamp; + struct media_request *request; + struct media_request_object req_obj; + enum vb2_buffer_state state; + unsigned int synced: 1; + unsigned int prepared: 1; + unsigned int copied_timestamp: 1; + unsigned int skip_cache_sync_on_prepare: 1; + unsigned int skip_cache_sync_on_finish: 1; + struct vb2_plane planes[8]; + struct list_head queued_entry; + struct list_head done_entry; +}; + +struct vb2_ops { + int (*queue_setup)(struct vb2_queue *, unsigned int *, unsigned int *, unsigned int *, struct device **); + void (*wait_prepare)(struct vb2_queue *); + void (*wait_finish)(struct vb2_queue *); + int (*buf_out_validate)(struct vb2_buffer *); + int (*buf_init)(struct vb2_buffer *); + int (*buf_prepare)(struct vb2_buffer *); + void (*buf_finish)(struct vb2_buffer *); + void (*buf_cleanup)(struct vb2_buffer *); + int (*prepare_streaming)(struct vb2_queue *); + int (*start_streaming)(struct vb2_queue *, unsigned int); + void (*stop_streaming)(struct vb2_queue *); + void (*unprepare_streaming)(struct vb2_queue *); + void (*buf_queue)(struct vb2_buffer *); + void (*buf_request_complete)(struct vb2_buffer *); +}; + +struct vb2_buf_ops { + int (*verify_planes_array)(struct vb2_buffer *, const void *); + void (*init_buffer)(struct vb2_buffer *); + void (*fill_user_buffer)(struct vb2_buffer *, void *); + int (*fill_vb2_buffer)(struct vb2_buffer *, struct vb2_plane *); + void (*copy_timestamp)(struct vb2_buffer *, const void *); +}; + +struct vb2_v4l2_buffer { + struct vb2_buffer vb2_buf; + __u32 flags; + __u32 field; + struct v4l2_timecode timecode; + __u32 sequence; + __s32 request_fd; + bool is_held; + struct vb2_plane planes[8]; + long: 32; +}; + +struct std_descr { + v4l2_std_id std; + const char *descr; + long: 32; +}; + +struct v4l2_ioctl_info { + unsigned int ioctl; + u32 flags; + const char * const name; + int (*func)(const struct v4l2_ioctl_ops *, struct file *, void *, void *); + void (*debug)(const void *, bool); +}; + +typedef bool (*v4l2_ctrl_filter)(const struct v4l2_ctrl *); + +struct v4l2_subscribed_event; + +struct v4l2_kevent { + struct list_head list; + struct v4l2_subscribed_event *sev; + long: 32; + struct v4l2_event event; + u64 ts; +}; + +struct v4l2_subscribed_event_ops; + +struct v4l2_subscribed_event { + struct list_head list; + u32 type; + u32 id; + u32 flags; + struct v4l2_fh *fh; + struct list_head node; + const struct v4l2_subscribed_event_ops *ops; + unsigned int elems; + unsigned int first; + unsigned int in_use; + struct v4l2_kevent events[0]; +}; + +struct v4l2_subscribed_event_ops { + int (*add)(struct v4l2_subscribed_event *, unsigned int); + void (*del)(struct v4l2_subscribed_event *); + void (*replace)(struct v4l2_event *, const struct v4l2_event *); + void (*merge)(const struct v4l2_event *, struct v4l2_event *); +}; + +struct v4l2_subdev; + +enum v4l2_subdev_format_whence { + V4L2_SUBDEV_FORMAT_TRY = 0, + V4L2_SUBDEV_FORMAT_ACTIVE = 1, +}; + +struct v4l2_subdev_crop { + __u32 which; + __u32 pad; + struct v4l2_rect rect; + __u32 reserved[8]; +}; + +struct v4l2_subdev_capability { + __u32 version; + __u32 capabilities; + __u32 reserved[14]; +}; + +enum v4l2_pixel_encoding { + V4L2_PIXEL_ENC_UNKNOWN = 0, + V4L2_PIXEL_ENC_YUV = 1, + V4L2_PIXEL_ENC_RGB = 2, + V4L2_PIXEL_ENC_BAYER = 3, +}; + +struct v4l2_format_info { + u32 format; + u8 pixel_enc; + u8 mem_planes; + u8 comp_planes; + u8 bpp[4]; + u8 hdiv; + u8 vdiv; + u8 block_w[4]; + u8 block_h[4]; +}; + +struct v4l2_ctrl_config { + const struct v4l2_ctrl_ops *ops; + const struct v4l2_ctrl_type_ops *type_ops; + u32 id; + const char *name; + enum v4l2_ctrl_type type; + long: 32; + s64 min; + s64 max; + u64 step; + s64 def; + union v4l2_ctrl_ptr p_def; + u32 dims[4]; + u32 elem_size; + u32 flags; + long: 32; + u64 menu_skip_mask; + const char * const *qmenu; + const s64 *qmenu_int; + unsigned int is_private: 1; + long: 32; +}; + +enum v4l2_fwnode_orientation { + V4L2_FWNODE_ORIENTATION_FRONT = 0, + V4L2_FWNODE_ORIENTATION_BACK = 1, + V4L2_FWNODE_ORIENTATION_EXTERNAL = 2, +}; + +struct v4l2_fwnode_device_properties { + enum v4l2_fwnode_orientation orientation; + unsigned int rotation; +}; + +struct v4l2_ctrl_helper { + struct v4l2_ctrl_ref *mref; + struct v4l2_ctrl_ref *ref; + u32 next; +}; + +struct trace_event_raw_v4l2_event_class { + struct trace_entry ent; + int minor; + u32 index; + u32 type; + u32 bytesused; + u32 flags; + u32 field; + s64 timestamp; + u32 timecode_type; + u32 timecode_flags; + u8 timecode_frames; + u8 timecode_seconds; + u8 timecode_minutes; + u8 timecode_hours; + u8 timecode_userbits0; + u8 timecode_userbits1; + u8 timecode_userbits2; + u8 timecode_userbits3; + u32 sequence; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_vb2_v4l2_event_class { + struct trace_entry ent; + int minor; + u32 flags; + u32 field; + long: 32; + u64 timestamp; + u32 timecode_type; + u32 timecode_flags; + u8 timecode_frames; + u8 timecode_seconds; + u8 timecode_minutes; + u8 timecode_hours; + u8 timecode_userbits0; + u8 timecode_userbits1; + u8 timecode_userbits2; + u8 timecode_userbits3; + u32 sequence; + char __data[0]; + long: 32; +}; + +struct trace_event_data_offsets_v4l2_event_class {}; + +struct trace_event_data_offsets_vb2_v4l2_event_class {}; + +typedef void (*btf_trace_v4l2_dqbuf)(void *, int, struct v4l2_buffer *); + +typedef void (*btf_trace_v4l2_qbuf)(void *, int, struct v4l2_buffer *); + +typedef void (*btf_trace_vb2_v4l2_buf_done)(void *, struct vb2_queue *, struct vb2_buffer *); + +typedef void (*btf_trace_vb2_v4l2_buf_queue)(void *, struct vb2_queue *, struct vb2_buffer *); + +typedef void (*btf_trace_vb2_v4l2_dqbuf)(void *, struct vb2_queue *, struct vb2_buffer *); + +typedef void (*btf_trace_vb2_v4l2_qbuf)(void *, struct vb2_queue *, struct vb2_buffer *); + +enum v4l2_i2c_tuner_type { + ADDRS_RADIO = 0, + ADDRS_DEMOD = 1, + ADDRS_TV = 2, + ADDRS_TV_WITH_DEMOD = 3, +}; + +enum dmx_output { + DMX_OUT_DECODER = 0, + DMX_OUT_TAP = 1, + DMX_OUT_TS_TAP = 2, + DMX_OUT_TSDEMUX_TAP = 3, +}; + +enum dmx_input { + DMX_IN_FRONTEND = 0, + DMX_IN_DVR = 1, +}; + +enum dmx_ts_pes { + DMX_PES_AUDIO0 = 0, + DMX_PES_VIDEO0 = 1, + DMX_PES_TELETEXT0 = 2, + DMX_PES_SUBTITLE0 = 3, + DMX_PES_PCR0 = 4, + DMX_PES_AUDIO1 = 5, + DMX_PES_VIDEO1 = 6, + DMX_PES_TELETEXT1 = 7, + DMX_PES_SUBTITLE1 = 8, + DMX_PES_PCR1 = 9, + DMX_PES_AUDIO2 = 10, + DMX_PES_VIDEO2 = 11, + DMX_PES_TELETEXT2 = 12, + DMX_PES_SUBTITLE2 = 13, + DMX_PES_PCR2 = 14, + DMX_PES_AUDIO3 = 15, + DMX_PES_VIDEO3 = 16, + DMX_PES_TELETEXT3 = 17, + DMX_PES_SUBTITLE3 = 18, + DMX_PES_PCR3 = 19, + DMX_PES_OTHER = 20, +}; + +struct dmx_filter { + __u8 filter[16]; + __u8 mask[16]; + __u8 mode[16]; +}; + +struct dmx_sct_filter_params { + __u16 pid; + struct dmx_filter filter; + __u32 timeout; + __u32 flags; +}; + +struct dmx_pes_filter_params { + __u16 pid; + enum dmx_input input; + enum dmx_output output; + enum dmx_ts_pes pes_type; + __u32 flags; +}; + +struct dmx_stc { + unsigned int num; + unsigned int base; + __u64 stc; +}; + +enum dmx_buffer_flags { + DMX_BUFFER_FLAG_HAD_CRC32_DISCARD = 1, + DMX_BUFFER_FLAG_TEI = 2, + DMX_BUFFER_PKT_COUNTER_MISMATCH = 4, + DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED = 8, + DMX_BUFFER_FLAG_DISCONTINUITY_INDICATOR = 16, +}; + +enum ts_filter_type { + TS_PACKET = 1, + TS_PAYLOAD_ONLY = 2, + TS_DECODER = 4, + TS_DEMUX = 8, +}; + +struct dmx_demux; + +struct dmx_ts_feed { + int is_filtering; + struct dmx_demux *parent; + void *priv; + int (*set)(struct dmx_ts_feed *, u16, int, enum dmx_ts_pes, ktime_t); + int (*start_filtering)(struct dmx_ts_feed *); + int (*stop_filtering)(struct dmx_ts_feed *); +}; + +enum dmx_demux_caps { + DMX_TS_FILTERING = 1, + DMX_SECTION_FILTERING = 4, + DMX_MEMORY_BASED_FILTERING = 8, +}; + +typedef int (*dmx_ts_cb)(const u8 *, size_t, const u8 *, size_t, struct dmx_ts_feed *, u32 *); + +struct dmx_section_filter; + +typedef int (*dmx_section_cb)(const u8 *, size_t, const u8 *, size_t, struct dmx_section_filter *, u32 *); + +struct dmx_frontend; + +struct dmx_section_feed; + +struct dmx_demux { + enum dmx_demux_caps capabilities; + struct dmx_frontend *frontend; + void *priv; + int (*open)(struct dmx_demux *); + int (*close)(struct dmx_demux *); + int (*write)(struct dmx_demux *, const char *, size_t); + int (*allocate_ts_feed)(struct dmx_demux *, struct dmx_ts_feed **, dmx_ts_cb); + int (*release_ts_feed)(struct dmx_demux *, struct dmx_ts_feed *); + int (*allocate_section_feed)(struct dmx_demux *, struct dmx_section_feed **, dmx_section_cb); + int (*release_section_feed)(struct dmx_demux *, struct dmx_section_feed *); + int (*add_frontend)(struct dmx_demux *, struct dmx_frontend *); + int (*remove_frontend)(struct dmx_demux *, struct dmx_frontend *); + struct list_head * (*get_frontends)(struct dmx_demux *); + int (*connect_frontend)(struct dmx_demux *, struct dmx_frontend *); + int (*disconnect_frontend)(struct dmx_demux *); + int (*get_pes_pids)(struct dmx_demux *, u16 *); + int (*get_stc)(struct dmx_demux *, unsigned int, u64 *, unsigned int *); +}; + +struct dmx_section_filter { + u8 filter_value[18]; + u8 filter_mask[18]; + u8 filter_mode[18]; + struct dmx_section_feed *parent; + void *priv; +}; + +struct dmx_section_feed { + int is_filtering; + struct dmx_demux *parent; + void *priv; + int check_crc; + u32 crc_val; + u8 *secbuf; + u8 secbuf_base[4284]; + u16 secbufp; + u16 seclen; + u16 tsfeedp; + int (*set)(struct dmx_section_feed *, u16, int); + int (*allocate_filter)(struct dmx_section_feed *, struct dmx_section_filter **); + int (*release_filter)(struct dmx_section_feed *, struct dmx_section_filter *); + int (*start_filtering)(struct dmx_section_feed *); + int (*stop_filtering)(struct dmx_section_feed *); +}; + +enum dmx_frontend_source { + DMX_MEMORY_FE = 0, + DMX_FRONTEND_0 = 1, +}; + +struct dmx_frontend { + struct list_head connectivity_list; + enum dmx_frontend_source source; +}; + +struct dvb_ringbuffer { + u8 *data; + ssize_t size; + ssize_t pread; + ssize_t pwrite; + int error; + wait_queue_head_t queue; + spinlock_t lock; +}; + +struct dvb_buffer { + struct vb2_buffer vb; + struct list_head list; +}; + +struct dvb_vb2_ctx { + struct vb2_queue vb_q; + struct mutex mutex; + spinlock_t slock; + struct list_head dvb_q; + struct dvb_buffer *buf; + int offset; + int remain; + int state; + int buf_siz; + int buf_cnt; + int nonblocking; + enum dmx_buffer_flags flags; + u32 count; + char name[21]; +}; + +enum dmxdev_type { + DMXDEV_TYPE_NONE = 0, + DMXDEV_TYPE_SEC = 1, + DMXDEV_TYPE_PES = 2, +}; + +enum dmxdev_state { + DMXDEV_STATE_FREE = 0, + DMXDEV_STATE_ALLOCATED = 1, + DMXDEV_STATE_SET = 2, + DMXDEV_STATE_GO = 3, + DMXDEV_STATE_DONE = 4, + DMXDEV_STATE_TIMEDOUT = 5, +}; + +struct dmxdev_feed { + u16 pid; + struct dmx_ts_feed *ts; + struct list_head next; +}; + +struct dmxdev; + +struct dmxdev_filter { + union { + struct dmx_section_filter *sec; + } filter; + union { + struct list_head ts; + struct dmx_section_feed *sec; + } feed; + union { + struct dmx_sct_filter_params sec; + struct dmx_pes_filter_params pes; + } params; + enum dmxdev_type type; + enum dmxdev_state state; + struct dmxdev *dev; + struct dvb_ringbuffer buffer; + struct dvb_vb2_ctx vb2_ctx; + struct mutex mutex; + struct timer_list timer; + int todo; + u8 secheader[3]; +}; + +struct dmxdev { + struct dvb_device *dvbdev; + struct dvb_device *dvr_dvbdev; + struct dmxdev_filter *filter; + struct dmx_demux *demux; + int filternum; + int capabilities; + unsigned int may_do_mmap: 1; + unsigned int exit: 1; + struct dmx_frontend *dvr_orig_fe; + struct dvb_ringbuffer dvr_buffer; + struct dvb_vb2_ctx dvr_vb2_ctx; + struct mutex mutex; + spinlock_t lock; +}; + +enum dvb_dmx_filter_type { + DMX_TYPE_TS = 0, + DMX_TYPE_SEC = 1, +}; + +enum dvb_dmx_state { + DMX_STATE_FREE = 0, + DMX_STATE_ALLOCATED = 1, + DMX_STATE_READY = 2, + DMX_STATE_GO = 3, +}; + +struct dvb_demux_feed; + +struct dvb_demux_filter { + struct dmx_section_filter filter; + u8 maskandmode[18]; + u8 maskandnotmode[18]; + bool doneq; + struct dvb_demux_filter *next; + struct dvb_demux_feed *feed; + int index; + enum dvb_dmx_state state; + enum dvb_dmx_filter_type type; + u16 hw_handle; +}; + +struct dvb_demux; + +struct dvb_demux_feed { + union { + struct dmx_ts_feed ts; + struct dmx_section_feed sec; + } feed; + union { + dmx_ts_cb ts; + dmx_section_cb sec; + } cb; + struct dvb_demux *demux; + void *priv; + enum dvb_dmx_filter_type type; + enum dvb_dmx_state state; + u16 pid; + ktime_t timeout; + struct dvb_demux_filter *filter; + u32 buffer_flags; + enum ts_filter_type ts_type; + enum dmx_ts_pes pes_type; + int cc; + bool pusi_seen; + u16 peslen; + struct list_head list_head; + unsigned int index; + long: 32; +}; + +struct dvb_demux { + struct dmx_demux dmx; + void *priv; + int filternum; + int feednum; + int (*start_feed)(struct dvb_demux_feed *); + int (*stop_feed)(struct dvb_demux_feed *); + int (*write_to_decoder)(struct dvb_demux_feed *, const u8 *, size_t); + u32 (*check_crc32)(struct dvb_demux_feed *, const u8 *, size_t); + void (*memcopy)(struct dvb_demux_feed *, u8 *, const u8 *, size_t); + int users; + struct dvb_demux_filter *filter; + struct dvb_demux_feed *feed; + struct list_head frontend_list; + struct dvb_demux_feed *pesfilter[20]; + u16 pids[20]; + struct list_head feed_list; + u8 tsbuf[204]; + int tsbufp; + struct mutex mutex; + spinlock_t lock; + uint8_t *cnt_storage; + long: 32; + ktime_t speed_last_time; + uint32_t speed_pkts_cnt; + int playing; + int recording; + long: 32; +}; + +struct ca_slot_info { + int num; + int type; + unsigned int flags; +}; + +struct ca_caps { + unsigned int slot_num; + unsigned int slot_type; + unsigned int descr_num; + unsigned int descr_type; +}; + +struct dvb_ca_en50221 { + struct module *owner; + int (*read_attribute_mem)(struct dvb_ca_en50221 *, int, int); + int (*write_attribute_mem)(struct dvb_ca_en50221 *, int, int, u8); + int (*read_cam_control)(struct dvb_ca_en50221 *, int, u8); + int (*write_cam_control)(struct dvb_ca_en50221 *, int, u8, u8); + int (*read_data)(struct dvb_ca_en50221 *, int, u8 *, int); + int (*write_data)(struct dvb_ca_en50221 *, int, u8 *, int); + int (*slot_reset)(struct dvb_ca_en50221 *, int); + int (*slot_shutdown)(struct dvb_ca_en50221 *, int); + int (*slot_ts_enable)(struct dvb_ca_en50221 *, int); + int (*poll_slot_status)(struct dvb_ca_en50221 *, int, int); + void *data; + void *private; +}; + +struct dvb_ca_slot { + int slot_state; + struct mutex slot_lock; + atomic_t camchange_count; + int camchange_type; + u32 config_base; + u8 config_option; + u8 da_irq_supported: 1; + int link_buf_size; + struct dvb_ringbuffer rx_buffer; + long unsigned int timeout; +}; + +struct dvb_ca_private { + struct kref refcount; + struct dvb_ca_en50221 *pub; + struct dvb_device *dvbdev; + u32 flags; + unsigned int slot_count; + struct dvb_ca_slot *slot_info; + wait_queue_head_t wait_queue; + struct task_struct *thread; + unsigned int open: 1; + unsigned int wakeup: 1; + long unsigned int delay; + int next_read_slot; + struct mutex ioctl_mutex; +}; + +enum fe_type { + FE_QPSK = 0, + FE_QAM = 1, + FE_OFDM = 2, + FE_ATSC = 3, +}; + +struct dvb_frontend_info { + char name[128]; + enum fe_type type; + __u32 frequency_min; + __u32 frequency_max; + __u32 frequency_stepsize; + __u32 frequency_tolerance; + __u32 symbol_rate_min; + __u32 symbol_rate_max; + __u32 symbol_rate_tolerance; + __u32 notifier_delay; + enum fe_caps caps; +}; + +struct dtv_property { + __u32 cmd; + __u32 reserved[3]; + union { + __u32 data; + struct dtv_fe_stats st; + struct { + __u8 data[32]; + __u32 len; + __u32 reserved1[3]; + void *reserved2; + } buffer; + } u; + int result; +}; + +struct dtv_properties { + __u32 num; + struct dtv_property *props; +}; + +enum fe_bandwidth { + BANDWIDTH_8_MHZ = 0, + BANDWIDTH_7_MHZ = 1, + BANDWIDTH_6_MHZ = 2, + BANDWIDTH_AUTO = 3, + BANDWIDTH_5_MHZ = 4, + BANDWIDTH_10_MHZ = 5, + BANDWIDTH_1_712_MHZ = 6, +}; + +typedef enum fe_status fe_status_t; + +typedef enum fe_spectral_inversion fe_spectral_inversion_t; + +typedef enum fe_code_rate fe_code_rate_t; + +typedef enum fe_modulation fe_modulation_t; + +typedef enum fe_transmit_mode fe_transmit_mode_t; + +typedef enum fe_bandwidth fe_bandwidth_t; + +typedef enum fe_guard_interval fe_guard_interval_t; + +typedef enum fe_hierarchy fe_hierarchy_t; + +struct dvb_qpsk_parameters { + __u32 symbol_rate; + fe_code_rate_t fec_inner; +}; + +struct dvb_qam_parameters { + __u32 symbol_rate; + fe_code_rate_t fec_inner; + fe_modulation_t modulation; +}; + +struct dvb_vsb_parameters { + fe_modulation_t modulation; +}; + +struct dvb_ofdm_parameters { + fe_bandwidth_t bandwidth; + fe_code_rate_t code_rate_HP; + fe_code_rate_t code_rate_LP; + fe_modulation_t constellation; + fe_transmit_mode_t transmission_mode; + fe_guard_interval_t guard_interval; + fe_hierarchy_t hierarchy_information; +}; + +struct dvb_frontend_parameters { + __u32 frequency; + fe_spectral_inversion_t inversion; + union { + struct dvb_qpsk_parameters qpsk; + struct dvb_qam_parameters qam; + struct dvb_ofdm_parameters ofdm; + struct dvb_vsb_parameters vsb; + } u; +}; + +struct dvb_frontend_event { + fe_status_t status; + struct dvb_frontend_parameters parameters; +}; + +struct dvb_fe_events { + struct dvb_frontend_event events[8]; + int eventw; + int eventr; + int overflow; + wait_queue_head_t wait_queue; + struct mutex mtx; +}; + +struct dvb_frontend_private { + struct dvb_device *dvbdev; + struct dvb_frontend_parameters parameters_out; + struct dvb_fe_events events; + struct semaphore sem; + struct list_head list_head; + wait_queue_head_t wait_queue; + struct task_struct *thread; + long unsigned int release_jiffies; + unsigned int wakeup; + enum fe_status status; + long unsigned int tune_mode_flags; + unsigned int delay; + unsigned int reinitialise; + int tone; + int voltage; + unsigned int state; + unsigned int bending; + int lnb_drift; + unsigned int inversion; + unsigned int auto_step; + unsigned int auto_sub_step; + unsigned int started_auto_step; + unsigned int min_delay; + unsigned int max_drift; + unsigned int step_size; + int quality; + unsigned int check_wrapped; + enum dvbfe_search algo_status; + struct media_pipeline pipe; +}; + +enum dvbv3_emulation_type { + DVBV3_UNKNOWN = 0, + DVBV3_QPSK = 1, + DVBV3_QAM = 2, + DVBV3_OFDM = 3, + DVBV3_ATSC = 4, +}; + +struct ipv4_devconf { + void *sysctl; + int data[33]; + long unsigned int state[2]; +}; + +struct netdev_hw_addr { + struct list_head list; + struct rb_node node; + unsigned char addr[32]; + unsigned char type; + bool global_use; + int sync_cnt; + int refcount; + int synced; + struct callback_head callback_head; +}; + +struct in_ifaddr; + +struct ip_mc_list; + +struct in_device { + struct net_device *dev; + netdevice_tracker dev_tracker; + refcount_t refcnt; + int dead; + struct in_ifaddr *ifa_list; + struct ip_mc_list *mc_list; + struct ip_mc_list **mc_hash; + int mc_count; + spinlock_t mc_tomb_lock; + struct ip_mc_list *mc_tomb; + long unsigned int mr_v1_seen; + long unsigned int mr_v2_seen; + long unsigned int mr_maxdelay; + long unsigned int mr_qi; + long unsigned int mr_qri; + unsigned char mr_qrv; + unsigned char mr_gq_running; + u32 mr_ifc_count; + struct timer_list mr_gq_timer; + struct timer_list mr_ifc_timer; + struct neigh_parms *arp_parms; + struct ipv4_devconf cnf; + struct callback_head callback_head; +}; + +struct dvb_net_if { + __u16 pid; + __u16 if_num; + __u8 feedtype; +}; + +struct __dvb_net_if_old { + __u16 pid; + __u16 if_num; +}; + +enum { + IPV4_DEVCONF_FORWARDING = 1, + IPV4_DEVCONF_MC_FORWARDING = 2, + IPV4_DEVCONF_PROXY_ARP = 3, + IPV4_DEVCONF_ACCEPT_REDIRECTS = 4, + IPV4_DEVCONF_SECURE_REDIRECTS = 5, + IPV4_DEVCONF_SEND_REDIRECTS = 6, + IPV4_DEVCONF_SHARED_MEDIA = 7, + IPV4_DEVCONF_RP_FILTER = 8, + IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE = 9, + IPV4_DEVCONF_BOOTP_RELAY = 10, + IPV4_DEVCONF_LOG_MARTIANS = 11, + IPV4_DEVCONF_TAG = 12, + IPV4_DEVCONF_ARPFILTER = 13, + IPV4_DEVCONF_MEDIUM_ID = 14, + IPV4_DEVCONF_NOXFRM = 15, + IPV4_DEVCONF_NOPOLICY = 16, + IPV4_DEVCONF_FORCE_IGMP_VERSION = 17, + IPV4_DEVCONF_ARP_ANNOUNCE = 18, + IPV4_DEVCONF_ARP_IGNORE = 19, + IPV4_DEVCONF_PROMOTE_SECONDARIES = 20, + IPV4_DEVCONF_ARP_ACCEPT = 21, + IPV4_DEVCONF_ARP_NOTIFY = 22, + IPV4_DEVCONF_ACCEPT_LOCAL = 23, + IPV4_DEVCONF_SRC_VMARK = 24, + IPV4_DEVCONF_PROXY_ARP_PVLAN = 25, + IPV4_DEVCONF_ROUTE_LOCALNET = 26, + IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL = 27, + IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL = 28, + IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 29, + IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 30, + IPV4_DEVCONF_DROP_GRATUITOUS_ARP = 31, + IPV4_DEVCONF_BC_FORWARDING = 32, + IPV4_DEVCONF_ARP_EVICT_NOCARRIER = 33, + __IPV4_DEVCONF_MAX = 34, +}; + +struct in_ifaddr { + struct hlist_node hash; + struct in_ifaddr *ifa_next; + struct in_device *ifa_dev; + struct callback_head callback_head; + __be32 ifa_local; + __be32 ifa_address; + __be32 ifa_mask; + __u32 ifa_rt_priority; + __be32 ifa_broadcast; + unsigned char ifa_scope; + unsigned char ifa_prefixlen; + unsigned char ifa_proto; + __u32 ifa_flags; + char ifa_label[16]; + __u32 ifa_valid_lft; + __u32 ifa_preferred_lft; + long unsigned int ifa_cstamp; + long unsigned int ifa_tstamp; +}; + +struct dvb_net { + struct dvb_device *dvbdev; + struct net_device *device[10]; + int state[10]; + unsigned int exit: 1; + struct dmx_demux *demux; + struct mutex ioctl_mutex; +}; + +struct dvb_net_priv { + int in_use; + u16 pid; + struct net_device *net; + struct dvb_net *host; + struct dmx_demux *demux; + struct dmx_section_feed *secfeed; + struct dmx_section_filter *secfilter; + struct dmx_ts_feed *tsfeed; + int multi_num; + struct dmx_section_filter *multi_secfilter[10]; + unsigned char multi_macs[60]; + int rx_mode; + struct work_struct set_multicast_list_wq; + struct work_struct restart_net_feed_wq; + unsigned char feedtype; + int need_pusi; + unsigned char tscc; + struct sk_buff *ule_skb; + unsigned char *ule_next_hdr; + short unsigned int ule_sndu_len; + short unsigned int ule_sndu_type; + unsigned char ule_sndu_type_1; + unsigned char ule_dbit; + unsigned char ule_bridged; + int ule_sndu_remain; + long unsigned int ts_count; + struct mutex mutex; +}; + +struct dvb_net_ule_handle { + struct net_device *dev; + struct dvb_net_priv *priv; + struct ethhdr *ethh; + const u8 *buf; + size_t buf_len; + long unsigned int skipped; + const u8 *ts; + const u8 *ts_end; + const u8 *from_where; + u8 ts_remain; + u8 how_much; + u8 new_ts; + bool error; +}; + +struct usb_device; + +struct usb_interface; + +struct usb_endpoint_descriptor; + +struct urb; + +struct si470x_device { + struct v4l2_device v4l2_dev; + struct video_device videodev; + struct v4l2_ctrl_handler hdl; + int band; + short unsigned int registers[16]; + wait_queue_head_t read_queue; + struct mutex lock; + unsigned char *buffer; + unsigned int buf_size; + unsigned int rd_index; + unsigned int wr_index; + struct completion completion; + bool status_rssi_auto_update; + int (*get_register)(struct si470x_device *, int); + int (*set_register)(struct si470x_device *, int); + int (*fops_open)(struct file *); + int (*fops_release)(struct file *); + int (*vidioc_querycap)(struct file *, void *, struct v4l2_capability *); + struct usb_device *usbdev; + struct usb_interface *intf; + char *usb_buf; + char *int_in_buffer; + struct usb_endpoint_descriptor *int_in_endpoint; + struct urb *int_in_urb; + int int_in_running; + unsigned char software_version; + unsigned char hardware_version; + long: 32; +}; + +struct as3722_poweroff { + struct device *dev; + struct as3722 *as3722; +}; + +struct gpio_restart { + struct gpio_desc *reset_gpio; + struct notifier_block restart_handler; + u32 active_delay_ms; + u32 inactive_delay_ms; + u32 wait_delay_ms; +}; + +enum vexpress_reset_func { + FUNC_RESET = 0, + FUNC_SHUTDOWN = 1, + FUNC_REBOOT = 2, +}; + +struct syscon_reboot_context { + struct regmap *map; + u32 offset; + u32 value; + u32 mask; + struct notifier_block restart_handler; +}; + +enum { + POWER_SUPPLY_TECHNOLOGY_UNKNOWN = 0, + POWER_SUPPLY_TECHNOLOGY_NiMH = 1, + POWER_SUPPLY_TECHNOLOGY_LION = 2, + POWER_SUPPLY_TECHNOLOGY_LIPO = 3, + POWER_SUPPLY_TECHNOLOGY_LiFe = 4, + POWER_SUPPLY_TECHNOLOGY_NiCd = 5, + POWER_SUPPLY_TECHNOLOGY_LiMn = 6, +}; + +enum power_supply_property { + POWER_SUPPLY_PROP_STATUS = 0, + POWER_SUPPLY_PROP_CHARGE_TYPE = 1, + POWER_SUPPLY_PROP_HEALTH = 2, + POWER_SUPPLY_PROP_PRESENT = 3, + POWER_SUPPLY_PROP_ONLINE = 4, + POWER_SUPPLY_PROP_AUTHENTIC = 5, + POWER_SUPPLY_PROP_TECHNOLOGY = 6, + POWER_SUPPLY_PROP_CYCLE_COUNT = 7, + POWER_SUPPLY_PROP_VOLTAGE_MAX = 8, + POWER_SUPPLY_PROP_VOLTAGE_MIN = 9, + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN = 10, + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN = 11, + POWER_SUPPLY_PROP_VOLTAGE_NOW = 12, + POWER_SUPPLY_PROP_VOLTAGE_AVG = 13, + POWER_SUPPLY_PROP_VOLTAGE_OCV = 14, + POWER_SUPPLY_PROP_VOLTAGE_BOOT = 15, + POWER_SUPPLY_PROP_CURRENT_MAX = 16, + POWER_SUPPLY_PROP_CURRENT_NOW = 17, + POWER_SUPPLY_PROP_CURRENT_AVG = 18, + POWER_SUPPLY_PROP_CURRENT_BOOT = 19, + POWER_SUPPLY_PROP_POWER_NOW = 20, + POWER_SUPPLY_PROP_POWER_AVG = 21, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN = 22, + POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN = 23, + POWER_SUPPLY_PROP_CHARGE_FULL = 24, + POWER_SUPPLY_PROP_CHARGE_EMPTY = 25, + POWER_SUPPLY_PROP_CHARGE_NOW = 26, + POWER_SUPPLY_PROP_CHARGE_AVG = 27, + POWER_SUPPLY_PROP_CHARGE_COUNTER = 28, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT = 29, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX = 30, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE = 31, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX = 32, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT = 33, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX = 34, + POWER_SUPPLY_PROP_CHARGE_CONTROL_START_THRESHOLD = 35, + POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD = 36, + POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR = 37, + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT = 38, + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT = 39, + POWER_SUPPLY_PROP_INPUT_POWER_LIMIT = 40, + POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN = 41, + POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN = 42, + POWER_SUPPLY_PROP_ENERGY_FULL = 43, + POWER_SUPPLY_PROP_ENERGY_EMPTY = 44, + POWER_SUPPLY_PROP_ENERGY_NOW = 45, + POWER_SUPPLY_PROP_ENERGY_AVG = 46, + POWER_SUPPLY_PROP_CAPACITY = 47, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN = 48, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MAX = 49, + POWER_SUPPLY_PROP_CAPACITY_ERROR_MARGIN = 50, + POWER_SUPPLY_PROP_CAPACITY_LEVEL = 51, + POWER_SUPPLY_PROP_TEMP = 52, + POWER_SUPPLY_PROP_TEMP_MAX = 53, + POWER_SUPPLY_PROP_TEMP_MIN = 54, + POWER_SUPPLY_PROP_TEMP_ALERT_MIN = 55, + POWER_SUPPLY_PROP_TEMP_ALERT_MAX = 56, + POWER_SUPPLY_PROP_TEMP_AMBIENT = 57, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN = 58, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX = 59, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW = 60, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG = 61, + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW = 62, + POWER_SUPPLY_PROP_TIME_TO_FULL_AVG = 63, + POWER_SUPPLY_PROP_TYPE = 64, + POWER_SUPPLY_PROP_USB_TYPE = 65, + POWER_SUPPLY_PROP_SCOPE = 66, + POWER_SUPPLY_PROP_PRECHARGE_CURRENT = 67, + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT = 68, + POWER_SUPPLY_PROP_CALIBRATE = 69, + POWER_SUPPLY_PROP_MANUFACTURE_YEAR = 70, + POWER_SUPPLY_PROP_MANUFACTURE_MONTH = 71, + POWER_SUPPLY_PROP_MANUFACTURE_DAY = 72, + POWER_SUPPLY_PROP_MODEL_NAME = 73, + POWER_SUPPLY_PROP_MANUFACTURER = 74, + POWER_SUPPLY_PROP_SERIAL_NUMBER = 75, +}; + +enum power_supply_type { + POWER_SUPPLY_TYPE_UNKNOWN = 0, + POWER_SUPPLY_TYPE_BATTERY = 1, + POWER_SUPPLY_TYPE_UPS = 2, + POWER_SUPPLY_TYPE_MAINS = 3, + POWER_SUPPLY_TYPE_USB = 4, + POWER_SUPPLY_TYPE_USB_DCP = 5, + POWER_SUPPLY_TYPE_USB_CDP = 6, + POWER_SUPPLY_TYPE_USB_ACA = 7, + POWER_SUPPLY_TYPE_USB_TYPE_C = 8, + POWER_SUPPLY_TYPE_USB_PD = 9, + POWER_SUPPLY_TYPE_USB_PD_DRP = 10, + POWER_SUPPLY_TYPE_APPLE_BRICK_ID = 11, + POWER_SUPPLY_TYPE_WIRELESS = 12, +}; + +enum power_supply_usb_type { + POWER_SUPPLY_USB_TYPE_UNKNOWN = 0, + POWER_SUPPLY_USB_TYPE_SDP = 1, + POWER_SUPPLY_USB_TYPE_DCP = 2, + POWER_SUPPLY_USB_TYPE_CDP = 3, + POWER_SUPPLY_USB_TYPE_ACA = 4, + POWER_SUPPLY_USB_TYPE_C = 5, + POWER_SUPPLY_USB_TYPE_PD = 6, + POWER_SUPPLY_USB_TYPE_PD_DRP = 7, + POWER_SUPPLY_USB_TYPE_PD_PPS = 8, + POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID = 9, +}; + +enum power_supply_notifier_events { + PSY_EVENT_PROP_CHANGED = 0, +}; + +union power_supply_propval { + int intval; + const char *strval; +}; + +struct power_supply_config { + struct device_node *of_node; + struct fwnode_handle *fwnode; + void *drv_data; + const struct attribute_group **attr_grp; + char **supplied_to; + size_t num_supplicants; +}; + +struct power_supply; + +struct power_supply_desc { + const char *name; + enum power_supply_type type; + const enum power_supply_usb_type *usb_types; + size_t num_usb_types; + const enum power_supply_property *properties; + size_t num_properties; + int (*get_property)(struct power_supply *, enum power_supply_property, union power_supply_propval *); + int (*set_property)(struct power_supply *, enum power_supply_property, const union power_supply_propval *); + int (*property_is_writeable)(struct power_supply *, enum power_supply_property); + void (*external_power_changed)(struct power_supply *); + void (*set_charged)(struct power_supply *); + bool no_thermal; + int use_for_apm; +}; + +struct thermal_zone_device; + +struct power_supply { + const struct power_supply_desc *desc; + char **supplied_to; + size_t num_supplicants; + char **supplied_from; + size_t num_supplies; + struct device_node *of_node; + void *drv_data; + long: 32; + struct device dev; + struct work_struct changed_work; + struct delayed_work deferred_register_work; + spinlock_t changed_lock; + bool changed; + bool initialized; + bool removing; + atomic_t use_cnt; + struct thermal_zone_device *tzd; + struct thermal_cooling_device *tcd; + struct led_trigger *charging_full_trig; + char *charging_full_trig_name; + struct led_trigger *charging_trig; + char *charging_trig_name; + struct led_trigger *full_trig; + char *full_trig_name; + struct led_trigger *online_trig; + char *online_trig_name; + struct led_trigger *charging_blink_full_solid_trig; + char *charging_blink_full_solid_trig_name; +}; + +enum thermal_device_mode { + THERMAL_DEVICE_DISABLED = 0, + THERMAL_DEVICE_ENABLED = 1, +}; + +enum thermal_notify_event { + THERMAL_EVENT_UNSPECIFIED = 0, + THERMAL_EVENT_TEMP_SAMPLE = 1, + THERMAL_TRIP_VIOLATED = 2, + THERMAL_TRIP_CHANGED = 3, + THERMAL_DEVICE_DOWN = 4, + THERMAL_DEVICE_UP = 5, + THERMAL_DEVICE_POWER_CAPABILITY_CHANGED = 6, + THERMAL_TABLE_CHANGED = 7, + THERMAL_EVENT_KEEP_ALIVE = 8, +}; + +struct thermal_attr; + +struct thermal_trip; + +struct thermal_zone_device_ops; + +struct thermal_zone_params; + +struct thermal_governor; + +struct thermal_zone_device { + int id; + char type[20]; + struct device device; + struct attribute_group trips_attribute_group; + struct thermal_attr *trip_temp_attrs; + struct thermal_attr *trip_type_attrs; + struct thermal_attr *trip_hyst_attrs; + enum thermal_device_mode mode; + void *devdata; + struct thermal_trip *trips; + int num_trips; + long unsigned int trips_disabled; + long unsigned int passive_delay_jiffies; + long unsigned int polling_delay_jiffies; + int temperature; + int last_temperature; + int emul_temperature; + int passive; + int prev_low_trip; + int prev_high_trip; + atomic_t need_update; + struct thermal_zone_device_ops *ops; + struct thermal_zone_params *tzp; + struct thermal_governor *governor; + void *governor_data; + struct list_head thermal_instances; + struct ida ida; + struct mutex lock; + struct list_head node; + struct delayed_work poll_queue; + enum thermal_notify_event notify_event; +}; + +struct thermal_cooling_device_ops; + +struct thermal_cooling_device { + int id; + char *type; + long unsigned int max_state; + long: 32; + struct device device; + struct device_node *np; + void *devdata; + void *stats; + const struct thermal_cooling_device_ops *ops; + bool updated; + struct mutex lock; + struct list_head thermal_instances; + struct list_head node; +}; + +struct power_supply_battery_ocv_table { + int ocv; + int capacity; +}; + +struct power_supply_resistance_temp_table { + int temp; + int resistance; +}; + +struct power_supply_vbat_ri_table { + int vbat_uv; + int ri_uohm; +}; + +struct power_supply_maintenance_charge_table { + int charge_current_max_ua; + int charge_voltage_max_uv; + int charge_safety_timer_minutes; +}; + +struct power_supply_battery_info { + unsigned int technology; + int energy_full_design_uwh; + int charge_full_design_uah; + int voltage_min_design_uv; + int voltage_max_design_uv; + int tricklecharge_current_ua; + int precharge_current_ua; + int precharge_voltage_max_uv; + int charge_term_current_ua; + int charge_restart_voltage_uv; + int overvoltage_limit_uv; + int constant_charge_current_max_ua; + int constant_charge_voltage_max_uv; + struct power_supply_maintenance_charge_table *maintenance_charge; + int maintenance_charge_size; + int alert_low_temp_charge_current_ua; + int alert_low_temp_charge_voltage_uv; + int alert_high_temp_charge_current_ua; + int alert_high_temp_charge_voltage_uv; + int factory_internal_resistance_uohm; + int factory_internal_resistance_charging_uohm; + int ocv_temp[20]; + int temp_ambient_alert_min; + int temp_ambient_alert_max; + int temp_alert_min; + int temp_alert_max; + int temp_min; + int temp_max; + struct power_supply_battery_ocv_table *ocv_table[20]; + int ocv_table_size[20]; + struct power_supply_resistance_temp_table *resist_table; + int resist_table_size; + struct power_supply_vbat_ri_table *vbat2ri_discharging; + int vbat2ri_discharging_size; + struct power_supply_vbat_ri_table *vbat2ri_charging; + int vbat2ri_charging_size; + int bti_resistance_ohm; + int bti_resistance_tolerance; +}; + +enum thermal_trip_type { + THERMAL_TRIP_ACTIVE = 0, + THERMAL_TRIP_PASSIVE = 1, + THERMAL_TRIP_HOT = 2, + THERMAL_TRIP_CRITICAL = 3, +}; + +enum thermal_trend { + THERMAL_TREND_STABLE = 0, + THERMAL_TREND_RAISING = 1, + THERMAL_TREND_DROPPING = 2, +}; + +struct thermal_zone_device_ops { + int (*bind)(struct thermal_zone_device *, struct thermal_cooling_device *); + int (*unbind)(struct thermal_zone_device *, struct thermal_cooling_device *); + int (*get_temp)(struct thermal_zone_device *, int *); + int (*set_trips)(struct thermal_zone_device *, int, int); + int (*change_mode)(struct thermal_zone_device *, enum thermal_device_mode); + int (*get_trip_type)(struct thermal_zone_device *, int, enum thermal_trip_type *); + int (*get_trip_temp)(struct thermal_zone_device *, int, int *); + int (*set_trip_temp)(struct thermal_zone_device *, int, int); + int (*get_trip_hyst)(struct thermal_zone_device *, int, int *); + int (*set_trip_hyst)(struct thermal_zone_device *, int, int); + int (*get_crit_temp)(struct thermal_zone_device *, int *); + int (*set_emul_temp)(struct thermal_zone_device *, int); + int (*get_trend)(struct thermal_zone_device *, int, enum thermal_trend *); + void (*hot)(struct thermal_zone_device *); + void (*critical)(struct thermal_zone_device *); +}; + +struct thermal_trip { + int temperature; + int hysteresis; + enum thermal_trip_type type; +}; + +struct thermal_cooling_device_ops { + int (*get_max_state)(struct thermal_cooling_device *, long unsigned int *); + int (*get_cur_state)(struct thermal_cooling_device *, long unsigned int *); + int (*set_cur_state)(struct thermal_cooling_device *, long unsigned int); + int (*get_requested_power)(struct thermal_cooling_device *, u32 *); + int (*state2power)(struct thermal_cooling_device *, long unsigned int, u32 *); + int (*power2state)(struct thermal_cooling_device *, u32, long unsigned int *); +}; + +struct thermal_bind_params; + +struct thermal_zone_params { + char governor_name[20]; + bool no_hwmon; + int num_tbps; + struct thermal_bind_params *tbp; + u32 sustainable_power; + s32 k_po; + s32 k_pu; + s32 k_i; + s32 k_d; + s32 integral_cutoff; + int slope; + int offset; +}; + +struct thermal_governor { + char name[20]; + int (*bind_to_tz)(struct thermal_zone_device *); + void (*unbind_from_tz)(struct thermal_zone_device *); + int (*throttle)(struct thermal_zone_device *, int); + struct list_head governor_list; +}; + +struct thermal_bind_params { + struct thermal_cooling_device *cdev; + int weight; + int trip_mask; + long unsigned int *binding_limits; + int (*match)(struct thermal_zone_device *, struct thermal_cooling_device *); +}; + +struct psy_am_i_supplied_data { + struct power_supply *psy; + unsigned int count; +}; + +struct psy_get_supplier_prop_data { + struct power_supply *psy; + enum power_supply_property psp; + union power_supply_propval *val; +}; + +enum { + POWER_SUPPLY_STATUS_UNKNOWN = 0, + POWER_SUPPLY_STATUS_CHARGING = 1, + POWER_SUPPLY_STATUS_DISCHARGING = 2, + POWER_SUPPLY_STATUS_NOT_CHARGING = 3, + POWER_SUPPLY_STATUS_FULL = 4, +}; + +enum { + POWER_SUPPLY_CHARGE_TYPE_UNKNOWN = 0, + POWER_SUPPLY_CHARGE_TYPE_NONE = 1, + POWER_SUPPLY_CHARGE_TYPE_TRICKLE = 2, + POWER_SUPPLY_CHARGE_TYPE_FAST = 3, + POWER_SUPPLY_CHARGE_TYPE_STANDARD = 4, + POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE = 5, + POWER_SUPPLY_CHARGE_TYPE_CUSTOM = 6, + POWER_SUPPLY_CHARGE_TYPE_LONGLIFE = 7, + POWER_SUPPLY_CHARGE_TYPE_BYPASS = 8, +}; + +enum { + POWER_SUPPLY_HEALTH_UNKNOWN = 0, + POWER_SUPPLY_HEALTH_GOOD = 1, + POWER_SUPPLY_HEALTH_OVERHEAT = 2, + POWER_SUPPLY_HEALTH_DEAD = 3, + POWER_SUPPLY_HEALTH_OVERVOLTAGE = 4, + POWER_SUPPLY_HEALTH_UNSPEC_FAILURE = 5, + POWER_SUPPLY_HEALTH_COLD = 6, + POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE = 7, + POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE = 8, + POWER_SUPPLY_HEALTH_OVERCURRENT = 9, + POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED = 10, + POWER_SUPPLY_HEALTH_WARM = 11, + POWER_SUPPLY_HEALTH_COOL = 12, + POWER_SUPPLY_HEALTH_HOT = 13, + POWER_SUPPLY_HEALTH_NO_BATTERY = 14, +}; + +enum { + POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN = 0, + POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL = 1, + POWER_SUPPLY_CAPACITY_LEVEL_LOW = 2, + POWER_SUPPLY_CAPACITY_LEVEL_NORMAL = 3, + POWER_SUPPLY_CAPACITY_LEVEL_HIGH = 4, + POWER_SUPPLY_CAPACITY_LEVEL_FULL = 5, +}; + +enum { + POWER_SUPPLY_SCOPE_UNKNOWN = 0, + POWER_SUPPLY_SCOPE_SYSTEM = 1, + POWER_SUPPLY_SCOPE_DEVICE = 2, +}; + +enum power_supply_charge_behaviour { + POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO = 0, + POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE = 1, + POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE = 2, +}; + +struct power_supply_attr { + const char *prop_name; + char attr_name[31]; + struct device_attribute dev_attr; + const char * const *text_values; + int text_values_len; +}; + +enum hwmon_sensor_types { + hwmon_chip = 0, + hwmon_temp = 1, + hwmon_in = 2, + hwmon_curr = 3, + hwmon_power = 4, + hwmon_energy = 5, + hwmon_humidity = 6, + hwmon_fan = 7, + hwmon_pwm = 8, + hwmon_intrusion = 9, + hwmon_max = 10, +}; + +enum hwmon_temp_attributes { + hwmon_temp_enable = 0, + hwmon_temp_input = 1, + hwmon_temp_type = 2, + hwmon_temp_lcrit = 3, + hwmon_temp_lcrit_hyst = 4, + hwmon_temp_min = 5, + hwmon_temp_min_hyst = 6, + hwmon_temp_max = 7, + hwmon_temp_max_hyst = 8, + hwmon_temp_crit = 9, + hwmon_temp_crit_hyst = 10, + hwmon_temp_emergency = 11, + hwmon_temp_emergency_hyst = 12, + hwmon_temp_alarm = 13, + hwmon_temp_lcrit_alarm = 14, + hwmon_temp_min_alarm = 15, + hwmon_temp_max_alarm = 16, + hwmon_temp_crit_alarm = 17, + hwmon_temp_emergency_alarm = 18, + hwmon_temp_fault = 19, + hwmon_temp_offset = 20, + hwmon_temp_label = 21, + hwmon_temp_lowest = 22, + hwmon_temp_highest = 23, + hwmon_temp_reset_history = 24, + hwmon_temp_rated_min = 25, + hwmon_temp_rated_max = 26, +}; + +enum hwmon_in_attributes { + hwmon_in_enable = 0, + hwmon_in_input = 1, + hwmon_in_min = 2, + hwmon_in_max = 3, + hwmon_in_lcrit = 4, + hwmon_in_crit = 5, + hwmon_in_average = 6, + hwmon_in_lowest = 7, + hwmon_in_highest = 8, + hwmon_in_reset_history = 9, + hwmon_in_label = 10, + hwmon_in_alarm = 11, + hwmon_in_min_alarm = 12, + hwmon_in_max_alarm = 13, + hwmon_in_lcrit_alarm = 14, + hwmon_in_crit_alarm = 15, + hwmon_in_rated_min = 16, + hwmon_in_rated_max = 17, +}; + +enum hwmon_curr_attributes { + hwmon_curr_enable = 0, + hwmon_curr_input = 1, + hwmon_curr_min = 2, + hwmon_curr_max = 3, + hwmon_curr_lcrit = 4, + hwmon_curr_crit = 5, + hwmon_curr_average = 6, + hwmon_curr_lowest = 7, + hwmon_curr_highest = 8, + hwmon_curr_reset_history = 9, + hwmon_curr_label = 10, + hwmon_curr_alarm = 11, + hwmon_curr_min_alarm = 12, + hwmon_curr_max_alarm = 13, + hwmon_curr_lcrit_alarm = 14, + hwmon_curr_crit_alarm = 15, + hwmon_curr_rated_min = 16, + hwmon_curr_rated_max = 17, +}; + +struct hwmon_ops { + umode_t (*is_visible)(const void *, enum hwmon_sensor_types, u32, int); + int (*read)(struct device *, enum hwmon_sensor_types, u32, int, long int *); + int (*read_string)(struct device *, enum hwmon_sensor_types, u32, int, const char **); + int (*write)(struct device *, enum hwmon_sensor_types, u32, int, long int); +}; + +struct hwmon_channel_info { + enum hwmon_sensor_types type; + const u32 *config; +}; + +struct hwmon_chip_info { + const struct hwmon_ops *ops; + const struct hwmon_channel_info **info; +}; + +struct power_supply_hwmon { + struct power_supply *psy; + long unsigned int *props; +}; + +struct hwmon_type_attr_list { + const u32 *attrs; + size_t n_attrs; +}; + +enum hwmon_chip_attributes { + hwmon_chip_temp_reset_history = 0, + hwmon_chip_in_reset_history = 1, + hwmon_chip_curr_reset_history = 2, + hwmon_chip_power_reset_history = 3, + hwmon_chip_register_tz = 4, + hwmon_chip_update_interval = 5, + hwmon_chip_alarms = 6, + hwmon_chip_samples = 7, + hwmon_chip_curr_samples = 8, + hwmon_chip_in_samples = 9, + hwmon_chip_power_samples = 10, + hwmon_chip_temp_samples = 11, +}; + +enum hwmon_power_attributes { + hwmon_power_enable = 0, + hwmon_power_average = 1, + hwmon_power_average_interval = 2, + hwmon_power_average_interval_max = 3, + hwmon_power_average_interval_min = 4, + hwmon_power_average_highest = 5, + hwmon_power_average_lowest = 6, + hwmon_power_average_max = 7, + hwmon_power_average_min = 8, + hwmon_power_input = 9, + hwmon_power_input_highest = 10, + hwmon_power_input_lowest = 11, + hwmon_power_reset_history = 12, + hwmon_power_accuracy = 13, + hwmon_power_cap = 14, + hwmon_power_cap_hyst = 15, + hwmon_power_cap_max = 16, + hwmon_power_cap_min = 17, + hwmon_power_min = 18, + hwmon_power_max = 19, + hwmon_power_crit = 20, + hwmon_power_lcrit = 21, + hwmon_power_label = 22, + hwmon_power_alarm = 23, + hwmon_power_cap_alarm = 24, + hwmon_power_min_alarm = 25, + hwmon_power_max_alarm = 26, + hwmon_power_lcrit_alarm = 27, + hwmon_power_crit_alarm = 28, + hwmon_power_rated_min = 29, + hwmon_power_rated_max = 30, +}; + +enum hwmon_energy_attributes { + hwmon_energy_enable = 0, + hwmon_energy_input = 1, + hwmon_energy_label = 2, +}; + +enum hwmon_humidity_attributes { + hwmon_humidity_enable = 0, + hwmon_humidity_input = 1, + hwmon_humidity_label = 2, + hwmon_humidity_min = 3, + hwmon_humidity_min_hyst = 4, + hwmon_humidity_max = 5, + hwmon_humidity_max_hyst = 6, + hwmon_humidity_alarm = 7, + hwmon_humidity_fault = 8, + hwmon_humidity_rated_min = 9, + hwmon_humidity_rated_max = 10, +}; + +enum hwmon_fan_attributes { + hwmon_fan_enable = 0, + hwmon_fan_input = 1, + hwmon_fan_label = 2, + hwmon_fan_min = 3, + hwmon_fan_max = 4, + hwmon_fan_div = 5, + hwmon_fan_pulses = 6, + hwmon_fan_target = 7, + hwmon_fan_alarm = 8, + hwmon_fan_min_alarm = 9, + hwmon_fan_max_alarm = 10, + hwmon_fan_fault = 11, +}; + +enum hwmon_pwm_attributes { + hwmon_pwm_input = 0, + hwmon_pwm_enable = 1, + hwmon_pwm_mode = 2, + hwmon_pwm_freq = 3, + hwmon_pwm_auto_channels_temp = 4, +}; + +enum hwmon_intrusion_attributes { + hwmon_intrusion_alarm = 0, + hwmon_intrusion_beep = 1, +}; + +struct trace_event_raw_hwmon_attr_class { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + long int val; + char __data[0]; +}; + +struct trace_event_raw_hwmon_attr_show_string { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + u32 __data_loc_label; + char __data[0]; +}; + +struct trace_event_data_offsets_hwmon_attr_class { + u32 attr_name; +}; + +struct trace_event_data_offsets_hwmon_attr_show_string { + u32 attr_name; + u32 label; +}; + +typedef void (*btf_trace_hwmon_attr_show)(void *, int, const char *, long int); + +typedef void (*btf_trace_hwmon_attr_store)(void *, int, const char *, long int); + +typedef void (*btf_trace_hwmon_attr_show_string)(void *, int, const char *, const char *); + +struct hwmon_device { + const char *name; + const char *label; + struct device dev; + const struct hwmon_chip_info *chip; + struct list_head tzdata; + struct attribute_group group; + const struct attribute_group **groups; + long: 32; +}; + +struct hwmon_device_attribute { + struct device_attribute dev_attr; + const struct hwmon_ops *ops; + enum hwmon_sensor_types type; + u32 attr; + int index; + char name[32]; +}; + +struct hwmon_thermal_data { + struct list_head node; + struct device *dev; + int index; + struct thermal_zone_device *tzd; +}; + +struct thermal_attr { + struct device_attribute attr; + char name[20]; +}; + +struct devfreq_dev_status { + long unsigned int total_time; + long unsigned int busy_time; + long unsigned int current_frequency; + void *private_data; +}; + +struct trace_event_raw_thermal_temperature { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int temp_prev; + int temp; + char __data[0]; +}; + +struct trace_event_raw_cdev_update { + struct trace_entry ent; + u32 __data_loc_type; + long unsigned int target; + char __data[0]; +}; + +struct trace_event_raw_thermal_zone_trip { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int trip; + enum thermal_trip_type trip_type; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_cpu_get_power_simple { + struct trace_entry ent; + int cpu; + u32 power; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_cpu_limit { + struct trace_entry ent; + u32 __data_loc_cpumask; + unsigned int freq; + long unsigned int cdev_state; + u32 power; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_devfreq_get_power { + struct trace_entry ent; + u32 __data_loc_type; + long unsigned int freq; + u32 busy_time; + u32 total_time; + u32 power; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_devfreq_limit { + struct trace_entry ent; + u32 __data_loc_type; + unsigned int freq; + long unsigned int cdev_state; + u32 power; + char __data[0]; +}; + +struct trace_event_data_offsets_thermal_temperature { + u32 thermal_zone; +}; + +struct trace_event_data_offsets_cdev_update { + u32 type; +}; + +struct trace_event_data_offsets_thermal_zone_trip { + u32 thermal_zone; +}; + +struct trace_event_data_offsets_thermal_power_cpu_get_power_simple {}; + +struct trace_event_data_offsets_thermal_power_cpu_limit { + u32 cpumask; +}; + +struct trace_event_data_offsets_thermal_power_devfreq_get_power { + u32 type; +}; + +struct trace_event_data_offsets_thermal_power_devfreq_limit { + u32 type; +}; + +typedef void (*btf_trace_thermal_temperature)(void *, struct thermal_zone_device *); + +typedef void (*btf_trace_cdev_update)(void *, struct thermal_cooling_device *, long unsigned int); + +typedef void (*btf_trace_thermal_zone_trip)(void *, struct thermal_zone_device *, int, enum thermal_trip_type); + +typedef void (*btf_trace_thermal_power_cpu_get_power_simple)(void *, int, u32); + +typedef void (*btf_trace_thermal_power_cpu_limit)(void *, const struct cpumask *, unsigned int, long unsigned int, u32); + +typedef void (*btf_trace_thermal_power_devfreq_get_power)(void *, struct thermal_cooling_device *, struct devfreq_dev_status *, long unsigned int, u32); + +typedef void (*btf_trace_thermal_power_devfreq_limit)(void *, struct thermal_cooling_device *, long unsigned int, long unsigned int, u32); + +struct thermal_instance { + int id; + char name[20]; + struct thermal_zone_device *tz; + struct thermal_cooling_device *cdev; + int trip; + bool initialized; + long unsigned int upper; + long unsigned int lower; + long unsigned int target; + char attr_name[20]; + struct device_attribute attr; + char weight_attr_name[20]; + struct device_attribute weight_attr; + struct list_head tz_node; + struct list_head cdev_node; + unsigned int weight; +}; + +struct cooling_dev_stats { + spinlock_t lock; + unsigned int total_trans; + long unsigned int state; + long: 32; + ktime_t last_time; + ktime_t *time_in_state; + unsigned int *trans_table; +}; + +struct thermal_hwmon_device { + char type[20]; + struct device *device; + int count; + struct list_head tz_list; + struct list_head node; +}; + +struct thermal_hwmon_attr { + struct device_attribute attr; + char name[16]; +}; + +struct thermal_hwmon_temp { + struct list_head hwmon_node; + struct thermal_zone_device *tz; + struct thermal_hwmon_attr temp_input; + struct thermal_hwmon_attr temp_crit; +}; + +struct trace_event_raw_thermal_power_allocator { + struct trace_entry ent; + int tz_id; + u32 __data_loc_req_power; + u32 total_req_power; + u32 __data_loc_granted_power; + u32 total_granted_power; + size_t num_actors; + u32 power_range; + u32 max_allocatable_power; + int current_temp; + s32 delta_temp; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_allocator_pid { + struct trace_entry ent; + int tz_id; + s32 err; + s32 err_integral; + long: 32; + s64 p; + s64 i; + s64 d; + s32 output; + char __data[0]; + long: 32; +}; + +struct trace_event_data_offsets_thermal_power_allocator { + u32 req_power; + u32 granted_power; +}; + +struct trace_event_data_offsets_thermal_power_allocator_pid {}; + +typedef void (*btf_trace_thermal_power_allocator)(void *, struct thermal_zone_device *, u32 *, u32, u32 *, u32, size_t, u32, u32, int, s32); + +typedef void (*btf_trace_thermal_power_allocator_pid)(void *, struct thermal_zone_device *, s32, s32, s64, s64, s64, s32); + +struct power_allocator_params { + bool allocated_tzp; + long: 32; + s64 err_integral; + s32 prev_err; + int trip_switch_on; + int trip_max_desired_temperature; + u32 sustainable_power; +}; + +struct cpufreq_cooling_device { + u32 last_load; + unsigned int cpufreq_state; + unsigned int max_level; + struct em_perf_domain *em; + struct cpufreq_policy *policy; + struct thermal_cooling_device_ops cooling_ops; + struct freq_qos_request qos_req; +}; + +enum devfreq_timer { + DEVFREQ_TIMER_DEFERRABLE = 0, + DEVFREQ_TIMER_DELAYED = 1, + DEVFREQ_TIMER_NUM = 2, +}; + +struct devfreq_dev_profile { + long unsigned int initial_freq; + unsigned int polling_ms; + enum devfreq_timer timer; + bool is_cooling_device; + int (*target)(struct device *, long unsigned int *, u32); + int (*get_dev_status)(struct device *, struct devfreq_dev_status *); + int (*get_cur_freq)(struct device *, long unsigned int *); + void (*exit)(struct device *); + long unsigned int *freq_table; + unsigned int max_state; +}; + +struct devfreq_stats { + unsigned int total_trans; + unsigned int *trans_table; + u64 *time_in_state; + long: 32; + u64 last_update; +}; + +struct devfreq_governor; + +struct devfreq { + struct list_head node; + struct mutex lock; + long: 32; + struct device dev; + struct devfreq_dev_profile *profile; + const struct devfreq_governor *governor; + struct opp_table *opp_table; + struct notifier_block nb; + struct delayed_work work; + long unsigned int *freq_table; + unsigned int max_state; + long unsigned int previous_freq; + struct devfreq_dev_status last_status; + void *data; + void *governor_data; + struct dev_pm_qos_request user_min_freq_req; + struct dev_pm_qos_request user_max_freq_req; + long unsigned int scaling_min_freq; + long unsigned int scaling_max_freq; + bool stop_polling; + long unsigned int suspend_freq; + long unsigned int resume_freq; + atomic_t suspend_count; + struct devfreq_stats stats; + struct srcu_notifier_head transition_notifier_list; + struct thermal_cooling_device *cdev; + struct notifier_block nb_min; + struct notifier_block nb_max; + long: 32; +}; + +struct devfreq_governor { + struct list_head node; + const char name[16]; + const u64 attrs; + const u64 flags; + int (*get_target_freq)(struct devfreq *, long unsigned int *); + int (*event_handler)(struct devfreq *, unsigned int, void *); +}; + +struct devfreq_cooling_power { + int (*get_real_power)(struct devfreq *, u32 *, long unsigned int, long unsigned int); +}; + +struct devfreq_cooling_device { + struct thermal_cooling_device *cdev; + struct thermal_cooling_device_ops cooling_ops; + struct devfreq *devfreq; + long unsigned int cooling_state; + u32 *freq_table; + size_t max_state; + struct devfreq_cooling_power *power_ops; + u32 res_util; + int capped_state; + struct dev_pm_qos_request req_max_freq; + struct em_perf_domain *em_pd; +}; + +enum soc_type { + SOC_ARCH_EXYNOS3250 = 1, + SOC_ARCH_EXYNOS4210 = 2, + SOC_ARCH_EXYNOS4412 = 3, + SOC_ARCH_EXYNOS5250 = 4, + SOC_ARCH_EXYNOS5260 = 5, + SOC_ARCH_EXYNOS5420 = 6, + SOC_ARCH_EXYNOS5420_TRIMINFO = 7, + SOC_ARCH_EXYNOS5433 = 8, + SOC_ARCH_EXYNOS7 = 9, +}; + +struct exynos_tmu_data { + int id; + void *base; + void *base_second; + int irq; + enum soc_type soc; + struct work_struct irq_work; + struct mutex lock; + struct clk *clk; + struct clk *clk_sec; + struct clk *sclk; + u32 cal_type; + u32 efuse_value; + u32 min_efuse_value; + u32 max_efuse_value; + u16 temp_error1; + u16 temp_error2; + u8 gain; + u8 reference_voltage; + struct regulator *regulator; + struct thermal_zone_device *tzd; + unsigned int ntrip; + bool enabled; + void (*tmu_set_trip_temp)(struct exynos_tmu_data *, int, u8); + void (*tmu_set_trip_hyst)(struct exynos_tmu_data *, int, u8, u8); + void (*tmu_initialize)(struct platform_device *); + void (*tmu_control)(struct platform_device *, bool); + int (*tmu_read)(struct exynos_tmu_data *); + void (*tmu_set_emulation)(struct exynos_tmu_data *, int); + void (*tmu_clear_irqs)(struct exynos_tmu_data *); +}; + +struct armada_thermal_data; + +struct armada_thermal_priv { + struct device *dev; + struct regmap *syscon; + char zone_name[20]; + struct mutex update_lock; + struct armada_thermal_data *data; + struct thermal_zone_device *overheat_sensor; + int interrupt_source; + int current_channel; + long int current_threshold; + long int current_hysteresis; +}; + +struct armada_thermal_data { + void (*init)(struct platform_device *, struct armada_thermal_priv *); + long: 32; + s64 coef_b; + s64 coef_m; + u32 coef_div; + bool inverted; + bool signed_sample; + unsigned int temp_shift; + unsigned int temp_mask; + unsigned int thresh_shift; + unsigned int hyst_shift; + unsigned int hyst_mask; + u32 is_valid_bit; + unsigned int syscon_control0_off; + unsigned int syscon_control1_off; + unsigned int syscon_status_off; + unsigned int dfx_irq_cause_off; + unsigned int dfx_irq_mask_off; + unsigned int dfx_overheat_irq; + unsigned int dfx_server_irq_mask_off; + unsigned int dfx_server_irq_en; + unsigned int cpu_nr; + long: 32; +}; + +enum drvtype { + LEGACY = 0, + SYSCON = 1, +}; + +struct armada_drvdata { + enum drvtype type; + union { + struct armada_thermal_priv *priv; + struct thermal_zone_device *tz; + } data; +}; + +struct armada_thermal_sensor { + struct armada_thermal_priv *priv; + int id; +}; + +struct stm_thermal_sensor { + struct device *dev; + struct thermal_zone_device *th_dev; + enum thermal_device_mode mode; + struct clk *clk; + unsigned int low_temp_enabled; + unsigned int high_temp_enabled; + int irq; + void *base; + int t0; + int fmt0; + int ramp_coeff; +}; + +struct tegra_tsensor_group { + const char *name; + u8 id; + u16 sensor_temp_offset; + u32 sensor_temp_mask; + u32 pdiv; + u32 pdiv_ate; + u32 pdiv_mask; + u32 pllx_hotspot_diff; + u32 pllx_hotspot_mask; + u32 thermtrip_enable_mask; + u32 thermtrip_any_en_mask; + u32 thermtrip_threshold_mask; + u32 thermctl_isr_mask; + u16 thermctl_lvl0_offset; + u32 thermctl_lvl0_up_thresh_mask; + u32 thermctl_lvl0_dn_thresh_mask; +}; + +struct tegra_tsensor_configuration { + u32 tall; + u32 tiddq_en; + u32 ten_count; + u32 pdiv; + u32 pdiv_ate; + u32 tsample; + u32 tsample_ate; +}; + +struct tegra_tsensor { + const char *name; + const u32 base; + const struct tegra_tsensor_configuration *config; + const u32 calib_fuse_offset; + const s32 fuse_corr_alpha; + const s32 fuse_corr_beta; + const struct tegra_tsensor_group *group; +}; + +struct tsensor_group_thermtrips { + u8 id; + u32 temp; +}; + +struct tegra_soctherm_fuse { + u32 fuse_base_cp_mask; + u32 fuse_base_cp_shift; + u32 fuse_base_ft_mask; + u32 fuse_base_ft_shift; + u32 fuse_shift_ft_mask; + u32 fuse_shift_ft_shift; + u32 fuse_spare_realignment; +}; + +struct tsensor_shared_calib { + u32 base_cp; + u32 base_ft; + u32 actual_temp_cp; + u32 actual_temp_ft; +}; + +struct tegra_soctherm_soc { + const struct tegra_tsensor *tsensors; + const unsigned int num_tsensors; + const struct tegra_tsensor_group **ttgs; + const unsigned int num_ttgs; + const struct tegra_soctherm_fuse *tfuse; + const int thresh_grain; + const unsigned int bptt; + const bool use_ccroc; + struct tsensor_group_thermtrips *thermtrips; +}; + +enum soctherm_throttle_id { + THROTTLE_LIGHT = 0, + THROTTLE_HEAVY = 1, + THROTTLE_OC1 = 2, + THROTTLE_OC2 = 3, + THROTTLE_OC3 = 4, + THROTTLE_OC4 = 5, + THROTTLE_OC5 = 6, + THROTTLE_SIZE = 7, +}; + +enum soctherm_oc_irq_id { + TEGRA_SOC_OC_IRQ_1 = 0, + TEGRA_SOC_OC_IRQ_2 = 1, + TEGRA_SOC_OC_IRQ_3 = 2, + TEGRA_SOC_OC_IRQ_4 = 3, + TEGRA_SOC_OC_IRQ_5 = 4, + TEGRA_SOC_OC_IRQ_MAX = 5, +}; + +enum soctherm_throttle_dev_id { + THROTTLE_DEV_CPU = 0, + THROTTLE_DEV_GPU = 1, + THROTTLE_DEV_SIZE = 2, +}; + +struct tegra_soctherm; + +struct tegra_thermctl_zone { + void *reg; + struct device *dev; + struct tegra_soctherm *ts; + struct thermal_zone_device *tz; + const struct tegra_tsensor_group *sg; +}; + +struct soctherm_oc_cfg { + u32 active_low; + u32 throt_period; + u32 alarm_cnt_thresh; + u32 alarm_filter; + u32 mode; + bool intr_en; +}; + +struct soctherm_throt_cfg { + const char *name; + unsigned int id; + u8 priority; + u8 cpu_throt_level; + u32 cpu_throt_depth; + u32 gpu_throt_level; + struct soctherm_oc_cfg oc_cfg; + struct thermal_cooling_device *cdev; + bool init; +}; + +struct tegra_soctherm { + struct reset_control *reset; + struct clk *clock_tsensor; + struct clk *clock_soctherm; + void *regs; + void *clk_regs; + void *ccroc_regs; + int thermal_irq; + int edp_irq; + u32 *calib; + struct thermal_zone_device **thermctl_tzs; + struct tegra_soctherm_soc *soc; + struct soctherm_throt_cfg throt_cfgs[7]; + struct dentry *debugfs_dir; + struct mutex thermctl_lock; +}; + +struct soctherm_oc_irq_chip_data { + struct mutex irq_lock; + struct irq_chip irq_chip; + struct irq_domain *domain; + int irq_enable; +}; + +struct amlogic_thermal_soc_calib_data { + int A; + int B; + int m; + int n; +}; + +struct amlogic_thermal_data { + int u_efuse_off; + const struct amlogic_thermal_soc_calib_data *calibration_parameters; + const struct regmap_config *regmap_config; +}; + +struct amlogic_thermal { + struct platform_device *pdev; + const struct amlogic_thermal_data *data; + struct regmap *regmap; + struct regmap *sec_ao_map; + struct clk *clk; + struct thermal_zone_device *tzd; + u32 trim_info; +}; + +struct watchdog_core_data { + struct device dev; + struct cdev cdev; + struct watchdog_device *wdd; + struct mutex lock; + long: 32; + ktime_t last_keepalive; + ktime_t last_hw_keepalive; + ktime_t open_deadline; + struct hrtimer timer; + struct kthread_work work; + long unsigned int status; +}; + +struct trace_event_raw_watchdog_template { + struct trace_entry ent; + int id; + int err; + char __data[0]; +}; + +struct trace_event_raw_watchdog_set_timeout { + struct trace_entry ent; + int id; + unsigned int timeout; + int err; + char __data[0]; +}; + +struct trace_event_data_offsets_watchdog_template {}; + +struct trace_event_data_offsets_watchdog_set_timeout {}; + +typedef void (*btf_trace_watchdog_start)(void *, struct watchdog_device *, int); + +typedef void (*btf_trace_watchdog_ping)(void *, struct watchdog_device *, int); + +typedef void (*btf_trace_watchdog_stop)(void *, struct watchdog_device *, int); + +typedef void (*btf_trace_watchdog_set_timeout)(void *, struct watchdog_device *, unsigned int, int); + +struct watchdog_pretimeout { + struct watchdog_device *wdd; + struct list_head entry; +}; + +struct governor_priv { + struct watchdog_governor *gov; + struct list_head entry; +}; + +struct aspeed_wdt_config { + u32 ext_pulse_width_mask; + u32 irq_shift; + u32 irq_mask; +}; + +struct aspeed_wdt { + struct watchdog_device wdd; + void *base; + u32 ctrl; + const struct aspeed_wdt_config *cfg; +}; + +struct stm32_iwdg_data { + bool has_pclk; + u32 max_prescaler; +}; + +struct stm32_iwdg { + struct watchdog_device wdd; + const struct stm32_iwdg_data *data; + void *regs; + struct clk *clk_lsi; + struct clk *clk_pclk; + unsigned int rate; +}; + +struct dm_kobject_holder { + struct kobject kobj; + struct completion completion; +}; + +enum opp_table_access { + OPP_TABLE_ACCESS_UNKNOWN = 0, + OPP_TABLE_ACCESS_EXCLUSIVE = 1, + OPP_TABLE_ACCESS_SHARED = 2, +}; + +struct icc_path; + +struct opp_table { + struct list_head node; + struct list_head lazy; + struct blocking_notifier_head head; + struct list_head dev_list; + struct list_head opp_list; + struct kref kref; + struct mutex lock; + struct device_node *np; + long unsigned int clock_latency_ns_max; + unsigned int voltage_tolerance_v1; + unsigned int parsed_static_opps; + enum opp_table_access shared_opp; + long unsigned int rate_clk_single; + struct dev_pm_opp *current_opp; + struct dev_pm_opp *suspend_opp; + struct mutex genpd_virt_dev_lock; + struct device **genpd_virt_devs; + struct opp_table **required_opp_tables; + unsigned int required_opp_count; + unsigned int *supported_hw; + unsigned int supported_hw_count; + const char *prop_name; + config_clks_t config_clks; + struct clk **clks; + struct clk *clk; + int clk_count; + config_regulators_t config_regulators; + struct regulator **regulators; + int regulator_count; + struct icc_path **paths; + unsigned int path_count; + bool enabled; + bool genpd_performance_state; + bool is_genpd; + struct dentry *dentry; + char dentry_name[255]; +}; + +struct dev_pm_opp_supply; + +struct dev_pm_opp_icc_bw; + +struct dev_pm_opp { + struct list_head node; + struct kref kref; + bool available; + bool dynamic; + bool turbo; + bool suspend; + bool removed; + unsigned int pstate; + long unsigned int *rates; + unsigned int level; + struct dev_pm_opp_supply *supplies; + struct dev_pm_opp_icc_bw *bandwidth; + long unsigned int clock_latency_ns; + struct dev_pm_opp **required_opps; + struct opp_table *opp_table; + struct device_node *np; + struct dentry *dentry; + const char *of_name; +}; + +enum dev_pm_opp_event { + OPP_EVENT_ADD = 0, + OPP_EVENT_REMOVE = 1, + OPP_EVENT_ENABLE = 2, + OPP_EVENT_DISABLE = 3, + OPP_EVENT_ADJUST_VOLTAGE = 4, +}; + +struct dev_pm_opp_supply { + long unsigned int u_volt; + long unsigned int u_volt_min; + long unsigned int u_volt_max; + long unsigned int u_amp; + long unsigned int u_watt; +}; + +struct dev_pm_opp_icc_bw { + u32 avg; + u32 peak; +}; + +struct opp_config_data { + struct opp_table *opp_table; + unsigned int flags; +}; + +struct opp_device { + struct list_head node; + const struct device *dev; + struct dentry *dentry; +}; + +struct ti_opp_supply_optimum_voltage_table { + unsigned int reference_uv; + unsigned int optimized_uv; +}; + +struct ti_opp_supply_data { + struct ti_opp_supply_optimum_voltage_table *vdd_table; + u32 num_vdd_table; + u32 vdd_absolute_max_voltage_uv; + struct dev_pm_opp_supply old_supplies[2]; + struct dev_pm_opp_supply new_supplies[2]; +}; + +struct ti_opp_supply_of_data { + const u8 flags; + const u32 efuse_voltage_mask; + const bool efuse_voltage_uv; +}; + +struct cpufreq_policy_data { + struct cpufreq_cpuinfo cpuinfo; + struct cpufreq_frequency_table *freq_table; + unsigned int cpu; + unsigned int min; + unsigned int max; +}; + +struct freq_attr { + struct attribute attr; + ssize_t (*show)(struct cpufreq_policy *, char *); + ssize_t (*store)(struct cpufreq_policy *, const char *, size_t); +}; + +struct cpufreq_driver { + char name[16]; + u16 flags; + void *driver_data; + int (*init)(struct cpufreq_policy *); + int (*verify)(struct cpufreq_policy_data *); + int (*setpolicy)(struct cpufreq_policy *); + int (*target)(struct cpufreq_policy *, unsigned int, unsigned int); + int (*target_index)(struct cpufreq_policy *, unsigned int); + unsigned int (*fast_switch)(struct cpufreq_policy *, unsigned int); + void (*adjust_perf)(unsigned int, long unsigned int, long unsigned int, long unsigned int); + unsigned int (*get_intermediate)(struct cpufreq_policy *, unsigned int); + int (*target_intermediate)(struct cpufreq_policy *, unsigned int); + unsigned int (*get)(unsigned int); + void (*update_limits)(unsigned int); + int (*bios_limit)(int, unsigned int *); + int (*online)(struct cpufreq_policy *); + int (*offline)(struct cpufreq_policy *); + int (*exit)(struct cpufreq_policy *); + int (*suspend)(struct cpufreq_policy *); + int (*resume)(struct cpufreq_policy *); + void (*ready)(struct cpufreq_policy *); + struct freq_attr **attr; + bool boost_enabled; + int (*set_boost)(struct cpufreq_policy *, int); + void (*register_em)(struct cpufreq_policy *); +}; + +struct cpufreq_stats { + unsigned int total_trans; + long: 32; + long long unsigned int last_time; + unsigned int max_state; + unsigned int state_num; + unsigned int last_index; + u64 *time_in_state; + unsigned int *freq_table; + unsigned int *trans_table; + unsigned int reset_pending; + long: 32; + long long unsigned int reset_time; +}; + +struct dbs_governor; + +struct dbs_data { + struct gov_attr_set attr_set; + struct dbs_governor *gov; + void *tuners; + unsigned int ignore_nice_load; + unsigned int sampling_rate; + unsigned int sampling_down_factor; + unsigned int up_threshold; + unsigned int io_is_busy; +}; + +struct policy_dbs_info; + +struct dbs_governor { + struct cpufreq_governor gov; + struct kobj_type kobj_type; + struct dbs_data *gdbs_data; + unsigned int (*gov_dbs_update)(struct cpufreq_policy *); + struct policy_dbs_info * (*alloc)(); + void (*free)(struct policy_dbs_info *); + int (*init)(struct dbs_data *); + void (*exit)(struct dbs_data *); + void (*start)(struct cpufreq_policy *); +}; + +struct policy_dbs_info { + struct cpufreq_policy *policy; + struct mutex update_mutex; + u64 last_sample_time; + s64 sample_delay_ns; + atomic_t work_count; + struct irq_work irq_work; + struct work_struct work; + struct dbs_data *dbs_data; + struct list_head list; + unsigned int rate_mult; + unsigned int idle_periods; + bool is_shared; + bool work_in_progress; + long: 32; +}; + +struct cpu_dbs_info { + u64 prev_cpu_idle; + u64 prev_update_time; + u64 prev_cpu_nice; + unsigned int prev_load; + struct update_util_data update_util; + struct policy_dbs_info *policy_dbs; + long: 32; +}; + +struct cpufreq_policy; + +struct cpufreq_dt_platform_data { + bool have_governor_per_policy; + unsigned int (*get_intermediate)(struct cpufreq_policy *, unsigned int); + int (*target_intermediate)(struct cpufreq_policy *, unsigned int); + int (*suspend)(struct cpufreq_policy *); + int (*resume)(struct cpufreq_policy *); +}; + +struct tegra124_cpufreq_priv { + struct clk *cpu_clk; + struct clk *pllp_clk; + struct clk *pllx_clk; + struct clk *dfll_clk; + struct platform_device *cpufreq_dt_pdev; +}; + +struct ti_cpufreq_data; + +struct ti_cpufreq_soc_data { + const char * const *reg_names; + long unsigned int (*efuse_xlate)(struct ti_cpufreq_data *, long unsigned int); + long unsigned int efuse_fallback; + long unsigned int efuse_offset; + long unsigned int efuse_mask; + long unsigned int efuse_shift; + long unsigned int rev_offset; + bool multi_regulator; +}; + +struct ti_cpufreq_data { + struct device *cpu_dev; + struct device_node *opp_node; + struct regmap *syscon; + const struct ti_cpufreq_soc_data *soc_data; +}; + +struct mmc_cid { + unsigned int manfid; + char prod_name[8]; + unsigned char prv; + unsigned int serial; + short unsigned int oemid; + short unsigned int year; + unsigned char hwrev; + unsigned char fwrev; + unsigned char month; +}; + +struct mmc_csd { + unsigned char structure; + unsigned char mmca_vsn; + short unsigned int cmdclass; + short unsigned int taac_clks; + unsigned int taac_ns; + unsigned int c_size; + unsigned int r2w_factor; + unsigned int max_dtr; + unsigned int erase_size; + unsigned int read_blkbits; + unsigned int write_blkbits; + unsigned int capacity; + unsigned int read_partial: 1; + unsigned int read_misalign: 1; + unsigned int write_partial: 1; + unsigned int write_misalign: 1; + unsigned int dsr_imp: 1; +}; + +struct mmc_ext_csd { + u8 rev; + u8 erase_group_def; + u8 sec_feature_support; + u8 rel_sectors; + u8 rel_param; + bool enhanced_rpmb_supported; + u8 part_config; + u8 cache_ctrl; + u8 rst_n_function; + u8 max_packed_writes; + u8 max_packed_reads; + u8 packed_event_en; + unsigned int part_time; + unsigned int sa_timeout; + unsigned int generic_cmd6_time; + unsigned int power_off_longtime; + u8 power_off_notification; + unsigned int hs_max_dtr; + unsigned int hs200_max_dtr; + unsigned int sectors; + unsigned int hc_erase_size; + unsigned int hc_erase_timeout; + unsigned int sec_trim_mult; + unsigned int sec_erase_mult; + unsigned int trim_timeout; + bool partition_setting_completed; + long: 32; + long long unsigned int enhanced_area_offset; + unsigned int enhanced_area_size; + unsigned int cache_size; + bool hpi_en; + bool hpi; + unsigned int hpi_cmd; + bool bkops; + bool man_bkops_en; + bool auto_bkops_en; + unsigned int data_sector_size; + unsigned int data_tag_unit_size; + unsigned int boot_ro_lock; + bool boot_ro_lockable; + bool ffu_capable; + bool cmdq_en; + bool cmdq_support; + unsigned int cmdq_depth; + u8 fwrev[8]; + u8 raw_exception_status; + u8 raw_partition_support; + u8 raw_rpmb_size_mult; + u8 raw_erased_mem_count; + u8 strobe_support; + u8 raw_ext_csd_structure; + u8 raw_card_type; + u8 raw_driver_strength; + u8 out_of_int_time; + u8 raw_pwr_cl_52_195; + u8 raw_pwr_cl_26_195; + u8 raw_pwr_cl_52_360; + u8 raw_pwr_cl_26_360; + u8 raw_s_a_timeout; + u8 raw_hc_erase_gap_size; + u8 raw_erase_timeout_mult; + u8 raw_hc_erase_grp_size; + u8 raw_boot_mult; + u8 raw_sec_trim_mult; + u8 raw_sec_erase_mult; + u8 raw_sec_feature_support; + u8 raw_trim_mult; + u8 raw_pwr_cl_200_195; + u8 raw_pwr_cl_200_360; + u8 raw_pwr_cl_ddr_52_195; + u8 raw_pwr_cl_ddr_52_360; + u8 raw_pwr_cl_ddr_200_360; + u8 raw_bkops_status; + u8 raw_sectors[4]; + u8 pre_eol_info; + u8 device_life_time_est_typ_a; + u8 device_life_time_est_typ_b; + unsigned int feature_support; +}; + +struct sd_scr { + unsigned char sda_vsn; + unsigned char sda_spec3; + unsigned char sda_spec4; + unsigned char sda_specx; + unsigned char bus_widths; + unsigned char cmds; +}; + +struct sd_ssr { + unsigned int au; + unsigned int erase_timeout; + unsigned int erase_offset; +}; + +struct sd_switch_caps { + unsigned int hs_max_dtr; + unsigned int uhs_max_dtr; + unsigned int sd3_bus_mode; + unsigned int sd3_drv_type; + unsigned int sd3_curr_limit; +}; + +struct sd_ext_reg { + u8 fno; + u8 page; + u16 offset; + u8 rev; + u8 feature_enabled; + u8 feature_support; +}; + +struct sdio_cccr { + unsigned int sdio_vsn; + unsigned int sd_vsn; + unsigned int multi_block: 1; + unsigned int low_speed: 1; + unsigned int wide_bus: 1; + unsigned int high_power: 1; + unsigned int high_speed: 1; + unsigned int disable_cd: 1; + unsigned int enable_async_irq: 1; +}; + +struct sdio_cis { + short unsigned int vendor; + short unsigned int device; + short unsigned int blksize; + unsigned int max_dtr; +}; + +struct mmc_part { + u64 size; + unsigned int part_cfg; + char name[20]; + bool force_ro; + unsigned int area_type; +}; + +struct mmc_host; + +struct sdio_func; + +struct sdio_func_tuple; + +struct mmc_card { + struct mmc_host *host; + long: 32; + struct device dev; + u32 ocr; + unsigned int rca; + unsigned int type; + unsigned int state; + unsigned int quirks; + unsigned int quirk_max_rate; + bool reenable_cmdq; + unsigned int erase_size; + unsigned int erase_shift; + unsigned int pref_erase; + unsigned int eg_boundary; + unsigned int erase_arg; + u8 erased_byte; + u32 raw_cid[4]; + u32 raw_csd[4]; + u32 raw_scr[2]; + u32 raw_ssr[16]; + struct mmc_cid cid; + struct mmc_csd csd; + long: 32; + struct mmc_ext_csd ext_csd; + struct sd_scr scr; + struct sd_ssr ssr; + struct sd_switch_caps sw_caps; + struct sd_ext_reg ext_power; + struct sd_ext_reg ext_perf; + unsigned int sdio_funcs; + atomic_t sdio_funcs_probed; + struct sdio_cccr cccr; + struct sdio_cis cis; + struct sdio_func *sdio_func[7]; + struct sdio_func *sdio_single_irq; + u8 major_rev; + u8 minor_rev; + unsigned int num_info; + const char **info; + struct sdio_func_tuple *tuples; + unsigned int sd_bus_speed; + unsigned int mmc_avail_type; + unsigned int drive_strength; + struct dentry *debugfs_root; + struct mmc_part part[7]; + unsigned int nr_parts; + struct workqueue_struct *complete_wq; +}; + +typedef unsigned int mmc_pm_flag_t; + +struct mmc_ios { + unsigned int clock; + short unsigned int vdd; + unsigned int power_delay_ms; + unsigned char bus_mode; + unsigned char chip_select; + unsigned char power_mode; + unsigned char bus_width; + unsigned char timing; + unsigned char signal_voltage; + unsigned char drv_type; + bool enhanced_strobe; +}; + +struct mmc_ctx { + struct task_struct *task; +}; + +struct mmc_slot { + int cd_irq; + bool cd_wake_enabled; + void *handler_priv; +}; + +struct mmc_supply { + struct regulator *vmmc; + struct regulator *vqmmc; +}; + +struct mmc_host_ops; + +struct mmc_pwrseq; + +struct mmc_bus_ops; + +struct mmc_request; + +struct mmc_cqe_ops; + +struct mmc_host { + struct device *parent; + long: 32; + struct device class_dev; + int index; + const struct mmc_host_ops *ops; + struct mmc_pwrseq *pwrseq; + unsigned int f_min; + unsigned int f_max; + unsigned int f_init; + u32 ocr_avail; + u32 ocr_avail_sdio; + u32 ocr_avail_sd; + u32 ocr_avail_mmc; + struct wakeup_source *ws; + u32 max_current_330; + u32 max_current_300; + u32 max_current_180; + u32 caps; + u32 caps2; + int fixed_drv_type; + mmc_pm_flag_t pm_caps; + unsigned int max_seg_size; + short unsigned int max_segs; + short unsigned int unused; + unsigned int max_req_size; + unsigned int max_blk_size; + unsigned int max_blk_count; + unsigned int max_busy_timeout; + spinlock_t lock; + struct mmc_ios ios; + unsigned int use_spi_crc: 1; + unsigned int claimed: 1; + unsigned int doing_init_tune: 1; + unsigned int can_retune: 1; + unsigned int doing_retune: 1; + unsigned int retune_now: 1; + unsigned int retune_paused: 1; + unsigned int retune_crc_disable: 1; + unsigned int can_dma_map_merge: 1; + int rescan_disable; + int rescan_entered; + int need_retune; + int hold_retune; + unsigned int retune_period; + struct timer_list retune_timer; + bool trigger_card_event; + struct mmc_card *card; + wait_queue_head_t wq; + struct mmc_ctx *claimer; + int claim_cnt; + struct mmc_ctx default_ctx; + struct delayed_work detect; + int detect_change; + struct mmc_slot slot; + const struct mmc_bus_ops *bus_ops; + unsigned int sdio_irqs; + struct task_struct *sdio_irq_thread; + struct work_struct sdio_irq_work; + bool sdio_irq_pending; + atomic_t sdio_irq_thread_abort; + mmc_pm_flag_t pm_flags; + struct led_trigger *led; + bool regulator_enabled; + struct mmc_supply supply; + struct dentry *debugfs_root; + struct mmc_request *ongoing_mrq; + unsigned int actual_clock; + unsigned int slotno; + int dsr_req; + u32 dsr; + const struct mmc_cqe_ops *cqe_ops; + void *cqe_private; + int cqe_qdepth; + bool cqe_enabled; + bool cqe_on; + bool hsq_enabled; + u32 err_stats[15]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long unsigned int private[0]; +}; + +struct mmc_data; + +struct mmc_command { + u32 opcode; + u32 arg; + u32 resp[4]; + unsigned int flags; + unsigned int retries; + int error; + unsigned int busy_timeout; + struct mmc_data *data; + struct mmc_request *mrq; +}; + +struct mmc_data { + unsigned int timeout_ns; + unsigned int timeout_clks; + unsigned int blksz; + unsigned int blocks; + unsigned int blk_addr; + int error; + unsigned int flags; + unsigned int bytes_xfered; + struct mmc_command *stop; + struct mmc_request *mrq; + unsigned int sg_len; + int sg_count; + struct scatterlist *sg; + s32 host_cookie; +}; + +struct mmc_request { + struct mmc_command *sbc; + struct mmc_command *cmd; + struct mmc_data *data; + struct mmc_command *stop; + struct completion completion; + struct completion cmd_completion; + void (*done)(struct mmc_request *); + void (*recovery_notifier)(struct mmc_request *); + struct mmc_host *host; + bool cap_cmd_during_tfr; + int tag; +}; + +struct mmc_host_ops { + void (*post_req)(struct mmc_host *, struct mmc_request *, int); + void (*pre_req)(struct mmc_host *, struct mmc_request *); + void (*request)(struct mmc_host *, struct mmc_request *); + int (*request_atomic)(struct mmc_host *, struct mmc_request *); + void (*set_ios)(struct mmc_host *, struct mmc_ios *); + int (*get_ro)(struct mmc_host *); + int (*get_cd)(struct mmc_host *); + void (*enable_sdio_irq)(struct mmc_host *, int); + void (*ack_sdio_irq)(struct mmc_host *); + void (*init_card)(struct mmc_host *, struct mmc_card *); + int (*start_signal_voltage_switch)(struct mmc_host *, struct mmc_ios *); + int (*card_busy)(struct mmc_host *); + int (*execute_tuning)(struct mmc_host *, u32); + int (*prepare_hs400_tuning)(struct mmc_host *, struct mmc_ios *); + int (*execute_hs400_tuning)(struct mmc_host *, struct mmc_card *); + int (*hs400_prepare_ddr)(struct mmc_host *); + void (*hs400_downgrade)(struct mmc_host *); + void (*hs400_complete)(struct mmc_host *); + void (*hs400_enhanced_strobe)(struct mmc_host *, struct mmc_ios *); + int (*select_drive_strength)(struct mmc_card *, unsigned int, int, int, int *); + void (*card_hw_reset)(struct mmc_host *); + void (*card_event)(struct mmc_host *); + int (*multi_io_quirk)(struct mmc_card *, unsigned int, int); + int (*init_sd_express)(struct mmc_host *, struct mmc_ios *); +}; + +struct mmc_cqe_ops { + int (*cqe_enable)(struct mmc_host *, struct mmc_card *); + void (*cqe_disable)(struct mmc_host *); + int (*cqe_request)(struct mmc_host *, struct mmc_request *); + void (*cqe_post_req)(struct mmc_host *, struct mmc_request *); + void (*cqe_off)(struct mmc_host *); + int (*cqe_wait_for_idle)(struct mmc_host *); + bool (*cqe_timeout)(struct mmc_host *, struct mmc_request *, bool *); + void (*cqe_recovery_start)(struct mmc_host *); + void (*cqe_recovery_finish)(struct mmc_host *); +}; + +struct mmc_pwrseq_ops; + +struct mmc_pwrseq { + const struct mmc_pwrseq_ops *ops; + struct device *dev; + struct list_head pwrseq_node; + struct module *owner; +}; + +struct mmc_bus_ops { + void (*remove)(struct mmc_host *); + void (*detect)(struct mmc_host *); + int (*pre_suspend)(struct mmc_host *); + int (*suspend)(struct mmc_host *); + int (*resume)(struct mmc_host *); + int (*runtime_suspend)(struct mmc_host *); + int (*runtime_resume)(struct mmc_host *); + int (*alive)(struct mmc_host *); + int (*shutdown)(struct mmc_host *); + int (*hw_reset)(struct mmc_host *); + int (*sw_reset)(struct mmc_host *); + bool (*cache_enabled)(struct mmc_host *); + int (*flush_cache)(struct mmc_host *); +}; + +struct trace_event_raw_mmc_request_start { + struct trace_entry ent; + u32 cmd_opcode; + u32 cmd_arg; + unsigned int cmd_flags; + unsigned int cmd_retries; + u32 stop_opcode; + u32 stop_arg; + unsigned int stop_flags; + unsigned int stop_retries; + u32 sbc_opcode; + u32 sbc_arg; + unsigned int sbc_flags; + unsigned int sbc_retries; + unsigned int blocks; + unsigned int blk_addr; + unsigned int blksz; + unsigned int data_flags; + int tag; + unsigned int can_retune; + unsigned int doing_retune; + unsigned int retune_now; + int need_retune; + int hold_retune; + unsigned int retune_period; + struct mmc_request *mrq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_mmc_request_done { + struct trace_entry ent; + u32 cmd_opcode; + int cmd_err; + u32 cmd_resp[4]; + unsigned int cmd_retries; + u32 stop_opcode; + int stop_err; + u32 stop_resp[4]; + unsigned int stop_retries; + u32 sbc_opcode; + int sbc_err; + u32 sbc_resp[4]; + unsigned int sbc_retries; + unsigned int bytes_xfered; + int data_err; + int tag; + unsigned int can_retune; + unsigned int doing_retune; + unsigned int retune_now; + int need_retune; + int hold_retune; + unsigned int retune_period; + struct mmc_request *mrq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_data_offsets_mmc_request_start { + u32 name; +}; + +struct trace_event_data_offsets_mmc_request_done { + u32 name; +}; + +typedef void (*btf_trace_mmc_request_start)(void *, struct mmc_host *, struct mmc_request *); + +typedef void (*btf_trace_mmc_request_done)(void *, struct mmc_host *, struct mmc_request *); + +struct mmc_pwrseq_ops { + void (*pre_power_on)(struct mmc_host *); + void (*post_power_on)(struct mmc_host *); + void (*power_off)(struct mmc_host *); + void (*reset)(struct mmc_host *); +}; + +enum mmc_busy_cmd { + MMC_BUSY_CMD6 = 0, + MMC_BUSY_ERASE = 1, + MMC_BUSY_HPI = 2, + MMC_BUSY_EXTR_SINGLE = 3, + MMC_BUSY_IO = 4, +}; + +struct mmc_driver { + struct device_driver drv; + int (*probe)(struct mmc_card *); + void (*remove)(struct mmc_card *); + void (*shutdown)(struct mmc_card *); +}; + +struct mmc_clk_phase { + bool valid; + u16 in_deg; + u16 out_deg; +}; + +struct mmc_clk_phase_map { + struct mmc_clk_phase phase[11]; +}; + +struct mmc_fixup { + const char *name; + long: 32; + u64 rev_start; + u64 rev_end; + unsigned int manfid; + short unsigned int oemid; + u16 cis_vendor; + u16 cis_device; + unsigned int ext_csd_rev; + const char *of_compatible; + void (*vendor_fixup)(struct mmc_card *, int); + int data; + long: 32; +}; + +struct mmc_busy_data { + struct mmc_card *card; + bool retry_crc_err; + enum mmc_busy_cmd busy_cmd; +}; + +struct mmc_op_cond_busy_data { + struct mmc_host *host; + u32 ocr; + struct mmc_command *cmd; +}; + +struct sd_busy_data { + struct mmc_card *card; + u8 *reg_buf; +}; + +typedef void sdio_irq_handler_t(struct sdio_func *); + +struct sdio_func { + struct mmc_card *card; + long: 32; + struct device dev; + sdio_irq_handler_t *irq_handler; + unsigned int num; + unsigned char class; + short unsigned int vendor; + short unsigned int device; + unsigned int max_blksize; + unsigned int cur_blksize; + unsigned int enable_timeout; + unsigned int state; + u8 *tmpbuf; + u8 major_rev; + u8 minor_rev; + unsigned int num_info; + const char **info; + struct sdio_func_tuple *tuples; + long: 32; +}; + +struct sdio_func_tuple { + struct sdio_func_tuple *next; + unsigned char code; + unsigned char size; + unsigned char data[0]; +}; + +struct sdio_device_id { + __u8 class; + __u16 vendor; + __u16 device; + kernel_ulong_t driver_data; +}; + +struct sdio_driver { + char *name; + const struct sdio_device_id *id_table; + int (*probe)(struct sdio_func *, const struct sdio_device_id *); + void (*remove)(struct sdio_func *); + struct device_driver drv; +}; + +typedef int tpl_parse_t(struct mmc_card *, struct sdio_func *, const unsigned char *, unsigned int); + +struct cis_tpl { + unsigned char code; + unsigned char min_size; + tpl_parse_t *parse; +}; + +struct mmc_gpio { + struct gpio_desc *ro_gpio; + struct gpio_desc *cd_gpio; + irqreturn_t (*cd_gpio_isr)(int, void *); + char *ro_label; + char *cd_label; + u32 cd_debounce_delay_ms; +}; + +struct mmc_pwrseq_simple { + struct mmc_pwrseq pwrseq; + bool clk_enabled; + u32 post_power_on_delay_ms; + u32 power_off_delay_us; + struct clk *ext_clk; + struct gpio_descs *reset_gpios; +}; + +struct mmc_pwrseq_emmc { + struct mmc_pwrseq pwrseq; + struct notifier_block reset_nb; + struct gpio_desc *reset_gpio; +}; + +struct mmc_ioc_cmd { + int write_flag; + int is_acmd; + __u32 opcode; + __u32 arg; + __u32 response[4]; + unsigned int flags; + unsigned int blksz; + unsigned int blocks; + unsigned int postsleep_min_us; + unsigned int postsleep_max_us; + unsigned int data_timeout_ns; + unsigned int cmd_timeout_ms; + __u32 __pad; + __u64 data_ptr; +}; + +struct mmc_ioc_multi_cmd { + __u64 num_of_cmds; + struct mmc_ioc_cmd cmds[0]; +}; + +enum mmc_issued { + MMC_REQ_STARTED = 0, + MMC_REQ_BUSY = 1, + MMC_REQ_FAILED_TO_START = 2, + MMC_REQ_FINISHED = 3, +}; + +enum mmc_issue_type { + MMC_ISSUE_SYNC = 0, + MMC_ISSUE_DCMD = 1, + MMC_ISSUE_ASYNC = 2, + MMC_ISSUE_MAX = 3, +}; + +struct mmc_blk_request { + struct mmc_request mrq; + struct mmc_command sbc; + struct mmc_command cmd; + struct mmc_command stop; + struct mmc_data data; +}; + +enum mmc_drv_op { + MMC_DRV_OP_IOCTL = 0, + MMC_DRV_OP_IOCTL_RPMB = 1, + MMC_DRV_OP_BOOT_WP = 2, + MMC_DRV_OP_GET_CARD_STATUS = 3, + MMC_DRV_OP_GET_EXT_CSD = 4, +}; + +struct mmc_queue_req { + struct mmc_blk_request brq; + struct scatterlist *sg; + enum mmc_drv_op drv_op; + int drv_op_result; + void *drv_op_data; + unsigned int ioc_count; + int retries; +}; + +struct mmc_blk_data; + +struct mmc_queue { + struct mmc_card *card; + struct mmc_ctx ctx; + struct blk_mq_tag_set tag_set; + struct mmc_blk_data *blkdata; + struct request_queue *queue; + spinlock_t lock; + int in_flight[3]; + unsigned int cqe_busy; + bool busy; + bool recovery_needed; + bool in_recovery; + bool rw_wait; + bool waiting; + struct work_struct recovery_work; + wait_queue_head_t wait; + struct request *recovery_req; + struct request *complete_req; + struct mutex complete_lock; + struct work_struct complete_work; +}; + +struct mmc_blk_data { + struct device *parent; + struct gendisk *disk; + struct mmc_queue queue; + struct list_head part; + struct list_head rpmbs; + unsigned int flags; + struct kref kref; + unsigned int read_only; + unsigned int part_type; + unsigned int reset_done; + unsigned int part_curr; + int area_type; + struct dentry *status_dentry; + struct dentry *ext_csd_dentry; +}; + +struct mmc_blk_busy_data { + struct mmc_card *card; + u32 status; +}; + +struct mmc_rpmb_data { + struct device dev; + struct cdev chrdev; + int id; + unsigned int part_index; + struct mmc_blk_data *md; + struct list_head node; +}; + +struct mmc_blk_ioc_data { + struct mmc_ioc_cmd ic; + unsigned char *buf; + long: 32; + u64 buf_bytes; + struct mmc_rpmb_data *rpmb; + long: 32; +}; + +enum led_default_state { + LEDS_DEFSTATE_OFF = 0, + LEDS_DEFSTATE_ON = 1, + LEDS_DEFSTATE_KEEP = 2, +}; + +struct led_properties { + u32 color; + bool color_present; + const char *function; + u32 func_enum; + bool func_enum_present; + const char *label; +}; + +enum ns2_led_modes { + NS_V2_LED_OFF = 0, + NS_V2_LED_ON = 1, + NS_V2_LED_SATA = 2, +}; + +struct ns2_led_modval { + u32 mode; + u32 cmd_level; + u32 slow_level; +}; + +struct ns2_led { + struct led_classdev cdev; + struct gpio_desc *cmd; + struct gpio_desc *slow; + bool can_sleep; + unsigned char sata; + rwlock_t rw_lock; + int num_modes; + struct ns2_led_modval *modval; +}; + +struct led_trigger_cpu { + bool is_active; + char name[8]; + struct led_trigger *_trig; +}; + +enum dmi_entry_type { + DMI_ENTRY_BIOS = 0, + DMI_ENTRY_SYSTEM = 1, + DMI_ENTRY_BASEBOARD = 2, + DMI_ENTRY_CHASSIS = 3, + DMI_ENTRY_PROCESSOR = 4, + DMI_ENTRY_MEM_CONTROLLER = 5, + DMI_ENTRY_MEM_MODULE = 6, + DMI_ENTRY_CACHE = 7, + DMI_ENTRY_PORT_CONNECTOR = 8, + DMI_ENTRY_SYSTEM_SLOT = 9, + DMI_ENTRY_ONBOARD_DEVICE = 10, + DMI_ENTRY_OEMSTRINGS = 11, + DMI_ENTRY_SYSCONF = 12, + DMI_ENTRY_BIOS_LANG = 13, + DMI_ENTRY_GROUP_ASSOC = 14, + DMI_ENTRY_SYSTEM_EVENT_LOG = 15, + DMI_ENTRY_PHYS_MEM_ARRAY = 16, + DMI_ENTRY_MEM_DEVICE = 17, + DMI_ENTRY_32_MEM_ERROR = 18, + DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR = 19, + DMI_ENTRY_MEM_DEV_MAPPED_ADDR = 20, + DMI_ENTRY_BUILTIN_POINTING_DEV = 21, + DMI_ENTRY_PORTABLE_BATTERY = 22, + DMI_ENTRY_SYSTEM_RESET = 23, + DMI_ENTRY_HW_SECURITY = 24, + DMI_ENTRY_SYSTEM_POWER_CONTROLS = 25, + DMI_ENTRY_VOLTAGE_PROBE = 26, + DMI_ENTRY_COOLING_DEV = 27, + DMI_ENTRY_TEMP_PROBE = 28, + DMI_ENTRY_ELECTRICAL_CURRENT_PROBE = 29, + DMI_ENTRY_OOB_REMOTE_ACCESS = 30, + DMI_ENTRY_BIS_ENTRY = 31, + DMI_ENTRY_SYSTEM_BOOT = 32, + DMI_ENTRY_MGMT_DEV = 33, + DMI_ENTRY_MGMT_DEV_COMPONENT = 34, + DMI_ENTRY_MGMT_DEV_THRES = 35, + DMI_ENTRY_MEM_CHANNEL = 36, + DMI_ENTRY_IPMI_DEV = 37, + DMI_ENTRY_SYS_POWER_SUPPLY = 38, + DMI_ENTRY_ADDITIONAL = 39, + DMI_ENTRY_ONBOARD_DEV_EXT = 40, + DMI_ENTRY_MGMT_CONTROLLER_HOST = 41, + DMI_ENTRY_INACTIVE = 126, + DMI_ENTRY_END_OF_TABLE = 127, +}; + +struct dmi_header { + u8 type; + u8 length; + u16 handle; +}; + +struct dmi_memdev_info { + const char *device; + const char *bank; + u64 size; + u16 handle; + u8 type; + long: 32; +}; + +struct dmi_sysfs_entry { + struct dmi_header dh; + struct kobject kobj; + int instance; + int position; + struct list_head list; + struct kobject *child; +}; + +struct dmi_sysfs_attribute { + struct attribute attr; + ssize_t (*show)(struct dmi_sysfs_entry *, char *); +}; + +struct dmi_sysfs_mapped_attribute { + struct attribute attr; + ssize_t (*show)(struct dmi_sysfs_entry *, const struct dmi_header *, char *); +}; + +typedef ssize_t (*dmi_callback)(struct dmi_sysfs_entry *, const struct dmi_header *, void *); + +struct find_dmi_data { + struct dmi_sysfs_entry *entry; + dmi_callback callback; + void *private; + int instance_countdown; + ssize_t ret; +}; + +struct dmi_read_state { + char *buf; + long: 32; + loff_t pos; + size_t count; + long: 32; +}; + +struct dmi_entry_attr_show_data { + struct attribute *attr; + char *buf; +}; + +struct dmi_system_event_log { + struct dmi_header header; + u16 area_length; + u16 header_start_offset; + u16 data_start_offset; + u8 access_method; + u8 status; + u32 change_token; + union { + struct { + u16 index_addr; + u16 data_addr; + } io; + u32 phys_addr32; + u16 gpnv_handle; + u32 access_method_address; + }; + u8 header_format; + u8 type_descriptors_supported_count; + u8 per_log_type_descriptor_length; + u8 supported_log_type_descriptos[0]; +} __attribute__((packed)); + +typedef u8 (*sel_io_reader)(const struct dmi_system_event_log *, loff_t); + +struct dmi_device_attribute { + struct device_attribute dev_attr; + int field; +}; + +struct mafield { + const char *prefix; + int field; +}; + +struct mbox_client { + struct device *dev; + bool tx_block; + long unsigned int tx_tout; + bool knows_txdone; + void (*rx_callback)(struct mbox_client *, void *); + void (*tx_prepare)(struct mbox_client *, void *); + void (*tx_done)(struct mbox_client *, void *, int); +}; + +enum rpi_firmware_property_status { + RPI_FIRMWARE_STATUS_REQUEST = 0, + RPI_FIRMWARE_STATUS_SUCCESS = 2147483648, + RPI_FIRMWARE_STATUS_ERROR = 2147483649, +}; + +struct rpi_firmware_property_tag_header { + u32 tag; + u32 buf_size; + u32 req_resp_size; +}; + +struct rpi_firmware_clk_rate_request { + __le32 id; + __le32 rate; +}; + +struct mbox_chan; + +struct rpi_firmware { + struct mbox_client cl; + struct mbox_chan *chan; + struct completion c; + u32 enabled; + struct kref consumers; +}; + +typedef efi_status_t efi_query_variable_store_t(u32, long unsigned int, bool); + +typedef struct { + efi_guid_t guid; + u64 table; +} efi_config_table_64_t; + +typedef struct { + efi_guid_t guid; + u32 table; +} efi_config_table_32_t; + +typedef union { + struct { + efi_guid_t guid; + void *table; + }; + efi_config_table_32_t mixed_mode; +} efi_config_table_t; + +typedef struct { + u16 version; + u16 length; + u32 runtime_services_supported; +} efi_rt_properties_table_t; + +struct efivar_operations { + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_store_t *query_variable_store; +}; + +struct efivars { + struct kset *kset; + struct kobject *kobject; + const struct efivar_operations *ops; +}; + +struct linux_efi_random_seed { + u32 size; + u8 bits[0]; +}; + +struct linux_efi_memreserve { + int size; + atomic_t count; + phys_addr_t next; + struct { + phys_addr_t base; + phys_addr_t size; + } entry[0]; +}; + +struct linux_efi_initrd { + long unsigned int base; + long unsigned int size; +}; + +struct sys_off_handler; + +typedef struct { + u32 version; + u32 num_entries; + u32 desc_size; + u32 reserved; + efi_memory_desc_t entry[0]; +} efi_memory_attributes_table_t; + +typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *); + +struct linux_efi_tpm_eventlog { + u32 size; + u32 final_events_preboot_size; + u8 version; + u8 log[0]; +}; + +struct efi_tcg2_final_events_table { + u64 version; + u64 nr_events; + u8 events[0]; +}; + +struct tpm_digest { + u16 alg_id; + u8 digest[64]; +}; + +enum tpm_duration { + TPM_SHORT = 0, + TPM_MEDIUM = 1, + TPM_LONG = 2, + TPM_LONG_LONG = 3, + TPM_UNDEFINED = 4, + TPM_NUM_DURATIONS = 4, +}; + +enum tcpa_event_types { + PREBOOT = 0, + POST_CODE = 1, + UNUSED = 2, + NO_ACTION = 3, + SEPARATOR = 4, + ACTION = 5, + EVENT_TAG = 6, + SCRTM_CONTENTS = 7, + SCRTM_VERSION = 8, + CPU_MICROCODE = 9, + PLATFORM_CONFIG_FLAGS = 10, + TABLE_OF_DEVICES = 11, + COMPACT_HASH = 12, + IPL = 13, + IPL_PARTITION_DATA = 14, + NONHOST_CODE = 15, + NONHOST_CONFIG = 16, + NONHOST_INFO = 17, +}; + +struct tcg_efi_specid_event_algs { + u16 alg_id; + u16 digest_size; +}; + +struct tcg_efi_specid_event_head { + u8 signature[16]; + u32 platform_class; + u8 spec_version_minor; + u8 spec_version_major; + u8 spec_errata; + u8 uintnsize; + u32 num_algs; + struct tcg_efi_specid_event_algs digest_sizes[0]; +}; + +struct tcg_pcr_event { + u32 pcr_idx; + u32 event_type; + u8 digest[20]; + u32 event_size; + u8 event[0]; +}; + +struct tcg_event_field { + u32 event_size; + u8 event[0]; +}; + +struct tcg_pcr_event2_head { + u32 pcr_idx; + u32 event_type; + u32 count; + struct tpm_digest digests[0]; +}; + +struct efi_memory_map_data { + phys_addr_t phys_map; + long unsigned int size; + long unsigned int desc_version; + long unsigned int desc_size; + long unsigned int flags; +}; + +typedef u64 efi_physical_addr_t; + +typedef struct { + u64 length; + u64 data; +} efi_capsule_block_desc_t; + +enum { + SYSTAB = 0, + MMBASE = 1, + MMSIZE = 2, + DCSIZE = 3, + DCVERS = 4, + PARAMCOUNT = 5, +}; + +struct efi_system_resource_entry_v1 { + efi_guid_t fw_class; + u32 fw_type; + u32 fw_version; + u32 lowest_supported_fw_version; + u32 capsule_flags; + u32 last_attempt_version; + u32 last_attempt_status; +}; + +struct efi_system_resource_table { + u32 fw_resource_count; + u32 fw_resource_count_max; + u64 fw_resource_version; + u8 entries[0]; +}; + +struct esre_entry { + union { + struct efi_system_resource_entry_v1 *esre1; + } esre; + struct kobject kobj; + struct list_head list; +}; + +struct esre_attribute { + struct attribute attr; + ssize_t (*show)(struct esre_entry *, char *); + ssize_t (*store)(struct esre_entry *, const char *, size_t); +}; + +enum efi_rts_ids { + EFI_NONE = 0, + EFI_GET_TIME = 1, + EFI_SET_TIME = 2, + EFI_GET_WAKEUP_TIME = 3, + EFI_SET_WAKEUP_TIME = 4, + EFI_GET_VARIABLE = 5, + EFI_GET_NEXT_VARIABLE = 6, + EFI_SET_VARIABLE = 7, + EFI_QUERY_VARIABLE_INFO = 8, + EFI_GET_NEXT_HIGH_MONO_COUNT = 9, + EFI_RESET_SYSTEM = 10, + EFI_UPDATE_CAPSULE = 11, + EFI_QUERY_CAPSULE_CAPS = 12, +}; + +struct efi_runtime_work { + void *arg1; + void *arg2; + void *arg3; + void *arg4; + void *arg5; + efi_status_t status; + struct work_struct work; + enum efi_rts_ids efi_rts_id; + struct completion efi_rts_comp; +}; + +enum { + M_I17 = 0, + M_I20 = 1, + M_I20_SR = 2, + M_I24 = 3, + M_I24_8_1 = 4, + M_I24_10_1 = 5, + M_I27_11_1 = 6, + M_MINI = 7, + M_MINI_3_1 = 8, + M_MINI_4_1 = 9, + M_MB = 10, + M_MB_2 = 11, + M_MB_3 = 12, + M_MB_5_1 = 13, + M_MB_6_1 = 14, + M_MB_7_1 = 15, + M_MB_SR = 16, + M_MBA = 17, + M_MBA_3 = 18, + M_MBP = 19, + M_MBP_2 = 20, + M_MBP_2_2 = 21, + M_MBP_SR = 22, + M_MBP_4 = 23, + M_MBP_5_1 = 24, + M_MBP_5_2 = 25, + M_MBP_5_3 = 26, + M_MBP_6_1 = 27, + M_MBP_6_2 = 28, + M_MBP_7_1 = 29, + M_MBP_8_2 = 30, + M_UNKNOWN = 31, +}; + +struct efifb_dmi_info { + char *optname; + long unsigned int base; + int stride; + int width; + int height; + int flags; +}; + +enum { + OVERRIDE_NONE = 0, + OVERRIDE_BASE = 1, + OVERRIDE_STRIDE = 2, + OVERRIDE_HEIGHT = 4, + OVERRIDE_WIDTH = 8, +}; + +union efi_boot_services; + +typedef union efi_boot_services efi_boot_services_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 fw_vendor; + u32 fw_revision; + u32 con_in_handle; + u32 con_in; + u32 con_out_handle; + u32 con_out; + u32 stderr_handle; + u32 stderr; + u32 runtime; + u32 boottime; + u32 nr_tables; + u32 tables; +} efi_system_table_32_t; + +union efi_simple_text_input_protocol; + +typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; + +union efi_simple_text_output_protocol; + +typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; + +typedef union { + struct { + efi_table_hdr_t hdr; + long unsigned int fw_vendor; + u32 fw_revision; + long unsigned int con_in_handle; + efi_simple_text_input_protocol_t *con_in; + long unsigned int con_out_handle; + efi_simple_text_output_protocol_t *con_out; + long unsigned int stderr_handle; + long unsigned int stderr; + efi_runtime_services_t *runtime; + efi_boot_services_t *boottime; + long unsigned int nr_tables; + long unsigned int tables; + }; + efi_system_table_32_t mixed_mode; +} efi_system_table_t; + +struct psci_0_1_function_ids { + u32 cpu_suspend; + u32 cpu_on; + u32 cpu_off; + u32 migrate; +}; + +typedef long unsigned int psci_fn(long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef int (*psci_initcall_t)(const struct device_node *); + +struct of_timer_irq { + int irq; + int index; + int percpu; + const char *name; + long unsigned int flags; + irq_handler_t handler; +}; + +struct of_timer_base { + void *base; + const char *name; + int index; +}; + +struct of_timer_clk { + struct clk *clk; + const char *name; + int index; + long unsigned int rate; + long unsigned int period; +}; + +struct timer_of { + unsigned int flags; + struct device_node *np; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct clock_event_device clkevt; + struct of_timer_base of_base; + struct of_timer_irq of_irq; + struct of_timer_clk of_clk; + void *private_data; + long: 32; +}; + +struct clocksource_mmio { + void *reg; + long: 32; + struct clocksource clksrc; +}; + +struct omap_dm_timer; + +struct omap_dm_timer_ops { + struct omap_dm_timer * (*request_by_node)(struct device_node *); + struct omap_dm_timer * (*request_specific)(int); + struct omap_dm_timer * (*request)(); + int (*free)(struct omap_dm_timer *); + void (*enable)(struct omap_dm_timer *); + void (*disable)(struct omap_dm_timer *); + int (*get_irq)(struct omap_dm_timer *); + int (*set_int_enable)(struct omap_dm_timer *, unsigned int); + int (*set_int_disable)(struct omap_dm_timer *, u32); + struct clk * (*get_fclk)(struct omap_dm_timer *); + int (*start)(struct omap_dm_timer *); + int (*stop)(struct omap_dm_timer *); + int (*set_source)(struct omap_dm_timer *, int); + int (*set_load)(struct omap_dm_timer *, unsigned int); + int (*set_match)(struct omap_dm_timer *, int, unsigned int); + int (*set_pwm)(struct omap_dm_timer *, int, int, int, int); + int (*get_pwm_status)(struct omap_dm_timer *); + int (*set_prescaler)(struct omap_dm_timer *, int); + unsigned int (*read_counter)(struct omap_dm_timer *); + int (*write_counter)(struct omap_dm_timer *, unsigned int); + unsigned int (*read_status)(struct omap_dm_timer *); + int (*write_status)(struct omap_dm_timer *, unsigned int); +}; + +struct omap_dm_timer {}; + +struct dmtimer_platform_data { + int (*set_timer_src)(struct platform_device *, int); + u32 timer_capability; + u32 timer_errata; + int (*get_context_loss_count)(struct device *); + const struct omap_dm_timer_ops *timer_ops; +}; + +struct timer_regs { + u32 ocp_cfg; + u32 tidr; + u32 tier; + u32 twer; + u32 tclr; + u32 tcrr; + u32 tldr; + u32 ttrg; + u32 twps; + u32 tmar; + u32 tcar1; + u32 tsicr; + u32 tcar2; + u32 tpir; + u32 tnir; + u32 tcvr; + u32 tocr; + u32 towr; +}; + +struct dmtimer { + struct omap_dm_timer cookie; + int id; + int irq; + struct clk *fclk; + void *io_base; + int irq_stat; + int irq_ena; + int irq_dis; + void *pend; + void *func_base; + atomic_t enabled; + long unsigned int rate; + unsigned int reserved: 1; + unsigned int posted: 1; + unsigned int omap1: 1; + struct timer_regs context; + int revision; + u32 capability; + u32 errata; + struct platform_device *pdev; + struct list_head node; + struct notifier_block nb; +}; + +enum { + REQUEST_ANY = 0, + REQUEST_BY_ID = 1, + REQUEST_BY_CAP = 2, + REQUEST_BY_NODE = 3, +}; + +struct dmtimer_systimer { + void *base; + u8 sysc; + u8 irq_stat; + u8 irq_ena; + u8 pend; + u8 load; + u8 counter; + u8 ctrl; + u8 wakeup; + u8 ifctrl; + struct clk *fck; + struct clk *ick; + long unsigned int rate; +}; + +struct dmtimer_clockevent { + struct clock_event_device dev; + struct dmtimer_systimer t; + u32 period; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct dmtimer_clocksource { + struct clocksource dev; + struct dmtimer_systimer t; + unsigned int loadval; +}; + +struct dw_apb_timer { + void *base; + long unsigned int freq; + int irq; +}; + +struct dw_apb_clock_event_device { + struct clock_event_device ced; + struct dw_apb_timer timer; + void (*eoi)(struct dw_apb_timer *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct dw_apb_clocksource { + struct dw_apb_timer timer; + long: 32; + struct clocksource cs; +}; + +struct rk_timer { + void *base; + void *ctrl; + struct clk *clk; + struct clk *pclk; + u32 freq; + int irq; +}; + +struct rk_clkevt { + struct clock_event_device ce; + struct rk_timer timer; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bcm2835_timer { + void *control; + void *compare; + int match_mask; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct clock_event_device evt; +}; + +struct sun5i_timer { + void *base; + struct clk *clk; + struct notifier_block clk_rate_cb; + u32 ticks_per_jiffy; +}; + +struct sun5i_timer_clksrc { + struct sun5i_timer timer; + struct clocksource clksrc; +}; + +struct sun5i_timer_clkevt { + struct sun5i_timer timer; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct clock_event_device clkevt; +}; + +struct stm32_timer_private { + int bits; +}; + +enum { + MCT_INT_SPI = 0, + MCT_INT_PPI = 1, +}; + +struct mct_clock_event_device { + struct clock_event_device evt; + long unsigned int base; + char name[11]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct samsung_pwm_variant { + u8 bits; + u8 div_base; + u8 tclk_mask; + u8 output_mask; + bool has_tint_cstat; +}; + +struct samsung_pwm_clocksource { + void *base; + const void *source_reg; + unsigned int irq[5]; + struct samsung_pwm_variant variant; + struct clk *timerclk; + unsigned int event_id; + unsigned int source_id; + unsigned int tcnt_max; + unsigned int tscaler_div; + unsigned int tdiv; + long unsigned int clock_count_per_tick; +}; + +struct ti_32k { + void *base; + void *counter; + struct clocksource cs; +}; + +enum arch_timer_reg { + ARCH_TIMER_REG_CTRL = 0, + ARCH_TIMER_REG_CVAL = 1, +}; + +enum arch_timer_ppi_nr { + ARCH_TIMER_PHYS_SECURE_PPI = 0, + ARCH_TIMER_PHYS_NONSECURE_PPI = 1, + ARCH_TIMER_VIRT_PPI = 2, + ARCH_TIMER_HYP_PPI = 3, + ARCH_TIMER_HYP_VIRT_PPI = 4, + ARCH_TIMER_MAX_TIMER_PPI = 5, +}; + +enum arch_timer_spi_nr { + ARCH_TIMER_PHYS_SPI = 0, + ARCH_TIMER_VIRT_SPI = 1, + ARCH_TIMER_MAX_TIMER_SPI = 2, +}; + +struct arch_timer_kvm_info { + struct timecounter timecounter; + int virtual_irq; + int physical_irq; +}; + +struct arch_timer_mem_frame { + bool valid; + long: 32; + phys_addr_t cntbase; + size_t size; + int phys_irq; + int virt_irq; + long: 32; +}; + +struct arch_timer_mem { + phys_addr_t cntctlbase; + size_t size; + long: 32; + struct arch_timer_mem_frame frame[8]; +}; + +struct arch_timer { + void *base; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct clock_event_device evt; +}; + +struct sp804_timer { + int load; + int load_h; + int value; + int value_h; + int ctrl; + int intclr; + int ris; + int mis; + int bgload; + int bgload_h; + int timer_base[2]; + int width; +}; + +struct sp804_clkevt { + void *base; + void *load; + void *load_h; + void *value; + void *value_h; + void *ctrl; + void *intclr; + void *ris; + void *mis; + void *bgload; + void *bgload_h; + long unsigned int reload; + int width; +}; + +enum imx_gpt_type { + GPT_TYPE_IMX1 = 0, + GPT_TYPE_IMX21 = 1, + GPT_TYPE_IMX31 = 2, + GPT_TYPE_IMX6DL = 3, +}; + +struct imx_gpt_data; + +struct imx_timer { + enum imx_gpt_type type; + void *base; + int irq; + struct clk *clk_per; + struct clk *clk_ipg; + const struct imx_gpt_data *gpt; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct clock_event_device ced; +}; + +struct imx_gpt_data { + int reg_tstat; + int reg_tcn; + int reg_tcmp; + void (*gpt_setup_tctl)(struct imx_timer *); + void (*gpt_irq_enable)(struct imx_timer *); + void (*gpt_irq_disable)(struct imx_timer *); + void (*gpt_irq_acknowledge)(struct imx_timer *); + int (*set_next_event)(long unsigned int, struct clock_event_device *); +}; + +struct alias_prop { + struct list_head link; + const char *alias; + struct device_node *np; + int id; + char stem[0]; +}; + +struct of_endpoint { + unsigned int port; + unsigned int id; + const struct device_node *local_node; +}; + +struct supplier_bindings { + struct device_node * (*parse_prop)(struct device_node *, const char *, int); + bool optional; + bool node_not_dev; +}; + +struct of_bus___2 { + void (*count_cells)(const void *, int, int *, int *); + u64 (*map)(__be32 *, const __be32 *, int, int, int); + int (*translate)(__be32 *, u64, int); +}; + +struct of_bus { + const char *name; + const char *addresses; + int (*match)(struct device_node *); + void (*count_cells)(struct device_node *, int *, int *); + u64 (*map)(__be32 *, const __be32 *, int, int, int); + int (*translate)(__be32 *, u64, int); + bool has_flags; + unsigned int (*get_flags)(const __be32 *); +}; + +struct of_intc_desc { + struct list_head list; + of_irq_init_cb_t irq_init_cb; + struct device_node *dev; + struct device_node *interrupt_parent; +}; + +struct rmem_assigned_device { + struct device *dev; + struct reserved_mem *rmem; + struct list_head list; +}; + +struct olpc_ec_driver { + int (*suspend)(struct platform_device *); + int (*resume)(struct platform_device *); + int (*ec_cmd)(u8, u8 *, size_t, u8 *, size_t, void *); + bool wakeup_available; +}; + +struct ec_cmd_desc { + u8 cmd; + u8 *inbuf; + u8 *outbuf; + size_t inlen; + size_t outlen; + int err; + struct completion finished; + struct list_head node; + void *priv; +}; + +struct olpc_ec_priv { + struct olpc_ec_driver *drv; + u8 version; + struct work_struct worker; + struct mutex cmd_lock; + bool dcon_enabled; + struct list_head cmd_q; + spinlock_t cmd_q_lock; + struct dentry *dbgfs_dir; + u16 ec_wakeup_mask; + bool suspended; +}; + +enum ec_status { + EC_RES_SUCCESS = 0, + EC_RES_INVALID_COMMAND = 1, + EC_RES_ERROR = 2, + EC_RES_INVALID_PARAM = 3, + EC_RES_ACCESS_DENIED = 4, + EC_RES_INVALID_RESPONSE = 5, + EC_RES_INVALID_VERSION = 6, + EC_RES_INVALID_CHECKSUM = 7, + EC_RES_IN_PROGRESS = 8, + EC_RES_UNAVAILABLE = 9, + EC_RES_TIMEOUT = 10, + EC_RES_OVERFLOW = 11, + EC_RES_INVALID_HEADER = 12, + EC_RES_REQUEST_TRUNCATED = 13, + EC_RES_RESPONSE_TOO_BIG = 14, + EC_RES_BUS_ERROR = 15, + EC_RES_BUSY = 16, + EC_RES_INVALID_HEADER_VERSION = 17, + EC_RES_INVALID_HEADER_CRC = 18, + EC_RES_INVALID_DATA_CRC = 19, + EC_RES_DUP_UNAVAILABLE = 20, +}; + +enum host_event_code { + EC_HOST_EVENT_LID_CLOSED = 1, + EC_HOST_EVENT_LID_OPEN = 2, + EC_HOST_EVENT_POWER_BUTTON = 3, + EC_HOST_EVENT_AC_CONNECTED = 4, + EC_HOST_EVENT_AC_DISCONNECTED = 5, + EC_HOST_EVENT_BATTERY_LOW = 6, + EC_HOST_EVENT_BATTERY_CRITICAL = 7, + EC_HOST_EVENT_BATTERY = 8, + EC_HOST_EVENT_THERMAL_THRESHOLD = 9, + EC_HOST_EVENT_DEVICE = 10, + EC_HOST_EVENT_THERMAL = 11, + EC_HOST_EVENT_USB_CHARGER = 12, + EC_HOST_EVENT_KEY_PRESSED = 13, + EC_HOST_EVENT_INTERFACE_READY = 14, + EC_HOST_EVENT_KEYBOARD_RECOVERY = 15, + EC_HOST_EVENT_THERMAL_SHUTDOWN = 16, + EC_HOST_EVENT_BATTERY_SHUTDOWN = 17, + EC_HOST_EVENT_THROTTLE_START = 18, + EC_HOST_EVENT_THROTTLE_STOP = 19, + EC_HOST_EVENT_HANG_DETECT = 20, + EC_HOST_EVENT_HANG_REBOOT = 21, + EC_HOST_EVENT_PD_MCU = 22, + EC_HOST_EVENT_BATTERY_STATUS = 23, + EC_HOST_EVENT_PANIC = 24, + EC_HOST_EVENT_KEYBOARD_FASTBOOT = 25, + EC_HOST_EVENT_RTC = 26, + EC_HOST_EVENT_MKBP = 27, + EC_HOST_EVENT_USB_MUX = 28, + EC_HOST_EVENT_MODE_CHANGE = 29, + EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT = 30, + EC_HOST_EVENT_WOV = 31, + EC_HOST_EVENT_INVALID = 32, +}; + +struct ec_host_request { + uint8_t struct_version; + uint8_t checksum; + uint16_t command; + uint8_t command_version; + uint8_t reserved; + uint16_t data_len; +}; + +struct ec_params_hello { + uint32_t in_data; +}; + +struct ec_response_hello { + uint32_t out_data; +}; + +struct ec_params_get_cmd_versions { + uint8_t cmd; +}; + +struct ec_response_get_cmd_versions { + uint32_t version_mask; +}; + +enum ec_comms_status { + EC_COMMS_STATUS_PROCESSING = 1, +}; + +struct ec_response_get_comms_status { + uint32_t flags; +}; + +struct ec_response_get_protocol_info { + uint32_t protocol_versions; + uint16_t max_request_packet_size; + uint16_t max_response_packet_size; + uint32_t flags; +}; + +struct ec_response_get_features { + uint32_t flags[2]; +}; + +enum ec_led_colors { + EC_LED_COLOR_RED = 0, + EC_LED_COLOR_GREEN = 1, + EC_LED_COLOR_BLUE = 2, + EC_LED_COLOR_YELLOW = 3, + EC_LED_COLOR_WHITE = 4, + EC_LED_COLOR_AMBER = 5, + EC_LED_COLOR_COUNT = 6, +}; + +enum motionsense_command { + MOTIONSENSE_CMD_DUMP = 0, + MOTIONSENSE_CMD_INFO = 1, + MOTIONSENSE_CMD_EC_RATE = 2, + MOTIONSENSE_CMD_SENSOR_ODR = 3, + MOTIONSENSE_CMD_SENSOR_RANGE = 4, + MOTIONSENSE_CMD_KB_WAKE_ANGLE = 5, + MOTIONSENSE_CMD_DATA = 6, + MOTIONSENSE_CMD_FIFO_INFO = 7, + MOTIONSENSE_CMD_FIFO_FLUSH = 8, + MOTIONSENSE_CMD_FIFO_READ = 9, + MOTIONSENSE_CMD_PERFORM_CALIB = 10, + MOTIONSENSE_CMD_SENSOR_OFFSET = 11, + MOTIONSENSE_CMD_LIST_ACTIVITIES = 12, + MOTIONSENSE_CMD_SET_ACTIVITY = 13, + MOTIONSENSE_CMD_LID_ANGLE = 14, + MOTIONSENSE_CMD_FIFO_INT_ENABLE = 15, + MOTIONSENSE_CMD_SPOOF = 16, + MOTIONSENSE_CMD_TABLET_MODE_LID_ANGLE = 17, + MOTIONSENSE_CMD_SENSOR_SCALE = 18, + MOTIONSENSE_NUM_CMDS = 19, +}; + +struct ec_response_motion_sensor_data { + uint8_t flags; + uint8_t sensor_num; + union { + int16_t data[3]; + struct { + uint16_t reserved; + uint32_t timestamp; + } __attribute__((packed)); + struct { + uint8_t activity; + uint8_t state; + int16_t add_info[2]; + }; + }; +}; + +struct ec_response_motion_sense_fifo_info { + uint16_t size; + uint16_t count; + uint32_t timestamp; + uint16_t total_lost; + uint16_t lost[0]; +} __attribute__((packed)); + +struct ec_response_motion_sense_fifo_data { + uint32_t number_data; + struct ec_response_motion_sensor_data data[0]; +}; + +struct ec_motion_sense_activity { + uint8_t sensor_num; + uint8_t activity; + uint8_t enable; + uint8_t reserved; + uint16_t parameters[3]; +}; + +struct ec_params_motion_sense { + uint8_t cmd; + union { + struct { + uint8_t max_sensor_count; + } dump; + struct { + int16_t data; + } kb_wake_angle; + struct { + uint8_t sensor_num; + } info; + struct { + uint8_t sensor_num; + } info_3; + struct { + uint8_t sensor_num; + } data; + struct { + uint8_t sensor_num; + } fifo_flush; + struct { + uint8_t sensor_num; + } perform_calib; + struct { + uint8_t sensor_num; + } list_activities; + struct { + uint8_t sensor_num; + uint8_t roundup; + uint16_t reserved; + int32_t data; + } ec_rate; + struct { + uint8_t sensor_num; + uint8_t roundup; + uint16_t reserved; + int32_t data; + } sensor_odr; + struct { + uint8_t sensor_num; + uint8_t roundup; + uint16_t reserved; + int32_t data; + } sensor_range; + struct { + uint8_t sensor_num; + uint16_t flags; + int16_t temp; + int16_t offset[3]; + } __attribute__((packed)) sensor_offset; + struct { + uint8_t sensor_num; + uint16_t flags; + int16_t temp; + uint16_t scale[3]; + } __attribute__((packed)) sensor_scale; + struct { + uint32_t max_data_vector; + } fifo_read; + struct ec_motion_sense_activity set_activity; + struct { + int8_t enable; + } fifo_int_enable; + struct { + uint8_t sensor_id; + uint8_t spoof_enable; + uint8_t reserved; + int16_t components[3]; + } __attribute__((packed)) spoof; + struct { + int16_t lid_angle; + int16_t hys_degree; + } tablet_mode_threshold; + }; +} __attribute__((packed)); + +struct ec_response_motion_sense { + union { + struct { + uint8_t module_flags; + uint8_t sensor_count; + struct ec_response_motion_sensor_data sensor[0]; + } dump; + struct { + uint8_t type; + uint8_t location; + uint8_t chip; + } info; + struct { + uint8_t type; + uint8_t location; + uint8_t chip; + uint32_t min_frequency; + uint32_t max_frequency; + uint32_t fifo_max_event_count; + } info_3; + struct ec_response_motion_sensor_data data; + struct { + int32_t ret; + } ec_rate; + struct { + int32_t ret; + } sensor_odr; + struct { + int32_t ret; + } sensor_range; + struct { + int32_t ret; + } kb_wake_angle; + struct { + int32_t ret; + } fifo_int_enable; + struct { + int32_t ret; + } spoof; + struct { + int16_t temp; + int16_t offset[3]; + } sensor_offset; + struct { + int16_t temp; + int16_t offset[3]; + } perform_calib; + struct { + int16_t temp; + uint16_t scale[3]; + } sensor_scale; + struct ec_response_motion_sense_fifo_info fifo_info; + struct ec_response_motion_sense_fifo_info fifo_flush; + struct ec_response_motion_sense_fifo_data fifo_read; + struct { + uint16_t reserved; + uint32_t enabled; + uint32_t disabled; + } __attribute__((packed)) list_activities; + struct { + uint16_t value; + } lid_angle; + struct { + uint16_t lid_angle; + uint16_t hys_degree; + } tablet_mode_threshold; + }; +}; + +enum ec_temp_thresholds { + EC_TEMP_THRESH_WARN = 0, + EC_TEMP_THRESH_HIGH = 1, + EC_TEMP_THRESH_HALT = 2, + EC_TEMP_THRESH_COUNT = 3, +}; + +enum ec_mkbp_event { + EC_MKBP_EVENT_KEY_MATRIX = 0, + EC_MKBP_EVENT_HOST_EVENT = 1, + EC_MKBP_EVENT_SENSOR_FIFO = 2, + EC_MKBP_EVENT_BUTTON = 3, + EC_MKBP_EVENT_SWITCH = 4, + EC_MKBP_EVENT_FINGERPRINT = 5, + EC_MKBP_EVENT_SYSRQ = 6, + EC_MKBP_EVENT_HOST_EVENT64 = 7, + EC_MKBP_EVENT_CEC_EVENT = 8, + EC_MKBP_EVENT_CEC_MESSAGE = 9, + EC_MKBP_EVENT_PCHG = 12, + EC_MKBP_EVENT_COUNT = 13, +}; + +union ec_response_get_next_data_v1 { + uint8_t key_matrix[16]; + uint32_t host_event; + uint64_t host_event64; + struct { + uint8_t reserved[3]; + struct ec_response_motion_sense_fifo_info info; + } sensor_fifo; + uint32_t buttons; + uint32_t switches; + uint32_t fp_events; + uint32_t sysrq; + uint32_t cec_events; + uint8_t cec_message[16]; +}; + +struct ec_response_get_next_event_v1 { + uint8_t event_type; + union ec_response_get_next_data_v1 data; +} __attribute__((packed)); + +struct ec_response_host_event_mask { + uint32_t mask; +}; + +enum { + EC_MSG_TX_HEADER_BYTES = 3, + EC_MSG_TX_TRAILER_BYTES = 1, + EC_MSG_TX_PROTO_BYTES = 4, + EC_MSG_RX_PROTO_BYTES = 3, + EC_PROTO2_MSG_BYTES = 256, + EC_MAX_MSG_BYTES = 65536, +}; + +struct cros_ec_command { + uint32_t version; + uint32_t command; + uint32_t outsize; + uint32_t insize; + uint32_t result; + uint8_t data[0]; +}; + +struct platform_device; + +struct cros_ec_device { + const char *phys_name; + struct device *dev; + struct class *cros_class; + int (*cmd_readmem)(struct cros_ec_device *, unsigned int, unsigned int, void *); + u16 max_request; + u16 max_response; + u16 max_passthru; + u16 proto_version; + void *priv; + int irq; + u8 *din; + u8 *dout; + int din_size; + int dout_size; + bool wake_enabled; + bool suspended; + int (*cmd_xfer)(struct cros_ec_device *, struct cros_ec_command *); + int (*pkt_xfer)(struct cros_ec_device *, struct cros_ec_command *); + struct mutex lock; + u8 mkbp_event_supported; + bool host_sleep_v1; + struct blocking_notifier_head event_notifier; + struct ec_response_get_next_event_v1 event_data; + int event_size; + u32 host_event_wake_mask; + u32 last_resume_result; + u16 suspend_timeout_ms; + long: 32; + ktime_t last_event_time; + struct notifier_block notifier_ready; + struct platform_device *ec; + struct platform_device *pd; + long: 32; +}; + +struct cros_ec_debugfs; + +struct cros_ec_dev { + struct device class_dev; + struct cros_ec_device *ec_dev; + struct device *dev; + struct cros_ec_debugfs *debug_info; + bool has_kb_wake_angle; + u16 cmd_offset; + struct ec_response_get_features features; +}; + +struct trace_event_raw_cros_ec_request_start { + struct trace_entry ent; + uint32_t version; + uint32_t offset; + uint32_t command; + uint32_t outsize; + uint32_t insize; + char __data[0]; +}; + +struct trace_event_raw_cros_ec_request_done { + struct trace_entry ent; + uint32_t version; + uint32_t offset; + uint32_t command; + uint32_t outsize; + uint32_t insize; + uint32_t result; + int retval; + char __data[0]; +}; + +struct trace_event_data_offsets_cros_ec_request_start {}; + +struct trace_event_data_offsets_cros_ec_request_done {}; + +typedef void (*btf_trace_cros_ec_request_start)(void *, struct cros_ec_command *); + +typedef void (*btf_trace_cros_ec_request_done)(void *, struct cros_ec_command *, int); + +struct mbox_chan; + +struct mbox_chan_ops { + int (*send_data)(struct mbox_chan *, void *); + int (*flush)(struct mbox_chan *, long unsigned int); + int (*startup)(struct mbox_chan *); + void (*shutdown)(struct mbox_chan *); + bool (*last_tx_done)(struct mbox_chan *); + bool (*peek_data)(struct mbox_chan *); +}; + +struct mbox_controller; + +struct mbox_chan { + struct mbox_controller *mbox; + unsigned int txdone_method; + struct mbox_client *cl; + struct completion tx_complete; + void *active_req; + unsigned int msg_count; + unsigned int msg_free; + void *msg_data[20]; + spinlock_t lock; + void *con_priv; +}; + +struct mbox_controller { + struct device *dev; + const struct mbox_chan_ops *ops; + struct mbox_chan *chans; + int num_chans; + bool txdone_irq; + bool txdone_poll; + unsigned int txpoll_period; + struct mbox_chan * (*of_xlate)(struct mbox_controller *, const struct of_phandle_args *); + long: 32; + struct hrtimer poll_hrt; + spinlock_t poll_hrt_lock; + struct list_head node; + long: 32; +}; + +struct kfifo { + union { + struct __kfifo kfifo; + unsigned char *type; + const unsigned char *const_type; + char (*rectype)[0]; + void *ptr; + const void *ptr_const; + }; + unsigned char buf[0]; +}; + +typedef uintptr_t mbox_msg_t; + +typedef int omap_mbox_irq_t; + +struct omap_mbox_fifo { + long unsigned int msg; + long unsigned int fifo_stat; + long unsigned int msg_stat; + long unsigned int irqenable; + long unsigned int irqstatus; + long unsigned int irqdisable; + u32 intr_bit; +}; + +struct omap_mbox; + +struct omap_mbox_queue { + spinlock_t lock; + struct kfifo fifo; + struct work_struct work; + struct omap_mbox *mbox; + bool full; +}; + +struct omap_mbox_device; + +struct omap_mbox { + const char *name; + int irq; + struct omap_mbox_queue *rxq; + struct device *dev; + struct omap_mbox_device *parent; + struct omap_mbox_fifo tx_fifo; + struct omap_mbox_fifo rx_fifo; + u32 intr_type; + struct mbox_chan *chan; + bool send_no_irq; +}; + +struct omap_mbox_match_data { + u32 intr_type; +}; + +struct omap_mbox_device { + struct device *dev; + struct mutex cfg_lock; + void *mbox_base; + u32 *irq_ctx; + u32 num_users; + u32 num_fifos; + u32 intr_type; + struct omap_mbox **mboxes; + struct mbox_controller controller; + struct list_head elem; +}; + +struct omap_mbox_fifo_info { + int tx_id; + int tx_usr; + int tx_irq; + int rx_id; + int rx_usr; + int rx_irq; + const char *name; + bool send_no_irq; +}; + +struct bcm2835_mbox { + void *regs; + spinlock_t lock; + struct mbox_controller controller; +}; + +struct sun6i_msgbox { + struct mbox_controller controller; + struct clk *clk; + spinlock_t lock; + void *regs; + long: 32; +}; + +struct resource_table { + u32 ver; + u32 num; + u32 reserved[2]; + u32 offset[0]; +}; + +struct fw_rsc_hdr { + u32 type; + u8 data[0]; +}; + +enum fw_resource_type { + RSC_CARVEOUT = 0, + RSC_DEVMEM = 1, + RSC_TRACE = 2, + RSC_VDEV = 3, + RSC_LAST = 4, + RSC_VENDOR_START = 128, + RSC_VENDOR_END = 512, +}; + +struct fw_rsc_carveout { + u32 da; + u32 pa; + u32 len; + u32 flags; + u32 reserved; + u8 name[32]; +}; + +struct fw_rsc_devmem { + u32 da; + u32 pa; + u32 len; + u32 flags; + u32 reserved; + u8 name[32]; +}; + +struct fw_rsc_trace { + u32 da; + u32 len; + u32 reserved; + u8 name[32]; +}; + +struct fw_rsc_vdev_vring { + u32 da; + u32 align; + u32 num; + u32 notifyid; + u32 pa; +}; + +struct fw_rsc_vdev { + u32 id; + u32 notifyid; + u32 dfeatures; + u32 gfeatures; + u32 config_len; + u8 status; + u8 num_of_vrings; + u8 reserved[2]; + struct fw_rsc_vdev_vring vring[0]; +}; + +struct rproc; + +struct rproc_mem_entry { + void *va; + bool is_iomem; + dma_addr_t dma; + size_t len; + u32 da; + void *priv; + char name[32]; + struct list_head node; + u32 rsc_offset; + u32 flags; + u32 of_resm_idx; + int (*alloc)(struct rproc *, struct rproc_mem_entry *); + int (*release)(struct rproc *, struct rproc_mem_entry *); +}; + +enum rproc_dump_mechanism { + RPROC_COREDUMP_DISABLED = 0, + RPROC_COREDUMP_ENABLED = 1, + RPROC_COREDUMP_INLINE = 2, +}; + +struct rproc_ops; + +struct rproc { + struct list_head node; + struct iommu_domain *domain; + const char *name; + const char *firmware; + void *priv; + struct rproc_ops *ops; + long: 32; + struct device dev; + atomic_t power; + unsigned int state; + enum rproc_dump_mechanism dump_conf; + struct mutex lock; + struct dentry *dbg_dir; + struct list_head traces; + int num_traces; + struct list_head carveouts; + struct list_head mappings; + u64 bootaddr; + struct list_head rvdevs; + struct list_head subdevs; + struct idr notifyids; + int index; + struct work_struct crash_handler; + unsigned int crash_cnt; + bool recovery_disabled; + int max_notifyid; + struct resource_table *table_ptr; + struct resource_table *clean_table; + struct resource_table *cached_table; + size_t table_sz; + bool has_iommu; + bool auto_boot; + bool sysfs_read_only; + struct list_head dump_segments; + int nb_vdev; + u8 elf_class; + u16 elf_machine; + struct cdev cdev; + bool cdev_put_on_release; + long unsigned int features[1]; + long: 32; +}; + +enum rsc_handling_status { + RSC_HANDLED = 0, + RSC_IGNORED = 1, +}; + +struct rproc_ops { + int (*prepare)(struct rproc *); + int (*unprepare)(struct rproc *); + int (*start)(struct rproc *); + int (*stop)(struct rproc *); + int (*attach)(struct rproc *); + int (*detach)(struct rproc *); + void (*kick)(struct rproc *, int); + void * (*da_to_va)(struct rproc *, u64, size_t, bool *); + int (*parse_fw)(struct rproc *, const struct firmware *); + int (*handle_rsc)(struct rproc *, u32, void *, int, int); + struct resource_table * (*find_loaded_rsc_table)(struct rproc *, const struct firmware *); + struct resource_table * (*get_loaded_rsc_table)(struct rproc *, size_t *); + int (*load)(struct rproc *, const struct firmware *); + int (*sanity_check)(struct rproc *, const struct firmware *); + u64 (*get_boot_addr)(struct rproc *, const struct firmware *); + long unsigned int (*panic)(struct rproc *); + void (*coredump)(struct rproc *); +}; + +enum rproc_state { + RPROC_OFFLINE = 0, + RPROC_SUSPENDED = 1, + RPROC_RUNNING = 2, + RPROC_CRASHED = 3, + RPROC_DELETED = 4, + RPROC_ATTACHED = 5, + RPROC_DETACHED = 6, + RPROC_LAST = 7, +}; + +enum rproc_crash_type { + RPROC_MMUFAULT = 0, + RPROC_WATCHDOG = 1, + RPROC_FATAL_ERROR = 2, +}; + +enum rproc_features { + RPROC_FEAT_ATTACH_ON_RECOVERY = 0, + RPROC_MAX_FEATURES = 1, +}; + +struct rproc_subdev { + struct list_head node; + int (*prepare)(struct rproc_subdev *); + int (*start)(struct rproc_subdev *); + void (*stop)(struct rproc_subdev *, bool); + void (*unprepare)(struct rproc_subdev *); +}; + +struct rproc_vdev; + +struct rproc_vring { + void *va; + int num; + u32 da; + u32 align; + int notifyid; + struct rproc_vdev *rvdev; + struct virtqueue *vq; +}; + +struct rproc_vdev { + struct rproc_subdev subdev; + struct platform_device *pdev; + unsigned int id; + struct list_head node; + struct rproc *rproc; + struct rproc_vring vring[2]; + u32 rsc_offset; + u32 index; +}; + +struct rproc_debug_trace { + struct rproc *rproc; + struct dentry *tfile; + struct list_head node; + struct rproc_mem_entry trace_mem; +}; + +struct rproc_vdev_data { + u32 rsc_offset; + unsigned int id; + u32 index; + struct fw_rsc_vdev *rsc; +}; + +typedef int (*rproc_handle_resource_t)(struct rproc *, void *, int, int); + +typedef __u64 Elf64_Xword; + +struct elf64_phdr { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +}; + +struct elf64_shdr { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +}; + +struct rproc_dump_segment { + struct list_head node; + dma_addr_t da; + size_t size; + void *priv; + void (*dump)(struct rproc *, struct rproc_dump_segment *, void *, size_t, size_t); + long: 32; + loff_t offset; +}; + +struct rproc_coredump_state { + struct rproc *rproc; + void *header; + struct completion dump_done; +}; + +struct devfreq_freqs { + long unsigned int old; + long unsigned int new; +}; + +struct trace_event_raw_devfreq_frequency { + struct trace_entry ent; + u32 __data_loc_dev_name; + long unsigned int freq; + long unsigned int prev_freq; + long unsigned int busy_time; + long unsigned int total_time; + char __data[0]; +}; + +struct trace_event_raw_devfreq_monitor { + struct trace_entry ent; + long unsigned int freq; + long unsigned int busy_time; + long unsigned int total_time; + unsigned int polling_ms; + u32 __data_loc_dev_name; + char __data[0]; +}; + +struct trace_event_data_offsets_devfreq_frequency { + u32 dev_name; +}; + +struct trace_event_data_offsets_devfreq_monitor { + u32 dev_name; +}; + +typedef void (*btf_trace_devfreq_frequency)(void *, struct devfreq *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_devfreq_monitor)(void *, struct devfreq *); + +struct devfreq_notifier_devres { + struct devfreq *devfreq; + struct notifier_block *nb; + unsigned int list; +}; + +union extcon_property_value { + int intval; +}; + +struct extcon_cable; + +struct extcon_dev { + const char *name; + const unsigned int *supported_cable; + const u32 *mutually_exclusive; + long: 32; + struct device dev; + struct raw_notifier_head nh_all; + struct raw_notifier_head *nh; + struct list_head entry; + int max_supported; + spinlock_t lock; + u32 state; + struct device_type extcon_dev_type; + struct extcon_cable *cables; + struct attribute_group attr_g_muex; + struct attribute **attrs_muex; + struct device_attribute *d_attrs_muex; + long: 32; +}; + +struct extcon_cable { + struct extcon_dev *edev; + int cable_index; + struct attribute_group attr_g; + struct device_attribute attr_name; + struct device_attribute attr_state; + struct attribute *attrs[3]; + union extcon_property_value usb_propval[3]; + union extcon_property_value chg_propval[1]; + union extcon_property_value jack_propval[1]; + union extcon_property_value disp_propval[2]; + long unsigned int usb_bits[1]; + long unsigned int chg_bits[1]; + long unsigned int jack_bits[1]; + long unsigned int disp_bits[1]; +}; + +struct __extcon_info { + unsigned int type; + unsigned int id; + const char *name; +}; + +struct extcon_dev_notifier_devres { + struct extcon_dev *edev; + unsigned int id; + struct notifier_block *nb; +}; + +struct lpddr2_addressing { + u32 num_banks; + u32 tREFI_ns; + u32 tRFCab_ps; +}; + +struct lpddr2_timings { + u32 max_freq; + u32 min_freq; + u32 tRPab; + u32 tRCD; + u32 tWR; + u32 tRAS_min; + u32 tRRD; + u32 tWTR; + u32 tXP; + u32 tRTP; + u32 tCKESR; + u32 tDQSCK_max; + u32 tDQSCK_max_derated; + u32 tFAW; + u32 tZQCS; + u32 tZQCL; + u32 tZQinit; + u32 tRAS_max_ns; +}; + +struct lpddr2_min_tck { + u32 tRPab; + u32 tRCD; + u32 tWR; + u32 tRASmin; + u32 tRRD; + u32 tWTR; + u32 tXP; + u32 tRTP; + u32 tCKE; + u32 tCKESR; + u32 tFAW; +}; + +struct lpddr2_info { + int arch_type; + int density; + int io_width; + int manufacturer_id; + int revision_id1; + int revision_id2; +}; + +struct lpddr3_timings { + u32 max_freq; + u32 min_freq; + u32 tRFC; + u32 tRRD; + u32 tRPab; + u32 tRPpb; + u32 tRCD; + u32 tRC; + u32 tRAS; + u32 tWTR; + u32 tWR; + u32 tRTP; + u32 tW2W_C2C; + u32 tR2R_C2C; + u32 tWL; + u32 tDQSCK; + u32 tRL; + u32 tFAW; + u32 tXSR; + u32 tXP; + u32 tCKE; + u32 tCKESR; + u32 tMRD; +}; + +struct lpddr3_min_tck { + u32 tRFC; + u32 tRRD; + u32 tRPab; + u32 tRPpb; + u32 tRCD; + u32 tRC; + u32 tRAS; + u32 tWTR; + u32 tWR; + u32 tRTP; + u32 tW2W_C2C; + u32 tR2R_C2C; + u32 tWL; + u32 tDQSCK; + u32 tRL; + u32 tFAW; + u32 tXSR; + u32 tXP; + u32 tCKE; + u32 tCKESR; + u32 tMRD; +}; + +struct gpmc_bool_timings { + bool cycle2cyclediffcsen; + bool cycle2cyclesamecsen; + bool we_extra_delay; + bool oe_extra_delay; + bool adv_extra_delay; + bool cs_extra_delay; + bool time_para_granularity; +}; + +struct gpmc_timings { + u32 sync_clk; + u32 cs_on; + u32 cs_rd_off; + u32 cs_wr_off; + u32 adv_on; + u32 adv_rd_off; + u32 adv_wr_off; + u32 adv_aad_mux_on; + u32 adv_aad_mux_rd_off; + u32 adv_aad_mux_wr_off; + u32 we_on; + u32 we_off; + u32 oe_on; + u32 oe_off; + u32 oe_aad_mux_on; + u32 oe_aad_mux_off; + u32 page_burst_access; + u32 access; + u32 rd_cycle; + u32 wr_cycle; + u32 bus_turnaround; + u32 cycle2cycle_delay; + u32 wait_monitoring; + u32 clk_activation; + u32 wr_access; + u32 wr_data_mux_bus; + struct gpmc_bool_timings bool_timings; +}; + +struct gpmc_device_timings { + u32 t_ceasu; + u32 t_avdasu; + u32 t_avdp_r; + u32 t_avdp_w; + u32 t_aavdh; + u32 t_oeasu; + u32 t_aa; + u32 t_iaa; + u32 t_oe; + u32 t_ce; + u32 t_rd_cycle; + u32 t_cez_r; + u32 t_cez_w; + u32 t_oez; + u32 t_weasu; + u32 t_wpl; + u32 t_wph; + u32 t_wr_cycle; + u32 clk; + u32 t_bacc; + u32 t_ces; + u32 t_avds; + u32 t_avdh; + u32 t_ach; + u32 t_rdyo; + u32 t_ce_rdyz; + u32 t_ce_avd; + u8 cyc_aavdh_oe; + u8 cyc_aavdh_we; + u8 cyc_oe; + u8 cyc_wpl; + u32 cyc_iaa; + bool ce_xdelay; + bool avd_xdelay; + bool oe_xdelay; + bool we_xdelay; +}; + +struct gpmc_settings { + bool burst_wrap; + bool burst_read; + bool burst_write; + bool device_nand; + bool sync_read; + bool sync_write; + bool wait_on_read; + bool wait_on_write; + u32 burst_len; + u32 device_width; + u32 mux_add_data; + u32 wait_pin; + u32 wait_pin_polarity; +}; + +struct gpmc_nand_ops { + bool (*nand_writebuffer_empty)(); +}; + +struct gpmc_onenand_info { + bool sync_read; + bool sync_write; + int burst_len; +}; + +struct gpmc_nand_regs { + void *gpmc_nand_command; + void *gpmc_nand_address; + void *gpmc_nand_data; + void *gpmc_prefetch_config1; + void *gpmc_prefetch_config2; + void *gpmc_prefetch_control; + void *gpmc_prefetch_status; + void *gpmc_ecc_config; + void *gpmc_ecc_control; + void *gpmc_ecc_size_config; + void *gpmc_ecc1_result; + void *gpmc_bch_result0[8]; + void *gpmc_bch_result1[8]; + void *gpmc_bch_result2[8]; + void *gpmc_bch_result3[8]; + void *gpmc_bch_result4[8]; + void *gpmc_bch_result5[8]; + void *gpmc_bch_result6[8]; +}; + +enum gpmc_clk_domain { + GPMC_CD_FCLK = 0, + GPMC_CD_CLK = 1, +}; + +struct gpmc_cs_data { + const char *name; + u32 flags; + struct resource mem; +}; + +struct gpmc_cs_config { + u32 config1; + u32 config2; + u32 config3; + u32 config4; + u32 config5; + u32 config6; + u32 config7; + int is_valid; +}; + +struct omap3_gpmc_regs { + u32 sysconfig; + u32 irqenable; + u32 timeout_ctrl; + u32 config; + u32 prefetch_config1; + u32 prefetch_config2; + u32 prefetch_control; + struct gpmc_cs_config cs_context[8]; +}; + +struct gpmc_waitpin { + u32 pin; + u32 polarity; + struct gpio_desc *desc; +}; + +struct gpmc_device { + struct device *dev; + int irq; + struct irq_chip irq_chip; + struct gpio_chip gpio_chip; + struct notifier_block nb; + struct omap3_gpmc_regs context; + struct gpmc_waitpin *waitpins; + int nirqs; + unsigned int is_suspended: 1; + struct resource *data; +}; + +struct devbus_read_params { + u32 bus_width; + u32 badr_skew; + u32 turn_off; + u32 acc_first; + u32 acc_next; + u32 rd_setup; + u32 rd_hold; +}; + +struct devbus_write_params { + u32 sync_enable; + u32 wr_high; + u32 wr_low; + u32 ale_wr; +}; + +struct devbus { + struct device *dev; + void *base; + long unsigned int tick_ps; +}; + +struct pl353_smc_data { + struct clk *memclk; + struct clk *aclk; +}; + +struct exynos_srom_reg_dump { + u32 offset; + u32 value; +}; + +struct exynos_srom { + struct device *dev; + void *reg_base; + struct exynos_srom_reg_dump *reg_offset; +}; + +struct tegra_emc; + +typedef int tegra124_emc_prepare_timing_change_cb___2(struct tegra_emc *, long unsigned int); + +enum emc_dram_type { + DRAM_TYPE_DDR3 = 0, + DRAM_TYPE_DDR1 = 1, + DRAM_TYPE_LPDDR3 = 2, + DRAM_TYPE_DDR2 = 3, +}; + +struct emc_timing___2 { + long unsigned int rate; + u32 emc_burst_data[143]; + u32 emc_auto_cal_config; + u32 emc_auto_cal_config2; + u32 emc_auto_cal_config3; + u32 emc_auto_cal_interval; + u32 emc_bgbias_ctl0; + u32 emc_cfg; + u32 emc_cfg_2; + u32 emc_ctt_term_ctrl; + u32 emc_mode_1; + u32 emc_mode_2; + u32 emc_mode_4; + u32 emc_mode_reset; + u32 emc_mrs_wait_cnt; + u32 emc_sel_dpd_ctrl; + u32 emc_xm2dqspadctrl2; + u32 emc_zcal_cnt_long; + u32 emc_zcal_interval; +}; + +struct emc_rate_request { + long unsigned int min_rate; + long unsigned int max_rate; +}; + +struct tegra_emc { + struct device *dev; + struct tegra_mc *mc; + void *regs; + struct clk *clk; + enum emc_dram_type dram_type; + unsigned int dram_bus_width; + unsigned int dram_num; + struct emc_timing___2 last_timing; + struct emc_timing___2 *timings; + unsigned int num_timings; + struct { + struct dentry *root; + long unsigned int min_rate; + long unsigned int max_rate; + } debugfs; + struct icc_provider provider; + struct emc_rate_request requested_rate[2]; + struct mutex rate_lock; +}; + +typedef void tegra124_emc_complete_timing_change_cb___2(struct tegra_emc *, long unsigned int); + +enum emc_dll_change { + DLL_CHANGE_NONE = 0, + DLL_CHANGE_ON = 1, + DLL_CHANGE_OFF = 2, +}; + +enum emc_rate_request_type { + EMC_RATE_DEBUG = 0, + EMC_RATE_ICC = 1, + EMC_RATE_TYPE_MAX = 2, +}; + +struct pmu_irq_ops { + void (*enable_pmuirq)(unsigned int); + void (*disable_pmuirq)(unsigned int); + void (*free_pmuirq)(unsigned int, int, void *); +}; + +struct cper_sec_proc_arm { + u32 validation_bits; + u16 err_info_num; + u16 context_info_num; + u32 section_length; + u8 affinity_level; + u8 reserved[3]; + u64 mpidr; + u64 midr; + u32 running_state; + u32 psci_state; +}; + +enum hw_event_mc_err_type { + HW_EVENT_ERR_CORRECTED = 0, + HW_EVENT_ERR_UNCORRECTED = 1, + HW_EVENT_ERR_DEFERRED = 2, + HW_EVENT_ERR_FATAL = 3, + HW_EVENT_ERR_INFO = 4, +}; + +struct trace_event_raw_mc_event { + struct trace_entry ent; + unsigned int error_type; + u32 __data_loc_msg; + u32 __data_loc_label; + u16 error_count; + u8 mc_index; + s8 top_layer; + s8 middle_layer; + s8 lower_layer; + long int address; + u8 grain_bits; + long int syndrome; + u32 __data_loc_driver_detail; + char __data[0]; +}; + +struct trace_event_raw_arm_event { + struct trace_entry ent; + u64 mpidr; + u64 midr; + u32 running_state; + u32 psci_state; + u8 affinity; + char __data[0]; + long: 32; +}; + +struct trace_event_raw_non_standard_event { + struct trace_entry ent; + char sec_type[16]; + char fru_id[16]; + u32 __data_loc_fru_text; + u8 sev; + u32 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_aer_event { + struct trace_entry ent; + u32 __data_loc_dev_name; + u32 status; + u8 severity; + u8 tlp_header_valid; + u32 tlp_header[4]; + char __data[0]; +}; + +struct trace_event_data_offsets_mc_event { + u32 msg; + u32 label; + u32 driver_detail; +}; + +struct trace_event_data_offsets_arm_event {}; + +struct trace_event_data_offsets_non_standard_event { + u32 fru_text; + u32 buf; +}; + +struct trace_event_data_offsets_aer_event { + u32 dev_name; +}; + +typedef void (*btf_trace_mc_event)(void *, const unsigned int, const char *, const char *, const int, const u8, const s8, const s8, const s8, long unsigned int, const u8, long unsigned int, const char *); + +typedef void (*btf_trace_arm_event)(void *, const struct cper_sec_proc_arm *); + +typedef void (*btf_trace_non_standard_event)(void *, const guid_t *, const guid_t *, const char *, const u8, const u8 *, const u32); + +typedef void (*btf_trace_aer_event)(void *, const char *, const u32, const u8, const u8, struct aer_header_log_regs *); + +enum { + NVMEM_ADD = 1, + NVMEM_REMOVE = 2, + NVMEM_CELL_ADD = 3, + NVMEM_CELL_REMOVE = 4, +}; + +struct nvmem_cell_table { + const char *nvmem_name; + const struct nvmem_cell_info *cells; + size_t ncells; + struct list_head node; +}; + +struct nvmem_device { + struct module *owner; + long: 32; + struct device dev; + int stride; + int word_size; + int id; + struct kref refcnt; + size_t size; + bool read_only; + bool root_only; + int flags; + enum nvmem_type type; + struct bin_attribute eeprom; + struct device *base_dev; + struct list_head cells; + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + nvmem_cell_post_process_t cell_post_process; + struct gpio_desc *wp_gpio; + void *priv; +}; + +struct nvmem_cell_entry { + const char *name; + int offset; + int bytes; + int bit_offset; + int nbits; + struct device_node *np; + struct nvmem_device *nvmem; + struct list_head node; +}; + +struct nvmem_cell { + struct nvmem_cell_entry *entry; + const char *id; +}; + +struct icc_req { + struct hlist_node req_node; + struct icc_node *node; + struct device *dev; + bool enabled; + u32 tag; + u32 avg_bw; + u32 peak_bw; +}; + +struct icc_path { + const char *name; + size_t num_nodes; + struct icc_req reqs[0]; +}; + +struct icc_onecell_data { + unsigned int num_nodes; + struct icc_node *nodes[0]; +}; + +struct trace_event_raw_icc_set_bw { + struct trace_entry ent; + u32 __data_loc_path_name; + u32 __data_loc_dev; + u32 __data_loc_node_name; + u32 avg_bw; + u32 peak_bw; + u32 node_avg_bw; + u32 node_peak_bw; + char __data[0]; +}; + +struct trace_event_raw_icc_set_bw_end { + struct trace_entry ent; + u32 __data_loc_path_name; + u32 __data_loc_dev; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_icc_set_bw { + u32 path_name; + u32 dev; + u32 node_name; +}; + +struct trace_event_data_offsets_icc_set_bw_end { + u32 path_name; + u32 dev; +}; + +typedef void (*btf_trace_icc_set_bw)(void *, struct icc_path *, struct icc_node *, int, u32, u32); + +typedef void (*btf_trace_icc_set_bw_end)(void *, struct icc_path *, int); + +struct icc_bulk_data { + struct icc_path *path; + const char *name; + u32 avg_bw; + u32 peak_bw; +}; + +struct icc_bulk_devres { + struct icc_bulk_data *paths; + int num_paths; +}; + +struct net_device_devres { + struct net_device *ndev; +}; + +struct __kernel_old_timespec { + __kernel_old_time_t tv_sec; + long int tv_nsec; +}; + +struct __kernel_sock_timeval { + __s64 tv_sec; + __s64 tv_usec; +}; + +struct mmsghdr { + struct user_msghdr msg_hdr; + unsigned int msg_len; +}; + +struct scm_timestamping_internal { + struct timespec64 ts[3]; +}; + +enum sock_shutdown_cmd { + SHUT_RD = 0, + SHUT_WR = 1, + SHUT_RDWR = 2, +}; + +struct net_proto_family { + int family; + int (*create)(struct net *, struct socket *, int, int); + struct module *owner; +}; + +enum { + SOCK_WAKE_IO = 0, + SOCK_WAKE_WAITD = 1, + SOCK_WAKE_SPACE = 2, + SOCK_WAKE_URG = 3, +}; + +struct ifconf { + int ifc_len; + union { + char *ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; +}; + +struct libipw_device; + +struct iw_spy_data; + +struct iw_public_data { + struct iw_spy_data *spy_data; + struct libipw_device *libipw; +}; + +enum { + SOF_TIMESTAMPING_TX_HARDWARE = 1, + SOF_TIMESTAMPING_TX_SOFTWARE = 2, + SOF_TIMESTAMPING_RX_HARDWARE = 4, + SOF_TIMESTAMPING_RX_SOFTWARE = 8, + SOF_TIMESTAMPING_SOFTWARE = 16, + SOF_TIMESTAMPING_SYS_HARDWARE = 32, + SOF_TIMESTAMPING_RAW_HARDWARE = 64, + SOF_TIMESTAMPING_OPT_ID = 128, + SOF_TIMESTAMPING_TX_SCHED = 256, + SOF_TIMESTAMPING_TX_ACK = 512, + SOF_TIMESTAMPING_OPT_CMSG = 1024, + SOF_TIMESTAMPING_OPT_TSONLY = 2048, + SOF_TIMESTAMPING_OPT_STATS = 4096, + SOF_TIMESTAMPING_OPT_PKTINFO = 8192, + SOF_TIMESTAMPING_OPT_TX_SWHW = 16384, + SOF_TIMESTAMPING_BIND_PHC = 32768, + SOF_TIMESTAMPING_OPT_ID_TCP = 65536, + SOF_TIMESTAMPING_LAST = 65536, + SOF_TIMESTAMPING_MASK = 131071, +}; + +struct scm_ts_pktinfo { + __u32 if_index; + __u32 pkt_length; + __u32 reserved[2]; +}; + +struct sock_skb_cb { + u32 dropcount; +}; + +typedef u32 compat_caddr_t; + +struct compat_ifmap { + compat_ulong_t mem_start; + compat_ulong_t mem_end; + short unsigned int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct compat_if_settings { + unsigned int type; + unsigned int size; + compat_uptr_t ifs_ifsu; +}; + +struct compat_ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + compat_int_t ifru_ivalue; + compat_int_t ifru_mtu; + struct compat_ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + compat_caddr_t ifru_data; + struct compat_if_settings ifru_settings; + } ifr_ifru; +}; + +struct iw_param { + __s32 value; + __u8 fixed; + __u8 disabled; + __u16 flags; +}; + +struct iw_point { + void *pointer; + __u16 length; + __u16 flags; +}; + +struct iw_freq { + __s32 m; + __s16 e; + __u8 i; + __u8 flags; +}; + +struct iw_quality { + __u8 qual; + __u8 level; + __u8 noise; + __u8 updated; +}; + +struct iw_discarded { + __u32 nwid; + __u32 code; + __u32 fragment; + __u32 retries; + __u32 misc; +}; + +struct iw_missed { + __u32 beacon; +}; + +struct iw_statistics { + __u16 status; + struct iw_quality qual; + struct iw_discarded discard; + struct iw_missed miss; +}; + +union iwreq_data { + char name[16]; + struct iw_point essid; + struct iw_param nwid; + struct iw_freq freq; + struct iw_param sens; + struct iw_param bitrate; + struct iw_param txpower; + struct iw_param rts; + struct iw_param frag; + __u32 mode; + struct iw_param retry; + struct iw_point encoding; + struct iw_param power; + struct iw_quality qual; + struct sockaddr ap_addr; + struct sockaddr addr; + struct iw_param param; + struct iw_point data; +}; + +struct iw_priv_args { + __u32 cmd; + __u16 set_args; + __u16 get_args; + char name[16]; +}; + +struct compat_mmsghdr { + struct compat_msghdr msg_hdr; + compat_uint_t msg_len; +}; + +struct iw_request_info { + __u16 cmd; + __u16 flags; +}; + +struct iw_spy_data { + int spy_number; + u_char spy_address[48]; + struct iw_quality spy_stat[8]; + struct iw_quality spy_thr_low; + struct iw_quality spy_thr_high; + u_char spy_thr_under[8]; +}; + +struct sock_ee_data_rfc4884 { + __u16 len; + __u8 flags; + __u8 reserved; +}; + +struct sock_extended_err { + __u32 ee_errno; + __u8 ee_origin; + __u8 ee_type; + __u8 ee_code; + __u8 ee_pad; + __u32 ee_info; + union { + __u32 ee_data; + struct sock_ee_data_rfc4884 ee_rfc4884; + }; +}; + +struct sock_exterr_skb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + struct sock_extended_err ee; + u16 addr_offset; + __be16 port; + u8 opt_stats: 1; + u8 unused: 7; +}; + +struct net_bridge; + +struct used_address { + struct __kernel_sockaddr_storage name; + unsigned int name_len; +}; + +struct linger { + int l_onoff; + int l_linger; +}; + +struct cmsghdr { + __kernel_size_t cmsg_len; + int cmsg_level; + int cmsg_type; +}; + +struct ucred { + __u32 pid; + __u32 uid; + __u32 gid; +}; + +enum { + SKB_GSO_TCPV4 = 1, + SKB_GSO_DODGY = 2, + SKB_GSO_TCP_ECN = 4, + SKB_GSO_TCP_FIXEDID = 8, + SKB_GSO_TCPV6 = 16, + SKB_GSO_FCOE = 32, + SKB_GSO_GRE = 64, + SKB_GSO_GRE_CSUM = 128, + SKB_GSO_IPXIP4 = 256, + SKB_GSO_IPXIP6 = 512, + SKB_GSO_UDP_TUNNEL = 1024, + SKB_GSO_UDP_TUNNEL_CSUM = 2048, + SKB_GSO_PARTIAL = 4096, + SKB_GSO_TUNNEL_REMCSUM = 8192, + SKB_GSO_SCTP = 16384, + SKB_GSO_ESP = 32768, + SKB_GSO_UDP = 65536, + SKB_GSO_UDP_L4 = 131072, + SKB_GSO_FRAGLIST = 262144, +}; + +struct gro_list { + struct list_head list; + int count; +}; + +struct napi_struct { + struct list_head poll_list; + long unsigned int state; + int weight; + int defer_hard_irqs_count; + long unsigned int gro_bitmask; + int (*poll)(struct napi_struct *, int); + int poll_owner; + struct net_device *dev; + struct gro_list gro_hash[8]; + struct sk_buff *skb; + struct list_head rx_list; + int rx_count; + long: 32; + struct hrtimer timer; + struct list_head dev_list; + struct hlist_node napi_hash_node; + unsigned int napi_id; + struct task_struct *thread; +}; + +struct netdev_name_node { + struct hlist_node hlist; + struct list_head list; + struct net_device *dev; + const char *name; +}; + +struct sd_flow_limit; + +struct softnet_data { + struct list_head poll_list; + struct sk_buff_head process_queue; + unsigned int processed; + unsigned int time_squeeze; + struct softnet_data *rps_ipi_list; + struct sd_flow_limit *flow_limit; + struct Qdisc *output_queue; + struct Qdisc **output_queue_tailp; + struct sk_buff *completion_queue; + struct sk_buff_head xfrm_backlog; + struct { + u16 recursion; + u8 more; + u8 skip_txqueue; + } xmit; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + unsigned int input_queue_head; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + call_single_data_t csd; + struct softnet_data *rps_ipi_next; + unsigned int cpu; + unsigned int input_queue_tail; + unsigned int received_rps; + unsigned int dropped; + struct sk_buff_head input_pkt_queue; + long: 32; + struct napi_struct backlog; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + spinlock_t defer_lock; + int defer_count; + int defer_ipi_scheduled; + struct sk_buff *defer_list; + call_single_data_t defer_csd; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct sd_flow_limit { + u64 count; + unsigned int num_buckets; + unsigned int history_head; + u16 history[128]; + u8 buckets[0]; +}; + +struct so_timestamping { + int flags; + int bind_phc; +}; + +enum txtime_flags { + SOF_TXTIME_DEADLINE_MODE = 1, + SOF_TXTIME_REPORT_ERRORS = 2, + SOF_TXTIME_FLAGS_LAST = 2, + SOF_TXTIME_FLAGS_MASK = 3, +}; + +struct sock_txtime { + __kernel_clockid_t clockid; + __u32 flags; +}; + +enum sk_pacing { + SK_PACING_NONE = 0, + SK_PACING_NEEDED = 1, + SK_PACING_FQ = 2, +}; + +struct sockcm_cookie { + u64 transmit_time; + u32 mark; + u32 tsflags; +}; + +struct fastopen_queue { + struct request_sock *rskq_rst_head; + struct request_sock *rskq_rst_tail; + spinlock_t lock; + int qlen; + int max_qlen; + struct tcp_fastopen_context *ctx; +}; + +struct request_sock_queue { + spinlock_t rskq_lock; + u8 rskq_defer_accept; + u32 synflood_warned; + atomic_t qlen; + atomic_t young; + struct request_sock *rskq_accept_head; + struct request_sock *rskq_accept_tail; + struct fastopen_queue fastopenq; +}; + +struct minmax_sample { + u32 t; + u32 v; +}; + +struct minmax { + struct minmax_sample s[3]; +}; + +struct inet_connection_sock_af_ops { + int (*queue_xmit)(struct sock *, struct sk_buff *, struct flowi *); + void (*send_check)(struct sock *, struct sk_buff *); + int (*rebuild_header)(struct sock *); + void (*sk_rx_dst_set)(struct sock *, const struct sk_buff *); + int (*conn_request)(struct sock *, struct sk_buff *); + struct sock * (*syn_recv_sock)(const struct sock *, struct sk_buff *, struct request_sock *, struct dst_entry *, struct request_sock *, bool *); + u16 net_header_len; + u16 net_frag_header_len; + u16 sockaddr_len; + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*addr2sockaddr)(struct sock *, struct sockaddr *); + void (*mtu_reduced)(struct sock *); +}; + +struct inet_bind_bucket; + +struct inet_bind2_bucket; + +struct tcp_ulp_ops; + +struct inet_connection_sock { + struct inet_sock icsk_inet; + struct request_sock_queue icsk_accept_queue; + struct inet_bind_bucket *icsk_bind_hash; + struct inet_bind2_bucket *icsk_bind2_hash; + long unsigned int icsk_timeout; + struct timer_list icsk_retransmit_timer; + struct timer_list icsk_delack_timer; + __u32 icsk_rto; + __u32 icsk_rto_min; + __u32 icsk_delack_max; + __u32 icsk_pmtu_cookie; + const struct tcp_congestion_ops *icsk_ca_ops; + const struct inet_connection_sock_af_ops *icsk_af_ops; + const struct tcp_ulp_ops *icsk_ulp_ops; + void *icsk_ulp_data; + void (*icsk_clean_acked)(struct sock *, u32); + unsigned int (*icsk_sync_mss)(struct sock *, u32); + __u8 icsk_ca_state: 5; + __u8 icsk_ca_initialized: 1; + __u8 icsk_ca_setsockopt: 1; + __u8 icsk_ca_dst_locked: 1; + __u8 icsk_retransmits; + __u8 icsk_pending; + __u8 icsk_backoff; + __u8 icsk_syn_retries; + __u8 icsk_probes_out; + __u16 icsk_ext_hdr_len; + struct { + __u8 pending; + __u8 quick; + __u8 pingpong; + __u8 retry; + __u32 ato; + long unsigned int timeout; + __u32 lrcvtime; + __u16 last_seg_size; + __u16 rcv_mss; + } icsk_ack; + struct { + int search_high; + int search_low; + u32 probe_size: 31; + u32 enabled: 1; + u32 probe_timestamp; + } icsk_mtup; + u32 icsk_probes_tstamp; + u32 icsk_user_timeout; + long: 32; + u64 icsk_ca_priv[13]; +}; + +struct inet_bind_bucket { + possible_net_t ib_net; + int l3mdev; + short unsigned int port; + signed char fastreuse; + signed char fastreuseport; + kuid_t fastuid; + struct in6_addr fast_v6_rcv_saddr; + __be32 fast_rcv_saddr; + short unsigned int fast_sk_family; + bool fast_ipv6_only; + struct hlist_node node; + struct hlist_head owners; +}; + +struct inet_bind2_bucket { + possible_net_t ib_net; + int l3mdev; + short unsigned int port; + short unsigned int family; + union { + struct in6_addr v6_rcv_saddr; + __be32 rcv_saddr; + }; + struct hlist_node node; + struct hlist_head owners; + struct hlist_head deathrow; +}; + +struct tcp_ulp_ops { + struct list_head list; + int (*init)(struct sock *); + void (*update)(struct sock *, struct proto *, void (*)(struct sock *)); + void (*release)(struct sock *); + int (*get_info)(const struct sock *, struct sk_buff *); + size_t (*get_info_size)(const struct sock *); + void (*clone)(const struct request_sock *, struct sock *, const gfp_t); + char name[16]; + struct module *owner; +}; + +struct tcp_fastopen_cookie { + __le64 val[2]; + s8 len; + bool exp; + long: 32; +}; + +struct tcp_sack_block { + u32 start_seq; + u32 end_seq; +}; + +struct tcp_options_received { + int ts_recent_stamp; + u32 ts_recent; + u32 rcv_tsval; + u32 rcv_tsecr; + u16 saw_tstamp: 1; + u16 tstamp_ok: 1; + u16 dsack: 1; + u16 wscale_ok: 1; + u16 sack_ok: 3; + u16 smc_ok: 1; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u8 saw_unknown: 1; + u8 unused: 7; + u8 num_sacks; + u16 user_mss; + u16 mss_clamp; +}; + +struct tcp_rack { + u64 mstamp; + u32 rtt_us; + u32 end_seq; + u32 last_delivered; + u8 reo_wnd_steps; + u8 reo_wnd_persist: 5; + u8 dsack_seen: 1; + u8 advanced: 1; +}; + +struct tcp_sock_af_ops; + +struct tcp_md5sig_info; + +struct tcp_fastopen_request; + +struct tcp_sock { + struct inet_connection_sock inet_conn; + u16 tcp_header_len; + u16 gso_segs; + __be32 pred_flags; + u64 bytes_received; + u32 segs_in; + u32 data_segs_in; + u32 rcv_nxt; + u32 copied_seq; + u32 rcv_wup; + u32 snd_nxt; + u32 segs_out; + u32 data_segs_out; + u64 bytes_sent; + u64 bytes_acked; + u32 dsack_dups; + u32 snd_una; + u32 snd_sml; + u32 rcv_tstamp; + u32 lsndtime; + u32 last_oow_ack_time; + u32 compressed_ack_rcv_nxt; + u32 tsoffset; + struct list_head tsq_node; + struct list_head tsorted_sent_queue; + u32 snd_wl1; + u32 snd_wnd; + u32 max_window; + u32 mss_cache; + u32 window_clamp; + u32 rcv_ssthresh; + struct tcp_rack rack; + u16 advmss; + u8 compressed_ack; + u8 dup_ack_counter: 2; + u8 tlp_retrans: 1; + u8 unused: 5; + u32 chrono_start; + u32 chrono_stat[3]; + u8 chrono_type: 2; + u8 rate_app_limited: 1; + u8 fastopen_connect: 1; + u8 fastopen_no_cookie: 1; + u8 is_sack_reneg: 1; + u8 fastopen_client_fail: 2; + u8 nonagle: 4; + u8 thin_lto: 1; + u8 recvmsg_inq: 1; + u8 repair: 1; + u8 frto: 1; + u8 repair_queue; + u8 save_syn: 2; + u8 syn_data: 1; + u8 syn_fastopen: 1; + u8 syn_fastopen_exp: 1; + u8 syn_fastopen_ch: 1; + u8 syn_data_acked: 1; + u8 is_cwnd_limited: 1; + u32 tlp_high_seq; + u32 tcp_tx_delay; + u64 tcp_wstamp_ns; + u64 tcp_clock_cache; + u64 tcp_mstamp; + u32 srtt_us; + u32 mdev_us; + u32 mdev_max_us; + u32 rttvar_us; + u32 rtt_seq; + struct minmax rtt_min; + u32 packets_out; + u32 retrans_out; + u32 max_packets_out; + u32 cwnd_usage_seq; + u16 urg_data; + u8 ecn_flags; + u8 keepalive_probes; + u32 reordering; + u32 reord_seen; + u32 snd_up; + struct tcp_options_received rx_opt; + u32 snd_ssthresh; + u32 snd_cwnd; + u32 snd_cwnd_cnt; + u32 snd_cwnd_clamp; + u32 snd_cwnd_used; + u32 snd_cwnd_stamp; + u32 prior_cwnd; + u32 prr_delivered; + u32 prr_out; + u32 delivered; + u32 delivered_ce; + u32 lost; + u32 app_limited; + u64 first_tx_mstamp; + u64 delivered_mstamp; + u32 rate_delivered; + u32 rate_interval_us; + u32 rcv_wnd; + u32 write_seq; + u32 notsent_lowat; + u32 pushed_seq; + u32 lost_out; + u32 sacked_out; + struct hrtimer pacing_timer; + struct hrtimer compressed_ack_timer; + struct sk_buff *lost_skb_hint; + struct sk_buff *retransmit_skb_hint; + struct rb_root out_of_order_queue; + struct sk_buff *ooo_last_skb; + struct tcp_sack_block duplicate_sack[1]; + struct tcp_sack_block selective_acks[4]; + struct tcp_sack_block recv_sack_cache[4]; + struct sk_buff *highest_sack; + int lost_cnt_hint; + u32 prior_ssthresh; + u32 high_seq; + u32 retrans_stamp; + u32 undo_marker; + int undo_retrans; + long: 32; + u64 bytes_retrans; + u32 total_retrans; + u32 urg_seq; + unsigned int keepalive_time; + unsigned int keepalive_intvl; + int linger2; + u8 bpf_sock_ops_cb_flags; + u8 bpf_chg_cc_inprogress: 1; + u16 timeout_rehash; + u32 rcv_ooopack; + u32 rcv_rtt_last_tsecr; + struct { + u32 rtt_us; + u32 seq; + u64 time; + } rcv_rtt_est; + struct { + u32 space; + u32 seq; + u64 time; + } rcvq_space; + struct { + u32 probe_seq_start; + u32 probe_seq_end; + } mtu_probe; + u32 plb_rehash; + u32 mtu_info; + bool (*smc_hs_congested)(const struct sock *); + bool syn_smc; + const struct tcp_sock_af_ops *af_specific; + struct tcp_md5sig_info *md5sig_info; + struct tcp_fastopen_request *fastopen_req; + struct request_sock *fastopen_rsk; + struct saved_syn *saved_syn; + long: 32; +}; + +struct tcp_md5sig_key; + +struct tcp_sock_af_ops { + struct tcp_md5sig_key * (*md5_lookup)(const struct sock *, const struct sock *); + int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); + int (*md5_parse)(struct sock *, int, sockptr_t, int); +}; + +struct tcp_md5sig_info { + struct hlist_head head; + struct callback_head rcu; +}; + +struct tcp_fastopen_request { + struct tcp_fastopen_cookie cookie; + struct msghdr *data; + size_t size; + int copied; + struct ubuf_info *uarg; +}; + +union tcp_md5_addr { + struct in_addr a4; + struct in6_addr a6; +}; + +struct tcp_md5sig_key { + struct hlist_node node; + u8 keylen; + u8 family; + u8 prefixlen; + u8 flags; + union tcp_md5_addr addr; + int l3index; + u8 key[80]; + struct callback_head rcu; +}; + +struct net_protocol { + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, u32); + unsigned int no_policy: 1; + unsigned int icmp_strict_tag_validation: 1; +}; + +struct cgroup_cls_state { + struct cgroup_subsys_state css; + u32 classid; + long: 32; +}; + +enum { + SK_MEMINFO_RMEM_ALLOC = 0, + SK_MEMINFO_RCVBUF = 1, + SK_MEMINFO_WMEM_ALLOC = 2, + SK_MEMINFO_SNDBUF = 3, + SK_MEMINFO_FWD_ALLOC = 4, + SK_MEMINFO_WMEM_QUEUED = 5, + SK_MEMINFO_OPTMEM = 6, + SK_MEMINFO_BACKLOG = 7, + SK_MEMINFO_DROPS = 8, + SK_MEMINFO_VARS = 9, +}; + +enum sknetlink_groups { + SKNLGRP_NONE = 0, + SKNLGRP_INET_TCP_DESTROY = 1, + SKNLGRP_INET_UDP_DESTROY = 2, + SKNLGRP_INET6_TCP_DESTROY = 3, + SKNLGRP_INET6_UDP_DESTROY = 4, + __SKNLGRP_MAX = 5, +}; + +struct inet_request_sock { + struct request_sock req; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u16 tstamp_ok: 1; + u16 sack_ok: 1; + u16 wscale_ok: 1; + u16 ecn_ok: 1; + u16 acked: 1; + u16 no_srccheck: 1; + u16 smc_ok: 1; + u32 ir_mark; + union { + struct ip_options_rcu *ireq_opt; + struct { + struct ipv6_txoptions *ipv6_opt; + struct sk_buff *pktopts; + }; + }; +}; + +struct tcp_request_sock_ops; + +struct tcp_request_sock { + struct inet_request_sock req; + const struct tcp_request_sock_ops *af_specific; + long: 32; + u64 snt_synack; + bool tfo_listener; + bool is_mptcp; + u32 txhash; + u32 rcv_isn; + u32 snt_isn; + u32 ts_off; + u32 last_oow_ack_time; + u32 rcv_nxt; + u8 syn_tos; +}; + +enum tcp_synack_type { + TCP_SYNACK_NORMAL = 0, + TCP_SYNACK_FASTOPEN = 1, + TCP_SYNACK_COOKIE = 2, +}; + +struct tcp_request_sock_ops { + u16 mss_clamp; + struct tcp_md5sig_key * (*req_md5_lookup)(const struct sock *, const struct sock *); + int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); + __u32 (*cookie_init_seq)(const struct sk_buff *, __u16 *); + struct dst_entry * (*route_req)(const struct sock *, struct sk_buff *, struct flowi *, struct request_sock *); + u32 (*init_seq)(const struct sk_buff *); + u32 (*init_ts_off)(const struct net *, const struct sk_buff *); + int (*send_synack)(const struct sock *, struct dst_entry *, struct flowi *, struct request_sock *, struct tcp_fastopen_cookie *, enum tcp_synack_type, struct sk_buff *); +}; + +struct nf_conntrack { + refcount_t use; +}; + +struct mmpin { + struct user_struct *user; + unsigned int num_pg; +}; + +struct ubuf_info_msgzc { + struct ubuf_info ubuf; + union { + struct { + long unsigned int desc; + void *ctx; + }; + struct { + u32 id; + u16 len; + u16 zerocopy: 1; + u32 bytelen; + }; + }; + struct mmpin mmp; +}; + +enum { + SKB_FCLONE_UNAVAILABLE = 0, + SKB_FCLONE_ORIG = 1, + SKB_FCLONE_CLONE = 2, +}; + +struct sk_buff_fclones { + struct sk_buff skb1; + struct sk_buff skb2; + refcount_t fclone_ref; + long: 32; +}; + +struct skb_seq_state { + __u32 lower_offset; + __u32 upper_offset; + __u32 frag_idx; + __u32 stepped_offset; + struct sk_buff *root_skb; + struct sk_buff *cur_skb; + __u8 *frag_data; + __u32 frag_off; +}; + +struct skb_checksum_ops { + __wsum (*update)(const void *, int, __wsum); + __wsum (*combine)(__wsum, __wsum, int, int); +}; + +struct skb_gso_cb { + union { + int mac_offset; + int data_offset; + }; + int encap_level; + __wsum csum; + __u16 csum_start; +}; + +enum skb_free_reason { + SKB_REASON_CONSUMED = 0, + SKB_REASON_DROPPED = 1, +}; + +struct vlan_hdr { + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +struct vlan_ethhdr { + union { + struct { + unsigned char h_dest[6]; + unsigned char h_source[6]; + }; + struct { + unsigned char h_dest[6]; + unsigned char h_source[6]; + } addrs; + }; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +struct qdisc_walker { + int stop; + int skip; + int count; + int (*fn)(struct Qdisc *, long unsigned int, struct qdisc_walker *); +}; + +struct ip_auth_hdr { + __u8 nexthdr; + __u8 hdrlen; + __be16 reserved; + __be32 spi; + __be32 seq_no; + __u8 auth_data[0]; +}; + +struct frag_hdr { + __u8 nexthdr; + __u8 reserved; + __be16 frag_off; + __be32 identification; +}; + +enum { + SCM_TSTAMP_SND = 0, + SCM_TSTAMP_SCHED = 1, + SCM_TSTAMP_ACK = 2, +}; + +struct mpls_shim_hdr { + __be32 label_stack_entry; +}; + +struct page_frag_1k { + void *va; + u16 offset; + bool pfmemalloc; +}; + +struct napi_alloc_cache { + struct page_frag_cache page; + struct page_frag_1k page_small; + unsigned int skb_count; + void *skb_cache[64]; +}; + +struct skb_free_array { + unsigned int skb_count; + void *skb_array[16]; +}; + +typedef int (*sendmsg_func)(struct sock *, struct msghdr *, struct kvec *, size_t, size_t); + +typedef int (*sendpage_func)(struct sock *, struct page *, int, size_t, int); + +struct ahash_request; + +struct scm_cookie { + struct pid *pid; + struct scm_fp_list *fp; + struct scm_creds creds; + u32 secid; +}; + +struct scm_timestamping { + struct __kernel_old_timespec ts[3]; +}; + +struct scm_timestamping64 { + struct __kernel_timespec ts[3]; +}; + +enum { + TCA_STATS_UNSPEC = 0, + TCA_STATS_BASIC = 1, + TCA_STATS_RATE_EST = 2, + TCA_STATS_QUEUE = 3, + TCA_STATS_APP = 4, + TCA_STATS_RATE_EST64 = 5, + TCA_STATS_PAD = 6, + TCA_STATS_BASIC_HW = 7, + TCA_STATS_PKT64 = 8, + __TCA_STATS_MAX = 9, +}; + +struct gnet_stats_basic { + __u64 bytes; + __u32 packets; + long: 32; +}; + +struct gnet_stats_rate_est { + __u32 bps; + __u32 pps; +}; + +struct gnet_stats_rate_est64 { + __u64 bps; + __u64 pps; +}; + +struct gnet_estimator { + signed char interval; + unsigned char ewma_log; +}; + +struct net_rate_estimator { + struct gnet_stats_basic_sync *bstats; + spinlock_t *stats_lock; + bool running; + struct gnet_stats_basic_sync *cpu_bstats; + u8 ewma_log; + u8 intvl_log; + seqcount_t seq; + u64 last_packets; + u64 last_bytes; + u64 avpps; + u64 avbps; + long unsigned int next_jiffies; + struct timer_list timer; + struct callback_head rcu; +}; + +struct rtgenmsg { + unsigned char rtgen_family; +}; + +enum rtnetlink_groups { + RTNLGRP_NONE = 0, + RTNLGRP_LINK = 1, + RTNLGRP_NOTIFY = 2, + RTNLGRP_NEIGH = 3, + RTNLGRP_TC = 4, + RTNLGRP_IPV4_IFADDR = 5, + RTNLGRP_IPV4_MROUTE = 6, + RTNLGRP_IPV4_ROUTE = 7, + RTNLGRP_IPV4_RULE = 8, + RTNLGRP_IPV6_IFADDR = 9, + RTNLGRP_IPV6_MROUTE = 10, + RTNLGRP_IPV6_ROUTE = 11, + RTNLGRP_IPV6_IFINFO = 12, + RTNLGRP_DECnet_IFADDR = 13, + RTNLGRP_NOP2 = 14, + RTNLGRP_DECnet_ROUTE = 15, + RTNLGRP_DECnet_RULE = 16, + RTNLGRP_NOP4 = 17, + RTNLGRP_IPV6_PREFIX = 18, + RTNLGRP_IPV6_RULE = 19, + RTNLGRP_ND_USEROPT = 20, + RTNLGRP_PHONET_IFADDR = 21, + RTNLGRP_PHONET_ROUTE = 22, + RTNLGRP_DCB = 23, + RTNLGRP_IPV4_NETCONF = 24, + RTNLGRP_IPV6_NETCONF = 25, + RTNLGRP_MDB = 26, + RTNLGRP_MPLS_ROUTE = 27, + RTNLGRP_NSID = 28, + RTNLGRP_MPLS_NETCONF = 29, + RTNLGRP_IPV4_MROUTE_R = 30, + RTNLGRP_IPV6_MROUTE_R = 31, + RTNLGRP_NEXTHOP = 32, + RTNLGRP_BRVLAN = 33, + RTNLGRP_MCTP_IFADDR = 34, + RTNLGRP_TUNNEL = 35, + RTNLGRP_STATS = 36, + __RTNLGRP_MAX = 37, +}; + +enum { + NETNSA_NONE = 0, + NETNSA_NSID = 1, + NETNSA_PID = 2, + NETNSA_FD = 3, + NETNSA_TARGET_NSID = 4, + NETNSA_CURRENT_NSID = 5, + __NETNSA_MAX = 6, +}; + +struct pcpu_gen_cookie { + local_t nesting; + long: 32; + u64 last; +}; + +struct gen_cookie { + struct pcpu_gen_cookie *local; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + atomic64_t forward_last; + atomic64_t reverse_last; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, struct netlink_ext_ack *); + +typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *); + +enum rtnl_link_flags { + RTNL_FLAG_DOIT_UNLOCKED = 1, + RTNL_FLAG_BULK_DEL_SUPPORTED = 2, +}; + +struct net_fill_args { + u32 portid; + u32 seq; + int flags; + int cmd; + int nsid; + bool add_ref; + int ref_nsid; +}; + +struct rtnl_net_dump_cb { + struct net *tgt_net; + struct net *ref_net; + struct sk_buff *skb; + struct net_fill_args fillargs; + int idx; + int s_idx; +}; + +typedef u16 u_int16_t; + +typedef u32 u_int32_t; + +typedef u64 u_int64_t; + +struct flow_dissector_key_control { + u16 thoff; + u16 addr_type; + u32 flags; +}; + +enum flow_dissect_ret { + FLOW_DISSECT_RET_OUT_GOOD = 0, + FLOW_DISSECT_RET_OUT_BAD = 1, + FLOW_DISSECT_RET_PROTO_AGAIN = 2, + FLOW_DISSECT_RET_IPPROTO_AGAIN = 3, + FLOW_DISSECT_RET_CONTINUE = 4, +}; + +struct flow_dissector_key_basic { + __be16 n_proto; + u8 ip_proto; + u8 padding; +}; + +struct flow_dissector_key_tags { + u32 flow_label; +}; + +struct flow_dissector_key_vlan { + union { + struct { + u16 vlan_id: 12; + u16 vlan_dei: 1; + u16 vlan_priority: 3; + }; + __be16 vlan_tci; + }; + __be16 vlan_tpid; + __be16 vlan_eth_type; + u16 padding; +}; + +struct flow_dissector_mpls_lse { + u32 mpls_ttl: 8; + u32 mpls_bos: 1; + u32 mpls_tc: 3; + u32 mpls_label: 20; +}; + +struct flow_dissector_key_mpls { + struct flow_dissector_mpls_lse ls[7]; + u8 used_lses; +}; + +struct flow_dissector_key_enc_opts { + u8 data[255]; + u8 len; + __be16 dst_opt_type; +}; + +struct flow_dissector_key_keyid { + __be32 keyid; +}; + +struct flow_dissector_key_ipv4_addrs { + __be32 src; + __be32 dst; +}; + +struct flow_dissector_key_ipv6_addrs { + struct in6_addr src; + struct in6_addr dst; +}; + +struct flow_dissector_key_tipc { + __be32 key; +}; + +struct flow_dissector_key_addrs { + union { + struct flow_dissector_key_ipv4_addrs v4addrs; + struct flow_dissector_key_ipv6_addrs v6addrs; + struct flow_dissector_key_tipc tipckey; + }; +}; + +struct flow_dissector_key_arp { + __u32 sip; + __u32 tip; + __u8 op; + unsigned char sha[6]; + unsigned char tha[6]; +}; + +struct flow_dissector_key_ports { + union { + __be32 ports; + struct { + __be16 src; + __be16 dst; + }; + }; +}; + +struct flow_dissector_key_icmp { + struct { + u8 type; + u8 code; + }; + u16 id; +}; + +struct flow_dissector_key_eth_addrs { + unsigned char dst[6]; + unsigned char src[6]; +}; + +struct flow_dissector_key_tcp { + __be16 flags; +}; + +struct flow_dissector_key_ip { + __u8 tos; + __u8 ttl; +}; + +struct flow_dissector_key_meta { + int ingress_ifindex; + u16 ingress_iftype; +}; + +struct flow_dissector_key_ct { + u16 ct_state; + u16 ct_zone; + u32 ct_mark; + u32 ct_labels[4]; +}; + +struct flow_dissector_key_hash { + u32 hash; +}; + +struct flow_dissector_key_num_of_vlans { + u8 num_of_vlans; +}; + +struct flow_dissector_key_pppoe { + __be16 session_id; + __be16 ppp_proto; + __be16 type; +}; + +struct flow_dissector_key_l2tpv3 { + __be32 session_id; +}; + +struct flow_dissector_key { + enum flow_dissector_key_id key_id; + size_t offset; +}; + +struct flow_dissector { + unsigned int used_keys; + short unsigned int offset[31]; +}; + +struct flow_keys_basic { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; +}; + +struct flow_keys { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; + struct flow_dissector_key_tags tags; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_vlan cvlan; + struct flow_dissector_key_keyid keyid; + struct flow_dissector_key_ports ports; + struct flow_dissector_key_icmp icmp; + struct flow_dissector_key_addrs addrs; + long: 32; +}; + +struct flow_keys_digest { + u8 data[16]; +}; + +enum ip_conntrack_info { + IP_CT_ESTABLISHED = 0, + IP_CT_RELATED = 1, + IP_CT_NEW = 2, + IP_CT_IS_REPLY = 3, + IP_CT_ESTABLISHED_REPLY = 3, + IP_CT_RELATED_REPLY = 4, + IP_CT_NUMBER = 5, + IP_CT_UNTRACKED = 7, +}; + +union nf_inet_addr { + __u32 all[4]; + __be32 ip; + __be32 ip6[4]; + struct in_addr in; + struct in6_addr in6; +}; + +struct ip_ct_tcp_state { + u_int32_t td_end; + u_int32_t td_maxend; + u_int32_t td_maxwin; + u_int32_t td_maxack; + u_int8_t td_scale; + u_int8_t flags; +}; + +struct ip_ct_tcp { + struct ip_ct_tcp_state seen[2]; + u_int8_t state; + u_int8_t last_dir; + u_int8_t retrans; + u_int8_t last_index; + u_int32_t last_seq; + u_int32_t last_ack; + u_int32_t last_end; + u_int16_t last_win; + u_int8_t last_wscale; + u_int8_t last_flags; +}; + +union nf_conntrack_man_proto { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + __be16 id; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; +}; + +struct nf_ct_dccp { + u_int8_t role[2]; + u_int8_t state; + u_int8_t last_pkt; + u_int8_t last_dir; + u_int64_t handshake_seq; +}; + +struct ip_ct_sctp { + enum sctp_conntrack state; + __be32 vtag[2]; + u8 last_dir; + u8 flags; +}; + +struct nf_ct_event; + +struct nf_exp_event; + +struct nf_ct_event_notifier { + int (*ct_event)(unsigned int, const struct nf_ct_event *); + int (*exp_event)(unsigned int, const struct nf_exp_event *); +}; + +enum macsec_validation_type { + MACSEC_VALIDATE_DISABLED = 0, + MACSEC_VALIDATE_CHECK = 1, + MACSEC_VALIDATE_STRICT = 2, + __MACSEC_VALIDATE_END = 3, + MACSEC_VALIDATE_MAX = 2, +}; + +enum macsec_offload { + MACSEC_OFFLOAD_OFF = 0, + MACSEC_OFFLOAD_PHY = 1, + MACSEC_OFFLOAD_MAC = 2, + __MACSEC_OFFLOAD_END = 3, + MACSEC_OFFLOAD_MAX = 2, +}; + +enum { + TCA_FLOWER_KEY_CT_FLAGS_NEW = 1, + TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED = 2, + TCA_FLOWER_KEY_CT_FLAGS_RELATED = 4, + TCA_FLOWER_KEY_CT_FLAGS_TRACKED = 8, + TCA_FLOWER_KEY_CT_FLAGS_INVALID = 16, + TCA_FLOWER_KEY_CT_FLAGS_REPLY = 32, + __TCA_FLOWER_KEY_CT_FLAGS_MAX = 33, +}; + +struct ip_tunnel_parm { + char name[16]; + int link; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + struct iphdr iph; +}; + +enum devlink_port_type { + DEVLINK_PORT_TYPE_NOTSET = 0, + DEVLINK_PORT_TYPE_AUTO = 1, + DEVLINK_PORT_TYPE_ETH = 2, + DEVLINK_PORT_TYPE_IB = 3, +}; + +enum devlink_port_flavour { + DEVLINK_PORT_FLAVOUR_PHYSICAL = 0, + DEVLINK_PORT_FLAVOUR_CPU = 1, + DEVLINK_PORT_FLAVOUR_DSA = 2, + DEVLINK_PORT_FLAVOUR_PCI_PF = 3, + DEVLINK_PORT_FLAVOUR_PCI_VF = 4, + DEVLINK_PORT_FLAVOUR_VIRTUAL = 5, + DEVLINK_PORT_FLAVOUR_UNUSED = 6, + DEVLINK_PORT_FLAVOUR_PCI_SF = 7, +}; + +struct devlink_port_phys_attrs { + u32 port_number; + u32 split_subport_number; +}; + +struct devlink_port_pci_pf_attrs { + u32 controller; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_pci_vf_attrs { + u32 controller; + u16 pf; + u16 vf; + u8 external: 1; +}; + +struct devlink_port_pci_sf_attrs { + u32 controller; + u32 sf; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_attrs { + u8 split: 1; + u8 splittable: 1; + u32 lanes; + enum devlink_port_flavour flavour; + struct netdev_phys_item_id switch_id; + union { + struct devlink_port_phys_attrs phys; + struct devlink_port_pci_pf_attrs pci_pf; + struct devlink_port_pci_vf_attrs pci_vf; + struct devlink_port_pci_sf_attrs pci_sf; + }; +}; + +struct devlink; + +struct devlink_rate; + +struct devlink_linecard; + +struct devlink_port { + struct list_head list; + struct list_head region_list; + struct devlink *devlink; + unsigned int index; + spinlock_t type_lock; + enum devlink_port_type type; + enum devlink_port_type desired_type; + union { + struct { + struct net_device *netdev; + int ifindex; + char ifname[16]; + } type_eth; + struct { + struct ib_device *ibdev; + } type_ib; + }; + struct devlink_port_attrs attrs; + u8 attrs_set: 1; + u8 switch_port: 1; + u8 registered: 1; + u8 initialized: 1; + struct delayed_work type_warn_dw; + struct list_head reporter_list; + struct devlink_rate *devlink_rate; + struct devlink_linecard *linecard; +}; + +enum phylink_op_type { + PHYLINK_NETDEV = 0, + PHYLINK_DEV = 1, +}; + +struct phylink_link_state; + +struct phylink_config { + struct device *dev; + enum phylink_op_type type; + bool legacy_pre_march2020; + bool poll_fixed_state; + bool mac_managed_pm; + bool ovr_an_inband; + void (*get_fixed_state)(struct phylink_config *, struct phylink_link_state *); + long unsigned int supported_interfaces[1]; + long unsigned int mac_capabilities; +}; + +struct dsa_device_ops; + +struct dsa_switch_tree; + +struct dsa_switch; + +struct dsa_bridge; + +struct dsa_lag; + +struct dsa_netdevice_ops; + +struct dsa_port { + union { + struct net_device *master; + struct net_device *slave; + }; + const struct dsa_device_ops *tag_ops; + struct dsa_switch_tree *dst; + struct sk_buff * (*rcv)(struct sk_buff *, struct net_device *); + struct dsa_switch *ds; + unsigned int index; + enum { + DSA_PORT_TYPE_UNUSED = 0, + DSA_PORT_TYPE_CPU = 1, + DSA_PORT_TYPE_DSA = 2, + DSA_PORT_TYPE_USER = 3, + } type; + const char *name; + struct dsa_port *cpu_dp; + u8 mac[6]; + u8 stp_state; + u8 vlan_filtering: 1; + u8 learning: 1; + u8 lag_tx_enabled: 1; + u8 master_admin_up: 1; + u8 master_oper_up: 1; + u8 cpu_port_in_lag: 1; + u8 setup: 1; + struct device_node *dn; + unsigned int ageing_time; + struct dsa_bridge *bridge; + struct devlink_port devlink_port; + struct phylink *pl; + struct phylink_config pl_config; + struct dsa_lag *lag; + struct net_device *hsr_dev; + struct list_head list; + const struct ethtool_ops *orig_ethtool_ops; + const struct dsa_netdevice_ops *netdev_ops; + struct mutex addr_lists_lock; + struct list_head fdbs; + struct list_head mdbs; + struct mutex vlans_lock; + struct list_head vlans; +}; + +enum netdev_lag_tx_type { + NETDEV_LAG_TX_TYPE_UNKNOWN = 0, + NETDEV_LAG_TX_TYPE_RANDOM = 1, + NETDEV_LAG_TX_TYPE_BROADCAST = 2, + NETDEV_LAG_TX_TYPE_ROUNDROBIN = 3, + NETDEV_LAG_TX_TYPE_ACTIVEBACKUP = 4, + NETDEV_LAG_TX_TYPE_HASH = 5, +}; + +enum netdev_lag_hash { + NETDEV_LAG_HASH_NONE = 0, + NETDEV_LAG_HASH_L2 = 1, + NETDEV_LAG_HASH_L34 = 2, + NETDEV_LAG_HASH_L23 = 3, + NETDEV_LAG_HASH_E23 = 4, + NETDEV_LAG_HASH_E34 = 5, + NETDEV_LAG_HASH_VLAN_SRCMAC = 6, + NETDEV_LAG_HASH_UNKNOWN = 7, +}; + +struct netdev_lag_upper_info { + enum netdev_lag_tx_type tx_type; + enum netdev_lag_hash hash_type; +}; + +struct netdev_notifier_changeupper_info { + struct netdev_notifier_info info; + struct net_device *upper_dev; + bool master; + bool linking; + void *upper_info; +}; + +union tcp_word_hdr { + struct tcphdr hdr; + __be32 words[5]; +}; + +enum bpf_ret_code { + BPF_OK = 0, + BPF_DROP = 2, + BPF_REDIRECT = 7, + BPF_LWT_REROUTE = 128, + BPF_FLOW_DISSECTOR_CONTINUE = 129, +}; + +enum { + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 1, + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 2, + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 4, +}; + +struct flow_match { + struct flow_dissector *dissector; + void *mask; + void *key; +}; + +enum flow_action_id { + FLOW_ACTION_ACCEPT = 0, + FLOW_ACTION_DROP = 1, + FLOW_ACTION_TRAP = 2, + FLOW_ACTION_GOTO = 3, + FLOW_ACTION_REDIRECT = 4, + FLOW_ACTION_MIRRED = 5, + FLOW_ACTION_REDIRECT_INGRESS = 6, + FLOW_ACTION_MIRRED_INGRESS = 7, + FLOW_ACTION_VLAN_PUSH = 8, + FLOW_ACTION_VLAN_POP = 9, + FLOW_ACTION_VLAN_MANGLE = 10, + FLOW_ACTION_TUNNEL_ENCAP = 11, + FLOW_ACTION_TUNNEL_DECAP = 12, + FLOW_ACTION_MANGLE = 13, + FLOW_ACTION_ADD = 14, + FLOW_ACTION_CSUM = 15, + FLOW_ACTION_MARK = 16, + FLOW_ACTION_PTYPE = 17, + FLOW_ACTION_PRIORITY = 18, + FLOW_ACTION_RX_QUEUE_MAPPING = 19, + FLOW_ACTION_WAKE = 20, + FLOW_ACTION_QUEUE = 21, + FLOW_ACTION_SAMPLE = 22, + FLOW_ACTION_POLICE = 23, + FLOW_ACTION_CT = 24, + FLOW_ACTION_CT_METADATA = 25, + FLOW_ACTION_MPLS_PUSH = 26, + FLOW_ACTION_MPLS_POP = 27, + FLOW_ACTION_MPLS_MANGLE = 28, + FLOW_ACTION_GATE = 29, + FLOW_ACTION_PPPOE_PUSH = 30, + FLOW_ACTION_JUMP = 31, + FLOW_ACTION_PIPE = 32, + FLOW_ACTION_VLAN_PUSH_ETH = 33, + FLOW_ACTION_VLAN_POP_ETH = 34, + FLOW_ACTION_CONTINUE = 35, + NUM_FLOW_ACTIONS = 36, +}; + +enum flow_action_mangle_base { + FLOW_ACT_MANGLE_UNSPEC = 0, + FLOW_ACT_MANGLE_HDR_TYPE_ETH = 1, + FLOW_ACT_MANGLE_HDR_TYPE_IP4 = 2, + FLOW_ACT_MANGLE_HDR_TYPE_IP6 = 3, + FLOW_ACT_MANGLE_HDR_TYPE_TCP = 4, + FLOW_ACT_MANGLE_HDR_TYPE_UDP = 5, +}; + +enum flow_action_hw_stats { + FLOW_ACTION_HW_STATS_IMMEDIATE = 1, + FLOW_ACTION_HW_STATS_DELAYED = 2, + FLOW_ACTION_HW_STATS_ANY = 3, + FLOW_ACTION_HW_STATS_DISABLED = 4, + FLOW_ACTION_HW_STATS_DONT_CARE = 7, +}; + +typedef void (*action_destr)(void *); + +struct flow_action_cookie { + u32 cookie_len; + u8 cookie[0]; +}; + +struct nf_flowtable; + +struct ip_tunnel_key { + __be64 tun_id; + union { + struct { + __be32 src; + __be32 dst; + } ipv4; + struct { + struct in6_addr src; + struct in6_addr dst; + } ipv6; + } u; + __be16 tun_flags; + u8 tos; + u8 ttl; + __be32 label; + __be16 tp_src; + __be16 tp_dst; + __u8 flow_flags; +}; + +struct dst_cache_pcpu; + +struct dst_cache { + struct dst_cache_pcpu *cache; + long unsigned int reset_ts; +}; + +struct ip_tunnel_info { + struct ip_tunnel_key key; + struct dst_cache dst_cache; + u8 options_len; + u8 mode; + long: 32; +}; + +struct psample_group; + +struct action_gate_entry; + +struct flow_action_entry { + enum flow_action_id id; + u32 hw_index; + enum flow_action_hw_stats hw_stats; + action_destr destructor; + void *destructor_priv; + long: 32; + union { + u32 chain_index; + struct net_device *dev; + struct { + u16 vid; + __be16 proto; + u8 prio; + } vlan; + struct { + unsigned char dst[6]; + unsigned char src[6]; + } vlan_push_eth; + struct { + enum flow_action_mangle_base htype; + u32 offset; + u32 mask; + u32 val; + } mangle; + struct ip_tunnel_info *tunnel; + u32 csum_flags; + u32 mark; + u16 ptype; + u16 rx_queue; + u32 priority; + struct { + u32 ctx; + u32 index; + u8 vf; + } queue; + struct { + struct psample_group *psample_group; + u32 rate; + u32 trunc_size; + bool truncate; + } sample; + struct { + u32 burst; + long: 32; + u64 rate_bytes_ps; + u64 peakrate_bytes_ps; + u32 avrate; + u16 overhead; + u64 burst_pkt; + u64 rate_pkt_ps; + u32 mtu; + struct { + enum flow_action_id act_id; + u32 extval; + } exceed; + struct { + enum flow_action_id act_id; + u32 extval; + } notexceed; + long: 32; + } police; + struct { + int action; + u16 zone; + struct nf_flowtable *flow_table; + } ct; + struct { + long unsigned int cookie; + u32 mark; + u32 labels[4]; + bool orig_dir; + } ct_metadata; + struct { + u32 label; + __be16 proto; + u8 tc; + u8 bos; + u8 ttl; + } mpls_push; + struct { + __be16 proto; + } mpls_pop; + struct { + u32 label; + u8 tc; + u8 bos; + u8 ttl; + } mpls_mangle; + struct { + s32 prio; + long: 32; + u64 basetime; + u64 cycletime; + u64 cycletimeext; + u32 num_entries; + struct action_gate_entry *entries; + } gate; + struct { + u16 sid; + } pppoe; + }; + struct flow_action_cookie *cookie; + long: 32; +}; + +struct flow_action { + unsigned int num_entries; + long: 32; + struct flow_action_entry entries[0]; +}; + +struct flow_rule { + struct flow_match match; + long: 32; + struct flow_action action; +}; + +struct flow_stats { + u64 pkts; + u64 bytes; + u64 drops; + u64 lastused; + enum flow_action_hw_stats used_hw_stats; + bool used_hw_stats_valid; +}; + +enum flow_cls_command { + FLOW_CLS_REPLACE = 0, + FLOW_CLS_DESTROY = 1, + FLOW_CLS_STATS = 2, + FLOW_CLS_TMPLT_CREATE = 3, + FLOW_CLS_TMPLT_DESTROY = 4, +}; + +struct flow_cls_common_offload { + u32 chain_index; + __be16 protocol; + u32 prio; + struct netlink_ext_ack *extack; +}; + +struct flow_cls_offload { + struct flow_cls_common_offload common; + enum flow_cls_command command; + long unsigned int cookie; + struct flow_rule *rule; + long: 32; + struct flow_stats stats; + u32 classid; + long: 32; +}; + +struct dsa_chip_data { + struct device *host_dev; + int sw_addr; + struct device *netdev[12]; + int eeprom_len; + struct device_node *of_node; + char *port_names[12]; + struct device_node *port_dn[12]; + s8 rtable[4]; +}; + +struct dsa_platform_data { + struct device *netdev; + struct net_device *of_netdev; + int nr_chips; + struct dsa_chip_data *chip; +}; + +struct phylink_link_state { + long unsigned int advertising[4]; + long unsigned int lp_advertising[4]; + phy_interface_t interface; + int speed; + int duplex; + int pause; + int rate_matching; + unsigned int link: 1; + unsigned int an_enabled: 1; + unsigned int an_complete: 1; +}; + +struct phylink_pcs_ops; + +struct phylink_pcs { + const struct phylink_pcs_ops *ops; + bool poll; +}; + +struct phylink_pcs_ops { + int (*pcs_validate)(struct phylink_pcs *, long unsigned int *, const struct phylink_link_state *); + void (*pcs_get_state)(struct phylink_pcs *, struct phylink_link_state *); + int (*pcs_config)(struct phylink_pcs *, unsigned int, phy_interface_t, const long unsigned int *, bool); + void (*pcs_an_restart)(struct phylink_pcs *); + void (*pcs_link_up)(struct phylink_pcs *, unsigned int, phy_interface_t, int, int); +}; + +enum devlink_sb_pool_type { + DEVLINK_SB_POOL_TYPE_INGRESS = 0, + DEVLINK_SB_POOL_TYPE_EGRESS = 1, +}; + +enum devlink_sb_threshold_type { + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0, + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 1, +}; + +enum devlink_rate_type { + DEVLINK_RATE_TYPE_LEAF = 0, + DEVLINK_RATE_TYPE_NODE = 1, +}; + +enum devlink_param_cmode { + DEVLINK_PARAM_CMODE_RUNTIME = 0, + DEVLINK_PARAM_CMODE_DRIVERINIT = 1, + DEVLINK_PARAM_CMODE_PERMANENT = 2, + __DEVLINK_PARAM_CMODE_MAX = 3, + DEVLINK_PARAM_CMODE_MAX = 2, +}; + +struct devlink_rate { + struct list_head list; + enum devlink_rate_type type; + struct devlink *devlink; + void *priv; + long: 32; + u64 tx_share; + u64 tx_max; + struct devlink_rate *parent; + union { + struct devlink_port *devlink_port; + struct { + char *name; + refcount_t refcnt; + }; + }; + u32 tx_priority; + u32 tx_weight; + long: 32; +}; + +struct devlink_sb_pool_info { + enum devlink_sb_pool_type pool_type; + u32 size; + enum devlink_sb_threshold_type threshold_type; + u32 cell_size; +}; + +union devlink_param_value { + u8 vu8; + u16 vu16; + u32 vu32; + char vstr[32]; + bool vbool; +}; + +struct devlink_param_gset_ctx { + union devlink_param_value val; + enum devlink_param_cmode cmode; +}; + +struct fib_info; + +struct fib_nh { + struct fib_nh_common nh_common; + struct hlist_node nh_hash; + struct fib_info *nh_parent; + __u32 nh_tclassid; + __be32 nh_saddr; + int nh_saddr_genid; +}; + +struct fib_info { + struct hlist_node fib_hash; + struct hlist_node fib_lhash; + struct list_head nh_list; + struct net *fib_net; + refcount_t fib_treeref; + refcount_t fib_clntref; + unsigned int fib_flags; + unsigned char fib_dead; + unsigned char fib_protocol; + unsigned char fib_scope; + unsigned char fib_type; + __be32 fib_prefsrc; + u32 fib_tb_id; + u32 fib_priority; + struct dst_metrics *fib_metrics; + int fib_nhs; + bool fib_nh_is_v6; + bool nh_updated; + struct nexthop *nh; + struct callback_head rcu; + struct fib_nh fib_nh[0]; +}; + +struct nh_info; + +struct nh_group; + +struct nexthop { + struct rb_node rb_node; + struct list_head fi_list; + struct list_head f6i_list; + struct list_head fdb_list; + struct list_head grp_list; + struct net *net; + u32 id; + u8 protocol; + u8 nh_flags; + bool is_group; + refcount_t refcnt; + struct callback_head rcu; + union { + struct nh_info *nh_info; + struct nh_group *nh_grp; + }; +}; + +struct switchdev_mst_state { + u16 msti; + u8 state; +}; + +struct switchdev_brport_flags { + long unsigned int val; + long unsigned int mask; +}; + +struct switchdev_vlan_msti { + u16 vid; + u16 msti; +}; + +enum switchdev_obj_id { + SWITCHDEV_OBJ_ID_UNDEFINED = 0, + SWITCHDEV_OBJ_ID_PORT_VLAN = 1, + SWITCHDEV_OBJ_ID_PORT_MDB = 2, + SWITCHDEV_OBJ_ID_HOST_MDB = 3, + SWITCHDEV_OBJ_ID_MRP = 4, + SWITCHDEV_OBJ_ID_RING_TEST_MRP = 5, + SWITCHDEV_OBJ_ID_RING_ROLE_MRP = 6, + SWITCHDEV_OBJ_ID_RING_STATE_MRP = 7, + SWITCHDEV_OBJ_ID_IN_TEST_MRP = 8, + SWITCHDEV_OBJ_ID_IN_ROLE_MRP = 9, + SWITCHDEV_OBJ_ID_IN_STATE_MRP = 10, +}; + +struct switchdev_obj { + struct list_head list; + struct net_device *orig_dev; + enum switchdev_obj_id id; + u32 flags; + void *complete_priv; + void (*complete)(struct net_device *, int, void *); +}; + +struct switchdev_obj_port_vlan { + struct switchdev_obj obj; + u16 flags; + u16 vid; + bool changed; +}; + +struct switchdev_obj_port_mdb { + struct switchdev_obj obj; + unsigned char addr[6]; + u16 vid; +}; + +struct switchdev_obj_mrp { + struct switchdev_obj obj; + struct net_device *p_port; + struct net_device *s_port; + u32 ring_id; + u16 prio; +}; + +struct switchdev_obj_ring_role_mrp { + struct switchdev_obj obj; + u8 ring_role; + u32 ring_id; + u8 sw_backup; +}; + +enum dsa_tag_protocol { + DSA_TAG_PROTO_NONE = 0, + DSA_TAG_PROTO_BRCM = 1, + DSA_TAG_PROTO_BRCM_LEGACY = 22, + DSA_TAG_PROTO_BRCM_PREPEND = 2, + DSA_TAG_PROTO_DSA = 3, + DSA_TAG_PROTO_EDSA = 4, + DSA_TAG_PROTO_GSWIP = 5, + DSA_TAG_PROTO_KSZ9477 = 6, + DSA_TAG_PROTO_KSZ9893 = 7, + DSA_TAG_PROTO_LAN9303 = 8, + DSA_TAG_PROTO_MTK = 9, + DSA_TAG_PROTO_QCA = 10, + DSA_TAG_PROTO_TRAILER = 11, + DSA_TAG_PROTO_8021Q = 12, + DSA_TAG_PROTO_SJA1105 = 13, + DSA_TAG_PROTO_KSZ8795 = 14, + DSA_TAG_PROTO_OCELOT = 15, + DSA_TAG_PROTO_AR9331 = 16, + DSA_TAG_PROTO_RTL4_A = 17, + DSA_TAG_PROTO_HELLCREEK = 18, + DSA_TAG_PROTO_XRS700X = 19, + DSA_TAG_PROTO_OCELOT_8021Q = 20, + DSA_TAG_PROTO_SEVILLE = 21, + DSA_TAG_PROTO_SJA1110 = 23, + DSA_TAG_PROTO_RTL8_4 = 24, + DSA_TAG_PROTO_RTL8_4T = 25, + DSA_TAG_PROTO_RZN1_A5PSW = 26, + DSA_TAG_PROTO_LAN937X = 27, +}; + +struct dsa_device_ops { + struct sk_buff * (*xmit)(struct sk_buff *, struct net_device *); + struct sk_buff * (*rcv)(struct sk_buff *, struct net_device *); + void (*flow_dissect)(const struct sk_buff *, __be16 *, int *); + int (*connect)(struct dsa_switch *); + void (*disconnect)(struct dsa_switch *); + unsigned int needed_headroom; + unsigned int needed_tailroom; + const char *name; + enum dsa_tag_protocol proto; + bool promisc_on_master; +}; + +struct dsa_8021q_context; + +struct dsa_switch_ops; + +struct dsa_switch { + struct device *dev; + struct dsa_switch_tree *dst; + unsigned int index; + u32 setup: 1; + u32 vlan_filtering_is_global: 1; + u32 needs_standalone_vlan_filtering: 1; + u32 configure_vlan_while_not_filtering: 1; + u32 untag_bridge_pvid: 1; + u32 assisted_learning_on_cpu_port: 1; + u32 vlan_filtering: 1; + u32 mtu_enforcement_ingress: 1; + u32 fdb_isolation: 1; + struct notifier_block nb; + void *priv; + void *tagger_data; + struct dsa_chip_data *cd; + const struct dsa_switch_ops *ops; + u32 phys_mii_mask; + struct mii_bus *slave_mii_bus; + unsigned int ageing_time_min; + unsigned int ageing_time_max; + struct dsa_8021q_context *tag_8021q_ctx; + struct devlink *devlink; + unsigned int num_tx_queues; + unsigned int num_lag_ids; + unsigned int max_num_bridges; + unsigned int num_ports; +}; + +struct dsa_netdevice_ops { + int (*ndo_eth_ioctl)(struct net_device *, struct ifreq *, int); +}; + +struct dsa_lag { + struct net_device *dev; + unsigned int id; + struct mutex fdb_lock; + struct list_head fdbs; + refcount_t refcount; +}; + +struct dsa_switch_tree { + struct list_head list; + struct list_head ports; + struct raw_notifier_head nh; + unsigned int index; + struct kref refcount; + struct dsa_lag **lags; + const struct dsa_device_ops *tag_ops; + enum dsa_tag_protocol default_proto; + bool setup; + struct dsa_platform_data *pd; + struct list_head rtable; + unsigned int lags_len; + unsigned int last_switch; +}; + +struct dsa_mall_mirror_tc_entry { + u8 to_local_port; + bool ingress; +}; + +struct dsa_mall_policer_tc_entry { + u32 burst; + long: 32; + u64 rate_bytes_per_sec; +}; + +struct dsa_bridge { + struct net_device *dev; + unsigned int num; + bool tx_fwd_offload; + refcount_t refcount; +}; + +enum dsa_db_type { + DSA_DB_PORT = 0, + DSA_DB_LAG = 1, + DSA_DB_BRIDGE = 2, +}; + +struct dsa_db { + enum dsa_db_type type; + union { + const struct dsa_port *dp; + struct dsa_lag lag; + struct dsa_bridge bridge; + }; +}; + +struct fixed_phy_status; + +typedef int dsa_fdb_dump_cb_t(const unsigned char *, u16, bool, void *); + +struct devlink_info_req; + +struct dsa_switch_ops { + enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *, int, enum dsa_tag_protocol); + int (*change_tag_protocol)(struct dsa_switch *, enum dsa_tag_protocol); + int (*connect_tag_protocol)(struct dsa_switch *, enum dsa_tag_protocol); + int (*port_change_master)(struct dsa_switch *, int, struct net_device *, struct netlink_ext_ack *); + int (*setup)(struct dsa_switch *); + void (*teardown)(struct dsa_switch *); + int (*port_setup)(struct dsa_switch *, int); + void (*port_teardown)(struct dsa_switch *, int); + u32 (*get_phy_flags)(struct dsa_switch *, int); + int (*phy_read)(struct dsa_switch *, int, int); + int (*phy_write)(struct dsa_switch *, int, int, u16); + void (*adjust_link)(struct dsa_switch *, int, struct phy_device *); + void (*fixed_link_update)(struct dsa_switch *, int, struct fixed_phy_status *); + void (*phylink_get_caps)(struct dsa_switch *, int, struct phylink_config *); + struct phylink_pcs * (*phylink_mac_select_pcs)(struct dsa_switch *, int, phy_interface_t); + int (*phylink_mac_link_state)(struct dsa_switch *, int, struct phylink_link_state *); + void (*phylink_mac_config)(struct dsa_switch *, int, unsigned int, const struct phylink_link_state *); + void (*phylink_mac_an_restart)(struct dsa_switch *, int); + void (*phylink_mac_link_down)(struct dsa_switch *, int, unsigned int, phy_interface_t); + void (*phylink_mac_link_up)(struct dsa_switch *, int, unsigned int, phy_interface_t, struct phy_device *, int, int, bool, bool); + void (*phylink_fixed_state)(struct dsa_switch *, int, struct phylink_link_state *); + void (*get_strings)(struct dsa_switch *, int, u32, uint8_t *); + void (*get_ethtool_stats)(struct dsa_switch *, int, uint64_t *); + int (*get_sset_count)(struct dsa_switch *, int, int); + void (*get_ethtool_phy_stats)(struct dsa_switch *, int, uint64_t *); + void (*get_eth_phy_stats)(struct dsa_switch *, int, struct ethtool_eth_phy_stats *); + void (*get_eth_mac_stats)(struct dsa_switch *, int, struct ethtool_eth_mac_stats *); + void (*get_eth_ctrl_stats)(struct dsa_switch *, int, struct ethtool_eth_ctrl_stats *); + void (*get_rmon_stats)(struct dsa_switch *, int, struct ethtool_rmon_stats *, const struct ethtool_rmon_hist_range **); + void (*get_stats64)(struct dsa_switch *, int, struct rtnl_link_stats64 *); + void (*get_pause_stats)(struct dsa_switch *, int, struct ethtool_pause_stats *); + void (*self_test)(struct dsa_switch *, int, struct ethtool_test *, u64 *); + void (*get_wol)(struct dsa_switch *, int, struct ethtool_wolinfo *); + int (*set_wol)(struct dsa_switch *, int, struct ethtool_wolinfo *); + int (*get_ts_info)(struct dsa_switch *, int, struct ethtool_ts_info *); + int (*get_mm)(struct dsa_switch *, int, struct ethtool_mm_state *); + int (*set_mm)(struct dsa_switch *, int, struct ethtool_mm_cfg *, struct netlink_ext_ack *); + void (*get_mm_stats)(struct dsa_switch *, int, struct ethtool_mm_stats *); + int (*port_get_default_prio)(struct dsa_switch *, int); + int (*port_set_default_prio)(struct dsa_switch *, int, u8); + int (*port_get_dscp_prio)(struct dsa_switch *, int, u8); + int (*port_add_dscp_prio)(struct dsa_switch *, int, u8, u8); + int (*port_del_dscp_prio)(struct dsa_switch *, int, u8, u8); + int (*suspend)(struct dsa_switch *); + int (*resume)(struct dsa_switch *); + int (*port_enable)(struct dsa_switch *, int, struct phy_device *); + void (*port_disable)(struct dsa_switch *, int); + int (*set_mac_eee)(struct dsa_switch *, int, struct ethtool_eee *); + int (*get_mac_eee)(struct dsa_switch *, int, struct ethtool_eee *); + int (*get_eeprom_len)(struct dsa_switch *); + int (*get_eeprom)(struct dsa_switch *, struct ethtool_eeprom *, u8 *); + int (*set_eeprom)(struct dsa_switch *, struct ethtool_eeprom *, u8 *); + int (*get_regs_len)(struct dsa_switch *, int); + void (*get_regs)(struct dsa_switch *, int, struct ethtool_regs *, void *); + int (*port_prechangeupper)(struct dsa_switch *, int, struct netdev_notifier_changeupper_info *); + int (*set_ageing_time)(struct dsa_switch *, unsigned int); + int (*port_bridge_join)(struct dsa_switch *, int, struct dsa_bridge, bool *, struct netlink_ext_ack *); + void (*port_bridge_leave)(struct dsa_switch *, int, struct dsa_bridge); + void (*port_stp_state_set)(struct dsa_switch *, int, u8); + int (*port_mst_state_set)(struct dsa_switch *, int, const struct switchdev_mst_state *); + void (*port_fast_age)(struct dsa_switch *, int); + int (*port_vlan_fast_age)(struct dsa_switch *, int, u16); + int (*port_pre_bridge_flags)(struct dsa_switch *, int, struct switchdev_brport_flags, struct netlink_ext_ack *); + int (*port_bridge_flags)(struct dsa_switch *, int, struct switchdev_brport_flags, struct netlink_ext_ack *); + void (*port_set_host_flood)(struct dsa_switch *, int, bool, bool); + int (*port_vlan_filtering)(struct dsa_switch *, int, bool, struct netlink_ext_ack *); + int (*port_vlan_add)(struct dsa_switch *, int, const struct switchdev_obj_port_vlan *, struct netlink_ext_ack *); + int (*port_vlan_del)(struct dsa_switch *, int, const struct switchdev_obj_port_vlan *); + int (*vlan_msti_set)(struct dsa_switch *, struct dsa_bridge, const struct switchdev_vlan_msti *); + int (*port_fdb_add)(struct dsa_switch *, int, const unsigned char *, u16, struct dsa_db); + int (*port_fdb_del)(struct dsa_switch *, int, const unsigned char *, u16, struct dsa_db); + int (*port_fdb_dump)(struct dsa_switch *, int, dsa_fdb_dump_cb_t *, void *); + int (*lag_fdb_add)(struct dsa_switch *, struct dsa_lag, const unsigned char *, u16, struct dsa_db); + int (*lag_fdb_del)(struct dsa_switch *, struct dsa_lag, const unsigned char *, u16, struct dsa_db); + int (*port_mdb_add)(struct dsa_switch *, int, const struct switchdev_obj_port_mdb *, struct dsa_db); + int (*port_mdb_del)(struct dsa_switch *, int, const struct switchdev_obj_port_mdb *, struct dsa_db); + int (*get_rxnfc)(struct dsa_switch *, int, struct ethtool_rxnfc *, u32 *); + int (*set_rxnfc)(struct dsa_switch *, int, struct ethtool_rxnfc *); + int (*cls_flower_add)(struct dsa_switch *, int, struct flow_cls_offload *, bool); + int (*cls_flower_del)(struct dsa_switch *, int, struct flow_cls_offload *, bool); + int (*cls_flower_stats)(struct dsa_switch *, int, struct flow_cls_offload *, bool); + int (*port_mirror_add)(struct dsa_switch *, int, struct dsa_mall_mirror_tc_entry *, bool, struct netlink_ext_ack *); + void (*port_mirror_del)(struct dsa_switch *, int, struct dsa_mall_mirror_tc_entry *); + int (*port_policer_add)(struct dsa_switch *, int, struct dsa_mall_policer_tc_entry *); + void (*port_policer_del)(struct dsa_switch *, int); + int (*port_setup_tc)(struct dsa_switch *, int, enum tc_setup_type, void *); + int (*crosschip_bridge_join)(struct dsa_switch *, int, int, int, struct dsa_bridge, struct netlink_ext_ack *); + void (*crosschip_bridge_leave)(struct dsa_switch *, int, int, int, struct dsa_bridge); + int (*crosschip_lag_change)(struct dsa_switch *, int, int); + int (*crosschip_lag_join)(struct dsa_switch *, int, int, struct dsa_lag, struct netdev_lag_upper_info *, struct netlink_ext_ack *); + int (*crosschip_lag_leave)(struct dsa_switch *, int, int, struct dsa_lag); + int (*port_hwtstamp_get)(struct dsa_switch *, int, struct ifreq *); + int (*port_hwtstamp_set)(struct dsa_switch *, int, struct ifreq *); + void (*port_txtstamp)(struct dsa_switch *, int, struct sk_buff *); + bool (*port_rxtstamp)(struct dsa_switch *, int, struct sk_buff *, unsigned int); + int (*devlink_param_get)(struct dsa_switch *, u32, struct devlink_param_gset_ctx *); + int (*devlink_param_set)(struct dsa_switch *, u32, struct devlink_param_gset_ctx *); + int (*devlink_info_get)(struct dsa_switch *, struct devlink_info_req *, struct netlink_ext_ack *); + int (*devlink_sb_pool_get)(struct dsa_switch *, unsigned int, u16, struct devlink_sb_pool_info *); + int (*devlink_sb_pool_set)(struct dsa_switch *, unsigned int, u16, u32, enum devlink_sb_threshold_type, struct netlink_ext_ack *); + int (*devlink_sb_port_pool_get)(struct dsa_switch *, int, unsigned int, u16, u32 *); + int (*devlink_sb_port_pool_set)(struct dsa_switch *, int, unsigned int, u16, u32, struct netlink_ext_ack *); + int (*devlink_sb_tc_pool_bind_get)(struct dsa_switch *, int, unsigned int, u16, enum devlink_sb_pool_type, u16 *, u32 *); + int (*devlink_sb_tc_pool_bind_set)(struct dsa_switch *, int, unsigned int, u16, enum devlink_sb_pool_type, u16, u32, struct netlink_ext_ack *); + int (*devlink_sb_occ_snapshot)(struct dsa_switch *, unsigned int); + int (*devlink_sb_occ_max_clear)(struct dsa_switch *, unsigned int); + int (*devlink_sb_occ_port_pool_get)(struct dsa_switch *, int, unsigned int, u16, u32 *, u32 *); + int (*devlink_sb_occ_tc_port_bind_get)(struct dsa_switch *, int, unsigned int, u16, enum devlink_sb_pool_type, u32 *, u32 *); + int (*port_change_mtu)(struct dsa_switch *, int, int); + int (*port_max_mtu)(struct dsa_switch *, int); + int (*port_lag_change)(struct dsa_switch *, int); + int (*port_lag_join)(struct dsa_switch *, int, struct dsa_lag, struct netdev_lag_upper_info *, struct netlink_ext_ack *); + int (*port_lag_leave)(struct dsa_switch *, int, struct dsa_lag); + int (*port_hsr_join)(struct dsa_switch *, int, struct net_device *); + int (*port_hsr_leave)(struct dsa_switch *, int, struct net_device *); + int (*port_mrp_add)(struct dsa_switch *, int, const struct switchdev_obj_mrp *); + int (*port_mrp_del)(struct dsa_switch *, int, const struct switchdev_obj_mrp *); + int (*port_mrp_add_ring_role)(struct dsa_switch *, int, const struct switchdev_obj_ring_role_mrp *); + int (*port_mrp_del_ring_role)(struct dsa_switch *, int, const struct switchdev_obj_ring_role_mrp *); + int (*tag_8021q_vlan_add)(struct dsa_switch *, int, u16, u16); + int (*tag_8021q_vlan_del)(struct dsa_switch *, int, u16); + void (*master_state_change)(struct dsa_switch *, const struct net_device *, bool); +}; + +enum lwtunnel_encap_types { + LWTUNNEL_ENCAP_NONE = 0, + LWTUNNEL_ENCAP_MPLS = 1, + LWTUNNEL_ENCAP_IP = 2, + LWTUNNEL_ENCAP_ILA = 3, + LWTUNNEL_ENCAP_IP6 = 4, + LWTUNNEL_ENCAP_SEG6 = 5, + LWTUNNEL_ENCAP_BPF = 6, + LWTUNNEL_ENCAP_SEG6_LOCAL = 7, + LWTUNNEL_ENCAP_RPL = 8, + LWTUNNEL_ENCAP_IOAM6 = 9, + LWTUNNEL_ENCAP_XFRM = 10, + __LWTUNNEL_ENCAP_MAX = 11, +}; + +struct arphdr { + __be16 ar_hrd; + __be16 ar_pro; + unsigned char ar_hln; + unsigned char ar_pln; + __be16 ar_op; +}; + +struct nh_info { + struct hlist_node dev_hash; + struct nexthop *nh_parent; + u8 family; + bool reject_nh; + bool fdb_nh; + union { + struct fib_nh_common fib_nhc; + struct fib_nh fib_nh; + struct fib6_nh fib6_nh; + }; +}; + +struct nh_grp_entry; + +struct nh_res_bucket { + struct nh_grp_entry *nh_entry; + atomic_long_t used_time; + long unsigned int migrated_time; + bool occupied; + u8 nh_flags; +}; + +struct nh_grp_entry { + struct nexthop *nh; + u8 weight; + union { + struct { + atomic_t upper_bound; + } hthr; + struct { + struct list_head uw_nh_entry; + u16 count_buckets; + u16 wants_buckets; + } res; + }; + struct list_head nh_list; + struct nexthop *nh_parent; +}; + +struct nh_res_table { + struct net *net; + u32 nhg_id; + struct delayed_work upkeep_dw; + struct list_head uw_nh_entries; + long unsigned int unbalanced_since; + u32 idle_timer; + u32 unbalanced_timer; + u16 num_nh_buckets; + struct nh_res_bucket nh_buckets[0]; +}; + +struct nh_group { + struct nh_group *spare; + u16 num_nh; + bool is_multipath; + bool hash_threshold; + bool resilient; + bool fdb_nh; + bool has_v4; + struct nh_res_table *res_table; + struct nh_grp_entry nh_entries[0]; +}; + +typedef u64 sci_t; + +typedef u32 ssci_t; + +union salt { + struct { + u32 ssci; + u64 pn; + }; + u8 bytes[12]; +}; + +typedef union salt salt_t; + +union pn { + struct { + u32 lower; + u32 upper; + }; + u64 full64; +}; + +typedef union pn pn_t; + +struct macsec_key { + u8 id[16]; + struct crypto_aead *tfm; + salt_t salt; +}; + +struct macsec_rx_sc_stats { + __u64 InOctetsValidated; + __u64 InOctetsDecrypted; + __u64 InPktsUnchecked; + __u64 InPktsDelayed; + __u64 InPktsOK; + __u64 InPktsInvalid; + __u64 InPktsLate; + __u64 InPktsNotValid; + __u64 InPktsNotUsingSA; + __u64 InPktsUnusedSA; +}; + +struct macsec_rx_sa_stats { + __u32 InPktsOK; + __u32 InPktsInvalid; + __u32 InPktsNotValid; + __u32 InPktsNotUsingSA; + __u32 InPktsUnusedSA; +}; + +struct macsec_tx_sa_stats { + __u32 OutPktsProtected; + __u32 OutPktsEncrypted; +}; + +struct macsec_tx_sc_stats { + __u64 OutPktsProtected; + __u64 OutPktsEncrypted; + __u64 OutOctetsProtected; + __u64 OutOctetsEncrypted; +}; + +struct macsec_dev_stats { + __u64 OutPktsUntagged; + __u64 InPktsUntagged; + __u64 OutPktsTooLong; + __u64 InPktsNoTag; + __u64 InPktsBadTag; + __u64 InPktsUnknownSCI; + __u64 InPktsNoSCI; + __u64 InPktsOverrun; +}; + +struct macsec_rx_sc; + +struct macsec_rx_sa { + struct macsec_key key; + ssci_t ssci; + spinlock_t lock; + union { + pn_t next_pn_halves; + u64 next_pn; + }; + refcount_t refcnt; + bool active; + struct macsec_rx_sa_stats *stats; + struct macsec_rx_sc *sc; + struct callback_head rcu; +}; + +struct pcpu_rx_sc_stats; + +struct macsec_rx_sc { + struct macsec_rx_sc *next; + long: 32; + sci_t sci; + bool active; + struct macsec_rx_sa *sa[4]; + struct pcpu_rx_sc_stats *stats; + refcount_t refcnt; + struct callback_head callback_head; + long: 32; +}; + +struct pcpu_rx_sc_stats { + struct macsec_rx_sc_stats stats; + struct u64_stats_sync syncp; + long: 32; +}; + +struct pcpu_tx_sc_stats { + struct macsec_tx_sc_stats stats; + struct u64_stats_sync syncp; + long: 32; +}; + +struct macsec_tx_sa { + struct macsec_key key; + ssci_t ssci; + spinlock_t lock; + union { + pn_t next_pn_halves; + u64 next_pn; + }; + refcount_t refcnt; + bool active; + struct macsec_tx_sa_stats *stats; + struct callback_head rcu; + long: 32; +}; + +struct metadata_dst; + +struct macsec_tx_sc { + bool active; + u8 encoding_sa; + bool encrypt; + bool send_sci; + bool end_station; + bool scb; + struct macsec_tx_sa *sa[4]; + struct pcpu_tx_sc_stats *stats; + struct metadata_dst *md_dst; +}; + +enum metadata_type { + METADATA_IP_TUNNEL = 0, + METADATA_HW_PORT_MUX = 1, + METADATA_MACSEC = 2, + METADATA_XFRM = 3, +}; + +struct hw_port_info { + struct net_device *lower_dev; + u32 port_id; +}; + +struct macsec_info { + sci_t sci; +}; + +struct xfrm_md_info { + u32 if_id; + int link; + struct dst_entry *dst_orig; +}; + +struct metadata_dst { + struct dst_entry dst; + enum metadata_type type; + union { + struct ip_tunnel_info tun_info; + struct hw_port_info port_info; + struct macsec_info macsec_info; + struct xfrm_md_info xfrm_info; + } u; +}; + +struct macsec_secy { + struct net_device *netdev; + unsigned int n_rx_sc; + sci_t sci; + u16 key_len; + u16 icv_len; + enum macsec_validation_type validate_frames; + bool xpn; + bool operational; + bool protect_frames; + bool replay_protect; + u32 replay_window; + struct macsec_tx_sc tx_sc; + struct macsec_rx_sc *rx_sc; + long: 32; +}; + +struct macsec_context { + union { + struct net_device *netdev; + struct phy_device *phydev; + }; + enum macsec_offload offload; + struct macsec_secy *secy; + struct macsec_rx_sc *rx_sc; + struct { + unsigned char assoc_num; + u8 key[128]; + union { + struct macsec_rx_sa *rx_sa; + struct macsec_tx_sa *tx_sa; + }; + } sa; + union { + struct macsec_tx_sc_stats *tx_sc_stats; + struct macsec_tx_sa_stats *tx_sa_stats; + struct macsec_rx_sc_stats *rx_sc_stats; + struct macsec_rx_sa_stats *rx_sa_stats; + struct macsec_dev_stats *dev_stats; + } stats; +}; + +struct gre_base_hdr { + __be16 flags; + __be16 protocol; +}; + +struct gre_full_hdr { + struct gre_base_hdr fixed_header; + __be16 csum; + __be16 reserved1; + __be32 key; + __be32 seq; +}; + +struct pptp_gre_header { + struct gre_base_hdr gre_hd; + __be16 payload_len; + __be16 call_id; + __be32 seq; + __be32 ack; +}; + +struct tipc_basic_hdr { + __be32 w[4]; +}; + +struct icmphdr { + __u8 type; + __u8 code; + __sum16 checksum; + union { + struct { + __be16 id; + __be16 sequence; + } echo; + __be32 gateway; + struct { + __be16 __unused; + __be16 mtu; + } frag; + __u8 reserved[4]; + } un; +}; + +enum l2tp_debug_flags { + L2TP_MSG_DEBUG = 1, + L2TP_MSG_CONTROL = 2, + L2TP_MSG_SEQ = 4, + L2TP_MSG_DATA = 8, +}; + +struct pppoe_tag { + __be16 tag_type; + __be16 tag_len; + char tag_data[0]; +}; + +struct pppoe_hdr { + __u8 type: 4; + __u8 ver: 4; + __u8 code; + __be16 sid; + __be16 length; + struct pppoe_tag tag[0]; +}; + +struct hsr_tag { + __be16 path_and_LSDU_size; + __be16 sequence_nr; + __be16 encap_proto; +}; + +struct mpls_label { + __be32 entry; +}; + +struct clock_identity { + u8 id[8]; +}; + +struct port_identity { + struct clock_identity clock_identity; + __be16 port_number; +}; + +struct ptp_header { + u8 tsmt; + u8 ver; + __be16 message_length; + u8 domain_number; + u8 reserved1; + u8 flag_field[2]; + __be64 correction; + __be32 reserved2; + struct port_identity source_port_identity; + __be16 sequence_id; + u8 control; + u8 log_message_interval; +} __attribute__((packed)); + +enum batadv_packettype { + BATADV_IV_OGM = 0, + BATADV_BCAST = 1, + BATADV_CODED = 2, + BATADV_ELP = 3, + BATADV_OGM2 = 4, + BATADV_MCAST = 5, + BATADV_UNICAST = 64, + BATADV_UNICAST_FRAG = 65, + BATADV_UNICAST_4ADDR = 66, + BATADV_ICMP = 67, + BATADV_UNICAST_TVLV = 68, +}; + +struct batadv_unicast_packet { + __u8 packet_type; + __u8 version; + __u8 ttl; + __u8 ttvn; + __u8 dest[6]; +}; + +struct nf_conntrack_zone { + u16 id; + u8 flags; + u8 dir; +}; + +struct nf_conntrack_man { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + u_int16_t l3num; +}; + +struct nf_conntrack_tuple { + struct nf_conntrack_man src; + struct { + union nf_inet_addr u3; + union { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + u_int8_t type; + u_int8_t code; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; + } u; + u_int8_t protonum; + u_int8_t dir; + } dst; +}; + +struct nf_conntrack_tuple_hash { + struct hlist_nulls_node hnnode; + struct nf_conntrack_tuple tuple; +}; + +struct nf_ct_udp { + long unsigned int stream_ts; +}; + +struct nf_ct_gre { + unsigned int stream_timeout; + unsigned int timeout; +}; + +union nf_conntrack_proto { + struct nf_ct_dccp dccp; + struct ip_ct_sctp sctp; + struct ip_ct_tcp tcp; + struct nf_ct_udp udp; + struct nf_ct_gre gre; + unsigned int tmpl_padto; +}; + +struct nf_ct_ext; + +struct nf_conn { + struct nf_conntrack ct_general; + spinlock_t lock; + u32 timeout; + struct nf_conntrack_zone zone; + struct nf_conntrack_tuple_hash tuplehash[2]; + long unsigned int status; + possible_net_t ct_net; + struct hlist_node nat_bysource; + struct {} __nfct_init_offset; + struct nf_conn *master; + u_int32_t mark; + u_int32_t secmark; + struct nf_ct_ext *ext; + union nf_conntrack_proto proto; +}; + +struct nf_conntrack_tuple_mask { + struct { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + } src; +}; + +struct nf_ct_ext { + u8 offset[10]; + u8 len; + unsigned int gen_id; + char data[0]; +}; + +struct nf_conntrack_helper; + +struct nf_conntrack_expect { + struct hlist_node lnode; + struct hlist_node hnode; + struct nf_conntrack_tuple tuple; + struct nf_conntrack_tuple_mask mask; + void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); + struct nf_conntrack_helper *helper; + struct nf_conn *master; + struct timer_list timeout; + refcount_t use; + unsigned int flags; + unsigned int class; + union nf_inet_addr saved_addr; + union nf_conntrack_man_proto saved_proto; + enum ip_conntrack_dir dir; + struct callback_head rcu; +}; + +enum nf_ct_ext_id { + NF_CT_EXT_HELPER = 0, + NF_CT_EXT_NAT = 1, + NF_CT_EXT_SEQADJ = 2, + NF_CT_EXT_ACCT = 3, + NF_CT_EXT_ECACHE = 4, + NF_CT_EXT_TSTAMP = 5, + NF_CT_EXT_TIMEOUT = 6, + NF_CT_EXT_LABELS = 7, + NF_CT_EXT_SYNPROXY = 8, + NF_CT_EXT_ACT_CT = 9, + NF_CT_EXT_NUM = 10, +}; + +struct nf_ct_event { + struct nf_conn *ct; + u32 portid; + int report; +}; + +struct nf_exp_event { + struct nf_conntrack_expect *exp; + u32 portid; + int report; +}; + +struct nf_conn_labels { + long unsigned int bits[4]; +}; + +struct _flow_keys_digest_data { + __be16 n_proto; + u8 ip_proto; + u8 padding; + __be32 ports; + __be32 src; + __be32 dst; +}; + +struct rps_sock_flow_table { + u32 mask; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + u32 ents[0]; +}; + +enum nf_dev_hooks { + NF_NETDEV_INGRESS = 0, + NF_NETDEV_EGRESS = 1, + NF_NETDEV_NUMHOOKS = 2, +}; + +enum { + IF_OPER_UNKNOWN = 0, + IF_OPER_NOTPRESENT = 1, + IF_OPER_DOWN = 2, + IF_OPER_LOWERLAYERDOWN = 3, + IF_OPER_TESTING = 4, + IF_OPER_DORMANT = 5, + IF_OPER_UP = 6, +}; + +struct ifbond { + __s32 bond_mode; + __s32 num_slaves; + __s32 miimon; +}; + +typedef struct ifbond ifbond; + +struct ifslave { + __s32 slave_id; + char slave_name[16]; + __s8 link; + __s8 state; + __u32 link_failure_count; +}; + +typedef struct ifslave ifslave; + +enum { + NAPIF_STATE_SCHED = 1, + NAPIF_STATE_MISSED = 2, + NAPIF_STATE_DISABLE = 4, + NAPIF_STATE_NPSVC = 8, + NAPIF_STATE_LISTED = 16, + NAPIF_STATE_NO_BUSY_POLL = 32, + NAPIF_STATE_IN_BUSY_POLL = 64, + NAPIF_STATE_PREFER_BUSY_POLL = 128, + NAPIF_STATE_THREADED = 256, + NAPIF_STATE_SCHED_THREADED = 512, +}; + +enum netdev_queue_state_t { + __QUEUE_STATE_DRV_XOFF = 0, + __QUEUE_STATE_STACK_XOFF = 1, + __QUEUE_STATE_FROZEN = 2, +}; + +struct net_device_path_stack { + int num_paths; + struct net_device_path path[5]; +}; + +struct bpf_xdp_link { + struct bpf_link link; + struct net_device *dev; + int flags; +}; + +struct netdev_net_notifier { + struct list_head list; + struct notifier_block *nb; +}; + +struct netpoll; + +struct netpoll_info { + refcount_t refcnt; + struct semaphore dev_lock; + struct sk_buff_head txq; + struct delayed_work tx_work; + struct netpoll *netpoll; + struct callback_head rcu; +}; + +struct packet_type { + __be16 type; + bool ignore_outgoing; + struct net_device *dev; + netdevice_tracker dev_tracker; + int (*func)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); + void (*list_func)(struct list_head *, struct packet_type *, struct net_device *); + bool (*id_match)(struct packet_type *, struct sock *); + struct net *af_packet_net; + void *af_packet_priv; + struct list_head list; +}; + +struct netdev_notifier_info_ext { + struct netdev_notifier_info info; + union { + u32 mtu; + } ext; +}; + +struct netdev_notifier_change_info { + struct netdev_notifier_info info; + unsigned int flags_changed; +}; + +struct netdev_notifier_changelowerstate_info { + struct netdev_notifier_info info; + void *lower_state_info; +}; + +struct netdev_notifier_pre_changeaddr_info { + struct netdev_notifier_info info; + const unsigned char *dev_addr; +}; + +enum netdev_offload_xstats_type { + NETDEV_OFFLOAD_XSTATS_TYPE_L3 = 1, +}; + +struct netdev_notifier_offload_xstats_rd { + struct rtnl_hw_stats64 stats; + bool used; + long: 32; +}; + +struct netdev_notifier_offload_xstats_ru { + bool used; +}; + +struct netdev_notifier_offload_xstats_info { + struct netdev_notifier_info info; + enum netdev_offload_xstats_type type; + union { + struct netdev_notifier_offload_xstats_rd *report_delta; + struct netdev_notifier_offload_xstats_ru *report_used; + }; +}; + +enum { + NESTED_SYNC_IMM_BIT = 0, + NESTED_SYNC_TODO_BIT = 1, +}; + +struct netdev_nested_priv { + unsigned char flags; + void *data; +}; + +struct netdev_bonding_info { + ifslave slave; + ifbond master; +}; + +struct netdev_notifier_bonding_info { + struct netdev_notifier_info info; + struct netdev_bonding_info bonding_info; +}; + +union inet_addr { + __u32 all[4]; + __be32 ip; + __be32 ip6[4]; + struct in_addr in; + struct in6_addr in6; +}; + +struct netpoll { + struct net_device *dev; + netdevice_tracker dev_tracker; + char dev_name[16]; + const char *name; + union inet_addr local_ip; + union inet_addr remote_ip; + bool ipv6; + u16 local_port; + u16 remote_port; + u8 remote_mac[6]; +}; + +enum qdisc_state_t { + __QDISC_STATE_SCHED = 0, + __QDISC_STATE_DEACTIVATED = 1, + __QDISC_STATE_MISSED = 2, + __QDISC_STATE_DRAINING = 3, +}; + +enum qdisc_state2_t { + __QDISC_STATE2_RUNNING = 0, +}; + +struct tcf_walker { + int stop; + int skip; + int count; + bool nonempty; + long unsigned int cookie; + int (*fn)(struct tcf_proto *, void *, struct tcf_walker *); +}; + +struct tc_skb_cb { + struct qdisc_skb_cb qdisc_cb; + u16 mru; + u8 post_ct: 1; + u8 post_ct_snat: 1; + u8 post_ct_dnat: 1; + u16 zone; +}; + +struct udp_tunnel_info { + short unsigned int type; + sa_family_t sa_family; + __be16 port; + u8 hw_priv; +}; + +struct udp_tunnel_nic_shared { + struct udp_tunnel_nic *udp_tunnel_nic_info; + struct list_head devices; +}; + +typedef int (*bpf_op_t)(struct net_device *, struct netdev_bpf *); + +struct dev_kfree_skb_cb { + enum skb_free_reason reason; +}; + +struct netdev_adjacent { + struct net_device *dev; + netdevice_tracker dev_tracker; + bool master; + bool ignore; + u16 ref_nr; + void *private; + struct list_head list; + struct callback_head rcu; +}; + +enum { + NDA_UNSPEC = 0, + NDA_DST = 1, + NDA_LLADDR = 2, + NDA_CACHEINFO = 3, + NDA_PROBES = 4, + NDA_VLAN = 5, + NDA_PORT = 6, + NDA_VNI = 7, + NDA_IFINDEX = 8, + NDA_MASTER = 9, + NDA_LINK_NETNSID = 10, + NDA_SRC_VNI = 11, + NDA_PROTOCOL = 12, + NDA_NH_ID = 13, + NDA_FDB_EXT_ATTRS = 14, + NDA_FLAGS_EXT = 15, + NDA_NDM_STATE_MASK = 16, + NDA_NDM_FLAGS_MASK = 17, + __NDA_MAX = 18, +}; + +struct nda_cacheinfo { + __u32 ndm_confirmed; + __u32 ndm_used; + __u32 ndm_updated; + __u32 ndm_refcnt; +}; + +struct ndt_stats { + __u64 ndts_allocs; + __u64 ndts_destroys; + __u64 ndts_hash_grows; + __u64 ndts_res_failed; + __u64 ndts_lookups; + __u64 ndts_hits; + __u64 ndts_rcv_probes_mcast; + __u64 ndts_rcv_probes_ucast; + __u64 ndts_periodic_gc_runs; + __u64 ndts_forced_gc_runs; + __u64 ndts_table_fulls; +}; + +enum { + NDTPA_UNSPEC = 0, + NDTPA_IFINDEX = 1, + NDTPA_REFCNT = 2, + NDTPA_REACHABLE_TIME = 3, + NDTPA_BASE_REACHABLE_TIME = 4, + NDTPA_RETRANS_TIME = 5, + NDTPA_GC_STALETIME = 6, + NDTPA_DELAY_PROBE_TIME = 7, + NDTPA_QUEUE_LEN = 8, + NDTPA_APP_PROBES = 9, + NDTPA_UCAST_PROBES = 10, + NDTPA_MCAST_PROBES = 11, + NDTPA_ANYCAST_DELAY = 12, + NDTPA_PROXY_DELAY = 13, + NDTPA_PROXY_QLEN = 14, + NDTPA_LOCKTIME = 15, + NDTPA_QUEUE_LENBYTES = 16, + NDTPA_MCAST_REPROBES = 17, + NDTPA_PAD = 18, + NDTPA_INTERVAL_PROBE_TIME_MS = 19, + __NDTPA_MAX = 20, +}; + +struct ndtmsg { + __u8 ndtm_family; + __u8 ndtm_pad1; + __u16 ndtm_pad2; +}; + +struct ndt_config { + __u16 ndtc_key_len; + __u16 ndtc_entry_size; + __u32 ndtc_entries; + __u32 ndtc_last_flush; + __u32 ndtc_last_rand; + __u32 ndtc_hash_rnd; + __u32 ndtc_hash_mask; + __u32 ndtc_hash_chain_gc; + __u32 ndtc_proxy_qlen; +}; + +enum { + NDTA_UNSPEC = 0, + NDTA_NAME = 1, + NDTA_THRESH1 = 2, + NDTA_THRESH2 = 3, + NDTA_THRESH3 = 4, + NDTA_CONFIG = 5, + NDTA_PARMS = 6, + NDTA_STATS = 7, + NDTA_GC_INTERVAL = 8, + NDTA_PAD = 9, + __NDTA_MAX = 10, +}; + +enum { + RTN_UNSPEC = 0, + RTN_UNICAST = 1, + RTN_LOCAL = 2, + RTN_BROADCAST = 3, + RTN_ANYCAST = 4, + RTN_MULTICAST = 5, + RTN_BLACKHOLE = 6, + RTN_UNREACHABLE = 7, + RTN_PROHIBIT = 8, + RTN_THROW = 9, + RTN_NAT = 10, + RTN_XRESOLVE = 11, + __RTN_MAX = 12, +}; + +enum { + NEIGH_ARP_TABLE = 0, + NEIGH_ND_TABLE = 1, + NEIGH_DN_TABLE = 2, + NEIGH_NR_TABLES = 3, + NEIGH_LINK_TABLE = 3, +}; + +struct neigh_seq_state { + struct seq_net_private p; + struct neigh_table *tbl; + struct neigh_hash_table *nht; + void * (*neigh_sub_iter)(struct neigh_seq_state *, struct neighbour *, loff_t *); + unsigned int bucket; + unsigned int flags; +}; + +struct neighbour_cb { + long unsigned int sched_next; + unsigned int flags; +}; + +enum netevent_notif_type { + NETEVENT_NEIGH_UPDATE = 1, + NETEVENT_REDIRECT = 2, + NETEVENT_DELAY_PROBE_TIME_UPDATE = 3, + NETEVENT_IPV4_MPATH_HASH_UPDATE = 4, + NETEVENT_IPV6_MPATH_HASH_UPDATE = 5, + NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE = 6, +}; + +struct neigh_dump_filter { + int master_idx; + int dev_idx; +}; + +struct neigh_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table neigh_vars[22]; +}; + +struct netlink_dump_control { + int (*start)(struct netlink_callback *); + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + void *data; + struct module *module; + u32 min_dump_alloc; +}; + +struct rtnl_link_stats { + __u32 rx_packets; + __u32 tx_packets; + __u32 rx_bytes; + __u32 tx_bytes; + __u32 rx_errors; + __u32 tx_errors; + __u32 rx_dropped; + __u32 tx_dropped; + __u32 multicast; + __u32 collisions; + __u32 rx_length_errors; + __u32 rx_over_errors; + __u32 rx_crc_errors; + __u32 rx_frame_errors; + __u32 rx_fifo_errors; + __u32 rx_missed_errors; + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + __u32 rx_compressed; + __u32 tx_compressed; + __u32 rx_nohandler; +}; + +struct rtnl_link_ifmap { + __u64 mem_start; + __u64 mem_end; + __u64 base_addr; + __u16 irq; + __u8 dma; + __u8 port; + long: 32; +}; + +enum { + IFLA_UNSPEC = 0, + IFLA_ADDRESS = 1, + IFLA_BROADCAST = 2, + IFLA_IFNAME = 3, + IFLA_MTU = 4, + IFLA_LINK = 5, + IFLA_QDISC = 6, + IFLA_STATS = 7, + IFLA_COST = 8, + IFLA_PRIORITY = 9, + IFLA_MASTER = 10, + IFLA_WIRELESS = 11, + IFLA_PROTINFO = 12, + IFLA_TXQLEN = 13, + IFLA_MAP = 14, + IFLA_WEIGHT = 15, + IFLA_OPERSTATE = 16, + IFLA_LINKMODE = 17, + IFLA_LINKINFO = 18, + IFLA_NET_NS_PID = 19, + IFLA_IFALIAS = 20, + IFLA_NUM_VF = 21, + IFLA_VFINFO_LIST = 22, + IFLA_STATS64 = 23, + IFLA_VF_PORTS = 24, + IFLA_PORT_SELF = 25, + IFLA_AF_SPEC = 26, + IFLA_GROUP = 27, + IFLA_NET_NS_FD = 28, + IFLA_EXT_MASK = 29, + IFLA_PROMISCUITY = 30, + IFLA_NUM_TX_QUEUES = 31, + IFLA_NUM_RX_QUEUES = 32, + IFLA_CARRIER = 33, + IFLA_PHYS_PORT_ID = 34, + IFLA_CARRIER_CHANGES = 35, + IFLA_PHYS_SWITCH_ID = 36, + IFLA_LINK_NETNSID = 37, + IFLA_PHYS_PORT_NAME = 38, + IFLA_PROTO_DOWN = 39, + IFLA_GSO_MAX_SEGS = 40, + IFLA_GSO_MAX_SIZE = 41, + IFLA_PAD = 42, + IFLA_XDP = 43, + IFLA_EVENT = 44, + IFLA_NEW_NETNSID = 45, + IFLA_IF_NETNSID = 46, + IFLA_TARGET_NETNSID = 46, + IFLA_CARRIER_UP_COUNT = 47, + IFLA_CARRIER_DOWN_COUNT = 48, + IFLA_NEW_IFINDEX = 49, + IFLA_MIN_MTU = 50, + IFLA_MAX_MTU = 51, + IFLA_PROP_LIST = 52, + IFLA_ALT_IFNAME = 53, + IFLA_PERM_ADDRESS = 54, + IFLA_PROTO_DOWN_REASON = 55, + IFLA_PARENT_DEV_NAME = 56, + IFLA_PARENT_DEV_BUS_NAME = 57, + IFLA_GRO_MAX_SIZE = 58, + IFLA_TSO_MAX_SIZE = 59, + IFLA_TSO_MAX_SEGS = 60, + IFLA_ALLMULTI = 61, + IFLA_DEVLINK_PORT = 62, + IFLA_GSO_IPV4_MAX_SIZE = 63, + IFLA_GRO_IPV4_MAX_SIZE = 64, + __IFLA_MAX = 65, +}; + +enum { + IFLA_PROTO_DOWN_REASON_UNSPEC = 0, + IFLA_PROTO_DOWN_REASON_MASK = 1, + IFLA_PROTO_DOWN_REASON_VALUE = 2, + __IFLA_PROTO_DOWN_REASON_CNT = 3, + IFLA_PROTO_DOWN_REASON_MAX = 2, +}; + +enum { + IFLA_BRPORT_UNSPEC = 0, + IFLA_BRPORT_STATE = 1, + IFLA_BRPORT_PRIORITY = 2, + IFLA_BRPORT_COST = 3, + IFLA_BRPORT_MODE = 4, + IFLA_BRPORT_GUARD = 5, + IFLA_BRPORT_PROTECT = 6, + IFLA_BRPORT_FAST_LEAVE = 7, + IFLA_BRPORT_LEARNING = 8, + IFLA_BRPORT_UNICAST_FLOOD = 9, + IFLA_BRPORT_PROXYARP = 10, + IFLA_BRPORT_LEARNING_SYNC = 11, + IFLA_BRPORT_PROXYARP_WIFI = 12, + IFLA_BRPORT_ROOT_ID = 13, + IFLA_BRPORT_BRIDGE_ID = 14, + IFLA_BRPORT_DESIGNATED_PORT = 15, + IFLA_BRPORT_DESIGNATED_COST = 16, + IFLA_BRPORT_ID = 17, + IFLA_BRPORT_NO = 18, + IFLA_BRPORT_TOPOLOGY_CHANGE_ACK = 19, + IFLA_BRPORT_CONFIG_PENDING = 20, + IFLA_BRPORT_MESSAGE_AGE_TIMER = 21, + IFLA_BRPORT_FORWARD_DELAY_TIMER = 22, + IFLA_BRPORT_HOLD_TIMER = 23, + IFLA_BRPORT_FLUSH = 24, + IFLA_BRPORT_MULTICAST_ROUTER = 25, + IFLA_BRPORT_PAD = 26, + IFLA_BRPORT_MCAST_FLOOD = 27, + IFLA_BRPORT_MCAST_TO_UCAST = 28, + IFLA_BRPORT_VLAN_TUNNEL = 29, + IFLA_BRPORT_BCAST_FLOOD = 30, + IFLA_BRPORT_GROUP_FWD_MASK = 31, + IFLA_BRPORT_NEIGH_SUPPRESS = 32, + IFLA_BRPORT_ISOLATED = 33, + IFLA_BRPORT_BACKUP_PORT = 34, + IFLA_BRPORT_MRP_RING_OPEN = 35, + IFLA_BRPORT_MRP_IN_OPEN = 36, + IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT = 37, + IFLA_BRPORT_MCAST_EHT_HOSTS_CNT = 38, + IFLA_BRPORT_LOCKED = 39, + IFLA_BRPORT_MAB = 40, + IFLA_BRPORT_MCAST_N_GROUPS = 41, + IFLA_BRPORT_MCAST_MAX_GROUPS = 42, + __IFLA_BRPORT_MAX = 43, +}; + +enum { + IFLA_INFO_UNSPEC = 0, + IFLA_INFO_KIND = 1, + IFLA_INFO_DATA = 2, + IFLA_INFO_XSTATS = 3, + IFLA_INFO_SLAVE_KIND = 4, + IFLA_INFO_SLAVE_DATA = 5, + __IFLA_INFO_MAX = 6, +}; + +enum { + IFLA_VF_INFO_UNSPEC = 0, + IFLA_VF_INFO = 1, + __IFLA_VF_INFO_MAX = 2, +}; + +enum { + IFLA_VF_UNSPEC = 0, + IFLA_VF_MAC = 1, + IFLA_VF_VLAN = 2, + IFLA_VF_TX_RATE = 3, + IFLA_VF_SPOOFCHK = 4, + IFLA_VF_LINK_STATE = 5, + IFLA_VF_RATE = 6, + IFLA_VF_RSS_QUERY_EN = 7, + IFLA_VF_STATS = 8, + IFLA_VF_TRUST = 9, + IFLA_VF_IB_NODE_GUID = 10, + IFLA_VF_IB_PORT_GUID = 11, + IFLA_VF_VLAN_LIST = 12, + IFLA_VF_BROADCAST = 13, + __IFLA_VF_MAX = 14, +}; + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; +}; + +struct ifla_vf_broadcast { + __u8 broadcast[32]; +}; + +struct ifla_vf_vlan { + __u32 vf; + __u32 vlan; + __u32 qos; +}; + +enum { + IFLA_VF_VLAN_INFO_UNSPEC = 0, + IFLA_VF_VLAN_INFO = 1, + __IFLA_VF_VLAN_INFO_MAX = 2, +}; + +struct ifla_vf_vlan_info { + __u32 vf; + __u32 vlan; + __u32 qos; + __be16 vlan_proto; +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; +}; + +struct ifla_vf_rate { + __u32 vf; + __u32 min_tx_rate; + __u32 max_tx_rate; +}; + +struct ifla_vf_spoofchk { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_link_state { + __u32 vf; + __u32 link_state; +}; + +struct ifla_vf_rss_query_en { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_STATS_RX_PACKETS = 0, + IFLA_VF_STATS_TX_PACKETS = 1, + IFLA_VF_STATS_RX_BYTES = 2, + IFLA_VF_STATS_TX_BYTES = 3, + IFLA_VF_STATS_BROADCAST = 4, + IFLA_VF_STATS_MULTICAST = 5, + IFLA_VF_STATS_PAD = 6, + IFLA_VF_STATS_RX_DROPPED = 7, + IFLA_VF_STATS_TX_DROPPED = 8, + __IFLA_VF_STATS_MAX = 9, +}; + +struct ifla_vf_trust { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_PORT_UNSPEC = 0, + IFLA_VF_PORT = 1, + __IFLA_VF_PORT_MAX = 2, +}; + +enum { + IFLA_PORT_UNSPEC = 0, + IFLA_PORT_VF = 1, + IFLA_PORT_PROFILE = 2, + IFLA_PORT_VSI_TYPE = 3, + IFLA_PORT_INSTANCE_UUID = 4, + IFLA_PORT_HOST_UUID = 5, + IFLA_PORT_REQUEST = 6, + IFLA_PORT_RESPONSE = 7, + __IFLA_PORT_MAX = 8, +}; + +struct if_stats_msg { + __u8 family; + __u8 pad1; + __u16 pad2; + __u32 ifindex; + __u32 filter_mask; +}; + +enum { + IFLA_STATS_UNSPEC = 0, + IFLA_STATS_LINK_64 = 1, + IFLA_STATS_LINK_XSTATS = 2, + IFLA_STATS_LINK_XSTATS_SLAVE = 3, + IFLA_STATS_LINK_OFFLOAD_XSTATS = 4, + IFLA_STATS_AF_SPEC = 5, + __IFLA_STATS_MAX = 6, +}; + +enum { + IFLA_STATS_GETSET_UNSPEC = 0, + IFLA_STATS_GET_FILTERS = 1, + IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS = 2, + __IFLA_STATS_GETSET_MAX = 3, +}; + +enum { + IFLA_OFFLOAD_XSTATS_UNSPEC = 0, + IFLA_OFFLOAD_XSTATS_CPU_HIT = 1, + IFLA_OFFLOAD_XSTATS_HW_S_INFO = 2, + IFLA_OFFLOAD_XSTATS_L3_STATS = 3, + __IFLA_OFFLOAD_XSTATS_MAX = 4, +}; + +enum { + IFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC = 0, + IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST = 1, + IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED = 2, + __IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX = 3, +}; + +enum { + XDP_ATTACHED_NONE = 0, + XDP_ATTACHED_DRV = 1, + XDP_ATTACHED_SKB = 2, + XDP_ATTACHED_HW = 3, + XDP_ATTACHED_MULTI = 4, +}; + +enum { + IFLA_XDP_UNSPEC = 0, + IFLA_XDP_FD = 1, + IFLA_XDP_ATTACHED = 2, + IFLA_XDP_FLAGS = 3, + IFLA_XDP_PROG_ID = 4, + IFLA_XDP_DRV_PROG_ID = 5, + IFLA_XDP_SKB_PROG_ID = 6, + IFLA_XDP_HW_PROG_ID = 7, + IFLA_XDP_EXPECTED_FD = 8, + __IFLA_XDP_MAX = 9, +}; + +enum { + IFLA_EVENT_NONE = 0, + IFLA_EVENT_REBOOT = 1, + IFLA_EVENT_FEATURES = 2, + IFLA_EVENT_BONDING_FAILOVER = 3, + IFLA_EVENT_NOTIFY_PEERS = 4, + IFLA_EVENT_IGMP_RESEND = 5, + IFLA_EVENT_BONDING_OPTIONS = 6, +}; + +enum { + IFLA_BRIDGE_FLAGS = 0, + IFLA_BRIDGE_MODE = 1, + IFLA_BRIDGE_VLAN_INFO = 2, + IFLA_BRIDGE_VLAN_TUNNEL_INFO = 3, + IFLA_BRIDGE_MRP = 4, + IFLA_BRIDGE_CFM = 5, + IFLA_BRIDGE_MST = 6, + __IFLA_BRIDGE_MAX = 7, +}; + +enum { + BR_MCAST_DIR_RX = 0, + BR_MCAST_DIR_TX = 1, + BR_MCAST_DIR_SIZE = 2, +}; + +enum rtattr_type_t { + RTA_UNSPEC = 0, + RTA_DST = 1, + RTA_SRC = 2, + RTA_IIF = 3, + RTA_OIF = 4, + RTA_GATEWAY = 5, + RTA_PRIORITY = 6, + RTA_PREFSRC = 7, + RTA_METRICS = 8, + RTA_MULTIPATH = 9, + RTA_PROTOINFO = 10, + RTA_FLOW = 11, + RTA_CACHEINFO = 12, + RTA_SESSION = 13, + RTA_MP_ALGO = 14, + RTA_TABLE = 15, + RTA_MARK = 16, + RTA_MFC_STATS = 17, + RTA_VIA = 18, + RTA_NEWDST = 19, + RTA_PREF = 20, + RTA_ENCAP_TYPE = 21, + RTA_ENCAP = 22, + RTA_EXPIRES = 23, + RTA_PAD = 24, + RTA_UID = 25, + RTA_TTL_PROPAGATE = 26, + RTA_IP_PROTO = 27, + RTA_SPORT = 28, + RTA_DPORT = 29, + RTA_NH_ID = 30, + __RTA_MAX = 31, +}; + +struct rta_cacheinfo { + __u32 rta_clntref; + __u32 rta_lastuse; + __s32 rta_expires; + __u32 rta_error; + __u32 rta_used; + __u32 rta_id; + __u32 rta_ts; + __u32 rta_tsage; +}; + +struct ifinfomsg { + unsigned char ifi_family; + unsigned char __ifi_pad; + short unsigned int ifi_type; + int ifi_index; + unsigned int ifi_flags; + unsigned int ifi_change; +}; + +enum rtnl_kinds { + RTNL_KIND_NEW = 0, + RTNL_KIND_DEL = 1, + RTNL_KIND_GET = 2, + RTNL_KIND_SET = 3, +}; + +struct rtnl_af_ops { + struct list_head list; + int family; + int (*fill_link_af)(struct sk_buff *, const struct net_device *, u32); + size_t (*get_link_af_size)(const struct net_device *, u32); + int (*validate_link_af)(const struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*set_link_af)(struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*fill_stats_af)(struct sk_buff *, const struct net_device *); + size_t (*get_stats_af_size)(const struct net_device *); +}; + +struct rtnl_link { + rtnl_doit_func doit; + rtnl_dumpit_func dumpit; + struct module *owner; + unsigned int flags; + struct callback_head rcu; +}; + +struct rtnl_newlink_tbs { + struct nlattr *tb[65]; + struct nlattr *attr[51]; + struct nlattr *slave_attr[43]; +}; + +struct rtnl_offload_xstats_request_used { + bool request; + bool used; +}; + +struct rtnl_stats_dump_filters { + u32 mask[6]; +}; + +enum { + IF_LINK_MODE_DEFAULT = 0, + IF_LINK_MODE_DORMANT = 1, + IF_LINK_MODE_TESTING = 2, +}; + +enum lw_bits { + LW_URGENT = 0, +}; + +enum { + BPF_F_RECOMPUTE_CSUM = 1, + BPF_F_INVALIDATE_HASH = 2, +}; + +enum { + BPF_F_HDR_FIELD_MASK = 15, +}; + +enum { + BPF_F_PSEUDO_HDR = 16, + BPF_F_MARK_MANGLED_0 = 32, + BPF_F_MARK_ENFORCE = 64, +}; + +enum { + BPF_F_INGRESS = 1, +}; + +enum { + BPF_F_TUNINFO_IPV6 = 1, +}; + +enum { + BPF_F_ZERO_CSUM_TX = 2, + BPF_F_DONT_FRAGMENT = 4, + BPF_F_SEQ_NUMBER = 8, + BPF_F_NO_TUNNEL_KEY = 16, +}; + +enum { + BPF_F_TUNINFO_FLAGS = 16, +}; + +enum { + BPF_CSUM_LEVEL_QUERY = 0, + BPF_CSUM_LEVEL_INC = 1, + BPF_CSUM_LEVEL_DEC = 2, + BPF_CSUM_LEVEL_RESET = 3, +}; + +enum { + BPF_F_ADJ_ROOM_FIXED_GSO = 1, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 2, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 4, + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 8, + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 16, + BPF_F_ADJ_ROOM_NO_CSUM_RESET = 32, + BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 64, + BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = 128, + BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = 256, +}; + +enum { + BPF_ADJ_ROOM_ENCAP_L2_MASK = 255, + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, +}; + +enum { + BPF_SK_LOOKUP_F_REPLACE = 1, + BPF_SK_LOOKUP_F_NO_REUSEPORT = 2, +}; + +enum bpf_adj_room_mode { + BPF_ADJ_ROOM_NET = 0, + BPF_ADJ_ROOM_MAC = 1, +}; + +enum bpf_hdr_start_off { + BPF_HDR_START_MAC = 0, + BPF_HDR_START_NET = 1, +}; + +enum bpf_lwt_encap_mode { + BPF_LWT_ENCAP_SEG6 = 0, + BPF_LWT_ENCAP_SEG6_INLINE = 1, + BPF_LWT_ENCAP_IP = 2, +}; + +enum { + BPF_SKB_TSTAMP_UNSPEC = 0, + BPF_SKB_TSTAMP_DELIVERY_MONO = 1, +}; + +struct bpf_tunnel_key { + __u32 tunnel_id; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; + union { + __u16 tunnel_ext; + __be16 tunnel_flags; + }; + __u32 tunnel_label; + union { + __u32 local_ipv4; + __u32 local_ipv6[4]; + }; +}; + +struct bpf_xfrm_state { + __u32 reqid; + __u32 spi; + __u16 family; + __u16 ext; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; +}; + +struct bpf_tcp_sock { + __u32 snd_cwnd; + __u32 srtt_us; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u64 bytes_received; + __u64 bytes_acked; + __u32 dsack_dups; + __u32 delivered; + __u32 delivered_ce; + __u32 icsk_retransmits; +}; + +struct bpf_sock_tuple { + union { + struct { + __be32 saddr; + __be32 daddr; + __be16 sport; + __be16 dport; + } ipv4; + struct { + __be32 saddr[4]; + __be32 daddr[4]; + __be16 sport; + __be16 dport; + } ipv6; + }; +}; + +struct bpf_xdp_sock { + __u32 queue_id; +}; + +enum { + BPF_SOCK_OPS_RTO_CB_FLAG = 1, + BPF_SOCK_OPS_RETRANS_CB_FLAG = 2, + BPF_SOCK_OPS_STATE_CB_FLAG = 4, + BPF_SOCK_OPS_RTT_CB_FLAG = 8, + BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = 16, + BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = 32, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = 64, + BPF_SOCK_OPS_ALL_CB_FLAGS = 127, +}; + +enum { + BPF_SOCK_OPS_VOID = 0, + BPF_SOCK_OPS_TIMEOUT_INIT = 1, + BPF_SOCK_OPS_RWND_INIT = 2, + BPF_SOCK_OPS_TCP_CONNECT_CB = 3, + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 4, + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 5, + BPF_SOCK_OPS_NEEDS_ECN = 6, + BPF_SOCK_OPS_BASE_RTT = 7, + BPF_SOCK_OPS_RTO_CB = 8, + BPF_SOCK_OPS_RETRANS_CB = 9, + BPF_SOCK_OPS_STATE_CB = 10, + BPF_SOCK_OPS_TCP_LISTEN_CB = 11, + BPF_SOCK_OPS_RTT_CB = 12, + BPF_SOCK_OPS_PARSE_HDR_OPT_CB = 13, + BPF_SOCK_OPS_HDR_OPT_LEN_CB = 14, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB = 15, +}; + +enum { + TCP_BPF_IW = 1001, + TCP_BPF_SNDCWND_CLAMP = 1002, + TCP_BPF_DELACK_MAX = 1003, + TCP_BPF_RTO_MIN = 1004, + TCP_BPF_SYN = 1005, + TCP_BPF_SYN_IP = 1006, + TCP_BPF_SYN_MAC = 1007, +}; + +enum { + BPF_LOAD_HDR_OPT_TCP_SYN = 1, +}; + +enum { + BPF_FIB_LOOKUP_DIRECT = 1, + BPF_FIB_LOOKUP_OUTPUT = 2, + BPF_FIB_LOOKUP_SKIP_NEIGH = 4, +}; + +enum { + BPF_FIB_LKUP_RET_SUCCESS = 0, + BPF_FIB_LKUP_RET_BLACKHOLE = 1, + BPF_FIB_LKUP_RET_UNREACHABLE = 2, + BPF_FIB_LKUP_RET_PROHIBIT = 3, + BPF_FIB_LKUP_RET_NOT_FWDED = 4, + BPF_FIB_LKUP_RET_FWD_DISABLED = 5, + BPF_FIB_LKUP_RET_UNSUPP_LWT = 6, + BPF_FIB_LKUP_RET_NO_NEIGH = 7, + BPF_FIB_LKUP_RET_FRAG_NEEDED = 8, +}; + +struct bpf_fib_lookup { + __u8 family; + __u8 l4_protocol; + __be16 sport; + __be16 dport; + union { + __u16 tot_len; + __u16 mtu_result; + }; + __u32 ifindex; + union { + __u8 tos; + __be32 flowinfo; + __u32 rt_metric; + }; + union { + __be32 ipv4_src; + __u32 ipv6_src[4]; + }; + union { + __be32 ipv4_dst; + __u32 ipv6_dst[4]; + }; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __u8 smac[6]; + __u8 dmac[6]; +}; + +struct bpf_redir_neigh { + __u32 nh_family; + union { + __be32 ipv4_nh; + __u32 ipv6_nh[4]; + }; +}; + +enum bpf_check_mtu_flags { + BPF_MTU_CHK_SEGS = 1, +}; + +enum bpf_check_mtu_ret { + BPF_MTU_CHK_RET_SUCCESS = 0, + BPF_MTU_CHK_RET_FRAG_NEEDED = 1, + BPF_MTU_CHK_RET_SEGS_TOOBIG = 2, +}; + +struct seg6_pernet_data { + struct mutex lock; + struct in6_addr *tun_src; + struct rhashtable hmac_infos; +}; + +enum rt_scope_t { + RT_SCOPE_UNIVERSE = 0, + RT_SCOPE_SITE = 200, + RT_SCOPE_LINK = 253, + RT_SCOPE_HOST = 254, + RT_SCOPE_NOWHERE = 255, +}; + +enum rt_class_t { + RT_TABLE_UNSPEC = 0, + RT_TABLE_COMPAT = 252, + RT_TABLE_DEFAULT = 253, + RT_TABLE_MAIN = 254, + RT_TABLE_LOCAL = 255, + RT_TABLE_MAX = 4294967295, +}; + +struct nl_info { + struct nlmsghdr *nlh; + struct net *nl_net; + u32 portid; + u8 skip_notify: 1; + u8 skip_notify_kernel: 1; +}; + +struct compat_sock_fprog { + u16 len; + compat_uptr_t filter; +}; + +struct inet_timewait_sock { + struct sock_common __tw_common; + __u32 tw_mark; + volatile unsigned char tw_substate; + unsigned char tw_rcv_wscale; + __be16 tw_sport; + unsigned int tw_transparent: 1; + unsigned int tw_flowlabel: 20; + unsigned int tw_pad: 3; + unsigned int tw_tos: 8; + u32 tw_txhash; + u32 tw_priority; + struct timer_list tw_timer; + struct inet_bind_bucket *tw_tb; + struct inet_bind2_bucket *tw_tb2; + struct hlist_node tw_bind2_node; +}; + +struct tcp_timewait_sock { + struct inet_timewait_sock tw_sk; + u32 tw_rcv_wnd; + u32 tw_ts_offset; + u32 tw_ts_recent; + u32 tw_last_oow_ack_time; + int tw_ts_recent_stamp; + u32 tw_tx_delay; + struct tcp_md5sig_key *tw_md5_key; + long: 32; +}; + +struct udp_sock { + struct inet_sock inet; + int pending; + unsigned int corkflag; + __u8 encap_type; + unsigned char no_check6_tx: 1; + unsigned char no_check6_rx: 1; + unsigned char encap_enabled: 1; + unsigned char gro_enabled: 1; + unsigned char accept_udp_l4: 1; + unsigned char accept_udp_fraglist: 1; + __u16 len; + __u16 gso_size; + __u16 pcslen; + __u16 pcrlen; + __u8 pcflag; + __u8 unused[3]; + int (*encap_rcv)(struct sock *, struct sk_buff *); + void (*encap_err_rcv)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + int (*encap_err_lookup)(struct sock *, struct sk_buff *); + void (*encap_destroy)(struct sock *); + struct sk_buff * (*gro_receive)(struct sock *, struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sock *, struct sk_buff *, int); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct sk_buff_head reader_queue; + int forward_deficit; + int forward_threshold; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct udp6_sock { + struct udp_sock udp; + struct ipv6_pinfo inet6; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct tcp6_sock { + struct tcp_sock tcp; + struct ipv6_pinfo inet6; +}; + +struct fib_result { + __be32 prefix; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + u32 tclassid; + struct fib_nh_common *nhc; + struct fib_info *fi; + struct fib_table *table; + struct hlist_head *fa_head; +}; + +struct fib6_result; + +struct fib6_config; + +struct ipv6_stub { + int (*ipv6_sock_mc_join)(struct sock *, int, const struct in6_addr *); + int (*ipv6_sock_mc_drop)(struct sock *, int, const struct in6_addr *); + struct dst_entry * (*ipv6_dst_lookup_flow)(struct net *, const struct sock *, struct flowi6 *, const struct in6_addr *); + int (*ipv6_route_input)(struct sk_buff *); + struct fib6_table * (*fib6_get_table)(struct net *, u32); + int (*fib6_lookup)(struct net *, int, struct flowi6 *, struct fib6_result *, int); + int (*fib6_table_lookup)(struct net *, struct fib6_table *, int, struct flowi6 *, struct fib6_result *, int); + void (*fib6_select_path)(const struct net *, struct fib6_result *, struct flowi6 *, int, bool, const struct sk_buff *, int); + u32 (*ip6_mtu_from_fib6)(const struct fib6_result *, const struct in6_addr *, const struct in6_addr *); + int (*fib6_nh_init)(struct net *, struct fib6_nh *, struct fib6_config *, gfp_t, struct netlink_ext_ack *); + void (*fib6_nh_release)(struct fib6_nh *); + void (*fib6_nh_release_dsts)(struct fib6_nh *); + void (*fib6_update_sernum)(struct net *, struct fib6_info *); + int (*ip6_del_rt)(struct net *, struct fib6_info *, bool); + void (*fib6_rt_update)(struct net *, struct fib6_info *, struct nl_info *); + void (*udpv6_encap_enable)(); + void (*ndisc_send_na)(struct net_device *, const struct in6_addr *, const struct in6_addr *, bool, bool, bool, bool); + void (*xfrm6_local_rxpmtu)(struct sk_buff *, u32); + int (*xfrm6_udp_encap_rcv)(struct sock *, struct sk_buff *); + int (*xfrm6_rcv_encap)(struct sk_buff *, int, __be32, int); + struct neigh_table *nd_tbl; + int (*ipv6_fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + struct net_device * (*ipv6_dev_find)(struct net *, const struct in6_addr *, struct net_device *); +}; + +struct fib6_result { + struct fib6_nh *nh; + struct fib6_info *f6i; + u32 fib6_flags; + u8 fib6_type; + struct rt6_info *rt6; +}; + +struct fib6_config { + u32 fc_table; + u32 fc_metric; + int fc_dst_len; + int fc_src_len; + int fc_ifindex; + u32 fc_flags; + u32 fc_protocol; + u16 fc_type; + u16 fc_delete_all_nh: 1; + u16 fc_ignore_dev_down: 1; + u16 __unused: 14; + u32 fc_nh_id; + struct in6_addr fc_dst; + struct in6_addr fc_src; + struct in6_addr fc_prefsrc; + struct in6_addr fc_gateway; + long unsigned int fc_expires; + struct nlattr *fc_mx; + int fc_mx_len; + int fc_mp_len; + struct nlattr *fc_mp; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; + bool fc_is_fdb; +}; + +struct ipv6_bpf_stub { + int (*inet6_bind)(struct sock *, struct sockaddr *, int, u32); + struct sock * (*udp6_lib_lookup)(struct net *, const struct in6_addr *, __be16, const struct in6_addr *, __be16, int, int, struct udp_table *, struct sk_buff *); + int (*ipv6_setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*ipv6_getsockopt)(struct sock *, int, int, sockptr_t, sockptr_t); +}; + +enum { + INET_ECN_NOT_ECT = 0, + INET_ECN_ECT_1 = 1, + INET_ECN_ECT_0 = 2, + INET_ECN_CE = 3, + INET_ECN_MASK = 3, +}; + +struct mptcp_sock {}; + +struct tcp_skb_cb { + __u32 seq; + __u32 end_seq; + union { + __u32 tcp_tw_isn; + struct { + u16 tcp_gso_segs; + u16 tcp_gso_size; + }; + }; + __u8 tcp_flags; + __u8 sacked; + __u8 ip_dsfield; + __u8 txstamp_ack: 1; + __u8 eor: 1; + __u8 has_rxtstamp: 1; + __u8 unused: 5; + __u32 ack_seq; + long: 32; + union { + struct { + __u32 is_app_limited: 1; + __u32 delivered_ce: 20; + __u32 unused: 11; + __u32 delivered; + u64 first_tx_mstamp; + u64 delivered_mstamp; + } tx; + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + }; +}; + +struct strp_msg { + int full_len; + int offset; +}; + +struct _strp_msg { + struct strp_msg strp; + int accum_len; +}; + +struct tls_msg { + u8 control; +}; + +struct sk_skb_cb { + unsigned char data[20]; + unsigned char pad[4]; + struct _strp_msg strp; + struct tls_msg tls; + u64 temp_reg; +}; + +struct xdp_umem { + void *addrs; + long: 32; + u64 size; + u32 headroom; + u32 chunk_size; + u32 chunks; + u32 npgs; + struct user_struct *user; + refcount_t users; + u8 flags; + bool zc; + struct page **pgs; + int id; + struct list_head xsk_dma_list; + struct work_struct work; + long: 32; +}; + +struct xsk_queue; + +struct xdp_sock { + struct sock sk; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct xsk_queue *rx; + struct net_device *dev; + struct xdp_umem *umem; + struct list_head flush_node; + struct xsk_buff_pool *pool; + u16 queue_id; + bool zc; + enum { + XSK_READY = 0, + XSK_BOUND = 1, + XSK_UNBOUND = 2, + } state; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct xsk_queue *tx; + struct list_head tx_list; + spinlock_t rx_lock; + u64 rx_dropped; + u64 rx_queue_full; + struct list_head map_list; + spinlock_t map_list_lock; + struct mutex mutex; + struct xsk_queue *fq_tmp; + struct xsk_queue *cq_tmp; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct ipv6_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u8 first_segment; + __u8 flags; + __u16 tag; + struct in6_addr segments[0]; +}; + +enum { + SEG6_LOCAL_ACTION_UNSPEC = 0, + SEG6_LOCAL_ACTION_END = 1, + SEG6_LOCAL_ACTION_END_X = 2, + SEG6_LOCAL_ACTION_END_T = 3, + SEG6_LOCAL_ACTION_END_DX2 = 4, + SEG6_LOCAL_ACTION_END_DX6 = 5, + SEG6_LOCAL_ACTION_END_DX4 = 6, + SEG6_LOCAL_ACTION_END_DT6 = 7, + SEG6_LOCAL_ACTION_END_DT4 = 8, + SEG6_LOCAL_ACTION_END_B6 = 9, + SEG6_LOCAL_ACTION_END_B6_ENCAP = 10, + SEG6_LOCAL_ACTION_END_BM = 11, + SEG6_LOCAL_ACTION_END_S = 12, + SEG6_LOCAL_ACTION_END_AS = 13, + SEG6_LOCAL_ACTION_END_AM = 14, + SEG6_LOCAL_ACTION_END_BPF = 15, + SEG6_LOCAL_ACTION_END_DT46 = 16, + __SEG6_LOCAL_ACTION_MAX = 17, +}; + +struct seg6_bpf_srh_state { + struct ipv6_sr_hdr *srh; + u16 hdrlen; + bool valid; +}; + +struct tls_crypto_info { + __u16 version; + __u16 cipher_type; +}; + +struct tls12_crypto_info_aes_gcm_128 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_aes_gcm_256 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[32]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_chacha20_poly1305 { + struct tls_crypto_info info; + unsigned char iv[12]; + unsigned char key[32]; + unsigned char salt[0]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_gcm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_ccm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls_strparser { + struct sock *sk; + u32 mark: 8; + u32 stopped: 1; + u32 copy_mode: 1; + u32 msg_ready: 1; + struct strp_msg stm; + struct sk_buff *anchor; + struct work_struct work; +}; + +struct tls_sw_context_rx { + struct crypto_aead *aead_recv; + struct crypto_wait async_wait; + struct sk_buff_head rx_list; + void (*saved_data_ready)(struct sock *); + u8 reader_present; + u8 async_capable: 1; + u8 zc_capable: 1; + u8 reader_contended: 1; + struct tls_strparser strp; + atomic_t decrypt_pending; + spinlock_t decrypt_compl_lock; + struct sk_buff_head async_hold; + struct wait_queue_head wq; +}; + +struct tls_prot_info { + u16 version; + u16 cipher_type; + u16 prepend_size; + u16 tag_size; + u16 overhead_size; + u16 iv_size; + u16 salt_size; + u16 rec_seq_size; + u16 aad_size; + u16 tail_size; +}; + +struct cipher_context { + char *iv; + char *rec_seq; +}; + +union tls_crypto_context { + struct tls_crypto_info info; + union { + struct tls12_crypto_info_aes_gcm_128 aes_gcm_128; + struct tls12_crypto_info_aes_gcm_256 aes_gcm_256; + struct tls12_crypto_info_chacha20_poly1305 chacha20_poly1305; + struct tls12_crypto_info_sm4_gcm sm4_gcm; + struct tls12_crypto_info_sm4_ccm sm4_ccm; + }; +}; + +struct tls_context { + struct tls_prot_info prot_info; + u8 tx_conf: 3; + u8 rx_conf: 3; + u8 zerocopy_sendfile: 1; + u8 rx_no_pad: 1; + int (*push_pending_record)(struct sock *, int); + void (*sk_write_space)(struct sock *); + void *priv_ctx_tx; + void *priv_ctx_rx; + struct net_device *netdev; + struct cipher_context tx; + struct cipher_context rx; + struct scatterlist *partially_sent_record; + u16 partially_sent_offset; + bool in_tcp_sendpages; + bool pending_open_record_frags; + struct mutex tx_lock; + long unsigned int flags; + struct proto *sk_proto; + struct sock *sk; + void (*sk_destruct)(struct sock *); + union tls_crypto_context crypto_send; + union tls_crypto_context crypto_recv; + struct list_head list; + refcount_t refcount; + struct callback_head rcu; +}; + +struct nf_conn___init { + struct nf_conn ct; +}; + +typedef u64 (*btf_bpf_skb_get_pay_offset)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_get_nlattr)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_get_nlattr_nest)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_load_helper_8)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_8_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_16)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_16_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_32)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_32_no_cache)(const struct sk_buff *, int); + +struct bpf_scratchpad { + union { + __be32 diff[128]; + u8 buff[512]; + }; +}; + +typedef u64 (*btf_bpf_skb_store_bytes)(struct sk_buff *, u32, const void *, u32, u64); + +typedef u64 (*btf_bpf_skb_load_bytes)(const struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_flow_dissector_load_bytes)(const struct bpf_flow_dissector *, u32, void *, u32); + +typedef u64 (*btf_bpf_skb_load_bytes_relative)(const struct sk_buff *, u32, void *, u32, u32); + +typedef u64 (*btf_bpf_skb_pull_data)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_sk_fullsock)(struct sock *); + +typedef u64 (*btf_sk_skb_pull_data)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_l3_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_l4_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_csum_diff)(__be32 *, u32, __be32 *, u32, __wsum); + +typedef u64 (*btf_bpf_csum_update)(struct sk_buff *, __wsum); + +typedef u64 (*btf_bpf_csum_level)(struct sk_buff *, u64); + +enum { + BPF_F_NEIGH = 2, + BPF_F_PEER = 4, + BPF_F_NEXTHOP = 8, +}; + +typedef u64 (*btf_bpf_clone_redirect)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_redirect)(u32, u64); + +typedef u64 (*btf_bpf_redirect_peer)(u32, u64); + +typedef u64 (*btf_bpf_redirect_neigh)(u32, struct bpf_redir_neigh *, int, u64); + +typedef u64 (*btf_bpf_msg_apply_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_cork_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_pull_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_push_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_pop_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_get_cgroup_classid_curr)(); + +typedef u64 (*btf_bpf_skb_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_route_realm)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_hash_recalc)(struct sk_buff *); + +typedef u64 (*btf_bpf_set_hash_invalid)(struct sk_buff *); + +typedef u64 (*btf_bpf_set_hash)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_skb_vlan_push)(struct sk_buff *, __be16, u16); + +typedef u64 (*btf_bpf_skb_vlan_pop)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_change_proto)(struct sk_buff *, __be16, u64); + +typedef u64 (*btf_bpf_skb_change_type)(struct sk_buff *, u32); + +typedef u64 (*btf_sk_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_bpf_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_bpf_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_xdp_get_buff_len)(struct xdp_buff *); + +typedef u64 (*btf_bpf_xdp_adjust_head)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_load_bytes)(struct xdp_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_xdp_store_bytes)(struct xdp_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_xdp_adjust_tail)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_adjust_meta)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_redirect)(u32, u64); + +typedef u64 (*btf_bpf_xdp_redirect_map)(struct bpf_map *, u64, u64); + +typedef u64 (*btf_bpf_skb_event_output)(struct sk_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_skb_get_tunnel_key)(struct sk_buff *, struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_get_tunnel_opt)(struct sk_buff *, u8 *, u32); + +typedef u64 (*btf_bpf_skb_set_tunnel_key)(struct sk_buff *, const struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_set_tunnel_opt)(struct sk_buff *, const u8 *, u32); + +typedef u64 (*btf_bpf_skb_under_cgroup)(struct sk_buff *, struct bpf_map *, u32); + +typedef u64 (*btf_bpf_skb_cgroup_id)(const struct sk_buff *); + +typedef u64 (*btf_bpf_skb_ancestor_cgroup_id)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_sk_cgroup_id)(struct sock *); + +typedef u64 (*btf_bpf_sk_ancestor_cgroup_id)(struct sock *, int); + +typedef u64 (*btf_bpf_xdp_event_output)(struct xdp_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_socket_cookie)(struct sk_buff *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_ptr_cookie)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sk_msg)(struct sk_msg *); + +typedef u64 (*btf_bpf_get_socket_uid)(struct sk_buff *); + +typedef u64 (*btf_bpf_sk_setsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sk_getsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_unlocked_sk_setsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_unlocked_sk_getsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_setsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_getsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_setsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_getsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops_kern *, int); + +typedef u64 (*btf_bpf_bind)(struct bpf_sock_addr_kern *, struct sockaddr *, int); + +typedef u64 (*btf_bpf_skb_get_xfrm_state)(struct sk_buff *, u32, struct bpf_xfrm_state *, u32, u64); + +typedef u64 (*btf_bpf_xdp_fib_lookup)(struct xdp_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_skb_fib_lookup)(struct sk_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_skb_check_mtu)(struct sk_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_xdp_check_mtu)(struct xdp_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_lwt_in_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_xmit_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_store_bytes)(struct sk_buff *, u32, const void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_action)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_adjust_srh)(struct sk_buff *, u32, s32); + +typedef u64 (*btf_bpf_skc_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_lookup_udp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_release)(struct sock *); + +typedef u64 (*btf_bpf_xdp_sk_lookup_udp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_skc_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_sk_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_sock_addr_skc_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_udp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_listener_sock)(struct sock *); + +typedef u64 (*btf_bpf_skb_ecn_set_ce)(struct sk_buff *); + +typedef u64 (*btf_bpf_tcp_check_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_gen_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_sk_assign)(struct sk_buff *, struct sock *, u64); + +typedef u64 (*btf_bpf_sock_ops_load_hdr_opt)(struct bpf_sock_ops_kern *, void *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_store_hdr_opt)(struct bpf_sock_ops_kern *, const void *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_reserve_hdr_opt)(struct bpf_sock_ops_kern *, u32, u64); + +typedef u64 (*btf_bpf_skb_set_tstamp)(struct sk_buff *, u64, u32); + +typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *, struct tcphdr *); + +typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *); + +typedef u64 (*btf_sk_select_reuseport)(struct sk_reuseport_kern *, struct bpf_map *, void *, u32); + +typedef u64 (*btf_sk_reuseport_load_bytes)(const struct sk_reuseport_kern *, u32, void *, u32); + +typedef u64 (*btf_sk_reuseport_load_bytes_relative)(const struct sk_reuseport_kern *, u32, void *, u32, u32); + +typedef u64 (*btf_bpf_sk_lookup_assign)(struct bpf_sk_lookup_kern *, struct sock *, u64); + +typedef u64 (*btf_bpf_skc_to_tcp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_timewait_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_request_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_udp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_unix_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_mptcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_sock_from_file)(struct file *); + +struct bpf_cpu_map_entry; + +struct bpf_dtab_netdev; + +struct unix_sock; + +struct sock_diag_req { + __u8 sdiag_family; + __u8 sdiag_protocol; +}; + +struct sock_diag_handler { + __u8 family; + int (*dump)(struct sk_buff *, struct nlmsghdr *); + int (*get_info)(struct sk_buff *, struct sock *); + int (*destroy)(struct sk_buff *, struct nlmsghdr *); +}; + +struct broadcast_sk { + struct sock *sk; + struct work_struct work; +}; + +struct hwtstamp_config { + int flags; + int tx_type; + int rx_filter; +}; + +enum hwtstamp_flags { + HWTSTAMP_FLAG_BONDED_PHC_INDEX = 1, + HWTSTAMP_FLAG_LAST = 1, + HWTSTAMP_FLAG_MASK = 1, +}; + +enum hwtstamp_tx_types { + HWTSTAMP_TX_OFF = 0, + HWTSTAMP_TX_ON = 1, + HWTSTAMP_TX_ONESTEP_SYNC = 2, + HWTSTAMP_TX_ONESTEP_P2P = 3, + __HWTSTAMP_TX_CNT = 4, +}; + +enum hwtstamp_rx_filters { + HWTSTAMP_FILTER_NONE = 0, + HWTSTAMP_FILTER_ALL = 1, + HWTSTAMP_FILTER_SOME = 2, + HWTSTAMP_FILTER_PTP_V1_L4_EVENT = 3, + HWTSTAMP_FILTER_PTP_V1_L4_SYNC = 4, + HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ = 5, + HWTSTAMP_FILTER_PTP_V2_L4_EVENT = 6, + HWTSTAMP_FILTER_PTP_V2_L4_SYNC = 7, + HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ = 8, + HWTSTAMP_FILTER_PTP_V2_L2_EVENT = 9, + HWTSTAMP_FILTER_PTP_V2_L2_SYNC = 10, + HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ = 11, + HWTSTAMP_FILTER_PTP_V2_EVENT = 12, + HWTSTAMP_FILTER_PTP_V2_SYNC = 13, + HWTSTAMP_FILTER_PTP_V2_DELAY_REQ = 14, + HWTSTAMP_FILTER_NTP_ALL = 15, + __HWTSTAMP_FILTER_CNT = 16, +}; + +struct compat_ifconf { + compat_int_t ifc_len; + compat_caddr_t ifcbuf; +}; + +struct tso_t { + int next_frag_idx; + int size; + void *data; + u16 ip_id; + u8 tlen; + bool ipv6; + u32 tcp_seq; +}; + +struct fib_notifier_info { + int family; + struct netlink_ext_ack *extack; +}; + +enum fib_event_type { + FIB_EVENT_ENTRY_REPLACE = 0, + FIB_EVENT_ENTRY_APPEND = 1, + FIB_EVENT_ENTRY_ADD = 2, + FIB_EVENT_ENTRY_DEL = 3, + FIB_EVENT_RULE_ADD = 4, + FIB_EVENT_RULE_DEL = 5, + FIB_EVENT_NH_ADD = 6, + FIB_EVENT_NH_DEL = 7, + FIB_EVENT_VIF_ADD = 8, + FIB_EVENT_VIF_DEL = 9, +}; + +struct fib_notifier_net { + struct list_head fib_notifier_ops; + struct atomic_notifier_head fib_chain; +}; + +struct xdp_frame_bulk { + int count; + void *xa; + void *q[16]; +}; + +struct xdp_attachment_info { + struct bpf_prog *prog; + u32 flags; +}; + +struct xdp_buff_xsk; + +struct xdp_desc; + +struct xsk_buff_pool { + struct device *dev; + struct net_device *netdev; + struct list_head xsk_tx_list; + spinlock_t xsk_tx_list_lock; + refcount_t users; + struct xdp_umem *umem; + struct work_struct work; + struct list_head free_list; + u32 heads_cnt; + u16 queue_id; + long: 32; + struct xsk_queue *fq; + struct xsk_queue *cq; + dma_addr_t *dma_pages; + struct xdp_buff_xsk *heads; + struct xdp_desc *tx_descs; + long: 32; + u64 chunk_mask; + u64 addrs_cnt; + u32 free_list_cnt; + u32 dma_pages_cnt; + u32 free_heads_cnt; + u32 headroom; + u32 chunk_size; + u32 chunk_shift; + u32 frame_len; + u8 cached_need_wakeup; + bool uses_need_wakeup; + bool dma_need_sync; + bool unaligned; + void *addrs; + spinlock_t cq_lock; + struct xdp_buff_xsk *free_heads[0]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct xdp_desc { + __u64 addr; + __u32 len; + __u32 options; +}; + +struct xdp_buff_xsk { + struct xdp_buff xdp; + u8 cb[24]; + dma_addr_t dma; + dma_addr_t frame_dma; + struct xsk_buff_pool *pool; + long: 32; + u64 orig_addr; + struct list_head free_list_node; +}; + +struct flow_dissector_key_ports_range { + union { + struct flow_dissector_key_ports tp; + struct { + struct flow_dissector_key_ports tp_min; + struct flow_dissector_key_ports tp_max; + }; + }; +}; + +struct flow_match_meta { + struct flow_dissector_key_meta *key; + struct flow_dissector_key_meta *mask; +}; + +struct flow_match_basic { + struct flow_dissector_key_basic *key; + struct flow_dissector_key_basic *mask; +}; + +struct flow_match_control { + struct flow_dissector_key_control *key; + struct flow_dissector_key_control *mask; +}; + +struct flow_match_eth_addrs { + struct flow_dissector_key_eth_addrs *key; + struct flow_dissector_key_eth_addrs *mask; +}; + +struct flow_match_vlan { + struct flow_dissector_key_vlan *key; + struct flow_dissector_key_vlan *mask; +}; + +struct flow_match_arp { + struct flow_dissector_key_arp *key; + struct flow_dissector_key_arp *mask; +}; + +struct flow_match_ipv4_addrs { + struct flow_dissector_key_ipv4_addrs *key; + struct flow_dissector_key_ipv4_addrs *mask; +}; + +struct flow_match_ipv6_addrs { + struct flow_dissector_key_ipv6_addrs *key; + struct flow_dissector_key_ipv6_addrs *mask; +}; + +struct flow_match_ip { + struct flow_dissector_key_ip *key; + struct flow_dissector_key_ip *mask; +}; + +struct flow_match_ports { + struct flow_dissector_key_ports *key; + struct flow_dissector_key_ports *mask; +}; + +struct flow_match_ports_range { + struct flow_dissector_key_ports_range *key; + struct flow_dissector_key_ports_range *mask; +}; + +struct flow_match_icmp { + struct flow_dissector_key_icmp *key; + struct flow_dissector_key_icmp *mask; +}; + +struct flow_match_tcp { + struct flow_dissector_key_tcp *key; + struct flow_dissector_key_tcp *mask; +}; + +struct flow_match_mpls { + struct flow_dissector_key_mpls *key; + struct flow_dissector_key_mpls *mask; +}; + +struct flow_match_enc_keyid { + struct flow_dissector_key_keyid *key; + struct flow_dissector_key_keyid *mask; +}; + +struct flow_match_enc_opts { + struct flow_dissector_key_enc_opts *key; + struct flow_dissector_key_enc_opts *mask; +}; + +struct flow_match_ct { + struct flow_dissector_key_ct *key; + struct flow_dissector_key_ct *mask; +}; + +struct flow_match_pppoe { + struct flow_dissector_key_pppoe *key; + struct flow_dissector_key_pppoe *mask; +}; + +struct flow_match_l2tpv3 { + struct flow_dissector_key_l2tpv3 *key; + struct flow_dissector_key_l2tpv3 *mask; +}; + +enum flow_block_command { + FLOW_BLOCK_BIND = 0, + FLOW_BLOCK_UNBIND = 1, +}; + +enum flow_block_binder_type { + FLOW_BLOCK_BINDER_TYPE_UNSPEC = 0, + FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS = 1, + FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS = 2, + FLOW_BLOCK_BINDER_TYPE_RED_EARLY_DROP = 3, + FLOW_BLOCK_BINDER_TYPE_RED_MARK = 4, +}; + +struct flow_block_offload { + enum flow_block_command command; + enum flow_block_binder_type binder_type; + bool block_shared; + bool unlocked_driver_cb; + struct net *net; + struct flow_block *block; + struct list_head cb_list; + struct list_head *driver_block_list; + struct netlink_ext_ack *extack; + struct Qdisc *sch; + struct list_head *cb_list_head; +}; + +struct flow_block_cb; + +struct flow_block_indr { + struct list_head list; + struct net_device *dev; + struct Qdisc *sch; + enum flow_block_binder_type binder_type; + void *data; + void *cb_priv; + void (*cleanup)(struct flow_block_cb *); +}; + +struct flow_block_cb { + struct list_head driver_list; + struct list_head list; + flow_setup_cb_t *cb; + void *cb_ident; + void *cb_priv; + void (*release)(void *); + struct flow_block_indr indr; + unsigned int refcnt; +}; + +enum offload_act_command { + FLOW_ACT_REPLACE = 0, + FLOW_ACT_DESTROY = 1, + FLOW_ACT_STATS = 2, +}; + +struct flow_offload_action { + struct netlink_ext_ack *extack; + enum offload_act_command command; + enum flow_action_id id; + u32 index; + struct flow_stats stats; + struct flow_action action; +}; + +typedef int flow_indr_block_bind_cb_t(struct net_device *, struct Qdisc *, void *, enum tc_setup_type, void *, void *, void (*)(struct flow_block_cb *)); + +struct flow_indr_dev { + struct list_head list; + flow_indr_block_bind_cb_t *cb; + void *cb_priv; + refcount_t refcnt; +}; + +struct flow_indir_dev_info { + void *data; + struct net_device *dev; + struct Qdisc *sch; + enum tc_setup_type type; + void (*cleanup)(struct flow_block_cb *); + struct list_head list; + enum flow_block_command command; + enum flow_block_binder_type binder_type; + struct list_head *cb_list; +}; + +enum gro_result { + GRO_MERGED = 0, + GRO_MERGED_FREE = 1, + GRO_HELD = 2, + GRO_NORMAL = 3, + GRO_CONSUMED = 4, +}; + +typedef enum gro_result gro_result_t; + +struct offload_callbacks { + struct sk_buff * (*gso_segment)(struct sk_buff *, netdev_features_t); + struct sk_buff * (*gro_receive)(struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sk_buff *, int); +}; + +struct packet_offload { + __be16 type; + u16 priority; + struct offload_callbacks callbacks; + struct list_head list; +}; + +struct napi_gro_cb { + void *frag0; + unsigned int frag0_len; + int data_offset; + u16 flush; + u16 flush_id; + u16 count; + u16 proto; + long unsigned int age; + union { + struct { + u16 gro_remcsum_start; + u8 same_flow: 1; + u8 encap_mark: 1; + u8 csum_valid: 1; + u8 csum_cnt: 3; + u8 free: 2; + u8 is_ipv6: 1; + u8 is_fou: 1; + u8 is_atomic: 1; + u8 recursion_counter: 4; + u8 is_flist: 1; + }; + struct { + u16 gro_remcsum_start; + u8 same_flow: 1; + u8 encap_mark: 1; + u8 csum_valid: 1; + u8 csum_cnt: 3; + u8 free: 2; + u8 is_ipv6: 1; + u8 is_fou: 1; + u8 is_atomic: 1; + u8 recursion_counter: 4; + u8 is_flist: 1; + } zeroed; + }; + __wsum csum; + struct sk_buff *last; +}; + +enum { + NETDEV_A_DEV_IFINDEX = 1, + NETDEV_A_DEV_PAD = 2, + NETDEV_A_DEV_XDP_FEATURES = 3, + __NETDEV_A_DEV_MAX = 4, + NETDEV_A_DEV_MAX = 3, +}; + +enum { + NETDEV_CMD_DEV_GET = 1, + NETDEV_CMD_DEV_ADD_NTF = 2, + NETDEV_CMD_DEV_DEL_NTF = 3, + NETDEV_CMD_DEV_CHANGE_NTF = 4, + __NETDEV_CMD_MAX = 5, + NETDEV_CMD_MAX = 4, +}; + +enum { + NETDEV_NLGRP_MGMT = 0, +}; + +struct rx_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_rx_queue *, char *); + ssize_t (*store)(struct netdev_rx_queue *, const char *, size_t); +}; + +struct netdev_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_queue *, char *); + ssize_t (*store)(struct netdev_queue *, const char *, size_t); +}; + +struct page_pool_stats { + struct page_pool_alloc_stats alloc_stats; + struct page_pool_recycle_stats recycle_stats; +}; + +struct inet6_ifaddr { + struct in6_addr addr; + __u32 prefix_len; + __u32 rt_priority; + __u32 valid_lft; + __u32 prefered_lft; + refcount_t refcnt; + spinlock_t lock; + int state; + __u32 flags; + __u8 dad_probes; + __u8 stable_privacy_retry; + __u16 scope; + long: 32; + __u64 dad_nonce; + long unsigned int cstamp; + long unsigned int tstamp; + struct delayed_work dad_work; + struct inet6_dev *idev; + struct fib6_info *rt; + struct hlist_node addr_lst; + struct list_head if_list; + struct list_head if_list_aux; + struct list_head tmp_list; + struct inet6_ifaddr *ifpub; + int regen_count; + bool tokenized; + u8 ifa_proto; + struct callback_head rcu; + struct in6_addr peer_addr; +}; + +struct fib_rule_uid_range { + __u32 start; + __u32 end; +}; + +enum { + FRA_UNSPEC = 0, + FRA_DST = 1, + FRA_SRC = 2, + FRA_IIFNAME = 3, + FRA_GOTO = 4, + FRA_UNUSED2 = 5, + FRA_PRIORITY = 6, + FRA_UNUSED3 = 7, + FRA_UNUSED4 = 8, + FRA_UNUSED5 = 9, + FRA_FWMARK = 10, + FRA_FLOW = 11, + FRA_TUN_ID = 12, + FRA_SUPPRESS_IFGROUP = 13, + FRA_SUPPRESS_PREFIXLEN = 14, + FRA_TABLE = 15, + FRA_FWMASK = 16, + FRA_OIFNAME = 17, + FRA_PAD = 18, + FRA_L3MDEV = 19, + FRA_UID_RANGE = 20, + FRA_PROTOCOL = 21, + FRA_IP_PROTO = 22, + FRA_SPORT_RANGE = 23, + FRA_DPORT_RANGE = 24, + __FRA_MAX = 25, +}; + +enum { + FR_ACT_UNSPEC = 0, + FR_ACT_TO_TBL = 1, + FR_ACT_GOTO = 2, + FR_ACT_NOP = 3, + FR_ACT_RES3 = 4, + FR_ACT_RES4 = 5, + FR_ACT_BLACKHOLE = 6, + FR_ACT_UNREACHABLE = 7, + FR_ACT_PROHIBIT = 8, + __FR_ACT_MAX = 9, +}; + +struct fib_rule_notifier_info { + struct fib_notifier_info info; + struct fib_rule *rule; +}; + +struct trace_event_raw_kfree_skb { + struct trace_entry ent; + void *skbaddr; + void *location; + short unsigned int protocol; + enum skb_drop_reason reason; + char __data[0]; +}; + +struct trace_event_raw_consume_skb { + struct trace_entry ent; + void *skbaddr; + char __data[0]; +}; + +struct trace_event_raw_skb_copy_datagram_iovec { + struct trace_entry ent; + const void *skbaddr; + int len; + char __data[0]; +}; + +struct trace_event_data_offsets_kfree_skb {}; + +struct trace_event_data_offsets_consume_skb {}; + +struct trace_event_data_offsets_skb_copy_datagram_iovec {}; + +typedef void (*btf_trace_kfree_skb)(void *, struct sk_buff *, void *, enum skb_drop_reason); + +typedef void (*btf_trace_consume_skb)(void *, struct sk_buff *); + +typedef void (*btf_trace_skb_copy_datagram_iovec)(void *, const struct sk_buff *, int); + +struct trace_event_raw_net_dev_start_xmit { + struct trace_entry ent; + u32 __data_loc_name; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + unsigned int len; + unsigned int data_len; + int network_offset; + bool transport_offset_valid; + int transport_offset; + u8 tx_flags; + u16 gso_size; + u16 gso_segs; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + int rc; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit_timeout { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_driver; + int queue_index; + char __data[0]; +}; + +struct trace_event_raw_net_dev_template { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_verbose_template { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int napi_id; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + u32 hash; + bool l4_hash; + unsigned int len; + unsigned int data_len; + unsigned int truesize; + bool mac_header_valid; + int mac_header; + unsigned char nr_frags; + u16 gso_size; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_exit_template { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_net_dev_start_xmit { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_xmit { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_xmit_timeout { + u32 name; + u32 driver; +}; + +struct trace_event_data_offsets_net_dev_template { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_rx_verbose_template { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_rx_exit_template {}; + +typedef void (*btf_trace_net_dev_start_xmit)(void *, const struct sk_buff *, const struct net_device *); + +typedef void (*btf_trace_net_dev_xmit)(void *, struct sk_buff *, int, struct net_device *, unsigned int); + +typedef void (*btf_trace_net_dev_xmit_timeout)(void *, struct net_device *, int); + +typedef void (*btf_trace_net_dev_queue)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_rx)(void *, struct sk_buff *); + +typedef void (*btf_trace_napi_gro_frags_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_receive_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_list_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_rx_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_frags_exit)(void *, int); + +typedef void (*btf_trace_napi_gro_receive_exit)(void *, int); + +typedef void (*btf_trace_netif_receive_skb_exit)(void *, int); + +typedef void (*btf_trace_netif_rx_exit)(void *, int); + +typedef void (*btf_trace_netif_receive_skb_list_exit)(void *, int); + +struct trace_event_raw_napi_poll { + struct trace_entry ent; + struct napi_struct *napi; + u32 __data_loc_dev_name; + int work; + int budget; + char __data[0]; +}; + +struct trace_event_data_offsets_napi_poll { + u32 dev_name; +}; + +typedef void (*btf_trace_napi_poll)(void *, struct napi_struct *, int, int); + +enum tcp_ca_state { + TCP_CA_Open = 0, + TCP_CA_Disorder = 1, + TCP_CA_CWR = 2, + TCP_CA_Recovery = 3, + TCP_CA_Loss = 4, +}; + +struct trace_event_raw_sock_rcvqueue_full { + struct trace_entry ent; + int rmem_alloc; + unsigned int truesize; + int sk_rcvbuf; + char __data[0]; +}; + +struct trace_event_raw_sock_exceed_buf_limit { + struct trace_entry ent; + char name[32]; + long int sysctl_mem[3]; + long int allocated; + int sysctl_rmem; + int rmem_alloc; + int sysctl_wmem; + int wmem_alloc; + int wmem_queued; + int kind; + char __data[0]; +}; + +struct trace_event_raw_inet_sock_set_state { + struct trace_entry ent; + const void *skaddr; + int oldstate; + int newstate; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_inet_sk_error_report { + struct trace_entry ent; + int error; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_sk_data_ready { + struct trace_entry ent; + const void *skaddr; + __u16 family; + __u16 protocol; + long unsigned int ip; + char __data[0]; +}; + +struct trace_event_raw_sock_msg_length { + struct trace_entry ent; + void *sk; + __u16 family; + __u16 protocol; + int ret; + int flags; + char __data[0]; +}; + +struct trace_event_data_offsets_sock_rcvqueue_full {}; + +struct trace_event_data_offsets_sock_exceed_buf_limit {}; + +struct trace_event_data_offsets_inet_sock_set_state {}; + +struct trace_event_data_offsets_inet_sk_error_report {}; + +struct trace_event_data_offsets_sk_data_ready {}; + +struct trace_event_data_offsets_sock_msg_length {}; + +typedef void (*btf_trace_sock_rcvqueue_full)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_sock_exceed_buf_limit)(void *, struct sock *, struct proto *, long int, int); + +typedef void (*btf_trace_inet_sock_set_state)(void *, const struct sock *, const int, const int); + +typedef void (*btf_trace_inet_sk_error_report)(void *, const struct sock *); + +typedef void (*btf_trace_sk_data_ready)(void *, const struct sock *); + +typedef void (*btf_trace_sock_send_length)(void *, struct sock *, int, int); + +typedef void (*btf_trace_sock_recv_length)(void *, struct sock *, int, int); + +struct trace_event_raw_udp_fail_queue_rcv_skb { + struct trace_entry ent; + int rc; + __u16 lport; + char __data[0]; +}; + +struct trace_event_data_offsets_udp_fail_queue_rcv_skb {}; + +typedef void (*btf_trace_udp_fail_queue_rcv_skb)(void *, int, struct sock *); + +struct trace_event_raw_tcp_event_sk_skb { + struct trace_entry ent; + const void *skbaddr; + const void *skaddr; + int state; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_sk { + struct trace_entry ent; + const void *skaddr; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + long: 32; + __u64 sock_cookie; + char __data[0]; +}; + +struct trace_event_raw_tcp_retransmit_synack { + struct trace_entry ent; + const void *skaddr; + const void *req; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_probe { + struct trace_entry ent; + __u8 saddr[28]; + __u8 daddr[28]; + __u16 sport; + __u16 dport; + __u16 family; + __u32 mark; + __u16 data_len; + __u32 snd_nxt; + __u32 snd_una; + __u32 snd_cwnd; + __u32 ssthresh; + __u32 snd_wnd; + __u32 srtt; + __u32 rcv_wnd; + long: 32; + __u64 sock_cookie; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_skb { + struct trace_entry ent; + const void *skbaddr; + __u8 saddr[28]; + __u8 daddr[28]; + char __data[0]; +}; + +struct trace_event_raw_tcp_cong_state_set { + struct trace_entry ent; + const void *skaddr; + __u16 sport; + __u16 dport; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + __u8 cong_state; + char __data[0]; +}; + +struct trace_event_data_offsets_tcp_event_sk_skb {}; + +struct trace_event_data_offsets_tcp_event_sk {}; + +struct trace_event_data_offsets_tcp_retransmit_synack {}; + +struct trace_event_data_offsets_tcp_probe {}; + +struct trace_event_data_offsets_tcp_event_skb {}; + +struct trace_event_data_offsets_tcp_cong_state_set {}; + +typedef void (*btf_trace_tcp_retransmit_skb)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_send_reset)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_receive_reset)(void *, struct sock *); + +typedef void (*btf_trace_tcp_destroy_sock)(void *, struct sock *); + +typedef void (*btf_trace_tcp_rcv_space_adjust)(void *, struct sock *); + +typedef void (*btf_trace_tcp_retransmit_synack)(void *, const struct sock *, const struct request_sock *); + +typedef void (*btf_trace_tcp_probe)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_tcp_bad_csum)(void *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_cong_state_set)(void *, struct sock *, const u8); + +struct trace_event_raw_fib_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + u8 proto; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[4]; + __u8 dst[4]; + __u8 gw4[4]; + __u8 gw6[16]; + u16 sport; + u16 dport; + char name[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_fib_table_lookup {}; + +typedef void (*btf_trace_fib_table_lookup)(void *, u32, const struct flowi4 *, const struct fib_nh_common *, int); + +struct trace_event_raw_qdisc_dequeue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + int packets; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + long unsigned int txq_state; + char __data[0]; +}; + +struct trace_event_raw_qdisc_enqueue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + char __data[0]; +}; + +struct trace_event_raw_qdisc_reset { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qdisc_destroy { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qdisc_create { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + char __data[0]; +}; + +struct trace_event_data_offsets_qdisc_dequeue {}; + +struct trace_event_data_offsets_qdisc_enqueue {}; + +struct trace_event_data_offsets_qdisc_reset { + u32 dev; + u32 kind; +}; + +struct trace_event_data_offsets_qdisc_destroy { + u32 dev; + u32 kind; +}; + +struct trace_event_data_offsets_qdisc_create { + u32 dev; + u32 kind; +}; + +typedef void (*btf_trace_qdisc_dequeue)(void *, struct Qdisc *, const struct netdev_queue *, int, struct sk_buff *); + +typedef void (*btf_trace_qdisc_enqueue)(void *, struct Qdisc *, const struct netdev_queue *, struct sk_buff *); + +typedef void (*btf_trace_qdisc_reset)(void *, struct Qdisc *); + +typedef void (*btf_trace_qdisc_destroy)(void *, struct Qdisc *); + +typedef void (*btf_trace_qdisc_create)(void *, const struct Qdisc_ops *, struct net_device *, u32); + +struct bridge_stp_xstats { + __u64 transition_blk; + __u64 transition_fwd; + __u64 rx_bpdu; + __u64 tx_bpdu; + __u64 rx_tcn; + __u64 tx_tcn; +}; + +struct br_mcast_stats { + __u64 igmp_v1queries[2]; + __u64 igmp_v2queries[2]; + __u64 igmp_v3queries[2]; + __u64 igmp_leaves[2]; + __u64 igmp_v1reports[2]; + __u64 igmp_v2reports[2]; + __u64 igmp_v3reports[2]; + __u64 igmp_parse_errors; + __u64 mld_v1queries[2]; + __u64 mld_v2queries[2]; + __u64 mld_leaves[2]; + __u64 mld_v1reports[2]; + __u64 mld_v2reports[2]; + __u64 mld_parse_errors; + __u64 mcast_bytes[2]; + __u64 mcast_packets[2]; +}; + +struct br_ip { + union { + __be32 ip4; + struct in6_addr ip6; + } src; + union { + __be32 ip4; + struct in6_addr ip6; + unsigned char mac_addr[6]; + } dst; + __be16 proto; + __u16 vid; +}; + +struct bridge_id { + unsigned char prio[2]; + unsigned char addr[6]; +}; + +typedef struct bridge_id bridge_id; + +struct mac_addr { + unsigned char addr[6]; +}; + +typedef struct mac_addr mac_addr; + +typedef __u16 port_id; + +struct bridge_mcast_own_query { + struct timer_list timer; + u32 startup_sent; +}; + +struct bridge_mcast_other_query { + struct timer_list timer; + long unsigned int delay_time; +}; + +struct bridge_mcast_querier { + struct br_ip addr; + int port_ifidx; + seqcount_spinlock_t seq; +}; + +struct bridge_mcast_stats { + struct br_mcast_stats mstats; + struct u64_stats_sync syncp; + long: 32; +}; + +struct net_bridge; + +struct net_bridge_vlan; + +struct net_bridge_mcast { + struct net_bridge *br; + struct net_bridge_vlan *vlan; + u32 multicast_last_member_count; + u32 multicast_startup_query_count; + u8 multicast_querier; + u8 multicast_igmp_version; + u8 multicast_router; + u8 multicast_mld_version; + long unsigned int multicast_last_member_interval; + long unsigned int multicast_membership_interval; + long unsigned int multicast_querier_interval; + long unsigned int multicast_query_interval; + long unsigned int multicast_query_response_interval; + long unsigned int multicast_startup_query_interval; + struct hlist_head ip4_mc_router_list; + struct timer_list ip4_mc_router_timer; + struct bridge_mcast_other_query ip4_other_query; + struct bridge_mcast_own_query ip4_own_query; + struct bridge_mcast_querier ip4_querier; + struct hlist_head ip6_mc_router_list; + struct timer_list ip6_mc_router_timer; + struct bridge_mcast_other_query ip6_other_query; + struct bridge_mcast_own_query ip6_own_query; + struct bridge_mcast_querier ip6_querier; +}; + +struct net_bridge_vlan_group; + +struct net_bridge { + spinlock_t lock; + spinlock_t hash_lock; + struct hlist_head frame_type_list; + struct net_device *dev; + long unsigned int options; + __be16 vlan_proto; + u16 default_pvid; + struct net_bridge_vlan_group *vlgrp; + struct rhashtable fdb_hash_tbl; + struct list_head port_list; + union { + struct rtable fake_rtable; + struct rt6_info fake_rt6_info; + }; + u16 group_fwd_mask; + u16 group_fwd_mask_required; + bridge_id designated_root; + bridge_id bridge_id; + unsigned char topology_change; + unsigned char topology_change_detected; + u16 root_port; + long unsigned int max_age; + long unsigned int hello_time; + long unsigned int forward_delay; + long unsigned int ageing_time; + long unsigned int bridge_max_age; + long unsigned int bridge_hello_time; + long unsigned int bridge_forward_delay; + long unsigned int bridge_ageing_time; + u32 root_path_cost; + u8 group_addr[6]; + enum { + BR_NO_STP = 0, + BR_KERNEL_STP = 1, + BR_USER_STP = 2, + } stp_enabled; + struct net_bridge_mcast multicast_ctx; + struct bridge_mcast_stats *mcast_stats; + u32 hash_max; + spinlock_t multicast_lock; + struct rhashtable mdb_hash_tbl; + struct rhashtable sg_port_tbl; + struct hlist_head mcast_gc_list; + struct hlist_head mdb_list; + struct work_struct mcast_gc_work; + struct timer_list hello_timer; + struct timer_list tcn_timer; + struct timer_list topology_change_timer; + struct delayed_work gc_work; + struct kobject *ifobj; + u32 auto_cnt; + int last_hwdom; + long unsigned int busy_hwdoms; + struct hlist_head fdb_list; +}; + +struct net_bridge_port; + +struct net_bridge_mcast_port { + struct net_bridge_port *port; + struct net_bridge_vlan *vlan; + struct bridge_mcast_own_query ip4_own_query; + struct timer_list ip4_mc_router_timer; + struct hlist_node ip4_rlist; + struct bridge_mcast_own_query ip6_own_query; + struct timer_list ip6_mc_router_timer; + struct hlist_node ip6_rlist; + unsigned char multicast_router; + u32 mdb_n_entries; + u32 mdb_max_entries; +}; + +struct net_bridge_port { + struct net_bridge *br; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head list; + long unsigned int flags; + struct net_bridge_vlan_group *vlgrp; + struct net_bridge_port *backup_port; + u8 priority; + u8 state; + u16 port_no; + unsigned char topology_change_ack; + unsigned char config_pending; + port_id port_id; + port_id designated_port; + bridge_id designated_root; + bridge_id designated_bridge; + u32 path_cost; + u32 designated_cost; + long unsigned int designated_age; + struct timer_list forward_delay_timer; + struct timer_list hold_timer; + struct timer_list message_age_timer; + struct kobject kobj; + struct callback_head rcu; + struct net_bridge_mcast_port multicast_ctx; + struct bridge_mcast_stats *mcast_stats; + u32 multicast_eht_hosts_limit; + u32 multicast_eht_hosts_cnt; + struct hlist_head mglist; + char sysfs_name[16]; + struct netpoll *np; + int hwdom; + int offload_count; + struct netdev_phys_item_id ppid; + u16 group_fwd_mask; + u16 backup_redirected_cnt; + long: 32; + struct bridge_stp_xstats stp_xstats; +}; + +struct metadata_dst; + +struct br_tunnel_info { + __be64 tunnel_id; + struct metadata_dst *tunnel_dst; + long: 32; +}; + +struct net_bridge_vlan { + struct rhash_head vnode; + struct rhash_head tnode; + u16 vid; + u16 flags; + u16 priv_flags; + u8 state; + struct pcpu_sw_netstats *stats; + union { + struct net_bridge *br; + struct net_bridge_port *port; + }; + union { + refcount_t refcnt; + struct net_bridge_vlan *brvlan; + }; + long: 32; + struct br_tunnel_info tinfo; + union { + struct net_bridge_mcast br_mcast_ctx; + struct net_bridge_mcast_port port_mcast_ctx; + }; + u16 msti; + struct list_head vlist; + struct callback_head rcu; +}; + +struct net_bridge_vlan_group { + struct rhashtable vlan_hash; + struct rhashtable tunnel_hash; + struct list_head vlan_list; + u16 num_vlans; + u16 pvid; + u8 pvid_state; +}; + +struct net_bridge_fdb_key { + mac_addr addr; + u16 vlan_id; +}; + +struct net_bridge_fdb_entry { + struct rhash_head rhnode; + struct net_bridge_port *dst; + struct net_bridge_fdb_key key; + struct hlist_node fdb_node; + long unsigned int flags; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long unsigned int updated; + long unsigned int used; + struct callback_head rcu; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct trace_event_raw_br_fdb_add { + struct trace_entry ent; + u8 ndm_flags; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + u16 nlh_flags; + char __data[0]; +}; + +struct trace_event_raw_br_fdb_external_learn_add { + struct trace_entry ent; + u32 __data_loc_br_dev; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + char __data[0]; +}; + +struct trace_event_raw_fdb_delete { + struct trace_entry ent; + u32 __data_loc_br_dev; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + char __data[0]; +}; + +struct trace_event_raw_br_fdb_update { + struct trace_entry ent; + u32 __data_loc_br_dev; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_br_mdb_full { + struct trace_entry ent; + u32 __data_loc_dev; + int af; + u16 vid; + __u8 src[16]; + __u8 grp[16]; + __u8 grpmac[6]; + char __data[0]; +}; + +struct trace_event_data_offsets_br_fdb_add { + u32 dev; +}; + +struct trace_event_data_offsets_br_fdb_external_learn_add { + u32 br_dev; + u32 dev; +}; + +struct trace_event_data_offsets_fdb_delete { + u32 br_dev; + u32 dev; +}; + +struct trace_event_data_offsets_br_fdb_update { + u32 br_dev; + u32 dev; +}; + +struct trace_event_data_offsets_br_mdb_full { + u32 dev; +}; + +typedef void (*btf_trace_br_fdb_add)(void *, struct ndmsg *, struct net_device *, const unsigned char *, u16, u16); + +typedef void (*btf_trace_br_fdb_external_learn_add)(void *, struct net_bridge *, struct net_bridge_port *, const unsigned char *, u16); + +typedef void (*btf_trace_fdb_delete)(void *, struct net_bridge *, struct net_bridge_fdb_entry *); + +typedef void (*btf_trace_br_fdb_update)(void *, struct net_bridge *, struct net_bridge_port *, const unsigned char *, u16, long unsigned int); + +typedef void (*btf_trace_br_mdb_full)(void *, const struct net_device *, const struct br_ip *); + +struct trace_event_raw_page_pool_release { + struct trace_entry ent; + const struct page_pool *pool; + s32 inflight; + u32 hold; + u32 release; + u64 cnt; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_release { + struct trace_entry ent; + const struct page_pool *pool; + const struct page *page; + u32 release; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_hold { + struct trace_entry ent; + const struct page_pool *pool; + const struct page *page; + u32 hold; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_update_nid { + struct trace_entry ent; + const struct page_pool *pool; + int pool_nid; + int new_nid; + char __data[0]; +}; + +struct trace_event_data_offsets_page_pool_release {}; + +struct trace_event_data_offsets_page_pool_state_release {}; + +struct trace_event_data_offsets_page_pool_state_hold {}; + +struct trace_event_data_offsets_page_pool_update_nid {}; + +typedef void (*btf_trace_page_pool_release)(void *, const struct page_pool *, s32, u32, u32); + +typedef void (*btf_trace_page_pool_state_release)(void *, const struct page_pool *, const struct page *, u32); + +typedef void (*btf_trace_page_pool_state_hold)(void *, const struct page_pool *, const struct page *, u32); + +typedef void (*btf_trace_page_pool_update_nid)(void *, const struct page_pool *, int); + +struct trace_event_raw_neigh_create { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + int entries; + u8 created; + u8 gc_exempt; + u8 primary_key4[4]; + u8 primary_key6[16]; + char __data[0]; +}; + +struct trace_event_raw_neigh_update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + long unsigned int confirmed; + long unsigned int updated; + long unsigned int used; + u8 new_lladdr[32]; + u8 new_state; + u32 update_flags; + u32 pid; + char __data[0]; +}; + +struct trace_event_raw_neigh__update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + long unsigned int confirmed; + long unsigned int updated; + long unsigned int used; + u32 err; + char __data[0]; +}; + +struct trace_event_data_offsets_neigh_create { + u32 dev; +}; + +struct trace_event_data_offsets_neigh_update { + u32 dev; +}; + +struct trace_event_data_offsets_neigh__update { + u32 dev; +}; + +typedef void (*btf_trace_neigh_create)(void *, struct neigh_table *, struct net_device *, const void *, const struct neighbour *, bool); + +typedef void (*btf_trace_neigh_update)(void *, struct neighbour *, const u8 *, u8, u32, u32); + +typedef void (*btf_trace_neigh_update_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_timer_handler)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_event_send_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_event_send_dead)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_cleanup_and_release)(void *, struct neighbour *, int); + +enum ethtool_test_flags { + ETH_TEST_FL_OFFLINE = 1, + ETH_TEST_FL_FAILED = 2, + ETH_TEST_FL_EXTERNAL_LB = 4, + ETH_TEST_FL_EXTERNAL_LB_DONE = 8, +}; + +struct net_packet_attrs { + const unsigned char *src; + const unsigned char *dst; + u32 ip_src; + u32 ip_dst; + bool tcp; + u16 sport; + u16 dport; + int timeout; + int size; + int max_size; + u8 id; + u16 queue_mapping; +}; + +struct net_test_priv { + struct net_packet_attrs *packet; + struct packet_type pt; + struct completion comp; + int double_vlan; + int vlan_id; + int ok; +}; + +struct netsfhdr { + __be32 version; + __be64 magic; + u8 id; +} __attribute__((packed)); + +struct net_test { + char name[32]; + int (*fn)(struct net_device *); +}; + +struct update_classid_context { + u32 classid; + unsigned int batch; +}; + +struct rtnexthop { + short unsigned int rtnh_len; + unsigned char rtnh_flags; + unsigned char rtnh_hops; + int rtnh_ifindex; +}; + +struct lwtunnel_encap_ops { + int (*build_state)(struct net *, struct nlattr *, unsigned int, const void *, struct lwtunnel_state **, struct netlink_ext_ack *); + void (*destroy_state)(struct lwtunnel_state *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + int (*input)(struct sk_buff *); + int (*fill_encap)(struct sk_buff *, struct lwtunnel_state *); + int (*get_encap_size)(struct lwtunnel_state *); + int (*cmp_encap)(struct lwtunnel_state *, struct lwtunnel_state *); + int (*xmit)(struct sk_buff *); + struct module *owner; +}; + +enum { + LWT_BPF_PROG_UNSPEC = 0, + LWT_BPF_PROG_FD = 1, + LWT_BPF_PROG_NAME = 2, + __LWT_BPF_PROG_MAX = 3, +}; + +enum { + LWT_BPF_UNSPEC = 0, + LWT_BPF_IN = 1, + LWT_BPF_OUT = 2, + LWT_BPF_XMIT = 3, + LWT_BPF_XMIT_HEADROOM = 4, + __LWT_BPF_MAX = 5, +}; + +enum { + LWTUNNEL_XMIT_DONE = 0, + LWTUNNEL_XMIT_CONTINUE = 1, +}; + +struct bpf_lwt_prog { + struct bpf_prog *prog; + char *name; +}; + +struct bpf_lwt { + struct bpf_lwt_prog in; + struct bpf_lwt_prog out; + struct bpf_lwt_prog xmit; + int family; +}; + +struct dst_cache_pcpu { + long unsigned int refresh_ts; + struct dst_entry *dst; + u32 cookie; + union { + struct in_addr in_saddr; + struct in6_addr in6_saddr; + }; +}; + +struct gro_cell; + +struct gro_cells { + struct gro_cell *cells; +}; + +struct gro_cell { + struct sk_buff_head napi_skbs; + struct napi_struct napi; +}; + +struct percpu_free_defer { + struct callback_head rcu; + void *ptr; +}; + +enum __sk_action { + __SK_DROP = 0, + __SK_PASS = 1, + __SK_REDIRECT = 2, + __SK_NONE = 3, +}; + +enum sk_psock_state_bits { + SK_PSOCK_TX_ENABLED = 0, +}; + +struct sk_psock_link { + struct list_head list; + struct bpf_map *map; + void *link_raw; +}; + +struct bpf_stab { + struct bpf_map map; + struct sock **sks; + struct sk_psock_progs progs; + raw_spinlock_t lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +typedef u64 (*btf_bpf_sock_map_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sk_redirect_map)(struct sk_buff *, struct bpf_map *, u32, u64); + +typedef u64 (*btf_bpf_msg_redirect_map)(struct sk_msg *, struct bpf_map *, u32, u64); + +struct sock_map_seq_info { + struct bpf_map *map; + struct sock *sk; + u32 index; +}; + +struct bpf_iter__sockmap { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + struct sock *sk; + }; +}; + +struct bpf_shtab_elem { + struct callback_head rcu; + u32 hash; + struct sock *sk; + struct hlist_node node; + u8 key[0]; +}; + +struct bpf_shtab_bucket { + struct hlist_head head; + raw_spinlock_t lock; +}; + +struct bpf_shtab { + struct bpf_map map; + struct bpf_shtab_bucket *buckets; + u32 buckets_num; + u32 elem_size; + struct sk_psock_progs progs; + atomic_t count; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +typedef u64 (*btf_bpf_sock_hash_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sk_redirect_hash)(struct sk_buff *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_msg_redirect_hash)(struct sk_msg *, struct bpf_map *, void *, u64); + +struct sock_hash_seq_info { + struct bpf_map *map; + struct bpf_shtab *htab; + u32 bucket_id; +}; + +enum { + SK_DIAG_BPF_STORAGE_REQ_NONE = 0, + SK_DIAG_BPF_STORAGE_REQ_MAP_FD = 1, + __SK_DIAG_BPF_STORAGE_REQ_MAX = 2, +}; + +enum { + SK_DIAG_BPF_STORAGE_REP_NONE = 0, + SK_DIAG_BPF_STORAGE = 1, + __SK_DIAG_BPF_STORAGE_REP_MAX = 2, +}; + +enum { + SK_DIAG_BPF_STORAGE_NONE = 0, + SK_DIAG_BPF_STORAGE_PAD = 1, + SK_DIAG_BPF_STORAGE_MAP_ID = 2, + SK_DIAG_BPF_STORAGE_MAP_VALUE = 3, + __SK_DIAG_BPF_STORAGE_MAX = 4, +}; + +typedef u64 (*btf_bpf_sk_storage_get)(struct bpf_map *, struct sock *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_sk_storage_delete)(struct bpf_map *, struct sock *); + +typedef u64 (*btf_bpf_sk_storage_get_tracing)(struct bpf_map *, struct sock *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_sk_storage_delete_tracing)(struct bpf_map *, struct sock *); + +struct bpf_sk_storage_diag { + u32 nr_maps; + struct bpf_map *maps[0]; +}; + +struct bpf_iter_seq_sk_storage_map_info { + struct bpf_map *map; + unsigned int bucket_id; + unsigned int skip_elems; +}; + +struct bpf_iter__bpf_sk_storage_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + struct sock *sk; + }; + union { + void *value; + }; +}; + +struct nvmem_cell; + +struct fddi_8022_1_hdr { + __u8 dsap; + __u8 ssap; + __u8 ctrl; +}; + +struct fddi_8022_2_hdr { + __u8 dsap; + __u8 ssap; + __u8 ctrl_1; + __u8 ctrl_2; +}; + +struct fddi_snap_hdr { + __u8 dsap; + __u8 ssap; + __u8 ctrl; + __u8 oui[3]; + __be16 ethertype; +}; + +struct fddihdr { + __u8 fc; + __u8 daddr[6]; + __u8 saddr[6]; + union { + struct fddi_8022_1_hdr llc_8022_1; + struct fddi_8022_2_hdr llc_8022_2; + struct fddi_snap_hdr llc_snap; + } hdr; +} __attribute__((packed)); + +struct tc_ratespec { + unsigned char cell_log; + __u8 linklayer; + short unsigned int overhead; + short int cell_align; + short unsigned int mpu; + __u32 rate; +}; + +struct tc_prio_qopt { + int bands; + __u8 priomap[16]; +}; + +enum { + TCA_UNSPEC = 0, + TCA_KIND = 1, + TCA_OPTIONS = 2, + TCA_STATS = 3, + TCA_XSTATS = 4, + TCA_RATE = 5, + TCA_FCNT = 6, + TCA_STATS2 = 7, + TCA_STAB = 8, + TCA_PAD = 9, + TCA_DUMP_INVISIBLE = 10, + TCA_CHAIN = 11, + TCA_HW_OFFLOAD = 12, + TCA_INGRESS_BLOCK = 13, + TCA_EGRESS_BLOCK = 14, + TCA_DUMP_FLAGS = 15, + TCA_EXT_WARN_MSG = 16, + __TCA_MAX = 17, +}; + +struct skb_array { + struct ptr_ring ring; +}; + +struct psched_ratecfg { + u64 rate_bytes_ps; + u32 mult; + u16 overhead; + u16 mpu; + u8 linklayer; + u8 shift; + long: 32; +}; + +struct psched_pktrate { + u64 rate_pkts_ps; + u32 mult; + u8 shift; +}; + +struct mini_Qdisc_pair { + struct mini_Qdisc miniq1; + struct mini_Qdisc miniq2; + struct mini_Qdisc **p_miniq; +}; + +struct pfifo_fast_priv { + struct skb_array q[3]; +}; + +struct tc_qopt_offload_stats { + struct gnet_stats_basic_sync *bstats; + struct gnet_stats_queue *qstats; +}; + +enum tc_mq_command { + TC_MQ_CREATE = 0, + TC_MQ_DESTROY = 1, + TC_MQ_STATS = 2, + TC_MQ_GRAFT = 3, +}; + +struct tc_mq_opt_offload_graft_params { + long unsigned int queue; + u32 child_handle; +}; + +struct tc_mq_qopt_offload { + enum tc_mq_command command; + u32 handle; + union { + struct tc_qopt_offload_stats stats; + struct tc_mq_opt_offload_graft_params graft_params; + }; +}; + +struct mq_sched { + struct Qdisc **qdiscs; +}; + +struct sch_frag_data { + long unsigned int dst; + struct qdisc_skb_cb cb; + __be16 inner_protocol; + u16 vlan_tci; + __be16 vlan_proto; + unsigned int l2_len; + u8 l2_data[18]; + int (*xmit)(struct sk_buff *); +}; + +enum tc_link_layer { + TC_LINKLAYER_UNAWARE = 0, + TC_LINKLAYER_ETHERNET = 1, + TC_LINKLAYER_ATM = 2, +}; + +enum { + TCA_STAB_UNSPEC = 0, + TCA_STAB_BASE = 1, + TCA_STAB_DATA = 2, + __TCA_STAB_MAX = 3, +}; + +struct qdisc_rate_table { + struct tc_ratespec rate; + u32 data[256]; + struct qdisc_rate_table *next; + int refcnt; +}; + +struct Qdisc_class_common { + u32 classid; + struct hlist_node hnode; +}; + +struct Qdisc_class_hash { + struct hlist_head *hash; + unsigned int hashsize; + unsigned int hashmask; + unsigned int hashelems; +}; + +struct qdisc_watchdog { + u64 last_expires; + struct hrtimer timer; + struct Qdisc *qdisc; + long: 32; +}; + +struct tc_query_caps_base { + enum tc_setup_type type; + void *caps; +}; + +enum tc_root_command { + TC_ROOT_GRAFT = 0, +}; + +struct tc_root_qopt_offload { + enum tc_root_command command; + u32 handle; + bool ingress; +}; + +struct check_loop_arg { + struct qdisc_walker w; + struct Qdisc *p; + int depth; +}; + +struct tcf_bind_args { + struct tcf_walker w; + long unsigned int base; + long unsigned int cl; + u32 classid; +}; + +struct tc_bind_class_args { + struct qdisc_walker w; + long unsigned int new_cl; + u32 portid; + u32 clid; +}; + +struct qdisc_dump_args { + struct qdisc_walker w; + struct sk_buff *skb; + struct netlink_callback *cb; +}; + +enum net_xmit_qdisc_t { + __NET_XMIT_STOLEN = 65536, + __NET_XMIT_BYPASS = 131072, +}; + +enum { + TCA_ACT_UNSPEC = 0, + TCA_ACT_KIND = 1, + TCA_ACT_OPTIONS = 2, + TCA_ACT_INDEX = 3, + TCA_ACT_STATS = 4, + TCA_ACT_PAD = 5, + TCA_ACT_COOKIE = 6, + TCA_ACT_FLAGS = 7, + TCA_ACT_HW_STATS = 8, + TCA_ACT_USED_HW_STATS = 9, + TCA_ACT_IN_HW_COUNT = 10, + __TCA_ACT_MAX = 11, +}; + +enum tca_id { + TCA_ID_UNSPEC = 0, + TCA_ID_POLICE = 1, + TCA_ID_GACT = 5, + TCA_ID_IPT = 6, + TCA_ID_PEDIT = 7, + TCA_ID_MIRRED = 8, + TCA_ID_NAT = 9, + TCA_ID_XT = 10, + TCA_ID_SKBEDIT = 11, + TCA_ID_VLAN = 12, + TCA_ID_BPF = 13, + TCA_ID_CONNMARK = 14, + TCA_ID_SKBMOD = 15, + TCA_ID_CSUM = 16, + TCA_ID_TUNNEL_KEY = 17, + TCA_ID_SIMP = 22, + TCA_ID_IFE = 25, + TCA_ID_SAMPLE = 26, + TCA_ID_CTINFO = 27, + TCA_ID_MPLS = 28, + TCA_ID_CT = 29, + TCA_ID_GATE = 30, + __TCA_ID_MAX = 255, +}; + +struct tcf_t { + __u64 install; + __u64 lastuse; + __u64 expires; + __u64 firstuse; +}; + +struct psample_group { + struct list_head list; + struct net *net; + u32 group_num; + u32 refcount; + u32 seq; + struct callback_head rcu; +}; + +struct action_gate_entry { + u8 gate_state; + u32 interval; + s32 ipv; + s32 maxoctets; +}; + +enum qdisc_class_ops_flags { + QDISC_CLASS_OPS_DOIT_UNLOCKED = 1, +}; + +enum tcf_proto_ops_flags { + TCF_PROTO_OPS_DOIT_UNLOCKED = 1, +}; + +typedef void tcf_chain_head_change_t(struct tcf_proto *, void *); + +struct tcf_idrinfo { + struct mutex lock; + struct idr action_idr; + struct net *net; +}; + +struct tc_action_ops; + +struct tc_cookie; + +struct tc_action { + const struct tc_action_ops *ops; + __u32 type; + struct tcf_idrinfo *idrinfo; + u32 tcfa_index; + refcount_t tcfa_refcnt; + atomic_t tcfa_bindcnt; + int tcfa_action; + long: 32; + struct tcf_t tcfa_tm; + struct gnet_stats_basic_sync tcfa_bstats; + struct gnet_stats_basic_sync tcfa_bstats_hw; + struct gnet_stats_queue tcfa_qstats; + struct net_rate_estimator *tcfa_rate_est; + spinlock_t tcfa_lock; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_basic_sync *cpu_bstats_hw; + struct gnet_stats_queue *cpu_qstats; + struct tc_cookie *act_cookie; + struct tcf_chain *goto_chain; + u32 tcfa_flags; + u8 hw_stats; + u8 used_hw_stats; + bool used_hw_stats_valid; + u32 in_hw_count; + long: 32; +}; + +typedef void (*tc_action_priv_destructor)(void *); + +struct tc_action_ops { + struct list_head head; + char kind[16]; + enum tca_id id; + unsigned int net_id; + size_t size; + struct module *owner; + int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); + int (*dump)(struct sk_buff *, struct tc_action *, int, int); + void (*cleanup)(struct tc_action *); + int (*lookup)(struct net *, struct tc_action **, u32); + int (*init)(struct net *, struct nlattr *, struct nlattr *, struct tc_action **, struct tcf_proto *, u32, struct netlink_ext_ack *); + int (*walk)(struct net *, struct sk_buff *, struct netlink_callback *, int, const struct tc_action_ops *, struct netlink_ext_ack *); + void (*stats_update)(struct tc_action *, u64, u64, u64, u64, bool); + size_t (*get_fill_size)(const struct tc_action *); + struct net_device * (*get_dev)(const struct tc_action *, tc_action_priv_destructor *); + struct psample_group * (*get_psample_group)(const struct tc_action *, tc_action_priv_destructor *); + int (*offload_act_setup)(struct tc_action *, void *, u32 *, bool, struct netlink_ext_ack *); +}; + +struct tc_cookie { + u8 *data; + u32 len; + struct callback_head rcu; +}; + +struct tcf_block_ext_info { + enum flow_block_binder_type binder_type; + tcf_chain_head_change_t *chain_head_change; + void *chain_head_change_priv; + u32 block_index; +}; + +struct tcf_qevent { + struct tcf_block *block; + struct tcf_block_ext_info info; + struct tcf_proto *filter_chain; +}; + +struct tcf_exts { + __u32 type; + int nr_actions; + struct tc_action **actions; + struct net *net; + netns_tracker ns_tracker; + int action; + int police; +}; + +enum pedit_header_type { + TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0, + TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1, + TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2, + TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3, + TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4, + TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5, + __PEDIT_HDR_TYPE_MAX = 6, +}; + +enum pedit_cmd { + TCA_PEDIT_KEY_EX_CMD_SET = 0, + TCA_PEDIT_KEY_EX_CMD_ADD = 1, + __PEDIT_CMD_MAX = 2, +}; + +struct tc_pedit_key { + __u32 mask; + __u32 val; + __u32 off; + __u32 at; + __u32 offmask; + __u32 shift; +}; + +struct tcf_pedit_key_ex { + enum pedit_header_type htype; + enum pedit_cmd cmd; +}; + +struct tcf_pedit_parms { + struct tc_pedit_key *tcfp_keys; + struct tcf_pedit_key_ex *tcfp_keys_ex; + u32 tcfp_off_max_hint; + unsigned char tcfp_nkeys; + unsigned char tcfp_flags; + struct callback_head rcu; +}; + +struct tcf_pedit { + struct tc_action common; + struct tcf_pedit_parms *parms; + long: 32; + long: 32; + long: 32; +}; + +struct tcf_filter_chain_list_item { + struct list_head list; + tcf_chain_head_change_t *chain_head_change; + void *chain_head_change_priv; +}; + +struct tcf_net { + spinlock_t idr_lock; + struct idr idr; +}; + +struct tcf_block_owner_item { + struct list_head list; + struct Qdisc *q; + enum flow_block_binder_type binder_type; +}; + +struct tcf_chain_info { + struct tcf_proto **pprev; + struct tcf_proto *next; +}; + +struct tcf_dump_args { + struct tcf_walker w; + struct sk_buff *skb; + struct netlink_callback *cb; + struct tcf_block *block; + struct Qdisc *q; + u32 parent; + bool terse_dump; +}; + +struct tcamsg { + unsigned char tca_family; + unsigned char tca__pad1; + short unsigned int tca__pad2; +}; + +enum { + TCA_ROOT_UNSPEC = 0, + TCA_ROOT_TAB = 1, + TCA_ROOT_FLAGS = 2, + TCA_ROOT_COUNT = 3, + TCA_ROOT_TIME_DELTA = 4, + __TCA_ROOT_MAX = 5, +}; + +struct tc_action_net { + struct tcf_idrinfo *idrinfo; + const struct tc_action_ops *ops; +}; + +struct tc_act_pernet_id { + struct list_head list; + unsigned int id; +}; + +struct tc_fifo_qopt { + __u32 limit; +}; + +enum tc_fifo_command { + TC_FIFO_REPLACE = 0, + TC_FIFO_DESTROY = 1, + TC_FIFO_STATS = 2, +}; + +struct tc_fifo_qopt_offload { + enum tc_fifo_command command; + u32 handle; + u32 parent; + union { + struct tc_qopt_offload_stats stats; + }; +}; + +struct tcf_ematch_tree_hdr { + __u16 nmatches; + __u16 progid; +}; + +enum { + TCA_EMATCH_TREE_UNSPEC = 0, + TCA_EMATCH_TREE_HDR = 1, + TCA_EMATCH_TREE_LIST = 2, + __TCA_EMATCH_TREE_MAX = 3, +}; + +struct tcf_ematch_hdr { + __u16 matchid; + __u16 kind; + __u16 flags; + __u16 pad; +}; + +struct tcf_pkt_info { + unsigned char *ptr; + int nexthdr; +}; + +struct tcf_ematch_ops; + +struct tcf_ematch { + struct tcf_ematch_ops *ops; + long unsigned int data; + unsigned int datalen; + u16 matchid; + u16 flags; + struct net *net; +}; + +struct tcf_ematch_ops { + int kind; + int datalen; + int (*change)(struct net *, void *, int, struct tcf_ematch *); + int (*match)(struct sk_buff *, struct tcf_ematch *, struct tcf_pkt_info *); + void (*destroy)(struct tcf_ematch *); + int (*dump)(struct sk_buff *, struct tcf_ematch *); + struct module *owner; + struct list_head link; +}; + +struct tcf_ematch_tree { + struct tcf_ematch_tree_hdr hdr; + struct tcf_ematch *matches; +}; + +struct sockaddr_nl { + __kernel_sa_family_t nl_family; + short unsigned int nl_pad; + __u32 nl_pid; + __u32 nl_groups; +}; + +struct nlmsgerr { + int error; + struct nlmsghdr msg; +}; + +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED = 0, + NLMSGERR_ATTR_MSG = 1, + NLMSGERR_ATTR_OFFS = 2, + NLMSGERR_ATTR_COOKIE = 3, + NLMSGERR_ATTR_POLICY = 4, + NLMSGERR_ATTR_MISS_TYPE = 5, + NLMSGERR_ATTR_MISS_NEST = 6, + __NLMSGERR_ATTR_MAX = 7, + NLMSGERR_ATTR_MAX = 6, +}; + +struct nl_pktinfo { + __u32 group; +}; + +enum { + NETLINK_UNCONNECTED = 0, + NETLINK_CONNECTED = 1, +}; + +enum netlink_skb_flags { + NETLINK_SKB_DST = 8, +}; + +struct netlink_notify { + struct net *net; + u32 portid; + int protocol; +}; + +struct netlink_tap { + struct net_device *dev; + struct module *module; + struct list_head list; +}; + +struct trace_event_raw_netlink_extack { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_data_offsets_netlink_extack { + u32 msg; +}; + +typedef void (*btf_trace_netlink_extack)(void *, const char *); + +struct netlink_sock { + struct sock sk; + u32 portid; + u32 dst_portid; + u32 dst_group; + u32 flags; + u32 subscriptions; + u32 ngroups; + long unsigned int *groups; + long unsigned int state; + size_t max_recvmsg_len; + wait_queue_head_t wait; + bool bound; + bool cb_running; + int dump_done_errno; + struct netlink_callback cb; + struct mutex *cb_mutex; + struct mutex cb_def_mutex; + void (*netlink_rcv)(struct sk_buff *); + int (*netlink_bind)(struct net *, int); + void (*netlink_unbind)(struct net *, int); + struct module *module; + struct rhash_head node; + struct callback_head rcu; + struct work_struct work; + long: 32; +}; + +struct listeners; + +struct netlink_table { + struct rhashtable hash; + struct hlist_head mc_list; + struct listeners *listeners; + unsigned int flags; + unsigned int groups; + struct mutex *cb_mutex; + struct module *module; + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); + bool (*compare)(struct net *, struct sock *); + int registered; +}; + +struct listeners { + struct callback_head rcu; + long unsigned int masks[0]; +}; + +struct netlink_tap_net { + struct list_head netlink_tap_all; + struct mutex netlink_tap_lock; +}; + +struct netlink_compare_arg { + possible_net_t pnet; + u32 portid; +}; + +struct netlink_broadcast_data { + struct sock *exclude_sk; + struct net *net; + u32 portid; + u32 group; + int failure; + int delivery_failure; + int congested; + int delivered; + gfp_t allocation; + struct sk_buff *skb; + struct sk_buff *skb2; +}; + +struct netlink_set_err_data { + struct sock *exclude_sk; + u32 portid; + u32 group; + int code; +}; + +struct nl_seq_iter { + struct seq_net_private p; + struct rhashtable_iter hti; + int link; +}; + +struct bpf_iter__netlink { + union { + struct bpf_iter_meta *meta; + }; + union { + struct netlink_sock *sk; + }; +}; + +enum { + CTRL_CMD_UNSPEC = 0, + CTRL_CMD_NEWFAMILY = 1, + CTRL_CMD_DELFAMILY = 2, + CTRL_CMD_GETFAMILY = 3, + CTRL_CMD_NEWOPS = 4, + CTRL_CMD_DELOPS = 5, + CTRL_CMD_GETOPS = 6, + CTRL_CMD_NEWMCAST_GRP = 7, + CTRL_CMD_DELMCAST_GRP = 8, + CTRL_CMD_GETMCAST_GRP = 9, + CTRL_CMD_GETPOLICY = 10, + __CTRL_CMD_MAX = 11, +}; + +enum { + CTRL_ATTR_UNSPEC = 0, + CTRL_ATTR_FAMILY_ID = 1, + CTRL_ATTR_FAMILY_NAME = 2, + CTRL_ATTR_VERSION = 3, + CTRL_ATTR_HDRSIZE = 4, + CTRL_ATTR_MAXATTR = 5, + CTRL_ATTR_OPS = 6, + CTRL_ATTR_MCAST_GROUPS = 7, + CTRL_ATTR_POLICY = 8, + CTRL_ATTR_OP_POLICY = 9, + CTRL_ATTR_OP = 10, + __CTRL_ATTR_MAX = 11, +}; + +enum { + CTRL_ATTR_OP_UNSPEC = 0, + CTRL_ATTR_OP_ID = 1, + CTRL_ATTR_OP_FLAGS = 2, + __CTRL_ATTR_OP_MAX = 3, +}; + +enum { + CTRL_ATTR_MCAST_GRP_UNSPEC = 0, + CTRL_ATTR_MCAST_GRP_NAME = 1, + CTRL_ATTR_MCAST_GRP_ID = 2, + __CTRL_ATTR_MCAST_GRP_MAX = 3, +}; + +enum { + CTRL_ATTR_POLICY_UNSPEC = 0, + CTRL_ATTR_POLICY_DO = 1, + CTRL_ATTR_POLICY_DUMP = 2, + __CTRL_ATTR_POLICY_DUMP_MAX = 3, + CTRL_ATTR_POLICY_DUMP_MAX = 2, +}; + +struct genl_dumpit_info { + const struct genl_family *family; + struct genl_split_ops op; + struct nlattr **attrs; +}; + +struct genl_op_iter { + const struct genl_family *family; + struct genl_split_ops doit; + struct genl_split_ops dumpit; + int cmd_idx; + int entry_idx; + u32 cmd; + u8 flags; +}; + +struct genl_start_context { + const struct genl_family *family; + struct nlmsghdr *nlh; + struct netlink_ext_ack *extack; + const struct genl_split_ops *ops; + int hdrlen; +}; + +struct netlink_policy_dump_state; + +struct ctrl_dump_policy_ctx { + struct netlink_policy_dump_state *state; + const struct genl_family *rt; + struct genl_op_iter *op_iter; + u32 op; + u16 fam_id; + u8 dump_map: 1; + u8 single_op: 1; +}; + +enum netlink_attribute_type { + NL_ATTR_TYPE_INVALID = 0, + NL_ATTR_TYPE_FLAG = 1, + NL_ATTR_TYPE_U8 = 2, + NL_ATTR_TYPE_U16 = 3, + NL_ATTR_TYPE_U32 = 4, + NL_ATTR_TYPE_U64 = 5, + NL_ATTR_TYPE_S8 = 6, + NL_ATTR_TYPE_S16 = 7, + NL_ATTR_TYPE_S32 = 8, + NL_ATTR_TYPE_S64 = 9, + NL_ATTR_TYPE_BINARY = 10, + NL_ATTR_TYPE_STRING = 11, + NL_ATTR_TYPE_NUL_STRING = 12, + NL_ATTR_TYPE_NESTED = 13, + NL_ATTR_TYPE_NESTED_ARRAY = 14, + NL_ATTR_TYPE_BITFIELD32 = 15, +}; + +enum netlink_policy_type_attr { + NL_POLICY_TYPE_ATTR_UNSPEC = 0, + NL_POLICY_TYPE_ATTR_TYPE = 1, + NL_POLICY_TYPE_ATTR_MIN_VALUE_S = 2, + NL_POLICY_TYPE_ATTR_MAX_VALUE_S = 3, + NL_POLICY_TYPE_ATTR_MIN_VALUE_U = 4, + NL_POLICY_TYPE_ATTR_MAX_VALUE_U = 5, + NL_POLICY_TYPE_ATTR_MIN_LENGTH = 6, + NL_POLICY_TYPE_ATTR_MAX_LENGTH = 7, + NL_POLICY_TYPE_ATTR_POLICY_IDX = 8, + NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 9, + NL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 10, + NL_POLICY_TYPE_ATTR_PAD = 11, + NL_POLICY_TYPE_ATTR_MASK = 12, + __NL_POLICY_TYPE_ATTR_MAX = 13, + NL_POLICY_TYPE_ATTR_MAX = 12, +}; + +struct netlink_policy_dump_state { + unsigned int policy_idx; + unsigned int attr_idx; + unsigned int n_alloc; + struct { + const struct nla_policy *policy; + unsigned int maxtype; + } policies[0]; +}; + +struct trace_event_raw_bpf_test_finish { + struct trace_entry ent; + int err; + char __data[0]; +}; + +struct trace_event_data_offsets_bpf_test_finish {}; + +typedef void (*btf_trace_bpf_test_finish)(void *, int *); + +struct bpf_test_timer { + enum { + NO_PREEMPT = 0, + NO_MIGRATE = 1, + } mode; + u32 i; + u64 time_start; + u64 time_spent; +}; + +struct xdp_page_head { + struct xdp_buff orig_ctx; + struct xdp_buff ctx; + struct xdp_frame frm; + u8 data[0]; +}; + +struct xdp_test_data { + struct xdp_buff *orig_ctx; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct xdp_rxq_info rxq; + struct net_device *dev; + struct page_pool *pp; + struct xdp_frame **frames; + struct sk_buff **skbs; + struct xdp_mem_info mem; + u32 batch_size; + u32 frame_cnt; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct bpf_fentry_test_t { + struct bpf_fentry_test_t *a; +}; + +struct prog_test_member1 { + int a; +}; + +struct prog_test_member { + struct prog_test_member1 m; + int c; +}; + +struct prog_test_ref_kfunc { + int a; + int b; + struct prog_test_member memb; + struct prog_test_ref_kfunc *next; + refcount_t cnt; +}; + +struct prog_test_pass1 { + int x0; + struct { + int x1; + struct { + int x2; + struct { + int x3; + }; + }; + }; +}; + +struct prog_test_pass2 { + int len; + short int arr1[4]; + struct { + char arr2[4]; + long unsigned int arr3[8]; + } x; +}; + +struct prog_test_fail1 { + void *p; + int x; +}; + +struct prog_test_fail2 { + int x8; + struct prog_test_pass1 x; +}; + +struct prog_test_fail3 { + int len; + char arr1[2]; + char arr2[0]; +}; + +struct bpf_raw_tp_test_run_info { + struct bpf_prog *prog; + void *ctx; + u32 retval; +}; + +typedef int (*dummy_ops_test_ret_fn)(struct bpf_dummy_ops_state *, ...); + +struct bpf_dummy_ops_test_args { + u64 args[12]; + struct bpf_dummy_ops_state state; + long: 32; +}; + +struct ethtool_cmd { + __u32 cmd; + __u32 supported; + __u32 advertising; + __u16 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 transceiver; + __u8 autoneg; + __u8 mdio_support; + __u32 maxtxpkt; + __u32 maxrxpkt; + __u16 speed_hi; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __u32 lp_advertising; + __u32 reserved[2]; +}; + +struct ethtool_value { + __u32 cmd; + __u32 data; +}; + +enum tunable_id { + ETHTOOL_ID_UNSPEC = 0, + ETHTOOL_RX_COPYBREAK = 1, + ETHTOOL_TX_COPYBREAK = 2, + ETHTOOL_PFC_PREVENTION_TOUT = 3, + ETHTOOL_TX_COPYBREAK_BUF_SIZE = 4, + __ETHTOOL_TUNABLE_COUNT = 5, +}; + +enum tunable_type_id { + ETHTOOL_TUNABLE_UNSPEC = 0, + ETHTOOL_TUNABLE_U8 = 1, + ETHTOOL_TUNABLE_U16 = 2, + ETHTOOL_TUNABLE_U32 = 3, + ETHTOOL_TUNABLE_U64 = 4, + ETHTOOL_TUNABLE_STRING = 5, + ETHTOOL_TUNABLE_S8 = 6, + ETHTOOL_TUNABLE_S16 = 7, + ETHTOOL_TUNABLE_S32 = 8, + ETHTOOL_TUNABLE_S64 = 9, +}; + +enum phy_tunable_id { + ETHTOOL_PHY_ID_UNSPEC = 0, + ETHTOOL_PHY_DOWNSHIFT = 1, + ETHTOOL_PHY_FAST_LINK_DOWN = 2, + ETHTOOL_PHY_EDPD = 3, + __ETHTOOL_PHY_TUNABLE_COUNT = 4, +}; + +enum ethtool_stringset { + ETH_SS_TEST = 0, + ETH_SS_STATS = 1, + ETH_SS_PRIV_FLAGS = 2, + ETH_SS_NTUPLE_FILTERS = 3, + ETH_SS_FEATURES = 4, + ETH_SS_RSS_HASH_FUNCS = 5, + ETH_SS_TUNABLES = 6, + ETH_SS_PHY_STATS = 7, + ETH_SS_PHY_TUNABLES = 8, + ETH_SS_LINK_MODES = 9, + ETH_SS_MSG_CLASSES = 10, + ETH_SS_WOL_MODES = 11, + ETH_SS_SOF_TIMESTAMPING = 12, + ETH_SS_TS_TX_TYPES = 13, + ETH_SS_TS_RX_FILTERS = 14, + ETH_SS_UDP_TUNNEL_TYPES = 15, + ETH_SS_STATS_STD = 16, + ETH_SS_STATS_ETH_PHY = 17, + ETH_SS_STATS_ETH_MAC = 18, + ETH_SS_STATS_ETH_CTRL = 19, + ETH_SS_STATS_RMON = 20, + ETH_SS_COUNT = 21, +}; + +struct ethtool_gstrings { + __u32 cmd; + __u32 string_set; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_sset_info { + __u32 cmd; + __u32 reserved; + __u64 sset_mask; + __u32 data[0]; +}; + +struct ethtool_perm_addr { + __u32 cmd; + __u32 size; + __u8 data[0]; +}; + +enum ethtool_flags { + ETH_FLAG_TXVLAN = 128, + ETH_FLAG_RXVLAN = 256, + ETH_FLAG_LRO = 32768, + ETH_FLAG_NTUPLE = 134217728, + ETH_FLAG_RXHASH = 268435456, +}; + +struct ethtool_rxfh { + __u32 cmd; + __u32 rss_context; + __u32 indir_size; + __u32 key_size; + __u8 hfunc; + __u8 rsvd8[3]; + __u32 rsvd32; + __u32 rss_config[0]; +}; + +struct ethtool_get_features_block { + __u32 available; + __u32 requested; + __u32 active; + __u32 never_changed; +}; + +struct ethtool_gfeatures { + __u32 cmd; + __u32 size; + struct ethtool_get_features_block features[0]; +}; + +struct ethtool_set_features_block { + __u32 valid; + __u32 requested; +}; + +struct ethtool_sfeatures { + __u32 cmd; + __u32 size; + struct ethtool_set_features_block features[0]; +}; + +enum ethtool_sfeatures_retval_bits { + ETHTOOL_F_UNSUPPORTED__BIT = 0, + ETHTOOL_F_WISH__BIT = 1, + ETHTOOL_F_COMPAT__BIT = 2, +}; + +struct ethtool_per_queue_op { + __u32 cmd; + __u32 sub_command; + __u32 queue_mask[128]; + char data[0]; +}; + +enum ethtool_fec_config_bits { + ETHTOOL_FEC_NONE_BIT = 0, + ETHTOOL_FEC_AUTO_BIT = 1, + ETHTOOL_FEC_OFF_BIT = 2, + ETHTOOL_FEC_RS_BIT = 3, + ETHTOOL_FEC_BASER_BIT = 4, + ETHTOOL_FEC_LLRS_BIT = 5, +}; + +enum { + ETH_RSS_HASH_TOP_BIT = 0, + ETH_RSS_HASH_XOR_BIT = 1, + ETH_RSS_HASH_CRC32_BIT = 2, + ETH_RSS_HASH_FUNCS_COUNT = 3, +}; + +struct ethtool_rx_flow_rule { + struct flow_rule *rule; + long unsigned int priv[0]; +}; + +struct ethtool_rx_flow_spec_input { + const struct ethtool_rx_flow_spec *fs; + u32 rss_ctx; +}; + +struct ethtool_devlink_compat { + struct devlink *devlink; + union { + struct ethtool_flash efl; + struct ethtool_drvinfo info; + }; +}; + +struct ethtool_link_usettings { + struct ethtool_link_settings base; + struct { + __u32 supported[4]; + __u32 advertising[4]; + __u32 lp_advertising[4]; + } link_modes; +}; + +struct ethtool_rx_flow_key { + struct flow_dissector_key_basic basic; + union { + struct flow_dissector_key_ipv4_addrs ipv4; + struct flow_dissector_key_ipv6_addrs ipv6; + }; + struct flow_dissector_key_ports tp; + struct flow_dissector_key_ip ip; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_eth_addrs eth_addrs; +}; + +struct ethtool_rx_flow_match { + struct flow_dissector dissector; + struct ethtool_rx_flow_key key; + struct ethtool_rx_flow_key mask; +}; + +enum { + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN = 0, + ETHTOOL_UDP_TUNNEL_TYPE_GENEVE = 1, + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = 2, + __ETHTOOL_UDP_TUNNEL_TYPE_CNT = 3, +}; + +struct link_mode_info { + int speed; + u8 lanes; + u8 duplex; +}; + +enum { + ETHTOOL_MSG_USER_NONE = 0, + ETHTOOL_MSG_STRSET_GET = 1, + ETHTOOL_MSG_LINKINFO_GET = 2, + ETHTOOL_MSG_LINKINFO_SET = 3, + ETHTOOL_MSG_LINKMODES_GET = 4, + ETHTOOL_MSG_LINKMODES_SET = 5, + ETHTOOL_MSG_LINKSTATE_GET = 6, + ETHTOOL_MSG_DEBUG_GET = 7, + ETHTOOL_MSG_DEBUG_SET = 8, + ETHTOOL_MSG_WOL_GET = 9, + ETHTOOL_MSG_WOL_SET = 10, + ETHTOOL_MSG_FEATURES_GET = 11, + ETHTOOL_MSG_FEATURES_SET = 12, + ETHTOOL_MSG_PRIVFLAGS_GET = 13, + ETHTOOL_MSG_PRIVFLAGS_SET = 14, + ETHTOOL_MSG_RINGS_GET = 15, + ETHTOOL_MSG_RINGS_SET = 16, + ETHTOOL_MSG_CHANNELS_GET = 17, + ETHTOOL_MSG_CHANNELS_SET = 18, + ETHTOOL_MSG_COALESCE_GET = 19, + ETHTOOL_MSG_COALESCE_SET = 20, + ETHTOOL_MSG_PAUSE_GET = 21, + ETHTOOL_MSG_PAUSE_SET = 22, + ETHTOOL_MSG_EEE_GET = 23, + ETHTOOL_MSG_EEE_SET = 24, + ETHTOOL_MSG_TSINFO_GET = 25, + ETHTOOL_MSG_CABLE_TEST_ACT = 26, + ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 27, + ETHTOOL_MSG_TUNNEL_INFO_GET = 28, + ETHTOOL_MSG_FEC_GET = 29, + ETHTOOL_MSG_FEC_SET = 30, + ETHTOOL_MSG_MODULE_EEPROM_GET = 31, + ETHTOOL_MSG_STATS_GET = 32, + ETHTOOL_MSG_PHC_VCLOCKS_GET = 33, + ETHTOOL_MSG_MODULE_GET = 34, + ETHTOOL_MSG_MODULE_SET = 35, + ETHTOOL_MSG_PSE_GET = 36, + ETHTOOL_MSG_PSE_SET = 37, + ETHTOOL_MSG_RSS_GET = 38, + ETHTOOL_MSG_PLCA_GET_CFG = 39, + ETHTOOL_MSG_PLCA_SET_CFG = 40, + ETHTOOL_MSG_PLCA_GET_STATUS = 41, + ETHTOOL_MSG_MM_GET = 42, + ETHTOOL_MSG_MM_SET = 43, + __ETHTOOL_MSG_USER_CNT = 44, + ETHTOOL_MSG_USER_MAX = 43, +}; + +enum { + ETHTOOL_A_HEADER_UNSPEC = 0, + ETHTOOL_A_HEADER_DEV_INDEX = 1, + ETHTOOL_A_HEADER_DEV_NAME = 2, + ETHTOOL_A_HEADER_FLAGS = 3, + __ETHTOOL_A_HEADER_CNT = 4, + ETHTOOL_A_HEADER_MAX = 3, +}; + +enum { + ETHTOOL_A_STRSET_UNSPEC = 0, + ETHTOOL_A_STRSET_HEADER = 1, + ETHTOOL_A_STRSET_STRINGSETS = 2, + ETHTOOL_A_STRSET_COUNTS_ONLY = 3, + __ETHTOOL_A_STRSET_CNT = 4, + ETHTOOL_A_STRSET_MAX = 3, +}; + +enum { + ETHTOOL_A_LINKINFO_UNSPEC = 0, + ETHTOOL_A_LINKINFO_HEADER = 1, + ETHTOOL_A_LINKINFO_PORT = 2, + ETHTOOL_A_LINKINFO_PHYADDR = 3, + ETHTOOL_A_LINKINFO_TP_MDIX = 4, + ETHTOOL_A_LINKINFO_TP_MDIX_CTRL = 5, + ETHTOOL_A_LINKINFO_TRANSCEIVER = 6, + __ETHTOOL_A_LINKINFO_CNT = 7, + ETHTOOL_A_LINKINFO_MAX = 6, +}; + +enum { + ETHTOOL_A_LINKMODES_UNSPEC = 0, + ETHTOOL_A_LINKMODES_HEADER = 1, + ETHTOOL_A_LINKMODES_AUTONEG = 2, + ETHTOOL_A_LINKMODES_OURS = 3, + ETHTOOL_A_LINKMODES_PEER = 4, + ETHTOOL_A_LINKMODES_SPEED = 5, + ETHTOOL_A_LINKMODES_DUPLEX = 6, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = 7, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = 8, + ETHTOOL_A_LINKMODES_LANES = 9, + ETHTOOL_A_LINKMODES_RATE_MATCHING = 10, + __ETHTOOL_A_LINKMODES_CNT = 11, + ETHTOOL_A_LINKMODES_MAX = 10, +}; + +enum { + ETHTOOL_A_LINKSTATE_UNSPEC = 0, + ETHTOOL_A_LINKSTATE_HEADER = 1, + ETHTOOL_A_LINKSTATE_LINK = 2, + ETHTOOL_A_LINKSTATE_SQI = 3, + ETHTOOL_A_LINKSTATE_SQI_MAX = 4, + ETHTOOL_A_LINKSTATE_EXT_STATE = 5, + ETHTOOL_A_LINKSTATE_EXT_SUBSTATE = 6, + ETHTOOL_A_LINKSTATE_EXT_DOWN_CNT = 7, + __ETHTOOL_A_LINKSTATE_CNT = 8, + ETHTOOL_A_LINKSTATE_MAX = 7, +}; + +enum { + ETHTOOL_A_DEBUG_UNSPEC = 0, + ETHTOOL_A_DEBUG_HEADER = 1, + ETHTOOL_A_DEBUG_MSGMASK = 2, + __ETHTOOL_A_DEBUG_CNT = 3, + ETHTOOL_A_DEBUG_MAX = 2, +}; + +enum { + ETHTOOL_A_WOL_UNSPEC = 0, + ETHTOOL_A_WOL_HEADER = 1, + ETHTOOL_A_WOL_MODES = 2, + ETHTOOL_A_WOL_SOPASS = 3, + __ETHTOOL_A_WOL_CNT = 4, + ETHTOOL_A_WOL_MAX = 3, +}; + +enum { + ETHTOOL_A_FEATURES_UNSPEC = 0, + ETHTOOL_A_FEATURES_HEADER = 1, + ETHTOOL_A_FEATURES_HW = 2, + ETHTOOL_A_FEATURES_WANTED = 3, + ETHTOOL_A_FEATURES_ACTIVE = 4, + ETHTOOL_A_FEATURES_NOCHANGE = 5, + __ETHTOOL_A_FEATURES_CNT = 6, + ETHTOOL_A_FEATURES_MAX = 5, +}; + +enum { + ETHTOOL_A_PRIVFLAGS_UNSPEC = 0, + ETHTOOL_A_PRIVFLAGS_HEADER = 1, + ETHTOOL_A_PRIVFLAGS_FLAGS = 2, + __ETHTOOL_A_PRIVFLAGS_CNT = 3, + ETHTOOL_A_PRIVFLAGS_MAX = 2, +}; + +enum { + ETHTOOL_A_RINGS_UNSPEC = 0, + ETHTOOL_A_RINGS_HEADER = 1, + ETHTOOL_A_RINGS_RX_MAX = 2, + ETHTOOL_A_RINGS_RX_MINI_MAX = 3, + ETHTOOL_A_RINGS_RX_JUMBO_MAX = 4, + ETHTOOL_A_RINGS_TX_MAX = 5, + ETHTOOL_A_RINGS_RX = 6, + ETHTOOL_A_RINGS_RX_MINI = 7, + ETHTOOL_A_RINGS_RX_JUMBO = 8, + ETHTOOL_A_RINGS_TX = 9, + ETHTOOL_A_RINGS_RX_BUF_LEN = 10, + ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 11, + ETHTOOL_A_RINGS_CQE_SIZE = 12, + ETHTOOL_A_RINGS_TX_PUSH = 13, + __ETHTOOL_A_RINGS_CNT = 14, + ETHTOOL_A_RINGS_MAX = 13, +}; + +enum { + ETHTOOL_A_CHANNELS_UNSPEC = 0, + ETHTOOL_A_CHANNELS_HEADER = 1, + ETHTOOL_A_CHANNELS_RX_MAX = 2, + ETHTOOL_A_CHANNELS_TX_MAX = 3, + ETHTOOL_A_CHANNELS_OTHER_MAX = 4, + ETHTOOL_A_CHANNELS_COMBINED_MAX = 5, + ETHTOOL_A_CHANNELS_RX_COUNT = 6, + ETHTOOL_A_CHANNELS_TX_COUNT = 7, + ETHTOOL_A_CHANNELS_OTHER_COUNT = 8, + ETHTOOL_A_CHANNELS_COMBINED_COUNT = 9, + __ETHTOOL_A_CHANNELS_CNT = 10, + ETHTOOL_A_CHANNELS_MAX = 9, +}; + +enum { + ETHTOOL_A_COALESCE_UNSPEC = 0, + ETHTOOL_A_COALESCE_HEADER = 1, + ETHTOOL_A_COALESCE_RX_USECS = 2, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES = 3, + ETHTOOL_A_COALESCE_RX_USECS_IRQ = 4, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = 5, + ETHTOOL_A_COALESCE_TX_USECS = 6, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES = 7, + ETHTOOL_A_COALESCE_TX_USECS_IRQ = 8, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = 9, + ETHTOOL_A_COALESCE_STATS_BLOCK_USECS = 10, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = 11, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = 12, + ETHTOOL_A_COALESCE_PKT_RATE_LOW = 13, + ETHTOOL_A_COALESCE_RX_USECS_LOW = 14, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = 15, + ETHTOOL_A_COALESCE_TX_USECS_LOW = 16, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = 17, + ETHTOOL_A_COALESCE_PKT_RATE_HIGH = 18, + ETHTOOL_A_COALESCE_RX_USECS_HIGH = 19, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = 20, + ETHTOOL_A_COALESCE_TX_USECS_HIGH = 21, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 22, + ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 23, + ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 24, + ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 25, + ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES = 26, + ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES = 27, + ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS = 28, + __ETHTOOL_A_COALESCE_CNT = 29, + ETHTOOL_A_COALESCE_MAX = 28, +}; + +enum { + ETHTOOL_A_PAUSE_UNSPEC = 0, + ETHTOOL_A_PAUSE_HEADER = 1, + ETHTOOL_A_PAUSE_AUTONEG = 2, + ETHTOOL_A_PAUSE_RX = 3, + ETHTOOL_A_PAUSE_TX = 4, + ETHTOOL_A_PAUSE_STATS = 5, + ETHTOOL_A_PAUSE_STATS_SRC = 6, + __ETHTOOL_A_PAUSE_CNT = 7, + ETHTOOL_A_PAUSE_MAX = 6, +}; + +enum { + ETHTOOL_A_EEE_UNSPEC = 0, + ETHTOOL_A_EEE_HEADER = 1, + ETHTOOL_A_EEE_MODES_OURS = 2, + ETHTOOL_A_EEE_MODES_PEER = 3, + ETHTOOL_A_EEE_ACTIVE = 4, + ETHTOOL_A_EEE_ENABLED = 5, + ETHTOOL_A_EEE_TX_LPI_ENABLED = 6, + ETHTOOL_A_EEE_TX_LPI_TIMER = 7, + __ETHTOOL_A_EEE_CNT = 8, + ETHTOOL_A_EEE_MAX = 7, +}; + +enum { + ETHTOOL_A_TSINFO_UNSPEC = 0, + ETHTOOL_A_TSINFO_HEADER = 1, + ETHTOOL_A_TSINFO_TIMESTAMPING = 2, + ETHTOOL_A_TSINFO_TX_TYPES = 3, + ETHTOOL_A_TSINFO_RX_FILTERS = 4, + ETHTOOL_A_TSINFO_PHC_INDEX = 5, + __ETHTOOL_A_TSINFO_CNT = 6, + ETHTOOL_A_TSINFO_MAX = 5, +}; + +enum { + ETHTOOL_A_PHC_VCLOCKS_UNSPEC = 0, + ETHTOOL_A_PHC_VCLOCKS_HEADER = 1, + ETHTOOL_A_PHC_VCLOCKS_NUM = 2, + ETHTOOL_A_PHC_VCLOCKS_INDEX = 3, + __ETHTOOL_A_PHC_VCLOCKS_CNT = 4, + ETHTOOL_A_PHC_VCLOCKS_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_HEADER = 1, + __ETHTOOL_A_CABLE_TEST_CNT = 2, + ETHTOOL_A_CABLE_TEST_MAX = 1, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_HEADER = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG = 2, + __ETHTOOL_A_CABLE_TEST_TDR_CNT = 3, + ETHTOOL_A_CABLE_TEST_TDR_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_INFO_UNSPEC = 0, + ETHTOOL_A_TUNNEL_INFO_HEADER = 1, + ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 2, + __ETHTOOL_A_TUNNEL_INFO_CNT = 3, + ETHTOOL_A_TUNNEL_INFO_MAX = 2, +}; + +enum { + ETHTOOL_A_FEC_UNSPEC = 0, + ETHTOOL_A_FEC_HEADER = 1, + ETHTOOL_A_FEC_MODES = 2, + ETHTOOL_A_FEC_AUTO = 3, + ETHTOOL_A_FEC_ACTIVE = 4, + ETHTOOL_A_FEC_STATS = 5, + __ETHTOOL_A_FEC_CNT = 6, + ETHTOOL_A_FEC_MAX = 5, +}; + +enum { + ETHTOOL_A_MODULE_EEPROM_UNSPEC = 0, + ETHTOOL_A_MODULE_EEPROM_HEADER = 1, + ETHTOOL_A_MODULE_EEPROM_OFFSET = 2, + ETHTOOL_A_MODULE_EEPROM_LENGTH = 3, + ETHTOOL_A_MODULE_EEPROM_PAGE = 4, + ETHTOOL_A_MODULE_EEPROM_BANK = 5, + ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS = 6, + ETHTOOL_A_MODULE_EEPROM_DATA = 7, + __ETHTOOL_A_MODULE_EEPROM_CNT = 8, + ETHTOOL_A_MODULE_EEPROM_MAX = 7, +}; + +enum { + ETHTOOL_STATS_ETH_PHY = 0, + ETHTOOL_STATS_ETH_MAC = 1, + ETHTOOL_STATS_ETH_CTRL = 2, + ETHTOOL_STATS_RMON = 3, + __ETHTOOL_STATS_CNT = 4, +}; + +enum { + ETHTOOL_A_STATS_ETH_PHY_5_SYM_ERR = 0, + __ETHTOOL_A_STATS_ETH_PHY_CNT = 1, + ETHTOOL_A_STATS_ETH_PHY_MAX = 0, +}; + +enum { + ETHTOOL_A_STATS_ETH_MAC_2_TX_PKT = 0, + ETHTOOL_A_STATS_ETH_MAC_3_SINGLE_COL = 1, + ETHTOOL_A_STATS_ETH_MAC_4_MULTI_COL = 2, + ETHTOOL_A_STATS_ETH_MAC_5_RX_PKT = 3, + ETHTOOL_A_STATS_ETH_MAC_6_FCS_ERR = 4, + ETHTOOL_A_STATS_ETH_MAC_7_ALIGN_ERR = 5, + ETHTOOL_A_STATS_ETH_MAC_8_TX_BYTES = 6, + ETHTOOL_A_STATS_ETH_MAC_9_TX_DEFER = 7, + ETHTOOL_A_STATS_ETH_MAC_10_LATE_COL = 8, + ETHTOOL_A_STATS_ETH_MAC_11_XS_COL = 9, + ETHTOOL_A_STATS_ETH_MAC_12_TX_INT_ERR = 10, + ETHTOOL_A_STATS_ETH_MAC_13_CS_ERR = 11, + ETHTOOL_A_STATS_ETH_MAC_14_RX_BYTES = 12, + ETHTOOL_A_STATS_ETH_MAC_15_RX_INT_ERR = 13, + ETHTOOL_A_STATS_ETH_MAC_18_TX_MCAST = 14, + ETHTOOL_A_STATS_ETH_MAC_19_TX_BCAST = 15, + ETHTOOL_A_STATS_ETH_MAC_20_XS_DEFER = 16, + ETHTOOL_A_STATS_ETH_MAC_21_RX_MCAST = 17, + ETHTOOL_A_STATS_ETH_MAC_22_RX_BCAST = 18, + ETHTOOL_A_STATS_ETH_MAC_23_IR_LEN_ERR = 19, + ETHTOOL_A_STATS_ETH_MAC_24_OOR_LEN = 20, + ETHTOOL_A_STATS_ETH_MAC_25_TOO_LONG_ERR = 21, + __ETHTOOL_A_STATS_ETH_MAC_CNT = 22, + ETHTOOL_A_STATS_ETH_MAC_MAX = 21, +}; + +enum { + ETHTOOL_A_STATS_ETH_CTRL_3_TX = 0, + ETHTOOL_A_STATS_ETH_CTRL_4_RX = 1, + ETHTOOL_A_STATS_ETH_CTRL_5_RX_UNSUP = 2, + __ETHTOOL_A_STATS_ETH_CTRL_CNT = 3, + ETHTOOL_A_STATS_ETH_CTRL_MAX = 2, +}; + +enum { + ETHTOOL_A_STATS_RMON_UNDERSIZE = 0, + ETHTOOL_A_STATS_RMON_OVERSIZE = 1, + ETHTOOL_A_STATS_RMON_FRAG = 2, + ETHTOOL_A_STATS_RMON_JABBER = 3, + __ETHTOOL_A_STATS_RMON_CNT = 4, + ETHTOOL_A_STATS_RMON_MAX = 3, +}; + +enum { + ETHTOOL_A_MODULE_UNSPEC = 0, + ETHTOOL_A_MODULE_HEADER = 1, + ETHTOOL_A_MODULE_POWER_MODE_POLICY = 2, + ETHTOOL_A_MODULE_POWER_MODE = 3, + __ETHTOOL_A_MODULE_CNT = 4, + ETHTOOL_A_MODULE_MAX = 3, +}; + +enum { + ETHTOOL_A_PSE_UNSPEC = 0, + ETHTOOL_A_PSE_HEADER = 1, + ETHTOOL_A_PODL_PSE_ADMIN_STATE = 2, + ETHTOOL_A_PODL_PSE_ADMIN_CONTROL = 3, + ETHTOOL_A_PODL_PSE_PW_D_STATUS = 4, + __ETHTOOL_A_PSE_CNT = 5, + ETHTOOL_A_PSE_MAX = 4, +}; + +enum { + ETHTOOL_A_RSS_UNSPEC = 0, + ETHTOOL_A_RSS_HEADER = 1, + ETHTOOL_A_RSS_CONTEXT = 2, + ETHTOOL_A_RSS_HFUNC = 3, + ETHTOOL_A_RSS_INDIR = 4, + ETHTOOL_A_RSS_HKEY = 5, + __ETHTOOL_A_RSS_CNT = 6, + ETHTOOL_A_RSS_MAX = 5, +}; + +enum { + ETHTOOL_A_PLCA_UNSPEC = 0, + ETHTOOL_A_PLCA_HEADER = 1, + ETHTOOL_A_PLCA_VERSION = 2, + ETHTOOL_A_PLCA_ENABLED = 3, + ETHTOOL_A_PLCA_STATUS = 4, + ETHTOOL_A_PLCA_NODE_CNT = 5, + ETHTOOL_A_PLCA_NODE_ID = 6, + ETHTOOL_A_PLCA_TO_TMR = 7, + ETHTOOL_A_PLCA_BURST_CNT = 8, + ETHTOOL_A_PLCA_BURST_TMR = 9, + __ETHTOOL_A_PLCA_CNT = 10, + ETHTOOL_A_PLCA_MAX = 9, +}; + +enum { + ETHTOOL_A_MM_UNSPEC = 0, + ETHTOOL_A_MM_HEADER = 1, + ETHTOOL_A_MM_PMAC_ENABLED = 2, + ETHTOOL_A_MM_TX_ENABLED = 3, + ETHTOOL_A_MM_TX_ACTIVE = 4, + ETHTOOL_A_MM_TX_MIN_FRAG_SIZE = 5, + ETHTOOL_A_MM_RX_MIN_FRAG_SIZE = 6, + ETHTOOL_A_MM_VERIFY_ENABLED = 7, + ETHTOOL_A_MM_VERIFY_STATUS = 8, + ETHTOOL_A_MM_VERIFY_TIME = 9, + ETHTOOL_A_MM_MAX_VERIFY_TIME = 10, + ETHTOOL_A_MM_STATS = 11, + __ETHTOOL_A_MM_CNT = 12, + ETHTOOL_A_MM_MAX = 11, +}; + +enum ethtool_multicast_groups { + ETHNL_MCGRP_MONITOR = 0, +}; + +struct ethnl_req_info { + struct net_device *dev; + netdevice_tracker dev_tracker; + u32 flags; +}; + +struct ethnl_reply_data { + struct net_device *dev; +}; + +struct ethnl_request_ops { + u8 request_cmd; + u8 reply_cmd; + u16 hdr_attr; + unsigned int req_info_size; + unsigned int reply_data_size; + bool allow_nodev_do; + u8 set_ntf_cmd; + int (*parse_request)(struct ethnl_req_info *, struct nlattr **, struct netlink_ext_ack *); + int (*prepare_data)(const struct ethnl_req_info *, struct ethnl_reply_data *, struct genl_info *); + int (*reply_size)(const struct ethnl_req_info *, const struct ethnl_reply_data *); + int (*fill_reply)(struct sk_buff *, const struct ethnl_req_info *, const struct ethnl_reply_data *); + void (*cleanup_data)(struct ethnl_reply_data *); + int (*set_validate)(struct ethnl_req_info *, struct genl_info *); + int (*set)(struct ethnl_req_info *, struct genl_info *); +}; + +struct ethnl_dump_ctx { + const struct ethnl_request_ops *ops; + struct ethnl_req_info *req_info; + struct ethnl_reply_data *reply_data; + int pos_hash; + int pos_idx; +}; + +typedef void (*ethnl_notify_handler_t)(struct net_device *, unsigned int, const void *); + +enum { + ETHTOOL_A_BITSET_BIT_UNSPEC = 0, + ETHTOOL_A_BITSET_BIT_INDEX = 1, + ETHTOOL_A_BITSET_BIT_NAME = 2, + ETHTOOL_A_BITSET_BIT_VALUE = 3, + __ETHTOOL_A_BITSET_BIT_CNT = 4, + ETHTOOL_A_BITSET_BIT_MAX = 3, +}; + +enum { + ETHTOOL_A_BITSET_BITS_UNSPEC = 0, + ETHTOOL_A_BITSET_BITS_BIT = 1, + __ETHTOOL_A_BITSET_BITS_CNT = 2, + ETHTOOL_A_BITSET_BITS_MAX = 1, +}; + +enum { + ETHTOOL_A_BITSET_UNSPEC = 0, + ETHTOOL_A_BITSET_NOMASK = 1, + ETHTOOL_A_BITSET_SIZE = 2, + ETHTOOL_A_BITSET_BITS = 3, + ETHTOOL_A_BITSET_VALUE = 4, + ETHTOOL_A_BITSET_MASK = 5, + __ETHTOOL_A_BITSET_CNT = 6, + ETHTOOL_A_BITSET_MAX = 5, +}; + +typedef const char (* const ethnl_string_array_t)[32]; + +enum { + ETHTOOL_A_STRING_UNSPEC = 0, + ETHTOOL_A_STRING_INDEX = 1, + ETHTOOL_A_STRING_VALUE = 2, + __ETHTOOL_A_STRING_CNT = 3, + ETHTOOL_A_STRING_MAX = 2, +}; + +enum { + ETHTOOL_A_STRINGS_UNSPEC = 0, + ETHTOOL_A_STRINGS_STRING = 1, + __ETHTOOL_A_STRINGS_CNT = 2, + ETHTOOL_A_STRINGS_MAX = 1, +}; + +enum { + ETHTOOL_A_STRINGSET_UNSPEC = 0, + ETHTOOL_A_STRINGSET_ID = 1, + ETHTOOL_A_STRINGSET_COUNT = 2, + ETHTOOL_A_STRINGSET_STRINGS = 3, + __ETHTOOL_A_STRINGSET_CNT = 4, + ETHTOOL_A_STRINGSET_MAX = 3, +}; + +enum { + ETHTOOL_A_STRINGSETS_UNSPEC = 0, + ETHTOOL_A_STRINGSETS_STRINGSET = 1, + __ETHTOOL_A_STRINGSETS_CNT = 2, + ETHTOOL_A_STRINGSETS_MAX = 1, +}; + +struct strset_info { + bool per_dev; + bool free_strings; + unsigned int count; + const char (*strings)[32]; +}; + +struct strset_req_info { + struct ethnl_req_info base; + u32 req_ids; + bool counts_only; +}; + +struct strset_reply_data { + struct ethnl_reply_data base; + struct strset_info sets[21]; +}; + +struct linkinfo_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; +}; + +struct linkmodes_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; + bool peer_empty; +}; + +struct rss_req_info { + struct ethnl_req_info base; + u32 rss_context; +}; + +struct rss_reply_data { + struct ethnl_reply_data base; + u32 indir_size; + u32 hkey_size; + u32 hfunc; + u32 *indir_table; + u8 *hkey; +}; + +struct linkstate_reply_data { + struct ethnl_reply_data base; + int link; + int sqi; + int sqi_max; + struct ethtool_link_ext_stats link_stats; + bool link_ext_state_provided; + struct ethtool_link_ext_state_info ethtool_link_ext_state_info; + long: 32; +}; + +struct debug_reply_data { + struct ethnl_reply_data base; + u32 msg_mask; +}; + +struct wol_reply_data { + struct ethnl_reply_data base; + struct ethtool_wolinfo wol; + bool show_sopass; +}; + +struct features_reply_data { + struct ethnl_reply_data base; + u32 hw[2]; + u32 wanted[2]; + u32 active[2]; + u32 nochange[2]; + u32 all[2]; +}; + +struct privflags_reply_data { + struct ethnl_reply_data base; + const char (*priv_flag_names)[32]; + unsigned int n_priv_flags; + u32 priv_flags; +}; + +enum ethtool_supported_ring_param { + ETHTOOL_RING_USE_RX_BUF_LEN = 1, + ETHTOOL_RING_USE_CQE_SIZE = 2, + ETHTOOL_RING_USE_TX_PUSH = 4, +}; + +enum { + ETHTOOL_TCP_DATA_SPLIT_UNKNOWN = 0, + ETHTOOL_TCP_DATA_SPLIT_DISABLED = 1, + ETHTOOL_TCP_DATA_SPLIT_ENABLED = 2, +}; + +struct rings_reply_data { + struct ethnl_reply_data base; + struct ethtool_ringparam ringparam; + struct kernel_ethtool_ringparam kernel_ringparam; +}; + +struct channels_reply_data { + struct ethnl_reply_data base; + struct ethtool_channels channels; +}; + +struct coalesce_reply_data { + struct ethnl_reply_data base; + struct ethtool_coalesce coalesce; + struct kernel_ethtool_coalesce kernel_coalesce; + u32 supported_params; +}; + +enum { + ETHTOOL_A_PAUSE_STAT_UNSPEC = 0, + ETHTOOL_A_PAUSE_STAT_PAD = 1, + ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 2, + ETHTOOL_A_PAUSE_STAT_RX_FRAMES = 3, + __ETHTOOL_A_PAUSE_STAT_CNT = 4, + ETHTOOL_A_PAUSE_STAT_MAX = 3, +}; + +struct pause_req_info { + struct ethnl_req_info base; + enum ethtool_mac_stats_src src; +}; + +struct pause_reply_data { + struct ethnl_reply_data base; + struct ethtool_pauseparam pauseparam; + long: 32; + struct ethtool_pause_stats pausestat; +}; + +struct eee_reply_data { + struct ethnl_reply_data base; + struct ethtool_eee eee; +}; + +struct tsinfo_reply_data { + struct ethnl_reply_data base; + struct ethtool_ts_info ts_info; +}; + +enum { + ETHTOOL_A_CABLE_PAIR_A = 0, + ETHTOOL_A_CABLE_PAIR_B = 1, + ETHTOOL_A_CABLE_PAIR_C = 2, + ETHTOOL_A_CABLE_PAIR_D = 3, +}; + +enum { + ETHTOOL_A_CABLE_RESULT_UNSPEC = 0, + ETHTOOL_A_CABLE_RESULT_PAIR = 1, + ETHTOOL_A_CABLE_RESULT_CODE = 2, + __ETHTOOL_A_CABLE_RESULT_CNT = 3, + ETHTOOL_A_CABLE_RESULT_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = 0, + ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = 1, + ETHTOOL_A_CABLE_FAULT_LENGTH_CM = 2, + __ETHTOOL_A_CABLE_FAULT_LENGTH_CNT = 3, + ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = 2, +}; + +enum { + ETHTOOL_A_CABLE_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_NEST_RESULT = 1, + ETHTOOL_A_CABLE_NEST_FAULT_LENGTH = 2, + __ETHTOOL_A_CABLE_NEST_CNT = 3, + ETHTOOL_A_CABLE_NEST_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_HEADER = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS = 2, + ETHTOOL_A_CABLE_TEST_NTF_NEST = 3, + __ETHTOOL_A_CABLE_TEST_NTF_CNT = 4, + ETHTOOL_A_CABLE_TEST_NTF_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = 2, + ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = 3, + ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = 4, + __ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT = 5, + ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = 4, +}; + +enum { + ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = 0, + ETHTOOL_A_CABLE_AMPLITUDE_PAIR = 1, + ETHTOOL_A_CABLE_AMPLITUDE_mV = 2, + __ETHTOOL_A_CABLE_AMPLITUDE_CNT = 3, + ETHTOOL_A_CABLE_AMPLITUDE_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_PULSE_UNSPEC = 0, + ETHTOOL_A_CABLE_PULSE_mV = 1, + __ETHTOOL_A_CABLE_PULSE_CNT = 2, + ETHTOOL_A_CABLE_PULSE_MAX = 1, +}; + +enum { + ETHTOOL_A_CABLE_STEP_UNSPEC = 0, + ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = 1, + ETHTOOL_A_CABLE_STEP_LAST_DISTANCE = 2, + ETHTOOL_A_CABLE_STEP_STEP_DISTANCE = 3, + __ETHTOOL_A_CABLE_STEP_CNT = 4, + ETHTOOL_A_CABLE_STEP_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TDR_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TDR_NEST_STEP = 1, + ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = 2, + ETHTOOL_A_CABLE_TDR_NEST_PULSE = 3, + __ETHTOOL_A_CABLE_TDR_NEST_CNT = 4, + ETHTOOL_A_CABLE_TDR_NEST_MAX = 3, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = 1, + ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = 2, + __ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT = 3, + ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = 1, + ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = 2, + ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = 3, + __ETHTOOL_A_TUNNEL_UDP_TABLE_CNT = 4, + ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = 3, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE = 1, + __ETHTOOL_A_TUNNEL_UDP_CNT = 2, + ETHTOOL_A_TUNNEL_UDP_MAX = 1, +}; + +enum udp_parsable_tunnel_type { + UDP_TUNNEL_TYPE_VXLAN = 1, + UDP_TUNNEL_TYPE_GENEVE = 2, + UDP_TUNNEL_TYPE_VXLAN_GPE = 4, +}; + +enum udp_tunnel_nic_info_flags { + UDP_TUNNEL_NIC_INFO_MAY_SLEEP = 1, + UDP_TUNNEL_NIC_INFO_OPEN_ONLY = 2, + UDP_TUNNEL_NIC_INFO_IPV4_ONLY = 4, + UDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN = 8, +}; + +struct udp_tunnel_nic_ops { + void (*get_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + void (*set_port_priv)(struct net_device *, unsigned int, unsigned int, u8); + void (*add_port)(struct net_device *, struct udp_tunnel_info *); + void (*del_port)(struct net_device *, struct udp_tunnel_info *); + void (*reset_ntf)(struct net_device *); + size_t (*dump_size)(struct net_device *, unsigned int); + int (*dump_write)(struct net_device *, unsigned int, struct sk_buff *); +}; + +struct ethnl_tunnel_info_dump_ctx { + struct ethnl_req_info req_info; + int pos_hash; + int pos_idx; +}; + +enum { + ETHTOOL_A_FEC_STAT_UNSPEC = 0, + ETHTOOL_A_FEC_STAT_PAD = 1, + ETHTOOL_A_FEC_STAT_CORRECTED = 2, + ETHTOOL_A_FEC_STAT_UNCORR = 3, + ETHTOOL_A_FEC_STAT_CORR_BITS = 4, + __ETHTOOL_A_FEC_STAT_CNT = 5, + ETHTOOL_A_FEC_STAT_MAX = 4, +}; + +struct fec_stat_grp { + u64 stats[9]; + u8 cnt; + long: 32; +}; + +struct fec_reply_data { + struct ethnl_reply_data base; + long unsigned int fec_link_modes[4]; + u32 active_fec; + u8 fec_auto; + long: 32; + struct fec_stat_grp corr; + struct fec_stat_grp uncorr; + struct fec_stat_grp corr_bits; +}; + +struct eeprom_req_info { + struct ethnl_req_info base; + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; +}; + +struct eeprom_reply_data { + struct ethnl_reply_data base; + u32 length; + u8 *data; +}; + +enum { + ETHTOOL_A_STATS_GRP_UNSPEC = 0, + ETHTOOL_A_STATS_GRP_PAD = 1, + ETHTOOL_A_STATS_GRP_ID = 2, + ETHTOOL_A_STATS_GRP_SS_ID = 3, + ETHTOOL_A_STATS_GRP_STAT = 4, + ETHTOOL_A_STATS_GRP_HIST_RX = 5, + ETHTOOL_A_STATS_GRP_HIST_TX = 6, + ETHTOOL_A_STATS_GRP_HIST_BKT_LOW = 7, + ETHTOOL_A_STATS_GRP_HIST_BKT_HI = 8, + ETHTOOL_A_STATS_GRP_HIST_VAL = 9, + __ETHTOOL_A_STATS_GRP_CNT = 10, + ETHTOOL_A_STATS_GRP_MAX = 5, +}; + +struct stats_req_info { + struct ethnl_req_info base; + long unsigned int stat_mask[1]; + enum ethtool_mac_stats_src src; +}; + +struct stats_reply_data { + struct ethnl_reply_data base; + long: 32; + union { + struct { + struct ethtool_eth_phy_stats phy_stats; + struct ethtool_eth_mac_stats mac_stats; + struct ethtool_eth_ctrl_stats ctrl_stats; + struct ethtool_rmon_stats rmon_stats; + }; + struct { + struct ethtool_eth_phy_stats phy_stats; + struct ethtool_eth_mac_stats mac_stats; + struct ethtool_eth_ctrl_stats ctrl_stats; + struct ethtool_rmon_stats rmon_stats; + } stats; + }; + const struct ethtool_rmon_hist_range *rmon_ranges; + long: 32; +}; + +struct phc_vclocks_reply_data { + struct ethnl_reply_data base; + int num; + int *index; +}; + +enum { + ETHTOOL_A_MM_STAT_UNSPEC = 0, + ETHTOOL_A_MM_STAT_PAD = 1, + ETHTOOL_A_MM_STAT_REASSEMBLY_ERRORS = 2, + ETHTOOL_A_MM_STAT_SMD_ERRORS = 3, + ETHTOOL_A_MM_STAT_REASSEMBLY_OK = 4, + ETHTOOL_A_MM_STAT_RX_FRAG_COUNT = 5, + ETHTOOL_A_MM_STAT_TX_FRAG_COUNT = 6, + ETHTOOL_A_MM_STAT_HOLD_COUNT = 7, + __ETHTOOL_A_MM_STAT_CNT = 8, + ETHTOOL_A_MM_STAT_MAX = 7, +}; + +struct mm_reply_data { + struct ethnl_reply_data base; + struct ethtool_mm_state state; + long: 32; + struct ethtool_mm_stats stats; +}; + +struct module_reply_data { + struct ethnl_reply_data base; + struct ethtool_module_power_mode_params power; +}; + +enum ethtool_podl_pse_admin_state { + ETHTOOL_PODL_PSE_ADMIN_STATE_UNKNOWN = 1, + ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED = 2, + ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED = 3, +}; + +enum ethtool_podl_pse_pw_d_status { + ETHTOOL_PODL_PSE_PW_D_STATUS_UNKNOWN = 1, + ETHTOOL_PODL_PSE_PW_D_STATUS_DISABLED = 2, + ETHTOOL_PODL_PSE_PW_D_STATUS_SEARCHING = 3, + ETHTOOL_PODL_PSE_PW_D_STATUS_DELIVERING = 4, + ETHTOOL_PODL_PSE_PW_D_STATUS_SLEEP = 5, + ETHTOOL_PODL_PSE_PW_D_STATUS_IDLE = 6, + ETHTOOL_PODL_PSE_PW_D_STATUS_ERROR = 7, +}; + +struct pse_control_config { + enum ethtool_podl_pse_admin_state admin_cotrol; +}; + +struct pse_control_status { + enum ethtool_podl_pse_admin_state podl_admin_state; + enum ethtool_podl_pse_pw_d_status podl_pw_status; +}; + +struct pse_reply_data { + struct ethnl_reply_data base; + struct pse_control_status status; +}; + +struct plca_reply_data { + struct ethnl_reply_data base; + struct phy_plca_cfg plca_cfg; + struct phy_plca_status plca_st; +}; + +struct nf_hook_entries_rcu_head { + struct callback_head head; + void *allocation; +}; + +struct nf_conn; + +enum nf_nat_manip_type; + +struct nf_nat_hook { + int (*parse_nat_setup)(struct nf_conn *, enum nf_nat_manip_type, const struct nlattr *); + void (*decode_session)(struct sk_buff *, struct flowi *); + unsigned int (*manip_pkt)(struct sk_buff *, struct nf_conn *, enum nf_nat_manip_type, enum ip_conntrack_dir); + void (*remove_nat_bysrc)(struct nf_conn *); +}; + +struct nf_conntrack_tuple; + +struct nf_ct_hook { + int (*update)(struct net *, struct sk_buff *); + void (*destroy)(struct nf_conntrack *); + bool (*get_tuple_skb)(struct nf_conntrack_tuple *, const struct sk_buff *); + void (*attach)(struct sk_buff *, const struct sk_buff *); +}; + +struct nfnl_ct_hook { + size_t (*build_size)(const struct nf_conn *); + int (*build)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, u_int16_t, u_int16_t); + int (*parse)(const struct nlattr *, struct nf_conn *); + int (*attach_expect)(const struct nlattr *, struct nf_conn *, u32, u32); + void (*seq_adjust)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, s32); +}; + +struct nf_queue_entry; + +struct nf_ipv6_ops { + void (*route_input)(struct sk_buff *); + int (*fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + int (*reroute)(struct sk_buff *, const struct nf_queue_entry *); +}; + +struct nf_queue_entry { + struct list_head list; + struct sk_buff *skb; + unsigned int id; + unsigned int hook_index; + struct net_device *physin; + struct net_device *physout; + struct nf_hook_state state; + u16 size; +}; + +struct nf_loginfo { + u_int8_t type; + union { + struct { + u_int32_t copy_len; + u_int16_t group; + u_int16_t qthreshold; + u_int16_t flags; + } ulog; + struct { + u_int8_t level; + u_int8_t logflags; + } log; + } u; +}; + +struct nf_log_buf { + unsigned int count; + char buf[1020]; +}; + +struct nf_bridge_info { + enum { + BRNF_PROTO_UNCHANGED = 0, + BRNF_PROTO_8021Q = 1, + BRNF_PROTO_PPPOE = 2, + } orig_proto: 8; + u8 pkt_otherhost: 1; + u8 in_prerouting: 1; + u8 bridged_dnat: 1; + __u16 frag_max_size; + struct net_device *physindev; + struct net_device *physoutdev; + union { + __be32 ipv4_daddr; + struct in6_addr ipv6_daddr; + char neigh_header[8]; + }; +}; + +struct ip_rt_info { + __be32 daddr; + __be32 saddr; + u_int8_t tos; + u_int32_t mark; +}; + +struct ip6_rt_info { + struct in6_addr daddr; + struct in6_addr saddr; + u_int32_t mark; +}; + +struct nf_queue_handler { + int (*outfn)(struct nf_queue_entry *, unsigned int); + void (*nf_hook_drop)(struct net *); +}; + +struct nf_sockopt_ops { + struct list_head list; + u_int8_t pf; + int set_optmin; + int set_optmax; + int (*set)(struct sock *, int, sockptr_t, unsigned int); + int get_optmin; + int get_optmax; + int (*get)(struct sock *, int, void *, int *); + struct module *owner; +}; + +struct ip_mreqn { + struct in_addr imr_multiaddr; + struct in_addr imr_address; + int imr_ifindex; +}; + +struct rtmsg { + unsigned char rtm_family; + unsigned char rtm_dst_len; + unsigned char rtm_src_len; + unsigned char rtm_tos; + unsigned char rtm_table; + unsigned char rtm_protocol; + unsigned char rtm_scope; + unsigned char rtm_type; + unsigned int rtm_flags; +}; + +struct rtvia { + __kernel_sa_family_t rtvia_family; + __u8 rtvia_addr[0]; +}; + +struct ip_sf_list; + +struct ip_mc_list { + struct in_device *interface; + __be32 multiaddr; + unsigned int sfmode; + struct ip_sf_list *sources; + struct ip_sf_list *tomb; + long unsigned int sfcount[2]; + union { + struct ip_mc_list *next; + struct ip_mc_list *next_rcu; + }; + struct ip_mc_list *next_hash; + struct timer_list timer; + int users; + refcount_t refcnt; + spinlock_t lock; + char tm_running; + char reporter; + char unsolicit_count; + char loaded; + unsigned char gsquery; + unsigned char crcount; + struct callback_head rcu; +}; + +struct ip_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + __be32 sl_addr[0]; +}; + +struct ip_mc_socklist { + struct ip_mc_socklist *next_rcu; + struct ip_mreqn multi; + unsigned int sfmode; + struct ip_sf_socklist *sflist; + struct callback_head rcu; +}; + +struct ip_sf_list { + struct ip_sf_list *sf_next; + long unsigned int sf_count[2]; + __be32 sf_inaddr; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; +}; + +typedef u8 dscp_t; + +struct ipv4_addr_key { + __be32 addr; + int vif; +}; + +struct inetpeer_addr { + union { + struct ipv4_addr_key a4; + struct in6_addr a6; + u32 key[4]; + }; + __u16 family; +}; + +struct inet_peer { + struct rb_node rb_node; + struct inetpeer_addr daddr; + u32 metrics[17]; + u32 rate_tokens; + u32 n_redirects; + long unsigned int rate_last; + union { + struct { + atomic_t rid; + }; + struct callback_head rcu; + }; + __u32 dtime; + refcount_t refcnt; +}; + +struct fib_rt_info { + struct fib_info *fi; + u32 tb_id; + __be32 dst; + int dst_len; + dscp_t dscp; + u8 type; + u8 offload: 1; + u8 trap: 1; + u8 offload_failed: 1; + u8 unused: 5; +}; + +struct uncached_list { + spinlock_t lock; + struct list_head head; + struct list_head quarantine; +}; + +struct ip_rt_acct { + __u32 o_bytes; + __u32 o_packets; + __u32 i_bytes; + __u32 i_packets; +}; + +struct rt_cache_stat { + unsigned int in_slow_tot; + unsigned int in_slow_mc; + unsigned int in_no_route; + unsigned int in_brd; + unsigned int in_martian_dst; + unsigned int in_martian_src; + unsigned int out_slow_tot; + unsigned int out_slow_mc; +}; + +struct fib_alias { + struct hlist_node fa_list; + struct fib_info *fa_info; + dscp_t fa_dscp; + u8 fa_type; + u8 fa_state; + u8 fa_slen; + u32 tb_id; + s16 fa_default; + u8 offload; + u8 trap; + u8 offload_failed; + struct callback_head rcu; +}; + +struct fib_prop { + int error; + u8 scope; +}; + +struct net_offload { + struct offload_callbacks callbacks; + unsigned int flags; +}; + +struct raw_hashinfo { + spinlock_t lock; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct hlist_nulls_head ht[256]; +}; + +enum ip_defrag_users { + IP_DEFRAG_LOCAL_DELIVER = 0, + IP_DEFRAG_CALL_RA_CHAIN = 1, + IP_DEFRAG_CONNTRACK_IN = 2, + __IP_DEFRAG_CONNTRACK_IN_END = 65537, + IP_DEFRAG_CONNTRACK_OUT = 65538, + __IP_DEFRAG_CONNTRACK_OUT_END = 131073, + IP_DEFRAG_CONNTRACK_BRIDGE_IN = 131074, + __IP_DEFRAG_CONNTRACK_BRIDGE_IN = 196609, + IP_DEFRAG_VS_IN = 196610, + IP_DEFRAG_VS_OUT = 196611, + IP_DEFRAG_VS_FWD = 196612, + IP_DEFRAG_AF_PACKET = 196613, + IP_DEFRAG_MACVLAN = 196614, +}; + +enum { + XFRM_DEV_OFFLOAD_UNSPECIFIED = 0, + XFRM_DEV_OFFLOAD_CRYPTO = 1, + XFRM_DEV_OFFLOAD_PACKET = 2, +}; + +enum { + INET_FRAG_FIRST_IN = 1, + INET_FRAG_LAST_IN = 2, + INET_FRAG_COMPLETE = 4, + INET_FRAG_HASH_DEAD = 8, + INET_FRAG_DROP = 16, +}; + +struct ipq { + struct inet_frag_queue q; + u8 ecn; + u16 max_df_size; + int iif; + unsigned int rid; + struct inet_peer *peer; +}; + +struct ip_options_data { + struct ip_options_rcu opt; + char data[40]; +}; + +struct ipcm_cookie { + struct sockcm_cookie sockc; + __be32 addr; + int oif; + struct ip_options_rcu *opt; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; + long: 32; +}; + +struct ip_fraglist_iter { + struct sk_buff *frag; + struct iphdr *iph; + int offset; + unsigned int hlen; +}; + +struct ip_frag_state { + bool DF; + unsigned int hlen; + unsigned int ll_rs; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + __be16 not_last_frag; +}; + +struct ip_reply_arg { + struct kvec iov[1]; + int flags; + __wsum csum; + int csumoffset; + int bound_dev_if; + u8 tos; + kuid_t uid; +}; + +struct ip_mreq_source { + __be32 imr_multiaddr; + __be32 imr_interface; + __be32 imr_sourceaddr; +}; + +struct ip_msfilter { + __be32 imsf_multiaddr; + __be32 imsf_interface; + __u32 imsf_fmode; + __u32 imsf_numsrc; + union { + __be32 imsf_slist[1]; + struct { + struct {} __empty_imsf_slist_flex; + __be32 imsf_slist_flex[0]; + }; + }; +}; + +struct group_req { + __u32 gr_interface; + struct __kernel_sockaddr_storage gr_group; +}; + +struct group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +}; + +struct group_filter { + union { + struct { + __u32 gf_interface_aux; + struct __kernel_sockaddr_storage gf_group_aux; + __u32 gf_fmode_aux; + __u32 gf_numsrc_aux; + struct __kernel_sockaddr_storage gf_slist[1]; + }; + struct { + __u32 gf_interface; + struct __kernel_sockaddr_storage gf_group; + __u32 gf_fmode; + __u32 gf_numsrc; + struct __kernel_sockaddr_storage gf_slist_flex[0]; + }; + }; +}; + +struct in_pktinfo { + int ipi_ifindex; + struct in_addr ipi_spec_dst; + struct in_addr ipi_addr; +}; + +struct compat_group_req { + __u32 gr_interface; + struct __kernel_sockaddr_storage gr_group; +}; + +struct compat_group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +}; + +struct compat_group_filter { + union { + struct { + __u32 gf_interface_aux; + struct __kernel_sockaddr_storage gf_group_aux; + __u32 gf_fmode_aux; + __u32 gf_numsrc_aux; + struct __kernel_sockaddr_storage gf_slist[1]; + }; + struct { + __u32 gf_interface; + struct __kernel_sockaddr_storage gf_group; + __u32 gf_fmode; + __u32 gf_numsrc; + struct __kernel_sockaddr_storage gf_slist_flex[0]; + }; + }; +}; + +struct tcpvegas_info { + __u32 tcpv_enabled; + __u32 tcpv_rttcnt; + __u32 tcpv_rtt; + __u32 tcpv_minrtt; +}; + +struct tcp_dctcp_info { + __u16 dctcp_enabled; + __u16 dctcp_ce_state; + __u32 dctcp_alpha; + __u32 dctcp_ab_ecn; + __u32 dctcp_ab_tot; +}; + +struct tcp_bbr_info { + __u32 bbr_bw_lo; + __u32 bbr_bw_hi; + __u32 bbr_min_rtt; + __u32 bbr_pacing_gain; + __u32 bbr_cwnd_gain; +}; + +union tcp_cc_info { + struct tcpvegas_info vegas; + struct tcp_dctcp_info dctcp; + struct tcp_bbr_info bbr; +}; + +enum inet_csk_ack_state_t { + ICSK_ACK_SCHED = 1, + ICSK_ACK_TIMER = 2, + ICSK_ACK_PUSHED = 4, + ICSK_ACK_PUSHED2 = 8, + ICSK_ACK_NOW = 16, +}; + +enum { + TCP_FLAG_CWR = 32768, + TCP_FLAG_ECE = 16384, + TCP_FLAG_URG = 8192, + TCP_FLAG_ACK = 4096, + TCP_FLAG_PSH = 2048, + TCP_FLAG_RST = 1024, + TCP_FLAG_SYN = 512, + TCP_FLAG_FIN = 256, + TCP_RESERVED_BITS = 15, + TCP_DATA_OFFSET = 240, +}; + +struct tcp_repair_opt { + __u32 opt_code; + __u32 opt_val; +}; + +struct tcp_repair_window { + __u32 snd_wl1; + __u32 snd_wnd; + __u32 max_window; + __u32 rcv_wnd; + __u32 rcv_wup; +}; + +enum { + TCP_NO_QUEUE = 0, + TCP_RECV_QUEUE = 1, + TCP_SEND_QUEUE = 2, + TCP_QUEUES_NR = 3, +}; + +struct tcp_info { + __u8 tcpi_state; + __u8 tcpi_ca_state; + __u8 tcpi_retransmits; + __u8 tcpi_probes; + __u8 tcpi_backoff; + __u8 tcpi_options; + __u8 tcpi_snd_wscale: 4; + __u8 tcpi_rcv_wscale: 4; + __u8 tcpi_delivery_rate_app_limited: 1; + __u8 tcpi_fastopen_client_fail: 2; + __u32 tcpi_rto; + __u32 tcpi_ato; + __u32 tcpi_snd_mss; + __u32 tcpi_rcv_mss; + __u32 tcpi_unacked; + __u32 tcpi_sacked; + __u32 tcpi_lost; + __u32 tcpi_retrans; + __u32 tcpi_fackets; + __u32 tcpi_last_data_sent; + __u32 tcpi_last_ack_sent; + __u32 tcpi_last_data_recv; + __u32 tcpi_last_ack_recv; + __u32 tcpi_pmtu; + __u32 tcpi_rcv_ssthresh; + __u32 tcpi_rtt; + __u32 tcpi_rttvar; + __u32 tcpi_snd_ssthresh; + __u32 tcpi_snd_cwnd; + __u32 tcpi_advmss; + __u32 tcpi_reordering; + __u32 tcpi_rcv_rtt; + __u32 tcpi_rcv_space; + __u32 tcpi_total_retrans; + __u64 tcpi_pacing_rate; + __u64 tcpi_max_pacing_rate; + __u64 tcpi_bytes_acked; + __u64 tcpi_bytes_received; + __u32 tcpi_segs_out; + __u32 tcpi_segs_in; + __u32 tcpi_notsent_bytes; + __u32 tcpi_min_rtt; + __u32 tcpi_data_segs_in; + __u32 tcpi_data_segs_out; + __u64 tcpi_delivery_rate; + __u64 tcpi_busy_time; + __u64 tcpi_rwnd_limited; + __u64 tcpi_sndbuf_limited; + __u32 tcpi_delivered; + __u32 tcpi_delivered_ce; + __u64 tcpi_bytes_sent; + __u64 tcpi_bytes_retrans; + __u32 tcpi_dsack_dups; + __u32 tcpi_reord_seen; + __u32 tcpi_rcv_ooopack; + __u32 tcpi_snd_wnd; + __u32 tcpi_rcv_wnd; + __u32 tcpi_rehash; +}; + +enum { + TCP_NLA_PAD = 0, + TCP_NLA_BUSY = 1, + TCP_NLA_RWND_LIMITED = 2, + TCP_NLA_SNDBUF_LIMITED = 3, + TCP_NLA_DATA_SEGS_OUT = 4, + TCP_NLA_TOTAL_RETRANS = 5, + TCP_NLA_PACING_RATE = 6, + TCP_NLA_DELIVERY_RATE = 7, + TCP_NLA_SND_CWND = 8, + TCP_NLA_REORDERING = 9, + TCP_NLA_MIN_RTT = 10, + TCP_NLA_RECUR_RETRANS = 11, + TCP_NLA_DELIVERY_RATE_APP_LMT = 12, + TCP_NLA_SNDQ_SIZE = 13, + TCP_NLA_CA_STATE = 14, + TCP_NLA_SND_SSTHRESH = 15, + TCP_NLA_DELIVERED = 16, + TCP_NLA_DELIVERED_CE = 17, + TCP_NLA_BYTES_SENT = 18, + TCP_NLA_BYTES_RETRANS = 19, + TCP_NLA_DSACK_DUPS = 20, + TCP_NLA_REORD_SEEN = 21, + TCP_NLA_SRTT = 22, + TCP_NLA_TIMEOUT_REHASH = 23, + TCP_NLA_BYTES_NOTSENT = 24, + TCP_NLA_EDT = 25, + TCP_NLA_TTL = 26, + TCP_NLA_REHASH = 27, +}; + +struct tcp_zerocopy_receive { + __u64 address; + __u32 length; + __u32 recv_skip_hint; + __u32 inq; + __s32 err; + __u64 copybuf_address; + __s32 copybuf_len; + __u32 flags; + __u64 msg_control; + __u64 msg_controllen; + __u32 msg_flags; + __u32 reserved; +}; + +struct static_key_false_deferred { + struct static_key_false key; + long unsigned int timeout; + struct delayed_work work; +}; + +enum { + BPF_TCP_ESTABLISHED = 1, + BPF_TCP_SYN_SENT = 2, + BPF_TCP_SYN_RECV = 3, + BPF_TCP_FIN_WAIT1 = 4, + BPF_TCP_FIN_WAIT2 = 5, + BPF_TCP_TIME_WAIT = 6, + BPF_TCP_CLOSE = 7, + BPF_TCP_CLOSE_WAIT = 8, + BPF_TCP_LAST_ACK = 9, + BPF_TCP_LISTEN = 10, + BPF_TCP_CLOSING = 11, + BPF_TCP_NEW_SYN_RECV = 12, + BPF_TCP_MAX_STATES = 13, +}; + +struct tcp_md5sig_pool { + struct ahash_request *md5_req; + void *scratch; +}; + +enum tcp_chrono { + TCP_CHRONO_UNSPEC = 0, + TCP_CHRONO_BUSY = 1, + TCP_CHRONO_RWND_LIMITED = 2, + TCP_CHRONO_SNDBUF_LIMITED = 3, + __TCP_CHRONO_MAX = 4, +}; + +enum { + TCP_CMSG_INQ = 1, + TCP_CMSG_TS = 2, +}; + +struct tcp_splice_state { + struct pipe_inode_info *pipe; + size_t len; + unsigned int flags; +}; + +enum tcp_fastopen_client_fail { + TFO_STATUS_UNSPEC = 0, + TFO_COOKIE_UNAVAILABLE = 1, + TFO_DATA_NOT_ACKED = 2, + TFO_SYN_RETRANSMITTED = 3, +}; + +struct tcp_sack_block_wire { + __be32 start_seq; + __be32 end_seq; +}; + +enum tcp_queue { + TCP_FRAG_IN_WRITE_QUEUE = 0, + TCP_FRAG_IN_RTX_QUEUE = 1, +}; + +enum tcp_ca_ack_event_flags { + CA_ACK_SLOWPATH = 1, + CA_ACK_WIN_UPDATE = 2, + CA_ACK_ECE = 4, +}; + +struct tcp_sacktag_state { + u64 first_sackt; + u64 last_sackt; + u32 reord; + u32 sack_delivered; + int flag; + unsigned int mss_now; + struct rate_sample *rate; + long: 32; +}; + +enum pkt_hash_types { + PKT_HASH_TYPE_NONE = 0, + PKT_HASH_TYPE_L2 = 1, + PKT_HASH_TYPE_L3 = 2, + PKT_HASH_TYPE_L4 = 3, +}; + +enum tsq_flags { + TSQF_THROTTLED = 1, + TSQF_QUEUED = 2, + TCPF_TSQ_DEFERRED = 4, + TCPF_WRITE_TIMER_DEFERRED = 8, + TCPF_DELACK_TIMER_DEFERRED = 16, + TCPF_MTU_REDUCED_DEFERRED = 32, +}; + +enum { + BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, + BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, +}; + +struct mptcp_out_options {}; + +struct tcp_out_options { + u16 options; + u16 mss; + u8 ws; + u8 num_sack_blocks; + u8 hash_size; + u8 bpf_opt_len; + __u8 *hash_location; + __u32 tsval; + __u32 tsecr; + struct tcp_fastopen_cookie *fastopen_cookie; + struct mptcp_out_options mptcp; +}; + +struct tsq_tasklet { + struct tasklet_struct tasklet; + struct list_head head; +}; + +struct tcp_md5sig { + struct __kernel_sockaddr_storage tcpm_addr; + __u8 tcpm_flags; + __u8 tcpm_prefixlen; + __u16 tcpm_keylen; + int tcpm_ifindex; + __u8 tcpm_key[80]; +}; + +struct icmp_err { + int errno; + unsigned int fatal: 1; +}; + +enum tcp_tw_status { + TCP_TW_SUCCESS = 0, + TCP_TW_RST = 1, + TCP_TW_ACK = 2, + TCP_TW_SYN = 3, +}; + +struct tcp4_pseudohdr { + __be32 saddr; + __be32 daddr; + __u8 pad; + __u8 protocol; + __be16 len; +}; + +enum tcp_seq_states { + TCP_SEQ_STATE_LISTENING = 0, + TCP_SEQ_STATE_ESTABLISHED = 1, +}; + +struct tcp_seq_afinfo { + sa_family_t family; +}; + +struct tcp_iter_state { + struct seq_net_private p; + enum tcp_seq_states state; + struct sock *syn_wait_sk; + int bucket; + int offset; + int sbucket; + int num; + long: 32; + loff_t last_pos; +}; + +struct bpf_tcp_iter_state { + struct tcp_iter_state state; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + struct sock **batch; + bool st_bucket_done; + long: 32; +}; + +struct bpf_iter__tcp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct sock_common *sk_common; + }; + uid_t uid; + long: 32; +}; + +enum tcp_metric_index { + TCP_METRIC_RTT = 0, + TCP_METRIC_RTTVAR = 1, + TCP_METRIC_SSTHRESH = 2, + TCP_METRIC_CWND = 3, + TCP_METRIC_REORDERING = 4, + TCP_METRIC_RTT_US = 5, + TCP_METRIC_RTTVAR_US = 6, + __TCP_METRIC_MAX = 7, +}; + +enum { + TCP_METRICS_ATTR_UNSPEC = 0, + TCP_METRICS_ATTR_ADDR_IPV4 = 1, + TCP_METRICS_ATTR_ADDR_IPV6 = 2, + TCP_METRICS_ATTR_AGE = 3, + TCP_METRICS_ATTR_TW_TSVAL = 4, + TCP_METRICS_ATTR_TW_TS_STAMP = 5, + TCP_METRICS_ATTR_VALS = 6, + TCP_METRICS_ATTR_FOPEN_MSS = 7, + TCP_METRICS_ATTR_FOPEN_SYN_DROPS = 8, + TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS = 9, + TCP_METRICS_ATTR_FOPEN_COOKIE = 10, + TCP_METRICS_ATTR_SADDR_IPV4 = 11, + TCP_METRICS_ATTR_SADDR_IPV6 = 12, + TCP_METRICS_ATTR_PAD = 13, + __TCP_METRICS_ATTR_MAX = 14, +}; + +enum { + TCP_METRICS_CMD_UNSPEC = 0, + TCP_METRICS_CMD_GET = 1, + TCP_METRICS_CMD_DEL = 2, + __TCP_METRICS_CMD_MAX = 3, +}; + +struct tcp_fastopen_metrics { + u16 mss; + u16 syn_loss: 10; + u16 try_exp: 2; + long unsigned int last_syn_loss; + struct tcp_fastopen_cookie cookie; +}; + +struct tcp_metrics_block { + struct tcp_metrics_block *tcpm_next; + possible_net_t tcpm_net; + struct inetpeer_addr tcpm_saddr; + struct inetpeer_addr tcpm_daddr; + long unsigned int tcpm_stamp; + u32 tcpm_lock; + u32 tcpm_vals[5]; + long: 32; + struct tcp_fastopen_metrics tcpm_fastopen; + struct callback_head callback_head; +}; + +struct tcpm_hash_bucket { + struct tcp_metrics_block *chain; +}; + +struct tcp_plb_state { + u8 consec_cong_rounds: 5; + u8 unused: 3; + u32 pause_until; +}; + +struct icmp_filter { + __u32 data; +}; + +struct raw_iter_state { + struct seq_net_private p; + int bucket; +}; + +struct raw_sock { + struct inet_sock inet; + struct icmp_filter filter; + u32 ipmr_table; +}; + +struct raw_frag_vec { + struct msghdr *msg; + union { + struct icmphdr icmph; + char c[1]; + } hdr; + int hlen; +}; + +struct ip_tunnel_encap { + u16 type; + u16 flags; + __be16 sport; + __be16 dport; +}; + +struct ip_tunnel_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi4 *); + int (*err_handler)(struct sk_buff *, u32); +}; + +struct udp_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + __u16 cscov; + __u8 partial_cov; +}; + +struct udp_dev_scratch { + u32 _tsize_state; +}; + +struct udp_seq_afinfo { + sa_family_t family; + struct udp_table *udp_table; +}; + +struct udp_iter_state { + struct seq_net_private p; + int bucket; + struct udp_seq_afinfo *bpf_seq_afinfo; +}; + +struct bpf_iter__udp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct udp_sock *udp_sk; + }; + uid_t uid; + long: 32; + int bucket; + long: 32; +}; + +struct inet_protosw { + struct list_head list; + short unsigned int type; + short unsigned int protocol; + struct proto *prot; + const struct proto_ops *ops; + unsigned char flags; +}; + +typedef struct sock * (*udp_lookup_t)(const struct sk_buff *, __be16, __be16); + +typedef struct sk_buff * (*gro_receive_t)(struct list_head *, struct sk_buff *); + +typedef struct sk_buff * (*gro_receive_sk_t)(struct sock *, struct list_head *, struct sk_buff *); + +struct arpreq { + struct sockaddr arp_pa; + struct sockaddr arp_ha; + int arp_flags; + struct sockaddr arp_netmask; + char arp_dev[16]; +}; + +typedef struct { + char ax25_call[7]; +} ax25_address; + +enum { + AX25_VALUES_IPDEFMODE = 0, + AX25_VALUES_AXDEFMODE = 1, + AX25_VALUES_BACKOFF = 2, + AX25_VALUES_CONMODE = 3, + AX25_VALUES_WINDOW = 4, + AX25_VALUES_EWINDOW = 5, + AX25_VALUES_T1 = 6, + AX25_VALUES_T2 = 7, + AX25_VALUES_T3 = 8, + AX25_VALUES_IDLE = 9, + AX25_VALUES_N2 = 10, + AX25_VALUES_PACLEN = 11, + AX25_VALUES_PROTOCOL = 12, + AX25_VALUES_DS_TIMEOUT = 13, + AX25_MAX_VALUES = 14, +}; + +enum ip_conntrack_status { + IPS_EXPECTED_BIT = 0, + IPS_EXPECTED = 1, + IPS_SEEN_REPLY_BIT = 1, + IPS_SEEN_REPLY = 2, + IPS_ASSURED_BIT = 2, + IPS_ASSURED = 4, + IPS_CONFIRMED_BIT = 3, + IPS_CONFIRMED = 8, + IPS_SRC_NAT_BIT = 4, + IPS_SRC_NAT = 16, + IPS_DST_NAT_BIT = 5, + IPS_DST_NAT = 32, + IPS_NAT_MASK = 48, + IPS_SEQ_ADJUST_BIT = 6, + IPS_SEQ_ADJUST = 64, + IPS_SRC_NAT_DONE_BIT = 7, + IPS_SRC_NAT_DONE = 128, + IPS_DST_NAT_DONE_BIT = 8, + IPS_DST_NAT_DONE = 256, + IPS_NAT_DONE_MASK = 384, + IPS_DYING_BIT = 9, + IPS_DYING = 512, + IPS_FIXED_TIMEOUT_BIT = 10, + IPS_FIXED_TIMEOUT = 1024, + IPS_TEMPLATE_BIT = 11, + IPS_TEMPLATE = 2048, + IPS_UNTRACKED_BIT = 12, + IPS_UNTRACKED = 4096, + IPS_NAT_CLASH_BIT = 12, + IPS_NAT_CLASH = 4096, + IPS_HELPER_BIT = 13, + IPS_HELPER = 8192, + IPS_OFFLOAD_BIT = 14, + IPS_OFFLOAD = 16384, + IPS_HW_OFFLOAD_BIT = 15, + IPS_HW_OFFLOAD = 32768, + IPS_UNCHANGEABLE_MASK = 56313, + __IPS_MAX_BIT = 16, +}; + +enum { + XFRM_LOOKUP_ICMP = 1, + XFRM_LOOKUP_QUEUE = 2, + XFRM_LOOKUP_KEEP_DST_REF = 4, +}; + +struct icmp_ext_hdr { + __u8 reserved1: 4; + __u8 version: 4; + __u8 reserved2; + __sum16 checksum; +}; + +struct icmp_extobj_hdr { + __be16 length; + __u8 class_num; + __u8 class_type; +}; + +struct icmp_ext_echo_ctype3_hdr { + __be16 afi; + __u8 addrlen; + __u8 reserved; +}; + +struct icmp_ext_echo_iio { + struct icmp_extobj_hdr extobj_hdr; + union { + char name[16]; + __be32 ifindex; + struct { + struct icmp_ext_echo_ctype3_hdr ctype3_hdr; + union { + __be32 ipv4_addr; + struct in6_addr ipv6_addr; + } ip_addr; + } addr; + } ident; +}; + +struct icmp_bxm { + struct sk_buff *skb; + int offset; + int data_len; + struct { + struct icmphdr icmph; + __be32 times[3]; + } data; + int head_len; + struct ip_options_data replyopts; +}; + +struct icmp_control { + enum skb_drop_reason (*handler)(struct sk_buff *); + short int error; +}; + +struct ifaddrmsg { + __u8 ifa_family; + __u8 ifa_prefixlen; + __u8 ifa_flags; + __u8 ifa_scope; + __u32 ifa_index; +}; + +enum { + IFA_UNSPEC = 0, + IFA_ADDRESS = 1, + IFA_LOCAL = 2, + IFA_LABEL = 3, + IFA_BROADCAST = 4, + IFA_ANYCAST = 5, + IFA_CACHEINFO = 6, + IFA_MULTICAST = 7, + IFA_FLAGS = 8, + IFA_RT_PRIORITY = 9, + IFA_TARGET_NETNSID = 10, + IFA_PROTO = 11, + __IFA_MAX = 12, +}; + +struct ifa_cacheinfo { + __u32 ifa_prefered; + __u32 ifa_valid; + __u32 cstamp; + __u32 tstamp; +}; + +enum { + IFLA_INET_UNSPEC = 0, + IFLA_INET_CONF = 1, + __IFLA_INET_MAX = 2, +}; + +struct in_validator_info { + __be32 ivi_addr; + struct in_device *ivi_dev; + struct netlink_ext_ack *extack; +}; + +struct netconfmsg { + __u8 ncm_family; +}; + +enum { + NETCONFA_UNSPEC = 0, + NETCONFA_IFINDEX = 1, + NETCONFA_FORWARDING = 2, + NETCONFA_RP_FILTER = 3, + NETCONFA_MC_FORWARDING = 4, + NETCONFA_PROXY_NEIGH = 5, + NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN = 6, + NETCONFA_INPUT = 7, + NETCONFA_BC_FORWARDING = 8, + __NETCONFA_MAX = 9, +}; + +struct inet_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; +}; + +struct devinet_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table devinet_vars[34]; +}; + +struct rtentry { + long unsigned int rt_pad1; + struct sockaddr rt_dst; + struct sockaddr rt_gateway; + struct sockaddr rt_genmask; + short unsigned int rt_flags; + short int rt_pad2; + long unsigned int rt_pad3; + void *rt_pad4; + short int rt_metric; + char *rt_dev; + long unsigned int rt_mtu; + long unsigned int rt_window; + short unsigned int rt_irtt; +}; + +struct pingv6_ops { + int (*ipv6_recv_error)(struct sock *, struct msghdr *, int, int *); + void (*ip6_datagram_recv_common_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + void (*ip6_datagram_recv_specific_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + int (*icmpv6_err_convert)(u8, u8, int *); + void (*ipv6_icmp_error)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + int (*ipv6_chk_addr)(struct net *, const struct in6_addr *, const struct net_device *, int); +}; + +struct igmphdr { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; +}; + +struct igmpv3_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + __be32 grec_mca; + __be32 grec_src[0]; +}; + +struct igmpv3_report { + __u8 type; + __u8 resv1; + __sum16 csum; + __be16 resv2; + __be16 ngrec; + struct igmpv3_grec grec[0]; +}; + +struct igmpv3_query { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; + __u8 qrv: 3; + __u8 suppress: 1; + __u8 resv: 4; + __u8 qqic; + __be16 nsrcs; + __be32 srcs[0]; +}; + +struct igmp_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *in_dev; +}; + +struct igmp_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *idev; + struct ip_mc_list *im; +}; + +struct fib_config { + u8 fc_dst_len; + dscp_t fc_dscp; + u8 fc_protocol; + u8 fc_scope; + u8 fc_type; + u8 fc_gw_family; + u32 fc_table; + __be32 fc_dst; + union { + __be32 fc_gw4; + struct in6_addr fc_gw6; + }; + int fc_oif; + u32 fc_flags; + u32 fc_priority; + __be32 fc_prefsrc; + u32 fc_nh_id; + struct nlattr *fc_mx; + struct rtnexthop *fc_mp; + int fc_mx_len; + int fc_mp_len; + u32 fc_flow; + u32 fc_nlflags; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; +}; + +struct fib_result_nl { + __be32 fl_addr; + u32 fl_mark; + unsigned char fl_tos; + unsigned char fl_scope; + unsigned char tb_id_in; + unsigned char tb_id; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + int err; +}; + +struct fib_dump_filter { + u32 table_id; + bool filter_set; + bool dump_routes; + bool dump_exceptions; + unsigned char protocol; + unsigned char rt_type; + unsigned int flags; + struct net_device *dev; +}; + +struct fib_nh_notifier_info { + struct fib_notifier_info info; + struct fib_nh *fib_nh; +}; + +struct fib_entry_notifier_info { + struct fib_notifier_info info; + u32 dst; + int dst_len; + struct fib_info *fi; + dscp_t dscp; + u8 type; + u32 tb_id; +}; + +typedef unsigned int t_key; + +struct key_vector { + t_key key; + unsigned char pos; + unsigned char bits; + unsigned char slen; + union { + struct hlist_head leaf; + struct { + struct {} __empty_tnode; + struct key_vector *tnode[0]; + }; + }; +}; + +struct tnode { + struct callback_head rcu; + t_key empty_children; + t_key full_children; + struct key_vector *parent; + struct key_vector kv[1]; +}; + +struct trie_use_stats { + unsigned int gets; + unsigned int backtrack; + unsigned int semantic_match_passed; + unsigned int semantic_match_miss; + unsigned int null_node_hit; + unsigned int resize_node_skipped; +}; + +struct trie_stat { + unsigned int totdepth; + unsigned int maxdepth; + unsigned int tnodes; + unsigned int leaves; + unsigned int nullpointers; + unsigned int prefixes; + unsigned int nodesizes[32]; +}; + +struct trie { + struct key_vector kv[1]; + struct trie_use_stats *stats; +}; + +struct fib_trie_iter { + struct seq_net_private p; + struct fib_table *tb; + struct key_vector *tnode; + unsigned int index; + unsigned int depth; +}; + +struct fib_route_iter { + struct seq_net_private p; + struct fib_table *main_tb; + struct key_vector *tnode; + long: 32; + loff_t pos; + t_key key; + long: 32; +}; + +struct ipfrag_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + }; + struct sk_buff *next_frag; + int frag_run_len; +}; + +struct icmpv6_echo { + __be16 identifier; + __be16 sequence; +}; + +struct icmpv6_nd_advt { + __u32 reserved: 5; + __u32 override: 1; + __u32 solicited: 1; + __u32 router: 1; + __u32 reserved2: 24; +}; + +struct icmpv6_nd_ra { + __u8 hop_limit; + __u8 reserved: 3; + __u8 router_pref: 2; + __u8 home_agent: 1; + __u8 other: 1; + __u8 managed: 1; + __be16 rt_lifetime; +}; + +struct icmp6hdr { + __u8 icmp6_type; + __u8 icmp6_code; + __sum16 icmp6_cksum; + union { + __be32 un_data32[1]; + __be16 un_data16[2]; + __u8 un_data8[4]; + struct icmpv6_echo u_echo; + struct icmpv6_nd_advt u_nd_advt; + struct icmpv6_nd_ra u_nd_ra; + } icmp6_dataun; +}; + +struct ping_iter_state { + struct seq_net_private p; + int bucket; + sa_family_t family; +}; + +struct pingfakehdr { + struct icmphdr icmph; + struct msghdr *msg; + sa_family_t family; + __wsum wcheck; +}; + +struct ping_table { + struct hlist_nulls_head hash[64]; + spinlock_t lock; +}; + +enum lwtunnel_ip_t { + LWTUNNEL_IP_UNSPEC = 0, + LWTUNNEL_IP_ID = 1, + LWTUNNEL_IP_DST = 2, + LWTUNNEL_IP_SRC = 3, + LWTUNNEL_IP_TTL = 4, + LWTUNNEL_IP_TOS = 5, + LWTUNNEL_IP_FLAGS = 6, + LWTUNNEL_IP_PAD = 7, + LWTUNNEL_IP_OPTS = 8, + __LWTUNNEL_IP_MAX = 9, +}; + +enum lwtunnel_ip6_t { + LWTUNNEL_IP6_UNSPEC = 0, + LWTUNNEL_IP6_ID = 1, + LWTUNNEL_IP6_DST = 2, + LWTUNNEL_IP6_SRC = 3, + LWTUNNEL_IP6_HOPLIMIT = 4, + LWTUNNEL_IP6_TC = 5, + LWTUNNEL_IP6_FLAGS = 6, + LWTUNNEL_IP6_PAD = 7, + LWTUNNEL_IP6_OPTS = 8, + __LWTUNNEL_IP6_MAX = 9, +}; + +enum { + LWTUNNEL_IP_OPTS_UNSPEC = 0, + LWTUNNEL_IP_OPTS_GENEVE = 1, + LWTUNNEL_IP_OPTS_VXLAN = 2, + LWTUNNEL_IP_OPTS_ERSPAN = 3, + __LWTUNNEL_IP_OPTS_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_GENEVE_UNSPEC = 0, + LWTUNNEL_IP_OPT_GENEVE_CLASS = 1, + LWTUNNEL_IP_OPT_GENEVE_TYPE = 2, + LWTUNNEL_IP_OPT_GENEVE_DATA = 3, + __LWTUNNEL_IP_OPT_GENEVE_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_VXLAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_VXLAN_GBP = 1, + __LWTUNNEL_IP_OPT_VXLAN_MAX = 2, +}; + +enum { + LWTUNNEL_IP_OPT_ERSPAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_ERSPAN_VER = 1, + LWTUNNEL_IP_OPT_ERSPAN_INDEX = 2, + LWTUNNEL_IP_OPT_ERSPAN_DIR = 3, + LWTUNNEL_IP_OPT_ERSPAN_HWID = 4, + __LWTUNNEL_IP_OPT_ERSPAN_MAX = 5, +}; + +enum { + IFLA_IPTUN_UNSPEC = 0, + IFLA_IPTUN_LINK = 1, + IFLA_IPTUN_LOCAL = 2, + IFLA_IPTUN_REMOTE = 3, + IFLA_IPTUN_TTL = 4, + IFLA_IPTUN_TOS = 5, + IFLA_IPTUN_ENCAP_LIMIT = 6, + IFLA_IPTUN_FLOWINFO = 7, + IFLA_IPTUN_FLAGS = 8, + IFLA_IPTUN_PROTO = 9, + IFLA_IPTUN_PMTUDISC = 10, + IFLA_IPTUN_6RD_PREFIX = 11, + IFLA_IPTUN_6RD_RELAY_PREFIX = 12, + IFLA_IPTUN_6RD_PREFIXLEN = 13, + IFLA_IPTUN_6RD_RELAY_PREFIXLEN = 14, + IFLA_IPTUN_ENCAP_TYPE = 15, + IFLA_IPTUN_ENCAP_FLAGS = 16, + IFLA_IPTUN_ENCAP_SPORT = 17, + IFLA_IPTUN_ENCAP_DPORT = 18, + IFLA_IPTUN_COLLECT_METADATA = 19, + IFLA_IPTUN_FWMARK = 20, + __IFLA_IPTUN_MAX = 21, +}; + +struct ip6_tnl_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi6 *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); +}; + +struct geneve_opt { + __be16 opt_class; + u8 type; + u8 length: 5; + u8 r3: 1; + u8 r2: 1; + u8 r1: 1; + u8 opt_data[0]; +}; + +struct vxlan_metadata { + u32 gbp; +}; + +struct erspan_md2 { + __be32 timestamp; + __be16 sgt; + __u8 hwid_upper: 2; + __u8 ft: 5; + __u8 p: 1; + __u8 o: 1; + __u8 gra: 2; + __u8 dir: 1; + __u8 hwid: 4; +}; + +struct erspan_metadata { + int version; + union { + __be32 index; + struct erspan_md2 md2; + } u; +}; + +struct nhmsg { + unsigned char nh_family; + unsigned char nh_scope; + unsigned char nh_protocol; + unsigned char resvd; + unsigned int nh_flags; +}; + +struct nexthop_grp { + __u32 id; + __u8 weight; + __u8 resvd1; + __u16 resvd2; +}; + +enum { + NEXTHOP_GRP_TYPE_MPATH = 0, + NEXTHOP_GRP_TYPE_RES = 1, + __NEXTHOP_GRP_TYPE_MAX = 2, +}; + +enum { + NHA_UNSPEC = 0, + NHA_ID = 1, + NHA_GROUP = 2, + NHA_GROUP_TYPE = 3, + NHA_BLACKHOLE = 4, + NHA_OIF = 5, + NHA_GATEWAY = 6, + NHA_ENCAP_TYPE = 7, + NHA_ENCAP = 8, + NHA_GROUPS = 9, + NHA_MASTER = 10, + NHA_FDB = 11, + NHA_RES_GROUP = 12, + NHA_RES_BUCKET = 13, + __NHA_MAX = 14, +}; + +enum { + NHA_RES_GROUP_UNSPEC = 0, + NHA_RES_GROUP_PAD = 0, + NHA_RES_GROUP_BUCKETS = 1, + NHA_RES_GROUP_IDLE_TIMER = 2, + NHA_RES_GROUP_UNBALANCED_TIMER = 3, + NHA_RES_GROUP_UNBALANCED_TIME = 4, + __NHA_RES_GROUP_MAX = 5, +}; + +enum { + NHA_RES_BUCKET_UNSPEC = 0, + NHA_RES_BUCKET_PAD = 0, + NHA_RES_BUCKET_INDEX = 1, + NHA_RES_BUCKET_IDLE_TIME = 2, + NHA_RES_BUCKET_NH_ID = 3, + __NHA_RES_BUCKET_MAX = 4, +}; + +struct nh_config { + u32 nh_id; + u8 nh_family; + u8 nh_protocol; + u8 nh_blackhole; + u8 nh_fdb; + u32 nh_flags; + int nh_ifindex; + struct net_device *dev; + union { + __be32 ipv4; + struct in6_addr ipv6; + } gw; + struct nlattr *nh_grp; + u16 nh_grp_type; + u16 nh_grp_res_num_buckets; + long unsigned int nh_grp_res_idle_timer; + long unsigned int nh_grp_res_unbalanced_timer; + bool nh_grp_res_has_num_buckets; + bool nh_grp_res_has_idle_timer; + bool nh_grp_res_has_unbalanced_timer; + struct nlattr *nh_encap; + u16 nh_encap_type; + u32 nlflags; + struct nl_info nlinfo; +}; + +enum nexthop_event_type { + NEXTHOP_EVENT_DEL = 0, + NEXTHOP_EVENT_REPLACE = 1, + NEXTHOP_EVENT_RES_TABLE_PRE_REPLACE = 2, + NEXTHOP_EVENT_BUCKET_REPLACE = 3, +}; + +enum nh_notifier_info_type { + NH_NOTIFIER_INFO_TYPE_SINGLE = 0, + NH_NOTIFIER_INFO_TYPE_GRP = 1, + NH_NOTIFIER_INFO_TYPE_RES_TABLE = 2, + NH_NOTIFIER_INFO_TYPE_RES_BUCKET = 3, +}; + +struct nh_notifier_single_info { + struct net_device *dev; + u8 gw_family; + union { + __be32 ipv4; + struct in6_addr ipv6; + }; + u8 is_reject: 1; + u8 is_fdb: 1; + u8 has_encap: 1; +}; + +struct nh_notifier_grp_entry_info { + u8 weight; + u32 id; + struct nh_notifier_single_info nh; +}; + +struct nh_notifier_grp_info { + u16 num_nh; + bool is_fdb; + struct nh_notifier_grp_entry_info nh_entries[0]; +}; + +struct nh_notifier_res_bucket_info { + u16 bucket_index; + unsigned int idle_timer_ms; + bool force; + struct nh_notifier_single_info old_nh; + struct nh_notifier_single_info new_nh; +}; + +struct nh_notifier_res_table_info { + u16 num_nh_buckets; + struct nh_notifier_single_info nhs[0]; +}; + +struct nh_notifier_info { + struct net *net; + struct netlink_ext_ack *extack; + u32 id; + enum nh_notifier_info_type type; + union { + struct nh_notifier_single_info *nh; + struct nh_notifier_grp_info *nh_grp; + struct nh_notifier_res_table_info *nh_res_table; + struct nh_notifier_res_bucket_info *nh_res_bucket; + }; +}; + +struct nh_dump_filter { + u32 nh_id; + int dev_idx; + int master_idx; + bool group_filter; + bool fdb_filter; + u32 res_bucket_nh_id; +}; + +struct rtm_dump_nh_ctx { + u32 idx; +}; + +struct rtm_dump_res_bucket_ctx { + struct rtm_dump_nh_ctx nh; + u16 bucket_index; + u32 done_nh_idx; +}; + +struct rtm_dump_nexthop_bucket_data { + struct rtm_dump_res_bucket_ctx *ctx; + struct nh_dump_filter filter; +}; + +struct snmp_mib { + const char *name; + int entry; +}; + +struct fib4_rule { + struct fib_rule common; + u8 dst_len; + u8 src_len; + dscp_t dscp; + __be32 src; + __be32 srcmask; + __be32 dst; + __be32 dstmask; + u32 tclassid; +}; + +enum { + PIM_TYPE_HELLO = 0, + PIM_TYPE_REGISTER = 1, + PIM_TYPE_REGISTER_STOP = 2, + PIM_TYPE_JOIN_PRUNE = 3, + PIM_TYPE_BOOTSTRAP = 4, + PIM_TYPE_ASSERT = 5, + PIM_TYPE_GRAFT = 6, + PIM_TYPE_GRAFT_ACK = 7, + PIM_TYPE_CANDIDATE_RP_ADV = 8, +}; + +struct pimreghdr { + __u8 type; + __u8 reserved; + __be16 csum; + __be32 flags; +}; + +typedef short unsigned int vifi_t; + +struct vifctl { + vifi_t vifc_vifi; + unsigned char vifc_flags; + unsigned char vifc_threshold; + unsigned int vifc_rate_limit; + union { + struct in_addr vifc_lcl_addr; + int vifc_lcl_ifindex; + }; + struct in_addr vifc_rmt_addr; +}; + +struct mfcctl { + struct in_addr mfcc_origin; + struct in_addr mfcc_mcastgrp; + vifi_t mfcc_parent; + unsigned char mfcc_ttls[32]; + unsigned int mfcc_pkt_cnt; + unsigned int mfcc_byte_cnt; + unsigned int mfcc_wrong_if; + int mfcc_expire; +}; + +struct sioc_sg_req { + struct in_addr src; + struct in_addr grp; + long unsigned int pktcnt; + long unsigned int bytecnt; + long unsigned int wrong_if; +}; + +struct sioc_vif_req { + vifi_t vifi; + long unsigned int icount; + long unsigned int ocount; + long unsigned int ibytes; + long unsigned int obytes; +}; + +struct igmpmsg { + __u32 unused1; + __u32 unused2; + unsigned char im_msgtype; + unsigned char im_mbz; + unsigned char im_vif; + unsigned char im_vif_hi; + struct in_addr im_src; + struct in_addr im_dst; +}; + +enum { + IPMRA_TABLE_UNSPEC = 0, + IPMRA_TABLE_ID = 1, + IPMRA_TABLE_CACHE_RES_QUEUE_LEN = 2, + IPMRA_TABLE_MROUTE_REG_VIF_NUM = 3, + IPMRA_TABLE_MROUTE_DO_ASSERT = 4, + IPMRA_TABLE_MROUTE_DO_PIM = 5, + IPMRA_TABLE_VIFS = 6, + IPMRA_TABLE_MROUTE_DO_WRVIFWHOLE = 7, + __IPMRA_TABLE_MAX = 8, +}; + +enum { + IPMRA_VIF_UNSPEC = 0, + IPMRA_VIF = 1, + __IPMRA_VIF_MAX = 2, +}; + +enum { + IPMRA_VIFA_UNSPEC = 0, + IPMRA_VIFA_IFINDEX = 1, + IPMRA_VIFA_VIF_ID = 2, + IPMRA_VIFA_FLAGS = 3, + IPMRA_VIFA_BYTES_IN = 4, + IPMRA_VIFA_BYTES_OUT = 5, + IPMRA_VIFA_PACKETS_IN = 6, + IPMRA_VIFA_PACKETS_OUT = 7, + IPMRA_VIFA_LOCAL_ADDR = 8, + IPMRA_VIFA_REMOTE_ADDR = 9, + IPMRA_VIFA_PAD = 10, + __IPMRA_VIFA_MAX = 11, +}; + +enum { + IPMRA_CREPORT_UNSPEC = 0, + IPMRA_CREPORT_MSGTYPE = 1, + IPMRA_CREPORT_VIF_ID = 2, + IPMRA_CREPORT_SRC_ADDR = 3, + IPMRA_CREPORT_DST_ADDR = 4, + IPMRA_CREPORT_PKT = 5, + IPMRA_CREPORT_TABLE = 6, + __IPMRA_CREPORT_MAX = 7, +}; + +struct vif_device { + struct net_device *dev; + netdevice_tracker dev_tracker; + long unsigned int bytes_in; + long unsigned int bytes_out; + long unsigned int pkt_in; + long unsigned int pkt_out; + long unsigned int rate_limit; + unsigned char threshold; + short unsigned int flags; + int link; + struct netdev_phys_item_id dev_parent_id; + __be32 local; + __be32 remote; +}; + +struct vif_entry_notifier_info { + struct fib_notifier_info info; + struct net_device *dev; + short unsigned int vif_index; + short unsigned int vif_flags; + u32 tb_id; +}; + +enum { + MFC_STATIC = 1, + MFC_OFFLOAD = 2, +}; + +struct mr_mfc { + struct rhlist_head mnode; + short unsigned int mfc_parent; + int mfc_flags; + union { + struct { + long unsigned int expires; + struct sk_buff_head unresolved; + } unres; + struct { + long unsigned int last_assert; + int minvif; + int maxvif; + long unsigned int bytes; + long unsigned int pkt; + long unsigned int wrong_if; + long unsigned int lastuse; + unsigned char ttls[32]; + refcount_t refcount; + } res; + } mfc_un; + struct list_head list; + struct callback_head rcu; + void (*free)(struct callback_head *); +}; + +struct mfc_entry_notifier_info { + struct fib_notifier_info info; + struct mr_mfc *mfc; + u32 tb_id; +}; + +struct mr_table_ops { + const struct rhashtable_params *rht_params; + void *cmparg_any; +}; + +struct mr_table { + struct list_head list; + possible_net_t net; + struct mr_table_ops ops; + u32 id; + struct sock *mroute_sk; + struct timer_list ipmr_expire_timer; + struct list_head mfc_unres_queue; + struct vif_device vif_table[32]; + struct rhltable mfc_hash; + struct list_head mfc_cache_list; + int maxvif; + atomic_t cache_resolve_queue_len; + bool mroute_do_assert; + bool mroute_do_pim; + bool mroute_do_wrvifwhole; + int mroute_reg_vif_num; +}; + +struct mr_vif_iter { + struct seq_net_private p; + struct mr_table *mrt; + int ct; +}; + +struct mr_mfc_iter { + struct seq_net_private p; + struct mr_table *mrt; + struct list_head *cache; + spinlock_t *lock; +}; + +struct mfc_cache_cmp_arg { + __be32 mfc_mcastgrp; + __be32 mfc_origin; +}; + +struct mfc_cache { + struct mr_mfc _c; + union { + struct { + __be32 mfc_mcastgrp; + __be32 mfc_origin; + }; + struct mfc_cache_cmp_arg cmparg; + }; +}; + +struct ipmr_result { + struct mr_table *mrt; +}; + +struct rta_mfc_stats { + __u64 mfcs_packets; + __u64 mfcs_bytes; + __u64 mfcs_wrong_if; +}; + +struct bictcp { + u32 cnt; + u32 last_max_cwnd; + u32 last_cwnd; + u32 last_time; + u32 bic_origin_point; + u32 bic_K; + u32 delay_min; + u32 epoch_start; + u32 ack_cnt; + u32 tcp_cwnd; + u16 unused; + u8 sample_cnt; + u8 found; + u32 round_start; + u32 end_seq; + u32 last_ack; + u32 curr_rtt; +}; + +struct tx_work { + struct delayed_work work; + struct sock *sk; +}; + +struct tls_rec; + +struct tls_sw_context_tx { + struct crypto_aead *aead_send; + struct crypto_wait async_wait; + struct tx_work tx_work; + struct tls_rec *open_rec; + struct list_head tx_list; + atomic_t encrypt_pending; + spinlock_t encrypt_compl_lock; + int async_notify; + u8 async_capable: 1; + long unsigned int tx_bitmask; +}; + +enum { + TCP_BPF_IPV4 = 0, + TCP_BPF_IPV6 = 1, + TCP_BPF_NUM_PROTS = 2, +}; + +enum { + TCP_BPF_BASE = 0, + TCP_BPF_TX = 1, + TCP_BPF_RX = 2, + TCP_BPF_TXRX = 3, + TCP_BPF_NUM_CFGS = 4, +}; + +enum { + UDP_BPF_IPV4 = 0, + UDP_BPF_IPV6 = 1, + UDP_BPF_NUM_PROTS = 2, +}; + +struct netlbl_audit { + u32 secid; + kuid_t loginuid; + unsigned int sessionid; +}; + +struct cipso_v4_std_map_tbl { + struct { + u32 *cipso; + u32 *local; + u32 cipso_size; + u32 local_size; + } lvl; + struct { + u32 *cipso; + u32 *local; + u32 cipso_size; + u32 local_size; + } cat; +}; + +struct cipso_v4_doi { + u32 doi; + u32 type; + union { + struct cipso_v4_std_map_tbl *std; + } map; + u8 tags[5]; + refcount_t refcount; + struct list_head list; + struct callback_head rcu; +}; + +struct cipso_v4_map_cache_bkt { + spinlock_t lock; + u32 size; + struct list_head list; +}; + +struct cipso_v4_map_cache_entry { + u32 hash; + unsigned char *key; + size_t key_len; + struct netlbl_lsm_cache *lsm_data; + u32 activity; + struct list_head list; +}; + +struct xfrm_policy_afinfo { + struct dst_ops *dst_ops; + struct dst_entry * (*dst_lookup)(struct net *, int, int, const xfrm_address_t *, const xfrm_address_t *, u32); + int (*get_saddr)(struct net *, int, xfrm_address_t *, xfrm_address_t *, u32); + int (*fill_dst)(struct xfrm_dst *, struct net_device *, const struct flowi *); + struct dst_entry * (*blackhole_route)(struct net *, struct dst_entry *); +}; + +struct xfrm_state_afinfo { + u8 family; + u8 proto; + const struct xfrm_type_offload *type_offload_esp; + const struct xfrm_type *type_esp; + const struct xfrm_type *type_ipip; + const struct xfrm_type *type_ipip6; + const struct xfrm_type *type_comp; + const struct xfrm_type *type_ah; + const struct xfrm_type *type_routing; + const struct xfrm_type *type_dstopts; + int (*output)(struct net *, struct sock *, struct sk_buff *); + int (*transport_finish)(struct sk_buff *, int); + void (*local_error)(struct sk_buff *, u32); +}; + +struct ip_tunnel; + +struct ip6_tnl; + +struct xfrm_tunnel_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + union { + struct ip_tunnel *ip4; + struct ip6_tnl *ip6; + } tunnel; +}; + +struct xfrm_mode_skb_cb { + struct xfrm_tunnel_skb_cb header; + __be16 id; + __be16 frag_off; + u8 ihl; + u8 tos; + u8 ttl; + u8 protocol; + u8 optlen; + u8 flow_lbl[3]; +}; + +struct xfrm_spi_skb_cb { + struct xfrm_tunnel_skb_cb header; + unsigned int daddroff; + unsigned int family; + __be32 seq; +}; + +struct xfrm_input_afinfo { + u8 family; + bool is_ipip; + int (*callback)(struct sk_buff *, u8, int); +}; + +struct xfrm4_protocol { + int (*handler)(struct sk_buff *); + int (*input_handler)(struct sk_buff *, int, __be32, int); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, u32); + struct xfrm4_protocol *next; + int priority; +}; + +typedef u64 (*btf_bpf_tcp_send_ack)(struct tcp_sock *, u32); + +enum { + XFRM_STATE_VOID = 0, + XFRM_STATE_ACQ = 1, + XFRM_STATE_VALID = 2, + XFRM_STATE_ERROR = 3, + XFRM_STATE_EXPIRED = 4, + XFRM_STATE_DEAD = 5, +}; + +struct xfrm_if_decode_session_result { + struct net *net; + u32 if_id; +}; + +struct xfrm_if_cb { + bool (*decode_session)(struct sk_buff *, short unsigned int, struct xfrm_if_decode_session_result *); +}; + +struct xfrm_policy_walk { + struct xfrm_policy_walk_entry walk; + u8 type; + u32 seq; +}; + +struct xfrm_kmaddress { + xfrm_address_t local; + xfrm_address_t remote; + u32 reserved; + u16 family; +}; + +struct xfrm_migrate { + xfrm_address_t old_daddr; + xfrm_address_t old_saddr; + xfrm_address_t new_daddr; + xfrm_address_t new_saddr; + u8 proto; + u8 mode; + u16 reserved; + u32 reqid; + u16 old_family; + u16 new_family; +}; + +struct xfrmk_spdinfo { + u32 incnt; + u32 outcnt; + u32 fwdcnt; + u32 inscnt; + u32 outscnt; + u32 fwdscnt; + u32 spdhcnt; + u32 spdhmcnt; +}; + +struct ip6_mh { + __u8 ip6mh_proto; + __u8 ip6mh_hdrlen; + __u8 ip6mh_type; + __u8 ip6mh_reserved; + __u16 ip6mh_cksum; + __u8 data[0]; +}; + +struct xfrm_flo { + struct dst_entry *dst_orig; + u8 flags; +}; + +struct xfrm_pol_inexact_node { + struct rb_node node; + union { + xfrm_address_t addr; + struct callback_head rcu; + }; + u8 prefixlen; + struct rb_root root; + struct hlist_head hhead; +}; + +struct xfrm_pol_inexact_key { + possible_net_t net; + u32 if_id; + u16 family; + u8 dir; + u8 type; +}; + +struct xfrm_pol_inexact_bin { + struct xfrm_pol_inexact_key k; + struct rhash_head head; + struct hlist_head hhead; + seqcount_spinlock_t count; + struct rb_root root_d; + struct rb_root root_s; + struct list_head inexact_bins; + struct callback_head rcu; +}; + +enum xfrm_pol_inexact_candidate_type { + XFRM_POL_CAND_BOTH = 0, + XFRM_POL_CAND_SADDR = 1, + XFRM_POL_CAND_DADDR = 2, + XFRM_POL_CAND_ANY = 3, + XFRM_POL_CAND_MAX = 4, +}; + +struct xfrm_pol_inexact_candidates { + struct hlist_head *res[4]; +}; + +enum xfrm_ae_ftype_t { + XFRM_AE_UNSPEC = 0, + XFRM_AE_RTHR = 1, + XFRM_AE_RVAL = 2, + XFRM_AE_LVAL = 4, + XFRM_AE_ETHR = 8, + XFRM_AE_CR = 16, + XFRM_AE_CE = 32, + XFRM_AE_CU = 64, + __XFRM_AE_MAX = 65, +}; + +enum xfrm_nlgroups { + XFRMNLGRP_NONE = 0, + XFRMNLGRP_ACQUIRE = 1, + XFRMNLGRP_EXPIRE = 2, + XFRMNLGRP_SA = 3, + XFRMNLGRP_POLICY = 4, + XFRMNLGRP_AEVENTS = 5, + XFRMNLGRP_REPORT = 6, + XFRMNLGRP_MIGRATE = 7, + XFRMNLGRP_MAPPING = 8, + __XFRMNLGRP_MAX = 9, +}; + +enum { + XFRM_MODE_FLAG_TUNNEL = 1, +}; + +struct km_event { + union { + u32 hard; + u32 proto; + u32 byid; + u32 aevent; + u32 type; + } data; + u32 seq; + u32 portid; + u32 event; + struct net *net; +}; + +struct xfrm_mgr { + struct list_head list; + int (*notify)(struct xfrm_state *, const struct km_event *); + int (*acquire)(struct xfrm_state *, struct xfrm_tmpl *, struct xfrm_policy *); + struct xfrm_policy * (*compile_policy)(struct sock *, int, u8 *, int, int *); + int (*new_mapping)(struct xfrm_state *, xfrm_address_t *, __be16); + int (*notify_policy)(struct xfrm_policy *, int, const struct km_event *); + int (*report)(struct net *, u8, struct xfrm_selector *, xfrm_address_t *); + int (*migrate)(const struct xfrm_selector *, u8, u8, const struct xfrm_migrate *, int, const struct xfrm_kmaddress *, const struct xfrm_encap_tmpl *); + bool (*is_alive)(const struct km_event *); +}; + +struct xfrmk_sadinfo { + u32 sadhcnt; + u32 sadhmcnt; + u32 sadcnt; +}; + +struct xfrm_translator { + int (*alloc_compat)(struct sk_buff *, const struct nlmsghdr *); + struct nlmsghdr * (*rcv_msg_compat)(const struct nlmsghdr *, int, const struct nla_policy *, struct netlink_ext_ack *); + int (*xlate_user_policy_sockptr)(u8 **, int); + struct module *owner; +}; + +struct ip_beet_phdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 padlen; + __u8 reserved; +}; + +struct ip_tunnel_6rd_parm { + struct in6_addr prefix; + __be32 relay_prefix; + u16 prefixlen; + u16 relay_prefixlen; +}; + +struct ip_tunnel_prl_entry; + +struct ip_tunnel { + struct ip_tunnel *next; + struct hlist_node hash_node; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net *net; + long unsigned int err_time; + int err_count; + u32 i_seqno; + atomic_t o_seqno; + int tun_hlen; + u32 index; + u8 erspan_ver; + u8 dir; + u16 hwid; + struct dst_cache dst_cache; + struct ip_tunnel_parm parms; + int mlink; + int encap_hlen; + int hlen; + struct ip_tunnel_encap encap; + struct ip_tunnel_6rd_parm ip6rd; + struct ip_tunnel_prl_entry *prl; + unsigned int prl_count; + unsigned int ip_tnl_net_id; + struct gro_cells gro_cells; + __u32 fwmark; + bool collect_md; + bool ignore_df; +}; + +struct __ip6_tnl_parm { + char name[16]; + int link; + __u8 proto; + __u8 encap_limit; + __u8 hop_limit; + bool collect_md; + __be32 flowinfo; + __u32 flags; + struct in6_addr laddr; + struct in6_addr raddr; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + __u32 fwmark; + __u32 index; + __u8 erspan_ver; + __u8 dir; + __u16 hwid; +}; + +struct ip6_tnl { + struct ip6_tnl *next; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net *net; + struct __ip6_tnl_parm parms; + long: 32; + struct flowi fl; + struct dst_cache dst_cache; + struct gro_cells gro_cells; + int err_count; + long unsigned int err_time; + __u32 i_seqno; + atomic_t o_seqno; + int hlen; + int tun_hlen; + int encap_hlen; + struct ip_tunnel_encap encap; + int mlink; + long: 32; +}; + +struct xfrm_skb_cb { + struct xfrm_tunnel_skb_cb header; + union { + struct { + __u32 low; + __u32 hi; + } output; + struct { + __be32 low; + __be32 hi; + } input; + } seq; +}; + +struct ip_tunnel_prl_entry { + struct ip_tunnel_prl_entry *next; + __be32 addr; + u16 flags; + struct callback_head callback_head; +}; + +struct xfrm_trans_tasklet { + struct work_struct work; + spinlock_t queue_lock; + struct sk_buff_head queue; +}; + +struct xfrm_trans_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + int (*finish)(struct net *, struct sock *, struct sk_buff *); + struct net *net; +}; + +struct xfrm_user_offload { + int ifindex; + __u8 flags; +}; + +enum { + XFRM_DEV_OFFLOAD_IN = 1, + XFRM_DEV_OFFLOAD_OUT = 2, + XFRM_DEV_OFFLOAD_FWD = 3, +}; + +struct unix_stream_read_state { + int (*recv_actor)(struct sk_buff *, int, int, struct unix_stream_read_state *); + struct socket *socket; + struct msghdr *msg; + struct pipe_inode_info *pipe; + size_t size; + int flags; + unsigned int splice_flags; +}; + +struct bpf_unix_iter_state { + struct seq_net_private p; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + struct sock **batch; + bool st_bucket_done; +}; + +struct bpf_iter__unix { + union { + struct bpf_iter_meta *meta; + }; + union { + struct unix_sock *unix_sk; + }; + uid_t uid; + long: 32; +}; + +struct ioam6_pernet_data { + struct mutex lock; + struct rhashtable namespaces; + struct rhashtable schemas; +}; + +struct ipv6_params { + __s32 disable_ipv6; + __s32 autoconf; +}; + +enum flowlabel_reflect { + FLOWLABEL_REFLECT_ESTABLISHED = 1, + FLOWLABEL_REFLECT_TCP_RESET = 2, + FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES = 4, +}; + +struct in6_rtmsg { + struct in6_addr rtmsg_dst; + struct in6_addr rtmsg_src; + struct in6_addr rtmsg_gateway; + __u32 rtmsg_type; + __u16 rtmsg_dst_len; + __u16 rtmsg_src_len; + __u32 rtmsg_metric; + long unsigned int rtmsg_info; + __u32 rtmsg_flags; + int rtmsg_ifindex; +}; + +struct ac6_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; +}; + +struct hop_jumbo_hdr { + u8 nexthdr; + u8 hdrlen; + u8 tlv_type; + u8 tlv_len; + __be32 jumbo_payload_len; +}; + +struct ip6_fraglist_iter { + struct ipv6hdr *tmp_hdr; + struct sk_buff *frag; + int offset; + unsigned int hlen; + __be32 frag_id; + u8 nexthdr; +}; + +struct ip6_frag_state { + u8 *prevhdr; + unsigned int hlen; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + int hroom; + int troom; + __be32 frag_id; + u8 nexthdr; +}; + +struct ip6_ra_chain { + struct ip6_ra_chain *next; + struct sock *sk; + int sel; + void (*destructor)(struct sock *); +}; + +struct ipcm6_cookie { + struct sockcm_cookie sockc; + __s16 hlimit; + __s16 tclass; + __u16 gso_size; + __s8 dontfrag; + struct ipv6_txoptions *opt; + long: 32; +}; + +struct inet6_protocol { + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + unsigned int flags; +}; + +enum { + IFLA_INET6_UNSPEC = 0, + IFLA_INET6_FLAGS = 1, + IFLA_INET6_CONF = 2, + IFLA_INET6_STATS = 3, + IFLA_INET6_MCAST = 4, + IFLA_INET6_CACHEINFO = 5, + IFLA_INET6_ICMP6STATS = 6, + IFLA_INET6_TOKEN = 7, + IFLA_INET6_ADDR_GEN_MODE = 8, + IFLA_INET6_RA_MTU = 9, + __IFLA_INET6_MAX = 10, +}; + +enum in6_addr_gen_mode { + IN6_ADDR_GEN_MODE_EUI64 = 0, + IN6_ADDR_GEN_MODE_NONE = 1, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY = 2, + IN6_ADDR_GEN_MODE_RANDOM = 3, +}; + +struct ifla_cacheinfo { + __u32 max_reasm_len; + __u32 tstamp; + __u32 reachable_time; + __u32 retrans_time; +}; + +struct wpan_phy; + +struct wpan_dev_header_ops; + +struct wpan_dev { + struct wpan_phy *wpan_phy; + int iftype; + struct list_head list; + struct net_device *netdev; + const struct wpan_dev_header_ops *header_ops; + struct net_device *lowpan_dev; + u32 identifier; + __le16 pan_id; + __le16 short_addr; + long: 32; + __le64 extended_addr; + atomic_t bsn; + atomic_t dsn; + u8 min_be; + u8 max_be; + u8 csma_retries; + s8 frame_retries; + bool lbt; + bool ackreq; +}; + +struct prefixmsg { + unsigned char prefix_family; + unsigned char prefix_pad1; + short unsigned int prefix_pad2; + int prefix_ifindex; + unsigned char prefix_type; + unsigned char prefix_len; + unsigned char prefix_flags; + unsigned char prefix_pad3; +}; + +enum { + PREFIX_UNSPEC = 0, + PREFIX_ADDRESS = 1, + PREFIX_CACHEINFO = 2, + __PREFIX_MAX = 3, +}; + +struct prefix_cacheinfo { + __u32 preferred_time; + __u32 valid_time; +}; + +struct in6_ifreq { + struct in6_addr ifr6_addr; + __u32 ifr6_prefixlen; + int ifr6_ifindex; +}; + +enum { + DEVCONF_FORWARDING = 0, + DEVCONF_HOPLIMIT = 1, + DEVCONF_MTU6 = 2, + DEVCONF_ACCEPT_RA = 3, + DEVCONF_ACCEPT_REDIRECTS = 4, + DEVCONF_AUTOCONF = 5, + DEVCONF_DAD_TRANSMITS = 6, + DEVCONF_RTR_SOLICITS = 7, + DEVCONF_RTR_SOLICIT_INTERVAL = 8, + DEVCONF_RTR_SOLICIT_DELAY = 9, + DEVCONF_USE_TEMPADDR = 10, + DEVCONF_TEMP_VALID_LFT = 11, + DEVCONF_TEMP_PREFERED_LFT = 12, + DEVCONF_REGEN_MAX_RETRY = 13, + DEVCONF_MAX_DESYNC_FACTOR = 14, + DEVCONF_MAX_ADDRESSES = 15, + DEVCONF_FORCE_MLD_VERSION = 16, + DEVCONF_ACCEPT_RA_DEFRTR = 17, + DEVCONF_ACCEPT_RA_PINFO = 18, + DEVCONF_ACCEPT_RA_RTR_PREF = 19, + DEVCONF_RTR_PROBE_INTERVAL = 20, + DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN = 21, + DEVCONF_PROXY_NDP = 22, + DEVCONF_OPTIMISTIC_DAD = 23, + DEVCONF_ACCEPT_SOURCE_ROUTE = 24, + DEVCONF_MC_FORWARDING = 25, + DEVCONF_DISABLE_IPV6 = 26, + DEVCONF_ACCEPT_DAD = 27, + DEVCONF_FORCE_TLLAO = 28, + DEVCONF_NDISC_NOTIFY = 29, + DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL = 30, + DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL = 31, + DEVCONF_SUPPRESS_FRAG_NDISC = 32, + DEVCONF_ACCEPT_RA_FROM_LOCAL = 33, + DEVCONF_USE_OPTIMISTIC = 34, + DEVCONF_ACCEPT_RA_MTU = 35, + DEVCONF_STABLE_SECRET = 36, + DEVCONF_USE_OIF_ADDRS_ONLY = 37, + DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT = 38, + DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 39, + DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 40, + DEVCONF_DROP_UNSOLICITED_NA = 41, + DEVCONF_KEEP_ADDR_ON_DOWN = 42, + DEVCONF_RTR_SOLICIT_MAX_INTERVAL = 43, + DEVCONF_SEG6_ENABLED = 44, + DEVCONF_SEG6_REQUIRE_HMAC = 45, + DEVCONF_ENHANCED_DAD = 46, + DEVCONF_ADDR_GEN_MODE = 47, + DEVCONF_DISABLE_POLICY = 48, + DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN = 49, + DEVCONF_NDISC_TCLASS = 50, + DEVCONF_RPL_SEG_ENABLED = 51, + DEVCONF_RA_DEFRTR_METRIC = 52, + DEVCONF_IOAM6_ENABLED = 53, + DEVCONF_IOAM6_ID = 54, + DEVCONF_IOAM6_ID_WIDE = 55, + DEVCONF_NDISC_EVICT_NOCARRIER = 56, + DEVCONF_ACCEPT_UNTRACKED_NA = 57, + DEVCONF_MAX = 58, +}; + +enum { + INET6_IFADDR_STATE_PREDAD = 0, + INET6_IFADDR_STATE_DAD = 1, + INET6_IFADDR_STATE_POSTDAD = 2, + INET6_IFADDR_STATE_ERRDAD = 3, + INET6_IFADDR_STATE_DEAD = 4, +}; + +enum ieee802154_filtering_level { + IEEE802154_FILTERING_NONE = 0, + IEEE802154_FILTERING_1_FCS = 1, + IEEE802154_FILTERING_2_PROMISCUOUS = 2, + IEEE802154_FILTERING_3_SCAN = 3, + IEEE802154_FILTERING_4_FRAME_FIELDS = 4, +}; + +enum nl802154_cca_modes { + __NL802154_CCA_INVALID = 0, + NL802154_CCA_ENERGY = 1, + NL802154_CCA_CARRIER = 2, + NL802154_CCA_ENERGY_CARRIER = 3, + NL802154_CCA_ALOHA = 4, + NL802154_CCA_UWB_SHR = 5, + NL802154_CCA_UWB_MULTIPLEXED = 6, + __NL802154_CCA_ATTR_AFTER_LAST = 7, + NL802154_CCA_ATTR_MAX = 6, +}; + +enum nl802154_cca_opts { + NL802154_CCA_OPT_ENERGY_CARRIER_AND = 0, + NL802154_CCA_OPT_ENERGY_CARRIER_OR = 1, + __NL802154_CCA_OPT_ATTR_AFTER_LAST = 2, + NL802154_CCA_OPT_ATTR_MAX = 1, +}; + +enum nl802154_supported_bool_states { + NL802154_SUPPORTED_BOOL_FALSE = 0, + NL802154_SUPPORTED_BOOL_TRUE = 1, + __NL802154_SUPPORTED_BOOL_INVALD = 2, + NL802154_SUPPORTED_BOOL_BOTH = 3, + __NL802154_SUPPORTED_BOOL_AFTER_LAST = 4, + NL802154_SUPPORTED_BOOL_MAX = 3, +}; + +struct wpan_phy_supported { + u32 channels[32]; + u32 cca_modes; + u32 cca_opts; + u32 iftypes; + enum nl802154_supported_bool_states lbt; + u8 min_minbe; + u8 max_minbe; + u8 min_maxbe; + u8 max_maxbe; + u8 min_csma_backoffs; + u8 max_csma_backoffs; + s8 min_frame_retries; + s8 max_frame_retries; + size_t tx_powers_size; + size_t cca_ed_levels_size; + const s32 *tx_powers; + const s32 *cca_ed_levels; +}; + +struct wpan_phy_cca { + enum nl802154_cca_modes mode; + enum nl802154_cca_opts opt; +}; + +struct wpan_phy { + const void *privid; + long unsigned int flags; + u8 current_channel; + u8 current_page; + struct wpan_phy_supported supported; + s32 transmit_power; + struct wpan_phy_cca cca; + __le64 perm_extended_addr; + s32 cca_ed_level; + u32 symbol_duration; + u16 lifs_period; + u16 sifs_period; + long: 32; + struct device dev; + possible_net_t _net; + spinlock_t queue_lock; + atomic_t ongoing_txs; + atomic_t hold_txs; + wait_queue_head_t sync_txq; + enum ieee802154_filtering_level filtering; + char priv[0]; +}; + +struct ieee802154_addr { + u8 mode; + __le16 pan_id; + long: 32; + union { + __le16 short_addr; + __le64 extended_addr; + }; +}; + +struct wpan_dev_header_ops { + int (*create)(struct sk_buff *, struct net_device *, const struct ieee802154_addr *, const struct ieee802154_addr *, unsigned int); +}; + +union fwnet_hwaddr { + u8 u[16]; + struct { + __be64 uniq_id; + u8 max_rec; + u8 sspd; + u8 fifo[6]; + } uc; +}; + +struct in6_validator_info { + struct in6_addr i6vi_addr; + struct inet6_dev *i6vi_dev; + struct netlink_ext_ack *extack; +}; + +struct ifa6_config { + const struct in6_addr *pfx; + unsigned int plen; + u8 ifa_proto; + const struct in6_addr *peer_pfx; + u32 rt_priority; + u32 ifa_flags; + u32 preferred_lft; + u32 valid_lft; + u16 scope; +}; + +enum cleanup_prefix_rt_t { + CLEANUP_PREFIX_RT_NOP = 0, + CLEANUP_PREFIX_RT_DEL = 1, + CLEANUP_PREFIX_RT_EXPIRE = 2, +}; + +enum { + IPV6_SADDR_RULE_INIT = 0, + IPV6_SADDR_RULE_LOCAL = 1, + IPV6_SADDR_RULE_SCOPE = 2, + IPV6_SADDR_RULE_PREFERRED = 3, + IPV6_SADDR_RULE_HOA = 4, + IPV6_SADDR_RULE_OIF = 5, + IPV6_SADDR_RULE_LABEL = 6, + IPV6_SADDR_RULE_PRIVACY = 7, + IPV6_SADDR_RULE_ORCHID = 8, + IPV6_SADDR_RULE_PREFIX = 9, + IPV6_SADDR_RULE_NOT_OPTIMISTIC = 10, + IPV6_SADDR_RULE_MAX = 11, +}; + +struct ipv6_saddr_score { + int rule; + int addr_type; + struct inet6_ifaddr *ifa; + long unsigned int scorebits[1]; + int scopedist; + int matchlen; +}; + +struct ipv6_saddr_dst { + const struct in6_addr *addr; + int ifindex; + int scope; + int label; + unsigned int prefs; +}; + +struct if6_iter_state { + struct seq_net_private p; + int bucket; + int offset; +}; + +enum addr_type_t { + UNICAST_ADDR = 0, + MULTICAST_ADDR = 1, + ANYCAST_ADDR = 2, +}; + +struct inet6_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; + enum addr_type_t type; +}; + +enum { + DAD_PROCESS = 0, + DAD_BEGIN = 1, + DAD_ABORT = 2, +}; + +struct ifaddrlblmsg { + __u8 ifal_family; + __u8 __ifal_reserved; + __u8 ifal_prefixlen; + __u8 ifal_flags; + __u32 ifal_index; + __u32 ifal_seq; +}; + +enum { + IFAL_ADDRESS = 1, + IFAL_LABEL = 2, + __IFAL_MAX = 3, +}; + +struct ip6addrlbl_entry { + struct in6_addr prefix; + int prefixlen; + int ifindex; + int addrtype; + u32 label; + struct hlist_node list; + struct callback_head rcu; +}; + +struct ip6addrlbl_init_table { + const struct in6_addr *prefix; + int prefixlen; + u32 label; +}; + +struct fib6_gc_args { + int timeout; + int more; +}; + +struct rt6_exception { + struct hlist_node hlist; + struct rt6_info *rt6i; + long unsigned int stamp; + struct callback_head rcu; +}; + +typedef struct rt6_info * (*pol_lookup_t)(struct net *, struct fib6_table *, struct flowi6 *, const struct sk_buff *, int); + +struct rd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + struct in6_addr dest; + __u8 opt[0]; +}; + +struct route_info { + __u8 type; + __u8 length; + __u8 prefix_len; + __u8 reserved_l: 3; + __u8 route_pref: 2; + __u8 reserved_h: 3; + __be32 lifetime; + __u8 prefix[0]; +}; + +struct rt6_rtnl_dump_arg { + struct sk_buff *skb; + struct netlink_callback *cb; + struct net *net; + struct fib_dump_filter filter; +}; + +struct netevent_redirect { + struct dst_entry *old; + struct dst_entry *new; + struct neighbour *neigh; + const void *daddr; +}; + +struct trace_event_raw_fib6_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[16]; + __u8 dst[16]; + u16 sport; + u16 dport; + u8 proto; + u8 rt_type; + char name[16]; + __u8 gw[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_fib6_table_lookup {}; + +typedef void (*btf_trace_fib6_table_lookup)(void *, const struct net *, const struct fib6_result *, struct fib6_table *, const struct flowi6 *); + +enum rt6_nud_state { + RT6_NUD_FAIL_HARD = 4294967293, + RT6_NUD_FAIL_PROBE = 4294967294, + RT6_NUD_FAIL_DO_RR = 4294967295, + RT6_NUD_SUCCEED = 1, +}; + +struct fib6_nh_dm_arg { + struct net *net; + const struct in6_addr *saddr; + int oif; + int flags; + struct fib6_nh *nh; +}; + +struct __rt6_probe_work { + struct work_struct work; + struct in6_addr target; + struct net_device *dev; + netdevice_tracker dev_tracker; +}; + +struct fib6_nh_frl_arg { + u32 flags; + int oif; + int strict; + int *mpri; + bool *do_rr; + struct fib6_nh *nh; +}; + +struct fib6_nh_excptn_arg { + struct rt6_info *rt; + int plen; +}; + +struct fib6_nh_match_arg { + const struct net_device *dev; + const struct in6_addr *gw; + struct fib6_nh *match; +}; + +struct fib6_nh_age_excptn_arg { + struct fib6_gc_args *gc_args; + long unsigned int now; +}; + +struct fib6_nh_rd_arg { + struct fib6_result *res; + struct flowi6 *fl6; + const struct in6_addr *gw; + struct rt6_info **ret; +}; + +struct ip6rd_flowi { + struct flowi6 fl6; + struct in6_addr gateway; +}; + +struct fib6_nh_del_cached_rt_arg { + struct fib6_config *cfg; + struct fib6_info *f6i; +}; + +struct arg_dev_net_ip { + struct net_device *dev; + struct net *net; + struct in6_addr *addr; +}; + +struct arg_netdev_event { + const struct net_device *dev; + union { + unsigned char nh_flags; + long unsigned int event; + }; +}; + +struct rt6_mtu_change_arg { + struct net_device *dev; + unsigned int mtu; + struct fib6_info *f6i; +}; + +struct rt6_nh { + struct fib6_info *fib6_info; + struct fib6_config r_cfg; + struct list_head next; +}; + +struct fib6_nh_exception_dump_walker { + struct rt6_rtnl_dump_arg *dump; + struct fib6_info *rt; + unsigned int flags; + unsigned int skip; + unsigned int count; +}; + +enum fib6_walk_state { + FWS_S = 0, + FWS_L = 1, + FWS_R = 2, + FWS_C = 3, + FWS_U = 4, +}; + +struct fib6_walker { + struct list_head lh; + struct fib6_node *root; + struct fib6_node *node; + struct fib6_info *leaf; + enum fib6_walk_state state; + unsigned int skip; + unsigned int count; + unsigned int skip_in_node; + int (*func)(struct fib6_walker *); + void *args; +}; + +struct fib6_entry_notifier_info { + struct fib_notifier_info info; + struct fib6_info *rt; + unsigned int nsiblings; +}; + +struct ipv6_route_iter { + struct seq_net_private p; + struct fib6_walker w; + loff_t skip; + struct fib6_table *tbl; + int sernum; +}; + +struct bpf_iter__ipv6_route { + union { + struct bpf_iter_meta *meta; + }; + union { + struct fib6_info *rt; + }; +}; + +struct fib6_cleaner { + struct fib6_walker w; + struct net *net; + int (*func)(struct fib6_info *, void *); + int sernum; + void *arg; + bool skip_notify; +}; + +enum { + FIB6_NO_SERNUM_CHANGE = 0, +}; + +struct fib6_dump_arg { + struct net *net; + struct notifier_block *nb; + struct netlink_ext_ack *extack; +}; + +struct fib6_nh_pcpu_arg { + struct fib6_info *from; + const struct fib6_table *table; +}; + +struct lookup_args { + int offset; + const struct in6_addr *addr; +}; + +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; + int ipv6mr_ifindex; +}; + +struct in6_flowlabel_req { + struct in6_addr flr_dst; + __be32 flr_label; + __u8 flr_action; + __u8 flr_share; + __u16 flr_flags; + __u16 flr_expires; + __u16 flr_linger; + __u32 __flr_pad; +}; + +struct ip6_mtuinfo { + struct sockaddr_in6 ip6m_addr; + __u32 ip6m_mtu; +}; + +struct nduseroptmsg { + unsigned char nduseropt_family; + unsigned char nduseropt_pad1; + short unsigned int nduseropt_opts_len; + int nduseropt_ifindex; + __u8 nduseropt_icmp_type; + __u8 nduseropt_icmp_code; + short unsigned int nduseropt_pad2; + unsigned int nduseropt_pad3; +}; + +enum { + NDUSEROPT_UNSPEC = 0, + NDUSEROPT_SRCADDR = 1, + __NDUSEROPT_MAX = 2, +}; + +struct nd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + __u8 opt[0]; +}; + +struct rs_msg { + struct icmp6hdr icmph; + __u8 opt[0]; +}; + +struct ra_msg { + struct icmp6hdr icmph; + __be32 reachable_time; + __be32 retrans_timer; +}; + +struct icmp6_filter { + __u32 data[8]; +}; + +struct raw6_sock { + struct inet_sock inet; + __u32 checksum; + __u32 offset; + struct icmp6_filter filter; + __u32 ip6mr_table; + struct ipv6_pinfo inet6; + long: 32; +}; + +typedef int mh_filter_t(struct sock *, struct sk_buff *); + +struct raw6_frag_vec { + struct msghdr *msg; + int hlen; + char c[4]; +}; + +struct ipv6_destopt_hao { + __u8 type; + __u8 length; + struct in6_addr addr; +} __attribute__((packed)); + +typedef void ip6_icmp_send_t(struct sk_buff *, u8, u8, __u32, const struct in6_addr *, const struct inet6_skb_parm *); + +struct icmpv6_msg { + struct sk_buff *skb; + int offset; + uint8_t type; +}; + +struct icmp6_err { + int err; + int fatal; +}; + +struct mld_msg { + struct icmp6hdr mld_hdr; + struct in6_addr mld_mca; +}; + +struct mld2_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + struct in6_addr grec_mca; + struct in6_addr grec_src[0]; +}; + +struct mld2_report { + struct icmp6hdr mld2r_hdr; + struct mld2_grec mld2r_grec[0]; +}; + +struct mld2_query { + struct icmp6hdr mld2q_hdr; + struct in6_addr mld2q_mca; + __u8 mld2q_qrv: 3; + __u8 mld2q_suppress: 1; + __u8 mld2q_resv2: 4; + __u8 mld2q_qqic; + __be16 mld2q_nsrcs; + struct in6_addr mld2q_srcs[0]; +}; + +struct igmp6_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; +}; + +struct igmp6_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; + struct ifmcaddr6 *im; +}; + +enum ip6_defrag_users { + IP6_DEFRAG_LOCAL_DELIVER = 0, + IP6_DEFRAG_CONNTRACK_IN = 1, + __IP6_DEFRAG_CONNTRACK_IN = 65536, + IP6_DEFRAG_CONNTRACK_OUT = 65537, + __IP6_DEFRAG_CONNTRACK_OUT = 131072, + IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 131073, + __IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 196608, +}; + +struct frag_queue { + struct inet_frag_queue q; + int iif; + __u16 nhoffset; + u8 ecn; +}; + +struct tcp6_pseudohdr { + struct in6_addr saddr; + struct in6_addr daddr; + __be32 len; + __be32 protocol; +}; + +struct rt0_hdr { + struct ipv6_rt_hdr rt_hdr; + __u32 reserved; + struct in6_addr addr[0]; +}; + +struct ipv6_rpl_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u32 cmpre: 4; + __u32 cmpri: 4; + __u32 reserved: 4; + __u32 pad: 4; + __u32 reserved1: 16; + union { + struct { + struct {} __empty_addr; + struct in6_addr addr[0]; + }; + struct { + struct {} __empty_data; + __u8 data[0]; + }; + } segments; +}; + +struct ioam6_hdr { + __u8 opt_type; + __u8 opt_len; + char: 8; + __u8 type; +}; + +struct ioam6_trace_hdr { + __be16 namespace_id; + char: 2; + __u8 overflow: 1; + __u8 nodelen: 5; + __u8 remlen: 7; + union { + __be32 type_be32; + struct { + __u32 bit7: 1; + __u32 bit6: 1; + __u32 bit5: 1; + __u32 bit4: 1; + __u32 bit3: 1; + __u32 bit2: 1; + __u32 bit1: 1; + __u32 bit0: 1; + __u32 bit15: 1; + __u32 bit14: 1; + __u32 bit13: 1; + __u32 bit12: 1; + __u32 bit11: 1; + __u32 bit10: 1; + __u32 bit9: 1; + __u32 bit8: 1; + __u32 bit23: 1; + __u32 bit22: 1; + __u32 bit21: 1; + __u32 bit20: 1; + __u32 bit19: 1; + __u32 bit18: 1; + __u32 bit17: 1; + __u32 bit16: 1; + } type; + }; + __u8 data[0]; +}; + +struct ioam6_schema; + +struct ioam6_namespace { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_schema *schema; + __be16 id; + __be32 data; + __be64 data_wide; +}; + +struct ioam6_schema { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_namespace *ns; + u32 id; + int len; + __be32 hdr; + u8 data[0]; +}; + +struct ip6fl_iter_state { + struct seq_net_private p; + struct pid_namespace *pid_ns; + int bucket; +}; + +struct sr6_tlv { + __u8 type; + __u8 len; + __u8 data[0]; +}; + +enum { + SEG6_ATTR_UNSPEC = 0, + SEG6_ATTR_DST = 1, + SEG6_ATTR_DSTLEN = 2, + SEG6_ATTR_HMACKEYID = 3, + SEG6_ATTR_SECRET = 4, + SEG6_ATTR_SECRETLEN = 5, + SEG6_ATTR_ALGID = 6, + SEG6_ATTR_HMACINFO = 7, + __SEG6_ATTR_MAX = 8, +}; + +enum { + SEG6_CMD_UNSPEC = 0, + SEG6_CMD_SETHMAC = 1, + SEG6_CMD_DUMPHMAC = 2, + SEG6_CMD_SET_TUNSRC = 3, + SEG6_CMD_GET_TUNSRC = 4, + __SEG6_CMD_MAX = 5, +}; + +struct seg6_hmac_info { + struct rhash_head node; + struct callback_head rcu; + u32 hmackeyid; + char secret[64]; + u8 slen; + u8 alg_id; +}; + +enum { + IOAM6_ATTR_UNSPEC = 0, + IOAM6_ATTR_NS_ID = 1, + IOAM6_ATTR_NS_DATA = 2, + IOAM6_ATTR_NS_DATA_WIDE = 3, + IOAM6_ATTR_SC_ID = 4, + IOAM6_ATTR_SC_DATA = 5, + IOAM6_ATTR_SC_NONE = 6, + IOAM6_ATTR_PAD = 7, + __IOAM6_ATTR_MAX = 8, +}; + +enum { + IOAM6_CMD_UNSPEC = 0, + IOAM6_CMD_ADD_NAMESPACE = 1, + IOAM6_CMD_DEL_NAMESPACE = 2, + IOAM6_CMD_DUMP_NAMESPACES = 3, + IOAM6_CMD_ADD_SCHEMA = 4, + IOAM6_CMD_DEL_SCHEMA = 5, + IOAM6_CMD_DUMP_SCHEMAS = 6, + IOAM6_CMD_NS_SET_SCHEMA = 7, + __IOAM6_CMD_MAX = 8, +}; + +typedef short unsigned int mifi_t; + +typedef __u32 if_mask; + +struct if_set { + if_mask ifs_bits[8]; +}; + +struct mif6ctl { + mifi_t mif6c_mifi; + unsigned char mif6c_flags; + unsigned char vifc_threshold; + __u16 mif6c_pifi; + unsigned int vifc_rate_limit; +}; + +struct mf6cctl { + struct sockaddr_in6 mf6cc_origin; + struct sockaddr_in6 mf6cc_mcastgrp; + mifi_t mf6cc_parent; + struct if_set mf6cc_ifset; +}; + +struct sioc_sg_req6 { + struct sockaddr_in6 src; + struct sockaddr_in6 grp; + long unsigned int pktcnt; + long unsigned int bytecnt; + long unsigned int wrong_if; +}; + +struct sioc_mif_req6 { + mifi_t mifi; + long unsigned int icount; + long unsigned int ocount; + long unsigned int ibytes; + long unsigned int obytes; +}; + +struct mrt6msg { + __u8 im6_mbz; + __u8 im6_msgtype; + __u16 im6_mif; + __u32 im6_pad; + struct in6_addr im6_src; + struct in6_addr im6_dst; +}; + +enum { + IP6MRA_CREPORT_UNSPEC = 0, + IP6MRA_CREPORT_MSGTYPE = 1, + IP6MRA_CREPORT_MIF_ID = 2, + IP6MRA_CREPORT_SRC_ADDR = 3, + IP6MRA_CREPORT_DST_ADDR = 4, + IP6MRA_CREPORT_PKT = 5, + __IP6MRA_CREPORT_MAX = 6, +}; + +struct mfc6_cache_cmp_arg { + struct in6_addr mf6c_mcastgrp; + struct in6_addr mf6c_origin; +}; + +struct mfc6_cache { + struct mr_mfc _c; + union { + struct { + struct in6_addr mf6c_mcastgrp; + struct in6_addr mf6c_origin; + }; + struct mfc6_cache_cmp_arg cmparg; + }; +}; + +struct ip6mr_result { + struct mr_table *mrt; +}; + +struct xfrm6_protocol { + int (*handler)(struct sk_buff *); + int (*input_handler)(struct sk_buff *, int, __be32, int); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + struct xfrm6_protocol *next; + int priority; +}; + +struct br_input_skb_cb { + struct net_device *brdev; + u16 frag_max_size; + u8 igmp; + u8 mrouters_only: 1; + u8 proxyarp_replied: 1; + u8 src_port_isolated: 1; + u8 vlan_filtered: 1; + u8 br_netfilter_broute: 1; + u8 tx_fwd_offload: 1; + int src_hwdom; + long unsigned int fwd_hwdoms; +}; + +struct nf_bridge_frag_data; + +struct fib6_rule { + struct fib_rule common; + struct rt6key src; + struct rt6key dst; + dscp_t dscp; + long: 32; +}; + +struct calipso_doi; + +struct netlbl_calipso_ops { + int (*doi_add)(struct calipso_doi *, struct netlbl_audit *); + void (*doi_free)(struct calipso_doi *); + int (*doi_remove)(u32, struct netlbl_audit *); + struct calipso_doi * (*doi_getdef)(u32); + void (*doi_putdef)(struct calipso_doi *); + int (*doi_walk)(u32 *, int (*)(struct calipso_doi *, void *), void *); + int (*sock_getattr)(struct sock *, struct netlbl_lsm_secattr *); + int (*sock_setattr)(struct sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + void (*sock_delattr)(struct sock *); + int (*req_setattr)(struct request_sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + void (*req_delattr)(struct request_sock *); + int (*opt_getattr)(const unsigned char *, struct netlbl_lsm_secattr *); + unsigned char * (*skbuff_optptr)(const struct sk_buff *); + int (*skbuff_setattr)(struct sk_buff *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + int (*skbuff_delattr)(struct sk_buff *); + void (*cache_invalidate)(); + int (*cache_add)(const unsigned char *, const struct netlbl_lsm_secattr *); +}; + +struct calipso_doi { + u32 doi; + u32 type; + refcount_t refcount; + struct list_head list; + struct callback_head rcu; +}; + +struct calipso_map_cache_bkt { + spinlock_t lock; + u32 size; + struct list_head list; +}; + +struct calipso_map_cache_entry { + u32 hash; + unsigned char *key; + size_t key_len; + struct netlbl_lsm_cache *lsm_data; + u32 activity; + struct list_head list; +}; + +enum { + SEG6_IPTUNNEL_UNSPEC = 0, + SEG6_IPTUNNEL_SRH = 1, + __SEG6_IPTUNNEL_MAX = 2, +}; + +struct seg6_iptunnel_encap { + int mode; + struct ipv6_sr_hdr srh[0]; +}; + +enum { + SEG6_IPTUN_MODE_INLINE = 0, + SEG6_IPTUN_MODE_ENCAP = 1, + SEG6_IPTUN_MODE_L2ENCAP = 2, + SEG6_IPTUN_MODE_ENCAP_RED = 3, + SEG6_IPTUN_MODE_L2ENCAP_RED = 4, +}; + +struct seg6_lwt { + struct dst_cache cache; + struct seg6_iptunnel_encap tuninfo[0]; +}; + +enum l3mdev_type { + L3MDEV_TYPE_UNSPEC = 0, + L3MDEV_TYPE_VRF = 1, + __L3MDEV_TYPE_MAX = 2, +}; + +enum { + IP6_FH_F_FRAG = 1, + IP6_FH_F_AUTH = 2, + IP6_FH_F_SKIP_RH = 4, +}; + +enum { + SEG6_LOCAL_UNSPEC = 0, + SEG6_LOCAL_ACTION = 1, + SEG6_LOCAL_SRH = 2, + SEG6_LOCAL_TABLE = 3, + SEG6_LOCAL_NH4 = 4, + SEG6_LOCAL_NH6 = 5, + SEG6_LOCAL_IIF = 6, + SEG6_LOCAL_OIF = 7, + SEG6_LOCAL_BPF = 8, + SEG6_LOCAL_VRFTABLE = 9, + SEG6_LOCAL_COUNTERS = 10, + SEG6_LOCAL_FLAVORS = 11, + __SEG6_LOCAL_MAX = 12, +}; + +enum { + SEG6_LOCAL_BPF_PROG_UNSPEC = 0, + SEG6_LOCAL_BPF_PROG = 1, + SEG6_LOCAL_BPF_PROG_NAME = 2, + __SEG6_LOCAL_BPF_PROG_MAX = 3, +}; + +enum { + SEG6_LOCAL_CNT_UNSPEC = 0, + SEG6_LOCAL_CNT_PAD = 1, + SEG6_LOCAL_CNT_PACKETS = 2, + SEG6_LOCAL_CNT_BYTES = 3, + SEG6_LOCAL_CNT_ERRORS = 4, + __SEG6_LOCAL_CNT_MAX = 5, +}; + +enum { + SEG6_LOCAL_FLV_UNSPEC = 0, + SEG6_LOCAL_FLV_OPERATION = 1, + SEG6_LOCAL_FLV_LCBLOCK_BITS = 2, + SEG6_LOCAL_FLV_LCNODE_FN_BITS = 3, + __SEG6_LOCAL_FLV_MAX = 4, +}; + +enum { + SEG6_LOCAL_FLV_OP_UNSPEC = 0, + SEG6_LOCAL_FLV_OP_PSP = 1, + SEG6_LOCAL_FLV_OP_USP = 2, + SEG6_LOCAL_FLV_OP_USD = 3, + SEG6_LOCAL_FLV_OP_NEXT_CSID = 4, + __SEG6_LOCAL_FLV_OP_MAX = 5, +}; + +struct seg6_local_lwt; + +struct seg6_local_lwtunnel_ops { + int (*build_state)(struct seg6_local_lwt *, const void *, struct netlink_ext_ack *); + void (*destroy_state)(struct seg6_local_lwt *); +}; + +enum seg6_end_dt_mode { + DT_INVALID_MODE = 4294967274, + DT_LEGACY_MODE = 0, + DT_VRF_MODE = 1, +}; + +struct seg6_end_dt_info { + enum seg6_end_dt_mode mode; + struct net *net; + int vrf_ifindex; + int vrf_table; + u16 family; +}; + +struct seg6_flavors_info { + __u32 flv_ops; + __u8 lcblock_bits; + __u8 lcnode_func_bits; +}; + +struct pcpu_seg6_local_counters; + +struct seg6_action_desc; + +struct seg6_local_lwt { + int action; + struct ipv6_sr_hdr *srh; + int table; + struct in_addr nh4; + struct in6_addr nh6; + int iif; + int oif; + struct bpf_lwt_prog bpf; + struct seg6_end_dt_info dt_info; + struct seg6_flavors_info flv_info; + struct pcpu_seg6_local_counters *pcpu_counters; + int headroom; + struct seg6_action_desc *desc; + long unsigned int parsed_optattrs; +}; + +struct seg6_action_desc { + int action; + long unsigned int attrs; + long unsigned int optattrs; + int (*input)(struct sk_buff *, struct seg6_local_lwt *); + int static_headroom; + struct seg6_local_lwtunnel_ops slwt_ops; +}; + +struct pcpu_seg6_local_counters { + u64_stats_t packets; + u64_stats_t bytes; + u64_stats_t errors; + struct u64_stats_sync syncp; + long: 32; +}; + +struct seg6_local_counters { + __u64 packets; + __u64 bytes; + __u64 errors; +}; + +struct seg6_action_param { + int (*parse)(struct nlattr **, struct seg6_local_lwt *, struct netlink_ext_ack *); + int (*put)(struct sk_buff *, struct seg6_local_lwt *); + int (*cmp)(struct seg6_local_lwt *, struct seg6_local_lwt *); + void (*destroy)(struct seg6_local_lwt *); +}; + +struct sr6_tlv_hmac { + struct sr6_tlv tlvhdr; + __u16 reserved; + __be32 hmackeyid; + __u8 hmac[32]; +}; + +enum { + SEG6_HMAC_ALGO_SHA1 = 1, + SEG6_HMAC_ALGO_SHA256 = 2, +}; + +struct seg6_hmac_algo { + u8 alg_id; + char name[64]; + struct crypto_shash **tfms; + struct shash_desc **shashs; +}; + +struct rt2_hdr { + struct ipv6_rt_hdr rt_hdr; + __u32 reserved; + struct in6_addr addr; +}; + +struct mip6_report_rate_limiter { + spinlock_t lock; + long: 32; + ktime_t stamp; + int iif; + struct in6_addr src; + struct in6_addr dst; + long: 32; +}; + +struct sockaddr_pkt { + short unsigned int spkt_family; + unsigned char spkt_device[14]; + __be16 spkt_protocol; +}; + +struct sockaddr_ll { + short unsigned int sll_family; + __be16 sll_protocol; + int sll_ifindex; + short unsigned int sll_hatype; + unsigned char sll_pkttype; + unsigned char sll_halen; + unsigned char sll_addr[8]; +}; + +struct tpacket_stats { + unsigned int tp_packets; + unsigned int tp_drops; +}; + +struct tpacket_stats_v3 { + unsigned int tp_packets; + unsigned int tp_drops; + unsigned int tp_freeze_q_cnt; +}; + +struct tpacket_rollover_stats { + __u64 tp_all; + __u64 tp_huge; + __u64 tp_failed; +}; + +union tpacket_stats_u { + struct tpacket_stats stats1; + struct tpacket_stats_v3 stats3; +}; + +struct tpacket_auxdata { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; +}; + +struct tpacket_hdr { + long unsigned int tp_status; + unsigned int tp_len; + unsigned int tp_snaplen; + short unsigned int tp_mac; + short unsigned int tp_net; + unsigned int tp_sec; + unsigned int tp_usec; +}; + +struct tpacket2_hdr { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u32 tp_sec; + __u32 tp_nsec; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u8 tp_padding[4]; +}; + +struct tpacket_hdr_variant1 { + __u32 tp_rxhash; + __u32 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u16 tp_padding; +}; + +struct tpacket3_hdr { + __u32 tp_next_offset; + __u32 tp_sec; + __u32 tp_nsec; + __u32 tp_snaplen; + __u32 tp_len; + __u32 tp_status; + __u16 tp_mac; + __u16 tp_net; + union { + struct tpacket_hdr_variant1 hv1; + }; + __u8 tp_padding[8]; +}; + +struct tpacket_bd_ts { + unsigned int ts_sec; + union { + unsigned int ts_usec; + unsigned int ts_nsec; + }; +}; + +struct tpacket_hdr_v1 { + __u32 block_status; + __u32 num_pkts; + __u32 offset_to_first_pkt; + __u32 blk_len; + __u64 seq_num; + struct tpacket_bd_ts ts_first_pkt; + struct tpacket_bd_ts ts_last_pkt; +}; + +union tpacket_bd_header_u { + struct tpacket_hdr_v1 bh1; +}; + +struct tpacket_block_desc { + __u32 version; + __u32 offset_to_priv; + union tpacket_bd_header_u hdr; +}; + +enum tpacket_versions { + TPACKET_V1 = 0, + TPACKET_V2 = 1, + TPACKET_V3 = 2, +}; + +struct tpacket_req { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; +}; + +struct tpacket_req3 { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; + unsigned int tp_retire_blk_tov; + unsigned int tp_sizeof_priv; + unsigned int tp_feature_req_word; +}; + +union tpacket_req_u { + struct tpacket_req req; + struct tpacket_req3 req3; +}; + +struct fanout_args { + __u16 id; + __u16 type_flags; + __u32 max_num_members; +}; + +struct virtio_net_hdr { + __u8 flags; + __u8 gso_type; + __virtio16 hdr_len; + __virtio16 gso_size; + __virtio16 csum_start; + __virtio16 csum_offset; +}; + +struct packet_mclist { + struct packet_mclist *next; + int ifindex; + int count; + short unsigned int type; + short unsigned int alen; + unsigned char addr[32]; +}; + +struct pgv; + +struct tpacket_kbdq_core { + struct pgv *pkbdq; + unsigned int feature_req_word; + unsigned int hdrlen; + unsigned char reset_pending_on_curr_blk; + unsigned char delete_blk_timer; + short unsigned int kactive_blk_num; + short unsigned int blk_sizeof_priv; + short unsigned int last_kactive_blk_num; + char *pkblk_start; + char *pkblk_end; + int kblk_size; + unsigned int max_frame_len; + unsigned int knum_blocks; + uint64_t knxt_seq_num; + char *prev; + char *nxt_offset; + struct sk_buff *skb; + rwlock_t blk_fill_in_prog_lock; + short unsigned int retire_blk_tov; + short unsigned int version; + long unsigned int tov_in_jiffies; + struct timer_list retire_blk_timer; + long: 32; +}; + +struct pgv { + char *buffer; +}; + +struct packet_ring_buffer { + struct pgv *pg_vec; + unsigned int head; + unsigned int frames_per_block; + unsigned int frame_size; + unsigned int frame_max; + unsigned int pg_vec_order; + unsigned int pg_vec_pages; + unsigned int pg_vec_len; + unsigned int *pending_refcnt; + long: 32; + union { + long unsigned int *rx_owner_map; + struct tpacket_kbdq_core prb_bdqc; + }; +}; + +struct packet_fanout { + possible_net_t net; + unsigned int num_members; + u32 max_num_members; + u16 id; + u8 type; + u8 flags; + union { + atomic_t rr_cur; + struct bpf_prog *bpf_prog; + }; + struct list_head list; + spinlock_t lock; + refcount_t sk_ref; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct packet_type prot_hook; + struct sock *arr[0]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct packet_rollover { + int sock; + atomic_long_t num; + atomic_long_t num_huge; + atomic_long_t num_failed; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + u32 history[16]; +}; + +struct packet_sock { + struct sock sk; + struct packet_fanout *fanout; + union tpacket_stats_u stats; + struct packet_ring_buffer rx_ring; + struct packet_ring_buffer tx_ring; + int copy_thresh; + spinlock_t bind_lock; + struct mutex pg_vec_lock; + unsigned int running; + unsigned int auxdata: 1; + unsigned int origdev: 1; + unsigned int has_vnet_hdr: 1; + unsigned int tp_loss: 1; + unsigned int tp_tx_has_off: 1; + int pressure; + int ifindex; + __be16 num; + struct packet_rollover *rollover; + struct packet_mclist *mclist; + atomic_t mapped; + enum tpacket_versions tp_version; + unsigned int tp_hdrlen; + unsigned int tp_reserve; + unsigned int tp_tstamp; + struct completion skb_completion; + struct net_device *cached_dev; + int (*xmit)(struct sk_buff *); + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + struct packet_type prot_hook; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + atomic_t tp_drops; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct packet_mreq_max { + int mr_ifindex; + short unsigned int mr_type; + short unsigned int mr_alen; + unsigned char mr_address[32]; +}; + +union tpacket_uhdr { + struct tpacket_hdr *h1; + struct tpacket2_hdr *h2; + struct tpacket3_hdr *h3; + void *raw; +}; + +struct packet_skb_cb { + union { + struct sockaddr_pkt pkt; + union { + unsigned int origlen; + struct sockaddr_ll ll; + }; + } sa; +}; + +enum devlink_command { + DEVLINK_CMD_UNSPEC = 0, + DEVLINK_CMD_GET = 1, + DEVLINK_CMD_SET = 2, + DEVLINK_CMD_NEW = 3, + DEVLINK_CMD_DEL = 4, + DEVLINK_CMD_PORT_GET = 5, + DEVLINK_CMD_PORT_SET = 6, + DEVLINK_CMD_PORT_NEW = 7, + DEVLINK_CMD_PORT_DEL = 8, + DEVLINK_CMD_PORT_SPLIT = 9, + DEVLINK_CMD_PORT_UNSPLIT = 10, + DEVLINK_CMD_SB_GET = 11, + DEVLINK_CMD_SB_SET = 12, + DEVLINK_CMD_SB_NEW = 13, + DEVLINK_CMD_SB_DEL = 14, + DEVLINK_CMD_SB_POOL_GET = 15, + DEVLINK_CMD_SB_POOL_SET = 16, + DEVLINK_CMD_SB_POOL_NEW = 17, + DEVLINK_CMD_SB_POOL_DEL = 18, + DEVLINK_CMD_SB_PORT_POOL_GET = 19, + DEVLINK_CMD_SB_PORT_POOL_SET = 20, + DEVLINK_CMD_SB_PORT_POOL_NEW = 21, + DEVLINK_CMD_SB_PORT_POOL_DEL = 22, + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 23, + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 24, + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 25, + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 26, + DEVLINK_CMD_SB_OCC_SNAPSHOT = 27, + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 28, + DEVLINK_CMD_ESWITCH_GET = 29, + DEVLINK_CMD_ESWITCH_SET = 30, + DEVLINK_CMD_DPIPE_TABLE_GET = 31, + DEVLINK_CMD_DPIPE_ENTRIES_GET = 32, + DEVLINK_CMD_DPIPE_HEADERS_GET = 33, + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 34, + DEVLINK_CMD_RESOURCE_SET = 35, + DEVLINK_CMD_RESOURCE_DUMP = 36, + DEVLINK_CMD_RELOAD = 37, + DEVLINK_CMD_PARAM_GET = 38, + DEVLINK_CMD_PARAM_SET = 39, + DEVLINK_CMD_PARAM_NEW = 40, + DEVLINK_CMD_PARAM_DEL = 41, + DEVLINK_CMD_REGION_GET = 42, + DEVLINK_CMD_REGION_SET = 43, + DEVLINK_CMD_REGION_NEW = 44, + DEVLINK_CMD_REGION_DEL = 45, + DEVLINK_CMD_REGION_READ = 46, + DEVLINK_CMD_PORT_PARAM_GET = 47, + DEVLINK_CMD_PORT_PARAM_SET = 48, + DEVLINK_CMD_PORT_PARAM_NEW = 49, + DEVLINK_CMD_PORT_PARAM_DEL = 50, + DEVLINK_CMD_INFO_GET = 51, + DEVLINK_CMD_HEALTH_REPORTER_GET = 52, + DEVLINK_CMD_HEALTH_REPORTER_SET = 53, + DEVLINK_CMD_HEALTH_REPORTER_RECOVER = 54, + DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE = 55, + DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET = 56, + DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR = 57, + DEVLINK_CMD_FLASH_UPDATE = 58, + DEVLINK_CMD_FLASH_UPDATE_END = 59, + DEVLINK_CMD_FLASH_UPDATE_STATUS = 60, + DEVLINK_CMD_TRAP_GET = 61, + DEVLINK_CMD_TRAP_SET = 62, + DEVLINK_CMD_TRAP_NEW = 63, + DEVLINK_CMD_TRAP_DEL = 64, + DEVLINK_CMD_TRAP_GROUP_GET = 65, + DEVLINK_CMD_TRAP_GROUP_SET = 66, + DEVLINK_CMD_TRAP_GROUP_NEW = 67, + DEVLINK_CMD_TRAP_GROUP_DEL = 68, + DEVLINK_CMD_TRAP_POLICER_GET = 69, + DEVLINK_CMD_TRAP_POLICER_SET = 70, + DEVLINK_CMD_TRAP_POLICER_NEW = 71, + DEVLINK_CMD_TRAP_POLICER_DEL = 72, + DEVLINK_CMD_HEALTH_REPORTER_TEST = 73, + DEVLINK_CMD_RATE_GET = 74, + DEVLINK_CMD_RATE_SET = 75, + DEVLINK_CMD_RATE_NEW = 76, + DEVLINK_CMD_RATE_DEL = 77, + DEVLINK_CMD_LINECARD_GET = 78, + DEVLINK_CMD_LINECARD_SET = 79, + DEVLINK_CMD_LINECARD_NEW = 80, + DEVLINK_CMD_LINECARD_DEL = 81, + DEVLINK_CMD_SELFTESTS_GET = 82, + DEVLINK_CMD_SELFTESTS_RUN = 83, + __DEVLINK_CMD_MAX = 84, + DEVLINK_CMD_MAX = 83, +}; + +enum devlink_eswitch_encap_mode { + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0, + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1, +}; + +enum { + DEVLINK_ATTR_STATS_RX_PACKETS = 0, + DEVLINK_ATTR_STATS_RX_BYTES = 1, + DEVLINK_ATTR_STATS_RX_DROPPED = 2, + __DEVLINK_ATTR_STATS_MAX = 3, + DEVLINK_ATTR_STATS_MAX = 2, +}; + +enum devlink_selftest_status { + DEVLINK_SELFTEST_STATUS_SKIP = 0, + DEVLINK_SELFTEST_STATUS_PASS = 1, + DEVLINK_SELFTEST_STATUS_FAIL = 2, +}; + +enum devlink_trap_action { + DEVLINK_TRAP_ACTION_DROP = 0, + DEVLINK_TRAP_ACTION_TRAP = 1, + DEVLINK_TRAP_ACTION_MIRROR = 2, +}; + +enum devlink_trap_type { + DEVLINK_TRAP_TYPE_DROP = 0, + DEVLINK_TRAP_TYPE_EXCEPTION = 1, + DEVLINK_TRAP_TYPE_CONTROL = 2, +}; + +enum { + DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT = 0, + DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE = 1, +}; + +enum devlink_reload_action { + DEVLINK_RELOAD_ACTION_UNSPEC = 0, + DEVLINK_RELOAD_ACTION_DRIVER_REINIT = 1, + DEVLINK_RELOAD_ACTION_FW_ACTIVATE = 2, + __DEVLINK_RELOAD_ACTION_MAX = 3, + DEVLINK_RELOAD_ACTION_MAX = 2, +}; + +enum devlink_reload_limit { + DEVLINK_RELOAD_LIMIT_UNSPEC = 0, + DEVLINK_RELOAD_LIMIT_NO_RESET = 1, + __DEVLINK_RELOAD_LIMIT_MAX = 2, + DEVLINK_RELOAD_LIMIT_MAX = 1, +}; + +enum devlink_linecard_state { + DEVLINK_LINECARD_STATE_UNSPEC = 0, + DEVLINK_LINECARD_STATE_UNPROVISIONED = 1, + DEVLINK_LINECARD_STATE_UNPROVISIONING = 2, + DEVLINK_LINECARD_STATE_PROVISIONING = 3, + DEVLINK_LINECARD_STATE_PROVISIONING_FAILED = 4, + DEVLINK_LINECARD_STATE_PROVISIONED = 5, + DEVLINK_LINECARD_STATE_ACTIVE = 6, + __DEVLINK_LINECARD_STATE_MAX = 7, + DEVLINK_LINECARD_STATE_MAX = 6, +}; + +enum devlink_attr { + DEVLINK_ATTR_UNSPEC = 0, + DEVLINK_ATTR_BUS_NAME = 1, + DEVLINK_ATTR_DEV_NAME = 2, + DEVLINK_ATTR_PORT_INDEX = 3, + DEVLINK_ATTR_PORT_TYPE = 4, + DEVLINK_ATTR_PORT_DESIRED_TYPE = 5, + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 6, + DEVLINK_ATTR_PORT_NETDEV_NAME = 7, + DEVLINK_ATTR_PORT_IBDEV_NAME = 8, + DEVLINK_ATTR_PORT_SPLIT_COUNT = 9, + DEVLINK_ATTR_PORT_SPLIT_GROUP = 10, + DEVLINK_ATTR_SB_INDEX = 11, + DEVLINK_ATTR_SB_SIZE = 12, + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 13, + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 14, + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 15, + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 16, + DEVLINK_ATTR_SB_POOL_INDEX = 17, + DEVLINK_ATTR_SB_POOL_TYPE = 18, + DEVLINK_ATTR_SB_POOL_SIZE = 19, + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 20, + DEVLINK_ATTR_SB_THRESHOLD = 21, + DEVLINK_ATTR_SB_TC_INDEX = 22, + DEVLINK_ATTR_SB_OCC_CUR = 23, + DEVLINK_ATTR_SB_OCC_MAX = 24, + DEVLINK_ATTR_ESWITCH_MODE = 25, + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 26, + DEVLINK_ATTR_DPIPE_TABLES = 27, + DEVLINK_ATTR_DPIPE_TABLE = 28, + DEVLINK_ATTR_DPIPE_TABLE_NAME = 29, + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 30, + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 31, + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 32, + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 33, + DEVLINK_ATTR_DPIPE_ENTRIES = 34, + DEVLINK_ATTR_DPIPE_ENTRY = 35, + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 36, + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 37, + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 38, + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 39, + DEVLINK_ATTR_DPIPE_MATCH = 40, + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 41, + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 42, + DEVLINK_ATTR_DPIPE_ACTION = 43, + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 44, + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 45, + DEVLINK_ATTR_DPIPE_VALUE = 46, + DEVLINK_ATTR_DPIPE_VALUE_MASK = 47, + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 48, + DEVLINK_ATTR_DPIPE_HEADERS = 49, + DEVLINK_ATTR_DPIPE_HEADER = 50, + DEVLINK_ATTR_DPIPE_HEADER_NAME = 51, + DEVLINK_ATTR_DPIPE_HEADER_ID = 52, + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 53, + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 54, + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 55, + DEVLINK_ATTR_DPIPE_FIELD = 56, + DEVLINK_ATTR_DPIPE_FIELD_NAME = 57, + DEVLINK_ATTR_DPIPE_FIELD_ID = 58, + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 59, + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 60, + DEVLINK_ATTR_PAD = 61, + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62, + DEVLINK_ATTR_RESOURCE_LIST = 63, + DEVLINK_ATTR_RESOURCE = 64, + DEVLINK_ATTR_RESOURCE_NAME = 65, + DEVLINK_ATTR_RESOURCE_ID = 66, + DEVLINK_ATTR_RESOURCE_SIZE = 67, + DEVLINK_ATTR_RESOURCE_SIZE_NEW = 68, + DEVLINK_ATTR_RESOURCE_SIZE_VALID = 69, + DEVLINK_ATTR_RESOURCE_SIZE_MIN = 70, + DEVLINK_ATTR_RESOURCE_SIZE_MAX = 71, + DEVLINK_ATTR_RESOURCE_SIZE_GRAN = 72, + DEVLINK_ATTR_RESOURCE_UNIT = 73, + DEVLINK_ATTR_RESOURCE_OCC = 74, + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID = 75, + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS = 76, + DEVLINK_ATTR_PORT_FLAVOUR = 77, + DEVLINK_ATTR_PORT_NUMBER = 78, + DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER = 79, + DEVLINK_ATTR_PARAM = 80, + DEVLINK_ATTR_PARAM_NAME = 81, + DEVLINK_ATTR_PARAM_GENERIC = 82, + DEVLINK_ATTR_PARAM_TYPE = 83, + DEVLINK_ATTR_PARAM_VALUES_LIST = 84, + DEVLINK_ATTR_PARAM_VALUE = 85, + DEVLINK_ATTR_PARAM_VALUE_DATA = 86, + DEVLINK_ATTR_PARAM_VALUE_CMODE = 87, + DEVLINK_ATTR_REGION_NAME = 88, + DEVLINK_ATTR_REGION_SIZE = 89, + DEVLINK_ATTR_REGION_SNAPSHOTS = 90, + DEVLINK_ATTR_REGION_SNAPSHOT = 91, + DEVLINK_ATTR_REGION_SNAPSHOT_ID = 92, + DEVLINK_ATTR_REGION_CHUNKS = 93, + DEVLINK_ATTR_REGION_CHUNK = 94, + DEVLINK_ATTR_REGION_CHUNK_DATA = 95, + DEVLINK_ATTR_REGION_CHUNK_ADDR = 96, + DEVLINK_ATTR_REGION_CHUNK_LEN = 97, + DEVLINK_ATTR_INFO_DRIVER_NAME = 98, + DEVLINK_ATTR_INFO_SERIAL_NUMBER = 99, + DEVLINK_ATTR_INFO_VERSION_FIXED = 100, + DEVLINK_ATTR_INFO_VERSION_RUNNING = 101, + DEVLINK_ATTR_INFO_VERSION_STORED = 102, + DEVLINK_ATTR_INFO_VERSION_NAME = 103, + DEVLINK_ATTR_INFO_VERSION_VALUE = 104, + DEVLINK_ATTR_SB_POOL_CELL_SIZE = 105, + DEVLINK_ATTR_FMSG = 106, + DEVLINK_ATTR_FMSG_OBJ_NEST_START = 107, + DEVLINK_ATTR_FMSG_PAIR_NEST_START = 108, + DEVLINK_ATTR_FMSG_ARR_NEST_START = 109, + DEVLINK_ATTR_FMSG_NEST_END = 110, + DEVLINK_ATTR_FMSG_OBJ_NAME = 111, + DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE = 112, + DEVLINK_ATTR_FMSG_OBJ_VALUE_DATA = 113, + DEVLINK_ATTR_HEALTH_REPORTER = 114, + DEVLINK_ATTR_HEALTH_REPORTER_NAME = 115, + DEVLINK_ATTR_HEALTH_REPORTER_STATE = 116, + DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT = 117, + DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT = 118, + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS = 119, + DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD = 120, + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER = 121, + DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME = 122, + DEVLINK_ATTR_FLASH_UPDATE_COMPONENT = 123, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG = 124, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE = 125, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL = 126, + DEVLINK_ATTR_PORT_PCI_PF_NUMBER = 127, + DEVLINK_ATTR_PORT_PCI_VF_NUMBER = 128, + DEVLINK_ATTR_STATS = 129, + DEVLINK_ATTR_TRAP_NAME = 130, + DEVLINK_ATTR_TRAP_ACTION = 131, + DEVLINK_ATTR_TRAP_TYPE = 132, + DEVLINK_ATTR_TRAP_GENERIC = 133, + DEVLINK_ATTR_TRAP_METADATA = 134, + DEVLINK_ATTR_TRAP_GROUP_NAME = 135, + DEVLINK_ATTR_RELOAD_FAILED = 136, + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS = 137, + DEVLINK_ATTR_NETNS_FD = 138, + DEVLINK_ATTR_NETNS_PID = 139, + DEVLINK_ATTR_NETNS_ID = 140, + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP = 141, + DEVLINK_ATTR_TRAP_POLICER_ID = 142, + DEVLINK_ATTR_TRAP_POLICER_RATE = 143, + DEVLINK_ATTR_TRAP_POLICER_BURST = 144, + DEVLINK_ATTR_PORT_FUNCTION = 145, + DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER = 146, + DEVLINK_ATTR_PORT_LANES = 147, + DEVLINK_ATTR_PORT_SPLITTABLE = 148, + DEVLINK_ATTR_PORT_EXTERNAL = 149, + DEVLINK_ATTR_PORT_CONTROLLER_NUMBER = 150, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT = 151, + DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK = 152, + DEVLINK_ATTR_RELOAD_ACTION = 153, + DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED = 154, + DEVLINK_ATTR_RELOAD_LIMITS = 155, + DEVLINK_ATTR_DEV_STATS = 156, + DEVLINK_ATTR_RELOAD_STATS = 157, + DEVLINK_ATTR_RELOAD_STATS_ENTRY = 158, + DEVLINK_ATTR_RELOAD_STATS_LIMIT = 159, + DEVLINK_ATTR_RELOAD_STATS_VALUE = 160, + DEVLINK_ATTR_REMOTE_RELOAD_STATS = 161, + DEVLINK_ATTR_RELOAD_ACTION_INFO = 162, + DEVLINK_ATTR_RELOAD_ACTION_STATS = 163, + DEVLINK_ATTR_PORT_PCI_SF_NUMBER = 164, + DEVLINK_ATTR_RATE_TYPE = 165, + DEVLINK_ATTR_RATE_TX_SHARE = 166, + DEVLINK_ATTR_RATE_TX_MAX = 167, + DEVLINK_ATTR_RATE_NODE_NAME = 168, + DEVLINK_ATTR_RATE_PARENT_NODE_NAME = 169, + DEVLINK_ATTR_REGION_MAX_SNAPSHOTS = 170, + DEVLINK_ATTR_LINECARD_INDEX = 171, + DEVLINK_ATTR_LINECARD_STATE = 172, + DEVLINK_ATTR_LINECARD_TYPE = 173, + DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES = 174, + DEVLINK_ATTR_NESTED_DEVLINK = 175, + DEVLINK_ATTR_SELFTESTS = 176, + DEVLINK_ATTR_RATE_TX_PRIORITY = 177, + DEVLINK_ATTR_RATE_TX_WEIGHT = 178, + DEVLINK_ATTR_REGION_DIRECT = 179, + __DEVLINK_ATTR_MAX = 180, + DEVLINK_ATTR_MAX = 179, +}; + +enum devlink_dpipe_field_mapping_type { + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0, + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 1, +}; + +enum devlink_dpipe_match_type { + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0, +}; + +enum devlink_dpipe_action_type { + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0, +}; + +enum devlink_dpipe_field_ethernet_id { + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0, +}; + +enum devlink_dpipe_field_ipv4_id { + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0, +}; + +enum devlink_dpipe_field_ipv6_id { + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0, +}; + +enum devlink_dpipe_header_id { + DEVLINK_DPIPE_HEADER_ETHERNET = 0, + DEVLINK_DPIPE_HEADER_IPV4 = 1, + DEVLINK_DPIPE_HEADER_IPV6 = 2, +}; + +enum devlink_resource_unit { + DEVLINK_RESOURCE_UNIT_ENTRY = 0, +}; + +enum devlink_port_fn_attr_cap { + DEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT = 0, + DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT = 1, + __DEVLINK_PORT_FN_ATTR_CAPS_MAX = 2, +}; + +enum devlink_port_function_attr { + DEVLINK_PORT_FUNCTION_ATTR_UNSPEC = 0, + DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR = 1, + DEVLINK_PORT_FN_ATTR_STATE = 2, + DEVLINK_PORT_FN_ATTR_OPSTATE = 3, + DEVLINK_PORT_FN_ATTR_CAPS = 4, + __DEVLINK_PORT_FUNCTION_ATTR_MAX = 5, + DEVLINK_PORT_FUNCTION_ATTR_MAX = 4, +}; + +enum devlink_port_fn_state { + DEVLINK_PORT_FN_STATE_INACTIVE = 0, + DEVLINK_PORT_FN_STATE_ACTIVE = 1, +}; + +enum devlink_port_fn_opstate { + DEVLINK_PORT_FN_OPSTATE_DETACHED = 0, + DEVLINK_PORT_FN_OPSTATE_ATTACHED = 1, +}; + +struct devlink_dev_stats { + u32 reload_stats[6]; + u32 remote_reload_stats[6]; +}; + +struct devlink_dpipe_headers; + +struct devlink_ops; + +struct devlink { + u32 index; + struct xarray ports; + struct list_head rate_list; + struct list_head sb_list; + struct list_head dpipe_table_list; + struct list_head resource_list; + struct list_head param_list; + struct list_head region_list; + struct list_head reporter_list; + struct devlink_dpipe_headers *dpipe_headers; + struct list_head trap_list; + struct list_head trap_group_list; + struct list_head trap_policer_list; + struct list_head linecard_list; + const struct devlink_ops *ops; + struct xarray snapshot_ids; + struct devlink_dev_stats stats; + struct device *dev; + possible_net_t _net; + struct mutex lock; + struct lock_class_key lock_key; + u8 reload_failed: 1; + refcount_t refcount; + struct rcu_work rwork; + struct notifier_block netdevice_nb; + long: 32; + long: 32; + char priv[0]; +}; + +struct devlink_linecard_ops; + +struct devlink_linecard_type; + +struct devlink_linecard { + struct list_head list; + struct devlink *devlink; + unsigned int index; + const struct devlink_linecard_ops *ops; + void *priv; + enum devlink_linecard_state state; + struct mutex state_lock; + const char *type; + struct devlink_linecard_type *types; + unsigned int types_count; + struct devlink *nested_devlink; +}; + +struct devlink_port_new_attrs { + enum devlink_port_flavour flavour; + unsigned int port_index; + u32 controller; + u32 sfnum; + u16 pfnum; + u8 port_index_valid: 1; + u8 controller_valid: 1; + u8 sfnum_valid: 1; +}; + +struct devlink_linecard_ops { + int (*provision)(struct devlink_linecard *, void *, const char *, const void *, struct netlink_ext_ack *); + int (*unprovision)(struct devlink_linecard *, void *, struct netlink_ext_ack *); + bool (*same_provision)(struct devlink_linecard *, void *, const char *, const void *); + unsigned int (*types_count)(struct devlink_linecard *, void *); + void (*types_get)(struct devlink_linecard *, void *, unsigned int, const char **, const void **); +}; + +struct devlink_dpipe_field { + const char *name; + unsigned int id; + unsigned int bitwidth; + enum devlink_dpipe_field_mapping_type mapping_type; +}; + +struct devlink_dpipe_header { + const char *name; + unsigned int id; + struct devlink_dpipe_field *fields; + unsigned int fields_count; + bool global; +}; + +struct devlink_dpipe_match { + enum devlink_dpipe_match_type type; + unsigned int header_index; + struct devlink_dpipe_header *header; + unsigned int field_id; +}; + +struct devlink_dpipe_action { + enum devlink_dpipe_action_type type; + unsigned int header_index; + struct devlink_dpipe_header *header; + unsigned int field_id; +}; + +struct devlink_dpipe_value { + union { + struct devlink_dpipe_action *action; + struct devlink_dpipe_match *match; + }; + unsigned int mapping_value; + bool mapping_valid; + unsigned int value_size; + void *value; + void *mask; +}; + +struct devlink_dpipe_entry { + u64 index; + struct devlink_dpipe_value *match_values; + unsigned int match_values_count; + struct devlink_dpipe_value *action_values; + unsigned int action_values_count; + u64 counter; + bool counter_valid; + long: 32; +}; + +struct devlink_dpipe_dump_ctx { + struct genl_info *info; + enum devlink_command cmd; + struct sk_buff *skb; + struct nlattr *nest; + void *hdr; +}; + +struct devlink_dpipe_table_ops; + +struct devlink_dpipe_table { + void *priv; + struct list_head list; + const char *name; + bool counters_enabled; + bool counter_control_extern; + bool resource_valid; + long: 32; + u64 resource_id; + u64 resource_units; + struct devlink_dpipe_table_ops *table_ops; + struct callback_head rcu; + long: 32; +}; + +struct devlink_dpipe_table_ops { + int (*actions_dump)(void *, struct sk_buff *); + int (*matches_dump)(void *, struct sk_buff *); + int (*entries_dump)(void *, bool, struct devlink_dpipe_dump_ctx *); + int (*counters_set_update)(void *, bool); + u64 (*size_get)(void *); +}; + +struct devlink_dpipe_headers { + struct devlink_dpipe_header **headers; + unsigned int headers_count; +}; + +struct devlink_resource_size_params { + u64 size_min; + u64 size_max; + u64 size_granularity; + enum devlink_resource_unit unit; + long: 32; +}; + +typedef u64 devlink_resource_occ_get_t(void *); + +enum devlink_param_type { + DEVLINK_PARAM_TYPE_U8 = 0, + DEVLINK_PARAM_TYPE_U16 = 1, + DEVLINK_PARAM_TYPE_U32 = 2, + DEVLINK_PARAM_TYPE_STRING = 3, + DEVLINK_PARAM_TYPE_BOOL = 4, +}; + +struct devlink_param { + u32 id; + const char *name; + bool generic; + enum devlink_param_type type; + long unsigned int supported_cmodes; + int (*get)(struct devlink *, u32, struct devlink_param_gset_ctx *); + int (*set)(struct devlink *, u32, struct devlink_param_gset_ctx *); + int (*validate)(struct devlink *, u32, union devlink_param_value, struct netlink_ext_ack *); +}; + +struct devlink_param_item { + struct list_head list; + const struct devlink_param *param; + union devlink_param_value driverinit_value; + bool driverinit_value_valid; +}; + +enum devlink_param_generic_id { + DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET = 0, + DEVLINK_PARAM_GENERIC_ID_MAX_MACS = 1, + DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV = 2, + DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT = 3, + DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI = 4, + DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX = 5, + DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN = 6, + DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY = 7, + DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE = 8, + DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE = 9, + DEVLINK_PARAM_GENERIC_ID_ENABLE_REMOTE_DEV_RESET = 10, + DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH = 11, + DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA = 12, + DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET = 13, + DEVLINK_PARAM_GENERIC_ID_ENABLE_IWARP = 14, + DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE = 15, + DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE = 16, + __DEVLINK_PARAM_GENERIC_ID_MAX = 17, + DEVLINK_PARAM_GENERIC_ID_MAX = 16, +}; + +struct devlink_flash_update_params { + const struct firmware *fw; + const char *component; + u32 overwrite_mask; +}; + +struct devlink_region_ops { + const char *name; + void (*destructor)(const void *); + int (*snapshot)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u8 **); + int (*read)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *); + void *priv; +}; + +struct devlink_port_region_ops { + const char *name; + void (*destructor)(const void *); + int (*snapshot)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u8 **); + int (*read)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *); + void *priv; +}; + +enum devlink_health_reporter_state { + DEVLINK_HEALTH_REPORTER_STATE_HEALTHY = 0, + DEVLINK_HEALTH_REPORTER_STATE_ERROR = 1, +}; + +struct devlink_health_reporter; + +struct devlink_fmsg; + +struct devlink_health_reporter_ops { + char *name; + int (*recover)(struct devlink_health_reporter *, void *, struct netlink_ext_ack *); + int (*dump)(struct devlink_health_reporter *, struct devlink_fmsg *, void *, struct netlink_ext_ack *); + int (*diagnose)(struct devlink_health_reporter *, struct devlink_fmsg *, struct netlink_ext_ack *); + int (*test)(struct devlink_health_reporter *, struct netlink_ext_ack *); +}; + +struct devlink_health_reporter { + struct list_head list; + void *priv; + const struct devlink_health_reporter_ops *ops; + struct devlink *devlink; + struct devlink_port *devlink_port; + struct devlink_fmsg *dump_fmsg; + struct mutex dump_lock; + u64 graceful_period; + bool auto_recover; + bool auto_dump; + u8 health_state; + long: 32; + u64 dump_ts; + u64 dump_real_ts; + u64 error_count; + u64 recovery_count; + u64 last_recovery_ts; +}; + +struct devlink_fmsg { + struct list_head item_list; + bool putting_binary; +}; + +struct devlink_trap_metadata { + const char *trap_name; + const char *trap_group_name; + struct net_device *input_dev; + netdevice_tracker dev_tracker; + const struct flow_action_cookie *fa_cookie; + enum devlink_trap_type trap_type; +}; + +struct devlink_trap_policer { + u32 id; + long: 32; + u64 init_rate; + u64 init_burst; + u64 max_rate; + u64 min_rate; + u64 max_burst; + u64 min_burst; +}; + +struct devlink_trap_group { + const char *name; + u16 id; + bool generic; + u32 init_policer_id; +}; + +struct devlink_trap { + enum devlink_trap_type type; + enum devlink_trap_action init_action; + bool generic; + u16 id; + const char *name; + u16 init_group_id; + u32 metadata_cap; +}; + +enum devlink_trap_generic_id { + DEVLINK_TRAP_GENERIC_ID_SMAC_MC = 0, + DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH = 1, + DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER = 2, + DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER = 3, + DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST = 4, + DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER = 5, + DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE = 6, + DEVLINK_TRAP_GENERIC_ID_TTL_ERROR = 7, + DEVLINK_TRAP_GENERIC_ID_TAIL_DROP = 8, + DEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET = 9, + DEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC = 10, + DEVLINK_TRAP_GENERIC_ID_DIP_LB = 11, + DEVLINK_TRAP_GENERIC_ID_SIP_MC = 12, + DEVLINK_TRAP_GENERIC_ID_SIP_LB = 13, + DEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR = 14, + DEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC = 15, + DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE = 16, + DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE = 17, + DEVLINK_TRAP_GENERIC_ID_MTU_ERROR = 18, + DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH = 19, + DEVLINK_TRAP_GENERIC_ID_RPF = 20, + DEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE = 21, + DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS = 22, + DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS = 23, + DEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE = 24, + DEVLINK_TRAP_GENERIC_ID_DECAP_ERROR = 25, + DEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC = 26, + DEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP = 27, + DEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP = 28, + DEVLINK_TRAP_GENERIC_ID_STP = 29, + DEVLINK_TRAP_GENERIC_ID_LACP = 30, + DEVLINK_TRAP_GENERIC_ID_LLDP = 31, + DEVLINK_TRAP_GENERIC_ID_IGMP_QUERY = 32, + DEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT = 33, + DEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT = 34, + DEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT = 35, + DEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE = 36, + DEVLINK_TRAP_GENERIC_ID_MLD_QUERY = 37, + DEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT = 38, + DEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT = 39, + DEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE = 40, + DEVLINK_TRAP_GENERIC_ID_IPV4_DHCP = 41, + DEVLINK_TRAP_GENERIC_ID_IPV6_DHCP = 42, + DEVLINK_TRAP_GENERIC_ID_ARP_REQUEST = 43, + DEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE = 44, + DEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY = 45, + DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT = 46, + DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT = 47, + DEVLINK_TRAP_GENERIC_ID_IPV4_BFD = 48, + DEVLINK_TRAP_GENERIC_ID_IPV6_BFD = 49, + DEVLINK_TRAP_GENERIC_ID_IPV4_OSPF = 50, + DEVLINK_TRAP_GENERIC_ID_IPV6_OSPF = 51, + DEVLINK_TRAP_GENERIC_ID_IPV4_BGP = 52, + DEVLINK_TRAP_GENERIC_ID_IPV6_BGP = 53, + DEVLINK_TRAP_GENERIC_ID_IPV4_VRRP = 54, + DEVLINK_TRAP_GENERIC_ID_IPV6_VRRP = 55, + DEVLINK_TRAP_GENERIC_ID_IPV4_PIM = 56, + DEVLINK_TRAP_GENERIC_ID_IPV6_PIM = 57, + DEVLINK_TRAP_GENERIC_ID_UC_LB = 58, + DEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE = 59, + DEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE = 60, + DEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE = 61, + DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES = 62, + DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS = 63, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT = 64, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT = 65, + DEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT = 66, + DEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT = 67, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT = 68, + DEVLINK_TRAP_GENERIC_ID_PTP_EVENT = 69, + DEVLINK_TRAP_GENERIC_ID_PTP_GENERAL = 70, + DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE = 71, + DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP = 72, + DEVLINK_TRAP_GENERIC_ID_EARLY_DROP = 73, + DEVLINK_TRAP_GENERIC_ID_VXLAN_PARSING = 74, + DEVLINK_TRAP_GENERIC_ID_LLC_SNAP_PARSING = 75, + DEVLINK_TRAP_GENERIC_ID_VLAN_PARSING = 76, + DEVLINK_TRAP_GENERIC_ID_PPPOE_PPP_PARSING = 77, + DEVLINK_TRAP_GENERIC_ID_MPLS_PARSING = 78, + DEVLINK_TRAP_GENERIC_ID_ARP_PARSING = 79, + DEVLINK_TRAP_GENERIC_ID_IP_1_PARSING = 80, + DEVLINK_TRAP_GENERIC_ID_IP_N_PARSING = 81, + DEVLINK_TRAP_GENERIC_ID_GRE_PARSING = 82, + DEVLINK_TRAP_GENERIC_ID_UDP_PARSING = 83, + DEVLINK_TRAP_GENERIC_ID_TCP_PARSING = 84, + DEVLINK_TRAP_GENERIC_ID_IPSEC_PARSING = 85, + DEVLINK_TRAP_GENERIC_ID_SCTP_PARSING = 86, + DEVLINK_TRAP_GENERIC_ID_DCCP_PARSING = 87, + DEVLINK_TRAP_GENERIC_ID_GTP_PARSING = 88, + DEVLINK_TRAP_GENERIC_ID_ESP_PARSING = 89, + DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_NEXTHOP = 90, + DEVLINK_TRAP_GENERIC_ID_DMAC_FILTER = 91, + DEVLINK_TRAP_GENERIC_ID_EAPOL = 92, + DEVLINK_TRAP_GENERIC_ID_LOCKED_PORT = 93, + __DEVLINK_TRAP_GENERIC_ID_MAX = 94, + DEVLINK_TRAP_GENERIC_ID_MAX = 93, +}; + +enum devlink_trap_group_generic_id { + DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS = 0, + DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS = 1, + DEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS = 2, + DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS = 3, + DEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS = 4, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS = 5, + DEVLINK_TRAP_GROUP_GENERIC_ID_STP = 6, + DEVLINK_TRAP_GROUP_GENERIC_ID_LACP = 7, + DEVLINK_TRAP_GROUP_GENERIC_ID_LLDP = 8, + DEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING = 9, + DEVLINK_TRAP_GROUP_GENERIC_ID_DHCP = 10, + DEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY = 11, + DEVLINK_TRAP_GROUP_GENERIC_ID_BFD = 12, + DEVLINK_TRAP_GROUP_GENERIC_ID_OSPF = 13, + DEVLINK_TRAP_GROUP_GENERIC_ID_BGP = 14, + DEVLINK_TRAP_GROUP_GENERIC_ID_VRRP = 15, + DEVLINK_TRAP_GROUP_GENERIC_ID_PIM = 16, + DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB = 17, + DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY = 18, + DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY = 19, + DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6 = 20, + DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT = 21, + DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL = 22, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE = 23, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP = 24, + DEVLINK_TRAP_GROUP_GENERIC_ID_PARSER_ERROR_DROPS = 25, + DEVLINK_TRAP_GROUP_GENERIC_ID_EAPOL = 26, + __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 27, + DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 26, +}; + +struct devlink_ops { + u32 supported_flash_update_params; + long unsigned int reload_actions; + long unsigned int reload_limits; + int (*reload_down)(struct devlink *, bool, enum devlink_reload_action, enum devlink_reload_limit, struct netlink_ext_ack *); + int (*reload_up)(struct devlink *, enum devlink_reload_action, enum devlink_reload_limit, u32 *, struct netlink_ext_ack *); + int (*port_type_set)(struct devlink_port *, enum devlink_port_type); + int (*port_split)(struct devlink *, struct devlink_port *, unsigned int, struct netlink_ext_ack *); + int (*port_unsplit)(struct devlink *, struct devlink_port *, struct netlink_ext_ack *); + int (*sb_pool_get)(struct devlink *, unsigned int, u16, struct devlink_sb_pool_info *); + int (*sb_pool_set)(struct devlink *, unsigned int, u16, u32, enum devlink_sb_threshold_type, struct netlink_ext_ack *); + int (*sb_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *); + int (*sb_port_pool_set)(struct devlink_port *, unsigned int, u16, u32, struct netlink_ext_ack *); + int (*sb_tc_pool_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16 *, u32 *); + int (*sb_tc_pool_bind_set)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16, u32, struct netlink_ext_ack *); + int (*sb_occ_snapshot)(struct devlink *, unsigned int); + int (*sb_occ_max_clear)(struct devlink *, unsigned int); + int (*sb_occ_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *, u32 *); + int (*sb_occ_tc_port_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u32 *, u32 *); + int (*eswitch_mode_get)(struct devlink *, u16 *); + int (*eswitch_mode_set)(struct devlink *, u16, struct netlink_ext_ack *); + int (*eswitch_inline_mode_get)(struct devlink *, u8 *); + int (*eswitch_inline_mode_set)(struct devlink *, u8, struct netlink_ext_ack *); + int (*eswitch_encap_mode_get)(struct devlink *, enum devlink_eswitch_encap_mode *); + int (*eswitch_encap_mode_set)(struct devlink *, enum devlink_eswitch_encap_mode, struct netlink_ext_ack *); + int (*info_get)(struct devlink *, struct devlink_info_req *, struct netlink_ext_ack *); + int (*flash_update)(struct devlink *, struct devlink_flash_update_params *, struct netlink_ext_ack *); + int (*trap_init)(struct devlink *, const struct devlink_trap *, void *); + void (*trap_fini)(struct devlink *, const struct devlink_trap *, void *); + int (*trap_action_set)(struct devlink *, const struct devlink_trap *, enum devlink_trap_action, struct netlink_ext_ack *); + int (*trap_group_init)(struct devlink *, const struct devlink_trap_group *); + int (*trap_group_set)(struct devlink *, const struct devlink_trap_group *, const struct devlink_trap_policer *, struct netlink_ext_ack *); + int (*trap_group_action_set)(struct devlink *, const struct devlink_trap_group *, enum devlink_trap_action, struct netlink_ext_ack *); + int (*trap_drop_counter_get)(struct devlink *, const struct devlink_trap *, u64 *); + int (*trap_policer_init)(struct devlink *, const struct devlink_trap_policer *); + void (*trap_policer_fini)(struct devlink *, const struct devlink_trap_policer *); + int (*trap_policer_set)(struct devlink *, const struct devlink_trap_policer *, u64, u64, struct netlink_ext_ack *); + int (*trap_policer_counter_get)(struct devlink *, const struct devlink_trap_policer *, u64 *); + int (*port_function_hw_addr_get)(struct devlink_port *, u8 *, int *, struct netlink_ext_ack *); + int (*port_function_hw_addr_set)(struct devlink_port *, const u8 *, int, struct netlink_ext_ack *); + int (*port_fn_roce_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_roce_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_fn_migratable_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_migratable_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_new)(struct devlink *, const struct devlink_port_new_attrs *, struct netlink_ext_ack *, unsigned int *); + int (*port_del)(struct devlink *, unsigned int, struct netlink_ext_ack *); + int (*port_fn_state_get)(struct devlink_port *, enum devlink_port_fn_state *, enum devlink_port_fn_opstate *, struct netlink_ext_ack *); + int (*port_fn_state_set)(struct devlink_port *, enum devlink_port_fn_state, struct netlink_ext_ack *); + int (*rate_leaf_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_leaf_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_leaf_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_leaf_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_node_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_node_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_node_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_node_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_node_new)(struct devlink_rate *, void **, struct netlink_ext_ack *); + int (*rate_node_del)(struct devlink_rate *, void *, struct netlink_ext_ack *); + int (*rate_leaf_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); + int (*rate_node_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); + bool (*selftest_check)(struct devlink *, unsigned int, struct netlink_ext_ack *); + enum devlink_selftest_status (*selftest_run)(struct devlink *, unsigned int, struct netlink_ext_ack *); +}; + +struct trace_event_raw_devlink_hwmsg { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + bool incoming; + long unsigned int type; + u32 __data_loc_buf; + size_t len; + char __data[0]; +}; + +struct trace_event_raw_devlink_hwerr { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + int err; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_report { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_recover_aborted { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + bool health_state; + long: 32; + u64 time_since_last_recover; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_reporter_state_update { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + u8 new_state; + char __data[0]; +}; + +struct trace_event_raw_devlink_trap_report { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_trap_name; + u32 __data_loc_trap_group_name; + char input_dev_name[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_devlink_hwmsg { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 buf; +}; + +struct trace_event_data_offsets_devlink_hwerr { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 msg; +}; + +struct trace_event_data_offsets_devlink_health_report { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; + u32 msg; +}; + +struct trace_event_data_offsets_devlink_health_recover_aborted { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; +}; + +struct trace_event_data_offsets_devlink_health_reporter_state_update { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; +}; + +struct trace_event_data_offsets_devlink_trap_report { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 trap_name; + u32 trap_group_name; +}; + +typedef void (*btf_trace_devlink_hwmsg)(void *, const struct devlink *, bool, long unsigned int, const u8 *, size_t); + +typedef void (*btf_trace_devlink_hwerr)(void *, const struct devlink *, int, const char *); + +typedef void (*btf_trace_devlink_health_report)(void *, const struct devlink *, const char *, const char *); + +typedef void (*btf_trace_devlink_health_recover_aborted)(void *, const struct devlink *, const char *, bool, u64); + +typedef void (*btf_trace_devlink_health_reporter_state_update)(void *, const struct devlink *, const char *, bool); + +typedef void (*btf_trace_devlink_trap_report)(void *, const struct devlink *, struct sk_buff *, const struct devlink_trap_metadata *); + +enum devlink_multicast_groups { + DEVLINK_MCGRP_CONFIG = 0, +}; + +struct devlink_nl_dump_state { + long unsigned int instance; + int idx; + union { + struct { + u64 start_offset; + }; + struct { + u64 dump_ts; + }; + }; +}; + +struct devlink_cmd { + int (*dump_one)(struct sk_buff *, struct devlink *, struct netlink_callback *); +}; + +struct devlink_linecard_type { + const char *type; + const void *priv; +}; + +struct devlink_resource { + const char *name; + long: 32; + u64 id; + u64 size; + u64 size_new; + bool size_valid; + struct devlink_resource *parent; + struct devlink_resource_size_params size_params; + struct list_head list; + struct list_head resource_list; + devlink_resource_occ_get_t *occ_get; + void *occ_get_priv; +}; + +struct devlink_sb { + struct list_head list; + unsigned int index; + u32 size; + u16 ingress_pools_count; + u16 egress_pools_count; + u16 ingress_tc_count; + u16 egress_tc_count; +}; + +struct devlink_region { + struct devlink *devlink; + struct devlink_port *port; + struct list_head list; + union { + const struct devlink_region_ops *ops; + const struct devlink_port_region_ops *port_ops; + }; + struct mutex snapshot_lock; + struct list_head snapshot_list; + u32 max_snapshots; + u32 cur_snapshots; + u64 size; +}; + +struct devlink_snapshot { + struct list_head list; + struct devlink_region *region; + u8 *data; + u32 id; +}; + +typedef int devlink_chunk_fill_t(void *, u8 *, u32, u64, struct netlink_ext_ack *); + +struct devlink_fmsg_item { + struct list_head list; + int attrtype; + u8 nla_type; + u16 len; + int value[0]; +}; + +struct devlink_stats { + u64_stats_t rx_bytes; + u64_stats_t rx_packets; + struct u64_stats_sync syncp; + long: 32; +}; + +struct devlink_trap_policer_item { + const struct devlink_trap_policer *policer; + long: 32; + u64 rate; + u64 burst; + struct list_head list; +}; + +struct devlink_trap_group_item { + const struct devlink_trap_group *group; + struct devlink_trap_policer_item *policer_item; + struct list_head list; + struct devlink_stats *stats; +}; + +struct devlink_trap_item { + const struct devlink_trap *trap; + struct devlink_trap_group_item *group_item; + struct list_head list; + enum devlink_trap_action action; + struct devlink_stats *stats; + void *priv; +}; + +enum devlink_eswitch_mode { + DEVLINK_ESWITCH_MODE_LEGACY = 0, + DEVLINK_ESWITCH_MODE_SWITCHDEV = 1, +}; + +enum { + DEVLINK_FLASH_OVERWRITE_SETTINGS_BIT = 0, + DEVLINK_FLASH_OVERWRITE_IDENTIFIERS_BIT = 1, + __DEVLINK_FLASH_OVERWRITE_MAX_BIT = 2, + DEVLINK_FLASH_OVERWRITE_MAX_BIT = 1, +}; + +enum devlink_attr_selftest_id { + DEVLINK_ATTR_SELFTEST_ID_UNSPEC = 0, + DEVLINK_ATTR_SELFTEST_ID_FLASH = 1, + __DEVLINK_ATTR_SELFTEST_ID_MAX = 2, + DEVLINK_ATTR_SELFTEST_ID_MAX = 1, +}; + +enum devlink_attr_selftest_result { + DEVLINK_ATTR_SELFTEST_RESULT_UNSPEC = 0, + DEVLINK_ATTR_SELFTEST_RESULT = 1, + DEVLINK_ATTR_SELFTEST_RESULT_ID = 2, + DEVLINK_ATTR_SELFTEST_RESULT_STATUS = 3, + __DEVLINK_ATTR_SELFTEST_RESULT_MAX = 4, + DEVLINK_ATTR_SELFTEST_RESULT_MAX = 3, +}; + +struct devlink_flash_notify { + const char *status_msg; + const char *component; + long unsigned int done; + long unsigned int total; + long unsigned int timeout; +}; + +enum devlink_info_version_type { + DEVLINK_INFO_VERSION_TYPE_NONE = 0, + DEVLINK_INFO_VERSION_TYPE_COMPONENT = 1, +}; + +struct devlink_info_req { + struct sk_buff *msg; + void (*version_cb)(const char *, enum devlink_info_version_type, void *); + void *version_cb_priv; +}; + +struct devlink_reload_combination { + enum devlink_reload_action action; + enum devlink_reload_limit limit; +}; + +struct devlink_flash_component_lookup_ctx { + const char *lookup_name; + bool lookup_name_found; +}; + +struct devlink_resource; + +struct vlan_group { + unsigned int nr_vlan_devs; + struct hlist_node hlist; + struct net_device **vlan_devices_arrays[16]; +}; + +struct vlan_info { + struct net_device *real_dev; + struct vlan_group grp; + struct list_head vid_list; + unsigned int nr_vids; + struct callback_head rcu; +}; + +enum vlan_flags { + VLAN_FLAG_REORDER_HDR = 1, + VLAN_FLAG_GVRP = 2, + VLAN_FLAG_LOOSE_BINDING = 4, + VLAN_FLAG_MVRP = 8, + VLAN_FLAG_BRIDGE_BINDING = 16, +}; + +struct vlan_pcpu_stats { + u64_stats_t rx_packets; + u64_stats_t rx_bytes; + u64_stats_t rx_multicast; + u64_stats_t tx_packets; + u64_stats_t tx_bytes; + struct u64_stats_sync syncp; + u32 rx_errors; + u32 tx_dropped; + long: 32; +}; + +struct vlan_priority_tci_mapping { + u32 priority; + u16 vlan_qos; + struct vlan_priority_tci_mapping *next; +}; + +struct vlan_dev_priv { + unsigned int nr_ingress_mappings; + u32 ingress_priority_map[8]; + unsigned int nr_egress_mappings; + struct vlan_priority_tci_mapping *egress_priority_map[16]; + __be16 vlan_proto; + u16 vlan_id; + u16 flags; + struct net_device *real_dev; + netdevice_tracker dev_tracker; + unsigned char real_dev_addr[6]; + struct proc_dir_entry *dent; + struct vlan_pcpu_stats *vlan_pcpu_stats; + struct netpoll *netpoll; +}; + +enum vlan_protos { + VLAN_PROTO_8021Q = 0, + VLAN_PROTO_8021AD = 1, + VLAN_PROTO_NUM = 2, +}; + +struct vlan_vid_info { + struct list_head list; + __be16 proto; + u16 vid; + int refcount; +}; + +enum nl80211_iftype { + NL80211_IFTYPE_UNSPECIFIED = 0, + NL80211_IFTYPE_ADHOC = 1, + NL80211_IFTYPE_STATION = 2, + NL80211_IFTYPE_AP = 3, + NL80211_IFTYPE_AP_VLAN = 4, + NL80211_IFTYPE_WDS = 5, + NL80211_IFTYPE_MONITOR = 6, + NL80211_IFTYPE_MESH_POINT = 7, + NL80211_IFTYPE_P2P_CLIENT = 8, + NL80211_IFTYPE_P2P_GO = 9, + NL80211_IFTYPE_P2P_DEVICE = 10, + NL80211_IFTYPE_OCB = 11, + NL80211_IFTYPE_NAN = 12, + NUM_NL80211_IFTYPES = 13, + NL80211_IFTYPE_MAX = 12, +}; + +struct cfg80211_conn; + +struct cfg80211_cached_keys; + +enum ieee80211_bss_type { + IEEE80211_BSS_TYPE_ESS = 0, + IEEE80211_BSS_TYPE_PBSS = 1, + IEEE80211_BSS_TYPE_IBSS = 2, + IEEE80211_BSS_TYPE_MBSS = 3, + IEEE80211_BSS_TYPE_ANY = 4, +}; + +enum nl80211_chan_width { + NL80211_CHAN_WIDTH_20_NOHT = 0, + NL80211_CHAN_WIDTH_20 = 1, + NL80211_CHAN_WIDTH_40 = 2, + NL80211_CHAN_WIDTH_80 = 3, + NL80211_CHAN_WIDTH_80P80 = 4, + NL80211_CHAN_WIDTH_160 = 5, + NL80211_CHAN_WIDTH_5 = 6, + NL80211_CHAN_WIDTH_10 = 7, + NL80211_CHAN_WIDTH_1 = 8, + NL80211_CHAN_WIDTH_2 = 9, + NL80211_CHAN_WIDTH_4 = 10, + NL80211_CHAN_WIDTH_8 = 11, + NL80211_CHAN_WIDTH_16 = 12, + NL80211_CHAN_WIDTH_320 = 13, +}; + +enum ieee80211_edmg_bw_config { + IEEE80211_EDMG_BW_CONFIG_4 = 4, + IEEE80211_EDMG_BW_CONFIG_5 = 5, + IEEE80211_EDMG_BW_CONFIG_6 = 6, + IEEE80211_EDMG_BW_CONFIG_7 = 7, + IEEE80211_EDMG_BW_CONFIG_8 = 8, + IEEE80211_EDMG_BW_CONFIG_9 = 9, + IEEE80211_EDMG_BW_CONFIG_10 = 10, + IEEE80211_EDMG_BW_CONFIG_11 = 11, + IEEE80211_EDMG_BW_CONFIG_12 = 12, + IEEE80211_EDMG_BW_CONFIG_13 = 13, + IEEE80211_EDMG_BW_CONFIG_14 = 14, + IEEE80211_EDMG_BW_CONFIG_15 = 15, +}; + +struct ieee80211_edmg { + u8 channels; + enum ieee80211_edmg_bw_config bw_config; +}; + +struct ieee80211_channel; + +struct cfg80211_chan_def { + struct ieee80211_channel *chan; + enum nl80211_chan_width width; + u32 center_freq1; + u32 center_freq2; + struct ieee80211_edmg edmg; + u16 freq1_offset; +}; + +struct ieee80211_mcs_info { + u8 rx_mask[10]; + __le16 rx_highest; + u8 tx_params; + u8 reserved[3]; +}; + +struct ieee80211_ht_cap { + __le16 cap_info; + u8 ampdu_params_info; + struct ieee80211_mcs_info mcs; + __le16 extended_ht_cap_info; + __le32 tx_BF_cap_info; + u8 antenna_selection_info; +} __attribute__((packed)); + +struct key_params; + +struct cfg80211_ibss_params { + const u8 *ssid; + const u8 *bssid; + struct cfg80211_chan_def chandef; + const u8 *ie; + u8 ssid_len; + u8 ie_len; + u16 beacon_interval; + u32 basic_rates; + bool channel_fixed; + bool privacy; + bool control_port; + bool control_port_over_nl80211; + bool userspace_handles_dfs; + int mcast_rate[6]; + struct ieee80211_ht_cap ht_capa; + struct ieee80211_ht_cap ht_capa_mask; + struct key_params *wep_keys; + int wep_tx_key; +}; + +enum nl80211_auth_type { + NL80211_AUTHTYPE_OPEN_SYSTEM = 0, + NL80211_AUTHTYPE_SHARED_KEY = 1, + NL80211_AUTHTYPE_FT = 2, + NL80211_AUTHTYPE_NETWORK_EAP = 3, + NL80211_AUTHTYPE_SAE = 4, + NL80211_AUTHTYPE_FILS_SK = 5, + NL80211_AUTHTYPE_FILS_SK_PFS = 6, + NL80211_AUTHTYPE_FILS_PK = 7, + __NL80211_AUTHTYPE_NUM = 8, + NL80211_AUTHTYPE_MAX = 7, + NL80211_AUTHTYPE_AUTOMATIC = 8, +}; + +enum nl80211_mfp { + NL80211_MFP_NO = 0, + NL80211_MFP_REQUIRED = 1, + NL80211_MFP_OPTIONAL = 2, +}; + +enum nl80211_sae_pwe_mechanism { + NL80211_SAE_PWE_UNSPECIFIED = 0, + NL80211_SAE_PWE_HUNT_AND_PECK = 1, + NL80211_SAE_PWE_HASH_TO_ELEMENT = 2, + NL80211_SAE_PWE_BOTH = 3, +}; + +struct cfg80211_crypto_settings { + u32 wpa_versions; + u32 cipher_group; + int n_ciphers_pairwise; + u32 ciphers_pairwise[5]; + int n_akm_suites; + u32 akm_suites[10]; + bool control_port; + __be16 control_port_ethertype; + bool control_port_no_encrypt; + bool control_port_over_nl80211; + bool control_port_no_preauth; + const u8 *psk; + const u8 *sae_pwd; + u8 sae_pwd_len; + enum nl80211_sae_pwe_mechanism sae_pwe; +}; + +struct ieee80211_vht_mcs_info { + __le16 rx_mcs_map; + __le16 rx_highest; + __le16 tx_mcs_map; + __le16 tx_highest; +}; + +struct ieee80211_vht_cap { + __le32 vht_cap_info; + struct ieee80211_vht_mcs_info supp_mcs; +}; + +enum nl80211_bss_select_attr { + __NL80211_BSS_SELECT_ATTR_INVALID = 0, + NL80211_BSS_SELECT_ATTR_RSSI = 1, + NL80211_BSS_SELECT_ATTR_BAND_PREF = 2, + NL80211_BSS_SELECT_ATTR_RSSI_ADJUST = 3, + __NL80211_BSS_SELECT_ATTR_AFTER_LAST = 4, + NL80211_BSS_SELECT_ATTR_MAX = 3, +}; + +enum nl80211_band { + NL80211_BAND_2GHZ = 0, + NL80211_BAND_5GHZ = 1, + NL80211_BAND_60GHZ = 2, + NL80211_BAND_6GHZ = 3, + NL80211_BAND_S1GHZ = 4, + NL80211_BAND_LC = 5, + NUM_NL80211_BANDS = 6, +}; + +struct cfg80211_bss_select_adjust { + enum nl80211_band band; + s8 delta; +}; + +struct cfg80211_bss_selection { + enum nl80211_bss_select_attr behaviour; + union { + enum nl80211_band band_pref; + struct cfg80211_bss_select_adjust adjust; + } param; +}; + +struct cfg80211_connect_params { + struct ieee80211_channel *channel; + struct ieee80211_channel *channel_hint; + const u8 *bssid; + const u8 *bssid_hint; + const u8 *ssid; + size_t ssid_len; + enum nl80211_auth_type auth_type; + const u8 *ie; + size_t ie_len; + bool privacy; + enum nl80211_mfp mfp; + struct cfg80211_crypto_settings crypto; + const u8 *key; + u8 key_len; + u8 key_idx; + u32 flags; + int bg_scan_period; + struct ieee80211_ht_cap ht_capa; + struct ieee80211_ht_cap ht_capa_mask; + struct ieee80211_vht_cap vht_capa; + struct ieee80211_vht_cap vht_capa_mask; + bool pbss; + struct cfg80211_bss_selection bss_select; + const u8 *prev_bssid; + const u8 *fils_erp_username; + size_t fils_erp_username_len; + const u8 *fils_erp_realm; + size_t fils_erp_realm_len; + u16 fils_erp_next_seq_num; + const u8 *fils_erp_rrk; + size_t fils_erp_rrk_len; + bool want_1x; + struct ieee80211_edmg edmg; +}; + +struct cfg80211_cqm_config; + +struct cfg80211_internal_bss; + +struct wiphy; + +struct wireless_dev { + struct wiphy *wiphy; + enum nl80211_iftype iftype; + struct list_head list; + struct net_device *netdev; + u32 identifier; + struct list_head mgmt_registrations; + u8 mgmt_registrations_need_update: 1; + struct mutex mtx; + bool use_4addr; + bool is_running; + bool registered; + bool registering; + u8 address[6]; + struct cfg80211_conn *conn; + struct cfg80211_cached_keys *connect_keys; + enum ieee80211_bss_type conn_bss_type; + u32 conn_owner_nlportid; + struct work_struct disconnect_wk; + u8 disconnect_bssid[6]; + struct list_head event_list; + spinlock_t event_lock; + u8 connected: 1; + bool ps; + int ps_timeout; + u32 ap_unexpected_nlportid; + u32 owner_nlportid; + bool nl_owner_dead; + bool cac_started; + long unsigned int cac_start_time; + unsigned int cac_time_ms; + struct { + struct cfg80211_ibss_params ibss; + struct cfg80211_connect_params connect; + struct cfg80211_cached_keys *keys; + const u8 *ie; + size_t ie_len; + u8 bssid[6]; + u8 prev_bssid[6]; + u8 ssid[32]; + s8 default_key; + s8 default_mgmt_key; + bool prev_bssid_valid; + } wext; + struct cfg80211_cqm_config *cqm_config; + struct list_head pmsr_list; + spinlock_t pmsr_lock; + struct work_struct pmsr_free_wk; + long unsigned int unprot_beacon_reported; + union { + struct { + u8 connected_addr[6]; + u8 ssid[32]; + u8 ssid_len; + long: 0; + } client; + struct { + int beacon_interval; + struct cfg80211_chan_def preset_chandef; + struct cfg80211_chan_def chandef; + u8 id[32]; + u8 id_len; + u8 id_up_len; + } mesh; + struct { + struct cfg80211_chan_def preset_chandef; + u8 ssid[32]; + u8 ssid_len; + } ap; + struct { + struct cfg80211_internal_bss *current_bss; + struct cfg80211_chan_def chandef; + int beacon_interval; + u8 ssid[32]; + u8 ssid_len; + } ibss; + struct { + struct cfg80211_chan_def chandef; + } ocb; + } u; + struct { + u8 addr[6]; + union { + struct { + unsigned int beacon_interval; + struct cfg80211_chan_def chandef; + } ap; + struct { + struct cfg80211_internal_bss *current_bss; + } client; + }; + } links[15]; + u16 valid_links; +}; + +struct iw_encode_ext { + __u32 ext_flags; + __u8 tx_seq[8]; + __u8 rx_seq[8]; + struct sockaddr addr; + __u16 alg; + __u16 key_len; + __u8 key[0]; +}; + +struct iwreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union iwreq_data u; +}; + +struct iw_event { + __u16 len; + __u16 cmd; + union iwreq_data u; +}; + +enum nl80211_reg_initiator { + NL80211_REGDOM_SET_BY_CORE = 0, + NL80211_REGDOM_SET_BY_USER = 1, + NL80211_REGDOM_SET_BY_DRIVER = 2, + NL80211_REGDOM_SET_BY_COUNTRY_IE = 3, +}; + +enum nl80211_dfs_regions { + NL80211_DFS_UNSET = 0, + NL80211_DFS_FCC = 1, + NL80211_DFS_ETSI = 2, + NL80211_DFS_JP = 3, +}; + +enum nl80211_user_reg_hint_type { + NL80211_USER_REG_HINT_USER = 0, + NL80211_USER_REG_HINT_CELL_BASE = 1, + NL80211_USER_REG_HINT_INDOOR = 2, +}; + +enum nl80211_mntr_flags { + __NL80211_MNTR_FLAG_INVALID = 0, + NL80211_MNTR_FLAG_FCSFAIL = 1, + NL80211_MNTR_FLAG_PLCPFAIL = 2, + NL80211_MNTR_FLAG_CONTROL = 3, + NL80211_MNTR_FLAG_OTHER_BSS = 4, + NL80211_MNTR_FLAG_COOK_FRAMES = 5, + NL80211_MNTR_FLAG_ACTIVE = 6, + __NL80211_MNTR_FLAG_AFTER_LAST = 7, + NL80211_MNTR_FLAG_MAX = 6, +}; + +enum nl80211_key_mode { + NL80211_KEY_RX_TX = 0, + NL80211_KEY_NO_TX = 1, + NL80211_KEY_SET_TX = 2, +}; + +enum nl80211_bss_scan_width { + NL80211_BSS_CHAN_WIDTH_20 = 0, + NL80211_BSS_CHAN_WIDTH_10 = 1, + NL80211_BSS_CHAN_WIDTH_5 = 2, + NL80211_BSS_CHAN_WIDTH_1 = 3, + NL80211_BSS_CHAN_WIDTH_2 = 4, +}; + +struct nl80211_wowlan_tcp_data_seq { + __u32 start; + __u32 offset; + __u32 len; +}; + +struct nl80211_wowlan_tcp_data_token { + __u32 offset; + __u32 len; + __u8 token_stream[0]; +}; + +struct nl80211_wowlan_tcp_data_token_feature { + __u32 min_len; + __u32 max_len; + __u32 bufsize; +}; + +enum nl80211_ext_feature_index { + NL80211_EXT_FEATURE_VHT_IBSS = 0, + NL80211_EXT_FEATURE_RRM = 1, + NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER = 2, + NL80211_EXT_FEATURE_SCAN_START_TIME = 3, + NL80211_EXT_FEATURE_BSS_PARENT_TSF = 4, + NL80211_EXT_FEATURE_SET_SCAN_DWELL = 5, + NL80211_EXT_FEATURE_BEACON_RATE_LEGACY = 6, + NL80211_EXT_FEATURE_BEACON_RATE_HT = 7, + NL80211_EXT_FEATURE_BEACON_RATE_VHT = 8, + NL80211_EXT_FEATURE_FILS_STA = 9, + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA = 10, + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED = 11, + NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI = 12, + NL80211_EXT_FEATURE_CQM_RSSI_LIST = 13, + NL80211_EXT_FEATURE_FILS_SK_OFFLOAD = 14, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK = 15, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X = 16, + NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME = 17, + NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP = 18, + NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE = 19, + NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION = 20, + NL80211_EXT_FEATURE_MFP_OPTIONAL = 21, + NL80211_EXT_FEATURE_LOW_SPAN_SCAN = 22, + NL80211_EXT_FEATURE_LOW_POWER_SCAN = 23, + NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN = 24, + NL80211_EXT_FEATURE_DFS_OFFLOAD = 25, + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211 = 26, + NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT = 27, + NL80211_EXT_FEATURE_DATA_ACK_SIGNAL_SUPPORT = 27, + NL80211_EXT_FEATURE_TXQS = 28, + NL80211_EXT_FEATURE_SCAN_RANDOM_SN = 29, + NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT = 30, + NL80211_EXT_FEATURE_CAN_REPLACE_PTK0 = 31, + NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER = 32, + NL80211_EXT_FEATURE_AIRTIME_FAIRNESS = 33, + NL80211_EXT_FEATURE_AP_PMKSA_CACHING = 34, + NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD = 35, + NL80211_EXT_FEATURE_EXT_KEY_ID = 36, + NL80211_EXT_FEATURE_STA_TX_PWR = 37, + NL80211_EXT_FEATURE_SAE_OFFLOAD = 38, + NL80211_EXT_FEATURE_VLAN_OFFLOAD = 39, + NL80211_EXT_FEATURE_AQL = 40, + NL80211_EXT_FEATURE_BEACON_PROTECTION = 41, + NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH = 42, + NL80211_EXT_FEATURE_PROTECTED_TWT = 43, + NL80211_EXT_FEATURE_DEL_IBSS_STA = 44, + NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS = 45, + NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT = 46, + NL80211_EXT_FEATURE_SCAN_FREQ_KHZ = 47, + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS = 48, + NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION = 49, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK = 50, + NL80211_EXT_FEATURE_SAE_OFFLOAD_AP = 51, + NL80211_EXT_FEATURE_FILS_DISCOVERY = 52, + NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP = 53, + NL80211_EXT_FEATURE_BEACON_RATE_HE = 54, + NL80211_EXT_FEATURE_SECURE_LTF = 55, + NL80211_EXT_FEATURE_SECURE_RTT = 56, + NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE = 57, + NL80211_EXT_FEATURE_BSS_COLOR = 58, + NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD = 59, + NL80211_EXT_FEATURE_RADAR_BACKGROUND = 60, + NL80211_EXT_FEATURE_POWERED_ADDR_CHANGE = 61, + NUM_NL80211_EXT_FEATURES = 62, + MAX_NL80211_EXT_FEATURES = 61, +}; + +enum nl80211_dfs_state { + NL80211_DFS_USABLE = 0, + NL80211_DFS_UNAVAILABLE = 1, + NL80211_DFS_AVAILABLE = 2, +}; + +struct nl80211_vendor_cmd_info { + __u32 vendor_id; + __u32 subcmd; +}; + +enum nl80211_sar_type { + NL80211_SAR_TYPE_POWER = 0, + NUM_NL80211_SAR_TYPE = 1, +}; + +struct ieee80211_he_cap_elem { + u8 mac_cap_info[6]; + u8 phy_cap_info[11]; +}; + +struct ieee80211_he_mcs_nss_supp { + __le16 rx_mcs_80; + __le16 tx_mcs_80; + __le16 rx_mcs_160; + __le16 tx_mcs_160; + __le16 rx_mcs_80p80; + __le16 tx_mcs_80p80; +}; + +struct ieee80211_eht_mcs_nss_supp_20mhz_only { + u8 rx_tx_mcs7_max_nss; + u8 rx_tx_mcs9_max_nss; + u8 rx_tx_mcs11_max_nss; + u8 rx_tx_mcs13_max_nss; +}; + +struct ieee80211_eht_mcs_nss_supp_bw { + u8 rx_tx_mcs9_max_nss; + u8 rx_tx_mcs11_max_nss; + u8 rx_tx_mcs13_max_nss; +}; + +struct ieee80211_eht_cap_elem_fixed { + u8 mac_cap_info[2]; + u8 phy_cap_info[9]; +}; + +struct ieee80211_he_6ghz_capa { + __le16 capa; +}; + +struct rfkill; + +enum environment_cap { + ENVIRON_ANY = 0, + ENVIRON_INDOOR = 1, + ENVIRON_OUTDOOR = 2, +}; + +struct regulatory_request { + struct callback_head callback_head; + int wiphy_idx; + enum nl80211_reg_initiator initiator; + enum nl80211_user_reg_hint_type user_reg_hint_type; + char alpha2[3]; + enum nl80211_dfs_regions dfs_region; + bool intersect; + bool processed; + enum environment_cap country_ie_env; + struct list_head list; +}; + +struct ieee80211_freq_range { + u32 start_freq_khz; + u32 end_freq_khz; + u32 max_bandwidth_khz; +}; + +struct ieee80211_power_rule { + u32 max_antenna_gain; + u32 max_eirp; +}; + +struct ieee80211_wmm_ac { + u16 cw_min; + u16 cw_max; + u16 cot; + u8 aifsn; +}; + +struct ieee80211_wmm_rule { + struct ieee80211_wmm_ac client[4]; + struct ieee80211_wmm_ac ap[4]; +}; + +struct ieee80211_reg_rule { + struct ieee80211_freq_range freq_range; + struct ieee80211_power_rule power_rule; + struct ieee80211_wmm_rule wmm_rule; + u32 flags; + u32 dfs_cac_ms; + bool has_wmm; +}; + +struct ieee80211_regdomain { + struct callback_head callback_head; + u32 n_reg_rules; + char alpha2[3]; + enum nl80211_dfs_regions dfs_region; + struct ieee80211_reg_rule reg_rules[0]; +}; + +struct ieee80211_channel { + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + u16 hw_value; + u32 flags; + int max_antenna_gain; + int max_power; + int max_reg_power; + bool beacon_found; + u32 orig_flags; + int orig_mag; + int orig_mpwr; + enum nl80211_dfs_state dfs_state; + long unsigned int dfs_state_entered; + unsigned int dfs_cac_ms; +}; + +struct ieee80211_rate { + u32 flags; + u16 bitrate; + u16 hw_value; + u16 hw_value_short; +}; + +struct ieee80211_sta_ht_cap { + u16 cap; + bool ht_supported; + u8 ampdu_factor; + u8 ampdu_density; + struct ieee80211_mcs_info mcs; + short: 0; +} __attribute__((packed)); + +struct ieee80211_sta_vht_cap { + bool vht_supported; + u32 cap; + struct ieee80211_vht_mcs_info vht_mcs; +}; + +struct ieee80211_sta_he_cap { + bool has_he; + struct ieee80211_he_cap_elem he_cap_elem; + struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp; + u8 ppe_thres[25]; +} __attribute__((packed)); + +struct ieee80211_eht_mcs_nss_supp { + union { + struct ieee80211_eht_mcs_nss_supp_20mhz_only only_20mhz; + struct { + struct ieee80211_eht_mcs_nss_supp_bw _80; + struct ieee80211_eht_mcs_nss_supp_bw _160; + struct ieee80211_eht_mcs_nss_supp_bw _320; + } bw; + }; +}; + +struct ieee80211_sta_eht_cap { + bool has_eht; + struct ieee80211_eht_cap_elem_fixed eht_cap_elem; + struct ieee80211_eht_mcs_nss_supp eht_mcs_nss_supp; + u8 eht_ppe_thres[32]; +}; + +struct ieee80211_sband_iftype_data { + u16 types_mask; + struct ieee80211_sta_he_cap he_cap; + struct ieee80211_he_6ghz_capa he_6ghz_capa; + struct ieee80211_sta_eht_cap eht_cap; + struct { + const u8 *data; + unsigned int len; + } vendor_elems; +} __attribute__((packed)); + +struct ieee80211_sta_s1g_cap { + bool s1g; + u8 cap[10]; + u8 nss_mcs[5]; +}; + +struct ieee80211_supported_band { + struct ieee80211_channel *channels; + struct ieee80211_rate *bitrates; + enum nl80211_band band; + int n_channels; + int n_bitrates; + struct ieee80211_sta_ht_cap ht_cap; + struct ieee80211_sta_vht_cap vht_cap; + struct ieee80211_sta_s1g_cap s1g_cap; + struct ieee80211_edmg edmg_cap; + u16 n_iftype_data; + const struct ieee80211_sband_iftype_data *iftype_data; +}; + +struct key_params { + const u8 *key; + const u8 *seq; + int key_len; + int seq_len; + u16 vlan_id; + u32 cipher; + enum nl80211_key_mode mode; +}; + +struct mac_address { + u8 addr[6]; +}; + +struct cfg80211_sar_freq_ranges { + u32 start_freq; + u32 end_freq; +}; + +struct cfg80211_sar_capa { + enum nl80211_sar_type type; + u32 num_freq_ranges; + const struct cfg80211_sar_freq_ranges *freq_ranges; +}; + +struct cfg80211_ssid { + u8 ssid[32]; + u8 ssid_len; +}; + +enum cfg80211_signal_type { + CFG80211_SIGNAL_TYPE_NONE = 0, + CFG80211_SIGNAL_TYPE_MBM = 1, + CFG80211_SIGNAL_TYPE_UNSPEC = 2, +}; + +struct ieee80211_txrx_stypes; + +struct ieee80211_iface_combination; + +struct wiphy_iftype_akm_suites; + +struct wiphy_wowlan_support; + +struct cfg80211_wowlan; + +struct wiphy_iftype_ext_capab; + +struct wiphy_coalesce_support; + +struct wiphy_vendor_command; + +struct cfg80211_pmsr_capabilities; + +struct wiphy { + struct mutex mtx; + u8 perm_addr[6]; + u8 addr_mask[6]; + struct mac_address *addresses; + const struct ieee80211_txrx_stypes *mgmt_stypes; + const struct ieee80211_iface_combination *iface_combinations; + int n_iface_combinations; + u16 software_iftypes; + u16 n_addresses; + u16 interface_modes; + u16 max_acl_mac_addrs; + u32 flags; + u32 regulatory_flags; + u32 features; + u8 ext_features[8]; + u32 ap_sme_capa; + enum cfg80211_signal_type signal_type; + int bss_priv_size; + u8 max_scan_ssids; + u8 max_sched_scan_reqs; + u8 max_sched_scan_ssids; + u8 max_match_sets; + u16 max_scan_ie_len; + u16 max_sched_scan_ie_len; + u32 max_sched_scan_plans; + u32 max_sched_scan_plan_interval; + u32 max_sched_scan_plan_iterations; + int n_cipher_suites; + const u32 *cipher_suites; + int n_akm_suites; + const u32 *akm_suites; + const struct wiphy_iftype_akm_suites *iftype_akm_suites; + unsigned int num_iftype_akm_suites; + u8 retry_short; + u8 retry_long; + u32 frag_threshold; + u32 rts_threshold; + u8 coverage_class; + char fw_version[32]; + u32 hw_version; + const struct wiphy_wowlan_support *wowlan; + struct cfg80211_wowlan *wowlan_config; + u16 max_remain_on_channel_duration; + u8 max_num_pmkids; + u32 available_antennas_tx; + u32 available_antennas_rx; + u32 probe_resp_offload; + const u8 *extended_capabilities; + const u8 *extended_capabilities_mask; + u8 extended_capabilities_len; + const struct wiphy_iftype_ext_capab *iftype_ext_capab; + unsigned int num_iftype_ext_capab; + const void *privid; + struct ieee80211_supported_band *bands[6]; + void (*reg_notifier)(struct wiphy *, struct regulatory_request *); + const struct ieee80211_regdomain *regd; + struct device dev; + bool registered; + struct dentry *debugfsdir; + const struct ieee80211_ht_cap *ht_capa_mod_mask; + const struct ieee80211_vht_cap *vht_capa_mod_mask; + struct list_head wdev_list; + possible_net_t _net; + const struct iw_handler_def *wext; + const struct wiphy_coalesce_support *coalesce; + const struct wiphy_vendor_command *vendor_commands; + const struct nl80211_vendor_cmd_info *vendor_events; + int n_vendor_commands; + int n_vendor_events; + u16 max_ap_assoc_sta; + u8 max_num_csa_counters; + u32 bss_select_support; + u8 nan_supported_bands; + u32 txq_limit; + u32 txq_memory_limit; + u32 txq_quantum; + long unsigned int tx_queue_len; + u8 support_mbssid: 1; + u8 support_only_he_mbssid: 1; + const struct cfg80211_pmsr_capabilities *pmsr_capa; + struct { + u64 peer; + u64 vif; + u8 max_retry; + long: 32; + } tid_config_support; + u8 max_data_retry_count; + const struct cfg80211_sar_capa *sar_capa; + struct rfkill *rfkill; + u8 mbssid_max_interfaces; + u8 ema_max_profile_periodicity; + u16 max_num_akm_suites; + long: 32; + long: 32; + long: 32; + long: 32; + char priv[0]; +}; + +struct cfg80211_match_set { + struct cfg80211_ssid ssid; + u8 bssid[6]; + s32 rssi_thold; + s32 per_band_rssi_thold[6]; +}; + +struct cfg80211_sched_scan_plan { + u32 interval; + u32 iterations; +}; + +struct cfg80211_sched_scan_request { + u64 reqid; + struct cfg80211_ssid *ssids; + int n_ssids; + u32 n_channels; + enum nl80211_bss_scan_width scan_width; + const u8 *ie; + size_t ie_len; + u32 flags; + struct cfg80211_match_set *match_sets; + int n_match_sets; + s32 min_rssi_thold; + u32 delay; + struct cfg80211_sched_scan_plan *scan_plans; + int n_scan_plans; + u8 mac_addr[6]; + u8 mac_addr_mask[6]; + bool relative_rssi_set; + s8 relative_rssi; + struct cfg80211_bss_select_adjust rssi_adjust; + struct wiphy *wiphy; + struct net_device *dev; + long unsigned int scan_start; + bool report_results; + struct callback_head callback_head; + u32 owner_nlportid; + bool nl_owner_dead; + struct list_head list; + struct ieee80211_channel *channels[0]; + long: 32; +}; + +struct cfg80211_pkt_pattern { + const u8 *mask; + const u8 *pattern; + int pattern_len; + int pkt_offset; +}; + +struct cfg80211_wowlan_tcp { + struct socket *sock; + __be32 src; + __be32 dst; + u16 src_port; + u16 dst_port; + u8 dst_mac[6]; + int payload_len; + const u8 *payload; + struct nl80211_wowlan_tcp_data_seq payload_seq; + u32 data_interval; + u32 wake_len; + const u8 *wake_data; + const u8 *wake_mask; + u32 tokens_size; + struct nl80211_wowlan_tcp_data_token payload_tok; +}; + +struct cfg80211_wowlan { + bool any; + bool disconnect; + bool magic_pkt; + bool gtk_rekey_failure; + bool eap_identity_req; + bool four_way_handshake; + bool rfkill_release; + struct cfg80211_pkt_pattern *patterns; + struct cfg80211_wowlan_tcp *tcp; + int n_patterns; + struct cfg80211_sched_scan_request *nd_config; +}; + +enum wiphy_flags { + WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK = 1, + WIPHY_FLAG_SUPPORTS_MLO = 2, + WIPHY_FLAG_SPLIT_SCAN_6GHZ = 4, + WIPHY_FLAG_NETNS_OK = 8, + WIPHY_FLAG_PS_ON_BY_DEFAULT = 16, + WIPHY_FLAG_4ADDR_AP = 32, + WIPHY_FLAG_4ADDR_STATION = 64, + WIPHY_FLAG_CONTROL_PORT_PROTOCOL = 128, + WIPHY_FLAG_IBSS_RSN = 256, + WIPHY_FLAG_MESH_AUTH = 1024, + WIPHY_FLAG_SUPPORTS_EXT_KCK_32 = 2048, + WIPHY_FLAG_SUPPORTS_FW_ROAM = 8192, + WIPHY_FLAG_AP_UAPSD = 16384, + WIPHY_FLAG_SUPPORTS_TDLS = 32768, + WIPHY_FLAG_TDLS_EXTERNAL_SETUP = 65536, + WIPHY_FLAG_HAVE_AP_SME = 131072, + WIPHY_FLAG_REPORTS_OBSS = 262144, + WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD = 524288, + WIPHY_FLAG_OFFCHAN_TX = 1048576, + WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL = 2097152, + WIPHY_FLAG_SUPPORTS_5_10_MHZ = 4194304, + WIPHY_FLAG_HAS_CHANNEL_SWITCH = 8388608, +}; + +struct ieee80211_iface_limit { + u16 max; + u16 types; +}; + +struct ieee80211_iface_combination { + const struct ieee80211_iface_limit *limits; + u32 num_different_channels; + u16 max_interfaces; + u8 n_limits; + bool beacon_int_infra_match; + u8 radar_detect_widths; + u8 radar_detect_regions; + u32 beacon_int_min_gcd; +}; + +struct ieee80211_txrx_stypes { + u16 tx; + u16 rx; +}; + +struct wiphy_wowlan_tcp_support { + const struct nl80211_wowlan_tcp_data_token_feature *tok; + u32 data_payload_max; + u32 data_interval_max; + u32 wake_payload_max; + bool seq; +}; + +struct wiphy_wowlan_support { + u32 flags; + int n_patterns; + int pattern_max_len; + int pattern_min_len; + int max_pkt_offset; + int max_nd_match_sets; + const struct wiphy_wowlan_tcp_support *tcp; +}; + +struct wiphy_coalesce_support { + int n_rules; + int max_delay; + int n_patterns; + int pattern_max_len; + int pattern_min_len; + int max_pkt_offset; +}; + +struct wiphy_vendor_command { + struct nl80211_vendor_cmd_info info; + u32 flags; + int (*doit)(struct wiphy *, struct wireless_dev *, const void *, int); + int (*dumpit)(struct wiphy *, struct wireless_dev *, struct sk_buff *, const void *, int, long unsigned int *); + const struct nla_policy *policy; + unsigned int maxattr; +}; + +struct wiphy_iftype_ext_capab { + enum nl80211_iftype iftype; + const u8 *extended_capabilities; + const u8 *extended_capabilities_mask; + u8 extended_capabilities_len; + u16 eml_capabilities; + u16 mld_capa_and_ops; +}; + +struct cfg80211_pmsr_capabilities { + unsigned int max_peers; + u8 report_ap_tsf: 1; + u8 randomize_mac_addr: 1; + struct { + u32 preambles; + u32 bandwidths; + s8 max_bursts_exponent; + u8 max_ftms_per_burst; + u8 supported: 1; + u8 asap: 1; + u8 non_asap: 1; + u8 request_lci: 1; + u8 request_civicloc: 1; + u8 trigger_based: 1; + u8 non_trigger_based: 1; + } ftm; +}; + +struct wiphy_iftype_akm_suites { + u16 iftypes_mask; + const u32 *akm_suites; + int n_akm_suites; +}; + +struct iw_ioctl_description { + __u8 header_type; + __u8 token_type; + __u16 token_size; + __u16 min_tokens; + __u16 max_tokens; + __u32 flags; +}; + +typedef int (*wext_ioctl_func)(struct net_device *, struct iwreq *, unsigned int, struct iw_request_info *, iw_handler); + +struct iw_thrspy { + struct sockaddr addr; + struct iw_quality qual; + struct iw_quality low; + struct iw_quality high; +}; + +struct netlbl_af4list { + __be32 addr; + __be32 mask; + u32 valid; + struct list_head list; +}; + +struct netlbl_af6list { + struct in6_addr addr; + struct in6_addr mask; + u32 valid; + struct list_head list; +}; + +struct netlbl_domaddr_map { + struct list_head list4; + struct list_head list6; +}; + +struct netlbl_dommap_def { + u32 type; + union { + struct netlbl_domaddr_map *addrsel; + struct cipso_v4_doi *cipso; + struct calipso_doi *calipso; + }; +}; + +struct netlbl_domaddr4_map { + struct netlbl_dommap_def def; + struct netlbl_af4list list; +}; + +struct netlbl_domaddr6_map { + struct netlbl_dommap_def def; + struct netlbl_af6list list; +}; + +struct netlbl_dom_map { + char *domain; + u16 family; + struct netlbl_dommap_def def; + u32 valid; + struct list_head list; + struct callback_head rcu; +}; + +struct netlbl_domhsh_tbl { + struct list_head *tbl; + u32 size; +}; + +enum { + NLBL_MGMT_C_UNSPEC = 0, + NLBL_MGMT_C_ADD = 1, + NLBL_MGMT_C_REMOVE = 2, + NLBL_MGMT_C_LISTALL = 3, + NLBL_MGMT_C_ADDDEF = 4, + NLBL_MGMT_C_REMOVEDEF = 5, + NLBL_MGMT_C_LISTDEF = 6, + NLBL_MGMT_C_PROTOCOLS = 7, + NLBL_MGMT_C_VERSION = 8, + __NLBL_MGMT_C_MAX = 9, +}; + +enum { + NLBL_MGMT_A_UNSPEC = 0, + NLBL_MGMT_A_DOMAIN = 1, + NLBL_MGMT_A_PROTOCOL = 2, + NLBL_MGMT_A_VERSION = 3, + NLBL_MGMT_A_CV4DOI = 4, + NLBL_MGMT_A_IPV6ADDR = 5, + NLBL_MGMT_A_IPV6MASK = 6, + NLBL_MGMT_A_IPV4ADDR = 7, + NLBL_MGMT_A_IPV4MASK = 8, + NLBL_MGMT_A_ADDRSELECTOR = 9, + NLBL_MGMT_A_SELECTORLIST = 10, + NLBL_MGMT_A_FAMILY = 11, + NLBL_MGMT_A_CLPDOI = 12, + __NLBL_MGMT_A_MAX = 13, +}; + +struct netlbl_domhsh_walk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +enum { + NLBL_UNLABEL_C_UNSPEC = 0, + NLBL_UNLABEL_C_ACCEPT = 1, + NLBL_UNLABEL_C_LIST = 2, + NLBL_UNLABEL_C_STATICADD = 3, + NLBL_UNLABEL_C_STATICREMOVE = 4, + NLBL_UNLABEL_C_STATICLIST = 5, + NLBL_UNLABEL_C_STATICADDDEF = 6, + NLBL_UNLABEL_C_STATICREMOVEDEF = 7, + NLBL_UNLABEL_C_STATICLISTDEF = 8, + __NLBL_UNLABEL_C_MAX = 9, +}; + +enum { + NLBL_UNLABEL_A_UNSPEC = 0, + NLBL_UNLABEL_A_ACPTFLG = 1, + NLBL_UNLABEL_A_IPV6ADDR = 2, + NLBL_UNLABEL_A_IPV6MASK = 3, + NLBL_UNLABEL_A_IPV4ADDR = 4, + NLBL_UNLABEL_A_IPV4MASK = 5, + NLBL_UNLABEL_A_IFACE = 6, + NLBL_UNLABEL_A_SECCTX = 7, + __NLBL_UNLABEL_A_MAX = 8, +}; + +struct netlbl_unlhsh_tbl { + struct list_head *tbl; + u32 size; +}; + +struct netlbl_unlhsh_addr4 { + u32 secid; + struct netlbl_af4list list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_addr6 { + u32 secid; + struct netlbl_af6list list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_iface { + int ifindex; + struct list_head addr4_list; + struct list_head addr6_list; + u32 valid; + struct list_head list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_walk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +enum { + NLBL_CIPSOV4_C_UNSPEC = 0, + NLBL_CIPSOV4_C_ADD = 1, + NLBL_CIPSOV4_C_REMOVE = 2, + NLBL_CIPSOV4_C_LIST = 3, + NLBL_CIPSOV4_C_LISTALL = 4, + __NLBL_CIPSOV4_C_MAX = 5, +}; + +enum { + NLBL_CIPSOV4_A_UNSPEC = 0, + NLBL_CIPSOV4_A_DOI = 1, + NLBL_CIPSOV4_A_MTYPE = 2, + NLBL_CIPSOV4_A_TAG = 3, + NLBL_CIPSOV4_A_TAGLST = 4, + NLBL_CIPSOV4_A_MLSLVLLOC = 5, + NLBL_CIPSOV4_A_MLSLVLREM = 6, + NLBL_CIPSOV4_A_MLSLVL = 7, + NLBL_CIPSOV4_A_MLSLVLLST = 8, + NLBL_CIPSOV4_A_MLSCATLOC = 9, + NLBL_CIPSOV4_A_MLSCATREM = 10, + NLBL_CIPSOV4_A_MLSCAT = 11, + NLBL_CIPSOV4_A_MLSCATLST = 12, + __NLBL_CIPSOV4_A_MAX = 13, +}; + +struct netlbl_cipsov4_doiwalk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct netlbl_domhsh_walk_arg___2 { + struct netlbl_audit *audit_info; + u32 doi; +}; + +enum { + NLBL_CALIPSO_C_UNSPEC = 0, + NLBL_CALIPSO_C_ADD = 1, + NLBL_CALIPSO_C_REMOVE = 2, + NLBL_CALIPSO_C_LIST = 3, + NLBL_CALIPSO_C_LISTALL = 4, + __NLBL_CALIPSO_C_MAX = 5, +}; + +enum { + NLBL_CALIPSO_A_UNSPEC = 0, + NLBL_CALIPSO_A_DOI = 1, + NLBL_CALIPSO_A_MTYPE = 2, + __NLBL_CALIPSO_A_MAX = 3, +}; + +struct netlbl_calipso_doiwalk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct dcbmsg { + __u8 dcb_family; + __u8 cmd; + __u16 dcb_pad; +}; + +enum dcbnl_commands { + DCB_CMD_UNDEFINED = 0, + DCB_CMD_GSTATE = 1, + DCB_CMD_SSTATE = 2, + DCB_CMD_PGTX_GCFG = 3, + DCB_CMD_PGTX_SCFG = 4, + DCB_CMD_PGRX_GCFG = 5, + DCB_CMD_PGRX_SCFG = 6, + DCB_CMD_PFC_GCFG = 7, + DCB_CMD_PFC_SCFG = 8, + DCB_CMD_SET_ALL = 9, + DCB_CMD_GPERM_HWADDR = 10, + DCB_CMD_GCAP = 11, + DCB_CMD_GNUMTCS = 12, + DCB_CMD_SNUMTCS = 13, + DCB_CMD_PFC_GSTATE = 14, + DCB_CMD_PFC_SSTATE = 15, + DCB_CMD_BCN_GCFG = 16, + DCB_CMD_BCN_SCFG = 17, + DCB_CMD_GAPP = 18, + DCB_CMD_SAPP = 19, + DCB_CMD_IEEE_SET = 20, + DCB_CMD_IEEE_GET = 21, + DCB_CMD_GDCBX = 22, + DCB_CMD_SDCBX = 23, + DCB_CMD_GFEATCFG = 24, + DCB_CMD_SFEATCFG = 25, + DCB_CMD_CEE_GET = 26, + DCB_CMD_IEEE_DEL = 27, + __DCB_CMD_ENUM_MAX = 28, + DCB_CMD_MAX = 27, +}; + +enum dcbnl_attrs { + DCB_ATTR_UNDEFINED = 0, + DCB_ATTR_IFNAME = 1, + DCB_ATTR_STATE = 2, + DCB_ATTR_PFC_STATE = 3, + DCB_ATTR_PFC_CFG = 4, + DCB_ATTR_NUM_TC = 5, + DCB_ATTR_PG_CFG = 6, + DCB_ATTR_SET_ALL = 7, + DCB_ATTR_PERM_HWADDR = 8, + DCB_ATTR_CAP = 9, + DCB_ATTR_NUMTCS = 10, + DCB_ATTR_BCN = 11, + DCB_ATTR_APP = 12, + DCB_ATTR_IEEE = 13, + DCB_ATTR_DCBX = 14, + DCB_ATTR_FEATCFG = 15, + DCB_ATTR_CEE = 16, + __DCB_ATTR_ENUM_MAX = 17, + DCB_ATTR_MAX = 16, +}; + +enum ieee_attrs { + DCB_ATTR_IEEE_UNSPEC = 0, + DCB_ATTR_IEEE_ETS = 1, + DCB_ATTR_IEEE_PFC = 2, + DCB_ATTR_IEEE_APP_TABLE = 3, + DCB_ATTR_IEEE_PEER_ETS = 4, + DCB_ATTR_IEEE_PEER_PFC = 5, + DCB_ATTR_IEEE_PEER_APP = 6, + DCB_ATTR_IEEE_MAXRATE = 7, + DCB_ATTR_IEEE_QCN = 8, + DCB_ATTR_IEEE_QCN_STATS = 9, + DCB_ATTR_DCB_BUFFER = 10, + DCB_ATTR_DCB_APP_TRUST_TABLE = 11, + DCB_ATTR_DCB_REWR_TABLE = 12, + __DCB_ATTR_IEEE_MAX = 13, +}; + +enum ieee_attrs_app { + DCB_ATTR_IEEE_APP_UNSPEC = 0, + DCB_ATTR_IEEE_APP = 1, + DCB_ATTR_DCB_APP = 2, + __DCB_ATTR_IEEE_APP_MAX = 3, +}; + +enum cee_attrs { + DCB_ATTR_CEE_UNSPEC = 0, + DCB_ATTR_CEE_PEER_PG = 1, + DCB_ATTR_CEE_PEER_PFC = 2, + DCB_ATTR_CEE_PEER_APP_TABLE = 3, + DCB_ATTR_CEE_TX_PG = 4, + DCB_ATTR_CEE_RX_PG = 5, + DCB_ATTR_CEE_PFC = 6, + DCB_ATTR_CEE_APP_TABLE = 7, + DCB_ATTR_CEE_FEAT = 8, + __DCB_ATTR_CEE_MAX = 9, +}; + +enum peer_app_attr { + DCB_ATTR_CEE_PEER_APP_UNSPEC = 0, + DCB_ATTR_CEE_PEER_APP_INFO = 1, + DCB_ATTR_CEE_PEER_APP = 2, + __DCB_ATTR_CEE_PEER_APP_MAX = 3, +}; + +enum dcbnl_pfc_up_attrs { + DCB_PFC_UP_ATTR_UNDEFINED = 0, + DCB_PFC_UP_ATTR_0 = 1, + DCB_PFC_UP_ATTR_1 = 2, + DCB_PFC_UP_ATTR_2 = 3, + DCB_PFC_UP_ATTR_3 = 4, + DCB_PFC_UP_ATTR_4 = 5, + DCB_PFC_UP_ATTR_5 = 6, + DCB_PFC_UP_ATTR_6 = 7, + DCB_PFC_UP_ATTR_7 = 8, + DCB_PFC_UP_ATTR_ALL = 9, + __DCB_PFC_UP_ATTR_ENUM_MAX = 10, + DCB_PFC_UP_ATTR_MAX = 9, +}; + +enum dcbnl_pg_attrs { + DCB_PG_ATTR_UNDEFINED = 0, + DCB_PG_ATTR_TC_0 = 1, + DCB_PG_ATTR_TC_1 = 2, + DCB_PG_ATTR_TC_2 = 3, + DCB_PG_ATTR_TC_3 = 4, + DCB_PG_ATTR_TC_4 = 5, + DCB_PG_ATTR_TC_5 = 6, + DCB_PG_ATTR_TC_6 = 7, + DCB_PG_ATTR_TC_7 = 8, + DCB_PG_ATTR_TC_MAX = 9, + DCB_PG_ATTR_TC_ALL = 10, + DCB_PG_ATTR_BW_ID_0 = 11, + DCB_PG_ATTR_BW_ID_1 = 12, + DCB_PG_ATTR_BW_ID_2 = 13, + DCB_PG_ATTR_BW_ID_3 = 14, + DCB_PG_ATTR_BW_ID_4 = 15, + DCB_PG_ATTR_BW_ID_5 = 16, + DCB_PG_ATTR_BW_ID_6 = 17, + DCB_PG_ATTR_BW_ID_7 = 18, + DCB_PG_ATTR_BW_ID_MAX = 19, + DCB_PG_ATTR_BW_ID_ALL = 20, + __DCB_PG_ATTR_ENUM_MAX = 21, + DCB_PG_ATTR_MAX = 20, +}; + +enum dcbnl_tc_attrs { + DCB_TC_ATTR_PARAM_UNDEFINED = 0, + DCB_TC_ATTR_PARAM_PGID = 1, + DCB_TC_ATTR_PARAM_UP_MAPPING = 2, + DCB_TC_ATTR_PARAM_STRICT_PRIO = 3, + DCB_TC_ATTR_PARAM_BW_PCT = 4, + DCB_TC_ATTR_PARAM_ALL = 5, + __DCB_TC_ATTR_PARAM_ENUM_MAX = 6, + DCB_TC_ATTR_PARAM_MAX = 5, +}; + +enum dcbnl_cap_attrs { + DCB_CAP_ATTR_UNDEFINED = 0, + DCB_CAP_ATTR_ALL = 1, + DCB_CAP_ATTR_PG = 2, + DCB_CAP_ATTR_PFC = 3, + DCB_CAP_ATTR_UP2TC = 4, + DCB_CAP_ATTR_PG_TCS = 5, + DCB_CAP_ATTR_PFC_TCS = 6, + DCB_CAP_ATTR_GSP = 7, + DCB_CAP_ATTR_BCN = 8, + DCB_CAP_ATTR_DCBX = 9, + __DCB_CAP_ATTR_ENUM_MAX = 10, + DCB_CAP_ATTR_MAX = 9, +}; + +enum dcbnl_numtcs_attrs { + DCB_NUMTCS_ATTR_UNDEFINED = 0, + DCB_NUMTCS_ATTR_ALL = 1, + DCB_NUMTCS_ATTR_PG = 2, + DCB_NUMTCS_ATTR_PFC = 3, + __DCB_NUMTCS_ATTR_ENUM_MAX = 4, + DCB_NUMTCS_ATTR_MAX = 3, +}; + +enum dcbnl_bcn_attrs { + DCB_BCN_ATTR_UNDEFINED = 0, + DCB_BCN_ATTR_RP_0 = 1, + DCB_BCN_ATTR_RP_1 = 2, + DCB_BCN_ATTR_RP_2 = 3, + DCB_BCN_ATTR_RP_3 = 4, + DCB_BCN_ATTR_RP_4 = 5, + DCB_BCN_ATTR_RP_5 = 6, + DCB_BCN_ATTR_RP_6 = 7, + DCB_BCN_ATTR_RP_7 = 8, + DCB_BCN_ATTR_RP_ALL = 9, + DCB_BCN_ATTR_BCNA_0 = 10, + DCB_BCN_ATTR_BCNA_1 = 11, + DCB_BCN_ATTR_ALPHA = 12, + DCB_BCN_ATTR_BETA = 13, + DCB_BCN_ATTR_GD = 14, + DCB_BCN_ATTR_GI = 15, + DCB_BCN_ATTR_TMAX = 16, + DCB_BCN_ATTR_TD = 17, + DCB_BCN_ATTR_RMIN = 18, + DCB_BCN_ATTR_W = 19, + DCB_BCN_ATTR_RD = 20, + DCB_BCN_ATTR_RU = 21, + DCB_BCN_ATTR_WRTT = 22, + DCB_BCN_ATTR_RI = 23, + DCB_BCN_ATTR_C = 24, + DCB_BCN_ATTR_ALL = 25, + __DCB_BCN_ATTR_ENUM_MAX = 26, + DCB_BCN_ATTR_MAX = 25, +}; + +enum dcb_general_attr_values { + DCB_ATTR_VALUE_UNDEFINED = 255, +}; + +enum dcbnl_app_attrs { + DCB_APP_ATTR_UNDEFINED = 0, + DCB_APP_ATTR_IDTYPE = 1, + DCB_APP_ATTR_ID = 2, + DCB_APP_ATTR_PRIORITY = 3, + __DCB_APP_ATTR_ENUM_MAX = 4, + DCB_APP_ATTR_MAX = 3, +}; + +enum dcbnl_featcfg_attrs { + DCB_FEATCFG_ATTR_UNDEFINED = 0, + DCB_FEATCFG_ATTR_ALL = 1, + DCB_FEATCFG_ATTR_PG = 2, + DCB_FEATCFG_ATTR_PFC = 3, + DCB_FEATCFG_ATTR_APP = 4, + __DCB_FEATCFG_ATTR_ENUM_MAX = 5, + DCB_FEATCFG_ATTR_MAX = 4, +}; + +struct dcb_app_type { + int ifindex; + struct dcb_app app; + struct list_head list; + u8 dcbx; +}; + +struct dcb_rewr_prio_pcp_map { + u16 map[8]; +}; + +struct dcb_ieee_app_prio_map { + u64 map[8]; +}; + +struct dcb_ieee_app_dscp_map { + u8 map[64]; +}; + +enum dcbevent_notif_type { + DCB_APP_EVENT = 1, +}; + +struct reply_func { + int type; + int (*cb)(struct net_device *, struct nlmsghdr *, u32, struct nlattr **, struct sk_buff *); +}; + +enum switchdev_attr_id { + SWITCHDEV_ATTR_ID_UNDEFINED = 0, + SWITCHDEV_ATTR_ID_PORT_STP_STATE = 1, + SWITCHDEV_ATTR_ID_PORT_MST_STATE = 2, + SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS = 3, + SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS = 4, + SWITCHDEV_ATTR_ID_PORT_MROUTER = 5, + SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME = 6, + SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING = 7, + SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL = 8, + SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED = 9, + SWITCHDEV_ATTR_ID_BRIDGE_MROUTER = 10, + SWITCHDEV_ATTR_ID_BRIDGE_MST = 11, + SWITCHDEV_ATTR_ID_MRP_PORT_ROLE = 12, + SWITCHDEV_ATTR_ID_VLAN_MSTI = 13, +}; + +struct switchdev_attr { + struct net_device *orig_dev; + enum switchdev_attr_id id; + u32 flags; + void *complete_priv; + void (*complete)(struct net_device *, int, void *); + union { + u8 stp_state; + struct switchdev_mst_state mst_state; + struct switchdev_brport_flags brport_flags; + bool mrouter; + clock_t ageing_time; + bool vlan_filtering; + u16 vlan_protocol; + bool mst; + bool mc_disabled; + u8 mrp_port_role; + struct switchdev_vlan_msti vlan_msti; + } u; +}; + +struct switchdev_brport { + struct net_device *dev; + const void *ctx; + struct notifier_block *atomic_nb; + struct notifier_block *blocking_nb; + bool tx_fwd_offload; +}; + +enum switchdev_notifier_type { + SWITCHDEV_FDB_ADD_TO_BRIDGE = 1, + SWITCHDEV_FDB_DEL_TO_BRIDGE = 2, + SWITCHDEV_FDB_ADD_TO_DEVICE = 3, + SWITCHDEV_FDB_DEL_TO_DEVICE = 4, + SWITCHDEV_FDB_OFFLOADED = 5, + SWITCHDEV_FDB_FLUSH_TO_BRIDGE = 6, + SWITCHDEV_PORT_OBJ_ADD = 7, + SWITCHDEV_PORT_OBJ_DEL = 8, + SWITCHDEV_PORT_ATTR_SET = 9, + SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE = 10, + SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE = 11, + SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE = 12, + SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE = 13, + SWITCHDEV_VXLAN_FDB_OFFLOADED = 14, + SWITCHDEV_BRPORT_OFFLOADED = 15, + SWITCHDEV_BRPORT_UNOFFLOADED = 16, +}; + +struct switchdev_notifier_info { + struct net_device *dev; + struct netlink_ext_ack *extack; + const void *ctx; +}; + +struct switchdev_notifier_fdb_info { + struct switchdev_notifier_info info; + const unsigned char *addr; + u16 vid; + u8 added_by_user: 1; + u8 is_local: 1; + u8 locked: 1; + u8 offloaded: 1; +}; + +struct switchdev_notifier_port_obj_info { + struct switchdev_notifier_info info; + const struct switchdev_obj *obj; + bool handled; +}; + +struct switchdev_notifier_port_attr_info { + struct switchdev_notifier_info info; + const struct switchdev_attr *attr; + bool handled; +}; + +struct switchdev_notifier_brport_info { + struct switchdev_notifier_info info; + const struct switchdev_brport brport; +}; + +typedef void switchdev_deferred_func_t(struct net_device *, const void *); + +struct switchdev_deferred_item { + struct list_head list; + struct net_device *dev; + netdevice_tracker dev_tracker; + switchdev_deferred_func_t *func; + long unsigned int data[0]; +}; + +struct switchdev_nested_priv { + bool (*check_cb)(const struct net_device *); + bool (*foreign_dev_check_cb)(const struct net_device *, const struct net_device *); + const struct net_device *dev; + struct net_device *lower_dev; +}; + +typedef int (*lookup_by_table_id_t)(struct net *, u32); + +struct l3mdev_handler { + lookup_by_table_id_t dev_lookup; +}; + +struct ncsi_dev { + int state; + int link_up; + struct net_device *dev; + void (*handler)(struct ncsi_dev *); +}; + +struct ncsi_channel_version { + u32 version; + u32 alpha2; + u8 fw_name[12]; + u32 fw_version; + u16 pci_ids[4]; + u32 mf_id; +}; + +struct ncsi_channel_cap { + u32 index; + u32 cap; +}; + +struct ncsi_channel_mode { + u32 index; + u32 enable; + u32 size; + u32 data[8]; +}; + +struct ncsi_channel_mac_filter { + u8 n_uc; + u8 n_mc; + u8 n_mixed; + long: 32; + u64 bitmap; + unsigned char *addrs; + long: 32; +}; + +struct ncsi_channel_vlan_filter { + u8 n_vids; + long: 32; + u64 bitmap; + u16 *vids; + long: 32; +}; + +struct ncsi_channel_stats { + u32 hnc_cnt_hi; + u32 hnc_cnt_lo; + u32 hnc_rx_bytes; + u32 hnc_tx_bytes; + u32 hnc_rx_uc_pkts; + u32 hnc_rx_mc_pkts; + u32 hnc_rx_bc_pkts; + u32 hnc_tx_uc_pkts; + u32 hnc_tx_mc_pkts; + u32 hnc_tx_bc_pkts; + u32 hnc_fcs_err; + u32 hnc_align_err; + u32 hnc_false_carrier; + u32 hnc_runt_pkts; + u32 hnc_jabber_pkts; + u32 hnc_rx_pause_xon; + u32 hnc_rx_pause_xoff; + u32 hnc_tx_pause_xon; + u32 hnc_tx_pause_xoff; + u32 hnc_tx_s_collision; + u32 hnc_tx_m_collision; + u32 hnc_l_collision; + u32 hnc_e_collision; + u32 hnc_rx_ctl_frames; + u32 hnc_rx_64_frames; + u32 hnc_rx_127_frames; + u32 hnc_rx_255_frames; + u32 hnc_rx_511_frames; + u32 hnc_rx_1023_frames; + u32 hnc_rx_1522_frames; + u32 hnc_rx_9022_frames; + u32 hnc_tx_64_frames; + u32 hnc_tx_127_frames; + u32 hnc_tx_255_frames; + u32 hnc_tx_511_frames; + u32 hnc_tx_1023_frames; + u32 hnc_tx_1522_frames; + u32 hnc_tx_9022_frames; + u32 hnc_rx_valid_bytes; + u32 hnc_rx_runt_pkts; + u32 hnc_rx_jabber_pkts; + u32 ncsi_rx_cmds; + u32 ncsi_dropped_cmds; + u32 ncsi_cmd_type_errs; + u32 ncsi_cmd_csum_errs; + u32 ncsi_rx_pkts; + u32 ncsi_tx_pkts; + u32 ncsi_tx_aen_pkts; + u32 pt_tx_pkts; + u32 pt_tx_dropped; + u32 pt_tx_channel_err; + u32 pt_tx_us_err; + u32 pt_rx_pkts; + u32 pt_rx_dropped; + u32 pt_rx_channel_err; + u32 pt_rx_us_err; + u32 pt_rx_os_err; +}; + +struct ncsi_package; + +struct ncsi_channel { + unsigned char id; + int state; + bool reconfigure_needed; + spinlock_t lock; + struct ncsi_package *package; + struct ncsi_channel_version version; + struct ncsi_channel_cap caps[6]; + struct ncsi_channel_mode modes[8]; + struct ncsi_channel_mac_filter mac_filter; + struct ncsi_channel_vlan_filter vlan_filter; + struct ncsi_channel_stats stats; + struct { + struct timer_list timer; + bool enabled; + unsigned int state; + } monitor; + struct list_head node; + struct list_head link; +}; + +struct ncsi_dev_priv; + +struct ncsi_package { + unsigned char id; + unsigned char uuid[16]; + struct ncsi_dev_priv *ndp; + spinlock_t lock; + unsigned int channel_num; + struct list_head channels; + struct list_head node; + bool multi_channel; + u32 channel_whitelist; + struct ncsi_channel *preferred_channel; +}; + +struct ncsi_request { + unsigned char id; + bool used; + unsigned int flags; + struct ncsi_dev_priv *ndp; + struct sk_buff *cmd; + struct sk_buff *rsp; + struct timer_list timer; + bool enabled; + u32 snd_seq; + u32 snd_portid; + struct nlmsghdr nlhdr; +}; + +struct ncsi_dev_priv { + struct ncsi_dev ndev; + unsigned int flags; + unsigned int gma_flag; + spinlock_t lock; + unsigned int package_probe_id; + unsigned int package_num; + struct list_head packages; + struct ncsi_channel *hot_channel; + struct ncsi_request requests[256]; + unsigned int request_id; + unsigned int pending_req_num; + struct ncsi_package *active_package; + struct ncsi_channel *active_channel; + struct list_head channel_queue; + struct work_struct work; + struct packet_type ptype; + struct list_head node; + struct list_head vlan_vids; + bool multi_package; + bool mlx_multi_host; + u32 package_whitelist; +}; + +struct ncsi_cmd_arg { + struct ncsi_dev_priv *ndp; + unsigned char type; + unsigned char id; + unsigned char package; + unsigned char channel; + short unsigned int payload; + unsigned int req_flags; + union { + unsigned char bytes[16]; + short unsigned int words[8]; + unsigned int dwords[4]; + }; + unsigned char *data; + struct genl_info *info; +}; + +struct ncsi_pkt_hdr { + unsigned char mc_id; + unsigned char revision; + unsigned char reserved; + unsigned char id; + unsigned char type; + unsigned char channel; + __be16 length; + __be32 reserved1[2]; +}; + +struct ncsi_cmd_pkt_hdr { + struct ncsi_pkt_hdr common; +}; + +struct ncsi_cmd_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 checksum; + unsigned char pad[26]; +}; + +struct ncsi_cmd_sp_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char hw_arbitration; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_dc_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char ald; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_rc_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 reserved; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_ae_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char mc_id; + __be32 mode; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_cmd_sl_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 mode; + __be32 oem_mode; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_cmd_svf_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be16 reserved; + __be16 vlan; + __be16 reserved1; + unsigned char index; + unsigned char enable; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_cmd_ev_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char mode; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_sma_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char mac[6]; + unsigned char index; + unsigned char at_e; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_cmd_ebf_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 mode; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_egmf_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 mode; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_snfc_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char mode; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_oem_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 mfr_id; + unsigned char data[0]; +}; + +struct ncsi_cmd_handler { + unsigned char type; + int payload; + int (*handler)(struct sk_buff *, struct ncsi_cmd_arg *); +}; + +enum { + NCSI_CAP_BASE = 0, + NCSI_CAP_GENERIC = 0, + NCSI_CAP_BC = 1, + NCSI_CAP_MC = 2, + NCSI_CAP_BUFFER = 3, + NCSI_CAP_AEN = 4, + NCSI_CAP_VLAN = 5, + NCSI_CAP_MAX = 6, +}; + +enum { + NCSI_CAP_GENERIC_HWA = 1, + NCSI_CAP_GENERIC_HDS = 2, + NCSI_CAP_GENERIC_FC = 4, + NCSI_CAP_GENERIC_FC1 = 8, + NCSI_CAP_GENERIC_MC = 16, + NCSI_CAP_GENERIC_HWA_UNKNOWN = 0, + NCSI_CAP_GENERIC_HWA_SUPPORT = 32, + NCSI_CAP_GENERIC_HWA_NOT_SUPPORT = 64, + NCSI_CAP_GENERIC_HWA_RESERVED = 96, + NCSI_CAP_GENERIC_HWA_MASK = 96, + NCSI_CAP_GENERIC_MASK = 127, + NCSI_CAP_BC_ARP = 1, + NCSI_CAP_BC_DHCPC = 2, + NCSI_CAP_BC_DHCPS = 4, + NCSI_CAP_BC_NETBIOS = 8, + NCSI_CAP_BC_MASK = 15, + NCSI_CAP_MC_IPV6_NEIGHBOR = 1, + NCSI_CAP_MC_IPV6_ROUTER = 2, + NCSI_CAP_MC_DHCPV6_RELAY = 4, + NCSI_CAP_MC_DHCPV6_WELL_KNOWN = 8, + NCSI_CAP_MC_IPV6_MLD = 16, + NCSI_CAP_MC_IPV6_NEIGHBOR_S = 32, + NCSI_CAP_MC_MASK = 63, + NCSI_CAP_AEN_LSC = 1, + NCSI_CAP_AEN_CR = 2, + NCSI_CAP_AEN_HDS = 4, + NCSI_CAP_AEN_MASK = 7, + NCSI_CAP_VLAN_ONLY = 1, + NCSI_CAP_VLAN_NO = 2, + NCSI_CAP_VLAN_ANY = 4, + NCSI_CAP_VLAN_MASK = 7, +}; + +enum { + NCSI_MODE_BASE = 0, + NCSI_MODE_ENABLE = 0, + NCSI_MODE_TX_ENABLE = 1, + NCSI_MODE_LINK = 2, + NCSI_MODE_VLAN = 3, + NCSI_MODE_BC = 4, + NCSI_MODE_MC = 5, + NCSI_MODE_AEN = 6, + NCSI_MODE_FC = 7, + NCSI_MODE_MAX = 8, +}; + +struct ncsi_rsp_pkt_hdr { + struct ncsi_pkt_hdr common; + __be16 code; + __be16 reason; +}; + +struct ncsi_rsp_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_rsp_oem_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 mfr_id; + unsigned char data[0]; +}; + +struct ncsi_rsp_oem_mlx_pkt { + unsigned char cmd_rev; + unsigned char cmd; + unsigned char param; + unsigned char optional; + unsigned char data[0]; +}; + +struct ncsi_rsp_oem_bcm_pkt { + unsigned char ver; + unsigned char type; + __be16 len; + unsigned char data[0]; +}; + +struct ncsi_rsp_oem_intel_pkt { + unsigned char cmd; + unsigned char data[0]; +}; + +struct ncsi_rsp_gls_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 status; + __be32 other; + __be32 oem_status; + __be32 checksum; + unsigned char pad[10]; +}; + +struct ncsi_rsp_gvi_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 ncsi_version; + unsigned char reserved[3]; + unsigned char alpha2; + unsigned char fw_name[12]; + __be32 fw_version; + __be16 pci_ids[4]; + __be32 mf_id; + __be32 checksum; +}; + +struct ncsi_rsp_gc_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 cap; + __be32 bc_cap; + __be32 mc_cap; + __be32 buf_cap; + __be32 aen_cap; + unsigned char vlan_cnt; + unsigned char mixed_cnt; + unsigned char mc_cnt; + unsigned char uc_cnt; + unsigned char reserved[2]; + unsigned char vlan_mode; + unsigned char channel_cnt; + __be32 checksum; +}; + +struct ncsi_rsp_gp_pkt { + struct ncsi_rsp_pkt_hdr rsp; + unsigned char mac_cnt; + unsigned char reserved[2]; + unsigned char mac_enable; + unsigned char vlan_cnt; + unsigned char reserved1; + __be16 vlan_enable; + __be32 link_mode; + __be32 bc_mode; + __be32 valid_modes; + unsigned char vlan_mode; + unsigned char fc_mode; + unsigned char reserved2[2]; + __be32 aen_mode; + unsigned char mac[6]; + __be16 vlan; + __be32 checksum; +}; + +struct ncsi_rsp_gcps_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 cnt_hi; + __be32 cnt_lo; + __be32 rx_bytes; + __be32 tx_bytes; + __be32 rx_uc_pkts; + __be32 rx_mc_pkts; + __be32 rx_bc_pkts; + __be32 tx_uc_pkts; + __be32 tx_mc_pkts; + __be32 tx_bc_pkts; + __be32 fcs_err; + __be32 align_err; + __be32 false_carrier; + __be32 runt_pkts; + __be32 jabber_pkts; + __be32 rx_pause_xon; + __be32 rx_pause_xoff; + __be32 tx_pause_xon; + __be32 tx_pause_xoff; + __be32 tx_s_collision; + __be32 tx_m_collision; + __be32 l_collision; + __be32 e_collision; + __be32 rx_ctl_frames; + __be32 rx_64_frames; + __be32 rx_127_frames; + __be32 rx_255_frames; + __be32 rx_511_frames; + __be32 rx_1023_frames; + __be32 rx_1522_frames; + __be32 rx_9022_frames; + __be32 tx_64_frames; + __be32 tx_127_frames; + __be32 tx_255_frames; + __be32 tx_511_frames; + __be32 tx_1023_frames; + __be32 tx_1522_frames; + __be32 tx_9022_frames; + __be32 rx_valid_bytes; + __be32 rx_runt_pkts; + __be32 rx_jabber_pkts; + __be32 checksum; +}; + +struct ncsi_rsp_gns_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 rx_cmds; + __be32 dropped_cmds; + __be32 cmd_type_errs; + __be32 cmd_csum_errs; + __be32 rx_pkts; + __be32 tx_pkts; + __be32 tx_aen_pkts; + __be32 checksum; +}; + +struct ncsi_rsp_gnpts_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 tx_pkts; + __be32 tx_dropped; + __be32 tx_channel_err; + __be32 tx_us_err; + __be32 rx_pkts; + __be32 rx_dropped; + __be32 rx_channel_err; + __be32 rx_us_err; + __be32 rx_os_err; + __be32 checksum; +}; + +struct ncsi_rsp_gps_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 status; + __be32 checksum; +}; + +struct ncsi_rsp_gpuuid_pkt { + struct ncsi_rsp_pkt_hdr rsp; + unsigned char uuid[16]; + __be32 checksum; +}; + +struct ncsi_rsp_oem_handler { + unsigned int mfr_id; + int (*handler)(struct ncsi_request *); +}; + +struct ncsi_rsp_handler { + unsigned char type; + int payload; + int (*handler)(struct ncsi_request *); +}; + +struct ncsi_aen_pkt_hdr { + struct ncsi_pkt_hdr common; + unsigned char reserved2[3]; + unsigned char type; +}; + +struct ncsi_aen_lsc_pkt { + struct ncsi_aen_pkt_hdr aen; + __be32 status; + __be32 oem_status; + __be32 checksum; + unsigned char pad[14]; +}; + +struct ncsi_aen_hncdsc_pkt { + struct ncsi_aen_pkt_hdr aen; + __be32 status; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_aen_handler { + unsigned char type; + int payload; + int (*handler)(struct ncsi_dev_priv *, struct ncsi_aen_pkt_hdr *); +}; + +enum { + ncsi_dev_state_registered = 0, + ncsi_dev_state_functional = 256, + ncsi_dev_state_probe = 512, + ncsi_dev_state_config = 768, + ncsi_dev_state_suspend = 1024, +}; + +enum { + ncsi_dev_state_major = 65280, + ncsi_dev_state_minor = 255, + ncsi_dev_state_probe_deselect = 513, + ncsi_dev_state_probe_package = 514, + ncsi_dev_state_probe_channel = 515, + ncsi_dev_state_probe_mlx_gma = 516, + ncsi_dev_state_probe_mlx_smaf = 517, + ncsi_dev_state_probe_cis = 518, + ncsi_dev_state_probe_keep_phy = 519, + ncsi_dev_state_probe_gvi = 520, + ncsi_dev_state_probe_gc = 521, + ncsi_dev_state_probe_gls = 522, + ncsi_dev_state_probe_dp = 523, + ncsi_dev_state_config_sp = 769, + ncsi_dev_state_config_cis = 770, + ncsi_dev_state_config_oem_gma = 771, + ncsi_dev_state_config_clear_vids = 772, + ncsi_dev_state_config_svf = 773, + ncsi_dev_state_config_ev = 774, + ncsi_dev_state_config_sma = 775, + ncsi_dev_state_config_ebf = 776, + ncsi_dev_state_config_dgmf = 777, + ncsi_dev_state_config_ecnt = 778, + ncsi_dev_state_config_ec = 779, + ncsi_dev_state_config_ae = 780, + ncsi_dev_state_config_gls = 781, + ncsi_dev_state_config_done = 782, + ncsi_dev_state_suspend_select = 1025, + ncsi_dev_state_suspend_gls = 1026, + ncsi_dev_state_suspend_dcnt = 1027, + ncsi_dev_state_suspend_dc = 1028, + ncsi_dev_state_suspend_deselect = 1029, + ncsi_dev_state_suspend_done = 1030, +}; + +struct vlan_vid { + struct list_head list; + __be16 proto; + u16 vid; +}; + +enum ncsi_nl_commands { + NCSI_CMD_UNSPEC = 0, + NCSI_CMD_PKG_INFO = 1, + NCSI_CMD_SET_INTERFACE = 2, + NCSI_CMD_CLEAR_INTERFACE = 3, + NCSI_CMD_SEND_CMD = 4, + NCSI_CMD_SET_PACKAGE_MASK = 5, + NCSI_CMD_SET_CHANNEL_MASK = 6, + __NCSI_CMD_AFTER_LAST = 7, + NCSI_CMD_MAX = 6, +}; + +enum ncsi_nl_attrs { + NCSI_ATTR_UNSPEC = 0, + NCSI_ATTR_IFINDEX = 1, + NCSI_ATTR_PACKAGE_LIST = 2, + NCSI_ATTR_PACKAGE_ID = 3, + NCSI_ATTR_CHANNEL_ID = 4, + NCSI_ATTR_DATA = 5, + NCSI_ATTR_MULTI_FLAG = 6, + NCSI_ATTR_PACKAGE_MASK = 7, + NCSI_ATTR_CHANNEL_MASK = 8, + __NCSI_ATTR_AFTER_LAST = 9, + NCSI_ATTR_MAX = 8, +}; + +enum ncsi_nl_pkg_attrs { + NCSI_PKG_ATTR_UNSPEC = 0, + NCSI_PKG_ATTR = 1, + NCSI_PKG_ATTR_ID = 2, + NCSI_PKG_ATTR_FORCED = 3, + NCSI_PKG_ATTR_CHANNEL_LIST = 4, + __NCSI_PKG_ATTR_AFTER_LAST = 5, + NCSI_PKG_ATTR_MAX = 4, +}; + +enum ncsi_nl_channel_attrs { + NCSI_CHANNEL_ATTR_UNSPEC = 0, + NCSI_CHANNEL_ATTR = 1, + NCSI_CHANNEL_ATTR_ID = 2, + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 3, + NCSI_CHANNEL_ATTR_VERSION_MINOR = 4, + NCSI_CHANNEL_ATTR_VERSION_STR = 5, + NCSI_CHANNEL_ATTR_LINK_STATE = 6, + NCSI_CHANNEL_ATTR_ACTIVE = 7, + NCSI_CHANNEL_ATTR_FORCED = 8, + NCSI_CHANNEL_ATTR_VLAN_LIST = 9, + NCSI_CHANNEL_ATTR_VLAN_ID = 10, + __NCSI_CHANNEL_ATTR_AFTER_LAST = 11, + NCSI_CHANNEL_ATTR_MAX = 10, +}; + +struct sockaddr_xdp { + __u16 sxdp_family; + __u16 sxdp_flags; + __u32 sxdp_ifindex; + __u32 sxdp_queue_id; + __u32 sxdp_shared_umem_fd; +}; + +struct xdp_ring_offset { + __u64 producer; + __u64 consumer; + __u64 desc; + __u64 flags; +}; + +struct xdp_mmap_offsets { + struct xdp_ring_offset rx; + struct xdp_ring_offset tx; + struct xdp_ring_offset fr; + struct xdp_ring_offset cr; +}; + +struct xdp_umem_reg { + __u64 addr; + __u64 len; + __u32 chunk_size; + __u32 headroom; + __u32 flags; + long: 32; +}; + +struct xdp_statistics { + __u64 rx_dropped; + __u64 rx_invalid_descs; + __u64 tx_invalid_descs; + __u64 rx_ring_full; + __u64 rx_fill_ring_empty_descs; + __u64 tx_ring_empty_descs; +}; + +struct xdp_options { + __u32 flags; +}; + +struct xsk_map { + struct bpf_map map; + spinlock_t lock; + struct xdp_sock *xsk_map[0]; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct xdp_ring; + +struct xsk_queue { + u32 ring_mask; + u32 nentries; + u32 cached_prod; + u32 cached_cons; + struct xdp_ring *ring; + long: 32; + u64 invalid_descs; + u64 queue_empty_descs; +}; + +struct xdp_ring_offset_v1 { + __u64 producer; + __u64 consumer; + __u64 desc; +}; + +struct xdp_mmap_offsets_v1 { + struct xdp_ring_offset_v1 rx; + struct xdp_ring_offset_v1 tx; + struct xdp_ring_offset_v1 fr; + struct xdp_ring_offset_v1 cr; +}; + +struct xsk_map_node { + struct list_head node; + struct xsk_map *map; + struct xdp_sock **map_entry; +}; + +struct xdp_ring { + u32 producer; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + u32 pad1; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + u32 consumer; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + u32 pad2; + u32 flags; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + u32 pad3; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; + long: 32; +}; + +struct xdp_rxtx_ring { + struct xdp_ring ptrs; + struct xdp_desc desc[0]; +}; + +struct xdp_umem_ring { + struct xdp_ring ptrs; + u64 desc[0]; +}; + +struct xsk_dma_map { + dma_addr_t *dma_pages; + struct device *dev; + struct net_device *netdev; + refcount_t users; + struct list_head list; + u32 dma_pages_cnt; + bool dma_need_sync; +}; + +struct warn_args; + +typedef struct elf64_phdr Elf64_Phdr; + +struct compress_format { + unsigned char magic[2]; + const char *name; + decompress_fn decompressor; +}; + +struct group_data { + int limit[21]; + int base[20]; + int permute[258]; + int minLen; + int maxLen; +}; + +struct bunzip_data { + int writeCopies; + int writePos; + int writeRunCountdown; + int writeCount; + int writeCurrent; + long int (*fill)(void *, long unsigned int); + long int inbufCount; + long int inbufPos; + unsigned char *inbuf; + unsigned int inbufBitCount; + unsigned int inbufBits; + unsigned int crc32Table[256]; + unsigned int headerCRC; + unsigned int totalCRC; + unsigned int writeCRC; + unsigned int *dbuf; + unsigned int dbufSize; + unsigned char selectors[32768]; + struct group_data groups[6]; + int io_error; + int byteCount[256]; + unsigned char symToByte[256]; + unsigned char mtfSymbol[256]; +}; + +struct rc { + long int (*fill)(void *, long unsigned int); + uint8_t *ptr; + uint8_t *buffer; + uint8_t *buffer_end; + long int buffer_size; + uint32_t code; + uint32_t range; + uint32_t bound; + void (*error)(char *); +}; + +struct lzma_header { + uint8_t pos; + uint32_t dict_size; + uint64_t dst_size; +} __attribute__((packed)); + +struct writer { + uint8_t *buffer; + uint8_t previous_byte; + size_t buffer_pos; + int bufsize; + size_t global_pos; + long int (*flush)(void *, long unsigned int); + struct lzma_header *header; +}; + +struct cstate { + int state; + uint32_t rep0; + uint32_t rep1; + uint32_t rep2; + uint32_t rep3; +}; + +struct cpio_data { + void *data; + size_t size; + char name[18]; +}; + +enum cpio_fields { + C_MAGIC = 0, + C_INO = 1, + C_MODE = 2, + C_UID = 3, + C_GID = 4, + C_NLINK = 5, + C_MTIME = 6, + C_FILESIZE = 7, + C_MAJ = 8, + C_MIN = 9, + C_RMAJ = 10, + C_RMIN = 11, + C_NAMESIZE = 12, + C_CHKSUM = 13, + C_NFIELDS = 14, +}; + +enum { + ASSUME_PERFECT = 255, + ASSUME_VALID_DTB = 1, + ASSUME_VALID_INPUT = 2, + ASSUME_LATEST = 4, + ASSUME_NO_ROLLBACK = 8, + ASSUME_LIBFDT_ORDER = 16, + ASSUME_LIBFDT_FLAWLESS = 32, +}; + +typedef __be64 fdt64_t; + +struct fdt_reserve_entry { + fdt64_t address; + fdt64_t size; +}; + +struct fdt_node_header { + fdt32_t tag; + char name[0]; +}; + +struct fdt_property { + fdt32_t tag; + fdt32_t len; + fdt32_t nameoff; + char data[0]; +}; + +struct fdt_errtabent { + const char *str; +}; + +struct fprop_local_single { + long unsigned int events; + unsigned int period; + raw_spinlock_t lock; +}; + +struct ida_bitmap { + long unsigned int bitmap[32]; +}; + +struct klist_waiter { + struct list_head list; + struct klist_node *node; + struct task_struct *process; + int woken; +}; + +struct uevent_sock { + struct list_head list; + struct sock *sk; +}; + +struct maple_metadata { + unsigned char end; + unsigned char gap; +}; + +struct maple_pnode; + +struct maple_range_64 { + struct maple_pnode *parent; + long unsigned int pivot[31]; + union { + void *slot[32]; + struct { + void *pad[31]; + struct maple_metadata meta; + }; + }; +}; + +struct maple_arange_64 { + struct maple_pnode *parent; + long unsigned int pivot[20]; + void *slot[21]; + long unsigned int gap[21]; + struct maple_metadata meta; +}; + +struct maple_topiary { + struct maple_pnode *parent; + struct maple_enode *next; +}; + +enum maple_type { + maple_dense = 0, + maple_leaf_64 = 1, + maple_range_64 = 2, + maple_arange_64 = 3, +}; + +struct maple_node { + union { + struct { + struct maple_pnode *parent; + void *slot[63]; + }; + struct { + void *pad; + struct callback_head rcu; + struct maple_enode *piv_parent; + unsigned char parent_slot; + enum maple_type type; + unsigned char slot_len; + unsigned int ma_flags; + }; + struct maple_range_64 mr64; + struct maple_arange_64 ma64; + struct maple_alloc alloc; + }; +}; + +struct ma_topiary { + struct maple_enode *head; + struct maple_enode *tail; + struct maple_tree *mtree; +}; + +struct ma_wr_state { + struct ma_state *mas; + struct maple_node *node; + long unsigned int r_min; + long unsigned int r_max; + enum maple_type type; + unsigned char offset_end; + unsigned char node_end; + long unsigned int *pivots; + long unsigned int end_piv; + void **slots; + void *entry; + void *content; +}; + +struct trace_event_raw_ma_op { + struct trace_entry ent; + const char *fn; + long unsigned int min; + long unsigned int max; + long unsigned int index; + long unsigned int last; + void *node; + char __data[0]; +}; + +struct trace_event_raw_ma_read { + struct trace_entry ent; + const char *fn; + long unsigned int min; + long unsigned int max; + long unsigned int index; + long unsigned int last; + void *node; + char __data[0]; +}; + +struct trace_event_raw_ma_write { + struct trace_entry ent; + const char *fn; + long unsigned int min; + long unsigned int max; + long unsigned int index; + long unsigned int last; + long unsigned int piv; + void *val; + void *node; + char __data[0]; +}; + +struct trace_event_data_offsets_ma_op {}; + +struct trace_event_data_offsets_ma_read {}; + +struct trace_event_data_offsets_ma_write {}; + +typedef void (*btf_trace_ma_op)(void *, const char *, struct ma_state *); + +typedef void (*btf_trace_ma_read)(void *, const char *, struct ma_state *); + +typedef void (*btf_trace_ma_write)(void *, const char *, struct ma_state *, long unsigned int, void *); + +struct maple_big_node { + struct maple_pnode *parent; + long unsigned int pivot[65]; + union { + struct maple_enode *slot[66]; + struct { + long unsigned int padding[43]; + long unsigned int gap[43]; + }; + }; + unsigned char b_end; + enum maple_type type; +}; + +struct maple_subtree_state { + struct ma_state *orig_l; + struct ma_state *orig_r; + struct ma_state *l; + struct ma_state *m; + struct ma_state *r; + struct ma_topiary *free; + struct ma_topiary *destroy; + struct maple_big_node *bn; +}; + +typedef struct { + long unsigned int key[2]; +} hsiphash_key_t; + +enum format_type { + FORMAT_TYPE_NONE = 0, + FORMAT_TYPE_WIDTH = 1, + FORMAT_TYPE_PRECISION = 2, + FORMAT_TYPE_CHAR = 3, + FORMAT_TYPE_STR = 4, + FORMAT_TYPE_PTR = 5, + FORMAT_TYPE_PERCENT_CHAR = 6, + FORMAT_TYPE_INVALID = 7, + FORMAT_TYPE_LONG_LONG = 8, + FORMAT_TYPE_ULONG = 9, + FORMAT_TYPE_LONG = 10, + FORMAT_TYPE_UBYTE = 11, + FORMAT_TYPE_BYTE = 12, + FORMAT_TYPE_USHORT = 13, + FORMAT_TYPE_SHORT = 14, + FORMAT_TYPE_UINT = 15, + FORMAT_TYPE_INT = 16, + FORMAT_TYPE_SIZE_T = 17, + FORMAT_TYPE_PTRDIFF = 18, +}; + +struct printf_spec { + unsigned int type: 8; + int field_width: 24; + unsigned int flags: 8; + unsigned int base: 8; + int precision: 16; +}; + +struct page_flags_fields { + int width; + int shift; + int mask; + const struct printf_spec *spec; + const char *name; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +#endif /* __VMLINUX_H__ */ diff --git a/vmlinux/arm64/vmlinux.h b/vmlinux/arm64/vmlinux.h new file mode 120000 index 0000000..b302459 --- /dev/null +++ b/vmlinux/arm64/vmlinux.h @@ -0,0 +1 @@ +vmlinux_601.h \ No newline at end of file diff --git a/vmlinux/arm64/vmlinux_516.h b/vmlinux/arm64/vmlinux_516.h new file mode 100644 index 0000000..4802dc4 --- /dev/null +++ b/vmlinux/arm64/vmlinux_516.h @@ -0,0 +1,160927 @@ +#ifndef __VMLINUX_H__ +#define __VMLINUX_H__ + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + +typedef signed char __s8; + +typedef unsigned char __u8; + +typedef short int __s16; + +typedef short unsigned int __u16; + +typedef int __s32; + +typedef unsigned int __u32; + +typedef long long int __s64; + +typedef long long unsigned int __u64; + +typedef __s8 s8; + +typedef __u8 u8; + +typedef __s16 s16; + +typedef __u16 u16; + +typedef __s32 s32; + +typedef __u32 u32; + +typedef __s64 s64; + +typedef __u64 u64; + +enum { + false = 0, + true = 1, +}; + +typedef long int __kernel_long_t; + +typedef long unsigned int __kernel_ulong_t; + +typedef int __kernel_pid_t; + +typedef unsigned int __kernel_uid32_t; + +typedef unsigned int __kernel_gid32_t; + +typedef __kernel_ulong_t __kernel_size_t; + +typedef __kernel_long_t __kernel_ssize_t; + +typedef long long int __kernel_loff_t; + +typedef long long int __kernel_time64_t; + +typedef __kernel_long_t __kernel_clock_t; + +typedef int __kernel_timer_t; + +typedef int __kernel_clockid_t; + +typedef __u32 __le32; + +typedef unsigned int __poll_t; + +typedef u32 __kernel_dev_t; + +typedef __kernel_dev_t dev_t; + +typedef short unsigned int umode_t; + +typedef __kernel_pid_t pid_t; + +typedef __kernel_clockid_t clockid_t; + +typedef _Bool bool; + +typedef __kernel_uid32_t uid_t; + +typedef __kernel_gid32_t gid_t; + +typedef __kernel_loff_t loff_t; + +typedef __kernel_size_t size_t; + +typedef __kernel_ssize_t ssize_t; + +typedef s32 int32_t; + +typedef u16 uint16_t; + +typedef u32 uint32_t; + +typedef u64 sector_t; + +typedef u64 blkcnt_t; + +typedef unsigned int gfp_t; + +typedef unsigned int fmode_t; + +typedef u64 phys_addr_t; + +typedef long unsigned int irq_hw_number_t; + +typedef struct { + int counter; +} atomic_t; + +typedef struct { + s64 counter; +} atomic64_t; + +struct list_head { + struct list_head *next; + struct list_head *prev; +}; + +struct hlist_node; + +struct hlist_head { + struct hlist_node *first; +}; + +struct hlist_node { + struct hlist_node *next; + struct hlist_node **pprev; +}; + +struct callback_head { + struct callback_head *next; + void (*func)(struct callback_head *); +}; + +typedef int (*initcall_t)(); + +typedef int initcall_entry_t; + +struct lock_class_key {}; + +struct fs_context; + +struct fs_parameter_spec; + +struct dentry; + +struct super_block; + +struct module; + +struct file_system_type { + const char *name; + int fs_flags; + int (*init_fs_context)(struct fs_context *); + const struct fs_parameter_spec *parameters; + struct dentry * (*mount)(struct file_system_type *, int, const char *, void *); + void (*kill_sb)(struct super_block *); + struct module *owner; + struct file_system_type *next; + struct hlist_head fs_supers; + struct lock_class_key s_lock_key; + struct lock_class_key s_umount_key; + struct lock_class_key s_vfs_rename_key; + struct lock_class_key s_writers_key[3]; + struct lock_class_key i_lock_key; + struct lock_class_key i_mutex_key; + struct lock_class_key invalidate_lock_key; + struct lock_class_key i_mutex_dir_key; +}; + +struct obs_kernel_param { + const char *str; + int (*setup_func)(char *); + int early; +}; + +struct kernel_symbol { + int value_offset; + int name_offset; + int namespace_offset; +}; + +struct jump_entry { + s32 code; + s32 target; + long int key; +}; + +struct static_key_mod; + +struct static_key { + atomic_t enabled; + union { + long unsigned int type; + struct jump_entry *entries; + struct static_key_mod *next; + }; +}; + +struct static_key_true { + struct static_key key; +}; + +struct static_key_false { + struct static_key key; +}; + +typedef atomic64_t atomic_long_t; + +typedef __s64 time64_t; + +struct __kernel_timespec { + __kernel_time64_t tv_sec; + long long int tv_nsec; +}; + +struct timespec64 { + time64_t tv_sec; + long int tv_nsec; +}; + +struct qspinlock { + union { + atomic_t val; + struct { + u8 locked; + u8 pending; + }; + struct { + u16 locked_pending; + u16 tail; + }; + }; +}; + +typedef struct qspinlock arch_spinlock_t; + +struct qrwlock { + union { + atomic_t cnts; + struct { + u8 wlocked; + u8 __lstate[3]; + }; + }; + arch_spinlock_t wait_lock; +}; + +typedef struct qrwlock arch_rwlock_t; + +struct lockdep_map {}; + +struct raw_spinlock { + arch_spinlock_t raw_lock; +}; + +typedef struct raw_spinlock raw_spinlock_t; + +struct spinlock { + union { + struct raw_spinlock rlock; + }; +}; + +typedef struct spinlock spinlock_t; + +typedef struct { + arch_rwlock_t raw_lock; +} rwlock_t; + +struct ratelimit_state { + raw_spinlock_t lock; + int interval; + int burst; + int printed; + int missed; + long unsigned int begin; + long unsigned int flags; +}; + +struct _ddebug { + const char *modname; + const char *function; + const char *filename; + const char *format; + unsigned int lineno: 18; + unsigned int flags: 8; + union { + struct static_key_true dd_key_true; + struct static_key_false dd_key_false; + } key; +}; + +typedef void *fl_owner_t; + +struct file; + +struct kiocb; + +struct iov_iter; + +struct io_comp_batch; + +struct dir_context; + +struct poll_table_struct; + +struct vm_area_struct; + +struct inode; + +struct file_lock; + +struct page; + +struct pipe_inode_info; + +struct seq_file; + +struct file_operations { + struct module *owner; + loff_t (*llseek)(struct file *, loff_t, int); + ssize_t (*read)(struct file *, char *, size_t, loff_t *); + ssize_t (*write)(struct file *, const char *, size_t, loff_t *); + ssize_t (*read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*write_iter)(struct kiocb *, struct iov_iter *); + int (*iopoll)(struct kiocb *, struct io_comp_batch *, unsigned int); + int (*iterate)(struct file *, struct dir_context *); + int (*iterate_shared)(struct file *, struct dir_context *); + __poll_t (*poll)(struct file *, struct poll_table_struct *); + long int (*unlocked_ioctl)(struct file *, unsigned int, long unsigned int); + long int (*compat_ioctl)(struct file *, unsigned int, long unsigned int); + int (*mmap)(struct file *, struct vm_area_struct *); + long unsigned int mmap_supported_flags; + int (*open)(struct inode *, struct file *); + int (*flush)(struct file *, fl_owner_t); + int (*release)(struct inode *, struct file *); + int (*fsync)(struct file *, loff_t, loff_t, int); + int (*fasync)(int, struct file *, int); + int (*lock)(struct file *, int, struct file_lock *); + ssize_t (*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int); + long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + int (*check_flags)(int); + int (*flock)(struct file *, int, struct file_lock *); + ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); + ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + int (*setlease)(struct file *, long int, struct file_lock **, void **); + long int (*fallocate)(struct file *, int, loff_t, loff_t); + void (*show_fdinfo)(struct seq_file *, struct file *); + ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int); + loff_t (*remap_file_range)(struct file *, loff_t, struct file *, loff_t, loff_t, unsigned int); + int (*fadvise)(struct file *, loff_t, loff_t, int); +}; + +struct bug_entry { + int bug_addr_disp; + int file_disp; + short unsigned int line; + short unsigned int flags; +}; + +struct static_call_key { + void *func; +}; + +enum system_states { + SYSTEM_BOOTING = 0, + SYSTEM_SCHEDULING = 1, + SYSTEM_FREEING_INITMEM = 2, + SYSTEM_RUNNING = 3, + SYSTEM_HALT = 4, + SYSTEM_POWER_OFF = 5, + SYSTEM_RESTART = 6, + SYSTEM_SUSPEND = 7, +}; + +struct cpumask { + long unsigned int bits[4]; +}; + +typedef struct cpumask cpumask_t; + +typedef struct cpumask cpumask_var_t[1]; + +struct llist_node; + +struct llist_head { + struct llist_node *first; +}; + +struct llist_node { + struct llist_node *next; +}; + +struct __call_single_node { + struct llist_node llist; + union { + unsigned int u_flags; + atomic_t a_flags; + }; + u16 src; + u16 dst; +}; + +enum timespec_type { + TT_NONE = 0, + TT_NATIVE = 1, + TT_COMPAT = 2, +}; + +typedef s32 old_time32_t; + +struct old_timespec32 { + old_time32_t tv_sec; + s32 tv_nsec; +}; + +struct pollfd { + int fd; + short int events; + short int revents; +}; + +struct restart_block { + long unsigned int arch_data; + long int (*fn)(struct restart_block *); + union { + struct { + u32 *uaddr; + u32 val; + u32 flags; + u32 bitset; + u64 time; + u32 *uaddr2; + } futex; + struct { + clockid_t clockid; + enum timespec_type type; + union { + struct __kernel_timespec *rmtp; + struct old_timespec32 *compat_rmtp; + }; + u64 expires; + } nanosleep; + struct { + struct pollfd *ufds; + int nfds; + int has_timeout; + long unsigned int tv_sec; + long unsigned int tv_nsec; + } poll; + }; +}; + +struct thread_info { + long unsigned int flags; + u64 ttbr0; + union { + u64 preempt_count; + struct { + u32 count; + u32 need_resched; + } preempt; + }; + u32 cpu; +}; + +struct refcount_struct { + atomic_t refs; +}; + +typedef struct refcount_struct refcount_t; + +struct load_weight { + long unsigned int weight; + u32 inv_weight; +}; + +struct rb_node { + long unsigned int __rb_parent_color; + struct rb_node *rb_right; + struct rb_node *rb_left; +}; + +struct util_est { + unsigned int enqueued; + unsigned int ewma; +}; + +struct sched_avg { + u64 last_update_time; + u64 load_sum; + u64 runnable_sum; + u32 util_sum; + u32 period_contrib; + long unsigned int load_avg; + long unsigned int runnable_avg; + long unsigned int util_avg; + struct util_est util_est; +}; + +struct cfs_rq; + +struct sched_entity { + struct load_weight load; + struct rb_node run_node; + struct list_head group_node; + unsigned int on_rq; + u64 exec_start; + u64 sum_exec_runtime; + u64 vruntime; + u64 prev_sum_exec_runtime; + u64 nr_migrations; + int depth; + struct sched_entity *parent; + struct cfs_rq *cfs_rq; + struct cfs_rq *my_q; + long unsigned int runnable_weight; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_avg avg; +}; + +struct sched_rt_entity { + struct list_head run_list; + long unsigned int timeout; + long unsigned int watchdog_stamp; + unsigned int time_slice; + short unsigned int on_rq; + short unsigned int on_list; + struct sched_rt_entity *back; +}; + +typedef s64 ktime_t; + +struct timerqueue_node { + struct rb_node node; + ktime_t expires; +}; + +enum hrtimer_restart { + HRTIMER_NORESTART = 0, + HRTIMER_RESTART = 1, +}; + +struct hrtimer_clock_base; + +struct hrtimer { + struct timerqueue_node node; + ktime_t _softexpires; + enum hrtimer_restart (*function)(struct hrtimer *); + struct hrtimer_clock_base *base; + u8 state; + u8 is_rel; + u8 is_soft; + u8 is_hard; +}; + +struct sched_dl_entity { + struct rb_node rb_node; + u64 dl_runtime; + u64 dl_deadline; + u64 dl_period; + u64 dl_bw; + u64 dl_density; + s64 runtime; + u64 deadline; + unsigned int flags; + unsigned int dl_throttled: 1; + unsigned int dl_yielded: 1; + unsigned int dl_non_contending: 1; + unsigned int dl_overrun: 1; + struct hrtimer dl_timer; + struct hrtimer inactive_timer; + struct sched_dl_entity *pi_se; +}; + +struct uclamp_se { + unsigned int value: 11; + unsigned int bucket_id: 3; + unsigned int active: 1; + unsigned int user_defined: 1; +}; + +struct sched_statistics { + u64 wait_start; + u64 wait_max; + u64 wait_count; + u64 wait_sum; + u64 iowait_count; + u64 iowait_sum; + u64 sleep_start; + u64 sleep_max; + s64 sum_sleep_runtime; + u64 block_start; + u64 block_max; + s64 sum_block_runtime; + u64 exec_max; + u64 slice_max; + u64 nr_migrations_cold; + u64 nr_failed_migrations_affine; + u64 nr_failed_migrations_running; + u64 nr_failed_migrations_hot; + u64 nr_forced_migrations; + u64 nr_wakeups; + u64 nr_wakeups_sync; + u64 nr_wakeups_migrate; + u64 nr_wakeups_local; + u64 nr_wakeups_remote; + u64 nr_wakeups_affine; + u64 nr_wakeups_affine_attempts; + u64 nr_wakeups_passive; + u64 nr_wakeups_idle; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +union rcu_special { + struct { + u8 blocked; + u8 need_qs; + u8 exp_hint; + u8 need_mb; + } b; + u32 s; +}; + +struct sched_info { + long unsigned int pcount; + long long unsigned int run_delay; + long long unsigned int last_arrival; + long long unsigned int last_queued; +}; + +struct plist_node { + int prio; + struct list_head prio_list; + struct list_head node_list; +}; + +struct vmacache { + u64 seqnum; + struct vm_area_struct *vmas[4]; +}; + +struct task_rss_stat { + int events; + int count[4]; +}; + +struct prev_cputime { + u64 utime; + u64 stime; + raw_spinlock_t lock; +}; + +struct rb_root { + struct rb_node *rb_node; +}; + +struct rb_root_cached { + struct rb_root rb_root; + struct rb_node *rb_leftmost; +}; + +struct timerqueue_head { + struct rb_root_cached rb_root; +}; + +struct posix_cputimer_base { + u64 nextevt; + struct timerqueue_head tqhead; +}; + +struct posix_cputimers { + struct posix_cputimer_base bases[3]; + unsigned int timers_active; + unsigned int expiry_active; +}; + +struct posix_cputimers_work { + struct callback_head work; + unsigned int scheduled; +}; + +struct sem_undo_list; + +struct sysv_sem { + struct sem_undo_list *undo_list; +}; + +struct sysv_shm { + struct list_head shm_clist; +}; + +typedef struct { + long unsigned int sig[1]; +} sigset_t; + +struct sigpending { + struct list_head list; + sigset_t signal; +}; + +typedef struct { + uid_t val; +} kuid_t; + +struct seccomp_filter; + +struct seccomp { + int mode; + atomic_t filter_count; + struct seccomp_filter *filter; +}; + +struct syscall_user_dispatch {}; + +struct wake_q_node { + struct wake_q_node *next; +}; + +struct task_io_accounting { + u64 rchar; + u64 wchar; + u64 syscr; + u64 syscw; + u64 read_bytes; + u64 write_bytes; + u64 cancelled_write_bytes; +}; + +typedef struct { + long unsigned int bits[1]; +} nodemask_t; + +struct seqcount { + unsigned int sequence; +}; + +typedef struct seqcount seqcount_t; + +struct seqcount_spinlock { + seqcount_t seqcount; +}; + +typedef struct seqcount_spinlock seqcount_spinlock_t; + +struct optimistic_spin_queue { + atomic_t tail; +}; + +struct mutex { + atomic_long_t owner; + raw_spinlock_t wait_lock; + struct optimistic_spin_queue osq; + struct list_head wait_list; +}; + +struct tlbflush_unmap_batch {}; + +struct page_frag { + struct page *page; + __u32 offset; + __u32 size; +}; + +struct kmap_ctrl {}; + +struct cpu_context { + long unsigned int x19; + long unsigned int x20; + long unsigned int x21; + long unsigned int x22; + long unsigned int x23; + long unsigned int x24; + long unsigned int x25; + long unsigned int x26; + long unsigned int x27; + long unsigned int x28; + long unsigned int fp; + long unsigned int sp; + long unsigned int pc; +}; + +struct user_fpsimd_state { + __int128 unsigned vregs[32]; + __u32 fpsr; + __u32 fpcr; + __u32 __reserved[2]; +}; + +struct perf_event; + +struct debug_info { + int suspended_step; + int bps_disabled; + int wps_disabled; + struct perf_event *hbp_break[16]; + struct perf_event *hbp_watch[16]; +}; + +struct ptrauth_key { + long unsigned int lo; + long unsigned int hi; +}; + +struct ptrauth_keys_user { + struct ptrauth_key apia; + struct ptrauth_key apib; + struct ptrauth_key apda; + struct ptrauth_key apdb; + struct ptrauth_key apga; +}; + +struct ptrauth_keys_kernel { + struct ptrauth_key apia; +}; + +struct thread_struct { + struct cpu_context cpu_context; + long: 64; + struct { + long unsigned int tp_value; + long unsigned int tp2_value; + struct user_fpsimd_state fpsimd_state; + } uw; + unsigned int fpsimd_cpu; + void *sve_state; + unsigned int vl[1]; + unsigned int vl_onexec[1]; + long unsigned int fault_address; + long unsigned int fault_code; + struct debug_info debug; + struct ptrauth_keys_user keys_user; + struct ptrauth_keys_kernel keys_kernel; + u64 mte_ctrl; + u64 sctlr_user; + long: 64; +}; + +struct sched_class; + +struct task_group; + +struct mm_struct; + +struct pid; + +struct completion; + +struct cred; + +struct key; + +struct nameidata; + +struct fs_struct; + +struct files_struct; + +struct io_uring_task; + +struct nsproxy; + +struct signal_struct; + +struct sighand_struct; + +struct audit_context; + +struct rt_mutex_waiter; + +struct bio_list; + +struct blk_plug; + +struct reclaim_state; + +struct backing_dev_info; + +struct io_context; + +struct capture_control; + +struct kernel_siginfo; + +typedef struct kernel_siginfo kernel_siginfo_t; + +struct css_set; + +struct robust_list_head; + +struct compat_robust_list_head; + +struct futex_pi_state; + +struct perf_event_context; + +struct mempolicy; + +struct numa_group; + +struct rseq; + +struct task_delay_info; + +struct ftrace_ret_stack; + +struct mem_cgroup; + +struct request_queue; + +struct uprobe_task; + +struct vm_struct; + +struct bpf_local_storage; + +struct bpf_run_ctx; + +struct task_struct { + struct thread_info thread_info; + unsigned int __state; + void *stack; + refcount_t usage; + unsigned int flags; + unsigned int ptrace; + int on_cpu; + struct __call_single_node wake_entry; + unsigned int wakee_flips; + long unsigned int wakee_flip_decay_ts; + struct task_struct *last_wakee; + int recent_used_cpu; + int wake_cpu; + int on_rq; + int prio; + int static_prio; + int normal_prio; + unsigned int rt_priority; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_entity se; + struct sched_rt_entity rt; + struct sched_dl_entity dl; + const struct sched_class *sched_class; + struct rb_node core_node; + long unsigned int core_cookie; + unsigned int core_occupation; + struct task_group *sched_task_group; + struct uclamp_se uclamp_req[2]; + struct uclamp_se uclamp[2]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_statistics stats; + struct hlist_head preempt_notifiers; + unsigned int btrace_seq; + unsigned int policy; + int nr_cpus_allowed; + const cpumask_t *cpus_ptr; + cpumask_t *user_cpus_ptr; + cpumask_t cpus_mask; + void *migration_pending; + short unsigned int migration_disabled; + short unsigned int migration_flags; + int trc_reader_nesting; + int trc_ipi_to_cpu; + union rcu_special trc_reader_special; + bool trc_reader_checked; + struct list_head trc_holdout_list; + struct sched_info sched_info; + struct list_head tasks; + struct plist_node pushable_tasks; + struct rb_node pushable_dl_tasks; + struct mm_struct *mm; + struct mm_struct *active_mm; + struct vmacache vmacache; + struct task_rss_stat rss_stat; + int exit_state; + int exit_code; + int exit_signal; + int pdeath_signal; + long unsigned int jobctl; + unsigned int personality; + unsigned int sched_reset_on_fork: 1; + unsigned int sched_contributes_to_load: 1; + unsigned int sched_migrated: 1; + unsigned int sched_psi_wake_requeue: 1; + int: 28; + unsigned int sched_remote_wakeup: 1; + unsigned int in_execve: 1; + unsigned int in_iowait: 1; + unsigned int in_user_fault: 1; + unsigned int no_cgroup_migration: 1; + unsigned int frozen: 1; + unsigned int use_memdelay: 1; + unsigned int in_memstall: 1; + unsigned int in_eventfd_signal: 1; + long unsigned int atomic_flags; + struct restart_block restart_block; + pid_t pid; + pid_t tgid; + long unsigned int stack_canary; + struct task_struct *real_parent; + struct task_struct *parent; + struct list_head children; + struct list_head sibling; + struct task_struct *group_leader; + struct list_head ptraced; + struct list_head ptrace_entry; + struct pid *thread_pid; + struct hlist_node pid_links[4]; + struct list_head thread_group; + struct list_head thread_node; + struct completion *vfork_done; + int *set_child_tid; + int *clear_child_tid; + void *pf_io_worker; + u64 utime; + u64 stime; + u64 gtime; + struct prev_cputime prev_cputime; + long unsigned int nvcsw; + long unsigned int nivcsw; + u64 start_time; + u64 start_boottime; + long unsigned int min_flt; + long unsigned int maj_flt; + struct posix_cputimers posix_cputimers; + struct posix_cputimers_work posix_cputimers_work; + const struct cred *ptracer_cred; + const struct cred *real_cred; + const struct cred *cred; + struct key *cached_requested_key; + char comm[16]; + struct nameidata *nameidata; + struct sysv_sem sysvsem; + struct sysv_shm sysvshm; + long unsigned int last_switch_count; + long unsigned int last_switch_time; + struct fs_struct *fs; + struct files_struct *files; + struct io_uring_task *io_uring; + struct nsproxy *nsproxy; + struct signal_struct *signal; + struct sighand_struct *sighand; + sigset_t blocked; + sigset_t real_blocked; + sigset_t saved_sigmask; + struct sigpending pending; + long unsigned int sas_ss_sp; + size_t sas_ss_size; + unsigned int sas_ss_flags; + struct callback_head *task_works; + struct audit_context *audit_context; + kuid_t loginuid; + unsigned int sessionid; + struct seccomp seccomp; + struct syscall_user_dispatch syscall_dispatch; + u64 parent_exec_id; + u64 self_exec_id; + spinlock_t alloc_lock; + raw_spinlock_t pi_lock; + struct wake_q_node wake_q; + struct rb_root_cached pi_waiters; + struct task_struct *pi_top_task; + struct rt_mutex_waiter *pi_blocked_on; + void *journal_info; + struct bio_list *bio_list; + struct blk_plug *plug; + struct reclaim_state *reclaim_state; + struct backing_dev_info *backing_dev_info; + struct io_context *io_context; + struct capture_control *capture_control; + long unsigned int ptrace_message; + kernel_siginfo_t *last_siginfo; + struct task_io_accounting ioac; + unsigned int psi_flags; + u64 acct_rss_mem1; + u64 acct_vm_mem1; + u64 acct_timexpd; + nodemask_t mems_allowed; + seqcount_spinlock_t mems_allowed_seq; + int cpuset_mem_spread_rotor; + int cpuset_slab_spread_rotor; + struct css_set *cgroups; + struct list_head cg_list; + struct robust_list_head *robust_list; + struct compat_robust_list_head *compat_robust_list; + struct list_head pi_state_list; + struct futex_pi_state *pi_state_cache; + struct mutex futex_exit_mutex; + unsigned int futex_state; + struct perf_event_context *perf_event_ctxp[2]; + struct mutex perf_event_mutex; + struct list_head perf_event_list; + struct mempolicy *mempolicy; + short int il_prev; + short int pref_node_fork; + int numa_scan_seq; + unsigned int numa_scan_period; + unsigned int numa_scan_period_max; + int numa_preferred_nid; + long unsigned int numa_migrate_retry; + u64 node_stamp; + u64 last_task_numa_placement; + u64 last_sum_exec_runtime; + struct callback_head numa_work; + struct numa_group *numa_group; + long unsigned int *numa_faults; + long unsigned int total_numa_faults; + long unsigned int numa_faults_locality[3]; + long unsigned int numa_pages_migrated; + struct rseq *rseq; + u32 rseq_sig; + long unsigned int rseq_event_mask; + struct tlbflush_unmap_batch tlb_ubc; + union { + refcount_t rcu_users; + struct callback_head rcu; + }; + struct pipe_inode_info *splice_pipe; + struct page_frag task_frag; + struct task_delay_info *delays; + int nr_dirtied; + int nr_dirtied_pause; + long unsigned int dirty_paused_when; + u64 timer_slack_ns; + u64 default_timer_slack_ns; + int curr_ret_stack; + int curr_ret_depth; + struct ftrace_ret_stack *ret_stack; + long long unsigned int ftrace_timestamp; + atomic_t trace_overrun; + atomic_t tracing_graph_pause; + long unsigned int trace; + long unsigned int trace_recursion; + struct mem_cgroup *memcg_in_oom; + gfp_t memcg_oom_gfp_mask; + int memcg_oom_order; + unsigned int memcg_nr_pages_over_high; + struct mem_cgroup *active_memcg; + struct request_queue *throttle_queue; + struct uprobe_task *utask; + unsigned int sequential_io; + unsigned int sequential_io_avg; + struct kmap_ctrl kmap_ctrl; + int pagefault_disabled; + struct task_struct *oom_reaper_list; + struct vm_struct *stack_vm_area; + refcount_t stack_refcount; + void *security; + struct bpf_local_storage *bpf_storage; + struct bpf_run_ctx *bpf_ctx; + struct llist_head kretprobe_instances; + struct thread_struct thread; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef s32 compat_long_t; + +typedef u32 compat_uptr_t; + +struct user_pt_regs { + __u64 regs[31]; + __u64 sp; + __u64 pc; + __u64 pstate; +}; + +struct pt_regs { + union { + struct user_pt_regs user_regs; + struct { + u64 regs[31]; + u64 sp; + u64 pc; + u64 pstate; + }; + }; + u64 orig_x0; + s32 syscallno; + u32 unused2; + u64 sdei_ttbr1; + u64 pmr_save; + u64 stackframe[2]; + u64 lockdep_hardirqs; + u64 exit_rcu; +}; + +struct arch_hw_breakpoint_ctrl { + u32 __reserved: 19; + u32 len: 8; + u32 type: 2; + u32 privilege: 2; + u32 enabled: 1; +}; + +struct arch_hw_breakpoint { + u64 address; + u64 trigger; + struct arch_hw_breakpoint_ctrl ctrl; +}; + +typedef u64 pteval_t; + +typedef u64 pmdval_t; + +typedef u64 pudval_t; + +typedef u64 pgdval_t; + +typedef struct { + pteval_t pte; +} pte_t; + +typedef struct { + pmdval_t pmd; +} pmd_t; + +typedef struct { + pudval_t pud; +} pud_t; + +typedef struct { + pgdval_t pgd; +} pgd_t; + +typedef struct { + pteval_t pgprot; +} pgprot_t; + +enum module_state { + MODULE_STATE_LIVE = 0, + MODULE_STATE_COMING = 1, + MODULE_STATE_GOING = 2, + MODULE_STATE_UNFORMED = 3, +}; + +struct kref { + refcount_t refcount; +}; + +struct kset; + +struct kobj_type; + +struct kernfs_node; + +struct kobject { + const char *name; + struct list_head entry; + struct kobject *parent; + struct kset *kset; + struct kobj_type *ktype; + struct kernfs_node *sd; + struct kref kref; + unsigned int state_initialized: 1; + unsigned int state_in_sysfs: 1; + unsigned int state_add_uevent_sent: 1; + unsigned int state_remove_uevent_sent: 1; + unsigned int uevent_suppress: 1; +}; + +struct module_param_attrs; + +struct module_kobject { + struct kobject kobj; + struct module *mod; + struct kobject *drivers_dir; + struct module_param_attrs *mp; + struct completion *kobj_completion; +}; + +struct latch_tree_node { + struct rb_node node[2]; +}; + +struct mod_tree_node { + struct module *mod; + struct latch_tree_node node; +}; + +struct module_layout { + void *base; + unsigned int size; + unsigned int text_size; + unsigned int ro_size; + unsigned int ro_after_init_size; + struct mod_tree_node mtn; +}; + +struct mod_plt_sec { + int plt_shndx; + int plt_num_entries; + int plt_max_entries; +}; + +struct plt_entry; + +struct mod_arch_specific { + struct mod_plt_sec core; + struct mod_plt_sec init; + struct plt_entry *ftrace_trampolines; +}; + +struct elf64_sym; + +typedef struct elf64_sym Elf64_Sym; + +struct mod_kallsyms { + Elf64_Sym *symtab; + unsigned int num_symtab; + char *strtab; + char *typetab; +}; + +typedef const int tracepoint_ptr_t; + +struct module_attribute; + +struct kernel_param; + +struct exception_table_entry; + +struct module_sect_attrs; + +struct module_notes_attrs; + +struct srcu_struct; + +struct bpf_raw_event_map; + +struct trace_event_call; + +struct trace_eval_map; + +struct error_injection_entry; + +struct module { + enum module_state state; + struct list_head list; + char name[56]; + struct module_kobject mkobj; + struct module_attribute *modinfo_attrs; + const char *version; + const char *srcversion; + struct kobject *holders_dir; + const struct kernel_symbol *syms; + const s32 *crcs; + unsigned int num_syms; + struct mutex param_lock; + struct kernel_param *kp; + unsigned int num_kp; + unsigned int num_gpl_syms; + const struct kernel_symbol *gpl_syms; + const s32 *gpl_crcs; + bool using_gplonly_symbols; + bool sig_ok; + bool async_probe_requested; + unsigned int num_exentries; + struct exception_table_entry *extable; + int (*init)(); + struct module_layout core_layout; + struct module_layout init_layout; + struct mod_arch_specific arch; + long unsigned int taints; + unsigned int num_bugs; + struct list_head bug_list; + struct bug_entry *bug_table; + struct mod_kallsyms *kallsyms; + struct mod_kallsyms core_kallsyms; + struct module_sect_attrs *sect_attrs; + struct module_notes_attrs *notes_attrs; + char *args; + void *percpu; + unsigned int percpu_size; + void *noinstr_text_start; + unsigned int noinstr_text_size; + unsigned int num_tracepoints; + tracepoint_ptr_t *tracepoints_ptrs; + unsigned int num_srcu_structs; + struct srcu_struct **srcu_struct_ptrs; + unsigned int num_bpf_raw_events; + struct bpf_raw_event_map *bpf_raw_events; + unsigned int btf_data_size; + void *btf_data; + struct jump_entry *jump_entries; + unsigned int num_jump_entries; + unsigned int num_trace_bprintk_fmt; + const char **trace_bprintk_fmt_start; + struct trace_event_call **trace_events; + unsigned int num_trace_events; + struct trace_eval_map **trace_evals; + unsigned int num_trace_evals; + unsigned int num_ftrace_callsites; + long unsigned int *ftrace_callsites; + void *kprobes_text_start; + unsigned int kprobes_text_size; + long unsigned int *kprobe_blacklist; + unsigned int num_kprobe_blacklist; + struct list_head source_list; + struct list_head target_list; + void (*exit)(); + atomic_t refcnt; + struct error_injection_entry *ei_funcs; + unsigned int num_ei_funcs; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum perf_event_state { + PERF_EVENT_STATE_DEAD = 4294967292, + PERF_EVENT_STATE_EXIT = 4294967293, + PERF_EVENT_STATE_ERROR = 4294967294, + PERF_EVENT_STATE_OFF = 4294967295, + PERF_EVENT_STATE_INACTIVE = 0, + PERF_EVENT_STATE_ACTIVE = 1, +}; + +typedef struct { + atomic_long_t a; +} local_t; + +typedef struct { + local_t a; +} local64_t; + +struct perf_event_attr { + __u32 type; + __u32 size; + __u64 config; + union { + __u64 sample_period; + __u64 sample_freq; + }; + __u64 sample_type; + __u64 read_format; + __u64 disabled: 1; + __u64 inherit: 1; + __u64 pinned: 1; + __u64 exclusive: 1; + __u64 exclude_user: 1; + __u64 exclude_kernel: 1; + __u64 exclude_hv: 1; + __u64 exclude_idle: 1; + __u64 mmap: 1; + __u64 comm: 1; + __u64 freq: 1; + __u64 inherit_stat: 1; + __u64 enable_on_exec: 1; + __u64 task: 1; + __u64 watermark: 1; + __u64 precise_ip: 2; + __u64 mmap_data: 1; + __u64 sample_id_all: 1; + __u64 exclude_host: 1; + __u64 exclude_guest: 1; + __u64 exclude_callchain_kernel: 1; + __u64 exclude_callchain_user: 1; + __u64 mmap2: 1; + __u64 comm_exec: 1; + __u64 use_clockid: 1; + __u64 context_switch: 1; + __u64 write_backward: 1; + __u64 namespaces: 1; + __u64 ksymbol: 1; + __u64 bpf_event: 1; + __u64 aux_output: 1; + __u64 cgroup: 1; + __u64 text_poke: 1; + __u64 build_id: 1; + __u64 inherit_thread: 1; + __u64 remove_on_exec: 1; + __u64 sigtrap: 1; + __u64 __reserved_1: 26; + union { + __u32 wakeup_events; + __u32 wakeup_watermark; + }; + __u32 bp_type; + union { + __u64 bp_addr; + __u64 kprobe_func; + __u64 uprobe_path; + __u64 config1; + }; + union { + __u64 bp_len; + __u64 kprobe_addr; + __u64 probe_offset; + __u64 config2; + }; + __u64 branch_sample_type; + __u64 sample_regs_user; + __u32 sample_stack_user; + __s32 clockid; + __u64 sample_regs_intr; + __u32 aux_watermark; + __u16 sample_max_stack; + __u16 __reserved_2; + __u32 aux_sample_size; + __u32 __reserved_3; + __u64 sig_data; +}; + +struct hw_perf_event_extra { + u64 config; + unsigned int reg; + int alloc; + int idx; +}; + +struct hw_perf_event { + union { + struct { + u64 config; + u64 last_tag; + long unsigned int config_base; + long unsigned int event_base; + int event_base_rdpmc; + int idx; + int last_cpu; + int flags; + struct hw_perf_event_extra extra_reg; + struct hw_perf_event_extra branch_reg; + }; + struct { + struct hrtimer hrtimer; + }; + struct { + struct list_head tp_list; + }; + struct { + u64 pwr_acc; + u64 ptsc; + }; + struct { + struct arch_hw_breakpoint info; + struct list_head bp_list; + }; + struct { + u8 iommu_bank; + u8 iommu_cntr; + u16 padding; + u64 conf; + u64 conf1; + }; + }; + struct task_struct *target; + void *addr_filters; + long unsigned int addr_filters_gen; + int state; + local64_t prev_count; + u64 sample_period; + union { + struct { + u64 last_period; + local64_t period_left; + }; + struct { + u64 saved_metric; + u64 saved_slots; + }; + }; + u64 interrupts_seq; + u64 interrupts; + u64 freq_time_stamp; + u64 freq_count_stamp; +}; + +struct wait_queue_head { + spinlock_t lock; + struct list_head head; +}; + +typedef struct wait_queue_head wait_queue_head_t; + +struct rcuwait { + struct task_struct *task; +}; + +struct irq_work { + struct __call_single_node node; + void (*func)(struct irq_work *); + struct rcuwait irqwait; +}; + +struct perf_addr_filters_head { + struct list_head list; + raw_spinlock_t lock; + unsigned int nr_file_filters; +}; + +struct perf_sample_data; + +typedef void (*perf_overflow_handler_t)(struct perf_event *, struct perf_sample_data *, struct pt_regs *); + +struct ftrace_ops; + +struct ftrace_regs; + +typedef void (*ftrace_func_t)(long unsigned int, long unsigned int, struct ftrace_ops *, struct ftrace_regs *); + +struct ftrace_hash; + +struct ftrace_ops_hash { + struct ftrace_hash *notrace_hash; + struct ftrace_hash *filter_hash; + struct mutex regex_lock; +}; + +struct ftrace_ops { + ftrace_func_t func; + struct ftrace_ops *next; + long unsigned int flags; + void *private; + ftrace_func_t saved_func; + struct ftrace_ops_hash local_hash; + struct ftrace_ops_hash *func_hash; + struct ftrace_ops_hash old_hash; + long unsigned int trampoline; + long unsigned int trampoline_size; + struct list_head list; +}; + +struct pmu; + +struct perf_buffer; + +struct fasync_struct; + +struct perf_addr_filter_range; + +struct pid_namespace; + +struct bpf_prog; + +struct event_filter; + +struct perf_cgroup; + +struct perf_event { + struct list_head event_entry; + struct list_head sibling_list; + struct list_head active_list; + struct rb_node group_node; + u64 group_index; + struct list_head migrate_entry; + struct hlist_node hlist_entry; + struct list_head active_entry; + int nr_siblings; + int event_caps; + int group_caps; + struct perf_event *group_leader; + struct pmu *pmu; + void *pmu_private; + enum perf_event_state state; + unsigned int attach_state; + local64_t count; + atomic64_t child_count; + u64 total_time_enabled; + u64 total_time_running; + u64 tstamp; + u64 shadow_ctx_time; + struct perf_event_attr attr; + u16 header_size; + u16 id_header_size; + u16 read_size; + struct hw_perf_event hw; + struct perf_event_context *ctx; + atomic_long_t refcount; + atomic64_t child_total_time_enabled; + atomic64_t child_total_time_running; + struct mutex child_mutex; + struct list_head child_list; + struct perf_event *parent; + int oncpu; + int cpu; + struct list_head owner_entry; + struct task_struct *owner; + struct mutex mmap_mutex; + atomic_t mmap_count; + struct perf_buffer *rb; + struct list_head rb_entry; + long unsigned int rcu_batches; + int rcu_pending; + wait_queue_head_t waitq; + struct fasync_struct *fasync; + int pending_wakeup; + int pending_kill; + int pending_disable; + long unsigned int pending_addr; + struct irq_work pending; + atomic_t event_limit; + struct perf_addr_filters_head addr_filters; + struct perf_addr_filter_range *addr_filter_ranges; + long unsigned int addr_filters_gen; + struct perf_event *aux_event; + void (*destroy)(struct perf_event *); + struct callback_head callback_head; + struct pid_namespace *ns; + u64 id; + u64 (*clock)(); + perf_overflow_handler_t overflow_handler; + void *overflow_handler_context; + perf_overflow_handler_t orig_overflow_handler; + struct bpf_prog *prog; + u64 bpf_cookie; + struct trace_event_call *tp_event; + struct event_filter *filter; + struct ftrace_ops ftrace_ops; + struct perf_cgroup *cgrp; + void *security; + struct list_head sb_list; +}; + +struct wait_queue_entry; + +typedef int (*wait_queue_func_t)(struct wait_queue_entry *, unsigned int, int, void *); + +struct wait_queue_entry { + unsigned int flags; + void *private; + wait_queue_func_t func; + struct list_head entry; +}; + +typedef struct wait_queue_entry wait_queue_entry_t; + +enum refcount_saturation_type { + REFCOUNT_ADD_NOT_ZERO_OVF = 0, + REFCOUNT_ADD_OVF = 1, + REFCOUNT_ADD_UAF = 2, + REFCOUNT_SUB_UAF = 3, + REFCOUNT_DEC_LEAK = 4, +}; + +enum pid_type { + PIDTYPE_PID = 0, + PIDTYPE_TGID = 1, + PIDTYPE_PGID = 2, + PIDTYPE_SID = 3, + PIDTYPE_MAX = 4, +}; + +struct upid { + int nr; + struct pid_namespace *ns; +}; + +struct xarray { + spinlock_t xa_lock; + gfp_t xa_flags; + void *xa_head; +}; + +struct idr { + struct xarray idr_rt; + unsigned int idr_base; + unsigned int idr_next; +}; + +struct proc_ns_operations; + +struct ns_common { + atomic_long_t stashed; + const struct proc_ns_operations *ops; + unsigned int inum; + refcount_t count; +}; + +struct kmem_cache; + +struct fs_pin; + +struct user_namespace; + +struct ucounts; + +struct pid_namespace { + struct idr idr; + struct callback_head rcu; + unsigned int pid_allocated; + struct task_struct *child_reaper; + struct kmem_cache *pid_cachep; + unsigned int level; + struct pid_namespace *parent; + struct fs_pin *bacct; + struct user_namespace *user_ns; + struct ucounts *ucounts; + int reboot; + struct ns_common ns; +}; + +struct pid { + refcount_t count; + unsigned int level; + spinlock_t lock; + struct hlist_head tasks[4]; + struct hlist_head inodes; + wait_queue_head_t wait_pidfd; + struct callback_head rcu; + struct upid numbers[1]; +}; + +struct uid_gid_extent { + u32 first; + u32 lower_first; + u32 count; +}; + +struct uid_gid_map { + u32 nr_extents; + union { + struct uid_gid_extent extent[5]; + struct { + struct uid_gid_extent *forward; + struct uid_gid_extent *reverse; + }; + }; +}; + +typedef struct { + gid_t val; +} kgid_t; + +struct rw_semaphore { + atomic_long_t count; + atomic_long_t owner; + struct optimistic_spin_queue osq; + raw_spinlock_t wait_lock; + struct list_head wait_list; +}; + +struct work_struct; + +typedef void (*work_func_t)(struct work_struct *); + +struct work_struct { + atomic_long_t data; + struct list_head entry; + work_func_t func; +}; + +struct ctl_table; + +struct ctl_table_root; + +struct ctl_table_set; + +struct ctl_dir; + +struct ctl_node; + +struct ctl_table_header { + union { + struct { + struct ctl_table *ctl_table; + int used; + int count; + int nreg; + }; + struct callback_head rcu; + }; + struct completion *unregistering; + struct ctl_table *ctl_table_arg; + struct ctl_table_root *root; + struct ctl_table_set *set; + struct ctl_dir *parent; + struct ctl_node *node; + struct hlist_head inodes; +}; + +struct ctl_dir { + struct ctl_table_header header; + struct rb_root root; +}; + +struct ctl_table_set { + int (*is_seen)(struct ctl_table_set *); + struct ctl_dir dir; +}; + +struct user_namespace { + struct uid_gid_map uid_map; + struct uid_gid_map gid_map; + struct uid_gid_map projid_map; + struct user_namespace *parent; + int level; + kuid_t owner; + kgid_t group; + struct ns_common ns; + long unsigned int flags; + bool parent_could_setfcap; + struct list_head keyring_name_list; + struct key *user_keyring_register; + struct rw_semaphore keyring_sem; + struct key *persistent_keyring_register; + struct work_struct work; + struct ctl_table_set set; + struct ctl_table_header *sysctls; + struct ucounts *ucounts; + long int ucount_max[16]; +}; + +struct timer_list { + struct hlist_node entry; + long unsigned int expires; + void (*function)(struct timer_list *); + u32 flags; +}; + +struct workqueue_struct; + +struct delayed_work { + struct work_struct work; + struct timer_list timer; + struct workqueue_struct *wq; + int cpu; +}; + +struct rcu_work { + struct work_struct work; + struct callback_head rcu; + struct workqueue_struct *wq; +}; + +typedef struct page *pgtable_t; + +struct address_space; + +struct page_pool; + +struct dev_pagemap; + +struct page { + long unsigned int flags; + union { + struct { + struct list_head lru; + struct address_space *mapping; + long unsigned int index; + long unsigned int private; + }; + struct { + long unsigned int pp_magic; + struct page_pool *pp; + long unsigned int _pp_mapping_pad; + long unsigned int dma_addr; + union { + long unsigned int dma_addr_upper; + atomic_long_t pp_frag_count; + }; + }; + struct { + union { + struct list_head slab_list; + struct { + struct page *next; + int pages; + }; + }; + struct kmem_cache *slab_cache; + void *freelist; + union { + void *s_mem; + long unsigned int counters; + struct { + unsigned int inuse: 16; + unsigned int objects: 15; + unsigned int frozen: 1; + }; + }; + }; + struct { + long unsigned int compound_head; + unsigned char compound_dtor; + unsigned char compound_order; + atomic_t compound_mapcount; + unsigned int compound_nr; + }; + struct { + long unsigned int _compound_pad_1; + atomic_t hpage_pinned_refcount; + struct list_head deferred_list; + }; + struct { + long unsigned int _pt_pad_1; + pgtable_t pmd_huge_pte; + long unsigned int _pt_pad_2; + union { + struct mm_struct *pt_mm; + atomic_t pt_frag_refcount; + }; + spinlock_t ptl; + }; + struct { + struct dev_pagemap *pgmap; + void *zone_device_data; + }; + struct callback_head callback_head; + }; + union { + atomic_t _mapcount; + unsigned int page_type; + unsigned int active; + int units; + }; + atomic_t _refcount; + long unsigned int memcg_data; +}; + +struct seqcount_raw_spinlock { + seqcount_t seqcount; +}; + +typedef struct seqcount_raw_spinlock seqcount_raw_spinlock_t; + +typedef struct { + seqcount_spinlock_t seqcount; + spinlock_t lock; +} seqlock_t; + +struct hrtimer_cpu_base; + +struct hrtimer_clock_base { + struct hrtimer_cpu_base *cpu_base; + unsigned int index; + clockid_t clockid; + seqcount_raw_spinlock_t seq; + struct hrtimer *running; + struct timerqueue_head active; + ktime_t (*get_time)(); + ktime_t offset; +}; + +struct hrtimer_cpu_base { + raw_spinlock_t lock; + unsigned int cpu; + unsigned int active_bases; + unsigned int clock_was_set_seq; + unsigned int hres_active: 1; + unsigned int in_hrtirq: 1; + unsigned int hang_detected: 1; + unsigned int softirq_activated: 1; + unsigned int nr_events; + short unsigned int nr_retries; + short unsigned int nr_hangs; + unsigned int max_hang_time; + ktime_t expires_next; + struct hrtimer *next_timer; + ktime_t softirq_expires_next; + struct hrtimer *softirq_next_timer; + struct hrtimer_clock_base clock_base[8]; +}; + +enum node_states { + N_POSSIBLE = 0, + N_ONLINE = 1, + N_NORMAL_MEMORY = 2, + N_HIGH_MEMORY = 2, + N_MEMORY = 3, + N_CPU = 4, + N_GENERIC_INITIATOR = 5, + NR_NODE_STATES = 6, +}; + +struct rlimit { + __kernel_ulong_t rlim_cur; + __kernel_ulong_t rlim_max; +}; + +struct task_cputime { + u64 stime; + u64 utime; + long long unsigned int sum_exec_runtime; +}; + +typedef void __signalfn_t(int); + +typedef __signalfn_t *__sighandler_t; + +typedef void __restorefn_t(); + +typedef __restorefn_t *__sigrestore_t; + +union sigval { + int sival_int; + void *sival_ptr; +}; + +typedef union sigval sigval_t; + +union __sifields { + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + } _kill; + struct { + __kernel_timer_t _tid; + int _overrun; + sigval_t _sigval; + int _sys_private; + } _timer; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + sigval_t _sigval; + } _rt; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + int _status; + __kernel_clock_t _utime; + __kernel_clock_t _stime; + } _sigchld; + struct { + void *_addr; + union { + int _trapno; + short int _addr_lsb; + struct { + char _dummy_bnd[8]; + void *_lower; + void *_upper; + } _addr_bnd; + struct { + char _dummy_pkey[8]; + __u32 _pkey; + } _addr_pkey; + struct { + long unsigned int _data; + __u32 _type; + } _perf; + }; + } _sigfault; + struct { + long int _band; + int _fd; + } _sigpoll; + struct { + void *_call_addr; + int _syscall; + unsigned int _arch; + } _sigsys; +}; + +struct kernel_siginfo { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; +}; + +struct ucounts { + struct hlist_node node; + struct user_namespace *ns; + kuid_t uid; + atomic_t count; + atomic_long_t ucount[16]; +}; + +struct sigaction { + __sighandler_t sa_handler; + long unsigned int sa_flags; + __sigrestore_t sa_restorer; + sigset_t sa_mask; +}; + +struct k_sigaction { + struct sigaction sa; +}; + +struct userfaultfd_ctx; + +struct vm_userfaultfd_ctx { + struct userfaultfd_ctx *ctx; +}; + +struct anon_vma; + +struct vm_operations_struct; + +struct vm_area_struct { + long unsigned int vm_start; + long unsigned int vm_end; + struct vm_area_struct *vm_next; + struct vm_area_struct *vm_prev; + struct rb_node vm_rb; + long unsigned int rb_subtree_gap; + struct mm_struct *vm_mm; + pgprot_t vm_page_prot; + long unsigned int vm_flags; + struct { + struct rb_node rb; + long unsigned int rb_subtree_last; + } shared; + struct list_head anon_vma_chain; + struct anon_vma *anon_vma; + const struct vm_operations_struct *vm_ops; + long unsigned int vm_pgoff; + struct file *vm_file; + void *vm_private_data; + atomic_long_t swap_readahead_info; + struct mempolicy *vm_policy; + struct vm_userfaultfd_ctx vm_userfaultfd_ctx; +}; + +struct mm_rss_stat { + atomic_long_t count[4]; +}; + +struct cpu_itimer { + u64 expires; + u64 incr; +}; + +struct task_cputime_atomic { + atomic64_t utime; + atomic64_t stime; + atomic64_t sum_exec_runtime; +}; + +struct thread_group_cputimer { + struct task_cputime_atomic cputime_atomic; +}; + +struct pacct_struct { + int ac_flag; + long int ac_exitcode; + long unsigned int ac_mem; + u64 ac_utime; + u64 ac_stime; + long unsigned int ac_minflt; + long unsigned int ac_majflt; +}; + +struct core_state; + +struct tty_struct; + +struct autogroup; + +struct taskstats; + +struct tty_audit_buf; + +struct signal_struct { + refcount_t sigcnt; + atomic_t live; + int nr_threads; + struct list_head thread_head; + wait_queue_head_t wait_chldexit; + struct task_struct *curr_target; + struct sigpending shared_pending; + struct hlist_head multiprocess; + int group_exit_code; + int notify_count; + struct task_struct *group_exit_task; + int group_stop_count; + unsigned int flags; + struct core_state *core_state; + unsigned int is_child_subreaper: 1; + unsigned int has_child_subreaper: 1; + int posix_timer_id; + struct list_head posix_timers; + struct hrtimer real_timer; + ktime_t it_real_incr; + struct cpu_itimer it[2]; + struct thread_group_cputimer cputimer; + struct posix_cputimers posix_cputimers; + struct pid *pids[4]; + struct pid *tty_old_pgrp; + int leader; + struct tty_struct *tty; + struct autogroup *autogroup; + seqlock_t stats_lock; + u64 utime; + u64 stime; + u64 cutime; + u64 cstime; + u64 gtime; + u64 cgtime; + struct prev_cputime prev_cputime; + long unsigned int nvcsw; + long unsigned int nivcsw; + long unsigned int cnvcsw; + long unsigned int cnivcsw; + long unsigned int min_flt; + long unsigned int maj_flt; + long unsigned int cmin_flt; + long unsigned int cmaj_flt; + long unsigned int inblock; + long unsigned int oublock; + long unsigned int cinblock; + long unsigned int coublock; + long unsigned int maxrss; + long unsigned int cmaxrss; + struct task_io_accounting ioac; + long long unsigned int sum_sched_runtime; + struct rlimit rlim[16]; + struct pacct_struct pacct; + struct taskstats *stats; + unsigned int audit_tty; + struct tty_audit_buf *tty_audit_buf; + bool oom_flag_origin; + short int oom_score_adj; + short int oom_score_adj_min; + struct mm_struct *oom_mm; + struct mutex cred_guard_mutex; + struct rw_semaphore exec_update_lock; +}; + +struct rseq { + __u32 cpu_id_start; + __u32 cpu_id; + union { + __u64 ptr64; + __u64 ptr; + } rseq_cs; + __u32 flags; + long: 32; + long: 64; +}; + +struct rq; + +struct rq_flags; + +struct sched_class { + int uclamp_enabled; + void (*enqueue_task)(struct rq *, struct task_struct *, int); + void (*dequeue_task)(struct rq *, struct task_struct *, int); + void (*yield_task)(struct rq *); + bool (*yield_to_task)(struct rq *, struct task_struct *); + void (*check_preempt_curr)(struct rq *, struct task_struct *, int); + struct task_struct * (*pick_next_task)(struct rq *); + void (*put_prev_task)(struct rq *, struct task_struct *); + void (*set_next_task)(struct rq *, struct task_struct *, bool); + int (*balance)(struct rq *, struct task_struct *, struct rq_flags *); + int (*select_task_rq)(struct task_struct *, int, int); + struct task_struct * (*pick_task)(struct rq *); + void (*migrate_task_rq)(struct task_struct *, int); + void (*task_woken)(struct rq *, struct task_struct *); + void (*set_cpus_allowed)(struct task_struct *, const struct cpumask *, u32); + void (*rq_online)(struct rq *); + void (*rq_offline)(struct rq *); + struct rq * (*find_lock_rq)(struct task_struct *, struct rq *); + void (*task_tick)(struct rq *, struct task_struct *, int); + void (*task_fork)(struct task_struct *); + void (*task_dead)(struct task_struct *); + void (*switched_from)(struct rq *, struct task_struct *); + void (*switched_to)(struct rq *, struct task_struct *); + void (*prio_changed)(struct rq *, struct task_struct *, int); + unsigned int (*get_rr_interval)(struct rq *, struct task_struct *); + void (*update_curr)(struct rq *); + void (*task_change_group)(struct task_struct *, int); +}; + +typedef struct { + atomic64_t id; + void *sigpage; + refcount_t pinned; + void *vdso; + long unsigned int flags; +} mm_context_t; + +struct xol_area; + +struct uprobes_state { + struct xol_area *xol_area; +}; + +struct linux_binfmt; + +struct kioctx_table; + +struct mmu_notifier_subscriptions; + +struct mm_struct { + struct { + struct vm_area_struct *mmap; + struct rb_root mm_rb; + u64 vmacache_seqnum; + long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + long unsigned int mmap_base; + long unsigned int mmap_legacy_base; + long unsigned int task_size; + long unsigned int highest_vm_end; + pgd_t *pgd; + atomic_t membarrier_state; + atomic_t mm_users; + atomic_t mm_count; + atomic_long_t pgtables_bytes; + int map_count; + spinlock_t page_table_lock; + struct rw_semaphore mmap_lock; + struct list_head mmlist; + long unsigned int hiwater_rss; + long unsigned int hiwater_vm; + long unsigned int total_vm; + long unsigned int locked_vm; + atomic64_t pinned_vm; + long unsigned int data_vm; + long unsigned int exec_vm; + long unsigned int stack_vm; + long unsigned int def_flags; + seqcount_t write_protect_seq; + spinlock_t arg_lock; + long unsigned int start_code; + long unsigned int end_code; + long unsigned int start_data; + long unsigned int end_data; + long unsigned int start_brk; + long unsigned int brk; + long unsigned int start_stack; + long unsigned int arg_start; + long unsigned int arg_end; + long unsigned int env_start; + long unsigned int env_end; + long unsigned int saved_auxv[46]; + struct mm_rss_stat rss_stat; + struct linux_binfmt *binfmt; + mm_context_t context; + long unsigned int flags; + spinlock_t ioctx_lock; + struct kioctx_table *ioctx_table; + struct task_struct *owner; + struct user_namespace *user_ns; + struct file *exe_file; + struct mmu_notifier_subscriptions *notifier_subscriptions; + long unsigned int numa_next_scan; + long unsigned int numa_scan_offset; + int numa_scan_seq; + atomic_t tlb_flush_pending; + struct uprobes_state uprobes_state; + atomic_long_t hugetlb_usage; + struct work_struct async_put_work; + u32 pasid; + }; + long unsigned int cpu_bitmap[0]; +}; + +struct swait_queue_head { + raw_spinlock_t lock; + struct list_head task_list; +}; + +struct completion { + unsigned int done; + struct swait_queue_head wait; +}; + +struct kernel_cap_struct { + __u32 cap[2]; +}; + +typedef struct kernel_cap_struct kernel_cap_t; + +struct user_struct; + +struct group_info; + +struct cred { + atomic_t usage; + kuid_t uid; + kgid_t gid; + kuid_t suid; + kgid_t sgid; + kuid_t euid; + kgid_t egid; + kuid_t fsuid; + kgid_t fsgid; + unsigned int securebits; + kernel_cap_t cap_inheritable; + kernel_cap_t cap_permitted; + kernel_cap_t cap_effective; + kernel_cap_t cap_bset; + kernel_cap_t cap_ambient; + unsigned char jit_keyring; + struct key *session_keyring; + struct key *process_keyring; + struct key *thread_keyring; + struct key *request_key_auth; + void *security; + struct user_struct *user; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct group_info *group_info; + union { + int non_rcu; + struct callback_head rcu; + }; +}; + +typedef int32_t key_serial_t; + +typedef uint32_t key_perm_t; + +struct key_type; + +struct key_tag; + +struct keyring_index_key { + long unsigned int hash; + union { + struct { + u16 desc_len; + char desc[6]; + }; + long unsigned int x; + }; + struct key_type *type; + struct key_tag *domain_tag; + const char *description; +}; + +union key_payload { + void *rcu_data0; + void *data[4]; +}; + +struct assoc_array_ptr; + +struct assoc_array { + struct assoc_array_ptr *root; + long unsigned int nr_leaves_on_tree; +}; + +struct watch_list; + +struct key_user; + +struct key_restriction; + +struct key { + refcount_t usage; + key_serial_t serial; + union { + struct list_head graveyard_link; + struct rb_node serial_node; + }; + struct watch_list *watchers; + struct rw_semaphore sem; + struct key_user *user; + void *security; + union { + time64_t expiry; + time64_t revoked_at; + }; + time64_t last_used_at; + kuid_t uid; + kgid_t gid; + key_perm_t perm; + short unsigned int quotalen; + short unsigned int datalen; + short int state; + long unsigned int flags; + union { + struct keyring_index_key index_key; + struct { + long unsigned int hash; + long unsigned int len_desc; + struct key_type *type; + struct key_tag *domain_tag; + char *description; + }; + }; + union { + union key_payload payload; + struct { + struct list_head name_link; + struct assoc_array keys; + }; + }; + struct key_restriction *restrict_link; +}; + +struct uts_namespace; + +struct ipc_namespace; + +struct mnt_namespace; + +struct net; + +struct time_namespace; + +struct cgroup_namespace; + +struct nsproxy { + atomic_t count; + struct uts_namespace *uts_ns; + struct ipc_namespace *ipc_ns; + struct mnt_namespace *mnt_ns; + struct pid_namespace *pid_ns_for_children; + struct net *net_ns; + struct time_namespace *time_ns; + struct time_namespace *time_ns_for_children; + struct cgroup_namespace *cgroup_ns; +}; + +struct sighand_struct { + spinlock_t siglock; + refcount_t count; + wait_queue_head_t signalfd_wqh; + struct k_sigaction action[64]; +}; + +struct bio; + +struct bio_list { + struct bio *head; + struct bio *tail; +}; + +struct request; + +struct blk_plug { + struct request *mq_list; + struct request *cached_rq; + short unsigned int nr_ios; + short unsigned int rq_count; + bool multiple_queues; + bool has_elevator; + bool nowait; + struct list_head cb_list; +}; + +struct reclaim_state { + long unsigned int reclaimed_slab; +}; + +struct percpu_counter { + raw_spinlock_t lock; + s64 count; + struct list_head list; + s32 *counters; +}; + +struct fprop_local_percpu { + struct percpu_counter events; + unsigned int period; + raw_spinlock_t lock; +}; + +enum wb_reason { + WB_REASON_BACKGROUND = 0, + WB_REASON_VMSCAN = 1, + WB_REASON_SYNC = 2, + WB_REASON_PERIODIC = 3, + WB_REASON_LAPTOP_TIMER = 4, + WB_REASON_FS_FREE_SPACE = 5, + WB_REASON_FORKER_THREAD = 6, + WB_REASON_FOREIGN_FLUSH = 7, + WB_REASON_MAX = 8, +}; + +struct percpu_ref_data; + +struct percpu_ref { + long unsigned int percpu_count_ptr; + struct percpu_ref_data *data; +}; + +struct cgroup_subsys_state; + +struct bdi_writeback { + struct backing_dev_info *bdi; + long unsigned int state; + long unsigned int last_old_flush; + struct list_head b_dirty; + struct list_head b_io; + struct list_head b_more_io; + struct list_head b_dirty_time; + spinlock_t list_lock; + atomic_t writeback_inodes; + struct percpu_counter stat[4]; + long unsigned int congested; + long unsigned int bw_time_stamp; + long unsigned int dirtied_stamp; + long unsigned int written_stamp; + long unsigned int write_bandwidth; + long unsigned int avg_write_bandwidth; + long unsigned int dirty_ratelimit; + long unsigned int balanced_dirty_ratelimit; + struct fprop_local_percpu completions; + int dirty_exceeded; + enum wb_reason start_all_reason; + spinlock_t work_lock; + struct list_head work_list; + struct delayed_work dwork; + struct delayed_work bw_dwork; + long unsigned int dirty_sleep; + struct list_head bdi_node; + struct percpu_ref refcnt; + struct fprop_local_percpu memcg_completions; + struct cgroup_subsys_state *memcg_css; + struct cgroup_subsys_state *blkcg_css; + struct list_head memcg_node; + struct list_head blkcg_node; + struct list_head b_attached; + struct list_head offline_node; + union { + struct work_struct release_work; + struct callback_head rcu; + }; +}; + +struct device; + +struct backing_dev_info { + u64 id; + struct rb_node rb_node; + struct list_head bdi_list; + long unsigned int ra_pages; + long unsigned int io_pages; + struct kref refcnt; + unsigned int capabilities; + unsigned int min_ratio; + unsigned int max_ratio; + unsigned int max_prop_frac; + atomic_long_t tot_write_bandwidth; + struct bdi_writeback wb; + struct list_head wb_list; + struct xarray cgwb_tree; + struct mutex cgwb_release_mutex; + struct rw_semaphore wb_switch_rwsem; + wait_queue_head_t wb_waitq; + struct device *dev; + char dev_name[64]; + struct device *owner; + struct timer_list laptop_mode_wb_timer; + struct dentry *debug_dir; +}; + +struct io_cq; + +struct io_context { + atomic_long_t refcount; + atomic_t active_ref; + atomic_t nr_tasks; + spinlock_t lock; + short unsigned int ioprio; + struct xarray icq_tree; + struct io_cq *icq_hint; + struct hlist_head icq_list; + struct work_struct release_work; +}; + +struct cgroup; + +struct css_set { + struct cgroup_subsys_state *subsys[14]; + refcount_t refcount; + struct css_set *dom_cset; + struct cgroup *dfl_cgrp; + int nr_tasks; + struct list_head tasks; + struct list_head mg_tasks; + struct list_head dying_tasks; + struct list_head task_iters; + struct list_head e_cset_node[14]; + struct list_head threaded_csets; + struct list_head threaded_csets_node; + struct hlist_node hlist; + struct list_head cgrp_links; + struct list_head mg_preload_node; + struct list_head mg_node; + struct cgroup *mg_src_cgrp; + struct cgroup *mg_dst_cgrp; + struct css_set *mg_dst_cset; + bool dead; + struct callback_head callback_head; +}; + +struct compat_robust_list { + compat_uptr_t next; +}; + +struct compat_robust_list_head { + struct compat_robust_list list; + compat_long_t futex_offset; + compat_uptr_t list_op_pending; +}; + +struct perf_event_groups { + struct rb_root tree; + u64 index; +}; + +struct perf_event_context { + struct pmu *pmu; + raw_spinlock_t lock; + struct mutex mutex; + struct list_head active_ctx_list; + struct perf_event_groups pinned_groups; + struct perf_event_groups flexible_groups; + struct list_head event_list; + struct list_head pinned_active; + struct list_head flexible_active; + int nr_events; + int nr_active; + int is_active; + int nr_stat; + int nr_freq; + int rotate_disable; + int rotate_necessary; + refcount_t refcount; + struct task_struct *task; + u64 time; + u64 timestamp; + struct perf_event_context *parent_ctx; + u64 parent_gen; + u64 generation; + int pin_count; + int nr_cgroups; + void *task_ctx_data; + struct callback_head callback_head; +}; + +struct mempolicy { + atomic_t refcnt; + short unsigned int mode; + short unsigned int flags; + nodemask_t nodes; + union { + nodemask_t cpuset_mems_allowed; + nodemask_t user_nodemask; + } w; +}; + +struct task_delay_info { + raw_spinlock_t lock; + unsigned int flags; + u64 blkio_start; + u64 blkio_delay; + u64 swapin_delay; + u32 blkio_count; + u32 swapin_count; + u64 freepages_start; + u64 freepages_delay; + u64 thrashing_start; + u64 thrashing_delay; + u32 freepages_count; + u32 thrashing_count; +}; + +struct ftrace_ret_stack { + long unsigned int ret; + long unsigned int func; + long long unsigned int calltime; + long long unsigned int subtime; + long unsigned int fp; + long unsigned int *retp; +}; + +struct cgroup_subsys; + +struct cgroup_subsys_state { + struct cgroup *cgroup; + struct cgroup_subsys *ss; + struct percpu_ref refcnt; + struct list_head sibling; + struct list_head children; + struct list_head rstat_css_node; + int id; + unsigned int flags; + u64 serial_nr; + atomic_t online_cnt; + struct work_struct destroy_work; + struct rcu_work destroy_rwork; + struct cgroup_subsys_state *parent; +}; + +struct mem_cgroup_id { + int id; + refcount_t ref; +}; + +struct page_counter { + atomic_long_t usage; + long unsigned int min; + long unsigned int low; + long unsigned int high; + long unsigned int max; + long unsigned int emin; + atomic_long_t min_usage; + atomic_long_t children_min_usage; + long unsigned int elow; + atomic_long_t low_usage; + atomic_long_t children_low_usage; + long unsigned int watermark; + long unsigned int failcnt; + struct page_counter *parent; +}; + +struct vmpressure { + long unsigned int scanned; + long unsigned int reclaimed; + long unsigned int tree_scanned; + long unsigned int tree_reclaimed; + spinlock_t sr_lock; + struct list_head events; + struct mutex events_lock; + struct work_struct work; +}; + +struct cgroup_file { + struct kernfs_node *kn; + long unsigned int notified_at; + struct timer_list notify_timer; +}; + +struct mem_cgroup_threshold_ary; + +struct mem_cgroup_thresholds { + struct mem_cgroup_threshold_ary *primary; + struct mem_cgroup_threshold_ary *spare; +}; + +struct memcg_padding { + char x[0]; +}; + +struct memcg_vmstats { + long int state[43]; + long unsigned int events[99]; + long int state_pending[43]; + long unsigned int events_pending[99]; +}; + +struct fprop_global { + struct percpu_counter events; + unsigned int period; + seqcount_t sequence; +}; + +struct wb_domain { + spinlock_t lock; + struct fprop_global completions; + struct timer_list period_timer; + long unsigned int period_time; + long unsigned int dirty_limit_tstamp; + long unsigned int dirty_limit; +}; + +struct wb_completion { + atomic_t cnt; + wait_queue_head_t *waitq; +}; + +struct memcg_cgwb_frn { + u64 bdi_id; + int memcg_id; + u64 at; + struct wb_completion done; +}; + +struct deferred_split { + spinlock_t split_queue_lock; + struct list_head split_queue; + long unsigned int split_queue_len; +}; + +struct obj_cgroup; + +struct memcg_vmstats_percpu; + +struct mem_cgroup_per_node; + +struct mem_cgroup { + struct cgroup_subsys_state css; + struct mem_cgroup_id id; + struct page_counter memory; + union { + struct page_counter swap; + struct page_counter memsw; + }; + struct page_counter kmem; + struct page_counter tcpmem; + struct work_struct high_work; + long unsigned int soft_limit; + struct vmpressure vmpressure; + bool oom_group; + bool oom_lock; + int under_oom; + int swappiness; + int oom_kill_disable; + struct cgroup_file events_file; + struct cgroup_file events_local_file; + struct cgroup_file swap_events_file; + struct mutex thresholds_lock; + struct mem_cgroup_thresholds thresholds; + struct mem_cgroup_thresholds memsw_thresholds; + struct list_head oom_notify; + long unsigned int move_charge_at_immigrate; + spinlock_t move_lock; + long unsigned int move_lock_flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct memcg_padding _pad1_; + struct memcg_vmstats vmstats; + atomic_long_t memory_events[8]; + atomic_long_t memory_events_local[8]; + long unsigned int socket_pressure; + bool tcpmem_active; + int tcpmem_pressure; + int kmemcg_id; + struct obj_cgroup *objcg; + struct list_head objcg_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct memcg_padding _pad2_; + atomic_t moving_account; + struct task_struct *move_lock_task; + struct memcg_vmstats_percpu *vmstats_percpu; + struct list_head cgwb_list; + struct wb_domain cgwb_domain; + struct memcg_cgwb_frn cgwb_frn[4]; + struct list_head event_list; + spinlock_t event_list_lock; + struct deferred_split deferred_split_queue; + struct mem_cgroup_per_node *nodeinfo[0]; + long: 64; +}; + +struct blk_integrity_profile; + +struct blk_integrity { + const struct blk_integrity_profile *profile; + unsigned char flags; + unsigned char tuple_size; + unsigned char interval_exp; + unsigned char tag_size; +}; + +enum rpm_status { + RPM_ACTIVE = 0, + RPM_RESUMING = 1, + RPM_SUSPENDED = 2, + RPM_SUSPENDING = 3, +}; + +struct blk_rq_stat { + u64 mean; + u64 min; + u64 max; + u32 nr_samples; + u64 batch; +}; + +enum blk_bounce { + BLK_BOUNCE_NONE = 0, + BLK_BOUNCE_HIGH = 1, +}; + +enum blk_zoned_model { + BLK_ZONED_NONE = 0, + BLK_ZONED_HA = 1, + BLK_ZONED_HM = 2, +}; + +struct queue_limits { + enum blk_bounce bounce; + long unsigned int seg_boundary_mask; + long unsigned int virt_boundary_mask; + unsigned int max_hw_sectors; + unsigned int max_dev_sectors; + unsigned int chunk_sectors; + unsigned int max_sectors; + unsigned int max_segment_size; + unsigned int physical_block_size; + unsigned int logical_block_size; + unsigned int alignment_offset; + unsigned int io_min; + unsigned int io_opt; + unsigned int max_discard_sectors; + unsigned int max_hw_discard_sectors; + unsigned int max_write_same_sectors; + unsigned int max_write_zeroes_sectors; + unsigned int max_zone_append_sectors; + unsigned int discard_granularity; + unsigned int discard_alignment; + unsigned int zone_write_granularity; + short unsigned int max_segments; + short unsigned int max_integrity_segments; + short unsigned int max_discard_segments; + unsigned char misaligned; + unsigned char discard_misaligned; + unsigned char raid_partial_stripes_expensive; + enum blk_zoned_model zoned; +}; + +typedef void *mempool_alloc_t(gfp_t, void *); + +typedef void mempool_free_t(void *, void *); + +struct mempool_s { + spinlock_t lock; + int min_nr; + int curr_nr; + void **elements; + void *pool_data; + mempool_alloc_t *alloc; + mempool_free_t *free; + wait_queue_head_t wait; +}; + +typedef struct mempool_s mempool_t; + +struct bio_alloc_cache; + +struct bio_set { + struct kmem_cache *bio_slab; + unsigned int front_pad; + struct bio_alloc_cache *cache; + mempool_t bio_pool; + mempool_t bvec_pool; + mempool_t bio_integrity_pool; + mempool_t bvec_integrity_pool; + unsigned int back_pad; + spinlock_t rescue_lock; + struct bio_list rescue_list; + struct work_struct rescue_work; + struct workqueue_struct *rescue_workqueue; + struct hlist_node cpuhp_dead; +}; + +struct elevator_queue; + +struct blk_queue_stats; + +struct rq_qos; + +struct blk_mq_ops; + +struct blk_mq_ctx; + +struct blk_mq_hw_ctx; + +struct gendisk; + +struct blk_crypto_profile; + +struct blk_stat_callback; + +struct blk_mq_tags; + +struct blkcg_gq; + +struct blk_trace; + +struct blk_flush_queue; + +struct throtl_data; + +struct blk_mq_tag_set; + +struct blk_independent_access_ranges; + +struct request_queue { + struct request *last_merge; + struct elevator_queue *elevator; + struct percpu_ref q_usage_counter; + struct blk_queue_stats *stats; + struct rq_qos *rq_qos; + const struct blk_mq_ops *mq_ops; + struct blk_mq_ctx *queue_ctx; + unsigned int queue_depth; + struct blk_mq_hw_ctx **queue_hw_ctx; + unsigned int nr_hw_queues; + void *queuedata; + long unsigned int queue_flags; + atomic_t pm_only; + int id; + spinlock_t queue_lock; + struct gendisk *disk; + struct kobject kobj; + struct kobject *mq_kobj; + struct blk_integrity integrity; + struct device *dev; + enum rpm_status rpm_status; + long unsigned int nr_requests; + unsigned int dma_pad_mask; + unsigned int dma_alignment; + struct blk_crypto_profile *crypto_profile; + unsigned int rq_timeout; + int poll_nsec; + struct blk_stat_callback *poll_cb; + struct blk_rq_stat poll_stat[16]; + struct timer_list timeout; + struct work_struct timeout_work; + atomic_t nr_active_requests_shared_tags; + struct blk_mq_tags *sched_shared_tags; + struct list_head icq_list; + long unsigned int blkcg_pols[1]; + struct blkcg_gq *root_blkg; + struct list_head blkg_list; + struct queue_limits limits; + unsigned int required_elevator_features; + unsigned int nr_zones; + long unsigned int *conv_zones_bitmap; + long unsigned int *seq_zones_wlock; + unsigned int max_open_zones; + unsigned int max_active_zones; + int node; + struct mutex debugfs_mutex; + struct blk_trace *blk_trace; + struct blk_flush_queue *fq; + struct list_head requeue_list; + spinlock_t requeue_lock; + struct delayed_work requeue_work; + struct mutex sysfs_lock; + struct mutex sysfs_dir_lock; + struct list_head unused_hctx_list; + spinlock_t unused_hctx_lock; + int mq_freeze_depth; + struct throtl_data *td; + struct callback_head callback_head; + wait_queue_head_t mq_freeze_wq; + struct mutex mq_freeze_lock; + int quiesce_depth; + struct blk_mq_tag_set *tag_set; + struct list_head tag_set_list; + struct bio_set bio_split; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct dentry *rqos_debugfs_dir; + bool mq_sysfs_init_done; + u64 write_hints[5]; + struct blk_independent_access_ranges *ia_ranges; +}; + +enum uprobe_task_state { + UTASK_RUNNING = 0, + UTASK_SSTEP = 1, + UTASK_SSTEP_ACK = 2, + UTASK_SSTEP_TRAPPED = 3, +}; + +struct arch_uprobe_task {}; + +struct uprobe; + +struct return_instance; + +struct uprobe_task { + enum uprobe_task_state state; + union { + struct { + struct arch_uprobe_task autask; + long unsigned int vaddr; + }; + struct { + struct callback_head dup_xol_work; + long unsigned int dup_xol_addr; + }; + }; + struct uprobe *active_uprobe; + long unsigned int xol_vaddr; + struct return_instance *return_instances; + unsigned int depth; +}; + +struct vm_struct { + struct vm_struct *next; + void *addr; + long unsigned int size; + long unsigned int flags; + struct page **pages; + unsigned int nr_pages; + phys_addr_t phys_addr; + const void *caller; +}; + +struct bpf_run_ctx {}; + +struct kstat { + u32 result_mask; + umode_t mode; + unsigned int nlink; + uint32_t blksize; + u64 attributes; + u64 attributes_mask; + u64 ino; + dev_t dev; + dev_t rdev; + kuid_t uid; + kgid_t gid; + loff_t size; + struct timespec64 atime; + struct timespec64 mtime; + struct timespec64 ctime; + struct timespec64 btime; + u64 blocks; + u64 mnt_id; +}; + +struct return_instance { + struct uprobe *uprobe; + long unsigned int func; + long unsigned int stack; + long unsigned int orig_ret_vaddr; + bool chained; + struct return_instance *next; +}; + +typedef u32 errseq_t; + +struct address_space_operations; + +struct address_space { + struct inode *host; + struct xarray i_pages; + struct rw_semaphore invalidate_lock; + gfp_t gfp_mask; + atomic_t i_mmap_writable; + struct rb_root_cached i_mmap; + struct rw_semaphore i_mmap_rwsem; + long unsigned int nrpages; + long unsigned int writeback_index; + const struct address_space_operations *a_ops; + long unsigned int flags; + errseq_t wb_err; + spinlock_t private_lock; + struct list_head private_list; + void *private_data; +}; + +struct vmem_altmap { + long unsigned int base_pfn; + const long unsigned int end_pfn; + const long unsigned int reserve; + long unsigned int free; + long unsigned int align; + long unsigned int alloc; +}; + +enum memory_type { + MEMORY_DEVICE_PRIVATE = 1, + MEMORY_DEVICE_FS_DAX = 2, + MEMORY_DEVICE_GENERIC = 3, + MEMORY_DEVICE_PCI_P2PDMA = 4, +}; + +struct range { + u64 start; + u64 end; +}; + +struct dev_pagemap_ops; + +struct dev_pagemap { + struct vmem_altmap altmap; + struct percpu_ref *ref; + struct percpu_ref internal_ref; + struct completion done; + enum memory_type type; + unsigned int flags; + const struct dev_pagemap_ops *ops; + void *owner; + int nr_range; + union { + struct range range; + struct range ranges[0]; + }; +}; + +struct folio { + union { + struct { + long unsigned int flags; + struct list_head lru; + struct address_space *mapping; + long unsigned int index; + void *private; + atomic_t _mapcount; + atomic_t _refcount; + long unsigned int memcg_data; + }; + struct page page; + }; +}; + +struct vfsmount; + +struct path { + struct vfsmount *mnt; + struct dentry *dentry; +}; + +enum rw_hint { + WRITE_LIFE_NOT_SET = 0, + WRITE_LIFE_NONE = 1, + WRITE_LIFE_SHORT = 2, + WRITE_LIFE_MEDIUM = 3, + WRITE_LIFE_LONG = 4, + WRITE_LIFE_EXTREME = 5, +}; + +struct fown_struct { + rwlock_t lock; + struct pid *pid; + enum pid_type pid_type; + kuid_t uid; + kuid_t euid; + int signum; +}; + +struct file_ra_state { + long unsigned int start; + unsigned int size; + unsigned int async_size; + unsigned int ra_pages; + unsigned int mmap_miss; + loff_t prev_pos; +}; + +struct file { + union { + struct llist_node fu_llist; + struct callback_head fu_rcuhead; + } f_u; + struct path f_path; + struct inode *f_inode; + const struct file_operations *f_op; + spinlock_t f_lock; + enum rw_hint f_write_hint; + atomic_long_t f_count; + unsigned int f_flags; + fmode_t f_mode; + struct mutex f_pos_lock; + loff_t f_pos; + struct fown_struct f_owner; + const struct cred *f_cred; + struct file_ra_state f_ra; + u64 f_version; + void *f_security; + void *private_data; + struct hlist_head *f_ep; + struct address_space *f_mapping; + errseq_t f_wb_err; + errseq_t f_sb_err; +}; + +struct anon_vma { + struct anon_vma *root; + struct rw_semaphore rwsem; + atomic_t refcount; + unsigned int degree; + struct anon_vma *parent; + struct rb_root_cached rb_root; +}; + +typedef unsigned int vm_fault_t; + +enum page_entry_size { + PE_SIZE_PTE = 0, + PE_SIZE_PMD = 1, + PE_SIZE_PUD = 2, +}; + +struct vm_fault; + +struct vm_operations_struct { + void (*open)(struct vm_area_struct *); + void (*close)(struct vm_area_struct *); + int (*may_split)(struct vm_area_struct *, long unsigned int); + int (*mremap)(struct vm_area_struct *); + int (*mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int, long unsigned int); + vm_fault_t (*fault)(struct vm_fault *); + vm_fault_t (*huge_fault)(struct vm_fault *, enum page_entry_size); + vm_fault_t (*map_pages)(struct vm_fault *, long unsigned int, long unsigned int); + long unsigned int (*pagesize)(struct vm_area_struct *); + vm_fault_t (*page_mkwrite)(struct vm_fault *); + vm_fault_t (*pfn_mkwrite)(struct vm_fault *); + int (*access)(struct vm_area_struct *, long unsigned int, void *, int, int); + const char * (*name)(struct vm_area_struct *); + int (*set_policy)(struct vm_area_struct *, struct mempolicy *); + struct mempolicy * (*get_policy)(struct vm_area_struct *, long unsigned int); + struct page * (*find_special_page)(struct vm_area_struct *, long unsigned int); +}; + +struct linux_binprm; + +struct coredump_params; + +struct linux_binfmt { + struct list_head lh; + struct module *module; + int (*load_binary)(struct linux_binprm *); + int (*load_shlib)(struct file *); + int (*core_dump)(struct coredump_params *); + long unsigned int min_coredump; +}; + +enum fault_flag { + FAULT_FLAG_WRITE = 1, + FAULT_FLAG_MKWRITE = 2, + FAULT_FLAG_ALLOW_RETRY = 4, + FAULT_FLAG_RETRY_NOWAIT = 8, + FAULT_FLAG_KILLABLE = 16, + FAULT_FLAG_TRIED = 32, + FAULT_FLAG_USER = 64, + FAULT_FLAG_REMOTE = 128, + FAULT_FLAG_INSTRUCTION = 256, + FAULT_FLAG_INTERRUPTIBLE = 512, +}; + +struct vm_fault { + const struct { + struct vm_area_struct *vma; + gfp_t gfp_mask; + long unsigned int pgoff; + long unsigned int address; + }; + enum fault_flag flags; + pmd_t *pmd; + pud_t *pud; + union { + pte_t orig_pte; + pmd_t orig_pmd; + }; + struct page *cow_page; + struct page *page; + pte_t *pte; + spinlock_t *ptl; + pgtable_t prealloc_pte; +}; + +struct free_area { + struct list_head free_list[6]; + long unsigned int nr_free; +}; + +struct zone_padding { + char x[0]; +}; + +enum node_stat_item { + NR_LRU_BASE = 0, + NR_INACTIVE_ANON = 0, + NR_ACTIVE_ANON = 1, + NR_INACTIVE_FILE = 2, + NR_ACTIVE_FILE = 3, + NR_UNEVICTABLE = 4, + NR_SLAB_RECLAIMABLE_B = 5, + NR_SLAB_UNRECLAIMABLE_B = 6, + NR_ISOLATED_ANON = 7, + NR_ISOLATED_FILE = 8, + WORKINGSET_NODES = 9, + WORKINGSET_REFAULT_BASE = 10, + WORKINGSET_REFAULT_ANON = 10, + WORKINGSET_REFAULT_FILE = 11, + WORKINGSET_ACTIVATE_BASE = 12, + WORKINGSET_ACTIVATE_ANON = 12, + WORKINGSET_ACTIVATE_FILE = 13, + WORKINGSET_RESTORE_BASE = 14, + WORKINGSET_RESTORE_ANON = 14, + WORKINGSET_RESTORE_FILE = 15, + WORKINGSET_NODERECLAIM = 16, + NR_ANON_MAPPED = 17, + NR_FILE_MAPPED = 18, + NR_FILE_PAGES = 19, + NR_FILE_DIRTY = 20, + NR_WRITEBACK = 21, + NR_WRITEBACK_TEMP = 22, + NR_SHMEM = 23, + NR_SHMEM_THPS = 24, + NR_SHMEM_PMDMAPPED = 25, + NR_FILE_THPS = 26, + NR_FILE_PMDMAPPED = 27, + NR_ANON_THPS = 28, + NR_VMSCAN_WRITE = 29, + NR_VMSCAN_IMMEDIATE = 30, + NR_DIRTIED = 31, + NR_WRITTEN = 32, + NR_THROTTLED_WRITTEN = 33, + NR_KERNEL_MISC_RECLAIMABLE = 34, + NR_FOLL_PIN_ACQUIRED = 35, + NR_FOLL_PIN_RELEASED = 36, + NR_KERNEL_STACK_KB = 37, + NR_PAGETABLE = 38, + NR_SWAPCACHE = 39, + NR_VM_NODE_STAT_ITEMS = 40, +}; + +enum lru_list { + LRU_INACTIVE_ANON = 0, + LRU_ACTIVE_ANON = 1, + LRU_INACTIVE_FILE = 2, + LRU_ACTIVE_FILE = 3, + LRU_UNEVICTABLE = 4, + NR_LRU_LISTS = 5, +}; + +struct pglist_data; + +struct lruvec { + struct list_head lists[5]; + spinlock_t lru_lock; + long unsigned int anon_cost; + long unsigned int file_cost; + atomic_long_t nonresident_age; + long unsigned int refaults[2]; + long unsigned int flags; + struct pglist_data *pgdat; +}; + +struct per_cpu_pages; + +struct per_cpu_zonestat; + +struct zone { + long unsigned int _watermark[3]; + long unsigned int watermark_boost; + long unsigned int nr_reserved_highatomic; + long int lowmem_reserve[5]; + int node; + struct pglist_data *zone_pgdat; + struct per_cpu_pages *per_cpu_pageset; + struct per_cpu_zonestat *per_cpu_zonestats; + int pageset_high; + int pageset_batch; + long unsigned int zone_start_pfn; + atomic_long_t managed_pages; + long unsigned int spanned_pages; + long unsigned int present_pages; + long unsigned int present_early_pages; + long unsigned int cma_pages; + const char *name; + long unsigned int nr_isolate_pageblock; + seqlock_t span_seqlock; + int initialized; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct zone_padding _pad1_; + struct free_area free_area[11]; + long unsigned int flags; + spinlock_t lock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct zone_padding _pad2_; + long unsigned int percpu_drift_mark; + long unsigned int compact_cached_free_pfn; + long unsigned int compact_cached_migrate_pfn[2]; + long unsigned int compact_init_migrate_pfn; + long unsigned int compact_init_free_pfn; + unsigned int compact_considered; + unsigned int compact_defer_shift; + int compact_order_failed; + bool compact_blockskip_flush; + bool contiguous; + short: 16; + struct zone_padding _pad3_; + atomic_long_t vm_stat[11]; + atomic_long_t vm_numa_event[6]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct zoneref { + struct zone *zone; + int zone_idx; +}; + +struct zonelist { + struct zoneref _zonerefs[321]; +}; + +enum zone_type { + ZONE_DMA = 0, + ZONE_DMA32 = 1, + ZONE_NORMAL = 2, + ZONE_MOVABLE = 3, + ZONE_DEVICE = 4, + __MAX_NR_ZONES = 5, +}; + +struct per_cpu_nodestat; + +struct pglist_data { + struct zone node_zones[5]; + struct zonelist node_zonelists[2]; + int nr_zones; + spinlock_t node_size_lock; + long unsigned int node_start_pfn; + long unsigned int node_present_pages; + long unsigned int node_spanned_pages; + int node_id; + wait_queue_head_t kswapd_wait; + wait_queue_head_t pfmemalloc_wait; + wait_queue_head_t reclaim_wait[4]; + atomic_t nr_writeback_throttled; + long unsigned int nr_reclaim_start; + struct task_struct *kswapd; + int kswapd_order; + enum zone_type kswapd_highest_zoneidx; + int kswapd_failures; + int kcompactd_max_order; + enum zone_type kcompactd_highest_zoneidx; + wait_queue_head_t kcompactd_wait; + struct task_struct *kcompactd; + bool proactive_compact_trigger; + long unsigned int totalreserve_pages; + long unsigned int min_unmapped_pages; + long unsigned int min_slab_pages; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct zone_padding _pad1_; + struct deferred_split deferred_split_queue; + struct lruvec __lruvec; + long unsigned int flags; + long: 64; + struct zone_padding _pad2_; + struct per_cpu_nodestat *per_cpu_nodestats; + atomic_long_t vm_stat[40]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef unsigned int isolate_mode_t; + +struct per_cpu_pages { + int count; + int high; + int batch; + short int free_factor; + short int expire; + struct list_head lists[15]; +}; + +struct per_cpu_zonestat { + s8 vm_stat_diff[11]; + s8 stat_threshold; + long unsigned int vm_numa_event[6]; +}; + +struct per_cpu_nodestat { + s8 stat_threshold; + s8 vm_node_stat_diff[40]; +}; + +typedef struct pglist_data pg_data_t; + +struct rcu_segcblist { + struct callback_head *head; + struct callback_head **tails[4]; + long unsigned int gp_seq[4]; + long int len; + long int seglen[4]; + u8 flags; +}; + +struct srcu_node; + +struct srcu_data { + long unsigned int srcu_lock_count[2]; + long unsigned int srcu_unlock_count[2]; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t lock; + struct rcu_segcblist srcu_cblist; + long unsigned int srcu_gp_seq_needed; + long unsigned int srcu_gp_seq_needed_exp; + bool srcu_cblist_invoking; + struct timer_list delay_work; + struct work_struct work; + struct callback_head srcu_barrier_head; + struct srcu_node *mynode; + long unsigned int grpmask; + int cpu; + struct srcu_struct *ssp; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct srcu_node { + spinlock_t lock; + long unsigned int srcu_have_cbs[4]; + long unsigned int srcu_data_have_cbs[4]; + long unsigned int srcu_gp_seq_needed_exp; + struct srcu_node *srcu_parent; + int grplo; + int grphi; +}; + +struct srcu_struct { + struct srcu_node node[17]; + struct srcu_node *level[3]; + struct mutex srcu_cb_mutex; + spinlock_t lock; + struct mutex srcu_gp_mutex; + unsigned int srcu_idx; + long unsigned int srcu_gp_seq; + long unsigned int srcu_gp_seq_needed; + long unsigned int srcu_gp_seq_needed_exp; + long unsigned int srcu_last_gp_end; + struct srcu_data *sda; + long unsigned int srcu_barrier_seq; + struct mutex srcu_barrier_mutex; + struct completion srcu_barrier_completion; + atomic_t srcu_barrier_cpu_cnt; + struct delayed_work work; + struct lockdep_map dep_map; +}; + +typedef int proc_handler(struct ctl_table *, int, void *, size_t *, loff_t *); + +struct ctl_table_poll; + +struct ctl_table { + const char *procname; + void *data; + int maxlen; + umode_t mode; + struct ctl_table *child; + proc_handler *proc_handler; + struct ctl_table_poll *poll; + void *extra1; + void *extra2; +}; + +struct ctl_table_poll { + atomic_t event; + wait_queue_head_t wait; +}; + +struct ctl_node { + struct rb_node node; + struct ctl_table_header *header; +}; + +struct ctl_table_root { + struct ctl_table_set default_set; + struct ctl_table_set * (*lookup)(struct ctl_table_root *); + void (*set_ownership)(struct ctl_table_header *, struct ctl_table *, kuid_t *, kgid_t *); + int (*permissions)(struct ctl_table_header *, struct ctl_table *); +}; + +typedef __u64 Elf64_Addr; + +typedef __u16 Elf64_Half; + +typedef __u32 Elf64_Word; + +typedef __u64 Elf64_Xword; + +struct elf64_sym { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Half st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +}; + +struct hlist_bl_node; + +struct hlist_bl_head { + struct hlist_bl_node *first; +}; + +struct hlist_bl_node { + struct hlist_bl_node *next; + struct hlist_bl_node **pprev; +}; + +struct lockref { + union { + __u64 lock_count; + struct { + spinlock_t lock; + int count; + }; + }; +}; + +struct qstr { + union { + struct { + u32 hash; + u32 len; + }; + u64 hash_len; + }; + const unsigned char *name; +}; + +struct dentry_operations; + +struct dentry { + unsigned int d_flags; + seqcount_spinlock_t d_seq; + struct hlist_bl_node d_hash; + struct dentry *d_parent; + struct qstr d_name; + struct inode *d_inode; + unsigned char d_iname[32]; + struct lockref d_lockref; + const struct dentry_operations *d_op; + struct super_block *d_sb; + long unsigned int d_time; + void *d_fsdata; + union { + struct list_head d_lru; + wait_queue_head_t *d_wait; + }; + struct list_head d_child; + struct list_head d_subdirs; + union { + struct hlist_node d_alias; + struct hlist_bl_node d_in_lookup_hash; + struct callback_head d_rcu; + } d_u; +}; + +struct posix_acl; + +struct inode_operations; + +struct file_lock_context; + +struct cdev; + +struct fsnotify_mark_connector; + +struct fscrypt_info; + +struct fsverity_info; + +struct inode { + umode_t i_mode; + short unsigned int i_opflags; + kuid_t i_uid; + kgid_t i_gid; + unsigned int i_flags; + struct posix_acl *i_acl; + struct posix_acl *i_default_acl; + const struct inode_operations *i_op; + struct super_block *i_sb; + struct address_space *i_mapping; + void *i_security; + long unsigned int i_ino; + union { + const unsigned int i_nlink; + unsigned int __i_nlink; + }; + dev_t i_rdev; + loff_t i_size; + struct timespec64 i_atime; + struct timespec64 i_mtime; + struct timespec64 i_ctime; + spinlock_t i_lock; + short unsigned int i_bytes; + u8 i_blkbits; + u8 i_write_hint; + blkcnt_t i_blocks; + long unsigned int i_state; + struct rw_semaphore i_rwsem; + long unsigned int dirtied_when; + long unsigned int dirtied_time_when; + struct hlist_node i_hash; + struct list_head i_io_list; + struct bdi_writeback *i_wb; + int i_wb_frn_winner; + u16 i_wb_frn_avg_time; + u16 i_wb_frn_history; + struct list_head i_lru; + struct list_head i_sb_list; + struct list_head i_wb_list; + union { + struct hlist_head i_dentry; + struct callback_head i_rcu; + }; + atomic64_t i_version; + atomic64_t i_sequence; + atomic_t i_count; + atomic_t i_dio_count; + atomic_t i_writecount; + atomic_t i_readcount; + union { + const struct file_operations *i_fop; + void (*free_inode)(struct inode *); + }; + struct file_lock_context *i_flctx; + struct address_space i_data; + struct list_head i_devices; + union { + struct pipe_inode_info *i_pipe; + struct cdev *i_cdev; + char *i_link; + unsigned int i_dir_seq; + }; + __u32 i_generation; + __u32 i_fsnotify_mask; + struct fsnotify_mark_connector *i_fsnotify_marks; + struct fscrypt_info *i_crypt_info; + struct fsverity_info *i_verity_info; + void *i_private; +}; + +struct dentry_operations { + int (*d_revalidate)(struct dentry *, unsigned int); + int (*d_weak_revalidate)(struct dentry *, unsigned int); + int (*d_hash)(const struct dentry *, struct qstr *); + int (*d_compare)(const struct dentry *, unsigned int, const char *, const struct qstr *); + int (*d_delete)(const struct dentry *); + int (*d_init)(struct dentry *); + void (*d_release)(struct dentry *); + void (*d_prune)(struct dentry *); + void (*d_iput)(struct dentry *, struct inode *); + char * (*d_dname)(struct dentry *, char *, int); + struct vfsmount * (*d_automount)(struct path *); + int (*d_manage)(const struct path *, bool); + struct dentry * (*d_real)(struct dentry *, const struct inode *); + long: 64; + long: 64; + long: 64; +}; + +struct mtd_info; + +typedef long long int qsize_t; + +struct quota_format_type; + +struct mem_dqinfo { + struct quota_format_type *dqi_format; + int dqi_fmt_id; + struct list_head dqi_dirty_list; + long unsigned int dqi_flags; + unsigned int dqi_bgrace; + unsigned int dqi_igrace; + qsize_t dqi_max_spc_limit; + qsize_t dqi_max_ino_limit; + void *dqi_priv; +}; + +struct quota_format_ops; + +struct quota_info { + unsigned int flags; + struct rw_semaphore dqio_sem; + struct inode *files[3]; + struct mem_dqinfo info[3]; + const struct quota_format_ops *ops[3]; +}; + +struct rcu_sync { + int gp_state; + int gp_count; + wait_queue_head_t gp_wait; + struct callback_head cb_head; +}; + +struct percpu_rw_semaphore { + struct rcu_sync rss; + unsigned int *read_count; + struct rcuwait writer; + wait_queue_head_t waiters; + atomic_t block; +}; + +struct sb_writers { + int frozen; + wait_queue_head_t wait_unfrozen; + struct percpu_rw_semaphore rw_sem[3]; +}; + +typedef struct { + __u8 b[16]; +} uuid_t; + +struct shrink_control; + +struct shrinker { + long unsigned int (*count_objects)(struct shrinker *, struct shrink_control *); + long unsigned int (*scan_objects)(struct shrinker *, struct shrink_control *); + long int batch; + int seeks; + unsigned int flags; + struct list_head list; + int id; + atomic_long_t *nr_deferred; +}; + +struct list_lru_node; + +struct list_lru { + struct list_lru_node *node; + struct list_head list; + int shrinker_id; + bool memcg_aware; +}; + +struct super_operations; + +struct dquot_operations; + +struct quotactl_ops; + +struct export_operations; + +struct xattr_handler; + +struct fscrypt_operations; + +struct fsverity_operations; + +struct unicode_map; + +struct block_device; + +struct super_block { + struct list_head s_list; + dev_t s_dev; + unsigned char s_blocksize_bits; + long unsigned int s_blocksize; + loff_t s_maxbytes; + struct file_system_type *s_type; + const struct super_operations *s_op; + const struct dquot_operations *dq_op; + const struct quotactl_ops *s_qcop; + const struct export_operations *s_export_op; + long unsigned int s_flags; + long unsigned int s_iflags; + long unsigned int s_magic; + struct dentry *s_root; + struct rw_semaphore s_umount; + int s_count; + atomic_t s_active; + void *s_security; + const struct xattr_handler **s_xattr; + const struct fscrypt_operations *s_cop; + struct key *s_master_keys; + const struct fsverity_operations *s_vop; + struct unicode_map *s_encoding; + __u16 s_encoding_flags; + struct hlist_bl_head s_roots; + struct list_head s_mounts; + struct block_device *s_bdev; + struct backing_dev_info *s_bdi; + struct mtd_info *s_mtd; + struct hlist_node s_instances; + unsigned int s_quota_types; + struct quota_info s_dquot; + struct sb_writers s_writers; + void *s_fs_info; + u32 s_time_gran; + time64_t s_time_min; + time64_t s_time_max; + __u32 s_fsnotify_mask; + struct fsnotify_mark_connector *s_fsnotify_marks; + char s_id[32]; + uuid_t s_uuid; + unsigned int s_max_links; + fmode_t s_mode; + struct mutex s_vfs_rename_mutex; + const char *s_subtype; + const struct dentry_operations *s_d_op; + int cleancache_poolid; + struct shrinker s_shrink; + atomic_long_t s_remove_count; + atomic_long_t s_fsnotify_connectors; + int s_readonly_remount; + errseq_t s_wb_err; + struct workqueue_struct *s_dio_done_wq; + struct hlist_head s_pins; + struct user_namespace *s_user_ns; + struct list_lru s_dentry_lru; + struct list_lru s_inode_lru; + struct callback_head rcu; + struct work_struct destroy_work; + struct mutex s_sync_lock; + int s_stack_depth; + int: 32; + spinlock_t s_inode_list_lock; + struct list_head s_inodes; + spinlock_t s_inode_wblist_lock; + struct list_head s_inodes_wb; + long: 64; + long: 64; +}; + +struct vfsmount { + struct dentry *mnt_root; + struct super_block *mnt_sb; + int mnt_flags; + struct user_namespace *mnt_userns; +}; + +struct shrink_control { + gfp_t gfp_mask; + int nid; + long unsigned int nr_to_scan; + long unsigned int nr_scanned; + struct mem_cgroup *memcg; +}; + +struct list_lru_one { + struct list_head list; + long int nr_items; +}; + +struct list_lru_memcg { + struct callback_head rcu; + struct list_lru_one *lru[0]; +}; + +struct list_lru_node { + spinlock_t lock; + struct list_lru_one lru; + struct list_lru_memcg *memcg_lrus; + long int nr_items; + long: 64; + long: 64; +}; + +enum migrate_mode { + MIGRATE_ASYNC = 0, + MIGRATE_SYNC_LIGHT = 1, + MIGRATE_SYNC = 2, + MIGRATE_SYNC_NO_COPY = 3, +}; + +struct exception_table_entry { + int insn; + int fixup; + short int type; + short int data; +}; + +struct cgroup_base_stat { + struct task_cputime cputime; +}; + +struct psi_group_cpu; + +struct psi_group { + struct mutex avgs_lock; + struct psi_group_cpu *pcpu; + u64 avg_total[6]; + u64 avg_last_update; + u64 avg_next_update; + struct delayed_work avgs_work; + u64 total[12]; + long unsigned int avg[18]; + struct task_struct *poll_task; + struct timer_list poll_timer; + wait_queue_head_t poll_wait; + atomic_t poll_wakeup; + struct mutex trigger_lock; + struct list_head triggers; + u32 nr_triggers[6]; + u32 poll_states; + u64 poll_min_period; + u64 polling_total[6]; + u64 polling_next_update; + u64 polling_until; +}; + +struct bpf_prog_array; + +struct cgroup_bpf { + struct bpf_prog_array *effective[23]; + struct list_head progs[23]; + u32 flags[23]; + struct list_head storages; + struct bpf_prog_array *inactive; + struct percpu_ref refcnt; + struct work_struct release_work; +}; + +struct cgroup_freezer_state { + bool freeze; + int e_freeze; + int nr_frozen_descendants; + int nr_frozen_tasks; +}; + +struct cgroup_root; + +struct cgroup_rstat_cpu; + +struct cgroup { + struct cgroup_subsys_state self; + long unsigned int flags; + int level; + int max_depth; + int nr_descendants; + int nr_dying_descendants; + int max_descendants; + int nr_populated_csets; + int nr_populated_domain_children; + int nr_populated_threaded_children; + int nr_threaded_children; + struct kernfs_node *kn; + struct cgroup_file procs_file; + struct cgroup_file events_file; + u16 subtree_control; + u16 subtree_ss_mask; + u16 old_subtree_control; + u16 old_subtree_ss_mask; + struct cgroup_subsys_state *subsys[14]; + struct cgroup_root *root; + struct list_head cset_links; + struct list_head e_csets[14]; + struct cgroup *dom_cgrp; + struct cgroup *old_dom_cgrp; + struct cgroup_rstat_cpu *rstat_cpu; + struct list_head rstat_css_list; + struct cgroup_base_stat last_bstat; + struct cgroup_base_stat bstat; + struct prev_cputime prev_cputime; + struct list_head pidlists; + struct mutex pidlist_mutex; + wait_queue_head_t offline_waitq; + struct work_struct release_agent_work; + struct psi_group psi; + struct cgroup_bpf bpf; + atomic_t congestion_count; + struct cgroup_freezer_state freezer; + u64 ancestor_ids[0]; +}; + +struct key_tag { + struct callback_head rcu; + refcount_t usage; + bool removed; +}; + +typedef int (*request_key_actor_t)(struct key *, void *); + +struct key_preparsed_payload; + +struct key_match_data; + +struct kernel_pkey_params; + +struct kernel_pkey_query; + +struct key_type { + const char *name; + size_t def_datalen; + unsigned int flags; + int (*vet_description)(const char *); + int (*preparse)(struct key_preparsed_payload *); + void (*free_preparse)(struct key_preparsed_payload *); + int (*instantiate)(struct key *, struct key_preparsed_payload *); + int (*update)(struct key *, struct key_preparsed_payload *); + int (*match_preparse)(struct key_match_data *); + void (*match_free)(struct key_match_data *); + void (*revoke)(struct key *); + void (*destroy)(struct key *); + void (*describe)(const struct key *, struct seq_file *); + long int (*read)(const struct key *, char *, size_t); + request_key_actor_t request_key; + struct key_restriction * (*lookup_restriction)(const char *); + int (*asym_query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*asym_eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*asym_verify_signature)(struct kernel_pkey_params *, const void *, const void *); + struct list_head link; + struct lock_class_key lock_class; +}; + +typedef int (*key_restrict_link_func_t)(struct key *, const struct key_type *, const union key_payload *, struct key *); + +struct key_restriction { + key_restrict_link_func_t check; + struct key *key; + struct key_type *keytype; +}; + +struct user_struct { + refcount_t __count; + struct percpu_counter epoll_watches; + long unsigned int unix_inflight; + atomic_long_t pipe_bufs; + struct hlist_node uidhash_node; + kuid_t uid; + atomic_long_t locked_vm; + atomic_t nr_watches; + struct ratelimit_state ratelimit; +}; + +struct group_info { + atomic_t usage; + int ngroups; + kgid_t gid[0]; +}; + +struct core_thread { + struct task_struct *task; + struct core_thread *next; +}; + +struct core_state { + atomic_t nr_threads; + struct core_thread dumper; + struct completion startup; +}; + +struct taskstats { + __u16 version; + __u32 ac_exitcode; + __u8 ac_flag; + __u8 ac_nice; + __u64 cpu_count; + __u64 cpu_delay_total; + __u64 blkio_count; + __u64 blkio_delay_total; + __u64 swapin_count; + __u64 swapin_delay_total; + __u64 cpu_run_real_total; + __u64 cpu_run_virtual_total; + char ac_comm[32]; + __u8 ac_sched; + __u8 ac_pad[3]; + int: 32; + __u32 ac_uid; + __u32 ac_gid; + __u32 ac_pid; + __u32 ac_ppid; + __u32 ac_btime; + __u64 ac_etime; + __u64 ac_utime; + __u64 ac_stime; + __u64 ac_minflt; + __u64 ac_majflt; + __u64 coremem; + __u64 virtmem; + __u64 hiwater_rss; + __u64 hiwater_vm; + __u64 read_char; + __u64 write_char; + __u64 read_syscalls; + __u64 write_syscalls; + __u64 read_bytes; + __u64 write_bytes; + __u64 cancelled_write_bytes; + __u64 nvcsw; + __u64 nivcsw; + __u64 ac_utimescaled; + __u64 ac_stimescaled; + __u64 cpu_scaled_run_real_total; + __u64 freepages_count; + __u64 freepages_delay_total; + __u64 thrashing_count; + __u64 thrashing_delay_total; + __u64 ac_btime64; +}; + +struct delayed_call { + void (*fn)(void *); + void *arg; +}; + +struct io_cq { + struct request_queue *q; + struct io_context *ioc; + union { + struct list_head q_node; + struct kmem_cache *__rcu_icq_cache; + }; + union { + struct hlist_node ioc_node; + struct callback_head __rcu_head; + }; + unsigned int flags; +}; + +struct wait_page_queue; + +struct kiocb { + struct file *ki_filp; + loff_t ki_pos; + void (*ki_complete)(struct kiocb *, long int); + void *private; + int ki_flags; + u16 ki_hint; + u16 ki_ioprio; + struct wait_page_queue *ki_waitq; +}; + +struct iattr { + unsigned int ia_valid; + umode_t ia_mode; + kuid_t ia_uid; + kgid_t ia_gid; + loff_t ia_size; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct file *ia_file; +}; + +typedef __kernel_uid32_t projid_t; + +typedef struct { + projid_t val; +} kprojid_t; + +enum quota_type { + USRQUOTA = 0, + GRPQUOTA = 1, + PRJQUOTA = 2, +}; + +struct kqid { + union { + kuid_t uid; + kgid_t gid; + kprojid_t projid; + }; + enum quota_type type; +}; + +struct mem_dqblk { + qsize_t dqb_bhardlimit; + qsize_t dqb_bsoftlimit; + qsize_t dqb_curspace; + qsize_t dqb_rsvspace; + qsize_t dqb_ihardlimit; + qsize_t dqb_isoftlimit; + qsize_t dqb_curinodes; + time64_t dqb_btime; + time64_t dqb_itime; +}; + +struct dquot { + struct hlist_node dq_hash; + struct list_head dq_inuse; + struct list_head dq_free; + struct list_head dq_dirty; + struct mutex dq_lock; + spinlock_t dq_dqb_lock; + atomic_t dq_count; + struct super_block *dq_sb; + struct kqid dq_id; + loff_t dq_off; + long unsigned int dq_flags; + struct mem_dqblk dq_dqb; +}; + +struct quota_format_type { + int qf_fmt_id; + const struct quota_format_ops *qf_ops; + struct module *qf_owner; + struct quota_format_type *qf_next; +}; + +struct quota_format_ops { + int (*check_quota_file)(struct super_block *, int); + int (*read_file_info)(struct super_block *, int); + int (*write_file_info)(struct super_block *, int); + int (*free_file_info)(struct super_block *, int); + int (*read_dqblk)(struct dquot *); + int (*commit_dqblk)(struct dquot *); + int (*release_dqblk)(struct dquot *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct dquot_operations { + int (*write_dquot)(struct dquot *); + struct dquot * (*alloc_dquot)(struct super_block *, int); + void (*destroy_dquot)(struct dquot *); + int (*acquire_dquot)(struct dquot *); + int (*release_dquot)(struct dquot *); + int (*mark_dirty)(struct dquot *); + int (*write_info)(struct super_block *, int); + qsize_t * (*get_reserved_space)(struct inode *); + int (*get_projid)(struct inode *, kprojid_t *); + int (*get_inode_usage)(struct inode *, qsize_t *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct qc_dqblk { + int d_fieldmask; + u64 d_spc_hardlimit; + u64 d_spc_softlimit; + u64 d_ino_hardlimit; + u64 d_ino_softlimit; + u64 d_space; + u64 d_ino_count; + s64 d_ino_timer; + s64 d_spc_timer; + int d_ino_warns; + int d_spc_warns; + u64 d_rt_spc_hardlimit; + u64 d_rt_spc_softlimit; + u64 d_rt_space; + s64 d_rt_spc_timer; + int d_rt_spc_warns; +}; + +struct qc_type_state { + unsigned int flags; + unsigned int spc_timelimit; + unsigned int ino_timelimit; + unsigned int rt_spc_timelimit; + unsigned int spc_warnlimit; + unsigned int ino_warnlimit; + unsigned int rt_spc_warnlimit; + long long unsigned int ino; + blkcnt_t blocks; + blkcnt_t nextents; +}; + +struct qc_state { + unsigned int s_incoredqs; + struct qc_type_state s_state[3]; +}; + +struct qc_info { + int i_fieldmask; + unsigned int i_flags; + unsigned int i_spc_timelimit; + unsigned int i_ino_timelimit; + unsigned int i_rt_spc_timelimit; + unsigned int i_spc_warnlimit; + unsigned int i_ino_warnlimit; + unsigned int i_rt_spc_warnlimit; +}; + +struct quotactl_ops { + int (*quota_on)(struct super_block *, int, int, const struct path *); + int (*quota_off)(struct super_block *, int); + int (*quota_enable)(struct super_block *, unsigned int); + int (*quota_disable)(struct super_block *, unsigned int); + int (*quota_sync)(struct super_block *, int); + int (*set_info)(struct super_block *, int, struct qc_info *); + int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_nextdqblk)(struct super_block *, struct kqid *, struct qc_dqblk *); + int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_state)(struct super_block *, struct qc_state *); + int (*rm_xquota)(struct super_block *, unsigned int); +}; + +struct wait_page_queue { + struct folio *folio; + int bit_nr; + wait_queue_entry_t wait; +}; + +struct writeback_control; + +struct readahead_control; + +struct swap_info_struct; + +struct address_space_operations { + int (*writepage)(struct page *, struct writeback_control *); + int (*readpage)(struct file *, struct page *); + int (*writepages)(struct address_space *, struct writeback_control *); + int (*set_page_dirty)(struct page *); + int (*readpages)(struct file *, struct address_space *, struct list_head *, unsigned int); + void (*readahead)(struct readahead_control *); + int (*write_begin)(struct file *, struct address_space *, loff_t, unsigned int, unsigned int, struct page **, void **); + int (*write_end)(struct file *, struct address_space *, loff_t, unsigned int, unsigned int, struct page *, void *); + sector_t (*bmap)(struct address_space *, sector_t); + void (*invalidatepage)(struct page *, unsigned int, unsigned int); + int (*releasepage)(struct page *, gfp_t); + void (*freepage)(struct page *); + ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *); + int (*migratepage)(struct address_space *, struct page *, struct page *, enum migrate_mode); + bool (*isolate_page)(struct page *, isolate_mode_t); + void (*putback_page)(struct page *); + int (*launder_page)(struct page *); + int (*is_partially_uptodate)(struct page *, long unsigned int, long unsigned int); + void (*is_dirty_writeback)(struct page *, bool *, bool *); + int (*error_remove_page)(struct address_space *, struct page *); + int (*swap_activate)(struct swap_info_struct *, struct file *, sector_t *); + void (*swap_deactivate)(struct file *); +}; + +enum writeback_sync_modes { + WB_SYNC_NONE = 0, + WB_SYNC_ALL = 1, +}; + +struct writeback_control { + long int nr_to_write; + long int pages_skipped; + loff_t range_start; + loff_t range_end; + enum writeback_sync_modes sync_mode; + unsigned int for_kupdate: 1; + unsigned int for_background: 1; + unsigned int tagged_writepages: 1; + unsigned int for_reclaim: 1; + unsigned int range_cyclic: 1; + unsigned int for_sync: 1; + unsigned int no_cgroup_owner: 1; + unsigned int punt_to_cgroup: 1; + struct bdi_writeback *wb; + struct inode *inode; + int wb_id; + int wb_lcand_id; + int wb_tcand_id; + size_t wb_bytes; + size_t wb_lcand_bytes; + size_t wb_tcand_bytes; +}; + +struct readahead_control { + struct file *file; + struct address_space *mapping; + struct file_ra_state *ra; + long unsigned int _index; + unsigned int _nr_pages; + unsigned int _batch_count; +}; + +struct iovec; + +struct kvec; + +struct bio_vec; + +struct iov_iter { + u8 iter_type; + bool nofault; + bool data_source; + size_t iov_offset; + size_t count; + union { + const struct iovec *iov; + const struct kvec *kvec; + const struct bio_vec *bvec; + struct xarray *xarray; + struct pipe_inode_info *pipe; + }; + union { + long unsigned int nr_segs; + struct { + unsigned int head; + unsigned int start_head; + }; + loff_t xarray_start; + }; +}; + +struct swap_cluster_info { + spinlock_t lock; + unsigned int data: 24; + unsigned int flags: 8; +}; + +struct swap_cluster_list { + struct swap_cluster_info head; + struct swap_cluster_info tail; +}; + +struct percpu_cluster; + +struct swap_info_struct { + struct percpu_ref users; + long unsigned int flags; + short int prio; + struct plist_node list; + signed char type; + unsigned int max; + unsigned char *swap_map; + struct swap_cluster_info *cluster_info; + struct swap_cluster_list free_clusters; + unsigned int lowest_bit; + unsigned int highest_bit; + unsigned int pages; + unsigned int inuse_pages; + unsigned int cluster_next; + unsigned int cluster_nr; + unsigned int *cluster_next_cpu; + struct percpu_cluster *percpu_cluster; + struct rb_root swap_extent_root; + struct block_device *bdev; + struct file *swap_file; + unsigned int old_block_size; + struct completion comp; + long unsigned int *frontswap_map; + atomic_t frontswap_pages; + spinlock_t lock; + spinlock_t cont_lock; + struct work_struct discard_work; + struct swap_cluster_list discard_clusters; + struct plist_node avail_lists[0]; +}; + +struct cdev { + struct kobject kobj; + struct module *owner; + const struct file_operations *ops; + struct list_head list; + dev_t dev; + unsigned int count; +}; + +struct fiemap_extent_info; + +struct fileattr; + +struct inode_operations { + struct dentry * (*lookup)(struct inode *, struct dentry *, unsigned int); + const char * (*get_link)(struct dentry *, struct inode *, struct delayed_call *); + int (*permission)(struct user_namespace *, struct inode *, int); + struct posix_acl * (*get_acl)(struct inode *, int, bool); + int (*readlink)(struct dentry *, char *, int); + int (*create)(struct user_namespace *, struct inode *, struct dentry *, umode_t, bool); + int (*link)(struct dentry *, struct inode *, struct dentry *); + int (*unlink)(struct inode *, struct dentry *); + int (*symlink)(struct user_namespace *, struct inode *, struct dentry *, const char *); + int (*mkdir)(struct user_namespace *, struct inode *, struct dentry *, umode_t); + int (*rmdir)(struct inode *, struct dentry *); + int (*mknod)(struct user_namespace *, struct inode *, struct dentry *, umode_t, dev_t); + int (*rename)(struct user_namespace *, struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); + int (*setattr)(struct user_namespace *, struct dentry *, struct iattr *); + int (*getattr)(struct user_namespace *, const struct path *, struct kstat *, u32, unsigned int); + ssize_t (*listxattr)(struct dentry *, char *, size_t); + int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64, u64); + int (*update_time)(struct inode *, struct timespec64 *, int); + int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned int, umode_t); + int (*tmpfile)(struct user_namespace *, struct inode *, struct dentry *, umode_t); + int (*set_acl)(struct user_namespace *, struct inode *, struct posix_acl *, int); + int (*fileattr_set)(struct user_namespace *, struct dentry *, struct fileattr *); + int (*fileattr_get)(struct dentry *, struct fileattr *); + long: 64; +}; + +struct file_lock_context { + spinlock_t flc_lock; + struct list_head flc_flock; + struct list_head flc_posix; + struct list_head flc_lease; +}; + +struct file_lock_operations { + void (*fl_copy_lock)(struct file_lock *, struct file_lock *); + void (*fl_release_private)(struct file_lock *); +}; + +struct nlm_lockowner; + +struct nfs_lock_info { + u32 state; + struct nlm_lockowner *owner; + struct list_head list; +}; + +struct nfs4_lock_state; + +struct nfs4_lock_info { + struct nfs4_lock_state *owner; +}; + +struct lock_manager_operations; + +struct file_lock { + struct file_lock *fl_blocker; + struct list_head fl_list; + struct hlist_node fl_link; + struct list_head fl_blocked_requests; + struct list_head fl_blocked_member; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + unsigned int fl_pid; + int fl_link_cpu; + wait_queue_head_t fl_wait; + struct file *fl_file; + loff_t fl_start; + loff_t fl_end; + struct fasync_struct *fl_fasync; + long unsigned int fl_break_time; + long unsigned int fl_downgrade_time; + const struct file_lock_operations *fl_ops; + const struct lock_manager_operations *fl_lmops; + union { + struct nfs_lock_info nfs_fl; + struct nfs4_lock_info nfs4_fl; + struct { + struct list_head link; + int state; + unsigned int debug_id; + } afs; + } fl_u; +}; + +struct lock_manager_operations { + fl_owner_t (*lm_get_owner)(fl_owner_t); + void (*lm_put_owner)(fl_owner_t); + void (*lm_notify)(struct file_lock *); + int (*lm_grant)(struct file_lock *, int); + bool (*lm_break)(struct file_lock *); + int (*lm_change)(struct file_lock *, int, struct list_head *); + void (*lm_setup)(struct file_lock *, void **); + bool (*lm_breaker_owns_lease)(struct file_lock *); +}; + +struct fasync_struct { + rwlock_t fa_lock; + int magic; + int fa_fd; + struct fasync_struct *fa_next; + struct file *fa_file; + struct callback_head fa_rcu; +}; + +struct kstatfs; + +struct super_operations { + struct inode * (*alloc_inode)(struct super_block *); + void (*destroy_inode)(struct inode *); + void (*free_inode)(struct inode *); + void (*dirty_inode)(struct inode *, int); + int (*write_inode)(struct inode *, struct writeback_control *); + int (*drop_inode)(struct inode *); + void (*evict_inode)(struct inode *); + void (*put_super)(struct super_block *); + int (*sync_fs)(struct super_block *, int); + int (*freeze_super)(struct super_block *); + int (*freeze_fs)(struct super_block *); + int (*thaw_super)(struct super_block *); + int (*unfreeze_fs)(struct super_block *); + int (*statfs)(struct dentry *, struct kstatfs *); + int (*remount_fs)(struct super_block *, int *, char *); + void (*umount_begin)(struct super_block *); + int (*show_options)(struct seq_file *, struct dentry *); + int (*show_devname)(struct seq_file *, struct dentry *); + int (*show_path)(struct seq_file *, struct dentry *); + int (*show_stats)(struct seq_file *, struct dentry *); + ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); + ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); + struct dquot ** (*get_dquots)(struct inode *); + long int (*nr_cached_objects)(struct super_block *, struct shrink_control *); + long int (*free_cached_objects)(struct super_block *, struct shrink_control *); +}; + +struct iomap; + +struct fid; + +struct export_operations { + int (*encode_fh)(struct inode *, __u32 *, int *, struct inode *); + struct dentry * (*fh_to_dentry)(struct super_block *, struct fid *, int, int); + struct dentry * (*fh_to_parent)(struct super_block *, struct fid *, int, int); + int (*get_name)(struct dentry *, char *, struct dentry *); + struct dentry * (*get_parent)(struct dentry *); + int (*commit_metadata)(struct inode *); + int (*get_uuid)(struct super_block *, u8 *, u32 *, u64 *); + int (*map_blocks)(struct inode *, loff_t, u64, struct iomap *, bool, u32 *); + int (*commit_blocks)(struct inode *, struct iomap *, int, struct iattr *); + u64 (*fetch_iversion)(struct inode *); + long unsigned int flags; +}; + +struct xattr_handler { + const char *name; + const char *prefix; + int flags; + bool (*list)(struct dentry *); + int (*get)(const struct xattr_handler *, struct dentry *, struct inode *, const char *, void *, size_t); + int (*set)(const struct xattr_handler *, struct user_namespace *, struct dentry *, struct inode *, const char *, const void *, size_t, int); +}; + +union fscrypt_policy; + +struct fscrypt_operations { + unsigned int flags; + const char *key_prefix; + int (*get_context)(struct inode *, void *, size_t); + int (*set_context)(struct inode *, const void *, size_t, void *); + const union fscrypt_policy * (*get_dummy_policy)(struct super_block *); + bool (*empty_dir)(struct inode *); + bool (*has_stable_inodes)(struct super_block *); + void (*get_ino_and_lblk_bits)(struct super_block *, int *, int *); + int (*get_num_devices)(struct super_block *); + void (*get_devices)(struct super_block *, struct request_queue **); +}; + +struct fsverity_operations { + int (*begin_enable_verity)(struct file *); + int (*end_enable_verity)(struct file *, const void *, size_t, u64); + int (*get_verity_descriptor)(struct inode *, void *, size_t); + struct page * (*read_merkle_tree_page)(struct inode *, long unsigned int, long unsigned int); + int (*write_merkle_tree_block)(struct inode *, const void *, u64, int); +}; + +enum dl_dev_state { + DL_DEV_NO_DRIVER = 0, + DL_DEV_PROBING = 1, + DL_DEV_DRIVER_BOUND = 2, + DL_DEV_UNBINDING = 3, +}; + +struct dev_links_info { + struct list_head suppliers; + struct list_head consumers; + struct list_head defer_sync; + enum dl_dev_state status; +}; + +struct pm_message { + int event; +}; + +typedef struct pm_message pm_message_t; + +enum rpm_request { + RPM_REQ_NONE = 0, + RPM_REQ_IDLE = 1, + RPM_REQ_SUSPEND = 2, + RPM_REQ_AUTOSUSPEND = 3, + RPM_REQ_RESUME = 4, +}; + +struct wakeup_source; + +struct wake_irq; + +struct pm_subsys_data; + +struct dev_pm_qos; + +struct dev_pm_info { + pm_message_t power_state; + unsigned int can_wakeup: 1; + unsigned int async_suspend: 1; + bool in_dpm_list: 1; + bool is_prepared: 1; + bool is_suspended: 1; + bool is_noirq_suspended: 1; + bool is_late_suspended: 1; + bool no_pm: 1; + bool early_init: 1; + bool direct_complete: 1; + u32 driver_flags; + spinlock_t lock; + struct list_head entry; + struct completion completion; + struct wakeup_source *wakeup; + bool wakeup_path: 1; + bool syscore: 1; + bool no_pm_callbacks: 1; + unsigned int must_resume: 1; + unsigned int may_skip_resume: 1; + struct hrtimer suspend_timer; + u64 timer_expires; + struct work_struct work; + wait_queue_head_t wait_queue; + struct wake_irq *wakeirq; + atomic_t usage_count; + atomic_t child_count; + unsigned int disable_depth: 3; + unsigned int idle_notification: 1; + unsigned int request_pending: 1; + unsigned int deferred_resume: 1; + unsigned int needs_force_resume: 1; + unsigned int runtime_auto: 1; + bool ignore_children: 1; + unsigned int no_callbacks: 1; + unsigned int irq_safe: 1; + unsigned int use_autosuspend: 1; + unsigned int timer_autosuspends: 1; + unsigned int memalloc_noio: 1; + unsigned int links_count; + enum rpm_request request; + enum rpm_status runtime_status; + int runtime_error; + int autosuspend_delay; + u64 last_busy; + u64 active_time; + u64 suspended_time; + u64 accounting_timestamp; + struct pm_subsys_data *subsys_data; + void (*set_latency_tolerance)(struct device *, s32); + struct dev_pm_qos *qos; +}; + +struct dev_archdata {}; + +enum device_removable { + DEVICE_REMOVABLE_NOT_SUPPORTED = 0, + DEVICE_REMOVABLE_UNKNOWN = 1, + DEVICE_FIXED = 2, + DEVICE_REMOVABLE = 3, +}; + +struct device_private; + +struct device_type; + +struct bus_type; + +struct device_driver; + +struct dev_pm_domain; + +struct em_perf_domain; + +struct irq_domain; + +struct dev_pin_info; + +struct dma_map_ops; + +struct bus_dma_region; + +struct device_dma_parameters; + +struct dma_coherent_mem; + +struct cma; + +struct io_tlb_mem; + +struct device_node; + +struct fwnode_handle; + +struct class; + +struct attribute_group; + +struct iommu_group; + +struct dev_iommu; + +struct device { + struct kobject kobj; + struct device *parent; + struct device_private *p; + const char *init_name; + const struct device_type *type; + struct bus_type *bus; + struct device_driver *driver; + void *platform_data; + void *driver_data; + struct mutex mutex; + struct dev_links_info links; + struct dev_pm_info power; + struct dev_pm_domain *pm_domain; + struct em_perf_domain *em_pd; + struct irq_domain *msi_domain; + struct dev_pin_info *pins; + raw_spinlock_t msi_lock; + struct list_head msi_list; + const struct dma_map_ops *dma_ops; + u64 *dma_mask; + u64 coherent_dma_mask; + u64 bus_dma_limit; + const struct bus_dma_region *dma_range_map; + struct device_dma_parameters *dma_parms; + struct list_head dma_pools; + struct dma_coherent_mem *dma_mem; + struct cma *cma_area; + struct io_tlb_mem *dma_io_tlb_mem; + struct dev_archdata archdata; + struct device_node *of_node; + struct fwnode_handle *fwnode; + int numa_node; + dev_t devt; + u32 id; + spinlock_t devres_lock; + struct list_head devres_head; + struct class *class; + const struct attribute_group **groups; + void (*release)(struct device *); + struct iommu_group *iommu_group; + struct dev_iommu *iommu; + enum device_removable removable; + bool offline_disabled: 1; + bool offline: 1; + bool of_node_reused: 1; + bool state_synced: 1; + bool can_match: 1; + bool dma_coherent: 1; +}; + +struct disk_stats; + +struct partition_meta_info; + +struct block_device { + sector_t bd_start_sect; + sector_t bd_nr_sectors; + struct disk_stats *bd_stats; + long unsigned int bd_stamp; + bool bd_read_only; + dev_t bd_dev; + int bd_openers; + struct inode *bd_inode; + struct super_block *bd_super; + void *bd_claiming; + struct device bd_device; + void *bd_holder; + int bd_holders; + bool bd_write_holder; + struct kobject *bd_holder_dir; + u8 bd_partno; + spinlock_t bd_size_lock; + struct gendisk *bd_disk; + struct request_queue *bd_queue; + int bd_fsfreeze_count; + struct mutex bd_fsfreeze_mutex; + struct super_block *bd_fsfreeze_sb; + struct partition_meta_info *bd_meta_info; +}; + +typedef int (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64, unsigned int); + +struct dir_context { + filldir_t actor; + loff_t pos; +}; + +struct io_comp_batch { + struct request *req_list; + bool need_ts; + void (*complete)(struct io_comp_batch *); +}; + +typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *); + +struct poll_table_struct { + poll_queue_proc _qproc; + __poll_t _key; +}; + +struct seq_operations; + +struct seq_file { + char *buf; + size_t size; + size_t from; + size_t count; + size_t pad_until; + loff_t index; + loff_t read_pos; + struct mutex lock; + const struct seq_operations *op; + int poll_event; + const struct file *file; + void *private; +}; + +struct fc_log; + +struct p_log { + const char *prefix; + struct fc_log *log; +}; + +enum fs_context_purpose { + FS_CONTEXT_FOR_MOUNT = 0, + FS_CONTEXT_FOR_SUBMOUNT = 1, + FS_CONTEXT_FOR_RECONFIGURE = 2, +}; + +enum fs_context_phase { + FS_CONTEXT_CREATE_PARAMS = 0, + FS_CONTEXT_CREATING = 1, + FS_CONTEXT_AWAITING_MOUNT = 2, + FS_CONTEXT_AWAITING_RECONF = 3, + FS_CONTEXT_RECONF_PARAMS = 4, + FS_CONTEXT_RECONFIGURING = 5, + FS_CONTEXT_FAILED = 6, +}; + +struct fs_context_operations; + +struct fs_context { + const struct fs_context_operations *ops; + struct mutex uapi_mutex; + struct file_system_type *fs_type; + void *fs_private; + void *sget_key; + struct dentry *root; + struct user_namespace *user_ns; + struct net *net_ns; + const struct cred *cred; + struct p_log log; + const char *source; + void *security; + void *s_fs_info; + unsigned int sb_flags; + unsigned int sb_flags_mask; + unsigned int s_iflags; + unsigned int lsm_flags; + enum fs_context_purpose purpose: 8; + enum fs_context_phase phase: 8; + bool need_free: 1; + bool global: 1; + bool oldapi: 1; +}; + +struct fs_parameter; + +struct fs_parse_result; + +typedef int fs_param_type(struct p_log *, const struct fs_parameter_spec *, struct fs_parameter *, struct fs_parse_result *); + +struct fs_parameter_spec { + const char *name; + fs_param_type *type; + u8 opt; + short unsigned int flags; + const void *data; +}; + +struct audit_names; + +struct filename { + const char *name; + const char *uptr; + int refcnt; + struct audit_names *aname; + const char iname[0]; +}; + +typedef u8 blk_status_t; + +struct bvec_iter { + sector_t bi_sector; + unsigned int bi_size; + unsigned int bi_idx; + unsigned int bi_bvec_done; +} __attribute__((packed)); + +typedef unsigned int blk_qc_t; + +typedef void bio_end_io_t(struct bio *); + +struct bio_issue { + u64 value; +}; + +struct bio_vec { + struct page *bv_page; + unsigned int bv_len; + unsigned int bv_offset; +}; + +struct bio_crypt_ctx; + +struct bio_integrity_payload; + +struct bio { + struct bio *bi_next; + struct block_device *bi_bdev; + unsigned int bi_opf; + short unsigned int bi_flags; + short unsigned int bi_ioprio; + short unsigned int bi_write_hint; + blk_status_t bi_status; + atomic_t __bi_remaining; + struct bvec_iter bi_iter; + blk_qc_t bi_cookie; + bio_end_io_t *bi_end_io; + void *bi_private; + struct blkcg_gq *bi_blkg; + struct bio_issue bi_issue; + u64 bi_iocost_cost; + struct bio_crypt_ctx *bi_crypt_context; + union { + struct bio_integrity_payload *bi_integrity; + }; + short unsigned int bi_vcnt; + short unsigned int bi_max_vecs; + atomic_t __bi_cnt; + struct bio_vec *bi_io_vec; + struct bio_set *bi_pool; + struct bio_vec bi_inline_vecs[0]; +}; + +struct kernfs_root; + +struct kernfs_elem_dir { + long unsigned int subdirs; + struct rb_root children; + struct kernfs_root *root; + long unsigned int rev; +}; + +struct kernfs_syscall_ops; + +struct kernfs_root { + struct kernfs_node *kn; + unsigned int flags; + struct idr ino_idr; + u32 last_id_lowbits; + u32 id_highbits; + struct kernfs_syscall_ops *syscall_ops; + struct list_head supers; + wait_queue_head_t deactivate_waitq; +}; + +struct kernfs_elem_symlink { + struct kernfs_node *target_kn; +}; + +struct kernfs_ops; + +struct kernfs_open_node; + +struct kernfs_elem_attr { + const struct kernfs_ops *ops; + struct kernfs_open_node *open; + loff_t size; + struct kernfs_node *notify_next; +}; + +struct kernfs_iattrs; + +struct kernfs_node { + atomic_t count; + atomic_t active; + struct kernfs_node *parent; + const char *name; + struct rb_node rb; + const void *ns; + unsigned int hash; + union { + struct kernfs_elem_dir dir; + struct kernfs_elem_symlink symlink; + struct kernfs_elem_attr attr; + }; + void *priv; + u64 id; + short unsigned int flags; + umode_t mode; + struct kernfs_iattrs *iattr; +}; + +struct kernfs_open_file; + +struct kernfs_ops { + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + ssize_t (*read)(struct kernfs_open_file *, char *, size_t, loff_t); + size_t atomic_write_len; + bool prealloc; + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); + int (*mmap)(struct kernfs_open_file *, struct vm_area_struct *); +}; + +struct kernfs_syscall_ops { + int (*show_options)(struct seq_file *, struct kernfs_root *); + int (*mkdir)(struct kernfs_node *, const char *, umode_t); + int (*rmdir)(struct kernfs_node *); + int (*rename)(struct kernfs_node *, struct kernfs_node *, const char *); + int (*show_path)(struct seq_file *, struct kernfs_node *, struct kernfs_root *); +}; + +struct kernfs_open_file { + struct kernfs_node *kn; + struct file *file; + struct seq_file *seq_file; + void *priv; + struct mutex mutex; + struct mutex prealloc_mutex; + int event; + struct list_head list; + char *prealloc_buf; + size_t atomic_write_len; + bool mmapped: 1; + bool released: 1; + const struct vm_operations_struct *vm_ops; +}; + +enum kobj_ns_type { + KOBJ_NS_TYPE_NONE = 0, + KOBJ_NS_TYPE_NET = 1, + KOBJ_NS_TYPES = 2, +}; + +struct sock; + +struct kobj_ns_type_operations { + enum kobj_ns_type type; + bool (*current_may_mount)(); + void * (*grab_current_ns)(); + const void * (*netlink_ns)(struct sock *); + const void * (*initial_ns)(); + void (*drop_ns)(void *); +}; + +struct attribute { + const char *name; + umode_t mode; +}; + +struct bin_attribute; + +struct attribute_group { + const char *name; + umode_t (*is_visible)(struct kobject *, struct attribute *, int); + umode_t (*is_bin_visible)(struct kobject *, struct bin_attribute *, int); + struct attribute **attrs; + struct bin_attribute **bin_attrs; +}; + +struct bin_attribute { + struct attribute attr; + size_t size; + void *private; + struct address_space * (*f_mapping)(); + ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + int (*mmap)(struct file *, struct kobject *, struct bin_attribute *, struct vm_area_struct *); +}; + +struct sysfs_ops { + ssize_t (*show)(struct kobject *, struct attribute *, char *); + ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); +}; + +struct kset_uevent_ops; + +struct kset { + struct list_head list; + spinlock_t list_lock; + struct kobject kobj; + const struct kset_uevent_ops *uevent_ops; +}; + +struct kobj_type { + void (*release)(struct kobject *); + const struct sysfs_ops *sysfs_ops; + struct attribute **default_attrs; + const struct attribute_group **default_groups; + const struct kobj_ns_type_operations * (*child_ns_type)(struct kobject *); + const void * (*namespace)(struct kobject *); + void (*get_ownership)(struct kobject *, kuid_t *, kgid_t *); +}; + +struct kobj_uevent_env { + char *argv[3]; + char *envp[64]; + int envp_idx; + char buf[2048]; + int buflen; +}; + +struct kset_uevent_ops { + int (* const filter)(struct kset *, struct kobject *); + const char * (* const name)(struct kset *, struct kobject *); + int (* const uevent)(struct kset *, struct kobject *, struct kobj_uevent_env *); +}; + +struct kernel_param_ops { + unsigned int flags; + int (*set)(const char *, const struct kernel_param *); + int (*get)(char *, const struct kernel_param *); + void (*free)(void *); +}; + +struct kparam_string; + +struct kparam_array; + +struct kernel_param { + const char *name; + struct module *mod; + const struct kernel_param_ops *ops; + const u16 perm; + s8 level; + u8 flags; + union { + void *arg; + const struct kparam_string *str; + const struct kparam_array *arr; + }; +}; + +struct kparam_string { + unsigned int maxlen; + char *string; +}; + +struct kparam_array { + unsigned int max; + unsigned int elemsize; + unsigned int *num; + const struct kernel_param_ops *ops; + void *elem; +}; + +struct error_injection_entry { + long unsigned int addr; + int etype; +}; + +struct tracepoint_func { + void *func; + void *data; + int prio; +}; + +struct tracepoint { + const char *name; + struct static_key key; + struct static_call_key *static_call_key; + void *static_call_tramp; + void *iterator; + int (*regfunc)(); + void (*unregfunc)(); + struct tracepoint_func *funcs; +}; + +struct bpf_raw_event_map { + struct tracepoint *tp; + void *bpf_func; + u32 num_args; + u32 writable_size; + long: 64; +}; + +struct plt_entry { + __le32 adrp; + __le32 add; + __le32 br; +}; + +struct module_attribute { + struct attribute attr; + ssize_t (*show)(struct module_attribute *, struct module_kobject *, char *); + ssize_t (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t); + void (*setup)(struct module *, const char *); + int (*test)(struct module *); + void (*free)(struct module *); +}; + +struct trace_event_functions; + +struct trace_event { + struct hlist_node node; + struct list_head list; + int type; + struct trace_event_functions *funcs; +}; + +struct trace_event_class; + +struct trace_event_call { + struct list_head list; + struct trace_event_class *class; + union { + char *name; + struct tracepoint *tp; + }; + struct trace_event event; + char *print_fmt; + struct event_filter *filter; + union { + void *module; + atomic_t refcnt; + }; + void *data; + int flags; + int perf_refcount; + struct hlist_head *perf_events; + struct bpf_prog_array *prog_array; + int (*perf_perm)(struct trace_event_call *, struct perf_event *); +}; + +struct trace_eval_map { + const char *system; + const char *eval_string; + long unsigned int eval_value; +}; + +struct linux_binprm { + struct vm_area_struct *vma; + long unsigned int vma_pages; + struct mm_struct *mm; + long unsigned int p; + long unsigned int argmin; + unsigned int have_execfd: 1; + unsigned int execfd_creds: 1; + unsigned int secureexec: 1; + unsigned int point_of_no_return: 1; + struct file *executable; + struct file *interpreter; + struct file *file; + struct cred *cred; + int unsafe; + unsigned int per_clear; + int argc; + int envc; + const char *filename; + const char *interp; + const char *fdpath; + unsigned int interp_flags; + int execfd; + long unsigned int loader; + long unsigned int exec; + struct rlimit rlim_stack; + char buf[256]; +}; + +struct coredump_params { + const kernel_siginfo_t *siginfo; + struct pt_regs *regs; + struct file *file; + long unsigned int limit; + long unsigned int mm_flags; + loff_t written; + loff_t pos; + loff_t to_skip; +}; + +struct em_perf_state { + long unsigned int frequency; + long unsigned int power; + long unsigned int cost; + long unsigned int flags; +}; + +struct em_perf_domain { + struct em_perf_state *table; + int nr_perf_states; + long unsigned int flags; + long unsigned int cpus[0]; +}; + +struct dev_pm_ops { + int (*prepare)(struct device *); + void (*complete)(struct device *); + int (*suspend)(struct device *); + int (*resume)(struct device *); + int (*freeze)(struct device *); + int (*thaw)(struct device *); + int (*poweroff)(struct device *); + int (*restore)(struct device *); + int (*suspend_late)(struct device *); + int (*resume_early)(struct device *); + int (*freeze_late)(struct device *); + int (*thaw_early)(struct device *); + int (*poweroff_late)(struct device *); + int (*restore_early)(struct device *); + int (*suspend_noirq)(struct device *); + int (*resume_noirq)(struct device *); + int (*freeze_noirq)(struct device *); + int (*thaw_noirq)(struct device *); + int (*poweroff_noirq)(struct device *); + int (*restore_noirq)(struct device *); + int (*runtime_suspend)(struct device *); + int (*runtime_resume)(struct device *); + int (*runtime_idle)(struct device *); +}; + +struct pm_domain_data; + +struct pm_subsys_data { + spinlock_t lock; + unsigned int refcount; + unsigned int clock_op_might_sleep; + struct mutex clock_mutex; + struct list_head clock_list; + struct pm_domain_data *domain_data; +}; + +struct wakeup_source { + const char *name; + int id; + struct list_head entry; + spinlock_t lock; + struct wake_irq *wakeirq; + struct timer_list timer; + long unsigned int timer_expires; + ktime_t total_time; + ktime_t max_time; + ktime_t last_time; + ktime_t start_prevent_time; + ktime_t prevent_sleep_time; + long unsigned int event_count; + long unsigned int active_count; + long unsigned int relax_count; + long unsigned int expire_count; + long unsigned int wakeup_count; + struct device *dev; + bool active: 1; + bool autosleep_enabled: 1; +}; + +struct dev_pm_domain { + struct dev_pm_ops ops; + int (*start)(struct device *); + void (*detach)(struct device *, bool); + int (*activate)(struct device *); + void (*sync)(struct device *); + void (*dismiss)(struct device *); +}; + +struct iommu_ops; + +struct subsys_private; + +struct bus_type { + const char *name; + const char *dev_name; + struct device *dev_root; + const struct attribute_group **bus_groups; + const struct attribute_group **dev_groups; + const struct attribute_group **drv_groups; + int (*match)(struct device *, struct device_driver *); + int (*uevent)(struct device *, struct kobj_uevent_env *); + int (*probe)(struct device *); + void (*sync_state)(struct device *); + void (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*online)(struct device *); + int (*offline)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + int (*num_vf)(struct device *); + int (*dma_configure)(struct device *); + const struct dev_pm_ops *pm; + const struct iommu_ops *iommu_ops; + struct subsys_private *p; + struct lock_class_key lock_key; + bool need_parent_lock; +}; + +enum probe_type { + PROBE_DEFAULT_STRATEGY = 0, + PROBE_PREFER_ASYNCHRONOUS = 1, + PROBE_FORCE_SYNCHRONOUS = 2, +}; + +struct of_device_id; + +struct acpi_device_id; + +struct driver_private; + +struct device_driver { + const char *name; + struct bus_type *bus; + struct module *owner; + const char *mod_name; + bool suppress_bind_attrs; + enum probe_type probe_type; + const struct of_device_id *of_match_table; + const struct acpi_device_id *acpi_match_table; + int (*probe)(struct device *); + void (*sync_state)(struct device *); + int (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + const struct dev_pm_ops *pm; + void (*coredump)(struct device *); + struct driver_private *p; +}; + +enum iommu_cap { + IOMMU_CAP_CACHE_COHERENCY = 0, + IOMMU_CAP_INTR_REMAP = 1, + IOMMU_CAP_NOEXEC = 2, +}; + +typedef u64 dma_addr_t; + +enum iommu_dev_features { + IOMMU_DEV_FEAT_AUX = 0, + IOMMU_DEV_FEAT_SVA = 1, + IOMMU_DEV_FEAT_IOPF = 2, +}; + +struct iommu_domain; + +struct iommu_iotlb_gather; + +struct iommu_device; + +struct iommu_resv_region; + +struct of_phandle_args; + +struct iommu_sva; + +struct iommu_fault_event; + +struct iommu_page_response; + +struct iommu_cache_invalidate_info; + +struct iommu_gpasid_bind_data; + +struct iommu_ops { + bool (*capable)(enum iommu_cap); + struct iommu_domain * (*domain_alloc)(unsigned int); + void (*domain_free)(struct iommu_domain *); + int (*attach_dev)(struct iommu_domain *, struct device *); + void (*detach_dev)(struct iommu_domain *, struct device *); + int (*map)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, int, gfp_t); + int (*map_pages)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, size_t, int, gfp_t, size_t *); + size_t (*unmap)(struct iommu_domain *, long unsigned int, size_t, struct iommu_iotlb_gather *); + size_t (*unmap_pages)(struct iommu_domain *, long unsigned int, size_t, size_t, struct iommu_iotlb_gather *); + void (*flush_iotlb_all)(struct iommu_domain *); + void (*iotlb_sync_map)(struct iommu_domain *, long unsigned int, size_t); + void (*iotlb_sync)(struct iommu_domain *, struct iommu_iotlb_gather *); + phys_addr_t (*iova_to_phys)(struct iommu_domain *, dma_addr_t); + struct iommu_device * (*probe_device)(struct device *); + void (*release_device)(struct device *); + void (*probe_finalize)(struct device *); + struct iommu_group * (*device_group)(struct device *); + int (*enable_nesting)(struct iommu_domain *); + int (*set_pgtable_quirks)(struct iommu_domain *, long unsigned int); + void (*get_resv_regions)(struct device *, struct list_head *); + void (*put_resv_regions)(struct device *, struct list_head *); + void (*apply_resv_region)(struct device *, struct iommu_domain *, struct iommu_resv_region *); + int (*of_xlate)(struct device *, struct of_phandle_args *); + bool (*is_attach_deferred)(struct iommu_domain *, struct device *); + bool (*dev_has_feat)(struct device *, enum iommu_dev_features); + bool (*dev_feat_enabled)(struct device *, enum iommu_dev_features); + int (*dev_enable_feat)(struct device *, enum iommu_dev_features); + int (*dev_disable_feat)(struct device *, enum iommu_dev_features); + int (*aux_attach_dev)(struct iommu_domain *, struct device *); + void (*aux_detach_dev)(struct iommu_domain *, struct device *); + int (*aux_get_pasid)(struct iommu_domain *, struct device *); + struct iommu_sva * (*sva_bind)(struct device *, struct mm_struct *, void *); + void (*sva_unbind)(struct iommu_sva *); + u32 (*sva_get_pasid)(struct iommu_sva *); + int (*page_response)(struct device *, struct iommu_fault_event *, struct iommu_page_response *); + int (*cache_invalidate)(struct iommu_domain *, struct device *, struct iommu_cache_invalidate_info *); + int (*sva_bind_gpasid)(struct iommu_domain *, struct device *, struct iommu_gpasid_bind_data *); + int (*sva_unbind_gpasid)(struct device *, u32); + int (*def_domain_type)(struct device *); + long unsigned int pgsize_bitmap; + struct module *owner; +}; + +struct device_type { + const char *name; + const struct attribute_group **groups; + int (*uevent)(struct device *, struct kobj_uevent_env *); + char * (*devnode)(struct device *, umode_t *, kuid_t *, kgid_t *); + void (*release)(struct device *); + const struct dev_pm_ops *pm; +}; + +struct class { + const char *name; + struct module *owner; + const struct attribute_group **class_groups; + const struct attribute_group **dev_groups; + struct kobject *dev_kobj; + int (*dev_uevent)(struct device *, struct kobj_uevent_env *); + char * (*devnode)(struct device *, umode_t *); + void (*class_release)(struct class *); + void (*dev_release)(struct device *); + int (*shutdown_pre)(struct device *); + const struct kobj_ns_type_operations *ns_type; + const void * (*namespace)(struct device *); + void (*get_ownership)(struct device *, kuid_t *, kgid_t *); + const struct dev_pm_ops *pm; + struct subsys_private *p; +}; + +struct of_device_id { + char name[32]; + char type[32]; + char compatible[128]; + const void *data; +}; + +typedef long unsigned int kernel_ulong_t; + +struct acpi_device_id { + __u8 id[9]; + kernel_ulong_t driver_data; + __u32 cls; + __u32 cls_msk; +}; + +struct device_dma_parameters { + unsigned int max_segment_size; + unsigned int min_align_mask; + long unsigned int segment_boundary_mask; +}; + +enum irq_domain_bus_token { + DOMAIN_BUS_ANY = 0, + DOMAIN_BUS_WIRED = 1, + DOMAIN_BUS_GENERIC_MSI = 2, + DOMAIN_BUS_PCI_MSI = 3, + DOMAIN_BUS_PLATFORM_MSI = 4, + DOMAIN_BUS_NEXUS = 5, + DOMAIN_BUS_IPI = 6, + DOMAIN_BUS_FSL_MC_MSI = 7, + DOMAIN_BUS_TI_SCI_INTA_MSI = 8, + DOMAIN_BUS_WAKEUP = 9, + DOMAIN_BUS_VMD_MSI = 10, +}; + +struct irq_domain_ops; + +struct irq_domain_chip_generic; + +struct irq_data; + +struct irq_domain { + struct list_head link; + const char *name; + const struct irq_domain_ops *ops; + void *host_data; + unsigned int flags; + unsigned int mapcount; + struct fwnode_handle *fwnode; + enum irq_domain_bus_token bus_token; + struct irq_domain_chip_generic *gc; + struct irq_domain *parent; + irq_hw_number_t hwirq_max; + unsigned int revmap_size; + struct xarray revmap_tree; + struct mutex revmap_mutex; + struct irq_data *revmap[0]; +}; + +enum dma_data_direction { + DMA_BIDIRECTIONAL = 0, + DMA_TO_DEVICE = 1, + DMA_FROM_DEVICE = 2, + DMA_NONE = 3, +}; + +struct sg_table; + +struct scatterlist; + +struct dma_map_ops { + void * (*alloc)(struct device *, size_t, dma_addr_t *, gfp_t, long unsigned int); + void (*free)(struct device *, size_t, void *, dma_addr_t, long unsigned int); + struct page * (*alloc_pages)(struct device *, size_t, dma_addr_t *, enum dma_data_direction, gfp_t); + void (*free_pages)(struct device *, size_t, struct page *, dma_addr_t, enum dma_data_direction); + struct sg_table * (*alloc_noncontiguous)(struct device *, size_t, enum dma_data_direction, gfp_t, long unsigned int); + void (*free_noncontiguous)(struct device *, size_t, struct sg_table *, enum dma_data_direction); + int (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t, size_t, long unsigned int); + int (*get_sgtable)(struct device *, struct sg_table *, void *, dma_addr_t, size_t, long unsigned int); + dma_addr_t (*map_page)(struct device *, struct page *, long unsigned int, size_t, enum dma_data_direction, long unsigned int); + void (*unmap_page)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); + int (*map_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); + void (*unmap_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); + dma_addr_t (*map_resource)(struct device *, phys_addr_t, size_t, enum dma_data_direction, long unsigned int); + void (*unmap_resource)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); + void (*sync_single_for_cpu)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_single_for_device)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_sg_for_cpu)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*sync_sg_for_device)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*cache_sync)(struct device *, void *, size_t, enum dma_data_direction); + int (*dma_supported)(struct device *, u64); + u64 (*get_required_mask)(struct device *); + size_t (*max_mapping_size)(struct device *); + long unsigned int (*get_merge_boundary)(struct device *); +}; + +struct bus_dma_region { + phys_addr_t cpu_start; + dma_addr_t dma_start; + u64 size; + u64 offset; +}; + +typedef u32 phandle; + +struct fwnode_operations; + +struct fwnode_handle { + struct fwnode_handle *secondary; + const struct fwnode_operations *ops; + struct device *dev; + struct list_head suppliers; + struct list_head consumers; + u8 flags; +}; + +struct property; + +struct device_node { + const char *name; + phandle phandle; + const char *full_name; + struct fwnode_handle fwnode; + struct property *properties; + struct property *deadprops; + struct device_node *parent; + struct device_node *child; + struct device_node *sibling; + struct kobject kobj; + long unsigned int _flags; + void *data; +}; + +enum cpuhp_state { + CPUHP_INVALID = 4294967295, + CPUHP_OFFLINE = 0, + CPUHP_CREATE_THREADS = 1, + CPUHP_PERF_PREPARE = 2, + CPUHP_PERF_X86_PREPARE = 3, + CPUHP_PERF_X86_AMD_UNCORE_PREP = 4, + CPUHP_PERF_POWER = 5, + CPUHP_PERF_SUPERH = 6, + CPUHP_X86_HPET_DEAD = 7, + CPUHP_X86_APB_DEAD = 8, + CPUHP_X86_MCE_DEAD = 9, + CPUHP_VIRT_NET_DEAD = 10, + CPUHP_SLUB_DEAD = 11, + CPUHP_DEBUG_OBJ_DEAD = 12, + CPUHP_MM_WRITEBACK_DEAD = 13, + CPUHP_MM_DEMOTION_DEAD = 14, + CPUHP_MM_VMSTAT_DEAD = 15, + CPUHP_SOFTIRQ_DEAD = 16, + CPUHP_NET_MVNETA_DEAD = 17, + CPUHP_CPUIDLE_DEAD = 18, + CPUHP_ARM64_FPSIMD_DEAD = 19, + CPUHP_ARM_OMAP_WAKE_DEAD = 20, + CPUHP_IRQ_POLL_DEAD = 21, + CPUHP_BLOCK_SOFTIRQ_DEAD = 22, + CPUHP_BIO_DEAD = 23, + CPUHP_ACPI_CPUDRV_DEAD = 24, + CPUHP_S390_PFAULT_DEAD = 25, + CPUHP_BLK_MQ_DEAD = 26, + CPUHP_FS_BUFF_DEAD = 27, + CPUHP_PRINTK_DEAD = 28, + CPUHP_MM_MEMCQ_DEAD = 29, + CPUHP_XFS_DEAD = 30, + CPUHP_PERCPU_CNT_DEAD = 31, + CPUHP_RADIX_DEAD = 32, + CPUHP_PAGE_ALLOC = 33, + CPUHP_NET_DEV_DEAD = 34, + CPUHP_PCI_XGENE_DEAD = 35, + CPUHP_IOMMU_IOVA_DEAD = 36, + CPUHP_LUSTRE_CFS_DEAD = 37, + CPUHP_AP_ARM_CACHE_B15_RAC_DEAD = 38, + CPUHP_PADATA_DEAD = 39, + CPUHP_AP_DTPM_CPU_DEAD = 40, + CPUHP_WORKQUEUE_PREP = 41, + CPUHP_POWER_NUMA_PREPARE = 42, + CPUHP_HRTIMERS_PREPARE = 43, + CPUHP_PROFILE_PREPARE = 44, + CPUHP_X2APIC_PREPARE = 45, + CPUHP_SMPCFD_PREPARE = 46, + CPUHP_RELAY_PREPARE = 47, + CPUHP_SLAB_PREPARE = 48, + CPUHP_MD_RAID5_PREPARE = 49, + CPUHP_RCUTREE_PREP = 50, + CPUHP_CPUIDLE_COUPLED_PREPARE = 51, + CPUHP_POWERPC_PMAC_PREPARE = 52, + CPUHP_POWERPC_MMU_CTX_PREPARE = 53, + CPUHP_XEN_PREPARE = 54, + CPUHP_XEN_EVTCHN_PREPARE = 55, + CPUHP_ARM_SHMOBILE_SCU_PREPARE = 56, + CPUHP_SH_SH3X_PREPARE = 57, + CPUHP_NET_FLOW_PREPARE = 58, + CPUHP_TOPOLOGY_PREPARE = 59, + CPUHP_NET_IUCV_PREPARE = 60, + CPUHP_ARM_BL_PREPARE = 61, + CPUHP_TRACE_RB_PREPARE = 62, + CPUHP_MM_ZS_PREPARE = 63, + CPUHP_MM_ZSWP_MEM_PREPARE = 64, + CPUHP_MM_ZSWP_POOL_PREPARE = 65, + CPUHP_KVM_PPC_BOOK3S_PREPARE = 66, + CPUHP_ZCOMP_PREPARE = 67, + CPUHP_TIMERS_PREPARE = 68, + CPUHP_MIPS_SOC_PREPARE = 69, + CPUHP_BP_PREPARE_DYN = 70, + CPUHP_BP_PREPARE_DYN_END = 90, + CPUHP_BRINGUP_CPU = 91, + CPUHP_AP_IDLE_DEAD = 92, + CPUHP_AP_OFFLINE = 93, + CPUHP_AP_SCHED_STARTING = 94, + CPUHP_AP_RCUTREE_DYING = 95, + CPUHP_AP_CPU_PM_STARTING = 96, + CPUHP_AP_IRQ_GIC_STARTING = 97, + CPUHP_AP_IRQ_HIP04_STARTING = 98, + CPUHP_AP_IRQ_APPLE_AIC_STARTING = 99, + CPUHP_AP_IRQ_ARMADA_XP_STARTING = 100, + CPUHP_AP_IRQ_BCM2836_STARTING = 101, + CPUHP_AP_IRQ_MIPS_GIC_STARTING = 102, + CPUHP_AP_IRQ_RISCV_STARTING = 103, + CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING = 104, + CPUHP_AP_ARM_MVEBU_COHERENCY = 105, + CPUHP_AP_MICROCODE_LOADER = 106, + CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING = 107, + CPUHP_AP_PERF_X86_STARTING = 108, + CPUHP_AP_PERF_X86_AMD_IBS_STARTING = 109, + CPUHP_AP_PERF_X86_CQM_STARTING = 110, + CPUHP_AP_PERF_X86_CSTATE_STARTING = 111, + CPUHP_AP_PERF_XTENSA_STARTING = 112, + CPUHP_AP_MIPS_OP_LOONGSON3_STARTING = 113, + CPUHP_AP_ARM_SDEI_STARTING = 114, + CPUHP_AP_ARM_VFP_STARTING = 115, + CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING = 116, + CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING = 117, + CPUHP_AP_PERF_ARM_ACPI_STARTING = 118, + CPUHP_AP_PERF_ARM_STARTING = 119, + CPUHP_AP_ARM_L2X0_STARTING = 120, + CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING = 121, + CPUHP_AP_ARM_ARCH_TIMER_STARTING = 122, + CPUHP_AP_ARM_GLOBAL_TIMER_STARTING = 123, + CPUHP_AP_JCORE_TIMER_STARTING = 124, + CPUHP_AP_ARM_TWD_STARTING = 125, + CPUHP_AP_QCOM_TIMER_STARTING = 126, + CPUHP_AP_TEGRA_TIMER_STARTING = 127, + CPUHP_AP_ARMADA_TIMER_STARTING = 128, + CPUHP_AP_MARCO_TIMER_STARTING = 129, + CPUHP_AP_MIPS_GIC_TIMER_STARTING = 130, + CPUHP_AP_ARC_TIMER_STARTING = 131, + CPUHP_AP_RISCV_TIMER_STARTING = 132, + CPUHP_AP_CLINT_TIMER_STARTING = 133, + CPUHP_AP_CSKY_TIMER_STARTING = 134, + CPUHP_AP_TI_GP_TIMER_STARTING = 135, + CPUHP_AP_HYPERV_TIMER_STARTING = 136, + CPUHP_AP_KVM_STARTING = 137, + CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING = 138, + CPUHP_AP_KVM_ARM_VGIC_STARTING = 139, + CPUHP_AP_KVM_ARM_TIMER_STARTING = 140, + CPUHP_AP_DUMMY_TIMER_STARTING = 141, + CPUHP_AP_ARM_XEN_STARTING = 142, + CPUHP_AP_ARM_CORESIGHT_STARTING = 143, + CPUHP_AP_ARM_CORESIGHT_CTI_STARTING = 144, + CPUHP_AP_ARM64_ISNDEP_STARTING = 145, + CPUHP_AP_SMPCFD_DYING = 146, + CPUHP_AP_X86_TBOOT_DYING = 147, + CPUHP_AP_ARM_CACHE_B15_RAC_DYING = 148, + CPUHP_AP_ONLINE = 149, + CPUHP_TEARDOWN_CPU = 150, + CPUHP_AP_ONLINE_IDLE = 151, + CPUHP_AP_SCHED_WAIT_EMPTY = 152, + CPUHP_AP_SMPBOOT_THREADS = 153, + CPUHP_AP_X86_VDSO_VMA_ONLINE = 154, + CPUHP_AP_IRQ_AFFINITY_ONLINE = 155, + CPUHP_AP_BLK_MQ_ONLINE = 156, + CPUHP_AP_ARM_MVEBU_SYNC_CLOCKS = 157, + CPUHP_AP_X86_INTEL_EPB_ONLINE = 158, + CPUHP_AP_PERF_ONLINE = 159, + CPUHP_AP_PERF_X86_ONLINE = 160, + CPUHP_AP_PERF_X86_UNCORE_ONLINE = 161, + CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE = 162, + CPUHP_AP_PERF_X86_AMD_POWER_ONLINE = 163, + CPUHP_AP_PERF_X86_RAPL_ONLINE = 164, + CPUHP_AP_PERF_X86_CQM_ONLINE = 165, + CPUHP_AP_PERF_X86_CSTATE_ONLINE = 166, + CPUHP_AP_PERF_X86_IDXD_ONLINE = 167, + CPUHP_AP_PERF_S390_CF_ONLINE = 168, + CPUHP_AP_PERF_S390_SF_ONLINE = 169, + CPUHP_AP_PERF_ARM_CCI_ONLINE = 170, + CPUHP_AP_PERF_ARM_CCN_ONLINE = 171, + CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE = 172, + CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE = 173, + CPUHP_AP_PERF_ARM_HISI_L3_ONLINE = 174, + CPUHP_AP_PERF_ARM_HISI_PA_ONLINE = 175, + CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE = 176, + CPUHP_AP_PERF_ARM_L2X0_ONLINE = 177, + CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE = 178, + CPUHP_AP_PERF_ARM_QCOM_L3_ONLINE = 179, + CPUHP_AP_PERF_ARM_APM_XGENE_ONLINE = 180, + CPUHP_AP_PERF_ARM_CAVIUM_TX2_UNCORE_ONLINE = 181, + CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE = 182, + CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE = 183, + CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE = 184, + CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE = 185, + CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE = 186, + CPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE = 187, + CPUHP_AP_PERF_CSKY_ONLINE = 188, + CPUHP_AP_WATCHDOG_ONLINE = 189, + CPUHP_AP_WORKQUEUE_ONLINE = 190, + CPUHP_AP_RCUTREE_ONLINE = 191, + CPUHP_AP_BASE_CACHEINFO_ONLINE = 192, + CPUHP_AP_ONLINE_DYN = 193, + CPUHP_AP_ONLINE_DYN_END = 223, + CPUHP_AP_MM_DEMOTION_ONLINE = 224, + CPUHP_AP_X86_HPET_ONLINE = 225, + CPUHP_AP_X86_KVM_CLK_ONLINE = 226, + CPUHP_AP_ACTIVE = 227, + CPUHP_ONLINE = 228, +}; + +typedef void percpu_ref_func_t(struct percpu_ref *); + +struct percpu_ref_data { + atomic_long_t count; + percpu_ref_func_t *release; + percpu_ref_func_t *confirm_switch; + bool force_atomic: 1; + bool allow_reinit: 1; + struct callback_head rcu; + struct percpu_ref *ref; +}; + +struct dev_pagemap_ops { + void (*page_free)(struct page *); + void (*kill)(struct dev_pagemap *); + void (*cleanup)(struct dev_pagemap *); + vm_fault_t (*migrate_to_ram)(struct vm_fault *); +}; + +enum vm_event_item { + PGPGIN = 0, + PGPGOUT = 1, + PSWPIN = 2, + PSWPOUT = 3, + PGALLOC_DMA = 4, + PGALLOC_DMA32 = 5, + PGALLOC_NORMAL = 6, + PGALLOC_MOVABLE = 7, + ALLOCSTALL_DMA = 8, + ALLOCSTALL_DMA32 = 9, + ALLOCSTALL_NORMAL = 10, + ALLOCSTALL_MOVABLE = 11, + PGSCAN_SKIP_DMA = 12, + PGSCAN_SKIP_DMA32 = 13, + PGSCAN_SKIP_NORMAL = 14, + PGSCAN_SKIP_MOVABLE = 15, + PGFREE = 16, + PGACTIVATE = 17, + PGDEACTIVATE = 18, + PGLAZYFREE = 19, + PGFAULT = 20, + PGMAJFAULT = 21, + PGLAZYFREED = 22, + PGREFILL = 23, + PGREUSE = 24, + PGSTEAL_KSWAPD = 25, + PGSTEAL_DIRECT = 26, + PGDEMOTE_KSWAPD = 27, + PGDEMOTE_DIRECT = 28, + PGSCAN_KSWAPD = 29, + PGSCAN_DIRECT = 30, + PGSCAN_DIRECT_THROTTLE = 31, + PGSCAN_ANON = 32, + PGSCAN_FILE = 33, + PGSTEAL_ANON = 34, + PGSTEAL_FILE = 35, + PGSCAN_ZONE_RECLAIM_FAILED = 36, + PGINODESTEAL = 37, + SLABS_SCANNED = 38, + KSWAPD_INODESTEAL = 39, + KSWAPD_LOW_WMARK_HIT_QUICKLY = 40, + KSWAPD_HIGH_WMARK_HIT_QUICKLY = 41, + PAGEOUTRUN = 42, + PGROTATED = 43, + DROP_PAGECACHE = 44, + DROP_SLAB = 45, + OOM_KILL = 46, + NUMA_PTE_UPDATES = 47, + NUMA_HUGE_PTE_UPDATES = 48, + NUMA_HINT_FAULTS = 49, + NUMA_HINT_FAULTS_LOCAL = 50, + NUMA_PAGE_MIGRATE = 51, + PGMIGRATE_SUCCESS = 52, + PGMIGRATE_FAIL = 53, + THP_MIGRATION_SUCCESS = 54, + THP_MIGRATION_FAIL = 55, + THP_MIGRATION_SPLIT = 56, + COMPACTMIGRATE_SCANNED = 57, + COMPACTFREE_SCANNED = 58, + COMPACTISOLATED = 59, + COMPACTSTALL = 60, + COMPACTFAIL = 61, + COMPACTSUCCESS = 62, + KCOMPACTD_WAKE = 63, + KCOMPACTD_MIGRATE_SCANNED = 64, + KCOMPACTD_FREE_SCANNED = 65, + HTLB_BUDDY_PGALLOC = 66, + HTLB_BUDDY_PGALLOC_FAIL = 67, + CMA_ALLOC_SUCCESS = 68, + CMA_ALLOC_FAIL = 69, + UNEVICTABLE_PGCULLED = 70, + UNEVICTABLE_PGSCANNED = 71, + UNEVICTABLE_PGRESCUED = 72, + UNEVICTABLE_PGMLOCKED = 73, + UNEVICTABLE_PGMUNLOCKED = 74, + UNEVICTABLE_PGCLEARED = 75, + UNEVICTABLE_PGSTRANDED = 76, + THP_FAULT_ALLOC = 77, + THP_FAULT_FALLBACK = 78, + THP_FAULT_FALLBACK_CHARGE = 79, + THP_COLLAPSE_ALLOC = 80, + THP_COLLAPSE_ALLOC_FAILED = 81, + THP_FILE_ALLOC = 82, + THP_FILE_FALLBACK = 83, + THP_FILE_FALLBACK_CHARGE = 84, + THP_FILE_MAPPED = 85, + THP_SPLIT_PAGE = 86, + THP_SPLIT_PAGE_FAILED = 87, + THP_DEFERRED_SPLIT_PAGE = 88, + THP_SPLIT_PMD = 89, + THP_ZERO_PAGE_ALLOC = 90, + THP_ZERO_PAGE_ALLOC_FAILED = 91, + THP_SWPOUT = 92, + THP_SWPOUT_FALLBACK = 93, + BALLOON_INFLATE = 94, + BALLOON_DEFLATE = 95, + BALLOON_MIGRATE = 96, + SWAP_RA = 97, + SWAP_RA_HIT = 98, + NR_VM_EVENT_ITEMS = 99, +}; + +struct seq_operations { + void * (*start)(struct seq_file *, loff_t *); + void (*stop)(struct seq_file *, void *); + void * (*next)(struct seq_file *, void *, loff_t *); + int (*show)(struct seq_file *, void *); +}; + +struct ring_buffer_event { + u32 type_len: 5; + u32 time_delta: 27; + u32 array[0]; +}; + +struct seq_buf { + char *buffer; + size_t size; + size_t len; + loff_t readpos; +}; + +struct trace_seq { + char buffer[4096]; + struct seq_buf seq; + int full; +}; + +struct irq_desc; + +typedef void (*irq_flow_handler_t)(struct irq_desc *); + +struct msi_desc; + +struct irq_common_data { + unsigned int state_use_accessors; + unsigned int node; + void *handler_data; + struct msi_desc *msi_desc; + cpumask_var_t affinity; + cpumask_var_t effective_affinity; + unsigned int ipi_offset; +}; + +struct irq_chip; + +struct irq_data { + u32 mask; + unsigned int irq; + long unsigned int hwirq; + struct irq_common_data *common; + struct irq_chip *chip; + struct irq_domain *domain; + struct irq_data *parent_data; + void *chip_data; +}; + +struct irqaction; + +struct irq_affinity_notify; + +struct proc_dir_entry; + +struct irq_desc { + struct irq_common_data irq_common_data; + struct irq_data irq_data; + unsigned int *kstat_irqs; + irq_flow_handler_t handle_irq; + struct irqaction *action; + unsigned int status_use_accessors; + unsigned int core_internal_state__do_not_mess_with_it; + unsigned int depth; + unsigned int wake_depth; + unsigned int tot_count; + unsigned int irq_count; + long unsigned int last_unhandled; + unsigned int irqs_unhandled; + atomic_t threads_handled; + int threads_handled_last; + raw_spinlock_t lock; + struct cpumask *percpu_enabled; + const struct cpumask *percpu_affinity; + const struct cpumask *affinity_hint; + struct irq_affinity_notify *affinity_notify; + long unsigned int threads_oneshot; + atomic_t threads_active; + wait_queue_head_t wait_for_threads; + unsigned int nr_actions; + unsigned int no_suspend_depth; + unsigned int cond_suspend_depth; + unsigned int force_resume_depth; + struct proc_dir_entry *dir; + struct callback_head rcu; + struct kobject kobj; + struct mutex request_mutex; + int parent_irq; + struct module *owner; + const char *name; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum irqreturn { + IRQ_NONE = 0, + IRQ_HANDLED = 1, + IRQ_WAKE_THREAD = 2, +}; + +typedef enum irqreturn irqreturn_t; + +struct fwnode_reference_args; + +struct fwnode_endpoint; + +struct fwnode_operations { + struct fwnode_handle * (*get)(struct fwnode_handle *); + void (*put)(struct fwnode_handle *); + bool (*device_is_available)(const struct fwnode_handle *); + const void * (*device_get_match_data)(const struct fwnode_handle *, const struct device *); + bool (*property_present)(const struct fwnode_handle *, const char *); + int (*property_read_int_array)(const struct fwnode_handle *, const char *, unsigned int, void *, size_t); + int (*property_read_string_array)(const struct fwnode_handle *, const char *, const char **, size_t); + const char * (*get_name)(const struct fwnode_handle *); + const char * (*get_name_prefix)(const struct fwnode_handle *); + struct fwnode_handle * (*get_parent)(const struct fwnode_handle *); + struct fwnode_handle * (*get_next_child_node)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*get_named_child_node)(const struct fwnode_handle *, const char *); + int (*get_reference_args)(const struct fwnode_handle *, const char *, const char *, unsigned int, unsigned int, struct fwnode_reference_args *); + struct fwnode_handle * (*graph_get_next_endpoint)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*graph_get_remote_endpoint)(const struct fwnode_handle *); + struct fwnode_handle * (*graph_get_port_parent)(struct fwnode_handle *); + int (*graph_parse_endpoint)(const struct fwnode_handle *, struct fwnode_endpoint *); + int (*add_links)(struct fwnode_handle *); +}; + +struct fwnode_endpoint { + unsigned int port; + unsigned int id; + const struct fwnode_handle *local_fwnode; +}; + +struct fwnode_reference_args { + struct fwnode_handle *fwnode; + unsigned int nargs; + u64 args[8]; +}; + +enum kmalloc_cache_type { + KMALLOC_NORMAL = 0, + KMALLOC_CGROUP = 1, + KMALLOC_RECLAIM = 2, + KMALLOC_DMA = 3, + NR_KMALLOC_TYPES = 4, +}; + +enum irqchip_irq_state { + IRQCHIP_STATE_PENDING = 0, + IRQCHIP_STATE_ACTIVE = 1, + IRQCHIP_STATE_MASKED = 2, + IRQCHIP_STATE_LINE_LEVEL = 3, +}; + +struct msi_msg; + +struct irq_chip { + struct device *parent_device; + const char *name; + unsigned int (*irq_startup)(struct irq_data *); + void (*irq_shutdown)(struct irq_data *); + void (*irq_enable)(struct irq_data *); + void (*irq_disable)(struct irq_data *); + void (*irq_ack)(struct irq_data *); + void (*irq_mask)(struct irq_data *); + void (*irq_mask_ack)(struct irq_data *); + void (*irq_unmask)(struct irq_data *); + void (*irq_eoi)(struct irq_data *); + int (*irq_set_affinity)(struct irq_data *, const struct cpumask *, bool); + int (*irq_retrigger)(struct irq_data *); + int (*irq_set_type)(struct irq_data *, unsigned int); + int (*irq_set_wake)(struct irq_data *, unsigned int); + void (*irq_bus_lock)(struct irq_data *); + void (*irq_bus_sync_unlock)(struct irq_data *); + void (*irq_suspend)(struct irq_data *); + void (*irq_resume)(struct irq_data *); + void (*irq_pm_shutdown)(struct irq_data *); + void (*irq_calc_mask)(struct irq_data *); + void (*irq_print_chip)(struct irq_data *, struct seq_file *); + int (*irq_request_resources)(struct irq_data *); + void (*irq_release_resources)(struct irq_data *); + void (*irq_compose_msi_msg)(struct irq_data *, struct msi_msg *); + void (*irq_write_msi_msg)(struct irq_data *, struct msi_msg *); + int (*irq_get_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool *); + int (*irq_set_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool); + int (*irq_set_vcpu_affinity)(struct irq_data *, void *); + void (*ipi_send_single)(struct irq_data *, unsigned int); + void (*ipi_send_mask)(struct irq_data *, const struct cpumask *); + int (*irq_nmi_setup)(struct irq_data *); + void (*irq_nmi_teardown)(struct irq_data *); + long unsigned int flags; +}; + +typedef irqreturn_t (*irq_handler_t)(int, void *); + +struct irqaction { + irq_handler_t handler; + void *dev_id; + void *percpu_dev_id; + struct irqaction *next; + irq_handler_t thread_fn; + struct task_struct *thread; + struct irqaction *secondary; + unsigned int irq; + unsigned int flags; + long unsigned int thread_flags; + long unsigned int thread_mask; + const char *name; + struct proc_dir_entry *dir; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct irq_affinity_notify { + unsigned int irq; + struct kref kref; + struct work_struct work; + void (*notify)(struct irq_affinity_notify *, const cpumask_t *); + void (*release)(struct kref *); +}; + +struct irq_chip_regs { + long unsigned int enable; + long unsigned int disable; + long unsigned int mask; + long unsigned int ack; + long unsigned int eoi; + long unsigned int type; + long unsigned int polarity; +}; + +struct irq_chip_type { + struct irq_chip chip; + struct irq_chip_regs regs; + irq_flow_handler_t handler; + u32 type; + u32 mask_cache_priv; + u32 *mask_cache; +}; + +struct irq_chip_generic { + raw_spinlock_t lock; + void *reg_base; + u32 (*reg_readl)(void *); + void (*reg_writel)(u32, void *); + void (*suspend)(struct irq_chip_generic *); + void (*resume)(struct irq_chip_generic *); + unsigned int irq_base; + unsigned int irq_cnt; + u32 mask_cache; + u32 type_cache; + u32 polarity_cache; + u32 wake_enabled; + u32 wake_active; + unsigned int num_ct; + void *private; + long unsigned int installed; + long unsigned int unused; + struct irq_domain *domain; + struct list_head list; + struct irq_chip_type chip_types[0]; +}; + +enum irq_gc_flags { + IRQ_GC_INIT_MASK_CACHE = 1, + IRQ_GC_INIT_NESTED_LOCK = 2, + IRQ_GC_MASK_CACHE_PER_TYPE = 4, + IRQ_GC_NO_MASK = 8, + IRQ_GC_BE_IO = 16, +}; + +struct irq_domain_chip_generic { + unsigned int irqs_per_chip; + unsigned int num_chips; + unsigned int irq_flags_to_clear; + unsigned int irq_flags_to_set; + enum irq_gc_flags gc_flags; + struct irq_chip_generic *gc[0]; +}; + +enum perf_sw_ids { + PERF_COUNT_SW_CPU_CLOCK = 0, + PERF_COUNT_SW_TASK_CLOCK = 1, + PERF_COUNT_SW_PAGE_FAULTS = 2, + PERF_COUNT_SW_CONTEXT_SWITCHES = 3, + PERF_COUNT_SW_CPU_MIGRATIONS = 4, + PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, + PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, + PERF_COUNT_SW_EMULATION_FAULTS = 8, + PERF_COUNT_SW_DUMMY = 9, + PERF_COUNT_SW_BPF_OUTPUT = 10, + PERF_COUNT_SW_CGROUP_SWITCHES = 11, + PERF_COUNT_SW_MAX = 12, +}; + +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_op: 5; + __u64 mem_lvl: 14; + __u64 mem_snoop: 5; + __u64 mem_lock: 2; + __u64 mem_dtlb: 7; + __u64 mem_lvl_num: 4; + __u64 mem_remote: 1; + __u64 mem_snoopx: 2; + __u64 mem_blk: 3; + __u64 mem_hops: 3; + __u64 mem_rsvd: 18; + }; +}; + +struct perf_branch_entry { + __u64 from; + __u64 to; + __u64 mispred: 1; + __u64 predicted: 1; + __u64 in_tx: 1; + __u64 abort: 1; + __u64 cycles: 16; + __u64 type: 4; + __u64 reserved: 40; +}; + +union perf_sample_weight { + __u64 full; + struct { + __u32 var1_dw; + __u16 var2_w; + __u16 var3_w; + }; +}; + +struct new_utsname { + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; + char domainname[65]; +}; + +struct uts_namespace { + struct new_utsname name; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; +}; + +struct cgroup_namespace { + struct ns_common ns; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct css_set *root_cset; +}; + +struct nsset { + unsigned int flags; + struct nsproxy *nsproxy; + struct fs_struct *fs; + const struct cred *cred; +}; + +struct proc_ns_operations { + const char *name; + const char *real_ns_name; + int type; + struct ns_common * (*get)(struct task_struct *); + void (*put)(struct ns_common *); + int (*install)(struct nsset *, struct ns_common *); + struct user_namespace * (*owner)(struct ns_common *); + struct ns_common * (*get_parent)(struct ns_common *); +}; + +struct iovec { + void *iov_base; + __kernel_size_t iov_len; +}; + +struct kvec { + void *iov_base; + size_t iov_len; +}; + +struct ftrace_regs { + struct pt_regs regs; +}; + +struct perf_regs { + __u64 abi; + struct pt_regs *regs; +}; + +struct u64_stats_sync {}; + +struct bpf_cgroup_storage_key { + __u64 cgroup_inode_id; + __u32 attach_type; +}; + +struct bpf_storage_buffer; + +struct bpf_cgroup_storage_map; + +struct bpf_cgroup_storage { + union { + struct bpf_storage_buffer *buf; + void *percpu_buf; + }; + struct bpf_cgroup_storage_map *map; + struct bpf_cgroup_storage_key key; + struct list_head list_map; + struct list_head list_cg; + struct rb_node node; + struct callback_head rcu; +}; + +struct bpf_prog_array_item { + struct bpf_prog *prog; + union { + struct bpf_cgroup_storage *cgroup_storage[2]; + u64 bpf_cookie; + }; +}; + +struct bpf_prog_array { + struct callback_head rcu; + struct bpf_prog_array_item items[0]; +}; + +struct bpf_storage_buffer { + struct callback_head rcu; + char data[0]; +}; + +struct psi_group_cpu { + seqcount_t seq; + unsigned int tasks[4]; + u32 state_mask; + u32 times[7]; + u64 state_start; + u32 times_prev[14]; + long: 64; +}; + +struct cgroup_taskset; + +struct cftype; + +struct cgroup_subsys { + struct cgroup_subsys_state * (*css_alloc)(struct cgroup_subsys_state *); + int (*css_online)(struct cgroup_subsys_state *); + void (*css_offline)(struct cgroup_subsys_state *); + void (*css_released)(struct cgroup_subsys_state *); + void (*css_free)(struct cgroup_subsys_state *); + void (*css_reset)(struct cgroup_subsys_state *); + void (*css_rstat_flush)(struct cgroup_subsys_state *, int); + int (*css_extra_stat_show)(struct seq_file *, struct cgroup_subsys_state *); + int (*can_attach)(struct cgroup_taskset *); + void (*cancel_attach)(struct cgroup_taskset *); + void (*attach)(struct cgroup_taskset *); + void (*post_attach)(); + int (*can_fork)(struct task_struct *, struct css_set *); + void (*cancel_fork)(struct task_struct *, struct css_set *); + void (*fork)(struct task_struct *); + void (*exit)(struct task_struct *); + void (*release)(struct task_struct *); + void (*bind)(struct cgroup_subsys_state *); + bool early_init: 1; + bool implicit_on_dfl: 1; + bool threaded: 1; + int id; + const char *name; + const char *legacy_name; + struct cgroup_root *root; + struct idr css_idr; + struct list_head cfts; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + unsigned int depends_on; +}; + +struct cgroup_rstat_cpu { + struct u64_stats_sync bsync; + struct cgroup_base_stat bstat; + struct cgroup_base_stat last_bstat; + struct cgroup *updated_children; + struct cgroup *updated_next; +}; + +struct cgroup_root { + struct kernfs_root *kf_root; + unsigned int subsys_mask; + int hierarchy_id; + struct cgroup cgrp; + u64 cgrp_ancestor_id_storage; + atomic_t nr_cgrps; + struct list_head root_list; + unsigned int flags; + char release_agent_path[4096]; + char name[64]; +}; + +struct cftype { + char name[64]; + long unsigned int private; + size_t max_write_len; + unsigned int flags; + unsigned int file_offset; + struct cgroup_subsys *ss; + struct list_head node; + struct kernfs_ops *kf_ops; + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + u64 (*read_u64)(struct cgroup_subsys_state *, struct cftype *); + s64 (*read_s64)(struct cgroup_subsys_state *, struct cftype *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + int (*write_u64)(struct cgroup_subsys_state *, struct cftype *, u64); + int (*write_s64)(struct cgroup_subsys_state *, struct cftype *, s64); + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); +}; + +struct perf_callchain_entry { + __u64 nr; + __u64 ip[0]; +}; + +typedef long unsigned int (*perf_copy_f)(void *, const void *, long unsigned int, long unsigned int); + +struct perf_raw_frag { + union { + struct perf_raw_frag *next; + long unsigned int pad; + }; + perf_copy_f copy; + void *data; + u32 size; +} __attribute__((packed)); + +struct perf_raw_record { + struct perf_raw_frag frag; + u32 size; +}; + +struct perf_branch_stack { + __u64 nr; + __u64 hw_idx; + struct perf_branch_entry entries[0]; +}; + +struct perf_cpu_context; + +struct perf_output_handle; + +struct pmu { + struct list_head entry; + struct module *module; + struct device *dev; + const struct attribute_group **attr_groups; + const struct attribute_group **attr_update; + const char *name; + int type; + int capabilities; + int *pmu_disable_count; + struct perf_cpu_context *pmu_cpu_context; + atomic_t exclusive_cnt; + int task_ctx_nr; + int hrtimer_interval_ms; + unsigned int nr_addr_filters; + void (*pmu_enable)(struct pmu *); + void (*pmu_disable)(struct pmu *); + int (*event_init)(struct perf_event *); + void (*event_mapped)(struct perf_event *, struct mm_struct *); + void (*event_unmapped)(struct perf_event *, struct mm_struct *); + int (*add)(struct perf_event *, int); + void (*del)(struct perf_event *, int); + void (*start)(struct perf_event *, int); + void (*stop)(struct perf_event *, int); + void (*read)(struct perf_event *); + void (*start_txn)(struct pmu *, unsigned int); + int (*commit_txn)(struct pmu *); + void (*cancel_txn)(struct pmu *); + int (*event_idx)(struct perf_event *); + void (*sched_task)(struct perf_event_context *, bool); + struct kmem_cache *task_ctx_cache; + void (*swap_task_ctx)(struct perf_event_context *, struct perf_event_context *); + void * (*setup_aux)(struct perf_event *, void **, int, bool); + void (*free_aux)(void *); + long int (*snapshot_aux)(struct perf_event *, struct perf_output_handle *, long unsigned int); + int (*addr_filters_validate)(struct list_head *); + void (*addr_filters_sync)(struct perf_event *); + int (*aux_output_match)(struct perf_event *); + int (*filter_match)(struct perf_event *); + int (*check_period)(struct perf_event *, u64); +}; + +struct perf_cpu_context { + struct perf_event_context ctx; + struct perf_event_context *task_ctx; + int active_oncpu; + int exclusive; + raw_spinlock_t hrtimer_lock; + struct hrtimer hrtimer; + ktime_t hrtimer_interval; + unsigned int hrtimer_active; + struct perf_cgroup *cgrp; + struct list_head cgrp_cpuctx_entry; + struct list_head sched_cb_entry; + int sched_cb_usage; + int online; + int heap_size; + struct perf_event **heap; + struct perf_event *heap_default[2]; +}; + +struct perf_output_handle { + struct perf_event *event; + struct perf_buffer *rb; + long unsigned int wakeup; + long unsigned int size; + u64 aux_flags; + union { + void *addr; + long unsigned int head; + }; + int page; +}; + +struct perf_addr_filter_range { + long unsigned int start; + long unsigned int size; +}; + +struct perf_sample_data { + u64 addr; + struct perf_raw_record *raw; + struct perf_branch_stack *br_stack; + u64 period; + union perf_sample_weight weight; + u64 txn; + union perf_mem_data_src data_src; + u64 type; + u64 ip; + struct { + u32 pid; + u32 tid; + } tid_entry; + u64 time; + u64 id; + u64 stream_id; + struct { + u32 cpu; + u32 reserved; + } cpu_entry; + struct perf_callchain_entry *callchain; + u64 aux_size; + struct perf_regs regs_user; + struct perf_regs regs_intr; + u64 stack_user_size; + u64 phys_addr; + u64 cgroup; + u64 data_page_size; + u64 code_page_size; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct perf_cgroup_info; + +struct perf_cgroup { + struct cgroup_subsys_state css; + struct perf_cgroup_info *info; +}; + +struct perf_cgroup_info { + u64 time; + u64 timestamp; +}; + +struct trace_entry { + short unsigned int type; + unsigned char flags; + unsigned char preempt_count; + int pid; +}; + +struct trace_array; + +struct tracer; + +struct array_buffer; + +struct ring_buffer_iter; + +struct trace_iterator { + struct trace_array *tr; + struct tracer *trace; + struct array_buffer *array_buffer; + void *private; + int cpu_file; + struct mutex mutex; + struct ring_buffer_iter **buffer_iter; + long unsigned int iter_flags; + void *temp; + unsigned int temp_size; + char *fmt; + unsigned int fmt_size; + struct trace_seq tmp_seq; + cpumask_var_t started; + bool snapshot; + struct trace_seq seq; + struct trace_entry *ent; + long unsigned int lost_events; + int leftover; + int ent_size; + int cpu; + u64 ts; + loff_t pos; + long int idx; +}; + +enum print_line_t { + TRACE_TYPE_PARTIAL_LINE = 0, + TRACE_TYPE_HANDLED = 1, + TRACE_TYPE_UNHANDLED = 2, + TRACE_TYPE_NO_CONSUME = 3, +}; + +typedef enum print_line_t (*trace_print_func)(struct trace_iterator *, int, struct trace_event *); + +struct trace_event_functions { + trace_print_func trace; + trace_print_func raw; + trace_print_func hex; + trace_print_func binary; +}; + +enum trace_reg { + TRACE_REG_REGISTER = 0, + TRACE_REG_UNREGISTER = 1, + TRACE_REG_PERF_REGISTER = 2, + TRACE_REG_PERF_UNREGISTER = 3, + TRACE_REG_PERF_OPEN = 4, + TRACE_REG_PERF_CLOSE = 5, + TRACE_REG_PERF_ADD = 6, + TRACE_REG_PERF_DEL = 7, +}; + +struct trace_event_fields { + const char *type; + union { + struct { + const char *name; + const int size; + const int align; + const int is_signed; + const int filter_type; + }; + int (*define_fields)(struct trace_event_call *); + }; +}; + +struct trace_event_class { + const char *system; + void *probe; + void *perf_probe; + int (*reg)(struct trace_event_call *, enum trace_reg, void *); + struct trace_event_fields *fields_array; + struct list_head * (*get_fields)(struct trace_event_call *); + struct list_head fields; + int (*raw_init)(struct trace_event_call *); +}; + +struct trace_buffer; + +struct trace_event_file; + +struct trace_event_buffer { + struct trace_buffer *buffer; + struct ring_buffer_event *event; + struct trace_event_file *trace_file; + void *entry; + unsigned int trace_ctx; + struct pt_regs *regs; +}; + +struct trace_subsystem_dir; + +struct trace_event_file { + struct list_head list; + struct trace_event_call *event_call; + struct event_filter *filter; + struct dentry *dir; + struct trace_array *tr; + struct trace_subsystem_dir *system; + struct list_head triggers; + long unsigned int flags; + atomic_t sm_ref; + atomic_t tm_ref; +}; + +enum { + TRACE_EVENT_FL_FILTERED_BIT = 0, + TRACE_EVENT_FL_CAP_ANY_BIT = 1, + TRACE_EVENT_FL_NO_SET_FILTER_BIT = 2, + TRACE_EVENT_FL_IGNORE_ENABLE_BIT = 3, + TRACE_EVENT_FL_TRACEPOINT_BIT = 4, + TRACE_EVENT_FL_DYNAMIC_BIT = 5, + TRACE_EVENT_FL_KPROBE_BIT = 6, + TRACE_EVENT_FL_UPROBE_BIT = 7, + TRACE_EVENT_FL_EPROBE_BIT = 8, +}; + +enum { + TRACE_EVENT_FL_FILTERED = 1, + TRACE_EVENT_FL_CAP_ANY = 2, + TRACE_EVENT_FL_NO_SET_FILTER = 4, + TRACE_EVENT_FL_IGNORE_ENABLE = 8, + TRACE_EVENT_FL_TRACEPOINT = 16, + TRACE_EVENT_FL_DYNAMIC = 32, + TRACE_EVENT_FL_KPROBE = 64, + TRACE_EVENT_FL_UPROBE = 128, + TRACE_EVENT_FL_EPROBE = 256, +}; + +enum { + EVENT_FILE_FL_ENABLED_BIT = 0, + EVENT_FILE_FL_RECORDED_CMD_BIT = 1, + EVENT_FILE_FL_RECORDED_TGID_BIT = 2, + EVENT_FILE_FL_FILTERED_BIT = 3, + EVENT_FILE_FL_NO_SET_FILTER_BIT = 4, + EVENT_FILE_FL_SOFT_MODE_BIT = 5, + EVENT_FILE_FL_SOFT_DISABLED_BIT = 6, + EVENT_FILE_FL_TRIGGER_MODE_BIT = 7, + EVENT_FILE_FL_TRIGGER_COND_BIT = 8, + EVENT_FILE_FL_PID_FILTER_BIT = 9, + EVENT_FILE_FL_WAS_ENABLED_BIT = 10, +}; + +enum { + EVENT_FILE_FL_ENABLED = 1, + EVENT_FILE_FL_RECORDED_CMD = 2, + EVENT_FILE_FL_RECORDED_TGID = 4, + EVENT_FILE_FL_FILTERED = 8, + EVENT_FILE_FL_NO_SET_FILTER = 16, + EVENT_FILE_FL_SOFT_MODE = 32, + EVENT_FILE_FL_SOFT_DISABLED = 64, + EVENT_FILE_FL_TRIGGER_MODE = 128, + EVENT_FILE_FL_TRIGGER_COND = 256, + EVENT_FILE_FL_PID_FILTER = 512, + EVENT_FILE_FL_WAS_ENABLED = 1024, +}; + +enum event_trigger_type { + ETT_NONE = 0, + ETT_TRACE_ONOFF = 1, + ETT_SNAPSHOT = 2, + ETT_STACKTRACE = 4, + ETT_EVENT_ENABLE = 8, + ETT_EVENT_HIST = 16, + ETT_HIST_ENABLE = 32, + ETT_EVENT_EPROBE = 64, +}; + +enum { + FILTER_OTHER = 0, + FILTER_STATIC_STRING = 1, + FILTER_DYN_STRING = 2, + FILTER_PTR_STRING = 3, + FILTER_TRACE_FN = 4, + FILTER_COMM = 5, + FILTER_CPU = 6, +}; + +struct property { + char *name; + int length; + void *value; + struct property *next; + long unsigned int _flags; + struct bin_attribute attr; +}; + +struct irq_fwspec { + struct fwnode_handle *fwnode; + int param_count; + u32 param[16]; +}; + +struct irq_domain_ops { + int (*match)(struct irq_domain *, struct device_node *, enum irq_domain_bus_token); + int (*select)(struct irq_domain *, struct irq_fwspec *, enum irq_domain_bus_token); + int (*map)(struct irq_domain *, unsigned int, irq_hw_number_t); + void (*unmap)(struct irq_domain *, unsigned int); + int (*xlate)(struct irq_domain *, struct device_node *, const u32 *, unsigned int, long unsigned int *, unsigned int *); + int (*alloc)(struct irq_domain *, unsigned int, unsigned int, void *); + void (*free)(struct irq_domain *, unsigned int, unsigned int); + int (*activate)(struct irq_domain *, struct irq_data *, bool); + void (*deactivate)(struct irq_domain *, struct irq_data *); + int (*translate)(struct irq_domain *, struct irq_fwspec *, long unsigned int *, unsigned int *); +}; + +struct xbc_node { + uint16_t next; + uint16_t child; + uint16_t parent; + uint16_t data; +}; + +enum wb_stat_item { + WB_RECLAIMABLE = 0, + WB_WRITEBACK = 1, + WB_DIRTIED = 2, + WB_WRITTEN = 3, + NR_WB_STAT_ITEMS = 4, +}; + +struct block_device_operations; + +struct timer_rand_state; + +struct disk_events; + +struct cdrom_device_info; + +struct badblocks; + +struct gendisk { + int major; + int first_minor; + int minors; + char disk_name[32]; + short unsigned int events; + short unsigned int event_flags; + struct xarray part_tbl; + struct block_device *part0; + const struct block_device_operations *fops; + struct request_queue *queue; + void *private_data; + int flags; + long unsigned int state; + struct mutex open_mutex; + unsigned int open_partitions; + struct backing_dev_info *bdi; + struct kobject *slave_dir; + struct list_head slave_bdevs; + struct timer_rand_state *random; + atomic_t sync_io; + struct disk_events *ev; + struct kobject integrity_kobj; + struct cdrom_device_info *cdi; + int node_id; + struct badblocks *bb; + struct lockdep_map lockdep_map; + u64 diskseq; +}; + +struct partition_meta_info { + char uuid[37]; + u8 volname[64]; +}; + +struct bio_integrity_payload { + struct bio *bip_bio; + struct bvec_iter bip_iter; + short unsigned int bip_vcnt; + short unsigned int bip_max_vcnt; + short unsigned int bip_flags; + struct bvec_iter bio_iter; + short: 16; + struct work_struct bip_work; + struct bio_vec *bip_vec; + struct bio_vec bip_inline_vecs[0]; +} __attribute__((packed)); + +enum memcg_stat_item { + MEMCG_SWAP = 40, + MEMCG_SOCK = 41, + MEMCG_PERCPU_B = 42, + MEMCG_NR_STAT = 43, +}; + +enum memcg_memory_event { + MEMCG_LOW = 0, + MEMCG_HIGH = 1, + MEMCG_MAX = 2, + MEMCG_OOM = 3, + MEMCG_OOM_KILL = 4, + MEMCG_SWAP_HIGH = 5, + MEMCG_SWAP_MAX = 6, + MEMCG_SWAP_FAIL = 7, + MEMCG_NR_MEMORY_EVENTS = 8, +}; + +enum mem_cgroup_events_target { + MEM_CGROUP_TARGET_THRESH = 0, + MEM_CGROUP_TARGET_SOFTLIMIT = 1, + MEM_CGROUP_NTARGETS = 2, +}; + +struct memcg_vmstats_percpu { + long int state[43]; + long unsigned int events[99]; + long int state_prev[43]; + long unsigned int events_prev[99]; + long unsigned int nr_page_events; + long unsigned int targets[2]; +}; + +struct mem_cgroup_reclaim_iter { + struct mem_cgroup *position; + unsigned int generation; +}; + +struct shrinker_info { + struct callback_head rcu; + atomic_long_t *nr_deferred; + long unsigned int *map; +}; + +struct lruvec_stats_percpu { + long int state[40]; + long int state_prev[40]; +}; + +struct lruvec_stats { + long int state[40]; + long int state_pending[40]; +}; + +struct mem_cgroup_per_node { + struct lruvec lruvec; + struct lruvec_stats_percpu *lruvec_stats_percpu; + struct lruvec_stats lruvec_stats; + long unsigned int lru_zone_size[25]; + struct mem_cgroup_reclaim_iter iter; + struct shrinker_info *shrinker_info; + struct rb_node tree_node; + long unsigned int usage_in_excess; + bool on_tree; + struct mem_cgroup *memcg; +}; + +struct eventfd_ctx; + +struct mem_cgroup_threshold { + struct eventfd_ctx *eventfd; + long unsigned int threshold; +}; + +struct mem_cgroup_threshold_ary { + int current_threshold; + unsigned int size; + struct mem_cgroup_threshold entries[0]; +}; + +struct obj_cgroup { + struct percpu_ref refcnt; + struct mem_cgroup *memcg; + atomic_t nr_charged_bytes; + union { + struct list_head list; + struct callback_head rcu; + }; +}; + +struct percpu_cluster { + struct swap_cluster_info index; + unsigned int next; +}; + +enum fs_value_type { + fs_value_is_undefined = 0, + fs_value_is_flag = 1, + fs_value_is_string = 2, + fs_value_is_blob = 3, + fs_value_is_filename = 4, + fs_value_is_file = 5, +}; + +struct fs_parameter { + const char *key; + enum fs_value_type type: 8; + union { + char *string; + void *blob; + struct filename *name; + struct file *file; + }; + size_t size; + int dirfd; +}; + +struct fc_log { + refcount_t usage; + u8 head; + u8 tail; + u8 need_free; + struct module *owner; + char *buffer[8]; +}; + +struct fs_context_operations { + void (*free)(struct fs_context *); + int (*dup)(struct fs_context *, struct fs_context *); + int (*parse_param)(struct fs_context *, struct fs_parameter *); + int (*parse_monolithic)(struct fs_context *, void *); + int (*get_tree)(struct fs_context *); + int (*reconfigure)(struct fs_context *); +}; + +struct fs_parse_result { + bool negated; + union { + bool boolean; + int int_32; + unsigned int uint_32; + u64 uint_64; + }; +}; + +struct blk_integrity_iter; + +typedef blk_status_t integrity_processing_fn(struct blk_integrity_iter *); + +typedef void integrity_prepare_fn(struct request *); + +typedef void integrity_complete_fn(struct request *, unsigned int); + +struct blk_integrity_profile { + integrity_processing_fn *generate_fn; + integrity_processing_fn *verify_fn; + integrity_prepare_fn *prepare_fn; + integrity_complete_fn *complete_fn; + const char *name; +}; + +struct blk_zone; + +typedef int (*report_zones_cb)(struct blk_zone *, unsigned int, void *); + +enum blk_unique_id { + BLK_UID_T10 = 1, + BLK_UID_EUI64 = 2, + BLK_UID_NAA = 3, +}; + +struct hd_geometry; + +struct pr_ops; + +struct block_device_operations { + void (*submit_bio)(struct bio *); + int (*open)(struct block_device *, fmode_t); + void (*release)(struct gendisk *, fmode_t); + int (*rw_page)(struct block_device *, sector_t, struct page *, unsigned int); + int (*ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); + int (*compat_ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); + unsigned int (*check_events)(struct gendisk *, unsigned int); + void (*unlock_native_capacity)(struct gendisk *); + int (*getgeo)(struct block_device *, struct hd_geometry *); + int (*set_read_only)(struct block_device *, bool); + void (*swap_slot_free_notify)(struct block_device *, long unsigned int); + int (*report_zones)(struct gendisk *, sector_t, unsigned int, report_zones_cb, void *); + char * (*devnode)(struct gendisk *, umode_t *); + int (*get_unique_id)(struct gendisk *, u8 *, enum blk_unique_id); + struct module *owner; + const struct pr_ops *pr_ops; + int (*alternative_gpt_sector)(struct gendisk *, sector_t *); +}; + +struct blk_zone { + __u64 start; + __u64 len; + __u64 wp; + __u8 type; + __u8 cond; + __u8 non_seq; + __u8 reset; + __u8 resv[4]; + __u64 capacity; + __u8 reserved[24]; +}; + +struct blk_independent_access_range { + struct kobject kobj; + struct request_queue *queue; + sector_t sector; + sector_t nr_sectors; +}; + +struct blk_independent_access_ranges { + struct kobject kobj; + bool sysfs_registered; + unsigned int nr_ia_ranges; + struct blk_independent_access_range ia_range[0]; +}; + +enum blk_eh_timer_return { + BLK_EH_DONE = 0, + BLK_EH_RESET_TIMER = 1, +}; + +struct blk_mq_queue_data; + +struct blk_mq_ops { + blk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *); + void (*commit_rqs)(struct blk_mq_hw_ctx *); + int (*get_budget)(struct request_queue *); + void (*put_budget)(struct request_queue *, int); + void (*set_rq_budget_token)(struct request *, int); + int (*get_rq_budget_token)(struct request *); + enum blk_eh_timer_return (*timeout)(struct request *, bool); + int (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *); + void (*complete)(struct request *); + int (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + int (*init_request)(struct blk_mq_tag_set *, struct request *, unsigned int, unsigned int); + void (*exit_request)(struct blk_mq_tag_set *, struct request *, unsigned int); + void (*cleanup_rq)(struct request *); + bool (*busy)(struct request_queue *); + int (*map_queues)(struct blk_mq_tag_set *); + void (*show_rq)(struct seq_file *, struct request *); +}; + +enum pr_type { + PR_WRITE_EXCLUSIVE = 1, + PR_EXCLUSIVE_ACCESS = 2, + PR_WRITE_EXCLUSIVE_REG_ONLY = 3, + PR_EXCLUSIVE_ACCESS_REG_ONLY = 4, + PR_WRITE_EXCLUSIVE_ALL_REGS = 5, + PR_EXCLUSIVE_ACCESS_ALL_REGS = 6, +}; + +struct pr_ops { + int (*pr_register)(struct block_device *, u64, u64, u32); + int (*pr_reserve)(struct block_device *, u64, enum pr_type, u32); + int (*pr_release)(struct block_device *, u64, enum pr_type); + int (*pr_preempt)(struct block_device *, u64, u64, enum pr_type, bool); + int (*pr_clear)(struct block_device *, u64); +}; + +struct trace_event_raw_initcall_level { + struct trace_entry ent; + u32 __data_loc_level; + char __data[0]; +}; + +struct trace_event_raw_initcall_start { + struct trace_entry ent; + initcall_t func; + char __data[0]; +}; + +struct trace_event_raw_initcall_finish { + struct trace_entry ent; + initcall_t func; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_initcall_level { + u32 level; +}; + +struct trace_event_data_offsets_initcall_start {}; + +struct trace_event_data_offsets_initcall_finish {}; + +typedef void (*btf_trace_initcall_level)(void *, const char *); + +typedef void (*btf_trace_initcall_start)(void *, initcall_t); + +typedef void (*btf_trace_initcall_finish)(void *, initcall_t, int); + +struct blacklist_entry { + struct list_head next; + char *buf; +}; + +typedef __u32 Elf32_Word; + +struct elf32_note { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +}; + +enum pcpu_fc { + PCPU_FC_AUTO = 0, + PCPU_FC_EMBED = 1, + PCPU_FC_PAGE = 2, + PCPU_FC_NR = 3, +}; + +enum vec_type { + ARM64_VEC_SVE = 0, + ARM64_VEC_MAX = 1, +}; + +enum { + UNAME26 = 131072, + ADDR_NO_RANDOMIZE = 262144, + FDPIC_FUNCPTRS = 524288, + MMAP_PAGE_ZERO = 1048576, + ADDR_COMPAT_LAYOUT = 2097152, + READ_IMPLIES_EXEC = 4194304, + ADDR_LIMIT_32BIT = 8388608, + SHORT_INODE = 16777216, + WHOLE_SECONDS = 33554432, + STICKY_TIMEOUTS = 67108864, + ADDR_LIMIT_3GB = 134217728, +}; + +enum hrtimer_base_type { + HRTIMER_BASE_MONOTONIC = 0, + HRTIMER_BASE_REALTIME = 1, + HRTIMER_BASE_BOOTTIME = 2, + HRTIMER_BASE_TAI = 3, + HRTIMER_BASE_MONOTONIC_SOFT = 4, + HRTIMER_BASE_REALTIME_SOFT = 5, + HRTIMER_BASE_BOOTTIME_SOFT = 6, + HRTIMER_BASE_TAI_SOFT = 7, + HRTIMER_MAX_CLOCK_BASES = 8, +}; + +enum { + MM_FILEPAGES = 0, + MM_ANONPAGES = 1, + MM_SWAPENTS = 2, + MM_SHMEMPAGES = 3, + NR_MM_COUNTERS = 4, +}; + +enum rseq_cs_flags_bit { + RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT = 0, + RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT = 1, + RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT = 2, +}; + +enum uclamp_id { + UCLAMP_MIN = 0, + UCLAMP_MAX = 1, + UCLAMP_CNT = 2, +}; + +enum perf_event_task_context { + perf_invalid_context = 4294967295, + perf_hw_context = 0, + perf_sw_context = 1, + perf_nr_task_contexts = 2, +}; + +enum rseq_event_mask_bits { + RSEQ_EVENT_PREEMPT_BIT = 0, + RSEQ_EVENT_SIGNAL_BIT = 1, + RSEQ_EVENT_MIGRATE_BIT = 2, +}; + +enum { + PROC_ROOT_INO = 1, + PROC_IPC_INIT_INO = 4026531839, + PROC_UTS_INIT_INO = 4026531838, + PROC_USER_INIT_INO = 4026531837, + PROC_PID_INIT_INO = 4026531836, + PROC_CGROUP_INIT_INO = 4026531835, + PROC_TIME_INIT_INO = 4026531834, +}; + +typedef __u16 __le16; + +typedef __u16 __be16; + +typedef __u32 __be32; + +typedef __u64 __be64; + +typedef __u32 __wsum; + +typedef unsigned int slab_flags_t; + +struct rhash_head { + struct rhash_head *next; +}; + +struct rhashtable; + +struct rhashtable_compare_arg { + struct rhashtable *ht; + const void *key; +}; + +typedef u32 (*rht_hashfn_t)(const void *, u32, u32); + +typedef u32 (*rht_obj_hashfn_t)(const void *, u32, u32); + +typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *, const void *); + +struct rhashtable_params { + u16 nelem_hint; + u16 key_len; + u16 key_offset; + u16 head_offset; + unsigned int max_size; + u16 min_size; + bool automatic_shrinking; + rht_hashfn_t hashfn; + rht_obj_hashfn_t obj_hashfn; + rht_obj_cmpfn_t obj_cmpfn; +}; + +struct bucket_table; + +struct rhashtable { + struct bucket_table *tbl; + unsigned int key_len; + unsigned int max_elems; + struct rhashtable_params p; + bool rhlist; + struct work_struct run_work; + struct mutex mutex; + spinlock_t lock; + atomic_t nelems; +}; + +struct fs_struct { + int users; + spinlock_t lock; + seqcount_spinlock_t seq; + int umask; + int in_exec; + struct path root; + struct path pwd; +}; + +struct pipe_buffer; + +struct watch_queue; + +struct pipe_inode_info { + struct mutex mutex; + wait_queue_head_t rd_wait; + wait_queue_head_t wr_wait; + unsigned int head; + unsigned int tail; + unsigned int max_usage; + unsigned int ring_size; + bool note_loss; + unsigned int nr_accounted; + unsigned int readers; + unsigned int writers; + unsigned int files; + unsigned int r_counter; + unsigned int w_counter; + unsigned int poll_usage; + struct page *tmp_page; + struct fasync_struct *fasync_readers; + struct fasync_struct *fasync_writers; + struct pipe_buffer *bufs; + struct user_struct *user; + struct watch_queue *watch_queue; +}; + +struct page_pool_params { + unsigned int flags; + unsigned int order; + unsigned int pool_size; + int nid; + struct device *dev; + enum dma_data_direction dma_dir; + unsigned int max_len; + unsigned int offset; +}; + +struct pp_alloc_cache { + u32 count; + struct page *cache[128]; +}; + +struct ptr_ring { + int producer; + spinlock_t producer_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + int consumer_head; + int consumer_tail; + spinlock_t consumer_lock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + int size; + int batch; + void **queue; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct page_pool { + struct page_pool_params p; + struct delayed_work release_dw; + void (*disconnect)(void *); + long unsigned int defer_start; + long unsigned int defer_warn; + u32 pages_state_hold_cnt; + unsigned int frag_offset; + struct page *frag_page; + long int frag_users; + long: 64; + long: 64; + struct pp_alloc_cache alloc; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct ptr_ring ring; + atomic_t pages_state_release_cnt; + refcount_t user_cnt; + u64 destroy_cnt; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct notifier_block; + +typedef int (*notifier_fn_t)(struct notifier_block *, long unsigned int, void *); + +struct notifier_block { + notifier_fn_t notifier_call; + struct notifier_block *next; + int priority; +}; + +struct blocking_notifier_head { + struct rw_semaphore rwsem; + struct notifier_block *head; +}; + +struct raw_notifier_head { + struct notifier_block *head; +}; + +struct ld_semaphore { + atomic_long_t count; + raw_spinlock_t wait_lock; + unsigned int wait_readers; + struct list_head read_wait; + struct list_head write_wait; +}; + +typedef unsigned int tcflag_t; + +typedef unsigned char cc_t; + +typedef unsigned int speed_t; + +struct ktermios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +struct winsize { + short unsigned int ws_row; + short unsigned int ws_col; + short unsigned int ws_xpixel; + short unsigned int ws_ypixel; +}; + +struct tty_driver; + +struct tty_operations; + +struct tty_ldisc; + +struct tty_port; + +struct tty_struct { + int magic; + struct kref kref; + struct device *dev; + struct tty_driver *driver; + const struct tty_operations *ops; + int index; + struct ld_semaphore ldisc_sem; + struct tty_ldisc *ldisc; + struct mutex atomic_write_lock; + struct mutex legacy_mutex; + struct mutex throttle_mutex; + struct rw_semaphore termios_rwsem; + struct mutex winsize_mutex; + struct ktermios termios; + struct ktermios termios_locked; + char name[64]; + long unsigned int flags; + int count; + struct winsize winsize; + struct { + spinlock_t lock; + bool stopped; + bool tco_stopped; + long unsigned int unused[0]; + } flow; + struct { + spinlock_t lock; + struct pid *pgrp; + struct pid *session; + unsigned char pktstatus; + bool packet; + long unsigned int unused[0]; + } ctrl; + int hw_stopped; + unsigned int receive_room; + int flow_change; + struct tty_struct *link; + struct fasync_struct *fasync; + wait_queue_head_t write_wait; + wait_queue_head_t read_wait; + struct work_struct hangup_work; + void *disc_data; + void *driver_data; + spinlock_t files_lock; + struct list_head tty_files; + int closing; + unsigned char *write_buf; + int write_cnt; + struct work_struct SAK_work; + struct tty_port *port; +}; + +typedef struct { + size_t written; + size_t count; + union { + char *buf; + void *data; + } arg; + int error; +} read_descriptor_t; + +struct posix_acl_entry { + short int e_tag; + short unsigned int e_perm; + union { + kuid_t e_uid; + kgid_t e_gid; + }; +}; + +struct posix_acl { + refcount_t a_refcount; + struct callback_head a_rcu; + unsigned int a_count; + struct posix_acl_entry a_entries[0]; +}; + +typedef __u64 __addrpair; + +typedef __u32 __portpair; + +typedef struct { + struct net *net; +} possible_net_t; + +struct in6_addr { + union { + __u8 u6_addr8[16]; + __be16 u6_addr16[8]; + __be32 u6_addr32[4]; + } in6_u; +}; + +struct hlist_nulls_node { + struct hlist_nulls_node *next; + struct hlist_nulls_node **pprev; +}; + +struct proto; + +struct inet_timewait_death_row; + +struct sock_common { + union { + __addrpair skc_addrpair; + struct { + __be32 skc_daddr; + __be32 skc_rcv_saddr; + }; + }; + union { + unsigned int skc_hash; + __u16 skc_u16hashes[2]; + }; + union { + __portpair skc_portpair; + struct { + __be16 skc_dport; + __u16 skc_num; + }; + }; + short unsigned int skc_family; + volatile unsigned char skc_state; + unsigned char skc_reuse: 4; + unsigned char skc_reuseport: 1; + unsigned char skc_ipv6only: 1; + unsigned char skc_net_refcnt: 1; + int skc_bound_dev_if; + union { + struct hlist_node skc_bind_node; + struct hlist_node skc_portaddr_node; + }; + struct proto *skc_prot; + possible_net_t skc_net; + struct in6_addr skc_v6_daddr; + struct in6_addr skc_v6_rcv_saddr; + atomic64_t skc_cookie; + union { + long unsigned int skc_flags; + struct sock *skc_listener; + struct inet_timewait_death_row *skc_tw_dr; + }; + int skc_dontcopy_begin[0]; + union { + struct hlist_node skc_node; + struct hlist_nulls_node skc_nulls_node; + }; + short unsigned int skc_tx_queue_mapping; + short unsigned int skc_rx_queue_mapping; + union { + int skc_incoming_cpu; + u32 skc_rcv_wnd; + u32 skc_tw_rcv_nxt; + }; + refcount_t skc_refcnt; + int skc_dontcopy_end[0]; + union { + u32 skc_rxhash; + u32 skc_window_clamp; + u32 skc_tw_snd_nxt; + }; +}; + +typedef struct { + spinlock_t slock; + int owned; + wait_queue_head_t wq; +} socket_lock_t; + +struct sk_buff; + +struct sk_buff_head { + struct sk_buff *next; + struct sk_buff *prev; + __u32 qlen; + spinlock_t lock; +}; + +typedef u64 netdev_features_t; + +struct sock_cgroup_data { + struct cgroup *cgroup; + u32 classid; + u16 prioidx; +}; + +struct sk_filter; + +struct socket_wq; + +struct xfrm_policy; + +struct dst_entry; + +struct socket; + +struct net_device; + +struct sock_reuseport; + +struct sock { + struct sock_common __sk_common; + socket_lock_t sk_lock; + atomic_t sk_drops; + int sk_rcvlowat; + struct sk_buff_head sk_error_queue; + struct sk_buff_head sk_receive_queue; + struct { + atomic_t rmem_alloc; + int len; + struct sk_buff *head; + struct sk_buff *tail; + } sk_backlog; + int sk_forward_alloc; + u32 sk_reserved_mem; + unsigned int sk_ll_usec; + unsigned int sk_napi_id; + int sk_rcvbuf; + struct sk_filter *sk_filter; + union { + struct socket_wq *sk_wq; + struct socket_wq *sk_wq_raw; + }; + struct xfrm_policy *sk_policy[2]; + struct dst_entry *sk_rx_dst; + int sk_rx_dst_ifindex; + u32 sk_rx_dst_cookie; + struct dst_entry *sk_dst_cache; + atomic_t sk_omem_alloc; + int sk_sndbuf; + int sk_wmem_queued; + refcount_t sk_wmem_alloc; + long unsigned int sk_tsq_flags; + union { + struct sk_buff *sk_send_head; + struct rb_root tcp_rtx_queue; + }; + struct sk_buff_head sk_write_queue; + __s32 sk_peek_off; + int sk_write_pending; + __u32 sk_dst_pending_confirm; + u32 sk_pacing_status; + long int sk_sndtimeo; + struct timer_list sk_timer; + __u32 sk_priority; + __u32 sk_mark; + long unsigned int sk_pacing_rate; + long unsigned int sk_max_pacing_rate; + struct page_frag sk_frag; + netdev_features_t sk_route_caps; + netdev_features_t sk_route_nocaps; + netdev_features_t sk_route_forced_caps; + int sk_gso_type; + unsigned int sk_gso_max_size; + gfp_t sk_allocation; + __u32 sk_txhash; + u8 sk_padding: 1; + u8 sk_kern_sock: 1; + u8 sk_no_check_tx: 1; + u8 sk_no_check_rx: 1; + u8 sk_userlocks: 4; + u8 sk_pacing_shift; + u16 sk_type; + u16 sk_protocol; + u16 sk_gso_max_segs; + long unsigned int sk_lingertime; + struct proto *sk_prot_creator; + rwlock_t sk_callback_lock; + int sk_err; + int sk_err_soft; + u32 sk_ack_backlog; + u32 sk_max_ack_backlog; + kuid_t sk_uid; + u8 sk_prefer_busy_poll; + u16 sk_busy_poll_budget; + spinlock_t sk_peer_lock; + struct pid *sk_peer_pid; + const struct cred *sk_peer_cred; + long int sk_rcvtimeo; + ktime_t sk_stamp; + u16 sk_tsflags; + int sk_bind_phc; + u8 sk_shutdown; + u32 sk_tskey; + atomic_t sk_zckey; + u8 sk_clockid; + u8 sk_txtime_deadline_mode: 1; + u8 sk_txtime_report_errors: 1; + u8 sk_txtime_unused: 6; + struct socket *sk_socket; + void *sk_user_data; + void *sk_security; + struct sock_cgroup_data sk_cgrp_data; + struct mem_cgroup *sk_memcg; + void (*sk_state_change)(struct sock *); + void (*sk_data_ready)(struct sock *); + void (*sk_write_space)(struct sock *); + void (*sk_error_report)(struct sock *); + int (*sk_backlog_rcv)(struct sock *, struct sk_buff *); + struct sk_buff * (*sk_validate_xmit_skb)(struct sock *, struct net_device *, struct sk_buff *); + void (*sk_destruct)(struct sock *); + struct sock_reuseport *sk_reuseport_cb; + struct bpf_local_storage *sk_bpf_storage; + struct callback_head sk_rcu; +}; + +typedef short unsigned int __kernel_sa_family_t; + +typedef __kernel_sa_family_t sa_family_t; + +struct sockaddr { + sa_family_t sa_family; + char sa_data[14]; +}; + +struct msghdr { + void *msg_name; + int msg_namelen; + struct iov_iter msg_iter; + union { + void *msg_control; + void *msg_control_user; + }; + bool msg_control_is_user: 1; + __kernel_size_t msg_controllen; + unsigned int msg_flags; + struct kiocb *msg_iocb; +}; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + short unsigned int loopback; +} sync_serial_settings; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + short unsigned int loopback; + unsigned int slot_map; +} te1_settings; + +typedef struct { + short unsigned int encoding; + short unsigned int parity; +} raw_hdlc_proto; + +typedef struct { + unsigned int t391; + unsigned int t392; + unsigned int n391; + unsigned int n392; + unsigned int n393; + short unsigned int lmi; + short unsigned int dce; +} fr_proto; + +typedef struct { + unsigned int dlci; +} fr_proto_pvc; + +typedef struct { + unsigned int dlci; + char master[16]; +} fr_proto_pvc_info; + +typedef struct { + unsigned int interval; + unsigned int timeout; +} cisco_proto; + +typedef struct { + short unsigned int dce; + unsigned int modulo; + unsigned int window; + unsigned int t1; + unsigned int t2; + unsigned int n2; +} x25_hdlc_proto; + +struct ifmap { + long unsigned int mem_start; + long unsigned int mem_end; + short unsigned int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct if_settings { + unsigned int type; + unsigned int size; + union { + raw_hdlc_proto *raw_hdlc; + cisco_proto *cisco; + fr_proto *fr; + fr_proto_pvc *fr_pvc; + fr_proto_pvc_info *fr_pvc_info; + x25_hdlc_proto *x25; + sync_serial_settings *sync; + te1_settings *te1; + } ifs_ifsu; +}; + +struct ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + void *ifru_data; + struct if_settings ifru_settings; + } ifr_ifru; +}; + +struct tty_buffer { + union { + struct tty_buffer *next; + struct llist_node free; + }; + int used; + int size; + int commit; + int read; + int flags; + long unsigned int data[0]; +}; + +struct tty_bufhead { + struct tty_buffer *head; + struct work_struct work; + struct mutex lock; + atomic_t priority; + struct tty_buffer sentinel; + struct llist_head free; + atomic_t mem_used; + int mem_limit; + struct tty_buffer *tail; +}; + +struct serial_icounter_struct; + +struct serial_struct; + +struct tty_operations { + struct tty_struct * (*lookup)(struct tty_driver *, struct file *, int); + int (*install)(struct tty_driver *, struct tty_struct *); + void (*remove)(struct tty_driver *, struct tty_struct *); + int (*open)(struct tty_struct *, struct file *); + void (*close)(struct tty_struct *, struct file *); + void (*shutdown)(struct tty_struct *); + void (*cleanup)(struct tty_struct *); + int (*write)(struct tty_struct *, const unsigned char *, int); + int (*put_char)(struct tty_struct *, unsigned char); + void (*flush_chars)(struct tty_struct *); + unsigned int (*write_room)(struct tty_struct *); + unsigned int (*chars_in_buffer)(struct tty_struct *); + int (*ioctl)(struct tty_struct *, unsigned int, long unsigned int); + long int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int); + void (*set_termios)(struct tty_struct *, struct ktermios *); + void (*throttle)(struct tty_struct *); + void (*unthrottle)(struct tty_struct *); + void (*stop)(struct tty_struct *); + void (*start)(struct tty_struct *); + void (*hangup)(struct tty_struct *); + int (*break_ctl)(struct tty_struct *, int); + void (*flush_buffer)(struct tty_struct *); + void (*set_ldisc)(struct tty_struct *); + void (*wait_until_sent)(struct tty_struct *, int); + void (*send_xchar)(struct tty_struct *, char); + int (*tiocmget)(struct tty_struct *); + int (*tiocmset)(struct tty_struct *, unsigned int, unsigned int); + int (*resize)(struct tty_struct *, struct winsize *); + int (*get_icount)(struct tty_struct *, struct serial_icounter_struct *); + int (*get_serial)(struct tty_struct *, struct serial_struct *); + int (*set_serial)(struct tty_struct *, struct serial_struct *); + void (*show_fdinfo)(struct tty_struct *, struct seq_file *); + int (*poll_init)(struct tty_driver *, int, char *); + int (*poll_get_char)(struct tty_driver *, int); + void (*poll_put_char)(struct tty_driver *, int, char); + int (*proc_show)(struct seq_file *, void *); +}; + +struct tty_driver { + int magic; + struct kref kref; + struct cdev **cdevs; + struct module *owner; + const char *driver_name; + const char *name; + int name_base; + int major; + int minor_start; + unsigned int num; + short int type; + short int subtype; + struct ktermios init_termios; + long unsigned int flags; + struct proc_dir_entry *proc_entry; + struct tty_driver *other; + struct tty_struct **ttys; + struct tty_port **ports; + struct ktermios **termios; + void *driver_state; + const struct tty_operations *ops; + struct list_head tty_drivers; +}; + +struct tty_port_operations; + +struct tty_port_client_operations; + +struct tty_port { + struct tty_bufhead buf; + struct tty_struct *tty; + struct tty_struct *itty; + const struct tty_port_operations *ops; + const struct tty_port_client_operations *client_ops; + spinlock_t lock; + int blocked_open; + int count; + wait_queue_head_t open_wait; + wait_queue_head_t delta_msr_wait; + long unsigned int flags; + long unsigned int iflags; + unsigned char console: 1; + struct mutex mutex; + struct mutex buf_mutex; + unsigned char *xmit_buf; + unsigned int close_delay; + unsigned int closing_wait; + int drain_delay; + struct kref kref; + void *client_data; +}; + +struct tty_ldisc_ops { + char *name; + int num; + int (*open)(struct tty_struct *); + void (*close)(struct tty_struct *); + void (*flush_buffer)(struct tty_struct *); + ssize_t (*read)(struct tty_struct *, struct file *, unsigned char *, size_t, void **, long unsigned int); + ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t); + int (*ioctl)(struct tty_struct *, struct file *, unsigned int, long unsigned int); + int (*compat_ioctl)(struct tty_struct *, struct file *, unsigned int, long unsigned int); + void (*set_termios)(struct tty_struct *, struct ktermios *); + __poll_t (*poll)(struct tty_struct *, struct file *, struct poll_table_struct *); + void (*hangup)(struct tty_struct *); + void (*receive_buf)(struct tty_struct *, const unsigned char *, const char *, int); + void (*write_wakeup)(struct tty_struct *); + void (*dcd_change)(struct tty_struct *, unsigned int); + int (*receive_buf2)(struct tty_struct *, const unsigned char *, const char *, int); + struct module *owner; +}; + +struct tty_ldisc { + struct tty_ldisc_ops *ops; + struct tty_struct *tty; +}; + +struct tty_port_operations { + int (*carrier_raised)(struct tty_port *); + void (*dtr_rts)(struct tty_port *, int); + void (*shutdown)(struct tty_port *); + int (*activate)(struct tty_port *, struct tty_struct *); + void (*destruct)(struct tty_port *); +}; + +struct tty_port_client_operations { + int (*receive_buf)(struct tty_port *, const unsigned char *, const unsigned char *, size_t); + void (*write_wakeup)(struct tty_port *); +}; + +struct prot_inuse; + +struct netns_core { + struct ctl_table_header *sysctl_hdr; + int sysctl_somaxconn; + int *sock_inuse; + struct prot_inuse *prot_inuse; +}; + +struct ipstats_mib; + +struct tcp_mib; + +struct linux_mib; + +struct udp_mib; + +struct linux_xfrm_mib; + +struct linux_tls_mib; + +struct mptcp_mib; + +struct icmp_mib; + +struct icmpmsg_mib; + +struct icmpv6_mib; + +struct icmpv6msg_mib; + +struct netns_mib { + struct ipstats_mib *ip_statistics; + struct ipstats_mib *ipv6_statistics; + struct tcp_mib *tcp_statistics; + struct linux_mib *net_statistics; + struct udp_mib *udp_statistics; + struct udp_mib *udp_stats_in6; + struct linux_xfrm_mib *xfrm_statistics; + struct linux_tls_mib *tls_statistics; + struct mptcp_mib *mptcp_statistics; + struct udp_mib *udplite_statistics; + struct udp_mib *udplite_stats_in6; + struct icmp_mib *icmp_statistics; + struct icmpmsg_mib *icmpmsg_statistics; + struct icmpv6_mib *icmpv6_statistics; + struct icmpv6msg_mib *icmpv6msg_statistics; + struct proc_dir_entry *proc_net_devsnmp6; +}; + +struct netns_packet { + struct mutex sklist_lock; + struct hlist_head sklist; +}; + +struct netns_unix { + int sysctl_max_dgram_qlen; + struct ctl_table_header *ctl; +}; + +struct netns_nexthop { + struct rb_root rb_root; + struct hlist_head *devhash; + unsigned int seq; + u32 last_id_allocated; + struct blocking_notifier_head notifier_chain; +}; + +struct inet_hashinfo; + +struct inet_timewait_death_row { + atomic_t tw_count; + char tw_pad[60]; + struct inet_hashinfo *hashinfo; + int sysctl_max_tw_buckets; +}; + +struct local_ports { + seqlock_t lock; + int range[2]; + bool warned; +}; + +struct ping_group_range { + seqlock_t lock; + kgid_t range[2]; +}; + +typedef struct { + u64 key[2]; +} siphash_key_t; + +struct ipv4_devconf; + +struct ip_ra_chain; + +struct fib_rules_ops; + +struct fib_table; + +struct inet_peer_base; + +struct fqdir; + +struct tcp_congestion_ops; + +struct tcp_fastopen_context; + +struct fib_notifier_ops; + +struct netns_ipv4 { + struct inet_timewait_death_row tcp_death_row; + struct ctl_table_header *forw_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *ipv4_hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *xfrm4_hdr; + struct ipv4_devconf *devconf_all; + struct ipv4_devconf *devconf_dflt; + struct ip_ra_chain *ra_chain; + struct mutex ra_mutex; + struct fib_rules_ops *rules_ops; + struct fib_table *fib_main; + struct fib_table *fib_default; + unsigned int fib_rules_require_fldissect; + bool fib_has_custom_rules; + bool fib_has_custom_local_routes; + bool fib_offload_disabled; + atomic_t fib_num_tclassid_users; + struct hlist_head *fib_table_hash; + struct sock *fibnl; + struct sock **icmp_sk; + struct sock *mc_autojoin_sk; + struct inet_peer_base *peers; + struct sock **tcp_sk; + struct fqdir *fqdir; + u8 sysctl_icmp_echo_ignore_all; + u8 sysctl_icmp_echo_enable_probe; + u8 sysctl_icmp_echo_ignore_broadcasts; + u8 sysctl_icmp_ignore_bogus_error_responses; + u8 sysctl_icmp_errors_use_inbound_ifaddr; + int sysctl_icmp_ratelimit; + int sysctl_icmp_ratemask; + struct local_ports ip_local_ports; + u8 sysctl_tcp_ecn; + u8 sysctl_tcp_ecn_fallback; + u8 sysctl_ip_default_ttl; + u8 sysctl_ip_no_pmtu_disc; + u8 sysctl_ip_fwd_use_pmtu; + u8 sysctl_ip_fwd_update_priority; + u8 sysctl_ip_nonlocal_bind; + u8 sysctl_ip_autobind_reuse; + u8 sysctl_ip_dynaddr; + u8 sysctl_ip_early_demux; + u8 sysctl_raw_l3mdev_accept; + u8 sysctl_tcp_early_demux; + u8 sysctl_udp_early_demux; + u8 sysctl_nexthop_compat_mode; + u8 sysctl_fwmark_reflect; + u8 sysctl_tcp_fwmark_accept; + u8 sysctl_tcp_l3mdev_accept; + u8 sysctl_tcp_mtu_probing; + int sysctl_tcp_mtu_probe_floor; + int sysctl_tcp_base_mss; + int sysctl_tcp_min_snd_mss; + int sysctl_tcp_probe_threshold; + u32 sysctl_tcp_probe_interval; + int sysctl_tcp_keepalive_time; + int sysctl_tcp_keepalive_intvl; + u8 sysctl_tcp_keepalive_probes; + u8 sysctl_tcp_syn_retries; + u8 sysctl_tcp_synack_retries; + u8 sysctl_tcp_syncookies; + u8 sysctl_tcp_migrate_req; + int sysctl_tcp_reordering; + u8 sysctl_tcp_retries1; + u8 sysctl_tcp_retries2; + u8 sysctl_tcp_orphan_retries; + u8 sysctl_tcp_tw_reuse; + int sysctl_tcp_fin_timeout; + unsigned int sysctl_tcp_notsent_lowat; + u8 sysctl_tcp_sack; + u8 sysctl_tcp_window_scaling; + u8 sysctl_tcp_timestamps; + u8 sysctl_tcp_early_retrans; + u8 sysctl_tcp_recovery; + u8 sysctl_tcp_thin_linear_timeouts; + u8 sysctl_tcp_slow_start_after_idle; + u8 sysctl_tcp_retrans_collapse; + u8 sysctl_tcp_stdurg; + u8 sysctl_tcp_rfc1337; + u8 sysctl_tcp_abort_on_overflow; + u8 sysctl_tcp_fack; + int sysctl_tcp_max_reordering; + int sysctl_tcp_adv_win_scale; + u8 sysctl_tcp_dsack; + u8 sysctl_tcp_app_win; + u8 sysctl_tcp_frto; + u8 sysctl_tcp_nometrics_save; + u8 sysctl_tcp_no_ssthresh_metrics_save; + u8 sysctl_tcp_moderate_rcvbuf; + u8 sysctl_tcp_tso_win_divisor; + u8 sysctl_tcp_workaround_signed_windows; + int sysctl_tcp_limit_output_bytes; + int sysctl_tcp_challenge_ack_limit; + int sysctl_tcp_min_rtt_wlen; + u8 sysctl_tcp_min_tso_segs; + u8 sysctl_tcp_autocorking; + u8 sysctl_tcp_reflect_tos; + u8 sysctl_tcp_comp_sack_nr; + int sysctl_tcp_invalid_ratelimit; + int sysctl_tcp_pacing_ss_ratio; + int sysctl_tcp_pacing_ca_ratio; + int sysctl_tcp_wmem[3]; + int sysctl_tcp_rmem[3]; + long unsigned int sysctl_tcp_comp_sack_delay_ns; + long unsigned int sysctl_tcp_comp_sack_slack_ns; + int sysctl_max_syn_backlog; + int sysctl_tcp_fastopen; + const struct tcp_congestion_ops *tcp_congestion_control; + struct tcp_fastopen_context *tcp_fastopen_ctx; + unsigned int sysctl_tcp_fastopen_blackhole_timeout; + atomic_t tfo_active_disable_times; + long unsigned int tfo_active_disable_stamp; + int sysctl_udp_wmem_min; + int sysctl_udp_rmem_min; + u8 sysctl_fib_notify_on_flag_change; + u8 sysctl_udp_l3mdev_accept; + u8 sysctl_igmp_llm_reports; + int sysctl_igmp_max_memberships; + int sysctl_igmp_max_msf; + int sysctl_igmp_qrv; + struct ping_group_range ping_group_range; + atomic_t dev_addr_genid; + long unsigned int *sysctl_local_reserved_ports; + int sysctl_ip_prot_sock; + struct list_head mr_tables; + struct fib_rules_ops *mr_rules_ops; + u32 sysctl_fib_multipath_hash_fields; + u8 sysctl_fib_multipath_use_neigh; + u8 sysctl_fib_multipath_hash_policy; + struct fib_notifier_ops *notifier_ops; + unsigned int fib_seq; + struct fib_notifier_ops *ipmr_notifier_ops; + unsigned int ipmr_seq; + atomic_t rt_genid; + siphash_key_t ip_id_key; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct neighbour; + +struct dst_ops { + short unsigned int family; + unsigned int gc_thresh; + int (*gc)(struct dst_ops *); + struct dst_entry * (*check)(struct dst_entry *, __u32); + unsigned int (*default_advmss)(const struct dst_entry *); + unsigned int (*mtu)(const struct dst_entry *); + u32 * (*cow_metrics)(struct dst_entry *, long unsigned int); + void (*destroy)(struct dst_entry *); + void (*ifdown)(struct dst_entry *, struct net_device *, int); + struct dst_entry * (*negative_advice)(struct dst_entry *); + void (*link_failure)(struct sk_buff *); + void (*update_pmtu)(struct dst_entry *, struct sock *, struct sk_buff *, u32, bool); + void (*redirect)(struct dst_entry *, struct sock *, struct sk_buff *); + int (*local_out)(struct net *, struct sock *, struct sk_buff *); + struct neighbour * (*neigh_lookup)(const struct dst_entry *, struct sk_buff *, const void *); + void (*confirm_neigh)(const struct dst_entry *, const void *); + struct kmem_cache *kmem_cachep; + struct percpu_counter pcpuc_entries; + long: 64; + long: 64; + long: 64; +}; + +struct netns_sysctl_ipv6 { + struct ctl_table_header *hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *icmp_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *xfrm6_hdr; + int flush_delay; + int ip6_rt_max_size; + int ip6_rt_gc_min_interval; + int ip6_rt_gc_timeout; + int ip6_rt_gc_interval; + int ip6_rt_gc_elasticity; + int ip6_rt_mtu_expires; + int ip6_rt_min_advmss; + u32 multipath_hash_fields; + u8 multipath_hash_policy; + u8 bindv6only; + u8 flowlabel_consistency; + u8 auto_flowlabels; + int icmpv6_time; + u8 icmpv6_echo_ignore_all; + u8 icmpv6_echo_ignore_multicast; + u8 icmpv6_echo_ignore_anycast; + long unsigned int icmpv6_ratemask[4]; + long unsigned int *icmpv6_ratemask_ptr; + u8 anycast_src_echo_reply; + u8 ip_nonlocal_bind; + u8 fwmark_reflect; + u8 flowlabel_state_ranges; + int idgen_retries; + int idgen_delay; + int flowlabel_reflect; + int max_dst_opts_cnt; + int max_hbh_opts_cnt; + int max_dst_opts_len; + int max_hbh_opts_len; + int seg6_flowlabel; + u32 ioam6_id; + u64 ioam6_id_wide; + bool skip_notify_on_dev_down; + u8 fib_notify_on_flag_change; +}; + +struct ipv6_devconf; + +struct fib6_info; + +struct rt6_info; + +struct rt6_statistics; + +struct fib6_table; + +struct seg6_pernet_data; + +struct ioam6_pernet_data; + +struct netns_ipv6 { + struct dst_ops ip6_dst_ops; + struct netns_sysctl_ipv6 sysctl; + struct ipv6_devconf *devconf_all; + struct ipv6_devconf *devconf_dflt; + struct inet_peer_base *peers; + struct fqdir *fqdir; + struct fib6_info *fib6_null_entry; + struct rt6_info *ip6_null_entry; + struct rt6_statistics *rt6_stats; + struct timer_list ip6_fib_timer; + struct hlist_head *fib_table_hash; + struct fib6_table *fib6_main_tbl; + struct list_head fib6_walkers; + rwlock_t fib6_walker_lock; + spinlock_t fib6_gc_lock; + unsigned int ip6_rt_gc_expire; + long unsigned int ip6_rt_last_gc; + unsigned int fib6_rules_require_fldissect; + bool fib6_has_custom_rules; + unsigned int fib6_routes_require_src; + struct rt6_info *ip6_prohibit_entry; + struct rt6_info *ip6_blk_hole_entry; + struct fib6_table *fib6_local_tbl; + struct fib_rules_ops *fib6_rules_ops; + struct sock **icmp_sk; + struct sock *ndisc_sk; + struct sock *tcp_sk; + struct sock *igmp_sk; + struct sock *mc_autojoin_sk; + struct list_head mr6_tables; + struct fib_rules_ops *mr6_rules_ops; + atomic_t dev_addr_genid; + atomic_t fib6_sernum; + struct seg6_pernet_data *seg6_data; + struct fib_notifier_ops *notifier_ops; + struct fib_notifier_ops *ip6mr_notifier_ops; + unsigned int ipmr_seq; + struct { + struct hlist_head head; + spinlock_t lock; + u32 seq; + } ip6addrlbl_table; + struct ioam6_pernet_data *ioam6_data; +}; + +struct netns_sysctl_lowpan { + struct ctl_table_header *frags_hdr; +}; + +struct netns_ieee802154_lowpan { + struct netns_sysctl_lowpan sysctl; + struct fqdir *fqdir; +}; + +struct sctp_mib; + +struct netns_sctp { + struct sctp_mib *sctp_statistics; + struct proc_dir_entry *proc_net_sctp; + struct ctl_table_header *sysctl_header; + struct sock *ctl_sock; + struct sock *udp4_sock; + struct sock *udp6_sock; + int udp_port; + int encap_port; + struct list_head local_addr_list; + struct list_head addr_waitq; + struct timer_list addr_wq_timer; + struct list_head auto_asconf_splist; + spinlock_t addr_wq_lock; + spinlock_t local_addr_lock; + unsigned int rto_initial; + unsigned int rto_min; + unsigned int rto_max; + int rto_alpha; + int rto_beta; + int max_burst; + int cookie_preserve_enable; + char *sctp_hmac_alg; + unsigned int valid_cookie_life; + unsigned int sack_timeout; + unsigned int hb_interval; + unsigned int probe_interval; + int max_retrans_association; + int max_retrans_path; + int max_retrans_init; + int pf_retrans; + int ps_retrans; + int pf_enable; + int pf_expose; + int sndbuf_policy; + int rcvbuf_policy; + int default_auto_asconf; + int addip_enable; + int addip_noauth; + int prsctp_enable; + int reconf_enable; + int auth_enable; + int intl_enable; + int ecn_enable; + int scope_policy; + int rwnd_upd_shift; + long unsigned int max_autoclose; +}; + +struct nf_logger; + +struct nf_hook_entries; + +struct netns_nf { + struct proc_dir_entry *proc_netfilter; + const struct nf_logger *nf_loggers[13]; + struct ctl_table_header *nf_log_dir_header; + struct nf_hook_entries *hooks_ipv4[5]; + struct nf_hook_entries *hooks_ipv6[5]; + struct nf_hook_entries *hooks_arp[3]; + struct nf_hook_entries *hooks_bridge[5]; + struct nf_hook_entries *hooks_decnet[7]; + unsigned int defrag_ipv4_users; + unsigned int defrag_ipv6_users; +}; + +struct nf_generic_net { + unsigned int timeout; +}; + +struct nf_tcp_net { + unsigned int timeouts[14]; + u8 tcp_loose; + u8 tcp_be_liberal; + u8 tcp_max_retrans; + u8 tcp_ignore_invalid_rst; + unsigned int offload_timeout; +}; + +struct nf_udp_net { + unsigned int timeouts[2]; + unsigned int offload_timeout; +}; + +struct nf_icmp_net { + unsigned int timeout; +}; + +struct nf_dccp_net { + u8 dccp_loose; + unsigned int dccp_timeout[10]; +}; + +struct nf_sctp_net { + unsigned int timeouts[10]; +}; + +struct nf_gre_net { + struct list_head keymap_list; + unsigned int timeouts[2]; +}; + +struct nf_ip_net { + struct nf_generic_net generic; + struct nf_tcp_net tcp; + struct nf_udp_net udp; + struct nf_icmp_net icmp; + struct nf_icmp_net icmpv6; + struct nf_dccp_net dccp; + struct nf_sctp_net sctp; + struct nf_gre_net gre; +}; + +struct ct_pcpu; + +struct ip_conntrack_stat; + +struct nf_ct_event_notifier; + +struct netns_ct { + bool ecache_dwork_pending; + u8 sysctl_log_invalid; + u8 sysctl_events; + u8 sysctl_acct; + u8 sysctl_auto_assign_helper; + u8 sysctl_tstamp; + u8 sysctl_checksum; + struct ct_pcpu *pcpu_lists; + struct ip_conntrack_stat *stat; + struct nf_ct_event_notifier *nf_conntrack_event_cb; + struct nf_ip_net nf_ct_proto; + unsigned int labels_used; +}; + +struct netns_nftables { + u8 gencursor; +}; + +struct netns_bpf { + struct bpf_prog_array *run_array[2]; + struct bpf_prog *progs[2]; + struct list_head links[2]; +}; + +struct xfrm_policy_hash { + struct hlist_head *table; + unsigned int hmask; + u8 dbits4; + u8 sbits4; + u8 dbits6; + u8 sbits6; +}; + +struct xfrm_policy_hthresh { + struct work_struct work; + seqlock_t lock; + u8 lbits4; + u8 rbits4; + u8 lbits6; + u8 rbits6; +}; + +struct netns_xfrm { + struct list_head state_all; + struct hlist_head *state_bydst; + struct hlist_head *state_bysrc; + struct hlist_head *state_byspi; + struct hlist_head *state_byseq; + unsigned int state_hmask; + unsigned int state_num; + struct work_struct state_hash_work; + struct list_head policy_all; + struct hlist_head *policy_byidx; + unsigned int policy_idx_hmask; + struct hlist_head policy_inexact[3]; + struct xfrm_policy_hash policy_bydst[3]; + unsigned int policy_count[6]; + struct work_struct policy_hash_work; + struct xfrm_policy_hthresh policy_hthresh; + struct list_head inexact_bins; + struct sock *nlsk; + struct sock *nlsk_stash; + u32 sysctl_aevent_etime; + u32 sysctl_aevent_rseqth; + int sysctl_larval_drop; + u32 sysctl_acq_expires; + u8 policy_default; + struct ctl_table_header *sysctl_hdr; + long: 64; + long: 64; + long: 64; + struct dst_ops xfrm4_dst_ops; + struct dst_ops xfrm6_dst_ops; + spinlock_t xfrm_state_lock; + seqcount_spinlock_t xfrm_state_hash_generation; + seqcount_spinlock_t xfrm_policy_hash_generation; + spinlock_t xfrm_policy_lock; + struct mutex xfrm_cfg_mutex; + long: 64; + long: 64; +}; + +struct netns_ipvs; + +struct mpls_route; + +struct netns_mpls { + int ip_ttl_propagate; + int default_ttl; + size_t platform_labels; + struct mpls_route **platform_label; + struct ctl_table_header *ctl; +}; + +struct can_dev_rcv_lists; + +struct can_pkg_stats; + +struct can_rcv_lists_stats; + +struct netns_can { + struct proc_dir_entry *proc_dir; + struct proc_dir_entry *pde_stats; + struct proc_dir_entry *pde_reset_stats; + struct proc_dir_entry *pde_rcvlist_all; + struct proc_dir_entry *pde_rcvlist_fil; + struct proc_dir_entry *pde_rcvlist_inv; + struct proc_dir_entry *pde_rcvlist_sff; + struct proc_dir_entry *pde_rcvlist_eff; + struct proc_dir_entry *pde_rcvlist_err; + struct proc_dir_entry *bcmproc_dir; + struct can_dev_rcv_lists *rx_alldev_list; + spinlock_t rcvlists_lock; + struct timer_list stattimer; + struct can_pkg_stats *pkg_stats; + struct can_rcv_lists_stats *rcv_lists_stats; + struct hlist_head cgw_list; +}; + +struct netns_xdp { + struct mutex lock; + struct hlist_head list; +}; + +struct smc_stats; + +struct smc_stats_rsn; + +struct netns_smc { + struct smc_stats *smc_stats; + struct mutex mutex_fback_rsn; + struct smc_stats_rsn *fback_rsn; +}; + +struct uevent_sock; + +struct net_generic; + +struct net { + refcount_t passive; + spinlock_t rules_mod_lock; + unsigned int dev_unreg_count; + unsigned int dev_base_seq; + int ifindex; + spinlock_t nsid_lock; + atomic_t fnhe_genid; + struct list_head list; + struct list_head exit_list; + struct llist_node cleanup_list; + struct key_tag *key_domain; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct idr netns_ids; + struct ns_common ns; + struct list_head dev_base_head; + struct proc_dir_entry *proc_net; + struct proc_dir_entry *proc_net_stat; + struct ctl_table_set sysctls; + struct sock *rtnl; + struct sock *genl_sock; + struct uevent_sock *uevent_sock; + struct hlist_head *dev_name_head; + struct hlist_head *dev_index_head; + struct raw_notifier_head netdev_chain; + u32 hash_mix; + struct net_device *loopback_dev; + struct list_head rules_ops; + struct netns_core core; + struct netns_mib mib; + struct netns_packet packet; + struct netns_unix unx; + struct netns_nexthop nexthop; + struct netns_ipv4 ipv4; + struct netns_ipv6 ipv6; + struct netns_ieee802154_lowpan ieee802154_lowpan; + struct netns_sctp sctp; + struct netns_nf nf; + struct netns_ct ct; + struct netns_nftables nft; + struct sk_buff_head wext_nlevents; + struct net_generic *gen; + struct netns_bpf bpf; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct netns_xfrm xfrm; + u64 net_cookie; + struct netns_ipvs *ipvs; + struct netns_mpls mpls; + struct netns_can can; + struct netns_xdp xdp; + struct sock *crypto_nlsk; + struct sock *diag_nlsk; + struct netns_smc smc; + long: 64; +}; + +typedef struct { + local64_t v; +} u64_stats_t; + +struct bpf_insn { + __u8 code; + __u8 dst_reg: 4; + __u8 src_reg: 4; + __s16 off; + __s32 imm; +}; + +enum bpf_map_type { + BPF_MAP_TYPE_UNSPEC = 0, + BPF_MAP_TYPE_HASH = 1, + BPF_MAP_TYPE_ARRAY = 2, + BPF_MAP_TYPE_PROG_ARRAY = 3, + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 4, + BPF_MAP_TYPE_PERCPU_HASH = 5, + BPF_MAP_TYPE_PERCPU_ARRAY = 6, + BPF_MAP_TYPE_STACK_TRACE = 7, + BPF_MAP_TYPE_CGROUP_ARRAY = 8, + BPF_MAP_TYPE_LRU_HASH = 9, + BPF_MAP_TYPE_LRU_PERCPU_HASH = 10, + BPF_MAP_TYPE_LPM_TRIE = 11, + BPF_MAP_TYPE_ARRAY_OF_MAPS = 12, + BPF_MAP_TYPE_HASH_OF_MAPS = 13, + BPF_MAP_TYPE_DEVMAP = 14, + BPF_MAP_TYPE_SOCKMAP = 15, + BPF_MAP_TYPE_CPUMAP = 16, + BPF_MAP_TYPE_XSKMAP = 17, + BPF_MAP_TYPE_SOCKHASH = 18, + BPF_MAP_TYPE_CGROUP_STORAGE = 19, + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 20, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 21, + BPF_MAP_TYPE_QUEUE = 22, + BPF_MAP_TYPE_STACK = 23, + BPF_MAP_TYPE_SK_STORAGE = 24, + BPF_MAP_TYPE_DEVMAP_HASH = 25, + BPF_MAP_TYPE_STRUCT_OPS = 26, + BPF_MAP_TYPE_RINGBUF = 27, + BPF_MAP_TYPE_INODE_STORAGE = 28, + BPF_MAP_TYPE_TASK_STORAGE = 29, + BPF_MAP_TYPE_BLOOM_FILTER = 30, +}; + +enum bpf_prog_type { + BPF_PROG_TYPE_UNSPEC = 0, + BPF_PROG_TYPE_SOCKET_FILTER = 1, + BPF_PROG_TYPE_KPROBE = 2, + BPF_PROG_TYPE_SCHED_CLS = 3, + BPF_PROG_TYPE_SCHED_ACT = 4, + BPF_PROG_TYPE_TRACEPOINT = 5, + BPF_PROG_TYPE_XDP = 6, + BPF_PROG_TYPE_PERF_EVENT = 7, + BPF_PROG_TYPE_CGROUP_SKB = 8, + BPF_PROG_TYPE_CGROUP_SOCK = 9, + BPF_PROG_TYPE_LWT_IN = 10, + BPF_PROG_TYPE_LWT_OUT = 11, + BPF_PROG_TYPE_LWT_XMIT = 12, + BPF_PROG_TYPE_SOCK_OPS = 13, + BPF_PROG_TYPE_SK_SKB = 14, + BPF_PROG_TYPE_CGROUP_DEVICE = 15, + BPF_PROG_TYPE_SK_MSG = 16, + BPF_PROG_TYPE_RAW_TRACEPOINT = 17, + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 18, + BPF_PROG_TYPE_LWT_SEG6LOCAL = 19, + BPF_PROG_TYPE_LIRC_MODE2 = 20, + BPF_PROG_TYPE_SK_REUSEPORT = 21, + BPF_PROG_TYPE_FLOW_DISSECTOR = 22, + BPF_PROG_TYPE_CGROUP_SYSCTL = 23, + BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 24, + BPF_PROG_TYPE_CGROUP_SOCKOPT = 25, + BPF_PROG_TYPE_TRACING = 26, + BPF_PROG_TYPE_STRUCT_OPS = 27, + BPF_PROG_TYPE_EXT = 28, + BPF_PROG_TYPE_LSM = 29, + BPF_PROG_TYPE_SK_LOOKUP = 30, + BPF_PROG_TYPE_SYSCALL = 31, +}; + +enum bpf_attach_type { + BPF_CGROUP_INET_INGRESS = 0, + BPF_CGROUP_INET_EGRESS = 1, + BPF_CGROUP_INET_SOCK_CREATE = 2, + BPF_CGROUP_SOCK_OPS = 3, + BPF_SK_SKB_STREAM_PARSER = 4, + BPF_SK_SKB_STREAM_VERDICT = 5, + BPF_CGROUP_DEVICE = 6, + BPF_SK_MSG_VERDICT = 7, + BPF_CGROUP_INET4_BIND = 8, + BPF_CGROUP_INET6_BIND = 9, + BPF_CGROUP_INET4_CONNECT = 10, + BPF_CGROUP_INET6_CONNECT = 11, + BPF_CGROUP_INET4_POST_BIND = 12, + BPF_CGROUP_INET6_POST_BIND = 13, + BPF_CGROUP_UDP4_SENDMSG = 14, + BPF_CGROUP_UDP6_SENDMSG = 15, + BPF_LIRC_MODE2 = 16, + BPF_FLOW_DISSECTOR = 17, + BPF_CGROUP_SYSCTL = 18, + BPF_CGROUP_UDP4_RECVMSG = 19, + BPF_CGROUP_UDP6_RECVMSG = 20, + BPF_CGROUP_GETSOCKOPT = 21, + BPF_CGROUP_SETSOCKOPT = 22, + BPF_TRACE_RAW_TP = 23, + BPF_TRACE_FENTRY = 24, + BPF_TRACE_FEXIT = 25, + BPF_MODIFY_RETURN = 26, + BPF_LSM_MAC = 27, + BPF_TRACE_ITER = 28, + BPF_CGROUP_INET4_GETPEERNAME = 29, + BPF_CGROUP_INET6_GETPEERNAME = 30, + BPF_CGROUP_INET4_GETSOCKNAME = 31, + BPF_CGROUP_INET6_GETSOCKNAME = 32, + BPF_XDP_DEVMAP = 33, + BPF_CGROUP_INET_SOCK_RELEASE = 34, + BPF_XDP_CPUMAP = 35, + BPF_SK_LOOKUP = 36, + BPF_XDP = 37, + BPF_SK_SKB_VERDICT = 38, + BPF_SK_REUSEPORT_SELECT = 39, + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE = 40, + BPF_PERF_EVENT = 41, + __MAX_BPF_ATTACH_TYPE = 42, +}; + +union bpf_attr { + struct { + __u32 map_type; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + __u32 inner_map_fd; + __u32 numa_node; + char map_name[16]; + __u32 map_ifindex; + __u32 btf_fd; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + __u64 map_extra; + }; + struct { + __u32 map_fd; + __u64 key; + union { + __u64 value; + __u64 next_key; + }; + __u64 flags; + }; + struct { + __u64 in_batch; + __u64 out_batch; + __u64 keys; + __u64 values; + __u32 count; + __u32 map_fd; + __u64 elem_flags; + __u64 flags; + } batch; + struct { + __u32 prog_type; + __u32 insn_cnt; + __u64 insns; + __u64 license; + __u32 log_level; + __u32 log_size; + __u64 log_buf; + __u32 kern_version; + __u32 prog_flags; + char prog_name[16]; + __u32 prog_ifindex; + __u32 expected_attach_type; + __u32 prog_btf_fd; + __u32 func_info_rec_size; + __u64 func_info; + __u32 func_info_cnt; + __u32 line_info_rec_size; + __u64 line_info; + __u32 line_info_cnt; + __u32 attach_btf_id; + union { + __u32 attach_prog_fd; + __u32 attach_btf_obj_fd; + }; + __u64 fd_array; + }; + struct { + __u64 pathname; + __u32 bpf_fd; + __u32 file_flags; + }; + struct { + __u32 target_fd; + __u32 attach_bpf_fd; + __u32 attach_type; + __u32 attach_flags; + __u32 replace_bpf_fd; + }; + struct { + __u32 prog_fd; + __u32 retval; + __u32 data_size_in; + __u32 data_size_out; + __u64 data_in; + __u64 data_out; + __u32 repeat; + __u32 duration; + __u32 ctx_size_in; + __u32 ctx_size_out; + __u64 ctx_in; + __u64 ctx_out; + __u32 flags; + __u32 cpu; + } test; + struct { + union { + __u32 start_id; + __u32 prog_id; + __u32 map_id; + __u32 btf_id; + __u32 link_id; + }; + __u32 next_id; + __u32 open_flags; + }; + struct { + __u32 bpf_fd; + __u32 info_len; + __u64 info; + } info; + struct { + __u32 target_fd; + __u32 attach_type; + __u32 query_flags; + __u32 attach_flags; + __u64 prog_ids; + __u32 prog_cnt; + } query; + struct { + __u64 name; + __u32 prog_fd; + } raw_tracepoint; + struct { + __u64 btf; + __u64 btf_log_buf; + __u32 btf_size; + __u32 btf_log_size; + __u32 btf_log_level; + }; + struct { + __u32 pid; + __u32 fd; + __u32 flags; + __u32 buf_len; + __u64 buf; + __u32 prog_id; + __u32 fd_type; + __u64 probe_offset; + __u64 probe_addr; + } task_fd_query; + struct { + __u32 prog_fd; + union { + __u32 target_fd; + __u32 target_ifindex; + }; + __u32 attach_type; + __u32 flags; + union { + __u32 target_btf_id; + struct { + __u64 iter_info; + __u32 iter_info_len; + }; + struct { + __u64 bpf_cookie; + } perf_event; + }; + } link_create; + struct { + __u32 link_fd; + __u32 new_prog_fd; + __u32 flags; + __u32 old_prog_fd; + } link_update; + struct { + __u32 link_fd; + } link_detach; + struct { + __u32 type; + } enable_stats; + struct { + __u32 link_fd; + __u32 flags; + } iter_create; + struct { + __u32 prog_fd; + __u32 map_fd; + __u32 flags; + } prog_bind_map; +}; + +struct bpf_func_info { + __u32 insn_off; + __u32 type_id; +}; + +struct bpf_line_info { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + +typedef struct { + union { + void *kernel; + void *user; + }; + bool is_kernel: 1; +} sockptr_t; + +typedef u64 (*bpf_callback_t)(u64, u64, u64, u64, u64); + +struct bpf_iter_aux_info; + +typedef int (*bpf_iter_init_seq_priv_t)(void *, struct bpf_iter_aux_info *); + +struct bpf_map; + +struct bpf_iter_aux_info { + struct bpf_map *map; +}; + +typedef void (*bpf_iter_fini_seq_priv_t)(void *); + +struct bpf_iter_seq_info { + const struct seq_operations *seq_ops; + bpf_iter_init_seq_priv_t init_seq_private; + bpf_iter_fini_seq_priv_t fini_seq_private; + u32 seq_priv_size; +}; + +struct btf; + +struct btf_type; + +struct bpf_prog_aux; + +struct bpf_local_storage_map; + +struct bpf_verifier_env; + +struct bpf_func_state; + +struct bpf_map_ops { + int (*map_alloc_check)(union bpf_attr *); + struct bpf_map * (*map_alloc)(union bpf_attr *); + void (*map_release)(struct bpf_map *, struct file *); + void (*map_free)(struct bpf_map *); + int (*map_get_next_key)(struct bpf_map *, void *, void *); + void (*map_release_uref)(struct bpf_map *); + void * (*map_lookup_elem_sys_only)(struct bpf_map *, void *); + int (*map_lookup_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + int (*map_lookup_and_delete_elem)(struct bpf_map *, void *, void *, u64); + int (*map_lookup_and_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + int (*map_update_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + int (*map_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + void * (*map_lookup_elem)(struct bpf_map *, void *); + int (*map_update_elem)(struct bpf_map *, void *, void *, u64); + int (*map_delete_elem)(struct bpf_map *, void *); + int (*map_push_elem)(struct bpf_map *, void *, u64); + int (*map_pop_elem)(struct bpf_map *, void *); + int (*map_peek_elem)(struct bpf_map *, void *); + void * (*map_fd_get_ptr)(struct bpf_map *, struct file *, int); + void (*map_fd_put_ptr)(void *); + int (*map_gen_lookup)(struct bpf_map *, struct bpf_insn *); + u32 (*map_fd_sys_lookup_elem)(void *); + void (*map_seq_show_elem)(struct bpf_map *, void *, struct seq_file *); + int (*map_check_btf)(const struct bpf_map *, const struct btf *, const struct btf_type *, const struct btf_type *); + int (*map_poke_track)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_untrack)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_run)(struct bpf_map *, u32, struct bpf_prog *, struct bpf_prog *); + int (*map_direct_value_addr)(const struct bpf_map *, u64 *, u32); + int (*map_direct_value_meta)(const struct bpf_map *, u64, u32 *); + int (*map_mmap)(struct bpf_map *, struct vm_area_struct *); + __poll_t (*map_poll)(struct bpf_map *, struct file *, struct poll_table_struct *); + int (*map_local_storage_charge)(struct bpf_local_storage_map *, void *, u32); + void (*map_local_storage_uncharge)(struct bpf_local_storage_map *, void *, u32); + struct bpf_local_storage ** (*map_owner_storage_ptr)(void *); + int (*map_redirect)(struct bpf_map *, u32, u64); + bool (*map_meta_equal)(const struct bpf_map *, const struct bpf_map *); + int (*map_set_for_each_callback_args)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *); + int (*map_for_each_callback)(struct bpf_map *, bpf_callback_t, void *, u64); + const char * const map_btf_name; + int *map_btf_id; + const struct bpf_iter_seq_info *iter_seq_info; +}; + +struct bpf_map { + const struct bpf_map_ops *ops; + struct bpf_map *inner_map_meta; + void *security; + enum bpf_map_type map_type; + u32 key_size; + u32 value_size; + u32 max_entries; + u64 map_extra; + u32 map_flags; + int spin_lock_off; + int timer_off; + u32 id; + int numa_node; + u32 btf_key_type_id; + u32 btf_value_type_id; + u32 btf_vmlinux_value_type_id; + struct btf *btf; + struct mem_cgroup *memcg; + char name[16]; + bool bypass_spec_v1; + bool frozen; + long: 48; + long: 64; + atomic64_t refcnt; + atomic64_t usercnt; + struct work_struct work; + struct mutex freeze_mutex; + atomic64_t writecnt; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct btf_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + __u32 type_off; + __u32 type_len; + __u32 str_off; + __u32 str_len; +}; + +struct btf { + void *data; + struct btf_type **types; + u32 *resolved_ids; + u32 *resolved_sizes; + const char *strings; + void *nohdr_data; + struct btf_header hdr; + u32 nr_types; + u32 types_size; + u32 data_size; + refcount_t refcnt; + u32 id; + struct callback_head rcu; + struct btf *base_btf; + u32 start_id; + u32 start_str_off; + char name[56]; + bool kernel_btf; +}; + +struct btf_type { + __u32 name_off; + __u32 info; + union { + __u32 size; + __u32 type; + }; +}; + +struct bpf_ksym { + long unsigned int start; + long unsigned int end; + char name[128]; + struct list_head lnode; + struct latch_tree_node tnode; + bool prog; +}; + +struct bpf_ctx_arg_aux; + +struct bpf_trampoline; + +struct bpf_jit_poke_descriptor; + +struct bpf_kfunc_desc_tab; + +struct bpf_kfunc_btf_tab; + +struct bpf_prog_ops; + +struct btf_mod_pair; + +struct bpf_prog_offload; + +struct bpf_func_info_aux; + +struct bpf_prog_aux { + atomic64_t refcnt; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 max_ctx_offset; + u32 max_pkt_offset; + u32 max_tp_access; + u32 stack_depth; + u32 id; + u32 func_cnt; + u32 func_idx; + u32 attach_btf_id; + u32 ctx_arg_info_size; + u32 max_rdonly_access; + u32 max_rdwr_access; + struct btf *attach_btf; + const struct bpf_ctx_arg_aux *ctx_arg_info; + struct mutex dst_mutex; + struct bpf_prog *dst_prog; + struct bpf_trampoline *dst_trampoline; + enum bpf_prog_type saved_dst_prog_type; + enum bpf_attach_type saved_dst_attach_type; + bool verifier_zext; + bool offload_requested; + bool attach_btf_trace; + bool func_proto_unreliable; + bool sleepable; + bool tail_call_reachable; + struct hlist_node tramp_hlist; + const struct btf_type *attach_func_proto; + const char *attach_func_name; + struct bpf_prog **func; + void *jit_data; + struct bpf_jit_poke_descriptor *poke_tab; + struct bpf_kfunc_desc_tab *kfunc_tab; + struct bpf_kfunc_btf_tab *kfunc_btf_tab; + u32 size_poke_tab; + struct bpf_ksym ksym; + const struct bpf_prog_ops *ops; + struct bpf_map **used_maps; + struct mutex used_maps_mutex; + struct btf_mod_pair *used_btfs; + struct bpf_prog *prog; + struct user_struct *user; + u64 load_time; + u32 verified_insns; + struct bpf_map *cgroup_storage[2]; + char name[16]; + void *security; + struct bpf_prog_offload *offload; + struct btf *btf; + struct bpf_func_info *func_info; + struct bpf_func_info_aux *func_info_aux; + struct bpf_line_info *linfo; + void **jited_linfo; + u32 func_info_cnt; + u32 nr_linfo; + u32 linfo_idx; + u32 num_exentries; + struct exception_table_entry *extable; + union { + struct work_struct work; + struct callback_head rcu; + }; +}; + +struct sock_filter { + __u16 code; + __u8 jt; + __u8 jf; + __u32 k; +}; + +struct bpf_prog_stats; + +struct sock_fprog_kern; + +struct bpf_prog { + u16 pages; + u16 jited: 1; + u16 jit_requested: 1; + u16 gpl_compatible: 1; + u16 cb_access: 1; + u16 dst_needed: 1; + u16 blinded: 1; + u16 is_func: 1; + u16 kprobe_override: 1; + u16 has_callchain_buf: 1; + u16 enforce_expected_attach_type: 1; + u16 call_get_stack: 1; + u16 call_get_func_ip: 1; + enum bpf_prog_type type; + enum bpf_attach_type expected_attach_type; + u32 len; + u32 jited_len; + u8 tag[8]; + struct bpf_prog_stats *stats; + int *active; + unsigned int (*bpf_func)(const void *, const struct bpf_insn *); + struct bpf_prog_aux *aux; + struct sock_fprog_kern *orig_prog; + union { + struct { + struct { } __empty_insns; + struct sock_filter insns[0]; + }; + struct { + struct { } __empty_insnsi; + struct bpf_insn insnsi[0]; + }; + }; +}; + +struct bpf_offloaded_map; + +struct bpf_map_dev_ops { + int (*map_get_next_key)(struct bpf_offloaded_map *, void *, void *); + int (*map_lookup_elem)(struct bpf_offloaded_map *, void *, void *); + int (*map_update_elem)(struct bpf_offloaded_map *, void *, void *, u64); + int (*map_delete_elem)(struct bpf_offloaded_map *, void *); +}; + +struct bpf_offloaded_map { + struct bpf_map map; + struct net_device *netdev; + const struct bpf_map_dev_ops *dev_ops; + void *dev_priv; + struct list_head offloads; + long: 64; + long: 64; + long: 64; +}; + +struct net_device_stats { + long unsigned int rx_packets; + long unsigned int tx_packets; + long unsigned int rx_bytes; + long unsigned int tx_bytes; + long unsigned int rx_errors; + long unsigned int tx_errors; + long unsigned int rx_dropped; + long unsigned int tx_dropped; + long unsigned int multicast; + long unsigned int collisions; + long unsigned int rx_length_errors; + long unsigned int rx_over_errors; + long unsigned int rx_crc_errors; + long unsigned int rx_frame_errors; + long unsigned int rx_fifo_errors; + long unsigned int rx_missed_errors; + long unsigned int tx_aborted_errors; + long unsigned int tx_carrier_errors; + long unsigned int tx_fifo_errors; + long unsigned int tx_heartbeat_errors; + long unsigned int tx_window_errors; + long unsigned int rx_compressed; + long unsigned int tx_compressed; +}; + +struct netdev_hw_addr_list { + struct list_head list; + int count; + struct rb_root tree; +}; + +struct tipc_bearer; + +struct dn_dev; + +struct mpls_dev; + +enum rx_handler_result { + RX_HANDLER_CONSUMED = 0, + RX_HANDLER_ANOTHER = 1, + RX_HANDLER_EXACT = 2, + RX_HANDLER_PASS = 3, +}; + +typedef enum rx_handler_result rx_handler_result_t; + +typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **); + +enum netdev_ml_priv_type { + ML_PRIV_NONE = 0, + ML_PRIV_CAN = 1, +}; + +struct pcpu_dstats; + +struct garp_port; + +struct mrp_port; + +struct netdev_tc_txq { + u16 count; + u16 offset; +}; + +struct macsec_ops; + +struct udp_tunnel_nic; + +struct bpf_xdp_link; + +struct bpf_xdp_entity { + struct bpf_prog *prog; + struct bpf_xdp_link *link; +}; + +struct netdev_name_node; + +struct dev_ifalias; + +struct net_device_ops; + +struct iw_handler_def; + +struct iw_public_data; + +struct ethtool_ops; + +struct l3mdev_ops; + +struct ndisc_ops; + +struct xfrmdev_ops; + +struct tlsdev_ops; + +struct header_ops; + +struct vlan_info; + +struct dsa_port; + +struct in_device; + +struct inet6_dev; + +struct wireless_dev; + +struct wpan_dev; + +struct netdev_rx_queue; + +struct mini_Qdisc; + +struct netdev_queue; + +struct cpu_rmap; + +struct Qdisc; + +struct xdp_dev_bulk_queue; + +struct xps_dev_maps; + +struct netpoll_info; + +struct pcpu_lstats; + +struct pcpu_sw_netstats; + +struct rtnl_link_ops; + +struct dcbnl_rtnl_ops; + +struct netprio_map; + +struct phy_device; + +struct sfp_bus; + +struct udp_tunnel_nic_info; + +struct net_device { + char name[16]; + struct netdev_name_node *name_node; + struct dev_ifalias *ifalias; + long unsigned int mem_end; + long unsigned int mem_start; + long unsigned int base_addr; + long unsigned int state; + struct list_head dev_list; + struct list_head napi_list; + struct list_head unreg_list; + struct list_head close_list; + struct list_head ptype_all; + struct list_head ptype_specific; + struct { + struct list_head upper; + struct list_head lower; + } adj_list; + unsigned int flags; + unsigned int priv_flags; + const struct net_device_ops *netdev_ops; + int ifindex; + short unsigned int gflags; + short unsigned int hard_header_len; + unsigned int mtu; + short unsigned int needed_headroom; + short unsigned int needed_tailroom; + netdev_features_t features; + netdev_features_t hw_features; + netdev_features_t wanted_features; + netdev_features_t vlan_features; + netdev_features_t hw_enc_features; + netdev_features_t mpls_features; + netdev_features_t gso_partial_features; + unsigned int min_mtu; + unsigned int max_mtu; + short unsigned int type; + unsigned char min_header_len; + unsigned char name_assign_type; + int group; + struct net_device_stats stats; + atomic_long_t rx_dropped; + atomic_long_t tx_dropped; + atomic_long_t rx_nohandler; + atomic_t carrier_up_count; + atomic_t carrier_down_count; + const struct iw_handler_def *wireless_handlers; + struct iw_public_data *wireless_data; + const struct ethtool_ops *ethtool_ops; + const struct l3mdev_ops *l3mdev_ops; + const struct ndisc_ops *ndisc_ops; + const struct xfrmdev_ops *xfrmdev_ops; + const struct tlsdev_ops *tlsdev_ops; + const struct header_ops *header_ops; + unsigned char operstate; + unsigned char link_mode; + unsigned char if_port; + unsigned char dma; + unsigned char perm_addr[32]; + unsigned char addr_assign_type; + unsigned char addr_len; + unsigned char upper_level; + unsigned char lower_level; + short unsigned int neigh_priv_len; + short unsigned int dev_id; + short unsigned int dev_port; + short unsigned int padded; + spinlock_t addr_list_lock; + int irq; + struct netdev_hw_addr_list uc; + struct netdev_hw_addr_list mc; + struct netdev_hw_addr_list dev_addrs; + struct kset *queues_kset; + unsigned int promiscuity; + unsigned int allmulti; + bool uc_promisc; + struct vlan_info *vlan_info; + struct dsa_port *dsa_ptr; + struct tipc_bearer *tipc_ptr; + void *atalk_ptr; + struct in_device *ip_ptr; + struct dn_dev *dn_ptr; + struct inet6_dev *ip6_ptr; + void *ax25_ptr; + struct wireless_dev *ieee80211_ptr; + struct wpan_dev *ieee802154_ptr; + struct mpls_dev *mpls_ptr; + unsigned char *dev_addr; + struct netdev_rx_queue *_rx; + unsigned int num_rx_queues; + unsigned int real_num_rx_queues; + struct bpf_prog *xdp_prog; + long unsigned int gro_flush_timeout; + int napi_defer_hard_irqs; + rx_handler_func_t *rx_handler; + void *rx_handler_data; + struct mini_Qdisc *miniq_ingress; + struct netdev_queue *ingress_queue; + struct nf_hook_entries *nf_hooks_ingress; + unsigned char broadcast[32]; + struct cpu_rmap *rx_cpu_rmap; + struct hlist_node index_hlist; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct netdev_queue *_tx; + unsigned int num_tx_queues; + unsigned int real_num_tx_queues; + struct Qdisc *qdisc; + unsigned int tx_queue_len; + spinlock_t tx_global_lock; + struct xdp_dev_bulk_queue *xdp_bulkq; + struct xps_dev_maps *xps_maps[2]; + struct mini_Qdisc *miniq_egress; + struct nf_hook_entries *nf_hooks_egress; + struct hlist_head qdisc_hash[16]; + struct timer_list watchdog_timer; + int watchdog_timeo; + u32 proto_down_reason; + struct list_head todo_list; + int *pcpu_refcnt; + struct list_head link_watch_list; + enum { + NETREG_UNINITIALIZED = 0, + NETREG_REGISTERED = 1, + NETREG_UNREGISTERING = 2, + NETREG_UNREGISTERED = 3, + NETREG_RELEASED = 4, + NETREG_DUMMY = 5, + } reg_state: 8; + bool dismantle; + enum { + RTNL_LINK_INITIALIZED = 0, + RTNL_LINK_INITIALIZING = 1, + } rtnl_link_state: 16; + bool needs_free_netdev; + void (*priv_destructor)(struct net_device *); + struct netpoll_info *npinfo; + possible_net_t nd_net; + void *ml_priv; + enum netdev_ml_priv_type ml_priv_type; + union { + struct pcpu_lstats *lstats; + struct pcpu_sw_netstats *tstats; + struct pcpu_dstats *dstats; + }; + struct garp_port *garp_port; + struct mrp_port *mrp_port; + struct device dev; + const struct attribute_group *sysfs_groups[4]; + const struct attribute_group *sysfs_rx_queue_group; + const struct rtnl_link_ops *rtnl_link_ops; + unsigned int gso_max_size; + u16 gso_max_segs; + const struct dcbnl_rtnl_ops *dcbnl_ops; + s16 num_tc; + struct netdev_tc_txq tc_to_txq[16]; + u8 prio_tc_map[16]; + unsigned int fcoe_ddp_xid; + struct netprio_map *priomap; + struct phy_device *phydev; + struct sfp_bus *sfp_bus; + struct lock_class_key *qdisc_tx_busylock; + bool proto_down; + unsigned int wol_enabled: 1; + unsigned int threaded: 1; + struct list_head net_notifier_list; + const struct macsec_ops *macsec_ops; + const struct udp_tunnel_nic_info *udp_tunnel_nic_info; + struct udp_tunnel_nic *udp_tunnel_nic; + struct bpf_xdp_entity xdp_state[3]; + long: 64; +}; + +enum bpf_reg_type { + NOT_INIT = 0, + SCALAR_VALUE = 1, + PTR_TO_CTX = 2, + CONST_PTR_TO_MAP = 3, + PTR_TO_MAP_VALUE = 4, + PTR_TO_MAP_VALUE_OR_NULL = 5, + PTR_TO_STACK = 6, + PTR_TO_PACKET_META = 7, + PTR_TO_PACKET = 8, + PTR_TO_PACKET_END = 9, + PTR_TO_FLOW_KEYS = 10, + PTR_TO_SOCKET = 11, + PTR_TO_SOCKET_OR_NULL = 12, + PTR_TO_SOCK_COMMON = 13, + PTR_TO_SOCK_COMMON_OR_NULL = 14, + PTR_TO_TCP_SOCK = 15, + PTR_TO_TCP_SOCK_OR_NULL = 16, + PTR_TO_TP_BUFFER = 17, + PTR_TO_XDP_SOCK = 18, + PTR_TO_BTF_ID = 19, + PTR_TO_BTF_ID_OR_NULL = 20, + PTR_TO_MEM = 21, + PTR_TO_MEM_OR_NULL = 22, + PTR_TO_RDONLY_BUF = 23, + PTR_TO_RDONLY_BUF_OR_NULL = 24, + PTR_TO_RDWR_BUF = 25, + PTR_TO_RDWR_BUF_OR_NULL = 26, + PTR_TO_PERCPU_BTF_ID = 27, + PTR_TO_FUNC = 28, + PTR_TO_MAP_KEY = 29, + __BPF_REG_TYPE_MAX = 30, +}; + +struct bpf_prog_ops { + int (*test_run)(struct bpf_prog *, const union bpf_attr *, union bpf_attr *); +}; + +struct bpf_offload_dev; + +struct bpf_prog_offload { + struct bpf_prog *prog; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + void *dev_priv; + struct list_head offloads; + bool dev_state; + bool opt_failed; + void *jited_image; + u32 jited_len; +}; + +struct btf_func_model { + u8 ret_size; + u8 nr_args; + u8 arg_size[12]; +}; + +struct bpf_tramp_image { + void *image; + struct bpf_ksym ksym; + struct percpu_ref pcref; + void *ip_after_call; + void *ip_epilogue; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +struct bpf_trampoline { + struct hlist_node hlist; + struct mutex mutex; + refcount_t refcnt; + u64 key; + struct { + struct btf_func_model model; + void *addr; + bool ftrace_managed; + } func; + struct bpf_prog *extension_prog; + struct hlist_head progs_hlist[3]; + int progs_cnt[3]; + struct bpf_tramp_image *cur_image; + u64 selector; + struct module *mod; +}; + +struct bpf_func_info_aux { + u16 linkage; + bool unreliable; +}; + +struct bpf_jit_poke_descriptor { + void *tailcall_target; + void *tailcall_bypass; + void *bypass_addr; + void *aux; + union { + struct { + struct bpf_map *map; + u32 key; + } tail_call; + }; + bool tailcall_target_stable; + u8 adj_off; + u16 reason; + u32 insn_idx; +}; + +struct bpf_ctx_arg_aux { + u32 offset; + enum bpf_reg_type reg_type; + u32 btf_id; +}; + +struct btf_mod_pair { + struct btf *btf; + struct module *module; +}; + +typedef unsigned int sk_buff_data_t; + +struct skb_ext; + +struct sk_buff { + union { + struct { + struct sk_buff *next; + struct sk_buff *prev; + union { + struct net_device *dev; + long unsigned int dev_scratch; + }; + }; + struct rb_node rbnode; + struct list_head list; + }; + union { + struct sock *sk; + int ip_defrag_offset; + }; + union { + ktime_t tstamp; + u64 skb_mstamp_ns; + }; + char cb[48]; + union { + struct { + long unsigned int _skb_refdst; + void (*destructor)(struct sk_buff *); + }; + struct list_head tcp_tsorted_anchor; + long unsigned int _sk_redir; + }; + long unsigned int _nfct; + unsigned int len; + unsigned int data_len; + __u16 mac_len; + __u16 hdr_len; + __u16 queue_mapping; + __u8 __cloned_offset[0]; + __u8 cloned: 1; + __u8 nohdr: 1; + __u8 fclone: 2; + __u8 peeked: 1; + __u8 head_frag: 1; + __u8 pfmemalloc: 1; + __u8 pp_recycle: 1; + __u8 active_extensions; + __u32 headers_start[0]; + __u8 __pkt_type_offset[0]; + __u8 pkt_type: 3; + __u8 ignore_df: 1; + __u8 nf_trace: 1; + __u8 ip_summed: 2; + __u8 ooo_okay: 1; + __u8 l4_hash: 1; + __u8 sw_hash: 1; + __u8 wifi_acked_valid: 1; + __u8 wifi_acked: 1; + __u8 no_fcs: 1; + __u8 encapsulation: 1; + __u8 encap_hdr_csum: 1; + __u8 csum_valid: 1; + __u8 __pkt_vlan_present_offset[0]; + __u8 vlan_present: 1; + __u8 csum_complete_sw: 1; + __u8 csum_level: 2; + __u8 csum_not_inet: 1; + __u8 dst_pending_confirm: 1; + __u8 ndisc_nodetype: 2; + __u8 ipvs_property: 1; + __u8 inner_protocol_type: 1; + __u8 remcsum_offload: 1; + __u8 offload_fwd_mark: 1; + __u8 offload_l3_fwd_mark: 1; + __u8 tc_skip_classify: 1; + __u8 tc_at_ingress: 1; + __u8 redirected: 1; + __u8 from_ingress: 1; + __u8 nf_skip_egress: 1; + __u8 decrypted: 1; + __u8 slow_gro: 1; + __u16 tc_index; + union { + __wsum csum; + struct { + __u16 csum_start; + __u16 csum_offset; + }; + }; + __u32 priority; + int skb_iif; + __u32 hash; + __be16 vlan_proto; + __u16 vlan_tci; + union { + unsigned int napi_id; + unsigned int sender_cpu; + }; + __u32 secmark; + union { + __u32 mark; + __u32 reserved_tailroom; + }; + union { + __be16 inner_protocol; + __u8 inner_ipproto; + }; + __u16 inner_transport_header; + __u16 inner_network_header; + __u16 inner_mac_header; + __be16 protocol; + __u16 transport_header; + __u16 network_header; + __u16 mac_header; + __u32 headers_end[0]; + sk_buff_data_t tail; + sk_buff_data_t end; + unsigned char *head; + unsigned char *data; + unsigned int truesize; + refcount_t users; + struct skb_ext *extensions; +}; + +enum { + Root_NFS = 255, + Root_CIFS = 254, + Root_RAM0 = 1048576, + Root_RAM1 = 1048577, + Root_FD0 = 2097152, + Root_HDA1 = 3145729, + Root_HDA2 = 3145730, + Root_SDA1 = 8388609, + Root_SDA2 = 8388610, + Root_HDC1 = 23068673, + Root_SR0 = 11534336, +}; + +struct scatterlist { + long unsigned int page_link; + unsigned int offset; + unsigned int length; + dma_addr_t dma_address; + unsigned int dma_length; +}; + +struct flowi_tunnel { + __be64 tun_id; +}; + +struct flowi_common { + int flowic_oif; + int flowic_iif; + __u32 flowic_mark; + __u8 flowic_tos; + __u8 flowic_scope; + __u8 flowic_proto; + __u8 flowic_flags; + __u32 flowic_secid; + kuid_t flowic_uid; + struct flowi_tunnel flowic_tun_key; + __u32 flowic_multipath_hash; +}; + +union flowi_uli { + struct { + __be16 dport; + __be16 sport; + } ports; + struct { + __u8 type; + __u8 code; + } icmpt; + struct { + __le16 dport; + __le16 sport; + } dnports; + __be32 gre_key; + struct { + __u8 type; + } mht; +}; + +struct flowi4 { + struct flowi_common __fl_common; + __be32 saddr; + __be32 daddr; + union flowi_uli uli; +}; + +struct flowi6 { + struct flowi_common __fl_common; + struct in6_addr daddr; + struct in6_addr saddr; + __be32 flowlabel; + union flowi_uli uli; + __u32 mp_hash; +}; + +struct flowidn { + struct flowi_common __fl_common; + __le16 daddr; + __le16 saddr; + union flowi_uli uli; +}; + +struct flowi { + union { + struct flowi_common __fl_common; + struct flowi4 ip4; + struct flowi6 ip6; + struct flowidn dn; + } u; +}; + +struct ipstats_mib { + u64 mibs[37]; + struct u64_stats_sync syncp; +}; + +struct icmp_mib { + long unsigned int mibs[28]; +}; + +struct icmpmsg_mib { + atomic_long_t mibs[512]; +}; + +struct icmpv6_mib { + long unsigned int mibs[6]; +}; + +struct icmpv6_mib_device { + atomic_long_t mibs[6]; +}; + +struct icmpv6msg_mib { + atomic_long_t mibs[512]; +}; + +struct icmpv6msg_mib_device { + atomic_long_t mibs[512]; +}; + +struct tcp_mib { + long unsigned int mibs[16]; +}; + +struct udp_mib { + long unsigned int mibs[10]; +}; + +struct linux_mib { + long unsigned int mibs[126]; +}; + +struct linux_xfrm_mib { + long unsigned int mibs[29]; +}; + +struct linux_tls_mib { + long unsigned int mibs[11]; +}; + +struct inet_frags; + +struct fqdir { + long int high_thresh; + long int low_thresh; + int timeout; + int max_dist; + struct inet_frags *f; + struct net *net; + bool dead; + long: 56; + long: 64; + long: 64; + struct rhashtable rhashtable; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + atomic_long_t mem; + struct work_struct destroy_work; + struct llist_node free_list; + long: 64; + long: 64; +}; + +struct inet_frag_queue; + +struct inet_frags { + unsigned int qsize; + void (*constructor)(struct inet_frag_queue *, const void *); + void (*destructor)(struct inet_frag_queue *); + void (*frag_expire)(struct timer_list *); + struct kmem_cache *frags_cachep; + const char *frags_cache_name; + struct rhashtable_params rhash_params; + refcount_t refcnt; + struct completion completion; +}; + +struct frag_v4_compare_key { + __be32 saddr; + __be32 daddr; + u32 user; + u32 vif; + __be16 id; + u16 protocol; +}; + +struct frag_v6_compare_key { + struct in6_addr saddr; + struct in6_addr daddr; + u32 user; + __be32 id; + u32 iif; +}; + +struct inet_frag_queue { + struct rhash_head node; + union { + struct frag_v4_compare_key v4; + struct frag_v6_compare_key v6; + } key; + struct timer_list timer; + spinlock_t lock; + refcount_t refcnt; + struct rb_root rb_fragments; + struct sk_buff *fragments_tail; + struct sk_buff *last_run_head; + ktime_t stamp; + int len; + int meat; + __u8 flags; + u16 max_size; + struct fqdir *fqdir; + struct callback_head rcu; +}; + +struct fib_rule; + +struct fib_lookup_arg; + +struct fib_rule_hdr; + +struct nlattr; + +struct netlink_ext_ack; + +struct nla_policy; + +struct fib_rules_ops { + int family; + struct list_head list; + int rule_size; + int addr_size; + int unresolved_rules; + int nr_goto_rules; + unsigned int fib_rules_seq; + int (*action)(struct fib_rule *, struct flowi *, int, struct fib_lookup_arg *); + bool (*suppress)(struct fib_rule *, int, struct fib_lookup_arg *); + int (*match)(struct fib_rule *, struct flowi *, int); + int (*configure)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *, struct nlattr **, struct netlink_ext_ack *); + int (*delete)(struct fib_rule *); + int (*compare)(struct fib_rule *, struct fib_rule_hdr *, struct nlattr **); + int (*fill)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *); + size_t (*nlmsg_payload)(struct fib_rule *); + void (*flush_cache)(struct fib_rules_ops *); + int nlgroup; + const struct nla_policy *policy; + struct list_head rules_list; + struct module *owner; + struct net *fro_net; + struct callback_head rcu; +}; + +enum tcp_ca_event { + CA_EVENT_TX_START = 0, + CA_EVENT_CWND_RESTART = 1, + CA_EVENT_COMPLETE_CWR = 2, + CA_EVENT_LOSS = 3, + CA_EVENT_ECN_NO_CE = 4, + CA_EVENT_ECN_IS_CE = 5, +}; + +struct ack_sample; + +struct rate_sample; + +union tcp_cc_info; + +struct tcp_congestion_ops { + u32 (*ssthresh)(struct sock *); + void (*cong_avoid)(struct sock *, u32, u32); + void (*set_state)(struct sock *, u8); + void (*cwnd_event)(struct sock *, enum tcp_ca_event); + void (*in_ack_event)(struct sock *, u32); + void (*pkts_acked)(struct sock *, const struct ack_sample *); + u32 (*min_tso_segs)(struct sock *); + void (*cong_control)(struct sock *, const struct rate_sample *); + u32 (*undo_cwnd)(struct sock *); + u32 (*sndbuf_expand)(struct sock *); + size_t (*get_info)(struct sock *, u32, int *, union tcp_cc_info *); + char name[16]; + struct module *owner; + struct list_head list; + u32 key; + u32 flags; + void (*init)(struct sock *); + void (*release)(struct sock *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct fib_notifier_ops { + int family; + struct list_head list; + unsigned int (*fib_seq_read)(struct net *); + int (*fib_dump)(struct net *, struct notifier_block *, struct netlink_ext_ack *); + struct module *owner; + struct callback_head rcu; +}; + +struct xfrm_state; + +struct lwtunnel_state; + +struct dst_entry { + struct net_device *dev; + struct dst_ops *ops; + long unsigned int _metrics; + long unsigned int expires; + struct xfrm_state *xfrm; + int (*input)(struct sk_buff *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + short unsigned int flags; + short int obsolete; + short unsigned int header_len; + short unsigned int trailer_len; + atomic_t __refcnt; + int __use; + long unsigned int lastuse; + struct lwtunnel_state *lwtstate; + struct callback_head callback_head; + short int error; + short int __pad; + __u32 tclassid; +}; + +struct hh_cache { + unsigned int hh_len; + seqlock_t hh_lock; + long unsigned int hh_data[16]; +}; + +struct neigh_table; + +struct neigh_parms; + +struct neigh_ops; + +struct neighbour { + struct neighbour *next; + struct neigh_table *tbl; + struct neigh_parms *parms; + long unsigned int confirmed; + long unsigned int updated; + rwlock_t lock; + refcount_t refcnt; + unsigned int arp_queue_len_bytes; + struct sk_buff_head arp_queue; + struct timer_list timer; + long unsigned int used; + atomic_t probes; + u8 nud_state; + u8 type; + u8 dead; + u8 protocol; + u32 flags; + seqlock_t ha_lock; + int: 32; + unsigned char ha[32]; + struct hh_cache hh; + int (*output)(struct neighbour *, struct sk_buff *); + const struct neigh_ops *ops; + struct list_head gc_list; + struct list_head managed_list; + struct callback_head rcu; + struct net_device *dev; + u8 primary_key[0]; +}; + +struct ipv6_stable_secret { + bool initialized; + struct in6_addr secret; +}; + +struct ipv6_devconf { + __s32 forwarding; + __s32 hop_limit; + __s32 mtu6; + __s32 accept_ra; + __s32 accept_redirects; + __s32 autoconf; + __s32 dad_transmits; + __s32 rtr_solicits; + __s32 rtr_solicit_interval; + __s32 rtr_solicit_max_interval; + __s32 rtr_solicit_delay; + __s32 force_mld_version; + __s32 mldv1_unsolicited_report_interval; + __s32 mldv2_unsolicited_report_interval; + __s32 use_tempaddr; + __s32 temp_valid_lft; + __s32 temp_prefered_lft; + __s32 regen_max_retry; + __s32 max_desync_factor; + __s32 max_addresses; + __s32 accept_ra_defrtr; + __u32 ra_defrtr_metric; + __s32 accept_ra_min_hop_limit; + __s32 accept_ra_pinfo; + __s32 ignore_routes_with_linkdown; + __s32 accept_ra_rtr_pref; + __s32 rtr_probe_interval; + __s32 accept_ra_rt_info_min_plen; + __s32 accept_ra_rt_info_max_plen; + __s32 proxy_ndp; + __s32 accept_source_route; + __s32 accept_ra_from_local; + __s32 mc_forwarding; + __s32 disable_ipv6; + __s32 drop_unicast_in_l2_multicast; + __s32 accept_dad; + __s32 force_tllao; + __s32 ndisc_notify; + __s32 suppress_frag_ndisc; + __s32 accept_ra_mtu; + __s32 drop_unsolicited_na; + struct ipv6_stable_secret stable_secret; + __s32 use_oif_addrs_only; + __s32 keep_addr_on_down; + __s32 seg6_enabled; + __s32 seg6_require_hmac; + __u32 enhanced_dad; + __u32 addr_gen_mode; + __s32 disable_policy; + __s32 ndisc_tclass; + __s32 rpl_seg_enabled; + __u32 ioam6_id; + __u32 ioam6_id_wide; + __u8 ioam6_enabled; + __u8 ndisc_evict_nocarrier; + struct ctl_table_header *sysctl_header; +}; + +enum nf_log_type { + NF_LOG_TYPE_LOG = 0, + NF_LOG_TYPE_ULOG = 1, + NF_LOG_TYPE_MAX = 2, +}; + +typedef u8 u_int8_t; + +struct nf_loginfo; + +typedef void nf_logfn(struct net *, u_int8_t, unsigned int, const struct sk_buff *, const struct net_device *, const struct net_device *, const struct nf_loginfo *, const char *); + +struct nf_logger { + char *name; + enum nf_log_type type; + nf_logfn *logfn; + struct module *me; +}; + +struct hlist_nulls_head { + struct hlist_nulls_node *first; +}; + +struct ip_conntrack_stat { + unsigned int found; + unsigned int invalid; + unsigned int insert; + unsigned int insert_failed; + unsigned int clash_resolve; + unsigned int drop; + unsigned int early_drop; + unsigned int error; + unsigned int expect_new; + unsigned int expect_create; + unsigned int expect_delete; + unsigned int search_restart; + unsigned int chaintoolong; +}; + +struct ct_pcpu { + spinlock_t lock; + struct hlist_nulls_head unconfirmed; + struct hlist_nulls_head dying; +}; + +typedef enum { + SS_FREE = 0, + SS_UNCONNECTED = 1, + SS_CONNECTING = 2, + SS_CONNECTED = 3, + SS_DISCONNECTING = 4, +} socket_state; + +struct socket_wq { + wait_queue_head_t wait; + struct fasync_struct *fasync_list; + long unsigned int flags; + struct callback_head rcu; + long: 64; +}; + +struct proto_ops; + +struct socket { + socket_state state; + short int type; + long unsigned int flags; + struct file *file; + struct sock *sk; + const struct proto_ops *ops; + long: 64; + long: 64; + long: 64; + struct socket_wq wq; +}; + +typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *, unsigned int, size_t); + +struct proto_ops { + int family; + struct module *owner; + int (*release)(struct socket *); + int (*bind)(struct socket *, struct sockaddr *, int); + int (*connect)(struct socket *, struct sockaddr *, int, int); + int (*socketpair)(struct socket *, struct socket *); + int (*accept)(struct socket *, struct socket *, int, bool); + int (*getname)(struct socket *, struct sockaddr *, int); + __poll_t (*poll)(struct file *, struct socket *, struct poll_table_struct *); + int (*ioctl)(struct socket *, unsigned int, long unsigned int); + int (*compat_ioctl)(struct socket *, unsigned int, long unsigned int); + int (*gettstamp)(struct socket *, void *, bool, bool); + int (*listen)(struct socket *, int); + int (*shutdown)(struct socket *, int); + int (*setsockopt)(struct socket *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct socket *, int, int, char *, int *); + void (*show_fdinfo)(struct seq_file *, struct socket *); + int (*sendmsg)(struct socket *, struct msghdr *, size_t); + int (*recvmsg)(struct socket *, struct msghdr *, size_t, int); + int (*mmap)(struct file *, struct socket *, struct vm_area_struct *); + ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int); + ssize_t (*splice_read)(struct socket *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + int (*set_peek_off)(struct sock *, int); + int (*peek_len)(struct socket *); + int (*read_sock)(struct sock *, read_descriptor_t *, sk_read_actor_t); + int (*sendpage_locked)(struct sock *, struct page *, int, size_t, int); + int (*sendmsg_locked)(struct sock *, struct msghdr *, size_t); + int (*set_rcvlowat)(struct sock *, int); +}; + +struct pipe_buf_operations; + +struct pipe_buffer { + struct page *page; + unsigned int offset; + unsigned int len; + const struct pipe_buf_operations *ops; + unsigned int flags; + long unsigned int private; +}; + +struct pipe_buf_operations { + int (*confirm)(struct pipe_inode_info *, struct pipe_buffer *); + void (*release)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*get)(struct pipe_inode_info *, struct pipe_buffer *); +}; + +struct skb_ext { + refcount_t refcnt; + u8 offset[4]; + u8 chunks; + long: 56; + char data[0]; +}; + +struct dql { + unsigned int num_queued; + unsigned int adj_limit; + unsigned int last_obj_cnt; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int limit; + unsigned int num_completed; + unsigned int prev_ovlimit; + unsigned int prev_num_queued; + unsigned int prev_last_obj_cnt; + unsigned int lowest_slack; + long unsigned int slack_start_time; + unsigned int max_limit; + unsigned int min_limit; + unsigned int slack_hold_time; + long: 32; + long: 64; + long: 64; +}; + +struct ieee_ets { + __u8 willing; + __u8 ets_cap; + __u8 cbs; + __u8 tc_tx_bw[8]; + __u8 tc_rx_bw[8]; + __u8 tc_tsa[8]; + __u8 prio_tc[8]; + __u8 tc_reco_bw[8]; + __u8 tc_reco_tsa[8]; + __u8 reco_prio_tc[8]; +}; + +struct ieee_maxrate { + __u64 tc_maxrate[8]; +}; + +struct ieee_qcn { + __u8 rpg_enable[8]; + __u32 rppp_max_rps[8]; + __u32 rpg_time_reset[8]; + __u32 rpg_byte_reset[8]; + __u32 rpg_threshold[8]; + __u32 rpg_max_rate[8]; + __u32 rpg_ai_rate[8]; + __u32 rpg_hai_rate[8]; + __u32 rpg_gd[8]; + __u32 rpg_min_dec_fac[8]; + __u32 rpg_min_rate[8]; + __u32 cndd_state_machine[8]; +}; + +struct ieee_qcn_stats { + __u64 rppp_rp_centiseconds[8]; + __u32 rppp_created_rps[8]; +}; + +struct ieee_pfc { + __u8 pfc_cap; + __u8 pfc_en; + __u8 mbc; + __u16 delay; + __u64 requests[8]; + __u64 indications[8]; +}; + +struct dcbnl_buffer { + __u8 prio2buffer[8]; + __u32 buffer_size[8]; + __u32 total_size; +}; + +struct cee_pg { + __u8 willing; + __u8 error; + __u8 pg_en; + __u8 tcs_supported; + __u8 pg_bw[8]; + __u8 prio_pg[8]; +}; + +struct cee_pfc { + __u8 willing; + __u8 error; + __u8 pfc_en; + __u8 tcs_supported; +}; + +struct dcb_app { + __u8 selector; + __u8 priority; + __u16 protocol; +}; + +struct dcb_peer_app_info { + __u8 willing; + __u8 error; +}; + +struct dcbnl_rtnl_ops { + int (*ieee_getets)(struct net_device *, struct ieee_ets *); + int (*ieee_setets)(struct net_device *, struct ieee_ets *); + int (*ieee_getmaxrate)(struct net_device *, struct ieee_maxrate *); + int (*ieee_setmaxrate)(struct net_device *, struct ieee_maxrate *); + int (*ieee_getqcn)(struct net_device *, struct ieee_qcn *); + int (*ieee_setqcn)(struct net_device *, struct ieee_qcn *); + int (*ieee_getqcnstats)(struct net_device *, struct ieee_qcn_stats *); + int (*ieee_getpfc)(struct net_device *, struct ieee_pfc *); + int (*ieee_setpfc)(struct net_device *, struct ieee_pfc *); + int (*ieee_getapp)(struct net_device *, struct dcb_app *); + int (*ieee_setapp)(struct net_device *, struct dcb_app *); + int (*ieee_delapp)(struct net_device *, struct dcb_app *); + int (*ieee_peer_getets)(struct net_device *, struct ieee_ets *); + int (*ieee_peer_getpfc)(struct net_device *, struct ieee_pfc *); + u8 (*getstate)(struct net_device *); + u8 (*setstate)(struct net_device *, u8); + void (*getpermhwaddr)(struct net_device *, u8 *); + void (*setpgtccfgtx)(struct net_device *, int, u8, u8, u8, u8); + void (*setpgbwgcfgtx)(struct net_device *, int, u8); + void (*setpgtccfgrx)(struct net_device *, int, u8, u8, u8, u8); + void (*setpgbwgcfgrx)(struct net_device *, int, u8); + void (*getpgtccfgtx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); + void (*getpgbwgcfgtx)(struct net_device *, int, u8 *); + void (*getpgtccfgrx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); + void (*getpgbwgcfgrx)(struct net_device *, int, u8 *); + void (*setpfccfg)(struct net_device *, int, u8); + void (*getpfccfg)(struct net_device *, int, u8 *); + u8 (*setall)(struct net_device *); + u8 (*getcap)(struct net_device *, int, u8 *); + int (*getnumtcs)(struct net_device *, int, u8 *); + int (*setnumtcs)(struct net_device *, int, u8); + u8 (*getpfcstate)(struct net_device *); + void (*setpfcstate)(struct net_device *, u8); + void (*getbcncfg)(struct net_device *, int, u32 *); + void (*setbcncfg)(struct net_device *, int, u32); + void (*getbcnrp)(struct net_device *, int, u8 *); + void (*setbcnrp)(struct net_device *, int, u8); + int (*setapp)(struct net_device *, u8, u16, u8); + int (*getapp)(struct net_device *, u8, u16); + u8 (*getfeatcfg)(struct net_device *, int, u8 *); + u8 (*setfeatcfg)(struct net_device *, int, u8); + u8 (*getdcbx)(struct net_device *); + u8 (*setdcbx)(struct net_device *, u8); + int (*peer_getappinfo)(struct net_device *, struct dcb_peer_app_info *, u16 *); + int (*peer_getapptable)(struct net_device *, struct dcb_app *); + int (*cee_peer_getpg)(struct net_device *, struct cee_pg *); + int (*cee_peer_getpfc)(struct net_device *, struct cee_pfc *); + int (*dcbnl_getbuffer)(struct net_device *, struct dcbnl_buffer *); + int (*dcbnl_setbuffer)(struct net_device *, struct dcbnl_buffer *); +}; + +struct netprio_map { + struct callback_head rcu; + u32 priomap_len; + u32 priomap[0]; +}; + +struct xdp_mem_info { + u32 type; + u32 id; +}; + +struct xdp_rxq_info { + struct net_device *dev; + u32 queue_index; + u32 reg_state; + struct xdp_mem_info mem; + unsigned int napi_id; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_txq_info { + struct net_device *dev; +}; + +struct xdp_buff { + void *data; + void *data_end; + void *data_meta; + void *data_hard_start; + struct xdp_rxq_info *rxq; + struct xdp_txq_info *txq; + u32 frame_sz; +}; + +struct xdp_frame { + void *data; + u16 len; + u16 headroom; + u32 metasize: 8; + u32 frame_sz: 24; + struct xdp_mem_info mem; + struct net_device *dev_rx; +}; + +struct nlmsghdr { + __u32 nlmsg_len; + __u16 nlmsg_type; + __u16 nlmsg_flags; + __u32 nlmsg_seq; + __u32 nlmsg_pid; +}; + +struct nlattr { + __u16 nla_len; + __u16 nla_type; +}; + +struct netlink_ext_ack { + const char *_msg; + const struct nlattr *bad_attr; + const struct nla_policy *policy; + u8 cookie[20]; + u8 cookie_len; +}; + +struct netlink_range_validation; + +struct netlink_range_validation_signed; + +struct nla_policy { + u8 type; + u8 validation_type; + u16 len; + union { + const u32 bitfield32_valid; + const u32 mask; + const char *reject_message; + const struct nla_policy *nested_policy; + struct netlink_range_validation *range; + struct netlink_range_validation_signed *range_signed; + struct { + s16 min; + s16 max; + }; + int (*validate)(const struct nlattr *, struct netlink_ext_ack *); + u16 strict_start_type; + }; +}; + +struct netlink_callback { + struct sk_buff *skb; + const struct nlmsghdr *nlh; + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + void *data; + struct module *module; + struct netlink_ext_ack *extack; + u16 family; + u16 answer_flags; + u32 min_dump_alloc; + unsigned int prev_seq; + unsigned int seq; + bool strict_check; + union { + u8 ctx[48]; + long int args[6]; + }; +}; + +struct ndmsg { + __u8 ndm_family; + __u8 ndm_pad1; + __u16 ndm_pad2; + __s32 ndm_ifindex; + __u16 ndm_state; + __u8 ndm_flags; + __u8 ndm_type; +}; + +struct rtnl_link_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; + __u64 collisions; + __u64 rx_length_errors; + __u64 rx_over_errors; + __u64 rx_crc_errors; + __u64 rx_frame_errors; + __u64 rx_fifo_errors; + __u64 rx_missed_errors; + __u64 tx_aborted_errors; + __u64 tx_carrier_errors; + __u64 tx_fifo_errors; + __u64 tx_heartbeat_errors; + __u64 tx_window_errors; + __u64 rx_compressed; + __u64 tx_compressed; + __u64 rx_nohandler; +}; + +struct ifla_vf_guid { + __u32 vf; + __u64 guid; +}; + +struct ifla_vf_stats { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 broadcast; + __u64 multicast; + __u64 rx_dropped; + __u64 tx_dropped; +}; + +struct ifla_vf_info { + __u32 vf; + __u8 mac[32]; + __u32 vlan; + __u32 qos; + __u32 spoofchk; + __u32 linkstate; + __u32 min_tx_rate; + __u32 max_tx_rate; + __u32 rss_query_en; + __u32 trusted; + __be16 vlan_proto; +}; + +struct tc_stats { + __u64 bytes; + __u32 packets; + __u32 drops; + __u32 overlimits; + __u32 bps; + __u32 pps; + __u32 qlen; + __u32 backlog; +}; + +struct tc_sizespec { + unsigned char cell_log; + unsigned char size_log; + short int cell_align; + int overhead; + unsigned int linklayer; + unsigned int mpu; + unsigned int mtu; + unsigned int tsize; +}; + +enum netdev_tx { + __NETDEV_TX_MIN = 2147483648, + NETDEV_TX_OK = 0, + NETDEV_TX_BUSY = 16, +}; + +typedef enum netdev_tx netdev_tx_t; + +struct header_ops { + int (*create)(struct sk_buff *, struct net_device *, short unsigned int, const void *, const void *, unsigned int); + int (*parse)(const struct sk_buff *, unsigned char *); + int (*cache)(const struct neighbour *, struct hh_cache *, __be16); + void (*cache_update)(struct hh_cache *, const struct net_device *, const unsigned char *); + bool (*validate)(const char *, unsigned int); + __be16 (*parse_protocol)(const struct sk_buff *); +}; + +struct xsk_buff_pool; + +struct netdev_queue { + struct net_device *dev; + struct Qdisc *qdisc; + struct Qdisc *qdisc_sleeping; + struct kobject kobj; + int numa_node; + long unsigned int tx_maxrate; + long unsigned int trans_timeout; + struct net_device *sb_dev; + struct xsk_buff_pool *pool; + spinlock_t _xmit_lock; + int xmit_lock_owner; + long unsigned int trans_start; + long unsigned int state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct dql dql; +}; + +struct qdisc_skb_head { + struct sk_buff *head; + struct sk_buff *tail; + __u32 qlen; + spinlock_t lock; +}; + +struct gnet_stats_basic_sync { + u64_stats_t bytes; + u64_stats_t packets; + struct u64_stats_sync syncp; +}; + +struct gnet_stats_queue { + __u32 qlen; + __u32 backlog; + __u32 drops; + __u32 requeues; + __u32 overlimits; +}; + +struct Qdisc_ops; + +struct qdisc_size_table; + +struct net_rate_estimator; + +struct Qdisc { + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + unsigned int flags; + u32 limit; + const struct Qdisc_ops *ops; + struct qdisc_size_table *stab; + struct hlist_node hash; + u32 handle; + u32 parent; + struct netdev_queue *dev_queue; + struct net_rate_estimator *rate_est; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_queue *cpu_qstats; + int pad; + refcount_t refcnt; + long: 64; + long: 64; + long: 64; + struct sk_buff_head gso_skb; + struct qdisc_skb_head q; + struct gnet_stats_basic_sync bstats; + struct gnet_stats_queue qstats; + long unsigned int state; + long unsigned int state2; + struct Qdisc *next_sched; + struct sk_buff_head skb_bad_txq; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t busylock; + spinlock_t seqlock; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long int privdata[0]; +}; + +struct rps_map { + unsigned int len; + struct callback_head rcu; + u16 cpus[0]; +}; + +struct rps_dev_flow { + u16 cpu; + u16 filter; + unsigned int last_qtail; +}; + +struct rps_dev_flow_table { + unsigned int mask; + struct callback_head rcu; + struct rps_dev_flow flows[0]; +}; + +struct netdev_rx_queue { + struct xdp_rxq_info xdp_rxq; + struct rps_map *rps_map; + struct rps_dev_flow_table *rps_flow_table; + struct kobject kobj; + struct net_device *dev; + struct xsk_buff_pool *pool; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xps_map { + unsigned int len; + unsigned int alloc_len; + struct callback_head rcu; + u16 queues[0]; +}; + +struct xps_dev_maps { + struct callback_head rcu; + unsigned int nr_ids; + s16 num_tc; + struct xps_map *attr_map[0]; +}; + +struct netdev_fcoe_hbainfo { + char manufacturer[64]; + char serial_number[64]; + char hardware_version[64]; + char driver_version[64]; + char optionrom_version[64]; + char firmware_version[64]; + char model[256]; + char model_description[256]; +}; + +struct netdev_phys_item_id { + unsigned char id[32]; + unsigned char id_len; +}; + +enum net_device_path_type { + DEV_PATH_ETHERNET = 0, + DEV_PATH_VLAN = 1, + DEV_PATH_BRIDGE = 2, + DEV_PATH_PPPOE = 3, + DEV_PATH_DSA = 4, +}; + +struct net_device_path { + enum net_device_path_type type; + const struct net_device *dev; + union { + struct { + u16 id; + __be16 proto; + u8 h_dest[6]; + } encap; + struct { + enum { + DEV_PATH_BR_VLAN_KEEP = 0, + DEV_PATH_BR_VLAN_TAG = 1, + DEV_PATH_BR_VLAN_UNTAG = 2, + DEV_PATH_BR_VLAN_UNTAG_HW = 3, + } vlan_mode; + u16 vlan_id; + __be16 vlan_proto; + } bridge; + struct { + int port; + u16 proto; + } dsa; + }; +}; + +struct net_device_path_ctx { + const struct net_device *dev; + const u8 *daddr; + int num_vlans; + struct { + u16 id; + __be16 proto; + } vlan[2]; +}; + +enum tc_setup_type { + TC_SETUP_QDISC_MQPRIO = 0, + TC_SETUP_CLSU32 = 1, + TC_SETUP_CLSFLOWER = 2, + TC_SETUP_CLSMATCHALL = 3, + TC_SETUP_CLSBPF = 4, + TC_SETUP_BLOCK = 5, + TC_SETUP_QDISC_CBS = 6, + TC_SETUP_QDISC_RED = 7, + TC_SETUP_QDISC_PRIO = 8, + TC_SETUP_QDISC_MQ = 9, + TC_SETUP_QDISC_ETF = 10, + TC_SETUP_ROOT_QDISC = 11, + TC_SETUP_QDISC_GRED = 12, + TC_SETUP_QDISC_TAPRIO = 13, + TC_SETUP_FT = 14, + TC_SETUP_QDISC_ETS = 15, + TC_SETUP_QDISC_TBF = 16, + TC_SETUP_QDISC_FIFO = 17, + TC_SETUP_QDISC_HTB = 18, +}; + +enum bpf_netdev_command { + XDP_SETUP_PROG = 0, + XDP_SETUP_PROG_HW = 1, + BPF_OFFLOAD_MAP_ALLOC = 2, + BPF_OFFLOAD_MAP_FREE = 3, + XDP_SETUP_XSK_POOL = 4, +}; + +struct netdev_bpf { + enum bpf_netdev_command command; + union { + struct { + u32 flags; + struct bpf_prog *prog; + struct netlink_ext_ack *extack; + }; + struct { + struct bpf_offloaded_map *offmap; + }; + struct { + struct xsk_buff_pool *pool; + u16 queue_id; + } xsk; + }; +}; + +struct xfrmdev_ops { + int (*xdo_dev_state_add)(struct xfrm_state *); + void (*xdo_dev_state_delete)(struct xfrm_state *); + void (*xdo_dev_state_free)(struct xfrm_state *); + bool (*xdo_dev_offload_ok)(struct sk_buff *, struct xfrm_state *); + void (*xdo_dev_state_advance_esn)(struct xfrm_state *); +}; + +struct dev_ifalias { + struct callback_head rcuhead; + char ifalias[0]; +}; + +struct netdev_name_node { + struct hlist_node hlist; + struct list_head list; + struct net_device *dev; + const char *name; +}; + +struct devlink_port; + +struct ip_tunnel_parm; + +struct net_device_ops { + int (*ndo_init)(struct net_device *); + void (*ndo_uninit)(struct net_device *); + int (*ndo_open)(struct net_device *); + int (*ndo_stop)(struct net_device *); + netdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *); + netdev_features_t (*ndo_features_check)(struct sk_buff *, struct net_device *, netdev_features_t); + u16 (*ndo_select_queue)(struct net_device *, struct sk_buff *, struct net_device *); + void (*ndo_change_rx_flags)(struct net_device *, int); + void (*ndo_set_rx_mode)(struct net_device *); + int (*ndo_set_mac_address)(struct net_device *, void *); + int (*ndo_validate_addr)(struct net_device *); + int (*ndo_do_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_eth_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_siocbond)(struct net_device *, struct ifreq *, int); + int (*ndo_siocwandev)(struct net_device *, struct if_settings *); + int (*ndo_siocdevprivate)(struct net_device *, struct ifreq *, void *, int); + int (*ndo_set_config)(struct net_device *, struct ifmap *); + int (*ndo_change_mtu)(struct net_device *, int); + int (*ndo_neigh_setup)(struct net_device *, struct neigh_parms *); + void (*ndo_tx_timeout)(struct net_device *, unsigned int); + void (*ndo_get_stats64)(struct net_device *, struct rtnl_link_stats64 *); + bool (*ndo_has_offload_stats)(const struct net_device *, int); + int (*ndo_get_offload_stats)(int, const struct net_device *, void *); + struct net_device_stats * (*ndo_get_stats)(struct net_device *); + int (*ndo_vlan_rx_add_vid)(struct net_device *, __be16, u16); + int (*ndo_vlan_rx_kill_vid)(struct net_device *, __be16, u16); + void (*ndo_poll_controller)(struct net_device *); + int (*ndo_netpoll_setup)(struct net_device *, struct netpoll_info *); + void (*ndo_netpoll_cleanup)(struct net_device *); + int (*ndo_set_vf_mac)(struct net_device *, int, u8 *); + int (*ndo_set_vf_vlan)(struct net_device *, int, u16, u8, __be16); + int (*ndo_set_vf_rate)(struct net_device *, int, int, int); + int (*ndo_set_vf_spoofchk)(struct net_device *, int, bool); + int (*ndo_set_vf_trust)(struct net_device *, int, bool); + int (*ndo_get_vf_config)(struct net_device *, int, struct ifla_vf_info *); + int (*ndo_set_vf_link_state)(struct net_device *, int, int); + int (*ndo_get_vf_stats)(struct net_device *, int, struct ifla_vf_stats *); + int (*ndo_set_vf_port)(struct net_device *, int, struct nlattr **); + int (*ndo_get_vf_port)(struct net_device *, int, struct sk_buff *); + int (*ndo_get_vf_guid)(struct net_device *, int, struct ifla_vf_guid *, struct ifla_vf_guid *); + int (*ndo_set_vf_guid)(struct net_device *, int, u64, int); + int (*ndo_set_vf_rss_query_en)(struct net_device *, int, bool); + int (*ndo_setup_tc)(struct net_device *, enum tc_setup_type, void *); + int (*ndo_fcoe_enable)(struct net_device *); + int (*ndo_fcoe_disable)(struct net_device *); + int (*ndo_fcoe_ddp_setup)(struct net_device *, u16, struct scatterlist *, unsigned int); + int (*ndo_fcoe_ddp_done)(struct net_device *, u16); + int (*ndo_fcoe_ddp_target)(struct net_device *, u16, struct scatterlist *, unsigned int); + int (*ndo_fcoe_get_hbainfo)(struct net_device *, struct netdev_fcoe_hbainfo *); + int (*ndo_fcoe_get_wwn)(struct net_device *, u64 *, int); + int (*ndo_rx_flow_steer)(struct net_device *, const struct sk_buff *, u16, u32); + int (*ndo_add_slave)(struct net_device *, struct net_device *, struct netlink_ext_ack *); + int (*ndo_del_slave)(struct net_device *, struct net_device *); + struct net_device * (*ndo_get_xmit_slave)(struct net_device *, struct sk_buff *, bool); + struct net_device * (*ndo_sk_get_lower_dev)(struct net_device *, struct sock *); + netdev_features_t (*ndo_fix_features)(struct net_device *, netdev_features_t); + int (*ndo_set_features)(struct net_device *, netdev_features_t); + int (*ndo_neigh_construct)(struct net_device *, struct neighbour *); + void (*ndo_neigh_destroy)(struct net_device *, struct neighbour *); + int (*ndo_fdb_add)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, u16, struct netlink_ext_ack *); + int (*ndo_fdb_del)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16); + int (*ndo_fdb_dump)(struct sk_buff *, struct netlink_callback *, struct net_device *, struct net_device *, int *); + int (*ndo_fdb_get)(struct sk_buff *, struct nlattr **, struct net_device *, const unsigned char *, u16, u32, u32, struct netlink_ext_ack *); + int (*ndo_bridge_setlink)(struct net_device *, struct nlmsghdr *, u16, struct netlink_ext_ack *); + int (*ndo_bridge_getlink)(struct sk_buff *, u32, u32, struct net_device *, u32, int); + int (*ndo_bridge_dellink)(struct net_device *, struct nlmsghdr *, u16); + int (*ndo_change_carrier)(struct net_device *, bool); + int (*ndo_get_phys_port_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_port_parent_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_phys_port_name)(struct net_device *, char *, size_t); + void * (*ndo_dfwd_add_station)(struct net_device *, struct net_device *); + void (*ndo_dfwd_del_station)(struct net_device *, void *); + int (*ndo_set_tx_maxrate)(struct net_device *, int, u32); + int (*ndo_get_iflink)(const struct net_device *); + int (*ndo_change_proto_down)(struct net_device *, bool); + int (*ndo_fill_metadata_dst)(struct net_device *, struct sk_buff *); + void (*ndo_set_rx_headroom)(struct net_device *, int); + int (*ndo_bpf)(struct net_device *, struct netdev_bpf *); + int (*ndo_xdp_xmit)(struct net_device *, int, struct xdp_frame **, u32); + struct net_device * (*ndo_xdp_get_xmit_slave)(struct net_device *, struct xdp_buff *); + int (*ndo_xsk_wakeup)(struct net_device *, u32, u32); + struct devlink_port * (*ndo_get_devlink_port)(struct net_device *); + int (*ndo_tunnel_ctl)(struct net_device *, struct ip_tunnel_parm *, int); + struct net_device * (*ndo_get_peer_dev)(struct net_device *); + int (*ndo_fill_forward_path)(struct net_device_path_ctx *, struct net_device_path *); +}; + +struct neigh_parms { + possible_net_t net; + struct net_device *dev; + struct list_head list; + int (*neigh_setup)(struct neighbour *); + struct neigh_table *tbl; + void *sysctl_table; + int dead; + refcount_t refcnt; + struct callback_head callback_head; + int reachable_time; + int data[13]; + long unsigned int data_state[1]; +}; + +struct pcpu_lstats { + u64_stats_t packets; + u64_stats_t bytes; + struct u64_stats_sync syncp; +}; + +struct pcpu_sw_netstats { + u64 rx_packets; + u64 rx_bytes; + u64 tx_packets; + u64 tx_bytes; + struct u64_stats_sync syncp; +}; + +struct iw_request_info; + +union iwreq_data; + +typedef int (*iw_handler)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *); + +struct iw_priv_args; + +struct iw_statistics; + +struct iw_handler_def { + const iw_handler *standard; + __u16 num_standard; + __u16 num_private; + __u16 num_private_args; + const iw_handler *private; + const struct iw_priv_args *private_args; + struct iw_statistics * (*get_wireless_stats)(struct net_device *); +}; + +enum ethtool_phys_id_state { + ETHTOOL_ID_INACTIVE = 0, + ETHTOOL_ID_ACTIVE = 1, + ETHTOOL_ID_ON = 2, + ETHTOOL_ID_OFF = 3, +}; + +struct ethtool_drvinfo; + +struct ethtool_regs; + +struct ethtool_wolinfo; + +struct ethtool_link_ext_state_info; + +struct ethtool_eeprom; + +struct ethtool_coalesce; + +struct kernel_ethtool_coalesce; + +struct ethtool_ringparam; + +struct ethtool_pause_stats; + +struct ethtool_pauseparam; + +struct ethtool_test; + +struct ethtool_stats; + +struct ethtool_rxnfc; + +struct ethtool_flash; + +struct ethtool_channels; + +struct ethtool_dump; + +struct ethtool_ts_info; + +struct ethtool_modinfo; + +struct ethtool_eee; + +struct ethtool_tunable; + +struct ethtool_link_ksettings; + +struct ethtool_fec_stats; + +struct ethtool_fecparam; + +struct ethtool_module_eeprom; + +struct ethtool_eth_phy_stats; + +struct ethtool_eth_mac_stats; + +struct ethtool_eth_ctrl_stats; + +struct ethtool_rmon_stats; + +struct ethtool_rmon_hist_range; + +struct ethtool_module_power_mode_params; + +struct ethtool_ops { + u32 cap_link_lanes_supported: 1; + u32 supported_coalesce_params; + void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); + int (*get_regs_len)(struct net_device *); + void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); + void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); + int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); + u32 (*get_msglevel)(struct net_device *); + void (*set_msglevel)(struct net_device *, u32); + int (*nway_reset)(struct net_device *); + u32 (*get_link)(struct net_device *); + int (*get_link_ext_state)(struct net_device *, struct ethtool_link_ext_state_info *); + int (*get_eeprom_len)(struct net_device *); + int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *); + int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *); + void (*get_pause_stats)(struct net_device *, struct ethtool_pause_stats *); + void (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + int (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); + void (*get_strings)(struct net_device *, u32, u8 *); + int (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state); + void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*begin)(struct net_device *); + void (*complete)(struct net_device *); + u32 (*get_priv_flags)(struct net_device *); + int (*set_priv_flags)(struct net_device *, u32); + int (*get_sset_count)(struct net_device *, int); + int (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, u32 *); + int (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); + int (*flash_device)(struct net_device *, struct ethtool_flash *); + int (*reset)(struct net_device *, u32 *); + u32 (*get_rxfh_key_size)(struct net_device *); + u32 (*get_rxfh_indir_size)(struct net_device *); + int (*get_rxfh)(struct net_device *, u32 *, u8 *, u8 *); + int (*set_rxfh)(struct net_device *, const u32 *, const u8 *, const u8); + int (*get_rxfh_context)(struct net_device *, u32 *, u8 *, u8 *, u32); + int (*set_rxfh_context)(struct net_device *, const u32 *, const u8 *, const u8, u32 *, bool); + void (*get_channels)(struct net_device *, struct ethtool_channels *); + int (*set_channels)(struct net_device *, struct ethtool_channels *); + int (*get_dump_flag)(struct net_device *, struct ethtool_dump *); + int (*get_dump_data)(struct net_device *, struct ethtool_dump *, void *); + int (*set_dump)(struct net_device *, struct ethtool_dump *); + int (*get_ts_info)(struct net_device *, struct ethtool_ts_info *); + int (*get_module_info)(struct net_device *, struct ethtool_modinfo *); + int (*get_module_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_eee)(struct net_device *, struct ethtool_eee *); + int (*set_eee)(struct net_device *, struct ethtool_eee *); + int (*get_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*set_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*get_link_ksettings)(struct net_device *, struct ethtool_link_ksettings *); + int (*set_link_ksettings)(struct net_device *, const struct ethtool_link_ksettings *); + void (*get_fec_stats)(struct net_device *, struct ethtool_fec_stats *); + int (*get_fecparam)(struct net_device *, struct ethtool_fecparam *); + int (*set_fecparam)(struct net_device *, struct ethtool_fecparam *); + void (*get_ethtool_phy_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*get_phy_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_phy_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_module_eeprom_by_page)(struct net_device *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *); + void (*get_eth_phy_stats)(struct net_device *, struct ethtool_eth_phy_stats *); + void (*get_eth_mac_stats)(struct net_device *, struct ethtool_eth_mac_stats *); + void (*get_eth_ctrl_stats)(struct net_device *, struct ethtool_eth_ctrl_stats *); + void (*get_rmon_stats)(struct net_device *, struct ethtool_rmon_stats *, const struct ethtool_rmon_hist_range **); + int (*get_module_power_mode)(struct net_device *, struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); + int (*set_module_power_mode)(struct net_device *, const struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); +}; + +struct l3mdev_ops { + u32 (*l3mdev_fib_table)(const struct net_device *); + struct sk_buff * (*l3mdev_l3_rcv)(struct net_device *, struct sk_buff *, u16); + struct sk_buff * (*l3mdev_l3_out)(struct net_device *, struct sock *, struct sk_buff *, u16); + struct dst_entry * (*l3mdev_link_scope_lookup)(const struct net_device *, struct flowi6 *); +}; + +struct nd_opt_hdr; + +struct ndisc_options; + +struct prefix_info; + +struct ndisc_ops { + int (*is_useropt)(u8); + int (*parse_options)(const struct net_device *, struct nd_opt_hdr *, struct ndisc_options *); + void (*update)(const struct net_device *, struct neighbour *, u32, u8, const struct ndisc_options *); + int (*opt_addr_space)(const struct net_device *, u8, struct neighbour *, u8 *, u8 **); + void (*fill_addr_option)(const struct net_device *, struct sk_buff *, u8, const u8 *); + void (*prefix_rcv_add_addr)(struct net *, struct net_device *, const struct prefix_info *, struct inet6_dev *, struct in6_addr *, int, u32, bool, bool, __u32, u32, bool); +}; + +enum tls_offload_ctx_dir { + TLS_OFFLOAD_CTX_DIR_RX = 0, + TLS_OFFLOAD_CTX_DIR_TX = 1, +}; + +struct tls_crypto_info; + +struct tls_context; + +struct tlsdev_ops { + int (*tls_dev_add)(struct net_device *, struct sock *, enum tls_offload_ctx_dir, struct tls_crypto_info *, u32); + void (*tls_dev_del)(struct net_device *, struct tls_context *, enum tls_offload_ctx_dir); + int (*tls_dev_resync)(struct net_device *, struct sock *, u32, u8 *, enum tls_offload_ctx_dir); +}; + +struct ipv6_devstat { + struct proc_dir_entry *proc_dir_entry; + struct ipstats_mib *ipv6; + struct icmpv6_mib_device *icmpv6dev; + struct icmpv6msg_mib_device *icmpv6msgdev; +}; + +struct ifmcaddr6; + +struct ifacaddr6; + +struct inet6_dev { + struct net_device *dev; + struct list_head addr_list; + struct ifmcaddr6 *mc_list; + struct ifmcaddr6 *mc_tomb; + unsigned char mc_qrv; + unsigned char mc_gq_running; + unsigned char mc_ifc_count; + unsigned char mc_dad_count; + long unsigned int mc_v1_seen; + long unsigned int mc_qi; + long unsigned int mc_qri; + long unsigned int mc_maxdelay; + struct delayed_work mc_gq_work; + struct delayed_work mc_ifc_work; + struct delayed_work mc_dad_work; + struct delayed_work mc_query_work; + struct delayed_work mc_report_work; + struct sk_buff_head mc_query_queue; + struct sk_buff_head mc_report_queue; + spinlock_t mc_query_lock; + spinlock_t mc_report_lock; + struct mutex mc_lock; + struct ifacaddr6 *ac_list; + rwlock_t lock; + refcount_t refcnt; + __u32 if_flags; + int dead; + u32 desync_factor; + struct list_head tempaddr_list; + struct in6_addr token; + struct neigh_parms *nd_parms; + struct ipv6_devconf cnf; + struct ipv6_devstat stats; + struct timer_list rs_timer; + __s32 rs_interval; + __u8 rs_probes; + long unsigned int tstamp; + struct callback_head rcu; + unsigned int ra_mtu; +}; + +struct tcf_proto; + +struct tcf_block; + +struct mini_Qdisc { + struct tcf_proto *filter_list; + struct tcf_block *block; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_queue *cpu_qstats; + long unsigned int rcu_state; +}; + +struct rtnl_link_ops { + struct list_head list; + const char *kind; + size_t priv_size; + struct net_device * (*alloc)(struct nlattr **, const char *, unsigned char, unsigned int, unsigned int); + void (*setup)(struct net_device *); + bool netns_refund; + unsigned int maxtype; + const struct nla_policy *policy; + int (*validate)(struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*newlink)(struct net *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*changelink)(struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + void (*dellink)(struct net_device *, struct list_head *); + size_t (*get_size)(const struct net_device *); + int (*fill_info)(struct sk_buff *, const struct net_device *); + size_t (*get_xstats_size)(const struct net_device *); + int (*fill_xstats)(struct sk_buff *, const struct net_device *); + unsigned int (*get_num_tx_queues)(); + unsigned int (*get_num_rx_queues)(); + unsigned int slave_maxtype; + const struct nla_policy *slave_policy; + int (*slave_changelink)(struct net_device *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + size_t (*get_slave_size)(const struct net_device *, const struct net_device *); + int (*fill_slave_info)(struct sk_buff *, const struct net_device *, const struct net_device *); + struct net * (*get_link_net)(const struct net_device *); + size_t (*get_linkxstats_size)(const struct net_device *, int); + int (*fill_linkxstats)(struct sk_buff *, const struct net_device *, int *, int); +}; + +struct udp_tunnel_nic_table_info { + unsigned int n_entries; + unsigned int tunnel_types; +}; + +struct udp_tunnel_info; + +struct udp_tunnel_nic_shared; + +struct udp_tunnel_nic_info { + int (*set_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*unset_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*sync_table)(struct net_device *, unsigned int); + struct udp_tunnel_nic_shared *shared; + unsigned int flags; + struct udp_tunnel_nic_table_info tables[4]; +}; + +enum { + RTAX_UNSPEC = 0, + RTAX_LOCK = 1, + RTAX_MTU = 2, + RTAX_WINDOW = 3, + RTAX_RTT = 4, + RTAX_RTTVAR = 5, + RTAX_SSTHRESH = 6, + RTAX_CWND = 7, + RTAX_ADVMSS = 8, + RTAX_REORDERING = 9, + RTAX_HOPLIMIT = 10, + RTAX_INITCWND = 11, + RTAX_FEATURES = 12, + RTAX_RTO_MIN = 13, + RTAX_INITRWND = 14, + RTAX_QUICKACK = 15, + RTAX_CC_ALGO = 16, + RTAX_FASTOPEN_NO_COOKIE = 17, + __RTAX_MAX = 18, +}; + +struct tcmsg { + unsigned char tcm_family; + unsigned char tcm__pad1; + short unsigned int tcm__pad2; + int tcm_ifindex; + __u32 tcm_handle; + __u32 tcm_parent; + __u32 tcm_info; +}; + +struct gnet_dump { + spinlock_t *lock; + struct sk_buff *skb; + struct nlattr *tail; + int compat_tc_stats; + int compat_xstats; + int padattr; + void *xstats; + int xstats_len; + struct tc_stats tc_stats; +}; + +struct netlink_range_validation { + u64 min; + u64 max; +}; + +struct netlink_range_validation_signed { + s64 min; + s64 max; +}; + +enum flow_action_hw_stats_bit { + FLOW_ACTION_HW_STATS_IMMEDIATE_BIT = 0, + FLOW_ACTION_HW_STATS_DELAYED_BIT = 1, + FLOW_ACTION_HW_STATS_DISABLED_BIT = 2, + FLOW_ACTION_HW_STATS_NUM_BITS = 3, +}; + +struct flow_block { + struct list_head cb_list; +}; + +typedef int flow_setup_cb_t(enum tc_setup_type, void *, void *); + +struct qdisc_size_table { + struct callback_head rcu; + struct list_head list; + struct tc_sizespec szopts; + int refcnt; + u16 data[0]; +}; + +struct Qdisc_class_ops; + +struct Qdisc_ops { + struct Qdisc_ops *next; + const struct Qdisc_class_ops *cl_ops; + char id[16]; + int priv_size; + unsigned int static_flags; + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + struct sk_buff * (*peek)(struct Qdisc *); + int (*init)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*reset)(struct Qdisc *); + void (*destroy)(struct Qdisc *); + int (*change)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*attach)(struct Qdisc *); + int (*change_tx_queue_len)(struct Qdisc *, unsigned int); + void (*change_real_num_tx)(struct Qdisc *, unsigned int); + int (*dump)(struct Qdisc *, struct sk_buff *); + int (*dump_stats)(struct Qdisc *, struct gnet_dump *); + void (*ingress_block_set)(struct Qdisc *, u32); + void (*egress_block_set)(struct Qdisc *, u32); + u32 (*ingress_block_get)(struct Qdisc *); + u32 (*egress_block_get)(struct Qdisc *); + struct module *owner; +}; + +struct qdisc_walker; + +struct Qdisc_class_ops { + unsigned int flags; + struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *); + int (*graft)(struct Qdisc *, long unsigned int, struct Qdisc *, struct Qdisc **, struct netlink_ext_ack *); + struct Qdisc * (*leaf)(struct Qdisc *, long unsigned int); + void (*qlen_notify)(struct Qdisc *, long unsigned int); + long unsigned int (*find)(struct Qdisc *, u32); + int (*change)(struct Qdisc *, u32, u32, struct nlattr **, long unsigned int *, struct netlink_ext_ack *); + int (*delete)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); + void (*walk)(struct Qdisc *, struct qdisc_walker *); + struct tcf_block * (*tcf_block)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); + long unsigned int (*bind_tcf)(struct Qdisc *, long unsigned int, u32); + void (*unbind_tcf)(struct Qdisc *, long unsigned int); + int (*dump)(struct Qdisc *, long unsigned int, struct sk_buff *, struct tcmsg *); + int (*dump_stats)(struct Qdisc *, long unsigned int, struct gnet_dump *); +}; + +struct tcf_chain; + +struct tcf_block { + struct mutex lock; + struct list_head chain_list; + u32 index; + u32 classid; + refcount_t refcnt; + struct net *net; + struct Qdisc *q; + struct rw_semaphore cb_lock; + struct flow_block flow_block; + struct list_head owner_list; + bool keep_dst; + atomic_t offloadcnt; + unsigned int nooffloaddevcnt; + unsigned int lockeddevcnt; + struct { + struct tcf_chain *chain; + struct list_head filter_chain_list; + } chain0; + struct callback_head rcu; + struct hlist_head proto_destroy_ht[128]; + struct mutex proto_destroy_lock; +}; + +struct tcf_result; + +struct tcf_proto_ops; + +struct tcf_proto { + struct tcf_proto *next; + void *root; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + __be16 protocol; + u32 prio; + void *data; + const struct tcf_proto_ops *ops; + struct tcf_chain *chain; + spinlock_t lock; + bool deleting; + refcount_t refcnt; + struct callback_head rcu; + struct hlist_node destroy_ht_node; +}; + +struct tcf_result { + union { + struct { + long unsigned int class; + u32 classid; + }; + const struct tcf_proto *goto_tp; + struct { + bool ingress; + struct gnet_stats_queue *qstats; + }; + }; +}; + +struct tcf_walker; + +struct tcf_proto_ops { + struct list_head head; + char kind[16]; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + int (*init)(struct tcf_proto *); + void (*destroy)(struct tcf_proto *, bool, struct netlink_ext_ack *); + void * (*get)(struct tcf_proto *, u32); + void (*put)(struct tcf_proto *, void *); + int (*change)(struct net *, struct sk_buff *, struct tcf_proto *, long unsigned int, u32, struct nlattr **, void **, u32, struct netlink_ext_ack *); + int (*delete)(struct tcf_proto *, void *, bool *, bool, struct netlink_ext_ack *); + bool (*delete_empty)(struct tcf_proto *); + void (*walk)(struct tcf_proto *, struct tcf_walker *, bool); + int (*reoffload)(struct tcf_proto *, bool, flow_setup_cb_t *, void *, struct netlink_ext_ack *); + void (*hw_add)(struct tcf_proto *, void *); + void (*hw_del)(struct tcf_proto *, void *); + void (*bind_class)(void *, u32, long unsigned int, void *, long unsigned int); + void * (*tmplt_create)(struct net *, struct tcf_chain *, struct nlattr **, struct netlink_ext_ack *); + void (*tmplt_destroy)(void *); + int (*dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*terse_dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*tmplt_dump)(struct sk_buff *, struct net *, void *); + struct module *owner; + int flags; +}; + +struct tcf_chain { + struct mutex filter_chain_lock; + struct tcf_proto *filter_chain; + struct list_head list; + struct tcf_block *block; + u32 index; + unsigned int refcnt; + unsigned int action_refcnt; + bool explicitly_created; + bool flushing; + const struct tcf_proto_ops *tmplt_ops; + void *tmplt_priv; + struct callback_head rcu; +}; + +struct sock_fprog_kern { + u16 len; + struct sock_filter *filter; +}; + +struct bpf_prog_stats { + u64_stats_t cnt; + u64_stats_t nsecs; + u64_stats_t misses; + struct u64_stats_sync syncp; + long: 64; +}; + +struct sk_filter { + refcount_t refcnt; + struct callback_head rcu; + struct bpf_prog *prog; +}; + +enum { + NEIGH_VAR_MCAST_PROBES = 0, + NEIGH_VAR_UCAST_PROBES = 1, + NEIGH_VAR_APP_PROBES = 2, + NEIGH_VAR_MCAST_REPROBES = 3, + NEIGH_VAR_RETRANS_TIME = 4, + NEIGH_VAR_BASE_REACHABLE_TIME = 5, + NEIGH_VAR_DELAY_PROBE_TIME = 6, + NEIGH_VAR_GC_STALETIME = 7, + NEIGH_VAR_QUEUE_LEN_BYTES = 8, + NEIGH_VAR_PROXY_QLEN = 9, + NEIGH_VAR_ANYCAST_DELAY = 10, + NEIGH_VAR_PROXY_DELAY = 11, + NEIGH_VAR_LOCKTIME = 12, + NEIGH_VAR_QUEUE_LEN = 13, + NEIGH_VAR_RETRANS_TIME_MS = 14, + NEIGH_VAR_BASE_REACHABLE_TIME_MS = 15, + NEIGH_VAR_GC_INTERVAL = 16, + NEIGH_VAR_GC_THRESH1 = 17, + NEIGH_VAR_GC_THRESH2 = 18, + NEIGH_VAR_GC_THRESH3 = 19, + NEIGH_VAR_MAX = 20, +}; + +struct pneigh_entry; + +struct neigh_statistics; + +struct neigh_hash_table; + +struct neigh_table { + int family; + unsigned int entry_size; + unsigned int key_len; + __be16 protocol; + __u32 (*hash)(const void *, const struct net_device *, __u32 *); + bool (*key_eq)(const struct neighbour *, const void *); + int (*constructor)(struct neighbour *); + int (*pconstructor)(struct pneigh_entry *); + void (*pdestructor)(struct pneigh_entry *); + void (*proxy_redo)(struct sk_buff *); + int (*is_multicast)(const void *); + bool (*allow_add)(const struct net_device *, struct netlink_ext_ack *); + char *id; + struct neigh_parms parms; + struct list_head parms_list; + int gc_interval; + int gc_thresh1; + int gc_thresh2; + int gc_thresh3; + long unsigned int last_flush; + struct delayed_work gc_work; + struct delayed_work managed_work; + struct timer_list proxy_timer; + struct sk_buff_head proxy_queue; + atomic_t entries; + atomic_t gc_entries; + struct list_head gc_list; + struct list_head managed_list; + rwlock_t lock; + long unsigned int last_rand; + struct neigh_statistics *stats; + struct neigh_hash_table *nht; + struct pneigh_entry **phash_buckets; +}; + +struct neigh_statistics { + long unsigned int allocs; + long unsigned int destroys; + long unsigned int hash_grows; + long unsigned int res_failed; + long unsigned int lookups; + long unsigned int hits; + long unsigned int rcv_probes_mcast; + long unsigned int rcv_probes_ucast; + long unsigned int periodic_gc_runs; + long unsigned int forced_gc_runs; + long unsigned int unres_discards; + long unsigned int table_fulls; +}; + +struct neigh_ops { + int family; + void (*solicit)(struct neighbour *, struct sk_buff *); + void (*error_report)(struct neighbour *, struct sk_buff *); + int (*output)(struct neighbour *, struct sk_buff *); + int (*connected_output)(struct neighbour *, struct sk_buff *); +}; + +struct pneigh_entry { + struct pneigh_entry *next; + possible_net_t net; + struct net_device *dev; + u32 flags; + u8 protocol; + u8 key[0]; +}; + +struct neigh_hash_table { + struct neighbour **hash_buckets; + unsigned int hash_shift; + __u32 hash_rnd[4]; + struct callback_head rcu; +}; + +enum { + TCP_ESTABLISHED = 1, + TCP_SYN_SENT = 2, + TCP_SYN_RECV = 3, + TCP_FIN_WAIT1 = 4, + TCP_FIN_WAIT2 = 5, + TCP_TIME_WAIT = 6, + TCP_CLOSE = 7, + TCP_CLOSE_WAIT = 8, + TCP_LAST_ACK = 9, + TCP_LISTEN = 10, + TCP_CLOSING = 11, + TCP_NEW_SYN_RECV = 12, + TCP_MAX_STATES = 13, +}; + +struct fib_rule_hdr { + __u8 family; + __u8 dst_len; + __u8 src_len; + __u8 tos; + __u8 table; + __u8 res1; + __u8 res2; + __u8 action; + __u32 flags; +}; + +struct fib_rule_port_range { + __u16 start; + __u16 end; +}; + +struct fib_kuid_range { + kuid_t start; + kuid_t end; +}; + +struct fib_rule { + struct list_head list; + int iifindex; + int oifindex; + u32 mark; + u32 mark_mask; + u32 flags; + u32 table; + u8 action; + u8 l3mdev; + u8 proto; + u8 ip_proto; + u32 target; + __be64 tun_id; + struct fib_rule *ctarget; + struct net *fr_net; + refcount_t refcnt; + u32 pref; + int suppress_ifgroup; + int suppress_prefixlen; + char iifname[16]; + char oifname[16]; + struct fib_kuid_range uid_range; + struct fib_rule_port_range sport_range; + struct fib_rule_port_range dport_range; + struct callback_head rcu; +}; + +struct fib_lookup_arg { + void *lookup_ptr; + const void *lookup_data; + void *result; + struct fib_rule *rule; + u32 table; + int flags; +}; + +struct smc_hashinfo; + +struct sk_psock; + +struct request_sock_ops; + +struct timewait_sock_ops; + +struct udp_table; + +struct raw_hashinfo; + +struct proto { + void (*close)(struct sock *, long int); + int (*pre_connect)(struct sock *, struct sockaddr *, int); + int (*connect)(struct sock *, struct sockaddr *, int); + int (*disconnect)(struct sock *, int); + struct sock * (*accept)(struct sock *, int, int *, bool); + int (*ioctl)(struct sock *, int, long unsigned int); + int (*init)(struct sock *); + void (*destroy)(struct sock *); + void (*shutdown)(struct sock *, int); + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*keepalive)(struct sock *, int); + int (*compat_ioctl)(struct sock *, unsigned int, long unsigned int); + int (*sendmsg)(struct sock *, struct msghdr *, size_t); + int (*recvmsg)(struct sock *, struct msghdr *, size_t, int, int, int *); + int (*sendpage)(struct sock *, struct page *, int, size_t, int); + int (*bind)(struct sock *, struct sockaddr *, int); + int (*bind_add)(struct sock *, struct sockaddr *, int); + int (*backlog_rcv)(struct sock *, struct sk_buff *); + bool (*bpf_bypass_getsockopt)(int, int); + void (*release_cb)(struct sock *); + int (*hash)(struct sock *); + void (*unhash)(struct sock *); + void (*rehash)(struct sock *); + int (*get_port)(struct sock *, short unsigned int); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + unsigned int inuse_idx; + int (*forward_alloc_get)(const struct sock *); + bool (*stream_memory_free)(const struct sock *, int); + bool (*sock_is_readable)(struct sock *); + void (*enter_memory_pressure)(struct sock *); + void (*leave_memory_pressure)(struct sock *); + atomic_long_t *memory_allocated; + struct percpu_counter *sockets_allocated; + long unsigned int *memory_pressure; + long int *sysctl_mem; + int *sysctl_wmem; + int *sysctl_rmem; + u32 sysctl_wmem_offset; + u32 sysctl_rmem_offset; + int max_header; + bool no_autobind; + struct kmem_cache *slab; + unsigned int obj_size; + slab_flags_t slab_flags; + unsigned int useroffset; + unsigned int usersize; + unsigned int *orphan_count; + struct request_sock_ops *rsk_prot; + struct timewait_sock_ops *twsk_prot; + union { + struct inet_hashinfo *hashinfo; + struct udp_table *udp_table; + struct raw_hashinfo *raw_hash; + struct smc_hashinfo *smc_hash; + } h; + struct module *owner; + char name[32]; + struct list_head node; + int (*diag_destroy)(struct sock *, int); +}; + +struct request_sock; + +struct request_sock_ops { + int family; + unsigned int obj_size; + struct kmem_cache *slab; + char *slab_name; + int (*rtx_syn_ack)(const struct sock *, struct request_sock *); + void (*send_ack)(const struct sock *, struct sk_buff *, struct request_sock *); + void (*send_reset)(const struct sock *, struct sk_buff *); + void (*destructor)(struct request_sock *); + void (*syn_ack_timeout)(const struct request_sock *); +}; + +struct timewait_sock_ops { + struct kmem_cache *twsk_slab; + char *twsk_slab_name; + unsigned int twsk_obj_size; + int (*twsk_unique)(struct sock *, struct sock *, void *); + void (*twsk_destructor)(struct sock *); +}; + +struct saved_syn; + +struct request_sock { + struct sock_common __req_common; + struct request_sock *dl_next; + u16 mss; + u8 num_retrans; + u8 syncookie: 1; + u8 num_timeout: 7; + u32 ts_recent; + struct timer_list rsk_timer; + const struct request_sock_ops *rsk_ops; + struct sock *sk; + struct saved_syn *saved_syn; + u32 secid; + u32 peer_secid; +}; + +struct saved_syn { + u32 mac_hdrlen; + u32 network_hdrlen; + u32 tcp_hdrlen; + u8 data[0]; +}; + +enum tsq_enum { + TSQ_THROTTLED = 0, + TSQ_QUEUED = 1, + TCP_TSQ_DEFERRED = 2, + TCP_WRITE_TIMER_DEFERRED = 3, + TCP_DELACK_TIMER_DEFERRED = 4, + TCP_MTU_REDUCED_DEFERRED = 5, +}; + +struct ip6_sf_list { + struct ip6_sf_list *sf_next; + struct in6_addr sf_addr; + long unsigned int sf_count[2]; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; + struct callback_head rcu; +}; + +struct ifmcaddr6 { + struct in6_addr mca_addr; + struct inet6_dev *idev; + struct ifmcaddr6 *next; + struct ip6_sf_list *mca_sources; + struct ip6_sf_list *mca_tomb; + unsigned int mca_sfmode; + unsigned char mca_crcount; + long unsigned int mca_sfcount[2]; + struct delayed_work mca_work; + unsigned int mca_flags; + int mca_users; + refcount_t mca_refcnt; + long unsigned int mca_cstamp; + long unsigned int mca_tstamp; + struct callback_head rcu; +}; + +struct ifacaddr6 { + struct in6_addr aca_addr; + struct fib6_info *aca_rt; + struct ifacaddr6 *aca_next; + struct hlist_node aca_addr_lst; + int aca_users; + refcount_t aca_refcnt; + long unsigned int aca_cstamp; + long unsigned int aca_tstamp; + struct callback_head rcu; +}; + +enum { + __ND_OPT_PREFIX_INFO_END = 0, + ND_OPT_SOURCE_LL_ADDR = 1, + ND_OPT_TARGET_LL_ADDR = 2, + ND_OPT_PREFIX_INFO = 3, + ND_OPT_REDIRECT_HDR = 4, + ND_OPT_MTU = 5, + ND_OPT_NONCE = 14, + __ND_OPT_ARRAY_MAX = 15, + ND_OPT_ROUTE_INFO = 24, + ND_OPT_RDNSS = 25, + ND_OPT_DNSSL = 31, + ND_OPT_6CO = 34, + ND_OPT_CAPTIVE_PORTAL = 37, + ND_OPT_PREF64 = 38, + __ND_OPT_MAX = 39, +}; + +struct nd_opt_hdr { + __u8 nd_opt_type; + __u8 nd_opt_len; +}; + +struct ndisc_options { + struct nd_opt_hdr *nd_opt_array[15]; + struct nd_opt_hdr *nd_opts_ri; + struct nd_opt_hdr *nd_opts_ri_end; + struct nd_opt_hdr *nd_useropts; + struct nd_opt_hdr *nd_useropts_end; + struct nd_opt_hdr *nd_802154_opt_array[3]; +}; + +struct prefix_info { + __u8 type; + __u8 length; + __u8 prefix_len; + __u8 reserved: 6; + __u8 autoconf: 1; + __u8 onlink: 1; + __be32 valid; + __be32 prefered; + __be32 reserved2; + struct in6_addr prefix; +}; + +enum nfs_opnum4 { + OP_ACCESS = 3, + OP_CLOSE = 4, + OP_COMMIT = 5, + OP_CREATE = 6, + OP_DELEGPURGE = 7, + OP_DELEGRETURN = 8, + OP_GETATTR = 9, + OP_GETFH = 10, + OP_LINK = 11, + OP_LOCK = 12, + OP_LOCKT = 13, + OP_LOCKU = 14, + OP_LOOKUP = 15, + OP_LOOKUPP = 16, + OP_NVERIFY = 17, + OP_OPEN = 18, + OP_OPENATTR = 19, + OP_OPEN_CONFIRM = 20, + OP_OPEN_DOWNGRADE = 21, + OP_PUTFH = 22, + OP_PUTPUBFH = 23, + OP_PUTROOTFH = 24, + OP_READ = 25, + OP_READDIR = 26, + OP_READLINK = 27, + OP_REMOVE = 28, + OP_RENAME = 29, + OP_RENEW = 30, + OP_RESTOREFH = 31, + OP_SAVEFH = 32, + OP_SECINFO = 33, + OP_SETATTR = 34, + OP_SETCLIENTID = 35, + OP_SETCLIENTID_CONFIRM = 36, + OP_VERIFY = 37, + OP_WRITE = 38, + OP_RELEASE_LOCKOWNER = 39, + OP_BACKCHANNEL_CTL = 40, + OP_BIND_CONN_TO_SESSION = 41, + OP_EXCHANGE_ID = 42, + OP_CREATE_SESSION = 43, + OP_DESTROY_SESSION = 44, + OP_FREE_STATEID = 45, + OP_GET_DIR_DELEGATION = 46, + OP_GETDEVICEINFO = 47, + OP_GETDEVICELIST = 48, + OP_LAYOUTCOMMIT = 49, + OP_LAYOUTGET = 50, + OP_LAYOUTRETURN = 51, + OP_SECINFO_NO_NAME = 52, + OP_SEQUENCE = 53, + OP_SET_SSV = 54, + OP_TEST_STATEID = 55, + OP_WANT_DELEGATION = 56, + OP_DESTROY_CLIENTID = 57, + OP_RECLAIM_COMPLETE = 58, + OP_ALLOCATE = 59, + OP_COPY = 60, + OP_COPY_NOTIFY = 61, + OP_DEALLOCATE = 62, + OP_IO_ADVISE = 63, + OP_LAYOUTERROR = 64, + OP_LAYOUTSTATS = 65, + OP_OFFLOAD_CANCEL = 66, + OP_OFFLOAD_STATUS = 67, + OP_READ_PLUS = 68, + OP_SEEK = 69, + OP_WRITE_SAME = 70, + OP_CLONE = 71, + OP_GETXATTR = 72, + OP_SETXATTR = 73, + OP_LISTXATTRS = 74, + OP_REMOVEXATTR = 75, + OP_ILLEGAL = 10044, +}; + +enum perf_branch_sample_type_shift { + PERF_SAMPLE_BRANCH_USER_SHIFT = 0, + PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, + PERF_SAMPLE_BRANCH_HV_SHIFT = 2, + PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, + PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, + PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, + PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, + PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, + PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, + PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, + PERF_SAMPLE_BRANCH_COND_SHIFT = 10, + PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, + PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, + PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, + PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, + PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, + PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, + PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, + PERF_SAMPLE_BRANCH_MAX_SHIFT = 18, +}; + +struct uuidcmp { + const char *uuid; + int len; +}; + +struct subprocess_info { + struct work_struct work; + struct completion *complete; + const char *path; + char **argv; + char **envp; + int wait; + int retval; + int (*init)(struct subprocess_info *, struct cred *); + void (*cleanup)(struct subprocess_info *); + void *data; +}; + +typedef phys_addr_t resource_size_t; + +struct __va_list { + void *__stack; + void *__gr_top; + void *__vr_top; + int __gr_offs; + int __vr_offs; +}; + +typedef struct __va_list va_list; + +struct resource { + resource_size_t start; + resource_size_t end; + const char *name; + long unsigned int flags; + long unsigned int desc; + struct resource *parent; + struct resource *sibling; + struct resource *child; +}; + +enum umh_disable_depth { + UMH_ENABLED = 0, + UMH_FREEZING = 1, + UMH_DISABLED = 2, +}; + +typedef u64 async_cookie_t; + +typedef void (*async_func_t)(void *, async_cookie_t); + +struct async_domain { + struct list_head pending; + unsigned int registered: 1; +}; + +struct hash { + int ino; + int minor; + int major; + umode_t mode; + struct hash *next; + char name[4098]; +}; + +struct dir_entry { + struct list_head list; + char *name; + time64_t mtime; +}; + +enum state { + Start = 0, + Collect = 1, + GotHeader = 2, + SkipIt = 3, + GotName = 4, + CopyFile = 5, + GotSymlink = 6, + Reset = 7, +}; + +typedef int (*decompress_fn)(unsigned char *, long int, long int (*)(void *, long unsigned int), long int (*)(void *, long unsigned int), unsigned char *, long int *, void (*)(char *)); + +enum migratetype { + MIGRATE_UNMOVABLE = 0, + MIGRATE_MOVABLE = 1, + MIGRATE_RECLAIMABLE = 2, + MIGRATE_PCPTYPES = 3, + MIGRATE_HIGHATOMIC = 3, + MIGRATE_CMA = 4, + MIGRATE_ISOLATE = 5, + MIGRATE_TYPES = 6, +}; + +enum numa_stat_item { + NUMA_HIT = 0, + NUMA_MISS = 1, + NUMA_FOREIGN = 2, + NUMA_INTERLEAVE_HIT = 3, + NUMA_LOCAL = 4, + NUMA_OTHER = 5, + NR_VM_NUMA_EVENT_ITEMS = 6, +}; + +enum zone_stat_item { + NR_FREE_PAGES = 0, + NR_ZONE_LRU_BASE = 1, + NR_ZONE_INACTIVE_ANON = 1, + NR_ZONE_ACTIVE_ANON = 2, + NR_ZONE_INACTIVE_FILE = 3, + NR_ZONE_ACTIVE_FILE = 4, + NR_ZONE_UNEVICTABLE = 5, + NR_ZONE_WRITE_PENDING = 6, + NR_MLOCK = 7, + NR_BOUNCE = 8, + NR_ZSPAGES = 9, + NR_FREE_CMA_PAGES = 10, + NR_VM_ZONE_STAT_ITEMS = 11, +}; + +enum vmscan_throttle_state { + VMSCAN_THROTTLE_WRITEBACK = 0, + VMSCAN_THROTTLE_ISOLATED = 1, + VMSCAN_THROTTLE_NOPROGRESS = 2, + VMSCAN_THROTTLE_CONGESTED = 3, + NR_VMSCAN_THROTTLE = 4, +}; + +enum zone_watermarks { + WMARK_MIN = 0, + WMARK_LOW = 1, + WMARK_HIGH = 2, + NR_WMARK = 3, +}; + +enum { + ZONELIST_FALLBACK = 0, + ZONELIST_NOFALLBACK = 1, + MAX_ZONELISTS = 2, +}; + +enum { + HI_SOFTIRQ = 0, + TIMER_SOFTIRQ = 1, + NET_TX_SOFTIRQ = 2, + NET_RX_SOFTIRQ = 3, + BLOCK_SOFTIRQ = 4, + IRQ_POLL_SOFTIRQ = 5, + TASKLET_SOFTIRQ = 6, + SCHED_SOFTIRQ = 7, + HRTIMER_SOFTIRQ = 8, + RCU_SOFTIRQ = 9, + NR_SOFTIRQS = 10, +}; + +enum { + DQF_ROOT_SQUASH_B = 0, + DQF_SYS_FILE_B = 16, + DQF_PRIVATE = 17, +}; + +enum { + DQST_LOOKUPS = 0, + DQST_DROPS = 1, + DQST_READS = 2, + DQST_WRITES = 3, + DQST_CACHE_HITS = 4, + DQST_ALLOC_DQUOTS = 5, + DQST_FREE_DQUOTS = 6, + DQST_SYNCS = 7, + _DQST_DQSTAT_LAST = 8, +}; + +enum { + SB_UNFROZEN = 0, + SB_FREEZE_WRITE = 1, + SB_FREEZE_PAGEFAULT = 2, + SB_FREEZE_FS = 3, + SB_FREEZE_COMPLETE = 4, +}; + +enum compound_dtor_id { + NULL_COMPOUND_DTOR = 0, + COMPOUND_PAGE_DTOR = 1, + HUGETLB_PAGE_DTOR = 2, + TRANSHUGE_PAGE_DTOR = 3, + NR_COMPOUND_DTORS = 4, +}; + +enum { + TSK_TRACE_FL_TRACE_BIT = 0, + TSK_TRACE_FL_GRAPH_BIT = 1, +}; + +enum ucount_type { + UCOUNT_USER_NAMESPACES = 0, + UCOUNT_PID_NAMESPACES = 1, + UCOUNT_UTS_NAMESPACES = 2, + UCOUNT_IPC_NAMESPACES = 3, + UCOUNT_NET_NAMESPACES = 4, + UCOUNT_MNT_NAMESPACES = 5, + UCOUNT_CGROUP_NAMESPACES = 6, + UCOUNT_TIME_NAMESPACES = 7, + UCOUNT_INOTIFY_INSTANCES = 8, + UCOUNT_INOTIFY_WATCHES = 9, + UCOUNT_FANOTIFY_GROUPS = 10, + UCOUNT_FANOTIFY_MARKS = 11, + UCOUNT_RLIMIT_NPROC = 12, + UCOUNT_RLIMIT_MSGQUEUE = 13, + UCOUNT_RLIMIT_SIGPENDING = 14, + UCOUNT_RLIMIT_MEMLOCK = 15, + UCOUNT_COUNTS = 16, +}; + +enum flow_dissector_key_id { + FLOW_DISSECTOR_KEY_CONTROL = 0, + FLOW_DISSECTOR_KEY_BASIC = 1, + FLOW_DISSECTOR_KEY_IPV4_ADDRS = 2, + FLOW_DISSECTOR_KEY_IPV6_ADDRS = 3, + FLOW_DISSECTOR_KEY_PORTS = 4, + FLOW_DISSECTOR_KEY_PORTS_RANGE = 5, + FLOW_DISSECTOR_KEY_ICMP = 6, + FLOW_DISSECTOR_KEY_ETH_ADDRS = 7, + FLOW_DISSECTOR_KEY_TIPC = 8, + FLOW_DISSECTOR_KEY_ARP = 9, + FLOW_DISSECTOR_KEY_VLAN = 10, + FLOW_DISSECTOR_KEY_FLOW_LABEL = 11, + FLOW_DISSECTOR_KEY_GRE_KEYID = 12, + FLOW_DISSECTOR_KEY_MPLS_ENTROPY = 13, + FLOW_DISSECTOR_KEY_ENC_KEYID = 14, + FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS = 15, + FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS = 16, + FLOW_DISSECTOR_KEY_ENC_CONTROL = 17, + FLOW_DISSECTOR_KEY_ENC_PORTS = 18, + FLOW_DISSECTOR_KEY_MPLS = 19, + FLOW_DISSECTOR_KEY_TCP = 20, + FLOW_DISSECTOR_KEY_IP = 21, + FLOW_DISSECTOR_KEY_CVLAN = 22, + FLOW_DISSECTOR_KEY_ENC_IP = 23, + FLOW_DISSECTOR_KEY_ENC_OPTS = 24, + FLOW_DISSECTOR_KEY_META = 25, + FLOW_DISSECTOR_KEY_CT = 26, + FLOW_DISSECTOR_KEY_HASH = 27, + FLOW_DISSECTOR_KEY_MAX = 28, +}; + +enum { + IPSTATS_MIB_NUM = 0, + IPSTATS_MIB_INPKTS = 1, + IPSTATS_MIB_INOCTETS = 2, + IPSTATS_MIB_INDELIVERS = 3, + IPSTATS_MIB_OUTFORWDATAGRAMS = 4, + IPSTATS_MIB_OUTPKTS = 5, + IPSTATS_MIB_OUTOCTETS = 6, + IPSTATS_MIB_INHDRERRORS = 7, + IPSTATS_MIB_INTOOBIGERRORS = 8, + IPSTATS_MIB_INNOROUTES = 9, + IPSTATS_MIB_INADDRERRORS = 10, + IPSTATS_MIB_INUNKNOWNPROTOS = 11, + IPSTATS_MIB_INTRUNCATEDPKTS = 12, + IPSTATS_MIB_INDISCARDS = 13, + IPSTATS_MIB_OUTDISCARDS = 14, + IPSTATS_MIB_OUTNOROUTES = 15, + IPSTATS_MIB_REASMTIMEOUT = 16, + IPSTATS_MIB_REASMREQDS = 17, + IPSTATS_MIB_REASMOKS = 18, + IPSTATS_MIB_REASMFAILS = 19, + IPSTATS_MIB_FRAGOKS = 20, + IPSTATS_MIB_FRAGFAILS = 21, + IPSTATS_MIB_FRAGCREATES = 22, + IPSTATS_MIB_INMCASTPKTS = 23, + IPSTATS_MIB_OUTMCASTPKTS = 24, + IPSTATS_MIB_INBCASTPKTS = 25, + IPSTATS_MIB_OUTBCASTPKTS = 26, + IPSTATS_MIB_INMCASTOCTETS = 27, + IPSTATS_MIB_OUTMCASTOCTETS = 28, + IPSTATS_MIB_INBCASTOCTETS = 29, + IPSTATS_MIB_OUTBCASTOCTETS = 30, + IPSTATS_MIB_CSUMERRORS = 31, + IPSTATS_MIB_NOECTPKTS = 32, + IPSTATS_MIB_ECT1PKTS = 33, + IPSTATS_MIB_ECT0PKTS = 34, + IPSTATS_MIB_CEPKTS = 35, + IPSTATS_MIB_REASM_OVERLAPS = 36, + __IPSTATS_MIB_MAX = 37, +}; + +enum { + ICMP_MIB_NUM = 0, + ICMP_MIB_INMSGS = 1, + ICMP_MIB_INERRORS = 2, + ICMP_MIB_INDESTUNREACHS = 3, + ICMP_MIB_INTIMEEXCDS = 4, + ICMP_MIB_INPARMPROBS = 5, + ICMP_MIB_INSRCQUENCHS = 6, + ICMP_MIB_INREDIRECTS = 7, + ICMP_MIB_INECHOS = 8, + ICMP_MIB_INECHOREPS = 9, + ICMP_MIB_INTIMESTAMPS = 10, + ICMP_MIB_INTIMESTAMPREPS = 11, + ICMP_MIB_INADDRMASKS = 12, + ICMP_MIB_INADDRMASKREPS = 13, + ICMP_MIB_OUTMSGS = 14, + ICMP_MIB_OUTERRORS = 15, + ICMP_MIB_OUTDESTUNREACHS = 16, + ICMP_MIB_OUTTIMEEXCDS = 17, + ICMP_MIB_OUTPARMPROBS = 18, + ICMP_MIB_OUTSRCQUENCHS = 19, + ICMP_MIB_OUTREDIRECTS = 20, + ICMP_MIB_OUTECHOS = 21, + ICMP_MIB_OUTECHOREPS = 22, + ICMP_MIB_OUTTIMESTAMPS = 23, + ICMP_MIB_OUTTIMESTAMPREPS = 24, + ICMP_MIB_OUTADDRMASKS = 25, + ICMP_MIB_OUTADDRMASKREPS = 26, + ICMP_MIB_CSUMERRORS = 27, + __ICMP_MIB_MAX = 28, +}; + +enum { + ICMP6_MIB_NUM = 0, + ICMP6_MIB_INMSGS = 1, + ICMP6_MIB_INERRORS = 2, + ICMP6_MIB_OUTMSGS = 3, + ICMP6_MIB_OUTERRORS = 4, + ICMP6_MIB_CSUMERRORS = 5, + __ICMP6_MIB_MAX = 6, +}; + +enum { + TCP_MIB_NUM = 0, + TCP_MIB_RTOALGORITHM = 1, + TCP_MIB_RTOMIN = 2, + TCP_MIB_RTOMAX = 3, + TCP_MIB_MAXCONN = 4, + TCP_MIB_ACTIVEOPENS = 5, + TCP_MIB_PASSIVEOPENS = 6, + TCP_MIB_ATTEMPTFAILS = 7, + TCP_MIB_ESTABRESETS = 8, + TCP_MIB_CURRESTAB = 9, + TCP_MIB_INSEGS = 10, + TCP_MIB_OUTSEGS = 11, + TCP_MIB_RETRANSSEGS = 12, + TCP_MIB_INERRS = 13, + TCP_MIB_OUTRSTS = 14, + TCP_MIB_CSUMERRORS = 15, + __TCP_MIB_MAX = 16, +}; + +enum { + UDP_MIB_NUM = 0, + UDP_MIB_INDATAGRAMS = 1, + UDP_MIB_NOPORTS = 2, + UDP_MIB_INERRORS = 3, + UDP_MIB_OUTDATAGRAMS = 4, + UDP_MIB_RCVBUFERRORS = 5, + UDP_MIB_SNDBUFERRORS = 6, + UDP_MIB_CSUMERRORS = 7, + UDP_MIB_IGNOREDMULTI = 8, + UDP_MIB_MEMERRORS = 9, + __UDP_MIB_MAX = 10, +}; + +enum { + LINUX_MIB_NUM = 0, + LINUX_MIB_SYNCOOKIESSENT = 1, + LINUX_MIB_SYNCOOKIESRECV = 2, + LINUX_MIB_SYNCOOKIESFAILED = 3, + LINUX_MIB_EMBRYONICRSTS = 4, + LINUX_MIB_PRUNECALLED = 5, + LINUX_MIB_RCVPRUNED = 6, + LINUX_MIB_OFOPRUNED = 7, + LINUX_MIB_OUTOFWINDOWICMPS = 8, + LINUX_MIB_LOCKDROPPEDICMPS = 9, + LINUX_MIB_ARPFILTER = 10, + LINUX_MIB_TIMEWAITED = 11, + LINUX_MIB_TIMEWAITRECYCLED = 12, + LINUX_MIB_TIMEWAITKILLED = 13, + LINUX_MIB_PAWSACTIVEREJECTED = 14, + LINUX_MIB_PAWSESTABREJECTED = 15, + LINUX_MIB_DELAYEDACKS = 16, + LINUX_MIB_DELAYEDACKLOCKED = 17, + LINUX_MIB_DELAYEDACKLOST = 18, + LINUX_MIB_LISTENOVERFLOWS = 19, + LINUX_MIB_LISTENDROPS = 20, + LINUX_MIB_TCPHPHITS = 21, + LINUX_MIB_TCPPUREACKS = 22, + LINUX_MIB_TCPHPACKS = 23, + LINUX_MIB_TCPRENORECOVERY = 24, + LINUX_MIB_TCPSACKRECOVERY = 25, + LINUX_MIB_TCPSACKRENEGING = 26, + LINUX_MIB_TCPSACKREORDER = 27, + LINUX_MIB_TCPRENOREORDER = 28, + LINUX_MIB_TCPTSREORDER = 29, + LINUX_MIB_TCPFULLUNDO = 30, + LINUX_MIB_TCPPARTIALUNDO = 31, + LINUX_MIB_TCPDSACKUNDO = 32, + LINUX_MIB_TCPLOSSUNDO = 33, + LINUX_MIB_TCPLOSTRETRANSMIT = 34, + LINUX_MIB_TCPRENOFAILURES = 35, + LINUX_MIB_TCPSACKFAILURES = 36, + LINUX_MIB_TCPLOSSFAILURES = 37, + LINUX_MIB_TCPFASTRETRANS = 38, + LINUX_MIB_TCPSLOWSTARTRETRANS = 39, + LINUX_MIB_TCPTIMEOUTS = 40, + LINUX_MIB_TCPLOSSPROBES = 41, + LINUX_MIB_TCPLOSSPROBERECOVERY = 42, + LINUX_MIB_TCPRENORECOVERYFAIL = 43, + LINUX_MIB_TCPSACKRECOVERYFAIL = 44, + LINUX_MIB_TCPRCVCOLLAPSED = 45, + LINUX_MIB_TCPDSACKOLDSENT = 46, + LINUX_MIB_TCPDSACKOFOSENT = 47, + LINUX_MIB_TCPDSACKRECV = 48, + LINUX_MIB_TCPDSACKOFORECV = 49, + LINUX_MIB_TCPABORTONDATA = 50, + LINUX_MIB_TCPABORTONCLOSE = 51, + LINUX_MIB_TCPABORTONMEMORY = 52, + LINUX_MIB_TCPABORTONTIMEOUT = 53, + LINUX_MIB_TCPABORTONLINGER = 54, + LINUX_MIB_TCPABORTFAILED = 55, + LINUX_MIB_TCPMEMORYPRESSURES = 56, + LINUX_MIB_TCPMEMORYPRESSURESCHRONO = 57, + LINUX_MIB_TCPSACKDISCARD = 58, + LINUX_MIB_TCPDSACKIGNOREDOLD = 59, + LINUX_MIB_TCPDSACKIGNOREDNOUNDO = 60, + LINUX_MIB_TCPSPURIOUSRTOS = 61, + LINUX_MIB_TCPMD5NOTFOUND = 62, + LINUX_MIB_TCPMD5UNEXPECTED = 63, + LINUX_MIB_TCPMD5FAILURE = 64, + LINUX_MIB_SACKSHIFTED = 65, + LINUX_MIB_SACKMERGED = 66, + LINUX_MIB_SACKSHIFTFALLBACK = 67, + LINUX_MIB_TCPBACKLOGDROP = 68, + LINUX_MIB_PFMEMALLOCDROP = 69, + LINUX_MIB_TCPMINTTLDROP = 70, + LINUX_MIB_TCPDEFERACCEPTDROP = 71, + LINUX_MIB_IPRPFILTER = 72, + LINUX_MIB_TCPTIMEWAITOVERFLOW = 73, + LINUX_MIB_TCPREQQFULLDOCOOKIES = 74, + LINUX_MIB_TCPREQQFULLDROP = 75, + LINUX_MIB_TCPRETRANSFAIL = 76, + LINUX_MIB_TCPRCVCOALESCE = 77, + LINUX_MIB_TCPBACKLOGCOALESCE = 78, + LINUX_MIB_TCPOFOQUEUE = 79, + LINUX_MIB_TCPOFODROP = 80, + LINUX_MIB_TCPOFOMERGE = 81, + LINUX_MIB_TCPCHALLENGEACK = 82, + LINUX_MIB_TCPSYNCHALLENGE = 83, + LINUX_MIB_TCPFASTOPENACTIVE = 84, + LINUX_MIB_TCPFASTOPENACTIVEFAIL = 85, + LINUX_MIB_TCPFASTOPENPASSIVE = 86, + LINUX_MIB_TCPFASTOPENPASSIVEFAIL = 87, + LINUX_MIB_TCPFASTOPENLISTENOVERFLOW = 88, + LINUX_MIB_TCPFASTOPENCOOKIEREQD = 89, + LINUX_MIB_TCPFASTOPENBLACKHOLE = 90, + LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES = 91, + LINUX_MIB_BUSYPOLLRXPACKETS = 92, + LINUX_MIB_TCPAUTOCORKING = 93, + LINUX_MIB_TCPFROMZEROWINDOWADV = 94, + LINUX_MIB_TCPTOZEROWINDOWADV = 95, + LINUX_MIB_TCPWANTZEROWINDOWADV = 96, + LINUX_MIB_TCPSYNRETRANS = 97, + LINUX_MIB_TCPORIGDATASENT = 98, + LINUX_MIB_TCPHYSTARTTRAINDETECT = 99, + LINUX_MIB_TCPHYSTARTTRAINCWND = 100, + LINUX_MIB_TCPHYSTARTDELAYDETECT = 101, + LINUX_MIB_TCPHYSTARTDELAYCWND = 102, + LINUX_MIB_TCPACKSKIPPEDSYNRECV = 103, + LINUX_MIB_TCPACKSKIPPEDPAWS = 104, + LINUX_MIB_TCPACKSKIPPEDSEQ = 105, + LINUX_MIB_TCPACKSKIPPEDFINWAIT2 = 106, + LINUX_MIB_TCPACKSKIPPEDTIMEWAIT = 107, + LINUX_MIB_TCPACKSKIPPEDCHALLENGE = 108, + LINUX_MIB_TCPWINPROBE = 109, + LINUX_MIB_TCPKEEPALIVE = 110, + LINUX_MIB_TCPMTUPFAIL = 111, + LINUX_MIB_TCPMTUPSUCCESS = 112, + LINUX_MIB_TCPDELIVERED = 113, + LINUX_MIB_TCPDELIVEREDCE = 114, + LINUX_MIB_TCPACKCOMPRESSED = 115, + LINUX_MIB_TCPZEROWINDOWDROP = 116, + LINUX_MIB_TCPRCVQDROP = 117, + LINUX_MIB_TCPWQUEUETOOBIG = 118, + LINUX_MIB_TCPFASTOPENPASSIVEALTKEY = 119, + LINUX_MIB_TCPTIMEOUTREHASH = 120, + LINUX_MIB_TCPDUPLICATEDATAREHASH = 121, + LINUX_MIB_TCPDSACKRECVSEGS = 122, + LINUX_MIB_TCPDSACKIGNOREDDUBIOUS = 123, + LINUX_MIB_TCPMIGRATEREQSUCCESS = 124, + LINUX_MIB_TCPMIGRATEREQFAILURE = 125, + __LINUX_MIB_MAX = 126, +}; + +enum { + LINUX_MIB_XFRMNUM = 0, + LINUX_MIB_XFRMINERROR = 1, + LINUX_MIB_XFRMINBUFFERERROR = 2, + LINUX_MIB_XFRMINHDRERROR = 3, + LINUX_MIB_XFRMINNOSTATES = 4, + LINUX_MIB_XFRMINSTATEPROTOERROR = 5, + LINUX_MIB_XFRMINSTATEMODEERROR = 6, + LINUX_MIB_XFRMINSTATESEQERROR = 7, + LINUX_MIB_XFRMINSTATEEXPIRED = 8, + LINUX_MIB_XFRMINSTATEMISMATCH = 9, + LINUX_MIB_XFRMINSTATEINVALID = 10, + LINUX_MIB_XFRMINTMPLMISMATCH = 11, + LINUX_MIB_XFRMINNOPOLS = 12, + LINUX_MIB_XFRMINPOLBLOCK = 13, + LINUX_MIB_XFRMINPOLERROR = 14, + LINUX_MIB_XFRMOUTERROR = 15, + LINUX_MIB_XFRMOUTBUNDLEGENERROR = 16, + LINUX_MIB_XFRMOUTBUNDLECHECKERROR = 17, + LINUX_MIB_XFRMOUTNOSTATES = 18, + LINUX_MIB_XFRMOUTSTATEPROTOERROR = 19, + LINUX_MIB_XFRMOUTSTATEMODEERROR = 20, + LINUX_MIB_XFRMOUTSTATESEQERROR = 21, + LINUX_MIB_XFRMOUTSTATEEXPIRED = 22, + LINUX_MIB_XFRMOUTPOLBLOCK = 23, + LINUX_MIB_XFRMOUTPOLDEAD = 24, + LINUX_MIB_XFRMOUTPOLERROR = 25, + LINUX_MIB_XFRMFWDHDRERROR = 26, + LINUX_MIB_XFRMOUTSTATEINVALID = 27, + LINUX_MIB_XFRMACQUIREERROR = 28, + __LINUX_MIB_XFRMMAX = 29, +}; + +enum { + LINUX_MIB_TLSNUM = 0, + LINUX_MIB_TLSCURRTXSW = 1, + LINUX_MIB_TLSCURRRXSW = 2, + LINUX_MIB_TLSCURRTXDEVICE = 3, + LINUX_MIB_TLSCURRRXDEVICE = 4, + LINUX_MIB_TLSTXSW = 5, + LINUX_MIB_TLSRXSW = 6, + LINUX_MIB_TLSTXDEVICE = 7, + LINUX_MIB_TLSRXDEVICE = 8, + LINUX_MIB_TLSDECRYPTERROR = 9, + LINUX_MIB_TLSRXDEVICERESYNC = 10, + __LINUX_MIB_TLSMAX = 11, +}; + +enum nf_inet_hooks { + NF_INET_PRE_ROUTING = 0, + NF_INET_LOCAL_IN = 1, + NF_INET_FORWARD = 2, + NF_INET_LOCAL_OUT = 3, + NF_INET_POST_ROUTING = 4, + NF_INET_NUMHOOKS = 5, + NF_INET_INGRESS = 5, +}; + +enum { + NFPROTO_UNSPEC = 0, + NFPROTO_INET = 1, + NFPROTO_IPV4 = 2, + NFPROTO_ARP = 3, + NFPROTO_NETDEV = 5, + NFPROTO_BRIDGE = 7, + NFPROTO_IPV6 = 10, + NFPROTO_DECNET = 12, + NFPROTO_NUMPROTO = 13, +}; + +enum tcp_conntrack { + TCP_CONNTRACK_NONE = 0, + TCP_CONNTRACK_SYN_SENT = 1, + TCP_CONNTRACK_SYN_RECV = 2, + TCP_CONNTRACK_ESTABLISHED = 3, + TCP_CONNTRACK_FIN_WAIT = 4, + TCP_CONNTRACK_CLOSE_WAIT = 5, + TCP_CONNTRACK_LAST_ACK = 6, + TCP_CONNTRACK_TIME_WAIT = 7, + TCP_CONNTRACK_CLOSE = 8, + TCP_CONNTRACK_LISTEN = 9, + TCP_CONNTRACK_MAX = 10, + TCP_CONNTRACK_IGNORE = 11, + TCP_CONNTRACK_RETRANS = 12, + TCP_CONNTRACK_UNACK = 13, + TCP_CONNTRACK_TIMEOUT_MAX = 14, +}; + +enum ct_dccp_states { + CT_DCCP_NONE = 0, + CT_DCCP_REQUEST = 1, + CT_DCCP_RESPOND = 2, + CT_DCCP_PARTOPEN = 3, + CT_DCCP_OPEN = 4, + CT_DCCP_CLOSEREQ = 5, + CT_DCCP_CLOSING = 6, + CT_DCCP_TIMEWAIT = 7, + CT_DCCP_IGNORE = 8, + CT_DCCP_INVALID = 9, + __CT_DCCP_MAX = 10, +}; + +enum ip_conntrack_dir { + IP_CT_DIR_ORIGINAL = 0, + IP_CT_DIR_REPLY = 1, + IP_CT_DIR_MAX = 2, +}; + +enum sctp_conntrack { + SCTP_CONNTRACK_NONE = 0, + SCTP_CONNTRACK_CLOSED = 1, + SCTP_CONNTRACK_COOKIE_WAIT = 2, + SCTP_CONNTRACK_COOKIE_ECHOED = 3, + SCTP_CONNTRACK_ESTABLISHED = 4, + SCTP_CONNTRACK_SHUTDOWN_SENT = 5, + SCTP_CONNTRACK_SHUTDOWN_RECD = 6, + SCTP_CONNTRACK_SHUTDOWN_ACK_SENT = 7, + SCTP_CONNTRACK_HEARTBEAT_SENT = 8, + SCTP_CONNTRACK_HEARTBEAT_ACKED = 9, + SCTP_CONNTRACK_MAX = 10, +}; + +enum udp_conntrack { + UDP_CT_UNREPLIED = 0, + UDP_CT_REPLIED = 1, + UDP_CT_MAX = 2, +}; + +enum gre_conntrack { + GRE_CT_UNREPLIED = 0, + GRE_CT_REPLIED = 1, + GRE_CT_MAX = 2, +}; + +enum { + XFRM_POLICY_IN = 0, + XFRM_POLICY_OUT = 1, + XFRM_POLICY_FWD = 2, + XFRM_POLICY_MASK = 3, + XFRM_POLICY_MAX = 3, +}; + +enum netns_bpf_attach_type { + NETNS_BPF_INVALID = 4294967295, + NETNS_BPF_FLOW_DISSECTOR = 0, + NETNS_BPF_SK_LOOKUP = 1, + MAX_NETNS_BPF_ATTACH_TYPE = 2, +}; + +enum cpu_idle_type { + CPU_IDLE = 0, + CPU_NOT_IDLE = 1, + CPU_NEWLY_IDLE = 2, + CPU_MAX_IDLE_TYPES = 3, +}; + +enum { + __SD_BALANCE_NEWIDLE = 0, + __SD_BALANCE_EXEC = 1, + __SD_BALANCE_FORK = 2, + __SD_BALANCE_WAKE = 3, + __SD_WAKE_AFFINE = 4, + __SD_ASYM_CPUCAPACITY = 5, + __SD_ASYM_CPUCAPACITY_FULL = 6, + __SD_SHARE_CPUCAPACITY = 7, + __SD_SHARE_PKG_RESOURCES = 8, + __SD_SERIALIZE = 9, + __SD_ASYM_PACKING = 10, + __SD_PREFER_SIBLING = 11, + __SD_OVERLAP = 12, + __SD_NUMA = 13, + __SD_FLAG_CNT = 14, +}; + +enum skb_ext_id { + SKB_EXT_BRIDGE_NF = 0, + SKB_EXT_SEC_PATH = 1, + TC_SKB_EXT = 2, + SKB_EXT_MPTCP = 3, + SKB_EXT_NUM = 4, +}; + +enum audit_ntp_type { + AUDIT_NTP_OFFSET = 0, + AUDIT_NTP_FREQ = 1, + AUDIT_NTP_STATUS = 2, + AUDIT_NTP_TAI = 3, + AUDIT_NTP_TICK = 4, + AUDIT_NTP_ADJUST = 5, + AUDIT_NTP_NVALS = 6, +}; + +typedef long unsigned int uintptr_t; + +struct step_hook { + struct list_head node; + int (*fn)(struct pt_regs *, unsigned int); +}; + +struct break_hook { + struct list_head node; + int (*fn)(struct pt_regs *, unsigned int); + u16 imm; + u16 mask; +}; + +enum dbg_active_el { + DBG_ACTIVE_EL0 = 0, + DBG_ACTIVE_EL1 = 1, +}; + +struct nmi_ctx { + u64 hcr; + unsigned int cnt; +}; + +struct midr_range { + u32 model; + u32 rv_min; + u32 rv_max; +}; + +struct arm64_midr_revidr { + u32 midr_rv; + u32 revidr_mask; +}; + +struct arm64_cpu_capabilities { + const char *desc; + u16 capability; + u16 type; + bool (*matches)(const struct arm64_cpu_capabilities *, int); + void (*cpu_enable)(const struct arm64_cpu_capabilities *); + union { + struct { + struct midr_range midr_range; + const struct arm64_midr_revidr * const fixed_revs; + }; + const struct midr_range *midr_range_list; + struct { + u32 sys_reg; + u8 field_pos; + u8 min_field_value; + u8 hwcap_type; + bool sign; + long unsigned int hwcap; + }; + }; + const struct arm64_cpu_capabilities *match_list; +}; + +struct vl_info { + enum vec_type type; + const char *name; + int min_vl; + int max_vl; + int max_virtualisable_vl; + long unsigned int vq_map[8]; + long unsigned int vq_partial_map[8]; +}; + +enum cpu_pm_event { + CPU_PM_ENTER = 0, + CPU_PM_ENTER_FAILED = 1, + CPU_PM_EXIT = 2, + CPU_CLUSTER_PM_ENTER = 3, + CPU_CLUSTER_PM_ENTER_FAILED = 4, + CPU_CLUSTER_PM_EXIT = 5, +}; + +struct fpsimd_last_state_struct { + struct user_fpsimd_state *st; + void *sve_state; + unsigned int sve_vl; +}; + +struct vl_config { + int __default_vl; +}; + +enum arm64_hyp_spectre_vector { + HYP_VECTOR_DIRECT = 0, + HYP_VECTOR_SPECTRE_DIRECT = 1, + HYP_VECTOR_INDIRECT = 2, + HYP_VECTOR_SPECTRE_INDIRECT = 3, +}; + +typedef void (*bp_hardening_cb_t)(); + +struct bp_hardening_data { + enum arm64_hyp_spectre_vector slot; + bp_hardening_cb_t fn; +}; + +enum ctx_state { + CONTEXT_DISABLED = 4294967295, + CONTEXT_KERNEL = 0, + CONTEXT_USER = 1, + CONTEXT_GUEST = 2, +}; + +enum stack_type { + STACK_TYPE_UNKNOWN = 0, + STACK_TYPE_TASK = 1, + STACK_TYPE_IRQ = 2, + STACK_TYPE_OVERFLOW = 3, + STACK_TYPE_SDEI_NORMAL = 4, + STACK_TYPE_SDEI_CRITICAL = 5, + __NR_STACK_TYPES = 6, +}; + +struct stack_info { + long unsigned int low; + long unsigned int high; + enum stack_type type; +}; + +struct sdei_registered_event; + +struct plist_head { + struct list_head node_list; +}; + +typedef struct { + __u8 b[16]; +} guid_t; + +enum pm_qos_type { + PM_QOS_UNITIALIZED = 0, + PM_QOS_MAX = 1, + PM_QOS_MIN = 2, +}; + +struct pm_qos_constraints { + struct plist_head list; + s32 target_value; + s32 default_value; + s32 no_constraint_value; + enum pm_qos_type type; + struct blocking_notifier_head *notifiers; +}; + +struct freq_constraints { + struct pm_qos_constraints min_freq; + struct blocking_notifier_head min_freq_notifiers; + struct pm_qos_constraints max_freq; + struct blocking_notifier_head max_freq_notifiers; +}; + +struct pm_qos_flags { + struct list_head list; + s32 effective_flags; +}; + +struct dev_pm_qos_request; + +struct dev_pm_qos { + struct pm_qos_constraints resume_latency; + struct pm_qos_constraints latency_tolerance; + struct freq_constraints freq; + struct pm_qos_flags flags; + struct dev_pm_qos_request *resume_latency_req; + struct dev_pm_qos_request *latency_tolerance_req; + struct dev_pm_qos_request *flags_req; +}; + +typedef __u32 Elf32_Addr; + +typedef __u16 Elf32_Half; + +typedef __u32 Elf32_Off; + +struct elf32_hdr { + unsigned char e_ident[16]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +}; + +struct arch_elf_state { + int flags; +}; + +enum reboot_mode { + REBOOT_UNDEFINED = 4294967295, + REBOOT_COLD = 0, + REBOOT_WARM = 1, + REBOOT_HARD = 2, + REBOOT_SOFT = 3, + REBOOT_GPIO = 4, +}; + +typedef long unsigned int efi_status_t; + +typedef u8 efi_bool_t; + +typedef u16 efi_char16_t; + +typedef guid_t efi_guid_t; + +typedef struct { + u64 signature; + u32 revision; + u32 headersize; + u32 crc32; + u32 reserved; +} efi_table_hdr_t; + +typedef struct { + u32 type; + u32 pad; + u64 phys_addr; + u64 virt_addr; + u64 num_pages; + u64 attribute; +} efi_memory_desc_t; + +typedef struct { + efi_guid_t guid; + u32 headersize; + u32 flags; + u32 imagesize; +} efi_capsule_header_t; + +typedef struct { + u16 year; + u8 month; + u8 day; + u8 hour; + u8 minute; + u8 second; + u8 pad1; + u32 nanosecond; + s16 timezone; + u8 daylight; + u8 pad2; +} efi_time_t; + +typedef struct { + u32 resolution; + u32 accuracy; + u8 sets_to_zero; +} efi_time_cap_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 get_time; + u32 set_time; + u32 get_wakeup_time; + u32 set_wakeup_time; + u32 set_virtual_address_map; + u32 convert_pointer; + u32 get_variable; + u32 get_next_variable; + u32 set_variable; + u32 get_next_high_mono_count; + u32 reset_system; + u32 update_capsule; + u32 query_capsule_caps; + u32 query_variable_info; +} efi_runtime_services_32_t; + +typedef efi_status_t efi_get_time_t(efi_time_t *, efi_time_cap_t *); + +typedef efi_status_t efi_set_time_t(efi_time_t *); + +typedef efi_status_t efi_get_wakeup_time_t(efi_bool_t *, efi_bool_t *, efi_time_t *); + +typedef efi_status_t efi_set_wakeup_time_t(efi_bool_t, efi_time_t *); + +typedef efi_status_t efi_get_variable_t(efi_char16_t *, efi_guid_t *, u32 *, long unsigned int *, void *); + +typedef efi_status_t efi_get_next_variable_t(long unsigned int *, efi_char16_t *, efi_guid_t *); + +typedef efi_status_t efi_set_variable_t(efi_char16_t *, efi_guid_t *, u32, long unsigned int, void *); + +typedef efi_status_t efi_get_next_high_mono_count_t(u32 *); + +typedef void efi_reset_system_t(int, efi_status_t, long unsigned int, efi_char16_t *); + +typedef efi_status_t efi_set_virtual_address_map_t(long unsigned int, long unsigned int, u32, efi_memory_desc_t *); + +typedef efi_status_t efi_query_variable_info_t(u32, u64 *, u64 *, u64 *); + +typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **, long unsigned int, long unsigned int); + +typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **, long unsigned int, u64 *, int *); + +typedef union { + struct { + efi_table_hdr_t hdr; + efi_get_time_t *get_time; + efi_set_time_t *set_time; + efi_get_wakeup_time_t *get_wakeup_time; + efi_set_wakeup_time_t *set_wakeup_time; + efi_set_virtual_address_map_t *set_virtual_address_map; + void *convert_pointer; + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_get_next_high_mono_count_t *get_next_high_mono_count; + efi_reset_system_t *reset_system; + efi_update_capsule_t *update_capsule; + efi_query_capsule_caps_t *query_capsule_caps; + efi_query_variable_info_t *query_variable_info; + }; + efi_runtime_services_32_t mixed_mode; +} efi_runtime_services_t; + +struct efi_memory_map { + phys_addr_t phys_map; + void *map; + void *map_end; + int nr_map; + long unsigned int desc_version; + long unsigned int desc_size; + long unsigned int flags; +}; + +struct efi { + const efi_runtime_services_t *runtime; + unsigned int runtime_version; + unsigned int runtime_supported_mask; + long unsigned int acpi; + long unsigned int acpi20; + long unsigned int smbios; + long unsigned int smbios3; + long unsigned int esrt; + long unsigned int tpm_log; + long unsigned int tpm_final_log; + long unsigned int mokvar_table; + efi_get_time_t *get_time; + efi_set_time_t *set_time; + efi_get_wakeup_time_t *get_wakeup_time; + efi_set_wakeup_time_t *set_wakeup_time; + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_info_t *query_variable_info; + efi_query_variable_info_t *query_variable_info_nonblocking; + efi_update_capsule_t *update_capsule; + efi_query_capsule_caps_t *query_capsule_caps; + efi_get_next_high_mono_count_t *get_next_high_mono_count; + efi_reset_system_t *reset_system; + struct efi_memory_map memmap; + long unsigned int flags; +}; + +struct pm_qos_flags_request { + struct list_head node; + s32 flags; +}; + +enum freq_qos_req_type { + FREQ_QOS_MIN = 1, + FREQ_QOS_MAX = 2, +}; + +struct freq_qos_request { + enum freq_qos_req_type type; + struct plist_node pnode; + struct freq_constraints *qos; +}; + +enum dev_pm_qos_req_type { + DEV_PM_QOS_RESUME_LATENCY = 1, + DEV_PM_QOS_LATENCY_TOLERANCE = 2, + DEV_PM_QOS_MIN_FREQUENCY = 3, + DEV_PM_QOS_MAX_FREQUENCY = 4, + DEV_PM_QOS_FLAGS = 5, +}; + +struct dev_pm_qos_request { + enum dev_pm_qos_req_type type; + union { + struct plist_node pnode; + struct pm_qos_flags_request flr; + struct freq_qos_request freq; + } data; + struct device *dev; +}; + +struct stackframe { + long unsigned int fp; + long unsigned int pc; + long unsigned int stacks_done[1]; + long unsigned int prev_fp; + enum stack_type prev_type; + struct llist_node *kr_cur; +}; + +struct user_sve_header { + __u32 size; + __u32 max_size; + __u16 vl; + __u16 max_vl; + __u16 flags; + __u16 __reserved; +}; + +struct user_pac_mask { + __u64 data_mask; + __u64 insn_mask; +}; + +struct user_pac_address_keys { + __int128 unsigned apiakey; + __int128 unsigned apibkey; + __int128 unsigned apdakey; + __int128 unsigned apdbkey; +}; + +struct user_pac_generic_keys { + __int128 unsigned apgakey; +}; + +struct seccomp_data { + int nr; + __u32 arch; + __u64 instruction_pointer; + __u64 args[6]; +}; + +typedef u32 compat_ulong_t; + +enum perf_type_id { + PERF_TYPE_HARDWARE = 0, + PERF_TYPE_SOFTWARE = 1, + PERF_TYPE_TRACEPOINT = 2, + PERF_TYPE_HW_CACHE = 3, + PERF_TYPE_RAW = 4, + PERF_TYPE_BREAKPOINT = 5, + PERF_TYPE_MAX = 6, +}; + +enum { + TASKSTATS_CMD_UNSPEC = 0, + TASKSTATS_CMD_GET = 1, + TASKSTATS_CMD_NEW = 2, + __TASKSTATS_CMD_MAX = 3, +}; + +enum cpu_usage_stat { + CPUTIME_USER = 0, + CPUTIME_NICE = 1, + CPUTIME_SYSTEM = 2, + CPUTIME_SOFTIRQ = 3, + CPUTIME_IRQ = 4, + CPUTIME_IDLE = 5, + CPUTIME_IOWAIT = 6, + CPUTIME_STEAL = 7, + CPUTIME_GUEST = 8, + CPUTIME_GUEST_NICE = 9, + NR_STATS = 10, +}; + +enum bpf_cgroup_storage_type { + BPF_CGROUP_STORAGE_SHARED = 0, + BPF_CGROUP_STORAGE_PERCPU = 1, + __BPF_CGROUP_STORAGE_MAX = 2, +}; + +enum bpf_tramp_prog_type { + BPF_TRAMP_FENTRY = 0, + BPF_TRAMP_FEXIT = 1, + BPF_TRAMP_MODIFY_RETURN = 2, + BPF_TRAMP_MAX = 3, + BPF_TRAMP_REPLACE = 4, +}; + +enum cgroup_bpf_attach_type { + CGROUP_BPF_ATTACH_TYPE_INVALID = 4294967295, + CGROUP_INET_INGRESS = 0, + CGROUP_INET_EGRESS = 1, + CGROUP_INET_SOCK_CREATE = 2, + CGROUP_SOCK_OPS = 3, + CGROUP_DEVICE = 4, + CGROUP_INET4_BIND = 5, + CGROUP_INET6_BIND = 6, + CGROUP_INET4_CONNECT = 7, + CGROUP_INET6_CONNECT = 8, + CGROUP_INET4_POST_BIND = 9, + CGROUP_INET6_POST_BIND = 10, + CGROUP_UDP4_SENDMSG = 11, + CGROUP_UDP6_SENDMSG = 12, + CGROUP_SYSCTL = 13, + CGROUP_UDP4_RECVMSG = 14, + CGROUP_UDP6_RECVMSG = 15, + CGROUP_GETSOCKOPT = 16, + CGROUP_SETSOCKOPT = 17, + CGROUP_INET4_GETPEERNAME = 18, + CGROUP_INET6_GETPEERNAME = 19, + CGROUP_INET4_GETSOCKNAME = 20, + CGROUP_INET6_GETSOCKNAME = 21, + CGROUP_INET_SOCK_RELEASE = 22, + MAX_CGROUP_BPF_ATTACH_TYPE = 23, +}; + +enum psi_task_count { + NR_IOWAIT = 0, + NR_MEMSTALL = 1, + NR_RUNNING = 2, + NR_ONCPU = 3, + NR_PSI_TASK_COUNTS = 4, +}; + +enum psi_states { + PSI_IO_SOME = 0, + PSI_IO_FULL = 1, + PSI_MEM_SOME = 2, + PSI_MEM_FULL = 3, + PSI_CPU_SOME = 4, + PSI_CPU_FULL = 5, + PSI_NONIDLE = 6, + NR_PSI_STATES = 7, +}; + +enum psi_aggregators { + PSI_AVGS = 0, + PSI_POLL = 1, + NR_PSI_AGGREGATORS = 2, +}; + +enum cgroup_subsys_id { + cpuset_cgrp_id = 0, + cpu_cgrp_id = 1, + cpuacct_cgrp_id = 2, + io_cgrp_id = 3, + memory_cgrp_id = 4, + devices_cgrp_id = 5, + freezer_cgrp_id = 6, + net_cls_cgrp_id = 7, + perf_event_cgrp_id = 8, + net_prio_cgrp_id = 9, + hugetlb_cgrp_id = 10, + pids_cgrp_id = 11, + rdma_cgrp_id = 12, + misc_cgrp_id = 13, + CGROUP_SUBSYS_COUNT = 14, +}; + +enum { + HW_BREAKPOINT_LEN_1 = 1, + HW_BREAKPOINT_LEN_2 = 2, + HW_BREAKPOINT_LEN_3 = 3, + HW_BREAKPOINT_LEN_4 = 4, + HW_BREAKPOINT_LEN_5 = 5, + HW_BREAKPOINT_LEN_6 = 6, + HW_BREAKPOINT_LEN_7 = 7, + HW_BREAKPOINT_LEN_8 = 8, +}; + +enum { + HW_BREAKPOINT_EMPTY = 0, + HW_BREAKPOINT_R = 1, + HW_BREAKPOINT_W = 2, + HW_BREAKPOINT_RW = 3, + HW_BREAKPOINT_X = 4, + HW_BREAKPOINT_INVALID = 7, +}; + +enum bp_type_idx { + TYPE_INST = 0, + TYPE_DATA = 1, + TYPE_MAX = 2, +}; + +struct membuf { + void *p; + size_t left; +}; + +struct user_regset; + +typedef int user_regset_active_fn(struct task_struct *, const struct user_regset *); + +typedef int user_regset_get2_fn(struct task_struct *, const struct user_regset *, struct membuf); + +typedef int user_regset_set_fn(struct task_struct *, const struct user_regset *, unsigned int, unsigned int, const void *, const void *); + +typedef int user_regset_writeback_fn(struct task_struct *, const struct user_regset *, int); + +struct user_regset { + user_regset_get2_fn *regset_get; + user_regset_set_fn *set; + user_regset_active_fn *active; + user_regset_writeback_fn *writeback; + unsigned int n; + unsigned int size; + unsigned int align; + unsigned int bias; + unsigned int core_note_type; +}; + +struct user_regset_view { + const char *name; + const struct user_regset *regsets; + unsigned int n; + u32 e_flags; + u16 e_machine; + u8 ei_osabi; +}; + +struct blkg_iostat { + u64 bytes[3]; + u64 ios[3]; +}; + +struct blkg_iostat_set { + struct u64_stats_sync sync; + struct blkg_iostat cur; + struct blkg_iostat last; +}; + +struct blkcg; + +struct blkg_policy_data; + +struct blkcg_gq { + struct request_queue *q; + struct list_head q_node; + struct hlist_node blkcg_node; + struct blkcg *blkcg; + struct blkcg_gq *parent; + struct percpu_ref refcnt; + bool online; + struct blkg_iostat_set *iostat_cpu; + struct blkg_iostat_set iostat; + struct blkg_policy_data *pd[6]; + spinlock_t async_bio_lock; + struct bio_list async_bios; + struct work_struct async_bio_work; + atomic_t use_delay; + atomic64_t delay_nsec; + atomic64_t delay_start; + u64 last_delay; + int last_use; + struct callback_head callback_head; +}; + +enum blkg_iostat_type { + BLKG_IOSTAT_READ = 0, + BLKG_IOSTAT_WRITE = 1, + BLKG_IOSTAT_DISCARD = 2, + BLKG_IOSTAT_NR = 3, +}; + +struct blkcg_policy_data; + +struct blkcg { + struct cgroup_subsys_state css; + spinlock_t lock; + refcount_t online_pin; + struct xarray blkg_tree; + struct blkcg_gq *blkg_hint; + struct hlist_head blkg_list; + struct blkcg_policy_data *cpd[6]; + struct list_head all_blkcgs_node; + char fc_app_id[129]; + struct list_head cgwb_list; +}; + +struct blkcg_policy_data { + struct blkcg *blkcg; + int plid; +}; + +struct blkg_policy_data { + struct blkcg_gq *blkg; + int plid; +}; + +struct trace_event_raw_sys_enter { + struct trace_entry ent; + long int id; + long unsigned int args[6]; + char __data[0]; +}; + +struct trace_event_raw_sys_exit { + struct trace_entry ent; + long int id; + long int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_sys_enter {}; + +struct trace_event_data_offsets_sys_exit {}; + +typedef void (*btf_trace_sys_enter)(void *, struct pt_regs *, long int); + +typedef void (*btf_trace_sys_exit)(void *, struct pt_regs *, long int); + +struct pt_regs_offset { + const char *name; + int offset; +}; + +enum aarch64_regset { + REGSET_GPR = 0, + REGSET_FPR = 1, + REGSET_TLS = 2, + REGSET_HW_BREAK = 3, + REGSET_HW_WATCH = 4, + REGSET_SYSTEM_CALL = 5, + REGSET_SVE = 6, + REGSET_PAC_MASK = 7, + REGSET_PAC_ENABLED_KEYS = 8, + REGSET_PACA_KEYS = 9, + REGSET_PACG_KEYS = 10, + REGSET_TAGGED_ADDR_CTRL = 11, +}; + +enum compat_regset { + REGSET_COMPAT_GPR = 0, + REGSET_COMPAT_VFP = 1, +}; + +enum ptrace_syscall_dir { + PTRACE_SYSCALL_ENTER = 0, + PTRACE_SYSCALL_EXIT = 1, +}; + +struct atomic_notifier_head { + spinlock_t lock; + struct notifier_block *head; +}; + +enum meminit_context { + MEMINIT_EARLY = 0, + MEMINIT_HOTPLUG = 1, +}; + +enum memblock_flags { + MEMBLOCK_NONE = 0, + MEMBLOCK_HOTPLUG = 1, + MEMBLOCK_MIRROR = 2, + MEMBLOCK_NOMAP = 4, + MEMBLOCK_DRIVER_MANAGED = 8, +}; + +struct memblock_region { + phys_addr_t base; + phys_addr_t size; + enum memblock_flags flags; + int nid; +}; + +struct memblock_type { + long unsigned int cnt; + long unsigned int max; + phys_addr_t total_size; + struct memblock_region *regions; + char *name; +}; + +struct memblock { + bool bottom_up; + phys_addr_t current_limit; + struct memblock_type memory; + struct memblock_type reserved; +}; + +struct mpidr_hash { + u64 mask; + u32 shift_aff[4]; + u32 bits; +}; + +struct cpu { + int node_id; + int hotpluggable; + struct device dev; +}; + +struct cpuinfo_32bit { + u32 reg_id_dfr0; + u32 reg_id_dfr1; + u32 reg_id_isar0; + u32 reg_id_isar1; + u32 reg_id_isar2; + u32 reg_id_isar3; + u32 reg_id_isar4; + u32 reg_id_isar5; + u32 reg_id_isar6; + u32 reg_id_mmfr0; + u32 reg_id_mmfr1; + u32 reg_id_mmfr2; + u32 reg_id_mmfr3; + u32 reg_id_mmfr4; + u32 reg_id_mmfr5; + u32 reg_id_pfr0; + u32 reg_id_pfr1; + u32 reg_id_pfr2; + u32 reg_mvfr0; + u32 reg_mvfr1; + u32 reg_mvfr2; +}; + +struct cpuinfo_arm64 { + struct cpu cpu; + struct kobject kobj; + u64 reg_ctr; + u64 reg_cntfrq; + u64 reg_dczid; + u64 reg_midr; + u64 reg_revidr; + u64 reg_gmid; + u64 reg_id_aa64dfr0; + u64 reg_id_aa64dfr1; + u64 reg_id_aa64isar0; + u64 reg_id_aa64isar1; + u64 reg_id_aa64mmfr0; + u64 reg_id_aa64mmfr1; + u64 reg_id_aa64mmfr2; + u64 reg_id_aa64pfr0; + u64 reg_id_aa64pfr1; + u64 reg_id_aa64zfr0; + struct cpuinfo_32bit aarch32; + u64 reg_zcr; +}; + +struct cpu_operations { + const char *name; + int (*cpu_init)(unsigned int); + int (*cpu_prepare)(unsigned int); + int (*cpu_boot)(unsigned int); + void (*cpu_postboot)(); + bool (*cpu_can_disable)(unsigned int); + int (*cpu_disable)(unsigned int); + void (*cpu_die)(unsigned int); + int (*cpu_kill)(unsigned int); + int (*cpu_init_idle)(unsigned int); + int (*cpu_suspend)(long unsigned int); +}; + +struct sigcontext { + __u64 fault_address; + __u64 regs[31]; + __u64 sp; + __u64 pc; + __u64 pstate; + long: 64; + __u8 __reserved[4096]; +}; + +struct _aarch64_ctx { + __u32 magic; + __u32 size; +}; + +struct fpsimd_context { + struct _aarch64_ctx head; + __u32 fpsr; + __u32 fpcr; + __int128 unsigned vregs[32]; +}; + +struct esr_context { + struct _aarch64_ctx head; + __u64 esr; +}; + +struct extra_context { + struct _aarch64_ctx head; + __u64 datap; + __u32 size; + __u32 __reserved[3]; +}; + +struct sve_context { + struct _aarch64_ctx head; + __u16 vl; + __u16 __reserved[3]; +}; + +struct sigaltstack { + void *ss_sp; + int ss_flags; + size_t ss_size; +}; + +typedef struct sigaltstack stack_t; + +struct siginfo { + union { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; + int _si_pad[32]; + }; +}; + +typedef struct siginfo siginfo_t; + +struct ksignal { + struct k_sigaction ka; + kernel_siginfo_t info; + int sig; +}; + +enum { + EI_ETYPE_NONE = 0, + EI_ETYPE_NULL = 1, + EI_ETYPE_ERRNO = 2, + EI_ETYPE_ERRNO_NULL = 3, + EI_ETYPE_TRUE = 4, +}; + +struct syscall_metadata { + const char *name; + int syscall_nr; + int nb_args; + const char **types; + const char **args; + struct list_head enter_fields; + struct trace_event_call *enter_event; + struct trace_event_call *exit_event; +}; + +struct ucontext { + long unsigned int uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + sigset_t uc_sigmask; + __u8 __unused[120]; + long: 64; + struct sigcontext uc_mcontext; +}; + +struct rt_sigframe { + struct siginfo info; + struct ucontext uc; +}; + +struct frame_record { + u64 fp; + u64 lr; +}; + +struct rt_sigframe_user_layout { + struct rt_sigframe *sigframe; + struct frame_record *next_frame; + long unsigned int size; + long unsigned int limit; + long unsigned int fpsimd_offset; + long unsigned int esr_offset; + long unsigned int sve_offset; + long unsigned int extra_offset; + long unsigned int end_offset; +}; + +struct user_ctxs { + struct fpsimd_context *fpsimd; + struct sve_context *sve; +}; + +enum { + PER_LINUX = 0, + PER_LINUX_32BIT = 8388608, + PER_LINUX_FDPIC = 524288, + PER_SVR4 = 68157441, + PER_SVR3 = 83886082, + PER_SCOSVR3 = 117440515, + PER_OSR5 = 100663299, + PER_WYSEV386 = 83886084, + PER_ISCR4 = 67108869, + PER_BSD = 6, + PER_SUNOS = 67108870, + PER_XENIX = 83886087, + PER_LINUX32 = 8, + PER_LINUX32_3GB = 134217736, + PER_IRIX32 = 67108873, + PER_IRIXN32 = 67108874, + PER_IRIX64 = 67108875, + PER_RISCOS = 12, + PER_SOLARIS = 67108877, + PER_UW7 = 68157454, + PER_OSF4 = 15, + PER_HPUX = 16, + PER_MASK = 255, +}; + +typedef long int (*syscall_fn_t)(const struct pt_regs *); + +typedef bool (*stack_trace_consume_fn)(void *, long unsigned int); + +enum lockdep_ok { + LOCKDEP_STILL_OK = 0, + LOCKDEP_NOW_UNRELIABLE = 1, +}; + +typedef bool pstate_check_t(long unsigned int); + +enum bug_trap_type { + BUG_TRAP_TYPE_NONE = 0, + BUG_TRAP_TYPE_WARN = 1, + BUG_TRAP_TYPE_BUG = 2, +}; + +enum ftr_type { + FTR_EXACT = 0, + FTR_LOWER_SAFE = 1, + FTR_HIGHER_SAFE = 2, + FTR_HIGHER_OR_ZERO_SAFE = 3, +}; + +struct arm64_ftr_bits { + bool sign; + bool visible; + bool strict; + enum ftr_type type; + u8 shift; + u8 width; + s64 safe_val; +}; + +struct arm64_ftr_override { + u64 val; + u64 mask; +}; + +struct arm64_ftr_reg { + const char *name; + u64 strict_mask; + u64 user_mask; + u64 sys_val; + u64 user_val; + struct arm64_ftr_override *override; + const struct arm64_ftr_bits *ftr_bits; +}; + +enum siginfo_layout { + SIL_KILL = 0, + SIL_TIMER = 1, + SIL_POLL = 2, + SIL_FAULT = 3, + SIL_FAULT_TRAPNO = 4, + SIL_FAULT_MCEERR = 5, + SIL_FAULT_BNDERR = 6, + SIL_FAULT_PKUERR = 7, + SIL_FAULT_PERF_EVENT = 8, + SIL_CHLD = 9, + SIL_RT = 10, + SIL_SYS = 11, +}; + +enum die_val { + DIE_UNUSED = 0, + DIE_OOPS = 1, +}; + +struct undef_hook { + struct list_head node; + u32 instr_mask; + u32 instr_val; + u64 pstate_mask; + u64 pstate_val; + int (*fn)(struct pt_regs *, u32); +}; + +struct sys64_hook { + unsigned int esr_mask; + unsigned int esr_val; + void (*handler)(unsigned int, struct pt_regs *); +}; + +struct timens_offset { + s64 sec; + u64 nsec; +}; + +enum vm_fault_reason { + VM_FAULT_OOM = 1, + VM_FAULT_SIGBUS = 2, + VM_FAULT_MAJOR = 4, + VM_FAULT_WRITE = 8, + VM_FAULT_HWPOISON = 16, + VM_FAULT_HWPOISON_LARGE = 32, + VM_FAULT_SIGSEGV = 64, + VM_FAULT_NOPAGE = 256, + VM_FAULT_LOCKED = 512, + VM_FAULT_RETRY = 1024, + VM_FAULT_FALLBACK = 2048, + VM_FAULT_DONE_COW = 4096, + VM_FAULT_NEEDDSYNC = 8192, + VM_FAULT_HINDEX_MASK = 983040, +}; + +struct vm_special_mapping { + const char *name; + struct page **pages; + vm_fault_t (*fault)(const struct vm_special_mapping *, struct vm_area_struct *, struct vm_fault *); + int (*mremap)(const struct vm_special_mapping *, struct vm_area_struct *); +}; + +struct timens_offsets { + struct timespec64 monotonic; + struct timespec64 boottime; +}; + +struct time_namespace { + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; + struct timens_offsets offsets; + struct page *vvar_page; + bool frozen_offsets; +}; + +struct arch_vdso_data {}; + +struct vdso_timestamp { + u64 sec; + u64 nsec; +}; + +struct vdso_data { + u32 seq; + s32 clock_mode; + u64 cycle_last; + u64 mask; + u32 mult; + u32 shift; + union { + struct vdso_timestamp basetime[12]; + struct timens_offset offset[12]; + }; + s32 tz_minuteswest; + s32 tz_dsttime; + u32 hrtimer_res; + u32 __unused; + struct arch_vdso_data arch_data; +}; + +enum vdso_abi { + VDSO_ABI_AA64 = 0, + VDSO_ABI_AA32 = 1, +}; + +enum vvar_pages { + VVAR_DATA_PAGE_OFFSET = 0, + VVAR_TIMENS_PAGE_OFFSET = 1, + VVAR_NR_PAGES = 2, +}; + +struct vdso_abi_info { + const char *name; + const char *vdso_code_start; + const char *vdso_code_end; + long unsigned int vdso_pages; + struct vm_special_mapping *dm; + struct vm_special_mapping *cm; +}; + +enum aarch32_map { + AA32_MAP_VECTORS = 0, + AA32_MAP_SIGPAGE = 1, + AA32_MAP_VVAR = 2, + AA32_MAP_VDSO = 3, +}; + +enum aarch64_map { + AA64_MAP_VVAR = 0, + AA64_MAP_VDSO = 1, +}; + +struct psci_operations { + u32 (*get_version)(); + int (*cpu_suspend)(u32, long unsigned int); + int (*cpu_off)(u32); + int (*cpu_on)(long unsigned int, long unsigned int); + int (*migrate)(long unsigned int); + int (*affinity_info)(long unsigned int, long unsigned int); + int (*migrate_info_type)(); +}; + +struct return_address_data { + unsigned int level; + void *addr; +}; + +struct kobj_attribute { + struct attribute attr; + ssize_t (*show)(struct kobject *, struct kobj_attribute *, char *); + ssize_t (*store)(struct kobject *, struct kobj_attribute *, const char *, size_t); +}; + +typedef int (*cmp_func_t)(const void *, const void *); + +enum aarch64_insn_imm_type { + AARCH64_INSN_IMM_ADR = 0, + AARCH64_INSN_IMM_26 = 1, + AARCH64_INSN_IMM_19 = 2, + AARCH64_INSN_IMM_16 = 3, + AARCH64_INSN_IMM_14 = 4, + AARCH64_INSN_IMM_12 = 5, + AARCH64_INSN_IMM_9 = 6, + AARCH64_INSN_IMM_7 = 7, + AARCH64_INSN_IMM_6 = 8, + AARCH64_INSN_IMM_S = 9, + AARCH64_INSN_IMM_R = 10, + AARCH64_INSN_IMM_N = 11, + AARCH64_INSN_IMM_MAX = 12, +}; + +enum aarch64_insn_register_type { + AARCH64_INSN_REGTYPE_RT = 0, + AARCH64_INSN_REGTYPE_RN = 1, + AARCH64_INSN_REGTYPE_RT2 = 2, + AARCH64_INSN_REGTYPE_RM = 3, + AARCH64_INSN_REGTYPE_RD = 4, + AARCH64_INSN_REGTYPE_RA = 5, + AARCH64_INSN_REGTYPE_RS = 6, +}; + +enum { + CAP_HWCAP = 1, + CAP_COMPAT_HWCAP = 2, + CAP_COMPAT_HWCAP2 = 3, +}; + +struct secondary_data { + struct task_struct *task; + long int status; +}; + +enum mitigation_state { + SPECTRE_UNAFFECTED = 0, + SPECTRE_MITIGATED = 1, + SPECTRE_VULNERABLE = 2, +}; + +enum pageflags { + PG_locked = 0, + PG_referenced = 1, + PG_uptodate = 2, + PG_dirty = 3, + PG_lru = 4, + PG_active = 5, + PG_workingset = 6, + PG_waiters = 7, + PG_error = 8, + PG_slab = 9, + PG_owner_priv_1 = 10, + PG_arch_1 = 11, + PG_reserved = 12, + PG_private = 13, + PG_private_2 = 14, + PG_writeback = 15, + PG_head = 16, + PG_mappedtodisk = 17, + PG_reclaim = 18, + PG_swapbacked = 19, + PG_unevictable = 20, + PG_mlocked = 21, + PG_hwpoison = 22, + PG_young = 23, + PG_idle = 24, + PG_arch_2 = 25, + __NR_PAGEFLAGS = 26, + PG_readahead = 18, + PG_checked = 10, + PG_swapcache = 10, + PG_fscache = 14, + PG_pinned = 10, + PG_savepinned = 3, + PG_foreign = 10, + PG_xen_remapped = 10, + PG_slob_free = 13, + PG_double_map = 6, + PG_has_hwpoisoned = 17, + PG_isolated = 18, + PG_reported = 2, +}; + +struct device_attribute { + struct attribute attr; + ssize_t (*show)(struct device *, struct device_attribute *, char *); + ssize_t (*store)(struct device *, struct device_attribute *, const char *, size_t); +}; + +typedef int (*cpu_stop_fn_t)(void *); + +enum kvm_mode { + KVM_MODE_DEFAULT = 0, + KVM_MODE_PROTECTED = 1, + KVM_MODE_NONE = 2, +}; + +enum vcpu_sysreg { + __INVALID_SYSREG__ = 0, + MPIDR_EL1 = 1, + CSSELR_EL1 = 2, + SCTLR_EL1 = 3, + ACTLR_EL1 = 4, + CPACR_EL1 = 5, + ZCR_EL1 = 6, + TTBR0_EL1 = 7, + TTBR1_EL1 = 8, + TCR_EL1 = 9, + ESR_EL1 = 10, + AFSR0_EL1 = 11, + AFSR1_EL1 = 12, + FAR_EL1 = 13, + MAIR_EL1 = 14, + VBAR_EL1 = 15, + CONTEXTIDR_EL1 = 16, + TPIDR_EL0 = 17, + TPIDRRO_EL0 = 18, + TPIDR_EL1 = 19, + AMAIR_EL1 = 20, + CNTKCTL_EL1 = 21, + PAR_EL1 = 22, + MDSCR_EL1 = 23, + MDCCINT_EL1 = 24, + DISR_EL1 = 25, + PMCR_EL0 = 26, + PMSELR_EL0 = 27, + PMEVCNTR0_EL0 = 28, + PMEVCNTR30_EL0 = 58, + PMCCNTR_EL0 = 59, + PMEVTYPER0_EL0 = 60, + PMEVTYPER30_EL0 = 90, + PMCCFILTR_EL0 = 91, + PMCNTENSET_EL0 = 92, + PMINTENSET_EL1 = 93, + PMOVSSET_EL0 = 94, + PMUSERENR_EL0 = 95, + APIAKEYLO_EL1 = 96, + APIAKEYHI_EL1 = 97, + APIBKEYLO_EL1 = 98, + APIBKEYHI_EL1 = 99, + APDAKEYLO_EL1 = 100, + APDAKEYHI_EL1 = 101, + APDBKEYLO_EL1 = 102, + APDBKEYHI_EL1 = 103, + APGAKEYLO_EL1 = 104, + APGAKEYHI_EL1 = 105, + ELR_EL1 = 106, + SP_EL1 = 107, + SPSR_EL1 = 108, + CNTVOFF_EL2 = 109, + CNTV_CVAL_EL0 = 110, + CNTV_CTL_EL0 = 111, + CNTP_CVAL_EL0 = 112, + CNTP_CTL_EL0 = 113, + RGSR_EL1 = 114, + GCR_EL1 = 115, + TFSR_EL1 = 116, + TFSRE0_EL1 = 117, + DACR32_EL2 = 118, + IFSR32_EL2 = 119, + FPEXC32_EL2 = 120, + DBGVCR32_EL2 = 121, + NR_SYS_REGS = 122, +}; + +struct __ftr_reg_entry { + u32 sys_id; + struct arm64_ftr_reg *reg; +}; + +typedef void kpti_remap_fn(int, int, phys_addr_t); + +typedef void ttbr_replace_func(phys_addr_t); + +struct alt_instr { + s32 orig_offset; + s32 alt_offset; + u16 cpufeature; + u8 orig_len; + u8 alt_len; +}; + +typedef void (*alternative_cb_t)(struct alt_instr *, __le32 *, __le32 *, int); + +struct alt_region { + struct alt_instr *begin; + struct alt_instr *end; +}; + +enum cache_type { + CACHE_TYPE_NOCACHE = 0, + CACHE_TYPE_INST = 1, + CACHE_TYPE_DATA = 2, + CACHE_TYPE_SEPARATE = 3, + CACHE_TYPE_UNIFIED = 4, +}; + +struct cacheinfo { + unsigned int id; + enum cache_type type; + unsigned int level; + unsigned int coherency_line_size; + unsigned int number_of_sets; + unsigned int ways_of_associativity; + unsigned int physical_line_partition; + unsigned int size; + cpumask_t shared_cpu_map; + unsigned int attributes; + void *fw_token; + bool disable_sysfs; + void *priv; +}; + +struct cpu_cacheinfo { + struct cacheinfo *info_list; + unsigned int num_levels; + unsigned int num_leaves; + bool cpu_map_populated; +}; + +struct acpi_subtable_header { + u8 type; + u8 length; +}; + +struct acpi_hmat_structure { + u16 type; + u16 reserved; + u32 length; +}; + +enum acpi_madt_type { + ACPI_MADT_TYPE_LOCAL_APIC = 0, + ACPI_MADT_TYPE_IO_APIC = 1, + ACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2, + ACPI_MADT_TYPE_NMI_SOURCE = 3, + ACPI_MADT_TYPE_LOCAL_APIC_NMI = 4, + ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5, + ACPI_MADT_TYPE_IO_SAPIC = 6, + ACPI_MADT_TYPE_LOCAL_SAPIC = 7, + ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8, + ACPI_MADT_TYPE_LOCAL_X2APIC = 9, + ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10, + ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11, + ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12, + ACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13, + ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14, + ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15, + ACPI_MADT_TYPE_MULTIPROC_WAKEUP = 16, + ACPI_MADT_TYPE_RESERVED = 17, +}; + +struct acpi_madt_generic_interrupt { + struct acpi_subtable_header header; + u16 reserved; + u32 cpu_interface_number; + u32 uid; + u32 flags; + u32 parking_version; + u32 performance_interrupt; + u64 parked_address; + u64 base_address; + u64 gicv_base_address; + u64 gich_base_address; + u32 vgic_interrupt; + u64 gicr_base_address; + u64 arm_mpidr; + u8 efficiency_class; + u8 reserved2[1]; + u16 spe_interrupt; +} __attribute__((packed)); + +struct acpi_prmt_module_header { + u16 revision; + u16 length; +}; + +enum { + IRQ_TYPE_NONE = 0, + IRQ_TYPE_EDGE_RISING = 1, + IRQ_TYPE_EDGE_FALLING = 2, + IRQ_TYPE_EDGE_BOTH = 3, + IRQ_TYPE_LEVEL_HIGH = 4, + IRQ_TYPE_LEVEL_LOW = 8, + IRQ_TYPE_LEVEL_MASK = 12, + IRQ_TYPE_SENSE_MASK = 15, + IRQ_TYPE_DEFAULT = 15, + IRQ_TYPE_PROBE = 16, + IRQ_LEVEL = 256, + IRQ_PER_CPU = 512, + IRQ_NOPROBE = 1024, + IRQ_NOREQUEST = 2048, + IRQ_NOAUTOEN = 4096, + IRQ_NO_BALANCING = 8192, + IRQ_MOVE_PCNTXT = 16384, + IRQ_NESTED_THREAD = 32768, + IRQ_NOTHREAD = 65536, + IRQ_PER_CPU_DEVID = 131072, + IRQ_IS_POLLED = 262144, + IRQ_DISABLE_UNLAZY = 524288, + IRQ_HIDDEN = 1048576, + IRQ_NO_DEBUG = 2097152, +}; + +struct arch_msi_msg_addr_lo { + u32 address_lo; +}; + +typedef struct arch_msi_msg_addr_lo arch_msi_msg_addr_lo_t; + +struct arch_msi_msg_addr_hi { + u32 address_hi; +}; + +typedef struct arch_msi_msg_addr_hi arch_msi_msg_addr_hi_t; + +struct arch_msi_msg_data { + u32 data; +}; + +typedef struct arch_msi_msg_data arch_msi_msg_data_t; + +struct msi_msg { + union { + u32 address_lo; + arch_msi_msg_addr_lo_t arch_addr_lo; + }; + union { + u32 address_hi; + arch_msi_msg_addr_hi_t arch_addr_hi; + }; + union { + u32 data; + arch_msi_msg_data_t arch_data; + }; +}; + +struct platform_msi_priv_data; + +struct platform_msi_desc { + struct platform_msi_priv_data *msi_priv_data; + u16 msi_index; +}; + +struct fsl_mc_msi_desc { + u16 msi_index; +}; + +struct ti_sci_inta_msi_desc { + u16 dev_index; +}; + +struct irq_affinity_desc; + +struct msi_desc { + struct list_head list; + unsigned int irq; + unsigned int nvec_used; + struct device *dev; + struct msi_msg msg; + struct irq_affinity_desc *affinity; + const void *iommu_cookie; + void (*write_msi_msg)(struct msi_desc *, void *); + void *write_msi_msg_data; + union { + struct { + union { + u32 msi_mask; + u32 msix_ctrl; + }; + struct { + u8 is_msix: 1; + u8 multiple: 3; + u8 multi_cap: 3; + u8 can_mask: 1; + u8 is_64: 1; + u8 is_virtual: 1; + u16 entry_nr; + unsigned int default_irq; + } msi_attrib; + union { + u8 mask_pos; + void *mask_base; + }; + }; + struct platform_msi_desc platform; + struct fsl_mc_msi_desc fsl_mc; + struct ti_sci_inta_msi_desc inta; + }; +}; + +struct irq_affinity_desc { + struct cpumask mask; + unsigned int is_managed: 1; +}; + +union acpi_subtable_headers { + struct acpi_subtable_header common; + struct acpi_hmat_structure hmat; + struct acpi_prmt_module_header prmt; +}; + +typedef int (*acpi_tbl_entry_handler)(union acpi_subtable_headers *, const long unsigned int); + +enum kvm_bus { + KVM_MMIO_BUS = 0, + KVM_PIO_BUS = 1, + KVM_VIRTIO_CCW_NOTIFY_BUS = 2, + KVM_FAST_MMIO_BUS = 3, + KVM_NR_BUSES = 4, +}; + +struct trace_event_raw_ipi_raise { + struct trace_entry ent; + u32 __data_loc_target_cpus; + const char *reason; + char __data[0]; +}; + +struct trace_event_raw_ipi_handler { + struct trace_entry ent; + const char *reason; + char __data[0]; +}; + +struct trace_event_data_offsets_ipi_raise { + u32 target_cpus; +}; + +struct trace_event_data_offsets_ipi_handler {}; + +typedef void (*btf_trace_ipi_raise)(void *, const struct cpumask *, const char *); + +typedef void (*btf_trace_ipi_entry)(void *, const char *); + +typedef void (*btf_trace_ipi_exit)(void *, const char *); + +enum ipi_msg_type { + IPI_RESCHEDULE = 0, + IPI_CALL_FUNC = 1, + IPI_CPU_STOP = 2, + IPI_CPU_CRASH_STOP = 3, + IPI_TIMER = 4, + IPI_IRQ_WORK = 5, + IPI_WAKEUP = 6, + NR_IPI = 7, +}; + +typedef __u64 __le64; + +typedef void (*smp_call_func_t)(void *); + +enum scale_freq_source { + SCALE_FREQ_SOURCE_CPUFREQ = 0, + SCALE_FREQ_SOURCE_ARCH = 1, + SCALE_FREQ_SOURCE_CPPC = 2, +}; + +struct scale_freq_data { + enum scale_freq_source source; + void (*set_freq_scale)(); +}; + +struct cpu_topology { + int thread_id; + int core_id; + int cluster_id; + int package_id; + int llc_id; + cpumask_t thread_sibling; + cpumask_t core_sibling; + cpumask_t cluster_sibling; + cpumask_t llc_sibling; +}; + +enum cpufreq_table_sorting { + CPUFREQ_TABLE_UNSORTED = 0, + CPUFREQ_TABLE_SORTED_ASCENDING = 1, + CPUFREQ_TABLE_SORTED_DESCENDING = 2, +}; + +struct cpufreq_cpuinfo { + unsigned int max_freq; + unsigned int min_freq; + unsigned int transition_latency; +}; + +struct clk; + +struct cpufreq_governor; + +struct cpufreq_frequency_table; + +struct cpufreq_stats; + +struct thermal_cooling_device; + +struct cpufreq_policy { + cpumask_var_t cpus; + cpumask_var_t related_cpus; + cpumask_var_t real_cpus; + unsigned int shared_type; + unsigned int cpu; + struct clk *clk; + struct cpufreq_cpuinfo cpuinfo; + unsigned int min; + unsigned int max; + unsigned int cur; + unsigned int suspend_freq; + unsigned int policy; + unsigned int last_policy; + struct cpufreq_governor *governor; + void *governor_data; + char last_governor[16]; + struct work_struct update; + struct freq_constraints constraints; + struct freq_qos_request *min_freq_req; + struct freq_qos_request *max_freq_req; + struct cpufreq_frequency_table *freq_table; + enum cpufreq_table_sorting freq_table_sorted; + struct list_head policy_list; + struct kobject kobj; + struct completion kobj_unregister; + struct rw_semaphore rwsem; + bool fast_switch_possible; + bool fast_switch_enabled; + bool strict_target; + bool efficiencies_available; + unsigned int transition_delay_us; + bool dvfs_possible_from_any_cpu; + unsigned int cached_target_freq; + unsigned int cached_resolved_idx; + bool transition_ongoing; + spinlock_t transition_lock; + wait_queue_head_t transition_wait; + struct task_struct *transition_task; + struct cpufreq_stats *stats; + void *driver_data; + struct thermal_cooling_device *cdev; + struct notifier_block nb_min; + struct notifier_block nb_max; +}; + +struct cpufreq_governor { + char name[16]; + int (*init)(struct cpufreq_policy *); + void (*exit)(struct cpufreq_policy *); + int (*start)(struct cpufreq_policy *); + void (*stop)(struct cpufreq_policy *); + void (*limits)(struct cpufreq_policy *); + ssize_t (*show_setspeed)(struct cpufreq_policy *, char *); + int (*store_setspeed)(struct cpufreq_policy *, unsigned int); + struct list_head governor_list; + struct module *owner; + u8 flags; +}; + +struct cpufreq_frequency_table { + unsigned int flags; + unsigned int driver_data; + unsigned int frequency; +}; + +struct thermal_cooling_device_ops; + +struct thermal_cooling_device { + int id; + char *type; + struct device device; + struct device_node *np; + void *devdata; + void *stats; + const struct thermal_cooling_device_ops *ops; + bool updated; + struct mutex lock; + struct list_head thermal_instances; + struct list_head node; +}; + +struct thermal_cooling_device_ops { + int (*get_max_state)(struct thermal_cooling_device *, long unsigned int *); + int (*get_cur_state)(struct thermal_cooling_device *, long unsigned int *); + int (*set_cur_state)(struct thermal_cooling_device *, long unsigned int); + int (*get_requested_power)(struct thermal_cooling_device *, u32 *); + int (*state2power)(struct thermal_cooling_device *, long unsigned int, u32 *); + int (*power2state)(struct thermal_cooling_device *, u32, long unsigned int *); +}; + +struct cpc_reg { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_width; + u64 address; +} __attribute__((packed)); + +enum arm_smccc_conduit { + SMCCC_CONDUIT_NONE = 0, + SMCCC_CONDUIT_SMC = 1, + SMCCC_CONDUIT_HVC = 2, +}; + +struct arm_smccc_res { + long unsigned int a0; + long unsigned int a1; + long unsigned int a2; + long unsigned int a3; +}; + +enum spectre_v4_policy { + SPECTRE_V4_POLICY_MITIGATION_DYNAMIC = 0, + SPECTRE_V4_POLICY_MITIGATION_ENABLED = 1, + SPECTRE_V4_POLICY_MITIGATION_DISABLED = 2, +}; + +struct spectre_v4_param { + const char *str; + enum spectre_v4_policy policy; +}; + +struct ftr_set_desc { + char name[20]; + struct arm64_ftr_override *override; + struct { + char name[10]; + u8 shift; + bool (*filter)(u64); + } fields[0]; +}; + +struct arm_cpuidle_irq_context { + long unsigned int pmr; + long unsigned int daif_bits; +}; + +enum fixed_addresses { + FIX_HOLE = 0, + FIX_FDT_END = 1, + FIX_FDT = 1024, + FIX_EARLYCON_MEM_BASE = 1025, + FIX_TEXT_POKE0 = 1026, + FIX_APEI_GHES_IRQ = 1027, + FIX_APEI_GHES_SEA = 1028, + FIX_APEI_GHES_SDEI_NORMAL = 1029, + FIX_APEI_GHES_SDEI_CRITICAL = 1030, + FIX_ENTRY_TRAMP_DATA = 1031, + FIX_ENTRY_TRAMP_TEXT = 1032, + __end_of_permanent_fixed_addresses = 1033, + FIX_BTMAP_END = 1033, + FIX_BTMAP_BEGIN = 1480, + FIX_PTE = 1481, + FIX_PMD = 1482, + FIX_PUD = 1483, + FIX_PGD = 1484, + __end_of_fixed_addresses = 1485, +}; + +struct aarch64_insn_patch { + void **text_addrs; + u32 *new_insns; + int insn_cnt; + atomic_t cpu_count; +}; + +typedef u32 compat_size_t; + +struct compat_statfs64; + +typedef s32 compat_clock_t; + +typedef s32 compat_pid_t; + +typedef s32 compat_timer_t; + +typedef s32 compat_int_t; + +typedef u32 __compat_uid32_t; + +typedef u64 compat_u64; + +typedef u32 compat_sigset_word; + +struct compat_sigaltstack { + compat_uptr_t ss_sp; + int ss_flags; + compat_size_t ss_size; +}; + +typedef struct compat_sigaltstack compat_stack_t; + +typedef struct { + compat_sigset_word sig[2]; +} compat_sigset_t; + +union compat_sigval { + compat_int_t sival_int; + compat_uptr_t sival_ptr; +}; + +typedef union compat_sigval compat_sigval_t; + +struct compat_siginfo { + int si_signo; + int si_errno; + int si_code; + union { + int _pad[29]; + struct { + compat_pid_t _pid; + __compat_uid32_t _uid; + } _kill; + struct { + compat_timer_t _tid; + int _overrun; + compat_sigval_t _sigval; + } _timer; + struct { + compat_pid_t _pid; + __compat_uid32_t _uid; + compat_sigval_t _sigval; + } _rt; + struct { + compat_pid_t _pid; + __compat_uid32_t _uid; + int _status; + compat_clock_t _utime; + compat_clock_t _stime; + } _sigchld; + struct { + compat_uptr_t _addr; + union { + int _trapno; + short int _addr_lsb; + struct { + char _dummy_bnd[4]; + compat_uptr_t _lower; + compat_uptr_t _upper; + } _addr_bnd; + struct { + char _dummy_pkey[4]; + u32 _pkey; + } _addr_pkey; + struct { + compat_ulong_t _data; + u32 _type; + } _perf; + }; + } _sigfault; + struct { + compat_long_t _band; + int _fd; + } _sigpoll; + struct { + compat_uptr_t _call_addr; + int _syscall; + unsigned int _arch; + } _sigsys; + } _sifields; +}; + +struct compat_sigcontext { + compat_ulong_t trap_no; + compat_ulong_t error_code; + compat_ulong_t oldmask; + compat_ulong_t arm_r0; + compat_ulong_t arm_r1; + compat_ulong_t arm_r2; + compat_ulong_t arm_r3; + compat_ulong_t arm_r4; + compat_ulong_t arm_r5; + compat_ulong_t arm_r6; + compat_ulong_t arm_r7; + compat_ulong_t arm_r8; + compat_ulong_t arm_r9; + compat_ulong_t arm_r10; + compat_ulong_t arm_fp; + compat_ulong_t arm_ip; + compat_ulong_t arm_sp; + compat_ulong_t arm_lr; + compat_ulong_t arm_pc; + compat_ulong_t arm_cpsr; + compat_ulong_t fault_address; +}; + +struct compat_ucontext { + compat_ulong_t uc_flags; + compat_uptr_t uc_link; + compat_stack_t uc_stack; + struct compat_sigcontext uc_mcontext; + compat_sigset_t uc_sigmask; + int __unused[30]; + compat_ulong_t uc_regspace[128]; +}; + +struct compat_sigframe { + struct compat_ucontext uc; + compat_ulong_t retcode[2]; +}; + +struct compat_rt_sigframe { + struct compat_siginfo info; + struct compat_sigframe sig; +}; + +struct compat_user_vfp { + compat_u64 fpregs[32]; + compat_ulong_t fpscr; +}; + +struct compat_user_vfp_exc { + compat_ulong_t fpexc; + compat_ulong_t fpinst; + compat_ulong_t fpinst2; +}; + +struct compat_vfp_sigframe { + compat_ulong_t magic; + compat_ulong_t size; + struct compat_user_vfp ufp; + struct compat_user_vfp_exc ufp_exc; +}; + +struct compat_aux_sigframe { + struct compat_vfp_sigframe vfp; + long unsigned int end_magic; +}; + +union __fpsimd_vreg { + __int128 unsigned raw; + struct { + u64 lo; + u64 hi; + }; +}; + +enum aarch64_insn_register { + AARCH64_INSN_REG_0 = 0, + AARCH64_INSN_REG_1 = 1, + AARCH64_INSN_REG_2 = 2, + AARCH64_INSN_REG_3 = 3, + AARCH64_INSN_REG_4 = 4, + AARCH64_INSN_REG_5 = 5, + AARCH64_INSN_REG_6 = 6, + AARCH64_INSN_REG_7 = 7, + AARCH64_INSN_REG_8 = 8, + AARCH64_INSN_REG_9 = 9, + AARCH64_INSN_REG_10 = 10, + AARCH64_INSN_REG_11 = 11, + AARCH64_INSN_REG_12 = 12, + AARCH64_INSN_REG_13 = 13, + AARCH64_INSN_REG_14 = 14, + AARCH64_INSN_REG_15 = 15, + AARCH64_INSN_REG_16 = 16, + AARCH64_INSN_REG_17 = 17, + AARCH64_INSN_REG_18 = 18, + AARCH64_INSN_REG_19 = 19, + AARCH64_INSN_REG_20 = 20, + AARCH64_INSN_REG_21 = 21, + AARCH64_INSN_REG_22 = 22, + AARCH64_INSN_REG_23 = 23, + AARCH64_INSN_REG_24 = 24, + AARCH64_INSN_REG_25 = 25, + AARCH64_INSN_REG_26 = 26, + AARCH64_INSN_REG_27 = 27, + AARCH64_INSN_REG_28 = 28, + AARCH64_INSN_REG_29 = 29, + AARCH64_INSN_REG_FP = 29, + AARCH64_INSN_REG_30 = 30, + AARCH64_INSN_REG_LR = 30, + AARCH64_INSN_REG_ZR = 31, + AARCH64_INSN_REG_SP = 31, +}; + +enum aarch64_insn_variant { + AARCH64_INSN_VARIANT_32BIT = 0, + AARCH64_INSN_VARIANT_64BIT = 1, +}; + +enum aarch64_insn_branch_type { + AARCH64_INSN_BRANCH_NOLINK = 0, + AARCH64_INSN_BRANCH_LINK = 1, + AARCH64_INSN_BRANCH_RETURN = 2, + AARCH64_INSN_BRANCH_COMP_ZERO = 3, + AARCH64_INSN_BRANCH_COMP_NONZERO = 4, +}; + +struct dyn_arch_ftrace {}; + +struct dyn_ftrace { + long unsigned int ip; + long unsigned int flags; + struct dyn_arch_ftrace arch; +}; + +enum { + FTRACE_UPDATE_CALLS = 1, + FTRACE_DISABLE_CALLS = 2, + FTRACE_UPDATE_TRACE_FUNC = 4, + FTRACE_START_FUNC_RET = 8, + FTRACE_STOP_FUNC_RET = 16, + FTRACE_MAY_SLEEP = 32, +}; + +typedef __u64 Elf64_Off; + +typedef __s64 Elf64_Sxword; + +struct elf64_rela { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +}; + +typedef struct elf64_rela Elf64_Rela; + +struct elf64_hdr { + unsigned char e_ident[16]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +}; + +typedef struct elf64_hdr Elf64_Ehdr; + +struct elf64_shdr { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +}; + +typedef struct elf64_shdr Elf64_Shdr; + +enum aarch64_reloc_op { + RELOC_OP_NONE = 0, + RELOC_OP_ABS = 1, + RELOC_OP_PREL = 2, + RELOC_OP_PAGE = 3, +}; + +enum aarch64_insn_movw_imm_type { + AARCH64_INSN_IMM_MOVNZ = 0, + AARCH64_INSN_IMM_MOVKZ = 1, +}; + +typedef void (*swap_func_t)(void *, void *, int); + +enum aarch64_insn_adsb_type { + AARCH64_INSN_ADSB_ADD = 0, + AARCH64_INSN_ADSB_SUB = 1, + AARCH64_INSN_ADSB_ADD_SETFLAGS = 2, + AARCH64_INSN_ADSB_SUB_SETFLAGS = 3, +}; + +enum aarch64_insn_adr_type { + AARCH64_INSN_ADR_TYPE_ADRP = 0, + AARCH64_INSN_ADR_TYPE_ADR = 1, +}; + +enum perf_sample_regs_abi { + PERF_SAMPLE_REGS_ABI_NONE = 0, + PERF_SAMPLE_REGS_ABI_32 = 1, + PERF_SAMPLE_REGS_ABI_64 = 2, +}; + +enum perf_event_arm_regs { + PERF_REG_ARM64_X0 = 0, + PERF_REG_ARM64_X1 = 1, + PERF_REG_ARM64_X2 = 2, + PERF_REG_ARM64_X3 = 3, + PERF_REG_ARM64_X4 = 4, + PERF_REG_ARM64_X5 = 5, + PERF_REG_ARM64_X6 = 6, + PERF_REG_ARM64_X7 = 7, + PERF_REG_ARM64_X8 = 8, + PERF_REG_ARM64_X9 = 9, + PERF_REG_ARM64_X10 = 10, + PERF_REG_ARM64_X11 = 11, + PERF_REG_ARM64_X12 = 12, + PERF_REG_ARM64_X13 = 13, + PERF_REG_ARM64_X14 = 14, + PERF_REG_ARM64_X15 = 15, + PERF_REG_ARM64_X16 = 16, + PERF_REG_ARM64_X17 = 17, + PERF_REG_ARM64_X18 = 18, + PERF_REG_ARM64_X19 = 19, + PERF_REG_ARM64_X20 = 20, + PERF_REG_ARM64_X21 = 21, + PERF_REG_ARM64_X22 = 22, + PERF_REG_ARM64_X23 = 23, + PERF_REG_ARM64_X24 = 24, + PERF_REG_ARM64_X25 = 25, + PERF_REG_ARM64_X26 = 26, + PERF_REG_ARM64_X27 = 27, + PERF_REG_ARM64_X28 = 28, + PERF_REG_ARM64_X29 = 29, + PERF_REG_ARM64_LR = 30, + PERF_REG_ARM64_SP = 31, + PERF_REG_ARM64_PC = 32, + PERF_REG_ARM64_MAX = 33, +}; + +struct perf_guest_info_callbacks { + int (*is_in_guest)(); + int (*is_user_mode)(); + long unsigned int (*get_guest_ip)(); + void (*handle_intel_pt_intr)(); +}; + +struct perf_callchain_entry_ctx { + struct perf_callchain_entry *entry; + u32 max_stack; + u32 nr; + short int contexts; + bool contexts_maxed; +}; + +struct frame_tail { + struct frame_tail *fp; + long unsigned int lr; +}; + +struct compat_frame_tail { + compat_uptr_t fp; + u32 sp; + u32 lr; +}; + +struct platform_device_id { + char name[20]; + kernel_ulong_t driver_data; +}; + +struct pdev_archdata {}; + +enum perf_hw_id { + PERF_COUNT_HW_CPU_CYCLES = 0, + PERF_COUNT_HW_INSTRUCTIONS = 1, + PERF_COUNT_HW_CACHE_REFERENCES = 2, + PERF_COUNT_HW_CACHE_MISSES = 3, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, + PERF_COUNT_HW_BRANCH_MISSES = 5, + PERF_COUNT_HW_BUS_CYCLES = 6, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, + PERF_COUNT_HW_REF_CPU_CYCLES = 9, + PERF_COUNT_HW_MAX = 10, +}; + +enum perf_hw_cache_id { + PERF_COUNT_HW_CACHE_L1D = 0, + PERF_COUNT_HW_CACHE_L1I = 1, + PERF_COUNT_HW_CACHE_LL = 2, + PERF_COUNT_HW_CACHE_DTLB = 3, + PERF_COUNT_HW_CACHE_ITLB = 4, + PERF_COUNT_HW_CACHE_BPU = 5, + PERF_COUNT_HW_CACHE_NODE = 6, + PERF_COUNT_HW_CACHE_MAX = 7, +}; + +enum perf_hw_cache_op_id { + PERF_COUNT_HW_CACHE_OP_READ = 0, + PERF_COUNT_HW_CACHE_OP_WRITE = 1, + PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, + PERF_COUNT_HW_CACHE_OP_MAX = 3, +}; + +enum perf_hw_cache_op_result_id { + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, + PERF_COUNT_HW_CACHE_RESULT_MISS = 1, + PERF_COUNT_HW_CACHE_RESULT_MAX = 2, +}; + +struct perf_event_mmap_page { + __u32 version; + __u32 compat_version; + __u32 lock; + __u32 index; + __s64 offset; + __u64 time_enabled; + __u64 time_running; + union { + __u64 capabilities; + struct { + __u64 cap_bit0: 1; + __u64 cap_bit0_is_deprecated: 1; + __u64 cap_user_rdpmc: 1; + __u64 cap_user_time: 1; + __u64 cap_user_time_zero: 1; + __u64 cap_user_time_short: 1; + __u64 cap_____res: 58; + }; + }; + __u16 pmc_width; + __u16 time_shift; + __u32 time_mult; + __u64 time_offset; + __u64 time_zero; + __u32 size; + __u32 __reserved_1; + __u64 time_cycles; + __u64 time_mask; + __u8 __reserved[928]; + __u64 data_head; + __u64 data_tail; + __u64 data_offset; + __u64 data_size; + __u64 aux_head; + __u64 aux_tail; + __u64 aux_offset; + __u64 aux_size; +}; + +struct perf_pmu_events_attr { + struct device_attribute attr; + u64 id; + const char *event_str; +}; + +struct mfd_cell; + +struct platform_device { + const char *name; + int id; + bool id_auto; + struct device dev; + u64 platform_dma_mask; + struct device_dma_parameters dma_parms; + u32 num_resources; + struct resource *resource; + const struct platform_device_id *id_entry; + char *driver_override; + struct mfd_cell *mfd_cell; + struct pdev_archdata archdata; +}; + +struct platform_driver { + int (*probe)(struct platform_device *); + int (*remove)(struct platform_device *); + void (*shutdown)(struct platform_device *); + int (*suspend)(struct platform_device *, pm_message_t); + int (*resume)(struct platform_device *); + struct device_driver driver; + const struct platform_device_id *id_table; + bool prevent_deferred_probe; +}; + +struct arm_pmu; + +struct pmu_hw_events { + struct perf_event *events[32]; + long unsigned int used_mask[1]; + raw_spinlock_t pmu_lock; + struct arm_pmu *percpu_pmu; + int irq; +}; + +struct arm_pmu { + struct pmu pmu; + cpumask_t supported_cpus; + char *name; + int pmuver; + irqreturn_t (*handle_irq)(struct arm_pmu *); + void (*enable)(struct perf_event *); + void (*disable)(struct perf_event *); + int (*get_event_idx)(struct pmu_hw_events *, struct perf_event *); + void (*clear_event_idx)(struct pmu_hw_events *, struct perf_event *); + int (*set_event_filter)(struct hw_perf_event *, struct perf_event_attr *); + u64 (*read_counter)(struct perf_event *); + void (*write_counter)(struct perf_event *, u64); + void (*start)(struct arm_pmu *); + void (*stop)(struct arm_pmu *); + void (*reset)(void *); + int (*map_event)(struct perf_event *); + int (*filter_match)(struct perf_event *); + int num_events; + bool secure_access; + long unsigned int pmceid_bitmap[1]; + long unsigned int pmceid_ext_bitmap[1]; + struct platform_device *plat_device; + struct pmu_hw_events *hw_events; + struct hlist_node node; + struct notifier_block cpu_pm_nb; + const struct attribute_group *attr_groups[5]; + u64 reg_pmmir; + long unsigned int acpi_cpuid; +}; + +enum armpmu_attr_groups { + ARMPMU_ATTR_GROUP_COMMON = 0, + ARMPMU_ATTR_GROUP_EVENTS = 1, + ARMPMU_ATTR_GROUP_FORMATS = 2, + ARMPMU_ATTR_GROUP_CAPS = 3, + ARMPMU_NR_ATTR_GROUPS = 4, +}; + +typedef int (*armpmu_init_fn)(struct arm_pmu *); + +struct pmu_probe_info { + unsigned int cpuid; + unsigned int mask; + armpmu_init_fn init; +}; + +struct clock_read_data { + u64 epoch_ns; + u64 epoch_cyc; + u64 sched_clock_mask; + u64 (*read_sched_clock)(); + u32 mult; + u32 shift; +}; + +struct armv8pmu_probe_info { + struct arm_pmu *pmu; + bool present; +}; + +enum hw_breakpoint_ops { + HW_BREAKPOINT_INSTALL = 0, + HW_BREAKPOINT_UNINSTALL = 1, + HW_BREAKPOINT_RESTORE = 2, +}; + +struct cpu_suspend_ctx { + u64 ctx_regs[13]; + u64 sp; +}; + +struct sleep_stack_data { + struct cpu_suspend_ctx system_regs; + long unsigned int callee_saved_regs[12]; +}; + +typedef void *acpi_handle; + +typedef u64 phys_cpuid_t; + +struct acpi_processor_cx { + u8 valid; + u8 type; + u32 address; + u8 entry_method; + u8 index; + u32 latency; + u8 bm_sts_skip; + char desc[32]; +}; + +struct acpi_lpi_state { + u32 min_residency; + u32 wake_latency; + u32 flags; + u32 arch_flags; + u32 res_cnt_freq; + u32 enable_parent_state; + u64 address; + u8 index; + u8 entry_method; + char desc[32]; +}; + +struct acpi_processor_power { + int count; + union { + struct acpi_processor_cx states[8]; + struct acpi_lpi_state lpi_states[8]; + }; + int timer_broadcast_on_state; +}; + +struct acpi_psd_package { + u64 num_entries; + u64 revision; + u64 domain; + u64 coord_type; + u64 num_processors; +}; + +struct acpi_pct_register { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 reserved; + u64 address; +} __attribute__((packed)); + +struct acpi_processor_px { + u64 core_frequency; + u64 power; + u64 transition_latency; + u64 bus_master_latency; + u64 control; + u64 status; +}; + +struct acpi_processor_performance { + unsigned int state; + unsigned int platform_limit; + struct acpi_pct_register control_register; + struct acpi_pct_register status_register; + short: 16; + unsigned int state_count; + int: 32; + struct acpi_processor_px *states; + struct acpi_psd_package domain_info; + cpumask_var_t shared_cpu_map; + unsigned int shared_type; + int: 32; +} __attribute__((packed)); + +struct acpi_tsd_package { + u64 num_entries; + u64 revision; + u64 domain; + u64 coord_type; + u64 num_processors; +}; + +struct acpi_processor_tx_tss { + u64 freqpercentage; + u64 power; + u64 transition_latency; + u64 control; + u64 status; +}; + +struct acpi_processor_tx { + u16 power; + u16 performance; +}; + +struct acpi_processor; + +struct acpi_processor_throttling { + unsigned int state; + unsigned int platform_limit; + struct acpi_pct_register control_register; + struct acpi_pct_register status_register; + short: 16; + unsigned int state_count; + int: 32; + struct acpi_processor_tx_tss *states_tss; + struct acpi_tsd_package domain_info; + cpumask_var_t shared_cpu_map; + int (*acpi_processor_get_throttling)(struct acpi_processor *); + int (*acpi_processor_set_throttling)(struct acpi_processor *, int, bool); + u32 address; + u8 duty_offset; + u8 duty_width; + u8 tsd_valid_flag; + char: 8; + unsigned int shared_type; + struct acpi_processor_tx states[16]; + int: 32; +} __attribute__((packed)); + +struct acpi_processor_flags { + u8 power: 1; + u8 performance: 1; + u8 throttling: 1; + u8 limit: 1; + u8 bm_control: 1; + u8 bm_check: 1; + u8 has_cst: 1; + u8 has_lpi: 1; + u8 power_setup_done: 1; + u8 bm_rld_set: 1; + u8 need_hotplug_init: 1; +}; + +struct acpi_processor_lx { + int px; + int tx; +}; + +struct acpi_processor_limit { + struct acpi_processor_lx state; + struct acpi_processor_lx thermal; + struct acpi_processor_lx user; +}; + +struct acpi_processor { + acpi_handle handle; + u32 acpi_id; + phys_cpuid_t phys_id; + u32 id; + u32 pblk; + int performance_platform_limit; + int throttling_platform_limit; + struct acpi_processor_flags flags; + struct acpi_processor_power power; + struct acpi_processor_performance *performance; + struct acpi_processor_throttling throttling; + struct acpi_processor_limit limit; + struct thermal_cooling_device *cdev; + struct device *dev; + struct freq_qos_request perflib_req; + struct freq_qos_request thermal_req; +}; + +enum jump_label_type { + JUMP_LABEL_NOP = 0, + JUMP_LABEL_JMP = 1, +}; + +struct die_args { + struct pt_regs *regs; + const char *str; + long int err; + int trapnr; + int signr; +}; + +enum kgdb_bptype { + BP_BREAKPOINT = 0, + BP_HARDWARE_BREAKPOINT = 1, + BP_WRITE_WATCHPOINT = 2, + BP_READ_WATCHPOINT = 3, + BP_ACCESS_WATCHPOINT = 4, + BP_POKE_BREAKPOINT = 5, +}; + +enum kgdb_bpstate { + BP_UNDEFINED = 0, + BP_REMOVED = 1, + BP_SET = 2, + BP_ACTIVE = 3, +}; + +struct kgdb_bkpt { + long unsigned int bpt_addr; + unsigned char saved_instr[4]; + enum kgdb_bptype type; + enum kgdb_bpstate state; +}; + +struct dbg_reg_def_t { + char *name; + int size; + int offset; +}; + +struct kgdb_arch { + unsigned char gdb_bpt_instr[4]; + long unsigned int flags; + int (*set_breakpoint)(long unsigned int, char *); + int (*remove_breakpoint)(long unsigned int, char *); + int (*set_hw_breakpoint)(long unsigned int, int, enum kgdb_bptype); + int (*remove_hw_breakpoint)(long unsigned int, int, enum kgdb_bptype); + void (*disable_hw_break)(struct pt_regs *); + void (*remove_all_hw_break)(); + void (*correct_hw_break)(); + void (*enable_nmi)(bool); +}; + +struct screen_info { + __u8 orig_x; + __u8 orig_y; + __u16 ext_mem_k; + __u16 orig_video_page; + __u8 orig_video_mode; + __u8 orig_video_cols; + __u8 flags; + __u8 unused2; + __u16 orig_video_ega_bx; + __u16 unused3; + __u8 orig_video_lines; + __u8 orig_video_isVGA; + __u16 orig_video_points; + __u16 lfb_width; + __u16 lfb_height; + __u16 lfb_depth; + __u32 lfb_base; + __u32 lfb_size; + __u16 cl_magic; + __u16 cl_offset; + __u16 lfb_linelength; + __u8 red_size; + __u8 red_pos; + __u8 green_size; + __u8 green_pos; + __u8 blue_size; + __u8 blue_pos; + __u8 rsvd_size; + __u8 rsvd_pos; + __u16 vesapm_seg; + __u16 vesapm_off; + __u16 pages; + __u16 vesa_attributes; + __u32 capabilities; + __u32 ext_lfb_base; + __u8 _reserved[2]; +} __attribute__((packed)); + +typedef int (*pte_fn_t)(pte_t *, long unsigned int, void *); + +struct pci_device_id { + __u32 vendor; + __u32 device; + __u32 subvendor; + __u32 subdevice; + __u32 class; + __u32 class_mask; + kernel_ulong_t driver_data; + __u32 override_only; +}; + +struct resource_entry { + struct list_head node; + struct resource *res; + resource_size_t offset; + struct resource __res; +}; + +typedef u64 acpi_io_address; + +typedef u32 acpi_object_type; + +union acpi_object { + acpi_object_type type; + struct { + acpi_object_type type; + u64 value; + } integer; + struct { + acpi_object_type type; + u32 length; + char *pointer; + } string; + struct { + acpi_object_type type; + u32 length; + u8 *pointer; + } buffer; + struct { + acpi_object_type type; + u32 count; + union acpi_object *elements; + } package; + struct { + acpi_object_type type; + acpi_object_type actual_type; + acpi_handle handle; + } reference; + struct { + acpi_object_type type; + u32 proc_id; + acpi_io_address pblk_address; + u32 pblk_length; + } processor; + struct { + acpi_object_type type; + u32 system_level; + u32 resource_order; + } power_resource; +}; + +struct acpi_device; + +struct acpi_hotplug_profile { + struct kobject kobj; + int (*scan_dependent)(struct acpi_device *); + void (*notify_online)(struct acpi_device *); + bool enabled: 1; + bool demand_offline: 1; +}; + +struct acpi_device_status { + u32 present: 1; + u32 enabled: 1; + u32 show_in_ui: 1; + u32 functional: 1; + u32 battery_present: 1; + u32 reserved: 27; +}; + +struct acpi_device_flags { + u32 dynamic_status: 1; + u32 removable: 1; + u32 ejectable: 1; + u32 power_manageable: 1; + u32 match_driver: 1; + u32 initialized: 1; + u32 visited: 1; + u32 hotplug_notify: 1; + u32 is_dock_station: 1; + u32 of_compatible_ok: 1; + u32 coherent_dma: 1; + u32 cca_seen: 1; + u32 enumeration_by_parent: 1; + u32 reserved: 19; +}; + +typedef char acpi_bus_id[8]; + +struct acpi_pnp_type { + u32 hardware_id: 1; + u32 bus_address: 1; + u32 platform_id: 1; + u32 reserved: 29; +}; + +typedef u64 acpi_bus_address; + +typedef char acpi_device_name[40]; + +typedef char acpi_device_class[20]; + +struct acpi_device_pnp { + acpi_bus_id bus_id; + int instance_no; + struct acpi_pnp_type type; + acpi_bus_address bus_address; + char *unique_id; + struct list_head ids; + acpi_device_name device_name; + acpi_device_class device_class; + union acpi_object *str_obj; +}; + +struct acpi_device_power_flags { + u32 explicit_get: 1; + u32 power_resources: 1; + u32 inrush_current: 1; + u32 power_removed: 1; + u32 ignore_parent: 1; + u32 dsw_present: 1; + u32 reserved: 26; +}; + +struct acpi_device_power_state { + struct { + u8 valid: 1; + u8 explicit_set: 1; + u8 reserved: 6; + } flags; + int power; + int latency; + struct list_head resources; +}; + +struct acpi_device_power { + int state; + struct acpi_device_power_flags flags; + struct acpi_device_power_state states[5]; + u8 state_for_enumeration; +}; + +struct acpi_device_wakeup_flags { + u8 valid: 1; + u8 notifier_present: 1; +}; + +struct acpi_device_wakeup_context { + void (*func)(struct acpi_device_wakeup_context *); + struct device *dev; +}; + +struct acpi_device_wakeup { + acpi_handle gpe_device; + u64 gpe_number; + u64 sleep_state; + struct list_head resources; + struct acpi_device_wakeup_flags flags; + struct acpi_device_wakeup_context context; + struct wakeup_source *ws; + int prepare_count; + int enable_count; +}; + +struct acpi_device_perf_flags { + u8 reserved: 8; +}; + +struct acpi_device_perf_state; + +struct acpi_device_perf { + int state; + struct acpi_device_perf_flags flags; + int state_count; + struct acpi_device_perf_state *states; +}; + +struct acpi_device_dir { + struct proc_dir_entry *entry; +}; + +struct acpi_device_data { + const union acpi_object *pointer; + struct list_head properties; + const union acpi_object *of_compatible; + struct list_head subnodes; +}; + +struct acpi_scan_handler; + +struct acpi_hotplug_context; + +struct acpi_driver; + +struct acpi_gpio_mapping; + +struct acpi_device { + int device_type; + acpi_handle handle; + struct fwnode_handle fwnode; + struct acpi_device *parent; + struct list_head children; + struct list_head node; + struct list_head wakeup_list; + struct list_head del_list; + struct acpi_device_status status; + struct acpi_device_flags flags; + struct acpi_device_pnp pnp; + struct acpi_device_power power; + struct acpi_device_wakeup wakeup; + struct acpi_device_perf performance; + struct acpi_device_dir dir; + struct acpi_device_data data; + struct acpi_scan_handler *handler; + struct acpi_hotplug_context *hp; + struct acpi_driver *driver; + const struct acpi_gpio_mapping *driver_gpios; + void *driver_data; + struct device dev; + unsigned int physical_node_count; + unsigned int dep_unmet; + struct list_head physical_node_list; + struct mutex physical_node_lock; + void (*remove)(struct acpi_device *); +}; + +struct acpi_scan_handler { + const struct acpi_device_id *ids; + struct list_head list_node; + bool (*match)(const char *, const struct acpi_device_id **); + int (*attach)(struct acpi_device *, const struct acpi_device_id *); + void (*detach)(struct acpi_device *); + void (*bind)(struct device *); + void (*unbind)(struct device *); + struct acpi_hotplug_profile hotplug; +}; + +struct acpi_hotplug_context { + struct acpi_device *self; + int (*notify)(struct acpi_device *, u32); + void (*uevent)(struct acpi_device *, u32); + void (*fixup)(struct acpi_device *); +}; + +typedef int (*acpi_op_add)(struct acpi_device *); + +typedef int (*acpi_op_remove)(struct acpi_device *); + +typedef void (*acpi_op_notify)(struct acpi_device *, u32); + +struct acpi_device_ops { + acpi_op_add add; + acpi_op_remove remove; + acpi_op_notify notify; +}; + +struct acpi_driver { + char name[80]; + char class[80]; + const struct acpi_device_id *ids; + unsigned int flags; + struct acpi_device_ops ops; + struct device_driver drv; + struct module *owner; +}; + +struct acpi_device_perf_state { + struct { + u8 valid: 1; + u8 reserved: 7; + } flags; + u8 power; + u8 performance; + int latency; +}; + +struct acpi_gpio_params; + +struct acpi_gpio_mapping { + const char *name; + const struct acpi_gpio_params *data; + unsigned int size; + unsigned int quirks; +}; + +struct pci_bus; + +struct acpi_pci_root { + struct acpi_device *device; + struct pci_bus *bus; + u16 segment; + struct resource secondary; + u32 osc_support_set; + u32 osc_control_set; + phys_addr_t mcfg_addr; +}; + +typedef short unsigned int pci_bus_flags_t; + +struct pci_dev; + +struct pci_ops; + +struct pci_bus { + struct list_head node; + struct pci_bus *parent; + struct list_head children; + struct list_head devices; + struct pci_dev *self; + struct list_head slots; + struct resource *resource[4]; + struct list_head resources; + struct resource busn_res; + struct pci_ops *ops; + void *sysdata; + struct proc_dir_entry *procdir; + unsigned char number; + unsigned char primary; + unsigned char max_bus_speed; + unsigned char cur_bus_speed; + int domain_nr; + char name[48]; + short unsigned int bridge_ctl; + pci_bus_flags_t bus_flags; + struct device *bridge; + struct device dev; + struct bin_attribute *legacy_io; + struct bin_attribute *legacy_mem; + unsigned int is_added: 1; +}; + +struct acpi_gpio_params { + unsigned int crs_entry_index; + unsigned int line_index; + bool active_low; +}; + +struct hotplug_slot; + +struct pci_slot { + struct pci_bus *bus; + struct list_head list; + struct hotplug_slot *hotplug; + unsigned char number; + struct kobject kobj; +}; + +enum { + PCI_STD_RESOURCES = 0, + PCI_STD_RESOURCE_END = 5, + PCI_ROM_RESOURCE = 6, + PCI_IOV_RESOURCES = 7, + PCI_IOV_RESOURCE_END = 12, + PCI_BRIDGE_RESOURCES = 13, + PCI_BRIDGE_RESOURCE_END = 16, + PCI_NUM_RESOURCES = 17, + DEVICE_COUNT_RESOURCE = 17, +}; + +typedef int pci_power_t; + +typedef unsigned int pci_channel_state_t; + +typedef unsigned int pcie_reset_state_t; + +typedef short unsigned int pci_dev_flags_t; + +struct pci_vpd { + struct mutex lock; + unsigned int len; + u8 cap; +}; + +struct aer_stats; + +struct rcec_ea; + +struct pci_driver; + +struct pcie_link_state; + +struct pci_sriov; + +struct pci_dev { + struct list_head bus_list; + struct pci_bus *bus; + struct pci_bus *subordinate; + void *sysdata; + struct proc_dir_entry *procent; + struct pci_slot *slot; + unsigned int devfn; + short unsigned int vendor; + short unsigned int device; + short unsigned int subsystem_vendor; + short unsigned int subsystem_device; + unsigned int class; + u8 revision; + u8 hdr_type; + u16 aer_cap; + struct aer_stats *aer_stats; + struct rcec_ea *rcec_ea; + struct pci_dev *rcec; + u32 devcap; + u8 pcie_cap; + u8 msi_cap; + u8 msix_cap; + u8 pcie_mpss: 3; + u8 rom_base_reg; + u8 pin; + u16 pcie_flags_reg; + long unsigned int *dma_alias_mask; + struct pci_driver *driver; + u64 dma_mask; + struct device_dma_parameters dma_parms; + pci_power_t current_state; + unsigned int imm_ready: 1; + u8 pm_cap; + unsigned int pme_support: 5; + unsigned int pme_poll: 1; + unsigned int d1_support: 1; + unsigned int d2_support: 1; + unsigned int no_d1d2: 1; + unsigned int no_d3cold: 1; + unsigned int bridge_d3: 1; + unsigned int d3cold_allowed: 1; + unsigned int mmio_always_on: 1; + unsigned int wakeup_prepared: 1; + unsigned int runtime_d3cold: 1; + unsigned int skip_bus_pm: 1; + unsigned int ignore_hotplug: 1; + unsigned int hotplug_user_indicators: 1; + unsigned int clear_retrain_link: 1; + unsigned int d3hot_delay; + unsigned int d3cold_delay; + struct pcie_link_state *link_state; + unsigned int ltr_path: 1; + u16 l1ss; + unsigned int pasid_no_tlp: 1; + unsigned int eetlp_prefix_path: 1; + pci_channel_state_t error_state; + struct device dev; + int cfg_size; + unsigned int irq; + struct resource resource[17]; + bool match_driver; + unsigned int transparent: 1; + unsigned int io_window: 1; + unsigned int pref_window: 1; + unsigned int pref_64_window: 1; + unsigned int multifunction: 1; + unsigned int is_busmaster: 1; + unsigned int no_msi: 1; + unsigned int no_64bit_msi: 1; + unsigned int block_cfg_access: 1; + unsigned int broken_parity_status: 1; + unsigned int irq_reroute_variant: 2; + unsigned int msi_enabled: 1; + unsigned int msix_enabled: 1; + unsigned int ari_enabled: 1; + unsigned int ats_enabled: 1; + unsigned int pasid_enabled: 1; + unsigned int pri_enabled: 1; + unsigned int is_managed: 1; + unsigned int needs_freset: 1; + unsigned int state_saved: 1; + unsigned int is_physfn: 1; + unsigned int is_virtfn: 1; + unsigned int is_hotplug_bridge: 1; + unsigned int shpc_managed: 1; + unsigned int is_thunderbolt: 1; + unsigned int untrusted: 1; + unsigned int external_facing: 1; + unsigned int broken_intx_masking: 1; + unsigned int io_window_1k: 1; + unsigned int irq_managed: 1; + unsigned int non_compliant_bars: 1; + unsigned int is_probed: 1; + unsigned int link_active_reporting: 1; + unsigned int no_vf_scan: 1; + unsigned int no_command_memory: 1; + pci_dev_flags_t dev_flags; + atomic_t enable_cnt; + u32 saved_config_space[16]; + struct hlist_head saved_cap_space; + int rom_attr_enabled; + struct bin_attribute *res_attr[17]; + struct bin_attribute *res_attr_wc[17]; + unsigned int broken_cmd_compl: 1; + unsigned int ptm_root: 1; + unsigned int ptm_enabled: 1; + u8 ptm_granularity; + const struct attribute_group **msi_irq_groups; + struct pci_vpd vpd; + u16 dpc_cap; + unsigned int dpc_rp_extensions: 1; + u8 dpc_rp_log_size; + union { + struct pci_sriov *sriov; + struct pci_dev *physfn; + }; + u16 ats_cap; + u8 ats_stu; + u16 pri_cap; + u32 pri_reqs_alloc; + unsigned int pasid_required: 1; + u16 pasid_cap; + u16 pasid_features; + u16 acs_cap; + phys_addr_t rom; + size_t romlen; + char *driver_override; + long unsigned int priv_flags; + u8 reset_methods[7]; +}; + +struct pci_dynids { + spinlock_t lock; + struct list_head list; +}; + +struct pci_error_handlers; + +struct pci_driver { + struct list_head node; + const char *name; + const struct pci_device_id *id_table; + int (*probe)(struct pci_dev *, const struct pci_device_id *); + void (*remove)(struct pci_dev *); + int (*suspend)(struct pci_dev *, pm_message_t); + int (*resume)(struct pci_dev *); + void (*shutdown)(struct pci_dev *); + int (*sriov_configure)(struct pci_dev *, int); + int (*sriov_set_msix_vec_count)(struct pci_dev *, int); + u32 (*sriov_get_vf_total_msix)(struct pci_dev *); + const struct pci_error_handlers *err_handler; + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + struct device_driver driver; + struct pci_dynids dynids; +}; + +struct pci_host_bridge { + struct device dev; + struct pci_bus *bus; + struct pci_ops *ops; + struct pci_ops *child_ops; + void *sysdata; + int busnr; + int domain_nr; + struct list_head windows; + struct list_head dma_ranges; + u8 (*swizzle_irq)(struct pci_dev *, u8 *); + int (*map_irq)(const struct pci_dev *, u8, u8); + void (*release_fn)(struct pci_host_bridge *); + void *release_data; + unsigned int ignore_reset_delay: 1; + unsigned int no_ext_tags: 1; + unsigned int native_aer: 1; + unsigned int native_pcie_hotplug: 1; + unsigned int native_shpc_hotplug: 1; + unsigned int native_pme: 1; + unsigned int native_ltr: 1; + unsigned int native_dpc: 1; + unsigned int preserve_config: 1; + unsigned int size_windows: 1; + unsigned int msi_domain: 1; + resource_size_t (*align_resource)(struct pci_dev *, const struct resource *, resource_size_t, resource_size_t, resource_size_t); + long: 64; + long: 64; + long unsigned int private[0]; +}; + +struct pci_ops { + int (*add_bus)(struct pci_bus *); + void (*remove_bus)(struct pci_bus *); + void * (*map_bus)(struct pci_bus *, unsigned int, int); + int (*read)(struct pci_bus *, unsigned int, int, int, u32 *); + int (*write)(struct pci_bus *, unsigned int, int, int, u32); +}; + +typedef unsigned int pci_ers_result_t; + +struct pci_error_handlers { + pci_ers_result_t (*error_detected)(struct pci_dev *, pci_channel_state_t); + pci_ers_result_t (*mmio_enabled)(struct pci_dev *); + pci_ers_result_t (*slot_reset)(struct pci_dev *); + void (*reset_prepare)(struct pci_dev *); + void (*reset_done)(struct pci_dev *); + void (*resume)(struct pci_dev *); +}; + +struct acpi_pci_root_ops; + +struct acpi_pci_root_info { + struct acpi_pci_root *root; + struct acpi_device *bridge; + struct acpi_pci_root_ops *ops; + struct list_head resources; + char name[16]; +}; + +struct acpi_pci_root_ops { + struct pci_ops *pci_ops; + int (*init_info)(struct acpi_pci_root_info *); + void (*release_info)(struct acpi_pci_root_info *); + int (*prepare_resources)(struct acpi_pci_root_info *); +}; + +struct pci_config_window; + +struct pci_ecam_ops { + unsigned int bus_shift; + struct pci_ops pci_ops; + int (*init)(struct pci_config_window *); +}; + +struct pci_config_window { + struct resource res; + struct resource busr; + unsigned int bus_shift; + void *priv; + const struct pci_ecam_ops *ops; + union { + void *win; + void **winp; + }; + struct device *parent; +}; + +struct acpi_pci_generic_root_info { + struct acpi_pci_root_info common; + struct pci_config_window *cfg; +}; + +typedef bool (*smp_cond_func_t)(int, void *); + +struct trace_event_raw_instruction_emulation { + struct trace_entry ent; + u32 __data_loc_instr; + u64 addr; + char __data[0]; +}; + +struct trace_event_data_offsets_instruction_emulation { + u32 instr; +}; + +typedef void (*btf_trace_instruction_emulation)(void *, const char *, u64); + +enum insn_emulation_mode { + INSN_UNDEF = 0, + INSN_EMULATE = 1, + INSN_HW = 2, +}; + +enum legacy_insn_status { + INSN_DEPRECATED = 0, + INSN_OBSOLETE = 1, +}; + +struct insn_emulation_ops { + const char *name; + enum legacy_insn_status status; + struct undef_hook *hooks; + int (*set_hw_mode)(bool); +}; + +struct insn_emulation { + struct list_head node; + struct insn_emulation_ops *ops; + int current_mode; + int min; + int max; +}; + +typedef u64 acpi_size; + +typedef u64 acpi_physical_address; + +typedef u32 acpi_status; + +typedef char *acpi_string; + +struct acpi_table_header { + char signature[4]; + u32 length; + u8 revision; + u8 checksum; + char oem_id[6]; + char oem_table_id[8]; + u32 oem_revision; + char asl_compiler_id[4]; + u32 asl_compiler_revision; +}; + +struct acpi_generic_address { + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_width; + u64 address; +} __attribute__((packed)); + +struct acpi_table_fadt { + struct acpi_table_header header; + u32 facs; + u32 dsdt; + u8 model; + u8 preferred_profile; + u16 sci_interrupt; + u32 smi_command; + u8 acpi_enable; + u8 acpi_disable; + u8 s4_bios_request; + u8 pstate_control; + u32 pm1a_event_block; + u32 pm1b_event_block; + u32 pm1a_control_block; + u32 pm1b_control_block; + u32 pm2_control_block; + u32 pm_timer_block; + u32 gpe0_block; + u32 gpe1_block; + u8 pm1_event_length; + u8 pm1_control_length; + u8 pm2_control_length; + u8 pm_timer_length; + u8 gpe0_block_length; + u8 gpe1_block_length; + u8 gpe1_base; + u8 cst_control; + u16 c2_latency; + u16 c3_latency; + u16 flush_size; + u16 flush_stride; + u8 duty_offset; + u8 duty_width; + u8 day_alarm; + u8 month_alarm; + u8 century; + u16 boot_flags; + u8 reserved; + u32 flags; + struct acpi_generic_address reset_register; + u8 reset_value; + u16 arm_boot_flags; + u8 minor_revision; + u64 Xfacs; + u64 Xdsdt; + struct acpi_generic_address xpm1a_event_block; + struct acpi_generic_address xpm1b_event_block; + struct acpi_generic_address xpm1a_control_block; + struct acpi_generic_address xpm1b_control_block; + struct acpi_generic_address xpm2_control_block; + struct acpi_generic_address xpm_timer_block; + struct acpi_generic_address xgpe0_block; + struct acpi_generic_address xgpe1_block; + struct acpi_generic_address sleep_control; + struct acpi_generic_address sleep_status; + u64 hypervisor_id; +} __attribute__((packed)); + +typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *); + +struct serial_icounter_struct { + int cts; + int dsr; + int rng; + int dcd; + int rx; + int tx; + int frame; + int overrun; + int parity; + int brk; + int buf_overrun; + int reserved[9]; +}; + +struct serial_struct { + int type; + int line; + unsigned int port; + int irq; + int flags; + int xmit_fifo_size; + int custom_divisor; + int baud_base; + short unsigned int close_delay; + char io_type; + char reserved_char[1]; + int hub6; + short unsigned int closing_wait; + short unsigned int closing_wait2; + unsigned char *iomem_base; + short unsigned int iomem_reg_shift; + unsigned int port_high; + long unsigned int iomap_base; +}; + +enum acpi_srat_type { + ACPI_SRAT_TYPE_CPU_AFFINITY = 0, + ACPI_SRAT_TYPE_MEMORY_AFFINITY = 1, + ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY = 2, + ACPI_SRAT_TYPE_GICC_AFFINITY = 3, + ACPI_SRAT_TYPE_GIC_ITS_AFFINITY = 4, + ACPI_SRAT_TYPE_GENERIC_AFFINITY = 5, + ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY = 6, + ACPI_SRAT_TYPE_RESERVED = 7, +}; + +struct acpi_srat_gicc_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u32 acpi_processor_uid; + u32 flags; + u32 clock_domain; +} __attribute__((packed)); + +struct parking_protocol_mailbox { + __le32 cpu_id; + __le32 reserved; + __le64 entry_point; +}; + +struct cpu_mailbox_entry { + struct parking_protocol_mailbox *mailbox; + phys_addr_t mailbox_addr; + u8 version; + u8 gic_cpu_id; +}; + +enum { + MEMREMAP_WB = 1, + MEMREMAP_WT = 2, + MEMREMAP_WC = 4, + MEMREMAP_ENC = 8, + MEMREMAP_DEC = 16, +}; + +struct pvclock_vcpu_stolen_time { + __le32 revision; + __le32 attributes; + __le64 stolen_time; + u8 padding[48]; +}; + +struct pv_time_stolen_time_region { + struct pvclock_vcpu_stolen_time *kaddr; +}; + +typedef __be64 fdt64_t; + +enum kaslr_status { + KASLR_ENABLED = 0, + KASLR_DISABLED_CMDLINE = 1, + KASLR_DISABLED_NO_SEED = 2, + KASLR_DISABLED_FDT_REMAP = 3, +}; + +enum { + IRQD_TRIGGER_MASK = 15, + IRQD_SETAFFINITY_PENDING = 256, + IRQD_ACTIVATED = 512, + IRQD_NO_BALANCING = 1024, + IRQD_PER_CPU = 2048, + IRQD_AFFINITY_SET = 4096, + IRQD_LEVEL = 8192, + IRQD_WAKEUP_STATE = 16384, + IRQD_MOVE_PCNTXT = 32768, + IRQD_IRQ_DISABLED = 65536, + IRQD_IRQ_MASKED = 131072, + IRQD_IRQ_INPROGRESS = 262144, + IRQD_WAKEUP_ARMED = 524288, + IRQD_FORWARDED_TO_VCPU = 1048576, + IRQD_AFFINITY_MANAGED = 2097152, + IRQD_IRQ_STARTED = 4194304, + IRQD_MANAGED_SHUTDOWN = 8388608, + IRQD_SINGLE_TARGET = 16777216, + IRQD_DEFAULT_TRIGGER_SET = 33554432, + IRQD_CAN_RESERVE = 67108864, + IRQD_MSI_NOMASK_QUIRK = 134217728, + IRQD_HANDLE_ENFORCE_IRQCTX = 268435456, + IRQD_AFFINITY_ON_ACTIVATE = 536870912, + IRQD_IRQ_ENABLED_ON_SUSPEND = 1073741824, +}; + +struct kimage_arch { + void *dtb; + phys_addr_t dtb_mem; + phys_addr_t kern_reloc; + phys_addr_t el2_vectors; + phys_addr_t ttbr0; + phys_addr_t ttbr1; + phys_addr_t zero_page; + long unsigned int phys_offset; + long unsigned int t0sz; +}; + +typedef int kexec_probe_t(const char *, long unsigned int); + +struct kimage; + +typedef void *kexec_load_t(struct kimage *, char *, long unsigned int, char *, long unsigned int, char *, long unsigned int); + +typedef int kexec_cleanup_t(void *); + +typedef int kexec_verify_sig_t(const char *, long unsigned int); + +struct kexec_file_ops { + kexec_probe_t *probe; + kexec_load_t *load; + kexec_cleanup_t *cleanup; + kexec_verify_sig_t *verify_sig; +}; + +typedef long unsigned int kimage_entry_t; + +struct kexec_segment { + union { + void *buf; + void *kbuf; + }; + size_t bufsz; + long unsigned int mem; + size_t memsz; +}; + +struct purgatory_info { + const Elf64_Ehdr *ehdr; + Elf64_Shdr *sechdrs; + void *purgatory_buf; +}; + +struct kimage { + kimage_entry_t head; + kimage_entry_t *entry; + kimage_entry_t *last_entry; + long unsigned int start; + struct page *control_code_page; + struct page *swap_page; + void *vmcoreinfo_data_copy; + long unsigned int nr_segments; + struct kexec_segment segment[16]; + struct list_head control_pages; + struct list_head dest_pages; + struct list_head unusable_pages; + long unsigned int control_page; + unsigned int type: 1; + unsigned int preserve_context: 1; + unsigned int file_mode: 1; + struct kimage_arch arch; + void *kernel_buf; + long unsigned int kernel_buf_len; + void *initrd_buf; + long unsigned int initrd_buf_len; + char *cmdline_buf; + long unsigned int cmdline_buf_len; + const struct kexec_file_ops *fops; + void *image_loader_data; + struct purgatory_info purgatory_info; + void *ima_buffer; + phys_addr_t ima_buffer_addr; + size_t ima_buffer_size; + void *elf_headers; + long unsigned int elf_headers_sz; + long unsigned int elf_load_addr; +}; + +struct trans_pgd_info { + void * (*trans_alloc_page)(void *); + void *trans_alloc_arg; +}; + +typedef u8 uint8_t; + +struct kexec_buf { + struct kimage *image; + void *buffer; + long unsigned int bufsz; + long unsigned int mem; + long unsigned int memsz; + long unsigned int buf_align; + long unsigned int buf_min; + long unsigned int buf_max; + bool top_down; +}; + +struct crash_mem_range { + u64 start; + u64 end; +}; + +struct crash_mem { + unsigned int max_nr_ranges; + unsigned int nr_ranges; + struct crash_mem_range ranges[0]; +}; + +typedef __be32 fdt32_t; + +struct fdt_header { + fdt32_t magic; + fdt32_t totalsize; + fdt32_t off_dt_struct; + fdt32_t off_dt_strings; + fdt32_t off_mem_rsvmap; + fdt32_t version; + fdt32_t last_comp_version; + fdt32_t boot_cpuid_phys; + fdt32_t size_dt_strings; + fdt32_t size_dt_struct; +}; + +enum key_being_used_for { + VERIFYING_MODULE_SIGNATURE = 0, + VERIFYING_FIRMWARE_SIGNATURE = 1, + VERIFYING_KEXEC_PE_SIGNATURE = 2, + VERIFYING_KEY_SIGNATURE = 3, + VERIFYING_KEY_SELF_SIGNATURE = 4, + VERIFYING_UNSPECIFIED_SIGNATURE = 5, + NR__KEY_BEING_USED_FOR = 6, +}; + +struct arm64_image_header { + __le32 code0; + __le32 code1; + __le64 text_offset; + __le64 image_size; + __le64 flags; + __le64 res2; + __le64 res3; + __le64 res4; + __le32 magic; + __le32 res5; +}; + +typedef int sdei_event_callback(u32, struct pt_regs *, void *); + +struct sdei_registered_event___2 { + struct pt_regs interrupted_regs; + sdei_event_callback *callback; + void *callback_arg; + u32 event_num; + u8 priority; +}; + +typedef struct { + long unsigned int val; +} swp_entry_t; + +typedef u32 probe_opcode_t; + +typedef void probes_handler_t(u32, long int, struct pt_regs *); + +struct arch_probe_insn { + probe_opcode_t *insn; + pstate_check_t *pstate_cc; + probes_handler_t *handler; + long unsigned int restore; +}; + +typedef u32 kprobe_opcode_t; + +struct arch_specific_insn { + struct arch_probe_insn api; +}; + +struct freelist_node { + atomic_t refs; + struct freelist_node *next; +}; + +struct freelist_head { + struct freelist_node *head; +}; + +struct kprobe; + +struct prev_kprobe { + struct kprobe *kp; + unsigned int status; +}; + +typedef int (*kprobe_pre_handler_t)(struct kprobe *, struct pt_regs *); + +typedef void (*kprobe_post_handler_t)(struct kprobe *, struct pt_regs *, long unsigned int); + +struct kprobe { + struct hlist_node hlist; + struct list_head list; + long unsigned int nmissed; + kprobe_opcode_t *addr; + const char *symbol_name; + unsigned int offset; + kprobe_pre_handler_t pre_handler; + kprobe_post_handler_t post_handler; + kprobe_opcode_t opcode; + struct arch_specific_insn ainsn; + u32 flags; +}; + +struct kprobe_ctlblk { + unsigned int kprobe_status; + long unsigned int saved_irqflag; + struct prev_kprobe prev_kprobe; +}; + +struct kretprobe_instance; + +typedef int (*kretprobe_handler_t)(struct kretprobe_instance *, struct pt_regs *); + +struct kretprobe_holder; + +struct kretprobe_instance { + union { + struct freelist_node freelist; + struct callback_head rcu; + }; + struct llist_node llist; + struct kretprobe_holder *rph; + kprobe_opcode_t *ret_addr; + void *fp; + char data[0]; +}; + +struct kretprobe; + +struct kretprobe_holder { + struct kretprobe *rp; + refcount_t ref; +}; + +struct kretprobe { + struct kprobe kp; + kretprobe_handler_t handler; + kretprobe_handler_t entry_handler; + int maxactive; + int nmissed; + size_t data_size; + struct freelist_head freelist; + struct kretprobe_holder *rph; +}; + +struct kprobe_insn_cache { + struct mutex mutex; + void * (*alloc)(); + void (*free)(void *); + const char *sym; + struct list_head pages; + size_t insn_size; + int nr_garbage; +}; + +enum probe_insn { + INSN_REJECTED = 0, + INSN_GOOD_NO_SLOT = 1, + INSN_GOOD = 2, +}; + +enum aarch64_insn_encoding_class { + AARCH64_INSN_CLS_UNKNOWN = 0, + AARCH64_INSN_CLS_SVE = 1, + AARCH64_INSN_CLS_DP_IMM = 2, + AARCH64_INSN_CLS_DP_REG = 3, + AARCH64_INSN_CLS_DP_FPSIMD = 4, + AARCH64_INSN_CLS_LDST = 5, + AARCH64_INSN_CLS_BR_SYS = 6, +}; + +enum aarch64_insn_special_register { + AARCH64_INSN_SPCLREG_SPSR_EL1 = 49664, + AARCH64_INSN_SPCLREG_ELR_EL1 = 49665, + AARCH64_INSN_SPCLREG_SP_EL0 = 49672, + AARCH64_INSN_SPCLREG_SPSEL = 49680, + AARCH64_INSN_SPCLREG_CURRENTEL = 49682, + AARCH64_INSN_SPCLREG_DAIF = 55825, + AARCH64_INSN_SPCLREG_NZCV = 55824, + AARCH64_INSN_SPCLREG_FPCR = 55840, + AARCH64_INSN_SPCLREG_DSPSR_EL0 = 55848, + AARCH64_INSN_SPCLREG_DLR_EL0 = 55849, + AARCH64_INSN_SPCLREG_SPSR_EL2 = 57856, + AARCH64_INSN_SPCLREG_ELR_EL2 = 57857, + AARCH64_INSN_SPCLREG_SP_EL1 = 57864, + AARCH64_INSN_SPCLREG_SPSR_INQ = 57880, + AARCH64_INSN_SPCLREG_SPSR_ABT = 57881, + AARCH64_INSN_SPCLREG_SPSR_UND = 57882, + AARCH64_INSN_SPCLREG_SPSR_FIQ = 57883, + AARCH64_INSN_SPCLREG_SPSR_EL3 = 61952, + AARCH64_INSN_SPCLREG_ELR_EL3 = 61953, + AARCH64_INSN_SPCLREG_SP_EL2 = 61968, +}; + +struct arch_uprobe { + union { + u8 insn[4]; + u8 ixol[4]; + }; + struct arch_probe_insn api; + bool simulate; +}; + +enum rp_check { + RP_CHECK_CALL = 0, + RP_CHECK_CHAIN_CALL = 1, + RP_CHECK_RET = 2, +}; + +struct io_tlb_slot; + +struct io_tlb_mem { + phys_addr_t start; + phys_addr_t end; + long unsigned int nslabs; + long unsigned int used; + unsigned int index; + spinlock_t lock; + struct dentry *debugfs; + bool late_alloc; + bool force_bounce; + bool for_alloc; + struct io_tlb_slot *slots; +}; + +struct iommu_fault_param; + +struct iopf_device_param; + +struct iommu_fwspec; + +struct dev_iommu { + struct mutex lock; + struct iommu_fault_param *fault_param; + struct iopf_device_param *iopf_param; + struct iommu_fwspec *fwspec; + struct iommu_device *iommu_dev; + void *priv; +}; + +struct sg_table { + struct scatterlist *sgl; + unsigned int nents; + unsigned int orig_nents; +}; + +struct of_phandle_args { + struct device_node *np; + int args_count; + uint32_t args[16]; +}; + +struct iommu_fault_unrecoverable { + __u32 reason; + __u32 flags; + __u32 pasid; + __u32 perm; + __u64 addr; + __u64 fetch_addr; +}; + +struct iommu_fault_page_request { + __u32 flags; + __u32 pasid; + __u32 grpid; + __u32 perm; + __u64 addr; + __u64 private_data[2]; +}; + +struct iommu_fault { + __u32 type; + __u32 padding; + union { + struct iommu_fault_unrecoverable event; + struct iommu_fault_page_request prm; + __u8 padding2[56]; + }; +}; + +struct iommu_page_response { + __u32 argsz; + __u32 version; + __u32 flags; + __u32 pasid; + __u32 grpid; + __u32 code; +}; + +struct iommu_inv_addr_info { + __u32 flags; + __u32 archid; + __u64 pasid; + __u64 addr; + __u64 granule_size; + __u64 nb_granules; +}; + +struct iommu_inv_pasid_info { + __u32 flags; + __u32 archid; + __u64 pasid; +}; + +struct iommu_cache_invalidate_info { + __u32 argsz; + __u32 version; + __u8 cache; + __u8 granularity; + __u8 padding[6]; + union { + struct iommu_inv_pasid_info pasid_info; + struct iommu_inv_addr_info addr_info; + } granu; +}; + +struct iommu_gpasid_bind_data_vtd { + __u64 flags; + __u32 pat; + __u32 emt; +}; + +struct iommu_gpasid_bind_data { + __u32 argsz; + __u32 version; + __u32 format; + __u32 addr_width; + __u64 flags; + __u64 gpgd; + __u64 hpasid; + __u64 gpasid; + __u8 padding[8]; + union { + struct iommu_gpasid_bind_data_vtd vtd; + } vendor; +}; + +typedef int (*iommu_fault_handler_t)(struct iommu_domain *, struct device *, long unsigned int, int, void *); + +struct iommu_domain_geometry { + dma_addr_t aperture_start; + dma_addr_t aperture_end; + bool force_aperture; +}; + +struct iommu_dma_cookie; + +struct iommu_domain { + unsigned int type; + const struct iommu_ops *ops; + long unsigned int pgsize_bitmap; + iommu_fault_handler_t handler; + void *handler_token; + struct iommu_domain_geometry geometry; + struct iommu_dma_cookie *iova_cookie; +}; + +typedef int (*iommu_dev_fault_handler_t)(struct iommu_fault *, void *); + +enum iommu_resv_type { + IOMMU_RESV_DIRECT = 0, + IOMMU_RESV_DIRECT_RELAXABLE = 1, + IOMMU_RESV_RESERVED = 2, + IOMMU_RESV_MSI = 3, + IOMMU_RESV_SW_MSI = 4, +}; + +struct iommu_resv_region { + struct list_head list; + phys_addr_t start; + size_t length; + int prot; + enum iommu_resv_type type; +}; + +struct iommu_iotlb_gather { + long unsigned int start; + long unsigned int end; + size_t pgsize; + struct page *freelist; + bool queued; +}; + +struct iommu_device { + struct list_head list; + const struct iommu_ops *ops; + struct fwnode_handle *fwnode; + struct device *dev; +}; + +struct iommu_sva { + struct device *dev; +}; + +struct iommu_fault_event { + struct iommu_fault fault; + struct list_head list; +}; + +struct iommu_fault_param { + iommu_dev_fault_handler_t handler; + void *data; + struct list_head faults; + struct mutex lock; +}; + +struct iommu_fwspec { + const struct iommu_ops *ops; + struct fwnode_handle *iommu_fwnode; + u32 flags; + unsigned int num_ids; + u32 ids[0]; +}; + +enum xen_domain_type { + XEN_NATIVE = 0, + XEN_PV_DOMAIN = 1, + XEN_HVM_DOMAIN = 2, +}; + +struct io_tlb_slot { + phys_addr_t orig_addr; + size_t alloc_size; + unsigned int list; +}; + +typedef struct { + pgd_t pgd; +} p4d_t; + +struct hstate { + struct mutex resize_lock; + int next_nid_to_alloc; + int next_nid_to_free; + unsigned int order; + unsigned int demote_order; + long unsigned int mask; + long unsigned int max_huge_pages; + long unsigned int nr_huge_pages; + long unsigned int free_huge_pages; + long unsigned int resv_huge_pages; + long unsigned int surplus_huge_pages; + long unsigned int nr_overcommit_huge_pages; + struct list_head hugepage_activelist; + struct list_head hugepage_freelists[64]; + unsigned int max_huge_pages_node[64]; + unsigned int nr_huge_pages_node[64]; + unsigned int free_huge_pages_node[64]; + unsigned int surplus_huge_pages_node[64]; + struct cftype cgroup_files_dfl[7]; + struct cftype cgroup_files_legacy[9]; + char name[32]; +}; + +struct fault_info { + int (*fn)(long unsigned int, unsigned int, struct pt_regs *); + int sig; + int code; + const char *name; +}; + +enum swiotlb_force { + SWIOTLB_NORMAL = 0, + SWIOTLB_FORCE = 1, + SWIOTLB_NO_FORCE = 2, +}; + +typedef u64 p4dval_t; + +struct mhp_params { + struct vmem_altmap *altmap; + pgprot_t pgprot; +}; + +struct mem_section_usage { + long unsigned int subsection_map[1]; + long unsigned int pageblock_flags[0]; +}; + +struct mem_section { + long unsigned int section_mem_map; + struct mem_section_usage *usage; +}; + +struct memory_notify { + long unsigned int start_pfn; + long unsigned int nr_pages; + int status_change_nid_normal; + int status_change_nid; +}; + +struct page_change_data { + pgprot_t set_mask; + pgprot_t clear_mask; +}; + +typedef long unsigned int vm_flags_t; + +struct ptdump_range { + long unsigned int start; + long unsigned int end; +}; + +struct ptdump_state { + void (*note_page)(struct ptdump_state *, long unsigned int, int, u64); + void (*effective_prot)(struct ptdump_state *, int, u64); + const struct ptdump_range *range; +}; + +struct addr_marker { + long unsigned int start_address; + char *name; +}; + +struct ptdump_info { + struct mm_struct *mm; + const struct addr_marker *markers; + long unsigned int base_addr; +}; + +enum address_markers_idx { + PAGE_OFFSET_NR = 0, + PAGE_END_NR = 1, +}; + +struct pg_state { + struct ptdump_state ptdump; + struct seq_file *seq; + const struct addr_marker *marker; + long unsigned int start_address; + int level; + u64 current_prot; + bool check_wx; + long unsigned int wx_pages; + long unsigned int uxn_pages; +}; + +struct prot_bits { + u64 mask; + u64 val; + const char *set; + const char *clear; +}; + +struct pg_level { + const struct prot_bits *bits; + const char *name; + size_t num; + u64 mask; +}; + +struct xa_node { + unsigned char shift; + unsigned char offset; + unsigned char count; + unsigned char nr_values; + struct xa_node *parent; + struct xarray *array; + union { + struct list_head private_list; + struct callback_head callback_head; + }; + void *slots[64]; + union { + long unsigned int tags[3]; + long unsigned int marks[3]; + }; +}; + +typedef void (*xa_update_node_t)(struct xa_node *); + +struct xa_state { + struct xarray *xa; + long unsigned int xa_index; + unsigned char xa_shift; + unsigned char xa_sibs; + unsigned char xa_offset; + unsigned char xa_pad; + struct xa_node *xa_node; + struct xa_node *xa_alloc; + xa_update_node_t xa_update; +}; + +typedef __kernel_long_t __kernel_off_t; + +typedef __kernel_off_t off_t; + +enum { + BPF_REG_0 = 0, + BPF_REG_1 = 1, + BPF_REG_2 = 2, + BPF_REG_3 = 3, + BPF_REG_4 = 4, + BPF_REG_5 = 5, + BPF_REG_6 = 6, + BPF_REG_7 = 7, + BPF_REG_8 = 8, + BPF_REG_9 = 9, + BPF_REG_10 = 10, + __MAX_BPF_REG = 11, +}; + +enum aarch64_insn_hint_cr_op { + AARCH64_INSN_HINT_NOP = 0, + AARCH64_INSN_HINT_YIELD = 32, + AARCH64_INSN_HINT_WFE = 64, + AARCH64_INSN_HINT_WFI = 96, + AARCH64_INSN_HINT_SEV = 128, + AARCH64_INSN_HINT_SEVL = 160, + AARCH64_INSN_HINT_XPACLRI = 224, + AARCH64_INSN_HINT_PACIA_1716 = 256, + AARCH64_INSN_HINT_PACIB_1716 = 320, + AARCH64_INSN_HINT_AUTIA_1716 = 384, + AARCH64_INSN_HINT_AUTIB_1716 = 448, + AARCH64_INSN_HINT_PACIAZ = 768, + AARCH64_INSN_HINT_PACIASP = 800, + AARCH64_INSN_HINT_PACIBZ = 832, + AARCH64_INSN_HINT_PACIBSP = 864, + AARCH64_INSN_HINT_AUTIAZ = 896, + AARCH64_INSN_HINT_AUTIASP = 928, + AARCH64_INSN_HINT_AUTIBZ = 960, + AARCH64_INSN_HINT_AUTIBSP = 992, + AARCH64_INSN_HINT_ESB = 512, + AARCH64_INSN_HINT_PSB = 544, + AARCH64_INSN_HINT_TSB = 576, + AARCH64_INSN_HINT_CSDB = 640, + AARCH64_INSN_HINT_BTI = 1024, + AARCH64_INSN_HINT_BTIC = 1088, + AARCH64_INSN_HINT_BTIJ = 1152, + AARCH64_INSN_HINT_BTIJC = 1216, +}; + +enum aarch64_insn_condition { + AARCH64_INSN_COND_EQ = 0, + AARCH64_INSN_COND_NE = 1, + AARCH64_INSN_COND_CS = 2, + AARCH64_INSN_COND_CC = 3, + AARCH64_INSN_COND_MI = 4, + AARCH64_INSN_COND_PL = 5, + AARCH64_INSN_COND_VS = 6, + AARCH64_INSN_COND_VC = 7, + AARCH64_INSN_COND_HI = 8, + AARCH64_INSN_COND_LS = 9, + AARCH64_INSN_COND_GE = 10, + AARCH64_INSN_COND_LT = 11, + AARCH64_INSN_COND_GT = 12, + AARCH64_INSN_COND_LE = 13, + AARCH64_INSN_COND_AL = 14, +}; + +enum aarch64_insn_size_type { + AARCH64_INSN_SIZE_8 = 0, + AARCH64_INSN_SIZE_16 = 1, + AARCH64_INSN_SIZE_32 = 2, + AARCH64_INSN_SIZE_64 = 3, +}; + +enum aarch64_insn_ldst_type { + AARCH64_INSN_LDST_LOAD_REG_OFFSET = 0, + AARCH64_INSN_LDST_STORE_REG_OFFSET = 1, + AARCH64_INSN_LDST_LOAD_PAIR_PRE_INDEX = 2, + AARCH64_INSN_LDST_STORE_PAIR_PRE_INDEX = 3, + AARCH64_INSN_LDST_LOAD_PAIR_POST_INDEX = 4, + AARCH64_INSN_LDST_STORE_PAIR_POST_INDEX = 5, + AARCH64_INSN_LDST_LOAD_EX = 6, + AARCH64_INSN_LDST_STORE_EX = 7, +}; + +enum aarch64_insn_movewide_type { + AARCH64_INSN_MOVEWIDE_ZERO = 0, + AARCH64_INSN_MOVEWIDE_KEEP = 1, + AARCH64_INSN_MOVEWIDE_INVERSE = 2, +}; + +enum aarch64_insn_bitfield_type { + AARCH64_INSN_BITFIELD_MOVE = 0, + AARCH64_INSN_BITFIELD_MOVE_UNSIGNED = 1, + AARCH64_INSN_BITFIELD_MOVE_SIGNED = 2, +}; + +enum aarch64_insn_data1_type { + AARCH64_INSN_DATA1_REVERSE_16 = 0, + AARCH64_INSN_DATA1_REVERSE_32 = 1, + AARCH64_INSN_DATA1_REVERSE_64 = 2, +}; + +enum aarch64_insn_data2_type { + AARCH64_INSN_DATA2_UDIV = 0, + AARCH64_INSN_DATA2_SDIV = 1, + AARCH64_INSN_DATA2_LSLV = 2, + AARCH64_INSN_DATA2_LSRV = 3, + AARCH64_INSN_DATA2_ASRV = 4, + AARCH64_INSN_DATA2_RORV = 5, +}; + +enum aarch64_insn_data3_type { + AARCH64_INSN_DATA3_MADD = 0, + AARCH64_INSN_DATA3_MSUB = 1, +}; + +enum aarch64_insn_logic_type { + AARCH64_INSN_LOGIC_AND = 0, + AARCH64_INSN_LOGIC_BIC = 1, + AARCH64_INSN_LOGIC_ORR = 2, + AARCH64_INSN_LOGIC_ORN = 3, + AARCH64_INSN_LOGIC_EOR = 4, + AARCH64_INSN_LOGIC_EON = 5, + AARCH64_INSN_LOGIC_AND_SETFLAGS = 6, + AARCH64_INSN_LOGIC_BIC_SETFLAGS = 7, +}; + +enum { + DUMP_PREFIX_NONE = 0, + DUMP_PREFIX_ADDRESS = 1, + DUMP_PREFIX_OFFSET = 2, +}; + +struct bpf_binary_header { + u32 pages; + int: 32; + u8 image[0]; +}; + +typedef void (*bpf_jit_fill_hole_t)(void *, unsigned int); + +struct jit_ctx { + const struct bpf_prog *prog; + int idx; + int epilogue_offset; + int *offset; + int exentry_idx; + __le32 *image; + u32 stack_size; +}; + +struct arm64_jit_data { + struct bpf_binary_header *header; + u8 *image; + struct jit_ctx ctx; +}; + +typedef u64 gpa_t; + +typedef u64 gfn_t; + +typedef long unsigned int hva_t; + +typedef u64 hpa_t; + +typedef u64 hfn_t; + +typedef hfn_t kvm_pfn_t; + +struct kvm_memory_slot; + +struct gfn_to_hva_cache { + u64 generation; + gpa_t gpa; + long unsigned int hva; + long unsigned int len; + struct kvm_memory_slot *memslot; +}; + +struct kvm_arch_memory_slot {}; + +struct kvm_memory_slot { + gfn_t base_gfn; + long unsigned int npages; + long unsigned int *dirty_bitmap; + struct kvm_arch_memory_slot arch; + long unsigned int userspace_addr; + u32 flags; + short int id; + u16 as_id; +}; + +struct kvm_mmu_memory_cache { + int nobjs; + gfp_t gfp_zero; + struct kmem_cache *kmem_cache; + void *objects[40]; +}; + +struct kvm_vm_stat_generic { + u64 remote_tlb_flush; + u64 remote_tlb_flush_requests; +}; + +struct kvm_vcpu_stat_generic { + u64 halt_successful_poll; + u64 halt_attempted_poll; + u64 halt_poll_invalid; + u64 halt_wakeup; + u64 halt_poll_success_ns; + u64 halt_poll_fail_ns; + u64 halt_wait_ns; + u64 halt_poll_success_hist[32]; + u64 halt_poll_fail_hist[32]; + u64 halt_wait_hist[32]; +}; + +struct kvm_vcpu; + +struct kvm_io_device; + +struct kvm_io_device_ops { + int (*read)(struct kvm_vcpu *, struct kvm_io_device *, gpa_t, int, void *); + int (*write)(struct kvm_vcpu *, struct kvm_io_device *, gpa_t, int, const void *); + void (*destructor)(struct kvm_io_device *); +}; + +struct preempt_ops; + +struct preempt_notifier { + struct hlist_node link; + struct preempt_ops *ops; +}; + +struct kvm_mmio_fragment { + gpa_t gpa; + void *data; + unsigned int len; +}; + +struct kvm_cpu_context { + struct user_pt_regs regs; + u64 spsr_abt; + u64 spsr_und; + u64 spsr_irq; + u64 spsr_fiq; + struct user_fpsimd_state fp_regs; + u64 sys_regs[122]; + struct kvm_vcpu *__hyp_running_vcpu; + long: 64; +}; + +struct kvm_vcpu_fault_info { + u32 esr_el2; + u64 far_el2; + u64 hpfar_el2; + u64 disr_el1; +}; + +struct kvm_guest_debug_arch { + __u64 dbg_bcr[16]; + __u64 dbg_bvr[16]; + __u64 dbg_wcr[16]; + __u64 dbg_wvr[16]; +}; + +struct vgic_v2_cpu_if { + u32 vgic_hcr; + u32 vgic_vmcr; + u32 vgic_apr; + u32 vgic_lr[64]; + unsigned int used_lrs; +}; + +struct its_vm; + +struct its_vpe { + struct page *vpt_page; + struct its_vm *its_vm; + atomic_t vlpi_count; + int irq; + irq_hw_number_t vpe_db_lpi; + bool resident; + bool ready; + union { + struct { + int vpe_proxy_event; + bool idai; + }; + struct { + struct fwnode_handle *fwnode; + struct irq_domain *sgi_domain; + struct { + u8 priority; + bool enabled; + bool group; + } sgi_config[16]; + atomic_t vmapp_count; + }; + }; + raw_spinlock_t vpe_lock; + u16 col_idx; + u16 vpe_id; + bool pending_last; +}; + +struct vgic_v3_cpu_if { + u32 vgic_hcr; + u32 vgic_vmcr; + u32 vgic_sre; + u32 vgic_ap0r[4]; + u32 vgic_ap1r[4]; + u64 vgic_lr[16]; + struct its_vpe its_vpe; + unsigned int used_lrs; +}; + +enum vgic_irq_config { + VGIC_CONFIG_EDGE = 0, + VGIC_CONFIG_LEVEL = 1, +}; + +struct irq_ops; + +struct vgic_irq { + raw_spinlock_t irq_lock; + struct list_head lpi_list; + struct list_head ap_list; + struct kvm_vcpu *vcpu; + struct kvm_vcpu *target_vcpu; + u32 intid; + bool line_level; + bool pending_latch; + bool active; + bool enabled; + bool hw; + struct kref refcount; + u32 hwintid; + unsigned int host_irq; + union { + u8 targets; + u32 mpidr; + }; + u8 source; + u8 active_source; + u8 priority; + u8 group; + enum vgic_irq_config config; + struct irq_ops *ops; + void *owner; +}; + +enum iodev_type { + IODEV_CPUIF = 0, + IODEV_DIST = 1, + IODEV_REDIST = 2, + IODEV_ITS = 3, +}; + +struct kvm_io_device { + const struct kvm_io_device_ops *ops; +}; + +struct vgic_its; + +struct vgic_register_region; + +struct vgic_io_device { + gpa_t base_addr; + union { + struct kvm_vcpu *redist_vcpu; + struct vgic_its *its; + }; + const struct vgic_register_region *regions; + enum iodev_type iodev_type; + int nr_regions; + struct kvm_io_device dev; +}; + +struct vgic_redist_region; + +struct vgic_cpu { + union { + struct vgic_v2_cpu_if vgic_v2; + struct vgic_v3_cpu_if vgic_v3; + }; + struct vgic_irq private_irqs[32]; + raw_spinlock_t ap_list_lock; + struct list_head ap_list_head; + struct vgic_io_device rd_iodev; + struct vgic_redist_region *rdreg; + u32 rdreg_index; + u64 pendbaser; + bool lpis_enabled; + u32 num_pri_bits; + u32 num_id_bits; +}; + +struct kvm_irq_level { + union { + __u32 irq; + __s32 status; + }; + __u32 level; +}; + +struct arch_timer_context { + struct kvm_vcpu *vcpu; + struct kvm_irq_level irq; + struct hrtimer hrtimer; + bool loaded; + u32 host_timer_irq; + u32 host_timer_irq_flags; +}; + +struct arch_timer_cpu { + struct arch_timer_context timers[2]; + struct hrtimer bg_timer; + bool enabled; +}; + +struct kvm_pmc { + u8 idx; + struct perf_event *perf_event; +}; + +struct kvm_pmu { + int irq_num; + struct kvm_pmc pmc[32]; + long unsigned int chained[1]; + bool created; + bool irq_level; + struct irq_work overflow_work; +}; + +struct vcpu_reset_state { + long unsigned int pc; + long unsigned int r0; + bool be; + bool reset; +}; + +struct kvm_s2_mmu; + +struct kvm_vcpu_arch { + struct kvm_cpu_context ctxt; + void *sve_state; + unsigned int sve_max_vl; + struct kvm_s2_mmu *hw_mmu; + u64 hcr_el2; + u64 mdcr_el2; + u64 cptr_el2; + u64 mdcr_el2_host; + struct kvm_vcpu_fault_info fault; + u64 workaround_flags; + u64 flags; + struct kvm_guest_debug_arch *debug_ptr; + struct kvm_guest_debug_arch vcpu_debug_state; + struct kvm_guest_debug_arch external_debug_state; + struct thread_info *host_thread_info; + struct user_fpsimd_state *host_fpsimd_state; + struct { + struct kvm_guest_debug_arch regs; + u64 pmscr_el1; + u64 trfcr_el1; + } host_debug_state; + struct vgic_cpu vgic_cpu; + struct arch_timer_cpu timer_cpu; + struct kvm_pmu pmu; + struct { + u32 mdscr_el1; + } guest_debug_preserved; + bool power_off; + bool pause; + struct kvm_mmu_memory_cache mmu_page_cache; + int target; + long unsigned int features[1]; + bool has_run_once; + u64 vsesr_el2; + struct vcpu_reset_state reset_state; + bool sysregs_loaded_on_cpu; + struct { + u64 last_steal; + gpa_t base; + } steal; + long: 64; +}; + +struct kvm_vcpu_stat { + struct kvm_vcpu_stat_generic generic; + u64 hvc_exit_stat; + u64 wfe_exit_stat; + u64 wfi_exit_stat; + u64 mmio_exit_user; + u64 mmio_exit_kernel; + u64 signal_exits; + u64 exits; +}; + +struct kvm_dirty_gfn; + +struct kvm_dirty_ring { + u32 dirty_index; + u32 reset_index; + u32 size; + u32 soft_limit; + struct kvm_dirty_gfn *dirty_gfns; + int index; +}; + +struct kvm; + +struct kvm_run; + +struct kvm_vcpu { + struct kvm *kvm; + struct preempt_notifier preempt_notifier; + int cpu; + int vcpu_id; + int vcpu_idx; + int srcu_idx; + int mode; + u64 requests; + long unsigned int guest_debug; + int pre_pcpu; + struct list_head blocked_vcpu_list; + struct mutex mutex; + struct kvm_run *run; + struct rcuwait wait; + struct pid *pid; + int sigset_active; + sigset_t sigset; + unsigned int halt_poll_ns; + bool valid_wakeup; + int mmio_needed; + int mmio_read_completed; + int mmio_is_write; + int mmio_cur_fragment; + int mmio_nr_fragments; + struct kvm_mmio_fragment mmio_fragments[2]; + struct { + bool in_spin_loop; + bool dy_eligible; + } spin_loop; + bool preempted; + bool ready; + struct kvm_vcpu_arch arch; + struct kvm_vcpu_stat stat; + char stats_id[48]; + struct kvm_dirty_ring dirty_ring; + int last_used_slot; + long: 32; + long: 64; +}; + +struct preempt_ops { + void (*sched_in)(struct preempt_notifier *, int); + void (*sched_out)(struct preempt_notifier *, struct task_struct *); +}; + +enum kobject_action { + KOBJ_ADD = 0, + KOBJ_REMOVE = 1, + KOBJ_CHANGE = 2, + KOBJ_MOVE = 3, + KOBJ_ONLINE = 4, + KOBJ_OFFLINE = 5, + KOBJ_BIND = 6, + KOBJ_UNBIND = 7, +}; + +struct trace_print_flags { + long unsigned int mask; + const char *name; +}; + +enum mmu_notifier_event { + MMU_NOTIFY_UNMAP = 0, + MMU_NOTIFY_CLEAR = 1, + MMU_NOTIFY_PROTECTION_VMA = 2, + MMU_NOTIFY_PROTECTION_PAGE = 3, + MMU_NOTIFY_SOFT_DIRTY = 4, + MMU_NOTIFY_RELEASE = 5, + MMU_NOTIFY_MIGRATE = 6, + MMU_NOTIFY_EXCLUSIVE = 7, +}; + +struct mmu_notifier; + +struct mmu_notifier_range; + +struct mmu_notifier_ops { + void (*release)(struct mmu_notifier *, struct mm_struct *); + int (*clear_flush_young)(struct mmu_notifier *, struct mm_struct *, long unsigned int, long unsigned int); + int (*clear_young)(struct mmu_notifier *, struct mm_struct *, long unsigned int, long unsigned int); + int (*test_young)(struct mmu_notifier *, struct mm_struct *, long unsigned int); + void (*change_pte)(struct mmu_notifier *, struct mm_struct *, long unsigned int, pte_t); + int (*invalidate_range_start)(struct mmu_notifier *, const struct mmu_notifier_range *); + void (*invalidate_range_end)(struct mmu_notifier *, const struct mmu_notifier_range *); + void (*invalidate_range)(struct mmu_notifier *, struct mm_struct *, long unsigned int, long unsigned int); + struct mmu_notifier * (*alloc_notifier)(struct mm_struct *); + void (*free_notifier)(struct mmu_notifier *); +}; + +struct mmu_notifier { + struct hlist_node hlist; + const struct mmu_notifier_ops *ops; + struct mm_struct *mm; + struct callback_head rcu; + unsigned int users; +}; + +struct mmu_notifier_range { + struct vm_area_struct *vma; + struct mm_struct *mm; + long unsigned int start; + long unsigned int end; + unsigned int flags; + enum mmu_notifier_event event; + void *owner; +}; + +struct kvm_regs { + struct user_pt_regs regs; + __u64 sp_el1; + __u64 elr_el1; + __u64 spsr[5]; + long: 64; + struct user_fpsimd_state fp_regs; +}; + +struct kvm_sregs {}; + +struct kvm_fpu {}; + +struct kvm_debug_exit_arch { + __u32 hsr; + __u64 far; +}; + +struct kvm_sync_regs { + __u64 device_irq_level; +}; + +struct kvm_userspace_memory_region { + __u32 slot; + __u32 flags; + __u64 guest_phys_addr; + __u64 memory_size; + __u64 userspace_addr; +}; + +struct kvm_hyperv_exit { + __u32 type; + __u32 pad1; + union { + struct { + __u32 msr; + __u32 pad2; + __u64 control; + __u64 evt_page; + __u64 msg_page; + } synic; + struct { + __u64 input; + __u64 result; + __u64 params[2]; + } hcall; + struct { + __u32 msr; + __u32 pad2; + __u64 control; + __u64 status; + __u64 send_page; + __u64 recv_page; + __u64 pending_page; + } syndbg; + } u; +}; + +struct kvm_xen_exit { + __u32 type; + union { + struct { + __u32 longmode; + __u32 cpl; + __u64 input; + __u64 result; + __u64 params[6]; + } hcall; + } u; +}; + +struct kvm_run { + __u8 request_interrupt_window; + __u8 immediate_exit; + __u8 padding1[6]; + __u32 exit_reason; + __u8 ready_for_interrupt_injection; + __u8 if_flag; + __u16 flags; + __u64 cr8; + __u64 apic_base; + union { + struct { + __u64 hardware_exit_reason; + } hw; + struct { + __u64 hardware_entry_failure_reason; + __u32 cpu; + } fail_entry; + struct { + __u32 exception; + __u32 error_code; + } ex; + struct { + __u8 direction; + __u8 size; + __u16 port; + __u32 count; + __u64 data_offset; + } io; + struct { + struct kvm_debug_exit_arch arch; + } debug; + struct { + __u64 phys_addr; + __u8 data[8]; + __u32 len; + __u8 is_write; + } mmio; + struct { + __u64 nr; + __u64 args[6]; + __u64 ret; + __u32 longmode; + __u32 pad; + } hypercall; + struct { + __u64 rip; + __u32 is_write; + __u32 pad; + } tpr_access; + struct { + __u8 icptcode; + __u16 ipa; + __u32 ipb; + } s390_sieic; + __u64 s390_reset_flags; + struct { + __u64 trans_exc_code; + __u32 pgm_code; + } s390_ucontrol; + struct { + __u32 dcrn; + __u32 data; + __u8 is_write; + } dcr; + struct { + __u32 suberror; + __u32 ndata; + __u64 data[16]; + } internal; + struct { + __u32 suberror; + __u32 ndata; + __u64 flags; + union { + struct { + __u8 insn_size; + __u8 insn_bytes[15]; + }; + }; + } emulation_failure; + struct { + __u64 gprs[32]; + } osi; + struct { + __u64 nr; + __u64 ret; + __u64 args[9]; + } papr_hcall; + struct { + __u16 subchannel_id; + __u16 subchannel_nr; + __u32 io_int_parm; + __u32 io_int_word; + __u32 ipb; + __u8 dequeued; + } s390_tsch; + struct { + __u32 epr; + } epr; + struct { + __u32 type; + __u64 flags; + } system_event; + struct { + __u64 addr; + __u8 ar; + __u8 reserved; + __u8 fc; + __u8 sel1; + __u16 sel2; + } s390_stsi; + struct { + __u8 vector; + } eoi; + struct kvm_hyperv_exit hyperv; + struct { + __u64 esr_iss; + __u64 fault_ipa; + } arm_nisv; + struct { + __u8 error; + __u8 pad[7]; + __u32 reason; + __u32 index; + __u64 data; + } msr; + struct kvm_xen_exit xen; + struct { + long unsigned int extension_id; + long unsigned int function_id; + long unsigned int args[6]; + long unsigned int ret[2]; + } riscv_sbi; + char padding[256]; + }; + __u64 kvm_valid_regs; + __u64 kvm_dirty_regs; + union { + struct kvm_sync_regs regs; + char padding[2048]; + } s; +}; + +struct kvm_coalesced_mmio_zone { + __u64 addr; + __u32 size; + union { + __u32 pad; + __u32 pio; + }; +}; + +struct kvm_coalesced_mmio { + __u64 phys_addr; + __u32 len; + union { + __u32 pad; + __u32 pio; + }; + __u8 data[8]; +}; + +struct kvm_coalesced_mmio_ring { + __u32 first; + __u32 last; + struct kvm_coalesced_mmio coalesced_mmio[0]; +}; + +struct kvm_translation { + __u64 linear_address; + __u64 physical_address; + __u8 valid; + __u8 writeable; + __u8 usermode; + __u8 pad[5]; +}; + +struct kvm_dirty_log { + __u32 slot; + __u32 padding1; + union { + void *dirty_bitmap; + __u64 padding2; + }; +}; + +struct kvm_clear_dirty_log { + __u32 slot; + __u32 num_pages; + __u64 first_page; + union { + void *dirty_bitmap; + __u64 padding2; + }; +}; + +struct kvm_signal_mask { + __u32 len; + __u8 sigset[0]; +}; + +struct kvm_mp_state { + __u32 mp_state; +}; + +struct kvm_guest_debug { + __u32 control; + __u32 pad; + struct kvm_guest_debug_arch arch; +}; + +struct kvm_ioeventfd { + __u64 datamatch; + __u64 addr; + __u32 len; + __s32 fd; + __u32 flags; + __u8 pad[36]; +}; + +struct kvm_enable_cap { + __u32 cap; + __u32 flags; + __u64 args[4]; + __u8 pad[64]; +}; + +struct kvm_irq_routing_irqchip { + __u32 irqchip; + __u32 pin; +}; + +struct kvm_irq_routing_msi { + __u32 address_lo; + __u32 address_hi; + __u32 data; + union { + __u32 pad; + __u32 devid; + }; +}; + +struct kvm_irq_routing_s390_adapter { + __u64 ind_addr; + __u64 summary_addr; + __u64 ind_offset; + __u32 summary_offset; + __u32 adapter_id; +}; + +struct kvm_irq_routing_hv_sint { + __u32 vcpu; + __u32 sint; +}; + +struct kvm_irq_routing_entry { + __u32 gsi; + __u32 type; + __u32 flags; + __u32 pad; + union { + struct kvm_irq_routing_irqchip irqchip; + struct kvm_irq_routing_msi msi; + struct kvm_irq_routing_s390_adapter adapter; + struct kvm_irq_routing_hv_sint hv_sint; + __u32 pad[8]; + } u; +}; + +struct kvm_irq_routing { + __u32 nr; + __u32 flags; + struct kvm_irq_routing_entry entries[0]; +}; + +struct kvm_irqfd { + __u32 fd; + __u32 gsi; + __u32 flags; + __u32 resamplefd; + __u8 pad[16]; +}; + +struct kvm_msi { + __u32 address_lo; + __u32 address_hi; + __u32 data; + __u32 flags; + __u32 devid; + __u8 pad[12]; +}; + +struct kvm_create_device { + __u32 type; + __u32 fd; + __u32 flags; +}; + +struct kvm_device_attr { + __u32 flags; + __u32 group; + __u64 attr; + __u64 addr; +}; + +enum kvm_device_type { + KVM_DEV_TYPE_FSL_MPIC_20 = 1, + KVM_DEV_TYPE_FSL_MPIC_42 = 2, + KVM_DEV_TYPE_XICS = 3, + KVM_DEV_TYPE_VFIO = 4, + KVM_DEV_TYPE_ARM_VGIC_V2 = 5, + KVM_DEV_TYPE_FLIC = 6, + KVM_DEV_TYPE_ARM_VGIC_V3 = 7, + KVM_DEV_TYPE_ARM_VGIC_ITS = 8, + KVM_DEV_TYPE_XIVE = 9, + KVM_DEV_TYPE_ARM_PV_TIME = 10, + KVM_DEV_TYPE_MAX = 11, +}; + +struct kvm_dirty_gfn { + __u32 flags; + __u32 slot; + __u64 offset; +}; + +struct kvm_stats_header { + __u32 flags; + __u32 name_size; + __u32 num_desc; + __u32 id_offset; + __u32 desc_offset; + __u32 data_offset; +}; + +struct kvm_stats_desc { + __u32 flags; + __s16 exponent; + __u16 size; + __u32 offset; + __u32 bucket_size; + char name[0]; +}; + +struct its_vm { + struct fwnode_handle *fwnode; + struct irq_domain *domain; + struct page *vprop_page; + struct its_vpe **vpes; + int nr_vpes; + irq_hw_number_t db_lpi_base; + long unsigned int *db_bitmap; + int nr_db_lpis; + u32 vlpi_count[16]; +}; + +struct irq_ops { + long unsigned int flags; + bool (*get_input_level)(int); +}; + +struct kvm_device; + +struct vgic_its { + gpa_t vgic_its_base; + bool enabled; + struct vgic_io_device iodev; + struct kvm_device *dev; + u64 baser_device_table; + u64 baser_coll_table; + struct mutex cmd_lock; + u64 cbaser; + u32 creadr; + u32 cwriter; + u32 abi_rev; + struct mutex its_lock; + struct list_head device_list; + struct list_head collection_list; +}; + +struct vgic_register_region { + unsigned int reg_offset; + unsigned int len; + unsigned int bits_per_irq; + unsigned int access_flags; + union { + long unsigned int (*read)(struct kvm_vcpu *, gpa_t, unsigned int); + long unsigned int (*its_read)(struct kvm *, struct vgic_its *, gpa_t, unsigned int); + }; + union { + void (*write)(struct kvm_vcpu *, gpa_t, unsigned int, long unsigned int); + void (*its_write)(struct kvm *, struct vgic_its *, gpa_t, unsigned int, long unsigned int); + }; + long unsigned int (*uaccess_read)(struct kvm_vcpu *, gpa_t, unsigned int); + union { + int (*uaccess_write)(struct kvm_vcpu *, gpa_t, unsigned int, long unsigned int); + int (*uaccess_its_write)(struct kvm *, struct vgic_its *, gpa_t, unsigned int, long unsigned int); + }; +}; + +struct kvm_device_ops; + +struct kvm_device { + const struct kvm_device_ops *ops; + struct kvm *kvm; + void *private; + struct list_head vm_node; +}; + +struct vgic_redist_region { + u32 index; + gpa_t base; + u32 count; + u32 free_index; + struct list_head list; +}; + +struct vgic_state_iter; + +struct vgic_dist { + bool in_kernel; + bool ready; + bool initialized; + u32 vgic_model; + u32 implementation_rev; + bool v2_groups_user_writable; + bool msis_require_devid; + int nr_spis; + gpa_t vgic_dist_base; + union { + gpa_t vgic_cpu_base; + struct list_head rd_regions; + }; + bool enabled; + bool nassgireq; + struct vgic_irq *spis; + struct vgic_io_device dist_iodev; + bool has_its; + u64 propbaser; + raw_spinlock_t lpi_list_lock; + struct list_head lpi_list_head; + int lpi_list_count; + struct list_head lpi_translation_cache; + struct vgic_state_iter *iter; + struct its_vm its_vm; +}; + +struct kvm_vmid { + u64 vmid_gen; + u32 vmid; +}; + +struct kvm_pgtable; + +struct kvm_arch; + +struct kvm_s2_mmu { + struct kvm_vmid vmid; + phys_addr_t pgd_phys; + struct kvm_pgtable *pgt; + int *last_vcpu_ran; + struct kvm_arch *arch; +}; + +struct kvm_arch { + struct kvm_s2_mmu mmu; + u64 vtcr; + int max_vcpus; + struct vgic_dist vgic; + u32 psci_version; + bool return_nisv_io_abort_to_user; + long unsigned int *pmu_filter; + unsigned int pmuver; + u8 pfr0_csv2; + u8 pfr0_csv3; + bool mte_enabled; +}; + +struct kvm_vm_stat { + struct kvm_vm_stat_generic generic; +}; + +struct kvm_io_range { + gpa_t addr; + int len; + struct kvm_io_device *dev; +}; + +struct kvm_io_bus { + int dev_count; + int ioeventfd_count; + struct kvm_io_range range[0]; +}; + +struct kvm_gfn_range { + struct kvm_memory_slot *slot; + gfn_t start; + gfn_t end; + pte_t pte; + bool may_block; +}; + +enum { + OUTSIDE_GUEST_MODE = 0, + IN_GUEST_MODE = 1, + EXITING_GUEST_MODE = 2, + READING_SHADOW_PAGE_TABLES = 3, +}; + +struct kvm_host_map { + struct page *page; + void *hva; + kvm_pfn_t pfn; + kvm_pfn_t gfn; +}; + +struct kvm_memslots; + +struct kvm_irq_routing_table; + +struct kvm_stat_data; + +struct kvm { + spinlock_t mmu_lock; + struct mutex slots_lock; + struct mutex slots_arch_lock; + struct mm_struct *mm; + struct kvm_memslots *memslots[1]; + struct kvm_vcpu *vcpus[512]; + spinlock_t mn_invalidate_lock; + long unsigned int mn_active_invalidate_count; + struct rcuwait mn_memslots_update_rcuwait; + atomic_t online_vcpus; + int created_vcpus; + int last_boosted_vcpu; + struct list_head vm_list; + struct mutex lock; + struct kvm_io_bus *buses[4]; + struct { + spinlock_t lock; + struct list_head items; + struct list_head resampler_list; + struct mutex resampler_lock; + } irqfds; + struct list_head ioeventfds; + struct kvm_vm_stat stat; + struct kvm_arch arch; + refcount_t users_count; + struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; + spinlock_t ring_lock; + struct list_head coalesced_zones; + struct mutex irq_lock; + struct kvm_irq_routing_table *irq_routing; + struct hlist_head irq_ack_notifier_list; + struct mmu_notifier mmu_notifier; + long unsigned int mmu_notifier_seq; + long int mmu_notifier_count; + long unsigned int mmu_notifier_range_start; + long unsigned int mmu_notifier_range_end; + struct list_head devices; + u64 manual_dirty_log_protect; + struct dentry *debugfs_dentry; + struct kvm_stat_data **debugfs_stat_data; + struct srcu_struct srcu; + struct srcu_struct irq_srcu; + pid_t userspace_pid; + unsigned int max_halt_poll_ns; + u32 dirty_ring_size; + bool vm_bugged; + bool vm_dead; + char stats_id[48]; +}; + +struct kvm_irq_routing_table { + int chip[988]; + u32 nr_rt_entries; + struct hlist_head map[0]; +}; + +struct kvm_memslots { + u64 generation; + short int id_to_index[32767]; + atomic_t last_used_slot; + int used_slots; + struct kvm_memory_slot memslots[0]; +}; + +enum kvm_stat_kind { + KVM_STAT_VM = 0, + KVM_STAT_VCPU = 1, +}; + +struct _kvm_stats_desc; + +struct kvm_stat_data { + struct kvm *kvm; + const struct _kvm_stats_desc *desc; + enum kvm_stat_kind kind; +}; + +enum kvm_mr_change { + KVM_MR_CREATE = 0, + KVM_MR_DELETE = 1, + KVM_MR_MOVE = 2, + KVM_MR_FLAGS_ONLY = 3, +}; + +struct _kvm_stats_desc { + struct kvm_stats_desc desc; + char name[48]; +}; + +struct kvm_device_ops { + const char *name; + int (*create)(struct kvm_device *, u32); + void (*init)(struct kvm_device *); + void (*destroy)(struct kvm_device *); + void (*release)(struct kvm_device *); + int (*set_attr)(struct kvm_device *, struct kvm_device_attr *); + int (*get_attr)(struct kvm_device *, struct kvm_device_attr *); + int (*has_attr)(struct kvm_device *, struct kvm_device_attr *); + long int (*ioctl)(struct kvm_device *, unsigned int, long unsigned int); + int (*mmap)(struct kvm_device *, struct vm_area_struct *); +}; + +typedef int (*kvm_vm_thread_fn_t)(struct kvm *, uintptr_t); + +struct miscdevice { + int minor; + const char *name; + const struct file_operations *fops; + struct list_head list; + struct device *parent; + struct device *this_device; + const struct attribute_group **groups; + const char *nodename; + umode_t mode; +}; + +struct syscore_ops { + struct list_head node; + int (*suspend)(); + void (*resume)(); + void (*shutdown)(); +}; + +struct trace_event_raw_kvm_userspace_exit { + struct trace_entry ent; + __u32 reason; + int errno; + char __data[0]; +}; + +struct trace_event_raw_kvm_vcpu_wakeup { + struct trace_entry ent; + __u64 ns; + bool waited; + bool valid; + char __data[0]; +}; + +struct trace_event_raw_kvm_set_irq { + struct trace_entry ent; + unsigned int gsi; + int level; + int irq_source_id; + char __data[0]; +}; + +struct trace_event_raw_kvm_ack_irq { + struct trace_entry ent; + unsigned int irqchip; + unsigned int pin; + char __data[0]; +}; + +struct trace_event_raw_kvm_mmio { + struct trace_entry ent; + u32 type; + u32 len; + u64 gpa; + u64 val; + char __data[0]; +}; + +struct trace_event_raw_kvm_fpu { + struct trace_entry ent; + u32 load; + char __data[0]; +}; + +struct trace_event_raw_kvm_halt_poll_ns { + struct trace_entry ent; + bool grow; + unsigned int vcpu_id; + unsigned int new; + unsigned int old; + char __data[0]; +}; + +struct trace_event_raw_kvm_dirty_ring_push { + struct trace_entry ent; + int index; + u32 dirty_index; + u32 reset_index; + u32 slot; + u64 offset; + char __data[0]; +}; + +struct trace_event_raw_kvm_dirty_ring_reset { + struct trace_entry ent; + int index; + u32 dirty_index; + u32 reset_index; + char __data[0]; +}; + +struct trace_event_raw_kvm_dirty_ring_exit { + struct trace_entry ent; + int vcpu_id; + char __data[0]; +}; + +struct trace_event_raw_kvm_unmap_hva_range { + struct trace_entry ent; + long unsigned int start; + long unsigned int end; + char __data[0]; +}; + +struct trace_event_raw_kvm_set_spte_hva { + struct trace_entry ent; + long unsigned int hva; + char __data[0]; +}; + +struct trace_event_raw_kvm_age_hva { + struct trace_entry ent; + long unsigned int start; + long unsigned int end; + char __data[0]; +}; + +struct trace_event_raw_kvm_test_age_hva { + struct trace_entry ent; + long unsigned int hva; + char __data[0]; +}; + +struct trace_event_data_offsets_kvm_userspace_exit {}; + +struct trace_event_data_offsets_kvm_vcpu_wakeup {}; + +struct trace_event_data_offsets_kvm_set_irq {}; + +struct trace_event_data_offsets_kvm_ack_irq {}; + +struct trace_event_data_offsets_kvm_mmio {}; + +struct trace_event_data_offsets_kvm_fpu {}; + +struct trace_event_data_offsets_kvm_halt_poll_ns {}; + +struct trace_event_data_offsets_kvm_dirty_ring_push {}; + +struct trace_event_data_offsets_kvm_dirty_ring_reset {}; + +struct trace_event_data_offsets_kvm_dirty_ring_exit {}; + +struct trace_event_data_offsets_kvm_unmap_hva_range {}; + +struct trace_event_data_offsets_kvm_set_spte_hva {}; + +struct trace_event_data_offsets_kvm_age_hva {}; + +struct trace_event_data_offsets_kvm_test_age_hva {}; + +typedef void (*btf_trace_kvm_userspace_exit)(void *, __u32, int); + +typedef void (*btf_trace_kvm_vcpu_wakeup)(void *, __u64, bool, bool); + +typedef void (*btf_trace_kvm_set_irq)(void *, unsigned int, int, int); + +typedef void (*btf_trace_kvm_ack_irq)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_kvm_mmio)(void *, int, int, u64, void *); + +typedef void (*btf_trace_kvm_fpu)(void *, int); + +typedef void (*btf_trace_kvm_halt_poll_ns)(void *, bool, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_kvm_dirty_ring_push)(void *, struct kvm_dirty_ring *, u32, u64); + +typedef void (*btf_trace_kvm_dirty_ring_reset)(void *, struct kvm_dirty_ring *); + +typedef void (*btf_trace_kvm_dirty_ring_exit)(void *, struct kvm_vcpu *); + +typedef void (*btf_trace_kvm_unmap_hva_range)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_kvm_set_spte_hva)(void *, long unsigned int); + +typedef void (*btf_trace_kvm_age_hva)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_kvm_test_age_hva)(void *, long unsigned int); + +typedef bool (*hva_handler_t)(struct kvm *, struct kvm_gfn_range *); + +typedef void (*on_lock_fn_t)(struct kvm *, long unsigned int, long unsigned int); + +struct kvm_hva_range { + long unsigned int start; + long unsigned int end; + pte_t pte; + hva_handler_t handler; + on_lock_fn_t on_lock; + bool flush_on_ret; + bool may_block; +}; + +struct kvm_cpu_compat_check { + void *opaque; + int *ret; +}; + +struct kvm_vm_worker_thread_context { + struct kvm *kvm; + struct task_struct *parent; + struct completion init_done; + kvm_vm_thread_fn_t thread_fn; + uintptr_t data; + int err; +}; + +struct kvm_coalesced_mmio_dev { + struct list_head list; + struct kvm_io_device dev; + struct kvm *kvm; + struct kvm_coalesced_mmio_zone zone; +}; + +enum { + WORK_STRUCT_PENDING_BIT = 0, + WORK_STRUCT_INACTIVE_BIT = 1, + WORK_STRUCT_PWQ_BIT = 2, + WORK_STRUCT_LINKED_BIT = 3, + WORK_STRUCT_COLOR_SHIFT = 4, + WORK_STRUCT_COLOR_BITS = 4, + WORK_STRUCT_PENDING = 1, + WORK_STRUCT_INACTIVE = 2, + WORK_STRUCT_PWQ = 4, + WORK_STRUCT_LINKED = 8, + WORK_STRUCT_STATIC = 0, + WORK_NR_COLORS = 16, + WORK_CPU_UNBOUND = 256, + WORK_STRUCT_FLAG_BITS = 8, + WORK_OFFQ_FLAG_BASE = 4, + __WORK_OFFQ_CANCELING = 4, + WORK_OFFQ_CANCELING = 16, + WORK_OFFQ_FLAG_BITS = 1, + WORK_OFFQ_POOL_SHIFT = 5, + WORK_OFFQ_LEFT = 59, + WORK_OFFQ_POOL_BITS = 31, + WORK_OFFQ_POOL_NONE = 2147483647, + WORK_STRUCT_FLAG_MASK = 255, + WORK_STRUCT_WQ_DATA_MASK = 4294967040, + WORK_STRUCT_NO_POOL = 4294967264, + WORK_BUSY_PENDING = 1, + WORK_BUSY_RUNNING = 2, + WORKER_DESC_LEN = 24, +}; + +struct irq_bypass_consumer; + +struct irq_bypass_producer { + struct list_head node; + void *token; + int irq; + int (*add_consumer)(struct irq_bypass_producer *, struct irq_bypass_consumer *); + void (*del_consumer)(struct irq_bypass_producer *, struct irq_bypass_consumer *); + void (*stop)(struct irq_bypass_producer *); + void (*start)(struct irq_bypass_producer *); +}; + +struct irq_bypass_consumer { + struct list_head node; + void *token; + int (*add_producer)(struct irq_bypass_consumer *, struct irq_bypass_producer *); + void (*del_producer)(struct irq_bypass_consumer *, struct irq_bypass_producer *); + void (*stop)(struct irq_bypass_consumer *); + void (*start)(struct irq_bypass_consumer *); +}; + +enum { + kvm_ioeventfd_flag_nr_datamatch = 0, + kvm_ioeventfd_flag_nr_pio = 1, + kvm_ioeventfd_flag_nr_deassign = 2, + kvm_ioeventfd_flag_nr_virtio_ccw_notify = 3, + kvm_ioeventfd_flag_nr_fast_mmio = 4, + kvm_ioeventfd_flag_nr_max = 5, +}; + +struct fd { + struct file *file; + unsigned int flags; +}; + +struct kvm_s390_adapter_int { + u64 ind_addr; + u64 summary_addr; + u64 ind_offset; + u32 summary_offset; + u32 adapter_id; +}; + +struct kvm_hv_sint { + u32 vcpu; + u32 sint; +}; + +struct kvm_kernel_irq_routing_entry { + u32 gsi; + u32 type; + int (*set)(struct kvm_kernel_irq_routing_entry *, struct kvm *, int, int, bool); + union { + struct { + unsigned int irqchip; + unsigned int pin; + } irqchip; + struct { + u32 address_lo; + u32 address_hi; + u32 data; + u32 flags; + u32 devid; + } msi; + struct kvm_s390_adapter_int adapter; + struct kvm_hv_sint hv_sint; + }; + struct hlist_node link; +}; + +struct kvm_irq_ack_notifier { + struct hlist_node link; + unsigned int gsi; + void (*irq_acked)(struct kvm_irq_ack_notifier *); +}; + +typedef struct poll_table_struct poll_table; + +struct kvm_kernel_irqfd_resampler { + struct kvm *kvm; + struct list_head list; + struct kvm_irq_ack_notifier notifier; + struct list_head link; +}; + +struct kvm_kernel_irqfd { + struct kvm *kvm; + wait_queue_entry_t wait; + struct kvm_kernel_irq_routing_entry irq_entry; + seqcount_spinlock_t irq_entry_sc; + int gsi; + struct work_struct inject; + struct kvm_kernel_irqfd_resampler *resampler; + struct eventfd_ctx *resamplefd; + struct list_head resampler_link; + struct eventfd_ctx *eventfd; + struct list_head list; + poll_table pt; + struct work_struct shutdown; + struct irq_bypass_consumer consumer; + struct irq_bypass_producer *producer; +}; + +struct _ioeventfd { + struct list_head list; + u64 addr; + int length; + struct eventfd_ctx *eventfd; + u64 datamatch; + struct kvm_io_device dev; + u8 bus_idx; + bool wildcard; +}; + +struct vfio_group; + +struct kvm_vfio_group { + struct list_head node; + struct vfio_group *vfio_group; +}; + +struct kvm_vfio { + struct list_head group_list; + struct mutex lock; + bool noncoherent; +}; + +struct psci_0_1_function_ids { + u32 cpu_suspend; + u32 cpu_on; + u32 cpu_off; + u32 migrate; +}; + +struct kvm_vcpu_init { + __u32 target; + __u32 features[7]; +}; + +struct kvm_vcpu_events { + struct { + __u8 serror_pending; + __u8 serror_has_esr; + __u8 ext_dabt_pending; + __u8 pad[5]; + __u64 serror_esr; + } exception; + __u32 reserved[12]; +}; + +struct kvm_arm_copy_mte_tags { + __u64 guest_ipa; + __u64 length; + void *addr; + __u64 flags; + __u64 reserved[2]; +}; + +struct kvm_reg_list { + __u64 n; + __u64 reg[0]; +}; + +struct kvm_one_reg { + __u64 id; + __u64 addr; +}; + +struct kvm_arm_device_addr { + __u64 id; + __u64 addr; +}; + +enum __kvm_host_smccc_func { + __KVM_HOST_SMCCC_FUNC___kvm_get_mdcr_el2 = 1, + __KVM_HOST_SMCCC_FUNC___pkvm_init = 2, + __KVM_HOST_SMCCC_FUNC___pkvm_create_private_mapping = 3, + __KVM_HOST_SMCCC_FUNC___pkvm_cpu_set_vector = 4, + __KVM_HOST_SMCCC_FUNC___kvm_enable_ssbs = 5, + __KVM_HOST_SMCCC_FUNC___vgic_v3_init_lrs = 6, + __KVM_HOST_SMCCC_FUNC___vgic_v3_get_gic_config = 7, + __KVM_HOST_SMCCC_FUNC___pkvm_prot_finalize = 8, + __KVM_HOST_SMCCC_FUNC___pkvm_host_share_hyp = 9, + __KVM_HOST_SMCCC_FUNC___kvm_adjust_pc = 10, + __KVM_HOST_SMCCC_FUNC___kvm_vcpu_run = 11, + __KVM_HOST_SMCCC_FUNC___kvm_flush_vm_context = 12, + __KVM_HOST_SMCCC_FUNC___kvm_tlb_flush_vmid_ipa = 13, + __KVM_HOST_SMCCC_FUNC___kvm_tlb_flush_vmid = 14, + __KVM_HOST_SMCCC_FUNC___kvm_flush_cpu_context = 15, + __KVM_HOST_SMCCC_FUNC___kvm_timer_set_cntvoff = 16, + __KVM_HOST_SMCCC_FUNC___vgic_v3_read_vmcr = 17, + __KVM_HOST_SMCCC_FUNC___vgic_v3_write_vmcr = 18, + __KVM_HOST_SMCCC_FUNC___vgic_v3_save_aprs = 19, + __KVM_HOST_SMCCC_FUNC___vgic_v3_restore_aprs = 20, + __KVM_HOST_SMCCC_FUNC___pkvm_vcpu_init_traps = 21, +}; + +struct kvm_nvhe_init_params { + long unsigned int mair_el2; + long unsigned int tcr_el2; + long unsigned int tpidr_el2; + long unsigned int stack_hyp_va; + phys_addr_t pgd_pa; + long unsigned int hcr_el2; + long unsigned int vttbr; + long unsigned int vtcr; +}; + +enum vgic_type { + VGIC_V2 = 0, + VGIC_V3 = 1, +}; + +struct vgic_global { + enum vgic_type type; + phys_addr_t vcpu_base; + void *vcpu_base_va; + void *vcpu_hyp_va; + void *vctrl_base; + void *vctrl_hyp; + int nr_lr; + unsigned int maint_irq; + int max_gic_vcpus; + bool can_emulate_gicv2; + bool has_gicv4; + bool has_gicv4_1; + bool no_hw_deactivation; + struct static_key_false gicv3_cpuif; + u32 ich_vtr_el2; +}; + +enum kvm_arch_timers { + TIMER_PTIMER = 0, + TIMER_VTIMER = 1, + NR_KVM_TIMERS = 2, +}; + +struct timer_map { + struct arch_timer_context *direct_vtimer; + struct arch_timer_context *direct_ptimer; + struct arch_timer_context *emul_ptimer; +}; + +typedef u64 kvm_pte_t; + +enum kvm_pgtable_stage2_flags { + KVM_PGTABLE_S2_NOFWB = 1, + KVM_PGTABLE_S2_IDMAP = 2, +}; + +enum kvm_pgtable_prot { + KVM_PGTABLE_PROT_X = 1, + KVM_PGTABLE_PROT_W = 2, + KVM_PGTABLE_PROT_R = 4, + KVM_PGTABLE_PROT_DEVICE = 8, + KVM_PGTABLE_PROT_SW0 = 0, + KVM_PGTABLE_PROT_SW1 = 0, + KVM_PGTABLE_PROT_SW2 = 0, + KVM_PGTABLE_PROT_SW3 = 0, +}; + +typedef bool (*kvm_pgtable_force_pte_cb_t)(u64, u64, enum kvm_pgtable_prot); + +struct kvm_pgtable_mm_ops; + +struct kvm_pgtable { + u32 ia_bits; + u32 start_level; + kvm_pte_t *pgd; + struct kvm_pgtable_mm_ops *mm_ops; + struct kvm_s2_mmu *mmu; + enum kvm_pgtable_stage2_flags flags; + kvm_pgtable_force_pte_cb_t force_pte_cb; +}; + +struct kvm_pmu_events { + u32 events_host; + u32 events_guest; +}; + +struct kvm_host_data { + struct kvm_cpu_context host_ctxt; + struct kvm_pmu_events pmu_events; + long: 64; +}; + +struct kvm_host_psci_config { + u32 version; + struct psci_0_1_function_ids function_ids_0_1; + bool psci_0_1_cpu_suspend_implemented; + bool psci_0_1_cpu_on_implemented; + bool psci_0_1_cpu_off_implemented; + bool psci_0_1_migrate_implemented; +}; + +struct trace_event_raw_kvm_entry { + struct trace_entry ent; + long unsigned int vcpu_pc; + char __data[0]; +}; + +struct trace_event_raw_kvm_exit { + struct trace_entry ent; + int ret; + unsigned int esr_ec; + long unsigned int vcpu_pc; + char __data[0]; +}; + +struct trace_event_raw_kvm_guest_fault { + struct trace_entry ent; + long unsigned int vcpu_pc; + long unsigned int hsr; + long unsigned int hxfar; + long long unsigned int ipa; + char __data[0]; +}; + +struct trace_event_raw_kvm_access_fault { + struct trace_entry ent; + long unsigned int ipa; + char __data[0]; +}; + +struct trace_event_raw_kvm_irq_line { + struct trace_entry ent; + unsigned int type; + int vcpu_idx; + int irq_num; + int level; + char __data[0]; +}; + +struct trace_event_raw_kvm_mmio_emulate { + struct trace_entry ent; + long unsigned int vcpu_pc; + long unsigned int instr; + long unsigned int cpsr; + char __data[0]; +}; + +struct trace_event_raw_kvm_set_way_flush { + struct trace_entry ent; + long unsigned int vcpu_pc; + bool cache; + char __data[0]; +}; + +struct trace_event_raw_kvm_toggle_cache { + struct trace_entry ent; + long unsigned int vcpu_pc; + bool was; + bool now; + char __data[0]; +}; + +struct trace_event_raw_kvm_timer_update_irq { + struct trace_entry ent; + long unsigned int vcpu_id; + __u32 irq; + int level; + char __data[0]; +}; + +struct trace_event_raw_kvm_get_timer_map { + struct trace_entry ent; + long unsigned int vcpu_id; + int direct_vtimer; + int direct_ptimer; + int emul_ptimer; + char __data[0]; +}; + +struct trace_event_raw_kvm_timer_save_state { + struct trace_entry ent; + long unsigned int ctl; + long long unsigned int cval; + int timer_idx; + char __data[0]; +}; + +struct trace_event_raw_kvm_timer_restore_state { + struct trace_entry ent; + long unsigned int ctl; + long long unsigned int cval; + int timer_idx; + char __data[0]; +}; + +struct trace_event_raw_kvm_timer_hrtimer_expire { + struct trace_entry ent; + int timer_idx; + char __data[0]; +}; + +struct trace_event_raw_kvm_timer_emulate { + struct trace_entry ent; + int timer_idx; + bool should_fire; + char __data[0]; +}; + +struct trace_event_data_offsets_kvm_entry {}; + +struct trace_event_data_offsets_kvm_exit {}; + +struct trace_event_data_offsets_kvm_guest_fault {}; + +struct trace_event_data_offsets_kvm_access_fault {}; + +struct trace_event_data_offsets_kvm_irq_line {}; + +struct trace_event_data_offsets_kvm_mmio_emulate {}; + +struct trace_event_data_offsets_kvm_set_way_flush {}; + +struct trace_event_data_offsets_kvm_toggle_cache {}; + +struct trace_event_data_offsets_kvm_timer_update_irq {}; + +struct trace_event_data_offsets_kvm_get_timer_map {}; + +struct trace_event_data_offsets_kvm_timer_save_state {}; + +struct trace_event_data_offsets_kvm_timer_restore_state {}; + +struct trace_event_data_offsets_kvm_timer_hrtimer_expire {}; + +struct trace_event_data_offsets_kvm_timer_emulate {}; + +typedef void (*btf_trace_kvm_entry)(void *, long unsigned int); + +typedef void (*btf_trace_kvm_exit)(void *, int, unsigned int, long unsigned int); + +typedef void (*btf_trace_kvm_guest_fault)(void *, long unsigned int, long unsigned int, long unsigned int, long long unsigned int); + +typedef void (*btf_trace_kvm_access_fault)(void *, long unsigned int); + +typedef void (*btf_trace_kvm_irq_line)(void *, unsigned int, int, int, int); + +typedef void (*btf_trace_kvm_mmio_emulate)(void *, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_kvm_set_way_flush)(void *, long unsigned int, bool); + +typedef void (*btf_trace_kvm_toggle_cache)(void *, long unsigned int, bool, bool); + +typedef void (*btf_trace_kvm_timer_update_irq)(void *, long unsigned int, __u32, int); + +typedef void (*btf_trace_kvm_get_timer_map)(void *, long unsigned int, struct timer_map *); + +typedef void (*btf_trace_kvm_timer_save_state)(void *, struct arch_timer_context *); + +typedef void (*btf_trace_kvm_timer_restore_state)(void *, struct arch_timer_context *); + +typedef void (*btf_trace_kvm_timer_hrtimer_expire)(void *, struct arch_timer_context *); + +typedef void (*btf_trace_kvm_timer_emulate)(void *, struct arch_timer_context *, bool); + +struct kvm_pgtable_mm_ops { + void * (*zalloc_page)(void *); + void * (*zalloc_pages_exact)(size_t); + void (*free_pages_exact)(void *, size_t); + void (*get_page)(void *); + void (*put_page)(void *); + int (*page_count)(void *); + void * (*phys_to_virt)(phys_addr_t); + phys_addr_t (*virt_to_phys)(void *); + void (*dcache_clean_inval_poc)(void *, size_t); + void (*icache_inval_pou)(void *, size_t); +}; + +struct hugepage_subpool { + spinlock_t lock; + long int count; + long int max_hpages; + long int used_hpages; + struct hstate *hstate; + long int min_hpages; + long int rsv_hpages; +}; + +struct hugetlbfs_sb_info { + long int max_inodes; + long int free_inodes; + spinlock_t stat_lock; + struct hstate *hstate; + struct hugepage_subpool *spool; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +enum clocksource_ids { + CSID_GENERIC = 0, + CSID_ARM_ARCH_COUNTER = 1, + CSID_MAX = 2, +}; + +struct system_time_snapshot { + u64 cycles; + ktime_t real; + ktime_t raw; + enum clocksource_ids cs_id; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; +}; + +struct sys_reg_params { + u8 Op0; + u8 Op1; + u8 CRn; + u8 CRm; + u8 Op2; + u64 regval; + bool is_write; +}; + +struct sys_reg_desc { + const char *name; + enum { + AA32_ZEROHIGH = 0, + AA32_LO = 1, + AA32_HI = 2, + } aarch32_map; + u8 Op0; + u8 Op1; + u8 CRn; + u8 CRm; + u8 Op2; + bool (*access)(struct kvm_vcpu *, struct sys_reg_params *, const struct sys_reg_desc *); + void (*reset)(struct kvm_vcpu *, const struct sys_reg_desc *); + int reg; + u64 val; + int (*__get_user)(struct kvm_vcpu *, const struct sys_reg_desc *, const struct kvm_one_reg *, void *); + int (*set_user)(struct kvm_vcpu *, const struct sys_reg_desc *, const struct kvm_one_reg *, void *); + unsigned int (*visibility)(const struct kvm_vcpu *, const struct sys_reg_desc *); +}; + +struct trace_event_raw_kvm_wfx_arm64 { + struct trace_entry ent; + long unsigned int vcpu_pc; + bool is_wfe; + char __data[0]; +}; + +struct trace_event_raw_kvm_hvc_arm64 { + struct trace_entry ent; + long unsigned int vcpu_pc; + long unsigned int r0; + long unsigned int imm; + char __data[0]; +}; + +struct trace_event_raw_kvm_arm_setup_debug { + struct trace_entry ent; + struct kvm_vcpu *vcpu; + __u32 guest_debug; + char __data[0]; +}; + +struct trace_event_raw_kvm_arm_clear_debug { + struct trace_entry ent; + __u32 guest_debug; + char __data[0]; +}; + +struct trace_event_raw_kvm_arm_set_dreg32 { + struct trace_entry ent; + const char *name; + __u64 value; + char __data[0]; +}; + +struct trace_event_raw_kvm_arm_set_regset { + struct trace_entry ent; + const char *name; + int len; + u64 ctrls[16]; + u64 values[16]; + char __data[0]; +}; + +struct trace_event_raw_trap_reg { + struct trace_entry ent; + const char *fn; + int reg; + bool is_write; + u64 write_value; + char __data[0]; +}; + +struct trace_event_raw_kvm_handle_sys_reg { + struct trace_entry ent; + long unsigned int hsr; + char __data[0]; +}; + +struct trace_event_raw_kvm_sys_access { + struct trace_entry ent; + long unsigned int vcpu_pc; + bool is_write; + const char *name; + u8 Op0; + u8 Op1; + u8 CRn; + u8 CRm; + u8 Op2; + char __data[0]; +}; + +struct trace_event_raw_kvm_set_guest_debug { + struct trace_entry ent; + struct kvm_vcpu *vcpu; + __u32 guest_debug; + char __data[0]; +}; + +struct trace_event_data_offsets_kvm_wfx_arm64 {}; + +struct trace_event_data_offsets_kvm_hvc_arm64 {}; + +struct trace_event_data_offsets_kvm_arm_setup_debug {}; + +struct trace_event_data_offsets_kvm_arm_clear_debug {}; + +struct trace_event_data_offsets_kvm_arm_set_dreg32 {}; + +struct trace_event_data_offsets_kvm_arm_set_regset {}; + +struct trace_event_data_offsets_trap_reg {}; + +struct trace_event_data_offsets_kvm_handle_sys_reg {}; + +struct trace_event_data_offsets_kvm_sys_access {}; + +struct trace_event_data_offsets_kvm_set_guest_debug {}; + +typedef void (*btf_trace_kvm_wfx_arm64)(void *, long unsigned int, bool); + +typedef void (*btf_trace_kvm_hvc_arm64)(void *, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_kvm_arm_setup_debug)(void *, struct kvm_vcpu *, __u32); + +typedef void (*btf_trace_kvm_arm_clear_debug)(void *, __u32); + +typedef void (*btf_trace_kvm_arm_set_dreg32)(void *, const char *, __u64); + +typedef void (*btf_trace_kvm_arm_set_regset)(void *, const char *, int, __u64 *, __u64 *); + +typedef void (*btf_trace_trap_reg)(void *, const char *, int, bool, u64); + +typedef void (*btf_trace_kvm_handle_sys_reg)(void *, long unsigned int); + +typedef void (*btf_trace_kvm_sys_access)(void *, long unsigned int, struct sys_reg_params *, const struct sys_reg_desc *); + +typedef void (*btf_trace_kvm_set_guest_debug)(void *, struct kvm_vcpu *, __u32); + +typedef int (*exit_handle_fn)(struct kvm_vcpu *); + +struct sve_state_reg_region { + unsigned int koffset; + unsigned int klen; + unsigned int upad; +}; + +struct va_format { + const char *fmt; + va_list *va; +}; + +enum kvm_arch_timer_regs { + TIMER_REG_CNT = 0, + TIMER_REG_CVAL = 1, + TIMER_REG_TVAL = 2, + TIMER_REG_CTL = 3, +}; + +struct vgic_vmcr { + u32 grpen0; + u32 grpen1; + u32 ackctl; + u32 fiqen; + u32 cbpr; + u32 eoim; + u32 abpr; + u32 bpr; + u32 pmr; +}; + +struct cyclecounter { + u64 (*read)(const struct cyclecounter *); + u64 mask; + u32 mult; + u32 shift; +}; + +struct timecounter { + const struct cyclecounter *cc; + u64 cycle_last; + u64 nsec; + u64 mask; + u64 frac; +}; + +struct arch_timer_kvm_info { + struct timecounter timecounter; + int virtual_irq; + int physical_irq; +}; + +enum hrtimer_mode { + HRTIMER_MODE_ABS = 0, + HRTIMER_MODE_REL = 1, + HRTIMER_MODE_PINNED = 2, + HRTIMER_MODE_SOFT = 4, + HRTIMER_MODE_HARD = 8, + HRTIMER_MODE_ABS_PINNED = 2, + HRTIMER_MODE_REL_PINNED = 3, + HRTIMER_MODE_ABS_SOFT = 4, + HRTIMER_MODE_REL_SOFT = 5, + HRTIMER_MODE_ABS_PINNED_SOFT = 6, + HRTIMER_MODE_REL_PINNED_SOFT = 7, + HRTIMER_MODE_ABS_HARD = 8, + HRTIMER_MODE_REL_HARD = 9, + HRTIMER_MODE_ABS_PINNED_HARD = 10, + HRTIMER_MODE_REL_PINNED_HARD = 11, +}; + +enum { + IRQCHIP_FWNODE_REAL = 0, + IRQCHIP_FWNODE_NAMED = 1, + IRQCHIP_FWNODE_NAMED_ID = 2, +}; + +typedef int (*list_cmp_func_t)(void *, const struct list_head *, const struct list_head *); + +struct trace_event_raw_vgic_update_irq_pending { + struct trace_entry ent; + long unsigned int vcpu_id; + __u32 irq; + bool level; + char __data[0]; +}; + +struct trace_event_data_offsets_vgic_update_irq_pending {}; + +typedef void (*btf_trace_vgic_update_irq_pending)(void *, long unsigned int, __u32, bool); + +enum gic_type { + GIC_V2 = 0, + GIC_V3 = 1, +}; + +struct gic_kvm_info { + enum gic_type type; + struct resource vcpu; + unsigned int maint_irq; + bool no_maint_irq_mask; + struct resource vctrl; + bool has_v4; + bool has_v4_1; + bool no_hw_deactivation; +}; + +struct its_vlpi_map { + struct its_vm *vm; + struct its_vpe *vpe; + u32 vintid; + u8 properties; + bool db_enabled; +}; + +struct vgic_reg_attr { + struct kvm_vcpu *vcpu; + gpa_t addr; +}; + +struct its_device { + struct list_head dev_list; + struct list_head itt_head; + u32 num_eventid_bits; + gpa_t itt_addr; + u32 device_id; +}; + +struct its_collection { + struct list_head coll_list; + u32 collection_id; + u32 target_addr; +}; + +struct its_ite { + struct list_head ite_list; + struct vgic_irq *irq; + struct its_collection *collection; + u32 event_id; +}; + +struct vgic_translation_cache_entry { + struct list_head entry; + phys_addr_t db; + u32 devid; + u32 eventid; + struct vgic_irq *irq; +}; + +struct vgic_its_abi { + int cte_esz; + int dte_esz; + int ite_esz; + int (*save_tables)(struct vgic_its *); + int (*restore_tables)(struct vgic_its *); + int (*commit)(struct vgic_its *); +}; + +typedef int (*entry_fn_t)(struct vgic_its *, u32, void *, void *); + +struct vgic_state_iter { + int nr_cpus; + int nr_spis; + int nr_lpis; + int dist_id; + int vcpu_id; + int intid; + int lpi_idx; + u32 *lpi_array; +}; + +struct kvm_pmu_event_filter { + __u16 base_event; + __u16 nevents; + __u8 action; + __u8 pad[3]; +}; + +struct kvm_exception_table_entry { + int insn; + int fixup; +}; + +typedef bool (*exit_handler_fn)(struct kvm_vcpu *, u64 *); + +struct tlb_inv_context { + long unsigned int flags; + u64 tcr; + u64 sctlr; +}; + +enum exception_type { + except_type_sync = 0, + except_type_irq = 128, + except_type_fiq = 256, + except_type_serror = 384, +}; + +union hyp_spinlock { + u32 __val; + struct { + u16 owner; + u16 next; + }; +}; + +typedef union hyp_spinlock hyp_spinlock_t; + +struct host_kvm { + struct kvm_arch arch; + struct kvm_pgtable pgt; + struct kvm_pgtable_mm_ops mm_ops; + hyp_spinlock_t lock; +}; + +struct tlb_inv_context___2 { + u64 tcr; +}; + +typedef void (*hcall_t)(struct kvm_cpu_context *); + +struct psci_boot_args { + atomic_t lock; + long unsigned int pc; + long unsigned int r0; +}; + +struct hyp_page { + short unsigned int refcount; + short unsigned int order; +}; + +struct hyp_pool { + hyp_spinlock_t lock; + struct list_head free_area[11]; + phys_addr_t range_start; + phys_addr_t range_end; + short unsigned int max_order; +}; + +enum kvm_pgtable_walk_flags { + KVM_PGTABLE_WALK_LEAF = 1, + KVM_PGTABLE_WALK_TABLE_PRE = 2, + KVM_PGTABLE_WALK_TABLE_POST = 4, +}; + +typedef int (*kvm_pgtable_visitor_fn_t)(u64, u64, u32, kvm_pte_t *, enum kvm_pgtable_walk_flags, void * const); + +struct kvm_pgtable_walker { + const kvm_pgtable_visitor_fn_t cb; + void * const arg; + const enum kvm_pgtable_walk_flags flags; +}; + +enum pkvm_page_state { + PKVM_PAGE_OWNED = 0, + PKVM_PAGE_SHARED_OWNED = 0, + PKVM_PAGE_SHARED_BORROWED = 0, +}; + +struct kvm_mem_range { + u64 start; + u64 end; +}; + +struct kvm_pgtable_walk_data { + struct kvm_pgtable *pgt; + struct kvm_pgtable_walker *walker; + u64 addr; + u64 end; +}; + +struct leaf_walk_data { + kvm_pte_t pte; + u32 level; +}; + +struct hyp_map_data { + u64 phys; + kvm_pte_t attr; + struct kvm_pgtable_mm_ops *mm_ops; +}; + +struct stage2_map_data { + u64 phys; + kvm_pte_t attr; + u8 owner_id; + kvm_pte_t *anchor; + kvm_pte_t *childp; + struct kvm_s2_mmu *mmu; + void *memcache; + struct kvm_pgtable_mm_ops *mm_ops; + bool force_pte; +}; + +struct stage2_attr_data { + kvm_pte_t attr_set; + kvm_pte_t attr_clr; + kvm_pte_t pte; + u32 level; + struct kvm_pgtable_mm_ops *mm_ops; +}; + +typedef s8 int8_t; + +typedef s16 int16_t; + +typedef u64 uint64_t; + +typedef s64 int64_t; + +typedef uint64_t xen_pfn_t; + +typedef uint64_t xen_ulong_t; + +typedef int64_t xen_long_t; + +typedef struct { + union { + unsigned char *p; + uint64_t q; + }; +} __guest_handle_uchar; + +typedef struct { + union { + char *p; + uint64_t q; + }; +} __guest_handle_char; + +typedef struct { + union { + void *p; + uint64_t q; + }; +} __guest_handle_void; + +typedef struct { + union { + uint64_t *p; + uint64_t q; + }; +} __guest_handle_uint64_t; + +typedef struct { + union { + uint32_t *p; + uint64_t q; + }; +} __guest_handle_uint32_t; + +struct arch_vcpu_info {}; + +struct arch_shared_info {}; + +struct pvclock_vcpu_time_info { + u32 version; + u32 pad0; + u64 tsc_timestamp; + u64 system_time; + u32 tsc_to_system_mul; + s8 tsc_shift; + u8 flags; + u8 pad[2]; +}; + +struct pvclock_wall_clock { + u32 version; + u32 sec; + u32 nsec; + u32 sec_hi; +}; + +typedef uint16_t domid_t; + +struct multicall_entry { + xen_ulong_t op; + xen_long_t result; + xen_ulong_t args[6]; +}; + +struct vcpu_info { + uint8_t evtchn_upcall_pending; + uint8_t evtchn_upcall_mask; + xen_ulong_t evtchn_pending_sel; + struct arch_vcpu_info arch; + struct pvclock_vcpu_time_info time; +}; + +struct shared_info { + struct vcpu_info vcpu_info[1]; + xen_ulong_t evtchn_pending[64]; + xen_ulong_t evtchn_mask[64]; + struct pvclock_wall_clock wc; + uint32_t wc_sec_hi; + struct arch_shared_info arch; +}; + +struct start_info { + char magic[32]; + long unsigned int nr_pages; + long unsigned int shared_info; + uint32_t flags; + xen_pfn_t store_mfn; + uint32_t store_evtchn; + union { + struct { + xen_pfn_t mfn; + uint32_t evtchn; + } domU; + struct { + uint32_t info_off; + uint32_t info_size; + } dom0; + } console; + long unsigned int pt_base; + long unsigned int nr_pt_frames; + long unsigned int mfn_list; + long unsigned int mod_start; + long unsigned int mod_len; + int8_t cmd_line[1024]; + long unsigned int first_p2m_pfn; + long unsigned int nr_p2m_frames; +}; + +enum vdso_clock_mode { + VDSO_CLOCKMODE_NONE = 0, + VDSO_CLOCKMODE_ARCHTIMER = 1, + VDSO_CLOCKMODE_ARCHTIMER_NOCOMPAT = 2, + VDSO_CLOCKMODE_MAX = 3, + VDSO_CLOCKMODE_TIMENS = 2147483647, +}; + +struct clocksource { + u64 (*read)(struct clocksource *); + u64 mask; + u32 mult; + u32 shift; + u64 max_idle_ns; + u32 maxadj; + u32 uncertainty_margin; + u64 max_cycles; + const char *name; + struct list_head list; + int rating; + enum clocksource_ids id; + enum vdso_clock_mode vdso_clock_mode; + long unsigned int flags; + int (*enable)(struct clocksource *); + void (*disable)(struct clocksource *); + void (*suspend)(struct clocksource *); + void (*resume)(struct clocksource *); + void (*mark_unstable)(struct clocksource *); + void (*tick_stable)(struct clocksource *); + struct module *owner; +}; + +struct sched_shutdown { + unsigned int reason; +}; + +struct xenpf_settime32 { + uint32_t secs; + uint32_t nsecs; + uint64_t system_time; +}; + +struct xenpf_settime64 { + uint64_t secs; + uint32_t nsecs; + uint32_t mbz; + uint64_t system_time; +}; + +struct xenpf_add_memtype { + xen_pfn_t mfn; + uint64_t nr_mfns; + uint32_t type; + uint32_t handle; + uint32_t reg; +}; + +struct xenpf_del_memtype { + uint32_t handle; + uint32_t reg; +}; + +struct xenpf_read_memtype { + uint32_t reg; + xen_pfn_t mfn; + uint64_t nr_mfns; + uint32_t type; +}; + +struct xenpf_microcode_update { + __guest_handle_void data; + uint32_t length; +}; + +struct xenpf_platform_quirk { + uint32_t quirk_id; +}; + +struct xenpf_efi_time { + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t min; + uint8_t sec; + uint32_t ns; + int16_t tz; + uint8_t daylight; +}; + +struct xenpf_efi_guid { + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +}; + +struct xenpf_efi_runtime_call { + uint32_t function; + uint32_t misc; + xen_ulong_t status; + union { + struct { + struct xenpf_efi_time time; + uint32_t resolution; + uint32_t accuracy; + } get_time; + struct xenpf_efi_time set_time; + struct xenpf_efi_time get_wakeup_time; + struct xenpf_efi_time set_wakeup_time; + struct { + __guest_handle_void name; + xen_ulong_t size; + __guest_handle_void data; + struct xenpf_efi_guid vendor_guid; + } get_variable; + struct { + __guest_handle_void name; + xen_ulong_t size; + __guest_handle_void data; + struct xenpf_efi_guid vendor_guid; + } set_variable; + struct { + xen_ulong_t size; + __guest_handle_void name; + struct xenpf_efi_guid vendor_guid; + } get_next_variable_name; + struct { + uint32_t attr; + uint64_t max_store_size; + uint64_t remain_store_size; + uint64_t max_size; + } query_variable_info; + struct { + __guest_handle_void capsule_header_array; + xen_ulong_t capsule_count; + uint64_t max_capsule_size; + uint32_t reset_type; + } query_capsule_capabilities; + struct { + __guest_handle_void capsule_header_array; + xen_ulong_t capsule_count; + uint64_t sg_list; + } update_capsule; + } u; +}; + +union xenpf_efi_info { + uint32_t version; + struct { + uint64_t addr; + uint32_t nent; + } cfg; + struct { + uint32_t revision; + uint32_t bufsz; + __guest_handle_void name; + } vendor; + struct { + uint64_t addr; + uint64_t size; + uint64_t attr; + uint32_t type; + } mem; +}; + +struct xenpf_firmware_info { + uint32_t type; + uint32_t index; + union { + struct { + uint8_t device; + uint8_t version; + uint16_t interface_support; + uint16_t legacy_max_cylinder; + uint8_t legacy_max_head; + uint8_t legacy_sectors_per_track; + __guest_handle_void edd_params; + } disk_info; + struct { + uint8_t device; + uint32_t mbr_signature; + } disk_mbr_signature; + struct { + uint8_t capabilities; + uint8_t edid_transfer_time; + __guest_handle_uchar edid; + } vbeddc_info; + union xenpf_efi_info efi_info; + uint8_t kbd_shift_flags; + } u; +}; + +struct xenpf_enter_acpi_sleep { + uint16_t val_a; + uint16_t val_b; + uint32_t sleep_state; + uint32_t flags; +}; + +struct xenpf_change_freq { + uint32_t flags; + uint32_t cpu; + uint64_t freq; +}; + +struct xenpf_getidletime { + __guest_handle_uchar cpumap_bitmap; + uint32_t cpumap_nr_cpus; + __guest_handle_uint64_t idletime; + uint64_t now; +}; + +struct xen_power_register { + uint32_t space_id; + uint32_t bit_width; + uint32_t bit_offset; + uint32_t access_size; + uint64_t address; +}; + +struct xen_processor_csd { + uint32_t domain; + uint32_t coord_type; + uint32_t num; +}; + +typedef struct { + union { + struct xen_processor_csd *p; + uint64_t q; + }; +} __guest_handle_xen_processor_csd; + +struct xen_processor_cx { + struct xen_power_register reg; + uint8_t type; + uint32_t latency; + uint32_t power; + uint32_t dpcnt; + __guest_handle_xen_processor_csd dp; +}; + +typedef struct { + union { + struct xen_processor_cx *p; + uint64_t q; + }; +} __guest_handle_xen_processor_cx; + +struct xen_processor_flags { + uint32_t bm_control: 1; + uint32_t bm_check: 1; + uint32_t has_cst: 1; + uint32_t power_setup_done: 1; + uint32_t bm_rld_set: 1; +}; + +struct xen_processor_power { + uint32_t count; + struct xen_processor_flags flags; + __guest_handle_xen_processor_cx states; +}; + +struct xen_pct_register { + uint8_t descriptor; + uint16_t length; + uint8_t space_id; + uint8_t bit_width; + uint8_t bit_offset; + uint8_t reserved; + uint64_t address; +}; + +struct xen_processor_px { + uint64_t core_frequency; + uint64_t power; + uint64_t transition_latency; + uint64_t bus_master_latency; + uint64_t control; + uint64_t status; +}; + +typedef struct { + union { + struct xen_processor_px *p; + uint64_t q; + }; +} __guest_handle_xen_processor_px; + +struct xen_psd_package { + uint64_t num_entries; + uint64_t revision; + uint64_t domain; + uint64_t coord_type; + uint64_t num_processors; +}; + +struct xen_processor_performance { + uint32_t flags; + uint32_t platform_limit; + struct xen_pct_register control_register; + struct xen_pct_register status_register; + uint32_t state_count; + __guest_handle_xen_processor_px states; + struct xen_psd_package domain_info; + uint32_t shared_type; +}; + +struct xenpf_set_processor_pminfo { + uint32_t id; + uint32_t type; + union { + struct xen_processor_power power; + struct xen_processor_performance perf; + __guest_handle_uint32_t pdc; + }; +}; + +struct xenpf_pcpuinfo { + uint32_t xen_cpuid; + uint32_t max_present; + uint32_t flags; + uint32_t apic_id; + uint32_t acpi_id; +}; + +struct xenpf_cpu_ol { + uint32_t cpuid; +}; + +struct xenpf_cpu_hotadd { + uint32_t apic_id; + uint32_t acpi_id; + uint32_t pxm; +}; + +struct xenpf_mem_hotadd { + uint64_t spfn; + uint64_t epfn; + uint32_t pxm; + uint32_t flags; +}; + +struct xenpf_core_parking { + uint32_t type; + uint32_t idle_nums; +}; + +struct xenpf_symdata { + uint32_t namelen; + uint32_t symnum; + __guest_handle_char name; + uint64_t address; + char type; +}; + +struct xen_platform_op { + uint32_t cmd; + uint32_t interface_version; + union { + struct xenpf_settime32 settime32; + struct xenpf_settime64 settime64; + struct xenpf_add_memtype add_memtype; + struct xenpf_del_memtype del_memtype; + struct xenpf_read_memtype read_memtype; + struct xenpf_microcode_update microcode; + struct xenpf_platform_quirk platform_quirk; + struct xenpf_efi_runtime_call efi_runtime_call; + struct xenpf_firmware_info firmware_info; + struct xenpf_enter_acpi_sleep enter_acpi_sleep; + struct xenpf_change_freq change_freq; + struct xenpf_getidletime getidletime; + struct xenpf_set_processor_pminfo set_pminfo; + struct xenpf_pcpuinfo pcpu_info; + struct xenpf_cpu_ol cpu_ol; + struct xenpf_cpu_hotadd cpu_add; + struct xenpf_mem_hotadd mem_add; + struct xenpf_core_parking core_parking; + struct xenpf_symdata symdata; + uint8_t pad[128]; + } u; +}; + +struct xen_memory_region { + long unsigned int start_pfn; + long unsigned int n_pfns; +}; + +struct grant_frames { + xen_pfn_t *pfn; + unsigned int count; + void *vaddr; +}; + +struct xen_hvm_param { + domid_t domid; + uint32_t index; + uint64_t value; +}; + +struct vcpu_register_vcpu_info { + uint64_t mfn; + uint32_t offset; + uint32_t rsvd; +}; + +struct xen_add_to_physmap { + domid_t domid; + uint16_t size; + unsigned int space; + xen_ulong_t idx; + xen_pfn_t gpfn; +}; + +struct xsd_errors { + int errnum; + const char *errstring; +}; + +struct tk_read_base { + struct clocksource *clock; + u64 mask; + u64 cycle_last; + u32 mult; + u32 shift; + u64 xtime_nsec; + ktime_t base; + u64 base_real; +}; + +struct timekeeper { + struct tk_read_base tkr_mono; + struct tk_read_base tkr_raw; + u64 xtime_sec; + long unsigned int ktime_sec; + struct timespec64 wall_to_monotonic; + ktime_t offs_real; + ktime_t offs_boot; + ktime_t offs_tai; + s32 tai_offset; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; + ktime_t next_leap_ktime; + u64 raw_sec; + struct timespec64 monotonic_to_boot; + u64 cycle_interval; + u64 xtime_interval; + s64 xtime_remainder; + u64 raw_interval; + u64 ntp_tick; + s64 ntp_error; + u32 ntp_error_shift; + u32 ntp_err_mult; + u32 skip_second_overflow; +}; + +struct xen_dm_op_buf; + +typedef uint16_t grant_status_t; + +typedef uint32_t grant_ref_t; + +typedef uint32_t grant_handle_t; + +struct gnttab_map_grant_ref { + uint64_t host_addr; + uint32_t flags; + grant_ref_t ref; + domid_t dom; + int16_t status; + grant_handle_t handle; + uint64_t dev_bus_addr; +}; + +struct gnttab_unmap_grant_ref { + uint64_t host_addr; + uint64_t dev_bus_addr; + grant_handle_t handle; + int16_t status; +}; + +struct xen_p2m_entry { + long unsigned int pfn; + long unsigned int mfn; + long unsigned int nr_pages; + struct rb_node rbnode_phys; +}; + +struct gnttab_cache_flush { + union { + uint64_t dev_bus_addr; + grant_ref_t ref; + } a; + uint16_t offset; + uint16_t length; + uint32_t op; +}; + +struct arm_smccc_1_2_regs { + long unsigned int a0; + long unsigned int a1; + long unsigned int a2; + long unsigned int a3; + long unsigned int a4; + long unsigned int a5; + long unsigned int a6; + long unsigned int a7; + long unsigned int a8; + long unsigned int a9; + long unsigned int a10; + long unsigned int a11; + long unsigned int a12; + long unsigned int a13; + long unsigned int a14; + long unsigned int a15; + long unsigned int a16; + long unsigned int a17; +}; + +struct hv_get_vp_registers_output { + union { + struct { + u32 a; + u32 b; + u32 c; + u32 d; + } as32; + struct { + u64 low; + u64 high; + } as64; + }; +}; + +struct ms_hyperv_info { + u32 features; + u32 priv_high; + u32 misc_features; + u32 hints; + u32 nested_features; + u32 max_vp_index; + u32 max_lp_index; + u32 isolation_config_a; + union { + u32 isolation_config_b; + struct { + u32 cvm_type: 4; + u32 reserved1: 1; + u32 shared_gpa_boundary_active: 1; + u32 shared_gpa_boundary_bits: 6; + u32 reserved2: 20; + }; + }; + u64 shared_gpa_boundary; +}; + +typedef void (*rcu_callback_t)(struct callback_head *); + +enum tk_offsets { + TK_OFFS_REAL = 0, + TK_OFFS_BOOT = 1, + TK_OFFS_TAI = 2, + TK_OFFS_MAX = 3, +}; + +struct clone_args { + __u64 flags; + __u64 pidfd; + __u64 child_tid; + __u64 parent_tid; + __u64 exit_signal; + __u64 stack; + __u64 stack_size; + __u64 tls; + __u64 set_tid; + __u64 set_tid_size; + __u64 cgroup; +}; + +struct fdtable { + unsigned int max_fds; + struct file **fd; + long unsigned int *close_on_exec; + long unsigned int *open_fds; + long unsigned int *full_fds_bits; + struct callback_head rcu; +}; + +struct files_struct { + atomic_t count; + bool resize_in_progress; + wait_queue_head_t resize_wait; + struct fdtable *fdt; + struct fdtable fdtab; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t file_lock; + unsigned int next_fd; + long unsigned int close_on_exec_init[1]; + long unsigned int open_fds_init[1]; + long unsigned int full_fds_bits_init[1]; + struct file *fd_array[64]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct robust_list { + struct robust_list *next; +}; + +struct robust_list_head { + struct robust_list list; + long int futex_offset; + struct robust_list *list_op_pending; +}; + +struct kernel_clone_args { + u64 flags; + int *pidfd; + int *child_tid; + int *parent_tid; + int exit_signal; + long unsigned int stack; + long unsigned int stack_size; + long unsigned int tls; + pid_t *set_tid; + size_t set_tid_size; + int cgroup; + int io_thread; + struct cgroup *cgrp; + struct css_set *cset; +}; + +struct multiprocess_signals { + sigset_t signal; + struct hlist_node node; +}; + +typedef int (*proc_visitor)(struct task_struct *, void *); + +enum { + IOPRIO_CLASS_NONE = 0, + IOPRIO_CLASS_RT = 1, + IOPRIO_CLASS_BE = 2, + IOPRIO_CLASS_IDLE = 3, +}; + +enum { + FUTEX_STATE_OK = 0, + FUTEX_STATE_EXITING = 1, + FUTEX_STATE_DEAD = 2, +}; + +enum proc_hidepid { + HIDEPID_OFF = 0, + HIDEPID_NO_ACCESS = 1, + HIDEPID_INVISIBLE = 2, + HIDEPID_NOT_PTRACEABLE = 4, +}; + +enum proc_pidonly { + PROC_PIDONLY_OFF = 0, + PROC_PIDONLY_ON = 1, +}; + +struct proc_fs_info { + struct pid_namespace *pid_ns; + struct dentry *proc_self; + struct dentry *proc_thread_self; + kgid_t pid_gid; + enum proc_hidepid hide_pid; + enum proc_pidonly pidonly; +}; + +struct trace_event_raw_task_newtask { + struct trace_entry ent; + pid_t pid; + char comm[16]; + long unsigned int clone_flags; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_task_rename { + struct trace_entry ent; + pid_t pid; + char oldcomm[16]; + char newcomm[16]; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_data_offsets_task_newtask {}; + +struct trace_event_data_offsets_task_rename {}; + +typedef void (*btf_trace_task_newtask)(void *, struct task_struct *, long unsigned int); + +typedef void (*btf_trace_task_rename)(void *, struct task_struct *, const char *); + +struct taint_flag { + char c_true; + char c_false; + bool module; +}; + +enum ftrace_dump_mode { + DUMP_NONE = 0, + DUMP_ALL = 1, + DUMP_ORIG = 2, +}; + +enum kmsg_dump_reason { + KMSG_DUMP_UNDEF = 0, + KMSG_DUMP_PANIC = 1, + KMSG_DUMP_OOPS = 2, + KMSG_DUMP_EMERG = 3, + KMSG_DUMP_SHUTDOWN = 4, + KMSG_DUMP_MAX = 5, +}; + +enum con_flush_mode { + CONSOLE_FLUSH_PENDING = 0, + CONSOLE_REPLAY_ALL = 1, +}; + +struct warn_args { + const char *fmt; + va_list args; +}; + +enum hk_flags { + HK_FLAG_TIMER = 1, + HK_FLAG_RCU = 2, + HK_FLAG_MISC = 4, + HK_FLAG_SCHED = 8, + HK_FLAG_TICK = 16, + HK_FLAG_DOMAIN = 32, + HK_FLAG_WQ = 64, + HK_FLAG_MANAGED_IRQ = 128, + HK_FLAG_KTHREAD = 256, +}; + +enum cpuhp_smt_control { + CPU_SMT_ENABLED = 0, + CPU_SMT_DISABLED = 1, + CPU_SMT_FORCE_DISABLED = 2, + CPU_SMT_NOT_SUPPORTED = 3, + CPU_SMT_NOT_IMPLEMENTED = 4, +}; + +struct smp_hotplug_thread { + struct task_struct **store; + struct list_head list; + int (*thread_should_run)(unsigned int); + void (*thread_fn)(unsigned int); + void (*create)(unsigned int); + void (*setup)(unsigned int); + void (*cleanup)(unsigned int, bool); + void (*park)(unsigned int); + void (*unpark)(unsigned int); + bool selfparking; + const char *thread_comm; +}; + +struct trace_event_raw_cpuhp_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_multi_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_exit { + struct trace_entry ent; + unsigned int cpu; + int state; + int idx; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_cpuhp_enter {}; + +struct trace_event_data_offsets_cpuhp_multi_enter {}; + +struct trace_event_data_offsets_cpuhp_exit {}; + +typedef void (*btf_trace_cpuhp_enter)(void *, unsigned int, int, int, int (*)(unsigned int)); + +typedef void (*btf_trace_cpuhp_multi_enter)(void *, unsigned int, int, int, int (*)(unsigned int, struct hlist_node *), struct hlist_node *); + +typedef void (*btf_trace_cpuhp_exit)(void *, unsigned int, int, int, int); + +struct cpuhp_cpu_state { + enum cpuhp_state state; + enum cpuhp_state target; + enum cpuhp_state fail; + struct task_struct *thread; + bool should_run; + bool rollback; + bool single; + bool bringup; + int cpu; + struct hlist_node *node; + struct hlist_node *last; + enum cpuhp_state cb_state; + int result; + struct completion done_up; + struct completion done_down; +}; + +struct cpuhp_step { + const char *name; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } startup; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } teardown; + struct hlist_head list; + bool cant_stop; + bool multi_instance; +}; + +enum cpu_mitigations { + CPU_MITIGATIONS_OFF = 0, + CPU_MITIGATIONS_AUTO = 1, + CPU_MITIGATIONS_AUTO_NOSMT = 2, +}; + +struct __kernel_old_timeval { + __kernel_long_t tv_sec; + __kernel_long_t tv_usec; +}; + +struct old_timeval32 { + old_time32_t tv_sec; + s32 tv_usec; +}; + +struct rusage { + struct __kernel_old_timeval ru_utime; + struct __kernel_old_timeval ru_stime; + __kernel_long_t ru_maxrss; + __kernel_long_t ru_ixrss; + __kernel_long_t ru_idrss; + __kernel_long_t ru_isrss; + __kernel_long_t ru_minflt; + __kernel_long_t ru_majflt; + __kernel_long_t ru_nswap; + __kernel_long_t ru_inblock; + __kernel_long_t ru_oublock; + __kernel_long_t ru_msgsnd; + __kernel_long_t ru_msgrcv; + __kernel_long_t ru_nsignals; + __kernel_long_t ru_nvcsw; + __kernel_long_t ru_nivcsw; +}; + +typedef u32 compat_uint_t; + +typedef struct {} mm_segment_t; + +struct compat_rusage { + struct old_timeval32 ru_utime; + struct old_timeval32 ru_stime; + compat_long_t ru_maxrss; + compat_long_t ru_ixrss; + compat_long_t ru_idrss; + compat_long_t ru_isrss; + compat_long_t ru_minflt; + compat_long_t ru_majflt; + compat_long_t ru_nswap; + compat_long_t ru_inblock; + compat_long_t ru_oublock; + compat_long_t ru_msgsnd; + compat_long_t ru_msgrcv; + compat_long_t ru_nsignals; + compat_long_t ru_nvcsw; + compat_long_t ru_nivcsw; +}; + +struct waitid_info { + pid_t pid; + uid_t uid; + int status; + int cause; +}; + +struct wait_opts { + enum pid_type wo_type; + int wo_flags; + struct pid *wo_pid; + struct waitid_info *wo_info; + int wo_stat; + struct rusage *wo_rusage; + wait_queue_entry_t child_wait; + int notask_error; +}; + +typedef struct { + unsigned int __softirq_pending; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +} irq_cpustat_t; + +struct softirq_action { + void (*action)(struct softirq_action *); +}; + +struct tasklet_struct { + struct tasklet_struct *next; + long unsigned int state; + atomic_t count; + bool use_callback; + union { + void (*func)(long unsigned int); + void (*callback)(struct tasklet_struct *); + }; + long unsigned int data; +}; + +enum { + TASKLET_STATE_SCHED = 0, + TASKLET_STATE_RUN = 1, +}; + +struct kernel_stat { + long unsigned int irqs_sum; + unsigned int softirqs[10]; +}; + +struct wait_bit_key { + void *flags; + int bit_nr; + long unsigned int timeout; +}; + +struct wait_bit_queue_entry { + struct wait_bit_key key; + struct wait_queue_entry wq_entry; +}; + +struct trace_event_raw_irq_handler_entry { + struct trace_entry ent; + int irq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_irq_handler_exit { + struct trace_entry ent; + int irq; + int ret; + char __data[0]; +}; + +struct trace_event_raw_softirq { + struct trace_entry ent; + unsigned int vec; + char __data[0]; +}; + +struct trace_event_data_offsets_irq_handler_entry { + u32 name; +}; + +struct trace_event_data_offsets_irq_handler_exit {}; + +struct trace_event_data_offsets_softirq {}; + +typedef void (*btf_trace_irq_handler_entry)(void *, int, struct irqaction *); + +typedef void (*btf_trace_irq_handler_exit)(void *, int, struct irqaction *, int); + +typedef void (*btf_trace_softirq_entry)(void *, unsigned int); + +typedef void (*btf_trace_softirq_exit)(void *, unsigned int); + +typedef void (*btf_trace_softirq_raise)(void *, unsigned int); + +struct tasklet_head { + struct tasklet_struct *head; + struct tasklet_struct **tail; +}; + +enum { + IORES_DESC_NONE = 0, + IORES_DESC_CRASH_KERNEL = 1, + IORES_DESC_ACPI_TABLES = 2, + IORES_DESC_ACPI_NV_STORAGE = 3, + IORES_DESC_PERSISTENT_MEMORY = 4, + IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5, + IORES_DESC_DEVICE_PRIVATE_MEMORY = 6, + IORES_DESC_RESERVED = 7, + IORES_DESC_SOFT_RESERVED = 8, +}; + +enum { + REGION_INTERSECTS = 0, + REGION_DISJOINT = 1, + REGION_MIXED = 2, +}; + +struct pseudo_fs_context { + const struct super_operations *ops; + const struct xattr_handler **xattr; + const struct dentry_operations *dops; + long unsigned int magic; +}; + +typedef void (*dr_release_t)(struct device *, void *); + +typedef int (*dr_match_t)(struct device *, void *, void *); + +struct resource_constraint { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t (*alignf)(void *, const struct resource *, resource_size_t, resource_size_t); + void *alignf_data; +}; + +enum { + MAX_IORES_LEVEL = 5, +}; + +struct region_devres { + struct resource *parent; + resource_size_t start; + resource_size_t n; +}; + +typedef __kernel_clock_t clock_t; + +struct dentry_stat_t { + long int nr_dentry; + long int nr_unused; + long int age_limit; + long int want_pages; + long int nr_negative; + long int dummy; +}; + +struct files_stat_struct { + long unsigned int nr_files; + long unsigned int nr_free_files; + long unsigned int max_files; +}; + +struct inodes_stat_t { + long int nr_inodes; + long int nr_unused; + long int dummy[5]; +}; + +enum sysctl_writes_mode { + SYSCTL_WRITES_LEGACY = 4294967295, + SYSCTL_WRITES_WARN = 0, + SYSCTL_WRITES_STRICT = 1, +}; + +struct do_proc_dointvec_minmax_conv_param { + int *min; + int *max; +}; + +struct do_proc_douintvec_minmax_conv_param { + unsigned int *min; + unsigned int *max; +}; + +struct __user_cap_header_struct { + __u32 version; + int pid; +}; + +typedef struct __user_cap_header_struct *cap_user_header_t; + +struct __user_cap_data_struct { + __u32 effective; + __u32 permitted; + __u32 inheritable; +}; + +typedef struct __user_cap_data_struct *cap_user_data_t; + +struct sigqueue { + struct list_head list; + int flags; + kernel_siginfo_t info; + struct ucounts *ucounts; +}; + +typedef int wait_bit_action_f(struct wait_bit_key *, int); + +struct ptrace_peeksiginfo_args { + __u64 off; + __u32 flags; + __s32 nr; +}; + +struct ptrace_syscall_info { + __u8 op; + __u8 pad[3]; + __u32 arch; + __u64 instruction_pointer; + __u64 stack_pointer; + union { + struct { + __u64 nr; + __u64 args[6]; + } entry; + struct { + __s64 rval; + __u8 is_error; + } exit; + struct { + __u64 nr; + __u64 args[6]; + __u32 ret_data; + } seccomp; + }; +}; + +struct ptrace_rseq_configuration { + __u64 rseq_abi_pointer; + __u32 rseq_abi_size; + __u32 signature; + __u32 flags; + __u32 pad; +}; + +struct compat_iovec { + compat_uptr_t iov_base; + compat_size_t iov_len; +}; + +typedef struct compat_siginfo compat_siginfo_t; + +typedef long unsigned int old_sigset_t; + +typedef u32 compat_old_sigset_t; + +struct compat_sigaction { + compat_uptr_t sa_handler; + compat_ulong_t sa_flags; + compat_uptr_t sa_restorer; + compat_sigset_t sa_mask; +}; + +struct compat_old_sigaction { + compat_uptr_t sa_handler; + compat_old_sigset_t sa_mask; + compat_ulong_t sa_flags; + compat_uptr_t sa_restorer; +}; + +enum { + TRACE_SIGNAL_DELIVERED = 0, + TRACE_SIGNAL_IGNORED = 1, + TRACE_SIGNAL_ALREADY_PENDING = 2, + TRACE_SIGNAL_OVERFLOW_FAIL = 3, + TRACE_SIGNAL_LOSE_INFO = 4, +}; + +struct trace_event_raw_signal_generate { + struct trace_entry ent; + int sig; + int errno; + int code; + char comm[16]; + pid_t pid; + int group; + int result; + char __data[0]; +}; + +struct trace_event_raw_signal_deliver { + struct trace_entry ent; + int sig; + int errno; + int code; + long unsigned int sa_handler; + long unsigned int sa_flags; + char __data[0]; +}; + +struct trace_event_data_offsets_signal_generate {}; + +struct trace_event_data_offsets_signal_deliver {}; + +typedef void (*btf_trace_signal_generate)(void *, int, struct kernel_siginfo *, struct task_struct *, int, int); + +typedef void (*btf_trace_signal_deliver)(void *, int, struct kernel_siginfo *, struct k_sigaction *); + +enum sig_handler { + HANDLER_CURRENT = 0, + HANDLER_SIG_DFL = 1, + HANDLER_EXIT = 2, +}; + +struct sysinfo { + __kernel_long_t uptime; + __kernel_ulong_t loads[3]; + __kernel_ulong_t totalram; + __kernel_ulong_t freeram; + __kernel_ulong_t sharedram; + __kernel_ulong_t bufferram; + __kernel_ulong_t totalswap; + __kernel_ulong_t freeswap; + __u16 procs; + __u16 pad; + __kernel_ulong_t totalhigh; + __kernel_ulong_t freehigh; + __u32 mem_unit; + char _f[0]; +}; + +struct prctl_mm_map { + __u64 start_code; + __u64 end_code; + __u64 start_data; + __u64 end_data; + __u64 start_brk; + __u64 brk; + __u64 start_stack; + __u64 arg_start; + __u64 arg_end; + __u64 env_start; + __u64 env_end; + __u64 *auxv; + __u32 auxv_size; + __u32 exe_fd; +}; + +struct rlimit64 { + __u64 rlim_cur; + __u64 rlim_max; +}; + +enum uts_proc { + UTS_PROC_OSTYPE = 0, + UTS_PROC_OSRELEASE = 1, + UTS_PROC_VERSION = 2, + UTS_PROC_HOSTNAME = 3, + UTS_PROC_DOMAINNAME = 4, +}; + +struct compat_tms { + compat_clock_t tms_utime; + compat_clock_t tms_stime; + compat_clock_t tms_cutime; + compat_clock_t tms_cstime; +}; + +struct compat_rlimit { + compat_ulong_t rlim_cur; + compat_ulong_t rlim_max; +}; + +struct tms { + __kernel_clock_t tms_utime; + __kernel_clock_t tms_stime; + __kernel_clock_t tms_cutime; + __kernel_clock_t tms_cstime; +}; + +struct getcpu_cache { + long unsigned int blob[16]; +}; + +struct compat_sysinfo { + s32 uptime; + u32 loads[3]; + u32 totalram; + u32 freeram; + u32 sharedram; + u32 bufferram; + u32 totalswap; + u32 freeswap; + u16 procs; + u16 pad; + u32 totalhigh; + u32 freehigh; + u32 mem_unit; + char _f[8]; +}; + +struct wq_flusher; + +struct worker; + +struct workqueue_attrs; + +struct pool_workqueue; + +struct wq_device; + +struct workqueue_struct { + struct list_head pwqs; + struct list_head list; + struct mutex mutex; + int work_color; + int flush_color; + atomic_t nr_pwqs_to_flush; + struct wq_flusher *first_flusher; + struct list_head flusher_queue; + struct list_head flusher_overflow; + struct list_head maydays; + struct worker *rescuer; + int nr_drainers; + int saved_max_active; + struct workqueue_attrs *unbound_attrs; + struct pool_workqueue *dfl_pwq; + struct wq_device *wq_dev; + char name[24]; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int flags; + struct pool_workqueue *cpu_pwqs; + struct pool_workqueue *numa_pwq_tbl[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct workqueue_attrs { + int nice; + cpumask_var_t cpumask; + bool no_numa; +}; + +struct execute_work { + struct work_struct work; +}; + +enum { + WQ_UNBOUND = 2, + WQ_FREEZABLE = 4, + WQ_MEM_RECLAIM = 8, + WQ_HIGHPRI = 16, + WQ_CPU_INTENSIVE = 32, + WQ_SYSFS = 64, + WQ_POWER_EFFICIENT = 128, + __WQ_DRAINING = 65536, + __WQ_ORDERED = 131072, + __WQ_LEGACY = 262144, + __WQ_ORDERED_EXPLICIT = 524288, + WQ_MAX_ACTIVE = 512, + WQ_MAX_UNBOUND_PER_CPU = 4, + WQ_DFL_ACTIVE = 256, +}; + +typedef unsigned int xa_mark_t; + +enum xa_lock_type { + XA_LOCK_IRQ = 1, + XA_LOCK_BH = 2, +}; + +struct ida { + struct xarray xa; +}; + +struct __una_u32 { + u32 x; +}; + +struct worker_pool; + +struct worker { + union { + struct list_head entry; + struct hlist_node hentry; + }; + struct work_struct *current_work; + work_func_t current_func; + struct pool_workqueue *current_pwq; + unsigned int current_color; + struct list_head scheduled; + struct task_struct *task; + struct worker_pool *pool; + struct list_head node; + long unsigned int last_active; + unsigned int flags; + int id; + int sleeping; + char desc[24]; + struct workqueue_struct *rescue_wq; + work_func_t last_func; +}; + +struct pool_workqueue { + struct worker_pool *pool; + struct workqueue_struct *wq; + int work_color; + int flush_color; + int refcnt; + int nr_in_flight[16]; + int nr_active; + int max_active; + struct list_head inactive_works; + struct list_head pwqs_node; + struct list_head mayday_node; + struct work_struct unbound_release_work; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct worker_pool { + raw_spinlock_t lock; + int cpu; + int node; + int id; + unsigned int flags; + long unsigned int watchdog_ts; + struct list_head worklist; + int nr_workers; + int nr_idle; + struct list_head idle_list; + struct timer_list idle_timer; + struct timer_list mayday_timer; + struct hlist_head busy_hash[64]; + struct worker *manager; + struct list_head workers; + struct completion *detach_completion; + struct ida worker_ida; + struct workqueue_attrs *attrs; + struct hlist_node hash_node; + int refcnt; + long: 32; + long: 64; + long: 64; + long: 64; + atomic_t nr_running; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum { + POOL_MANAGER_ACTIVE = 1, + POOL_DISASSOCIATED = 4, + WORKER_DIE = 2, + WORKER_IDLE = 4, + WORKER_PREP = 8, + WORKER_CPU_INTENSIVE = 64, + WORKER_UNBOUND = 128, + WORKER_REBOUND = 256, + WORKER_NOT_RUNNING = 456, + NR_STD_WORKER_POOLS = 2, + UNBOUND_POOL_HASH_ORDER = 6, + BUSY_WORKER_HASH_ORDER = 6, + MAX_IDLE_WORKERS_RATIO = 4, + IDLE_WORKER_TIMEOUT = 75000, + MAYDAY_INITIAL_TIMEOUT = 2, + MAYDAY_INTERVAL = 25, + CREATE_COOLDOWN = 250, + RESCUER_NICE_LEVEL = 4294967276, + HIGHPRI_NICE_LEVEL = 4294967276, + WQ_NAME_LEN = 24, +}; + +struct wq_flusher { + struct list_head list; + int flush_color; + struct completion done; +}; + +struct wq_device { + struct workqueue_struct *wq; + struct device dev; +}; + +struct trace_event_raw_workqueue_queue_work { + struct trace_entry ent; + void *work; + void *function; + u32 __data_loc_workqueue; + unsigned int req_cpu; + unsigned int cpu; + char __data[0]; +}; + +struct trace_event_raw_workqueue_activate_work { + struct trace_entry ent; + void *work; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_data_offsets_workqueue_queue_work { + u32 workqueue; +}; + +struct trace_event_data_offsets_workqueue_activate_work {}; + +struct trace_event_data_offsets_workqueue_execute_start {}; + +struct trace_event_data_offsets_workqueue_execute_end {}; + +typedef void (*btf_trace_workqueue_queue_work)(void *, unsigned int, struct pool_workqueue *, struct work_struct *); + +typedef void (*btf_trace_workqueue_activate_work)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_execute_start)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_execute_end)(void *, struct work_struct *, work_func_t); + +struct wq_barrier { + struct work_struct work; + struct completion done; + struct task_struct *task; +}; + +struct cwt_wait { + wait_queue_entry_t wait; + struct work_struct *work; +}; + +struct apply_wqattrs_ctx { + struct workqueue_struct *wq; + struct workqueue_attrs *attrs; + struct list_head list; + struct pool_workqueue *dfl_pwq; + struct pool_workqueue *pwq_tbl[0]; +}; + +struct work_for_cpu { + struct work_struct work; + long int (*fn)(void *); + void *arg; + long int ret; +}; + +typedef struct {} local_lock_t; + +struct radix_tree_preload { + local_lock_t lock; + unsigned int nr; + struct xa_node *nodes; +}; + +typedef void (*task_work_func_t)(struct callback_head *); + +enum task_work_notify_mode { + TWA_NONE = 0, + TWA_RESUME = 1, + TWA_SIGNAL = 2, +}; + +enum { + KERNEL_PARAM_OPS_FL_NOARG = 1, +}; + +enum { + KERNEL_PARAM_FL_UNSAFE = 1, + KERNEL_PARAM_FL_HWPARAM = 2, +}; + +struct param_attribute { + struct module_attribute mattr; + const struct kernel_param *param; +}; + +struct module_param_attrs { + unsigned int num; + struct attribute_group grp; + struct param_attribute attrs[0]; +}; + +struct module_version_attribute { + struct module_attribute mattr; + const char *module_name; + const char *version; +}; + +enum lockdown_reason { + LOCKDOWN_NONE = 0, + LOCKDOWN_MODULE_SIGNATURE = 1, + LOCKDOWN_DEV_MEM = 2, + LOCKDOWN_EFI_TEST = 3, + LOCKDOWN_KEXEC = 4, + LOCKDOWN_HIBERNATION = 5, + LOCKDOWN_PCI_ACCESS = 6, + LOCKDOWN_IOPORT = 7, + LOCKDOWN_MSR = 8, + LOCKDOWN_ACPI_TABLES = 9, + LOCKDOWN_PCMCIA_CIS = 10, + LOCKDOWN_TIOCSSERIAL = 11, + LOCKDOWN_MODULE_PARAMETERS = 12, + LOCKDOWN_MMIOTRACE = 13, + LOCKDOWN_DEBUGFS = 14, + LOCKDOWN_XMON_WR = 15, + LOCKDOWN_BPF_WRITE_USER = 16, + LOCKDOWN_INTEGRITY_MAX = 17, + LOCKDOWN_KCORE = 18, + LOCKDOWN_KPROBES = 19, + LOCKDOWN_BPF_READ_KERNEL = 20, + LOCKDOWN_PERF = 21, + LOCKDOWN_TRACEFS = 22, + LOCKDOWN_XMON_RW = 23, + LOCKDOWN_XFRM_SECRET = 24, + LOCKDOWN_CONFIDENTIALITY_MAX = 25, +}; + +struct kmalloced_param { + struct list_head list; + char val[0]; +}; + +struct sched_param { + int sched_priority; +}; + +enum { + __PERCPU_REF_ATOMIC = 1, + __PERCPU_REF_DEAD = 2, + __PERCPU_REF_ATOMIC_DEAD = 3, + __PERCPU_REF_FLAG_BITS = 2, +}; + +struct kthread_work; + +typedef void (*kthread_work_func_t)(struct kthread_work *); + +struct kthread_worker; + +struct kthread_work { + struct list_head node; + kthread_work_func_t func; + struct kthread_worker *worker; + int canceling; +}; + +enum { + KTW_FREEZABLE = 1, +}; + +struct kthread_worker { + unsigned int flags; + raw_spinlock_t lock; + struct list_head work_list; + struct list_head delayed_work_list; + struct task_struct *task; + struct kthread_work *current_work; +}; + +struct kthread_delayed_work { + struct kthread_work work; + struct timer_list timer; +}; + +enum { + CSS_NO_REF = 1, + CSS_ONLINE = 2, + CSS_RELEASED = 4, + CSS_VISIBLE = 8, + CSS_DYING = 16, +}; + +struct kthread_create_info { + int (*threadfn)(void *); + void *data; + int node; + struct task_struct *result; + struct completion *done; + struct list_head list; +}; + +struct kthread { + long unsigned int flags; + unsigned int cpu; + int (*threadfn)(void *); + void *data; + mm_segment_t oldfs; + struct completion parked; + struct completion exited; + struct cgroup_subsys_state *blkcg_css; +}; + +enum KTHREAD_BITS { + KTHREAD_IS_PER_CPU = 0, + KTHREAD_SHOULD_STOP = 1, + KTHREAD_SHOULD_PARK = 2, +}; + +struct kthread_flush_work { + struct kthread_work work; + struct completion done; +}; + +struct pt_regs___2; + +struct ipc_ids { + int in_use; + short unsigned int seq; + struct rw_semaphore rwsem; + struct idr ipcs_idr; + int max_idx; + int last_idx; + int next_id; + struct rhashtable key_ht; +}; + +struct ipc_namespace { + struct ipc_ids ids[3]; + int sem_ctls[4]; + int used_sems; + unsigned int msg_ctlmax; + unsigned int msg_ctlmnb; + unsigned int msg_ctlmni; + atomic_t msg_bytes; + atomic_t msg_hdrs; + size_t shm_ctlmax; + size_t shm_ctlall; + long unsigned int shm_tot; + int shm_ctlmni; + int shm_rmid_forced; + struct notifier_block ipcns_nb; + struct vfsmount *mq_mnt; + unsigned int mq_queues_count; + unsigned int mq_queues_max; + unsigned int mq_msg_max; + unsigned int mq_msgsize_max; + unsigned int mq_msg_default; + unsigned int mq_msgsize_default; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct llist_node mnt_llist; + struct ns_common ns; +}; + +struct srcu_notifier_head { + struct mutex mutex; + struct srcu_struct srcu; + struct notifier_block *head; +}; + +enum what { + PROC_EVENT_NONE = 0, + PROC_EVENT_FORK = 1, + PROC_EVENT_EXEC = 2, + PROC_EVENT_UID = 4, + PROC_EVENT_GID = 64, + PROC_EVENT_SID = 128, + PROC_EVENT_PTRACE = 256, + PROC_EVENT_COMM = 512, + PROC_EVENT_COREDUMP = 1073741824, + PROC_EVENT_EXIT = 2147483648, +}; + +enum reboot_type { + BOOT_TRIPLE = 116, + BOOT_KBD = 107, + BOOT_BIOS = 98, + BOOT_ACPI = 97, + BOOT_EFI = 101, + BOOT_CF9_FORCE = 112, + BOOT_CF9_SAFE = 113, +}; + +struct async_entry { + struct list_head domain_list; + struct list_head global_list; + struct work_struct work; + async_cookie_t cookie; + async_func_t func; + void *data; + struct async_domain *domain; +}; + +struct smpboot_thread_data { + unsigned int cpu; + unsigned int status; + struct smp_hotplug_thread *ht; +}; + +enum { + HP_THREAD_NONE = 0, + HP_THREAD_ACTIVE = 1, + HP_THREAD_PARKED = 2, +}; + +struct umd_info { + const char *driver_name; + struct file *pipe_to_umh; + struct file *pipe_from_umh; + struct path wd; + struct pid *tgid; +}; + +struct pin_cookie {}; + +enum { + CSD_FLAG_LOCK = 1, + IRQ_WORK_PENDING = 1, + IRQ_WORK_BUSY = 2, + IRQ_WORK_LAZY = 4, + IRQ_WORK_HARD_IRQ = 8, + IRQ_WORK_CLAIMED = 3, + CSD_TYPE_ASYNC = 0, + CSD_TYPE_SYNC = 16, + CSD_TYPE_IRQ_WORK = 32, + CSD_TYPE_TTWU = 48, + CSD_FLAG_TYPE_MASK = 240, +}; + +struct __call_single_data { + struct __call_single_node node; + smp_call_func_t func; + void *info; +}; + +typedef struct __call_single_data call_single_data_t; + +typedef int (*task_call_f)(struct task_struct *, void *); + +struct dl_bw { + raw_spinlock_t lock; + u64 bw; + u64 total_bw; +}; + +struct cpudl_item; + +struct cpudl { + raw_spinlock_t lock; + int size; + cpumask_var_t free_cpus; + struct cpudl_item *elements; +}; + +struct cpupri_vec { + atomic_t count; + cpumask_var_t mask; +}; + +struct cpupri { + struct cpupri_vec pri_to_cpu[101]; + int *cpu_to_pri; +}; + +struct perf_domain; + +struct root_domain { + atomic_t refcount; + atomic_t rto_count; + struct callback_head rcu; + cpumask_var_t span; + cpumask_var_t online; + int overload; + int overutilized; + cpumask_var_t dlo_mask; + atomic_t dlo_count; + struct dl_bw dl_bw; + struct cpudl cpudl; + u64 visit_gen; + struct irq_work rto_push_work; + raw_spinlock_t rto_lock; + int rto_loop; + int rto_cpu; + atomic_t rto_loop_next; + atomic_t rto_loop_start; + cpumask_var_t rto_mask; + struct cpupri cpupri; + long unsigned int max_cpu_capacity; + struct perf_domain *pd; +}; + +struct cfs_rq { + struct load_weight load; + unsigned int nr_running; + unsigned int h_nr_running; + unsigned int idle_nr_running; + unsigned int idle_h_nr_running; + u64 exec_clock; + u64 min_vruntime; + unsigned int forceidle_seq; + u64 min_vruntime_fi; + struct rb_root_cached tasks_timeline; + struct sched_entity *curr; + struct sched_entity *next; + struct sched_entity *last; + struct sched_entity *skip; + unsigned int nr_spread_over; + long: 32; + long: 64; + struct sched_avg avg; + struct { + raw_spinlock_t lock; + int nr; + long unsigned int load_avg; + long unsigned int util_avg; + long unsigned int runnable_avg; + long: 64; + long: 64; + long: 64; + long: 64; + } removed; + long unsigned int tg_load_avg_contrib; + long int propagate; + long int prop_runnable_sum; + long unsigned int h_load; + u64 last_h_load_update; + struct sched_entity *h_load_next; + struct rq *rq; + int on_list; + struct list_head leaf_cfs_rq_list; + struct task_group *tg; + int idle; + int runtime_enabled; + s64 runtime_remaining; + u64 throttled_clock; + u64 throttled_clock_task; + u64 throttled_clock_task_time; + int throttled; + int throttle_count; + struct list_head throttled_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct cfs_bandwidth { + raw_spinlock_t lock; + ktime_t period; + u64 quota; + u64 runtime; + u64 burst; + u64 runtime_snap; + s64 hierarchical_quota; + u8 idle; + u8 period_active; + u8 slack_started; + struct hrtimer period_timer; + struct hrtimer slack_timer; + struct list_head throttled_cfs_rq; + int nr_periods; + int nr_throttled; + int nr_burst; + u64 throttled_time; + u64 burst_time; +}; + +struct task_group { + struct cgroup_subsys_state css; + struct sched_entity **se; + struct cfs_rq **cfs_rq; + long unsigned int shares; + int idle; + long: 32; + long: 64; + long: 64; + long: 64; + atomic_long_t load_avg; + struct callback_head rcu; + struct list_head list; + struct task_group *parent; + struct list_head siblings; + struct list_head children; + struct autogroup *autogroup; + struct cfs_bandwidth cfs_bandwidth; + unsigned int uclamp_pct[2]; + struct uclamp_se uclamp_req[2]; + struct uclamp_se uclamp[2]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sched_domain_attr { + int relax_domain_level; +}; + +struct sched_domain_shared { + atomic_t ref; + atomic_t nr_busy_cpus; + int has_idle_cores; +}; + +struct sched_group; + +struct sched_domain { + struct sched_domain *parent; + struct sched_domain *child; + struct sched_group *groups; + long unsigned int min_interval; + long unsigned int max_interval; + unsigned int busy_factor; + unsigned int imbalance_pct; + unsigned int cache_nice_tries; + int nohz_idle; + int flags; + int level; + long unsigned int last_balance; + unsigned int balance_interval; + unsigned int nr_balance_failed; + u64 max_newidle_lb_cost; + long unsigned int last_decay_max_lb_cost; + u64 avg_scan_cost; + unsigned int lb_count[3]; + unsigned int lb_failed[3]; + unsigned int lb_balanced[3]; + unsigned int lb_imbalance[3]; + unsigned int lb_gained[3]; + unsigned int lb_hot_gained[3]; + unsigned int lb_nobusyg[3]; + unsigned int lb_nobusyq[3]; + unsigned int alb_count; + unsigned int alb_failed; + unsigned int alb_pushed; + unsigned int sbe_count; + unsigned int sbe_balanced; + unsigned int sbe_pushed; + unsigned int sbf_count; + unsigned int sbf_balanced; + unsigned int sbf_pushed; + unsigned int ttwu_wake_remote; + unsigned int ttwu_move_affine; + unsigned int ttwu_move_balance; + char *name; + union { + void *private; + struct callback_head rcu; + }; + struct sched_domain_shared *shared; + unsigned int span_weight; + long unsigned int span[0]; +}; + +struct sched_group_capacity; + +struct sched_group { + struct sched_group *next; + atomic_t ref; + unsigned int group_weight; + struct sched_group_capacity *sgc; + int asym_prefer_cpu; + int flags; + long unsigned int cpumask[0]; +}; + +struct sched_group_capacity { + atomic_t ref; + long unsigned int capacity; + long unsigned int min_capacity; + long unsigned int max_capacity; + long unsigned int next_update; + int imbalance; + int id; + long unsigned int cpumask[0]; +}; + +struct autogroup { + struct kref kref; + struct task_group *tg; + struct rw_semaphore lock; + long unsigned int id; + int nice; +}; + +struct kernel_cpustat { + u64 cpustat[10]; +}; + +enum { + MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY = 1, + MEMBARRIER_STATE_PRIVATE_EXPEDITED = 2, + MEMBARRIER_STATE_GLOBAL_EXPEDITED_READY = 4, + MEMBARRIER_STATE_GLOBAL_EXPEDITED = 8, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE_READY = 16, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ_READY = 64, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ = 128, +}; + +enum { + CFTYPE_ONLY_ON_ROOT = 1, + CFTYPE_NOT_ON_ROOT = 2, + CFTYPE_NS_DELEGATABLE = 4, + CFTYPE_NO_PREFIX = 8, + CFTYPE_WORLD_WRITABLE = 16, + CFTYPE_DEBUG = 32, + CFTYPE_PRESSURE = 64, + __CFTYPE_ONLY_ON_DFL = 65536, + __CFTYPE_NOT_ON_DFL = 131072, +}; + +struct css_task_iter { + struct cgroup_subsys *ss; + unsigned int flags; + struct list_head *cset_pos; + struct list_head *cset_head; + struct list_head *tcset_pos; + struct list_head *tcset_head; + struct list_head *task_pos; + struct list_head *cur_tasks_head; + struct css_set *cur_cset; + struct css_set *cur_dcset; + struct task_struct *cur_task; + struct list_head iters_node; +}; + +struct trace_event_raw_sched_kthread_stop { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_stop_ret { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_queue_work { + struct trace_entry ent; + void *work; + void *function; + void *worker; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_wakeup_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int target_cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_switch { + struct trace_entry ent; + char prev_comm[16]; + pid_t prev_pid; + int prev_prio; + long int prev_state; + char next_comm[16]; + pid_t next_pid; + int next_prio; + char __data[0]; +}; + +struct trace_event_raw_sched_migrate_task { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int orig_cpu; + int dest_cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_process_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_wait { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_fork { + struct trace_entry ent; + char parent_comm[16]; + pid_t parent_pid; + char child_comm[16]; + pid_t child_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_process_exec { + struct trace_entry ent; + u32 __data_loc_filename; + pid_t pid; + pid_t old_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_stat_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + u64 delay; + char __data[0]; +}; + +struct trace_event_raw_sched_stat_runtime { + struct trace_entry ent; + char comm[16]; + pid_t pid; + u64 runtime; + u64 vruntime; + char __data[0]; +}; + +struct trace_event_raw_sched_pi_setprio { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int oldprio; + int newprio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_hang { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_move_numa { + struct trace_entry ent; + pid_t pid; + pid_t tgid; + pid_t ngid; + int src_cpu; + int src_nid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_numa_pair_template { + struct trace_entry ent; + pid_t src_pid; + pid_t src_tgid; + pid_t src_ngid; + int src_cpu; + int src_nid; + pid_t dst_pid; + pid_t dst_tgid; + pid_t dst_ngid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_wake_idle_without_ipi { + struct trace_entry ent; + int cpu; + char __data[0]; +}; + +struct trace_event_data_offsets_sched_kthread_stop {}; + +struct trace_event_data_offsets_sched_kthread_stop_ret {}; + +struct trace_event_data_offsets_sched_kthread_work_queue_work {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_start {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_end {}; + +struct trace_event_data_offsets_sched_wakeup_template {}; + +struct trace_event_data_offsets_sched_switch {}; + +struct trace_event_data_offsets_sched_migrate_task {}; + +struct trace_event_data_offsets_sched_process_template {}; + +struct trace_event_data_offsets_sched_process_wait {}; + +struct trace_event_data_offsets_sched_process_fork {}; + +struct trace_event_data_offsets_sched_process_exec { + u32 filename; +}; + +struct trace_event_data_offsets_sched_stat_template {}; + +struct trace_event_data_offsets_sched_stat_runtime {}; + +struct trace_event_data_offsets_sched_pi_setprio {}; + +struct trace_event_data_offsets_sched_process_hang {}; + +struct trace_event_data_offsets_sched_move_numa {}; + +struct trace_event_data_offsets_sched_numa_pair_template {}; + +struct trace_event_data_offsets_sched_wake_idle_without_ipi {}; + +typedef void (*btf_trace_sched_kthread_stop)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_kthread_stop_ret)(void *, int); + +typedef void (*btf_trace_sched_kthread_work_queue_work)(void *, struct kthread_worker *, struct kthread_work *); + +typedef void (*btf_trace_sched_kthread_work_execute_start)(void *, struct kthread_work *); + +typedef void (*btf_trace_sched_kthread_work_execute_end)(void *, struct kthread_work *, kthread_work_func_t); + +typedef void (*btf_trace_sched_waking)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wakeup)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wakeup_new)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_switch)(void *, bool, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_migrate_task)(void *, struct task_struct *, int); + +typedef void (*btf_trace_sched_process_free)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_exit)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wait_task)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_wait)(void *, struct pid *); + +typedef void (*btf_trace_sched_process_fork)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_process_exec)(void *, struct task_struct *, pid_t, struct linux_binprm *); + +typedef void (*btf_trace_sched_stat_wait)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_sleep)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_iowait)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_blocked)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_runtime)(void *, struct task_struct *, u64, u64); + +typedef void (*btf_trace_sched_pi_setprio)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_process_hang)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_move_numa)(void *, struct task_struct *, int, int); + +typedef void (*btf_trace_sched_stick_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_swap_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_wake_idle_without_ipi)(void *, int); + +typedef void (*btf_trace_pelt_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_pelt_rt_tp)(void *, struct rq *); + +struct uclamp_bucket { + long unsigned int value: 11; + long unsigned int tasks: 53; +}; + +struct uclamp_rq { + unsigned int value; + struct uclamp_bucket bucket[5]; +}; + +struct rt_prio_array { + long unsigned int bitmap[2]; + struct list_head queue[100]; +}; + +struct rt_rq { + struct rt_prio_array active; + unsigned int rt_nr_running; + unsigned int rr_nr_running; + struct { + int curr; + int next; + } highest_prio; + unsigned int rt_nr_migratory; + unsigned int rt_nr_total; + int overloaded; + struct plist_head pushable_tasks; + int rt_queued; + int rt_throttled; + u64 rt_time; + u64 rt_runtime; + raw_spinlock_t rt_runtime_lock; +}; + +struct dl_rq { + struct rb_root_cached root; + unsigned int dl_nr_running; + struct { + u64 curr; + u64 next; + } earliest_dl; + unsigned int dl_nr_migratory; + int overloaded; + struct rb_root_cached pushable_dl_tasks_root; + u64 running_bw; + u64 this_bw; + u64 extra_bw; + u64 bw_ratio; +}; + +struct cpu_stop_done; + +struct cpu_stop_work { + struct list_head list; + cpu_stop_fn_t fn; + long unsigned int caller; + void *arg; + struct cpu_stop_done *done; +}; + +struct cpuidle_state; + +struct rq { + raw_spinlock_t __lock; + unsigned int nr_running; + unsigned int nr_numa_running; + unsigned int nr_preferred_running; + unsigned int numa_migrate_on; + long unsigned int last_blocked_load_update_tick; + unsigned int has_blocked_load; + long: 32; + long: 64; + long: 64; + long: 64; + call_single_data_t nohz_csd; + unsigned int nohz_tick_stopped; + atomic_t nohz_flags; + unsigned int ttwu_pending; + u64 nr_switches; + long: 64; + struct uclamp_rq uclamp[2]; + unsigned int uclamp_flags; + long: 32; + long: 64; + long: 64; + long: 64; + struct cfs_rq cfs; + struct rt_rq rt; + struct dl_rq dl; + struct list_head leaf_cfs_rq_list; + struct list_head *tmp_alone_branch; + unsigned int nr_uninterruptible; + struct task_struct *curr; + struct task_struct *idle; + struct task_struct *stop; + long unsigned int next_balance; + struct mm_struct *prev_mm; + unsigned int clock_update_flags; + u64 clock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u64 clock_task; + u64 clock_pelt; + long unsigned int lost_idle_time; + atomic_t nr_iowait; + u64 last_seen_need_resched_ns; + int ticks_without_resched; + int membarrier_state; + struct root_domain *rd; + struct sched_domain *sd; + long unsigned int cpu_capacity; + long unsigned int cpu_capacity_orig; + struct callback_head *balance_callback; + unsigned char nohz_idle_balance; + unsigned char idle_balance; + long unsigned int misfit_task_load; + int active_balance; + int push_cpu; + struct cpu_stop_work active_balance_work; + int cpu; + int online; + struct list_head cfs_tasks; + long: 64; + struct sched_avg avg_rt; + struct sched_avg avg_dl; + struct sched_avg avg_thermal; + u64 idle_stamp; + u64 avg_idle; + long unsigned int wake_stamp; + u64 wake_avg_idle; + u64 max_idle_balance_cost; + struct rcuwait hotplug_wait; + u64 prev_steal_time; + long unsigned int calc_load_update; + long int calc_load_active; + long: 64; + long: 64; + long: 64; + call_single_data_t hrtick_csd; + struct hrtimer hrtick_timer; + ktime_t hrtick_time; + struct sched_info rq_sched_info; + long long unsigned int rq_cpu_time; + unsigned int yld_count; + unsigned int sched_count; + unsigned int sched_goidle; + unsigned int ttwu_count; + unsigned int ttwu_local; + struct cpuidle_state *idle_state; + unsigned int nr_pinned; + unsigned int push_busy; + struct cpu_stop_work push_work; + struct rq *core; + struct task_struct *core_pick; + unsigned int core_enabled; + unsigned int core_sched_seq; + struct rb_root core_tree; + unsigned int core_task_seq; + unsigned int core_pick_seq; + long unsigned int core_cookie; + unsigned char core_forceidle; + unsigned int core_forceidle_seq; +}; + +typedef void (*btf_trace_pelt_dl_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_thermal_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_irq_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_sched_cpu_capacity_tp)(void *, struct rq *); + +typedef void (*btf_trace_sched_overutilized_tp)(void *, struct root_domain *, bool); + +typedef void (*btf_trace_sched_util_est_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_sched_util_est_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_sched_update_nr_running_tp)(void *, struct rq *, int); + +struct wake_q_head { + struct wake_q_node *first; + struct wake_q_node **lastp; +}; + +struct sched_attr { + __u32 size; + __u32 sched_policy; + __u64 sched_flags; + __s32 sched_nice; + __u32 sched_priority; + __u64 sched_runtime; + __u64 sched_deadline; + __u64 sched_period; + __u32 sched_util_min; + __u32 sched_util_max; +}; + +struct cpuidle_state_usage { + long long unsigned int disable; + long long unsigned int usage; + u64 time_ns; + long long unsigned int above; + long long unsigned int below; + long long unsigned int rejected; + long long unsigned int s2idle_usage; + long long unsigned int s2idle_time; +}; + +struct cpuidle_device; + +struct cpuidle_driver; + +struct cpuidle_state { + char name[16]; + char desc[32]; + s64 exit_latency_ns; + s64 target_residency_ns; + unsigned int flags; + unsigned int exit_latency; + int power_usage; + unsigned int target_residency; + int (*enter)(struct cpuidle_device *, struct cpuidle_driver *, int); + int (*enter_dead)(struct cpuidle_device *, int); + int (*enter_s2idle)(struct cpuidle_device *, struct cpuidle_driver *, int); +}; + +struct cpuidle_state_kobj; + +struct cpuidle_driver_kobj; + +struct cpuidle_device_kobj; + +struct cpuidle_device { + unsigned int registered: 1; + unsigned int enabled: 1; + unsigned int poll_time_limit: 1; + unsigned int cpu; + ktime_t next_hrtimer; + int last_state_idx; + u64 last_residency_ns; + u64 poll_limit_ns; + u64 forced_idle_latency_limit_ns; + struct cpuidle_state_usage states_usage[10]; + struct cpuidle_state_kobj *kobjs[10]; + struct cpuidle_driver_kobj *kobj_driver; + struct cpuidle_device_kobj *kobj_dev; + struct list_head device_list; +}; + +struct cpuidle_driver { + const char *name; + struct module *owner; + unsigned int bctimer: 1; + struct cpuidle_state states[10]; + int state_count; + int safe_state_index; + struct cpumask *cpumask; + const char *governor; +}; + +struct cpudl_item { + u64 dl; + int cpu; + int idx; +}; + +struct rt_bandwidth { + raw_spinlock_t rt_runtime_lock; + ktime_t rt_period; + u64 rt_runtime; + struct hrtimer rt_period_timer; + unsigned int rt_period_active; +}; + +struct dl_bandwidth { + raw_spinlock_t dl_runtime_lock; + u64 dl_runtime; + u64 dl_period; +}; + +typedef int (*tg_visitor)(struct task_group *, void *); + +struct perf_domain { + struct em_perf_domain *em_pd; + struct perf_domain *next; + struct callback_head rcu; +}; + +struct rq_flags { + long unsigned int flags; + struct pin_cookie cookie; + unsigned int clock_update_flags; +}; + +struct sched_entity_stats { + struct sched_entity se; + struct sched_statistics stats; +}; + +enum { + __SCHED_FEAT_GENTLE_FAIR_SLEEPERS = 0, + __SCHED_FEAT_START_DEBIT = 1, + __SCHED_FEAT_NEXT_BUDDY = 2, + __SCHED_FEAT_LAST_BUDDY = 3, + __SCHED_FEAT_CACHE_HOT_BUDDY = 4, + __SCHED_FEAT_WAKEUP_PREEMPTION = 5, + __SCHED_FEAT_HRTICK = 6, + __SCHED_FEAT_HRTICK_DL = 7, + __SCHED_FEAT_DOUBLE_TICK = 8, + __SCHED_FEAT_NONTASK_CAPACITY = 9, + __SCHED_FEAT_TTWU_QUEUE = 10, + __SCHED_FEAT_SIS_PROP = 11, + __SCHED_FEAT_WARN_DOUBLE_CLOCK = 12, + __SCHED_FEAT_RT_PUSH_IPI = 13, + __SCHED_FEAT_RT_RUNTIME_SHARE = 14, + __SCHED_FEAT_LB_MIN = 15, + __SCHED_FEAT_ATTACH_AGE_LOAD = 16, + __SCHED_FEAT_WA_IDLE = 17, + __SCHED_FEAT_WA_WEIGHT = 18, + __SCHED_FEAT_WA_BIAS = 19, + __SCHED_FEAT_UTIL_EST = 20, + __SCHED_FEAT_UTIL_EST_FASTUP = 21, + __SCHED_FEAT_LATENCY_WARN = 22, + __SCHED_FEAT_ALT_PERIOD = 23, + __SCHED_FEAT_BASE_SLICE = 24, + __SCHED_FEAT_NR = 25, +}; + +enum cpu_util_type { + FREQUENCY_UTIL = 0, + ENERGY_UTIL = 1, +}; + +struct set_affinity_pending; + +struct migration_arg { + struct task_struct *task; + int dest_cpu; + struct set_affinity_pending *pending; +}; + +struct set_affinity_pending { + refcount_t refs; + unsigned int stop_pending; + struct completion done; + struct cpu_stop_work stop_work; + struct migration_arg arg; +}; + +struct migration_swap_arg { + struct task_struct *src_task; + struct task_struct *dst_task; + int src_cpu; + int dst_cpu; +}; + +struct uclamp_request { + s64 percent; + u64 util; + int ret; +}; + +struct cfs_schedulable_data { + struct task_group *tg; + u64 period; + u64 quota; +}; + +enum { + cpuset = 0, + possible = 1, + fail = 2, +}; + +enum { + SD_BALANCE_NEWIDLE = 1, + SD_BALANCE_EXEC = 2, + SD_BALANCE_FORK = 4, + SD_BALANCE_WAKE = 8, + SD_WAKE_AFFINE = 16, + SD_ASYM_CPUCAPACITY = 32, + SD_ASYM_CPUCAPACITY_FULL = 64, + SD_SHARE_CPUCAPACITY = 128, + SD_SHARE_PKG_RESOURCES = 256, + SD_SERIALIZE = 512, + SD_ASYM_PACKING = 1024, + SD_PREFER_SIBLING = 2048, + SD_OVERLAP = 4096, + SD_NUMA = 8192, +}; + +enum s2idle_states { + S2IDLE_STATE_NONE = 0, + S2IDLE_STATE_ENTER = 1, + S2IDLE_STATE_WAKE = 2, +}; + +struct idle_timer { + struct hrtimer timer; + int done; +}; + +struct numa_group { + refcount_t refcount; + spinlock_t lock; + int nr_tasks; + pid_t gid; + int active_nodes; + struct callback_head rcu; + long unsigned int total_faults; + long unsigned int max_faults_cpu; + long unsigned int faults[0]; +}; + +struct update_util_data { + void (*func)(struct update_util_data *, u64, unsigned int); +}; + +enum sched_tunable_scaling { + SCHED_TUNABLESCALING_NONE = 0, + SCHED_TUNABLESCALING_LOG = 1, + SCHED_TUNABLESCALING_LINEAR = 2, + SCHED_TUNABLESCALING_END = 3, +}; + +enum numa_topology_type { + NUMA_DIRECT = 0, + NUMA_GLUELESS_MESH = 1, + NUMA_BACKPLANE = 2, +}; + +enum numa_faults_stats { + NUMA_MEM = 0, + NUMA_CPU = 1, + NUMA_MEMBUF = 2, + NUMA_CPUBUF = 3, +}; + +enum numa_type { + node_has_spare = 0, + node_fully_busy = 1, + node_overloaded = 2, +}; + +struct numa_stats { + long unsigned int load; + long unsigned int runnable; + long unsigned int util; + long unsigned int compute_capacity; + unsigned int nr_running; + unsigned int weight; + enum numa_type node_type; + int idle_cpu; +}; + +struct task_numa_env { + struct task_struct *p; + int src_cpu; + int src_nid; + int dst_cpu; + int dst_nid; + struct numa_stats src_stats; + struct numa_stats dst_stats; + int imbalance_pct; + int dist; + struct task_struct *best_task; + long int best_imp; + int best_cpu; +}; + +enum fbq_type { + regular = 0, + remote = 1, + all = 2, +}; + +enum group_type { + group_has_spare = 0, + group_fully_busy = 1, + group_misfit_task = 2, + group_asym_packing = 3, + group_imbalanced = 4, + group_overloaded = 5, +}; + +enum migration_type { + migrate_load = 0, + migrate_util = 1, + migrate_task = 2, + migrate_misfit = 3, +}; + +struct lb_env { + struct sched_domain *sd; + struct rq *src_rq; + int src_cpu; + int dst_cpu; + struct rq *dst_rq; + struct cpumask *dst_grpmask; + int new_dst_cpu; + enum cpu_idle_type idle; + long int imbalance; + struct cpumask *cpus; + unsigned int flags; + unsigned int loop; + unsigned int loop_break; + unsigned int loop_max; + enum fbq_type fbq_type; + enum migration_type migration_type; + struct list_head tasks; +}; + +struct sg_lb_stats { + long unsigned int avg_load; + long unsigned int group_load; + long unsigned int group_capacity; + long unsigned int group_util; + long unsigned int group_runnable; + unsigned int sum_nr_running; + unsigned int sum_h_nr_running; + unsigned int idle_cpus; + unsigned int group_weight; + enum group_type group_type; + unsigned int group_asym_packing; + long unsigned int group_misfit_task_load; + unsigned int nr_numa_running; + unsigned int nr_preferred_running; +}; + +struct sd_lb_stats { + struct sched_group *busiest; + struct sched_group *local; + long unsigned int total_load; + long unsigned int total_capacity; + long unsigned int avg_load; + unsigned int prefer_sibling; + struct sg_lb_stats busiest_stat; + struct sg_lb_stats local_stat; +}; + +typedef struct rt_rq *rt_rq_iter_t; + +struct swait_queue { + struct task_struct *task; + struct list_head task_list; +}; + +struct sd_flag_debug { + unsigned int meta_flags; + char *name; +}; + +typedef const struct cpumask * (*sched_domain_mask_f)(int); + +typedef int (*sched_domain_flags_f)(); + +struct sd_data { + struct sched_domain **sd; + struct sched_domain_shared **sds; + struct sched_group **sg; + struct sched_group_capacity **sgc; +}; + +struct sched_domain_topology_level { + sched_domain_mask_f mask; + sched_domain_flags_f sd_flags; + int flags; + int numa_level; + struct sd_data data; + char *name; +}; + +struct s_data { + struct sched_domain **sd; + struct root_domain *rd; +}; + +enum s_alloc { + sa_rootdomain = 0, + sa_sd = 1, + sa_sd_storage = 2, + sa_none = 3, +}; + +struct asym_cap_data { + struct list_head link; + long unsigned int capacity; + long unsigned int cpus[0]; +}; + +enum cpuacct_stat_index { + CPUACCT_STAT_USER = 0, + CPUACCT_STAT_SYSTEM = 1, + CPUACCT_STAT_NSTATS = 2, +}; + +struct cpuacct_usage { + u64 usages[2]; +}; + +struct cpuacct { + struct cgroup_subsys_state css; + struct cpuacct_usage *cpuusage; + struct kernel_cpustat *cpustat; +}; + +struct gov_attr_set { + struct kobject kobj; + struct list_head policy_list; + struct mutex update_lock; + int usage_count; +}; + +struct governor_attr { + struct attribute attr; + ssize_t (*show)(struct gov_attr_set *, char *); + ssize_t (*store)(struct gov_attr_set *, const char *, size_t); +}; + +struct sugov_tunables { + struct gov_attr_set attr_set; + unsigned int rate_limit_us; +}; + +struct sugov_policy { + struct cpufreq_policy *policy; + struct sugov_tunables *tunables; + struct list_head tunables_hook; + raw_spinlock_t update_lock; + u64 last_freq_update_time; + s64 freq_update_delay_ns; + unsigned int next_freq; + unsigned int cached_raw_freq; + struct irq_work irq_work; + struct kthread_work work; + struct mutex work_lock; + struct kthread_worker worker; + struct task_struct *thread; + bool work_in_progress; + bool limits_changed; + bool need_freq_update; +}; + +struct sugov_cpu { + struct update_util_data update_util; + struct sugov_policy *sg_policy; + unsigned int cpu; + bool iowait_boost_pending; + unsigned int iowait_boost; + u64 last_update; + long unsigned int util; + long unsigned int bw_dl; + long unsigned int max; + long unsigned int saved_idle_calls; +}; + +enum { + MEMBARRIER_FLAG_SYNC_CORE = 1, + MEMBARRIER_FLAG_RSEQ = 2, +}; + +enum membarrier_cmd { + MEMBARRIER_CMD_QUERY = 0, + MEMBARRIER_CMD_GLOBAL = 1, + MEMBARRIER_CMD_GLOBAL_EXPEDITED = 2, + MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = 4, + MEMBARRIER_CMD_PRIVATE_EXPEDITED = 8, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = 16, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = 64, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = 128, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = 256, + MEMBARRIER_CMD_SHARED = 1, +}; + +enum membarrier_cmd_flag { + MEMBARRIER_CMD_FLAG_CPU = 1, +}; + +struct proc_ops { + unsigned int proc_flags; + int (*proc_open)(struct inode *, struct file *); + ssize_t (*proc_read)(struct file *, char *, size_t, loff_t *); + ssize_t (*proc_read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*proc_write)(struct file *, const char *, size_t, loff_t *); + loff_t (*proc_lseek)(struct file *, loff_t, int); + int (*proc_release)(struct inode *, struct file *); + __poll_t (*proc_poll)(struct file *, struct poll_table_struct *); + long int (*proc_ioctl)(struct file *, unsigned int, long unsigned int); + long int (*proc_compat_ioctl)(struct file *, unsigned int, long unsigned int); + int (*proc_mmap)(struct file *, struct vm_area_struct *); + long unsigned int (*proc_get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); +}; + +enum psi_res { + PSI_IO = 0, + PSI_MEM = 1, + PSI_CPU = 2, + NR_PSI_RESOURCES = 3, +}; + +struct psi_window { + u64 size; + u64 start_time; + u64 start_value; + u64 prev_growth; +}; + +struct psi_trigger { + enum psi_states state; + u64 threshold; + struct list_head node; + struct psi_group *group; + wait_queue_head_t event_wait; + int event; + struct psi_window win; + u64 last_event_time; + struct kref refcount; +}; + +struct sched_core_cookie { + refcount_t refcnt; +}; + +struct ww_acquire_ctx; + +struct ww_mutex { + struct mutex base; + struct ww_acquire_ctx *ctx; +}; + +struct ww_acquire_ctx { + struct task_struct *task; + long unsigned int stamp; + unsigned int acquired; + short unsigned int wounded; + short unsigned int is_wait_die; +}; + +struct mutex_waiter { + struct list_head list; + struct task_struct *task; + struct ww_acquire_ctx *ww_ctx; +}; + +struct semaphore { + raw_spinlock_t lock; + unsigned int count; + struct list_head wait_list; +}; + +struct semaphore_waiter { + struct list_head list; + struct task_struct *task; + bool up; +}; + +enum rwsem_waiter_type { + RWSEM_WAITING_FOR_WRITE = 0, + RWSEM_WAITING_FOR_READ = 1, +}; + +struct rwsem_waiter { + struct list_head list; + struct task_struct *task; + enum rwsem_waiter_type type; + long unsigned int timeout; + bool handoff_set; +}; + +enum rwsem_wake_type { + RWSEM_WAKE_ANY = 0, + RWSEM_WAKE_READERS = 1, + RWSEM_WAKE_READ_OWNED = 2, +}; + +enum owner_state { + OWNER_NULL = 1, + OWNER_WRITER = 2, + OWNER_READER = 4, + OWNER_NONSPINNABLE = 8, +}; + +struct optimistic_spin_node { + struct optimistic_spin_node *next; + struct optimistic_spin_node *prev; + int locked; + int cpu; +}; + +struct mcs_spinlock { + struct mcs_spinlock *next; + int locked; + int count; +}; + +struct qnode { + struct mcs_spinlock mcs; +}; + +struct rt_mutex_base { + raw_spinlock_t wait_lock; + struct rb_root_cached waiters; + struct task_struct *owner; +}; + +struct rt_mutex { + struct rt_mutex_base rtmutex; +}; + +struct hrtimer_sleeper { + struct hrtimer timer; + struct task_struct *task; +}; + +struct rt_mutex_waiter { + struct rb_node tree_entry; + struct rb_node pi_tree_entry; + struct task_struct *task; + struct rt_mutex_base *lock; + unsigned int wake_state; + int prio; + u64 deadline; + struct ww_acquire_ctx *ww_ctx; +}; + +struct rt_wake_q_head { + struct wake_q_head head; + struct task_struct *rtlock_task; +}; + +enum rtmutex_chainwalk { + RT_MUTEX_MIN_CHAINWALK = 0, + RT_MUTEX_FULL_CHAINWALK = 1, +}; + +struct pm_qos_request { + struct plist_node node; + struct pm_qos_constraints *qos; +}; + +enum pm_qos_req_action { + PM_QOS_ADD_REQ = 0, + PM_QOS_UPDATE_REQ = 1, + PM_QOS_REMOVE_REQ = 2, +}; + +typedef int suspend_state_t; + +enum suspend_stat_step { + SUSPEND_FREEZE = 1, + SUSPEND_PREPARE = 2, + SUSPEND_SUSPEND = 3, + SUSPEND_SUSPEND_LATE = 4, + SUSPEND_SUSPEND_NOIRQ = 5, + SUSPEND_RESUME_NOIRQ = 6, + SUSPEND_RESUME_EARLY = 7, + SUSPEND_RESUME = 8, +}; + +struct suspend_stats { + int success; + int fail; + int failed_freeze; + int failed_prepare; + int failed_suspend; + int failed_suspend_late; + int failed_suspend_noirq; + int failed_resume; + int failed_resume_early; + int failed_resume_noirq; + int last_failed_dev; + char failed_devs[80]; + int last_failed_errno; + int errno[2]; + int last_failed_step; + enum suspend_stat_step failed_steps[2]; +}; + +enum { + TEST_NONE = 0, + TEST_CORE = 1, + TEST_CPUS = 2, + TEST_PLATFORM = 3, + TEST_DEVICES = 4, + TEST_FREEZER = 5, + __TEST_AFTER_LAST = 6, +}; + +struct pm_vt_switch { + struct list_head head; + struct device *dev; + bool required; +}; + +struct platform_suspend_ops { + int (*valid)(suspend_state_t); + int (*begin)(suspend_state_t); + int (*prepare)(); + int (*prepare_late)(); + int (*enter)(suspend_state_t); + void (*wake)(); + void (*finish)(); + bool (*suspend_again)(); + void (*end)(); + void (*recover)(); +}; + +struct platform_s2idle_ops { + int (*begin)(); + int (*prepare)(); + int (*prepare_late)(); + bool (*wake)(); + void (*restore_early)(); + void (*restore)(); + void (*end)(); +}; + +struct wakelock { + char *name; + struct rb_node node; + struct wakeup_source *ws; + struct list_head lru; +}; + +struct sysrq_key_op { + void (* const handler)(int); + const char * const help_msg; + const char * const action_msg; + const int enable_mask; +}; + +struct em_data_callback { + int (*active_power)(long unsigned int *, long unsigned int *, struct device *); +}; + +typedef unsigned int uint; + +typedef struct { + seqcount_t seqcount; +} seqcount_latch_t; + +struct dev_printk_info { + char subsystem[16]; + char device[48]; +}; + +struct console { + char name[16]; + void (*write)(struct console *, const char *, unsigned int); + int (*read)(struct console *, char *, unsigned int); + struct tty_driver * (*device)(struct console *, int *); + void (*unblank)(); + int (*setup)(struct console *, char *); + int (*exit)(struct console *); + int (*match)(struct console *, char *, int, char *); + short int flags; + short int index; + int cflag; + uint ispeed; + uint ospeed; + void *data; + struct console *next; +}; + +struct kmsg_dump_iter { + u64 cur_seq; + u64 next_seq; +}; + +struct kmsg_dumper { + struct list_head list; + void (*dump)(struct kmsg_dumper *, enum kmsg_dump_reason); + enum kmsg_dump_reason max_reason; + bool registered; +}; + +struct trace_event_raw_console { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_data_offsets_console { + u32 msg; +}; + +typedef void (*btf_trace_console)(void *, const char *, size_t); + +struct printk_info { + u64 seq; + u64 ts_nsec; + u16 text_len; + u8 facility; + u8 flags: 5; + u8 level: 3; + u32 caller_id; + struct dev_printk_info dev_info; +}; + +struct printk_record { + struct printk_info *info; + char *text_buf; + unsigned int text_buf_size; +}; + +struct prb_data_blk_lpos { + long unsigned int begin; + long unsigned int next; +}; + +struct prb_desc { + atomic_long_t state_var; + struct prb_data_blk_lpos text_blk_lpos; +}; + +struct prb_data_ring { + unsigned int size_bits; + char *data; + atomic_long_t head_lpos; + atomic_long_t tail_lpos; +}; + +struct prb_desc_ring { + unsigned int count_bits; + struct prb_desc *descs; + struct printk_info *infos; + atomic_long_t head_id; + atomic_long_t tail_id; +}; + +struct printk_ringbuffer { + struct prb_desc_ring desc_ring; + struct prb_data_ring text_data_ring; + atomic_long_t fail; +}; + +struct prb_reserved_entry { + struct printk_ringbuffer *rb; + long unsigned int irqflags; + long unsigned int id; + unsigned int text_space; +}; + +enum desc_state { + desc_miss = 4294967295, + desc_reserved = 0, + desc_committed = 1, + desc_finalized = 2, + desc_reusable = 3, +}; + +struct console_cmdline { + char name[16]; + int index; + bool user_specified; + char *options; +}; + +enum printk_info_flags { + LOG_NEWLINE = 2, + LOG_CONT = 8, +}; + +enum devkmsg_log_bits { + __DEVKMSG_LOG_BIT_ON = 0, + __DEVKMSG_LOG_BIT_OFF = 1, + __DEVKMSG_LOG_BIT_LOCK = 2, +}; + +enum devkmsg_log_masks { + DEVKMSG_LOG_MASK_ON = 1, + DEVKMSG_LOG_MASK_OFF = 2, + DEVKMSG_LOG_MASK_LOCK = 4, +}; + +enum con_msg_format_flags { + MSG_FORMAT_DEFAULT = 0, + MSG_FORMAT_SYSLOG = 1, +}; + +struct latched_seq { + seqcount_latch_t latch; + u64 val[2]; +}; + +struct devkmsg_user { + atomic64_t seq; + struct ratelimit_state rs; + struct mutex lock; + char buf[8192]; + struct printk_info info; + char text_buf[8192]; + struct printk_record record; +}; + +enum kdb_msgsrc { + KDB_MSGSRC_INTERNAL = 0, + KDB_MSGSRC_PRINTK = 1, +}; + +struct dev_printk_info___2; + +struct prb_data_block { + long unsigned int id; + char data[0]; +}; + +enum { + IRQS_AUTODETECT = 1, + IRQS_SPURIOUS_DISABLED = 2, + IRQS_POLL_INPROGRESS = 8, + IRQS_ONESHOT = 32, + IRQS_REPLAY = 64, + IRQS_WAITING = 128, + IRQS_PENDING = 512, + IRQS_SUSPENDED = 2048, + IRQS_TIMINGS = 4096, + IRQS_NMI = 8192, +}; + +enum { + _IRQ_DEFAULT_INIT_FLAGS = 0, + _IRQ_PER_CPU = 512, + _IRQ_LEVEL = 256, + _IRQ_NOPROBE = 1024, + _IRQ_NOREQUEST = 2048, + _IRQ_NOTHREAD = 65536, + _IRQ_NOAUTOEN = 4096, + _IRQ_MOVE_PCNTXT = 16384, + _IRQ_NO_BALANCING = 8192, + _IRQ_NESTED_THREAD = 32768, + _IRQ_PER_CPU_DEVID = 131072, + _IRQ_IS_POLLED = 262144, + _IRQ_DISABLE_UNLAZY = 524288, + _IRQ_HIDDEN = 1048576, + _IRQ_NO_DEBUG = 2097152, + _IRQF_MODIFY_MASK = 2096911, +}; + +enum { + IRQTF_RUNTHREAD = 0, + IRQTF_WARNED = 1, + IRQTF_AFFINITY = 2, + IRQTF_FORCED_THREAD = 3, +}; + +enum { + IRQ_SET_MASK_OK = 0, + IRQ_SET_MASK_OK_NOCOPY = 1, + IRQ_SET_MASK_OK_DONE = 2, +}; + +enum { + IRQCHIP_SET_TYPE_MASKED = 1, + IRQCHIP_EOI_IF_HANDLED = 2, + IRQCHIP_MASK_ON_SUSPEND = 4, + IRQCHIP_ONOFFLINE_ENABLED = 8, + IRQCHIP_SKIP_SET_WAKE = 16, + IRQCHIP_ONESHOT_SAFE = 32, + IRQCHIP_EOI_THREADED = 64, + IRQCHIP_SUPPORTS_LEVEL_MSI = 128, + IRQCHIP_SUPPORTS_NMI = 256, + IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND = 512, + IRQCHIP_AFFINITY_PRE_STARTUP = 1024, +}; + +enum { + IRQC_IS_HARDIRQ = 0, + IRQC_IS_NESTED = 1, +}; + +enum { + IRQ_STARTUP_NORMAL = 0, + IRQ_STARTUP_MANAGED = 1, + IRQ_STARTUP_ABORT = 2, +}; + +struct irq_devres { + unsigned int irq; + void *dev_id; +}; + +struct irq_desc_devres { + unsigned int from; + unsigned int cnt; +}; + +struct irq_generic_chip_devres { + struct irq_chip_generic *gc; + u32 msk; + unsigned int clr; + unsigned int set; +}; + +enum { + IRQ_DOMAIN_FLAG_HIERARCHY = 1, + IRQ_DOMAIN_NAME_ALLOCATED = 2, + IRQ_DOMAIN_FLAG_IPI_PER_CPU = 4, + IRQ_DOMAIN_FLAG_IPI_SINGLE = 8, + IRQ_DOMAIN_FLAG_MSI = 16, + IRQ_DOMAIN_FLAG_MSI_REMAP = 32, + IRQ_DOMAIN_MSI_NOMASK_QUIRK = 64, + IRQ_DOMAIN_FLAG_NO_MAP = 128, + IRQ_DOMAIN_FLAG_NONCORE = 65536, +}; + +struct irqchip_fwid { + struct fwnode_handle fwnode; + unsigned int type; + char *name; + phys_addr_t *pa; +}; + +enum { + AFFINITY = 0, + AFFINITY_LIST = 1, + EFFECTIVE = 2, + EFFECTIVE_LIST = 3, +}; + +struct msi_alloc_info { + struct msi_desc *desc; + irq_hw_number_t hwirq; + long unsigned int flags; + union { + long unsigned int ul; + void *ptr; + } scratchpad[2]; +}; + +typedef struct msi_alloc_info msi_alloc_info_t; + +struct msi_domain_info; + +struct msi_domain_ops { + irq_hw_number_t (*get_hwirq)(struct msi_domain_info *, msi_alloc_info_t *); + int (*msi_init)(struct irq_domain *, struct msi_domain_info *, unsigned int, irq_hw_number_t, msi_alloc_info_t *); + void (*msi_free)(struct irq_domain *, struct msi_domain_info *, unsigned int); + int (*msi_check)(struct irq_domain *, struct msi_domain_info *, struct device *); + int (*msi_prepare)(struct irq_domain *, struct device *, int, msi_alloc_info_t *); + void (*msi_finish)(msi_alloc_info_t *, int); + void (*set_desc)(msi_alloc_info_t *, struct msi_desc *); + int (*handle_error)(struct irq_domain *, struct msi_desc *, int); + int (*domain_alloc_irqs)(struct irq_domain *, struct device *, int); + void (*domain_free_irqs)(struct irq_domain *, struct device *); +}; + +struct msi_domain_info { + u32 flags; + struct msi_domain_ops *ops; + struct irq_chip *chip; + void *chip_data; + irq_flow_handler_t handler; + void *handler_data; + const char *handler_name; + void *data; +}; + +enum { + MSI_FLAG_USE_DEF_DOM_OPS = 1, + MSI_FLAG_USE_DEF_CHIP_OPS = 2, + MSI_FLAG_MULTI_PCI_MSI = 4, + MSI_FLAG_PCI_MSIX = 8, + MSI_FLAG_ACTIVATE_EARLY = 16, + MSI_FLAG_MUST_REACTIVATE = 32, + MSI_FLAG_LEVEL_CAPABLE = 64, +}; + +struct irq_affinity { + unsigned int pre_vectors; + unsigned int post_vectors; + unsigned int nr_sets; + unsigned int set_size[4]; + void (*calc_sets)(struct irq_affinity *, unsigned int); + void *priv; +}; + +struct node_vectors { + unsigned int id; + union { + unsigned int nvectors; + unsigned int ncpus; + }; +}; + +typedef void (*call_rcu_func_t)(struct callback_head *, rcu_callback_t); + +struct rcu_synchronize { + struct callback_head head; + struct completion completion; +}; + +struct trace_event_raw_rcu_utilization { + struct trace_entry ent; + const char *s; + char __data[0]; +}; + +struct trace_event_raw_rcu_stall_warning { + struct trace_entry ent; + const char *rcuname; + const char *msg; + char __data[0]; +}; + +struct trace_event_data_offsets_rcu_utilization {}; + +struct trace_event_data_offsets_rcu_stall_warning {}; + +typedef void (*btf_trace_rcu_utilization)(void *, const char *); + +typedef void (*btf_trace_rcu_stall_warning)(void *, const char *, const char *); + +struct rcu_tasks; + +typedef void (*rcu_tasks_gp_func_t)(struct rcu_tasks *); + +typedef void (*pregp_func_t)(); + +typedef void (*pertask_func_t)(struct task_struct *, struct list_head *); + +typedef void (*postscan_func_t)(struct list_head *); + +typedef void (*holdouts_func_t)(struct list_head *, bool, bool *); + +typedef void (*postgp_func_t)(struct rcu_tasks *); + +struct rcu_tasks { + struct callback_head *cbs_head; + struct callback_head **cbs_tail; + struct wait_queue_head cbs_wq; + raw_spinlock_t cbs_lock; + int gp_state; + int gp_sleep; + int init_fract; + long unsigned int gp_jiffies; + long unsigned int gp_start; + long unsigned int n_gps; + long unsigned int n_ipis; + long unsigned int n_ipis_fails; + struct task_struct *kthread_ptr; + rcu_tasks_gp_func_t gp_func; + pregp_func_t pregp_func; + pertask_func_t pertask_func; + postscan_func_t postscan_func; + holdouts_func_t holdouts_func; + postgp_func_t postgp_func; + call_rcu_func_t call_func; + char *name; + char *kname; +}; + +enum { + GP_IDLE = 0, + GP_ENTER = 1, + GP_PASSED = 2, + GP_EXIT = 3, + GP_REPLAY = 4, +}; + +typedef long unsigned int ulong; + +struct rcu_cblist { + struct callback_head *head; + struct callback_head **tail; + long int len; +}; + +enum rcutorture_type { + RCU_FLAVOR = 0, + RCU_TASKS_FLAVOR = 1, + RCU_TASKS_RUDE_FLAVOR = 2, + RCU_TASKS_TRACING_FLAVOR = 3, + RCU_TRIVIAL_FLAVOR = 4, + SRCU_FLAVOR = 5, + INVALID_RCU_FLAVOR = 6, +}; + +enum tick_dep_bits { + TICK_DEP_BIT_POSIX_TIMER = 0, + TICK_DEP_BIT_PERF_EVENTS = 1, + TICK_DEP_BIT_SCHED = 2, + TICK_DEP_BIT_CLOCK_UNSTABLE = 3, + TICK_DEP_BIT_RCU = 4, + TICK_DEP_BIT_RCU_EXP = 5, +}; + +struct rcu_exp_work { + long unsigned int rew_s; + struct work_struct rew_work; +}; + +struct rcu_node { + raw_spinlock_t lock; + long unsigned int gp_seq; + long unsigned int gp_seq_needed; + long unsigned int completedqs; + long unsigned int qsmask; + long unsigned int rcu_gp_init_mask; + long unsigned int qsmaskinit; + long unsigned int qsmaskinitnext; + long unsigned int ofl_seq; + long unsigned int expmask; + long unsigned int expmaskinit; + long unsigned int expmaskinitnext; + long unsigned int cbovldmask; + long unsigned int ffmask; + long unsigned int grpmask; + int grplo; + int grphi; + u8 grpnum; + u8 level; + bool wait_blkd_tasks; + struct rcu_node *parent; + struct list_head blkd_tasks; + struct list_head *gp_tasks; + struct list_head *exp_tasks; + struct list_head *boost_tasks; + struct rt_mutex boost_mtx; + long unsigned int boost_time; + struct task_struct *boost_kthread_task; + unsigned int boost_kthread_status; + long unsigned int n_boosts; + long: 64; + raw_spinlock_t fqslock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t exp_lock; + long unsigned int exp_seq_rq; + wait_queue_head_t exp_wq[4]; + struct rcu_exp_work rew; + bool exp_need_flush; + long: 56; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +union rcu_noqs { + struct { + u8 norm; + u8 exp; + } b; + u16 s; +}; + +struct rcu_data { + long unsigned int gp_seq; + long unsigned int gp_seq_needed; + union rcu_noqs cpu_no_qs; + bool core_needs_qs; + bool beenonline; + bool gpwrap; + bool exp_deferred_qs; + bool cpu_started; + struct rcu_node *mynode; + long unsigned int grpmask; + long unsigned int ticks_this_gp; + struct irq_work defer_qs_iw; + bool defer_qs_iw_pending; + struct work_struct strict_work; + struct rcu_segcblist cblist; + long int qlen_last_fqs_check; + long unsigned int n_cbs_invoked; + long unsigned int n_force_qs_snap; + long int blimit; + int dynticks_snap; + long int dynticks_nesting; + long int dynticks_nmi_nesting; + atomic_t dynticks; + bool rcu_need_heavy_qs; + bool rcu_urgent_qs; + bool rcu_forced_tick; + bool rcu_forced_tick_exp; + struct callback_head barrier_head; + int exp_dynticks_snap; + struct task_struct *rcu_cpu_kthread_task; + unsigned int rcu_cpu_kthread_status; + char rcu_cpu_has_work; + unsigned int softirq_snap; + struct irq_work rcu_iw; + bool rcu_iw_pending; + long unsigned int rcu_iw_gp_seq; + long unsigned int rcu_ofl_gp_seq; + short int rcu_ofl_gp_flags; + long unsigned int rcu_onl_gp_seq; + short int rcu_onl_gp_flags; + long unsigned int last_fqs_resched; + int cpu; +}; + +struct rcu_state { + struct rcu_node node[17]; + struct rcu_node *level[3]; + int ncpus; + int n_online_cpus; + long: 64; + long: 64; + long: 64; + long: 64; + u8 boost; + long unsigned int gp_seq; + long unsigned int gp_max; + struct task_struct *gp_kthread; + struct swait_queue_head gp_wq; + short int gp_flags; + short int gp_state; + long unsigned int gp_wake_time; + long unsigned int gp_wake_seq; + struct mutex barrier_mutex; + atomic_t barrier_cpu_count; + struct completion barrier_completion; + long unsigned int barrier_sequence; + struct mutex exp_mutex; + struct mutex exp_wake_mutex; + long unsigned int expedited_sequence; + atomic_t expedited_need_qs; + struct swait_queue_head expedited_wq; + int ncpus_snap; + u8 cbovld; + u8 cbovldnext; + long unsigned int jiffies_force_qs; + long unsigned int jiffies_kick_kthreads; + long unsigned int n_force_qs; + long unsigned int gp_start; + long unsigned int gp_end; + long unsigned int gp_activity; + long unsigned int gp_req_activity; + long unsigned int jiffies_stall; + long unsigned int jiffies_resched; + long unsigned int n_force_qs_gpstart; + const char *name; + char abbr; + long: 56; + long: 64; + long: 64; + raw_spinlock_t ofl_lock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct kvfree_rcu_bulk_data { + long unsigned int nr_records; + struct kvfree_rcu_bulk_data *next; + void *records[0]; +}; + +struct kfree_rcu_cpu; + +struct kfree_rcu_cpu_work { + struct rcu_work rcu_work; + struct callback_head *head_free; + struct kvfree_rcu_bulk_data *bkvhead_free[2]; + struct kfree_rcu_cpu *krcp; +}; + +struct kfree_rcu_cpu { + struct callback_head *head; + struct kvfree_rcu_bulk_data *bkvhead[2]; + struct kfree_rcu_cpu_work krw_arr[2]; + raw_spinlock_t lock; + struct delayed_work monitor_work; + bool monitor_todo; + bool initialized; + int count; + struct delayed_work page_cache_work; + atomic_t backoff_page_cache_fill; + atomic_t work_in_progress; + struct hrtimer hrtimer; + struct llist_head bkvcache; + int nr_bkv_objs; +}; + +struct dma_sgt_handle { + struct sg_table sgt; + struct page **pages; +}; + +struct dma_devres { + size_t size; + void *vaddr; + dma_addr_t dma_handle; + long unsigned int attrs; +}; + +struct cma_kobject; + +struct cma { + long unsigned int base_pfn; + long unsigned int count; + long unsigned int *bitmap; + unsigned int order_per_bit; + spinlock_t lock; + char name[64]; + atomic64_t nr_pages_succeeded; + atomic64_t nr_pages_failed; + struct cma_kobject *cma_kobj; +}; + +struct reserved_mem_ops; + +struct reserved_mem { + const char *name; + long unsigned int fdt_node; + long unsigned int phandle; + const struct reserved_mem_ops *ops; + phys_addr_t base; + phys_addr_t size; + void *priv; +}; + +struct reserved_mem_ops { + int (*device_init)(struct reserved_mem *, struct device *); + void (*device_release)(struct reserved_mem *, struct device *); +}; + +typedef int (*reservedmem_of_init_fn)(struct reserved_mem *); + +struct dma_coherent_mem { + void *virt_base; + dma_addr_t device_base; + long unsigned int pfn_base; + int size; + long unsigned int *bitmap; + spinlock_t spinlock; + bool use_dev_dma_pfn_offset; +}; + +enum cc_attr { + CC_ATTR_MEM_ENCRYPT = 0, + CC_ATTR_HOST_MEM_ENCRYPT = 1, + CC_ATTR_GUEST_MEM_ENCRYPT = 2, + CC_ATTR_GUEST_STATE_ENCRYPT = 3, +}; + +struct trace_event_raw_swiotlb_bounced { + struct trace_entry ent; + u32 __data_loc_dev_name; + u64 dma_mask; + dma_addr_t dev_addr; + size_t size; + enum swiotlb_force swiotlb_force; + char __data[0]; +}; + +struct trace_event_data_offsets_swiotlb_bounced { + u32 dev_name; +}; + +typedef void (*btf_trace_swiotlb_bounced)(void *, struct device *, dma_addr_t, size_t, enum swiotlb_force); + +struct gen_pool; + +typedef long unsigned int (*genpool_algo_t)(long unsigned int *, long unsigned int, long unsigned int, unsigned int, void *, struct gen_pool *, long unsigned int); + +struct gen_pool { + spinlock_t lock; + struct list_head chunks; + int min_alloc_order; + genpool_algo_t algo; + void *data; + const char *name; +}; + +enum kcmp_type { + KCMP_FILE = 0, + KCMP_VM = 1, + KCMP_FILES = 2, + KCMP_FS = 3, + KCMP_SIGHAND = 4, + KCMP_IO = 5, + KCMP_SYSVSEM = 6, + KCMP_EPOLL_TFD = 7, + KCMP_TYPES = 8, +}; + +struct kcmp_epoll_slot { + __u32 efd; + __u32 tfd; + __u32 toff; +}; + +enum profile_type { + PROFILE_TASK_EXIT = 0, + PROFILE_MUNMAP = 1, +}; + +struct profile_hit { + u32 pc; + u32 hits; +}; + +struct stacktrace_cookie { + long unsigned int *store; + unsigned int size; + unsigned int skip; + unsigned int len; +}; + +typedef __kernel_long_t __kernel_suseconds_t; + +typedef __kernel_suseconds_t suseconds_t; + +typedef __u64 timeu64_t; + +struct __kernel_itimerspec { + struct __kernel_timespec it_interval; + struct __kernel_timespec it_value; +}; + +struct timezone { + int tz_minuteswest; + int tz_dsttime; +}; + +struct itimerspec64 { + struct timespec64 it_interval; + struct timespec64 it_value; +}; + +struct old_itimerspec32 { + struct old_timespec32 it_interval; + struct old_timespec32 it_value; +}; + +struct old_timex32 { + u32 modes; + s32 offset; + s32 freq; + s32 maxerror; + s32 esterror; + s32 status; + s32 constant; + s32 precision; + s32 tolerance; + struct old_timeval32 time; + s32 tick; + s32 ppsfreq; + s32 jitter; + s32 shift; + s32 stabil; + s32 jitcnt; + s32 calcnt; + s32 errcnt; + s32 stbcnt; + s32 tai; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct __kernel_timex_timeval { + __kernel_time64_t tv_sec; + long long int tv_usec; +}; + +struct __kernel_timex { + unsigned int modes; + long long int offset; + long long int freq; + long long int maxerror; + long long int esterror; + int status; + long long int constant; + long long int precision; + long long int tolerance; + struct __kernel_timex_timeval time; + long long int tick; + long long int ppsfreq; + long long int jitter; + int shift; + long long int stabil; + long long int jitcnt; + long long int calcnt; + long long int errcnt; + long long int stbcnt; + int tai; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct trace_event_raw_timer_class { + struct trace_entry ent; + void *timer; + char __data[0]; +}; + +struct trace_event_raw_timer_start { + struct trace_entry ent; + void *timer; + void *function; + long unsigned int expires; + long unsigned int now; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_timer_expire_entry { + struct trace_entry ent; + void *timer; + long unsigned int now; + void *function; + long unsigned int baseclk; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_init { + struct trace_entry ent; + void *hrtimer; + clockid_t clockid; + enum hrtimer_mode mode; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_start { + struct trace_entry ent; + void *hrtimer; + void *function; + s64 expires; + s64 softexpires; + enum hrtimer_mode mode; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_expire_entry { + struct trace_entry ent; + void *hrtimer; + s64 now; + void *function; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_class { + struct trace_entry ent; + void *hrtimer; + char __data[0]; +}; + +struct trace_event_raw_itimer_state { + struct trace_entry ent; + int which; + long long unsigned int expires; + long int value_sec; + long int value_nsec; + long int interval_sec; + long int interval_nsec; + char __data[0]; +}; + +struct trace_event_raw_itimer_expire { + struct trace_entry ent; + int which; + pid_t pid; + long long unsigned int now; + char __data[0]; +}; + +struct trace_event_raw_tick_stop { + struct trace_entry ent; + int success; + int dependency; + char __data[0]; +}; + +struct trace_event_data_offsets_timer_class {}; + +struct trace_event_data_offsets_timer_start {}; + +struct trace_event_data_offsets_timer_expire_entry {}; + +struct trace_event_data_offsets_hrtimer_init {}; + +struct trace_event_data_offsets_hrtimer_start {}; + +struct trace_event_data_offsets_hrtimer_expire_entry {}; + +struct trace_event_data_offsets_hrtimer_class {}; + +struct trace_event_data_offsets_itimer_state {}; + +struct trace_event_data_offsets_itimer_expire {}; + +struct trace_event_data_offsets_tick_stop {}; + +typedef void (*btf_trace_timer_init)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_start)(void *, struct timer_list *, long unsigned int, unsigned int); + +typedef void (*btf_trace_timer_expire_entry)(void *, struct timer_list *, long unsigned int); + +typedef void (*btf_trace_timer_expire_exit)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_cancel)(void *, struct timer_list *); + +typedef void (*btf_trace_hrtimer_init)(void *, struct hrtimer *, clockid_t, enum hrtimer_mode); + +typedef void (*btf_trace_hrtimer_start)(void *, struct hrtimer *, enum hrtimer_mode); + +typedef void (*btf_trace_hrtimer_expire_entry)(void *, struct hrtimer *, ktime_t *); + +typedef void (*btf_trace_hrtimer_expire_exit)(void *, struct hrtimer *); + +typedef void (*btf_trace_hrtimer_cancel)(void *, struct hrtimer *); + +typedef void (*btf_trace_itimer_state)(void *, int, const struct itimerspec64 * const, long long unsigned int); + +typedef void (*btf_trace_itimer_expire)(void *, int, struct pid *, long long unsigned int); + +typedef void (*btf_trace_tick_stop)(void *, int, int); + +struct timer_base { + raw_spinlock_t lock; + struct timer_list *running_timer; + long unsigned int clk; + long unsigned int next_expiry; + unsigned int cpu; + bool next_expiry_recalc; + bool is_idle; + bool timers_pending; + long unsigned int pending_map[9]; + struct hlist_head vectors[576]; + long: 64; + long: 64; +}; + +struct process_timer { + struct timer_list timer; + struct task_struct *task; +}; + +enum clock_event_state { + CLOCK_EVT_STATE_DETACHED = 0, + CLOCK_EVT_STATE_SHUTDOWN = 1, + CLOCK_EVT_STATE_PERIODIC = 2, + CLOCK_EVT_STATE_ONESHOT = 3, + CLOCK_EVT_STATE_ONESHOT_STOPPED = 4, +}; + +struct clock_event_device { + void (*event_handler)(struct clock_event_device *); + int (*set_next_event)(long unsigned int, struct clock_event_device *); + int (*set_next_ktime)(ktime_t, struct clock_event_device *); + ktime_t next_event; + u64 max_delta_ns; + u64 min_delta_ns; + u32 mult; + u32 shift; + enum clock_event_state state_use_accessors; + unsigned int features; + long unsigned int retries; + int (*set_state_periodic)(struct clock_event_device *); + int (*set_state_oneshot)(struct clock_event_device *); + int (*set_state_oneshot_stopped)(struct clock_event_device *); + int (*set_state_shutdown)(struct clock_event_device *); + int (*tick_resume)(struct clock_event_device *); + void (*broadcast)(const struct cpumask *); + void (*suspend)(struct clock_event_device *); + void (*resume)(struct clock_event_device *); + long unsigned int min_delta_ticks; + long unsigned int max_delta_ticks; + const char *name; + int rating; + int irq; + int bound_on; + const struct cpumask *cpumask; + struct list_head list; + struct module *owner; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum tick_device_mode { + TICKDEV_MODE_PERIODIC = 0, + TICKDEV_MODE_ONESHOT = 1, +}; + +struct tick_device { + struct clock_event_device *evtdev; + enum tick_device_mode mode; +}; + +struct ktime_timestamps { + u64 mono; + u64 boot; + u64 real; +}; + +struct system_device_crosststamp { + ktime_t device; + ktime_t sys_realtime; + ktime_t sys_monoraw; +}; + +struct system_counterval_t { + u64 cycles; + struct clocksource *cs; +}; + +struct audit_ntp_val { + long long int oldval; + long long int newval; +}; + +struct audit_ntp_data { + struct audit_ntp_val vals[6]; +}; + +enum timekeeping_adv_mode { + TK_ADV_TICK = 0, + TK_ADV_FREQ = 1, +}; + +struct tk_fast { + seqcount_latch_t seq; + struct tk_read_base base[2]; +}; + +struct rtc_time { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +}; + +struct rtc_wkalrm { + unsigned char enabled; + unsigned char pending; + struct rtc_time time; +}; + +struct rtc_param { + __u64 param; + union { + __u64 uvalue; + __s64 svalue; + __u64 ptr; + }; + __u32 index; + __u32 __pad; +}; + +struct rtc_class_ops { + int (*ioctl)(struct device *, unsigned int, long unsigned int); + int (*read_time)(struct device *, struct rtc_time *); + int (*set_time)(struct device *, struct rtc_time *); + int (*read_alarm)(struct device *, struct rtc_wkalrm *); + int (*set_alarm)(struct device *, struct rtc_wkalrm *); + int (*proc)(struct device *, struct seq_file *); + int (*alarm_irq_enable)(struct device *, unsigned int); + int (*read_offset)(struct device *, long int *); + int (*set_offset)(struct device *, long int); + int (*param_get)(struct device *, struct rtc_param *); + int (*param_set)(struct device *, struct rtc_param *); +}; + +struct rtc_device; + +struct rtc_timer { + struct timerqueue_node node; + ktime_t period; + void (*func)(struct rtc_device *); + struct rtc_device *rtc; + int enabled; +}; + +struct rtc_device { + struct device dev; + struct module *owner; + int id; + const struct rtc_class_ops *ops; + struct mutex ops_lock; + struct cdev char_dev; + long unsigned int flags; + long unsigned int irq_data; + spinlock_t irq_lock; + wait_queue_head_t irq_queue; + struct fasync_struct *async_queue; + int irq_freq; + int max_user_freq; + struct timerqueue_head timerqueue; + struct rtc_timer aie_timer; + struct rtc_timer uie_rtctimer; + struct hrtimer pie_timer; + int pie_enabled; + struct work_struct irqwork; + int uie_unsupported; + long unsigned int set_offset_nsec; + long unsigned int features[1]; + time64_t range_min; + timeu64_t range_max; + time64_t start_secs; + time64_t offset_secs; + bool set_start_time; +}; + +enum tick_nohz_mode { + NOHZ_MODE_INACTIVE = 0, + NOHZ_MODE_LOWRES = 1, + NOHZ_MODE_HIGHRES = 2, +}; + +struct tick_sched { + struct hrtimer sched_timer; + long unsigned int check_clocks; + enum tick_nohz_mode nohz_mode; + unsigned int inidle: 1; + unsigned int tick_stopped: 1; + unsigned int idle_active: 1; + unsigned int do_timer_last: 1; + unsigned int got_idle_tick: 1; + ktime_t last_tick; + ktime_t next_tick; + long unsigned int idle_jiffies; + long unsigned int idle_calls; + long unsigned int idle_sleeps; + ktime_t idle_entrytime; + ktime_t idle_waketime; + ktime_t idle_exittime; + ktime_t idle_sleeptime; + ktime_t iowait_sleeptime; + long unsigned int last_jiffies; + u64 timer_expires; + u64 timer_expires_base; + u64 next_timer; + ktime_t idle_expires; + atomic_t tick_dep_mask; +}; + +struct timer_list_iter { + int cpu; + bool second_pass; + u64 now; +}; + +struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + long int tm_year; + int tm_wday; + int tm_yday; +}; + +typedef __kernel_timer_t timer_t; + +enum alarmtimer_type { + ALARM_REALTIME = 0, + ALARM_BOOTTIME = 1, + ALARM_NUMTYPE = 2, + ALARM_REALTIME_FREEZER = 3, + ALARM_BOOTTIME_FREEZER = 4, +}; + +enum alarmtimer_restart { + ALARMTIMER_NORESTART = 0, + ALARMTIMER_RESTART = 1, +}; + +struct alarm { + struct timerqueue_node node; + struct hrtimer timer; + enum alarmtimer_restart (*function)(struct alarm *, ktime_t); + enum alarmtimer_type type; + int state; + void *data; +}; + +struct cpu_timer { + struct timerqueue_node node; + struct timerqueue_head *head; + struct pid *pid; + struct list_head elist; + int firing; +}; + +struct k_clock; + +struct k_itimer { + struct list_head list; + struct hlist_node t_hash; + spinlock_t it_lock; + const struct k_clock *kclock; + clockid_t it_clock; + timer_t it_id; + int it_active; + s64 it_overrun; + s64 it_overrun_last; + int it_requeue_pending; + int it_sigev_notify; + ktime_t it_interval; + struct signal_struct *it_signal; + union { + struct pid *it_pid; + struct task_struct *it_process; + }; + struct sigqueue *sigq; + union { + struct { + struct hrtimer timer; + } real; + struct cpu_timer cpu; + struct { + struct alarm alarmtimer; + } alarm; + } it; + struct callback_head rcu; +}; + +struct k_clock { + int (*clock_getres)(const clockid_t, struct timespec64 *); + int (*clock_set)(const clockid_t, const struct timespec64 *); + int (*clock_get_timespec)(const clockid_t, struct timespec64 *); + ktime_t (*clock_get_ktime)(const clockid_t); + int (*clock_adj)(const clockid_t, struct __kernel_timex *); + int (*timer_create)(struct k_itimer *); + int (*nsleep)(const clockid_t, int, const struct timespec64 *); + int (*timer_set)(struct k_itimer *, int, struct itimerspec64 *, struct itimerspec64 *); + int (*timer_del)(struct k_itimer *); + void (*timer_get)(struct k_itimer *, struct itimerspec64 *); + void (*timer_rearm)(struct k_itimer *); + s64 (*timer_forward)(struct k_itimer *, ktime_t); + ktime_t (*timer_remaining)(struct k_itimer *, ktime_t); + int (*timer_try_to_cancel)(struct k_itimer *); + void (*timer_arm)(struct k_itimer *, ktime_t, bool, bool); + void (*timer_wait_running)(struct k_itimer *); +}; + +struct class_interface { + struct list_head node; + struct class *class; + int (*add_dev)(struct device *, struct class_interface *); + void (*remove_dev)(struct device *, struct class_interface *); +}; + +struct property_entry; + +struct platform_device_info { + struct device *parent; + struct fwnode_handle *fwnode; + bool of_node_reused; + const char *name; + int id; + const struct resource *res; + unsigned int num_res; + const void *data; + size_t size_data; + u64 dma_mask; + const struct property_entry *properties; +}; + +enum dev_prop_type { + DEV_PROP_U8 = 0, + DEV_PROP_U16 = 1, + DEV_PROP_U32 = 2, + DEV_PROP_U64 = 3, + DEV_PROP_STRING = 4, + DEV_PROP_REF = 5, +}; + +struct property_entry { + const char *name; + size_t length; + bool is_inline; + enum dev_prop_type type; + union { + const void *pointer; + union { + u8 u8_data[8]; + u16 u16_data[4]; + u32 u32_data[2]; + u64 u64_data[1]; + const char *str[1]; + } value; + }; +}; + +struct trace_event_raw_alarmtimer_suspend { + struct trace_entry ent; + s64 expires; + unsigned char alarm_type; + char __data[0]; +}; + +struct trace_event_raw_alarm_class { + struct trace_entry ent; + void *alarm; + unsigned char alarm_type; + s64 expires; + s64 now; + char __data[0]; +}; + +struct trace_event_data_offsets_alarmtimer_suspend {}; + +struct trace_event_data_offsets_alarm_class {}; + +typedef void (*btf_trace_alarmtimer_suspend)(void *, ktime_t, int); + +typedef void (*btf_trace_alarmtimer_fired)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_start)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_cancel)(void *, struct alarm *, ktime_t); + +struct alarm_base { + spinlock_t lock; + struct timerqueue_head timerqueue; + ktime_t (*get_ktime)(); + void (*get_timespec)(struct timespec64 *); + clockid_t base_clockid; +}; + +struct sigevent { + sigval_t sigev_value; + int sigev_signo; + int sigev_notify; + union { + int _pad[12]; + int _tid; + struct { + void (*_function)(sigval_t); + void *_attribute; + } _sigev_thread; + } _sigev_un; +}; + +typedef struct sigevent sigevent_t; + +struct compat_sigevent { + compat_sigval_t sigev_value; + compat_int_t sigev_signo; + compat_int_t sigev_notify; + union { + compat_int_t _pad[13]; + compat_int_t _tid; + struct { + compat_uptr_t _function; + compat_uptr_t _attribute; + } _sigev_thread; + } _sigev_un; +}; + +struct posix_clock; + +struct posix_clock_operations { + struct module *owner; + int (*clock_adjtime)(struct posix_clock *, struct __kernel_timex *); + int (*clock_gettime)(struct posix_clock *, struct timespec64 *); + int (*clock_getres)(struct posix_clock *, struct timespec64 *); + int (*clock_settime)(struct posix_clock *, const struct timespec64 *); + long int (*ioctl)(struct posix_clock *, unsigned int, long unsigned int); + int (*open)(struct posix_clock *, fmode_t); + __poll_t (*poll)(struct posix_clock *, struct file *, poll_table *); + int (*release)(struct posix_clock *); + ssize_t (*read)(struct posix_clock *, uint, char *, size_t); +}; + +struct posix_clock { + struct posix_clock_operations ops; + struct cdev cdev; + struct device *dev; + struct rw_semaphore rwsem; + bool zombie; +}; + +struct posix_clock_desc { + struct file *fp; + struct posix_clock *clk; +}; + +struct __kernel_old_itimerval { + struct __kernel_old_timeval it_interval; + struct __kernel_old_timeval it_value; +}; + +struct old_itimerval32 { + struct old_timeval32 it_interval; + struct old_timeval32 it_value; +}; + +struct ce_unbind { + struct clock_event_device *ce; + int res; +}; + +enum tick_broadcast_state { + TICK_BROADCAST_EXIT = 0, + TICK_BROADCAST_ENTER = 1, +}; + +enum tick_broadcast_mode { + TICK_BROADCAST_OFF = 0, + TICK_BROADCAST_ON = 1, + TICK_BROADCAST_FORCE = 2, +}; + +struct clock_data { + seqcount_latch_t seq; + struct clock_read_data read_data[2]; + ktime_t wrap_kt; + long unsigned int rate; + u64 (*actual_read_sched_clock)(); +}; + +struct proc_timens_offset { + int clockid; + struct timespec64 val; +}; + +union futex_key { + struct { + u64 i_seq; + long unsigned int pgoff; + unsigned int offset; + } shared; + struct { + union { + struct mm_struct *mm; + u64 __tmp; + }; + long unsigned int address; + unsigned int offset; + } private; + struct { + u64 ptr; + long unsigned int word; + unsigned int offset; + } both; +}; + +struct futex_pi_state { + struct list_head list; + struct rt_mutex_base pi_mutex; + struct task_struct *owner; + refcount_t refcount; + union futex_key key; +}; + +struct futex_hash_bucket { + atomic_t waiters; + spinlock_t lock; + struct plist_head chain; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct futex_q { + struct plist_node list; + struct task_struct *task; + spinlock_t *lock_ptr; + union futex_key key; + struct futex_pi_state *pi_state; + struct rt_mutex_waiter *rt_waiter; + union futex_key *requeue_pi_key; + u32 bitset; + atomic_t requeue_state; +}; + +enum futex_access { + FUTEX_READ = 0, + FUTEX_WRITE = 1, +}; + +struct futex_waitv { + __u64 val; + __u64 uaddr; + __u32 flags; + __u32 __reserved; +}; + +struct futex_vector { + struct futex_waitv w; + struct futex_q q; +}; + +enum { + Q_REQUEUE_PI_NONE = 0, + Q_REQUEUE_PI_IGNORE = 1, + Q_REQUEUE_PI_IN_PROGRESS = 2, + Q_REQUEUE_PI_WAIT = 3, + Q_REQUEUE_PI_DONE = 4, + Q_REQUEUE_PI_LOCKED = 5, +}; + +struct cfd_percpu { + call_single_data_t csd; +}; + +struct call_function_data { + struct cfd_percpu *pcpu; + cpumask_var_t cpumask; + cpumask_var_t cpumask_ipi; +}; + +struct smp_call_on_cpu_struct { + struct work_struct work; + struct completion done; + int (*func)(void *); + void *data; + int ret; + int cpu; +}; + +typedef short unsigned int __kernel_old_uid_t; + +typedef short unsigned int __kernel_old_gid_t; + +typedef __kernel_old_uid_t old_uid_t; + +typedef __kernel_old_gid_t old_gid_t; + +struct latch_tree_root { + seqcount_latch_t seq; + struct rb_root tree[2]; +}; + +struct latch_tree_ops { + bool (*less)(struct latch_tree_node *, struct latch_tree_node *); + int (*comp)(void *, struct latch_tree_node *); +}; + +struct modversion_info { + long unsigned int crc; + char name[56]; +}; + +struct module_use { + struct list_head source_list; + struct list_head target_list; + struct module *source; + struct module *target; +}; + +struct module_sect_attr { + struct bin_attribute battr; + long unsigned int address; +}; + +struct module_sect_attrs { + struct attribute_group grp; + unsigned int nsections; + struct module_sect_attr attrs[0]; +}; + +struct module_notes_attrs { + struct kobject *dir; + unsigned int notes; + struct bin_attribute attrs[0]; +}; + +enum kernel_read_file_id { + READING_UNKNOWN = 0, + READING_FIRMWARE = 1, + READING_MODULE = 2, + READING_KEXEC_IMAGE = 3, + READING_KEXEC_INITRAMFS = 4, + READING_POLICY = 5, + READING_X509_CERTIFICATE = 6, + READING_MAX_ID = 7, +}; + +enum kernel_load_data_id { + LOADING_UNKNOWN = 0, + LOADING_FIRMWARE = 1, + LOADING_MODULE = 2, + LOADING_KEXEC_IMAGE = 3, + LOADING_KEXEC_INITRAMFS = 4, + LOADING_POLICY = 5, + LOADING_X509_CERTIFICATE = 6, + LOADING_MAX_ID = 7, +}; + +enum { + PROC_ENTRY_PERMANENT = 1, +}; + +struct load_info { + const char *name; + struct module *mod; + Elf64_Ehdr *hdr; + long unsigned int len; + Elf64_Shdr *sechdrs; + char *secstrings; + char *strtab; + long unsigned int symoffs; + long unsigned int stroffs; + long unsigned int init_typeoffs; + long unsigned int core_typeoffs; + struct _ddebug *debug; + unsigned int num_debug; + bool sig_ok; + long unsigned int mod_kallsyms_init_off; + struct { + unsigned int sym; + unsigned int str; + unsigned int mod; + unsigned int vers; + unsigned int info; + unsigned int pcpu; + } index; +}; + +struct trace_event_raw_module_load { + struct trace_entry ent; + unsigned int taints; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_free { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_refcnt { + struct trace_entry ent; + long unsigned int ip; + int refcnt; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_request { + struct trace_entry ent; + long unsigned int ip; + bool wait; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_data_offsets_module_load { + u32 name; +}; + +struct trace_event_data_offsets_module_free { + u32 name; +}; + +struct trace_event_data_offsets_module_refcnt { + u32 name; +}; + +struct trace_event_data_offsets_module_request { + u32 name; +}; + +typedef void (*btf_trace_module_load)(void *, struct module *); + +typedef void (*btf_trace_module_free)(void *, struct module *); + +typedef void (*btf_trace_module_get)(void *, struct module *, long unsigned int); + +typedef void (*btf_trace_module_put)(void *, struct module *, long unsigned int); + +typedef void (*btf_trace_module_request)(void *, char *, bool, long unsigned int); + +struct mod_tree_root { + struct latch_tree_root root; + long unsigned int addr_min; + long unsigned int addr_max; +}; + +enum mod_license { + NOT_GPL_ONLY = 0, + GPL_ONLY = 1, +}; + +struct symsearch { + const struct kernel_symbol *start; + const struct kernel_symbol *stop; + const s32 *crcs; + enum mod_license license; +}; + +struct find_symbol_arg { + const char *name; + bool gplok; + bool warn; + struct module *owner; + const s32 *crc; + const struct kernel_symbol *sym; + enum mod_license license; +}; + +struct mod_initfree { + struct llist_node node; + void *module_init; +}; + +struct module_signature { + u8 algo; + u8 hash; + u8 id_type; + u8 signer_len; + u8 key_id_len; + u8 __pad[3]; + __be32 sig_len; +}; + +enum pkey_id_type { + PKEY_ID_PGP = 0, + PKEY_ID_X509 = 1, + PKEY_ID_PKCS7 = 2, +}; + +struct kallsym_iter { + loff_t pos; + loff_t pos_arch_end; + loff_t pos_mod_end; + loff_t pos_ftrace_mod_end; + loff_t pos_bpf_end; + long unsigned int value; + unsigned int nameoff; + char type; + char name[128]; + char module_name[56]; + int exported; + int show_value; +}; + +typedef struct { + int val[2]; +} __kernel_fsid_t; + +struct kstatfs { + long int f_type; + long int f_bsize; + u64 f_blocks; + u64 f_bfree; + u64 f_bavail; + u64 f_files; + u64 f_ffree; + __kernel_fsid_t f_fsid; + long int f_namelen; + long int f_frsize; + long int f_flags; + long int f_spare[4]; +}; + +typedef __u16 comp_t; + +struct acct_v3 { + char ac_flag; + char ac_version; + __u16 ac_tty; + __u32 ac_exitcode; + __u32 ac_uid; + __u32 ac_gid; + __u32 ac_pid; + __u32 ac_ppid; + __u32 ac_btime; + __u32 ac_etime; + comp_t ac_utime; + comp_t ac_stime; + comp_t ac_mem; + comp_t ac_io; + comp_t ac_rw; + comp_t ac_minflt; + comp_t ac_majflt; + comp_t ac_swaps; + char ac_comm[16]; +}; + +typedef struct acct_v3 acct_t; + +struct fs_pin { + wait_queue_head_t wait; + int done; + struct hlist_node s_list; + struct hlist_node m_list; + void (*kill)(struct fs_pin *); +}; + +struct bsd_acct_struct { + struct fs_pin pin; + atomic_long_t count; + struct callback_head rcu; + struct mutex lock; + int active; + long unsigned int needcheck; + struct file *file; + struct pid_namespace *ns; + struct work_struct work; + struct completion done; +}; + +struct elf64_note { + Elf64_Word n_namesz; + Elf64_Word n_descsz; + Elf64_Word n_type; +}; + +typedef long unsigned int elf_greg_t; + +typedef elf_greg_t elf_gregset_t[34]; + +struct elf_siginfo { + int si_signo; + int si_code; + int si_errno; +}; + +struct elf_prstatus_common { + struct elf_siginfo pr_info; + short int pr_cursig; + long unsigned int pr_sigpend; + long unsigned int pr_sighold; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + struct __kernel_old_timeval pr_utime; + struct __kernel_old_timeval pr_stime; + struct __kernel_old_timeval pr_cutime; + struct __kernel_old_timeval pr_cstime; +}; + +struct elf_prstatus { + struct elf_prstatus_common common; + elf_gregset_t pr_reg; + int pr_fpvalid; +}; + +typedef u32 note_buf_t[106]; + +struct compat_kexec_segment { + compat_uptr_t buf; + compat_size_t bufsz; + compat_ulong_t mem; + compat_size_t memsz; +}; + +struct elf64_phdr { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +}; + +typedef struct elf64_phdr Elf64_Phdr; + +enum hash_algo { + HASH_ALGO_MD4 = 0, + HASH_ALGO_MD5 = 1, + HASH_ALGO_SHA1 = 2, + HASH_ALGO_RIPE_MD_160 = 3, + HASH_ALGO_SHA256 = 4, + HASH_ALGO_SHA384 = 5, + HASH_ALGO_SHA512 = 6, + HASH_ALGO_SHA224 = 7, + HASH_ALGO_RIPE_MD_128 = 8, + HASH_ALGO_RIPE_MD_256 = 9, + HASH_ALGO_RIPE_MD_320 = 10, + HASH_ALGO_WP_256 = 11, + HASH_ALGO_WP_384 = 12, + HASH_ALGO_WP_512 = 13, + HASH_ALGO_TGR_128 = 14, + HASH_ALGO_TGR_160 = 15, + HASH_ALGO_TGR_192 = 16, + HASH_ALGO_SM3_256 = 17, + HASH_ALGO_STREEBOG_256 = 18, + HASH_ALGO_STREEBOG_512 = 19, + HASH_ALGO__LAST = 20, +}; + +struct crypto_alg; + +struct crypto_tfm { + u32 crt_flags; + int node; + void (*exit)(struct crypto_tfm *); + struct crypto_alg *__crt_alg; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__crt_ctx[0]; +}; + +struct cipher_alg { + unsigned int cia_min_keysize; + unsigned int cia_max_keysize; + int (*cia_setkey)(struct crypto_tfm *, const u8 *, unsigned int); + void (*cia_encrypt)(struct crypto_tfm *, u8 *, const u8 *); + void (*cia_decrypt)(struct crypto_tfm *, u8 *, const u8 *); +}; + +struct compress_alg { + int (*coa_compress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); + int (*coa_decompress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); +}; + +struct crypto_istat_aead { + atomic64_t encrypt_cnt; + atomic64_t encrypt_tlen; + atomic64_t decrypt_cnt; + atomic64_t decrypt_tlen; + atomic64_t err_cnt; +}; + +struct crypto_istat_akcipher { + atomic64_t encrypt_cnt; + atomic64_t encrypt_tlen; + atomic64_t decrypt_cnt; + atomic64_t decrypt_tlen; + atomic64_t verify_cnt; + atomic64_t sign_cnt; + atomic64_t err_cnt; +}; + +struct crypto_istat_cipher { + atomic64_t encrypt_cnt; + atomic64_t encrypt_tlen; + atomic64_t decrypt_cnt; + atomic64_t decrypt_tlen; + atomic64_t err_cnt; +}; + +struct crypto_istat_compress { + atomic64_t compress_cnt; + atomic64_t compress_tlen; + atomic64_t decompress_cnt; + atomic64_t decompress_tlen; + atomic64_t err_cnt; +}; + +struct crypto_istat_hash { + atomic64_t hash_cnt; + atomic64_t hash_tlen; + atomic64_t err_cnt; +}; + +struct crypto_istat_kpp { + atomic64_t setsecret_cnt; + atomic64_t generate_public_key_cnt; + atomic64_t compute_shared_secret_cnt; + atomic64_t err_cnt; +}; + +struct crypto_istat_rng { + atomic64_t generate_cnt; + atomic64_t generate_tlen; + atomic64_t seed_cnt; + atomic64_t err_cnt; +}; + +struct crypto_type; + +struct crypto_alg { + struct list_head cra_list; + struct list_head cra_users; + u32 cra_flags; + unsigned int cra_blocksize; + unsigned int cra_ctxsize; + unsigned int cra_alignmask; + int cra_priority; + refcount_t cra_refcnt; + char cra_name[128]; + char cra_driver_name[128]; + const struct crypto_type *cra_type; + union { + struct cipher_alg cipher; + struct compress_alg compress; + } cra_u; + int (*cra_init)(struct crypto_tfm *); + void (*cra_exit)(struct crypto_tfm *); + void (*cra_destroy)(struct crypto_alg *); + struct module *cra_module; + union { + struct crypto_istat_aead aead; + struct crypto_istat_akcipher akcipher; + struct crypto_istat_cipher cipher; + struct crypto_istat_compress compress; + struct crypto_istat_hash hash; + struct crypto_istat_rng rng; + struct crypto_istat_kpp kpp; + } stats; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct crypto_instance; + +struct crypto_type { + unsigned int (*ctxsize)(struct crypto_alg *, u32, u32); + unsigned int (*extsize)(struct crypto_alg *); + int (*init)(struct crypto_tfm *, u32, u32); + int (*init_tfm)(struct crypto_tfm *); + void (*show)(struct seq_file *, struct crypto_alg *); + int (*report)(struct sk_buff *, struct crypto_alg *); + void (*free)(struct crypto_instance *); + unsigned int type; + unsigned int maskclear; + unsigned int maskset; + unsigned int tfmsize; +}; + +struct crypto_shash; + +struct shash_desc { + struct crypto_shash *tfm; + void *__ctx[0]; +}; + +struct crypto_shash { + unsigned int descsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +struct kexec_sha_region { + long unsigned int start; + long unsigned int len; +}; + +enum migrate_reason { + MR_COMPACTION = 0, + MR_MEMORY_FAILURE = 1, + MR_MEMORY_HOTPLUG = 2, + MR_SYSCALL = 3, + MR_MEMPOLICY_MBIND = 4, + MR_NUMA_MISPLACED = 5, + MR_CONTIG_RANGE = 6, + MR_LONGTERM_PIN = 7, + MR_DEMOTION = 8, + MR_TYPES = 9, +}; + +typedef __kernel_ulong_t ino_t; + +enum kernfs_node_type { + KERNFS_DIR = 1, + KERNFS_FILE = 2, + KERNFS_LINK = 4, +}; + +enum kernfs_root_flag { + KERNFS_ROOT_CREATE_DEACTIVATED = 1, + KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 2, + KERNFS_ROOT_SUPPORT_EXPORTOP = 4, + KERNFS_ROOT_SUPPORT_USER_XATTR = 8, +}; + +struct kernfs_fs_context { + struct kernfs_root *root; + void *ns_tag; + long unsigned int magic; + bool new_sb_created; +}; + +enum { + CGRP_NOTIFY_ON_RELEASE = 0, + CGRP_CPUSET_CLONE_CHILDREN = 1, + CGRP_FREEZE = 2, + CGRP_FROZEN = 3, + CGRP_KILL = 4, +}; + +enum { + CGRP_ROOT_NOPREFIX = 2, + CGRP_ROOT_XATTR = 4, + CGRP_ROOT_NS_DELEGATE = 8, + CGRP_ROOT_CPUSET_V2_MODE = 16, + CGRP_ROOT_MEMORY_LOCAL_EVENTS = 32, + CGRP_ROOT_MEMORY_RECURSIVE_PROT = 64, +}; + +struct cgroup_taskset { + struct list_head src_csets; + struct list_head dst_csets; + int nr_tasks; + int ssid; + struct list_head *csets; + struct css_set *cur_cset; + struct task_struct *cur_task; +}; + +struct cgroup_fs_context { + struct kernfs_fs_context kfc; + struct cgroup_root *root; + struct cgroup_namespace *ns; + unsigned int flags; + bool cpuset_clone_children; + bool none; + bool all_ss; + u16 subsys_mask; + char *name; + char *release_agent; +}; + +struct cgroup_pidlist; + +struct cgroup_file_ctx { + struct cgroup_namespace *ns; + struct { + void *trigger; + } psi; + struct { + bool started; + struct css_task_iter iter; + } procs; + struct { + struct cgroup_pidlist *pidlist; + } procs1; +}; + +struct cgrp_cset_link { + struct cgroup *cgrp; + struct css_set *cset; + struct list_head cset_link; + struct list_head cgrp_link; +}; + +struct cgroup_mgctx { + struct list_head preloaded_src_csets; + struct list_head preloaded_dst_csets; + struct cgroup_taskset tset; + u16 ss_mask; +}; + +struct trace_event_raw_cgroup_root { + struct trace_entry ent; + int root; + u16 ss_mask; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_cgroup { + struct trace_entry ent; + int root; + int id; + int level; + u32 __data_loc_path; + char __data[0]; +}; + +struct trace_event_raw_cgroup_migrate { + struct trace_entry ent; + int dst_root; + int dst_id; + int dst_level; + int pid; + u32 __data_loc_dst_path; + u32 __data_loc_comm; + char __data[0]; +}; + +struct trace_event_raw_cgroup_event { + struct trace_entry ent; + int root; + int id; + int level; + u32 __data_loc_path; + int val; + char __data[0]; +}; + +struct trace_event_data_offsets_cgroup_root { + u32 name; +}; + +struct trace_event_data_offsets_cgroup { + u32 path; +}; + +struct trace_event_data_offsets_cgroup_migrate { + u32 dst_path; + u32 comm; +}; + +struct trace_event_data_offsets_cgroup_event { + u32 path; +}; + +typedef void (*btf_trace_cgroup_setup_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_destroy_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_remount)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_mkdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rmdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_release)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rename)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_freeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_unfreeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_attach_task)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_transfer_tasks)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_notify_populated)(void *, struct cgroup *, const char *, int); + +typedef void (*btf_trace_cgroup_notify_frozen)(void *, struct cgroup *, const char *, int); + +enum cgroup_opt_features { + OPT_FEATURE_PRESSURE = 0, + OPT_FEATURE_COUNT = 1, +}; + +enum cgroup2_param { + Opt_nsdelegate = 0, + Opt_memory_localevents = 1, + Opt_memory_recursiveprot = 2, + nr__cgroup2_params = 3, +}; + +struct cgroupstats { + __u64 nr_sleeping; + __u64 nr_running; + __u64 nr_stopped; + __u64 nr_uninterruptible; + __u64 nr_io_wait; +}; + +enum cgroup_filetype { + CGROUP_FILE_PROCS = 0, + CGROUP_FILE_TASKS = 1, +}; + +struct cgroup_pidlist { + struct { + enum cgroup_filetype type; + struct pid_namespace *ns; + } key; + pid_t *list; + int length; + struct list_head links; + struct cgroup *owner; + struct delayed_work destroy_dwork; +}; + +enum cgroup1_param { + Opt_all = 0, + Opt_clone_children = 1, + Opt_cpuset_v2_mode = 2, + Opt_name = 3, + Opt_none = 4, + Opt_noprefix = 5, + Opt_release_agent = 6, + Opt_xattr = 7, +}; + +enum freezer_state_flags { + CGROUP_FREEZER_ONLINE = 1, + CGROUP_FREEZING_SELF = 2, + CGROUP_FREEZING_PARENT = 4, + CGROUP_FROZEN = 8, + CGROUP_FREEZING = 6, +}; + +struct freezer { + struct cgroup_subsys_state css; + unsigned int state; +}; + +struct pids_cgroup { + struct cgroup_subsys_state css; + atomic64_t counter; + atomic64_t limit; + struct cgroup_file events_file; + atomic64_t events_limit; +}; + +typedef struct { + char *from; + char *to; +} substring_t; + +enum rdmacg_resource_type { + RDMACG_RESOURCE_HCA_HANDLE = 0, + RDMACG_RESOURCE_HCA_OBJECT = 1, + RDMACG_RESOURCE_MAX = 2, +}; + +struct rdma_cgroup { + struct cgroup_subsys_state css; + struct list_head rpools; +}; + +struct rdmacg_device { + struct list_head dev_node; + struct list_head rpools; + char *name; +}; + +enum rdmacg_file_type { + RDMACG_RESOURCE_TYPE_MAX = 0, + RDMACG_RESOURCE_TYPE_STAT = 1, +}; + +struct rdmacg_resource { + int max; + int usage; +}; + +struct rdmacg_resource_pool { + struct rdmacg_device *device; + struct rdmacg_resource resources[2]; + struct list_head cg_node; + struct list_head dev_node; + u64 usage_sum; + int num_max_cnt; +}; + +struct root_domain___2; + +struct fmeter { + int cnt; + int val; + time64_t time; + spinlock_t lock; +}; + +struct cpuset { + struct cgroup_subsys_state css; + long unsigned int flags; + cpumask_var_t cpus_allowed; + nodemask_t mems_allowed; + cpumask_var_t effective_cpus; + nodemask_t effective_mems; + cpumask_var_t subparts_cpus; + nodemask_t old_mems_allowed; + struct fmeter fmeter; + int attach_in_progress; + int pn; + int relax_domain_level; + int nr_subparts_cpus; + int partition_root_state; + int use_parent_ecpus; + int child_ecpus_count; + struct cgroup_file partition_file; +}; + +struct tmpmasks { + cpumask_var_t addmask; + cpumask_var_t delmask; + cpumask_var_t new_cpus; +}; + +typedef enum { + CS_ONLINE = 0, + CS_CPU_EXCLUSIVE = 1, + CS_MEM_EXCLUSIVE = 2, + CS_MEM_HARDWALL = 3, + CS_MEMORY_MIGRATE = 4, + CS_SCHED_LOAD_BALANCE = 5, + CS_SPREAD_PAGE = 6, + CS_SPREAD_SLAB = 7, +} cpuset_flagbits_t; + +enum subparts_cmd { + partcmd_enable = 0, + partcmd_disable = 1, + partcmd_update = 2, +}; + +struct cpuset_migrate_mm_work { + struct work_struct work; + struct mm_struct *mm; + nodemask_t from; + nodemask_t to; +}; + +typedef enum { + FILE_MEMORY_MIGRATE = 0, + FILE_CPULIST = 1, + FILE_MEMLIST = 2, + FILE_EFFECTIVE_CPULIST = 3, + FILE_EFFECTIVE_MEMLIST = 4, + FILE_SUBPARTS_CPULIST = 5, + FILE_CPU_EXCLUSIVE = 6, + FILE_MEM_EXCLUSIVE = 7, + FILE_MEM_HARDWALL = 8, + FILE_SCHED_LOAD_BALANCE = 9, + FILE_PARTITION_ROOT = 10, + FILE_SCHED_RELAX_DOMAIN_LEVEL = 11, + FILE_MEMORY_PRESSURE_ENABLED = 12, + FILE_MEMORY_PRESSURE = 13, + FILE_SPREAD_PAGE = 14, + FILE_SPREAD_SLAB = 15, +} cpuset_filetype_t; + +enum misc_res_type { + MISC_CG_RES_TYPES = 0, +}; + +struct misc_res { + long unsigned int max; + atomic_long_t usage; + atomic_long_t events; +}; + +struct misc_cg { + struct cgroup_subsys_state css; + struct cgroup_file events_file; + struct misc_res res[0]; +}; + +struct kernel_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; +}; + +enum kernel_pkey_operation { + kernel_pkey_encrypt = 0, + kernel_pkey_decrypt = 1, + kernel_pkey_sign = 2, + kernel_pkey_verify = 3, +}; + +struct kernel_pkey_params { + struct key *key; + const char *encoding; + const char *hash_algo; + char *info; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + enum kernel_pkey_operation op: 8; +}; + +struct key_preparsed_payload { + const char *orig_description; + char *description; + union key_payload payload; + const void *data; + size_t datalen; + size_t quotalen; + time64_t expiry; +}; + +struct key_match_data { + bool (*cmp)(const struct key *, const struct key_match_data *); + const void *raw_data; + void *preparsed; + unsigned int lookup_type; +}; + +struct idmap_key { + bool map_up; + u32 id; + u32 count; +}; + +struct ctl_path { + const char *procname; +}; + +struct cpu_stop_done { + atomic_t nr_todo; + int ret; + struct completion completion; +}; + +struct cpu_stopper { + struct task_struct *thread; + raw_spinlock_t lock; + bool enabled; + struct list_head works; + struct cpu_stop_work stop_work; + long unsigned int caller; + cpu_stop_fn_t fn; +}; + +enum multi_stop_state { + MULTI_STOP_NONE = 0, + MULTI_STOP_PREPARE = 1, + MULTI_STOP_DISABLE_IRQ = 2, + MULTI_STOP_RUN = 3, + MULTI_STOP_EXIT = 4, +}; + +struct multi_stop_data { + cpu_stop_fn_t fn; + void *data; + unsigned int num_threads; + const struct cpumask *active_cpus; + enum multi_stop_state state; + atomic_t thread_ack; +}; + +typedef int __kernel_mqd_t; + +typedef __kernel_mqd_t mqd_t; + +enum audit_state { + AUDIT_STATE_DISABLED = 0, + AUDIT_STATE_BUILD = 1, + AUDIT_STATE_RECORD = 2, +}; + +struct audit_cap_data { + kernel_cap_t permitted; + kernel_cap_t inheritable; + union { + unsigned int fE; + kernel_cap_t effective; + }; + kernel_cap_t ambient; + kuid_t rootid; +}; + +struct audit_names { + struct list_head list; + struct filename *name; + int name_len; + bool hidden; + long unsigned int ino; + dev_t dev; + umode_t mode; + kuid_t uid; + kgid_t gid; + dev_t rdev; + u32 osid; + struct audit_cap_data fcap; + unsigned int fcap_ver; + unsigned char type; + bool should_free; +}; + +struct mq_attr { + __kernel_long_t mq_flags; + __kernel_long_t mq_maxmsg; + __kernel_long_t mq_msgsize; + __kernel_long_t mq_curmsgs; + __kernel_long_t __reserved[4]; +}; + +struct open_how { + __u64 flags; + __u64 mode; + __u64 resolve; +}; + +struct audit_proctitle { + int len; + char *value; +}; + +struct audit_aux_data; + +struct __kernel_sockaddr_storage; + +struct audit_tree_refs; + +struct audit_context { + int dummy; + enum { + AUDIT_CTX_UNUSED = 0, + AUDIT_CTX_SYSCALL = 1, + AUDIT_CTX_URING = 2, + } context; + enum audit_state state; + enum audit_state current_state; + unsigned int serial; + int major; + int uring_op; + struct timespec64 ctime; + long unsigned int argv[4]; + long int return_code; + u64 prio; + int return_valid; + struct audit_names preallocated_names[5]; + int name_count; + struct list_head names_list; + char *filterkey; + struct path pwd; + struct audit_aux_data *aux; + struct audit_aux_data *aux_pids; + struct __kernel_sockaddr_storage *sockaddr; + size_t sockaddr_len; + pid_t pid; + pid_t ppid; + kuid_t uid; + kuid_t euid; + kuid_t suid; + kuid_t fsuid; + kgid_t gid; + kgid_t egid; + kgid_t sgid; + kgid_t fsgid; + long unsigned int personality; + int arch; + pid_t target_pid; + kuid_t target_auid; + kuid_t target_uid; + unsigned int target_sessionid; + u32 target_sid; + char target_comm[16]; + struct audit_tree_refs *trees; + struct audit_tree_refs *first_trees; + struct list_head killed_trees; + int tree_count; + int type; + union { + struct { + int nargs; + long int args[6]; + } socketcall; + struct { + kuid_t uid; + kgid_t gid; + umode_t mode; + u32 osid; + int has_perm; + uid_t perm_uid; + gid_t perm_gid; + umode_t perm_mode; + long unsigned int qbytes; + } ipc; + struct { + mqd_t mqdes; + struct mq_attr mqstat; + } mq_getsetattr; + struct { + mqd_t mqdes; + int sigev_signo; + } mq_notify; + struct { + mqd_t mqdes; + size_t msg_len; + unsigned int msg_prio; + struct timespec64 abs_timeout; + } mq_sendrecv; + struct { + int oflag; + umode_t mode; + struct mq_attr attr; + } mq_open; + struct { + pid_t pid; + struct audit_cap_data cap; + } capset; + struct { + int fd; + int flags; + } mmap; + struct open_how openat2; + struct { + int argc; + } execve; + struct { + char *name; + } module; + }; + int fds[2]; + struct audit_proctitle proctitle; +}; + +struct __kernel_sockaddr_storage { + union { + struct { + __kernel_sa_family_t ss_family; + char __data[126]; + }; + void *__align; + }; +}; + +enum audit_nlgrps { + AUDIT_NLGRP_NONE = 0, + AUDIT_NLGRP_READLOG = 1, + __AUDIT_NLGRP_MAX = 2, +}; + +struct audit_status { + __u32 mask; + __u32 enabled; + __u32 failure; + __u32 pid; + __u32 rate_limit; + __u32 backlog_limit; + __u32 lost; + __u32 backlog; + union { + __u32 version; + __u32 feature_bitmap; + }; + __u32 backlog_wait_time; + __u32 backlog_wait_time_actual; +}; + +struct audit_features { + __u32 vers; + __u32 mask; + __u32 features; + __u32 lock; +}; + +struct audit_tty_status { + __u32 enabled; + __u32 log_passwd; +}; + +struct audit_sig_info { + uid_t uid; + pid_t pid; + char ctx[0]; +}; + +struct net_generic { + union { + struct { + unsigned int len; + struct callback_head rcu; + } s; + void *ptr[0]; + }; +}; + +struct pernet_operations { + struct list_head list; + int (*init)(struct net *); + void (*pre_exit)(struct net *); + void (*exit)(struct net *); + void (*exit_batch)(struct list_head *); + unsigned int *id; + size_t size; +}; + +struct scm_creds { + u32 pid; + kuid_t uid; + kgid_t gid; +}; + +struct netlink_skb_parms { + struct scm_creds creds; + __u32 portid; + __u32 dst_group; + __u32 flags; + struct sock *sk; + bool nsid_is_set; + int nsid; +}; + +struct netlink_kernel_cfg { + unsigned int groups; + unsigned int flags; + void (*input)(struct sk_buff *); + struct mutex *cb_mutex; + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); + bool (*compare)(struct net *, struct sock *); +}; + +struct audit_netlink_list { + __u32 portid; + struct net *net; + struct sk_buff_head q; +}; + +struct audit_net { + struct sock *sk; +}; + +struct auditd_connection { + struct pid *pid; + u32 portid; + struct net *net; + struct callback_head rcu; +}; + +struct audit_ctl_mutex { + struct mutex lock; + void *owner; +}; + +struct audit_buffer { + struct sk_buff *skb; + struct audit_context *ctx; + gfp_t gfp_mask; +}; + +struct audit_reply { + __u32 portid; + struct net *net; + struct sk_buff *skb; +}; + +enum { + Audit_equal = 0, + Audit_not_equal = 1, + Audit_bitmask = 2, + Audit_bittest = 3, + Audit_lt = 4, + Audit_gt = 5, + Audit_le = 6, + Audit_ge = 7, + Audit_bad = 8, +}; + +struct audit_rule_data { + __u32 flags; + __u32 action; + __u32 field_count; + __u32 mask[64]; + __u32 fields[64]; + __u32 values[64]; + __u32 fieldflags[64]; + __u32 buflen; + char buf[0]; +}; + +struct audit_field; + +struct audit_watch; + +struct audit_tree; + +struct audit_fsnotify_mark; + +struct audit_krule { + u32 pflags; + u32 flags; + u32 listnr; + u32 action; + u32 mask[64]; + u32 buflen; + u32 field_count; + char *filterkey; + struct audit_field *fields; + struct audit_field *arch_f; + struct audit_field *inode_f; + struct audit_watch *watch; + struct audit_tree *tree; + struct audit_fsnotify_mark *exe; + struct list_head rlist; + struct list_head list; + u64 prio; +}; + +struct audit_field { + u32 type; + union { + u32 val; + kuid_t uid; + kgid_t gid; + struct { + char *lsm_str; + void *lsm_rule; + }; + }; + u32 op; +}; + +struct audit_entry { + struct list_head list; + struct callback_head rcu; + struct audit_krule rule; +}; + +struct audit_buffer___2; + +typedef int __kernel_key_t; + +typedef __kernel_key_t key_t; + +struct kern_ipc_perm { + spinlock_t lock; + bool deleted; + int id; + key_t key; + kuid_t uid; + kgid_t gid; + kuid_t cuid; + kgid_t cgid; + umode_t mode; + long unsigned int seq; + void *security; + struct rhash_head khtnode; + struct callback_head rcu; + refcount_t refcount; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct cpu_vfs_cap_data { + __u32 magic_etc; + kernel_cap_t permitted; + kernel_cap_t inheritable; + kuid_t rootid; +}; + +typedef struct fsnotify_mark_connector *fsnotify_connp_t; + +struct fsnotify_mark_connector { + spinlock_t lock; + short unsigned int type; + short unsigned int flags; + __kernel_fsid_t fsid; + union { + fsnotify_connp_t *obj; + struct fsnotify_mark_connector *destroy_next; + }; + struct hlist_head list; +}; + +enum auditsc_class_t { + AUDITSC_NATIVE = 0, + AUDITSC_COMPAT = 1, + AUDITSC_OPEN = 2, + AUDITSC_OPENAT = 3, + AUDITSC_SOCKETCALL = 4, + AUDITSC_EXECVE = 5, + AUDITSC_OPENAT2 = 6, + AUDITSC_NVALS = 7, +}; + +enum audit_nfcfgop { + AUDIT_XT_OP_REGISTER = 0, + AUDIT_XT_OP_REPLACE = 1, + AUDIT_XT_OP_UNREGISTER = 2, + AUDIT_NFT_OP_TABLE_REGISTER = 3, + AUDIT_NFT_OP_TABLE_UNREGISTER = 4, + AUDIT_NFT_OP_CHAIN_REGISTER = 5, + AUDIT_NFT_OP_CHAIN_UNREGISTER = 6, + AUDIT_NFT_OP_RULE_REGISTER = 7, + AUDIT_NFT_OP_RULE_UNREGISTER = 8, + AUDIT_NFT_OP_SET_REGISTER = 9, + AUDIT_NFT_OP_SET_UNREGISTER = 10, + AUDIT_NFT_OP_SETELEM_REGISTER = 11, + AUDIT_NFT_OP_SETELEM_UNREGISTER = 12, + AUDIT_NFT_OP_GEN_REGISTER = 13, + AUDIT_NFT_OP_OBJ_REGISTER = 14, + AUDIT_NFT_OP_OBJ_UNREGISTER = 15, + AUDIT_NFT_OP_OBJ_RESET = 16, + AUDIT_NFT_OP_FLOWTABLE_REGISTER = 17, + AUDIT_NFT_OP_FLOWTABLE_UNREGISTER = 18, + AUDIT_NFT_OP_INVALID = 19, +}; + +enum fsnotify_obj_type { + FSNOTIFY_OBJ_TYPE_INODE = 0, + FSNOTIFY_OBJ_TYPE_PARENT = 1, + FSNOTIFY_OBJ_TYPE_VFSMOUNT = 2, + FSNOTIFY_OBJ_TYPE_SB = 3, + FSNOTIFY_OBJ_TYPE_COUNT = 4, + FSNOTIFY_OBJ_TYPE_DETACHED = 4, +}; + +struct audit_aux_data { + struct audit_aux_data *next; + int type; +}; + +struct audit_chunk; + +struct audit_tree_refs { + struct audit_tree_refs *next; + struct audit_chunk *c[31]; +}; + +struct audit_aux_data_pids { + struct audit_aux_data d; + pid_t target_pid[16]; + kuid_t target_auid[16]; + kuid_t target_uid[16]; + unsigned int target_sessionid[16]; + u32 target_sid[16]; + char target_comm[256]; + int pid_count; +}; + +struct audit_aux_data_bprm_fcaps { + struct audit_aux_data d; + struct audit_cap_data fcap; + unsigned int fcap_ver; + struct audit_cap_data old_pcap; + struct audit_cap_data new_pcap; +}; + +struct audit_nfcfgop_tab { + enum audit_nfcfgop op; + const char *s; +}; + +struct audit_parent; + +struct audit_watch { + refcount_t count; + dev_t dev; + char *path; + long unsigned int ino; + struct audit_parent *parent; + struct list_head wlist; + struct list_head rules; +}; + +struct fsnotify_group; + +struct fsnotify_iter_info; + +struct fsnotify_mark; + +struct fsnotify_event; + +struct fsnotify_ops { + int (*handle_event)(struct fsnotify_group *, u32, const void *, int, struct inode *, const struct qstr *, u32, struct fsnotify_iter_info *); + int (*handle_inode_event)(struct fsnotify_mark *, u32, struct inode *, struct inode *, const struct qstr *, u32); + void (*free_group_priv)(struct fsnotify_group *); + void (*freeing_mark)(struct fsnotify_mark *, struct fsnotify_group *); + void (*free_event)(struct fsnotify_group *, struct fsnotify_event *); + void (*free_mark)(struct fsnotify_mark *); +}; + +struct inotify_group_private_data { + spinlock_t idr_lock; + struct idr idr; + struct ucounts *ucounts; +}; + +struct fanotify_group_private_data { + struct hlist_head *merge_hash; + struct list_head access_list; + wait_queue_head_t access_waitq; + int flags; + int f_flags; + struct ucounts *ucounts; + mempool_t error_events_pool; +}; + +struct fsnotify_group { + const struct fsnotify_ops *ops; + refcount_t refcnt; + spinlock_t notification_lock; + struct list_head notification_list; + wait_queue_head_t notification_waitq; + unsigned int q_len; + unsigned int max_events; + unsigned int priority; + bool shutdown; + struct mutex mark_mutex; + atomic_t user_waits; + struct list_head marks_list; + struct fasync_struct *fsn_fa; + struct fsnotify_event *overflow_event; + struct mem_cgroup *memcg; + union { + void *private; + struct inotify_group_private_data inotify_data; + struct fanotify_group_private_data fanotify_data; + }; +}; + +struct fsnotify_iter_info { + struct fsnotify_mark *marks[4]; + unsigned int report_mask; + int srcu_idx; +}; + +struct fsnotify_mark { + __u32 mask; + refcount_t refcnt; + struct fsnotify_group *group; + struct list_head g_list; + spinlock_t lock; + struct hlist_node obj_list; + struct fsnotify_mark_connector *connector; + __u32 ignored_mask; + unsigned int flags; +}; + +struct fsnotify_event { + struct list_head list; +}; + +struct audit_parent { + struct list_head watches; + struct fsnotify_mark mark; +}; + +struct audit_fsnotify_mark { + dev_t dev; + long unsigned int ino; + char *path; + struct fsnotify_mark mark; + struct audit_krule *rule; +}; + +struct audit_chunk___2; + +struct audit_tree { + refcount_t count; + int goner; + struct audit_chunk___2 *root; + struct list_head chunks; + struct list_head rules; + struct list_head list; + struct list_head same_root; + struct callback_head head; + char pathname[0]; +}; + +struct audit_node { + struct list_head list; + struct audit_tree *owner; + unsigned int index; +}; + +struct audit_chunk___2 { + struct list_head hash; + long unsigned int key; + struct fsnotify_mark *mark; + struct list_head trees; + int count; + atomic_long_t refs; + struct callback_head head; + struct audit_node owners[0]; +}; + +struct audit_tree_mark { + struct fsnotify_mark mark; + struct audit_chunk___2 *chunk; +}; + +enum { + HASH_SIZE = 128, +}; + +struct kprobe_blacklist_entry { + struct list_head list; + long unsigned int start_addr; + long unsigned int end_addr; +}; + +enum perf_record_ksymbol_type { + PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, + PERF_RECORD_KSYMBOL_TYPE_BPF = 1, + PERF_RECORD_KSYMBOL_TYPE_OOL = 2, + PERF_RECORD_KSYMBOL_TYPE_MAX = 3, +}; + +struct kprobe_insn_page { + struct list_head list; + kprobe_opcode_t *insns; + struct kprobe_insn_cache *cache; + int nused; + int ngarbage; + char slot_used[0]; +}; + +enum kprobe_slot_state { + SLOT_CLEAN = 0, + SLOT_DIRTY = 1, + SLOT_USED = 2, +}; + +struct kgdb_io { + const char *name; + int (*read_char)(); + void (*write_char)(u8); + void (*flush)(); + int (*init)(); + void (*deinit)(); + void (*pre_exception)(); + void (*post_exception)(); + struct console *cons; +}; + +enum { + KDB_NOT_INITIALIZED = 0, + KDB_INIT_EARLY = 1, + KDB_INIT_FULL = 2, +}; + +struct kgdb_state { + int ex_vector; + int signo; + int err_code; + int cpu; + int pass_exception; + long unsigned int thr_query; + long unsigned int threadid; + long int kgdb_usethreadid; + struct pt_regs *linux_regs; + atomic_t *send_ready; +}; + +struct debuggerinfo_struct { + void *debuggerinfo; + struct task_struct *task; + int exception_state; + int ret_state; + int irq_depth; + int enter_kgdb; + bool rounding_up; +}; + +typedef int (*get_char_func)(); + +typedef enum { + KDB_ENABLE_ALL = 1, + KDB_ENABLE_MEM_READ = 2, + KDB_ENABLE_MEM_WRITE = 4, + KDB_ENABLE_REG_READ = 8, + KDB_ENABLE_REG_WRITE = 16, + KDB_ENABLE_INSPECT = 32, + KDB_ENABLE_FLOW_CTRL = 64, + KDB_ENABLE_SIGNAL = 128, + KDB_ENABLE_REBOOT = 256, + KDB_ENABLE_ALWAYS_SAFE = 512, + KDB_ENABLE_MASK = 1023, + KDB_ENABLE_ALL_NO_ARGS = 1024, + KDB_ENABLE_MEM_READ_NO_ARGS = 2048, + KDB_ENABLE_MEM_WRITE_NO_ARGS = 4096, + KDB_ENABLE_REG_READ_NO_ARGS = 8192, + KDB_ENABLE_REG_WRITE_NO_ARGS = 16384, + KDB_ENABLE_INSPECT_NO_ARGS = 32768, + KDB_ENABLE_FLOW_CTRL_NO_ARGS = 65536, + KDB_ENABLE_SIGNAL_NO_ARGS = 131072, + KDB_ENABLE_REBOOT_NO_ARGS = 262144, + KDB_ENABLE_ALWAYS_SAFE_NO_ARGS = 524288, + KDB_ENABLE_MASK_NO_ARGS = 1047552, + KDB_REPEAT_NO_ARGS = 1073741824, + KDB_REPEAT_WITH_ARGS = 2147483648, +} kdb_cmdflags_t; + +typedef int (*kdb_func_t)(int, const char **); + +struct _kdbtab { + char *name; + kdb_func_t func; + char *usage; + char *help; + short int minlen; + kdb_cmdflags_t flags; + struct list_head list_node; +}; + +typedef struct _kdbtab kdbtab_t; + +typedef enum { + KDB_REASON_ENTER = 1, + KDB_REASON_ENTER_SLAVE = 2, + KDB_REASON_BREAK = 3, + KDB_REASON_DEBUG = 4, + KDB_REASON_OOPS = 5, + KDB_REASON_SWITCH = 6, + KDB_REASON_KEYBOARD = 7, + KDB_REASON_NMI = 8, + KDB_REASON_RECURSE = 9, + KDB_REASON_SSTEP = 10, + KDB_REASON_SYSTEM_NMI = 11, +} kdb_reason_t; + +struct __ksymtab { + long unsigned int value; + const char *mod_name; + long unsigned int mod_start; + long unsigned int mod_end; + const char *sec_name; + long unsigned int sec_start; + long unsigned int sec_end; + const char *sym_name; + long unsigned int sym_start; + long unsigned int sym_end; +}; + +typedef struct __ksymtab kdb_symtab_t; + +typedef enum { + KDB_DB_BPT = 0, + KDB_DB_SS = 1, + KDB_DB_SSBPT = 2, + KDB_DB_NOBPT = 3, +} kdb_dbtrap_t; + +struct _kdbmsg { + int km_diag; + char *km_msg; +}; + +typedef struct _kdbmsg kdbmsg_t; + +struct kdb_macro { + kdbtab_t cmd; + struct list_head statements; +}; + +struct kdb_macro_statement { + char *statement; + struct list_head list_node; +}; + +struct _kdb_bp { + long unsigned int bp_addr; + unsigned int bp_free: 1; + unsigned int bp_enabled: 1; + unsigned int bp_type: 4; + unsigned int bp_installed: 1; + unsigned int bp_delay: 1; + unsigned int bp_delayed: 1; + unsigned int bph_length; +}; + +typedef struct _kdb_bp kdb_bp_t; + +typedef short unsigned int u_short; + +struct seccomp_notif_sizes { + __u16 seccomp_notif; + __u16 seccomp_notif_resp; + __u16 seccomp_data; +}; + +struct seccomp_notif { + __u64 id; + __u32 pid; + __u32 flags; + struct seccomp_data data; +}; + +struct seccomp_notif_resp { + __u64 id; + __s64 val; + __s32 error; + __u32 flags; +}; + +struct seccomp_notif_addfd { + __u64 id; + __u32 flags; + __u32 srcfd; + __u32 newfd; + __u32 newfd_flags; +}; + +struct action_cache { + long unsigned int allow_native[8]; + long unsigned int allow_compat[8]; +}; + +struct notification; + +struct seccomp_filter { + refcount_t refs; + refcount_t users; + bool log; + struct action_cache cache; + struct seccomp_filter *prev; + struct bpf_prog *prog; + struct notification *notif; + struct mutex notify_lock; + wait_queue_head_t wqh; +}; + +struct seccomp_metadata { + __u64 filter_off; + __u64 flags; +}; + +struct sock_fprog { + short unsigned int len; + struct sock_filter *filter; +}; + +struct compat_sock_fprog { + u16 len; + compat_uptr_t filter; +}; + +typedef unsigned int (*bpf_dispatcher_fn)(const void *, const struct bpf_insn *, unsigned int (*)(const void *, const struct bpf_insn *)); + +typedef int (*bpf_aux_classic_check_t)(struct sock_filter *, unsigned int); + +enum notify_state { + SECCOMP_NOTIFY_INIT = 0, + SECCOMP_NOTIFY_SENT = 1, + SECCOMP_NOTIFY_REPLIED = 2, +}; + +struct seccomp_knotif { + struct task_struct *task; + u64 id; + const struct seccomp_data *data; + enum notify_state state; + int error; + long int val; + u32 flags; + struct completion ready; + struct list_head list; + struct list_head addfd; +}; + +struct seccomp_kaddfd { + struct file *file; + int fd; + unsigned int flags; + __u32 ioctl_flags; + union { + bool setfd; + int ret; + }; + struct completion completion; + struct list_head list; +}; + +struct notification { + struct semaphore request; + u64 next_id; + struct list_head notifications; +}; + +struct seccomp_log_name { + u32 log; + const char *name; +}; + +struct rchan; + +struct rchan_buf { + void *start; + void *data; + size_t offset; + size_t subbufs_produced; + size_t subbufs_consumed; + struct rchan *chan; + wait_queue_head_t read_wait; + struct irq_work wakeup_work; + struct dentry *dentry; + struct kref kref; + struct page **page_array; + unsigned int page_count; + unsigned int finalized; + size_t *padding; + size_t prev_padding; + size_t bytes_consumed; + size_t early_bytes; + unsigned int cpu; + long: 32; + long: 64; + long: 64; +}; + +struct rchan_callbacks; + +struct rchan { + u32 version; + size_t subbuf_size; + size_t n_subbufs; + size_t alloc_size; + const struct rchan_callbacks *cb; + struct kref kref; + void *private_data; + size_t last_toobig; + struct rchan_buf **buf; + int is_global; + struct list_head list; + struct dentry *parent; + int has_base_filename; + char base_filename[255]; +}; + +struct rchan_callbacks { + int (*subbuf_start)(struct rchan_buf *, void *, void *, size_t); + struct dentry * (*create_buf_file)(const char *, struct dentry *, umode_t, struct rchan_buf *, int *); + int (*remove_buf_file)(struct dentry *); +}; + +struct partial_page { + unsigned int offset; + unsigned int len; + long unsigned int private; +}; + +struct splice_pipe_desc { + struct page **pages; + struct partial_page *partial; + int nr_pages; + unsigned int nr_pages_max; + const struct pipe_buf_operations *ops; + void (*spd_release)(struct splice_pipe_desc *, unsigned int); +}; + +struct rchan_percpu_buf_dispatcher { + struct rchan_buf *buf; + struct dentry *dentry; +}; + +enum { + TASKSTATS_TYPE_UNSPEC = 0, + TASKSTATS_TYPE_PID = 1, + TASKSTATS_TYPE_TGID = 2, + TASKSTATS_TYPE_STATS = 3, + TASKSTATS_TYPE_AGGR_PID = 4, + TASKSTATS_TYPE_AGGR_TGID = 5, + TASKSTATS_TYPE_NULL = 6, + __TASKSTATS_TYPE_MAX = 7, +}; + +enum { + TASKSTATS_CMD_ATTR_UNSPEC = 0, + TASKSTATS_CMD_ATTR_PID = 1, + TASKSTATS_CMD_ATTR_TGID = 2, + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 3, + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 4, + __TASKSTATS_CMD_ATTR_MAX = 5, +}; + +enum { + CGROUPSTATS_CMD_UNSPEC = 3, + CGROUPSTATS_CMD_GET = 4, + CGROUPSTATS_CMD_NEW = 5, + __CGROUPSTATS_CMD_MAX = 6, +}; + +enum { + CGROUPSTATS_TYPE_UNSPEC = 0, + CGROUPSTATS_TYPE_CGROUP_STATS = 1, + __CGROUPSTATS_TYPE_MAX = 2, +}; + +enum { + CGROUPSTATS_CMD_ATTR_UNSPEC = 0, + CGROUPSTATS_CMD_ATTR_FD = 1, + __CGROUPSTATS_CMD_ATTR_MAX = 2, +}; + +struct genlmsghdr { + __u8 cmd; + __u8 version; + __u16 reserved; +}; + +enum { + NLA_UNSPEC = 0, + NLA_U8 = 1, + NLA_U16 = 2, + NLA_U32 = 3, + NLA_U64 = 4, + NLA_STRING = 5, + NLA_FLAG = 6, + NLA_MSECS = 7, + NLA_NESTED = 8, + NLA_NESTED_ARRAY = 9, + NLA_NUL_STRING = 10, + NLA_BINARY = 11, + NLA_S8 = 12, + NLA_S16 = 13, + NLA_S32 = 14, + NLA_S64 = 15, + NLA_BITFIELD32 = 16, + NLA_REJECT = 17, + __NLA_TYPE_MAX = 18, +}; + +struct genl_multicast_group { + char name[16]; + u8 flags; +}; + +struct genl_ops; + +struct genl_info; + +struct genl_small_ops; + +struct genl_family { + int id; + unsigned int hdrsize; + char name[16]; + unsigned int version; + unsigned int maxattr; + unsigned int mcgrp_offset; + u8 netnsok: 1; + u8 parallel_ops: 1; + u8 n_ops; + u8 n_small_ops; + u8 n_mcgrps; + const struct nla_policy *policy; + int (*pre_doit)(const struct genl_ops *, struct sk_buff *, struct genl_info *); + void (*post_doit)(const struct genl_ops *, struct sk_buff *, struct genl_info *); + const struct genl_ops *ops; + const struct genl_small_ops *small_ops; + const struct genl_multicast_group *mcgrps; + struct module *module; +}; + +struct genl_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*start)(struct netlink_callback *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + const struct nla_policy *policy; + unsigned int maxattr; + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genl_info { + u32 snd_seq; + u32 snd_portid; + struct nlmsghdr *nlhdr; + struct genlmsghdr *genlhdr; + void *userhdr; + struct nlattr **attrs; + possible_net_t _net; + void *user_ptr[2]; + struct netlink_ext_ack *extack; +}; + +struct genl_small_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +enum genl_validate_flags { + GENL_DONT_VALIDATE_STRICT = 1, + GENL_DONT_VALIDATE_DUMP = 2, + GENL_DONT_VALIDATE_DUMP_STRICT = 4, +}; + +struct listener { + struct list_head list; + pid_t pid; + char valid; +}; + +struct listener_list { + struct rw_semaphore sem; + struct list_head list; +}; + +enum actions { + REGISTER = 0, + DEREGISTER = 1, + CPU_DONT_CARE = 2, +}; + +struct tp_module { + struct list_head list; + struct module *mod; +}; + +enum tp_func_state { + TP_FUNC_0 = 0, + TP_FUNC_1 = 1, + TP_FUNC_2 = 2, + TP_FUNC_N = 3, +}; + +enum tp_transition_sync { + TP_TRANSITION_SYNC_1_0_1 = 0, + TP_TRANSITION_SYNC_N_2_1 = 1, + _NR_TP_TRANSITION_SYNC = 2, +}; + +struct tp_transition_snapshot { + long unsigned int rcu; + long unsigned int srcu; + bool ongoing; +}; + +struct tp_probes { + struct callback_head rcu; + struct tracepoint_func probes[0]; +}; + +enum { + TRACE_FTRACE_BIT = 0, + TRACE_FTRACE_NMI_BIT = 1, + TRACE_FTRACE_IRQ_BIT = 2, + TRACE_FTRACE_SIRQ_BIT = 3, + TRACE_FTRACE_TRANSITION_BIT = 4, + TRACE_INTERNAL_BIT = 5, + TRACE_INTERNAL_NMI_BIT = 6, + TRACE_INTERNAL_IRQ_BIT = 7, + TRACE_INTERNAL_SIRQ_BIT = 8, + TRACE_INTERNAL_TRANSITION_BIT = 9, + TRACE_BRANCH_BIT = 10, + TRACE_IRQ_BIT = 11, + TRACE_GRAPH_BIT = 12, + TRACE_GRAPH_DEPTH_START_BIT = 13, + TRACE_GRAPH_DEPTH_END_BIT = 14, + TRACE_GRAPH_NOTRACE_BIT = 15, + TRACE_RECORD_RECURSION_BIT = 16, +}; + +enum { + TRACE_CTX_NMI = 0, + TRACE_CTX_IRQ = 1, + TRACE_CTX_SOFTIRQ = 2, + TRACE_CTX_NORMAL = 3, + TRACE_CTX_TRANSITION = 4, +}; + +enum { + FTRACE_OPS_FL_ENABLED = 1, + FTRACE_OPS_FL_DYNAMIC = 2, + FTRACE_OPS_FL_SAVE_REGS = 4, + FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED = 8, + FTRACE_OPS_FL_RECURSION = 16, + FTRACE_OPS_FL_STUB = 32, + FTRACE_OPS_FL_INITIALIZED = 64, + FTRACE_OPS_FL_DELETED = 128, + FTRACE_OPS_FL_ADDING = 256, + FTRACE_OPS_FL_REMOVING = 512, + FTRACE_OPS_FL_MODIFYING = 1024, + FTRACE_OPS_FL_ALLOC_TRAMP = 2048, + FTRACE_OPS_FL_IPMODIFY = 4096, + FTRACE_OPS_FL_PID = 8192, + FTRACE_OPS_FL_RCU = 16384, + FTRACE_OPS_FL_TRACE_ARRAY = 32768, + FTRACE_OPS_FL_PERMANENT = 65536, + FTRACE_OPS_FL_DIRECT = 131072, +}; + +struct ftrace_hash { + long unsigned int size_bits; + struct hlist_head *buckets; + long unsigned int count; + long unsigned int flags; + struct callback_head rcu; +}; + +struct ftrace_func_entry { + struct hlist_node hlist; + long unsigned int ip; + long unsigned int direct; +}; + +enum ftrace_bug_type { + FTRACE_BUG_UNKNOWN = 0, + FTRACE_BUG_INIT = 1, + FTRACE_BUG_NOP = 2, + FTRACE_BUG_CALL = 3, + FTRACE_BUG_UPDATE = 4, +}; + +enum { + FTRACE_FL_ENABLED = 2147483648, + FTRACE_FL_REGS = 1073741824, + FTRACE_FL_REGS_EN = 536870912, + FTRACE_FL_TRAMP = 268435456, + FTRACE_FL_TRAMP_EN = 134217728, + FTRACE_FL_IPMODIFY = 67108864, + FTRACE_FL_DISABLED = 33554432, + FTRACE_FL_DIRECT = 16777216, + FTRACE_FL_DIRECT_EN = 8388608, +}; + +enum { + FTRACE_UPDATE_IGNORE = 0, + FTRACE_UPDATE_MAKE_CALL = 1, + FTRACE_UPDATE_MODIFY_CALL = 2, + FTRACE_UPDATE_MAKE_NOP = 3, +}; + +enum { + FTRACE_ITER_FILTER = 1, + FTRACE_ITER_NOTRACE = 2, + FTRACE_ITER_PRINTALL = 4, + FTRACE_ITER_DO_PROBES = 8, + FTRACE_ITER_PROBE = 16, + FTRACE_ITER_MOD = 32, + FTRACE_ITER_ENABLED = 64, +}; + +struct ftrace_graph_ent { + long unsigned int func; + int depth; +} __attribute__((packed)); + +struct ftrace_graph_ret { + long unsigned int func; + int depth; + unsigned int overrun; + long long unsigned int calltime; + long long unsigned int rettime; +}; + +typedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *); + +typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); + +struct fgraph_ops { + trace_func_graph_ent_t entryfunc; + trace_func_graph_ret_t retfunc; +}; + +struct prog_entry; + +struct event_filter { + struct prog_entry *prog; + char *filter_string; +}; + +struct trace_array_cpu; + +struct array_buffer { + struct trace_array *tr; + struct trace_buffer *buffer; + struct trace_array_cpu *data; + u64 time_start; + int cpu; +}; + +struct trace_pid_list; + +struct trace_options; + +struct cond_snapshot; + +struct trace_func_repeats; + +struct trace_array { + struct list_head list; + char *name; + struct array_buffer array_buffer; + struct array_buffer max_buffer; + bool allocated_snapshot; + long unsigned int max_latency; + struct dentry *d_max_latency; + struct work_struct fsnotify_work; + struct irq_work fsnotify_irqwork; + struct trace_pid_list *filtered_pids; + struct trace_pid_list *filtered_no_pids; + arch_spinlock_t max_lock; + int buffer_disabled; + int sys_refcount_enter; + int sys_refcount_exit; + struct trace_event_file *enter_syscall_files[450]; + struct trace_event_file *exit_syscall_files[450]; + int stop_count; + int clock_id; + int nr_topts; + bool clear_trace; + int buffer_percent; + unsigned int n_err_log_entries; + struct tracer *current_trace; + unsigned int trace_flags; + unsigned char trace_flags_index[32]; + unsigned int flags; + raw_spinlock_t start_lock; + struct list_head err_log; + struct dentry *dir; + struct dentry *options; + struct dentry *percpu_dir; + struct dentry *event_dir; + struct trace_options *topts; + struct list_head systems; + struct list_head events; + struct trace_event_file *trace_marker_file; + cpumask_var_t tracing_cpumask; + int ref; + int trace_ref; + struct ftrace_ops *ops; + struct trace_pid_list *function_pids; + struct trace_pid_list *function_no_pids; + struct list_head func_probes; + struct list_head mod_trace; + struct list_head mod_notrace; + int function_enabled; + int no_filter_buffering_ref; + struct list_head hist_vars; + struct cond_snapshot *cond_snapshot; + struct trace_func_repeats *last_func_repeats; +}; + +struct tracer_flags; + +struct tracer { + const char *name; + int (*init)(struct trace_array *); + void (*reset)(struct trace_array *); + void (*start)(struct trace_array *); + void (*stop)(struct trace_array *); + int (*update_thresh)(struct trace_array *); + void (*open)(struct trace_iterator *); + void (*pipe_open)(struct trace_iterator *); + void (*close)(struct trace_iterator *); + void (*pipe_close)(struct trace_iterator *); + ssize_t (*read)(struct trace_iterator *, struct file *, char *, size_t, loff_t *); + ssize_t (*splice_read)(struct trace_iterator *, struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + void (*print_header)(struct seq_file *); + enum print_line_t (*print_line)(struct trace_iterator *); + int (*set_flag)(struct trace_array *, u32, u32, int); + int (*flag_changed)(struct trace_array *, u32, int); + struct tracer *next; + struct tracer_flags *flags; + int enabled; + bool print_max; + bool allow_instances; + bool use_max_tr; + bool noboot; +}; + +struct event_subsystem; + +struct trace_subsystem_dir { + struct list_head list; + struct event_subsystem *subsystem; + struct trace_array *tr; + struct dentry *entry; + int ref_count; + int nr_events; +}; + +union lower_chunk { + union lower_chunk *next; + long unsigned int data[256]; +}; + +union upper_chunk { + union upper_chunk *next; + union lower_chunk *data[256]; +}; + +struct trace_pid_list { + raw_spinlock_t lock; + struct irq_work refill_irqwork; + union upper_chunk *upper[256]; + union upper_chunk *upper_list; + union lower_chunk *lower_list; + int free_upper_chunks; + int free_lower_chunks; +}; + +struct trace_array_cpu { + atomic_t disabled; + void *buffer_page; + long unsigned int entries; + long unsigned int saved_latency; + long unsigned int critical_start; + long unsigned int critical_end; + long unsigned int critical_sequence; + long unsigned int nice; + long unsigned int policy; + long unsigned int rt_priority; + long unsigned int skipped_entries; + u64 preempt_timestamp; + pid_t pid; + kuid_t uid; + char comm[16]; + int ftrace_ignore_pid; + bool ignore_pid; +}; + +struct trace_option_dentry; + +struct trace_options { + struct tracer *tracer; + struct trace_option_dentry *topts; +}; + +struct tracer_opt; + +struct trace_option_dentry { + struct tracer_opt *opt; + struct tracer_flags *flags; + struct trace_array *tr; + struct dentry *entry; +}; + +enum { + TRACE_PIDS = 1, + TRACE_NO_PIDS = 2, +}; + +typedef bool (*cond_update_fn_t)(struct trace_array *, void *); + +struct cond_snapshot { + void *cond_data; + cond_update_fn_t update; +}; + +struct trace_func_repeats { + long unsigned int ip; + long unsigned int parent_ip; + long unsigned int count; + u64 ts_last_call; +}; + +enum { + TRACE_ARRAY_FL_GLOBAL = 1, +}; + +struct tracer_opt { + const char *name; + u32 bit; +}; + +struct tracer_flags { + u32 val; + struct tracer_opt *opts; + struct tracer *trace; +}; + +struct ftrace_mod_load { + struct list_head list; + char *func; + char *module; + int enable; +}; + +enum { + FTRACE_HASH_FL_MOD = 1, +}; + +struct ftrace_func_command { + struct list_head list; + char *name; + int (*func)(struct trace_array *, struct ftrace_hash *, char *, char *, char *, int); +}; + +struct ftrace_probe_ops { + void (*func)(long unsigned int, long unsigned int, struct trace_array *, struct ftrace_probe_ops *, void *); + int (*init)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *, void **); + void (*free)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *); + int (*print)(struct seq_file *, long unsigned int, struct ftrace_probe_ops *, void *); +}; + +typedef int (*ftrace_mapper_func)(void *); + +struct trace_parser { + bool cont; + char *buffer; + unsigned int idx; + unsigned int size; +}; + +enum trace_iterator_bits { + TRACE_ITER_PRINT_PARENT_BIT = 0, + TRACE_ITER_SYM_OFFSET_BIT = 1, + TRACE_ITER_SYM_ADDR_BIT = 2, + TRACE_ITER_VERBOSE_BIT = 3, + TRACE_ITER_RAW_BIT = 4, + TRACE_ITER_HEX_BIT = 5, + TRACE_ITER_BIN_BIT = 6, + TRACE_ITER_BLOCK_BIT = 7, + TRACE_ITER_PRINTK_BIT = 8, + TRACE_ITER_ANNOTATE_BIT = 9, + TRACE_ITER_USERSTACKTRACE_BIT = 10, + TRACE_ITER_SYM_USEROBJ_BIT = 11, + TRACE_ITER_PRINTK_MSGONLY_BIT = 12, + TRACE_ITER_CONTEXT_INFO_BIT = 13, + TRACE_ITER_LATENCY_FMT_BIT = 14, + TRACE_ITER_RECORD_CMD_BIT = 15, + TRACE_ITER_RECORD_TGID_BIT = 16, + TRACE_ITER_OVERWRITE_BIT = 17, + TRACE_ITER_STOP_ON_FREE_BIT = 18, + TRACE_ITER_IRQ_INFO_BIT = 19, + TRACE_ITER_MARKERS_BIT = 20, + TRACE_ITER_EVENT_FORK_BIT = 21, + TRACE_ITER_PAUSE_ON_TRACE_BIT = 22, + TRACE_ITER_HASH_PTR_BIT = 23, + TRACE_ITER_FUNCTION_BIT = 24, + TRACE_ITER_FUNC_FORK_BIT = 25, + TRACE_ITER_DISPLAY_GRAPH_BIT = 26, + TRACE_ITER_STACKTRACE_BIT = 27, + TRACE_ITER_LAST_BIT = 28, +}; + +struct event_subsystem { + struct list_head list; + const char *name; + struct event_filter *filter; + int ref_count; +}; + +enum regex_type { + MATCH_FULL = 0, + MATCH_FRONT_ONLY = 1, + MATCH_MIDDLE_ONLY = 2, + MATCH_END_ONLY = 3, + MATCH_GLOB = 4, + MATCH_INDEX = 5, +}; + +struct tracer_stat { + const char *name; + void * (*stat_start)(struct tracer_stat *); + void * (*stat_next)(void *, int); + cmp_func_t stat_cmp; + int (*stat_show)(struct seq_file *, void *); + void (*stat_release)(void *); + int (*stat_headers)(struct seq_file *); +}; + +enum { + FTRACE_MODIFY_ENABLE_FL = 1, + FTRACE_MODIFY_MAY_SLEEP_FL = 2, +}; + +struct ftrace_profile { + struct hlist_node node; + long unsigned int ip; + long unsigned int counter; + long long unsigned int time; + long long unsigned int time_squared; +}; + +struct ftrace_profile_page { + struct ftrace_profile_page *next; + long unsigned int index; + struct ftrace_profile records[0]; +}; + +struct ftrace_profile_stat { + atomic_t disabled; + struct hlist_head *hash; + struct ftrace_profile_page *pages; + struct ftrace_profile_page *start; + struct tracer_stat stat; +}; + +struct ftrace_func_probe { + struct ftrace_probe_ops *probe_ops; + struct ftrace_ops ops; + struct trace_array *tr; + struct list_head list; + void *data; + int ref; +}; + +struct ftrace_page { + struct ftrace_page *next; + struct dyn_ftrace *records; + int index; + int order; +}; + +struct ftrace_rec_iter { + struct ftrace_page *pg; + int index; +}; + +struct ftrace_iterator { + loff_t pos; + loff_t func_pos; + loff_t mod_pos; + struct ftrace_page *pg; + struct dyn_ftrace *func; + struct ftrace_func_probe *probe; + struct ftrace_func_entry *probe_entry; + struct trace_parser parser; + struct ftrace_hash *hash; + struct ftrace_ops *ops; + struct trace_array *tr; + struct list_head *mod_list; + int pidx; + int idx; + unsigned int flags; +}; + +struct ftrace_glob { + char *search; + unsigned int len; + int type; +}; + +struct ftrace_func_map { + struct ftrace_func_entry entry; + void *data; +}; + +struct ftrace_func_mapper { + struct ftrace_hash hash; +}; + +enum graph_filter_type { + GRAPH_FILTER_NOTRACE = 0, + GRAPH_FILTER_FUNCTION = 1, +}; + +struct ftrace_graph_data { + struct ftrace_hash *hash; + struct ftrace_func_entry *entry; + int idx; + enum graph_filter_type type; + struct ftrace_hash *new_hash; + const struct seq_operations *seq_ops; + struct trace_parser parser; +}; + +struct ftrace_mod_func { + struct list_head list; + char *name; + long unsigned int ip; + unsigned int size; +}; + +struct ftrace_mod_map { + struct callback_head rcu; + struct list_head list; + struct module *mod; + long unsigned int start_addr; + long unsigned int end_addr; + struct list_head funcs; + unsigned int num_funcs; +}; + +struct ftrace_init_func { + struct list_head list; + long unsigned int ip; +}; + +enum ring_buffer_type { + RINGBUF_TYPE_DATA_TYPE_LEN_MAX = 28, + RINGBUF_TYPE_PADDING = 29, + RINGBUF_TYPE_TIME_EXTEND = 30, + RINGBUF_TYPE_TIME_STAMP = 31, +}; + +enum ring_buffer_flags { + RB_FL_OVERWRITE = 1, +}; + +struct ring_buffer_per_cpu; + +struct buffer_page; + +struct ring_buffer_iter { + struct ring_buffer_per_cpu *cpu_buffer; + long unsigned int head; + long unsigned int next_event; + struct buffer_page *head_page; + struct buffer_page *cache_reader_page; + long unsigned int cache_read; + u64 read_stamp; + u64 page_stamp; + struct ring_buffer_event *event; + int missed_events; +}; + +struct rb_irq_work { + struct irq_work work; + wait_queue_head_t waiters; + wait_queue_head_t full_waiters; + bool waiters_pending; + bool full_waiters_pending; + bool wakeup_full; +}; + +struct trace_buffer___2 { + unsigned int flags; + int cpus; + atomic_t record_disabled; + cpumask_var_t cpumask; + struct lock_class_key *reader_lock_key; + struct mutex mutex; + struct ring_buffer_per_cpu **buffers; + struct hlist_node node; + u64 (*clock)(); + struct rb_irq_work irq_work; + bool time_stamp_abs; +}; + +enum { + RB_LEN_TIME_EXTEND = 8, + RB_LEN_TIME_STAMP = 8, +}; + +struct buffer_data_page { + u64 time_stamp; + local_t commit; + unsigned char data[0]; +}; + +struct buffer_page { + struct list_head list; + local_t write; + unsigned int read; + local_t entries; + long unsigned int real_end; + struct buffer_data_page *page; +}; + +struct rb_event_info { + u64 ts; + u64 delta; + u64 before; + u64 after; + long unsigned int length; + struct buffer_page *tail_page; + int add_timestamp; +}; + +enum { + RB_ADD_STAMP_NONE = 0, + RB_ADD_STAMP_EXTEND = 2, + RB_ADD_STAMP_ABSOLUTE = 4, + RB_ADD_STAMP_FORCE = 8, +}; + +enum { + RB_CTX_TRANSITION = 0, + RB_CTX_NMI = 1, + RB_CTX_IRQ = 2, + RB_CTX_SOFTIRQ = 3, + RB_CTX_NORMAL = 4, + RB_CTX_MAX = 5, +}; + +struct rb_time_struct { + local64_t time; +}; + +typedef struct rb_time_struct rb_time_t; + +struct ring_buffer_per_cpu { + int cpu; + atomic_t record_disabled; + atomic_t resize_disabled; + struct trace_buffer___2 *buffer; + raw_spinlock_t reader_lock; + arch_spinlock_t lock; + struct lock_class_key lock_key; + struct buffer_data_page *free_page; + long unsigned int nr_pages; + unsigned int current_context; + struct list_head *pages; + struct buffer_page *head_page; + struct buffer_page *tail_page; + struct buffer_page *commit_page; + struct buffer_page *reader_page; + long unsigned int lost_events; + long unsigned int last_overrun; + long unsigned int nest; + local_t entries_bytes; + local_t entries; + local_t overrun; + local_t commit_overrun; + local_t dropped_events; + local_t committing; + local_t commits; + local_t pages_touched; + local_t pages_read; + long int last_pages_touch; + size_t shortest_full; + long unsigned int read; + long unsigned int read_bytes; + rb_time_t write_stamp; + rb_time_t before_stamp; + u64 event_stamp[5]; + u64 read_stamp; + long int nr_pages_to_update; + struct list_head new_pages; + struct work_struct update_pages_work; + struct completion update_done; + struct rb_irq_work irq_work; +}; + +typedef struct vfsmount * (*debugfs_automount_t)(struct dentry *, void *); + +struct trace_export { + struct trace_export *next; + void (*write)(struct trace_export *, const void *, unsigned int); + int flags; +}; + +enum fsnotify_data_type { + FSNOTIFY_EVENT_NONE = 0, + FSNOTIFY_EVENT_PATH = 1, + FSNOTIFY_EVENT_INODE = 2, + FSNOTIFY_EVENT_DENTRY = 3, + FSNOTIFY_EVENT_ERROR = 4, +}; + +enum trace_iter_flags { + TRACE_FILE_LAT_FMT = 1, + TRACE_FILE_ANNOTATE = 2, + TRACE_FILE_TIME_IN_NS = 4, +}; + +enum trace_flag_type { + TRACE_FLAG_IRQS_OFF = 1, + TRACE_FLAG_IRQS_NOSUPPORT = 2, + TRACE_FLAG_NEED_RESCHED = 4, + TRACE_FLAG_HARDIRQ = 8, + TRACE_FLAG_SOFTIRQ = 16, + TRACE_FLAG_PREEMPT_RESCHED = 32, + TRACE_FLAG_NMI = 64, +}; + +enum trace_type { + __TRACE_FIRST_TYPE = 0, + TRACE_FN = 1, + TRACE_CTX = 2, + TRACE_WAKE = 3, + TRACE_STACK = 4, + TRACE_PRINT = 5, + TRACE_BPRINT = 6, + TRACE_MMIO_RW = 7, + TRACE_MMIO_MAP = 8, + TRACE_BRANCH = 9, + TRACE_GRAPH_RET = 10, + TRACE_GRAPH_ENT = 11, + TRACE_USER_STACK = 12, + TRACE_BLK = 13, + TRACE_BPUTS = 14, + TRACE_HWLAT = 15, + TRACE_OSNOISE = 16, + TRACE_TIMERLAT = 17, + TRACE_RAW_DATA = 18, + TRACE_FUNC_REPEATS = 19, + __TRACE_LAST_TYPE = 20, +}; + +struct ftrace_entry { + struct trace_entry ent; + long unsigned int ip; + long unsigned int parent_ip; +}; + +struct stack_entry { + struct trace_entry ent; + int size; + long unsigned int caller[8]; +}; + +struct bprint_entry { + struct trace_entry ent; + long unsigned int ip; + const char *fmt; + u32 buf[0]; +}; + +struct print_entry { + struct trace_entry ent; + long unsigned int ip; + char buf[0]; +}; + +struct raw_data_entry { + struct trace_entry ent; + unsigned int id; + char buf[0]; +}; + +struct bputs_entry { + struct trace_entry ent; + long unsigned int ip; + const char *str; +}; + +struct func_repeats_entry { + struct trace_entry ent; + long unsigned int ip; + long unsigned int parent_ip; + u16 count; + u16 top_delta_ts; + u32 bottom_delta_ts; +}; + +enum trace_iterator_flags { + TRACE_ITER_PRINT_PARENT = 1, + TRACE_ITER_SYM_OFFSET = 2, + TRACE_ITER_SYM_ADDR = 4, + TRACE_ITER_VERBOSE = 8, + TRACE_ITER_RAW = 16, + TRACE_ITER_HEX = 32, + TRACE_ITER_BIN = 64, + TRACE_ITER_BLOCK = 128, + TRACE_ITER_PRINTK = 256, + TRACE_ITER_ANNOTATE = 512, + TRACE_ITER_USERSTACKTRACE = 1024, + TRACE_ITER_SYM_USEROBJ = 2048, + TRACE_ITER_PRINTK_MSGONLY = 4096, + TRACE_ITER_CONTEXT_INFO = 8192, + TRACE_ITER_LATENCY_FMT = 16384, + TRACE_ITER_RECORD_CMD = 32768, + TRACE_ITER_RECORD_TGID = 65536, + TRACE_ITER_OVERWRITE = 131072, + TRACE_ITER_STOP_ON_FREE = 262144, + TRACE_ITER_IRQ_INFO = 524288, + TRACE_ITER_MARKERS = 1048576, + TRACE_ITER_EVENT_FORK = 2097152, + TRACE_ITER_PAUSE_ON_TRACE = 4194304, + TRACE_ITER_HASH_PTR = 8388608, + TRACE_ITER_FUNCTION = 16777216, + TRACE_ITER_FUNC_FORK = 33554432, + TRACE_ITER_DISPLAY_GRAPH = 67108864, + TRACE_ITER_STACKTRACE = 134217728, +}; + +struct trace_min_max_param { + struct mutex *lock; + u64 *val; + u64 *min; + u64 *max; +}; + +struct saved_cmdlines_buffer { + unsigned int map_pid_to_cmdline[32769]; + unsigned int *map_cmdline_to_pid; + unsigned int cmdline_num; + int cmdline_idx; + char *saved_cmdlines; +}; + +struct ftrace_stack { + long unsigned int calls[1024]; +}; + +struct ftrace_stacks { + struct ftrace_stack stacks[4]; +}; + +struct trace_buffer_struct { + int nesting; + char buffer[4096]; +}; + +struct ftrace_buffer_info { + struct trace_iterator iter; + void *spare; + unsigned int spare_cpu; + unsigned int read; +}; + +struct err_info { + const char **errs; + u8 type; + u8 pos; + u64 ts; +}; + +struct tracing_log_err { + struct list_head list; + struct err_info info; + char loc[128]; + char cmd[256]; +}; + +struct buffer_ref { + struct trace_buffer *buffer; + void *page; + int cpu; + refcount_t refcount; +}; + +struct ftrace_func_mapper___2; + +struct ctx_switch_entry { + struct trace_entry ent; + unsigned int prev_pid; + unsigned int next_pid; + unsigned int next_cpu; + unsigned char prev_prio; + unsigned char prev_state; + unsigned char next_prio; + unsigned char next_state; +}; + +struct userstack_entry { + struct trace_entry ent; + unsigned int tgid; + long unsigned int caller[8]; +}; + +struct hwlat_entry { + struct trace_entry ent; + u64 duration; + u64 outer_duration; + u64 nmi_total_ts; + struct timespec64 timestamp; + unsigned int nmi_count; + unsigned int seqnum; + unsigned int count; +}; + +struct osnoise_entry { + struct trace_entry ent; + u64 noise; + u64 runtime; + u64 max_sample; + unsigned int hw_count; + unsigned int nmi_count; + unsigned int irq_count; + unsigned int softirq_count; + unsigned int thread_count; +}; + +struct timerlat_entry { + struct trace_entry ent; + unsigned int seqnum; + int context; + u64 timer_latency; +}; + +struct trace_mark { + long long unsigned int val; + char sym; +}; + +struct stat_node { + struct rb_node node; + void *stat; +}; + +struct stat_session { + struct list_head session_list; + struct tracer_stat *ts; + struct rb_root stat_root; + struct mutex stat_mutex; + struct dentry *file; +}; + +struct trace_bprintk_fmt { + struct list_head list; + const char *fmt; +}; + +typedef int (*tracing_map_cmp_fn_t)(void *, void *); + +struct tracing_map_field { + tracing_map_cmp_fn_t cmp_fn; + union { + atomic64_t sum; + unsigned int offset; + }; +}; + +struct tracing_map; + +struct tracing_map_elt { + struct tracing_map *map; + struct tracing_map_field *fields; + atomic64_t *vars; + bool *var_set; + void *key; + void *private_data; +}; + +struct tracing_map_sort_key { + unsigned int field_idx; + bool descending; +}; + +struct tracing_map_array; + +struct tracing_map_ops; + +struct tracing_map { + unsigned int key_size; + unsigned int map_bits; + unsigned int map_size; + unsigned int max_elts; + atomic_t next_elt; + struct tracing_map_array *elts; + struct tracing_map_array *map; + const struct tracing_map_ops *ops; + void *private_data; + struct tracing_map_field fields[6]; + unsigned int n_fields; + int key_idx[3]; + unsigned int n_keys; + struct tracing_map_sort_key sort_key; + unsigned int n_vars; + atomic64_t hits; + atomic64_t drops; +}; + +struct tracing_map_entry { + u32 key; + struct tracing_map_elt *val; +}; + +struct tracing_map_sort_entry { + void *key; + struct tracing_map_elt *elt; + bool elt_copied; + bool dup; +}; + +struct tracing_map_array { + unsigned int entries_per_page; + unsigned int entry_size_shift; + unsigned int entry_shift; + unsigned int entry_mask; + unsigned int n_pages; + void **pages; +}; + +struct tracing_map_ops { + int (*elt_alloc)(struct tracing_map_elt *); + void (*elt_free)(struct tracing_map_elt *); + void (*elt_clear)(struct tracing_map_elt *); + void (*elt_init)(struct tracing_map_elt *); +}; + +enum { + TRACE_FUNC_NO_OPTS = 0, + TRACE_FUNC_OPT_STACK = 1, + TRACE_FUNC_OPT_NO_REPEATS = 2, + TRACE_FUNC_OPT_HIGHEST_BIT = 4, +}; + +enum { + MODE_NONE = 0, + MODE_ROUND_ROBIN = 1, + MODE_PER_CPU = 2, + MODE_MAX = 3, +}; + +struct hwlat_kthread_data { + struct task_struct *kthread; + u64 nmi_ts_start; + u64 nmi_total_ts; + int nmi_count; + int nmi_cpu; +}; + +struct hwlat_sample { + u64 seqnum; + u64 duration; + u64 outer_duration; + u64 nmi_total_ts; + struct timespec64 timestamp; + int nmi_count; + int count; +}; + +struct hwlat_data { + struct mutex lock; + u64 count; + u64 sample_window; + u64 sample_width; + int thread_mode; +}; + +enum { + TRACE_NOP_OPT_ACCEPT = 1, + TRACE_NOP_OPT_REFUSE = 2, +}; + +struct ftrace_graph_ent_entry { + struct trace_entry ent; + struct ftrace_graph_ent graph_ent; +} __attribute__((packed)); + +struct ftrace_graph_ret_entry { + struct trace_entry ent; + struct ftrace_graph_ret ret; +}; + +struct fgraph_cpu_data { + pid_t last_pid; + int depth; + int depth_irq; + int ignore; + long unsigned int enter_funcs[50]; +}; + +struct fgraph_data { + struct fgraph_cpu_data *cpu_data; + struct ftrace_graph_ent_entry ent; + struct ftrace_graph_ret_entry ret; + int failed; + int cpu; + int: 32; +} __attribute__((packed)); + +enum { + FLAGS_FILL_FULL = 268435456, + FLAGS_FILL_START = 536870912, + FLAGS_FILL_END = 805306368, +}; + +struct disk_stats { + u64 nsecs[4]; + long unsigned int sectors[4]; + long unsigned int ios[4]; + long unsigned int merges[4]; + long unsigned int io_ticks; + local_t in_flight[2]; +}; + +struct blk_crypto_key; + +struct bio_crypt_ctx { + const struct blk_crypto_key *bc_key; + u64 bc_dun[4]; +}; + +typedef __u32 blk_mq_req_flags_t; + +enum req_opf { + REQ_OP_READ = 0, + REQ_OP_WRITE = 1, + REQ_OP_FLUSH = 2, + REQ_OP_DISCARD = 3, + REQ_OP_SECURE_ERASE = 5, + REQ_OP_WRITE_SAME = 7, + REQ_OP_WRITE_ZEROES = 9, + REQ_OP_ZONE_OPEN = 10, + REQ_OP_ZONE_CLOSE = 11, + REQ_OP_ZONE_FINISH = 12, + REQ_OP_ZONE_APPEND = 13, + REQ_OP_ZONE_RESET = 15, + REQ_OP_ZONE_RESET_ALL = 17, + REQ_OP_DRV_IN = 34, + REQ_OP_DRV_OUT = 35, + REQ_OP_LAST = 36, +}; + +enum req_flag_bits { + __REQ_FAILFAST_DEV = 8, + __REQ_FAILFAST_TRANSPORT = 9, + __REQ_FAILFAST_DRIVER = 10, + __REQ_SYNC = 11, + __REQ_META = 12, + __REQ_PRIO = 13, + __REQ_NOMERGE = 14, + __REQ_IDLE = 15, + __REQ_INTEGRITY = 16, + __REQ_FUA = 17, + __REQ_PREFLUSH = 18, + __REQ_RAHEAD = 19, + __REQ_BACKGROUND = 20, + __REQ_NOWAIT = 21, + __REQ_CGROUP_PUNT = 22, + __REQ_NOUNMAP = 23, + __REQ_POLLED = 24, + __REQ_DRV = 25, + __REQ_SWAP = 26, + __REQ_NR_BITS = 27, +}; + +struct sbitmap_word { + long unsigned int depth; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int word; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int cleared; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sbitmap { + unsigned int depth; + unsigned int shift; + unsigned int map_nr; + bool round_robin; + struct sbitmap_word *map; + unsigned int *alloc_hint; +}; + +struct sbq_wait_state { + atomic_t wait_cnt; + wait_queue_head_t wait; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sbitmap_queue { + struct sbitmap sb; + unsigned int wake_batch; + atomic_t wake_index; + struct sbq_wait_state *ws; + atomic_t ws_active; + unsigned int min_shallow_depth; +}; + +typedef __u32 req_flags_t; + +enum mq_rq_state { + MQ_RQ_IDLE = 0, + MQ_RQ_IN_FLIGHT = 1, + MQ_RQ_COMPLETE = 2, +}; + +typedef void rq_end_io_fn(struct request *, blk_status_t); + +struct blk_crypto_keyslot; + +struct request { + struct request_queue *q; + struct blk_mq_ctx *mq_ctx; + struct blk_mq_hw_ctx *mq_hctx; + unsigned int cmd_flags; + req_flags_t rq_flags; + int tag; + int internal_tag; + unsigned int timeout; + unsigned int __data_len; + sector_t __sector; + struct bio *bio; + struct bio *biotail; + union { + struct list_head queuelist; + struct request *rq_next; + }; + struct gendisk *rq_disk; + struct block_device *part; + u64 alloc_time_ns; + u64 start_time_ns; + u64 io_start_time_ns; + short unsigned int wbt_flags; + short unsigned int stats_sectors; + short unsigned int nr_phys_segments; + short unsigned int nr_integrity_segments; + struct bio_crypt_ctx *crypt_ctx; + struct blk_crypto_keyslot *crypt_keyslot; + short unsigned int write_hint; + short unsigned int ioprio; + enum mq_rq_state state; + refcount_t ref; + long unsigned int deadline; + union { + struct hlist_node hash; + struct llist_node ipi_list; + }; + union { + struct rb_node rb_node; + struct bio_vec special_vec; + void *completion_data; + int error_count; + }; + union { + struct { + struct io_cq *icq; + void *priv[2]; + } elv; + struct { + unsigned int seq; + struct list_head list; + rq_end_io_fn *saved_end_io; + } flush; + }; + union { + struct __call_single_data csd; + u64 fifo_time; + }; + rq_end_io_fn *end_io; + void *end_io_data; +}; + +struct elevator_type; + +struct elevator_queue { + struct elevator_type *type; + void *elevator_data; + struct kobject kobj; + struct mutex sysfs_lock; + unsigned int registered: 1; + struct hlist_head hash[64]; +}; + +struct blk_mq_ctxs; + +struct blk_mq_ctx { + struct { + spinlock_t lock; + struct list_head rq_lists[3]; + long: 64; + }; + unsigned int cpu; + short unsigned int index_hw[3]; + struct blk_mq_hw_ctx *hctxs[3]; + struct request_queue *queue; + struct blk_mq_ctxs *ctxs; + struct kobject kobj; + long: 64; +}; + +struct blk_mq_hw_ctx { + struct { + spinlock_t lock; + struct list_head dispatch; + long unsigned int state; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct delayed_work run_work; + cpumask_var_t cpumask; + int next_cpu; + int next_cpu_batch; + long unsigned int flags; + void *sched_data; + struct request_queue *queue; + struct blk_flush_queue *fq; + void *driver_data; + struct sbitmap ctx_map; + struct blk_mq_ctx *dispatch_from; + unsigned int dispatch_busy; + short unsigned int type; + short unsigned int nr_ctx; + struct blk_mq_ctx **ctxs; + spinlock_t dispatch_wait_lock; + wait_queue_entry_t dispatch_wait; + atomic_t wait_index; + struct blk_mq_tags *tags; + struct blk_mq_tags *sched_tags; + long unsigned int queued; + long unsigned int run; + unsigned int numa_node; + unsigned int queue_num; + atomic_t nr_active; + struct hlist_node cpuhp_online; + struct hlist_node cpuhp_dead; + struct kobject kobj; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct list_head hctx_list; + struct srcu_struct srcu[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct blk_stat_callback { + struct list_head list; + struct timer_list timer; + struct blk_rq_stat *cpu_stat; + int (*bucket_fn)(const struct request *); + unsigned int buckets; + struct blk_rq_stat *stat; + void (*timer_fn)(struct blk_stat_callback *); + void *data; + struct callback_head rcu; +}; + +struct blk_mq_tags { + unsigned int nr_tags; + unsigned int nr_reserved_tags; + atomic_t active_queues; + struct sbitmap_queue bitmap_tags; + struct sbitmap_queue breserved_tags; + struct request **rqs; + struct request **static_rqs; + struct list_head page_list; + spinlock_t lock; +}; + +struct blk_trace { + int trace_state; + struct rchan *rchan; + long unsigned int *sequence; + unsigned char *msg_data; + u16 act_mask; + u64 start_lba; + u64 end_lba; + u32 pid; + u32 dev; + struct dentry *dir; + struct list_head running_list; + atomic_t dropped; +}; + +struct blk_flush_queue { + unsigned int flush_pending_idx: 1; + unsigned int flush_running_idx: 1; + blk_status_t rq_status; + long unsigned int flush_pending_since; + struct list_head flush_queue[2]; + struct list_head flush_data_in_flight; + struct request *flush_rq; + spinlock_t mq_flush_lock; +}; + +struct blk_mq_queue_map { + unsigned int *mq_map; + unsigned int nr_queues; + unsigned int queue_offset; +}; + +struct blk_mq_tag_set { + struct blk_mq_queue_map map[3]; + unsigned int nr_maps; + const struct blk_mq_ops *ops; + unsigned int nr_hw_queues; + unsigned int queue_depth; + unsigned int reserved_tags; + unsigned int cmd_size; + int numa_node; + unsigned int timeout; + unsigned int flags; + void *driver_data; + struct blk_mq_tags **tags; + struct blk_mq_tags *shared_tags; + struct mutex tag_list_lock; + struct list_head tag_list; +}; + +struct blk_mq_queue_data { + struct request *rq; + bool last; +}; + +enum blktrace_cat { + BLK_TC_READ = 1, + BLK_TC_WRITE = 2, + BLK_TC_FLUSH = 4, + BLK_TC_SYNC = 8, + BLK_TC_SYNCIO = 8, + BLK_TC_QUEUE = 16, + BLK_TC_REQUEUE = 32, + BLK_TC_ISSUE = 64, + BLK_TC_COMPLETE = 128, + BLK_TC_FS = 256, + BLK_TC_PC = 512, + BLK_TC_NOTIFY = 1024, + BLK_TC_AHEAD = 2048, + BLK_TC_META = 4096, + BLK_TC_DISCARD = 8192, + BLK_TC_DRV_DATA = 16384, + BLK_TC_FUA = 32768, + BLK_TC_END = 32768, +}; + +enum blktrace_act { + __BLK_TA_QUEUE = 1, + __BLK_TA_BACKMERGE = 2, + __BLK_TA_FRONTMERGE = 3, + __BLK_TA_GETRQ = 4, + __BLK_TA_SLEEPRQ = 5, + __BLK_TA_REQUEUE = 6, + __BLK_TA_ISSUE = 7, + __BLK_TA_COMPLETE = 8, + __BLK_TA_PLUG = 9, + __BLK_TA_UNPLUG_IO = 10, + __BLK_TA_UNPLUG_TIMER = 11, + __BLK_TA_INSERT = 12, + __BLK_TA_SPLIT = 13, + __BLK_TA_BOUNCE = 14, + __BLK_TA_REMAP = 15, + __BLK_TA_ABORT = 16, + __BLK_TA_DRV_DATA = 17, + __BLK_TA_CGROUP = 256, +}; + +enum blktrace_notify { + __BLK_TN_PROCESS = 0, + __BLK_TN_TIMESTAMP = 1, + __BLK_TN_MESSAGE = 2, + __BLK_TN_CGROUP = 256, +}; + +struct blk_io_trace { + __u32 magic; + __u32 sequence; + __u64 time; + __u64 sector; + __u32 bytes; + __u32 action; + __u32 pid; + __u32 device; + __u32 cpu; + __u16 error; + __u16 pdu_len; +}; + +struct blk_io_trace_remap { + __be32 device_from; + __be32 device_to; + __be64 sector_from; +}; + +enum { + Blktrace_setup = 1, + Blktrace_running = 2, + Blktrace_stopped = 3, +}; + +struct blk_user_trace_setup { + char name[32]; + __u16 act_mask; + __u32 buf_size; + __u32 buf_nr; + __u64 start_lba; + __u64 end_lba; + __u32 pid; +}; + +enum blk_crypto_mode_num { + BLK_ENCRYPTION_MODE_INVALID = 0, + BLK_ENCRYPTION_MODE_AES_256_XTS = 1, + BLK_ENCRYPTION_MODE_AES_128_CBC_ESSIV = 2, + BLK_ENCRYPTION_MODE_ADIANTUM = 3, + BLK_ENCRYPTION_MODE_MAX = 4, +}; + +struct blk_crypto_config { + enum blk_crypto_mode_num crypto_mode; + unsigned int data_unit_size; + unsigned int dun_bytes; +}; + +struct blk_crypto_key { + struct blk_crypto_config crypto_cfg; + unsigned int data_unit_size_bits; + unsigned int size; + u8 raw[64]; +}; + +struct blk_mq_ctxs { + struct kobject kobj; + struct blk_mq_ctx *queue_ctx; +}; + +struct blk_mq_alloc_data { + struct request_queue *q; + blk_mq_req_flags_t flags; + unsigned int shallow_depth; + unsigned int cmd_flags; + req_flags_t rq_flags; + unsigned int nr_tags; + struct request **cached_rq; + struct blk_mq_ctx *ctx; + struct blk_mq_hw_ctx *hctx; +}; + +enum elv_merge { + ELEVATOR_NO_MERGE = 0, + ELEVATOR_FRONT_MERGE = 1, + ELEVATOR_BACK_MERGE = 2, + ELEVATOR_DISCARD_MERGE = 3, +}; + +struct elevator_mq_ops { + int (*init_sched)(struct request_queue *, struct elevator_type *); + void (*exit_sched)(struct elevator_queue *); + int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*depth_updated)(struct blk_mq_hw_ctx *); + bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); + bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int); + int (*request_merge)(struct request_queue *, struct request **, struct bio *); + void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); + void (*requests_merged)(struct request_queue *, struct request *, struct request *); + void (*limit_depth)(unsigned int, struct blk_mq_alloc_data *); + void (*prepare_request)(struct request *); + void (*finish_request)(struct request *); + void (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, bool); + struct request * (*dispatch_request)(struct blk_mq_hw_ctx *); + bool (*has_work)(struct blk_mq_hw_ctx *); + void (*completed_request)(struct request *, u64); + void (*requeue_request)(struct request *); + struct request * (*former_request)(struct request_queue *, struct request *); + struct request * (*next_request)(struct request_queue *, struct request *); + void (*init_icq)(struct io_cq *); + void (*exit_icq)(struct io_cq *); +}; + +struct elv_fs_entry; + +struct blk_mq_debugfs_attr; + +struct elevator_type { + struct kmem_cache *icq_cache; + struct elevator_mq_ops ops; + size_t icq_size; + size_t icq_align; + struct elv_fs_entry *elevator_attrs; + const char *elevator_name; + const char *elevator_alias; + const unsigned int elevator_features; + struct module *elevator_owner; + const struct blk_mq_debugfs_attr *queue_debugfs_attrs; + const struct blk_mq_debugfs_attr *hctx_debugfs_attrs; + char icq_cache_name[22]; + struct list_head list; +}; + +struct elv_fs_entry { + struct attribute attr; + ssize_t (*show)(struct elevator_queue *, char *); + ssize_t (*store)(struct elevator_queue *, const char *, size_t); +}; + +struct blk_mq_debugfs_attr { + const char *name; + umode_t mode; + int (*show)(void *, struct seq_file *); + ssize_t (*write)(void *, const char *, size_t, loff_t *); + const struct seq_operations *seq_ops; +}; + +typedef void blk_log_action_t(struct trace_iterator *, const char *, bool); + +struct ftrace_event_field { + struct list_head link; + const char *name; + const char *type; + int filter_type; + int offset; + int size; + int is_signed; +}; + +enum { + FORMAT_HEADER = 1, + FORMAT_FIELD_SEPERATOR = 2, + FORMAT_PRINTFMT = 3, +}; + +struct event_probe_data { + struct trace_event_file *file; + long unsigned int count; + int ref; + bool enable; +}; + +struct syscall_trace_enter { + struct trace_entry ent; + int nr; + long unsigned int args[0]; +}; + +struct syscall_trace_exit { + struct trace_entry ent; + int nr; + long int ret; +}; + +struct syscall_tp_t { + long long unsigned int regs; + long unsigned int syscall_nr; + long unsigned int ret; +}; + +struct syscall_tp_t___2 { + long long unsigned int regs; + long unsigned int syscall_nr; + long unsigned int args[6]; +}; + +enum perf_event_sample_format { + PERF_SAMPLE_IP = 1, + PERF_SAMPLE_TID = 2, + PERF_SAMPLE_TIME = 4, + PERF_SAMPLE_ADDR = 8, + PERF_SAMPLE_READ = 16, + PERF_SAMPLE_CALLCHAIN = 32, + PERF_SAMPLE_ID = 64, + PERF_SAMPLE_CPU = 128, + PERF_SAMPLE_PERIOD = 256, + PERF_SAMPLE_STREAM_ID = 512, + PERF_SAMPLE_RAW = 1024, + PERF_SAMPLE_BRANCH_STACK = 2048, + PERF_SAMPLE_REGS_USER = 4096, + PERF_SAMPLE_STACK_USER = 8192, + PERF_SAMPLE_WEIGHT = 16384, + PERF_SAMPLE_DATA_SRC = 32768, + PERF_SAMPLE_IDENTIFIER = 65536, + PERF_SAMPLE_TRANSACTION = 131072, + PERF_SAMPLE_REGS_INTR = 262144, + PERF_SAMPLE_PHYS_ADDR = 524288, + PERF_SAMPLE_AUX = 1048576, + PERF_SAMPLE_CGROUP = 2097152, + PERF_SAMPLE_DATA_PAGE_SIZE = 4194304, + PERF_SAMPLE_CODE_PAGE_SIZE = 8388608, + PERF_SAMPLE_WEIGHT_STRUCT = 16777216, + PERF_SAMPLE_MAX = 33554432, + __PERF_SAMPLE_CALLCHAIN_EARLY = 0, +}; + +typedef long unsigned int perf_trace_t[1024]; + +struct filter_pred; + +struct prog_entry { + int target; + int when_to_branch; + struct filter_pred *pred; +}; + +typedef int (*filter_pred_fn_t)(struct filter_pred *, void *); + +struct regex; + +typedef int (*regex_match_func)(char *, struct regex *, int); + +struct regex { + char pattern[256]; + int len; + int field_len; + regex_match_func match; +}; + +struct filter_pred { + filter_pred_fn_t fn; + u64 val; + struct regex regex; + short unsigned int *ops; + struct ftrace_event_field *field; + int offset; + int not; + int op; +}; + +enum filter_op_ids { + OP_GLOB = 0, + OP_NE = 1, + OP_EQ = 2, + OP_LE = 3, + OP_LT = 4, + OP_GE = 5, + OP_GT = 6, + OP_BAND = 7, + OP_MAX = 8, +}; + +enum { + FILT_ERR_NONE = 0, + FILT_ERR_INVALID_OP = 1, + FILT_ERR_TOO_MANY_OPEN = 2, + FILT_ERR_TOO_MANY_CLOSE = 3, + FILT_ERR_MISSING_QUOTE = 4, + FILT_ERR_OPERAND_TOO_LONG = 5, + FILT_ERR_EXPECT_STRING = 6, + FILT_ERR_EXPECT_DIGIT = 7, + FILT_ERR_ILLEGAL_FIELD_OP = 8, + FILT_ERR_FIELD_NOT_FOUND = 9, + FILT_ERR_ILLEGAL_INTVAL = 10, + FILT_ERR_BAD_SUBSYS_FILTER = 11, + FILT_ERR_TOO_MANY_PREDS = 12, + FILT_ERR_INVALID_FILTER = 13, + FILT_ERR_IP_FIELD_ONLY = 14, + FILT_ERR_INVALID_VALUE = 15, + FILT_ERR_ERRNO = 16, + FILT_ERR_NO_FILTER = 17, +}; + +struct filter_parse_error { + int lasterr; + int lasterr_pos; +}; + +typedef int (*parse_pred_fn)(const char *, void *, int, struct filter_parse_error *, struct filter_pred **); + +enum { + INVERT = 1, + PROCESS_AND = 2, + PROCESS_OR = 4, +}; + +enum { + TOO_MANY_CLOSE = 4294967295, + TOO_MANY_OPEN = 4294967294, + MISSING_QUOTE = 4294967293, +}; + +struct filter_list { + struct list_head list; + struct event_filter *filter; +}; + +struct function_filter_data { + struct ftrace_ops *ops; + int first_filter; + int first_notrace; +}; + +enum { + EVENT_TRIGGER_FL_PROBE = 1, +}; + +struct event_trigger_ops; + +struct event_command; + +struct event_trigger_data { + long unsigned int count; + int ref; + int flags; + struct event_trigger_ops *ops; + struct event_command *cmd_ops; + struct event_filter *filter; + char *filter_str; + void *private_data; + bool paused; + bool paused_tmp; + struct list_head list; + char *name; + struct list_head named_list; + struct event_trigger_data *named_data; +}; + +struct event_trigger_ops { + void (*func)(struct event_trigger_data *, struct trace_buffer *, void *, struct ring_buffer_event *); + int (*init)(struct event_trigger_ops *, struct event_trigger_data *); + void (*free)(struct event_trigger_ops *, struct event_trigger_data *); + int (*print)(struct seq_file *, struct event_trigger_ops *, struct event_trigger_data *); +}; + +struct event_command { + struct list_head list; + char *name; + enum event_trigger_type trigger_type; + int flags; + int (*func)(struct event_command *, struct trace_event_file *, char *, char *, char *); + int (*reg)(char *, struct event_trigger_ops *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg)(char *, struct event_trigger_ops *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg_all)(struct trace_event_file *); + int (*set_filter)(char *, struct event_trigger_data *, struct trace_event_file *); + struct event_trigger_ops * (*get_trigger_ops)(char *, char *); +}; + +struct enable_trigger_data { + struct trace_event_file *file; + bool enable; + bool hist; +}; + +enum event_command_flags { + EVENT_CMD_FL_POST_TRIGGER = 1, + EVENT_CMD_FL_NEEDS_REC = 2, +}; + +struct eprobe_trace_entry_head { + struct trace_entry ent; + unsigned int type; +}; + +struct dyn_event; + +struct dyn_event_operations { + struct list_head list; + int (*create)(const char *); + int (*show)(struct seq_file *, struct dyn_event *); + bool (*is_busy)(struct dyn_event *); + int (*free)(struct dyn_event *); + bool (*match)(const char *, const char *, int, const char **, struct dyn_event *); +}; + +struct dyn_event { + struct list_head list; + struct dyn_event_operations *ops; +}; + +typedef int (*print_type_func_t)(struct trace_seq *, void *, void *); + +enum fetch_op { + FETCH_OP_NOP = 0, + FETCH_OP_REG = 1, + FETCH_OP_STACK = 2, + FETCH_OP_STACKP = 3, + FETCH_OP_RETVAL = 4, + FETCH_OP_IMM = 5, + FETCH_OP_COMM = 6, + FETCH_OP_ARG = 7, + FETCH_OP_FOFFS = 8, + FETCH_OP_DATA = 9, + FETCH_OP_DEREF = 10, + FETCH_OP_UDEREF = 11, + FETCH_OP_ST_RAW = 12, + FETCH_OP_ST_MEM = 13, + FETCH_OP_ST_UMEM = 14, + FETCH_OP_ST_STRING = 15, + FETCH_OP_ST_USTRING = 16, + FETCH_OP_MOD_BF = 17, + FETCH_OP_LP_ARRAY = 18, + FETCH_OP_TP_ARG = 19, + FETCH_OP_END = 20, + FETCH_NOP_SYMBOL = 21, +}; + +struct fetch_insn { + enum fetch_op op; + union { + unsigned int param; + struct { + unsigned int size; + int offset; + }; + struct { + unsigned char basesize; + unsigned char lshift; + unsigned char rshift; + }; + long unsigned int immediate; + void *data; + }; +}; + +struct fetch_type { + const char *name; + size_t size; + int is_signed; + print_type_func_t print; + const char *fmt; + const char *fmttype; +}; + +struct probe_arg { + struct fetch_insn *code; + bool dynamic; + unsigned int offset; + unsigned int count; + const char *name; + const char *comm; + char *fmt; + const struct fetch_type *type; +}; + +struct trace_uprobe_filter { + rwlock_t rwlock; + int nr_systemwide; + struct list_head perf_events; +}; + +struct trace_probe_event { + unsigned int flags; + struct trace_event_class class; + struct trace_event_call call; + struct list_head files; + struct list_head probes; + struct trace_uprobe_filter filter[0]; +}; + +struct trace_probe { + struct list_head list; + struct trace_probe_event *event; + ssize_t size; + unsigned int nr_args; + struct probe_arg args[0]; +}; + +struct event_file_link { + struct trace_event_file *file; + struct list_head list; +}; + +enum probe_print_type { + PROBE_PRINT_NORMAL = 0, + PROBE_PRINT_RETURN = 1, + PROBE_PRINT_EVENT = 2, +}; + +enum { + TP_ERR_FILE_NOT_FOUND = 0, + TP_ERR_NO_REGULAR_FILE = 1, + TP_ERR_BAD_REFCNT = 2, + TP_ERR_REFCNT_OPEN_BRACE = 3, + TP_ERR_BAD_REFCNT_SUFFIX = 4, + TP_ERR_BAD_UPROBE_OFFS = 5, + TP_ERR_MAXACT_NO_KPROBE = 6, + TP_ERR_BAD_MAXACT = 7, + TP_ERR_MAXACT_TOO_BIG = 8, + TP_ERR_BAD_PROBE_ADDR = 9, + TP_ERR_BAD_RETPROBE = 10, + TP_ERR_BAD_ADDR_SUFFIX = 11, + TP_ERR_NO_GROUP_NAME = 12, + TP_ERR_GROUP_TOO_LONG = 13, + TP_ERR_BAD_GROUP_NAME = 14, + TP_ERR_NO_EVENT_NAME = 15, + TP_ERR_EVENT_TOO_LONG = 16, + TP_ERR_BAD_EVENT_NAME = 17, + TP_ERR_EVENT_EXIST = 18, + TP_ERR_RETVAL_ON_PROBE = 19, + TP_ERR_BAD_STACK_NUM = 20, + TP_ERR_BAD_ARG_NUM = 21, + TP_ERR_BAD_VAR = 22, + TP_ERR_BAD_REG_NAME = 23, + TP_ERR_BAD_MEM_ADDR = 24, + TP_ERR_BAD_IMM = 25, + TP_ERR_IMMSTR_NO_CLOSE = 26, + TP_ERR_FILE_ON_KPROBE = 27, + TP_ERR_BAD_FILE_OFFS = 28, + TP_ERR_SYM_ON_UPROBE = 29, + TP_ERR_TOO_MANY_OPS = 30, + TP_ERR_DEREF_NEED_BRACE = 31, + TP_ERR_BAD_DEREF_OFFS = 32, + TP_ERR_DEREF_OPEN_BRACE = 33, + TP_ERR_COMM_CANT_DEREF = 34, + TP_ERR_BAD_FETCH_ARG = 35, + TP_ERR_ARRAY_NO_CLOSE = 36, + TP_ERR_BAD_ARRAY_SUFFIX = 37, + TP_ERR_BAD_ARRAY_NUM = 38, + TP_ERR_ARRAY_TOO_BIG = 39, + TP_ERR_BAD_TYPE = 40, + TP_ERR_BAD_STRING = 41, + TP_ERR_BAD_BITFIELD = 42, + TP_ERR_ARG_NAME_TOO_LONG = 43, + TP_ERR_NO_ARG_NAME = 44, + TP_ERR_BAD_ARG_NAME = 45, + TP_ERR_USED_ARG_NAME = 46, + TP_ERR_ARG_TOO_LONG = 47, + TP_ERR_NO_ARG_BODY = 48, + TP_ERR_BAD_INSN_BNDRY = 49, + TP_ERR_FAIL_REG_PROBE = 50, + TP_ERR_DIFF_PROBE_TYPE = 51, + TP_ERR_DIFF_ARG_TYPE = 52, + TP_ERR_SAME_PROBE = 53, +}; + +struct trace_eprobe { + const char *event_system; + const char *event_name; + struct trace_event_call *event; + struct dyn_event devent; + struct trace_probe tp; +}; + +struct eprobe_data { + struct trace_event_file *file; + struct trace_eprobe *ep; +}; + +enum dynevent_type { + DYNEVENT_TYPE_SYNTH = 1, + DYNEVENT_TYPE_KPROBE = 2, + DYNEVENT_TYPE_NONE = 3, +}; + +struct dynevent_cmd; + +typedef int (*dynevent_create_fn_t)(struct dynevent_cmd *); + +struct dynevent_cmd { + struct seq_buf seq; + const char *event_name; + unsigned int n_fields; + enum dynevent_type type; + dynevent_create_fn_t run_command; + void *private_data; +}; + +struct synth_field_desc { + const char *type; + const char *name; +}; + +struct synth_trace_event; + +struct synth_event; + +struct synth_event_trace_state { + struct trace_event_buffer fbuffer; + struct synth_trace_event *entry; + struct trace_buffer *buffer; + struct synth_event *event; + unsigned int cur_field; + unsigned int n_u64; + bool disabled; + bool add_next; + bool add_name; +}; + +struct synth_trace_event { + struct trace_entry ent; + u64 fields[0]; +}; + +struct synth_field; + +struct synth_event { + struct dyn_event devent; + int ref; + char *name; + struct synth_field **fields; + unsigned int n_fields; + struct synth_field **dynamic_fields; + unsigned int n_dynamic_fields; + unsigned int n_u64; + struct trace_event_class class; + struct trace_event_call call; + struct tracepoint *tp; + struct module *mod; +}; + +typedef int (*dynevent_check_arg_fn_t)(void *); + +struct dynevent_arg { + const char *str; + char separator; +}; + +struct dynevent_arg_pair { + const char *lhs; + const char *rhs; + char operator; + char separator; +}; + +struct synth_field { + char *type; + char *name; + size_t size; + unsigned int offset; + unsigned int field_pos; + bool is_signed; + bool is_string; + bool is_dynamic; +}; + +enum { + SYNTH_ERR_BAD_NAME = 0, + SYNTH_ERR_INVALID_CMD = 1, + SYNTH_ERR_INVALID_DYN_CMD = 2, + SYNTH_ERR_EVENT_EXISTS = 3, + SYNTH_ERR_TOO_MANY_FIELDS = 4, + SYNTH_ERR_INCOMPLETE_TYPE = 5, + SYNTH_ERR_INVALID_TYPE = 6, + SYNTH_ERR_INVALID_FIELD = 7, + SYNTH_ERR_INVALID_ARRAY_SPEC = 8, +}; + +enum { + HIST_ERR_NONE = 0, + HIST_ERR_DUPLICATE_VAR = 1, + HIST_ERR_VAR_NOT_UNIQUE = 2, + HIST_ERR_TOO_MANY_VARS = 3, + HIST_ERR_MALFORMED_ASSIGNMENT = 4, + HIST_ERR_NAMED_MISMATCH = 5, + HIST_ERR_TRIGGER_EEXIST = 6, + HIST_ERR_TRIGGER_ENOENT_CLEAR = 7, + HIST_ERR_SET_CLOCK_FAIL = 8, + HIST_ERR_BAD_FIELD_MODIFIER = 9, + HIST_ERR_TOO_MANY_SUBEXPR = 10, + HIST_ERR_TIMESTAMP_MISMATCH = 11, + HIST_ERR_TOO_MANY_FIELD_VARS = 12, + HIST_ERR_EVENT_FILE_NOT_FOUND = 13, + HIST_ERR_HIST_NOT_FOUND = 14, + HIST_ERR_HIST_CREATE_FAIL = 15, + HIST_ERR_SYNTH_VAR_NOT_FOUND = 16, + HIST_ERR_SYNTH_EVENT_NOT_FOUND = 17, + HIST_ERR_SYNTH_TYPE_MISMATCH = 18, + HIST_ERR_SYNTH_COUNT_MISMATCH = 19, + HIST_ERR_FIELD_VAR_PARSE_FAIL = 20, + HIST_ERR_VAR_CREATE_FIND_FAIL = 21, + HIST_ERR_ONX_NOT_VAR = 22, + HIST_ERR_ONX_VAR_NOT_FOUND = 23, + HIST_ERR_ONX_VAR_CREATE_FAIL = 24, + HIST_ERR_FIELD_VAR_CREATE_FAIL = 25, + HIST_ERR_TOO_MANY_PARAMS = 26, + HIST_ERR_PARAM_NOT_FOUND = 27, + HIST_ERR_INVALID_PARAM = 28, + HIST_ERR_ACTION_NOT_FOUND = 29, + HIST_ERR_NO_SAVE_PARAMS = 30, + HIST_ERR_TOO_MANY_SAVE_ACTIONS = 31, + HIST_ERR_ACTION_MISMATCH = 32, + HIST_ERR_NO_CLOSING_PAREN = 33, + HIST_ERR_SUBSYS_NOT_FOUND = 34, + HIST_ERR_INVALID_SUBSYS_EVENT = 35, + HIST_ERR_INVALID_REF_KEY = 36, + HIST_ERR_VAR_NOT_FOUND = 37, + HIST_ERR_FIELD_NOT_FOUND = 38, + HIST_ERR_EMPTY_ASSIGNMENT = 39, + HIST_ERR_INVALID_SORT_MODIFIER = 40, + HIST_ERR_EMPTY_SORT_FIELD = 41, + HIST_ERR_TOO_MANY_SORT_FIELDS = 42, + HIST_ERR_INVALID_SORT_FIELD = 43, + HIST_ERR_INVALID_STR_OPERAND = 44, + HIST_ERR_EXPECT_NUMBER = 45, + HIST_ERR_UNARY_MINUS_SUBEXPR = 46, + HIST_ERR_DIVISION_BY_ZERO = 47, +}; + +struct hist_field; + +typedef u64 (*hist_field_fn_t)(struct hist_field *, struct tracing_map_elt *, struct trace_buffer *, struct ring_buffer_event *, void *); + +struct hist_trigger_data; + +struct hist_var { + char *name; + struct hist_trigger_data *hist_data; + unsigned int idx; +}; + +enum field_op_id { + FIELD_OP_NONE = 0, + FIELD_OP_PLUS = 1, + FIELD_OP_MINUS = 2, + FIELD_OP_UNARY_MINUS = 3, + FIELD_OP_DIV = 4, + FIELD_OP_MULT = 5, +}; + +struct hist_field { + struct ftrace_event_field *field; + long unsigned int flags; + hist_field_fn_t fn; + unsigned int ref; + unsigned int size; + unsigned int offset; + unsigned int is_signed; + long unsigned int buckets; + const char *type; + struct hist_field *operands[2]; + struct hist_trigger_data *hist_data; + struct hist_var var; + enum field_op_id operator; + char *system; + char *event_name; + char *name; + unsigned int var_ref_idx; + bool read_once; + unsigned int var_str_idx; + u64 constant; + u64 div_multiplier; +}; + +struct hist_trigger_attrs; + +struct action_data; + +struct field_var; + +struct field_var_hist; + +struct hist_trigger_data { + struct hist_field *fields[22]; + unsigned int n_vals; + unsigned int n_keys; + unsigned int n_fields; + unsigned int n_vars; + unsigned int n_var_str; + unsigned int key_size; + struct tracing_map_sort_key sort_keys[2]; + unsigned int n_sort_keys; + struct trace_event_file *event_file; + struct hist_trigger_attrs *attrs; + struct tracing_map *map; + bool enable_timestamps; + bool remove; + struct hist_field *var_refs[16]; + unsigned int n_var_refs; + struct action_data *actions[8]; + unsigned int n_actions; + struct field_var *field_vars[64]; + unsigned int n_field_vars; + unsigned int n_field_var_str; + struct field_var_hist *field_var_hists[64]; + unsigned int n_field_var_hists; + struct field_var *save_vars[64]; + unsigned int n_save_vars; + unsigned int n_save_var_str; +}; + +enum hist_field_flags { + HIST_FIELD_FL_HITCOUNT = 1, + HIST_FIELD_FL_KEY = 2, + HIST_FIELD_FL_STRING = 4, + HIST_FIELD_FL_HEX = 8, + HIST_FIELD_FL_SYM = 16, + HIST_FIELD_FL_SYM_OFFSET = 32, + HIST_FIELD_FL_EXECNAME = 64, + HIST_FIELD_FL_SYSCALL = 128, + HIST_FIELD_FL_STACKTRACE = 256, + HIST_FIELD_FL_LOG2 = 512, + HIST_FIELD_FL_TIMESTAMP = 1024, + HIST_FIELD_FL_TIMESTAMP_USECS = 2048, + HIST_FIELD_FL_VAR = 4096, + HIST_FIELD_FL_EXPR = 8192, + HIST_FIELD_FL_VAR_REF = 16384, + HIST_FIELD_FL_CPU = 32768, + HIST_FIELD_FL_ALIAS = 65536, + HIST_FIELD_FL_BUCKET = 131072, + HIST_FIELD_FL_CONST = 262144, +}; + +struct var_defs { + unsigned int n_vars; + char *name[16]; + char *expr[16]; +}; + +struct hist_trigger_attrs { + char *keys_str; + char *vals_str; + char *sort_key_str; + char *name; + char *clock; + bool pause; + bool cont; + bool clear; + bool ts_in_usecs; + unsigned int map_bits; + char *assignment_str[16]; + unsigned int n_assignments; + char *action_str[8]; + unsigned int n_actions; + struct var_defs var_defs; +}; + +struct field_var { + struct hist_field *var; + struct hist_field *val; +}; + +struct field_var_hist { + struct hist_trigger_data *hist_data; + char *cmd; +}; + +enum handler_id { + HANDLER_ONMATCH = 1, + HANDLER_ONMAX = 2, + HANDLER_ONCHANGE = 3, +}; + +enum action_id { + ACTION_SAVE = 1, + ACTION_TRACE = 2, + ACTION_SNAPSHOT = 3, +}; + +typedef void (*action_fn_t)(struct hist_trigger_data *, struct tracing_map_elt *, struct trace_buffer *, void *, struct ring_buffer_event *, void *, struct action_data *, u64 *); + +typedef bool (*check_track_val_fn_t)(u64, u64); + +struct action_data { + enum handler_id handler; + enum action_id action; + char *action_name; + action_fn_t fn; + unsigned int n_params; + char *params[64]; + unsigned int var_ref_idx[16]; + struct synth_event *synth_event; + bool use_trace_keyword; + char *synth_event_name; + union { + struct { + char *event; + char *event_system; + } match_data; + struct { + char *var_str; + struct hist_field *var_ref; + struct hist_field *track_var; + check_track_val_fn_t check_val; + action_fn_t save_data; + } track_data; + }; +}; + +struct track_data { + u64 track_val; + bool updated; + unsigned int key_len; + void *key; + struct tracing_map_elt elt; + struct action_data *action_data; + struct hist_trigger_data *hist_data; +}; + +struct hist_elt_data { + char *comm; + u64 *var_ref_vals; + char **field_var_str; + int n_field_var_str; +}; + +struct snapshot_context { + struct tracing_map_elt *elt; + void *key; +}; + +typedef void (*synth_probe_func_t)(void *, u64 *, unsigned int *); + +struct hist_var_data { + struct list_head list; + struct hist_trigger_data *hist_data; +}; + +enum bpf_func_id { + BPF_FUNC_unspec = 0, + BPF_FUNC_map_lookup_elem = 1, + BPF_FUNC_map_update_elem = 2, + BPF_FUNC_map_delete_elem = 3, + BPF_FUNC_probe_read = 4, + BPF_FUNC_ktime_get_ns = 5, + BPF_FUNC_trace_printk = 6, + BPF_FUNC_get_prandom_u32 = 7, + BPF_FUNC_get_smp_processor_id = 8, + BPF_FUNC_skb_store_bytes = 9, + BPF_FUNC_l3_csum_replace = 10, + BPF_FUNC_l4_csum_replace = 11, + BPF_FUNC_tail_call = 12, + BPF_FUNC_clone_redirect = 13, + BPF_FUNC_get_current_pid_tgid = 14, + BPF_FUNC_get_current_uid_gid = 15, + BPF_FUNC_get_current_comm = 16, + BPF_FUNC_get_cgroup_classid = 17, + BPF_FUNC_skb_vlan_push = 18, + BPF_FUNC_skb_vlan_pop = 19, + BPF_FUNC_skb_get_tunnel_key = 20, + BPF_FUNC_skb_set_tunnel_key = 21, + BPF_FUNC_perf_event_read = 22, + BPF_FUNC_redirect = 23, + BPF_FUNC_get_route_realm = 24, + BPF_FUNC_perf_event_output = 25, + BPF_FUNC_skb_load_bytes = 26, + BPF_FUNC_get_stackid = 27, + BPF_FUNC_csum_diff = 28, + BPF_FUNC_skb_get_tunnel_opt = 29, + BPF_FUNC_skb_set_tunnel_opt = 30, + BPF_FUNC_skb_change_proto = 31, + BPF_FUNC_skb_change_type = 32, + BPF_FUNC_skb_under_cgroup = 33, + BPF_FUNC_get_hash_recalc = 34, + BPF_FUNC_get_current_task = 35, + BPF_FUNC_probe_write_user = 36, + BPF_FUNC_current_task_under_cgroup = 37, + BPF_FUNC_skb_change_tail = 38, + BPF_FUNC_skb_pull_data = 39, + BPF_FUNC_csum_update = 40, + BPF_FUNC_set_hash_invalid = 41, + BPF_FUNC_get_numa_node_id = 42, + BPF_FUNC_skb_change_head = 43, + BPF_FUNC_xdp_adjust_head = 44, + BPF_FUNC_probe_read_str = 45, + BPF_FUNC_get_socket_cookie = 46, + BPF_FUNC_get_socket_uid = 47, + BPF_FUNC_set_hash = 48, + BPF_FUNC_setsockopt = 49, + BPF_FUNC_skb_adjust_room = 50, + BPF_FUNC_redirect_map = 51, + BPF_FUNC_sk_redirect_map = 52, + BPF_FUNC_sock_map_update = 53, + BPF_FUNC_xdp_adjust_meta = 54, + BPF_FUNC_perf_event_read_value = 55, + BPF_FUNC_perf_prog_read_value = 56, + BPF_FUNC_getsockopt = 57, + BPF_FUNC_override_return = 58, + BPF_FUNC_sock_ops_cb_flags_set = 59, + BPF_FUNC_msg_redirect_map = 60, + BPF_FUNC_msg_apply_bytes = 61, + BPF_FUNC_msg_cork_bytes = 62, + BPF_FUNC_msg_pull_data = 63, + BPF_FUNC_bind = 64, + BPF_FUNC_xdp_adjust_tail = 65, + BPF_FUNC_skb_get_xfrm_state = 66, + BPF_FUNC_get_stack = 67, + BPF_FUNC_skb_load_bytes_relative = 68, + BPF_FUNC_fib_lookup = 69, + BPF_FUNC_sock_hash_update = 70, + BPF_FUNC_msg_redirect_hash = 71, + BPF_FUNC_sk_redirect_hash = 72, + BPF_FUNC_lwt_push_encap = 73, + BPF_FUNC_lwt_seg6_store_bytes = 74, + BPF_FUNC_lwt_seg6_adjust_srh = 75, + BPF_FUNC_lwt_seg6_action = 76, + BPF_FUNC_rc_repeat = 77, + BPF_FUNC_rc_keydown = 78, + BPF_FUNC_skb_cgroup_id = 79, + BPF_FUNC_get_current_cgroup_id = 80, + BPF_FUNC_get_local_storage = 81, + BPF_FUNC_sk_select_reuseport = 82, + BPF_FUNC_skb_ancestor_cgroup_id = 83, + BPF_FUNC_sk_lookup_tcp = 84, + BPF_FUNC_sk_lookup_udp = 85, + BPF_FUNC_sk_release = 86, + BPF_FUNC_map_push_elem = 87, + BPF_FUNC_map_pop_elem = 88, + BPF_FUNC_map_peek_elem = 89, + BPF_FUNC_msg_push_data = 90, + BPF_FUNC_msg_pop_data = 91, + BPF_FUNC_rc_pointer_rel = 92, + BPF_FUNC_spin_lock = 93, + BPF_FUNC_spin_unlock = 94, + BPF_FUNC_sk_fullsock = 95, + BPF_FUNC_tcp_sock = 96, + BPF_FUNC_skb_ecn_set_ce = 97, + BPF_FUNC_get_listener_sock = 98, + BPF_FUNC_skc_lookup_tcp = 99, + BPF_FUNC_tcp_check_syncookie = 100, + BPF_FUNC_sysctl_get_name = 101, + BPF_FUNC_sysctl_get_current_value = 102, + BPF_FUNC_sysctl_get_new_value = 103, + BPF_FUNC_sysctl_set_new_value = 104, + BPF_FUNC_strtol = 105, + BPF_FUNC_strtoul = 106, + BPF_FUNC_sk_storage_get = 107, + BPF_FUNC_sk_storage_delete = 108, + BPF_FUNC_send_signal = 109, + BPF_FUNC_tcp_gen_syncookie = 110, + BPF_FUNC_skb_output = 111, + BPF_FUNC_probe_read_user = 112, + BPF_FUNC_probe_read_kernel = 113, + BPF_FUNC_probe_read_user_str = 114, + BPF_FUNC_probe_read_kernel_str = 115, + BPF_FUNC_tcp_send_ack = 116, + BPF_FUNC_send_signal_thread = 117, + BPF_FUNC_jiffies64 = 118, + BPF_FUNC_read_branch_records = 119, + BPF_FUNC_get_ns_current_pid_tgid = 120, + BPF_FUNC_xdp_output = 121, + BPF_FUNC_get_netns_cookie = 122, + BPF_FUNC_get_current_ancestor_cgroup_id = 123, + BPF_FUNC_sk_assign = 124, + BPF_FUNC_ktime_get_boot_ns = 125, + BPF_FUNC_seq_printf = 126, + BPF_FUNC_seq_write = 127, + BPF_FUNC_sk_cgroup_id = 128, + BPF_FUNC_sk_ancestor_cgroup_id = 129, + BPF_FUNC_ringbuf_output = 130, + BPF_FUNC_ringbuf_reserve = 131, + BPF_FUNC_ringbuf_submit = 132, + BPF_FUNC_ringbuf_discard = 133, + BPF_FUNC_ringbuf_query = 134, + BPF_FUNC_csum_level = 135, + BPF_FUNC_skc_to_tcp6_sock = 136, + BPF_FUNC_skc_to_tcp_sock = 137, + BPF_FUNC_skc_to_tcp_timewait_sock = 138, + BPF_FUNC_skc_to_tcp_request_sock = 139, + BPF_FUNC_skc_to_udp6_sock = 140, + BPF_FUNC_get_task_stack = 141, + BPF_FUNC_load_hdr_opt = 142, + BPF_FUNC_store_hdr_opt = 143, + BPF_FUNC_reserve_hdr_opt = 144, + BPF_FUNC_inode_storage_get = 145, + BPF_FUNC_inode_storage_delete = 146, + BPF_FUNC_d_path = 147, + BPF_FUNC_copy_from_user = 148, + BPF_FUNC_snprintf_btf = 149, + BPF_FUNC_seq_printf_btf = 150, + BPF_FUNC_skb_cgroup_classid = 151, + BPF_FUNC_redirect_neigh = 152, + BPF_FUNC_per_cpu_ptr = 153, + BPF_FUNC_this_cpu_ptr = 154, + BPF_FUNC_redirect_peer = 155, + BPF_FUNC_task_storage_get = 156, + BPF_FUNC_task_storage_delete = 157, + BPF_FUNC_get_current_task_btf = 158, + BPF_FUNC_bprm_opts_set = 159, + BPF_FUNC_ktime_get_coarse_ns = 160, + BPF_FUNC_ima_inode_hash = 161, + BPF_FUNC_sock_from_file = 162, + BPF_FUNC_check_mtu = 163, + BPF_FUNC_for_each_map_elem = 164, + BPF_FUNC_snprintf = 165, + BPF_FUNC_sys_bpf = 166, + BPF_FUNC_btf_find_by_name_kind = 167, + BPF_FUNC_sys_close = 168, + BPF_FUNC_timer_init = 169, + BPF_FUNC_timer_set_callback = 170, + BPF_FUNC_timer_start = 171, + BPF_FUNC_timer_cancel = 172, + BPF_FUNC_get_func_ip = 173, + BPF_FUNC_get_attach_cookie = 174, + BPF_FUNC_task_pt_regs = 175, + BPF_FUNC_get_branch_snapshot = 176, + BPF_FUNC_trace_vprintk = 177, + BPF_FUNC_skc_to_unix_sock = 178, + BPF_FUNC_kallsyms_lookup_name = 179, + __BPF_FUNC_MAX_ID = 180, +}; + +enum { + BPF_F_INDEX_MASK = 4294967295, + BPF_F_CURRENT_CPU = 4294967295, + BPF_F_CTXLEN_MASK = 0, +}; + +struct bpf_perf_event_value { + __u64 counter; + __u64 enabled; + __u64 running; +}; + +struct bpf_raw_tracepoint_args { + __u64 args[0]; +}; + +enum bpf_task_fd_type { + BPF_FD_TYPE_RAW_TRACEPOINT = 0, + BPF_FD_TYPE_TRACEPOINT = 1, + BPF_FD_TYPE_KPROBE = 2, + BPF_FD_TYPE_KRETPROBE = 3, + BPF_FD_TYPE_UPROBE = 4, + BPF_FD_TYPE_URETPROBE = 5, +}; + +struct btf_ptr { + void *ptr; + __u32 type_id; + __u32 flags; +}; + +enum { + BTF_F_COMPACT = 1, + BTF_F_NONAME = 2, + BTF_F_PTR_RAW = 4, + BTF_F_ZERO = 8, +}; + +struct bpf_local_storage_data; + +struct bpf_local_storage { + struct bpf_local_storage_data *cache[16]; + struct hlist_head list; + void *owner; + struct callback_head rcu; + raw_spinlock_t lock; +}; + +struct bpf_local_storage_map_bucket; + +struct bpf_local_storage_map { + struct bpf_map map; + struct bpf_local_storage_map_bucket *buckets; + u32 bucket_log; + u16 elem_size; + u16 cache_idx; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum bpf_arg_type { + ARG_DONTCARE = 0, + ARG_CONST_MAP_PTR = 1, + ARG_PTR_TO_MAP_KEY = 2, + ARG_PTR_TO_MAP_VALUE = 3, + ARG_PTR_TO_UNINIT_MAP_VALUE = 4, + ARG_PTR_TO_MAP_VALUE_OR_NULL = 5, + ARG_PTR_TO_MEM = 6, + ARG_PTR_TO_MEM_OR_NULL = 7, + ARG_PTR_TO_UNINIT_MEM = 8, + ARG_CONST_SIZE = 9, + ARG_CONST_SIZE_OR_ZERO = 10, + ARG_PTR_TO_CTX = 11, + ARG_PTR_TO_CTX_OR_NULL = 12, + ARG_ANYTHING = 13, + ARG_PTR_TO_SPIN_LOCK = 14, + ARG_PTR_TO_SOCK_COMMON = 15, + ARG_PTR_TO_INT = 16, + ARG_PTR_TO_LONG = 17, + ARG_PTR_TO_SOCKET = 18, + ARG_PTR_TO_SOCKET_OR_NULL = 19, + ARG_PTR_TO_BTF_ID = 20, + ARG_PTR_TO_ALLOC_MEM = 21, + ARG_PTR_TO_ALLOC_MEM_OR_NULL = 22, + ARG_CONST_ALLOC_SIZE_OR_ZERO = 23, + ARG_PTR_TO_BTF_ID_SOCK_COMMON = 24, + ARG_PTR_TO_PERCPU_BTF_ID = 25, + ARG_PTR_TO_FUNC = 26, + ARG_PTR_TO_STACK_OR_NULL = 27, + ARG_PTR_TO_CONST_STR = 28, + ARG_PTR_TO_TIMER = 29, + __BPF_ARG_TYPE_MAX = 30, +}; + +enum bpf_return_type { + RET_INTEGER = 0, + RET_VOID = 1, + RET_PTR_TO_MAP_VALUE = 2, + RET_PTR_TO_MAP_VALUE_OR_NULL = 3, + RET_PTR_TO_SOCKET_OR_NULL = 4, + RET_PTR_TO_TCP_SOCK_OR_NULL = 5, + RET_PTR_TO_SOCK_COMMON_OR_NULL = 6, + RET_PTR_TO_ALLOC_MEM_OR_NULL = 7, + RET_PTR_TO_BTF_ID_OR_NULL = 8, + RET_PTR_TO_MEM_OR_BTF_ID_OR_NULL = 9, + RET_PTR_TO_MEM_OR_BTF_ID = 10, + RET_PTR_TO_BTF_ID = 11, +}; + +struct bpf_func_proto { + u64 (*func)(u64, u64, u64, u64, u64); + bool gpl_only; + bool pkt_access; + enum bpf_return_type ret_type; + union { + struct { + enum bpf_arg_type arg1_type; + enum bpf_arg_type arg2_type; + enum bpf_arg_type arg3_type; + enum bpf_arg_type arg4_type; + enum bpf_arg_type arg5_type; + }; + enum bpf_arg_type arg_type[5]; + }; + union { + struct { + u32 *arg1_btf_id; + u32 *arg2_btf_id; + u32 *arg3_btf_id; + u32 *arg4_btf_id; + u32 *arg5_btf_id; + }; + u32 *arg_btf_id[5]; + }; + int *ret_btf_id; + bool (*allowed)(const struct bpf_prog *); +}; + +enum bpf_access_type { + BPF_READ = 1, + BPF_WRITE = 2, +}; + +struct bpf_verifier_log; + +struct bpf_insn_access_aux { + enum bpf_reg_type reg_type; + union { + int ctx_field_size; + struct { + struct btf *btf; + u32 btf_id; + }; + }; + struct bpf_verifier_log *log; +}; + +struct bpf_verifier_ops { + const struct bpf_func_proto * (*get_func_proto)(enum bpf_func_id, const struct bpf_prog *); + bool (*is_valid_access)(int, int, enum bpf_access_type, const struct bpf_prog *, struct bpf_insn_access_aux *); + int (*gen_prologue)(struct bpf_insn *, bool, const struct bpf_prog *); + int (*gen_ld_abs)(const struct bpf_insn *, struct bpf_insn *); + u32 (*convert_ctx_access)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + int (*btf_struct_access)(struct bpf_verifier_log *, const struct btf *, const struct btf_type *, int, int, enum bpf_access_type, u32 *); + bool (*check_kfunc_call)(u32, struct module *); +}; + +struct bpf_array_aux { + struct { + spinlock_t lock; + enum bpf_prog_type type; + bool jited; + } owner; + struct list_head poke_progs; + struct bpf_map *map; + struct mutex poke_mutex; + struct work_struct work; +}; + +struct bpf_array { + struct bpf_map map; + u32 elem_size; + u32 index_mask; + struct bpf_array_aux *aux; + union { + char value[0]; + void *ptrs[0]; + void *pptrs[0]; + }; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_event_entry { + struct perf_event *event; + struct file *perf_file; + struct file *map_file; + struct callback_head rcu; +}; + +typedef long unsigned int (*bpf_ctx_copy_t)(void *, const void *, long unsigned int, long unsigned int); + +struct bpf_trace_run_ctx { + struct bpf_run_ctx run_ctx; + u64 bpf_cookie; +}; + +typedef u32 (*bpf_prog_run_fn)(const struct bpf_prog *, const void *); + +typedef struct user_pt_regs bpf_user_pt_regs_t; + +struct bpf_perf_event_data { + bpf_user_pt_regs_t regs; + __u64 sample_period; + __u64 addr; +}; + +struct btf_id_set { + u32 cnt; + u32 ids[0]; +}; + +struct perf_event_query_bpf { + __u32 ids_len; + __u32 prog_cnt; + __u32 ids[0]; +}; + +struct bpf_perf_event_data_kern { + bpf_user_pt_regs_t *regs; + struct perf_sample_data *data; + struct perf_event *event; +}; + +struct bpf_local_storage_map_bucket { + struct hlist_head list; + raw_spinlock_t lock; +}; + +struct bpf_local_storage_data { + struct bpf_local_storage_map *smap; + u8 data[0]; +}; + +struct trace_event_raw_bpf_trace_printk { + struct trace_entry ent; + u32 __data_loc_bpf_string; + char __data[0]; +}; + +struct trace_event_data_offsets_bpf_trace_printk { + u32 bpf_string; +}; + +typedef void (*btf_trace_bpf_trace_printk)(void *, const char *); + +struct bpf_trace_module { + struct module *module; + struct list_head list; +}; + +typedef u64 (*btf_bpf_override_return)(struct pt_regs *, long unsigned int); + +typedef u64 (*btf_bpf_probe_read_user)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_user_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_compat)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_compat_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_write_user)(void *, const void *, u32); + +typedef u64 (*btf_bpf_trace_printk)(char *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_trace_vprintk)(char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_seq_printf)(struct seq_file *, char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_seq_write)(struct seq_file *, const void *, u32); + +typedef u64 (*btf_bpf_seq_printf_btf)(struct seq_file *, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_perf_event_read)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_perf_event_read_value)(struct bpf_map *, u64, struct bpf_perf_event_value *, u32); + +struct bpf_trace_sample_data { + struct perf_sample_data sds[3]; +}; + +typedef u64 (*btf_bpf_perf_event_output)(struct pt_regs *, struct bpf_map *, u64, void *, u64); + +struct bpf_nested_pt_regs { + struct pt_regs regs[3]; +}; + +typedef u64 (*btf_bpf_get_current_task)(); + +typedef u64 (*btf_bpf_get_current_task_btf)(); + +typedef u64 (*btf_bpf_task_pt_regs)(struct task_struct *); + +typedef u64 (*btf_bpf_current_task_under_cgroup)(struct bpf_map *, u32); + +struct send_signal_irq_work { + struct irq_work irq_work; + struct task_struct *task; + u32 sig; + enum pid_type type; +}; + +typedef u64 (*btf_bpf_send_signal)(u32); + +typedef u64 (*btf_bpf_send_signal_thread)(u32); + +typedef u64 (*btf_bpf_d_path)(struct path *, char *, u32); + +typedef u64 (*btf_bpf_snprintf_btf)(char *, u32, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_get_func_ip_tracing)(void *); + +typedef u64 (*btf_bpf_get_func_ip_kprobe)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_attach_cookie_trace)(void *); + +typedef u64 (*btf_bpf_get_attach_cookie_pe)(struct bpf_perf_event_data_kern *); + +typedef u64 (*btf_bpf_get_branch_snapshot)(void *, u32, u64); + +typedef u64 (*btf_bpf_perf_event_output_tp)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_stackid_tp)(void *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack_tp)(void *, void *, u32, u64); + +typedef u64 (*btf_bpf_perf_prog_read_value)(struct bpf_perf_event_data_kern *, struct bpf_perf_event_value *, u32); + +typedef u64 (*btf_bpf_read_branch_records)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +struct bpf_raw_tp_regs { + struct pt_regs regs[3]; +}; + +typedef u64 (*btf_bpf_perf_event_output_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_stackid_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack_raw_tp)(struct bpf_raw_tracepoint_args *, void *, u32, u64); + +struct kprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int ip; +}; + +struct kretprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int func; + long unsigned int ret_ip; +}; + +struct trace_kprobe { + struct dyn_event devent; + struct kretprobe rp; + long unsigned int *nhit; + const char *symbol; + struct trace_probe tp; +}; + +enum error_detector { + ERROR_DETECTOR_KFENCE = 0, + ERROR_DETECTOR_KASAN = 1, +}; + +struct trace_event_raw_error_report_template { + struct trace_entry ent; + enum error_detector error_detector; + long unsigned int id; + char __data[0]; +}; + +struct trace_event_data_offsets_error_report_template {}; + +typedef void (*btf_trace_error_report_end)(void *, enum error_detector, long unsigned int); + +struct trace_event_raw_cpu { + struct trace_entry ent; + u32 state; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_powernv_throttle { + struct trace_entry ent; + int chip_id; + u32 __data_loc_reason; + int pmax; + char __data[0]; +}; + +struct trace_event_raw_pstate_sample { + struct trace_entry ent; + u32 core_busy; + u32 scaled_busy; + u32 from; + u32 to; + u64 mperf; + u64 aperf; + u64 tsc; + u32 freq; + u32 io_boost; + char __data[0]; +}; + +struct trace_event_raw_cpu_frequency_limits { + struct trace_entry ent; + u32 min_freq; + u32 max_freq; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_start { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + u32 __data_loc_parent; + u32 __data_loc_pm_ops; + int event; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_end { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + int error; + char __data[0]; +}; + +struct trace_event_raw_suspend_resume { + struct trace_entry ent; + const char *action; + int val; + bool start; + char __data[0]; +}; + +struct trace_event_raw_wakeup_source { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + char __data[0]; +}; + +struct trace_event_raw_clock { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_power_domain { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_cpu_latency_qos_request { + struct trace_entry ent; + s32 value; + char __data[0]; +}; + +struct trace_event_raw_pm_qos_update { + struct trace_entry ent; + enum pm_qos_req_action action; + int prev_value; + int curr_value; + char __data[0]; +}; + +struct trace_event_raw_dev_pm_qos_request { + struct trace_entry ent; + u32 __data_loc_name; + enum dev_pm_qos_req_type type; + s32 new_value; + char __data[0]; +}; + +struct trace_event_data_offsets_cpu {}; + +struct trace_event_data_offsets_powernv_throttle { + u32 reason; +}; + +struct trace_event_data_offsets_pstate_sample {}; + +struct trace_event_data_offsets_cpu_frequency_limits {}; + +struct trace_event_data_offsets_device_pm_callback_start { + u32 device; + u32 driver; + u32 parent; + u32 pm_ops; +}; + +struct trace_event_data_offsets_device_pm_callback_end { + u32 device; + u32 driver; +}; + +struct trace_event_data_offsets_suspend_resume {}; + +struct trace_event_data_offsets_wakeup_source { + u32 name; +}; + +struct trace_event_data_offsets_clock { + u32 name; +}; + +struct trace_event_data_offsets_power_domain { + u32 name; +}; + +struct trace_event_data_offsets_cpu_latency_qos_request {}; + +struct trace_event_data_offsets_pm_qos_update {}; + +struct trace_event_data_offsets_dev_pm_qos_request { + u32 name; +}; + +typedef void (*btf_trace_cpu_idle)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_powernv_throttle)(void *, int, const char *, int); + +typedef void (*btf_trace_pstate_sample)(void *, u32, u32, u32, u32, u64, u64, u64, u32, u32); + +typedef void (*btf_trace_cpu_frequency)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_cpu_frequency_limits)(void *, struct cpufreq_policy *); + +typedef void (*btf_trace_device_pm_callback_start)(void *, struct device *, const char *, int); + +typedef void (*btf_trace_device_pm_callback_end)(void *, struct device *, int); + +typedef void (*btf_trace_suspend_resume)(void *, const char *, int, bool); + +typedef void (*btf_trace_wakeup_source_activate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_wakeup_source_deactivate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_clock_enable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_disable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_set_rate)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_power_domain_target)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_pm_qos_add_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_remove_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_target)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_pm_qos_update_flags)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_dev_pm_qos_add_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_update_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_remove_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +struct trace_event_raw_rpm_internal { + struct trace_entry ent; + u32 __data_loc_name; + int flags; + int usage_count; + int disable_depth; + int runtime_auto; + int request_pending; + int irq_safe; + int child_count; + char __data[0]; +}; + +struct trace_event_raw_rpm_return_int { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int ip; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_rpm_internal { + u32 name; +}; + +struct trace_event_data_offsets_rpm_return_int { + u32 name; +}; + +typedef void (*btf_trace_rpm_suspend)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_resume)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_idle)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_usage)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_return_int)(void *, struct device *, long unsigned int, int); + +struct trace_probe_log { + const char *subsystem; + const char **argv; + int argc; + int index; +}; + +enum uprobe_filter_ctx { + UPROBE_FILTER_REGISTER = 0, + UPROBE_FILTER_UNREGISTER = 1, + UPROBE_FILTER_MMAP = 2, +}; + +struct uprobe_consumer { + int (*handler)(struct uprobe_consumer *, struct pt_regs *); + int (*ret_handler)(struct uprobe_consumer *, long unsigned int, struct pt_regs *); + bool (*filter)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); + struct uprobe_consumer *next; +}; + +struct uprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int vaddr[0]; +}; + +struct trace_uprobe { + struct dyn_event devent; + struct uprobe_consumer consumer; + struct path path; + struct inode *inode; + char *filename; + long unsigned int offset; + long unsigned int ref_ctr_offset; + long unsigned int nhit; + struct trace_probe tp; +}; + +struct uprobe_dispatch_data { + struct trace_uprobe *tu; + long unsigned int bp_addr; +}; + +struct uprobe_cpu_buffer { + struct mutex mutex; + void *buf; +}; + +typedef bool (*filter_func_t)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); + +enum xdp_action { + XDP_ABORTED = 0, + XDP_DROP = 1, + XDP_PASS = 2, + XDP_TX = 3, + XDP_REDIRECT = 4, +}; + +struct rnd_state { + __u32 s1; + __u32 s2; + __u32 s3; + __u32 s4; +}; + +struct rhash_lock_head; + +struct bucket_table { + unsigned int size; + unsigned int nest; + u32 hash_rnd; + struct list_head walkers; + struct callback_head rcu; + struct bucket_table *future_tbl; + struct lockdep_map dep_map; + long: 64; + struct rhash_lock_head *buckets[0]; +}; + +typedef sockptr_t bpfptr_t; + +struct bpf_verifier_log { + u32 level; + char kbuf[1024]; + char *ubuf; + u32 len_used; + u32 len_total; +}; + +struct bpf_subprog_info { + u32 start; + u32 linfo_idx; + u16 stack_depth; + bool has_tail_call; + bool tail_call_reachable; + bool has_ld_abs; + bool is_async_cb; +}; + +struct bpf_id_pair { + u32 old; + u32 cur; +}; + +struct bpf_verifier_stack_elem; + +struct bpf_verifier_state; + +struct bpf_verifier_state_list; + +struct bpf_insn_aux_data; + +struct bpf_verifier_env { + u32 insn_idx; + u32 prev_insn_idx; + struct bpf_prog *prog; + const struct bpf_verifier_ops *ops; + struct bpf_verifier_stack_elem *head; + int stack_size; + bool strict_alignment; + bool test_state_freq; + struct bpf_verifier_state *cur_state; + struct bpf_verifier_state_list **explored_states; + struct bpf_verifier_state_list *free_list; + struct bpf_map *used_maps[64]; + struct btf_mod_pair used_btfs[64]; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 id_gen; + bool explore_alu_limits; + bool allow_ptr_leaks; + bool allow_uninit_stack; + bool allow_ptr_to_map_access; + bool bpf_capable; + bool bypass_spec_v1; + bool bypass_spec_v4; + bool seen_direct_write; + struct bpf_insn_aux_data *insn_aux_data; + const struct bpf_line_info *prev_linfo; + struct bpf_verifier_log log; + struct bpf_subprog_info subprog_info[257]; + struct bpf_id_pair idmap_scratch[75]; + struct { + int *insn_state; + int *insn_stack; + int cur_stack; + } cfg; + u32 pass_cnt; + u32 subprog_cnt; + u32 prev_insn_processed; + u32 insn_processed; + u32 prev_jmps_processed; + u32 jmps_processed; + u64 verification_time; + u32 max_states_per_insn; + u32 total_states; + u32 peak_states; + u32 longest_mark_read_walk; + bpfptr_t fd_array; +}; + +struct tnum { + u64 value; + u64 mask; +}; + +enum bpf_reg_liveness { + REG_LIVE_NONE = 0, + REG_LIVE_READ32 = 1, + REG_LIVE_READ64 = 2, + REG_LIVE_READ = 3, + REG_LIVE_WRITTEN = 4, + REG_LIVE_DONE = 8, +}; + +struct bpf_reg_state { + enum bpf_reg_type type; + s32 off; + union { + int range; + struct { + struct bpf_map *map_ptr; + u32 map_uid; + }; + struct { + struct btf *btf; + u32 btf_id; + }; + u32 mem_size; + struct { + long unsigned int raw1; + long unsigned int raw2; + } raw; + u32 subprogno; + }; + u32 id; + u32 ref_obj_id; + struct tnum var_off; + s64 smin_value; + s64 smax_value; + u64 umin_value; + u64 umax_value; + s32 s32_min_value; + s32 s32_max_value; + u32 u32_min_value; + u32 u32_max_value; + struct bpf_reg_state *parent; + u32 frameno; + s32 subreg_def; + enum bpf_reg_liveness live; + bool precise; +}; + +struct bpf_reference_state; + +struct bpf_stack_state; + +struct bpf_func_state { + struct bpf_reg_state regs[11]; + int callsite; + u32 frameno; + u32 subprogno; + u32 async_entry_cnt; + bool in_callback_fn; + bool in_async_callback_fn; + int acquired_refs; + struct bpf_reference_state *refs; + int allocated_stack; + struct bpf_stack_state *stack; +}; + +enum bpf_jit_poke_reason { + BPF_POKE_REASON_TAIL_CALL = 0, +}; + +enum bpf_text_poke_type { + BPF_MOD_CALL = 0, + BPF_MOD_JUMP = 1, +}; + +enum xdp_mem_type { + MEM_TYPE_PAGE_SHARED = 0, + MEM_TYPE_PAGE_ORDER0 = 1, + MEM_TYPE_PAGE_POOL = 2, + MEM_TYPE_XSK_BUFF_POOL = 3, + MEM_TYPE_MAX = 4, +}; + +struct xdp_cpumap_stats { + unsigned int redirect; + unsigned int pass; + unsigned int drop; +}; + +struct bpf_stack_state { + struct bpf_reg_state spilled_ptr; + u8 slot_type[8]; +}; + +struct bpf_reference_state { + int id; + int insn_idx; +}; + +struct bpf_idx_pair { + u32 prev_idx; + u32 idx; +}; + +struct bpf_verifier_state { + struct bpf_func_state *frame[8]; + struct bpf_verifier_state *parent; + u32 branches; + u32 insn_idx; + u32 curframe; + u32 active_spin_lock; + bool speculative; + u32 first_insn_idx; + u32 last_insn_idx; + struct bpf_idx_pair *jmp_history; + u32 jmp_history_cnt; +}; + +struct bpf_verifier_state_list { + struct bpf_verifier_state state; + struct bpf_verifier_state_list *next; + int miss_cnt; + int hit_cnt; +}; + +struct bpf_insn_aux_data { + union { + enum bpf_reg_type ptr_type; + long unsigned int map_ptr_state; + s32 call_imm; + u32 alu_limit; + struct { + u32 map_index; + u32 map_off; + }; + struct { + enum bpf_reg_type reg_type; + union { + struct { + struct btf *btf; + u32 btf_id; + }; + u32 mem_size; + }; + } btf_var; + }; + u64 map_key_state; + int ctx_field_size; + u32 seen; + bool sanitize_stack_spill; + bool zext_dst; + u8 alu_state; + unsigned int orig_idx; + bool prune_point; +}; + +struct bpf_prog_dummy { + struct bpf_prog prog; +}; + +typedef u64 (*btf_bpf_user_rnd_u32)(); + +typedef u64 (*btf_bpf_get_raw_cpu_id)(); + +struct _bpf_dtab_netdev { + struct net_device *dev; +}; + +struct rhash_lock_head {}; + +struct zero_copy_allocator; + +struct xdp_mem_allocator { + struct xdp_mem_info mem; + union { + void *allocator; + struct page_pool *page_pool; + struct zero_copy_allocator *zc_alloc; + }; + struct rhash_head node; + struct callback_head rcu; +}; + +struct trace_event_raw_xdp_exception { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_xdp_bulk_tx { + struct trace_entry ent; + int ifindex; + u32 act; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_xdp_redirect_template { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + int err; + int to_ifindex; + u32 map_id; + int map_index; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_kthread { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int sched; + unsigned int xdp_pass; + unsigned int xdp_drop; + unsigned int xdp_redirect; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_enqueue { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int to_cpu; + char __data[0]; +}; + +struct trace_event_raw_xdp_devmap_xmit { + struct trace_entry ent; + int from_ifindex; + u32 act; + int to_ifindex; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_mem_disconnect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + char __data[0]; +}; + +struct trace_event_raw_mem_connect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + const struct xdp_rxq_info *rxq; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_mem_return_failed { + struct trace_entry ent; + const struct page *page; + u32 mem_id; + u32 mem_type; + char __data[0]; +}; + +struct trace_event_data_offsets_xdp_exception {}; + +struct trace_event_data_offsets_xdp_bulk_tx {}; + +struct trace_event_data_offsets_xdp_redirect_template {}; + +struct trace_event_data_offsets_xdp_cpumap_kthread {}; + +struct trace_event_data_offsets_xdp_cpumap_enqueue {}; + +struct trace_event_data_offsets_xdp_devmap_xmit {}; + +struct trace_event_data_offsets_mem_disconnect {}; + +struct trace_event_data_offsets_mem_connect {}; + +struct trace_event_data_offsets_mem_return_failed {}; + +typedef void (*btf_trace_xdp_exception)(void *, const struct net_device *, const struct bpf_prog *, u32); + +typedef void (*btf_trace_xdp_bulk_tx)(void *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_xdp_redirect)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_cpumap_kthread)(void *, int, unsigned int, unsigned int, int, struct xdp_cpumap_stats *); + +typedef void (*btf_trace_xdp_cpumap_enqueue)(void *, int, unsigned int, unsigned int, int); + +typedef void (*btf_trace_xdp_devmap_xmit)(void *, const struct net_device *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_mem_disconnect)(void *, const struct xdp_mem_allocator *); + +typedef void (*btf_trace_mem_connect)(void *, const struct xdp_mem_allocator *, const struct xdp_rxq_info *); + +typedef void (*btf_trace_mem_return_failed)(void *, const struct xdp_mem_info *, const struct page *); + +enum bpf_cmd { + BPF_MAP_CREATE = 0, + BPF_MAP_LOOKUP_ELEM = 1, + BPF_MAP_UPDATE_ELEM = 2, + BPF_MAP_DELETE_ELEM = 3, + BPF_MAP_GET_NEXT_KEY = 4, + BPF_PROG_LOAD = 5, + BPF_OBJ_PIN = 6, + BPF_OBJ_GET = 7, + BPF_PROG_ATTACH = 8, + BPF_PROG_DETACH = 9, + BPF_PROG_TEST_RUN = 10, + BPF_PROG_RUN = 10, + BPF_PROG_GET_NEXT_ID = 11, + BPF_MAP_GET_NEXT_ID = 12, + BPF_PROG_GET_FD_BY_ID = 13, + BPF_MAP_GET_FD_BY_ID = 14, + BPF_OBJ_GET_INFO_BY_FD = 15, + BPF_PROG_QUERY = 16, + BPF_RAW_TRACEPOINT_OPEN = 17, + BPF_BTF_LOAD = 18, + BPF_BTF_GET_FD_BY_ID = 19, + BPF_TASK_FD_QUERY = 20, + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 21, + BPF_MAP_FREEZE = 22, + BPF_BTF_GET_NEXT_ID = 23, + BPF_MAP_LOOKUP_BATCH = 24, + BPF_MAP_LOOKUP_AND_DELETE_BATCH = 25, + BPF_MAP_UPDATE_BATCH = 26, + BPF_MAP_DELETE_BATCH = 27, + BPF_LINK_CREATE = 28, + BPF_LINK_UPDATE = 29, + BPF_LINK_GET_FD_BY_ID = 30, + BPF_LINK_GET_NEXT_ID = 31, + BPF_ENABLE_STATS = 32, + BPF_ITER_CREATE = 33, + BPF_LINK_DETACH = 34, + BPF_PROG_BIND_MAP = 35, +}; + +enum bpf_link_type { + BPF_LINK_TYPE_UNSPEC = 0, + BPF_LINK_TYPE_RAW_TRACEPOINT = 1, + BPF_LINK_TYPE_TRACING = 2, + BPF_LINK_TYPE_CGROUP = 3, + BPF_LINK_TYPE_ITER = 4, + BPF_LINK_TYPE_NETNS = 5, + BPF_LINK_TYPE_XDP = 6, + BPF_LINK_TYPE_PERF_EVENT = 7, + MAX_BPF_LINK_TYPE = 8, +}; + +enum { + BPF_ANY = 0, + BPF_NOEXIST = 1, + BPF_EXIST = 2, + BPF_F_LOCK = 4, +}; + +enum { + BPF_F_NO_PREALLOC = 1, + BPF_F_NO_COMMON_LRU = 2, + BPF_F_NUMA_NODE = 4, + BPF_F_RDONLY = 8, + BPF_F_WRONLY = 16, + BPF_F_STACK_BUILD_ID = 32, + BPF_F_ZERO_SEED = 64, + BPF_F_RDONLY_PROG = 128, + BPF_F_WRONLY_PROG = 256, + BPF_F_CLONE = 512, + BPF_F_MMAPABLE = 1024, + BPF_F_PRESERVE_ELEMS = 2048, + BPF_F_INNER_MAP = 4096, +}; + +enum bpf_stats_type { + BPF_STATS_RUN_TIME = 0, +}; + +struct bpf_prog_info { + __u32 type; + __u32 id; + __u8 tag[8]; + __u32 jited_prog_len; + __u32 xlated_prog_len; + __u64 jited_prog_insns; + __u64 xlated_prog_insns; + __u64 load_time; + __u32 created_by_uid; + __u32 nr_map_ids; + __u64 map_ids; + char name[16]; + __u32 ifindex; + __u32 gpl_compatible: 1; + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; + __u32 nr_jited_func_lens; + __u64 jited_ksyms; + __u64 jited_func_lens; + __u32 btf_id; + __u32 func_info_rec_size; + __u64 func_info; + __u32 nr_func_info; + __u32 nr_line_info; + __u64 line_info; + __u64 jited_line_info; + __u32 nr_jited_line_info; + __u32 line_info_rec_size; + __u32 jited_line_info_rec_size; + __u32 nr_prog_tags; + __u64 prog_tags; + __u64 run_time_ns; + __u64 run_cnt; + __u64 recursion_misses; + __u32 verified_insns; +}; + +struct bpf_map_info { + __u32 type; + __u32 id; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + char name[16]; + __u32 ifindex; + __u32 btf_vmlinux_value_type_id; + __u64 netns_dev; + __u64 netns_ino; + __u32 btf_id; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u64 map_extra; +}; + +struct bpf_btf_info { + __u64 btf; + __u32 btf_size; + __u32 id; + __u64 name; + __u32 name_len; + __u32 kernel_btf; +}; + +struct bpf_link_info { + __u32 type; + __u32 id; + __u32 prog_id; + union { + struct { + __u64 tp_name; + __u32 tp_name_len; + } raw_tracepoint; + struct { + __u32 attach_type; + __u32 target_obj_id; + __u32 target_btf_id; + } tracing; + struct { + __u64 cgroup_id; + __u32 attach_type; + } cgroup; + struct { + __u64 target_name; + __u32 target_name_len; + union { + struct { + __u32 map_id; + } map; + }; + } iter; + struct { + __u32 netns_ino; + __u32 attach_type; + } netns; + struct { + __u32 ifindex; + } xdp; + }; +}; + +struct bpf_spin_lock { + __u32 val; +}; + +struct bpf_timer { + long: 64; + long: 64;}; + +struct bpf_attach_target_info { + struct btf_func_model fmodel; + long int tgt_addr; + const char *tgt_name; + const struct btf_type *tgt_type; +}; + +struct bpf_link_ops; + +struct bpf_link { + atomic64_t refcnt; + u32 id; + enum bpf_link_type type; + const struct bpf_link_ops *ops; + struct bpf_prog *prog; + struct work_struct work; +}; + +struct bpf_link_ops { + void (*release)(struct bpf_link *); + void (*dealloc)(struct bpf_link *); + int (*detach)(struct bpf_link *); + int (*update_prog)(struct bpf_link *, struct bpf_prog *, struct bpf_prog *); + void (*show_fdinfo)(const struct bpf_link *, struct seq_file *); + int (*fill_link_info)(const struct bpf_link *, struct bpf_link_info *); +}; + +struct bpf_link_primer { + struct bpf_link *link; + struct file *file; + int fd; + u32 id; +}; + +enum perf_bpf_event_type { + PERF_BPF_EVENT_UNKNOWN = 0, + PERF_BPF_EVENT_PROG_LOAD = 1, + PERF_BPF_EVENT_PROG_UNLOAD = 2, + PERF_BPF_EVENT_MAX = 3, +}; + +enum bpf_audit { + BPF_AUDIT_LOAD = 0, + BPF_AUDIT_UNLOAD = 1, + BPF_AUDIT_MAX = 2, +}; + +struct bpf_prog_kstats { + u64 nsecs; + u64 cnt; + u64 misses; +}; + +struct bpf_tracing_link { + struct bpf_link link; + enum bpf_attach_type attach_type; + struct bpf_trampoline *trampoline; + struct bpf_prog *tgt_prog; +}; + +struct bpf_raw_tp_link { + struct bpf_link link; + struct bpf_raw_event_map *btp; +}; + +struct bpf_perf_link { + struct bpf_link link; + struct file *perf_file; +}; + +typedef u64 (*btf_bpf_sys_bpf)(int, void *, u32); + +typedef u64 (*btf_bpf_sys_close)(u32); + +typedef u64 (*btf_bpf_kallsyms_lookup_name)(const char *, int, int, u64 *); + +enum { + BTF_KIND_UNKN = 0, + BTF_KIND_INT = 1, + BTF_KIND_PTR = 2, + BTF_KIND_ARRAY = 3, + BTF_KIND_STRUCT = 4, + BTF_KIND_UNION = 5, + BTF_KIND_ENUM = 6, + BTF_KIND_FWD = 7, + BTF_KIND_TYPEDEF = 8, + BTF_KIND_VOLATILE = 9, + BTF_KIND_CONST = 10, + BTF_KIND_RESTRICT = 11, + BTF_KIND_FUNC = 12, + BTF_KIND_FUNC_PROTO = 13, + BTF_KIND_VAR = 14, + BTF_KIND_DATASEC = 15, + BTF_KIND_FLOAT = 16, + BTF_KIND_DECL_TAG = 17, + NR_BTF_KINDS = 18, + BTF_KIND_MAX = 17, +}; + +struct btf_member { + __u32 name_off; + __u32 type; + __u32 offset; +}; + +struct btf_param { + __u32 name_off; + __u32 type; +}; + +enum btf_func_linkage { + BTF_FUNC_STATIC = 0, + BTF_FUNC_GLOBAL = 1, + BTF_FUNC_EXTERN = 2, +}; + +struct btf_var_secinfo { + __u32 type; + __u32 offset; + __u32 size; +}; + +enum sk_action { + SK_DROP = 0, + SK_PASS = 1, +}; + +struct bpf_kfunc_desc { + struct btf_func_model func_model; + u32 func_id; + s32 imm; + u16 offset; +}; + +struct bpf_kfunc_desc_tab { + struct bpf_kfunc_desc descs[256]; + u32 nr_descs; +}; + +struct bpf_kfunc_btf { + struct btf *btf; + struct module *module; + u16 offset; +}; + +struct bpf_kfunc_btf_tab { + struct bpf_kfunc_btf descs[256]; + u32 nr_descs; +}; + +struct bpf_struct_ops { + const struct bpf_verifier_ops *verifier_ops; + int (*init)(struct btf *); + int (*check_member)(const struct btf_type *, const struct btf_member *); + int (*init_member)(const struct btf_type *, const struct btf_member *, void *, const void *); + int (*reg)(void *); + void (*unreg)(void *); + const struct btf_type *type; + const struct btf_type *value_type; + const char *name; + struct btf_func_model func_models[64]; + u32 type_id; + u32 value_id; +}; + +typedef u32 (*bpf_convert_ctx_access_t)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + +enum bpf_stack_slot_type { + STACK_INVALID = 0, + STACK_SPILL = 1, + STACK_MISC = 2, + STACK_ZERO = 3, +}; + +struct bpf_verifier_stack_elem { + struct bpf_verifier_state st; + int insn_idx; + int prev_insn_idx; + struct bpf_verifier_stack_elem *next; + u32 log_pos; +}; + +enum { + BTF_SOCK_TYPE_INET = 0, + BTF_SOCK_TYPE_INET_CONN = 1, + BTF_SOCK_TYPE_INET_REQ = 2, + BTF_SOCK_TYPE_INET_TW = 3, + BTF_SOCK_TYPE_REQ = 4, + BTF_SOCK_TYPE_SOCK = 5, + BTF_SOCK_TYPE_SOCK_COMMON = 6, + BTF_SOCK_TYPE_TCP = 7, + BTF_SOCK_TYPE_TCP_REQ = 8, + BTF_SOCK_TYPE_TCP_TW = 9, + BTF_SOCK_TYPE_TCP6 = 10, + BTF_SOCK_TYPE_UDP = 11, + BTF_SOCK_TYPE_UDP6 = 12, + BTF_SOCK_TYPE_UNIX = 13, + MAX_BTF_SOCK_TYPE = 14, +}; + +typedef void (*bpf_insn_print_t)(void *, const char *, ...); + +typedef const char * (*bpf_insn_revmap_call_t)(void *, const struct bpf_insn *); + +typedef const char * (*bpf_insn_print_imm_t)(void *, const struct bpf_insn *, __u64); + +struct bpf_insn_cbs { + bpf_insn_print_t cb_print; + bpf_insn_revmap_call_t cb_call; + bpf_insn_print_imm_t cb_imm; + void *private_data; +}; + +struct bpf_call_arg_meta { + struct bpf_map *map_ptr; + bool raw_mode; + bool pkt_access; + int regno; + int access_size; + int mem_size; + u64 msize_max_value; + int ref_obj_id; + int map_uid; + int func_id; + struct btf *btf; + u32 btf_id; + struct btf *ret_btf; + u32 ret_btf_id; + u32 subprogno; +}; + +enum reg_arg_type { + SRC_OP = 0, + DST_OP = 1, + DST_OP_NO_MARK = 2, +}; + +enum stack_access_src { + ACCESS_DIRECT = 1, + ACCESS_HELPER = 2, +}; + +struct bpf_reg_types { + const enum bpf_reg_type types[10]; + u32 *btf_id; +}; + +enum { + AT_PKT_END = 4294967295, + BEYOND_PKT_END = 4294967294, +}; + +typedef int (*set_callee_state_fn)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *, int); + +enum { + REASON_BOUNDS = 4294967295, + REASON_TYPE = 4294967294, + REASON_PATHS = 4294967293, + REASON_LIMIT = 4294967292, + REASON_STACK = 4294967291, +}; + +struct bpf_sanitize_info { + struct bpf_insn_aux_data aux; + bool mask_to_left; +}; + +enum { + DISCOVERED = 16, + EXPLORED = 32, + FALLTHROUGH = 1, + BRANCH = 2, +}; + +enum { + DONE_EXPLORING = 0, + KEEP_EXPLORING = 1, +}; + +struct tree_descr { + const char *name; + const struct file_operations *ops; + int mode; +}; + +struct bpf_preload_info { + char link_name[16]; + int link_id; +}; + +struct bpf_preload_ops { + struct umd_info info; + int (*preload)(struct bpf_preload_info *); + int (*finish)(); + struct module *owner; +}; + +enum bpf_type { + BPF_TYPE_UNSPEC = 0, + BPF_TYPE_PROG = 1, + BPF_TYPE_MAP = 2, + BPF_TYPE_LINK = 3, +}; + +struct map_iter { + void *key; + bool done; +}; + +enum { + OPT_MODE = 0, +}; + +struct bpf_mount_opts { + umode_t mode; +}; + +struct bpf_pidns_info { + __u32 pid; + __u32 tgid; +}; + +struct bpf_cg_run_ctx { + struct bpf_run_ctx run_ctx; + const struct bpf_prog_array_item *prog_item; +}; + +typedef u64 (*btf_bpf_map_lookup_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_update_elem)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_map_delete_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_push_elem)(struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_map_pop_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_peek_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_get_smp_processor_id)(); + +typedef u64 (*btf_bpf_get_numa_node_id)(); + +typedef u64 (*btf_bpf_ktime_get_ns)(); + +typedef u64 (*btf_bpf_ktime_get_boot_ns)(); + +typedef u64 (*btf_bpf_ktime_get_coarse_ns)(); + +typedef u64 (*btf_bpf_get_current_pid_tgid)(); + +typedef u64 (*btf_bpf_get_current_uid_gid)(); + +typedef u64 (*btf_bpf_get_current_comm)(char *, u32); + +typedef u64 (*btf_bpf_spin_lock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_spin_unlock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_jiffies64)(); + +typedef u64 (*btf_bpf_get_current_cgroup_id)(); + +typedef u64 (*btf_bpf_get_current_ancestor_cgroup_id)(int); + +typedef u64 (*btf_bpf_get_local_storage)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_strtol)(const char *, size_t, u64, long int *); + +typedef u64 (*btf_bpf_strtoul)(const char *, size_t, u64, long unsigned int *); + +typedef u64 (*btf_bpf_get_ns_current_pid_tgid)(u64, u64, struct bpf_pidns_info *, u32); + +typedef u64 (*btf_bpf_event_output_data)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_copy_from_user)(void *, u32, const void *); + +typedef u64 (*btf_bpf_per_cpu_ptr)(const void *, u32); + +typedef u64 (*btf_bpf_this_cpu_ptr)(const void *); + +struct bpf_bprintf_buffers { + char tmp_bufs[1536]; +}; + +typedef u64 (*btf_bpf_snprintf)(char *, u32, char *, const void *, u32); + +struct bpf_hrtimer { + struct hrtimer timer; + struct bpf_map *map; + struct bpf_prog *prog; + void *callback_fn; + void *value; +}; + +struct bpf_timer_kern { + struct bpf_hrtimer *timer; + struct bpf_spin_lock lock; +}; + +typedef u64 (*btf_bpf_timer_init)(struct bpf_timer_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_timer_set_callback)(struct bpf_timer_kern *, void *, struct bpf_prog_aux *); + +typedef u64 (*btf_bpf_timer_start)(struct bpf_timer_kern *, u64, u64); + +typedef u64 (*btf_bpf_timer_cancel)(struct bpf_timer_kern *); + +union bpf_iter_link_info { + struct { + __u32 map_fd; + } map; +}; + +typedef int (*bpf_iter_attach_target_t)(struct bpf_prog *, union bpf_iter_link_info *, struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_detach_target_t)(struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_show_fdinfo_t)(const struct bpf_iter_aux_info *, struct seq_file *); + +typedef int (*bpf_iter_fill_link_info_t)(const struct bpf_iter_aux_info *, struct bpf_link_info *); + +typedef const struct bpf_func_proto * (*bpf_iter_get_func_proto_t)(enum bpf_func_id, const struct bpf_prog *); + +enum bpf_iter_feature { + BPF_ITER_RESCHED = 1, +}; + +struct bpf_iter_reg { + const char *target; + bpf_iter_attach_target_t attach_target; + bpf_iter_detach_target_t detach_target; + bpf_iter_show_fdinfo_t show_fdinfo; + bpf_iter_fill_link_info_t fill_link_info; + bpf_iter_get_func_proto_t get_func_proto; + u32 ctx_arg_info_size; + u32 feature; + struct bpf_ctx_arg_aux ctx_arg_info[2]; + const struct bpf_iter_seq_info *seq_info; +}; + +struct bpf_iter_meta { + union { + struct seq_file *seq; + }; + u64 session_id; + u64 seq_num; +}; + +struct bpf_iter_target_info { + struct list_head list; + const struct bpf_iter_reg *reg_info; + u32 btf_id; +}; + +struct bpf_iter_link { + struct bpf_link link; + struct bpf_iter_aux_info aux; + struct bpf_iter_target_info *tinfo; +}; + +struct bpf_iter_priv_data { + struct bpf_iter_target_info *tinfo; + const struct bpf_iter_seq_info *seq_info; + struct bpf_prog *prog; + u64 session_id; + u64 seq_num; + bool done_stop; + long: 56; + u8 target_private[0]; +}; + +typedef u64 (*btf_bpf_for_each_map_elem)(struct bpf_map *, void *, void *, u64); + +struct bpf_iter_seq_map_info { + u32 map_id; +}; + +struct bpf_iter__bpf_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; +}; + +struct bpf_iter_seq_task_common { + struct pid_namespace *ns; +}; + +struct bpf_iter_seq_task_info { + struct bpf_iter_seq_task_common common; + u32 tid; +}; + +struct bpf_iter__task { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; +}; + +struct bpf_iter_seq_task_file_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + u32 tid; + u32 fd; +}; + +struct bpf_iter__task_file { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + u32 fd; + union { + struct file *file; + }; +}; + +struct bpf_iter_seq_task_vma_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + struct vm_area_struct *vma; + u32 tid; + long unsigned int prev_vm_start; + long unsigned int prev_vm_end; +}; + +enum bpf_task_vma_iter_find_op { + task_vma_iter_first_vma = 0, + task_vma_iter_next_vma = 1, + task_vma_iter_find_vma = 2, +}; + +struct bpf_iter__task_vma { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + union { + struct vm_area_struct *vma; + }; +}; + +struct bpf_iter_seq_prog_info { + u32 prog_id; +}; + +struct bpf_iter__bpf_prog { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_prog *prog; + }; +}; + +struct bpf_iter__bpf_map_elem { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + void *value; + }; +}; + +struct pcpu_freelist_node; + +struct pcpu_freelist_head { + struct pcpu_freelist_node *first; + raw_spinlock_t lock; +}; + +struct pcpu_freelist_node { + struct pcpu_freelist_node *next; +}; + +struct pcpu_freelist { + struct pcpu_freelist_head *freelist; + struct pcpu_freelist_head extralist; +}; + +struct bpf_lru_node { + struct list_head list; + u16 cpu; + u8 type; + u8 ref; +}; + +struct bpf_lru_list { + struct list_head lists[3]; + unsigned int counts[2]; + struct list_head *next_inactive_rotation; + raw_spinlock_t lock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_lru_locallist { + struct list_head lists[2]; + u16 next_steal; + raw_spinlock_t lock; +}; + +struct bpf_common_lru { + struct bpf_lru_list lru_list; + struct bpf_lru_locallist *local_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef bool (*del_from_htab_func)(void *, struct bpf_lru_node *); + +struct bpf_lru { + union { + struct bpf_common_lru common_lru; + struct bpf_lru_list *percpu_lru; + }; + del_from_htab_func del_from_htab; + void *del_arg; + unsigned int hash_offset; + unsigned int nr_scans; + bool percpu; + long: 56; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bucket { + struct hlist_nulls_head head; + union { + raw_spinlock_t raw_lock; + spinlock_t lock; + }; +}; + +struct htab_elem; + +struct bpf_htab { + struct bpf_map map; + struct bucket *buckets; + void *elems; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct pcpu_freelist freelist; + struct bpf_lru lru; + }; + struct htab_elem **extra_elems; + atomic_t count; + u32 n_buckets; + u32 elem_size; + u32 hashrnd; + struct lock_class_key lockdep_key; + int *map_locked[8]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct htab_elem { + union { + struct hlist_nulls_node hash_node; + struct { + void *padding; + union { + struct bpf_htab *htab; + struct pcpu_freelist_node fnode; + struct htab_elem *batch_flink; + }; + }; + }; + union { + struct callback_head rcu; + struct bpf_lru_node lru_node; + }; + u32 hash; + int: 32; + char key[0]; +}; + +struct bpf_iter_seq_hash_map_info { + struct bpf_map *map; + struct bpf_htab *htab; + void *percpu_value_buf; + u32 bucket_id; + u32 skip_elems; +}; + +struct bpf_iter_seq_array_map_info { + struct bpf_map *map; + void *percpu_value_buf; + u32 index; +}; + +struct prog_poke_elem { + struct list_head list; + struct bpf_prog_aux *aux; +}; + +struct task_struct___2; + +enum bpf_lru_list_type { + BPF_LRU_LIST_T_ACTIVE = 0, + BPF_LRU_LIST_T_INACTIVE = 1, + BPF_LRU_LIST_T_FREE = 2, + BPF_LRU_LOCAL_LIST_T_FREE = 3, + BPF_LRU_LOCAL_LIST_T_PENDING = 4, +}; + +struct bpf_lpm_trie_key { + __u32 prefixlen; + __u8 data[0]; +}; + +struct lpm_trie_node { + struct callback_head rcu; + struct lpm_trie_node *child[2]; + u32 prefixlen; + u32 flags; + u8 data[0]; +}; + +struct lpm_trie { + struct bpf_map map; + struct lpm_trie_node *root; + size_t n_entries; + size_t max_prefixlen; + size_t data_size; + spinlock_t lock; + long: 32; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_bloom_filter { + struct bpf_map map; + u32 bitset_mask; + u32 hash_seed; + u32 aligned_u32_count; + u32 nr_hash_funcs; + long unsigned int bitset[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_cgroup_storage_map { + struct bpf_map map; + spinlock_t lock; + struct rb_root root; + struct list_head list; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_queue_stack { + struct bpf_map map; + raw_spinlock_t lock; + u32 head; + u32 tail; + u32 size; + char elements[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum { + BPF_RB_NO_WAKEUP = 1, + BPF_RB_FORCE_WAKEUP = 2, +}; + +enum { + BPF_RB_AVAIL_DATA = 0, + BPF_RB_RING_SIZE = 1, + BPF_RB_CONS_POS = 2, + BPF_RB_PROD_POS = 3, +}; + +enum { + BPF_RINGBUF_BUSY_BIT = 2147483648, + BPF_RINGBUF_DISCARD_BIT = 1073741824, + BPF_RINGBUF_HDR_SZ = 8, +}; + +struct bpf_ringbuf { + wait_queue_head_t waitq; + struct irq_work work; + u64 mask; + struct page **pages; + int nr_pages; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t spinlock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int consumer_pos; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int producer_pos; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + char data[0]; +}; + +struct bpf_ringbuf_map { + struct bpf_map map; + struct bpf_ringbuf *rb; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_ringbuf_hdr { + u32 len; + u32 pg_off; +}; + +typedef u64 (*btf_bpf_ringbuf_reserve)(struct bpf_map *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_submit)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_discard)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_output)(struct bpf_map *, void *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_query)(struct bpf_map *, u64); + +struct bpf_local_storage_elem { + struct hlist_node map_node; + struct hlist_node snode; + struct bpf_local_storage *local_storage; + struct callback_head rcu; + long: 64; + struct bpf_local_storage_data sdata; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_local_storage_cache { + spinlock_t idx_lock; + u64 idx_usage_counts[16]; +}; + +enum { + BPF_LOCAL_STORAGE_GET_F_CREATE = 1, + BPF_SK_STORAGE_GET_F_CREATE = 1, +}; + +typedef u64 (*btf_bpf_task_storage_get)(struct bpf_map *, struct task_struct *, void *, u64); + +typedef u64 (*btf_bpf_task_storage_delete)(struct bpf_map *, struct task_struct *); + +struct lsm_blob_sizes { + int lbs_cred; + int lbs_file; + int lbs_inode; + int lbs_superblock; + int lbs_ipc; + int lbs_msg_msg; + int lbs_task; +}; + +struct bpf_storage_blob { + struct bpf_local_storage *storage; +}; + +typedef u64 (*btf_bpf_inode_storage_get)(struct bpf_map *, struct inode *, void *, u64); + +typedef u64 (*btf_bpf_inode_storage_delete)(struct bpf_map *, struct inode *); + +struct bpf_tramp_progs { + struct bpf_prog *progs[38]; + int nr_progs; +}; + +struct btf_enum { + __u32 name_off; + __s32 val; +}; + +struct btf_array { + __u32 type; + __u32 index_type; + __u32 nelems; +}; + +enum { + BTF_VAR_STATIC = 0, + BTF_VAR_GLOBAL_ALLOCATED = 1, + BTF_VAR_GLOBAL_EXTERN = 2, +}; + +struct btf_var { + __u32 linkage; +}; + +struct btf_decl_tag { + __s32 component_idx; +}; + +struct bpf_flow_keys { + __u16 nhoff; + __u16 thoff; + __u16 addr_proto; + __u8 is_frag; + __u8 is_first_frag; + __u8 is_encap; + __u8 ip_proto; + __be16 n_proto; + __be16 sport; + __be16 dport; + union { + struct { + __be32 ipv4_src; + __be32 ipv4_dst; + }; + struct { + __u32 ipv6_src[4]; + __u32 ipv6_dst[4]; + }; + }; + __u32 flags; + __be32 flow_label; +}; + +struct bpf_sock { + __u32 bound_dev_if; + __u32 family; + __u32 type; + __u32 protocol; + __u32 mark; + __u32 priority; + __u32 src_ip4; + __u32 src_ip6[4]; + __u32 src_port; + __u32 dst_port; + __u32 dst_ip4; + __u32 dst_ip6[4]; + __u32 state; + __s32 rx_queue_mapping; +}; + +struct __sk_buff { + __u32 len; + __u32 pkt_type; + __u32 mark; + __u32 queue_mapping; + __u32 protocol; + __u32 vlan_present; + __u32 vlan_tci; + __u32 vlan_proto; + __u32 priority; + __u32 ingress_ifindex; + __u32 ifindex; + __u32 tc_index; + __u32 cb[5]; + __u32 hash; + __u32 tc_classid; + __u32 data; + __u32 data_end; + __u32 napi_id; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 data_meta; + union { + struct bpf_flow_keys *flow_keys; + }; + __u64 tstamp; + __u32 wire_len; + __u32 gso_segs; + union { + struct bpf_sock *sk; + }; + __u32 gso_size; + __u64 hwtstamp; +}; + +struct xdp_md { + __u32 data; + __u32 data_end; + __u32 data_meta; + __u32 ingress_ifindex; + __u32 rx_queue_index; + __u32 egress_ifindex; +}; + +struct sk_msg_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 size; + union { + struct bpf_sock *sk; + }; +}; + +struct sk_reuseport_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 len; + __u32 eth_protocol; + __u32 ip_protocol; + __u32 bind_inany; + __u32 hash; + union { + struct bpf_sock *sk; + }; + union { + struct bpf_sock *migrating_sk; + }; +}; + +struct bpf_sock_addr { + __u32 user_family; + __u32 user_ip4; + __u32 user_ip6[4]; + __u32 user_port; + __u32 family; + __u32 type; + __u32 protocol; + __u32 msg_src_ip4; + __u32 msg_src_ip6[4]; + union { + struct bpf_sock *sk; + }; +}; + +struct bpf_sock_ops { + __u32 op; + union { + __u32 args[4]; + __u32 reply; + __u32 replylong[4]; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 is_fullsock; + __u32 snd_cwnd; + __u32 srtt_us; + __u32 bpf_sock_ops_cb_flags; + __u32 state; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u32 sk_txhash; + __u64 bytes_received; + __u64 bytes_acked; + union { + struct bpf_sock *sk; + }; + union { + void *skb_data; + }; + union { + void *skb_data_end; + }; + __u32 skb_len; + __u32 skb_tcp_flags; +}; + +struct bpf_cgroup_dev_ctx { + __u32 access_type; + __u32 major; + __u32 minor; +}; + +struct bpf_sysctl { + __u32 write; + __u32 file_pos; +}; + +struct bpf_sockopt { + union { + struct bpf_sock *sk; + }; + union { + void *optval; + }; + union { + void *optval_end; + }; + __s32 level; + __s32 optname; + __s32 optlen; + __s32 retval; +}; + +struct bpf_sk_lookup { + union { + union { + struct bpf_sock *sk; + }; + __u64 cookie; + }; + __u32 family; + __u32 protocol; + __u32 remote_ip4; + __u32 remote_ip6[4]; + __u32 remote_port; + __u32 local_ip4; + __u32 local_ip6[4]; + __u32 local_port; +}; + +struct sk_reuseport_kern { + struct sk_buff *skb; + struct sock *sk; + struct sock *selected_sk; + struct sock *migrating_sk; + void *data_end; + u32 hash; + u32 reuseport_id; + bool bind_inany; +}; + +struct kfunc_btf_id_set { + struct list_head list; + struct btf_id_set *set; + struct module *owner; +}; + +struct kfunc_btf_id_list { + struct list_head list; + struct mutex mutex; +}; + +struct bpf_flow_dissector { + struct bpf_flow_keys *flow_keys; + const struct sk_buff *skb; + const void *data; + const void *data_end; +}; + +struct inet_listen_hashbucket { + spinlock_t lock; + unsigned int count; + union { + struct hlist_head head; + struct hlist_nulls_head nulls_head; + }; +}; + +struct inet_ehash_bucket; + +struct inet_bind_hashbucket; + +struct inet_hashinfo { + struct inet_ehash_bucket *ehash; + spinlock_t *ehash_locks; + unsigned int ehash_mask; + unsigned int ehash_locks_mask; + struct kmem_cache *bind_bucket_cachep; + struct inet_bind_hashbucket *bhash; + unsigned int bhash_size; + unsigned int lhash2_mask; + struct inet_listen_hashbucket *lhash2; + long: 64; + struct inet_listen_hashbucket listening_hash[32]; +}; + +struct ip_ra_chain { + struct ip_ra_chain *next; + struct sock *sk; + union { + void (*destructor)(struct sock *); + struct sock *saved_sk; + }; + struct callback_head rcu; +}; + +struct fib_table { + struct hlist_node tb_hlist; + u32 tb_id; + int tb_num_default; + struct callback_head rcu; + long unsigned int *tb_data; + long unsigned int __data[0]; +}; + +struct inet_peer_base { + struct rb_root rb_root; + seqlock_t lock; + int total; +}; + +struct tcp_fastopen_context { + siphash_key_t key[2]; + int num; + struct callback_head rcu; +}; + +struct bpf_sock_addr_kern { + struct sock *sk; + struct sockaddr *uaddr; + u64 tmp_reg; + void *t_ctx; +}; + +struct bpf_sock_ops_kern { + struct sock *sk; + union { + u32 args[4]; + u32 reply; + u32 replylong[4]; + }; + struct sk_buff *syn_skb; + struct sk_buff *skb; + void *skb_data_end; + u8 op; + u8 is_fullsock; + u8 remaining_opt_len; + u64 temp; +}; + +struct bpf_sysctl_kern { + struct ctl_table_header *head; + struct ctl_table *table; + void *cur_val; + size_t cur_len; + void *new_val; + size_t new_len; + int new_updated; + int write; + loff_t *ppos; + u64 tmp_reg; +}; + +struct bpf_sockopt_kern { + struct sock *sk; + u8 *optval; + u8 *optval_end; + s32 level; + s32 optname; + s32 optlen; + s32 retval; +}; + +struct bpf_sk_lookup_kern { + u16 family; + u16 protocol; + __be16 sport; + u16 dport; + struct { + __be32 saddr; + __be32 daddr; + } v4; + struct { + const struct in6_addr *saddr; + const struct in6_addr *daddr; + } v6; + struct sock *selected_sk; + bool no_reuseport; +}; + +struct lwtunnel_state { + __u16 type; + __u16 flags; + __u16 headroom; + atomic_t refcnt; + int (*orig_output)(struct net *, struct sock *, struct sk_buff *); + int (*orig_input)(struct sk_buff *); + struct callback_head rcu; + __u8 data[0]; +}; + +struct sock_reuseport { + struct callback_head rcu; + u16 max_socks; + u16 num_socks; + u16 num_closed_socks; + unsigned int synq_overflow_ts; + unsigned int reuseport_id; + unsigned int bind_inany: 1; + unsigned int has_conns: 1; + struct bpf_prog *prog; + struct sock *socks[0]; +}; + +struct sk_psock_progs { + struct bpf_prog *msg_parser; + struct bpf_prog *stream_parser; + struct bpf_prog *stream_verdict; + struct bpf_prog *skb_verdict; +}; + +struct strp_stats { + long long unsigned int msgs; + long long unsigned int bytes; + unsigned int mem_fail; + unsigned int need_more_hdr; + unsigned int msg_too_big; + unsigned int msg_timeouts; + unsigned int bad_hdr_len; +}; + +struct strparser; + +struct strp_callbacks { + int (*parse_msg)(struct strparser *, struct sk_buff *); + void (*rcv_msg)(struct strparser *, struct sk_buff *); + int (*read_sock_done)(struct strparser *, int); + void (*abort_parser)(struct strparser *, int); + void (*lock)(struct strparser *); + void (*unlock)(struct strparser *); +}; + +struct strparser { + struct sock *sk; + u32 stopped: 1; + u32 paused: 1; + u32 aborted: 1; + u32 interrupted: 1; + u32 unrecov_intr: 1; + struct sk_buff **skb_nextp; + struct sk_buff *skb_head; + unsigned int need_bytes; + struct delayed_work msg_timer_work; + struct work_struct work; + struct strp_stats stats; + struct strp_callbacks cb; +}; + +struct sk_psock_work_state { + struct sk_buff *skb; + u32 len; + u32 off; +}; + +struct sk_msg; + +struct sk_psock { + struct sock *sk; + struct sock *sk_redir; + u32 apply_bytes; + u32 cork_bytes; + u32 eval; + struct sk_msg *cork; + struct sk_psock_progs progs; + struct strparser strp; + struct sk_buff_head ingress_skb; + struct list_head ingress_msg; + spinlock_t ingress_lock; + long unsigned int state; + struct list_head link; + spinlock_t link_lock; + refcount_t refcnt; + void (*saved_unhash)(struct sock *); + void (*saved_close)(struct sock *, long int); + void (*saved_write_space)(struct sock *); + void (*saved_data_ready)(struct sock *); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + struct proto *sk_proto; + struct mutex work_mutex; + struct sk_psock_work_state work_state; + struct work_struct work; + struct rcu_work rwork; +}; + +struct inet_ehash_bucket { + struct hlist_nulls_head chain; +}; + +struct inet_bind_hashbucket { + spinlock_t lock; + struct hlist_head chain; +}; + +struct ack_sample { + u32 pkts_acked; + s32 rtt_us; + u32 in_flight; +}; + +struct rate_sample { + u64 prior_mstamp; + u32 prior_delivered; + u32 prior_delivered_ce; + s32 delivered; + s32 delivered_ce; + long int interval_us; + u32 snd_interval_us; + u32 rcv_interval_us; + long int rtt_us; + int losses; + u32 acked_sacked; + u32 prior_in_flight; + bool is_app_limited; + bool is_retrans; + bool is_ack_delayed; +}; + +struct sk_msg_sg { + u32 start; + u32 curr; + u32 end; + u32 size; + u32 copybreak; + long unsigned int copy; + struct scatterlist data[19]; +}; + +struct sk_msg { + struct sk_msg_sg sg; + void *data; + void *data_end; + u32 apply_bytes; + u32 cork_bytes; + u32 flags; + struct sk_buff *skb; + struct sock *sk_redir; + struct sock *sk; + struct list_head list; +}; + +enum verifier_phase { + CHECK_META = 0, + CHECK_TYPE = 1, +}; + +struct resolve_vertex { + const struct btf_type *t; + u32 type_id; + u16 next_member; +}; + +enum visit_state { + NOT_VISITED = 0, + VISITED = 1, + RESOLVED = 2, +}; + +enum resolve_mode { + RESOLVE_TBD = 0, + RESOLVE_PTR = 1, + RESOLVE_STRUCT_OR_ARRAY = 2, +}; + +struct btf_sec_info { + u32 off; + u32 len; +}; + +struct btf_verifier_env { + struct btf *btf; + u8 *visit_states; + struct resolve_vertex stack[32]; + struct bpf_verifier_log log; + u32 log_type_id; + u32 top_stack; + enum verifier_phase phase; + enum resolve_mode resolve_mode; +}; + +struct btf_show { + u64 flags; + void *target; + void (*showfn)(struct btf_show *, const char *, va_list); + const struct btf *btf; + struct { + u8 depth; + u8 depth_to_show; + u8 depth_check; + u8 array_member: 1; + u8 array_terminated: 1; + u16 array_encoding; + u32 type_id; + int status; + const struct btf_type *type; + const struct btf_member *member; + char name[80]; + } state; + struct { + u32 size; + void *head; + void *data; + u8 safe[32]; + } obj; +}; + +struct btf_kind_operations { + s32 (*check_meta)(struct btf_verifier_env *, const struct btf_type *, u32); + int (*resolve)(struct btf_verifier_env *, const struct resolve_vertex *); + int (*check_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + int (*check_kflag_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + void (*log_details)(struct btf_verifier_env *, const struct btf_type *); + void (*show)(const struct btf *, const struct btf_type *, u32, void *, u8, struct btf_show *); +}; + +struct bpf_ctx_convert { + struct __sk_buff BPF_PROG_TYPE_SOCKET_FILTER_prog; + struct sk_buff BPF_PROG_TYPE_SOCKET_FILTER_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_CLS_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_CLS_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_ACT_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_ACT_kern; + struct xdp_md BPF_PROG_TYPE_XDP_prog; + struct xdp_buff BPF_PROG_TYPE_XDP_kern; + struct __sk_buff BPF_PROG_TYPE_CGROUP_SKB_prog; + struct sk_buff BPF_PROG_TYPE_CGROUP_SKB_kern; + struct bpf_sock BPF_PROG_TYPE_CGROUP_SOCK_prog; + struct sock BPF_PROG_TYPE_CGROUP_SOCK_kern; + struct bpf_sock_addr BPF_PROG_TYPE_CGROUP_SOCK_ADDR_prog; + struct bpf_sock_addr_kern BPF_PROG_TYPE_CGROUP_SOCK_ADDR_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_IN_prog; + struct sk_buff BPF_PROG_TYPE_LWT_IN_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_OUT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_OUT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_XMIT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_XMIT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_prog; + struct sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_kern; + struct bpf_sock_ops BPF_PROG_TYPE_SOCK_OPS_prog; + struct bpf_sock_ops_kern BPF_PROG_TYPE_SOCK_OPS_kern; + struct __sk_buff BPF_PROG_TYPE_SK_SKB_prog; + struct sk_buff BPF_PROG_TYPE_SK_SKB_kern; + struct sk_msg_md BPF_PROG_TYPE_SK_MSG_prog; + struct sk_msg BPF_PROG_TYPE_SK_MSG_kern; + struct __sk_buff BPF_PROG_TYPE_FLOW_DISSECTOR_prog; + struct bpf_flow_dissector BPF_PROG_TYPE_FLOW_DISSECTOR_kern; + bpf_user_pt_regs_t BPF_PROG_TYPE_KPROBE_prog; + struct pt_regs BPF_PROG_TYPE_KPROBE_kern; + __u64 BPF_PROG_TYPE_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_TRACEPOINT_kern; + struct bpf_perf_event_data BPF_PROG_TYPE_PERF_EVENT_prog; + struct bpf_perf_event_data_kern BPF_PROG_TYPE_PERF_EVENT_kern; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_kern; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_kern; + void *BPF_PROG_TYPE_TRACING_prog; + void *BPF_PROG_TYPE_TRACING_kern; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_prog; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_kern; + struct bpf_sysctl BPF_PROG_TYPE_CGROUP_SYSCTL_prog; + struct bpf_sysctl_kern BPF_PROG_TYPE_CGROUP_SYSCTL_kern; + struct bpf_sockopt BPF_PROG_TYPE_CGROUP_SOCKOPT_prog; + struct bpf_sockopt_kern BPF_PROG_TYPE_CGROUP_SOCKOPT_kern; + struct sk_reuseport_md BPF_PROG_TYPE_SK_REUSEPORT_prog; + struct sk_reuseport_kern BPF_PROG_TYPE_SK_REUSEPORT_kern; + struct bpf_sk_lookup BPF_PROG_TYPE_SK_LOOKUP_prog; + struct bpf_sk_lookup_kern BPF_PROG_TYPE_SK_LOOKUP_kern; + void *BPF_PROG_TYPE_STRUCT_OPS_prog; + void *BPF_PROG_TYPE_STRUCT_OPS_kern; + void *BPF_PROG_TYPE_EXT_prog; + void *BPF_PROG_TYPE_EXT_kern; + void *BPF_PROG_TYPE_LSM_prog; + void *BPF_PROG_TYPE_LSM_kern; + void *BPF_PROG_TYPE_SYSCALL_prog; + void *BPF_PROG_TYPE_SYSCALL_kern; +}; + +enum { + __ctx_convertBPF_PROG_TYPE_SOCKET_FILTER = 0, + __ctx_convertBPF_PROG_TYPE_SCHED_CLS = 1, + __ctx_convertBPF_PROG_TYPE_SCHED_ACT = 2, + __ctx_convertBPF_PROG_TYPE_XDP = 3, + __ctx_convertBPF_PROG_TYPE_CGROUP_SKB = 4, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK = 5, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK_ADDR = 6, + __ctx_convertBPF_PROG_TYPE_LWT_IN = 7, + __ctx_convertBPF_PROG_TYPE_LWT_OUT = 8, + __ctx_convertBPF_PROG_TYPE_LWT_XMIT = 9, + __ctx_convertBPF_PROG_TYPE_LWT_SEG6LOCAL = 10, + __ctx_convertBPF_PROG_TYPE_SOCK_OPS = 11, + __ctx_convertBPF_PROG_TYPE_SK_SKB = 12, + __ctx_convertBPF_PROG_TYPE_SK_MSG = 13, + __ctx_convertBPF_PROG_TYPE_FLOW_DISSECTOR = 14, + __ctx_convertBPF_PROG_TYPE_KPROBE = 15, + __ctx_convertBPF_PROG_TYPE_TRACEPOINT = 16, + __ctx_convertBPF_PROG_TYPE_PERF_EVENT = 17, + __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT = 18, + __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 19, + __ctx_convertBPF_PROG_TYPE_TRACING = 20, + __ctx_convertBPF_PROG_TYPE_CGROUP_DEVICE = 21, + __ctx_convertBPF_PROG_TYPE_CGROUP_SYSCTL = 22, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCKOPT = 23, + __ctx_convertBPF_PROG_TYPE_SK_REUSEPORT = 24, + __ctx_convertBPF_PROG_TYPE_SK_LOOKUP = 25, + __ctx_convertBPF_PROG_TYPE_STRUCT_OPS = 26, + __ctx_convertBPF_PROG_TYPE_EXT = 27, + __ctx_convertBPF_PROG_TYPE_LSM = 28, + __ctx_convertBPF_PROG_TYPE_SYSCALL = 29, + __ctx_convert_unused = 30, +}; + +enum bpf_struct_walk_result { + WALK_SCALAR = 0, + WALK_PTR = 1, + WALK_STRUCT = 2, +}; + +struct btf_show_snprintf { + struct btf_show show; + int len_left; + int len; +}; + +struct btf_module { + struct list_head list; + struct module *module; + struct btf *btf; + struct bin_attribute *sysfs_attr; +}; + +typedef u64 (*btf_bpf_btf_find_by_name_kind)(char *, int, u32, int); + +struct bpf_dispatcher_prog { + struct bpf_prog *prog; + refcount_t users; +}; + +struct bpf_dispatcher { + struct mutex mutex; + void *func; + struct bpf_dispatcher_prog progs[48]; + int num_progs; + void *image; + u32 image_off; + struct bpf_ksym ksym; +}; + +enum { + BPF_F_BROADCAST = 8, + BPF_F_EXCLUDE_INGRESS = 16, +}; + +struct bpf_devmap_val { + __u32 ifindex; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +enum net_device_flags { + IFF_UP = 1, + IFF_BROADCAST = 2, + IFF_DEBUG = 4, + IFF_LOOPBACK = 8, + IFF_POINTOPOINT = 16, + IFF_NOTRAILERS = 32, + IFF_RUNNING = 64, + IFF_NOARP = 128, + IFF_PROMISC = 256, + IFF_ALLMULTI = 512, + IFF_MASTER = 1024, + IFF_SLAVE = 2048, + IFF_MULTICAST = 4096, + IFF_PORTSEL = 8192, + IFF_AUTOMEDIA = 16384, + IFF_DYNAMIC = 32768, + IFF_LOWER_UP = 65536, + IFF_DORMANT = 131072, + IFF_ECHO = 262144, +}; + +enum netdev_priv_flags { + IFF_802_1Q_VLAN = 1, + IFF_EBRIDGE = 2, + IFF_BONDING = 4, + IFF_ISATAP = 8, + IFF_WAN_HDLC = 16, + IFF_XMIT_DST_RELEASE = 32, + IFF_DONT_BRIDGE = 64, + IFF_DISABLE_NETPOLL = 128, + IFF_MACVLAN_PORT = 256, + IFF_BRIDGE_PORT = 512, + IFF_OVS_DATAPATH = 1024, + IFF_TX_SKB_SHARING = 2048, + IFF_UNICAST_FLT = 4096, + IFF_TEAM_PORT = 8192, + IFF_SUPP_NOFCS = 16384, + IFF_LIVE_ADDR_CHANGE = 32768, + IFF_MACVLAN = 65536, + IFF_XMIT_DST_RELEASE_PERM = 131072, + IFF_L3MDEV_MASTER = 262144, + IFF_NO_QUEUE = 524288, + IFF_OPENVSWITCH = 1048576, + IFF_L3MDEV_SLAVE = 2097152, + IFF_TEAM = 4194304, + IFF_RXFH_CONFIGURED = 8388608, + IFF_PHONY_HEADROOM = 16777216, + IFF_MACSEC = 33554432, + IFF_NO_RX_HANDLER = 67108864, + IFF_FAILOVER = 134217728, + IFF_FAILOVER_SLAVE = 268435456, + IFF_L3MDEV_RX_HANDLER = 536870912, + IFF_LIVE_RENAME_OK = 1073741824, + IFF_TX_SKB_NO_LINEAR = 2147483648, +}; + +struct xdp_dev_bulk_queue { + struct xdp_frame *q[16]; + struct list_head flush_node; + struct net_device *dev; + struct net_device *dev_rx; + struct bpf_prog *xdp_prog; + unsigned int count; +}; + +enum netdev_cmd { + NETDEV_UP = 1, + NETDEV_DOWN = 2, + NETDEV_REBOOT = 3, + NETDEV_CHANGE = 4, + NETDEV_REGISTER = 5, + NETDEV_UNREGISTER = 6, + NETDEV_CHANGEMTU = 7, + NETDEV_CHANGEADDR = 8, + NETDEV_PRE_CHANGEADDR = 9, + NETDEV_GOING_DOWN = 10, + NETDEV_CHANGENAME = 11, + NETDEV_FEAT_CHANGE = 12, + NETDEV_BONDING_FAILOVER = 13, + NETDEV_PRE_UP = 14, + NETDEV_PRE_TYPE_CHANGE = 15, + NETDEV_POST_TYPE_CHANGE = 16, + NETDEV_POST_INIT = 17, + NETDEV_RELEASE = 18, + NETDEV_NOTIFY_PEERS = 19, + NETDEV_JOIN = 20, + NETDEV_CHANGEUPPER = 21, + NETDEV_RESEND_IGMP = 22, + NETDEV_PRECHANGEMTU = 23, + NETDEV_CHANGEINFODATA = 24, + NETDEV_BONDING_INFO = 25, + NETDEV_PRECHANGEUPPER = 26, + NETDEV_CHANGELOWERSTATE = 27, + NETDEV_UDP_TUNNEL_PUSH_INFO = 28, + NETDEV_UDP_TUNNEL_DROP_INFO = 29, + NETDEV_CHANGE_TX_QUEUE_LEN = 30, + NETDEV_CVLAN_FILTER_PUSH_INFO = 31, + NETDEV_CVLAN_FILTER_DROP_INFO = 32, + NETDEV_SVLAN_FILTER_PUSH_INFO = 33, + NETDEV_SVLAN_FILTER_DROP_INFO = 34, +}; + +struct netdev_notifier_info { + struct net_device *dev; + struct netlink_ext_ack *extack; +}; + +struct bpf_nh_params { + u32 nh_family; + union { + u32 ipv4_nh; + struct in6_addr ipv6_nh; + }; +}; + +struct bpf_redirect_info { + u32 flags; + u32 tgt_index; + void *tgt_value; + struct bpf_map *map; + u32 map_id; + enum bpf_map_type map_type; + u32 kern_flags; + struct bpf_nh_params nh; +}; + +struct bpf_dtab; + +struct bpf_dtab_netdev { + struct net_device *dev; + struct hlist_node index_hlist; + struct bpf_dtab *dtab; + struct bpf_prog *xdp_prog; + struct callback_head rcu; + unsigned int idx; + struct bpf_devmap_val val; +}; + +struct bpf_dtab { + struct bpf_map map; + struct bpf_dtab_netdev **netdev_map; + struct list_head list; + struct hlist_head *dev_index_head; + spinlock_t index_lock; + unsigned int items; + u32 n_buckets; + long: 32; + long: 64; + long: 64; +}; + +struct bpf_cpumap_val { + __u32 qsize; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +struct bpf_cpu_map_entry; + +struct xdp_bulk_queue { + void *q[8]; + struct list_head flush_node; + struct bpf_cpu_map_entry *obj; + unsigned int count; +}; + +struct bpf_cpu_map; + +struct bpf_cpu_map_entry { + u32 cpu; + int map_id; + struct xdp_bulk_queue *bulkq; + struct bpf_cpu_map *cmap; + struct ptr_ring *queue; + struct task_struct *kthread; + struct bpf_cpumap_val value; + struct bpf_prog *prog; + atomic_t refcnt; + struct callback_head rcu; + struct work_struct kthread_stop_wq; +}; + +struct bpf_cpu_map { + struct bpf_map map; + struct bpf_cpu_map_entry **cpu_map; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct rhlist_head { + struct rhash_head rhead; + struct rhlist_head *next; +}; + +struct bpf_prog_offload_ops { + int (*insn_hook)(struct bpf_verifier_env *, int, int); + int (*finalize)(struct bpf_verifier_env *); + int (*replace_insn)(struct bpf_verifier_env *, u32, struct bpf_insn *); + int (*remove_insns)(struct bpf_verifier_env *, u32, u32); + int (*prepare)(struct bpf_prog *); + int (*translate)(struct bpf_prog *); + void (*destroy)(struct bpf_prog *); +}; + +struct bpf_offload_dev { + const struct bpf_prog_offload_ops *ops; + struct list_head netdevs; + void *priv; +}; + +typedef struct ns_common *ns_get_path_helper_t(void *); + +struct bpf_offload_netdev { + struct rhash_head l; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + struct list_head progs; + struct list_head maps; + struct list_head offdev_netdevs; +}; + +struct ns_get_path_bpf_prog_args { + struct bpf_prog *prog; + struct bpf_prog_info *info; +}; + +struct ns_get_path_bpf_map_args { + struct bpf_offloaded_map *offmap; + struct bpf_map_info *info; +}; + +struct bpf_netns_link { + struct bpf_link link; + enum bpf_attach_type type; + enum netns_bpf_attach_type netns_type; + struct net *net; + struct list_head node; +}; + +enum bpf_stack_build_id_status { + BPF_STACK_BUILD_ID_EMPTY = 0, + BPF_STACK_BUILD_ID_VALID = 1, + BPF_STACK_BUILD_ID_IP = 2, +}; + +struct bpf_stack_build_id { + __s32 status; + unsigned char build_id[20]; + union { + __u64 offset; + __u64 ip; + }; +}; + +enum { + BPF_F_SKIP_FIELD_MASK = 255, + BPF_F_USER_STACK = 256, + BPF_F_FAST_STACK_CMP = 512, + BPF_F_REUSE_STACKID = 1024, + BPF_F_USER_BUILD_ID = 2048, +}; + +enum perf_callchain_context { + PERF_CONTEXT_HV = 4294967264, + PERF_CONTEXT_KERNEL = 4294967168, + PERF_CONTEXT_USER = 4294966784, + PERF_CONTEXT_GUEST = 4294965248, + PERF_CONTEXT_GUEST_KERNEL = 4294965120, + PERF_CONTEXT_GUEST_USER = 4294964736, + PERF_CONTEXT_MAX = 4294963201, +}; + +struct stack_map_bucket { + struct pcpu_freelist_node fnode; + u32 hash; + u32 nr; + u64 data[0]; +}; + +struct bpf_stack_map { + struct bpf_map map; + void *elems; + struct pcpu_freelist freelist; + u32 n_buckets; + struct stack_map_bucket *buckets[0]; + long: 64; + long: 64; + long: 64; +}; + +struct stack_map_irq_work { + struct irq_work irq_work; + struct mm_struct *mm; +}; + +typedef u64 (*btf_bpf_get_stackid)(struct pt_regs *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stackid_pe)(struct bpf_perf_event_data_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack)(struct pt_regs *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_task_stack)(struct task_struct *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_stack_pe)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +enum { + BPF_F_SYSCTL_BASE_NAME = 1, +}; + +struct bpf_cgroup_link { + struct bpf_link link; + struct cgroup *cgroup; + enum bpf_attach_type type; +}; + +struct bpf_prog_list { + struct list_head node; + struct bpf_prog *prog; + struct bpf_cgroup_link *link; + struct bpf_cgroup_storage *storage[2]; +}; + +struct qdisc_skb_cb { + struct { + unsigned int pkt_len; + u16 slave_dev_queue_mapping; + u16 tc_classid; + }; + unsigned char data[20]; +}; + +struct bpf_skb_data_end { + struct qdisc_skb_cb qdisc_cb; + void *data_meta; + void *data_end; +}; + +struct bpf_sockopt_buf { + u8 data[32]; +}; + +enum { + TCPF_ESTABLISHED = 2, + TCPF_SYN_SENT = 4, + TCPF_SYN_RECV = 8, + TCPF_FIN_WAIT1 = 16, + TCPF_FIN_WAIT2 = 32, + TCPF_TIME_WAIT = 64, + TCPF_CLOSE = 128, + TCPF_CLOSE_WAIT = 256, + TCPF_LAST_ACK = 512, + TCPF_LISTEN = 1024, + TCPF_CLOSING = 2048, + TCPF_NEW_SYN_RECV = 4096, +}; + +typedef u64 (*btf_bpf_sysctl_get_name)(struct bpf_sysctl_kern *, char *, size_t, u64); + +typedef u64 (*btf_bpf_sysctl_get_current_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_get_new_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_set_new_value)(struct bpf_sysctl_kern *, const char *, size_t); + +typedef u64 (*btf_bpf_get_netns_cookie_sockopt)(struct bpf_sockopt_kern *); + +enum sock_type { + SOCK_STREAM = 1, + SOCK_DGRAM = 2, + SOCK_RAW = 3, + SOCK_RDM = 4, + SOCK_SEQPACKET = 5, + SOCK_DCCP = 6, + SOCK_PACKET = 10, +}; + +enum { + IPPROTO_IP = 0, + IPPROTO_ICMP = 1, + IPPROTO_IGMP = 2, + IPPROTO_IPIP = 4, + IPPROTO_TCP = 6, + IPPROTO_EGP = 8, + IPPROTO_PUP = 12, + IPPROTO_UDP = 17, + IPPROTO_IDP = 22, + IPPROTO_TP = 29, + IPPROTO_DCCP = 33, + IPPROTO_IPV6 = 41, + IPPROTO_RSVP = 46, + IPPROTO_GRE = 47, + IPPROTO_ESP = 50, + IPPROTO_AH = 51, + IPPROTO_MTP = 92, + IPPROTO_BEETPH = 94, + IPPROTO_ENCAP = 98, + IPPROTO_PIM = 103, + IPPROTO_COMP = 108, + IPPROTO_SCTP = 132, + IPPROTO_UDPLITE = 136, + IPPROTO_MPLS = 137, + IPPROTO_ETHERNET = 143, + IPPROTO_RAW = 255, + IPPROTO_MPTCP = 262, + IPPROTO_MAX = 263, +}; + +enum sock_flags { + SOCK_DEAD = 0, + SOCK_DONE = 1, + SOCK_URGINLINE = 2, + SOCK_KEEPOPEN = 3, + SOCK_LINGER = 4, + SOCK_DESTROY = 5, + SOCK_BROADCAST = 6, + SOCK_TIMESTAMP = 7, + SOCK_ZAPPED = 8, + SOCK_USE_WRITE_QUEUE = 9, + SOCK_DBG = 10, + SOCK_RCVTSTAMP = 11, + SOCK_RCVTSTAMPNS = 12, + SOCK_LOCALROUTE = 13, + SOCK_MEMALLOC = 14, + SOCK_TIMESTAMPING_RX_SOFTWARE = 15, + SOCK_FASYNC = 16, + SOCK_RXQ_OVFL = 17, + SOCK_ZEROCOPY = 18, + SOCK_WIFI_STATUS = 19, + SOCK_NOFCS = 20, + SOCK_FILTER_LOCKED = 21, + SOCK_SELECT_ERR_QUEUE = 22, + SOCK_RCU_FREE = 23, + SOCK_TXTIME = 24, + SOCK_XDP = 25, + SOCK_TSTAMP_NEW = 26, +}; + +struct reuseport_array { + struct bpf_map map; + struct sock *ptrs[0]; +}; + +struct bpf_dummy_ops_state { + int val; +}; + +struct bpf_dummy_ops { + int (*test_1)(struct bpf_dummy_ops_state *); + int (*test_2)(struct bpf_dummy_ops_state *, int, short unsigned int, char, long unsigned int); +}; + +enum bpf_struct_ops_state { + BPF_STRUCT_OPS_STATE_INIT = 0, + BPF_STRUCT_OPS_STATE_INUSE = 1, + BPF_STRUCT_OPS_STATE_TOBEFREE = 2, +}; + +struct bpf_struct_ops_value { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + char data[0]; +}; + +struct bpf_struct_ops_map { + struct bpf_map map; + struct callback_head rcu; + const struct bpf_struct_ops *st_ops; + struct mutex lock; + struct bpf_prog **progs; + void *image; + struct bpf_struct_ops_value *uvalue; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bpf_struct_ops_value kvalue; +}; + +struct bpf_struct_ops_bpf_dummy_ops { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bpf_dummy_ops data; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_struct_ops_tcp_congestion_ops { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct tcp_congestion_ops data; +}; + +enum { + BPF_STRUCT_OPS_TYPE_bpf_dummy_ops = 0, + BPF_STRUCT_OPS_TYPE_tcp_congestion_ops = 1, + __NR_BPF_STRUCT_OPS_TYPE = 2, +}; + +enum { + BPF_F_BPRM_SECUREEXEC = 1, +}; + +struct sembuf { + short unsigned int sem_num; + short int sem_op; + short int sem_flg; +}; + +enum key_need_perm { + KEY_NEED_UNSPECIFIED = 0, + KEY_NEED_VIEW = 1, + KEY_NEED_READ = 2, + KEY_NEED_WRITE = 3, + KEY_NEED_SEARCH = 4, + KEY_NEED_LINK = 5, + KEY_NEED_SETATTR = 6, + KEY_NEED_UNLINK = 7, + KEY_SYSADMIN_OVERRIDE = 8, + KEY_AUTHTOKEN_OVERRIDE = 9, + KEY_DEFER_PERM_CHECK = 10, +}; + +struct __key_reference_with_attributes; + +typedef struct __key_reference_with_attributes *key_ref_t; + +struct xfrm_sec_ctx { + __u8 ctx_doi; + __u8 ctx_alg; + __u16 ctx_len; + __u32 ctx_sid; + char ctx_str[0]; +}; + +struct xfrm_user_sec_ctx { + __u16 len; + __u16 exttype; + __u8 ctx_alg; + __u8 ctx_doi; + __u16 ctx_len; +}; + +typedef u64 (*btf_bpf_bprm_opts_set)(struct linux_binprm *, u64); + +typedef u64 (*btf_bpf_ima_inode_hash)(struct inode *, void *, u32); + +enum perf_branch_sample_type { + PERF_SAMPLE_BRANCH_USER = 1, + PERF_SAMPLE_BRANCH_KERNEL = 2, + PERF_SAMPLE_BRANCH_HV = 4, + PERF_SAMPLE_BRANCH_ANY = 8, + PERF_SAMPLE_BRANCH_ANY_CALL = 16, + PERF_SAMPLE_BRANCH_ANY_RETURN = 32, + PERF_SAMPLE_BRANCH_IND_CALL = 64, + PERF_SAMPLE_BRANCH_ABORT_TX = 128, + PERF_SAMPLE_BRANCH_IN_TX = 256, + PERF_SAMPLE_BRANCH_NO_TX = 512, + PERF_SAMPLE_BRANCH_COND = 1024, + PERF_SAMPLE_BRANCH_CALL_STACK = 2048, + PERF_SAMPLE_BRANCH_IND_JUMP = 4096, + PERF_SAMPLE_BRANCH_CALL = 8192, + PERF_SAMPLE_BRANCH_NO_FLAGS = 16384, + PERF_SAMPLE_BRANCH_NO_CYCLES = 32768, + PERF_SAMPLE_BRANCH_TYPE_SAVE = 65536, + PERF_SAMPLE_BRANCH_HW_INDEX = 131072, + PERF_SAMPLE_BRANCH_MAX = 262144, +}; + +enum perf_event_read_format { + PERF_FORMAT_TOTAL_TIME_ENABLED = 1, + PERF_FORMAT_TOTAL_TIME_RUNNING = 2, + PERF_FORMAT_ID = 4, + PERF_FORMAT_GROUP = 8, + PERF_FORMAT_MAX = 16, +}; + +enum perf_event_ioc_flags { + PERF_IOC_FLAG_GROUP = 1, +}; + +struct perf_event_header { + __u32 type; + __u16 misc; + __u16 size; +}; + +struct perf_ns_link_info { + __u64 dev; + __u64 ino; +}; + +enum { + NET_NS_INDEX = 0, + UTS_NS_INDEX = 1, + IPC_NS_INDEX = 2, + PID_NS_INDEX = 3, + USER_NS_INDEX = 4, + MNT_NS_INDEX = 5, + CGROUP_NS_INDEX = 6, + NR_NAMESPACES = 7, +}; + +enum perf_event_type { + PERF_RECORD_MMAP = 1, + PERF_RECORD_LOST = 2, + PERF_RECORD_COMM = 3, + PERF_RECORD_EXIT = 4, + PERF_RECORD_THROTTLE = 5, + PERF_RECORD_UNTHROTTLE = 6, + PERF_RECORD_FORK = 7, + PERF_RECORD_READ = 8, + PERF_RECORD_SAMPLE = 9, + PERF_RECORD_MMAP2 = 10, + PERF_RECORD_AUX = 11, + PERF_RECORD_ITRACE_START = 12, + PERF_RECORD_LOST_SAMPLES = 13, + PERF_RECORD_SWITCH = 14, + PERF_RECORD_SWITCH_CPU_WIDE = 15, + PERF_RECORD_NAMESPACES = 16, + PERF_RECORD_KSYMBOL = 17, + PERF_RECORD_BPF_EVENT = 18, + PERF_RECORD_CGROUP = 19, + PERF_RECORD_TEXT_POKE = 20, + PERF_RECORD_AUX_OUTPUT_HW_ID = 21, + PERF_RECORD_MAX = 22, +}; + +enum perf_addr_filter_action_t { + PERF_ADDR_FILTER_ACTION_STOP = 0, + PERF_ADDR_FILTER_ACTION_START = 1, + PERF_ADDR_FILTER_ACTION_FILTER = 2, +}; + +struct perf_addr_filter { + struct list_head entry; + struct path path; + long unsigned int offset; + long unsigned int size; + enum perf_addr_filter_action_t action; +}; + +struct swevent_hlist { + struct hlist_head heads[256]; + struct callback_head callback_head; +}; + +struct pmu_event_list { + raw_spinlock_t lock; + struct list_head list; +}; + +struct perf_buffer { + refcount_t refcount; + struct callback_head callback_head; + int nr_pages; + int overwrite; + int paused; + atomic_t poll; + local_t head; + unsigned int nest; + local_t events; + local_t wakeup; + local_t lost; + long int watermark; + long int aux_watermark; + spinlock_t event_lock; + struct list_head event_list; + atomic_t mmap_count; + long unsigned int mmap_locked; + struct user_struct *mmap_user; + long int aux_head; + unsigned int aux_nest; + long int aux_wakeup; + long unsigned int aux_pgoff; + int aux_nr_pages; + int aux_overwrite; + atomic_t aux_mmap_count; + long unsigned int aux_mmap_locked; + void (*free_aux)(void *); + refcount_t aux_refcount; + int aux_in_sampling; + void **aux_pages; + void *aux_priv; + struct perf_event_mmap_page *user_page; + void *data_pages[0]; +}; + +struct match_token { + int token; + const char *pattern; +}; + +enum { + MAX_OPT_ARGS = 3, +}; + +struct min_heap { + void *data; + int nr; + int size; +}; + +struct min_heap_callbacks { + int elem_size; + bool (*less)(const void *, const void *); + void (*swp)(void *, void *); +}; + +typedef int (*remote_function_f)(void *); + +struct remote_function_call { + struct task_struct *p; + remote_function_f func; + void *info; + int ret; +}; + +typedef void (*event_f)(struct perf_event *, struct perf_cpu_context *, struct perf_event_context *, void *); + +struct event_function_struct { + struct perf_event *event; + event_f func; + void *data; +}; + +enum event_type_t { + EVENT_FLEXIBLE = 1, + EVENT_PINNED = 2, + EVENT_TIME = 4, + EVENT_CPU = 8, + EVENT_ALL = 3, +}; + +struct __group_key { + int cpu; + struct cgroup *cgroup; +}; + +struct stop_event_data { + struct perf_event *event; + unsigned int restart; +}; + +struct perf_read_data { + struct perf_event *event; + bool group; + int ret; +}; + +struct perf_read_event { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +typedef void perf_iterate_f(struct perf_event *, void *); + +struct remote_output { + struct perf_buffer *rb; + int err; +}; + +struct perf_task_event { + struct task_struct *task; + struct perf_event_context *task_ctx; + struct { + struct perf_event_header header; + u32 pid; + u32 ppid; + u32 tid; + u32 ptid; + u64 time; + } event_id; +}; + +struct perf_comm_event { + struct task_struct *task; + char *comm; + int comm_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + } event_id; +}; + +struct perf_namespaces_event { + struct task_struct *task; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 nr_namespaces; + struct perf_ns_link_info link_info[7]; + } event_id; +}; + +struct perf_cgroup_event { + char *path; + int path_size; + struct { + struct perf_event_header header; + u64 id; + char path[0]; + } event_id; +}; + +struct perf_mmap_event { + struct vm_area_struct *vma; + const char *file_name; + int file_size; + int maj; + int min; + u64 ino; + u64 ino_generation; + u32 prot; + u32 flags; + u8 build_id[20]; + u32 build_id_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 start; + u64 len; + u64 pgoff; + } event_id; +}; + +struct perf_switch_event { + struct task_struct *task; + struct task_struct *next_prev; + struct { + struct perf_event_header header; + u32 next_prev_pid; + u32 next_prev_tid; + } event_id; +}; + +struct perf_ksymbol_event { + const char *name; + int name_len; + struct { + struct perf_event_header header; + u64 addr; + u32 len; + u16 ksym_type; + u16 flags; + } event_id; +}; + +struct perf_bpf_event { + struct bpf_prog *prog; + struct { + struct perf_event_header header; + u16 type; + u16 flags; + u32 id; + u8 tag[8]; + } event_id; +}; + +struct perf_text_poke_event { + const void *old_bytes; + const void *new_bytes; + size_t pad; + u16 old_len; + u16 new_len; + struct { + struct perf_event_header header; + u64 addr; + } event_id; +}; + +struct swevent_htable { + struct swevent_hlist *swevent_hlist; + struct mutex hlist_mutex; + int hlist_refcount; + int recursion[4]; +}; + +enum perf_probe_config { + PERF_PROBE_CONFIG_IS_RETPROBE = 1, + PERF_UPROBE_REF_CTR_OFFSET_BITS = 32, + PERF_UPROBE_REF_CTR_OFFSET_SHIFT = 32, +}; + +enum { + IF_ACT_NONE = 4294967295, + IF_ACT_FILTER = 0, + IF_ACT_START = 1, + IF_ACT_STOP = 2, + IF_SRC_FILE = 3, + IF_SRC_KERNEL = 4, + IF_SRC_FILEADDR = 5, + IF_SRC_KERNELADDR = 6, +}; + +enum { + IF_STATE_ACTION = 0, + IF_STATE_SOURCE = 1, + IF_STATE_END = 2, +}; + +struct perf_aux_event { + struct perf_event_header header; + u64 hw_id; +}; + +struct perf_aux_event___2 { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +struct perf_aux_event___3 { + struct perf_event_header header; + u64 offset; + u64 size; + u64 flags; +}; + +struct callchain_cpus_entries { + struct callback_head callback_head; + struct perf_callchain_entry *cpu_entries[0]; +}; + +struct bp_cpuinfo { + unsigned int cpu_pinned; + unsigned int *tsk_pinned; + unsigned int flexible; +}; + +struct bp_busy_slots { + unsigned int pinned; + unsigned int flexible; +}; + +struct compact_control; + +struct capture_control { + struct compact_control *cc; + struct page *page; +}; + +typedef u32 uprobe_opcode_t; + +struct uprobe { + struct rb_node rb_node; + refcount_t ref; + struct rw_semaphore register_rwsem; + struct rw_semaphore consumer_rwsem; + struct list_head pending_list; + struct uprobe_consumer *consumers; + struct inode *inode; + loff_t offset; + loff_t ref_ctr_offset; + long unsigned int flags; + struct arch_uprobe arch; +}; + +struct xol_area { + wait_queue_head_t wq; + atomic_t slot_count; + long unsigned int *bitmap; + struct vm_special_mapping xol_mapping; + struct page *pages[2]; + long unsigned int vaddr; +}; + +typedef int filler_t(void *, struct page *); + +struct page_vma_mapped_walk { + struct page *page; + struct vm_area_struct *vma; + long unsigned int address; + pmd_t *pmd; + pte_t *pte; + spinlock_t *ptl; + unsigned int flags; +}; + +struct compact_control { + struct list_head freepages; + struct list_head migratepages; + unsigned int nr_freepages; + unsigned int nr_migratepages; + long unsigned int free_pfn; + long unsigned int migrate_pfn; + long unsigned int fast_start_pfn; + struct zone *zone; + long unsigned int total_migrate_scanned; + long unsigned int total_free_scanned; + short unsigned int fast_search_fail; + short int search_order; + const gfp_t gfp_mask; + int order; + int migratetype; + const unsigned int alloc_flags; + const int highest_zoneidx; + enum migrate_mode mode; + bool ignore_skip_hint; + bool no_set_skip_hint; + bool ignore_block_suitable; + bool direct_compaction; + bool proactive_compaction; + bool whole_zone; + bool contended; + bool rescan; + bool alloc_contig; +}; + +struct delayed_uprobe { + struct list_head list; + struct uprobe *uprobe; + struct mm_struct *mm; +}; + +struct __uprobe_key { + struct inode *inode; + loff_t offset; +}; + +struct map_info { + struct map_info *next; + struct mm_struct *mm; + long unsigned int vaddr; +}; + +struct parallel_data; + +struct padata_priv { + struct list_head list; + struct parallel_data *pd; + int cb_cpu; + unsigned int seq_nr; + int info; + void (*parallel)(struct padata_priv *); + void (*serial)(struct padata_priv *); +}; + +struct padata_cpumask { + cpumask_var_t pcpu; + cpumask_var_t cbcpu; +}; + +struct padata_shell; + +struct padata_list; + +struct padata_serial_queue; + +struct parallel_data { + struct padata_shell *ps; + struct padata_list *reorder_list; + struct padata_serial_queue *squeue; + refcount_t refcnt; + unsigned int seq_nr; + unsigned int processed; + int cpu; + struct padata_cpumask cpumask; + struct work_struct reorder_work; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t lock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct padata_list { + struct list_head list; + spinlock_t lock; +}; + +struct padata_serial_queue { + struct padata_list serial; + struct work_struct work; + struct parallel_data *pd; +}; + +struct padata_instance; + +struct padata_shell { + struct padata_instance *pinst; + struct parallel_data *pd; + struct parallel_data *opd; + struct list_head list; +}; + +struct padata_instance { + struct hlist_node cpu_online_node; + struct hlist_node cpu_dead_node; + struct workqueue_struct *parallel_wq; + struct workqueue_struct *serial_wq; + struct list_head pslist; + struct padata_cpumask cpumask; + struct kobject kobj; + struct mutex lock; + u8 flags; +}; + +struct padata_mt_job { + void (*thread_fn)(long unsigned int, long unsigned int, void *); + void *fn_arg; + long unsigned int start; + long unsigned int size; + long unsigned int align; + long unsigned int min_chunk; + int max_threads; +}; + +struct padata_work { + struct work_struct pw_work; + struct list_head pw_list; + void *pw_data; +}; + +struct padata_mt_job_state { + spinlock_t lock; + struct completion completion; + struct padata_mt_job *job; + int nworks; + int nworks_fini; + long unsigned int chunk_size; +}; + +struct padata_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct padata_instance *, struct attribute *, char *); + ssize_t (*store)(struct padata_instance *, struct attribute *, const char *, size_t); +}; + +struct static_key_mod { + struct static_key_mod *next; + struct jump_entry *entries; + struct module *mod; +}; + +struct static_key_deferred { + struct static_key key; + long unsigned int timeout; + struct delayed_work work; +}; + +enum rseq_cpu_id_state { + RSEQ_CPU_ID_UNINITIALIZED = 4294967295, + RSEQ_CPU_ID_REGISTRATION_FAILED = 4294967294, +}; + +enum rseq_flags { + RSEQ_FLAG_UNREGISTER = 1, +}; + +enum rseq_cs_flags { + RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT = 1, + RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = 2, + RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = 4, +}; + +struct rseq_cs { + __u32 version; + __u32 flags; + __u64 start_ip; + __u64 post_commit_offset; + __u64 abort_ip; +}; + +struct trace_event_raw_rseq_update { + struct trace_entry ent; + s32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_rseq_ip_fixup { + struct trace_entry ent; + long unsigned int regs_ip; + long unsigned int start_ip; + long unsigned int post_commit_offset; + long unsigned int abort_ip; + char __data[0]; +}; + +struct trace_event_data_offsets_rseq_update {}; + +struct trace_event_data_offsets_rseq_ip_fixup {}; + +typedef void (*btf_trace_rseq_update)(void *, struct task_struct *); + +typedef void (*btf_trace_rseq_ip_fixup)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +struct watch; + +struct watch_list { + struct callback_head rcu; + struct hlist_head watchers; + void (*release_watch)(struct watch *); + spinlock_t lock; +}; + +enum watch_notification_type { + WATCH_TYPE_META = 0, + WATCH_TYPE_KEY_NOTIFY = 1, + WATCH_TYPE__NR = 2, +}; + +enum watch_meta_notification_subtype { + WATCH_META_REMOVAL_NOTIFICATION = 0, + WATCH_META_LOSS_NOTIFICATION = 1, +}; + +struct watch_notification { + __u32 type: 24; + __u32 subtype: 8; + __u32 info; +}; + +struct watch_notification_type_filter { + __u32 type; + __u32 info_filter; + __u32 info_mask; + __u32 subtype_filter[8]; +}; + +struct watch_notification_filter { + __u32 nr_filters; + __u32 __reserved; + struct watch_notification_type_filter filters[0]; +}; + +struct watch_notification_removal { + struct watch_notification watch; + __u64 id; +}; + +struct watch_type_filter { + enum watch_notification_type type; + __u32 subtype_filter[1]; + __u32 info_filter; + __u32 info_mask; +}; + +struct watch_filter { + union { + struct callback_head rcu; + long unsigned int type_filter[2]; + }; + u32 nr_filters; + struct watch_type_filter filters[0]; +}; + +struct watch_queue { + struct callback_head rcu; + struct watch_filter *filter; + struct pipe_inode_info *pipe; + struct hlist_head watches; + struct page **notes; + long unsigned int *notes_bitmap; + struct kref usage; + spinlock_t lock; + unsigned int nr_notes; + unsigned int nr_pages; + bool defunct; +}; + +struct watch { + union { + struct callback_head rcu; + u32 info_id; + }; + struct watch_queue *queue; + struct hlist_node queue_node; + struct watch_list *watch_list; + struct hlist_node list_node; + const struct cred *cred; + void *private; + u64 id; + struct kref usage; +}; + +struct pkcs7_message; + +typedef int __kernel_rwf_t; + +enum positive_aop_returns { + AOP_WRITEPAGE_ACTIVATE = 524288, + AOP_TRUNCATED_PAGE = 524289, +}; + +struct vm_event_state { + long unsigned int event[99]; +}; + +enum iter_type { + ITER_IOVEC = 0, + ITER_KVEC = 1, + ITER_BVEC = 2, + ITER_PIPE = 3, + ITER_XARRAY = 4, + ITER_DISCARD = 5, +}; + +enum mapping_flags { + AS_EIO = 0, + AS_ENOSPC = 1, + AS_MM_ALL_LOCKS = 2, + AS_UNEVICTABLE = 3, + AS_EXITING = 4, + AS_NO_WRITEBACK_TAGS = 5, + AS_LARGE_FOLIO_SUPPORT = 6, +}; + +struct wait_page_key { + struct folio *folio; + int bit_nr; + int page_match; +}; + +struct pagevec { + unsigned char nr; + bool percpu_pvec_drained; + struct page *pages[15]; +}; + +struct fid { + union { + struct { + u32 ino; + u32 gen; + u32 parent_ino; + u32 parent_gen; + } i32; + struct { + u32 block; + u16 partref; + u16 parent_partref; + u32 generation; + u32 parent_block; + u32 parent_generation; + } udf; + __u32 raw[0]; + }; +}; + +struct trace_event_raw_mm_filemap_op_page_cache { + struct trace_entry ent; + long unsigned int pfn; + long unsigned int i_ino; + long unsigned int index; + dev_t s_dev; + char __data[0]; +}; + +struct trace_event_raw_filemap_set_wb_err { + struct trace_entry ent; + long unsigned int i_ino; + dev_t s_dev; + errseq_t errseq; + char __data[0]; +}; + +struct trace_event_raw_file_check_and_advance_wb_err { + struct trace_entry ent; + struct file *file; + long unsigned int i_ino; + dev_t s_dev; + errseq_t old; + errseq_t new; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_filemap_op_page_cache {}; + +struct trace_event_data_offsets_filemap_set_wb_err {}; + +struct trace_event_data_offsets_file_check_and_advance_wb_err {}; + +typedef void (*btf_trace_mm_filemap_delete_from_page_cache)(void *, struct page *); + +typedef void (*btf_trace_mm_filemap_add_to_page_cache)(void *, struct page *); + +typedef void (*btf_trace_filemap_set_wb_err)(void *, struct address_space *, errseq_t); + +typedef void (*btf_trace_file_check_and_advance_wb_err)(void *, struct file *, errseq_t); + +enum behavior { + EXCLUSIVE = 0, + SHARED = 1, + DROP = 2, +}; + +struct reciprocal_value { + u32 m; + u8 sh1; + u8 sh2; +}; + +struct kmem_cache_order_objects { + unsigned int x; +}; + +struct kmem_cache_cpu; + +struct kmem_cache_node; + +struct kmem_cache { + struct kmem_cache_cpu *cpu_slab; + slab_flags_t flags; + long unsigned int min_partial; + unsigned int size; + unsigned int object_size; + struct reciprocal_value reciprocal_size; + unsigned int offset; + unsigned int cpu_partial; + unsigned int cpu_partial_pages; + struct kmem_cache_order_objects oo; + struct kmem_cache_order_objects max; + struct kmem_cache_order_objects min; + gfp_t allocflags; + int refcount; + void (*ctor)(void *); + unsigned int inuse; + unsigned int align; + unsigned int red_left_pad; + const char *name; + struct list_head list; + struct kobject kobj; + long unsigned int random; + unsigned int remote_node_defrag_ratio; + unsigned int *random_seq; + unsigned int useroffset; + unsigned int usersize; + struct kmem_cache_node *node[64]; +}; + +struct kmem_cache_cpu { + void **freelist; + long unsigned int tid; + struct page *page; + struct page *partial; + local_lock_t lock; +}; + +struct kmem_cache_node { + spinlock_t list_lock; + long unsigned int nr_partial; + struct list_head partial; + atomic_long_t nr_slabs; + atomic_long_t total_objects; + struct list_head full; +}; + +struct zap_details { + struct address_space *zap_mapping; + struct page *single_page; +}; + +enum oom_constraint { + CONSTRAINT_NONE = 0, + CONSTRAINT_CPUSET = 1, + CONSTRAINT_MEMORY_POLICY = 2, + CONSTRAINT_MEMCG = 3, +}; + +struct oom_control { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct mem_cgroup *memcg; + const gfp_t gfp_mask; + const int order; + long unsigned int totalpages; + struct task_struct *chosen; + long int chosen_points; + enum oom_constraint constraint; +}; + +struct mmu_table_batch { + struct callback_head rcu; + unsigned int nr; + void *tables[0]; +}; + +struct mmu_gather_batch { + struct mmu_gather_batch *next; + unsigned int nr; + unsigned int max; + struct page *pages[0]; +}; + +struct mmu_gather { + struct mm_struct *mm; + struct mmu_table_batch *batch; + long unsigned int start; + long unsigned int end; + unsigned int fullmm: 1; + unsigned int need_flush_all: 1; + unsigned int freed_tables: 1; + unsigned int cleared_ptes: 1; + unsigned int cleared_pmds: 1; + unsigned int cleared_puds: 1; + unsigned int cleared_p4ds: 1; + unsigned int vma_exec: 1; + unsigned int vma_huge: 1; + unsigned int batch_count; + struct mmu_gather_batch *active; + struct mmu_gather_batch local; + struct page *__pages[8]; +}; + +enum compact_priority { + COMPACT_PRIO_SYNC_FULL = 0, + MIN_COMPACT_PRIORITY = 0, + COMPACT_PRIO_SYNC_LIGHT = 1, + MIN_COMPACT_COSTLY_PRIORITY = 1, + DEF_COMPACT_PRIORITY = 1, + COMPACT_PRIO_ASYNC = 2, + INIT_COMPACT_PRIORITY = 2, +}; + +enum compact_result { + COMPACT_NOT_SUITABLE_ZONE = 0, + COMPACT_SKIPPED = 1, + COMPACT_DEFERRED = 2, + COMPACT_NO_SUITABLE_PAGE = 3, + COMPACT_CONTINUE = 4, + COMPACT_COMPLETE = 5, + COMPACT_PARTIAL_SKIPPED = 6, + COMPACT_CONTENDED = 7, + COMPACT_SUCCESS = 8, +}; + +struct trace_event_raw_oom_score_adj_update { + struct trace_entry ent; + pid_t pid; + char comm[16]; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_reclaim_retry_zone { + struct trace_entry ent; + int node; + int zone_idx; + int order; + long unsigned int reclaimable; + long unsigned int available; + long unsigned int min_wmark; + int no_progress_loops; + bool wmark_check; + char __data[0]; +}; + +struct trace_event_raw_mark_victim { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_wake_reaper { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_start_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_finish_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_skip_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_compact_retry { + struct trace_entry ent; + int order; + int priority; + int result; + int retries; + int max_retries; + bool ret; + char __data[0]; +}; + +struct trace_event_data_offsets_oom_score_adj_update {}; + +struct trace_event_data_offsets_reclaim_retry_zone {}; + +struct trace_event_data_offsets_mark_victim {}; + +struct trace_event_data_offsets_wake_reaper {}; + +struct trace_event_data_offsets_start_task_reaping {}; + +struct trace_event_data_offsets_finish_task_reaping {}; + +struct trace_event_data_offsets_skip_task_reaping {}; + +struct trace_event_data_offsets_compact_retry {}; + +typedef void (*btf_trace_oom_score_adj_update)(void *, struct task_struct *); + +typedef void (*btf_trace_reclaim_retry_zone)(void *, struct zoneref *, int, long unsigned int, long unsigned int, long unsigned int, int, bool); + +typedef void (*btf_trace_mark_victim)(void *, int); + +typedef void (*btf_trace_wake_reaper)(void *, int); + +typedef void (*btf_trace_start_task_reaping)(void *, int); + +typedef void (*btf_trace_finish_task_reaping)(void *, int); + +typedef void (*btf_trace_skip_task_reaping)(void *, int); + +typedef void (*btf_trace_compact_retry)(void *, int, enum compact_priority, enum compact_result, int, int, bool); + +enum wb_congested_state { + WB_async_congested = 0, + WB_sync_congested = 1, +}; + +enum { + XA_CHECK_SCHED = 4096, +}; + +enum wb_state { + WB_registered = 0, + WB_writeback_running = 1, + WB_has_dirty_io = 2, + WB_start_all = 3, +}; + +struct wb_lock_cookie { + bool locked; + long unsigned int flags; +}; + +typedef int (*writepage_t)(struct page *, struct writeback_control *, void *); + +enum page_memcg_data_flags { + MEMCG_DATA_OBJCGS = 1, + MEMCG_DATA_KMEM = 2, + __NR_MEMCG_DATA_FLAGS = 4, +}; + +struct dirty_throttle_control { + struct wb_domain *dom; + struct dirty_throttle_control *gdtc; + struct bdi_writeback *wb; + struct fprop_local_percpu *wb_completions; + long unsigned int avail; + long unsigned int dirty; + long unsigned int thresh; + long unsigned int bg_thresh; + long unsigned int wb_dirty; + long unsigned int wb_thresh; + long unsigned int wb_bg_thresh; + long unsigned int pos_ratio; +}; + +typedef void compound_page_dtor(struct page *); + +struct trace_event_raw_mm_lru_insertion { + struct trace_entry ent; + struct folio *folio; + long unsigned int pfn; + enum lru_list lru; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_mm_lru_activate { + struct trace_entry ent; + struct folio *folio; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_lru_insertion {}; + +struct trace_event_data_offsets_mm_lru_activate {}; + +typedef void (*btf_trace_mm_lru_insertion)(void *, struct folio *); + +typedef void (*btf_trace_mm_lru_activate)(void *, struct folio *); + +struct lru_rotate { + local_lock_t lock; + struct pagevec pvec; +}; + +struct lru_pvecs { + local_lock_t lock; + struct pagevec lru_add; + struct pagevec lru_deactivate_file; + struct pagevec lru_deactivate; + struct pagevec lru_lazyfree; + struct pagevec activate_page; +}; + +enum lruvec_flags { + LRUVEC_CONGESTED = 0, +}; + +enum pgdat_flags { + PGDAT_DIRTY = 0, + PGDAT_WRITEBACK = 1, + PGDAT_RECLAIM_LOCKED = 2, +}; + +enum zone_flags { + ZONE_BOOSTED_WATERMARK = 0, + ZONE_RECLAIM_ACTIVE = 1, +}; + +struct reclaim_stat { + unsigned int nr_dirty; + unsigned int nr_unqueued_dirty; + unsigned int nr_congested; + unsigned int nr_writeback; + unsigned int nr_immediate; + unsigned int nr_pageout; + unsigned int nr_activate[2]; + unsigned int nr_ref_keep; + unsigned int nr_unmap_fail; + unsigned int nr_lazyfree_fail; +}; + +struct mem_cgroup_reclaim_cookie { + pg_data_t *pgdat; + unsigned int generation; +}; + +enum ttu_flags { + TTU_SPLIT_HUGE_PMD = 4, + TTU_IGNORE_MLOCK = 8, + TTU_SYNC = 16, + TTU_IGNORE_HWPOISON = 32, + TTU_BATCH_FLUSH = 64, + TTU_RMAP_LOCKED = 128, +}; + +typedef struct page *new_page_t(struct page *, long unsigned int); + +typedef void free_page_t(struct page *, long unsigned int); + +struct migration_target_control { + int nid; + nodemask_t *nmask; + gfp_t gfp_mask; +}; + +struct trace_event_raw_mm_vmscan_kswapd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_kswapd_wake { + struct trace_entry ent; + int nid; + int zid; + int order; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_wakeup_kswapd { + struct trace_entry ent; + int nid; + int zid; + int order; + gfp_t gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_begin_template { + struct trace_entry ent; + int order; + gfp_t gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_end_template { + struct trace_entry ent; + long unsigned int nr_reclaimed; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_start { + struct trace_entry ent; + struct shrinker *shr; + void *shrink; + int nid; + long int nr_objects_to_shrink; + gfp_t gfp_flags; + long unsigned int cache_items; + long long unsigned int delta; + long unsigned int total_scan; + int priority; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_end { + struct trace_entry ent; + struct shrinker *shr; + int nid; + void *shrink; + long int unused_scan; + long int new_scan; + int retval; + long int total_scan; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_isolate { + struct trace_entry ent; + int highest_zoneidx; + int order; + long unsigned int nr_requested; + long unsigned int nr_scanned; + long unsigned int nr_skipped; + long unsigned int nr_taken; + isolate_mode_t isolate_mode; + int lru; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_writepage { + struct trace_entry ent; + long unsigned int pfn; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_inactive { + struct trace_entry ent; + int nid; + long unsigned int nr_scanned; + long unsigned int nr_reclaimed; + long unsigned int nr_dirty; + long unsigned int nr_writeback; + long unsigned int nr_congested; + long unsigned int nr_immediate; + unsigned int nr_activate0; + unsigned int nr_activate1; + long unsigned int nr_ref_keep; + long unsigned int nr_unmap_fail; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_active { + struct trace_entry ent; + int nid; + long unsigned int nr_taken; + long unsigned int nr_active; + long unsigned int nr_deactivated; + long unsigned int nr_referenced; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_node_reclaim_begin { + struct trace_entry ent; + int nid; + int order; + gfp_t gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_throttled { + struct trace_entry ent; + int nid; + int usec_timeout; + int usec_delayed; + int reason; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_sleep {}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_wake {}; + +struct trace_event_data_offsets_mm_vmscan_wakeup_kswapd {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_begin_template {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_end_template {}; + +struct trace_event_data_offsets_mm_shrink_slab_start {}; + +struct trace_event_data_offsets_mm_shrink_slab_end {}; + +struct trace_event_data_offsets_mm_vmscan_lru_isolate {}; + +struct trace_event_data_offsets_mm_vmscan_writepage {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_inactive {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_active {}; + +struct trace_event_data_offsets_mm_vmscan_node_reclaim_begin {}; + +struct trace_event_data_offsets_mm_vmscan_throttled {}; + +typedef void (*btf_trace_mm_vmscan_kswapd_sleep)(void *, int); + +typedef void (*btf_trace_mm_vmscan_kswapd_wake)(void *, int, int, int); + +typedef void (*btf_trace_mm_vmscan_wakeup_kswapd)(void *, int, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_shrink_slab_start)(void *, struct shrinker *, struct shrink_control *, long int, long unsigned int, long long unsigned int, long unsigned int, int); + +typedef void (*btf_trace_mm_shrink_slab_end)(void *, struct shrinker *, int, int, long int, long int, long int); + +typedef void (*btf_trace_mm_vmscan_lru_isolate)(void *, int, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, isolate_mode_t, int); + +typedef void (*btf_trace_mm_vmscan_writepage)(void *, struct page *); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_inactive)(void *, int, long unsigned int, long unsigned int, struct reclaim_stat *, int, int); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_active)(void *, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int, int); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_begin)(void *, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_throttled)(void *, int, int, int, int); + +struct scan_control { + long unsigned int nr_to_reclaim; + nodemask_t *nodemask; + struct mem_cgroup *target_mem_cgroup; + long unsigned int anon_cost; + long unsigned int file_cost; + unsigned int may_deactivate: 2; + unsigned int force_deactivate: 1; + unsigned int skipped_deactivate: 1; + unsigned int may_writepage: 1; + unsigned int may_unmap: 1; + unsigned int may_swap: 1; + unsigned int memcg_low_reclaim: 1; + unsigned int memcg_low_skipped: 1; + unsigned int hibernation_mode: 1; + unsigned int compaction_ready: 1; + unsigned int cache_trim_mode: 1; + unsigned int file_is_tiny: 1; + unsigned int no_demotion: 1; + s8 order; + s8 priority; + s8 reclaim_idx; + gfp_t gfp_mask; + long unsigned int nr_scanned; + long unsigned int nr_reclaimed; + struct { + unsigned int dirty; + unsigned int unqueued_dirty; + unsigned int congested; + unsigned int writeback; + unsigned int immediate; + unsigned int file_taken; + unsigned int taken; + } nr; + struct reclaim_state reclaim_state; +}; + +typedef enum { + PAGE_KEEP = 0, + PAGE_ACTIVATE = 1, + PAGE_SUCCESS = 2, + PAGE_CLEAN = 3, +} pageout_t; + +enum page_references { + PAGEREF_RECLAIM = 0, + PAGEREF_RECLAIM_CLEAN = 1, + PAGEREF_KEEP = 2, + PAGEREF_ACTIVATE = 3, +}; + +enum scan_balance { + SCAN_EQUAL = 0, + SCAN_FRACT = 1, + SCAN_ANON = 2, + SCAN_FILE = 3, +}; + +enum transparent_hugepage_flag { + TRANSPARENT_HUGEPAGE_NEVER_DAX = 0, + TRANSPARENT_HUGEPAGE_FLAG = 1, + TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG = 2, + TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG = 3, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG = 4, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG = 5, + TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG = 6, + TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG = 7, + TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG = 8, +}; + +struct xattr; + +typedef int (*initxattrs)(struct inode *, const struct xattr *, void *); + +struct xattr { + const char *name; + void *value; + size_t value_len; +}; + +struct constant_table { + const char *name; + int value; +}; + +enum { + MPOL_DEFAULT = 0, + MPOL_PREFERRED = 1, + MPOL_BIND = 2, + MPOL_INTERLEAVE = 3, + MPOL_LOCAL = 4, + MPOL_PREFERRED_MANY = 5, + MPOL_MAX = 6, +}; + +struct shared_policy { + struct rb_root root; + rwlock_t lock; +}; + +struct simple_xattrs { + struct list_head head; + spinlock_t lock; +}; + +struct simple_xattr { + struct list_head list; + char *name; + size_t size; + char value[0]; +}; + +struct shmem_inode_info { + spinlock_t lock; + unsigned int seals; + long unsigned int flags; + long unsigned int alloced; + long unsigned int swapped; + long unsigned int fallocend; + struct list_head shrinklist; + struct list_head swaplist; + struct shared_policy policy; + struct simple_xattrs xattrs; + atomic_t stop_eviction; + struct inode vfs_inode; +}; + +struct shmem_sb_info { + long unsigned int max_blocks; + struct percpu_counter used_blocks; + long unsigned int max_inodes; + long unsigned int free_inodes; + raw_spinlock_t stat_lock; + umode_t mode; + unsigned char huge; + kuid_t uid; + kgid_t gid; + bool full_inums; + ino_t next_ino; + ino_t *ino_batch; + struct mempolicy *mpol; + spinlock_t shrinklist_lock; + struct list_head shrinklist; + long unsigned int shrinklist_len; +}; + +enum sgp_type { + SGP_READ = 0, + SGP_NOALLOC = 1, + SGP_CACHE = 2, + SGP_WRITE = 3, + SGP_FALLOC = 4, +}; + +enum fid_type { + FILEID_ROOT = 0, + FILEID_INO32_GEN = 1, + FILEID_INO32_GEN_PARENT = 2, + FILEID_BTRFS_WITHOUT_PARENT = 77, + FILEID_BTRFS_WITH_PARENT = 78, + FILEID_BTRFS_WITH_PARENT_ROOT = 79, + FILEID_UDF_WITHOUT_PARENT = 81, + FILEID_UDF_WITH_PARENT = 82, + FILEID_NILFS_WITHOUT_PARENT = 97, + FILEID_NILFS_WITH_PARENT = 98, + FILEID_FAT_WITHOUT_PARENT = 113, + FILEID_FAT_WITH_PARENT = 114, + FILEID_LUSTRE = 151, + FILEID_KERNFS = 254, + FILEID_INVALID = 255, +}; + +struct shmem_falloc { + wait_queue_head_t *waitq; + long unsigned int start; + long unsigned int next; + long unsigned int nr_falloced; + long unsigned int nr_unswapped; +}; + +struct shmem_options { + long long unsigned int blocks; + long long unsigned int inodes; + struct mempolicy *mpol; + kuid_t uid; + kgid_t gid; + umode_t mode; + bool full_inums; + int huge; + int seen; +}; + +enum shmem_param { + Opt_gid = 0, + Opt_huge = 1, + Opt_mode = 2, + Opt_mpol = 3, + Opt_nr_blocks = 4, + Opt_nr_inodes = 5, + Opt_size = 6, + Opt_uid = 7, + Opt_inode32 = 8, + Opt_inode64 = 9, +}; + +enum writeback_stat_item { + NR_DIRTY_THRESHOLD = 0, + NR_DIRTY_BG_THRESHOLD = 1, + NR_VM_WRITEBACK_STAT_ITEMS = 2, +}; + +struct contig_page_info { + long unsigned int free_pages; + long unsigned int free_blocks_total; + long unsigned int free_blocks_suitable; +}; + +struct radix_tree_iter { + long unsigned int index; + long unsigned int next_index; + long unsigned int tags; + struct xa_node *node; +}; + +enum { + RADIX_TREE_ITER_TAG_MASK = 15, + RADIX_TREE_ITER_TAGGED = 16, + RADIX_TREE_ITER_CONTIG = 32, +}; + +struct pcpu_group_info { + int nr_units; + long unsigned int base_offset; + unsigned int *cpu_map; +}; + +struct pcpu_alloc_info { + size_t static_size; + size_t reserved_size; + size_t dyn_size; + size_t unit_size; + size_t atom_size; + size_t alloc_size; + size_t __ai_size; + int nr_groups; + struct pcpu_group_info groups[0]; +}; + +typedef void * (*pcpu_fc_alloc_fn_t)(unsigned int, size_t, size_t); + +typedef void (*pcpu_fc_free_fn_t)(void *, size_t); + +typedef void (*pcpu_fc_populate_pte_fn_t)(long unsigned int); + +typedef int pcpu_fc_cpu_distance_fn_t(unsigned int, unsigned int); + +struct trace_event_raw_percpu_alloc_percpu { + struct trace_entry ent; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + void *base_addr; + int off; + void *ptr; + char __data[0]; +}; + +struct trace_event_raw_percpu_free_percpu { + struct trace_entry ent; + void *base_addr; + int off; + void *ptr; + char __data[0]; +}; + +struct trace_event_raw_percpu_alloc_percpu_fail { + struct trace_entry ent; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + char __data[0]; +}; + +struct trace_event_raw_percpu_create_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_raw_percpu_destroy_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_data_offsets_percpu_alloc_percpu {}; + +struct trace_event_data_offsets_percpu_free_percpu {}; + +struct trace_event_data_offsets_percpu_alloc_percpu_fail {}; + +struct trace_event_data_offsets_percpu_create_chunk {}; + +struct trace_event_data_offsets_percpu_destroy_chunk {}; + +typedef void (*btf_trace_percpu_alloc_percpu)(void *, bool, bool, size_t, size_t, void *, int, void *); + +typedef void (*btf_trace_percpu_free_percpu)(void *, void *, int, void *); + +typedef void (*btf_trace_percpu_alloc_percpu_fail)(void *, bool, bool, size_t, size_t); + +typedef void (*btf_trace_percpu_create_chunk)(void *, void *); + +typedef void (*btf_trace_percpu_destroy_chunk)(void *, void *); + +struct pcpu_block_md { + int scan_hint; + int scan_hint_start; + int contig_hint; + int contig_hint_start; + int left_free; + int right_free; + int first_free; + int nr_bits; +}; + +struct pcpu_chunk { + struct list_head list; + int free_bytes; + struct pcpu_block_md chunk_md; + void *base_addr; + long unsigned int *alloc_map; + long unsigned int *bound_map; + struct pcpu_block_md *md_blocks; + void *data; + bool immutable; + bool isolated; + int start_offset; + int end_offset; + struct obj_cgroup **obj_cgroups; + int nr_pages; + int nr_populated; + int nr_empty_pop_pages; + long unsigned int populated[0]; +}; + +struct trace_event_raw_kmem_alloc { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + gfp_t gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_kmem_alloc_node { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + gfp_t gfp_flags; + int node; + char __data[0]; +}; + +struct trace_event_raw_kfree { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + char __data[0]; +}; + +struct trace_event_raw_kmem_cache_free { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free_batched { + struct trace_entry ent; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + gfp_t gfp_flags; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page_pcpu_drain { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc_extfrag { + struct trace_entry ent; + long unsigned int pfn; + int alloc_order; + int fallback_order; + int alloc_migratetype; + int fallback_migratetype; + int change_ownership; + char __data[0]; +}; + +struct trace_event_raw_rss_stat { + struct trace_entry ent; + unsigned int mm_id; + unsigned int curr; + int member; + long int size; + char __data[0]; +}; + +struct trace_event_data_offsets_kmem_alloc {}; + +struct trace_event_data_offsets_kmem_alloc_node {}; + +struct trace_event_data_offsets_kfree {}; + +struct trace_event_data_offsets_kmem_cache_free { + u32 name; +}; + +struct trace_event_data_offsets_mm_page_free {}; + +struct trace_event_data_offsets_mm_page_free_batched {}; + +struct trace_event_data_offsets_mm_page_alloc {}; + +struct trace_event_data_offsets_mm_page {}; + +struct trace_event_data_offsets_mm_page_pcpu_drain {}; + +struct trace_event_data_offsets_mm_page_alloc_extfrag {}; + +struct trace_event_data_offsets_rss_stat {}; + +typedef void (*btf_trace_kmalloc)(void *, long unsigned int, const void *, size_t, size_t, gfp_t); + +typedef void (*btf_trace_kmem_cache_alloc)(void *, long unsigned int, const void *, size_t, size_t, gfp_t); + +typedef void (*btf_trace_kmalloc_node)(void *, long unsigned int, const void *, size_t, size_t, gfp_t, int); + +typedef void (*btf_trace_kmem_cache_alloc_node)(void *, long unsigned int, const void *, size_t, size_t, gfp_t, int); + +typedef void (*btf_trace_kfree)(void *, long unsigned int, const void *); + +typedef void (*btf_trace_kmem_cache_free)(void *, long unsigned int, const void *, const char *); + +typedef void (*btf_trace_mm_page_free)(void *, struct page *, unsigned int); + +typedef void (*btf_trace_mm_page_free_batched)(void *, struct page *); + +typedef void (*btf_trace_mm_page_alloc)(void *, struct page *, unsigned int, gfp_t, int); + +typedef void (*btf_trace_mm_page_alloc_zone_locked)(void *, struct page *, unsigned int, int); + +typedef void (*btf_trace_mm_page_pcpu_drain)(void *, struct page *, unsigned int, int); + +typedef void (*btf_trace_mm_page_alloc_extfrag)(void *, struct page *, int, int, int, int); + +typedef void (*btf_trace_rss_stat)(void *, struct mm_struct *, int, long int); + +enum slab_state { + DOWN = 0, + PARTIAL = 1, + PARTIAL_NODE = 2, + UP = 3, + FULL = 4, +}; + +struct kmalloc_info_struct { + const char *name[4]; + unsigned int size; +}; + +struct slabinfo { + long unsigned int active_objs; + long unsigned int num_objs; + long unsigned int active_slabs; + long unsigned int num_slabs; + long unsigned int shared_avail; + unsigned int limit; + unsigned int batchcount; + unsigned int shared; + unsigned int objects_per_slab; + unsigned int cache_order; +}; + +struct kmem_obj_info { + void *kp_ptr; + struct page *kp_page; + void *kp_objp; + long unsigned int kp_data_offset; + struct kmem_cache *kp_slab_cache; + void *kp_ret; + void *kp_stack[16]; + void *kp_free_stack[16]; +}; + +enum pageblock_bits { + PB_migrate = 0, + PB_migrate_end = 2, + PB_migrate_skip = 3, + NR_PAGEBLOCK_BITS = 4, +}; + +struct node { + struct device dev; + struct list_head access_list; + struct work_struct node_work; + struct list_head cache_attrs; + struct device *cache_dev; +}; + +struct alloc_context { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct zoneref *preferred_zoneref; + int migratetype; + enum zone_type highest_zoneidx; + bool spread_dirty_pages; +}; + +struct trace_event_raw_mm_compaction_isolate_template { + struct trace_entry ent; + long unsigned int start_pfn; + long unsigned int end_pfn; + long unsigned int nr_scanned; + long unsigned int nr_taken; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_migratepages { + struct trace_entry ent; + long unsigned int nr_migrated; + long unsigned int nr_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_begin { + struct trace_entry ent; + long unsigned int zone_start; + long unsigned int migrate_pfn; + long unsigned int free_pfn; + long unsigned int zone_end; + bool sync; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_end { + struct trace_entry ent; + long unsigned int zone_start; + long unsigned int migrate_pfn; + long unsigned int free_pfn; + long unsigned int zone_end; + bool sync; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_try_to_compact_pages { + struct trace_entry ent; + int order; + gfp_t gfp_mask; + int prio; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_suitable_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + int ret; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_defer_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + unsigned int considered; + unsigned int defer_shift; + int order_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_kcompactd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_kcompactd_wake_template { + struct trace_entry ent; + int nid; + int order; + enum zone_type highest_zoneidx; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_compaction_isolate_template {}; + +struct trace_event_data_offsets_mm_compaction_migratepages {}; + +struct trace_event_data_offsets_mm_compaction_begin {}; + +struct trace_event_data_offsets_mm_compaction_end {}; + +struct trace_event_data_offsets_mm_compaction_try_to_compact_pages {}; + +struct trace_event_data_offsets_mm_compaction_suitable_template {}; + +struct trace_event_data_offsets_mm_compaction_defer_template {}; + +struct trace_event_data_offsets_mm_compaction_kcompactd_sleep {}; + +struct trace_event_data_offsets_kcompactd_wake_template {}; + +typedef void (*btf_trace_mm_compaction_isolate_migratepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_mm_compaction_isolate_freepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_mm_compaction_migratepages)(void *, long unsigned int, int, struct list_head *); + +typedef void (*btf_trace_mm_compaction_begin)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, bool); + +typedef void (*btf_trace_mm_compaction_end)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, bool, int); + +typedef void (*btf_trace_mm_compaction_try_to_compact_pages)(void *, int, gfp_t, int); + +typedef void (*btf_trace_mm_compaction_finished)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_suitable)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_deferred)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_defer_compaction)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_defer_reset)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_kcompactd_sleep)(void *, int); + +typedef void (*btf_trace_mm_compaction_wakeup_kcompactd)(void *, int, int, enum zone_type); + +typedef void (*btf_trace_mm_compaction_kcompactd_wake)(void *, int, int, enum zone_type); + +typedef enum { + ISOLATE_ABORT = 0, + ISOLATE_NONE = 1, + ISOLATE_SUCCESS = 2, +} isolate_migrate_t; + +struct anon_vma_chain { + struct vm_area_struct *vma; + struct anon_vma *anon_vma; + struct list_head same_vma; + struct rb_node rb; + long unsigned int rb_subtree_last; +}; + +struct rb_augment_callbacks { + void (*propagate)(struct rb_node *, struct rb_node *); + void (*copy)(struct rb_node *, struct rb_node *); + void (*rotate)(struct rb_node *, struct rb_node *); +}; + +enum lru_status { + LRU_REMOVED = 0, + LRU_REMOVED_RETRY = 1, + LRU_ROTATE = 2, + LRU_SKIP = 3, + LRU_RETRY = 4, +}; + +typedef enum lru_status (*list_lru_walk_cb)(struct list_head *, struct list_lru_one *, spinlock_t *, void *); + +typedef struct { + long unsigned int pd; +} hugepd_t; + +struct follow_page_context { + struct dev_pagemap *pgmap; + unsigned int page_mask; +}; + +struct trace_event_raw_mmap_lock { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + char __data[0]; +}; + +struct trace_event_raw_mmap_lock_acquire_returned { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + bool success; + char __data[0]; +}; + +struct trace_event_data_offsets_mmap_lock { + u32 memcg_path; +}; + +struct trace_event_data_offsets_mmap_lock_acquire_returned { + u32 memcg_path; +}; + +typedef void (*btf_trace_mmap_lock_start_locking)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_mmap_lock_released)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_mmap_lock_acquire_returned)(void *, struct mm_struct *, const char *, bool, bool); + +struct memcg_path { + local_lock_t lock; + char *buf; + local_t buf_idx; +}; + +typedef struct { + u64 val; +} pfn_t; + +typedef unsigned int pgtbl_mod_mask; + +enum { + SWP_USED = 1, + SWP_WRITEOK = 2, + SWP_DISCARDABLE = 4, + SWP_DISCARDING = 8, + SWP_SOLIDSTATE = 16, + SWP_CONTINUED = 32, + SWP_BLKDEV = 64, + SWP_ACTIVATED = 128, + SWP_FS_OPS = 256, + SWP_AREA_DISCARD = 512, + SWP_PAGE_DISCARD = 1024, + SWP_STABLE_WRITES = 2048, + SWP_SYNCHRONOUS_IO = 4096, + SWP_SCANNING = 16384, +}; + +struct copy_subpage_arg { + struct page *dst; + struct page *src; + struct vm_area_struct *vma; +}; + +struct mm_walk; + +struct mm_walk_ops { + int (*pgd_entry)(pgd_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*p4d_entry)(p4d_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pud_entry)(pud_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pmd_entry)(pmd_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pte_entry)(pte_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pte_hole)(long unsigned int, long unsigned int, int, struct mm_walk *); + int (*hugetlb_entry)(pte_t *, long unsigned int, long unsigned int, long unsigned int, struct mm_walk *); + int (*test_walk)(long unsigned int, long unsigned int, struct mm_walk *); + int (*pre_vma)(long unsigned int, long unsigned int, struct mm_walk *); + void (*post_vma)(struct mm_walk *); +}; + +enum page_walk_action { + ACTION_SUBTREE = 0, + ACTION_CONTINUE = 1, + ACTION_AGAIN = 2, +}; + +struct mm_walk { + const struct mm_walk_ops *ops; + struct mm_struct *mm; + pgd_t *pgd; + struct vm_area_struct *vma; + enum page_walk_action action; + bool no_vma; + void *private; +}; + +struct vm_unmapped_area_info { + long unsigned int flags; + long unsigned int length; + long unsigned int low_limit; + long unsigned int high_limit; + long unsigned int align_mask; + long unsigned int align_offset; +}; + +enum { + HUGETLB_SHMFS_INODE = 1, + HUGETLB_ANONHUGE_INODE = 2, +}; + +struct trace_event_raw_vm_unmapped_area { + struct trace_entry ent; + long unsigned int addr; + long unsigned int total_vm; + long unsigned int flags; + long unsigned int length; + long unsigned int low_limit; + long unsigned int high_limit; + long unsigned int align_mask; + long unsigned int align_offset; + char __data[0]; +}; + +struct trace_event_data_offsets_vm_unmapped_area {}; + +typedef void (*btf_trace_vm_unmapped_area)(void *, long unsigned int, struct vm_unmapped_area_info *); + +enum pgt_entry { + NORMAL_PMD = 0, + HPAGE_PMD = 1, + NORMAL_PUD = 2, + HPAGE_PUD = 3, +}; + +struct rmap_walk_control { + void *arg; + bool (*rmap_one)(struct page *, struct vm_area_struct *, long unsigned int, void *); + int (*done)(struct page *); + struct anon_vma * (*anon_lock)(struct page *); + bool (*invalid_vma)(struct vm_area_struct *, void *); +}; + +struct page_referenced_arg { + int mapcount; + int referenced; + long unsigned int vm_flags; + struct mem_cgroup *memcg; +}; + +struct make_exclusive_args { + struct mm_struct *mm; + long unsigned int address; + void *owner; + bool valid; +}; + +struct vmap_area { + long unsigned int va_start; + long unsigned int va_end; + struct rb_node rb_node; + struct list_head list; + union { + long unsigned int subtree_max_size; + struct vm_struct *vm; + }; +}; + +struct vfree_deferred { + struct llist_head list; + struct work_struct wq; +}; + +enum fit_type { + NOTHING_FIT = 0, + FL_FIT_TYPE = 1, + LE_FIT_TYPE = 2, + RE_FIT_TYPE = 3, + NE_FIT_TYPE = 4, +}; + +struct vmap_block_queue { + spinlock_t lock; + struct list_head free; +}; + +struct vmap_block { + spinlock_t lock; + struct vmap_area *va; + long unsigned int free; + long unsigned int dirty; + long unsigned int dirty_min; + long unsigned int dirty_max; + struct list_head free_list; + struct callback_head callback_head; + struct list_head purge; +}; + +struct vmap_pfn_data { + long unsigned int *pfns; + pgprot_t prot; + unsigned int idx; +}; + +struct page_frag_cache { + void *va; + __u16 offset; + __u16 size; + unsigned int pagecnt_bias; + bool pfmemalloc; +}; + +enum mminit_level { + MMINIT_WARNING = 0, + MMINIT_VERIFY = 1, + MMINIT_TRACE = 2, +}; + +typedef int fpi_t; + +struct pagesets { + local_lock_t lock; +}; + +struct pcpu_drain { + struct zone *zone; + struct work_struct work; +}; + +struct mminit_pfnnid_cache { + long unsigned int last_start; + long unsigned int last_end; + int last_nid; +}; + +enum { + MMOP_OFFLINE = 0, + MMOP_ONLINE = 1, + MMOP_ONLINE_KERNEL = 2, + MMOP_ONLINE_MOVABLE = 3, +}; + +typedef int mhp_t; + +typedef void (*online_page_callback_t)(struct page *, unsigned int); + +struct memory_group { + int nid; + struct list_head memory_blocks; + long unsigned int present_kernel_pages; + long unsigned int present_movable_pages; + bool is_dynamic; + union { + struct { + long unsigned int max_pages; + } s; + struct { + long unsigned int unit_pages; + } d; + }; +}; + +struct memory_block { + long unsigned int start_section_nr; + long unsigned int state; + int online_type; + int nid; + struct device dev; + long unsigned int nr_vmemmap_pages; + struct memory_group *group; + struct list_head group_next; +}; + +typedef int (*walk_memory_blocks_func_t)(struct memory_block *, void *); + +typedef int (*walk_memory_groups_func_t)(struct memory_group *, void *); + +enum hugetlb_page_flags { + HPG_restore_reserve = 0, + HPG_migratable = 1, + HPG_temporary = 2, + HPG_freed = 3, + HPG_vmemmap_optimized = 4, + __NR_HPAGEFLAGS = 5, +}; + +enum { + ONLINE_POLICY_CONTIG_ZONES = 0, + ONLINE_POLICY_AUTO_MOVABLE = 1, +}; + +struct auto_movable_stats { + long unsigned int kernel_early_pages; + long unsigned int movable_pages; +}; + +struct auto_movable_group_stats { + long unsigned int movable_pages; + long unsigned int req_kernel_early_pages; +}; + +enum mf_flags { + MF_COUNT_INCREASED = 1, + MF_ACTION_REQUIRED = 2, + MF_MUST_KILL = 4, + MF_SOFT_OFFLINE = 8, +}; + +struct madvise_walk_private { + struct mmu_gather *tlb; + bool pageout; +}; + +enum { + BIO_NO_PAGE_REF = 0, + BIO_CLONED = 1, + BIO_BOUNCED = 2, + BIO_WORKINGSET = 3, + BIO_QUIET = 4, + BIO_CHAIN = 5, + BIO_REFFED = 6, + BIO_THROTTLED = 7, + BIO_TRACE_COMPLETION = 8, + BIO_CGROUP_ACCT = 9, + BIO_TRACKED = 10, + BIO_REMAPPED = 11, + BIO_ZONE_WRITE_LOCKED = 12, + BIO_PERCPU_CACHE = 13, + BIO_FLAG_LAST = 14, +}; + +struct vma_swap_readahead { + short unsigned int win; + short unsigned int offset; + short unsigned int nr_pte; + pte_t *ptes; +}; + +enum { + PERCPU_REF_INIT_ATOMIC = 1, + PERCPU_REF_INIT_DEAD = 2, + PERCPU_REF_ALLOW_REINIT = 4, +}; + +union swap_header { + struct { + char reserved[4086]; + char magic[10]; + } magic; + struct { + char bootbits[1024]; + __u32 version; + __u32 last_page; + __u32 nr_badpages; + unsigned char sws_uuid[16]; + unsigned char sws_volume[16]; + __u32 padding[117]; + __u32 badpages[1]; + } info; +}; + +struct swap_extent { + struct rb_node rb_node; + long unsigned int start_page; + long unsigned int nr_pages; + sector_t start_block; +}; + +struct swap_slots_cache { + bool lock_initialized; + struct mutex alloc_lock; + swp_entry_t *slots; + int nr; + int cur; + spinlock_t free_lock; + swp_entry_t *slots_ret; + int n_ret; +}; + +struct frontswap_ops { + void (*init)(unsigned int); + int (*store)(unsigned int, long unsigned int, struct page *); + int (*load)(unsigned int, long unsigned int, struct page *); + void (*invalidate_page)(unsigned int, long unsigned int); + void (*invalidate_area)(unsigned int); + struct frontswap_ops *next; +}; + +struct crypto_async_request; + +typedef void (*crypto_completion_t)(struct crypto_async_request *, int); + +struct crypto_async_request { + struct list_head list; + crypto_completion_t complete; + void *data; + struct crypto_tfm *tfm; + u32 flags; +}; + +struct crypto_wait { + struct completion completion; + int err; +}; + +struct zpool; + +struct zpool_ops { + int (*evict)(struct zpool *, long unsigned int); +}; + +enum zpool_mapmode { + ZPOOL_MM_RW = 0, + ZPOOL_MM_RO = 1, + ZPOOL_MM_WO = 2, + ZPOOL_MM_DEFAULT = 0, +}; + +struct acomp_req { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int slen; + unsigned int dlen; + u32 flags; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_acomp { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +struct crypto_acomp_ctx { + struct crypto_acomp *acomp; + struct acomp_req *req; + struct crypto_wait wait; + u8 *dstmem; + struct mutex *mutex; +}; + +struct zswap_pool { + struct zpool *zpool; + struct crypto_acomp_ctx *acomp_ctx; + struct kref kref; + struct list_head list; + struct work_struct release_work; + struct work_struct shrink_work; + struct hlist_node node; + char tfm_name[128]; +}; + +struct zswap_entry { + struct rb_node rbnode; + long unsigned int offset; + int refcount; + unsigned int length; + struct zswap_pool *pool; + union { + long unsigned int handle; + long unsigned int value; + }; +}; + +struct zswap_header { + swp_entry_t swpentry; +}; + +struct zswap_tree { + struct rb_root rbroot; + spinlock_t lock; +}; + +enum zswap_get_swap_ret { + ZSWAP_SWAPCACHE_NEW = 0, + ZSWAP_SWAPCACHE_EXIST = 1, + ZSWAP_SWAPCACHE_FAIL = 2, +}; + +struct dma_pool { + struct list_head page_list; + spinlock_t lock; + size_t size; + struct device *dev; + size_t allocation; + size_t boundary; + char name[32]; + struct list_head pools; +}; + +struct dma_page { + struct list_head page_list; + void *vaddr; + dma_addr_t dma; + unsigned int in_use; + unsigned int offset; +}; + +enum string_size_units { + STRING_UNITS_10 = 0, + STRING_UNITS_2 = 1, +}; + +typedef void (*node_registration_func_t)(struct node *); + +enum mcopy_atomic_mode { + MCOPY_ATOMIC_NORMAL = 0, + MCOPY_ATOMIC_ZEROPAGE = 1, + MCOPY_ATOMIC_CONTINUE = 2, +}; + +enum { + SUBPAGE_INDEX_SUBPOOL = 1, + SUBPAGE_INDEX_CGROUP = 2, + SUBPAGE_INDEX_CGROUP_RSVD = 3, + __MAX_CGROUP_SUBPAGE_INDEX = 3, + __NR_USED_SUBPAGE = 4, +}; + +struct resv_map { + struct kref refs; + spinlock_t lock; + struct list_head regions; + long int adds_in_progress; + struct list_head region_cache; + long int region_cache_count; + struct page_counter *reservation_counter; + long unsigned int pages_per_hpage; + struct cgroup_subsys_state *css; +}; + +struct file_region { + struct list_head link; + long int from; + long int to; + struct page_counter *reservation_counter; + struct cgroup_subsys_state *css; +}; + +struct huge_bootmem_page { + struct list_head list; + struct hstate *hstate; +}; + +enum hugetlb_memory_event { + HUGETLB_MAX = 0, + HUGETLB_NR_MEMORY_EVENTS = 1, +}; + +struct hugetlb_cgroup { + struct cgroup_subsys_state css; + struct page_counter hugepage[4]; + struct page_counter rsvd_hugepage[4]; + atomic_long_t events[4]; + atomic_long_t events_local[4]; + struct cgroup_file events_file[4]; + struct cgroup_file events_local_file[4]; +}; + +enum vma_resv_mode { + VMA_NEEDS_RESV = 0, + VMA_COMMIT_RESV = 1, + VMA_END_RESV = 2, + VMA_ADD_RESV = 3, + VMA_DEL_RESV = 4, +}; + +struct node_hstate { + struct kobject *hugepages_kobj; + struct kobject *hstate_kobjs[4]; +}; + +struct nodemask_scratch { + nodemask_t mask1; + nodemask_t mask2; +}; + +struct sp_node { + struct rb_node nd; + long unsigned int start; + long unsigned int end; + struct mempolicy *policy; +}; + +struct mempolicy_operations { + int (*create)(struct mempolicy *, const nodemask_t *); + void (*rebind)(struct mempolicy *, const nodemask_t *); +}; + +struct queue_pages { + struct list_head *pagelist; + long unsigned int flags; + nodemask_t *nmask; + long unsigned int start; + long unsigned int end; + struct vm_area_struct *first; +}; + +struct vmemmap_remap_walk { + void (*remap_pte)(pte_t *, long unsigned int, struct vmemmap_remap_walk *); + long unsigned int nr_walked; + struct page *reuse_page; + long unsigned int reuse_addr; + struct list_head *vmemmap_pages; +}; + +struct mmu_notifier_subscriptions { + struct hlist_head list; + bool has_itree; + spinlock_t lock; + long unsigned int invalidate_seq; + long unsigned int active_invalidate_ranges; + struct rb_root_cached itree; + wait_queue_head_t wq; + struct hlist_head deferred_list; +}; + +struct interval_tree_node { + struct rb_node rb; + long unsigned int start; + long unsigned int last; + long unsigned int __subtree_last; +}; + +struct mmu_interval_notifier; + +struct mmu_interval_notifier_ops { + bool (*invalidate)(struct mmu_interval_notifier *, const struct mmu_notifier_range *, long unsigned int); +}; + +struct mmu_interval_notifier { + struct interval_tree_node interval_tree; + const struct mmu_interval_notifier_ops *ops; + struct mm_struct *mm; + struct hlist_node deferred_item; + long unsigned int invalidate_seq; +}; + +struct rmap_item; + +struct mm_slot { + struct hlist_node link; + struct list_head mm_list; + struct rmap_item *rmap_list; + struct mm_struct *mm; +}; + +struct stable_node; + +struct rmap_item { + struct rmap_item *rmap_list; + union { + struct anon_vma *anon_vma; + int nid; + }; + struct mm_struct *mm; + long unsigned int address; + unsigned int oldchecksum; + union { + struct rb_node node; + struct { + struct stable_node *head; + struct hlist_node hlist; + }; + }; +}; + +struct ksm_scan { + struct mm_slot *mm_slot; + long unsigned int address; + struct rmap_item **rmap_list; + long unsigned int seqnr; +}; + +struct stable_node { + union { + struct rb_node node; + struct { + struct list_head *head; + struct { + struct hlist_node hlist_dup; + struct list_head list; + }; + }; + }; + struct hlist_head hlist; + union { + long unsigned int kpfn; + long unsigned int chain_prune_time; + }; + int rmap_hlist_len; + int nid; +}; + +enum get_ksm_page_flags { + GET_KSM_PAGE_NOLOCK = 0, + GET_KSM_PAGE_LOCK = 1, + GET_KSM_PAGE_TRYLOCK = 2, +}; + +enum stat_item { + ALLOC_FASTPATH = 0, + ALLOC_SLOWPATH = 1, + FREE_FASTPATH = 2, + FREE_SLOWPATH = 3, + FREE_FROZEN = 4, + FREE_ADD_PARTIAL = 5, + FREE_REMOVE_PARTIAL = 6, + ALLOC_FROM_PARTIAL = 7, + ALLOC_SLAB = 8, + ALLOC_REFILL = 9, + ALLOC_NODE_MISMATCH = 10, + FREE_SLAB = 11, + CPUSLAB_FLUSH = 12, + DEACTIVATE_FULL = 13, + DEACTIVATE_EMPTY = 14, + DEACTIVATE_TO_HEAD = 15, + DEACTIVATE_TO_TAIL = 16, + DEACTIVATE_REMOTE_FREES = 17, + DEACTIVATE_BYPASS = 18, + ORDER_FALLBACK = 19, + CMPXCHG_DOUBLE_CPU_FAIL = 20, + CMPXCHG_DOUBLE_FAIL = 21, + CPU_PARTIAL_ALLOC = 22, + CPU_PARTIAL_FREE = 23, + CPU_PARTIAL_NODE = 24, + CPU_PARTIAL_DRAIN = 25, + NR_SLUB_STAT_ITEMS = 26, +}; + +struct track { + long unsigned int addr; + long unsigned int addrs[16]; + int cpu; + int pid; + long unsigned int when; +}; + +enum track_item { + TRACK_ALLOC = 0, + TRACK_FREE = 1, +}; + +struct slub_flush_work { + struct work_struct work; + struct kmem_cache *s; + bool skip; +}; + +struct detached_freelist { + struct page *page; + void *tail; + void *freelist; + int cnt; + struct kmem_cache *s; +}; + +struct location { + long unsigned int count; + long unsigned int addr; + long long int sum_time; + long int min_time; + long int max_time; + long int min_pid; + long int max_pid; + long unsigned int cpus[4]; + nodemask_t nodes; +}; + +struct loc_track { + long unsigned int max; + long unsigned int count; + struct location *loc; + loff_t idx; +}; + +enum slab_stat_type { + SL_ALL = 0, + SL_PARTIAL = 1, + SL_CPU = 2, + SL_OBJECTS = 3, + SL_TOTAL = 4, +}; + +struct slab_attribute { + struct attribute attr; + ssize_t (*show)(struct kmem_cache *, char *); + ssize_t (*store)(struct kmem_cache *, const char *, size_t); +}; + +struct saved_alias { + struct kmem_cache *s; + const char *name; + struct saved_alias *next; +}; + +enum slab_modes { + M_NONE = 0, + M_PARTIAL = 1, + M_FULL = 2, + M_FREE = 3, +}; + +struct kcsan_scoped_access {}; + +enum kfence_object_state { + KFENCE_OBJECT_UNUSED = 0, + KFENCE_OBJECT_ALLOCATED = 1, + KFENCE_OBJECT_FREED = 2, +}; + +struct kfence_track { + pid_t pid; + int cpu; + u64 ts_nsec; + int num_stack_entries; + long unsigned int stack_entries[64]; +}; + +struct kfence_metadata { + struct list_head list; + struct callback_head callback_head; + raw_spinlock_t lock; + enum kfence_object_state state; + long unsigned int addr; + size_t size; + struct kmem_cache *cache; + long unsigned int unprotected_page; + struct kfence_track alloc_track; + struct kfence_track free_track; + u32 alloc_stack_hash; +}; + +enum kfence_error_type { + KFENCE_ERROR_OOB = 0, + KFENCE_ERROR_UAF = 1, + KFENCE_ERROR_CORRUPTION = 2, + KFENCE_ERROR_INVALID = 3, + KFENCE_ERROR_INVALID_FREE = 4, +}; + +enum kfence_counter_id { + KFENCE_COUNTER_ALLOCATED = 0, + KFENCE_COUNTER_ALLOCS = 1, + KFENCE_COUNTER_FREES = 2, + KFENCE_COUNTER_ZOMBIES = 3, + KFENCE_COUNTER_BUGS = 4, + KFENCE_COUNTER_SKIP_INCOMPAT = 5, + KFENCE_COUNTER_SKIP_CAPACITY = 6, + KFENCE_COUNTER_SKIP_COVERED = 7, + KFENCE_COUNTER_COUNT = 8, +}; + +typedef __kernel_long_t __kernel_ptrdiff_t; + +typedef __kernel_ptrdiff_t ptrdiff_t; + +struct buffer_head; + +typedef void bh_end_io_t(struct buffer_head *, int); + +struct buffer_head { + long unsigned int b_state; + struct buffer_head *b_this_page; + struct page *b_page; + sector_t b_blocknr; + size_t b_size; + char *b_data; + struct block_device *b_bdev; + bh_end_io_t *b_end_io; + void *b_private; + struct list_head b_assoc_buffers; + struct address_space *b_assoc_map; + atomic_t b_count; + spinlock_t b_uptodate_lock; +}; + +enum migrate_vma_direction { + MIGRATE_VMA_SELECT_SYSTEM = 1, + MIGRATE_VMA_SELECT_DEVICE_PRIVATE = 2, +}; + +struct migrate_vma { + struct vm_area_struct *vma; + long unsigned int *dst; + long unsigned int *src; + long unsigned int cpages; + long unsigned int npages; + long unsigned int start; + long unsigned int end; + void *pgmap_owner; + long unsigned int flags; +}; + +enum bh_state_bits { + BH_Uptodate = 0, + BH_Dirty = 1, + BH_Lock = 2, + BH_Req = 3, + BH_Mapped = 4, + BH_New = 5, + BH_Async_Read = 6, + BH_Async_Write = 7, + BH_Delay = 8, + BH_Boundary = 9, + BH_Write_EIO = 10, + BH_Unwritten = 11, + BH_Quiet = 12, + BH_Meta = 13, + BH_Prio = 14, + BH_Defer_Completion = 15, + BH_PrivateStart = 16, +}; + +struct trace_event_raw_mm_migrate_pages { + struct trace_entry ent; + long unsigned int succeeded; + long unsigned int failed; + long unsigned int thp_succeeded; + long unsigned int thp_failed; + long unsigned int thp_split; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_raw_mm_migrate_pages_start { + struct trace_entry ent; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_migrate_pages {}; + +struct trace_event_data_offsets_mm_migrate_pages_start {}; + +typedef void (*btf_trace_mm_migrate_pages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, enum migrate_mode, int); + +typedef void (*btf_trace_mm_migrate_pages_start)(void *, enum migrate_mode, int); + +enum scan_result { + SCAN_FAIL = 0, + SCAN_SUCCEED = 1, + SCAN_PMD_NULL = 2, + SCAN_EXCEED_NONE_PTE = 3, + SCAN_EXCEED_SWAP_PTE = 4, + SCAN_EXCEED_SHARED_PTE = 5, + SCAN_PTE_NON_PRESENT = 6, + SCAN_PTE_UFFD_WP = 7, + SCAN_PAGE_RO = 8, + SCAN_LACK_REFERENCED_PAGE = 9, + SCAN_PAGE_NULL = 10, + SCAN_SCAN_ABORT = 11, + SCAN_PAGE_COUNT = 12, + SCAN_PAGE_LRU = 13, + SCAN_PAGE_LOCK = 14, + SCAN_PAGE_ANON = 15, + SCAN_PAGE_COMPOUND = 16, + SCAN_ANY_PROCESS = 17, + SCAN_VMA_NULL = 18, + SCAN_VMA_CHECK = 19, + SCAN_ADDRESS_RANGE = 20, + SCAN_SWAP_CACHE_PAGE = 21, + SCAN_DEL_PAGE_LRU = 22, + SCAN_ALLOC_HUGE_PAGE_FAIL = 23, + SCAN_CGROUP_CHARGE_FAIL = 24, + SCAN_TRUNCATED = 25, + SCAN_PAGE_HAS_PRIVATE = 26, +}; + +struct trace_event_raw_mm_khugepaged_scan_pmd { + struct trace_entry ent; + struct mm_struct *mm; + long unsigned int pfn; + bool writable; + int referenced; + int none_or_zero; + int status; + int unmapped; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page { + struct trace_entry ent; + struct mm_struct *mm; + int isolated; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_isolate { + struct trace_entry ent; + long unsigned int pfn; + int none_or_zero; + int referenced; + bool writable; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_swapin { + struct trace_entry ent; + struct mm_struct *mm; + int swapped_in; + int referenced; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_khugepaged_scan_pmd {}; + +struct trace_event_data_offsets_mm_collapse_huge_page {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_isolate {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_swapin {}; + +typedef void (*btf_trace_mm_khugepaged_scan_pmd)(void *, struct mm_struct *, struct page *, bool, int, int, int, int); + +typedef void (*btf_trace_mm_collapse_huge_page)(void *, struct mm_struct *, int, int); + +typedef void (*btf_trace_mm_collapse_huge_page_isolate)(void *, struct page *, int, int, bool, int); + +typedef void (*btf_trace_mm_collapse_huge_page_swapin)(void *, struct mm_struct *, int, int, int); + +struct mm_slot___2 { + struct hlist_node hash; + struct list_head mm_node; + struct mm_struct *mm; + int nr_pte_mapped_thp; + long unsigned int pte_mapped_thp[8]; +}; + +struct khugepaged_scan { + struct list_head mm_head; + struct mm_slot___2 *mm_slot; + long unsigned int address; +}; + +struct mem_cgroup_tree_per_node { + struct rb_root rb_root; + struct rb_node *rb_rightmost; + spinlock_t lock; +}; + +struct mem_cgroup_tree { + struct mem_cgroup_tree_per_node *rb_tree_per_node[64]; +}; + +struct mem_cgroup_eventfd_list { + struct list_head list; + struct eventfd_ctx *eventfd; +}; + +struct mem_cgroup_event { + struct mem_cgroup *memcg; + struct eventfd_ctx *eventfd; + struct list_head list; + int (*register_event)(struct mem_cgroup *, struct eventfd_ctx *, const char *); + void (*unregister_event)(struct mem_cgroup *, struct eventfd_ctx *); + poll_table pt; + wait_queue_head_t *wqh; + wait_queue_entry_t wait; + struct work_struct remove; +}; + +struct move_charge_struct { + spinlock_t lock; + struct mm_struct *mm; + struct mem_cgroup *from; + struct mem_cgroup *to; + long unsigned int flags; + long unsigned int precharge; + long unsigned int moved_charge; + long unsigned int moved_swap; + struct task_struct *moving_task; + wait_queue_head_t waitq; +}; + +enum res_type { + _MEM = 0, + _MEMSWAP = 1, + _OOM_TYPE = 2, + _KMEM = 3, + _TCP = 4, +}; + +struct memory_stat { + const char *name; + unsigned int idx; +}; + +struct oom_wait_info { + struct mem_cgroup *memcg; + wait_queue_entry_t wait; +}; + +enum oom_status { + OOM_SUCCESS = 0, + OOM_FAILED = 1, + OOM_ASYNC = 2, + OOM_SKIPPED = 3, +}; + +struct obj_stock { + struct obj_cgroup *cached_objcg; + struct pglist_data *cached_pgdat; + unsigned int nr_bytes; + int nr_slab_reclaimable_b; + int nr_slab_unreclaimable_b; +}; + +struct memcg_stock_pcp { + struct mem_cgroup *cached; + unsigned int nr_pages; + struct obj_stock task_obj; + struct obj_stock irq_obj; + struct work_struct work; + long unsigned int flags; +}; + +enum { + RES_USAGE = 0, + RES_LIMIT = 1, + RES_MAX_USAGE = 2, + RES_FAILCNT = 3, + RES_SOFT_LIMIT = 4, +}; + +union mc_target { + struct page *page; + swp_entry_t ent; +}; + +enum mc_target_type { + MC_TARGET_NONE = 0, + MC_TARGET_PAGE = 1, + MC_TARGET_SWAP = 2, + MC_TARGET_DEVICE = 3, +}; + +struct uncharge_gather { + struct mem_cgroup *memcg; + long unsigned int nr_memory; + long unsigned int pgpgout; + long unsigned int nr_kmem; + int nid; +}; + +struct numa_stat { + const char *name; + unsigned int lru_mask; +}; + +enum vmpressure_levels { + VMPRESSURE_LOW = 0, + VMPRESSURE_MEDIUM = 1, + VMPRESSURE_CRITICAL = 2, + VMPRESSURE_NUM_LEVELS = 3, +}; + +enum vmpressure_modes { + VMPRESSURE_NO_PASSTHROUGH = 0, + VMPRESSURE_HIERARCHY = 1, + VMPRESSURE_LOCAL = 2, + VMPRESSURE_NUM_MODES = 3, +}; + +struct vmpressure_event { + struct eventfd_ctx *efd; + enum vmpressure_levels level; + enum vmpressure_modes mode; + struct list_head node; +}; + +struct swap_cgroup_ctrl { + struct page **map; + long unsigned int length; + spinlock_t lock; +}; + +struct swap_cgroup { + short unsigned int id; +}; + +enum { + RES_USAGE___2 = 0, + RES_RSVD_USAGE = 1, + RES_LIMIT___2 = 2, + RES_RSVD_LIMIT = 3, + RES_MAX_USAGE___2 = 4, + RES_RSVD_MAX_USAGE = 5, + RES_FAILCNT___2 = 6, + RES_RSVD_FAILCNT = 7, +}; + +enum mf_result { + MF_IGNORED = 0, + MF_FAILED = 1, + MF_DELAYED = 2, + MF_RECOVERED = 3, +}; + +enum mf_action_page_type { + MF_MSG_KERNEL = 0, + MF_MSG_KERNEL_HIGH_ORDER = 1, + MF_MSG_SLAB = 2, + MF_MSG_DIFFERENT_COMPOUND = 3, + MF_MSG_POISONED_HUGE = 4, + MF_MSG_HUGE = 5, + MF_MSG_FREE_HUGE = 6, + MF_MSG_NON_PMD_HUGE = 7, + MF_MSG_UNMAP_FAILED = 8, + MF_MSG_DIRTY_SWAPCACHE = 9, + MF_MSG_CLEAN_SWAPCACHE = 10, + MF_MSG_DIRTY_MLOCKED_LRU = 11, + MF_MSG_CLEAN_MLOCKED_LRU = 12, + MF_MSG_DIRTY_UNEVICTABLE_LRU = 13, + MF_MSG_CLEAN_UNEVICTABLE_LRU = 14, + MF_MSG_DIRTY_LRU = 15, + MF_MSG_CLEAN_LRU = 16, + MF_MSG_TRUNCATED_LRU = 17, + MF_MSG_BUDDY = 18, + MF_MSG_BUDDY_2ND = 19, + MF_MSG_DAX = 20, + MF_MSG_UNSPLIT_THP = 21, + MF_MSG_UNKNOWN = 22, +}; + +typedef long unsigned int dax_entry_t; + +struct __kfifo { + unsigned int in; + unsigned int out; + unsigned int mask; + unsigned int esize; + void *data; +}; + +struct to_kill { + struct list_head nd; + struct task_struct *tsk; + long unsigned int addr; + short int size_shift; +}; + +struct hwp_walk { + struct to_kill tk; + long unsigned int pfn; + int flags; +}; + +struct page_state { + long unsigned int mask; + long unsigned int res; + enum mf_action_page_type type; + int (*action)(struct page_state *, struct page *); +}; + +struct memory_failure_entry { + long unsigned int pfn; + int flags; +}; + +struct memory_failure_cpu { + struct { + union { + struct __kfifo kfifo; + struct memory_failure_entry *type; + const struct memory_failure_entry *const_type; + char (*rectype)[0]; + struct memory_failure_entry *ptr; + const struct memory_failure_entry *ptr_const; + }; + struct memory_failure_entry buf[16]; + } fifo; + spinlock_t lock; + struct work_struct work; +}; + +struct cleancache_filekey { + union { + ino_t ino; + __u32 fh[6]; + u32 key[6]; + } u; +}; + +struct cleancache_ops { + int (*init_fs)(size_t); + int (*init_shared_fs)(uuid_t *, size_t); + int (*get_page)(int, struct cleancache_filekey, long unsigned int, struct page *); + void (*put_page)(int, struct cleancache_filekey, long unsigned int, struct page *); + void (*invalidate_page)(int, struct cleancache_filekey, long unsigned int); + void (*invalidate_inode)(int, struct cleancache_filekey); + void (*invalidate_fs)(int); +}; + +struct trace_event_raw_test_pages_isolated { + struct trace_entry ent; + long unsigned int start_pfn; + long unsigned int end_pfn; + long unsigned int fin_pfn; + char __data[0]; +}; + +struct trace_event_data_offsets_test_pages_isolated {}; + +typedef void (*btf_trace_test_pages_isolated)(void *, long unsigned int, long unsigned int, long unsigned int); + +struct zpool_driver; + +struct zpool { + struct zpool_driver *driver; + void *pool; + const struct zpool_ops *ops; + bool evictable; + bool can_sleep_mapped; + struct list_head list; +}; + +struct zpool_driver { + char *type; + struct module *owner; + atomic_t refcount; + struct list_head list; + void * (*create)(const char *, gfp_t, const struct zpool_ops *, struct zpool *); + void (*destroy)(void *); + bool malloc_support_movable; + int (*malloc)(void *, size_t, gfp_t, long unsigned int *); + void (*free)(void *, long unsigned int); + int (*shrink)(void *, unsigned int, unsigned int *); + bool sleep_mapped; + void * (*map)(void *, long unsigned int, enum zpool_mapmode); + void (*unmap)(void *, long unsigned int); + u64 (*total_size)(void *); +}; + +typedef void (*exitcall_t)(); + +struct zbud_pool; + +struct zbud_ops { + int (*evict)(struct zbud_pool *, long unsigned int); +}; + +struct zbud_pool { + spinlock_t lock; + union { + struct list_head buddied; + struct list_head unbuddied[63]; + }; + struct list_head lru; + u64 pages_nr; + const struct zbud_ops *ops; + struct zpool *zpool; + const struct zpool_ops *zpool_ops; +}; + +struct zbud_header { + struct list_head buddy; + struct list_head lru; + unsigned int first_chunks; + unsigned int last_chunks; + bool under_reclaim; +}; + +enum buddy { + FIRST = 0, + LAST = 1, +}; + +enum zs_mapmode { + ZS_MM_RW = 0, + ZS_MM_RO = 1, + ZS_MM_WO = 2, +}; + +struct zs_pool_stats { + atomic_long_t pages_compacted; +}; + +enum fullness_group { + ZS_EMPTY = 0, + ZS_ALMOST_EMPTY = 1, + ZS_ALMOST_FULL = 2, + ZS_FULL = 3, + NR_ZS_FULLNESS = 4, +}; + +enum zs_stat_type { + CLASS_EMPTY = 0, + CLASS_ALMOST_EMPTY = 1, + CLASS_ALMOST_FULL = 2, + CLASS_FULL = 3, + OBJ_ALLOCATED = 4, + OBJ_USED = 5, + NR_ZS_STAT_TYPE = 6, +}; + +struct zs_size_stat { + long unsigned int objs[6]; +}; + +struct size_class { + spinlock_t lock; + struct list_head fullness_list[4]; + int size; + int objs_per_zspage; + int pages_per_zspage; + unsigned int index; + struct zs_size_stat stats; +}; + +struct link_free { + union { + long unsigned int next; + long unsigned int handle; + }; +}; + +struct zs_pool { + const char *name; + struct size_class *size_class[255]; + struct kmem_cache *handle_cachep; + struct kmem_cache *zspage_cachep; + atomic_long_t pages_allocated; + struct zs_pool_stats stats; + struct shrinker shrinker; + struct inode *inode; + struct work_struct free_work; + struct wait_queue_head migration_wait; + atomic_long_t isolated_pages; + bool destroying; +}; + +struct zspage { + struct { + unsigned int fullness: 2; + unsigned int class: 9; + unsigned int isolated: 3; + unsigned int magic: 8; + }; + unsigned int inuse; + unsigned int freeobj; + struct page *first_page; + struct list_head list; + rwlock_t lock; +}; + +struct mapping_area { + char *vm_buf; + char *vm_addr; + enum zs_mapmode vm_mm; +}; + +struct zs_compact_control { + struct page *s_page; + struct page *d_page; + int obj_idx; +}; + +struct trace_event_raw_cma_alloc_class { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int pfn; + const struct page *page; + long unsigned int count; + unsigned int align; + char __data[0]; +}; + +struct trace_event_raw_cma_release { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int pfn; + const struct page *page; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_cma_alloc_start { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int count; + unsigned int align; + char __data[0]; +}; + +struct trace_event_data_offsets_cma_alloc_class { + u32 name; +}; + +struct trace_event_data_offsets_cma_release { + u32 name; +}; + +struct trace_event_data_offsets_cma_alloc_start { + u32 name; +}; + +typedef void (*btf_trace_cma_release)(void *, const char *, long unsigned int, const struct page *, long unsigned int); + +typedef void (*btf_trace_cma_alloc_start)(void *, const char *, long unsigned int, unsigned int); + +typedef void (*btf_trace_cma_alloc_finish)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int); + +typedef void (*btf_trace_cma_alloc_busy_retry)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int); + +struct cma_kobject { + struct kobject kobj; + struct cma *cma; +}; + +struct balloon_dev_info { + long unsigned int isolated_pages; + spinlock_t pages_lock; + struct list_head pages; + int (*migratepage)(struct balloon_dev_info *, struct page *, struct page *, enum migrate_mode); + struct inode *inode; +}; + +enum { + BAD_STACK = 4294967295, + NOT_STACK = 0, + GOOD_FRAME = 1, + GOOD_STACK = 2, +}; + +enum hmm_pfn_flags { + HMM_PFN_VALID = 0, + HMM_PFN_WRITE = 0, + HMM_PFN_ERROR = 0, + HMM_PFN_ORDER_SHIFT = 56, + HMM_PFN_REQ_FAULT = 0, + HMM_PFN_REQ_WRITE = 0, + HMM_PFN_FLAGS = 0, +}; + +struct hmm_range { + struct mmu_interval_notifier *notifier; + long unsigned int notifier_seq; + long unsigned int start; + long unsigned int end; + long unsigned int *hmm_pfns; + long unsigned int default_flags; + long unsigned int pfn_flags_mask; + void *dev_private_owner; +}; + +struct hmm_vma_walk { + struct hmm_range *range; + long unsigned int last; +}; + +enum { + HMM_NEED_FAULT = 1, + HMM_NEED_WRITE_FAULT = 2, + HMM_NEED_ALL_BITS = 3, +}; + +struct hugetlbfs_inode_info { + struct shared_policy policy; + struct inode vfs_inode; + unsigned int seals; +}; + +struct wp_walk { + struct mmu_notifier_range range; + long unsigned int tlbflush_start; + long unsigned int tlbflush_end; + long unsigned int total; +}; + +struct clean_walk { + struct wp_walk base; + long unsigned int bitmap_pgoff; + long unsigned int *bitmap; + long unsigned int start; + long unsigned int end; +}; + +struct page_reporting_dev_info { + int (*report)(struct page_reporting_dev_info *, struct scatterlist *, unsigned int); + struct delayed_work work; + atomic_t state; + unsigned int order; +}; + +enum { + PAGE_REPORTING_IDLE = 0, + PAGE_REPORTING_REQUESTED = 1, + PAGE_REPORTING_ACTIVE = 2, +}; + +typedef s32 compat_off_t; + +struct open_flags { + int open_flag; + umode_t mode; + int acc_mode; + int intent; + int lookup_flags; +}; + +typedef s64 compat_loff_t; + +typedef __kernel_rwf_t rwf_t; + +struct fscrypt_policy_v1 { + __u8 version; + __u8 contents_encryption_mode; + __u8 filenames_encryption_mode; + __u8 flags; + __u8 master_key_descriptor[8]; +}; + +struct fscrypt_policy_v2 { + __u8 version; + __u8 contents_encryption_mode; + __u8 filenames_encryption_mode; + __u8 flags; + __u8 __reserved[4]; + __u8 master_key_identifier[16]; +}; + +union fscrypt_policy { + u8 version; + struct fscrypt_policy_v1 v1; + struct fscrypt_policy_v2 v2; +}; + +enum vfs_get_super_keying { + vfs_get_single_super = 0, + vfs_get_single_reconf_super = 1, + vfs_get_keyed_super = 2, + vfs_get_independent_super = 3, +}; + +typedef struct kobject *kobj_probe_t(dev_t, int *, void *); + +struct kobj_map; + +struct char_device_struct { + struct char_device_struct *next; + unsigned int major; + unsigned int baseminor; + int minorct; + char name[64]; + struct cdev *cdev; +}; + +struct stat { + long unsigned int st_dev; + long unsigned int st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + long unsigned int st_rdev; + long unsigned int __pad1; + long int st_size; + int st_blksize; + int __pad2; + long int st_blocks; + long int st_atime; + long unsigned int st_atime_nsec; + long int st_mtime; + long unsigned int st_mtime_nsec; + long int st_ctime; + long unsigned int st_ctime_nsec; + unsigned int __unused4; + unsigned int __unused5; +}; + +typedef u16 compat_mode_t; + +typedef u32 compat_ino_t; + +typedef u16 compat_ushort_t; + +typedef s64 compat_s64; + +typedef u16 __compat_uid16_t; + +typedef u16 __compat_gid16_t; + +typedef u32 compat_dev_t; + +struct compat_stat { + compat_dev_t st_dev; + compat_ino_t st_ino; + compat_mode_t st_mode; + compat_ushort_t st_nlink; + __compat_uid16_t st_uid; + __compat_gid16_t st_gid; + compat_dev_t st_rdev; + compat_off_t st_size; + compat_off_t st_blksize; + compat_off_t st_blocks; + old_time32_t st_atime; + compat_ulong_t st_atime_nsec; + old_time32_t st_mtime; + compat_ulong_t st_mtime_nsec; + old_time32_t st_ctime; + compat_ulong_t st_ctime_nsec; + compat_ulong_t __unused4[2]; +}; + +struct stat64 { + compat_u64 st_dev; + unsigned char __pad0[4]; + compat_ulong_t __st_ino; + compat_uint_t st_mode; + compat_uint_t st_nlink; + compat_ulong_t st_uid; + compat_ulong_t st_gid; + compat_u64 st_rdev; + unsigned char __pad3[4]; + compat_s64 st_size; + compat_ulong_t st_blksize; + compat_u64 st_blocks; + compat_ulong_t st_atime; + compat_ulong_t st_atime_nsec; + compat_ulong_t st_mtime; + compat_ulong_t st_mtime_nsec; + compat_ulong_t st_ctime; + compat_ulong_t st_ctime_nsec; + compat_u64 st_ino; +}; + +struct statx_timestamp { + __s64 tv_sec; + __u32 tv_nsec; + __s32 __reserved; +}; + +struct statx { + __u32 stx_mask; + __u32 stx_blksize; + __u64 stx_attributes; + __u32 stx_nlink; + __u32 stx_uid; + __u32 stx_gid; + __u16 stx_mode; + __u16 __spare0[1]; + __u64 stx_ino; + __u64 stx_size; + __u64 stx_blocks; + __u64 stx_attributes_mask; + struct statx_timestamp stx_atime; + struct statx_timestamp stx_btime; + struct statx_timestamp stx_ctime; + struct statx_timestamp stx_mtime; + __u32 stx_rdev_major; + __u32 stx_rdev_minor; + __u32 stx_dev_major; + __u32 stx_dev_minor; + __u64 stx_mnt_id; + __u64 __spare2; + __u64 __spare3[12]; +}; + +struct mount; + +struct mnt_namespace { + struct ns_common ns; + struct mount *root; + struct list_head list; + spinlock_t ns_lock; + struct user_namespace *user_ns; + struct ucounts *ucounts; + u64 seq; + wait_queue_head_t poll; + u64 event; + unsigned int mounts; + unsigned int pending_mounts; +}; + +struct mnt_pcp; + +struct mountpoint; + +struct mount { + struct hlist_node mnt_hash; + struct mount *mnt_parent; + struct dentry *mnt_mountpoint; + struct vfsmount mnt; + union { + struct callback_head mnt_rcu; + struct llist_node mnt_llist; + }; + struct mnt_pcp *mnt_pcp; + struct list_head mnt_mounts; + struct list_head mnt_child; + struct list_head mnt_instance; + const char *mnt_devname; + struct list_head mnt_list; + struct list_head mnt_expire; + struct list_head mnt_share; + struct list_head mnt_slave_list; + struct list_head mnt_slave; + struct mount *mnt_master; + struct mnt_namespace *mnt_ns; + struct mountpoint *mnt_mp; + union { + struct hlist_node mnt_mp_list; + struct hlist_node mnt_umount; + }; + struct list_head mnt_umounting; + struct fsnotify_mark_connector *mnt_fsnotify_marks; + __u32 mnt_fsnotify_mask; + int mnt_id; + int mnt_group_id; + int mnt_expiry_mark; + struct hlist_head mnt_pins; + struct hlist_head mnt_stuck_children; +}; + +struct mnt_pcp { + int mnt_count; + int mnt_writers; +}; + +struct mountpoint { + struct hlist_node m_hash; + struct dentry *m_dentry; + struct hlist_head m_list; + int m_count; +}; + +typedef short unsigned int ushort; + +struct user_arg_ptr { + bool is_compat; + union { + const char * const *native; + const compat_uptr_t *compat; + } ptr; +}; + +enum inode_i_mutex_lock_class { + I_MUTEX_NORMAL = 0, + I_MUTEX_PARENT = 1, + I_MUTEX_CHILD = 2, + I_MUTEX_XATTR = 3, + I_MUTEX_NONDIR2 = 4, + I_MUTEX_PARENT2 = 5, +}; + +struct name_snapshot { + struct qstr name; + unsigned char inline_name[32]; +}; + +struct saved { + struct path link; + struct delayed_call done; + const char *name; + unsigned int seq; +}; + +struct nameidata { + struct path path; + struct qstr last; + struct path root; + struct inode *inode; + unsigned int flags; + unsigned int state; + unsigned int seq; + unsigned int m_seq; + unsigned int r_seq; + int last_type; + unsigned int depth; + int total_link_count; + struct saved *stack; + struct saved internal[2]; + struct filename *name; + struct nameidata *saved; + unsigned int root_seq; + int dfd; + kuid_t dir_uid; + umode_t dir_mode; +}; + +struct renamedata { + struct user_namespace *old_mnt_userns; + struct inode *old_dir; + struct dentry *old_dentry; + struct user_namespace *new_mnt_userns; + struct inode *new_dir; + struct dentry *new_dentry; + struct inode **delegated_inode; + unsigned int flags; +}; + +enum { + LAST_NORM = 0, + LAST_ROOT = 1, + LAST_DOT = 2, + LAST_DOTDOT = 3, +}; + +enum { + WALK_TRAILING = 1, + WALK_MORE = 2, + WALK_NOFOLLOW = 4, +}; + +struct word_at_a_time { + const long unsigned int one_bits; + const long unsigned int high_bits; +}; + +struct compat_flock { + short int l_type; + short int l_whence; + compat_off_t l_start; + compat_off_t l_len; + compat_pid_t l_pid; +}; + +struct compat_flock64 { + short int l_type; + short int l_whence; + compat_loff_t l_start; + compat_loff_t l_len; + compat_pid_t l_pid; +}; + +struct f_owner_ex { + int type; + __kernel_pid_t pid; +}; + +struct flock { + short int l_type; + short int l_whence; + __kernel_off_t l_start; + __kernel_off_t l_len; + __kernel_pid_t l_pid; +}; + +struct file_clone_range { + __s64 src_fd; + __u64 src_offset; + __u64 src_length; + __u64 dest_offset; +}; + +struct file_dedupe_range_info { + __s64 dest_fd; + __u64 dest_offset; + __u64 bytes_deduped; + __s32 status; + __u32 reserved; +}; + +struct file_dedupe_range { + __u64 src_offset; + __u64 src_length; + __u16 dest_count; + __u16 reserved1; + __u32 reserved2; + struct file_dedupe_range_info info[0]; +}; + +struct fsxattr { + __u32 fsx_xflags; + __u32 fsx_extsize; + __u32 fsx_nextents; + __u32 fsx_projid; + __u32 fsx_cowextsize; + unsigned char fsx_pad[8]; +}; + +struct fiemap_extent; + +struct fiemap_extent_info { + unsigned int fi_flags; + unsigned int fi_extents_mapped; + unsigned int fi_extents_max; + struct fiemap_extent *fi_extents_start; +}; + +struct fileattr { + u32 flags; + u32 fsx_xflags; + u32 fsx_extsize; + u32 fsx_nextents; + u32 fsx_projid; + u32 fsx_cowextsize; + bool flags_valid: 1; + bool fsx_valid: 1; +}; + +struct space_resv { + __s16 l_type; + __s16 l_whence; + __s64 l_start; + __s64 l_len; + __s32 l_sysid; + __u32 l_pid; + __s32 l_pad[4]; +}; + +struct fiemap_extent { + __u64 fe_logical; + __u64 fe_physical; + __u64 fe_length; + __u64 fe_reserved64[2]; + __u32 fe_flags; + __u32 fe_reserved[3]; +}; + +struct fiemap { + __u64 fm_start; + __u64 fm_length; + __u32 fm_flags; + __u32 fm_mapped_extents; + __u32 fm_extent_count; + __u32 fm_reserved; + struct fiemap_extent fm_extents[0]; +}; + +struct linux_dirent64 { + u64 d_ino; + s64 d_off; + short unsigned int d_reclen; + unsigned char d_type; + char d_name[0]; +}; + +struct linux_dirent { + long unsigned int d_ino; + long unsigned int d_off; + short unsigned int d_reclen; + char d_name[1]; +}; + +struct getdents_callback { + struct dir_context ctx; + struct linux_dirent *current_dir; + int prev_reclen; + int count; + int error; +}; + +struct getdents_callback64 { + struct dir_context ctx; + struct linux_dirent64 *current_dir; + int prev_reclen; + int count; + int error; +}; + +struct compat_old_linux_dirent { + compat_ulong_t d_ino; + compat_ulong_t d_offset; + short unsigned int d_namlen; + char d_name[1]; +}; + +struct compat_readdir_callback { + struct dir_context ctx; + struct compat_old_linux_dirent *dirent; + int result; +}; + +struct compat_linux_dirent { + compat_ulong_t d_ino; + compat_ulong_t d_off; + short unsigned int d_reclen; + char d_name[1]; +}; + +struct compat_getdents_callback { + struct dir_context ctx; + struct compat_linux_dirent *current_dir; + int prev_reclen; + int count; + int error; +}; + +typedef struct { + long unsigned int fds_bits[16]; +} __kernel_fd_set; + +typedef __kernel_fd_set fd_set; + +struct poll_table_entry { + struct file *filp; + __poll_t key; + wait_queue_entry_t wait; + wait_queue_head_t *wait_address; +}; + +struct poll_table_page; + +struct poll_wqueues { + poll_table pt; + struct poll_table_page *table; + struct task_struct *polling_task; + int triggered; + int error; + int inline_index; + struct poll_table_entry inline_entries[9]; +}; + +struct poll_table_page { + struct poll_table_page *next; + struct poll_table_entry *entry; + struct poll_table_entry entries[0]; +}; + +enum poll_time_type { + PT_TIMEVAL = 0, + PT_OLD_TIMEVAL = 1, + PT_TIMESPEC = 2, + PT_OLD_TIMESPEC = 3, +}; + +typedef struct { + long unsigned int *in; + long unsigned int *out; + long unsigned int *ex; + long unsigned int *res_in; + long unsigned int *res_out; + long unsigned int *res_ex; +} fd_set_bits; + +struct sigset_argpack { + sigset_t *p; + size_t size; +}; + +struct poll_list { + struct poll_list *next; + int len; + struct pollfd entries[0]; +}; + +struct compat_sel_arg_struct { + compat_ulong_t n; + compat_uptr_t inp; + compat_uptr_t outp; + compat_uptr_t exp; + compat_uptr_t tvp; +}; + +struct compat_sigset_argpack { + compat_uptr_t p; + compat_size_t size; +}; + +enum dentry_d_lock_class { + DENTRY_D_LOCK_NORMAL = 0, + DENTRY_D_LOCK_NESTED = 1, +}; + +struct external_name { + union { + atomic_t count; + struct callback_head head; + } u; + unsigned char name[0]; +}; + +enum d_walk_ret { + D_WALK_CONTINUE = 0, + D_WALK_QUIT = 1, + D_WALK_NORETRY = 2, + D_WALK_SKIP = 3, +}; + +struct check_mount { + struct vfsmount *mnt; + unsigned int mounted; +}; + +struct select_data { + struct dentry *start; + union { + long int found; + struct dentry *victim; + }; + struct list_head dispose; +}; + +enum file_time_flags { + S_ATIME = 1, + S_MTIME = 2, + S_CTIME = 4, + S_VERSION = 8, +}; + +struct mount_attr { + __u64 attr_set; + __u64 attr_clr; + __u64 propagation; + __u64 userns_fd; +}; + +struct proc_mounts { + struct mnt_namespace *ns; + struct path root; + int (*show)(struct seq_file *, struct vfsmount *); + struct mount cursor; +}; + +struct mount_kattr { + unsigned int attr_set; + unsigned int attr_clr; + unsigned int propagation; + unsigned int lookup_flags; + bool recurse; + struct user_namespace *mnt_userns; +}; + +enum umount_tree_flags { + UMOUNT_SYNC = 1, + UMOUNT_PROPAGATE = 2, + UMOUNT_CONNECTED = 4, +}; + +struct unicode_map { + const char *charset; + int version; +}; + +struct simple_transaction_argresp { + ssize_t size; + char data[0]; +}; + +struct simple_attr { + int (*get)(void *, u64 *); + int (*set)(void *, u64); + char get_buf[24]; + char set_buf[24]; + void *data; + const char *fmt; + struct mutex mutex; +}; + +struct wb_writeback_work { + long int nr_pages; + struct super_block *sb; + enum writeback_sync_modes sync_mode; + unsigned int tagged_writepages: 1; + unsigned int for_kupdate: 1; + unsigned int range_cyclic: 1; + unsigned int for_background: 1; + unsigned int for_sync: 1; + unsigned int auto_free: 1; + enum wb_reason reason; + struct list_head list; + struct wb_completion *done; +}; + +struct trace_event_raw_writeback_folio_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int index; + char __data[0]; +}; + +struct trace_event_raw_writeback_dirty_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_inode_foreign_history { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t cgroup_ino; + unsigned int history; + char __data[0]; +}; + +struct trace_event_raw_inode_switch_wbs { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t old_cgroup_ino; + ino_t new_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_track_foreign_dirty { + struct trace_entry ent; + char name[32]; + u64 bdi_id; + ino_t ino; + unsigned int memcg_id; + ino_t cgroup_ino; + ino_t page_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_flush_foreign { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + unsigned int frn_bdi_id; + unsigned int frn_memcg_id; + char __data[0]; +}; + +struct trace_event_raw_writeback_write_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + int sync_mode; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_work_class { + struct trace_entry ent; + char name[32]; + long int nr_pages; + dev_t sb_dev; + int sync_mode; + int for_kupdate; + int range_cyclic; + int for_background; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_pages_written { + struct trace_entry ent; + long int pages; + char __data[0]; +}; + +struct trace_event_raw_writeback_class { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_bdi_register { + struct trace_entry ent; + char name[32]; + char __data[0]; +}; + +struct trace_event_raw_wbc_class { + struct trace_entry ent; + char name[32]; + long int nr_to_write; + long int pages_skipped; + int sync_mode; + int for_kupdate; + int for_background; + int for_reclaim; + int range_cyclic; + long int range_start; + long int range_end; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_queue_io { + struct trace_entry ent; + char name[32]; + long unsigned int older; + long int age; + int moved; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_global_dirty_state { + struct trace_entry ent; + long unsigned int nr_dirty; + long unsigned int nr_writeback; + long unsigned int background_thresh; + long unsigned int dirty_thresh; + long unsigned int dirty_limit; + long unsigned int nr_dirtied; + long unsigned int nr_written; + char __data[0]; +}; + +struct trace_event_raw_bdi_dirty_ratelimit { + struct trace_entry ent; + char bdi[32]; + long unsigned int write_bw; + long unsigned int avg_write_bw; + long unsigned int dirty_rate; + long unsigned int dirty_ratelimit; + long unsigned int task_ratelimit; + long unsigned int balanced_dirty_ratelimit; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_balance_dirty_pages { + struct trace_entry ent; + char bdi[32]; + long unsigned int limit; + long unsigned int setpoint; + long unsigned int dirty; + long unsigned int bdi_setpoint; + long unsigned int bdi_dirty; + long unsigned int dirty_ratelimit; + long unsigned int task_ratelimit; + unsigned int dirtied; + unsigned int dirtied_pause; + long unsigned int paused; + long int pause; + long unsigned int period; + long int think; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_sb_inodes_requeue { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int dirtied_when; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_congest_waited_template { + struct trace_entry ent; + unsigned int usec_timeout; + unsigned int usec_delayed; + char __data[0]; +}; + +struct trace_event_raw_writeback_single_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int dirtied_when; + long unsigned int writeback_index; + long int nr_to_write; + long unsigned int wrote; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_inode_template { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int state; + __u16 mode; + long unsigned int dirtied_when; + char __data[0]; +}; + +struct trace_event_data_offsets_writeback_folio_template {}; + +struct trace_event_data_offsets_writeback_dirty_inode_template {}; + +struct trace_event_data_offsets_inode_foreign_history {}; + +struct trace_event_data_offsets_inode_switch_wbs {}; + +struct trace_event_data_offsets_track_foreign_dirty {}; + +struct trace_event_data_offsets_flush_foreign {}; + +struct trace_event_data_offsets_writeback_write_inode_template {}; + +struct trace_event_data_offsets_writeback_work_class {}; + +struct trace_event_data_offsets_writeback_pages_written {}; + +struct trace_event_data_offsets_writeback_class {}; + +struct trace_event_data_offsets_writeback_bdi_register {}; + +struct trace_event_data_offsets_wbc_class {}; + +struct trace_event_data_offsets_writeback_queue_io {}; + +struct trace_event_data_offsets_global_dirty_state {}; + +struct trace_event_data_offsets_bdi_dirty_ratelimit {}; + +struct trace_event_data_offsets_balance_dirty_pages {}; + +struct trace_event_data_offsets_writeback_sb_inodes_requeue {}; + +struct trace_event_data_offsets_writeback_congest_waited_template {}; + +struct trace_event_data_offsets_writeback_single_inode_template {}; + +struct trace_event_data_offsets_writeback_inode_template {}; + +typedef void (*btf_trace_writeback_dirty_folio)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_folio_wait_writeback)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_writeback_mark_inode_dirty)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_dirty_inode_start)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_dirty_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_inode_foreign_history)(void *, struct inode *, struct writeback_control *, unsigned int); + +typedef void (*btf_trace_inode_switch_wbs)(void *, struct inode *, struct bdi_writeback *, struct bdi_writeback *); + +typedef void (*btf_trace_track_foreign_dirty)(void *, struct folio *, struct bdi_writeback *); + +typedef void (*btf_trace_flush_foreign)(void *, struct bdi_writeback *, unsigned int, unsigned int); + +typedef void (*btf_trace_writeback_write_inode_start)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_write_inode)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_queue)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_exec)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_start)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_written)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_wait)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_pages_written)(void *, long int); + +typedef void (*btf_trace_writeback_wake_background)(void *, struct bdi_writeback *); + +typedef void (*btf_trace_writeback_bdi_register)(void *, struct backing_dev_info *); + +typedef void (*btf_trace_wbc_writepage)(void *, struct writeback_control *, struct backing_dev_info *); + +typedef void (*btf_trace_writeback_queue_io)(void *, struct bdi_writeback *, struct wb_writeback_work *, long unsigned int, int); + +typedef void (*btf_trace_global_dirty_state)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_bdi_dirty_ratelimit)(void *, struct bdi_writeback *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_balance_dirty_pages)(void *, struct bdi_writeback *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long int, long unsigned int); + +typedef void (*btf_trace_writeback_sb_inodes_requeue)(void *, struct inode *); + +typedef void (*btf_trace_writeback_congestion_wait)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_writeback_single_inode_start)(void *, struct inode *, struct writeback_control *, long unsigned int); + +typedef void (*btf_trace_writeback_single_inode)(void *, struct inode *, struct writeback_control *, long unsigned int); + +typedef void (*btf_trace_writeback_lazytime)(void *, struct inode *); + +typedef void (*btf_trace_writeback_lazytime_iput)(void *, struct inode *); + +typedef void (*btf_trace_writeback_dirty_inode_enqueue)(void *, struct inode *); + +typedef void (*btf_trace_sb_mark_inode_writeback)(void *, struct inode *); + +typedef void (*btf_trace_sb_clear_inode_writeback)(void *, struct inode *); + +struct inode_switch_wbs_context { + struct rcu_work work; + struct bdi_writeback *new_wb; + struct inode *inodes[0]; +}; + +struct splice_desc { + size_t total_len; + unsigned int len; + unsigned int flags; + union { + void *userptr; + struct file *file; + void *data; + } u; + loff_t pos; + loff_t *opos; + size_t num_spliced; + bool need_wakeup; +}; + +typedef int splice_actor(struct pipe_inode_info *, struct pipe_buffer *, struct splice_desc *); + +typedef int splice_direct_actor(struct pipe_inode_info *, struct splice_desc *); + +struct old_utimbuf32 { + old_time32_t actime; + old_time32_t modtime; +}; + +struct prepend_buffer { + char *buf; + int len; +}; + +typedef int __kernel_daddr_t; + +struct ustat { + __kernel_daddr_t f_tfree; + long unsigned int f_tinode; + char f_fname[6]; + char f_fpack[6]; +}; + +typedef s32 compat_daddr_t; + +typedef __kernel_fsid_t compat_fsid_t; + +struct compat_statfs { + int f_type; + int f_bsize; + int f_blocks; + int f_bfree; + int f_bavail; + int f_files; + int f_ffree; + compat_fsid_t f_fsid; + int f_namelen; + int f_frsize; + int f_flags; + int f_spare[4]; +}; + +struct compat_ustat { + compat_daddr_t f_tfree; + compat_ino_t f_tinode; + char f_fname[6]; + char f_fpack[6]; +}; + +struct statfs { + __kernel_long_t f_type; + __kernel_long_t f_bsize; + __kernel_long_t f_blocks; + __kernel_long_t f_bfree; + __kernel_long_t f_bavail; + __kernel_long_t f_files; + __kernel_long_t f_ffree; + __kernel_fsid_t f_fsid; + __kernel_long_t f_namelen; + __kernel_long_t f_frsize; + __kernel_long_t f_flags; + __kernel_long_t f_spare[4]; +}; + +struct statfs64 { + __kernel_long_t f_type; + __kernel_long_t f_bsize; + __u64 f_blocks; + __u64 f_bfree; + __u64 f_bavail; + __u64 f_files; + __u64 f_ffree; + __kernel_fsid_t f_fsid; + __kernel_long_t f_namelen; + __kernel_long_t f_frsize; + __kernel_long_t f_flags; + __kernel_long_t f_spare[4]; +}; + +struct compat_statfs64___2 { + __u32 f_type; + __u32 f_bsize; + __u64 f_blocks; + __u64 f_bfree; + __u64 f_bavail; + __u64 f_files; + __u64 f_ffree; + __kernel_fsid_t f_fsid; + __u32 f_namelen; + __u32 f_frsize; + __u32 f_flags; + __u32 f_spare[4]; +} __attribute__((packed)); + +struct ns_get_path_task_args { + const struct proc_ns_operations *ns_ops; + struct task_struct *task; +}; + +enum legacy_fs_param { + LEGACY_FS_UNSET_PARAMS = 0, + LEGACY_FS_MONOLITHIC_PARAMS = 1, + LEGACY_FS_INDIVIDUAL_PARAMS = 2, +}; + +struct legacy_fs_context { + char *legacy_data; + size_t data_size; + enum legacy_fs_param param_type; +}; + +enum fsconfig_command { + FSCONFIG_SET_FLAG = 0, + FSCONFIG_SET_STRING = 1, + FSCONFIG_SET_BINARY = 2, + FSCONFIG_SET_PATH = 3, + FSCONFIG_SET_PATH_EMPTY = 4, + FSCONFIG_SET_FD = 5, + FSCONFIG_CMD_CREATE = 6, + FSCONFIG_CMD_RECONFIGURE = 7, +}; + +typedef int get_block_t(struct inode *, sector_t, struct buffer_head *, int); + +struct dax_device; + +struct iomap_page_ops; + +struct iomap___2 { + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + struct block_device *bdev; + struct dax_device *dax_dev; + void *inline_data; + void *private; + const struct iomap_page_ops *page_ops; +}; + +struct iomap_page_ops { + int (*page_prepare)(struct inode *, loff_t, unsigned int); + void (*page_done)(struct inode *, loff_t, unsigned int, struct page *); +}; + +enum hctx_type { + HCTX_TYPE_DEFAULT = 0, + HCTX_TYPE_READ = 1, + HCTX_TYPE_POLL = 2, + HCTX_MAX_TYPES = 3, +}; + +struct decrypt_bh_ctx { + struct work_struct work; + struct buffer_head *bh; +}; + +struct bh_lru { + struct buffer_head *bhs[16]; +}; + +struct bh_accounting { + int nr; + int ratelimit; +}; + +typedef int dio_iodone_t(struct kiocb *, loff_t, ssize_t, void *); + +typedef void dio_submit_t(struct bio *, struct inode *, loff_t); + +enum { + DIO_LOCKING = 1, + DIO_SKIP_HOLES = 2, +}; + +struct dio_submit { + struct bio *bio; + unsigned int blkbits; + unsigned int blkfactor; + unsigned int start_zero_done; + int pages_in_io; + sector_t block_in_file; + unsigned int blocks_available; + int reap_counter; + sector_t final_block_in_request; + int boundary; + get_block_t *get_block; + dio_submit_t *submit_io; + loff_t logical_offset_in_bio; + sector_t final_block_in_bio; + sector_t next_block_for_io; + struct page *cur_page; + unsigned int cur_page_offset; + unsigned int cur_page_len; + sector_t cur_page_block; + loff_t cur_page_fs_offset; + struct iov_iter *iter; + unsigned int head; + unsigned int tail; + size_t from; + size_t to; +}; + +struct dio { + int flags; + int op; + int op_flags; + struct gendisk *bio_disk; + struct inode *inode; + loff_t i_size; + dio_iodone_t *end_io; + void *private; + spinlock_t bio_lock; + int page_errors; + int is_async; + bool defer_completion; + bool should_dirty; + int io_error; + long unsigned int refcount; + struct bio *bio_list; + struct task_struct *waiter; + struct kiocb *iocb; + ssize_t result; + union { + struct page *pages[64]; + struct work_struct complete_work; + }; + long: 64; +}; + +struct bvec_iter_all { + struct bio_vec bv; + int idx; + unsigned int done; +}; + +struct mpage_readpage_args { + struct bio *bio; + struct page *page; + unsigned int nr_pages; + bool is_readahead; + sector_t last_block_in_bio; + struct buffer_head map_bh; + long unsigned int first_logical_block; + get_block_t *get_block; +}; + +struct mpage_data { + struct bio *bio; + sector_t last_block_in_bio; + get_block_t *get_block; + unsigned int use_writepage; +}; + +typedef u32 nlink_t; + +typedef int (*proc_write_t)(struct file *, char *, size_t); + +struct proc_dir_entry { + atomic_t in_use; + refcount_t refcnt; + struct list_head pde_openers; + spinlock_t pde_unload_lock; + struct completion *pde_unload_completion; + const struct inode_operations *proc_iops; + union { + const struct proc_ops *proc_ops; + const struct file_operations *proc_dir_ops; + }; + const struct dentry_operations *proc_dops; + union { + const struct seq_operations *seq_ops; + int (*single_show)(struct seq_file *, void *); + }; + proc_write_t write; + void *data; + unsigned int state_size; + unsigned int low_ino; + nlink_t nlink; + kuid_t uid; + kgid_t gid; + loff_t size; + struct proc_dir_entry *parent; + struct rb_root subdir; + struct rb_node subdir_node; + char *name; + umode_t mode; + u8 flags; + u8 namelen; + char inline_name[0]; +}; + +union proc_op { + int (*proc_get_link)(struct dentry *, struct path *); + int (*proc_show)(struct seq_file *, struct pid_namespace *, struct pid *, struct task_struct *); + const char *lsm; +}; + +struct proc_inode { + struct pid *pid; + unsigned int fd; + union proc_op op; + struct proc_dir_entry *pde; + struct ctl_table_header *sysctl; + struct ctl_table *sysctl_entry; + struct hlist_node sibling_inodes; + const struct proc_ns_operations *ns_ops; + struct inode vfs_inode; +}; + +struct proc_fs_opts { + int flag; + const char *str; +}; + +struct fs_error_report { + int error; + struct inode *inode; + struct super_block *sb; +}; + +struct file_handle { + __u32 handle_bytes; + int handle_type; + unsigned char f_handle[0]; +}; + +struct inotify_inode_mark { + struct fsnotify_mark fsn_mark; + int wd; +}; + +struct dnotify_struct { + struct dnotify_struct *dn_next; + __u32 dn_mask; + int dn_fd; + struct file *dn_filp; + fl_owner_t dn_owner; +}; + +struct dnotify_mark { + struct fsnotify_mark fsn_mark; + struct dnotify_struct *dn; +}; + +struct inotify_event_info { + struct fsnotify_event fse; + u32 mask; + int wd; + u32 sync_cookie; + int name_len; + char name[0]; +}; + +struct inotify_event { + __s32 wd; + __u32 mask; + __u32 cookie; + __u32 len; + char name[0]; +}; + +enum { + FAN_EVENT_INIT = 0, + FAN_EVENT_REPORTED = 1, + FAN_EVENT_ANSWERED = 2, + FAN_EVENT_CANCELED = 3, +}; + +struct fanotify_fh { + u8 type; + u8 len; + u8 flags; + u8 pad; + unsigned char buf[0]; +}; + +struct fanotify_info { + u8 dir_fh_totlen; + u8 file_fh_totlen; + u8 name_len; + u8 pad; + unsigned char buf[0]; +}; + +enum fanotify_event_type { + FANOTIFY_EVENT_TYPE_FID = 0, + FANOTIFY_EVENT_TYPE_FID_NAME = 1, + FANOTIFY_EVENT_TYPE_PATH = 2, + FANOTIFY_EVENT_TYPE_PATH_PERM = 3, + FANOTIFY_EVENT_TYPE_OVERFLOW = 4, + FANOTIFY_EVENT_TYPE_FS_ERROR = 5, + __FANOTIFY_EVENT_TYPE_NUM = 6, +}; + +struct fanotify_event { + struct fsnotify_event fse; + struct hlist_node merge_list; + u32 mask; + struct { + unsigned int type: 3; + unsigned int hash: 29; + }; + struct pid *pid; +}; + +struct fanotify_fid_event { + struct fanotify_event fae; + __kernel_fsid_t fsid; + struct { + struct fanotify_fh object_fh; + unsigned char _inline_fh_buf[12]; + }; +}; + +struct fanotify_name_event { + struct fanotify_event fae; + __kernel_fsid_t fsid; + struct fanotify_info info; +}; + +struct fanotify_error_event { + struct fanotify_event fae; + s32 error; + u32 err_count; + __kernel_fsid_t fsid; + struct { + struct fanotify_fh object_fh; + unsigned char _inline_fh_buf[128]; + }; +}; + +struct fanotify_path_event { + struct fanotify_event fae; + struct path path; +}; + +struct fanotify_perm_event { + struct fanotify_event fae; + struct path path; + short unsigned int response; + short unsigned int state; + int fd; +}; + +struct fanotify_event_metadata { + __u32 event_len; + __u8 vers; + __u8 reserved; + __u16 metadata_len; + __u64 mask; + __s32 fd; + __s32 pid; +}; + +struct fanotify_event_info_header { + __u8 info_type; + __u8 pad; + __u16 len; +}; + +struct fanotify_event_info_fid { + struct fanotify_event_info_header hdr; + __kernel_fsid_t fsid; + unsigned char handle[0]; +}; + +struct fanotify_event_info_pidfd { + struct fanotify_event_info_header hdr; + __s32 pidfd; +}; + +struct fanotify_event_info_error { + struct fanotify_event_info_header hdr; + __s32 error; + __u32 error_count; +}; + +struct fanotify_response { + __s32 fd; + __u32 response; +}; + +struct epoll_event { + __poll_t events; + __u64 data; +}; + +struct epoll_filefd { + struct file *file; + int fd; +} __attribute__((packed)); + +struct epitem; + +struct eppoll_entry { + struct eppoll_entry *next; + struct epitem *base; + wait_queue_entry_t wait; + wait_queue_head_t *whead; +}; + +struct eventpoll; + +struct epitem { + union { + struct rb_node rbn; + struct callback_head rcu; + }; + struct list_head rdllink; + struct epitem *next; + struct epoll_filefd ffd; + struct eppoll_entry *pwqlist; + struct eventpoll *ep; + struct hlist_node fllink; + struct wakeup_source *ws; + struct epoll_event event; +}; + +struct eventpoll { + struct mutex mtx; + wait_queue_head_t wq; + wait_queue_head_t poll_wait; + struct list_head rdllist; + rwlock_t lock; + struct rb_root_cached rbr; + struct epitem *ovflist; + struct wakeup_source *ws; + struct user_struct *user; + struct file *file; + u64 gen; + struct hlist_head refs; + unsigned int napi_id; +}; + +struct ep_pqueue { + poll_table pt; + struct epitem *epi; +}; + +struct epitems_head { + struct hlist_head epitems; + struct epitems_head *next; +}; + +struct signalfd_siginfo { + __u32 ssi_signo; + __s32 ssi_errno; + __s32 ssi_code; + __u32 ssi_pid; + __u32 ssi_uid; + __s32 ssi_fd; + __u32 ssi_tid; + __u32 ssi_band; + __u32 ssi_overrun; + __u32 ssi_trapno; + __s32 ssi_status; + __s32 ssi_int; + __u64 ssi_ptr; + __u64 ssi_utime; + __u64 ssi_stime; + __u64 ssi_addr; + __u16 ssi_addr_lsb; + __u16 __pad2; + __s32 ssi_syscall; + __u64 ssi_call_addr; + __u32 ssi_arch; + __u8 __pad[28]; +}; + +struct signalfd_ctx { + sigset_t sigmask; +}; + +struct timerfd_ctx { + union { + struct hrtimer tmr; + struct alarm alarm; + } t; + ktime_t tintv; + ktime_t moffs; + wait_queue_head_t wqh; + u64 ticks; + int clockid; + short unsigned int expired; + short unsigned int settime_flags; + struct callback_head rcu; + struct list_head clist; + spinlock_t cancel_lock; + bool might_cancel; +}; + +struct eventfd_ctx___2 { + struct kref kref; + wait_queue_head_t wqh; + __u64 count; + unsigned int flags; + int id; +}; + +struct userfaultfd_ctx { + wait_queue_head_t fault_pending_wqh; + wait_queue_head_t fault_wqh; + wait_queue_head_t fd_wqh; + wait_queue_head_t event_wqh; + seqcount_spinlock_t refile_seq; + refcount_t refcount; + unsigned int flags; + unsigned int features; + bool released; + atomic_t mmap_changing; + struct mm_struct *mm; +}; + +struct uffd_msg { + __u8 event; + __u8 reserved1; + __u16 reserved2; + __u32 reserved3; + union { + struct { + __u64 flags; + __u64 address; + union { + __u32 ptid; + } feat; + } pagefault; + struct { + __u32 ufd; + } fork; + struct { + __u64 from; + __u64 to; + __u64 len; + } remap; + struct { + __u64 start; + __u64 end; + } remove; + struct { + __u64 reserved1; + __u64 reserved2; + __u64 reserved3; + } reserved; + } arg; +}; + +struct uffdio_api { + __u64 api; + __u64 features; + __u64 ioctls; +}; + +struct uffdio_range { + __u64 start; + __u64 len; +}; + +struct uffdio_register { + struct uffdio_range range; + __u64 mode; + __u64 ioctls; +}; + +struct uffdio_copy { + __u64 dst; + __u64 src; + __u64 len; + __u64 mode; + __s64 copy; +}; + +struct uffdio_zeropage { + struct uffdio_range range; + __u64 mode; + __s64 zeropage; +}; + +struct uffdio_writeprotect { + struct uffdio_range range; + __u64 mode; +}; + +struct uffdio_continue { + struct uffdio_range range; + __u64 mode; + __s64 mapped; +}; + +struct userfaultfd_fork_ctx { + struct userfaultfd_ctx *orig; + struct userfaultfd_ctx *new; + struct list_head list; +}; + +struct userfaultfd_unmap_ctx { + struct userfaultfd_ctx *ctx; + long unsigned int start; + long unsigned int end; + struct list_head list; +}; + +struct userfaultfd_wait_queue { + struct uffd_msg msg; + wait_queue_entry_t wq; + struct userfaultfd_ctx *ctx; + bool waken; +}; + +struct userfaultfd_wake_range { + long unsigned int start; + long unsigned int len; +}; + +typedef u32 compat_aio_context_t; + +struct kioctx; + +struct kioctx_table { + struct callback_head rcu; + unsigned int nr; + struct kioctx *table[0]; +}; + +typedef __kernel_ulong_t aio_context_t; + +enum { + IOCB_CMD_PREAD = 0, + IOCB_CMD_PWRITE = 1, + IOCB_CMD_FSYNC = 2, + IOCB_CMD_FDSYNC = 3, + IOCB_CMD_POLL = 5, + IOCB_CMD_NOOP = 6, + IOCB_CMD_PREADV = 7, + IOCB_CMD_PWRITEV = 8, +}; + +struct io_event { + __u64 data; + __u64 obj; + __s64 res; + __s64 res2; +}; + +struct iocb { + __u64 aio_data; + __u32 aio_key; + __kernel_rwf_t aio_rw_flags; + __u16 aio_lio_opcode; + __s16 aio_reqprio; + __u32 aio_fildes; + __u64 aio_buf; + __u64 aio_nbytes; + __s64 aio_offset; + __u64 aio_reserved2; + __u32 aio_flags; + __u32 aio_resfd; +}; + +typedef int kiocb_cancel_fn(struct kiocb *); + +struct aio_ring { + unsigned int id; + unsigned int nr; + unsigned int head; + unsigned int tail; + unsigned int magic; + unsigned int compat_features; + unsigned int incompat_features; + unsigned int header_length; + struct io_event io_events[0]; +}; + +struct kioctx_cpu; + +struct ctx_rq_wait; + +struct kioctx { + struct percpu_ref users; + atomic_t dead; + struct percpu_ref reqs; + long unsigned int user_id; + struct kioctx_cpu *cpu; + unsigned int req_batch; + unsigned int max_reqs; + unsigned int nr_events; + long unsigned int mmap_base; + long unsigned int mmap_size; + struct page **ring_pages; + long int nr_pages; + struct rcu_work free_rwork; + struct ctx_rq_wait *rq_wait; + long: 64; + long: 64; + long: 64; + struct { + atomic_t reqs_available; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + spinlock_t ctx_lock; + struct list_head active_reqs; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + struct mutex ring_lock; + wait_queue_head_t wait; + long: 64; + }; + struct { + unsigned int tail; + unsigned int completed_events; + spinlock_t completion_lock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct page *internal_pages[8]; + struct file *aio_ring_file; + unsigned int id; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct kioctx_cpu { + unsigned int reqs_available; +}; + +struct ctx_rq_wait { + struct completion comp; + atomic_t count; +}; + +struct fsync_iocb { + struct file *file; + struct work_struct work; + bool datasync; + struct cred *creds; +}; + +struct poll_iocb { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + bool cancelled; + bool work_scheduled; + bool work_need_resched; + struct wait_queue_entry wait; + struct work_struct work; +}; + +struct aio_kiocb { + union { + struct file *ki_filp; + struct kiocb rw; + struct fsync_iocb fsync; + struct poll_iocb poll; + }; + struct kioctx *ki_ctx; + kiocb_cancel_fn *ki_cancel; + struct io_event ki_res; + struct list_head ki_list; + refcount_t ki_refcnt; + struct eventfd_ctx *ki_eventfd; +}; + +struct aio_poll_table { + struct poll_table_struct pt; + struct aio_kiocb *iocb; + bool queued; + int error; +}; + +struct __aio_sigset { + const sigset_t *sigmask; + size_t sigsetsize; +}; + +struct __compat_aio_sigset { + compat_uptr_t sigmask; + compat_size_t sigsetsize; +}; + +typedef s32 compat_ssize_t; + +struct io_wq; + +struct io_wq_work_node; + +struct io_wq_work_list { + struct io_wq_work_node *first; + struct io_wq_work_node *last; +}; + +struct io_ring_ctx; + +struct io_uring_task { + int cached_refs; + struct xarray xa; + struct wait_queue_head wait; + const struct io_ring_ctx *last; + struct io_wq *io_wq; + struct percpu_counter inflight; + atomic_t inflight_tracked; + atomic_t in_idle; + spinlock_t task_lock; + struct io_wq_work_list task_list; + struct callback_head task_work; + bool task_running; +}; + +struct xa_limit { + u32 max; + u32 min; +}; + +struct iov_iter_state { + size_t iov_offset; + size_t count; + long unsigned int nr_segs; +}; + +struct user_msghdr { + void *msg_name; + int msg_namelen; + struct iovec *msg_iov; + __kernel_size_t msg_iovlen; + void *msg_control; + __kernel_size_t msg_controllen; + unsigned int msg_flags; +}; + +struct compat_msghdr { + compat_uptr_t msg_name; + compat_int_t msg_namelen; + compat_uptr_t msg_iov; + compat_size_t msg_iovlen; + compat_uptr_t msg_control; + compat_size_t msg_controllen; + compat_uint_t msg_flags; +}; + +struct scm_fp_list { + short int count; + short int max; + struct user_struct *user; + struct file *fp[253]; +}; + +struct unix_skb_parms { + struct pid *pid; + kuid_t uid; + kgid_t gid; + struct scm_fp_list *fp; + u32 secid; + u32 consumed; +}; + +struct io_uring_sqe { + __u8 opcode; + __u8 flags; + __u16 ioprio; + __s32 fd; + union { + __u64 off; + __u64 addr2; + }; + union { + __u64 addr; + __u64 splice_off_in; + }; + __u32 len; + union { + __kernel_rwf_t rw_flags; + __u32 fsync_flags; + __u16 poll_events; + __u32 poll32_events; + __u32 sync_range_flags; + __u32 msg_flags; + __u32 timeout_flags; + __u32 accept_flags; + __u32 cancel_flags; + __u32 open_flags; + __u32 statx_flags; + __u32 fadvise_advice; + __u32 splice_flags; + __u32 rename_flags; + __u32 unlink_flags; + __u32 hardlink_flags; + }; + __u64 user_data; + union { + __u16 buf_index; + __u16 buf_group; + }; + __u16 personality; + union { + __s32 splice_fd_in; + __u32 file_index; + }; + __u64 __pad2[2]; +}; + +enum { + IOSQE_FIXED_FILE_BIT = 0, + IOSQE_IO_DRAIN_BIT = 1, + IOSQE_IO_LINK_BIT = 2, + IOSQE_IO_HARDLINK_BIT = 3, + IOSQE_ASYNC_BIT = 4, + IOSQE_BUFFER_SELECT_BIT = 5, +}; + +enum { + IORING_OP_NOP = 0, + IORING_OP_READV = 1, + IORING_OP_WRITEV = 2, + IORING_OP_FSYNC = 3, + IORING_OP_READ_FIXED = 4, + IORING_OP_WRITE_FIXED = 5, + IORING_OP_POLL_ADD = 6, + IORING_OP_POLL_REMOVE = 7, + IORING_OP_SYNC_FILE_RANGE = 8, + IORING_OP_SENDMSG = 9, + IORING_OP_RECVMSG = 10, + IORING_OP_TIMEOUT = 11, + IORING_OP_TIMEOUT_REMOVE = 12, + IORING_OP_ACCEPT = 13, + IORING_OP_ASYNC_CANCEL = 14, + IORING_OP_LINK_TIMEOUT = 15, + IORING_OP_CONNECT = 16, + IORING_OP_FALLOCATE = 17, + IORING_OP_OPENAT = 18, + IORING_OP_CLOSE = 19, + IORING_OP_FILES_UPDATE = 20, + IORING_OP_STATX = 21, + IORING_OP_READ = 22, + IORING_OP_WRITE = 23, + IORING_OP_FADVISE = 24, + IORING_OP_MADVISE = 25, + IORING_OP_SEND = 26, + IORING_OP_RECV = 27, + IORING_OP_OPENAT2 = 28, + IORING_OP_EPOLL_CTL = 29, + IORING_OP_SPLICE = 30, + IORING_OP_PROVIDE_BUFFERS = 31, + IORING_OP_REMOVE_BUFFERS = 32, + IORING_OP_TEE = 33, + IORING_OP_SHUTDOWN = 34, + IORING_OP_RENAMEAT = 35, + IORING_OP_UNLINKAT = 36, + IORING_OP_MKDIRAT = 37, + IORING_OP_SYMLINKAT = 38, + IORING_OP_LINKAT = 39, + IORING_OP_LAST = 40, +}; + +struct io_uring_cqe { + __u64 user_data; + __s32 res; + __u32 flags; +}; + +enum { + IORING_CQE_BUFFER_SHIFT = 16, +}; + +struct io_sqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 flags; + __u32 dropped; + __u32 array; + __u32 resv1; + __u64 resv2; +}; + +struct io_cqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 overflow; + __u32 cqes; + __u32 flags; + __u32 resv1; + __u64 resv2; +}; + +struct io_uring_params { + __u32 sq_entries; + __u32 cq_entries; + __u32 flags; + __u32 sq_thread_cpu; + __u32 sq_thread_idle; + __u32 features; + __u32 wq_fd; + __u32 resv[3]; + struct io_sqring_offsets sq_off; + struct io_cqring_offsets cq_off; +}; + +enum { + IORING_REGISTER_BUFFERS = 0, + IORING_UNREGISTER_BUFFERS = 1, + IORING_REGISTER_FILES = 2, + IORING_UNREGISTER_FILES = 3, + IORING_REGISTER_EVENTFD = 4, + IORING_UNREGISTER_EVENTFD = 5, + IORING_REGISTER_FILES_UPDATE = 6, + IORING_REGISTER_EVENTFD_ASYNC = 7, + IORING_REGISTER_PROBE = 8, + IORING_REGISTER_PERSONALITY = 9, + IORING_UNREGISTER_PERSONALITY = 10, + IORING_REGISTER_RESTRICTIONS = 11, + IORING_REGISTER_ENABLE_RINGS = 12, + IORING_REGISTER_FILES2 = 13, + IORING_REGISTER_FILES_UPDATE2 = 14, + IORING_REGISTER_BUFFERS2 = 15, + IORING_REGISTER_BUFFERS_UPDATE = 16, + IORING_REGISTER_IOWQ_AFF = 17, + IORING_UNREGISTER_IOWQ_AFF = 18, + IORING_REGISTER_IOWQ_MAX_WORKERS = 19, + IORING_REGISTER_LAST = 20, +}; + +struct io_uring_rsrc_register { + __u32 nr; + __u32 resv; + __u64 resv2; + __u64 data; + __u64 tags; +}; + +struct io_uring_rsrc_update2 { + __u32 offset; + __u32 resv; + __u64 data; + __u64 tags; + __u32 nr; + __u32 resv2; +}; + +struct io_uring_probe_op { + __u8 op; + __u8 resv; + __u16 flags; + __u32 resv2; +}; + +struct io_uring_probe { + __u8 last_op; + __u8 ops_len; + __u16 resv; + __u32 resv2[3]; + struct io_uring_probe_op ops[0]; +}; + +struct io_uring_restriction { + __u16 opcode; + union { + __u8 register_op; + __u8 sqe_op; + __u8 sqe_flags; + }; + __u8 resv; + __u32 resv2[3]; +}; + +enum { + IORING_RESTRICTION_REGISTER_OP = 0, + IORING_RESTRICTION_SQE_OP = 1, + IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, + IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3, + IORING_RESTRICTION_LAST = 4, +}; + +struct io_uring_getevents_arg { + __u64 sigmask; + __u32 sigmask_sz; + __u32 pad; + __u64 ts; +}; + +struct trace_event_raw_io_uring_create { + struct trace_entry ent; + int fd; + void *ctx; + u32 sq_entries; + u32 cq_entries; + u32 flags; + char __data[0]; +}; + +struct trace_event_raw_io_uring_register { + struct trace_entry ent; + void *ctx; + unsigned int opcode; + unsigned int nr_files; + unsigned int nr_bufs; + bool eventfd; + long int ret; + char __data[0]; +}; + +struct trace_event_raw_io_uring_file_get { + struct trace_entry ent; + void *ctx; + int fd; + char __data[0]; +}; + +struct io_wq_work; + +struct trace_event_raw_io_uring_queue_async_work { + struct trace_entry ent; + void *ctx; + int rw; + void *req; + struct io_wq_work *work; + unsigned int flags; + char __data[0]; +}; + +struct io_wq_work_node { + struct io_wq_work_node *next; +}; + +struct io_wq_work { + struct io_wq_work_node list; + unsigned int flags; +}; + +struct trace_event_raw_io_uring_defer { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int data; + char __data[0]; +}; + +struct trace_event_raw_io_uring_link { + struct trace_entry ent; + void *ctx; + void *req; + void *target_req; + char __data[0]; +}; + +struct trace_event_raw_io_uring_cqring_wait { + struct trace_entry ent; + void *ctx; + int min_events; + char __data[0]; +}; + +struct trace_event_raw_io_uring_fail_link { + struct trace_entry ent; + void *req; + void *link; + char __data[0]; +}; + +struct trace_event_raw_io_uring_complete { + struct trace_entry ent; + void *ctx; + u64 user_data; + int res; + unsigned int cflags; + char __data[0]; +}; + +struct trace_event_raw_io_uring_submit_sqe { + struct trace_entry ent; + void *ctx; + void *req; + u8 opcode; + u64 user_data; + u32 flags; + bool force_nonblock; + bool sq_thread; + char __data[0]; +}; + +struct trace_event_raw_io_uring_poll_arm { + struct trace_entry ent; + void *ctx; + void *req; + u8 opcode; + u64 user_data; + int mask; + int events; + char __data[0]; +}; + +struct trace_event_raw_io_uring_poll_wake { + struct trace_entry ent; + void *ctx; + u8 opcode; + u64 user_data; + int mask; + char __data[0]; +}; + +struct trace_event_raw_io_uring_task_add { + struct trace_entry ent; + void *ctx; + u8 opcode; + u64 user_data; + int mask; + char __data[0]; +}; + +struct trace_event_raw_io_uring_task_run { + struct trace_entry ent; + void *ctx; + void *req; + u8 opcode; + u64 user_data; + char __data[0]; +}; + +struct trace_event_raw_io_uring_req_failed { + struct trace_entry ent; + u8 opcode; + u8 flags; + u8 ioprio; + u64 off; + u64 addr; + u32 len; + u32 op_flags; + u64 user_data; + u16 buf_index; + u16 personality; + u32 file_index; + u64 pad1; + u64 pad2; + int error; + char __data[0]; +}; + +struct trace_event_data_offsets_io_uring_create {}; + +struct trace_event_data_offsets_io_uring_register {}; + +struct trace_event_data_offsets_io_uring_file_get {}; + +struct trace_event_data_offsets_io_uring_queue_async_work {}; + +struct trace_event_data_offsets_io_uring_defer {}; + +struct trace_event_data_offsets_io_uring_link {}; + +struct trace_event_data_offsets_io_uring_cqring_wait {}; + +struct trace_event_data_offsets_io_uring_fail_link {}; + +struct trace_event_data_offsets_io_uring_complete {}; + +struct trace_event_data_offsets_io_uring_submit_sqe {}; + +struct trace_event_data_offsets_io_uring_poll_arm {}; + +struct trace_event_data_offsets_io_uring_poll_wake {}; + +struct trace_event_data_offsets_io_uring_task_add {}; + +struct trace_event_data_offsets_io_uring_task_run {}; + +struct trace_event_data_offsets_io_uring_req_failed {}; + +typedef void (*btf_trace_io_uring_create)(void *, int, void *, u32, u32, u32); + +typedef void (*btf_trace_io_uring_register)(void *, void *, unsigned int, unsigned int, unsigned int, bool, long int); + +typedef void (*btf_trace_io_uring_file_get)(void *, void *, int); + +typedef void (*btf_trace_io_uring_queue_async_work)(void *, void *, int, void *, struct io_wq_work *, unsigned int); + +typedef void (*btf_trace_io_uring_defer)(void *, void *, void *, long long unsigned int); + +typedef void (*btf_trace_io_uring_link)(void *, void *, void *, void *); + +typedef void (*btf_trace_io_uring_cqring_wait)(void *, void *, int); + +typedef void (*btf_trace_io_uring_fail_link)(void *, void *, void *); + +typedef void (*btf_trace_io_uring_complete)(void *, void *, u64, int, unsigned int); + +typedef void (*btf_trace_io_uring_submit_sqe)(void *, void *, void *, u8, u64, u32, bool, bool); + +typedef void (*btf_trace_io_uring_poll_arm)(void *, void *, void *, u8, u64, int, int); + +typedef void (*btf_trace_io_uring_poll_wake)(void *, void *, u8, u64, int); + +typedef void (*btf_trace_io_uring_task_add)(void *, void *, u8, u64, int); + +typedef void (*btf_trace_io_uring_task_run)(void *, void *, void *, u8, u64); + +typedef void (*btf_trace_io_uring_req_failed)(void *, const struct io_uring_sqe *, int); + +enum { + IO_WQ_WORK_CANCEL = 1, + IO_WQ_WORK_HASHED = 2, + IO_WQ_WORK_UNBOUND = 4, + IO_WQ_WORK_CONCURRENT = 16, + IO_WQ_HASH_SHIFT = 24, +}; + +enum io_wq_cancel { + IO_WQ_CANCEL_OK = 0, + IO_WQ_CANCEL_RUNNING = 1, + IO_WQ_CANCEL_NOTFOUND = 2, +}; + +typedef struct io_wq_work *free_work_fn(struct io_wq_work *); + +typedef void io_wq_work_fn(struct io_wq_work *); + +struct io_wq_hash { + refcount_t refs; + long unsigned int map; + struct wait_queue_head wait; +}; + +struct io_wq_data { + struct io_wq_hash *hash; + struct task_struct *task; + io_wq_work_fn *do_work; + free_work_fn *free_work; +}; + +typedef bool work_cancel_fn(struct io_wq_work *, void *); + +struct io_uring { + u32 head; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 tail; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_rings { + struct io_uring sq; + struct io_uring cq; + u32 sq_ring_mask; + u32 cq_ring_mask; + u32 sq_ring_entries; + u32 cq_ring_entries; + u32 sq_dropped; + u32 sq_flags; + u32 cq_flags; + u32 cq_overflow; + long: 64; + long: 64; + long: 64; + long: 64; + struct io_uring_cqe cqes[0]; +}; + +enum io_uring_cmd_flags { + IO_URING_F_COMPLETE_DEFER = 1, + IO_URING_F_UNLOCKED = 2, + IO_URING_F_NONBLOCK = 2147483648, +}; + +struct io_mapped_ubuf { + u64 ubuf; + u64 ubuf_end; + unsigned int nr_bvecs; + long unsigned int acct_pages; + struct bio_vec bvec[0]; +}; + +struct io_overflow_cqe { + struct io_uring_cqe cqe; + struct list_head list; +}; + +struct io_fixed_file { + long unsigned int file_ptr; +}; + +struct io_rsrc_put { + struct list_head list; + u64 tag; + union { + void *rsrc; + struct file *file; + struct io_mapped_ubuf *buf; + }; +}; + +struct io_file_table { + struct io_fixed_file *files; +}; + +struct io_rsrc_data; + +struct io_rsrc_node { + struct percpu_ref refs; + struct list_head node; + struct list_head rsrc_list; + struct io_rsrc_data *rsrc_data; + struct llist_node llist; + bool done; +}; + +typedef void rsrc_put_fn(struct io_ring_ctx *, struct io_rsrc_put *); + +struct io_rsrc_data { + struct io_ring_ctx *ctx; + u64 **tags; + unsigned int nr; + rsrc_put_fn *do_put; + atomic_t refs; + struct completion done; + bool quiesce; +}; + +struct io_kiocb; + +struct io_submit_link { + struct io_kiocb *head; + struct io_kiocb *last; +}; + +struct io_submit_state { + struct io_wq_work_node free_list; + struct io_wq_work_list compl_reqs; + struct io_submit_link link; + bool plug_started; + bool need_plug; + short unsigned int submit_nr; + struct blk_plug plug; +}; + +struct io_restriction { + long unsigned int register_op[1]; + long unsigned int sqe_op[1]; + u8 sqe_flags_allowed; + u8 sqe_flags_required; + bool registered; +}; + +struct io_sq_data; + +struct io_ring_ctx { + struct { + struct percpu_ref refs; + struct io_rings *rings; + unsigned int flags; + unsigned int compat: 1; + unsigned int drain_next: 1; + unsigned int eventfd_async: 1; + unsigned int restricted: 1; + unsigned int off_timeout_used: 1; + unsigned int drain_active: 1; + long: 26; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + struct mutex uring_lock; + u32 *sq_array; + struct io_uring_sqe *sq_sqes; + unsigned int cached_sq_head; + unsigned int sq_entries; + struct list_head defer_list; + struct io_rsrc_node *rsrc_node; + int rsrc_cached_refs; + struct io_file_table file_table; + unsigned int nr_user_files; + unsigned int nr_user_bufs; + struct io_mapped_ubuf **user_bufs; + struct io_submit_state submit_state; + struct list_head timeout_list; + struct list_head ltimeout_list; + struct list_head cq_overflow_list; + struct xarray io_buffers; + struct xarray personalities; + u32 pers_next; + unsigned int sq_thread_idle; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct io_wq_work_list locked_free_list; + unsigned int locked_free_nr; + const struct cred *sq_creds; + struct io_sq_data *sq_data; + struct wait_queue_head sqo_sq_wait; + struct list_head sqd_list; + long unsigned int check_cq_overflow; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct { + unsigned int cached_cq_tail; + unsigned int cq_entries; + struct eventfd_ctx *cq_ev_fd; + struct wait_queue_head cq_wait; + unsigned int cq_extra; + atomic_t cq_timeouts; + unsigned int cq_last_tm_flush; + long: 32; + long: 64; + }; + struct { + spinlock_t completion_lock; + spinlock_t timeout_lock; + struct io_wq_work_list iopoll_list; + struct hlist_head *cancel_hash; + unsigned int cancel_hash_bits; + bool poll_multi_queue; + long: 24; + long: 64; + long: 64; + long: 64; + }; + struct io_restriction restrictions; + struct { + struct io_rsrc_node *rsrc_backup_node; + struct io_mapped_ubuf *dummy_ubuf; + struct io_rsrc_data *file_data; + struct io_rsrc_data *buf_data; + struct delayed_work rsrc_put_work; + struct llist_head rsrc_put_llist; + struct list_head rsrc_ref_list; + spinlock_t rsrc_ref_lock; + }; + struct { + struct socket *ring_sock; + struct io_wq_hash *hash_map; + struct user_struct *user; + struct mm_struct *mm_account; + struct llist_head fallback_llist; + struct delayed_work fallback_work; + struct work_struct exit_work; + struct list_head tctx_list; + struct completion ref_comp; + u32 iowq_limits[2]; + bool iowq_limits_set; + }; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_buffer { + struct list_head list; + __u64 addr; + __u32 len; + __u16 bid; +}; + +enum { + IO_SQ_THREAD_SHOULD_STOP = 0, + IO_SQ_THREAD_SHOULD_PARK = 1, +}; + +struct io_sq_data { + refcount_t refs; + atomic_t park_pending; + struct mutex lock; + struct list_head ctx_list; + struct task_struct *thread; + struct wait_queue_head wait; + unsigned int sq_thread_idle; + int sq_cpu; + pid_t task_pid; + pid_t task_tgid; + long unsigned int state; + struct completion exited; +}; + +struct io_rw { + struct kiocb kiocb; + u64 addr; + u64 len; +}; + +struct io_poll_iocb { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + bool done; + bool canceled; + struct wait_queue_entry wait; +}; + +struct io_poll_update { + struct file *file; + u64 old_user_data; + u64 new_user_data; + __poll_t events; + bool update_events; + bool update_user_data; +}; + +struct io_accept { + struct file *file; + struct sockaddr *addr; + int *addr_len; + int flags; + u32 file_slot; + long unsigned int nofile; +}; + +struct io_sync { + struct file *file; + loff_t len; + loff_t off; + int flags; + int mode; +}; + +struct io_cancel { + struct file *file; + u64 addr; +}; + +struct io_timeout { + struct file *file; + u32 off; + u32 target_seq; + struct list_head list; + struct io_kiocb *head; + struct io_kiocb *prev; +}; + +struct io_timeout_rem { + struct file *file; + u64 addr; + struct timespec64 ts; + u32 flags; + bool ltimeout; +}; + +struct io_connect { + struct file *file; + struct sockaddr *addr; + int addr_len; +}; + +struct io_sr_msg { + struct file *file; + union { + struct compat_msghdr *umsg_compat; + struct user_msghdr *umsg; + void *buf; + }; + int msg_flags; + int bgid; + size_t len; +}; + +struct io_open { + struct file *file; + int dfd; + u32 file_slot; + struct filename *filename; + struct open_how how; + long unsigned int nofile; +}; + +struct io_close { + struct file *file; + int fd; + u32 file_slot; +}; + +struct io_rsrc_update { + struct file *file; + u64 arg; + u32 nr_args; + u32 offset; +}; + +struct io_fadvise { + struct file *file; + u64 offset; + u32 len; + u32 advice; +}; + +struct io_madvise { + struct file *file; + u64 addr; + u32 len; + u32 advice; +}; + +struct io_epoll { + struct file *file; + int epfd; + int op; + int fd; + struct epoll_event event; +}; + +struct io_splice { + struct file *file_out; + struct file *file_in; + loff_t off_out; + loff_t off_in; + u64 len; + unsigned int flags; +}; + +struct io_provide_buf { + struct file *file; + __u64 addr; + __u32 len; + __u32 bgid; + __u16 nbufs; + __u16 bid; +}; + +struct io_statx { + struct file *file; + int dfd; + unsigned int mask; + unsigned int flags; + const char *filename; + struct statx *buffer; +}; + +struct io_shutdown { + struct file *file; + int how; +}; + +struct io_rename { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +struct io_unlink { + struct file *file; + int dfd; + int flags; + struct filename *filename; +}; + +struct io_mkdir { + struct file *file; + int dfd; + umode_t mode; + struct filename *filename; +}; + +struct io_symlink { + struct file *file; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; +}; + +struct io_hardlink { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +typedef void (*io_req_tw_func_t)(struct io_kiocb *, bool *); + +struct io_task_work { + union { + struct io_wq_work_node node; + struct llist_node fallback_node; + }; + io_req_tw_func_t func; +}; + +struct async_poll; + +struct io_kiocb { + union { + struct file *file; + struct io_rw rw; + struct io_poll_iocb poll; + struct io_poll_update poll_update; + struct io_accept accept; + struct io_sync sync; + struct io_cancel cancel; + struct io_timeout timeout; + struct io_timeout_rem timeout_rem; + struct io_connect connect; + struct io_sr_msg sr_msg; + struct io_open open; + struct io_close close; + struct io_rsrc_update rsrc_update; + struct io_fadvise fadvise; + struct io_madvise madvise; + struct io_epoll epoll; + struct io_splice splice; + struct io_provide_buf pbuf; + struct io_statx statx; + struct io_shutdown shutdown; + struct io_rename rename; + struct io_unlink unlink; + struct io_mkdir mkdir; + struct io_symlink symlink; + struct io_hardlink hardlink; + }; + u8 opcode; + u8 iopoll_completed; + u16 buf_index; + unsigned int flags; + u64 user_data; + u32 result; + u32 cflags; + struct io_ring_ctx *ctx; + struct task_struct *task; + struct percpu_ref *fixed_rsrc_refs; + struct io_mapped_ubuf *imu; + struct io_wq_work_node comp_list; + atomic_t refs; + struct io_kiocb *link; + struct io_task_work io_task_work; + struct hlist_node hash_node; + struct async_poll *apoll; + void *async_data; + struct io_wq_work work; + const struct cred *creds; + struct io_buffer *kbuf; +}; + +struct io_timeout_data { + struct io_kiocb *req; + struct hrtimer timer; + struct timespec64 ts; + enum hrtimer_mode mode; + u32 flags; +}; + +struct io_async_connect { + struct __kernel_sockaddr_storage address; +}; + +struct io_async_msghdr { + struct iovec fast_iov[8]; + struct iovec *free_iov; + struct sockaddr *uaddr; + struct msghdr msg; + struct __kernel_sockaddr_storage addr; +}; + +struct io_rw_state { + struct iov_iter iter; + struct iov_iter_state iter_state; + struct iovec fast_iov[8]; +}; + +struct io_async_rw { + struct io_rw_state s; + const struct iovec *free_iovec; + size_t bytes_done; + struct wait_page_queue wpq; +}; + +enum { + REQ_F_FIXED_FILE_BIT = 0, + REQ_F_IO_DRAIN_BIT = 1, + REQ_F_LINK_BIT = 2, + REQ_F_HARDLINK_BIT = 3, + REQ_F_FORCE_ASYNC_BIT = 4, + REQ_F_BUFFER_SELECT_BIT = 5, + REQ_F_FAIL_BIT = 8, + REQ_F_INFLIGHT_BIT = 9, + REQ_F_CUR_POS_BIT = 10, + REQ_F_NOWAIT_BIT = 11, + REQ_F_LINK_TIMEOUT_BIT = 12, + REQ_F_NEED_CLEANUP_BIT = 13, + REQ_F_POLLED_BIT = 14, + REQ_F_BUFFER_SELECTED_BIT = 15, + REQ_F_COMPLETE_INLINE_BIT = 16, + REQ_F_REISSUE_BIT = 17, + REQ_F_CREDS_BIT = 18, + REQ_F_REFCOUNT_BIT = 19, + REQ_F_ARM_LTIMEOUT_BIT = 20, + REQ_F_ASYNC_DATA_BIT = 21, + REQ_F_SUPPORT_NOWAIT_BIT = 22, + REQ_F_ISREG_BIT = 23, + __REQ_F_LAST_BIT = 24, +}; + +enum { + REQ_F_FIXED_FILE = 1, + REQ_F_IO_DRAIN = 2, + REQ_F_LINK = 4, + REQ_F_HARDLINK = 8, + REQ_F_FORCE_ASYNC = 16, + REQ_F_BUFFER_SELECT = 32, + REQ_F_FAIL = 256, + REQ_F_INFLIGHT = 512, + REQ_F_CUR_POS = 1024, + REQ_F_NOWAIT = 2048, + REQ_F_LINK_TIMEOUT = 4096, + REQ_F_NEED_CLEANUP = 8192, + REQ_F_POLLED = 16384, + REQ_F_BUFFER_SELECTED = 32768, + REQ_F_COMPLETE_INLINE = 65536, + REQ_F_REISSUE = 131072, + REQ_F_SUPPORT_NOWAIT = 4194304, + REQ_F_ISREG = 8388608, + REQ_F_CREDS = 262144, + REQ_F_REFCOUNT = 524288, + REQ_F_ARM_LTIMEOUT = 1048576, + REQ_F_ASYNC_DATA = 2097152, +}; + +struct async_poll { + struct io_poll_iocb poll; + struct io_poll_iocb *double_poll; +}; + +enum { + IORING_RSRC_FILE = 0, + IORING_RSRC_BUFFER = 1, +}; + +struct io_tctx_node { + struct list_head ctx_node; + struct task_struct *task; + struct io_ring_ctx *ctx; +}; + +struct io_defer_entry { + struct list_head list; + struct io_kiocb *req; + u32 seq; +}; + +struct io_op_def { + unsigned int needs_file: 1; + unsigned int plug: 1; + unsigned int hash_reg_file: 1; + unsigned int unbound_nonreg_file: 1; + unsigned int pollin: 1; + unsigned int pollout: 1; + unsigned int buffer_select: 1; + unsigned int needs_async_setup: 1; + unsigned int not_supported: 1; + unsigned int audit_skip: 1; + short unsigned int async_size; +}; + +struct io_poll_table { + struct poll_table_struct pt; + struct io_kiocb *req; + int nr_entries; + int error; +}; + +enum { + IO_APOLL_OK = 0, + IO_APOLL_ABORTED = 1, + IO_APOLL_READY = 2, +}; + +struct io_cancel_data { + struct io_ring_ctx *ctx; + u64 user_data; +}; + +struct io_wait_queue { + struct wait_queue_entry wq; + struct io_ring_ctx *ctx; + unsigned int cq_tail; + unsigned int nr_timeouts; +}; + +struct io_tctx_exit { + struct callback_head task_work; + struct completion completion; + struct io_ring_ctx *ctx; +}; + +struct io_task_cancel { + struct task_struct *task; + bool all; +}; + +struct creds; + +enum { + IO_WQ_BOUND = 0, + IO_WQ_UNBOUND = 1, +}; + +enum { + IO_WORKER_F_UP = 1, + IO_WORKER_F_RUNNING = 2, + IO_WORKER_F_FREE = 4, + IO_WORKER_F_BOUND = 8, +}; + +enum { + IO_WQ_BIT_EXIT = 0, +}; + +enum { + IO_ACCT_STALLED_BIT = 0, +}; + +struct io_wqe; + +struct io_worker { + refcount_t ref; + unsigned int flags; + struct hlist_nulls_node nulls_node; + struct list_head all_list; + struct task_struct *task; + struct io_wqe *wqe; + struct io_wq_work *cur_work; + spinlock_t lock; + struct completion ref_done; + long unsigned int create_state; + struct callback_head create_work; + int create_index; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +struct io_wqe_acct { + unsigned int nr_workers; + unsigned int max_workers; + int index; + atomic_t nr_running; + struct io_wq_work_list work_list; + long unsigned int flags; +}; + +struct io_wq___2; + +struct io_wqe { + raw_spinlock_t lock; + struct io_wqe_acct acct[2]; + int node; + struct hlist_nulls_head free_list; + struct list_head all_list; + struct wait_queue_entry wait; + struct io_wq___2 *wq; + struct io_wq_work *hash_tail[64]; + cpumask_var_t cpu_mask; +}; + +enum { + IO_WQ_ACCT_BOUND = 0, + IO_WQ_ACCT_UNBOUND = 1, + IO_WQ_ACCT_NR = 2, +}; + +struct io_wq___2 { + long unsigned int state; + free_work_fn *free_work; + io_wq_work_fn *do_work; + struct io_wq_hash *hash; + atomic_t worker_refs; + struct completion worker_done; + struct hlist_node cpuhp_node; + struct task_struct *task; + struct io_wqe *wqes[0]; +}; + +struct io_cb_cancel_data { + work_cancel_fn *fn; + void *data; + int nr_running; + int nr_pending; + bool cancel_all; +}; + +struct online_data { + unsigned int cpu; + bool online; +}; + +struct iomap_ops { + int (*iomap_begin)(struct inode *, loff_t, loff_t, unsigned int, struct iomap___2 *, struct iomap___2 *); + int (*iomap_end)(struct inode *, loff_t, loff_t, ssize_t, unsigned int, struct iomap___2 *); +}; + +struct iomap_iter { + struct inode *inode; + loff_t pos; + u64 len; + s64 processed; + unsigned int flags; + struct iomap___2 iomap; + struct iomap___2 srcmap; +}; + +struct trace_event_raw_dax_pmd_fault_class { + struct trace_entry ent; + long unsigned int ino; + long unsigned int vm_start; + long unsigned int vm_end; + long unsigned int vm_flags; + long unsigned int address; + long unsigned int pgoff; + long unsigned int max_pgoff; + dev_t dev; + unsigned int flags; + int result; + char __data[0]; +}; + +struct trace_event_raw_dax_pmd_load_hole_class { + struct trace_entry ent; + long unsigned int ino; + long unsigned int vm_flags; + long unsigned int address; + struct page *zero_page; + void *radix_entry; + dev_t dev; + char __data[0]; +}; + +struct trace_event_raw_dax_pmd_insert_mapping_class { + struct trace_entry ent; + long unsigned int ino; + long unsigned int vm_flags; + long unsigned int address; + long int length; + u64 pfn_val; + void *radix_entry; + dev_t dev; + int write; + char __data[0]; +}; + +struct trace_event_raw_dax_pte_fault_class { + struct trace_entry ent; + long unsigned int ino; + long unsigned int vm_flags; + long unsigned int address; + long unsigned int pgoff; + dev_t dev; + unsigned int flags; + int result; + char __data[0]; +}; + +struct trace_event_raw_dax_insert_mapping { + struct trace_entry ent; + long unsigned int ino; + long unsigned int vm_flags; + long unsigned int address; + void *radix_entry; + dev_t dev; + int write; + char __data[0]; +}; + +struct trace_event_raw_dax_writeback_range_class { + struct trace_entry ent; + long unsigned int ino; + long unsigned int start_index; + long unsigned int end_index; + dev_t dev; + char __data[0]; +}; + +struct trace_event_raw_dax_writeback_one { + struct trace_entry ent; + long unsigned int ino; + long unsigned int pgoff; + long unsigned int pglen; + dev_t dev; + char __data[0]; +}; + +struct trace_event_data_offsets_dax_pmd_fault_class {}; + +struct trace_event_data_offsets_dax_pmd_load_hole_class {}; + +struct trace_event_data_offsets_dax_pmd_insert_mapping_class {}; + +struct trace_event_data_offsets_dax_pte_fault_class {}; + +struct trace_event_data_offsets_dax_insert_mapping {}; + +struct trace_event_data_offsets_dax_writeback_range_class {}; + +struct trace_event_data_offsets_dax_writeback_one {}; + +typedef void (*btf_trace_dax_pmd_fault)(void *, struct inode *, struct vm_fault *, long unsigned int, int); + +typedef void (*btf_trace_dax_pmd_fault_done)(void *, struct inode *, struct vm_fault *, long unsigned int, int); + +typedef void (*btf_trace_dax_pmd_load_hole)(void *, struct inode *, struct vm_fault *, struct page *, void *); + +typedef void (*btf_trace_dax_pmd_load_hole_fallback)(void *, struct inode *, struct vm_fault *, struct page *, void *); + +typedef void (*btf_trace_dax_pmd_insert_mapping)(void *, struct inode *, struct vm_fault *, long int, pfn_t, void *); + +typedef void (*btf_trace_dax_pte_fault)(void *, struct inode *, struct vm_fault *, int); + +typedef void (*btf_trace_dax_pte_fault_done)(void *, struct inode *, struct vm_fault *, int); + +typedef void (*btf_trace_dax_load_hole)(void *, struct inode *, struct vm_fault *, int); + +typedef void (*btf_trace_dax_insert_pfn_mkwrite_no_entry)(void *, struct inode *, struct vm_fault *, int); + +typedef void (*btf_trace_dax_insert_pfn_mkwrite)(void *, struct inode *, struct vm_fault *, int); + +typedef void (*btf_trace_dax_insert_mapping)(void *, struct inode *, struct vm_fault *, void *); + +typedef void (*btf_trace_dax_writeback_range)(void *, struct inode *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_dax_writeback_range_done)(void *, struct inode *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_dax_writeback_one)(void *, struct inode *, long unsigned int, long unsigned int); + +struct exceptional_entry_key { + struct xarray *xa; + long unsigned int entry_start; +}; + +struct wait_exceptional_entry_queue { + wait_queue_entry_t wait; + struct exceptional_entry_key key; +}; + +enum dax_wake_mode { + WAKE_ALL = 0, + WAKE_NEXT = 1, +}; + +struct crypto_skcipher; + +struct fscrypt_blk_crypto_key; + +struct fscrypt_prepared_key { + struct crypto_skcipher *tfm; + struct fscrypt_blk_crypto_key *blk_key; +}; + +struct fscrypt_mode; + +struct fscrypt_direct_key; + +struct fscrypt_info { + struct fscrypt_prepared_key ci_enc_key; + bool ci_owns_key; + bool ci_inlinecrypt; + struct fscrypt_mode *ci_mode; + struct inode *ci_inode; + struct key *ci_master_key; + struct list_head ci_master_key_link; + struct fscrypt_direct_key *ci_direct_key; + siphash_key_t ci_dirhash_key; + bool ci_dirhash_key_initialized; + union fscrypt_policy ci_policy; + u8 ci_nonce[16]; + u32 ci_hashed_ino; +}; + +struct skcipher_request { + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + struct crypto_async_request base; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_skcipher { + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +struct fscrypt_mode { + const char *friendly_name; + const char *cipher_str; + int keysize; + int security_strength; + int ivsize; + int logged_impl_name; + enum blk_crypto_mode_num blk_crypto_mode; +}; + +typedef enum { + FS_DECRYPT = 0, + FS_ENCRYPT = 1, +} fscrypt_direction_t; + +union fscrypt_iv { + struct { + __le64 lblk_num; + u8 nonce[16]; + }; + u8 raw[32]; + __le64 dun[4]; +}; + +struct fscrypt_str { + unsigned char *name; + u32 len; +}; + +struct fscrypt_name { + const struct qstr *usr_fname; + struct fscrypt_str disk_name; + u32 hash; + u32 minor_hash; + struct fscrypt_str crypto_buf; + bool is_nokey_name; +}; + +struct fscrypt_nokey_name { + u32 dirhash[2]; + u8 bytes[149]; + u8 sha256[32]; +}; + +struct shash_alg { + int (*init)(struct shash_desc *); + int (*update)(struct shash_desc *, const u8 *, unsigned int); + int (*final)(struct shash_desc *, u8 *); + int (*finup)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*digest)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*export)(struct shash_desc *, void *); + int (*import)(struct shash_desc *, const void *); + int (*setkey)(struct crypto_shash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_shash *); + void (*exit_tfm)(struct crypto_shash *); + unsigned int descsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int digestsize; + unsigned int statesize; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct fscrypt_hkdf { + struct crypto_shash *hmac_tfm; +}; + +struct fscrypt_key_specifier { + __u32 type; + __u32 __reserved; + union { + __u8 __reserved[32]; + __u8 descriptor[8]; + __u8 identifier[16]; + } u; +}; + +struct fscrypt_symlink_data { + __le16 len; + char encrypted_path[1]; +} __attribute__((packed)); + +struct fscrypt_master_key_secret { + struct fscrypt_hkdf hkdf; + u32 size; + u8 raw[64]; +}; + +struct fscrypt_master_key { + struct fscrypt_master_key_secret mk_secret; + struct fscrypt_key_specifier mk_spec; + struct key *mk_users; + refcount_t mk_refcount; + struct list_head mk_decrypted_inodes; + spinlock_t mk_decrypted_inodes_lock; + struct fscrypt_prepared_key mk_direct_keys[10]; + struct fscrypt_prepared_key mk_iv_ino_lblk_64_keys[10]; + struct fscrypt_prepared_key mk_iv_ino_lblk_32_keys[10]; + siphash_key_t mk_ino_hash_key; + bool mk_ino_hash_key_initialized; +}; + +enum key_state { + KEY_IS_UNINSTANTIATED = 0, + KEY_IS_POSITIVE = 1, +}; + +struct fscrypt_provisioning_key_payload { + __u32 type; + __u32 __reserved; + __u8 raw[0]; +}; + +struct fscrypt_add_key_arg { + struct fscrypt_key_specifier key_spec; + __u32 raw_size; + __u32 key_id; + __u32 __reserved[8]; + __u8 raw[0]; +}; + +struct fscrypt_remove_key_arg { + struct fscrypt_key_specifier key_spec; + __u32 removal_status_flags; + __u32 __reserved[5]; +}; + +struct fscrypt_get_key_status_arg { + struct fscrypt_key_specifier key_spec; + __u32 __reserved[6]; + __u32 status; + __u32 status_flags; + __u32 user_count; + __u32 __out_reserved[13]; +}; + +struct skcipher_alg { + int (*setkey)(struct crypto_skcipher *, const u8 *, unsigned int); + int (*encrypt)(struct skcipher_request *); + int (*decrypt)(struct skcipher_request *); + int (*init)(struct crypto_skcipher *); + void (*exit)(struct crypto_skcipher *); + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; + unsigned int chunksize; + unsigned int walksize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct fscrypt_context_v1 { + u8 version; + u8 contents_encryption_mode; + u8 filenames_encryption_mode; + u8 flags; + u8 master_key_descriptor[8]; + u8 nonce[16]; +}; + +struct fscrypt_context_v2 { + u8 version; + u8 contents_encryption_mode; + u8 filenames_encryption_mode; + u8 flags; + u8 __reserved[4]; + u8 master_key_identifier[16]; + u8 nonce[16]; +}; + +union fscrypt_context { + u8 version; + struct fscrypt_context_v1 v1; + struct fscrypt_context_v2 v2; +}; + +struct crypto_template; + +struct crypto_spawn; + +struct crypto_instance { + struct crypto_alg alg; + struct crypto_template *tmpl; + union { + struct hlist_node list; + struct crypto_spawn *spawns; + }; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_spawn { + struct list_head list; + struct crypto_alg *alg; + union { + struct crypto_instance *inst; + struct crypto_spawn *next; + }; + const struct crypto_type *frontend; + u32 mask; + bool dead; + bool registered; +}; + +struct rtattr; + +struct crypto_template { + struct list_head list; + struct hlist_head instances; + struct module *module; + int (*create)(struct crypto_template *, struct rtattr **); + char name[128]; +}; + +struct user_key_payload { + struct callback_head rcu; + short unsigned int datalen; + long: 48; + char data[0]; +}; + +struct fscrypt_key { + __u32 mode; + __u8 raw[64]; + __u32 size; +}; + +struct fscrypt_direct_key { + struct hlist_node dk_node; + refcount_t dk_refcount; + const struct fscrypt_mode *dk_mode; + struct fscrypt_prepared_key dk_key; + u8 dk_descriptor[8]; + u8 dk_raw[64]; +}; + +struct fscrypt_get_policy_ex_arg { + __u64 policy_size; + union { + __u8 version; + struct fscrypt_policy_v1 v1; + struct fscrypt_policy_v2 v2; + } policy; +}; + +struct fscrypt_dummy_policy { + const union fscrypt_policy *policy; +}; + +struct fscrypt_blk_crypto_key { + struct blk_crypto_key base; + int num_devs; + struct request_queue *devs[0]; +}; + +struct fsverity_hash_alg; + +struct merkle_tree_params { + struct fsverity_hash_alg *hash_alg; + const u8 *hashstate; + unsigned int digest_size; + unsigned int block_size; + unsigned int hashes_per_block; + unsigned int log_blocksize; + unsigned int log_arity; + unsigned int num_levels; + u64 tree_size; + long unsigned int level0_blocks; + u64 level_start[8]; +}; + +struct fsverity_info { + struct merkle_tree_params tree_params; + u8 root_hash[64]; + u8 file_digest[64]; + const struct inode *inode; +}; + +struct fsverity_enable_arg { + __u32 version; + __u32 hash_algorithm; + __u32 block_size; + __u32 salt_size; + __u64 salt_ptr; + __u32 sig_size; + __u32 __reserved1; + __u64 sig_ptr; + __u64 __reserved2[11]; +}; + +struct fsverity_descriptor { + __u8 version; + __u8 hash_algorithm; + __u8 log_blocksize; + __u8 salt_size; + __le32 sig_size; + __le64 data_size; + __u8 root_hash[64]; + __u8 salt[32]; + __u8 __reserved[144]; + __u8 signature[0]; +}; + +struct crypto_ahash; + +struct fsverity_hash_alg { + struct crypto_ahash *tfm; + const char *name; + unsigned int digest_size; + unsigned int block_size; + mempool_t req_pool; +}; + +struct ahash_request; + +struct crypto_ahash { + int (*init)(struct ahash_request *); + int (*update)(struct ahash_request *); + int (*final)(struct ahash_request *); + int (*finup)(struct ahash_request *); + int (*digest)(struct ahash_request *); + int (*export)(struct ahash_request *, void *); + int (*import)(struct ahash_request *, const void *); + int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +struct ahash_request { + struct crypto_async_request base; + unsigned int nbytes; + struct scatterlist *src; + u8 *result; + void *priv; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct hash_alg_common { + unsigned int digestsize; + unsigned int statesize; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct fsverity_digest { + __u16 digest_algorithm; + __u16 digest_size; + __u8 digest[0]; +}; + +struct fsverity_read_metadata_arg { + __u64 metadata_type; + __u64 offset; + __u64 length; + __u64 buf_ptr; + __u64 __reserved; +}; + +struct fsverity_formatted_digest { + char magic[8]; + __le16 digest_algorithm; + __le16 digest_size; + __u8 digest[0]; +}; + +struct flock64 { + short int l_type; + short int l_whence; + __kernel_loff_t l_start; + __kernel_loff_t l_len; + __kernel_pid_t l_pid; +}; + +struct trace_event_raw_locks_get_lock_context { + struct trace_entry ent; + long unsigned int i_ino; + dev_t s_dev; + unsigned char type; + struct file_lock_context *ctx; + char __data[0]; +}; + +struct trace_event_raw_filelock_lock { + struct trace_entry ent; + struct file_lock *fl; + long unsigned int i_ino; + dev_t s_dev; + struct file_lock *fl_blocker; + fl_owner_t fl_owner; + unsigned int fl_pid; + unsigned int fl_flags; + unsigned char fl_type; + loff_t fl_start; + loff_t fl_end; + int ret; + char __data[0]; +}; + +struct trace_event_raw_filelock_lease { + struct trace_entry ent; + struct file_lock *fl; + long unsigned int i_ino; + dev_t s_dev; + struct file_lock *fl_blocker; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + long unsigned int fl_break_time; + long unsigned int fl_downgrade_time; + char __data[0]; +}; + +struct trace_event_raw_generic_add_lease { + struct trace_entry ent; + long unsigned int i_ino; + int wcount; + int rcount; + int icount; + dev_t s_dev; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + char __data[0]; +}; + +struct trace_event_raw_leases_conflict { + struct trace_entry ent; + void *lease; + void *breaker; + unsigned int l_fl_flags; + unsigned int b_fl_flags; + unsigned char l_fl_type; + unsigned char b_fl_type; + bool conflict; + char __data[0]; +}; + +struct trace_event_data_offsets_locks_get_lock_context {}; + +struct trace_event_data_offsets_filelock_lock {}; + +struct trace_event_data_offsets_filelock_lease {}; + +struct trace_event_data_offsets_generic_add_lease {}; + +struct trace_event_data_offsets_leases_conflict {}; + +typedef void (*btf_trace_locks_get_lock_context)(void *, struct inode *, int, struct file_lock_context *); + +typedef void (*btf_trace_posix_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_fcntl_setlk)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_locks_remove_posix)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_flock_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_break_lease_noblock)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_break_lease_block)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_break_lease_unblock)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_generic_delete_lease)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_time_out_leases)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_generic_add_lease)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_leases_conflict)(void *, bool, struct file_lock *, struct file_lock *); + +struct file_lock_list_struct { + spinlock_t lock; + struct hlist_head hlist; +}; + +struct locks_iterator { + int li_cpu; + loff_t li_pos; +}; + +typedef unsigned int __kernel_uid_t; + +typedef unsigned int __kernel_gid_t; + +struct gnu_property { + u32 pr_type; + u32 pr_datasz; +}; + +struct elf_prpsinfo { + char pr_state; + char pr_sname; + char pr_zomb; + char pr_nice; + long unsigned int pr_flag; + __kernel_uid_t pr_uid; + __kernel_gid_t pr_gid; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + char pr_fname[16]; + char pr_psargs[80]; +}; + +struct core_vma_metadata { + long unsigned int start; + long unsigned int end; + long unsigned int flags; + long unsigned int dump_size; +}; + +struct memelfnote { + const char *name; + int type; + unsigned int datasz; + void *data; +}; + +struct elf_thread_core_info { + struct elf_thread_core_info *next; + struct task_struct *task; + struct elf_prstatus prstatus; + struct memelfnote notes[0]; +}; + +struct elf_note_info { + struct elf_thread_core_info *thread; + struct memelfnote psinfo; + struct memelfnote signote; + struct memelfnote auxv; + struct memelfnote files; + siginfo_t csigdata; + size_t size; + int thread_notes; +}; + +struct elf32_phdr { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +}; + +struct elf32_shdr { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +}; + +typedef u16 __compat_uid_t; + +typedef u16 __compat_gid_t; + +typedef unsigned int compat_elf_greg_t; + +typedef compat_elf_greg_t compat_elf_gregset_t[18]; + +struct compat_elf_siginfo { + compat_int_t si_signo; + compat_int_t si_code; + compat_int_t si_errno; +}; + +struct compat_elf_prstatus_common { + struct compat_elf_siginfo pr_info; + short int pr_cursig; + compat_ulong_t pr_sigpend; + compat_ulong_t pr_sighold; + compat_pid_t pr_pid; + compat_pid_t pr_ppid; + compat_pid_t pr_pgrp; + compat_pid_t pr_sid; + struct old_timeval32 pr_utime; + struct old_timeval32 pr_stime; + struct old_timeval32 pr_cutime; + struct old_timeval32 pr_cstime; +}; + +struct compat_elf_prpsinfo { + char pr_state; + char pr_sname; + char pr_zomb; + char pr_nice; + compat_ulong_t pr_flag; + __compat_uid_t pr_uid; + __compat_gid_t pr_gid; + compat_pid_t pr_pid; + compat_pid_t pr_ppid; + compat_pid_t pr_pgrp; + compat_pid_t pr_sid; + char pr_fname[16]; + char pr_psargs[80]; +}; + +struct compat_elf_prstatus { + struct compat_elf_prstatus_common common; + compat_elf_gregset_t pr_reg; + compat_int_t pr_fpvalid; +}; + +struct elf_thread_core_info___2 { + struct elf_thread_core_info___2 *next; + struct task_struct *task; + struct compat_elf_prstatus prstatus; + struct memelfnote notes[0]; +}; + +struct elf_note_info___2 { + struct elf_thread_core_info___2 *thread; + struct memelfnote psinfo; + struct memelfnote signote; + struct memelfnote auxv; + struct memelfnote files; + compat_siginfo_t csigdata; + size_t size; + int thread_notes; +}; + +struct mb_cache_entry { + struct list_head e_list; + struct hlist_bl_node e_hash_list; + atomic_t e_refcnt; + u32 e_key; + u32 e_referenced: 1; + u32 e_reusable: 1; + u64 e_value; +}; + +struct mb_cache { + struct hlist_bl_head *c_hash; + int c_bucket_bits; + long unsigned int c_max_entries; + spinlock_t c_list_lock; + struct list_head c_list; + long unsigned int c_entry_count; + struct shrinker c_shrink; + struct work_struct c_shrink_work; +}; + +struct posix_acl_xattr_entry { + __le16 e_tag; + __le16 e_perm; + __le32 e_id; +}; + +struct posix_acl_xattr_header { + __le32 a_version; +}; + +struct rpc_timer { + struct list_head list; + long unsigned int expires; + struct delayed_work dwork; +}; + +struct rpc_wait_queue { + spinlock_t lock; + struct list_head tasks[4]; + unsigned char maxpriority; + unsigned char priority; + unsigned char nr; + short unsigned int qlen; + struct rpc_timer timer_list; + const char *name; +}; + +struct nfs_seqid_counter { + ktime_t create_time; + int owner_id; + int flags; + u32 counter; + spinlock_t lock; + struct list_head list; + struct rpc_wait_queue wait; +}; + +struct nfs4_stateid_struct { + union { + char data[16]; + struct { + __be32 seqid; + char other[12]; + }; + }; + enum { + NFS4_INVALID_STATEID_TYPE = 0, + NFS4_SPECIAL_STATEID_TYPE = 1, + NFS4_OPEN_STATEID_TYPE = 2, + NFS4_LOCK_STATEID_TYPE = 3, + NFS4_DELEGATION_STATEID_TYPE = 4, + NFS4_LAYOUT_STATEID_TYPE = 5, + NFS4_PNFS_DS_STATEID_TYPE = 6, + NFS4_REVOKED_STATEID_TYPE = 7, + } type; +}; + +typedef struct nfs4_stateid_struct nfs4_stateid; + +struct nfs4_state; + +struct nfs4_lock_state { + struct list_head ls_locks; + struct nfs4_state *ls_state; + long unsigned int ls_flags; + struct nfs_seqid_counter ls_seqid; + nfs4_stateid ls_stateid; + refcount_t ls_count; + fl_owner_t ls_owner; +}; + +struct xdr_netobj { + unsigned int len; + u8 *data; +}; + +struct xdr_buf { + struct kvec head[1]; + struct kvec tail[1]; + struct bio_vec *bvec; + struct page **pages; + unsigned int page_base; + unsigned int page_len; + unsigned int flags; + unsigned int buflen; + unsigned int len; +}; + +struct rpc_rqst; + +struct xdr_stream { + __be32 *p; + struct xdr_buf *buf; + __be32 *end; + struct kvec *iov; + struct kvec scratch; + struct page **page_ptr; + unsigned int nwords; + struct rpc_rqst *rqst; +}; + +struct rpc_xprt; + +struct rpc_task; + +struct rpc_cred; + +struct rpc_rqst { + struct rpc_xprt *rq_xprt; + struct xdr_buf rq_snd_buf; + struct xdr_buf rq_rcv_buf; + struct rpc_task *rq_task; + struct rpc_cred *rq_cred; + __be32 rq_xid; + int rq_cong; + u32 rq_seqno; + int rq_enc_pages_num; + struct page **rq_enc_pages; + void (*rq_release_snd_buf)(struct rpc_rqst *); + union { + struct list_head rq_list; + struct rb_node rq_recv; + }; + struct list_head rq_xmit; + struct list_head rq_xmit2; + void *rq_buffer; + size_t rq_callsize; + void *rq_rbuffer; + size_t rq_rcvsize; + size_t rq_xmit_bytes_sent; + size_t rq_reply_bytes_recvd; + struct xdr_buf rq_private_buf; + long unsigned int rq_majortimeo; + long unsigned int rq_minortimeo; + long unsigned int rq_timeout; + ktime_t rq_rtt; + unsigned int rq_retries; + unsigned int rq_connect_cookie; + atomic_t rq_pin; + u32 rq_bytes_sent; + ktime_t rq_xtime; + int rq_ntrans; + struct list_head rq_bc_list; + long unsigned int rq_bc_pa_state; + struct list_head rq_bc_pa_list; +}; + +typedef void (*kxdreproc_t)(struct rpc_rqst *, struct xdr_stream *, const void *); + +typedef int (*kxdrdproc_t)(struct rpc_rqst *, struct xdr_stream *, void *); + +struct rpc_procinfo; + +struct rpc_message { + const struct rpc_procinfo *rpc_proc; + void *rpc_argp; + void *rpc_resp; + const struct cred *rpc_cred; +}; + +struct rpc_procinfo { + u32 p_proc; + kxdreproc_t p_encode; + kxdrdproc_t p_decode; + unsigned int p_arglen; + unsigned int p_replen; + unsigned int p_timer; + u32 p_statidx; + const char *p_name; +}; + +struct rpc_wait { + struct list_head list; + struct list_head links; + struct list_head timer_list; +}; + +struct rpc_call_ops; + +struct rpc_clnt; + +struct rpc_task { + atomic_t tk_count; + int tk_status; + struct list_head tk_task; + void (*tk_callback)(struct rpc_task *); + void (*tk_action)(struct rpc_task *); + long unsigned int tk_timeout; + long unsigned int tk_runstate; + struct rpc_wait_queue *tk_waitqueue; + union { + struct work_struct tk_work; + struct rpc_wait tk_wait; + } u; + int tk_rpc_status; + struct rpc_message tk_msg; + void *tk_calldata; + const struct rpc_call_ops *tk_ops; + struct rpc_clnt *tk_client; + struct rpc_xprt *tk_xprt; + struct rpc_cred *tk_op_cred; + struct rpc_rqst *tk_rqstp; + struct workqueue_struct *tk_workqueue; + ktime_t tk_start; + pid_t tk_owner; + short unsigned int tk_flags; + short unsigned int tk_timeouts; + short unsigned int tk_pid; + unsigned char tk_priority: 2; + unsigned char tk_garb_retry: 2; + unsigned char tk_cred_retry: 2; + unsigned char tk_rebind_retry: 2; +}; + +struct rpc_call_ops { + void (*rpc_call_prepare)(struct rpc_task *, void *); + void (*rpc_call_done)(struct rpc_task *, void *); + void (*rpc_count_stats)(struct rpc_task *, void *); + void (*rpc_release)(void *); +}; + +struct rpc_iostats; + +struct rpc_pipe_dir_head { + struct list_head pdh_entries; + struct dentry *pdh_dentry; +}; + +struct rpc_rtt { + long unsigned int timeo; + long unsigned int srtt[5]; + long unsigned int sdrtt[5]; + int ntimeouts[5]; +}; + +struct rpc_timeout { + long unsigned int to_initval; + long unsigned int to_maxval; + long unsigned int to_increment; + unsigned int to_retries; + unsigned char to_exponential; +}; + +struct rpc_sysfs_client; + +struct rpc_xprt_switch; + +struct rpc_xprt_iter_ops; + +struct rpc_xprt_iter { + struct rpc_xprt_switch *xpi_xpswitch; + struct rpc_xprt *xpi_cursor; + const struct rpc_xprt_iter_ops *xpi_ops; +}; + +struct rpc_auth; + +struct rpc_stat; + +struct rpc_program; + +struct rpc_clnt { + refcount_t cl_count; + unsigned int cl_clid; + struct list_head cl_clients; + struct list_head cl_tasks; + atomic_t cl_pid; + spinlock_t cl_lock; + struct rpc_xprt *cl_xprt; + const struct rpc_procinfo *cl_procinfo; + u32 cl_prog; + u32 cl_vers; + u32 cl_maxproc; + struct rpc_auth *cl_auth; + struct rpc_stat *cl_stats; + struct rpc_iostats *cl_metrics; + unsigned int cl_softrtry: 1; + unsigned int cl_softerr: 1; + unsigned int cl_discrtry: 1; + unsigned int cl_noretranstimeo: 1; + unsigned int cl_autobind: 1; + unsigned int cl_chatty: 1; + struct rpc_rtt *cl_rtt; + const struct rpc_timeout *cl_timeout; + atomic_t cl_swapper; + int cl_nodelen; + char cl_nodename[65]; + struct rpc_pipe_dir_head cl_pipedir_objects; + struct rpc_clnt *cl_parent; + struct rpc_rtt cl_rtt_default; + struct rpc_timeout cl_timeout_default; + const struct rpc_program *cl_program; + const char *cl_principal; + struct dentry *cl_debugfs; + struct rpc_sysfs_client *cl_sysfs; + union { + struct rpc_xprt_iter cl_xpi; + struct work_struct cl_work; + }; + const struct cred *cl_cred; + unsigned int cl_max_connect; +}; + +struct svc_xprt; + +struct rpc_sysfs_xprt; + +struct rpc_xprt_ops; + +struct svc_serv; + +struct xprt_class; + +struct rpc_xprt { + struct kref kref; + const struct rpc_xprt_ops *ops; + unsigned int id; + const struct rpc_timeout *timeout; + struct __kernel_sockaddr_storage addr; + size_t addrlen; + int prot; + long unsigned int cong; + long unsigned int cwnd; + size_t max_payload; + struct rpc_wait_queue binding; + struct rpc_wait_queue sending; + struct rpc_wait_queue pending; + struct rpc_wait_queue backlog; + struct list_head free; + unsigned int max_reqs; + unsigned int min_reqs; + unsigned int num_reqs; + long unsigned int state; + unsigned char resvport: 1; + unsigned char reuseport: 1; + atomic_t swapper; + unsigned int bind_index; + struct list_head xprt_switch; + long unsigned int bind_timeout; + long unsigned int reestablish_timeout; + unsigned int connect_cookie; + struct work_struct task_cleanup; + struct timer_list timer; + long unsigned int last_used; + long unsigned int idle_timeout; + long unsigned int connect_timeout; + long unsigned int max_reconnect_timeout; + atomic_long_t queuelen; + spinlock_t transport_lock; + spinlock_t reserve_lock; + spinlock_t queue_lock; + u32 xid; + struct rpc_task *snd_task; + struct list_head xmit_queue; + atomic_long_t xmit_queuelen; + struct svc_xprt *bc_xprt; + struct svc_serv *bc_serv; + unsigned int bc_alloc_max; + unsigned int bc_alloc_count; + atomic_t bc_slot_count; + spinlock_t bc_pa_lock; + struct list_head bc_pa_list; + struct rb_root recv_queue; + struct { + long unsigned int bind_count; + long unsigned int connect_count; + long unsigned int connect_start; + long unsigned int connect_time; + long unsigned int sends; + long unsigned int recvs; + long unsigned int bad_xids; + long unsigned int max_slots; + long long unsigned int req_u; + long long unsigned int bklog_u; + long long unsigned int sending_u; + long long unsigned int pending_u; + } stat; + struct net *xprt_net; + const char *servername; + const char *address_strings[6]; + struct dentry *debugfs; + struct callback_head rcu; + const struct xprt_class *xprt_class; + struct rpc_sysfs_xprt *xprt_sysfs; + bool main; +}; + +struct rpc_credops; + +struct rpc_cred { + struct hlist_node cr_hash; + struct list_head cr_lru; + struct callback_head cr_rcu; + struct rpc_auth *cr_auth; + const struct rpc_credops *cr_ops; + long unsigned int cr_expire; + long unsigned int cr_flags; + refcount_t cr_count; + const struct cred *cr_cred; +}; + +typedef u32 rpc_authflavor_t; + +struct auth_cred { + const struct cred *cred; + const char *principal; +}; + +struct rpc_cred_cache; + +struct rpc_authops; + +struct rpc_auth { + unsigned int au_cslack; + unsigned int au_rslack; + unsigned int au_verfsize; + unsigned int au_ralign; + long unsigned int au_flags; + const struct rpc_authops *au_ops; + rpc_authflavor_t au_flavor; + refcount_t au_count; + struct rpc_cred_cache *au_credcache; +}; + +struct rpc_credops { + const char *cr_name; + int (*cr_init)(struct rpc_auth *, struct rpc_cred *); + void (*crdestroy)(struct rpc_cred *); + int (*crmatch)(struct auth_cred *, struct rpc_cred *, int); + int (*crmarshal)(struct rpc_task *, struct xdr_stream *); + int (*crrefresh)(struct rpc_task *); + int (*crvalidate)(struct rpc_task *, struct xdr_stream *); + int (*crwrap_req)(struct rpc_task *, struct xdr_stream *); + int (*crunwrap_resp)(struct rpc_task *, struct xdr_stream *); + int (*crkey_timeout)(struct rpc_cred *); + char * (*crstringify_acceptor)(struct rpc_cred *); + bool (*crneed_reencode)(struct rpc_task *); +}; + +struct rpc_auth_create_args; + +struct rpcsec_gss_info; + +struct rpc_authops { + struct module *owner; + rpc_authflavor_t au_flavor; + char *au_name; + struct rpc_auth * (*create)(const struct rpc_auth_create_args *, struct rpc_clnt *); + void (*destroy)(struct rpc_auth *); + int (*hash_cred)(struct auth_cred *, unsigned int); + struct rpc_cred * (*lookup_cred)(struct rpc_auth *, struct auth_cred *, int); + struct rpc_cred * (*crcreate)(struct rpc_auth *, struct auth_cred *, int, gfp_t); + rpc_authflavor_t (*info2flavor)(struct rpcsec_gss_info *); + int (*flavor2info)(rpc_authflavor_t, struct rpcsec_gss_info *); + int (*key_timeout)(struct rpc_auth *, struct rpc_cred *); +}; + +struct rpc_auth_create_args { + rpc_authflavor_t pseudoflavor; + const char *target_name; +}; + +struct rpcsec_gss_oid { + unsigned int len; + u8 data[32]; +}; + +struct rpcsec_gss_info { + struct rpcsec_gss_oid oid; + u32 qop; + u32 service; +}; + +struct rpc_xprt_ops { + void (*set_buffer_size)(struct rpc_xprt *, size_t, size_t); + int (*reserve_xprt)(struct rpc_xprt *, struct rpc_task *); + void (*release_xprt)(struct rpc_xprt *, struct rpc_task *); + void (*alloc_slot)(struct rpc_xprt *, struct rpc_task *); + void (*free_slot)(struct rpc_xprt *, struct rpc_rqst *); + void (*rpcbind)(struct rpc_task *); + void (*set_port)(struct rpc_xprt *, short unsigned int); + void (*connect)(struct rpc_xprt *, struct rpc_task *); + int (*buf_alloc)(struct rpc_task *); + void (*buf_free)(struct rpc_task *); + void (*prepare_request)(struct rpc_rqst *); + int (*send_request)(struct rpc_rqst *); + void (*wait_for_reply_request)(struct rpc_task *); + void (*timer)(struct rpc_xprt *, struct rpc_task *); + void (*release_request)(struct rpc_task *); + void (*close)(struct rpc_xprt *); + void (*destroy)(struct rpc_xprt *); + void (*set_connect_timeout)(struct rpc_xprt *, long unsigned int, long unsigned int); + void (*print_stats)(struct rpc_xprt *, struct seq_file *); + int (*enable_swap)(struct rpc_xprt *); + void (*disable_swap)(struct rpc_xprt *); + void (*inject_disconnect)(struct rpc_xprt *); + int (*bc_setup)(struct rpc_xprt *, unsigned int); + size_t (*bc_maxpayload)(struct rpc_xprt *); + unsigned int (*bc_num_slots)(struct rpc_xprt *); + void (*bc_free_rqst)(struct rpc_rqst *); + void (*bc_destroy)(struct rpc_xprt *, unsigned int); +}; + +struct svc_program; + +struct svc_stat; + +struct svc_pool; + +struct svc_serv_ops; + +struct svc_serv { + struct svc_program *sv_program; + struct svc_stat *sv_stats; + spinlock_t sv_lock; + unsigned int sv_nrthreads; + unsigned int sv_maxconn; + unsigned int sv_max_payload; + unsigned int sv_max_mesg; + unsigned int sv_xdrsize; + struct list_head sv_permsocks; + struct list_head sv_tempsocks; + int sv_tmpcnt; + struct timer_list sv_temptimer; + char *sv_name; + unsigned int sv_nrpools; + struct svc_pool *sv_pools; + const struct svc_serv_ops *sv_ops; + struct list_head sv_cb_list; + spinlock_t sv_cb_lock; + wait_queue_head_t sv_cb_waitq; + bool sv_bc_enabled; +}; + +struct xprt_create; + +struct xprt_class { + struct list_head list; + int ident; + struct rpc_xprt * (*setup)(struct xprt_create *); + struct module *owner; + char name[32]; + const char *netid[0]; +}; + +struct xprt_create { + int ident; + struct net *net; + struct sockaddr *srcaddr; + struct sockaddr *dstaddr; + size_t addrlen; + const char *servername; + struct svc_xprt *bc_xprt; + struct rpc_xprt_switch *bc_xps; + unsigned int flags; +}; + +struct rpc_sysfs_xprt_switch; + +struct rpc_xprt_switch { + spinlock_t xps_lock; + struct kref xps_kref; + unsigned int xps_id; + unsigned int xps_nxprts; + unsigned int xps_nactive; + unsigned int xps_nunique_destaddr_xprts; + atomic_long_t xps_queuelen; + struct list_head xps_xprt_list; + struct net *xps_net; + const struct rpc_xprt_iter_ops *xps_iter_ops; + struct rpc_sysfs_xprt_switch *xps_sysfs; + struct callback_head xps_rcu; +}; + +struct rpc_stat { + const struct rpc_program *program; + unsigned int netcnt; + unsigned int netudpcnt; + unsigned int nettcpcnt; + unsigned int nettcpconn; + unsigned int netreconn; + unsigned int rpccnt; + unsigned int rpcretrans; + unsigned int rpcauthrefresh; + unsigned int rpcgarbage; +}; + +struct rpc_version; + +struct rpc_program { + const char *name; + u32 number; + unsigned int nrvers; + const struct rpc_version **version; + struct rpc_stat *stats; + const char *pipe_dir_name; +}; + +struct svc_stat { + struct svc_program *program; + unsigned int netcnt; + unsigned int netudpcnt; + unsigned int nettcpcnt; + unsigned int nettcpconn; + unsigned int rpccnt; + unsigned int rpcbadfmt; + unsigned int rpcbadauth; + unsigned int rpcbadclnt; +}; + +struct svc_version; + +struct svc_rqst; + +struct svc_process_info; + +struct svc_program { + struct svc_program *pg_next; + u32 pg_prog; + unsigned int pg_lovers; + unsigned int pg_hivers; + unsigned int pg_nvers; + const struct svc_version **pg_vers; + char *pg_name; + char *pg_class; + struct svc_stat *pg_stats; + int (*pg_authenticate)(struct svc_rqst *); + __be32 (*pg_init_request)(struct svc_rqst *, const struct svc_program *, struct svc_process_info *); + int (*pg_rpcbind_set)(struct net *, const struct svc_program *, u32, int, short unsigned int, short unsigned int); +}; + +struct rpc_xprt_iter_ops { + void (*xpi_rewind)(struct rpc_xprt_iter *); + struct rpc_xprt * (*xpi_xprt)(struct rpc_xprt_iter *); + struct rpc_xprt * (*xpi_next)(struct rpc_xprt_iter *); +}; + +struct rpc_version { + u32 number; + unsigned int nrprocs; + const struct rpc_procinfo *procs; + unsigned int *counts; +}; + +struct nfs_fh { + short unsigned int size; + unsigned char data[128]; +}; + +enum nfs3_stable_how { + NFS_UNSTABLE = 0, + NFS_DATA_SYNC = 1, + NFS_FILE_SYNC = 2, + NFS_INVALID_STABLE_HOW = 4294967295, +}; + +struct nfs4_label { + uint32_t lfs; + uint32_t pi; + u32 len; + char *label; +}; + +typedef struct { + char data[8]; +} nfs4_verifier; + +enum nfs4_change_attr_type { + NFS4_CHANGE_TYPE_IS_MONOTONIC_INCR = 0, + NFS4_CHANGE_TYPE_IS_VERSION_COUNTER = 1, + NFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS = 2, + NFS4_CHANGE_TYPE_IS_TIME_METADATA = 3, + NFS4_CHANGE_TYPE_IS_UNDEFINED = 4, +}; + +struct gss_api_mech; + +struct gss_ctx { + struct gss_api_mech *mech_type; + void *internal_ctx_id; + unsigned int slack; + unsigned int align; +}; + +struct gss_api_ops; + +struct pf_desc; + +struct gss_api_mech { + struct list_head gm_list; + struct module *gm_owner; + struct rpcsec_gss_oid gm_oid; + char *gm_name; + const struct gss_api_ops *gm_ops; + int gm_pf_num; + struct pf_desc *gm_pfs; + const char *gm_upcall_enctypes; +}; + +struct auth_domain; + +struct pf_desc { + u32 pseudoflavor; + u32 qop; + u32 service; + char *name; + char *auth_domain_name; + struct auth_domain *domain; + bool datatouch; +}; + +struct auth_ops; + +struct auth_domain { + struct kref ref; + struct hlist_node hash; + char *name; + struct auth_ops *flavour; + struct callback_head callback_head; +}; + +struct gss_api_ops { + int (*gss_import_sec_context)(const void *, size_t, struct gss_ctx *, time64_t *, gfp_t); + u32 (*gss_get_mic)(struct gss_ctx *, struct xdr_buf *, struct xdr_netobj *); + u32 (*gss_verify_mic)(struct gss_ctx *, struct xdr_buf *, struct xdr_netobj *); + u32 (*gss_wrap)(struct gss_ctx *, int, struct xdr_buf *, struct page **); + u32 (*gss_unwrap)(struct gss_ctx *, int, int, struct xdr_buf *); + void (*gss_delete_sec_context)(void *); +}; + +struct nfs4_string { + unsigned int len; + char *data; +}; + +struct nfs_fsid { + uint64_t major; + uint64_t minor; +}; + +struct nfs4_threshold { + __u32 bm; + __u32 l_type; + __u64 rd_sz; + __u64 wr_sz; + __u64 rd_io_sz; + __u64 wr_io_sz; +}; + +struct nfs_fattr { + unsigned int valid; + umode_t mode; + __u32 nlink; + kuid_t uid; + kgid_t gid; + dev_t rdev; + __u64 size; + union { + struct { + __u32 blocksize; + __u32 blocks; + } nfs2; + struct { + __u64 used; + } nfs3; + } du; + struct nfs_fsid fsid; + __u64 fileid; + __u64 mounted_on_fileid; + struct timespec64 atime; + struct timespec64 mtime; + struct timespec64 ctime; + __u64 change_attr; + __u64 pre_change_attr; + __u64 pre_size; + struct timespec64 pre_mtime; + struct timespec64 pre_ctime; + long unsigned int time_start; + long unsigned int gencount; + struct nfs4_string *owner_name; + struct nfs4_string *group_name; + struct nfs4_threshold *mdsthreshold; + struct nfs4_label *label; +}; + +struct nfs_fsinfo { + struct nfs_fattr *fattr; + __u32 rtmax; + __u32 rtpref; + __u32 rtmult; + __u32 wtmax; + __u32 wtpref; + __u32 wtmult; + __u32 dtpref; + __u64 maxfilesize; + struct timespec64 time_delta; + __u32 lease_time; + __u32 nlayouttypes; + __u32 layouttype[8]; + __u32 blksize; + __u32 clone_blksize; + enum nfs4_change_attr_type change_attr_type; + __u32 xattr_support; +}; + +struct nfs_fsstat { + struct nfs_fattr *fattr; + __u64 tbytes; + __u64 fbytes; + __u64 abytes; + __u64 tfiles; + __u64 ffiles; + __u64 afiles; +}; + +struct nfs_pathconf { + struct nfs_fattr *fattr; + __u32 max_link; + __u32 max_namelen; +}; + +struct nfs4_change_info { + u32 atomic; + u64 before; + u64 after; +}; + +struct nfs4_slot; + +struct nfs4_sequence_args { + struct nfs4_slot *sa_slot; + u8 sa_cache_this: 1; + u8 sa_privileged: 1; +}; + +struct nfs4_sequence_res { + struct nfs4_slot *sr_slot; + long unsigned int sr_timestamp; + int sr_status; + u32 sr_status_flags; + u32 sr_highest_slotid; + u32 sr_target_highest_slotid; +}; + +struct nfs_open_context; + +struct nfs_lock_context { + refcount_t count; + struct list_head list; + struct nfs_open_context *open_context; + fl_owner_t lockowner; + atomic_t io_count; + struct callback_head callback_head; +}; + +struct nfs_open_context { + struct nfs_lock_context lock_context; + fl_owner_t flock_owner; + struct dentry *dentry; + const struct cred *cred; + struct rpc_cred *ll_cred; + struct nfs4_state *state; + fmode_t mode; + long unsigned int flags; + int error; + struct list_head list; + struct nfs4_threshold *mdsthreshold; + struct callback_head callback_head; +}; + +struct nlm_host; + +struct nfs_iostats; + +struct nfs_auth_info { + unsigned int flavor_len; + rpc_authflavor_t flavors[12]; +}; + +struct nfs_fscache_key; + +struct fscache_cookie; + +struct pnfs_layoutdriver_type; + +struct nfs_client; + +struct nfs_server { + struct nfs_client *nfs_client; + struct list_head client_link; + struct list_head master_link; + struct rpc_clnt *client; + struct rpc_clnt *client_acl; + struct nlm_host *nlm_host; + struct nfs_iostats *io_stats; + atomic_long_t writeback; + unsigned int flags; + unsigned int fattr_valid; + unsigned int caps; + unsigned int rsize; + unsigned int rpages; + unsigned int wsize; + unsigned int wpages; + unsigned int wtmult; + unsigned int dtsize; + short unsigned int port; + unsigned int bsize; + unsigned int gxasize; + unsigned int sxasize; + unsigned int lxasize; + unsigned int acregmin; + unsigned int acregmax; + unsigned int acdirmin; + unsigned int acdirmax; + unsigned int namelen; + unsigned int options; + unsigned int clone_blksize; + enum nfs4_change_attr_type change_attr_type; + struct nfs_fsid fsid; + __u64 maxfilesize; + struct timespec64 time_delta; + long unsigned int mount_time; + struct super_block *super; + dev_t s_dev; + struct nfs_auth_info auth_info; + struct nfs_fscache_key *fscache_key; + struct fscache_cookie *fscache; + u32 pnfs_blksize; + u32 attr_bitmask[3]; + u32 attr_bitmask_nl[3]; + u32 exclcreat_bitmask[3]; + u32 cache_consistency_bitmask[3]; + u32 acl_bitmask; + u32 fh_expire_type; + struct pnfs_layoutdriver_type *pnfs_curr_ld; + struct rpc_wait_queue roc_rpcwaitq; + void *pnfs_ld_data; + struct rb_root state_owners; + struct ida openowner_id; + struct ida lockowner_id; + struct list_head state_owners_lru; + struct list_head layouts; + struct list_head delegations; + struct list_head ss_copies; + long unsigned int mig_gen; + long unsigned int mig_status; + void (*destroy)(struct nfs_server *); + atomic_t active; + struct __kernel_sockaddr_storage mountd_address; + size_t mountd_addrlen; + u32 mountd_version; + short unsigned int mountd_port; + short unsigned int mountd_protocol; + struct rpc_wait_queue uoc_rpcwaitq; + unsigned int read_hdrsize; + const struct cred *cred; + bool has_sec_mnt_opts; +}; + +struct nfs_subversion; + +struct idmap; + +struct nfs4_slot_table; + +struct nfs4_session; + +struct nfs_rpc_ops; + +struct nfs4_minor_version_ops; + +struct nfs41_server_owner; + +struct nfs41_server_scope; + +struct nfs41_impl_id; + +struct nfs_client { + refcount_t cl_count; + atomic_t cl_mds_count; + int cl_cons_state; + long unsigned int cl_res_state; + long unsigned int cl_flags; + struct __kernel_sockaddr_storage cl_addr; + size_t cl_addrlen; + char *cl_hostname; + char *cl_acceptor; + struct list_head cl_share_link; + struct list_head cl_superblocks; + struct rpc_clnt *cl_rpcclient; + const struct nfs_rpc_ops *rpc_ops; + int cl_proto; + struct nfs_subversion *cl_nfs_mod; + u32 cl_minorversion; + unsigned int cl_nconnect; + unsigned int cl_max_connect; + const char *cl_principal; + struct list_head cl_ds_clients; + u64 cl_clientid; + nfs4_verifier cl_confirm; + long unsigned int cl_state; + spinlock_t cl_lock; + long unsigned int cl_lease_time; + long unsigned int cl_last_renewal; + struct delayed_work cl_renewd; + struct rpc_wait_queue cl_rpcwaitq; + struct idmap *cl_idmap; + const char *cl_owner_id; + u32 cl_cb_ident; + const struct nfs4_minor_version_ops *cl_mvops; + long unsigned int cl_mig_gen; + struct nfs4_slot_table *cl_slot_tbl; + u32 cl_seqid; + u32 cl_exchange_flags; + struct nfs4_session *cl_session; + bool cl_preserve_clid; + struct nfs41_server_owner *cl_serverowner; + struct nfs41_server_scope *cl_serverscope; + struct nfs41_impl_id *cl_implid; + long unsigned int cl_sp4_flags; + wait_queue_head_t cl_lock_waitq; + char cl_ipaddr[48]; + struct fscache_cookie *fscache; + struct net *cl_net; + struct list_head pending_cb_stateids; +}; + +struct pnfs_layout_segment; + +struct nfs_seqid { + struct nfs_seqid_counter *sequence; + struct list_head list; + struct rpc_task *task; +}; + +struct nfs_write_verifier { + char data[8]; +}; + +struct nfs_writeverf { + struct nfs_write_verifier verifier; + enum nfs3_stable_how committed; +}; + +struct nfs_pgio_args { + struct nfs4_sequence_args seq_args; + struct nfs_fh *fh; + struct nfs_open_context *context; + struct nfs_lock_context *lock_context; + nfs4_stateid stateid; + __u64 offset; + __u32 count; + unsigned int pgbase; + struct page **pages; + union { + unsigned int replen; + struct { + const u32 *bitmask; + u32 bitmask_store[3]; + enum nfs3_stable_how stable; + }; + }; +}; + +struct nfs_pgio_res { + struct nfs4_sequence_res seq_res; + struct nfs_fattr *fattr; + __u64 count; + __u32 op_status; + union { + struct { + unsigned int replen; + int eof; + }; + struct { + struct nfs_writeverf *verf; + const struct nfs_server *server; + }; + }; +}; + +struct nfs_commitargs { + struct nfs4_sequence_args seq_args; + struct nfs_fh *fh; + __u64 offset; + __u32 count; + const u32 *bitmask; +}; + +struct nfs_commitres { + struct nfs4_sequence_res seq_res; + __u32 op_status; + struct nfs_fattr *fattr; + struct nfs_writeverf *verf; + const struct nfs_server *server; +}; + +struct nfs_removeargs { + struct nfs4_sequence_args seq_args; + const struct nfs_fh *fh; + struct qstr name; +}; + +struct nfs_removeres { + struct nfs4_sequence_res seq_res; + struct nfs_server *server; + struct nfs_fattr *dir_attr; + struct nfs4_change_info cinfo; +}; + +struct nfs_renameargs { + struct nfs4_sequence_args seq_args; + const struct nfs_fh *old_dir; + const struct nfs_fh *new_dir; + const struct qstr *old_name; + const struct qstr *new_name; +}; + +struct nfs_renameres { + struct nfs4_sequence_res seq_res; + struct nfs_server *server; + struct nfs4_change_info old_cinfo; + struct nfs_fattr *old_fattr; + struct nfs4_change_info new_cinfo; + struct nfs_fattr *new_fattr; +}; + +struct nfs_entry { + __u64 ino; + __u64 cookie; + __u64 prev_cookie; + const char *name; + unsigned int len; + int eof; + struct nfs_fh *fh; + struct nfs_fattr *fattr; + unsigned char d_type; + struct nfs_server *server; +}; + +struct nfs_readdir_arg { + struct dentry *dentry; + const struct cred *cred; + __be32 *verf; + u64 cookie; + struct page **pages; + unsigned int page_len; + bool plus; +}; + +struct nfs_readdir_res { + __be32 *verf; +}; + +struct nfs4_pathname { + unsigned int ncomponents; + struct nfs4_string components[512]; +}; + +struct nfs4_fs_location { + unsigned int nservers; + struct nfs4_string servers[10]; + struct nfs4_pathname rootpath; +}; + +struct nfs4_fs_locations { + struct nfs_fattr fattr; + const struct nfs_server *server; + struct nfs4_pathname fs_path; + int nlocations; + struct nfs4_fs_location locations[10]; +}; + +struct nfstime4 { + u64 seconds; + u32 nseconds; +}; + +struct pnfs_commit_ops; + +struct pnfs_ds_commit_info { + struct list_head commits; + unsigned int nwritten; + unsigned int ncommitting; + const struct pnfs_commit_ops *ops; +}; + +struct nfs41_server_owner { + uint64_t minor_id; + uint32_t major_id_sz; + char major_id[1024]; +}; + +struct nfs41_server_scope { + uint32_t server_scope_sz; + char server_scope[1024]; +}; + +struct nfs41_impl_id { + char domain[1025]; + char name[1025]; + struct nfstime4 date; +}; + +struct nfs_page_array { + struct page **pagevec; + unsigned int npages; + struct page *page_array[8]; +}; + +struct nfs_page; + +struct nfs_rw_ops; + +struct nfs_io_completion; + +struct nfs_direct_req; + +struct nfs_pgio_completion_ops; + +struct nfs_pgio_header { + struct inode *inode; + const struct cred *cred; + struct list_head pages; + struct nfs_page *req; + struct nfs_writeverf verf; + fmode_t rw_mode; + struct pnfs_layout_segment *lseg; + loff_t io_start; + const struct rpc_call_ops *mds_ops; + void (*release)(struct nfs_pgio_header *); + const struct nfs_pgio_completion_ops *completion_ops; + const struct nfs_rw_ops *rw_ops; + struct nfs_io_completion *io_completion; + struct nfs_direct_req *dreq; + int pnfs_error; + int error; + unsigned int good_bytes; + long unsigned int flags; + struct rpc_task task; + struct nfs_fattr fattr; + struct nfs_pgio_args args; + struct nfs_pgio_res res; + long unsigned int timestamp; + int (*pgio_done_cb)(struct rpc_task *, struct nfs_pgio_header *); + __u64 mds_offset; + struct nfs_page_array page_array; + struct nfs_client *ds_clp; + u32 ds_commit_idx; + u32 pgio_mirror_idx; +}; + +struct nfs_pgio_completion_ops { + void (*error_cleanup)(struct list_head *, int); + void (*init_hdr)(struct nfs_pgio_header *); + void (*completion)(struct nfs_pgio_header *); + void (*reschedule_io)(struct nfs_pgio_header *); +}; + +struct nfs_mds_commit_info { + atomic_t rpcs_out; + atomic_long_t ncommit; + struct list_head list; +}; + +struct nfs_commit_data; + +struct nfs_commit_info; + +struct nfs_commit_completion_ops { + void (*completion)(struct nfs_commit_data *); + void (*resched_write)(struct nfs_commit_info *, struct nfs_page *); +}; + +struct nfs_commit_data { + struct rpc_task task; + struct inode *inode; + const struct cred *cred; + struct nfs_fattr fattr; + struct nfs_writeverf verf; + struct list_head pages; + struct list_head list; + struct nfs_direct_req *dreq; + struct nfs_commitargs args; + struct nfs_commitres res; + struct nfs_open_context *context; + struct pnfs_layout_segment *lseg; + struct nfs_client *ds_clp; + int ds_commit_index; + loff_t lwb; + const struct rpc_call_ops *mds_ops; + const struct nfs_commit_completion_ops *completion_ops; + int (*commit_done_cb)(struct rpc_task *, struct nfs_commit_data *); + long unsigned int flags; +}; + +struct nfs_commit_info { + struct inode *inode; + struct nfs_mds_commit_info *mds; + struct pnfs_ds_commit_info *ds; + struct nfs_direct_req *dreq; + const struct nfs_commit_completion_ops *completion_ops; +}; + +struct nfs_unlinkdata { + struct nfs_removeargs args; + struct nfs_removeres res; + struct dentry *dentry; + wait_queue_head_t wq; + const struct cred *cred; + struct nfs_fattr dir_attr; + long int timeout; +}; + +struct nfs_renamedata { + struct nfs_renameargs args; + struct nfs_renameres res; + const struct cred *cred; + struct inode *old_dir; + struct dentry *old_dentry; + struct nfs_fattr old_fattr; + struct inode *new_dir; + struct dentry *new_dentry; + struct nfs_fattr new_fattr; + void (*complete)(struct rpc_task *, struct nfs_renamedata *); + long int timeout; + bool cancelled; +}; + +struct nlmclnt_operations; + +struct nfs_client_initdata; + +struct nfs_access_entry; + +struct nfs_rpc_ops { + u32 version; + const struct dentry_operations *dentry_ops; + const struct inode_operations *dir_inode_ops; + const struct inode_operations *file_inode_ops; + const struct file_operations *file_ops; + const struct nlmclnt_operations *nlmclnt_ops; + int (*getroot)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); + int (*submount)(struct fs_context *, struct nfs_server *); + int (*try_get_tree)(struct fs_context *); + int (*getattr)(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct inode *); + int (*setattr)(struct dentry *, struct nfs_fattr *, struct iattr *); + int (*lookup)(struct inode *, struct dentry *, struct nfs_fh *, struct nfs_fattr *); + int (*lookupp)(struct inode *, struct nfs_fh *, struct nfs_fattr *); + int (*access)(struct inode *, struct nfs_access_entry *); + int (*readlink)(struct inode *, struct page *, unsigned int, unsigned int); + int (*create)(struct inode *, struct dentry *, struct iattr *, int); + int (*remove)(struct inode *, struct dentry *); + void (*unlink_setup)(struct rpc_message *, struct dentry *, struct inode *); + void (*unlink_rpc_prepare)(struct rpc_task *, struct nfs_unlinkdata *); + int (*unlink_done)(struct rpc_task *, struct inode *); + void (*rename_setup)(struct rpc_message *, struct dentry *, struct dentry *); + void (*rename_rpc_prepare)(struct rpc_task *, struct nfs_renamedata *); + int (*rename_done)(struct rpc_task *, struct inode *, struct inode *); + int (*link)(struct inode *, struct inode *, const struct qstr *); + int (*symlink)(struct inode *, struct dentry *, struct page *, unsigned int, struct iattr *); + int (*mkdir)(struct inode *, struct dentry *, struct iattr *); + int (*rmdir)(struct inode *, const struct qstr *); + int (*readdir)(struct nfs_readdir_arg *, struct nfs_readdir_res *); + int (*mknod)(struct inode *, struct dentry *, struct iattr *, dev_t); + int (*statfs)(struct nfs_server *, struct nfs_fh *, struct nfs_fsstat *); + int (*fsinfo)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); + int (*pathconf)(struct nfs_server *, struct nfs_fh *, struct nfs_pathconf *); + int (*set_capabilities)(struct nfs_server *, struct nfs_fh *); + int (*decode_dirent)(struct xdr_stream *, struct nfs_entry *, bool); + int (*pgio_rpc_prepare)(struct rpc_task *, struct nfs_pgio_header *); + void (*read_setup)(struct nfs_pgio_header *, struct rpc_message *); + int (*read_done)(struct rpc_task *, struct nfs_pgio_header *); + void (*write_setup)(struct nfs_pgio_header *, struct rpc_message *, struct rpc_clnt **); + int (*write_done)(struct rpc_task *, struct nfs_pgio_header *); + void (*commit_setup)(struct nfs_commit_data *, struct rpc_message *, struct rpc_clnt **); + void (*commit_rpc_prepare)(struct rpc_task *, struct nfs_commit_data *); + int (*commit_done)(struct rpc_task *, struct nfs_commit_data *); + int (*lock)(struct file *, int, struct file_lock *); + int (*lock_check_bounds)(const struct file_lock *); + void (*clear_acl_cache)(struct inode *); + void (*close_context)(struct nfs_open_context *, int); + struct inode * (*open_context)(struct inode *, struct nfs_open_context *, int, struct iattr *, int *); + int (*have_delegation)(struct inode *, fmode_t); + struct nfs_client * (*alloc_client)(const struct nfs_client_initdata *); + struct nfs_client * (*init_client)(struct nfs_client *, const struct nfs_client_initdata *); + void (*free_client)(struct nfs_client *); + struct nfs_server * (*create_server)(struct fs_context *); + struct nfs_server * (*clone_server)(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, rpc_authflavor_t); +}; + +struct nfs_access_entry { + struct rb_node rb_node; + struct list_head lru; + const struct cred *cred; + __u32 mask; + struct callback_head callback_head; +}; + +struct nfs4_state_recovery_ops; + +struct nfs4_state_maintenance_ops; + +struct nfs4_mig_recovery_ops; + +struct nfs4_minor_version_ops { + u32 minor_version; + unsigned int init_caps; + int (*init_client)(struct nfs_client *); + void (*shutdown_client)(struct nfs_client *); + bool (*match_stateid)(const nfs4_stateid *, const nfs4_stateid *); + int (*find_root_sec)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); + void (*free_lock_state)(struct nfs_server *, struct nfs4_lock_state *); + int (*test_and_free_expired)(struct nfs_server *, nfs4_stateid *, const struct cred *); + struct nfs_seqid * (*alloc_seqid)(struct nfs_seqid_counter *, gfp_t); + void (*session_trunk)(struct rpc_clnt *, struct rpc_xprt *, void *); + const struct rpc_call_ops *call_sync_ops; + const struct nfs4_state_recovery_ops *reboot_recovery_ops; + const struct nfs4_state_recovery_ops *nograce_recovery_ops; + const struct nfs4_state_maintenance_ops *state_renewal_ops; + const struct nfs4_mig_recovery_ops *mig_recovery_ops; +}; + +struct nfs4_state_owner; + +struct nfs4_state { + struct list_head open_states; + struct list_head inode_states; + struct list_head lock_states; + struct nfs4_state_owner *owner; + struct inode *inode; + long unsigned int flags; + spinlock_t state_lock; + seqlock_t seqlock; + nfs4_stateid stateid; + nfs4_stateid open_stateid; + unsigned int n_rdonly; + unsigned int n_wronly; + unsigned int n_rdwr; + fmode_t state; + refcount_t count; + wait_queue_head_t waitq; + struct callback_head callback_head; +}; + +struct cache_head { + struct hlist_node cache_list; + time64_t expiry_time; + time64_t last_refresh; + struct kref ref; + long unsigned int flags; +}; + +struct cache_deferred_req; + +struct cache_req { + struct cache_deferred_req * (*defer)(struct cache_req *); + int thread_wait; +}; + +struct cache_deferred_req { + struct hlist_node hash; + struct list_head recent; + struct cache_head *item; + void *owner; + void (*revisit)(struct cache_deferred_req *, int); +}; + +struct svc_cred { + kuid_t cr_uid; + kgid_t cr_gid; + struct group_info *cr_group_info; + u32 cr_flavor; + char *cr_raw_principal; + char *cr_principal; + char *cr_targ_princ; + struct gss_api_mech *cr_gss_mech; +}; + +struct auth_ops { + char *name; + struct module *owner; + int flavour; + int (*accept)(struct svc_rqst *); + int (*release)(struct svc_rqst *); + void (*domain_release)(struct auth_domain *); + int (*set_client)(struct svc_rqst *); +}; + +struct svc_cacherep; + +struct svc_procedure; + +struct svc_deferred_req; + +struct svc_rqst { + struct list_head rq_all; + struct callback_head rq_rcu_head; + struct svc_xprt *rq_xprt; + struct __kernel_sockaddr_storage rq_addr; + size_t rq_addrlen; + struct __kernel_sockaddr_storage rq_daddr; + size_t rq_daddrlen; + struct svc_serv *rq_server; + struct svc_pool *rq_pool; + const struct svc_procedure *rq_procinfo; + struct auth_ops *rq_authop; + struct svc_cred rq_cred; + void *rq_xprt_ctxt; + struct svc_deferred_req *rq_deferred; + size_t rq_xprt_hlen; + struct xdr_buf rq_arg; + struct xdr_stream rq_arg_stream; + struct xdr_stream rq_res_stream; + struct page *rq_scratch_page; + struct xdr_buf rq_res; + struct page *rq_pages[260]; + struct page **rq_respages; + struct page **rq_next_page; + struct page **rq_page_end; + struct pagevec rq_pvec; + struct kvec rq_vec[259]; + struct bio_vec rq_bvec[259]; + __be32 rq_xid; + u32 rq_prog; + u32 rq_vers; + u32 rq_proc; + u32 rq_prot; + int rq_cachetype; + long unsigned int rq_flags; + ktime_t rq_qtime; + void *rq_argp; + void *rq_resp; + void *rq_auth_data; + __be32 rq_auth_stat; + int rq_auth_slack; + int rq_reserved; + ktime_t rq_stime; + struct cache_req rq_chandle; + struct auth_domain *rq_client; + struct auth_domain *rq_gssclient; + struct svc_cacherep *rq_cacherep; + struct task_struct *rq_task; + spinlock_t rq_lock; + struct net *rq_bc_net; + void **rq_lease_breaker; +}; + +struct svc_pool_stats { + atomic_long_t packets; + long unsigned int sockets_queued; + atomic_long_t threads_woken; + atomic_long_t threads_timedout; +}; + +struct svc_pool { + unsigned int sp_id; + spinlock_t sp_lock; + struct list_head sp_sockets; + unsigned int sp_nrthreads; + struct list_head sp_all_threads; + struct svc_pool_stats sp_stats; + long unsigned int sp_flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct svc_serv_ops { + void (*svo_shutdown)(struct svc_serv *, struct net *); + int (*svo_function)(void *); + void (*svo_enqueue_xprt)(struct svc_xprt *); + int (*svo_setup)(struct svc_serv *, struct svc_pool *, int); + struct module *svo_module; +}; + +struct svc_procedure { + __be32 (*pc_func)(struct svc_rqst *); + bool (*pc_decode)(struct svc_rqst *, struct xdr_stream *); + bool (*pc_encode)(struct svc_rqst *, struct xdr_stream *); + void (*pc_release)(struct svc_rqst *); + unsigned int pc_argsize; + unsigned int pc_ressize; + unsigned int pc_cachetype; + unsigned int pc_xdrressize; + const char *pc_name; +}; + +struct svc_deferred_req { + u32 prot; + struct svc_xprt *xprt; + struct __kernel_sockaddr_storage addr; + size_t addrlen; + struct __kernel_sockaddr_storage daddr; + size_t daddrlen; + struct cache_deferred_req handle; + size_t xprt_hlen; + int argslen; + __be32 args[0]; +}; + +struct svc_process_info { + union { + int (*dispatch)(struct svc_rqst *, __be32 *); + struct { + unsigned int lovers; + unsigned int hivers; + } mismatch; + }; +}; + +struct svc_version { + u32 vs_vers; + u32 vs_nproc; + const struct svc_procedure *vs_proc; + unsigned int *vs_count; + u32 vs_xdrsize; + bool vs_hidden; + bool vs_rpcb_optnl; + bool vs_need_cong_ctrl; + int (*vs_dispatch)(struct svc_rqst *, __be32 *); +}; + +struct nfs4_ssc_client_ops; + +struct nfs_ssc_client_ops; + +struct nfs_ssc_client_ops_tbl { + const struct nfs4_ssc_client_ops *ssc_nfs4_ops; + const struct nfs_ssc_client_ops *ssc_nfs_ops; +}; + +struct nfs4_ssc_client_ops { + struct file * (*sco_open)(struct vfsmount *, struct nfs_fh *, nfs4_stateid *); + void (*sco_close)(struct file *); +}; + +struct nfs_ssc_client_ops { + void (*sco_sb_deactive)(struct super_block *); +}; + +struct nfs4_state_recovery_ops { + int owner_flag_bit; + int state_flag_bit; + int (*recover_open)(struct nfs4_state_owner *, struct nfs4_state *); + int (*recover_lock)(struct nfs4_state *, struct file_lock *); + int (*establish_clid)(struct nfs_client *, const struct cred *); + int (*reclaim_complete)(struct nfs_client *, const struct cred *); + int (*detect_trunking)(struct nfs_client *, struct nfs_client **, const struct cred *); +}; + +struct nfs4_state_maintenance_ops { + int (*sched_state_renewal)(struct nfs_client *, const struct cred *, unsigned int); + const struct cred * (*get_state_renewal_cred)(struct nfs_client *); + int (*renew_lease)(struct nfs_client *, const struct cred *); +}; + +struct nfs4_mig_recovery_ops { + int (*get_locations)(struct inode *, struct nfs4_fs_locations *, struct page *, const struct cred *); + int (*fsid_present)(struct inode *, const struct cred *); +}; + +struct nfs4_state_owner { + struct nfs_server *so_server; + struct list_head so_lru; + long unsigned int so_expires; + struct rb_node so_server_node; + const struct cred *so_cred; + spinlock_t so_lock; + atomic_t so_count; + long unsigned int so_flags; + struct list_head so_states; + struct nfs_seqid_counter so_seqid; + seqcount_spinlock_t so_reclaim_seqcount; + struct mutex so_delegreturn_mutex; +}; + +struct core_name { + char *corename; + int used; + int size; +}; + +struct trace_event_raw_iomap_readpage_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + int nr_pages; + char __data[0]; +}; + +struct trace_event_raw_iomap_range_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + loff_t size; + loff_t offset; + u64 length; + char __data[0]; +}; + +struct trace_event_raw_iomap_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + dev_t bdev; + char __data[0]; +}; + +struct trace_event_raw_iomap_iter { + struct trace_entry ent; + dev_t dev; + u64 ino; + loff_t pos; + u64 length; + unsigned int flags; + const void *ops; + long unsigned int caller; + char __data[0]; +}; + +struct trace_event_data_offsets_iomap_readpage_class {}; + +struct trace_event_data_offsets_iomap_range_class {}; + +struct trace_event_data_offsets_iomap_class {}; + +struct trace_event_data_offsets_iomap_iter {}; + +typedef void (*btf_trace_iomap_readpage)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_readahead)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_writepage)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_releasepage)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_invalidatepage)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_dio_invalidate_fail)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_iter_dstmap)(void *, struct inode *, struct iomap___2 *); + +typedef void (*btf_trace_iomap_iter_srcmap)(void *, struct inode *, struct iomap___2 *); + +typedef void (*btf_trace_iomap_iter)(void *, struct iomap_iter *, const void *, long unsigned int); + +enum { + BIOSET_NEED_BVECS = 1, + BIOSET_NEED_RESCUER = 2, + BIOSET_PERCPU_CACHE = 4, +}; + +struct iomap_ioend { + struct list_head io_list; + u16 io_type; + u16 io_flags; + struct inode *io_inode; + size_t io_size; + loff_t io_offset; + struct bio *io_bio; + struct bio io_inline_bio; +}; + +struct iomap_writepage_ctx; + +struct iomap_writeback_ops { + int (*map_blocks)(struct iomap_writepage_ctx *, struct inode *, loff_t); + int (*prepare_ioend)(struct iomap_ioend *, int); + void (*discard_page)(struct page *, loff_t); +}; + +struct iomap_writepage_ctx { + struct iomap___2 iomap; + struct iomap_ioend *ioend; + const struct iomap_writeback_ops *ops; +}; + +struct iomap_page { + atomic_t read_bytes_pending; + atomic_t write_bytes_pending; + spinlock_t uptodate_lock; + long unsigned int uptodate[0]; +}; + +struct iomap_readpage_ctx { + struct page *cur_page; + bool cur_page_in_bio; + struct bio *bio; + struct readahead_control *rac; +}; + +struct iomap_dio_ops { + int (*end_io)(struct kiocb *, ssize_t, int, unsigned int); + void (*submit_io)(const struct iomap_iter *, struct bio *, loff_t); +}; + +struct iomap_dio { + struct kiocb *iocb; + const struct iomap_dio_ops *dops; + loff_t i_size; + loff_t size; + atomic_t ref; + unsigned int flags; + int error; + size_t done_before; + bool wait_for_completion; + union { + struct { + struct iov_iter *iter; + struct task_struct *waiter; + struct bio *poll_bio; + } submit; + struct { + struct work_struct work; + } aio; + }; +}; + +struct iomap_swapfile_info { + struct iomap___2 iomap; + struct swap_info_struct *sis; + uint64_t lowest_ppage; + uint64_t highest_ppage; + long unsigned int nr_pages; + int nr_extents; + struct file *file; +}; + +enum { + QIF_BLIMITS_B = 0, + QIF_SPACE_B = 1, + QIF_ILIMITS_B = 2, + QIF_INODES_B = 3, + QIF_BTIME_B = 4, + QIF_ITIME_B = 5, +}; + +typedef __kernel_uid32_t qid_t; + +enum { + DQF_INFO_DIRTY_B = 17, +}; + +struct dqstats { + long unsigned int stat[8]; + struct percpu_counter counter[8]; +}; + +enum { + _DQUOT_USAGE_ENABLED = 0, + _DQUOT_LIMITS_ENABLED = 1, + _DQUOT_SUSPENDED = 2, + _DQUOT_STATE_FLAGS = 3, +}; + +struct quota_module_name { + int qm_fmt_id; + char *qm_mod_name; +}; + +struct dquot_warn { + struct super_block *w_sb; + struct kqid w_dq_id; + short int w_type; +}; + +struct fs_disk_quota { + __s8 d_version; + __s8 d_flags; + __u16 d_fieldmask; + __u32 d_id; + __u64 d_blk_hardlimit; + __u64 d_blk_softlimit; + __u64 d_ino_hardlimit; + __u64 d_ino_softlimit; + __u64 d_bcount; + __u64 d_icount; + __s32 d_itimer; + __s32 d_btimer; + __u16 d_iwarns; + __u16 d_bwarns; + __s8 d_itimer_hi; + __s8 d_btimer_hi; + __s8 d_rtbtimer_hi; + __s8 d_padding2; + __u64 d_rtb_hardlimit; + __u64 d_rtb_softlimit; + __u64 d_rtbcount; + __s32 d_rtbtimer; + __u16 d_rtbwarns; + __s16 d_padding3; + char d_padding4[8]; +}; + +struct fs_qfilestat { + __u64 qfs_ino; + __u64 qfs_nblks; + __u32 qfs_nextents; +}; + +typedef struct fs_qfilestat fs_qfilestat_t; + +struct fs_quota_stat { + __s8 qs_version; + __u16 qs_flags; + __s8 qs_pad; + fs_qfilestat_t qs_uquota; + fs_qfilestat_t qs_gquota; + __u32 qs_incoredqs; + __s32 qs_btimelimit; + __s32 qs_itimelimit; + __s32 qs_rtbtimelimit; + __u16 qs_bwarnlimit; + __u16 qs_iwarnlimit; +}; + +struct fs_qfilestatv { + __u64 qfs_ino; + __u64 qfs_nblks; + __u32 qfs_nextents; + __u32 qfs_pad; +}; + +struct fs_quota_statv { + __s8 qs_version; + __u8 qs_pad1; + __u16 qs_flags; + __u32 qs_incoredqs; + struct fs_qfilestatv qs_uquota; + struct fs_qfilestatv qs_gquota; + struct fs_qfilestatv qs_pquota; + __s32 qs_btimelimit; + __s32 qs_itimelimit; + __s32 qs_rtbtimelimit; + __u16 qs_bwarnlimit; + __u16 qs_iwarnlimit; + __u16 qs_rtbwarnlimit; + __u16 qs_pad3; + __u32 qs_pad4; + __u64 qs_pad2[7]; +}; + +struct if_dqblk { + __u64 dqb_bhardlimit; + __u64 dqb_bsoftlimit; + __u64 dqb_curspace; + __u64 dqb_ihardlimit; + __u64 dqb_isoftlimit; + __u64 dqb_curinodes; + __u64 dqb_btime; + __u64 dqb_itime; + __u32 dqb_valid; +}; + +struct if_nextdqblk { + __u64 dqb_bhardlimit; + __u64 dqb_bsoftlimit; + __u64 dqb_curspace; + __u64 dqb_ihardlimit; + __u64 dqb_isoftlimit; + __u64 dqb_curinodes; + __u64 dqb_btime; + __u64 dqb_itime; + __u32 dqb_valid; + __u32 dqb_id; +}; + +struct if_dqinfo { + __u64 dqi_bgrace; + __u64 dqi_igrace; + __u32 dqi_flags; + __u32 dqi_valid; +}; + +struct compat_if_dqblk { + compat_u64 dqb_bhardlimit; + compat_u64 dqb_bsoftlimit; + compat_u64 dqb_curspace; + compat_u64 dqb_ihardlimit; + compat_u64 dqb_isoftlimit; + compat_u64 dqb_curinodes; + compat_u64 dqb_btime; + compat_u64 dqb_itime; + compat_uint_t dqb_valid; +}; + +enum { + QUOTA_NL_C_UNSPEC = 0, + QUOTA_NL_C_WARNING = 1, + __QUOTA_NL_C_MAX = 2, +}; + +enum { + QUOTA_NL_A_UNSPEC = 0, + QUOTA_NL_A_QTYPE = 1, + QUOTA_NL_A_EXCESS_ID = 2, + QUOTA_NL_A_WARNING = 3, + QUOTA_NL_A_DEV_MAJOR = 4, + QUOTA_NL_A_DEV_MINOR = 5, + QUOTA_NL_A_CAUSED_ID = 6, + QUOTA_NL_A_PAD = 7, + __QUOTA_NL_A_MAX = 8, +}; + +struct proc_maps_private { + struct inode *inode; + struct task_struct *task; + struct mm_struct *mm; + struct vm_area_struct *tail_vma; + struct mempolicy *task_mempolicy; +}; + +struct mem_size_stats { + long unsigned int resident; + long unsigned int shared_clean; + long unsigned int shared_dirty; + long unsigned int private_clean; + long unsigned int private_dirty; + long unsigned int referenced; + long unsigned int anonymous; + long unsigned int lazyfree; + long unsigned int anonymous_thp; + long unsigned int shmem_thp; + long unsigned int file_thp; + long unsigned int swap; + long unsigned int shared_hugetlb; + long unsigned int private_hugetlb; + u64 pss; + u64 pss_anon; + u64 pss_file; + u64 pss_shmem; + u64 pss_locked; + u64 swap_pss; +}; + +enum clear_refs_types { + CLEAR_REFS_ALL = 1, + CLEAR_REFS_ANON = 2, + CLEAR_REFS_MAPPED = 3, + CLEAR_REFS_SOFT_DIRTY = 4, + CLEAR_REFS_MM_HIWATER_RSS = 5, + CLEAR_REFS_LAST = 6, +}; + +struct clear_refs_private { + enum clear_refs_types type; +}; + +typedef struct { + u64 pme; +} pagemap_entry_t; + +struct pagemapread { + int pos; + int len; + pagemap_entry_t *buffer; + bool show_pfn; +}; + +struct numa_maps { + long unsigned int pages; + long unsigned int anon; + long unsigned int active; + long unsigned int writeback; + long unsigned int mapcount_max; + long unsigned int dirty; + long unsigned int swapcache; + long unsigned int node[64]; +}; + +struct numa_maps_private { + struct proc_maps_private proc_maps; + struct numa_maps md; +}; + +struct pde_opener { + struct list_head lh; + struct file *file; + bool closing; + struct completion *c; +}; + +enum { + BIAS = 2147483648, +}; + +struct proc_fs_context { + struct pid_namespace *pid_ns; + unsigned int mask; + enum proc_hidepid hidepid; + int gid; + enum proc_pidonly pidonly; +}; + +enum proc_param { + Opt_gid___2 = 0, + Opt_hidepid = 1, + Opt_subset = 2, +}; + +struct genradix_root; + +struct __genradix { + struct genradix_root *root; +}; + +struct syscall_info { + __u64 sp; + struct seccomp_data data; +}; + +enum resctrl_conf_type { + CDP_NONE = 0, + CDP_CODE = 1, + CDP_DATA = 2, +}; + +typedef struct dentry *instantiate_t(struct dentry *, struct task_struct *, const void *); + +struct pid_entry { + const char *name; + unsigned int len; + umode_t mode; + const struct inode_operations *iop; + const struct file_operations *fop; + union proc_op op; +}; + +struct limit_names { + const char *name; + const char *unit; +}; + +struct map_files_info { + long unsigned int start; + long unsigned int end; + fmode_t mode; +}; + +struct timers_private { + struct pid *pid; + struct task_struct *task; + struct sighand_struct *sighand; + struct pid_namespace *ns; + long unsigned int flags; +}; + +struct tgid_iter { + unsigned int tgid; + struct task_struct *task; +}; + +struct fd_data { + fmode_t mode; + unsigned int fd; +}; + +struct sysctl_alias { + const char *kernel_param; + const char *sysctl_param; +}; + +struct seq_net_private { + struct net *net; +}; + +struct bpf_iter_aux_info___2; + +enum kcore_type { + KCORE_TEXT = 0, + KCORE_VMALLOC = 1, + KCORE_RAM = 2, + KCORE_VMEMMAP = 3, + KCORE_USER = 4, +}; + +struct kcore_list { + struct list_head list; + long unsigned int addr; + size_t size; + int type; +}; + +struct vmcore { + struct list_head list; + long long unsigned int paddr; + long long unsigned int size; + loff_t offset; +}; + +struct vmcoredd_node { + struct list_head list; + void *buf; + unsigned int size; +}; + +typedef struct elf32_hdr Elf32_Ehdr; + +typedef struct elf32_phdr Elf32_Phdr; + +typedef struct elf32_note Elf32_Nhdr; + +typedef struct elf64_note Elf64_Nhdr; + +struct vmcoredd_header { + __u32 n_namesz; + __u32 n_descsz; + __u32 n_type; + __u8 name[8]; + __u8 dump_name[44]; +}; + +struct vmcore_cb { + bool (*pfn_is_ram)(struct vmcore_cb *, long unsigned int); + struct list_head next; +}; + +struct vmcoredd_data { + char dump_name[44]; + unsigned int size; + int (*vmcoredd_callback)(struct vmcoredd_data *, void *); +}; + +struct kernfs_iattrs { + kuid_t ia_uid; + kgid_t ia_gid; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct simple_xattrs xattrs; + atomic_t nr_user_xattrs; + atomic_t user_xattr_size; +}; + +struct kernfs_super_info { + struct super_block *sb; + struct kernfs_root *root; + const void *ns; + struct list_head node; +}; + +enum kernfs_node_flag { + KERNFS_ACTIVATED = 16, + KERNFS_NS = 32, + KERNFS_HAS_SEQ_SHOW = 64, + KERNFS_HAS_MMAP = 128, + KERNFS_LOCKDEP = 256, + KERNFS_SUICIDAL = 1024, + KERNFS_SUICIDED = 2048, + KERNFS_EMPTY_DIR = 4096, + KERNFS_HAS_RELEASE = 8192, +}; + +struct kernfs_open_node { + atomic_t refcnt; + atomic_t event; + wait_queue_head_t poll; + struct list_head files; +}; + +struct config_group; + +struct config_item_type; + +struct config_item { + char *ci_name; + char ci_namebuf[20]; + struct kref ci_kref; + struct list_head ci_entry; + struct config_item *ci_parent; + struct config_group *ci_group; + const struct config_item_type *ci_type; + struct dentry *ci_dentry; +}; + +struct configfs_subsystem; + +struct config_group { + struct config_item cg_item; + struct list_head cg_children; + struct configfs_subsystem *cg_subsys; + struct list_head default_groups; + struct list_head group_entry; +}; + +struct configfs_item_operations; + +struct configfs_group_operations; + +struct configfs_attribute; + +struct configfs_bin_attribute; + +struct config_item_type { + struct module *ct_owner; + struct configfs_item_operations *ct_item_ops; + struct configfs_group_operations *ct_group_ops; + struct configfs_attribute **ct_attrs; + struct configfs_bin_attribute **ct_bin_attrs; +}; + +struct configfs_item_operations { + void (*release)(struct config_item *); + int (*allow_link)(struct config_item *, struct config_item *); + void (*drop_link)(struct config_item *, struct config_item *); +}; + +struct configfs_group_operations { + struct config_item * (*make_item)(struct config_group *, const char *); + struct config_group * (*make_group)(struct config_group *, const char *); + int (*commit_item)(struct config_item *); + void (*disconnect_notify)(struct config_group *, struct config_item *); + void (*drop_item)(struct config_group *, struct config_item *); +}; + +struct configfs_attribute { + const char *ca_name; + struct module *ca_owner; + umode_t ca_mode; + ssize_t (*show)(struct config_item *, char *); + ssize_t (*store)(struct config_item *, const char *, size_t); +}; + +struct configfs_bin_attribute { + struct configfs_attribute cb_attr; + void *cb_private; + size_t cb_max_size; + ssize_t (*read)(struct config_item *, void *, size_t); + ssize_t (*write)(struct config_item *, const void *, size_t); +}; + +struct configfs_subsystem { + struct config_group su_group; + struct mutex su_mutex; +}; + +struct configfs_fragment { + atomic_t frag_count; + struct rw_semaphore frag_sem; + bool frag_dead; +}; + +struct configfs_dirent { + atomic_t s_count; + int s_dependent_count; + struct list_head s_sibling; + struct list_head s_children; + int s_links; + void *s_element; + int s_type; + umode_t s_mode; + struct dentry *s_dentry; + struct iattr *s_iattr; + struct configfs_fragment *s_frag; +}; + +struct configfs_buffer { + size_t count; + loff_t pos; + char *page; + struct configfs_item_operations *ops; + struct mutex mutex; + int needs_read_fill; + bool read_in_progress; + bool write_in_progress; + char *bin_buffer; + int bin_buffer_size; + int cb_max_size; + struct config_item *item; + struct module *owner; + union { + struct configfs_attribute *attr; + struct configfs_bin_attribute *bin_attr; + }; +}; + +struct pts_mount_opts { + int setuid; + int setgid; + kuid_t uid; + kgid_t gid; + umode_t mode; + umode_t ptmxmode; + int reserve; + int max; +}; + +enum { + Opt_uid___2 = 0, + Opt_gid___3 = 1, + Opt_mode___2 = 2, + Opt_ptmxmode = 3, + Opt_newinstance = 4, + Opt_max = 5, + Opt_err = 6, +}; + +struct pts_fs_info { + struct ida allocated_ptys; + struct pts_mount_opts mount_opts; + struct super_block *sb; + struct dentry *ptmx_dentry; +}; + +typedef unsigned int tid_t; + +struct transaction_chp_stats_s { + long unsigned int cs_chp_time; + __u32 cs_forced_to_close; + __u32 cs_written; + __u32 cs_dropped; +}; + +struct journal_s; + +typedef struct journal_s journal_t; + +struct journal_head; + +struct transaction_s; + +typedef struct transaction_s transaction_t; + +struct transaction_s { + journal_t *t_journal; + tid_t t_tid; + enum { + T_RUNNING = 0, + T_LOCKED = 1, + T_SWITCH = 2, + T_FLUSH = 3, + T_COMMIT = 4, + T_COMMIT_DFLUSH = 5, + T_COMMIT_JFLUSH = 6, + T_COMMIT_CALLBACK = 7, + T_FINISHED = 8, + } t_state; + long unsigned int t_log_start; + int t_nr_buffers; + struct journal_head *t_reserved_list; + struct journal_head *t_buffers; + struct journal_head *t_forget; + struct journal_head *t_checkpoint_list; + struct journal_head *t_checkpoint_io_list; + struct journal_head *t_shadow_list; + struct list_head t_inode_list; + spinlock_t t_handle_lock; + long unsigned int t_max_wait; + long unsigned int t_start; + long unsigned int t_requested; + struct transaction_chp_stats_s t_chp_stats; + atomic_t t_updates; + atomic_t t_outstanding_credits; + atomic_t t_outstanding_revokes; + atomic_t t_handle_count; + transaction_t *t_cpnext; + transaction_t *t_cpprev; + long unsigned int t_expires; + ktime_t t_start_time; + unsigned int t_synchronous_commit: 1; + int t_need_data_flush; + struct list_head t_private_list; +}; + +struct jbd2_buffer_trigger_type; + +struct journal_head { + struct buffer_head *b_bh; + spinlock_t b_state_lock; + int b_jcount; + unsigned int b_jlist; + unsigned int b_modified; + char *b_frozen_data; + char *b_committed_data; + transaction_t *b_transaction; + transaction_t *b_next_transaction; + struct journal_head *b_tnext; + struct journal_head *b_tprev; + transaction_t *b_cp_transaction; + struct journal_head *b_cpnext; + struct journal_head *b_cpprev; + struct jbd2_buffer_trigger_type *b_triggers; + struct jbd2_buffer_trigger_type *b_frozen_triggers; +}; + +struct jbd2_buffer_trigger_type { + void (*t_frozen)(struct jbd2_buffer_trigger_type *, struct buffer_head *, void *, size_t); + void (*t_abort)(struct jbd2_buffer_trigger_type *, struct buffer_head *); +}; + +struct jbd2_journal_handle; + +typedef struct jbd2_journal_handle handle_t; + +struct jbd2_journal_handle { + union { + transaction_t *h_transaction; + journal_t *h_journal; + }; + handle_t *h_rsv_handle; + int h_total_credits; + int h_revoke_credits; + int h_revoke_credits_requested; + int h_ref; + int h_err; + unsigned int h_sync: 1; + unsigned int h_jdata: 1; + unsigned int h_reserved: 1; + unsigned int h_aborted: 1; + unsigned int h_type: 8; + unsigned int h_line_no: 16; + long unsigned int h_start_jiffies; + unsigned int h_requested_credits; + unsigned int saved_alloc_context; +}; + +struct transaction_run_stats_s { + long unsigned int rs_wait; + long unsigned int rs_request_delay; + long unsigned int rs_running; + long unsigned int rs_locked; + long unsigned int rs_flushing; + long unsigned int rs_logging; + __u32 rs_handle_count; + __u32 rs_blocks; + __u32 rs_blocks_logged; +}; + +struct transaction_stats_s { + long unsigned int ts_tid; + long unsigned int ts_requested; + struct transaction_run_stats_s run; +}; + +enum passtype { + PASS_SCAN = 0, + PASS_REVOKE = 1, + PASS_REPLAY = 2, +}; + +struct journal_superblock_s; + +typedef struct journal_superblock_s journal_superblock_t; + +struct jbd2_revoke_table_s; + +struct jbd2_inode; + +struct journal_s { + long unsigned int j_flags; + long unsigned int j_atomic_flags; + int j_errno; + struct mutex j_abort_mutex; + struct buffer_head *j_sb_buffer; + journal_superblock_t *j_superblock; + int j_format_version; + rwlock_t j_state_lock; + int j_barrier_count; + struct mutex j_barrier; + transaction_t *j_running_transaction; + transaction_t *j_committing_transaction; + transaction_t *j_checkpoint_transactions; + wait_queue_head_t j_wait_transaction_locked; + wait_queue_head_t j_wait_done_commit; + wait_queue_head_t j_wait_commit; + wait_queue_head_t j_wait_updates; + wait_queue_head_t j_wait_reserved; + wait_queue_head_t j_fc_wait; + struct mutex j_checkpoint_mutex; + struct buffer_head *j_chkpt_bhs[64]; + struct shrinker j_shrinker; + struct percpu_counter j_checkpoint_jh_count; + transaction_t *j_shrink_transaction; + long unsigned int j_head; + long unsigned int j_tail; + long unsigned int j_free; + long unsigned int j_first; + long unsigned int j_last; + long unsigned int j_fc_first; + long unsigned int j_fc_off; + long unsigned int j_fc_last; + struct block_device *j_dev; + int j_blocksize; + long long unsigned int j_blk_offset; + char j_devname[56]; + struct block_device *j_fs_dev; + unsigned int j_total_len; + atomic_t j_reserved_credits; + spinlock_t j_list_lock; + struct inode *j_inode; + tid_t j_tail_sequence; + tid_t j_transaction_sequence; + tid_t j_commit_sequence; + tid_t j_commit_request; + __u8 j_uuid[16]; + struct task_struct *j_task; + int j_max_transaction_buffers; + int j_revoke_records_per_block; + long unsigned int j_commit_interval; + struct timer_list j_commit_timer; + spinlock_t j_revoke_lock; + struct jbd2_revoke_table_s *j_revoke; + struct jbd2_revoke_table_s *j_revoke_table[2]; + struct buffer_head **j_wbuf; + struct buffer_head **j_fc_wbuf; + int j_wbufsize; + int j_fc_wbufsize; + pid_t j_last_sync_writer; + u64 j_average_commit_time; + u32 j_min_batch_time; + u32 j_max_batch_time; + void (*j_commit_callback)(journal_t *, transaction_t *); + int (*j_submit_inode_data_buffers)(struct jbd2_inode *); + int (*j_finish_inode_data_buffers)(struct jbd2_inode *); + spinlock_t j_history_lock; + struct proc_dir_entry *j_proc_entry; + struct transaction_stats_s j_stats; + unsigned int j_failed_commit; + void *j_private; + struct crypto_shash *j_chksum_driver; + __u32 j_csum_seed; + void (*j_fc_cleanup_callback)(struct journal_s *, int); + int (*j_fc_replay_callback)(struct journal_s *, struct buffer_head *, enum passtype, int, tid_t); +}; + +struct journal_header_s { + __be32 h_magic; + __be32 h_blocktype; + __be32 h_sequence; +}; + +typedef struct journal_header_s journal_header_t; + +struct journal_superblock_s { + journal_header_t s_header; + __be32 s_blocksize; + __be32 s_maxlen; + __be32 s_first; + __be32 s_sequence; + __be32 s_start; + __be32 s_errno; + __be32 s_feature_compat; + __be32 s_feature_incompat; + __be32 s_feature_ro_compat; + __u8 s_uuid[16]; + __be32 s_nr_users; + __be32 s_dynsuper; + __be32 s_max_transaction; + __be32 s_max_trans_data; + __u8 s_checksum_type; + __u8 s_padding2[3]; + __be32 s_num_fc_blks; + __u32 s_padding[41]; + __be32 s_checksum; + __u8 s_users[768]; +}; + +enum jbd_state_bits { + BH_JBD = 16, + BH_JWrite = 17, + BH_Freed = 18, + BH_Revoked = 19, + BH_RevokeValid = 20, + BH_JBDDirty = 21, + BH_JournalHead = 22, + BH_Shadow = 23, + BH_Verified = 24, + BH_JBDPrivateStart = 25, +}; + +struct jbd2_inode { + transaction_t *i_transaction; + transaction_t *i_next_transaction; + struct list_head i_list; + struct inode *i_vfs_inode; + long unsigned int i_flags; + loff_t i_dirty_start; + loff_t i_dirty_end; +}; + +struct bgl_lock { + spinlock_t lock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct blockgroup_lock { + struct bgl_lock locks[128]; +}; + +typedef int ext4_grpblk_t; + +typedef long long unsigned int ext4_fsblk_t; + +typedef __u32 ext4_lblk_t; + +typedef unsigned int ext4_group_t; + +struct ext4_allocation_request { + struct inode *inode; + unsigned int len; + ext4_lblk_t logical; + ext4_lblk_t lleft; + ext4_lblk_t lright; + ext4_fsblk_t goal; + ext4_fsblk_t pleft; + ext4_fsblk_t pright; + unsigned int flags; +}; + +struct ext4_system_blocks { + struct rb_root root; + struct callback_head rcu; +}; + +struct ext4_group_desc { + __le32 bg_block_bitmap_lo; + __le32 bg_inode_bitmap_lo; + __le32 bg_inode_table_lo; + __le16 bg_free_blocks_count_lo; + __le16 bg_free_inodes_count_lo; + __le16 bg_used_dirs_count_lo; + __le16 bg_flags; + __le32 bg_exclude_bitmap_lo; + __le16 bg_block_bitmap_csum_lo; + __le16 bg_inode_bitmap_csum_lo; + __le16 bg_itable_unused_lo; + __le16 bg_checksum; + __le32 bg_block_bitmap_hi; + __le32 bg_inode_bitmap_hi; + __le32 bg_inode_table_hi; + __le16 bg_free_blocks_count_hi; + __le16 bg_free_inodes_count_hi; + __le16 bg_used_dirs_count_hi; + __le16 bg_itable_unused_hi; + __le32 bg_exclude_bitmap_hi; + __le16 bg_block_bitmap_csum_hi; + __le16 bg_inode_bitmap_csum_hi; + __u32 bg_reserved; +}; + +struct flex_groups { + atomic64_t free_clusters; + atomic_t free_inodes; + atomic_t used_dirs; +}; + +struct extent_status { + struct rb_node rb_node; + ext4_lblk_t es_lblk; + ext4_lblk_t es_len; + ext4_fsblk_t es_pblk; +}; + +struct ext4_es_tree { + struct rb_root root; + struct extent_status *cache_es; +}; + +struct ext4_es_stats { + long unsigned int es_stats_shrunk; + struct percpu_counter es_stats_cache_hits; + struct percpu_counter es_stats_cache_misses; + u64 es_stats_scan_time; + u64 es_stats_max_scan_time; + struct percpu_counter es_stats_all_cnt; + struct percpu_counter es_stats_shk_cnt; +}; + +struct ext4_pending_tree { + struct rb_root root; +}; + +struct ext4_fc_stats { + unsigned int fc_ineligible_reason_count[10]; + long unsigned int fc_num_commits; + long unsigned int fc_ineligible_commits; + long unsigned int fc_numblks; +}; + +struct ext4_fc_alloc_region { + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + int ino; + int len; +}; + +struct ext4_fc_replay_state { + int fc_replay_num_tags; + int fc_replay_expected_off; + int fc_current_pass; + int fc_cur_tag; + int fc_crc; + struct ext4_fc_alloc_region *fc_regions; + int fc_regions_size; + int fc_regions_used; + int fc_regions_valid; + int *fc_modified_inodes; + int fc_modified_inodes_used; + int fc_modified_inodes_size; +}; + +struct ext4_inode_info { + __le32 i_data[15]; + __u32 i_dtime; + ext4_fsblk_t i_file_acl; + ext4_group_t i_block_group; + ext4_lblk_t i_dir_start_lookup; + long unsigned int i_flags; + struct rw_semaphore xattr_sem; + union { + struct list_head i_orphan; + unsigned int i_orphan_idx; + }; + struct list_head i_fc_list; + ext4_lblk_t i_fc_lblk_start; + ext4_lblk_t i_fc_lblk_len; + atomic_t i_fc_updates; + wait_queue_head_t i_fc_wait; + struct mutex i_fc_lock; + loff_t i_disksize; + struct rw_semaphore i_data_sem; + struct inode vfs_inode; + struct jbd2_inode *jinode; + spinlock_t i_raw_lock; + struct timespec64 i_crtime; + atomic_t i_prealloc_active; + struct list_head i_prealloc_list; + spinlock_t i_prealloc_lock; + struct ext4_es_tree i_es_tree; + rwlock_t i_es_lock; + struct list_head i_es_list; + unsigned int i_es_all_nr; + unsigned int i_es_shk_nr; + ext4_lblk_t i_es_shrink_lblk; + ext4_group_t i_last_alloc_group; + unsigned int i_reserved_data_blocks; + struct ext4_pending_tree i_pending_tree; + __u16 i_extra_isize; + u16 i_inline_off; + u16 i_inline_size; + qsize_t i_reserved_quota; + spinlock_t i_completed_io_lock; + struct list_head i_rsv_conversion_list; + struct work_struct i_rsv_conversion_work; + atomic_t i_unwritten; + spinlock_t i_block_reservation_lock; + tid_t i_sync_tid; + tid_t i_datasync_tid; + struct dquot *i_dquot[3]; + __u32 i_csum_seed; + kprojid_t i_projid; +}; + +struct ext4_super_block { + __le32 s_inodes_count; + __le32 s_blocks_count_lo; + __le32 s_r_blocks_count_lo; + __le32 s_free_blocks_count_lo; + __le32 s_free_inodes_count; + __le32 s_first_data_block; + __le32 s_log_block_size; + __le32 s_log_cluster_size; + __le32 s_blocks_per_group; + __le32 s_clusters_per_group; + __le32 s_inodes_per_group; + __le32 s_mtime; + __le32 s_wtime; + __le16 s_mnt_count; + __le16 s_max_mnt_count; + __le16 s_magic; + __le16 s_state; + __le16 s_errors; + __le16 s_minor_rev_level; + __le32 s_lastcheck; + __le32 s_checkinterval; + __le32 s_creator_os; + __le32 s_rev_level; + __le16 s_def_resuid; + __le16 s_def_resgid; + __le32 s_first_ino; + __le16 s_inode_size; + __le16 s_block_group_nr; + __le32 s_feature_compat; + __le32 s_feature_incompat; + __le32 s_feature_ro_compat; + __u8 s_uuid[16]; + char s_volume_name[16]; + char s_last_mounted[64]; + __le32 s_algorithm_usage_bitmap; + __u8 s_prealloc_blocks; + __u8 s_prealloc_dir_blocks; + __le16 s_reserved_gdt_blocks; + __u8 s_journal_uuid[16]; + __le32 s_journal_inum; + __le32 s_journal_dev; + __le32 s_last_orphan; + __le32 s_hash_seed[4]; + __u8 s_def_hash_version; + __u8 s_jnl_backup_type; + __le16 s_desc_size; + __le32 s_default_mount_opts; + __le32 s_first_meta_bg; + __le32 s_mkfs_time; + __le32 s_jnl_blocks[17]; + __le32 s_blocks_count_hi; + __le32 s_r_blocks_count_hi; + __le32 s_free_blocks_count_hi; + __le16 s_min_extra_isize; + __le16 s_want_extra_isize; + __le32 s_flags; + __le16 s_raid_stride; + __le16 s_mmp_update_interval; + __le64 s_mmp_block; + __le32 s_raid_stripe_width; + __u8 s_log_groups_per_flex; + __u8 s_checksum_type; + __u8 s_encryption_level; + __u8 s_reserved_pad; + __le64 s_kbytes_written; + __le32 s_snapshot_inum; + __le32 s_snapshot_id; + __le64 s_snapshot_r_blocks_count; + __le32 s_snapshot_list; + __le32 s_error_count; + __le32 s_first_error_time; + __le32 s_first_error_ino; + __le64 s_first_error_block; + __u8 s_first_error_func[32]; + __le32 s_first_error_line; + __le32 s_last_error_time; + __le32 s_last_error_ino; + __le32 s_last_error_line; + __le64 s_last_error_block; + __u8 s_last_error_func[32]; + __u8 s_mount_opts[64]; + __le32 s_usr_quota_inum; + __le32 s_grp_quota_inum; + __le32 s_overhead_clusters; + __le32 s_backup_bgs[2]; + __u8 s_encrypt_algos[4]; + __u8 s_encrypt_pw_salt[16]; + __le32 s_lpf_ino; + __le32 s_prj_quota_inum; + __le32 s_checksum_seed; + __u8 s_wtime_hi; + __u8 s_mtime_hi; + __u8 s_mkfs_time_hi; + __u8 s_lastcheck_hi; + __u8 s_first_error_time_hi; + __u8 s_last_error_time_hi; + __u8 s_first_error_errcode; + __u8 s_last_error_errcode; + __le16 s_encoding; + __le16 s_encoding_flags; + __le32 s_orphan_file_inum; + __le32 s_reserved[94]; + __le32 s_checksum; +}; + +struct ext4_journal_trigger { + struct jbd2_buffer_trigger_type tr_triggers; + struct super_block *sb; +}; + +struct ext4_orphan_block { + atomic_t ob_free_entries; + struct buffer_head *ob_bh; +}; + +struct ext4_orphan_info { + int of_blocks; + __u32 of_csum_seed; + struct ext4_orphan_block *of_binfo; +}; + +struct mb_cache___2; + +struct ext4_group_info; + +struct ext4_locality_group; + +struct ext4_li_request; + +struct ext4_sb_info { + long unsigned int s_desc_size; + long unsigned int s_inodes_per_block; + long unsigned int s_blocks_per_group; + long unsigned int s_clusters_per_group; + long unsigned int s_inodes_per_group; + long unsigned int s_itb_per_group; + long unsigned int s_gdb_count; + long unsigned int s_desc_per_block; + ext4_group_t s_groups_count; + ext4_group_t s_blockfile_groups; + long unsigned int s_overhead; + unsigned int s_cluster_ratio; + unsigned int s_cluster_bits; + loff_t s_bitmap_maxbytes; + struct buffer_head *s_sbh; + struct ext4_super_block *s_es; + struct buffer_head **s_group_desc; + unsigned int s_mount_opt; + unsigned int s_mount_opt2; + long unsigned int s_mount_flags; + unsigned int s_def_mount_opt; + ext4_fsblk_t s_sb_block; + atomic64_t s_resv_clusters; + kuid_t s_resuid; + kgid_t s_resgid; + short unsigned int s_mount_state; + short unsigned int s_pad; + int s_addr_per_block_bits; + int s_desc_per_block_bits; + int s_inode_size; + int s_first_ino; + unsigned int s_inode_readahead_blks; + unsigned int s_inode_goal; + u32 s_hash_seed[4]; + int s_def_hash_version; + int s_hash_unsigned; + struct percpu_counter s_freeclusters_counter; + struct percpu_counter s_freeinodes_counter; + struct percpu_counter s_dirs_counter; + struct percpu_counter s_dirtyclusters_counter; + struct percpu_counter s_sra_exceeded_retry_limit; + struct blockgroup_lock *s_blockgroup_lock; + struct proc_dir_entry *s_proc; + struct kobject s_kobj; + struct completion s_kobj_unregister; + struct super_block *s_sb; + struct buffer_head *s_mmp_bh; + struct journal_s *s_journal; + long unsigned int s_ext4_flags; + struct mutex s_orphan_lock; + struct list_head s_orphan; + struct ext4_orphan_info s_orphan_info; + long unsigned int s_commit_interval; + u32 s_max_batch_time; + u32 s_min_batch_time; + struct block_device *s_journal_bdev; + char *s_qf_names[3]; + int s_jquota_fmt; + unsigned int s_want_extra_isize; + struct ext4_system_blocks *s_system_blks; + struct ext4_group_info ***s_group_info; + struct inode *s_buddy_cache; + spinlock_t s_md_lock; + short unsigned int *s_mb_offsets; + unsigned int *s_mb_maxs; + unsigned int s_group_info_size; + unsigned int s_mb_free_pending; + struct list_head s_freed_data_list; + struct list_head s_discard_list; + struct work_struct s_discard_work; + atomic_t s_retry_alloc_pending; + struct rb_root s_mb_avg_fragment_size_root; + rwlock_t s_mb_rb_lock; + struct list_head *s_mb_largest_free_orders; + rwlock_t *s_mb_largest_free_orders_locks; + long unsigned int s_stripe; + unsigned int s_mb_max_linear_groups; + unsigned int s_mb_stream_request; + unsigned int s_mb_max_to_scan; + unsigned int s_mb_min_to_scan; + unsigned int s_mb_stats; + unsigned int s_mb_order2_reqs; + unsigned int s_mb_group_prealloc; + unsigned int s_mb_max_inode_prealloc; + unsigned int s_max_dir_size_kb; + long unsigned int s_mb_last_group; + long unsigned int s_mb_last_start; + unsigned int s_mb_prefetch; + unsigned int s_mb_prefetch_limit; + atomic_t s_bal_reqs; + atomic_t s_bal_success; + atomic_t s_bal_allocated; + atomic_t s_bal_ex_scanned; + atomic_t s_bal_groups_scanned; + atomic_t s_bal_goals; + atomic_t s_bal_breaks; + atomic_t s_bal_2orders; + atomic_t s_bal_cr0_bad_suggestions; + atomic_t s_bal_cr1_bad_suggestions; + atomic64_t s_bal_cX_groups_considered[4]; + atomic64_t s_bal_cX_hits[4]; + atomic64_t s_bal_cX_failed[4]; + atomic_t s_mb_buddies_generated; + atomic64_t s_mb_generation_time; + atomic_t s_mb_lost_chunks; + atomic_t s_mb_preallocated; + atomic_t s_mb_discarded; + atomic_t s_lock_busy; + struct ext4_locality_group *s_locality_groups; + long unsigned int s_sectors_written_start; + u64 s_kbytes_written; + unsigned int s_extent_max_zeroout_kb; + unsigned int s_log_groups_per_flex; + struct flex_groups **s_flex_groups; + ext4_group_t s_flex_groups_allocated; + struct workqueue_struct *rsv_conversion_wq; + struct timer_list s_err_report; + struct ext4_li_request *s_li_request; + unsigned int s_li_wait_mult; + struct task_struct *s_mmp_tsk; + atomic_t s_last_trim_minblks; + struct crypto_shash *s_chksum_driver; + __u32 s_csum_seed; + struct shrinker s_es_shrinker; + struct list_head s_es_list; + long int s_es_nr_inode; + struct ext4_es_stats s_es_stats; + struct mb_cache___2 *s_ea_block_cache; + struct mb_cache___2 *s_ea_inode_cache; + long: 64; + long: 64; + spinlock_t s_es_lock; + struct ext4_journal_trigger s_journal_triggers[1]; + struct ratelimit_state s_err_ratelimit_state; + struct ratelimit_state s_warning_ratelimit_state; + struct ratelimit_state s_msg_ratelimit_state; + atomic_t s_warning_count; + atomic_t s_msg_count; + struct fscrypt_dummy_policy s_dummy_enc_policy; + struct percpu_rw_semaphore s_writepages_rwsem; + struct dax_device *s_daxdev; + errseq_t s_bdev_wb_err; + spinlock_t s_bdev_wb_lock; + spinlock_t s_error_lock; + int s_add_error_count; + int s_first_error_code; + __u32 s_first_error_line; + __u32 s_first_error_ino; + __u64 s_first_error_block; + const char *s_first_error_func; + time64_t s_first_error_time; + int s_last_error_code; + __u32 s_last_error_line; + __u32 s_last_error_ino; + __u64 s_last_error_block; + const char *s_last_error_func; + time64_t s_last_error_time; + struct work_struct s_error_work; + atomic_t s_fc_subtid; + atomic_t s_fc_ineligible_updates; + struct list_head s_fc_q[2]; + struct list_head s_fc_dentry_q[2]; + unsigned int s_fc_bytes; + spinlock_t s_fc_lock; + struct buffer_head *s_fc_bh; + struct ext4_fc_stats s_fc_stats; + u64 s_fc_avg_commit_time; + struct ext4_fc_replay_state s_fc_replay_state; + long: 64; + long: 64; +}; + +struct ext4_group_info { + long unsigned int bb_state; + struct rb_root bb_free_root; + ext4_grpblk_t bb_first_free; + ext4_grpblk_t bb_free; + ext4_grpblk_t bb_fragments; + ext4_grpblk_t bb_largest_free_order; + ext4_group_t bb_group; + struct list_head bb_prealloc_list; + struct rw_semaphore alloc_sem; + struct rb_node bb_avg_fragment_size_rb; + struct list_head bb_largest_free_order_node; + ext4_grpblk_t bb_counters[0]; +}; + +struct ext4_locality_group { + struct mutex lg_mutex; + struct list_head lg_prealloc_list[10]; + spinlock_t lg_prealloc_lock; +}; + +enum ext4_li_mode { + EXT4_LI_MODE_PREFETCH_BBITMAP = 0, + EXT4_LI_MODE_ITABLE = 1, +}; + +struct ext4_li_request { + struct super_block *lr_super; + enum ext4_li_mode lr_mode; + ext4_group_t lr_first_not_zeroed; + ext4_group_t lr_next_group; + struct list_head lr_request; + long unsigned int lr_next_sched; + long unsigned int lr_timeout; +}; + +struct ext4_map_blocks { + ext4_fsblk_t m_pblk; + ext4_lblk_t m_lblk; + unsigned int m_len; + unsigned int m_flags; +}; + +typedef enum { + EXT4_IGET_NORMAL = 0, + EXT4_IGET_SPECIAL = 1, + EXT4_IGET_HANDLE = 2, +} ext4_iget_flags; + +struct ext4_system_zone { + struct rb_node node; + ext4_fsblk_t start_blk; + unsigned int count; + u32 ino; +}; + +enum { + EXT4_INODE_SECRM = 0, + EXT4_INODE_UNRM = 1, + EXT4_INODE_COMPR = 2, + EXT4_INODE_SYNC = 3, + EXT4_INODE_IMMUTABLE = 4, + EXT4_INODE_APPEND = 5, + EXT4_INODE_NODUMP = 6, + EXT4_INODE_NOATIME = 7, + EXT4_INODE_DIRTY = 8, + EXT4_INODE_COMPRBLK = 9, + EXT4_INODE_NOCOMPR = 10, + EXT4_INODE_ENCRYPT = 11, + EXT4_INODE_INDEX = 12, + EXT4_INODE_IMAGIC = 13, + EXT4_INODE_JOURNAL_DATA = 14, + EXT4_INODE_NOTAIL = 15, + EXT4_INODE_DIRSYNC = 16, + EXT4_INODE_TOPDIR = 17, + EXT4_INODE_HUGE_FILE = 18, + EXT4_INODE_EXTENTS = 19, + EXT4_INODE_VERITY = 20, + EXT4_INODE_EA_INODE = 21, + EXT4_INODE_DAX = 25, + EXT4_INODE_INLINE_DATA = 28, + EXT4_INODE_PROJINHERIT = 29, + EXT4_INODE_CASEFOLD = 30, + EXT4_INODE_RESERVED = 31, +}; + +enum { + EXT4_FC_REASON_OK = 0, + EXT4_FC_REASON_INELIGIBLE = 1, + EXT4_FC_REASON_ALREADY_COMMITTED = 2, + EXT4_FC_REASON_FC_START_FAILED = 3, + EXT4_FC_REASON_FC_FAILED = 4, + EXT4_FC_REASON_XATTR = 0, + EXT4_FC_REASON_CROSS_RENAME = 1, + EXT4_FC_REASON_JOURNAL_FLAG_CHANGE = 2, + EXT4_FC_REASON_NOMEM = 3, + EXT4_FC_REASON_SWAP_BOOT = 4, + EXT4_FC_REASON_RESIZE = 5, + EXT4_FC_REASON_RENAME_DIR = 6, + EXT4_FC_REASON_FALLOC_RANGE = 7, + EXT4_FC_REASON_INODE_JOURNAL_DATA = 8, + EXT4_FC_COMMIT_FAILED = 9, + EXT4_FC_REASON_MAX = 10, +}; + +enum ext4_journal_trigger_type { + EXT4_JTR_ORPHAN_FILE = 0, + EXT4_JTR_NONE = 1, +}; + +struct ext4_dir_entry_hash { + __le32 hash; + __le32 minor_hash; +}; + +struct ext4_dir_entry_2 { + __le32 inode; + __le16 rec_len; + __u8 name_len; + __u8 file_type; + char name[255]; +}; + +struct fname; + +struct dir_private_info { + struct rb_root root; + struct rb_node *curr_node; + struct fname *extra_fname; + loff_t last_pos; + __u32 curr_hash; + __u32 curr_minor_hash; + __u32 next_hash; +}; + +struct fname { + __u32 hash; + __u32 minor_hash; + struct rb_node rb_hash; + struct fname *next; + __u32 inode; + __u8 name_len; + __u8 file_type; + char name[0]; +}; + +enum { + BLK_RW_ASYNC = 0, + BLK_RW_SYNC = 1, +}; + +enum SHIFT_DIRECTION { + SHIFT_LEFT = 0, + SHIFT_RIGHT = 1, +}; + +struct ext4_io_end_vec { + struct list_head list; + loff_t offset; + ssize_t size; +}; + +struct ext4_io_end { + struct list_head list; + handle_t *handle; + struct inode *inode; + struct bio *bio; + unsigned int flag; + refcount_t count; + struct list_head list_vec; +}; + +typedef struct ext4_io_end ext4_io_end_t; + +enum { + ES_WRITTEN_B = 0, + ES_UNWRITTEN_B = 1, + ES_DELAYED_B = 2, + ES_HOLE_B = 3, + ES_REFERENCED_B = 4, + ES_FLAGS = 5, +}; + +enum { + EXT4_STATE_JDATA = 0, + EXT4_STATE_NEW = 1, + EXT4_STATE_XATTR = 2, + EXT4_STATE_NO_EXPAND = 3, + EXT4_STATE_DA_ALLOC_CLOSE = 4, + EXT4_STATE_EXT_MIGRATE = 5, + EXT4_STATE_NEWENTRY = 6, + EXT4_STATE_MAY_INLINE_DATA = 7, + EXT4_STATE_EXT_PRECACHED = 8, + EXT4_STATE_LUSTRE_EA_INODE = 9, + EXT4_STATE_VERITY_IN_PROGRESS = 10, + EXT4_STATE_FC_COMMITTING = 11, + EXT4_STATE_ORPHAN_FILE = 12, +}; + +struct ext4_iloc { + struct buffer_head *bh; + long unsigned int offset; + ext4_group_t block_group; +}; + +struct ext4_extent_tail { + __le32 et_checksum; +}; + +struct ext4_extent { + __le32 ee_block; + __le16 ee_len; + __le16 ee_start_hi; + __le32 ee_start_lo; +}; + +struct ext4_extent_idx { + __le32 ei_block; + __le32 ei_leaf_lo; + __le16 ei_leaf_hi; + __u16 ei_unused; +}; + +struct ext4_extent_header { + __le16 eh_magic; + __le16 eh_entries; + __le16 eh_max; + __le16 eh_depth; + __le32 eh_generation; +}; + +struct ext4_ext_path { + ext4_fsblk_t p_block; + __u16 p_depth; + __u16 p_maxdepth; + struct ext4_extent *p_ext; + struct ext4_extent_idx *p_idx; + struct ext4_extent_header *p_hdr; + struct buffer_head *p_bh; +}; + +struct partial_cluster { + ext4_fsblk_t pclu; + ext4_lblk_t lblk; + enum { + initial = 0, + tofree = 1, + nofree = 2, + } state; +}; + +struct pending_reservation { + struct rb_node rb_node; + ext4_lblk_t lclu; +}; + +struct rsvd_count { + int ndelonly; + bool first_do_lblk_found; + ext4_lblk_t first_do_lblk; + ext4_lblk_t last_do_lblk; + struct extent_status *left_es; + bool partial; + ext4_lblk_t lclu; +}; + +enum { + EXT4_MF_MNTDIR_SAMPLED = 0, + EXT4_MF_FS_ABORTED = 1, + EXT4_MF_FC_INELIGIBLE = 2, + EXT4_MF_FC_COMMITTING = 3, +}; + +struct fsmap { + __u32 fmr_device; + __u32 fmr_flags; + __u64 fmr_physical; + __u64 fmr_owner; + __u64 fmr_offset; + __u64 fmr_length; + __u64 fmr_reserved[3]; +}; + +struct ext4_fsmap { + struct list_head fmr_list; + dev_t fmr_device; + uint32_t fmr_flags; + uint64_t fmr_physical; + uint64_t fmr_owner; + uint64_t fmr_length; +}; + +struct ext4_fsmap_head { + uint32_t fmh_iflags; + uint32_t fmh_oflags; + unsigned int fmh_count; + unsigned int fmh_entries; + struct ext4_fsmap fmh_keys[2]; +}; + +typedef int (*ext4_fsmap_format_t)(struct ext4_fsmap *, void *); + +typedef int (*ext4_mballoc_query_range_fn)(struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t, void *); + +struct ext4_getfsmap_info { + struct ext4_fsmap_head *gfi_head; + ext4_fsmap_format_t gfi_formatter; + void *gfi_format_arg; + ext4_fsblk_t gfi_next_fsblk; + u32 gfi_dev; + ext4_group_t gfi_agno; + struct ext4_fsmap gfi_low; + struct ext4_fsmap gfi_high; + struct ext4_fsmap gfi_lastfree; + struct list_head gfi_meta_list; + bool gfi_last; +}; + +struct ext4_getfsmap_dev { + int (*gfd_fn)(struct super_block *, struct ext4_fsmap *, struct ext4_getfsmap_info *); + u32 gfd_dev; +}; + +struct dx_hash_info { + u32 hash; + u32 minor_hash; + int hash_version; + u32 *seed; +}; + +typedef unsigned int __kernel_mode_t; + +typedef __kernel_mode_t mode_t; + +struct ext4_inode { + __le16 i_mode; + __le16 i_uid; + __le32 i_size_lo; + __le32 i_atime; + __le32 i_ctime; + __le32 i_mtime; + __le32 i_dtime; + __le16 i_gid; + __le16 i_links_count; + __le32 i_blocks_lo; + __le32 i_flags; + union { + struct { + __le32 l_i_version; + } linux1; + struct { + __u32 h_i_translator; + } hurd1; + struct { + __u32 m_i_reserved1; + } masix1; + } osd1; + __le32 i_block[15]; + __le32 i_generation; + __le32 i_file_acl_lo; + __le32 i_size_high; + __le32 i_obso_faddr; + union { + struct { + __le16 l_i_blocks_high; + __le16 l_i_file_acl_high; + __le16 l_i_uid_high; + __le16 l_i_gid_high; + __le16 l_i_checksum_lo; + __le16 l_i_reserved; + } linux2; + struct { + __le16 h_i_reserved1; + __u16 h_i_mode_high; + __u16 h_i_uid_high; + __u16 h_i_gid_high; + __u32 h_i_author; + } hurd2; + struct { + __le16 h_i_reserved1; + __le16 m_i_file_acl_high; + __u32 m_i_reserved2[2]; + } masix2; + } osd2; + __le16 i_extra_isize; + __le16 i_checksum_hi; + __le32 i_ctime_extra; + __le32 i_mtime_extra; + __le32 i_atime_extra; + __le32 i_crtime; + __le32 i_crtime_extra; + __le32 i_version_hi; + __le32 i_projid; +}; + +struct orlov_stats { + __u64 free_clusters; + __u32 free_inodes; + __u32 used_dirs; +}; + +typedef struct { + __le32 *p; + __le32 key; + struct buffer_head *bh; +} Indirect; + +struct ext4_filename { + const struct qstr *usr_fname; + struct fscrypt_str disk_name; + struct dx_hash_info hinfo; + struct fscrypt_str crypto_buf; + struct fscrypt_str cf_name; +}; + +struct ext4_xattr_ibody_header { + __le32 h_magic; +}; + +struct ext4_xattr_entry { + __u8 e_name_len; + __u8 e_name_index; + __le16 e_value_offs; + __le32 e_value_inum; + __le32 e_value_size; + __le32 e_hash; + char e_name[0]; +}; + +struct ext4_xattr_info { + const char *name; + const void *value; + size_t value_len; + int name_index; + int in_inode; +}; + +struct ext4_xattr_search { + struct ext4_xattr_entry *first; + void *base; + void *end; + struct ext4_xattr_entry *here; + int not_found; +}; + +struct ext4_xattr_ibody_find { + struct ext4_xattr_search s; + struct ext4_iloc iloc; +}; + +typedef short unsigned int __kernel_uid16_t; + +typedef short unsigned int __kernel_gid16_t; + +typedef __kernel_uid16_t uid16_t; + +typedef __kernel_gid16_t gid16_t; + +struct ext4_io_submit { + struct writeback_control *io_wbc; + struct bio *io_bio; + ext4_io_end_t *io_end; + sector_t io_next_block; +}; + +struct ext4_xattr_inode_array { + unsigned int count; + struct inode *inodes[0]; +}; + +struct mpage_da_data { + struct inode *inode; + struct writeback_control *wbc; + long unsigned int first_page; + long unsigned int next_page; + long unsigned int last_page; + struct ext4_map_blocks map; + struct ext4_io_submit io_submit; + unsigned int do_map: 1; + unsigned int scanned_until_end: 1; +}; + +struct fstrim_range { + __u64 start; + __u64 len; + __u64 minlen; +}; + +struct ext4_new_group_input { + __u32 group; + __u64 block_bitmap; + __u64 inode_bitmap; + __u64 inode_table; + __u32 blocks_count; + __u16 reserved_blocks; + __u16 unused; +}; + +struct compat_ext4_new_group_input { + u32 group; + compat_u64 block_bitmap; + compat_u64 inode_bitmap; + compat_u64 inode_table; + u32 blocks_count; + u16 reserved_blocks; + u16 unused; +}; + +struct ext4_new_group_data { + __u32 group; + __u64 block_bitmap; + __u64 inode_bitmap; + __u64 inode_table; + __u32 blocks_count; + __u16 reserved_blocks; + __u16 mdata_blocks; + __u32 free_clusters_count; +}; + +struct move_extent { + __u32 reserved; + __u32 donor_fd; + __u64 orig_start; + __u64 donor_start; + __u64 len; + __u64 moved_len; +}; + +struct fsmap_head { + __u32 fmh_iflags; + __u32 fmh_oflags; + __u32 fmh_count; + __u32 fmh_entries; + __u64 fmh_reserved[6]; + struct fsmap fmh_keys[2]; + struct fsmap fmh_recs[0]; +}; + +struct getfsmap_info { + struct super_block *gi_sb; + struct fsmap_head *gi_data; + unsigned int gi_idx; + __u32 gi_last_flags; +}; + +enum blk_default_limits { + BLK_MAX_SEGMENTS = 128, + BLK_SAFE_MAX_SECTORS = 255, + BLK_DEF_MAX_SECTORS = 2560, + BLK_MAX_SEGMENT_SIZE = 65536, + BLK_SEG_BOUNDARY_MASK = 4294967295, +}; + +struct ext4_free_data { + struct list_head efd_list; + struct rb_node efd_node; + ext4_group_t efd_group; + ext4_grpblk_t efd_start_cluster; + ext4_grpblk_t efd_count; + tid_t efd_tid; +}; + +struct ext4_prealloc_space { + struct list_head pa_inode_list; + struct list_head pa_group_list; + union { + struct list_head pa_tmp_list; + struct callback_head pa_rcu; + } u; + spinlock_t pa_lock; + atomic_t pa_count; + unsigned int pa_deleted; + ext4_fsblk_t pa_pstart; + ext4_lblk_t pa_lstart; + ext4_grpblk_t pa_len; + ext4_grpblk_t pa_free; + short unsigned int pa_type; + spinlock_t *pa_obj_lock; + struct inode *pa_inode; +}; + +enum { + MB_INODE_PA = 0, + MB_GROUP_PA = 1, +}; + +struct ext4_free_extent { + ext4_lblk_t fe_logical; + ext4_grpblk_t fe_start; + ext4_group_t fe_group; + ext4_grpblk_t fe_len; +}; + +struct ext4_allocation_context { + struct inode *ac_inode; + struct super_block *ac_sb; + struct ext4_free_extent ac_o_ex; + struct ext4_free_extent ac_g_ex; + struct ext4_free_extent ac_b_ex; + struct ext4_free_extent ac_f_ex; + ext4_group_t ac_last_optimal_group; + __u32 ac_groups_considered; + __u32 ac_flags; + __u16 ac_groups_scanned; + __u16 ac_groups_linear_remaining; + __u16 ac_found; + __u16 ac_tail; + __u16 ac_buddy; + __u8 ac_status; + __u8 ac_criteria; + __u8 ac_2order; + __u8 ac_op; + struct page *ac_bitmap_page; + struct page *ac_buddy_page; + struct ext4_prealloc_space *ac_pa; + struct ext4_locality_group *ac_lg; +}; + +struct ext4_buddy { + struct page *bd_buddy_page; + void *bd_buddy; + struct page *bd_bitmap_page; + void *bd_bitmap; + struct ext4_group_info *bd_info; + struct super_block *bd_sb; + __u16 bd_blkbits; + ext4_group_t bd_group; +}; + +struct sg { + struct ext4_group_info info; + ext4_grpblk_t counters[18]; +}; + +struct migrate_struct { + ext4_lblk_t first_block; + ext4_lblk_t last_block; + ext4_lblk_t curr_block; + ext4_fsblk_t first_pblock; + ext4_fsblk_t last_pblock; +}; + +struct mmp_struct { + __le32 mmp_magic; + __le32 mmp_seq; + __le64 mmp_time; + char mmp_nodename[64]; + char mmp_bdevname[32]; + __le16 mmp_check_interval; + __le16 mmp_pad1; + __le32 mmp_pad2[226]; + __le32 mmp_checksum; +}; + +struct ext4_dir_entry { + __le32 inode; + __le16 rec_len; + __le16 name_len; + char name[255]; +}; + +struct ext4_dir_entry_tail { + __le32 det_reserved_zero1; + __le16 det_rec_len; + __u8 det_reserved_zero2; + __u8 det_reserved_ft; + __le32 det_checksum; +}; + +typedef enum { + EITHER = 0, + INDEX = 1, + DIRENT = 2, + DIRENT_HTREE = 3, +} dirblock_type_t; + +struct fake_dirent { + __le32 inode; + __le16 rec_len; + u8 name_len; + u8 file_type; +}; + +struct dx_countlimit { + __le16 limit; + __le16 count; +}; + +struct dx_entry { + __le32 hash; + __le32 block; +}; + +struct dx_root_info { + __le32 reserved_zero; + u8 hash_version; + u8 info_length; + u8 indirect_levels; + u8 unused_flags; +}; + +struct dx_root { + struct fake_dirent dot; + char dot_name[4]; + struct fake_dirent dotdot; + char dotdot_name[4]; + struct dx_root_info info; + struct dx_entry entries[0]; +}; + +struct dx_node { + struct fake_dirent fake; + struct dx_entry entries[0]; +}; + +struct dx_frame { + struct buffer_head *bh; + struct dx_entry *entries; + struct dx_entry *at; +}; + +struct dx_map_entry { + u32 hash; + u16 offs; + u16 size; +}; + +struct dx_tail { + u32 dt_reserved; + __le32 dt_checksum; +}; + +struct ext4_renament { + struct inode *dir; + struct dentry *dentry; + struct inode *inode; + bool is_dir; + int dir_nlink_delta; + struct buffer_head *bh; + struct ext4_dir_entry_2 *de; + int inlined; + struct buffer_head *dir_bh; + struct ext4_dir_entry_2 *parent_de; + int dir_inlined; +}; + +enum bio_post_read_step { + STEP_INITIAL = 0, + STEP_DECRYPT = 1, + STEP_VERITY = 2, + STEP_MAX = 3, +}; + +struct bio_post_read_ctx { + struct bio *bio; + struct work_struct work; + unsigned int cur_step; + unsigned int enabled_steps; +}; + +enum { + BLOCK_BITMAP = 0, + INODE_BITMAP = 1, + INODE_TABLE = 2, + GROUP_TABLE_COUNT = 3, +}; + +struct ext4_rcu_ptr { + struct callback_head rcu; + void *ptr; +}; + +struct ext4_new_flex_group_data { + struct ext4_new_group_data *groups; + __u16 *bg_flags; + ext4_group_t count; +}; + +enum stat_group { + STAT_READ = 0, + STAT_WRITE = 1, + STAT_DISCARD = 2, + STAT_FLUSH = 3, + NR_STAT_GROUPS = 4, +}; + +enum { + I_DATA_SEM_NORMAL = 0, + I_DATA_SEM_OTHER = 1, + I_DATA_SEM_QUOTA = 2, +}; + +struct ext4_lazy_init { + long unsigned int li_state; + struct list_head li_request_list; + struct mutex li_list_mtx; +}; + +struct ext4_journal_cb_entry { + struct list_head jce_list; + void (*jce_func)(struct super_block *, struct ext4_journal_cb_entry *, int); +}; + +struct trace_event_raw_ext4_other_inode_update_time { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t orig_ino; + uid_t uid; + gid_t gid; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_free_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + uid_t uid; + gid_t gid; + __u64 blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_request_inode { + struct trace_entry ent; + dev_t dev; + ino_t dir; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_allocate_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t dir; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_evict_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int nlink; + char __data[0]; +}; + +struct trace_event_raw_ext4_drop_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int drop; + char __data[0]; +}; + +struct trace_event_raw_ext4_nfs_commit_metadata { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_ext4_mark_inode_dirty { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int ip; + char __data[0]; +}; + +struct trace_event_raw_ext4_begin_ordered_truncate { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t new_size; + char __data[0]; +}; + +struct trace_event_raw_ext4__write_begin { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int len; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4__write_end { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int len; + unsigned int copied; + char __data[0]; +}; + +struct trace_event_raw_ext4_writepages { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long int nr_to_write; + long int pages_skipped; + loff_t range_start; + loff_t range_end; + long unsigned int writeback_index; + int sync_mode; + char for_kupdate; + char range_cyclic; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_write_pages { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int first_page; + long int nr_to_write; + int sync_mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_write_pages_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 lblk; + __u32 len; + __u32 flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_writepages_result { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + int pages_written; + long int pages_skipped; + long unsigned int writeback_index; + int sync_mode; + char __data[0]; +}; + +struct trace_event_raw_ext4__page_op { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int index; + char __data[0]; +}; + +struct trace_event_raw_ext4_invalidatepage_op { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int index; + unsigned int offset; + unsigned int length; + char __data[0]; +}; + +struct trace_event_raw_ext4_discard_blocks { + struct trace_entry ent; + dev_t dev; + __u64 blk; + __u64 count; + char __data[0]; +}; + +struct trace_event_raw_ext4__mb_new_pa { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 pa_pstart; + __u64 pa_lstart; + __u32 pa_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_release_inode_pa { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + __u32 count; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_release_group_pa { + struct trace_entry ent; + dev_t dev; + __u64 pa_pstart; + __u32 pa_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_discard_preallocations { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int len; + unsigned int needed; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_discard_preallocations { + struct trace_entry ent; + dev_t dev; + int needed; + char __data[0]; +}; + +struct trace_event_raw_ext4_request_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int len; + __u32 logical; + __u32 lleft; + __u32 lright; + __u64 goal; + __u64 pleft; + __u64 pright; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_allocate_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + unsigned int len; + __u32 logical; + __u32 lleft; + __u32 lright; + __u64 goal; + __u64 pleft; + __u64 pright; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_free_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + long unsigned int count; + int flags; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_file_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t parent; + int datasync; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_file_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_fs { + struct trace_entry ent; + dev_t dev; + int wait; + char __data[0]; +}; + +struct trace_event_raw_ext4_alloc_da_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int data_blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4_mballoc_alloc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u32 orig_logical; + int orig_start; + __u32 orig_group; + int orig_len; + __u32 goal_logical; + int goal_start; + __u32 goal_group; + int goal_len; + __u32 result_logical; + int result_start; + __u32 result_group; + int result_len; + __u16 found; + __u16 groups; + __u16 buddy; + __u16 flags; + __u16 tail; + __u8 cr; + char __data[0]; +}; + +struct trace_event_raw_ext4_mballoc_prealloc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u32 orig_logical; + int orig_start; + __u32 orig_group; + int orig_len; + __u32 result_logical; + int result_start; + __u32 result_group; + int result_len; + char __data[0]; +}; + +struct trace_event_raw_ext4__mballoc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int result_start; + __u32 result_group; + int result_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_forget { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + int is_metadata; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_update_reserve_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int used_blocks; + int reserved_data_blocks; + int quota_claim; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_reserve_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int reserved_data_blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_release_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int freed_blocks; + int reserved_data_blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4__bitmap_load { + struct trace_entry ent; + dev_t dev; + __u32 group; + char __data[0]; +}; + +struct trace_event_raw_ext4_read_block_bitmap_load { + struct trace_entry ent; + dev_t dev; + __u32 group; + bool prefetch; + char __data[0]; +}; + +struct trace_event_raw_ext4__fallocate_mode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + int mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_fallocate_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int blocks; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_unlink_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t parent; + loff_t size; + char __data[0]; +}; + +struct trace_event_raw_ext4_unlink_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4__truncate { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_convert_to_initialized_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t m_lblk; + unsigned int m_len; + ext4_lblk_t u_lblk; + unsigned int u_len; + ext4_fsblk_t u_pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_convert_to_initialized_fastpath { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t m_lblk; + unsigned int m_len; + ext4_lblk_t u_lblk; + unsigned int u_len; + ext4_fsblk_t u_pblk; + ext4_lblk_t i_lblk; + unsigned int i_len; + ext4_fsblk_t i_pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4__map_blocks_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + unsigned int len; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4__map_blocks_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int flags; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + unsigned int len; + unsigned int mflags; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_load_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_load_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start { + struct trace_entry ent; + dev_t dev; + long unsigned int ip; + int blocks; + int rsv_blocks; + int revoke_creds; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_reserved { + struct trace_entry ent; + dev_t dev; + long unsigned int ip; + int blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4__trim { + struct trace_entry ent; + int dev_major; + int dev_minor; + __u32 group; + int start; + int len; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_handle_unwritten_extents { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int flags; + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + unsigned int len; + unsigned int allocated; + ext4_fsblk_t newblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_get_implied_cluster_alloc_exit { + struct trace_entry ent; + dev_t dev; + unsigned int flags; + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + unsigned int len; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_show_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + short unsigned int len; + char __data[0]; +}; + +struct trace_event_raw_ext4_remove_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t from; + ext4_lblk_t to; + ext4_fsblk_t ee_pblk; + ext4_lblk_t ee_lblk; + short unsigned int ee_len; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_rm_leaf { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t ee_lblk; + ext4_fsblk_t ee_pblk; + short int ee_len; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_rm_idx { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_remove_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t end; + int depth; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_remove_space_done { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t end; + int depth; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + short unsigned int eh_entries; + char __data[0]; +}; + +struct trace_event_raw_ext4__es_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_remove_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t lblk; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_find_extent_range_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_find_extent_range_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_lookup_extent_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_lookup_extent_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + int found; + char __data[0]; +}; + +struct trace_event_raw_ext4__es_shrink_enter { + struct trace_entry ent; + dev_t dev; + int nr_to_scan; + int cache_cnt; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_shrink_scan_exit { + struct trace_entry ent; + dev_t dev; + int nr_shrunk; + int cache_cnt; + char __data[0]; +}; + +struct trace_event_raw_ext4_collapse_range { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_insert_range { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_shrink { + struct trace_entry ent; + dev_t dev; + int nr_shrunk; + long long unsigned int scan_time; + int nr_skipped; + int retried; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_insert_delayed_block { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + bool allocated; + char __data[0]; +}; + +struct trace_event_raw_ext4_fsmap_class { + struct trace_entry ent; + dev_t dev; + dev_t keydev; + u32 agno; + u64 bno; + u64 len; + u64 owner; + char __data[0]; +}; + +struct trace_event_raw_ext4_getfsmap_class { + struct trace_entry ent; + dev_t dev; + dev_t keydev; + u64 block; + u64 len; + u64 owner; + u64 flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_shutdown { + struct trace_entry ent; + dev_t dev; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_error { + struct trace_entry ent; + dev_t dev; + const char *function; + unsigned int line; + char __data[0]; +}; + +struct trace_event_raw_ext4_prefetch_bitmaps { + struct trace_entry ent; + dev_t dev; + __u32 group; + __u32 next; + __u32 ios; + char __data[0]; +}; + +struct trace_event_raw_ext4_lazy_itable_init { + struct trace_entry ent; + dev_t dev; + __u32 group; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_replay_scan { + struct trace_entry ent; + dev_t dev; + int error; + int off; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_replay { + struct trace_entry ent; + dev_t dev; + int tag; + int ino; + int priv1; + int priv2; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_commit_start { + struct trace_entry ent; + dev_t dev; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_commit_stop { + struct trace_entry ent; + dev_t dev; + int nblks; + int reason; + int num_fc; + int num_fc_ineligible; + int nblks_agg; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_stats { + struct trace_entry ent; + dev_t dev; + struct ext4_sb_info *sbi; + int count; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_create { + struct trace_entry ent; + dev_t dev; + int ino; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_link { + struct trace_entry ent; + dev_t dev; + int ino; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_unlink { + struct trace_entry ent; + dev_t dev; + int ino; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_inode { + struct trace_entry ent; + dev_t dev; + int ino; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_range { + struct trace_entry ent; + dev_t dev; + int ino; + long int start; + long int end; + int error; + char __data[0]; +}; + +struct trace_event_data_offsets_ext4_other_inode_update_time {}; + +struct trace_event_data_offsets_ext4_free_inode {}; + +struct trace_event_data_offsets_ext4_request_inode {}; + +struct trace_event_data_offsets_ext4_allocate_inode {}; + +struct trace_event_data_offsets_ext4_evict_inode {}; + +struct trace_event_data_offsets_ext4_drop_inode {}; + +struct trace_event_data_offsets_ext4_nfs_commit_metadata {}; + +struct trace_event_data_offsets_ext4_mark_inode_dirty {}; + +struct trace_event_data_offsets_ext4_begin_ordered_truncate {}; + +struct trace_event_data_offsets_ext4__write_begin {}; + +struct trace_event_data_offsets_ext4__write_end {}; + +struct trace_event_data_offsets_ext4_writepages {}; + +struct trace_event_data_offsets_ext4_da_write_pages {}; + +struct trace_event_data_offsets_ext4_da_write_pages_extent {}; + +struct trace_event_data_offsets_ext4_writepages_result {}; + +struct trace_event_data_offsets_ext4__page_op {}; + +struct trace_event_data_offsets_ext4_invalidatepage_op {}; + +struct trace_event_data_offsets_ext4_discard_blocks {}; + +struct trace_event_data_offsets_ext4__mb_new_pa {}; + +struct trace_event_data_offsets_ext4_mb_release_inode_pa {}; + +struct trace_event_data_offsets_ext4_mb_release_group_pa {}; + +struct trace_event_data_offsets_ext4_discard_preallocations {}; + +struct trace_event_data_offsets_ext4_mb_discard_preallocations {}; + +struct trace_event_data_offsets_ext4_request_blocks {}; + +struct trace_event_data_offsets_ext4_allocate_blocks {}; + +struct trace_event_data_offsets_ext4_free_blocks {}; + +struct trace_event_data_offsets_ext4_sync_file_enter {}; + +struct trace_event_data_offsets_ext4_sync_file_exit {}; + +struct trace_event_data_offsets_ext4_sync_fs {}; + +struct trace_event_data_offsets_ext4_alloc_da_blocks {}; + +struct trace_event_data_offsets_ext4_mballoc_alloc {}; + +struct trace_event_data_offsets_ext4_mballoc_prealloc {}; + +struct trace_event_data_offsets_ext4__mballoc {}; + +struct trace_event_data_offsets_ext4_forget {}; + +struct trace_event_data_offsets_ext4_da_update_reserve_space {}; + +struct trace_event_data_offsets_ext4_da_reserve_space {}; + +struct trace_event_data_offsets_ext4_da_release_space {}; + +struct trace_event_data_offsets_ext4__bitmap_load {}; + +struct trace_event_data_offsets_ext4_read_block_bitmap_load {}; + +struct trace_event_data_offsets_ext4__fallocate_mode {}; + +struct trace_event_data_offsets_ext4_fallocate_exit {}; + +struct trace_event_data_offsets_ext4_unlink_enter {}; + +struct trace_event_data_offsets_ext4_unlink_exit {}; + +struct trace_event_data_offsets_ext4__truncate {}; + +struct trace_event_data_offsets_ext4_ext_convert_to_initialized_enter {}; + +struct trace_event_data_offsets_ext4_ext_convert_to_initialized_fastpath {}; + +struct trace_event_data_offsets_ext4__map_blocks_enter {}; + +struct trace_event_data_offsets_ext4__map_blocks_exit {}; + +struct trace_event_data_offsets_ext4_ext_load_extent {}; + +struct trace_event_data_offsets_ext4_load_inode {}; + +struct trace_event_data_offsets_ext4_journal_start {}; + +struct trace_event_data_offsets_ext4_journal_start_reserved {}; + +struct trace_event_data_offsets_ext4__trim {}; + +struct trace_event_data_offsets_ext4_ext_handle_unwritten_extents {}; + +struct trace_event_data_offsets_ext4_get_implied_cluster_alloc_exit {}; + +struct trace_event_data_offsets_ext4_ext_show_extent {}; + +struct trace_event_data_offsets_ext4_remove_blocks {}; + +struct trace_event_data_offsets_ext4_ext_rm_leaf {}; + +struct trace_event_data_offsets_ext4_ext_rm_idx {}; + +struct trace_event_data_offsets_ext4_ext_remove_space {}; + +struct trace_event_data_offsets_ext4_ext_remove_space_done {}; + +struct trace_event_data_offsets_ext4__es_extent {}; + +struct trace_event_data_offsets_ext4_es_remove_extent {}; + +struct trace_event_data_offsets_ext4_es_find_extent_range_enter {}; + +struct trace_event_data_offsets_ext4_es_find_extent_range_exit {}; + +struct trace_event_data_offsets_ext4_es_lookup_extent_enter {}; + +struct trace_event_data_offsets_ext4_es_lookup_extent_exit {}; + +struct trace_event_data_offsets_ext4__es_shrink_enter {}; + +struct trace_event_data_offsets_ext4_es_shrink_scan_exit {}; + +struct trace_event_data_offsets_ext4_collapse_range {}; + +struct trace_event_data_offsets_ext4_insert_range {}; + +struct trace_event_data_offsets_ext4_es_shrink {}; + +struct trace_event_data_offsets_ext4_es_insert_delayed_block {}; + +struct trace_event_data_offsets_ext4_fsmap_class {}; + +struct trace_event_data_offsets_ext4_getfsmap_class {}; + +struct trace_event_data_offsets_ext4_shutdown {}; + +struct trace_event_data_offsets_ext4_error {}; + +struct trace_event_data_offsets_ext4_prefetch_bitmaps {}; + +struct trace_event_data_offsets_ext4_lazy_itable_init {}; + +struct trace_event_data_offsets_ext4_fc_replay_scan {}; + +struct trace_event_data_offsets_ext4_fc_replay {}; + +struct trace_event_data_offsets_ext4_fc_commit_start {}; + +struct trace_event_data_offsets_ext4_fc_commit_stop {}; + +struct trace_event_data_offsets_ext4_fc_stats {}; + +struct trace_event_data_offsets_ext4_fc_track_create {}; + +struct trace_event_data_offsets_ext4_fc_track_link {}; + +struct trace_event_data_offsets_ext4_fc_track_unlink {}; + +struct trace_event_data_offsets_ext4_fc_track_inode {}; + +struct trace_event_data_offsets_ext4_fc_track_range {}; + +typedef void (*btf_trace_ext4_other_inode_update_time)(void *, struct inode *, ino_t); + +typedef void (*btf_trace_ext4_free_inode)(void *, struct inode *); + +typedef void (*btf_trace_ext4_request_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_allocate_inode)(void *, struct inode *, struct inode *, int); + +typedef void (*btf_trace_ext4_evict_inode)(void *, struct inode *); + +typedef void (*btf_trace_ext4_drop_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_nfs_commit_metadata)(void *, struct inode *); + +typedef void (*btf_trace_ext4_mark_inode_dirty)(void *, struct inode *, long unsigned int); + +typedef void (*btf_trace_ext4_begin_ordered_truncate)(void *, struct inode *, loff_t); + +typedef void (*btf_trace_ext4_write_begin)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_da_write_begin)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_journalled_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_da_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_writepages)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_ext4_da_write_pages)(void *, struct inode *, long unsigned int, struct writeback_control *); + +typedef void (*btf_trace_ext4_da_write_pages_extent)(void *, struct inode *, struct ext4_map_blocks *); + +typedef void (*btf_trace_ext4_writepages_result)(void *, struct inode *, struct writeback_control *, int, int); + +typedef void (*btf_trace_ext4_writepage)(void *, struct page *); + +typedef void (*btf_trace_ext4_readpage)(void *, struct page *); + +typedef void (*btf_trace_ext4_releasepage)(void *, struct page *); + +typedef void (*btf_trace_ext4_invalidatepage)(void *, struct page *, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_journalled_invalidatepage)(void *, struct page *, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_discard_blocks)(void *, struct super_block *, long long unsigned int, long long unsigned int); + +typedef void (*btf_trace_ext4_mb_new_inode_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_mb_new_group_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_mb_release_inode_pa)(void *, struct ext4_prealloc_space *, long long unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_mb_release_group_pa)(void *, struct super_block *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_discard_preallocations)(void *, struct inode *, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_mb_discard_preallocations)(void *, struct super_block *, int); + +typedef void (*btf_trace_ext4_request_blocks)(void *, struct ext4_allocation_request *); + +typedef void (*btf_trace_ext4_allocate_blocks)(void *, struct ext4_allocation_request *, long long unsigned int); + +typedef void (*btf_trace_ext4_free_blocks)(void *, struct inode *, __u64, long unsigned int, int); + +typedef void (*btf_trace_ext4_sync_file_enter)(void *, struct file *, int); + +typedef void (*btf_trace_ext4_sync_file_exit)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_sync_fs)(void *, struct super_block *, int); + +typedef void (*btf_trace_ext4_alloc_da_blocks)(void *, struct inode *); + +typedef void (*btf_trace_ext4_mballoc_alloc)(void *, struct ext4_allocation_context *); + +typedef void (*btf_trace_ext4_mballoc_prealloc)(void *, struct ext4_allocation_context *); + +typedef void (*btf_trace_ext4_mballoc_discard)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_mballoc_free)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_forget)(void *, struct inode *, int, __u64); + +typedef void (*btf_trace_ext4_da_update_reserve_space)(void *, struct inode *, int, int); + +typedef void (*btf_trace_ext4_da_reserve_space)(void *, struct inode *); + +typedef void (*btf_trace_ext4_da_release_space)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_mb_bitmap_load)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_mb_buddy_bitmap_load)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_load_inode_bitmap)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_read_block_bitmap_load)(void *, struct super_block *, long unsigned int, bool); + +typedef void (*btf_trace_ext4_fallocate_enter)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_punch_hole)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_zero_range)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_fallocate_exit)(void *, struct inode *, loff_t, unsigned int, int); + +typedef void (*btf_trace_ext4_unlink_enter)(void *, struct inode *, struct dentry *); + +typedef void (*btf_trace_ext4_unlink_exit)(void *, struct dentry *, int); + +typedef void (*btf_trace_ext4_truncate_enter)(void *, struct inode *); + +typedef void (*btf_trace_ext4_truncate_exit)(void *, struct inode *); + +typedef void (*btf_trace_ext4_ext_convert_to_initialized_enter)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *); + +typedef void (*btf_trace_ext4_ext_convert_to_initialized_fastpath)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *, struct ext4_extent *); + +typedef void (*btf_trace_ext4_ext_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_ind_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_ext_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ind_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ext_load_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_load_inode)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_journal_start)(void *, struct super_block *, int, int, int, long unsigned int); + +typedef void (*btf_trace_ext4_journal_start_reserved)(void *, struct super_block *, int, long unsigned int); + +typedef void (*btf_trace_ext4_trim_extent)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_trim_all_free)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_ext_handle_unwritten_extents)(void *, struct inode *, struct ext4_map_blocks *, int, unsigned int, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_get_implied_cluster_alloc_exit)(void *, struct super_block *, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ext_show_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t, short unsigned int); + +typedef void (*btf_trace_ext4_remove_blocks)(void *, struct inode *, struct ext4_extent *, ext4_lblk_t, ext4_fsblk_t, struct partial_cluster *); + +typedef void (*btf_trace_ext4_ext_rm_leaf)(void *, struct inode *, ext4_lblk_t, struct ext4_extent *, struct partial_cluster *); + +typedef void (*btf_trace_ext4_ext_rm_idx)(void *, struct inode *, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_ext_remove_space)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int); + +typedef void (*btf_trace_ext4_ext_remove_space_done)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int, struct partial_cluster *, __le16); + +typedef void (*btf_trace_ext4_es_insert_extent)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_cache_extent)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_remove_extent)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_find_extent_range_enter)(void *, struct inode *, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_find_extent_range_exit)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_lookup_extent_enter)(void *, struct inode *, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_lookup_extent_exit)(void *, struct inode *, struct extent_status *, int); + +typedef void (*btf_trace_ext4_es_shrink_count)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_es_shrink_scan_enter)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_es_shrink_scan_exit)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_collapse_range)(void *, struct inode *, loff_t, loff_t); + +typedef void (*btf_trace_ext4_insert_range)(void *, struct inode *, loff_t, loff_t); + +typedef void (*btf_trace_ext4_es_shrink)(void *, struct super_block *, int, u64, int, int); + +typedef void (*btf_trace_ext4_es_insert_delayed_block)(void *, struct inode *, struct extent_status *, bool); + +typedef void (*btf_trace_ext4_fsmap_low_key)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_fsmap_high_key)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_fsmap_mapping)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_getfsmap_low_key)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_getfsmap_high_key)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_getfsmap_mapping)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_shutdown)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_error)(void *, struct super_block *, const char *, unsigned int); + +typedef void (*btf_trace_ext4_prefetch_bitmaps)(void *, struct super_block *, ext4_group_t, ext4_group_t, unsigned int); + +typedef void (*btf_trace_ext4_lazy_itable_init)(void *, struct super_block *, ext4_group_t); + +typedef void (*btf_trace_ext4_fc_replay_scan)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_fc_replay)(void *, struct super_block *, int, int, int, int); + +typedef void (*btf_trace_ext4_fc_commit_start)(void *, struct super_block *); + +typedef void (*btf_trace_ext4_fc_commit_stop)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_fc_stats)(void *, struct super_block *); + +typedef void (*btf_trace_ext4_fc_track_create)(void *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_link)(void *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_unlink)(void *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_fc_track_range)(void *, struct inode *, long int, long int, int); + +struct ext4_err_translation { + int code; + int errno; +}; + +enum { + Opt_bsd_df = 0, + Opt_minix_df = 1, + Opt_grpid = 2, + Opt_nogrpid = 3, + Opt_resgid = 4, + Opt_resuid = 5, + Opt_sb = 6, + Opt_err_cont = 7, + Opt_err_panic = 8, + Opt_err_ro = 9, + Opt_nouid32 = 10, + Opt_debug = 11, + Opt_removed = 12, + Opt_user_xattr = 13, + Opt_nouser_xattr = 14, + Opt_acl = 15, + Opt_noacl = 16, + Opt_auto_da_alloc = 17, + Opt_noauto_da_alloc = 18, + Opt_noload = 19, + Opt_commit = 20, + Opt_min_batch_time = 21, + Opt_max_batch_time = 22, + Opt_journal_dev = 23, + Opt_journal_path = 24, + Opt_journal_checksum = 25, + Opt_journal_async_commit = 26, + Opt_abort = 27, + Opt_data_journal = 28, + Opt_data_ordered = 29, + Opt_data_writeback = 30, + Opt_data_err_abort = 31, + Opt_data_err_ignore = 32, + Opt_test_dummy_encryption = 33, + Opt_inlinecrypt = 34, + Opt_usrjquota = 35, + Opt_grpjquota = 36, + Opt_offusrjquota = 37, + Opt_offgrpjquota = 38, + Opt_jqfmt_vfsold = 39, + Opt_jqfmt_vfsv0 = 40, + Opt_jqfmt_vfsv1 = 41, + Opt_quota = 42, + Opt_noquota = 43, + Opt_barrier = 44, + Opt_nobarrier = 45, + Opt_err___2 = 46, + Opt_usrquota = 47, + Opt_grpquota = 48, + Opt_prjquota = 49, + Opt_i_version = 50, + Opt_dax = 51, + Opt_dax_always = 52, + Opt_dax_inode = 53, + Opt_dax_never = 54, + Opt_stripe = 55, + Opt_delalloc = 56, + Opt_nodelalloc = 57, + Opt_warn_on_error = 58, + Opt_nowarn_on_error = 59, + Opt_mblk_io_submit = 60, + Opt_lazytime = 61, + Opt_nolazytime = 62, + Opt_debug_want_extra_isize = 63, + Opt_nomblk_io_submit = 64, + Opt_block_validity = 65, + Opt_noblock_validity = 66, + Opt_inode_readahead_blks = 67, + Opt_journal_ioprio = 68, + Opt_dioread_nolock = 69, + Opt_dioread_lock = 70, + Opt_discard = 71, + Opt_nodiscard = 72, + Opt_init_itable = 73, + Opt_noinit_itable = 74, + Opt_max_dir_size_kb = 75, + Opt_nojournal_checksum = 76, + Opt_nombcache = 77, + Opt_no_prefetch_block_bitmaps = 78, + Opt_mb_optimize_scan = 79, +}; + +struct mount_opts { + int token; + int mount_opt; + int flags; +}; + +struct ext4_sb_encodings { + __u16 magic; + char *name; + char *version; +}; + +struct ext4_parsed_options { + long unsigned int journal_devnum; + unsigned int journal_ioprio; + int mb_optimize_scan; +}; + +struct ext4_mount_options { + long unsigned int s_mount_opt; + long unsigned int s_mount_opt2; + kuid_t s_resuid; + kgid_t s_resgid; + long unsigned int s_commit_interval; + u32 s_min_batch_time; + u32 s_max_batch_time; + int s_jquota_fmt; + char *s_qf_names[3]; +}; + +enum { + attr_noop = 0, + attr_delayed_allocation_blocks = 1, + attr_session_write_kbytes = 2, + attr_lifetime_write_kbytes = 3, + attr_reserved_clusters = 4, + attr_sra_exceeded_retry_limit = 5, + attr_inode_readahead = 6, + attr_trigger_test_error = 7, + attr_first_error_time = 8, + attr_last_error_time = 9, + attr_feature = 10, + attr_pointer_ui = 11, + attr_pointer_ul = 12, + attr_pointer_u64 = 13, + attr_pointer_u8 = 14, + attr_pointer_string = 15, + attr_pointer_atomic = 16, + attr_journal_task = 17, +}; + +enum { + ptr_explicit = 0, + ptr_ext4_sb_info_offset = 1, + ptr_ext4_super_block_offset = 2, +}; + +struct ext4_attr { + struct attribute attr; + short int attr_id; + short int attr_ptr; + short unsigned int attr_size; + union { + int offset; + void *explicit_ptr; + } u; +}; + +struct ext4_xattr_header { + __le32 h_magic; + __le32 h_refcount; + __le32 h_blocks; + __le32 h_hash; + __le32 h_checksum; + __u32 h_reserved[3]; +}; + +struct ext4_xattr_block_find { + struct ext4_xattr_search s; + struct buffer_head *bh; +}; + +struct ext4_fc_tl { + __le16 fc_tag; + __le16 fc_len; +}; + +struct ext4_fc_head { + __le32 fc_features; + __le32 fc_tid; +}; + +struct ext4_fc_add_range { + __le32 fc_ino; + __u8 fc_ex[12]; +}; + +struct ext4_fc_del_range { + __le32 fc_ino; + __le32 fc_lblk; + __le32 fc_len; +}; + +struct ext4_fc_dentry_info { + __le32 fc_parent_ino; + __le32 fc_ino; + __u8 fc_dname[0]; +}; + +struct ext4_fc_inode { + __le32 fc_ino; + __u8 fc_raw_inode[0]; +}; + +struct ext4_fc_tail { + __le32 fc_tid; + __le32 fc_crc; +}; + +struct ext4_fc_dentry_update { + int fcd_op; + int fcd_parent; + int fcd_ino; + struct qstr fcd_name; + unsigned char fcd_iname[32]; + struct list_head fcd_list; +}; + +struct __track_dentry_update_args { + struct dentry *dentry; + int op; +}; + +struct __track_range_args { + ext4_lblk_t start; + ext4_lblk_t end; +}; + +struct dentry_info_args { + int parent_ino; + int dname_len; + int ino; + int inode_len; + char *dname; +}; + +struct ext4_orphan_block_tail { + __le32 ob_magic; + __le32 ob_checksum; +}; + +typedef struct { + __le16 e_tag; + __le16 e_perm; + __le32 e_id; +} ext4_acl_entry; + +typedef struct { + __le32 a_version; +} ext4_acl_header; + +struct commit_header { + __be32 h_magic; + __be32 h_blocktype; + __be32 h_sequence; + unsigned char h_chksum_type; + unsigned char h_chksum_size; + unsigned char h_padding[2]; + __be32 h_chksum[8]; + __be64 h_commit_sec; + __be32 h_commit_nsec; +}; + +struct journal_block_tag3_s { + __be32 t_blocknr; + __be32 t_flags; + __be32 t_blocknr_high; + __be32 t_checksum; +}; + +typedef struct journal_block_tag3_s journal_block_tag3_t; + +struct journal_block_tag_s { + __be32 t_blocknr; + __be16 t_checksum; + __be16 t_flags; + __be32 t_blocknr_high; +}; + +typedef struct journal_block_tag_s journal_block_tag_t; + +struct jbd2_journal_block_tail { + __be32 t_checksum; +}; + +struct jbd2_journal_revoke_header_s { + journal_header_t r_header; + __be32 r_count; +}; + +typedef struct jbd2_journal_revoke_header_s jbd2_journal_revoke_header_t; + +struct recovery_info { + tid_t start_transaction; + tid_t end_transaction; + int nr_replays; + int nr_revokes; + int nr_revoke_hits; +}; + +struct jbd2_revoke_table_s { + int hash_size; + int hash_shift; + struct list_head *hash_table; +}; + +struct jbd2_revoke_record_s { + struct list_head hash; + tid_t sequence; + long long unsigned int blocknr; +}; + +struct trace_event_raw_jbd2_checkpoint { + struct trace_entry ent; + dev_t dev; + int result; + char __data[0]; +}; + +struct trace_event_raw_jbd2_commit { + struct trace_entry ent; + dev_t dev; + char sync_commit; + int transaction; + char __data[0]; +}; + +struct trace_event_raw_jbd2_end_commit { + struct trace_entry ent; + dev_t dev; + char sync_commit; + int transaction; + int head; + char __data[0]; +}; + +struct trace_event_raw_jbd2_submit_inode_data { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_start_class { + struct trace_entry ent; + dev_t dev; + long unsigned int tid; + unsigned int type; + unsigned int line_no; + int requested_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_extend { + struct trace_entry ent; + dev_t dev; + long unsigned int tid; + unsigned int type; + unsigned int line_no; + int buffer_credits; + int requested_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_stats { + struct trace_entry ent; + dev_t dev; + long unsigned int tid; + unsigned int type; + unsigned int line_no; + int interval; + int sync; + int requested_blocks; + int dirtied_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_run_stats { + struct trace_entry ent; + dev_t dev; + long unsigned int tid; + long unsigned int wait; + long unsigned int request_delay; + long unsigned int running; + long unsigned int locked; + long unsigned int flushing; + long unsigned int logging; + __u32 handle_count; + __u32 blocks; + __u32 blocks_logged; + char __data[0]; +}; + +struct trace_event_raw_jbd2_checkpoint_stats { + struct trace_entry ent; + dev_t dev; + long unsigned int tid; + long unsigned int chp_time; + __u32 forced_to_close; + __u32 written; + __u32 dropped; + char __data[0]; +}; + +struct trace_event_raw_jbd2_update_log_tail { + struct trace_entry ent; + dev_t dev; + tid_t tail_sequence; + tid_t first_tid; + long unsigned int block_nr; + long unsigned int freed; + char __data[0]; +}; + +struct trace_event_raw_jbd2_write_superblock { + struct trace_entry ent; + dev_t dev; + int write_op; + char __data[0]; +}; + +struct trace_event_raw_jbd2_lock_buffer_stall { + struct trace_entry ent; + dev_t dev; + long unsigned int stall_ms; + char __data[0]; +}; + +struct trace_event_raw_jbd2_journal_shrink { + struct trace_entry ent; + dev_t dev; + long unsigned int nr_to_scan; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_jbd2_shrink_scan_exit { + struct trace_entry ent; + dev_t dev; + long unsigned int nr_to_scan; + long unsigned int nr_shrunk; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_jbd2_shrink_checkpoint_list { + struct trace_entry ent; + dev_t dev; + tid_t first_tid; + tid_t tid; + tid_t last_tid; + long unsigned int nr_freed; + long unsigned int nr_scanned; + tid_t next_tid; + char __data[0]; +}; + +struct trace_event_data_offsets_jbd2_checkpoint {}; + +struct trace_event_data_offsets_jbd2_commit {}; + +struct trace_event_data_offsets_jbd2_end_commit {}; + +struct trace_event_data_offsets_jbd2_submit_inode_data {}; + +struct trace_event_data_offsets_jbd2_handle_start_class {}; + +struct trace_event_data_offsets_jbd2_handle_extend {}; + +struct trace_event_data_offsets_jbd2_handle_stats {}; + +struct trace_event_data_offsets_jbd2_run_stats {}; + +struct trace_event_data_offsets_jbd2_checkpoint_stats {}; + +struct trace_event_data_offsets_jbd2_update_log_tail {}; + +struct trace_event_data_offsets_jbd2_write_superblock {}; + +struct trace_event_data_offsets_jbd2_lock_buffer_stall {}; + +struct trace_event_data_offsets_jbd2_journal_shrink {}; + +struct trace_event_data_offsets_jbd2_shrink_scan_exit {}; + +struct trace_event_data_offsets_jbd2_shrink_checkpoint_list {}; + +typedef void (*btf_trace_jbd2_checkpoint)(void *, journal_t *, int); + +typedef void (*btf_trace_jbd2_start_commit)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_locking)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_flushing)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_logging)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_drop_transaction)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_end_commit)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_submit_inode_data)(void *, struct inode *); + +typedef void (*btf_trace_jbd2_handle_start)(void *, dev_t, long unsigned int, unsigned int, unsigned int, int); + +typedef void (*btf_trace_jbd2_handle_restart)(void *, dev_t, long unsigned int, unsigned int, unsigned int, int); + +typedef void (*btf_trace_jbd2_handle_extend)(void *, dev_t, long unsigned int, unsigned int, unsigned int, int, int); + +typedef void (*btf_trace_jbd2_handle_stats)(void *, dev_t, long unsigned int, unsigned int, unsigned int, int, int, int, int); + +typedef void (*btf_trace_jbd2_run_stats)(void *, dev_t, long unsigned int, struct transaction_run_stats_s *); + +typedef void (*btf_trace_jbd2_checkpoint_stats)(void *, dev_t, long unsigned int, struct transaction_chp_stats_s *); + +typedef void (*btf_trace_jbd2_update_log_tail)(void *, journal_t *, tid_t, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_write_superblock)(void *, journal_t *, int); + +typedef void (*btf_trace_jbd2_lock_buffer_stall)(void *, dev_t, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_count)(void *, journal_t *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_scan_enter)(void *, journal_t *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_scan_exit)(void *, journal_t *, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_checkpoint_list)(void *, journal_t *, tid_t, tid_t, tid_t, long unsigned int, long unsigned int, tid_t); + +struct jbd2_stats_proc_session { + journal_t *journal; + struct transaction_stats_s *stats; + int start; + int max; +}; + +struct meta_entry { + u64 data_block; + unsigned int index_block; + short unsigned int offset; + short unsigned int pad; +}; + +struct meta_index { + unsigned int inode_number; + unsigned int offset; + short unsigned int entries; + short unsigned int skip; + short unsigned int locked; + short unsigned int pad; + struct meta_entry meta_entry[127]; +}; + +struct squashfs_cache_entry; + +struct squashfs_cache { + char *name; + int entries; + int curr_blk; + int next_blk; + int num_waiters; + int unused; + int block_size; + int pages; + spinlock_t lock; + wait_queue_head_t wait_queue; + struct squashfs_cache_entry *entry; +}; + +struct squashfs_page_actor; + +struct squashfs_cache_entry { + u64 block; + int length; + int refcount; + u64 next_index; + int pending; + int error; + int num_waiters; + wait_queue_head_t wait_queue; + struct squashfs_cache *cache; + void **data; + struct squashfs_page_actor *actor; +}; + +struct squashfs_page_actor { + union { + void **buffer; + struct page **page; + }; + void *pageaddr; + void * (*squashfs_first_page)(struct squashfs_page_actor *); + void * (*squashfs_next_page)(struct squashfs_page_actor *); + void (*squashfs_finish_page)(struct squashfs_page_actor *); + int pages; + int length; + int next_page; +}; + +struct squashfs_decompressor; + +struct squashfs_stream; + +struct squashfs_sb_info { + const struct squashfs_decompressor *decompressor; + int devblksize; + int devblksize_log2; + struct squashfs_cache *block_cache; + struct squashfs_cache *fragment_cache; + struct squashfs_cache *read_page; + int next_meta_index; + __le64 *id_table; + __le64 *fragment_index; + __le64 *xattr_id_table; + struct mutex meta_index_mutex; + struct meta_index *meta_index; + struct squashfs_stream *stream; + __le64 *inode_lookup_table; + u64 inode_table; + u64 directory_table; + u64 xattr_table; + unsigned int block_size; + short unsigned int block_log; + long long int bytes_used; + unsigned int inodes; + unsigned int fragments; + int xattr_ids; + unsigned int ids; + bool panic_on_errors; +}; + +struct squashfs_decompressor { + void * (*init)(struct squashfs_sb_info *, void *); + void * (*comp_opts)(struct squashfs_sb_info *, void *, int); + void (*free)(void *); + int (*decompress)(struct squashfs_sb_info *, void *, struct bio *, int, int, struct squashfs_page_actor *); + int id; + char *name; + int supported; +}; + +struct squashfs_dir_index { + __le32 index; + __le32 start_block; + __le32 size; + unsigned char name[0]; +}; + +struct squashfs_dir_entry { + __le16 offset; + __le16 inode_number; + __le16 type; + __le16 size; + char name[0]; +}; + +struct squashfs_dir_header { + __le32 count; + __le32 start_block; + __le32 inode_number; +}; + +struct squashfs_inode_info { + u64 start; + int offset; + u64 xattr; + unsigned int xattr_size; + int xattr_count; + union { + struct { + u64 fragment_block; + int fragment_size; + int fragment_offset; + u64 block_list_start; + }; + struct { + u64 dir_idx_start; + int dir_idx_offset; + int dir_idx_cnt; + int parent; + }; + }; + struct inode vfs_inode; +}; + +struct squashfs_fragment_entry { + __le64 start_block; + __le32 size; + unsigned int unused; +}; + +struct squashfs_base_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; +}; + +struct squashfs_ipc_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; + __le32 nlink; +}; + +struct squashfs_lipc_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; + __le32 nlink; + __le32 xattr; +}; + +struct squashfs_dev_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; + __le32 nlink; + __le32 rdev; +}; + +struct squashfs_ldev_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; + __le32 nlink; + __le32 rdev; + __le32 xattr; +}; + +struct squashfs_symlink_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; + __le32 nlink; + __le32 symlink_size; + char symlink[0]; +}; + +struct squashfs_reg_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; + __le32 start_block; + __le32 fragment; + __le32 offset; + __le32 file_size; + __le16 block_list[0]; +}; + +struct squashfs_lreg_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; + __le64 start_block; + __le64 file_size; + __le64 sparse; + __le32 nlink; + __le32 fragment; + __le32 offset; + __le32 xattr; + __le16 block_list[0]; +}; + +struct squashfs_dir_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; + __le32 start_block; + __le32 nlink; + __le16 file_size; + __le16 offset; + __le32 parent_inode; +}; + +struct squashfs_ldir_inode { + __le16 inode_type; + __le16 mode; + __le16 uid; + __le16 guid; + __le32 mtime; + __le32 inode_number; + __le32 nlink; + __le32 file_size; + __le32 start_block; + __le32 parent_inode; + __le16 i_count; + __le16 offset; + __le32 xattr; + struct squashfs_dir_index index[0]; +}; + +union squashfs_inode { + struct squashfs_base_inode base; + struct squashfs_dev_inode dev; + struct squashfs_ldev_inode ldev; + struct squashfs_symlink_inode symlink; + struct squashfs_reg_inode reg; + struct squashfs_lreg_inode lreg; + struct squashfs_dir_inode dir; + struct squashfs_ldir_inode ldir; + struct squashfs_ipc_inode ipc; + struct squashfs_lipc_inode lipc; +}; + +struct squashfs_super_block { + __le32 s_magic; + __le32 inodes; + __le32 mkfs_time; + __le32 block_size; + __le32 fragments; + __le16 compression; + __le16 block_log; + __le16 flags; + __le16 no_ids; + __le16 s_major; + __le16 s_minor; + __le64 root_inode; + __le64 bytes_used; + __le64 id_table_start; + __le64 xattr_id_table_start; + __le64 inode_table_start; + __le64 directory_table_start; + __le64 fragment_table_start; + __le64 lookup_table_start; +}; + +enum Opt_errors { + Opt_errors_continue = 0, + Opt_errors_panic = 1, +}; + +enum squashfs_param { + Opt_errors = 0, +}; + +struct squashfs_mount_opts { + enum Opt_errors errors; +}; + +struct squashfs_stream { + void *stream; + struct mutex mutex; +}; + +struct squashfs_xattr_entry { + __le16 type; + __le16 size; + char data[0]; +}; + +struct squashfs_xattr_val { + __le32 vsize; + char value[0]; +}; + +struct squashfs_xattr_id { + __le64 xattr; + __le32 count; + __le32 size; +}; + +struct squashfs_xattr_id_table { + __le64 xattr_table_start; + __le32 xattr_ids; + __le32 unused; +}; + +struct lz4_comp_opts { + __le32 version; + __le32 flags; +}; + +struct squashfs_lz4 { + void *input; + void *output; +}; + +struct squashfs_lzo { + void *input; + void *output; +}; + +enum xz_mode { + XZ_SINGLE = 0, + XZ_PREALLOC = 1, + XZ_DYNALLOC = 2, +}; + +enum xz_ret { + XZ_OK = 0, + XZ_STREAM_END = 1, + XZ_UNSUPPORTED_CHECK = 2, + XZ_MEM_ERROR = 3, + XZ_MEMLIMIT_ERROR = 4, + XZ_FORMAT_ERROR = 5, + XZ_OPTIONS_ERROR = 6, + XZ_DATA_ERROR = 7, + XZ_BUF_ERROR = 8, +}; + +struct xz_buf { + const uint8_t *in; + size_t in_pos; + size_t in_size; + uint8_t *out; + size_t out_pos; + size_t out_size; +}; + +struct xz_dec; + +struct squashfs_xz { + struct xz_dec *state; + struct xz_buf buf; +}; + +struct disk_comp_opts { + __le32 dictionary_size; + __le32 flags; +}; + +struct comp_opts { + int dict_size; +}; + +typedef unsigned char Byte; + +typedef long unsigned int uLong; + +struct internal_state; + +struct z_stream_s { + const Byte *next_in; + uLong avail_in; + uLong total_in; + Byte *next_out; + uLong avail_out; + uLong total_out; + char *msg; + struct internal_state *state; + void *workspace; + int data_type; + uLong adler; + uLong reserved; +}; + +struct internal_state { + int dummy; +}; + +typedef struct z_stream_s z_stream; + +typedef z_stream *z_streamp; + +typedef enum { + ZSTD_error_no_error = 0, + ZSTD_error_GENERIC = 1, + ZSTD_error_prefix_unknown = 10, + ZSTD_error_version_unsupported = 12, + ZSTD_error_frameParameter_unsupported = 14, + ZSTD_error_frameParameter_windowTooLarge = 16, + ZSTD_error_corruption_detected = 20, + ZSTD_error_checksum_wrong = 22, + ZSTD_error_dictionary_corrupted = 30, + ZSTD_error_dictionary_wrong = 32, + ZSTD_error_dictionaryCreation_failed = 34, + ZSTD_error_parameter_unsupported = 40, + ZSTD_error_parameter_outOfBound = 42, + ZSTD_error_tableLog_tooLarge = 44, + ZSTD_error_maxSymbolValue_tooLarge = 46, + ZSTD_error_maxSymbolValue_tooSmall = 48, + ZSTD_error_stage_wrong = 60, + ZSTD_error_init_missing = 62, + ZSTD_error_memory_allocation = 64, + ZSTD_error_workSpace_tooSmall = 66, + ZSTD_error_dstSize_tooSmall = 70, + ZSTD_error_srcSize_wrong = 72, + ZSTD_error_dstBuffer_null = 74, + ZSTD_error_frameIndex_tooLarge = 100, + ZSTD_error_seekableIO = 102, + ZSTD_error_dstBuffer_wrong = 104, + ZSTD_error_srcBuffer_wrong = 105, + ZSTD_error_maxCode = 120, +} ZSTD_ErrorCode; + +struct ZSTD_DCtx_s; + +typedef struct ZSTD_DCtx_s ZSTD_DCtx; + +struct ZSTD_inBuffer_s { + const void *src; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_inBuffer_s ZSTD_inBuffer; + +struct ZSTD_outBuffer_s { + void *dst; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_outBuffer_s ZSTD_outBuffer; + +typedef ZSTD_DCtx ZSTD_DStream; + +typedef void * (*ZSTD_allocFunction)(void *, size_t); + +typedef void (*ZSTD_freeFunction)(void *, void *); + +typedef struct { + ZSTD_allocFunction customAlloc; + ZSTD_freeFunction customFree; + void *opaque; +} ZSTD_customMem; + +typedef ZSTD_ErrorCode zstd_error_code; + +typedef ZSTD_inBuffer zstd_in_buffer; + +typedef ZSTD_outBuffer zstd_out_buffer; + +typedef ZSTD_DStream zstd_dstream; + +struct workspace { + void *mem; + size_t mem_size; + size_t window_size; +}; + +struct ramfs_mount_opts { + umode_t mode; +}; + +struct ramfs_fs_info { + struct ramfs_mount_opts mount_opts; +}; + +enum ramfs_param { + Opt_mode___3 = 0, +}; + +enum hugetlbfs_size_type { + NO_SIZE = 0, + SIZE_STD = 1, + SIZE_PERCENT = 2, +}; + +struct hugetlbfs_fs_context { + struct hstate *hstate; + long long unsigned int max_size_opt; + long long unsigned int min_size_opt; + long int max_hpages; + long int nr_inodes; + long int min_hpages; + enum hugetlbfs_size_type max_val_type; + enum hugetlbfs_size_type min_val_type; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +enum hugetlb_param { + Opt_gid___4 = 0, + Opt_min_size = 1, + Opt_mode___4 = 2, + Opt_nr_inodes___2 = 3, + Opt_pagesize = 4, + Opt_size___2 = 5, + Opt_uid___3 = 6, +}; + +typedef u16 wchar_t; + +struct nls_table { + const char *charset; + const char *alias; + int (*uni2char)(wchar_t, unsigned char *, int); + int (*char2uni)(const unsigned char *, int, wchar_t *); + const unsigned char *charset2lower; + const unsigned char *charset2upper; + struct module *owner; + struct nls_table *next; +}; + +struct fat_mount_options { + kuid_t fs_uid; + kgid_t fs_gid; + short unsigned int fs_fmask; + short unsigned int fs_dmask; + short unsigned int codepage; + int time_offset; + char *iocharset; + short unsigned int shortname; + unsigned char name_check; + unsigned char errors; + unsigned char nfs; + short unsigned int allow_utime; + unsigned int quiet: 1; + unsigned int showexec: 1; + unsigned int sys_immutable: 1; + unsigned int dotsOK: 1; + unsigned int isvfat: 1; + unsigned int utf8: 1; + unsigned int unicode_xlate: 1; + unsigned int numtail: 1; + unsigned int flush: 1; + unsigned int nocase: 1; + unsigned int usefree: 1; + unsigned int tz_set: 1; + unsigned int rodir: 1; + unsigned int discard: 1; + unsigned int dos1xfloppy: 1; +}; + +struct fatent_operations; + +struct msdos_sb_info { + short unsigned int sec_per_clus; + short unsigned int cluster_bits; + unsigned int cluster_size; + unsigned char fats; + unsigned char fat_bits; + short unsigned int fat_start; + long unsigned int fat_length; + long unsigned int dir_start; + short unsigned int dir_entries; + long unsigned int data_start; + long unsigned int max_cluster; + long unsigned int root_cluster; + long unsigned int fsinfo_sector; + struct mutex fat_lock; + struct mutex nfs_build_inode_lock; + struct mutex s_lock; + unsigned int prev_free; + unsigned int free_clusters; + unsigned int free_clus_valid; + struct fat_mount_options options; + struct nls_table *nls_disk; + struct nls_table *nls_io; + const void *dir_ops; + int dir_per_block; + int dir_per_block_bits; + unsigned int vol_id; + int fatent_shift; + const struct fatent_operations *fatent_ops; + struct inode *fat_inode; + struct inode *fsinfo_inode; + struct ratelimit_state ratelimit; + spinlock_t inode_hash_lock; + struct hlist_head inode_hashtable[256]; + spinlock_t dir_hash_lock; + struct hlist_head dir_hashtable[256]; + unsigned int dirty; + struct callback_head rcu; +}; + +struct fat_entry; + +struct fatent_operations { + void (*ent_blocknr)(struct super_block *, int, int *, sector_t *); + void (*ent_set_ptr)(struct fat_entry *, int); + int (*ent_bread)(struct super_block *, struct fat_entry *, int, sector_t); + int (*ent_get)(struct fat_entry *); + void (*ent_put)(struct fat_entry *, int); + int (*ent_next)(struct fat_entry *); +}; + +struct msdos_inode_info { + spinlock_t cache_lru_lock; + struct list_head cache_lru; + int nr_caches; + unsigned int cache_valid_id; + loff_t mmu_private; + int i_start; + int i_logstart; + int i_attrs; + loff_t i_pos; + struct hlist_node i_fat_hash; + struct hlist_node i_dir_hash; + struct rw_semaphore truncate_lock; + struct inode vfs_inode; +}; + +struct fat_entry { + int entry; + union { + u8 *ent12_p[2]; + __le16 *ent16_p; + __le32 *ent32_p; + } u; + int nr_bhs; + struct buffer_head *bhs[2]; + struct inode *fat_inode; +}; + +struct fat_cache { + struct list_head cache_list; + int nr_contig; + int fcluster; + int dcluster; +}; + +struct fat_cache_id { + unsigned int id; + int nr_contig; + int fcluster; + int dcluster; +}; + +struct compat_dirent { + u32 d_ino; + compat_off_t d_off; + u16 d_reclen; + char d_name[256]; +}; + +enum utf16_endian { + UTF16_HOST_ENDIAN = 0, + UTF16_LITTLE_ENDIAN = 1, + UTF16_BIG_ENDIAN = 2, +}; + +struct __fat_dirent { + long int d_ino; + __kernel_off_t d_off; + short unsigned int d_reclen; + char d_name[256]; +}; + +struct msdos_dir_entry { + __u8 name[11]; + __u8 attr; + __u8 lcase; + __u8 ctime_cs; + __le16 ctime; + __le16 cdate; + __le16 adate; + __le16 starthi; + __le16 time; + __le16 date; + __le16 start; + __le32 size; +}; + +struct msdos_dir_slot { + __u8 id; + __u8 name0_4[10]; + __u8 attr; + __u8 reserved; + __u8 alias_checksum; + __u8 name5_10[12]; + __le16 start; + __u8 name11_12[4]; +}; + +struct fat_slot_info { + loff_t i_pos; + loff_t slot_off; + int nr_slots; + struct msdos_dir_entry *de; + struct buffer_head *bh; +}; + +typedef long long unsigned int llu; + +enum { + PARSE_INVALID = 1, + PARSE_NOT_LONGNAME = 2, + PARSE_EOF = 3, +}; + +struct fat_ioctl_filldir_callback { + struct dir_context ctx; + void *dirent; + int result; + const char *longname; + int long_len; + const char *shortname; + int short_len; +}; + +struct fatent_ra { + sector_t cur; + sector_t limit; + unsigned int ra_blocks; + sector_t ra_advance; + sector_t ra_next; + sector_t ra_limit; +}; + +struct fat_boot_sector { + __u8 ignored[3]; + __u8 system_id[8]; + __u8 sector_size[2]; + __u8 sec_per_clus; + __le16 reserved; + __u8 fats; + __u8 dir_entries[2]; + __u8 sectors[2]; + __u8 media; + __le16 fat_length; + __le16 secs_track; + __le16 heads; + __le32 hidden; + __le32 total_sect; + union { + struct { + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat16; + struct { + __le32 length; + __le16 flags; + __u8 version[2]; + __le32 root_cluster; + __le16 info_sector; + __le16 backup_boot; + __le16 reserved2[6]; + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat32; + }; +}; + +struct fat_boot_fsinfo { + __le32 signature1; + __le32 reserved1[120]; + __le32 signature2; + __le32 free_clusters; + __le32 next_cluster; + __le32 reserved2[4]; +}; + +struct fat_bios_param_block { + u16 fat_sector_size; + u8 fat_sec_per_clus; + u16 fat_reserved; + u8 fat_fats; + u16 fat_dir_entries; + u16 fat_sectors; + u16 fat_fat_length; + u32 fat_total_sect; + u8 fat16_state; + u32 fat16_vol_id; + u32 fat32_length; + u32 fat32_root_cluster; + u16 fat32_info_sector; + u8 fat32_state; + u32 fat32_vol_id; +}; + +struct fat_floppy_defaults { + unsigned int nr_sectors; + unsigned int sec_per_clus; + unsigned int dir_entries; + unsigned int media; + unsigned int fat_length; +}; + +enum { + Opt_check_n = 0, + Opt_check_r = 1, + Opt_check_s = 2, + Opt_uid___4 = 3, + Opt_gid___5 = 4, + Opt_umask = 5, + Opt_dmask = 6, + Opt_fmask = 7, + Opt_allow_utime = 8, + Opt_codepage = 9, + Opt_usefree = 10, + Opt_nocase = 11, + Opt_quiet = 12, + Opt_showexec = 13, + Opt_debug___2 = 14, + Opt_immutable = 15, + Opt_dots = 16, + Opt_nodots = 17, + Opt_charset = 18, + Opt_shortname_lower = 19, + Opt_shortname_win95 = 20, + Opt_shortname_winnt = 21, + Opt_shortname_mixed = 22, + Opt_utf8_no = 23, + Opt_utf8_yes = 24, + Opt_uni_xl_no = 25, + Opt_uni_xl_yes = 26, + Opt_nonumtail_no = 27, + Opt_nonumtail_yes = 28, + Opt_obsolete = 29, + Opt_flush = 30, + Opt_tz_utc = 31, + Opt_rodir = 32, + Opt_err_cont___2 = 33, + Opt_err_panic___2 = 34, + Opt_err_ro___2 = 35, + Opt_discard___2 = 36, + Opt_nfs = 37, + Opt_time_offset = 38, + Opt_nfs_stale_rw = 39, + Opt_nfs_nostale_ro = 40, + Opt_err___3 = 41, + Opt_dos1xfloppy = 42, +}; + +struct fat_fid { + u32 i_gen; + u32 i_pos_low; + u16 i_pos_hi; + u16 parent_i_pos_hi; + u32 parent_i_pos_low; + u32 parent_i_gen; +}; + +struct shortname_info { + unsigned char lower: 1; + unsigned char upper: 1; + unsigned char valid: 1; +}; + +struct ecryptfs_mount_crypt_stat; + +struct ecryptfs_crypt_stat { + u32 flags; + unsigned int file_version; + size_t iv_bytes; + size_t metadata_size; + size_t extent_size; + size_t key_size; + size_t extent_shift; + unsigned int extent_mask; + struct ecryptfs_mount_crypt_stat *mount_crypt_stat; + struct crypto_skcipher *tfm; + struct crypto_shash *hash_tfm; + unsigned char cipher[32]; + unsigned char key[64]; + unsigned char root_iv[16]; + struct list_head keysig_list; + struct mutex keysig_list_mutex; + struct mutex cs_tfm_mutex; + struct mutex cs_mutex; +}; + +struct ecryptfs_mount_crypt_stat { + u32 flags; + struct list_head global_auth_tok_list; + struct mutex global_auth_tok_list_mutex; + size_t global_default_cipher_key_size; + size_t global_default_fn_cipher_key_bytes; + unsigned char global_default_cipher_name[32]; + unsigned char global_default_fn_cipher_name[32]; + char global_default_fnek_sig[17]; +}; + +struct ecryptfs_inode_info { + struct inode vfs_inode; + struct inode *wii_inode; + struct mutex lower_file_mutex; + atomic_t lower_file_count; + struct file *lower_file; + struct ecryptfs_crypt_stat crypt_stat; +}; + +struct ecryptfs_dentry_info { + struct path lower_path; + struct callback_head rcu; +}; + +struct ecryptfs_sb_info { + struct super_block *wsi_sb; + struct ecryptfs_mount_crypt_stat mount_crypt_stat; +}; + +struct ecryptfs_file_info { + struct file *wfi_file; + struct ecryptfs_crypt_stat *crypt_stat; +}; + +struct ecryptfs_getdents_callback { + struct dir_context ctx; + struct dir_context *caller; + struct super_block *sb; + int filldir_called; + int entries_written; +}; + +struct ecryptfs_session_key { + u32 flags; + u32 encrypted_key_size; + u32 decrypted_key_size; + u8 encrypted_key[512]; + u8 decrypted_key[64]; +}; + +struct ecryptfs_password { + u32 password_bytes; + s32 hash_algo; + u32 hash_iterations; + u32 session_key_encryption_key_bytes; + u32 flags; + u8 session_key_encryption_key[64]; + u8 signature[17]; + u8 salt[8]; +}; + +struct ecryptfs_private_key { + u32 key_size; + u32 data_len; + u8 signature[17]; + char pki_type[17]; + u8 data[0]; +}; + +struct ecryptfs_auth_tok { + u16 version; + u16 token_type; + u32 flags; + struct ecryptfs_session_key session_key; + u8 reserved[32]; + union { + struct ecryptfs_password password; + struct ecryptfs_private_key private_key; + } token; +}; + +struct ecryptfs_global_auth_tok { + u32 flags; + struct list_head mount_crypt_stat_list; + struct key *global_auth_tok_key; + unsigned char sig[17]; +}; + +struct ecryptfs_key_tfm { + struct crypto_skcipher *key_tfm; + size_t key_size; + struct mutex key_tfm_mutex; + struct list_head key_tfm_list; + unsigned char cipher_name[32]; +}; + +enum { + ecryptfs_opt_sig = 0, + ecryptfs_opt_ecryptfs_sig = 1, + ecryptfs_opt_cipher = 2, + ecryptfs_opt_ecryptfs_cipher = 3, + ecryptfs_opt_ecryptfs_key_bytes = 4, + ecryptfs_opt_passthrough = 5, + ecryptfs_opt_xattr_metadata = 6, + ecryptfs_opt_encrypted_view = 7, + ecryptfs_opt_fnek_sig = 8, + ecryptfs_opt_fn_cipher = 9, + ecryptfs_opt_fn_cipher_key_bytes = 10, + ecryptfs_opt_unlink_sigs = 11, + ecryptfs_opt_mount_auth_tok_only = 12, + ecryptfs_opt_check_dev_ruid = 13, + ecryptfs_opt_err = 14, +}; + +struct ecryptfs_cache_info { + struct kmem_cache **cache; + const char *name; + size_t size; + slab_flags_t flags; + void (*ctor)(void *); +}; + +struct ecryptfs_key_sig { + struct list_head crypt_stat_list; + char keysig[17]; +}; + +struct ecryptfs_filename { + struct list_head crypt_stat_list; + u32 flags; + u32 seq_no; + char *filename; + char *encrypted_filename; + size_t filename_size; + size_t encrypted_filename_size; + char fnek_sig[16]; + char dentry_name[57]; +}; + +struct extent_crypt_result { + struct completion completion; + int rc; +}; + +struct ecryptfs_flag_map_elem { + u32 file_flag; + u32 local_flag; +}; + +struct ecryptfs_cipher_code_str_map_elem { + char cipher_str[16]; + u8 cipher_code; +}; + +struct encrypted_key_payload { + struct callback_head rcu; + char *format; + char *master_desc; + char *datalen; + u8 *iv; + u8 *encrypted_data; + short unsigned int datablob_len; + short unsigned int decrypted_datalen; + short unsigned int payload_datalen; + short unsigned int encrypted_key_format; + u8 *decrypted_data; + u8 payload_data[0]; +}; + +enum ecryptfs_token_types { + ECRYPTFS_PASSWORD = 0, + ECRYPTFS_PRIVATE_KEY = 1, +}; + +struct ecryptfs_key_record { + unsigned char type; + size_t enc_key_size; + unsigned char sig[8]; + unsigned char enc_key[512]; +}; + +struct ecryptfs_auth_tok_list_item { + unsigned char encrypted_session_key[64]; + struct list_head list; + struct ecryptfs_auth_tok auth_tok; +}; + +struct ecryptfs_message { + u32 index; + u32 data_len; + u8 data[0]; +}; + +struct ecryptfs_msg_ctx { + u8 state; + u8 type; + u32 index; + u32 counter; + size_t msg_size; + struct ecryptfs_message *msg; + struct task_struct *task; + struct list_head node; + struct list_head daemon_out_list; + struct mutex mux; +}; + +struct ecryptfs_write_tag_70_packet_silly_stack { + u8 cipher_code; + size_t max_packet_size; + size_t packet_size_len; + size_t block_aligned_filename_size; + size_t block_size; + size_t i; + size_t j; + size_t num_rand_bytes; + struct mutex *tfm_mutex; + char *block_aligned_filename; + struct ecryptfs_auth_tok *auth_tok; + struct scatterlist src_sg[2]; + struct scatterlist dst_sg[2]; + struct crypto_skcipher *skcipher_tfm; + struct skcipher_request *skcipher_req; + char iv[16]; + char hash[16]; + char tmp_hash[16]; + struct crypto_shash *hash_tfm; + struct shash_desc *hash_desc; +}; + +struct ecryptfs_parse_tag_70_packet_silly_stack { + u8 cipher_code; + size_t max_packet_size; + size_t packet_size_len; + size_t parsed_tag_70_packet_size; + size_t block_aligned_filename_size; + size_t block_size; + size_t i; + struct mutex *tfm_mutex; + char *decrypted_filename; + struct ecryptfs_auth_tok *auth_tok; + struct scatterlist src_sg[2]; + struct scatterlist dst_sg[2]; + struct crypto_skcipher *skcipher_tfm; + struct skcipher_request *skcipher_req; + char fnek_sig_hex[17]; + char iv[16]; + char cipher_string[32]; +}; + +struct ecryptfs_open_req { + struct file **lower_file; + struct path path; + struct completion done; + struct list_head kthread_ctl_list; +}; + +struct ecryptfs_kthread_ctl { + u32 flags; + struct mutex mux; + struct list_head req_list; + wait_queue_head_t wait; +}; + +struct ecryptfs_daemon { + u32 flags; + u32 num_queued_msg_ctx; + struct file *file; + struct mutex mux; + struct list_head msg_ctx_out_queue; + wait_queue_head_t wait; + struct hlist_node euid_chain; +}; + +struct getdents_callback___2 { + struct dir_context ctx; + char *name; + u64 ino; + int found; + int sequence; +}; + +typedef u32 unicode_t; + +struct utf8_table { + int cmask; + int cval; + int shift; + long int lmask; + long int lval; +}; + +struct utf8data; + +struct utf8cursor { + const struct utf8data *data; + const char *s; + const char *p; + const char *ss; + const char *sp; + unsigned int len; + unsigned int slen; + short int ccc; + short int nccc; + unsigned char hangul[12]; +}; + +struct utf8data { + unsigned int maxage; + unsigned int offset; +}; + +typedef const unsigned char utf8trie_t; + +typedef const unsigned char utf8leaf_t; + +enum fuse_opcode { + FUSE_LOOKUP = 1, + FUSE_FORGET = 2, + FUSE_GETATTR = 3, + FUSE_SETATTR = 4, + FUSE_READLINK = 5, + FUSE_SYMLINK = 6, + FUSE_MKNOD = 8, + FUSE_MKDIR = 9, + FUSE_UNLINK = 10, + FUSE_RMDIR = 11, + FUSE_RENAME = 12, + FUSE_LINK = 13, + FUSE_OPEN = 14, + FUSE_READ = 15, + FUSE_WRITE = 16, + FUSE_STATFS = 17, + FUSE_RELEASE = 18, + FUSE_FSYNC = 20, + FUSE_SETXATTR = 21, + FUSE_GETXATTR = 22, + FUSE_LISTXATTR = 23, + FUSE_REMOVEXATTR = 24, + FUSE_FLUSH = 25, + FUSE_INIT = 26, + FUSE_OPENDIR = 27, + FUSE_READDIR = 28, + FUSE_RELEASEDIR = 29, + FUSE_FSYNCDIR = 30, + FUSE_GETLK = 31, + FUSE_SETLK = 32, + FUSE_SETLKW = 33, + FUSE_ACCESS = 34, + FUSE_CREATE = 35, + FUSE_INTERRUPT = 36, + FUSE_BMAP = 37, + FUSE_DESTROY = 38, + FUSE_IOCTL = 39, + FUSE_POLL = 40, + FUSE_NOTIFY_REPLY = 41, + FUSE_BATCH_FORGET = 42, + FUSE_FALLOCATE = 43, + FUSE_READDIRPLUS = 44, + FUSE_RENAME2 = 45, + FUSE_LSEEK = 46, + FUSE_COPY_FILE_RANGE = 47, + FUSE_SETUPMAPPING = 48, + FUSE_REMOVEMAPPING = 49, + FUSE_SYNCFS = 50, + CUSE_INIT = 4096, + CUSE_INIT_BSWAP_RESERVED = 1048576, + FUSE_INIT_BSWAP_RESERVED = 436207616, +}; + +enum fuse_notify_code { + FUSE_NOTIFY_POLL = 1, + FUSE_NOTIFY_INVAL_INODE = 2, + FUSE_NOTIFY_INVAL_ENTRY = 3, + FUSE_NOTIFY_STORE = 4, + FUSE_NOTIFY_RETRIEVE = 5, + FUSE_NOTIFY_DELETE = 6, + FUSE_NOTIFY_CODE_MAX = 7, +}; + +struct fuse_forget_in { + uint64_t nlookup; +}; + +struct fuse_forget_one { + uint64_t nodeid; + uint64_t nlookup; +}; + +struct fuse_batch_forget_in { + uint32_t count; + uint32_t dummy; +}; + +struct fuse_interrupt_in { + uint64_t unique; +}; + +struct fuse_notify_poll_wakeup_out { + uint64_t kh; +}; + +struct fuse_in_header { + uint32_t len; + uint32_t opcode; + uint64_t unique; + uint64_t nodeid; + uint32_t uid; + uint32_t gid; + uint32_t pid; + uint32_t padding; +}; + +struct fuse_out_header { + uint32_t len; + int32_t error; + uint64_t unique; +}; + +struct fuse_notify_inval_inode_out { + uint64_t ino; + int64_t off; + int64_t len; +}; + +struct fuse_notify_inval_entry_out { + uint64_t parent; + uint32_t namelen; + uint32_t padding; +}; + +struct fuse_notify_delete_out { + uint64_t parent; + uint64_t child; + uint32_t namelen; + uint32_t padding; +}; + +struct fuse_notify_store_out { + uint64_t nodeid; + uint64_t offset; + uint32_t size; + uint32_t padding; +}; + +struct fuse_notify_retrieve_out { + uint64_t notify_unique; + uint64_t nodeid; + uint64_t offset; + uint32_t size; + uint32_t padding; +}; + +struct fuse_notify_retrieve_in { + uint64_t dummy1; + uint64_t offset; + uint32_t size; + uint32_t dummy2; + uint64_t dummy3; + uint64_t dummy4; +}; + +struct fuse_forget_link { + struct fuse_forget_one forget_one; + struct fuse_forget_link *next; +}; + +struct fuse_mount; + +struct fuse_release_args; + +struct fuse_file { + struct fuse_mount *fm; + struct fuse_release_args *release_args; + u64 kh; + u64 fh; + u64 nodeid; + refcount_t count; + u32 open_flags; + struct list_head write_entry; + struct { + struct mutex lock; + loff_t pos; + loff_t cache_off; + u64 version; + } readdir; + struct rb_node polled_node; + wait_queue_head_t poll_wait; + bool flock: 1; +}; + +struct fuse_conn; + +struct fuse_mount { + struct fuse_conn *fc; + struct super_block *sb; + struct list_head fc_entry; +}; + +struct fuse_in_arg { + unsigned int size; + const void *value; +}; + +struct fuse_arg { + unsigned int size; + void *value; +}; + +struct fuse_page_desc { + unsigned int length; + unsigned int offset; +}; + +struct fuse_args { + uint64_t nodeid; + uint32_t opcode; + short unsigned int in_numargs; + short unsigned int out_numargs; + bool force: 1; + bool noreply: 1; + bool nocreds: 1; + bool in_pages: 1; + bool out_pages: 1; + bool out_argvar: 1; + bool page_zeroing: 1; + bool page_replace: 1; + bool may_block: 1; + struct fuse_in_arg in_args[3]; + struct fuse_arg out_args[2]; + void (*end)(struct fuse_mount *, struct fuse_args *, int); +}; + +struct fuse_args_pages { + struct fuse_args args; + struct page **pages; + struct fuse_page_desc *descs; + unsigned int num_pages; +}; + +enum fuse_req_flag { + FR_ISREPLY = 0, + FR_FORCE = 1, + FR_BACKGROUND = 2, + FR_WAITING = 3, + FR_ABORTED = 4, + FR_INTERRUPTED = 5, + FR_LOCKED = 6, + FR_PENDING = 7, + FR_SENT = 8, + FR_FINISHED = 9, + FR_PRIVATE = 10, + FR_ASYNC = 11, +}; + +struct fuse_req { + struct list_head list; + struct list_head intr_entry; + struct fuse_args *args; + refcount_t count; + long unsigned int flags; + struct { + struct fuse_in_header h; + } in; + struct { + struct fuse_out_header h; + } out; + wait_queue_head_t waitq; + void *argbuf; + struct fuse_mount *fm; +}; + +struct fuse_iqueue; + +struct fuse_iqueue_ops { + void (*wake_forget_and_unlock)(struct fuse_iqueue *); + void (*wake_interrupt_and_unlock)(struct fuse_iqueue *); + void (*wake_pending_and_unlock)(struct fuse_iqueue *); + void (*release)(struct fuse_iqueue *); +}; + +struct fuse_iqueue { + unsigned int connected; + spinlock_t lock; + wait_queue_head_t waitq; + u64 reqctr; + struct list_head pending; + struct list_head interrupts; + struct fuse_forget_link forget_list_head; + struct fuse_forget_link *forget_list_tail; + int forget_batch; + struct fasync_struct *fasync; + const struct fuse_iqueue_ops *ops; + void *priv; +}; + +struct fuse_pqueue { + unsigned int connected; + spinlock_t lock; + struct list_head *processing; + struct list_head io; +}; + +struct fuse_dev { + struct fuse_conn *fc; + struct fuse_pqueue pq; + struct list_head entry; +}; + +struct fuse_conn_dax; + +struct fuse_sync_bucket; + +struct fuse_conn { + spinlock_t lock; + refcount_t count; + atomic_t dev_count; + struct callback_head rcu; + kuid_t user_id; + kgid_t group_id; + struct pid_namespace *pid_ns; + struct user_namespace *user_ns; + unsigned int max_read; + unsigned int max_write; + unsigned int max_pages; + unsigned int max_pages_limit; + struct fuse_iqueue iq; + atomic64_t khctr; + struct rb_root polled_files; + unsigned int max_background; + unsigned int congestion_threshold; + unsigned int num_background; + unsigned int active_background; + struct list_head bg_queue; + spinlock_t bg_lock; + int initialized; + int blocked; + wait_queue_head_t blocked_waitq; + unsigned int connected; + bool aborted; + unsigned int conn_error: 1; + unsigned int conn_init: 1; + unsigned int async_read: 1; + unsigned int abort_err: 1; + unsigned int atomic_o_trunc: 1; + unsigned int export_support: 1; + unsigned int writeback_cache: 1; + unsigned int parallel_dirops: 1; + unsigned int handle_killpriv: 1; + unsigned int cache_symlinks: 1; + unsigned int legacy_opts_show: 1; + unsigned int handle_killpriv_v2: 1; + unsigned int no_open: 1; + unsigned int no_opendir: 1; + unsigned int no_fsync: 1; + unsigned int no_fsyncdir: 1; + unsigned int no_flush: 1; + unsigned int no_setxattr: 1; + unsigned int setxattr_ext: 1; + unsigned int no_getxattr: 1; + unsigned int no_listxattr: 1; + unsigned int no_removexattr: 1; + unsigned int no_lock: 1; + unsigned int no_access: 1; + unsigned int no_create: 1; + unsigned int no_interrupt: 1; + unsigned int no_bmap: 1; + unsigned int no_poll: 1; + unsigned int big_writes: 1; + unsigned int dont_mask: 1; + unsigned int no_flock: 1; + unsigned int no_fallocate: 1; + unsigned int no_rename2: 1; + unsigned int auto_inval_data: 1; + unsigned int explicit_inval_data: 1; + unsigned int do_readdirplus: 1; + unsigned int readdirplus_auto: 1; + unsigned int async_dio: 1; + unsigned int no_lseek: 1; + unsigned int posix_acl: 1; + unsigned int default_permissions: 1; + unsigned int allow_other: 1; + unsigned int no_copy_file_range: 1; + unsigned int destroy: 1; + unsigned int delete_stale: 1; + unsigned int no_control: 1; + unsigned int no_force_umount: 1; + unsigned int auto_submounts: 1; + unsigned int sync_fs: 1; + atomic_t num_waiting; + unsigned int minor; + struct list_head entry; + dev_t dev; + struct dentry *ctl_dentry[5]; + int ctl_ndents; + u32 scramble_key[4]; + atomic64_t attr_version; + void (*release)(struct fuse_conn *); + struct rw_semaphore killsb; + struct list_head devices; + struct fuse_conn_dax *dax; + struct list_head mounts; + struct fuse_sync_bucket *curr_bucket; +}; + +struct fuse_sync_bucket { + atomic_t count; + wait_queue_head_t waitq; + struct callback_head rcu; +}; + +struct fuse_copy_state { + int write; + struct fuse_req *req; + struct iov_iter *iter; + struct pipe_buffer *pipebufs; + struct pipe_buffer *currbuf; + struct pipe_inode_info *pipe; + long unsigned int nr_segs; + struct page *pg; + unsigned int len; + unsigned int offset; + unsigned int move_pages: 1; +}; + +struct fuse_retrieve_args { + struct fuse_args_pages ap; + struct fuse_notify_retrieve_in inarg; +}; + +struct fuse_attr { + uint64_t ino; + uint64_t size; + uint64_t blocks; + uint64_t atime; + uint64_t mtime; + uint64_t ctime; + uint32_t atimensec; + uint32_t mtimensec; + uint32_t ctimensec; + uint32_t mode; + uint32_t nlink; + uint32_t uid; + uint32_t gid; + uint32_t rdev; + uint32_t blksize; + uint32_t flags; +}; + +struct fuse_entry_out { + uint64_t nodeid; + uint64_t generation; + uint64_t entry_valid; + uint64_t attr_valid; + uint32_t entry_valid_nsec; + uint32_t attr_valid_nsec; + struct fuse_attr attr; +}; + +struct fuse_getattr_in { + uint32_t getattr_flags; + uint32_t dummy; + uint64_t fh; +}; + +struct fuse_attr_out { + uint64_t attr_valid; + uint32_t attr_valid_nsec; + uint32_t dummy; + struct fuse_attr attr; +}; + +struct fuse_mknod_in { + uint32_t mode; + uint32_t rdev; + uint32_t umask; + uint32_t padding; +}; + +struct fuse_mkdir_in { + uint32_t mode; + uint32_t umask; +}; + +struct fuse_rename2_in { + uint64_t newdir; + uint32_t flags; + uint32_t padding; +}; + +struct fuse_link_in { + uint64_t oldnodeid; +}; + +struct fuse_setattr_in { + uint32_t valid; + uint32_t padding; + uint64_t fh; + uint64_t size; + uint64_t lock_owner; + uint64_t atime; + uint64_t mtime; + uint64_t ctime; + uint32_t atimensec; + uint32_t mtimensec; + uint32_t ctimensec; + uint32_t mode; + uint32_t unused4; + uint32_t uid; + uint32_t gid; + uint32_t unused5; +}; + +struct fuse_create_in { + uint32_t flags; + uint32_t mode; + uint32_t umask; + uint32_t open_flags; +}; + +struct fuse_open_out { + uint64_t fh; + uint32_t open_flags; + uint32_t padding; +}; + +struct fuse_access_in { + uint32_t mask; + uint32_t padding; +}; + +struct fuse_inode_dax; + +struct fuse_inode { + struct inode inode; + u64 nodeid; + u64 nlookup; + struct fuse_forget_link *forget; + u64 i_time; + u32 inval_mask; + umode_t orig_i_mode; + u64 orig_ino; + u64 attr_version; + union { + struct { + struct list_head write_files; + struct list_head queued_writes; + int writectr; + wait_queue_head_t page_waitq; + struct rb_root writepages; + }; + struct { + bool cached; + loff_t size; + loff_t pos; + u64 version; + struct timespec64 mtime; + u64 iversion; + spinlock_t lock; + } rdc; + }; + long unsigned int state; + struct mutex mutex; + spinlock_t lock; + struct fuse_inode_dax *dax; +}; + +enum { + FUSE_I_ADVISE_RDPLUS = 0, + FUSE_I_INIT_RDPLUS = 1, + FUSE_I_SIZE_UNSTABLE = 2, + FUSE_I_BAD = 3, +}; + +struct fuse_file_lock { + uint64_t start; + uint64_t end; + uint32_t type; + uint32_t pid; +}; + +struct fuse_open_in { + uint32_t flags; + uint32_t open_flags; +}; + +struct fuse_release_in { + uint64_t fh; + uint32_t flags; + uint32_t release_flags; + uint64_t lock_owner; +}; + +struct fuse_flush_in { + uint64_t fh; + uint32_t unused; + uint32_t padding; + uint64_t lock_owner; +}; + +struct fuse_read_in { + uint64_t fh; + uint64_t offset; + uint32_t size; + uint32_t read_flags; + uint64_t lock_owner; + uint32_t flags; + uint32_t padding; +}; + +struct fuse_write_in { + uint64_t fh; + uint64_t offset; + uint32_t size; + uint32_t write_flags; + uint64_t lock_owner; + uint32_t flags; + uint32_t padding; +}; + +struct fuse_write_out { + uint32_t size; + uint32_t padding; +}; + +struct fuse_fsync_in { + uint64_t fh; + uint32_t fsync_flags; + uint32_t padding; +}; + +struct fuse_lk_in { + uint64_t fh; + uint64_t owner; + struct fuse_file_lock lk; + uint32_t lk_flags; + uint32_t padding; +}; + +struct fuse_lk_out { + struct fuse_file_lock lk; +}; + +struct fuse_bmap_in { + uint64_t block; + uint32_t blocksize; + uint32_t padding; +}; + +struct fuse_bmap_out { + uint64_t block; +}; + +struct fuse_poll_in { + uint64_t fh; + uint64_t kh; + uint32_t flags; + uint32_t events; +}; + +struct fuse_poll_out { + uint32_t revents; + uint32_t padding; +}; + +struct fuse_fallocate_in { + uint64_t fh; + uint64_t offset; + uint64_t length; + uint32_t mode; + uint32_t padding; +}; + +struct fuse_lseek_in { + uint64_t fh; + uint64_t offset; + uint32_t whence; + uint32_t padding; +}; + +struct fuse_lseek_out { + uint64_t offset; +}; + +struct fuse_copy_file_range_in { + uint64_t fh_in; + uint64_t off_in; + uint64_t nodeid_out; + uint64_t fh_out; + uint64_t off_out; + uint64_t len; + uint64_t flags; +}; + +struct fuse_release_args { + struct fuse_args args; + struct fuse_release_in inarg; + struct inode *inode; +}; + +struct fuse_io_priv { + struct kref refcnt; + int async; + spinlock_t lock; + unsigned int reqs; + ssize_t bytes; + size_t size; + __u64 offset; + bool write; + bool should_dirty; + int err; + struct kiocb *iocb; + struct completion *done; + bool blocking; +}; + +struct fuse_io_args { + union { + struct { + struct fuse_read_in in; + u64 attr_ver; + } read; + struct { + struct fuse_write_in in; + struct fuse_write_out out; + bool page_locked; + } write; + }; + struct fuse_args_pages ap; + struct fuse_io_priv *io; + struct fuse_file *ff; +}; + +struct fuse_writepage_args { + struct fuse_io_args ia; + struct rb_node writepages_entry; + struct list_head queue_entry; + struct fuse_writepage_args *next; + struct inode *inode; + struct fuse_sync_bucket *bucket; +}; + +struct fuse_fill_wb_data { + struct fuse_writepage_args *wpa; + struct fuse_file *ff; + struct inode *inode; + struct page **orig_pages; + unsigned int max_pages; +}; + +struct fuse_kstatfs { + uint64_t blocks; + uint64_t bfree; + uint64_t bavail; + uint64_t files; + uint64_t ffree; + uint32_t bsize; + uint32_t namelen; + uint32_t frsize; + uint32_t padding; + uint32_t spare[6]; +}; + +struct fuse_statfs_out { + struct fuse_kstatfs st; +}; + +struct fuse_init_in { + uint32_t major; + uint32_t minor; + uint32_t max_readahead; + uint32_t flags; +}; + +struct fuse_init_out { + uint32_t major; + uint32_t minor; + uint32_t max_readahead; + uint32_t flags; + uint16_t max_background; + uint16_t congestion_threshold; + uint32_t max_write; + uint32_t time_gran; + uint16_t max_pages; + uint16_t map_alignment; + uint32_t unused[8]; +}; + +struct fuse_syncfs_in { + uint64_t padding; +}; + +struct fuse_fs_context { + int fd; + struct file *file; + unsigned int rootmode; + kuid_t user_id; + kgid_t group_id; + bool is_bdev: 1; + bool fd_present: 1; + bool rootmode_present: 1; + bool user_id_present: 1; + bool group_id_present: 1; + bool default_permissions: 1; + bool allow_other: 1; + bool destroy: 1; + bool no_control: 1; + bool no_force_umount: 1; + bool legacy_opts_show: 1; + bool dax: 1; + unsigned int max_read; + unsigned int blksize; + const char *subtype; + struct dax_device *dax_dev; + void **fudptr; +}; + +enum { + OPT_SOURCE = 0, + OPT_SUBTYPE = 1, + OPT_FD = 2, + OPT_ROOTMODE = 3, + OPT_USER_ID = 4, + OPT_GROUP_ID = 5, + OPT_DEFAULT_PERMISSIONS = 6, + OPT_ALLOW_OTHER = 7, + OPT_MAX_READ = 8, + OPT_BLKSIZE = 9, + OPT_ERR = 10, +}; + +struct fuse_inode_handle { + u64 nodeid; + u32 generation; +}; + +struct fuse_init_args { + struct fuse_args args; + struct fuse_init_in in; + struct fuse_init_out out; +}; + +struct fuse_setxattr_in { + uint32_t size; + uint32_t flags; + uint32_t setxattr_flags; + uint32_t padding; +}; + +struct fuse_getxattr_in { + uint32_t size; + uint32_t padding; +}; + +struct fuse_getxattr_out { + uint32_t size; + uint32_t padding; +}; + +struct fuse_dirent { + uint64_t ino; + uint64_t off; + uint32_t namelen; + uint32_t type; + char name[0]; +}; + +struct fuse_direntplus { + struct fuse_entry_out entry_out; + struct fuse_dirent dirent; +}; + +enum fuse_parse_result { + FOUND_ERR = 4294967295, + FOUND_NONE = 0, + FOUND_SOME = 1, + FOUND_ALL = 2, +}; + +struct fuse_ioctl_in { + uint64_t fh; + uint32_t flags; + uint32_t cmd; + uint64_t arg; + uint32_t in_size; + uint32_t out_size; +}; + +struct fuse_ioctl_iovec { + uint64_t base; + uint64_t len; +}; + +struct fuse_ioctl_out { + int32_t result; + uint32_t flags; + uint32_t in_iovs; + uint32_t out_iovs; +}; + +struct fuse_setupmapping_in { + uint64_t fh; + uint64_t foffset; + uint64_t len; + uint64_t flags; + uint64_t moffset; +}; + +struct fuse_removemapping_in { + uint32_t count; +}; + +struct fuse_removemapping_one { + uint64_t moffset; + uint64_t len; +}; + +struct fuse_inode_dax { + struct rw_semaphore sem; + struct rb_root_cached tree; + long unsigned int nr; +}; + +struct fuse_conn_dax { + struct dax_device *dev; + spinlock_t lock; + long unsigned int nr_busy_ranges; + struct list_head busy_ranges; + struct delayed_work free_work; + wait_queue_head_t range_waitq; + long int nr_free_ranges; + struct list_head free_ranges; + long unsigned int nr_ranges; +}; + +struct fuse_dax_mapping { + struct inode *inode; + struct list_head list; + struct interval_tree_node itn; + struct list_head busy_list; + u64 window_offset; + loff_t length; + bool writable; + refcount_t refcnt; +}; + +struct debugfs_fsdata { + const struct file_operations *real_fops; + refcount_t active_users; + struct completion active_users_drained; +}; + +struct debugfs_mount_opts { + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +enum { + Opt_uid___5 = 0, + Opt_gid___6 = 1, + Opt_mode___5 = 2, + Opt_err___4 = 3, +}; + +struct debugfs_fs_info { + struct debugfs_mount_opts mount_opts; +}; + +struct debugfs_blob_wrapper { + void *data; + long unsigned int size; +}; + +struct debugfs_reg32 { + char *name; + long unsigned int offset; +}; + +struct debugfs_regset32 { + const struct debugfs_reg32 *regs; + int nregs; + void *base; + struct device *dev; +}; + +struct debugfs_u32_array { + u32 *array; + u32 n_elements; +}; + +struct debugfs_devm_entry { + int (*read)(struct seq_file *, void *); + struct device *dev; +}; + +struct tracefs_dir_ops { + int (*mkdir)(const char *); + int (*rmdir)(const char *); +}; + +struct tracefs_mount_opts { + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +struct tracefs_fs_info { + struct tracefs_mount_opts mount_opts; +}; + +enum pstore_type_id { + PSTORE_TYPE_DMESG = 0, + PSTORE_TYPE_MCE = 1, + PSTORE_TYPE_CONSOLE = 2, + PSTORE_TYPE_FTRACE = 3, + PSTORE_TYPE_PPC_RTAS = 4, + PSTORE_TYPE_PPC_OF = 5, + PSTORE_TYPE_PPC_COMMON = 6, + PSTORE_TYPE_PMSG = 7, + PSTORE_TYPE_PPC_OPAL = 8, + PSTORE_TYPE_MAX = 9, +}; + +struct pstore_info; + +struct pstore_record { + struct pstore_info *psi; + enum pstore_type_id type; + u64 id; + struct timespec64 time; + char *buf; + ssize_t size; + ssize_t ecc_notice_size; + int count; + enum kmsg_dump_reason reason; + unsigned int part; + bool compressed; +}; + +struct pstore_info { + struct module *owner; + const char *name; + struct semaphore buf_lock; + char *buf; + size_t bufsize; + struct mutex read_mutex; + int flags; + int max_reason; + void *data; + int (*open)(struct pstore_info *); + int (*close)(struct pstore_info *); + ssize_t (*read)(struct pstore_record *); + int (*write)(struct pstore_record *); + int (*write_user)(struct pstore_record *, const char *); + int (*erase)(struct pstore_record *); +}; + +struct pstore_ftrace_record { + long unsigned int ip; + long unsigned int parent_ip; + u64 ts; +}; + +struct pstore_private { + struct list_head list; + struct dentry *dentry; + struct pstore_record *record; + size_t total_size; +}; + +struct pstore_ftrace_seq_data { + const void *ptr; + size_t off; + size_t size; +}; + +enum { + Opt_kmsg_bytes = 0, + Opt_err___5 = 1, +}; + +struct crypto_comp { + struct crypto_tfm base; +}; + +struct pstore_zbackend { + int (*zbufsize)(size_t); + const char *name; +}; + +struct efi_variable { + efi_char16_t VariableName[512]; + efi_guid_t VendorGuid; + long unsigned int DataSize; + __u8 Data[1024]; + efi_status_t Status; + __u32 Attributes; +} __attribute__((packed)); + +struct efivar_entry { + struct efi_variable var; + struct list_head list; + struct kobject kobj; + bool scanning; + bool deleting; +}; + +typedef u16 ucs2_char_t; + +typedef s32 compat_key_t; + +typedef u32 __compat_gid32_t; + +struct ipc64_perm { + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; + __kernel_mode_t mode; + unsigned char __pad1[0]; + short unsigned int seq; + short unsigned int __pad2; + __kernel_ulong_t __unused1; + __kernel_ulong_t __unused2; +}; + +struct compat_ipc64_perm { + compat_key_t key; + __compat_uid32_t uid; + __compat_gid32_t gid; + __compat_uid32_t cuid; + __compat_gid32_t cgid; + short unsigned int mode; + short unsigned int __pad1; + short unsigned int seq; + short unsigned int __pad2; + compat_ulong_t unused1; + compat_ulong_t unused2; +}; + +struct compat_ipc_perm { + key_t key; + __compat_uid_t uid; + __compat_gid_t gid; + __compat_uid_t cuid; + __compat_gid_t cgid; + compat_mode_t mode; + short unsigned int seq; +}; + +struct ipc_perm { + __kernel_key_t key; + __kernel_uid_t uid; + __kernel_gid_t gid; + __kernel_uid_t cuid; + __kernel_gid_t cgid; + __kernel_mode_t mode; + short unsigned int seq; +}; + +struct ipc_params { + key_t key; + int flg; + union { + size_t size; + int nsems; + } u; +}; + +struct ipc_ops { + int (*getnew)(struct ipc_namespace *, struct ipc_params *); + int (*associate)(struct kern_ipc_perm *, int); + int (*more_checks)(struct kern_ipc_perm *, struct ipc_params *); +}; + +struct ipc_proc_iface { + const char *path; + const char *header; + int ids; + int (*show)(struct seq_file *, void *); +}; + +struct ipc_proc_iter { + struct ipc_namespace *ns; + struct pid_namespace *pid_ns; + struct ipc_proc_iface *iface; +}; + +struct msg_msgseg; + +struct msg_msg { + struct list_head m_list; + long int m_type; + size_t m_ts; + struct msg_msgseg *next; + void *security; +}; + +struct msg_msgseg { + struct msg_msgseg *next; +}; + +typedef int __kernel_ipc_pid_t; + +typedef __kernel_long_t __kernel_old_time_t; + +struct msgbuf { + __kernel_long_t mtype; + char mtext[1]; +}; + +struct msg; + +struct msqid_ds { + struct ipc_perm msg_perm; + struct msg *msg_first; + struct msg *msg_last; + __kernel_old_time_t msg_stime; + __kernel_old_time_t msg_rtime; + __kernel_old_time_t msg_ctime; + long unsigned int msg_lcbytes; + long unsigned int msg_lqbytes; + short unsigned int msg_cbytes; + short unsigned int msg_qnum; + short unsigned int msg_qbytes; + __kernel_ipc_pid_t msg_lspid; + __kernel_ipc_pid_t msg_lrpid; +}; + +struct msqid64_ds { + struct ipc64_perm msg_perm; + long int msg_stime; + long int msg_rtime; + long int msg_ctime; + long unsigned int msg_cbytes; + long unsigned int msg_qnum; + long unsigned int msg_qbytes; + __kernel_pid_t msg_lspid; + __kernel_pid_t msg_lrpid; + long unsigned int __unused4; + long unsigned int __unused5; +}; + +struct msginfo { + int msgpool; + int msgmap; + int msgmax; + int msgmnb; + int msgmni; + int msgssz; + int msgtql; + short unsigned int msgseg; +}; + +typedef u16 compat_ipc_pid_t; + +struct compat_msqid64_ds { + struct compat_ipc64_perm msg_perm; + compat_ulong_t msg_stime; + compat_ulong_t msg_stime_high; + compat_ulong_t msg_rtime; + compat_ulong_t msg_rtime_high; + compat_ulong_t msg_ctime; + compat_ulong_t msg_ctime_high; + compat_ulong_t msg_cbytes; + compat_ulong_t msg_qnum; + compat_ulong_t msg_qbytes; + compat_pid_t msg_lspid; + compat_pid_t msg_lrpid; + compat_ulong_t __unused4; + compat_ulong_t __unused5; +}; + +struct msg_queue { + struct kern_ipc_perm q_perm; + time64_t q_stime; + time64_t q_rtime; + time64_t q_ctime; + long unsigned int q_cbytes; + long unsigned int q_qnum; + long unsigned int q_qbytes; + struct pid *q_lspid; + struct pid *q_lrpid; + struct list_head q_messages; + struct list_head q_receivers; + struct list_head q_senders; + long: 64; + long: 64; +}; + +struct msg_receiver { + struct list_head r_list; + struct task_struct *r_tsk; + int r_mode; + long int r_msgtype; + long int r_maxsize; + struct msg_msg *r_msg; +}; + +struct msg_sender { + struct list_head list; + struct task_struct *tsk; + size_t msgsz; +}; + +struct compat_msqid_ds { + struct compat_ipc_perm msg_perm; + compat_uptr_t msg_first; + compat_uptr_t msg_last; + old_time32_t msg_stime; + old_time32_t msg_rtime; + old_time32_t msg_ctime; + compat_ulong_t msg_lcbytes; + compat_ulong_t msg_lqbytes; + short unsigned int msg_cbytes; + short unsigned int msg_qnum; + short unsigned int msg_qbytes; + compat_ipc_pid_t msg_lspid; + compat_ipc_pid_t msg_lrpid; +}; + +struct compat_msgbuf { + compat_long_t mtype; + char mtext[1]; +}; + +struct sem; + +struct sem_queue; + +struct sem_undo; + +struct semid_ds { + struct ipc_perm sem_perm; + __kernel_old_time_t sem_otime; + __kernel_old_time_t sem_ctime; + struct sem *sem_base; + struct sem_queue *sem_pending; + struct sem_queue **sem_pending_last; + struct sem_undo *undo; + short unsigned int sem_nsems; +}; + +struct sem { + int semval; + struct pid *sempid; + spinlock_t lock; + struct list_head pending_alter; + struct list_head pending_const; + time64_t sem_otime; +}; + +struct sem_queue { + struct list_head list; + struct task_struct *sleeper; + struct sem_undo *undo; + struct pid *pid; + int status; + struct sembuf *sops; + struct sembuf *blocking; + int nsops; + bool alter; + bool dupsop; +}; + +struct sem_undo { + struct list_head list_proc; + struct callback_head rcu; + struct sem_undo_list *ulp; + struct list_head list_id; + int semid; + short int *semadj; +}; + +struct semid64_ds { + struct ipc64_perm sem_perm; + long int sem_otime; + long int sem_ctime; + long unsigned int sem_nsems; + long unsigned int __unused3; + long unsigned int __unused4; +}; + +struct seminfo { + int semmap; + int semmni; + int semmns; + int semmnu; + int semmsl; + int semopm; + int semume; + int semusz; + int semvmx; + int semaem; +}; + +struct sem_undo_list { + refcount_t refcnt; + spinlock_t lock; + struct list_head list_proc; +}; + +struct compat_semid64_ds { + struct compat_ipc64_perm sem_perm; + compat_ulong_t sem_otime; + compat_ulong_t sem_otime_high; + compat_ulong_t sem_ctime; + compat_ulong_t sem_ctime_high; + compat_ulong_t sem_nsems; + compat_ulong_t __unused3; + compat_ulong_t __unused4; +}; + +struct sem_array { + struct kern_ipc_perm sem_perm; + time64_t sem_ctime; + struct list_head pending_alter; + struct list_head pending_const; + struct list_head list_id; + int sem_nsems; + int complex_count; + unsigned int use_global_lock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sem sems[0]; +}; + +struct compat_semid_ds { + struct compat_ipc_perm sem_perm; + old_time32_t sem_otime; + old_time32_t sem_ctime; + compat_uptr_t sem_base; + compat_uptr_t sem_pending; + compat_uptr_t sem_pending_last; + compat_uptr_t undo; + short unsigned int sem_nsems; +}; + +struct shmid_ds { + struct ipc_perm shm_perm; + int shm_segsz; + __kernel_old_time_t shm_atime; + __kernel_old_time_t shm_dtime; + __kernel_old_time_t shm_ctime; + __kernel_ipc_pid_t shm_cpid; + __kernel_ipc_pid_t shm_lpid; + short unsigned int shm_nattch; + short unsigned int shm_unused; + void *shm_unused2; + void *shm_unused3; +}; + +struct shmid64_ds { + struct ipc64_perm shm_perm; + size_t shm_segsz; + long int shm_atime; + long int shm_dtime; + long int shm_ctime; + __kernel_pid_t shm_cpid; + __kernel_pid_t shm_lpid; + long unsigned int shm_nattch; + long unsigned int __unused4; + long unsigned int __unused5; +}; + +struct shminfo64 { + long unsigned int shmmax; + long unsigned int shmmin; + long unsigned int shmmni; + long unsigned int shmseg; + long unsigned int shmall; + long unsigned int __unused1; + long unsigned int __unused2; + long unsigned int __unused3; + long unsigned int __unused4; +}; + +struct shminfo { + int shmmax; + int shmmin; + int shmmni; + int shmseg; + int shmall; +}; + +struct shm_info { + int used_ids; + __kernel_ulong_t shm_tot; + __kernel_ulong_t shm_rss; + __kernel_ulong_t shm_swp; + __kernel_ulong_t swap_attempts; + __kernel_ulong_t swap_successes; +}; + +struct compat_shmid64_ds { + struct compat_ipc64_perm shm_perm; + compat_size_t shm_segsz; + compat_ulong_t shm_atime; + compat_ulong_t shm_atime_high; + compat_ulong_t shm_dtime; + compat_ulong_t shm_dtime_high; + compat_ulong_t shm_ctime; + compat_ulong_t shm_ctime_high; + compat_pid_t shm_cpid; + compat_pid_t shm_lpid; + compat_ulong_t shm_nattch; + compat_ulong_t __unused4; + compat_ulong_t __unused5; +}; + +struct shmid_kernel { + struct kern_ipc_perm shm_perm; + struct file *shm_file; + long unsigned int shm_nattch; + long unsigned int shm_segsz; + time64_t shm_atim; + time64_t shm_dtim; + time64_t shm_ctim; + struct pid *shm_cprid; + struct pid *shm_lprid; + struct ucounts *mlock_ucounts; + struct task_struct *shm_creator; + struct list_head shm_clist; + struct ipc_namespace *ns; + long: 64; + long: 64; + long: 64; +}; + +struct shm_file_data { + int id; + struct ipc_namespace *ns; + struct file *file; + const struct vm_operations_struct *vm_ops; +}; + +struct compat_shmid_ds { + struct compat_ipc_perm shm_perm; + int shm_segsz; + old_time32_t shm_atime; + old_time32_t shm_dtime; + old_time32_t shm_ctime; + compat_ipc_pid_t shm_cpid; + compat_ipc_pid_t shm_lpid; + short unsigned int shm_nattch; + short unsigned int shm_unused; + compat_uptr_t shm_unused2; + compat_uptr_t shm_unused3; +}; + +struct compat_shminfo64 { + compat_ulong_t shmmax; + compat_ulong_t shmmin; + compat_ulong_t shmmni; + compat_ulong_t shmseg; + compat_ulong_t shmall; + compat_ulong_t __unused1; + compat_ulong_t __unused2; + compat_ulong_t __unused3; + compat_ulong_t __unused4; +}; + +struct compat_shm_info { + compat_int_t used_ids; + compat_ulong_t shm_tot; + compat_ulong_t shm_rss; + compat_ulong_t shm_swp; + compat_ulong_t swap_attempts; + compat_ulong_t swap_successes; +}; + +struct mqueue_fs_context { + struct ipc_namespace *ipc_ns; +}; + +struct posix_msg_tree_node { + struct rb_node rb_node; + struct list_head msg_list; + int priority; +}; + +struct ext_wait_queue { + struct task_struct *task; + struct list_head list; + struct msg_msg *msg; + int state; +}; + +struct mqueue_inode_info { + spinlock_t lock; + struct inode vfs_inode; + wait_queue_head_t wait_q; + struct rb_root msg_tree; + struct rb_node *msg_tree_rightmost; + struct posix_msg_tree_node *node_cache; + struct mq_attr attr; + struct sigevent notify; + struct pid *notify_owner; + u32 notify_self_exec_id; + struct user_namespace *notify_user_ns; + struct ucounts *ucounts; + struct sock *notify_sock; + struct sk_buff *notify_cookie; + struct ext_wait_queue e_wait_q[2]; + long unsigned int qsize; +}; + +struct compat_mq_attr { + compat_long_t mq_flags; + compat_long_t mq_maxmsg; + compat_long_t mq_msgsize; + compat_long_t mq_curmsgs; + compat_long_t __reserved[4]; +}; + +struct key_user { + struct rb_node node; + struct mutex cons_lock; + spinlock_t lock; + refcount_t usage; + atomic_t nkeys; + atomic_t nikeys; + kuid_t uid; + int qnkeys; + int qnbytes; +}; + +enum key_notification_subtype { + NOTIFY_KEY_INSTANTIATED = 0, + NOTIFY_KEY_UPDATED = 1, + NOTIFY_KEY_LINKED = 2, + NOTIFY_KEY_UNLINKED = 3, + NOTIFY_KEY_CLEARED = 4, + NOTIFY_KEY_REVOKED = 5, + NOTIFY_KEY_INVALIDATED = 6, + NOTIFY_KEY_SETATTR = 7, +}; + +struct key_notification { + struct watch_notification watch; + __u32 key_id; + __u32 aux; +}; + +struct assoc_array_edit; + +struct assoc_array_ops { + long unsigned int (*get_key_chunk)(const void *, int); + long unsigned int (*get_object_key_chunk)(const void *, int); + bool (*compare_object)(const void *, const void *); + int (*diff_objects)(const void *, const void *); + void (*free_object)(void *); +}; + +struct assoc_array_node { + struct assoc_array_ptr *back_pointer; + u8 parent_slot; + struct assoc_array_ptr *slots[16]; + long unsigned int nr_leaves_on_branch; +}; + +struct assoc_array_shortcut { + struct assoc_array_ptr *back_pointer; + int parent_slot; + int skip_to_level; + struct assoc_array_ptr *next_node; + long unsigned int index_key[0]; +}; + +struct assoc_array_edit___2 { + struct callback_head rcu; + struct assoc_array *array; + const struct assoc_array_ops *ops; + const struct assoc_array_ops *ops_for_excised_subtree; + struct assoc_array_ptr *leaf; + struct assoc_array_ptr **leaf_p; + struct assoc_array_ptr *dead_leaf; + struct assoc_array_ptr *new_meta[3]; + struct assoc_array_ptr *excised_meta[1]; + struct assoc_array_ptr *excised_subtree; + struct assoc_array_ptr **set_backpointers[16]; + struct assoc_array_ptr *set_backpointers_to; + struct assoc_array_node *adjust_count_on; + long int adjust_count_by; + struct { + struct assoc_array_ptr **ptr; + struct assoc_array_ptr *to; + } set[2]; + struct { + u8 *p; + u8 to; + } set_parent_slot[1]; + u8 segment_cache[17]; +}; + +struct keyring_search_context { + struct keyring_index_key index_key; + const struct cred *cred; + struct key_match_data match_data; + unsigned int flags; + int (*iterator)(const void *, void *); + int skipped_ret; + bool possessed; + key_ref_t result; + time64_t now; +}; + +struct keyring_read_iterator_context { + size_t buflen; + size_t count; + key_serial_t *buffer; +}; + +struct keyctl_dh_params { + union { + __s32 private; + __s32 priv; + }; + __s32 prime; + __s32 base; +}; + +struct keyctl_kdf_params { + char *hashname; + char *otherinfo; + __u32 otherinfolen; + __u32 __spare[8]; +}; + +struct keyctl_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; + __u32 __spare[10]; +}; + +struct keyctl_pkey_params { + __s32 key_id; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + __u32 __spare[7]; +}; + +struct request_key_auth { + struct callback_head rcu; + struct key *target_key; + struct key *dest_keyring; + const struct cred *cred; + void *callout_info; + size_t callout_len; + pid_t pid; + char op[8]; +}; + +struct compat_keyctl_kdf_params { + compat_uptr_t hashname; + compat_uptr_t otherinfo; + __u32 otherinfolen; + __u32 __spare[8]; +}; + +struct kpp_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_kpp { + struct crypto_tfm base; +}; + +struct kpp_alg { + int (*set_secret)(struct crypto_kpp *, const void *, unsigned int); + int (*generate_public_key)(struct kpp_request *); + int (*compute_shared_secret)(struct kpp_request *); + unsigned int (*max_size)(struct crypto_kpp *); + int (*init)(struct crypto_kpp *); + void (*exit)(struct crypto_kpp *); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct dh { + void *key; + void *p; + void *q; + void *g; + unsigned int key_size; + unsigned int p_size; + unsigned int q_size; + unsigned int g_size; +}; + +struct dh_completion { + struct completion completion; + int err; +}; + +struct kdf_sdesc { + struct shash_desc shash; + char ctx[0]; +}; + +enum { + Opt_err___6 = 0, + Opt_enc = 1, + Opt_hash = 2, +}; + +enum tpm_duration { + TPM_SHORT = 0, + TPM_MEDIUM = 1, + TPM_LONG = 2, + TPM_LONG_LONG = 3, + TPM_UNDEFINED = 4, + TPM_NUM_DURATIONS = 4, +}; + +struct trusted_key_payload { + struct callback_head rcu; + unsigned int key_len; + unsigned int blob_len; + unsigned char migratable; + unsigned char old_format; + unsigned char key[129]; + unsigned char blob[512]; +}; + +struct trusted_key_ops { + unsigned char migratable; + int (*init)(); + int (*seal)(struct trusted_key_payload *, char *); + int (*unseal)(struct trusted_key_payload *, char *); + int (*get_random)(unsigned char *, size_t); + void (*exit)(); +}; + +struct trusted_key_source { + char *name; + struct trusted_key_ops *ops; +}; + +enum { + Opt_err___7 = 0, + Opt_new = 1, + Opt_load = 2, + Opt_update = 3, +}; + +struct hwrng { + const char *name; + int (*init)(struct hwrng *); + void (*cleanup)(struct hwrng *); + int (*data_present)(struct hwrng *, int); + int (*data_read)(struct hwrng *, u32 *); + int (*read)(struct hwrng *, void *, size_t, bool); + long unsigned int priv; + short unsigned int quality; + struct list_head list; + struct kref ref; + struct completion cleanup_done; +}; + +struct tpm_digest { + u16 alg_id; + u8 digest[64]; +}; + +struct tpm_bank_info { + u16 alg_id; + u16 digest_size; + u16 crypto_id; +}; + +struct tpm_chip; + +struct tpm_class_ops { + unsigned int flags; + const u8 req_complete_mask; + const u8 req_complete_val; + bool (*req_canceled)(struct tpm_chip *, u8); + int (*recv)(struct tpm_chip *, u8 *, size_t); + int (*send)(struct tpm_chip *, u8 *, size_t); + void (*cancel)(struct tpm_chip *); + u8 (*status)(struct tpm_chip *); + void (*update_timeouts)(struct tpm_chip *, long unsigned int *); + void (*update_durations)(struct tpm_chip *, long unsigned int *); + int (*go_idle)(struct tpm_chip *); + int (*cmd_ready)(struct tpm_chip *); + int (*request_locality)(struct tpm_chip *, int); + int (*relinquish_locality)(struct tpm_chip *, int); + void (*clk_enable)(struct tpm_chip *, bool); +}; + +struct tpm_bios_log { + void *bios_event_log; + void *bios_event_log_end; +}; + +struct tpm_chip_seqops { + struct tpm_chip *chip; + const struct seq_operations *seqops; +}; + +struct tpm_space { + u32 context_tbl[3]; + u8 *context_buf; + u32 session_tbl[3]; + u8 *session_buf; + u32 buf_size; +}; + +struct tpm_chip { + struct device dev; + struct device devs; + struct cdev cdev; + struct cdev cdevs; + struct rw_semaphore ops_sem; + const struct tpm_class_ops *ops; + struct tpm_bios_log log; + struct tpm_chip_seqops bin_log_seqops; + struct tpm_chip_seqops ascii_log_seqops; + unsigned int flags; + int dev_num; + long unsigned int is_open; + char hwrng_name[64]; + struct hwrng hwrng; + struct mutex tpm_mutex; + long unsigned int timeout_a; + long unsigned int timeout_b; + long unsigned int timeout_c; + long unsigned int timeout_d; + bool timeout_adjusted; + long unsigned int duration[4]; + bool duration_adjusted; + struct dentry *bios_dir[3]; + const struct attribute_group *groups[8]; + unsigned int groups_cnt; + u32 nr_allocated_banks; + struct tpm_bank_info *allocated_banks; + acpi_handle acpi_dev_handle; + char ppi_version[4]; + struct tpm_space work_space; + u32 last_cc; + u32 nr_commands; + u32 *cc_attrs_tbl; + int locality; +}; + +struct tpm_header { + __be16 tag; + __be32 length; + union { + __be32 ordinal; + __be32 return_code; + }; +} __attribute__((packed)); + +enum tpm_buf_flags { + TPM_BUF_OVERFLOW = 1, +}; + +struct tpm_buf { + unsigned int flags; + u8 *data; +}; + +struct trusted_key_options { + uint16_t keytype; + uint32_t keyhandle; + unsigned char keyauth[20]; + uint32_t blobauth_len; + unsigned char blobauth[20]; + uint32_t pcrinfo_len; + unsigned char pcrinfo[64]; + int pcrlock; + uint32_t hash; + uint32_t policydigest_len; + unsigned char policydigest[64]; + uint32_t policyhandle; +}; + +struct osapsess { + uint32_t handle; + unsigned char secret[20]; + unsigned char enonce[20]; +}; + +enum { + SEAL_keytype = 1, + SRK_keytype = 4, +}; + +struct sdesc { + struct shash_desc shash; + char ctx[0]; +}; + +struct tpm_digests { + unsigned char encauth[20]; + unsigned char pubauth[20]; + unsigned char xorwork[40]; + unsigned char xorhash[20]; + unsigned char nonceodd[20]; +}; + +enum { + Opt_err___8 = 0, + Opt_keyhandle = 1, + Opt_keyauth = 2, + Opt_blobauth = 3, + Opt_pcrinfo = 4, + Opt_pcrlock = 5, + Opt_migratable = 6, + Opt_hash___2 = 7, + Opt_policydigest = 8, + Opt_policyhandle = 9, +}; + +typedef int (*asn1_action_t)(void *, size_t, unsigned char, const void *, size_t); + +struct asn1_decoder { + const unsigned char *machine; + size_t machlen; + const asn1_action_t *actions; +}; + +enum OID { + OID_id_dsa_with_sha1 = 0, + OID_id_dsa = 1, + OID_id_ecPublicKey = 2, + OID_id_prime192v1 = 3, + OID_id_prime256v1 = 4, + OID_id_ecdsa_with_sha1 = 5, + OID_id_ecdsa_with_sha224 = 6, + OID_id_ecdsa_with_sha256 = 7, + OID_id_ecdsa_with_sha384 = 8, + OID_id_ecdsa_with_sha512 = 9, + OID_rsaEncryption = 10, + OID_md2WithRSAEncryption = 11, + OID_md3WithRSAEncryption = 12, + OID_md4WithRSAEncryption = 13, + OID_sha1WithRSAEncryption = 14, + OID_sha256WithRSAEncryption = 15, + OID_sha384WithRSAEncryption = 16, + OID_sha512WithRSAEncryption = 17, + OID_sha224WithRSAEncryption = 18, + OID_data = 19, + OID_signed_data = 20, + OID_email_address = 21, + OID_contentType = 22, + OID_messageDigest = 23, + OID_signingTime = 24, + OID_smimeCapabilites = 25, + OID_smimeAuthenticatedAttrs = 26, + OID_md2 = 27, + OID_md4 = 28, + OID_md5 = 29, + OID_mskrb5 = 30, + OID_krb5 = 31, + OID_krb5u2u = 32, + OID_msIndirectData = 33, + OID_msStatementType = 34, + OID_msSpOpusInfo = 35, + OID_msPeImageDataObjId = 36, + OID_msIndividualSPKeyPurpose = 37, + OID_msOutlookExpress = 38, + OID_ntlmssp = 39, + OID_spnego = 40, + OID_IAKerb = 41, + OID_PKU2U = 42, + OID_Scram = 43, + OID_certAuthInfoAccess = 44, + OID_sha1 = 45, + OID_id_ansip384r1 = 46, + OID_sha256 = 47, + OID_sha384 = 48, + OID_sha512 = 49, + OID_sha224 = 50, + OID_commonName = 51, + OID_surname = 52, + OID_countryName = 53, + OID_locality = 54, + OID_stateOrProvinceName = 55, + OID_organizationName = 56, + OID_organizationUnitName = 57, + OID_title = 58, + OID_description = 59, + OID_name = 60, + OID_givenName = 61, + OID_initials = 62, + OID_generationalQualifier = 63, + OID_subjectKeyIdentifier = 64, + OID_keyUsage = 65, + OID_subjectAltName = 66, + OID_issuerAltName = 67, + OID_basicConstraints = 68, + OID_crlDistributionPoints = 69, + OID_certPolicies = 70, + OID_authorityKeyIdentifier = 71, + OID_extKeyUsage = 72, + OID_NetlogonMechanism = 73, + OID_appleLocalKdcSupported = 74, + OID_gostCPSignA = 75, + OID_gostCPSignB = 76, + OID_gostCPSignC = 77, + OID_gost2012PKey256 = 78, + OID_gost2012PKey512 = 79, + OID_gost2012Digest256 = 80, + OID_gost2012Digest512 = 81, + OID_gost2012Signature256 = 82, + OID_gost2012Signature512 = 83, + OID_gostTC26Sign256A = 84, + OID_gostTC26Sign256B = 85, + OID_gostTC26Sign256C = 86, + OID_gostTC26Sign256D = 87, + OID_gostTC26Sign512A = 88, + OID_gostTC26Sign512B = 89, + OID_gostTC26Sign512C = 90, + OID_sm2 = 91, + OID_sm3 = 92, + OID_SM2_with_SM3 = 93, + OID_sm3WithRSAEncryption = 94, + OID_TPMLoadableKey = 95, + OID_TPMImportableKey = 96, + OID_TPMSealedData = 97, + OID__NR = 98, +}; + +enum tpm_algorithms { + TPM_ALG_ERROR = 0, + TPM_ALG_SHA1 = 4, + TPM_ALG_KEYEDHASH = 8, + TPM_ALG_SHA256 = 11, + TPM_ALG_SHA384 = 12, + TPM_ALG_SHA512 = 13, + TPM_ALG_NULL = 16, + TPM_ALG_SM3_256 = 18, +}; + +enum tpm2_structures { + TPM2_ST_NO_SESSIONS = 32769, + TPM2_ST_SESSIONS = 32770, +}; + +enum tpm2_return_codes { + TPM2_RC_SUCCESS = 0, + TPM2_RC_HASH = 131, + TPM2_RC_HANDLE = 139, + TPM2_RC_INITIALIZE = 256, + TPM2_RC_FAILURE = 257, + TPM2_RC_DISABLED = 288, + TPM2_RC_COMMAND_CODE = 323, + TPM2_RC_TESTING = 2314, + TPM2_RC_REFERENCE_H0 = 2320, + TPM2_RC_RETRY = 2338, +}; + +enum tpm2_command_codes { + TPM2_CC_FIRST = 287, + TPM2_CC_HIERARCHY_CONTROL = 289, + TPM2_CC_HIERARCHY_CHANGE_AUTH = 297, + TPM2_CC_CREATE_PRIMARY = 305, + TPM2_CC_SEQUENCE_COMPLETE = 318, + TPM2_CC_SELF_TEST = 323, + TPM2_CC_STARTUP = 324, + TPM2_CC_SHUTDOWN = 325, + TPM2_CC_NV_READ = 334, + TPM2_CC_CREATE = 339, + TPM2_CC_LOAD = 343, + TPM2_CC_SEQUENCE_UPDATE = 348, + TPM2_CC_UNSEAL = 350, + TPM2_CC_CONTEXT_LOAD = 353, + TPM2_CC_CONTEXT_SAVE = 354, + TPM2_CC_FLUSH_CONTEXT = 357, + TPM2_CC_VERIFY_SIGNATURE = 375, + TPM2_CC_GET_CAPABILITY = 378, + TPM2_CC_GET_RANDOM = 379, + TPM2_CC_PCR_READ = 382, + TPM2_CC_PCR_EXTEND = 386, + TPM2_CC_EVENT_SEQUENCE_COMPLETE = 389, + TPM2_CC_HASH_SEQUENCE_START = 390, + TPM2_CC_CREATE_LOADED = 401, + TPM2_CC_LAST = 403, +}; + +enum tpm2_permanent_handles { + TPM2_RS_PW = 1073741833, +}; + +enum tpm2_object_attributes { + TPM2_OA_FIXED_TPM = 2, + TPM2_OA_FIXED_PARENT = 16, + TPM2_OA_USER_WITH_AUTH = 64, +}; + +enum tpm2_session_attributes { + TPM2_SA_CONTINUE_SESSION = 1, +}; + +struct tpm2_hash { + unsigned int crypto_id; + unsigned int tpm_id; +}; + +struct tpm2_key_context { + u32 parent; + const u8 *pub; + u32 pub_len; + const u8 *priv; + u32 priv_len; +}; + +enum asn1_class { + ASN1_UNIV = 0, + ASN1_APPL = 1, + ASN1_CONT = 2, + ASN1_PRIV = 3, +}; + +enum asn1_method { + ASN1_PRIM = 0, + ASN1_CONS = 1, +}; + +enum asn1_tag { + ASN1_EOC = 0, + ASN1_BOOL = 1, + ASN1_INT = 2, + ASN1_BTS = 3, + ASN1_OTS = 4, + ASN1_NULL = 5, + ASN1_OID = 6, + ASN1_ODE = 7, + ASN1_EXT = 8, + ASN1_REAL = 9, + ASN1_ENUM = 10, + ASN1_EPDV = 11, + ASN1_UTF8STR = 12, + ASN1_RELOID = 13, + ASN1_SEQ = 16, + ASN1_SET = 17, + ASN1_NUMSTR = 18, + ASN1_PRNSTR = 19, + ASN1_TEXSTR = 20, + ASN1_VIDSTR = 21, + ASN1_IA5STR = 22, + ASN1_UNITIM = 23, + ASN1_GENTIM = 24, + ASN1_GRASTR = 25, + ASN1_VISSTR = 26, + ASN1_GENSTR = 27, + ASN1_UNISTR = 28, + ASN1_CHRSTR = 29, + ASN1_BMPSTR = 30, + ASN1_LONG_TAG = 31, +}; + +enum asn1_opcode { + ASN1_OP_MATCH = 0, + ASN1_OP_MATCH_OR_SKIP = 1, + ASN1_OP_MATCH_ACT = 2, + ASN1_OP_MATCH_ACT_OR_SKIP = 3, + ASN1_OP_MATCH_JUMP = 4, + ASN1_OP_MATCH_JUMP_OR_SKIP = 5, + ASN1_OP_MATCH_ANY = 8, + ASN1_OP_MATCH_ANY_OR_SKIP = 9, + ASN1_OP_MATCH_ANY_ACT = 10, + ASN1_OP_MATCH_ANY_ACT_OR_SKIP = 11, + ASN1_OP_COND_MATCH_OR_SKIP = 17, + ASN1_OP_COND_MATCH_ACT_OR_SKIP = 19, + ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 21, + ASN1_OP_COND_MATCH_ANY = 24, + ASN1_OP_COND_MATCH_ANY_OR_SKIP = 25, + ASN1_OP_COND_MATCH_ANY_ACT = 26, + ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 27, + ASN1_OP_COND_FAIL = 28, + ASN1_OP_COMPLETE = 29, + ASN1_OP_ACT = 30, + ASN1_OP_MAYBE_ACT = 31, + ASN1_OP_END_SEQ = 32, + ASN1_OP_END_SET = 33, + ASN1_OP_END_SEQ_OF = 34, + ASN1_OP_END_SET_OF = 35, + ASN1_OP_END_SEQ_ACT = 36, + ASN1_OP_END_SET_ACT = 37, + ASN1_OP_END_SEQ_OF_ACT = 38, + ASN1_OP_END_SET_OF_ACT = 39, + ASN1_OP_RETURN = 40, + ASN1_OP__NR = 41, +}; + +enum tpm2key_actions { + ACT_tpm2_key_parent = 0, + ACT_tpm2_key_priv = 1, + ACT_tpm2_key_pub = 2, + ACT_tpm2_key_type = 3, + NR__tpm2key_actions = 4, +}; + +enum { + Opt_new___2 = 0, + Opt_load___2 = 1, + Opt_update___2 = 2, + Opt_err___9 = 3, +}; + +enum { + Opt_default = 0, + Opt_ecryptfs = 1, + Opt_enc32 = 2, + Opt_error = 3, +}; + +enum derived_key_type { + ENC_KEY = 0, + AUTH_KEY = 1, +}; + +struct vfs_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; +}; + +struct vfs_ns_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; + __le32 rootid; +}; + +struct sctp_association; + +union security_list_options { + int (*binder_set_context_mgr)(const struct cred *); + int (*binder_transaction)(const struct cred *, const struct cred *); + int (*binder_transfer_binder)(const struct cred *, const struct cred *); + int (*binder_transfer_file)(const struct cred *, const struct cred *, struct file *); + int (*ptrace_access_check)(struct task_struct *, unsigned int); + int (*ptrace_traceme)(struct task_struct *); + int (*capget)(struct task_struct *, kernel_cap_t *, kernel_cap_t *, kernel_cap_t *); + int (*capset)(struct cred *, const struct cred *, const kernel_cap_t *, const kernel_cap_t *, const kernel_cap_t *); + int (*capable)(const struct cred *, struct user_namespace *, int, unsigned int); + int (*quotactl)(int, int, int, struct super_block *); + int (*quota_on)(struct dentry *); + int (*syslog)(int); + int (*settime)(const struct timespec64 *, const struct timezone *); + int (*vm_enough_memory)(struct mm_struct *, long int); + int (*bprm_creds_for_exec)(struct linux_binprm *); + int (*bprm_creds_from_file)(struct linux_binprm *, struct file *); + int (*bprm_check_security)(struct linux_binprm *); + void (*bprm_committing_creds)(struct linux_binprm *); + void (*bprm_committed_creds)(struct linux_binprm *); + int (*fs_context_dup)(struct fs_context *, struct fs_context *); + int (*fs_context_parse_param)(struct fs_context *, struct fs_parameter *); + int (*sb_alloc_security)(struct super_block *); + void (*sb_delete)(struct super_block *); + void (*sb_free_security)(struct super_block *); + void (*sb_free_mnt_opts)(void *); + int (*sb_eat_lsm_opts)(char *, void **); + int (*sb_mnt_opts_compat)(struct super_block *, void *); + int (*sb_remount)(struct super_block *, void *); + int (*sb_kern_mount)(struct super_block *); + int (*sb_show_options)(struct seq_file *, struct super_block *); + int (*sb_statfs)(struct dentry *); + int (*sb_mount)(const char *, const struct path *, const char *, long unsigned int, void *); + int (*sb_umount)(struct vfsmount *, int); + int (*sb_pivotroot)(const struct path *, const struct path *); + int (*sb_set_mnt_opts)(struct super_block *, void *, long unsigned int, long unsigned int *); + int (*sb_clone_mnt_opts)(const struct super_block *, struct super_block *, long unsigned int, long unsigned int *); + int (*sb_add_mnt_opt)(const char *, const char *, int, void **); + int (*move_mount)(const struct path *, const struct path *); + int (*dentry_init_security)(struct dentry *, int, const struct qstr *, const char **, void **, u32 *); + int (*dentry_create_files_as)(struct dentry *, int, struct qstr *, const struct cred *, struct cred *); + int (*path_unlink)(const struct path *, struct dentry *); + int (*path_mkdir)(const struct path *, struct dentry *, umode_t); + int (*path_rmdir)(const struct path *, struct dentry *); + int (*path_mknod)(const struct path *, struct dentry *, umode_t, unsigned int); + int (*path_truncate)(const struct path *); + int (*path_symlink)(const struct path *, struct dentry *, const char *); + int (*path_link)(struct dentry *, const struct path *, struct dentry *); + int (*path_rename)(const struct path *, struct dentry *, const struct path *, struct dentry *); + int (*path_chmod)(const struct path *, umode_t); + int (*path_chown)(const struct path *, kuid_t, kgid_t); + int (*path_chroot)(const struct path *); + int (*path_notify)(const struct path *, u64, unsigned int); + int (*inode_alloc_security)(struct inode *); + void (*inode_free_security)(struct inode *); + int (*inode_init_security)(struct inode *, struct inode *, const struct qstr *, const char **, void **, size_t *); + int (*inode_init_security_anon)(struct inode *, const struct qstr *, const struct inode *); + int (*inode_create)(struct inode *, struct dentry *, umode_t); + int (*inode_link)(struct dentry *, struct inode *, struct dentry *); + int (*inode_unlink)(struct inode *, struct dentry *); + int (*inode_symlink)(struct inode *, struct dentry *, const char *); + int (*inode_mkdir)(struct inode *, struct dentry *, umode_t); + int (*inode_rmdir)(struct inode *, struct dentry *); + int (*inode_mknod)(struct inode *, struct dentry *, umode_t, dev_t); + int (*inode_rename)(struct inode *, struct dentry *, struct inode *, struct dentry *); + int (*inode_readlink)(struct dentry *); + int (*inode_follow_link)(struct dentry *, struct inode *, bool); + int (*inode_permission)(struct inode *, int); + int (*inode_setattr)(struct dentry *, struct iattr *); + int (*inode_getattr)(const struct path *); + int (*inode_setxattr)(struct user_namespace *, struct dentry *, const char *, const void *, size_t, int); + void (*inode_post_setxattr)(struct dentry *, const char *, const void *, size_t, int); + int (*inode_getxattr)(struct dentry *, const char *); + int (*inode_listxattr)(struct dentry *); + int (*inode_removexattr)(struct user_namespace *, struct dentry *, const char *); + int (*inode_need_killpriv)(struct dentry *); + int (*inode_killpriv)(struct user_namespace *, struct dentry *); + int (*inode_getsecurity)(struct user_namespace *, struct inode *, const char *, void **, bool); + int (*inode_setsecurity)(struct inode *, const char *, const void *, size_t, int); + int (*inode_listsecurity)(struct inode *, char *, size_t); + void (*inode_getsecid)(struct inode *, u32 *); + int (*inode_copy_up)(struct dentry *, struct cred **); + int (*inode_copy_up_xattr)(const char *); + int (*kernfs_init_security)(struct kernfs_node *, struct kernfs_node *); + int (*file_permission)(struct file *, int); + int (*file_alloc_security)(struct file *); + void (*file_free_security)(struct file *); + int (*file_ioctl)(struct file *, unsigned int, long unsigned int); + int (*mmap_addr)(long unsigned int); + int (*mmap_file)(struct file *, long unsigned int, long unsigned int, long unsigned int); + int (*file_mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int); + int (*file_lock)(struct file *, unsigned int); + int (*file_fcntl)(struct file *, unsigned int, long unsigned int); + void (*file_set_fowner)(struct file *); + int (*file_send_sigiotask)(struct task_struct *, struct fown_struct *, int); + int (*file_receive)(struct file *); + int (*file_open)(struct file *); + int (*task_alloc)(struct task_struct *, long unsigned int); + void (*task_free)(struct task_struct *); + int (*cred_alloc_blank)(struct cred *, gfp_t); + void (*cred_free)(struct cred *); + int (*cred_prepare)(struct cred *, const struct cred *, gfp_t); + void (*cred_transfer)(struct cred *, const struct cred *); + void (*cred_getsecid)(const struct cred *, u32 *); + int (*kernel_act_as)(struct cred *, u32); + int (*kernel_create_files_as)(struct cred *, struct inode *); + int (*kernel_module_request)(char *); + int (*kernel_load_data)(enum kernel_load_data_id, bool); + int (*kernel_post_load_data)(char *, loff_t, enum kernel_load_data_id, char *); + int (*kernel_read_file)(struct file *, enum kernel_read_file_id, bool); + int (*kernel_post_read_file)(struct file *, char *, loff_t, enum kernel_read_file_id); + int (*task_fix_setuid)(struct cred *, const struct cred *, int); + int (*task_fix_setgid)(struct cred *, const struct cred *, int); + int (*task_setpgid)(struct task_struct *, pid_t); + int (*task_getpgid)(struct task_struct *); + int (*task_getsid)(struct task_struct *); + void (*task_getsecid_subj)(struct task_struct *, u32 *); + void (*task_getsecid_obj)(struct task_struct *, u32 *); + int (*task_setnice)(struct task_struct *, int); + int (*task_setioprio)(struct task_struct *, int); + int (*task_getioprio)(struct task_struct *); + int (*task_prlimit)(const struct cred *, const struct cred *, unsigned int); + int (*task_setrlimit)(struct task_struct *, unsigned int, struct rlimit *); + int (*task_setscheduler)(struct task_struct *); + int (*task_getscheduler)(struct task_struct *); + int (*task_movememory)(struct task_struct *); + int (*task_kill)(struct task_struct *, struct kernel_siginfo *, int, const struct cred *); + int (*task_prctl)(int, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + void (*task_to_inode)(struct task_struct *, struct inode *); + int (*ipc_permission)(struct kern_ipc_perm *, short int); + void (*ipc_getsecid)(struct kern_ipc_perm *, u32 *); + int (*msg_msg_alloc_security)(struct msg_msg *); + void (*msg_msg_free_security)(struct msg_msg *); + int (*msg_queue_alloc_security)(struct kern_ipc_perm *); + void (*msg_queue_free_security)(struct kern_ipc_perm *); + int (*msg_queue_associate)(struct kern_ipc_perm *, int); + int (*msg_queue_msgctl)(struct kern_ipc_perm *, int); + int (*msg_queue_msgsnd)(struct kern_ipc_perm *, struct msg_msg *, int); + int (*msg_queue_msgrcv)(struct kern_ipc_perm *, struct msg_msg *, struct task_struct *, long int, int); + int (*shm_alloc_security)(struct kern_ipc_perm *); + void (*shm_free_security)(struct kern_ipc_perm *); + int (*shm_associate)(struct kern_ipc_perm *, int); + int (*shm_shmctl)(struct kern_ipc_perm *, int); + int (*shm_shmat)(struct kern_ipc_perm *, char *, int); + int (*sem_alloc_security)(struct kern_ipc_perm *); + void (*sem_free_security)(struct kern_ipc_perm *); + int (*sem_associate)(struct kern_ipc_perm *, int); + int (*sem_semctl)(struct kern_ipc_perm *, int); + int (*sem_semop)(struct kern_ipc_perm *, struct sembuf *, unsigned int, int); + int (*netlink_send)(struct sock *, struct sk_buff *); + void (*d_instantiate)(struct dentry *, struct inode *); + int (*getprocattr)(struct task_struct *, char *, char **); + int (*setprocattr)(const char *, void *, size_t); + int (*ismaclabel)(const char *); + int (*secid_to_secctx)(u32, char **, u32 *); + int (*secctx_to_secid)(const char *, u32, u32 *); + void (*release_secctx)(char *, u32); + void (*inode_invalidate_secctx)(struct inode *); + int (*inode_notifysecctx)(struct inode *, void *, u32); + int (*inode_setsecctx)(struct dentry *, void *, u32); + int (*inode_getsecctx)(struct inode *, void **, u32 *); + int (*post_notification)(const struct cred *, const struct cred *, struct watch_notification *); + int (*watch_key)(struct key *); + int (*unix_stream_connect)(struct sock *, struct sock *, struct sock *); + int (*unix_may_send)(struct socket *, struct socket *); + int (*socket_create)(int, int, int, int); + int (*socket_post_create)(struct socket *, int, int, int, int); + int (*socket_socketpair)(struct socket *, struct socket *); + int (*socket_bind)(struct socket *, struct sockaddr *, int); + int (*socket_connect)(struct socket *, struct sockaddr *, int); + int (*socket_listen)(struct socket *, int); + int (*socket_accept)(struct socket *, struct socket *); + int (*socket_sendmsg)(struct socket *, struct msghdr *, int); + int (*socket_recvmsg)(struct socket *, struct msghdr *, int, int); + int (*socket_getsockname)(struct socket *); + int (*socket_getpeername)(struct socket *); + int (*socket_getsockopt)(struct socket *, int, int); + int (*socket_setsockopt)(struct socket *, int, int); + int (*socket_shutdown)(struct socket *, int); + int (*socket_sock_rcv_skb)(struct sock *, struct sk_buff *); + int (*socket_getpeersec_stream)(struct socket *, char *, int *, unsigned int); + int (*socket_getpeersec_dgram)(struct socket *, struct sk_buff *, u32 *); + int (*sk_alloc_security)(struct sock *, int, gfp_t); + void (*sk_free_security)(struct sock *); + void (*sk_clone_security)(const struct sock *, struct sock *); + void (*sk_getsecid)(struct sock *, u32 *); + void (*sock_graft)(struct sock *, struct socket *); + int (*inet_conn_request)(const struct sock *, struct sk_buff *, struct request_sock *); + void (*inet_csk_clone)(struct sock *, const struct request_sock *); + void (*inet_conn_established)(struct sock *, struct sk_buff *); + int (*secmark_relabel_packet)(u32); + void (*secmark_refcount_inc)(); + void (*secmark_refcount_dec)(); + void (*req_classify_flow)(const struct request_sock *, struct flowi_common *); + int (*tun_dev_alloc_security)(void **); + void (*tun_dev_free_security)(void *); + int (*tun_dev_create)(); + int (*tun_dev_attach_queue)(void *); + int (*tun_dev_attach)(struct sock *, void *); + int (*tun_dev_open)(void *); + int (*sctp_assoc_request)(struct sctp_association *, struct sk_buff *); + int (*sctp_bind_connect)(struct sock *, int, struct sockaddr *, int); + void (*sctp_sk_clone)(struct sctp_association *, struct sock *, struct sock *); + int (*ib_pkey_access)(void *, u64, u16); + int (*ib_endport_manage_subnet)(void *, const char *, u8); + int (*ib_alloc_security)(void **); + void (*ib_free_security)(void *); + int (*xfrm_policy_alloc_security)(struct xfrm_sec_ctx **, struct xfrm_user_sec_ctx *, gfp_t); + int (*xfrm_policy_clone_security)(struct xfrm_sec_ctx *, struct xfrm_sec_ctx **); + void (*xfrm_policy_free_security)(struct xfrm_sec_ctx *); + int (*xfrm_policy_delete_security)(struct xfrm_sec_ctx *); + int (*xfrm_state_alloc)(struct xfrm_state *, struct xfrm_user_sec_ctx *); + int (*xfrm_state_alloc_acquire)(struct xfrm_state *, struct xfrm_sec_ctx *, u32); + void (*xfrm_state_free_security)(struct xfrm_state *); + int (*xfrm_state_delete_security)(struct xfrm_state *); + int (*xfrm_policy_lookup)(struct xfrm_sec_ctx *, u32); + int (*xfrm_state_pol_flow_match)(struct xfrm_state *, struct xfrm_policy *, const struct flowi_common *); + int (*xfrm_decode_session)(struct sk_buff *, u32 *, int); + int (*key_alloc)(struct key *, const struct cred *, long unsigned int); + void (*key_free)(struct key *); + int (*key_permission)(key_ref_t, const struct cred *, enum key_need_perm); + int (*key_getsecurity)(struct key *, char **); + int (*audit_rule_init)(u32, u32, char *, void **); + int (*audit_rule_known)(struct audit_krule *); + int (*audit_rule_match)(u32, u32, u32, void *); + void (*audit_rule_free)(void *); + int (*bpf)(int, union bpf_attr *, unsigned int); + int (*bpf_map)(struct bpf_map *, fmode_t); + int (*bpf_prog)(struct bpf_prog *); + int (*bpf_map_alloc_security)(struct bpf_map *); + void (*bpf_map_free_security)(struct bpf_map *); + int (*bpf_prog_alloc_security)(struct bpf_prog_aux *); + void (*bpf_prog_free_security)(struct bpf_prog_aux *); + int (*locked_down)(enum lockdown_reason); + int (*perf_event_open)(struct perf_event_attr *, int); + int (*perf_event_alloc)(struct perf_event *); + void (*perf_event_free)(struct perf_event *); + int (*perf_event_read)(struct perf_event *); + int (*perf_event_write)(struct perf_event *); + int (*uring_override_creds)(const struct cred *); + int (*uring_sqpoll)(); +}; + +struct security_hook_heads { + struct hlist_head binder_set_context_mgr; + struct hlist_head binder_transaction; + struct hlist_head binder_transfer_binder; + struct hlist_head binder_transfer_file; + struct hlist_head ptrace_access_check; + struct hlist_head ptrace_traceme; + struct hlist_head capget; + struct hlist_head capset; + struct hlist_head capable; + struct hlist_head quotactl; + struct hlist_head quota_on; + struct hlist_head syslog; + struct hlist_head settime; + struct hlist_head vm_enough_memory; + struct hlist_head bprm_creds_for_exec; + struct hlist_head bprm_creds_from_file; + struct hlist_head bprm_check_security; + struct hlist_head bprm_committing_creds; + struct hlist_head bprm_committed_creds; + struct hlist_head fs_context_dup; + struct hlist_head fs_context_parse_param; + struct hlist_head sb_alloc_security; + struct hlist_head sb_delete; + struct hlist_head sb_free_security; + struct hlist_head sb_free_mnt_opts; + struct hlist_head sb_eat_lsm_opts; + struct hlist_head sb_mnt_opts_compat; + struct hlist_head sb_remount; + struct hlist_head sb_kern_mount; + struct hlist_head sb_show_options; + struct hlist_head sb_statfs; + struct hlist_head sb_mount; + struct hlist_head sb_umount; + struct hlist_head sb_pivotroot; + struct hlist_head sb_set_mnt_opts; + struct hlist_head sb_clone_mnt_opts; + struct hlist_head sb_add_mnt_opt; + struct hlist_head move_mount; + struct hlist_head dentry_init_security; + struct hlist_head dentry_create_files_as; + struct hlist_head path_unlink; + struct hlist_head path_mkdir; + struct hlist_head path_rmdir; + struct hlist_head path_mknod; + struct hlist_head path_truncate; + struct hlist_head path_symlink; + struct hlist_head path_link; + struct hlist_head path_rename; + struct hlist_head path_chmod; + struct hlist_head path_chown; + struct hlist_head path_chroot; + struct hlist_head path_notify; + struct hlist_head inode_alloc_security; + struct hlist_head inode_free_security; + struct hlist_head inode_init_security; + struct hlist_head inode_init_security_anon; + struct hlist_head inode_create; + struct hlist_head inode_link; + struct hlist_head inode_unlink; + struct hlist_head inode_symlink; + struct hlist_head inode_mkdir; + struct hlist_head inode_rmdir; + struct hlist_head inode_mknod; + struct hlist_head inode_rename; + struct hlist_head inode_readlink; + struct hlist_head inode_follow_link; + struct hlist_head inode_permission; + struct hlist_head inode_setattr; + struct hlist_head inode_getattr; + struct hlist_head inode_setxattr; + struct hlist_head inode_post_setxattr; + struct hlist_head inode_getxattr; + struct hlist_head inode_listxattr; + struct hlist_head inode_removexattr; + struct hlist_head inode_need_killpriv; + struct hlist_head inode_killpriv; + struct hlist_head inode_getsecurity; + struct hlist_head inode_setsecurity; + struct hlist_head inode_listsecurity; + struct hlist_head inode_getsecid; + struct hlist_head inode_copy_up; + struct hlist_head inode_copy_up_xattr; + struct hlist_head kernfs_init_security; + struct hlist_head file_permission; + struct hlist_head file_alloc_security; + struct hlist_head file_free_security; + struct hlist_head file_ioctl; + struct hlist_head mmap_addr; + struct hlist_head mmap_file; + struct hlist_head file_mprotect; + struct hlist_head file_lock; + struct hlist_head file_fcntl; + struct hlist_head file_set_fowner; + struct hlist_head file_send_sigiotask; + struct hlist_head file_receive; + struct hlist_head file_open; + struct hlist_head task_alloc; + struct hlist_head task_free; + struct hlist_head cred_alloc_blank; + struct hlist_head cred_free; + struct hlist_head cred_prepare; + struct hlist_head cred_transfer; + struct hlist_head cred_getsecid; + struct hlist_head kernel_act_as; + struct hlist_head kernel_create_files_as; + struct hlist_head kernel_module_request; + struct hlist_head kernel_load_data; + struct hlist_head kernel_post_load_data; + struct hlist_head kernel_read_file; + struct hlist_head kernel_post_read_file; + struct hlist_head task_fix_setuid; + struct hlist_head task_fix_setgid; + struct hlist_head task_setpgid; + struct hlist_head task_getpgid; + struct hlist_head task_getsid; + struct hlist_head task_getsecid_subj; + struct hlist_head task_getsecid_obj; + struct hlist_head task_setnice; + struct hlist_head task_setioprio; + struct hlist_head task_getioprio; + struct hlist_head task_prlimit; + struct hlist_head task_setrlimit; + struct hlist_head task_setscheduler; + struct hlist_head task_getscheduler; + struct hlist_head task_movememory; + struct hlist_head task_kill; + struct hlist_head task_prctl; + struct hlist_head task_to_inode; + struct hlist_head ipc_permission; + struct hlist_head ipc_getsecid; + struct hlist_head msg_msg_alloc_security; + struct hlist_head msg_msg_free_security; + struct hlist_head msg_queue_alloc_security; + struct hlist_head msg_queue_free_security; + struct hlist_head msg_queue_associate; + struct hlist_head msg_queue_msgctl; + struct hlist_head msg_queue_msgsnd; + struct hlist_head msg_queue_msgrcv; + struct hlist_head shm_alloc_security; + struct hlist_head shm_free_security; + struct hlist_head shm_associate; + struct hlist_head shm_shmctl; + struct hlist_head shm_shmat; + struct hlist_head sem_alloc_security; + struct hlist_head sem_free_security; + struct hlist_head sem_associate; + struct hlist_head sem_semctl; + struct hlist_head sem_semop; + struct hlist_head netlink_send; + struct hlist_head d_instantiate; + struct hlist_head getprocattr; + struct hlist_head setprocattr; + struct hlist_head ismaclabel; + struct hlist_head secid_to_secctx; + struct hlist_head secctx_to_secid; + struct hlist_head release_secctx; + struct hlist_head inode_invalidate_secctx; + struct hlist_head inode_notifysecctx; + struct hlist_head inode_setsecctx; + struct hlist_head inode_getsecctx; + struct hlist_head post_notification; + struct hlist_head watch_key; + struct hlist_head unix_stream_connect; + struct hlist_head unix_may_send; + struct hlist_head socket_create; + struct hlist_head socket_post_create; + struct hlist_head socket_socketpair; + struct hlist_head socket_bind; + struct hlist_head socket_connect; + struct hlist_head socket_listen; + struct hlist_head socket_accept; + struct hlist_head socket_sendmsg; + struct hlist_head socket_recvmsg; + struct hlist_head socket_getsockname; + struct hlist_head socket_getpeername; + struct hlist_head socket_getsockopt; + struct hlist_head socket_setsockopt; + struct hlist_head socket_shutdown; + struct hlist_head socket_sock_rcv_skb; + struct hlist_head socket_getpeersec_stream; + struct hlist_head socket_getpeersec_dgram; + struct hlist_head sk_alloc_security; + struct hlist_head sk_free_security; + struct hlist_head sk_clone_security; + struct hlist_head sk_getsecid; + struct hlist_head sock_graft; + struct hlist_head inet_conn_request; + struct hlist_head inet_csk_clone; + struct hlist_head inet_conn_established; + struct hlist_head secmark_relabel_packet; + struct hlist_head secmark_refcount_inc; + struct hlist_head secmark_refcount_dec; + struct hlist_head req_classify_flow; + struct hlist_head tun_dev_alloc_security; + struct hlist_head tun_dev_free_security; + struct hlist_head tun_dev_create; + struct hlist_head tun_dev_attach_queue; + struct hlist_head tun_dev_attach; + struct hlist_head tun_dev_open; + struct hlist_head sctp_assoc_request; + struct hlist_head sctp_bind_connect; + struct hlist_head sctp_sk_clone; + struct hlist_head ib_pkey_access; + struct hlist_head ib_endport_manage_subnet; + struct hlist_head ib_alloc_security; + struct hlist_head ib_free_security; + struct hlist_head xfrm_policy_alloc_security; + struct hlist_head xfrm_policy_clone_security; + struct hlist_head xfrm_policy_free_security; + struct hlist_head xfrm_policy_delete_security; + struct hlist_head xfrm_state_alloc; + struct hlist_head xfrm_state_alloc_acquire; + struct hlist_head xfrm_state_free_security; + struct hlist_head xfrm_state_delete_security; + struct hlist_head xfrm_policy_lookup; + struct hlist_head xfrm_state_pol_flow_match; + struct hlist_head xfrm_decode_session; + struct hlist_head key_alloc; + struct hlist_head key_free; + struct hlist_head key_permission; + struct hlist_head key_getsecurity; + struct hlist_head audit_rule_init; + struct hlist_head audit_rule_known; + struct hlist_head audit_rule_match; + struct hlist_head audit_rule_free; + struct hlist_head bpf; + struct hlist_head bpf_map; + struct hlist_head bpf_prog; + struct hlist_head bpf_map_alloc_security; + struct hlist_head bpf_map_free_security; + struct hlist_head bpf_prog_alloc_security; + struct hlist_head bpf_prog_free_security; + struct hlist_head locked_down; + struct hlist_head perf_event_open; + struct hlist_head perf_event_alloc; + struct hlist_head perf_event_free; + struct hlist_head perf_event_read; + struct hlist_head perf_event_write; + struct hlist_head uring_override_creds; + struct hlist_head uring_sqpoll; +}; + +struct security_hook_list { + struct hlist_node list; + struct hlist_head *head; + union security_list_options hook; + char *lsm; +}; + +enum lsm_order { + LSM_ORDER_FIRST = 4294967295, + LSM_ORDER_MUTABLE = 0, +}; + +struct lsm_info { + const char *name; + enum lsm_order order; + long unsigned int flags; + int *enabled; + int (*init)(); + struct lsm_blob_sizes *blobs; +}; + +enum lsm_event { + LSM_POLICY_CHANGE = 0, +}; + +struct ethhdr { + unsigned char h_dest[6]; + unsigned char h_source[6]; + __be16 h_proto; +}; + +struct ethtool_drvinfo { + __u32 cmd; + char driver[32]; + char version[32]; + char fw_version[32]; + char bus_info[32]; + char erom_version[32]; + char reserved2[12]; + __u32 n_priv_flags; + __u32 n_stats; + __u32 testinfo_len; + __u32 eedump_len; + __u32 regdump_len; +}; + +struct ethtool_wolinfo { + __u32 cmd; + __u32 supported; + __u32 wolopts; + __u8 sopass[6]; +}; + +struct ethtool_tunable { + __u32 cmd; + __u32 id; + __u32 type_id; + __u32 len; + void *data[0]; +}; + +struct ethtool_regs { + __u32 cmd; + __u32 version; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_eeprom { + __u32 cmd; + __u32 magic; + __u32 offset; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_eee { + __u32 cmd; + __u32 supported; + __u32 advertised; + __u32 lp_advertised; + __u32 eee_active; + __u32 eee_enabled; + __u32 tx_lpi_enabled; + __u32 tx_lpi_timer; + __u32 reserved[2]; +}; + +struct ethtool_modinfo { + __u32 cmd; + __u32 type; + __u32 eeprom_len; + __u32 reserved[8]; +}; + +struct ethtool_coalesce { + __u32 cmd; + __u32 rx_coalesce_usecs; + __u32 rx_max_coalesced_frames; + __u32 rx_coalesce_usecs_irq; + __u32 rx_max_coalesced_frames_irq; + __u32 tx_coalesce_usecs; + __u32 tx_max_coalesced_frames; + __u32 tx_coalesce_usecs_irq; + __u32 tx_max_coalesced_frames_irq; + __u32 stats_block_coalesce_usecs; + __u32 use_adaptive_rx_coalesce; + __u32 use_adaptive_tx_coalesce; + __u32 pkt_rate_low; + __u32 rx_coalesce_usecs_low; + __u32 rx_max_coalesced_frames_low; + __u32 tx_coalesce_usecs_low; + __u32 tx_max_coalesced_frames_low; + __u32 pkt_rate_high; + __u32 rx_coalesce_usecs_high; + __u32 rx_max_coalesced_frames_high; + __u32 tx_coalesce_usecs_high; + __u32 tx_max_coalesced_frames_high; + __u32 rate_sample_interval; +}; + +struct ethtool_ringparam { + __u32 cmd; + __u32 rx_max_pending; + __u32 rx_mini_max_pending; + __u32 rx_jumbo_max_pending; + __u32 tx_max_pending; + __u32 rx_pending; + __u32 rx_mini_pending; + __u32 rx_jumbo_pending; + __u32 tx_pending; +}; + +struct ethtool_channels { + __u32 cmd; + __u32 max_rx; + __u32 max_tx; + __u32 max_other; + __u32 max_combined; + __u32 rx_count; + __u32 tx_count; + __u32 other_count; + __u32 combined_count; +}; + +struct ethtool_pauseparam { + __u32 cmd; + __u32 autoneg; + __u32 rx_pause; + __u32 tx_pause; +}; + +enum ethtool_link_ext_state { + ETHTOOL_LINK_EXT_STATE_AUTONEG = 0, + ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = 1, + ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = 2, + ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = 3, + ETHTOOL_LINK_EXT_STATE_NO_CABLE = 4, + ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = 5, + ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = 6, + ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = 7, + ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = 8, + ETHTOOL_LINK_EXT_STATE_OVERHEAT = 9, + ETHTOOL_LINK_EXT_STATE_MODULE = 10, +}; + +enum ethtool_link_ext_substate_autoneg { + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = 2, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = 3, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = 4, + ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = 5, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = 6, +}; + +enum ethtool_link_ext_substate_link_training { + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = 4, +}; + +enum ethtool_link_ext_substate_link_logical_mismatch { + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = 4, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = 5, +}; + +enum ethtool_link_ext_substate_bad_signal_integrity { + ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 2, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST = 3, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS = 4, +}; + +enum ethtool_link_ext_substate_cable_issue { + ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1, + ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 2, +}; + +enum ethtool_link_ext_substate_module { + ETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY = 1, +}; + +enum ethtool_module_power_mode_policy { + ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH = 1, + ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO = 2, +}; + +enum ethtool_module_power_mode { + ETHTOOL_MODULE_POWER_MODE_LOW = 1, + ETHTOOL_MODULE_POWER_MODE_HIGH = 2, +}; + +struct ethtool_test { + __u32 cmd; + __u32 flags; + __u32 reserved; + __u32 len; + __u64 data[0]; +}; + +struct ethtool_stats { + __u32 cmd; + __u32 n_stats; + __u64 data[0]; +}; + +struct ethtool_tcpip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be16 psrc; + __be16 pdst; + __u8 tos; +}; + +struct ethtool_ah_espip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 spi; + __u8 tos; +}; + +struct ethtool_usrip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 l4_4_bytes; + __u8 tos; + __u8 ip_ver; + __u8 proto; +}; + +struct ethtool_tcpip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be16 psrc; + __be16 pdst; + __u8 tclass; +}; + +struct ethtool_ah_espip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 spi; + __u8 tclass; +}; + +struct ethtool_usrip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 l4_4_bytes; + __u8 tclass; + __u8 l4_proto; +}; + +union ethtool_flow_union { + struct ethtool_tcpip4_spec tcp_ip4_spec; + struct ethtool_tcpip4_spec udp_ip4_spec; + struct ethtool_tcpip4_spec sctp_ip4_spec; + struct ethtool_ah_espip4_spec ah_ip4_spec; + struct ethtool_ah_espip4_spec esp_ip4_spec; + struct ethtool_usrip4_spec usr_ip4_spec; + struct ethtool_tcpip6_spec tcp_ip6_spec; + struct ethtool_tcpip6_spec udp_ip6_spec; + struct ethtool_tcpip6_spec sctp_ip6_spec; + struct ethtool_ah_espip6_spec ah_ip6_spec; + struct ethtool_ah_espip6_spec esp_ip6_spec; + struct ethtool_usrip6_spec usr_ip6_spec; + struct ethhdr ether_spec; + __u8 hdata[52]; +}; + +struct ethtool_flow_ext { + __u8 padding[2]; + unsigned char h_dest[6]; + __be16 vlan_etype; + __be16 vlan_tci; + __be32 data[2]; +}; + +struct ethtool_rx_flow_spec { + __u32 flow_type; + union ethtool_flow_union h_u; + struct ethtool_flow_ext h_ext; + union ethtool_flow_union m_u; + struct ethtool_flow_ext m_ext; + __u64 ring_cookie; + __u32 location; +}; + +struct ethtool_rxnfc { + __u32 cmd; + __u32 flow_type; + __u64 data; + struct ethtool_rx_flow_spec fs; + union { + __u32 rule_cnt; + __u32 rss_context; + }; + __u32 rule_locs[0]; +}; + +struct ethtool_flash { + __u32 cmd; + __u32 region; + char data[128]; +}; + +struct ethtool_dump { + __u32 cmd; + __u32 version; + __u32 flag; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_ts_info { + __u32 cmd; + __u32 so_timestamping; + __s32 phc_index; + __u32 tx_types; + __u32 tx_reserved[3]; + __u32 rx_filters; + __u32 rx_reserved[3]; +}; + +struct ethtool_fecparam { + __u32 cmd; + __u32 active_fec; + __u32 fec; + __u32 reserved; +}; + +enum ethtool_link_mode_bit_indices { + ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, + ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, + ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, + ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, + ETHTOOL_LINK_MODE_Autoneg_BIT = 6, + ETHTOOL_LINK_MODE_TP_BIT = 7, + ETHTOOL_LINK_MODE_AUI_BIT = 8, + ETHTOOL_LINK_MODE_MII_BIT = 9, + ETHTOOL_LINK_MODE_FIBRE_BIT = 10, + ETHTOOL_LINK_MODE_BNC_BIT = 11, + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, + ETHTOOL_LINK_MODE_Pause_BIT = 13, + ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, + ETHTOOL_LINK_MODE_Backplane_BIT = 16, + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31, + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32, + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33, + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34, + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35, + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36, + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37, + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38, + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39, + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40, + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41, + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42, + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43, + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, + ETHTOOL_LINK_MODE_FEC_NONE_BIT = 49, + ETHTOOL_LINK_MODE_FEC_RS_BIT = 50, + ETHTOOL_LINK_MODE_FEC_BASER_BIT = 51, + ETHTOOL_LINK_MODE_50000baseKR_Full_BIT = 52, + ETHTOOL_LINK_MODE_50000baseSR_Full_BIT = 53, + ETHTOOL_LINK_MODE_50000baseCR_Full_BIT = 54, + ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = 55, + ETHTOOL_LINK_MODE_50000baseDR_Full_BIT = 56, + ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = 57, + ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = 58, + ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = 59, + ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 60, + ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = 61, + ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = 62, + ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = 63, + ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 64, + ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = 65, + ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = 66, + ETHTOOL_LINK_MODE_100baseT1_Full_BIT = 67, + ETHTOOL_LINK_MODE_1000baseT1_Full_BIT = 68, + ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = 69, + ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = 70, + ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 71, + ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = 72, + ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = 73, + ETHTOOL_LINK_MODE_FEC_LLRS_BIT = 74, + ETHTOOL_LINK_MODE_100000baseKR_Full_BIT = 75, + ETHTOOL_LINK_MODE_100000baseSR_Full_BIT = 76, + ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = 77, + ETHTOOL_LINK_MODE_100000baseCR_Full_BIT = 78, + ETHTOOL_LINK_MODE_100000baseDR_Full_BIT = 79, + ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = 80, + ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = 81, + ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 82, + ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = 83, + ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = 84, + ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = 85, + ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = 86, + ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87, + ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 88, + ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 89, + ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 90, + ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 91, + __ETHTOOL_LINK_MODE_MASK_NBITS = 92, +}; + +struct ethtool_link_settings { + __u32 cmd; + __u32 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 autoneg; + __u8 mdio_support; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __s8 link_mode_masks_nwords; + __u8 transceiver; + __u8 master_slave_cfg; + __u8 master_slave_state; + __u8 reserved1[1]; + __u32 reserved[7]; + __u32 link_mode_masks[0]; +}; + +struct ethtool_link_ext_state_info { + enum ethtool_link_ext_state link_ext_state; + union { + enum ethtool_link_ext_substate_autoneg autoneg; + enum ethtool_link_ext_substate_link_training link_training; + enum ethtool_link_ext_substate_link_logical_mismatch link_logical_mismatch; + enum ethtool_link_ext_substate_bad_signal_integrity bad_signal_integrity; + enum ethtool_link_ext_substate_cable_issue cable_issue; + enum ethtool_link_ext_substate_module module; + u8 __link_ext_substate; + }; +}; + +struct ethtool_link_ksettings { + struct ethtool_link_settings base; + struct { + long unsigned int supported[2]; + long unsigned int advertising[2]; + long unsigned int lp_advertising[2]; + } link_modes; + u32 lanes; +}; + +struct kernel_ethtool_coalesce { + u8 use_cqe_mode_tx; + u8 use_cqe_mode_rx; +}; + +struct ethtool_eth_mac_stats { + u64 FramesTransmittedOK; + u64 SingleCollisionFrames; + u64 MultipleCollisionFrames; + u64 FramesReceivedOK; + u64 FrameCheckSequenceErrors; + u64 AlignmentErrors; + u64 OctetsTransmittedOK; + u64 FramesWithDeferredXmissions; + u64 LateCollisions; + u64 FramesAbortedDueToXSColls; + u64 FramesLostDueToIntMACXmitError; + u64 CarrierSenseErrors; + u64 OctetsReceivedOK; + u64 FramesLostDueToIntMACRcvError; + u64 MulticastFramesXmittedOK; + u64 BroadcastFramesXmittedOK; + u64 FramesWithExcessiveDeferral; + u64 MulticastFramesReceivedOK; + u64 BroadcastFramesReceivedOK; + u64 InRangeLengthErrors; + u64 OutOfRangeLengthField; + u64 FrameTooLongErrors; +}; + +struct ethtool_eth_phy_stats { + u64 SymbolErrorDuringCarrier; +}; + +struct ethtool_eth_ctrl_stats { + u64 MACControlFramesTransmitted; + u64 MACControlFramesReceived; + u64 UnsupportedOpcodesReceived; +}; + +struct ethtool_pause_stats { + u64 tx_pause_frames; + u64 rx_pause_frames; +}; + +struct ethtool_fec_stat { + u64 total; + u64 lanes[8]; +}; + +struct ethtool_fec_stats { + struct ethtool_fec_stat corrected_blocks; + struct ethtool_fec_stat uncorrectable_blocks; + struct ethtool_fec_stat corrected_bits; +}; + +struct ethtool_rmon_hist_range { + u16 low; + u16 high; +}; + +struct ethtool_rmon_stats { + u64 undersize_pkts; + u64 oversize_pkts; + u64 fragments; + u64 jabbers; + u64 hist[10]; + u64 hist_tx[10]; +}; + +struct ethtool_module_eeprom { + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; + u8 *data; +}; + +struct ethtool_module_power_mode_params { + enum ethtool_module_power_mode_policy policy; + enum ethtool_module_power_mode mode; +}; + +enum ib_uverbs_write_cmds { + IB_USER_VERBS_CMD_GET_CONTEXT = 0, + IB_USER_VERBS_CMD_QUERY_DEVICE = 1, + IB_USER_VERBS_CMD_QUERY_PORT = 2, + IB_USER_VERBS_CMD_ALLOC_PD = 3, + IB_USER_VERBS_CMD_DEALLOC_PD = 4, + IB_USER_VERBS_CMD_CREATE_AH = 5, + IB_USER_VERBS_CMD_MODIFY_AH = 6, + IB_USER_VERBS_CMD_QUERY_AH = 7, + IB_USER_VERBS_CMD_DESTROY_AH = 8, + IB_USER_VERBS_CMD_REG_MR = 9, + IB_USER_VERBS_CMD_REG_SMR = 10, + IB_USER_VERBS_CMD_REREG_MR = 11, + IB_USER_VERBS_CMD_QUERY_MR = 12, + IB_USER_VERBS_CMD_DEREG_MR = 13, + IB_USER_VERBS_CMD_ALLOC_MW = 14, + IB_USER_VERBS_CMD_BIND_MW = 15, + IB_USER_VERBS_CMD_DEALLOC_MW = 16, + IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL = 17, + IB_USER_VERBS_CMD_CREATE_CQ = 18, + IB_USER_VERBS_CMD_RESIZE_CQ = 19, + IB_USER_VERBS_CMD_DESTROY_CQ = 20, + IB_USER_VERBS_CMD_POLL_CQ = 21, + IB_USER_VERBS_CMD_PEEK_CQ = 22, + IB_USER_VERBS_CMD_REQ_NOTIFY_CQ = 23, + IB_USER_VERBS_CMD_CREATE_QP = 24, + IB_USER_VERBS_CMD_QUERY_QP = 25, + IB_USER_VERBS_CMD_MODIFY_QP = 26, + IB_USER_VERBS_CMD_DESTROY_QP = 27, + IB_USER_VERBS_CMD_POST_SEND = 28, + IB_USER_VERBS_CMD_POST_RECV = 29, + IB_USER_VERBS_CMD_ATTACH_MCAST = 30, + IB_USER_VERBS_CMD_DETACH_MCAST = 31, + IB_USER_VERBS_CMD_CREATE_SRQ = 32, + IB_USER_VERBS_CMD_MODIFY_SRQ = 33, + IB_USER_VERBS_CMD_QUERY_SRQ = 34, + IB_USER_VERBS_CMD_DESTROY_SRQ = 35, + IB_USER_VERBS_CMD_POST_SRQ_RECV = 36, + IB_USER_VERBS_CMD_OPEN_XRCD = 37, + IB_USER_VERBS_CMD_CLOSE_XRCD = 38, + IB_USER_VERBS_CMD_CREATE_XSRQ = 39, + IB_USER_VERBS_CMD_OPEN_QP = 40, +}; + +enum ib_uverbs_wc_opcode { + IB_UVERBS_WC_SEND = 0, + IB_UVERBS_WC_RDMA_WRITE = 1, + IB_UVERBS_WC_RDMA_READ = 2, + IB_UVERBS_WC_COMP_SWAP = 3, + IB_UVERBS_WC_FETCH_ADD = 4, + IB_UVERBS_WC_BIND_MW = 5, + IB_UVERBS_WC_LOCAL_INV = 6, + IB_UVERBS_WC_TSO = 7, +}; + +enum ib_uverbs_create_qp_mask { + IB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1, +}; + +enum ib_uverbs_wr_opcode { + IB_UVERBS_WR_RDMA_WRITE = 0, + IB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1, + IB_UVERBS_WR_SEND = 2, + IB_UVERBS_WR_SEND_WITH_IMM = 3, + IB_UVERBS_WR_RDMA_READ = 4, + IB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5, + IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6, + IB_UVERBS_WR_LOCAL_INV = 7, + IB_UVERBS_WR_BIND_MW = 8, + IB_UVERBS_WR_SEND_WITH_INV = 9, + IB_UVERBS_WR_TSO = 10, + IB_UVERBS_WR_RDMA_READ_WITH_INV = 11, + IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, + IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, +}; + +enum ib_uverbs_access_flags { + IB_UVERBS_ACCESS_LOCAL_WRITE = 1, + IB_UVERBS_ACCESS_REMOTE_WRITE = 2, + IB_UVERBS_ACCESS_REMOTE_READ = 4, + IB_UVERBS_ACCESS_REMOTE_ATOMIC = 8, + IB_UVERBS_ACCESS_MW_BIND = 16, + IB_UVERBS_ACCESS_ZERO_BASED = 32, + IB_UVERBS_ACCESS_ON_DEMAND = 64, + IB_UVERBS_ACCESS_HUGETLB = 128, + IB_UVERBS_ACCESS_RELAXED_ORDERING = 1048576, + IB_UVERBS_ACCESS_OPTIONAL_RANGE = 1072693248, +}; + +enum ib_uverbs_srq_type { + IB_UVERBS_SRQT_BASIC = 0, + IB_UVERBS_SRQT_XRC = 1, + IB_UVERBS_SRQT_TM = 2, +}; + +enum ib_uverbs_wq_type { + IB_UVERBS_WQT_RQ = 0, +}; + +enum ib_uverbs_wq_flags { + IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING = 1, + IB_UVERBS_WQ_FLAGS_SCATTER_FCS = 2, + IB_UVERBS_WQ_FLAGS_DELAY_DROP = 4, + IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING = 8, +}; + +enum ib_uverbs_qp_type { + IB_UVERBS_QPT_RC = 2, + IB_UVERBS_QPT_UC = 3, + IB_UVERBS_QPT_UD = 4, + IB_UVERBS_QPT_RAW_PACKET = 8, + IB_UVERBS_QPT_XRC_INI = 9, + IB_UVERBS_QPT_XRC_TGT = 10, + IB_UVERBS_QPT_DRIVER = 255, +}; + +enum ib_uverbs_qp_create_flags { + IB_UVERBS_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 2, + IB_UVERBS_QP_CREATE_SCATTER_FCS = 256, + IB_UVERBS_QP_CREATE_CVLAN_STRIPPING = 512, + IB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING = 2048, + IB_UVERBS_QP_CREATE_SQ_SIG_ALL = 4096, +}; + +enum ib_uverbs_gid_type { + IB_UVERBS_GID_TYPE_IB = 0, + IB_UVERBS_GID_TYPE_ROCE_V1 = 1, + IB_UVERBS_GID_TYPE_ROCE_V2 = 2, +}; + +enum ib_poll_context { + IB_POLL_SOFTIRQ = 0, + IB_POLL_WORKQUEUE = 1, + IB_POLL_UNBOUND_WORKQUEUE = 2, + IB_POLL_LAST_POOL_TYPE = 2, + IB_POLL_DIRECT = 3, +}; + +struct lsm_network_audit { + int netif; + const struct sock *sk; + u16 family; + __be16 dport; + __be16 sport; + union { + struct { + __be32 daddr; + __be32 saddr; + } v4; + struct { + struct in6_addr daddr; + struct in6_addr saddr; + } v6; + } fam; +}; + +struct lsm_ioctlop_audit { + struct path path; + u16 cmd; +}; + +struct lsm_ibpkey_audit { + u64 subnet_prefix; + u16 pkey; +}; + +struct lsm_ibendport_audit { + const char *dev_name; + u8 port; +}; + +struct selinux_state; + +struct selinux_audit_data { + u32 ssid; + u32 tsid; + u16 tclass; + u32 requested; + u32 audited; + u32 denied; + int result; + struct selinux_state *state; +}; + +struct smack_audit_data; + +struct apparmor_audit_data; + +struct common_audit_data { + char type; + union { + struct path path; + struct dentry *dentry; + struct inode *inode; + struct lsm_network_audit *net; + int cap; + int ipc_id; + struct task_struct *tsk; + struct { + key_serial_t key; + char *key_desc; + } key_struct; + char *kmod_name; + struct lsm_ioctlop_audit *op; + struct file *file; + struct lsm_ibpkey_audit *ibpkey; + struct lsm_ibendport_audit *ibendport; + int reason; + } u; + union { + struct smack_audit_data *smack_audit_data; + struct selinux_audit_data *selinux_audit_data; + struct apparmor_audit_data *apparmor_audit_data; + }; +}; + +enum { + POLICYDB_CAPABILITY_NETPEER = 0, + POLICYDB_CAPABILITY_OPENPERM = 1, + POLICYDB_CAPABILITY_EXTSOCKCLASS = 2, + POLICYDB_CAPABILITY_ALWAYSNETWORK = 3, + POLICYDB_CAPABILITY_CGROUPSECLABEL = 4, + POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION = 5, + POLICYDB_CAPABILITY_GENFS_SECLABEL_SYMLINKS = 6, + __POLICYDB_CAPABILITY_MAX = 7, +}; + +struct selinux_avc; + +struct selinux_policy; + +struct selinux_state { + bool enforcing; + bool checkreqprot; + bool initialized; + bool policycap[7]; + struct page *status_page; + struct mutex status_lock; + struct selinux_avc *avc; + struct selinux_policy *policy; + struct mutex policy_mutex; +}; + +struct avc_cache { + struct hlist_head slots[512]; + spinlock_t slots_lock[512]; + atomic_t lru_hint; + atomic_t active_nodes; + u32 latest_notif; +}; + +struct selinux_avc { + unsigned int avc_cache_threshold; + struct avc_cache avc_cache; +}; + +struct av_decision { + u32 allowed; + u32 auditallow; + u32 auditdeny; + u32 seqno; + u32 flags; +}; + +struct extended_perms_data { + u32 p[8]; +}; + +struct extended_perms_decision { + u8 used; + u8 driver; + struct extended_perms_data *allowed; + struct extended_perms_data *auditallow; + struct extended_perms_data *dontaudit; +}; + +struct extended_perms { + u16 len; + struct extended_perms_data drivers; +}; + +struct avc_cache_stats { + unsigned int lookups; + unsigned int misses; + unsigned int allocations; + unsigned int reclaims; + unsigned int frees; +}; + +struct security_class_mapping { + const char *name; + const char *perms[33]; +}; + +struct trace_event_raw_selinux_audited { + struct trace_entry ent; + u32 requested; + u32 denied; + u32 audited; + int result; + u32 __data_loc_scontext; + u32 __data_loc_tcontext; + u32 __data_loc_tclass; + char __data[0]; +}; + +struct trace_event_data_offsets_selinux_audited { + u32 scontext; + u32 tcontext; + u32 tclass; +}; + +typedef void (*btf_trace_selinux_audited)(void *, struct selinux_audit_data *, char *, char *, const char *); + +struct avc_xperms_node; + +struct avc_entry { + u32 ssid; + u32 tsid; + u16 tclass; + struct av_decision avd; + struct avc_xperms_node *xp_node; +}; + +struct avc_xperms_node { + struct extended_perms xp; + struct list_head xpd_head; +}; + +struct avc_node { + struct avc_entry ae; + struct hlist_node list; + struct callback_head rhead; +}; + +struct avc_xperms_decision_node { + struct extended_perms_decision xpd; + struct list_head xpd_list; +}; + +struct avc_callback_node { + int (*callback)(u32); + u32 events; + struct avc_callback_node *next; +}; + +typedef __u16 __sum16; + +enum sctp_endpoint_type { + SCTP_EP_TYPE_SOCKET = 0, + SCTP_EP_TYPE_ASSOCIATION = 1, +}; + +struct sctp_chunk; + +struct sctp_inq { + struct list_head in_chunk_list; + struct sctp_chunk *in_progress; + struct work_struct immediate; +}; + +struct sctp_bind_addr { + __u16 port; + struct list_head address_list; +}; + +struct sctp_ep_common { + struct hlist_node node; + int hashent; + enum sctp_endpoint_type type; + refcount_t refcnt; + bool dead; + struct sock *sk; + struct net *net; + struct sctp_inq inqueue; + struct sctp_bind_addr bind_addr; +}; + +typedef __s32 sctp_assoc_t; + +struct in_addr { + __be32 s_addr; +}; + +struct sockaddr_in { + __kernel_sa_family_t sin_family; + __be16 sin_port; + struct in_addr sin_addr; + unsigned char __pad[8]; +}; + +struct sockaddr_in6 { + short unsigned int sin6_family; + __be16 sin6_port; + __be32 sin6_flowinfo; + struct in6_addr sin6_addr; + __u32 sin6_scope_id; +}; + +union sctp_addr { + struct sockaddr_in v4; + struct sockaddr_in6 v6; + struct sockaddr sa; +}; + +struct sctp_chunkhdr { + __u8 type; + __u8 flags; + __be16 length; +}; + +struct sctp_inithdr { + __be32 init_tag; + __be32 a_rwnd; + __be16 num_outbound_streams; + __be16 num_inbound_streams; + __be32 initial_tsn; + __u8 params[0]; +}; + +struct sctp_init_chunk { + struct sctp_chunkhdr chunk_hdr; + struct sctp_inithdr init_hdr; +}; + +struct sctp_cookie { + __u32 my_vtag; + __u32 peer_vtag; + __u32 my_ttag; + __u32 peer_ttag; + ktime_t expiration; + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u32 initial_tsn; + union sctp_addr peer_addr; + __u16 my_port; + __u8 prsctp_capable; + __u8 padding; + __u32 adaptation_ind; + __u8 auth_random[36]; + __u8 auth_hmacs[10]; + __u8 auth_chunks[20]; + __u32 raw_addr_list_len; + struct sctp_init_chunk peer_init[0]; +}; + +struct sctp_tsnmap { + long unsigned int *tsn_map; + __u32 base_tsn; + __u32 cumulative_tsn_ack_point; + __u32 max_tsn_seen; + __u16 len; + __u16 pending_data; + __u16 num_dup_tsns; + __be32 dup_tsns[16]; +}; + +struct sctp_inithdr_host { + __u32 init_tag; + __u32 a_rwnd; + __u16 num_outbound_streams; + __u16 num_inbound_streams; + __u32 initial_tsn; +}; + +enum sctp_state { + SCTP_STATE_CLOSED = 0, + SCTP_STATE_COOKIE_WAIT = 1, + SCTP_STATE_COOKIE_ECHOED = 2, + SCTP_STATE_ESTABLISHED = 3, + SCTP_STATE_SHUTDOWN_PENDING = 4, + SCTP_STATE_SHUTDOWN_SENT = 5, + SCTP_STATE_SHUTDOWN_RECEIVED = 6, + SCTP_STATE_SHUTDOWN_ACK_SENT = 7, +}; + +struct sctp_stream_out_ext; + +struct sctp_stream_out { + union { + __u32 mid; + __u16 ssn; + }; + __u32 mid_uo; + struct sctp_stream_out_ext *ext; + __u8 state; +}; + +struct sctp_stream_in { + union { + __u32 mid; + __u16 ssn; + }; + __u32 mid_uo; + __u32 fsn; + __u32 fsn_uo; + char pd_mode; + char pd_mode_uo; +}; + +struct sctp_stream_interleave; + +struct sctp_stream { + struct { + struct __genradix tree; + struct sctp_stream_out type[0]; + } out; + struct { + struct __genradix tree; + struct sctp_stream_in type[0]; + } in; + __u16 outcnt; + __u16 incnt; + struct sctp_stream_out *out_curr; + union { + struct { + struct list_head prio_list; + }; + struct { + struct list_head rr_list; + struct sctp_stream_out_ext *rr_next; + }; + }; + struct sctp_stream_interleave *si; +}; + +struct sctp_sched_ops; + +struct sctp_outq { + struct sctp_association *asoc; + struct list_head out_chunk_list; + struct sctp_sched_ops *sched; + unsigned int out_qlen; + unsigned int error; + struct list_head control_chunk_list; + struct list_head sacked; + struct list_head retransmit; + struct list_head abandoned; + __u32 outstanding_bytes; + char fast_rtx; + char cork; +}; + +struct sctp_ulpq { + char pd_mode; + struct sctp_association *asoc; + struct sk_buff_head reasm; + struct sk_buff_head reasm_uo; + struct sk_buff_head lobby; +}; + +struct sctp_priv_assoc_stats { + struct __kernel_sockaddr_storage obs_rto_ipaddr; + __u64 max_obs_rto; + __u64 isacks; + __u64 osacks; + __u64 opackets; + __u64 ipackets; + __u64 rtxchunks; + __u64 outofseqtsns; + __u64 idupchunks; + __u64 gapcnt; + __u64 ouodchunks; + __u64 iuodchunks; + __u64 oodchunks; + __u64 iodchunks; + __u64 octrlchunks; + __u64 ictrlchunks; +}; + +struct sctp_endpoint; + +struct sctp_transport; + +struct sctp_random_param; + +struct sctp_chunks_param; + +struct sctp_hmac_algo_param; + +struct sctp_auth_bytes; + +struct sctp_shared_key; + +struct sctp_association { + struct sctp_ep_common base; + struct list_head asocs; + sctp_assoc_t assoc_id; + struct sctp_endpoint *ep; + struct sctp_cookie c; + struct { + struct list_head transport_addr_list; + __u32 rwnd; + __u16 transport_count; + __u16 port; + struct sctp_transport *primary_path; + union sctp_addr primary_addr; + struct sctp_transport *active_path; + struct sctp_transport *retran_path; + struct sctp_transport *last_sent_to; + struct sctp_transport *last_data_from; + struct sctp_tsnmap tsn_map; + __be16 addip_disabled_mask; + __u16 ecn_capable: 1; + __u16 ipv4_address: 1; + __u16 ipv6_address: 1; + __u16 hostname_address: 1; + __u16 asconf_capable: 1; + __u16 prsctp_capable: 1; + __u16 reconf_capable: 1; + __u16 intl_capable: 1; + __u16 auth_capable: 1; + __u16 sack_needed: 1; + __u16 sack_generation: 1; + __u16 zero_window_announced: 1; + __u32 sack_cnt; + __u32 adaptation_ind; + struct sctp_inithdr_host i; + void *cookie; + int cookie_len; + __u32 addip_serial; + struct sctp_random_param *peer_random; + struct sctp_chunks_param *peer_chunks; + struct sctp_hmac_algo_param *peer_hmacs; + } peer; + enum sctp_state state; + int overall_error_count; + ktime_t cookie_life; + long unsigned int rto_initial; + long unsigned int rto_max; + long unsigned int rto_min; + int max_burst; + int max_retrans; + __u16 pf_retrans; + __u16 ps_retrans; + __u16 max_init_attempts; + __u16 init_retries; + long unsigned int max_init_timeo; + long unsigned int hbinterval; + long unsigned int probe_interval; + __be16 encap_port; + __u16 pathmaxrxt; + __u32 flowlabel; + __u8 dscp; + __u8 pmtu_pending; + __u32 pathmtu; + __u32 param_flags; + __u32 sackfreq; + long unsigned int sackdelay; + long unsigned int timeouts[12]; + struct timer_list timers[12]; + struct sctp_transport *shutdown_last_sent_to; + struct sctp_transport *init_last_sent_to; + int shutdown_retries; + __u32 next_tsn; + __u32 ctsn_ack_point; + __u32 adv_peer_ack_point; + __u32 highest_sacked; + __u32 fast_recovery_exit; + __u8 fast_recovery; + __u16 unack_data; + __u32 rtx_data_chunks; + __u32 rwnd; + __u32 a_rwnd; + __u32 rwnd_over; + __u32 rwnd_press; + int sndbuf_used; + atomic_t rmem_alloc; + wait_queue_head_t wait; + __u32 frag_point; + __u32 user_frag; + int init_err_counter; + int init_cycle; + __u16 default_stream; + __u16 default_flags; + __u32 default_ppid; + __u32 default_context; + __u32 default_timetolive; + __u32 default_rcv_context; + struct sctp_stream stream; + struct sctp_outq outqueue; + struct sctp_ulpq ulpq; + __u32 last_ecne_tsn; + __u32 last_cwr_tsn; + int numduptsns; + struct sctp_chunk *addip_last_asconf; + struct list_head asconf_ack_list; + struct list_head addip_chunk_list; + __u32 addip_serial; + int src_out_of_asoc_ok; + union sctp_addr *asconf_addr_del_pending; + struct sctp_transport *new_transport; + struct list_head endpoint_shared_keys; + struct sctp_auth_bytes *asoc_shared_key; + struct sctp_shared_key *shkey; + __u16 default_hmac_id; + __u16 active_key_id; + __u8 need_ecne: 1; + __u8 temp: 1; + __u8 pf_expose: 2; + __u8 force_delay: 1; + __u8 strreset_enable; + __u8 strreset_outstanding; + __u32 strreset_outseq; + __u32 strreset_inseq; + __u32 strreset_result[2]; + struct sctp_chunk *strreset_chunk; + struct sctp_priv_assoc_stats stats; + int sent_cnt_removable; + __u16 subscribe; + __u64 abandoned_unsent[3]; + __u64 abandoned_sent[3]; + u32 secid; + u32 peer_secid; + struct callback_head rcu; +}; + +struct nf_hook_state; + +typedef unsigned int nf_hookfn(void *, struct sk_buff *, const struct nf_hook_state *); + +struct nf_hook_entry { + nf_hookfn *hook; + void *priv; +}; + +struct nf_hook_entries { + u16 num_hook_entries; + struct nf_hook_entry hooks[0]; +}; + +struct nf_hook_state { + u8 hook; + u8 pf; + struct net_device *in; + struct net_device *out; + struct sock *sk; + struct net *net; + int (*okfn)(struct net *, struct sock *, struct sk_buff *); +}; + +enum nf_hook_ops_type { + NF_HOOK_OP_UNDEFINED = 0, + NF_HOOK_OP_NF_TABLES = 1, +}; + +struct nf_hook_ops { + nf_hookfn *hook; + struct net_device *dev; + void *priv; + u8 pf; + enum nf_hook_ops_type hook_ops_type: 8; + unsigned int hooknum; + int priority; +}; + +enum nf_ip_hook_priorities { + NF_IP_PRI_FIRST = 2147483648, + NF_IP_PRI_RAW_BEFORE_DEFRAG = 4294966846, + NF_IP_PRI_CONNTRACK_DEFRAG = 4294966896, + NF_IP_PRI_RAW = 4294966996, + NF_IP_PRI_SELINUX_FIRST = 4294967071, + NF_IP_PRI_CONNTRACK = 4294967096, + NF_IP_PRI_MANGLE = 4294967146, + NF_IP_PRI_NAT_DST = 4294967196, + NF_IP_PRI_FILTER = 0, + NF_IP_PRI_SECURITY = 50, + NF_IP_PRI_NAT_SRC = 100, + NF_IP_PRI_SELINUX_LAST = 225, + NF_IP_PRI_CONNTRACK_HELPER = 300, + NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, + NF_IP_PRI_LAST = 2147483647, +}; + +enum nf_ip6_hook_priorities { + NF_IP6_PRI_FIRST = 2147483648, + NF_IP6_PRI_RAW_BEFORE_DEFRAG = 4294966846, + NF_IP6_PRI_CONNTRACK_DEFRAG = 4294966896, + NF_IP6_PRI_RAW = 4294966996, + NF_IP6_PRI_SELINUX_FIRST = 4294967071, + NF_IP6_PRI_CONNTRACK = 4294967096, + NF_IP6_PRI_MANGLE = 4294967146, + NF_IP6_PRI_NAT_DST = 4294967196, + NF_IP6_PRI_FILTER = 0, + NF_IP6_PRI_SECURITY = 50, + NF_IP6_PRI_NAT_SRC = 100, + NF_IP6_PRI_SELINUX_LAST = 225, + NF_IP6_PRI_CONNTRACK_HELPER = 300, + NF_IP6_PRI_LAST = 2147483647, +}; + +struct socket_alloc { + struct socket socket; + struct inode vfs_inode; + long: 64; +}; + +struct ip_options { + __be32 faddr; + __be32 nexthop; + unsigned char optlen; + unsigned char srr; + unsigned char rr; + unsigned char ts; + unsigned char is_strictroute: 1; + unsigned char srr_is_hit: 1; + unsigned char is_changed: 1; + unsigned char rr_needaddr: 1; + unsigned char ts_needtime: 1; + unsigned char ts_needaddr: 1; + unsigned char router_alert; + unsigned char cipso; + unsigned char __pad2; + unsigned char __data[0]; +}; + +struct ip_options_rcu { + struct callback_head rcu; + struct ip_options opt; +}; + +struct ipv6_opt_hdr; + +struct ipv6_rt_hdr; + +struct ipv6_txoptions { + refcount_t refcnt; + int tot_len; + __u16 opt_flen; + __u16 opt_nflen; + struct ipv6_opt_hdr *hopopt; + struct ipv6_opt_hdr *dst0opt; + struct ipv6_rt_hdr *srcrt; + struct ipv6_opt_hdr *dst1opt; + struct callback_head rcu; +}; + +struct inet_cork { + unsigned int flags; + __be32 addr; + struct ip_options *opt; + unsigned int fragsize; + int length; + struct dst_entry *dst; + u8 tx_flags; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; + u64 transmit_time; + u32 mark; +}; + +struct inet_cork_full { + struct inet_cork base; + struct flowi fl; +}; + +struct ipv6_pinfo; + +struct ip_mc_socklist; + +struct inet_sock { + struct sock sk; + struct ipv6_pinfo *pinet6; + __be32 inet_saddr; + __s16 uc_ttl; + __u16 cmsg_flags; + struct ip_options_rcu *inet_opt; + __be16 inet_sport; + __u16 inet_id; + __u8 tos; + __u8 min_ttl; + __u8 mc_ttl; + __u8 pmtudisc; + __u8 recverr: 1; + __u8 is_icsk: 1; + __u8 freebind: 1; + __u8 hdrincl: 1; + __u8 mc_loop: 1; + __u8 transparent: 1; + __u8 mc_all: 1; + __u8 nodefrag: 1; + __u8 bind_address_no_port: 1; + __u8 recverr_rfc4884: 1; + __u8 defer_connect: 1; + __u8 rcv_tos; + __u8 convert_csum; + int uc_index; + int mc_index; + __be32 mc_addr; + struct ip_mc_socklist *mc_list; + struct inet_cork_full cork; +}; + +struct in6_pktinfo { + struct in6_addr ipi6_addr; + int ipi6_ifindex; +}; + +struct inet6_cork { + struct ipv6_txoptions *opt; + u8 hop_limit; + u8 tclass; +}; + +struct ipv6_mc_socklist; + +struct ipv6_ac_socklist; + +struct ipv6_fl_socklist; + +struct ipv6_pinfo { + struct in6_addr saddr; + struct in6_pktinfo sticky_pktinfo; + const struct in6_addr *daddr_cache; + const struct in6_addr *saddr_cache; + __be32 flow_label; + __u32 frag_size; + __u16 __unused_1: 7; + __s16 hop_limit: 9; + __u16 mc_loop: 1; + __u16 __unused_2: 6; + __s16 mcast_hops: 9; + int ucast_oif; + int mcast_oif; + union { + struct { + __u16 srcrt: 1; + __u16 osrcrt: 1; + __u16 rxinfo: 1; + __u16 rxoinfo: 1; + __u16 rxhlim: 1; + __u16 rxohlim: 1; + __u16 hopopts: 1; + __u16 ohopopts: 1; + __u16 dstopts: 1; + __u16 odstopts: 1; + __u16 rxflow: 1; + __u16 rxtclass: 1; + __u16 rxpmtu: 1; + __u16 rxorigdstaddr: 1; + __u16 recvfragsize: 1; + } bits; + __u16 all; + } rxopt; + __u16 recverr: 1; + __u16 sndflow: 1; + __u16 repflow: 1; + __u16 pmtudisc: 3; + __u16 padding: 1; + __u16 srcprefs: 3; + __u16 dontfrag: 1; + __u16 autoflowlabel: 1; + __u16 autoflowlabel_set: 1; + __u16 mc_all: 1; + __u16 recverr_rfc4884: 1; + __u16 rtalert_isolate: 1; + __u8 min_hopcount; + __u8 tclass; + __be32 rcv_flowinfo; + __u32 dst_cookie; + struct ipv6_mc_socklist *ipv6_mc_list; + struct ipv6_ac_socklist *ipv6_ac_list; + struct ipv6_fl_socklist *ipv6_fl_list; + struct ipv6_txoptions *opt; + struct sk_buff *pktoptions; + struct sk_buff *rxpmtu; + struct inet6_cork cork; +}; + +struct tcphdr { + __be16 source; + __be16 dest; + __be32 seq; + __be32 ack_seq; + __u16 res1: 4; + __u16 doff: 4; + __u16 fin: 1; + __u16 syn: 1; + __u16 rst: 1; + __u16 psh: 1; + __u16 ack: 1; + __u16 urg: 1; + __u16 ece: 1; + __u16 cwr: 1; + __be16 window; + __sum16 check; + __be16 urg_ptr; +}; + +struct iphdr { + __u8 ihl: 4; + __u8 version: 4; + __u8 tos; + __be16 tot_len; + __be16 id; + __be16 frag_off; + __u8 ttl; + __u8 protocol; + __sum16 check; + __be32 saddr; + __be32 daddr; +}; + +struct ipv6_rt_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; +}; + +struct ipv6_opt_hdr { + __u8 nexthdr; + __u8 hdrlen; +}; + +struct ipv6hdr { + __u8 priority: 4; + __u8 version: 4; + __u8 flow_lbl[3]; + __be16 payload_len; + __u8 nexthdr; + __u8 hop_limit; + struct in6_addr saddr; + struct in6_addr daddr; +}; + +struct udphdr { + __be16 source; + __be16 dest; + __be16 len; + __sum16 check; +}; + +struct inet6_skb_parm { + int iif; + __be16 ra; + __u16 dst0; + __u16 srcrt; + __u16 dst1; + __u16 lastopt; + __u16 nhoff; + __u16 flags; + __u16 dsthao; + __u16 frag_max_size; + __u16 srhoff; +}; + +struct ip6_sf_socklist; + +struct ipv6_mc_socklist { + struct in6_addr addr; + int ifindex; + unsigned int sfmode; + struct ipv6_mc_socklist *next; + struct ip6_sf_socklist *sflist; + struct callback_head rcu; +}; + +struct ipv6_ac_socklist { + struct in6_addr acl_addr; + int acl_ifindex; + struct ipv6_ac_socklist *acl_next; +}; + +struct ip6_flowlabel; + +struct ipv6_fl_socklist { + struct ipv6_fl_socklist *next; + struct ip6_flowlabel *fl; + struct callback_head rcu; +}; + +struct ip6_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + struct in6_addr sl_addr[0]; +}; + +struct ip6_flowlabel { + struct ip6_flowlabel *next; + __be32 label; + atomic_t users; + struct in6_addr dst; + struct ipv6_txoptions *opt; + long unsigned int linger; + struct callback_head rcu; + u8 share; + union { + struct pid *pid; + kuid_t uid; + } owner; + long unsigned int lastuse; + long unsigned int expires; + struct net *fl_net; +}; + +struct inet_skb_parm { + int iif; + struct ip_options opt; + u16 flags; + u16 frag_max_size; +}; + +struct tty_file_private { + struct tty_struct *tty; + struct file *file; + struct list_head list; +}; + +struct netlbl_lsm_cache { + refcount_t refcount; + void (*free)(const void *); + void *data; +}; + +struct netlbl_lsm_catmap { + u32 startbit; + u64 bitmap[4]; + struct netlbl_lsm_catmap *next; +}; + +struct netlbl_lsm_secattr { + u32 flags; + u32 type; + char *domain; + struct netlbl_lsm_cache *cache; + struct { + struct { + struct netlbl_lsm_catmap *cat; + u32 lvl; + } mls; + u32 secid; + } attr; +}; + +struct dccp_hdr { + __be16 dccph_sport; + __be16 dccph_dport; + __u8 dccph_doff; + __u8 dccph_cscov: 4; + __u8 dccph_ccval: 4; + __sum16 dccph_checksum; + __u8 dccph_x: 1; + __u8 dccph_type: 4; + __u8 dccph_reserved: 3; + __u8 dccph_seq2; + __be16 dccph_seq; +}; + +enum dccp_state { + DCCP_OPEN = 1, + DCCP_REQUESTING = 2, + DCCP_LISTEN = 10, + DCCP_RESPOND = 3, + DCCP_ACTIVE_CLOSEREQ = 4, + DCCP_PASSIVE_CLOSE = 8, + DCCP_CLOSING = 11, + DCCP_TIME_WAIT = 6, + DCCP_CLOSED = 7, + DCCP_NEW_SYN_RECV = 12, + DCCP_PARTOPEN = 13, + DCCP_PASSIVE_CLOSEREQ = 14, + DCCP_MAX_STATES = 15, +}; + +enum sctp_msg_flags { + MSG_NOTIFICATION = 32768, +}; + +struct sctp_initmsg { + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u16 sinit_max_attempts; + __u16 sinit_max_init_timeo; +}; + +struct sctp_sndrcvinfo { + __u16 sinfo_stream; + __u16 sinfo_ssn; + __u16 sinfo_flags; + __u32 sinfo_ppid; + __u32 sinfo_context; + __u32 sinfo_timetolive; + __u32 sinfo_tsn; + __u32 sinfo_cumtsn; + sctp_assoc_t sinfo_assoc_id; +}; + +struct sctp_rtoinfo { + sctp_assoc_t srto_assoc_id; + __u32 srto_initial; + __u32 srto_max; + __u32 srto_min; +}; + +struct sctp_assocparams { + sctp_assoc_t sasoc_assoc_id; + __u16 sasoc_asocmaxrxt; + __u16 sasoc_number_peer_destinations; + __u32 sasoc_peer_rwnd; + __u32 sasoc_local_rwnd; + __u32 sasoc_cookie_life; +}; + +struct sctp_paddrparams { + sctp_assoc_t spp_assoc_id; + struct __kernel_sockaddr_storage spp_address; + __u32 spp_hbinterval; + __u16 spp_pathmaxrxt; + __u32 spp_pathmtu; + __u32 spp_sackdelay; + __u32 spp_flags; + __u32 spp_ipv6_flowlabel; + __u8 spp_dscp; + char: 8; +} __attribute__((packed)); + +struct sctphdr { + __be16 source; + __be16 dest; + __be32 vtag; + __le32 checksum; +}; + +enum sctp_cid { + SCTP_CID_DATA = 0, + SCTP_CID_INIT = 1, + SCTP_CID_INIT_ACK = 2, + SCTP_CID_SACK = 3, + SCTP_CID_HEARTBEAT = 4, + SCTP_CID_HEARTBEAT_ACK = 5, + SCTP_CID_ABORT = 6, + SCTP_CID_SHUTDOWN = 7, + SCTP_CID_SHUTDOWN_ACK = 8, + SCTP_CID_ERROR = 9, + SCTP_CID_COOKIE_ECHO = 10, + SCTP_CID_COOKIE_ACK = 11, + SCTP_CID_ECN_ECNE = 12, + SCTP_CID_ECN_CWR = 13, + SCTP_CID_SHUTDOWN_COMPLETE = 14, + SCTP_CID_AUTH = 15, + SCTP_CID_I_DATA = 64, + SCTP_CID_FWD_TSN = 192, + SCTP_CID_ASCONF = 193, + SCTP_CID_I_FWD_TSN = 194, + SCTP_CID_ASCONF_ACK = 128, + SCTP_CID_RECONF = 130, + SCTP_CID_PAD = 132, +}; + +struct sctp_paramhdr { + __be16 type; + __be16 length; +}; + +enum sctp_param { + SCTP_PARAM_HEARTBEAT_INFO = 256, + SCTP_PARAM_IPV4_ADDRESS = 1280, + SCTP_PARAM_IPV6_ADDRESS = 1536, + SCTP_PARAM_STATE_COOKIE = 1792, + SCTP_PARAM_UNRECOGNIZED_PARAMETERS = 2048, + SCTP_PARAM_COOKIE_PRESERVATIVE = 2304, + SCTP_PARAM_HOST_NAME_ADDRESS = 2816, + SCTP_PARAM_SUPPORTED_ADDRESS_TYPES = 3072, + SCTP_PARAM_ECN_CAPABLE = 128, + SCTP_PARAM_RANDOM = 640, + SCTP_PARAM_CHUNKS = 896, + SCTP_PARAM_HMAC_ALGO = 1152, + SCTP_PARAM_SUPPORTED_EXT = 2176, + SCTP_PARAM_FWD_TSN_SUPPORT = 192, + SCTP_PARAM_ADD_IP = 448, + SCTP_PARAM_DEL_IP = 704, + SCTP_PARAM_ERR_CAUSE = 960, + SCTP_PARAM_SET_PRIMARY = 1216, + SCTP_PARAM_SUCCESS_REPORT = 1472, + SCTP_PARAM_ADAPTATION_LAYER_IND = 1728, + SCTP_PARAM_RESET_OUT_REQUEST = 3328, + SCTP_PARAM_RESET_IN_REQUEST = 3584, + SCTP_PARAM_RESET_TSN_REQUEST = 3840, + SCTP_PARAM_RESET_RESPONSE = 4096, + SCTP_PARAM_RESET_ADD_OUT_STREAMS = 4352, + SCTP_PARAM_RESET_ADD_IN_STREAMS = 4608, +}; + +struct sctp_datahdr { + __be32 tsn; + __be16 stream; + __be16 ssn; + __u32 ppid; + __u8 payload[0]; +}; + +struct sctp_idatahdr { + __be32 tsn; + __be16 stream; + __be16 reserved; + __be32 mid; + union { + __u32 ppid; + __be32 fsn; + }; + __u8 payload[0]; +}; + +struct sctp_ipv4addr_param { + struct sctp_paramhdr param_hdr; + struct in_addr addr; +}; + +struct sctp_ipv6addr_param { + struct sctp_paramhdr param_hdr; + struct in6_addr addr; +}; + +struct sctp_cookie_preserve_param { + struct sctp_paramhdr param_hdr; + __be32 lifespan_increment; +}; + +struct sctp_hostname_param { + struct sctp_paramhdr param_hdr; + uint8_t hostname[0]; +}; + +struct sctp_supported_addrs_param { + struct sctp_paramhdr param_hdr; + __be16 types[0]; +}; + +struct sctp_adaptation_ind_param { + struct sctp_paramhdr param_hdr; + __be32 adaptation_ind; +}; + +struct sctp_supported_ext_param { + struct sctp_paramhdr param_hdr; + __u8 chunks[0]; +}; + +struct sctp_random_param { + struct sctp_paramhdr param_hdr; + __u8 random_val[0]; +}; + +struct sctp_chunks_param { + struct sctp_paramhdr param_hdr; + __u8 chunks[0]; +}; + +struct sctp_hmac_algo_param { + struct sctp_paramhdr param_hdr; + __be16 hmac_ids[0]; +}; + +struct sctp_cookie_param { + struct sctp_paramhdr p; + __u8 body[0]; +}; + +struct sctp_gap_ack_block { + __be16 start; + __be16 end; +}; + +union sctp_sack_variable { + struct sctp_gap_ack_block gab; + __be32 dup; +}; + +struct sctp_sackhdr { + __be32 cum_tsn_ack; + __be32 a_rwnd; + __be16 num_gap_ack_blocks; + __be16 num_dup_tsns; + union sctp_sack_variable variable[0]; +}; + +struct sctp_heartbeathdr { + struct sctp_paramhdr info; +}; + +struct sctp_shutdownhdr { + __be32 cum_tsn_ack; +}; + +struct sctp_errhdr { + __be16 cause; + __be16 length; + __u8 variable[0]; +}; + +struct sctp_ecnehdr { + __be32 lowest_tsn; +}; + +struct sctp_cwrhdr { + __be32 lowest_tsn; +}; + +struct sctp_fwdtsn_skip { + __be16 stream; + __be16 ssn; +}; + +struct sctp_fwdtsn_hdr { + __be32 new_cum_tsn; + struct sctp_fwdtsn_skip skip[0]; +}; + +struct sctp_ifwdtsn_skip { + __be16 stream; + __u8 reserved; + __u8 flags; + __be32 mid; +}; + +struct sctp_ifwdtsn_hdr { + __be32 new_cum_tsn; + struct sctp_ifwdtsn_skip skip[0]; +}; + +struct sctp_addip_param { + struct sctp_paramhdr param_hdr; + __be32 crr_id; +}; + +struct sctp_addiphdr { + __be32 serial; + __u8 params[0]; +}; + +struct sctp_authhdr { + __be16 shkey_id; + __be16 hmac_id; + __u8 hmac[0]; +}; + +struct sctp_auth_bytes { + refcount_t refcnt; + __u32 len; + __u8 data[0]; +}; + +struct sctp_shared_key { + struct list_head key_list; + struct sctp_auth_bytes *key; + refcount_t refcnt; + __u16 key_id; + __u8 deactivated; +}; + +enum { + SCTP_MAX_STREAM = 65535, +}; + +enum sctp_event_timeout { + SCTP_EVENT_TIMEOUT_NONE = 0, + SCTP_EVENT_TIMEOUT_T1_COOKIE = 1, + SCTP_EVENT_TIMEOUT_T1_INIT = 2, + SCTP_EVENT_TIMEOUT_T2_SHUTDOWN = 3, + SCTP_EVENT_TIMEOUT_T3_RTX = 4, + SCTP_EVENT_TIMEOUT_T4_RTO = 5, + SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD = 6, + SCTP_EVENT_TIMEOUT_HEARTBEAT = 7, + SCTP_EVENT_TIMEOUT_RECONF = 8, + SCTP_EVENT_TIMEOUT_PROBE = 9, + SCTP_EVENT_TIMEOUT_SACK = 10, + SCTP_EVENT_TIMEOUT_AUTOCLOSE = 11, +}; + +enum { + SCTP_MAX_DUP_TSNS = 16, +}; + +enum sctp_scope { + SCTP_SCOPE_GLOBAL = 0, + SCTP_SCOPE_PRIVATE = 1, + SCTP_SCOPE_LINK = 2, + SCTP_SCOPE_LOOPBACK = 3, + SCTP_SCOPE_UNUSABLE = 4, +}; + +enum { + SCTP_AUTH_HMAC_ID_RESERVED_0 = 0, + SCTP_AUTH_HMAC_ID_SHA1 = 1, + SCTP_AUTH_HMAC_ID_RESERVED_2 = 2, + SCTP_AUTH_HMAC_ID_SHA256 = 3, + __SCTP_AUTH_HMAC_MAX = 4, +}; + +struct sctp_ulpevent { + struct sctp_association *asoc; + struct sctp_chunk *chunk; + unsigned int rmem_len; + union { + __u32 mid; + __u16 ssn; + }; + union { + __u32 ppid; + __u32 fsn; + }; + __u32 tsn; + __u32 cumtsn; + __u16 stream; + __u16 flags; + __u16 msg_flags; +} __attribute__((packed)); + +union sctp_addr_param; + +union sctp_params { + void *v; + struct sctp_paramhdr *p; + struct sctp_cookie_preserve_param *life; + struct sctp_hostname_param *dns; + struct sctp_cookie_param *cookie; + struct sctp_supported_addrs_param *sat; + struct sctp_ipv4addr_param *v4; + struct sctp_ipv6addr_param *v6; + union sctp_addr_param *addr; + struct sctp_adaptation_ind_param *aind; + struct sctp_supported_ext_param *ext; + struct sctp_random_param *random; + struct sctp_chunks_param *chunks; + struct sctp_hmac_algo_param *hmac_algo; + struct sctp_addip_param *addip; +}; + +struct sctp_sender_hb_info; + +struct sctp_signed_cookie; + +struct sctp_datamsg; + +struct sctp_chunk { + struct list_head list; + refcount_t refcnt; + int sent_count; + union { + struct list_head transmitted_list; + struct list_head stream_list; + }; + struct list_head frag_list; + struct sk_buff *skb; + union { + struct sk_buff *head_skb; + struct sctp_shared_key *shkey; + }; + union sctp_params param_hdr; + union { + __u8 *v; + struct sctp_datahdr *data_hdr; + struct sctp_inithdr *init_hdr; + struct sctp_sackhdr *sack_hdr; + struct sctp_heartbeathdr *hb_hdr; + struct sctp_sender_hb_info *hbs_hdr; + struct sctp_shutdownhdr *shutdown_hdr; + struct sctp_signed_cookie *cookie_hdr; + struct sctp_ecnehdr *ecne_hdr; + struct sctp_cwrhdr *ecn_cwr_hdr; + struct sctp_errhdr *err_hdr; + struct sctp_addiphdr *addip_hdr; + struct sctp_fwdtsn_hdr *fwdtsn_hdr; + struct sctp_authhdr *auth_hdr; + struct sctp_idatahdr *idata_hdr; + struct sctp_ifwdtsn_hdr *ifwdtsn_hdr; + } subh; + __u8 *chunk_end; + struct sctp_chunkhdr *chunk_hdr; + struct sctphdr *sctp_hdr; + struct sctp_sndrcvinfo sinfo; + struct sctp_association *asoc; + struct sctp_ep_common *rcvr; + long unsigned int sent_at; + union sctp_addr source; + union sctp_addr dest; + struct sctp_datamsg *msg; + struct sctp_transport *transport; + struct sk_buff *auth_chunk; + __u16 rtt_in_progress: 1; + __u16 has_tsn: 1; + __u16 has_ssn: 1; + __u16 singleton: 1; + __u16 end_of_packet: 1; + __u16 ecn_ce_done: 1; + __u16 pdiscard: 1; + __u16 tsn_gap_acked: 1; + __u16 data_accepted: 1; + __u16 auth: 1; + __u16 has_asconf: 1; + __u16 pmtu_probe: 1; + __u16 tsn_missing_report: 2; + __u16 fast_retransmit: 2; +}; + +struct sctp_stream_interleave { + __u16 data_chunk_len; + __u16 ftsn_chunk_len; + struct sctp_chunk * (*make_datafrag)(const struct sctp_association *, const struct sctp_sndrcvinfo *, int, __u8, gfp_t); + void (*assign_number)(struct sctp_chunk *); + bool (*validate_data)(struct sctp_chunk *); + int (*ulpevent_data)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); + int (*enqueue_event)(struct sctp_ulpq *, struct sctp_ulpevent *); + void (*renege_events)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); + void (*start_pd)(struct sctp_ulpq *, gfp_t); + void (*abort_pd)(struct sctp_ulpq *, gfp_t); + void (*generate_ftsn)(struct sctp_outq *, __u32); + bool (*validate_ftsn)(struct sctp_chunk *); + void (*report_ftsn)(struct sctp_ulpq *, __u32); + void (*handle_ftsn)(struct sctp_ulpq *, struct sctp_chunk *); +}; + +struct sctp_bind_bucket { + short unsigned int port; + signed char fastreuse; + signed char fastreuseport; + kuid_t fastuid; + struct hlist_node node; + struct hlist_head owner; + struct net *net; +}; + +enum sctp_socket_type { + SCTP_SOCKET_UDP = 0, + SCTP_SOCKET_UDP_HIGH_BANDWIDTH = 1, + SCTP_SOCKET_TCP = 2, +}; + +struct sctp_pf; + +struct sctp_sock { + struct inet_sock inet; + enum sctp_socket_type type; + int: 32; + struct sctp_pf *pf; + struct crypto_shash *hmac; + char *sctp_hmac_alg; + struct sctp_endpoint *ep; + struct sctp_bind_bucket *bind_hash; + __u16 default_stream; + short: 16; + __u32 default_ppid; + __u16 default_flags; + short: 16; + __u32 default_context; + __u32 default_timetolive; + __u32 default_rcv_context; + int max_burst; + __u32 hbinterval; + __u32 probe_interval; + __be16 udp_port; + __be16 encap_port; + __u16 pathmaxrxt; + short: 16; + __u32 flowlabel; + __u8 dscp; + char: 8; + __u16 pf_retrans; + __u16 ps_retrans; + short: 16; + __u32 pathmtu; + __u32 sackdelay; + __u32 sackfreq; + __u32 param_flags; + __u32 default_ss; + struct sctp_rtoinfo rtoinfo; + struct sctp_paddrparams paddrparam; + struct sctp_assocparams assocparams; + __u16 subscribe; + struct sctp_initmsg initmsg; + short: 16; + int user_frag; + __u32 autoclose; + __u32 adaptation_ind; + __u32 pd_point; + __u16 nodelay: 1; + __u16 pf_expose: 2; + __u16 reuse: 1; + __u16 disable_fragments: 1; + __u16 v4mapped: 1; + __u16 frag_interleave: 1; + __u16 recvrcvinfo: 1; + __u16 recvnxtinfo: 1; + __u16 data_ready_signalled: 1; + int: 22; + atomic_t pd_mode; + struct sk_buff_head pd_lobby; + struct list_head auto_asconf_list; + int do_auto_asconf; + int: 32; +} __attribute__((packed)); + +struct sctp_af; + +struct sctp_pf { + void (*event_msgname)(struct sctp_ulpevent *, char *, int *); + void (*skb_msgname)(struct sk_buff *, char *, int *); + int (*af_supported)(sa_family_t, struct sctp_sock *); + int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *, struct sctp_sock *); + int (*bind_verify)(struct sctp_sock *, union sctp_addr *); + int (*send_verify)(struct sctp_sock *, union sctp_addr *); + int (*supported_addrs)(const struct sctp_sock *, __be16 *); + struct sock * (*create_accept_sk)(struct sock *, struct sctp_association *, bool); + int (*addr_to_user)(struct sctp_sock *, union sctp_addr *); + void (*to_sk_saddr)(union sctp_addr *, struct sock *); + void (*to_sk_daddr)(union sctp_addr *, struct sock *); + void (*copy_ip_options)(struct sock *, struct sock *); + struct sctp_af *af; +}; + +struct sctp_endpoint { + struct sctp_ep_common base; + struct list_head asocs; + __u8 secret_key[32]; + __u8 *digest; + __u32 sndbuf_policy; + __u32 rcvbuf_policy; + struct crypto_shash **auth_hmacs; + struct sctp_hmac_algo_param *auth_hmacs_list; + struct sctp_chunks_param *auth_chunk_list; + struct list_head endpoint_shared_keys; + __u16 active_key_id; + __u8 ecn_enable: 1; + __u8 auth_enable: 1; + __u8 intl_enable: 1; + __u8 prsctp_enable: 1; + __u8 asconf_enable: 1; + __u8 reconf_enable: 1; + __u8 strreset_enable; + struct callback_head rcu; +}; + +struct sctp_signed_cookie { + __u8 signature[32]; + __u32 __pad; + struct sctp_cookie c; +} __attribute__((packed)); + +union sctp_addr_param { + struct sctp_paramhdr p; + struct sctp_ipv4addr_param v4; + struct sctp_ipv6addr_param v6; +}; + +struct sctp_sender_hb_info { + struct sctp_paramhdr param_hdr; + union sctp_addr daddr; + long unsigned int sent_at; + __u64 hb_nonce; + __u32 probe_size; +}; + +struct sctp_af { + int (*sctp_xmit)(struct sk_buff *, struct sctp_transport *); + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*get_dst)(struct sctp_transport *, union sctp_addr *, struct flowi *, struct sock *); + void (*get_saddr)(struct sctp_sock *, struct sctp_transport *, struct flowi *); + void (*copy_addrlist)(struct list_head *, struct net_device *); + int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *); + void (*addr_copy)(union sctp_addr *, union sctp_addr *); + void (*from_skb)(union sctp_addr *, struct sk_buff *, int); + void (*from_sk)(union sctp_addr *, struct sock *); + bool (*from_addr_param)(union sctp_addr *, union sctp_addr_param *, __be16, int); + int (*to_addr_param)(const union sctp_addr *, union sctp_addr_param *); + int (*addr_valid)(union sctp_addr *, struct sctp_sock *, const struct sk_buff *); + enum sctp_scope (*scope)(union sctp_addr *); + void (*inaddr_any)(union sctp_addr *, __be16); + int (*is_any)(const union sctp_addr *); + int (*available)(union sctp_addr *, struct sctp_sock *); + int (*skb_iif)(const struct sk_buff *); + int (*is_ce)(const struct sk_buff *); + void (*seq_dump_addr)(struct seq_file *, union sctp_addr *); + void (*ecn_capable)(struct sock *); + __u16 net_header_len; + int sockaddr_len; + int (*ip_options_len)(struct sock *); + sa_family_t sa_family; + struct list_head list; +}; + +struct sctp_packet { + __u16 source_port; + __u16 destination_port; + __u32 vtag; + struct list_head chunk_list; + size_t overhead; + size_t size; + size_t max_size; + struct sctp_transport *transport; + struct sctp_chunk *auth; + u8 has_cookie_echo: 1; + u8 has_sack: 1; + u8 has_auth: 1; + u8 has_data: 1; + u8 ipfragok: 1; +}; + +struct sctp_transport { + struct list_head transports; + struct rhlist_head node; + refcount_t refcnt; + __u32 rto_pending: 1; + __u32 hb_sent: 1; + __u32 pmtu_pending: 1; + __u32 dst_pending_confirm: 1; + __u32 sack_generation: 1; + u32 dst_cookie; + struct flowi fl; + union sctp_addr ipaddr; + struct sctp_af *af_specific; + struct sctp_association *asoc; + long unsigned int rto; + __u32 rtt; + __u32 rttvar; + __u32 srtt; + __u32 cwnd; + __u32 ssthresh; + __u32 partial_bytes_acked; + __u32 flight_size; + __u32 burst_limited; + struct dst_entry *dst; + union sctp_addr saddr; + long unsigned int hbinterval; + long unsigned int probe_interval; + long unsigned int sackdelay; + __u32 sackfreq; + atomic_t mtu_info; + ktime_t last_time_heard; + long unsigned int last_time_sent; + long unsigned int last_time_ecne_reduced; + __be16 encap_port; + __u16 pathmaxrxt; + __u32 flowlabel; + __u8 dscp; + __u16 pf_retrans; + __u16 ps_retrans; + __u32 pathmtu; + __u32 param_flags; + int init_sent_count; + int state; + short unsigned int error_count; + struct timer_list T3_rtx_timer; + struct timer_list hb_timer; + struct timer_list proto_unreach_timer; + struct timer_list reconf_timer; + struct timer_list probe_timer; + struct list_head transmitted; + struct sctp_packet packet; + struct list_head send_ready; + struct { + __u32 next_tsn_at_change; + char changeover_active; + char cycling_changeover; + char cacc_saw_newack; + } cacc; + struct { + __u32 last_rtx_chunks; + __u16 pmtu; + __u16 probe_size; + __u16 probe_high; + __u8 probe_count: 3; + __u8 raise_count: 5; + __u8 state; + } pl; + __u64 hb_nonce; + struct callback_head rcu; +}; + +struct sctp_datamsg { + struct list_head chunks; + refcount_t refcnt; + long unsigned int expires_at; + int send_error; + u8 send_failed: 1; + u8 can_delay: 1; + u8 abandoned: 1; +}; + +struct sctp_stream_priorities { + struct list_head prio_sched; + struct list_head active; + struct sctp_stream_out_ext *next; + __u16 prio; +}; + +struct sctp_stream_out_ext { + __u64 abandoned_unsent[3]; + __u64 abandoned_sent[3]; + struct list_head outq; + union { + struct { + struct list_head prio_list; + struct sctp_stream_priorities *prio_head; + }; + struct { + struct list_head rr_list; + }; + }; +}; + +struct task_security_struct { + u32 osid; + u32 sid; + u32 exec_sid; + u32 create_sid; + u32 keycreate_sid; + u32 sockcreate_sid; +}; + +enum label_initialized { + LABEL_INVALID = 0, + LABEL_INITIALIZED = 1, + LABEL_PENDING = 2, +}; + +struct inode_security_struct { + struct inode *inode; + struct list_head list; + u32 task_sid; + u32 sid; + u16 sclass; + unsigned char initialized; + spinlock_t lock; +}; + +struct file_security_struct { + u32 sid; + u32 fown_sid; + u32 isid; + u32 pseqno; +}; + +struct superblock_security_struct { + u32 sid; + u32 def_sid; + u32 mntpoint_sid; + short unsigned int behavior; + short unsigned int flags; + struct mutex lock; + struct list_head isec_head; + spinlock_t isec_lock; +}; + +struct msg_security_struct { + u32 sid; +}; + +struct ipc_security_struct { + u16 sclass; + u32 sid; +}; + +struct sk_security_struct { + enum { + NLBL_UNSET = 0, + NLBL_REQUIRE = 1, + NLBL_LABELED = 2, + NLBL_REQSKB = 3, + NLBL_CONNLABELED = 4, + } nlbl_state; + struct netlbl_lsm_secattr *nlbl_secattr; + u32 sid; + u32 peer_sid; + u16 sclass; + enum { + SCTP_ASSOC_UNSET = 0, + SCTP_ASSOC_SET = 1, + } sctp_assoc_state; +}; + +struct tun_security_struct { + u32 sid; +}; + +struct key_security_struct { + u32 sid; +}; + +struct ib_security_struct { + u32 sid; +}; + +struct bpf_security_struct { + u32 sid; +}; + +struct perf_event_security_struct { + u32 sid; +}; + +struct selinux_mnt_opts { + const char *fscontext; + const char *context; + const char *rootcontext; + const char *defcontext; +}; + +enum { + Opt_error___2 = 4294967295, + Opt_context = 0, + Opt_defcontext = 1, + Opt_fscontext = 2, + Opt_rootcontext = 3, + Opt_seclabel = 4, +}; + +struct selinux_policy_convert_data; + +struct selinux_load_state { + struct selinux_policy *policy; + struct selinux_policy_convert_data *convert_data; +}; + +enum sel_inos { + SEL_ROOT_INO = 2, + SEL_LOAD = 3, + SEL_ENFORCE = 4, + SEL_CONTEXT = 5, + SEL_ACCESS = 6, + SEL_CREATE = 7, + SEL_RELABEL = 8, + SEL_USER = 9, + SEL_POLICYVERS = 10, + SEL_COMMIT_BOOLS = 11, + SEL_MLS = 12, + SEL_DISABLE = 13, + SEL_MEMBER = 14, + SEL_CHECKREQPROT = 15, + SEL_COMPAT_NET = 16, + SEL_REJECT_UNKNOWN = 17, + SEL_DENY_UNKNOWN = 18, + SEL_STATUS = 19, + SEL_POLICY = 20, + SEL_VALIDATE_TRANS = 21, + SEL_INO_NEXT = 22, +}; + +struct selinux_fs_info { + struct dentry *bool_dir; + unsigned int bool_num; + char **bool_pending_names; + unsigned int *bool_pending_values; + struct dentry *class_dir; + long unsigned int last_class_ino; + bool policy_opened; + struct dentry *policycap_dir; + long unsigned int last_ino; + struct selinux_state *state; + struct super_block *sb; +}; + +struct policy_load_memory { + size_t len; + void *data; +}; + +enum { + SELNL_MSG_SETENFORCE = 16, + SELNL_MSG_POLICYLOAD = 17, + SELNL_MSG_MAX = 18, +}; + +enum selinux_nlgroups { + SELNLGRP_NONE = 0, + SELNLGRP_AVC = 1, + __SELNLGRP_MAX = 2, +}; + +struct selnl_msg_setenforce { + __s32 val; +}; + +struct selnl_msg_policyload { + __u32 seqno; +}; + +enum { + XFRM_MSG_BASE = 16, + XFRM_MSG_NEWSA = 16, + XFRM_MSG_DELSA = 17, + XFRM_MSG_GETSA = 18, + XFRM_MSG_NEWPOLICY = 19, + XFRM_MSG_DELPOLICY = 20, + XFRM_MSG_GETPOLICY = 21, + XFRM_MSG_ALLOCSPI = 22, + XFRM_MSG_ACQUIRE = 23, + XFRM_MSG_EXPIRE = 24, + XFRM_MSG_UPDPOLICY = 25, + XFRM_MSG_UPDSA = 26, + XFRM_MSG_POLEXPIRE = 27, + XFRM_MSG_FLUSHSA = 28, + XFRM_MSG_FLUSHPOLICY = 29, + XFRM_MSG_NEWAE = 30, + XFRM_MSG_GETAE = 31, + XFRM_MSG_REPORT = 32, + XFRM_MSG_MIGRATE = 33, + XFRM_MSG_NEWSADINFO = 34, + XFRM_MSG_GETSADINFO = 35, + XFRM_MSG_NEWSPDINFO = 36, + XFRM_MSG_GETSPDINFO = 37, + XFRM_MSG_MAPPING = 38, + XFRM_MSG_SETDEFAULT = 39, + XFRM_MSG_GETDEFAULT = 40, + __XFRM_MSG_MAX = 41, +}; + +enum { + RTM_BASE = 16, + RTM_NEWLINK = 16, + RTM_DELLINK = 17, + RTM_GETLINK = 18, + RTM_SETLINK = 19, + RTM_NEWADDR = 20, + RTM_DELADDR = 21, + RTM_GETADDR = 22, + RTM_NEWROUTE = 24, + RTM_DELROUTE = 25, + RTM_GETROUTE = 26, + RTM_NEWNEIGH = 28, + RTM_DELNEIGH = 29, + RTM_GETNEIGH = 30, + RTM_NEWRULE = 32, + RTM_DELRULE = 33, + RTM_GETRULE = 34, + RTM_NEWQDISC = 36, + RTM_DELQDISC = 37, + RTM_GETQDISC = 38, + RTM_NEWTCLASS = 40, + RTM_DELTCLASS = 41, + RTM_GETTCLASS = 42, + RTM_NEWTFILTER = 44, + RTM_DELTFILTER = 45, + RTM_GETTFILTER = 46, + RTM_NEWACTION = 48, + RTM_DELACTION = 49, + RTM_GETACTION = 50, + RTM_NEWPREFIX = 52, + RTM_GETMULTICAST = 58, + RTM_GETANYCAST = 62, + RTM_NEWNEIGHTBL = 64, + RTM_GETNEIGHTBL = 66, + RTM_SETNEIGHTBL = 67, + RTM_NEWNDUSEROPT = 68, + RTM_NEWADDRLABEL = 72, + RTM_DELADDRLABEL = 73, + RTM_GETADDRLABEL = 74, + RTM_GETDCB = 78, + RTM_SETDCB = 79, + RTM_NEWNETCONF = 80, + RTM_DELNETCONF = 81, + RTM_GETNETCONF = 82, + RTM_NEWMDB = 84, + RTM_DELMDB = 85, + RTM_GETMDB = 86, + RTM_NEWNSID = 88, + RTM_DELNSID = 89, + RTM_GETNSID = 90, + RTM_NEWSTATS = 92, + RTM_GETSTATS = 94, + RTM_NEWCACHEREPORT = 96, + RTM_NEWCHAIN = 100, + RTM_DELCHAIN = 101, + RTM_GETCHAIN = 102, + RTM_NEWNEXTHOP = 104, + RTM_DELNEXTHOP = 105, + RTM_GETNEXTHOP = 106, + RTM_NEWLINKPROP = 108, + RTM_DELLINKPROP = 109, + RTM_GETLINKPROP = 110, + RTM_NEWVLAN = 112, + RTM_DELVLAN = 113, + RTM_GETVLAN = 114, + RTM_NEWNEXTHOPBUCKET = 116, + RTM_DELNEXTHOPBUCKET = 117, + RTM_GETNEXTHOPBUCKET = 118, + __RTM_MAX = 119, +}; + +struct nlmsg_perm { + u16 nlmsg_type; + u32 perm; +}; + +struct netif_security_struct { + struct net *ns; + int ifindex; + u32 sid; +}; + +struct sel_netif { + struct list_head list; + struct netif_security_struct nsec; + struct callback_head callback_head; +}; + +struct netnode_security_struct { + union { + __be32 ipv4; + struct in6_addr ipv6; + } addr; + u32 sid; + u16 family; +}; + +struct sel_netnode_bkt { + unsigned int size; + struct list_head list; +}; + +struct sel_netnode { + struct netnode_security_struct nsec; + struct list_head list; + struct callback_head rcu; +}; + +struct netport_security_struct { + u32 sid; + u16 port; + u8 protocol; +}; + +struct sel_netport_bkt { + int size; + struct list_head list; +}; + +struct sel_netport { + struct netport_security_struct psec; + struct list_head list; + struct callback_head rcu; +}; + +struct selinux_kernel_status { + u32 version; + u32 sequence; + u32 enforcing; + u32 policyload; + u32 deny_unknown; +}; + +struct ebitmap_node { + struct ebitmap_node *next; + long unsigned int maps[6]; + u32 startbit; +}; + +struct ebitmap { + struct ebitmap_node *node; + u32 highbit; +}; + +struct policy_file { + char *data; + size_t len; +}; + +struct hashtab_node { + void *key; + void *datum; + struct hashtab_node *next; +}; + +struct hashtab { + struct hashtab_node **htable; + u32 size; + u32 nel; +}; + +struct hashtab_info { + u32 slots_used; + u32 max_chain_len; +}; + +struct hashtab_key_params { + u32 (*hash)(const void *); + int (*cmp)(const void *, const void *); +}; + +struct symtab { + struct hashtab table; + u32 nprim; +}; + +struct mls_level { + u32 sens; + struct ebitmap cat; +}; + +struct mls_range { + struct mls_level level[2]; +}; + +struct context { + u32 user; + u32 role; + u32 type; + u32 len; + struct mls_range range; + char *str; +}; + +struct sidtab_str_cache; + +struct sidtab_entry { + u32 sid; + u32 hash; + struct context context; + struct sidtab_str_cache *cache; + struct hlist_node list; +}; + +struct sidtab_str_cache { + struct callback_head rcu_member; + struct list_head lru_member; + struct sidtab_entry *parent; + u32 len; + char str[0]; +}; + +struct sidtab_node_inner; + +struct sidtab_node_leaf; + +union sidtab_entry_inner { + struct sidtab_node_inner *ptr_inner; + struct sidtab_node_leaf *ptr_leaf; +}; + +struct sidtab_node_inner { + union sidtab_entry_inner entries[512]; +}; + +struct sidtab_node_leaf { + struct sidtab_entry entries[39]; +}; + +struct sidtab_isid_entry { + int set; + struct sidtab_entry entry; +}; + +struct sidtab; + +struct sidtab_convert_params { + int (*func)(struct context *, struct context *, void *); + void *args; + struct sidtab *target; +}; + +struct sidtab { + union sidtab_entry_inner roots[4]; + u32 count; + struct sidtab_convert_params *convert; + bool frozen; + spinlock_t lock; + u32 cache_free_slots; + struct list_head cache_lru_list; + spinlock_t cache_lock; + struct sidtab_isid_entry isids[27]; + struct hlist_head context_to_sid[512]; +}; + +struct avtab_key { + u16 source_type; + u16 target_type; + u16 target_class; + u16 specified; +}; + +struct avtab_extended_perms { + u8 specified; + u8 driver; + struct extended_perms_data perms; +}; + +struct avtab_datum { + union { + u32 data; + struct avtab_extended_perms *xperms; + } u; +}; + +struct avtab_node { + struct avtab_key key; + struct avtab_datum datum; + struct avtab_node *next; +}; + +struct avtab { + struct avtab_node **htable; + u32 nel; + u32 nslot; + u32 mask; +}; + +struct type_set; + +struct constraint_expr { + u32 expr_type; + u32 attr; + u32 op; + struct ebitmap names; + struct type_set *type_names; + struct constraint_expr *next; +}; + +struct type_set { + struct ebitmap types; + struct ebitmap negset; + u32 flags; +}; + +struct constraint_node { + u32 permissions; + struct constraint_expr *expr; + struct constraint_node *next; +}; + +struct common_datum { + u32 value; + struct symtab permissions; +}; + +struct class_datum { + u32 value; + char *comkey; + struct common_datum *comdatum; + struct symtab permissions; + struct constraint_node *constraints; + struct constraint_node *validatetrans; + char default_user; + char default_role; + char default_type; + char default_range; +}; + +struct role_datum { + u32 value; + u32 bounds; + struct ebitmap dominates; + struct ebitmap types; +}; + +struct role_allow { + u32 role; + u32 new_role; + struct role_allow *next; +}; + +struct type_datum { + u32 value; + u32 bounds; + unsigned char primary; + unsigned char attribute; +}; + +struct user_datum { + u32 value; + u32 bounds; + struct ebitmap roles; + struct mls_range range; + struct mls_level dfltlevel; +}; + +struct cond_bool_datum { + __u32 value; + int state; +}; + +struct ocontext { + union { + char *name; + struct { + u8 protocol; + u16 low_port; + u16 high_port; + } port; + struct { + u32 addr; + u32 mask; + } node; + struct { + u32 addr[4]; + u32 mask[4]; + } node6; + struct { + u64 subnet_prefix; + u16 low_pkey; + u16 high_pkey; + } ibpkey; + struct { + char *dev_name; + u8 port; + } ibendport; + } u; + union { + u32 sclass; + u32 behavior; + } v; + struct context context[2]; + u32 sid[2]; + struct ocontext *next; +}; + +struct genfs { + char *fstype; + struct ocontext *head; + struct genfs *next; +}; + +struct cond_node; + +struct policydb { + int mls_enabled; + struct symtab symtab[8]; + char **sym_val_to_name[8]; + struct class_datum **class_val_to_struct; + struct role_datum **role_val_to_struct; + struct user_datum **user_val_to_struct; + struct type_datum **type_val_to_struct; + struct avtab te_avtab; + struct hashtab role_tr; + struct ebitmap filename_trans_ttypes; + struct hashtab filename_trans; + u32 compat_filename_trans_count; + struct cond_bool_datum **bool_val_to_struct; + struct avtab te_cond_avtab; + struct cond_node *cond_list; + u32 cond_list_len; + struct role_allow *role_allow; + struct ocontext *ocontexts[9]; + struct genfs *genfs; + struct hashtab range_tr; + struct ebitmap *type_attr_map_array; + struct ebitmap policycaps; + struct ebitmap permissive_map; + size_t len; + unsigned int policyvers; + unsigned int reject_unknown: 1; + unsigned int allow_unknown: 1; + u16 process_class; + u32 process_trans_perms; +}; + +struct perm_datum { + u32 value; +}; + +struct role_trans_key { + u32 role; + u32 type; + u32 tclass; +}; + +struct role_trans_datum { + u32 new_role; +}; + +struct filename_trans_key { + u32 ttype; + u16 tclass; + const char *name; +}; + +struct filename_trans_datum { + struct ebitmap stypes; + u32 otype; + struct filename_trans_datum *next; +}; + +struct level_datum { + struct mls_level *level; + unsigned char isalias; +}; + +struct cat_datum { + u32 value; + unsigned char isalias; +}; + +struct range_trans { + u32 source_type; + u32 target_type; + u32 target_class; +}; + +struct cond_expr_node; + +struct cond_expr { + struct cond_expr_node *nodes; + u32 len; +}; + +struct cond_av_list { + struct avtab_node **nodes; + u32 len; +}; + +struct cond_node { + int cur_state; + struct cond_expr expr; + struct cond_av_list true_list; + struct cond_av_list false_list; +}; + +struct policy_data { + struct policydb *p; + void *fp; +}; + +struct cond_expr_node { + u32 expr_type; + u32 bool; +}; + +struct policydb_compat_info { + int version; + int sym_num; + int ocon_num; +}; + +struct selinux_mapping; + +struct selinux_map { + struct selinux_mapping *mapping; + u16 size; +}; + +struct selinux_policy { + struct sidtab *sidtab; + struct policydb policydb; + struct selinux_map map; + u32 latest_granting; +}; + +struct convert_context_args { + struct selinux_state *state; + struct policydb *oldp; + struct policydb *newp; +}; + +struct selinux_policy_convert_data { + struct convert_context_args args; + struct sidtab_convert_params sidtab_params; +}; + +struct selinux_mapping { + u16 value; + unsigned int num_perms; + u32 perms[32]; +}; + +struct selinux_audit_rule { + u32 au_seqno; + struct context au_ctxt; +}; + +struct cond_insertf_data { + struct policydb *p; + struct avtab_node **dst; + struct cond_av_list *other; +}; + +struct rt6key { + struct in6_addr addr; + int plen; +}; + +struct rtable; + +struct fnhe_hash_bucket; + +struct fib_nh_common { + struct net_device *nhc_dev; + int nhc_oif; + unsigned char nhc_scope; + u8 nhc_family; + u8 nhc_gw_family; + unsigned char nhc_flags; + struct lwtunnel_state *nhc_lwtstate; + union { + __be32 ipv4; + struct in6_addr ipv6; + } nhc_gw; + int nhc_weight; + atomic_t nhc_upper_bound; + struct rtable **nhc_pcpu_rth_output; + struct rtable *nhc_rth_input; + struct fnhe_hash_bucket *nhc_exceptions; +}; + +struct rt6_exception_bucket; + +struct fib6_nh { + struct fib_nh_common nh_common; + long unsigned int last_probe; + struct rt6_info **rt6i_pcpu; + struct rt6_exception_bucket *rt6i_exception_bucket; +}; + +struct fib6_node; + +struct dst_metrics; + +struct nexthop; + +struct fib6_info { + struct fib6_table *fib6_table; + struct fib6_info *fib6_next; + struct fib6_node *fib6_node; + union { + struct list_head fib6_siblings; + struct list_head nh_list; + }; + unsigned int fib6_nsiblings; + refcount_t fib6_ref; + long unsigned int expires; + struct dst_metrics *fib6_metrics; + struct rt6key fib6_dst; + u32 fib6_flags; + struct rt6key fib6_src; + struct rt6key fib6_prefsrc; + u32 fib6_metric; + u8 fib6_protocol; + u8 fib6_type; + u8 should_flush: 1; + u8 dst_nocount: 1; + u8 dst_nopolicy: 1; + u8 fib6_destroying: 1; + u8 offload: 1; + u8 trap: 1; + u8 offload_failed: 1; + u8 unused: 1; + struct callback_head rcu; + struct nexthop *nh; + struct fib6_nh fib6_nh[0]; +}; + +struct uncached_list; + +struct rt6_info { + struct dst_entry dst; + struct fib6_info *from; + int sernum; + struct rt6key rt6i_dst; + struct rt6key rt6i_src; + struct in6_addr rt6i_gateway; + struct inet6_dev *rt6i_idev; + u32 rt6i_flags; + struct list_head rt6i_uncached; + struct uncached_list *rt6i_uncached_list; + short unsigned int rt6i_nfheader_len; +}; + +struct rt6_statistics { + __u32 fib_nodes; + __u32 fib_route_nodes; + __u32 fib_rt_entries; + __u32 fib_rt_cache; + __u32 fib_discarded_routes; + atomic_t fib_rt_alloc; + atomic_t fib_rt_uncache; +}; + +struct fib6_node { + struct fib6_node *parent; + struct fib6_node *left; + struct fib6_node *right; + struct fib6_node *subtree; + struct fib6_info *leaf; + __u16 fn_bit; + __u16 fn_flags; + int fn_sernum; + struct fib6_info *rr_ptr; + struct callback_head rcu; +}; + +struct fib6_table { + struct hlist_node tb6_hlist; + u32 tb6_id; + spinlock_t tb6_lock; + struct fib6_node tb6_root; + struct inet_peer_base tb6_peers; + unsigned int flags; + unsigned int fib_seq; +}; + +typedef union { + __be32 a4; + __be32 a6[4]; + struct in6_addr in6; +} xfrm_address_t; + +struct xfrm_id { + xfrm_address_t daddr; + __be32 spi; + __u8 proto; +}; + +struct xfrm_selector { + xfrm_address_t daddr; + xfrm_address_t saddr; + __be16 dport; + __be16 dport_mask; + __be16 sport; + __be16 sport_mask; + __u16 family; + __u8 prefixlen_d; + __u8 prefixlen_s; + __u8 proto; + int ifindex; + __kernel_uid32_t user; +}; + +struct xfrm_lifetime_cfg { + __u64 soft_byte_limit; + __u64 hard_byte_limit; + __u64 soft_packet_limit; + __u64 hard_packet_limit; + __u64 soft_add_expires_seconds; + __u64 hard_add_expires_seconds; + __u64 soft_use_expires_seconds; + __u64 hard_use_expires_seconds; +}; + +struct xfrm_lifetime_cur { + __u64 bytes; + __u64 packets; + __u64 add_time; + __u64 use_time; +}; + +struct xfrm_replay_state { + __u32 oseq; + __u32 seq; + __u32 bitmap; +}; + +struct xfrm_replay_state_esn { + unsigned int bmp_len; + __u32 oseq; + __u32 seq; + __u32 oseq_hi; + __u32 seq_hi; + __u32 replay_window; + __u32 bmp[0]; +}; + +struct xfrm_algo { + char alg_name[64]; + unsigned int alg_key_len; + char alg_key[0]; +}; + +struct xfrm_algo_auth { + char alg_name[64]; + unsigned int alg_key_len; + unsigned int alg_trunc_len; + char alg_key[0]; +}; + +struct xfrm_algo_aead { + char alg_name[64]; + unsigned int alg_key_len; + unsigned int alg_icv_len; + char alg_key[0]; +}; + +struct xfrm_stats { + __u32 replay_window; + __u32 replay; + __u32 integrity_failed; +}; + +enum { + XFRM_POLICY_TYPE_MAIN = 0, + XFRM_POLICY_TYPE_SUB = 1, + XFRM_POLICY_TYPE_MAX = 2, + XFRM_POLICY_TYPE_ANY = 255, +}; + +struct xfrm_encap_tmpl { + __u16 encap_type; + __be16 encap_sport; + __be16 encap_dport; + xfrm_address_t encap_oa; +}; + +enum xfrm_attr_type_t { + XFRMA_UNSPEC = 0, + XFRMA_ALG_AUTH = 1, + XFRMA_ALG_CRYPT = 2, + XFRMA_ALG_COMP = 3, + XFRMA_ENCAP = 4, + XFRMA_TMPL = 5, + XFRMA_SA = 6, + XFRMA_POLICY = 7, + XFRMA_SEC_CTX = 8, + XFRMA_LTIME_VAL = 9, + XFRMA_REPLAY_VAL = 10, + XFRMA_REPLAY_THRESH = 11, + XFRMA_ETIMER_THRESH = 12, + XFRMA_SRCADDR = 13, + XFRMA_COADDR = 14, + XFRMA_LASTUSED = 15, + XFRMA_POLICY_TYPE = 16, + XFRMA_MIGRATE = 17, + XFRMA_ALG_AEAD = 18, + XFRMA_KMADDRESS = 19, + XFRMA_ALG_AUTH_TRUNC = 20, + XFRMA_MARK = 21, + XFRMA_TFCPAD = 22, + XFRMA_REPLAY_ESN_VAL = 23, + XFRMA_SA_EXTRA_FLAGS = 24, + XFRMA_PROTO = 25, + XFRMA_ADDRESS_FILTER = 26, + XFRMA_PAD = 27, + XFRMA_OFFLOAD_DEV = 28, + XFRMA_SET_MARK = 29, + XFRMA_SET_MARK_MASK = 30, + XFRMA_IF_ID = 31, + __XFRMA_MAX = 32, +}; + +struct xfrm_mark { + __u32 v; + __u32 m; +}; + +struct xfrm_address_filter { + xfrm_address_t saddr; + xfrm_address_t daddr; + __u16 family; + __u8 splen; + __u8 dplen; +}; + +struct xfrm_state_walk { + struct list_head all; + u8 state; + u8 dying; + u8 proto; + u32 seq; + struct xfrm_address_filter *filter; +}; + +enum xfrm_replay_mode { + XFRM_REPLAY_MODE_LEGACY = 0, + XFRM_REPLAY_MODE_BMP = 1, + XFRM_REPLAY_MODE_ESN = 2, +}; + +struct xfrm_state_offload { + struct net_device *dev; + struct net_device *real_dev; + long unsigned int offload_handle; + unsigned int num_exthdrs; + u8 flags; +}; + +struct xfrm_mode { + u8 encap; + u8 family; + u8 flags; +}; + +struct xfrm_type; + +struct xfrm_type_offload; + +struct xfrm_state { + possible_net_t xs_net; + union { + struct hlist_node gclist; + struct hlist_node bydst; + }; + struct hlist_node bysrc; + struct hlist_node byspi; + struct hlist_node byseq; + refcount_t refcnt; + spinlock_t lock; + struct xfrm_id id; + struct xfrm_selector sel; + struct xfrm_mark mark; + u32 if_id; + u32 tfcpad; + u32 genid; + struct xfrm_state_walk km; + struct { + u32 reqid; + u8 mode; + u8 replay_window; + u8 aalgo; + u8 ealgo; + u8 calgo; + u8 flags; + u16 family; + xfrm_address_t saddr; + int header_len; + int trailer_len; + u32 extra_flags; + struct xfrm_mark smark; + } props; + struct xfrm_lifetime_cfg lft; + struct xfrm_algo_auth *aalg; + struct xfrm_algo *ealg; + struct xfrm_algo *calg; + struct xfrm_algo_aead *aead; + const char *geniv; + struct xfrm_encap_tmpl *encap; + struct sock *encap_sk; + xfrm_address_t *coaddr; + struct xfrm_state *tunnel; + atomic_t tunnel_users; + struct xfrm_replay_state replay; + struct xfrm_replay_state_esn *replay_esn; + struct xfrm_replay_state preplay; + struct xfrm_replay_state_esn *preplay_esn; + enum xfrm_replay_mode repl_mode; + u32 xflags; + u32 replay_maxage; + u32 replay_maxdiff; + struct timer_list rtimer; + struct xfrm_stats stats; + struct xfrm_lifetime_cur curlft; + struct hrtimer mtimer; + struct xfrm_state_offload xso; + long int saved_tmo; + time64_t lastused; + struct page_frag xfrag; + const struct xfrm_type *type; + struct xfrm_mode inner_mode; + struct xfrm_mode inner_mode_iaf; + struct xfrm_mode outer_mode; + const struct xfrm_type_offload *type_offload; + struct xfrm_sec_ctx *security; + void *data; +}; + +struct dst_metrics { + u32 metrics[17]; + refcount_t refcnt; +}; + +struct xfrm_policy_walk_entry { + struct list_head all; + u8 dead; +}; + +struct xfrm_policy_queue { + struct sk_buff_head hold_queue; + struct timer_list hold_timer; + long unsigned int timeout; +}; + +struct xfrm_tmpl { + struct xfrm_id id; + xfrm_address_t saddr; + short unsigned int encap_family; + u32 reqid; + u8 mode; + u8 share; + u8 optional; + u8 allalgs; + u32 aalgos; + u32 ealgos; + u32 calgos; +}; + +struct xfrm_policy { + possible_net_t xp_net; + struct hlist_node bydst; + struct hlist_node byidx; + rwlock_t lock; + refcount_t refcnt; + u32 pos; + struct timer_list timer; + atomic_t genid; + u32 priority; + u32 index; + u32 if_id; + struct xfrm_mark mark; + struct xfrm_selector selector; + struct xfrm_lifetime_cfg lft; + struct xfrm_lifetime_cur curlft; + struct xfrm_policy_walk_entry walk; + struct xfrm_policy_queue polq; + bool bydst_reinsert; + u8 type; + u8 action; + u8 flags; + u8 xfrm_nr; + u16 family; + struct xfrm_sec_ctx *security; + struct xfrm_tmpl xfrm_vec[6]; + struct hlist_node bydst_inexact_list; + struct callback_head rcu; +}; + +struct udp_hslot; + +struct udp_table { + struct udp_hslot *hash; + struct udp_hslot *hash2; + unsigned int mask; + unsigned int log; +}; + +struct fib_nh_exception { + struct fib_nh_exception *fnhe_next; + int fnhe_genid; + __be32 fnhe_daddr; + u32 fnhe_pmtu; + bool fnhe_mtu_locked; + __be32 fnhe_gw; + long unsigned int fnhe_expires; + struct rtable *fnhe_rth_input; + struct rtable *fnhe_rth_output; + long unsigned int fnhe_stamp; + struct callback_head rcu; +}; + +struct rtable { + struct dst_entry dst; + int rt_genid; + unsigned int rt_flags; + __u16 rt_type; + __u8 rt_is_input; + __u8 rt_uses_gateway; + int rt_iif; + u8 rt_gw_family; + union { + __be32 rt_gw4; + struct in6_addr rt_gw6; + }; + u32 rt_mtu_locked: 1; + u32 rt_pmtu: 31; + struct list_head rt_uncached; + struct uncached_list *rt_uncached_list; +}; + +struct fnhe_hash_bucket { + struct fib_nh_exception *chain; +}; + +struct rt6_exception_bucket { + struct hlist_head chain; + int depth; +}; + +struct xfrm_type { + struct module *owner; + u8 proto; + u8 flags; + int (*init_state)(struct xfrm_state *); + void (*destructor)(struct xfrm_state *); + int (*input)(struct xfrm_state *, struct sk_buff *); + int (*output)(struct xfrm_state *, struct sk_buff *); + int (*reject)(struct xfrm_state *, struct sk_buff *, const struct flowi *); +}; + +struct xfrm_type_offload { + struct module *owner; + u8 proto; + void (*encap)(struct xfrm_state *, struct sk_buff *); + int (*input_tail)(struct xfrm_state *, struct sk_buff *); + int (*xmit)(struct xfrm_state *, struct sk_buff *, netdev_features_t); +}; + +struct xfrm_dst { + union { + struct dst_entry dst; + struct rtable rt; + struct rt6_info rt6; + } u; + struct dst_entry *route; + struct dst_entry *child; + struct dst_entry *path; + struct xfrm_policy *pols[2]; + int num_pols; + int num_xfrms; + u32 xfrm_genid; + u32 policy_genid; + u32 route_mtu_cached; + u32 child_mtu_cached; + u32 route_cookie; + u32 path_cookie; +}; + +struct xfrm_offload { + struct { + __u32 low; + __u32 hi; + } seq; + __u32 flags; + __u32 status; + __u8 proto; + __u8 inner_ipproto; +}; + +struct sec_path { + int len; + int olen; + struct xfrm_state *xvec[6]; + struct xfrm_offload ovec[1]; +}; + +struct udp_hslot { + struct hlist_head head; + int count; + spinlock_t lock; +}; + +struct pkey_security_struct { + u64 subnet_prefix; + u16 pkey; + u32 sid; +}; + +struct sel_ib_pkey_bkt { + int size; + struct list_head list; +}; + +struct sel_ib_pkey { + struct pkey_security_struct psec; + struct list_head list; + struct callback_head rcu; +}; + +struct smack_audit_data { + const char *function; + char *subject; + char *object; + char *request; + int result; +}; + +struct smack_known { + struct list_head list; + struct hlist_node smk_hashed; + char *smk_known; + u32 smk_secid; + struct netlbl_lsm_secattr smk_netlabel; + struct list_head smk_rules; + struct mutex smk_rules_lock; +}; + +struct superblock_smack { + struct smack_known *smk_root; + struct smack_known *smk_floor; + struct smack_known *smk_hat; + struct smack_known *smk_default; + int smk_flags; +}; + +struct socket_smack { + struct smack_known *smk_out; + struct smack_known *smk_in; + struct smack_known *smk_packet; + int smk_state; +}; + +struct inode_smack { + struct smack_known *smk_inode; + struct smack_known *smk_task; + struct smack_known *smk_mmap; + int smk_flags; +}; + +struct task_smack { + struct smack_known *smk_task; + struct smack_known *smk_forked; + struct list_head smk_rules; + struct mutex smk_rules_lock; + struct list_head smk_relabel; +}; + +struct smack_rule { + struct list_head list; + struct smack_known *smk_subject; + struct smack_known *smk_object; + int smk_access; +}; + +struct smk_net4addr { + struct list_head list; + struct in_addr smk_host; + struct in_addr smk_mask; + int smk_masks; + struct smack_known *smk_label; +}; + +struct smk_net6addr { + struct list_head list; + struct in6_addr smk_host; + struct in6_addr smk_mask; + int smk_masks; + struct smack_known *smk_label; +}; + +struct smack_known_list_elem { + struct list_head list; + struct smack_known *smk_label; +}; + +enum { + Opt_error___3 = 4294967295, + Opt_fsdefault = 0, + Opt_fsfloor = 1, + Opt_fshat = 2, + Opt_fsroot = 3, + Opt_fstransmute = 4, +}; + +struct smk_audit_info { + struct common_audit_data a; + struct smack_audit_data sad; +}; + +struct smack_mnt_opts { + const char *fsdefault; + const char *fsfloor; + const char *fshat; + const char *fsroot; + const char *fstransmute; +}; + +struct netlbl_audit { + u32 secid; + kuid_t loginuid; + unsigned int sessionid; +}; + +struct cipso_v4_std_map_tbl { + struct { + u32 *cipso; + u32 *local; + u32 cipso_size; + u32 local_size; + } lvl; + struct { + u32 *cipso; + u32 *local; + u32 cipso_size; + u32 local_size; + } cat; +}; + +struct cipso_v4_doi { + u32 doi; + u32 type; + union { + struct cipso_v4_std_map_tbl *std; + } map; + u8 tags[5]; + refcount_t refcount; + struct list_head list; + struct callback_head rcu; +}; + +enum smk_inos { + SMK_ROOT_INO = 2, + SMK_LOAD = 3, + SMK_CIPSO = 4, + SMK_DOI = 5, + SMK_DIRECT = 6, + SMK_AMBIENT = 7, + SMK_NET4ADDR = 8, + SMK_ONLYCAP = 9, + SMK_LOGGING = 10, + SMK_LOAD_SELF = 11, + SMK_ACCESSES = 12, + SMK_MAPPED = 13, + SMK_LOAD2 = 14, + SMK_LOAD_SELF2 = 15, + SMK_ACCESS2 = 16, + SMK_CIPSO2 = 17, + SMK_REVOKE_SUBJ = 18, + SMK_CHANGE_RULE = 19, + SMK_SYSLOG = 20, + SMK_PTRACE = 21, + SMK_NET6ADDR = 23, + SMK_RELABEL_SELF = 24, +}; + +struct smack_parsed_rule { + struct smack_known *smk_subject; + struct smack_known *smk_object; + int smk_access1; + int smk_access2; +}; + +struct sockaddr_un { + __kernel_sa_family_t sun_family; + char sun_path[108]; +}; + +struct unix_address { + refcount_t refcnt; + int len; + unsigned int hash; + struct sockaddr_un name[0]; +}; + +struct scm_stat { + atomic_t nr_fds; +}; + +struct unix_sock { + struct sock sk; + struct unix_address *addr; + struct path path; + struct mutex iolock; + struct mutex bindlock; + struct sock *peer; + struct list_head link; + atomic_long_t inflight; + spinlock_t lock; + long unsigned int gc_flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct socket_wq peer_wq; + wait_queue_entry_t peer_wake; + struct scm_stat scm_stat; + struct sk_buff *oob_skb; + long: 64; +}; + +enum tomoyo_conditions_index { + TOMOYO_TASK_UID = 0, + TOMOYO_TASK_EUID = 1, + TOMOYO_TASK_SUID = 2, + TOMOYO_TASK_FSUID = 3, + TOMOYO_TASK_GID = 4, + TOMOYO_TASK_EGID = 5, + TOMOYO_TASK_SGID = 6, + TOMOYO_TASK_FSGID = 7, + TOMOYO_TASK_PID = 8, + TOMOYO_TASK_PPID = 9, + TOMOYO_EXEC_ARGC = 10, + TOMOYO_EXEC_ENVC = 11, + TOMOYO_TYPE_IS_SOCKET = 12, + TOMOYO_TYPE_IS_SYMLINK = 13, + TOMOYO_TYPE_IS_FILE = 14, + TOMOYO_TYPE_IS_BLOCK_DEV = 15, + TOMOYO_TYPE_IS_DIRECTORY = 16, + TOMOYO_TYPE_IS_CHAR_DEV = 17, + TOMOYO_TYPE_IS_FIFO = 18, + TOMOYO_MODE_SETUID = 19, + TOMOYO_MODE_SETGID = 20, + TOMOYO_MODE_STICKY = 21, + TOMOYO_MODE_OWNER_READ = 22, + TOMOYO_MODE_OWNER_WRITE = 23, + TOMOYO_MODE_OWNER_EXECUTE = 24, + TOMOYO_MODE_GROUP_READ = 25, + TOMOYO_MODE_GROUP_WRITE = 26, + TOMOYO_MODE_GROUP_EXECUTE = 27, + TOMOYO_MODE_OTHERS_READ = 28, + TOMOYO_MODE_OTHERS_WRITE = 29, + TOMOYO_MODE_OTHERS_EXECUTE = 30, + TOMOYO_EXEC_REALPATH = 31, + TOMOYO_SYMLINK_TARGET = 32, + TOMOYO_PATH1_UID = 33, + TOMOYO_PATH1_GID = 34, + TOMOYO_PATH1_INO = 35, + TOMOYO_PATH1_MAJOR = 36, + TOMOYO_PATH1_MINOR = 37, + TOMOYO_PATH1_PERM = 38, + TOMOYO_PATH1_TYPE = 39, + TOMOYO_PATH1_DEV_MAJOR = 40, + TOMOYO_PATH1_DEV_MINOR = 41, + TOMOYO_PATH2_UID = 42, + TOMOYO_PATH2_GID = 43, + TOMOYO_PATH2_INO = 44, + TOMOYO_PATH2_MAJOR = 45, + TOMOYO_PATH2_MINOR = 46, + TOMOYO_PATH2_PERM = 47, + TOMOYO_PATH2_TYPE = 48, + TOMOYO_PATH2_DEV_MAJOR = 49, + TOMOYO_PATH2_DEV_MINOR = 50, + TOMOYO_PATH1_PARENT_UID = 51, + TOMOYO_PATH1_PARENT_GID = 52, + TOMOYO_PATH1_PARENT_INO = 53, + TOMOYO_PATH1_PARENT_PERM = 54, + TOMOYO_PATH2_PARENT_UID = 55, + TOMOYO_PATH2_PARENT_GID = 56, + TOMOYO_PATH2_PARENT_INO = 57, + TOMOYO_PATH2_PARENT_PERM = 58, + TOMOYO_MAX_CONDITION_KEYWORD = 59, + TOMOYO_NUMBER_UNION = 60, + TOMOYO_NAME_UNION = 61, + TOMOYO_ARGV_ENTRY = 62, + TOMOYO_ENVP_ENTRY = 63, +}; + +enum tomoyo_path_stat_index { + TOMOYO_PATH1 = 0, + TOMOYO_PATH1_PARENT = 1, + TOMOYO_PATH2 = 2, + TOMOYO_PATH2_PARENT = 3, + TOMOYO_MAX_PATH_STAT = 4, +}; + +enum tomoyo_mode_index { + TOMOYO_CONFIG_DISABLED = 0, + TOMOYO_CONFIG_LEARNING = 1, + TOMOYO_CONFIG_PERMISSIVE = 2, + TOMOYO_CONFIG_ENFORCING = 3, + TOMOYO_CONFIG_MAX_MODE = 4, + TOMOYO_CONFIG_WANT_REJECT_LOG = 64, + TOMOYO_CONFIG_WANT_GRANT_LOG = 128, + TOMOYO_CONFIG_USE_DEFAULT = 255, +}; + +enum tomoyo_policy_id { + TOMOYO_ID_GROUP = 0, + TOMOYO_ID_ADDRESS_GROUP = 1, + TOMOYO_ID_PATH_GROUP = 2, + TOMOYO_ID_NUMBER_GROUP = 3, + TOMOYO_ID_TRANSITION_CONTROL = 4, + TOMOYO_ID_AGGREGATOR = 5, + TOMOYO_ID_MANAGER = 6, + TOMOYO_ID_CONDITION = 7, + TOMOYO_ID_NAME = 8, + TOMOYO_ID_ACL = 9, + TOMOYO_ID_DOMAIN = 10, + TOMOYO_MAX_POLICY = 11, +}; + +enum tomoyo_domain_info_flags_index { + TOMOYO_DIF_QUOTA_WARNED = 0, + TOMOYO_DIF_TRANSITION_FAILED = 1, + TOMOYO_MAX_DOMAIN_INFO_FLAGS = 2, +}; + +enum tomoyo_grant_log { + TOMOYO_GRANTLOG_AUTO = 0, + TOMOYO_GRANTLOG_NO = 1, + TOMOYO_GRANTLOG_YES = 2, +}; + +enum tomoyo_group_id { + TOMOYO_PATH_GROUP = 0, + TOMOYO_NUMBER_GROUP = 1, + TOMOYO_ADDRESS_GROUP = 2, + TOMOYO_MAX_GROUP = 3, +}; + +enum tomoyo_path_acl_index { + TOMOYO_TYPE_EXECUTE = 0, + TOMOYO_TYPE_READ = 1, + TOMOYO_TYPE_WRITE = 2, + TOMOYO_TYPE_APPEND = 3, + TOMOYO_TYPE_UNLINK = 4, + TOMOYO_TYPE_GETATTR = 5, + TOMOYO_TYPE_RMDIR = 6, + TOMOYO_TYPE_TRUNCATE = 7, + TOMOYO_TYPE_SYMLINK = 8, + TOMOYO_TYPE_CHROOT = 9, + TOMOYO_TYPE_UMOUNT = 10, + TOMOYO_MAX_PATH_OPERATION = 11, +}; + +enum tomoyo_memory_stat_type { + TOMOYO_MEMORY_POLICY = 0, + TOMOYO_MEMORY_AUDIT = 1, + TOMOYO_MEMORY_QUERY = 2, + TOMOYO_MAX_MEMORY_STAT = 3, +}; + +enum tomoyo_mkdev_acl_index { + TOMOYO_TYPE_MKBLOCK = 0, + TOMOYO_TYPE_MKCHAR = 1, + TOMOYO_MAX_MKDEV_OPERATION = 2, +}; + +enum tomoyo_network_acl_index { + TOMOYO_NETWORK_BIND = 0, + TOMOYO_NETWORK_LISTEN = 1, + TOMOYO_NETWORK_CONNECT = 2, + TOMOYO_NETWORK_SEND = 3, + TOMOYO_MAX_NETWORK_OPERATION = 4, +}; + +enum tomoyo_path2_acl_index { + TOMOYO_TYPE_LINK = 0, + TOMOYO_TYPE_RENAME = 1, + TOMOYO_TYPE_PIVOT_ROOT = 2, + TOMOYO_MAX_PATH2_OPERATION = 3, +}; + +enum tomoyo_path_number_acl_index { + TOMOYO_TYPE_CREATE = 0, + TOMOYO_TYPE_MKDIR = 1, + TOMOYO_TYPE_MKFIFO = 2, + TOMOYO_TYPE_MKSOCK = 3, + TOMOYO_TYPE_IOCTL = 4, + TOMOYO_TYPE_CHMOD = 5, + TOMOYO_TYPE_CHOWN = 6, + TOMOYO_TYPE_CHGRP = 7, + TOMOYO_MAX_PATH_NUMBER_OPERATION = 8, +}; + +enum tomoyo_securityfs_interface_index { + TOMOYO_DOMAINPOLICY = 0, + TOMOYO_EXCEPTIONPOLICY = 1, + TOMOYO_PROCESS_STATUS = 2, + TOMOYO_STAT = 3, + TOMOYO_AUDIT = 4, + TOMOYO_VERSION = 5, + TOMOYO_PROFILE = 6, + TOMOYO_QUERY = 7, + TOMOYO_MANAGER = 8, +}; + +enum tomoyo_mac_index { + TOMOYO_MAC_FILE_EXECUTE = 0, + TOMOYO_MAC_FILE_OPEN = 1, + TOMOYO_MAC_FILE_CREATE = 2, + TOMOYO_MAC_FILE_UNLINK = 3, + TOMOYO_MAC_FILE_GETATTR = 4, + TOMOYO_MAC_FILE_MKDIR = 5, + TOMOYO_MAC_FILE_RMDIR = 6, + TOMOYO_MAC_FILE_MKFIFO = 7, + TOMOYO_MAC_FILE_MKSOCK = 8, + TOMOYO_MAC_FILE_TRUNCATE = 9, + TOMOYO_MAC_FILE_SYMLINK = 10, + TOMOYO_MAC_FILE_MKBLOCK = 11, + TOMOYO_MAC_FILE_MKCHAR = 12, + TOMOYO_MAC_FILE_LINK = 13, + TOMOYO_MAC_FILE_RENAME = 14, + TOMOYO_MAC_FILE_CHMOD = 15, + TOMOYO_MAC_FILE_CHOWN = 16, + TOMOYO_MAC_FILE_CHGRP = 17, + TOMOYO_MAC_FILE_IOCTL = 18, + TOMOYO_MAC_FILE_CHROOT = 19, + TOMOYO_MAC_FILE_MOUNT = 20, + TOMOYO_MAC_FILE_UMOUNT = 21, + TOMOYO_MAC_FILE_PIVOT_ROOT = 22, + TOMOYO_MAC_NETWORK_INET_STREAM_BIND = 23, + TOMOYO_MAC_NETWORK_INET_STREAM_LISTEN = 24, + TOMOYO_MAC_NETWORK_INET_STREAM_CONNECT = 25, + TOMOYO_MAC_NETWORK_INET_DGRAM_BIND = 26, + TOMOYO_MAC_NETWORK_INET_DGRAM_SEND = 27, + TOMOYO_MAC_NETWORK_INET_RAW_BIND = 28, + TOMOYO_MAC_NETWORK_INET_RAW_SEND = 29, + TOMOYO_MAC_NETWORK_UNIX_STREAM_BIND = 30, + TOMOYO_MAC_NETWORK_UNIX_STREAM_LISTEN = 31, + TOMOYO_MAC_NETWORK_UNIX_STREAM_CONNECT = 32, + TOMOYO_MAC_NETWORK_UNIX_DGRAM_BIND = 33, + TOMOYO_MAC_NETWORK_UNIX_DGRAM_SEND = 34, + TOMOYO_MAC_NETWORK_UNIX_SEQPACKET_BIND = 35, + TOMOYO_MAC_NETWORK_UNIX_SEQPACKET_LISTEN = 36, + TOMOYO_MAC_NETWORK_UNIX_SEQPACKET_CONNECT = 37, + TOMOYO_MAC_ENVIRON = 38, + TOMOYO_MAX_MAC_INDEX = 39, +}; + +enum tomoyo_mac_category_index { + TOMOYO_MAC_CATEGORY_FILE = 0, + TOMOYO_MAC_CATEGORY_NETWORK = 1, + TOMOYO_MAC_CATEGORY_MISC = 2, + TOMOYO_MAX_MAC_CATEGORY_INDEX = 3, +}; + +enum tomoyo_pref_index { + TOMOYO_PREF_MAX_AUDIT_LOG = 0, + TOMOYO_PREF_MAX_LEARNING_ENTRY = 1, + TOMOYO_MAX_PREF = 2, +}; + +struct tomoyo_shared_acl_head { + struct list_head list; + atomic_t users; +} __attribute__((packed)); + +struct tomoyo_path_info { + const char *name; + u32 hash; + u16 const_len; + bool is_dir; + bool is_patterned; +}; + +struct tomoyo_obj_info; + +struct tomoyo_execve; + +struct tomoyo_domain_info; + +struct tomoyo_acl_info; + +struct tomoyo_request_info { + struct tomoyo_obj_info *obj; + struct tomoyo_execve *ee; + struct tomoyo_domain_info *domain; + union { + struct { + const struct tomoyo_path_info *filename; + const struct tomoyo_path_info *matched_path; + u8 operation; + } path; + struct { + const struct tomoyo_path_info *filename1; + const struct tomoyo_path_info *filename2; + u8 operation; + } path2; + struct { + const struct tomoyo_path_info *filename; + unsigned int mode; + unsigned int major; + unsigned int minor; + u8 operation; + } mkdev; + struct { + const struct tomoyo_path_info *filename; + long unsigned int number; + u8 operation; + } path_number; + struct { + const struct tomoyo_path_info *name; + } environ; + struct { + const __be32 *address; + u16 port; + u8 protocol; + u8 operation; + bool is_ipv6; + } inet_network; + struct { + const struct tomoyo_path_info *address; + u8 protocol; + u8 operation; + } unix_network; + struct { + const struct tomoyo_path_info *type; + const struct tomoyo_path_info *dir; + const struct tomoyo_path_info *dev; + long unsigned int flags; + int need_dev; + } mount; + struct { + const struct tomoyo_path_info *domainname; + } task; + } param; + struct tomoyo_acl_info *matched_acl; + u8 param_type; + bool granted; + u8 retry; + u8 profile; + u8 mode; + u8 type; +}; + +struct tomoyo_mini_stat { + kuid_t uid; + kgid_t gid; + ino_t ino; + umode_t mode; + dev_t dev; + dev_t rdev; +}; + +struct tomoyo_obj_info { + bool validate_done; + bool stat_valid[4]; + struct path path1; + struct path path2; + struct tomoyo_mini_stat stat[4]; + struct tomoyo_path_info *symlink_target; +}; + +struct tomoyo_page_dump { + struct page *page; + char *data; +}; + +struct tomoyo_execve { + struct tomoyo_request_info r; + struct tomoyo_obj_info obj; + struct linux_binprm *bprm; + const struct tomoyo_path_info *transition; + struct tomoyo_page_dump dump; + char *tmp; +}; + +struct tomoyo_policy_namespace; + +struct tomoyo_domain_info { + struct list_head list; + struct list_head acl_info_list; + const struct tomoyo_path_info *domainname; + struct tomoyo_policy_namespace *ns; + long unsigned int group[4]; + u8 profile; + bool is_deleted; + bool flags[2]; + atomic_t users; +}; + +struct tomoyo_condition; + +struct tomoyo_acl_info { + struct list_head list; + struct tomoyo_condition *cond; + s8 is_deleted; + u8 type; +} __attribute__((packed)); + +struct tomoyo_condition { + struct tomoyo_shared_acl_head head; + u32 size; + u16 condc; + u16 numbers_count; + u16 names_count; + u16 argc; + u16 envc; + u8 grant_log; + const struct tomoyo_path_info *transit; +}; + +struct tomoyo_profile; + +struct tomoyo_policy_namespace { + struct tomoyo_profile *profile_ptr[256]; + struct list_head group_list[3]; + struct list_head policy_list[11]; + struct list_head acl_group[256]; + struct list_head namespace_list; + unsigned int profile_version; + const char *name; +}; + +struct tomoyo_io_buffer { + void (*read)(struct tomoyo_io_buffer *); + int (*write)(struct tomoyo_io_buffer *); + __poll_t (*poll)(struct file *, poll_table *); + struct mutex io_sem; + char *read_user_buf; + size_t read_user_buf_avail; + struct { + struct list_head *ns; + struct list_head *domain; + struct list_head *group; + struct list_head *acl; + size_t avail; + unsigned int step; + unsigned int query_index; + u16 index; + u16 cond_index; + u8 acl_group_index; + u8 cond_step; + u8 bit; + u8 w_pos; + bool eof; + bool print_this_domain_only; + bool print_transition_related_only; + bool print_cond_part; + const char *w[64]; + } r; + struct { + struct tomoyo_policy_namespace *ns; + struct tomoyo_domain_info *domain; + size_t avail; + bool is_delete; + } w; + char *read_buf; + size_t readbuf_size; + char *write_buf; + size_t writebuf_size; + enum tomoyo_securityfs_interface_index type; + u8 users; + struct list_head list; +}; + +struct tomoyo_preference { + unsigned int learning_max_entry; + bool enforcing_verbose; + bool learning_verbose; + bool permissive_verbose; +}; + +struct tomoyo_profile { + const struct tomoyo_path_info *comment; + struct tomoyo_preference *learning; + struct tomoyo_preference *permissive; + struct tomoyo_preference *enforcing; + struct tomoyo_preference preference; + u8 default_config; + u8 config[42]; + unsigned int pref[2]; +}; + +struct tomoyo_time { + u16 year; + u8 month; + u8 day; + u8 hour; + u8 min; + u8 sec; +}; + +struct tomoyo_log { + struct list_head list; + char *log; + int size; +}; + +enum tomoyo_value_type { + TOMOYO_VALUE_TYPE_INVALID = 0, + TOMOYO_VALUE_TYPE_DECIMAL = 1, + TOMOYO_VALUE_TYPE_OCTAL = 2, + TOMOYO_VALUE_TYPE_HEXADECIMAL = 3, +}; + +enum tomoyo_transition_type { + TOMOYO_TRANSITION_CONTROL_NO_RESET = 0, + TOMOYO_TRANSITION_CONTROL_RESET = 1, + TOMOYO_TRANSITION_CONTROL_NO_INITIALIZE = 2, + TOMOYO_TRANSITION_CONTROL_INITIALIZE = 3, + TOMOYO_TRANSITION_CONTROL_NO_KEEP = 4, + TOMOYO_TRANSITION_CONTROL_KEEP = 5, + TOMOYO_MAX_TRANSITION_TYPE = 6, +}; + +enum tomoyo_acl_entry_type_index { + TOMOYO_TYPE_PATH_ACL = 0, + TOMOYO_TYPE_PATH2_ACL = 1, + TOMOYO_TYPE_PATH_NUMBER_ACL = 2, + TOMOYO_TYPE_MKDEV_ACL = 3, + TOMOYO_TYPE_MOUNT_ACL = 4, + TOMOYO_TYPE_INET_ACL = 5, + TOMOYO_TYPE_UNIX_ACL = 6, + TOMOYO_TYPE_ENV_ACL = 7, + TOMOYO_TYPE_MANUAL_TASK_ACL = 8, +}; + +enum tomoyo_policy_stat_type { + TOMOYO_STAT_POLICY_UPDATES = 0, + TOMOYO_STAT_POLICY_LEARNING = 1, + TOMOYO_STAT_POLICY_PERMISSIVE = 2, + TOMOYO_STAT_POLICY_ENFORCING = 3, + TOMOYO_MAX_POLICY_STAT = 4, +}; + +struct tomoyo_acl_head { + struct list_head list; + s8 is_deleted; +} __attribute__((packed)); + +struct tomoyo_name { + struct tomoyo_shared_acl_head head; + struct tomoyo_path_info entry; +}; + +struct tomoyo_group; + +struct tomoyo_name_union { + const struct tomoyo_path_info *filename; + struct tomoyo_group *group; +}; + +struct tomoyo_group { + struct tomoyo_shared_acl_head head; + const struct tomoyo_path_info *group_name; + struct list_head member_list; +}; + +struct tomoyo_number_union { + long unsigned int values[2]; + struct tomoyo_group *group; + u8 value_type[2]; +}; + +struct tomoyo_ipaddr_union { + struct in6_addr ip[2]; + struct tomoyo_group *group; + bool is_ipv6; +}; + +struct tomoyo_path_group { + struct tomoyo_acl_head head; + const struct tomoyo_path_info *member_name; +}; + +struct tomoyo_number_group { + struct tomoyo_acl_head head; + struct tomoyo_number_union number; +}; + +struct tomoyo_address_group { + struct tomoyo_acl_head head; + struct tomoyo_ipaddr_union address; +}; + +struct tomoyo_argv { + long unsigned int index; + const struct tomoyo_path_info *value; + bool is_not; +}; + +struct tomoyo_envp { + const struct tomoyo_path_info *name; + const struct tomoyo_path_info *value; + bool is_not; +}; + +struct tomoyo_condition_element { + u8 left; + u8 right; + bool equals; +}; + +struct tomoyo_task_acl { + struct tomoyo_acl_info head; + const struct tomoyo_path_info *domainname; +}; + +struct tomoyo_path_acl { + struct tomoyo_acl_info head; + u16 perm; + struct tomoyo_name_union name; +}; + +struct tomoyo_path_number_acl { + struct tomoyo_acl_info head; + u8 perm; + struct tomoyo_name_union name; + struct tomoyo_number_union number; +}; + +struct tomoyo_mkdev_acl { + struct tomoyo_acl_info head; + u8 perm; + struct tomoyo_name_union name; + struct tomoyo_number_union mode; + struct tomoyo_number_union major; + struct tomoyo_number_union minor; +}; + +struct tomoyo_path2_acl { + struct tomoyo_acl_info head; + u8 perm; + struct tomoyo_name_union name1; + struct tomoyo_name_union name2; +}; + +struct tomoyo_mount_acl { + struct tomoyo_acl_info head; + struct tomoyo_name_union dev_name; + struct tomoyo_name_union dir_name; + struct tomoyo_name_union fs_type; + struct tomoyo_number_union flags; +}; + +struct tomoyo_env_acl { + struct tomoyo_acl_info head; + const struct tomoyo_path_info *env; +}; + +struct tomoyo_inet_acl { + struct tomoyo_acl_info head; + u8 protocol; + u8 perm; + struct tomoyo_ipaddr_union address; + struct tomoyo_number_union port; +}; + +struct tomoyo_unix_acl { + struct tomoyo_acl_info head; + u8 protocol; + u8 perm; + struct tomoyo_name_union name; +}; + +struct tomoyo_acl_param { + char *data; + struct list_head *list; + struct tomoyo_policy_namespace *ns; + bool is_delete; +}; + +struct tomoyo_transition_control { + struct tomoyo_acl_head head; + u8 type; + bool is_last_name; + const struct tomoyo_path_info *domainname; + const struct tomoyo_path_info *program; +}; + +struct tomoyo_aggregator { + struct tomoyo_acl_head head; + const struct tomoyo_path_info *original_name; + const struct tomoyo_path_info *aggregated_name; +}; + +struct tomoyo_manager { + struct tomoyo_acl_head head; + const struct tomoyo_path_info *manager; +}; + +struct tomoyo_task { + struct tomoyo_domain_info *domain_info; + struct tomoyo_domain_info *old_domain_info; +}; + +struct tomoyo_query { + struct list_head list; + struct tomoyo_domain_info *domain; + char *query; + size_t query_len; + unsigned int serial; + u8 timer; + u8 answer; + u8 retry; +}; + +enum tomoyo_special_mount { + TOMOYO_MOUNT_BIND = 0, + TOMOYO_MOUNT_MOVE = 1, + TOMOYO_MOUNT_REMOUNT = 2, + TOMOYO_MOUNT_MAKE_UNBINDABLE = 3, + TOMOYO_MOUNT_MAKE_PRIVATE = 4, + TOMOYO_MOUNT_MAKE_SLAVE = 5, + TOMOYO_MOUNT_MAKE_SHARED = 6, + TOMOYO_MAX_SPECIAL_MOUNT = 7, +}; + +struct tomoyo_inet_addr_info { + __be16 port; + const __be32 *address; + bool is_ipv6; +}; + +struct tomoyo_unix_addr_info { + u8 *addr; + unsigned int addr_len; +}; + +struct tomoyo_addr_info { + u8 protocol; + u8 operation; + struct tomoyo_inet_addr_info inet; + struct tomoyo_unix_addr_info unix0; +}; + +enum audit_mode { + AUDIT_NORMAL = 0, + AUDIT_QUIET_DENIED = 1, + AUDIT_QUIET = 2, + AUDIT_NOQUIET = 3, + AUDIT_ALL = 4, +}; + +enum aa_sfs_type { + AA_SFS_TYPE_BOOLEAN = 0, + AA_SFS_TYPE_STRING = 1, + AA_SFS_TYPE_U64 = 2, + AA_SFS_TYPE_FOPS = 3, + AA_SFS_TYPE_DIR = 4, +}; + +struct aa_sfs_entry { + const char *name; + struct dentry *dentry; + umode_t mode; + enum aa_sfs_type v_type; + union { + bool boolean; + char *string; + long unsigned int u64; + struct aa_sfs_entry *files; + } v; + const struct file_operations *file_ops; +}; + +enum aafs_ns_type { + AAFS_NS_DIR = 0, + AAFS_NS_PROFS = 1, + AAFS_NS_NS = 2, + AAFS_NS_RAW_DATA = 3, + AAFS_NS_LOAD = 4, + AAFS_NS_REPLACE = 5, + AAFS_NS_REMOVE = 6, + AAFS_NS_REVISION = 7, + AAFS_NS_COUNT = 8, + AAFS_NS_MAX_COUNT = 9, + AAFS_NS_SIZE = 10, + AAFS_NS_MAX_SIZE = 11, + AAFS_NS_OWNER = 12, + AAFS_NS_SIZEOF = 13, +}; + +enum aafs_prof_type { + AAFS_PROF_DIR = 0, + AAFS_PROF_PROFS = 1, + AAFS_PROF_NAME = 2, + AAFS_PROF_MODE = 3, + AAFS_PROF_ATTACH = 4, + AAFS_PROF_HASH = 5, + AAFS_PROF_RAW_DATA = 6, + AAFS_PROF_RAW_HASH = 7, + AAFS_PROF_RAW_ABI = 8, + AAFS_PROF_SIZEOF = 9, +}; + +struct table_header { + u16 td_id; + u16 td_flags; + u32 td_hilen; + u32 td_lolen; + char td_data[0]; +}; + +struct aa_dfa { + struct kref count; + u16 flags; + u32 max_oob; + struct table_header *tables[8]; +}; + +struct aa_policy { + const char *name; + char *hname; + struct list_head list; + struct list_head profiles; +}; + +struct aa_labelset { + rwlock_t lock; + struct rb_root root; +}; + +enum label_flags { + FLAG_HAT = 1, + FLAG_UNCONFINED = 2, + FLAG_NULL = 4, + FLAG_IX_ON_NAME_ERROR = 8, + FLAG_IMMUTIBLE = 16, + FLAG_USER_DEFINED = 32, + FLAG_NO_LIST_REF = 64, + FLAG_NS_COUNT = 128, + FLAG_IN_TREE = 256, + FLAG_PROFILE = 512, + FLAG_EXPLICIT = 1024, + FLAG_STALE = 2048, + FLAG_RENAMED = 4096, + FLAG_REVOKED = 8192, +}; + +struct aa_label; + +struct aa_proxy { + struct kref count; + struct aa_label *label; +}; + +struct aa_profile; + +struct aa_label { + struct kref count; + struct rb_node node; + struct callback_head rcu; + struct aa_proxy *proxy; + char *hname; + long int flags; + u32 secid; + int size; + struct aa_profile *vec[0]; +}; + +struct label_it { + int i; + int j; +}; + +struct aa_policydb { + struct aa_dfa *dfa; + unsigned int start[17]; +}; + +struct aa_domain { + int size; + char **table; +}; + +struct aa_file_rules { + unsigned int start; + struct aa_dfa *dfa; + struct aa_domain trans; +}; + +struct aa_caps { + kernel_cap_t allow; + kernel_cap_t audit; + kernel_cap_t denied; + kernel_cap_t quiet; + kernel_cap_t kill; + kernel_cap_t extended; +}; + +struct aa_rlimit { + unsigned int mask; + struct rlimit limits[16]; +}; + +struct aa_ns; + +struct aa_secmark; + +struct aa_loaddata; + +struct aa_profile { + struct aa_policy base; + struct aa_profile *parent; + struct aa_ns *ns; + const char *rename; + const char *attach; + struct aa_dfa *xmatch; + int xmatch_len; + enum audit_mode audit; + long int mode; + u32 path_flags; + const char *disconnected; + int size; + struct aa_policydb policy; + struct aa_file_rules file; + struct aa_caps caps; + int xattr_count; + char **xattrs; + struct aa_rlimit rlimits; + int secmark_count; + struct aa_secmark *secmark; + struct aa_loaddata *rawdata; + unsigned char *hash; + char *dirname; + struct dentry *dents[9]; + struct rhashtable *data; + struct aa_label label; +}; + +struct aa_perms { + u32 allow; + u32 audit; + u32 deny; + u32 quiet; + u32 kill; + u32 stop; + u32 complain; + u32 cond; + u32 hide; + u32 prompt; + u16 xindex; +}; + +struct path_cond { + kuid_t uid; + umode_t mode; +}; + +struct aa_secmark { + u8 audit; + u8 deny; + u32 secid; + char *label; +}; + +enum profile_mode { + APPARMOR_ENFORCE = 0, + APPARMOR_COMPLAIN = 1, + APPARMOR_KILL = 2, + APPARMOR_UNCONFINED = 3, +}; + +struct aa_data { + char *key; + u32 size; + char *data; + struct rhash_head head; +}; + +struct aa_ns_acct { + int max_size; + int max_count; + int size; + int count; +}; + +struct aa_ns { + struct aa_policy base; + struct aa_ns *parent; + struct mutex lock; + struct aa_ns_acct acct; + struct aa_profile *unconfined; + struct list_head sub_ns; + atomic_t uniq_null; + long int uniq_id; + int level; + long int revision; + wait_queue_head_t wait; + struct aa_labelset labels; + struct list_head rawdata_list; + struct dentry *dents[13]; +}; + +struct aa_loaddata { + struct kref count; + struct list_head list; + struct work_struct work; + struct dentry *dents[6]; + struct aa_ns *ns; + char *name; + size_t size; + size_t compressed_size; + long int revision; + int abi; + unsigned char *hash; + char *data; +}; + +enum { + AAFS_LOADDATA_ABI = 0, + AAFS_LOADDATA_REVISION = 1, + AAFS_LOADDATA_HASH = 2, + AAFS_LOADDATA_DATA = 3, + AAFS_LOADDATA_COMPRESSED_SIZE = 4, + AAFS_LOADDATA_DIR = 5, + AAFS_LOADDATA_NDENTS = 6, +}; + +struct rawdata_f_data { + struct aa_loaddata *loaddata; +}; + +struct aa_revision { + struct aa_ns *ns; + long int last_read; +}; + +struct multi_transaction { + struct kref count; + ssize_t size; + char data[0]; +}; + +struct apparmor_audit_data { + int error; + int type; + const char *op; + struct aa_label *label; + const char *name; + const char *info; + u32 request; + u32 denied; + union { + struct { + struct aa_label *peer; + union { + struct { + const char *target; + kuid_t ouid; + } fs; + struct { + int rlim; + long unsigned int max; + } rlim; + struct { + int signal; + int unmappedsig; + }; + struct { + int type; + int protocol; + struct sock *peer_sk; + void *addr; + int addrlen; + } net; + }; + }; + struct { + struct aa_profile *profile; + const char *ns; + long int pos; + } iface; + struct { + const char *src_name; + const char *type; + const char *trans; + const char *data; + long unsigned int flags; + } mnt; + }; +}; + +enum audit_type { + AUDIT_APPARMOR_AUDIT = 0, + AUDIT_APPARMOR_ALLOWED = 1, + AUDIT_APPARMOR_DENIED = 2, + AUDIT_APPARMOR_HINT = 3, + AUDIT_APPARMOR_STATUS = 4, + AUDIT_APPARMOR_ERROR = 5, + AUDIT_APPARMOR_KILL = 6, + AUDIT_APPARMOR_AUTO = 7, +}; + +struct aa_audit_rule { + struct aa_label *label; +}; + +struct audit_cache { + struct aa_profile *profile; + kernel_cap_t caps; +}; + +struct aa_task_ctx { + struct aa_label *nnp; + struct aa_label *onexec; + struct aa_label *previous; + u64 token; +}; + +struct counted_str { + struct kref count; + char name[0]; +}; + +struct match_workbuf { + unsigned int count; + unsigned int pos; + unsigned int len; + unsigned int size; + unsigned int history[24]; +}; + +enum path_flags { + PATH_IS_DIR = 1, + PATH_CONNECT_PATH = 4, + PATH_CHROOT_REL = 8, + PATH_CHROOT_NSCONNECT = 16, + PATH_DELEGATE_DELETED = 32768, + PATH_MEDIATE_DELETED = 65536, +}; + +struct aa_load_ent { + struct list_head list; + struct aa_profile *new; + struct aa_profile *old; + struct aa_profile *rename; + const char *ns_name; +}; + +enum aa_code { + AA_U8 = 0, + AA_U16 = 1, + AA_U32 = 2, + AA_U64 = 3, + AA_NAME = 4, + AA_STRING = 5, + AA_BLOB = 6, + AA_STRUCT = 7, + AA_STRUCTEND = 8, + AA_LIST = 9, + AA_LISTEND = 10, + AA_ARRAY = 11, + AA_ARRAYEND = 12, +}; + +struct aa_ext { + void *start; + void *end; + void *pos; + u32 version; +}; + +struct aa_file_ctx { + spinlock_t lock; + struct aa_label *label; + u32 allow; +}; + +struct aa_sk_ctx { + struct aa_label *label; + struct aa_label *peer; +}; + +union aa_buffer { + struct list_head list; + char buffer[1]; +}; + +struct ptrace_relation { + struct task_struct *tracer; + struct task_struct *tracee; + bool invalid; + struct list_head node; + struct callback_head rcu; +}; + +struct access_report_info { + struct callback_head work; + const char *access; + struct task_struct *target; + struct task_struct *agent; +}; + +enum sid_policy_type { + SIDPOL_DEFAULT = 0, + SIDPOL_CONSTRAINED = 1, + SIDPOL_ALLOWED = 2, +}; + +typedef union { + kuid_t uid; + kgid_t gid; +} kid_t; + +enum setid_type { + UID = 0, + GID = 1, +}; + +struct setid_rule { + struct hlist_node next; + kid_t src_id; + kid_t dst_id; + enum setid_type type; +}; + +struct setid_ruleset { + struct hlist_head rules[256]; + char *policy_str; + struct callback_head rcu; + enum setid_type type; +}; + +enum devcg_behavior { + DEVCG_DEFAULT_NONE = 0, + DEVCG_DEFAULT_ALLOW = 1, + DEVCG_DEFAULT_DENY = 2, +}; + +struct dev_exception_item { + u32 major; + u32 minor; + short int type; + short int access; + struct list_head list; + struct callback_head rcu; +}; + +struct dev_cgroup { + struct cgroup_subsys_state css; + struct list_head exceptions; + enum devcg_behavior behavior; +}; + +struct landlock_ruleset_attr { + __u64 handled_access_fs; +}; + +enum landlock_rule_type { + LANDLOCK_RULE_PATH_BENEATH = 1, +}; + +struct landlock_path_beneath_attr { + __u64 allowed_access; + __s32 parent_fd; +} __attribute__((packed)); + +struct landlock_hierarchy { + struct landlock_hierarchy *parent; + refcount_t usage; +}; + +struct landlock_ruleset { + struct rb_root root; + struct landlock_hierarchy *hierarchy; + union { + struct work_struct work_free; + struct { + struct mutex lock; + refcount_t usage; + u32 num_rules; + u32 num_layers; + u16 fs_access_masks[0]; + }; + }; +}; + +struct landlock_cred_security { + struct landlock_ruleset *domain; +}; + +struct landlock_object; + +struct landlock_object_underops { + void (*release)(struct landlock_object * const); +}; + +struct landlock_object { + refcount_t usage; + spinlock_t lock; + void *underobj; + union { + struct callback_head rcu_free; + const struct landlock_object_underops *underops; + }; +}; + +struct landlock_layer { + u16 level; + u16 access; +}; + +struct landlock_rule { + struct rb_node node; + struct landlock_object *object; + u32 num_layers; + struct landlock_layer layers[0]; +}; + +struct landlock_inode_security { + struct landlock_object *object; +}; + +struct landlock_superblock_security { + atomic_long_t inode_refs; +}; + +enum integrity_status { + INTEGRITY_PASS = 0, + INTEGRITY_PASS_IMMUTABLE = 1, + INTEGRITY_FAIL = 2, + INTEGRITY_FAIL_IMMUTABLE = 3, + INTEGRITY_NOLABEL = 4, + INTEGRITY_NOXATTRS = 5, + INTEGRITY_UNKNOWN = 6, +}; + +struct ima_digest_data { + u8 algo; + u8 length; + union { + struct { + u8 unused; + u8 type; + } sha1; + struct { + u8 type; + u8 algo; + } ng; + u8 data[2]; + } xattr; + u8 digest[0]; +}; + +struct integrity_iint_cache { + struct rb_node rb_node; + struct mutex mutex; + struct inode *inode; + u64 version; + long unsigned int flags; + long unsigned int measured_pcrs; + long unsigned int atomic_flags; + enum integrity_status ima_file_status: 4; + enum integrity_status ima_mmap_status: 4; + enum integrity_status ima_bprm_status: 4; + enum integrity_status ima_read_status: 4; + enum integrity_status ima_creds_status: 4; + enum integrity_status evm_status: 4; + struct ima_digest_data *ima_hash; +}; + +struct modsig; + +struct public_key { + void *key; + u32 keylen; + enum OID algo; + void *params; + u32 paramlen; + bool key_is_private; + const char *id_type; + const char *pkey_algo; +}; + +struct asymmetric_key_id; + +struct public_key_signature { + struct asymmetric_key_id *auth_ids[2]; + u8 *s; + u8 *digest; + u32 s_size; + u32 digest_size; + const char *pkey_algo; + const char *hash_algo; + const char *encoding; + const void *data; + unsigned int data_size; +}; + +struct asymmetric_key_id { + short unsigned int len; + unsigned char data[0]; +}; + +enum asymmetric_payload_bits { + asym_crypto = 0, + asym_subtype = 1, + asym_key_ids = 2, + asym_auth = 3, +}; + +struct signature_v2_hdr { + uint8_t type; + uint8_t version; + uint8_t hash_algo; + __be32 keyid; + __be16 sig_size; + uint8_t sig[0]; +} __attribute__((packed)); + +typedef struct { + efi_guid_t signature_owner; + u8 signature_data[0]; +} efi_signature_data_t; + +typedef struct { + efi_guid_t signature_type; + u32 signature_list_size; + u32 signature_header_size; + u32 signature_size; + u8 signature_header[0]; +} efi_signature_list_t; + +typedef void (*efi_element_handler_t)(const char *, const void *, size_t); + +struct efi_mokvar_table_entry { + char name[256]; + u64 data_size; + u8 data[0]; +}; + +struct evm_ima_xattr_data { + u8 type; + u8 data[0]; +}; + +enum ima_show_type { + IMA_SHOW_BINARY = 0, + IMA_SHOW_BINARY_NO_FIELD_LEN = 1, + IMA_SHOW_BINARY_OLD_STRING_FMT = 2, + IMA_SHOW_ASCII = 3, +}; + +struct ima_event_data { + struct integrity_iint_cache *iint; + struct file *file; + const unsigned char *filename; + struct evm_ima_xattr_data *xattr_value; + int xattr_len; + const struct modsig *modsig; + const char *violation; + const void *buf; + int buf_len; +}; + +struct ima_field_data { + u8 *data; + u32 len; +}; + +struct ima_template_field { + const char field_id[16]; + int (*field_init)(struct ima_event_data *, struct ima_field_data *); + void (*field_show)(struct seq_file *, enum ima_show_type, struct ima_field_data *); +}; + +struct ima_template_desc { + struct list_head list; + char *name; + char *fmt; + int num_fields; + const struct ima_template_field **fields; +}; + +struct ima_template_entry { + int pcr; + struct tpm_digest *digests; + struct ima_template_desc *template_desc; + u32 template_data_len; + struct ima_field_data template_data[0]; +}; + +struct ima_queue_entry { + struct hlist_node hnext; + struct list_head later; + struct ima_template_entry *entry; +}; + +struct ima_h_table { + atomic_long_t len; + atomic_long_t violations; + struct hlist_head queue[1024]; +}; + +enum ima_fs_flags { + IMA_FS_BUSY = 0, +}; + +enum evm_ima_xattr_type { + IMA_XATTR_DIGEST = 1, + EVM_XATTR_HMAC = 2, + EVM_IMA_XATTR_DIGSIG = 3, + IMA_XATTR_DIGEST_NG = 4, + EVM_XATTR_PORTABLE_DIGSIG = 5, + IMA_XATTR_LAST = 6, +}; + +enum ima_hooks { + NONE = 0, + FILE_CHECK = 1, + MMAP_CHECK = 2, + BPRM_CHECK = 3, + CREDS_CHECK = 4, + POST_SETATTR = 5, + MODULE_CHECK = 6, + FIRMWARE_CHECK = 7, + KEXEC_KERNEL_CHECK = 8, + KEXEC_INITRAMFS_CHECK = 9, + POLICY_CHECK = 10, + KEXEC_CMDLINE = 11, + KEY_CHECK = 12, + CRITICAL_DATA = 13, + SETXATTR_CHECK = 14, + MAX_CHECK = 15, +}; + +enum tpm_pcrs { + TPM_PCR0 = 0, + TPM_PCR8 = 8, + TPM_PCR10 = 10, +}; + +struct ima_algo_desc { + struct crypto_shash *tfm; + enum hash_algo algo; +}; + +enum lsm_rule_types { + LSM_OBJ_USER = 0, + LSM_OBJ_ROLE = 1, + LSM_OBJ_TYPE = 2, + LSM_SUBJ_USER = 3, + LSM_SUBJ_ROLE = 4, + LSM_SUBJ_TYPE = 5, +}; + +enum policy_types { + ORIGINAL_TCB = 1, + DEFAULT_TCB = 2, +}; + +enum policy_rule_list { + IMA_DEFAULT_POLICY = 1, + IMA_CUSTOM_POLICY = 2, +}; + +struct ima_rule_opt_list { + size_t count; + char *items[0]; +}; + +struct ima_rule_entry { + struct list_head list; + int action; + unsigned int flags; + enum ima_hooks func; + int mask; + long unsigned int fsmagic; + uuid_t fsuuid; + kuid_t uid; + kgid_t gid; + kuid_t fowner; + kgid_t fgroup; + bool (*uid_op)(kuid_t, kuid_t); + bool (*gid_op)(kgid_t, kgid_t); + bool (*fowner_op)(kuid_t, kuid_t); + bool (*fgroup_op)(kgid_t, kgid_t); + int pcr; + unsigned int allowed_algos; + struct { + void *rule; + char *args_p; + int type; + } lsm[6]; + char *fsname; + struct ima_rule_opt_list *keyrings; + struct ima_rule_opt_list *label; + struct ima_template_desc *template; +}; + +enum policy_opt { + Opt_measure = 0, + Opt_dont_measure = 1, + Opt_appraise = 2, + Opt_dont_appraise = 3, + Opt_audit = 4, + Opt_hash___3 = 5, + Opt_dont_hash = 6, + Opt_obj_user = 7, + Opt_obj_role = 8, + Opt_obj_type = 9, + Opt_subj_user = 10, + Opt_subj_role = 11, + Opt_subj_type = 12, + Opt_func = 13, + Opt_mask = 14, + Opt_fsmagic = 15, + Opt_fsname = 16, + Opt_fsuuid = 17, + Opt_uid_eq = 18, + Opt_euid_eq = 19, + Opt_gid_eq = 20, + Opt_egid_eq = 21, + Opt_fowner_eq = 22, + Opt_fgroup_eq = 23, + Opt_uid_gt = 24, + Opt_euid_gt = 25, + Opt_gid_gt = 26, + Opt_egid_gt = 27, + Opt_fowner_gt = 28, + Opt_fgroup_gt = 29, + Opt_uid_lt = 30, + Opt_euid_lt = 31, + Opt_gid_lt = 32, + Opt_egid_lt = 33, + Opt_fowner_lt = 34, + Opt_fgroup_lt = 35, + Opt_appraise_type = 36, + Opt_appraise_flag = 37, + Opt_appraise_algos = 38, + Opt_permit_directio = 39, + Opt_pcr = 40, + Opt_template = 41, + Opt_keyrings = 42, + Opt_label = 43, + Opt_err___10 = 44, +}; + +struct ima_kexec_hdr { + u16 version; + u16 _reserved0; + u32 _reserved1; + u64 buffer_size; + u64 count; +}; + +enum header_fields { + HDR_PCR = 0, + HDR_DIGEST = 1, + HDR_TEMPLATE_NAME = 2, + HDR_TEMPLATE_DATA = 3, + HDR__LAST = 4, +}; + +enum data_formats { + DATA_FMT_DIGEST = 0, + DATA_FMT_DIGEST_WITH_ALGO = 1, + DATA_FMT_STRING = 2, + DATA_FMT_HEX = 3, + DATA_FMT_UINT = 4, +}; + +struct modsig___2 { + struct pkcs7_message *pkcs7_msg; + enum hash_algo hash_algo; + const u8 *digest; + u32 digest_size; + int raw_pkcs7_len; + u8 raw_pkcs7[0]; +}; + +struct ima_key_entry { + struct list_head list; + void *payload; + size_t payload_len; + char *keyring_name; +}; + +struct evm_xattr { + struct evm_ima_xattr_data data; + u8 digest[20]; +}; + +struct xattr_list { + struct list_head list; + char *name; + bool enabled; +}; + +struct evm_digest { + struct ima_digest_data hdr; + char digest[64]; +}; + +struct h_misc { + long unsigned int ino; + __u32 generation; + uid_t uid; + gid_t gid; + umode_t mode; +}; + +enum { + CRYPTO_MSG_ALG_REQUEST = 0, + CRYPTO_MSG_ALG_REGISTER = 1, + CRYPTO_MSG_ALG_LOADED = 2, +}; + +struct crypto_larval { + struct crypto_alg alg; + struct crypto_alg *adult; + struct completion completion; + u32 mask; + bool test_started; + long: 24; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct crypto_cipher { + struct crypto_tfm base; +}; + +struct rtattr { + short unsigned int rta_len; + short unsigned int rta_type; +}; + +struct crypto_queue { + struct list_head list; + struct list_head *backlog; + unsigned int qlen; + unsigned int max_qlen; +}; + +struct crypto_attr_alg { + char name[128]; +}; + +struct crypto_attr_type { + u32 type; + u32 mask; +}; + +enum { + NAPI_STATE_SCHED = 0, + NAPI_STATE_MISSED = 1, + NAPI_STATE_DISABLE = 2, + NAPI_STATE_NPSVC = 3, + NAPI_STATE_LISTED = 4, + NAPI_STATE_NO_BUSY_POLL = 5, + NAPI_STATE_IN_BUSY_POLL = 6, + NAPI_STATE_PREFER_BUSY_POLL = 7, + NAPI_STATE_THREADED = 8, + NAPI_STATE_SCHED_THREADED = 9, +}; + +enum xps_map_type { + XPS_CPUS = 0, + XPS_RXQS = 1, + XPS_MAPS_MAX = 2, +}; + +enum bpf_xdp_mode { + XDP_MODE_SKB = 0, + XDP_MODE_DRV = 1, + XDP_MODE_HW = 2, + __MAX_XDP_MODE = 3, +}; + +enum { + NETIF_MSG_DRV_BIT = 0, + NETIF_MSG_PROBE_BIT = 1, + NETIF_MSG_LINK_BIT = 2, + NETIF_MSG_TIMER_BIT = 3, + NETIF_MSG_IFDOWN_BIT = 4, + NETIF_MSG_IFUP_BIT = 5, + NETIF_MSG_RX_ERR_BIT = 6, + NETIF_MSG_TX_ERR_BIT = 7, + NETIF_MSG_TX_QUEUED_BIT = 8, + NETIF_MSG_INTR_BIT = 9, + NETIF_MSG_TX_DONE_BIT = 10, + NETIF_MSG_RX_STATUS_BIT = 11, + NETIF_MSG_PKTDATA_BIT = 12, + NETIF_MSG_HW_BIT = 13, + NETIF_MSG_WOL_BIT = 14, + NETIF_MSG_CLASS_COUNT = 15, +}; + +enum { + CRYPTOA_UNSPEC = 0, + CRYPTOA_ALG = 1, + CRYPTOA_TYPE = 2, + __CRYPTOA_MAX = 3, +}; + +struct scatter_walk { + struct scatterlist *sg; + unsigned int offset; +}; + +struct aead_request { + struct crypto_async_request base; + unsigned int assoclen; + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_aead; + +struct aead_alg { + int (*setkey)(struct crypto_aead *, const u8 *, unsigned int); + int (*setauthsize)(struct crypto_aead *, unsigned int); + int (*encrypt)(struct aead_request *); + int (*decrypt)(struct aead_request *); + int (*init)(struct crypto_aead *); + void (*exit)(struct crypto_aead *); + unsigned int ivsize; + unsigned int maxauthsize; + unsigned int chunksize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct crypto_aead { + unsigned int authsize; + unsigned int reqsize; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +struct aead_instance { + void (*free)(struct aead_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[128]; + struct crypto_instance base; + } s; + struct aead_alg alg; + }; +}; + +struct crypto_aead_spawn { + struct crypto_spawn base; +}; + +enum crypto_attr_type_t { + CRYPTOCFGA_UNSPEC = 0, + CRYPTOCFGA_PRIORITY_VAL = 1, + CRYPTOCFGA_REPORT_LARVAL = 2, + CRYPTOCFGA_REPORT_HASH = 3, + CRYPTOCFGA_REPORT_BLKCIPHER = 4, + CRYPTOCFGA_REPORT_AEAD = 5, + CRYPTOCFGA_REPORT_COMPRESS = 6, + CRYPTOCFGA_REPORT_RNG = 7, + CRYPTOCFGA_REPORT_CIPHER = 8, + CRYPTOCFGA_REPORT_AKCIPHER = 9, + CRYPTOCFGA_REPORT_KPP = 10, + CRYPTOCFGA_REPORT_ACOMP = 11, + CRYPTOCFGA_STAT_LARVAL = 12, + CRYPTOCFGA_STAT_HASH = 13, + CRYPTOCFGA_STAT_BLKCIPHER = 14, + CRYPTOCFGA_STAT_AEAD = 15, + CRYPTOCFGA_STAT_COMPRESS = 16, + CRYPTOCFGA_STAT_RNG = 17, + CRYPTOCFGA_STAT_CIPHER = 18, + CRYPTOCFGA_STAT_AKCIPHER = 19, + CRYPTOCFGA_STAT_KPP = 20, + CRYPTOCFGA_STAT_ACOMP = 21, + __CRYPTOCFGA_MAX = 22, +}; + +struct crypto_report_aead { + char type[64]; + char geniv[64]; + unsigned int blocksize; + unsigned int maxauthsize; + unsigned int ivsize; +}; + +struct crypto_sync_skcipher; + +struct aead_geniv_ctx { + spinlock_t lock; + struct crypto_aead *child; + struct crypto_sync_skcipher *sknull; + u8 salt[0]; +}; + +struct crypto_rng; + +struct rng_alg { + int (*generate)(struct crypto_rng *, const u8 *, unsigned int, u8 *, unsigned int); + int (*seed)(struct crypto_rng *, const u8 *, unsigned int); + void (*set_ent)(struct crypto_rng *, const u8 *, unsigned int); + unsigned int seedsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct crypto_rng { + struct crypto_tfm base; +}; + +struct crypto_cipher_spawn { + struct crypto_spawn base; +}; + +struct crypto_sync_skcipher { + struct crypto_skcipher base; +}; + +struct skcipher_instance { + void (*free)(struct skcipher_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[128]; + struct crypto_instance base; + } s; + struct skcipher_alg alg; + }; +}; + +struct crypto_skcipher_spawn { + struct crypto_spawn base; +}; + +struct skcipher_walk { + union { + struct { + struct page *page; + long unsigned int offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } src; + union { + struct { + struct page *page; + long unsigned int offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } dst; + struct scatter_walk in; + unsigned int nbytes; + struct scatter_walk out; + unsigned int total; + struct list_head buffers; + u8 *page; + u8 *buffer; + u8 *oiv; + void *iv; + unsigned int ivsize; + int flags; + unsigned int blocksize; + unsigned int stride; + unsigned int alignmask; +}; + +struct skcipher_ctx_simple { + struct crypto_cipher *cipher; +}; + +struct crypto_report_blkcipher { + char type[64]; + char geniv[64]; + unsigned int blocksize; + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; +}; + +enum { + SKCIPHER_WALK_PHYS = 1, + SKCIPHER_WALK_SLOW = 2, + SKCIPHER_WALK_COPY = 4, + SKCIPHER_WALK_DIFF = 8, + SKCIPHER_WALK_SLEEP = 16, +}; + +struct skcipher_walk_buffer { + struct list_head entry; + struct scatter_walk dst; + unsigned int len; + u8 *data; + u8 buffer[0]; +}; + +struct ahash_alg { + int (*init)(struct ahash_request *); + int (*update)(struct ahash_request *); + int (*final)(struct ahash_request *); + int (*finup)(struct ahash_request *); + int (*digest)(struct ahash_request *); + int (*export)(struct ahash_request *, void *); + int (*import)(struct ahash_request *, const void *); + int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_ahash *); + void (*exit_tfm)(struct crypto_ahash *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct hash_alg_common halg; +}; + +struct crypto_hash_walk { + char *data; + unsigned int offset; + unsigned int alignmask; + struct page *pg; + unsigned int entrylen; + unsigned int total; + struct scatterlist *sg; + unsigned int flags; +}; + +struct ahash_instance { + void (*free)(struct ahash_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[256]; + struct crypto_instance base; + } s; + struct ahash_alg alg; + }; +}; + +struct crypto_ahash_spawn { + struct crypto_spawn base; +}; + +struct crypto_report_hash { + char type[64]; + unsigned int blocksize; + unsigned int digestsize; +}; + +struct ahash_request_priv { + crypto_completion_t complete; + void *data; + u8 *result; + u32 flags; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *ubuf[0]; +}; + +struct shash_instance { + void (*free)(struct shash_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[256]; + struct crypto_instance base; + } s; + struct shash_alg alg; + }; +}; + +struct crypto_shash_spawn { + struct crypto_spawn base; +}; + +struct crypto_report_akcipher { + char type[64]; +}; + +struct akcipher_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_akcipher { + struct crypto_tfm base; +}; + +struct akcipher_alg { + int (*sign)(struct akcipher_request *); + int (*verify)(struct akcipher_request *); + int (*encrypt)(struct akcipher_request *); + int (*decrypt)(struct akcipher_request *); + int (*set_pub_key)(struct crypto_akcipher *, const void *, unsigned int); + int (*set_priv_key)(struct crypto_akcipher *, const void *, unsigned int); + unsigned int (*max_size)(struct crypto_akcipher *); + int (*init)(struct crypto_akcipher *); + void (*exit)(struct crypto_akcipher *); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct akcipher_instance { + void (*free)(struct akcipher_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[128]; + struct crypto_instance base; + } s; + struct akcipher_alg alg; + }; +}; + +struct crypto_akcipher_spawn { + struct crypto_spawn base; +}; + +struct crypto_report_kpp { + char type[64]; +}; + +typedef long unsigned int mpi_limb_t; + +struct gcry_mpi { + int alloced; + int nlimbs; + int nbits; + int sign; + unsigned int flags; + mpi_limb_t *d; +}; + +typedef struct gcry_mpi *MPI; + +struct dh_ctx { + MPI p; + MPI q; + MPI g; + MPI xa; +}; + +enum { + CRYPTO_KPP_SECRET_TYPE_UNKNOWN = 0, + CRYPTO_KPP_SECRET_TYPE_DH = 1, + CRYPTO_KPP_SECRET_TYPE_ECDH = 2, +}; + +struct kpp_secret { + short unsigned int type; + short unsigned int len; +}; + +enum rsapubkey_actions { + ACT_rsa_get_e = 0, + ACT_rsa_get_n = 1, + NR__rsapubkey_actions = 2, +}; + +enum rsaprivkey_actions { + ACT_rsa_get_d = 0, + ACT_rsa_get_dp = 1, + ACT_rsa_get_dq = 2, + ACT_rsa_get_e___2 = 3, + ACT_rsa_get_n___2 = 4, + ACT_rsa_get_p = 5, + ACT_rsa_get_q = 6, + ACT_rsa_get_qinv = 7, + NR__rsaprivkey_actions = 8, +}; + +struct rsa_key { + const u8 *n; + const u8 *e; + const u8 *d; + const u8 *p; + const u8 *q; + const u8 *dp; + const u8 *dq; + const u8 *qinv; + size_t n_sz; + size_t e_sz; + size_t d_sz; + size_t p_sz; + size_t q_sz; + size_t dp_sz; + size_t dq_sz; + size_t qinv_sz; +}; + +struct rsa_mpi_key { + MPI n; + MPI e; + MPI d; +}; + +struct asn1_decoder___2; + +struct rsa_asn1_template { + const char *name; + const u8 *data; + size_t size; +}; + +struct pkcs1pad_ctx { + struct crypto_akcipher *child; + unsigned int key_size; +}; + +struct pkcs1pad_inst_ctx { + struct crypto_akcipher_spawn spawn; + const struct rsa_asn1_template *digest_info; +}; + +struct pkcs1pad_request { + struct scatterlist in_sg[2]; + struct scatterlist out_sg[1]; + uint8_t *in_buf; + uint8_t *out_buf; + long: 64; + long: 64; + struct akcipher_request child_req; +}; + +struct crypto_report_acomp { + char type[64]; +}; + +struct acomp_alg { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + int (*init)(struct crypto_acomp *); + void (*exit)(struct crypto_acomp *); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct crypto_report_comp { + char type[64]; +}; + +struct crypto_scomp { + struct crypto_tfm base; +}; + +struct scomp_alg { + void * (*alloc_ctx)(struct crypto_scomp *); + void (*free_ctx)(struct crypto_scomp *, void *); + int (*compress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + int (*decompress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct scomp_scratch { + spinlock_t lock; + void *src; + void *dst; +}; + +struct cryptomgr_param { + struct rtattr *tb[34]; + struct { + struct rtattr attr; + struct crypto_attr_type data; + } type; + struct { + struct rtattr attr; + struct crypto_attr_alg data; + } attrs[32]; + char template[128]; + struct crypto_larval *larval; + u32 otype; + u32 omask; +}; + +struct crypto_test_param { + char driver[128]; + char alg[128]; + u32 type; +}; + +struct hmac_ctx { + struct crypto_shash *hash; +}; + +struct md5_state { + u32 hash[4]; + u32 block[16]; + u64 byte_count; +}; + +struct sha1_state { + u32 state[5]; + u64 count; + u8 buffer[64]; +}; + +typedef void sha1_block_fn(struct sha1_state *, const u8 *, int); + +struct sha256_state { + u32 state[8]; + u64 count; + u8 buf[64]; +}; + +struct sha512_state { + u64 state[8]; + u64 count[2]; + u8 buf[128]; +}; + +typedef void sha512_block_fn(struct sha512_state *, const u8 *, int); + +typedef struct { + u64 a; + u64 b; +} u128; + +typedef struct { + __be64 a; + __be64 b; +} be128; + +typedef struct { + __le64 b; + __le64 a; +} le128; + +struct gf128mul_4k { + be128 t[256]; +}; + +struct gf128mul_64k { + struct gf128mul_4k *t[16]; +}; + +struct crypto_cts_ctx { + struct crypto_skcipher *child; +}; + +struct crypto_cts_reqctx { + struct scatterlist sg[2]; + unsigned int offset; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct skcipher_request subreq; +}; + +struct xts_tfm_ctx { + struct crypto_skcipher *child; + struct crypto_cipher *tweak; +}; + +struct xts_instance_ctx { + struct crypto_skcipher_spawn spawn; + char name[128]; +}; + +struct xts_request_ctx { + le128 t; + struct scatterlist *tail; + struct scatterlist sg[2]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct skcipher_request subreq; +}; + +struct crypto_rfc3686_ctx { + struct crypto_skcipher *child; + u8 nonce[4]; +}; + +struct crypto_rfc3686_req_ctx { + u8 iv[16]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct skcipher_request subreq; +}; + +struct gcm_instance_ctx { + struct crypto_skcipher_spawn ctr; + struct crypto_ahash_spawn ghash; +}; + +struct crypto_gcm_ctx { + struct crypto_skcipher *ctr; + struct crypto_ahash *ghash; +}; + +struct crypto_rfc4106_ctx { + struct crypto_aead *child; + u8 nonce[4]; +}; + +struct crypto_rfc4106_req_ctx { + struct scatterlist src[3]; + struct scatterlist dst[3]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct aead_request subreq; +}; + +struct crypto_rfc4543_instance_ctx { + struct crypto_aead_spawn aead; +}; + +struct crypto_rfc4543_ctx { + struct crypto_aead *child; + struct crypto_sync_skcipher *null; + u8 nonce[4]; +}; + +struct crypto_rfc4543_req_ctx { + struct aead_request subreq; +}; + +struct crypto_gcm_ghash_ctx { + unsigned int cryptlen; + struct scatterlist *src; + int (*complete)(struct aead_request *, u32); +}; + +struct crypto_gcm_req_priv_ctx { + u8 iv[16]; + u8 auth_tag[16]; + u8 iauth_tag[16]; + struct scatterlist src[3]; + struct scatterlist dst[3]; + struct scatterlist sg; + struct crypto_gcm_ghash_ctx ghash_ctx; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct ahash_request ahreq; + struct skcipher_request skreq; + } u; +}; + +struct crypto_aes_ctx { + u32 key_enc[60]; + u32 key_dec[60]; + u32 key_length; +}; + +struct deflate_ctx { + struct z_stream_s comp_stream; + struct z_stream_s decomp_stream; +}; + +struct chksum_ctx { + u32 key; +}; + +struct chksum_desc_ctx { + u32 crc; +}; + +struct chksum_desc_ctx___2 { + __u16 crc; +}; + +struct lzo_ctx { + void *lzo_comp_mem; +}; + +struct lzorle_ctx { + void *lzorle_comp_mem; +}; + +struct crypto_report_rng { + char type[64]; + unsigned int seedsize; +}; + +struct random_ready_callback { + struct list_head list; + void (*func)(struct random_ready_callback *); + struct module *owner; +}; + +struct drbg_string { + const unsigned char *buf; + size_t len; + struct list_head list; +}; + +typedef uint32_t drbg_flag_t; + +struct drbg_core { + drbg_flag_t flags; + __u8 statelen; + __u8 blocklen_bytes; + char cra_name[128]; + char backend_cra_name[128]; +}; + +struct drbg_state; + +struct drbg_state_ops { + int (*update)(struct drbg_state *, struct list_head *, int); + int (*generate)(struct drbg_state *, unsigned char *, unsigned int, struct list_head *); + int (*crypto_init)(struct drbg_state *); + int (*crypto_fini)(struct drbg_state *); +}; + +struct drbg_state { + struct mutex drbg_mutex; + unsigned char *V; + unsigned char *Vbuf; + unsigned char *C; + unsigned char *Cbuf; + size_t reseed_ctr; + size_t reseed_threshold; + unsigned char *scratchpad; + unsigned char *scratchpadbuf; + void *priv_data; + struct crypto_skcipher *ctr_handle; + struct skcipher_request *ctr_req; + __u8 *outscratchpadbuf; + __u8 *outscratchpad; + struct crypto_wait ctr_wait; + struct scatterlist sg_in; + struct scatterlist sg_out; + bool seeded; + bool pr; + bool fips_primed; + unsigned char *prev; + struct work_struct seed_work; + struct crypto_rng *jent; + const struct drbg_state_ops *d_ops; + const struct drbg_core *core; + struct drbg_string test_data; + struct random_ready_callback random_ready; +}; + +enum drbg_prefixes { + DRBG_PREFIX0 = 0, + DRBG_PREFIX1 = 1, + DRBG_PREFIX2 = 2, + DRBG_PREFIX3 = 3, +}; + +struct s { + __be32 conv; +}; + +struct rand_data { + __u64 data; + __u64 old_data; + __u64 prev_time; + __u64 last_delta; + __s64 last_delta2; + unsigned int osr; + unsigned char *mem; + unsigned int memlocation; + unsigned int memblocks; + unsigned int memblocksize; + unsigned int memaccessloops; + int rct_count; + unsigned int apt_observations; + unsigned int apt_count; + unsigned int apt_base; + unsigned int apt_base_set: 1; + unsigned int health_failure: 1; +}; + +struct rand_data___2; + +struct jitterentropy { + spinlock_t jent_lock; + struct rand_data___2 *entropy_collector; + unsigned int reset_cnt; +}; + +struct ghash_ctx { + struct gf128mul_4k *gf128; +}; + +struct ghash_desc_ctx { + u8 buffer[16]; + u32 bytes; +}; + +struct asymmetric_key_ids { + void *id[2]; +}; + +struct asymmetric_key_subtype { + struct module *owner; + const char *name; + short unsigned int name_len; + void (*describe)(const struct key *, struct seq_file *); + void (*destroy)(void *, void *); + int (*query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*verify_signature)(const struct key *, const struct public_key_signature *); +}; + +struct asymmetric_key_parser { + struct list_head link; + struct module *owner; + const char *name; + int (*parse)(struct key_preparsed_payload *); +}; + +enum x509_actions { + ACT_x509_extract_key_data = 0, + ACT_x509_extract_name_segment = 1, + ACT_x509_note_OID = 2, + ACT_x509_note_issuer = 3, + ACT_x509_note_not_after = 4, + ACT_x509_note_not_before = 5, + ACT_x509_note_params = 6, + ACT_x509_note_pkey_algo = 7, + ACT_x509_note_serial = 8, + ACT_x509_note_signature = 9, + ACT_x509_note_subject = 10, + ACT_x509_note_tbs_certificate = 11, + ACT_x509_process_extension = 12, + NR__x509_actions = 13, +}; + +enum x509_akid_actions { + ACT_x509_akid_note_kid = 0, + ACT_x509_akid_note_name = 1, + ACT_x509_akid_note_serial = 2, + ACT_x509_extract_name_segment___2 = 3, + ACT_x509_note_OID___2 = 4, + NR__x509_akid_actions = 5, +}; + +struct x509_certificate { + struct x509_certificate *next; + struct x509_certificate *signer; + struct public_key *pub; + struct public_key_signature *sig; + char *issuer; + char *subject; + struct asymmetric_key_id *id; + struct asymmetric_key_id *skid; + time64_t valid_from; + time64_t valid_to; + const void *tbs; + unsigned int tbs_size; + unsigned int raw_sig_size; + const void *raw_sig; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_subject; + unsigned int raw_subject_size; + unsigned int raw_skid_size; + const void *raw_skid; + unsigned int index; + bool seen; + bool verified; + bool self_signed; + bool unsupported_key; + bool unsupported_sig; + bool blacklisted; +}; + +struct x509_parse_context { + struct x509_certificate *cert; + long unsigned int data; + const void *cert_start; + const void *key; + size_t key_size; + const void *params; + size_t params_size; + enum OID key_algo; + enum OID last_oid; + enum OID algo_oid; + unsigned char nr_mpi; + u8 o_size; + u8 cn_size; + u8 email_size; + u16 o_offset; + u16 cn_offset; + u16 email_offset; + unsigned int raw_akid_size; + const void *raw_akid; + const void *akid_raw_issuer; + unsigned int akid_raw_issuer_size; +}; + +enum pkcs7_actions { + ACT_pkcs7_check_content_type = 0, + ACT_pkcs7_extract_cert = 1, + ACT_pkcs7_note_OID = 2, + ACT_pkcs7_note_certificate_list = 3, + ACT_pkcs7_note_content = 4, + ACT_pkcs7_note_data = 5, + ACT_pkcs7_note_signed_info = 6, + ACT_pkcs7_note_signeddata_version = 7, + ACT_pkcs7_note_signerinfo_version = 8, + ACT_pkcs7_sig_note_authenticated_attr = 9, + ACT_pkcs7_sig_note_digest_algo = 10, + ACT_pkcs7_sig_note_issuer = 11, + ACT_pkcs7_sig_note_pkey_algo = 12, + ACT_pkcs7_sig_note_serial = 13, + ACT_pkcs7_sig_note_set_of_authattrs = 14, + ACT_pkcs7_sig_note_signature = 15, + ACT_pkcs7_sig_note_skid = 16, + NR__pkcs7_actions = 17, +}; + +struct pkcs7_signed_info { + struct pkcs7_signed_info *next; + struct x509_certificate *signer; + unsigned int index; + bool unsupported_crypto; + bool blacklisted; + const void *msgdigest; + unsigned int msgdigest_len; + unsigned int authattrs_len; + const void *authattrs; + long unsigned int aa_set; + time64_t signing_time; + struct public_key_signature *sig; +}; + +struct pkcs7_message___2 { + struct x509_certificate *certs; + struct x509_certificate *crl; + struct pkcs7_signed_info *signed_infos; + u8 version; + bool have_authattrs; + enum OID data_type; + size_t data_len; + size_t data_hdrlen; + const void *data; +}; + +struct pkcs7_parse_context { + struct pkcs7_message___2 *msg; + struct pkcs7_signed_info *sinfo; + struct pkcs7_signed_info **ppsinfo; + struct x509_certificate *certs; + struct x509_certificate **ppcerts; + long unsigned int data; + enum OID last_oid; + unsigned int x509_index; + unsigned int sinfo_index; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_skid; + unsigned int raw_skid_size; + bool expect_skid; +}; + +struct mz_hdr { + uint16_t magic; + uint16_t lbsize; + uint16_t blocks; + uint16_t relocs; + uint16_t hdrsize; + uint16_t min_extra_pps; + uint16_t max_extra_pps; + uint16_t ss; + uint16_t sp; + uint16_t checksum; + uint16_t ip; + uint16_t cs; + uint16_t reloc_table_offset; + uint16_t overlay_num; + uint16_t reserved0[4]; + uint16_t oem_id; + uint16_t oem_info; + uint16_t reserved1[10]; + uint32_t peaddr; + char message[0]; +}; + +struct pe_hdr { + uint32_t magic; + uint16_t machine; + uint16_t sections; + uint32_t timestamp; + uint32_t symbol_table; + uint32_t symbols; + uint16_t opt_hdr_size; + uint16_t flags; +}; + +struct pe32_opt_hdr { + uint16_t magic; + uint8_t ld_major; + uint8_t ld_minor; + uint32_t text_size; + uint32_t data_size; + uint32_t bss_size; + uint32_t entry_point; + uint32_t code_base; + uint32_t data_base; + uint32_t image_base; + uint32_t section_align; + uint32_t file_align; + uint16_t os_major; + uint16_t os_minor; + uint16_t image_major; + uint16_t image_minor; + uint16_t subsys_major; + uint16_t subsys_minor; + uint32_t win32_version; + uint32_t image_size; + uint32_t header_size; + uint32_t csum; + uint16_t subsys; + uint16_t dll_flags; + uint32_t stack_size_req; + uint32_t stack_size; + uint32_t heap_size_req; + uint32_t heap_size; + uint32_t loader_flags; + uint32_t data_dirs; +}; + +struct pe32plus_opt_hdr { + uint16_t magic; + uint8_t ld_major; + uint8_t ld_minor; + uint32_t text_size; + uint32_t data_size; + uint32_t bss_size; + uint32_t entry_point; + uint32_t code_base; + uint64_t image_base; + uint32_t section_align; + uint32_t file_align; + uint16_t os_major; + uint16_t os_minor; + uint16_t image_major; + uint16_t image_minor; + uint16_t subsys_major; + uint16_t subsys_minor; + uint32_t win32_version; + uint32_t image_size; + uint32_t header_size; + uint32_t csum; + uint16_t subsys; + uint16_t dll_flags; + uint64_t stack_size_req; + uint64_t stack_size; + uint64_t heap_size_req; + uint64_t heap_size; + uint32_t loader_flags; + uint32_t data_dirs; +}; + +struct data_dirent { + uint32_t virtual_address; + uint32_t size; +}; + +struct data_directory { + struct data_dirent exports; + struct data_dirent imports; + struct data_dirent resources; + struct data_dirent exceptions; + struct data_dirent certs; + struct data_dirent base_relocations; + struct data_dirent debug; + struct data_dirent arch; + struct data_dirent global_ptr; + struct data_dirent tls; + struct data_dirent load_config; + struct data_dirent bound_imports; + struct data_dirent import_addrs; + struct data_dirent delay_imports; + struct data_dirent clr_runtime_hdr; + struct data_dirent reserved; +}; + +struct section_header { + char name[8]; + uint32_t virtual_size; + uint32_t virtual_address; + uint32_t raw_data_size; + uint32_t data_addr; + uint32_t relocs; + uint32_t line_numbers; + uint16_t num_relocs; + uint16_t num_lin_numbers; + uint32_t flags; +}; + +struct win_certificate { + uint32_t length; + uint16_t revision; + uint16_t cert_type; +}; + +struct pefile_context { + unsigned int header_size; + unsigned int image_checksum_offset; + unsigned int cert_dirent_offset; + unsigned int n_data_dirents; + unsigned int n_sections; + unsigned int certs_size; + unsigned int sig_offset; + unsigned int sig_len; + const struct section_header *secs; + const void *digest; + unsigned int digest_len; + const char *digest_algo; +}; + +enum mscode_actions { + ACT_mscode_note_content_type = 0, + ACT_mscode_note_digest = 1, + ACT_mscode_note_digest_algo = 2, + NR__mscode_actions = 3, +}; + +enum { + DISK_EVENT_MEDIA_CHANGE = 1, + DISK_EVENT_EJECT_REQUEST = 2, +}; + +struct blk_integrity_iter { + void *prot_buf; + void *data_buf; + sector_t seed; + unsigned int data_size; + short unsigned int interval; + const char *disk_name; +}; + +struct bdev_inode { + struct block_device bdev; + struct inode vfs_inode; +}; + +enum { + DIO_SHOULD_DIRTY = 1, + DIO_IS_SYNC = 2, +}; + +struct blkdev_dio { + union { + struct kiocb *iocb; + struct task_struct *waiter; + }; + size_t size; + atomic_t ref; + unsigned int flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bio bio; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bio_alloc_cache { + struct bio_list free_list; + unsigned int nr; +}; + +enum rq_qos_id { + RQ_QOS_WBT = 0, + RQ_QOS_LATENCY = 1, + RQ_QOS_COST = 2, + RQ_QOS_IOPRIO = 3, +}; + +struct rq_qos_ops; + +struct rq_qos { + struct rq_qos_ops *ops; + struct request_queue *q; + enum rq_qos_id id; + struct rq_qos *next; + struct dentry *debugfs_dir; +}; + +struct rq_qos_ops { + void (*throttle)(struct rq_qos *, struct bio *); + void (*track)(struct rq_qos *, struct request *, struct bio *); + void (*merge)(struct rq_qos *, struct request *, struct bio *); + void (*issue)(struct rq_qos *, struct request *); + void (*requeue)(struct rq_qos *, struct request *); + void (*done)(struct rq_qos *, struct request *); + void (*done_bio)(struct rq_qos *, struct bio *); + void (*cleanup)(struct rq_qos *, struct bio *); + void (*queue_depth_changed)(struct rq_qos *); + void (*exit)(struct rq_qos *); + const struct blk_mq_debugfs_attr *debugfs_attrs; +}; + +struct biovec_slab { + int nr_vecs; + char *name; + struct kmem_cache *slab; +}; + +struct bio_slab { + struct kmem_cache *slab; + unsigned int slab_ref; + unsigned int slab_size; + char name[8]; +}; + +enum { + BLK_MQ_F_SHOULD_MERGE = 1, + BLK_MQ_F_TAG_QUEUE_SHARED = 2, + BLK_MQ_F_STACKING = 4, + BLK_MQ_F_TAG_HCTX_SHARED = 8, + BLK_MQ_F_BLOCKING = 32, + BLK_MQ_F_NO_SCHED = 64, + BLK_MQ_F_NO_SCHED_BY_DEFAULT = 128, + BLK_MQ_F_ALLOC_POLICY_START_BIT = 8, + BLK_MQ_F_ALLOC_POLICY_BITS = 1, + BLK_MQ_S_STOPPED = 0, + BLK_MQ_S_TAG_ACTIVE = 1, + BLK_MQ_S_SCHED_RESTART = 2, + BLK_MQ_S_INACTIVE = 3, + BLK_MQ_MAX_DEPTH = 10240, + BLK_MQ_CPU_WORK_BATCH = 8, +}; + +enum { + WBT_RWQ_BG = 0, + WBT_RWQ_KSWAPD = 1, + WBT_RWQ_DISCARD = 2, + WBT_NUM_RWQ = 3, +}; + +struct blk_plug_cb; + +typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool); + +struct blk_plug_cb { + struct list_head list; + blk_plug_cb_fn callback; + void *data; +}; + +enum { + BLK_MQ_REQ_NOWAIT = 1, + BLK_MQ_REQ_RESERVED = 2, + BLK_MQ_REQ_PM = 4, +}; + +struct req_iterator { + struct bvec_iter iter; + struct bio *bio; +}; + +typedef struct blkcg_policy_data *blkcg_pol_alloc_cpd_fn(gfp_t); + +typedef void blkcg_pol_init_cpd_fn(struct blkcg_policy_data *); + +typedef void blkcg_pol_free_cpd_fn(struct blkcg_policy_data *); + +typedef void blkcg_pol_bind_cpd_fn(struct blkcg_policy_data *); + +typedef struct blkg_policy_data *blkcg_pol_alloc_pd_fn(gfp_t, struct request_queue *, struct blkcg *); + +typedef void blkcg_pol_init_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_online_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_offline_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_free_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_reset_pd_stats_fn(struct blkg_policy_data *); + +typedef bool blkcg_pol_stat_pd_fn(struct blkg_policy_data *, struct seq_file *); + +struct blkcg_policy { + int plid; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + blkcg_pol_alloc_cpd_fn *cpd_alloc_fn; + blkcg_pol_init_cpd_fn *cpd_init_fn; + blkcg_pol_free_cpd_fn *cpd_free_fn; + blkcg_pol_bind_cpd_fn *cpd_bind_fn; + blkcg_pol_alloc_pd_fn *pd_alloc_fn; + blkcg_pol_init_pd_fn *pd_init_fn; + blkcg_pol_online_pd_fn *pd_online_fn; + blkcg_pol_offline_pd_fn *pd_offline_fn; + blkcg_pol_free_pd_fn *pd_free_fn; + blkcg_pol_reset_pd_stats_fn *pd_reset_stats_fn; + blkcg_pol_stat_pd_fn *pd_stat_fn; +}; + +struct trace_event_raw_block_buffer { + struct trace_entry ent; + dev_t dev; + sector_t sector; + size_t size; + char __data[0]; +}; + +struct trace_event_raw_block_rq_requeue { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_rq_complete { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + int error; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_rq { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + unsigned int bytes; + char rwbs[8]; + char comm[16]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_bio_complete { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + int error; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_bio { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_plug { + struct trace_entry ent; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_unplug { + struct trace_entry ent; + int nr_rq; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_split { + struct trace_entry ent; + dev_t dev; + sector_t sector; + sector_t new_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_bio_remap { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_rq_remap { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + unsigned int nr_bios; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_data_offsets_block_buffer {}; + +struct trace_event_data_offsets_block_rq_requeue { + u32 cmd; +}; + +struct trace_event_data_offsets_block_rq_complete { + u32 cmd; +}; + +struct trace_event_data_offsets_block_rq { + u32 cmd; +}; + +struct trace_event_data_offsets_block_bio_complete {}; + +struct trace_event_data_offsets_block_bio {}; + +struct trace_event_data_offsets_block_plug {}; + +struct trace_event_data_offsets_block_unplug {}; + +struct trace_event_data_offsets_block_split {}; + +struct trace_event_data_offsets_block_bio_remap {}; + +struct trace_event_data_offsets_block_rq_remap {}; + +typedef void (*btf_trace_block_touch_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_dirty_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_rq_requeue)(void *, struct request *); + +typedef void (*btf_trace_block_rq_complete)(void *, struct request *, blk_status_t, unsigned int); + +typedef void (*btf_trace_block_rq_insert)(void *, struct request *); + +typedef void (*btf_trace_block_rq_issue)(void *, struct request *); + +typedef void (*btf_trace_block_rq_merge)(void *, struct request *); + +typedef void (*btf_trace_block_bio_complete)(void *, struct request_queue *, struct bio *); + +typedef void (*btf_trace_block_bio_bounce)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_backmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_frontmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_queue)(void *, struct bio *); + +typedef void (*btf_trace_block_getrq)(void *, struct bio *); + +typedef void (*btf_trace_block_plug)(void *, struct request_queue *); + +typedef void (*btf_trace_block_unplug)(void *, struct request_queue *, unsigned int, bool); + +typedef void (*btf_trace_block_split)(void *, struct bio *, unsigned int); + +typedef void (*btf_trace_block_bio_remap)(void *, struct bio *, dev_t, sector_t); + +typedef void (*btf_trace_block_rq_remap)(void *, struct request *, dev_t, sector_t); + +enum { + BLK_MQ_NO_TAG = 4294967295, + BLK_MQ_TAG_MIN = 1, + BLK_MQ_TAG_MAX = 4294967294, +}; + +enum blkg_rwstat_type { + BLKG_RWSTAT_READ = 0, + BLKG_RWSTAT_WRITE = 1, + BLKG_RWSTAT_SYNC = 2, + BLKG_RWSTAT_ASYNC = 3, + BLKG_RWSTAT_DISCARD = 4, + BLKG_RWSTAT_NR = 5, + BLKG_RWSTAT_TOTAL = 5, +}; + +struct blkg_rwstat { + struct percpu_counter cpu_cnt[5]; + atomic64_t aux_cnt[5]; +}; + +struct throtl_grp; + +struct throtl_qnode { + struct list_head node; + struct bio_list bios; + struct throtl_grp *tg; +}; + +struct throtl_service_queue { + struct throtl_service_queue *parent_sq; + struct list_head queued[2]; + unsigned int nr_queued[2]; + struct rb_root_cached pending_tree; + unsigned int nr_pending; + long unsigned int first_pending_disptime; + struct timer_list pending_timer; +}; + +struct throtl_grp { + struct blkg_policy_data pd; + struct rb_node rb_node; + struct throtl_data *td; + struct throtl_service_queue service_queue; + struct throtl_qnode qnode_on_self[2]; + struct throtl_qnode qnode_on_parent[2]; + long unsigned int disptime; + unsigned int flags; + bool has_rules[2]; + uint64_t bps[4]; + uint64_t bps_conf[4]; + unsigned int iops[4]; + unsigned int iops_conf[4]; + uint64_t bytes_disp[2]; + unsigned int io_disp[2]; + long unsigned int last_low_overflow_time[2]; + uint64_t last_bytes_disp[2]; + unsigned int last_io_disp[2]; + long unsigned int last_check_time; + long unsigned int latency_target; + long unsigned int latency_target_conf; + long unsigned int slice_start[2]; + long unsigned int slice_end[2]; + long unsigned int last_finish_time; + long unsigned int checked_last_finish_time; + long unsigned int avg_idletime; + long unsigned int idletime_threshold; + long unsigned int idletime_threshold_conf; + unsigned int bio_cnt; + unsigned int bad_bio_cnt; + long unsigned int bio_cnt_reset_time; + atomic_t io_split_cnt[2]; + atomic_t last_io_split_cnt[2]; + struct blkg_rwstat stat_bytes; + struct blkg_rwstat stat_ios; +}; + +enum { + LIMIT_LOW = 0, + LIMIT_MAX = 1, + LIMIT_CNT = 2, +}; + +struct queue_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct request_queue *, char *); + ssize_t (*store)(struct request_queue *, const char *, size_t); +}; + +enum { + REQ_FSEQ_PREFLUSH = 1, + REQ_FSEQ_DATA = 2, + REQ_FSEQ_POSTFLUSH = 4, + REQ_FSEQ_DONE = 8, + REQ_FSEQ_ACTIONS = 7, + FLUSH_PENDING_TIMEOUT = 1250, +}; + +enum { + ICQ_EXITED = 4, + ICQ_DESTROYED = 8, +}; + +struct rq_map_data { + struct page **pages; + int page_order; + int nr_entries; + long unsigned int offset; + int null_mapped; + int from_user; +}; + +struct bio_map_data { + bool is_our_pages: 1; + bool is_null_mapped: 1; + struct iov_iter iter; + struct iovec iov[0]; +}; + +enum bio_merge_status { + BIO_MERGE_OK = 0, + BIO_MERGE_NONE = 1, + BIO_MERGE_FAILED = 2, +}; + +typedef bool (*sb_for_each_fn)(struct sbitmap *, unsigned int, void *); + +typedef bool busy_iter_fn(struct blk_mq_hw_ctx *, struct request *, void *, bool); + +typedef bool busy_tag_iter_fn(struct request *, void *, bool); + +enum { + BLK_MQ_UNIQUE_TAG_BITS = 16, + BLK_MQ_UNIQUE_TAG_MASK = 65535, +}; + +struct mq_inflight { + struct block_device *part; + unsigned int inflight[2]; +}; + +struct flush_busy_ctx_data { + struct blk_mq_hw_ctx *hctx; + struct list_head *list; +}; + +struct dispatch_rq_data { + struct blk_mq_hw_ctx *hctx; + struct request *rq; +}; + +enum prep_dispatch { + PREP_DISPATCH_OK = 0, + PREP_DISPATCH_NO_TAG = 1, + PREP_DISPATCH_NO_BUDGET = 2, +}; + +struct rq_iter_data { + struct blk_mq_hw_ctx *hctx; + bool has_rq; +}; + +struct blk_mq_qe_pair { + struct list_head node; + struct request_queue *q; + struct elevator_type *type; +}; + +struct sbq_wait { + struct sbitmap_queue *sbq; + struct wait_queue_entry wait; +}; + +struct bt_iter_data { + struct blk_mq_hw_ctx *hctx; + busy_iter_fn *fn; + void *data; + bool reserved; +}; + +struct bt_tags_iter_data { + struct blk_mq_tags *tags; + busy_tag_iter_fn *fn; + void *data; + unsigned int flags; +}; + +struct blk_queue_stats { + struct list_head callbacks; + spinlock_t lock; + bool enable_accounting; +}; + +struct blk_mq_hw_ctx_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_mq_hw_ctx *, char *); + ssize_t (*store)(struct blk_mq_hw_ctx *, const char *, size_t); +}; + +typedef u32 compat_caddr_t; + +struct hd_geometry { + unsigned char heads; + unsigned char sectors; + short unsigned int cylinders; + long unsigned int start; +}; + +struct blkpg_ioctl_arg { + int op; + int flags; + int datalen; + void *data; +}; + +struct blkpg_partition { + long long int start; + long long int length; + int pno; + char devname[64]; + char volname[64]; +}; + +struct pr_reservation { + __u64 key; + __u32 type; + __u32 flags; +}; + +struct pr_registration { + __u64 old_key; + __u64 new_key; + __u32 flags; + __u32 __pad; +}; + +struct pr_preempt { + __u64 old_key; + __u64 new_key; + __u32 type; + __u32 flags; +}; + +struct pr_clear { + __u64 key; + __u32 flags; + __u32 __pad; +}; + +struct compat_blkpg_ioctl_arg { + compat_int_t op; + compat_int_t flags; + compat_int_t datalen; + compat_caddr_t data; +}; + +struct compat_hd_geometry { + unsigned char heads; + unsigned char sectors; + short unsigned int cylinders; + u32 start; +}; + +struct klist_node; + +struct klist { + spinlock_t k_lock; + struct list_head k_list; + void (*get)(struct klist_node *); + void (*put)(struct klist_node *); +}; + +struct klist_node { + void *n_klist; + struct list_head n_node; + struct kref n_ref; +}; + +struct klist_iter { + struct klist *i_klist; + struct klist_node *i_cur; +}; + +struct class_dev_iter { + struct klist_iter ki; + const struct device_type *type; +}; + +struct badblocks { + struct device *dev; + int count; + int unacked_exist; + int shift; + u64 *page; + int changed; + seqlock_t lock; + sector_t sector; + sector_t size; +}; + +struct blk_major_name { + struct blk_major_name *next; + int major; + char name[16]; + void (*probe)(dev_t); +}; + +enum { + IOPRIO_WHO_PROCESS = 1, + IOPRIO_WHO_PGRP = 2, + IOPRIO_WHO_USER = 3, +}; + +struct parsed_partitions { + struct gendisk *disk; + char name[32]; + struct { + sector_t from; + sector_t size; + int flags; + bool has_info; + struct partition_meta_info info; + } *parts; + int next; + int limit; + bool access_beyond_eod; + char *pp_buf; +}; + +typedef struct { + struct page *v; +} Sector; + +struct RigidDiskBlock { + __u32 rdb_ID; + __be32 rdb_SummedLongs; + __s32 rdb_ChkSum; + __u32 rdb_HostID; + __be32 rdb_BlockBytes; + __u32 rdb_Flags; + __u32 rdb_BadBlockList; + __be32 rdb_PartitionList; + __u32 rdb_FileSysHeaderList; + __u32 rdb_DriveInit; + __u32 rdb_Reserved1[6]; + __u32 rdb_Cylinders; + __u32 rdb_Sectors; + __u32 rdb_Heads; + __u32 rdb_Interleave; + __u32 rdb_Park; + __u32 rdb_Reserved2[3]; + __u32 rdb_WritePreComp; + __u32 rdb_ReducedWrite; + __u32 rdb_StepRate; + __u32 rdb_Reserved3[5]; + __u32 rdb_RDBBlocksLo; + __u32 rdb_RDBBlocksHi; + __u32 rdb_LoCylinder; + __u32 rdb_HiCylinder; + __u32 rdb_CylBlocks; + __u32 rdb_AutoParkSeconds; + __u32 rdb_HighRDSKBlock; + __u32 rdb_Reserved4; + char rdb_DiskVendor[8]; + char rdb_DiskProduct[16]; + char rdb_DiskRevision[4]; + char rdb_ControllerVendor[8]; + char rdb_ControllerProduct[16]; + char rdb_ControllerRevision[4]; + __u32 rdb_Reserved5[10]; +}; + +struct PartitionBlock { + __be32 pb_ID; + __be32 pb_SummedLongs; + __s32 pb_ChkSum; + __u32 pb_HostID; + __be32 pb_Next; + __u32 pb_Flags; + __u32 pb_Reserved1[2]; + __u32 pb_DevFlags; + __u8 pb_DriveName[32]; + __u32 pb_Reserved2[15]; + __be32 pb_Environment[17]; + __u32 pb_EReserved[15]; +}; + +struct partition_info { + u8 flg; + char id[3]; + __be32 st; + __be32 siz; +}; + +struct rootsector { + char unused[342]; + struct partition_info icdpart[8]; + char unused2[12]; + u32 hd_siz; + struct partition_info part[4]; + u32 bsl_st; + u32 bsl_cnt; + u16 checksum; +} __attribute__((packed)); + +struct lvm_rec { + char lvm_id[4]; + char reserved4[16]; + __be32 lvmarea_len; + __be32 vgda_len; + __be32 vgda_psn[2]; + char reserved36[10]; + __be16 pp_size; + char reserved46[12]; + __be16 version; +}; + +struct vgda { + __be32 secs; + __be32 usec; + char reserved8[16]; + __be16 numlvs; + __be16 maxlvs; + __be16 pp_size; + __be16 numpvs; + __be16 total_vgdas; + __be16 vgda_size; +}; + +struct lvd { + __be16 lv_ix; + __be16 res2; + __be16 res4; + __be16 maxsize; + __be16 lv_state; + __be16 mirror; + __be16 mirror_policy; + __be16 num_lps; + __be16 res10[8]; +}; + +struct lvname { + char name[64]; +}; + +struct ppe { + __be16 lv_ix; + short unsigned int res2; + short unsigned int res4; + __be16 lp_ix; + short unsigned int res8[12]; +}; + +struct pvd { + char reserved0[16]; + __be16 pp_count; + char reserved18[2]; + __be32 psn_part1; + char reserved24[8]; + struct ppe ppe[1016]; +}; + +struct lv_info { + short unsigned int pps_per_lv; + short unsigned int pps_found; + unsigned char lv_is_contiguous; +}; + +struct cmdline_subpart { + char name[32]; + sector_t from; + sector_t size; + int flags; + struct cmdline_subpart *next_subpart; +}; + +struct cmdline_parts { + char name[32]; + unsigned int nr_subparts; + struct cmdline_subpart *subpart; + struct cmdline_parts *next_parts; +}; + +struct mac_partition { + __be16 signature; + __be16 res1; + __be32 map_count; + __be32 start_block; + __be32 block_count; + char name[32]; + char type[32]; + __be32 data_start; + __be32 data_count; + __be32 status; + __be32 boot_start; + __be32 boot_size; + __be32 boot_load; + __be32 boot_load2; + __be32 boot_entry; + __be32 boot_entry2; + __be32 boot_cksum; + char processor[16]; +}; + +struct mac_driver_desc { + __be16 signature; + __be16 block_size; + __be32 block_count; +}; + +struct msdos_partition { + u8 boot_ind; + u8 head; + u8 sector; + u8 cyl; + u8 sys_ind; + u8 end_head; + u8 end_sector; + u8 end_cyl; + __le32 start_sect; + __le32 nr_sects; +}; + +struct frag { + struct list_head list; + u32 group; + u8 num; + u8 rec; + u8 map; + u8 data[0]; +}; + +struct privhead { + u16 ver_major; + u16 ver_minor; + u64 logical_disk_start; + u64 logical_disk_size; + u64 config_start; + u64 config_size; + uuid_t disk_id; +}; + +struct tocblock { + u8 bitmap1_name[16]; + u64 bitmap1_start; + u64 bitmap1_size; + u8 bitmap2_name[16]; + u64 bitmap2_start; + u64 bitmap2_size; +}; + +struct vmdb { + u16 ver_major; + u16 ver_minor; + u32 vblk_size; + u32 vblk_offset; + u32 last_vblk_seq; +}; + +struct vblk_comp { + u8 state[16]; + u64 parent_id; + u8 type; + u8 children; + u16 chunksize; +}; + +struct vblk_dgrp { + u8 disk_id[64]; +}; + +struct vblk_disk { + uuid_t disk_id; + u8 alt_name[128]; +}; + +struct vblk_part { + u64 start; + u64 size; + u64 volume_offset; + u64 parent_id; + u64 disk_id; + u8 partnum; +}; + +struct vblk_volu { + u8 volume_type[16]; + u8 volume_state[16]; + u8 guid[16]; + u8 drive_hint[4]; + u64 size; + u8 partition_type; +}; + +struct vblk { + u8 name[64]; + u64 obj_id; + u32 sequence; + u8 flags; + u8 type; + union { + struct vblk_comp comp; + struct vblk_dgrp dgrp; + struct vblk_disk disk; + struct vblk_part part; + struct vblk_volu volu; + } vblk; + struct list_head list; +}; + +struct ldmdb { + struct privhead ph; + struct tocblock toc; + struct vmdb vm; + struct list_head v_dgrp; + struct list_head v_disk; + struct list_head v_volu; + struct list_head v_comp; + struct list_head v_part; +}; + +enum msdos_sys_ind { + DOS_EXTENDED_PARTITION = 5, + LINUX_EXTENDED_PARTITION = 133, + WIN98_EXTENDED_PARTITION = 15, + LINUX_DATA_PARTITION = 131, + LINUX_LVM_PARTITION = 142, + LINUX_RAID_PARTITION = 253, + SOLARIS_X86_PARTITION = 130, + NEW_SOLARIS_X86_PARTITION = 191, + DM6_AUX1PARTITION = 81, + DM6_AUX3PARTITION = 83, + DM6_PARTITION = 84, + EZD_PARTITION = 85, + FREEBSD_PARTITION = 165, + OPENBSD_PARTITION = 166, + NETBSD_PARTITION = 169, + BSDI_PARTITION = 183, + MINIX_PARTITION = 129, + UNIXWARE_PARTITION = 99, +}; + +struct solaris_x86_slice { + __le16 s_tag; + __le16 s_flag; + __le32 s_start; + __le32 s_size; +}; + +struct solaris_x86_vtoc { + unsigned int v_bootinfo[3]; + __le32 v_sanity; + __le32 v_version; + char v_volume[8]; + __le16 v_sectorsz; + __le16 v_nparts; + unsigned int v_reserved[10]; + struct solaris_x86_slice v_slice[16]; + unsigned int timestamp[16]; + char v_asciilabel[128]; +}; + +struct bsd_partition { + __le32 p_size; + __le32 p_offset; + __le32 p_fsize; + __u8 p_fstype; + __u8 p_frag; + __le16 p_cpg; +}; + +struct bsd_disklabel { + __le32 d_magic; + __s16 d_type; + __s16 d_subtype; + char d_typename[16]; + char d_packname[16]; + __u32 d_secsize; + __u32 d_nsectors; + __u32 d_ntracks; + __u32 d_ncylinders; + __u32 d_secpercyl; + __u32 d_secperunit; + __u16 d_sparespertrack; + __u16 d_sparespercyl; + __u32 d_acylinders; + __u16 d_rpm; + __u16 d_interleave; + __u16 d_trackskew; + __u16 d_cylskew; + __u32 d_headswitch; + __u32 d_trkseek; + __u32 d_flags; + __u32 d_drivedata[5]; + __u32 d_spare[5]; + __le32 d_magic2; + __le16 d_checksum; + __le16 d_npartitions; + __le32 d_bbsize; + __le32 d_sbsize; + struct bsd_partition d_partitions[16]; +}; + +struct unixware_slice { + __le16 s_label; + __le16 s_flags; + __le32 start_sect; + __le32 nr_sects; +}; + +struct unixware_vtoc { + __le32 v_magic; + __le32 v_version; + char v_name[8]; + __le16 v_nslices; + __le16 v_unknown1; + __le32 v_reserved[10]; + struct unixware_slice v_slice[16]; +}; + +struct unixware_disklabel { + __le32 d_type; + __le32 d_magic; + __le32 d_version; + char d_serial[12]; + __le32 d_ncylinders; + __le32 d_ntracks; + __le32 d_nsectors; + __le32 d_secsize; + __le32 d_part_start; + __le32 d_unknown1[12]; + __le32 d_alt_tbl; + __le32 d_alt_len; + __le32 d_phys_cyl; + __le32 d_phys_trk; + __le32 d_phys_sec; + __le32 d_phys_bytes; + __le32 d_unknown2; + __le32 d_unknown3; + __le32 d_pad[8]; + struct unixware_vtoc vtoc; +}; + +struct d_partition { + __le32 p_size; + __le32 p_offset; + __le32 p_fsize; + u8 p_fstype; + u8 p_frag; + __le16 p_cpg; +}; + +struct disklabel { + __le32 d_magic; + __le16 d_type; + __le16 d_subtype; + u8 d_typename[16]; + u8 d_packname[16]; + __le32 d_secsize; + __le32 d_nsectors; + __le32 d_ntracks; + __le32 d_ncylinders; + __le32 d_secpercyl; + __le32 d_secprtunit; + __le16 d_sparespertrack; + __le16 d_sparespercyl; + __le32 d_acylinders; + __le16 d_rpm; + __le16 d_interleave; + __le16 d_trackskew; + __le16 d_cylskew; + __le32 d_headswitch; + __le32 d_trkseek; + __le32 d_flags; + __le32 d_drivedata[5]; + __le32 d_spare[5]; + __le32 d_magic2; + __le16 d_checksum; + __le16 d_npartitions; + __le32 d_bbsize; + __le32 d_sbsize; + struct d_partition d_partitions[18]; +}; + +enum { + LINUX_RAID_PARTITION___2 = 253, +}; + +struct sgi_volume { + s8 name[8]; + __be32 block_num; + __be32 num_bytes; +}; + +struct sgi_partition { + __be32 num_blocks; + __be32 first_block; + __be32 type; +}; + +struct sgi_disklabel { + __be32 magic_mushroom; + __be16 root_part_num; + __be16 swap_part_num; + s8 boot_file[16]; + u8 _unused0[48]; + struct sgi_volume volume[15]; + struct sgi_partition partitions[16]; + __be32 csum; + __be32 _unused1; +}; + +enum { + SUN_WHOLE_DISK = 5, + LINUX_RAID_PARTITION___3 = 253, +}; + +struct sun_info { + __be16 id; + __be16 flags; +}; + +struct sun_vtoc { + __be32 version; + char volume[8]; + __be16 nparts; + struct sun_info infos[8]; + __be16 padding; + __be32 bootinfo[3]; + __be32 sanity; + __be32 reserved[10]; + __be32 timestamp[8]; +}; + +struct sun_partition { + __be32 start_cylinder; + __be32 num_sectors; +}; + +struct sun_disklabel { + unsigned char info[128]; + struct sun_vtoc vtoc; + __be32 write_reinstruct; + __be32 read_reinstruct; + unsigned char spare[148]; + __be16 rspeed; + __be16 pcylcount; + __be16 sparecyl; + __be16 obs1; + __be16 obs2; + __be16 ilfact; + __be16 ncyl; + __be16 nacyl; + __be16 ntrks; + __be16 nsect; + __be16 obs3; + __be16 obs4; + struct sun_partition partitions[8]; + __be16 magic; + __be16 csum; +}; + +struct pt_info { + s32 pi_nblocks; + u32 pi_blkoff; +}; + +struct ultrix_disklabel { + s32 pt_magic; + s32 pt_valid; + struct pt_info pt_part[8]; +}; + +struct _gpt_header { + __le64 signature; + __le32 revision; + __le32 header_size; + __le32 header_crc32; + __le32 reserved1; + __le64 my_lba; + __le64 alternate_lba; + __le64 first_usable_lba; + __le64 last_usable_lba; + efi_guid_t disk_guid; + __le64 partition_entry_lba; + __le32 num_partition_entries; + __le32 sizeof_partition_entry; + __le32 partition_entry_array_crc32; +} __attribute__((packed)); + +typedef struct _gpt_header gpt_header; + +struct _gpt_entry_attributes { + u64 required_to_function: 1; + u64 reserved: 47; + u64 type_guid_specific: 16; +}; + +typedef struct _gpt_entry_attributes gpt_entry_attributes; + +struct _gpt_entry { + efi_guid_t partition_type_guid; + efi_guid_t unique_partition_guid; + __le64 starting_lba; + __le64 ending_lba; + gpt_entry_attributes attributes; + __le16 partition_name[36]; +}; + +typedef struct _gpt_entry gpt_entry; + +struct _gpt_mbr_record { + u8 boot_indicator; + u8 start_head; + u8 start_sector; + u8 start_track; + u8 os_type; + u8 end_head; + u8 end_sector; + u8 end_track; + __le32 starting_lba; + __le32 size_in_lba; +}; + +typedef struct _gpt_mbr_record gpt_mbr_record; + +struct _legacy_mbr { + u8 boot_code[440]; + __le32 unique_mbr_signature; + __le16 unknown; + gpt_mbr_record partition_record[4]; + __le16 signature; +} __attribute__((packed)); + +typedef struct _legacy_mbr legacy_mbr; + +struct d_partition___2 { + __le32 p_res; + u8 p_fstype; + u8 p_res2[3]; + __le32 p_offset; + __le32 p_size; +}; + +struct disklabel___2 { + u8 d_reserved[270]; + struct d_partition___2 d_partitions[2]; + u8 d_blank[208]; + __le16 d_magic; +} __attribute__((packed)); + +struct volumeid { + u8 vid_unused[248]; + u8 vid_mac[8]; +}; + +struct dkconfig { + u8 ios_unused0[128]; + __be32 ios_slcblk; + __be16 ios_slccnt; + u8 ios_unused1[122]; +}; + +struct dkblk0 { + struct volumeid dk_vid; + struct dkconfig dk_ios; +}; + +struct slice { + __be32 nblocks; + __be32 blkoff; +}; + +struct rq_wait { + wait_queue_head_t wait; + atomic_t inflight; +}; + +struct rq_depth { + unsigned int max_depth; + int scale_step; + bool scaled_max; + unsigned int queue_depth; + unsigned int default_depth; +}; + +typedef bool acquire_inflight_cb_t(struct rq_wait *, void *); + +typedef void cleanup_cb_t(struct rq_wait *, void *); + +struct rq_qos_wait_data { + struct wait_queue_entry wq; + struct task_struct *task; + struct rq_wait *rqw; + acquire_inflight_cb_t *cb; + void *private_data; + bool got_token; +}; + +enum { + DISK_EVENT_FLAG_POLL = 1, + DISK_EVENT_FLAG_UEVENT = 2, +}; + +struct disk_events { + struct list_head node; + struct gendisk *disk; + spinlock_t lock; + struct mutex block_mutex; + int block; + unsigned int pending; + unsigned int clearing; + long int poll_msecs; + struct delayed_work dwork; +}; + +struct blk_ia_range_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_independent_access_range *, char *); +}; + +struct sg_io_v4 { + __s32 guard; + __u32 protocol; + __u32 subprotocol; + __u32 request_len; + __u64 request; + __u64 request_tag; + __u32 request_attr; + __u32 request_priority; + __u32 request_extra; + __u32 max_response_len; + __u64 response; + __u32 dout_iovec_count; + __u32 dout_xfer_len; + __u32 din_iovec_count; + __u32 din_xfer_len; + __u64 dout_xferp; + __u64 din_xferp; + __u32 timeout; + __u32 flags; + __u64 usr_ptr; + __u32 spare_in; + __u32 driver_status; + __u32 transport_status; + __u32 device_status; + __u32 retry_delay; + __u32 info; + __u32 duration; + __u32 response_len; + __s32 din_resid; + __s32 dout_resid; + __u64 generated_tag; + __u32 spare_out; + __u32 padding; +}; + +typedef int bsg_sg_io_fn(struct request_queue *, struct sg_io_v4 *, fmode_t, unsigned int); + +struct bsg_device { + struct request_queue *queue; + struct device device; + struct cdev cdev; + int max_queue; + unsigned int timeout; + unsigned int reserved_size; + bsg_sg_io_fn *sg_io_fn; +}; + +struct bsg_job; + +typedef int bsg_job_fn(struct bsg_job *); + +struct bsg_buffer { + unsigned int payload_len; + int sg_cnt; + struct scatterlist *sg_list; +}; + +struct bsg_job { + struct device *dev; + struct kref kref; + unsigned int timeout; + void *request; + void *reply; + unsigned int request_len; + unsigned int reply_len; + struct bsg_buffer request_payload; + struct bsg_buffer reply_payload; + int result; + unsigned int reply_payload_rcv_len; + struct request *bidi_rq; + struct bio *bidi_bio; + void *dd_data; +}; + +typedef enum blk_eh_timer_return bsg_timeout_fn(struct request *); + +enum scsi_device_event { + SDEV_EVT_MEDIA_CHANGE = 1, + SDEV_EVT_INQUIRY_CHANGE_REPORTED = 2, + SDEV_EVT_CAPACITY_CHANGE_REPORTED = 3, + SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED = 4, + SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED = 5, + SDEV_EVT_LUN_CHANGE_REPORTED = 6, + SDEV_EVT_ALUA_STATE_CHANGE_REPORTED = 7, + SDEV_EVT_POWER_ON_RESET_OCCURRED = 8, + SDEV_EVT_FIRST = 1, + SDEV_EVT_LAST = 8, + SDEV_EVT_MAXBITS = 9, +}; + +struct bsg_device___2; + +struct bsg_set { + struct blk_mq_tag_set tag_set; + struct bsg_device___2 *bd; + bsg_job_fn *job_fn; + bsg_timeout_fn *timeout_fn; +}; + +struct blkg_conf_ctx { + struct block_device *bdev; + struct blkcg_gq *blkg; + char *body; +}; + +struct blkg_rwstat_sample { + u64 cnt[5]; +}; + +struct latency_bucket { + long unsigned int total_latency; + int samples; +}; + +struct avg_latency_bucket { + long unsigned int latency; + bool valid; +}; + +struct throtl_data { + struct throtl_service_queue service_queue; + struct request_queue *queue; + unsigned int nr_queued[2]; + unsigned int throtl_slice; + struct work_struct dispatch_work; + unsigned int limit_index; + bool limit_valid[2]; + long unsigned int low_upgrade_time; + long unsigned int low_downgrade_time; + unsigned int scale; + struct latency_bucket tmp_buckets[18]; + struct avg_latency_bucket avg_buckets[18]; + struct latency_bucket *latency_buckets[2]; + long unsigned int last_calculate_time; + long unsigned int filtered_latency; + bool track_bio_latency; +}; + +enum tg_state_flags { + THROTL_TG_PENDING = 1, + THROTL_TG_WAS_EMPTY = 2, +}; + +enum prio_policy { + POLICY_NO_CHANGE = 0, + POLICY_NONE_TO_RT = 1, + POLICY_RESTRICT_TO_BE = 2, + POLICY_ALL_TO_IDLE = 3, +}; + +struct ioprio_blkg { + struct blkg_policy_data pd; +}; + +struct ioprio_blkcg { + struct blkcg_policy_data cpd; + enum prio_policy prio_policy; +}; + +struct blk_ioprio { + struct rq_qos rqos; +}; + +enum { + MILLION = 1000000, + MIN_PERIOD = 1000, + MAX_PERIOD = 1000000, + MARGIN_MIN_PCT = 10, + MARGIN_LOW_PCT = 20, + MARGIN_TARGET_PCT = 50, + INUSE_ADJ_STEP_PCT = 25, + TIMER_SLACK_PCT = 1, + WEIGHT_ONE = 65536, + VTIME_PER_SEC_SHIFT = 37, + VTIME_PER_SEC = 0, + VTIME_PER_USEC = 137438, + VTIME_PER_NSEC = 137, + VRATE_MIN_PPM = 10000, + VRATE_MAX_PPM = 100000000, + VRATE_MIN = 1374, + VRATE_CLAMP_ADJ_PCT = 4, + RQ_WAIT_BUSY_PCT = 5, + UNBUSY_THR_PCT = 75, + MIN_DELAY_THR_PCT = 500, + MAX_DELAY_THR_PCT = 25000, + MIN_DELAY = 250, + MAX_DELAY = 250000, + DFGV_USAGE_PCT = 50, + DFGV_PERIOD = 100000, + MAX_LAGGING_PERIODS = 10, + AUTOP_CYCLE_NSEC = 1410065408, + IOC_PAGE_SHIFT = 12, + IOC_PAGE_SIZE = 4096, + IOC_SECT_TO_PAGE_SHIFT = 3, + LCOEF_RANDIO_PAGES = 4096, +}; + +enum ioc_running { + IOC_IDLE = 0, + IOC_RUNNING = 1, + IOC_STOP = 2, +}; + +enum { + QOS_ENABLE = 0, + QOS_CTRL = 1, + NR_QOS_CTRL_PARAMS = 2, +}; + +enum { + QOS_RPPM = 0, + QOS_RLAT = 1, + QOS_WPPM = 2, + QOS_WLAT = 3, + QOS_MIN = 4, + QOS_MAX = 5, + NR_QOS_PARAMS = 6, +}; + +enum { + COST_CTRL = 0, + COST_MODEL = 1, + NR_COST_CTRL_PARAMS = 2, +}; + +enum { + I_LCOEF_RBPS = 0, + I_LCOEF_RSEQIOPS = 1, + I_LCOEF_RRANDIOPS = 2, + I_LCOEF_WBPS = 3, + I_LCOEF_WSEQIOPS = 4, + I_LCOEF_WRANDIOPS = 5, + NR_I_LCOEFS = 6, +}; + +enum { + LCOEF_RPAGE = 0, + LCOEF_RSEQIO = 1, + LCOEF_RRANDIO = 2, + LCOEF_WPAGE = 3, + LCOEF_WSEQIO = 4, + LCOEF_WRANDIO = 5, + NR_LCOEFS = 6, +}; + +enum { + AUTOP_INVALID = 0, + AUTOP_HDD = 1, + AUTOP_SSD_QD1 = 2, + AUTOP_SSD_DFL = 3, + AUTOP_SSD_FAST = 4, +}; + +struct ioc_params { + u32 qos[6]; + u64 i_lcoefs[6]; + u64 lcoefs[6]; + u32 too_fast_vrate_pct; + u32 too_slow_vrate_pct; +}; + +struct ioc_margins { + s64 min; + s64 low; + s64 target; +}; + +struct ioc_missed { + local_t nr_met; + local_t nr_missed; + u32 last_met; + u32 last_missed; +}; + +struct ioc_pcpu_stat { + struct ioc_missed missed[2]; + local64_t rq_wait_ns; + u64 last_rq_wait_ns; +}; + +struct ioc { + struct rq_qos rqos; + bool enabled; + struct ioc_params params; + struct ioc_margins margins; + u32 period_us; + u32 timer_slack_ns; + u64 vrate_min; + u64 vrate_max; + spinlock_t lock; + struct timer_list timer; + struct list_head active_iocgs; + struct ioc_pcpu_stat *pcpu_stat; + enum ioc_running running; + atomic64_t vtime_rate; + u64 vtime_base_rate; + s64 vtime_err; + seqcount_spinlock_t period_seqcount; + u64 period_at; + u64 period_at_vtime; + atomic64_t cur_period; + int busy_level; + bool weights_updated; + atomic_t hweight_gen; + u64 dfgv_period_at; + u64 dfgv_period_rem; + u64 dfgv_usage_us_sum; + u64 autop_too_fast_at; + u64 autop_too_slow_at; + int autop_idx; + bool user_qos_params: 1; + bool user_cost_model: 1; +}; + +struct iocg_pcpu_stat { + local64_t abs_vusage; +}; + +struct iocg_stat { + u64 usage_us; + u64 wait_us; + u64 indebt_us; + u64 indelay_us; +}; + +struct ioc_gq { + struct blkg_policy_data pd; + struct ioc *ioc; + u32 cfg_weight; + u32 weight; + u32 active; + u32 inuse; + u32 last_inuse; + s64 saved_margin; + sector_t cursor; + atomic64_t vtime; + atomic64_t done_vtime; + u64 abs_vdebt; + u64 delay; + u64 delay_at; + atomic64_t active_period; + struct list_head active_list; + u64 child_active_sum; + u64 child_inuse_sum; + u64 child_adjusted_sum; + int hweight_gen; + u32 hweight_active; + u32 hweight_inuse; + u32 hweight_donating; + u32 hweight_after_donation; + struct list_head walk_list; + struct list_head surplus_list; + struct wait_queue_head waitq; + struct hrtimer waitq_timer; + u64 activated_at; + struct iocg_pcpu_stat *pcpu_stat; + struct iocg_stat local_stat; + struct iocg_stat desc_stat; + struct iocg_stat last_stat; + u64 last_stat_abs_vusage; + u64 usage_delta_us; + u64 wait_since; + u64 indebt_since; + u64 indelay_since; + int level; + struct ioc_gq *ancestors[0]; +}; + +struct ioc_cgrp { + struct blkcg_policy_data cpd; + unsigned int dfl_weight; +}; + +struct ioc_now { + u64 now_ns; + u64 now; + u64 vnow; + u64 vrate; +}; + +struct iocg_wait { + struct wait_queue_entry wait; + struct bio *bio; + u64 abs_cost; + bool committed; +}; + +struct iocg_wake_ctx { + struct ioc_gq *iocg; + u32 hw_inuse; + s64 vbudget; +}; + +struct trace_event_raw_iocost_iocg_state { + struct trace_entry ent; + u32 __data_loc_devname; + u32 __data_loc_cgroup; + u64 now; + u64 vnow; + u64 vrate; + u64 last_period; + u64 cur_period; + u64 vtime; + u32 weight; + u32 inuse; + u64 hweight_active; + u64 hweight_inuse; + char __data[0]; +}; + +struct trace_event_raw_iocg_inuse_update { + struct trace_entry ent; + u32 __data_loc_devname; + u32 __data_loc_cgroup; + u64 now; + u32 old_inuse; + u32 new_inuse; + u64 old_hweight_inuse; + u64 new_hweight_inuse; + char __data[0]; +}; + +struct trace_event_raw_iocost_ioc_vrate_adj { + struct trace_entry ent; + u32 __data_loc_devname; + u64 old_vrate; + u64 new_vrate; + int busy_level; + u32 read_missed_ppm; + u32 write_missed_ppm; + u32 rq_wait_pct; + int nr_lagging; + int nr_shortages; + char __data[0]; +}; + +struct trace_event_raw_iocost_iocg_forgive_debt { + struct trace_entry ent; + u32 __data_loc_devname; + u32 __data_loc_cgroup; + u64 now; + u64 vnow; + u32 usage_pct; + u64 old_debt; + u64 new_debt; + u64 old_delay; + u64 new_delay; + char __data[0]; +}; + +struct trace_event_data_offsets_iocost_iocg_state { + u32 devname; + u32 cgroup; +}; + +struct trace_event_data_offsets_iocg_inuse_update { + u32 devname; + u32 cgroup; +}; + +struct trace_event_data_offsets_iocost_ioc_vrate_adj { + u32 devname; +}; + +struct trace_event_data_offsets_iocost_iocg_forgive_debt { + u32 devname; + u32 cgroup; +}; + +typedef void (*btf_trace_iocost_iocg_activate)(void *, struct ioc_gq *, const char *, struct ioc_now *, u64, u64, u64); + +typedef void (*btf_trace_iocost_iocg_idle)(void *, struct ioc_gq *, const char *, struct ioc_now *, u64, u64, u64); + +typedef void (*btf_trace_iocost_inuse_shortage)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64); + +typedef void (*btf_trace_iocost_inuse_transfer)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64); + +typedef void (*btf_trace_iocost_inuse_adjust)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64); + +typedef void (*btf_trace_iocost_ioc_vrate_adj)(void *, struct ioc *, u64, u32 *, u32, int, int); + +typedef void (*btf_trace_iocost_iocg_forgive_debt)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u64, u64, u64, u64); + +enum dd_data_dir { + DD_READ = 0, + DD_WRITE = 1, +}; + +enum { + DD_DIR_COUNT = 2, +}; + +enum dd_prio { + DD_RT_PRIO = 0, + DD_BE_PRIO = 1, + DD_IDLE_PRIO = 2, + DD_PRIO_MAX = 2, +}; + +enum { + DD_PRIO_COUNT = 3, +}; + +struct io_stats_per_prio { + uint32_t inserted; + uint32_t merged; + uint32_t dispatched; + atomic_t completed; +}; + +struct dd_per_prio { + struct list_head dispatch; + struct rb_root sort_list[2]; + struct list_head fifo_list[2]; + struct request *next_rq[2]; + struct io_stats_per_prio stats; +}; + +struct deadline_data { + struct dd_per_prio per_prio[3]; + enum dd_data_dir last_dir; + unsigned int batching; + unsigned int starved; + int fifo_expire[2]; + int fifo_batch; + int writes_starved; + int front_merges; + u32 async_depth; + int prio_aging_expire; + spinlock_t lock; + spinlock_t zone_lock; +}; + +enum bip_flags { + BIP_BLOCK_INTEGRITY = 1, + BIP_MAPPED_INTEGRITY = 2, + BIP_CTRL_NOCHECK = 4, + BIP_DISK_NOCHECK = 8, + BIP_IP_CHECKSUM = 16, +}; + +enum blk_integrity_flags { + BLK_INTEGRITY_VERIFY = 1, + BLK_INTEGRITY_GENERATE = 2, + BLK_INTEGRITY_DEVICE_CAPABLE = 4, + BLK_INTEGRITY_IP_CHECKSUM = 8, +}; + +struct integrity_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_integrity *, char *); + ssize_t (*store)(struct blk_integrity *, const char *, size_t); +}; + +enum t10_dif_type { + T10_PI_TYPE0_PROTECTION = 0, + T10_PI_TYPE1_PROTECTION = 1, + T10_PI_TYPE2_PROTECTION = 2, + T10_PI_TYPE3_PROTECTION = 3, +}; + +struct t10_pi_tuple { + __be16 guard_tag; + __be16 app_tag; + __be32 ref_tag; +}; + +typedef __be16 csum_fn(void *, unsigned int); + +struct virtio_device_id { + __u32 device; + __u32 vendor; +}; + +struct virtio_device; + +struct virtqueue { + struct list_head list; + void (*callback)(struct virtqueue *); + const char *name; + struct virtio_device *vdev; + unsigned int index; + unsigned int num_free; + void *priv; +}; + +struct vringh_config_ops; + +struct virtio_config_ops; + +struct virtio_device { + int index; + bool failed; + bool config_enabled; + bool config_change_pending; + spinlock_t config_lock; + spinlock_t vqs_list_lock; + struct device dev; + struct virtio_device_id id; + const struct virtio_config_ops *config; + const struct vringh_config_ops *vringh_config; + struct list_head vqs; + u64 features; + void *priv; +}; + +typedef void vq_callback_t(struct virtqueue *); + +struct virtio_shm_region; + +struct virtio_config_ops { + void (*enable_cbs)(struct virtio_device *); + void (*get)(struct virtio_device *, unsigned int, void *, unsigned int); + void (*set)(struct virtio_device *, unsigned int, const void *, unsigned int); + u32 (*generation)(struct virtio_device *); + u8 (*get_status)(struct virtio_device *); + void (*set_status)(struct virtio_device *, u8); + void (*reset)(struct virtio_device *); + int (*find_vqs)(struct virtio_device *, unsigned int, struct virtqueue **, vq_callback_t **, const char * const *, const bool *, struct irq_affinity *); + void (*del_vqs)(struct virtio_device *); + u64 (*get_features)(struct virtio_device *); + int (*finalize_features)(struct virtio_device *); + const char * (*bus_name)(struct virtio_device *); + int (*set_vq_affinity)(struct virtqueue *, const struct cpumask *); + const struct cpumask * (*get_vq_affinity)(struct virtio_device *, int); + bool (*get_shm_region)(struct virtio_device *, struct virtio_shm_region *, u8); +}; + +struct virtio_shm_region { + u64 addr; + u64 len; +}; + +struct irq_poll; + +typedef int irq_poll_fn(struct irq_poll *, int); + +struct irq_poll { + struct list_head list; + long unsigned int state; + int weight; + irq_poll_fn *poll; +}; + +struct dim_sample { + ktime_t time; + u32 pkt_ctr; + u32 byte_ctr; + u16 event_ctr; + u32 comp_ctr; +}; + +struct dim_stats { + int ppms; + int bpms; + int epms; + int cpms; + int cpe_ratio; +}; + +struct dim { + u8 state; + struct dim_stats prev_stats; + struct dim_sample start_sample; + struct dim_sample measuring_sample; + struct work_struct work; + void *priv; + u8 profile_ix; + u8 mode; + u8 tune_state; + u8 steps_right; + u8 steps_left; + u8 tired; +}; + +enum rdma_nl_counter_mode { + RDMA_COUNTER_MODE_NONE = 0, + RDMA_COUNTER_MODE_AUTO = 1, + RDMA_COUNTER_MODE_MANUAL = 2, + RDMA_COUNTER_MODE_MAX = 3, +}; + +enum rdma_nl_counter_mask { + RDMA_COUNTER_MASK_QP_TYPE = 1, + RDMA_COUNTER_MASK_PID = 2, +}; + +enum rdma_restrack_type { + RDMA_RESTRACK_PD = 0, + RDMA_RESTRACK_CQ = 1, + RDMA_RESTRACK_QP = 2, + RDMA_RESTRACK_CM_ID = 3, + RDMA_RESTRACK_MR = 4, + RDMA_RESTRACK_CTX = 5, + RDMA_RESTRACK_COUNTER = 6, + RDMA_RESTRACK_SRQ = 7, + RDMA_RESTRACK_MAX = 8, +}; + +struct rdma_restrack_entry { + bool valid; + u8 no_track: 1; + struct kref kref; + struct completion comp; + struct task_struct *task; + const char *kern_name; + enum rdma_restrack_type type; + bool user; + u32 id; +}; + +struct rdma_link_ops { + struct list_head list; + const char *type; + int (*newlink)(const char *, struct net_device *); +}; + +struct auto_mode_param { + int qp_type; +}; + +struct rdma_counter_mode { + enum rdma_nl_counter_mode mode; + enum rdma_nl_counter_mask mask; + struct auto_mode_param param; +}; + +struct rdma_hw_stats; + +struct rdma_port_counter { + struct rdma_counter_mode mode; + struct rdma_hw_stats *hstats; + unsigned int num_counters; + struct mutex lock; +}; + +struct rdma_stat_desc; + +struct rdma_hw_stats { + struct mutex lock; + long unsigned int timestamp; + long unsigned int lifespan; + const struct rdma_stat_desc *descs; + long unsigned int *is_disabled; + int num_counters; + u64 value[0]; +}; + +struct ib_device; + +struct rdma_counter { + struct rdma_restrack_entry res; + struct ib_device *device; + uint32_t id; + struct kref kref; + struct rdma_counter_mode mode; + struct mutex lock; + struct rdma_hw_stats *stats; + u32 port; +}; + +enum rdma_driver_id { + RDMA_DRIVER_UNKNOWN = 0, + RDMA_DRIVER_MLX5 = 1, + RDMA_DRIVER_MLX4 = 2, + RDMA_DRIVER_CXGB3 = 3, + RDMA_DRIVER_CXGB4 = 4, + RDMA_DRIVER_MTHCA = 5, + RDMA_DRIVER_BNXT_RE = 6, + RDMA_DRIVER_OCRDMA = 7, + RDMA_DRIVER_NES = 8, + RDMA_DRIVER_I40IW = 9, + RDMA_DRIVER_IRDMA = 9, + RDMA_DRIVER_VMW_PVRDMA = 10, + RDMA_DRIVER_QEDR = 11, + RDMA_DRIVER_HNS = 12, + RDMA_DRIVER_USNIC = 13, + RDMA_DRIVER_RXE = 14, + RDMA_DRIVER_HFI1 = 15, + RDMA_DRIVER_QIB = 16, + RDMA_DRIVER_EFA = 17, + RDMA_DRIVER_SIW = 18, +}; + +enum ib_cq_notify_flags { + IB_CQ_SOLICITED = 1, + IB_CQ_NEXT_COMP = 2, + IB_CQ_SOLICITED_MASK = 3, + IB_CQ_REPORT_MISSED_EVENTS = 4, +}; + +struct ib_mad; + +enum rdma_link_layer { + IB_LINK_LAYER_UNSPECIFIED = 0, + IB_LINK_LAYER_INFINIBAND = 1, + IB_LINK_LAYER_ETHERNET = 2, +}; + +enum rdma_netdev_t { + RDMA_NETDEV_OPA_VNIC = 0, + RDMA_NETDEV_IPOIB = 1, +}; + +enum ib_srq_attr_mask { + IB_SRQ_MAX_WR = 1, + IB_SRQ_LIMIT = 2, +}; + +enum ib_mr_type { + IB_MR_TYPE_MEM_REG = 0, + IB_MR_TYPE_SG_GAPS = 1, + IB_MR_TYPE_DM = 2, + IB_MR_TYPE_USER = 3, + IB_MR_TYPE_DMA = 4, + IB_MR_TYPE_INTEGRITY = 5, +}; + +enum ib_uverbs_advise_mr_advice { + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH = 0, + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE = 1, + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT = 2, +}; + +struct uverbs_attr_bundle; + +struct rdma_cm_id; + +struct iw_cm_id; + +struct iw_cm_conn_param; + +struct ib_qp; + +struct ib_send_wr; + +struct ib_recv_wr; + +struct ib_cq; + +struct ib_wc; + +struct ib_srq; + +struct ib_grh; + +struct ib_device_attr; + +struct ib_udata; + +struct ib_device_modify; + +struct ib_port_attr; + +struct ib_port_modify; + +struct ib_port_immutable; + +struct rdma_netdev_alloc_params; + +union ib_gid; + +struct ib_gid_attr; + +struct ib_ucontext; + +struct rdma_user_mmap_entry; + +struct ib_pd; + +struct ib_ah; + +struct rdma_ah_init_attr; + +struct rdma_ah_attr; + +struct ib_srq_init_attr; + +struct ib_srq_attr; + +struct ib_qp_init_attr; + +struct ib_qp_attr; + +struct ib_cq_init_attr; + +struct ib_mr; + +struct ib_sge; + +struct ib_mr_status; + +struct ib_mw; + +struct ib_xrcd; + +struct ib_flow; + +struct ib_flow_attr; + +struct ib_flow_action; + +struct ib_flow_action_attrs_esp; + +struct ib_wq; + +struct ib_wq_init_attr; + +struct ib_wq_attr; + +struct ib_rwq_ind_table; + +struct ib_rwq_ind_table_init_attr; + +struct ib_dm; + +struct ib_dm_alloc_attr; + +struct ib_dm_mr_attr; + +struct ib_counters; + +struct ib_counters_read_attr; + +struct ib_device_ops { + struct module *owner; + enum rdma_driver_id driver_id; + u32 uverbs_abi_ver; + unsigned int uverbs_no_driver_id_binding: 1; + const struct attribute_group *device_group; + const struct attribute_group **port_groups; + int (*post_send)(struct ib_qp *, const struct ib_send_wr *, const struct ib_send_wr **); + int (*post_recv)(struct ib_qp *, const struct ib_recv_wr *, const struct ib_recv_wr **); + void (*drain_rq)(struct ib_qp *); + void (*drain_sq)(struct ib_qp *); + int (*poll_cq)(struct ib_cq *, int, struct ib_wc *); + int (*peek_cq)(struct ib_cq *, int); + int (*req_notify_cq)(struct ib_cq *, enum ib_cq_notify_flags); + int (*post_srq_recv)(struct ib_srq *, const struct ib_recv_wr *, const struct ib_recv_wr **); + int (*process_mad)(struct ib_device *, int, u32, const struct ib_wc *, const struct ib_grh *, const struct ib_mad *, struct ib_mad *, size_t *, u16 *); + int (*query_device)(struct ib_device *, struct ib_device_attr *, struct ib_udata *); + int (*modify_device)(struct ib_device *, int, struct ib_device_modify *); + void (*get_dev_fw_str)(struct ib_device *, char *); + const struct cpumask * (*get_vector_affinity)(struct ib_device *, int); + int (*query_port)(struct ib_device *, u32, struct ib_port_attr *); + int (*modify_port)(struct ib_device *, u32, int, struct ib_port_modify *); + int (*get_port_immutable)(struct ib_device *, u32, struct ib_port_immutable *); + enum rdma_link_layer (*get_link_layer)(struct ib_device *, u32); + struct net_device * (*get_netdev)(struct ib_device *, u32); + struct net_device * (*alloc_rdma_netdev)(struct ib_device *, u32, enum rdma_netdev_t, const char *, unsigned char, void (*)(struct net_device *)); + int (*rdma_netdev_get_params)(struct ib_device *, u32, enum rdma_netdev_t, struct rdma_netdev_alloc_params *); + int (*query_gid)(struct ib_device *, u32, int, union ib_gid *); + int (*add_gid)(const struct ib_gid_attr *, void **); + int (*del_gid)(const struct ib_gid_attr *, void **); + int (*query_pkey)(struct ib_device *, u32, u16, u16 *); + int (*alloc_ucontext)(struct ib_ucontext *, struct ib_udata *); + void (*dealloc_ucontext)(struct ib_ucontext *); + int (*mmap)(struct ib_ucontext *, struct vm_area_struct *); + void (*mmap_free)(struct rdma_user_mmap_entry *); + void (*disassociate_ucontext)(struct ib_ucontext *); + int (*alloc_pd)(struct ib_pd *, struct ib_udata *); + int (*dealloc_pd)(struct ib_pd *, struct ib_udata *); + int (*create_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); + int (*create_user_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); + int (*modify_ah)(struct ib_ah *, struct rdma_ah_attr *); + int (*query_ah)(struct ib_ah *, struct rdma_ah_attr *); + int (*destroy_ah)(struct ib_ah *, u32); + int (*create_srq)(struct ib_srq *, struct ib_srq_init_attr *, struct ib_udata *); + int (*modify_srq)(struct ib_srq *, struct ib_srq_attr *, enum ib_srq_attr_mask, struct ib_udata *); + int (*query_srq)(struct ib_srq *, struct ib_srq_attr *); + int (*destroy_srq)(struct ib_srq *, struct ib_udata *); + int (*create_qp)(struct ib_qp *, struct ib_qp_init_attr *, struct ib_udata *); + int (*modify_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_udata *); + int (*query_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_qp_init_attr *); + int (*destroy_qp)(struct ib_qp *, struct ib_udata *); + int (*create_cq)(struct ib_cq *, const struct ib_cq_init_attr *, struct ib_udata *); + int (*modify_cq)(struct ib_cq *, u16, u16); + int (*destroy_cq)(struct ib_cq *, struct ib_udata *); + int (*resize_cq)(struct ib_cq *, int, struct ib_udata *); + struct ib_mr * (*get_dma_mr)(struct ib_pd *, int); + struct ib_mr * (*reg_user_mr)(struct ib_pd *, u64, u64, u64, int, struct ib_udata *); + struct ib_mr * (*reg_user_mr_dmabuf)(struct ib_pd *, u64, u64, u64, int, int, struct ib_udata *); + struct ib_mr * (*rereg_user_mr)(struct ib_mr *, int, u64, u64, u64, int, struct ib_pd *, struct ib_udata *); + int (*dereg_mr)(struct ib_mr *, struct ib_udata *); + struct ib_mr * (*alloc_mr)(struct ib_pd *, enum ib_mr_type, u32); + struct ib_mr * (*alloc_mr_integrity)(struct ib_pd *, u32, u32); + int (*advise_mr)(struct ib_pd *, enum ib_uverbs_advise_mr_advice, u32, struct ib_sge *, u32, struct uverbs_attr_bundle *); + int (*map_mr_sg)(struct ib_mr *, struct scatterlist *, int, unsigned int *); + int (*check_mr_status)(struct ib_mr *, u32, struct ib_mr_status *); + int (*alloc_mw)(struct ib_mw *, struct ib_udata *); + int (*dealloc_mw)(struct ib_mw *); + int (*attach_mcast)(struct ib_qp *, union ib_gid *, u16); + int (*detach_mcast)(struct ib_qp *, union ib_gid *, u16); + int (*alloc_xrcd)(struct ib_xrcd *, struct ib_udata *); + int (*dealloc_xrcd)(struct ib_xrcd *, struct ib_udata *); + struct ib_flow * (*create_flow)(struct ib_qp *, struct ib_flow_attr *, struct ib_udata *); + int (*destroy_flow)(struct ib_flow *); + struct ib_flow_action * (*create_flow_action_esp)(struct ib_device *, const struct ib_flow_action_attrs_esp *, struct uverbs_attr_bundle *); + int (*destroy_flow_action)(struct ib_flow_action *); + int (*modify_flow_action_esp)(struct ib_flow_action *, const struct ib_flow_action_attrs_esp *, struct uverbs_attr_bundle *); + int (*set_vf_link_state)(struct ib_device *, int, u32, int); + int (*get_vf_config)(struct ib_device *, int, u32, struct ifla_vf_info *); + int (*get_vf_stats)(struct ib_device *, int, u32, struct ifla_vf_stats *); + int (*get_vf_guid)(struct ib_device *, int, u32, struct ifla_vf_guid *, struct ifla_vf_guid *); + int (*set_vf_guid)(struct ib_device *, int, u32, u64, int); + struct ib_wq * (*create_wq)(struct ib_pd *, struct ib_wq_init_attr *, struct ib_udata *); + int (*destroy_wq)(struct ib_wq *, struct ib_udata *); + int (*modify_wq)(struct ib_wq *, struct ib_wq_attr *, u32, struct ib_udata *); + int (*create_rwq_ind_table)(struct ib_rwq_ind_table *, struct ib_rwq_ind_table_init_attr *, struct ib_udata *); + int (*destroy_rwq_ind_table)(struct ib_rwq_ind_table *); + struct ib_dm * (*alloc_dm)(struct ib_device *, struct ib_ucontext *, struct ib_dm_alloc_attr *, struct uverbs_attr_bundle *); + int (*dealloc_dm)(struct ib_dm *, struct uverbs_attr_bundle *); + struct ib_mr * (*reg_dm_mr)(struct ib_pd *, struct ib_dm *, struct ib_dm_mr_attr *, struct uverbs_attr_bundle *); + int (*create_counters)(struct ib_counters *, struct uverbs_attr_bundle *); + int (*destroy_counters)(struct ib_counters *); + int (*read_counters)(struct ib_counters *, struct ib_counters_read_attr *, struct uverbs_attr_bundle *); + int (*map_mr_sg_pi)(struct ib_mr *, struct scatterlist *, int, unsigned int *, struct scatterlist *, int, unsigned int *); + struct rdma_hw_stats * (*alloc_hw_device_stats)(struct ib_device *); + struct rdma_hw_stats * (*alloc_hw_port_stats)(struct ib_device *, u32); + int (*get_hw_stats)(struct ib_device *, struct rdma_hw_stats *, u32, int); + int (*modify_hw_stat)(struct ib_device *, u32, unsigned int, bool); + int (*fill_res_mr_entry)(struct sk_buff *, struct ib_mr *); + int (*fill_res_mr_entry_raw)(struct sk_buff *, struct ib_mr *); + int (*fill_res_cq_entry)(struct sk_buff *, struct ib_cq *); + int (*fill_res_cq_entry_raw)(struct sk_buff *, struct ib_cq *); + int (*fill_res_qp_entry)(struct sk_buff *, struct ib_qp *); + int (*fill_res_qp_entry_raw)(struct sk_buff *, struct ib_qp *); + int (*fill_res_cm_id_entry)(struct sk_buff *, struct rdma_cm_id *); + int (*enable_driver)(struct ib_device *); + void (*dealloc_driver)(struct ib_device *); + void (*iw_add_ref)(struct ib_qp *); + void (*iw_rem_ref)(struct ib_qp *); + struct ib_qp * (*iw_get_qp)(struct ib_device *, int); + int (*iw_connect)(struct iw_cm_id *, struct iw_cm_conn_param *); + int (*iw_accept)(struct iw_cm_id *, struct iw_cm_conn_param *); + int (*iw_reject)(struct iw_cm_id *, const void *, u8); + int (*iw_create_listen)(struct iw_cm_id *, int); + int (*iw_destroy_listen)(struct iw_cm_id *); + int (*counter_bind_qp)(struct rdma_counter *, struct ib_qp *); + int (*counter_unbind_qp)(struct ib_qp *); + int (*counter_dealloc)(struct rdma_counter *); + struct rdma_hw_stats * (*counter_alloc_stats)(struct rdma_counter *); + int (*counter_update_stats)(struct rdma_counter *); + int (*fill_stat_mr_entry)(struct sk_buff *, struct ib_mr *); + int (*query_ucontext)(struct ib_ucontext *, struct uverbs_attr_bundle *); + int (*get_numa_node)(struct ib_device *); + size_t size_ib_ah; + size_t size_ib_counters; + size_t size_ib_cq; + size_t size_ib_mw; + size_t size_ib_pd; + size_t size_ib_qp; + size_t size_ib_rwq_ind_table; + size_t size_ib_srq; + size_t size_ib_ucontext; + size_t size_ib_xrcd; +}; + +struct ib_core_device { + struct device dev; + possible_net_t rdma_net; + struct kobject *ports_kobj; + struct list_head port_list; + struct ib_device *owner; +}; + +enum ib_atomic_cap { + IB_ATOMIC_NONE = 0, + IB_ATOMIC_HCA = 1, + IB_ATOMIC_GLOB = 2, +}; + +struct ib_odp_caps { + uint64_t general_caps; + struct { + uint32_t rc_odp_caps; + uint32_t uc_odp_caps; + uint32_t ud_odp_caps; + uint32_t xrc_odp_caps; + } per_transport_caps; +}; + +struct ib_rss_caps { + u32 supported_qpts; + u32 max_rwq_indirection_tables; + u32 max_rwq_indirection_table_size; +}; + +struct ib_tm_caps { + u32 max_rndv_hdr_size; + u32 max_num_tags; + u32 flags; + u32 max_ops; + u32 max_sge; +}; + +struct ib_cq_caps { + u16 max_cq_moderation_count; + u16 max_cq_moderation_period; +}; + +struct ib_device_attr { + u64 fw_ver; + __be64 sys_image_guid; + u64 max_mr_size; + u64 page_size_cap; + u32 vendor_id; + u32 vendor_part_id; + u32 hw_ver; + int max_qp; + int max_qp_wr; + u64 device_cap_flags; + int max_send_sge; + int max_recv_sge; + int max_sge_rd; + int max_cq; + int max_cqe; + int max_mr; + int max_pd; + int max_qp_rd_atom; + int max_ee_rd_atom; + int max_res_rd_atom; + int max_qp_init_rd_atom; + int max_ee_init_rd_atom; + enum ib_atomic_cap atomic_cap; + enum ib_atomic_cap masked_atomic_cap; + int max_ee; + int max_rdd; + int max_mw; + int max_raw_ipv6_qp; + int max_raw_ethy_qp; + int max_mcast_grp; + int max_mcast_qp_attach; + int max_total_mcast_qp_attach; + int max_ah; + int max_srq; + int max_srq_wr; + int max_srq_sge; + unsigned int max_fast_reg_page_list_len; + unsigned int max_pi_fast_reg_page_list_len; + u16 max_pkeys; + u8 local_ca_ack_delay; + int sig_prot_cap; + int sig_guard_cap; + struct ib_odp_caps odp_caps; + uint64_t timestamp_mask; + uint64_t hca_core_clock; + struct ib_rss_caps rss_caps; + u32 max_wq_type_rq; + u32 raw_packet_caps; + struct ib_tm_caps tm_caps; + struct ib_cq_caps cq_caps; + u64 max_dm_size; + u32 max_sgl_rd; +}; + +struct hw_stats_device_data; + +struct rdma_restrack_root; + +struct uapi_definition; + +struct ib_port_data; + +struct ib_device { + struct device *dma_device; + struct ib_device_ops ops; + char name[64]; + struct callback_head callback_head; + struct list_head event_handler_list; + struct rw_semaphore event_handler_rwsem; + spinlock_t qp_open_list_lock; + struct rw_semaphore client_data_rwsem; + struct xarray client_data; + struct mutex unregistration_lock; + rwlock_t cache_lock; + struct ib_port_data *port_data; + int num_comp_vectors; + union { + struct device dev; + struct ib_core_device coredev; + }; + const struct attribute_group *groups[4]; + u64 uverbs_cmd_mask; + char node_desc[64]; + __be64 node_guid; + u32 local_dma_lkey; + u16 is_switch: 1; + u16 kverbs_provider: 1; + u16 use_cq_dim: 1; + u8 node_type; + u32 phys_port_cnt; + struct ib_device_attr attrs; + struct hw_stats_device_data *hw_stats_data; + struct rdmacg_device cg_device; + u32 index; + spinlock_t cq_pools_lock; + struct list_head cq_pools[3]; + struct rdma_restrack_root *res; + const struct uapi_definition *driver_def; + refcount_t refcount; + struct completion unreg_completion; + struct work_struct unregistration_work; + const struct rdma_link_ops *link_ops; + struct mutex compat_devs_mutex; + struct xarray compat_devs; + char iw_ifname[16]; + u32 iw_driver_flags; + u32 lag_flags; +}; + +enum ib_signature_type { + IB_SIG_TYPE_NONE = 0, + IB_SIG_TYPE_T10_DIF = 1, +}; + +enum ib_t10_dif_bg_type { + IB_T10DIF_CRC = 0, + IB_T10DIF_CSUM = 1, +}; + +struct ib_t10_dif_domain { + enum ib_t10_dif_bg_type bg_type; + u16 pi_interval; + u16 bg; + u16 app_tag; + u32 ref_tag; + bool ref_remap; + bool app_escape; + bool ref_escape; + u16 apptag_check_mask; +}; + +struct ib_sig_domain { + enum ib_signature_type sig_type; + union { + struct ib_t10_dif_domain dif; + } sig; +}; + +struct ib_sig_attrs { + u8 check_mask; + struct ib_sig_domain mem; + struct ib_sig_domain wire; + int meta_length; +}; + +enum ib_sig_err_type { + IB_SIG_BAD_GUARD = 0, + IB_SIG_BAD_REFTAG = 1, + IB_SIG_BAD_APPTAG = 2, +}; + +struct ib_sig_err { + enum ib_sig_err_type err_type; + u32 expected; + u32 actual; + u64 sig_err_offset; + u32 key; +}; + +enum ib_uverbs_flow_action_esp_keymat { + IB_UVERBS_FLOW_ACTION_ESP_KEYMAT_AES_GCM = 0, +}; + +struct ib_uverbs_flow_action_esp_keymat_aes_gcm { + __u64 iv; + __u32 iv_algo; + __u32 salt; + __u32 icv_len; + __u32 key_len; + __u32 aes_key[8]; +}; + +enum ib_uverbs_flow_action_esp_replay { + IB_UVERBS_FLOW_ACTION_ESP_REPLAY_NONE = 0, + IB_UVERBS_FLOW_ACTION_ESP_REPLAY_BMP = 1, +}; + +struct ib_uverbs_flow_action_esp_replay_bmp { + __u32 size; +}; + +union ib_gid { + u8 raw[16]; + struct { + __be64 subnet_prefix; + __be64 interface_id; + } global; +}; + +enum ib_gid_type { + IB_GID_TYPE_IB = 0, + IB_GID_TYPE_ROCE = 1, + IB_GID_TYPE_ROCE_UDP_ENCAP = 2, + IB_GID_TYPE_SIZE = 3, +}; + +struct ib_gid_attr { + struct net_device *ndev; + struct ib_device *device; + union ib_gid gid; + enum ib_gid_type gid_type; + u16 index; + u32 port_num; +}; + +struct ib_cq_init_attr { + unsigned int cqe; + u32 comp_vector; + u32 flags; +}; + +struct ib_dm_mr_attr { + u64 length; + u64 offset; + u32 access_flags; +}; + +struct ib_dm_alloc_attr { + u64 length; + u32 alignment; + u32 flags; +}; + +enum ib_mtu { + IB_MTU_256 = 1, + IB_MTU_512 = 2, + IB_MTU_1024 = 3, + IB_MTU_2048 = 4, + IB_MTU_4096 = 5, +}; + +enum ib_port_state { + IB_PORT_NOP = 0, + IB_PORT_DOWN = 1, + IB_PORT_INIT = 2, + IB_PORT_ARMED = 3, + IB_PORT_ACTIVE = 4, + IB_PORT_ACTIVE_DEFER = 5, +}; + +struct rdma_stat_desc { + const char *name; + unsigned int flags; + const void *priv; +}; + +struct ib_port_attr { + u64 subnet_prefix; + enum ib_port_state state; + enum ib_mtu max_mtu; + enum ib_mtu active_mtu; + u32 phys_mtu; + int gid_tbl_len; + unsigned int ip_gids: 1; + u32 port_cap_flags; + u32 max_msg_sz; + u32 bad_pkey_cntr; + u32 qkey_viol_cntr; + u16 pkey_tbl_len; + u32 sm_lid; + u32 lid; + u8 lmc; + u8 max_vl_num; + u8 sm_sl; + u8 subnet_timeout; + u8 init_type_reply; + u8 active_width; + u16 active_speed; + u8 phys_state; + u16 port_cap_flags2; +}; + +struct ib_device_modify { + u64 sys_image_guid; + char node_desc[64]; +}; + +struct ib_port_modify { + u32 set_port_cap_mask; + u32 clr_port_cap_mask; + u8 init_type; +}; + +enum ib_event_type { + IB_EVENT_CQ_ERR = 0, + IB_EVENT_QP_FATAL = 1, + IB_EVENT_QP_REQ_ERR = 2, + IB_EVENT_QP_ACCESS_ERR = 3, + IB_EVENT_COMM_EST = 4, + IB_EVENT_SQ_DRAINED = 5, + IB_EVENT_PATH_MIG = 6, + IB_EVENT_PATH_MIG_ERR = 7, + IB_EVENT_DEVICE_FATAL = 8, + IB_EVENT_PORT_ACTIVE = 9, + IB_EVENT_PORT_ERR = 10, + IB_EVENT_LID_CHANGE = 11, + IB_EVENT_PKEY_CHANGE = 12, + IB_EVENT_SM_CHANGE = 13, + IB_EVENT_SRQ_ERR = 14, + IB_EVENT_SRQ_LIMIT_REACHED = 15, + IB_EVENT_QP_LAST_WQE_REACHED = 16, + IB_EVENT_CLIENT_REREGISTER = 17, + IB_EVENT_GID_CHANGE = 18, + IB_EVENT_WQ_FATAL = 19, +}; + +struct ib_ucq_object; + +typedef void (*ib_comp_handler)(struct ib_cq *, void *); + +struct ib_event; + +struct ib_cq { + struct ib_device *device; + struct ib_ucq_object *uobject; + ib_comp_handler comp_handler; + void (*event_handler)(struct ib_event *, void *); + void *cq_context; + int cqe; + unsigned int cqe_used; + atomic_t usecnt; + enum ib_poll_context poll_ctx; + struct ib_wc *wc; + struct list_head pool_entry; + union { + struct irq_poll iop; + struct work_struct work; + }; + struct workqueue_struct *comp_wq; + struct dim *dim; + ktime_t timestamp; + u8 interrupt: 1; + u8 shared: 1; + unsigned int comp_vector; + struct rdma_restrack_entry res; +}; + +struct ib_uqp_object; + +enum ib_qp_type { + IB_QPT_SMI = 0, + IB_QPT_GSI = 1, + IB_QPT_RC = 2, + IB_QPT_UC = 3, + IB_QPT_UD = 4, + IB_QPT_RAW_IPV6 = 5, + IB_QPT_RAW_ETHERTYPE = 6, + IB_QPT_RAW_PACKET = 8, + IB_QPT_XRC_INI = 9, + IB_QPT_XRC_TGT = 10, + IB_QPT_MAX = 11, + IB_QPT_DRIVER = 255, + IB_QPT_RESERVED1 = 4096, + IB_QPT_RESERVED2 = 4097, + IB_QPT_RESERVED3 = 4098, + IB_QPT_RESERVED4 = 4099, + IB_QPT_RESERVED5 = 4100, + IB_QPT_RESERVED6 = 4101, + IB_QPT_RESERVED7 = 4102, + IB_QPT_RESERVED8 = 4103, + IB_QPT_RESERVED9 = 4104, + IB_QPT_RESERVED10 = 4105, +}; + +struct ib_qp_security; + +struct ib_qp { + struct ib_device *device; + struct ib_pd *pd; + struct ib_cq *send_cq; + struct ib_cq *recv_cq; + spinlock_t mr_lock; + int mrs_used; + struct list_head rdma_mrs; + struct list_head sig_mrs; + struct ib_srq *srq; + struct ib_xrcd *xrcd; + struct list_head xrcd_list; + atomic_t usecnt; + struct list_head open_list; + struct ib_qp *real_qp; + struct ib_uqp_object *uobject; + void (*event_handler)(struct ib_event *, void *); + void *qp_context; + const struct ib_gid_attr *av_sgid_attr; + const struct ib_gid_attr *alt_path_sgid_attr; + u32 qp_num; + u32 max_write_sge; + u32 max_read_sge; + enum ib_qp_type qp_type; + struct ib_rwq_ind_table *rwq_ind_tbl; + struct ib_qp_security *qp_sec; + u32 port; + bool integrity_en; + struct rdma_restrack_entry res; + struct rdma_counter *counter; +}; + +struct ib_usrq_object; + +enum ib_srq_type { + IB_SRQT_BASIC = 0, + IB_SRQT_XRC = 1, + IB_SRQT_TM = 2, +}; + +struct ib_srq { + struct ib_device *device; + struct ib_pd *pd; + struct ib_usrq_object *uobject; + void (*event_handler)(struct ib_event *, void *); + void *srq_context; + enum ib_srq_type srq_type; + atomic_t usecnt; + struct { + struct ib_cq *cq; + union { + struct { + struct ib_xrcd *xrcd; + u32 srq_num; + } xrc; + }; + } ext; + struct rdma_restrack_entry res; +}; + +struct ib_uwq_object; + +enum ib_wq_state { + IB_WQS_RESET = 0, + IB_WQS_RDY = 1, + IB_WQS_ERR = 2, +}; + +enum ib_wq_type { + IB_WQT_RQ = 0, +}; + +struct ib_wq { + struct ib_device *device; + struct ib_uwq_object *uobject; + void *wq_context; + void (*event_handler)(struct ib_event *, void *); + struct ib_pd *pd; + struct ib_cq *cq; + u32 wq_num; + enum ib_wq_state state; + enum ib_wq_type wq_type; + atomic_t usecnt; +}; + +struct ib_event { + struct ib_device *device; + union { + struct ib_cq *cq; + struct ib_qp *qp; + struct ib_srq *srq; + struct ib_wq *wq; + u32 port_num; + } element; + enum ib_event_type event; +}; + +struct ib_global_route { + const struct ib_gid_attr *sgid_attr; + union ib_gid dgid; + u32 flow_label; + u8 sgid_index; + u8 hop_limit; + u8 traffic_class; +}; + +struct ib_grh { + __be32 version_tclass_flow; + __be16 paylen; + u8 next_hdr; + u8 hop_limit; + union ib_gid sgid; + union ib_gid dgid; +}; + +struct ib_mr_status { + u32 fail_status; + struct ib_sig_err sig_err; +}; + +struct rdma_ah_init_attr { + struct rdma_ah_attr *ah_attr; + u32 flags; + struct net_device *xmit_slave; +}; + +enum rdma_ah_attr_type { + RDMA_AH_ATTR_TYPE_UNDEFINED = 0, + RDMA_AH_ATTR_TYPE_IB = 1, + RDMA_AH_ATTR_TYPE_ROCE = 2, + RDMA_AH_ATTR_TYPE_OPA = 3, +}; + +struct ib_ah_attr { + u16 dlid; + u8 src_path_bits; +}; + +struct roce_ah_attr { + u8 dmac[6]; +}; + +struct opa_ah_attr { + u32 dlid; + u8 src_path_bits; + bool make_grd; +}; + +struct rdma_ah_attr { + struct ib_global_route grh; + u8 sl; + u8 static_rate; + u32 port_num; + u8 ah_flags; + enum rdma_ah_attr_type type; + union { + struct ib_ah_attr ib; + struct roce_ah_attr roce; + struct opa_ah_attr opa; + }; +}; + +enum ib_wc_status { + IB_WC_SUCCESS = 0, + IB_WC_LOC_LEN_ERR = 1, + IB_WC_LOC_QP_OP_ERR = 2, + IB_WC_LOC_EEC_OP_ERR = 3, + IB_WC_LOC_PROT_ERR = 4, + IB_WC_WR_FLUSH_ERR = 5, + IB_WC_MW_BIND_ERR = 6, + IB_WC_BAD_RESP_ERR = 7, + IB_WC_LOC_ACCESS_ERR = 8, + IB_WC_REM_INV_REQ_ERR = 9, + IB_WC_REM_ACCESS_ERR = 10, + IB_WC_REM_OP_ERR = 11, + IB_WC_RETRY_EXC_ERR = 12, + IB_WC_RNR_RETRY_EXC_ERR = 13, + IB_WC_LOC_RDD_VIOL_ERR = 14, + IB_WC_REM_INV_RD_REQ_ERR = 15, + IB_WC_REM_ABORT_ERR = 16, + IB_WC_INV_EECN_ERR = 17, + IB_WC_INV_EEC_STATE_ERR = 18, + IB_WC_FATAL_ERR = 19, + IB_WC_RESP_TIMEOUT_ERR = 20, + IB_WC_GENERAL_ERR = 21, +}; + +enum ib_wc_opcode { + IB_WC_SEND = 0, + IB_WC_RDMA_WRITE = 1, + IB_WC_RDMA_READ = 2, + IB_WC_COMP_SWAP = 3, + IB_WC_FETCH_ADD = 4, + IB_WC_BIND_MW = 5, + IB_WC_LOCAL_INV = 6, + IB_WC_LSO = 7, + IB_WC_REG_MR = 8, + IB_WC_MASKED_COMP_SWAP = 9, + IB_WC_MASKED_FETCH_ADD = 10, + IB_WC_RECV = 128, + IB_WC_RECV_RDMA_WITH_IMM = 129, +}; + +struct ib_cqe { + void (*done)(struct ib_cq *, struct ib_wc *); +}; + +struct ib_wc { + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + enum ib_wc_status status; + enum ib_wc_opcode opcode; + u32 vendor_err; + u32 byte_len; + struct ib_qp *qp; + union { + __be32 imm_data; + u32 invalidate_rkey; + } ex; + u32 src_qp; + u32 slid; + int wc_flags; + u16 pkey_index; + u8 sl; + u8 dlid_path_bits; + u32 port_num; + u8 smac[6]; + u16 vlan_id; + u8 network_hdr_type; +}; + +struct ib_srq_attr { + u32 max_wr; + u32 max_sge; + u32 srq_limit; +}; + +struct ib_xrcd { + struct ib_device *device; + atomic_t usecnt; + struct inode *inode; + struct rw_semaphore tgt_qps_rwsem; + struct xarray tgt_qps; +}; + +struct ib_srq_init_attr { + void (*event_handler)(struct ib_event *, void *); + void *srq_context; + struct ib_srq_attr attr; + enum ib_srq_type srq_type; + struct { + struct ib_cq *cq; + union { + struct { + struct ib_xrcd *xrcd; + } xrc; + struct { + u32 max_num_tags; + } tag_matching; + }; + } ext; +}; + +struct ib_qp_cap { + u32 max_send_wr; + u32 max_recv_wr; + u32 max_send_sge; + u32 max_recv_sge; + u32 max_inline_data; + u32 max_rdma_ctxs; +}; + +enum ib_sig_type { + IB_SIGNAL_ALL_WR = 0, + IB_SIGNAL_REQ_WR = 1, +}; + +struct ib_qp_init_attr { + void (*event_handler)(struct ib_event *, void *); + void *qp_context; + struct ib_cq *send_cq; + struct ib_cq *recv_cq; + struct ib_srq *srq; + struct ib_xrcd *xrcd; + struct ib_qp_cap cap; + enum ib_sig_type sq_sig_type; + enum ib_qp_type qp_type; + u32 create_flags; + u32 port_num; + struct ib_rwq_ind_table *rwq_ind_tbl; + u32 source_qpn; +}; + +struct ib_uobject; + +struct ib_rwq_ind_table { + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; + u32 ind_tbl_num; + u32 log_ind_tbl_size; + struct ib_wq **ind_tbl; +}; + +enum ib_qp_state { + IB_QPS_RESET = 0, + IB_QPS_INIT = 1, + IB_QPS_RTR = 2, + IB_QPS_RTS = 3, + IB_QPS_SQD = 4, + IB_QPS_SQE = 5, + IB_QPS_ERR = 6, +}; + +enum ib_mig_state { + IB_MIG_MIGRATED = 0, + IB_MIG_REARM = 1, + IB_MIG_ARMED = 2, +}; + +enum ib_mw_type { + IB_MW_TYPE_1 = 1, + IB_MW_TYPE_2 = 2, +}; + +struct ib_qp_attr { + enum ib_qp_state qp_state; + enum ib_qp_state cur_qp_state; + enum ib_mtu path_mtu; + enum ib_mig_state path_mig_state; + u32 qkey; + u32 rq_psn; + u32 sq_psn; + u32 dest_qp_num; + int qp_access_flags; + struct ib_qp_cap cap; + struct rdma_ah_attr ah_attr; + struct rdma_ah_attr alt_ah_attr; + u16 pkey_index; + u16 alt_pkey_index; + u8 en_sqd_async_notify; + u8 sq_draining; + u8 max_rd_atomic; + u8 max_dest_rd_atomic; + u8 min_rnr_timer; + u32 port_num; + u8 timeout; + u8 retry_cnt; + u8 rnr_retry; + u32 alt_port_num; + u8 alt_timeout; + u32 rate_limit; + struct net_device *xmit_slave; +}; + +enum ib_wr_opcode { + IB_WR_RDMA_WRITE = 0, + IB_WR_RDMA_WRITE_WITH_IMM = 1, + IB_WR_SEND = 2, + IB_WR_SEND_WITH_IMM = 3, + IB_WR_RDMA_READ = 4, + IB_WR_ATOMIC_CMP_AND_SWP = 5, + IB_WR_ATOMIC_FETCH_AND_ADD = 6, + IB_WR_BIND_MW = 8, + IB_WR_LSO = 10, + IB_WR_SEND_WITH_INV = 9, + IB_WR_RDMA_READ_WITH_INV = 11, + IB_WR_LOCAL_INV = 7, + IB_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, + IB_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, + IB_WR_REG_MR = 32, + IB_WR_REG_MR_INTEGRITY = 33, + IB_WR_RESERVED1 = 240, + IB_WR_RESERVED2 = 241, + IB_WR_RESERVED3 = 242, + IB_WR_RESERVED4 = 243, + IB_WR_RESERVED5 = 244, + IB_WR_RESERVED6 = 245, + IB_WR_RESERVED7 = 246, + IB_WR_RESERVED8 = 247, + IB_WR_RESERVED9 = 248, + IB_WR_RESERVED10 = 249, +}; + +struct ib_sge { + u64 addr; + u32 length; + u32 lkey; +}; + +struct ib_send_wr { + struct ib_send_wr *next; + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + struct ib_sge *sg_list; + int num_sge; + enum ib_wr_opcode opcode; + int send_flags; + union { + __be32 imm_data; + u32 invalidate_rkey; + } ex; +}; + +struct ib_ah { + struct ib_device *device; + struct ib_pd *pd; + struct ib_uobject *uobject; + const struct ib_gid_attr *sgid_attr; + enum rdma_ah_attr_type type; +}; + +struct ib_mr { + struct ib_device *device; + struct ib_pd *pd; + u32 lkey; + u32 rkey; + u64 iova; + u64 length; + unsigned int page_size; + enum ib_mr_type type; + bool need_inval; + union { + struct ib_uobject *uobject; + struct list_head qp_entry; + }; + struct ib_dm *dm; + struct ib_sig_attrs *sig_attrs; + struct rdma_restrack_entry res; +}; + +struct ib_recv_wr { + struct ib_recv_wr *next; + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + struct ib_sge *sg_list; + int num_sge; +}; + +struct ib_rdmacg_object { + struct rdma_cgroup *cg; +}; + +struct ib_uverbs_file; + +struct ib_ucontext { + struct ib_device *device; + struct ib_uverbs_file *ufile; + struct ib_rdmacg_object cg_obj; + struct rdma_restrack_entry res; + struct xarray mmap_xa; +}; + +struct uverbs_api_object; + +struct ib_uobject { + u64 user_handle; + struct ib_uverbs_file *ufile; + struct ib_ucontext *context; + void *object; + struct list_head list; + struct ib_rdmacg_object cg_obj; + int id; + struct kref ref; + atomic_t usecnt; + struct callback_head rcu; + const struct uverbs_api_object *uapi_object; +}; + +struct ib_udata { + const void *inbuf; + void *outbuf; + size_t inlen; + size_t outlen; +}; + +struct ib_pd { + u32 local_dma_lkey; + u32 flags; + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; + u32 unsafe_global_rkey; + struct ib_mr *__internal_mr; + struct rdma_restrack_entry res; +}; + +struct ib_wq_init_attr { + void *wq_context; + enum ib_wq_type wq_type; + u32 max_wr; + u32 max_sge; + struct ib_cq *cq; + void (*event_handler)(struct ib_event *, void *); + u32 create_flags; +}; + +struct ib_wq_attr { + enum ib_wq_state wq_state; + enum ib_wq_state curr_wq_state; + u32 flags; + u32 flags_mask; +}; + +struct ib_rwq_ind_table_init_attr { + u32 log_ind_tbl_size; + struct ib_wq **ind_tbl; +}; + +enum port_pkey_state { + IB_PORT_PKEY_NOT_VALID = 0, + IB_PORT_PKEY_VALID = 1, + IB_PORT_PKEY_LISTED = 2, +}; + +struct ib_port_pkey { + enum port_pkey_state state; + u16 pkey_index; + u32 port_num; + struct list_head qp_list; + struct list_head to_error_list; + struct ib_qp_security *sec; +}; + +struct ib_ports_pkeys; + +struct ib_qp_security { + struct ib_qp *qp; + struct ib_device *dev; + struct mutex mutex; + struct ib_ports_pkeys *ports_pkeys; + struct list_head shared_qp_list; + void *security; + bool destroying; + atomic_t error_list_count; + struct completion error_complete; + int error_comps_pending; +}; + +struct ib_ports_pkeys { + struct ib_port_pkey main; + struct ib_port_pkey alt; +}; + +struct ib_dm { + struct ib_device *device; + u32 length; + u32 flags; + struct ib_uobject *uobject; + atomic_t usecnt; +}; + +struct ib_mw { + struct ib_device *device; + struct ib_pd *pd; + struct ib_uobject *uobject; + u32 rkey; + enum ib_mw_type type; +}; + +enum ib_flow_attr_type { + IB_FLOW_ATTR_NORMAL = 0, + IB_FLOW_ATTR_ALL_DEFAULT = 1, + IB_FLOW_ATTR_MC_DEFAULT = 2, + IB_FLOW_ATTR_SNIFFER = 3, +}; + +enum ib_flow_spec_type { + IB_FLOW_SPEC_ETH = 32, + IB_FLOW_SPEC_IB = 34, + IB_FLOW_SPEC_IPV4 = 48, + IB_FLOW_SPEC_IPV6 = 49, + IB_FLOW_SPEC_ESP = 52, + IB_FLOW_SPEC_TCP = 64, + IB_FLOW_SPEC_UDP = 65, + IB_FLOW_SPEC_VXLAN_TUNNEL = 80, + IB_FLOW_SPEC_GRE = 81, + IB_FLOW_SPEC_MPLS = 96, + IB_FLOW_SPEC_INNER = 256, + IB_FLOW_SPEC_ACTION_TAG = 4096, + IB_FLOW_SPEC_ACTION_DROP = 4097, + IB_FLOW_SPEC_ACTION_HANDLE = 4098, + IB_FLOW_SPEC_ACTION_COUNT = 4099, +}; + +struct ib_flow_eth_filter { + u8 dst_mac[6]; + u8 src_mac[6]; + __be16 ether_type; + __be16 vlan_tag; + u8 real_sz[0]; +}; + +struct ib_flow_spec_eth { + u32 type; + u16 size; + struct ib_flow_eth_filter val; + struct ib_flow_eth_filter mask; +}; + +struct ib_flow_ib_filter { + __be16 dlid; + __u8 sl; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ib { + u32 type; + u16 size; + struct ib_flow_ib_filter val; + struct ib_flow_ib_filter mask; +}; + +struct ib_flow_ipv4_filter { + __be32 src_ip; + __be32 dst_ip; + u8 proto; + u8 tos; + u8 ttl; + u8 flags; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ipv4 { + u32 type; + u16 size; + struct ib_flow_ipv4_filter val; + struct ib_flow_ipv4_filter mask; +}; + +struct ib_flow_ipv6_filter { + u8 src_ip[16]; + u8 dst_ip[16]; + __be32 flow_label; + u8 next_hdr; + u8 traffic_class; + u8 hop_limit; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ipv6 { + u32 type; + u16 size; + struct ib_flow_ipv6_filter val; + struct ib_flow_ipv6_filter mask; +}; + +struct ib_flow_tcp_udp_filter { + __be16 dst_port; + __be16 src_port; + u8 real_sz[0]; +}; + +struct ib_flow_spec_tcp_udp { + u32 type; + u16 size; + struct ib_flow_tcp_udp_filter val; + struct ib_flow_tcp_udp_filter mask; +}; + +struct ib_flow_tunnel_filter { + __be32 tunnel_id; + u8 real_sz[0]; +}; + +struct ib_flow_spec_tunnel { + u32 type; + u16 size; + struct ib_flow_tunnel_filter val; + struct ib_flow_tunnel_filter mask; +}; + +struct ib_flow_esp_filter { + __be32 spi; + __be32 seq; + u8 real_sz[0]; +}; + +struct ib_flow_spec_esp { + u32 type; + u16 size; + struct ib_flow_esp_filter val; + struct ib_flow_esp_filter mask; +}; + +struct ib_flow_gre_filter { + __be16 c_ks_res0_ver; + __be16 protocol; + __be32 key; + u8 real_sz[0]; +}; + +struct ib_flow_spec_gre { + u32 type; + u16 size; + struct ib_flow_gre_filter val; + struct ib_flow_gre_filter mask; +}; + +struct ib_flow_mpls_filter { + __be32 tag; + u8 real_sz[0]; +}; + +struct ib_flow_spec_mpls { + u32 type; + u16 size; + struct ib_flow_mpls_filter val; + struct ib_flow_mpls_filter mask; +}; + +struct ib_flow_spec_action_tag { + enum ib_flow_spec_type type; + u16 size; + u32 tag_id; +}; + +struct ib_flow_spec_action_drop { + enum ib_flow_spec_type type; + u16 size; +}; + +struct ib_flow_spec_action_handle { + enum ib_flow_spec_type type; + u16 size; + struct ib_flow_action *act; +}; + +enum ib_flow_action_type { + IB_FLOW_ACTION_UNSPECIFIED = 0, + IB_FLOW_ACTION_ESP = 1, +}; + +struct ib_flow_action { + struct ib_device *device; + struct ib_uobject *uobject; + enum ib_flow_action_type type; + atomic_t usecnt; +}; + +struct ib_flow_spec_action_count { + enum ib_flow_spec_type type; + u16 size; + struct ib_counters *counters; +}; + +struct ib_counters { + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; +}; + +union ib_flow_spec { + struct { + u32 type; + u16 size; + }; + struct ib_flow_spec_eth eth; + struct ib_flow_spec_ib ib; + struct ib_flow_spec_ipv4 ipv4; + struct ib_flow_spec_tcp_udp tcp_udp; + struct ib_flow_spec_ipv6 ipv6; + struct ib_flow_spec_tunnel tunnel; + struct ib_flow_spec_esp esp; + struct ib_flow_spec_gre gre; + struct ib_flow_spec_mpls mpls; + struct ib_flow_spec_action_tag flow_tag; + struct ib_flow_spec_action_drop drop; + struct ib_flow_spec_action_handle action; + struct ib_flow_spec_action_count flow_count; +}; + +struct ib_flow_attr { + enum ib_flow_attr_type type; + u16 size; + u16 priority; + u32 flags; + u8 num_of_specs; + u32 port; + union ib_flow_spec flows[0]; +}; + +struct ib_flow { + struct ib_qp *qp; + struct ib_device *device; + struct ib_uobject *uobject; +}; + +struct ib_flow_action_attrs_esp_keymats { + enum ib_uverbs_flow_action_esp_keymat protocol; + union { + struct ib_uverbs_flow_action_esp_keymat_aes_gcm aes_gcm; + } keymat; +}; + +struct ib_flow_action_attrs_esp_replays { + enum ib_uverbs_flow_action_esp_replay protocol; + union { + struct ib_uverbs_flow_action_esp_replay_bmp bmp; + } replay; +}; + +struct ib_flow_spec_list { + struct ib_flow_spec_list *next; + union ib_flow_spec spec; +}; + +struct ib_flow_action_attrs_esp { + struct ib_flow_action_attrs_esp_keymats *keymat; + struct ib_flow_action_attrs_esp_replays *replay; + struct ib_flow_spec_list *encap; + u32 esn; + u32 spi; + u32 seq; + u32 tfc_pad; + u64 flags; + u64 hard_limit_pkts; +}; + +struct ib_pkey_cache; + +struct ib_gid_table; + +struct ib_port_cache { + u64 subnet_prefix; + struct ib_pkey_cache *pkey; + struct ib_gid_table *gid; + u8 lmc; + enum ib_port_state port_state; +}; + +struct ib_port_immutable { + int pkey_tbl_len; + int gid_tbl_len; + u32 core_cap_flags; + u32 max_mad_size; +}; + +struct ib_port; + +struct ib_port_data { + struct ib_device *ib_dev; + struct ib_port_immutable immutable; + spinlock_t pkey_list_lock; + spinlock_t netdev_lock; + struct list_head pkey_list; + struct ib_port_cache cache; + struct net_device *netdev; + struct hlist_node ndev_hash_link; + struct rdma_port_counter port_counter; + struct ib_port *sysfs; +}; + +struct rdma_netdev_alloc_params { + size_t sizeof_priv; + unsigned int txqs; + unsigned int rxqs; + void *param; + int (*initialize_rdma_netdev)(struct ib_device *, u32, struct net_device *, void *); +}; + +struct ib_counters_read_attr { + u64 *counters_buff; + u32 ncounters; + u32 flags; +}; + +struct rdma_user_mmap_entry { + struct kref ref; + struct ib_ucontext *ucontext; + long unsigned int start_pgoff; + size_t npages; + bool driver_removed; +}; + +enum blk_zone_type { + BLK_ZONE_TYPE_CONVENTIONAL = 1, + BLK_ZONE_TYPE_SEQWRITE_REQ = 2, + BLK_ZONE_TYPE_SEQWRITE_PREF = 3, +}; + +enum blk_zone_cond { + BLK_ZONE_COND_NOT_WP = 0, + BLK_ZONE_COND_EMPTY = 1, + BLK_ZONE_COND_IMP_OPEN = 2, + BLK_ZONE_COND_EXP_OPEN = 3, + BLK_ZONE_COND_CLOSED = 4, + BLK_ZONE_COND_READONLY = 13, + BLK_ZONE_COND_FULL = 14, + BLK_ZONE_COND_OFFLINE = 15, +}; + +enum blk_zone_report_flags { + BLK_ZONE_REP_CAPACITY = 1, +}; + +struct blk_zone_report { + __u64 sector; + __u32 nr_zones; + __u32 flags; + struct blk_zone zones[0]; +}; + +struct blk_zone_range { + __u64 sector; + __u64 nr_sectors; +}; + +struct zone_report_args { + struct blk_zone *zones; +}; + +struct blk_revalidate_zone_args { + struct gendisk *disk; + long unsigned int *conv_zones_bitmap; + long unsigned int *seq_zones_wlock; + unsigned int nr_zones; + sector_t zone_sectors; + sector_t sector; +}; + +enum wbt_flags { + WBT_TRACKED = 1, + WBT_READ = 2, + WBT_KSWAPD = 4, + WBT_DISCARD = 8, + WBT_NR_BITS = 4, +}; + +enum { + WBT_STATE_ON_DEFAULT = 1, + WBT_STATE_ON_MANUAL = 2, + WBT_STATE_OFF_DEFAULT = 3, +}; + +struct rq_wb { + unsigned int wb_background; + unsigned int wb_normal; + short int enable_state; + unsigned int unknown_cnt; + u64 win_nsec; + u64 cur_win_nsec; + struct blk_stat_callback *cb; + u64 sync_issue; + void *sync_cookie; + unsigned int wc; + long unsigned int last_issue; + long unsigned int last_comp; + long unsigned int min_lat_nsec; + struct rq_qos rqos; + struct rq_wait rq_wait[3]; + struct rq_depth rq_depth; +}; + +struct trace_event_raw_wbt_stat { + struct trace_entry ent; + char name[32]; + s64 rmean; + u64 rmin; + u64 rmax; + s64 rnr_samples; + s64 rtime; + s64 wmean; + u64 wmin; + u64 wmax; + s64 wnr_samples; + s64 wtime; + char __data[0]; +}; + +struct trace_event_raw_wbt_lat { + struct trace_entry ent; + char name[32]; + long unsigned int lat; + char __data[0]; +}; + +struct trace_event_raw_wbt_step { + struct trace_entry ent; + char name[32]; + const char *msg; + int step; + long unsigned int window; + unsigned int bg; + unsigned int normal; + unsigned int max; + char __data[0]; +}; + +struct trace_event_raw_wbt_timer { + struct trace_entry ent; + char name[32]; + unsigned int status; + int step; + unsigned int inflight; + char __data[0]; +}; + +struct trace_event_data_offsets_wbt_stat {}; + +struct trace_event_data_offsets_wbt_lat {}; + +struct trace_event_data_offsets_wbt_step {}; + +struct trace_event_data_offsets_wbt_timer {}; + +typedef void (*btf_trace_wbt_stat)(void *, struct backing_dev_info *, struct blk_rq_stat *); + +typedef void (*btf_trace_wbt_lat)(void *, struct backing_dev_info *, long unsigned int); + +typedef void (*btf_trace_wbt_step)(void *, struct backing_dev_info *, const char *, int, long unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_wbt_timer)(void *, struct backing_dev_info *, unsigned int, int, unsigned int); + +enum { + RWB_DEF_DEPTH = 16, + RWB_WINDOW_NSEC = 100000000, + RWB_MIN_WRITE_SAMPLES = 3, + RWB_UNKNOWN_BUMP = 5, +}; + +enum { + LAT_OK = 1, + LAT_UNKNOWN = 2, + LAT_UNKNOWN_WRITES = 3, + LAT_EXCEEDED = 4, +}; + +struct wbt_wait_data { + struct rq_wb *rwb; + enum wbt_flags wb_acct; + long unsigned int rw; +}; + +struct show_busy_params { + struct seq_file *m; + struct blk_mq_hw_ctx *hctx; +}; + +enum opal_mbr { + OPAL_MBR_ENABLE = 0, + OPAL_MBR_DISABLE = 1, +}; + +enum opal_mbr_done_flag { + OPAL_MBR_NOT_DONE = 0, + OPAL_MBR_DONE = 1, +}; + +enum opal_user { + OPAL_ADMIN1 = 0, + OPAL_USER1 = 1, + OPAL_USER2 = 2, + OPAL_USER3 = 3, + OPAL_USER4 = 4, + OPAL_USER5 = 5, + OPAL_USER6 = 6, + OPAL_USER7 = 7, + OPAL_USER8 = 8, + OPAL_USER9 = 9, +}; + +enum opal_lock_state { + OPAL_RO = 1, + OPAL_RW = 2, + OPAL_LK = 4, +}; + +struct opal_key { + __u8 lr; + __u8 key_len; + __u8 __align[6]; + __u8 key[256]; +}; + +struct opal_lr_act { + struct opal_key key; + __u32 sum; + __u8 num_lrs; + __u8 lr[9]; + __u8 align[2]; +}; + +struct opal_session_info { + __u32 sum; + __u32 who; + struct opal_key opal_key; +}; + +struct opal_user_lr_setup { + __u64 range_start; + __u64 range_length; + __u32 RLE; + __u32 WLE; + struct opal_session_info session; +}; + +struct opal_lock_unlock { + struct opal_session_info session; + __u32 l_state; + __u8 __align[4]; +}; + +struct opal_new_pw { + struct opal_session_info session; + struct opal_session_info new_user_pw; +}; + +struct opal_mbr_data { + struct opal_key key; + __u8 enable_disable; + __u8 __align[7]; +}; + +struct opal_mbr_done { + struct opal_key key; + __u8 done_flag; + __u8 __align[7]; +}; + +struct opal_shadow_mbr { + struct opal_key key; + const __u64 data; + __u64 offset; + __u64 size; +}; + +enum opal_table_ops { + OPAL_READ_TABLE = 0, + OPAL_WRITE_TABLE = 1, +}; + +struct opal_read_write_table { + struct opal_key key; + const __u64 data; + const __u8 table_uid[8]; + __u64 offset; + __u64 size; + __u64 flags; + __u64 priv; +}; + +typedef int sec_send_recv(void *, u16, u8, void *, size_t, bool); + +enum { + TCG_SECP_00 = 0, + TCG_SECP_01 = 1, +}; + +enum opal_response_token { + OPAL_DTA_TOKENID_BYTESTRING = 224, + OPAL_DTA_TOKENID_SINT = 225, + OPAL_DTA_TOKENID_UINT = 226, + OPAL_DTA_TOKENID_TOKEN = 227, + OPAL_DTA_TOKENID_INVALID = 0, +}; + +enum opal_uid { + OPAL_SMUID_UID = 0, + OPAL_THISSP_UID = 1, + OPAL_ADMINSP_UID = 2, + OPAL_LOCKINGSP_UID = 3, + OPAL_ENTERPRISE_LOCKINGSP_UID = 4, + OPAL_ANYBODY_UID = 5, + OPAL_SID_UID = 6, + OPAL_ADMIN1_UID = 7, + OPAL_USER1_UID = 8, + OPAL_USER2_UID = 9, + OPAL_PSID_UID = 10, + OPAL_ENTERPRISE_BANDMASTER0_UID = 11, + OPAL_ENTERPRISE_ERASEMASTER_UID = 12, + OPAL_TABLE_TABLE = 13, + OPAL_LOCKINGRANGE_GLOBAL = 14, + OPAL_LOCKINGRANGE_ACE_RDLOCKED = 15, + OPAL_LOCKINGRANGE_ACE_WRLOCKED = 16, + OPAL_MBRCONTROL = 17, + OPAL_MBR = 18, + OPAL_AUTHORITY_TABLE = 19, + OPAL_C_PIN_TABLE = 20, + OPAL_LOCKING_INFO_TABLE = 21, + OPAL_ENTERPRISE_LOCKING_INFO_TABLE = 22, + OPAL_DATASTORE = 23, + OPAL_C_PIN_MSID = 24, + OPAL_C_PIN_SID = 25, + OPAL_C_PIN_ADMIN1 = 26, + OPAL_HALF_UID_AUTHORITY_OBJ_REF = 27, + OPAL_HALF_UID_BOOLEAN_ACE = 28, + OPAL_UID_HEXFF = 29, +}; + +enum opal_method { + OPAL_PROPERTIES = 0, + OPAL_STARTSESSION = 1, + OPAL_REVERT = 2, + OPAL_ACTIVATE = 3, + OPAL_EGET = 4, + OPAL_ESET = 5, + OPAL_NEXT = 6, + OPAL_EAUTHENTICATE = 7, + OPAL_GETACL = 8, + OPAL_GENKEY = 9, + OPAL_REVERTSP = 10, + OPAL_GET = 11, + OPAL_SET = 12, + OPAL_AUTHENTICATE = 13, + OPAL_RANDOM = 14, + OPAL_ERASE = 15, +}; + +enum opal_token { + OPAL_TRUE = 1, + OPAL_FALSE = 0, + OPAL_BOOLEAN_EXPR = 3, + OPAL_TABLE = 0, + OPAL_STARTROW = 1, + OPAL_ENDROW = 2, + OPAL_STARTCOLUMN = 3, + OPAL_ENDCOLUMN = 4, + OPAL_VALUES = 1, + OPAL_TABLE_UID = 0, + OPAL_TABLE_NAME = 1, + OPAL_TABLE_COMMON = 2, + OPAL_TABLE_TEMPLATE = 3, + OPAL_TABLE_KIND = 4, + OPAL_TABLE_COLUMN = 5, + OPAL_TABLE_COLUMNS = 6, + OPAL_TABLE_ROWS = 7, + OPAL_TABLE_ROWS_FREE = 8, + OPAL_TABLE_ROW_BYTES = 9, + OPAL_TABLE_LASTID = 10, + OPAL_TABLE_MIN = 11, + OPAL_TABLE_MAX = 12, + OPAL_PIN = 3, + OPAL_RANGESTART = 3, + OPAL_RANGELENGTH = 4, + OPAL_READLOCKENABLED = 5, + OPAL_WRITELOCKENABLED = 6, + OPAL_READLOCKED = 7, + OPAL_WRITELOCKED = 8, + OPAL_ACTIVEKEY = 10, + OPAL_LIFECYCLE = 6, + OPAL_MAXRANGES = 4, + OPAL_MBRENABLE = 1, + OPAL_MBRDONE = 2, + OPAL_HOSTPROPERTIES = 0, + OPAL_STARTLIST = 240, + OPAL_ENDLIST = 241, + OPAL_STARTNAME = 242, + OPAL_ENDNAME = 243, + OPAL_CALL = 248, + OPAL_ENDOFDATA = 249, + OPAL_ENDOFSESSION = 250, + OPAL_STARTTRANSACTON = 251, + OPAL_ENDTRANSACTON = 252, + OPAL_EMPTYATOM = 255, + OPAL_WHERE = 0, +}; + +enum opal_parameter { + OPAL_SUM_SET_LIST = 393216, +}; + +struct opal_compacket { + __be32 reserved0; + u8 extendedComID[4]; + __be32 outstandingData; + __be32 minTransfer; + __be32 length; +}; + +struct opal_packet { + __be32 tsn; + __be32 hsn; + __be32 seq_number; + __be16 reserved0; + __be16 ack_type; + __be32 acknowledgment; + __be32 length; +}; + +struct opal_data_subpacket { + u8 reserved0[6]; + __be16 kind; + __be32 length; +}; + +struct opal_header { + struct opal_compacket cp; + struct opal_packet pkt; + struct opal_data_subpacket subpkt; +}; + +struct d0_header { + __be32 length; + __be32 revision; + __be32 reserved01; + __be32 reserved02; + u8 ignored[32]; +}; + +struct d0_tper_features { + u8 supported_features; + u8 reserved01[3]; + __be32 reserved02; + __be32 reserved03; +}; + +struct d0_locking_features { + u8 supported_features; + u8 reserved01[3]; + __be32 reserved02; + __be32 reserved03; +}; + +struct d0_geometry_features { + u8 header[4]; + u8 reserved01; + u8 reserved02[7]; + __be32 logical_block_size; + __be64 alignment_granularity; + __be64 lowest_aligned_lba; +}; + +struct d0_opal_v100 { + __be16 baseComID; + __be16 numComIDs; +}; + +struct d0_single_user_mode { + __be32 num_locking_objects; + u8 reserved01; + u8 reserved02; + __be16 reserved03; + __be32 reserved04; +}; + +struct d0_opal_v200 { + __be16 baseComID; + __be16 numComIDs; + u8 range_crossing; + u8 num_locking_admin_auth[2]; + u8 num_locking_user_auth[2]; + u8 initialPIN; + u8 revertedPIN; + u8 reserved01; + __be32 reserved02; +}; + +struct d0_features { + __be16 code; + u8 r_version; + u8 length; + u8 features[0]; +}; + +struct opal_dev; + +struct opal_step { + int (*fn)(struct opal_dev *, void *); + void *data; +}; + +enum opal_atom_width { + OPAL_WIDTH_TINY = 0, + OPAL_WIDTH_SHORT = 1, + OPAL_WIDTH_MEDIUM = 2, + OPAL_WIDTH_LONG = 3, + OPAL_WIDTH_TOKEN = 4, +}; + +struct opal_resp_tok { + const u8 *pos; + size_t len; + enum opal_response_token type; + enum opal_atom_width width; + union { + u64 u; + s64 s; + } stored; +}; + +struct parsed_resp { + int num; + struct opal_resp_tok toks[64]; +}; + +struct opal_dev { + bool supported; + bool mbr_enabled; + void *data; + sec_send_recv *send_recv; + struct mutex dev_lock; + u16 comid; + u32 hsn; + u32 tsn; + u64 align; + u64 lowest_lba; + size_t pos; + u8 cmd[2048]; + u8 resp[2048]; + struct parsed_resp parsed; + size_t prev_d_len; + void *prev_data; + struct list_head unlk_lst; +}; + +typedef int cont_fn(struct opal_dev *); + +struct opal_suspend_data { + struct opal_lock_unlock unlk; + u8 lr; + struct list_head node; +}; + +struct blk_crypto_ll_ops { + int (*keyslot_program)(struct blk_crypto_profile *, const struct blk_crypto_key *, unsigned int); + int (*keyslot_evict)(struct blk_crypto_profile *, const struct blk_crypto_key *, unsigned int); +}; + +struct blk_crypto_profile { + struct blk_crypto_ll_ops ll_ops; + unsigned int max_dun_bytes_supported; + unsigned int modes_supported[4]; + struct device *dev; + unsigned int num_slots; + struct rw_semaphore lock; + wait_queue_head_t idle_slots_wait_queue; + struct list_head idle_slots; + spinlock_t idle_slots_lock; + struct hlist_head *slot_hashtable; + unsigned int log_slot_ht_size; + struct blk_crypto_keyslot *slots; +}; + +struct blk_crypto_mode { + const char *cipher_str; + unsigned int keysize; + unsigned int ivsize; +}; + +struct blk_crypto_keyslot { + atomic_t slot_refs; + struct list_head idle_slot_node; + struct hlist_node hash_node; + const struct blk_crypto_key *key; + struct blk_crypto_profile *profile; +}; + +struct bio_fallback_crypt_ctx { + struct bio_crypt_ctx crypt_ctx; + struct bvec_iter crypt_iter; + union { + struct { + struct work_struct work; + struct bio *bio; + }; + struct { + void *bi_private_orig; + bio_end_io_t *bi_end_io_orig; + }; + }; +}; + +struct blk_crypto_fallback_keyslot { + enum blk_crypto_mode_num crypto_mode; + struct crypto_skcipher *tfms[4]; +}; + +union blk_crypto_iv { + __le64 dun[4]; + u8 bytes[32]; +}; + +struct bd_holder_disk { + struct list_head list; + struct block_device *bdev; + int refcnt; +}; + +typedef int (*cmp_r_func_t)(const void *, const void *, const void *); + +struct siprand_state { + long unsigned int v0; + long unsigned int v1; + long unsigned int v2; + long unsigned int v3; +}; + +struct region { + unsigned int start; + unsigned int off; + unsigned int group_len; + unsigned int end; + unsigned int nbits; +}; + +enum { + REG_OP_ISFREE = 0, + REG_OP_ALLOC = 1, + REG_OP_RELEASE = 2, +}; + +struct sg_append_table { + struct sg_table sgt; + struct scatterlist *prv; + unsigned int total_nents; +}; + +typedef struct scatterlist *sg_alloc_fn(unsigned int, gfp_t); + +typedef void sg_free_fn(struct scatterlist *, unsigned int); + +struct sg_page_iter { + struct scatterlist *sg; + unsigned int sg_pgoffset; + unsigned int __nents; + int __pg_advance; +}; + +struct sg_dma_page_iter { + struct sg_page_iter base; +}; + +struct sg_mapping_iter { + struct page *page; + void *addr; + size_t length; + size_t consumed; + struct sg_page_iter piter; + unsigned int __offset; + unsigned int __remaining; + unsigned int __flags; +}; + +struct csum_state { + __wsum csum; + size_t off; +}; + +struct rhltable { + struct rhashtable ht; +}; + +struct rhashtable_walker { + struct list_head list; + struct bucket_table *tbl; +}; + +struct rhashtable_iter { + struct rhashtable *ht; + struct rhash_head *p; + struct rhlist_head *list; + struct rhashtable_walker walker; + unsigned int slot; + unsigned int skip; + bool end_of_table; +}; + +union nested_table { + union nested_table *table; + struct rhash_lock_head *bucket; +}; + +struct once_work { + struct work_struct work; + struct static_key_true *key; + struct module *module; +}; + +struct genradix_iter { + size_t offset; + size_t pos; +}; + +struct genradix_node { + union { + struct genradix_node *children[512]; + u8 data[4096]; + }; +}; + +struct reciprocal_value_adv { + u32 m; + u8 sh; + u8 exp; + bool is_wide_m; +}; + +enum devm_ioremap_type { + DEVM_IOREMAP = 0, + DEVM_IOREMAP_UC = 1, + DEVM_IOREMAP_WC = 2, + DEVM_IOREMAP_NP = 3, +}; + +struct pcim_iomap_devres { + void *table[6]; +}; + +struct arch_io_reserve_memtype_wc_devres { + resource_size_t start; + resource_size_t size; +}; + +struct btree_head { + long unsigned int *node; + mempool_t *mempool; + int height; +}; + +struct btree_geo { + int keylen; + int no_pairs; + int no_longs; +}; + +typedef void (*visitor128_t)(void *, long unsigned int, u64, u64, size_t); + +typedef void (*visitorl_t)(void *, long unsigned int, long unsigned int, size_t); + +typedef void (*visitor32_t)(void *, long unsigned int, u32, size_t); + +typedef void (*visitor64_t)(void *, long unsigned int, u64, size_t); + +enum assoc_array_walk_status { + assoc_array_walk_tree_empty = 0, + assoc_array_walk_found_terminal_node = 1, + assoc_array_walk_found_wrong_shortcut = 2, +}; + +struct assoc_array_walk_result { + struct { + struct assoc_array_node *node; + int level; + int slot; + } terminal_node; + struct { + struct assoc_array_shortcut *shortcut; + int level; + int sc_level; + long unsigned int sc_segments; + long unsigned int dissimilarity; + } wrong_shortcut; +}; + +struct assoc_array_delete_collapse_context { + struct assoc_array_node *node; + const void *skip_leaf; + int slot; +}; + +struct linear_range { + unsigned int min; + unsigned int min_sel; + unsigned int max_sel; + unsigned int step; +}; + +enum packing_op { + PACK = 0, + UNPACK = 1, +}; + +struct xxh32_state { + uint32_t total_len_32; + uint32_t large_len; + uint32_t v1; + uint32_t v2; + uint32_t v3; + uint32_t v4; + uint32_t mem32[4]; + uint32_t memsize; +}; + +struct xxh64_state { + uint64_t total_len; + uint64_t v1; + uint64_t v2; + uint64_t v3; + uint64_t v4; + uint64_t mem64[4]; + uint32_t memsize; +}; + +struct gen_pool_chunk { + struct list_head next_chunk; + atomic_long_t avail; + phys_addr_t phys_addr; + void *owner; + long unsigned int start_addr; + long unsigned int end_addr; + long unsigned int bits[0]; +}; + +struct genpool_data_align { + int align; +}; + +struct genpool_data_fixed { + long unsigned int offset; +}; + +typedef struct { + unsigned char op; + unsigned char bits; + short unsigned int val; +} code; + +typedef enum { + HEAD = 0, + FLAGS = 1, + TIME = 2, + OS = 3, + EXLEN = 4, + EXTRA = 5, + NAME = 6, + COMMENT = 7, + HCRC = 8, + DICTID = 9, + DICT = 10, + TYPE = 11, + TYPEDO = 12, + STORED = 13, + COPY = 14, + TABLE = 15, + LENLENS = 16, + CODELENS = 17, + LEN = 18, + LENEXT = 19, + DIST = 20, + DISTEXT = 21, + MATCH = 22, + LIT = 23, + CHECK = 24, + LENGTH = 25, + DONE = 26, + BAD = 27, + MEM = 28, + SYNC = 29, +} inflate_mode; + +struct inflate_state { + inflate_mode mode; + int last; + int wrap; + int havedict; + int flags; + unsigned int dmax; + long unsigned int check; + long unsigned int total; + unsigned int wbits; + unsigned int wsize; + unsigned int whave; + unsigned int write; + unsigned char *window; + long unsigned int hold; + unsigned int bits; + unsigned int length; + unsigned int offset; + unsigned int extra; + const code *lencode; + const code *distcode; + unsigned int lenbits; + unsigned int distbits; + unsigned int ncode; + unsigned int nlen; + unsigned int ndist; + unsigned int have; + code *next; + short unsigned int lens[320]; + short unsigned int work[288]; + code codes[2048]; +}; + +union uu { + short unsigned int us; + unsigned char b[2]; +}; + +typedef unsigned int uInt; + +typedef enum { + CODES = 0, + LENS = 1, + DISTS = 2, +} codetype; + +struct inflate_workspace { + struct inflate_state inflate_state; + unsigned char working_window[32768]; +}; + +typedef unsigned char uch; + +typedef short unsigned int ush; + +typedef long unsigned int ulg; + +struct ct_data_s { + union { + ush freq; + ush code; + } fc; + union { + ush dad; + ush len; + } dl; +}; + +typedef struct ct_data_s ct_data; + +struct static_tree_desc_s { + const ct_data *static_tree; + const int *extra_bits; + int extra_base; + int elems; + int max_length; +}; + +typedef struct static_tree_desc_s static_tree_desc; + +struct tree_desc_s { + ct_data *dyn_tree; + int max_code; + static_tree_desc *stat_desc; +}; + +typedef ush Pos; + +typedef unsigned int IPos; + +struct deflate_state { + z_streamp strm; + int status; + Byte *pending_buf; + ulg pending_buf_size; + Byte *pending_out; + int pending; + int noheader; + Byte data_type; + Byte method; + int last_flush; + uInt w_size; + uInt w_bits; + uInt w_mask; + Byte *window; + ulg window_size; + Pos *prev; + Pos *head; + uInt ins_h; + uInt hash_size; + uInt hash_bits; + uInt hash_mask; + uInt hash_shift; + long int block_start; + uInt match_length; + IPos prev_match; + int match_available; + uInt strstart; + uInt match_start; + uInt lookahead; + uInt prev_length; + uInt max_chain_length; + uInt max_lazy_match; + int level; + int strategy; + uInt good_match; + int nice_match; + struct ct_data_s dyn_ltree[573]; + struct ct_data_s dyn_dtree[61]; + struct ct_data_s bl_tree[39]; + struct tree_desc_s l_desc; + struct tree_desc_s d_desc; + struct tree_desc_s bl_desc; + ush bl_count[16]; + int heap[573]; + int heap_len; + int heap_max; + uch depth[573]; + uch *l_buf; + uInt lit_bufsize; + uInt last_lit; + ush *d_buf; + ulg opt_len; + ulg static_len; + ulg compressed_len; + uInt matches; + int last_eob_len; + ush bi_buf; + int bi_valid; +}; + +typedef struct deflate_state deflate_state; + +typedef enum { + need_more = 0, + block_done = 1, + finish_started = 2, + finish_done = 3, +} block_state; + +typedef block_state (*compress_func)(deflate_state *, int); + +struct deflate_workspace { + deflate_state deflate_memory; + Byte *window_memory; + Pos *prev_memory; + Pos *head_memory; + char *overlay_memory; +}; + +typedef struct deflate_workspace deflate_workspace; + +struct config_s { + ush good_length; + ush max_lazy; + ush nice_length; + ush max_chain; + compress_func func; +}; + +typedef struct config_s config; + +typedef struct tree_desc_s tree_desc; + +typedef struct { + const uint8_t *externalDict; + size_t extDictSize; + const uint8_t *prefixEnd; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +typedef union { + long long unsigned int table[4]; + LZ4_streamDecode_t_internal internal_donotuse; +} LZ4_streamDecode_t; + +typedef uint8_t BYTE; + +typedef uint16_t U16; + +typedef uint32_t U32; + +typedef uint64_t U64; + +typedef uintptr_t uptrval; + +typedef enum { + noDict = 0, + withPrefix64k = 1, + usingExtDict = 2, +} dict_directive; + +typedef enum { + endOnOutputSize = 0, + endOnInputSize = 1, +} endCondition_directive; + +typedef enum { + decode_full_block = 0, + partial_decode = 1, +} earlyEnd_directive; + +typedef enum { + ZSTD_frame = 0, + ZSTD_skippableFrame = 1, +} ZSTD_frameType_e; + +typedef struct { + long long unsigned int frameContentSize; + long long unsigned int windowSize; + unsigned int blockSizeMax; + ZSTD_frameType_e frameType; + unsigned int headerSize; + unsigned int dictID; + unsigned int checksumFlag; +} ZSTD_frameHeader; + +typedef ZSTD_DCtx zstd_dctx; + +typedef ZSTD_frameHeader zstd_frame_header; + +typedef ZSTD_ErrorCode ERR_enum; + +typedef int16_t S16; + +typedef struct { + size_t bitContainer; + unsigned int bitsConsumed; + const char *ptr; + const char *start; + const char *limitPtr; +} BIT_DStream_t; + +typedef enum { + BIT_DStream_unfinished = 0, + BIT_DStream_endOfBuffer = 1, + BIT_DStream_completed = 2, + BIT_DStream_overflow = 3, +} BIT_DStream_status; + +typedef unsigned int FSE_DTable; + +typedef struct { + size_t state; + const void *table; +} FSE_DState_t; + +typedef struct { + U16 tableLog; + U16 fastMode; +} FSE_DTableHeader; + +typedef struct { + short unsigned int newState; + unsigned char symbol; + unsigned char nbBits; +} FSE_decode_t; + +typedef struct { + short int ncount[256]; + FSE_DTable dtable[1]; +} FSE_DecompressWksp; + +typedef U32 HUF_DTable; + +typedef struct { + BYTE maxTableLog; + BYTE tableType; + BYTE tableLog; + BYTE reserved; +} DTableDesc; + +typedef struct { + BYTE byte; + BYTE nbBits; +} HUF_DEltX1; + +typedef struct { + U32 rankVal[16]; + U32 rankStart[16]; + U32 statsWksp[218]; + BYTE symbols[256]; + BYTE huffWeight[256]; +} HUF_ReadDTableX1_Workspace; + +typedef struct { + U16 sequence; + BYTE nbBits; + BYTE length; +} HUF_DEltX2; + +typedef struct { + BYTE symbol; + BYTE weight; +} sortedSymbol_t; + +typedef U32 rankValCol_t[13]; + +typedef struct { + U32 rankVal[156]; + U32 rankStats[13]; + U32 rankStart0[14]; + sortedSymbol_t sortedSymbol[256]; + BYTE weightList[256]; + U32 calleeWksp[218]; +} HUF_ReadDTableX2_Workspace; + +typedef struct { + U32 tableTime; + U32 decode256Time; +} algo_time_t; + +typedef struct { + U16 nextState; + BYTE nbAdditionalBits; + BYTE nbBits; + U32 baseValue; +} ZSTD_seqSymbol; + +typedef struct { + ZSTD_seqSymbol LLTable[513]; + ZSTD_seqSymbol OFTable[257]; + ZSTD_seqSymbol MLTable[513]; + HUF_DTable hufTable[4097]; + U32 rep[3]; + U32 workspace[157]; +} ZSTD_entropyDTables_t; + +typedef enum { + bt_raw = 0, + bt_rle = 1, + bt_compressed = 2, + bt_reserved = 3, +} blockType_e; + +typedef enum { + ZSTDds_getFrameHeaderSize = 0, + ZSTDds_decodeFrameHeader = 1, + ZSTDds_decodeBlockHeader = 2, + ZSTDds_decompressBlock = 3, + ZSTDds_decompressLastBlock = 4, + ZSTDds_checkChecksum = 5, + ZSTDds_decodeSkippableHeader = 6, + ZSTDds_skipFrame = 7, +} ZSTD_dStage; + +typedef enum { + ZSTD_f_zstd1 = 0, + ZSTD_f_zstd1_magicless = 1, +} ZSTD_format_e; + +typedef enum { + ZSTD_d_validateChecksum = 0, + ZSTD_d_ignoreChecksum = 1, +} ZSTD_forceIgnoreChecksum_e; + +typedef enum { + ZSTD_use_indefinitely = 4294967295, + ZSTD_dont_use = 0, + ZSTD_use_once = 1, +} ZSTD_dictUses_e; + +struct ZSTD_DDict_s; + +typedef struct ZSTD_DDict_s ZSTD_DDict; + +typedef struct { + const ZSTD_DDict **ddictPtrTable; + size_t ddictPtrTableSize; + size_t ddictPtrCount; +} ZSTD_DDictHashSet; + +typedef enum { + ZSTD_rmd_refSingleDDict = 0, + ZSTD_rmd_refMultipleDDicts = 1, +} ZSTD_refMultipleDDicts_e; + +typedef enum { + zdss_init = 0, + zdss_loadHeader = 1, + zdss_read = 2, + zdss_load = 3, + zdss_flush = 4, +} ZSTD_dStreamStage; + +typedef enum { + ZSTD_bm_buffered = 0, + ZSTD_bm_stable = 1, +} ZSTD_bufferMode_e; + +struct ZSTD_DCtx_s___2 { + const ZSTD_seqSymbol *LLTptr; + const ZSTD_seqSymbol *MLTptr; + const ZSTD_seqSymbol *OFTptr; + const HUF_DTable *HUFptr; + ZSTD_entropyDTables_t entropy; + U32 workspace[640]; + const void *previousDstEnd; + const void *prefixStart; + const void *virtualStart; + const void *dictEnd; + size_t expected; + ZSTD_frameHeader fParams; + U64 processedCSize; + U64 decodedSize; + blockType_e bType; + ZSTD_dStage stage; + U32 litEntropy; + U32 fseEntropy; + struct xxh64_state xxhState; + size_t headerSize; + ZSTD_format_e format; + ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; + U32 validateChecksum; + const BYTE *litPtr; + ZSTD_customMem customMem; + size_t litSize; + size_t rleSize; + size_t staticSize; + int bmi2; + ZSTD_DDict *ddictLocal; + const ZSTD_DDict *ddict; + U32 dictID; + int ddictIsCold; + ZSTD_dictUses_e dictUses; + ZSTD_DDictHashSet *ddictSet; + ZSTD_refMultipleDDicts_e refMultipleDDicts; + ZSTD_dStreamStage streamStage; + char *inBuff; + size_t inBuffSize; + size_t inPos; + size_t maxWindowSize; + char *outBuff; + size_t outBuffSize; + size_t outStart; + size_t outEnd; + size_t lhSize; + void *legacyContext; + U32 previousLegacyVersion; + U32 legacyVersion; + U32 hostageByte; + int noForwardProgress; + ZSTD_bufferMode_e outBufferMode; + ZSTD_outBuffer expectedOutBuffer; + BYTE litBuffer[131104]; + BYTE headerBuffer[18]; + size_t oversizedDuration; +}; + +typedef struct ZSTD_DCtx_s___2 ZSTD_DCtx___2; + +struct ZSTD_DDict_s { + void *dictBuffer; + const void *dictContent; + size_t dictSize; + ZSTD_entropyDTables_t entropy; + U32 dictID; + U32 entropyPresent; + ZSTD_customMem cMem; +}; + +typedef enum { + ZSTD_dct_auto = 0, + ZSTD_dct_rawContent = 1, + ZSTD_dct_fullDict = 2, +} ZSTD_dictContentType_e; + +typedef enum { + ZSTD_dlm_byCopy = 0, + ZSTD_dlm_byRef = 1, +} ZSTD_dictLoadMethod_e; + +typedef struct { + U32 f1c; + U32 f1d; + U32 f7b; + U32 f7c; +} ZSTD_cpuid_t; + +typedef struct { + size_t error; + int lowerBound; + int upperBound; +} ZSTD_bounds; + +typedef enum { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3, +} ZSTD_ResetDirective; + +typedef enum { + ZSTD_d_windowLogMax = 100, + ZSTD_d_experimentalParam1 = 1000, + ZSTD_d_experimentalParam2 = 1001, + ZSTD_d_experimentalParam3 = 1002, + ZSTD_d_experimentalParam4 = 1003, +} ZSTD_dParameter; + +typedef ZSTD_DCtx___2 ZSTD_DStream___2; + +typedef enum { + ZSTDnit_frameHeader = 0, + ZSTDnit_blockHeader = 1, + ZSTDnit_block = 2, + ZSTDnit_lastBlock = 3, + ZSTDnit_checksum = 4, + ZSTDnit_skippableFrame = 5, +} ZSTD_nextInputType_e; + +typedef struct { + size_t compressedSize; + long long unsigned int decompressedBound; +} ZSTD_frameSizeInfo; + +typedef struct { + blockType_e blockType; + U32 lastBlock; + U32 origSize; +} blockProperties_t; + +typedef enum { + set_basic = 0, + set_rle = 1, + set_compressed = 2, + set_repeat = 3, +} symbolEncodingType_e; + +typedef enum { + ZSTD_no_overlap = 0, + ZSTD_overlap_src_before_dst = 1, +} ZSTD_overlap_e; + +typedef struct { + U32 fastMode; + U32 tableLog; +} ZSTD_seqSymbol_header; + +typedef struct { + size_t litLength; + size_t matchLength; + size_t offset; + const BYTE *match; +} seq_t; + +typedef struct { + size_t state; + const ZSTD_seqSymbol *table; +} ZSTD_fseState; + +typedef struct { + BIT_DStream_t DStream; + ZSTD_fseState stateLL; + ZSTD_fseState stateOffb; + ZSTD_fseState stateML; + size_t prevOffset[3]; + const BYTE *prefixStart; + const BYTE *dictEnd; + size_t pos; +} seqState_t; + +typedef enum { + ZSTD_lo_isRegularOffset = 0, + ZSTD_lo_isLongOffset = 1, +} ZSTD_longOffset_e; + +typedef enum { + ZSTD_p_noPrefetch = 0, + ZSTD_p_prefetch = 1, +} ZSTD_prefetch_e; + +typedef uint64_t vli_type; + +enum xz_check { + XZ_CHECK_NONE = 0, + XZ_CHECK_CRC32 = 1, + XZ_CHECK_CRC64 = 4, + XZ_CHECK_SHA256 = 10, +}; + +struct xz_dec_hash { + vli_type unpadded; + vli_type uncompressed; + uint32_t crc32; +}; + +struct xz_dec_lzma2; + +struct xz_dec_bcj; + +struct xz_dec___2 { + enum { + SEQ_STREAM_HEADER = 0, + SEQ_BLOCK_START = 1, + SEQ_BLOCK_HEADER = 2, + SEQ_BLOCK_UNCOMPRESS = 3, + SEQ_BLOCK_PADDING = 4, + SEQ_BLOCK_CHECK = 5, + SEQ_INDEX = 6, + SEQ_INDEX_PADDING = 7, + SEQ_INDEX_CRC32 = 8, + SEQ_STREAM_FOOTER = 9, + } sequence; + uint32_t pos; + vli_type vli; + size_t in_start; + size_t out_start; + uint32_t crc32; + enum xz_check check_type; + enum xz_mode mode; + bool allow_buf_error; + struct { + vli_type compressed; + vli_type uncompressed; + uint32_t size; + } block_header; + struct { + vli_type compressed; + vli_type uncompressed; + vli_type count; + struct xz_dec_hash hash; + } block; + struct { + enum { + SEQ_INDEX_COUNT = 0, + SEQ_INDEX_UNPADDED = 1, + SEQ_INDEX_UNCOMPRESSED = 2, + } sequence; + vli_type size; + vli_type count; + struct xz_dec_hash hash; + } index; + struct { + size_t pos; + size_t size; + uint8_t buf[1024]; + } temp; + struct xz_dec_lzma2 *lzma2; + struct xz_dec_bcj *bcj; + bool bcj_active; +}; + +enum lzma_state { + STATE_LIT_LIT = 0, + STATE_MATCH_LIT_LIT = 1, + STATE_REP_LIT_LIT = 2, + STATE_SHORTREP_LIT_LIT = 3, + STATE_MATCH_LIT = 4, + STATE_REP_LIT = 5, + STATE_SHORTREP_LIT = 6, + STATE_LIT_MATCH = 7, + STATE_LIT_LONGREP = 8, + STATE_LIT_SHORTREP = 9, + STATE_NONLIT_MATCH = 10, + STATE_NONLIT_REP = 11, +}; + +struct dictionary { + uint8_t *buf; + size_t start; + size_t pos; + size_t full; + size_t limit; + size_t end; + uint32_t size; + uint32_t size_max; + uint32_t allocated; + enum xz_mode mode; +}; + +struct rc_dec { + uint32_t range; + uint32_t code; + uint32_t init_bytes_left; + const uint8_t *in; + size_t in_pos; + size_t in_limit; +}; + +struct lzma_len_dec { + uint16_t choice; + uint16_t choice2; + uint16_t low[128]; + uint16_t mid[128]; + uint16_t high[256]; +}; + +struct lzma_dec { + uint32_t rep0; + uint32_t rep1; + uint32_t rep2; + uint32_t rep3; + enum lzma_state state; + uint32_t len; + uint32_t lc; + uint32_t literal_pos_mask; + uint32_t pos_mask; + uint16_t is_match[192]; + uint16_t is_rep[12]; + uint16_t is_rep0[12]; + uint16_t is_rep1[12]; + uint16_t is_rep2[12]; + uint16_t is_rep0_long[192]; + uint16_t dist_slot[256]; + uint16_t dist_special[114]; + uint16_t dist_align[16]; + struct lzma_len_dec match_len_dec; + struct lzma_len_dec rep_len_dec; + uint16_t literal[12288]; +}; + +enum lzma2_seq { + SEQ_CONTROL = 0, + SEQ_UNCOMPRESSED_1 = 1, + SEQ_UNCOMPRESSED_2 = 2, + SEQ_COMPRESSED_0 = 3, + SEQ_COMPRESSED_1 = 4, + SEQ_PROPERTIES = 5, + SEQ_LZMA_PREPARE = 6, + SEQ_LZMA_RUN = 7, + SEQ_COPY = 8, +}; + +struct lzma2_dec { + enum lzma2_seq sequence; + enum lzma2_seq next_sequence; + uint32_t uncompressed; + uint32_t compressed; + bool need_dict_reset; + bool need_props; +}; + +struct xz_dec_lzma2___2 { + struct rc_dec rc; + struct dictionary dict; + struct lzma2_dec lzma2; + struct lzma_dec lzma; + struct { + uint32_t size; + uint8_t buf[63]; + } temp; +}; + +struct xz_dec_bcj___2 { + enum { + BCJ_X86 = 4, + BCJ_POWERPC = 5, + BCJ_IA64 = 6, + BCJ_ARM = 7, + BCJ_ARMTHUMB = 8, + BCJ_SPARC = 9, + } type; + enum xz_ret ret; + bool single_call; + uint32_t pos; + uint32_t x86_prev_mask; + uint8_t *out; + size_t out_pos; + size_t out_size; + struct { + size_t filtered; + size_t size; + uint8_t buf[16]; + } temp; +}; + +struct ts_state { + unsigned int offset; + char cb[48]; +}; + +struct ts_config; + +struct ts_ops { + const char *name; + struct ts_config * (*init)(const void *, unsigned int, gfp_t, int); + unsigned int (*find)(struct ts_config *, struct ts_state *); + void (*destroy)(struct ts_config *); + void * (*get_pattern)(struct ts_config *); + unsigned int (*get_pattern_len)(struct ts_config *); + struct module *owner; + struct list_head list; +}; + +struct ts_config { + struct ts_ops *ops; + int flags; + unsigned int (*get_next_block)(unsigned int, const u8 **, struct ts_config *, struct ts_state *); + void (*finish)(struct ts_config *, struct ts_state *); +}; + +struct ts_linear_state { + unsigned int len; + const void *data; +}; + +struct ei_entry { + struct list_head list; + long unsigned int start_addr; + long unsigned int end_addr; + int etype; + void *priv; +}; + +struct ddebug_table { + struct list_head link; + const char *mod_name; + unsigned int num_ddebugs; + struct _ddebug *ddebugs; +}; + +struct ddebug_query { + const char *filename; + const char *module; + const char *function; + const char *format; + unsigned int first_lineno; + unsigned int last_lineno; +}; + +struct ddebug_iter { + struct ddebug_table *table; + unsigned int idx; +}; + +struct flag_settings { + unsigned int flags; + unsigned int mask; +}; + +struct flagsbuf { + char buf[7]; +}; + +struct nla_bitfield32 { + __u32 value; + __u32 selector; +}; + +enum nla_policy_validation { + NLA_VALIDATE_NONE = 0, + NLA_VALIDATE_RANGE = 1, + NLA_VALIDATE_RANGE_WARN_TOO_LONG = 2, + NLA_VALIDATE_MIN = 3, + NLA_VALIDATE_MAX = 4, + NLA_VALIDATE_MASK = 5, + NLA_VALIDATE_RANGE_PTR = 6, + NLA_VALIDATE_FUNCTION = 7, +}; + +enum netlink_validation { + NL_VALIDATE_LIBERAL = 0, + NL_VALIDATE_TRAILING = 1, + NL_VALIDATE_MAXTYPE = 2, + NL_VALIDATE_UNSPEC = 4, + NL_VALIDATE_STRICT_ATTRS = 8, + NL_VALIDATE_NESTED = 16, +}; + +struct cpu_rmap { + struct kref refcount; + u16 size; + u16 used; + void **obj; + struct { + u16 index; + u16 dist; + } near[0]; +}; + +struct irq_glue { + struct irq_affinity_notify notify; + struct cpu_rmap *rmap; + u16 index; +}; + +typedef mpi_limb_t *mpi_ptr_t; + +typedef int mpi_size_t; + +typedef mpi_limb_t UWtype; + +typedef unsigned int UHWtype; + +enum gcry_mpi_constants { + MPI_C_ZERO = 0, + MPI_C_ONE = 1, + MPI_C_TWO = 2, + MPI_C_THREE = 3, + MPI_C_FOUR = 4, + MPI_C_EIGHT = 5, +}; + +struct barrett_ctx_s; + +typedef struct barrett_ctx_s *mpi_barrett_t; + +struct gcry_mpi_point { + MPI x; + MPI y; + MPI z; +}; + +typedef struct gcry_mpi_point *MPI_POINT; + +enum gcry_mpi_ec_models { + MPI_EC_WEIERSTRASS = 0, + MPI_EC_MONTGOMERY = 1, + MPI_EC_EDWARDS = 2, +}; + +enum ecc_dialects { + ECC_DIALECT_STANDARD = 0, + ECC_DIALECT_ED25519 = 1, + ECC_DIALECT_SAFECURVE = 2, +}; + +struct mpi_ec_ctx { + enum gcry_mpi_ec_models model; + enum ecc_dialects dialect; + int flags; + unsigned int nbits; + MPI p; + MPI a; + MPI b; + MPI_POINT G; + MPI n; + unsigned int h; + MPI_POINT Q; + MPI d; + const char *name; + struct { + struct { + unsigned int a_is_pminus3: 1; + unsigned int two_inv_p: 1; + } valid; + int a_is_pminus3; + MPI two_inv_p; + mpi_barrett_t p_barrett; + MPI scratch[11]; + } t; + void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); + void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); +}; + +struct field_table { + const char *p; + void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); + void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); +}; + +enum gcry_mpi_format { + GCRYMPI_FMT_NONE = 0, + GCRYMPI_FMT_STD = 1, + GCRYMPI_FMT_PGP = 2, + GCRYMPI_FMT_SSH = 3, + GCRYMPI_FMT_HEX = 4, + GCRYMPI_FMT_USG = 5, + GCRYMPI_FMT_OPAQUE = 8, +}; + +struct barrett_ctx_s___2; + +typedef struct barrett_ctx_s___2 *mpi_barrett_t___2; + +struct barrett_ctx_s___2 { + MPI m; + int m_copied; + int k; + MPI y; + MPI r1; + MPI r2; + MPI r3; +}; + +struct karatsuba_ctx { + struct karatsuba_ctx *next; + mpi_ptr_t tspace; + mpi_size_t tspace_size; + mpi_ptr_t tp; + mpi_size_t tp_size; +}; + +typedef long int mpi_limb_signed_t; + +enum dim_tune_state { + DIM_PARKING_ON_TOP = 0, + DIM_PARKING_TIRED = 1, + DIM_GOING_RIGHT = 2, + DIM_GOING_LEFT = 3, +}; + +struct dim_cq_moder { + u16 usec; + u16 pkts; + u16 comps; + u8 cq_period_mode; +}; + +enum dim_cq_period_mode { + DIM_CQ_PERIOD_MODE_START_FROM_EQE = 0, + DIM_CQ_PERIOD_MODE_START_FROM_CQE = 1, + DIM_CQ_PERIOD_NUM_MODES = 2, +}; + +enum dim_state { + DIM_START_MEASURE = 0, + DIM_MEASURE_IN_PROGRESS = 1, + DIM_APPLY_NEW_PROFILE = 2, +}; + +enum dim_stats_state { + DIM_STATS_WORSE = 0, + DIM_STATS_SAME = 1, + DIM_STATS_BETTER = 2, +}; + +enum dim_step_result { + DIM_STEPPED = 0, + DIM_TOO_TIRED = 1, + DIM_ON_EDGE = 2, +}; + +enum pubkey_algo { + PUBKEY_ALGO_RSA = 0, + PUBKEY_ALGO_MAX = 1, +}; + +struct pubkey_hdr { + uint8_t version; + uint32_t timestamp; + uint8_t algo; + uint8_t nmpi; + char mpi[0]; +} __attribute__((packed)); + +struct signature_hdr { + uint8_t version; + uint32_t timestamp; + uint8_t algo; + uint8_t hash; + uint8_t keyid[8]; + uint8_t nmpi; + char mpi[0]; +} __attribute__((packed)); + +struct sg_splitter { + struct scatterlist *in_sg0; + int nents; + off_t skip_sg0; + unsigned int length_last_sg; + struct scatterlist *out_sg; +}; + +struct sg_pool { + size_t size; + char *name; + struct kmem_cache *slab; + mempool_t *pool; +}; + +enum { + IRQ_POLL_F_SCHED = 0, + IRQ_POLL_F_DISABLE = 1, +}; + +struct font_desc { + int idx; + const char *name; + unsigned int width; + unsigned int height; + unsigned int charcount; + const void *data; + int pref; +}; + +struct font_data { + unsigned int extra[4]; + const unsigned char data[0]; +}; + +struct firmware { + size_t size; + const u8 *data; + void *priv; +}; + +struct pldmfw_record { + struct list_head entry; + struct list_head descs; + const u8 *version_string; + u8 version_type; + u8 version_len; + u16 package_data_len; + u32 device_update_flags; + const u8 *package_data; + long unsigned int *component_bitmap; + u16 component_bitmap_len; +}; + +struct pldmfw_desc_tlv { + struct list_head entry; + const u8 *data; + u16 type; + u16 size; +}; + +struct pldmfw_component { + struct list_head entry; + u16 classification; + u16 identifier; + u16 options; + u16 activation_method; + u32 comparison_stamp; + u32 component_size; + const u8 *component_data; + const u8 *version_string; + u8 version_type; + u8 version_len; + u8 index; +}; + +struct pldmfw_ops; + +struct pldmfw { + const struct pldmfw_ops *ops; + struct device *dev; +}; + +struct pldmfw_ops { + bool (*match_record)(struct pldmfw *, struct pldmfw_record *); + int (*send_package_data)(struct pldmfw *, const u8 *, u16); + int (*send_component_table)(struct pldmfw *, struct pldmfw_component *, u8); + int (*flash_component)(struct pldmfw *, struct pldmfw_component *); + int (*finalize_update)(struct pldmfw *); +}; + +struct __pldm_timestamp { + u8 b[13]; +}; + +struct __pldm_header { + uuid_t id; + u8 revision; + __le16 size; + struct __pldm_timestamp release_date; + __le16 component_bitmap_len; + u8 version_type; + u8 version_len; + u8 version_string[0]; +} __attribute__((packed)); + +struct __pldmfw_record_info { + __le16 record_len; + u8 descriptor_count; + __le32 device_update_flags; + u8 version_type; + u8 version_len; + __le16 package_data_len; + u8 variable_record_data[0]; +} __attribute__((packed)); + +struct __pldmfw_desc_tlv { + __le16 type; + __le16 size; + u8 data[0]; +}; + +struct __pldmfw_record_area { + u8 record_count; + u8 records[0]; +}; + +struct __pldmfw_component_info { + __le16 classification; + __le16 identifier; + __le32 comparison_stamp; + __le16 options; + __le16 activation_method; + __le32 location_offset; + __le32 size; + u8 version_type; + u8 version_len; + u8 version_string[0]; +} __attribute__((packed)); + +struct __pldmfw_component_area { + __le16 component_image_count; + u8 components[0]; +}; + +struct pldmfw_priv { + struct pldmfw *context; + const struct firmware *fw; + size_t offset; + struct list_head records; + struct list_head components; + const struct __pldm_header *header; + u16 total_header_size; + u16 component_bitmap_len; + u16 bitmap_size; + u16 component_count; + const u8 *component_start; + const u8 *record_start; + u8 record_count; + u32 header_crc; + struct pldmfw_record *matching_record; +}; + +struct pldm_pci_record_id { + int vendor; + int device; + int subsystem_vendor; + int subsystem_device; +}; + +typedef long unsigned int cycles_t; + +enum aarch64_insn_prfm_type { + AARCH64_INSN_PRFM_TYPE_PLD = 0, + AARCH64_INSN_PRFM_TYPE_PLI = 1, + AARCH64_INSN_PRFM_TYPE_PST = 2, +}; + +enum aarch64_insn_prfm_target { + AARCH64_INSN_PRFM_TARGET_L1 = 0, + AARCH64_INSN_PRFM_TARGET_L2 = 1, + AARCH64_INSN_PRFM_TARGET_L3 = 2, +}; + +enum aarch64_insn_prfm_policy { + AARCH64_INSN_PRFM_POLICY_KEEP = 0, + AARCH64_INSN_PRFM_POLICY_STRM = 1, +}; + +struct warn_args___2; + +struct compress_format { + unsigned char magic[2]; + const char *name; + decompress_fn decompressor; +}; + +struct group_data { + int limit[21]; + int base[20]; + int permute[258]; + int minLen; + int maxLen; +}; + +struct bunzip_data { + int writeCopies; + int writePos; + int writeRunCountdown; + int writeCount; + int writeCurrent; + long int (*fill)(void *, long unsigned int); + long int inbufCount; + long int inbufPos; + unsigned char *inbuf; + unsigned int inbufBitCount; + unsigned int inbufBits; + unsigned int crc32Table[256]; + unsigned int headerCRC; + unsigned int totalCRC; + unsigned int writeCRC; + unsigned int *dbuf; + unsigned int dbufSize; + unsigned char selectors[32768]; + struct group_data groups[6]; + int io_error; + int byteCount[256]; + unsigned char symToByte[256]; + unsigned char mtfSymbol[256]; +}; + +struct rc { + long int (*fill)(void *, long unsigned int); + uint8_t *ptr; + uint8_t *buffer; + uint8_t *buffer_end; + long int buffer_size; + uint32_t code; + uint32_t range; + uint32_t bound; + void (*error)(char *); +}; + +struct lzma_header { + uint8_t pos; + uint32_t dict_size; + uint64_t dst_size; +} __attribute__((packed)); + +struct writer { + uint8_t *buffer; + uint8_t previous_byte; + size_t buffer_pos; + int bufsize; + size_t global_pos; + long int (*flush)(void *, long unsigned int); + struct lzma_header *header; +}; + +struct cstate { + int state; + uint32_t rep0; + uint32_t rep1; + uint32_t rep2; + uint32_t rep3; +}; + +struct cpio_data { + void *data; + size_t size; + char name[18]; +}; + +enum cpio_fields { + C_MAGIC = 0, + C_INO = 1, + C_MODE = 2, + C_UID = 3, + C_GID = 4, + C_NLINK = 5, + C_MTIME = 6, + C_FILESIZE = 7, + C_MAJ = 8, + C_MIN = 9, + C_RMAJ = 10, + C_RMIN = 11, + C_NAMESIZE = 12, + C_CHKSUM = 13, + C_NFIELDS = 14, +}; + +enum { + ASSUME_PERFECT = 255, + ASSUME_VALID_DTB = 1, + ASSUME_VALID_INPUT = 2, + ASSUME_LATEST = 4, + ASSUME_NO_ROLLBACK = 8, + ASSUME_LIBFDT_ORDER = 16, + ASSUME_LIBFDT_FLAWLESS = 32, +}; + +struct fdt_reserve_entry { + fdt64_t address; + fdt64_t size; +}; + +struct fdt_node_header { + fdt32_t tag; + char name[0]; +}; + +struct fdt_property { + fdt32_t tag; + fdt32_t len; + fdt32_t nameoff; + char data[0]; +}; + +struct fdt_errtabent { + const char *str; +}; + +struct fprop_local_single { + long unsigned int events; + unsigned int period; + raw_spinlock_t lock; +}; + +struct ida_bitmap { + long unsigned int bitmap[16]; +}; + +struct klist_waiter { + struct list_head list; + struct klist_node *node; + struct task_struct *process; + int woken; +}; + +struct uevent_sock { + struct list_head list; + struct sock *sk; +}; + +enum { + LOGIC_PIO_INDIRECT = 0, + LOGIC_PIO_CPU_MMIO = 1, +}; + +struct logic_pio_host_ops; + +struct logic_pio_hwaddr { + struct list_head list; + struct fwnode_handle *fwnode; + resource_size_t hw_start; + resource_size_t io_start; + resource_size_t size; + long unsigned int flags; + void *hostdata; + const struct logic_pio_host_ops *ops; +}; + +struct logic_pio_host_ops { + u32 (*in)(void *, long unsigned int, size_t); + void (*out)(void *, long unsigned int, u32, size_t); + u32 (*ins)(void *, long unsigned int, void *, size_t, unsigned int); + void (*outs)(void *, long unsigned int, const void *, size_t, unsigned int); +}; + +typedef struct { + long unsigned int key[2]; +} hsiphash_key_t; + +struct clk_core; + +struct clk { + struct clk_core *core; + struct device *dev; + const char *dev_id; + const char *con_id; + long unsigned int min_rate; + long unsigned int max_rate; + unsigned int exclusive_count; + struct hlist_node clks_node; +}; + +enum format_type { + FORMAT_TYPE_NONE = 0, + FORMAT_TYPE_WIDTH = 1, + FORMAT_TYPE_PRECISION = 2, + FORMAT_TYPE_CHAR = 3, + FORMAT_TYPE_STR = 4, + FORMAT_TYPE_PTR = 5, + FORMAT_TYPE_PERCENT_CHAR = 6, + FORMAT_TYPE_INVALID = 7, + FORMAT_TYPE_LONG_LONG = 8, + FORMAT_TYPE_ULONG = 9, + FORMAT_TYPE_LONG = 10, + FORMAT_TYPE_UBYTE = 11, + FORMAT_TYPE_BYTE = 12, + FORMAT_TYPE_USHORT = 13, + FORMAT_TYPE_SHORT = 14, + FORMAT_TYPE_UINT = 15, + FORMAT_TYPE_INT = 16, + FORMAT_TYPE_SIZE_T = 17, + FORMAT_TYPE_PTRDIFF = 18, +}; + +struct printf_spec { + unsigned int type: 8; + int field_width: 24; + unsigned int flags: 8; + unsigned int base: 8; + int precision: 16; +}; + +struct page_flags_fields { + int width; + int shift; + int mask; + const struct printf_spec *spec; + const char *name; +}; + +struct minmax_sample { + u32 t; + u32 v; +}; + +struct minmax { + struct minmax_sample s[3]; +}; + +struct acpi_probe_entry; + +typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *, struct acpi_probe_entry *); + +struct acpi_probe_entry { + __u8 id[5]; + __u8 type; + acpi_probe_entry_validate_subtbl subtable_valid; + union { + acpi_tbl_table_handler probe_table; + acpi_tbl_entry_handler probe_subtbl; + }; + kernel_ulong_t driver_data; +}; + +typedef int (*of_irq_init_cb_t)(struct device_node *, struct device_node *); + +typedef int (*of_init_fn_2)(struct device_node *, struct device_node *); + +enum al_fic_state { + AL_FIC_UNCONFIGURED = 0, + AL_FIC_CONFIGURED_LEVEL = 1, + AL_FIC_CONFIGURED_RISING_EDGE = 2, +}; + +struct al_fic { + void *base; + struct irq_domain *domain; + const char *name; + unsigned int parent_irq; + enum al_fic_state state; +}; + +struct armctrl_ic { + void *base; + void *pending[3]; + void *enable[3]; + void *disable[3]; + struct irq_domain *domain; +}; + +struct bcm2836_arm_irqchip_intc { + struct irq_domain *domain; + void *base; +}; + +struct owl_sirq_params { + bool reg_shared; + u16 reg_offset[3]; +}; + +struct owl_sirq_chip_data { + const struct owl_sirq_params *params; + void *base; + raw_spinlock_t lock; + u32 ext_irqs[3]; +}; + +struct tegra_ictlr_soc { + unsigned int num_ictlrs; +}; + +struct tegra_ictlr_info { + void *base[6]; + u32 cop_ier[6]; + u32 cop_iep[6]; + u32 cpu_ier[6]; + u32 cpu_iep[6]; + u32 ictlr_wake_mask[6]; +}; + +struct sun4i_irq_chip_data { + void *irq_base; + struct irq_domain *irq_domain; + u32 enable_reg_offset; + u32 mask_reg_offset; +}; + +struct sun6i_r_intc_variant { + u32 first_mux_irq; + u32 nr_mux_irqs; + u32 mux_valid[4]; +}; + +enum { + SUNXI_SRC_TYPE_LEVEL_LOW = 0, + SUNXI_SRC_TYPE_EDGE_FALLING = 1, + SUNXI_SRC_TYPE_LEVEL_HIGH = 2, + SUNXI_SRC_TYPE_EDGE_RISING = 3, +}; + +struct sunxi_sc_nmi_reg_offs { + u32 ctrl; + u32 pend; + u32 enable; +}; + +struct acpi_madt_generic_distributor { + struct acpi_subtable_header header; + u16 reserved; + u32 gic_id; + u64 base_address; + u32 global_irq_base; + u8 version; + u8 reserved2[3]; +}; + +enum acpi_madt_gic_version { + ACPI_MADT_GIC_VERSION_NONE = 0, + ACPI_MADT_GIC_VERSION_V1 = 1, + ACPI_MADT_GIC_VERSION_V2 = 2, + ACPI_MADT_GIC_VERSION_V3 = 3, + ACPI_MADT_GIC_VERSION_V4 = 4, + ACPI_MADT_GIC_VERSION_RESERVED = 5, +}; + +enum acpi_irq_model_id { + ACPI_IRQ_MODEL_PIC = 0, + ACPI_IRQ_MODEL_IOAPIC = 1, + ACPI_IRQ_MODEL_IOSAPIC = 2, + ACPI_IRQ_MODEL_PLATFORM = 3, + ACPI_IRQ_MODEL_GIC = 4, + ACPI_IRQ_MODEL_COUNT = 5, +}; + +struct gic_quirk { + const char *desc; + const char *compatible; + bool (*init)(void *); + u32 iidr; + u32 mask; +}; + +union gic_base { + void *common_base; + void **percpu_base; +}; + +struct gic_chip_data { + struct irq_chip chip; + union gic_base dist_base; + union gic_base cpu_base; + void *raw_dist_base; + void *raw_cpu_base; + u32 percpu_offset; + u32 saved_spi_enable[32]; + u32 saved_spi_active[32]; + u32 saved_spi_conf[64]; + u32 saved_spi_target[255]; + u32 *saved_ppi_enable; + u32 *saved_ppi_active; + u32 *saved_ppi_conf; + struct irq_domain *domain; + unsigned int gic_irqs; +}; + +struct clk_bulk_data { + const char *id; + struct clk *clk; +}; + +struct gic_clk_data { + unsigned int num_clocks; + const char * const *clocks; +}; + +struct gic_chip_data___2; + +struct gic_chip_pm { + struct gic_chip_data___2 *chip_data; + const struct gic_clk_data *clk_data; + struct clk_bulk_data *clks; +}; + +struct acpi_table_madt { + struct acpi_table_header header; + u32 address; + u32 flags; +}; + +struct acpi_madt_generic_msi_frame { + struct acpi_subtable_header header; + u16 reserved; + u32 msi_frame_id; + u64 base_address; + u32 flags; + u16 spi_count; + u16 spi_base; +}; + +struct v2m_data { + struct list_head entry; + struct fwnode_handle *fwnode; + struct resource res; + void *base; + u32 spi_start; + u32 nr_spis; + u32 spi_offset; + long unsigned int *bm; + u32 flags; +}; + +struct acpi_madt_generic_redistributor { + struct acpi_subtable_header header; + u16 reserved; + u64 base_address; + u32 length; +} __attribute__((packed)); + +struct rdists { + struct { + raw_spinlock_t rd_lock; + void *rd_base; + struct page *pend_page; + phys_addr_t phys_base; + bool lpi_enabled; + cpumask_t *vpe_table_mask; + void *vpe_l1_base; + } *rdist; + phys_addr_t prop_table_pa; + void *prop_table_va; + u64 flags; + u32 gicd_typer; + u32 gicd_typer2; + bool has_vlpis; + bool has_rvpeid; + bool has_direct_lpi; + bool has_vpend_valid_dirty; +}; + +struct partition_affinity { + cpumask_t mask; + void *partition_id; +}; + +struct redist_region { + void *redist_base; + phys_addr_t phys_base; + bool single_redist; +}; + +struct partition_desc; + +struct gic_chip_data___3 { + struct fwnode_handle *fwnode; + void *dist_base; + struct redist_region *redist_regions; + struct rdists rdists; + struct irq_domain *domain; + u64 redist_stride; + u32 nr_redist_regions; + u64 flags; + bool has_rss; + unsigned int ppi_nr; + struct partition_desc **ppi_descs; +}; + +enum gic_intid_range { + SGI_RANGE = 0, + PPI_RANGE = 1, + SPI_RANGE = 2, + EPPI_RANGE = 3, + ESPI_RANGE = 4, + LPI_RANGE = 5, + __INVALID_RANGE__ = 6, +}; + +struct mbi_range { + u32 spi_start; + u32 nr_spis; + long unsigned int *bm; +}; + +struct acpi_madt_generic_translator { + struct acpi_subtable_header header; + u16 reserved; + u32 translation_id; + u64 base_address; + u32 reserved2; +} __attribute__((packed)); + +struct acpi_srat_gic_its_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u16 reserved; + u32 its_id; +} __attribute__((packed)); + +enum its_vcpu_info_cmd_type { + MAP_VLPI = 0, + GET_VLPI = 1, + PROP_UPDATE_VLPI = 2, + PROP_UPDATE_AND_INV_VLPI = 3, + SCHEDULE_VPE = 4, + DESCHEDULE_VPE = 5, + COMMIT_VPE = 6, + INVALL_VPE = 7, + PROP_UPDATE_VSGI = 8, +}; + +struct its_cmd_info { + enum its_vcpu_info_cmd_type cmd_type; + union { + struct its_vlpi_map *map; + u8 config; + bool req_db; + struct { + bool g0en; + bool g1en; + }; + struct { + u8 priority; + bool group; + }; + }; +}; + +struct its_collection___2 { + u64 target_address; + u16 col_id; +}; + +struct its_baser { + void *base; + u64 val; + u32 order; + u32 psz; +}; + +struct its_cmd_block; + +struct its_device___2; + +struct its_node { + raw_spinlock_t lock; + struct mutex dev_alloc_lock; + struct list_head entry; + void *base; + void *sgir_base; + phys_addr_t phys_base; + struct its_cmd_block *cmd_base; + struct its_cmd_block *cmd_write; + struct its_baser tables[8]; + struct its_collection___2 *collections; + struct fwnode_handle *fwnode_handle; + u64 (*get_msi_base)(struct its_device___2 *); + u64 typer; + u64 cbaser_save; + u32 ctlr_save; + u32 mpidr; + struct list_head its_device_list; + u64 flags; + long unsigned int list_nr; + int numa_node; + unsigned int msi_domain_flags; + u32 pre_its_base; + int vlpi_redist_offset; +}; + +struct its_cmd_block { + union { + u64 raw_cmd[4]; + __le64 raw_cmd_le[4]; + }; +}; + +struct event_lpi_map { + long unsigned int *lpi_map; + u16 *col_map; + irq_hw_number_t lpi_base; + int nr_lpis; + raw_spinlock_t vlpi_lock; + struct its_vm *vm; + struct its_vlpi_map *vlpi_maps; + int nr_vlpis; +}; + +struct its_device___2 { + struct list_head entry; + struct its_node *its; + struct event_lpi_map event_map; + void *itt; + u32 nr_ites; + u32 device_id; + bool shared; +}; + +struct cpu_lpi_count { + atomic_t managed; + atomic_t unmanaged; +}; + +struct its_cmd_desc { + union { + struct { + struct its_device___2 *dev; + u32 event_id; + } its_inv_cmd; + struct { + struct its_device___2 *dev; + u32 event_id; + } its_clear_cmd; + struct { + struct its_device___2 *dev; + u32 event_id; + } its_int_cmd; + struct { + struct its_device___2 *dev; + int valid; + } its_mapd_cmd; + struct { + struct its_collection___2 *col; + int valid; + } its_mapc_cmd; + struct { + struct its_device___2 *dev; + u32 phys_id; + u32 event_id; + } its_mapti_cmd; + struct { + struct its_device___2 *dev; + struct its_collection___2 *col; + u32 event_id; + } its_movi_cmd; + struct { + struct its_device___2 *dev; + u32 event_id; + } its_discard_cmd; + struct { + struct its_collection___2 *col; + } its_invall_cmd; + struct { + struct its_vpe *vpe; + } its_vinvall_cmd; + struct { + struct its_vpe *vpe; + struct its_collection___2 *col; + bool valid; + } its_vmapp_cmd; + struct { + struct its_vpe *vpe; + struct its_device___2 *dev; + u32 virt_id; + u32 event_id; + bool db_enabled; + } its_vmapti_cmd; + struct { + struct its_vpe *vpe; + struct its_device___2 *dev; + u32 event_id; + bool db_enabled; + } its_vmovi_cmd; + struct { + struct its_vpe *vpe; + struct its_collection___2 *col; + u16 seq_num; + u16 its_list; + } its_vmovp_cmd; + struct { + struct its_vpe *vpe; + } its_invdb_cmd; + struct { + struct its_vpe *vpe; + u8 sgi; + u8 priority; + bool enable; + bool group; + bool clear; + } its_vsgi_cmd; + }; +}; + +typedef struct its_collection___2 * (*its_cmd_builder_t)(struct its_node *, struct its_cmd_block *, struct its_cmd_desc *); + +typedef struct its_vpe * (*its_cmd_vbuilder_t)(struct its_node *, struct its_cmd_block *, struct its_cmd_desc *); + +struct lpi_range { + struct list_head entry; + u32 base_id; + u32 span; +}; + +struct its_srat_map { + u32 numa_node; + u32 its_id; +}; + +enum device_link_state { + DL_STATE_NONE = 4294967295, + DL_STATE_DORMANT = 0, + DL_STATE_AVAILABLE = 1, + DL_STATE_CONSUMER_PROBE = 2, + DL_STATE_ACTIVE = 3, + DL_STATE_SUPPLIER_UNBIND = 4, +}; + +struct device_link { + struct device *supplier; + struct list_head s_node; + struct device *consumer; + struct list_head c_node; + struct device link_dev; + enum device_link_state status; + u32 flags; + refcount_t rpm_active; + struct kref kref; + struct work_struct rm_work; + bool supplier_preactivated; +}; + +struct fsl_mc_obj_desc { + char type[16]; + int id; + u16 vendor; + u16 ver_major; + u16 ver_minor; + u8 irq_count; + u8 region_count; + u32 state; + char label[16]; + u16 flags; +}; + +struct fsl_mc_io; + +struct fsl_mc_device_irq; + +struct fsl_mc_resource; + +struct fsl_mc_device { + struct device dev; + u64 dma_mask; + u16 flags; + u32 icid; + u16 mc_handle; + struct fsl_mc_io *mc_io; + struct fsl_mc_obj_desc obj_desc; + struct resource *regions; + struct fsl_mc_device_irq **irqs; + struct fsl_mc_resource *resource; + struct device_link *consumer_link; + char *driver_override; +}; + +enum fsl_mc_pool_type { + FSL_MC_POOL_DPMCP = 0, + FSL_MC_POOL_DPBP = 1, + FSL_MC_POOL_DPCON = 2, + FSL_MC_POOL_IRQ = 3, + FSL_MC_NUM_POOL_TYPES = 4, +}; + +struct fsl_mc_resource_pool; + +struct fsl_mc_resource { + enum fsl_mc_pool_type type; + s32 id; + void *data; + struct fsl_mc_resource_pool *parent_pool; + struct list_head node; +}; + +struct fsl_mc_device_irq { + struct msi_desc *msi_desc; + struct fsl_mc_device *mc_dev; + u8 dev_irq_index; + struct fsl_mc_resource resource; +}; + +struct fsl_mc_io { + struct device *dev; + u16 flags; + u32 portal_size; + phys_addr_t portal_phys_addr; + void *portal_virt_addr; + struct fsl_mc_device *dpmcp_dev; + union { + struct mutex mutex; + raw_spinlock_t spinlock; + }; +}; + +struct partition_desc___2 { + int nr_parts; + struct partition_affinity *parts; + struct irq_domain *domain; + struct irq_desc *chained_desc; + long unsigned int *bitmap; + struct irq_domain_ops ops; +}; + +typedef void (*irq_write_msi_msg_t)(struct msi_desc *, struct msi_msg *); + +struct mbigen_device { + struct platform_device *pdev; + void *base; +}; + +struct irqc_priv; + +struct irqc_irq { + int hw_irq; + int requested_irq; + struct irqc_priv *p; +}; + +struct irqc_priv { + void *iomem; + void *cpu_int_base; + struct irqc_irq irq[32]; + unsigned int number_of_irqs; + struct device *dev; + struct irq_chip_generic *gc; + struct irq_domain *irq_domain; + atomic_t wakeup_path; +}; + +struct xintc_irq_chip { + void *base; + struct irq_domain *root_domain; + u32 intr_mask; + u32 nr_irq; +}; + +struct bcm7038_l1_cpu; + +struct bcm7038_l1_chip { + raw_spinlock_t lock; + unsigned int n_words; + struct irq_domain *domain; + struct bcm7038_l1_cpu *cpus[256]; + struct list_head list; + u32 wake_mask[8]; + u32 irq_fwd_mask[8]; + u8 affinity[256]; +}; + +struct bcm7038_l1_cpu { + void *map_base; + u32 mask_cache[0]; +}; + +struct bcm7120_l2_intc_data; + +struct bcm7120_l1_intc_data { + struct bcm7120_l2_intc_data *b; + u32 irq_map_mask[4]; +}; + +struct bcm7120_l2_intc_data { + unsigned int n_words; + void *map_base[8]; + void *pair_base[4]; + int en_offset[4]; + int stat_offset[4]; + struct irq_domain *domain; + bool can_wake; + u32 irq_fwd_mask[4]; + struct bcm7120_l1_intc_data *l1_data; + int num_parent_irqs; + const __be32 *map_mask_prop; +}; + +struct brcmstb_intc_init_params { + irq_flow_handler_t handler; + int cpu_status; + int cpu_clear; + int cpu_mask_status; + int cpu_mask_set; + int cpu_mask_clear; +}; + +struct brcmstb_l2_intc_data { + struct irq_domain *domain; + struct irq_chip_generic *gc; + int status_offset; + int mask_offset; + bool can_wake; + u32 saved_mask; +}; + +struct mtk_sysirq_chip_data { + raw_spinlock_t lock; + u32 nr_intpol_bases; + void **intpol_bases; + u32 *intpol_words; + u8 *intpol_idx; + u16 *which_word; +}; + +struct mtk_cirq_chip_data { + void *base; + unsigned int ext_irq_start; + unsigned int ext_irq_end; + struct irq_domain *domain; +}; + +struct gpcv2_irqchip_data { + struct raw_spinlock rlock; + void *gpc_base; + u32 wakeup_sources[4]; + u32 saved_irq_mask[4]; + u32 cpu2wakeup; +}; + +struct mvebu_gicp_spi_range { + unsigned int start; + unsigned int count; +}; + +struct mvebu_gicp { + struct mvebu_gicp_spi_range *spi_ranges; + unsigned int spi_ranges_cnt; + unsigned int spi_cnt; + long unsigned int *spi_bitmap; + spinlock_t spi_lock; + struct resource *res; + struct device *dev; +}; + +struct mvebu_icu_subset_data { + unsigned int icu_group; + unsigned int offset_set_ah; + unsigned int offset_set_al; + unsigned int offset_clr_ah; + unsigned int offset_clr_al; +}; + +struct mvebu_icu { + void *base; + struct device *dev; +}; + +struct mvebu_icu_msi_data { + struct mvebu_icu *icu; + atomic_t initialized; + const struct mvebu_icu_subset_data *subset_data; +}; + +struct mvebu_icu_irq_data { + struct mvebu_icu *icu; + unsigned int icu_group; + unsigned int type; +}; + +struct odmi_data { + struct resource res; + void *base; + unsigned int spi_base; +}; + +struct mvebu_pic { + void *base; + u32 parent_irq; + struct irq_domain *domain; + struct irq_chip irq_chip; +}; + +struct mvebu_sei_interrupt_range { + u32 first; + u32 size; +}; + +struct mvebu_sei_caps { + struct mvebu_sei_interrupt_range ap_range; + struct mvebu_sei_interrupt_range cp_range; +}; + +struct mvebu_sei { + struct device *dev; + void *base; + struct resource *res; + struct irq_domain *sei_domain; + struct irq_domain *ap_domain; + struct irq_domain *cp_domain; + const struct mvebu_sei_caps *caps; + struct mutex cp_msi_lock; + long unsigned int cp_msi_bitmap[1]; + raw_spinlock_t mask_lock; +}; + +struct regmap; + +struct ls_extirq_data { + struct regmap *syscon; + u32 intpcr; + bool is_ls1021a_or_ls1043a; + u32 nirq; + struct irq_fwspec map[12]; +}; + +struct ls_scfg_msi_cfg { + u32 ibs_shift; + u32 msir_irqs; + u32 msir_base; +}; + +struct ls_scfg_msi; + +struct ls_scfg_msir { + struct ls_scfg_msi *msi_data; + unsigned int index; + unsigned int gic_irq; + unsigned int bit_start; + unsigned int bit_end; + unsigned int srs; + void *reg; +}; + +struct ls_scfg_msi { + spinlock_t lock; + struct platform_device *pdev; + struct irq_domain *parent; + struct irq_domain *msi_domain; + void *regs; + phys_addr_t msiir_addr; + struct ls_scfg_msi_cfg *cfg; + u32 msir_num; + struct ls_scfg_msir *msir; + u32 irqs_num; + long unsigned int *used; +}; + +struct acpi_resource_irq { + u8 descriptor_length; + u8 triggering; + u8 polarity; + u8 shareable; + u8 wake_capable; + u8 interrupt_count; + u8 interrupts[1]; +}; + +struct acpi_resource_dma { + u8 type; + u8 bus_master; + u8 transfer; + u8 channel_count; + u8 channels[1]; +}; + +struct acpi_resource_start_dependent { + u8 descriptor_length; + u8 compatibility_priority; + u8 performance_robustness; +}; + +struct acpi_resource_io { + u8 io_decode; + u8 alignment; + u8 address_length; + u16 minimum; + u16 maximum; +} __attribute__((packed)); + +struct acpi_resource_fixed_io { + u16 address; + u8 address_length; +} __attribute__((packed)); + +struct acpi_resource_fixed_dma { + u16 request_lines; + u16 channels; + u8 width; +} __attribute__((packed)); + +struct acpi_resource_vendor { + u16 byte_length; + u8 byte_data[1]; +} __attribute__((packed)); + +struct acpi_resource_vendor_typed { + u16 byte_length; + u8 uuid_subtype; + u8 uuid[16]; + u8 byte_data[1]; +}; + +struct acpi_resource_end_tag { + u8 checksum; +}; + +struct acpi_resource_memory24 { + u8 write_protect; + u16 minimum; + u16 maximum; + u16 alignment; + u16 address_length; +} __attribute__((packed)); + +struct acpi_resource_memory32 { + u8 write_protect; + u32 minimum; + u32 maximum; + u32 alignment; + u32 address_length; +} __attribute__((packed)); + +struct acpi_resource_fixed_memory32 { + u8 write_protect; + u32 address; + u32 address_length; +} __attribute__((packed)); + +struct acpi_memory_attribute { + u8 write_protect; + u8 caching; + u8 range_type; + u8 translation; +}; + +struct acpi_io_attribute { + u8 range_type; + u8 translation; + u8 translation_type; + u8 reserved1; +}; + +union acpi_resource_attribute { + struct acpi_memory_attribute mem; + struct acpi_io_attribute io; + u8 type_specific; +}; + +struct acpi_resource_label { + u16 string_length; + char *string_ptr; +} __attribute__((packed)); + +struct acpi_resource_source { + u8 index; + u16 string_length; + char *string_ptr; +} __attribute__((packed)); + +struct acpi_address16_attribute { + u16 granularity; + u16 minimum; + u16 maximum; + u16 translation_offset; + u16 address_length; +}; + +struct acpi_address32_attribute { + u32 granularity; + u32 minimum; + u32 maximum; + u32 translation_offset; + u32 address_length; +}; + +struct acpi_address64_attribute { + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; +}; + +struct acpi_resource_address { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; +}; + +struct acpi_resource_address16 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address16_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_address32 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address32_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_address64 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address64_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_extended_address64 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + u8 revision_ID; + struct acpi_address64_attribute address; + u64 type_specific; +} __attribute__((packed)); + +struct acpi_resource_extended_irq { + u8 producer_consumer; + u8 triggering; + u8 polarity; + u8 shareable; + u8 wake_capable; + u8 interrupt_count; + struct acpi_resource_source resource_source; + u32 interrupts[1]; +} __attribute__((packed)); + +struct acpi_resource_generic_register { + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct acpi_resource_gpio { + u8 revision_id; + u8 connection_type; + u8 producer_consumer; + u8 pin_config; + u8 shareable; + u8 wake_capable; + u8 io_restriction; + u8 triggering; + u8 polarity; + u16 drive_strength; + u16 debounce_timeout; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_common_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_i2c_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 access_mode; + u16 slave_address; + u32 connection_speed; +} __attribute__((packed)); + +struct acpi_resource_spi_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 wire_mode; + u8 device_polarity; + u8 data_bit_length; + u8 clock_phase; + u8 clock_polarity; + u16 device_selection; + u32 connection_speed; +} __attribute__((packed)); + +struct acpi_resource_uart_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 endian; + u8 data_bits; + u8 stop_bits; + u8 flow_control; + u8 parity; + u8 lines_enabled; + u16 rx_fifo_size; + u16 tx_fifo_size; + u32 default_baud_rate; +} __attribute__((packed)); + +struct acpi_resource_csi2_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 local_port_instance; + u8 phy_type; +} __attribute__((packed)); + +struct acpi_resource_pin_function { + u8 revision_id; + u8 pin_config; + u8 shareable; + u16 function_number; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_config { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u8 pin_config_type; + u32 pin_config_value; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group { + u8 revision_id; + u8 producer_consumer; + u16 pin_table_length; + u16 vendor_length; + u16 *pin_table; + struct acpi_resource_label resource_label; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group_function { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u16 function_number; + u16 vendor_length; + struct acpi_resource_source resource_source; + struct acpi_resource_label resource_source_label; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group_config { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u8 pin_config_type; + u32 pin_config_value; + u16 vendor_length; + struct acpi_resource_source resource_source; + struct acpi_resource_label resource_source_label; + u8 *vendor_data; +} __attribute__((packed)); + +union acpi_resource_data { + struct acpi_resource_irq irq; + struct acpi_resource_dma dma; + struct acpi_resource_start_dependent start_dpf; + struct acpi_resource_io io; + struct acpi_resource_fixed_io fixed_io; + struct acpi_resource_fixed_dma fixed_dma; + struct acpi_resource_vendor vendor; + struct acpi_resource_vendor_typed vendor_typed; + struct acpi_resource_end_tag end_tag; + struct acpi_resource_memory24 memory24; + struct acpi_resource_memory32 memory32; + struct acpi_resource_fixed_memory32 fixed_memory32; + struct acpi_resource_address16 address16; + struct acpi_resource_address32 address32; + struct acpi_resource_address64 address64; + struct acpi_resource_extended_address64 ext_address64; + struct acpi_resource_extended_irq extended_irq; + struct acpi_resource_generic_register generic_reg; + struct acpi_resource_gpio gpio; + struct acpi_resource_i2c_serialbus i2c_serial_bus; + struct acpi_resource_spi_serialbus spi_serial_bus; + struct acpi_resource_uart_serialbus uart_serial_bus; + struct acpi_resource_csi2_serialbus csi2_serial_bus; + struct acpi_resource_common_serialbus common_serial_bus; + struct acpi_resource_pin_function pin_function; + struct acpi_resource_pin_config pin_config; + struct acpi_resource_pin_group pin_group; + struct acpi_resource_pin_group_function pin_group_function; + struct acpi_resource_pin_group_config pin_group_config; + struct acpi_resource_address address; +}; + +struct acpi_resource { + u32 type; + u32 length; + union acpi_resource_data data; +} __attribute__((packed)); + +typedef acpi_status (*acpi_walk_resource_callback)(struct acpi_resource *, void *); + +struct combiner_reg { + void *addr; + long unsigned int enabled; +}; + +struct combiner { + struct irq_domain *domain; + int parent_irq; + u32 nirqs; + u32 nregs; + struct combiner_reg regs[0]; +}; + +struct get_registers_context { + struct device *dev; + struct combiner *combiner; + int err; +}; + +struct exiu_irq_data { + void *base; + u32 spi_base; +}; + +struct meson_gpio_irq_controller; + +struct irq_ctl_ops { + void (*gpio_irq_sel_pin)(struct meson_gpio_irq_controller *, unsigned int, long unsigned int); + void (*gpio_irq_init)(struct meson_gpio_irq_controller *); +}; + +struct meson_gpio_irq_params; + +struct meson_gpio_irq_controller { + const struct meson_gpio_irq_params *params; + void *base; + u32 channel_irqs[8]; + long unsigned int channel_map[1]; + spinlock_t lock; +}; + +struct meson_gpio_irq_params { + unsigned int nr_hwirq; + bool support_edge_both; + unsigned int edge_both_offset; + unsigned int edge_single_offset; + unsigned int pol_low_offset; + unsigned int pin_sel_mask; + struct irq_ctl_ops ops; +}; + +struct pdc_pin_region { + u32 pin_base; + u32 parent_base; + u32 cnt; +}; + +enum pdc_irq_config_bits { + PDC_LEVEL_LOW = 0, + PDC_EDGE_FALLING = 2, + PDC_LEVEL_HIGH = 4, + PDC_EDGE_RISING = 6, + PDC_EDGE_DUAL = 7, +}; + +struct irqsteer_data { + void *regs; + struct clk *ipg_clk; + int irq[8]; + int irq_count; + raw_spinlock_t lock; + int reg_num; + int channel; + struct irq_domain *domain; + u32 *saved_reg; +}; + +struct intmux_irqchip_data { + struct irq_chip chip; + u32 saved_reg; + int chanidx; + int irq; + struct irq_domain *domain; +}; + +struct intmux_data { + raw_spinlock_t lock; + void *regs; + struct clk *ipg_clk; + int channum; + struct intmux_irqchip_data irqchip_data[0]; +}; + +struct ti_sci_version_info { + u8 abi_major; + u8 abi_minor; + u16 firmware_revision; + char firmware_description[32]; +}; + +struct ti_sci_handle; + +struct ti_sci_core_ops { + int (*reboot_device)(const struct ti_sci_handle *); +}; + +struct ti_sci_dev_ops { + int (*get_device)(const struct ti_sci_handle *, u32); + int (*get_device_exclusive)(const struct ti_sci_handle *, u32); + int (*idle_device)(const struct ti_sci_handle *, u32); + int (*idle_device_exclusive)(const struct ti_sci_handle *, u32); + int (*put_device)(const struct ti_sci_handle *, u32); + int (*is_valid)(const struct ti_sci_handle *, u32); + int (*get_context_loss_count)(const struct ti_sci_handle *, u32, u32 *); + int (*is_idle)(const struct ti_sci_handle *, u32, bool *); + int (*is_stop)(const struct ti_sci_handle *, u32, bool *, bool *); + int (*is_on)(const struct ti_sci_handle *, u32, bool *, bool *); + int (*is_transitioning)(const struct ti_sci_handle *, u32, bool *); + int (*set_device_resets)(const struct ti_sci_handle *, u32, u32); + int (*get_device_resets)(const struct ti_sci_handle *, u32, u32 *); +}; + +struct ti_sci_clk_ops { + int (*get_clock)(const struct ti_sci_handle *, u32, u32, bool, bool, bool); + int (*idle_clock)(const struct ti_sci_handle *, u32, u32); + int (*put_clock)(const struct ti_sci_handle *, u32, u32); + int (*is_auto)(const struct ti_sci_handle *, u32, u32, bool *); + int (*is_on)(const struct ti_sci_handle *, u32, u32, bool *, bool *); + int (*is_off)(const struct ti_sci_handle *, u32, u32, bool *, bool *); + int (*set_parent)(const struct ti_sci_handle *, u32, u32, u32); + int (*get_parent)(const struct ti_sci_handle *, u32, u32, u32 *); + int (*get_num_parents)(const struct ti_sci_handle *, u32, u32, u32 *); + int (*get_best_match_freq)(const struct ti_sci_handle *, u32, u32, u64, u64, u64, u64 *); + int (*set_freq)(const struct ti_sci_handle *, u32, u32, u64, u64, u64); + int (*get_freq)(const struct ti_sci_handle *, u32, u32, u64 *); +}; + +struct ti_sci_resource_desc; + +struct ti_sci_rm_core_ops { + int (*get_range)(const struct ti_sci_handle *, u32, u8, struct ti_sci_resource_desc *); + int (*get_range_from_shost)(const struct ti_sci_handle *, u32, u8, u8, struct ti_sci_resource_desc *); +}; + +struct ti_sci_rm_irq_ops { + int (*set_irq)(const struct ti_sci_handle *, u16, u16, u16, u16); + int (*set_event_map)(const struct ti_sci_handle *, u16, u16, u16, u16, u16, u8); + int (*free_irq)(const struct ti_sci_handle *, u16, u16, u16, u16); + int (*free_event_map)(const struct ti_sci_handle *, u16, u16, u16, u16, u16, u8); +}; + +struct ti_sci_msg_rm_ring_cfg; + +struct ti_sci_rm_ringacc_ops { + int (*set_cfg)(const struct ti_sci_handle *, const struct ti_sci_msg_rm_ring_cfg *); +}; + +struct ti_sci_rm_psil_ops { + int (*pair)(const struct ti_sci_handle *, u32, u32, u32); + int (*unpair)(const struct ti_sci_handle *, u32, u32, u32); +}; + +struct ti_sci_msg_rm_udmap_tx_ch_cfg; + +struct ti_sci_msg_rm_udmap_rx_ch_cfg; + +struct ti_sci_msg_rm_udmap_flow_cfg; + +struct ti_sci_rm_udmap_ops { + int (*tx_ch_cfg)(const struct ti_sci_handle *, const struct ti_sci_msg_rm_udmap_tx_ch_cfg *); + int (*rx_ch_cfg)(const struct ti_sci_handle *, const struct ti_sci_msg_rm_udmap_rx_ch_cfg *); + int (*rx_flow_cfg)(const struct ti_sci_handle *, const struct ti_sci_msg_rm_udmap_flow_cfg *); +}; + +struct ti_sci_proc_ops { + int (*request)(const struct ti_sci_handle *, u8); + int (*release)(const struct ti_sci_handle *, u8); + int (*handover)(const struct ti_sci_handle *, u8, u8); + int (*set_config)(const struct ti_sci_handle *, u8, u64, u32, u32); + int (*set_control)(const struct ti_sci_handle *, u8, u32, u32); + int (*get_status)(const struct ti_sci_handle *, u8, u64 *, u32 *, u32 *, u32 *); +}; + +struct ti_sci_ops { + struct ti_sci_core_ops core_ops; + struct ti_sci_dev_ops dev_ops; + struct ti_sci_clk_ops clk_ops; + struct ti_sci_rm_core_ops rm_core_ops; + struct ti_sci_rm_irq_ops rm_irq_ops; + struct ti_sci_rm_ringacc_ops rm_ring_ops; + struct ti_sci_rm_psil_ops rm_psil_ops; + struct ti_sci_rm_udmap_ops rm_udmap_ops; + struct ti_sci_proc_ops proc_ops; +}; + +struct ti_sci_handle { + struct ti_sci_version_info version; + struct ti_sci_ops ops; +}; + +struct ti_sci_resource_desc { + u16 start; + u16 num; + u16 start_sec; + u16 num_sec; + long unsigned int *res_map; +}; + +struct ti_sci_msg_rm_ring_cfg { + u32 valid_params; + u16 nav_id; + u16 index; + u32 addr_lo; + u32 addr_hi; + u32 count; + u8 mode; + u8 size; + u8 order_id; + u16 virtid; + u8 asel; +}; + +struct ti_sci_msg_rm_udmap_tx_ch_cfg { + u32 valid_params; + u16 nav_id; + u16 index; + u8 tx_pause_on_err; + u8 tx_filt_einfo; + u8 tx_filt_pswords; + u8 tx_atype; + u8 tx_chan_type; + u8 tx_supr_tdpkt; + u16 tx_fetch_size; + u8 tx_credit_count; + u16 txcq_qnum; + u8 tx_priority; + u8 tx_qos; + u8 tx_orderid; + u16 fdepth; + u8 tx_sched_priority; + u8 tx_burst_size; + u8 tx_tdtype; + u8 extended_ch_type; +}; + +struct ti_sci_msg_rm_udmap_rx_ch_cfg { + u32 valid_params; + u16 nav_id; + u16 index; + u16 rx_fetch_size; + u16 rxcq_qnum; + u8 rx_priority; + u8 rx_qos; + u8 rx_orderid; + u8 rx_sched_priority; + u16 flowid_start; + u16 flowid_cnt; + u8 rx_pause_on_err; + u8 rx_atype; + u8 rx_chan_type; + u8 rx_ignore_short; + u8 rx_ignore_long; + u8 rx_burst_size; +}; + +struct ti_sci_msg_rm_udmap_flow_cfg { + u32 valid_params; + u16 nav_id; + u16 flow_index; + u8 rx_einfo_present; + u8 rx_psinfo_present; + u8 rx_error_handling; + u8 rx_desc_type; + u16 rx_sop_offset; + u16 rx_dest_qnum; + u8 rx_src_tag_hi; + u8 rx_src_tag_lo; + u8 rx_dest_tag_hi; + u8 rx_dest_tag_lo; + u8 rx_src_tag_hi_sel; + u8 rx_src_tag_lo_sel; + u8 rx_dest_tag_hi_sel; + u8 rx_dest_tag_lo_sel; + u16 rx_fdq0_sz0_qnum; + u16 rx_fdq1_qnum; + u16 rx_fdq2_qnum; + u16 rx_fdq3_qnum; + u8 rx_ps_location; +}; + +struct ti_sci_resource { + u16 sets; + raw_spinlock_t lock; + struct ti_sci_resource_desc *desc; +}; + +struct ti_sci_intr_irq_domain { + const struct ti_sci_handle *sci; + struct ti_sci_resource *out_irqs; + struct device *dev; + u32 ti_sci_id; + u32 type; +}; + +struct of_phandle_iterator { + const char *cells_name; + int cell_count; + const struct device_node *parent; + const __be32 *list_end; + const __be32 *phandle_end; + const __be32 *cur; + uint32_t cur_count; + phandle phandle; + struct device_node *node; +}; + +struct ti_sci_inta_event_desc { + u16 global_event; + u32 hwirq; + u8 vint_bit; +}; + +struct ti_sci_inta_vint_desc { + struct irq_domain *domain; + struct list_head list; + long unsigned int event_map[1]; + struct ti_sci_inta_event_desc events[64]; + unsigned int parent_virq; + u16 vint_id; +}; + +struct ti_sci_inta_irq_domain { + const struct ti_sci_handle *sci; + struct ti_sci_resource *vint; + struct ti_sci_resource *global_event; + struct list_head vint_list; + struct mutex vint_mutex; + void *base; + struct platform_device *pdev; + u32 ti_sci_id; + int unmapped_cnt; + u16 *unmapped_dev_ids; +}; + +struct mst_intc_chip_data { + raw_spinlock_t lock; + unsigned int irq_start; + unsigned int nr_irqs; + void *base; + bool no_eoi; + struct list_head entry; + u16 saved_polarity_conf[4]; +}; + +struct aic_irq_chip { + void *base; + struct irq_domain *hw_domain; + struct irq_domain *ipi_domain; + int nr_hw; + int ipi_hwirq; +}; + +struct of_dev_auxdata { + char *compatible; + resource_size_t phys_addr; + char *name; + void *platform_data; +}; + +struct gpio_desc; + +struct circ_buf { + char *buf; + int head; + int tail; +}; + +struct serial_rs485 { + __u32 flags; + __u32 delay_rts_before_send; + __u32 delay_rts_after_send; + __u32 padding[5]; +}; + +struct serial_iso7816 { + __u32 flags; + __u32 tg; + __u32 sc_fi; + __u32 sc_di; + __u32 clk; + __u32 reserved[5]; +}; + +struct uart_port; + +struct uart_ops { + unsigned int (*tx_empty)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_mctrl)(struct uart_port *); + void (*stop_tx)(struct uart_port *); + void (*start_tx)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + void (*send_xchar)(struct uart_port *, char); + void (*stop_rx)(struct uart_port *); + void (*enable_ms)(struct uart_port *); + void (*break_ctl)(struct uart_port *, int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*flush_buffer)(struct uart_port *); + void (*set_termios)(struct uart_port *, struct ktermios *, struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + const char * (*type)(struct uart_port *); + void (*release_port)(struct uart_port *); + int (*request_port)(struct uart_port *); + void (*config_port)(struct uart_port *, int); + int (*verify_port)(struct uart_port *, struct serial_struct *); + int (*ioctl)(struct uart_port *, unsigned int, long unsigned int); + int (*poll_init)(struct uart_port *); + void (*poll_put_char)(struct uart_port *, unsigned char); + int (*poll_get_char)(struct uart_port *); +}; + +struct uart_icount { + __u32 cts; + __u32 dsr; + __u32 rng; + __u32 dcd; + __u32 rx; + __u32 tx; + __u32 frame; + __u32 overrun; + __u32 parity; + __u32 brk; + __u32 buf_overrun; +}; + +typedef unsigned int upf_t; + +typedef unsigned int upstat_t; + +struct uart_state; + +struct uart_port { + spinlock_t lock; + long unsigned int iobase; + unsigned char *membase; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + void (*set_termios)(struct uart_port *, struct ktermios *, struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_divisor)(struct uart_port *, unsigned int, unsigned int *); + void (*set_divisor)(struct uart_port *, unsigned int, unsigned int, unsigned int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); + int (*rs485_config)(struct uart_port *, struct serial_rs485 *); + int (*iso7816_config)(struct uart_port *, struct serial_iso7816 *); + unsigned int irq; + long unsigned int irqflags; + unsigned int uartclk; + unsigned int fifosize; + unsigned char x_char; + unsigned char regshift; + unsigned char iotype; + unsigned char quirks; + unsigned int read_status_mask; + unsigned int ignore_status_mask; + struct uart_state *state; + struct uart_icount icount; + struct console *cons; + upf_t flags; + upstat_t status; + int hw_stopped; + unsigned int mctrl; + unsigned int timeout; + unsigned int type; + const struct uart_ops *ops; + unsigned int custom_divisor; + unsigned int line; + unsigned int minor; + resource_size_t mapbase; + resource_size_t mapsize; + struct device *dev; + long unsigned int sysrq; + unsigned int sysrq_ch; + unsigned char has_sysrq; + unsigned char sysrq_seq; + unsigned char hub6; + unsigned char suspended; + unsigned char console_reinit; + const char *name; + struct attribute_group *attr_group; + const struct attribute_group **tty_groups; + struct serial_rs485 rs485; + struct gpio_desc *rs485_term_gpio; + struct serial_iso7816 iso7816; + void *private_data; +}; + +enum uart_pm_state { + UART_PM_STATE_ON = 0, + UART_PM_STATE_OFF = 3, + UART_PM_STATE_UNDEFINED = 4, +}; + +struct uart_state { + struct tty_port port; + enum uart_pm_state pm_state; + struct circ_buf xmit; + atomic_t refcount; + wait_queue_head_t remove_wait; + struct uart_port *uart_port; +}; + +struct plat_serial8250_port { + long unsigned int iobase; + void *membase; + resource_size_t mapbase; + unsigned int irq; + long unsigned int irqflags; + unsigned int uartclk; + void *private_data; + unsigned char regshift; + unsigned char iotype; + unsigned char hub6; + unsigned char has_sysrq; + upf_t flags; + unsigned int type; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + void (*set_termios)(struct uart_port *, struct ktermios *, struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); +}; + +struct lpc_cycle_para { + unsigned int opflags; + unsigned int csize; +}; + +struct hisi_lpc_dev { + spinlock_t cycle_lock; + void *membase; + struct logic_pio_hwaddr *io_host; +}; + +struct hisi_lpc_acpi_cell { + const char *hid; + const char *name; + void *pdata; + size_t pdata_size; +}; + +enum { + ARB_TIMER = 0, + ARB_BP_CAP_CLR = 1, + ARB_BP_CAP_HI_ADDR = 2, + ARB_BP_CAP_ADDR = 3, + ARB_BP_CAP_STATUS = 4, + ARB_BP_CAP_MASTER = 5, + ARB_ERR_CAP_CLR = 6, + ARB_ERR_CAP_HI_ADDR = 7, + ARB_ERR_CAP_ADDR = 8, + ARB_ERR_CAP_STATUS = 9, + ARB_ERR_CAP_MASTER = 10, +}; + +struct brcmstb_gisb_arb_device { + void *base; + const int *gisb_offsets; + bool big_endian; + struct mutex lock; + struct list_head next; + u32 valid_mask; + const char *master_names[32]; + u32 saved_timeout; +}; + +struct bus_attribute { + struct attribute attr; + ssize_t (*show)(struct bus_type *, char *); + ssize_t (*store)(struct bus_type *, const char *, size_t); +}; + +struct fsl_mc_device_id { + __u16 vendor; + const char obj_type[16]; +}; + +enum dev_dma_attr { + DEV_DMA_NOT_SUPPORTED = 0, + DEV_DMA_NON_COHERENT = 1, + DEV_DMA_COHERENT = 2, +}; + +struct fsl_mc_command { + __le64 header; + __le64 params[7]; +}; + +struct fsl_mc_driver { + struct device_driver driver; + const struct fsl_mc_device_id *match_id_table; + int (*probe)(struct fsl_mc_device *); + int (*remove)(struct fsl_mc_device *); + void (*shutdown)(struct fsl_mc_device *); + int (*suspend)(struct fsl_mc_device *, pm_message_t); + int (*resume)(struct fsl_mc_device *); +}; + +struct fsl_mc_bus; + +struct fsl_mc_resource_pool { + enum fsl_mc_pool_type type; + int max_count; + int free_count; + struct mutex mutex; + struct list_head free_list; + struct fsl_mc_bus *mc_bus; +}; + +struct mc_cmd_header { + u8 src_id; + u8 flags_hw; + u8 status; + u8 flags_sw; + __le16 token; + __le16 cmd_id; +}; + +enum mc_cmd_status { + MC_CMD_STATUS_OK = 0, + MC_CMD_STATUS_READY = 1, + MC_CMD_STATUS_AUTH_ERR = 3, + MC_CMD_STATUS_NO_PRIVILEGE = 4, + MC_CMD_STATUS_DMA_ERR = 5, + MC_CMD_STATUS_CONFIG_ERR = 6, + MC_CMD_STATUS_TIMEOUT = 7, + MC_CMD_STATUS_NO_RESOURCE = 8, + MC_CMD_STATUS_NO_MEMORY = 9, + MC_CMD_STATUS_BUSY = 10, + MC_CMD_STATUS_UNSUPPORTED_OP = 11, + MC_CMD_STATUS_INVALID_STATE = 12, +}; + +struct fsl_mc_version { + u32 major; + u32 minor; + u32 revision; +}; + +struct dpmng_rsp_get_version { + __le32 revision; + __le32 version_major; + __le32 version_minor; +}; + +struct dprc_attributes { + int container_id; + u32 icid; + int portal_id; + u64 options; +}; + +enum dprc_region_type { + DPRC_REGION_TYPE_MC_PORTAL = 0, + DPRC_REGION_TYPE_QBMAN_PORTAL = 1, + DPRC_REGION_TYPE_QBMAN_MEM_BACKED_PORTAL = 2, +}; + +struct dprc_region_desc { + u32 base_offset; + u32 size; + u32 flags; + enum dprc_region_type type; + u64 base_address; +}; + +struct dprc_endpoint { + char type[16]; + int id; + u16 if_id; +}; + +struct fsl_mc_uapi { + struct miscdevice misc; + struct device *device; + struct mutex mutex; + u32 local_instance_in_use; + struct fsl_mc_io *static_mc_io; +}; + +struct fsl_mc_bus { + struct fsl_mc_device mc_dev; + struct fsl_mc_resource_pool resource_pools[4]; + struct fsl_mc_device_irq *irq_resources; + struct mutex scan_mutex; + struct dprc_attributes dprc_attr; + struct fsl_mc_uapi uapi_misc; + int irq_enabled; +}; + +struct fsl_mc_addr_translation_range; + +struct fsl_mc { + struct fsl_mc_device *root_mc_bus_dev; + u8 num_translation_ranges; + struct fsl_mc_addr_translation_range *translation_ranges; + void *fsl_mc_regs; +}; + +struct fsl_mc_addr_translation_range { + enum dprc_region_type mc_region_type; + u64 start_mc_offset; + u64 end_mc_offset; + phys_addr_t start_phys_addr; +}; + +struct dpbp_attr { + int id; + u16 bpid; +}; + +struct dpbp_cmd_open { + __le32 dpbp_id; +}; + +struct dpbp_rsp_get_attributes { + __le16 pad; + __le16 bpid; + __le32 id; + __le16 version_major; + __le16 version_minor; +}; + +struct dpcon_attr { + int id; + u16 qbman_ch_id; + u8 num_priorities; +}; + +struct dpcon_notification_cfg { + int dpio_id; + u8 priority; + u64 user_ctx; +}; + +struct dpcon_cmd_open { + __le32 dpcon_id; +}; + +struct dpcon_rsp_get_attr { + __le32 id; + __le16 qbman_ch_id; + u8 num_priorities; + u8 pad; +}; + +struct dpcon_cmd_set_notification { + __le32 dpio_id; + u8 priority; + u8 pad[3]; + __le64 user_ctx; +}; + +struct mc_rsp_create { + __le32 object_id; +}; + +struct mc_rsp_api_ver { + __le16 major_ver; + __le16 minor_ver; +}; + +struct dprc_cmd_open { + __le32 container_id; +}; + +struct dprc_cmd_reset_container { + __le32 child_container_id; + __le32 options; +}; + +struct dprc_cmd_set_irq { + __le32 irq_val; + u8 irq_index; + u8 pad[3]; + __le64 irq_addr; + __le32 irq_num; +}; + +struct dprc_cmd_set_irq_enable { + u8 enable; + u8 pad[3]; + u8 irq_index; +}; + +struct dprc_cmd_set_irq_mask { + __le32 mask; + u8 irq_index; +}; + +struct dprc_cmd_get_irq_status { + __le32 status; + u8 irq_index; +}; + +struct dprc_rsp_get_irq_status { + __le32 status; +}; + +struct dprc_cmd_clear_irq_status { + __le32 status; + u8 irq_index; +}; + +struct dprc_rsp_get_attributes { + __le32 container_id; + __le32 icid; + __le32 options; + __le32 portal_id; +}; + +struct dprc_rsp_get_obj_count { + __le32 pad; + __le32 obj_count; +}; + +struct dprc_cmd_get_obj { + __le32 obj_index; +}; + +struct dprc_rsp_get_obj { + __le32 pad0; + __le32 id; + __le16 vendor; + u8 irq_count; + u8 region_count; + __le32 state; + __le16 version_major; + __le16 version_minor; + __le16 flags; + __le16 pad1; + u8 type[16]; + u8 label[16]; +}; + +struct dprc_cmd_get_obj_region { + __le32 obj_id; + __le16 pad0; + u8 region_index; + u8 pad1; + __le64 pad2[2]; + u8 obj_type[16]; +}; + +struct dprc_rsp_get_obj_region { + __le64 pad0; + __le64 base_offset; + __le32 size; + u8 type; + u8 pad2[3]; + __le32 flags; + __le32 pad3; + __le64 base_addr; +}; + +struct dprc_cmd_set_obj_irq { + __le32 irq_val; + u8 irq_index; + u8 pad[3]; + __le64 irq_addr; + __le32 irq_num; + __le32 obj_id; + u8 obj_type[16]; +}; + +struct dprc_cmd_get_connection { + __le32 ep1_id; + __le16 ep1_interface_id; + u8 pad[2]; + u8 ep1_type[16]; +}; + +struct dprc_rsp_get_connection { + __le64 pad[3]; + __le32 ep2_id; + __le16 ep2_interface_id; + __le16 pad1; + u8 ep2_type[16]; + __le32 state; +}; + +struct dprc_irq_cfg { + phys_addr_t paddr; + u32 val; + int irq_num; +}; + +struct fsl_mc_child_objs { + int child_count; + struct fsl_mc_obj_desc *child_array; +}; + +struct dpmcp_cmd_open { + __le32 dpmcp_id; +}; + +struct fsl_mc_obj_cmd_open { + __le32 obj_id; +}; + +struct uapi_priv_data { + struct fsl_mc_uapi *uapi; + struct fsl_mc_io *mc_io; +}; + +struct fsl_mc_cmd_desc { + u16 cmdid_value; + u16 cmdid_mask; + int size; + bool token; + int flags; +}; + +enum fsl_mc_cmd_index { + DPDBG_DUMP = 0, + DPDBG_SET = 1, + DPRC_GET_CONTAINER_ID = 2, + DPRC_CREATE_CONT = 3, + DPRC_DESTROY_CONT = 4, + DPRC_ASSIGN = 5, + DPRC_UNASSIGN = 6, + DPRC_GET_OBJ_COUNT = 7, + DPRC_GET_OBJ = 8, + DPRC_GET_RES_COUNT = 9, + DPRC_GET_RES_IDS = 10, + DPRC_SET_OBJ_LABEL = 11, + DPRC_SET_LOCKED = 12, + DPRC_CONNECT = 13, + DPRC_DISCONNECT = 14, + DPRC_GET_POOL = 15, + DPRC_GET_POOL_COUNT = 16, + DPRC_GET_CONNECTION = 17, + DPCI_GET_LINK_STATE = 18, + DPCI_GET_PEER_ATTR = 19, + DPAIOP_GET_SL_VERSION = 20, + DPAIOP_GET_STATE = 21, + DPMNG_GET_VERSION = 22, + DPSECI_GET_TX_QUEUE = 23, + DPMAC_GET_COUNTER = 24, + DPMAC_GET_MAC_ADDR = 25, + DPNI_SET_PRIM_MAC = 26, + DPNI_GET_PRIM_MAC = 27, + DPNI_GET_STATISTICS = 28, + DPNI_GET_LINK_STATE = 29, + DPNI_GET_MAX_FRAME_LENGTH = 30, + DPSW_GET_TAILDROP = 31, + DPSW_SET_TAILDROP = 32, + DPSW_IF_GET_COUNTER = 33, + DPSW_IF_GET_MAX_FRAME_LENGTH = 34, + DPDMUX_GET_COUNTER = 35, + DPDMUX_IF_GET_MAX_FRAME_LENGTH = 36, + GET_ATTR = 37, + GET_IRQ_MASK = 38, + GET_IRQ_STATUS = 39, + CLOSE = 40, + OPEN = 41, + GET_API_VERSION = 42, + DESTROY = 43, + CREATE = 44, +}; + +struct imx_weim_devtype { + unsigned int cs_count; + unsigned int cs_regs_count; + unsigned int cs_stride; + unsigned int wcr_offset; + unsigned int wcr_bcm; +}; + +struct cs_timing { + bool is_applied; + u32 regs[6]; +}; + +struct cs_timing_state { + struct cs_timing cs[6]; +}; + +struct cs_data { + u32 enable_mask; + u16 slow_cfg; + u16 fast_cfg; +}; + +struct ebi2_xmem_prop { + const char *prop; + u32 max; + bool slowreg; + u16 shift; +}; + +enum regcache_type { + REGCACHE_NONE = 0, + REGCACHE_RBTREE = 1, + REGCACHE_COMPRESSED = 2, + REGCACHE_FLAT = 3, +}; + +struct reg_default { + unsigned int reg; + unsigned int def; +}; + +enum regmap_endian { + REGMAP_ENDIAN_DEFAULT = 0, + REGMAP_ENDIAN_BIG = 1, + REGMAP_ENDIAN_LITTLE = 2, + REGMAP_ENDIAN_NATIVE = 3, +}; + +struct regmap_range { + unsigned int range_min; + unsigned int range_max; +}; + +struct regmap_access_table { + const struct regmap_range *yes_ranges; + unsigned int n_yes_ranges; + const struct regmap_range *no_ranges; + unsigned int n_no_ranges; +}; + +typedef void (*regmap_lock)(void *); + +typedef void (*regmap_unlock)(void *); + +struct regmap_range_cfg; + +struct regmap_config { + const char *name; + int reg_bits; + int reg_stride; + int pad_bits; + int val_bits; + bool (*writeable_reg)(struct device *, unsigned int); + bool (*readable_reg)(struct device *, unsigned int); + bool (*volatile_reg)(struct device *, unsigned int); + bool (*precious_reg)(struct device *, unsigned int); + bool (*writeable_noinc_reg)(struct device *, unsigned int); + bool (*readable_noinc_reg)(struct device *, unsigned int); + bool disable_locking; + regmap_lock lock; + regmap_unlock unlock; + void *lock_arg; + int (*reg_read)(void *, unsigned int, unsigned int *); + int (*reg_write)(void *, unsigned int, unsigned int); + bool fast_io; + unsigned int max_register; + const struct regmap_access_table *wr_table; + const struct regmap_access_table *rd_table; + const struct regmap_access_table *volatile_table; + const struct regmap_access_table *precious_table; + const struct regmap_access_table *wr_noinc_table; + const struct regmap_access_table *rd_noinc_table; + const struct reg_default *reg_defaults; + unsigned int num_reg_defaults; + enum regcache_type cache_type; + const void *reg_defaults_raw; + unsigned int num_reg_defaults_raw; + long unsigned int read_flag_mask; + long unsigned int write_flag_mask; + bool zero_flag_mask; + bool use_single_read; + bool use_single_write; + bool use_relaxed_mmio; + bool can_multi_write; + enum regmap_endian reg_format_endian; + enum regmap_endian val_format_endian; + const struct regmap_range_cfg *ranges; + unsigned int num_ranges; + bool use_hwlock; + bool use_raw_spinlock; + unsigned int hwlock_id; + unsigned int hwlock_mode; + bool can_sleep; +}; + +struct regmap_range_cfg { + const char *name; + unsigned int range_min; + unsigned int range_max; + unsigned int selector_reg; + unsigned int selector_mask; + int selector_shift; + unsigned int window_start; + unsigned int window_len; +}; + +typedef int (*regmap_hw_write)(void *, const void *, size_t); + +typedef int (*regmap_hw_gather_write)(void *, const void *, size_t, const void *, size_t); + +struct regmap_async; + +typedef int (*regmap_hw_async_write)(void *, const void *, size_t, const void *, size_t, struct regmap_async *); + +typedef int (*regmap_hw_read)(void *, const void *, size_t, void *, size_t); + +typedef int (*regmap_hw_reg_read)(void *, unsigned int, unsigned int *); + +typedef int (*regmap_hw_reg_write)(void *, unsigned int, unsigned int); + +typedef int (*regmap_hw_reg_update_bits)(void *, unsigned int, unsigned int, unsigned int); + +typedef struct regmap_async * (*regmap_hw_async_alloc)(); + +typedef void (*regmap_hw_free_context)(void *); + +struct regmap_bus { + bool fast_io; + regmap_hw_write write; + regmap_hw_gather_write gather_write; + regmap_hw_async_write async_write; + regmap_hw_reg_write reg_write; + regmap_hw_reg_update_bits reg_update_bits; + regmap_hw_read read; + regmap_hw_reg_read reg_read; + regmap_hw_free_context free_context; + regmap_hw_async_alloc async_alloc; + u8 read_flag_mask; + enum regmap_endian reg_format_endian_default; + enum regmap_endian val_format_endian_default; + size_t max_raw_read; + size_t max_raw_write; + bool free_on_exit; +}; + +struct vexpress_syscfg { + struct device *dev; + void *base; + struct list_head funcs; +}; + +struct vexpress_syscfg_func { + struct list_head list; + struct vexpress_syscfg *syscfg; + struct regmap *regmap; + int num_templates; + u32 template[0]; +}; + +struct vexpress_config_bridge_ops { + struct regmap * (*regmap_init)(struct device *, void *); + void (*regmap_exit)(struct regmap *, void *); +}; + +struct vexpress_config_bridge { + struct vexpress_config_bridge_ops *ops; + void *context; +}; + +struct phy_configure_opts_dp { + unsigned int link_rate; + unsigned int lanes; + unsigned int voltage[4]; + unsigned int pre[4]; + u8 ssc: 1; + u8 set_rate: 1; + u8 set_lanes: 1; + u8 set_voltages: 1; +}; + +struct phy_configure_opts_mipi_dphy { + unsigned int clk_miss; + unsigned int clk_post; + unsigned int clk_pre; + unsigned int clk_prepare; + unsigned int clk_settle; + unsigned int clk_term_en; + unsigned int clk_trail; + unsigned int clk_zero; + unsigned int d_term_en; + unsigned int eot; + unsigned int hs_exit; + unsigned int hs_prepare; + unsigned int hs_settle; + unsigned int hs_skip; + unsigned int hs_trail; + unsigned int hs_zero; + unsigned int init; + unsigned int lpx; + unsigned int ta_get; + unsigned int ta_go; + unsigned int ta_sure; + unsigned int wakeup; + long unsigned int hs_clk_rate; + long unsigned int lp_clk_rate; + unsigned char lanes; +}; + +enum phy_mode { + PHY_MODE_INVALID = 0, + PHY_MODE_USB_HOST = 1, + PHY_MODE_USB_HOST_LS = 2, + PHY_MODE_USB_HOST_FS = 3, + PHY_MODE_USB_HOST_HS = 4, + PHY_MODE_USB_HOST_SS = 5, + PHY_MODE_USB_DEVICE = 6, + PHY_MODE_USB_DEVICE_LS = 7, + PHY_MODE_USB_DEVICE_FS = 8, + PHY_MODE_USB_DEVICE_HS = 9, + PHY_MODE_USB_DEVICE_SS = 10, + PHY_MODE_USB_OTG = 11, + PHY_MODE_UFS_HS_A = 12, + PHY_MODE_UFS_HS_B = 13, + PHY_MODE_PCIE = 14, + PHY_MODE_ETHERNET = 15, + PHY_MODE_MIPI_DPHY = 16, + PHY_MODE_SATA = 17, + PHY_MODE_LVDS = 18, + PHY_MODE_DP = 19, +}; + +enum phy_media { + PHY_MEDIA_DEFAULT = 0, + PHY_MEDIA_SR = 1, + PHY_MEDIA_DAC = 2, +}; + +union phy_configure_opts { + struct phy_configure_opts_mipi_dphy mipi_dphy; + struct phy_configure_opts_dp dp; +}; + +struct phy; + +struct phy_ops { + int (*init)(struct phy *); + int (*exit)(struct phy *); + int (*power_on)(struct phy *); + int (*power_off)(struct phy *); + int (*set_mode)(struct phy *, enum phy_mode, int); + int (*set_media)(struct phy *, enum phy_media); + int (*set_speed)(struct phy *, int); + int (*configure)(struct phy *, union phy_configure_opts *); + int (*validate)(struct phy *, enum phy_mode, int, union phy_configure_opts *); + int (*reset)(struct phy *); + int (*calibrate)(struct phy *); + void (*release)(struct phy *); + struct module *owner; +}; + +struct phy_attrs { + u32 bus_width; + u32 max_link_rate; + enum phy_mode mode; +}; + +struct regulator; + +struct phy { + struct device dev; + int id; + const struct phy_ops *ops; + struct mutex mutex; + int init_count; + int power_count; + struct phy_attrs attrs; + struct regulator *pwr; +}; + +struct phy_provider { + struct device *dev; + struct device_node *children; + struct module *owner; + struct list_head list; + struct phy * (*of_xlate)(struct device *, struct of_phandle_args *); +}; + +struct phy_lookup { + struct list_head node; + const char *dev_id; + const char *con_id; + struct phy *phy; +}; + +enum cmu_type_t { + REF_CMU = 0, + PHY_CMU = 1, +}; + +enum clk_type_t { + CLK_EXT_DIFF = 0, + CLK_INT_DIFF = 1, + CLK_INT_SING = 2, +}; + +enum xgene_phy_mode { + MODE_SATA = 0, + MODE_SGMII = 1, + MODE_PCIE = 2, + MODE_USB = 3, + MODE_XFI = 4, + MODE_MAX___2 = 5, +}; + +struct xgene_sata_override_param { + u32 speed[2]; + u32 txspeed[3]; + u32 txboostgain[6]; + u32 txeyetuning[6]; + u32 txeyedirection[6]; + u32 txamplitude[6]; + u32 txprecursor_cn1[6]; + u32 txprecursor_cn2[6]; + u32 txpostcursor_cp1[6]; +}; + +struct xgene_phy_ctx { + struct device *dev; + struct phy *phy; + enum xgene_phy_mode mode; + enum clk_type_t clk_type; + void *sds_base; + struct clk *clk; + struct xgene_sata_override_param sata_param; +}; + +struct reset_control; + +struct phy_axg_pcie_priv { + struct phy *phy; + struct phy *analog; + struct regmap *regmap; + struct reset_control *reset; +}; + +struct phy_axg_mipi_pcie_analog_priv { + struct phy *phy; + struct regmap *regmap; + bool dsi_configured; + bool dsi_enabled; + bool powered; + struct phy_configure_opts_mipi_dphy config; +}; + +struct mii_bus; + +struct mdio_device { + struct device dev; + struct mii_bus *bus; + char modalias[32]; + int (*bus_match)(struct device *, struct device_driver *); + void (*device_free)(struct mdio_device *); + void (*device_remove)(struct mdio_device *); + int addr; + int flags; + struct gpio_desc *reset_gpio; + struct reset_control *reset_ctrl; + unsigned int reset_assert_delay; + unsigned int reset_deassert_delay; +}; + +struct mdio_bus_stats { + u64_stats_t transfers; + u64_stats_t errors; + u64_stats_t writes; + u64_stats_t reads; + struct u64_stats_sync syncp; +}; + +struct phy_package_shared; + +struct mii_bus { + struct module *owner; + const char *name; + char id[61]; + void *priv; + int (*read)(struct mii_bus *, int, int); + int (*write)(struct mii_bus *, int, int, u16); + int (*reset)(struct mii_bus *); + struct mdio_bus_stats stats[32]; + struct mutex mdio_lock; + struct device *parent; + enum { + MDIOBUS_ALLOCATED = 1, + MDIOBUS_REGISTERED = 2, + MDIOBUS_UNREGISTERED = 3, + MDIOBUS_RELEASED = 4, + } state; + struct device dev; + struct mdio_device *mdio_map[32]; + u32 phy_mask; + u32 phy_ignore_ta_mask; + int irq[32]; + int reset_delay_us; + int reset_post_delay_us; + struct gpio_desc *reset_gpiod; + enum { + MDIOBUS_NO_CAP = 0, + MDIOBUS_C22 = 1, + MDIOBUS_C45 = 2, + MDIOBUS_C22_C45 = 3, + } probe_capabilities; + struct mutex shared_lock; + struct phy_package_shared *shared[32]; +}; + +struct mdio_driver_common { + struct device_driver driver; + int flags; +}; + +struct mdio_driver { + struct mdio_driver_common mdiodrv; + int (*probe)(struct mdio_device *); + void (*remove)(struct mdio_device *); + void (*shutdown)(struct mdio_device *); +}; + +struct phy_package_shared { + int addr; + refcount_t refcnt; + long unsigned int flags; + size_t priv_size; + void *priv; +}; + +enum brcm_sata_phy_version { + BRCM_SATA_PHY_STB_16NM = 0, + BRCM_SATA_PHY_STB_28NM = 1, + BRCM_SATA_PHY_STB_40NM = 2, + BRCM_SATA_PHY_IPROC_NS2 = 3, + BRCM_SATA_PHY_IPROC_NSP = 4, + BRCM_SATA_PHY_IPROC_SR = 5, + BRCM_SATA_PHY_DSL_28NM = 6, +}; + +enum brcm_sata_phy_rxaeq_mode { + RXAEQ_MODE_OFF = 0, + RXAEQ_MODE_AUTO = 1, + RXAEQ_MODE_MANUAL = 2, +}; + +struct brcm_sata_phy; + +struct brcm_sata_port { + int portnum; + struct phy *phy; + struct brcm_sata_phy *phy_priv; + bool ssc_en; + enum brcm_sata_phy_rxaeq_mode rxaeq_mode; + u32 rxaeq_val; + u32 tx_amplitude_val; +}; + +struct brcm_sata_phy { + struct device *dev; + void *phy_base; + void *ctrl_base; + enum brcm_sata_phy_version version; + struct brcm_sata_port phys[2]; +}; + +enum sata_phy_regs { + BLOCK0_REG_BANK = 0, + BLOCK0_XGXSSTATUS = 129, + BLOCK0_XGXSSTATUS_PLL_LOCK = 4096, + BLOCK0_SPARE = 141, + BLOCK0_SPARE_OOB_CLK_SEL_MASK = 3, + BLOCK0_SPARE_OOB_CLK_SEL_REFBY2 = 1, + BLOCK1_REG_BANK = 16, + BLOCK1_TEST_TX = 131, + BLOCK1_TEST_TX_AMP_SHIFT = 12, + PLL_REG_BANK_0 = 80, + PLL_REG_BANK_0_PLLCONTROL_0 = 129, + PLLCONTROL_0_FREQ_DET_RESTART = 8192, + PLLCONTROL_0_FREQ_MONITOR = 4096, + PLLCONTROL_0_SEQ_START = 32768, + PLL_CAP_CHARGE_TIME = 131, + PLL_VCO_CAL_THRESH = 132, + PLL_CAP_CONTROL = 133, + PLL_FREQ_DET_TIME = 134, + PLL_ACTRL2 = 139, + PLL_ACTRL2_SELDIV_MASK = 31, + PLL_ACTRL2_SELDIV_SHIFT = 9, + PLL_ACTRL6 = 134, + PLL1_REG_BANK = 96, + PLL1_ACTRL2 = 130, + PLL1_ACTRL3 = 131, + PLL1_ACTRL4 = 132, + PLL1_ACTRL5 = 133, + PLL1_ACTRL6 = 134, + PLL1_ACTRL7 = 135, + PLL1_ACTRL8 = 136, + TX_REG_BANK = 112, + TX_ACTRL0 = 128, + TX_ACTRL0_TXPOL_FLIP = 64, + TX_ACTRL5 = 133, + TX_ACTRL5_SSC_EN = 2048, + AEQRX_REG_BANK_0 = 208, + AEQ_CONTROL1 = 129, + AEQ_CONTROL1_ENABLE = 4, + AEQ_CONTROL1_FREEZE = 8, + AEQ_FRC_EQ = 131, + AEQ_FRC_EQ_FORCE = 1, + AEQ_FRC_EQ_FORCE_VAL = 2, + AEQ_RFZ_FRC_VAL = 256, + AEQRX_REG_BANK_1 = 224, + AEQRX_SLCAL0_CTRL0 = 130, + AEQRX_SLCAL1_CTRL0 = 134, + OOB_REG_BANK = 336, + OOB1_REG_BANK = 352, + OOB_CTRL1 = 128, + OOB_CTRL1_BURST_MAX_MASK = 15, + OOB_CTRL1_BURST_MAX_SHIFT = 12, + OOB_CTRL1_BURST_MIN_MASK = 15, + OOB_CTRL1_BURST_MIN_SHIFT = 8, + OOB_CTRL1_WAKE_IDLE_MAX_MASK = 15, + OOB_CTRL1_WAKE_IDLE_MAX_SHIFT = 4, + OOB_CTRL1_WAKE_IDLE_MIN_MASK = 15, + OOB_CTRL1_WAKE_IDLE_MIN_SHIFT = 0, + OOB_CTRL2 = 129, + OOB_CTRL2_SEL_ENA_SHIFT = 15, + OOB_CTRL2_SEL_ENA_RC_SHIFT = 14, + OOB_CTRL2_RESET_IDLE_MAX_MASK = 63, + OOB_CTRL2_RESET_IDLE_MAX_SHIFT = 8, + OOB_CTRL2_BURST_CNT_MASK = 3, + OOB_CTRL2_BURST_CNT_SHIFT = 6, + OOB_CTRL2_RESET_IDLE_MIN_MASK = 63, + OOB_CTRL2_RESET_IDLE_MIN_SHIFT = 0, + TXPMD_REG_BANK = 416, + TXPMD_CONTROL1 = 129, + TXPMD_CONTROL1_TX_SSC_EN_FRC = 1, + TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL = 2, + TXPMD_TX_FREQ_CTRL_CONTROL1 = 130, + TXPMD_TX_FREQ_CTRL_CONTROL2 = 131, + TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK = 1023, + TXPMD_TX_FREQ_CTRL_CONTROL3 = 132, + TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK = 1023, + RXPMD_REG_BANK = 448, + RXPMD_RX_CDR_CONTROL1 = 129, + RXPMD_RX_PPM_VAL_MASK = 511, + RXPMD_RXPMD_EN_FRC = 4096, + RXPMD_RXPMD_EN_FRC_VAL = 8192, + RXPMD_RX_CDR_CDR_PROP_BW = 130, + RXPMD_G_CDR_PROP_BW_MASK = 7, + RXPMD_G1_CDR_PROP_BW_SHIFT = 0, + RXPMD_G2_CDR_PROP_BW_SHIFT = 3, + RXPMD_G3_CDR_PROB_BW_SHIFT = 6, + RXPMD_RX_CDR_CDR_ACQ_INTEG_BW = 131, + RXPMD_G_CDR_ACQ_INT_BW_MASK = 7, + RXPMD_G1_CDR_ACQ_INT_BW_SHIFT = 0, + RXPMD_G2_CDR_ACQ_INT_BW_SHIFT = 3, + RXPMD_G3_CDR_ACQ_INT_BW_SHIFT = 6, + RXPMD_RX_CDR_CDR_LOCK_INTEG_BW = 132, + RXPMD_G_CDR_LOCK_INT_BW_MASK = 7, + RXPMD_G1_CDR_LOCK_INT_BW_SHIFT = 0, + RXPMD_G2_CDR_LOCK_INT_BW_SHIFT = 3, + RXPMD_G3_CDR_LOCK_INT_BW_SHIFT = 6, + RXPMD_RX_FREQ_MON_CONTROL1 = 135, + RXPMD_MON_CORRECT_EN = 256, + RXPMD_MON_MARGIN_VAL_MASK = 255, +}; + +enum sata_phy_ctrl_regs { + PHY_CTRL_1 = 0, + PHY_CTRL_1_RESET = 1, +}; + +struct pinctrl; + +struct pinctrl_state; + +struct dev_pin_info { + struct pinctrl *p; + struct pinctrl_state *default_state; + struct pinctrl_state *init_state; + struct pinctrl_state *sleep_state; + struct pinctrl_state *idle_state; +}; + +struct pinctrl { + struct list_head node; + struct device *dev; + struct list_head states; + struct pinctrl_state *state; + struct list_head dt_maps; + struct kref users; +}; + +struct pinctrl_state { + struct list_head node; + const char *name; + struct list_head settings; +}; + +struct pinctrl_pin_desc { + unsigned int number; + const char *name; + void *drv_data; +}; + +struct gpio_chip; + +struct pinctrl_gpio_range { + struct list_head node; + const char *name; + unsigned int id; + unsigned int base; + unsigned int pin_base; + unsigned int npins; + const unsigned int *pins; + struct gpio_chip *gc; +}; + +struct gpio_irq_chip { + struct irq_chip *chip; + struct irq_domain *domain; + const struct irq_domain_ops *domain_ops; + struct fwnode_handle *fwnode; + struct irq_domain *parent_domain; + int (*child_to_parent_hwirq)(struct gpio_chip *, unsigned int, unsigned int, unsigned int *, unsigned int *); + void * (*populate_parent_alloc_arg)(struct gpio_chip *, unsigned int, unsigned int); + unsigned int (*child_offset_to_irq)(struct gpio_chip *, unsigned int); + struct irq_domain_ops child_irq_domain_ops; + irq_flow_handler_t handler; + unsigned int default_type; + struct lock_class_key *lock_key; + struct lock_class_key *request_key; + irq_flow_handler_t parent_handler; + union { + void *parent_handler_data; + void **parent_handler_data_array; + }; + unsigned int num_parents; + unsigned int *parents; + unsigned int *map; + bool threaded; + bool per_parent_data; + int (*init_hw)(struct gpio_chip *); + void (*init_valid_mask)(struct gpio_chip *, long unsigned int *, unsigned int); + long unsigned int *valid_mask; + unsigned int first; + void (*irq_enable)(struct irq_data *); + void (*irq_disable)(struct irq_data *); + void (*irq_unmask)(struct irq_data *); + void (*irq_mask)(struct irq_data *); +}; + +struct gpio_device; + +struct gpio_chip { + const char *label; + struct gpio_device *gpiodev; + struct device *parent; + struct module *owner; + int (*request)(struct gpio_chip *, unsigned int); + void (*free)(struct gpio_chip *, unsigned int); + int (*get_direction)(struct gpio_chip *, unsigned int); + int (*direction_input)(struct gpio_chip *, unsigned int); + int (*direction_output)(struct gpio_chip *, unsigned int, int); + int (*get)(struct gpio_chip *, unsigned int); + int (*get_multiple)(struct gpio_chip *, long unsigned int *, long unsigned int *); + void (*set)(struct gpio_chip *, unsigned int, int); + void (*set_multiple)(struct gpio_chip *, long unsigned int *, long unsigned int *); + int (*set_config)(struct gpio_chip *, unsigned int, long unsigned int); + int (*to_irq)(struct gpio_chip *, unsigned int); + void (*dbg_show)(struct seq_file *, struct gpio_chip *); + int (*init_valid_mask)(struct gpio_chip *, long unsigned int *, unsigned int); + int (*add_pin_ranges)(struct gpio_chip *); + int base; + u16 ngpio; + u16 offset; + const char * const *names; + bool can_sleep; + long unsigned int (*read_reg)(void *); + void (*write_reg)(void *, long unsigned int); + bool be_bits; + void *reg_dat; + void *reg_set; + void *reg_clr; + void *reg_dir_out; + void *reg_dir_in; + bool bgpio_dir_unreadable; + int bgpio_bits; + spinlock_t bgpio_lock; + long unsigned int bgpio_data; + long unsigned int bgpio_dir; + struct gpio_irq_chip irq; + long unsigned int *valid_mask; + struct device_node *of_node; + unsigned int of_gpio_n_cells; + int (*of_xlate)(struct gpio_chip *, const struct of_phandle_args *, u32 *); +}; + +struct pinctrl_dev; + +struct pinctrl_map; + +struct pinctrl_ops { + int (*get_groups_count)(struct pinctrl_dev *); + const char * (*get_group_name)(struct pinctrl_dev *, unsigned int); + int (*get_group_pins)(struct pinctrl_dev *, unsigned int, const unsigned int **, unsigned int *); + void (*pin_dbg_show)(struct pinctrl_dev *, struct seq_file *, unsigned int); + int (*dt_node_to_map)(struct pinctrl_dev *, struct device_node *, struct pinctrl_map **, unsigned int *); + void (*dt_free_map)(struct pinctrl_dev *, struct pinctrl_map *, unsigned int); +}; + +struct pinctrl_desc; + +struct pinctrl_dev { + struct list_head node; + struct pinctrl_desc *desc; + struct xarray pin_desc_tree; + struct xarray pin_group_tree; + unsigned int num_groups; + struct xarray pin_function_tree; + unsigned int num_functions; + struct list_head gpio_ranges; + struct device *dev; + struct module *owner; + void *driver_data; + struct pinctrl *p; + struct pinctrl_state *hog_default; + struct pinctrl_state *hog_sleep; + struct mutex mutex; + struct dentry *device_root; +}; + +enum pinctrl_map_type { + PIN_MAP_TYPE_INVALID = 0, + PIN_MAP_TYPE_DUMMY_STATE = 1, + PIN_MAP_TYPE_MUX_GROUP = 2, + PIN_MAP_TYPE_CONFIGS_PIN = 3, + PIN_MAP_TYPE_CONFIGS_GROUP = 4, +}; + +struct pinctrl_map_mux { + const char *group; + const char *function; +}; + +struct pinctrl_map_configs { + const char *group_or_pin; + long unsigned int *configs; + unsigned int num_configs; +}; + +struct pinctrl_map { + const char *dev_name; + const char *name; + enum pinctrl_map_type type; + const char *ctrl_dev_name; + union { + struct pinctrl_map_mux mux; + struct pinctrl_map_configs configs; + } data; +}; + +struct pinmux_ops; + +struct pinconf_ops; + +struct pinconf_generic_params; + +struct pin_config_item; + +struct pinctrl_desc { + const char *name; + const struct pinctrl_pin_desc *pins; + unsigned int npins; + const struct pinctrl_ops *pctlops; + const struct pinmux_ops *pmxops; + const struct pinconf_ops *confops; + struct module *owner; + unsigned int num_custom_params; + const struct pinconf_generic_params *custom_params; + const struct pin_config_item *custom_conf_items; + bool link_consumers; +}; + +struct pinmux_ops { + int (*request)(struct pinctrl_dev *, unsigned int); + int (*free)(struct pinctrl_dev *, unsigned int); + int (*get_functions_count)(struct pinctrl_dev *); + const char * (*get_function_name)(struct pinctrl_dev *, unsigned int); + int (*get_function_groups)(struct pinctrl_dev *, unsigned int, const char * const **, unsigned int *); + int (*set_mux)(struct pinctrl_dev *, unsigned int, unsigned int); + int (*gpio_request_enable)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int); + void (*gpio_disable_free)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int); + int (*gpio_set_direction)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int, bool); + bool strict; +}; + +struct pinconf_ops { + bool is_generic; + int (*pin_config_get)(struct pinctrl_dev *, unsigned int, long unsigned int *); + int (*pin_config_set)(struct pinctrl_dev *, unsigned int, long unsigned int *, unsigned int); + int (*pin_config_group_get)(struct pinctrl_dev *, unsigned int, long unsigned int *); + int (*pin_config_group_set)(struct pinctrl_dev *, unsigned int, long unsigned int *, unsigned int); + void (*pin_config_dbg_show)(struct pinctrl_dev *, struct seq_file *, unsigned int); + void (*pin_config_group_dbg_show)(struct pinctrl_dev *, struct seq_file *, unsigned int); + void (*pin_config_config_dbg_show)(struct pinctrl_dev *, struct seq_file *, long unsigned int); +}; + +enum pin_config_param { + PIN_CONFIG_BIAS_BUS_HOLD = 0, + PIN_CONFIG_BIAS_DISABLE = 1, + PIN_CONFIG_BIAS_HIGH_IMPEDANCE = 2, + PIN_CONFIG_BIAS_PULL_DOWN = 3, + PIN_CONFIG_BIAS_PULL_PIN_DEFAULT = 4, + PIN_CONFIG_BIAS_PULL_UP = 5, + PIN_CONFIG_DRIVE_OPEN_DRAIN = 6, + PIN_CONFIG_DRIVE_OPEN_SOURCE = 7, + PIN_CONFIG_DRIVE_PUSH_PULL = 8, + PIN_CONFIG_DRIVE_STRENGTH = 9, + PIN_CONFIG_DRIVE_STRENGTH_UA = 10, + PIN_CONFIG_INPUT_DEBOUNCE = 11, + PIN_CONFIG_INPUT_ENABLE = 12, + PIN_CONFIG_INPUT_SCHMITT = 13, + PIN_CONFIG_INPUT_SCHMITT_ENABLE = 14, + PIN_CONFIG_MODE_LOW_POWER = 15, + PIN_CONFIG_MODE_PWM = 16, + PIN_CONFIG_OUTPUT = 17, + PIN_CONFIG_OUTPUT_ENABLE = 18, + PIN_CONFIG_PERSIST_STATE = 19, + PIN_CONFIG_POWER_SOURCE = 20, + PIN_CONFIG_SKEW_DELAY = 21, + PIN_CONFIG_SLEEP_HARDWARE_STATE = 22, + PIN_CONFIG_SLEW_RATE = 23, + PIN_CONFIG_END = 127, + PIN_CONFIG_MAX = 255, +}; + +struct pinconf_generic_params { + const char * const property; + enum pin_config_param param; + u32 default_value; +}; + +struct pin_config_item { + const enum pin_config_param param; + const char * const display; + const char * const format; + bool has_arg; +}; + +struct gpio_desc___2; + +struct gpio_device { + int id; + struct device dev; + struct cdev chrdev; + struct device *mockdev; + struct module *owner; + struct gpio_chip *chip; + struct gpio_desc___2 *descs; + int base; + u16 ngpio; + const char *label; + void *data; + struct list_head list; + struct blocking_notifier_head notifier; + struct list_head pin_ranges; +}; + +struct gpio_desc___2 { + struct gpio_device *gdev; + long unsigned int flags; + const char *label; + const char *name; + struct device_node *hog; + unsigned int debounce_period_us; +}; + +struct pinctrl_setting_mux { + unsigned int group; + unsigned int func; +}; + +struct pinctrl_setting_configs { + unsigned int group_or_pin; + long unsigned int *configs; + unsigned int num_configs; +}; + +struct pinctrl_setting { + struct list_head node; + enum pinctrl_map_type type; + struct pinctrl_dev *pctldev; + const char *dev_name; + union { + struct pinctrl_setting_mux mux; + struct pinctrl_setting_configs configs; + } data; +}; + +struct pin_desc { + struct pinctrl_dev *pctldev; + const char *name; + bool dynamic_name; + void *drv_data; + unsigned int mux_usecount; + const char *mux_owner; + const struct pinctrl_setting_mux *mux_setting; + const char *gpio_owner; +}; + +struct pinctrl_maps { + struct list_head node; + const struct pinctrl_map *maps; + unsigned int num_maps; +}; + +struct group_desc { + const char *name; + int *pins; + int num_pins; + void *data; +}; + +struct pctldev; + +struct function_desc { + const char *name; + const char **group_names; + int num_group_names; + void *data; +}; + +struct pinctrl_dt_map { + struct list_head node; + struct pinctrl_dev *pctldev; + struct pinctrl_map *map; + unsigned int num_maps; +}; + +struct regmap_irq_chip_data; + +struct as3722 { + struct device *dev; + struct regmap *regmap; + int chip_irq; + long unsigned int irq_flags; + bool en_intern_int_pullup; + bool en_intern_i2c_pullup; + bool en_ac_ok_pwr_on; + struct regmap_irq_chip_data *irq_data; +}; + +struct as3722_pin_function { + const char *name; + const char * const *groups; + unsigned int ngroups; + int mux_option; +}; + +struct as3722_gpio_pin_control { + unsigned int mode_prop; + int io_function; +}; + +struct as3722_pingroup { + const char *name; + const unsigned int pins[1]; + unsigned int npins; +}; + +struct as3722_pctrl_info { + struct device *dev; + struct pinctrl_dev *pctl; + struct as3722 *as3722; + struct gpio_chip gpio_chip; + int pins_current_opt[8]; + const struct as3722_pin_function *functions; + unsigned int num_functions; + const struct as3722_pingroup *pin_groups; + int num_pin_groups; + const struct pinctrl_pin_desc *pins; + unsigned int num_pins; + struct as3722_gpio_pin_control gpio_control[8]; +}; + +enum as3722_pinmux_option { + AS3722_PINMUX_GPIO = 0, + AS3722_PINMUX_INTERRUPT_OUT = 1, + AS3722_PINMUX_VSUB_VBAT_UNDEB_LOW_OUT = 2, + AS3722_PINMUX_GPIO_INTERRUPT = 3, + AS3722_PINMUX_PWM_INPUT = 4, + AS3722_PINMUX_VOLTAGE_IN_STBY = 5, + AS3722_PINMUX_OC_PG_SD0 = 6, + AS3722_PINMUX_PG_OUT = 7, + AS3722_PINMUX_CLK32K_OUT = 8, + AS3722_PINMUX_WATCHDOG_INPUT = 9, + AS3722_PINMUX_SOFT_RESET_IN = 11, + AS3722_PINMUX_PWM_OUTPUT = 12, + AS3722_PINMUX_VSUB_VBAT_LOW_DEB_OUT = 13, + AS3722_PINMUX_OC_PG_SD6 = 14, +}; + +struct amd_pingroup { + const char *name; + const unsigned int *pins; + unsigned int npins; +}; + +struct amd_gpio { + raw_spinlock_t lock; + void *base; + const struct amd_pingroup *groups; + u32 ngroups; + struct pinctrl_dev *pctrl; + struct gpio_chip gc; + unsigned int hwbank_num; + struct resource *res; + struct platform_device *pdev; + u32 *saved_regs; + int irq; +}; + +struct bm1880_pctrl_group; + +struct bm1880_pinmux_function; + +struct bm1880_pinconf_data; + +struct bm1880_pinctrl { + void *base; + struct pinctrl_dev *pctrldev; + const struct bm1880_pctrl_group *groups; + unsigned int ngroups; + const struct bm1880_pinmux_function *funcs; + unsigned int nfuncs; + const struct bm1880_pinconf_data *pinconf; +}; + +struct bm1880_pctrl_group { + const char *name; + const unsigned int *pins; + const unsigned int npins; +}; + +struct bm1880_pinmux_function { + const char *name; + const char * const *groups; + unsigned int ngroups; + u32 mux_val; + u32 mux; + u8 mux_shift; +}; + +struct bm1880_pinconf_data { + u32 drv_bits; +}; + +enum bm1880_pinmux_functions { + F_nand = 0, + F_spi = 1, + F_emmc = 2, + F_sdio = 3, + F_eth0 = 4, + F_pwm0 = 5, + F_pwm1 = 6, + F_pwm2 = 7, + F_pwm3 = 8, + F_pwm4 = 9, + F_pwm5 = 10, + F_pwm6 = 11, + F_pwm7 = 12, + F_pwm8 = 13, + F_pwm9 = 14, + F_pwm10 = 15, + F_pwm11 = 16, + F_pwm12 = 17, + F_pwm13 = 18, + F_pwm14 = 19, + F_pwm15 = 20, + F_pwm16 = 21, + F_pwm17 = 22, + F_pwm18 = 23, + F_pwm19 = 24, + F_pwm20 = 25, + F_pwm21 = 26, + F_pwm22 = 27, + F_pwm23 = 28, + F_pwm24 = 29, + F_pwm25 = 30, + F_pwm26 = 31, + F_pwm27 = 32, + F_pwm28 = 33, + F_pwm29 = 34, + F_pwm30 = 35, + F_pwm31 = 36, + F_pwm32 = 37, + F_pwm33 = 38, + F_pwm34 = 39, + F_pwm35 = 40, + F_pwm36 = 41, + F_pwm37 = 42, + F_i2c0 = 43, + F_i2c1 = 44, + F_i2c2 = 45, + F_i2c3 = 46, + F_i2c4 = 47, + F_uart0 = 48, + F_uart1 = 49, + F_uart2 = 50, + F_uart3 = 51, + F_uart4 = 52, + F_uart5 = 53, + F_uart6 = 54, + F_uart7 = 55, + F_uart8 = 56, + F_uart9 = 57, + F_uart10 = 58, + F_uart11 = 59, + F_uart12 = 60, + F_uart13 = 61, + F_uart14 = 62, + F_uart15 = 63, + F_gpio0 = 64, + F_gpio1 = 65, + F_gpio2 = 66, + F_gpio3 = 67, + F_gpio4 = 68, + F_gpio5 = 69, + F_gpio6 = 70, + F_gpio7 = 71, + F_gpio8 = 72, + F_gpio9 = 73, + F_gpio10 = 74, + F_gpio11 = 75, + F_gpio12 = 76, + F_gpio13 = 77, + F_gpio14 = 78, + F_gpio15 = 79, + F_gpio16 = 80, + F_gpio17 = 81, + F_gpio18 = 82, + F_gpio19 = 83, + F_gpio20 = 84, + F_gpio21 = 85, + F_gpio22 = 86, + F_gpio23 = 87, + F_gpio24 = 88, + F_gpio25 = 89, + F_gpio26 = 90, + F_gpio27 = 91, + F_gpio28 = 92, + F_gpio29 = 93, + F_gpio30 = 94, + F_gpio31 = 95, + F_gpio32 = 96, + F_gpio33 = 97, + F_gpio34 = 98, + F_gpio35 = 99, + F_gpio36 = 100, + F_gpio37 = 101, + F_gpio38 = 102, + F_gpio39 = 103, + F_gpio40 = 104, + F_gpio41 = 105, + F_gpio42 = 106, + F_gpio43 = 107, + F_gpio44 = 108, + F_gpio45 = 109, + F_gpio46 = 110, + F_gpio47 = 111, + F_gpio48 = 112, + F_gpio49 = 113, + F_gpio50 = 114, + F_gpio51 = 115, + F_gpio52 = 116, + F_gpio53 = 117, + F_gpio54 = 118, + F_gpio55 = 119, + F_gpio56 = 120, + F_gpio57 = 121, + F_gpio58 = 122, + F_gpio59 = 123, + F_gpio60 = 124, + F_gpio61 = 125, + F_gpio62 = 126, + F_gpio63 = 127, + F_gpio64 = 128, + F_gpio65 = 129, + F_gpio66 = 130, + F_gpio67 = 131, + F_eth1 = 132, + F_i2s0 = 133, + F_i2s0_mclkin = 134, + F_i2s1 = 135, + F_i2s1_mclkin = 136, + F_spi0 = 137, + F_max = 138, +}; + +struct meson_pmx_group { + const char *name; + const unsigned int *pins; + unsigned int num_pins; + const void *data; +}; + +struct meson_pmx_func { + const char *name; + const char * const *groups; + unsigned int num_groups; +}; + +struct meson_reg_desc { + unsigned int reg; + unsigned int bit; +}; + +enum meson_reg_type { + REG_PULLEN = 0, + REG_PULL = 1, + REG_DIR = 2, + REG_OUT = 3, + REG_IN = 4, + REG_DS = 5, + NUM_REG = 6, +}; + +enum meson_pinconf_drv { + MESON_PINCONF_DRV_500UA = 0, + MESON_PINCONF_DRV_2500UA = 1, + MESON_PINCONF_DRV_3000UA = 2, + MESON_PINCONF_DRV_4000UA = 3, +}; + +struct meson_bank { + const char *name; + unsigned int first; + unsigned int last; + int irq_first; + int irq_last; + struct meson_reg_desc regs[6]; +}; + +struct meson_pinctrl; + +struct meson_pinctrl_data { + const char *name; + const struct pinctrl_pin_desc *pins; + struct meson_pmx_group *groups; + struct meson_pmx_func *funcs; + unsigned int num_pins; + unsigned int num_groups; + unsigned int num_funcs; + struct meson_bank *banks; + unsigned int num_banks; + const struct pinmux_ops *pmx_ops; + void *pmx_data; + int (*parse_dt)(struct meson_pinctrl *); +}; + +struct meson_pinctrl { + struct device *dev; + struct pinctrl_dev *pcdev; + struct pinctrl_desc desc; + struct meson_pinctrl_data *data; + struct regmap *reg_mux; + struct regmap *reg_pullen; + struct regmap *reg_pull; + struct regmap *reg_gpio; + struct regmap *reg_ds; + struct gpio_chip chip; + struct device_node *of_node; +}; + +struct meson8_pmx_data { + bool is_gpio; + unsigned int reg; + unsigned int bit; +}; + +struct meson_pmx_bank { + const char *name; + unsigned int first; + unsigned int last; + unsigned int reg; + unsigned int offset; +}; + +struct meson_axg_pmx_data { + struct meson_pmx_bank *pmx_banks; + unsigned int num_pmx_banks; +}; + +struct meson_pmx_axg_data { + unsigned int func; +}; + +struct extcon_dev; + +struct regulator_dev; + +struct regulator_ops { + int (*list_voltage)(struct regulator_dev *, unsigned int); + int (*set_voltage)(struct regulator_dev *, int, int, unsigned int *); + int (*map_voltage)(struct regulator_dev *, int, int); + int (*set_voltage_sel)(struct regulator_dev *, unsigned int); + int (*get_voltage)(struct regulator_dev *); + int (*get_voltage_sel)(struct regulator_dev *); + int (*set_current_limit)(struct regulator_dev *, int, int); + int (*get_current_limit)(struct regulator_dev *); + int (*set_input_current_limit)(struct regulator_dev *, int); + int (*set_over_current_protection)(struct regulator_dev *, int, int, bool); + int (*set_over_voltage_protection)(struct regulator_dev *, int, int, bool); + int (*set_under_voltage_protection)(struct regulator_dev *, int, int, bool); + int (*set_thermal_protection)(struct regulator_dev *, int, int, bool); + int (*set_active_discharge)(struct regulator_dev *, bool); + int (*enable)(struct regulator_dev *); + int (*disable)(struct regulator_dev *); + int (*is_enabled)(struct regulator_dev *); + int (*set_mode)(struct regulator_dev *, unsigned int); + unsigned int (*get_mode)(struct regulator_dev *); + int (*get_error_flags)(struct regulator_dev *, unsigned int *); + int (*enable_time)(struct regulator_dev *); + int (*set_ramp_delay)(struct regulator_dev *, int); + int (*set_voltage_time)(struct regulator_dev *, int, int); + int (*set_voltage_time_sel)(struct regulator_dev *, unsigned int, unsigned int); + int (*set_soft_start)(struct regulator_dev *); + int (*get_status)(struct regulator_dev *); + unsigned int (*get_optimum_mode)(struct regulator_dev *, int, int, int); + int (*set_load)(struct regulator_dev *, int); + int (*set_bypass)(struct regulator_dev *, bool); + int (*get_bypass)(struct regulator_dev *, bool *); + int (*set_suspend_voltage)(struct regulator_dev *, int); + int (*set_suspend_enable)(struct regulator_dev *); + int (*set_suspend_disable)(struct regulator_dev *); + int (*set_suspend_mode)(struct regulator_dev *, unsigned int); + int (*resume)(struct regulator_dev *); + int (*set_pull_down)(struct regulator_dev *); +}; + +struct regulator_coupler; + +struct coupling_desc { + struct regulator_dev **coupled_rdevs; + struct regulator_coupler *coupler; + int n_resolved; + int n_coupled; +}; + +struct regulator_desc; + +struct regulation_constraints; + +struct regulator_enable_gpio; + +struct regulator_dev { + const struct regulator_desc *desc; + int exclusive; + u32 use_count; + u32 open_count; + u32 bypass_count; + struct list_head list; + struct list_head consumer_list; + struct coupling_desc coupling_desc; + struct blocking_notifier_head notifier; + struct ww_mutex mutex; + struct task_struct *mutex_owner; + int ref_cnt; + struct module *owner; + struct device dev; + struct regulation_constraints *constraints; + struct regulator *supply; + const char *supply_name; + struct regmap *regmap; + struct delayed_work disable_work; + void *reg_data; + struct dentry *debugfs; + struct regulator_enable_gpio *ena_pin; + unsigned int ena_gpio_state: 1; + unsigned int is_switch: 1; + ktime_t last_off; + int cached_err; + bool use_cached_err; + spinlock_t err_lock; +}; + +enum regulator_type { + REGULATOR_VOLTAGE = 0, + REGULATOR_CURRENT = 1, +}; + +struct regulator_config; + +struct regulator_desc { + const char *name; + const char *supply_name; + const char *of_match; + bool of_match_full_name; + const char *regulators_node; + int (*of_parse_cb)(struct device_node *, const struct regulator_desc *, struct regulator_config *); + int id; + unsigned int continuous_voltage_range: 1; + unsigned int n_voltages; + unsigned int n_current_limits; + const struct regulator_ops *ops; + int irq; + enum regulator_type type; + struct module *owner; + unsigned int min_uV; + unsigned int uV_step; + unsigned int linear_min_sel; + int fixed_uV; + unsigned int ramp_delay; + int min_dropout_uV; + const struct linear_range *linear_ranges; + const unsigned int *linear_range_selectors; + int n_linear_ranges; + const unsigned int *volt_table; + const unsigned int *curr_table; + unsigned int vsel_range_reg; + unsigned int vsel_range_mask; + unsigned int vsel_reg; + unsigned int vsel_mask; + unsigned int vsel_step; + unsigned int csel_reg; + unsigned int csel_mask; + unsigned int apply_reg; + unsigned int apply_bit; + unsigned int enable_reg; + unsigned int enable_mask; + unsigned int enable_val; + unsigned int disable_val; + bool enable_is_inverted; + unsigned int bypass_reg; + unsigned int bypass_mask; + unsigned int bypass_val_on; + unsigned int bypass_val_off; + unsigned int active_discharge_on; + unsigned int active_discharge_off; + unsigned int active_discharge_mask; + unsigned int active_discharge_reg; + unsigned int soft_start_reg; + unsigned int soft_start_mask; + unsigned int soft_start_val_on; + unsigned int pull_down_reg; + unsigned int pull_down_mask; + unsigned int pull_down_val_on; + unsigned int ramp_reg; + unsigned int ramp_mask; + const unsigned int *ramp_delay_table; + unsigned int n_ramp_values; + unsigned int enable_time; + unsigned int off_on_delay; + unsigned int poll_enabled_time; + unsigned int (*of_map_mode)(unsigned int); +}; + +struct regulator_init_data; + +struct regulator_config { + struct device *dev; + const struct regulator_init_data *init_data; + void *driver_data; + struct device_node *of_node; + struct regmap *regmap; + struct gpio_desc *ena_gpiod; +}; + +struct regulator_state { + int uV; + int min_uV; + int max_uV; + unsigned int mode; + int enabled; + bool changeable; +}; + +struct notification_limit { + int prot; + int err; + int warn; +}; + +struct regulation_constraints { + const char *name; + int min_uV; + int max_uV; + int uV_offset; + int min_uA; + int max_uA; + int ilim_uA; + int system_load; + u32 *max_spread; + int max_uV_step; + unsigned int valid_modes_mask; + unsigned int valid_ops_mask; + int input_uV; + struct regulator_state state_disk; + struct regulator_state state_mem; + struct regulator_state state_standby; + struct notification_limit over_curr_limits; + struct notification_limit over_voltage_limits; + struct notification_limit under_voltage_limits; + struct notification_limit temp_limits; + suspend_state_t initial_state; + unsigned int initial_mode; + unsigned int ramp_delay; + unsigned int settling_time; + unsigned int settling_time_up; + unsigned int settling_time_down; + unsigned int enable_time; + unsigned int active_discharge; + unsigned int always_on: 1; + unsigned int boot_on: 1; + unsigned int apply_uV: 1; + unsigned int ramp_disable: 1; + unsigned int soft_start: 1; + unsigned int pull_down: 1; + unsigned int over_current_protection: 1; + unsigned int over_current_detection: 1; + unsigned int over_voltage_detection: 1; + unsigned int under_voltage_detection: 1; + unsigned int over_temp_detection: 1; +}; + +struct regulator_consumer_supply; + +struct regulator_init_data { + const char *supply_regulator; + struct regulation_constraints constraints; + int num_consumer_supplies; + struct regulator_consumer_supply *consumer_supplies; + int (*regulator_init)(void *); + void *driver_data; +}; + +enum palmas_usb_state { + PALMAS_USB_STATE_DISCONNECT = 0, + PALMAS_USB_STATE_VBUS = 1, + PALMAS_USB_STATE_ID = 2, +}; + +struct palmas_gpadc; + +struct i2c_client; + +struct palmas_pmic_driver_data; + +struct palmas_pmic; + +struct palmas_resource; + +struct palmas_usb; + +struct palmas { + struct device *dev; + struct i2c_client *i2c_clients[3]; + struct regmap *regmap[3]; + int id; + unsigned int features; + int irq; + u32 irq_mask; + struct mutex irq_lock; + struct regmap_irq_chip_data *irq_data; + struct palmas_pmic_driver_data *pmic_ddata; + struct palmas_pmic *pmic; + struct palmas_gpadc *gpadc; + struct palmas_resource *resource; + struct palmas_usb *usb; + u8 gpio_muxed; + u8 led_muxed; + u8 pwm_muxed; +}; + +struct of_regulator_match; + +struct palmas_regs_info; + +struct palmas_sleep_requestor_info; + +struct palmas_pmic_platform_data; + +struct palmas_pmic_driver_data { + int smps_start; + int smps_end; + int ldo_begin; + int ldo_end; + int max_reg; + bool has_regen3; + struct palmas_regs_info *palmas_regs_info; + struct of_regulator_match *palmas_matches; + struct palmas_sleep_requestor_info *sleep_req_info; + int (*smps_register)(struct palmas_pmic *, struct palmas_pmic_driver_data *, struct palmas_pmic_platform_data *, const char *, struct regulator_config); + int (*ldo_register)(struct palmas_pmic *, struct palmas_pmic_driver_data *, struct palmas_pmic_platform_data *, const char *, struct regulator_config); +}; + +struct palmas_pmic { + struct palmas *palmas; + struct device *dev; + struct regulator_desc desc[27]; + struct mutex mutex; + int smps123; + int smps457; + int smps12; + int range[10]; + unsigned int ramp_delay[10]; + unsigned int current_reg_mode[10]; +}; + +struct palmas_resource { + struct palmas *palmas; + struct device *dev; +}; + +struct palmas_usb { + struct palmas *palmas; + struct device *dev; + struct extcon_dev *edev; + int id_otg_irq; + int id_irq; + int vbus_otg_irq; + int vbus_irq; + int gpio_id_irq; + int gpio_vbus_irq; + struct gpio_desc *id_gpiod; + struct gpio_desc *vbus_gpiod; + long unsigned int sw_debounce_jiffies; + struct delayed_work wq_detectid; + enum palmas_usb_state linkstat; + int wakeup; + bool enable_vbus_detection; + bool enable_id_detection; + bool enable_gpio_id_detection; + bool enable_gpio_vbus_detection; +}; + +struct palmas_sleep_requestor_info { + int id; + int reg_offset; + int bit_pos; +}; + +struct palmas_regs_info { + char *name; + char *sname; + u8 vsel_addr; + u8 ctrl_addr; + u8 tstep_addr; + int sleep_id; +}; + +struct palmas_reg_init; + +struct palmas_pmic_platform_data { + struct regulator_init_data *reg_data[27]; + struct palmas_reg_init *reg_init[27]; + int ldo6_vibrator; + bool enable_ldo8_tracking; +}; + +struct palmas_reg_init { + int warm_reset; + int roof_floor; + int mode_sleep; + u8 vsel; +}; + +enum palmas_regulators { + PALMAS_REG_SMPS12 = 0, + PALMAS_REG_SMPS123 = 1, + PALMAS_REG_SMPS3 = 2, + PALMAS_REG_SMPS45 = 3, + PALMAS_REG_SMPS457 = 4, + PALMAS_REG_SMPS6 = 5, + PALMAS_REG_SMPS7 = 6, + PALMAS_REG_SMPS8 = 7, + PALMAS_REG_SMPS9 = 8, + PALMAS_REG_SMPS10_OUT2 = 9, + PALMAS_REG_SMPS10_OUT1 = 10, + PALMAS_REG_LDO1 = 11, + PALMAS_REG_LDO2 = 12, + PALMAS_REG_LDO3 = 13, + PALMAS_REG_LDO4 = 14, + PALMAS_REG_LDO5 = 15, + PALMAS_REG_LDO6 = 16, + PALMAS_REG_LDO7 = 17, + PALMAS_REG_LDO8 = 18, + PALMAS_REG_LDO9 = 19, + PALMAS_REG_LDOLN = 20, + PALMAS_REG_LDOUSB = 21, + PALMAS_REG_REGEN1 = 22, + PALMAS_REG_REGEN2 = 23, + PALMAS_REG_REGEN3 = 24, + PALMAS_REG_SYSEN1 = 25, + PALMAS_REG_SYSEN2 = 26, + PALMAS_NUM_REGS = 27, +}; + +struct palmas_pin_function { + const char *name; + const char * const *groups; + unsigned int ngroups; +}; + +struct palmas_pingroup; + +struct palmas_pctrl_chip_info { + struct device *dev; + struct pinctrl_dev *pctl; + struct palmas *palmas; + int pins_current_opt[26]; + const struct palmas_pin_function *functions; + unsigned int num_functions; + const struct palmas_pingroup *pin_groups; + int num_pin_groups; + const struct pinctrl_pin_desc *pins; + unsigned int num_pins; +}; + +struct palmas_pin_info; + +struct palmas_pingroup { + const char *name; + const unsigned int pins[1]; + unsigned int npins; + unsigned int mux_reg_base; + unsigned int mux_reg_add; + unsigned int mux_reg_mask; + unsigned int mux_bit_shift; + const struct palmas_pin_info *opt[4]; +}; + +enum palmas_pinmux { + PALMAS_PINMUX_OPTION0 = 0, + PALMAS_PINMUX_OPTION1 = 1, + PALMAS_PINMUX_OPTION2 = 2, + PALMAS_PINMUX_OPTION3 = 3, + PALMAS_PINMUX_GPIO = 4, + PALMAS_PINMUX_LED = 5, + PALMAS_PINMUX_PWM = 6, + PALMAS_PINMUX_REGEN = 7, + PALMAS_PINMUX_SYSEN = 8, + PALMAS_PINMUX_CLK32KGAUDIO = 9, + PALMAS_PINMUX_ID = 10, + PALMAS_PINMUX_VBUS_DET = 11, + PALMAS_PINMUX_CHRG_DET = 12, + PALMAS_PINMUX_VAC = 13, + PALMAS_PINMUX_VACOK = 14, + PALMAS_PINMUX_POWERGOOD = 15, + PALMAS_PINMUX_USB_PSEL = 16, + PALMAS_PINMUX_MSECURE = 17, + PALMAS_PINMUX_PWRHOLD = 18, + PALMAS_PINMUX_INT = 19, + PALMAS_PINMUX_NRESWARM = 20, + PALMAS_PINMUX_SIMRSTO = 21, + PALMAS_PINMUX_SIMRSTI = 22, + PALMAS_PINMUX_LOW_VBAT = 23, + PALMAS_PINMUX_WIRELESS_CHRG1 = 24, + PALMAS_PINMUX_RCM = 25, + PALMAS_PINMUX_PWRDOWN = 26, + PALMAS_PINMUX_GPADC_START = 27, + PALMAS_PINMUX_RESET_IN = 28, + PALMAS_PINMUX_NSLEEP = 29, + PALMAS_PINMUX_ENABLE = 30, + PALMAS_PINMUX_NA = 65535, +}; + +struct palmas_pins_pullup_dn_info { + int pullup_dn_reg_base; + int pullup_dn_reg_add; + int pullup_dn_mask; + int normal_val; + int pull_up_val; + int pull_dn_val; +}; + +struct palmas_pins_od_info { + int od_reg_base; + int od_reg_add; + int od_mask; + int od_enable; + int od_disable; +}; + +struct palmas_pin_info { + enum palmas_pinmux mux_opt; + const struct palmas_pins_pullup_dn_info *pud_info; + const struct palmas_pins_od_info *od_info; +}; + +struct palmas_pinctrl_data { + const struct palmas_pingroup *pin_groups; + int num_pin_groups; +}; + +enum rockchip_pinctrl_type { + PX30 = 0, + RV1108 = 1, + RK2928 = 2, + RK3066B = 3, + RK3128 = 4, + RK3188 = 5, + RK3288 = 6, + RK3308 = 7, + RK3368 = 8, + RK3399 = 9, + RK3568 = 10, +}; + +struct rockchip_gpio_regs { + u32 port_dr; + u32 port_ddr; + u32 int_en; + u32 int_mask; + u32 int_type; + u32 int_polarity; + u32 int_bothedge; + u32 int_status; + u32 int_rawstatus; + u32 debounce; + u32 dbclk_div_en; + u32 dbclk_div_con; + u32 port_eoi; + u32 ext_port; + u32 version_id; +}; + +struct rockchip_iomux { + int type; + int offset; +}; + +enum rockchip_pin_drv_type { + DRV_TYPE_IO_DEFAULT = 0, + DRV_TYPE_IO_1V8_OR_3V0 = 1, + DRV_TYPE_IO_1V8_ONLY = 2, + DRV_TYPE_IO_1V8_3V0_AUTO = 3, + DRV_TYPE_IO_3V3_ONLY = 4, + DRV_TYPE_MAX = 5, +}; + +enum rockchip_pin_pull_type { + PULL_TYPE_IO_DEFAULT = 0, + PULL_TYPE_IO_1V8_ONLY = 1, + PULL_TYPE_MAX = 2, +}; + +struct rockchip_drv { + enum rockchip_pin_drv_type drv_type; + int offset; +}; + +struct rockchip_pinctrl; + +struct rockchip_pin_bank { + struct device *dev; + void *reg_base; + struct regmap *regmap_pull; + struct clk *clk; + struct clk *db_clk; + int irq; + u32 saved_masks; + u32 pin_base; + u8 nr_pins; + char *name; + u8 bank_num; + struct rockchip_iomux iomux[4]; + struct rockchip_drv drv[4]; + enum rockchip_pin_pull_type pull_type[4]; + bool valid; + struct device_node *of_node; + struct rockchip_pinctrl *drvdata; + struct irq_domain *domain; + struct gpio_chip gpio_chip; + struct pinctrl_gpio_range grange; + raw_spinlock_t slock; + const struct rockchip_gpio_regs *gpio_regs; + u32 gpio_type; + u32 toggle_edge_mode; + u32 recalced_mask; + u32 route_mask; + struct list_head deferred_output; + struct mutex deferred_lock; +}; + +struct rockchip_pin_ctrl; + +struct rockchip_pin_group; + +struct rockchip_pmx_func; + +struct rockchip_pinctrl { + struct regmap *regmap_base; + int reg_size; + struct regmap *regmap_pull; + struct regmap *regmap_pmu; + struct device *dev; + struct rockchip_pin_ctrl *ctrl; + struct pinctrl_desc pctl; + struct pinctrl_dev *pctl_dev; + struct rockchip_pin_group *groups; + unsigned int ngroups; + struct rockchip_pmx_func *functions; + unsigned int nfunctions; +}; + +struct rockchip_mux_recalced_data { + u8 num; + u8 pin; + u32 reg; + u8 bit; + u8 mask; +}; + +enum rockchip_mux_route_location { + ROCKCHIP_ROUTE_SAME = 0, + ROCKCHIP_ROUTE_PMU = 1, + ROCKCHIP_ROUTE_GRF = 2, +}; + +struct rockchip_mux_route_data { + u8 bank_num; + u8 pin; + u8 func; + enum rockchip_mux_route_location route_location; + u32 route_offset; + u32 route_val; +}; + +struct rockchip_pin_ctrl { + struct rockchip_pin_bank *pin_banks; + u32 nr_banks; + u32 nr_pins; + char *label; + enum rockchip_pinctrl_type type; + int grf_mux_offset; + int pmu_mux_offset; + int grf_drv_offset; + int pmu_drv_offset; + struct rockchip_mux_recalced_data *iomux_recalced; + u32 niomux_recalced; + struct rockchip_mux_route_data *iomux_routes; + u32 niomux_routes; + void (*pull_calc_reg)(struct rockchip_pin_bank *, int, struct regmap **, int *, u8 *); + void (*drv_calc_reg)(struct rockchip_pin_bank *, int, struct regmap **, int *, u8 *); + int (*schmitt_calc_reg)(struct rockchip_pin_bank *, int, struct regmap **, int *, u8 *); +}; + +struct rockchip_pin_config { + unsigned int func; + long unsigned int *configs; + unsigned int nconfigs; +}; + +struct rockchip_pin_output_deferred { + struct list_head head; + unsigned int pin; + u32 arg; +}; + +struct rockchip_pin_group { + const char *name; + unsigned int npins; + unsigned int *pins; + struct rockchip_pin_config *data; +}; + +struct rockchip_pmx_func { + const char *name; + const char **groups; + u8 ngroups; +}; + +struct pcs_pdata { + int irq; + void (*rearm)(); +}; + +struct pcs_func_vals { + void *reg; + unsigned int val; + unsigned int mask; +}; + +struct pcs_conf_vals { + enum pin_config_param param; + unsigned int val; + unsigned int enable; + unsigned int disable; + unsigned int mask; +}; + +struct pcs_conf_type { + const char *name; + enum pin_config_param param; +}; + +struct pcs_function { + const char *name; + struct pcs_func_vals *vals; + unsigned int nvals; + const char **pgnames; + int npgnames; + struct pcs_conf_vals *conf; + int nconfs; + struct list_head node; +}; + +struct pcs_gpiofunc_range { + unsigned int offset; + unsigned int npins; + unsigned int gpiofunc; + struct list_head node; +}; + +struct pcs_data { + struct pinctrl_pin_desc *pa; + int cur; +}; + +struct pcs_soc_data { + unsigned int flags; + int irq; + unsigned int irq_enable_mask; + unsigned int irq_status_mask; + void (*rearm)(); +}; + +struct pcs_device { + struct resource *res; + void *base; + void *saved_vals; + unsigned int size; + struct device *dev; + struct device_node *np; + struct pinctrl_dev *pctl; + unsigned int flags; + struct property *missing_nr_pinctrl_cells; + struct pcs_soc_data socdata; + raw_spinlock_t lock; + struct mutex mutex; + unsigned int width; + unsigned int fmask; + unsigned int fshift; + unsigned int foff; + unsigned int fmax; + bool bits_per_mux; + unsigned int bits_per_pin; + struct pcs_data pins; + struct list_head gpiofuncs; + struct list_head irqs; + struct irq_chip chip; + struct irq_domain *domain; + struct pinctrl_desc desc; + unsigned int (*read)(void *); + void (*write)(unsigned int, void *); +}; + +struct pcs_interrupt { + void *reg; + irq_hw_number_t hwirq; + unsigned int irq; + struct list_head node; +}; + +struct i2c_device_id { + char name[20]; + kernel_ulong_t driver_data; +}; + +struct software_node { + const char *name; + const struct software_node *parent; + const struct property_entry *properties; +}; + +struct i2c_msg { + __u16 addr; + __u16 flags; + __u16 len; + __u8 *buf; +}; + +union i2c_smbus_data { + __u8 byte; + __u16 word; + __u8 block[34]; +}; + +enum i2c_slave_event { + I2C_SLAVE_READ_REQUESTED = 0, + I2C_SLAVE_WRITE_REQUESTED = 1, + I2C_SLAVE_READ_PROCESSED = 2, + I2C_SLAVE_WRITE_RECEIVED = 3, + I2C_SLAVE_STOP = 4, +}; + +typedef int (*i2c_slave_cb_t)(struct i2c_client *, enum i2c_slave_event, u8 *); + +struct i2c_adapter; + +struct i2c_client { + short unsigned int flags; + short unsigned int addr; + char name[20]; + struct i2c_adapter *adapter; + struct device dev; + int init_irq; + int irq; + struct list_head detected; + i2c_slave_cb_t slave_cb; + void *devres_group_id; +}; + +enum i2c_alert_protocol { + I2C_PROTOCOL_SMBUS_ALERT = 0, + I2C_PROTOCOL_SMBUS_HOST_NOTIFY = 1, +}; + +struct i2c_board_info; + +struct i2c_driver { + unsigned int class; + int (*probe)(struct i2c_client *, const struct i2c_device_id *); + int (*remove)(struct i2c_client *); + int (*probe_new)(struct i2c_client *); + void (*shutdown)(struct i2c_client *); + void (*alert)(struct i2c_client *, enum i2c_alert_protocol, unsigned int); + int (*command)(struct i2c_client *, unsigned int, void *); + struct device_driver driver; + const struct i2c_device_id *id_table; + int (*detect)(struct i2c_client *, struct i2c_board_info *); + const short unsigned int *address_list; + struct list_head clients; + u32 flags; +}; + +struct i2c_board_info { + char type[20]; + short unsigned int flags; + short unsigned int addr; + const char *dev_name; + void *platform_data; + struct device_node *of_node; + struct fwnode_handle *fwnode; + const struct software_node *swnode; + const struct resource *resources; + unsigned int num_resources; + int irq; +}; + +struct i2c_algorithm; + +struct i2c_lock_operations; + +struct i2c_bus_recovery_info; + +struct i2c_adapter_quirks; + +struct i2c_adapter { + struct module *owner; + unsigned int class; + const struct i2c_algorithm *algo; + void *algo_data; + const struct i2c_lock_operations *lock_ops; + struct rt_mutex bus_lock; + struct rt_mutex mux_lock; + int timeout; + int retries; + struct device dev; + long unsigned int locked_flags; + int nr; + char name[48]; + struct completion dev_released; + struct mutex userspace_clients_lock; + struct list_head userspace_clients; + struct i2c_bus_recovery_info *bus_recovery_info; + const struct i2c_adapter_quirks *quirks; + struct irq_domain *host_notify_domain; + struct regulator *bus_regulator; +}; + +struct i2c_algorithm { + int (*master_xfer)(struct i2c_adapter *, struct i2c_msg *, int); + int (*master_xfer_atomic)(struct i2c_adapter *, struct i2c_msg *, int); + int (*smbus_xfer)(struct i2c_adapter *, u16, short unsigned int, char, u8, int, union i2c_smbus_data *); + int (*smbus_xfer_atomic)(struct i2c_adapter *, u16, short unsigned int, char, u8, int, union i2c_smbus_data *); + u32 (*functionality)(struct i2c_adapter *); + int (*reg_slave)(struct i2c_client *); + int (*unreg_slave)(struct i2c_client *); +}; + +struct i2c_lock_operations { + void (*lock_bus)(struct i2c_adapter *, unsigned int); + int (*trylock_bus)(struct i2c_adapter *, unsigned int); + void (*unlock_bus)(struct i2c_adapter *, unsigned int); +}; + +struct i2c_bus_recovery_info { + int (*recover_bus)(struct i2c_adapter *); + int (*get_scl)(struct i2c_adapter *); + void (*set_scl)(struct i2c_adapter *, int); + int (*get_sda)(struct i2c_adapter *); + void (*set_sda)(struct i2c_adapter *, int); + int (*get_bus_free)(struct i2c_adapter *); + void (*prepare_recovery)(struct i2c_adapter *); + void (*unprepare_recovery)(struct i2c_adapter *); + struct gpio_desc *scl_gpiod; + struct gpio_desc *sda_gpiod; + struct pinctrl *pinctrl; + struct pinctrl_state *pins_default; + struct pinctrl_state *pins_gpio; +}; + +struct i2c_adapter_quirks { + u64 flags; + int max_num_msgs; + u16 max_write_len; + u16 max_read_len; + u16 max_comb_1st_msg_len; + u16 max_comb_2nd_msg_len; +}; + +enum { + SX150X_123 = 0, + SX150X_456 = 1, + SX150X_789 = 2, +}; + +enum { + SX150X_789_REG_MISC_AUTOCLEAR_OFF = 1, + SX150X_MAX_REGISTER = 173, + SX150X_IRQ_TYPE_EDGE_RISING = 1, + SX150X_IRQ_TYPE_EDGE_FALLING = 2, + SX150X_789_RESET_KEY1 = 18, + SX150X_789_RESET_KEY2 = 52, +}; + +struct sx150x_123_pri { + u8 reg_pld_mode; + u8 reg_pld_table0; + u8 reg_pld_table1; + u8 reg_pld_table2; + u8 reg_pld_table3; + u8 reg_pld_table4; + u8 reg_advanced; +}; + +struct sx150x_456_pri { + u8 reg_pld_mode; + u8 reg_pld_table0; + u8 reg_pld_table1; + u8 reg_pld_table2; + u8 reg_pld_table3; + u8 reg_pld_table4; + u8 reg_advanced; +}; + +struct sx150x_789_pri { + u8 reg_drain; + u8 reg_polarity; + u8 reg_clock; + u8 reg_misc; + u8 reg_reset; + u8 ngpios; +}; + +struct sx150x_device_data { + u8 model; + u8 reg_pullup; + u8 reg_pulldn; + u8 reg_dir; + u8 reg_data; + u8 reg_irq_mask; + u8 reg_irq_src; + u8 reg_sense; + u8 ngpios; + union { + struct sx150x_123_pri x123; + struct sx150x_456_pri x456; + struct sx150x_789_pri x789; + } pri; + const struct pinctrl_pin_desc *pins; + unsigned int npins; +}; + +struct sx150x_pinctrl { + struct device *dev; + struct i2c_client *client; + struct pinctrl_dev *pctldev; + struct pinctrl_desc pinctrl_desc; + struct gpio_chip gpio; + struct irq_chip irq_chip; + struct regmap *regmap; + struct { + u32 sense; + u32 masked; + } irq; + struct mutex lock; + const struct sx150x_device_data *data; +}; + +struct tegra_pinctrl_soc_data; + +struct tegra_pmx { + struct device *dev; + struct pinctrl_dev *pctl; + const struct tegra_pinctrl_soc_data *soc; + const char **group_pins; + int nbanks; + void **regs; + u32 *backup_regs; +}; + +struct tegra_function; + +struct tegra_pingroup; + +struct tegra_pinctrl_soc_data { + unsigned int ngpios; + const char *gpio_compatible; + const struct pinctrl_pin_desc *pins; + unsigned int npins; + struct tegra_function *functions; + unsigned int nfunctions; + const struct tegra_pingroup *groups; + unsigned int ngroups; + bool hsm_in_mux; + bool schmitt_in_mux; + bool drvtype_in_mux; + bool sfsel_in_mux; +}; + +enum tegra_pinconf_param { + TEGRA_PINCONF_PARAM_PULL = 0, + TEGRA_PINCONF_PARAM_TRISTATE = 1, + TEGRA_PINCONF_PARAM_ENABLE_INPUT = 2, + TEGRA_PINCONF_PARAM_OPEN_DRAIN = 3, + TEGRA_PINCONF_PARAM_LOCK = 4, + TEGRA_PINCONF_PARAM_IORESET = 5, + TEGRA_PINCONF_PARAM_RCV_SEL = 6, + TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE = 7, + TEGRA_PINCONF_PARAM_SCHMITT = 8, + TEGRA_PINCONF_PARAM_LOW_POWER_MODE = 9, + TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH = 10, + TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH = 11, + TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING = 12, + TEGRA_PINCONF_PARAM_SLEW_RATE_RISING = 13, + TEGRA_PINCONF_PARAM_DRIVE_TYPE = 14, +}; + +struct tegra_function { + const char *name; + const char **groups; + unsigned int ngroups; +}; + +struct tegra_pingroup { + const char *name; + const unsigned int *pins; + u8 npins; + u8 funcs[4]; + s32 mux_reg; + s32 pupd_reg; + s32 tri_reg; + s32 drv_reg; + u32 mux_bank: 2; + u32 pupd_bank: 2; + u32 tri_bank: 2; + u32 drv_bank: 2; + s32 mux_bit: 6; + s32 pupd_bit: 6; + s32 tri_bit: 6; + s32 einput_bit: 6; + s32 odrain_bit: 6; + s32 lock_bit: 6; + s32 ioreset_bit: 6; + s32 rcv_sel_bit: 6; + s32 hsm_bit: 6; + char: 2; + s32 sfsel_bit: 6; + s32 schmitt_bit: 6; + s32 lpmd_bit: 6; + s32 drvdn_bit: 6; + s32 drvup_bit: 6; + char: 2; + s32 slwr_bit: 6; + s32 slwf_bit: 6; + s32 lpdr_bit: 6; + s32 drvtype_bit: 6; + s32 drvdn_width: 6; + char: 2; + s32 drvup_width: 6; + s32 slwr_width: 6; + s32 slwf_width: 6; + u32 parked_bitmask; +}; + +struct cfg_param { + const char *property; + enum tegra_pinconf_param param; +}; + +enum tegra_mux { + TEGRA_MUX_BLINK = 0, + TEGRA_MUX_CCLA = 1, + TEGRA_MUX_CEC = 2, + TEGRA_MUX_CLDVFS = 3, + TEGRA_MUX_CLK = 4, + TEGRA_MUX_CLK12 = 5, + TEGRA_MUX_CPU = 6, + TEGRA_MUX_CSI = 7, + TEGRA_MUX_DAP = 8, + TEGRA_MUX_DAP1 = 9, + TEGRA_MUX_DAP2 = 10, + TEGRA_MUX_DEV3 = 11, + TEGRA_MUX_DISPLAYA = 12, + TEGRA_MUX_DISPLAYA_ALT = 13, + TEGRA_MUX_DISPLAYB = 14, + TEGRA_MUX_DP = 15, + TEGRA_MUX_DSI_B = 16, + TEGRA_MUX_DTV = 17, + TEGRA_MUX_EXTPERIPH1 = 18, + TEGRA_MUX_EXTPERIPH2 = 19, + TEGRA_MUX_EXTPERIPH3 = 20, + TEGRA_MUX_GMI = 21, + TEGRA_MUX_GMI_ALT = 22, + TEGRA_MUX_HDA = 23, + TEGRA_MUX_HSI = 24, + TEGRA_MUX_I2C1 = 25, + TEGRA_MUX_I2C2 = 26, + TEGRA_MUX_I2C3 = 27, + TEGRA_MUX_I2C4 = 28, + TEGRA_MUX_I2CPWR = 29, + TEGRA_MUX_I2S0 = 30, + TEGRA_MUX_I2S1 = 31, + TEGRA_MUX_I2S2 = 32, + TEGRA_MUX_I2S3 = 33, + TEGRA_MUX_I2S4 = 34, + TEGRA_MUX_IRDA = 35, + TEGRA_MUX_KBC = 36, + TEGRA_MUX_OWR = 37, + TEGRA_MUX_PE = 38, + TEGRA_MUX_PE0 = 39, + TEGRA_MUX_PE1 = 40, + TEGRA_MUX_PMI = 41, + TEGRA_MUX_PWM0 = 42, + TEGRA_MUX_PWM1 = 43, + TEGRA_MUX_PWM2 = 44, + TEGRA_MUX_PWM3 = 45, + TEGRA_MUX_PWRON = 46, + TEGRA_MUX_RESET_OUT_N = 47, + TEGRA_MUX_RSVD1 = 48, + TEGRA_MUX_RSVD2 = 49, + TEGRA_MUX_RSVD3 = 50, + TEGRA_MUX_RSVD4 = 51, + TEGRA_MUX_RTCK = 52, + TEGRA_MUX_SATA = 53, + TEGRA_MUX_SDMMC1 = 54, + TEGRA_MUX_SDMMC2 = 55, + TEGRA_MUX_SDMMC3 = 56, + TEGRA_MUX_SDMMC4 = 57, + TEGRA_MUX_SOC = 58, + TEGRA_MUX_SPDIF = 59, + TEGRA_MUX_SPI1 = 60, + TEGRA_MUX_SPI2 = 61, + TEGRA_MUX_SPI3 = 62, + TEGRA_MUX_SPI4 = 63, + TEGRA_MUX_SPI5 = 64, + TEGRA_MUX_SPI6 = 65, + TEGRA_MUX_SYS = 66, + TEGRA_MUX_TMDS = 67, + TEGRA_MUX_TRACE = 68, + TEGRA_MUX_UARTA = 69, + TEGRA_MUX_UARTB = 70, + TEGRA_MUX_UARTC = 71, + TEGRA_MUX_UARTD = 72, + TEGRA_MUX_ULPI = 73, + TEGRA_MUX_USB = 74, + TEGRA_MUX_VGP1 = 75, + TEGRA_MUX_VGP2 = 76, + TEGRA_MUX_VGP3 = 77, + TEGRA_MUX_VGP4 = 78, + TEGRA_MUX_VGP5 = 79, + TEGRA_MUX_VGP6 = 80, + TEGRA_MUX_VI = 81, + TEGRA_MUX_VI_ALT1 = 82, + TEGRA_MUX_VI_ALT3 = 83, + TEGRA_MUX_VIMCLK2 = 84, + TEGRA_MUX_VIMCLK2_ALT = 85, +}; + +enum tegra_mux___2 { + TEGRA_MUX_AUD = 0, + TEGRA_MUX_BCL = 1, + TEGRA_MUX_BLINK___2 = 2, + TEGRA_MUX_CCLA___2 = 3, + TEGRA_MUX_CEC___2 = 4, + TEGRA_MUX_CLDVFS___2 = 5, + TEGRA_MUX_CLK___2 = 6, + TEGRA_MUX_CORE = 7, + TEGRA_MUX_CPU___2 = 8, + TEGRA_MUX_DISPLAYA___2 = 9, + TEGRA_MUX_DISPLAYB___2 = 10, + TEGRA_MUX_DMIC1 = 11, + TEGRA_MUX_DMIC2 = 12, + TEGRA_MUX_DMIC3 = 13, + TEGRA_MUX_DP___2 = 14, + TEGRA_MUX_DTV___2 = 15, + TEGRA_MUX_EXTPERIPH3___2 = 16, + TEGRA_MUX_I2C1___2 = 17, + TEGRA_MUX_I2C2___2 = 18, + TEGRA_MUX_I2C3___2 = 19, + TEGRA_MUX_I2CPMU = 20, + TEGRA_MUX_I2CVI = 21, + TEGRA_MUX_I2S1___2 = 22, + TEGRA_MUX_I2S2___2 = 23, + TEGRA_MUX_I2S3___2 = 24, + TEGRA_MUX_I2S4A = 25, + TEGRA_MUX_I2S4B = 26, + TEGRA_MUX_I2S5A = 27, + TEGRA_MUX_I2S5B = 28, + TEGRA_MUX_IQC0 = 29, + TEGRA_MUX_IQC1 = 30, + TEGRA_MUX_JTAG = 31, + TEGRA_MUX_PE___2 = 32, + TEGRA_MUX_PE0___2 = 33, + TEGRA_MUX_PE1___2 = 34, + TEGRA_MUX_PMI___2 = 35, + TEGRA_MUX_PWM0___2 = 36, + TEGRA_MUX_PWM1___2 = 37, + TEGRA_MUX_PWM2___2 = 38, + TEGRA_MUX_PWM3___2 = 39, + TEGRA_MUX_QSPI = 40, + TEGRA_MUX_RSVD0 = 41, + TEGRA_MUX_RSVD1___2 = 42, + TEGRA_MUX_RSVD2___2 = 43, + TEGRA_MUX_RSVD3___2 = 44, + TEGRA_MUX_SATA___2 = 45, + TEGRA_MUX_SDMMC1___2 = 46, + TEGRA_MUX_SDMMC3___2 = 47, + TEGRA_MUX_SHUTDOWN = 48, + TEGRA_MUX_SOC___2 = 49, + TEGRA_MUX_SOR0 = 50, + TEGRA_MUX_SOR1 = 51, + TEGRA_MUX_SPDIF___2 = 52, + TEGRA_MUX_SPI1___2 = 53, + TEGRA_MUX_SPI2___2 = 54, + TEGRA_MUX_SPI3___2 = 55, + TEGRA_MUX_SPI4___2 = 56, + TEGRA_MUX_SYS___2 = 57, + TEGRA_MUX_TOUCH = 58, + TEGRA_MUX_UART = 59, + TEGRA_MUX_UARTA___2 = 60, + TEGRA_MUX_UARTB___2 = 61, + TEGRA_MUX_UARTC___2 = 62, + TEGRA_MUX_UARTD___2 = 63, + TEGRA_MUX_USB___2 = 64, + TEGRA_MUX_VGP1___2 = 65, + TEGRA_MUX_VGP2___2 = 66, + TEGRA_MUX_VGP3___2 = 67, + TEGRA_MUX_VGP4___2 = 68, + TEGRA_MUX_VGP5___2 = 69, + TEGRA_MUX_VGP6___2 = 70, + TEGRA_MUX_VIMCLK = 71, + TEGRA_MUX_VIMCLK2___2 = 72, +}; + +enum pin_id { + TEGRA_PIN_DAP6_SCLK_PA0 = 0, + TEGRA_PIN_DAP6_DOUT_PA1 = 1, + TEGRA_PIN_DAP6_DIN_PA2 = 2, + TEGRA_PIN_DAP6_FS_PA3 = 3, + TEGRA_PIN_DAP4_SCLK_PA4 = 4, + TEGRA_PIN_DAP4_DOUT_PA5 = 5, + TEGRA_PIN_DAP4_DIN_PA6 = 6, + TEGRA_PIN_DAP4_FS_PA7 = 7, + TEGRA_PIN_CPU_PWR_REQ_0_PB0 = 8, + TEGRA_PIN_CPU_PWR_REQ_1_PB1 = 9, + TEGRA_PIN_QSPI0_SCK_PC0 = 10, + TEGRA_PIN_QSPI0_CS_N_PC1 = 11, + TEGRA_PIN_QSPI0_IO0_PC2 = 12, + TEGRA_PIN_QSPI0_IO1_PC3 = 13, + TEGRA_PIN_QSPI0_IO2_PC4 = 14, + TEGRA_PIN_QSPI0_IO3_PC5 = 15, + TEGRA_PIN_QSPI1_SCK_PC6 = 16, + TEGRA_PIN_QSPI1_CS_N_PC7 = 17, + TEGRA_PIN_QSPI1_IO0_PD0 = 18, + TEGRA_PIN_QSPI1_IO1_PD1 = 19, + TEGRA_PIN_QSPI1_IO2_PD2 = 20, + TEGRA_PIN_QSPI1_IO3_PD3 = 21, + TEGRA_PIN_EQOS_TXC_PE0 = 22, + TEGRA_PIN_EQOS_TD0_PE1 = 23, + TEGRA_PIN_EQOS_TD1_PE2 = 24, + TEGRA_PIN_EQOS_TD2_PE3 = 25, + TEGRA_PIN_EQOS_TD3_PE4 = 26, + TEGRA_PIN_EQOS_TX_CTL_PE5 = 27, + TEGRA_PIN_EQOS_RD0_PE6 = 28, + TEGRA_PIN_EQOS_RD1_PE7 = 29, + TEGRA_PIN_EQOS_RD2_PF0 = 30, + TEGRA_PIN_EQOS_RD3_PF1 = 31, + TEGRA_PIN_EQOS_RX_CTL_PF2 = 32, + TEGRA_PIN_EQOS_RXC_PF3 = 33, + TEGRA_PIN_EQOS_SMA_MDIO_PF4 = 34, + TEGRA_PIN_EQOS_SMA_MDC_PF5 = 35, + TEGRA_PIN_SOC_GPIO00_PG0 = 36, + TEGRA_PIN_SOC_GPIO01_PG1 = 37, + TEGRA_PIN_SOC_GPIO02_PG2 = 38, + TEGRA_PIN_SOC_GPIO03_PG3 = 39, + TEGRA_PIN_SOC_GPIO08_PG4 = 40, + TEGRA_PIN_SOC_GPIO09_PG5 = 41, + TEGRA_PIN_SOC_GPIO10_PG6 = 42, + TEGRA_PIN_SOC_GPIO11_PG7 = 43, + TEGRA_PIN_SOC_GPIO12_PH0 = 44, + TEGRA_PIN_SOC_GPIO13_PH1 = 45, + TEGRA_PIN_SOC_GPIO14_PH2 = 46, + TEGRA_PIN_UART4_TX_PH3 = 47, + TEGRA_PIN_UART4_RX_PH4 = 48, + TEGRA_PIN_UART4_RTS_PH5 = 49, + TEGRA_PIN_UART4_CTS_PH6 = 50, + TEGRA_PIN_DAP2_SCLK_PH7 = 51, + TEGRA_PIN_DAP2_DOUT_PI0 = 52, + TEGRA_PIN_DAP2_DIN_PI1 = 53, + TEGRA_PIN_DAP2_FS_PI2 = 54, + TEGRA_PIN_GEN1_I2C_SCL_PI3 = 55, + TEGRA_PIN_GEN1_I2C_SDA_PI4 = 56, + TEGRA_PIN_SDMMC1_CLK_PJ0 = 57, + TEGRA_PIN_SDMMC1_CMD_PJ1 = 58, + TEGRA_PIN_SDMMC1_DAT0_PJ2 = 59, + TEGRA_PIN_SDMMC1_DAT1_PJ3 = 60, + TEGRA_PIN_SDMMC1_DAT2_PJ4 = 61, + TEGRA_PIN_SDMMC1_DAT3_PJ5 = 62, + TEGRA_PIN_PEX_L0_CLKREQ_N_PK0 = 63, + TEGRA_PIN_PEX_L0_RST_N_PK1 = 64, + TEGRA_PIN_PEX_L1_CLKREQ_N_PK2 = 65, + TEGRA_PIN_PEX_L1_RST_N_PK3 = 66, + TEGRA_PIN_PEX_L2_CLKREQ_N_PK4 = 67, + TEGRA_PIN_PEX_L2_RST_N_PK5 = 68, + TEGRA_PIN_PEX_L3_CLKREQ_N_PK6 = 69, + TEGRA_PIN_PEX_L3_RST_N_PK7 = 70, + TEGRA_PIN_PEX_L4_CLKREQ_N_PL0 = 71, + TEGRA_PIN_PEX_L4_RST_N_PL1 = 72, + TEGRA_PIN_PEX_WAKE_N_PL2 = 73, + TEGRA_PIN_SATA_DEV_SLP_PL3 = 74, + TEGRA_PIN_DP_AUX_CH0_HPD_PM0 = 75, + TEGRA_PIN_DP_AUX_CH1_HPD_PM1 = 76, + TEGRA_PIN_DP_AUX_CH2_HPD_PM2 = 77, + TEGRA_PIN_DP_AUX_CH3_HPD_PM3 = 78, + TEGRA_PIN_HDMI_CEC_PM4 = 79, + TEGRA_PIN_SOC_GPIO50_PM5 = 80, + TEGRA_PIN_SOC_GPIO51_PM6 = 81, + TEGRA_PIN_SOC_GPIO52_PM7 = 82, + TEGRA_PIN_SOC_GPIO53_PN0 = 83, + TEGRA_PIN_SOC_GPIO54_PN1 = 84, + TEGRA_PIN_SOC_GPIO55_PN2 = 85, + TEGRA_PIN_SDMMC3_CLK_PO0 = 86, + TEGRA_PIN_SDMMC3_CMD_PO1 = 87, + TEGRA_PIN_SDMMC3_DAT0_PO2 = 88, + TEGRA_PIN_SDMMC3_DAT1_PO3 = 89, + TEGRA_PIN_SDMMC3_DAT2_PO4 = 90, + TEGRA_PIN_SDMMC3_DAT3_PO5 = 91, + TEGRA_PIN_EXTPERIPH1_CLK_PP0 = 92, + TEGRA_PIN_EXTPERIPH2_CLK_PP1 = 93, + TEGRA_PIN_CAM_I2C_SCL_PP2 = 94, + TEGRA_PIN_CAM_I2C_SDA_PP3 = 95, + TEGRA_PIN_SOC_GPIO04_PP4 = 96, + TEGRA_PIN_SOC_GPIO05_PP5 = 97, + TEGRA_PIN_SOC_GPIO06_PP6 = 98, + TEGRA_PIN_SOC_GPIO07_PP7 = 99, + TEGRA_PIN_SOC_GPIO20_PQ0 = 100, + TEGRA_PIN_SOC_GPIO21_PQ1 = 101, + TEGRA_PIN_SOC_GPIO22_PQ2 = 102, + TEGRA_PIN_SOC_GPIO23_PQ3 = 103, + TEGRA_PIN_SOC_GPIO40_PQ4 = 104, + TEGRA_PIN_SOC_GPIO41_PQ5 = 105, + TEGRA_PIN_SOC_GPIO42_PQ6 = 106, + TEGRA_PIN_SOC_GPIO43_PQ7 = 107, + TEGRA_PIN_SOC_GPIO44_PR0 = 108, + TEGRA_PIN_SOC_GPIO45_PR1 = 109, + TEGRA_PIN_UART1_TX_PR2 = 110, + TEGRA_PIN_UART1_RX_PR3 = 111, + TEGRA_PIN_UART1_RTS_PR4 = 112, + TEGRA_PIN_UART1_CTS_PR5 = 113, + TEGRA_PIN_DAP1_SCLK_PS0 = 114, + TEGRA_PIN_DAP1_DOUT_PS1 = 115, + TEGRA_PIN_DAP1_DIN_PS2 = 116, + TEGRA_PIN_DAP1_FS_PS3 = 117, + TEGRA_PIN_AUD_MCLK_PS4 = 118, + TEGRA_PIN_SOC_GPIO30_PS5 = 119, + TEGRA_PIN_SOC_GPIO31_PS6 = 120, + TEGRA_PIN_SOC_GPIO32_PS7 = 121, + TEGRA_PIN_SOC_GPIO33_PT0 = 122, + TEGRA_PIN_DAP3_SCLK_PT1 = 123, + TEGRA_PIN_DAP3_DOUT_PT2 = 124, + TEGRA_PIN_DAP3_DIN_PT3 = 125, + TEGRA_PIN_DAP3_FS_PT4 = 126, + TEGRA_PIN_DAP5_SCLK_PT5 = 127, + TEGRA_PIN_DAP5_DOUT_PT6 = 128, + TEGRA_PIN_DAP5_DIN_PT7 = 129, + TEGRA_PIN_DAP5_FS_PU0 = 130, + TEGRA_PIN_DIRECTDC1_CLK_PV0 = 131, + TEGRA_PIN_DIRECTDC1_IN_PV1 = 132, + TEGRA_PIN_DIRECTDC1_OUT0_PV2 = 133, + TEGRA_PIN_DIRECTDC1_OUT1_PV3 = 134, + TEGRA_PIN_DIRECTDC1_OUT2_PV4 = 135, + TEGRA_PIN_DIRECTDC1_OUT3_PV5 = 136, + TEGRA_PIN_DIRECTDC1_OUT4_PV6 = 137, + TEGRA_PIN_DIRECTDC1_OUT5_PV7 = 138, + TEGRA_PIN_DIRECTDC1_OUT6_PW0 = 139, + TEGRA_PIN_DIRECTDC1_OUT7_PW1 = 140, + TEGRA_PIN_GPU_PWR_REQ_PX0 = 141, + TEGRA_PIN_CV_PWR_REQ_PX1 = 142, + TEGRA_PIN_GP_PWM2_PX2 = 143, + TEGRA_PIN_GP_PWM3_PX3 = 144, + TEGRA_PIN_UART2_TX_PX4 = 145, + TEGRA_PIN_UART2_RX_PX5 = 146, + TEGRA_PIN_UART2_RTS_PX6 = 147, + TEGRA_PIN_UART2_CTS_PX7 = 148, + TEGRA_PIN_SPI3_SCK_PY0 = 149, + TEGRA_PIN_SPI3_MISO_PY1 = 150, + TEGRA_PIN_SPI3_MOSI_PY2 = 151, + TEGRA_PIN_SPI3_CS0_PY3 = 152, + TEGRA_PIN_SPI3_CS1_PY4 = 153, + TEGRA_PIN_UART5_TX_PY5 = 154, + TEGRA_PIN_UART5_RX_PY6 = 155, + TEGRA_PIN_UART5_RTS_PY7 = 156, + TEGRA_PIN_UART5_CTS_PZ0 = 157, + TEGRA_PIN_USB_VBUS_EN0_PZ1 = 158, + TEGRA_PIN_USB_VBUS_EN1_PZ2 = 159, + TEGRA_PIN_SPI1_SCK_PZ3 = 160, + TEGRA_PIN_SPI1_MISO_PZ4 = 161, + TEGRA_PIN_SPI1_MOSI_PZ5 = 162, + TEGRA_PIN_SPI1_CS0_PZ6 = 163, + TEGRA_PIN_SPI1_CS1_PZ7 = 164, + TEGRA_PIN_CAN1_DOUT_PAA0 = 165, + TEGRA_PIN_CAN1_DIN_PAA1 = 166, + TEGRA_PIN_CAN0_DOUT_PAA2 = 167, + TEGRA_PIN_CAN0_DIN_PAA3 = 168, + TEGRA_PIN_CAN0_STB_PAA4 = 169, + TEGRA_PIN_CAN0_EN_PAA5 = 170, + TEGRA_PIN_CAN0_WAKE_PAA6 = 171, + TEGRA_PIN_CAN0_ERR_PAA7 = 172, + TEGRA_PIN_CAN1_STB_PBB0 = 173, + TEGRA_PIN_CAN1_EN_PBB1 = 174, + TEGRA_PIN_CAN1_WAKE_PBB2 = 175, + TEGRA_PIN_CAN1_ERR_PBB3 = 176, + TEGRA_PIN_SPI2_SCK_PCC0 = 177, + TEGRA_PIN_SPI2_MISO_PCC1 = 178, + TEGRA_PIN_SPI2_MOSI_PCC2 = 179, + TEGRA_PIN_SPI2_CS0_PCC3 = 180, + TEGRA_PIN_TOUCH_CLK_PCC4 = 181, + TEGRA_PIN_UART3_TX_PCC5 = 182, + TEGRA_PIN_UART3_RX_PCC6 = 183, + TEGRA_PIN_GEN2_I2C_SCL_PCC7 = 184, + TEGRA_PIN_GEN2_I2C_SDA_PDD0 = 185, + TEGRA_PIN_GEN8_I2C_SCL_PDD1 = 186, + TEGRA_PIN_GEN8_I2C_SDA_PDD2 = 187, + TEGRA_PIN_SAFE_STATE_PEE0 = 188, + TEGRA_PIN_VCOMP_ALERT_PEE1 = 189, + TEGRA_PIN_AO_RETENTION_N_PEE2 = 190, + TEGRA_PIN_BATT_OC_PEE3 = 191, + TEGRA_PIN_POWER_ON_PEE4 = 192, + TEGRA_PIN_PWR_I2C_SCL_PEE5 = 193, + TEGRA_PIN_PWR_I2C_SDA_PEE6 = 194, + TEGRA_PIN_UFS0_REF_CLK_PFF0 = 195, + TEGRA_PIN_UFS0_RST_PFF1 = 196, + TEGRA_PIN_PEX_L5_CLKREQ_N_PGG0 = 197, + TEGRA_PIN_PEX_L5_RST_N_PGG1 = 198, + TEGRA_PIN_DIRECTDC_COMP = 199, + TEGRA_PIN_SDMMC4_CLK = 200, + TEGRA_PIN_SDMMC4_CMD = 201, + TEGRA_PIN_SDMMC4_DQS = 202, + TEGRA_PIN_SDMMC4_DAT7 = 203, + TEGRA_PIN_SDMMC4_DAT6 = 204, + TEGRA_PIN_SDMMC4_DAT5 = 205, + TEGRA_PIN_SDMMC4_DAT4 = 206, + TEGRA_PIN_SDMMC4_DAT3 = 207, + TEGRA_PIN_SDMMC4_DAT2 = 208, + TEGRA_PIN_SDMMC4_DAT1 = 209, + TEGRA_PIN_SDMMC4_DAT0 = 210, + TEGRA_PIN_SDMMC1_COMP = 211, + TEGRA_PIN_SDMMC1_HV_TRIM = 212, + TEGRA_PIN_SDMMC3_COMP = 213, + TEGRA_PIN_SDMMC3_HV_TRIM = 214, + TEGRA_PIN_EQOS_COMP = 215, + TEGRA_PIN_QSPI_COMP = 216, + TEGRA_PIN_SYS_RESET_N = 217, + TEGRA_PIN_SHUTDOWN_N = 218, + TEGRA_PIN_PMU_INT_N = 219, + TEGRA_PIN_SOC_PWR_REQ = 220, + TEGRA_PIN_CLK_32K_IN = 221, +}; + +enum tegra_mux_dt { + TEGRA_MUX_RSVD0___2 = 0, + TEGRA_MUX_RSVD1___3 = 1, + TEGRA_MUX_RSVD2___3 = 2, + TEGRA_MUX_RSVD3___3 = 3, + TEGRA_MUX_TOUCH___2 = 4, + TEGRA_MUX_UARTC___3 = 5, + TEGRA_MUX_I2C8 = 6, + TEGRA_MUX_UARTG = 7, + TEGRA_MUX_SPI2___3 = 8, + TEGRA_MUX_GP = 9, + TEGRA_MUX_DCA = 10, + TEGRA_MUX_WDT = 11, + TEGRA_MUX_I2C2___3 = 12, + TEGRA_MUX_CAN1 = 13, + TEGRA_MUX_CAN0 = 14, + TEGRA_MUX_DMIC3___2 = 15, + TEGRA_MUX_DMIC5 = 16, + TEGRA_MUX_GPIO = 17, + TEGRA_MUX_DSPK1 = 18, + TEGRA_MUX_DSPK0 = 19, + TEGRA_MUX_SPDIF___3 = 20, + TEGRA_MUX_AUD___2 = 21, + TEGRA_MUX_I2S1___3 = 22, + TEGRA_MUX_DMIC1___2 = 23, + TEGRA_MUX_DMIC2___2 = 24, + TEGRA_MUX_I2S3___3 = 25, + TEGRA_MUX_DMIC4 = 26, + TEGRA_MUX_I2S4___2 = 27, + TEGRA_MUX_EXTPERIPH2___2 = 28, + TEGRA_MUX_EXTPERIPH1___2 = 29, + TEGRA_MUX_I2C3___3 = 30, + TEGRA_MUX_VGP1___3 = 31, + TEGRA_MUX_VGP2___3 = 32, + TEGRA_MUX_VGP3___3 = 33, + TEGRA_MUX_VGP4___3 = 34, + TEGRA_MUX_VGP5___3 = 35, + TEGRA_MUX_VGP6___3 = 36, + TEGRA_MUX_SLVS = 37, + TEGRA_MUX_EXTPERIPH3___3 = 38, + TEGRA_MUX_EXTPERIPH4 = 39, + TEGRA_MUX_I2S2___3 = 40, + TEGRA_MUX_UARTD___3 = 41, + TEGRA_MUX_I2C1___3 = 42, + TEGRA_MUX_UARTA___3 = 43, + TEGRA_MUX_DIRECTDC1 = 44, + TEGRA_MUX_DIRECTDC = 45, + TEGRA_MUX_IQC1___2 = 46, + TEGRA_MUX_IQC2 = 47, + TEGRA_MUX_I2S6 = 48, + TEGRA_MUX_SDMMC3___3 = 49, + TEGRA_MUX_SDMMC1___3 = 50, + TEGRA_MUX_DP___3 = 51, + TEGRA_MUX_HDMI = 52, + TEGRA_MUX_PE2 = 53, + TEGRA_MUX_IGPU = 54, + TEGRA_MUX_SATA___3 = 55, + TEGRA_MUX_PE1___3 = 56, + TEGRA_MUX_PE0___3 = 57, + TEGRA_MUX_PE3 = 58, + TEGRA_MUX_PE4 = 59, + TEGRA_MUX_PE5 = 60, + TEGRA_MUX_SOC___3 = 61, + TEGRA_MUX_EQOS = 62, + TEGRA_MUX_QSPI___2 = 63, + TEGRA_MUX_QSPI0 = 64, + TEGRA_MUX_QSPI1 = 65, + TEGRA_MUX_MIPI = 66, + TEGRA_MUX_SCE = 67, + TEGRA_MUX_I2C5 = 68, + TEGRA_MUX_DISPLAYA___3 = 69, + TEGRA_MUX_DISPLAYB___3 = 70, + TEGRA_MUX_DCB = 71, + TEGRA_MUX_SPI1___3 = 72, + TEGRA_MUX_UARTB___3 = 73, + TEGRA_MUX_UARTE = 74, + TEGRA_MUX_SPI3___3 = 75, + TEGRA_MUX_NV = 76, + TEGRA_MUX_CCLA___3 = 77, + TEGRA_MUX_I2S5 = 78, + TEGRA_MUX_USB___3 = 79, + TEGRA_MUX_UFS0 = 80, + TEGRA_MUX_DGPU = 81, + TEGRA_MUX_SDMMC4___2 = 82, +}; + +struct tegra_xusb_padctl_function { + const char *name; + const char * const *groups; + unsigned int num_groups; +}; + +struct tegra_xusb_padctl_lane; + +struct tegra_xusb_padctl_soc { + const struct pinctrl_pin_desc *pins; + unsigned int num_pins; + const struct tegra_xusb_padctl_function *functions; + unsigned int num_functions; + const struct tegra_xusb_padctl_lane *lanes; + unsigned int num_lanes; +}; + +struct tegra_xusb_padctl_lane { + const char *name; + unsigned int offset; + unsigned int shift; + unsigned int mask; + unsigned int iddq; + const unsigned int *funcs; + unsigned int num_funcs; +}; + +struct tegra_xusb_padctl { + struct device *dev; + void *regs; + struct mutex lock; + struct reset_control *rst; + const struct tegra_xusb_padctl_soc *soc; + struct pinctrl_dev *pinctrl; + struct pinctrl_desc desc; + struct phy_provider *provider; + struct phy *phys[2]; + unsigned int enable; +}; + +enum tegra_xusb_padctl_param { + TEGRA_XUSB_PADCTL_IDDQ = 0, +}; + +struct tegra_xusb_padctl_property { + const char *name; + enum tegra_xusb_padctl_param param; +}; + +enum tegra124_function { + TEGRA124_FUNC_SNPS = 0, + TEGRA124_FUNC_XUSB = 1, + TEGRA124_FUNC_UART = 2, + TEGRA124_FUNC_PCIE = 3, + TEGRA124_FUNC_USB3 = 4, + TEGRA124_FUNC_SATA = 5, + TEGRA124_FUNC_RSVD = 6, +}; + +enum { + PINCONF_BIAS = 0, + PINCONF_SCHMITT = 1, + PINCONF_DRIVE_STRENGTH = 2, +}; + +enum { + FUNC_NONE = 0, + FUNC_GPIO = 1, + FUNC_IRQ0 = 2, + FUNC_IRQ0_IN = 3, + FUNC_IRQ0_OUT = 4, + FUNC_IRQ1 = 5, + FUNC_IRQ1_IN = 6, + FUNC_IRQ1_OUT = 7, + FUNC_EXT_IRQ = 8, + FUNC_MIIM = 9, + FUNC_PHY_LED = 10, + FUNC_PCI_WAKE = 11, + FUNC_MD = 12, + FUNC_PTP0 = 13, + FUNC_PTP1 = 14, + FUNC_PTP2 = 15, + FUNC_PTP3 = 16, + FUNC_PWM = 17, + FUNC_RECO_CLK = 18, + FUNC_SFP = 19, + FUNC_SG0 = 20, + FUNC_SG1 = 21, + FUNC_SG2 = 22, + FUNC_SI = 23, + FUNC_SI2 = 24, + FUNC_TACHO = 25, + FUNC_TWI = 26, + FUNC_TWI2 = 27, + FUNC_TWI3 = 28, + FUNC_TWI_SCL_M = 29, + FUNC_UART = 30, + FUNC_UART2 = 31, + FUNC_UART3 = 32, + FUNC_PLL_STAT = 33, + FUNC_EMMC = 34, + FUNC_REF_CLK = 35, + FUNC_RCVRD_CLK = 36, + FUNC_MAX = 37, +}; + +struct ocelot_pmx_func { + const char **groups; + unsigned int ngroups; +}; + +struct ocelot_pin_caps { + unsigned int pin; + unsigned char functions[4]; +}; + +struct ocelot_pinctrl { + struct device *dev; + struct pinctrl_dev *pctl; + struct gpio_chip gpio_chip; + struct regmap *map; + void *pincfg; + struct pinctrl_desc *desc; + struct ocelot_pmx_func func[37]; + u8 stride; +}; + +enum { + REG_INPUT_DATA = 0, + REG_PORT_CONFIG = 1, + REG_PORT_ENABLE = 2, + REG_SIO_CONFIG = 3, + REG_SIO_CLOCK = 4, + REG_INT_POLARITY = 5, + REG_INT_TRIGGER = 6, + REG_INT_ACK = 7, + REG_INT_ENABLE = 8, + REG_INT_IDENT = 9, + MAXREG = 10, +}; + +enum { + SGPIO_ARCH_LUTON = 0, + SGPIO_ARCH_OCELOT = 1, + SGPIO_ARCH_SPARX5 = 2, +}; + +enum { + SGPIO_FLAGS_HAS_IRQ = 1, +}; + +struct sgpio_properties { + int arch; + int flags; + u8 regoff[10]; +}; + +struct sgpio_priv; + +struct sgpio_bank { + struct sgpio_priv *priv; + bool is_input; + struct gpio_chip gpio; + struct pinctrl_desc pctl_desc; +}; + +struct sgpio_priv { + struct device *dev; + struct sgpio_bank in; + struct sgpio_bank out; + u32 bitcount; + u32 ports; + u32 clock; + u32 *regs; + const struct sgpio_properties *properties; +}; + +struct sgpio_port_addr { + u8 port; + u8 bit; +}; + +enum owl_pinconf_drv { + OWL_PINCONF_DRV_2MA = 0, + OWL_PINCONF_DRV_4MA = 1, + OWL_PINCONF_DRV_8MA = 2, + OWL_PINCONF_DRV_12MA = 3, +}; + +struct owl_pullctl { + int reg; + unsigned int shift; + unsigned int width; +}; + +struct owl_st { + int reg; + unsigned int shift; + unsigned int width; +}; + +struct owl_pingroup { + const char *name; + unsigned int *pads; + unsigned int npads; + unsigned int *funcs; + unsigned int nfuncs; + int mfpctl_reg; + unsigned int mfpctl_shift; + unsigned int mfpctl_width; + int drv_reg; + unsigned int drv_shift; + unsigned int drv_width; + int sr_reg; + unsigned int sr_shift; + unsigned int sr_width; +}; + +struct owl_padinfo { + int pad; + struct owl_pullctl *pullctl; + struct owl_st *st; +}; + +struct owl_pinmux_func { + const char *name; + const char * const *groups; + unsigned int ngroups; +}; + +struct owl_gpio_port { + unsigned int offset; + unsigned int pins; + unsigned int outen; + unsigned int inen; + unsigned int dat; + unsigned int intc_ctl; + unsigned int intc_pd; + unsigned int intc_msk; + unsigned int intc_type; + u8 shared_ctl_offset; +}; + +struct owl_pinctrl_soc_data { + const struct pinctrl_pin_desc *pins; + unsigned int npins; + const struct owl_pinmux_func *functions; + unsigned int nfunctions; + const struct owl_pingroup *groups; + unsigned int ngroups; + const struct owl_padinfo *padinfo; + unsigned int ngpios; + const struct owl_gpio_port *ports; + unsigned int nports; + int (*padctl_val2arg)(const struct owl_padinfo *, unsigned int, u32 *); + int (*padctl_arg2val)(const struct owl_padinfo *, unsigned int, u32 *); +}; + +struct owl_pinctrl { + struct device *dev; + struct pinctrl_dev *pctrldev; + struct gpio_chip chip; + raw_spinlock_t lock; + struct clk *clk; + const struct owl_pinctrl_soc_data *soc; + void *base; + struct irq_chip irq_chip; + unsigned int num_irq; + unsigned int *irq; +}; + +enum s700_pinmux_functions { + S700_MUX_NOR = 0, + S700_MUX_ETH_RGMII = 1, + S700_MUX_ETH_SGMII = 2, + S700_MUX_SPI0 = 3, + S700_MUX_SPI1 = 4, + S700_MUX_SPI2 = 5, + S700_MUX_SPI3 = 6, + S700_MUX_SENS0 = 7, + S700_MUX_SENS1 = 8, + S700_MUX_UART0 = 9, + S700_MUX_UART1 = 10, + S700_MUX_UART2 = 11, + S700_MUX_UART3 = 12, + S700_MUX_UART4 = 13, + S700_MUX_UART5 = 14, + S700_MUX_UART6 = 15, + S700_MUX_I2S0 = 16, + S700_MUX_I2S1 = 17, + S700_MUX_PCM1 = 18, + S700_MUX_PCM0 = 19, + S700_MUX_KS = 20, + S700_MUX_JTAG = 21, + S700_MUX_PWM0 = 22, + S700_MUX_PWM1 = 23, + S700_MUX_PWM2 = 24, + S700_MUX_PWM3 = 25, + S700_MUX_PWM4 = 26, + S700_MUX_PWM5 = 27, + S700_MUX_P0 = 28, + S700_MUX_SD0 = 29, + S700_MUX_SD1 = 30, + S700_MUX_SD2 = 31, + S700_MUX_I2C0 = 32, + S700_MUX_I2C1 = 33, + S700_MUX_I2C2 = 34, + S700_MUX_I2C3 = 35, + S700_MUX_DSI = 36, + S700_MUX_LVDS = 37, + S700_MUX_USB30 = 38, + S700_MUX_CLKO_25M = 39, + S700_MUX_MIPI_CSI = 40, + S700_MUX_NAND = 41, + S700_MUX_SPDIF = 42, + S700_MUX_SIRQ0 = 43, + S700_MUX_SIRQ1 = 44, + S700_MUX_SIRQ2 = 45, + S700_MUX_BT = 46, + S700_MUX_LCD0 = 47, + S700_MUX_RESERVED = 48, +}; + +enum s700_pinconf_pull { + OWL_PINCONF_PULL_DOWN = 0, + OWL_PINCONF_PULL_UP = 1, +}; + +enum s900_pinmux_functions { + S900_MUX_ERAM = 0, + S900_MUX_ETH_RMII = 1, + S900_MUX_ETH_SMII = 2, + S900_MUX_SPI0 = 3, + S900_MUX_SPI1 = 4, + S900_MUX_SPI2 = 5, + S900_MUX_SPI3 = 6, + S900_MUX_SENS0 = 7, + S900_MUX_UART0 = 8, + S900_MUX_UART1 = 9, + S900_MUX_UART2 = 10, + S900_MUX_UART3 = 11, + S900_MUX_UART4 = 12, + S900_MUX_UART5 = 13, + S900_MUX_UART6 = 14, + S900_MUX_I2S0 = 15, + S900_MUX_I2S1 = 16, + S900_MUX_PCM0 = 17, + S900_MUX_PCM1 = 18, + S900_MUX_JTAG = 19, + S900_MUX_PWM0 = 20, + S900_MUX_PWM1 = 21, + S900_MUX_PWM2 = 22, + S900_MUX_PWM3 = 23, + S900_MUX_PWM4 = 24, + S900_MUX_PWM5 = 25, + S900_MUX_SD0 = 26, + S900_MUX_SD1 = 27, + S900_MUX_SD2 = 28, + S900_MUX_SD3 = 29, + S900_MUX_I2C0 = 30, + S900_MUX_I2C1 = 31, + S900_MUX_I2C2 = 32, + S900_MUX_I2C3 = 33, + S900_MUX_I2C4 = 34, + S900_MUX_I2C5 = 35, + S900_MUX_LVDS = 36, + S900_MUX_USB20 = 37, + S900_MUX_USB30 = 38, + S900_MUX_GPU = 39, + S900_MUX_MIPI_CSI0 = 40, + S900_MUX_MIPI_CSI1 = 41, + S900_MUX_MIPI_DSI = 42, + S900_MUX_NAND0 = 43, + S900_MUX_NAND1 = 44, + S900_MUX_SPDIF = 45, + S900_MUX_SIRQ0 = 46, + S900_MUX_SIRQ1 = 47, + S900_MUX_SIRQ2 = 48, + S900_MUX_AUX_START = 49, + S900_MUX_MAX = 50, + S900_MUX_RESERVED = 51, +}; + +enum s900_pinconf_pull { + OWL_PINCONF_PULL_HIZ = 0, + OWL_PINCONF_PULL_DOWN___2 = 1, + OWL_PINCONF_PULL_UP___2 = 2, + OWL_PINCONF_PULL_HOLD = 3, +}; + +struct bcm2835_pinctrl { + struct device *dev; + void *base; + int *wake_irq; + long unsigned int enabled_irq_map[2]; + unsigned int irq_type[58]; + struct pinctrl_dev *pctl_dev; + struct gpio_chip gpio_chip; + struct pinctrl_desc pctl_desc; + struct pinctrl_gpio_range gpio_range; + raw_spinlock_t irq_lock[2]; +}; + +enum bcm2835_fsel { + BCM2835_FSEL_COUNT = 8, + BCM2835_FSEL_MASK = 7, +}; + +struct bcm_plat_data { + const struct gpio_chip *gpio_chip; + const struct pinctrl_desc *pctl_desc; + const struct pinctrl_gpio_range *gpio_range; +}; + +enum iproc_pinconf_param { + IPROC_PINCONF_DRIVE_STRENGTH = 0, + IPROC_PINCONF_BIAS_DISABLE = 1, + IPROC_PINCONF_BIAS_PULL_UP = 2, + IPROC_PINCONF_BIAS_PULL_DOWN = 3, + IPROC_PINCON_MAX = 4, +}; + +enum iproc_pinconf_ctrl_type { + IOCTRL_TYPE_AON = 1, + IOCTRL_TYPE_CDRU = 2, + IOCTRL_TYPE_INVALID = 3, +}; + +struct iproc_gpio { + struct device *dev; + void *base; + void *io_ctrl; + enum iproc_pinconf_ctrl_type io_ctrl_type; + raw_spinlock_t lock; + struct irq_chip irqchip; + struct gpio_chip gc; + unsigned int num_banks; + bool pinmux_is_supported; + enum pin_config_param *pinconf_disable; + unsigned int nr_pinconf_disable; + struct pinctrl_dev *pctl; + struct pinctrl_desc pctldesc; +}; + +struct ns2_mux { + unsigned int base; + unsigned int offset; + unsigned int shift; + unsigned int mask; + unsigned int alt; +}; + +struct ns2_mux_log { + struct ns2_mux mux; + bool is_configured; +}; + +struct ns2_pin_group { + const char *name; + const unsigned int *pins; + const unsigned int num_pins; + const struct ns2_mux mux; +}; + +struct ns2_pin_function { + const char *name; + const char * const *groups; + const unsigned int num_groups; +}; + +struct ns2_pinctrl { + struct pinctrl_dev *pctl; + struct device *dev; + void *base0; + void *base1; + void *pinconf_base; + const struct ns2_pin_group *groups; + unsigned int num_groups; + const struct ns2_pin_function *functions; + unsigned int num_functions; + struct ns2_mux_log *mux_log; + spinlock_t lock; +}; + +struct ns2_pinconf { + unsigned int base; + unsigned int offset; + unsigned int src_shift; + unsigned int input_en; + unsigned int pull_shift; + unsigned int drive_shift; +}; + +struct ns2_pin { + unsigned int pin; + char *name; + struct ns2_pinconf pin_conf; +}; + +struct berlin_desc_function { + const char *name; + u8 muxval; +}; + +struct berlin_desc_group { + const char *name; + u8 offset; + u8 bit_width; + u8 lsb; + struct berlin_desc_function *functions; +}; + +struct berlin_pinctrl_desc { + const struct berlin_desc_group *groups; + unsigned int ngroups; +}; + +struct berlin_pinctrl_function { + const char *name; + const char **groups; + unsigned int ngroups; +}; + +struct berlin_pinctrl { + struct regmap *regmap; + struct device *dev; + const struct berlin_pinctrl_desc *desc; + struct berlin_pinctrl_function *functions; + unsigned int nfunctions; + struct pinctrl_dev *pctrl_dev; +}; + +struct imx_pin_mmio { + unsigned int mux_mode; + u16 input_reg; + unsigned int input_val; + long unsigned int config; +}; + +struct imx_pin_scu { + unsigned int mux_mode; + long unsigned int config; +}; + +struct imx_pin { + unsigned int pin; + union { + struct imx_pin_mmio mmio; + struct imx_pin_scu scu; + } conf; +}; + +struct imx_pin_reg { + s16 mux_reg; + s16 conf_reg; +}; + +struct imx_cfg_params_decode { + enum pin_config_param param; + u32 mask; + u8 shift; + bool invert; +}; + +struct imx_pinctrl_soc_info; + +struct imx_pinctrl { + struct device *dev; + struct pinctrl_dev *pctl; + void *base; + void *input_sel_base; + const struct imx_pinctrl_soc_info *info; + struct imx_pin_reg *pin_regs; + unsigned int group_index; + struct mutex mutex; +}; + +struct imx_pinctrl_soc_info { + const struct pinctrl_pin_desc *pins; + unsigned int npins; + unsigned int flags; + const char *gpr_compatible; + unsigned int mux_mask; + u8 mux_shift; + bool generic_pinconf; + const struct pinconf_generic_params *custom_params; + unsigned int num_custom_params; + const struct imx_cfg_params_decode *decodes; + unsigned int num_decodes; + void (*fixup)(long unsigned int *, unsigned int, u32 *); + int (*gpio_set_direction)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int, bool); + int (*imx_pinconf_get)(struct pinctrl_dev *, unsigned int, long unsigned int *); + int (*imx_pinconf_set)(struct pinctrl_dev *, unsigned int, long unsigned int *, unsigned int); + void (*imx_pinctrl_parse_pin)(struct imx_pinctrl *, unsigned int *, struct imx_pin *, const __be32 **); +}; + +enum imx_sc_rpc_svc { + IMX_SC_RPC_SVC_UNKNOWN = 0, + IMX_SC_RPC_SVC_RETURN = 1, + IMX_SC_RPC_SVC_PM = 2, + IMX_SC_RPC_SVC_RM = 3, + IMX_SC_RPC_SVC_TIMER = 5, + IMX_SC_RPC_SVC_PAD = 6, + IMX_SC_RPC_SVC_MISC = 7, + IMX_SC_RPC_SVC_IRQ = 8, +}; + +struct imx_sc_rpc_msg { + uint8_t ver; + uint8_t size; + uint8_t svc; + uint8_t func; +}; + +enum pad_func_e { + IMX_SC_PAD_FUNC_SET = 15, + IMX_SC_PAD_FUNC_GET = 16, +}; + +struct imx_sc_msg_req_pad_set { + struct imx_sc_rpc_msg hdr; + u32 val; + u16 pad; +}; + +struct imx_sc_msg_req_pad_get { + struct imx_sc_rpc_msg hdr; + u16 pad; + short: 16; +}; + +struct imx_sc_msg_resp_pad_get { + struct imx_sc_rpc_msg hdr; + u32 val; +}; + +struct imx_sc_ipc; + +enum imx8mm_pads { + MX8MM_PAD_RESERVE0 = 0, + MX8MM_PAD_RESERVE1 = 1, + MX8MM_PAD_RESERVE2 = 2, + MX8MM_PAD_RESERVE3 = 3, + MX8MM_PAD_RESERVE4 = 4, + MX8MM_PAD_RESERVE5 = 5, + MX8MM_PAD_RESERVE6 = 6, + MX8MM_PAD_RESERVE7 = 7, + MX8MM_PAD_RESERVE8 = 8, + MX8MM_PAD_RESERVE9 = 9, + MX8MM_IOMUXC_GPIO1_IO00 = 10, + MX8MM_IOMUXC_GPIO1_IO01 = 11, + MX8MM_IOMUXC_GPIO1_IO02 = 12, + MX8MM_IOMUXC_GPIO1_IO03 = 13, + MX8MM_IOMUXC_GPIO1_IO04 = 14, + MX8MM_IOMUXC_GPIO1_IO05 = 15, + MX8MM_IOMUXC_GPIO1_IO06 = 16, + MX8MM_IOMUXC_GPIO1_IO07 = 17, + MX8MM_IOMUXC_GPIO1_IO08 = 18, + MX8MM_IOMUXC_GPIO1_IO09 = 19, + MX8MM_IOMUXC_GPIO1_IO10 = 20, + MX8MM_IOMUXC_GPIO1_IO11 = 21, + MX8MM_IOMUXC_GPIO1_IO12 = 22, + MX8MM_IOMUXC_GPIO1_IO13 = 23, + MX8MM_IOMUXC_GPIO1_IO14 = 24, + MX8MM_IOMUXC_GPIO1_IO15 = 25, + MX8MM_IOMUXC_ENET_MDC = 26, + MX8MM_IOMUXC_ENET_MDIO = 27, + MX8MM_IOMUXC_ENET_TD3 = 28, + MX8MM_IOMUXC_ENET_TD2 = 29, + MX8MM_IOMUXC_ENET_TD1 = 30, + MX8MM_IOMUXC_ENET_TD0 = 31, + MX8MM_IOMUXC_ENET_TX_CTL = 32, + MX8MM_IOMUXC_ENET_TXC = 33, + MX8MM_IOMUXC_ENET_RX_CTL = 34, + MX8MM_IOMUXC_ENET_RXC = 35, + MX8MM_IOMUXC_ENET_RD0 = 36, + MX8MM_IOMUXC_ENET_RD1 = 37, + MX8MM_IOMUXC_ENET_RD2 = 38, + MX8MM_IOMUXC_ENET_RD3 = 39, + MX8MM_IOMUXC_SD1_CLK = 40, + MX8MM_IOMUXC_SD1_CMD = 41, + MX8MM_IOMUXC_SD1_DATA0 = 42, + MX8MM_IOMUXC_SD1_DATA1 = 43, + MX8MM_IOMUXC_SD1_DATA2 = 44, + MX8MM_IOMUXC_SD1_DATA3 = 45, + MX8MM_IOMUXC_SD1_DATA4 = 46, + MX8MM_IOMUXC_SD1_DATA5 = 47, + MX8MM_IOMUXC_SD1_DATA6 = 48, + MX8MM_IOMUXC_SD1_DATA7 = 49, + MX8MM_IOMUXC_SD1_RESET_B = 50, + MX8MM_IOMUXC_SD1_STROBE = 51, + MX8MM_IOMUXC_SD2_CD_B = 52, + MX8MM_IOMUXC_SD2_CLK = 53, + MX8MM_IOMUXC_SD2_CMD = 54, + MX8MM_IOMUXC_SD2_DATA0 = 55, + MX8MM_IOMUXC_SD2_DATA1 = 56, + MX8MM_IOMUXC_SD2_DATA2 = 57, + MX8MM_IOMUXC_SD2_DATA3 = 58, + MX8MM_IOMUXC_SD2_RESET_B = 59, + MX8MM_IOMUXC_SD2_WP = 60, + MX8MM_IOMUXC_NAND_ALE = 61, + MX8MM_IOMUXC_NAND_CE0 = 62, + MX8MM_IOMUXC_NAND_CE1 = 63, + MX8MM_IOMUXC_NAND_CE2 = 64, + MX8MM_IOMUXC_NAND_CE3 = 65, + MX8MM_IOMUXC_NAND_CLE = 66, + MX8MM_IOMUXC_NAND_DATA00 = 67, + MX8MM_IOMUXC_NAND_DATA01 = 68, + MX8MM_IOMUXC_NAND_DATA02 = 69, + MX8MM_IOMUXC_NAND_DATA03 = 70, + MX8MM_IOMUXC_NAND_DATA04 = 71, + MX8MM_IOMUXC_NAND_DATA05 = 72, + MX8MM_IOMUXC_NAND_DATA06 = 73, + MX8MM_IOMUXC_NAND_DATA07 = 74, + MX8MM_IOMUXC_NAND_DQS = 75, + MX8MM_IOMUXC_NAND_RE_B = 76, + MX8MM_IOMUXC_NAND_READY_B = 77, + MX8MM_IOMUXC_NAND_WE_B = 78, + MX8MM_IOMUXC_NAND_WP_B = 79, + MX8MM_IOMUXC_SAI5_RXFS = 80, + MX8MM_IOMUXC_SAI5_RXC = 81, + MX8MM_IOMUXC_SAI5_RXD0 = 82, + MX8MM_IOMUXC_SAI5_RXD1 = 83, + MX8MM_IOMUXC_SAI5_RXD2 = 84, + MX8MM_IOMUXC_SAI5_RXD3 = 85, + MX8MM_IOMUXC_SAI5_MCLK = 86, + MX8MM_IOMUXC_SAI1_RXFS = 87, + MX8MM_IOMUXC_SAI1_RXC = 88, + MX8MM_IOMUXC_SAI1_RXD0 = 89, + MX8MM_IOMUXC_SAI1_RXD1 = 90, + MX8MM_IOMUXC_SAI1_RXD2 = 91, + MX8MM_IOMUXC_SAI1_RXD3 = 92, + MX8MM_IOMUXC_SAI1_RXD4 = 93, + MX8MM_IOMUXC_SAI1_RXD5 = 94, + MX8MM_IOMUXC_SAI1_RXD6 = 95, + MX8MM_IOMUXC_SAI1_RXD7 = 96, + MX8MM_IOMUXC_SAI1_TXFS = 97, + MX8MM_IOMUXC_SAI1_TXC = 98, + MX8MM_IOMUXC_SAI1_TXD0 = 99, + MX8MM_IOMUXC_SAI1_TXD1 = 100, + MX8MM_IOMUXC_SAI1_TXD2 = 101, + MX8MM_IOMUXC_SAI1_TXD3 = 102, + MX8MM_IOMUXC_SAI1_TXD4 = 103, + MX8MM_IOMUXC_SAI1_TXD5 = 104, + MX8MM_IOMUXC_SAI1_TXD6 = 105, + MX8MM_IOMUXC_SAI1_TXD7 = 106, + MX8MM_IOMUXC_SAI1_MCLK = 107, + MX8MM_IOMUXC_SAI2_RXFS = 108, + MX8MM_IOMUXC_SAI2_RXC = 109, + MX8MM_IOMUXC_SAI2_RXD0 = 110, + MX8MM_IOMUXC_SAI2_TXFS = 111, + MX8MM_IOMUXC_SAI2_TXC = 112, + MX8MM_IOMUXC_SAI2_TXD0 = 113, + MX8MM_IOMUXC_SAI2_MCLK = 114, + MX8MM_IOMUXC_SAI3_RXFS = 115, + MX8MM_IOMUXC_SAI3_RXC = 116, + MX8MM_IOMUXC_SAI3_RXD = 117, + MX8MM_IOMUXC_SAI3_TXFS = 118, + MX8MM_IOMUXC_SAI3_TXC = 119, + MX8MM_IOMUXC_SAI3_TXD = 120, + MX8MM_IOMUXC_SAI3_MCLK = 121, + MX8MM_IOMUXC_SPDIF_TX = 122, + MX8MM_IOMUXC_SPDIF_RX = 123, + MX8MM_IOMUXC_SPDIF_EXT_CLK = 124, + MX8MM_IOMUXC_ECSPI1_SCLK = 125, + MX8MM_IOMUXC_ECSPI1_MOSI = 126, + MX8MM_IOMUXC_ECSPI1_MISO = 127, + MX8MM_IOMUXC_ECSPI1_SS0 = 128, + MX8MM_IOMUXC_ECSPI2_SCLK = 129, + MX8MM_IOMUXC_ECSPI2_MOSI = 130, + MX8MM_IOMUXC_ECSPI2_MISO = 131, + MX8MM_IOMUXC_ECSPI2_SS0 = 132, + MX8MM_IOMUXC_I2C1_SCL = 133, + MX8MM_IOMUXC_I2C1_SDA = 134, + MX8MM_IOMUXC_I2C2_SCL = 135, + MX8MM_IOMUXC_I2C2_SDA = 136, + MX8MM_IOMUXC_I2C3_SCL = 137, + MX8MM_IOMUXC_I2C3_SDA = 138, + MX8MM_IOMUXC_I2C4_SCL = 139, + MX8MM_IOMUXC_I2C4_SDA = 140, + MX8MM_IOMUXC_UART1_RXD = 141, + MX8MM_IOMUXC_UART1_TXD = 142, + MX8MM_IOMUXC_UART2_RXD = 143, + MX8MM_IOMUXC_UART2_TXD = 144, + MX8MM_IOMUXC_UART3_RXD = 145, + MX8MM_IOMUXC_UART3_TXD = 146, + MX8MM_IOMUXC_UART4_RXD = 147, + MX8MM_IOMUXC_UART4_TXD = 148, +}; + +enum imx8mn_pads { + MX8MN_PAD_RESERVE0 = 0, + MX8MN_PAD_RESERVE1 = 1, + MX8MN_PAD_RESERVE2 = 2, + MX8MN_PAD_RESERVE3 = 3, + MX8MN_PAD_RESERVE4 = 4, + MX8MN_PAD_RESERVE5 = 5, + MX8MN_PAD_RESERVE6 = 6, + MX8MN_PAD_RESERVE7 = 7, + MX8MN_IOMUXC_BOOT_MODE2 = 8, + MX8MN_IOMUXC_BOOT_MODE3 = 9, + MX8MN_IOMUXC_GPIO1_IO00 = 10, + MX8MN_IOMUXC_GPIO1_IO01 = 11, + MX8MN_IOMUXC_GPIO1_IO02 = 12, + MX8MN_IOMUXC_GPIO1_IO03 = 13, + MX8MN_IOMUXC_GPIO1_IO04 = 14, + MX8MN_IOMUXC_GPIO1_IO05 = 15, + MX8MN_IOMUXC_GPIO1_IO06 = 16, + MX8MN_IOMUXC_GPIO1_IO07 = 17, + MX8MN_IOMUXC_GPIO1_IO08 = 18, + MX8MN_IOMUXC_GPIO1_IO09 = 19, + MX8MN_IOMUXC_GPIO1_IO10 = 20, + MX8MN_IOMUXC_GPIO1_IO11 = 21, + MX8MN_IOMUXC_GPIO1_IO12 = 22, + MX8MN_IOMUXC_GPIO1_IO13 = 23, + MX8MN_IOMUXC_GPIO1_IO14 = 24, + MX8MN_IOMUXC_GPIO1_IO15 = 25, + MX8MN_IOMUXC_ENET_MDC = 26, + MX8MN_IOMUXC_ENET_MDIO = 27, + MX8MN_IOMUXC_ENET_TD3 = 28, + MX8MN_IOMUXC_ENET_TD2 = 29, + MX8MN_IOMUXC_ENET_TD1 = 30, + MX8MN_IOMUXC_ENET_TD0 = 31, + MX8MN_IOMUXC_ENET_TX_CTL = 32, + MX8MN_IOMUXC_ENET_TXC = 33, + MX8MN_IOMUXC_ENET_RX_CTL = 34, + MX8MN_IOMUXC_ENET_RXC = 35, + MX8MN_IOMUXC_ENET_RD0 = 36, + MX8MN_IOMUXC_ENET_RD1 = 37, + MX8MN_IOMUXC_ENET_RD2 = 38, + MX8MN_IOMUXC_ENET_RD3 = 39, + MX8MN_IOMUXC_SD1_CLK = 40, + MX8MN_IOMUXC_SD1_CMD = 41, + MX8MN_IOMUXC_SD1_DATA0 = 42, + MX8MN_IOMUXC_SD1_DATA1 = 43, + MX8MN_IOMUXC_SD1_DATA2 = 44, + MX8MN_IOMUXC_SD1_DATA3 = 45, + MX8MN_IOMUXC_SD1_DATA4 = 46, + MX8MN_IOMUXC_SD1_DATA5 = 47, + MX8MN_IOMUXC_SD1_DATA6 = 48, + MX8MN_IOMUXC_SD1_DATA7 = 49, + MX8MN_IOMUXC_SD1_RESET_B = 50, + MX8MN_IOMUXC_SD1_STROBE = 51, + MX8MN_IOMUXC_SD2_CD_B = 52, + MX8MN_IOMUXC_SD2_CLK = 53, + MX8MN_IOMUXC_SD2_CMD = 54, + MX8MN_IOMUXC_SD2_DATA0 = 55, + MX8MN_IOMUXC_SD2_DATA1 = 56, + MX8MN_IOMUXC_SD2_DATA2 = 57, + MX8MN_IOMUXC_SD2_DATA3 = 58, + MX8MN_IOMUXC_SD2_RESET_B = 59, + MX8MN_IOMUXC_SD2_WP = 60, + MX8MN_IOMUXC_NAND_ALE = 61, + MX8MN_IOMUXC_NAND_CE0 = 62, + MX8MN_IOMUXC_NAND_CE1 = 63, + MX8MN_IOMUXC_NAND_CE2 = 64, + MX8MN_IOMUXC_NAND_CE3 = 65, + MX8MN_IOMUXC_NAND_CLE = 66, + MX8MN_IOMUXC_NAND_DATA00 = 67, + MX8MN_IOMUXC_NAND_DATA01 = 68, + MX8MN_IOMUXC_NAND_DATA02 = 69, + MX8MN_IOMUXC_NAND_DATA03 = 70, + MX8MN_IOMUXC_NAND_DATA04 = 71, + MX8MN_IOMUXC_NAND_DATA05 = 72, + MX8MN_IOMUXC_NAND_DATA06 = 73, + MX8MN_IOMUXC_NAND_DATA07 = 74, + MX8MN_IOMUXC_NAND_DQS = 75, + MX8MN_IOMUXC_NAND_RE_B = 76, + MX8MN_IOMUXC_NAND_READY_B = 77, + MX8MN_IOMUXC_NAND_WE_B = 78, + MX8MN_IOMUXC_NAND_WP_B = 79, + MX8MN_IOMUXC_SAI5_RXFS = 80, + MX8MN_IOMUXC_SAI5_RXC = 81, + MX8MN_IOMUXC_SAI5_RXD0 = 82, + MX8MN_IOMUXC_SAI5_RXD1 = 83, + MX8MN_IOMUXC_SAI5_RXD2 = 84, + MX8MN_IOMUXC_SAI5_RXD3 = 85, + MX8MN_IOMUXC_SAI5_MCLK = 86, + MX8MN_IOMUXC_SAI1_RXFS = 87, + MX8MN_IOMUXC_SAI1_RXC = 88, + MX8MN_IOMUXC_SAI1_RXD0 = 89, + MX8MN_IOMUXC_SAI1_RXD1 = 90, + MX8MN_IOMUXC_SAI1_RXD2 = 91, + MX8MN_IOMUXC_SAI1_RXD3 = 92, + MX8MN_IOMUXC_SAI1_RXD4 = 93, + MX8MN_IOMUXC_SAI1_RXD5 = 94, + MX8MN_IOMUXC_SAI1_RXD6 = 95, + MX8MN_IOMUXC_SAI1_RXD7 = 96, + MX8MN_IOMUXC_SAI1_TXFS = 97, + MX8MN_IOMUXC_SAI1_TXC = 98, + MX8MN_IOMUXC_SAI1_TXD0 = 99, + MX8MN_IOMUXC_SAI1_TXD1 = 100, + MX8MN_IOMUXC_SAI1_TXD2 = 101, + MX8MN_IOMUXC_SAI1_TXD3 = 102, + MX8MN_IOMUXC_SAI1_TXD4 = 103, + MX8MN_IOMUXC_SAI1_TXD5 = 104, + MX8MN_IOMUXC_SAI1_TXD6 = 105, + MX8MN_IOMUXC_SAI1_TXD7 = 106, + MX8MN_IOMUXC_SAI1_MCLK = 107, + MX8MN_IOMUXC_SAI2_RXFS = 108, + MX8MN_IOMUXC_SAI2_RXC = 109, + MX8MN_IOMUXC_SAI2_RXD0 = 110, + MX8MN_IOMUXC_SAI2_TXFS = 111, + MX8MN_IOMUXC_SAI2_TXC = 112, + MX8MN_IOMUXC_SAI2_TXD0 = 113, + MX8MN_IOMUXC_SAI2_MCLK = 114, + MX8MN_IOMUXC_SAI3_RXFS = 115, + MX8MN_IOMUXC_SAI3_RXC = 116, + MX8MN_IOMUXC_SAI3_RXD = 117, + MX8MN_IOMUXC_SAI3_TXFS = 118, + MX8MN_IOMUXC_SAI3_TXC = 119, + MX8MN_IOMUXC_SAI3_TXD = 120, + MX8MN_IOMUXC_SAI3_MCLK = 121, + MX8MN_IOMUXC_SPDIF_TX = 122, + MX8MN_IOMUXC_SPDIF_RX = 123, + MX8MN_IOMUXC_SPDIF_EXT_CLK = 124, + MX8MN_IOMUXC_ECSPI1_SCLK = 125, + MX8MN_IOMUXC_ECSPI1_MOSI = 126, + MX8MN_IOMUXC_ECSPI1_MISO = 127, + MX8MN_IOMUXC_ECSPI1_SS0 = 128, + MX8MN_IOMUXC_ECSPI2_SCLK = 129, + MX8MN_IOMUXC_ECSPI2_MOSI = 130, + MX8MN_IOMUXC_ECSPI2_MISO = 131, + MX8MN_IOMUXC_ECSPI2_SS0 = 132, + MX8MN_IOMUXC_I2C1_SCL = 133, + MX8MN_IOMUXC_I2C1_SDA = 134, + MX8MN_IOMUXC_I2C2_SCL = 135, + MX8MN_IOMUXC_I2C2_SDA = 136, + MX8MN_IOMUXC_I2C3_SCL = 137, + MX8MN_IOMUXC_I2C3_SDA = 138, + MX8MN_IOMUXC_I2C4_SCL = 139, + MX8MN_IOMUXC_I2C4_SDA = 140, + MX8MN_IOMUXC_UART1_RXD = 141, + MX8MN_IOMUXC_UART1_TXD = 142, + MX8MN_IOMUXC_UART2_RXD = 143, + MX8MN_IOMUXC_UART2_TXD = 144, + MX8MN_IOMUXC_UART3_RXD = 145, + MX8MN_IOMUXC_UART3_TXD = 146, + MX8MN_IOMUXC_UART4_RXD = 147, + MX8MN_IOMUXC_UART4_TXD = 148, +}; + +enum imx8mp_pads { + MX8MP_IOMUXC_RESERVE0 = 0, + MX8MP_IOMUXC_RESERVE1 = 1, + MX8MP_IOMUXC_RESERVE2 = 2, + MX8MP_IOMUXC_RESERVE3 = 3, + MX8MP_IOMUXC_RESERVE4 = 4, + MX8MP_IOMUXC_GPIO1_IO00 = 5, + MX8MP_IOMUXC_GPIO1_IO01 = 6, + MX8MP_IOMUXC_GPIO1_IO02 = 7, + MX8MP_IOMUXC_GPIO1_IO03 = 8, + MX8MP_IOMUXC_GPIO1_IO04 = 9, + MX8MP_IOMUXC_GPIO1_IO05 = 10, + MX8MP_IOMUXC_GPIO1_IO06 = 11, + MX8MP_IOMUXC_GPIO1_IO07 = 12, + MX8MP_IOMUXC_GPIO1_IO08 = 13, + MX8MP_IOMUXC_GPIO1_IO09 = 14, + MX8MP_IOMUXC_GPIO1_IO10 = 15, + MX8MP_IOMUXC_GPIO1_IO11 = 16, + MX8MP_IOMUXC_GPIO1_IO12 = 17, + MX8MP_IOMUXC_GPIO1_IO13 = 18, + MX8MP_IOMUXC_GPIO1_IO14 = 19, + MX8MP_IOMUXC_GPIO1_IO15 = 20, + MX8MP_IOMUXC_ENET_MDC = 21, + MX8MP_IOMUXC_ENET_MDIO = 22, + MX8MP_IOMUXC_ENET_TD3 = 23, + MX8MP_IOMUXC_ENET_TD2 = 24, + MX8MP_IOMUXC_ENET_TD1 = 25, + MX8MP_IOMUXC_ENET_TD0 = 26, + MX8MP_IOMUXC_ENET_TX_CTL = 27, + MX8MP_IOMUXC_ENET_TXC = 28, + MX8MP_IOMUXC_ENET_RX_CTL = 29, + MX8MP_IOMUXC_ENET_RXC = 30, + MX8MP_IOMUXC_ENET_RD0 = 31, + MX8MP_IOMUXC_ENET_RD1 = 32, + MX8MP_IOMUXC_ENET_RD2 = 33, + MX8MP_IOMUXC_ENET_RD3 = 34, + MX8MP_IOMUXC_SD1_CLK = 35, + MX8MP_IOMUXC_SD1_CMD = 36, + MX8MP_IOMUXC_SD1_DATA0 = 37, + MX8MP_IOMUXC_SD1_DATA1 = 38, + MX8MP_IOMUXC_SD1_DATA2 = 39, + MX8MP_IOMUXC_SD1_DATA3 = 40, + MX8MP_IOMUXC_SD1_DATA4 = 41, + MX8MP_IOMUXC_SD1_DATA5 = 42, + MX8MP_IOMUXC_SD1_DATA6 = 43, + MX8MP_IOMUXC_SD1_DATA7 = 44, + MX8MP_IOMUXC_SD1_RESET_B = 45, + MX8MP_IOMUXC_SD1_STROBE = 46, + MX8MP_IOMUXC_SD2_CD_B = 47, + MX8MP_IOMUXC_SD2_CLK = 48, + MX8MP_IOMUXC_SD2_CMD = 49, + MX8MP_IOMUXC_SD2_DATA0 = 50, + MX8MP_IOMUXC_SD2_DATA1 = 51, + MX8MP_IOMUXC_SD2_DATA2 = 52, + MX8MP_IOMUXC_SD2_DATA3 = 53, + MX8MP_IOMUXC_SD2_RESET_B = 54, + MX8MP_IOMUXC_SD2_WP = 55, + MX8MP_IOMUXC_NAND_ALE = 56, + MX8MP_IOMUXC_NAND_CE0_B = 57, + MX8MP_IOMUXC_NAND_CE1_B = 58, + MX8MP_IOMUXC_NAND_CE2_B = 59, + MX8MP_IOMUXC_NAND_CE3_B = 60, + MX8MP_IOMUXC_NAND_CLE = 61, + MX8MP_IOMUXC_NAND_DATA00 = 62, + MX8MP_IOMUXC_NAND_DATA01 = 63, + MX8MP_IOMUXC_NAND_DATA02 = 64, + MX8MP_IOMUXC_NAND_DATA03 = 65, + MX8MP_IOMUXC_NAND_DATA04 = 66, + MX8MP_IOMUXC_NAND_DATA05 = 67, + MX8MP_IOMUXC_NAND_DATA06 = 68, + MX8MP_IOMUXC_NAND_DATA07 = 69, + MX8MP_IOMUXC_NAND_DQS = 70, + MX8MP_IOMUXC_NAND_RE_B = 71, + MX8MP_IOMUXC_NAND_READY_B = 72, + MX8MP_IOMUXC_NAND_WE_B = 73, + MX8MP_IOMUXC_NAND_WP_B = 74, + MX8MP_IOMUXC_SAI5_RXFS = 75, + MX8MP_IOMUXC_SAI5_RXC = 76, + MX8MP_IOMUXC_SAI5_RXD0 = 77, + MX8MP_IOMUXC_SAI5_RXD1 = 78, + MX8MP_IOMUXC_SAI5_RXD2 = 79, + MX8MP_IOMUXC_SAI5_RXD3 = 80, + MX8MP_IOMUXC_SAI5_MCLK = 81, + MX8MP_IOMUXC_SAI1_RXFS = 82, + MX8MP_IOMUXC_SAI1_RXC = 83, + MX8MP_IOMUXC_SAI1_RXD0 = 84, + MX8MP_IOMUXC_SAI1_RXD1 = 85, + MX8MP_IOMUXC_SAI1_RXD2 = 86, + MX8MP_IOMUXC_SAI1_RXD3 = 87, + MX8MP_IOMUXC_SAI1_RXD4 = 88, + MX8MP_IOMUXC_SAI1_RXD5 = 89, + MX8MP_IOMUXC_SAI1_RXD6 = 90, + MX8MP_IOMUXC_SAI1_RXD7 = 91, + MX8MP_IOMUXC_SAI1_TXFS = 92, + MX8MP_IOMUXC_SAI1_TXC = 93, + MX8MP_IOMUXC_SAI1_TXD0 = 94, + MX8MP_IOMUXC_SAI1_TXD1 = 95, + MX8MP_IOMUXC_SAI1_TXD2 = 96, + MX8MP_IOMUXC_SAI1_TXD3 = 97, + MX8MP_IOMUXC_SAI1_TXD4 = 98, + MX8MP_IOMUXC_SAI1_TXD5 = 99, + MX8MP_IOMUXC_SAI1_TXD6 = 100, + MX8MP_IOMUXC_SAI1_TXD7 = 101, + MX8MP_IOMUXC_SAI1_MCLK = 102, + MX8MP_IOMUXC_SAI2_RXFS = 103, + MX8MP_IOMUXC_SAI2_RXC = 104, + MX8MP_IOMUXC_SAI2_RXD0 = 105, + MX8MP_IOMUXC_SAI2_TXFS = 106, + MX8MP_IOMUXC_SAI2_TXC = 107, + MX8MP_IOMUXC_SAI2_TXD0 = 108, + MX8MP_IOMUXC_SAI2_MCLK = 109, + MX8MP_IOMUXC_SAI3_RXFS = 110, + MX8MP_IOMUXC_SAI3_RXC = 111, + MX8MP_IOMUXC_SAI3_RXD = 112, + MX8MP_IOMUXC_SAI3_TXFS = 113, + MX8MP_IOMUXC_SAI3_TXC = 114, + MX8MP_IOMUXC_SAI3_TXD = 115, + MX8MP_IOMUXC_SAI3_MCLK = 116, + MX8MP_IOMUXC_SPDIF_TX = 117, + MX8MP_IOMUXC_SPDIF_RX = 118, + MX8MP_IOMUXC_SPDIF_EXT_CLK = 119, + MX8MP_IOMUXC_ECSPI1_SCLK = 120, + MX8MP_IOMUXC_ECSPI1_MOSI = 121, + MX8MP_IOMUXC_ECSPI1_MISO = 122, + MX8MP_IOMUXC_ECSPI1_SS0 = 123, + MX8MP_IOMUXC_ECSPI2_SCLK = 124, + MX8MP_IOMUXC_ECSPI2_MOSI = 125, + MX8MP_IOMUXC_ECSPI2_MISO = 126, + MX8MP_IOMUXC_ECSPI2_SS0 = 127, + MX8MP_IOMUXC_I2C1_SCL = 128, + MX8MP_IOMUXC_I2C1_SDA = 129, + MX8MP_IOMUXC_I2C2_SCL = 130, + MX8MP_IOMUXC_I2C2_SDA = 131, + MX8MP_IOMUXC_I2C3_SCL = 132, + MX8MP_IOMUXC_I2C3_SDA = 133, + MX8MP_IOMUXC_I2C4_SCL = 134, + MX8MP_IOMUXC_I2C4_SDA = 135, + MX8MP_IOMUXC_UART1_RXD = 136, + MX8MP_IOMUXC_UART1_TXD = 137, + MX8MP_IOMUXC_UART2_RXD = 138, + MX8MP_IOMUXC_UART2_TXD = 139, + MX8MP_IOMUXC_UART3_RXD = 140, + MX8MP_IOMUXC_UART3_TXD = 141, + MX8MP_IOMUXC_UART4_RXD = 142, + MX8MP_IOMUXC_UART4_TXD = 143, + MX8MP_IOMUXC_HDMI_DDC_SCL = 144, + MX8MP_IOMUXC_HDMI_DDC_SDA = 145, + MX8MP_IOMUXC_HDMI_CEC = 146, + MX8MP_IOMUXC_HDMI_HPD = 147, +}; + +enum imx8mq_pads { + MX8MQ_PAD_RESERVE0 = 0, + MX8MQ_PAD_RESERVE1 = 1, + MX8MQ_PAD_RESERVE2 = 2, + MX8MQ_PAD_RESERVE3 = 3, + MX8MQ_PAD_RESERVE4 = 4, + MX8MQ_IOMUXC_PMIC_STBY_REQ_CCMSRCGPCMIX = 5, + MX8MQ_IOMUXC_PMIC_ON_REQ_SNVSMIX = 6, + MX8MQ_IOMUXC_ONOFF_SNVSMIX = 7, + MX8MQ_IOMUXC_POR_B_SNVSMIX = 8, + MX8MQ_IOMUXC_RTC_RESET_B_SNVSMIX = 9, + MX8MQ_IOMUXC_GPIO1_IO00 = 10, + MX8MQ_IOMUXC_GPIO1_IO01 = 11, + MX8MQ_IOMUXC_GPIO1_IO02 = 12, + MX8MQ_IOMUXC_GPIO1_IO03 = 13, + MX8MQ_IOMUXC_GPIO1_IO04 = 14, + MX8MQ_IOMUXC_GPIO1_IO05 = 15, + MX8MQ_IOMUXC_GPIO1_IO06 = 16, + MX8MQ_IOMUXC_GPIO1_IO07 = 17, + MX8MQ_IOMUXC_GPIO1_IO08 = 18, + MX8MQ_IOMUXC_GPIO1_IO09 = 19, + MX8MQ_IOMUXC_GPIO1_IO10 = 20, + MX8MQ_IOMUXC_GPIO1_IO11 = 21, + MX8MQ_IOMUXC_GPIO1_IO12 = 22, + MX8MQ_IOMUXC_GPIO1_IO13 = 23, + MX8MQ_IOMUXC_GPIO1_IO14 = 24, + MX8MQ_IOMUXC_GPIO1_IO15 = 25, + MX8MQ_IOMUXC_ENET_MDC = 26, + MX8MQ_IOMUXC_ENET_MDIO = 27, + MX8MQ_IOMUXC_ENET_TD3 = 28, + MX8MQ_IOMUXC_ENET_TD2 = 29, + MX8MQ_IOMUXC_ENET_TD1 = 30, + MX8MQ_IOMUXC_ENET_TD0 = 31, + MX8MQ_IOMUXC_ENET_TX_CTL = 32, + MX8MQ_IOMUXC_ENET_TXC = 33, + MX8MQ_IOMUXC_ENET_RX_CTL = 34, + MX8MQ_IOMUXC_ENET_RXC = 35, + MX8MQ_IOMUXC_ENET_RD0 = 36, + MX8MQ_IOMUXC_ENET_RD1 = 37, + MX8MQ_IOMUXC_ENET_RD2 = 38, + MX8MQ_IOMUXC_ENET_RD3 = 39, + MX8MQ_IOMUXC_SD1_CLK = 40, + MX8MQ_IOMUXC_SD1_CMD = 41, + MX8MQ_IOMUXC_SD1_DATA0 = 42, + MX8MQ_IOMUXC_SD1_DATA1 = 43, + MX8MQ_IOMUXC_SD1_DATA2 = 44, + MX8MQ_IOMUXC_SD1_DATA3 = 45, + MX8MQ_IOMUXC_SD1_DATA4 = 46, + MX8MQ_IOMUXC_SD1_DATA5 = 47, + MX8MQ_IOMUXC_SD1_DATA6 = 48, + MX8MQ_IOMUXC_SD1_DATA7 = 49, + MX8MQ_IOMUXC_SD1_RESET_B = 50, + MX8MQ_IOMUXC_SD1_STROBE = 51, + MX8MQ_IOMUXC_SD2_CD_B = 52, + MX8MQ_IOMUXC_SD2_CLK = 53, + MX8MQ_IOMUXC_SD2_CMD = 54, + MX8MQ_IOMUXC_SD2_DATA0 = 55, + MX8MQ_IOMUXC_SD2_DATA1 = 56, + MX8MQ_IOMUXC_SD2_DATA2 = 57, + MX8MQ_IOMUXC_SD2_DATA3 = 58, + MX8MQ_IOMUXC_SD2_RESET_B = 59, + MX8MQ_IOMUXC_SD2_WP = 60, + MX8MQ_IOMUXC_NAND_ALE = 61, + MX8MQ_IOMUXC_NAND_CE0_B = 62, + MX8MQ_IOMUXC_NAND_CE1_B = 63, + MX8MQ_IOMUXC_NAND_CE2_B = 64, + MX8MQ_IOMUXC_NAND_CE3_B = 65, + MX8MQ_IOMUXC_NAND_CLE = 66, + MX8MQ_IOMUXC_NAND_DATA00 = 67, + MX8MQ_IOMUXC_NAND_DATA01 = 68, + MX8MQ_IOMUXC_NAND_DATA02 = 69, + MX8MQ_IOMUXC_NAND_DATA03 = 70, + MX8MQ_IOMUXC_NAND_DATA04 = 71, + MX8MQ_IOMUXC_NAND_DATA05 = 72, + MX8MQ_IOMUXC_NAND_DATA06 = 73, + MX8MQ_IOMUXC_NAND_DATA07 = 74, + MX8MQ_IOMUXC_NAND_DQS = 75, + MX8MQ_IOMUXC_NAND_RE_B = 76, + MX8MQ_IOMUXC_NAND_READY_B = 77, + MX8MQ_IOMUXC_NAND_WE_B = 78, + MX8MQ_IOMUXC_NAND_WP_B = 79, + MX8MQ_IOMUXC_SAI5_RXFS = 80, + MX8MQ_IOMUXC_SAI5_RXC = 81, + MX8MQ_IOMUXC_SAI5_RXD0 = 82, + MX8MQ_IOMUXC_SAI5_RXD1 = 83, + MX8MQ_IOMUXC_SAI5_RXD2 = 84, + MX8MQ_IOMUXC_SAI5_RXD3 = 85, + MX8MQ_IOMUXC_SAI5_MCLK = 86, + MX8MQ_IOMUXC_SAI1_RXFS = 87, + MX8MQ_IOMUXC_SAI1_RXC = 88, + MX8MQ_IOMUXC_SAI1_RXD0 = 89, + MX8MQ_IOMUXC_SAI1_RXD1 = 90, + MX8MQ_IOMUXC_SAI1_RXD2 = 91, + MX8MQ_IOMUXC_SAI1_RXD3 = 92, + MX8MQ_IOMUXC_SAI1_RXD4 = 93, + MX8MQ_IOMUXC_SAI1_RXD5 = 94, + MX8MQ_IOMUXC_SAI1_RXD6 = 95, + MX8MQ_IOMUXC_SAI1_RXD7 = 96, + MX8MQ_IOMUXC_SAI1_TXFS = 97, + MX8MQ_IOMUXC_SAI1_TXC = 98, + MX8MQ_IOMUXC_SAI1_TXD0 = 99, + MX8MQ_IOMUXC_SAI1_TXD1 = 100, + MX8MQ_IOMUXC_SAI1_TXD2 = 101, + MX8MQ_IOMUXC_SAI1_TXD3 = 102, + MX8MQ_IOMUXC_SAI1_TXD4 = 103, + MX8MQ_IOMUXC_SAI1_TXD5 = 104, + MX8MQ_IOMUXC_SAI1_TXD6 = 105, + MX8MQ_IOMUXC_SAI1_TXD7 = 106, + MX8MQ_IOMUXC_SAI1_MCLK = 107, + MX8MQ_IOMUXC_SAI2_RXFS = 108, + MX8MQ_IOMUXC_SAI2_RXC = 109, + MX8MQ_IOMUXC_SAI2_RXD0 = 110, + MX8MQ_IOMUXC_SAI2_TXFS = 111, + MX8MQ_IOMUXC_SAI2_TXC = 112, + MX8MQ_IOMUXC_SAI2_TXD0 = 113, + MX8MQ_IOMUXC_SAI2_MCLK = 114, + MX8MQ_IOMUXC_SAI3_RXFS = 115, + MX8MQ_IOMUXC_SAI3_RXC = 116, + MX8MQ_IOMUXC_SAI3_RXD = 117, + MX8MQ_IOMUXC_SAI3_TXFS = 118, + MX8MQ_IOMUXC_SAI3_TXC = 119, + MX8MQ_IOMUXC_SAI3_TXD = 120, + MX8MQ_IOMUXC_SAI3_MCLK = 121, + MX8MQ_IOMUXC_SPDIF_TX = 122, + MX8MQ_IOMUXC_SPDIF_RX = 123, + MX8MQ_IOMUXC_SPDIF_EXT_CLK = 124, + MX8MQ_IOMUXC_ECSPI1_SCLK = 125, + MX8MQ_IOMUXC_ECSPI1_MOSI = 126, + MX8MQ_IOMUXC_ECSPI1_MISO = 127, + MX8MQ_IOMUXC_ECSPI1_SS0 = 128, + MX8MQ_IOMUXC_ECSPI2_SCLK = 129, + MX8MQ_IOMUXC_ECSPI2_MOSI = 130, + MX8MQ_IOMUXC_ECSPI2_MISO = 131, + MX8MQ_IOMUXC_ECSPI2_SS0 = 132, + MX8MQ_IOMUXC_I2C1_SCL = 133, + MX8MQ_IOMUXC_I2C1_SDA = 134, + MX8MQ_IOMUXC_I2C2_SCL = 135, + MX8MQ_IOMUXC_I2C2_SDA = 136, + MX8MQ_IOMUXC_I2C3_SCL = 137, + MX8MQ_IOMUXC_I2C3_SDA = 138, + MX8MQ_IOMUXC_I2C4_SCL = 139, + MX8MQ_IOMUXC_I2C4_SDA = 140, + MX8MQ_IOMUXC_UART1_RXD = 141, + MX8MQ_IOMUXC_UART1_TXD = 142, + MX8MQ_IOMUXC_UART2_RXD = 143, + MX8MQ_IOMUXC_UART2_TXD = 144, + MX8MQ_IOMUXC_UART3_RXD = 145, + MX8MQ_IOMUXC_UART3_TXD = 146, + MX8MQ_IOMUXC_UART4_RXD = 147, + MX8MQ_IOMUXC_UART4_TXD = 148, +}; + +struct mvebu_mpp_ctrl_data { + union { + void *base; + struct { + struct regmap *map; + u32 offset; + } regmap; + }; +}; + +struct mvebu_mpp_ctrl { + const char *name; + u8 pid; + u8 npins; + unsigned int *pins; + int (*mpp_get)(struct mvebu_mpp_ctrl_data *, unsigned int, long unsigned int *); + int (*mpp_set)(struct mvebu_mpp_ctrl_data *, unsigned int, long unsigned int); + int (*mpp_gpio_req)(struct mvebu_mpp_ctrl_data *, unsigned int); + int (*mpp_gpio_dir)(struct mvebu_mpp_ctrl_data *, unsigned int, bool); +}; + +struct mvebu_mpp_ctrl_setting { + u8 val; + const char *name; + const char *subname; + u8 variant; + u8 flags; +}; + +struct mvebu_mpp_mode { + u8 pid; + struct mvebu_mpp_ctrl_setting *settings; +}; + +struct mvebu_pinctrl_soc_info { + u8 variant; + const struct mvebu_mpp_ctrl *controls; + struct mvebu_mpp_ctrl_data *control_data; + int ncontrols; + struct mvebu_mpp_mode *modes; + int nmodes; + struct pinctrl_gpio_range *gpioranges; + int ngpioranges; +}; + +struct mvebu_pinctrl_function { + const char *name; + const char **groups; + unsigned int num_groups; +}; + +struct mvebu_pinctrl_group { + const char *name; + const struct mvebu_mpp_ctrl *ctrl; + struct mvebu_mpp_ctrl_data *data; + struct mvebu_mpp_ctrl_setting *settings; + unsigned int num_settings; + unsigned int gid; + unsigned int *pins; + unsigned int npins; +}; + +struct mvebu_pinctrl { + struct device *dev; + struct pinctrl_dev *pctldev; + struct pinctrl_desc desc; + struct mvebu_pinctrl_group *groups; + unsigned int num_groups; + struct mvebu_pinctrl_function *functions; + unsigned int num_functions; + u8 variant; +}; + +enum { + V_ARMADA_7K = 1, + V_ARMADA_8K_CPM = 2, + V_ARMADA_8K_CPS = 4, + V_CP115_STANDALONE = 8, + V_ARMADA_7K_8K_CPM = 3, + V_ARMADA_7K_8K_CPS = 5, +}; + +struct armada_37xx_pin_group { + const char *name; + unsigned int start_pin; + unsigned int npins; + u32 reg_mask; + u32 val[3]; + unsigned int extra_pin; + unsigned int extra_npins; + const char *funcs[3]; + unsigned int *pins; +}; + +struct armada_37xx_pin_data { + u8 nr_pins; + char *name; + struct armada_37xx_pin_group *groups; + int ngroups; +}; + +struct armada_37xx_pmx_func { + const char *name; + const char **groups; + unsigned int ngroups; +}; + +struct armada_37xx_pm_state { + u32 out_en_l; + u32 out_en_h; + u32 out_val_l; + u32 out_val_h; + u32 irq_en_l; + u32 irq_en_h; + u32 irq_pol_l; + u32 irq_pol_h; + u32 selection; +}; + +struct armada_37xx_pinctrl { + struct regmap *regmap; + void *base; + const struct armada_37xx_pin_data *data; + struct device *dev; + struct gpio_chip gpio_chip; + struct irq_chip irq_chip; + spinlock_t irq_lock; + struct pinctrl_desc pctl; + struct pinctrl_dev *pctl_dev; + struct armada_37xx_pin_group *groups; + unsigned int ngroups; + struct armada_37xx_pmx_func *funcs; + unsigned int nfuncs; + struct armada_37xx_pm_state pm; +}; + +struct msm_function { + const char *name; + const char * const *groups; + unsigned int ngroups; +}; + +struct msm_pingroup { + const char *name; + const unsigned int *pins; + unsigned int npins; + unsigned int *funcs; + unsigned int nfuncs; + u32 ctl_reg; + u32 io_reg; + u32 intr_cfg_reg; + u32 intr_status_reg; + u32 intr_target_reg; + unsigned int tile: 2; + unsigned int mux_bit: 5; + unsigned int pull_bit: 5; + unsigned int drv_bit: 5; + unsigned int od_bit: 5; + unsigned int oe_bit: 5; + unsigned int in_bit: 5; + unsigned int out_bit: 5; + unsigned int intr_enable_bit: 5; + unsigned int intr_status_bit: 5; + unsigned int intr_ack_high: 1; + unsigned int intr_target_bit: 5; + unsigned int intr_target_kpss_val: 5; + unsigned int intr_raw_status_bit: 5; + char: 1; + unsigned int intr_polarity_bit: 5; + unsigned int intr_detection_bit: 5; + unsigned int intr_detection_width: 5; +}; + +struct msm_gpio_wakeirq_map { + unsigned int gpio; + unsigned int wakeirq; +}; + +struct msm_pinctrl_soc_data { + const struct pinctrl_pin_desc *pins; + unsigned int npins; + const struct msm_function *functions; + unsigned int nfunctions; + const struct msm_pingroup *groups; + unsigned int ngroups; + unsigned int ngpios; + bool pull_no_keeper; + const char * const *tiles; + unsigned int ntiles; + const int *reserved_gpios; + const struct msm_gpio_wakeirq_map *wakeirq_map; + unsigned int nwakeirq_map; + bool wakeirq_dual_edge_errata; + unsigned int gpio_func; +}; + +struct msm_pinctrl { + struct device *dev; + struct pinctrl_dev *pctrl; + struct gpio_chip chip; + struct pinctrl_desc desc; + struct notifier_block restart_nb; + struct irq_chip irq_chip; + int irq; + bool intr_target_use_scm; + raw_spinlock_t lock; + long unsigned int dual_edge_irqs[5]; + long unsigned int enabled_irqs[5]; + long unsigned int skip_wake_irqs[5]; + long unsigned int disabled_for_mux[5]; + const struct msm_pinctrl_soc_data *soc; + void *regs[4]; + u32 phys_base[4]; +}; + +struct soc_device_attribute { + const char *machine; + const char *family; + const char *revision; + const char *serial_number; + const char *soc_id; + const void *data; + const struct attribute_group *custom_attr_group; +}; + +enum { + PINMUX_TYPE_NONE = 0, + PINMUX_TYPE_FUNCTION = 1, + PINMUX_TYPE_GPIO = 2, + PINMUX_TYPE_OUTPUT = 3, + PINMUX_TYPE_INPUT = 4, +}; + +struct sh_pfc_pin { + const char *name; + unsigned int configs; + u16 pin; + u16 enum_id; +}; + +struct sh_pfc_pin_group { + const char *name; + const unsigned int *pins; + const unsigned int *mux; + unsigned int nr_pins; +}; + +struct sh_pfc_function { + const char *name; + const char * const *groups; + unsigned int nr_groups; +}; + +struct pinmux_cfg_reg { + u32 reg; + u8 reg_width; + u8 field_width; + const u16 *enum_ids; + const u8 *var_field_width; +}; + +struct pinmux_drive_reg_field { + u16 pin; + u8 offset; + u8 size; +}; + +struct pinmux_drive_reg { + u32 reg; + const struct pinmux_drive_reg_field fields[8]; +}; + +struct pinmux_bias_reg { + u32 puen; + u32 pud; + const u16 pins[32]; +}; + +struct pinmux_ioctrl_reg { + u32 reg; +}; + +struct pinmux_data_reg { + u32 reg; + u8 reg_width; + const u16 *enum_ids; +}; + +struct pinmux_range { + u16 begin; + u16 end; + u16 force; +}; + +struct sh_pfc_window { + phys_addr_t phys; + void *virt; + long unsigned int size; +}; + +struct sh_pfc_chip; + +struct sh_pfc_soc_info; + +struct sh_pfc_pin_range; + +struct sh_pfc { + struct device *dev; + const struct sh_pfc_soc_info *info; + spinlock_t lock; + unsigned int num_windows; + struct sh_pfc_window *windows; + unsigned int num_irqs; + unsigned int *irqs; + struct sh_pfc_pin_range *ranges; + unsigned int nr_ranges; + unsigned int nr_gpio_pins; + struct sh_pfc_chip *gpio; + u32 *saved_regs; +}; + +struct sh_pfc_soc_operations; + +struct sh_pfc_soc_info { + const char *name; + const struct sh_pfc_soc_operations *ops; + struct pinmux_range function; + const struct sh_pfc_pin *pins; + unsigned int nr_pins; + const struct sh_pfc_pin_group *groups; + unsigned int nr_groups; + const struct sh_pfc_function *functions; + unsigned int nr_functions; + const struct pinmux_cfg_reg *cfg_regs; + const struct pinmux_drive_reg *drive_regs; + const struct pinmux_bias_reg *bias_regs; + const struct pinmux_ioctrl_reg *ioctrl_regs; + const struct pinmux_data_reg *data_regs; + const u16 *pinmux_data; + unsigned int pinmux_data_size; + u32 unlock_reg; +}; + +struct sh_pfc_pin_range { + u16 start; + u16 end; +}; + +struct sh_pfc_soc_operations { + int (*init)(struct sh_pfc *); + unsigned int (*get_bias)(struct sh_pfc *, unsigned int); + void (*set_bias)(struct sh_pfc *, unsigned int, unsigned int); + int (*pin_to_pocctrl)(struct sh_pfc *, unsigned int, u32 *); + void * (*pin_to_portcr)(struct sh_pfc *, unsigned int); +}; + +struct sh_pfc_pin_config { + u16 gpio_enabled: 1; + u16 mux_mark: 15; +}; + +struct sh_pfc_pinctrl { + struct pinctrl_dev *pctl; + struct pinctrl_desc pctl_desc; + struct sh_pfc *pfc; + struct pinctrl_pin_desc *pins; + struct sh_pfc_pin_config *configs; + const char *func_prop_name; + const char *groups_prop_name; + const char *pins_prop_name; +}; + +union vin_data16 { + unsigned int data16[16]; + unsigned int data12[12]; + unsigned int data10[10]; + unsigned int data8[8]; +}; + +union vin_data { + unsigned int data24[24]; + unsigned int data20[20]; + unsigned int data16[16]; + unsigned int data12[12]; + unsigned int data10[10]; + unsigned int data8[8]; + unsigned int data4[4]; +}; + +enum { + PINMUX_RESERVED = 0, + PINMUX_DATA_BEGIN = 1, + GP_0_0_DATA = 2, + GP_0_1_DATA = 3, + GP_0_2_DATA = 4, + GP_0_3_DATA = 5, + GP_0_4_DATA = 6, + GP_0_5_DATA = 7, + GP_0_6_DATA = 8, + GP_0_7_DATA = 9, + GP_0_8_DATA = 10, + GP_0_9_DATA = 11, + GP_0_10_DATA = 12, + GP_0_11_DATA = 13, + GP_0_12_DATA = 14, + GP_0_13_DATA = 15, + GP_0_14_DATA = 16, + GP_0_15_DATA = 17, + GP_1_0_DATA = 18, + GP_1_1_DATA = 19, + GP_1_2_DATA = 20, + GP_1_3_DATA = 21, + GP_1_4_DATA = 22, + GP_1_5_DATA = 23, + GP_1_6_DATA = 24, + GP_1_7_DATA = 25, + GP_1_8_DATA = 26, + GP_1_9_DATA = 27, + GP_1_10_DATA = 28, + GP_1_11_DATA = 29, + GP_1_12_DATA = 30, + GP_1_13_DATA = 31, + GP_1_14_DATA = 32, + GP_1_15_DATA = 33, + GP_1_16_DATA = 34, + GP_1_17_DATA = 35, + GP_1_18_DATA = 36, + GP_1_19_DATA = 37, + GP_1_20_DATA = 38, + GP_1_21_DATA = 39, + GP_1_22_DATA = 40, + GP_1_23_DATA = 41, + GP_1_24_DATA = 42, + GP_1_25_DATA = 43, + GP_1_26_DATA = 44, + GP_1_27_DATA = 45, + GP_1_28_DATA = 46, + GP_2_0_DATA = 47, + GP_2_1_DATA = 48, + GP_2_2_DATA = 49, + GP_2_3_DATA = 50, + GP_2_4_DATA = 51, + GP_2_5_DATA = 52, + GP_2_6_DATA = 53, + GP_2_7_DATA = 54, + GP_2_8_DATA = 55, + GP_2_9_DATA = 56, + GP_2_10_DATA = 57, + GP_2_11_DATA = 58, + GP_2_12_DATA = 59, + GP_2_13_DATA = 60, + GP_2_14_DATA = 61, + GP_3_0_DATA = 62, + GP_3_1_DATA = 63, + GP_3_2_DATA = 64, + GP_3_3_DATA = 65, + GP_3_4_DATA = 66, + GP_3_5_DATA = 67, + GP_3_6_DATA = 68, + GP_3_7_DATA = 69, + GP_3_8_DATA = 70, + GP_3_9_DATA = 71, + GP_3_10_DATA = 72, + GP_3_11_DATA = 73, + GP_3_12_DATA = 74, + GP_3_13_DATA = 75, + GP_3_14_DATA = 76, + GP_3_15_DATA = 77, + GP_4_0_DATA = 78, + GP_4_1_DATA = 79, + GP_4_2_DATA = 80, + GP_4_3_DATA = 81, + GP_4_4_DATA = 82, + GP_4_5_DATA = 83, + GP_4_6_DATA = 84, + GP_4_7_DATA = 85, + GP_4_8_DATA = 86, + GP_4_9_DATA = 87, + GP_4_10_DATA = 88, + GP_4_11_DATA = 89, + GP_4_12_DATA = 90, + GP_4_13_DATA = 91, + GP_4_14_DATA = 92, + GP_4_15_DATA = 93, + GP_4_16_DATA = 94, + GP_4_17_DATA = 95, + GP_5_0_DATA = 96, + GP_5_1_DATA = 97, + GP_5_2_DATA = 98, + GP_5_3_DATA = 99, + GP_5_4_DATA = 100, + GP_5_5_DATA = 101, + GP_5_6_DATA = 102, + GP_5_7_DATA = 103, + GP_5_8_DATA = 104, + GP_5_9_DATA = 105, + GP_5_10_DATA = 106, + GP_5_11_DATA = 107, + GP_5_12_DATA = 108, + GP_5_13_DATA = 109, + GP_5_14_DATA = 110, + GP_5_15_DATA = 111, + GP_5_16_DATA = 112, + GP_5_17_DATA = 113, + GP_5_18_DATA = 114, + GP_5_19_DATA = 115, + GP_5_20_DATA = 116, + GP_5_21_DATA = 117, + GP_5_22_DATA = 118, + GP_5_23_DATA = 119, + GP_5_24_DATA = 120, + GP_5_25_DATA = 121, + GP_6_0_DATA = 122, + GP_6_1_DATA = 123, + GP_6_2_DATA = 124, + GP_6_3_DATA = 125, + GP_6_4_DATA = 126, + GP_6_5_DATA = 127, + GP_6_6_DATA = 128, + GP_6_7_DATA = 129, + GP_6_8_DATA = 130, + GP_6_9_DATA = 131, + GP_6_10_DATA = 132, + GP_6_11_DATA = 133, + GP_6_12_DATA = 134, + GP_6_13_DATA = 135, + GP_6_14_DATA = 136, + GP_6_15_DATA = 137, + GP_6_16_DATA = 138, + GP_6_17_DATA = 139, + GP_6_18_DATA = 140, + GP_6_19_DATA = 141, + GP_6_20_DATA = 142, + GP_6_21_DATA = 143, + GP_6_22_DATA = 144, + GP_6_23_DATA = 145, + GP_6_24_DATA = 146, + GP_6_25_DATA = 147, + GP_6_26_DATA = 148, + GP_6_27_DATA = 149, + GP_6_28_DATA = 150, + GP_6_29_DATA = 151, + GP_6_30_DATA = 152, + GP_6_31_DATA = 153, + GP_7_0_DATA = 154, + GP_7_1_DATA = 155, + GP_7_2_DATA = 156, + GP_7_3_DATA = 157, + PINMUX_DATA_END = 158, + PINMUX_FUNCTION_BEGIN = 159, + GP_0_0_FN = 160, + GP_0_1_FN = 161, + GP_0_2_FN = 162, + GP_0_3_FN = 163, + GP_0_4_FN = 164, + GP_0_5_FN = 165, + GP_0_6_FN = 166, + GP_0_7_FN = 167, + GP_0_8_FN = 168, + GP_0_9_FN = 169, + GP_0_10_FN = 170, + GP_0_11_FN = 171, + GP_0_12_FN = 172, + GP_0_13_FN = 173, + GP_0_14_FN = 174, + GP_0_15_FN = 175, + GP_1_0_FN = 176, + GP_1_1_FN = 177, + GP_1_2_FN = 178, + GP_1_3_FN = 179, + GP_1_4_FN = 180, + GP_1_5_FN = 181, + GP_1_6_FN = 182, + GP_1_7_FN = 183, + GP_1_8_FN = 184, + GP_1_9_FN = 185, + GP_1_10_FN = 186, + GP_1_11_FN = 187, + GP_1_12_FN = 188, + GP_1_13_FN = 189, + GP_1_14_FN = 190, + GP_1_15_FN = 191, + GP_1_16_FN = 192, + GP_1_17_FN = 193, + GP_1_18_FN = 194, + GP_1_19_FN = 195, + GP_1_20_FN = 196, + GP_1_21_FN = 197, + GP_1_22_FN = 198, + GP_1_23_FN = 199, + GP_1_24_FN = 200, + GP_1_25_FN = 201, + GP_1_26_FN = 202, + GP_1_27_FN = 203, + GP_1_28_FN = 204, + GP_2_0_FN = 205, + GP_2_1_FN = 206, + GP_2_2_FN = 207, + GP_2_3_FN = 208, + GP_2_4_FN = 209, + GP_2_5_FN = 210, + GP_2_6_FN = 211, + GP_2_7_FN = 212, + GP_2_8_FN = 213, + GP_2_9_FN = 214, + GP_2_10_FN = 215, + GP_2_11_FN = 216, + GP_2_12_FN = 217, + GP_2_13_FN = 218, + GP_2_14_FN = 219, + GP_3_0_FN = 220, + GP_3_1_FN = 221, + GP_3_2_FN = 222, + GP_3_3_FN = 223, + GP_3_4_FN = 224, + GP_3_5_FN = 225, + GP_3_6_FN = 226, + GP_3_7_FN = 227, + GP_3_8_FN = 228, + GP_3_9_FN = 229, + GP_3_10_FN = 230, + GP_3_11_FN = 231, + GP_3_12_FN = 232, + GP_3_13_FN = 233, + GP_3_14_FN = 234, + GP_3_15_FN = 235, + GP_4_0_FN = 236, + GP_4_1_FN = 237, + GP_4_2_FN = 238, + GP_4_3_FN = 239, + GP_4_4_FN = 240, + GP_4_5_FN = 241, + GP_4_6_FN = 242, + GP_4_7_FN = 243, + GP_4_8_FN = 244, + GP_4_9_FN = 245, + GP_4_10_FN = 246, + GP_4_11_FN = 247, + GP_4_12_FN = 248, + GP_4_13_FN = 249, + GP_4_14_FN = 250, + GP_4_15_FN = 251, + GP_4_16_FN = 252, + GP_4_17_FN = 253, + GP_5_0_FN = 254, + GP_5_1_FN = 255, + GP_5_2_FN = 256, + GP_5_3_FN = 257, + GP_5_4_FN = 258, + GP_5_5_FN = 259, + GP_5_6_FN = 260, + GP_5_7_FN = 261, + GP_5_8_FN = 262, + GP_5_9_FN = 263, + GP_5_10_FN = 264, + GP_5_11_FN = 265, + GP_5_12_FN = 266, + GP_5_13_FN = 267, + GP_5_14_FN = 268, + GP_5_15_FN = 269, + GP_5_16_FN = 270, + GP_5_17_FN = 271, + GP_5_18_FN = 272, + GP_5_19_FN = 273, + GP_5_20_FN = 274, + GP_5_21_FN = 275, + GP_5_22_FN = 276, + GP_5_23_FN = 277, + GP_5_24_FN = 278, + GP_5_25_FN = 279, + GP_6_0_FN = 280, + GP_6_1_FN = 281, + GP_6_2_FN = 282, + GP_6_3_FN = 283, + GP_6_4_FN = 284, + GP_6_5_FN = 285, + GP_6_6_FN = 286, + GP_6_7_FN = 287, + GP_6_8_FN = 288, + GP_6_9_FN = 289, + GP_6_10_FN = 290, + GP_6_11_FN = 291, + GP_6_12_FN = 292, + GP_6_13_FN = 293, + GP_6_14_FN = 294, + GP_6_15_FN = 295, + GP_6_16_FN = 296, + GP_6_17_FN = 297, + GP_6_18_FN = 298, + GP_6_19_FN = 299, + GP_6_20_FN = 300, + GP_6_21_FN = 301, + GP_6_22_FN = 302, + GP_6_23_FN = 303, + GP_6_24_FN = 304, + GP_6_25_FN = 305, + GP_6_26_FN = 306, + GP_6_27_FN = 307, + GP_6_28_FN = 308, + GP_6_29_FN = 309, + GP_6_30_FN = 310, + GP_6_31_FN = 311, + GP_7_0_FN = 312, + GP_7_1_FN = 313, + GP_7_2_FN = 314, + GP_7_3_FN = 315, + FN_CLKOUT = 316, + FN_MSIOF0_RXD = 317, + FN_MSIOF0_TXD = 318, + FN_MSIOF0_SCK = 319, + FN_SSI_SDATA5 = 320, + FN_SSI_WS5 = 321, + FN_SSI_SCK5 = 322, + FN_GP7_03 = 323, + FN_GP7_02 = 324, + FN_AVS2 = 325, + FN_AVS1 = 326, + FN_IP0_3_0 = 327, + FN_AVB_MDC = 328, + FN_MSIOF2_SS2_C = 329, + FN_IP1_3_0 = 330, + FN_IRQ2 = 331, + FN_QCPV_QDE = 332, + FN_DU_EXODDF_DU_ODDF_DISP_CDE = 333, + FN_VI4_DATA2_B = 334, + FN_MSIOF3_SYNC_E = 335, + FN_PWM3_B = 336, + FN_IP2_3_0 = 337, + FN_A1 = 338, + FN_LCDOUT17 = 339, + FN_MSIOF3_TXD_B = 340, + FN_VI4_DATA9 = 341, + FN_DU_DB1 = 342, + FN_PWM4_A = 343, + FN_IP3_3_0 = 344, + FN_A9 = 345, + FN_MSIOF2_SCK_A = 346, + FN_CTS4_N_B = 347, + FN_VI5_VSYNC_N = 348, + FN_IP0_7_4 = 349, + FN_AVB_MAGIC = 350, + FN_MSIOF2_SS1_C = 351, + FN_SCK4_A = 352, + FN_IP1_7_4 = 353, + FN_IRQ3 = 354, + FN_QSTVB_QVE = 355, + FN_DU_DOTCLKOUT1 = 356, + FN_VI4_DATA3_B = 357, + FN_MSIOF3_SCK_E = 358, + FN_PWM4_B = 359, + FN_IP2_7_4 = 360, + FN_A2 = 361, + FN_LCDOUT18 = 362, + FN_MSIOF3_SCK_B = 363, + FN_VI4_DATA10 = 364, + FN_DU_DB2 = 365, + FN_PWM5_A = 366, + FN_IP3_7_4 = 367, + FN_A10 = 368, + FN_MSIOF2_RXD_A = 369, + FN_RTS4_N_B = 370, + FN_VI5_HSYNC_N = 371, + FN_IP0_11_8 = 372, + FN_AVB_PHY_INT = 373, + FN_MSIOF2_SYNC_C = 374, + FN_RX4_A = 375, + FN_IP1_11_8 = 376, + FN_IRQ4 = 377, + FN_QSTH_QHS = 378, + FN_DU_EXHSYNC_DU_HSYNC = 379, + FN_VI4_DATA4_B = 380, + FN_MSIOF3_RXD_E = 381, + FN_PWM5_B = 382, + FN_IP2_11_8 = 383, + FN_A3 = 384, + FN_LCDOUT19 = 385, + FN_MSIOF3_RXD_B = 386, + FN_VI4_DATA11 = 387, + FN_DU_DB3 = 388, + FN_PWM6_A = 389, + FN_IP3_11_8 = 390, + FN_A11 = 391, + FN_TX3_B = 392, + FN_MSIOF2_TXD_A = 393, + FN_HTX4_B = 394, + FN_HSCK4 = 395, + FN_VI5_FIELD = 396, + FN_SCL6_A = 397, + FN_AVB_AVTP_CAPTURE_B = 398, + FN_PWM2_B = 399, + FN_IP0_15_12 = 400, + FN_AVB_LINK = 401, + FN_MSIOF2_SCK_C = 402, + FN_TX4_A = 403, + FN_IP1_15_12 = 404, + FN_IRQ5 = 405, + FN_QSTB_QHE = 406, + FN_DU_EXVSYNC_DU_VSYNC = 407, + FN_VI4_DATA5_B = 408, + FN_MSIOF3_TXD_E = 409, + FN_PWM6_B = 410, + FN_IP2_15_12 = 411, + FN_A4 = 412, + FN_LCDOUT20 = 413, + FN_MSIOF3_SS1_B = 414, + FN_VI4_DATA12 = 415, + FN_VI5_DATA12 = 416, + FN_DU_DB4 = 417, + FN_IP3_15_12 = 418, + FN_A12 = 419, + FN_LCDOUT12 = 420, + FN_MSIOF3_SCK_C = 421, + FN_HRX4_A = 422, + FN_VI5_DATA8 = 423, + FN_DU_DG4 = 424, + FN_IP0_19_16 = 425, + FN_AVB_AVTP_MATCH_A = 426, + FN_MSIOF2_RXD_C = 427, + FN_CTS4_N_A = 428, + FN_IP1_19_16 = 429, + FN_PWM0 = 430, + FN_AVB_AVTP_PPS = 431, + FN_VI4_DATA6_B = 432, + FN_IECLK_B = 433, + FN_IP2_19_16 = 434, + FN_A5 = 435, + FN_LCDOUT21 = 436, + FN_MSIOF3_SS2_B = 437, + FN_SCK4_B = 438, + FN_VI4_DATA13 = 439, + FN_VI5_DATA13 = 440, + FN_DU_DB5 = 441, + FN_IP3_19_16 = 442, + FN_A13 = 443, + FN_LCDOUT13 = 444, + FN_MSIOF3_SYNC_C = 445, + FN_HTX4_A = 446, + FN_VI5_DATA9 = 447, + FN_DU_DG5 = 448, + FN_IP0_23_20 = 449, + FN_AVB_AVTP_CAPTURE_A = 450, + FN_MSIOF2_TXD_C = 451, + FN_RTS4_N_A = 452, + FN_IP1_23_20 = 453, + FN_PWM1_A = 454, + FN_HRX3_D = 455, + FN_VI4_DATA7_B = 456, + FN_IERX_B = 457, + FN_IP2_23_20 = 458, + FN_A6 = 459, + FN_LCDOUT22 = 460, + FN_MSIOF2_SS1_A = 461, + FN_RX4_B = 462, + FN_VI4_DATA14 = 463, + FN_VI5_DATA14 = 464, + FN_DU_DB6 = 465, + FN_IP3_23_20 = 466, + FN_A14 = 467, + FN_LCDOUT14 = 468, + FN_MSIOF3_RXD_C = 469, + FN_HCTS4_N = 470, + FN_VI5_DATA10 = 471, + FN_DU_DG6 = 472, + FN_IP0_27_24 = 473, + FN_IRQ0 = 474, + FN_QPOLB = 475, + FN_DU_CDE = 476, + FN_VI4_DATA0_B = 477, + FN_CAN0_TX_B = 478, + FN_CANFD0_TX_B = 479, + FN_MSIOF3_SS2_E = 480, + FN_IP1_27_24 = 481, + FN_PWM2_A = 482, + FN_HTX3_D = 483, + FN_IETX_B = 484, + FN_IP2_27_24 = 485, + FN_A7 = 486, + FN_LCDOUT23 = 487, + FN_MSIOF2_SS2_A = 488, + FN_TX4_B = 489, + FN_VI4_DATA15 = 490, + FN_VI5_DATA15 = 491, + FN_DU_DB7 = 492, + FN_IP3_27_24 = 493, + FN_A15 = 494, + FN_LCDOUT15 = 495, + FN_MSIOF3_TXD_C = 496, + FN_HRTS4_N = 497, + FN_VI5_DATA11 = 498, + FN_DU_DG7 = 499, + FN_IP0_31_28 = 500, + FN_IRQ1 = 501, + FN_QPOLA = 502, + FN_DU_DISP = 503, + FN_VI4_DATA1_B = 504, + FN_CAN0_RX_B = 505, + FN_CANFD0_RX_B = 506, + FN_MSIOF3_SS1_E = 507, + FN_IP1_31_28 = 508, + FN_A0 = 509, + FN_LCDOUT16 = 510, + FN_MSIOF3_SYNC_B = 511, + FN_VI4_DATA8 = 512, + FN_DU_DB0 = 513, + FN_PWM3_A = 514, + FN_IP2_31_28 = 515, + FN_A8 = 516, + FN_RX3_B = 517, + FN_MSIOF2_SYNC_A = 518, + FN_HRX4_B = 519, + FN_SDA6_A = 520, + FN_AVB_AVTP_MATCH_B = 521, + FN_PWM1_B = 522, + FN_IP3_31_28 = 523, + FN_A16 = 524, + FN_LCDOUT8 = 525, + FN_VI4_FIELD = 526, + FN_DU_DG0 = 527, + FN_IP4_3_0 = 528, + FN_A17 = 529, + FN_LCDOUT9 = 530, + FN_VI4_VSYNC_N = 531, + FN_DU_DG1 = 532, + FN_IP5_3_0 = 533, + FN_WE0_N = 534, + FN_MSIOF3_TXD_D = 535, + FN_CTS3_N = 536, + FN_HCTS3_N = 537, + FN_SCL6_B = 538, + FN_CAN_CLK = 539, + FN_IECLK_A = 540, + FN_IP6_3_0 = 541, + FN_D5 = 542, + FN_MSIOF2_SYNC_B = 543, + FN_VI4_DATA21 = 544, + FN_VI5_DATA5 = 545, + FN_IP7_3_0 = 546, + FN_D13 = 547, + FN_LCDOUT5 = 548, + FN_MSIOF2_SS2_D = 549, + FN_TX4_C = 550, + FN_VI4_DATA5_A = 551, + FN_DU_DR5 = 552, + FN_IP4_7_4 = 553, + FN_A18 = 554, + FN_LCDOUT10 = 555, + FN_VI4_HSYNC_N = 556, + FN_DU_DG2 = 557, + FN_IP5_7_4 = 558, + FN_WE1_N = 559, + FN_MSIOF3_SS1_D = 560, + FN_RTS3_N = 561, + FN_HRTS3_N = 562, + FN_SDA6_B = 563, + FN_CAN1_RX = 564, + FN_CANFD1_RX = 565, + FN_IERX_A = 566, + FN_IP6_7_4 = 567, + FN_D6 = 568, + FN_MSIOF2_RXD_B = 569, + FN_VI4_DATA22 = 570, + FN_VI5_DATA6 = 571, + FN_IP7_7_4 = 572, + FN_D14 = 573, + FN_LCDOUT6 = 574, + FN_MSIOF3_SS1_A = 575, + FN_HRX3_C = 576, + FN_VI4_DATA6_A = 577, + FN_DU_DR6 = 578, + FN_SCL6_C = 579, + FN_IP4_11_8 = 580, + FN_A19 = 581, + FN_LCDOUT11 = 582, + FN_VI4_CLKENB = 583, + FN_DU_DG3 = 584, + FN_IP5_11_8 = 585, + FN_EX_WAIT0_A = 586, + FN_QCLK = 587, + FN_VI4_CLK = 588, + FN_DU_DOTCLKOUT0 = 589, + FN_IP6_11_8 = 590, + FN_D7 = 591, + FN_MSIOF2_TXD_B = 592, + FN_VI4_DATA23 = 593, + FN_VI5_DATA7 = 594, + FN_IP7_11_8 = 595, + FN_D15 = 596, + FN_LCDOUT7 = 597, + FN_MSIOF3_SS2_A = 598, + FN_HTX3_C = 599, + FN_VI4_DATA7_A = 600, + FN_DU_DR7 = 601, + FN_SDA6_C = 602, + FN_IP4_15_12 = 603, + FN_CS0_N = 604, + FN_VI5_CLKENB = 605, + FN_IP5_15_12 = 606, + FN_D0 = 607, + FN_MSIOF2_SS1_B = 608, + FN_MSIOF3_SCK_A = 609, + FN_VI4_DATA16 = 610, + FN_VI5_DATA0 = 611, + FN_IP6_15_12 = 612, + FN_D8 = 613, + FN_LCDOUT0 = 614, + FN_MSIOF2_SCK_D = 615, + FN_SCK4_C = 616, + FN_VI4_DATA0_A = 617, + FN_DU_DR0 = 618, + FN_IP4_19_16 = 619, + FN_CS1_N = 620, + FN_VI5_CLK = 621, + FN_EX_WAIT0_B = 622, + FN_IP5_19_16 = 623, + FN_D1 = 624, + FN_MSIOF2_SS2_B = 625, + FN_MSIOF3_SYNC_A = 626, + FN_VI4_DATA17 = 627, + FN_VI5_DATA1 = 628, + FN_IP6_19_16 = 629, + FN_D9 = 630, + FN_LCDOUT1 = 631, + FN_MSIOF2_SYNC_D = 632, + FN_VI4_DATA1_A = 633, + FN_DU_DR1 = 634, + FN_IP7_19_16 = 635, + FN_SD0_CLK = 636, + FN_MSIOF1_SCK_E = 637, + FN_STP_OPWM_0_B = 638, + FN_IP4_23_20 = 639, + FN_BS_N = 640, + FN_QSTVA_QVS = 641, + FN_MSIOF3_SCK_D = 642, + FN_SCK3 = 643, + FN_HSCK3 = 644, + FN_CAN1_TX = 645, + FN_CANFD1_TX = 646, + FN_IETX_A = 647, + FN_IP5_23_20 = 648, + FN_D2 = 649, + FN_MSIOF3_RXD_A = 650, + FN_VI4_DATA18 = 651, + FN_VI5_DATA2 = 652, + FN_IP6_23_20 = 653, + FN_D10 = 654, + FN_LCDOUT2 = 655, + FN_MSIOF2_RXD_D = 656, + FN_HRX3_B = 657, + FN_VI4_DATA2_A = 658, + FN_CTS4_N_C = 659, + FN_DU_DR2 = 660, + FN_IP7_23_20 = 661, + FN_SD0_CMD = 662, + FN_MSIOF1_SYNC_E = 663, + FN_STP_IVCXO27_0_B = 664, + FN_IP4_27_24 = 665, + FN_RD_N = 666, + FN_MSIOF3_SYNC_D = 667, + FN_RX3_A = 668, + FN_HRX3_A = 669, + FN_CAN0_TX_A = 670, + FN_CANFD0_TX_A = 671, + FN_IP5_27_24 = 672, + FN_D3 = 673, + FN_MSIOF3_TXD_A = 674, + FN_VI4_DATA19 = 675, + FN_VI5_DATA3 = 676, + FN_IP6_27_24 = 677, + FN_D11 = 678, + FN_LCDOUT3 = 679, + FN_MSIOF2_TXD_D = 680, + FN_HTX3_B = 681, + FN_VI4_DATA3_A = 682, + FN_RTS4_N_C = 683, + FN_DU_DR3 = 684, + FN_IP7_27_24 = 685, + FN_SD0_DAT0 = 686, + FN_MSIOF1_RXD_E = 687, + FN_TS_SCK0_B = 688, + FN_STP_ISCLK_0_B = 689, + FN_IP4_31_28 = 690, + FN_RD_WR_N = 691, + FN_MSIOF3_RXD_D = 692, + FN_TX3_A = 693, + FN_HTX3_A = 694, + FN_CAN0_RX_A = 695, + FN_CANFD0_RX_A = 696, + FN_IP5_31_28 = 697, + FN_D4 = 698, + FN_MSIOF2_SCK_B = 699, + FN_VI4_DATA20 = 700, + FN_VI5_DATA4 = 701, + FN_IP6_31_28 = 702, + FN_D12 = 703, + FN_LCDOUT4 = 704, + FN_MSIOF2_SS1_D = 705, + FN_RX4_C = 706, + FN_VI4_DATA4_A = 707, + FN_DU_DR4 = 708, + FN_IP7_31_28 = 709, + FN_SD0_DAT1 = 710, + FN_MSIOF1_TXD_E = 711, + FN_TS_SPSYNC0_B = 712, + FN_STP_ISSYNC_0_B = 713, + FN_IP8_3_0 = 714, + FN_SD0_DAT2 = 715, + FN_MSIOF1_SS1_E = 716, + FN_TS_SDAT0_B = 717, + FN_STP_ISD_0_B = 718, + FN_IP9_3_0 = 719, + FN_SD2_CLK = 720, + FN_NFDATA8 = 721, + FN_IP10_3_0 = 722, + FN_SD3_CMD = 723, + FN_NFRE_N = 724, + FN_IP11_3_0 = 725, + FN_SD3_DAT7 = 726, + FN_SD3_WP = 727, + FN_NFDATA7 = 728, + FN_IP8_7_4 = 729, + FN_SD0_DAT3 = 730, + FN_MSIOF1_SS2_E = 731, + FN_TS_SDEN0_B = 732, + FN_STP_ISEN_0_B = 733, + FN_IP9_7_4 = 734, + FN_SD2_CMD = 735, + FN_NFDATA9 = 736, + FN_IP10_7_4 = 737, + FN_SD3_DAT0 = 738, + FN_NFDATA0 = 739, + FN_IP11_7_4 = 740, + FN_SD3_DS = 741, + FN_NFCLE = 742, + FN_IP8_11_8 = 743, + FN_SD1_CLK = 744, + FN_MSIOF1_SCK_G = 745, + FN_SIM0_CLK_A = 746, + FN_IP9_11_8 = 747, + FN_SD2_DAT0 = 748, + FN_NFDATA10 = 749, + FN_IP10_11_8 = 750, + FN_SD3_DAT1 = 751, + FN_NFDATA1 = 752, + FN_IP11_11_8 = 753, + FN_SD0_CD = 754, + FN_NFDATA14_A = 755, + FN_SCL2_B = 756, + FN_SIM0_RST_A = 757, + FN_IP8_15_12 = 758, + FN_SD1_CMD = 759, + FN_MSIOF1_SYNC_G = 760, + FN_NFCE_N_B = 761, + FN_SIM0_D_A = 762, + FN_STP_IVCXO27_1_B = 763, + FN_IP9_15_12 = 764, + FN_SD2_DAT1 = 765, + FN_NFDATA11 = 766, + FN_IP10_15_12 = 767, + FN_SD3_DAT2 = 768, + FN_NFDATA2 = 769, + FN_IP11_15_12 = 770, + FN_SD0_WP = 771, + FN_NFDATA15_A = 772, + FN_SDA2_B = 773, + FN_IP8_19_16 = 774, + FN_SD1_DAT0 = 775, + FN_SD2_DAT4 = 776, + FN_MSIOF1_RXD_G = 777, + FN_NFWP_N_B = 778, + FN_TS_SCK1_B = 779, + FN_STP_ISCLK_1_B = 780, + FN_IP9_19_16 = 781, + FN_SD2_DAT2 = 782, + FN_NFDATA12 = 783, + FN_IP10_19_16 = 784, + FN_SD3_DAT3 = 785, + FN_NFDATA3 = 786, + FN_IP11_19_16 = 787, + FN_SD1_CD = 788, + FN_NFRB_N_A = 789, + FN_SIM0_CLK_B = 790, + FN_IP8_23_20 = 791, + FN_SD1_DAT1 = 792, + FN_SD2_DAT5 = 793, + FN_MSIOF1_TXD_G = 794, + FN_NFDATA14_B = 795, + FN_TS_SPSYNC1_B = 796, + FN_STP_ISSYNC_1_B = 797, + FN_IP9_23_20 = 798, + FN_SD2_DAT3 = 799, + FN_NFDATA13 = 800, + FN_IP10_23_20 = 801, + FN_SD3_DAT4 = 802, + FN_SD2_CD_A = 803, + FN_NFDATA4 = 804, + FN_IP11_23_20 = 805, + FN_SD1_WP = 806, + FN_NFCE_N_A = 807, + FN_SIM0_D_B = 808, + FN_IP8_27_24 = 809, + FN_SD1_DAT2 = 810, + FN_SD2_DAT6 = 811, + FN_MSIOF1_SS1_G = 812, + FN_NFDATA15_B = 813, + FN_TS_SDAT1_B = 814, + FN_STP_ISD_1_B = 815, + FN_IP9_27_24 = 816, + FN_SD2_DS = 817, + FN_NFALE = 818, + FN_IP10_27_24 = 819, + FN_SD3_DAT5 = 820, + FN_SD2_WP_A = 821, + FN_NFDATA5 = 822, + FN_IP11_27_24 = 823, + FN_SCK0 = 824, + FN_HSCK1_B = 825, + FN_MSIOF1_SS2_B = 826, + FN_AUDIO_CLKC_B = 827, + FN_SDA2_A = 828, + FN_SIM0_RST_B = 829, + FN_STP_OPWM_0_C = 830, + FN_RIF0_CLK_B = 831, + FN_ADICHS2 = 832, + FN_SCK5_B = 833, + FN_IP8_31_28 = 834, + FN_SD1_DAT3 = 835, + FN_SD2_DAT7 = 836, + FN_MSIOF1_SS2_G = 837, + FN_NFRB_N_B = 838, + FN_TS_SDEN1_B = 839, + FN_STP_ISEN_1_B = 840, + FN_IP9_31_28 = 841, + FN_SD3_CLK = 842, + FN_NFWE_N = 843, + FN_IP10_31_28 = 844, + FN_SD3_DAT6 = 845, + FN_SD3_CD = 846, + FN_NFDATA6 = 847, + FN_IP11_31_28 = 848, + FN_RX0 = 849, + FN_HRX1_B = 850, + FN_TS_SCK0_C = 851, + FN_STP_ISCLK_0_C = 852, + FN_RIF0_D0_B = 853, + FN_IP12_3_0 = 854, + FN_TX0 = 855, + FN_HTX1_B = 856, + FN_TS_SPSYNC0_C = 857, + FN_STP_ISSYNC_0_C = 858, + FN_RIF0_D1_B = 859, + FN_IP13_3_0 = 860, + FN_TX2_A = 861, + FN_SD2_CD_B = 862, + FN_SCL1_A = 863, + FN_FMCLK_A = 864, + FN_RIF1_D1_C = 865, + FN_FSO_CFE_0_N = 866, + FN_IP14_3_0 = 867, + FN_MSIOF0_SS1 = 868, + FN_RX5_A = 869, + FN_NFWP_N_A = 870, + FN_AUDIO_CLKA_C = 871, + FN_SSI_SCK2_A = 872, + FN_STP_IVCXO27_0_C = 873, + FN_AUDIO_CLKOUT3_A = 874, + FN_TCLK1_B = 875, + FN_IP15_3_0 = 876, + FN_SSI_SDATA1_A = 877, + FN_IP12_7_4 = 878, + FN_CTS0_N = 879, + FN_HCTS1_N_B = 880, + FN_MSIOF1_SYNC_B = 881, + FN_TS_SPSYNC1_C = 882, + FN_STP_ISSYNC_1_C = 883, + FN_RIF1_SYNC_B = 884, + FN_AUDIO_CLKOUT_C = 885, + FN_ADICS_SAMP = 886, + FN_IP13_7_4 = 887, + FN_RX2_A = 888, + FN_SD2_WP_B = 889, + FN_SDA1_A = 890, + FN_FMIN_A = 891, + FN_RIF1_SYNC_C = 892, + FN_FSO_CFE_1_N = 893, + FN_IP14_7_4 = 894, + FN_MSIOF0_SS2 = 895, + FN_TX5_A = 896, + FN_MSIOF1_SS2_D = 897, + FN_AUDIO_CLKC_A = 898, + FN_SSI_WS2_A = 899, + FN_STP_OPWM_0_D = 900, + FN_AUDIO_CLKOUT_D = 901, + FN_SPEEDIN_B = 902, + FN_IP15_7_4 = 903, + FN_SSI_SDATA2_A = 904, + FN_SSI_SCK1_B = 905, + FN_IP12_11_8 = 906, + FN_RTS0_N = 907, + FN_HRTS1_N_B = 908, + FN_MSIOF1_SS1_B = 909, + FN_AUDIO_CLKA_B = 910, + FN_SCL2_A = 911, + FN_STP_IVCXO27_1_C = 912, + FN_RIF0_SYNC_B = 913, + FN_ADICHS1 = 914, + FN_IP13_11_8 = 915, + FN_HSCK0 = 916, + FN_MSIOF1_SCK_D = 917, + FN_AUDIO_CLKB_A = 918, + FN_SSI_SDATA1_B = 919, + FN_TS_SCK0_D = 920, + FN_STP_ISCLK_0_D = 921, + FN_RIF0_CLK_C = 922, + FN_RX5_B = 923, + FN_IP14_11_8 = 924, + FN_MLB_CLK = 925, + FN_MSIOF1_SCK_F = 926, + FN_SCL1_B = 927, + FN_IP15_11_8 = 928, + FN_SSI_SCK349 = 929, + FN_MSIOF1_SS1_A = 930, + FN_STP_OPWM_0_A = 931, + FN_IP12_15_12 = 932, + FN_RX1_A = 933, + FN_HRX1_A = 934, + FN_TS_SDAT0_C = 935, + FN_STP_ISD_0_C = 936, + FN_RIF1_CLK_C = 937, + FN_IP13_15_12 = 938, + FN_HRX0 = 939, + FN_MSIOF1_RXD_D = 940, + FN_SSI_SDATA2_B = 941, + FN_TS_SDEN0_D = 942, + FN_STP_ISEN_0_D = 943, + FN_RIF0_D0_C = 944, + FN_IP14_15_12 = 945, + FN_MLB_SIG = 946, + FN_RX1_B = 947, + FN_MSIOF1_SYNC_F = 948, + FN_SDA1_B = 949, + FN_IP15_15_12 = 950, + FN_SSI_WS349 = 951, + FN_HCTS2_N_A = 952, + FN_MSIOF1_SS2_A = 953, + FN_STP_IVCXO27_0_A = 954, + FN_IP12_19_16 = 955, + FN_TX1_A = 956, + FN_HTX1_A = 957, + FN_TS_SDEN0_C = 958, + FN_STP_ISEN_0_C = 959, + FN_RIF1_D0_C = 960, + FN_IP13_19_16 = 961, + FN_HTX0 = 962, + FN_MSIOF1_TXD_D = 963, + FN_SSI_SDATA9_B = 964, + FN_TS_SDAT0_D = 965, + FN_STP_ISD_0_D = 966, + FN_RIF0_D1_C = 967, + FN_IP14_19_16 = 968, + FN_MLB_DAT = 969, + FN_TX1_B = 970, + FN_MSIOF1_RXD_F = 971, + FN_IP15_19_16 = 972, + FN_SSI_SDATA3 = 973, + FN_HRTS2_N_A = 974, + FN_MSIOF1_TXD_A = 975, + FN_TS_SCK0_A = 976, + FN_STP_ISCLK_0_A = 977, + FN_RIF0_D1_A = 978, + FN_RIF2_D0_A = 979, + FN_IP12_23_20 = 980, + FN_CTS1_N = 981, + FN_HCTS1_N_A = 982, + FN_MSIOF1_RXD_B = 983, + FN_TS_SDEN1_C = 984, + FN_STP_ISEN_1_C = 985, + FN_RIF1_D0_B = 986, + FN_ADIDATA = 987, + FN_IP13_23_20 = 988, + FN_HCTS0_N = 989, + FN_RX2_B = 990, + FN_MSIOF1_SYNC_D = 991, + FN_SSI_SCK9_A = 992, + FN_TS_SPSYNC0_D = 993, + FN_STP_ISSYNC_0_D = 994, + FN_RIF0_SYNC_C = 995, + FN_AUDIO_CLKOUT1_A = 996, + FN_IP14_23_20 = 997, + FN_SSI_SCK01239 = 998, + FN_MSIOF1_TXD_F = 999, + FN_IP15_23_20 = 1000, + FN_SSI_SCK4 = 1001, + FN_HRX2_A = 1002, + FN_MSIOF1_SCK_A = 1003, + FN_TS_SDAT0_A = 1004, + FN_STP_ISD_0_A = 1005, + FN_RIF0_CLK_A = 1006, + FN_RIF2_CLK_A = 1007, + FN_IP12_27_24 = 1008, + FN_RTS1_N = 1009, + FN_HRTS1_N_A = 1010, + FN_MSIOF1_TXD_B = 1011, + FN_TS_SDAT1_C = 1012, + FN_STP_ISD_1_C = 1013, + FN_RIF1_D1_B = 1014, + FN_ADICHS0 = 1015, + FN_IP13_27_24 = 1016, + FN_HRTS0_N = 1017, + FN_TX2_B = 1018, + FN_MSIOF1_SS1_D = 1019, + FN_SSI_WS9_A = 1020, + FN_STP_IVCXO27_0_D = 1021, + FN_BPFCLK_A = 1022, + FN_AUDIO_CLKOUT2_A = 1023, + FN_IP14_27_24 = 1024, + FN_SSI_WS01239 = 1025, + FN_MSIOF1_SS1_F = 1026, + FN_IP15_27_24 = 1027, + FN_SSI_WS4 = 1028, + FN_HTX2_A = 1029, + FN_MSIOF1_SYNC_A = 1030, + FN_TS_SDEN0_A = 1031, + FN_STP_ISEN_0_A = 1032, + FN_RIF0_SYNC_A = 1033, + FN_RIF2_SYNC_A = 1034, + FN_IP12_31_28 = 1035, + FN_SCK2 = 1036, + FN_SCIF_CLK_B = 1037, + FN_MSIOF1_SCK_B = 1038, + FN_TS_SCK1_C = 1039, + FN_STP_ISCLK_1_C = 1040, + FN_RIF1_CLK_B = 1041, + FN_ADICLK = 1042, + FN_IP13_31_28 = 1043, + FN_MSIOF0_SYNC = 1044, + FN_AUDIO_CLKOUT_A = 1045, + FN_TX5_B = 1046, + FN_BPFCLK_D = 1047, + FN_IP14_31_28 = 1048, + FN_SSI_SDATA0 = 1049, + FN_MSIOF1_SS2_F = 1050, + FN_IP15_31_28 = 1051, + FN_SSI_SDATA4 = 1052, + FN_HSCK2_A = 1053, + FN_MSIOF1_RXD_A = 1054, + FN_TS_SPSYNC0_A = 1055, + FN_STP_ISSYNC_0_A = 1056, + FN_RIF0_D0_A = 1057, + FN_RIF2_D1_A = 1058, + FN_IP16_3_0 = 1059, + FN_SSI_SCK6 = 1060, + FN_SIM0_RST_D = 1061, + FN_IP17_3_0 = 1062, + FN_AUDIO_CLKA_A = 1063, + FN_IP18_3_0 = 1064, + FN_GP6_30 = 1065, + FN_AUDIO_CLKOUT2_B = 1066, + FN_SSI_SCK9_B = 1067, + FN_TS_SDEN0_E = 1068, + FN_STP_ISEN_0_E = 1069, + FN_RIF2_D0_B = 1070, + FN_TPU0TO2 = 1071, + FN_FMCLK_C = 1072, + FN_FMCLK_D = 1073, + FN_IP16_7_4 = 1074, + FN_SSI_WS6 = 1075, + FN_SIM0_D_D = 1076, + FN_IP17_7_4 = 1077, + FN_AUDIO_CLKB_B = 1078, + FN_SCIF_CLK_A = 1079, + FN_STP_IVCXO27_1_D = 1080, + FN_REMOCON_A = 1081, + FN_TCLK1_A = 1082, + FN_IP18_7_4 = 1083, + FN_GP6_31 = 1084, + FN_AUDIO_CLKOUT3_B = 1085, + FN_SSI_WS9_B = 1086, + FN_TS_SPSYNC0_E = 1087, + FN_STP_ISSYNC_0_E = 1088, + FN_RIF2_D1_B = 1089, + FN_TPU0TO3 = 1090, + FN_FMIN_C = 1091, + FN_FMIN_D = 1092, + FN_IP16_11_8 = 1093, + FN_SSI_SDATA6 = 1094, + FN_SIM0_CLK_D = 1095, + FN_IP17_11_8 = 1096, + FN_USB0_PWEN = 1097, + FN_SIM0_RST_C = 1098, + FN_TS_SCK1_D = 1099, + FN_STP_ISCLK_1_D = 1100, + FN_BPFCLK_B = 1101, + FN_RIF3_CLK_B = 1102, + FN_HSCK2_C = 1103, + FN_IP16_15_12 = 1104, + FN_SSI_SCK78 = 1105, + FN_HRX2_B = 1106, + FN_MSIOF1_SCK_C = 1107, + FN_TS_SCK1_A = 1108, + FN_STP_ISCLK_1_A = 1109, + FN_RIF1_CLK_A = 1110, + FN_RIF3_CLK_A = 1111, + FN_IP17_15_12 = 1112, + FN_USB0_OVC = 1113, + FN_SIM0_D_C = 1114, + FN_TS_SDAT1_D = 1115, + FN_STP_ISD_1_D = 1116, + FN_RIF3_SYNC_B = 1117, + FN_HRX2_C = 1118, + FN_IP16_19_16 = 1119, + FN_SSI_WS78 = 1120, + FN_HTX2_B = 1121, + FN_MSIOF1_SYNC_C = 1122, + FN_TS_SDAT1_A = 1123, + FN_STP_ISD_1_A = 1124, + FN_RIF1_SYNC_A = 1125, + FN_RIF3_SYNC_A = 1126, + FN_IP17_19_16 = 1127, + FN_USB1_PWEN = 1128, + FN_SIM0_CLK_C = 1129, + FN_SSI_SCK1_A = 1130, + FN_TS_SCK0_E = 1131, + FN_STP_ISCLK_0_E = 1132, + FN_FMCLK_B = 1133, + FN_RIF2_CLK_B = 1134, + FN_SPEEDIN_A = 1135, + FN_HTX2_C = 1136, + FN_IP16_23_20 = 1137, + FN_SSI_SDATA7 = 1138, + FN_HCTS2_N_B = 1139, + FN_MSIOF1_RXD_C = 1140, + FN_TS_SDEN1_A = 1141, + FN_STP_ISEN_1_A = 1142, + FN_RIF1_D0_A = 1143, + FN_RIF3_D0_A = 1144, + FN_TCLK2_A = 1145, + FN_IP17_23_20 = 1146, + FN_USB1_OVC = 1147, + FN_MSIOF1_SS2_C = 1148, + FN_SSI_WS1_A = 1149, + FN_TS_SDAT0_E = 1150, + FN_STP_ISD_0_E = 1151, + FN_FMIN_B = 1152, + FN_RIF2_SYNC_B = 1153, + FN_REMOCON_B = 1154, + FN_HCTS2_N_C = 1155, + FN_IP16_27_24 = 1156, + FN_SSI_SDATA8 = 1157, + FN_HRTS2_N_B = 1158, + FN_MSIOF1_TXD_C = 1159, + FN_TS_SPSYNC1_A = 1160, + FN_STP_ISSYNC_1_A = 1161, + FN_RIF1_D1_A = 1162, + FN_RIF3_D1_A = 1163, + FN_IP17_27_24 = 1164, + FN_USB30_PWEN = 1165, + FN_AUDIO_CLKOUT_B = 1166, + FN_SSI_SCK2_B = 1167, + FN_TS_SDEN1_D = 1168, + FN_STP_ISEN_1_D = 1169, + FN_STP_OPWM_0_E = 1170, + FN_RIF3_D0_B = 1171, + FN_TCLK2_B = 1172, + FN_TPU0TO0 = 1173, + FN_BPFCLK_C = 1174, + FN_HRTS2_N_C = 1175, + FN_IP16_31_28 = 1176, + FN_SSI_SDATA9_A = 1177, + FN_HSCK2_B = 1178, + FN_MSIOF1_SS1_C = 1179, + FN_HSCK1_A = 1180, + FN_SSI_WS1_B = 1181, + FN_SCK1 = 1182, + FN_STP_IVCXO27_1_A = 1183, + FN_SCK5_A = 1184, + FN_IP17_31_28 = 1185, + FN_USB30_OVC = 1186, + FN_AUDIO_CLKOUT1_B = 1187, + FN_SSI_WS2_B = 1188, + FN_TS_SPSYNC1_D = 1189, + FN_STP_ISSYNC_1_D = 1190, + FN_STP_IVCXO27_0_E = 1191, + FN_RIF3_D1_B = 1192, + FN_FSO_TOE_N = 1193, + FN_TPU0TO1 = 1194, + FN_SEL_MSIOF3_0 = 1195, + FN_SEL_MSIOF3_1 = 1196, + FN_SEL_MSIOF3_2 = 1197, + FN_SEL_MSIOF3_3 = 1198, + FN_SEL_MSIOF3_4 = 1199, + FN_SEL_TSIF1_0 = 1200, + FN_SEL_TSIF1_1 = 1201, + FN_SEL_TSIF1_2 = 1202, + FN_SEL_TSIF1_3 = 1203, + FN_I2C_SEL_5_0 = 1204, + FN_I2C_SEL_5_1 = 1205, + FN_I2C_SEL_3_0 = 1206, + FN_I2C_SEL_3_1 = 1207, + FN_SEL_TSIF0_0 = 1208, + FN_SEL_TSIF0_1 = 1209, + FN_SEL_TSIF0_2 = 1210, + FN_SEL_TSIF0_3 = 1211, + FN_SEL_TSIF0_4 = 1212, + FN_I2C_SEL_0_0 = 1213, + FN_I2C_SEL_0_1 = 1214, + FN_SEL_MSIOF2_0 = 1215, + FN_SEL_MSIOF2_1 = 1216, + FN_SEL_MSIOF2_2 = 1217, + FN_SEL_MSIOF2_3 = 1218, + FN_SEL_FM_0 = 1219, + FN_SEL_FM_1 = 1220, + FN_SEL_FM_2 = 1221, + FN_SEL_FM_3 = 1222, + FN_SEL_MSIOF1_0 = 1223, + FN_SEL_MSIOF1_1 = 1224, + FN_SEL_MSIOF1_2 = 1225, + FN_SEL_MSIOF1_3 = 1226, + FN_SEL_MSIOF1_4 = 1227, + FN_SEL_MSIOF1_5 = 1228, + FN_SEL_MSIOF1_6 = 1229, + FN_SEL_TIMER_TMU_0 = 1230, + FN_SEL_TIMER_TMU_1 = 1231, + FN_SEL_SCIF5_0 = 1232, + FN_SEL_SCIF5_1 = 1233, + FN_SEL_SSP1_1_0 = 1234, + FN_SEL_SSP1_1_1 = 1235, + FN_SEL_SSP1_1_2 = 1236, + FN_SEL_SSP1_1_3 = 1237, + FN_SEL_I2C6_0 = 1238, + FN_SEL_I2C6_1 = 1239, + FN_SEL_I2C6_2 = 1240, + FN_SEL_LBSC_0 = 1241, + FN_SEL_LBSC_1 = 1242, + FN_SEL_SSP1_0_0 = 1243, + FN_SEL_SSP1_0_1 = 1244, + FN_SEL_SSP1_0_2 = 1245, + FN_SEL_SSP1_0_3 = 1246, + FN_SEL_SSP1_0_4 = 1247, + FN_SEL_IEBUS_0 = 1248, + FN_SEL_IEBUS_1 = 1249, + FN_SEL_NDF_0 = 1250, + FN_SEL_NDF_1 = 1251, + FN_SEL_I2C2_0 = 1252, + FN_SEL_I2C2_1 = 1253, + FN_SEL_SSI2_0 = 1254, + FN_SEL_SSI2_1 = 1255, + FN_SEL_I2C1_0 = 1256, + FN_SEL_I2C1_1 = 1257, + FN_SEL_SSI1_0 = 1258, + FN_SEL_SSI1_1 = 1259, + FN_SEL_SSI9_0 = 1260, + FN_SEL_SSI9_1 = 1261, + FN_SEL_HSCIF4_0 = 1262, + FN_SEL_HSCIF4_1 = 1263, + FN_SEL_SPEED_PULSE_0 = 1264, + FN_SEL_SPEED_PULSE_1 = 1265, + FN_SEL_TIMER_TMU2_0 = 1266, + FN_SEL_TIMER_TMU2_1 = 1267, + FN_SEL_HSCIF3_0 = 1268, + FN_SEL_HSCIF3_1 = 1269, + FN_SEL_HSCIF3_2 = 1270, + FN_SEL_HSCIF3_3 = 1271, + FN_SEL_SIMCARD_0 = 1272, + FN_SEL_SIMCARD_1 = 1273, + FN_SEL_SIMCARD_2 = 1274, + FN_SEL_SIMCARD_3 = 1275, + FN_SEL_ADGB_0 = 1276, + FN_SEL_ADGB_1 = 1277, + FN_SEL_ADGC_0 = 1278, + FN_SEL_ADGC_1 = 1279, + FN_SEL_HSCIF1_0 = 1280, + FN_SEL_HSCIF1_1 = 1281, + FN_SEL_SDHI2_0 = 1282, + FN_SEL_SDHI2_1 = 1283, + FN_SEL_SCIF4_0 = 1284, + FN_SEL_SCIF4_1 = 1285, + FN_SEL_SCIF4_2 = 1286, + FN_SEL_HSCIF2_0 = 1287, + FN_SEL_HSCIF2_1 = 1288, + FN_SEL_HSCIF2_2 = 1289, + FN_SEL_SCIF3_0 = 1290, + FN_SEL_SCIF3_1 = 1291, + FN_SEL_ETHERAVB_0 = 1292, + FN_SEL_ETHERAVB_1 = 1293, + FN_SEL_SCIF2_0 = 1294, + FN_SEL_SCIF2_1 = 1295, + FN_SEL_DRIF3_0 = 1296, + FN_SEL_DRIF3_1 = 1297, + FN_SEL_SCIF1_0 = 1298, + FN_SEL_SCIF1_1 = 1299, + FN_SEL_DRIF2_0 = 1300, + FN_SEL_DRIF2_1 = 1301, + FN_SEL_SCIF_0 = 1302, + FN_SEL_SCIF_1 = 1303, + FN_SEL_DRIF1_0 = 1304, + FN_SEL_DRIF1_1 = 1305, + FN_SEL_DRIF1_2 = 1306, + FN_SEL_REMOCON_0 = 1307, + FN_SEL_REMOCON_1 = 1308, + FN_SEL_DRIF0_0 = 1309, + FN_SEL_DRIF0_1 = 1310, + FN_SEL_DRIF0_2 = 1311, + FN_SEL_RCAN0_0 = 1312, + FN_SEL_RCAN0_1 = 1313, + FN_SEL_CANFD0_0 = 1314, + FN_SEL_CANFD0_1 = 1315, + FN_SEL_PWM6_0 = 1316, + FN_SEL_PWM6_1 = 1317, + FN_SEL_ADGA_0 = 1318, + FN_SEL_ADGA_1 = 1319, + FN_SEL_ADGA_2 = 1320, + FN_SEL_ADGA_3 = 1321, + FN_SEL_PWM5_0 = 1322, + FN_SEL_PWM5_1 = 1323, + FN_SEL_PWM4_0 = 1324, + FN_SEL_PWM4_1 = 1325, + FN_SEL_PWM3_0 = 1326, + FN_SEL_PWM3_1 = 1327, + FN_SEL_PWM2_0 = 1328, + FN_SEL_PWM2_1 = 1329, + FN_SEL_PWM1_0 = 1330, + FN_SEL_PWM1_1 = 1331, + FN_SEL_VIN4_0 = 1332, + FN_SEL_VIN4_1 = 1333, + PINMUX_FUNCTION_END = 1334, + PINMUX_MARK_BEGIN = 1335, + CLKOUT_MARK = 1336, + MSIOF0_RXD_MARK = 1337, + MSIOF0_TXD_MARK = 1338, + MSIOF0_SCK_MARK = 1339, + SSI_SDATA5_MARK = 1340, + SSI_WS5_MARK = 1341, + SSI_SCK5_MARK = 1342, + GP7_03_MARK = 1343, + GP7_02_MARK = 1344, + AVS2_MARK = 1345, + AVS1_MARK = 1346, + IP0_3_0_MARK = 1347, + AVB_MDC_MARK = 1348, + MSIOF2_SS2_C_MARK = 1349, + IP1_3_0_MARK = 1350, + IRQ2_MARK = 1351, + QCPV_QDE_MARK = 1352, + DU_EXODDF_DU_ODDF_DISP_CDE_MARK = 1353, + VI4_DATA2_B_MARK = 1354, + MSIOF3_SYNC_E_MARK = 1355, + PWM3_B_MARK = 1356, + IP2_3_0_MARK = 1357, + A1_MARK = 1358, + LCDOUT17_MARK = 1359, + MSIOF3_TXD_B_MARK = 1360, + VI4_DATA9_MARK = 1361, + DU_DB1_MARK = 1362, + PWM4_A_MARK = 1363, + IP3_3_0_MARK = 1364, + A9_MARK = 1365, + MSIOF2_SCK_A_MARK = 1366, + CTS4_N_B_MARK = 1367, + VI5_VSYNC_N_MARK = 1368, + IP0_7_4_MARK = 1369, + AVB_MAGIC_MARK = 1370, + MSIOF2_SS1_C_MARK = 1371, + SCK4_A_MARK = 1372, + IP1_7_4_MARK = 1373, + IRQ3_MARK = 1374, + QSTVB_QVE_MARK = 1375, + DU_DOTCLKOUT1_MARK = 1376, + VI4_DATA3_B_MARK = 1377, + MSIOF3_SCK_E_MARK = 1378, + PWM4_B_MARK = 1379, + IP2_7_4_MARK = 1380, + A2_MARK = 1381, + LCDOUT18_MARK = 1382, + MSIOF3_SCK_B_MARK = 1383, + VI4_DATA10_MARK = 1384, + DU_DB2_MARK = 1385, + PWM5_A_MARK = 1386, + IP3_7_4_MARK = 1387, + A10_MARK = 1388, + MSIOF2_RXD_A_MARK = 1389, + RTS4_N_B_MARK = 1390, + VI5_HSYNC_N_MARK = 1391, + IP0_11_8_MARK = 1392, + AVB_PHY_INT_MARK = 1393, + MSIOF2_SYNC_C_MARK = 1394, + RX4_A_MARK = 1395, + IP1_11_8_MARK = 1396, + IRQ4_MARK = 1397, + QSTH_QHS_MARK = 1398, + DU_EXHSYNC_DU_HSYNC_MARK = 1399, + VI4_DATA4_B_MARK = 1400, + MSIOF3_RXD_E_MARK = 1401, + PWM5_B_MARK = 1402, + IP2_11_8_MARK = 1403, + A3_MARK = 1404, + LCDOUT19_MARK = 1405, + MSIOF3_RXD_B_MARK = 1406, + VI4_DATA11_MARK = 1407, + DU_DB3_MARK = 1408, + PWM6_A_MARK = 1409, + IP3_11_8_MARK = 1410, + A11_MARK = 1411, + TX3_B_MARK = 1412, + MSIOF2_TXD_A_MARK = 1413, + HTX4_B_MARK = 1414, + HSCK4_MARK = 1415, + VI5_FIELD_MARK = 1416, + SCL6_A_MARK = 1417, + AVB_AVTP_CAPTURE_B_MARK = 1418, + PWM2_B_MARK = 1419, + IP0_15_12_MARK = 1420, + AVB_LINK_MARK = 1421, + MSIOF2_SCK_C_MARK = 1422, + TX4_A_MARK = 1423, + IP1_15_12_MARK = 1424, + IRQ5_MARK = 1425, + QSTB_QHE_MARK = 1426, + DU_EXVSYNC_DU_VSYNC_MARK = 1427, + VI4_DATA5_B_MARK = 1428, + MSIOF3_TXD_E_MARK = 1429, + PWM6_B_MARK = 1430, + IP2_15_12_MARK = 1431, + A4_MARK = 1432, + LCDOUT20_MARK = 1433, + MSIOF3_SS1_B_MARK = 1434, + VI4_DATA12_MARK = 1435, + VI5_DATA12_MARK = 1436, + DU_DB4_MARK = 1437, + IP3_15_12_MARK = 1438, + A12_MARK = 1439, + LCDOUT12_MARK = 1440, + MSIOF3_SCK_C_MARK = 1441, + HRX4_A_MARK = 1442, + VI5_DATA8_MARK = 1443, + DU_DG4_MARK = 1444, + IP0_19_16_MARK = 1445, + AVB_AVTP_MATCH_A_MARK = 1446, + MSIOF2_RXD_C_MARK = 1447, + CTS4_N_A_MARK = 1448, + IP1_19_16_MARK = 1449, + PWM0_MARK = 1450, + AVB_AVTP_PPS_MARK = 1451, + VI4_DATA6_B_MARK = 1452, + IECLK_B_MARK = 1453, + IP2_19_16_MARK = 1454, + A5_MARK = 1455, + LCDOUT21_MARK = 1456, + MSIOF3_SS2_B_MARK = 1457, + SCK4_B_MARK = 1458, + VI4_DATA13_MARK = 1459, + VI5_DATA13_MARK = 1460, + DU_DB5_MARK = 1461, + IP3_19_16_MARK = 1462, + A13_MARK = 1463, + LCDOUT13_MARK = 1464, + MSIOF3_SYNC_C_MARK = 1465, + HTX4_A_MARK = 1466, + VI5_DATA9_MARK = 1467, + DU_DG5_MARK = 1468, + IP0_23_20_MARK = 1469, + AVB_AVTP_CAPTURE_A_MARK = 1470, + MSIOF2_TXD_C_MARK = 1471, + RTS4_N_A_MARK = 1472, + IP1_23_20_MARK = 1473, + PWM1_A_MARK = 1474, + HRX3_D_MARK = 1475, + VI4_DATA7_B_MARK = 1476, + IERX_B_MARK = 1477, + IP2_23_20_MARK = 1478, + A6_MARK = 1479, + LCDOUT22_MARK = 1480, + MSIOF2_SS1_A_MARK = 1481, + RX4_B_MARK = 1482, + VI4_DATA14_MARK = 1483, + VI5_DATA14_MARK = 1484, + DU_DB6_MARK = 1485, + IP3_23_20_MARK = 1486, + A14_MARK = 1487, + LCDOUT14_MARK = 1488, + MSIOF3_RXD_C_MARK = 1489, + HCTS4_N_MARK = 1490, + VI5_DATA10_MARK = 1491, + DU_DG6_MARK = 1492, + IP0_27_24_MARK = 1493, + IRQ0_MARK = 1494, + QPOLB_MARK = 1495, + DU_CDE_MARK = 1496, + VI4_DATA0_B_MARK = 1497, + CAN0_TX_B_MARK = 1498, + CANFD0_TX_B_MARK = 1499, + MSIOF3_SS2_E_MARK = 1500, + IP1_27_24_MARK = 1501, + PWM2_A_MARK = 1502, + HTX3_D_MARK = 1503, + IETX_B_MARK = 1504, + IP2_27_24_MARK = 1505, + A7_MARK = 1506, + LCDOUT23_MARK = 1507, + MSIOF2_SS2_A_MARK = 1508, + TX4_B_MARK = 1509, + VI4_DATA15_MARK = 1510, + VI5_DATA15_MARK = 1511, + DU_DB7_MARK = 1512, + IP3_27_24_MARK = 1513, + A15_MARK = 1514, + LCDOUT15_MARK = 1515, + MSIOF3_TXD_C_MARK = 1516, + HRTS4_N_MARK = 1517, + VI5_DATA11_MARK = 1518, + DU_DG7_MARK = 1519, + IP0_31_28_MARK = 1520, + IRQ1_MARK = 1521, + QPOLA_MARK = 1522, + DU_DISP_MARK = 1523, + VI4_DATA1_B_MARK = 1524, + CAN0_RX_B_MARK = 1525, + CANFD0_RX_B_MARK = 1526, + MSIOF3_SS1_E_MARK = 1527, + IP1_31_28_MARK = 1528, + A0_MARK = 1529, + LCDOUT16_MARK = 1530, + MSIOF3_SYNC_B_MARK = 1531, + VI4_DATA8_MARK = 1532, + DU_DB0_MARK = 1533, + PWM3_A_MARK = 1534, + IP2_31_28_MARK = 1535, + A8_MARK = 1536, + RX3_B_MARK = 1537, + MSIOF2_SYNC_A_MARK = 1538, + HRX4_B_MARK = 1539, + SDA6_A_MARK = 1540, + AVB_AVTP_MATCH_B_MARK = 1541, + PWM1_B_MARK = 1542, + IP3_31_28_MARK = 1543, + A16_MARK = 1544, + LCDOUT8_MARK = 1545, + VI4_FIELD_MARK = 1546, + DU_DG0_MARK = 1547, + IP4_3_0_MARK = 1548, + A17_MARK = 1549, + LCDOUT9_MARK = 1550, + VI4_VSYNC_N_MARK = 1551, + DU_DG1_MARK = 1552, + IP5_3_0_MARK = 1553, + WE0_N_MARK = 1554, + MSIOF3_TXD_D_MARK = 1555, + CTS3_N_MARK = 1556, + HCTS3_N_MARK = 1557, + SCL6_B_MARK = 1558, + CAN_CLK_MARK = 1559, + IECLK_A_MARK = 1560, + IP6_3_0_MARK = 1561, + D5_MARK = 1562, + MSIOF2_SYNC_B_MARK = 1563, + VI4_DATA21_MARK = 1564, + VI5_DATA5_MARK = 1565, + IP7_3_0_MARK = 1566, + D13_MARK = 1567, + LCDOUT5_MARK = 1568, + MSIOF2_SS2_D_MARK = 1569, + TX4_C_MARK = 1570, + VI4_DATA5_A_MARK = 1571, + DU_DR5_MARK = 1572, + IP4_7_4_MARK = 1573, + A18_MARK = 1574, + LCDOUT10_MARK = 1575, + VI4_HSYNC_N_MARK = 1576, + DU_DG2_MARK = 1577, + IP5_7_4_MARK = 1578, + WE1_N_MARK = 1579, + MSIOF3_SS1_D_MARK = 1580, + RTS3_N_MARK = 1581, + HRTS3_N_MARK = 1582, + SDA6_B_MARK = 1583, + CAN1_RX_MARK = 1584, + CANFD1_RX_MARK = 1585, + IERX_A_MARK = 1586, + IP6_7_4_MARK = 1587, + D6_MARK = 1588, + MSIOF2_RXD_B_MARK = 1589, + VI4_DATA22_MARK = 1590, + VI5_DATA6_MARK = 1591, + IP7_7_4_MARK = 1592, + D14_MARK = 1593, + LCDOUT6_MARK = 1594, + MSIOF3_SS1_A_MARK = 1595, + HRX3_C_MARK = 1596, + VI4_DATA6_A_MARK = 1597, + DU_DR6_MARK = 1598, + SCL6_C_MARK = 1599, + IP4_11_8_MARK = 1600, + A19_MARK = 1601, + LCDOUT11_MARK = 1602, + VI4_CLKENB_MARK = 1603, + DU_DG3_MARK = 1604, + IP5_11_8_MARK = 1605, + EX_WAIT0_A_MARK = 1606, + QCLK_MARK = 1607, + VI4_CLK_MARK = 1608, + DU_DOTCLKOUT0_MARK = 1609, + IP6_11_8_MARK = 1610, + D7_MARK = 1611, + MSIOF2_TXD_B_MARK = 1612, + VI4_DATA23_MARK = 1613, + VI5_DATA7_MARK = 1614, + IP7_11_8_MARK = 1615, + D15_MARK = 1616, + LCDOUT7_MARK = 1617, + MSIOF3_SS2_A_MARK = 1618, + HTX3_C_MARK = 1619, + VI4_DATA7_A_MARK = 1620, + DU_DR7_MARK = 1621, + SDA6_C_MARK = 1622, + IP4_15_12_MARK = 1623, + CS0_N_MARK = 1624, + VI5_CLKENB_MARK = 1625, + IP5_15_12_MARK = 1626, + D0_MARK = 1627, + MSIOF2_SS1_B_MARK = 1628, + MSIOF3_SCK_A_MARK = 1629, + VI4_DATA16_MARK = 1630, + VI5_DATA0_MARK = 1631, + IP6_15_12_MARK = 1632, + D8_MARK = 1633, + LCDOUT0_MARK = 1634, + MSIOF2_SCK_D_MARK = 1635, + SCK4_C_MARK = 1636, + VI4_DATA0_A_MARK = 1637, + DU_DR0_MARK = 1638, + IP4_19_16_MARK = 1639, + CS1_N_MARK = 1640, + VI5_CLK_MARK = 1641, + EX_WAIT0_B_MARK = 1642, + IP5_19_16_MARK = 1643, + D1_MARK = 1644, + MSIOF2_SS2_B_MARK = 1645, + MSIOF3_SYNC_A_MARK = 1646, + VI4_DATA17_MARK = 1647, + VI5_DATA1_MARK = 1648, + IP6_19_16_MARK = 1649, + D9_MARK = 1650, + LCDOUT1_MARK = 1651, + MSIOF2_SYNC_D_MARK = 1652, + VI4_DATA1_A_MARK = 1653, + DU_DR1_MARK = 1654, + IP7_19_16_MARK = 1655, + SD0_CLK_MARK = 1656, + MSIOF1_SCK_E_MARK = 1657, + STP_OPWM_0_B_MARK = 1658, + IP4_23_20_MARK = 1659, + BS_N_MARK = 1660, + QSTVA_QVS_MARK = 1661, + MSIOF3_SCK_D_MARK = 1662, + SCK3_MARK = 1663, + HSCK3_MARK = 1664, + CAN1_TX_MARK = 1665, + CANFD1_TX_MARK = 1666, + IETX_A_MARK = 1667, + IP5_23_20_MARK = 1668, + D2_MARK = 1669, + MSIOF3_RXD_A_MARK = 1670, + VI4_DATA18_MARK = 1671, + VI5_DATA2_MARK = 1672, + IP6_23_20_MARK = 1673, + D10_MARK = 1674, + LCDOUT2_MARK = 1675, + MSIOF2_RXD_D_MARK = 1676, + HRX3_B_MARK = 1677, + VI4_DATA2_A_MARK = 1678, + CTS4_N_C_MARK = 1679, + DU_DR2_MARK = 1680, + IP7_23_20_MARK = 1681, + SD0_CMD_MARK = 1682, + MSIOF1_SYNC_E_MARK = 1683, + STP_IVCXO27_0_B_MARK = 1684, + IP4_27_24_MARK = 1685, + RD_N_MARK = 1686, + MSIOF3_SYNC_D_MARK = 1687, + RX3_A_MARK = 1688, + HRX3_A_MARK = 1689, + CAN0_TX_A_MARK = 1690, + CANFD0_TX_A_MARK = 1691, + IP5_27_24_MARK = 1692, + D3_MARK = 1693, + MSIOF3_TXD_A_MARK = 1694, + VI4_DATA19_MARK = 1695, + VI5_DATA3_MARK = 1696, + IP6_27_24_MARK = 1697, + D11_MARK = 1698, + LCDOUT3_MARK = 1699, + MSIOF2_TXD_D_MARK = 1700, + HTX3_B_MARK = 1701, + VI4_DATA3_A_MARK = 1702, + RTS4_N_C_MARK = 1703, + DU_DR3_MARK = 1704, + IP7_27_24_MARK = 1705, + SD0_DAT0_MARK = 1706, + MSIOF1_RXD_E_MARK = 1707, + TS_SCK0_B_MARK = 1708, + STP_ISCLK_0_B_MARK = 1709, + IP4_31_28_MARK = 1710, + RD_WR_N_MARK = 1711, + MSIOF3_RXD_D_MARK = 1712, + TX3_A_MARK = 1713, + HTX3_A_MARK = 1714, + CAN0_RX_A_MARK = 1715, + CANFD0_RX_A_MARK = 1716, + IP5_31_28_MARK = 1717, + D4_MARK = 1718, + MSIOF2_SCK_B_MARK = 1719, + VI4_DATA20_MARK = 1720, + VI5_DATA4_MARK = 1721, + IP6_31_28_MARK = 1722, + D12_MARK = 1723, + LCDOUT4_MARK = 1724, + MSIOF2_SS1_D_MARK = 1725, + RX4_C_MARK = 1726, + VI4_DATA4_A_MARK = 1727, + DU_DR4_MARK = 1728, + IP7_31_28_MARK = 1729, + SD0_DAT1_MARK = 1730, + MSIOF1_TXD_E_MARK = 1731, + TS_SPSYNC0_B_MARK = 1732, + STP_ISSYNC_0_B_MARK = 1733, + IP8_3_0_MARK = 1734, + SD0_DAT2_MARK = 1735, + MSIOF1_SS1_E_MARK = 1736, + TS_SDAT0_B_MARK = 1737, + STP_ISD_0_B_MARK = 1738, + IP9_3_0_MARK = 1739, + SD2_CLK_MARK = 1740, + NFDATA8_MARK = 1741, + IP10_3_0_MARK = 1742, + SD3_CMD_MARK = 1743, + NFRE_N_MARK = 1744, + IP11_3_0_MARK = 1745, + SD3_DAT7_MARK = 1746, + SD3_WP_MARK = 1747, + NFDATA7_MARK = 1748, + IP8_7_4_MARK = 1749, + SD0_DAT3_MARK = 1750, + MSIOF1_SS2_E_MARK = 1751, + TS_SDEN0_B_MARK = 1752, + STP_ISEN_0_B_MARK = 1753, + IP9_7_4_MARK = 1754, + SD2_CMD_MARK = 1755, + NFDATA9_MARK = 1756, + IP10_7_4_MARK = 1757, + SD3_DAT0_MARK = 1758, + NFDATA0_MARK = 1759, + IP11_7_4_MARK = 1760, + SD3_DS_MARK = 1761, + NFCLE_MARK = 1762, + IP8_11_8_MARK = 1763, + SD1_CLK_MARK = 1764, + MSIOF1_SCK_G_MARK = 1765, + SIM0_CLK_A_MARK = 1766, + IP9_11_8_MARK = 1767, + SD2_DAT0_MARK = 1768, + NFDATA10_MARK = 1769, + IP10_11_8_MARK = 1770, + SD3_DAT1_MARK = 1771, + NFDATA1_MARK = 1772, + IP11_11_8_MARK = 1773, + SD0_CD_MARK = 1774, + NFDATA14_A_MARK = 1775, + SCL2_B_MARK = 1776, + SIM0_RST_A_MARK = 1777, + IP8_15_12_MARK = 1778, + SD1_CMD_MARK = 1779, + MSIOF1_SYNC_G_MARK = 1780, + NFCE_N_B_MARK = 1781, + SIM0_D_A_MARK = 1782, + STP_IVCXO27_1_B_MARK = 1783, + IP9_15_12_MARK = 1784, + SD2_DAT1_MARK = 1785, + NFDATA11_MARK = 1786, + IP10_15_12_MARK = 1787, + SD3_DAT2_MARK = 1788, + NFDATA2_MARK = 1789, + IP11_15_12_MARK = 1790, + SD0_WP_MARK = 1791, + NFDATA15_A_MARK = 1792, + SDA2_B_MARK = 1793, + IP8_19_16_MARK = 1794, + SD1_DAT0_MARK = 1795, + SD2_DAT4_MARK = 1796, + MSIOF1_RXD_G_MARK = 1797, + NFWP_N_B_MARK = 1798, + TS_SCK1_B_MARK = 1799, + STP_ISCLK_1_B_MARK = 1800, + IP9_19_16_MARK = 1801, + SD2_DAT2_MARK = 1802, + NFDATA12_MARK = 1803, + IP10_19_16_MARK = 1804, + SD3_DAT3_MARK = 1805, + NFDATA3_MARK = 1806, + IP11_19_16_MARK = 1807, + SD1_CD_MARK = 1808, + NFRB_N_A_MARK = 1809, + SIM0_CLK_B_MARK = 1810, + IP8_23_20_MARK = 1811, + SD1_DAT1_MARK = 1812, + SD2_DAT5_MARK = 1813, + MSIOF1_TXD_G_MARK = 1814, + NFDATA14_B_MARK = 1815, + TS_SPSYNC1_B_MARK = 1816, + STP_ISSYNC_1_B_MARK = 1817, + IP9_23_20_MARK = 1818, + SD2_DAT3_MARK = 1819, + NFDATA13_MARK = 1820, + IP10_23_20_MARK = 1821, + SD3_DAT4_MARK = 1822, + SD2_CD_A_MARK = 1823, + NFDATA4_MARK = 1824, + IP11_23_20_MARK = 1825, + SD1_WP_MARK = 1826, + NFCE_N_A_MARK = 1827, + SIM0_D_B_MARK = 1828, + IP8_27_24_MARK = 1829, + SD1_DAT2_MARK = 1830, + SD2_DAT6_MARK = 1831, + MSIOF1_SS1_G_MARK = 1832, + NFDATA15_B_MARK = 1833, + TS_SDAT1_B_MARK = 1834, + STP_ISD_1_B_MARK = 1835, + IP9_27_24_MARK = 1836, + SD2_DS_MARK = 1837, + NFALE_MARK = 1838, + IP10_27_24_MARK = 1839, + SD3_DAT5_MARK = 1840, + SD2_WP_A_MARK = 1841, + NFDATA5_MARK = 1842, + IP11_27_24_MARK = 1843, + SCK0_MARK = 1844, + HSCK1_B_MARK = 1845, + MSIOF1_SS2_B_MARK = 1846, + AUDIO_CLKC_B_MARK = 1847, + SDA2_A_MARK = 1848, + SIM0_RST_B_MARK = 1849, + STP_OPWM_0_C_MARK = 1850, + RIF0_CLK_B_MARK = 1851, + ADICHS2_MARK = 1852, + SCK5_B_MARK = 1853, + IP8_31_28_MARK = 1854, + SD1_DAT3_MARK = 1855, + SD2_DAT7_MARK = 1856, + MSIOF1_SS2_G_MARK = 1857, + NFRB_N_B_MARK = 1858, + TS_SDEN1_B_MARK = 1859, + STP_ISEN_1_B_MARK = 1860, + IP9_31_28_MARK = 1861, + SD3_CLK_MARK = 1862, + NFWE_N_MARK = 1863, + IP10_31_28_MARK = 1864, + SD3_DAT6_MARK = 1865, + SD3_CD_MARK = 1866, + NFDATA6_MARK = 1867, + IP11_31_28_MARK = 1868, + RX0_MARK = 1869, + HRX1_B_MARK = 1870, + TS_SCK0_C_MARK = 1871, + STP_ISCLK_0_C_MARK = 1872, + RIF0_D0_B_MARK = 1873, + IP12_3_0_MARK = 1874, + TX0_MARK = 1875, + HTX1_B_MARK = 1876, + TS_SPSYNC0_C_MARK = 1877, + STP_ISSYNC_0_C_MARK = 1878, + RIF0_D1_B_MARK = 1879, + IP13_3_0_MARK = 1880, + TX2_A_MARK = 1881, + SD2_CD_B_MARK = 1882, + SCL1_A_MARK = 1883, + FMCLK_A_MARK = 1884, + RIF1_D1_C_MARK = 1885, + FSO_CFE_0_N_MARK = 1886, + IP14_3_0_MARK = 1887, + MSIOF0_SS1_MARK = 1888, + RX5_A_MARK = 1889, + NFWP_N_A_MARK = 1890, + AUDIO_CLKA_C_MARK = 1891, + SSI_SCK2_A_MARK = 1892, + STP_IVCXO27_0_C_MARK = 1893, + AUDIO_CLKOUT3_A_MARK = 1894, + TCLK1_B_MARK = 1895, + IP15_3_0_MARK = 1896, + SSI_SDATA1_A_MARK = 1897, + IP12_7_4_MARK = 1898, + CTS0_N_MARK = 1899, + HCTS1_N_B_MARK = 1900, + MSIOF1_SYNC_B_MARK = 1901, + TS_SPSYNC1_C_MARK = 1902, + STP_ISSYNC_1_C_MARK = 1903, + RIF1_SYNC_B_MARK = 1904, + AUDIO_CLKOUT_C_MARK = 1905, + ADICS_SAMP_MARK = 1906, + IP13_7_4_MARK = 1907, + RX2_A_MARK = 1908, + SD2_WP_B_MARK = 1909, + SDA1_A_MARK = 1910, + FMIN_A_MARK = 1911, + RIF1_SYNC_C_MARK = 1912, + FSO_CFE_1_N_MARK = 1913, + IP14_7_4_MARK = 1914, + MSIOF0_SS2_MARK = 1915, + TX5_A_MARK = 1916, + MSIOF1_SS2_D_MARK = 1917, + AUDIO_CLKC_A_MARK = 1918, + SSI_WS2_A_MARK = 1919, + STP_OPWM_0_D_MARK = 1920, + AUDIO_CLKOUT_D_MARK = 1921, + SPEEDIN_B_MARK = 1922, + IP15_7_4_MARK = 1923, + SSI_SDATA2_A_MARK = 1924, + SSI_SCK1_B_MARK = 1925, + IP12_11_8_MARK = 1926, + RTS0_N_MARK = 1927, + HRTS1_N_B_MARK = 1928, + MSIOF1_SS1_B_MARK = 1929, + AUDIO_CLKA_B_MARK = 1930, + SCL2_A_MARK = 1931, + STP_IVCXO27_1_C_MARK = 1932, + RIF0_SYNC_B_MARK = 1933, + ADICHS1_MARK = 1934, + IP13_11_8_MARK = 1935, + HSCK0_MARK = 1936, + MSIOF1_SCK_D_MARK = 1937, + AUDIO_CLKB_A_MARK = 1938, + SSI_SDATA1_B_MARK = 1939, + TS_SCK0_D_MARK = 1940, + STP_ISCLK_0_D_MARK = 1941, + RIF0_CLK_C_MARK = 1942, + RX5_B_MARK = 1943, + IP14_11_8_MARK = 1944, + MLB_CLK_MARK = 1945, + MSIOF1_SCK_F_MARK = 1946, + SCL1_B_MARK = 1947, + IP15_11_8_MARK = 1948, + SSI_SCK349_MARK = 1949, + MSIOF1_SS1_A_MARK = 1950, + STP_OPWM_0_A_MARK = 1951, + IP12_15_12_MARK = 1952, + RX1_A_MARK = 1953, + HRX1_A_MARK = 1954, + TS_SDAT0_C_MARK = 1955, + STP_ISD_0_C_MARK = 1956, + RIF1_CLK_C_MARK = 1957, + IP13_15_12_MARK = 1958, + HRX0_MARK = 1959, + MSIOF1_RXD_D_MARK = 1960, + SSI_SDATA2_B_MARK = 1961, + TS_SDEN0_D_MARK = 1962, + STP_ISEN_0_D_MARK = 1963, + RIF0_D0_C_MARK = 1964, + IP14_15_12_MARK = 1965, + MLB_SIG_MARK = 1966, + RX1_B_MARK = 1967, + MSIOF1_SYNC_F_MARK = 1968, + SDA1_B_MARK = 1969, + IP15_15_12_MARK = 1970, + SSI_WS349_MARK = 1971, + HCTS2_N_A_MARK = 1972, + MSIOF1_SS2_A_MARK = 1973, + STP_IVCXO27_0_A_MARK = 1974, + IP12_19_16_MARK = 1975, + TX1_A_MARK = 1976, + HTX1_A_MARK = 1977, + TS_SDEN0_C_MARK = 1978, + STP_ISEN_0_C_MARK = 1979, + RIF1_D0_C_MARK = 1980, + IP13_19_16_MARK = 1981, + HTX0_MARK = 1982, + MSIOF1_TXD_D_MARK = 1983, + SSI_SDATA9_B_MARK = 1984, + TS_SDAT0_D_MARK = 1985, + STP_ISD_0_D_MARK = 1986, + RIF0_D1_C_MARK = 1987, + IP14_19_16_MARK = 1988, + MLB_DAT_MARK = 1989, + TX1_B_MARK = 1990, + MSIOF1_RXD_F_MARK = 1991, + IP15_19_16_MARK = 1992, + SSI_SDATA3_MARK = 1993, + HRTS2_N_A_MARK = 1994, + MSIOF1_TXD_A_MARK = 1995, + TS_SCK0_A_MARK = 1996, + STP_ISCLK_0_A_MARK = 1997, + RIF0_D1_A_MARK = 1998, + RIF2_D0_A_MARK = 1999, + IP12_23_20_MARK = 2000, + CTS1_N_MARK = 2001, + HCTS1_N_A_MARK = 2002, + MSIOF1_RXD_B_MARK = 2003, + TS_SDEN1_C_MARK = 2004, + STP_ISEN_1_C_MARK = 2005, + RIF1_D0_B_MARK = 2006, + ADIDATA_MARK = 2007, + IP13_23_20_MARK = 2008, + HCTS0_N_MARK = 2009, + RX2_B_MARK = 2010, + MSIOF1_SYNC_D_MARK = 2011, + SSI_SCK9_A_MARK = 2012, + TS_SPSYNC0_D_MARK = 2013, + STP_ISSYNC_0_D_MARK = 2014, + RIF0_SYNC_C_MARK = 2015, + AUDIO_CLKOUT1_A_MARK = 2016, + IP14_23_20_MARK = 2017, + SSI_SCK01239_MARK = 2018, + MSIOF1_TXD_F_MARK = 2019, + IP15_23_20_MARK = 2020, + SSI_SCK4_MARK = 2021, + HRX2_A_MARK = 2022, + MSIOF1_SCK_A_MARK = 2023, + TS_SDAT0_A_MARK = 2024, + STP_ISD_0_A_MARK = 2025, + RIF0_CLK_A_MARK = 2026, + RIF2_CLK_A_MARK = 2027, + IP12_27_24_MARK = 2028, + RTS1_N_MARK = 2029, + HRTS1_N_A_MARK = 2030, + MSIOF1_TXD_B_MARK = 2031, + TS_SDAT1_C_MARK = 2032, + STP_ISD_1_C_MARK = 2033, + RIF1_D1_B_MARK = 2034, + ADICHS0_MARK = 2035, + IP13_27_24_MARK = 2036, + HRTS0_N_MARK = 2037, + TX2_B_MARK = 2038, + MSIOF1_SS1_D_MARK = 2039, + SSI_WS9_A_MARK = 2040, + STP_IVCXO27_0_D_MARK = 2041, + BPFCLK_A_MARK = 2042, + AUDIO_CLKOUT2_A_MARK = 2043, + IP14_27_24_MARK = 2044, + SSI_WS01239_MARK = 2045, + MSIOF1_SS1_F_MARK = 2046, + IP15_27_24_MARK = 2047, + SSI_WS4_MARK = 2048, + HTX2_A_MARK = 2049, + MSIOF1_SYNC_A_MARK = 2050, + TS_SDEN0_A_MARK = 2051, + STP_ISEN_0_A_MARK = 2052, + RIF0_SYNC_A_MARK = 2053, + RIF2_SYNC_A_MARK = 2054, + IP12_31_28_MARK = 2055, + SCK2_MARK = 2056, + SCIF_CLK_B_MARK = 2057, + MSIOF1_SCK_B_MARK = 2058, + TS_SCK1_C_MARK = 2059, + STP_ISCLK_1_C_MARK = 2060, + RIF1_CLK_B_MARK = 2061, + ADICLK_MARK = 2062, + IP13_31_28_MARK = 2063, + MSIOF0_SYNC_MARK = 2064, + AUDIO_CLKOUT_A_MARK = 2065, + TX5_B_MARK = 2066, + BPFCLK_D_MARK = 2067, + IP14_31_28_MARK = 2068, + SSI_SDATA0_MARK = 2069, + MSIOF1_SS2_F_MARK = 2070, + IP15_31_28_MARK = 2071, + SSI_SDATA4_MARK = 2072, + HSCK2_A_MARK = 2073, + MSIOF1_RXD_A_MARK = 2074, + TS_SPSYNC0_A_MARK = 2075, + STP_ISSYNC_0_A_MARK = 2076, + RIF0_D0_A_MARK = 2077, + RIF2_D1_A_MARK = 2078, + IP16_3_0_MARK = 2079, + SSI_SCK6_MARK = 2080, + SIM0_RST_D_MARK = 2081, + IP17_3_0_MARK = 2082, + AUDIO_CLKA_A_MARK = 2083, + IP18_3_0_MARK = 2084, + GP6_30_MARK = 2085, + AUDIO_CLKOUT2_B_MARK = 2086, + SSI_SCK9_B_MARK = 2087, + TS_SDEN0_E_MARK = 2088, + STP_ISEN_0_E_MARK = 2089, + RIF2_D0_B_MARK = 2090, + TPU0TO2_MARK = 2091, + FMCLK_C_MARK = 2092, + FMCLK_D_MARK = 2093, + IP16_7_4_MARK = 2094, + SSI_WS6_MARK = 2095, + SIM0_D_D_MARK = 2096, + IP17_7_4_MARK = 2097, + AUDIO_CLKB_B_MARK = 2098, + SCIF_CLK_A_MARK = 2099, + STP_IVCXO27_1_D_MARK = 2100, + REMOCON_A_MARK = 2101, + TCLK1_A_MARK = 2102, + IP18_7_4_MARK = 2103, + GP6_31_MARK = 2104, + AUDIO_CLKOUT3_B_MARK = 2105, + SSI_WS9_B_MARK = 2106, + TS_SPSYNC0_E_MARK = 2107, + STP_ISSYNC_0_E_MARK = 2108, + RIF2_D1_B_MARK = 2109, + TPU0TO3_MARK = 2110, + FMIN_C_MARK = 2111, + FMIN_D_MARK = 2112, + IP16_11_8_MARK = 2113, + SSI_SDATA6_MARK = 2114, + SIM0_CLK_D_MARK = 2115, + IP17_11_8_MARK = 2116, + USB0_PWEN_MARK = 2117, + SIM0_RST_C_MARK = 2118, + TS_SCK1_D_MARK = 2119, + STP_ISCLK_1_D_MARK = 2120, + BPFCLK_B_MARK = 2121, + RIF3_CLK_B_MARK = 2122, + HSCK2_C_MARK = 2123, + IP16_15_12_MARK = 2124, + SSI_SCK78_MARK = 2125, + HRX2_B_MARK = 2126, + MSIOF1_SCK_C_MARK = 2127, + TS_SCK1_A_MARK = 2128, + STP_ISCLK_1_A_MARK = 2129, + RIF1_CLK_A_MARK = 2130, + RIF3_CLK_A_MARK = 2131, + IP17_15_12_MARK = 2132, + USB0_OVC_MARK = 2133, + SIM0_D_C_MARK = 2134, + TS_SDAT1_D_MARK = 2135, + STP_ISD_1_D_MARK = 2136, + RIF3_SYNC_B_MARK = 2137, + HRX2_C_MARK = 2138, + IP16_19_16_MARK = 2139, + SSI_WS78_MARK = 2140, + HTX2_B_MARK = 2141, + MSIOF1_SYNC_C_MARK = 2142, + TS_SDAT1_A_MARK = 2143, + STP_ISD_1_A_MARK = 2144, + RIF1_SYNC_A_MARK = 2145, + RIF3_SYNC_A_MARK = 2146, + IP17_19_16_MARK = 2147, + USB1_PWEN_MARK = 2148, + SIM0_CLK_C_MARK = 2149, + SSI_SCK1_A_MARK = 2150, + TS_SCK0_E_MARK = 2151, + STP_ISCLK_0_E_MARK = 2152, + FMCLK_B_MARK = 2153, + RIF2_CLK_B_MARK = 2154, + SPEEDIN_A_MARK = 2155, + HTX2_C_MARK = 2156, + IP16_23_20_MARK = 2157, + SSI_SDATA7_MARK = 2158, + HCTS2_N_B_MARK = 2159, + MSIOF1_RXD_C_MARK = 2160, + TS_SDEN1_A_MARK = 2161, + STP_ISEN_1_A_MARK = 2162, + RIF1_D0_A_MARK = 2163, + RIF3_D0_A_MARK = 2164, + TCLK2_A_MARK = 2165, + IP17_23_20_MARK = 2166, + USB1_OVC_MARK = 2167, + MSIOF1_SS2_C_MARK = 2168, + SSI_WS1_A_MARK = 2169, + TS_SDAT0_E_MARK = 2170, + STP_ISD_0_E_MARK = 2171, + FMIN_B_MARK = 2172, + RIF2_SYNC_B_MARK = 2173, + REMOCON_B_MARK = 2174, + HCTS2_N_C_MARK = 2175, + IP16_27_24_MARK = 2176, + SSI_SDATA8_MARK = 2177, + HRTS2_N_B_MARK = 2178, + MSIOF1_TXD_C_MARK = 2179, + TS_SPSYNC1_A_MARK = 2180, + STP_ISSYNC_1_A_MARK = 2181, + RIF1_D1_A_MARK = 2182, + RIF3_D1_A_MARK = 2183, + IP17_27_24_MARK = 2184, + USB30_PWEN_MARK = 2185, + AUDIO_CLKOUT_B_MARK = 2186, + SSI_SCK2_B_MARK = 2187, + TS_SDEN1_D_MARK = 2188, + STP_ISEN_1_D_MARK = 2189, + STP_OPWM_0_E_MARK = 2190, + RIF3_D0_B_MARK = 2191, + TCLK2_B_MARK = 2192, + TPU0TO0_MARK = 2193, + BPFCLK_C_MARK = 2194, + HRTS2_N_C_MARK = 2195, + IP16_31_28_MARK = 2196, + SSI_SDATA9_A_MARK = 2197, + HSCK2_B_MARK = 2198, + MSIOF1_SS1_C_MARK = 2199, + HSCK1_A_MARK = 2200, + SSI_WS1_B_MARK = 2201, + SCK1_MARK = 2202, + STP_IVCXO27_1_A_MARK = 2203, + SCK5_A_MARK = 2204, + IP17_31_28_MARK = 2205, + USB30_OVC_MARK = 2206, + AUDIO_CLKOUT1_B_MARK = 2207, + SSI_WS2_B_MARK = 2208, + TS_SPSYNC1_D_MARK = 2209, + STP_ISSYNC_1_D_MARK = 2210, + STP_IVCXO27_0_E_MARK = 2211, + RIF3_D1_B_MARK = 2212, + FSO_TOE_N_MARK = 2213, + TPU0TO1_MARK = 2214, + SEL_MSIOF3_0_MARK = 2215, + SEL_MSIOF3_1_MARK = 2216, + SEL_MSIOF3_2_MARK = 2217, + SEL_MSIOF3_3_MARK = 2218, + SEL_MSIOF3_4_MARK = 2219, + SEL_TSIF1_0_MARK = 2220, + SEL_TSIF1_1_MARK = 2221, + SEL_TSIF1_2_MARK = 2222, + SEL_TSIF1_3_MARK = 2223, + I2C_SEL_5_0_MARK = 2224, + I2C_SEL_5_1_MARK = 2225, + I2C_SEL_3_0_MARK = 2226, + I2C_SEL_3_1_MARK = 2227, + SEL_TSIF0_0_MARK = 2228, + SEL_TSIF0_1_MARK = 2229, + SEL_TSIF0_2_MARK = 2230, + SEL_TSIF0_3_MARK = 2231, + SEL_TSIF0_4_MARK = 2232, + I2C_SEL_0_0_MARK = 2233, + I2C_SEL_0_1_MARK = 2234, + SEL_MSIOF2_0_MARK = 2235, + SEL_MSIOF2_1_MARK = 2236, + SEL_MSIOF2_2_MARK = 2237, + SEL_MSIOF2_3_MARK = 2238, + SEL_FM_0_MARK = 2239, + SEL_FM_1_MARK = 2240, + SEL_FM_2_MARK = 2241, + SEL_FM_3_MARK = 2242, + SEL_MSIOF1_0_MARK = 2243, + SEL_MSIOF1_1_MARK = 2244, + SEL_MSIOF1_2_MARK = 2245, + SEL_MSIOF1_3_MARK = 2246, + SEL_MSIOF1_4_MARK = 2247, + SEL_MSIOF1_5_MARK = 2248, + SEL_MSIOF1_6_MARK = 2249, + SEL_TIMER_TMU_0_MARK = 2250, + SEL_TIMER_TMU_1_MARK = 2251, + SEL_SCIF5_0_MARK = 2252, + SEL_SCIF5_1_MARK = 2253, + SEL_SSP1_1_0_MARK = 2254, + SEL_SSP1_1_1_MARK = 2255, + SEL_SSP1_1_2_MARK = 2256, + SEL_SSP1_1_3_MARK = 2257, + SEL_I2C6_0_MARK = 2258, + SEL_I2C6_1_MARK = 2259, + SEL_I2C6_2_MARK = 2260, + SEL_LBSC_0_MARK = 2261, + SEL_LBSC_1_MARK = 2262, + SEL_SSP1_0_0_MARK = 2263, + SEL_SSP1_0_1_MARK = 2264, + SEL_SSP1_0_2_MARK = 2265, + SEL_SSP1_0_3_MARK = 2266, + SEL_SSP1_0_4_MARK = 2267, + SEL_IEBUS_0_MARK = 2268, + SEL_IEBUS_1_MARK = 2269, + SEL_NDF_0_MARK = 2270, + SEL_NDF_1_MARK = 2271, + SEL_I2C2_0_MARK = 2272, + SEL_I2C2_1_MARK = 2273, + SEL_SSI2_0_MARK = 2274, + SEL_SSI2_1_MARK = 2275, + SEL_I2C1_0_MARK = 2276, + SEL_I2C1_1_MARK = 2277, + SEL_SSI1_0_MARK = 2278, + SEL_SSI1_1_MARK = 2279, + SEL_SSI9_0_MARK = 2280, + SEL_SSI9_1_MARK = 2281, + SEL_HSCIF4_0_MARK = 2282, + SEL_HSCIF4_1_MARK = 2283, + SEL_SPEED_PULSE_0_MARK = 2284, + SEL_SPEED_PULSE_1_MARK = 2285, + SEL_TIMER_TMU2_0_MARK = 2286, + SEL_TIMER_TMU2_1_MARK = 2287, + SEL_HSCIF3_0_MARK = 2288, + SEL_HSCIF3_1_MARK = 2289, + SEL_HSCIF3_2_MARK = 2290, + SEL_HSCIF3_3_MARK = 2291, + SEL_SIMCARD_0_MARK = 2292, + SEL_SIMCARD_1_MARK = 2293, + SEL_SIMCARD_2_MARK = 2294, + SEL_SIMCARD_3_MARK = 2295, + SEL_ADGB_0_MARK = 2296, + SEL_ADGB_1_MARK = 2297, + SEL_ADGC_0_MARK = 2298, + SEL_ADGC_1_MARK = 2299, + SEL_HSCIF1_0_MARK = 2300, + SEL_HSCIF1_1_MARK = 2301, + SEL_SDHI2_0_MARK = 2302, + SEL_SDHI2_1_MARK = 2303, + SEL_SCIF4_0_MARK = 2304, + SEL_SCIF4_1_MARK = 2305, + SEL_SCIF4_2_MARK = 2306, + SEL_HSCIF2_0_MARK = 2307, + SEL_HSCIF2_1_MARK = 2308, + SEL_HSCIF2_2_MARK = 2309, + SEL_SCIF3_0_MARK = 2310, + SEL_SCIF3_1_MARK = 2311, + SEL_ETHERAVB_0_MARK = 2312, + SEL_ETHERAVB_1_MARK = 2313, + SEL_SCIF2_0_MARK = 2314, + SEL_SCIF2_1_MARK = 2315, + SEL_DRIF3_0_MARK = 2316, + SEL_DRIF3_1_MARK = 2317, + SEL_SCIF1_0_MARK = 2318, + SEL_SCIF1_1_MARK = 2319, + SEL_DRIF2_0_MARK = 2320, + SEL_DRIF2_1_MARK = 2321, + SEL_SCIF_0_MARK = 2322, + SEL_SCIF_1_MARK = 2323, + SEL_DRIF1_0_MARK = 2324, + SEL_DRIF1_1_MARK = 2325, + SEL_DRIF1_2_MARK = 2326, + SEL_REMOCON_0_MARK = 2327, + SEL_REMOCON_1_MARK = 2328, + SEL_DRIF0_0_MARK = 2329, + SEL_DRIF0_1_MARK = 2330, + SEL_DRIF0_2_MARK = 2331, + SEL_RCAN0_0_MARK = 2332, + SEL_RCAN0_1_MARK = 2333, + SEL_CANFD0_0_MARK = 2334, + SEL_CANFD0_1_MARK = 2335, + SEL_PWM6_0_MARK = 2336, + SEL_PWM6_1_MARK = 2337, + SEL_ADGA_0_MARK = 2338, + SEL_ADGA_1_MARK = 2339, + SEL_ADGA_2_MARK = 2340, + SEL_ADGA_3_MARK = 2341, + SEL_PWM5_0_MARK = 2342, + SEL_PWM5_1_MARK = 2343, + SEL_PWM4_0_MARK = 2344, + SEL_PWM4_1_MARK = 2345, + SEL_PWM3_0_MARK = 2346, + SEL_PWM3_1_MARK = 2347, + SEL_PWM2_0_MARK = 2348, + SEL_PWM2_1_MARK = 2349, + SEL_PWM1_0_MARK = 2350, + SEL_PWM1_1_MARK = 2351, + SEL_VIN4_0_MARK = 2352, + SEL_VIN4_1_MARK = 2353, + QSPI0_SPCLK_MARK = 2354, + QSPI0_SSL_MARK = 2355, + QSPI0_MOSI_IO0_MARK = 2356, + QSPI0_MISO_IO1_MARK = 2357, + QSPI0_IO2_MARK = 2358, + QSPI0_IO3_MARK = 2359, + QSPI1_SPCLK_MARK = 2360, + QSPI1_SSL_MARK = 2361, + QSPI1_MOSI_IO0_MARK = 2362, + QSPI1_MISO_IO1_MARK = 2363, + QSPI1_IO2_MARK = 2364, + QSPI1_IO3_MARK = 2365, + RPC_INT_MARK = 2366, + RPC_WP_MARK = 2367, + RPC_RESET_MARK = 2368, + AVB_TX_CTL_MARK = 2369, + AVB_TXC_MARK = 2370, + AVB_TD0_MARK = 2371, + AVB_TD1_MARK = 2372, + AVB_TD2_MARK = 2373, + AVB_TD3_MARK = 2374, + AVB_RX_CTL_MARK = 2375, + AVB_RXC_MARK = 2376, + AVB_RD0_MARK = 2377, + AVB_RD1_MARK = 2378, + AVB_RD2_MARK = 2379, + AVB_RD3_MARK = 2380, + AVB_TXCREFCLK_MARK = 2381, + AVB_MDIO_MARK = 2382, + PRESETOUT_MARK = 2383, + DU_DOTCLKIN0_MARK = 2384, + DU_DOTCLKIN1_MARK = 2385, + DU_DOTCLKIN2_MARK = 2386, + TMS_MARK = 2387, + TDO_MARK = 2388, + ASEBRK_MARK = 2389, + MLB_REF_MARK = 2390, + TDI_MARK = 2391, + TCK_MARK = 2392, + TRST_MARK = 2393, + EXTALR_MARK = 2394, + SCL0_MARK = 2395, + SDA0_MARK = 2396, + SCL3_MARK = 2397, + SDA3_MARK = 2398, + SCL5_MARK = 2399, + SDA5_MARK = 2400, + PINMUX_MARK_END = 2401, +}; + +enum { + GP_LAST = 227, + PIN_ASEBRK = 228, + PIN_AVB_MDIO = 229, + PIN_AVB_RD0 = 230, + PIN_AVB_RD1 = 231, + PIN_AVB_RD2 = 232, + PIN_AVB_RD3 = 233, + PIN_AVB_RXC = 234, + PIN_AVB_RX_CTL = 235, + PIN_AVB_TD0 = 236, + PIN_AVB_TD1 = 237, + PIN_AVB_TD2 = 238, + PIN_AVB_TD3 = 239, + PIN_AVB_TXC = 240, + PIN_AVB_TXCREFCLK = 241, + PIN_AVB_TX_CTL = 242, + PIN_DU_DOTCLKIN0 = 243, + PIN_DU_DOTCLKIN1 = 244, + PIN_DU_DOTCLKIN2 = 245, + PIN_EXTALR = 246, + PIN_FSCLKST = 247, + PIN_MLB_REF = 248, + PIN_PRESETOUT_N = 249, + PIN_QSPI0_IO2 = 250, + PIN_QSPI0_IO3 = 251, + PIN_QSPI0_MISO_IO1 = 252, + PIN_QSPI0_MOSI_IO0 = 253, + PIN_QSPI0_SPCLK = 254, + PIN_QSPI0_SSL = 255, + PIN_QSPI1_IO2 = 256, + PIN_QSPI1_IO3 = 257, + PIN_QSPI1_MISO_IO1 = 258, + PIN_QSPI1_MOSI_IO0 = 259, + PIN_QSPI1_SPCLK = 260, + PIN_QSPI1_SSL = 261, + PIN_PRESET_N = 262, + PIN_RPC_INT_N = 263, + PIN_RPC_RESET_N = 264, + PIN_RPC_WP_N = 265, + PIN_TCK = 266, + PIN_TDI = 267, + PIN_TDO = 268, + PIN_TMS = 269, + PIN_TRST_N = 270, +}; + +enum ioctrl_regs { + POCCTRL = 0, + TDSELCTRL = 1, +}; + +enum { + PINMUX_RESERVED___2 = 0, + PINMUX_DATA_BEGIN___2 = 1, + GP_0_0_DATA___2 = 2, + GP_0_1_DATA___2 = 3, + GP_0_2_DATA___2 = 4, + GP_0_3_DATA___2 = 5, + GP_0_4_DATA___2 = 6, + GP_0_5_DATA___2 = 7, + GP_0_6_DATA___2 = 8, + GP_0_7_DATA___2 = 9, + GP_0_8_DATA___2 = 10, + GP_0_9_DATA___2 = 11, + GP_0_10_DATA___2 = 12, + GP_0_11_DATA___2 = 13, + GP_0_12_DATA___2 = 14, + GP_0_13_DATA___2 = 15, + GP_0_14_DATA___2 = 16, + GP_0_15_DATA___2 = 17, + GP_1_0_DATA___2 = 18, + GP_1_1_DATA___2 = 19, + GP_1_2_DATA___2 = 20, + GP_1_3_DATA___2 = 21, + GP_1_4_DATA___2 = 22, + GP_1_5_DATA___2 = 23, + GP_1_6_DATA___2 = 24, + GP_1_7_DATA___2 = 25, + GP_1_8_DATA___2 = 26, + GP_1_9_DATA___2 = 27, + GP_1_10_DATA___2 = 28, + GP_1_11_DATA___2 = 29, + GP_1_12_DATA___2 = 30, + GP_1_13_DATA___2 = 31, + GP_1_14_DATA___2 = 32, + GP_1_15_DATA___2 = 33, + GP_1_16_DATA___2 = 34, + GP_1_17_DATA___2 = 35, + GP_1_18_DATA___2 = 36, + GP_1_19_DATA___2 = 37, + GP_1_20_DATA___2 = 38, + GP_1_21_DATA___2 = 39, + GP_1_22_DATA___2 = 40, + GP_1_23_DATA___2 = 41, + GP_1_24_DATA___2 = 42, + GP_1_25_DATA___2 = 43, + GP_1_26_DATA___2 = 44, + GP_1_27_DATA___2 = 45, + GP_1_28_DATA___2 = 46, + GP_2_0_DATA___2 = 47, + GP_2_1_DATA___2 = 48, + GP_2_2_DATA___2 = 49, + GP_2_3_DATA___2 = 50, + GP_2_4_DATA___2 = 51, + GP_2_5_DATA___2 = 52, + GP_2_6_DATA___2 = 53, + GP_2_7_DATA___2 = 54, + GP_2_8_DATA___2 = 55, + GP_2_9_DATA___2 = 56, + GP_2_10_DATA___2 = 57, + GP_2_11_DATA___2 = 58, + GP_2_12_DATA___2 = 59, + GP_2_13_DATA___2 = 60, + GP_2_14_DATA___2 = 61, + GP_3_0_DATA___2 = 62, + GP_3_1_DATA___2 = 63, + GP_3_2_DATA___2 = 64, + GP_3_3_DATA___2 = 65, + GP_3_4_DATA___2 = 66, + GP_3_5_DATA___2 = 67, + GP_3_6_DATA___2 = 68, + GP_3_7_DATA___2 = 69, + GP_3_8_DATA___2 = 70, + GP_3_9_DATA___2 = 71, + GP_3_10_DATA___2 = 72, + GP_3_11_DATA___2 = 73, + GP_3_12_DATA___2 = 74, + GP_3_13_DATA___2 = 75, + GP_3_14_DATA___2 = 76, + GP_3_15_DATA___2 = 77, + GP_4_0_DATA___2 = 78, + GP_4_1_DATA___2 = 79, + GP_4_2_DATA___2 = 80, + GP_4_3_DATA___2 = 81, + GP_4_4_DATA___2 = 82, + GP_4_5_DATA___2 = 83, + GP_4_6_DATA___2 = 84, + GP_4_7_DATA___2 = 85, + GP_4_8_DATA___2 = 86, + GP_4_9_DATA___2 = 87, + GP_4_10_DATA___2 = 88, + GP_4_11_DATA___2 = 89, + GP_4_12_DATA___2 = 90, + GP_4_13_DATA___2 = 91, + GP_4_14_DATA___2 = 92, + GP_4_15_DATA___2 = 93, + GP_4_16_DATA___2 = 94, + GP_4_17_DATA___2 = 95, + GP_5_0_DATA___2 = 96, + GP_5_1_DATA___2 = 97, + GP_5_2_DATA___2 = 98, + GP_5_3_DATA___2 = 99, + GP_5_4_DATA___2 = 100, + GP_5_5_DATA___2 = 101, + GP_5_6_DATA___2 = 102, + GP_5_7_DATA___2 = 103, + GP_5_8_DATA___2 = 104, + GP_5_9_DATA___2 = 105, + GP_5_10_DATA___2 = 106, + GP_5_11_DATA___2 = 107, + GP_5_12_DATA___2 = 108, + GP_5_13_DATA___2 = 109, + GP_5_14_DATA___2 = 110, + GP_5_15_DATA___2 = 111, + GP_5_16_DATA___2 = 112, + GP_5_17_DATA___2 = 113, + GP_5_18_DATA___2 = 114, + GP_5_19_DATA___2 = 115, + GP_5_20_DATA___2 = 116, + GP_5_21_DATA___2 = 117, + GP_5_22_DATA___2 = 118, + GP_5_23_DATA___2 = 119, + GP_5_24_DATA___2 = 120, + GP_5_25_DATA___2 = 121, + GP_6_0_DATA___2 = 122, + GP_6_1_DATA___2 = 123, + GP_6_2_DATA___2 = 124, + GP_6_3_DATA___2 = 125, + GP_6_4_DATA___2 = 126, + GP_6_5_DATA___2 = 127, + GP_6_6_DATA___2 = 128, + GP_6_7_DATA___2 = 129, + GP_6_8_DATA___2 = 130, + GP_6_9_DATA___2 = 131, + GP_6_10_DATA___2 = 132, + GP_6_11_DATA___2 = 133, + GP_6_12_DATA___2 = 134, + GP_6_13_DATA___2 = 135, + GP_6_14_DATA___2 = 136, + GP_6_15_DATA___2 = 137, + GP_6_16_DATA___2 = 138, + GP_6_17_DATA___2 = 139, + GP_6_18_DATA___2 = 140, + GP_6_19_DATA___2 = 141, + GP_6_20_DATA___2 = 142, + GP_6_21_DATA___2 = 143, + GP_6_22_DATA___2 = 144, + GP_6_23_DATA___2 = 145, + GP_6_24_DATA___2 = 146, + GP_6_25_DATA___2 = 147, + GP_6_26_DATA___2 = 148, + GP_6_27_DATA___2 = 149, + GP_6_28_DATA___2 = 150, + GP_6_29_DATA___2 = 151, + GP_6_30_DATA___2 = 152, + GP_6_31_DATA___2 = 153, + GP_7_0_DATA___2 = 154, + GP_7_1_DATA___2 = 155, + GP_7_2_DATA___2 = 156, + GP_7_3_DATA___2 = 157, + PINMUX_DATA_END___2 = 158, + PINMUX_FUNCTION_BEGIN___2 = 159, + GP_0_0_FN___2 = 160, + GP_0_1_FN___2 = 161, + GP_0_2_FN___2 = 162, + GP_0_3_FN___2 = 163, + GP_0_4_FN___2 = 164, + GP_0_5_FN___2 = 165, + GP_0_6_FN___2 = 166, + GP_0_7_FN___2 = 167, + GP_0_8_FN___2 = 168, + GP_0_9_FN___2 = 169, + GP_0_10_FN___2 = 170, + GP_0_11_FN___2 = 171, + GP_0_12_FN___2 = 172, + GP_0_13_FN___2 = 173, + GP_0_14_FN___2 = 174, + GP_0_15_FN___2 = 175, + GP_1_0_FN___2 = 176, + GP_1_1_FN___2 = 177, + GP_1_2_FN___2 = 178, + GP_1_3_FN___2 = 179, + GP_1_4_FN___2 = 180, + GP_1_5_FN___2 = 181, + GP_1_6_FN___2 = 182, + GP_1_7_FN___2 = 183, + GP_1_8_FN___2 = 184, + GP_1_9_FN___2 = 185, + GP_1_10_FN___2 = 186, + GP_1_11_FN___2 = 187, + GP_1_12_FN___2 = 188, + GP_1_13_FN___2 = 189, + GP_1_14_FN___2 = 190, + GP_1_15_FN___2 = 191, + GP_1_16_FN___2 = 192, + GP_1_17_FN___2 = 193, + GP_1_18_FN___2 = 194, + GP_1_19_FN___2 = 195, + GP_1_20_FN___2 = 196, + GP_1_21_FN___2 = 197, + GP_1_22_FN___2 = 198, + GP_1_23_FN___2 = 199, + GP_1_24_FN___2 = 200, + GP_1_25_FN___2 = 201, + GP_1_26_FN___2 = 202, + GP_1_27_FN___2 = 203, + GP_1_28_FN___2 = 204, + GP_2_0_FN___2 = 205, + GP_2_1_FN___2 = 206, + GP_2_2_FN___2 = 207, + GP_2_3_FN___2 = 208, + GP_2_4_FN___2 = 209, + GP_2_5_FN___2 = 210, + GP_2_6_FN___2 = 211, + GP_2_7_FN___2 = 212, + GP_2_8_FN___2 = 213, + GP_2_9_FN___2 = 214, + GP_2_10_FN___2 = 215, + GP_2_11_FN___2 = 216, + GP_2_12_FN___2 = 217, + GP_2_13_FN___2 = 218, + GP_2_14_FN___2 = 219, + GP_3_0_FN___2 = 220, + GP_3_1_FN___2 = 221, + GP_3_2_FN___2 = 222, + GP_3_3_FN___2 = 223, + GP_3_4_FN___2 = 224, + GP_3_5_FN___2 = 225, + GP_3_6_FN___2 = 226, + GP_3_7_FN___2 = 227, + GP_3_8_FN___2 = 228, + GP_3_9_FN___2 = 229, + GP_3_10_FN___2 = 230, + GP_3_11_FN___2 = 231, + GP_3_12_FN___2 = 232, + GP_3_13_FN___2 = 233, + GP_3_14_FN___2 = 234, + GP_3_15_FN___2 = 235, + GP_4_0_FN___2 = 236, + GP_4_1_FN___2 = 237, + GP_4_2_FN___2 = 238, + GP_4_3_FN___2 = 239, + GP_4_4_FN___2 = 240, + GP_4_5_FN___2 = 241, + GP_4_6_FN___2 = 242, + GP_4_7_FN___2 = 243, + GP_4_8_FN___2 = 244, + GP_4_9_FN___2 = 245, + GP_4_10_FN___2 = 246, + GP_4_11_FN___2 = 247, + GP_4_12_FN___2 = 248, + GP_4_13_FN___2 = 249, + GP_4_14_FN___2 = 250, + GP_4_15_FN___2 = 251, + GP_4_16_FN___2 = 252, + GP_4_17_FN___2 = 253, + GP_5_0_FN___2 = 254, + GP_5_1_FN___2 = 255, + GP_5_2_FN___2 = 256, + GP_5_3_FN___2 = 257, + GP_5_4_FN___2 = 258, + GP_5_5_FN___2 = 259, + GP_5_6_FN___2 = 260, + GP_5_7_FN___2 = 261, + GP_5_8_FN___2 = 262, + GP_5_9_FN___2 = 263, + GP_5_10_FN___2 = 264, + GP_5_11_FN___2 = 265, + GP_5_12_FN___2 = 266, + GP_5_13_FN___2 = 267, + GP_5_14_FN___2 = 268, + GP_5_15_FN___2 = 269, + GP_5_16_FN___2 = 270, + GP_5_17_FN___2 = 271, + GP_5_18_FN___2 = 272, + GP_5_19_FN___2 = 273, + GP_5_20_FN___2 = 274, + GP_5_21_FN___2 = 275, + GP_5_22_FN___2 = 276, + GP_5_23_FN___2 = 277, + GP_5_24_FN___2 = 278, + GP_5_25_FN___2 = 279, + GP_6_0_FN___2 = 280, + GP_6_1_FN___2 = 281, + GP_6_2_FN___2 = 282, + GP_6_3_FN___2 = 283, + GP_6_4_FN___2 = 284, + GP_6_5_FN___2 = 285, + GP_6_6_FN___2 = 286, + GP_6_7_FN___2 = 287, + GP_6_8_FN___2 = 288, + GP_6_9_FN___2 = 289, + GP_6_10_FN___2 = 290, + GP_6_11_FN___2 = 291, + GP_6_12_FN___2 = 292, + GP_6_13_FN___2 = 293, + GP_6_14_FN___2 = 294, + GP_6_15_FN___2 = 295, + GP_6_16_FN___2 = 296, + GP_6_17_FN___2 = 297, + GP_6_18_FN___2 = 298, + GP_6_19_FN___2 = 299, + GP_6_20_FN___2 = 300, + GP_6_21_FN___2 = 301, + GP_6_22_FN___2 = 302, + GP_6_23_FN___2 = 303, + GP_6_24_FN___2 = 304, + GP_6_25_FN___2 = 305, + GP_6_26_FN___2 = 306, + GP_6_27_FN___2 = 307, + GP_6_28_FN___2 = 308, + GP_6_29_FN___2 = 309, + GP_6_30_FN___2 = 310, + GP_6_31_FN___2 = 311, + GP_7_0_FN___2 = 312, + GP_7_1_FN___2 = 313, + GP_7_2_FN___2 = 314, + GP_7_3_FN___2 = 315, + FN_CLKOUT___2 = 316, + FN_MSIOF0_RXD___2 = 317, + FN_MSIOF0_TXD___2 = 318, + FN_MSIOF0_SCK___2 = 319, + FN_SSI_SDATA5___2 = 320, + FN_SSI_WS5___2 = 321, + FN_SSI_SCK5___2 = 322, + FN_GP7_03___2 = 323, + FN_GP7_02___2 = 324, + FN_AVS2___2 = 325, + FN_AVS1___2 = 326, + FN_IP0_3_0___2 = 327, + FN_AVB_MDC___2 = 328, + FN_MSIOF2_SS2_C___2 = 329, + FN_IP1_3_0___2 = 330, + FN_IRQ2___2 = 331, + FN_QCPV_QDE___2 = 332, + FN_DU_EXODDF_DU_ODDF_DISP_CDE___2 = 333, + FN_VI4_DATA2_B___2 = 334, + FN_MSIOF3_SYNC_E___2 = 335, + FN_PWM3_B___2 = 336, + FN_IP2_3_0___2 = 337, + FN_A1___2 = 338, + FN_LCDOUT17___2 = 339, + FN_MSIOF3_TXD_B___2 = 340, + FN_VI4_DATA9___2 = 341, + FN_DU_DB1___2 = 342, + FN_PWM4_A___2 = 343, + FN_IP3_3_0___2 = 344, + FN_A9___2 = 345, + FN_MSIOF2_SCK_A___2 = 346, + FN_CTS4_N_B___2 = 347, + FN_VI5_VSYNC_N___2 = 348, + FN_IP0_7_4___2 = 349, + FN_AVB_MAGIC___2 = 350, + FN_MSIOF2_SS1_C___2 = 351, + FN_SCK4_A___2 = 352, + FN_IP1_7_4___2 = 353, + FN_IRQ3___2 = 354, + FN_QSTVB_QVE___2 = 355, + FN_DU_DOTCLKOUT1___2 = 356, + FN_VI4_DATA3_B___2 = 357, + FN_MSIOF3_SCK_E___2 = 358, + FN_PWM4_B___2 = 359, + FN_IP2_7_4___2 = 360, + FN_A2___2 = 361, + FN_LCDOUT18___2 = 362, + FN_MSIOF3_SCK_B___2 = 363, + FN_VI4_DATA10___2 = 364, + FN_DU_DB2___2 = 365, + FN_PWM5_A___2 = 366, + FN_IP3_7_4___2 = 367, + FN_A10___2 = 368, + FN_MSIOF2_RXD_A___2 = 369, + FN_RTS4_N_B___2 = 370, + FN_VI5_HSYNC_N___2 = 371, + FN_IP0_11_8___2 = 372, + FN_AVB_PHY_INT___2 = 373, + FN_MSIOF2_SYNC_C___2 = 374, + FN_RX4_A___2 = 375, + FN_IP1_11_8___2 = 376, + FN_IRQ4___2 = 377, + FN_QSTH_QHS___2 = 378, + FN_DU_EXHSYNC_DU_HSYNC___2 = 379, + FN_VI4_DATA4_B___2 = 380, + FN_MSIOF3_RXD_E___2 = 381, + FN_PWM5_B___2 = 382, + FN_IP2_11_8___2 = 383, + FN_A3___2 = 384, + FN_LCDOUT19___2 = 385, + FN_MSIOF3_RXD_B___2 = 386, + FN_VI4_DATA11___2 = 387, + FN_DU_DB3___2 = 388, + FN_PWM6_A___2 = 389, + FN_IP3_11_8___2 = 390, + FN_A11___2 = 391, + FN_TX3_B___2 = 392, + FN_MSIOF2_TXD_A___2 = 393, + FN_HTX4_B___2 = 394, + FN_HSCK4___2 = 395, + FN_VI5_FIELD___2 = 396, + FN_SCL6_A___2 = 397, + FN_AVB_AVTP_CAPTURE_B___2 = 398, + FN_PWM2_B___2 = 399, + FN_IP0_15_12___2 = 400, + FN_AVB_LINK___2 = 401, + FN_MSIOF2_SCK_C___2 = 402, + FN_TX4_A___2 = 403, + FN_IP1_15_12___2 = 404, + FN_IRQ5___2 = 405, + FN_QSTB_QHE___2 = 406, + FN_DU_EXVSYNC_DU_VSYNC___2 = 407, + FN_VI4_DATA5_B___2 = 408, + FN_FSCLKST2_N_B = 409, + FN_MSIOF3_TXD_E___2 = 410, + FN_PWM6_B___2 = 411, + FN_IP2_15_12___2 = 412, + FN_A4___2 = 413, + FN_LCDOUT20___2 = 414, + FN_MSIOF3_SS1_B___2 = 415, + FN_VI4_DATA12___2 = 416, + FN_VI5_DATA12___2 = 417, + FN_DU_DB4___2 = 418, + FN_IP3_15_12___2 = 419, + FN_A12___2 = 420, + FN_LCDOUT12___2 = 421, + FN_MSIOF3_SCK_C___2 = 422, + FN_HRX4_A___2 = 423, + FN_VI5_DATA8___2 = 424, + FN_DU_DG4___2 = 425, + FN_IP0_19_16___2 = 426, + FN_AVB_AVTP_MATCH_A___2 = 427, + FN_MSIOF2_RXD_C___2 = 428, + FN_CTS4_N_A___2 = 429, + FN_FSCLKST2_N_A = 430, + FN_IP1_19_16___2 = 431, + FN_PWM0___2 = 432, + FN_AVB_AVTP_PPS___2 = 433, + FN_VI4_DATA6_B___2 = 434, + FN_IECLK_B___2 = 435, + FN_IP2_19_16___2 = 436, + FN_A5___2 = 437, + FN_LCDOUT21___2 = 438, + FN_MSIOF3_SS2_B___2 = 439, + FN_SCK4_B___2 = 440, + FN_VI4_DATA13___2 = 441, + FN_VI5_DATA13___2 = 442, + FN_DU_DB5___2 = 443, + FN_IP3_19_16___2 = 444, + FN_A13___2 = 445, + FN_LCDOUT13___2 = 446, + FN_MSIOF3_SYNC_C___2 = 447, + FN_HTX4_A___2 = 448, + FN_VI5_DATA9___2 = 449, + FN_DU_DG5___2 = 450, + FN_IP0_23_20___2 = 451, + FN_AVB_AVTP_CAPTURE_A___2 = 452, + FN_MSIOF2_TXD_C___2 = 453, + FN_RTS4_N_A___2 = 454, + FN_IP1_23_20___2 = 455, + FN_PWM1_A___2 = 456, + FN_HRX3_D___2 = 457, + FN_VI4_DATA7_B___2 = 458, + FN_IERX_B___2 = 459, + FN_IP2_23_20___2 = 460, + FN_A6___2 = 461, + FN_LCDOUT22___2 = 462, + FN_MSIOF2_SS1_A___2 = 463, + FN_RX4_B___2 = 464, + FN_VI4_DATA14___2 = 465, + FN_VI5_DATA14___2 = 466, + FN_DU_DB6___2 = 467, + FN_IP3_23_20___2 = 468, + FN_A14___2 = 469, + FN_LCDOUT14___2 = 470, + FN_MSIOF3_RXD_C___2 = 471, + FN_HCTS4_N___2 = 472, + FN_VI5_DATA10___2 = 473, + FN_DU_DG6___2 = 474, + FN_IP0_27_24___2 = 475, + FN_IRQ0___2 = 476, + FN_QPOLB___2 = 477, + FN_DU_CDE___2 = 478, + FN_VI4_DATA0_B___2 = 479, + FN_CAN0_TX_B___2 = 480, + FN_CANFD0_TX_B___2 = 481, + FN_MSIOF3_SS2_E___2 = 482, + FN_IP1_27_24___2 = 483, + FN_PWM2_A___2 = 484, + FN_HTX3_D___2 = 485, + FN_IETX_B___2 = 486, + FN_IP2_27_24___2 = 487, + FN_A7___2 = 488, + FN_LCDOUT23___2 = 489, + FN_MSIOF2_SS2_A___2 = 490, + FN_TX4_B___2 = 491, + FN_VI4_DATA15___2 = 492, + FN_VI5_DATA15___2 = 493, + FN_DU_DB7___2 = 494, + FN_IP3_27_24___2 = 495, + FN_A15___2 = 496, + FN_LCDOUT15___2 = 497, + FN_MSIOF3_TXD_C___2 = 498, + FN_HRTS4_N___2 = 499, + FN_VI5_DATA11___2 = 500, + FN_DU_DG7___2 = 501, + FN_IP0_31_28___2 = 502, + FN_IRQ1___2 = 503, + FN_QPOLA___2 = 504, + FN_DU_DISP___2 = 505, + FN_VI4_DATA1_B___2 = 506, + FN_CAN0_RX_B___2 = 507, + FN_CANFD0_RX_B___2 = 508, + FN_MSIOF3_SS1_E___2 = 509, + FN_IP1_31_28___2 = 510, + FN_A0___2 = 511, + FN_LCDOUT16___2 = 512, + FN_MSIOF3_SYNC_B___2 = 513, + FN_VI4_DATA8___2 = 514, + FN_DU_DB0___2 = 515, + FN_PWM3_A___2 = 516, + FN_IP2_31_28___2 = 517, + FN_A8___2 = 518, + FN_RX3_B___2 = 519, + FN_MSIOF2_SYNC_A___2 = 520, + FN_HRX4_B___2 = 521, + FN_SDA6_A___2 = 522, + FN_AVB_AVTP_MATCH_B___2 = 523, + FN_PWM1_B___2 = 524, + FN_IP3_31_28___2 = 525, + FN_A16___2 = 526, + FN_LCDOUT8___2 = 527, + FN_VI4_FIELD___2 = 528, + FN_DU_DG0___2 = 529, + FN_IP4_3_0___2 = 530, + FN_A17___2 = 531, + FN_LCDOUT9___2 = 532, + FN_VI4_VSYNC_N___2 = 533, + FN_DU_DG1___2 = 534, + FN_IP5_3_0___2 = 535, + FN_WE0_N___2 = 536, + FN_MSIOF3_TXD_D___2 = 537, + FN_CTS3_N___2 = 538, + FN_HCTS3_N___2 = 539, + FN_SCL6_B___2 = 540, + FN_CAN_CLK___2 = 541, + FN_IECLK_A___2 = 542, + FN_IP6_3_0___2 = 543, + FN_D5___2 = 544, + FN_MSIOF2_SYNC_B___2 = 545, + FN_VI4_DATA21___2 = 546, + FN_VI5_DATA5___2 = 547, + FN_IP7_3_0___2 = 548, + FN_D13___2 = 549, + FN_LCDOUT5___2 = 550, + FN_MSIOF2_SS2_D___2 = 551, + FN_TX4_C___2 = 552, + FN_VI4_DATA5_A___2 = 553, + FN_DU_DR5___2 = 554, + FN_IP4_7_4___2 = 555, + FN_A18___2 = 556, + FN_LCDOUT10___2 = 557, + FN_VI4_HSYNC_N___2 = 558, + FN_DU_DG2___2 = 559, + FN_IP5_7_4___2 = 560, + FN_WE1_N___2 = 561, + FN_MSIOF3_SS1_D___2 = 562, + FN_RTS3_N___2 = 563, + FN_HRTS3_N___2 = 564, + FN_SDA6_B___2 = 565, + FN_CAN1_RX___2 = 566, + FN_CANFD1_RX___2 = 567, + FN_IERX_A___2 = 568, + FN_IP6_7_4___2 = 569, + FN_D6___2 = 570, + FN_MSIOF2_RXD_B___2 = 571, + FN_VI4_DATA22___2 = 572, + FN_VI5_DATA6___2 = 573, + FN_IP7_7_4___2 = 574, + FN_D14___2 = 575, + FN_LCDOUT6___2 = 576, + FN_MSIOF3_SS1_A___2 = 577, + FN_HRX3_C___2 = 578, + FN_VI4_DATA6_A___2 = 579, + FN_DU_DR6___2 = 580, + FN_SCL6_C___2 = 581, + FN_IP4_11_8___2 = 582, + FN_A19___2 = 583, + FN_LCDOUT11___2 = 584, + FN_VI4_CLKENB___2 = 585, + FN_DU_DG3___2 = 586, + FN_IP5_11_8___2 = 587, + FN_EX_WAIT0_A___2 = 588, + FN_QCLK___2 = 589, + FN_VI4_CLK___2 = 590, + FN_DU_DOTCLKOUT0___2 = 591, + FN_IP6_11_8___2 = 592, + FN_D7___2 = 593, + FN_MSIOF2_TXD_B___2 = 594, + FN_VI4_DATA23___2 = 595, + FN_VI5_DATA7___2 = 596, + FN_IP7_11_8___2 = 597, + FN_D15___2 = 598, + FN_LCDOUT7___2 = 599, + FN_MSIOF3_SS2_A___2 = 600, + FN_HTX3_C___2 = 601, + FN_VI4_DATA7_A___2 = 602, + FN_DU_DR7___2 = 603, + FN_SDA6_C___2 = 604, + FN_IP4_15_12___2 = 605, + FN_CS0_N___2 = 606, + FN_VI5_CLKENB___2 = 607, + FN_IP5_15_12___2 = 608, + FN_D0___2 = 609, + FN_MSIOF2_SS1_B___2 = 610, + FN_MSIOF3_SCK_A___2 = 611, + FN_VI4_DATA16___2 = 612, + FN_VI5_DATA0___2 = 613, + FN_IP6_15_12___2 = 614, + FN_D8___2 = 615, + FN_LCDOUT0___2 = 616, + FN_MSIOF2_SCK_D___2 = 617, + FN_SCK4_C___2 = 618, + FN_VI4_DATA0_A___2 = 619, + FN_DU_DR0___2 = 620, + FN_IP4_19_16___2 = 621, + FN_CS1_N___2 = 622, + FN_VI5_CLK___2 = 623, + FN_EX_WAIT0_B___2 = 624, + FN_IP5_19_16___2 = 625, + FN_D1___2 = 626, + FN_MSIOF2_SS2_B___2 = 627, + FN_MSIOF3_SYNC_A___2 = 628, + FN_VI4_DATA17___2 = 629, + FN_VI5_DATA1___2 = 630, + FN_IP6_19_16___2 = 631, + FN_D9___2 = 632, + FN_LCDOUT1___2 = 633, + FN_MSIOF2_SYNC_D___2 = 634, + FN_VI4_DATA1_A___2 = 635, + FN_DU_DR1___2 = 636, + FN_IP7_19_16___2 = 637, + FN_SD0_CLK___2 = 638, + FN_MSIOF1_SCK_E___2 = 639, + FN_STP_OPWM_0_B___2 = 640, + FN_IP4_23_20___2 = 641, + FN_BS_N___2 = 642, + FN_QSTVA_QVS___2 = 643, + FN_MSIOF3_SCK_D___2 = 644, + FN_SCK3___2 = 645, + FN_HSCK3___2 = 646, + FN_CAN1_TX___2 = 647, + FN_CANFD1_TX___2 = 648, + FN_IETX_A___2 = 649, + FN_IP5_23_20___2 = 650, + FN_D2___2 = 651, + FN_MSIOF3_RXD_A___2 = 652, + FN_VI4_DATA18___2 = 653, + FN_VI5_DATA2___2 = 654, + FN_IP6_23_20___2 = 655, + FN_D10___2 = 656, + FN_LCDOUT2___2 = 657, + FN_MSIOF2_RXD_D___2 = 658, + FN_HRX3_B___2 = 659, + FN_VI4_DATA2_A___2 = 660, + FN_CTS4_N_C___2 = 661, + FN_DU_DR2___2 = 662, + FN_IP7_23_20___2 = 663, + FN_SD0_CMD___2 = 664, + FN_MSIOF1_SYNC_E___2 = 665, + FN_STP_IVCXO27_0_B___2 = 666, + FN_IP4_27_24___2 = 667, + FN_RD_N___2 = 668, + FN_MSIOF3_SYNC_D___2 = 669, + FN_RX3_A___2 = 670, + FN_HRX3_A___2 = 671, + FN_CAN0_TX_A___2 = 672, + FN_CANFD0_TX_A___2 = 673, + FN_IP5_27_24___2 = 674, + FN_D3___2 = 675, + FN_MSIOF3_TXD_A___2 = 676, + FN_VI4_DATA19___2 = 677, + FN_VI5_DATA3___2 = 678, + FN_IP6_27_24___2 = 679, + FN_D11___2 = 680, + FN_LCDOUT3___2 = 681, + FN_MSIOF2_TXD_D___2 = 682, + FN_HTX3_B___2 = 683, + FN_VI4_DATA3_A___2 = 684, + FN_RTS4_N_C___2 = 685, + FN_DU_DR3___2 = 686, + FN_IP7_27_24___2 = 687, + FN_SD0_DAT0___2 = 688, + FN_MSIOF1_RXD_E___2 = 689, + FN_TS_SCK0_B___2 = 690, + FN_STP_ISCLK_0_B___2 = 691, + FN_IP4_31_28___2 = 692, + FN_RD_WR_N___2 = 693, + FN_MSIOF3_RXD_D___2 = 694, + FN_TX3_A___2 = 695, + FN_HTX3_A___2 = 696, + FN_CAN0_RX_A___2 = 697, + FN_CANFD0_RX_A___2 = 698, + FN_IP5_31_28___2 = 699, + FN_D4___2 = 700, + FN_MSIOF2_SCK_B___2 = 701, + FN_VI4_DATA20___2 = 702, + FN_VI5_DATA4___2 = 703, + FN_IP6_31_28___2 = 704, + FN_D12___2 = 705, + FN_LCDOUT4___2 = 706, + FN_MSIOF2_SS1_D___2 = 707, + FN_RX4_C___2 = 708, + FN_VI4_DATA4_A___2 = 709, + FN_DU_DR4___2 = 710, + FN_IP7_31_28___2 = 711, + FN_SD0_DAT1___2 = 712, + FN_MSIOF1_TXD_E___2 = 713, + FN_TS_SPSYNC0_B___2 = 714, + FN_STP_ISSYNC_0_B___2 = 715, + FN_IP8_3_0___2 = 716, + FN_SD0_DAT2___2 = 717, + FN_MSIOF1_SS1_E___2 = 718, + FN_TS_SDAT0_B___2 = 719, + FN_STP_ISD_0_B___2 = 720, + FN_IP9_3_0___2 = 721, + FN_SD2_CLK___2 = 722, + FN_NFDATA8___2 = 723, + FN_IP10_3_0___2 = 724, + FN_SD3_CMD___2 = 725, + FN_NFRE_N___2 = 726, + FN_IP11_3_0___2 = 727, + FN_SD3_DAT7___2 = 728, + FN_SD3_WP___2 = 729, + FN_NFDATA7___2 = 730, + FN_IP8_7_4___2 = 731, + FN_SD0_DAT3___2 = 732, + FN_MSIOF1_SS2_E___2 = 733, + FN_TS_SDEN0_B___2 = 734, + FN_STP_ISEN_0_B___2 = 735, + FN_IP9_7_4___2 = 736, + FN_SD2_CMD___2 = 737, + FN_NFDATA9___2 = 738, + FN_IP10_7_4___2 = 739, + FN_SD3_DAT0___2 = 740, + FN_NFDATA0___2 = 741, + FN_IP11_7_4___2 = 742, + FN_SD3_DS___2 = 743, + FN_NFCLE___2 = 744, + FN_IP8_11_8___2 = 745, + FN_SD1_CLK___2 = 746, + FN_MSIOF1_SCK_G___2 = 747, + FN_SIM0_CLK_A___2 = 748, + FN_IP9_11_8___2 = 749, + FN_SD2_DAT0___2 = 750, + FN_NFDATA10___2 = 751, + FN_IP10_11_8___2 = 752, + FN_SD3_DAT1___2 = 753, + FN_NFDATA1___2 = 754, + FN_IP11_11_8___2 = 755, + FN_SD0_CD___2 = 756, + FN_NFDATA14_A___2 = 757, + FN_SCL2_B___2 = 758, + FN_SIM0_RST_A___2 = 759, + FN_IP8_15_12___2 = 760, + FN_SD1_CMD___2 = 761, + FN_MSIOF1_SYNC_G___2 = 762, + FN_NFCE_N_B___2 = 763, + FN_SIM0_D_A___2 = 764, + FN_STP_IVCXO27_1_B___2 = 765, + FN_IP9_15_12___2 = 766, + FN_SD2_DAT1___2 = 767, + FN_NFDATA11___2 = 768, + FN_IP10_15_12___2 = 769, + FN_SD3_DAT2___2 = 770, + FN_NFDATA2___2 = 771, + FN_IP11_15_12___2 = 772, + FN_SD0_WP___2 = 773, + FN_NFDATA15_A___2 = 774, + FN_SDA2_B___2 = 775, + FN_IP8_19_16___2 = 776, + FN_SD1_DAT0___2 = 777, + FN_SD2_DAT4___2 = 778, + FN_MSIOF1_RXD_G___2 = 779, + FN_NFWP_N_B___2 = 780, + FN_TS_SCK1_B___2 = 781, + FN_STP_ISCLK_1_B___2 = 782, + FN_IP9_19_16___2 = 783, + FN_SD2_DAT2___2 = 784, + FN_NFDATA12___2 = 785, + FN_IP10_19_16___2 = 786, + FN_SD3_DAT3___2 = 787, + FN_NFDATA3___2 = 788, + FN_IP11_19_16___2 = 789, + FN_SD1_CD___2 = 790, + FN_NFRB_N_A___2 = 791, + FN_SIM0_CLK_B___2 = 792, + FN_IP8_23_20___2 = 793, + FN_SD1_DAT1___2 = 794, + FN_SD2_DAT5___2 = 795, + FN_MSIOF1_TXD_G___2 = 796, + FN_NFDATA14_B___2 = 797, + FN_TS_SPSYNC1_B___2 = 798, + FN_STP_ISSYNC_1_B___2 = 799, + FN_IP9_23_20___2 = 800, + FN_SD2_DAT3___2 = 801, + FN_NFDATA13___2 = 802, + FN_IP10_23_20___2 = 803, + FN_SD3_DAT4___2 = 804, + FN_SD2_CD_A___2 = 805, + FN_NFDATA4___2 = 806, + FN_IP11_23_20___2 = 807, + FN_SD1_WP___2 = 808, + FN_NFCE_N_A___2 = 809, + FN_SIM0_D_B___2 = 810, + FN_IP8_27_24___2 = 811, + FN_SD1_DAT2___2 = 812, + FN_SD2_DAT6___2 = 813, + FN_MSIOF1_SS1_G___2 = 814, + FN_NFDATA15_B___2 = 815, + FN_TS_SDAT1_B___2 = 816, + FN_STP_ISD_1_B___2 = 817, + FN_IP9_27_24___2 = 818, + FN_SD2_DS___2 = 819, + FN_NFALE___2 = 820, + FN_SATA_DEVSLP_B = 821, + FN_IP10_27_24___2 = 822, + FN_SD3_DAT5___2 = 823, + FN_SD2_WP_A___2 = 824, + FN_NFDATA5___2 = 825, + FN_IP11_27_24___2 = 826, + FN_SCK0___2 = 827, + FN_HSCK1_B___2 = 828, + FN_MSIOF1_SS2_B___2 = 829, + FN_AUDIO_CLKC_B___2 = 830, + FN_SDA2_A___2 = 831, + FN_SIM0_RST_B___2 = 832, + FN_STP_OPWM_0_C___2 = 833, + FN_RIF0_CLK_B___2 = 834, + FN_ADICHS2___2 = 835, + FN_SCK5_B___2 = 836, + FN_IP8_31_28___2 = 837, + FN_SD1_DAT3___2 = 838, + FN_SD2_DAT7___2 = 839, + FN_MSIOF1_SS2_G___2 = 840, + FN_NFRB_N_B___2 = 841, + FN_TS_SDEN1_B___2 = 842, + FN_STP_ISEN_1_B___2 = 843, + FN_IP9_31_28___2 = 844, + FN_SD3_CLK___2 = 845, + FN_NFWE_N___2 = 846, + FN_IP10_31_28___2 = 847, + FN_SD3_DAT6___2 = 848, + FN_SD3_CD___2 = 849, + FN_NFDATA6___2 = 850, + FN_IP11_31_28___2 = 851, + FN_RX0___2 = 852, + FN_HRX1_B___2 = 853, + FN_TS_SCK0_C___2 = 854, + FN_STP_ISCLK_0_C___2 = 855, + FN_RIF0_D0_B___2 = 856, + FN_IP12_3_0___2 = 857, + FN_TX0___2 = 858, + FN_HTX1_B___2 = 859, + FN_TS_SPSYNC0_C___2 = 860, + FN_STP_ISSYNC_0_C___2 = 861, + FN_RIF0_D1_B___2 = 862, + FN_IP13_3_0___2 = 863, + FN_TX2_A___2 = 864, + FN_SD2_CD_B___2 = 865, + FN_SCL1_A___2 = 866, + FN_FMCLK_A___2 = 867, + FN_RIF1_D1_C___2 = 868, + FN_FSO_CFE_0_N___2 = 869, + FN_IP14_3_0___2 = 870, + FN_MSIOF0_SS1___2 = 871, + FN_RX5_A___2 = 872, + FN_NFWP_N_A___2 = 873, + FN_AUDIO_CLKA_C___2 = 874, + FN_SSI_SCK2_A___2 = 875, + FN_STP_IVCXO27_0_C___2 = 876, + FN_AUDIO_CLKOUT3_A___2 = 877, + FN_TCLK1_B___2 = 878, + FN_IP15_3_0___2 = 879, + FN_SSI_SDATA1_A___2 = 880, + FN_IP12_7_4___2 = 881, + FN_CTS0_N___2 = 882, + FN_HCTS1_N_B___2 = 883, + FN_MSIOF1_SYNC_B___2 = 884, + FN_TS_SPSYNC1_C___2 = 885, + FN_STP_ISSYNC_1_C___2 = 886, + FN_RIF1_SYNC_B___2 = 887, + FN_AUDIO_CLKOUT_C___2 = 888, + FN_ADICS_SAMP___2 = 889, + FN_IP13_7_4___2 = 890, + FN_RX2_A___2 = 891, + FN_SD2_WP_B___2 = 892, + FN_SDA1_A___2 = 893, + FN_FMIN_A___2 = 894, + FN_RIF1_SYNC_C___2 = 895, + FN_FSO_CFE_1_N___2 = 896, + FN_IP14_7_4___2 = 897, + FN_MSIOF0_SS2___2 = 898, + FN_TX5_A___2 = 899, + FN_MSIOF1_SS2_D___2 = 900, + FN_AUDIO_CLKC_A___2 = 901, + FN_SSI_WS2_A___2 = 902, + FN_STP_OPWM_0_D___2 = 903, + FN_AUDIO_CLKOUT_D___2 = 904, + FN_SPEEDIN_B___2 = 905, + FN_IP15_7_4___2 = 906, + FN_SSI_SDATA2_A___2 = 907, + FN_SSI_SCK1_B___2 = 908, + FN_IP12_11_8___2 = 909, + FN_RTS0_N___2 = 910, + FN_HRTS1_N_B___2 = 911, + FN_MSIOF1_SS1_B___2 = 912, + FN_AUDIO_CLKA_B___2 = 913, + FN_SCL2_A___2 = 914, + FN_STP_IVCXO27_1_C___2 = 915, + FN_RIF0_SYNC_B___2 = 916, + FN_ADICHS1___2 = 917, + FN_IP13_11_8___2 = 918, + FN_HSCK0___2 = 919, + FN_MSIOF1_SCK_D___2 = 920, + FN_AUDIO_CLKB_A___2 = 921, + FN_SSI_SDATA1_B___2 = 922, + FN_TS_SCK0_D___2 = 923, + FN_STP_ISCLK_0_D___2 = 924, + FN_RIF0_CLK_C___2 = 925, + FN_RX5_B___2 = 926, + FN_IP14_11_8___2 = 927, + FN_MLB_CLK___2 = 928, + FN_MSIOF1_SCK_F___2 = 929, + FN_SCL1_B___2 = 930, + FN_IP15_11_8___2 = 931, + FN_SSI_SCK349___2 = 932, + FN_MSIOF1_SS1_A___2 = 933, + FN_STP_OPWM_0_A___2 = 934, + FN_IP12_15_12___2 = 935, + FN_RX1_A___2 = 936, + FN_HRX1_A___2 = 937, + FN_TS_SDAT0_C___2 = 938, + FN_STP_ISD_0_C___2 = 939, + FN_RIF1_CLK_C___2 = 940, + FN_IP13_15_12___2 = 941, + FN_HRX0___2 = 942, + FN_MSIOF1_RXD_D___2 = 943, + FN_SSI_SDATA2_B___2 = 944, + FN_TS_SDEN0_D___2 = 945, + FN_STP_ISEN_0_D___2 = 946, + FN_RIF0_D0_C___2 = 947, + FN_IP14_15_12___2 = 948, + FN_MLB_SIG___2 = 949, + FN_RX1_B___2 = 950, + FN_MSIOF1_SYNC_F___2 = 951, + FN_SDA1_B___2 = 952, + FN_IP15_15_12___2 = 953, + FN_SSI_WS349___2 = 954, + FN_HCTS2_N_A___2 = 955, + FN_MSIOF1_SS2_A___2 = 956, + FN_STP_IVCXO27_0_A___2 = 957, + FN_IP12_19_16___2 = 958, + FN_TX1_A___2 = 959, + FN_HTX1_A___2 = 960, + FN_TS_SDEN0_C___2 = 961, + FN_STP_ISEN_0_C___2 = 962, + FN_RIF1_D0_C___2 = 963, + FN_IP13_19_16___2 = 964, + FN_HTX0___2 = 965, + FN_MSIOF1_TXD_D___2 = 966, + FN_SSI_SDATA9_B___2 = 967, + FN_TS_SDAT0_D___2 = 968, + FN_STP_ISD_0_D___2 = 969, + FN_RIF0_D1_C___2 = 970, + FN_IP14_19_16___2 = 971, + FN_MLB_DAT___2 = 972, + FN_TX1_B___2 = 973, + FN_MSIOF1_RXD_F___2 = 974, + FN_IP15_19_16___2 = 975, + FN_SSI_SDATA3___2 = 976, + FN_HRTS2_N_A___2 = 977, + FN_MSIOF1_TXD_A___2 = 978, + FN_TS_SCK0_A___2 = 979, + FN_STP_ISCLK_0_A___2 = 980, + FN_RIF0_D1_A___2 = 981, + FN_RIF2_D0_A___2 = 982, + FN_IP12_23_20___2 = 983, + FN_CTS1_N___2 = 984, + FN_HCTS1_N_A___2 = 985, + FN_MSIOF1_RXD_B___2 = 986, + FN_TS_SDEN1_C___2 = 987, + FN_STP_ISEN_1_C___2 = 988, + FN_RIF1_D0_B___2 = 989, + FN_ADIDATA___2 = 990, + FN_IP13_23_20___2 = 991, + FN_HCTS0_N___2 = 992, + FN_RX2_B___2 = 993, + FN_MSIOF1_SYNC_D___2 = 994, + FN_SSI_SCK9_A___2 = 995, + FN_TS_SPSYNC0_D___2 = 996, + FN_STP_ISSYNC_0_D___2 = 997, + FN_RIF0_SYNC_C___2 = 998, + FN_AUDIO_CLKOUT1_A___2 = 999, + FN_IP14_23_20___2 = 1000, + FN_SSI_SCK01239___2 = 1001, + FN_MSIOF1_TXD_F___2 = 1002, + FN_IP15_23_20___2 = 1003, + FN_SSI_SCK4___2 = 1004, + FN_HRX2_A___2 = 1005, + FN_MSIOF1_SCK_A___2 = 1006, + FN_TS_SDAT0_A___2 = 1007, + FN_STP_ISD_0_A___2 = 1008, + FN_RIF0_CLK_A___2 = 1009, + FN_RIF2_CLK_A___2 = 1010, + FN_IP12_27_24___2 = 1011, + FN_RTS1_N___2 = 1012, + FN_HRTS1_N_A___2 = 1013, + FN_MSIOF1_TXD_B___2 = 1014, + FN_TS_SDAT1_C___2 = 1015, + FN_STP_ISD_1_C___2 = 1016, + FN_RIF1_D1_B___2 = 1017, + FN_ADICHS0___2 = 1018, + FN_IP13_27_24___2 = 1019, + FN_HRTS0_N___2 = 1020, + FN_TX2_B___2 = 1021, + FN_MSIOF1_SS1_D___2 = 1022, + FN_SSI_WS9_A___2 = 1023, + FN_STP_IVCXO27_0_D___2 = 1024, + FN_BPFCLK_A___2 = 1025, + FN_AUDIO_CLKOUT2_A___2 = 1026, + FN_IP14_27_24___2 = 1027, + FN_SSI_WS01239___2 = 1028, + FN_MSIOF1_SS1_F___2 = 1029, + FN_IP15_27_24___2 = 1030, + FN_SSI_WS4___2 = 1031, + FN_HTX2_A___2 = 1032, + FN_MSIOF1_SYNC_A___2 = 1033, + FN_TS_SDEN0_A___2 = 1034, + FN_STP_ISEN_0_A___2 = 1035, + FN_RIF0_SYNC_A___2 = 1036, + FN_RIF2_SYNC_A___2 = 1037, + FN_IP12_31_28___2 = 1038, + FN_SCK2___2 = 1039, + FN_SCIF_CLK_B___2 = 1040, + FN_MSIOF1_SCK_B___2 = 1041, + FN_TS_SCK1_C___2 = 1042, + FN_STP_ISCLK_1_C___2 = 1043, + FN_RIF1_CLK_B___2 = 1044, + FN_ADICLK___2 = 1045, + FN_IP13_31_28___2 = 1046, + FN_MSIOF0_SYNC___2 = 1047, + FN_AUDIO_CLKOUT_A___2 = 1048, + FN_TX5_B___2 = 1049, + FN_BPFCLK_D___2 = 1050, + FN_IP14_31_28___2 = 1051, + FN_SSI_SDATA0___2 = 1052, + FN_MSIOF1_SS2_F___2 = 1053, + FN_IP15_31_28___2 = 1054, + FN_SSI_SDATA4___2 = 1055, + FN_HSCK2_A___2 = 1056, + FN_MSIOF1_RXD_A___2 = 1057, + FN_TS_SPSYNC0_A___2 = 1058, + FN_STP_ISSYNC_0_A___2 = 1059, + FN_RIF0_D0_A___2 = 1060, + FN_RIF2_D1_A___2 = 1061, + FN_IP16_3_0___2 = 1062, + FN_SSI_SCK6___2 = 1063, + FN_SIM0_RST_D___2 = 1064, + FN_IP17_3_0___2 = 1065, + FN_AUDIO_CLKA_A___2 = 1066, + FN_IP18_3_0___2 = 1067, + FN_GP6_30___2 = 1068, + FN_AUDIO_CLKOUT2_B___2 = 1069, + FN_SSI_SCK9_B___2 = 1070, + FN_TS_SDEN0_E___2 = 1071, + FN_STP_ISEN_0_E___2 = 1072, + FN_RIF2_D0_B___2 = 1073, + FN_TPU0TO2___2 = 1074, + FN_FMCLK_C___2 = 1075, + FN_FMCLK_D___2 = 1076, + FN_IP16_7_4___2 = 1077, + FN_SSI_WS6___2 = 1078, + FN_SIM0_D_D___2 = 1079, + FN_IP17_7_4___2 = 1080, + FN_AUDIO_CLKB_B___2 = 1081, + FN_SCIF_CLK_A___2 = 1082, + FN_STP_IVCXO27_1_D___2 = 1083, + FN_REMOCON_A___2 = 1084, + FN_TCLK1_A___2 = 1085, + FN_IP18_7_4___2 = 1086, + FN_GP6_31___2 = 1087, + FN_AUDIO_CLKOUT3_B___2 = 1088, + FN_SSI_WS9_B___2 = 1089, + FN_TS_SPSYNC0_E___2 = 1090, + FN_STP_ISSYNC_0_E___2 = 1091, + FN_RIF2_D1_B___2 = 1092, + FN_TPU0TO3___2 = 1093, + FN_FMIN_C___2 = 1094, + FN_FMIN_D___2 = 1095, + FN_IP16_11_8___2 = 1096, + FN_SSI_SDATA6___2 = 1097, + FN_SIM0_CLK_D___2 = 1098, + FN_SATA_DEVSLP_A = 1099, + FN_IP17_11_8___2 = 1100, + FN_USB0_PWEN___2 = 1101, + FN_SIM0_RST_C___2 = 1102, + FN_TS_SCK1_D___2 = 1103, + FN_STP_ISCLK_1_D___2 = 1104, + FN_BPFCLK_B___2 = 1105, + FN_RIF3_CLK_B___2 = 1106, + FN_HSCK2_C___2 = 1107, + FN_IP16_15_12___2 = 1108, + FN_SSI_SCK78___2 = 1109, + FN_HRX2_B___2 = 1110, + FN_MSIOF1_SCK_C___2 = 1111, + FN_TS_SCK1_A___2 = 1112, + FN_STP_ISCLK_1_A___2 = 1113, + FN_RIF1_CLK_A___2 = 1114, + FN_RIF3_CLK_A___2 = 1115, + FN_IP17_15_12___2 = 1116, + FN_USB0_OVC___2 = 1117, + FN_SIM0_D_C___2 = 1118, + FN_TS_SDAT1_D___2 = 1119, + FN_STP_ISD_1_D___2 = 1120, + FN_RIF3_SYNC_B___2 = 1121, + FN_HRX2_C___2 = 1122, + FN_IP16_19_16___2 = 1123, + FN_SSI_WS78___2 = 1124, + FN_HTX2_B___2 = 1125, + FN_MSIOF1_SYNC_C___2 = 1126, + FN_TS_SDAT1_A___2 = 1127, + FN_STP_ISD_1_A___2 = 1128, + FN_RIF1_SYNC_A___2 = 1129, + FN_RIF3_SYNC_A___2 = 1130, + FN_IP17_19_16___2 = 1131, + FN_USB1_PWEN___2 = 1132, + FN_SIM0_CLK_C___2 = 1133, + FN_SSI_SCK1_A___2 = 1134, + FN_TS_SCK0_E___2 = 1135, + FN_STP_ISCLK_0_E___2 = 1136, + FN_FMCLK_B___2 = 1137, + FN_RIF2_CLK_B___2 = 1138, + FN_SPEEDIN_A___2 = 1139, + FN_HTX2_C___2 = 1140, + FN_IP16_23_20___2 = 1141, + FN_SSI_SDATA7___2 = 1142, + FN_HCTS2_N_B___2 = 1143, + FN_MSIOF1_RXD_C___2 = 1144, + FN_TS_SDEN1_A___2 = 1145, + FN_STP_ISEN_1_A___2 = 1146, + FN_RIF1_D0_A___2 = 1147, + FN_RIF3_D0_A___2 = 1148, + FN_TCLK2_A___2 = 1149, + FN_IP17_23_20___2 = 1150, + FN_USB1_OVC___2 = 1151, + FN_MSIOF1_SS2_C___2 = 1152, + FN_SSI_WS1_A___2 = 1153, + FN_TS_SDAT0_E___2 = 1154, + FN_STP_ISD_0_E___2 = 1155, + FN_FMIN_B___2 = 1156, + FN_RIF2_SYNC_B___2 = 1157, + FN_REMOCON_B___2 = 1158, + FN_HCTS2_N_C___2 = 1159, + FN_IP16_27_24___2 = 1160, + FN_SSI_SDATA8___2 = 1161, + FN_HRTS2_N_B___2 = 1162, + FN_MSIOF1_TXD_C___2 = 1163, + FN_TS_SPSYNC1_A___2 = 1164, + FN_STP_ISSYNC_1_A___2 = 1165, + FN_RIF1_D1_A___2 = 1166, + FN_RIF3_D1_A___2 = 1167, + FN_IP17_27_24___2 = 1168, + FN_USB30_PWEN___2 = 1169, + FN_AUDIO_CLKOUT_B___2 = 1170, + FN_SSI_SCK2_B___2 = 1171, + FN_TS_SDEN1_D___2 = 1172, + FN_STP_ISEN_1_D___2 = 1173, + FN_STP_OPWM_0_E___2 = 1174, + FN_RIF3_D0_B___2 = 1175, + FN_TCLK2_B___2 = 1176, + FN_TPU0TO0___2 = 1177, + FN_BPFCLK_C___2 = 1178, + FN_HRTS2_N_C___2 = 1179, + FN_IP16_31_28___2 = 1180, + FN_SSI_SDATA9_A___2 = 1181, + FN_HSCK2_B___2 = 1182, + FN_MSIOF1_SS1_C___2 = 1183, + FN_HSCK1_A___2 = 1184, + FN_SSI_WS1_B___2 = 1185, + FN_SCK1___2 = 1186, + FN_STP_IVCXO27_1_A___2 = 1187, + FN_SCK5_A___2 = 1188, + FN_IP17_31_28___2 = 1189, + FN_USB30_OVC___2 = 1190, + FN_AUDIO_CLKOUT1_B___2 = 1191, + FN_SSI_WS2_B___2 = 1192, + FN_TS_SPSYNC1_D___2 = 1193, + FN_STP_ISSYNC_1_D___2 = 1194, + FN_STP_IVCXO27_0_E___2 = 1195, + FN_RIF3_D1_B___2 = 1196, + FN_FSO_TOE_N___2 = 1197, + FN_TPU0TO1___2 = 1198, + FN_SEL_MSIOF3_0___2 = 1199, + FN_SEL_MSIOF3_1___2 = 1200, + FN_SEL_MSIOF3_2___2 = 1201, + FN_SEL_MSIOF3_3___2 = 1202, + FN_SEL_MSIOF3_4___2 = 1203, + FN_SEL_TSIF1_0___2 = 1204, + FN_SEL_TSIF1_1___2 = 1205, + FN_SEL_TSIF1_2___2 = 1206, + FN_SEL_TSIF1_3___2 = 1207, + FN_I2C_SEL_5_0___2 = 1208, + FN_I2C_SEL_5_1___2 = 1209, + FN_I2C_SEL_3_0___2 = 1210, + FN_I2C_SEL_3_1___2 = 1211, + FN_SEL_TSIF0_0___2 = 1212, + FN_SEL_TSIF0_1___2 = 1213, + FN_SEL_TSIF0_2___2 = 1214, + FN_SEL_TSIF0_3___2 = 1215, + FN_SEL_TSIF0_4___2 = 1216, + FN_I2C_SEL_0_0___2 = 1217, + FN_I2C_SEL_0_1___2 = 1218, + FN_SEL_MSIOF2_0___2 = 1219, + FN_SEL_MSIOF2_1___2 = 1220, + FN_SEL_MSIOF2_2___2 = 1221, + FN_SEL_MSIOF2_3___2 = 1222, + FN_SEL_FM_0___2 = 1223, + FN_SEL_FM_1___2 = 1224, + FN_SEL_FM_2___2 = 1225, + FN_SEL_FM_3___2 = 1226, + FN_SEL_MSIOF1_0___2 = 1227, + FN_SEL_MSIOF1_1___2 = 1228, + FN_SEL_MSIOF1_2___2 = 1229, + FN_SEL_MSIOF1_3___2 = 1230, + FN_SEL_MSIOF1_4___2 = 1231, + FN_SEL_MSIOF1_5___2 = 1232, + FN_SEL_MSIOF1_6___2 = 1233, + FN_SEL_TIMER_TMU_0___2 = 1234, + FN_SEL_TIMER_TMU_1___2 = 1235, + FN_SEL_SCIF5_0___2 = 1236, + FN_SEL_SCIF5_1___2 = 1237, + FN_SEL_SSP1_1_0___2 = 1238, + FN_SEL_SSP1_1_1___2 = 1239, + FN_SEL_SSP1_1_2___2 = 1240, + FN_SEL_SSP1_1_3___2 = 1241, + FN_SEL_I2C6_0___2 = 1242, + FN_SEL_I2C6_1___2 = 1243, + FN_SEL_I2C6_2___2 = 1244, + FN_SEL_LBSC_0___2 = 1245, + FN_SEL_LBSC_1___2 = 1246, + FN_SEL_SSP1_0_0___2 = 1247, + FN_SEL_SSP1_0_1___2 = 1248, + FN_SEL_SSP1_0_2___2 = 1249, + FN_SEL_SSP1_0_3___2 = 1250, + FN_SEL_SSP1_0_4___2 = 1251, + FN_SEL_IEBUS_0___2 = 1252, + FN_SEL_IEBUS_1___2 = 1253, + FN_SEL_NDF_0___2 = 1254, + FN_SEL_NDF_1___2 = 1255, + FN_SEL_I2C2_0___2 = 1256, + FN_SEL_I2C2_1___2 = 1257, + FN_SEL_SSI2_0___2 = 1258, + FN_SEL_SSI2_1___2 = 1259, + FN_SEL_I2C1_0___2 = 1260, + FN_SEL_I2C1_1___2 = 1261, + FN_SEL_SSI1_0___2 = 1262, + FN_SEL_SSI1_1___2 = 1263, + FN_SEL_SSI9_0___2 = 1264, + FN_SEL_SSI9_1___2 = 1265, + FN_SEL_HSCIF4_0___2 = 1266, + FN_SEL_HSCIF4_1___2 = 1267, + FN_SEL_SPEED_PULSE_0___2 = 1268, + FN_SEL_SPEED_PULSE_1___2 = 1269, + FN_SEL_TIMER_TMU2_0___2 = 1270, + FN_SEL_TIMER_TMU2_1___2 = 1271, + FN_SEL_HSCIF3_0___2 = 1272, + FN_SEL_HSCIF3_1___2 = 1273, + FN_SEL_HSCIF3_2___2 = 1274, + FN_SEL_HSCIF3_3___2 = 1275, + FN_SEL_SIMCARD_0___2 = 1276, + FN_SEL_SIMCARD_1___2 = 1277, + FN_SEL_SIMCARD_2___2 = 1278, + FN_SEL_SIMCARD_3___2 = 1279, + FN_SEL_ADGB_0___2 = 1280, + FN_SEL_ADGB_1___2 = 1281, + FN_SEL_ADGC_0___2 = 1282, + FN_SEL_ADGC_1___2 = 1283, + FN_SEL_HSCIF1_0___2 = 1284, + FN_SEL_HSCIF1_1___2 = 1285, + FN_SEL_SDHI2_0___2 = 1286, + FN_SEL_SDHI2_1___2 = 1287, + FN_SEL_SCIF4_0___2 = 1288, + FN_SEL_SCIF4_1___2 = 1289, + FN_SEL_SCIF4_2___2 = 1290, + FN_SEL_HSCIF2_0___2 = 1291, + FN_SEL_HSCIF2_1___2 = 1292, + FN_SEL_HSCIF2_2___2 = 1293, + FN_SEL_SCIF3_0___2 = 1294, + FN_SEL_SCIF3_1___2 = 1295, + FN_SEL_ETHERAVB_0___2 = 1296, + FN_SEL_ETHERAVB_1___2 = 1297, + FN_SEL_SCIF2_0___2 = 1298, + FN_SEL_SCIF2_1___2 = 1299, + FN_SEL_DRIF3_0___2 = 1300, + FN_SEL_DRIF3_1___2 = 1301, + FN_SEL_SCIF1_0___2 = 1302, + FN_SEL_SCIF1_1___2 = 1303, + FN_SEL_DRIF2_0___2 = 1304, + FN_SEL_DRIF2_1___2 = 1305, + FN_SEL_SCIF_0___2 = 1306, + FN_SEL_SCIF_1___2 = 1307, + FN_SEL_DRIF1_0___2 = 1308, + FN_SEL_DRIF1_1___2 = 1309, + FN_SEL_DRIF1_2___2 = 1310, + FN_SEL_REMOCON_0___2 = 1311, + FN_SEL_REMOCON_1___2 = 1312, + FN_SEL_DRIF0_0___2 = 1313, + FN_SEL_DRIF0_1___2 = 1314, + FN_SEL_DRIF0_2___2 = 1315, + FN_SEL_RCAN0_0___2 = 1316, + FN_SEL_RCAN0_1___2 = 1317, + FN_SEL_CANFD0_0___2 = 1318, + FN_SEL_CANFD0_1___2 = 1319, + FN_SEL_PWM6_0___2 = 1320, + FN_SEL_PWM6_1___2 = 1321, + FN_SEL_ADGA_0___2 = 1322, + FN_SEL_ADGA_1___2 = 1323, + FN_SEL_ADGA_2___2 = 1324, + FN_SEL_ADGA_3___2 = 1325, + FN_SEL_PWM5_0___2 = 1326, + FN_SEL_PWM5_1___2 = 1327, + FN_SEL_PWM4_0___2 = 1328, + FN_SEL_PWM4_1___2 = 1329, + FN_SEL_PWM3_0___2 = 1330, + FN_SEL_PWM3_1___2 = 1331, + FN_SEL_PWM2_0___2 = 1332, + FN_SEL_PWM2_1___2 = 1333, + FN_SEL_PWM1_0___2 = 1334, + FN_SEL_PWM1_1___2 = 1335, + FN_SEL_VIN4_0___2 = 1336, + FN_SEL_VIN4_1___2 = 1337, + PINMUX_FUNCTION_END___2 = 1338, + PINMUX_MARK_BEGIN___2 = 1339, + CLKOUT_MARK___2 = 1340, + MSIOF0_RXD_MARK___2 = 1341, + MSIOF0_TXD_MARK___2 = 1342, + MSIOF0_SCK_MARK___2 = 1343, + SSI_SDATA5_MARK___2 = 1344, + SSI_WS5_MARK___2 = 1345, + SSI_SCK5_MARK___2 = 1346, + GP7_03_MARK___2 = 1347, + GP7_02_MARK___2 = 1348, + AVS2_MARK___2 = 1349, + AVS1_MARK___2 = 1350, + IP0_3_0_MARK___2 = 1351, + AVB_MDC_MARK___2 = 1352, + MSIOF2_SS2_C_MARK___2 = 1353, + IP1_3_0_MARK___2 = 1354, + IRQ2_MARK___2 = 1355, + QCPV_QDE_MARK___2 = 1356, + DU_EXODDF_DU_ODDF_DISP_CDE_MARK___2 = 1357, + VI4_DATA2_B_MARK___2 = 1358, + MSIOF3_SYNC_E_MARK___2 = 1359, + PWM3_B_MARK___2 = 1360, + IP2_3_0_MARK___2 = 1361, + A1_MARK___2 = 1362, + LCDOUT17_MARK___2 = 1363, + MSIOF3_TXD_B_MARK___2 = 1364, + VI4_DATA9_MARK___2 = 1365, + DU_DB1_MARK___2 = 1366, + PWM4_A_MARK___2 = 1367, + IP3_3_0_MARK___2 = 1368, + A9_MARK___2 = 1369, + MSIOF2_SCK_A_MARK___2 = 1370, + CTS4_N_B_MARK___2 = 1371, + VI5_VSYNC_N_MARK___2 = 1372, + IP0_7_4_MARK___2 = 1373, + AVB_MAGIC_MARK___2 = 1374, + MSIOF2_SS1_C_MARK___2 = 1375, + SCK4_A_MARK___2 = 1376, + IP1_7_4_MARK___2 = 1377, + IRQ3_MARK___2 = 1378, + QSTVB_QVE_MARK___2 = 1379, + DU_DOTCLKOUT1_MARK___2 = 1380, + VI4_DATA3_B_MARK___2 = 1381, + MSIOF3_SCK_E_MARK___2 = 1382, + PWM4_B_MARK___2 = 1383, + IP2_7_4_MARK___2 = 1384, + A2_MARK___2 = 1385, + LCDOUT18_MARK___2 = 1386, + MSIOF3_SCK_B_MARK___2 = 1387, + VI4_DATA10_MARK___2 = 1388, + DU_DB2_MARK___2 = 1389, + PWM5_A_MARK___2 = 1390, + IP3_7_4_MARK___2 = 1391, + A10_MARK___2 = 1392, + MSIOF2_RXD_A_MARK___2 = 1393, + RTS4_N_B_MARK___2 = 1394, + VI5_HSYNC_N_MARK___2 = 1395, + IP0_11_8_MARK___2 = 1396, + AVB_PHY_INT_MARK___2 = 1397, + MSIOF2_SYNC_C_MARK___2 = 1398, + RX4_A_MARK___2 = 1399, + IP1_11_8_MARK___2 = 1400, + IRQ4_MARK___2 = 1401, + QSTH_QHS_MARK___2 = 1402, + DU_EXHSYNC_DU_HSYNC_MARK___2 = 1403, + VI4_DATA4_B_MARK___2 = 1404, + MSIOF3_RXD_E_MARK___2 = 1405, + PWM5_B_MARK___2 = 1406, + IP2_11_8_MARK___2 = 1407, + A3_MARK___2 = 1408, + LCDOUT19_MARK___2 = 1409, + MSIOF3_RXD_B_MARK___2 = 1410, + VI4_DATA11_MARK___2 = 1411, + DU_DB3_MARK___2 = 1412, + PWM6_A_MARK___2 = 1413, + IP3_11_8_MARK___2 = 1414, + A11_MARK___2 = 1415, + TX3_B_MARK___2 = 1416, + MSIOF2_TXD_A_MARK___2 = 1417, + HTX4_B_MARK___2 = 1418, + HSCK4_MARK___2 = 1419, + VI5_FIELD_MARK___2 = 1420, + SCL6_A_MARK___2 = 1421, + AVB_AVTP_CAPTURE_B_MARK___2 = 1422, + PWM2_B_MARK___2 = 1423, + IP0_15_12_MARK___2 = 1424, + AVB_LINK_MARK___2 = 1425, + MSIOF2_SCK_C_MARK___2 = 1426, + TX4_A_MARK___2 = 1427, + IP1_15_12_MARK___2 = 1428, + IRQ5_MARK___2 = 1429, + QSTB_QHE_MARK___2 = 1430, + DU_EXVSYNC_DU_VSYNC_MARK___2 = 1431, + VI4_DATA5_B_MARK___2 = 1432, + FSCLKST2_N_B_MARK = 1433, + MSIOF3_TXD_E_MARK___2 = 1434, + PWM6_B_MARK___2 = 1435, + IP2_15_12_MARK___2 = 1436, + A4_MARK___2 = 1437, + LCDOUT20_MARK___2 = 1438, + MSIOF3_SS1_B_MARK___2 = 1439, + VI4_DATA12_MARK___2 = 1440, + VI5_DATA12_MARK___2 = 1441, + DU_DB4_MARK___2 = 1442, + IP3_15_12_MARK___2 = 1443, + A12_MARK___2 = 1444, + LCDOUT12_MARK___2 = 1445, + MSIOF3_SCK_C_MARK___2 = 1446, + HRX4_A_MARK___2 = 1447, + VI5_DATA8_MARK___2 = 1448, + DU_DG4_MARK___2 = 1449, + IP0_19_16_MARK___2 = 1450, + AVB_AVTP_MATCH_A_MARK___2 = 1451, + MSIOF2_RXD_C_MARK___2 = 1452, + CTS4_N_A_MARK___2 = 1453, + FSCLKST2_N_A_MARK = 1454, + IP1_19_16_MARK___2 = 1455, + PWM0_MARK___2 = 1456, + AVB_AVTP_PPS_MARK___2 = 1457, + VI4_DATA6_B_MARK___2 = 1458, + IECLK_B_MARK___2 = 1459, + IP2_19_16_MARK___2 = 1460, + A5_MARK___2 = 1461, + LCDOUT21_MARK___2 = 1462, + MSIOF3_SS2_B_MARK___2 = 1463, + SCK4_B_MARK___2 = 1464, + VI4_DATA13_MARK___2 = 1465, + VI5_DATA13_MARK___2 = 1466, + DU_DB5_MARK___2 = 1467, + IP3_19_16_MARK___2 = 1468, + A13_MARK___2 = 1469, + LCDOUT13_MARK___2 = 1470, + MSIOF3_SYNC_C_MARK___2 = 1471, + HTX4_A_MARK___2 = 1472, + VI5_DATA9_MARK___2 = 1473, + DU_DG5_MARK___2 = 1474, + IP0_23_20_MARK___2 = 1475, + AVB_AVTP_CAPTURE_A_MARK___2 = 1476, + MSIOF2_TXD_C_MARK___2 = 1477, + RTS4_N_A_MARK___2 = 1478, + IP1_23_20_MARK___2 = 1479, + PWM1_A_MARK___2 = 1480, + HRX3_D_MARK___2 = 1481, + VI4_DATA7_B_MARK___2 = 1482, + IERX_B_MARK___2 = 1483, + IP2_23_20_MARK___2 = 1484, + A6_MARK___2 = 1485, + LCDOUT22_MARK___2 = 1486, + MSIOF2_SS1_A_MARK___2 = 1487, + RX4_B_MARK___2 = 1488, + VI4_DATA14_MARK___2 = 1489, + VI5_DATA14_MARK___2 = 1490, + DU_DB6_MARK___2 = 1491, + IP3_23_20_MARK___2 = 1492, + A14_MARK___2 = 1493, + LCDOUT14_MARK___2 = 1494, + MSIOF3_RXD_C_MARK___2 = 1495, + HCTS4_N_MARK___2 = 1496, + VI5_DATA10_MARK___2 = 1497, + DU_DG6_MARK___2 = 1498, + IP0_27_24_MARK___2 = 1499, + IRQ0_MARK___2 = 1500, + QPOLB_MARK___2 = 1501, + DU_CDE_MARK___2 = 1502, + VI4_DATA0_B_MARK___2 = 1503, + CAN0_TX_B_MARK___2 = 1504, + CANFD0_TX_B_MARK___2 = 1505, + MSIOF3_SS2_E_MARK___2 = 1506, + IP1_27_24_MARK___2 = 1507, + PWM2_A_MARK___2 = 1508, + HTX3_D_MARK___2 = 1509, + IETX_B_MARK___2 = 1510, + IP2_27_24_MARK___2 = 1511, + A7_MARK___2 = 1512, + LCDOUT23_MARK___2 = 1513, + MSIOF2_SS2_A_MARK___2 = 1514, + TX4_B_MARK___2 = 1515, + VI4_DATA15_MARK___2 = 1516, + VI5_DATA15_MARK___2 = 1517, + DU_DB7_MARK___2 = 1518, + IP3_27_24_MARK___2 = 1519, + A15_MARK___2 = 1520, + LCDOUT15_MARK___2 = 1521, + MSIOF3_TXD_C_MARK___2 = 1522, + HRTS4_N_MARK___2 = 1523, + VI5_DATA11_MARK___2 = 1524, + DU_DG7_MARK___2 = 1525, + IP0_31_28_MARK___2 = 1526, + IRQ1_MARK___2 = 1527, + QPOLA_MARK___2 = 1528, + DU_DISP_MARK___2 = 1529, + VI4_DATA1_B_MARK___2 = 1530, + CAN0_RX_B_MARK___2 = 1531, + CANFD0_RX_B_MARK___2 = 1532, + MSIOF3_SS1_E_MARK___2 = 1533, + IP1_31_28_MARK___2 = 1534, + A0_MARK___2 = 1535, + LCDOUT16_MARK___2 = 1536, + MSIOF3_SYNC_B_MARK___2 = 1537, + VI4_DATA8_MARK___2 = 1538, + DU_DB0_MARK___2 = 1539, + PWM3_A_MARK___2 = 1540, + IP2_31_28_MARK___2 = 1541, + A8_MARK___2 = 1542, + RX3_B_MARK___2 = 1543, + MSIOF2_SYNC_A_MARK___2 = 1544, + HRX4_B_MARK___2 = 1545, + SDA6_A_MARK___2 = 1546, + AVB_AVTP_MATCH_B_MARK___2 = 1547, + PWM1_B_MARK___2 = 1548, + IP3_31_28_MARK___2 = 1549, + A16_MARK___2 = 1550, + LCDOUT8_MARK___2 = 1551, + VI4_FIELD_MARK___2 = 1552, + DU_DG0_MARK___2 = 1553, + IP4_3_0_MARK___2 = 1554, + A17_MARK___2 = 1555, + LCDOUT9_MARK___2 = 1556, + VI4_VSYNC_N_MARK___2 = 1557, + DU_DG1_MARK___2 = 1558, + IP5_3_0_MARK___2 = 1559, + WE0_N_MARK___2 = 1560, + MSIOF3_TXD_D_MARK___2 = 1561, + CTS3_N_MARK___2 = 1562, + HCTS3_N_MARK___2 = 1563, + SCL6_B_MARK___2 = 1564, + CAN_CLK_MARK___2 = 1565, + IECLK_A_MARK___2 = 1566, + IP6_3_0_MARK___2 = 1567, + D5_MARK___2 = 1568, + MSIOF2_SYNC_B_MARK___2 = 1569, + VI4_DATA21_MARK___2 = 1570, + VI5_DATA5_MARK___2 = 1571, + IP7_3_0_MARK___2 = 1572, + D13_MARK___2 = 1573, + LCDOUT5_MARK___2 = 1574, + MSIOF2_SS2_D_MARK___2 = 1575, + TX4_C_MARK___2 = 1576, + VI4_DATA5_A_MARK___2 = 1577, + DU_DR5_MARK___2 = 1578, + IP4_7_4_MARK___2 = 1579, + A18_MARK___2 = 1580, + LCDOUT10_MARK___2 = 1581, + VI4_HSYNC_N_MARK___2 = 1582, + DU_DG2_MARK___2 = 1583, + IP5_7_4_MARK___2 = 1584, + WE1_N_MARK___2 = 1585, + MSIOF3_SS1_D_MARK___2 = 1586, + RTS3_N_MARK___2 = 1587, + HRTS3_N_MARK___2 = 1588, + SDA6_B_MARK___2 = 1589, + CAN1_RX_MARK___2 = 1590, + CANFD1_RX_MARK___2 = 1591, + IERX_A_MARK___2 = 1592, + IP6_7_4_MARK___2 = 1593, + D6_MARK___2 = 1594, + MSIOF2_RXD_B_MARK___2 = 1595, + VI4_DATA22_MARK___2 = 1596, + VI5_DATA6_MARK___2 = 1597, + IP7_7_4_MARK___2 = 1598, + D14_MARK___2 = 1599, + LCDOUT6_MARK___2 = 1600, + MSIOF3_SS1_A_MARK___2 = 1601, + HRX3_C_MARK___2 = 1602, + VI4_DATA6_A_MARK___2 = 1603, + DU_DR6_MARK___2 = 1604, + SCL6_C_MARK___2 = 1605, + IP4_11_8_MARK___2 = 1606, + A19_MARK___2 = 1607, + LCDOUT11_MARK___2 = 1608, + VI4_CLKENB_MARK___2 = 1609, + DU_DG3_MARK___2 = 1610, + IP5_11_8_MARK___2 = 1611, + EX_WAIT0_A_MARK___2 = 1612, + QCLK_MARK___2 = 1613, + VI4_CLK_MARK___2 = 1614, + DU_DOTCLKOUT0_MARK___2 = 1615, + IP6_11_8_MARK___2 = 1616, + D7_MARK___2 = 1617, + MSIOF2_TXD_B_MARK___2 = 1618, + VI4_DATA23_MARK___2 = 1619, + VI5_DATA7_MARK___2 = 1620, + IP7_11_8_MARK___2 = 1621, + D15_MARK___2 = 1622, + LCDOUT7_MARK___2 = 1623, + MSIOF3_SS2_A_MARK___2 = 1624, + HTX3_C_MARK___2 = 1625, + VI4_DATA7_A_MARK___2 = 1626, + DU_DR7_MARK___2 = 1627, + SDA6_C_MARK___2 = 1628, + IP4_15_12_MARK___2 = 1629, + CS0_N_MARK___2 = 1630, + VI5_CLKENB_MARK___2 = 1631, + IP5_15_12_MARK___2 = 1632, + D0_MARK___2 = 1633, + MSIOF2_SS1_B_MARK___2 = 1634, + MSIOF3_SCK_A_MARK___2 = 1635, + VI4_DATA16_MARK___2 = 1636, + VI5_DATA0_MARK___2 = 1637, + IP6_15_12_MARK___2 = 1638, + D8_MARK___2 = 1639, + LCDOUT0_MARK___2 = 1640, + MSIOF2_SCK_D_MARK___2 = 1641, + SCK4_C_MARK___2 = 1642, + VI4_DATA0_A_MARK___2 = 1643, + DU_DR0_MARK___2 = 1644, + IP4_19_16_MARK___2 = 1645, + CS1_N_MARK___2 = 1646, + VI5_CLK_MARK___2 = 1647, + EX_WAIT0_B_MARK___2 = 1648, + IP5_19_16_MARK___2 = 1649, + D1_MARK___2 = 1650, + MSIOF2_SS2_B_MARK___2 = 1651, + MSIOF3_SYNC_A_MARK___2 = 1652, + VI4_DATA17_MARK___2 = 1653, + VI5_DATA1_MARK___2 = 1654, + IP6_19_16_MARK___2 = 1655, + D9_MARK___2 = 1656, + LCDOUT1_MARK___2 = 1657, + MSIOF2_SYNC_D_MARK___2 = 1658, + VI4_DATA1_A_MARK___2 = 1659, + DU_DR1_MARK___2 = 1660, + IP7_19_16_MARK___2 = 1661, + SD0_CLK_MARK___2 = 1662, + MSIOF1_SCK_E_MARK___2 = 1663, + STP_OPWM_0_B_MARK___2 = 1664, + IP4_23_20_MARK___2 = 1665, + BS_N_MARK___2 = 1666, + QSTVA_QVS_MARK___2 = 1667, + MSIOF3_SCK_D_MARK___2 = 1668, + SCK3_MARK___2 = 1669, + HSCK3_MARK___2 = 1670, + CAN1_TX_MARK___2 = 1671, + CANFD1_TX_MARK___2 = 1672, + IETX_A_MARK___2 = 1673, + IP5_23_20_MARK___2 = 1674, + D2_MARK___2 = 1675, + MSIOF3_RXD_A_MARK___2 = 1676, + VI4_DATA18_MARK___2 = 1677, + VI5_DATA2_MARK___2 = 1678, + IP6_23_20_MARK___2 = 1679, + D10_MARK___2 = 1680, + LCDOUT2_MARK___2 = 1681, + MSIOF2_RXD_D_MARK___2 = 1682, + HRX3_B_MARK___2 = 1683, + VI4_DATA2_A_MARK___2 = 1684, + CTS4_N_C_MARK___2 = 1685, + DU_DR2_MARK___2 = 1686, + IP7_23_20_MARK___2 = 1687, + SD0_CMD_MARK___2 = 1688, + MSIOF1_SYNC_E_MARK___2 = 1689, + STP_IVCXO27_0_B_MARK___2 = 1690, + IP4_27_24_MARK___2 = 1691, + RD_N_MARK___2 = 1692, + MSIOF3_SYNC_D_MARK___2 = 1693, + RX3_A_MARK___2 = 1694, + HRX3_A_MARK___2 = 1695, + CAN0_TX_A_MARK___2 = 1696, + CANFD0_TX_A_MARK___2 = 1697, + IP5_27_24_MARK___2 = 1698, + D3_MARK___2 = 1699, + MSIOF3_TXD_A_MARK___2 = 1700, + VI4_DATA19_MARK___2 = 1701, + VI5_DATA3_MARK___2 = 1702, + IP6_27_24_MARK___2 = 1703, + D11_MARK___2 = 1704, + LCDOUT3_MARK___2 = 1705, + MSIOF2_TXD_D_MARK___2 = 1706, + HTX3_B_MARK___2 = 1707, + VI4_DATA3_A_MARK___2 = 1708, + RTS4_N_C_MARK___2 = 1709, + DU_DR3_MARK___2 = 1710, + IP7_27_24_MARK___2 = 1711, + SD0_DAT0_MARK___2 = 1712, + MSIOF1_RXD_E_MARK___2 = 1713, + TS_SCK0_B_MARK___2 = 1714, + STP_ISCLK_0_B_MARK___2 = 1715, + IP4_31_28_MARK___2 = 1716, + RD_WR_N_MARK___2 = 1717, + MSIOF3_RXD_D_MARK___2 = 1718, + TX3_A_MARK___2 = 1719, + HTX3_A_MARK___2 = 1720, + CAN0_RX_A_MARK___2 = 1721, + CANFD0_RX_A_MARK___2 = 1722, + IP5_31_28_MARK___2 = 1723, + D4_MARK___2 = 1724, + MSIOF2_SCK_B_MARK___2 = 1725, + VI4_DATA20_MARK___2 = 1726, + VI5_DATA4_MARK___2 = 1727, + IP6_31_28_MARK___2 = 1728, + D12_MARK___2 = 1729, + LCDOUT4_MARK___2 = 1730, + MSIOF2_SS1_D_MARK___2 = 1731, + RX4_C_MARK___2 = 1732, + VI4_DATA4_A_MARK___2 = 1733, + DU_DR4_MARK___2 = 1734, + IP7_31_28_MARK___2 = 1735, + SD0_DAT1_MARK___2 = 1736, + MSIOF1_TXD_E_MARK___2 = 1737, + TS_SPSYNC0_B_MARK___2 = 1738, + STP_ISSYNC_0_B_MARK___2 = 1739, + IP8_3_0_MARK___2 = 1740, + SD0_DAT2_MARK___2 = 1741, + MSIOF1_SS1_E_MARK___2 = 1742, + TS_SDAT0_B_MARK___2 = 1743, + STP_ISD_0_B_MARK___2 = 1744, + IP9_3_0_MARK___2 = 1745, + SD2_CLK_MARK___2 = 1746, + NFDATA8_MARK___2 = 1747, + IP10_3_0_MARK___2 = 1748, + SD3_CMD_MARK___2 = 1749, + NFRE_N_MARK___2 = 1750, + IP11_3_0_MARK___2 = 1751, + SD3_DAT7_MARK___2 = 1752, + SD3_WP_MARK___2 = 1753, + NFDATA7_MARK___2 = 1754, + IP8_7_4_MARK___2 = 1755, + SD0_DAT3_MARK___2 = 1756, + MSIOF1_SS2_E_MARK___2 = 1757, + TS_SDEN0_B_MARK___2 = 1758, + STP_ISEN_0_B_MARK___2 = 1759, + IP9_7_4_MARK___2 = 1760, + SD2_CMD_MARK___2 = 1761, + NFDATA9_MARK___2 = 1762, + IP10_7_4_MARK___2 = 1763, + SD3_DAT0_MARK___2 = 1764, + NFDATA0_MARK___2 = 1765, + IP11_7_4_MARK___2 = 1766, + SD3_DS_MARK___2 = 1767, + NFCLE_MARK___2 = 1768, + IP8_11_8_MARK___2 = 1769, + SD1_CLK_MARK___2 = 1770, + MSIOF1_SCK_G_MARK___2 = 1771, + SIM0_CLK_A_MARK___2 = 1772, + IP9_11_8_MARK___2 = 1773, + SD2_DAT0_MARK___2 = 1774, + NFDATA10_MARK___2 = 1775, + IP10_11_8_MARK___2 = 1776, + SD3_DAT1_MARK___2 = 1777, + NFDATA1_MARK___2 = 1778, + IP11_11_8_MARK___2 = 1779, + SD0_CD_MARK___2 = 1780, + NFDATA14_A_MARK___2 = 1781, + SCL2_B_MARK___2 = 1782, + SIM0_RST_A_MARK___2 = 1783, + IP8_15_12_MARK___2 = 1784, + SD1_CMD_MARK___2 = 1785, + MSIOF1_SYNC_G_MARK___2 = 1786, + NFCE_N_B_MARK___2 = 1787, + SIM0_D_A_MARK___2 = 1788, + STP_IVCXO27_1_B_MARK___2 = 1789, + IP9_15_12_MARK___2 = 1790, + SD2_DAT1_MARK___2 = 1791, + NFDATA11_MARK___2 = 1792, + IP10_15_12_MARK___2 = 1793, + SD3_DAT2_MARK___2 = 1794, + NFDATA2_MARK___2 = 1795, + IP11_15_12_MARK___2 = 1796, + SD0_WP_MARK___2 = 1797, + NFDATA15_A_MARK___2 = 1798, + SDA2_B_MARK___2 = 1799, + IP8_19_16_MARK___2 = 1800, + SD1_DAT0_MARK___2 = 1801, + SD2_DAT4_MARK___2 = 1802, + MSIOF1_RXD_G_MARK___2 = 1803, + NFWP_N_B_MARK___2 = 1804, + TS_SCK1_B_MARK___2 = 1805, + STP_ISCLK_1_B_MARK___2 = 1806, + IP9_19_16_MARK___2 = 1807, + SD2_DAT2_MARK___2 = 1808, + NFDATA12_MARK___2 = 1809, + IP10_19_16_MARK___2 = 1810, + SD3_DAT3_MARK___2 = 1811, + NFDATA3_MARK___2 = 1812, + IP11_19_16_MARK___2 = 1813, + SD1_CD_MARK___2 = 1814, + NFRB_N_A_MARK___2 = 1815, + SIM0_CLK_B_MARK___2 = 1816, + IP8_23_20_MARK___2 = 1817, + SD1_DAT1_MARK___2 = 1818, + SD2_DAT5_MARK___2 = 1819, + MSIOF1_TXD_G_MARK___2 = 1820, + NFDATA14_B_MARK___2 = 1821, + TS_SPSYNC1_B_MARK___2 = 1822, + STP_ISSYNC_1_B_MARK___2 = 1823, + IP9_23_20_MARK___2 = 1824, + SD2_DAT3_MARK___2 = 1825, + NFDATA13_MARK___2 = 1826, + IP10_23_20_MARK___2 = 1827, + SD3_DAT4_MARK___2 = 1828, + SD2_CD_A_MARK___2 = 1829, + NFDATA4_MARK___2 = 1830, + IP11_23_20_MARK___2 = 1831, + SD1_WP_MARK___2 = 1832, + NFCE_N_A_MARK___2 = 1833, + SIM0_D_B_MARK___2 = 1834, + IP8_27_24_MARK___2 = 1835, + SD1_DAT2_MARK___2 = 1836, + SD2_DAT6_MARK___2 = 1837, + MSIOF1_SS1_G_MARK___2 = 1838, + NFDATA15_B_MARK___2 = 1839, + TS_SDAT1_B_MARK___2 = 1840, + STP_ISD_1_B_MARK___2 = 1841, + IP9_27_24_MARK___2 = 1842, + SD2_DS_MARK___2 = 1843, + NFALE_MARK___2 = 1844, + SATA_DEVSLP_B_MARK = 1845, + IP10_27_24_MARK___2 = 1846, + SD3_DAT5_MARK___2 = 1847, + SD2_WP_A_MARK___2 = 1848, + NFDATA5_MARK___2 = 1849, + IP11_27_24_MARK___2 = 1850, + SCK0_MARK___2 = 1851, + HSCK1_B_MARK___2 = 1852, + MSIOF1_SS2_B_MARK___2 = 1853, + AUDIO_CLKC_B_MARK___2 = 1854, + SDA2_A_MARK___2 = 1855, + SIM0_RST_B_MARK___2 = 1856, + STP_OPWM_0_C_MARK___2 = 1857, + RIF0_CLK_B_MARK___2 = 1858, + ADICHS2_MARK___2 = 1859, + SCK5_B_MARK___2 = 1860, + IP8_31_28_MARK___2 = 1861, + SD1_DAT3_MARK___2 = 1862, + SD2_DAT7_MARK___2 = 1863, + MSIOF1_SS2_G_MARK___2 = 1864, + NFRB_N_B_MARK___2 = 1865, + TS_SDEN1_B_MARK___2 = 1866, + STP_ISEN_1_B_MARK___2 = 1867, + IP9_31_28_MARK___2 = 1868, + SD3_CLK_MARK___2 = 1869, + NFWE_N_MARK___2 = 1870, + IP10_31_28_MARK___2 = 1871, + SD3_DAT6_MARK___2 = 1872, + SD3_CD_MARK___2 = 1873, + NFDATA6_MARK___2 = 1874, + IP11_31_28_MARK___2 = 1875, + RX0_MARK___2 = 1876, + HRX1_B_MARK___2 = 1877, + TS_SCK0_C_MARK___2 = 1878, + STP_ISCLK_0_C_MARK___2 = 1879, + RIF0_D0_B_MARK___2 = 1880, + IP12_3_0_MARK___2 = 1881, + TX0_MARK___2 = 1882, + HTX1_B_MARK___2 = 1883, + TS_SPSYNC0_C_MARK___2 = 1884, + STP_ISSYNC_0_C_MARK___2 = 1885, + RIF0_D1_B_MARK___2 = 1886, + IP13_3_0_MARK___2 = 1887, + TX2_A_MARK___2 = 1888, + SD2_CD_B_MARK___2 = 1889, + SCL1_A_MARK___2 = 1890, + FMCLK_A_MARK___2 = 1891, + RIF1_D1_C_MARK___2 = 1892, + FSO_CFE_0_N_MARK___2 = 1893, + IP14_3_0_MARK___2 = 1894, + MSIOF0_SS1_MARK___2 = 1895, + RX5_A_MARK___2 = 1896, + NFWP_N_A_MARK___2 = 1897, + AUDIO_CLKA_C_MARK___2 = 1898, + SSI_SCK2_A_MARK___2 = 1899, + STP_IVCXO27_0_C_MARK___2 = 1900, + AUDIO_CLKOUT3_A_MARK___2 = 1901, + TCLK1_B_MARK___2 = 1902, + IP15_3_0_MARK___2 = 1903, + SSI_SDATA1_A_MARK___2 = 1904, + IP12_7_4_MARK___2 = 1905, + CTS0_N_MARK___2 = 1906, + HCTS1_N_B_MARK___2 = 1907, + MSIOF1_SYNC_B_MARK___2 = 1908, + TS_SPSYNC1_C_MARK___2 = 1909, + STP_ISSYNC_1_C_MARK___2 = 1910, + RIF1_SYNC_B_MARK___2 = 1911, + AUDIO_CLKOUT_C_MARK___2 = 1912, + ADICS_SAMP_MARK___2 = 1913, + IP13_7_4_MARK___2 = 1914, + RX2_A_MARK___2 = 1915, + SD2_WP_B_MARK___2 = 1916, + SDA1_A_MARK___2 = 1917, + FMIN_A_MARK___2 = 1918, + RIF1_SYNC_C_MARK___2 = 1919, + FSO_CFE_1_N_MARK___2 = 1920, + IP14_7_4_MARK___2 = 1921, + MSIOF0_SS2_MARK___2 = 1922, + TX5_A_MARK___2 = 1923, + MSIOF1_SS2_D_MARK___2 = 1924, + AUDIO_CLKC_A_MARK___2 = 1925, + SSI_WS2_A_MARK___2 = 1926, + STP_OPWM_0_D_MARK___2 = 1927, + AUDIO_CLKOUT_D_MARK___2 = 1928, + SPEEDIN_B_MARK___2 = 1929, + IP15_7_4_MARK___2 = 1930, + SSI_SDATA2_A_MARK___2 = 1931, + SSI_SCK1_B_MARK___2 = 1932, + IP12_11_8_MARK___2 = 1933, + RTS0_N_MARK___2 = 1934, + HRTS1_N_B_MARK___2 = 1935, + MSIOF1_SS1_B_MARK___2 = 1936, + AUDIO_CLKA_B_MARK___2 = 1937, + SCL2_A_MARK___2 = 1938, + STP_IVCXO27_1_C_MARK___2 = 1939, + RIF0_SYNC_B_MARK___2 = 1940, + ADICHS1_MARK___2 = 1941, + IP13_11_8_MARK___2 = 1942, + HSCK0_MARK___2 = 1943, + MSIOF1_SCK_D_MARK___2 = 1944, + AUDIO_CLKB_A_MARK___2 = 1945, + SSI_SDATA1_B_MARK___2 = 1946, + TS_SCK0_D_MARK___2 = 1947, + STP_ISCLK_0_D_MARK___2 = 1948, + RIF0_CLK_C_MARK___2 = 1949, + RX5_B_MARK___2 = 1950, + IP14_11_8_MARK___2 = 1951, + MLB_CLK_MARK___2 = 1952, + MSIOF1_SCK_F_MARK___2 = 1953, + SCL1_B_MARK___2 = 1954, + IP15_11_8_MARK___2 = 1955, + SSI_SCK349_MARK___2 = 1956, + MSIOF1_SS1_A_MARK___2 = 1957, + STP_OPWM_0_A_MARK___2 = 1958, + IP12_15_12_MARK___2 = 1959, + RX1_A_MARK___2 = 1960, + HRX1_A_MARK___2 = 1961, + TS_SDAT0_C_MARK___2 = 1962, + STP_ISD_0_C_MARK___2 = 1963, + RIF1_CLK_C_MARK___2 = 1964, + IP13_15_12_MARK___2 = 1965, + HRX0_MARK___2 = 1966, + MSIOF1_RXD_D_MARK___2 = 1967, + SSI_SDATA2_B_MARK___2 = 1968, + TS_SDEN0_D_MARK___2 = 1969, + STP_ISEN_0_D_MARK___2 = 1970, + RIF0_D0_C_MARK___2 = 1971, + IP14_15_12_MARK___2 = 1972, + MLB_SIG_MARK___2 = 1973, + RX1_B_MARK___2 = 1974, + MSIOF1_SYNC_F_MARK___2 = 1975, + SDA1_B_MARK___2 = 1976, + IP15_15_12_MARK___2 = 1977, + SSI_WS349_MARK___2 = 1978, + HCTS2_N_A_MARK___2 = 1979, + MSIOF1_SS2_A_MARK___2 = 1980, + STP_IVCXO27_0_A_MARK___2 = 1981, + IP12_19_16_MARK___2 = 1982, + TX1_A_MARK___2 = 1983, + HTX1_A_MARK___2 = 1984, + TS_SDEN0_C_MARK___2 = 1985, + STP_ISEN_0_C_MARK___2 = 1986, + RIF1_D0_C_MARK___2 = 1987, + IP13_19_16_MARK___2 = 1988, + HTX0_MARK___2 = 1989, + MSIOF1_TXD_D_MARK___2 = 1990, + SSI_SDATA9_B_MARK___2 = 1991, + TS_SDAT0_D_MARK___2 = 1992, + STP_ISD_0_D_MARK___2 = 1993, + RIF0_D1_C_MARK___2 = 1994, + IP14_19_16_MARK___2 = 1995, + MLB_DAT_MARK___2 = 1996, + TX1_B_MARK___2 = 1997, + MSIOF1_RXD_F_MARK___2 = 1998, + IP15_19_16_MARK___2 = 1999, + SSI_SDATA3_MARK___2 = 2000, + HRTS2_N_A_MARK___2 = 2001, + MSIOF1_TXD_A_MARK___2 = 2002, + TS_SCK0_A_MARK___2 = 2003, + STP_ISCLK_0_A_MARK___2 = 2004, + RIF0_D1_A_MARK___2 = 2005, + RIF2_D0_A_MARK___2 = 2006, + IP12_23_20_MARK___2 = 2007, + CTS1_N_MARK___2 = 2008, + HCTS1_N_A_MARK___2 = 2009, + MSIOF1_RXD_B_MARK___2 = 2010, + TS_SDEN1_C_MARK___2 = 2011, + STP_ISEN_1_C_MARK___2 = 2012, + RIF1_D0_B_MARK___2 = 2013, + ADIDATA_MARK___2 = 2014, + IP13_23_20_MARK___2 = 2015, + HCTS0_N_MARK___2 = 2016, + RX2_B_MARK___2 = 2017, + MSIOF1_SYNC_D_MARK___2 = 2018, + SSI_SCK9_A_MARK___2 = 2019, + TS_SPSYNC0_D_MARK___2 = 2020, + STP_ISSYNC_0_D_MARK___2 = 2021, + RIF0_SYNC_C_MARK___2 = 2022, + AUDIO_CLKOUT1_A_MARK___2 = 2023, + IP14_23_20_MARK___2 = 2024, + SSI_SCK01239_MARK___2 = 2025, + MSIOF1_TXD_F_MARK___2 = 2026, + IP15_23_20_MARK___2 = 2027, + SSI_SCK4_MARK___2 = 2028, + HRX2_A_MARK___2 = 2029, + MSIOF1_SCK_A_MARK___2 = 2030, + TS_SDAT0_A_MARK___2 = 2031, + STP_ISD_0_A_MARK___2 = 2032, + RIF0_CLK_A_MARK___2 = 2033, + RIF2_CLK_A_MARK___2 = 2034, + IP12_27_24_MARK___2 = 2035, + RTS1_N_MARK___2 = 2036, + HRTS1_N_A_MARK___2 = 2037, + MSIOF1_TXD_B_MARK___2 = 2038, + TS_SDAT1_C_MARK___2 = 2039, + STP_ISD_1_C_MARK___2 = 2040, + RIF1_D1_B_MARK___2 = 2041, + ADICHS0_MARK___2 = 2042, + IP13_27_24_MARK___2 = 2043, + HRTS0_N_MARK___2 = 2044, + TX2_B_MARK___2 = 2045, + MSIOF1_SS1_D_MARK___2 = 2046, + SSI_WS9_A_MARK___2 = 2047, + STP_IVCXO27_0_D_MARK___2 = 2048, + BPFCLK_A_MARK___2 = 2049, + AUDIO_CLKOUT2_A_MARK___2 = 2050, + IP14_27_24_MARK___2 = 2051, + SSI_WS01239_MARK___2 = 2052, + MSIOF1_SS1_F_MARK___2 = 2053, + IP15_27_24_MARK___2 = 2054, + SSI_WS4_MARK___2 = 2055, + HTX2_A_MARK___2 = 2056, + MSIOF1_SYNC_A_MARK___2 = 2057, + TS_SDEN0_A_MARK___2 = 2058, + STP_ISEN_0_A_MARK___2 = 2059, + RIF0_SYNC_A_MARK___2 = 2060, + RIF2_SYNC_A_MARK___2 = 2061, + IP12_31_28_MARK___2 = 2062, + SCK2_MARK___2 = 2063, + SCIF_CLK_B_MARK___2 = 2064, + MSIOF1_SCK_B_MARK___2 = 2065, + TS_SCK1_C_MARK___2 = 2066, + STP_ISCLK_1_C_MARK___2 = 2067, + RIF1_CLK_B_MARK___2 = 2068, + ADICLK_MARK___2 = 2069, + IP13_31_28_MARK___2 = 2070, + MSIOF0_SYNC_MARK___2 = 2071, + AUDIO_CLKOUT_A_MARK___2 = 2072, + TX5_B_MARK___2 = 2073, + BPFCLK_D_MARK___2 = 2074, + IP14_31_28_MARK___2 = 2075, + SSI_SDATA0_MARK___2 = 2076, + MSIOF1_SS2_F_MARK___2 = 2077, + IP15_31_28_MARK___2 = 2078, + SSI_SDATA4_MARK___2 = 2079, + HSCK2_A_MARK___2 = 2080, + MSIOF1_RXD_A_MARK___2 = 2081, + TS_SPSYNC0_A_MARK___2 = 2082, + STP_ISSYNC_0_A_MARK___2 = 2083, + RIF0_D0_A_MARK___2 = 2084, + RIF2_D1_A_MARK___2 = 2085, + IP16_3_0_MARK___2 = 2086, + SSI_SCK6_MARK___2 = 2087, + SIM0_RST_D_MARK___2 = 2088, + IP17_3_0_MARK___2 = 2089, + AUDIO_CLKA_A_MARK___2 = 2090, + IP18_3_0_MARK___2 = 2091, + GP6_30_MARK___2 = 2092, + AUDIO_CLKOUT2_B_MARK___2 = 2093, + SSI_SCK9_B_MARK___2 = 2094, + TS_SDEN0_E_MARK___2 = 2095, + STP_ISEN_0_E_MARK___2 = 2096, + RIF2_D0_B_MARK___2 = 2097, + TPU0TO2_MARK___2 = 2098, + FMCLK_C_MARK___2 = 2099, + FMCLK_D_MARK___2 = 2100, + IP16_7_4_MARK___2 = 2101, + SSI_WS6_MARK___2 = 2102, + SIM0_D_D_MARK___2 = 2103, + IP17_7_4_MARK___2 = 2104, + AUDIO_CLKB_B_MARK___2 = 2105, + SCIF_CLK_A_MARK___2 = 2106, + STP_IVCXO27_1_D_MARK___2 = 2107, + REMOCON_A_MARK___2 = 2108, + TCLK1_A_MARK___2 = 2109, + IP18_7_4_MARK___2 = 2110, + GP6_31_MARK___2 = 2111, + AUDIO_CLKOUT3_B_MARK___2 = 2112, + SSI_WS9_B_MARK___2 = 2113, + TS_SPSYNC0_E_MARK___2 = 2114, + STP_ISSYNC_0_E_MARK___2 = 2115, + RIF2_D1_B_MARK___2 = 2116, + TPU0TO3_MARK___2 = 2117, + FMIN_C_MARK___2 = 2118, + FMIN_D_MARK___2 = 2119, + IP16_11_8_MARK___2 = 2120, + SSI_SDATA6_MARK___2 = 2121, + SIM0_CLK_D_MARK___2 = 2122, + SATA_DEVSLP_A_MARK = 2123, + IP17_11_8_MARK___2 = 2124, + USB0_PWEN_MARK___2 = 2125, + SIM0_RST_C_MARK___2 = 2126, + TS_SCK1_D_MARK___2 = 2127, + STP_ISCLK_1_D_MARK___2 = 2128, + BPFCLK_B_MARK___2 = 2129, + RIF3_CLK_B_MARK___2 = 2130, + HSCK2_C_MARK___2 = 2131, + IP16_15_12_MARK___2 = 2132, + SSI_SCK78_MARK___2 = 2133, + HRX2_B_MARK___2 = 2134, + MSIOF1_SCK_C_MARK___2 = 2135, + TS_SCK1_A_MARK___2 = 2136, + STP_ISCLK_1_A_MARK___2 = 2137, + RIF1_CLK_A_MARK___2 = 2138, + RIF3_CLK_A_MARK___2 = 2139, + IP17_15_12_MARK___2 = 2140, + USB0_OVC_MARK___2 = 2141, + SIM0_D_C_MARK___2 = 2142, + TS_SDAT1_D_MARK___2 = 2143, + STP_ISD_1_D_MARK___2 = 2144, + RIF3_SYNC_B_MARK___2 = 2145, + HRX2_C_MARK___2 = 2146, + IP16_19_16_MARK___2 = 2147, + SSI_WS78_MARK___2 = 2148, + HTX2_B_MARK___2 = 2149, + MSIOF1_SYNC_C_MARK___2 = 2150, + TS_SDAT1_A_MARK___2 = 2151, + STP_ISD_1_A_MARK___2 = 2152, + RIF1_SYNC_A_MARK___2 = 2153, + RIF3_SYNC_A_MARK___2 = 2154, + IP17_19_16_MARK___2 = 2155, + USB1_PWEN_MARK___2 = 2156, + SIM0_CLK_C_MARK___2 = 2157, + SSI_SCK1_A_MARK___2 = 2158, + TS_SCK0_E_MARK___2 = 2159, + STP_ISCLK_0_E_MARK___2 = 2160, + FMCLK_B_MARK___2 = 2161, + RIF2_CLK_B_MARK___2 = 2162, + SPEEDIN_A_MARK___2 = 2163, + HTX2_C_MARK___2 = 2164, + IP16_23_20_MARK___2 = 2165, + SSI_SDATA7_MARK___2 = 2166, + HCTS2_N_B_MARK___2 = 2167, + MSIOF1_RXD_C_MARK___2 = 2168, + TS_SDEN1_A_MARK___2 = 2169, + STP_ISEN_1_A_MARK___2 = 2170, + RIF1_D0_A_MARK___2 = 2171, + RIF3_D0_A_MARK___2 = 2172, + TCLK2_A_MARK___2 = 2173, + IP17_23_20_MARK___2 = 2174, + USB1_OVC_MARK___2 = 2175, + MSIOF1_SS2_C_MARK___2 = 2176, + SSI_WS1_A_MARK___2 = 2177, + TS_SDAT0_E_MARK___2 = 2178, + STP_ISD_0_E_MARK___2 = 2179, + FMIN_B_MARK___2 = 2180, + RIF2_SYNC_B_MARK___2 = 2181, + REMOCON_B_MARK___2 = 2182, + HCTS2_N_C_MARK___2 = 2183, + IP16_27_24_MARK___2 = 2184, + SSI_SDATA8_MARK___2 = 2185, + HRTS2_N_B_MARK___2 = 2186, + MSIOF1_TXD_C_MARK___2 = 2187, + TS_SPSYNC1_A_MARK___2 = 2188, + STP_ISSYNC_1_A_MARK___2 = 2189, + RIF1_D1_A_MARK___2 = 2190, + RIF3_D1_A_MARK___2 = 2191, + IP17_27_24_MARK___2 = 2192, + USB30_PWEN_MARK___2 = 2193, + AUDIO_CLKOUT_B_MARK___2 = 2194, + SSI_SCK2_B_MARK___2 = 2195, + TS_SDEN1_D_MARK___2 = 2196, + STP_ISEN_1_D_MARK___2 = 2197, + STP_OPWM_0_E_MARK___2 = 2198, + RIF3_D0_B_MARK___2 = 2199, + TCLK2_B_MARK___2 = 2200, + TPU0TO0_MARK___2 = 2201, + BPFCLK_C_MARK___2 = 2202, + HRTS2_N_C_MARK___2 = 2203, + IP16_31_28_MARK___2 = 2204, + SSI_SDATA9_A_MARK___2 = 2205, + HSCK2_B_MARK___2 = 2206, + MSIOF1_SS1_C_MARK___2 = 2207, + HSCK1_A_MARK___2 = 2208, + SSI_WS1_B_MARK___2 = 2209, + SCK1_MARK___2 = 2210, + STP_IVCXO27_1_A_MARK___2 = 2211, + SCK5_A_MARK___2 = 2212, + IP17_31_28_MARK___2 = 2213, + USB30_OVC_MARK___2 = 2214, + AUDIO_CLKOUT1_B_MARK___2 = 2215, + SSI_WS2_B_MARK___2 = 2216, + TS_SPSYNC1_D_MARK___2 = 2217, + STP_ISSYNC_1_D_MARK___2 = 2218, + STP_IVCXO27_0_E_MARK___2 = 2219, + RIF3_D1_B_MARK___2 = 2220, + FSO_TOE_N_MARK___2 = 2221, + TPU0TO1_MARK___2 = 2222, + SEL_MSIOF3_0_MARK___2 = 2223, + SEL_MSIOF3_1_MARK___2 = 2224, + SEL_MSIOF3_2_MARK___2 = 2225, + SEL_MSIOF3_3_MARK___2 = 2226, + SEL_MSIOF3_4_MARK___2 = 2227, + SEL_TSIF1_0_MARK___2 = 2228, + SEL_TSIF1_1_MARK___2 = 2229, + SEL_TSIF1_2_MARK___2 = 2230, + SEL_TSIF1_3_MARK___2 = 2231, + I2C_SEL_5_0_MARK___2 = 2232, + I2C_SEL_5_1_MARK___2 = 2233, + I2C_SEL_3_0_MARK___2 = 2234, + I2C_SEL_3_1_MARK___2 = 2235, + SEL_TSIF0_0_MARK___2 = 2236, + SEL_TSIF0_1_MARK___2 = 2237, + SEL_TSIF0_2_MARK___2 = 2238, + SEL_TSIF0_3_MARK___2 = 2239, + SEL_TSIF0_4_MARK___2 = 2240, + I2C_SEL_0_0_MARK___2 = 2241, + I2C_SEL_0_1_MARK___2 = 2242, + SEL_MSIOF2_0_MARK___2 = 2243, + SEL_MSIOF2_1_MARK___2 = 2244, + SEL_MSIOF2_2_MARK___2 = 2245, + SEL_MSIOF2_3_MARK___2 = 2246, + SEL_FM_0_MARK___2 = 2247, + SEL_FM_1_MARK___2 = 2248, + SEL_FM_2_MARK___2 = 2249, + SEL_FM_3_MARK___2 = 2250, + SEL_MSIOF1_0_MARK___2 = 2251, + SEL_MSIOF1_1_MARK___2 = 2252, + SEL_MSIOF1_2_MARK___2 = 2253, + SEL_MSIOF1_3_MARK___2 = 2254, + SEL_MSIOF1_4_MARK___2 = 2255, + SEL_MSIOF1_5_MARK___2 = 2256, + SEL_MSIOF1_6_MARK___2 = 2257, + SEL_TIMER_TMU_0_MARK___2 = 2258, + SEL_TIMER_TMU_1_MARK___2 = 2259, + SEL_SCIF5_0_MARK___2 = 2260, + SEL_SCIF5_1_MARK___2 = 2261, + SEL_SSP1_1_0_MARK___2 = 2262, + SEL_SSP1_1_1_MARK___2 = 2263, + SEL_SSP1_1_2_MARK___2 = 2264, + SEL_SSP1_1_3_MARK___2 = 2265, + SEL_I2C6_0_MARK___2 = 2266, + SEL_I2C6_1_MARK___2 = 2267, + SEL_I2C6_2_MARK___2 = 2268, + SEL_LBSC_0_MARK___2 = 2269, + SEL_LBSC_1_MARK___2 = 2270, + SEL_SSP1_0_0_MARK___2 = 2271, + SEL_SSP1_0_1_MARK___2 = 2272, + SEL_SSP1_0_2_MARK___2 = 2273, + SEL_SSP1_0_3_MARK___2 = 2274, + SEL_SSP1_0_4_MARK___2 = 2275, + SEL_IEBUS_0_MARK___2 = 2276, + SEL_IEBUS_1_MARK___2 = 2277, + SEL_NDF_0_MARK___2 = 2278, + SEL_NDF_1_MARK___2 = 2279, + SEL_I2C2_0_MARK___2 = 2280, + SEL_I2C2_1_MARK___2 = 2281, + SEL_SSI2_0_MARK___2 = 2282, + SEL_SSI2_1_MARK___2 = 2283, + SEL_I2C1_0_MARK___2 = 2284, + SEL_I2C1_1_MARK___2 = 2285, + SEL_SSI1_0_MARK___2 = 2286, + SEL_SSI1_1_MARK___2 = 2287, + SEL_SSI9_0_MARK___2 = 2288, + SEL_SSI9_1_MARK___2 = 2289, + SEL_HSCIF4_0_MARK___2 = 2290, + SEL_HSCIF4_1_MARK___2 = 2291, + SEL_SPEED_PULSE_0_MARK___2 = 2292, + SEL_SPEED_PULSE_1_MARK___2 = 2293, + SEL_TIMER_TMU2_0_MARK___2 = 2294, + SEL_TIMER_TMU2_1_MARK___2 = 2295, + SEL_HSCIF3_0_MARK___2 = 2296, + SEL_HSCIF3_1_MARK___2 = 2297, + SEL_HSCIF3_2_MARK___2 = 2298, + SEL_HSCIF3_3_MARK___2 = 2299, + SEL_SIMCARD_0_MARK___2 = 2300, + SEL_SIMCARD_1_MARK___2 = 2301, + SEL_SIMCARD_2_MARK___2 = 2302, + SEL_SIMCARD_3_MARK___2 = 2303, + SEL_ADGB_0_MARK___2 = 2304, + SEL_ADGB_1_MARK___2 = 2305, + SEL_ADGC_0_MARK___2 = 2306, + SEL_ADGC_1_MARK___2 = 2307, + SEL_HSCIF1_0_MARK___2 = 2308, + SEL_HSCIF1_1_MARK___2 = 2309, + SEL_SDHI2_0_MARK___2 = 2310, + SEL_SDHI2_1_MARK___2 = 2311, + SEL_SCIF4_0_MARK___2 = 2312, + SEL_SCIF4_1_MARK___2 = 2313, + SEL_SCIF4_2_MARK___2 = 2314, + SEL_HSCIF2_0_MARK___2 = 2315, + SEL_HSCIF2_1_MARK___2 = 2316, + SEL_HSCIF2_2_MARK___2 = 2317, + SEL_SCIF3_0_MARK___2 = 2318, + SEL_SCIF3_1_MARK___2 = 2319, + SEL_ETHERAVB_0_MARK___2 = 2320, + SEL_ETHERAVB_1_MARK___2 = 2321, + SEL_SCIF2_0_MARK___2 = 2322, + SEL_SCIF2_1_MARK___2 = 2323, + SEL_DRIF3_0_MARK___2 = 2324, + SEL_DRIF3_1_MARK___2 = 2325, + SEL_SCIF1_0_MARK___2 = 2326, + SEL_SCIF1_1_MARK___2 = 2327, + SEL_DRIF2_0_MARK___2 = 2328, + SEL_DRIF2_1_MARK___2 = 2329, + SEL_SCIF_0_MARK___2 = 2330, + SEL_SCIF_1_MARK___2 = 2331, + SEL_DRIF1_0_MARK___2 = 2332, + SEL_DRIF1_1_MARK___2 = 2333, + SEL_DRIF1_2_MARK___2 = 2334, + SEL_REMOCON_0_MARK___2 = 2335, + SEL_REMOCON_1_MARK___2 = 2336, + SEL_DRIF0_0_MARK___2 = 2337, + SEL_DRIF0_1_MARK___2 = 2338, + SEL_DRIF0_2_MARK___2 = 2339, + SEL_RCAN0_0_MARK___2 = 2340, + SEL_RCAN0_1_MARK___2 = 2341, + SEL_CANFD0_0_MARK___2 = 2342, + SEL_CANFD0_1_MARK___2 = 2343, + SEL_PWM6_0_MARK___2 = 2344, + SEL_PWM6_1_MARK___2 = 2345, + SEL_ADGA_0_MARK___2 = 2346, + SEL_ADGA_1_MARK___2 = 2347, + SEL_ADGA_2_MARK___2 = 2348, + SEL_ADGA_3_MARK___2 = 2349, + SEL_PWM5_0_MARK___2 = 2350, + SEL_PWM5_1_MARK___2 = 2351, + SEL_PWM4_0_MARK___2 = 2352, + SEL_PWM4_1_MARK___2 = 2353, + SEL_PWM3_0_MARK___2 = 2354, + SEL_PWM3_1_MARK___2 = 2355, + SEL_PWM2_0_MARK___2 = 2356, + SEL_PWM2_1_MARK___2 = 2357, + SEL_PWM1_0_MARK___2 = 2358, + SEL_PWM1_1_MARK___2 = 2359, + SEL_VIN4_0_MARK___2 = 2360, + SEL_VIN4_1_MARK___2 = 2361, + QSPI0_SPCLK_MARK___2 = 2362, + QSPI0_SSL_MARK___2 = 2363, + QSPI0_MOSI_IO0_MARK___2 = 2364, + QSPI0_MISO_IO1_MARK___2 = 2365, + QSPI0_IO2_MARK___2 = 2366, + QSPI0_IO3_MARK___2 = 2367, + QSPI1_SPCLK_MARK___2 = 2368, + QSPI1_SSL_MARK___2 = 2369, + QSPI1_MOSI_IO0_MARK___2 = 2370, + QSPI1_MISO_IO1_MARK___2 = 2371, + QSPI1_IO2_MARK___2 = 2372, + QSPI1_IO3_MARK___2 = 2373, + RPC_INT_MARK___2 = 2374, + RPC_WP_MARK___2 = 2375, + RPC_RESET_MARK___2 = 2376, + AVB_TX_CTL_MARK___2 = 2377, + AVB_TXC_MARK___2 = 2378, + AVB_TD0_MARK___2 = 2379, + AVB_TD1_MARK___2 = 2380, + AVB_TD2_MARK___2 = 2381, + AVB_TD3_MARK___2 = 2382, + AVB_RX_CTL_MARK___2 = 2383, + AVB_RXC_MARK___2 = 2384, + AVB_RD0_MARK___2 = 2385, + AVB_RD1_MARK___2 = 2386, + AVB_RD2_MARK___2 = 2387, + AVB_RD3_MARK___2 = 2388, + AVB_TXCREFCLK_MARK___2 = 2389, + AVB_MDIO_MARK___2 = 2390, + PRESETOUT_MARK___2 = 2391, + DU_DOTCLKIN0_MARK___2 = 2392, + DU_DOTCLKIN1_MARK___2 = 2393, + DU_DOTCLKIN3_MARK = 2394, + TMS_MARK___2 = 2395, + TDO_MARK___2 = 2396, + ASEBRK_MARK___2 = 2397, + MLB_REF_MARK___2 = 2398, + TDI_MARK___2 = 2399, + TCK_MARK___2 = 2400, + TRST_MARK___2 = 2401, + EXTALR_MARK___2 = 2402, + SCL0_MARK___2 = 2403, + SDA0_MARK___2 = 2404, + SCL3_MARK___2 = 2405, + SDA3_MARK___2 = 2406, + SCL5_MARK___2 = 2407, + SDA5_MARK___2 = 2408, + PINMUX_MARK_END___2 = 2409, +}; + +enum { + GP_LAST___2 = 227, + PIN_ASEBRK___2 = 228, + PIN_AVB_MDIO___2 = 229, + PIN_AVB_RD0___2 = 230, + PIN_AVB_RD1___2 = 231, + PIN_AVB_RD2___2 = 232, + PIN_AVB_RD3___2 = 233, + PIN_AVB_RXC___2 = 234, + PIN_AVB_RX_CTL___2 = 235, + PIN_AVB_TD0___2 = 236, + PIN_AVB_TD1___2 = 237, + PIN_AVB_TD2___2 = 238, + PIN_AVB_TD3___2 = 239, + PIN_AVB_TXC___2 = 240, + PIN_AVB_TXCREFCLK___2 = 241, + PIN_AVB_TX_CTL___2 = 242, + PIN_DU_DOTCLKIN0___2 = 243, + PIN_DU_DOTCLKIN1___2 = 244, + PIN_DU_DOTCLKIN3 = 245, + PIN_EXTALR___2 = 246, + PIN_FSCLKST___2 = 247, + PIN_MLB_REF___2 = 248, + PIN_PRESETOUT_N___2 = 249, + PIN_QSPI0_IO2___2 = 250, + PIN_QSPI0_IO3___2 = 251, + PIN_QSPI0_MISO_IO1___2 = 252, + PIN_QSPI0_MOSI_IO0___2 = 253, + PIN_QSPI0_SPCLK___2 = 254, + PIN_QSPI0_SSL___2 = 255, + PIN_QSPI1_IO2___2 = 256, + PIN_QSPI1_IO3___2 = 257, + PIN_QSPI1_MISO_IO1___2 = 258, + PIN_QSPI1_MOSI_IO0___2 = 259, + PIN_QSPI1_SPCLK___2 = 260, + PIN_QSPI1_SSL___2 = 261, + PIN_RPC_INT_N___2 = 262, + PIN_RPC_RESET_N___2 = 263, + PIN_RPC_WP_N___2 = 264, + PIN_TCK___2 = 265, + PIN_TDI___2 = 266, + PIN_TDO___2 = 267, + PIN_TMS___2 = 268, + PIN_TRST_N___2 = 269, +}; + +enum { + PINMUX_RESERVED___3 = 0, + PINMUX_DATA_BEGIN___3 = 1, + GP_0_0_DATA___3 = 2, + GP_0_1_DATA___3 = 3, + GP_0_2_DATA___3 = 4, + GP_0_3_DATA___3 = 5, + GP_0_4_DATA___3 = 6, + GP_0_5_DATA___3 = 7, + GP_0_6_DATA___3 = 8, + GP_0_7_DATA___3 = 9, + GP_0_8_DATA___3 = 10, + GP_0_9_DATA___3 = 11, + GP_0_10_DATA___3 = 12, + GP_0_11_DATA___3 = 13, + GP_0_12_DATA___3 = 14, + GP_0_13_DATA___3 = 15, + GP_0_14_DATA___3 = 16, + GP_0_15_DATA___3 = 17, + GP_0_16_DATA = 18, + GP_0_17_DATA = 19, + GP_1_0_DATA___3 = 20, + GP_1_1_DATA___3 = 21, + GP_1_2_DATA___3 = 22, + GP_1_3_DATA___3 = 23, + GP_1_4_DATA___3 = 24, + GP_1_5_DATA___3 = 25, + GP_1_6_DATA___3 = 26, + GP_1_7_DATA___3 = 27, + GP_1_8_DATA___3 = 28, + GP_1_9_DATA___3 = 29, + GP_1_10_DATA___3 = 30, + GP_1_11_DATA___3 = 31, + GP_1_12_DATA___3 = 32, + GP_1_13_DATA___3 = 33, + GP_1_14_DATA___3 = 34, + GP_1_15_DATA___3 = 35, + GP_1_16_DATA___3 = 36, + GP_1_17_DATA___3 = 37, + GP_1_18_DATA___3 = 38, + GP_1_19_DATA___3 = 39, + GP_1_20_DATA___3 = 40, + GP_1_21_DATA___3 = 41, + GP_1_22_DATA___3 = 42, + GP_2_0_DATA___3 = 43, + GP_2_1_DATA___3 = 44, + GP_2_2_DATA___3 = 45, + GP_2_3_DATA___3 = 46, + GP_2_4_DATA___3 = 47, + GP_2_5_DATA___3 = 48, + GP_2_6_DATA___3 = 49, + GP_2_7_DATA___3 = 50, + GP_2_8_DATA___3 = 51, + GP_2_9_DATA___3 = 52, + GP_2_10_DATA___3 = 53, + GP_2_11_DATA___3 = 54, + GP_2_12_DATA___3 = 55, + GP_2_13_DATA___3 = 56, + GP_2_14_DATA___3 = 57, + GP_2_15_DATA = 58, + GP_2_16_DATA = 59, + GP_2_17_DATA = 60, + GP_2_18_DATA = 61, + GP_2_19_DATA = 62, + GP_2_20_DATA = 63, + GP_2_21_DATA = 64, + GP_2_22_DATA = 65, + GP_2_23_DATA = 66, + GP_2_24_DATA = 67, + GP_2_25_DATA = 68, + GP_3_0_DATA___3 = 69, + GP_3_1_DATA___3 = 70, + GP_3_2_DATA___3 = 71, + GP_3_3_DATA___3 = 72, + GP_3_4_DATA___3 = 73, + GP_3_5_DATA___3 = 74, + GP_3_6_DATA___3 = 75, + GP_3_7_DATA___3 = 76, + GP_3_8_DATA___3 = 77, + GP_3_9_DATA___3 = 78, + GP_3_10_DATA___3 = 79, + GP_3_11_DATA___3 = 80, + GP_3_12_DATA___3 = 81, + GP_3_13_DATA___3 = 82, + GP_3_14_DATA___3 = 83, + GP_3_15_DATA___3 = 84, + GP_4_0_DATA___3 = 85, + GP_4_1_DATA___3 = 86, + GP_4_2_DATA___3 = 87, + GP_4_3_DATA___3 = 88, + GP_4_4_DATA___3 = 89, + GP_4_5_DATA___3 = 90, + GP_4_6_DATA___3 = 91, + GP_4_7_DATA___3 = 92, + GP_4_8_DATA___3 = 93, + GP_4_9_DATA___3 = 94, + GP_4_10_DATA___3 = 95, + GP_5_0_DATA___3 = 96, + GP_5_1_DATA___3 = 97, + GP_5_2_DATA___3 = 98, + GP_5_3_DATA___3 = 99, + GP_5_4_DATA___3 = 100, + GP_5_5_DATA___3 = 101, + GP_5_6_DATA___3 = 102, + GP_5_7_DATA___3 = 103, + GP_5_8_DATA___3 = 104, + GP_5_9_DATA___3 = 105, + GP_5_10_DATA___3 = 106, + GP_5_11_DATA___3 = 107, + GP_5_12_DATA___3 = 108, + GP_5_13_DATA___3 = 109, + GP_5_14_DATA___3 = 110, + GP_5_15_DATA___3 = 111, + GP_5_16_DATA___3 = 112, + GP_5_17_DATA___3 = 113, + GP_5_18_DATA___3 = 114, + GP_5_19_DATA___3 = 115, + GP_6_0_DATA___3 = 116, + GP_6_1_DATA___3 = 117, + GP_6_2_DATA___3 = 118, + GP_6_3_DATA___3 = 119, + GP_6_4_DATA___3 = 120, + GP_6_5_DATA___3 = 121, + GP_6_6_DATA___3 = 122, + GP_6_7_DATA___3 = 123, + GP_6_8_DATA___3 = 124, + GP_6_9_DATA___3 = 125, + GP_6_10_DATA___3 = 126, + GP_6_11_DATA___3 = 127, + GP_6_12_DATA___3 = 128, + GP_6_13_DATA___3 = 129, + GP_6_14_DATA___3 = 130, + GP_6_15_DATA___3 = 131, + GP_6_16_DATA___3 = 132, + GP_6_17_DATA___3 = 133, + PINMUX_DATA_END___3 = 134, + PINMUX_FUNCTION_BEGIN___3 = 135, + GP_0_0_FN___3 = 136, + GP_0_1_FN___3 = 137, + GP_0_2_FN___3 = 138, + GP_0_3_FN___3 = 139, + GP_0_4_FN___3 = 140, + GP_0_5_FN___3 = 141, + GP_0_6_FN___3 = 142, + GP_0_7_FN___3 = 143, + GP_0_8_FN___3 = 144, + GP_0_9_FN___3 = 145, + GP_0_10_FN___3 = 146, + GP_0_11_FN___3 = 147, + GP_0_12_FN___3 = 148, + GP_0_13_FN___3 = 149, + GP_0_14_FN___3 = 150, + GP_0_15_FN___3 = 151, + GP_0_16_FN = 152, + GP_0_17_FN = 153, + GP_1_0_FN___3 = 154, + GP_1_1_FN___3 = 155, + GP_1_2_FN___3 = 156, + GP_1_3_FN___3 = 157, + GP_1_4_FN___3 = 158, + GP_1_5_FN___3 = 159, + GP_1_6_FN___3 = 160, + GP_1_7_FN___3 = 161, + GP_1_8_FN___3 = 162, + GP_1_9_FN___3 = 163, + GP_1_10_FN___3 = 164, + GP_1_11_FN___3 = 165, + GP_1_12_FN___3 = 166, + GP_1_13_FN___3 = 167, + GP_1_14_FN___3 = 168, + GP_1_15_FN___3 = 169, + GP_1_16_FN___3 = 170, + GP_1_17_FN___3 = 171, + GP_1_18_FN___3 = 172, + GP_1_19_FN___3 = 173, + GP_1_20_FN___3 = 174, + GP_1_21_FN___3 = 175, + GP_1_22_FN___3 = 176, + GP_2_0_FN___3 = 177, + GP_2_1_FN___3 = 178, + GP_2_2_FN___3 = 179, + GP_2_3_FN___3 = 180, + GP_2_4_FN___3 = 181, + GP_2_5_FN___3 = 182, + GP_2_6_FN___3 = 183, + GP_2_7_FN___3 = 184, + GP_2_8_FN___3 = 185, + GP_2_9_FN___3 = 186, + GP_2_10_FN___3 = 187, + GP_2_11_FN___3 = 188, + GP_2_12_FN___3 = 189, + GP_2_13_FN___3 = 190, + GP_2_14_FN___3 = 191, + GP_2_15_FN = 192, + GP_2_16_FN = 193, + GP_2_17_FN = 194, + GP_2_18_FN = 195, + GP_2_19_FN = 196, + GP_2_20_FN = 197, + GP_2_21_FN = 198, + GP_2_22_FN = 199, + GP_2_23_FN = 200, + GP_2_24_FN = 201, + GP_2_25_FN = 202, + GP_3_0_FN___3 = 203, + GP_3_1_FN___3 = 204, + GP_3_2_FN___3 = 205, + GP_3_3_FN___3 = 206, + GP_3_4_FN___3 = 207, + GP_3_5_FN___3 = 208, + GP_3_6_FN___3 = 209, + GP_3_7_FN___3 = 210, + GP_3_8_FN___3 = 211, + GP_3_9_FN___3 = 212, + GP_3_10_FN___3 = 213, + GP_3_11_FN___3 = 214, + GP_3_12_FN___3 = 215, + GP_3_13_FN___3 = 216, + GP_3_14_FN___3 = 217, + GP_3_15_FN___3 = 218, + GP_4_0_FN___3 = 219, + GP_4_1_FN___3 = 220, + GP_4_2_FN___3 = 221, + GP_4_3_FN___3 = 222, + GP_4_4_FN___3 = 223, + GP_4_5_FN___3 = 224, + GP_4_6_FN___3 = 225, + GP_4_7_FN___3 = 226, + GP_4_8_FN___3 = 227, + GP_4_9_FN___3 = 228, + GP_4_10_FN___3 = 229, + GP_5_0_FN___3 = 230, + GP_5_1_FN___3 = 231, + GP_5_2_FN___3 = 232, + GP_5_3_FN___3 = 233, + GP_5_4_FN___3 = 234, + GP_5_5_FN___3 = 235, + GP_5_6_FN___3 = 236, + GP_5_7_FN___3 = 237, + GP_5_8_FN___3 = 238, + GP_5_9_FN___3 = 239, + GP_5_10_FN___3 = 240, + GP_5_11_FN___3 = 241, + GP_5_12_FN___3 = 242, + GP_5_13_FN___3 = 243, + GP_5_14_FN___3 = 244, + GP_5_15_FN___3 = 245, + GP_5_16_FN___3 = 246, + GP_5_17_FN___3 = 247, + GP_5_18_FN___3 = 248, + GP_5_19_FN___3 = 249, + GP_6_0_FN___3 = 250, + GP_6_1_FN___3 = 251, + GP_6_2_FN___3 = 252, + GP_6_3_FN___3 = 253, + GP_6_4_FN___3 = 254, + GP_6_5_FN___3 = 255, + GP_6_6_FN___3 = 256, + GP_6_7_FN___3 = 257, + GP_6_8_FN___3 = 258, + GP_6_9_FN___3 = 259, + GP_6_10_FN___3 = 260, + GP_6_11_FN___3 = 261, + GP_6_12_FN___3 = 262, + GP_6_13_FN___3 = 263, + GP_6_14_FN___3 = 264, + GP_6_15_FN___3 = 265, + GP_6_16_FN___3 = 266, + GP_6_17_FN___3 = 267, + FN_AVB_PHY_INT___3 = 268, + FN_CLKOUT___3 = 269, + FN_AVB_RD3 = 270, + FN_AVB_RXC = 271, + FN_AVB_RX_CTL = 272, + FN_QSPI0_SSL = 273, + FN_IP0_3_0___3 = 274, + FN_QSPI0_SPCLK = 275, + FN_HSCK4_A = 276, + FN_IP1_3_0___3 = 277, + FN_QSPI1_IO2 = 278, + FN_RIF2_D1_A___3 = 279, + FN_HTX3_C___3 = 280, + FN_VI4_DATA3_A___3 = 281, + FN_IP2_3_0___3 = 282, + FN_AVB_TXCREFCLK = 283, + FN_IP3_3_0___3 = 284, + FN_A1___3 = 285, + FN_IRQ1___3 = 286, + FN_PWM3_A___3 = 287, + FN_DU_DOTCLKIN1 = 288, + FN_VI5_DATA0_A = 289, + FN_DU_DISP_CDE = 290, + FN_SDA6_B___3 = 291, + FN_IETX = 292, + FN_QCPV_QDE___3 = 293, + FN_IP0_7_4___3 = 294, + FN_QSPI0_MOSI_IO0 = 295, + FN_HCTS4_N_A = 296, + FN_IP1_7_4___3 = 297, + FN_QSPI1_IO3 = 298, + FN_RIF3_CLK_A___3 = 299, + FN_HRX3_C___3 = 300, + FN_VI4_DATA4_A___3 = 301, + FN_IP2_7_4___3 = 302, + FN_AVB_MDIO = 303, + FN_IP3_7_4___3 = 304, + FN_A2___3 = 305, + FN_IRQ2___3 = 306, + FN_AVB_AVTP_PPS___3 = 307, + FN_VI4_CLKENB___3 = 308, + FN_VI5_DATA1_A = 309, + FN_DU_DISP___3 = 310, + FN_SCL6_B___3 = 311, + FN_QSTVB_QVE___3 = 312, + FN_IP0_11_8___3 = 313, + FN_QSPI0_MISO_IO1 = 314, + FN_HRTS4_N_A = 315, + FN_IP1_11_8___3 = 316, + FN_QSPI1_SSL = 317, + FN_RIF3_SYNC_A___3 = 318, + FN_HSCK3_C = 319, + FN_VI4_DATA5_A___3 = 320, + FN_IP2_11_8___3 = 321, + FN_AVB_MDC___3 = 322, + FN_IP3_11_8___3 = 323, + FN_A3___3 = 324, + FN_CTS4_N_A___3 = 325, + FN_PWM4_A___3 = 326, + FN_VI4_DATA12___3 = 327, + FN_DU_DOTCLKOUT0___3 = 328, + FN_HTX3_D___3 = 329, + FN_IECLK = 330, + FN_LCDOUT12___3 = 331, + FN_IP0_15_12___3 = 332, + FN_QSPI0_IO2 = 333, + FN_HTX4_A___3 = 334, + FN_IP1_15_12___3 = 335, + FN_RPC_INT_N = 336, + FN_RIF3_D0_A___3 = 337, + FN_HCTS3_N_C = 338, + FN_VI4_DATA6_A___3 = 339, + FN_IP2_15_12___3 = 340, + FN_BS_N___3 = 341, + FN_PWM0_A = 342, + FN_AVB_MAGIC___3 = 343, + FN_VI4_CLK___3 = 344, + FN_TX3_C = 345, + FN_VI5_CLK_B = 346, + FN_IP3_15_12___3 = 347, + FN_A4___3 = 348, + FN_RTS4_N_A___3 = 349, + FN_MSIOF3_SYNC_B___3 = 350, + FN_VI4_DATA8___3 = 351, + FN_PWM2_B___3 = 352, + FN_DU_DG4___3 = 353, + FN_RIF2_CLK_B___3 = 354, + FN_IP0_19_16___3 = 355, + FN_QSPI0_IO3 = 356, + FN_HRX4_A___3 = 357, + FN_IP1_19_16___3 = 358, + FN_RPC_RESET_N = 359, + FN_RIF3_D1_A___3 = 360, + FN_HRTS3_N_C = 361, + FN_VI4_DATA7_A___3 = 362, + FN_IP2_19_16___3 = 363, + FN_RD_N___3 = 364, + FN_PWM1_A___3 = 365, + FN_AVB_LINK___3 = 366, + FN_VI4_FIELD___3 = 367, + FN_RX3_C = 368, + FN_FSCLKST2_N_A___2 = 369, + FN_VI5_DATA0_B = 370, + FN_IP3_19_16___3 = 371, + FN_A5___3 = 372, + FN_SCK4_A___3 = 373, + FN_MSIOF3_SCK_B___3 = 374, + FN_VI4_DATA9___3 = 375, + FN_PWM3_B___3 = 376, + FN_RIF2_SYNC_B___3 = 377, + FN_QPOLA___3 = 378, + FN_IP0_23_20___3 = 379, + FN_QSPI1_SPCLK = 380, + FN_RIF2_CLK_A___3 = 381, + FN_HSCK4_B = 382, + FN_VI4_DATA0_A___3 = 383, + FN_IP1_23_20___3 = 384, + FN_AVB_RD0 = 385, + FN_IP2_23_20___3 = 386, + FN_RD_WR_N___3 = 387, + FN_SCL7_A = 388, + FN_AVB_AVTP_MATCH = 389, + FN_VI4_VSYNC_N___3 = 390, + FN_TX5_B___3 = 391, + FN_SCK3_C = 392, + FN_PWM5_A___3 = 393, + FN_IP3_23_20___3 = 394, + FN_A6___3 = 395, + FN_RX4_A___3 = 396, + FN_MSIOF3_RXD_B___3 = 397, + FN_VI4_DATA10___3 = 398, + FN_RIF2_D0_B___3 = 399, + FN_IP0_27_24___3 = 400, + FN_QSPI1_MOSI_IO0 = 401, + FN_RIF2_SYNC_A___3 = 402, + FN_HTX4_B___3 = 403, + FN_VI4_DATA1_A___3 = 404, + FN_IP1_27_24___3 = 405, + FN_AVB_RD1 = 406, + FN_IP2_27_24___3 = 407, + FN_EX_WAIT0 = 408, + FN_SDA7_A = 409, + FN_AVB_AVTP_CAPTURE = 410, + FN_VI4_HSYNC_N___3 = 411, + FN_RX5_B___3 = 412, + FN_PWM6_A___3 = 413, + FN_IP3_27_24___3 = 414, + FN_A7___3 = 415, + FN_TX4_A___3 = 416, + FN_MSIOF3_TXD_B___3 = 417, + FN_VI4_DATA11___3 = 418, + FN_RIF2_D1_B___3 = 419, + FN_IP0_31_28___3 = 420, + FN_QSPI1_MISO_IO1 = 421, + FN_RIF2_D0_A___3 = 422, + FN_HRX4_B___3 = 423, + FN_VI4_DATA2_A___3 = 424, + FN_IP1_31_28___3 = 425, + FN_AVB_RD2 = 426, + FN_IP2_31_28___3 = 427, + FN_A0___3 = 428, + FN_IRQ0___3 = 429, + FN_PWM2_A___3 = 430, + FN_MSIOF3_SS1_B___3 = 431, + FN_VI5_CLK_A = 432, + FN_DU_CDE___3 = 433, + FN_HRX3_D___3 = 434, + FN_IERX = 435, + FN_QSTB_QHE___3 = 436, + FN_IP3_31_28___3 = 437, + FN_A8___3 = 438, + FN_SDA6_A___3 = 439, + FN_RX3_B___3 = 440, + FN_HRX4_C = 441, + FN_VI5_HSYNC_N_A = 442, + FN_DU_HSYNC = 443, + FN_VI4_DATA0_B___3 = 444, + FN_QSTH_QHS___3 = 445, + FN_IP4_3_0___3 = 446, + FN_A9___3 = 447, + FN_TX5_A___3 = 448, + FN_IRQ3___3 = 449, + FN_VI4_DATA16___3 = 450, + FN_VI5_VSYNC_N_A = 451, + FN_DU_DG7___3 = 452, + FN_LCDOUT15___3 = 453, + FN_IP5_3_0___3 = 454, + FN_A17___3 = 455, + FN_MSIOF1_RXD = 456, + FN_VI4_DATA20___3 = 457, + FN_VI5_DATA6_A = 458, + FN_DU_DB6___3 = 459, + FN_LCDOUT6___3 = 460, + FN_IP6_3_0___3 = 461, + FN_D3___3 = 462, + FN_MSIOF3_TXD_A___3 = 463, + FN_TX5_C = 464, + FN_VI5_DATA15_A = 465, + FN_DU_DR4___3 = 466, + FN_TX4_C___3 = 467, + FN_LCDOUT20___3 = 468, + FN_IP7_3_0___3 = 469, + FN_D11___3 = 470, + FN_MSIOF2_TXD_A___3 = 471, + FN_VI5_DATA11_A = 472, + FN_DU_DG2___3 = 473, + FN_RIF3_D1_B___3 = 474, + FN_HRTS3_N_E = 475, + FN_LCDOUT10___3 = 476, + FN_IP4_7_4___3 = 477, + FN_A10___3 = 478, + FN_IRQ4___3 = 479, + FN_MSIOF2_SYNC_B___3 = 480, + FN_VI4_DATA13___3 = 481, + FN_VI5_FIELD_A = 482, + FN_DU_DG5___3 = 483, + FN_FSCLKST2_N_B___2 = 484, + FN_LCDOUT13___3 = 485, + FN_IP5_7_4___3 = 486, + FN_A18___3 = 487, + FN_MSIOF1_TXD = 488, + FN_VI4_DATA21___3 = 489, + FN_VI5_DATA7_A = 490, + FN_DU_DB0___3 = 491, + FN_HRX4_E = 492, + FN_LCDOUT0___3 = 493, + FN_IP6_7_4___3 = 494, + FN_D4___3 = 495, + FN_CANFD1_TX___3 = 496, + FN_HSCK3_B = 497, + FN_CAN1_TX___3 = 498, + FN_RTS3_N_A = 499, + FN_MSIOF3_SS2_A___3 = 500, + FN_VI5_DATA1_B = 501, + FN_IP7_7_4___3 = 502, + FN_D12___3 = 503, + FN_CANFD0_TX = 504, + FN_TX4_B___3 = 505, + FN_CAN0_TX = 506, + FN_VI5_DATA8_A = 507, + FN_VI5_DATA3_B = 508, + FN_IP4_11_8___3 = 509, + FN_A11___3 = 510, + FN_SCL6_A___3 = 511, + FN_TX3_B___3 = 512, + FN_HTX4_C = 513, + FN_DU_VSYNC = 514, + FN_VI4_DATA1_B___3 = 515, + FN_QSTVA_QVS___3 = 516, + FN_IP5_11_8___3 = 517, + FN_A19___3 = 518, + FN_MSIOF1_SCK = 519, + FN_VI4_DATA22___3 = 520, + FN_VI5_DATA2_A = 521, + FN_DU_DB1___3 = 522, + FN_HTX4_E = 523, + FN_LCDOUT1___3 = 524, + FN_IP6_11_8___3 = 525, + FN_D5___3 = 526, + FN_RX3_A___3 = 527, + FN_HRX3_B___3 = 528, + FN_DU_DR5___3 = 529, + FN_VI4_DATA4_B___3 = 530, + FN_LCDOUT21___3 = 531, + FN_IP7_11_8___3 = 532, + FN_D13___3 = 533, + FN_CANFD0_RX = 534, + FN_RX4_B___3 = 535, + FN_CAN0_RX = 536, + FN_VI5_DATA9_A = 537, + FN_SCL7_B = 538, + FN_VI5_DATA4_B = 539, + FN_IP4_15_12___3 = 540, + FN_A12___3 = 541, + FN_RX5_A___3 = 542, + FN_MSIOF2_SS2_B___3 = 543, + FN_VI4_DATA17___3 = 544, + FN_VI5_DATA3_A = 545, + FN_DU_DG6___3 = 546, + FN_LCDOUT14___3 = 547, + FN_IP5_15_12___3 = 548, + FN_CS0_N___3 = 549, + FN_SCL5 = 550, + FN_DU_DR0___3 = 551, + FN_VI4_DATA2_B___3 = 552, + FN_LCDOUT16___3 = 553, + FN_IP6_15_12___3 = 554, + FN_D6___3 = 555, + FN_TX3_A___3 = 556, + FN_HTX3_B___3 = 557, + FN_DU_DR6___3 = 558, + FN_VI4_DATA5_B___3 = 559, + FN_LCDOUT22___3 = 560, + FN_IP7_15_12 = 561, + FN_D14___3 = 562, + FN_CAN_CLK___3 = 563, + FN_HRX3_A___3 = 564, + FN_MSIOF2_SS2_A___3 = 565, + FN_SDA7_B = 566, + FN_VI5_DATA5_B = 567, + FN_IP4_19_16___3 = 568, + FN_A13___3 = 569, + FN_SCK5_A___3 = 570, + FN_MSIOF2_SCK_B___3 = 571, + FN_VI4_DATA14___3 = 572, + FN_HRX4_D = 573, + FN_DU_DB2___3 = 574, + FN_LCDOUT2___3 = 575, + FN_IP5_19_16___3 = 576, + FN_WE0_N___3 = 577, + FN_SDA5 = 578, + FN_DU_DR1___3 = 579, + FN_VI4_DATA3_B___3 = 580, + FN_LCDOUT17___3 = 581, + FN_IP6_19_16___3 = 582, + FN_D7___3 = 583, + FN_CANFD1_RX___3 = 584, + FN_IRQ5___3 = 585, + FN_CAN1_RX___3 = 586, + FN_CTS3_N_A = 587, + FN_VI5_DATA2_B = 588, + FN_IP7_19_16___3 = 589, + FN_D15___3 = 590, + FN_MSIOF2_SS1_A___3 = 591, + FN_HTX3_A___3 = 592, + FN_MSIOF3_SS1_A___3 = 593, + FN_DU_DG3___3 = 594, + FN_LCDOUT11___3 = 595, + FN_IP4_23_20___3 = 596, + FN_A14___3 = 597, + FN_MSIOF1_SS1 = 598, + FN_MSIOF2_RXD_B___3 = 599, + FN_VI4_DATA15___3 = 600, + FN_HTX4_D = 601, + FN_DU_DB3___3 = 602, + FN_LCDOUT3___3 = 603, + FN_IP5_23_20___3 = 604, + FN_D0___3 = 605, + FN_MSIOF3_SCK_A___3 = 606, + FN_DU_DR2___3 = 607, + FN_CTS4_N_C___3 = 608, + FN_LCDOUT18___3 = 609, + FN_IP6_23_20___3 = 610, + FN_D8___3 = 611, + FN_MSIOF2_SCK_A___3 = 612, + FN_SCK4_B___3 = 613, + FN_VI5_DATA12_A = 614, + FN_DU_DR7___3 = 615, + FN_RIF3_CLK_B___3 = 616, + FN_HCTS3_N_E = 617, + FN_LCDOUT23___3 = 618, + FN_IP7_23_20___3 = 619, + FN_SCL4 = 620, + FN_CS1_N_A26 = 621, + FN_DU_DOTCLKIN0 = 622, + FN_VI4_DATA6_B___3 = 623, + FN_VI5_DATA6_B = 624, + FN_QCLK___3 = 625, + FN_IP4_27_24___3 = 626, + FN_A15___3 = 627, + FN_MSIOF1_SS2 = 628, + FN_MSIOF2_TXD_B___3 = 629, + FN_VI4_DATA18___3 = 630, + FN_VI5_DATA4_A = 631, + FN_DU_DB4___3 = 632, + FN_LCDOUT4___3 = 633, + FN_IP5_27_24___3 = 634, + FN_D1___3 = 635, + FN_MSIOF3_SYNC_A___3 = 636, + FN_SCK3_A = 637, + FN_VI4_DATA23___3 = 638, + FN_VI5_CLKENB_A = 639, + FN_DU_DB7___3 = 640, + FN_RTS4_N_C___3 = 641, + FN_LCDOUT7___3 = 642, + FN_IP6_27_24___3 = 643, + FN_D9___3 = 644, + FN_MSIOF2_SYNC_A___3 = 645, + FN_VI5_DATA10_A = 646, + FN_DU_DG0___3 = 647, + FN_RIF3_SYNC_B___3 = 648, + FN_HRX3_E = 649, + FN_LCDOUT8___3 = 650, + FN_IP7_27_24___3 = 651, + FN_SDA4 = 652, + FN_WE1_N___3 = 653, + FN_VI4_DATA7_B___3 = 654, + FN_VI5_DATA7_B = 655, + FN_QPOLB___3 = 656, + FN_IP4_31_28___3 = 657, + FN_A16___3 = 658, + FN_MSIOF1_SYNC = 659, + FN_MSIOF2_SS1_B___3 = 660, + FN_VI4_DATA19___3 = 661, + FN_VI5_DATA5_A = 662, + FN_DU_DB5___3 = 663, + FN_LCDOUT5___3 = 664, + FN_IP5_31_28___3 = 665, + FN_D2___3 = 666, + FN_MSIOF3_RXD_A___3 = 667, + FN_RX5_C = 668, + FN_VI5_DATA14_A = 669, + FN_DU_DR3___3 = 670, + FN_RX4_C___3 = 671, + FN_LCDOUT19___3 = 672, + FN_IP6_31_28___3 = 673, + FN_D10___3 = 674, + FN_MSIOF2_RXD_A___3 = 675, + FN_VI5_DATA13_A = 676, + FN_DU_DG1___3 = 677, + FN_RIF3_D0_B___3 = 678, + FN_HTX3_E = 679, + FN_LCDOUT9___3 = 680, + FN_IP7_31_28___3 = 681, + FN_SD0_CLK___3 = 682, + FN_NFDATA8___3 = 683, + FN_SCL1_C = 684, + FN_HSCK1_B___3 = 685, + FN_SDA2_E = 686, + FN_FMCLK_B___3 = 687, + FN_IP8_3_0___3 = 688, + FN_SD0_CMD___3 = 689, + FN_NFDATA9___3 = 690, + FN_HRX1_B___3 = 691, + FN_SPEEDIN_B___3 = 692, + FN_IP9_3_0___3 = 693, + FN_SD1_DAT1___3 = 694, + FN_NFCE_N_B___3 = 695, + FN_IP10_3_0___3 = 696, + FN_SD3_DAT3___3 = 697, + FN_NFDATA3___3 = 698, + FN_IP11_3_0___3 = 699, + FN_SD1_CD___3 = 700, + FN_NFCE_N_A___3 = 701, + FN_SSI_SCK1 = 702, + FN_RIF0_D1_B___3 = 703, + FN_TS_SDEN0 = 704, + FN_IP8_7_4___3 = 705, + FN_SD0_DAT0___3 = 706, + FN_NFDATA10___3 = 707, + FN_HTX1_B___3 = 708, + FN_REMOCON_B___3 = 709, + FN_IP9_7_4___3 = 710, + FN_SD1_DAT2___3 = 711, + FN_NFALE_B = 712, + FN_IP10_7_4___3 = 713, + FN_SD3_DAT4___3 = 714, + FN_NFDATA4___3 = 715, + FN_IP11_7_4___3 = 716, + FN_SD1_WP___3 = 717, + FN_NFWP_N_A___3 = 718, + FN_SSI_WS1 = 719, + FN_RIF0_SYNC_B___3 = 720, + FN_TS_SPSYNC0 = 721, + FN_IP8_11_8___3 = 722, + FN_SD0_DAT1___3 = 723, + FN_NFDATA11___3 = 724, + FN_SDA2_C = 725, + FN_HCTS1_N_B___3 = 726, + FN_FMIN_B___3 = 727, + FN_IP9_11_8___3 = 728, + FN_SD1_DAT3___3 = 729, + FN_NFRB_N_B___3 = 730, + FN_IP10_11_8___3 = 731, + FN_SD3_DAT5___3 = 732, + FN_NFDATA5___3 = 733, + FN_IP11_11_8___3 = 734, + FN_RX0_A = 735, + FN_HRX1_A___3 = 736, + FN_SSI_SCK2_A___3 = 737, + FN_RIF1_SYNC = 738, + FN_TS_SCK1 = 739, + FN_IP8_15_12___3 = 740, + FN_SD0_DAT2___3 = 741, + FN_NFDATA12___3 = 742, + FN_SCL2_C = 743, + FN_HRTS1_N_B___3 = 744, + FN_BPFCLK_B___3 = 745, + FN_IP9_15_12___3 = 746, + FN_SD3_CLK___3 = 747, + FN_NFWE_N___3 = 748, + FN_IP10_15_12___3 = 749, + FN_SD3_DAT6___3 = 750, + FN_NFDATA6___3 = 751, + FN_IP11_15_12___3 = 752, + FN_TX0_A = 753, + FN_HTX1_A___3 = 754, + FN_SSI_WS2_A___3 = 755, + FN_RIF1_D0 = 756, + FN_TS_SDAT1 = 757, + FN_IP8_19_16___3 = 758, + FN_SD0_DAT3___3 = 759, + FN_NFDATA13___3 = 760, + FN_SDA1_C = 761, + FN_SCL2_E = 762, + FN_SPEEDIN_C = 763, + FN_REMOCON_C = 764, + FN_IP9_19_16___3 = 765, + FN_SD3_CMD___3 = 766, + FN_NFRE_N___3 = 767, + FN_IP10_19_16___3 = 768, + FN_SD3_DAT7___3 = 769, + FN_NFDATA7___3 = 770, + FN_IP11_19_16___3 = 771, + FN_CTS0_N_A = 772, + FN_NFDATA14_A___3 = 773, + FN_AUDIO_CLKOUT_A___3 = 774, + FN_RIF1_D1 = 775, + FN_SCIF_CLK_A___3 = 776, + FN_FMCLK_A___3 = 777, + FN_IP8_23_20___3 = 778, + FN_SD1_CLK___3 = 779, + FN_NFDATA14_B___3 = 780, + FN_IP9_23_20___3 = 781, + FN_SD3_DAT0___3 = 782, + FN_NFDATA0___3 = 783, + FN_IP10_23_20___3 = 784, + FN_SD3_DS___3 = 785, + FN_NFCLE___3 = 786, + FN_IP11_23_20___3 = 787, + FN_RTS0_N_A = 788, + FN_NFDATA15_A___3 = 789, + FN_AUDIO_CLKOUT1_A___3 = 790, + FN_RIF1_CLK = 791, + FN_SCL2_A___3 = 792, + FN_FMIN_A___3 = 793, + FN_IP8_27_24___3 = 794, + FN_SD1_CMD___3 = 795, + FN_NFDATA15_B___3 = 796, + FN_IP9_27_24___3 = 797, + FN_SD3_DAT1___3 = 798, + FN_NFDATA1___3 = 799, + FN_IP10_27_24___3 = 800, + FN_SD0_CD___3 = 801, + FN_NFALE_A = 802, + FN_SD3_CD___3 = 803, + FN_RIF0_CLK_B___3 = 804, + FN_SCL2_B___3 = 805, + FN_TCLK1_A___3 = 806, + FN_SSI_SCK2_B___3 = 807, + FN_TS_SCK0 = 808, + FN_IP11_27_24___3 = 809, + FN_SCK0_A = 810, + FN_HSCK1_A___3 = 811, + FN_USB3HS0_ID = 812, + FN_RTS1_N___3 = 813, + FN_SDA2_A___3 = 814, + FN_FMCLK_C___3 = 815, + FN_USB0_ID = 816, + FN_IP8_31_28___3 = 817, + FN_SD1_DAT0___3 = 818, + FN_NFWP_N_B___3 = 819, + FN_IP9_31_28___3 = 820, + FN_SD3_DAT2___3 = 821, + FN_NFDATA2___3 = 822, + FN_IP10_31_28___3 = 823, + FN_SD0_WP___3 = 824, + FN_NFRB_N_A___3 = 825, + FN_SD3_WP___3 = 826, + FN_RIF0_D0_B___3 = 827, + FN_SDA2_B___3 = 828, + FN_TCLK2_A___3 = 829, + FN_SSI_WS2_B___3 = 830, + FN_TS_SDAT0 = 831, + FN_IP11_31_28___3 = 832, + FN_RX1 = 833, + FN_HRX2_B___3 = 834, + FN_SSI_SCK9_B___3 = 835, + FN_AUDIO_CLKOUT1_B___3 = 836, + FN_IP12_3_0___3 = 837, + FN_TX1 = 838, + FN_HTX2_B___3 = 839, + FN_SSI_WS9_B___3 = 840, + FN_AUDIO_CLKOUT3_B___3 = 841, + FN_IP13_3_0___3 = 842, + FN_MSIOF0_SS1___3 = 843, + FN_HRX2_A___3 = 844, + FN_SSI_SCK4___3 = 845, + FN_HCTS0_N_A = 846, + FN_BPFCLK_C___3 = 847, + FN_SPEEDIN_A___3 = 848, + FN_IP14_3_0___3 = 849, + FN_SSI_SDATA0___3 = 850, + FN_IP15_3_0___3 = 851, + FN_SSI_WS5___3 = 852, + FN_HTX0_B = 853, + FN_USB0_OVC_B = 854, + FN_SDA2_D = 855, + FN_IP12_7_4___3 = 856, + FN_SCK2_A = 857, + FN_HSCK0_A = 858, + FN_AUDIO_CLKB_A___3 = 859, + FN_CTS1_N___3 = 860, + FN_RIF0_CLK_A___3 = 861, + FN_REMOCON_A___3 = 862, + FN_SCIF_CLK_B___3 = 863, + FN_IP13_7_4___3 = 864, + FN_MSIOF0_SS2___3 = 865, + FN_HTX2_A___3 = 866, + FN_SSI_WS4___3 = 867, + FN_HRTS0_N_A = 868, + FN_FMIN_C___3 = 869, + FN_BPFCLK_A___3 = 870, + FN_IP14_7_4___3 = 871, + FN_SSI_SDATA1 = 872, + FN_AUDIO_CLKC_B___3 = 873, + FN_PWM0_B = 874, + FN_IP15_7_4___3 = 875, + FN_SSI_SDATA5___3 = 876, + FN_HSCK0_B = 877, + FN_AUDIO_CLKB_C = 878, + FN_TPU0TO0___3 = 879, + FN_IP12_11_8___3 = 880, + FN_TX2_A___3 = 881, + FN_HRX0_A = 882, + FN_AUDIO_CLKOUT2_A___3 = 883, + FN_SCL1_A___3 = 884, + FN_FSO_CFE_0_N_A = 885, + FN_TS_SDEN1 = 886, + FN_IP13_11_8___3 = 887, + FN_SSI_SDATA9 = 888, + FN_AUDIO_CLKC_A___3 = 889, + FN_SCK1___3 = 890, + FN_IP14_11_8___3 = 891, + FN_SSI_SDATA2 = 892, + FN_AUDIO_CLKOUT2_B___3 = 893, + FN_SSI_SCK9_A___3 = 894, + FN_PWM1_B___3 = 895, + FN_IP15_11_8___3 = 896, + FN_SSI_SCK6___3 = 897, + FN_HSCK2_A___3 = 898, + FN_AUDIO_CLKC_C = 899, + FN_TPU0TO1___3 = 900, + FN_FSO_CFE_0_N_B = 901, + FN_SIM0_RST_B___3 = 902, + FN_IP12_15_12___3 = 903, + FN_RX2_A___3 = 904, + FN_HTX0_A = 905, + FN_AUDIO_CLKOUT3_A___3 = 906, + FN_SDA1_A___3 = 907, + FN_FSO_CFE_1_N_A = 908, + FN_TS_SPSYNC1 = 909, + FN_IP13_15_12___3 = 910, + FN_MLB_CLK___3 = 911, + FN_RX0_B = 912, + FN_RIF0_D0_A___3 = 913, + FN_SCL1_B___3 = 914, + FN_TCLK1_B___3 = 915, + FN_SIM0_RST_A___3 = 916, + FN_IP14_15_12___3 = 917, + FN_SSI_SCK349___3 = 918, + FN_PWM2_C = 919, + FN_IP15_15_12___3 = 920, + FN_SSI_WS6___3 = 921, + FN_HCTS2_N_A___3 = 922, + FN_AUDIO_CLKOUT2_C = 923, + FN_TPU0TO2___3 = 924, + FN_SDA1_D = 925, + FN_FSO_CFE_1_N_B = 926, + FN_SIM0_D_B___3 = 927, + FN_IP12_19_16___3 = 928, + FN_MSIOF0_SCK___3 = 929, + FN_SSI_SCK78___3 = 930, + FN_IP13_19_16___3 = 931, + FN_MLB_SIG___3 = 932, + FN_SCK0_B = 933, + FN_RIF0_D1_A___3 = 934, + FN_SDA1_B___3 = 935, + FN_TCLK2_B___3 = 936, + FN_SIM0_D_A___3 = 937, + FN_IP14_19_16___3 = 938, + FN_SSI_WS349___3 = 939, + FN_PWM3_C = 940, + FN_IP15_19_16___3 = 941, + FN_SSI_SDATA6___3 = 942, + FN_HRTS2_N_A___3 = 943, + FN_AUDIO_CLKOUT3_C = 944, + FN_TPU0TO3___3 = 945, + FN_SCL1_D = 946, + FN_FSO_TOE_N_B = 947, + FN_SIM0_CLK_B___3 = 948, + FN_IP12_23_20___3 = 949, + FN_MSIOF0_RXD___3 = 950, + FN_SSI_WS78___3 = 951, + FN_TX2_B___3 = 952, + FN_IP13_23_20___3 = 953, + FN_MLB_DAT___3 = 954, + FN_TX0_B = 955, + FN_RIF0_SYNC_A___3 = 956, + FN_SIM0_CLK_A___3 = 957, + FN_IP14_23_20___3 = 958, + FN_SSI_SDATA3___3 = 959, + FN_AUDIO_CLKOUT1_C = 960, + FN_AUDIO_CLKB_B___3 = 961, + FN_PWM4_B___3 = 962, + FN_IP15_23_20___3 = 963, + FN_AUDIO_CLKA = 964, + FN_IP12_27_24___3 = 965, + FN_MSIOF0_TXD___3 = 966, + FN_SSI_SDATA7___3 = 967, + FN_RX2_B___3 = 968, + FN_IP13_27_24___3 = 969, + FN_SSI_SCK01239___3 = 970, + FN_IP14_27_24___3 = 971, + FN_SSI_SDATA4___3 = 972, + FN_SSI_WS9_A___3 = 973, + FN_PWM5_B___3 = 974, + FN_IP15_27_24___3 = 975, + FN_USB30_PWEN___3 = 976, + FN_USB0_PWEN_A = 977, + FN_IP12_31_28___3 = 978, + FN_MSIOF0_SYNC___3 = 979, + FN_AUDIO_CLKOUT_B___3 = 980, + FN_SSI_SDATA8___3 = 981, + FN_IP13_31_28___3 = 982, + FN_SSI_WS01239___3 = 983, + FN_IP14_31_28___3 = 984, + FN_SSI_SCK5___3 = 985, + FN_HRX0_B = 986, + FN_USB0_PWEN_B = 987, + FN_SCL2_D = 988, + FN_PWM6_B___3 = 989, + FN_IP15_31_28___3 = 990, + FN_USB30_OVC___3 = 991, + FN_USB0_OVC_A = 992, + FN_FSO_TOE_N_A = 993, + FN_SEL_SIMCARD_0___3 = 994, + FN_SEL_SIMCARD_1___3 = 995, + FN_SEL_ADGB_0___3 = 996, + FN_SEL_ADGB_2 = 997, + FN_SEL_ADGB_1___3 = 998, + FN_SEL_SSI2_0___3 = 999, + FN_SEL_SSI2_1___3 = 1000, + FN_SEL_TIMER_TMU_0___3 = 1001, + FN_SEL_TIMER_TMU_1___3 = 1002, + FN_SEL_DRIF0_0___3 = 1003, + FN_SEL_DRIF0_1___3 = 1004, + FN_SEL_USB_20_CH0_0 = 1005, + FN_SEL_USB_20_CH0_1 = 1006, + FN_SEL_FM_0___3 = 1007, + FN_SEL_FM_2___3 = 1008, + FN_SEL_FM_1___3 = 1009, + FN_SEL_DRIF2_0___3 = 1010, + FN_SEL_DRIF2_1___3 = 1011, + FN_SEL_FSO_0 = 1012, + FN_SEL_FSO_1 = 1013, + FN_SEL_DRIF3_0___3 = 1014, + FN_SEL_DRIF3_1___3 = 1015, + FN_SEL_HSCIF0_0 = 1016, + FN_SEL_HSCIF0_1 = 1017, + FN_SEL_HSCIF3_0___3 = 1018, + FN_SEL_HSCIF3_4 = 1019, + FN_SEL_HSCIF3_2___3 = 1020, + FN_SEL_HSCIF3_1___3 = 1021, + FN_SEL_HSCIF3_3___3 = 1022, + FN_SEL_HSCIF1_0___3 = 1023, + FN_SEL_HSCIF1_1___3 = 1024, + FN_SEL_HSCIF2_0___3 = 1025, + FN_SEL_HSCIF2_1___3 = 1026, + FN_SEL_I2C1_0___3 = 1027, + FN_SEL_I2C1_2 = 1028, + FN_SEL_I2C1_1___3 = 1029, + FN_SEL_I2C1_3 = 1030, + FN_SEL_HSCIF4_0___3 = 1031, + FN_SEL_HSCIF4_4 = 1032, + FN_SEL_HSCIF4_2 = 1033, + FN_SEL_HSCIF4_1___3 = 1034, + FN_SEL_HSCIF4_3 = 1035, + FN_SEL_I2C2_0___3 = 1036, + FN_SEL_I2C2_4 = 1037, + FN_SEL_I2C2_2 = 1038, + FN_SEL_I2C2_1___3 = 1039, + FN_SEL_I2C2_3 = 1040, + FN_SEL_I2C6_0___3 = 1041, + FN_SEL_I2C6_1___3 = 1042, + FN_SEL_I2C7_0 = 1043, + FN_SEL_I2C7_1 = 1044, + FN_SEL_NDF_0___3 = 1045, + FN_SEL_NDF_1___3 = 1046, + FN_SEL_MSIOF2_0___3 = 1047, + FN_SEL_MSIOF2_1___3 = 1048, + FN_SEL_PWM0_0 = 1049, + FN_SEL_PWM0_1 = 1050, + FN_SEL_MSIOF3_0___3 = 1051, + FN_SEL_MSIOF3_1___3 = 1052, + FN_SEL_PWM1_0___3 = 1053, + FN_SEL_PWM1_1___3 = 1054, + FN_SEL_SCIF3_0___3 = 1055, + FN_SEL_SCIF3_2 = 1056, + FN_SEL_SCIF3_1___3 = 1057, + FN_SEL_PWM2_0___3 = 1058, + FN_SEL_PWM2_2 = 1059, + FN_SEL_PWM2_1___3 = 1060, + FN_SEL_SCIF4_0___3 = 1061, + FN_SEL_SCIF4_2___3 = 1062, + FN_SEL_SCIF4_1___3 = 1063, + FN_SEL_PWM3_0___3 = 1064, + FN_SEL_PWM3_2 = 1065, + FN_SEL_PWM3_1___3 = 1066, + FN_SEL_SCIF5_0___3 = 1067, + FN_SEL_SCIF5_2 = 1068, + FN_SEL_SCIF5_1___3 = 1069, + FN_SEL_PWM4_0___3 = 1070, + FN_SEL_PWM4_1___3 = 1071, + FN_SEL_PWM5_0___3 = 1072, + FN_SEL_PWM5_1___3 = 1073, + FN_SEL_VIN4_0___3 = 1074, + FN_SEL_VIN4_1___3 = 1075, + FN_SEL_PWM6_0___3 = 1076, + FN_SEL_PWM6_1___3 = 1077, + FN_SEL_VIN5_0 = 1078, + FN_SEL_VIN5_1 = 1079, + FN_SEL_REMOCON_0___3 = 1080, + FN_SEL_REMOCON_2 = 1081, + FN_SEL_REMOCON_1___3 = 1082, + FN_SEL_ADGC_0___3 = 1083, + FN_SEL_ADGC_2 = 1084, + FN_SEL_ADGC_1___3 = 1085, + FN_SEL_SCIF_0___3 = 1086, + FN_SEL_SCIF_1___3 = 1087, + FN_SEL_SSI9_0___3 = 1088, + FN_SEL_SSI9_1___3 = 1089, + FN_SEL_SCIF0_0 = 1090, + FN_SEL_SCIF0_1 = 1091, + FN_SEL_SCIF2_0___3 = 1092, + FN_SEL_SCIF2_1___3 = 1093, + FN_SEL_SPEED_PULSE_IF_0 = 1094, + FN_SEL_SPEED_PULSE_IF_2 = 1095, + FN_SEL_SPEED_PULSE_IF_1 = 1096, + PINMUX_FUNCTION_END___3 = 1097, + PINMUX_MARK_BEGIN___3 = 1098, + AVB_PHY_INT_MARK___3 = 1099, + CLKOUT_MARK___3 = 1100, + AVB_RD3_MARK___3 = 1101, + AVB_RXC_MARK___3 = 1102, + AVB_RX_CTL_MARK___3 = 1103, + QSPI0_SSL_MARK___3 = 1104, + IP0_3_0_MARK___3 = 1105, + QSPI0_SPCLK_MARK___3 = 1106, + HSCK4_A_MARK = 1107, + IP1_3_0_MARK___3 = 1108, + QSPI1_IO2_MARK___3 = 1109, + RIF2_D1_A_MARK___3 = 1110, + HTX3_C_MARK___3 = 1111, + VI4_DATA3_A_MARK___3 = 1112, + IP2_3_0_MARK___3 = 1113, + AVB_TXCREFCLK_MARK___3 = 1114, + IP3_3_0_MARK___3 = 1115, + A1_MARK___3 = 1116, + IRQ1_MARK___3 = 1117, + PWM3_A_MARK___3 = 1118, + DU_DOTCLKIN1_MARK___3 = 1119, + VI5_DATA0_A_MARK = 1120, + DU_DISP_CDE_MARK = 1121, + SDA6_B_MARK___3 = 1122, + IETX_MARK = 1123, + QCPV_QDE_MARK___3 = 1124, + IP0_7_4_MARK___3 = 1125, + QSPI0_MOSI_IO0_MARK___3 = 1126, + HCTS4_N_A_MARK = 1127, + IP1_7_4_MARK___3 = 1128, + QSPI1_IO3_MARK___3 = 1129, + RIF3_CLK_A_MARK___3 = 1130, + HRX3_C_MARK___3 = 1131, + VI4_DATA4_A_MARK___3 = 1132, + IP2_7_4_MARK___3 = 1133, + AVB_MDIO_MARK___3 = 1134, + IP3_7_4_MARK___3 = 1135, + A2_MARK___3 = 1136, + IRQ2_MARK___3 = 1137, + AVB_AVTP_PPS_MARK___3 = 1138, + VI4_CLKENB_MARK___3 = 1139, + VI5_DATA1_A_MARK = 1140, + DU_DISP_MARK___3 = 1141, + SCL6_B_MARK___3 = 1142, + QSTVB_QVE_MARK___3 = 1143, + IP0_11_8_MARK___3 = 1144, + QSPI0_MISO_IO1_MARK___3 = 1145, + HRTS4_N_A_MARK = 1146, + IP1_11_8_MARK___3 = 1147, + QSPI1_SSL_MARK___3 = 1148, + RIF3_SYNC_A_MARK___3 = 1149, + HSCK3_C_MARK = 1150, + VI4_DATA5_A_MARK___3 = 1151, + IP2_11_8_MARK___3 = 1152, + AVB_MDC_MARK___3 = 1153, + IP3_11_8_MARK___3 = 1154, + A3_MARK___3 = 1155, + CTS4_N_A_MARK___3 = 1156, + PWM4_A_MARK___3 = 1157, + VI4_DATA12_MARK___3 = 1158, + DU_DOTCLKOUT0_MARK___3 = 1159, + HTX3_D_MARK___3 = 1160, + IECLK_MARK = 1161, + LCDOUT12_MARK___3 = 1162, + IP0_15_12_MARK___3 = 1163, + QSPI0_IO2_MARK___3 = 1164, + HTX4_A_MARK___3 = 1165, + IP1_15_12_MARK___3 = 1166, + RPC_INT_N_MARK = 1167, + RIF3_D0_A_MARK___3 = 1168, + HCTS3_N_C_MARK = 1169, + VI4_DATA6_A_MARK___3 = 1170, + IP2_15_12_MARK___3 = 1171, + BS_N_MARK___3 = 1172, + PWM0_A_MARK = 1173, + AVB_MAGIC_MARK___3 = 1174, + VI4_CLK_MARK___3 = 1175, + TX3_C_MARK = 1176, + VI5_CLK_B_MARK = 1177, + IP3_15_12_MARK___3 = 1178, + A4_MARK___3 = 1179, + RTS4_N_A_MARK___3 = 1180, + MSIOF3_SYNC_B_MARK___3 = 1181, + VI4_DATA8_MARK___3 = 1182, + PWM2_B_MARK___3 = 1183, + DU_DG4_MARK___3 = 1184, + RIF2_CLK_B_MARK___3 = 1185, + IP0_19_16_MARK___3 = 1186, + QSPI0_IO3_MARK___3 = 1187, + HRX4_A_MARK___3 = 1188, + IP1_19_16_MARK___3 = 1189, + RPC_RESET_N_MARK = 1190, + RIF3_D1_A_MARK___3 = 1191, + HRTS3_N_C_MARK = 1192, + VI4_DATA7_A_MARK___3 = 1193, + IP2_19_16_MARK___3 = 1194, + RD_N_MARK___3 = 1195, + PWM1_A_MARK___3 = 1196, + AVB_LINK_MARK___3 = 1197, + VI4_FIELD_MARK___3 = 1198, + RX3_C_MARK = 1199, + FSCLKST2_N_A_MARK___2 = 1200, + VI5_DATA0_B_MARK = 1201, + IP3_19_16_MARK___3 = 1202, + A5_MARK___3 = 1203, + SCK4_A_MARK___3 = 1204, + MSIOF3_SCK_B_MARK___3 = 1205, + VI4_DATA9_MARK___3 = 1206, + PWM3_B_MARK___3 = 1207, + RIF2_SYNC_B_MARK___3 = 1208, + QPOLA_MARK___3 = 1209, + IP0_23_20_MARK___3 = 1210, + QSPI1_SPCLK_MARK___3 = 1211, + RIF2_CLK_A_MARK___3 = 1212, + HSCK4_B_MARK = 1213, + VI4_DATA0_A_MARK___3 = 1214, + IP1_23_20_MARK___3 = 1215, + AVB_RD0_MARK___3 = 1216, + IP2_23_20_MARK___3 = 1217, + RD_WR_N_MARK___3 = 1218, + SCL7_A_MARK = 1219, + AVB_AVTP_MATCH_MARK = 1220, + VI4_VSYNC_N_MARK___3 = 1221, + TX5_B_MARK___3 = 1222, + SCK3_C_MARK = 1223, + PWM5_A_MARK___3 = 1224, + IP3_23_20_MARK___3 = 1225, + A6_MARK___3 = 1226, + RX4_A_MARK___3 = 1227, + MSIOF3_RXD_B_MARK___3 = 1228, + VI4_DATA10_MARK___3 = 1229, + RIF2_D0_B_MARK___3 = 1230, + IP0_27_24_MARK___3 = 1231, + QSPI1_MOSI_IO0_MARK___3 = 1232, + RIF2_SYNC_A_MARK___3 = 1233, + HTX4_B_MARK___3 = 1234, + VI4_DATA1_A_MARK___3 = 1235, + IP1_27_24_MARK___3 = 1236, + AVB_RD1_MARK___3 = 1237, + IP2_27_24_MARK___3 = 1238, + EX_WAIT0_MARK = 1239, + SDA7_A_MARK = 1240, + AVB_AVTP_CAPTURE_MARK = 1241, + VI4_HSYNC_N_MARK___3 = 1242, + RX5_B_MARK___3 = 1243, + PWM6_A_MARK___3 = 1244, + IP3_27_24_MARK___3 = 1245, + A7_MARK___3 = 1246, + TX4_A_MARK___3 = 1247, + MSIOF3_TXD_B_MARK___3 = 1248, + VI4_DATA11_MARK___3 = 1249, + RIF2_D1_B_MARK___3 = 1250, + IP0_31_28_MARK___3 = 1251, + QSPI1_MISO_IO1_MARK___3 = 1252, + RIF2_D0_A_MARK___3 = 1253, + HRX4_B_MARK___3 = 1254, + VI4_DATA2_A_MARK___3 = 1255, + IP1_31_28_MARK___3 = 1256, + AVB_RD2_MARK___3 = 1257, + IP2_31_28_MARK___3 = 1258, + A0_MARK___3 = 1259, + IRQ0_MARK___3 = 1260, + PWM2_A_MARK___3 = 1261, + MSIOF3_SS1_B_MARK___3 = 1262, + VI5_CLK_A_MARK = 1263, + DU_CDE_MARK___3 = 1264, + HRX3_D_MARK___3 = 1265, + IERX_MARK = 1266, + QSTB_QHE_MARK___3 = 1267, + IP3_31_28_MARK___3 = 1268, + A8_MARK___3 = 1269, + SDA6_A_MARK___3 = 1270, + RX3_B_MARK___3 = 1271, + HRX4_C_MARK = 1272, + VI5_HSYNC_N_A_MARK = 1273, + DU_HSYNC_MARK = 1274, + VI4_DATA0_B_MARK___3 = 1275, + QSTH_QHS_MARK___3 = 1276, + IP4_3_0_MARK___3 = 1277, + A9_MARK___3 = 1278, + TX5_A_MARK___3 = 1279, + IRQ3_MARK___3 = 1280, + VI4_DATA16_MARK___3 = 1281, + VI5_VSYNC_N_A_MARK = 1282, + DU_DG7_MARK___3 = 1283, + LCDOUT15_MARK___3 = 1284, + IP5_3_0_MARK___3 = 1285, + A17_MARK___3 = 1286, + MSIOF1_RXD_MARK = 1287, + VI4_DATA20_MARK___3 = 1288, + VI5_DATA6_A_MARK = 1289, + DU_DB6_MARK___3 = 1290, + LCDOUT6_MARK___3 = 1291, + IP6_3_0_MARK___3 = 1292, + D3_MARK___3 = 1293, + MSIOF3_TXD_A_MARK___3 = 1294, + TX5_C_MARK = 1295, + VI5_DATA15_A_MARK = 1296, + DU_DR4_MARK___3 = 1297, + TX4_C_MARK___3 = 1298, + LCDOUT20_MARK___3 = 1299, + IP7_3_0_MARK___3 = 1300, + D11_MARK___3 = 1301, + MSIOF2_TXD_A_MARK___3 = 1302, + VI5_DATA11_A_MARK = 1303, + DU_DG2_MARK___3 = 1304, + RIF3_D1_B_MARK___3 = 1305, + HRTS3_N_E_MARK = 1306, + LCDOUT10_MARK___3 = 1307, + IP4_7_4_MARK___3 = 1308, + A10_MARK___3 = 1309, + IRQ4_MARK___3 = 1310, + MSIOF2_SYNC_B_MARK___3 = 1311, + VI4_DATA13_MARK___3 = 1312, + VI5_FIELD_A_MARK = 1313, + DU_DG5_MARK___3 = 1314, + FSCLKST2_N_B_MARK___2 = 1315, + LCDOUT13_MARK___3 = 1316, + IP5_7_4_MARK___3 = 1317, + A18_MARK___3 = 1318, + MSIOF1_TXD_MARK = 1319, + VI4_DATA21_MARK___3 = 1320, + VI5_DATA7_A_MARK = 1321, + DU_DB0_MARK___3 = 1322, + HRX4_E_MARK = 1323, + LCDOUT0_MARK___3 = 1324, + IP6_7_4_MARK___3 = 1325, + D4_MARK___3 = 1326, + CANFD1_TX_MARK___3 = 1327, + HSCK3_B_MARK = 1328, + CAN1_TX_MARK___3 = 1329, + RTS3_N_A_MARK = 1330, + MSIOF3_SS2_A_MARK___3 = 1331, + VI5_DATA1_B_MARK = 1332, + IP7_7_4_MARK___3 = 1333, + D12_MARK___3 = 1334, + CANFD0_TX_MARK = 1335, + TX4_B_MARK___3 = 1336, + CAN0_TX_MARK = 1337, + VI5_DATA8_A_MARK = 1338, + VI5_DATA3_B_MARK = 1339, + IP4_11_8_MARK___3 = 1340, + A11_MARK___3 = 1341, + SCL6_A_MARK___3 = 1342, + TX3_B_MARK___3 = 1343, + HTX4_C_MARK = 1344, + DU_VSYNC_MARK = 1345, + VI4_DATA1_B_MARK___3 = 1346, + QSTVA_QVS_MARK___3 = 1347, + IP5_11_8_MARK___3 = 1348, + A19_MARK___3 = 1349, + MSIOF1_SCK_MARK = 1350, + VI4_DATA22_MARK___3 = 1351, + VI5_DATA2_A_MARK = 1352, + DU_DB1_MARK___3 = 1353, + HTX4_E_MARK = 1354, + LCDOUT1_MARK___3 = 1355, + IP6_11_8_MARK___3 = 1356, + D5_MARK___3 = 1357, + RX3_A_MARK___3 = 1358, + HRX3_B_MARK___3 = 1359, + DU_DR5_MARK___3 = 1360, + VI4_DATA4_B_MARK___3 = 1361, + LCDOUT21_MARK___3 = 1362, + IP7_11_8_MARK___3 = 1363, + D13_MARK___3 = 1364, + CANFD0_RX_MARK = 1365, + RX4_B_MARK___3 = 1366, + CAN0_RX_MARK = 1367, + VI5_DATA9_A_MARK = 1368, + SCL7_B_MARK = 1369, + VI5_DATA4_B_MARK = 1370, + IP4_15_12_MARK___3 = 1371, + A12_MARK___3 = 1372, + RX5_A_MARK___3 = 1373, + MSIOF2_SS2_B_MARK___3 = 1374, + VI4_DATA17_MARK___3 = 1375, + VI5_DATA3_A_MARK = 1376, + DU_DG6_MARK___3 = 1377, + LCDOUT14_MARK___3 = 1378, + IP5_15_12_MARK___3 = 1379, + CS0_N_MARK___3 = 1380, + SCL5_MARK___3 = 1381, + DU_DR0_MARK___3 = 1382, + VI4_DATA2_B_MARK___3 = 1383, + LCDOUT16_MARK___3 = 1384, + IP6_15_12_MARK___3 = 1385, + D6_MARK___3 = 1386, + TX3_A_MARK___3 = 1387, + HTX3_B_MARK___3 = 1388, + DU_DR6_MARK___3 = 1389, + VI4_DATA5_B_MARK___3 = 1390, + LCDOUT22_MARK___3 = 1391, + IP7_15_12_MARK = 1392, + D14_MARK___3 = 1393, + CAN_CLK_MARK___3 = 1394, + HRX3_A_MARK___3 = 1395, + MSIOF2_SS2_A_MARK___3 = 1396, + SDA7_B_MARK = 1397, + VI5_DATA5_B_MARK = 1398, + IP4_19_16_MARK___3 = 1399, + A13_MARK___3 = 1400, + SCK5_A_MARK___3 = 1401, + MSIOF2_SCK_B_MARK___3 = 1402, + VI4_DATA14_MARK___3 = 1403, + HRX4_D_MARK = 1404, + DU_DB2_MARK___3 = 1405, + LCDOUT2_MARK___3 = 1406, + IP5_19_16_MARK___3 = 1407, + WE0_N_MARK___3 = 1408, + SDA5_MARK___3 = 1409, + DU_DR1_MARK___3 = 1410, + VI4_DATA3_B_MARK___3 = 1411, + LCDOUT17_MARK___3 = 1412, + IP6_19_16_MARK___3 = 1413, + D7_MARK___3 = 1414, + CANFD1_RX_MARK___3 = 1415, + IRQ5_MARK___3 = 1416, + CAN1_RX_MARK___3 = 1417, + CTS3_N_A_MARK = 1418, + VI5_DATA2_B_MARK = 1419, + IP7_19_16_MARK___3 = 1420, + D15_MARK___3 = 1421, + MSIOF2_SS1_A_MARK___3 = 1422, + HTX3_A_MARK___3 = 1423, + MSIOF3_SS1_A_MARK___3 = 1424, + DU_DG3_MARK___3 = 1425, + LCDOUT11_MARK___3 = 1426, + IP4_23_20_MARK___3 = 1427, + A14_MARK___3 = 1428, + MSIOF1_SS1_MARK = 1429, + MSIOF2_RXD_B_MARK___3 = 1430, + VI4_DATA15_MARK___3 = 1431, + HTX4_D_MARK = 1432, + DU_DB3_MARK___3 = 1433, + LCDOUT3_MARK___3 = 1434, + IP5_23_20_MARK___3 = 1435, + D0_MARK___3 = 1436, + MSIOF3_SCK_A_MARK___3 = 1437, + DU_DR2_MARK___3 = 1438, + CTS4_N_C_MARK___3 = 1439, + LCDOUT18_MARK___3 = 1440, + IP6_23_20_MARK___3 = 1441, + D8_MARK___3 = 1442, + MSIOF2_SCK_A_MARK___3 = 1443, + SCK4_B_MARK___3 = 1444, + VI5_DATA12_A_MARK = 1445, + DU_DR7_MARK___3 = 1446, + RIF3_CLK_B_MARK___3 = 1447, + HCTS3_N_E_MARK = 1448, + LCDOUT23_MARK___3 = 1449, + IP7_23_20_MARK___3 = 1450, + SCL4_MARK = 1451, + CS1_N_A26_MARK = 1452, + DU_DOTCLKIN0_MARK___3 = 1453, + VI4_DATA6_B_MARK___3 = 1454, + VI5_DATA6_B_MARK = 1455, + QCLK_MARK___3 = 1456, + IP4_27_24_MARK___3 = 1457, + A15_MARK___3 = 1458, + MSIOF1_SS2_MARK = 1459, + MSIOF2_TXD_B_MARK___3 = 1460, + VI4_DATA18_MARK___3 = 1461, + VI5_DATA4_A_MARK = 1462, + DU_DB4_MARK___3 = 1463, + LCDOUT4_MARK___3 = 1464, + IP5_27_24_MARK___3 = 1465, + D1_MARK___3 = 1466, + MSIOF3_SYNC_A_MARK___3 = 1467, + SCK3_A_MARK = 1468, + VI4_DATA23_MARK___3 = 1469, + VI5_CLKENB_A_MARK = 1470, + DU_DB7_MARK___3 = 1471, + RTS4_N_C_MARK___3 = 1472, + LCDOUT7_MARK___3 = 1473, + IP6_27_24_MARK___3 = 1474, + D9_MARK___3 = 1475, + MSIOF2_SYNC_A_MARK___3 = 1476, + VI5_DATA10_A_MARK = 1477, + DU_DG0_MARK___3 = 1478, + RIF3_SYNC_B_MARK___3 = 1479, + HRX3_E_MARK = 1480, + LCDOUT8_MARK___3 = 1481, + IP7_27_24_MARK___3 = 1482, + SDA4_MARK = 1483, + WE1_N_MARK___3 = 1484, + VI4_DATA7_B_MARK___3 = 1485, + VI5_DATA7_B_MARK = 1486, + QPOLB_MARK___3 = 1487, + IP4_31_28_MARK___3 = 1488, + A16_MARK___3 = 1489, + MSIOF1_SYNC_MARK = 1490, + MSIOF2_SS1_B_MARK___3 = 1491, + VI4_DATA19_MARK___3 = 1492, + VI5_DATA5_A_MARK = 1493, + DU_DB5_MARK___3 = 1494, + LCDOUT5_MARK___3 = 1495, + IP5_31_28_MARK___3 = 1496, + D2_MARK___3 = 1497, + MSIOF3_RXD_A_MARK___3 = 1498, + RX5_C_MARK = 1499, + VI5_DATA14_A_MARK = 1500, + DU_DR3_MARK___3 = 1501, + RX4_C_MARK___3 = 1502, + LCDOUT19_MARK___3 = 1503, + IP6_31_28_MARK___3 = 1504, + D10_MARK___3 = 1505, + MSIOF2_RXD_A_MARK___3 = 1506, + VI5_DATA13_A_MARK = 1507, + DU_DG1_MARK___3 = 1508, + RIF3_D0_B_MARK___3 = 1509, + HTX3_E_MARK = 1510, + LCDOUT9_MARK___3 = 1511, + IP7_31_28_MARK___3 = 1512, + SD0_CLK_MARK___3 = 1513, + NFDATA8_MARK___3 = 1514, + SCL1_C_MARK = 1515, + HSCK1_B_MARK___3 = 1516, + SDA2_E_MARK = 1517, + FMCLK_B_MARK___3 = 1518, + IP8_3_0_MARK___3 = 1519, + SD0_CMD_MARK___3 = 1520, + NFDATA9_MARK___3 = 1521, + HRX1_B_MARK___3 = 1522, + SPEEDIN_B_MARK___3 = 1523, + IP9_3_0_MARK___3 = 1524, + SD1_DAT1_MARK___3 = 1525, + NFCE_N_B_MARK___3 = 1526, + IP10_3_0_MARK___3 = 1527, + SD3_DAT3_MARK___3 = 1528, + NFDATA3_MARK___3 = 1529, + IP11_3_0_MARK___3 = 1530, + SD1_CD_MARK___3 = 1531, + NFCE_N_A_MARK___3 = 1532, + SSI_SCK1_MARK = 1533, + RIF0_D1_B_MARK___3 = 1534, + TS_SDEN0_MARK = 1535, + IP8_7_4_MARK___3 = 1536, + SD0_DAT0_MARK___3 = 1537, + NFDATA10_MARK___3 = 1538, + HTX1_B_MARK___3 = 1539, + REMOCON_B_MARK___3 = 1540, + IP9_7_4_MARK___3 = 1541, + SD1_DAT2_MARK___3 = 1542, + NFALE_B_MARK = 1543, + IP10_7_4_MARK___3 = 1544, + SD3_DAT4_MARK___3 = 1545, + NFDATA4_MARK___3 = 1546, + IP11_7_4_MARK___3 = 1547, + SD1_WP_MARK___3 = 1548, + NFWP_N_A_MARK___3 = 1549, + SSI_WS1_MARK = 1550, + RIF0_SYNC_B_MARK___3 = 1551, + TS_SPSYNC0_MARK = 1552, + IP8_11_8_MARK___3 = 1553, + SD0_DAT1_MARK___3 = 1554, + NFDATA11_MARK___3 = 1555, + SDA2_C_MARK = 1556, + HCTS1_N_B_MARK___3 = 1557, + FMIN_B_MARK___3 = 1558, + IP9_11_8_MARK___3 = 1559, + SD1_DAT3_MARK___3 = 1560, + NFRB_N_B_MARK___3 = 1561, + IP10_11_8_MARK___3 = 1562, + SD3_DAT5_MARK___3 = 1563, + NFDATA5_MARK___3 = 1564, + IP11_11_8_MARK___3 = 1565, + RX0_A_MARK = 1566, + HRX1_A_MARK___3 = 1567, + SSI_SCK2_A_MARK___3 = 1568, + RIF1_SYNC_MARK = 1569, + TS_SCK1_MARK = 1570, + IP8_15_12_MARK___3 = 1571, + SD0_DAT2_MARK___3 = 1572, + NFDATA12_MARK___3 = 1573, + SCL2_C_MARK = 1574, + HRTS1_N_B_MARK___3 = 1575, + BPFCLK_B_MARK___3 = 1576, + IP9_15_12_MARK___3 = 1577, + SD3_CLK_MARK___3 = 1578, + NFWE_N_MARK___3 = 1579, + IP10_15_12_MARK___3 = 1580, + SD3_DAT6_MARK___3 = 1581, + NFDATA6_MARK___3 = 1582, + IP11_15_12_MARK___3 = 1583, + TX0_A_MARK = 1584, + HTX1_A_MARK___3 = 1585, + SSI_WS2_A_MARK___3 = 1586, + RIF1_D0_MARK = 1587, + TS_SDAT1_MARK = 1588, + IP8_19_16_MARK___3 = 1589, + SD0_DAT3_MARK___3 = 1590, + NFDATA13_MARK___3 = 1591, + SDA1_C_MARK = 1592, + SCL2_E_MARK = 1593, + SPEEDIN_C_MARK = 1594, + REMOCON_C_MARK = 1595, + IP9_19_16_MARK___3 = 1596, + SD3_CMD_MARK___3 = 1597, + NFRE_N_MARK___3 = 1598, + IP10_19_16_MARK___3 = 1599, + SD3_DAT7_MARK___3 = 1600, + NFDATA7_MARK___3 = 1601, + IP11_19_16_MARK___3 = 1602, + CTS0_N_A_MARK = 1603, + NFDATA14_A_MARK___3 = 1604, + AUDIO_CLKOUT_A_MARK___3 = 1605, + RIF1_D1_MARK = 1606, + SCIF_CLK_A_MARK___3 = 1607, + FMCLK_A_MARK___3 = 1608, + IP8_23_20_MARK___3 = 1609, + SD1_CLK_MARK___3 = 1610, + NFDATA14_B_MARK___3 = 1611, + IP9_23_20_MARK___3 = 1612, + SD3_DAT0_MARK___3 = 1613, + NFDATA0_MARK___3 = 1614, + IP10_23_20_MARK___3 = 1615, + SD3_DS_MARK___3 = 1616, + NFCLE_MARK___3 = 1617, + IP11_23_20_MARK___3 = 1618, + RTS0_N_A_MARK = 1619, + NFDATA15_A_MARK___3 = 1620, + AUDIO_CLKOUT1_A_MARK___3 = 1621, + RIF1_CLK_MARK = 1622, + SCL2_A_MARK___3 = 1623, + FMIN_A_MARK___3 = 1624, + IP8_27_24_MARK___3 = 1625, + SD1_CMD_MARK___3 = 1626, + NFDATA15_B_MARK___3 = 1627, + IP9_27_24_MARK___3 = 1628, + SD3_DAT1_MARK___3 = 1629, + NFDATA1_MARK___3 = 1630, + IP10_27_24_MARK___3 = 1631, + SD0_CD_MARK___3 = 1632, + NFALE_A_MARK = 1633, + SD3_CD_MARK___3 = 1634, + RIF0_CLK_B_MARK___3 = 1635, + SCL2_B_MARK___3 = 1636, + TCLK1_A_MARK___3 = 1637, + SSI_SCK2_B_MARK___3 = 1638, + TS_SCK0_MARK = 1639, + IP11_27_24_MARK___3 = 1640, + SCK0_A_MARK = 1641, + HSCK1_A_MARK___3 = 1642, + USB3HS0_ID_MARK = 1643, + RTS1_N_MARK___3 = 1644, + SDA2_A_MARK___3 = 1645, + FMCLK_C_MARK___3 = 1646, + USB0_ID_MARK = 1647, + IP8_31_28_MARK___3 = 1648, + SD1_DAT0_MARK___3 = 1649, + NFWP_N_B_MARK___3 = 1650, + IP9_31_28_MARK___3 = 1651, + SD3_DAT2_MARK___3 = 1652, + NFDATA2_MARK___3 = 1653, + IP10_31_28_MARK___3 = 1654, + SD0_WP_MARK___3 = 1655, + NFRB_N_A_MARK___3 = 1656, + SD3_WP_MARK___3 = 1657, + RIF0_D0_B_MARK___3 = 1658, + SDA2_B_MARK___3 = 1659, + TCLK2_A_MARK___3 = 1660, + SSI_WS2_B_MARK___3 = 1661, + TS_SDAT0_MARK = 1662, + IP11_31_28_MARK___3 = 1663, + RX1_MARK = 1664, + HRX2_B_MARK___3 = 1665, + SSI_SCK9_B_MARK___3 = 1666, + AUDIO_CLKOUT1_B_MARK___3 = 1667, + IP12_3_0_MARK___3 = 1668, + TX1_MARK = 1669, + HTX2_B_MARK___3 = 1670, + SSI_WS9_B_MARK___3 = 1671, + AUDIO_CLKOUT3_B_MARK___3 = 1672, + IP13_3_0_MARK___3 = 1673, + MSIOF0_SS1_MARK___3 = 1674, + HRX2_A_MARK___3 = 1675, + SSI_SCK4_MARK___3 = 1676, + HCTS0_N_A_MARK = 1677, + BPFCLK_C_MARK___3 = 1678, + SPEEDIN_A_MARK___3 = 1679, + IP14_3_0_MARK___3 = 1680, + SSI_SDATA0_MARK___3 = 1681, + IP15_3_0_MARK___3 = 1682, + SSI_WS5_MARK___3 = 1683, + HTX0_B_MARK = 1684, + USB0_OVC_B_MARK = 1685, + SDA2_D_MARK = 1686, + IP12_7_4_MARK___3 = 1687, + SCK2_A_MARK = 1688, + HSCK0_A_MARK = 1689, + AUDIO_CLKB_A_MARK___3 = 1690, + CTS1_N_MARK___3 = 1691, + RIF0_CLK_A_MARK___3 = 1692, + REMOCON_A_MARK___3 = 1693, + SCIF_CLK_B_MARK___3 = 1694, + IP13_7_4_MARK___3 = 1695, + MSIOF0_SS2_MARK___3 = 1696, + HTX2_A_MARK___3 = 1697, + SSI_WS4_MARK___3 = 1698, + HRTS0_N_A_MARK = 1699, + FMIN_C_MARK___3 = 1700, + BPFCLK_A_MARK___3 = 1701, + IP14_7_4_MARK___3 = 1702, + SSI_SDATA1_MARK = 1703, + AUDIO_CLKC_B_MARK___3 = 1704, + PWM0_B_MARK = 1705, + IP15_7_4_MARK___3 = 1706, + SSI_SDATA5_MARK___3 = 1707, + HSCK0_B_MARK = 1708, + AUDIO_CLKB_C_MARK = 1709, + TPU0TO0_MARK___3 = 1710, + IP12_11_8_MARK___3 = 1711, + TX2_A_MARK___3 = 1712, + HRX0_A_MARK = 1713, + AUDIO_CLKOUT2_A_MARK___3 = 1714, + SCL1_A_MARK___3 = 1715, + FSO_CFE_0_N_A_MARK = 1716, + TS_SDEN1_MARK = 1717, + IP13_11_8_MARK___3 = 1718, + SSI_SDATA9_MARK = 1719, + AUDIO_CLKC_A_MARK___3 = 1720, + SCK1_MARK___3 = 1721, + IP14_11_8_MARK___3 = 1722, + SSI_SDATA2_MARK = 1723, + AUDIO_CLKOUT2_B_MARK___3 = 1724, + SSI_SCK9_A_MARK___3 = 1725, + PWM1_B_MARK___3 = 1726, + IP15_11_8_MARK___3 = 1727, + SSI_SCK6_MARK___3 = 1728, + HSCK2_A_MARK___3 = 1729, + AUDIO_CLKC_C_MARK = 1730, + TPU0TO1_MARK___3 = 1731, + FSO_CFE_0_N_B_MARK = 1732, + SIM0_RST_B_MARK___3 = 1733, + IP12_15_12_MARK___3 = 1734, + RX2_A_MARK___3 = 1735, + HTX0_A_MARK = 1736, + AUDIO_CLKOUT3_A_MARK___3 = 1737, + SDA1_A_MARK___3 = 1738, + FSO_CFE_1_N_A_MARK = 1739, + TS_SPSYNC1_MARK = 1740, + IP13_15_12_MARK___3 = 1741, + MLB_CLK_MARK___3 = 1742, + RX0_B_MARK = 1743, + RIF0_D0_A_MARK___3 = 1744, + SCL1_B_MARK___3 = 1745, + TCLK1_B_MARK___3 = 1746, + SIM0_RST_A_MARK___3 = 1747, + IP14_15_12_MARK___3 = 1748, + SSI_SCK349_MARK___3 = 1749, + PWM2_C_MARK = 1750, + IP15_15_12_MARK___3 = 1751, + SSI_WS6_MARK___3 = 1752, + HCTS2_N_A_MARK___3 = 1753, + AUDIO_CLKOUT2_C_MARK = 1754, + TPU0TO2_MARK___3 = 1755, + SDA1_D_MARK = 1756, + FSO_CFE_1_N_B_MARK = 1757, + SIM0_D_B_MARK___3 = 1758, + IP12_19_16_MARK___3 = 1759, + MSIOF0_SCK_MARK___3 = 1760, + SSI_SCK78_MARK___3 = 1761, + IP13_19_16_MARK___3 = 1762, + MLB_SIG_MARK___3 = 1763, + SCK0_B_MARK = 1764, + RIF0_D1_A_MARK___3 = 1765, + SDA1_B_MARK___3 = 1766, + TCLK2_B_MARK___3 = 1767, + SIM0_D_A_MARK___3 = 1768, + IP14_19_16_MARK___3 = 1769, + SSI_WS349_MARK___3 = 1770, + PWM3_C_MARK = 1771, + IP15_19_16_MARK___3 = 1772, + SSI_SDATA6_MARK___3 = 1773, + HRTS2_N_A_MARK___3 = 1774, + AUDIO_CLKOUT3_C_MARK = 1775, + TPU0TO3_MARK___3 = 1776, + SCL1_D_MARK = 1777, + FSO_TOE_N_B_MARK = 1778, + SIM0_CLK_B_MARK___3 = 1779, + IP12_23_20_MARK___3 = 1780, + MSIOF0_RXD_MARK___3 = 1781, + SSI_WS78_MARK___3 = 1782, + TX2_B_MARK___3 = 1783, + IP13_23_20_MARK___3 = 1784, + MLB_DAT_MARK___3 = 1785, + TX0_B_MARK = 1786, + RIF0_SYNC_A_MARK___3 = 1787, + SIM0_CLK_A_MARK___3 = 1788, + IP14_23_20_MARK___3 = 1789, + SSI_SDATA3_MARK___3 = 1790, + AUDIO_CLKOUT1_C_MARK = 1791, + AUDIO_CLKB_B_MARK___3 = 1792, + PWM4_B_MARK___3 = 1793, + IP15_23_20_MARK___3 = 1794, + AUDIO_CLKA_MARK = 1795, + IP12_27_24_MARK___3 = 1796, + MSIOF0_TXD_MARK___3 = 1797, + SSI_SDATA7_MARK___3 = 1798, + RX2_B_MARK___3 = 1799, + IP13_27_24_MARK___3 = 1800, + SSI_SCK01239_MARK___3 = 1801, + IP14_27_24_MARK___3 = 1802, + SSI_SDATA4_MARK___3 = 1803, + SSI_WS9_A_MARK___3 = 1804, + PWM5_B_MARK___3 = 1805, + IP15_27_24_MARK___3 = 1806, + USB30_PWEN_MARK___3 = 1807, + USB0_PWEN_A_MARK = 1808, + IP12_31_28_MARK___3 = 1809, + MSIOF0_SYNC_MARK___3 = 1810, + AUDIO_CLKOUT_B_MARK___3 = 1811, + SSI_SDATA8_MARK___3 = 1812, + IP13_31_28_MARK___3 = 1813, + SSI_WS01239_MARK___3 = 1814, + IP14_31_28_MARK___3 = 1815, + SSI_SCK5_MARK___3 = 1816, + HRX0_B_MARK = 1817, + USB0_PWEN_B_MARK = 1818, + SCL2_D_MARK = 1819, + PWM6_B_MARK___3 = 1820, + IP15_31_28_MARK___3 = 1821, + USB30_OVC_MARK___3 = 1822, + USB0_OVC_A_MARK = 1823, + FSO_TOE_N_A_MARK = 1824, + SEL_SIMCARD_0_MARK___3 = 1825, + SEL_SIMCARD_1_MARK___3 = 1826, + SEL_ADGB_0_MARK___3 = 1827, + SEL_ADGB_2_MARK = 1828, + SEL_ADGB_1_MARK___3 = 1829, + SEL_SSI2_0_MARK___3 = 1830, + SEL_SSI2_1_MARK___3 = 1831, + SEL_TIMER_TMU_0_MARK___3 = 1832, + SEL_TIMER_TMU_1_MARK___3 = 1833, + SEL_DRIF0_0_MARK___3 = 1834, + SEL_DRIF0_1_MARK___3 = 1835, + SEL_USB_20_CH0_0_MARK = 1836, + SEL_USB_20_CH0_1_MARK = 1837, + SEL_FM_0_MARK___3 = 1838, + SEL_FM_2_MARK___3 = 1839, + SEL_FM_1_MARK___3 = 1840, + SEL_DRIF2_0_MARK___3 = 1841, + SEL_DRIF2_1_MARK___3 = 1842, + SEL_FSO_0_MARK = 1843, + SEL_FSO_1_MARK = 1844, + SEL_DRIF3_0_MARK___3 = 1845, + SEL_DRIF3_1_MARK___3 = 1846, + SEL_HSCIF0_0_MARK = 1847, + SEL_HSCIF0_1_MARK = 1848, + SEL_HSCIF3_0_MARK___3 = 1849, + SEL_HSCIF3_4_MARK = 1850, + SEL_HSCIF3_2_MARK___3 = 1851, + SEL_HSCIF3_1_MARK___3 = 1852, + SEL_HSCIF3_3_MARK___3 = 1853, + SEL_HSCIF1_0_MARK___3 = 1854, + SEL_HSCIF1_1_MARK___3 = 1855, + SEL_HSCIF2_0_MARK___3 = 1856, + SEL_HSCIF2_1_MARK___3 = 1857, + SEL_I2C1_0_MARK___3 = 1858, + SEL_I2C1_2_MARK = 1859, + SEL_I2C1_1_MARK___3 = 1860, + SEL_I2C1_3_MARK = 1861, + SEL_HSCIF4_0_MARK___3 = 1862, + SEL_HSCIF4_4_MARK = 1863, + SEL_HSCIF4_2_MARK = 1864, + SEL_HSCIF4_1_MARK___3 = 1865, + SEL_HSCIF4_3_MARK = 1866, + SEL_I2C2_0_MARK___3 = 1867, + SEL_I2C2_4_MARK = 1868, + SEL_I2C2_2_MARK = 1869, + SEL_I2C2_1_MARK___3 = 1870, + SEL_I2C2_3_MARK = 1871, + SEL_I2C6_0_MARK___3 = 1872, + SEL_I2C6_1_MARK___3 = 1873, + SEL_I2C7_0_MARK = 1874, + SEL_I2C7_1_MARK = 1875, + SEL_NDF_0_MARK___3 = 1876, + SEL_NDF_1_MARK___3 = 1877, + SEL_MSIOF2_0_MARK___3 = 1878, + SEL_MSIOF2_1_MARK___3 = 1879, + SEL_PWM0_0_MARK = 1880, + SEL_PWM0_1_MARK = 1881, + SEL_MSIOF3_0_MARK___3 = 1882, + SEL_MSIOF3_1_MARK___3 = 1883, + SEL_PWM1_0_MARK___3 = 1884, + SEL_PWM1_1_MARK___3 = 1885, + SEL_SCIF3_0_MARK___3 = 1886, + SEL_SCIF3_2_MARK = 1887, + SEL_SCIF3_1_MARK___3 = 1888, + SEL_PWM2_0_MARK___3 = 1889, + SEL_PWM2_2_MARK = 1890, + SEL_PWM2_1_MARK___3 = 1891, + SEL_SCIF4_0_MARK___3 = 1892, + SEL_SCIF4_2_MARK___3 = 1893, + SEL_SCIF4_1_MARK___3 = 1894, + SEL_PWM3_0_MARK___3 = 1895, + SEL_PWM3_2_MARK = 1896, + SEL_PWM3_1_MARK___3 = 1897, + SEL_SCIF5_0_MARK___3 = 1898, + SEL_SCIF5_2_MARK = 1899, + SEL_SCIF5_1_MARK___3 = 1900, + SEL_PWM4_0_MARK___3 = 1901, + SEL_PWM4_1_MARK___3 = 1902, + SEL_PWM5_0_MARK___3 = 1903, + SEL_PWM5_1_MARK___3 = 1904, + SEL_VIN4_0_MARK___3 = 1905, + SEL_VIN4_1_MARK___3 = 1906, + SEL_PWM6_0_MARK___3 = 1907, + SEL_PWM6_1_MARK___3 = 1908, + SEL_VIN5_0_MARK = 1909, + SEL_VIN5_1_MARK = 1910, + SEL_REMOCON_0_MARK___3 = 1911, + SEL_REMOCON_2_MARK = 1912, + SEL_REMOCON_1_MARK___3 = 1913, + SEL_ADGC_0_MARK___3 = 1914, + SEL_ADGC_2_MARK = 1915, + SEL_ADGC_1_MARK___3 = 1916, + SEL_SCIF_0_MARK___3 = 1917, + SEL_SCIF_1_MARK___3 = 1918, + SEL_SSI9_0_MARK___3 = 1919, + SEL_SSI9_1_MARK___3 = 1920, + SEL_SCIF0_0_MARK = 1921, + SEL_SCIF0_1_MARK = 1922, + SEL_SCIF2_0_MARK___3 = 1923, + SEL_SCIF2_1_MARK___3 = 1924, + SEL_SPEED_PULSE_IF_0_MARK = 1925, + SEL_SPEED_PULSE_IF_2_MARK = 1926, + SEL_SPEED_PULSE_IF_1_MARK = 1927, + AVB_TX_CTL_MARK___3 = 1928, + AVB_TXC_MARK___3 = 1929, + AVB_TD0_MARK___3 = 1930, + AVB_TD1_MARK___3 = 1931, + AVB_TD2_MARK___3 = 1932, + AVB_TD3_MARK___3 = 1933, + PRESETOUT_N_MARK = 1934, + FSCLKST_N_MARK = 1935, + TRST_N_MARK = 1936, + TCK_MARK___3 = 1937, + TMS_MARK___3 = 1938, + TDI_MARK___3 = 1939, + ASEBRK_MARK___3 = 1940, + MLB_REF_MARK___3 = 1941, + PINMUX_MARK_END___3 = 1942, +}; + +enum { + GP_LAST___3 = 209, + PIN_ASEBRK___3 = 210, + PIN_AVB_MDC = 211, + PIN_AVB_MDIO___3 = 212, + PIN_AVB_TD0___3 = 213, + PIN_AVB_TD1___3 = 214, + PIN_AVB_TD2___3 = 215, + PIN_AVB_TD3___3 = 216, + PIN_AVB_TXC___3 = 217, + PIN_AVB_TX_CTL___3 = 218, + PIN_FSCLKST_N = 219, + PIN_MLB_REF___3 = 220, + PIN_PRESETOUT_N___3 = 221, + PIN_TCK___3 = 222, + PIN_TDI___3 = 223, + PIN_TMS___3 = 224, + PIN_TRST_N___3 = 225, +}; + +enum ioctrl_regs___2 { + POCCTRL0 = 0, + TDSELCTRL___2 = 1, +}; + +enum { + PINMUX_RESERVED___4 = 0, + PINMUX_DATA_BEGIN___4 = 1, + GP_0_0_DATA___4 = 2, + GP_0_1_DATA___4 = 3, + GP_0_2_DATA___4 = 4, + GP_0_3_DATA___4 = 5, + GP_0_4_DATA___4 = 6, + GP_0_5_DATA___4 = 7, + GP_0_6_DATA___4 = 8, + GP_0_7_DATA___4 = 9, + GP_0_8_DATA___4 = 10, + GP_0_9_DATA___4 = 11, + GP_0_10_DATA___4 = 12, + GP_0_11_DATA___4 = 13, + GP_0_12_DATA___4 = 14, + GP_0_13_DATA___4 = 15, + GP_0_14_DATA___4 = 16, + GP_0_15_DATA___4 = 17, + GP_1_0_DATA___4 = 18, + GP_1_1_DATA___4 = 19, + GP_1_2_DATA___4 = 20, + GP_1_3_DATA___4 = 21, + GP_1_4_DATA___4 = 22, + GP_1_5_DATA___4 = 23, + GP_1_6_DATA___4 = 24, + GP_1_7_DATA___4 = 25, + GP_1_8_DATA___4 = 26, + GP_1_9_DATA___4 = 27, + GP_1_10_DATA___4 = 28, + GP_1_11_DATA___4 = 29, + GP_1_12_DATA___4 = 30, + GP_1_13_DATA___4 = 31, + GP_1_14_DATA___4 = 32, + GP_1_15_DATA___4 = 33, + GP_1_16_DATA___4 = 34, + GP_1_17_DATA___4 = 35, + GP_1_18_DATA___4 = 36, + GP_1_19_DATA___4 = 37, + GP_1_20_DATA___4 = 38, + GP_1_21_DATA___4 = 39, + GP_1_22_DATA___4 = 40, + GP_1_23_DATA___3 = 41, + GP_1_24_DATA___3 = 42, + GP_1_25_DATA___3 = 43, + GP_1_26_DATA___3 = 44, + GP_1_27_DATA___3 = 45, + GP_1_28_DATA___3 = 46, + GP_2_0_DATA___4 = 47, + GP_2_1_DATA___4 = 48, + GP_2_2_DATA___4 = 49, + GP_2_3_DATA___4 = 50, + GP_2_4_DATA___4 = 51, + GP_2_5_DATA___4 = 52, + GP_2_6_DATA___4 = 53, + GP_2_7_DATA___4 = 54, + GP_2_8_DATA___4 = 55, + GP_2_9_DATA___4 = 56, + GP_2_10_DATA___4 = 57, + GP_2_11_DATA___4 = 58, + GP_2_12_DATA___4 = 59, + GP_2_13_DATA___4 = 60, + GP_2_14_DATA___4 = 61, + GP_3_0_DATA___4 = 62, + GP_3_1_DATA___4 = 63, + GP_3_2_DATA___4 = 64, + GP_3_3_DATA___4 = 65, + GP_3_4_DATA___4 = 66, + GP_3_5_DATA___4 = 67, + GP_3_6_DATA___4 = 68, + GP_3_7_DATA___4 = 69, + GP_3_8_DATA___4 = 70, + GP_3_9_DATA___4 = 71, + GP_3_10_DATA___4 = 72, + GP_3_11_DATA___4 = 73, + GP_3_12_DATA___4 = 74, + GP_3_13_DATA___4 = 75, + GP_3_14_DATA___4 = 76, + GP_3_15_DATA___4 = 77, + GP_4_0_DATA___4 = 78, + GP_4_1_DATA___4 = 79, + GP_4_2_DATA___4 = 80, + GP_4_3_DATA___4 = 81, + GP_4_4_DATA___4 = 82, + GP_4_5_DATA___4 = 83, + GP_4_6_DATA___4 = 84, + GP_4_7_DATA___4 = 85, + GP_4_8_DATA___4 = 86, + GP_4_9_DATA___4 = 87, + GP_4_10_DATA___4 = 88, + GP_4_11_DATA___3 = 89, + GP_4_12_DATA___3 = 90, + GP_4_13_DATA___3 = 91, + GP_4_14_DATA___3 = 92, + GP_4_15_DATA___3 = 93, + GP_4_16_DATA___3 = 94, + GP_4_17_DATA___3 = 95, + GP_5_0_DATA___4 = 96, + GP_5_1_DATA___4 = 97, + GP_5_2_DATA___4 = 98, + GP_5_3_DATA___4 = 99, + GP_5_4_DATA___4 = 100, + GP_5_5_DATA___4 = 101, + GP_5_6_DATA___4 = 102, + GP_5_7_DATA___4 = 103, + GP_5_8_DATA___4 = 104, + GP_5_9_DATA___4 = 105, + GP_5_10_DATA___4 = 106, + GP_5_11_DATA___4 = 107, + GP_5_12_DATA___4 = 108, + GP_5_13_DATA___4 = 109, + GP_5_14_DATA___4 = 110, + GP_5_15_DATA___4 = 111, + GP_5_16_DATA___4 = 112, + GP_5_17_DATA___4 = 113, + GP_5_18_DATA___4 = 114, + GP_5_19_DATA___4 = 115, + GP_5_20_DATA___3 = 116, + GP_5_21_DATA___3 = 117, + GP_5_22_DATA___3 = 118, + GP_5_23_DATA___3 = 119, + GP_5_24_DATA___3 = 120, + GP_5_25_DATA___3 = 121, + GP_6_0_DATA___4 = 122, + GP_6_1_DATA___4 = 123, + GP_6_2_DATA___4 = 124, + GP_6_3_DATA___4 = 125, + GP_6_4_DATA___4 = 126, + GP_6_5_DATA___4 = 127, + GP_6_6_DATA___4 = 128, + GP_6_7_DATA___4 = 129, + GP_6_8_DATA___4 = 130, + GP_6_9_DATA___4 = 131, + GP_6_10_DATA___4 = 132, + GP_6_11_DATA___4 = 133, + GP_6_12_DATA___4 = 134, + GP_6_13_DATA___4 = 135, + GP_6_14_DATA___4 = 136, + GP_6_15_DATA___4 = 137, + GP_6_16_DATA___4 = 138, + GP_6_17_DATA___4 = 139, + GP_6_18_DATA___3 = 140, + GP_6_19_DATA___3 = 141, + GP_6_20_DATA___3 = 142, + GP_6_21_DATA___3 = 143, + GP_6_22_DATA___3 = 144, + GP_6_23_DATA___3 = 145, + GP_6_24_DATA___3 = 146, + GP_6_25_DATA___3 = 147, + GP_6_26_DATA___3 = 148, + GP_6_27_DATA___3 = 149, + GP_6_28_DATA___3 = 150, + GP_6_29_DATA___3 = 151, + GP_6_30_DATA___3 = 152, + GP_6_31_DATA___3 = 153, + GP_7_0_DATA___3 = 154, + GP_7_1_DATA___3 = 155, + GP_7_2_DATA___3 = 156, + GP_7_3_DATA___3 = 157, + PINMUX_DATA_END___4 = 158, + PINMUX_FUNCTION_BEGIN___4 = 159, + GP_0_0_FN___4 = 160, + GP_0_1_FN___4 = 161, + GP_0_2_FN___4 = 162, + GP_0_3_FN___4 = 163, + GP_0_4_FN___4 = 164, + GP_0_5_FN___4 = 165, + GP_0_6_FN___4 = 166, + GP_0_7_FN___4 = 167, + GP_0_8_FN___4 = 168, + GP_0_9_FN___4 = 169, + GP_0_10_FN___4 = 170, + GP_0_11_FN___4 = 171, + GP_0_12_FN___4 = 172, + GP_0_13_FN___4 = 173, + GP_0_14_FN___4 = 174, + GP_0_15_FN___4 = 175, + GP_1_0_FN___4 = 176, + GP_1_1_FN___4 = 177, + GP_1_2_FN___4 = 178, + GP_1_3_FN___4 = 179, + GP_1_4_FN___4 = 180, + GP_1_5_FN___4 = 181, + GP_1_6_FN___4 = 182, + GP_1_7_FN___4 = 183, + GP_1_8_FN___4 = 184, + GP_1_9_FN___4 = 185, + GP_1_10_FN___4 = 186, + GP_1_11_FN___4 = 187, + GP_1_12_FN___4 = 188, + GP_1_13_FN___4 = 189, + GP_1_14_FN___4 = 190, + GP_1_15_FN___4 = 191, + GP_1_16_FN___4 = 192, + GP_1_17_FN___4 = 193, + GP_1_18_FN___4 = 194, + GP_1_19_FN___4 = 195, + GP_1_20_FN___4 = 196, + GP_1_21_FN___4 = 197, + GP_1_22_FN___4 = 198, + GP_1_23_FN___3 = 199, + GP_1_24_FN___3 = 200, + GP_1_25_FN___3 = 201, + GP_1_26_FN___3 = 202, + GP_1_27_FN___3 = 203, + GP_1_28_FN___3 = 204, + GP_2_0_FN___4 = 205, + GP_2_1_FN___4 = 206, + GP_2_2_FN___4 = 207, + GP_2_3_FN___4 = 208, + GP_2_4_FN___4 = 209, + GP_2_5_FN___4 = 210, + GP_2_6_FN___4 = 211, + GP_2_7_FN___4 = 212, + GP_2_8_FN___4 = 213, + GP_2_9_FN___4 = 214, + GP_2_10_FN___4 = 215, + GP_2_11_FN___4 = 216, + GP_2_12_FN___4 = 217, + GP_2_13_FN___4 = 218, + GP_2_14_FN___4 = 219, + GP_3_0_FN___4 = 220, + GP_3_1_FN___4 = 221, + GP_3_2_FN___4 = 222, + GP_3_3_FN___4 = 223, + GP_3_4_FN___4 = 224, + GP_3_5_FN___4 = 225, + GP_3_6_FN___4 = 226, + GP_3_7_FN___4 = 227, + GP_3_8_FN___4 = 228, + GP_3_9_FN___4 = 229, + GP_3_10_FN___4 = 230, + GP_3_11_FN___4 = 231, + GP_3_12_FN___4 = 232, + GP_3_13_FN___4 = 233, + GP_3_14_FN___4 = 234, + GP_3_15_FN___4 = 235, + GP_4_0_FN___4 = 236, + GP_4_1_FN___4 = 237, + GP_4_2_FN___4 = 238, + GP_4_3_FN___4 = 239, + GP_4_4_FN___4 = 240, + GP_4_5_FN___4 = 241, + GP_4_6_FN___4 = 242, + GP_4_7_FN___4 = 243, + GP_4_8_FN___4 = 244, + GP_4_9_FN___4 = 245, + GP_4_10_FN___4 = 246, + GP_4_11_FN___3 = 247, + GP_4_12_FN___3 = 248, + GP_4_13_FN___3 = 249, + GP_4_14_FN___3 = 250, + GP_4_15_FN___3 = 251, + GP_4_16_FN___3 = 252, + GP_4_17_FN___3 = 253, + GP_5_0_FN___4 = 254, + GP_5_1_FN___4 = 255, + GP_5_2_FN___4 = 256, + GP_5_3_FN___4 = 257, + GP_5_4_FN___4 = 258, + GP_5_5_FN___4 = 259, + GP_5_6_FN___4 = 260, + GP_5_7_FN___4 = 261, + GP_5_8_FN___4 = 262, + GP_5_9_FN___4 = 263, + GP_5_10_FN___4 = 264, + GP_5_11_FN___4 = 265, + GP_5_12_FN___4 = 266, + GP_5_13_FN___4 = 267, + GP_5_14_FN___4 = 268, + GP_5_15_FN___4 = 269, + GP_5_16_FN___4 = 270, + GP_5_17_FN___4 = 271, + GP_5_18_FN___4 = 272, + GP_5_19_FN___4 = 273, + GP_5_20_FN___3 = 274, + GP_5_21_FN___3 = 275, + GP_5_22_FN___3 = 276, + GP_5_23_FN___3 = 277, + GP_5_24_FN___3 = 278, + GP_5_25_FN___3 = 279, + GP_6_0_FN___4 = 280, + GP_6_1_FN___4 = 281, + GP_6_2_FN___4 = 282, + GP_6_3_FN___4 = 283, + GP_6_4_FN___4 = 284, + GP_6_5_FN___4 = 285, + GP_6_6_FN___4 = 286, + GP_6_7_FN___4 = 287, + GP_6_8_FN___4 = 288, + GP_6_9_FN___4 = 289, + GP_6_10_FN___4 = 290, + GP_6_11_FN___4 = 291, + GP_6_12_FN___4 = 292, + GP_6_13_FN___4 = 293, + GP_6_14_FN___4 = 294, + GP_6_15_FN___4 = 295, + GP_6_16_FN___4 = 296, + GP_6_17_FN___4 = 297, + GP_6_18_FN___3 = 298, + GP_6_19_FN___3 = 299, + GP_6_20_FN___3 = 300, + GP_6_21_FN___3 = 301, + GP_6_22_FN___3 = 302, + GP_6_23_FN___3 = 303, + GP_6_24_FN___3 = 304, + GP_6_25_FN___3 = 305, + GP_6_26_FN___3 = 306, + GP_6_27_FN___3 = 307, + GP_6_28_FN___3 = 308, + GP_6_29_FN___3 = 309, + GP_6_30_FN___3 = 310, + GP_6_31_FN___3 = 311, + GP_7_0_FN___3 = 312, + GP_7_1_FN___3 = 313, + GP_7_2_FN___3 = 314, + GP_7_3_FN___3 = 315, + FN_CLKOUT___4 = 316, + FN_MSIOF0_RXD___4 = 317, + FN_MSIOF0_TXD___4 = 318, + FN_MSIOF0_SCK___4 = 319, + FN_SSI_SDATA5___4 = 320, + FN_SSI_WS5___4 = 321, + FN_SSI_SCK5___4 = 322, + FN_GP7_03___3 = 323, + FN_GP7_02___3 = 324, + FN_AVS2___3 = 325, + FN_AVS1___3 = 326, + FN_IP0_3_0___4 = 327, + FN_AVB_MDC___4 = 328, + FN_MSIOF2_SS2_C___3 = 329, + FN_IP1_3_0___4 = 330, + FN_IRQ2___4 = 331, + FN_QCPV_QDE___4 = 332, + FN_DU_EXODDF_DU_ODDF_DISP_CDE___3 = 333, + FN_VI4_DATA2_B___4 = 334, + FN_MSIOF3_SYNC_E___3 = 335, + FN_PWM3_B___4 = 336, + FN_IP2_3_0___4 = 337, + FN_A1___4 = 338, + FN_LCDOUT17___4 = 339, + FN_MSIOF3_TXD_B___4 = 340, + FN_VI4_DATA9___4 = 341, + FN_DU_DB1___4 = 342, + FN_PWM4_A___4 = 343, + FN_IP3_3_0___4 = 344, + FN_A9___4 = 345, + FN_MSIOF2_SCK_A___4 = 346, + FN_CTS4_N_B___3 = 347, + FN_VI5_VSYNC_N___3 = 348, + FN_IP0_7_4___4 = 349, + FN_AVB_MAGIC___4 = 350, + FN_MSIOF2_SS1_C___3 = 351, + FN_SCK4_A___4 = 352, + FN_IP1_7_4___4 = 353, + FN_IRQ3___4 = 354, + FN_QSTVB_QVE___4 = 355, + FN_DU_DOTCLKOUT1___3 = 356, + FN_VI4_DATA3_B___4 = 357, + FN_MSIOF3_SCK_E___3 = 358, + FN_PWM4_B___4 = 359, + FN_IP2_7_4___4 = 360, + FN_A2___4 = 361, + FN_LCDOUT18___4 = 362, + FN_MSIOF3_SCK_B___4 = 363, + FN_VI4_DATA10___4 = 364, + FN_DU_DB2___4 = 365, + FN_PWM5_A___4 = 366, + FN_IP3_7_4___4 = 367, + FN_A10___4 = 368, + FN_MSIOF2_RXD_A___4 = 369, + FN_RTS4_N_B___3 = 370, + FN_VI5_HSYNC_N___3 = 371, + FN_IP0_11_8___4 = 372, + FN_AVB_PHY_INT___4 = 373, + FN_MSIOF2_SYNC_C___3 = 374, + FN_RX4_A___4 = 375, + FN_IP1_11_8___4 = 376, + FN_IRQ4___4 = 377, + FN_QSTH_QHS___4 = 378, + FN_DU_EXHSYNC_DU_HSYNC___3 = 379, + FN_VI4_DATA4_B___4 = 380, + FN_MSIOF3_RXD_E___3 = 381, + FN_PWM5_B___4 = 382, + FN_IP2_11_8___4 = 383, + FN_A3___4 = 384, + FN_LCDOUT19___4 = 385, + FN_MSIOF3_RXD_B___4 = 386, + FN_VI4_DATA11___4 = 387, + FN_DU_DB3___4 = 388, + FN_PWM6_A___4 = 389, + FN_IP3_11_8___4 = 390, + FN_A11___4 = 391, + FN_TX3_B___4 = 392, + FN_MSIOF2_TXD_A___4 = 393, + FN_HTX4_B___4 = 394, + FN_HSCK4___3 = 395, + FN_VI5_FIELD___3 = 396, + FN_SCL6_A___4 = 397, + FN_AVB_AVTP_CAPTURE_B___3 = 398, + FN_PWM2_B___4 = 399, + FN_IP0_15_12___4 = 400, + FN_AVB_LINK___4 = 401, + FN_MSIOF2_SCK_C___3 = 402, + FN_TX4_A___4 = 403, + FN_IP1_15_12___4 = 404, + FN_IRQ5___4 = 405, + FN_QSTB_QHE___4 = 406, + FN_DU_EXVSYNC_DU_VSYNC___3 = 407, + FN_VI4_DATA5_B___4 = 408, + FN_FSCLKST2_N_B___3 = 409, + FN_MSIOF3_TXD_E___3 = 410, + FN_PWM6_B___4 = 411, + FN_IP2_15_12___4 = 412, + FN_A4___4 = 413, + FN_LCDOUT20___4 = 414, + FN_MSIOF3_SS1_B___4 = 415, + FN_VI4_DATA12___4 = 416, + FN_VI5_DATA12___3 = 417, + FN_DU_DB4___4 = 418, + FN_IP3_15_12___4 = 419, + FN_A12___4 = 420, + FN_LCDOUT12___4 = 421, + FN_MSIOF3_SCK_C___3 = 422, + FN_HRX4_A___4 = 423, + FN_VI5_DATA8___3 = 424, + FN_DU_DG4___4 = 425, + FN_IP0_19_16___4 = 426, + FN_AVB_AVTP_MATCH_A___3 = 427, + FN_MSIOF2_RXD_C___3 = 428, + FN_CTS4_N_A___4 = 429, + FN_FSCLKST2_N_A___3 = 430, + FN_IP1_19_16___4 = 431, + FN_PWM0___3 = 432, + FN_AVB_AVTP_PPS___4 = 433, + FN_VI4_DATA6_B___4 = 434, + FN_IECLK_B___3 = 435, + FN_IP2_19_16___4 = 436, + FN_A5___4 = 437, + FN_LCDOUT21___4 = 438, + FN_MSIOF3_SS2_B___3 = 439, + FN_SCK4_B___4 = 440, + FN_VI4_DATA13___4 = 441, + FN_VI5_DATA13___3 = 442, + FN_DU_DB5___4 = 443, + FN_IP3_19_16___4 = 444, + FN_A13___4 = 445, + FN_LCDOUT13___4 = 446, + FN_MSIOF3_SYNC_C___3 = 447, + FN_HTX4_A___4 = 448, + FN_VI5_DATA9___3 = 449, + FN_DU_DG5___4 = 450, + FN_IP0_23_20___4 = 451, + FN_AVB_AVTP_CAPTURE_A___3 = 452, + FN_MSIOF2_TXD_C___3 = 453, + FN_RTS4_N_A___4 = 454, + FN_IP1_23_20___4 = 455, + FN_PWM1_A___4 = 456, + FN_HRX3_D___4 = 457, + FN_VI4_DATA7_B___4 = 458, + FN_IERX_B___3 = 459, + FN_IP2_23_20___4 = 460, + FN_A6___4 = 461, + FN_LCDOUT22___4 = 462, + FN_MSIOF2_SS1_A___4 = 463, + FN_RX4_B___4 = 464, + FN_VI4_DATA14___4 = 465, + FN_VI5_DATA14___3 = 466, + FN_DU_DB6___4 = 467, + FN_IP3_23_20___4 = 468, + FN_A14___4 = 469, + FN_LCDOUT14___4 = 470, + FN_MSIOF3_RXD_C___3 = 471, + FN_HCTS4_N___3 = 472, + FN_VI5_DATA10___3 = 473, + FN_DU_DG6___4 = 474, + FN_IP0_27_24___4 = 475, + FN_IRQ0___4 = 476, + FN_QPOLB___4 = 477, + FN_DU_CDE___4 = 478, + FN_VI4_DATA0_B___4 = 479, + FN_CAN0_TX_B___3 = 480, + FN_CANFD0_TX_B___3 = 481, + FN_MSIOF3_SS2_E___3 = 482, + FN_IP1_27_24___4 = 483, + FN_PWM2_A___4 = 484, + FN_HTX3_D___4 = 485, + FN_IETX_B___3 = 486, + FN_IP2_27_24___4 = 487, + FN_A7___4 = 488, + FN_LCDOUT23___4 = 489, + FN_MSIOF2_SS2_A___4 = 490, + FN_TX4_B___4 = 491, + FN_VI4_DATA15___4 = 492, + FN_VI5_DATA15___3 = 493, + FN_DU_DB7___4 = 494, + FN_IP3_27_24___4 = 495, + FN_A15___4 = 496, + FN_LCDOUT15___4 = 497, + FN_MSIOF3_TXD_C___3 = 498, + FN_HRTS4_N___3 = 499, + FN_VI5_DATA11___3 = 500, + FN_DU_DG7___4 = 501, + FN_IP0_31_28___4 = 502, + FN_IRQ1___4 = 503, + FN_QPOLA___4 = 504, + FN_DU_DISP___4 = 505, + FN_VI4_DATA1_B___4 = 506, + FN_CAN0_RX_B___3 = 507, + FN_CANFD0_RX_B___3 = 508, + FN_MSIOF3_SS1_E___3 = 509, + FN_IP1_31_28___4 = 510, + FN_A0___4 = 511, + FN_LCDOUT16___4 = 512, + FN_MSIOF3_SYNC_B___4 = 513, + FN_VI4_DATA8___4 = 514, + FN_DU_DB0___4 = 515, + FN_PWM3_A___4 = 516, + FN_IP2_31_28___4 = 517, + FN_A8___4 = 518, + FN_RX3_B___4 = 519, + FN_MSIOF2_SYNC_A___4 = 520, + FN_HRX4_B___4 = 521, + FN_SDA6_A___4 = 522, + FN_AVB_AVTP_MATCH_B___3 = 523, + FN_PWM1_B___4 = 524, + FN_IP3_31_28___4 = 525, + FN_A16___4 = 526, + FN_LCDOUT8___4 = 527, + FN_VI4_FIELD___4 = 528, + FN_DU_DG0___4 = 529, + FN_IP4_3_0___4 = 530, + FN_A17___4 = 531, + FN_LCDOUT9___4 = 532, + FN_VI4_VSYNC_N___4 = 533, + FN_DU_DG1___4 = 534, + FN_IP5_3_0___4 = 535, + FN_WE0_N___4 = 536, + FN_MSIOF3_TXD_D___3 = 537, + FN_CTS3_N___3 = 538, + FN_HCTS3_N___3 = 539, + FN_SCL6_B___4 = 540, + FN_CAN_CLK___4 = 541, + FN_IECLK_A___3 = 542, + FN_IP6_3_0___4 = 543, + FN_D5___4 = 544, + FN_MSIOF2_SYNC_B___4 = 545, + FN_VI4_DATA21___4 = 546, + FN_VI5_DATA5___3 = 547, + FN_IP7_3_0___4 = 548, + FN_D13___4 = 549, + FN_LCDOUT5___4 = 550, + FN_MSIOF2_SS2_D___3 = 551, + FN_TX4_C___4 = 552, + FN_VI4_DATA5_A___4 = 553, + FN_DU_DR5___4 = 554, + FN_IP4_7_4___4 = 555, + FN_A18___4 = 556, + FN_LCDOUT10___4 = 557, + FN_VI4_HSYNC_N___4 = 558, + FN_DU_DG2___4 = 559, + FN_IP5_7_4___4 = 560, + FN_WE1_N___4 = 561, + FN_MSIOF3_SS1_D___3 = 562, + FN_RTS3_N___3 = 563, + FN_HRTS3_N___3 = 564, + FN_SDA6_B___4 = 565, + FN_CAN1_RX___4 = 566, + FN_CANFD1_RX___4 = 567, + FN_IERX_A___3 = 568, + FN_IP6_7_4___4 = 569, + FN_D6___4 = 570, + FN_MSIOF2_RXD_B___4 = 571, + FN_VI4_DATA22___4 = 572, + FN_VI5_DATA6___3 = 573, + FN_IP7_7_4___4 = 574, + FN_D14___4 = 575, + FN_LCDOUT6___4 = 576, + FN_MSIOF3_SS1_A___4 = 577, + FN_HRX3_C___4 = 578, + FN_VI4_DATA6_A___4 = 579, + FN_DU_DR6___4 = 580, + FN_SCL6_C___3 = 581, + FN_IP4_11_8___4 = 582, + FN_A19___4 = 583, + FN_LCDOUT11___4 = 584, + FN_VI4_CLKENB___4 = 585, + FN_DU_DG3___4 = 586, + FN_IP5_11_8___4 = 587, + FN_EX_WAIT0_A___3 = 588, + FN_QCLK___4 = 589, + FN_VI4_CLK___4 = 590, + FN_DU_DOTCLKOUT0___4 = 591, + FN_IP6_11_8___4 = 592, + FN_D7___4 = 593, + FN_MSIOF2_TXD_B___4 = 594, + FN_VI4_DATA23___4 = 595, + FN_VI5_DATA7___3 = 596, + FN_IP7_11_8___4 = 597, + FN_D15___4 = 598, + FN_LCDOUT7___4 = 599, + FN_MSIOF3_SS2_A___4 = 600, + FN_HTX3_C___4 = 601, + FN_VI4_DATA7_A___4 = 602, + FN_DU_DR7___4 = 603, + FN_SDA6_C___3 = 604, + FN_IP4_15_12___4 = 605, + FN_CS0_N___4 = 606, + FN_VI5_CLKENB___3 = 607, + FN_IP5_15_12___4 = 608, + FN_D0___4 = 609, + FN_MSIOF2_SS1_B___4 = 610, + FN_MSIOF3_SCK_A___4 = 611, + FN_VI4_DATA16___4 = 612, + FN_VI5_DATA0___3 = 613, + FN_IP6_15_12___4 = 614, + FN_D8___4 = 615, + FN_LCDOUT0___4 = 616, + FN_MSIOF2_SCK_D___3 = 617, + FN_SCK4_C___3 = 618, + FN_VI4_DATA0_A___4 = 619, + FN_DU_DR0___4 = 620, + FN_IP4_19_16___4 = 621, + FN_CS1_N___3 = 622, + FN_VI5_CLK___3 = 623, + FN_EX_WAIT0_B___3 = 624, + FN_IP5_19_16___4 = 625, + FN_D1___4 = 626, + FN_MSIOF2_SS2_B___4 = 627, + FN_MSIOF3_SYNC_A___4 = 628, + FN_VI4_DATA17___4 = 629, + FN_VI5_DATA1___3 = 630, + FN_IP6_19_16___4 = 631, + FN_D9___4 = 632, + FN_LCDOUT1___4 = 633, + FN_MSIOF2_SYNC_D___3 = 634, + FN_VI4_DATA1_A___4 = 635, + FN_DU_DR1___4 = 636, + FN_IP7_19_16___4 = 637, + FN_SD0_CLK___4 = 638, + FN_MSIOF1_SCK_E___3 = 639, + FN_STP_OPWM_0_B___3 = 640, + FN_IP4_23_20___4 = 641, + FN_BS_N___4 = 642, + FN_QSTVA_QVS___4 = 643, + FN_MSIOF3_SCK_D___3 = 644, + FN_SCK3___3 = 645, + FN_HSCK3___3 = 646, + FN_CAN1_TX___4 = 647, + FN_CANFD1_TX___4 = 648, + FN_IETX_A___3 = 649, + FN_IP5_23_20___4 = 650, + FN_D2___4 = 651, + FN_MSIOF3_RXD_A___4 = 652, + FN_VI4_DATA18___4 = 653, + FN_VI5_DATA2___3 = 654, + FN_IP6_23_20___4 = 655, + FN_D10___4 = 656, + FN_LCDOUT2___4 = 657, + FN_MSIOF2_RXD_D___3 = 658, + FN_HRX3_B___4 = 659, + FN_VI4_DATA2_A___4 = 660, + FN_CTS4_N_C___4 = 661, + FN_DU_DR2___4 = 662, + FN_IP7_23_20___4 = 663, + FN_SD0_CMD___4 = 664, + FN_MSIOF1_SYNC_E___3 = 665, + FN_STP_IVCXO27_0_B___3 = 666, + FN_IP4_27_24___4 = 667, + FN_RD_N___4 = 668, + FN_MSIOF3_SYNC_D___3 = 669, + FN_RX3_A___4 = 670, + FN_HRX3_A___4 = 671, + FN_CAN0_TX_A___3 = 672, + FN_CANFD0_TX_A___3 = 673, + FN_IP5_27_24___4 = 674, + FN_D3___4 = 675, + FN_MSIOF3_TXD_A___4 = 676, + FN_VI4_DATA19___4 = 677, + FN_VI5_DATA3___3 = 678, + FN_IP6_27_24___4 = 679, + FN_D11___4 = 680, + FN_LCDOUT3___4 = 681, + FN_MSIOF2_TXD_D___3 = 682, + FN_HTX3_B___4 = 683, + FN_VI4_DATA3_A___4 = 684, + FN_RTS4_N_C___4 = 685, + FN_DU_DR3___4 = 686, + FN_IP7_27_24___4 = 687, + FN_SD0_DAT0___4 = 688, + FN_MSIOF1_RXD_E___3 = 689, + FN_TS_SCK0_B___3 = 690, + FN_STP_ISCLK_0_B___3 = 691, + FN_IP4_31_28___4 = 692, + FN_RD_WR_N___4 = 693, + FN_MSIOF3_RXD_D___3 = 694, + FN_TX3_A___4 = 695, + FN_HTX3_A___4 = 696, + FN_CAN0_RX_A___3 = 697, + FN_CANFD0_RX_A___3 = 698, + FN_IP5_31_28___4 = 699, + FN_D4___4 = 700, + FN_MSIOF2_SCK_B___4 = 701, + FN_VI4_DATA20___4 = 702, + FN_VI5_DATA4___3 = 703, + FN_IP6_31_28___4 = 704, + FN_D12___4 = 705, + FN_LCDOUT4___4 = 706, + FN_MSIOF2_SS1_D___3 = 707, + FN_RX4_C___4 = 708, + FN_VI4_DATA4_A___4 = 709, + FN_DU_DR4___4 = 710, + FN_IP7_31_28___4 = 711, + FN_SD0_DAT1___4 = 712, + FN_MSIOF1_TXD_E___3 = 713, + FN_TS_SPSYNC0_B___3 = 714, + FN_STP_ISSYNC_0_B___3 = 715, + FN_IP8_3_0___4 = 716, + FN_SD0_DAT2___4 = 717, + FN_MSIOF1_SS1_E___3 = 718, + FN_TS_SDAT0_B___3 = 719, + FN_STP_ISD_0_B___3 = 720, + FN_IP9_3_0___4 = 721, + FN_SD2_CLK___3 = 722, + FN_NFDATA8___4 = 723, + FN_IP10_3_0___4 = 724, + FN_SD3_CMD___4 = 725, + FN_NFRE_N___4 = 726, + FN_IP11_3_0___4 = 727, + FN_SD3_DAT7___4 = 728, + FN_SD3_WP___4 = 729, + FN_NFDATA7___4 = 730, + FN_IP8_7_4___4 = 731, + FN_SD0_DAT3___4 = 732, + FN_MSIOF1_SS2_E___3 = 733, + FN_TS_SDEN0_B___3 = 734, + FN_STP_ISEN_0_B___3 = 735, + FN_IP9_7_4___4 = 736, + FN_SD2_CMD___3 = 737, + FN_NFDATA9___4 = 738, + FN_IP10_7_4___4 = 739, + FN_SD3_DAT0___4 = 740, + FN_NFDATA0___4 = 741, + FN_IP11_7_4___4 = 742, + FN_SD3_DS___4 = 743, + FN_NFCLE___4 = 744, + FN_IP8_11_8___4 = 745, + FN_SD1_CLK___4 = 746, + FN_MSIOF1_SCK_G___3 = 747, + FN_SIM0_CLK_A___4 = 748, + FN_IP9_11_8___4 = 749, + FN_SD2_DAT0___3 = 750, + FN_NFDATA10___4 = 751, + FN_IP10_11_8___4 = 752, + FN_SD3_DAT1___4 = 753, + FN_NFDATA1___4 = 754, + FN_IP11_11_8___4 = 755, + FN_SD0_CD___4 = 756, + FN_NFDATA14_A___4 = 757, + FN_SCL2_B___4 = 758, + FN_SIM0_RST_A___4 = 759, + FN_IP8_15_12___4 = 760, + FN_SD1_CMD___4 = 761, + FN_MSIOF1_SYNC_G___3 = 762, + FN_NFCE_N_B___4 = 763, + FN_SIM0_D_A___4 = 764, + FN_STP_IVCXO27_1_B___3 = 765, + FN_IP9_15_12___4 = 766, + FN_SD2_DAT1___3 = 767, + FN_NFDATA11___4 = 768, + FN_IP10_15_12___4 = 769, + FN_SD3_DAT2___4 = 770, + FN_NFDATA2___4 = 771, + FN_IP11_15_12___4 = 772, + FN_SD0_WP___4 = 773, + FN_NFDATA15_A___4 = 774, + FN_SDA2_B___4 = 775, + FN_IP8_19_16___4 = 776, + FN_SD1_DAT0___4 = 777, + FN_SD2_DAT4___3 = 778, + FN_MSIOF1_RXD_G___3 = 779, + FN_NFWP_N_B___4 = 780, + FN_TS_SCK1_B___3 = 781, + FN_STP_ISCLK_1_B___3 = 782, + FN_IP9_19_16___4 = 783, + FN_SD2_DAT2___3 = 784, + FN_NFDATA12___4 = 785, + FN_IP10_19_16___4 = 786, + FN_SD3_DAT3___4 = 787, + FN_NFDATA3___4 = 788, + FN_IP11_19_16___4 = 789, + FN_SD1_CD___4 = 790, + FN_NFRB_N_A___4 = 791, + FN_SIM0_CLK_B___4 = 792, + FN_IP8_23_20___4 = 793, + FN_SD1_DAT1___4 = 794, + FN_SD2_DAT5___3 = 795, + FN_MSIOF1_TXD_G___3 = 796, + FN_NFDATA14_B___4 = 797, + FN_TS_SPSYNC1_B___3 = 798, + FN_STP_ISSYNC_1_B___3 = 799, + FN_IP9_23_20___4 = 800, + FN_SD2_DAT3___3 = 801, + FN_NFDATA13___4 = 802, + FN_IP10_23_20___4 = 803, + FN_SD3_DAT4___4 = 804, + FN_SD2_CD_A___3 = 805, + FN_NFDATA4___4 = 806, + FN_IP11_23_20___4 = 807, + FN_SD1_WP___4 = 808, + FN_NFCE_N_A___4 = 809, + FN_SIM0_D_B___4 = 810, + FN_IP8_27_24___4 = 811, + FN_SD1_DAT2___4 = 812, + FN_SD2_DAT6___3 = 813, + FN_MSIOF1_SS1_G___3 = 814, + FN_NFDATA15_B___4 = 815, + FN_TS_SDAT1_B___3 = 816, + FN_STP_ISD_1_B___3 = 817, + FN_IP9_27_24___4 = 818, + FN_SD2_DS___3 = 819, + FN_NFALE___3 = 820, + FN_SATA_DEVSLP_B___2 = 821, + FN_IP10_27_24___4 = 822, + FN_SD3_DAT5___4 = 823, + FN_SD2_WP_A___3 = 824, + FN_NFDATA5___4 = 825, + FN_IP11_27_24___4 = 826, + FN_SCK0___3 = 827, + FN_HSCK1_B___4 = 828, + FN_MSIOF1_SS2_B___3 = 829, + FN_AUDIO_CLKC_B___4 = 830, + FN_SDA2_A___4 = 831, + FN_SIM0_RST_B___4 = 832, + FN_STP_OPWM_0_C___3 = 833, + FN_RIF0_CLK_B___4 = 834, + FN_ADICHS2___3 = 835, + FN_SCK5_B___3 = 836, + FN_IP8_31_28___4 = 837, + FN_SD1_DAT3___4 = 838, + FN_SD2_DAT7___3 = 839, + FN_MSIOF1_SS2_G___3 = 840, + FN_NFRB_N_B___4 = 841, + FN_TS_SDEN1_B___3 = 842, + FN_STP_ISEN_1_B___3 = 843, + FN_IP9_31_28___4 = 844, + FN_SD3_CLK___4 = 845, + FN_NFWE_N___4 = 846, + FN_IP10_31_28___4 = 847, + FN_SD3_DAT6___4 = 848, + FN_SD3_CD___4 = 849, + FN_NFDATA6___4 = 850, + FN_IP11_31_28___4 = 851, + FN_RX0___3 = 852, + FN_HRX1_B___4 = 853, + FN_TS_SCK0_C___3 = 854, + FN_STP_ISCLK_0_C___3 = 855, + FN_RIF0_D0_B___4 = 856, + FN_IP12_3_0___4 = 857, + FN_TX0___3 = 858, + FN_HTX1_B___4 = 859, + FN_TS_SPSYNC0_C___3 = 860, + FN_STP_ISSYNC_0_C___3 = 861, + FN_RIF0_D1_B___4 = 862, + FN_IP13_3_0___4 = 863, + FN_TX2_A___4 = 864, + FN_SD2_CD_B___3 = 865, + FN_SCL1_A___4 = 866, + FN_FMCLK_A___4 = 867, + FN_RIF1_D1_C___3 = 868, + FN_FSO_CFE_0_N___3 = 869, + FN_IP14_3_0___4 = 870, + FN_MSIOF0_SS1___4 = 871, + FN_RX5_A___4 = 872, + FN_NFWP_N_A___4 = 873, + FN_AUDIO_CLKA_C___3 = 874, + FN_SSI_SCK2_A___4 = 875, + FN_STP_IVCXO27_0_C___3 = 876, + FN_AUDIO_CLKOUT3_A___4 = 877, + FN_TCLK1_B___4 = 878, + FN_IP15_3_0___4 = 879, + FN_SSI_SDATA1_A___3 = 880, + FN_IP12_7_4___4 = 881, + FN_CTS0_N___3 = 882, + FN_HCTS1_N_B___4 = 883, + FN_MSIOF1_SYNC_B___3 = 884, + FN_TS_SPSYNC1_C___3 = 885, + FN_STP_ISSYNC_1_C___3 = 886, + FN_RIF1_SYNC_B___3 = 887, + FN_AUDIO_CLKOUT_C___3 = 888, + FN_ADICS_SAMP___3 = 889, + FN_IP13_7_4___4 = 890, + FN_RX2_A___4 = 891, + FN_SD2_WP_B___3 = 892, + FN_SDA1_A___4 = 893, + FN_FMIN_A___4 = 894, + FN_RIF1_SYNC_C___3 = 895, + FN_FSO_CFE_1_N___3 = 896, + FN_IP14_7_4___4 = 897, + FN_MSIOF0_SS2___4 = 898, + FN_TX5_A___4 = 899, + FN_MSIOF1_SS2_D___3 = 900, + FN_AUDIO_CLKC_A___4 = 901, + FN_SSI_WS2_A___4 = 902, + FN_STP_OPWM_0_D___3 = 903, + FN_AUDIO_CLKOUT_D___3 = 904, + FN_SPEEDIN_B___4 = 905, + FN_IP15_7_4___4 = 906, + FN_SSI_SDATA2_A___3 = 907, + FN_SSI_SCK1_B___3 = 908, + FN_IP12_11_8___4 = 909, + FN_RTS0_N___3 = 910, + FN_HRTS1_N_B___4 = 911, + FN_MSIOF1_SS1_B___3 = 912, + FN_AUDIO_CLKA_B___3 = 913, + FN_SCL2_A___4 = 914, + FN_STP_IVCXO27_1_C___3 = 915, + FN_RIF0_SYNC_B___4 = 916, + FN_ADICHS1___3 = 917, + FN_IP13_11_8___4 = 918, + FN_HSCK0___3 = 919, + FN_MSIOF1_SCK_D___3 = 920, + FN_AUDIO_CLKB_A___4 = 921, + FN_SSI_SDATA1_B___3 = 922, + FN_TS_SCK0_D___3 = 923, + FN_STP_ISCLK_0_D___3 = 924, + FN_RIF0_CLK_C___3 = 925, + FN_RX5_B___4 = 926, + FN_IP14_11_8___4 = 927, + FN_MLB_CLK___4 = 928, + FN_MSIOF1_SCK_F___3 = 929, + FN_SCL1_B___4 = 930, + FN_IP15_11_8___4 = 931, + FN_SSI_SCK349___4 = 932, + FN_MSIOF1_SS1_A___3 = 933, + FN_STP_OPWM_0_A___3 = 934, + FN_IP12_15_12___4 = 935, + FN_RX1_A___3 = 936, + FN_HRX1_A___4 = 937, + FN_TS_SDAT0_C___3 = 938, + FN_STP_ISD_0_C___3 = 939, + FN_RIF1_CLK_C___3 = 940, + FN_IP13_15_12___4 = 941, + FN_HRX0___3 = 942, + FN_MSIOF1_RXD_D___3 = 943, + FN_SSI_SDATA2_B___3 = 944, + FN_TS_SDEN0_D___3 = 945, + FN_STP_ISEN_0_D___3 = 946, + FN_RIF0_D0_C___3 = 947, + FN_IP14_15_12___4 = 948, + FN_MLB_SIG___4 = 949, + FN_RX1_B___3 = 950, + FN_MSIOF1_SYNC_F___3 = 951, + FN_SDA1_B___4 = 952, + FN_IP15_15_12___4 = 953, + FN_SSI_WS349___4 = 954, + FN_HCTS2_N_A___4 = 955, + FN_MSIOF1_SS2_A___3 = 956, + FN_STP_IVCXO27_0_A___3 = 957, + FN_IP12_19_16___4 = 958, + FN_TX1_A___3 = 959, + FN_HTX1_A___4 = 960, + FN_TS_SDEN0_C___3 = 961, + FN_STP_ISEN_0_C___3 = 962, + FN_RIF1_D0_C___3 = 963, + FN_IP13_19_16___4 = 964, + FN_HTX0___3 = 965, + FN_MSIOF1_TXD_D___3 = 966, + FN_SSI_SDATA9_B___3 = 967, + FN_TS_SDAT0_D___3 = 968, + FN_STP_ISD_0_D___3 = 969, + FN_RIF0_D1_C___3 = 970, + FN_IP14_19_16___4 = 971, + FN_MLB_DAT___4 = 972, + FN_TX1_B___3 = 973, + FN_MSIOF1_RXD_F___3 = 974, + FN_IP15_19_16___4 = 975, + FN_SSI_SDATA3___4 = 976, + FN_HRTS2_N_A___4 = 977, + FN_MSIOF1_TXD_A___3 = 978, + FN_TS_SCK0_A___3 = 979, + FN_STP_ISCLK_0_A___3 = 980, + FN_RIF0_D1_A___4 = 981, + FN_RIF2_D0_A___4 = 982, + FN_IP12_23_20___4 = 983, + FN_CTS1_N___4 = 984, + FN_HCTS1_N_A___3 = 985, + FN_MSIOF1_RXD_B___3 = 986, + FN_TS_SDEN1_C___3 = 987, + FN_STP_ISEN_1_C___3 = 988, + FN_RIF1_D0_B___3 = 989, + FN_ADIDATA___3 = 990, + FN_IP13_23_20___4 = 991, + FN_HCTS0_N___3 = 992, + FN_RX2_B___4 = 993, + FN_MSIOF1_SYNC_D___3 = 994, + FN_SSI_SCK9_A___4 = 995, + FN_TS_SPSYNC0_D___3 = 996, + FN_STP_ISSYNC_0_D___3 = 997, + FN_RIF0_SYNC_C___3 = 998, + FN_AUDIO_CLKOUT1_A___4 = 999, + FN_IP14_23_20___4 = 1000, + FN_SSI_SCK01239___4 = 1001, + FN_MSIOF1_TXD_F___3 = 1002, + FN_IP15_23_20___4 = 1003, + FN_SSI_SCK4___4 = 1004, + FN_HRX2_A___4 = 1005, + FN_MSIOF1_SCK_A___3 = 1006, + FN_TS_SDAT0_A___3 = 1007, + FN_STP_ISD_0_A___3 = 1008, + FN_RIF0_CLK_A___4 = 1009, + FN_RIF2_CLK_A___4 = 1010, + FN_IP12_27_24___4 = 1011, + FN_RTS1_N___4 = 1012, + FN_HRTS1_N_A___3 = 1013, + FN_MSIOF1_TXD_B___3 = 1014, + FN_TS_SDAT1_C___3 = 1015, + FN_STP_ISD_1_C___3 = 1016, + FN_RIF1_D1_B___3 = 1017, + FN_ADICHS0___3 = 1018, + FN_IP13_27_24___4 = 1019, + FN_HRTS0_N___3 = 1020, + FN_TX2_B___4 = 1021, + FN_MSIOF1_SS1_D___3 = 1022, + FN_SSI_WS9_A___4 = 1023, + FN_STP_IVCXO27_0_D___3 = 1024, + FN_BPFCLK_A___4 = 1025, + FN_AUDIO_CLKOUT2_A___4 = 1026, + FN_IP14_27_24___4 = 1027, + FN_SSI_WS01239___4 = 1028, + FN_MSIOF1_SS1_F___3 = 1029, + FN_IP15_27_24___4 = 1030, + FN_SSI_WS4___4 = 1031, + FN_HTX2_A___4 = 1032, + FN_MSIOF1_SYNC_A___3 = 1033, + FN_TS_SDEN0_A___3 = 1034, + FN_STP_ISEN_0_A___3 = 1035, + FN_RIF0_SYNC_A___4 = 1036, + FN_RIF2_SYNC_A___4 = 1037, + FN_IP12_31_28___4 = 1038, + FN_SCK2___3 = 1039, + FN_SCIF_CLK_B___4 = 1040, + FN_MSIOF1_SCK_B___3 = 1041, + FN_TS_SCK1_C___3 = 1042, + FN_STP_ISCLK_1_C___3 = 1043, + FN_RIF1_CLK_B___3 = 1044, + FN_ADICLK___3 = 1045, + FN_IP13_31_28___4 = 1046, + FN_MSIOF0_SYNC___4 = 1047, + FN_AUDIO_CLKOUT_A___4 = 1048, + FN_TX5_B___4 = 1049, + FN_BPFCLK_D___3 = 1050, + FN_IP14_31_28___4 = 1051, + FN_SSI_SDATA0___4 = 1052, + FN_MSIOF1_SS2_F___3 = 1053, + FN_IP15_31_28___4 = 1054, + FN_SSI_SDATA4___4 = 1055, + FN_HSCK2_A___4 = 1056, + FN_MSIOF1_RXD_A___3 = 1057, + FN_TS_SPSYNC0_A___3 = 1058, + FN_STP_ISSYNC_0_A___3 = 1059, + FN_RIF0_D0_A___4 = 1060, + FN_RIF2_D1_A___4 = 1061, + FN_IP16_3_0___3 = 1062, + FN_SSI_SCK6___4 = 1063, + FN_USB2_PWEN = 1064, + FN_SIM0_RST_D___3 = 1065, + FN_IP17_3_0___3 = 1066, + FN_AUDIO_CLKA_A___3 = 1067, + FN_IP18_3_0___3 = 1068, + FN_USB2_CH3_PWEN = 1069, + FN_AUDIO_CLKOUT2_B___4 = 1070, + FN_SSI_SCK9_B___4 = 1071, + FN_TS_SDEN0_E___3 = 1072, + FN_STP_ISEN_0_E___3 = 1073, + FN_RIF2_D0_B___4 = 1074, + FN_TPU0TO2___4 = 1075, + FN_FMCLK_C___4 = 1076, + FN_FMCLK_D___3 = 1077, + FN_IP16_7_4___3 = 1078, + FN_SSI_WS6___4 = 1079, + FN_USB2_OVC = 1080, + FN_SIM0_D_D___3 = 1081, + FN_IP17_7_4___3 = 1082, + FN_AUDIO_CLKB_B___4 = 1083, + FN_SCIF_CLK_A___4 = 1084, + FN_STP_IVCXO27_1_D___3 = 1085, + FN_REMOCON_A___4 = 1086, + FN_TCLK1_A___4 = 1087, + FN_IP18_7_4___3 = 1088, + FN_USB2_CH3_OVC = 1089, + FN_AUDIO_CLKOUT3_B___4 = 1090, + FN_SSI_WS9_B___4 = 1091, + FN_TS_SPSYNC0_E___3 = 1092, + FN_STP_ISSYNC_0_E___3 = 1093, + FN_RIF2_D1_B___4 = 1094, + FN_TPU0TO3___4 = 1095, + FN_FMIN_C___4 = 1096, + FN_FMIN_D___3 = 1097, + FN_IP16_11_8___3 = 1098, + FN_SSI_SDATA6___4 = 1099, + FN_SIM0_CLK_D___3 = 1100, + FN_SATA_DEVSLP_A___2 = 1101, + FN_IP17_11_8___3 = 1102, + FN_USB0_PWEN___3 = 1103, + FN_SIM0_RST_C___3 = 1104, + FN_TS_SCK1_D___3 = 1105, + FN_STP_ISCLK_1_D___3 = 1106, + FN_BPFCLK_B___4 = 1107, + FN_RIF3_CLK_B___4 = 1108, + FN_HSCK2_C___3 = 1109, + FN_IP16_15_12___3 = 1110, + FN_SSI_SCK78___4 = 1111, + FN_HRX2_B___4 = 1112, + FN_MSIOF1_SCK_C___3 = 1113, + FN_TS_SCK1_A___3 = 1114, + FN_STP_ISCLK_1_A___3 = 1115, + FN_RIF1_CLK_A___3 = 1116, + FN_RIF3_CLK_A___4 = 1117, + FN_IP17_15_12___3 = 1118, + FN_USB0_OVC___3 = 1119, + FN_SIM0_D_C___3 = 1120, + FN_TS_SDAT1_D___3 = 1121, + FN_STP_ISD_1_D___3 = 1122, + FN_RIF3_SYNC_B___4 = 1123, + FN_HRX2_C___3 = 1124, + FN_IP16_19_16___3 = 1125, + FN_SSI_WS78___4 = 1126, + FN_HTX2_B___4 = 1127, + FN_MSIOF1_SYNC_C___3 = 1128, + FN_TS_SDAT1_A___3 = 1129, + FN_STP_ISD_1_A___3 = 1130, + FN_RIF1_SYNC_A___3 = 1131, + FN_RIF3_SYNC_A___4 = 1132, + FN_IP17_19_16___3 = 1133, + FN_USB1_PWEN___3 = 1134, + FN_SIM0_CLK_C___3 = 1135, + FN_SSI_SCK1_A___3 = 1136, + FN_TS_SCK0_E___3 = 1137, + FN_STP_ISCLK_0_E___3 = 1138, + FN_FMCLK_B___4 = 1139, + FN_RIF2_CLK_B___4 = 1140, + FN_SPEEDIN_A___4 = 1141, + FN_HTX2_C___3 = 1142, + FN_IP16_23_20___3 = 1143, + FN_SSI_SDATA7___4 = 1144, + FN_HCTS2_N_B___3 = 1145, + FN_MSIOF1_RXD_C___3 = 1146, + FN_TS_SDEN1_A___3 = 1147, + FN_STP_ISEN_1_A___3 = 1148, + FN_RIF1_D0_A___3 = 1149, + FN_RIF3_D0_A___4 = 1150, + FN_TCLK2_A___4 = 1151, + FN_IP17_23_20___3 = 1152, + FN_USB1_OVC___3 = 1153, + FN_MSIOF1_SS2_C___3 = 1154, + FN_SSI_WS1_A___3 = 1155, + FN_TS_SDAT0_E___3 = 1156, + FN_STP_ISD_0_E___3 = 1157, + FN_FMIN_B___4 = 1158, + FN_RIF2_SYNC_B___4 = 1159, + FN_REMOCON_B___4 = 1160, + FN_HCTS2_N_C___3 = 1161, + FN_IP16_27_24___3 = 1162, + FN_SSI_SDATA8___4 = 1163, + FN_HRTS2_N_B___3 = 1164, + FN_MSIOF1_TXD_C___3 = 1165, + FN_TS_SPSYNC1_A___3 = 1166, + FN_STP_ISSYNC_1_A___3 = 1167, + FN_RIF1_D1_A___3 = 1168, + FN_RIF3_D1_A___4 = 1169, + FN_IP17_27_24___3 = 1170, + FN_USB30_PWEN___4 = 1171, + FN_AUDIO_CLKOUT_B___4 = 1172, + FN_SSI_SCK2_B___4 = 1173, + FN_TS_SDEN1_D___3 = 1174, + FN_STP_ISEN_1_D___3 = 1175, + FN_STP_OPWM_0_E___3 = 1176, + FN_RIF3_D0_B___4 = 1177, + FN_TCLK2_B___4 = 1178, + FN_TPU0TO0___4 = 1179, + FN_BPFCLK_C___4 = 1180, + FN_HRTS2_N_C___3 = 1181, + FN_IP16_31_28___3 = 1182, + FN_SSI_SDATA9_A___3 = 1183, + FN_HSCK2_B___3 = 1184, + FN_MSIOF1_SS1_C___3 = 1185, + FN_HSCK1_A___4 = 1186, + FN_SSI_WS1_B___3 = 1187, + FN_SCK1___4 = 1188, + FN_STP_IVCXO27_1_A___3 = 1189, + FN_SCK5_A___4 = 1190, + FN_IP17_31_28___3 = 1191, + FN_USB30_OVC___4 = 1192, + FN_AUDIO_CLKOUT1_B___4 = 1193, + FN_SSI_WS2_B___4 = 1194, + FN_TS_SPSYNC1_D___3 = 1195, + FN_STP_ISSYNC_1_D___3 = 1196, + FN_STP_IVCXO27_0_E___3 = 1197, + FN_RIF3_D1_B___4 = 1198, + FN_FSO_TOE_N___3 = 1199, + FN_TPU0TO1___4 = 1200, + FN_SEL_MSIOF3_0___4 = 1201, + FN_SEL_MSIOF3_1___4 = 1202, + FN_SEL_MSIOF3_2___3 = 1203, + FN_SEL_MSIOF3_3___3 = 1204, + FN_SEL_MSIOF3_4___3 = 1205, + FN_SEL_TSIF1_0___3 = 1206, + FN_SEL_TSIF1_1___3 = 1207, + FN_SEL_TSIF1_2___3 = 1208, + FN_SEL_TSIF1_3___3 = 1209, + FN_I2C_SEL_5_0___3 = 1210, + FN_I2C_SEL_5_1___3 = 1211, + FN_I2C_SEL_3_0___3 = 1212, + FN_I2C_SEL_3_1___3 = 1213, + FN_SEL_TSIF0_0___3 = 1214, + FN_SEL_TSIF0_1___3 = 1215, + FN_SEL_TSIF0_2___3 = 1216, + FN_SEL_TSIF0_3___3 = 1217, + FN_SEL_TSIF0_4___3 = 1218, + FN_I2C_SEL_0_0___3 = 1219, + FN_I2C_SEL_0_1___3 = 1220, + FN_SEL_MSIOF2_0___4 = 1221, + FN_SEL_MSIOF2_1___4 = 1222, + FN_SEL_MSIOF2_2___3 = 1223, + FN_SEL_MSIOF2_3___3 = 1224, + FN_SEL_FM_0___4 = 1225, + FN_SEL_FM_1___4 = 1226, + FN_SEL_FM_2___4 = 1227, + FN_SEL_FM_3___3 = 1228, + FN_SEL_MSIOF1_0___3 = 1229, + FN_SEL_MSIOF1_1___3 = 1230, + FN_SEL_MSIOF1_2___3 = 1231, + FN_SEL_MSIOF1_3___3 = 1232, + FN_SEL_MSIOF1_4___3 = 1233, + FN_SEL_MSIOF1_5___3 = 1234, + FN_SEL_MSIOF1_6___3 = 1235, + FN_SEL_TIMER_TMU1_0 = 1236, + FN_SEL_TIMER_TMU1_1 = 1237, + FN_SEL_SCIF5_0___4 = 1238, + FN_SEL_SCIF5_1___4 = 1239, + FN_SEL_SSP1_1_0___3 = 1240, + FN_SEL_SSP1_1_1___3 = 1241, + FN_SEL_SSP1_1_2___3 = 1242, + FN_SEL_SSP1_1_3___3 = 1243, + FN_SEL_I2C6_0___4 = 1244, + FN_SEL_I2C6_1___4 = 1245, + FN_SEL_I2C6_2___3 = 1246, + FN_SEL_LBSC_0___3 = 1247, + FN_SEL_LBSC_1___3 = 1248, + FN_SEL_SSP1_0_0___3 = 1249, + FN_SEL_SSP1_0_1___3 = 1250, + FN_SEL_SSP1_0_2___3 = 1251, + FN_SEL_SSP1_0_3___3 = 1252, + FN_SEL_SSP1_0_4___3 = 1253, + FN_SEL_IEBUS_0___3 = 1254, + FN_SEL_IEBUS_1___3 = 1255, + FN_SEL_I2C2_0___4 = 1256, + FN_SEL_I2C2_1___4 = 1257, + FN_SEL_SSI2_0___4 = 1258, + FN_SEL_SSI2_1___4 = 1259, + FN_SEL_I2C1_0___4 = 1260, + FN_SEL_I2C1_1___4 = 1261, + FN_SEL_SSI1_0___3 = 1262, + FN_SEL_SSI1_1___3 = 1263, + FN_SEL_SSI9_0___4 = 1264, + FN_SEL_SSI9_1___4 = 1265, + FN_SEL_HSCIF4_0___4 = 1266, + FN_SEL_HSCIF4_1___4 = 1267, + FN_SEL_SPEED_PULSE_0___3 = 1268, + FN_SEL_SPEED_PULSE_1___3 = 1269, + FN_SEL_TIMER_TMU2_0___3 = 1270, + FN_SEL_TIMER_TMU2_1___3 = 1271, + FN_SEL_HSCIF3_0___4 = 1272, + FN_SEL_HSCIF3_1___4 = 1273, + FN_SEL_HSCIF3_2___4 = 1274, + FN_SEL_HSCIF3_3___4 = 1275, + FN_SEL_SIMCARD_0___4 = 1276, + FN_SEL_SIMCARD_1___4 = 1277, + FN_SEL_SIMCARD_2___3 = 1278, + FN_SEL_SIMCARD_3___3 = 1279, + FN_SEL_ADGB_0___4 = 1280, + FN_SEL_ADGB_1___4 = 1281, + FN_SEL_ADGC_0___4 = 1282, + FN_SEL_ADGC_1___4 = 1283, + FN_SEL_HSCIF1_0___4 = 1284, + FN_SEL_HSCIF1_1___4 = 1285, + FN_SEL_SDHI2_0___3 = 1286, + FN_SEL_SDHI2_1___3 = 1287, + FN_SEL_SCIF4_0___4 = 1288, + FN_SEL_SCIF4_1___4 = 1289, + FN_SEL_SCIF4_2___4 = 1290, + FN_SEL_HSCIF2_0___4 = 1291, + FN_SEL_HSCIF2_1___4 = 1292, + FN_SEL_HSCIF2_2___3 = 1293, + FN_SEL_SCIF3_0___4 = 1294, + FN_SEL_SCIF3_1___4 = 1295, + FN_SEL_ETHERAVB_0___3 = 1296, + FN_SEL_ETHERAVB_1___3 = 1297, + FN_SEL_SCIF2_0___4 = 1298, + FN_SEL_SCIF2_1___4 = 1299, + FN_SEL_DRIF3_0___4 = 1300, + FN_SEL_DRIF3_1___4 = 1301, + FN_SEL_SCIF1_0___3 = 1302, + FN_SEL_SCIF1_1___3 = 1303, + FN_SEL_DRIF2_0___4 = 1304, + FN_SEL_DRIF2_1___4 = 1305, + FN_SEL_SCIF_0___4 = 1306, + FN_SEL_SCIF_1___4 = 1307, + FN_SEL_DRIF1_0___3 = 1308, + FN_SEL_DRIF1_1___3 = 1309, + FN_SEL_DRIF1_2___3 = 1310, + FN_SEL_REMOCON_0___4 = 1311, + FN_SEL_REMOCON_1___4 = 1312, + FN_SEL_DRIF0_0___4 = 1313, + FN_SEL_DRIF0_1___4 = 1314, + FN_SEL_DRIF0_2___3 = 1315, + FN_SEL_RCAN0_0___3 = 1316, + FN_SEL_RCAN0_1___3 = 1317, + FN_SEL_CANFD0_0___3 = 1318, + FN_SEL_CANFD0_1___3 = 1319, + FN_SEL_PWM6_0___4 = 1320, + FN_SEL_PWM6_1___4 = 1321, + FN_SEL_ADGA_0___3 = 1322, + FN_SEL_ADGA_1___3 = 1323, + FN_SEL_ADGA_2___3 = 1324, + FN_SEL_ADGA_3___3 = 1325, + FN_SEL_PWM5_0___4 = 1326, + FN_SEL_PWM5_1___4 = 1327, + FN_SEL_PWM4_0___4 = 1328, + FN_SEL_PWM4_1___4 = 1329, + FN_SEL_PWM3_0___4 = 1330, + FN_SEL_PWM3_1___4 = 1331, + FN_SEL_PWM2_0___4 = 1332, + FN_SEL_PWM2_1___4 = 1333, + FN_SEL_PWM1_0___4 = 1334, + FN_SEL_PWM1_1___4 = 1335, + FN_SEL_VIN4_0___4 = 1336, + FN_SEL_VIN4_1___4 = 1337, + PINMUX_FUNCTION_END___4 = 1338, + PINMUX_MARK_BEGIN___4 = 1339, + CLKOUT_MARK___4 = 1340, + MSIOF0_RXD_MARK___4 = 1341, + MSIOF0_TXD_MARK___4 = 1342, + MSIOF0_SCK_MARK___4 = 1343, + SSI_SDATA5_MARK___4 = 1344, + SSI_WS5_MARK___4 = 1345, + SSI_SCK5_MARK___4 = 1346, + GP7_03_MARK___3 = 1347, + GP7_02_MARK___3 = 1348, + AVS2_MARK___3 = 1349, + AVS1_MARK___3 = 1350, + IP0_3_0_MARK___4 = 1351, + AVB_MDC_MARK___4 = 1352, + MSIOF2_SS2_C_MARK___3 = 1353, + IP1_3_0_MARK___4 = 1354, + IRQ2_MARK___4 = 1355, + QCPV_QDE_MARK___4 = 1356, + DU_EXODDF_DU_ODDF_DISP_CDE_MARK___3 = 1357, + VI4_DATA2_B_MARK___4 = 1358, + MSIOF3_SYNC_E_MARK___3 = 1359, + PWM3_B_MARK___4 = 1360, + IP2_3_0_MARK___4 = 1361, + A1_MARK___4 = 1362, + LCDOUT17_MARK___4 = 1363, + MSIOF3_TXD_B_MARK___4 = 1364, + VI4_DATA9_MARK___4 = 1365, + DU_DB1_MARK___4 = 1366, + PWM4_A_MARK___4 = 1367, + IP3_3_0_MARK___4 = 1368, + A9_MARK___4 = 1369, + MSIOF2_SCK_A_MARK___4 = 1370, + CTS4_N_B_MARK___3 = 1371, + VI5_VSYNC_N_MARK___3 = 1372, + IP0_7_4_MARK___4 = 1373, + AVB_MAGIC_MARK___4 = 1374, + MSIOF2_SS1_C_MARK___3 = 1375, + SCK4_A_MARK___4 = 1376, + IP1_7_4_MARK___4 = 1377, + IRQ3_MARK___4 = 1378, + QSTVB_QVE_MARK___4 = 1379, + DU_DOTCLKOUT1_MARK___3 = 1380, + VI4_DATA3_B_MARK___4 = 1381, + MSIOF3_SCK_E_MARK___3 = 1382, + PWM4_B_MARK___4 = 1383, + IP2_7_4_MARK___4 = 1384, + A2_MARK___4 = 1385, + LCDOUT18_MARK___4 = 1386, + MSIOF3_SCK_B_MARK___4 = 1387, + VI4_DATA10_MARK___4 = 1388, + DU_DB2_MARK___4 = 1389, + PWM5_A_MARK___4 = 1390, + IP3_7_4_MARK___4 = 1391, + A10_MARK___4 = 1392, + MSIOF2_RXD_A_MARK___4 = 1393, + RTS4_N_B_MARK___3 = 1394, + VI5_HSYNC_N_MARK___3 = 1395, + IP0_11_8_MARK___4 = 1396, + AVB_PHY_INT_MARK___4 = 1397, + MSIOF2_SYNC_C_MARK___3 = 1398, + RX4_A_MARK___4 = 1399, + IP1_11_8_MARK___4 = 1400, + IRQ4_MARK___4 = 1401, + QSTH_QHS_MARK___4 = 1402, + DU_EXHSYNC_DU_HSYNC_MARK___3 = 1403, + VI4_DATA4_B_MARK___4 = 1404, + MSIOF3_RXD_E_MARK___3 = 1405, + PWM5_B_MARK___4 = 1406, + IP2_11_8_MARK___4 = 1407, + A3_MARK___4 = 1408, + LCDOUT19_MARK___4 = 1409, + MSIOF3_RXD_B_MARK___4 = 1410, + VI4_DATA11_MARK___4 = 1411, + DU_DB3_MARK___4 = 1412, + PWM6_A_MARK___4 = 1413, + IP3_11_8_MARK___4 = 1414, + A11_MARK___4 = 1415, + TX3_B_MARK___4 = 1416, + MSIOF2_TXD_A_MARK___4 = 1417, + HTX4_B_MARK___4 = 1418, + HSCK4_MARK___3 = 1419, + VI5_FIELD_MARK___3 = 1420, + SCL6_A_MARK___4 = 1421, + AVB_AVTP_CAPTURE_B_MARK___3 = 1422, + PWM2_B_MARK___4 = 1423, + IP0_15_12_MARK___4 = 1424, + AVB_LINK_MARK___4 = 1425, + MSIOF2_SCK_C_MARK___3 = 1426, + TX4_A_MARK___4 = 1427, + IP1_15_12_MARK___4 = 1428, + IRQ5_MARK___4 = 1429, + QSTB_QHE_MARK___4 = 1430, + DU_EXVSYNC_DU_VSYNC_MARK___3 = 1431, + VI4_DATA5_B_MARK___4 = 1432, + FSCLKST2_N_B_MARK___3 = 1433, + MSIOF3_TXD_E_MARK___3 = 1434, + PWM6_B_MARK___4 = 1435, + IP2_15_12_MARK___4 = 1436, + A4_MARK___4 = 1437, + LCDOUT20_MARK___4 = 1438, + MSIOF3_SS1_B_MARK___4 = 1439, + VI4_DATA12_MARK___4 = 1440, + VI5_DATA12_MARK___3 = 1441, + DU_DB4_MARK___4 = 1442, + IP3_15_12_MARK___4 = 1443, + A12_MARK___4 = 1444, + LCDOUT12_MARK___4 = 1445, + MSIOF3_SCK_C_MARK___3 = 1446, + HRX4_A_MARK___4 = 1447, + VI5_DATA8_MARK___3 = 1448, + DU_DG4_MARK___4 = 1449, + IP0_19_16_MARK___4 = 1450, + AVB_AVTP_MATCH_A_MARK___3 = 1451, + MSIOF2_RXD_C_MARK___3 = 1452, + CTS4_N_A_MARK___4 = 1453, + FSCLKST2_N_A_MARK___3 = 1454, + IP1_19_16_MARK___4 = 1455, + PWM0_MARK___3 = 1456, + AVB_AVTP_PPS_MARK___4 = 1457, + VI4_DATA6_B_MARK___4 = 1458, + IECLK_B_MARK___3 = 1459, + IP2_19_16_MARK___4 = 1460, + A5_MARK___4 = 1461, + LCDOUT21_MARK___4 = 1462, + MSIOF3_SS2_B_MARK___3 = 1463, + SCK4_B_MARK___4 = 1464, + VI4_DATA13_MARK___4 = 1465, + VI5_DATA13_MARK___3 = 1466, + DU_DB5_MARK___4 = 1467, + IP3_19_16_MARK___4 = 1468, + A13_MARK___4 = 1469, + LCDOUT13_MARK___4 = 1470, + MSIOF3_SYNC_C_MARK___3 = 1471, + HTX4_A_MARK___4 = 1472, + VI5_DATA9_MARK___3 = 1473, + DU_DG5_MARK___4 = 1474, + IP0_23_20_MARK___4 = 1475, + AVB_AVTP_CAPTURE_A_MARK___3 = 1476, + MSIOF2_TXD_C_MARK___3 = 1477, + RTS4_N_A_MARK___4 = 1478, + IP1_23_20_MARK___4 = 1479, + PWM1_A_MARK___4 = 1480, + HRX3_D_MARK___4 = 1481, + VI4_DATA7_B_MARK___4 = 1482, + IERX_B_MARK___3 = 1483, + IP2_23_20_MARK___4 = 1484, + A6_MARK___4 = 1485, + LCDOUT22_MARK___4 = 1486, + MSIOF2_SS1_A_MARK___4 = 1487, + RX4_B_MARK___4 = 1488, + VI4_DATA14_MARK___4 = 1489, + VI5_DATA14_MARK___3 = 1490, + DU_DB6_MARK___4 = 1491, + IP3_23_20_MARK___4 = 1492, + A14_MARK___4 = 1493, + LCDOUT14_MARK___4 = 1494, + MSIOF3_RXD_C_MARK___3 = 1495, + HCTS4_N_MARK___3 = 1496, + VI5_DATA10_MARK___3 = 1497, + DU_DG6_MARK___4 = 1498, + IP0_27_24_MARK___4 = 1499, + IRQ0_MARK___4 = 1500, + QPOLB_MARK___4 = 1501, + DU_CDE_MARK___4 = 1502, + VI4_DATA0_B_MARK___4 = 1503, + CAN0_TX_B_MARK___3 = 1504, + CANFD0_TX_B_MARK___3 = 1505, + MSIOF3_SS2_E_MARK___3 = 1506, + IP1_27_24_MARK___4 = 1507, + PWM2_A_MARK___4 = 1508, + HTX3_D_MARK___4 = 1509, + IETX_B_MARK___3 = 1510, + IP2_27_24_MARK___4 = 1511, + A7_MARK___4 = 1512, + LCDOUT23_MARK___4 = 1513, + MSIOF2_SS2_A_MARK___4 = 1514, + TX4_B_MARK___4 = 1515, + VI4_DATA15_MARK___4 = 1516, + VI5_DATA15_MARK___3 = 1517, + DU_DB7_MARK___4 = 1518, + IP3_27_24_MARK___4 = 1519, + A15_MARK___4 = 1520, + LCDOUT15_MARK___4 = 1521, + MSIOF3_TXD_C_MARK___3 = 1522, + HRTS4_N_MARK___3 = 1523, + VI5_DATA11_MARK___3 = 1524, + DU_DG7_MARK___4 = 1525, + IP0_31_28_MARK___4 = 1526, + IRQ1_MARK___4 = 1527, + QPOLA_MARK___4 = 1528, + DU_DISP_MARK___4 = 1529, + VI4_DATA1_B_MARK___4 = 1530, + CAN0_RX_B_MARK___3 = 1531, + CANFD0_RX_B_MARK___3 = 1532, + MSIOF3_SS1_E_MARK___3 = 1533, + IP1_31_28_MARK___4 = 1534, + A0_MARK___4 = 1535, + LCDOUT16_MARK___4 = 1536, + MSIOF3_SYNC_B_MARK___4 = 1537, + VI4_DATA8_MARK___4 = 1538, + DU_DB0_MARK___4 = 1539, + PWM3_A_MARK___4 = 1540, + IP2_31_28_MARK___4 = 1541, + A8_MARK___4 = 1542, + RX3_B_MARK___4 = 1543, + MSIOF2_SYNC_A_MARK___4 = 1544, + HRX4_B_MARK___4 = 1545, + SDA6_A_MARK___4 = 1546, + AVB_AVTP_MATCH_B_MARK___3 = 1547, + PWM1_B_MARK___4 = 1548, + IP3_31_28_MARK___4 = 1549, + A16_MARK___4 = 1550, + LCDOUT8_MARK___4 = 1551, + VI4_FIELD_MARK___4 = 1552, + DU_DG0_MARK___4 = 1553, + IP4_3_0_MARK___4 = 1554, + A17_MARK___4 = 1555, + LCDOUT9_MARK___4 = 1556, + VI4_VSYNC_N_MARK___4 = 1557, + DU_DG1_MARK___4 = 1558, + IP5_3_0_MARK___4 = 1559, + WE0_N_MARK___4 = 1560, + MSIOF3_TXD_D_MARK___3 = 1561, + CTS3_N_MARK___3 = 1562, + HCTS3_N_MARK___3 = 1563, + SCL6_B_MARK___4 = 1564, + CAN_CLK_MARK___4 = 1565, + IECLK_A_MARK___3 = 1566, + IP6_3_0_MARK___4 = 1567, + D5_MARK___4 = 1568, + MSIOF2_SYNC_B_MARK___4 = 1569, + VI4_DATA21_MARK___4 = 1570, + VI5_DATA5_MARK___3 = 1571, + IP7_3_0_MARK___4 = 1572, + D13_MARK___4 = 1573, + LCDOUT5_MARK___4 = 1574, + MSIOF2_SS2_D_MARK___3 = 1575, + TX4_C_MARK___4 = 1576, + VI4_DATA5_A_MARK___4 = 1577, + DU_DR5_MARK___4 = 1578, + IP4_7_4_MARK___4 = 1579, + A18_MARK___4 = 1580, + LCDOUT10_MARK___4 = 1581, + VI4_HSYNC_N_MARK___4 = 1582, + DU_DG2_MARK___4 = 1583, + IP5_7_4_MARK___4 = 1584, + WE1_N_MARK___4 = 1585, + MSIOF3_SS1_D_MARK___3 = 1586, + RTS3_N_MARK___3 = 1587, + HRTS3_N_MARK___3 = 1588, + SDA6_B_MARK___4 = 1589, + CAN1_RX_MARK___4 = 1590, + CANFD1_RX_MARK___4 = 1591, + IERX_A_MARK___3 = 1592, + IP6_7_4_MARK___4 = 1593, + D6_MARK___4 = 1594, + MSIOF2_RXD_B_MARK___4 = 1595, + VI4_DATA22_MARK___4 = 1596, + VI5_DATA6_MARK___3 = 1597, + IP7_7_4_MARK___4 = 1598, + D14_MARK___4 = 1599, + LCDOUT6_MARK___4 = 1600, + MSIOF3_SS1_A_MARK___4 = 1601, + HRX3_C_MARK___4 = 1602, + VI4_DATA6_A_MARK___4 = 1603, + DU_DR6_MARK___4 = 1604, + SCL6_C_MARK___3 = 1605, + IP4_11_8_MARK___4 = 1606, + A19_MARK___4 = 1607, + LCDOUT11_MARK___4 = 1608, + VI4_CLKENB_MARK___4 = 1609, + DU_DG3_MARK___4 = 1610, + IP5_11_8_MARK___4 = 1611, + EX_WAIT0_A_MARK___3 = 1612, + QCLK_MARK___4 = 1613, + VI4_CLK_MARK___4 = 1614, + DU_DOTCLKOUT0_MARK___4 = 1615, + IP6_11_8_MARK___4 = 1616, + D7_MARK___4 = 1617, + MSIOF2_TXD_B_MARK___4 = 1618, + VI4_DATA23_MARK___4 = 1619, + VI5_DATA7_MARK___3 = 1620, + IP7_11_8_MARK___4 = 1621, + D15_MARK___4 = 1622, + LCDOUT7_MARK___4 = 1623, + MSIOF3_SS2_A_MARK___4 = 1624, + HTX3_C_MARK___4 = 1625, + VI4_DATA7_A_MARK___4 = 1626, + DU_DR7_MARK___4 = 1627, + SDA6_C_MARK___3 = 1628, + IP4_15_12_MARK___4 = 1629, + CS0_N_MARK___4 = 1630, + VI5_CLKENB_MARK___3 = 1631, + IP5_15_12_MARK___4 = 1632, + D0_MARK___4 = 1633, + MSIOF2_SS1_B_MARK___4 = 1634, + MSIOF3_SCK_A_MARK___4 = 1635, + VI4_DATA16_MARK___4 = 1636, + VI5_DATA0_MARK___3 = 1637, + IP6_15_12_MARK___4 = 1638, + D8_MARK___4 = 1639, + LCDOUT0_MARK___4 = 1640, + MSIOF2_SCK_D_MARK___3 = 1641, + SCK4_C_MARK___3 = 1642, + VI4_DATA0_A_MARK___4 = 1643, + DU_DR0_MARK___4 = 1644, + IP4_19_16_MARK___4 = 1645, + CS1_N_MARK___3 = 1646, + VI5_CLK_MARK___3 = 1647, + EX_WAIT0_B_MARK___3 = 1648, + IP5_19_16_MARK___4 = 1649, + D1_MARK___4 = 1650, + MSIOF2_SS2_B_MARK___4 = 1651, + MSIOF3_SYNC_A_MARK___4 = 1652, + VI4_DATA17_MARK___4 = 1653, + VI5_DATA1_MARK___3 = 1654, + IP6_19_16_MARK___4 = 1655, + D9_MARK___4 = 1656, + LCDOUT1_MARK___4 = 1657, + MSIOF2_SYNC_D_MARK___3 = 1658, + VI4_DATA1_A_MARK___4 = 1659, + DU_DR1_MARK___4 = 1660, + IP7_19_16_MARK___4 = 1661, + SD0_CLK_MARK___4 = 1662, + MSIOF1_SCK_E_MARK___3 = 1663, + STP_OPWM_0_B_MARK___3 = 1664, + IP4_23_20_MARK___4 = 1665, + BS_N_MARK___4 = 1666, + QSTVA_QVS_MARK___4 = 1667, + MSIOF3_SCK_D_MARK___3 = 1668, + SCK3_MARK___3 = 1669, + HSCK3_MARK___3 = 1670, + CAN1_TX_MARK___4 = 1671, + CANFD1_TX_MARK___4 = 1672, + IETX_A_MARK___3 = 1673, + IP5_23_20_MARK___4 = 1674, + D2_MARK___4 = 1675, + MSIOF3_RXD_A_MARK___4 = 1676, + VI4_DATA18_MARK___4 = 1677, + VI5_DATA2_MARK___3 = 1678, + IP6_23_20_MARK___4 = 1679, + D10_MARK___4 = 1680, + LCDOUT2_MARK___4 = 1681, + MSIOF2_RXD_D_MARK___3 = 1682, + HRX3_B_MARK___4 = 1683, + VI4_DATA2_A_MARK___4 = 1684, + CTS4_N_C_MARK___4 = 1685, + DU_DR2_MARK___4 = 1686, + IP7_23_20_MARK___4 = 1687, + SD0_CMD_MARK___4 = 1688, + MSIOF1_SYNC_E_MARK___3 = 1689, + STP_IVCXO27_0_B_MARK___3 = 1690, + IP4_27_24_MARK___4 = 1691, + RD_N_MARK___4 = 1692, + MSIOF3_SYNC_D_MARK___3 = 1693, + RX3_A_MARK___4 = 1694, + HRX3_A_MARK___4 = 1695, + CAN0_TX_A_MARK___3 = 1696, + CANFD0_TX_A_MARK___3 = 1697, + IP5_27_24_MARK___4 = 1698, + D3_MARK___4 = 1699, + MSIOF3_TXD_A_MARK___4 = 1700, + VI4_DATA19_MARK___4 = 1701, + VI5_DATA3_MARK___3 = 1702, + IP6_27_24_MARK___4 = 1703, + D11_MARK___4 = 1704, + LCDOUT3_MARK___4 = 1705, + MSIOF2_TXD_D_MARK___3 = 1706, + HTX3_B_MARK___4 = 1707, + VI4_DATA3_A_MARK___4 = 1708, + RTS4_N_C_MARK___4 = 1709, + DU_DR3_MARK___4 = 1710, + IP7_27_24_MARK___4 = 1711, + SD0_DAT0_MARK___4 = 1712, + MSIOF1_RXD_E_MARK___3 = 1713, + TS_SCK0_B_MARK___3 = 1714, + STP_ISCLK_0_B_MARK___3 = 1715, + IP4_31_28_MARK___4 = 1716, + RD_WR_N_MARK___4 = 1717, + MSIOF3_RXD_D_MARK___3 = 1718, + TX3_A_MARK___4 = 1719, + HTX3_A_MARK___4 = 1720, + CAN0_RX_A_MARK___3 = 1721, + CANFD0_RX_A_MARK___3 = 1722, + IP5_31_28_MARK___4 = 1723, + D4_MARK___4 = 1724, + MSIOF2_SCK_B_MARK___4 = 1725, + VI4_DATA20_MARK___4 = 1726, + VI5_DATA4_MARK___3 = 1727, + IP6_31_28_MARK___4 = 1728, + D12_MARK___4 = 1729, + LCDOUT4_MARK___4 = 1730, + MSIOF2_SS1_D_MARK___3 = 1731, + RX4_C_MARK___4 = 1732, + VI4_DATA4_A_MARK___4 = 1733, + DU_DR4_MARK___4 = 1734, + IP7_31_28_MARK___4 = 1735, + SD0_DAT1_MARK___4 = 1736, + MSIOF1_TXD_E_MARK___3 = 1737, + TS_SPSYNC0_B_MARK___3 = 1738, + STP_ISSYNC_0_B_MARK___3 = 1739, + IP8_3_0_MARK___4 = 1740, + SD0_DAT2_MARK___4 = 1741, + MSIOF1_SS1_E_MARK___3 = 1742, + TS_SDAT0_B_MARK___3 = 1743, + STP_ISD_0_B_MARK___3 = 1744, + IP9_3_0_MARK___4 = 1745, + SD2_CLK_MARK___3 = 1746, + NFDATA8_MARK___4 = 1747, + IP10_3_0_MARK___4 = 1748, + SD3_CMD_MARK___4 = 1749, + NFRE_N_MARK___4 = 1750, + IP11_3_0_MARK___4 = 1751, + SD3_DAT7_MARK___4 = 1752, + SD3_WP_MARK___4 = 1753, + NFDATA7_MARK___4 = 1754, + IP8_7_4_MARK___4 = 1755, + SD0_DAT3_MARK___4 = 1756, + MSIOF1_SS2_E_MARK___3 = 1757, + TS_SDEN0_B_MARK___3 = 1758, + STP_ISEN_0_B_MARK___3 = 1759, + IP9_7_4_MARK___4 = 1760, + SD2_CMD_MARK___3 = 1761, + NFDATA9_MARK___4 = 1762, + IP10_7_4_MARK___4 = 1763, + SD3_DAT0_MARK___4 = 1764, + NFDATA0_MARK___4 = 1765, + IP11_7_4_MARK___4 = 1766, + SD3_DS_MARK___4 = 1767, + NFCLE_MARK___4 = 1768, + IP8_11_8_MARK___4 = 1769, + SD1_CLK_MARK___4 = 1770, + MSIOF1_SCK_G_MARK___3 = 1771, + SIM0_CLK_A_MARK___4 = 1772, + IP9_11_8_MARK___4 = 1773, + SD2_DAT0_MARK___3 = 1774, + NFDATA10_MARK___4 = 1775, + IP10_11_8_MARK___4 = 1776, + SD3_DAT1_MARK___4 = 1777, + NFDATA1_MARK___4 = 1778, + IP11_11_8_MARK___4 = 1779, + SD0_CD_MARK___4 = 1780, + NFDATA14_A_MARK___4 = 1781, + SCL2_B_MARK___4 = 1782, + SIM0_RST_A_MARK___4 = 1783, + IP8_15_12_MARK___4 = 1784, + SD1_CMD_MARK___4 = 1785, + MSIOF1_SYNC_G_MARK___3 = 1786, + NFCE_N_B_MARK___4 = 1787, + SIM0_D_A_MARK___4 = 1788, + STP_IVCXO27_1_B_MARK___3 = 1789, + IP9_15_12_MARK___4 = 1790, + SD2_DAT1_MARK___3 = 1791, + NFDATA11_MARK___4 = 1792, + IP10_15_12_MARK___4 = 1793, + SD3_DAT2_MARK___4 = 1794, + NFDATA2_MARK___4 = 1795, + IP11_15_12_MARK___4 = 1796, + SD0_WP_MARK___4 = 1797, + NFDATA15_A_MARK___4 = 1798, + SDA2_B_MARK___4 = 1799, + IP8_19_16_MARK___4 = 1800, + SD1_DAT0_MARK___4 = 1801, + SD2_DAT4_MARK___3 = 1802, + MSIOF1_RXD_G_MARK___3 = 1803, + NFWP_N_B_MARK___4 = 1804, + TS_SCK1_B_MARK___3 = 1805, + STP_ISCLK_1_B_MARK___3 = 1806, + IP9_19_16_MARK___4 = 1807, + SD2_DAT2_MARK___3 = 1808, + NFDATA12_MARK___4 = 1809, + IP10_19_16_MARK___4 = 1810, + SD3_DAT3_MARK___4 = 1811, + NFDATA3_MARK___4 = 1812, + IP11_19_16_MARK___4 = 1813, + SD1_CD_MARK___4 = 1814, + NFRB_N_A_MARK___4 = 1815, + SIM0_CLK_B_MARK___4 = 1816, + IP8_23_20_MARK___4 = 1817, + SD1_DAT1_MARK___4 = 1818, + SD2_DAT5_MARK___3 = 1819, + MSIOF1_TXD_G_MARK___3 = 1820, + NFDATA14_B_MARK___4 = 1821, + TS_SPSYNC1_B_MARK___3 = 1822, + STP_ISSYNC_1_B_MARK___3 = 1823, + IP9_23_20_MARK___4 = 1824, + SD2_DAT3_MARK___3 = 1825, + NFDATA13_MARK___4 = 1826, + IP10_23_20_MARK___4 = 1827, + SD3_DAT4_MARK___4 = 1828, + SD2_CD_A_MARK___3 = 1829, + NFDATA4_MARK___4 = 1830, + IP11_23_20_MARK___4 = 1831, + SD1_WP_MARK___4 = 1832, + NFCE_N_A_MARK___4 = 1833, + SIM0_D_B_MARK___4 = 1834, + IP8_27_24_MARK___4 = 1835, + SD1_DAT2_MARK___4 = 1836, + SD2_DAT6_MARK___3 = 1837, + MSIOF1_SS1_G_MARK___3 = 1838, + NFDATA15_B_MARK___4 = 1839, + TS_SDAT1_B_MARK___3 = 1840, + STP_ISD_1_B_MARK___3 = 1841, + IP9_27_24_MARK___4 = 1842, + SD2_DS_MARK___3 = 1843, + NFALE_MARK___3 = 1844, + SATA_DEVSLP_B_MARK___2 = 1845, + IP10_27_24_MARK___4 = 1846, + SD3_DAT5_MARK___4 = 1847, + SD2_WP_A_MARK___3 = 1848, + NFDATA5_MARK___4 = 1849, + IP11_27_24_MARK___4 = 1850, + SCK0_MARK___3 = 1851, + HSCK1_B_MARK___4 = 1852, + MSIOF1_SS2_B_MARK___3 = 1853, + AUDIO_CLKC_B_MARK___4 = 1854, + SDA2_A_MARK___4 = 1855, + SIM0_RST_B_MARK___4 = 1856, + STP_OPWM_0_C_MARK___3 = 1857, + RIF0_CLK_B_MARK___4 = 1858, + ADICHS2_MARK___3 = 1859, + SCK5_B_MARK___3 = 1860, + IP8_31_28_MARK___4 = 1861, + SD1_DAT3_MARK___4 = 1862, + SD2_DAT7_MARK___3 = 1863, + MSIOF1_SS2_G_MARK___3 = 1864, + NFRB_N_B_MARK___4 = 1865, + TS_SDEN1_B_MARK___3 = 1866, + STP_ISEN_1_B_MARK___3 = 1867, + IP9_31_28_MARK___4 = 1868, + SD3_CLK_MARK___4 = 1869, + NFWE_N_MARK___4 = 1870, + IP10_31_28_MARK___4 = 1871, + SD3_DAT6_MARK___4 = 1872, + SD3_CD_MARK___4 = 1873, + NFDATA6_MARK___4 = 1874, + IP11_31_28_MARK___4 = 1875, + RX0_MARK___3 = 1876, + HRX1_B_MARK___4 = 1877, + TS_SCK0_C_MARK___3 = 1878, + STP_ISCLK_0_C_MARK___3 = 1879, + RIF0_D0_B_MARK___4 = 1880, + IP12_3_0_MARK___4 = 1881, + TX0_MARK___3 = 1882, + HTX1_B_MARK___4 = 1883, + TS_SPSYNC0_C_MARK___3 = 1884, + STP_ISSYNC_0_C_MARK___3 = 1885, + RIF0_D1_B_MARK___4 = 1886, + IP13_3_0_MARK___4 = 1887, + TX2_A_MARK___4 = 1888, + SD2_CD_B_MARK___3 = 1889, + SCL1_A_MARK___4 = 1890, + FMCLK_A_MARK___4 = 1891, + RIF1_D1_C_MARK___3 = 1892, + FSO_CFE_0_N_MARK___3 = 1893, + IP14_3_0_MARK___4 = 1894, + MSIOF0_SS1_MARK___4 = 1895, + RX5_A_MARK___4 = 1896, + NFWP_N_A_MARK___4 = 1897, + AUDIO_CLKA_C_MARK___3 = 1898, + SSI_SCK2_A_MARK___4 = 1899, + STP_IVCXO27_0_C_MARK___3 = 1900, + AUDIO_CLKOUT3_A_MARK___4 = 1901, + TCLK1_B_MARK___4 = 1902, + IP15_3_0_MARK___4 = 1903, + SSI_SDATA1_A_MARK___3 = 1904, + IP12_7_4_MARK___4 = 1905, + CTS0_N_MARK___3 = 1906, + HCTS1_N_B_MARK___4 = 1907, + MSIOF1_SYNC_B_MARK___3 = 1908, + TS_SPSYNC1_C_MARK___3 = 1909, + STP_ISSYNC_1_C_MARK___3 = 1910, + RIF1_SYNC_B_MARK___3 = 1911, + AUDIO_CLKOUT_C_MARK___3 = 1912, + ADICS_SAMP_MARK___3 = 1913, + IP13_7_4_MARK___4 = 1914, + RX2_A_MARK___4 = 1915, + SD2_WP_B_MARK___3 = 1916, + SDA1_A_MARK___4 = 1917, + FMIN_A_MARK___4 = 1918, + RIF1_SYNC_C_MARK___3 = 1919, + FSO_CFE_1_N_MARK___3 = 1920, + IP14_7_4_MARK___4 = 1921, + MSIOF0_SS2_MARK___4 = 1922, + TX5_A_MARK___4 = 1923, + MSIOF1_SS2_D_MARK___3 = 1924, + AUDIO_CLKC_A_MARK___4 = 1925, + SSI_WS2_A_MARK___4 = 1926, + STP_OPWM_0_D_MARK___3 = 1927, + AUDIO_CLKOUT_D_MARK___3 = 1928, + SPEEDIN_B_MARK___4 = 1929, + IP15_7_4_MARK___4 = 1930, + SSI_SDATA2_A_MARK___3 = 1931, + SSI_SCK1_B_MARK___3 = 1932, + IP12_11_8_MARK___4 = 1933, + RTS0_N_MARK___3 = 1934, + HRTS1_N_B_MARK___4 = 1935, + MSIOF1_SS1_B_MARK___3 = 1936, + AUDIO_CLKA_B_MARK___3 = 1937, + SCL2_A_MARK___4 = 1938, + STP_IVCXO27_1_C_MARK___3 = 1939, + RIF0_SYNC_B_MARK___4 = 1940, + ADICHS1_MARK___3 = 1941, + IP13_11_8_MARK___4 = 1942, + HSCK0_MARK___3 = 1943, + MSIOF1_SCK_D_MARK___3 = 1944, + AUDIO_CLKB_A_MARK___4 = 1945, + SSI_SDATA1_B_MARK___3 = 1946, + TS_SCK0_D_MARK___3 = 1947, + STP_ISCLK_0_D_MARK___3 = 1948, + RIF0_CLK_C_MARK___3 = 1949, + RX5_B_MARK___4 = 1950, + IP14_11_8_MARK___4 = 1951, + MLB_CLK_MARK___4 = 1952, + MSIOF1_SCK_F_MARK___3 = 1953, + SCL1_B_MARK___4 = 1954, + IP15_11_8_MARK___4 = 1955, + SSI_SCK349_MARK___4 = 1956, + MSIOF1_SS1_A_MARK___3 = 1957, + STP_OPWM_0_A_MARK___3 = 1958, + IP12_15_12_MARK___4 = 1959, + RX1_A_MARK___3 = 1960, + HRX1_A_MARK___4 = 1961, + TS_SDAT0_C_MARK___3 = 1962, + STP_ISD_0_C_MARK___3 = 1963, + RIF1_CLK_C_MARK___3 = 1964, + IP13_15_12_MARK___4 = 1965, + HRX0_MARK___3 = 1966, + MSIOF1_RXD_D_MARK___3 = 1967, + SSI_SDATA2_B_MARK___3 = 1968, + TS_SDEN0_D_MARK___3 = 1969, + STP_ISEN_0_D_MARK___3 = 1970, + RIF0_D0_C_MARK___3 = 1971, + IP14_15_12_MARK___4 = 1972, + MLB_SIG_MARK___4 = 1973, + RX1_B_MARK___3 = 1974, + MSIOF1_SYNC_F_MARK___3 = 1975, + SDA1_B_MARK___4 = 1976, + IP15_15_12_MARK___4 = 1977, + SSI_WS349_MARK___4 = 1978, + HCTS2_N_A_MARK___4 = 1979, + MSIOF1_SS2_A_MARK___3 = 1980, + STP_IVCXO27_0_A_MARK___3 = 1981, + IP12_19_16_MARK___4 = 1982, + TX1_A_MARK___3 = 1983, + HTX1_A_MARK___4 = 1984, + TS_SDEN0_C_MARK___3 = 1985, + STP_ISEN_0_C_MARK___3 = 1986, + RIF1_D0_C_MARK___3 = 1987, + IP13_19_16_MARK___4 = 1988, + HTX0_MARK___3 = 1989, + MSIOF1_TXD_D_MARK___3 = 1990, + SSI_SDATA9_B_MARK___3 = 1991, + TS_SDAT0_D_MARK___3 = 1992, + STP_ISD_0_D_MARK___3 = 1993, + RIF0_D1_C_MARK___3 = 1994, + IP14_19_16_MARK___4 = 1995, + MLB_DAT_MARK___4 = 1996, + TX1_B_MARK___3 = 1997, + MSIOF1_RXD_F_MARK___3 = 1998, + IP15_19_16_MARK___4 = 1999, + SSI_SDATA3_MARK___4 = 2000, + HRTS2_N_A_MARK___4 = 2001, + MSIOF1_TXD_A_MARK___3 = 2002, + TS_SCK0_A_MARK___3 = 2003, + STP_ISCLK_0_A_MARK___3 = 2004, + RIF0_D1_A_MARK___4 = 2005, + RIF2_D0_A_MARK___4 = 2006, + IP12_23_20_MARK___4 = 2007, + CTS1_N_MARK___4 = 2008, + HCTS1_N_A_MARK___3 = 2009, + MSIOF1_RXD_B_MARK___3 = 2010, + TS_SDEN1_C_MARK___3 = 2011, + STP_ISEN_1_C_MARK___3 = 2012, + RIF1_D0_B_MARK___3 = 2013, + ADIDATA_MARK___3 = 2014, + IP13_23_20_MARK___4 = 2015, + HCTS0_N_MARK___3 = 2016, + RX2_B_MARK___4 = 2017, + MSIOF1_SYNC_D_MARK___3 = 2018, + SSI_SCK9_A_MARK___4 = 2019, + TS_SPSYNC0_D_MARK___3 = 2020, + STP_ISSYNC_0_D_MARK___3 = 2021, + RIF0_SYNC_C_MARK___3 = 2022, + AUDIO_CLKOUT1_A_MARK___4 = 2023, + IP14_23_20_MARK___4 = 2024, + SSI_SCK01239_MARK___4 = 2025, + MSIOF1_TXD_F_MARK___3 = 2026, + IP15_23_20_MARK___4 = 2027, + SSI_SCK4_MARK___4 = 2028, + HRX2_A_MARK___4 = 2029, + MSIOF1_SCK_A_MARK___3 = 2030, + TS_SDAT0_A_MARK___3 = 2031, + STP_ISD_0_A_MARK___3 = 2032, + RIF0_CLK_A_MARK___4 = 2033, + RIF2_CLK_A_MARK___4 = 2034, + IP12_27_24_MARK___4 = 2035, + RTS1_N_MARK___4 = 2036, + HRTS1_N_A_MARK___3 = 2037, + MSIOF1_TXD_B_MARK___3 = 2038, + TS_SDAT1_C_MARK___3 = 2039, + STP_ISD_1_C_MARK___3 = 2040, + RIF1_D1_B_MARK___3 = 2041, + ADICHS0_MARK___3 = 2042, + IP13_27_24_MARK___4 = 2043, + HRTS0_N_MARK___3 = 2044, + TX2_B_MARK___4 = 2045, + MSIOF1_SS1_D_MARK___3 = 2046, + SSI_WS9_A_MARK___4 = 2047, + STP_IVCXO27_0_D_MARK___3 = 2048, + BPFCLK_A_MARK___4 = 2049, + AUDIO_CLKOUT2_A_MARK___4 = 2050, + IP14_27_24_MARK___4 = 2051, + SSI_WS01239_MARK___4 = 2052, + MSIOF1_SS1_F_MARK___3 = 2053, + IP15_27_24_MARK___4 = 2054, + SSI_WS4_MARK___4 = 2055, + HTX2_A_MARK___4 = 2056, + MSIOF1_SYNC_A_MARK___3 = 2057, + TS_SDEN0_A_MARK___3 = 2058, + STP_ISEN_0_A_MARK___3 = 2059, + RIF0_SYNC_A_MARK___4 = 2060, + RIF2_SYNC_A_MARK___4 = 2061, + IP12_31_28_MARK___4 = 2062, + SCK2_MARK___3 = 2063, + SCIF_CLK_B_MARK___4 = 2064, + MSIOF1_SCK_B_MARK___3 = 2065, + TS_SCK1_C_MARK___3 = 2066, + STP_ISCLK_1_C_MARK___3 = 2067, + RIF1_CLK_B_MARK___3 = 2068, + ADICLK_MARK___3 = 2069, + IP13_31_28_MARK___4 = 2070, + MSIOF0_SYNC_MARK___4 = 2071, + AUDIO_CLKOUT_A_MARK___4 = 2072, + TX5_B_MARK___4 = 2073, + BPFCLK_D_MARK___3 = 2074, + IP14_31_28_MARK___4 = 2075, + SSI_SDATA0_MARK___4 = 2076, + MSIOF1_SS2_F_MARK___3 = 2077, + IP15_31_28_MARK___4 = 2078, + SSI_SDATA4_MARK___4 = 2079, + HSCK2_A_MARK___4 = 2080, + MSIOF1_RXD_A_MARK___3 = 2081, + TS_SPSYNC0_A_MARK___3 = 2082, + STP_ISSYNC_0_A_MARK___3 = 2083, + RIF0_D0_A_MARK___4 = 2084, + RIF2_D1_A_MARK___4 = 2085, + IP16_3_0_MARK___3 = 2086, + SSI_SCK6_MARK___4 = 2087, + USB2_PWEN_MARK = 2088, + SIM0_RST_D_MARK___3 = 2089, + IP17_3_0_MARK___3 = 2090, + AUDIO_CLKA_A_MARK___3 = 2091, + IP18_3_0_MARK___3 = 2092, + USB2_CH3_PWEN_MARK = 2093, + AUDIO_CLKOUT2_B_MARK___4 = 2094, + SSI_SCK9_B_MARK___4 = 2095, + TS_SDEN0_E_MARK___3 = 2096, + STP_ISEN_0_E_MARK___3 = 2097, + RIF2_D0_B_MARK___4 = 2098, + TPU0TO2_MARK___4 = 2099, + FMCLK_C_MARK___4 = 2100, + FMCLK_D_MARK___3 = 2101, + IP16_7_4_MARK___3 = 2102, + SSI_WS6_MARK___4 = 2103, + USB2_OVC_MARK = 2104, + SIM0_D_D_MARK___3 = 2105, + IP17_7_4_MARK___3 = 2106, + AUDIO_CLKB_B_MARK___4 = 2107, + SCIF_CLK_A_MARK___4 = 2108, + STP_IVCXO27_1_D_MARK___3 = 2109, + REMOCON_A_MARK___4 = 2110, + TCLK1_A_MARK___4 = 2111, + IP18_7_4_MARK___3 = 2112, + USB2_CH3_OVC_MARK = 2113, + AUDIO_CLKOUT3_B_MARK___4 = 2114, + SSI_WS9_B_MARK___4 = 2115, + TS_SPSYNC0_E_MARK___3 = 2116, + STP_ISSYNC_0_E_MARK___3 = 2117, + RIF2_D1_B_MARK___4 = 2118, + TPU0TO3_MARK___4 = 2119, + FMIN_C_MARK___4 = 2120, + FMIN_D_MARK___3 = 2121, + IP16_11_8_MARK___3 = 2122, + SSI_SDATA6_MARK___4 = 2123, + SIM0_CLK_D_MARK___3 = 2124, + SATA_DEVSLP_A_MARK___2 = 2125, + IP17_11_8_MARK___3 = 2126, + USB0_PWEN_MARK___3 = 2127, + SIM0_RST_C_MARK___3 = 2128, + TS_SCK1_D_MARK___3 = 2129, + STP_ISCLK_1_D_MARK___3 = 2130, + BPFCLK_B_MARK___4 = 2131, + RIF3_CLK_B_MARK___4 = 2132, + HSCK2_C_MARK___3 = 2133, + IP16_15_12_MARK___3 = 2134, + SSI_SCK78_MARK___4 = 2135, + HRX2_B_MARK___4 = 2136, + MSIOF1_SCK_C_MARK___3 = 2137, + TS_SCK1_A_MARK___3 = 2138, + STP_ISCLK_1_A_MARK___3 = 2139, + RIF1_CLK_A_MARK___3 = 2140, + RIF3_CLK_A_MARK___4 = 2141, + IP17_15_12_MARK___3 = 2142, + USB0_OVC_MARK___3 = 2143, + SIM0_D_C_MARK___3 = 2144, + TS_SDAT1_D_MARK___3 = 2145, + STP_ISD_1_D_MARK___3 = 2146, + RIF3_SYNC_B_MARK___4 = 2147, + HRX2_C_MARK___3 = 2148, + IP16_19_16_MARK___3 = 2149, + SSI_WS78_MARK___4 = 2150, + HTX2_B_MARK___4 = 2151, + MSIOF1_SYNC_C_MARK___3 = 2152, + TS_SDAT1_A_MARK___3 = 2153, + STP_ISD_1_A_MARK___3 = 2154, + RIF1_SYNC_A_MARK___3 = 2155, + RIF3_SYNC_A_MARK___4 = 2156, + IP17_19_16_MARK___3 = 2157, + USB1_PWEN_MARK___3 = 2158, + SIM0_CLK_C_MARK___3 = 2159, + SSI_SCK1_A_MARK___3 = 2160, + TS_SCK0_E_MARK___3 = 2161, + STP_ISCLK_0_E_MARK___3 = 2162, + FMCLK_B_MARK___4 = 2163, + RIF2_CLK_B_MARK___4 = 2164, + SPEEDIN_A_MARK___4 = 2165, + HTX2_C_MARK___3 = 2166, + IP16_23_20_MARK___3 = 2167, + SSI_SDATA7_MARK___4 = 2168, + HCTS2_N_B_MARK___3 = 2169, + MSIOF1_RXD_C_MARK___3 = 2170, + TS_SDEN1_A_MARK___3 = 2171, + STP_ISEN_1_A_MARK___3 = 2172, + RIF1_D0_A_MARK___3 = 2173, + RIF3_D0_A_MARK___4 = 2174, + TCLK2_A_MARK___4 = 2175, + IP17_23_20_MARK___3 = 2176, + USB1_OVC_MARK___3 = 2177, + MSIOF1_SS2_C_MARK___3 = 2178, + SSI_WS1_A_MARK___3 = 2179, + TS_SDAT0_E_MARK___3 = 2180, + STP_ISD_0_E_MARK___3 = 2181, + FMIN_B_MARK___4 = 2182, + RIF2_SYNC_B_MARK___4 = 2183, + REMOCON_B_MARK___4 = 2184, + HCTS2_N_C_MARK___3 = 2185, + IP16_27_24_MARK___3 = 2186, + SSI_SDATA8_MARK___4 = 2187, + HRTS2_N_B_MARK___3 = 2188, + MSIOF1_TXD_C_MARK___3 = 2189, + TS_SPSYNC1_A_MARK___3 = 2190, + STP_ISSYNC_1_A_MARK___3 = 2191, + RIF1_D1_A_MARK___3 = 2192, + RIF3_D1_A_MARK___4 = 2193, + IP17_27_24_MARK___3 = 2194, + USB30_PWEN_MARK___4 = 2195, + AUDIO_CLKOUT_B_MARK___4 = 2196, + SSI_SCK2_B_MARK___4 = 2197, + TS_SDEN1_D_MARK___3 = 2198, + STP_ISEN_1_D_MARK___3 = 2199, + STP_OPWM_0_E_MARK___3 = 2200, + RIF3_D0_B_MARK___4 = 2201, + TCLK2_B_MARK___4 = 2202, + TPU0TO0_MARK___4 = 2203, + BPFCLK_C_MARK___4 = 2204, + HRTS2_N_C_MARK___3 = 2205, + IP16_31_28_MARK___3 = 2206, + SSI_SDATA9_A_MARK___3 = 2207, + HSCK2_B_MARK___3 = 2208, + MSIOF1_SS1_C_MARK___3 = 2209, + HSCK1_A_MARK___4 = 2210, + SSI_WS1_B_MARK___3 = 2211, + SCK1_MARK___4 = 2212, + STP_IVCXO27_1_A_MARK___3 = 2213, + SCK5_A_MARK___4 = 2214, + IP17_31_28_MARK___3 = 2215, + USB30_OVC_MARK___4 = 2216, + AUDIO_CLKOUT1_B_MARK___4 = 2217, + SSI_WS2_B_MARK___4 = 2218, + TS_SPSYNC1_D_MARK___3 = 2219, + STP_ISSYNC_1_D_MARK___3 = 2220, + STP_IVCXO27_0_E_MARK___3 = 2221, + RIF3_D1_B_MARK___4 = 2222, + FSO_TOE_N_MARK___3 = 2223, + TPU0TO1_MARK___4 = 2224, + SEL_MSIOF3_0_MARK___4 = 2225, + SEL_MSIOF3_1_MARK___4 = 2226, + SEL_MSIOF3_2_MARK___3 = 2227, + SEL_MSIOF3_3_MARK___3 = 2228, + SEL_MSIOF3_4_MARK___3 = 2229, + SEL_TSIF1_0_MARK___3 = 2230, + SEL_TSIF1_1_MARK___3 = 2231, + SEL_TSIF1_2_MARK___3 = 2232, + SEL_TSIF1_3_MARK___3 = 2233, + I2C_SEL_5_0_MARK___3 = 2234, + I2C_SEL_5_1_MARK___3 = 2235, + I2C_SEL_3_0_MARK___3 = 2236, + I2C_SEL_3_1_MARK___3 = 2237, + SEL_TSIF0_0_MARK___3 = 2238, + SEL_TSIF0_1_MARK___3 = 2239, + SEL_TSIF0_2_MARK___3 = 2240, + SEL_TSIF0_3_MARK___3 = 2241, + SEL_TSIF0_4_MARK___3 = 2242, + I2C_SEL_0_0_MARK___3 = 2243, + I2C_SEL_0_1_MARK___3 = 2244, + SEL_MSIOF2_0_MARK___4 = 2245, + SEL_MSIOF2_1_MARK___4 = 2246, + SEL_MSIOF2_2_MARK___3 = 2247, + SEL_MSIOF2_3_MARK___3 = 2248, + SEL_FM_0_MARK___4 = 2249, + SEL_FM_1_MARK___4 = 2250, + SEL_FM_2_MARK___4 = 2251, + SEL_FM_3_MARK___3 = 2252, + SEL_MSIOF1_0_MARK___3 = 2253, + SEL_MSIOF1_1_MARK___3 = 2254, + SEL_MSIOF1_2_MARK___3 = 2255, + SEL_MSIOF1_3_MARK___3 = 2256, + SEL_MSIOF1_4_MARK___3 = 2257, + SEL_MSIOF1_5_MARK___3 = 2258, + SEL_MSIOF1_6_MARK___3 = 2259, + SEL_TIMER_TMU1_0_MARK = 2260, + SEL_TIMER_TMU1_1_MARK = 2261, + SEL_SCIF5_0_MARK___4 = 2262, + SEL_SCIF5_1_MARK___4 = 2263, + SEL_SSP1_1_0_MARK___3 = 2264, + SEL_SSP1_1_1_MARK___3 = 2265, + SEL_SSP1_1_2_MARK___3 = 2266, + SEL_SSP1_1_3_MARK___3 = 2267, + SEL_I2C6_0_MARK___4 = 2268, + SEL_I2C6_1_MARK___4 = 2269, + SEL_I2C6_2_MARK___3 = 2270, + SEL_LBSC_0_MARK___3 = 2271, + SEL_LBSC_1_MARK___3 = 2272, + SEL_SSP1_0_0_MARK___3 = 2273, + SEL_SSP1_0_1_MARK___3 = 2274, + SEL_SSP1_0_2_MARK___3 = 2275, + SEL_SSP1_0_3_MARK___3 = 2276, + SEL_SSP1_0_4_MARK___3 = 2277, + SEL_IEBUS_0_MARK___3 = 2278, + SEL_IEBUS_1_MARK___3 = 2279, + SEL_I2C2_0_MARK___4 = 2280, + SEL_I2C2_1_MARK___4 = 2281, + SEL_SSI2_0_MARK___4 = 2282, + SEL_SSI2_1_MARK___4 = 2283, + SEL_I2C1_0_MARK___4 = 2284, + SEL_I2C1_1_MARK___4 = 2285, + SEL_SSI1_0_MARK___3 = 2286, + SEL_SSI1_1_MARK___3 = 2287, + SEL_SSI9_0_MARK___4 = 2288, + SEL_SSI9_1_MARK___4 = 2289, + SEL_HSCIF4_0_MARK___4 = 2290, + SEL_HSCIF4_1_MARK___4 = 2291, + SEL_SPEED_PULSE_0_MARK___3 = 2292, + SEL_SPEED_PULSE_1_MARK___3 = 2293, + SEL_TIMER_TMU2_0_MARK___3 = 2294, + SEL_TIMER_TMU2_1_MARK___3 = 2295, + SEL_HSCIF3_0_MARK___4 = 2296, + SEL_HSCIF3_1_MARK___4 = 2297, + SEL_HSCIF3_2_MARK___4 = 2298, + SEL_HSCIF3_3_MARK___4 = 2299, + SEL_SIMCARD_0_MARK___4 = 2300, + SEL_SIMCARD_1_MARK___4 = 2301, + SEL_SIMCARD_2_MARK___3 = 2302, + SEL_SIMCARD_3_MARK___3 = 2303, + SEL_ADGB_0_MARK___4 = 2304, + SEL_ADGB_1_MARK___4 = 2305, + SEL_ADGC_0_MARK___4 = 2306, + SEL_ADGC_1_MARK___4 = 2307, + SEL_HSCIF1_0_MARK___4 = 2308, + SEL_HSCIF1_1_MARK___4 = 2309, + SEL_SDHI2_0_MARK___3 = 2310, + SEL_SDHI2_1_MARK___3 = 2311, + SEL_SCIF4_0_MARK___4 = 2312, + SEL_SCIF4_1_MARK___4 = 2313, + SEL_SCIF4_2_MARK___4 = 2314, + SEL_HSCIF2_0_MARK___4 = 2315, + SEL_HSCIF2_1_MARK___4 = 2316, + SEL_HSCIF2_2_MARK___3 = 2317, + SEL_SCIF3_0_MARK___4 = 2318, + SEL_SCIF3_1_MARK___4 = 2319, + SEL_ETHERAVB_0_MARK___3 = 2320, + SEL_ETHERAVB_1_MARK___3 = 2321, + SEL_SCIF2_0_MARK___4 = 2322, + SEL_SCIF2_1_MARK___4 = 2323, + SEL_DRIF3_0_MARK___4 = 2324, + SEL_DRIF3_1_MARK___4 = 2325, + SEL_SCIF1_0_MARK___3 = 2326, + SEL_SCIF1_1_MARK___3 = 2327, + SEL_DRIF2_0_MARK___4 = 2328, + SEL_DRIF2_1_MARK___4 = 2329, + SEL_SCIF_0_MARK___4 = 2330, + SEL_SCIF_1_MARK___4 = 2331, + SEL_DRIF1_0_MARK___3 = 2332, + SEL_DRIF1_1_MARK___3 = 2333, + SEL_DRIF1_2_MARK___3 = 2334, + SEL_REMOCON_0_MARK___4 = 2335, + SEL_REMOCON_1_MARK___4 = 2336, + SEL_DRIF0_0_MARK___4 = 2337, + SEL_DRIF0_1_MARK___4 = 2338, + SEL_DRIF0_2_MARK___3 = 2339, + SEL_RCAN0_0_MARK___3 = 2340, + SEL_RCAN0_1_MARK___3 = 2341, + SEL_CANFD0_0_MARK___3 = 2342, + SEL_CANFD0_1_MARK___3 = 2343, + SEL_PWM6_0_MARK___4 = 2344, + SEL_PWM6_1_MARK___4 = 2345, + SEL_ADGA_0_MARK___3 = 2346, + SEL_ADGA_1_MARK___3 = 2347, + SEL_ADGA_2_MARK___3 = 2348, + SEL_ADGA_3_MARK___3 = 2349, + SEL_PWM5_0_MARK___4 = 2350, + SEL_PWM5_1_MARK___4 = 2351, + SEL_PWM4_0_MARK___4 = 2352, + SEL_PWM4_1_MARK___4 = 2353, + SEL_PWM3_0_MARK___4 = 2354, + SEL_PWM3_1_MARK___4 = 2355, + SEL_PWM2_0_MARK___4 = 2356, + SEL_PWM2_1_MARK___4 = 2357, + SEL_PWM1_0_MARK___4 = 2358, + SEL_PWM1_1_MARK___4 = 2359, + SEL_VIN4_0_MARK___4 = 2360, + SEL_VIN4_1_MARK___4 = 2361, + QSPI0_SPCLK_MARK___4 = 2362, + QSPI0_SSL_MARK___4 = 2363, + QSPI0_MOSI_IO0_MARK___4 = 2364, + QSPI0_MISO_IO1_MARK___4 = 2365, + QSPI0_IO2_MARK___4 = 2366, + QSPI0_IO3_MARK___4 = 2367, + QSPI1_SPCLK_MARK___4 = 2368, + QSPI1_SSL_MARK___4 = 2369, + QSPI1_MOSI_IO0_MARK___4 = 2370, + QSPI1_MISO_IO1_MARK___4 = 2371, + QSPI1_IO2_MARK___4 = 2372, + QSPI1_IO3_MARK___4 = 2373, + RPC_INT_MARK___3 = 2374, + RPC_WP_MARK___3 = 2375, + RPC_RESET_MARK___3 = 2376, + AVB_TX_CTL_MARK___4 = 2377, + AVB_TXC_MARK___4 = 2378, + AVB_TD0_MARK___4 = 2379, + AVB_TD1_MARK___4 = 2380, + AVB_TD2_MARK___4 = 2381, + AVB_TD3_MARK___4 = 2382, + AVB_RX_CTL_MARK___4 = 2383, + AVB_RXC_MARK___4 = 2384, + AVB_RD0_MARK___4 = 2385, + AVB_RD1_MARK___4 = 2386, + AVB_RD2_MARK___4 = 2387, + AVB_RD3_MARK___4 = 2388, + AVB_TXCREFCLK_MARK___4 = 2389, + AVB_MDIO_MARK___4 = 2390, + PRESETOUT_MARK___3 = 2391, + DU_DOTCLKIN0_MARK___4 = 2392, + DU_DOTCLKIN1_MARK___4 = 2393, + DU_DOTCLKIN2_MARK___2 = 2394, + DU_DOTCLKIN3_MARK___2 = 2395, + TMS_MARK___4 = 2396, + TDO_MARK___3 = 2397, + ASEBRK_MARK___4 = 2398, + MLB_REF_MARK___4 = 2399, + TDI_MARK___4 = 2400, + TCK_MARK___4 = 2401, + TRST_MARK___3 = 2402, + EXTALR_MARK___3 = 2403, + SCL0_MARK___3 = 2404, + SDA0_MARK___3 = 2405, + SCL3_MARK___3 = 2406, + SDA3_MARK___3 = 2407, + SCL5_MARK___4 = 2408, + SDA5_MARK___4 = 2409, + PINMUX_MARK_END___4 = 2410, +}; + +enum { + GP_LAST___4 = 227, + PIN_ASEBRK___4 = 228, + PIN_AVB_MDIO___4 = 229, + PIN_AVB_RD0___3 = 230, + PIN_AVB_RD1___3 = 231, + PIN_AVB_RD2___3 = 232, + PIN_AVB_RD3___3 = 233, + PIN_AVB_RXC___3 = 234, + PIN_AVB_RX_CTL___3 = 235, + PIN_AVB_TD0___4 = 236, + PIN_AVB_TD1___4 = 237, + PIN_AVB_TD2___4 = 238, + PIN_AVB_TD3___4 = 239, + PIN_AVB_TXC___4 = 240, + PIN_AVB_TXCREFCLK___3 = 241, + PIN_AVB_TX_CTL___4 = 242, + PIN_DU_DOTCLKIN0___3 = 243, + PIN_DU_DOTCLKIN1___3 = 244, + PIN_DU_DOTCLKIN2___2 = 245, + PIN_DU_DOTCLKIN3___2 = 246, + PIN_EXTALR___3 = 247, + PIN_FSCLKST_N___2 = 248, + PIN_MLB_REF___4 = 249, + PIN_PRESETOUT_N___4 = 250, + PIN_QSPI0_IO2___3 = 251, + PIN_QSPI0_IO3___3 = 252, + PIN_QSPI0_MISO_IO1___3 = 253, + PIN_QSPI0_MOSI_IO0___3 = 254, + PIN_QSPI0_SPCLK___3 = 255, + PIN_QSPI0_SSL___3 = 256, + PIN_QSPI1_IO2___3 = 257, + PIN_QSPI1_IO3___3 = 258, + PIN_QSPI1_MISO_IO1___3 = 259, + PIN_QSPI1_MOSI_IO0___3 = 260, + PIN_QSPI1_SPCLK___3 = 261, + PIN_QSPI1_SSL___3 = 262, + PIN_RPC_INT_N___3 = 263, + PIN_RPC_RESET_N___3 = 264, + PIN_RPC_WP_N___3 = 265, + PIN_TCK___4 = 266, + PIN_TDI___4 = 267, + PIN_TDO___3 = 268, + PIN_TMS___4 = 269, + PIN_TRST_N___4 = 270, +}; + +enum { + PINMUX_RESERVED___5 = 0, + PINMUX_DATA_BEGIN___5 = 1, + GP_0_0_DATA___5 = 2, + GP_0_1_DATA___5 = 3, + GP_0_2_DATA___5 = 4, + GP_0_3_DATA___5 = 5, + GP_0_4_DATA___5 = 6, + GP_0_5_DATA___5 = 7, + GP_0_6_DATA___5 = 8, + GP_0_7_DATA___5 = 9, + GP_0_8_DATA___5 = 10, + GP_0_9_DATA___5 = 11, + GP_0_10_DATA___5 = 12, + GP_0_11_DATA___5 = 13, + GP_0_12_DATA___5 = 14, + GP_0_13_DATA___5 = 15, + GP_0_14_DATA___5 = 16, + GP_0_15_DATA___5 = 17, + GP_1_0_DATA___5 = 18, + GP_1_1_DATA___5 = 19, + GP_1_2_DATA___5 = 20, + GP_1_3_DATA___5 = 21, + GP_1_4_DATA___5 = 22, + GP_1_5_DATA___5 = 23, + GP_1_6_DATA___5 = 24, + GP_1_7_DATA___5 = 25, + GP_1_8_DATA___5 = 26, + GP_1_9_DATA___5 = 27, + GP_1_10_DATA___5 = 28, + GP_1_11_DATA___5 = 29, + GP_1_12_DATA___5 = 30, + GP_1_13_DATA___5 = 31, + GP_1_14_DATA___5 = 32, + GP_1_15_DATA___5 = 33, + GP_1_16_DATA___5 = 34, + GP_1_17_DATA___5 = 35, + GP_1_18_DATA___5 = 36, + GP_1_19_DATA___5 = 37, + GP_1_20_DATA___5 = 38, + GP_1_21_DATA___5 = 39, + GP_1_22_DATA___5 = 40, + GP_1_23_DATA___4 = 41, + GP_1_24_DATA___4 = 42, + GP_1_25_DATA___4 = 43, + GP_1_26_DATA___4 = 44, + GP_1_27_DATA___4 = 45, + GP_2_0_DATA___5 = 46, + GP_2_1_DATA___5 = 47, + GP_2_2_DATA___5 = 48, + GP_2_3_DATA___5 = 49, + GP_2_4_DATA___5 = 50, + GP_2_5_DATA___5 = 51, + GP_2_6_DATA___5 = 52, + GP_2_7_DATA___5 = 53, + GP_2_8_DATA___5 = 54, + GP_2_9_DATA___5 = 55, + GP_2_10_DATA___5 = 56, + GP_2_11_DATA___5 = 57, + GP_2_12_DATA___5 = 58, + GP_2_13_DATA___5 = 59, + GP_2_14_DATA___5 = 60, + GP_3_0_DATA___5 = 61, + GP_3_1_DATA___5 = 62, + GP_3_2_DATA___5 = 63, + GP_3_3_DATA___5 = 64, + GP_3_4_DATA___5 = 65, + GP_3_5_DATA___5 = 66, + GP_3_6_DATA___5 = 67, + GP_3_7_DATA___5 = 68, + GP_3_8_DATA___5 = 69, + GP_3_9_DATA___5 = 70, + GP_3_10_DATA___5 = 71, + GP_3_11_DATA___5 = 72, + GP_3_12_DATA___5 = 73, + GP_3_13_DATA___5 = 74, + GP_3_14_DATA___5 = 75, + GP_3_15_DATA___5 = 76, + GP_4_0_DATA___5 = 77, + GP_4_1_DATA___5 = 78, + GP_4_2_DATA___5 = 79, + GP_4_3_DATA___5 = 80, + GP_4_4_DATA___5 = 81, + GP_4_5_DATA___5 = 82, + GP_4_6_DATA___5 = 83, + GP_4_7_DATA___5 = 84, + GP_4_8_DATA___5 = 85, + GP_4_9_DATA___5 = 86, + GP_4_10_DATA___5 = 87, + GP_4_11_DATA___4 = 88, + GP_4_12_DATA___4 = 89, + GP_4_13_DATA___4 = 90, + GP_4_14_DATA___4 = 91, + GP_4_15_DATA___4 = 92, + GP_4_16_DATA___4 = 93, + GP_4_17_DATA___4 = 94, + GP_5_0_DATA___5 = 95, + GP_5_1_DATA___5 = 96, + GP_5_2_DATA___5 = 97, + GP_5_3_DATA___5 = 98, + GP_5_4_DATA___5 = 99, + GP_5_5_DATA___5 = 100, + GP_5_6_DATA___5 = 101, + GP_5_7_DATA___5 = 102, + GP_5_8_DATA___5 = 103, + GP_5_9_DATA___5 = 104, + GP_5_10_DATA___5 = 105, + GP_5_11_DATA___5 = 106, + GP_5_12_DATA___5 = 107, + GP_5_13_DATA___5 = 108, + GP_5_14_DATA___5 = 109, + GP_5_15_DATA___5 = 110, + GP_5_16_DATA___5 = 111, + GP_5_17_DATA___5 = 112, + GP_5_18_DATA___5 = 113, + GP_5_19_DATA___5 = 114, + GP_5_20_DATA___4 = 115, + GP_5_21_DATA___4 = 116, + GP_5_22_DATA___4 = 117, + GP_5_23_DATA___4 = 118, + GP_5_24_DATA___4 = 119, + GP_5_25_DATA___4 = 120, + GP_6_0_DATA___5 = 121, + GP_6_1_DATA___5 = 122, + GP_6_2_DATA___5 = 123, + GP_6_3_DATA___5 = 124, + GP_6_4_DATA___5 = 125, + GP_6_5_DATA___5 = 126, + GP_6_6_DATA___5 = 127, + GP_6_7_DATA___5 = 128, + GP_6_8_DATA___5 = 129, + GP_6_9_DATA___5 = 130, + GP_6_10_DATA___5 = 131, + GP_6_11_DATA___5 = 132, + GP_6_12_DATA___5 = 133, + GP_6_13_DATA___5 = 134, + GP_6_14_DATA___5 = 135, + GP_6_15_DATA___5 = 136, + GP_6_16_DATA___5 = 137, + GP_6_17_DATA___5 = 138, + GP_6_18_DATA___4 = 139, + GP_6_19_DATA___4 = 140, + GP_6_20_DATA___4 = 141, + GP_6_21_DATA___4 = 142, + GP_6_22_DATA___4 = 143, + GP_6_23_DATA___4 = 144, + GP_6_24_DATA___4 = 145, + GP_6_25_DATA___4 = 146, + GP_6_26_DATA___4 = 147, + GP_6_27_DATA___4 = 148, + GP_6_28_DATA___4 = 149, + GP_6_29_DATA___4 = 150, + GP_6_30_DATA___4 = 151, + GP_6_31_DATA___4 = 152, + GP_7_0_DATA___4 = 153, + GP_7_1_DATA___4 = 154, + GP_7_2_DATA___4 = 155, + GP_7_3_DATA___4 = 156, + PINMUX_DATA_END___5 = 157, + PINMUX_FUNCTION_BEGIN___5 = 158, + GP_0_0_FN___5 = 159, + GP_0_1_FN___5 = 160, + GP_0_2_FN___5 = 161, + GP_0_3_FN___5 = 162, + GP_0_4_FN___5 = 163, + GP_0_5_FN___5 = 164, + GP_0_6_FN___5 = 165, + GP_0_7_FN___5 = 166, + GP_0_8_FN___5 = 167, + GP_0_9_FN___5 = 168, + GP_0_10_FN___5 = 169, + GP_0_11_FN___5 = 170, + GP_0_12_FN___5 = 171, + GP_0_13_FN___5 = 172, + GP_0_14_FN___5 = 173, + GP_0_15_FN___5 = 174, + GP_1_0_FN___5 = 175, + GP_1_1_FN___5 = 176, + GP_1_2_FN___5 = 177, + GP_1_3_FN___5 = 178, + GP_1_4_FN___5 = 179, + GP_1_5_FN___5 = 180, + GP_1_6_FN___5 = 181, + GP_1_7_FN___5 = 182, + GP_1_8_FN___5 = 183, + GP_1_9_FN___5 = 184, + GP_1_10_FN___5 = 185, + GP_1_11_FN___5 = 186, + GP_1_12_FN___5 = 187, + GP_1_13_FN___5 = 188, + GP_1_14_FN___5 = 189, + GP_1_15_FN___5 = 190, + GP_1_16_FN___5 = 191, + GP_1_17_FN___5 = 192, + GP_1_18_FN___5 = 193, + GP_1_19_FN___5 = 194, + GP_1_20_FN___5 = 195, + GP_1_21_FN___5 = 196, + GP_1_22_FN___5 = 197, + GP_1_23_FN___4 = 198, + GP_1_24_FN___4 = 199, + GP_1_25_FN___4 = 200, + GP_1_26_FN___4 = 201, + GP_1_27_FN___4 = 202, + GP_2_0_FN___5 = 203, + GP_2_1_FN___5 = 204, + GP_2_2_FN___5 = 205, + GP_2_3_FN___5 = 206, + GP_2_4_FN___5 = 207, + GP_2_5_FN___5 = 208, + GP_2_6_FN___5 = 209, + GP_2_7_FN___5 = 210, + GP_2_8_FN___5 = 211, + GP_2_9_FN___5 = 212, + GP_2_10_FN___5 = 213, + GP_2_11_FN___5 = 214, + GP_2_12_FN___5 = 215, + GP_2_13_FN___5 = 216, + GP_2_14_FN___5 = 217, + GP_3_0_FN___5 = 218, + GP_3_1_FN___5 = 219, + GP_3_2_FN___5 = 220, + GP_3_3_FN___5 = 221, + GP_3_4_FN___5 = 222, + GP_3_5_FN___5 = 223, + GP_3_6_FN___5 = 224, + GP_3_7_FN___5 = 225, + GP_3_8_FN___5 = 226, + GP_3_9_FN___5 = 227, + GP_3_10_FN___5 = 228, + GP_3_11_FN___5 = 229, + GP_3_12_FN___5 = 230, + GP_3_13_FN___5 = 231, + GP_3_14_FN___5 = 232, + GP_3_15_FN___5 = 233, + GP_4_0_FN___5 = 234, + GP_4_1_FN___5 = 235, + GP_4_2_FN___5 = 236, + GP_4_3_FN___5 = 237, + GP_4_4_FN___5 = 238, + GP_4_5_FN___5 = 239, + GP_4_6_FN___5 = 240, + GP_4_7_FN___5 = 241, + GP_4_8_FN___5 = 242, + GP_4_9_FN___5 = 243, + GP_4_10_FN___5 = 244, + GP_4_11_FN___4 = 245, + GP_4_12_FN___4 = 246, + GP_4_13_FN___4 = 247, + GP_4_14_FN___4 = 248, + GP_4_15_FN___4 = 249, + GP_4_16_FN___4 = 250, + GP_4_17_FN___4 = 251, + GP_5_0_FN___5 = 252, + GP_5_1_FN___5 = 253, + GP_5_2_FN___5 = 254, + GP_5_3_FN___5 = 255, + GP_5_4_FN___5 = 256, + GP_5_5_FN___5 = 257, + GP_5_6_FN___5 = 258, + GP_5_7_FN___5 = 259, + GP_5_8_FN___5 = 260, + GP_5_9_FN___5 = 261, + GP_5_10_FN___5 = 262, + GP_5_11_FN___5 = 263, + GP_5_12_FN___5 = 264, + GP_5_13_FN___5 = 265, + GP_5_14_FN___5 = 266, + GP_5_15_FN___5 = 267, + GP_5_16_FN___5 = 268, + GP_5_17_FN___5 = 269, + GP_5_18_FN___5 = 270, + GP_5_19_FN___5 = 271, + GP_5_20_FN___4 = 272, + GP_5_21_FN___4 = 273, + GP_5_22_FN___4 = 274, + GP_5_23_FN___4 = 275, + GP_5_24_FN___4 = 276, + GP_5_25_FN___4 = 277, + GP_6_0_FN___5 = 278, + GP_6_1_FN___5 = 279, + GP_6_2_FN___5 = 280, + GP_6_3_FN___5 = 281, + GP_6_4_FN___5 = 282, + GP_6_5_FN___5 = 283, + GP_6_6_FN___5 = 284, + GP_6_7_FN___5 = 285, + GP_6_8_FN___5 = 286, + GP_6_9_FN___5 = 287, + GP_6_10_FN___5 = 288, + GP_6_11_FN___5 = 289, + GP_6_12_FN___5 = 290, + GP_6_13_FN___5 = 291, + GP_6_14_FN___5 = 292, + GP_6_15_FN___5 = 293, + GP_6_16_FN___5 = 294, + GP_6_17_FN___5 = 295, + GP_6_18_FN___4 = 296, + GP_6_19_FN___4 = 297, + GP_6_20_FN___4 = 298, + GP_6_21_FN___4 = 299, + GP_6_22_FN___4 = 300, + GP_6_23_FN___4 = 301, + GP_6_24_FN___4 = 302, + GP_6_25_FN___4 = 303, + GP_6_26_FN___4 = 304, + GP_6_27_FN___4 = 305, + GP_6_28_FN___4 = 306, + GP_6_29_FN___4 = 307, + GP_6_30_FN___4 = 308, + GP_6_31_FN___4 = 309, + GP_7_0_FN___4 = 310, + GP_7_1_FN___4 = 311, + GP_7_2_FN___4 = 312, + GP_7_3_FN___4 = 313, + FN_MSIOF0_RXD___5 = 314, + FN_MSIOF0_TXD___5 = 315, + FN_SD3_DS___5 = 316, + FN_MSIOF0_SCK___5 = 317, + FN_SSI_SDATA5___5 = 318, + FN_SD3_DAT3___5 = 319, + FN_SSI_WS5___5 = 320, + FN_SD3_DAT2___5 = 321, + FN_SSI_SCK5___5 = 322, + FN_SD3_DAT1___5 = 323, + FN_SD3_DAT0___5 = 324, + FN_SD3_CMD___5 = 325, + FN_SD3_CLK___5 = 326, + FN_GP7_03___4 = 327, + FN_GP7_02___4 = 328, + FN_SD2_CMD___4 = 329, + FN_AVS2___4 = 330, + FN_AVS1___4 = 331, + FN_IP0_3_0___5 = 332, + FN_AVB_MDC___5 = 333, + FN_MSIOF2_SS2_C___4 = 334, + FN_IP1_3_0___5 = 335, + FN_IRQ2___5 = 336, + FN_QCPV_QDE___5 = 337, + FN_DU_EXODDF_DU_ODDF_DISP_CDE___4 = 338, + FN_VI4_DATA2_B___5 = 339, + FN_PWM3_B___5 = 340, + FN_IP2_3_0___5 = 341, + FN_A1___5 = 342, + FN_LCDOUT17___5 = 343, + FN_MSIOF3_TXD_B___5 = 344, + FN_VI4_DATA9___5 = 345, + FN_DU_DB1___5 = 346, + FN_PWM4_A___5 = 347, + FN_IP3_3_0___5 = 348, + FN_A9___5 = 349, + FN_MSIOF2_SCK_A___5 = 350, + FN_CTS4_N_B___4 = 351, + FN_VI5_VSYNC_N___4 = 352, + FN_IP0_7_4___5 = 353, + FN_AVB_MAGIC___5 = 354, + FN_MSIOF2_SS1_C___4 = 355, + FN_SCK4_A___5 = 356, + FN_IP1_7_4___5 = 357, + FN_IRQ3___5 = 358, + FN_QSTVB_QVE___5 = 359, + FN_A25 = 360, + FN_DU_DOTCLKOUT1___4 = 361, + FN_VI4_DATA3_B___5 = 362, + FN_PWM4_B___5 = 363, + FN_IP2_7_4___5 = 364, + FN_A2___5 = 365, + FN_LCDOUT18___5 = 366, + FN_MSIOF3_SCK_B___5 = 367, + FN_VI4_DATA10___5 = 368, + FN_DU_DB2___5 = 369, + FN_PWM5_A___5 = 370, + FN_IP3_7_4___5 = 371, + FN_A10___5 = 372, + FN_MSIOF2_RXD_A___5 = 373, + FN_RTS4_N_B___4 = 374, + FN_VI5_HSYNC_N___4 = 375, + FN_IP0_11_8___5 = 376, + FN_AVB_PHY_INT___5 = 377, + FN_MSIOF2_SYNC_C___4 = 378, + FN_RX4_A___5 = 379, + FN_IP1_11_8___5 = 380, + FN_IRQ4___5 = 381, + FN_QSTH_QHS___5 = 382, + FN_A24 = 383, + FN_DU_EXHSYNC_DU_HSYNC___4 = 384, + FN_VI4_DATA4_B___5 = 385, + FN_PWM5_B___5 = 386, + FN_IP2_11_8___5 = 387, + FN_A3___5 = 388, + FN_LCDOUT19___5 = 389, + FN_MSIOF3_RXD_B___5 = 390, + FN_VI4_DATA11___5 = 391, + FN_DU_DB3___5 = 392, + FN_PWM6_A___5 = 393, + FN_IP3_11_8___5 = 394, + FN_A11___5 = 395, + FN_TX3_B___5 = 396, + FN_MSIOF2_TXD_A___5 = 397, + FN_HTX4_B___5 = 398, + FN_HSCK4___4 = 399, + FN_VI5_FIELD___4 = 400, + FN_SCL6_A___5 = 401, + FN_AVB_AVTP_CAPTURE_B___4 = 402, + FN_PWM2_B___5 = 403, + FN_IP0_15_12___5 = 404, + FN_AVB_LINK___5 = 405, + FN_MSIOF2_SCK_C___4 = 406, + FN_TX4_A___5 = 407, + FN_IP1_15_12___5 = 408, + FN_IRQ5___5 = 409, + FN_QSTB_QHE___5 = 410, + FN_A23 = 411, + FN_DU_EXVSYNC_DU_VSYNC___4 = 412, + FN_VI4_DATA5_B___5 = 413, + FN_PWM6_B___5 = 414, + FN_IP2_15_12___5 = 415, + FN_A4___5 = 416, + FN_LCDOUT20___5 = 417, + FN_MSIOF3_SS1_B___5 = 418, + FN_VI4_DATA12___5 = 419, + FN_VI5_DATA12___4 = 420, + FN_DU_DB4___5 = 421, + FN_IP3_15_12___5 = 422, + FN_A12___5 = 423, + FN_LCDOUT12___5 = 424, + FN_MSIOF3_SCK_C___4 = 425, + FN_HRX4_A___5 = 426, + FN_VI5_DATA8___4 = 427, + FN_DU_DG4___5 = 428, + FN_IP0_19_16___5 = 429, + FN_AVB_AVTP_MATCH_A___4 = 430, + FN_MSIOF2_RXD_C___4 = 431, + FN_CTS4_N_A___5 = 432, + FN_IP1_19_16___5 = 433, + FN_PWM0___4 = 434, + FN_AVB_AVTP_PPS___5 = 435, + FN_A22 = 436, + FN_VI4_DATA6_B___5 = 437, + FN_IECLK_B___4 = 438, + FN_IP2_19_16___5 = 439, + FN_A5___5 = 440, + FN_LCDOUT21___5 = 441, + FN_MSIOF3_SS2_B___4 = 442, + FN_SCK4_B___5 = 443, + FN_VI4_DATA13___5 = 444, + FN_VI5_DATA13___4 = 445, + FN_DU_DB5___5 = 446, + FN_IP3_19_16___5 = 447, + FN_A13___5 = 448, + FN_LCDOUT13___5 = 449, + FN_MSIOF3_SYNC_C___4 = 450, + FN_HTX4_A___5 = 451, + FN_VI5_DATA9___4 = 452, + FN_DU_DG5___5 = 453, + FN_IP0_23_20___5 = 454, + FN_AVB_AVTP_CAPTURE_A___4 = 455, + FN_MSIOF2_TXD_C___4 = 456, + FN_RTS4_N_A___5 = 457, + FN_IP1_23_20___5 = 458, + FN_PWM1_A___5 = 459, + FN_A21 = 460, + FN_HRX3_D___5 = 461, + FN_VI4_DATA7_B___5 = 462, + FN_IERX_B___4 = 463, + FN_IP2_23_20___5 = 464, + FN_A6___5 = 465, + FN_LCDOUT22___5 = 466, + FN_MSIOF2_SS1_A___5 = 467, + FN_RX4_B___5 = 468, + FN_VI4_DATA14___5 = 469, + FN_VI5_DATA14___4 = 470, + FN_DU_DB6___5 = 471, + FN_IP3_23_20___5 = 472, + FN_A14___5 = 473, + FN_LCDOUT14___5 = 474, + FN_MSIOF3_RXD_C___4 = 475, + FN_HCTS4_N___4 = 476, + FN_VI5_DATA10___4 = 477, + FN_DU_DG6___5 = 478, + FN_IP0_27_24___5 = 479, + FN_IRQ0___5 = 480, + FN_QPOLB___5 = 481, + FN_DU_CDE___5 = 482, + FN_VI4_DATA0_B___5 = 483, + FN_CAN0_TX_B___4 = 484, + FN_CANFD0_TX_B___4 = 485, + FN_IP1_27_24___5 = 486, + FN_PWM2_A___5 = 487, + FN_A20 = 488, + FN_HTX3_D___5 = 489, + FN_IETX_B___4 = 490, + FN_IP2_27_24___5 = 491, + FN_A7___5 = 492, + FN_LCDOUT23___5 = 493, + FN_MSIOF2_SS2_A___5 = 494, + FN_TX4_B___5 = 495, + FN_VI4_DATA15___5 = 496, + FN_VI5_DATA15___4 = 497, + FN_DU_DB7___5 = 498, + FN_IP3_27_24___5 = 499, + FN_A15___5 = 500, + FN_LCDOUT15___5 = 501, + FN_MSIOF3_TXD_C___4 = 502, + FN_HRTS4_N___4 = 503, + FN_VI5_DATA11___4 = 504, + FN_DU_DG7___5 = 505, + FN_IP0_31_28___5 = 506, + FN_IRQ1___5 = 507, + FN_QPOLA___5 = 508, + FN_DU_DISP___5 = 509, + FN_VI4_DATA1_B___5 = 510, + FN_CAN0_RX_B___4 = 511, + FN_CANFD0_RX_B___4 = 512, + FN_IP1_31_28___5 = 513, + FN_A0___5 = 514, + FN_LCDOUT16___5 = 515, + FN_MSIOF3_SYNC_B___5 = 516, + FN_VI4_DATA8___5 = 517, + FN_DU_DB0___5 = 518, + FN_PWM3_A___5 = 519, + FN_IP2_31_28___5 = 520, + FN_A8___5 = 521, + FN_RX3_B___5 = 522, + FN_MSIOF2_SYNC_A___5 = 523, + FN_HRX4_B___5 = 524, + FN_SDA6_A___5 = 525, + FN_AVB_AVTP_MATCH_B___4 = 526, + FN_PWM1_B___5 = 527, + FN_IP3_31_28___5 = 528, + FN_A16___5 = 529, + FN_LCDOUT8___5 = 530, + FN_VI4_FIELD___5 = 531, + FN_DU_DG0___5 = 532, + FN_IP4_3_0___5 = 533, + FN_A17___5 = 534, + FN_LCDOUT9___5 = 535, + FN_VI4_VSYNC_N___5 = 536, + FN_DU_DG1___5 = 537, + FN_IP5_3_0___5 = 538, + FN_WE0_N___5 = 539, + FN_MSIOF3_TXD_D___4 = 540, + FN_CTS3_N___4 = 541, + FN_HCTS3_N___4 = 542, + FN_SCL6_B___5 = 543, + FN_CAN_CLK___5 = 544, + FN_IECLK_A___4 = 545, + FN_IP6_3_0___5 = 546, + FN_D5___5 = 547, + FN_MSIOF2_SYNC_B___5 = 548, + FN_VI4_DATA21___5 = 549, + FN_VI5_DATA5___4 = 550, + FN_IP7_3_0___5 = 551, + FN_D13___5 = 552, + FN_LCDOUT5___5 = 553, + FN_MSIOF2_SS2_D___4 = 554, + FN_TX4_C___5 = 555, + FN_VI4_DATA5_A___5 = 556, + FN_DU_DR5___5 = 557, + FN_IP4_7_4___5 = 558, + FN_A18___5 = 559, + FN_LCDOUT10___5 = 560, + FN_VI4_HSYNC_N___5 = 561, + FN_DU_DG2___5 = 562, + FN_IP5_7_4___5 = 563, + FN_WE1_N___5 = 564, + FN_MSIOF3_SS1_D___4 = 565, + FN_RTS3_N___4 = 566, + FN_HRTS3_N___4 = 567, + FN_SDA6_B___5 = 568, + FN_CAN1_RX___5 = 569, + FN_CANFD1_RX___5 = 570, + FN_IERX_A___4 = 571, + FN_IP6_7_4___5 = 572, + FN_D6___5 = 573, + FN_MSIOF2_RXD_B___5 = 574, + FN_VI4_DATA22___5 = 575, + FN_VI5_DATA6___4 = 576, + FN_IP7_7_4___5 = 577, + FN_D14___5 = 578, + FN_LCDOUT6___5 = 579, + FN_MSIOF3_SS1_A___5 = 580, + FN_HRX3_C___5 = 581, + FN_VI4_DATA6_A___5 = 582, + FN_DU_DR6___5 = 583, + FN_SCL6_C___4 = 584, + FN_IP4_11_8___5 = 585, + FN_A19___5 = 586, + FN_LCDOUT11___5 = 587, + FN_VI4_CLKENB___5 = 588, + FN_DU_DG3___5 = 589, + FN_IP5_11_8___5 = 590, + FN_EX_WAIT0_A___4 = 591, + FN_QCLK___5 = 592, + FN_VI4_CLK___5 = 593, + FN_DU_DOTCLKOUT0___5 = 594, + FN_IP6_11_8___5 = 595, + FN_D7___5 = 596, + FN_MSIOF2_TXD_B___5 = 597, + FN_VI4_DATA23___5 = 598, + FN_VI5_DATA7___4 = 599, + FN_IP7_11_8___5 = 600, + FN_D15___5 = 601, + FN_LCDOUT7___5 = 602, + FN_MSIOF3_SS2_A___5 = 603, + FN_HTX3_C___5 = 604, + FN_VI4_DATA7_A___5 = 605, + FN_DU_DR7___5 = 606, + FN_SDA6_C___4 = 607, + FN_IP4_15_12___5 = 608, + FN_CS0_N___5 = 609, + FN_VI5_CLKENB___4 = 610, + FN_IP5_15_12___5 = 611, + FN_D0___5 = 612, + FN_MSIOF2_SS1_B___5 = 613, + FN_MSIOF3_SCK_A___5 = 614, + FN_VI4_DATA16___5 = 615, + FN_VI5_DATA0___4 = 616, + FN_IP6_15_12___5 = 617, + FN_D8___5 = 618, + FN_LCDOUT0___5 = 619, + FN_MSIOF2_SCK_D___4 = 620, + FN_SCK4_C___4 = 621, + FN_VI4_DATA0_A___5 = 622, + FN_DU_DR0___5 = 623, + FN_IP7_15_12___2 = 624, + FN_FSCLKST = 625, + FN_IP4_19_16___5 = 626, + FN_CS1_N_A26___2 = 627, + FN_VI5_CLK___4 = 628, + FN_EX_WAIT0_B___4 = 629, + FN_IP5_19_16___5 = 630, + FN_D1___5 = 631, + FN_MSIOF2_SS2_B___5 = 632, + FN_MSIOF3_SYNC_A___5 = 633, + FN_VI4_DATA17___5 = 634, + FN_VI5_DATA1___4 = 635, + FN_IP6_19_16___5 = 636, + FN_D9___5 = 637, + FN_LCDOUT1___5 = 638, + FN_MSIOF2_SYNC_D___4 = 639, + FN_VI4_DATA1_A___5 = 640, + FN_DU_DR1___5 = 641, + FN_IP7_19_16___5 = 642, + FN_SD0_CLK___5 = 643, + FN_MSIOF1_SCK_E___4 = 644, + FN_STP_OPWM_0_B___4 = 645, + FN_IP4_23_20___5 = 646, + FN_BS_N___5 = 647, + FN_QSTVA_QVS___5 = 648, + FN_MSIOF3_SCK_D___4 = 649, + FN_SCK3___4 = 650, + FN_HSCK3___4 = 651, + FN_CAN1_TX___5 = 652, + FN_CANFD1_TX___5 = 653, + FN_IETX_A___4 = 654, + FN_IP5_23_20___5 = 655, + FN_D2___5 = 656, + FN_MSIOF3_RXD_A___5 = 657, + FN_VI4_DATA18___5 = 658, + FN_VI5_DATA2___4 = 659, + FN_IP6_23_20___5 = 660, + FN_D10___5 = 661, + FN_LCDOUT2___5 = 662, + FN_MSIOF2_RXD_D___4 = 663, + FN_HRX3_B___5 = 664, + FN_VI4_DATA2_A___5 = 665, + FN_CTS4_N_C___5 = 666, + FN_DU_DR2___5 = 667, + FN_IP7_23_20___5 = 668, + FN_SD0_CMD___5 = 669, + FN_MSIOF1_SYNC_E___4 = 670, + FN_STP_IVCXO27_0_B___4 = 671, + FN_IP4_27_24___5 = 672, + FN_RD_N___5 = 673, + FN_MSIOF3_SYNC_D___4 = 674, + FN_RX3_A___5 = 675, + FN_HRX3_A___5 = 676, + FN_CAN0_TX_A___4 = 677, + FN_CANFD0_TX_A___4 = 678, + FN_IP5_27_24___5 = 679, + FN_D3___5 = 680, + FN_MSIOF3_TXD_A___5 = 681, + FN_VI4_DATA19___5 = 682, + FN_VI5_DATA3___4 = 683, + FN_IP6_27_24___5 = 684, + FN_D11___5 = 685, + FN_LCDOUT3___5 = 686, + FN_MSIOF2_TXD_D___4 = 687, + FN_HTX3_B___5 = 688, + FN_VI4_DATA3_A___5 = 689, + FN_RTS4_N_C___5 = 690, + FN_DU_DR3___5 = 691, + FN_IP7_27_24___5 = 692, + FN_SD0_DAT0___5 = 693, + FN_MSIOF1_RXD_E___4 = 694, + FN_TS_SCK0_B___4 = 695, + FN_STP_ISCLK_0_B___4 = 696, + FN_IP4_31_28___5 = 697, + FN_RD_WR_N___5 = 698, + FN_MSIOF3_RXD_D___4 = 699, + FN_TX3_A___5 = 700, + FN_HTX3_A___5 = 701, + FN_CAN0_RX_A___4 = 702, + FN_CANFD0_RX_A___4 = 703, + FN_IP5_31_28___5 = 704, + FN_D4___5 = 705, + FN_MSIOF2_SCK_B___5 = 706, + FN_VI4_DATA20___5 = 707, + FN_VI5_DATA4___4 = 708, + FN_IP6_31_28___5 = 709, + FN_D12___5 = 710, + FN_LCDOUT4___5 = 711, + FN_MSIOF2_SS1_D___4 = 712, + FN_RX4_C___5 = 713, + FN_VI4_DATA4_A___5 = 714, + FN_DU_DR4___5 = 715, + FN_IP7_31_28___5 = 716, + FN_SD0_DAT1___5 = 717, + FN_MSIOF1_TXD_E___4 = 718, + FN_TS_SPSYNC0_B___4 = 719, + FN_STP_ISSYNC_0_B___4 = 720, + FN_IP8_3_0___5 = 721, + FN_SD0_DAT2___5 = 722, + FN_MSIOF1_SS1_E___4 = 723, + FN_TS_SDAT0_B___4 = 724, + FN_STP_ISD_0_B___4 = 725, + FN_IP9_3_0___5 = 726, + FN_SD2_CLK___4 = 727, + FN_IP10_3_0___5 = 728, + FN_SD3_DAT6___5 = 729, + FN_SD3_CD___5 = 730, + FN_IP11_3_0___5 = 731, + FN_TX0___4 = 732, + FN_HTX1_B___5 = 733, + FN_TS_SPSYNC0_C___4 = 734, + FN_STP_ISSYNC_0_C___4 = 735, + FN_RIF0_D1_B___5 = 736, + FN_IP8_7_4___5 = 737, + FN_SD0_DAT3___5 = 738, + FN_MSIOF1_SS2_E___4 = 739, + FN_TS_SDEN0_B___4 = 740, + FN_STP_ISEN_0_B___4 = 741, + FN_IP9_7_4___5 = 742, + FN_SD2_DAT0___4 = 743, + FN_IP10_7_4___5 = 744, + FN_SD3_DAT7___5 = 745, + FN_SD3_WP___5 = 746, + FN_IP11_7_4___5 = 747, + FN_CTS0_N___4 = 748, + FN_HCTS1_N_B___5 = 749, + FN_MSIOF1_SYNC_B___4 = 750, + FN_TS_SPSYNC1_C___4 = 751, + FN_STP_ISSYNC_1_C___4 = 752, + FN_RIF1_SYNC_B___4 = 753, + FN_AUDIO_CLKOUT_C___4 = 754, + FN_ADICS_SAMP___4 = 755, + FN_IP8_11_8___5 = 756, + FN_SD1_CLK___5 = 757, + FN_MSIOF1_SCK_G___4 = 758, + FN_SIM0_CLK_A___5 = 759, + FN_IP9_11_8___5 = 760, + FN_SD2_DAT1___4 = 761, + FN_IP10_11_8___5 = 762, + FN_SD0_CD___5 = 763, + FN_SCL2_B___5 = 764, + FN_SIM0_RST_A___5 = 765, + FN_IP11_11_8___5 = 766, + FN_RTS0_N___4 = 767, + FN_HRTS1_N_B___5 = 768, + FN_MSIOF1_SS1_B___4 = 769, + FN_AUDIO_CLKA_B___4 = 770, + FN_SCL2_A___5 = 771, + FN_STP_IVCXO27_1_C___4 = 772, + FN_RIF0_SYNC_B___5 = 773, + FN_ADICHS1___4 = 774, + FN_IP8_15_12___5 = 775, + FN_SD1_CMD___5 = 776, + FN_MSIOF1_SYNC_G___4 = 777, + FN_SIM0_D_A___5 = 778, + FN_STP_IVCXO27_1_B___4 = 779, + FN_IP9_15_12___5 = 780, + FN_SD2_DAT2___4 = 781, + FN_IP10_15_12___5 = 782, + FN_SD0_WP___5 = 783, + FN_SDA2_B___5 = 784, + FN_IP11_15_12___5 = 785, + FN_RX1_A___4 = 786, + FN_HRX1_A___5 = 787, + FN_TS_SDAT0_C___4 = 788, + FN_STP_ISD_0_C___4 = 789, + FN_RIF1_CLK_C___4 = 790, + FN_IP8_19_16___5 = 791, + FN_SD1_DAT0___5 = 792, + FN_SD2_DAT4___4 = 793, + FN_MSIOF1_RXD_G___4 = 794, + FN_TS_SCK1_B___4 = 795, + FN_STP_ISCLK_1_B___4 = 796, + FN_IP9_19_16___5 = 797, + FN_SD2_DAT3___4 = 798, + FN_IP10_19_16___5 = 799, + FN_SD1_CD___5 = 800, + FN_SIM0_CLK_B___5 = 801, + FN_IP11_19_16___5 = 802, + FN_TX1_A___4 = 803, + FN_HTX1_A___5 = 804, + FN_TS_SDEN0_C___4 = 805, + FN_STP_ISEN_0_C___4 = 806, + FN_RIF1_D0_C___4 = 807, + FN_IP8_23_20___5 = 808, + FN_SD1_DAT1___5 = 809, + FN_SD2_DAT5___4 = 810, + FN_MSIOF1_TXD_G___4 = 811, + FN_TS_SPSYNC1_B___4 = 812, + FN_STP_ISSYNC_1_B___4 = 813, + FN_IP9_23_20___5 = 814, + FN_SD2_DS___4 = 815, + FN_SATA_DEVSLP_B___3 = 816, + FN_IP10_23_20___5 = 817, + FN_SD1_WP___5 = 818, + FN_SIM0_D_B___5 = 819, + FN_IP11_23_20___5 = 820, + FN_CTS1_N___5 = 821, + FN_HCTS1_N_A___4 = 822, + FN_MSIOF1_RXD_B___4 = 823, + FN_TS_SDEN1_C___4 = 824, + FN_STP_ISEN_1_C___4 = 825, + FN_RIF1_D0_B___4 = 826, + FN_ADIDATA___4 = 827, + FN_IP8_27_24___5 = 828, + FN_SD1_DAT2___5 = 829, + FN_SD2_DAT6___4 = 830, + FN_MSIOF1_SS1_G___4 = 831, + FN_TS_SDAT1_B___4 = 832, + FN_STP_ISD_1_B___4 = 833, + FN_IP9_27_24___5 = 834, + FN_SD3_DAT4___5 = 835, + FN_SD2_CD_A___4 = 836, + FN_IP10_27_24___5 = 837, + FN_SCK0___4 = 838, + FN_HSCK1_B___5 = 839, + FN_MSIOF1_SS2_B___4 = 840, + FN_AUDIO_CLKC_B___5 = 841, + FN_SDA2_A___5 = 842, + FN_SIM0_RST_B___5 = 843, + FN_STP_OPWM_0_C___4 = 844, + FN_RIF0_CLK_B___5 = 845, + FN_ADICHS2___4 = 846, + FN_IP11_27_24___5 = 847, + FN_RTS1_N___5 = 848, + FN_HRTS1_N_A___4 = 849, + FN_MSIOF1_TXD_B___4 = 850, + FN_TS_SDAT1_C___4 = 851, + FN_STP_ISD_1_C___4 = 852, + FN_RIF1_D1_B___4 = 853, + FN_ADICHS0___4 = 854, + FN_IP8_31_28___5 = 855, + FN_SD1_DAT3___5 = 856, + FN_SD2_DAT7___4 = 857, + FN_MSIOF1_SS2_G___4 = 858, + FN_TS_SDEN1_B___4 = 859, + FN_STP_ISEN_1_B___4 = 860, + FN_IP9_31_28___5 = 861, + FN_SD3_DAT5___5 = 862, + FN_SD2_WP_A___4 = 863, + FN_IP10_31_28___5 = 864, + FN_RX0___4 = 865, + FN_HRX1_B___5 = 866, + FN_TS_SCK0_C___4 = 867, + FN_STP_ISCLK_0_C___4 = 868, + FN_RIF0_D0_B___5 = 869, + FN_IP11_31_28___5 = 870, + FN_SCK2___4 = 871, + FN_SCIF_CLK_B___5 = 872, + FN_MSIOF1_SCK_B___4 = 873, + FN_TS_SCK1_C___4 = 874, + FN_STP_ISCLK_1_C___4 = 875, + FN_RIF1_CLK_B___4 = 876, + FN_ADICLK___4 = 877, + FN_IP12_3_0___5 = 878, + FN_TX2_A___5 = 879, + FN_SD2_CD_B___4 = 880, + FN_SCL1_A___5 = 881, + FN_FMCLK_A___5 = 882, + FN_RIF1_D1_C___4 = 883, + FN_FSO_CFE_0_B = 884, + FN_IP13_3_0___5 = 885, + FN_MSIOF0_SS1___5 = 886, + FN_RX5 = 887, + FN_AUDIO_CLKA_C___4 = 888, + FN_SSI_SCK2_A___5 = 889, + FN_STP_IVCXO27_0_C___4 = 890, + FN_AUDIO_CLKOUT3_A___5 = 891, + FN_TCLK1_B___5 = 892, + FN_IP14_3_0___5 = 893, + FN_SSI_SDATA1_A___4 = 894, + FN_IP15_3_0___5 = 895, + FN_SSI_SCK6___5 = 896, + FN_USB2_PWEN___2 = 897, + FN_SIM0_RST_D___4 = 898, + FN_IP12_7_4___5 = 899, + FN_RX2_A___5 = 900, + FN_SD2_WP_B___4 = 901, + FN_SDA1_A___5 = 902, + FN_FMIN_A___5 = 903, + FN_RIF1_SYNC_C___4 = 904, + FN_FSO_CFE_1_B = 905, + FN_IP13_7_4___5 = 906, + FN_MSIOF0_SS2___5 = 907, + FN_TX5 = 908, + FN_MSIOF1_SS2_D___4 = 909, + FN_AUDIO_CLKC_A___5 = 910, + FN_SSI_WS2_A___5 = 911, + FN_STP_OPWM_0_D___4 = 912, + FN_AUDIO_CLKOUT_D___4 = 913, + FN_SPEEDIN_B___5 = 914, + FN_IP14_7_4___5 = 915, + FN_SSI_SDATA2_A___4 = 916, + FN_SSI_SCK1_B___4 = 917, + FN_IP15_7_4___5 = 918, + FN_SSI_WS6___5 = 919, + FN_USB2_OVC___2 = 920, + FN_SIM0_D_D___4 = 921, + FN_IP12_11_8___5 = 922, + FN_HSCK0___4 = 923, + FN_MSIOF1_SCK_D___4 = 924, + FN_AUDIO_CLKB_A___5 = 925, + FN_SSI_SDATA1_B___4 = 926, + FN_TS_SCK0_D___4 = 927, + FN_STP_ISCLK_0_D___4 = 928, + FN_RIF0_CLK_C___4 = 929, + FN_IP13_11_8___5 = 930, + FN_MLB_CLK___5 = 931, + FN_MSIOF1_SCK_F___4 = 932, + FN_SCL1_B___5 = 933, + FN_IP14_11_8___5 = 934, + FN_SSI_SCK349___5 = 935, + FN_MSIOF1_SS1_A___4 = 936, + FN_STP_OPWM_0_A___4 = 937, + FN_IP15_11_8___5 = 938, + FN_SSI_SDATA6___5 = 939, + FN_SIM0_CLK_D___4 = 940, + FN_SATA_DEVSLP_A___3 = 941, + FN_IP12_15_12___5 = 942, + FN_HRX0___4 = 943, + FN_MSIOF1_RXD_D___4 = 944, + FN_SSI_SDATA2_B___4 = 945, + FN_TS_SDEN0_D___4 = 946, + FN_STP_ISEN_0_D___4 = 947, + FN_RIF0_D0_C___4 = 948, + FN_IP13_15_12___5 = 949, + FN_MLB_SIG___5 = 950, + FN_RX1_B___4 = 951, + FN_MSIOF1_SYNC_F___4 = 952, + FN_SDA1_B___5 = 953, + FN_IP14_15_12___5 = 954, + FN_SSI_WS349___5 = 955, + FN_HCTS2_N_A___5 = 956, + FN_MSIOF1_SS2_A___4 = 957, + FN_STP_IVCXO27_0_A___4 = 958, + FN_IP15_15_12___5 = 959, + FN_SSI_SCK78___5 = 960, + FN_HRX2_B___5 = 961, + FN_MSIOF1_SCK_C___4 = 962, + FN_TS_SCK1_A___4 = 963, + FN_STP_ISCLK_1_A___4 = 964, + FN_RIF1_CLK_A___4 = 965, + FN_RIF3_CLK_A___5 = 966, + FN_IP12_19_16___5 = 967, + FN_HTX0___4 = 968, + FN_MSIOF1_TXD_D___4 = 969, + FN_SSI_SDATA9_B___4 = 970, + FN_TS_SDAT0_D___4 = 971, + FN_STP_ISD_0_D___4 = 972, + FN_RIF0_D1_C___4 = 973, + FN_IP13_19_16___5 = 974, + FN_MLB_DAT___5 = 975, + FN_TX1_B___4 = 976, + FN_MSIOF1_RXD_F___4 = 977, + FN_IP14_19_16___5 = 978, + FN_SSI_SDATA3___5 = 979, + FN_HRTS2_N_A___5 = 980, + FN_MSIOF1_TXD_A___4 = 981, + FN_TS_SCK0_A___4 = 982, + FN_STP_ISCLK_0_A___4 = 983, + FN_RIF0_D1_A___5 = 984, + FN_RIF2_D0_A___5 = 985, + FN_IP15_19_16___5 = 986, + FN_SSI_WS78___5 = 987, + FN_HTX2_B___5 = 988, + FN_MSIOF1_SYNC_C___4 = 989, + FN_TS_SDAT1_A___4 = 990, + FN_STP_ISD_1_A___4 = 991, + FN_RIF1_SYNC_A___4 = 992, + FN_RIF3_SYNC_A___5 = 993, + FN_IP12_23_20___5 = 994, + FN_HCTS0_N___4 = 995, + FN_RX2_B___5 = 996, + FN_MSIOF1_SYNC_D___4 = 997, + FN_SSI_SCK9_A___5 = 998, + FN_TS_SPSYNC0_D___4 = 999, + FN_STP_ISSYNC_0_D___4 = 1000, + FN_RIF0_SYNC_C___4 = 1001, + FN_AUDIO_CLKOUT1_A___5 = 1002, + FN_IP13_23_20___5 = 1003, + FN_SSI_SCK01239___5 = 1004, + FN_MSIOF1_TXD_F___4 = 1005, + FN_IP14_23_20___5 = 1006, + FN_SSI_SCK4___5 = 1007, + FN_HRX2_A___5 = 1008, + FN_MSIOF1_SCK_A___4 = 1009, + FN_TS_SDAT0_A___4 = 1010, + FN_STP_ISD_0_A___4 = 1011, + FN_RIF0_CLK_A___5 = 1012, + FN_RIF2_CLK_A___5 = 1013, + FN_IP15_23_20___5 = 1014, + FN_SSI_SDATA7___5 = 1015, + FN_HCTS2_N_B___4 = 1016, + FN_MSIOF1_RXD_C___4 = 1017, + FN_TS_SDEN1_A___4 = 1018, + FN_STP_ISEN_1_A___4 = 1019, + FN_RIF1_D0_A___4 = 1020, + FN_RIF3_D0_A___5 = 1021, + FN_TCLK2_A___5 = 1022, + FN_IP12_27_24___5 = 1023, + FN_HRTS0_N___4 = 1024, + FN_TX2_B___5 = 1025, + FN_MSIOF1_SS1_D___4 = 1026, + FN_SSI_WS9_A___5 = 1027, + FN_STP_IVCXO27_0_D___4 = 1028, + FN_BPFCLK_A___5 = 1029, + FN_AUDIO_CLKOUT2_A___5 = 1030, + FN_IP13_27_24___5 = 1031, + FN_SSI_WS01239___5 = 1032, + FN_MSIOF1_SS1_F___4 = 1033, + FN_IP14_27_24___5 = 1034, + FN_SSI_WS4___5 = 1035, + FN_HTX2_A___5 = 1036, + FN_MSIOF1_SYNC_A___4 = 1037, + FN_TS_SDEN0_A___4 = 1038, + FN_STP_ISEN_0_A___4 = 1039, + FN_RIF0_SYNC_A___5 = 1040, + FN_RIF2_SYNC_A___5 = 1041, + FN_IP15_27_24___5 = 1042, + FN_SSI_SDATA8___5 = 1043, + FN_HRTS2_N_B___4 = 1044, + FN_MSIOF1_TXD_C___4 = 1045, + FN_TS_SPSYNC1_A___4 = 1046, + FN_STP_ISSYNC_1_A___4 = 1047, + FN_RIF1_D1_A___4 = 1048, + FN_RIF3_D1_A___5 = 1049, + FN_IP12_31_28___5 = 1050, + FN_MSIOF0_SYNC___5 = 1051, + FN_AUDIO_CLKOUT_A___5 = 1052, + FN_IP13_31_28___5 = 1053, + FN_SSI_SDATA0___5 = 1054, + FN_MSIOF1_SS2_F___4 = 1055, + FN_IP14_31_28___5 = 1056, + FN_SSI_SDATA4___5 = 1057, + FN_HSCK2_A___5 = 1058, + FN_MSIOF1_RXD_A___4 = 1059, + FN_TS_SPSYNC0_A___4 = 1060, + FN_STP_ISSYNC_0_A___4 = 1061, + FN_RIF0_D0_A___5 = 1062, + FN_RIF2_D1_A___5 = 1063, + FN_IP15_31_28___5 = 1064, + FN_SSI_SDATA9_A___4 = 1065, + FN_HSCK2_B___4 = 1066, + FN_MSIOF1_SS1_C___4 = 1067, + FN_HSCK1_A___5 = 1068, + FN_SSI_WS1_B___4 = 1069, + FN_SCK1___5 = 1070, + FN_STP_IVCXO27_1_A___4 = 1071, + FN_SCK5 = 1072, + FN_IP16_3_0___4 = 1073, + FN_AUDIO_CLKA_A___4 = 1074, + FN_IP17_3_0___4 = 1075, + FN_USB31_PWEN = 1076, + FN_AUDIO_CLKOUT2_B___5 = 1077, + FN_SSI_SCK9_B___5 = 1078, + FN_TS_SDEN0_E___4 = 1079, + FN_STP_ISEN_0_E___4 = 1080, + FN_RIF2_D0_B___5 = 1081, + FN_TPU0TO2___5 = 1082, + FN_IP16_7_4___4 = 1083, + FN_AUDIO_CLKB_B___5 = 1084, + FN_SCIF_CLK_A___5 = 1085, + FN_STP_IVCXO27_1_D___4 = 1086, + FN_REMOCON_A___5 = 1087, + FN_TCLK1_A___5 = 1088, + FN_IP17_7_4___4 = 1089, + FN_USB31_OVC = 1090, + FN_AUDIO_CLKOUT3_B___5 = 1091, + FN_SSI_WS9_B___5 = 1092, + FN_TS_SPSYNC0_E___4 = 1093, + FN_STP_ISSYNC_0_E___4 = 1094, + FN_RIF2_D1_B___5 = 1095, + FN_TPU0TO3___5 = 1096, + FN_IP16_11_8___4 = 1097, + FN_USB0_PWEN___4 = 1098, + FN_SIM0_RST_C___4 = 1099, + FN_TS_SCK1_D___4 = 1100, + FN_STP_ISCLK_1_D___4 = 1101, + FN_BPFCLK_B___5 = 1102, + FN_RIF3_CLK_B___5 = 1103, + FN_IP16_15_12___4 = 1104, + FN_USB0_OVC___4 = 1105, + FN_SIM0_D_C___4 = 1106, + FN_TS_SDAT1_D___4 = 1107, + FN_STP_ISD_1_D___4 = 1108, + FN_RIF3_SYNC_B___5 = 1109, + FN_IP16_19_16___4 = 1110, + FN_USB1_PWEN___4 = 1111, + FN_SIM0_CLK_C___4 = 1112, + FN_SSI_SCK1_A___4 = 1113, + FN_TS_SCK0_E___4 = 1114, + FN_STP_ISCLK_0_E___4 = 1115, + FN_FMCLK_B___5 = 1116, + FN_RIF2_CLK_B___5 = 1117, + FN_SPEEDIN_A___5 = 1118, + FN_IP16_23_20___4 = 1119, + FN_USB1_OVC___4 = 1120, + FN_MSIOF1_SS2_C___4 = 1121, + FN_SSI_WS1_A___4 = 1122, + FN_TS_SDAT0_E___4 = 1123, + FN_STP_ISD_0_E___4 = 1124, + FN_FMIN_B___5 = 1125, + FN_RIF2_SYNC_B___5 = 1126, + FN_REMOCON_B___5 = 1127, + FN_IP16_27_24___4 = 1128, + FN_USB30_PWEN___5 = 1129, + FN_AUDIO_CLKOUT_B___5 = 1130, + FN_SSI_SCK2_B___5 = 1131, + FN_TS_SDEN1_D___4 = 1132, + FN_STP_ISEN_1_D___4 = 1133, + FN_STP_OPWM_0_E___4 = 1134, + FN_RIF3_D0_B___5 = 1135, + FN_TCLK2_B___5 = 1136, + FN_TPU0TO0___5 = 1137, + FN_IP16_31_28___4 = 1138, + FN_USB30_OVC___5 = 1139, + FN_AUDIO_CLKOUT1_B___5 = 1140, + FN_SSI_WS2_B___5 = 1141, + FN_TS_SPSYNC1_D___4 = 1142, + FN_STP_ISSYNC_1_D___4 = 1143, + FN_STP_IVCXO27_0_E___4 = 1144, + FN_RIF3_D1_B___5 = 1145, + FN_FSO_TOE_B = 1146, + FN_TPU0TO1___5 = 1147, + FN_SEL_TSIF1_0___4 = 1148, + FN_SEL_TSIF1_1___4 = 1149, + FN_SEL_TSIF1_2___4 = 1150, + FN_SEL_TSIF1_3___4 = 1151, + FN_I2C_SEL_5_0___4 = 1152, + FN_I2C_SEL_5_1___4 = 1153, + FN_SEL_MSIOF3_0___5 = 1154, + FN_SEL_MSIOF3_1___5 = 1155, + FN_SEL_MSIOF3_2___4 = 1156, + FN_SEL_MSIOF3_3___4 = 1157, + FN_I2C_SEL_3_0___4 = 1158, + FN_I2C_SEL_3_1___4 = 1159, + FN_SEL_TSIF0_0___4 = 1160, + FN_SEL_TSIF0_1___4 = 1161, + FN_SEL_TSIF0_2___4 = 1162, + FN_SEL_TSIF0_3___4 = 1163, + FN_SEL_TSIF0_4___4 = 1164, + FN_I2C_SEL_0_0___4 = 1165, + FN_I2C_SEL_0_1___4 = 1166, + FN_SEL_MSIOF2_0___5 = 1167, + FN_SEL_MSIOF2_1___5 = 1168, + FN_SEL_MSIOF2_2___4 = 1169, + FN_SEL_MSIOF2_3___4 = 1170, + FN_SEL_MSIOF1_0___4 = 1171, + FN_SEL_MSIOF1_1___4 = 1172, + FN_SEL_MSIOF1_2___4 = 1173, + FN_SEL_MSIOF1_3___4 = 1174, + FN_SEL_MSIOF1_4___4 = 1175, + FN_SEL_MSIOF1_5___4 = 1176, + FN_SEL_MSIOF1_6___4 = 1177, + FN_SEL_TIMER_TMU_0___4 = 1178, + FN_SEL_TIMER_TMU_1___4 = 1179, + FN_SEL_SSP1_1_0___4 = 1180, + FN_SEL_SSP1_1_1___4 = 1181, + FN_SEL_SSP1_1_2___4 = 1182, + FN_SEL_SSP1_1_3___4 = 1183, + FN_SEL_LBSC_0___4 = 1184, + FN_SEL_LBSC_1___4 = 1185, + FN_SEL_SSP1_0_0___4 = 1186, + FN_SEL_SSP1_0_1___4 = 1187, + FN_SEL_SSP1_0_2___4 = 1188, + FN_SEL_SSP1_0_3___4 = 1189, + FN_SEL_SSP1_0_4___4 = 1190, + FN_SEL_IEBUS_0___4 = 1191, + FN_SEL_IEBUS_1___4 = 1192, + FN_SEL_I2C6_0___5 = 1193, + FN_SEL_I2C6_1___5 = 1194, + FN_SEL_I2C6_2___4 = 1195, + FN_SEL_SSI_0 = 1196, + FN_SEL_SSI_1 = 1197, + FN_SEL_I2C2_0___5 = 1198, + FN_SEL_I2C2_1___5 = 1199, + FN_SEL_SPEED_PULSE_0___4 = 1200, + FN_SEL_SPEED_PULSE_1___4 = 1201, + FN_SEL_I2C1_0___5 = 1202, + FN_SEL_I2C1_1___5 = 1203, + FN_SEL_SIMCARD_0___5 = 1204, + FN_SEL_SIMCARD_1___5 = 1205, + FN_SEL_SIMCARD_2___4 = 1206, + FN_SEL_SIMCARD_3___4 = 1207, + FN_SEL_HSCIF4_0___5 = 1208, + FN_SEL_HSCIF4_1___5 = 1209, + FN_SEL_HSCIF3_0___5 = 1210, + FN_SEL_HSCIF3_1___5 = 1211, + FN_SEL_HSCIF3_2___5 = 1212, + FN_SEL_HSCIF3_3___5 = 1213, + FN_SEL_SDHI2_0___4 = 1214, + FN_SEL_SDHI2_1___4 = 1215, + FN_SEL_SCIF4_0___5 = 1216, + FN_SEL_SCIF4_1___5 = 1217, + FN_SEL_SCIF4_2___5 = 1218, + FN_SEL_HSCIF2_0___5 = 1219, + FN_SEL_HSCIF2_1___5 = 1220, + FN_SEL_HSCIF1_0___5 = 1221, + FN_SEL_HSCIF1_1___5 = 1222, + FN_SEL_SCIF3_0___5 = 1223, + FN_SEL_SCIF3_1___5 = 1224, + FN_SEL_FSO_0___2 = 1225, + FN_SEL_FSO_1___2 = 1226, + FN_SEL_SCIF2_0___5 = 1227, + FN_SEL_SCIF2_1___5 = 1228, + FN_SEL_FM_0___5 = 1229, + FN_SEL_FM_1___5 = 1230, + FN_SEL_SCIF1_0___4 = 1231, + FN_SEL_SCIF1_1___4 = 1232, + FN_SEL_ETHERAVB_0___4 = 1233, + FN_SEL_ETHERAVB_1___4 = 1234, + FN_SEL_SATA_0 = 1235, + FN_SEL_SATA_1 = 1236, + FN_SEL_DRIF3_0___5 = 1237, + FN_SEL_DRIF3_1___5 = 1238, + FN_SEL_REMOCON_0___5 = 1239, + FN_SEL_REMOCON_1___5 = 1240, + FN_SEL_DRIF2_0___5 = 1241, + FN_SEL_DRIF2_1___5 = 1242, + FN_SEL_DRIF1_0___4 = 1243, + FN_SEL_DRIF1_1___4 = 1244, + FN_SEL_DRIF1_2___4 = 1245, + FN_SEL_RCAN0_0___4 = 1246, + FN_SEL_RCAN0_1___4 = 1247, + FN_SEL_DRIF0_0___5 = 1248, + FN_SEL_DRIF0_1___5 = 1249, + FN_SEL_DRIF0_2___4 = 1250, + FN_SEL_PWM6_0___5 = 1251, + FN_SEL_PWM6_1___5 = 1252, + FN_SEL_PWM5_0___5 = 1253, + FN_SEL_PWM5_1___5 = 1254, + FN_SEL_CANFD0_0___4 = 1255, + FN_SEL_CANFD0_1___4 = 1256, + FN_SEL_PWM4_0___5 = 1257, + FN_SEL_PWM4_1___5 = 1258, + FN_SEL_ADG_0 = 1259, + FN_SEL_ADG_1 = 1260, + FN_SEL_ADG_2 = 1261, + FN_SEL_ADG_3 = 1262, + FN_SEL_PWM3_0___5 = 1263, + FN_SEL_PWM3_1___5 = 1264, + FN_SEL_PWM2_0___5 = 1265, + FN_SEL_PWM2_1___5 = 1266, + FN_SEL_PWM1_0___5 = 1267, + FN_SEL_PWM1_1___5 = 1268, + FN_SEL_VIN4_0___5 = 1269, + FN_SEL_VIN4_1___5 = 1270, + PINMUX_FUNCTION_END___5 = 1271, + PINMUX_MARK_BEGIN___5 = 1272, + MSIOF0_RXD_MARK___5 = 1273, + MSIOF0_TXD_MARK___5 = 1274, + SD3_DS_MARK___5 = 1275, + MSIOF0_SCK_MARK___5 = 1276, + SSI_SDATA5_MARK___5 = 1277, + SD3_DAT3_MARK___5 = 1278, + SSI_WS5_MARK___5 = 1279, + SD3_DAT2_MARK___5 = 1280, + SSI_SCK5_MARK___5 = 1281, + SD3_DAT1_MARK___5 = 1282, + SD3_DAT0_MARK___5 = 1283, + SD3_CMD_MARK___5 = 1284, + SD3_CLK_MARK___5 = 1285, + GP7_03_MARK___4 = 1286, + GP7_02_MARK___4 = 1287, + SD2_CMD_MARK___4 = 1288, + AVS2_MARK___4 = 1289, + AVS1_MARK___4 = 1290, + IP0_3_0_MARK___5 = 1291, + AVB_MDC_MARK___5 = 1292, + MSIOF2_SS2_C_MARK___4 = 1293, + IP1_3_0_MARK___5 = 1294, + IRQ2_MARK___5 = 1295, + QCPV_QDE_MARK___5 = 1296, + DU_EXODDF_DU_ODDF_DISP_CDE_MARK___4 = 1297, + VI4_DATA2_B_MARK___5 = 1298, + PWM3_B_MARK___5 = 1299, + IP2_3_0_MARK___5 = 1300, + A1_MARK___5 = 1301, + LCDOUT17_MARK___5 = 1302, + MSIOF3_TXD_B_MARK___5 = 1303, + VI4_DATA9_MARK___5 = 1304, + DU_DB1_MARK___5 = 1305, + PWM4_A_MARK___5 = 1306, + IP3_3_0_MARK___5 = 1307, + A9_MARK___5 = 1308, + MSIOF2_SCK_A_MARK___5 = 1309, + CTS4_N_B_MARK___4 = 1310, + VI5_VSYNC_N_MARK___4 = 1311, + IP0_7_4_MARK___5 = 1312, + AVB_MAGIC_MARK___5 = 1313, + MSIOF2_SS1_C_MARK___4 = 1314, + SCK4_A_MARK___5 = 1315, + IP1_7_4_MARK___5 = 1316, + IRQ3_MARK___5 = 1317, + QSTVB_QVE_MARK___5 = 1318, + A25_MARK = 1319, + DU_DOTCLKOUT1_MARK___4 = 1320, + VI4_DATA3_B_MARK___5 = 1321, + PWM4_B_MARK___5 = 1322, + IP2_7_4_MARK___5 = 1323, + A2_MARK___5 = 1324, + LCDOUT18_MARK___5 = 1325, + MSIOF3_SCK_B_MARK___5 = 1326, + VI4_DATA10_MARK___5 = 1327, + DU_DB2_MARK___5 = 1328, + PWM5_A_MARK___5 = 1329, + IP3_7_4_MARK___5 = 1330, + A10_MARK___5 = 1331, + MSIOF2_RXD_A_MARK___5 = 1332, + RTS4_N_B_MARK___4 = 1333, + VI5_HSYNC_N_MARK___4 = 1334, + IP0_11_8_MARK___5 = 1335, + AVB_PHY_INT_MARK___5 = 1336, + MSIOF2_SYNC_C_MARK___4 = 1337, + RX4_A_MARK___5 = 1338, + IP1_11_8_MARK___5 = 1339, + IRQ4_MARK___5 = 1340, + QSTH_QHS_MARK___5 = 1341, + A24_MARK = 1342, + DU_EXHSYNC_DU_HSYNC_MARK___4 = 1343, + VI4_DATA4_B_MARK___5 = 1344, + PWM5_B_MARK___5 = 1345, + IP2_11_8_MARK___5 = 1346, + A3_MARK___5 = 1347, + LCDOUT19_MARK___5 = 1348, + MSIOF3_RXD_B_MARK___5 = 1349, + VI4_DATA11_MARK___5 = 1350, + DU_DB3_MARK___5 = 1351, + PWM6_A_MARK___5 = 1352, + IP3_11_8_MARK___5 = 1353, + A11_MARK___5 = 1354, + TX3_B_MARK___5 = 1355, + MSIOF2_TXD_A_MARK___5 = 1356, + HTX4_B_MARK___5 = 1357, + HSCK4_MARK___4 = 1358, + VI5_FIELD_MARK___4 = 1359, + SCL6_A_MARK___5 = 1360, + AVB_AVTP_CAPTURE_B_MARK___4 = 1361, + PWM2_B_MARK___5 = 1362, + IP0_15_12_MARK___5 = 1363, + AVB_LINK_MARK___5 = 1364, + MSIOF2_SCK_C_MARK___4 = 1365, + TX4_A_MARK___5 = 1366, + IP1_15_12_MARK___5 = 1367, + IRQ5_MARK___5 = 1368, + QSTB_QHE_MARK___5 = 1369, + A23_MARK = 1370, + DU_EXVSYNC_DU_VSYNC_MARK___4 = 1371, + VI4_DATA5_B_MARK___5 = 1372, + PWM6_B_MARK___5 = 1373, + IP2_15_12_MARK___5 = 1374, + A4_MARK___5 = 1375, + LCDOUT20_MARK___5 = 1376, + MSIOF3_SS1_B_MARK___5 = 1377, + VI4_DATA12_MARK___5 = 1378, + VI5_DATA12_MARK___4 = 1379, + DU_DB4_MARK___5 = 1380, + IP3_15_12_MARK___5 = 1381, + A12_MARK___5 = 1382, + LCDOUT12_MARK___5 = 1383, + MSIOF3_SCK_C_MARK___4 = 1384, + HRX4_A_MARK___5 = 1385, + VI5_DATA8_MARK___4 = 1386, + DU_DG4_MARK___5 = 1387, + IP0_19_16_MARK___5 = 1388, + AVB_AVTP_MATCH_A_MARK___4 = 1389, + MSIOF2_RXD_C_MARK___4 = 1390, + CTS4_N_A_MARK___5 = 1391, + IP1_19_16_MARK___5 = 1392, + PWM0_MARK___4 = 1393, + AVB_AVTP_PPS_MARK___5 = 1394, + A22_MARK = 1395, + VI4_DATA6_B_MARK___5 = 1396, + IECLK_B_MARK___4 = 1397, + IP2_19_16_MARK___5 = 1398, + A5_MARK___5 = 1399, + LCDOUT21_MARK___5 = 1400, + MSIOF3_SS2_B_MARK___4 = 1401, + SCK4_B_MARK___5 = 1402, + VI4_DATA13_MARK___5 = 1403, + VI5_DATA13_MARK___4 = 1404, + DU_DB5_MARK___5 = 1405, + IP3_19_16_MARK___5 = 1406, + A13_MARK___5 = 1407, + LCDOUT13_MARK___5 = 1408, + MSIOF3_SYNC_C_MARK___4 = 1409, + HTX4_A_MARK___5 = 1410, + VI5_DATA9_MARK___4 = 1411, + DU_DG5_MARK___5 = 1412, + IP0_23_20_MARK___5 = 1413, + AVB_AVTP_CAPTURE_A_MARK___4 = 1414, + MSIOF2_TXD_C_MARK___4 = 1415, + RTS4_N_A_MARK___5 = 1416, + IP1_23_20_MARK___5 = 1417, + PWM1_A_MARK___5 = 1418, + A21_MARK = 1419, + HRX3_D_MARK___5 = 1420, + VI4_DATA7_B_MARK___5 = 1421, + IERX_B_MARK___4 = 1422, + IP2_23_20_MARK___5 = 1423, + A6_MARK___5 = 1424, + LCDOUT22_MARK___5 = 1425, + MSIOF2_SS1_A_MARK___5 = 1426, + RX4_B_MARK___5 = 1427, + VI4_DATA14_MARK___5 = 1428, + VI5_DATA14_MARK___4 = 1429, + DU_DB6_MARK___5 = 1430, + IP3_23_20_MARK___5 = 1431, + A14_MARK___5 = 1432, + LCDOUT14_MARK___5 = 1433, + MSIOF3_RXD_C_MARK___4 = 1434, + HCTS4_N_MARK___4 = 1435, + VI5_DATA10_MARK___4 = 1436, + DU_DG6_MARK___5 = 1437, + IP0_27_24_MARK___5 = 1438, + IRQ0_MARK___5 = 1439, + QPOLB_MARK___5 = 1440, + DU_CDE_MARK___5 = 1441, + VI4_DATA0_B_MARK___5 = 1442, + CAN0_TX_B_MARK___4 = 1443, + CANFD0_TX_B_MARK___4 = 1444, + IP1_27_24_MARK___5 = 1445, + PWM2_A_MARK___5 = 1446, + A20_MARK = 1447, + HTX3_D_MARK___5 = 1448, + IETX_B_MARK___4 = 1449, + IP2_27_24_MARK___5 = 1450, + A7_MARK___5 = 1451, + LCDOUT23_MARK___5 = 1452, + MSIOF2_SS2_A_MARK___5 = 1453, + TX4_B_MARK___5 = 1454, + VI4_DATA15_MARK___5 = 1455, + VI5_DATA15_MARK___4 = 1456, + DU_DB7_MARK___5 = 1457, + IP3_27_24_MARK___5 = 1458, + A15_MARK___5 = 1459, + LCDOUT15_MARK___5 = 1460, + MSIOF3_TXD_C_MARK___4 = 1461, + HRTS4_N_MARK___4 = 1462, + VI5_DATA11_MARK___4 = 1463, + DU_DG7_MARK___5 = 1464, + IP0_31_28_MARK___5 = 1465, + IRQ1_MARK___5 = 1466, + QPOLA_MARK___5 = 1467, + DU_DISP_MARK___5 = 1468, + VI4_DATA1_B_MARK___5 = 1469, + CAN0_RX_B_MARK___4 = 1470, + CANFD0_RX_B_MARK___4 = 1471, + IP1_31_28_MARK___5 = 1472, + A0_MARK___5 = 1473, + LCDOUT16_MARK___5 = 1474, + MSIOF3_SYNC_B_MARK___5 = 1475, + VI4_DATA8_MARK___5 = 1476, + DU_DB0_MARK___5 = 1477, + PWM3_A_MARK___5 = 1478, + IP2_31_28_MARK___5 = 1479, + A8_MARK___5 = 1480, + RX3_B_MARK___5 = 1481, + MSIOF2_SYNC_A_MARK___5 = 1482, + HRX4_B_MARK___5 = 1483, + SDA6_A_MARK___5 = 1484, + AVB_AVTP_MATCH_B_MARK___4 = 1485, + PWM1_B_MARK___5 = 1486, + IP3_31_28_MARK___5 = 1487, + A16_MARK___5 = 1488, + LCDOUT8_MARK___5 = 1489, + VI4_FIELD_MARK___5 = 1490, + DU_DG0_MARK___5 = 1491, + IP4_3_0_MARK___5 = 1492, + A17_MARK___5 = 1493, + LCDOUT9_MARK___5 = 1494, + VI4_VSYNC_N_MARK___5 = 1495, + DU_DG1_MARK___5 = 1496, + IP5_3_0_MARK___5 = 1497, + WE0_N_MARK___5 = 1498, + MSIOF3_TXD_D_MARK___4 = 1499, + CTS3_N_MARK___4 = 1500, + HCTS3_N_MARK___4 = 1501, + SCL6_B_MARK___5 = 1502, + CAN_CLK_MARK___5 = 1503, + IECLK_A_MARK___4 = 1504, + IP6_3_0_MARK___5 = 1505, + D5_MARK___5 = 1506, + MSIOF2_SYNC_B_MARK___5 = 1507, + VI4_DATA21_MARK___5 = 1508, + VI5_DATA5_MARK___4 = 1509, + IP7_3_0_MARK___5 = 1510, + D13_MARK___5 = 1511, + LCDOUT5_MARK___5 = 1512, + MSIOF2_SS2_D_MARK___4 = 1513, + TX4_C_MARK___5 = 1514, + VI4_DATA5_A_MARK___5 = 1515, + DU_DR5_MARK___5 = 1516, + IP4_7_4_MARK___5 = 1517, + A18_MARK___5 = 1518, + LCDOUT10_MARK___5 = 1519, + VI4_HSYNC_N_MARK___5 = 1520, + DU_DG2_MARK___5 = 1521, + IP5_7_4_MARK___5 = 1522, + WE1_N_MARK___5 = 1523, + MSIOF3_SS1_D_MARK___4 = 1524, + RTS3_N_MARK___4 = 1525, + HRTS3_N_MARK___4 = 1526, + SDA6_B_MARK___5 = 1527, + CAN1_RX_MARK___5 = 1528, + CANFD1_RX_MARK___5 = 1529, + IERX_A_MARK___4 = 1530, + IP6_7_4_MARK___5 = 1531, + D6_MARK___5 = 1532, + MSIOF2_RXD_B_MARK___5 = 1533, + VI4_DATA22_MARK___5 = 1534, + VI5_DATA6_MARK___4 = 1535, + IP7_7_4_MARK___5 = 1536, + D14_MARK___5 = 1537, + LCDOUT6_MARK___5 = 1538, + MSIOF3_SS1_A_MARK___5 = 1539, + HRX3_C_MARK___5 = 1540, + VI4_DATA6_A_MARK___5 = 1541, + DU_DR6_MARK___5 = 1542, + SCL6_C_MARK___4 = 1543, + IP4_11_8_MARK___5 = 1544, + A19_MARK___5 = 1545, + LCDOUT11_MARK___5 = 1546, + VI4_CLKENB_MARK___5 = 1547, + DU_DG3_MARK___5 = 1548, + IP5_11_8_MARK___5 = 1549, + EX_WAIT0_A_MARK___4 = 1550, + QCLK_MARK___5 = 1551, + VI4_CLK_MARK___5 = 1552, + DU_DOTCLKOUT0_MARK___5 = 1553, + IP6_11_8_MARK___5 = 1554, + D7_MARK___5 = 1555, + MSIOF2_TXD_B_MARK___5 = 1556, + VI4_DATA23_MARK___5 = 1557, + VI5_DATA7_MARK___4 = 1558, + IP7_11_8_MARK___5 = 1559, + D15_MARK___5 = 1560, + LCDOUT7_MARK___5 = 1561, + MSIOF3_SS2_A_MARK___5 = 1562, + HTX3_C_MARK___5 = 1563, + VI4_DATA7_A_MARK___5 = 1564, + DU_DR7_MARK___5 = 1565, + SDA6_C_MARK___4 = 1566, + IP4_15_12_MARK___5 = 1567, + CS0_N_MARK___5 = 1568, + VI5_CLKENB_MARK___4 = 1569, + IP5_15_12_MARK___5 = 1570, + D0_MARK___5 = 1571, + MSIOF2_SS1_B_MARK___5 = 1572, + MSIOF3_SCK_A_MARK___5 = 1573, + VI4_DATA16_MARK___5 = 1574, + VI5_DATA0_MARK___4 = 1575, + IP6_15_12_MARK___5 = 1576, + D8_MARK___5 = 1577, + LCDOUT0_MARK___5 = 1578, + MSIOF2_SCK_D_MARK___4 = 1579, + SCK4_C_MARK___4 = 1580, + VI4_DATA0_A_MARK___5 = 1581, + DU_DR0_MARK___5 = 1582, + IP7_15_12_MARK___2 = 1583, + FSCLKST_MARK = 1584, + IP4_19_16_MARK___5 = 1585, + CS1_N_A26_MARK___2 = 1586, + VI5_CLK_MARK___4 = 1587, + EX_WAIT0_B_MARK___4 = 1588, + IP5_19_16_MARK___5 = 1589, + D1_MARK___5 = 1590, + MSIOF2_SS2_B_MARK___5 = 1591, + MSIOF3_SYNC_A_MARK___5 = 1592, + VI4_DATA17_MARK___5 = 1593, + VI5_DATA1_MARK___4 = 1594, + IP6_19_16_MARK___5 = 1595, + D9_MARK___5 = 1596, + LCDOUT1_MARK___5 = 1597, + MSIOF2_SYNC_D_MARK___4 = 1598, + VI4_DATA1_A_MARK___5 = 1599, + DU_DR1_MARK___5 = 1600, + IP7_19_16_MARK___5 = 1601, + SD0_CLK_MARK___5 = 1602, + MSIOF1_SCK_E_MARK___4 = 1603, + STP_OPWM_0_B_MARK___4 = 1604, + IP4_23_20_MARK___5 = 1605, + BS_N_MARK___5 = 1606, + QSTVA_QVS_MARK___5 = 1607, + MSIOF3_SCK_D_MARK___4 = 1608, + SCK3_MARK___4 = 1609, + HSCK3_MARK___4 = 1610, + CAN1_TX_MARK___5 = 1611, + CANFD1_TX_MARK___5 = 1612, + IETX_A_MARK___4 = 1613, + IP5_23_20_MARK___5 = 1614, + D2_MARK___5 = 1615, + MSIOF3_RXD_A_MARK___5 = 1616, + VI4_DATA18_MARK___5 = 1617, + VI5_DATA2_MARK___4 = 1618, + IP6_23_20_MARK___5 = 1619, + D10_MARK___5 = 1620, + LCDOUT2_MARK___5 = 1621, + MSIOF2_RXD_D_MARK___4 = 1622, + HRX3_B_MARK___5 = 1623, + VI4_DATA2_A_MARK___5 = 1624, + CTS4_N_C_MARK___5 = 1625, + DU_DR2_MARK___5 = 1626, + IP7_23_20_MARK___5 = 1627, + SD0_CMD_MARK___5 = 1628, + MSIOF1_SYNC_E_MARK___4 = 1629, + STP_IVCXO27_0_B_MARK___4 = 1630, + IP4_27_24_MARK___5 = 1631, + RD_N_MARK___5 = 1632, + MSIOF3_SYNC_D_MARK___4 = 1633, + RX3_A_MARK___5 = 1634, + HRX3_A_MARK___5 = 1635, + CAN0_TX_A_MARK___4 = 1636, + CANFD0_TX_A_MARK___4 = 1637, + IP5_27_24_MARK___5 = 1638, + D3_MARK___5 = 1639, + MSIOF3_TXD_A_MARK___5 = 1640, + VI4_DATA19_MARK___5 = 1641, + VI5_DATA3_MARK___4 = 1642, + IP6_27_24_MARK___5 = 1643, + D11_MARK___5 = 1644, + LCDOUT3_MARK___5 = 1645, + MSIOF2_TXD_D_MARK___4 = 1646, + HTX3_B_MARK___5 = 1647, + VI4_DATA3_A_MARK___5 = 1648, + RTS4_N_C_MARK___5 = 1649, + DU_DR3_MARK___5 = 1650, + IP7_27_24_MARK___5 = 1651, + SD0_DAT0_MARK___5 = 1652, + MSIOF1_RXD_E_MARK___4 = 1653, + TS_SCK0_B_MARK___4 = 1654, + STP_ISCLK_0_B_MARK___4 = 1655, + IP4_31_28_MARK___5 = 1656, + RD_WR_N_MARK___5 = 1657, + MSIOF3_RXD_D_MARK___4 = 1658, + TX3_A_MARK___5 = 1659, + HTX3_A_MARK___5 = 1660, + CAN0_RX_A_MARK___4 = 1661, + CANFD0_RX_A_MARK___4 = 1662, + IP5_31_28_MARK___5 = 1663, + D4_MARK___5 = 1664, + MSIOF2_SCK_B_MARK___5 = 1665, + VI4_DATA20_MARK___5 = 1666, + VI5_DATA4_MARK___4 = 1667, + IP6_31_28_MARK___5 = 1668, + D12_MARK___5 = 1669, + LCDOUT4_MARK___5 = 1670, + MSIOF2_SS1_D_MARK___4 = 1671, + RX4_C_MARK___5 = 1672, + VI4_DATA4_A_MARK___5 = 1673, + DU_DR4_MARK___5 = 1674, + IP7_31_28_MARK___5 = 1675, + SD0_DAT1_MARK___5 = 1676, + MSIOF1_TXD_E_MARK___4 = 1677, + TS_SPSYNC0_B_MARK___4 = 1678, + STP_ISSYNC_0_B_MARK___4 = 1679, + IP8_3_0_MARK___5 = 1680, + SD0_DAT2_MARK___5 = 1681, + MSIOF1_SS1_E_MARK___4 = 1682, + TS_SDAT0_B_MARK___4 = 1683, + STP_ISD_0_B_MARK___4 = 1684, + IP9_3_0_MARK___5 = 1685, + SD2_CLK_MARK___4 = 1686, + IP10_3_0_MARK___5 = 1687, + SD3_DAT6_MARK___5 = 1688, + SD3_CD_MARK___5 = 1689, + IP11_3_0_MARK___5 = 1690, + TX0_MARK___4 = 1691, + HTX1_B_MARK___5 = 1692, + TS_SPSYNC0_C_MARK___4 = 1693, + STP_ISSYNC_0_C_MARK___4 = 1694, + RIF0_D1_B_MARK___5 = 1695, + IP8_7_4_MARK___5 = 1696, + SD0_DAT3_MARK___5 = 1697, + MSIOF1_SS2_E_MARK___4 = 1698, + TS_SDEN0_B_MARK___4 = 1699, + STP_ISEN_0_B_MARK___4 = 1700, + IP9_7_4_MARK___5 = 1701, + SD2_DAT0_MARK___4 = 1702, + IP10_7_4_MARK___5 = 1703, + SD3_DAT7_MARK___5 = 1704, + SD3_WP_MARK___5 = 1705, + IP11_7_4_MARK___5 = 1706, + CTS0_N_MARK___4 = 1707, + HCTS1_N_B_MARK___5 = 1708, + MSIOF1_SYNC_B_MARK___4 = 1709, + TS_SPSYNC1_C_MARK___4 = 1710, + STP_ISSYNC_1_C_MARK___4 = 1711, + RIF1_SYNC_B_MARK___4 = 1712, + AUDIO_CLKOUT_C_MARK___4 = 1713, + ADICS_SAMP_MARK___4 = 1714, + IP8_11_8_MARK___5 = 1715, + SD1_CLK_MARK___5 = 1716, + MSIOF1_SCK_G_MARK___4 = 1717, + SIM0_CLK_A_MARK___5 = 1718, + IP9_11_8_MARK___5 = 1719, + SD2_DAT1_MARK___4 = 1720, + IP10_11_8_MARK___5 = 1721, + SD0_CD_MARK___5 = 1722, + SCL2_B_MARK___5 = 1723, + SIM0_RST_A_MARK___5 = 1724, + IP11_11_8_MARK___5 = 1725, + RTS0_N_MARK___4 = 1726, + HRTS1_N_B_MARK___5 = 1727, + MSIOF1_SS1_B_MARK___4 = 1728, + AUDIO_CLKA_B_MARK___4 = 1729, + SCL2_A_MARK___5 = 1730, + STP_IVCXO27_1_C_MARK___4 = 1731, + RIF0_SYNC_B_MARK___5 = 1732, + ADICHS1_MARK___4 = 1733, + IP8_15_12_MARK___5 = 1734, + SD1_CMD_MARK___5 = 1735, + MSIOF1_SYNC_G_MARK___4 = 1736, + SIM0_D_A_MARK___5 = 1737, + STP_IVCXO27_1_B_MARK___4 = 1738, + IP9_15_12_MARK___5 = 1739, + SD2_DAT2_MARK___4 = 1740, + IP10_15_12_MARK___5 = 1741, + SD0_WP_MARK___5 = 1742, + SDA2_B_MARK___5 = 1743, + IP11_15_12_MARK___5 = 1744, + RX1_A_MARK___4 = 1745, + HRX1_A_MARK___5 = 1746, + TS_SDAT0_C_MARK___4 = 1747, + STP_ISD_0_C_MARK___4 = 1748, + RIF1_CLK_C_MARK___4 = 1749, + IP8_19_16_MARK___5 = 1750, + SD1_DAT0_MARK___5 = 1751, + SD2_DAT4_MARK___4 = 1752, + MSIOF1_RXD_G_MARK___4 = 1753, + TS_SCK1_B_MARK___4 = 1754, + STP_ISCLK_1_B_MARK___4 = 1755, + IP9_19_16_MARK___5 = 1756, + SD2_DAT3_MARK___4 = 1757, + IP10_19_16_MARK___5 = 1758, + SD1_CD_MARK___5 = 1759, + SIM0_CLK_B_MARK___5 = 1760, + IP11_19_16_MARK___5 = 1761, + TX1_A_MARK___4 = 1762, + HTX1_A_MARK___5 = 1763, + TS_SDEN0_C_MARK___4 = 1764, + STP_ISEN_0_C_MARK___4 = 1765, + RIF1_D0_C_MARK___4 = 1766, + IP8_23_20_MARK___5 = 1767, + SD1_DAT1_MARK___5 = 1768, + SD2_DAT5_MARK___4 = 1769, + MSIOF1_TXD_G_MARK___4 = 1770, + TS_SPSYNC1_B_MARK___4 = 1771, + STP_ISSYNC_1_B_MARK___4 = 1772, + IP9_23_20_MARK___5 = 1773, + SD2_DS_MARK___4 = 1774, + SATA_DEVSLP_B_MARK___3 = 1775, + IP10_23_20_MARK___5 = 1776, + SD1_WP_MARK___5 = 1777, + SIM0_D_B_MARK___5 = 1778, + IP11_23_20_MARK___5 = 1779, + CTS1_N_MARK___5 = 1780, + HCTS1_N_A_MARK___4 = 1781, + MSIOF1_RXD_B_MARK___4 = 1782, + TS_SDEN1_C_MARK___4 = 1783, + STP_ISEN_1_C_MARK___4 = 1784, + RIF1_D0_B_MARK___4 = 1785, + ADIDATA_MARK___4 = 1786, + IP8_27_24_MARK___5 = 1787, + SD1_DAT2_MARK___5 = 1788, + SD2_DAT6_MARK___4 = 1789, + MSIOF1_SS1_G_MARK___4 = 1790, + TS_SDAT1_B_MARK___4 = 1791, + STP_ISD_1_B_MARK___4 = 1792, + IP9_27_24_MARK___5 = 1793, + SD3_DAT4_MARK___5 = 1794, + SD2_CD_A_MARK___4 = 1795, + IP10_27_24_MARK___5 = 1796, + SCK0_MARK___4 = 1797, + HSCK1_B_MARK___5 = 1798, + MSIOF1_SS2_B_MARK___4 = 1799, + AUDIO_CLKC_B_MARK___5 = 1800, + SDA2_A_MARK___5 = 1801, + SIM0_RST_B_MARK___5 = 1802, + STP_OPWM_0_C_MARK___4 = 1803, + RIF0_CLK_B_MARK___5 = 1804, + ADICHS2_MARK___4 = 1805, + IP11_27_24_MARK___5 = 1806, + RTS1_N_MARK___5 = 1807, + HRTS1_N_A_MARK___4 = 1808, + MSIOF1_TXD_B_MARK___4 = 1809, + TS_SDAT1_C_MARK___4 = 1810, + STP_ISD_1_C_MARK___4 = 1811, + RIF1_D1_B_MARK___4 = 1812, + ADICHS0_MARK___4 = 1813, + IP8_31_28_MARK___5 = 1814, + SD1_DAT3_MARK___5 = 1815, + SD2_DAT7_MARK___4 = 1816, + MSIOF1_SS2_G_MARK___4 = 1817, + TS_SDEN1_B_MARK___4 = 1818, + STP_ISEN_1_B_MARK___4 = 1819, + IP9_31_28_MARK___5 = 1820, + SD3_DAT5_MARK___5 = 1821, + SD2_WP_A_MARK___4 = 1822, + IP10_31_28_MARK___5 = 1823, + RX0_MARK___4 = 1824, + HRX1_B_MARK___5 = 1825, + TS_SCK0_C_MARK___4 = 1826, + STP_ISCLK_0_C_MARK___4 = 1827, + RIF0_D0_B_MARK___5 = 1828, + IP11_31_28_MARK___5 = 1829, + SCK2_MARK___4 = 1830, + SCIF_CLK_B_MARK___5 = 1831, + MSIOF1_SCK_B_MARK___4 = 1832, + TS_SCK1_C_MARK___4 = 1833, + STP_ISCLK_1_C_MARK___4 = 1834, + RIF1_CLK_B_MARK___4 = 1835, + ADICLK_MARK___4 = 1836, + IP12_3_0_MARK___5 = 1837, + TX2_A_MARK___5 = 1838, + SD2_CD_B_MARK___4 = 1839, + SCL1_A_MARK___5 = 1840, + FMCLK_A_MARK___5 = 1841, + RIF1_D1_C_MARK___4 = 1842, + FSO_CFE_0_B_MARK = 1843, + IP13_3_0_MARK___5 = 1844, + MSIOF0_SS1_MARK___5 = 1845, + RX5_MARK = 1846, + AUDIO_CLKA_C_MARK___4 = 1847, + SSI_SCK2_A_MARK___5 = 1848, + STP_IVCXO27_0_C_MARK___4 = 1849, + AUDIO_CLKOUT3_A_MARK___5 = 1850, + TCLK1_B_MARK___5 = 1851, + IP14_3_0_MARK___5 = 1852, + SSI_SDATA1_A_MARK___4 = 1853, + IP15_3_0_MARK___5 = 1854, + SSI_SCK6_MARK___5 = 1855, + USB2_PWEN_MARK___2 = 1856, + SIM0_RST_D_MARK___4 = 1857, + IP12_7_4_MARK___5 = 1858, + RX2_A_MARK___5 = 1859, + SD2_WP_B_MARK___4 = 1860, + SDA1_A_MARK___5 = 1861, + FMIN_A_MARK___5 = 1862, + RIF1_SYNC_C_MARK___4 = 1863, + FSO_CFE_1_B_MARK = 1864, + IP13_7_4_MARK___5 = 1865, + MSIOF0_SS2_MARK___5 = 1866, + TX5_MARK = 1867, + MSIOF1_SS2_D_MARK___4 = 1868, + AUDIO_CLKC_A_MARK___5 = 1869, + SSI_WS2_A_MARK___5 = 1870, + STP_OPWM_0_D_MARK___4 = 1871, + AUDIO_CLKOUT_D_MARK___4 = 1872, + SPEEDIN_B_MARK___5 = 1873, + IP14_7_4_MARK___5 = 1874, + SSI_SDATA2_A_MARK___4 = 1875, + SSI_SCK1_B_MARK___4 = 1876, + IP15_7_4_MARK___5 = 1877, + SSI_WS6_MARK___5 = 1878, + USB2_OVC_MARK___2 = 1879, + SIM0_D_D_MARK___4 = 1880, + IP12_11_8_MARK___5 = 1881, + HSCK0_MARK___4 = 1882, + MSIOF1_SCK_D_MARK___4 = 1883, + AUDIO_CLKB_A_MARK___5 = 1884, + SSI_SDATA1_B_MARK___4 = 1885, + TS_SCK0_D_MARK___4 = 1886, + STP_ISCLK_0_D_MARK___4 = 1887, + RIF0_CLK_C_MARK___4 = 1888, + IP13_11_8_MARK___5 = 1889, + MLB_CLK_MARK___5 = 1890, + MSIOF1_SCK_F_MARK___4 = 1891, + SCL1_B_MARK___5 = 1892, + IP14_11_8_MARK___5 = 1893, + SSI_SCK349_MARK___5 = 1894, + MSIOF1_SS1_A_MARK___4 = 1895, + STP_OPWM_0_A_MARK___4 = 1896, + IP15_11_8_MARK___5 = 1897, + SSI_SDATA6_MARK___5 = 1898, + SIM0_CLK_D_MARK___4 = 1899, + SATA_DEVSLP_A_MARK___3 = 1900, + IP12_15_12_MARK___5 = 1901, + HRX0_MARK___4 = 1902, + MSIOF1_RXD_D_MARK___4 = 1903, + SSI_SDATA2_B_MARK___4 = 1904, + TS_SDEN0_D_MARK___4 = 1905, + STP_ISEN_0_D_MARK___4 = 1906, + RIF0_D0_C_MARK___4 = 1907, + IP13_15_12_MARK___5 = 1908, + MLB_SIG_MARK___5 = 1909, + RX1_B_MARK___4 = 1910, + MSIOF1_SYNC_F_MARK___4 = 1911, + SDA1_B_MARK___5 = 1912, + IP14_15_12_MARK___5 = 1913, + SSI_WS349_MARK___5 = 1914, + HCTS2_N_A_MARK___5 = 1915, + MSIOF1_SS2_A_MARK___4 = 1916, + STP_IVCXO27_0_A_MARK___4 = 1917, + IP15_15_12_MARK___5 = 1918, + SSI_SCK78_MARK___5 = 1919, + HRX2_B_MARK___5 = 1920, + MSIOF1_SCK_C_MARK___4 = 1921, + TS_SCK1_A_MARK___4 = 1922, + STP_ISCLK_1_A_MARK___4 = 1923, + RIF1_CLK_A_MARK___4 = 1924, + RIF3_CLK_A_MARK___5 = 1925, + IP12_19_16_MARK___5 = 1926, + HTX0_MARK___4 = 1927, + MSIOF1_TXD_D_MARK___4 = 1928, + SSI_SDATA9_B_MARK___4 = 1929, + TS_SDAT0_D_MARK___4 = 1930, + STP_ISD_0_D_MARK___4 = 1931, + RIF0_D1_C_MARK___4 = 1932, + IP13_19_16_MARK___5 = 1933, + MLB_DAT_MARK___5 = 1934, + TX1_B_MARK___4 = 1935, + MSIOF1_RXD_F_MARK___4 = 1936, + IP14_19_16_MARK___5 = 1937, + SSI_SDATA3_MARK___5 = 1938, + HRTS2_N_A_MARK___5 = 1939, + MSIOF1_TXD_A_MARK___4 = 1940, + TS_SCK0_A_MARK___4 = 1941, + STP_ISCLK_0_A_MARK___4 = 1942, + RIF0_D1_A_MARK___5 = 1943, + RIF2_D0_A_MARK___5 = 1944, + IP15_19_16_MARK___5 = 1945, + SSI_WS78_MARK___5 = 1946, + HTX2_B_MARK___5 = 1947, + MSIOF1_SYNC_C_MARK___4 = 1948, + TS_SDAT1_A_MARK___4 = 1949, + STP_ISD_1_A_MARK___4 = 1950, + RIF1_SYNC_A_MARK___4 = 1951, + RIF3_SYNC_A_MARK___5 = 1952, + IP12_23_20_MARK___5 = 1953, + HCTS0_N_MARK___4 = 1954, + RX2_B_MARK___5 = 1955, + MSIOF1_SYNC_D_MARK___4 = 1956, + SSI_SCK9_A_MARK___5 = 1957, + TS_SPSYNC0_D_MARK___4 = 1958, + STP_ISSYNC_0_D_MARK___4 = 1959, + RIF0_SYNC_C_MARK___4 = 1960, + AUDIO_CLKOUT1_A_MARK___5 = 1961, + IP13_23_20_MARK___5 = 1962, + SSI_SCK01239_MARK___5 = 1963, + MSIOF1_TXD_F_MARK___4 = 1964, + IP14_23_20_MARK___5 = 1965, + SSI_SCK4_MARK___5 = 1966, + HRX2_A_MARK___5 = 1967, + MSIOF1_SCK_A_MARK___4 = 1968, + TS_SDAT0_A_MARK___4 = 1969, + STP_ISD_0_A_MARK___4 = 1970, + RIF0_CLK_A_MARK___5 = 1971, + RIF2_CLK_A_MARK___5 = 1972, + IP15_23_20_MARK___5 = 1973, + SSI_SDATA7_MARK___5 = 1974, + HCTS2_N_B_MARK___4 = 1975, + MSIOF1_RXD_C_MARK___4 = 1976, + TS_SDEN1_A_MARK___4 = 1977, + STP_ISEN_1_A_MARK___4 = 1978, + RIF1_D0_A_MARK___4 = 1979, + RIF3_D0_A_MARK___5 = 1980, + TCLK2_A_MARK___5 = 1981, + IP12_27_24_MARK___5 = 1982, + HRTS0_N_MARK___4 = 1983, + TX2_B_MARK___5 = 1984, + MSIOF1_SS1_D_MARK___4 = 1985, + SSI_WS9_A_MARK___5 = 1986, + STP_IVCXO27_0_D_MARK___4 = 1987, + BPFCLK_A_MARK___5 = 1988, + AUDIO_CLKOUT2_A_MARK___5 = 1989, + IP13_27_24_MARK___5 = 1990, + SSI_WS01239_MARK___5 = 1991, + MSIOF1_SS1_F_MARK___4 = 1992, + IP14_27_24_MARK___5 = 1993, + SSI_WS4_MARK___5 = 1994, + HTX2_A_MARK___5 = 1995, + MSIOF1_SYNC_A_MARK___4 = 1996, + TS_SDEN0_A_MARK___4 = 1997, + STP_ISEN_0_A_MARK___4 = 1998, + RIF0_SYNC_A_MARK___5 = 1999, + RIF2_SYNC_A_MARK___5 = 2000, + IP15_27_24_MARK___5 = 2001, + SSI_SDATA8_MARK___5 = 2002, + HRTS2_N_B_MARK___4 = 2003, + MSIOF1_TXD_C_MARK___4 = 2004, + TS_SPSYNC1_A_MARK___4 = 2005, + STP_ISSYNC_1_A_MARK___4 = 2006, + RIF1_D1_A_MARK___4 = 2007, + RIF3_D1_A_MARK___5 = 2008, + IP12_31_28_MARK___5 = 2009, + MSIOF0_SYNC_MARK___5 = 2010, + AUDIO_CLKOUT_A_MARK___5 = 2011, + IP13_31_28_MARK___5 = 2012, + SSI_SDATA0_MARK___5 = 2013, + MSIOF1_SS2_F_MARK___4 = 2014, + IP14_31_28_MARK___5 = 2015, + SSI_SDATA4_MARK___5 = 2016, + HSCK2_A_MARK___5 = 2017, + MSIOF1_RXD_A_MARK___4 = 2018, + TS_SPSYNC0_A_MARK___4 = 2019, + STP_ISSYNC_0_A_MARK___4 = 2020, + RIF0_D0_A_MARK___5 = 2021, + RIF2_D1_A_MARK___5 = 2022, + IP15_31_28_MARK___5 = 2023, + SSI_SDATA9_A_MARK___4 = 2024, + HSCK2_B_MARK___4 = 2025, + MSIOF1_SS1_C_MARK___4 = 2026, + HSCK1_A_MARK___5 = 2027, + SSI_WS1_B_MARK___4 = 2028, + SCK1_MARK___5 = 2029, + STP_IVCXO27_1_A_MARK___4 = 2030, + SCK5_MARK = 2031, + IP16_3_0_MARK___4 = 2032, + AUDIO_CLKA_A_MARK___4 = 2033, + IP17_3_0_MARK___4 = 2034, + USB31_PWEN_MARK = 2035, + AUDIO_CLKOUT2_B_MARK___5 = 2036, + SSI_SCK9_B_MARK___5 = 2037, + TS_SDEN0_E_MARK___4 = 2038, + STP_ISEN_0_E_MARK___4 = 2039, + RIF2_D0_B_MARK___5 = 2040, + TPU0TO2_MARK___5 = 2041, + IP16_7_4_MARK___4 = 2042, + AUDIO_CLKB_B_MARK___5 = 2043, + SCIF_CLK_A_MARK___5 = 2044, + STP_IVCXO27_1_D_MARK___4 = 2045, + REMOCON_A_MARK___5 = 2046, + TCLK1_A_MARK___5 = 2047, + IP17_7_4_MARK___4 = 2048, + USB31_OVC_MARK = 2049, + AUDIO_CLKOUT3_B_MARK___5 = 2050, + SSI_WS9_B_MARK___5 = 2051, + TS_SPSYNC0_E_MARK___4 = 2052, + STP_ISSYNC_0_E_MARK___4 = 2053, + RIF2_D1_B_MARK___5 = 2054, + TPU0TO3_MARK___5 = 2055, + IP16_11_8_MARK___4 = 2056, + USB0_PWEN_MARK___4 = 2057, + SIM0_RST_C_MARK___4 = 2058, + TS_SCK1_D_MARK___4 = 2059, + STP_ISCLK_1_D_MARK___4 = 2060, + BPFCLK_B_MARK___5 = 2061, + RIF3_CLK_B_MARK___5 = 2062, + IP16_15_12_MARK___4 = 2063, + USB0_OVC_MARK___4 = 2064, + SIM0_D_C_MARK___4 = 2065, + TS_SDAT1_D_MARK___4 = 2066, + STP_ISD_1_D_MARK___4 = 2067, + RIF3_SYNC_B_MARK___5 = 2068, + IP16_19_16_MARK___4 = 2069, + USB1_PWEN_MARK___4 = 2070, + SIM0_CLK_C_MARK___4 = 2071, + SSI_SCK1_A_MARK___4 = 2072, + TS_SCK0_E_MARK___4 = 2073, + STP_ISCLK_0_E_MARK___4 = 2074, + FMCLK_B_MARK___5 = 2075, + RIF2_CLK_B_MARK___5 = 2076, + SPEEDIN_A_MARK___5 = 2077, + IP16_23_20_MARK___4 = 2078, + USB1_OVC_MARK___4 = 2079, + MSIOF1_SS2_C_MARK___4 = 2080, + SSI_WS1_A_MARK___4 = 2081, + TS_SDAT0_E_MARK___4 = 2082, + STP_ISD_0_E_MARK___4 = 2083, + FMIN_B_MARK___5 = 2084, + RIF2_SYNC_B_MARK___5 = 2085, + REMOCON_B_MARK___5 = 2086, + IP16_27_24_MARK___4 = 2087, + USB30_PWEN_MARK___5 = 2088, + AUDIO_CLKOUT_B_MARK___5 = 2089, + SSI_SCK2_B_MARK___5 = 2090, + TS_SDEN1_D_MARK___4 = 2091, + STP_ISEN_1_D_MARK___4 = 2092, + STP_OPWM_0_E_MARK___4 = 2093, + RIF3_D0_B_MARK___5 = 2094, + TCLK2_B_MARK___5 = 2095, + TPU0TO0_MARK___5 = 2096, + IP16_31_28_MARK___4 = 2097, + USB30_OVC_MARK___5 = 2098, + AUDIO_CLKOUT1_B_MARK___5 = 2099, + SSI_WS2_B_MARK___5 = 2100, + TS_SPSYNC1_D_MARK___4 = 2101, + STP_ISSYNC_1_D_MARK___4 = 2102, + STP_IVCXO27_0_E_MARK___4 = 2103, + RIF3_D1_B_MARK___5 = 2104, + FSO_TOE_B_MARK = 2105, + TPU0TO1_MARK___5 = 2106, + SEL_TSIF1_0_MARK___4 = 2107, + SEL_TSIF1_1_MARK___4 = 2108, + SEL_TSIF1_2_MARK___4 = 2109, + SEL_TSIF1_3_MARK___4 = 2110, + I2C_SEL_5_0_MARK___4 = 2111, + I2C_SEL_5_1_MARK___4 = 2112, + SEL_MSIOF3_0_MARK___5 = 2113, + SEL_MSIOF3_1_MARK___5 = 2114, + SEL_MSIOF3_2_MARK___4 = 2115, + SEL_MSIOF3_3_MARK___4 = 2116, + I2C_SEL_3_0_MARK___4 = 2117, + I2C_SEL_3_1_MARK___4 = 2118, + SEL_TSIF0_0_MARK___4 = 2119, + SEL_TSIF0_1_MARK___4 = 2120, + SEL_TSIF0_2_MARK___4 = 2121, + SEL_TSIF0_3_MARK___4 = 2122, + SEL_TSIF0_4_MARK___4 = 2123, + I2C_SEL_0_0_MARK___4 = 2124, + I2C_SEL_0_1_MARK___4 = 2125, + SEL_MSIOF2_0_MARK___5 = 2126, + SEL_MSIOF2_1_MARK___5 = 2127, + SEL_MSIOF2_2_MARK___4 = 2128, + SEL_MSIOF2_3_MARK___4 = 2129, + SEL_MSIOF1_0_MARK___4 = 2130, + SEL_MSIOF1_1_MARK___4 = 2131, + SEL_MSIOF1_2_MARK___4 = 2132, + SEL_MSIOF1_3_MARK___4 = 2133, + SEL_MSIOF1_4_MARK___4 = 2134, + SEL_MSIOF1_5_MARK___4 = 2135, + SEL_MSIOF1_6_MARK___4 = 2136, + SEL_TIMER_TMU_0_MARK___4 = 2137, + SEL_TIMER_TMU_1_MARK___4 = 2138, + SEL_SSP1_1_0_MARK___4 = 2139, + SEL_SSP1_1_1_MARK___4 = 2140, + SEL_SSP1_1_2_MARK___4 = 2141, + SEL_SSP1_1_3_MARK___4 = 2142, + SEL_LBSC_0_MARK___4 = 2143, + SEL_LBSC_1_MARK___4 = 2144, + SEL_SSP1_0_0_MARK___4 = 2145, + SEL_SSP1_0_1_MARK___4 = 2146, + SEL_SSP1_0_2_MARK___4 = 2147, + SEL_SSP1_0_3_MARK___4 = 2148, + SEL_SSP1_0_4_MARK___4 = 2149, + SEL_IEBUS_0_MARK___4 = 2150, + SEL_IEBUS_1_MARK___4 = 2151, + SEL_I2C6_0_MARK___5 = 2152, + SEL_I2C6_1_MARK___5 = 2153, + SEL_I2C6_2_MARK___4 = 2154, + SEL_SSI_0_MARK = 2155, + SEL_SSI_1_MARK = 2156, + SEL_I2C2_0_MARK___5 = 2157, + SEL_I2C2_1_MARK___5 = 2158, + SEL_SPEED_PULSE_0_MARK___4 = 2159, + SEL_SPEED_PULSE_1_MARK___4 = 2160, + SEL_I2C1_0_MARK___5 = 2161, + SEL_I2C1_1_MARK___5 = 2162, + SEL_SIMCARD_0_MARK___5 = 2163, + SEL_SIMCARD_1_MARK___5 = 2164, + SEL_SIMCARD_2_MARK___4 = 2165, + SEL_SIMCARD_3_MARK___4 = 2166, + SEL_HSCIF4_0_MARK___5 = 2167, + SEL_HSCIF4_1_MARK___5 = 2168, + SEL_HSCIF3_0_MARK___5 = 2169, + SEL_HSCIF3_1_MARK___5 = 2170, + SEL_HSCIF3_2_MARK___5 = 2171, + SEL_HSCIF3_3_MARK___5 = 2172, + SEL_SDHI2_0_MARK___4 = 2173, + SEL_SDHI2_1_MARK___4 = 2174, + SEL_SCIF4_0_MARK___5 = 2175, + SEL_SCIF4_1_MARK___5 = 2176, + SEL_SCIF4_2_MARK___5 = 2177, + SEL_HSCIF2_0_MARK___5 = 2178, + SEL_HSCIF2_1_MARK___5 = 2179, + SEL_HSCIF1_0_MARK___5 = 2180, + SEL_HSCIF1_1_MARK___5 = 2181, + SEL_SCIF3_0_MARK___5 = 2182, + SEL_SCIF3_1_MARK___5 = 2183, + SEL_FSO_0_MARK___2 = 2184, + SEL_FSO_1_MARK___2 = 2185, + SEL_SCIF2_0_MARK___5 = 2186, + SEL_SCIF2_1_MARK___5 = 2187, + SEL_FM_0_MARK___5 = 2188, + SEL_FM_1_MARK___5 = 2189, + SEL_SCIF1_0_MARK___4 = 2190, + SEL_SCIF1_1_MARK___4 = 2191, + SEL_ETHERAVB_0_MARK___4 = 2192, + SEL_ETHERAVB_1_MARK___4 = 2193, + SEL_SATA_0_MARK = 2194, + SEL_SATA_1_MARK = 2195, + SEL_DRIF3_0_MARK___5 = 2196, + SEL_DRIF3_1_MARK___5 = 2197, + SEL_REMOCON_0_MARK___5 = 2198, + SEL_REMOCON_1_MARK___5 = 2199, + SEL_DRIF2_0_MARK___5 = 2200, + SEL_DRIF2_1_MARK___5 = 2201, + SEL_DRIF1_0_MARK___4 = 2202, + SEL_DRIF1_1_MARK___4 = 2203, + SEL_DRIF1_2_MARK___4 = 2204, + SEL_RCAN0_0_MARK___4 = 2205, + SEL_RCAN0_1_MARK___4 = 2206, + SEL_DRIF0_0_MARK___5 = 2207, + SEL_DRIF0_1_MARK___5 = 2208, + SEL_DRIF0_2_MARK___4 = 2209, + SEL_PWM6_0_MARK___5 = 2210, + SEL_PWM6_1_MARK___5 = 2211, + SEL_PWM5_0_MARK___5 = 2212, + SEL_PWM5_1_MARK___5 = 2213, + SEL_CANFD0_0_MARK___4 = 2214, + SEL_CANFD0_1_MARK___4 = 2215, + SEL_PWM4_0_MARK___5 = 2216, + SEL_PWM4_1_MARK___5 = 2217, + SEL_ADG_0_MARK = 2218, + SEL_ADG_1_MARK = 2219, + SEL_ADG_2_MARK = 2220, + SEL_ADG_3_MARK = 2221, + SEL_PWM3_0_MARK___5 = 2222, + SEL_PWM3_1_MARK___5 = 2223, + SEL_PWM2_0_MARK___5 = 2224, + SEL_PWM2_1_MARK___5 = 2225, + SEL_PWM1_0_MARK___5 = 2226, + SEL_PWM1_1_MARK___5 = 2227, + SEL_VIN4_0_MARK___5 = 2228, + SEL_VIN4_1_MARK___5 = 2229, + QSPI0_SPCLK_MARK___5 = 2230, + QSPI0_SSL_MARK___5 = 2231, + QSPI0_MOSI_IO0_MARK___5 = 2232, + QSPI0_MISO_IO1_MARK___5 = 2233, + QSPI0_IO2_MARK___5 = 2234, + QSPI0_IO3_MARK___5 = 2235, + QSPI1_SPCLK_MARK___5 = 2236, + QSPI1_SSL_MARK___5 = 2237, + QSPI1_MOSI_IO0_MARK___5 = 2238, + QSPI1_MISO_IO1_MARK___5 = 2239, + QSPI1_IO2_MARK___5 = 2240, + QSPI1_IO3_MARK___5 = 2241, + RPC_INT_MARK___4 = 2242, + RPC_WP_MARK___4 = 2243, + RPC_RESET_MARK___4 = 2244, + AVB_TX_CTL_MARK___5 = 2245, + AVB_TXC_MARK___5 = 2246, + AVB_TD0_MARK___5 = 2247, + AVB_TD1_MARK___5 = 2248, + AVB_TD2_MARK___5 = 2249, + AVB_TD3_MARK___5 = 2250, + AVB_RX_CTL_MARK___5 = 2251, + AVB_RXC_MARK___5 = 2252, + AVB_RD0_MARK___5 = 2253, + AVB_RD1_MARK___5 = 2254, + AVB_RD2_MARK___5 = 2255, + AVB_RD3_MARK___5 = 2256, + AVB_TXCREFCLK_MARK___5 = 2257, + AVB_MDIO_MARK___5 = 2258, + CLKOUT_MARK___5 = 2259, + PRESETOUT_MARK___4 = 2260, + DU_DOTCLKIN0_MARK___5 = 2261, + DU_DOTCLKIN1_MARK___5 = 2262, + DU_DOTCLKIN2_MARK___3 = 2263, + DU_DOTCLKIN3_MARK___3 = 2264, + TMS_MARK___5 = 2265, + TDO_MARK___4 = 2266, + ASEBRK_MARK___5 = 2267, + MLB_REF_MARK___5 = 2268, + TDI_MARK___5 = 2269, + TCK_MARK___5 = 2270, + TRST_MARK___4 = 2271, + EXTALR_MARK___4 = 2272, + SCL0_MARK___4 = 2273, + SDA0_MARK___4 = 2274, + SCL3_MARK___4 = 2275, + SDA3_MARK___4 = 2276, + SCL5_MARK___5 = 2277, + SDA5_MARK___5 = 2278, + PINMUX_MARK_END___5 = 2279, +}; + +enum { + GP_LAST___5 = 227, + PIN_ASEBRK___5 = 228, + PIN_AVB_MDIO___5 = 229, + PIN_AVB_RD0___4 = 230, + PIN_AVB_RD1___4 = 231, + PIN_AVB_RD2___4 = 232, + PIN_AVB_RD3___4 = 233, + PIN_AVB_RXC___4 = 234, + PIN_AVB_RX_CTL___4 = 235, + PIN_AVB_TD0___5 = 236, + PIN_AVB_TD1___5 = 237, + PIN_AVB_TD2___5 = 238, + PIN_AVB_TD3___5 = 239, + PIN_AVB_TXC___5 = 240, + PIN_AVB_TXCREFCLK___4 = 241, + PIN_AVB_TX_CTL___5 = 242, + PIN_CLKOUT = 243, + PIN_DU_DOTCLKIN0___4 = 244, + PIN_DU_DOTCLKIN1___4 = 245, + PIN_DU_DOTCLKIN2___3 = 246, + PIN_DU_DOTCLKIN3___3 = 247, + PIN_EXTALR___4 = 248, + PIN_FSCLKST_N___3 = 249, + PIN_MLB_REF___5 = 250, + PIN_PRESETOUT_N___5 = 251, + PIN_QSPI0_IO2___4 = 252, + PIN_QSPI0_IO3___4 = 253, + PIN_QSPI0_MISO_IO1___4 = 254, + PIN_QSPI0_MOSI_IO0___4 = 255, + PIN_QSPI0_SPCLK___4 = 256, + PIN_QSPI0_SSL___4 = 257, + PIN_QSPI1_IO2___4 = 258, + PIN_QSPI1_IO3___4 = 259, + PIN_QSPI1_MISO_IO1___4 = 260, + PIN_QSPI1_MOSI_IO0___4 = 261, + PIN_QSPI1_SPCLK___4 = 262, + PIN_QSPI1_SSL___4 = 263, + PIN_RPC_INT_N___4 = 264, + PIN_RPC_RESET_N___4 = 265, + PIN_RPC_WP_N___4 = 266, + PIN_TCK___5 = 267, + PIN_TDI___5 = 268, + PIN_TDO___4 = 269, + PIN_TMS___5 = 270, + PIN_TRST_N___5 = 271, +}; + +union vin_data12 { + unsigned int data12[12]; + unsigned int data10[10]; + unsigned int data8[8]; +}; + +enum { + PINMUX_RESERVED___6 = 0, + PINMUX_DATA_BEGIN___6 = 1, + GP_0_0_DATA___6 = 2, + GP_0_1_DATA___6 = 3, + GP_0_2_DATA___6 = 4, + GP_0_3_DATA___6 = 5, + GP_0_4_DATA___6 = 6, + GP_0_5_DATA___6 = 7, + GP_0_6_DATA___6 = 8, + GP_0_7_DATA___6 = 9, + GP_0_8_DATA___6 = 10, + GP_0_9_DATA___6 = 11, + GP_0_10_DATA___6 = 12, + GP_0_11_DATA___6 = 13, + GP_0_12_DATA___6 = 14, + GP_0_13_DATA___6 = 15, + GP_0_14_DATA___6 = 16, + GP_0_15_DATA___6 = 17, + GP_0_16_DATA___2 = 18, + GP_0_17_DATA___2 = 19, + GP_0_18_DATA = 20, + GP_0_19_DATA = 21, + GP_0_20_DATA = 22, + GP_0_21_DATA = 23, + GP_1_0_DATA___6 = 24, + GP_1_1_DATA___6 = 25, + GP_1_2_DATA___6 = 26, + GP_1_3_DATA___6 = 27, + GP_1_4_DATA___6 = 28, + GP_1_5_DATA___6 = 29, + GP_1_6_DATA___6 = 30, + GP_1_7_DATA___6 = 31, + GP_1_8_DATA___6 = 32, + GP_1_9_DATA___6 = 33, + GP_1_10_DATA___6 = 34, + GP_1_11_DATA___6 = 35, + GP_1_12_DATA___6 = 36, + GP_1_13_DATA___6 = 37, + GP_1_14_DATA___6 = 38, + GP_1_15_DATA___6 = 39, + GP_1_16_DATA___6 = 40, + GP_1_17_DATA___6 = 41, + GP_1_18_DATA___6 = 42, + GP_1_19_DATA___6 = 43, + GP_1_20_DATA___6 = 44, + GP_1_21_DATA___6 = 45, + GP_1_22_DATA___6 = 46, + GP_1_23_DATA___5 = 47, + GP_1_24_DATA___5 = 48, + GP_1_25_DATA___5 = 49, + GP_1_26_DATA___5 = 50, + GP_1_27_DATA___5 = 51, + GP_2_0_DATA___6 = 52, + GP_2_1_DATA___6 = 53, + GP_2_2_DATA___6 = 54, + GP_2_3_DATA___6 = 55, + GP_2_4_DATA___6 = 56, + GP_2_5_DATA___6 = 57, + GP_2_6_DATA___6 = 58, + GP_2_7_DATA___6 = 59, + GP_2_8_DATA___6 = 60, + GP_2_9_DATA___6 = 61, + GP_2_10_DATA___6 = 62, + GP_2_11_DATA___6 = 63, + GP_2_12_DATA___6 = 64, + GP_2_13_DATA___6 = 65, + GP_2_14_DATA___6 = 66, + GP_2_15_DATA___2 = 67, + GP_2_16_DATA___2 = 68, + GP_3_0_DATA___6 = 69, + GP_3_1_DATA___6 = 70, + GP_3_2_DATA___6 = 71, + GP_3_3_DATA___6 = 72, + GP_3_4_DATA___6 = 73, + GP_3_5_DATA___6 = 74, + GP_3_6_DATA___6 = 75, + GP_3_7_DATA___6 = 76, + GP_3_8_DATA___6 = 77, + GP_3_9_DATA___6 = 78, + GP_3_10_DATA___6 = 79, + GP_3_11_DATA___6 = 80, + GP_3_12_DATA___6 = 81, + GP_3_13_DATA___6 = 82, + GP_3_14_DATA___6 = 83, + GP_3_15_DATA___6 = 84, + GP_3_16_DATA = 85, + GP_4_0_DATA___6 = 86, + GP_4_1_DATA___6 = 87, + GP_4_2_DATA___6 = 88, + GP_4_3_DATA___6 = 89, + GP_4_4_DATA___6 = 90, + GP_4_5_DATA___6 = 91, + GP_5_0_DATA___6 = 92, + GP_5_1_DATA___6 = 93, + GP_5_2_DATA___6 = 94, + GP_5_3_DATA___6 = 95, + GP_5_4_DATA___6 = 96, + GP_5_5_DATA___6 = 97, + GP_5_6_DATA___6 = 98, + GP_5_7_DATA___6 = 99, + GP_5_8_DATA___6 = 100, + GP_5_9_DATA___6 = 101, + GP_5_10_DATA___6 = 102, + GP_5_11_DATA___6 = 103, + GP_5_12_DATA___6 = 104, + GP_5_13_DATA___6 = 105, + GP_5_14_DATA___6 = 106, + PINMUX_DATA_END___6 = 107, + PINMUX_FUNCTION_BEGIN___6 = 108, + GP_0_0_FN___6 = 109, + GP_0_1_FN___6 = 110, + GP_0_2_FN___6 = 111, + GP_0_3_FN___6 = 112, + GP_0_4_FN___6 = 113, + GP_0_5_FN___6 = 114, + GP_0_6_FN___6 = 115, + GP_0_7_FN___6 = 116, + GP_0_8_FN___6 = 117, + GP_0_9_FN___6 = 118, + GP_0_10_FN___6 = 119, + GP_0_11_FN___6 = 120, + GP_0_12_FN___6 = 121, + GP_0_13_FN___6 = 122, + GP_0_14_FN___6 = 123, + GP_0_15_FN___6 = 124, + GP_0_16_FN___2 = 125, + GP_0_17_FN___2 = 126, + GP_0_18_FN = 127, + GP_0_19_FN = 128, + GP_0_20_FN = 129, + GP_0_21_FN = 130, + GP_1_0_FN___6 = 131, + GP_1_1_FN___6 = 132, + GP_1_2_FN___6 = 133, + GP_1_3_FN___6 = 134, + GP_1_4_FN___6 = 135, + GP_1_5_FN___6 = 136, + GP_1_6_FN___6 = 137, + GP_1_7_FN___6 = 138, + GP_1_8_FN___6 = 139, + GP_1_9_FN___6 = 140, + GP_1_10_FN___6 = 141, + GP_1_11_FN___6 = 142, + GP_1_12_FN___6 = 143, + GP_1_13_FN___6 = 144, + GP_1_14_FN___6 = 145, + GP_1_15_FN___6 = 146, + GP_1_16_FN___6 = 147, + GP_1_17_FN___6 = 148, + GP_1_18_FN___6 = 149, + GP_1_19_FN___6 = 150, + GP_1_20_FN___6 = 151, + GP_1_21_FN___6 = 152, + GP_1_22_FN___6 = 153, + GP_1_23_FN___5 = 154, + GP_1_24_FN___5 = 155, + GP_1_25_FN___5 = 156, + GP_1_26_FN___5 = 157, + GP_1_27_FN___5 = 158, + GP_2_0_FN___6 = 159, + GP_2_1_FN___6 = 160, + GP_2_2_FN___6 = 161, + GP_2_3_FN___6 = 162, + GP_2_4_FN___6 = 163, + GP_2_5_FN___6 = 164, + GP_2_6_FN___6 = 165, + GP_2_7_FN___6 = 166, + GP_2_8_FN___6 = 167, + GP_2_9_FN___6 = 168, + GP_2_10_FN___6 = 169, + GP_2_11_FN___6 = 170, + GP_2_12_FN___6 = 171, + GP_2_13_FN___6 = 172, + GP_2_14_FN___6 = 173, + GP_2_15_FN___2 = 174, + GP_2_16_FN___2 = 175, + GP_3_0_FN___6 = 176, + GP_3_1_FN___6 = 177, + GP_3_2_FN___6 = 178, + GP_3_3_FN___6 = 179, + GP_3_4_FN___6 = 180, + GP_3_5_FN___6 = 181, + GP_3_6_FN___6 = 182, + GP_3_7_FN___6 = 183, + GP_3_8_FN___6 = 184, + GP_3_9_FN___6 = 185, + GP_3_10_FN___6 = 186, + GP_3_11_FN___6 = 187, + GP_3_12_FN___6 = 188, + GP_3_13_FN___6 = 189, + GP_3_14_FN___6 = 190, + GP_3_15_FN___6 = 191, + GP_3_16_FN = 192, + GP_4_0_FN___6 = 193, + GP_4_1_FN___6 = 194, + GP_4_2_FN___6 = 195, + GP_4_3_FN___6 = 196, + GP_4_4_FN___6 = 197, + GP_4_5_FN___6 = 198, + GP_5_0_FN___6 = 199, + GP_5_1_FN___6 = 200, + GP_5_2_FN___6 = 201, + GP_5_3_FN___6 = 202, + GP_5_4_FN___6 = 203, + GP_5_5_FN___6 = 204, + GP_5_6_FN___6 = 205, + GP_5_7_FN___6 = 206, + GP_5_8_FN___6 = 207, + GP_5_9_FN___6 = 208, + GP_5_10_FN___6 = 209, + GP_5_11_FN___6 = 210, + GP_5_12_FN___6 = 211, + GP_5_13_FN___6 = 212, + GP_5_14_FN___6 = 213, + FN_AVB0_AVTP_MATCH = 214, + FN_AVB0_LINK = 215, + FN_AVB0_PHY_INT = 216, + FN_AVB0_MAGIC = 217, + FN_AVB0_MDC = 218, + FN_AVB0_MDIO = 219, + FN_RPC_INT_N___2 = 220, + FN_AVB0_TXCREFCLK = 221, + FN_RPC_WP_N = 222, + FN_AVB0_TD3 = 223, + FN_RPC_RESET_N___2 = 224, + FN_AVB0_TD2 = 225, + FN_QSPI1_SSL___2 = 226, + FN_AVB0_TD1 = 227, + FN_QSPI1_IO3___2 = 228, + FN_AVB0_TD0 = 229, + FN_QSPI1_IO2___2 = 230, + FN_AVB0_TXC = 231, + FN_QSPI1_MISO_IO1___2 = 232, + FN_AVB0_TX_CTL = 233, + FN_QSPI1_MOSI_IO0___2 = 234, + FN_AVB0_RD3 = 235, + FN_QSPI1_SPCLK___2 = 236, + FN_AVB0_RD2 = 237, + FN_QSPI0_SSL___2 = 238, + FN_AVB0_RD1 = 239, + FN_QSPI0_IO3___2 = 240, + FN_AVB0_RD0 = 241, + FN_QSPI0_IO2___2 = 242, + FN_AVB0_RXC = 243, + FN_QSPI0_MISO_IO1___2 = 244, + FN_AVB0_RX_CTL = 245, + FN_QSPI0_MOSI_IO0___2 = 246, + FN_QSPI0_SPCLK___2 = 247, + FN_IP0_3_0___6 = 248, + FN_DU_DR2___6 = 249, + FN_HSCK0___5 = 250, + FN_A0___6 = 251, + FN_IP1_3_0___6 = 252, + FN_DU_DG4___6 = 253, + FN_A8___6 = 254, + FN_FSO_CFE_0_N_A___2 = 255, + FN_IP2_3_0___6 = 256, + FN_DU_DB6___6 = 257, + FN_A16___6 = 258, + FN_FXR_TXENB_N = 259, + FN_IP3_3_0___6 = 260, + FN_VI0_CLKENB = 261, + FN_MSIOF2_RXD = 262, + FN_RX3 = 263, + FN_RD_WR_N___6 = 264, + FN_HCTS3_N___5 = 265, + FN_IP0_7_4___6 = 266, + FN_DU_DR3___6 = 267, + FN_HRTS0_N___5 = 268, + FN_A1___6 = 269, + FN_IP1_7_4___6 = 270, + FN_DU_DG5___6 = 271, + FN_A9___6 = 272, + FN_FSO_CFE_1_N_A___2 = 273, + FN_IP2_7_4___6 = 274, + FN_DU_DB7___6 = 275, + FN_A17___6 = 276, + FN_IP3_7_4___6 = 277, + FN_VI0_HSYNC_N = 278, + FN_MSIOF2_TXD = 279, + FN_TX3 = 280, + FN_HRTS3_N___5 = 281, + FN_IP0_11_8___6 = 282, + FN_DU_DR4___6 = 283, + FN_HCTS0_N___5 = 284, + FN_A2___6 = 285, + FN_IP1_11_8___6 = 286, + FN_DU_DG6___6 = 287, + FN_A10___6 = 288, + FN_FSO_TOE_N_A___2 = 289, + FN_IP2_11_8___6 = 290, + FN_DU_DOTCLKOUT = 291, + FN_SCIF_CLK_A___6 = 292, + FN_A18___6 = 293, + FN_IP3_11_8___6 = 294, + FN_VI0_VSYNC_N = 295, + FN_MSIOF2_SYNC = 296, + FN_CTS3_N___5 = 297, + FN_HTX3 = 298, + FN_IP0_15_12___6 = 299, + FN_DU_DR5___6 = 300, + FN_HTX0___5 = 301, + FN_A3___6 = 302, + FN_IP1_15_12___6 = 303, + FN_DU_DG7___6 = 304, + FN_A11___6 = 305, + FN_IRQ1___6 = 306, + FN_IP2_15_12___6 = 307, + FN_DU_EXHSYNC_DU_HSYNC___5 = 308, + FN_HRX0___5 = 309, + FN_A19___6 = 310, + FN_IRQ3___6 = 311, + FN_IP3_15_12___6 = 312, + FN_VI0_DATA0 = 313, + FN_MSIOF2_SS1 = 314, + FN_RTS3_N___5 = 315, + FN_HRX3 = 316, + FN_IP0_19_16___6 = 317, + FN_DU_DR6___6 = 318, + FN_MSIOF3_RXD = 319, + FN_A4___6 = 320, + FN_IP1_19_16___6 = 321, + FN_DU_DB2___6 = 322, + FN_A12___6 = 323, + FN_IRQ2___6 = 324, + FN_IP2_19_16___6 = 325, + FN_DU_EXVSYNC_DU_VSYNC___5 = 326, + FN_MSIOF3_SCK = 327, + FN_IP3_19_16___6 = 328, + FN_VI0_DATA1 = 329, + FN_MSIOF2_SS2 = 330, + FN_SCK1___6 = 331, + FN_SPEEDIN_A___6 = 332, + FN_IP0_23_20___6 = 333, + FN_DU_DR7___6 = 334, + FN_MSIOF3_TXD = 335, + FN_A5___6 = 336, + FN_IP1_23_20___6 = 337, + FN_DU_DB3___6 = 338, + FN_A13___6 = 339, + FN_FXR_CLKOUT1 = 340, + FN_IP2_23_20___6 = 341, + FN_DU_EXODDF_DU_ODDF_DISP_CDE___5 = 342, + FN_MSIOF3_SYNC = 343, + FN_IP3_23_20___6 = 344, + FN_VI0_DATA2 = 345, + FN_AVB0_AVTP_PPS = 346, + FN_SDA3_A = 347, + FN_IP0_27_24___6 = 348, + FN_DU_DG2___6 = 349, + FN_MSIOF3_SS1 = 350, + FN_A6___6 = 351, + FN_IP1_27_24___6 = 352, + FN_DU_DB4___6 = 353, + FN_A14___6 = 354, + FN_FXR_CLKOUT2 = 355, + FN_IP2_27_24___6 = 356, + FN_IRQ0___6 = 357, + FN_IP3_27_24___6 = 358, + FN_VI0_DATA3 = 359, + FN_HSCK1 = 360, + FN_SCL3_A = 361, + FN_IP0_31_28___6 = 362, + FN_DU_DG3___6 = 363, + FN_MSIOF3_SS2 = 364, + FN_A7___6 = 365, + FN_PWMFSW0 = 366, + FN_IP1_31_28___6 = 367, + FN_DU_DB5___6 = 368, + FN_A15___6 = 369, + FN_FXR_TXENA_N = 370, + FN_IP2_31_28___6 = 371, + FN_VI0_CLK = 372, + FN_MSIOF2_SCK = 373, + FN_SCK3___5 = 374, + FN_HSCK3___5 = 375, + FN_IP3_31_28___6 = 376, + FN_VI0_DATA4 = 377, + FN_HRTS1_N = 378, + FN_RX1_A___5 = 379, + FN_IP4_3_0___6 = 380, + FN_VI0_DATA5 = 381, + FN_HCTS1_N = 382, + FN_TX1_A___5 = 383, + FN_IP5_3_0___6 = 384, + FN_VI1_CLK = 385, + FN_MSIOF1_RXD___2 = 386, + FN_CS0_N___6 = 387, + FN_IP6_3_0___6 = 388, + FN_VI1_DATA4 = 389, + FN_CANFD_CLK_B = 390, + FN_D7___6 = 391, + FN_MMC_D2 = 392, + FN_IP7_3_0___6 = 393, + FN_VI1_FIELD = 394, + FN_SDA4___2 = 395, + FN_IRQ5___6 = 396, + FN_D15___6 = 397, + FN_IP4_7_4___6 = 398, + FN_VI0_DATA6 = 399, + FN_HTX1 = 400, + FN_CTS1_N___6 = 401, + FN_IP5_7_4___6 = 402, + FN_VI1_CLKENB = 403, + FN_MSIOF1_TXD___2 = 404, + FN_D0___6 = 405, + FN_IP6_7_4___6 = 406, + FN_VI1_DATA5 = 407, + FN_SCK4 = 408, + FN_D8___6 = 409, + FN_MMC_D3 = 410, + FN_IP7_7_4___6 = 411, + FN_SCL0 = 412, + FN_DU_DR0___6 = 413, + FN_TPU0TO0___6 = 414, + FN_CLKOUT___5 = 415, + FN_MSIOF0_RXD___6 = 416, + FN_IP4_11_8___6 = 417, + FN_VI0_DATA7 = 418, + FN_HRX1 = 419, + FN_RTS1_N___6 = 420, + FN_IP5_11_8___6 = 421, + FN_VI1_HSYNC_N = 422, + FN_MSIOF1_SCK___2 = 423, + FN_D1___6 = 424, + FN_IP6_11_8___6 = 425, + FN_VI1_DATA6 = 426, + FN_RX4 = 427, + FN_D9___6 = 428, + FN_MMC_CLK = 429, + FN_IP7_11_8___6 = 430, + FN_SDA0 = 431, + FN_DU_DR1___6 = 432, + FN_TPU0TO1___6 = 433, + FN_BS_N___6 = 434, + FN_SCK0___5 = 435, + FN_MSIOF0_TXD___6 = 436, + FN_IP4_15_12___6 = 437, + FN_VI0_DATA8 = 438, + FN_HSCK2 = 439, + FN_PWM0_A___2 = 440, + FN_A22___2 = 441, + FN_IP5_15_12___6 = 442, + FN_VI1_VSYNC_N = 443, + FN_MSIOF1_SYNC___2 = 444, + FN_D2___6 = 445, + FN_IP6_15_12___6 = 446, + FN_VI1_DATA7 = 447, + FN_TX4 = 448, + FN_D10___6 = 449, + FN_MMC_D4 = 450, + FN_IP7_15_12___3 = 451, + FN_SCL1 = 452, + FN_DU_DG0___6 = 453, + FN_TPU0TO2___6 = 454, + FN_RD_N___6 = 455, + FN_CTS0_N___5 = 456, + FN_MSIOF0_SCK___6 = 457, + FN_IP4_19_16___6 = 458, + FN_VI0_DATA9 = 459, + FN_HCTS2_N = 460, + FN_PWM1_A___6 = 461, + FN_A23___2 = 462, + FN_FSO_CFE_0_N_B___2 = 463, + FN_IP5_19_16___6 = 464, + FN_VI1_DATA0 = 465, + FN_MSIOF1_SS1___2 = 466, + FN_D3___6 = 467, + FN_IP6_19_16___6 = 468, + FN_VI1_DATA8 = 469, + FN_CTS4_N = 470, + FN_D11___6 = 471, + FN_MMC_D5 = 472, + FN_IP7_19_16___6 = 473, + FN_SDA1 = 474, + FN_DU_DG1___6 = 475, + FN_TPU0TO3___6 = 476, + FN_WE0_N___6 = 477, + FN_RTS0_N___5 = 478, + FN_MSIOF0_SYNC___6 = 479, + FN_IP4_23_20___6 = 480, + FN_VI0_DATA10 = 481, + FN_HRTS2_N = 482, + FN_PWM2_A___6 = 483, + FN_A24___2 = 484, + FN_FSO_CFE_1_N_B___2 = 485, + FN_IP5_23_20___6 = 486, + FN_VI1_DATA1 = 487, + FN_MSIOF1_SS2___2 = 488, + FN_D4___6 = 489, + FN_MMC_CMD = 490, + FN_IP6_23_20___6 = 491, + FN_VI1_DATA9 = 492, + FN_RTS4_N = 493, + FN_D12___6 = 494, + FN_MMC_D6 = 495, + FN_SCL3_B = 496, + FN_IP7_23_20___6 = 497, + FN_SCL2 = 498, + FN_DU_DB0___6 = 499, + FN_TCLK1_A___6 = 500, + FN_WE1_N___6 = 501, + FN_RX0___5 = 502, + FN_MSIOF0_SS1___6 = 503, + FN_IP4_27_24___6 = 504, + FN_VI0_DATA11 = 505, + FN_HTX2 = 506, + FN_PWM3_A___6 = 507, + FN_A25___2 = 508, + FN_FSO_TOE_N_B___2 = 509, + FN_IP5_27_24___6 = 510, + FN_VI1_DATA2 = 511, + FN_CANFD0_TX_B___5 = 512, + FN_D5___6 = 513, + FN_MMC_D0 = 514, + FN_IP6_27_24___6 = 515, + FN_VI1_DATA10 = 516, + FN_D13___6 = 517, + FN_MMC_D7 = 518, + FN_SDA3_B = 519, + FN_IP7_27_24___6 = 520, + FN_SDA2 = 521, + FN_DU_DB1___6 = 522, + FN_TCLK2_A___6 = 523, + FN_EX_WAIT0___2 = 524, + FN_TX0___5 = 525, + FN_MSIOF0_SS2___6 = 526, + FN_IP4_31_28___6 = 527, + FN_VI0_FIELD = 528, + FN_HRX2 = 529, + FN_PWM4_A___6 = 530, + FN_CS1_N___4 = 531, + FN_FSCLKST2_N_A___4 = 532, + FN_IP5_31_28___6 = 533, + FN_VI1_DATA3 = 534, + FN_CANFD0_RX_B___5 = 535, + FN_D6___6 = 536, + FN_MMC_D1 = 537, + FN_IP6_31_28___6 = 538, + FN_VI1_DATA11 = 539, + FN_SCL4___2 = 540, + FN_IRQ4___6 = 541, + FN_D14___6 = 542, + FN_IP7_31_28___6 = 543, + FN_AVB0_AVTP_CAPTURE = 544, + FN_FSCLKST2_N_B___4 = 545, + FN_IP8_3_0___6 = 546, + FN_CANFD0_TX_A___5 = 547, + FN_FXR_TXDA = 548, + FN_PWM0_B___2 = 549, + FN_DU_DISP___6 = 550, + FN_FSCLKST2_N_C = 551, + FN_IP8_7_4___6 = 552, + FN_CANFD0_RX_A___5 = 553, + FN_RXDA_EXTFXR = 554, + FN_PWM1_B___6 = 555, + FN_DU_CDE___6 = 556, + FN_IP8_11_8___6 = 557, + FN_CANFD1_TX___6 = 558, + FN_FXR_TXDB = 559, + FN_PWM2_B___6 = 560, + FN_TCLK1_B___6 = 561, + FN_TX1_B___5 = 562, + FN_IP8_15_12___6 = 563, + FN_CANFD1_RX___6 = 564, + FN_RXDB_EXTFXR = 565, + FN_PWM3_B___6 = 566, + FN_TCLK2_B___6 = 567, + FN_RX1_B___5 = 568, + FN_IP8_19_16___6 = 569, + FN_CANFD_CLK_A = 570, + FN_CLK_EXTFXR = 571, + FN_PWM4_B___6 = 572, + FN_SPEEDIN_B___6 = 573, + FN_SCIF_CLK_B___6 = 574, + FN_IP8_23_20___6 = 575, + FN_DIGRF_CLKIN = 576, + FN_DIGRF_CLKEN_IN = 577, + FN_IP8_27_24___6 = 578, + FN_DIGRF_CLKOUT = 579, + FN_DIGRF_CLKEN_OUT = 580, + FN_IP8_31_28___6 = 581, + FN_SEL_I2C3_0 = 582, + FN_SEL_I2C3_1 = 583, + FN_SEL_HSCIF0_0___2 = 584, + FN_SEL_HSCIF0_1___2 = 585, + FN_SEL_SCIF1_0___5 = 586, + FN_SEL_SCIF1_1___5 = 587, + FN_SEL_CANFD0_0___5 = 588, + FN_SEL_CANFD0_1___5 = 589, + FN_SEL_PWM4_0___6 = 590, + FN_SEL_PWM4_1___6 = 591, + FN_SEL_PWM3_0___6 = 592, + FN_SEL_PWM3_1___6 = 593, + FN_SEL_PWM2_0___6 = 594, + FN_SEL_PWM2_1___6 = 595, + FN_SEL_PWM1_0___6 = 596, + FN_SEL_PWM1_1___6 = 597, + FN_SEL_PWM0_0___2 = 598, + FN_SEL_PWM0_1___2 = 599, + FN_SEL_RFSO_0 = 600, + FN_SEL_RFSO_1 = 601, + FN_SEL_RSP_0 = 602, + FN_SEL_RSP_1 = 603, + FN_SEL_TMU_0 = 604, + FN_SEL_TMU_1 = 605, + PINMUX_FUNCTION_END___6 = 606, + PINMUX_MARK_BEGIN___6 = 607, + AVB0_AVTP_MATCH_MARK = 608, + AVB0_LINK_MARK = 609, + AVB0_PHY_INT_MARK = 610, + AVB0_MAGIC_MARK = 611, + AVB0_MDC_MARK = 612, + AVB0_MDIO_MARK = 613, + RPC_INT_N_MARK___2 = 614, + AVB0_TXCREFCLK_MARK = 615, + RPC_WP_N_MARK = 616, + AVB0_TD3_MARK = 617, + RPC_RESET_N_MARK___2 = 618, + AVB0_TD2_MARK = 619, + QSPI1_SSL_MARK___6 = 620, + AVB0_TD1_MARK = 621, + QSPI1_IO3_MARK___6 = 622, + AVB0_TD0_MARK = 623, + QSPI1_IO2_MARK___6 = 624, + AVB0_TXC_MARK = 625, + QSPI1_MISO_IO1_MARK___6 = 626, + AVB0_TX_CTL_MARK = 627, + QSPI1_MOSI_IO0_MARK___6 = 628, + AVB0_RD3_MARK = 629, + QSPI1_SPCLK_MARK___6 = 630, + AVB0_RD2_MARK = 631, + QSPI0_SSL_MARK___6 = 632, + AVB0_RD1_MARK = 633, + QSPI0_IO3_MARK___6 = 634, + AVB0_RD0_MARK = 635, + QSPI0_IO2_MARK___6 = 636, + AVB0_RXC_MARK = 637, + QSPI0_MISO_IO1_MARK___6 = 638, + AVB0_RX_CTL_MARK = 639, + QSPI0_MOSI_IO0_MARK___6 = 640, + QSPI0_SPCLK_MARK___6 = 641, + IP0_3_0_MARK___6 = 642, + DU_DR2_MARK___6 = 643, + HSCK0_MARK___5 = 644, + A0_MARK___6 = 645, + IP1_3_0_MARK___6 = 646, + DU_DG4_MARK___6 = 647, + A8_MARK___6 = 648, + FSO_CFE_0_N_A_MARK___2 = 649, + IP2_3_0_MARK___6 = 650, + DU_DB6_MARK___6 = 651, + A16_MARK___6 = 652, + FXR_TXENB_N_MARK = 653, + IP3_3_0_MARK___6 = 654, + VI0_CLKENB_MARK = 655, + MSIOF2_RXD_MARK = 656, + RX3_MARK = 657, + RD_WR_N_MARK___6 = 658, + HCTS3_N_MARK___5 = 659, + IP0_7_4_MARK___6 = 660, + DU_DR3_MARK___6 = 661, + HRTS0_N_MARK___5 = 662, + A1_MARK___6 = 663, + IP1_7_4_MARK___6 = 664, + DU_DG5_MARK___6 = 665, + A9_MARK___6 = 666, + FSO_CFE_1_N_A_MARK___2 = 667, + IP2_7_4_MARK___6 = 668, + DU_DB7_MARK___6 = 669, + A17_MARK___6 = 670, + IP3_7_4_MARK___6 = 671, + VI0_HSYNC_N_MARK = 672, + MSIOF2_TXD_MARK = 673, + TX3_MARK = 674, + HRTS3_N_MARK___5 = 675, + IP0_11_8_MARK___6 = 676, + DU_DR4_MARK___6 = 677, + HCTS0_N_MARK___5 = 678, + A2_MARK___6 = 679, + IP1_11_8_MARK___6 = 680, + DU_DG6_MARK___6 = 681, + A10_MARK___6 = 682, + FSO_TOE_N_A_MARK___2 = 683, + IP2_11_8_MARK___6 = 684, + DU_DOTCLKOUT_MARK = 685, + SCIF_CLK_A_MARK___6 = 686, + A18_MARK___6 = 687, + IP3_11_8_MARK___6 = 688, + VI0_VSYNC_N_MARK = 689, + MSIOF2_SYNC_MARK = 690, + CTS3_N_MARK___5 = 691, + HTX3_MARK = 692, + IP0_15_12_MARK___6 = 693, + DU_DR5_MARK___6 = 694, + HTX0_MARK___5 = 695, + A3_MARK___6 = 696, + IP1_15_12_MARK___6 = 697, + DU_DG7_MARK___6 = 698, + A11_MARK___6 = 699, + IRQ1_MARK___6 = 700, + IP2_15_12_MARK___6 = 701, + DU_EXHSYNC_DU_HSYNC_MARK___5 = 702, + HRX0_MARK___5 = 703, + A19_MARK___6 = 704, + IRQ3_MARK___6 = 705, + IP3_15_12_MARK___6 = 706, + VI0_DATA0_MARK = 707, + MSIOF2_SS1_MARK = 708, + RTS3_N_MARK___5 = 709, + HRX3_MARK = 710, + IP0_19_16_MARK___6 = 711, + DU_DR6_MARK___6 = 712, + MSIOF3_RXD_MARK = 713, + A4_MARK___6 = 714, + IP1_19_16_MARK___6 = 715, + DU_DB2_MARK___6 = 716, + A12_MARK___6 = 717, + IRQ2_MARK___6 = 718, + IP2_19_16_MARK___6 = 719, + DU_EXVSYNC_DU_VSYNC_MARK___5 = 720, + MSIOF3_SCK_MARK = 721, + IP3_19_16_MARK___6 = 722, + VI0_DATA1_MARK = 723, + MSIOF2_SS2_MARK = 724, + SCK1_MARK___6 = 725, + SPEEDIN_A_MARK___6 = 726, + IP0_23_20_MARK___6 = 727, + DU_DR7_MARK___6 = 728, + MSIOF3_TXD_MARK = 729, + A5_MARK___6 = 730, + IP1_23_20_MARK___6 = 731, + DU_DB3_MARK___6 = 732, + A13_MARK___6 = 733, + FXR_CLKOUT1_MARK = 734, + IP2_23_20_MARK___6 = 735, + DU_EXODDF_DU_ODDF_DISP_CDE_MARK___5 = 736, + MSIOF3_SYNC_MARK = 737, + IP3_23_20_MARK___6 = 738, + VI0_DATA2_MARK = 739, + AVB0_AVTP_PPS_MARK = 740, + SDA3_A_MARK = 741, + IP0_27_24_MARK___6 = 742, + DU_DG2_MARK___6 = 743, + MSIOF3_SS1_MARK = 744, + A6_MARK___6 = 745, + IP1_27_24_MARK___6 = 746, + DU_DB4_MARK___6 = 747, + A14_MARK___6 = 748, + FXR_CLKOUT2_MARK = 749, + IP2_27_24_MARK___6 = 750, + IRQ0_MARK___6 = 751, + IP3_27_24_MARK___6 = 752, + VI0_DATA3_MARK = 753, + HSCK1_MARK = 754, + SCL3_A_MARK = 755, + IP0_31_28_MARK___6 = 756, + DU_DG3_MARK___6 = 757, + MSIOF3_SS2_MARK = 758, + A7_MARK___6 = 759, + PWMFSW0_MARK = 760, + IP1_31_28_MARK___6 = 761, + DU_DB5_MARK___6 = 762, + A15_MARK___6 = 763, + FXR_TXENA_N_MARK = 764, + IP2_31_28_MARK___6 = 765, + VI0_CLK_MARK = 766, + MSIOF2_SCK_MARK = 767, + SCK3_MARK___5 = 768, + HSCK3_MARK___5 = 769, + IP3_31_28_MARK___6 = 770, + VI0_DATA4_MARK = 771, + HRTS1_N_MARK = 772, + RX1_A_MARK___5 = 773, + IP4_3_0_MARK___6 = 774, + VI0_DATA5_MARK = 775, + HCTS1_N_MARK = 776, + TX1_A_MARK___5 = 777, + IP5_3_0_MARK___6 = 778, + VI1_CLK_MARK = 779, + MSIOF1_RXD_MARK___2 = 780, + CS0_N_MARK___6 = 781, + IP6_3_0_MARK___6 = 782, + VI1_DATA4_MARK = 783, + CANFD_CLK_B_MARK = 784, + D7_MARK___6 = 785, + MMC_D2_MARK = 786, + IP7_3_0_MARK___6 = 787, + VI1_FIELD_MARK = 788, + SDA4_MARK___2 = 789, + IRQ5_MARK___6 = 790, + D15_MARK___6 = 791, + IP4_7_4_MARK___6 = 792, + VI0_DATA6_MARK = 793, + HTX1_MARK = 794, + CTS1_N_MARK___6 = 795, + IP5_7_4_MARK___6 = 796, + VI1_CLKENB_MARK = 797, + MSIOF1_TXD_MARK___2 = 798, + D0_MARK___6 = 799, + IP6_7_4_MARK___6 = 800, + VI1_DATA5_MARK = 801, + SCK4_MARK = 802, + D8_MARK___6 = 803, + MMC_D3_MARK = 804, + IP7_7_4_MARK___6 = 805, + SCL0_MARK___5 = 806, + DU_DR0_MARK___6 = 807, + TPU0TO0_MARK___6 = 808, + CLKOUT_MARK___6 = 809, + MSIOF0_RXD_MARK___6 = 810, + IP4_11_8_MARK___6 = 811, + VI0_DATA7_MARK = 812, + HRX1_MARK = 813, + RTS1_N_MARK___6 = 814, + IP5_11_8_MARK___6 = 815, + VI1_HSYNC_N_MARK = 816, + MSIOF1_SCK_MARK___2 = 817, + D1_MARK___6 = 818, + IP6_11_8_MARK___6 = 819, + VI1_DATA6_MARK = 820, + RX4_MARK = 821, + D9_MARK___6 = 822, + MMC_CLK_MARK = 823, + IP7_11_8_MARK___6 = 824, + SDA0_MARK___5 = 825, + DU_DR1_MARK___6 = 826, + TPU0TO1_MARK___6 = 827, + BS_N_MARK___6 = 828, + SCK0_MARK___5 = 829, + MSIOF0_TXD_MARK___6 = 830, + IP4_15_12_MARK___6 = 831, + VI0_DATA8_MARK = 832, + HSCK2_MARK = 833, + PWM0_A_MARK___2 = 834, + A22_MARK___2 = 835, + IP5_15_12_MARK___6 = 836, + VI1_VSYNC_N_MARK = 837, + MSIOF1_SYNC_MARK___2 = 838, + D2_MARK___6 = 839, + IP6_15_12_MARK___6 = 840, + VI1_DATA7_MARK = 841, + TX4_MARK = 842, + D10_MARK___6 = 843, + MMC_D4_MARK = 844, + IP7_15_12_MARK___3 = 845, + SCL1_MARK = 846, + DU_DG0_MARK___6 = 847, + TPU0TO2_MARK___6 = 848, + RD_N_MARK___6 = 849, + CTS0_N_MARK___5 = 850, + MSIOF0_SCK_MARK___6 = 851, + IP4_19_16_MARK___6 = 852, + VI0_DATA9_MARK = 853, + HCTS2_N_MARK = 854, + PWM1_A_MARK___6 = 855, + A23_MARK___2 = 856, + FSO_CFE_0_N_B_MARK___2 = 857, + IP5_19_16_MARK___6 = 858, + VI1_DATA0_MARK = 859, + MSIOF1_SS1_MARK___2 = 860, + D3_MARK___6 = 861, + IP6_19_16_MARK___6 = 862, + VI1_DATA8_MARK = 863, + CTS4_N_MARK = 864, + D11_MARK___6 = 865, + MMC_D5_MARK = 866, + IP7_19_16_MARK___6 = 867, + SDA1_MARK = 868, + DU_DG1_MARK___6 = 869, + TPU0TO3_MARK___6 = 870, + WE0_N_MARK___6 = 871, + RTS0_N_MARK___5 = 872, + MSIOF0_SYNC_MARK___6 = 873, + IP4_23_20_MARK___6 = 874, + VI0_DATA10_MARK = 875, + HRTS2_N_MARK = 876, + PWM2_A_MARK___6 = 877, + A24_MARK___2 = 878, + FSO_CFE_1_N_B_MARK___2 = 879, + IP5_23_20_MARK___6 = 880, + VI1_DATA1_MARK = 881, + MSIOF1_SS2_MARK___2 = 882, + D4_MARK___6 = 883, + MMC_CMD_MARK = 884, + IP6_23_20_MARK___6 = 885, + VI1_DATA9_MARK = 886, + RTS4_N_MARK = 887, + D12_MARK___6 = 888, + MMC_D6_MARK = 889, + SCL3_B_MARK = 890, + IP7_23_20_MARK___6 = 891, + SCL2_MARK = 892, + DU_DB0_MARK___6 = 893, + TCLK1_A_MARK___6 = 894, + WE1_N_MARK___6 = 895, + RX0_MARK___5 = 896, + MSIOF0_SS1_MARK___6 = 897, + IP4_27_24_MARK___6 = 898, + VI0_DATA11_MARK = 899, + HTX2_MARK = 900, + PWM3_A_MARK___6 = 901, + A25_MARK___2 = 902, + FSO_TOE_N_B_MARK___2 = 903, + IP5_27_24_MARK___6 = 904, + VI1_DATA2_MARK = 905, + CANFD0_TX_B_MARK___5 = 906, + D5_MARK___6 = 907, + MMC_D0_MARK = 908, + IP6_27_24_MARK___6 = 909, + VI1_DATA10_MARK = 910, + D13_MARK___6 = 911, + MMC_D7_MARK = 912, + SDA3_B_MARK = 913, + IP7_27_24_MARK___6 = 914, + SDA2_MARK = 915, + DU_DB1_MARK___6 = 916, + TCLK2_A_MARK___6 = 917, + EX_WAIT0_MARK___2 = 918, + TX0_MARK___5 = 919, + MSIOF0_SS2_MARK___6 = 920, + IP4_31_28_MARK___6 = 921, + VI0_FIELD_MARK = 922, + HRX2_MARK = 923, + PWM4_A_MARK___6 = 924, + CS1_N_MARK___4 = 925, + FSCLKST2_N_A_MARK___4 = 926, + IP5_31_28_MARK___6 = 927, + VI1_DATA3_MARK = 928, + CANFD0_RX_B_MARK___5 = 929, + D6_MARK___6 = 930, + MMC_D1_MARK = 931, + IP6_31_28_MARK___6 = 932, + VI1_DATA11_MARK = 933, + SCL4_MARK___2 = 934, + IRQ4_MARK___6 = 935, + D14_MARK___6 = 936, + IP7_31_28_MARK___6 = 937, + AVB0_AVTP_CAPTURE_MARK = 938, + FSCLKST2_N_B_MARK___4 = 939, + IP8_3_0_MARK___6 = 940, + CANFD0_TX_A_MARK___5 = 941, + FXR_TXDA_MARK = 942, + PWM0_B_MARK___2 = 943, + DU_DISP_MARK___6 = 944, + FSCLKST2_N_C_MARK = 945, + IP8_7_4_MARK___6 = 946, + CANFD0_RX_A_MARK___5 = 947, + RXDA_EXTFXR_MARK = 948, + PWM1_B_MARK___6 = 949, + DU_CDE_MARK___6 = 950, + IP8_11_8_MARK___6 = 951, + CANFD1_TX_MARK___6 = 952, + FXR_TXDB_MARK = 953, + PWM2_B_MARK___6 = 954, + TCLK1_B_MARK___6 = 955, + TX1_B_MARK___5 = 956, + IP8_15_12_MARK___6 = 957, + CANFD1_RX_MARK___6 = 958, + RXDB_EXTFXR_MARK = 959, + PWM3_B_MARK___6 = 960, + TCLK2_B_MARK___6 = 961, + RX1_B_MARK___5 = 962, + IP8_19_16_MARK___6 = 963, + CANFD_CLK_A_MARK = 964, + CLK_EXTFXR_MARK = 965, + PWM4_B_MARK___6 = 966, + SPEEDIN_B_MARK___6 = 967, + SCIF_CLK_B_MARK___6 = 968, + IP8_23_20_MARK___6 = 969, + DIGRF_CLKIN_MARK = 970, + DIGRF_CLKEN_IN_MARK = 971, + IP8_27_24_MARK___6 = 972, + DIGRF_CLKOUT_MARK = 973, + DIGRF_CLKEN_OUT_MARK = 974, + IP8_31_28_MARK___6 = 975, + SEL_I2C3_0_MARK = 976, + SEL_I2C3_1_MARK = 977, + SEL_HSCIF0_0_MARK___2 = 978, + SEL_HSCIF0_1_MARK___2 = 979, + SEL_SCIF1_0_MARK___5 = 980, + SEL_SCIF1_1_MARK___5 = 981, + SEL_CANFD0_0_MARK___5 = 982, + SEL_CANFD0_1_MARK___5 = 983, + SEL_PWM4_0_MARK___6 = 984, + SEL_PWM4_1_MARK___6 = 985, + SEL_PWM3_0_MARK___6 = 986, + SEL_PWM3_1_MARK___6 = 987, + SEL_PWM2_0_MARK___6 = 988, + SEL_PWM2_1_MARK___6 = 989, + SEL_PWM1_0_MARK___6 = 990, + SEL_PWM1_1_MARK___6 = 991, + SEL_PWM0_0_MARK___2 = 992, + SEL_PWM0_1_MARK___2 = 993, + SEL_RFSO_0_MARK = 994, + SEL_RFSO_1_MARK = 995, + SEL_RSP_0_MARK = 996, + SEL_RSP_1_MARK = 997, + SEL_TMU_0_MARK = 998, + SEL_TMU_1_MARK = 999, + PINMUX_MARK_END___6 = 1000, +}; + +enum { + GP_LAST___6 = 174, + PIN_DU_DOTCLKIN = 175, + PIN_EXTALR___5 = 176, + PIN_FSCLKST_N___4 = 177, + PIN_PRESETOUT_N___6 = 178, + PIN_TCK___6 = 179, + PIN_TDI___6 = 180, + PIN_TMS___6 = 181, + PIN_TRST_N___6 = 182, +}; + +enum ioctrl_regs___3 { + POCCTRL0___2 = 0, + POCCTRL1 = 1, + POCCTRL2 = 2, + TDSELCTRL___3 = 3, +}; + +enum { + PINMUX_RESERVED___7 = 0, + PINMUX_DATA_BEGIN___7 = 1, + GP_0_0_DATA___7 = 2, + GP_0_1_DATA___7 = 3, + GP_0_2_DATA___7 = 4, + GP_0_3_DATA___7 = 5, + GP_0_4_DATA___7 = 6, + GP_0_5_DATA___7 = 7, + GP_0_6_DATA___7 = 8, + GP_0_7_DATA___7 = 9, + GP_0_8_DATA___7 = 10, + GP_0_9_DATA___7 = 11, + GP_0_10_DATA___7 = 12, + GP_0_11_DATA___7 = 13, + GP_0_12_DATA___7 = 14, + GP_0_13_DATA___7 = 15, + GP_0_14_DATA___7 = 16, + GP_0_15_DATA___7 = 17, + GP_0_16_DATA___3 = 18, + GP_0_17_DATA___3 = 19, + GP_0_18_DATA___2 = 20, + GP_0_19_DATA___2 = 21, + GP_0_20_DATA___2 = 22, + GP_0_21_DATA___2 = 23, + GP_1_0_DATA___7 = 24, + GP_1_1_DATA___7 = 25, + GP_1_2_DATA___7 = 26, + GP_1_3_DATA___7 = 27, + GP_1_4_DATA___7 = 28, + GP_1_5_DATA___7 = 29, + GP_1_6_DATA___7 = 30, + GP_1_7_DATA___7 = 31, + GP_1_8_DATA___7 = 32, + GP_1_9_DATA___7 = 33, + GP_1_10_DATA___7 = 34, + GP_1_11_DATA___7 = 35, + GP_1_12_DATA___7 = 36, + GP_1_13_DATA___7 = 37, + GP_1_14_DATA___7 = 38, + GP_1_15_DATA___7 = 39, + GP_1_16_DATA___7 = 40, + GP_1_17_DATA___7 = 41, + GP_1_18_DATA___7 = 42, + GP_1_19_DATA___7 = 43, + GP_1_20_DATA___7 = 44, + GP_1_21_DATA___7 = 45, + GP_1_22_DATA___7 = 46, + GP_1_23_DATA___6 = 47, + GP_1_24_DATA___6 = 48, + GP_1_25_DATA___6 = 49, + GP_1_26_DATA___6 = 50, + GP_1_27_DATA___6 = 51, + GP_2_0_DATA___7 = 52, + GP_2_1_DATA___7 = 53, + GP_2_2_DATA___7 = 54, + GP_2_3_DATA___7 = 55, + GP_2_4_DATA___7 = 56, + GP_2_5_DATA___7 = 57, + GP_2_6_DATA___7 = 58, + GP_2_7_DATA___7 = 59, + GP_2_8_DATA___7 = 60, + GP_2_9_DATA___7 = 61, + GP_2_10_DATA___7 = 62, + GP_2_11_DATA___7 = 63, + GP_2_12_DATA___7 = 64, + GP_2_13_DATA___7 = 65, + GP_2_14_DATA___7 = 66, + GP_2_15_DATA___3 = 67, + GP_2_16_DATA___3 = 68, + GP_2_17_DATA___2 = 69, + GP_2_18_DATA___2 = 70, + GP_2_19_DATA___2 = 71, + GP_2_20_DATA___2 = 72, + GP_2_21_DATA___2 = 73, + GP_2_22_DATA___2 = 74, + GP_2_23_DATA___2 = 75, + GP_2_24_DATA___2 = 76, + GP_2_25_DATA___2 = 77, + GP_2_26_DATA = 78, + GP_2_27_DATA = 79, + GP_2_28_DATA = 80, + GP_2_29_DATA = 81, + GP_3_0_DATA___7 = 82, + GP_3_1_DATA___7 = 83, + GP_3_2_DATA___7 = 84, + GP_3_3_DATA___7 = 85, + GP_3_4_DATA___7 = 86, + GP_3_5_DATA___7 = 87, + GP_3_6_DATA___7 = 88, + GP_3_7_DATA___7 = 89, + GP_3_8_DATA___7 = 90, + GP_3_9_DATA___7 = 91, + GP_3_10_DATA___7 = 92, + GP_3_11_DATA___7 = 93, + GP_3_12_DATA___7 = 94, + GP_3_13_DATA___7 = 95, + GP_3_14_DATA___7 = 96, + GP_3_15_DATA___7 = 97, + GP_3_16_DATA___2 = 98, + GP_4_0_DATA___7 = 99, + GP_4_1_DATA___7 = 100, + GP_4_2_DATA___7 = 101, + GP_4_3_DATA___7 = 102, + GP_4_4_DATA___7 = 103, + GP_4_5_DATA___7 = 104, + GP_4_6_DATA___6 = 105, + GP_4_7_DATA___6 = 106, + GP_4_8_DATA___6 = 107, + GP_4_9_DATA___6 = 108, + GP_4_10_DATA___6 = 109, + GP_4_11_DATA___5 = 110, + GP_4_12_DATA___5 = 111, + GP_4_13_DATA___5 = 112, + GP_4_14_DATA___5 = 113, + GP_4_15_DATA___5 = 114, + GP_4_16_DATA___5 = 115, + GP_4_17_DATA___5 = 116, + GP_4_18_DATA = 117, + GP_4_19_DATA = 118, + GP_4_20_DATA = 119, + GP_4_21_DATA = 120, + GP_4_22_DATA = 121, + GP_4_23_DATA = 122, + GP_4_24_DATA = 123, + GP_5_0_DATA___7 = 124, + GP_5_1_DATA___7 = 125, + GP_5_2_DATA___7 = 126, + GP_5_3_DATA___7 = 127, + GP_5_4_DATA___7 = 128, + GP_5_5_DATA___7 = 129, + GP_5_6_DATA___7 = 130, + GP_5_7_DATA___7 = 131, + GP_5_8_DATA___7 = 132, + GP_5_9_DATA___7 = 133, + GP_5_10_DATA___7 = 134, + GP_5_11_DATA___7 = 135, + GP_5_12_DATA___7 = 136, + GP_5_13_DATA___7 = 137, + GP_5_14_DATA___7 = 138, + PINMUX_DATA_END___7 = 139, + PINMUX_FUNCTION_BEGIN___7 = 140, + GP_0_0_FN___7 = 141, + GP_0_1_FN___7 = 142, + GP_0_2_FN___7 = 143, + GP_0_3_FN___7 = 144, + GP_0_4_FN___7 = 145, + GP_0_5_FN___7 = 146, + GP_0_6_FN___7 = 147, + GP_0_7_FN___7 = 148, + GP_0_8_FN___7 = 149, + GP_0_9_FN___7 = 150, + GP_0_10_FN___7 = 151, + GP_0_11_FN___7 = 152, + GP_0_12_FN___7 = 153, + GP_0_13_FN___7 = 154, + GP_0_14_FN___7 = 155, + GP_0_15_FN___7 = 156, + GP_0_16_FN___3 = 157, + GP_0_17_FN___3 = 158, + GP_0_18_FN___2 = 159, + GP_0_19_FN___2 = 160, + GP_0_20_FN___2 = 161, + GP_0_21_FN___2 = 162, + GP_1_0_FN___7 = 163, + GP_1_1_FN___7 = 164, + GP_1_2_FN___7 = 165, + GP_1_3_FN___7 = 166, + GP_1_4_FN___7 = 167, + GP_1_5_FN___7 = 168, + GP_1_6_FN___7 = 169, + GP_1_7_FN___7 = 170, + GP_1_8_FN___7 = 171, + GP_1_9_FN___7 = 172, + GP_1_10_FN___7 = 173, + GP_1_11_FN___7 = 174, + GP_1_12_FN___7 = 175, + GP_1_13_FN___7 = 176, + GP_1_14_FN___7 = 177, + GP_1_15_FN___7 = 178, + GP_1_16_FN___7 = 179, + GP_1_17_FN___7 = 180, + GP_1_18_FN___7 = 181, + GP_1_19_FN___7 = 182, + GP_1_20_FN___7 = 183, + GP_1_21_FN___7 = 184, + GP_1_22_FN___7 = 185, + GP_1_23_FN___6 = 186, + GP_1_24_FN___6 = 187, + GP_1_25_FN___6 = 188, + GP_1_26_FN___6 = 189, + GP_1_27_FN___6 = 190, + GP_2_0_FN___7 = 191, + GP_2_1_FN___7 = 192, + GP_2_2_FN___7 = 193, + GP_2_3_FN___7 = 194, + GP_2_4_FN___7 = 195, + GP_2_5_FN___7 = 196, + GP_2_6_FN___7 = 197, + GP_2_7_FN___7 = 198, + GP_2_8_FN___7 = 199, + GP_2_9_FN___7 = 200, + GP_2_10_FN___7 = 201, + GP_2_11_FN___7 = 202, + GP_2_12_FN___7 = 203, + GP_2_13_FN___7 = 204, + GP_2_14_FN___7 = 205, + GP_2_15_FN___3 = 206, + GP_2_16_FN___3 = 207, + GP_2_17_FN___2 = 208, + GP_2_18_FN___2 = 209, + GP_2_19_FN___2 = 210, + GP_2_20_FN___2 = 211, + GP_2_21_FN___2 = 212, + GP_2_22_FN___2 = 213, + GP_2_23_FN___2 = 214, + GP_2_24_FN___2 = 215, + GP_2_25_FN___2 = 216, + GP_2_26_FN = 217, + GP_2_27_FN = 218, + GP_2_28_FN = 219, + GP_2_29_FN = 220, + GP_3_0_FN___7 = 221, + GP_3_1_FN___7 = 222, + GP_3_2_FN___7 = 223, + GP_3_3_FN___7 = 224, + GP_3_4_FN___7 = 225, + GP_3_5_FN___7 = 226, + GP_3_6_FN___7 = 227, + GP_3_7_FN___7 = 228, + GP_3_8_FN___7 = 229, + GP_3_9_FN___7 = 230, + GP_3_10_FN___7 = 231, + GP_3_11_FN___7 = 232, + GP_3_12_FN___7 = 233, + GP_3_13_FN___7 = 234, + GP_3_14_FN___7 = 235, + GP_3_15_FN___7 = 236, + GP_3_16_FN___2 = 237, + GP_4_0_FN___7 = 238, + GP_4_1_FN___7 = 239, + GP_4_2_FN___7 = 240, + GP_4_3_FN___7 = 241, + GP_4_4_FN___7 = 242, + GP_4_5_FN___7 = 243, + GP_4_6_FN___6 = 244, + GP_4_7_FN___6 = 245, + GP_4_8_FN___6 = 246, + GP_4_9_FN___6 = 247, + GP_4_10_FN___6 = 248, + GP_4_11_FN___5 = 249, + GP_4_12_FN___5 = 250, + GP_4_13_FN___5 = 251, + GP_4_14_FN___5 = 252, + GP_4_15_FN___5 = 253, + GP_4_16_FN___5 = 254, + GP_4_17_FN___5 = 255, + GP_4_18_FN = 256, + GP_4_19_FN = 257, + GP_4_20_FN = 258, + GP_4_21_FN = 259, + GP_4_22_FN = 260, + GP_4_23_FN = 261, + GP_4_24_FN = 262, + GP_5_0_FN___7 = 263, + GP_5_1_FN___7 = 264, + GP_5_2_FN___7 = 265, + GP_5_3_FN___7 = 266, + GP_5_4_FN___7 = 267, + GP_5_5_FN___7 = 268, + GP_5_6_FN___7 = 269, + GP_5_7_FN___7 = 270, + GP_5_8_FN___7 = 271, + GP_5_9_FN___7 = 272, + GP_5_10_FN___7 = 273, + GP_5_11_FN___7 = 274, + GP_5_12_FN___7 = 275, + GP_5_13_FN___7 = 276, + GP_5_14_FN___7 = 277, + FN_GETHER_LINK_A = 278, + FN_GETHER_PHY_INT_A = 279, + FN_GETHER_MAGIC = 280, + FN_GETHER_MDC_A = 281, + FN_GETHER_MDIO_A = 282, + FN_GETHER_TXCREFCLK_MEGA = 283, + FN_AVB_LINK___6 = 284, + FN_GETHER_TXCREFCLK = 285, + FN_AVB_PHY_INT___6 = 286, + FN_GETHER_TD3 = 287, + FN_AVB_MAGIC___6 = 288, + FN_GETHER_TD2 = 289, + FN_AVB_MDC___6 = 290, + FN_GETHER_TD1 = 291, + FN_AVB_MDIO___2 = 292, + FN_GETHER_TD0 = 293, + FN_RPC_INT_N___3 = 294, + FN_AVB_TXCREFCLK___2 = 295, + FN_GETHER_TXC = 296, + FN_RPC_WP_N___2 = 297, + FN_AVB_TD3 = 298, + FN_GETHER_TX_CTL = 299, + FN_RPC_RESET_N___3 = 300, + FN_AVB_TD2 = 301, + FN_GETHER_RD3 = 302, + FN_QSPI1_SSL___3 = 303, + FN_AVB_TD1 = 304, + FN_GETHER_RD2 = 305, + FN_QSPI1_IO3___3 = 306, + FN_AVB_TD0 = 307, + FN_GETHER_RD1 = 308, + FN_QSPI1_IO2___3 = 309, + FN_AVB_TXC = 310, + FN_GETHER_RD0 = 311, + FN_QSPI1_MISO_IO1___3 = 312, + FN_AVB_TX_CTL = 313, + FN_GETHER_RXC = 314, + FN_QSPI1_MOSI_IO0___3 = 315, + FN_AVB_RD3___2 = 316, + FN_GETHER_RX_CTL = 317, + FN_QSPI1_SPCLK___3 = 318, + FN_AVB_RD2___2 = 319, + FN_QSPI0_SSL___3 = 320, + FN_AVB_RD1___2 = 321, + FN_QSPI0_IO3___3 = 322, + FN_AVB_RD0___2 = 323, + FN_QSPI0_IO2___3 = 324, + FN_AVB_RXC___2 = 325, + FN_QSPI0_MISO_IO1___3 = 326, + FN_AVB_RX_CTL___2 = 327, + FN_QSPI0_MOSI_IO0___3 = 328, + FN_QSPI0_SPCLK___3 = 329, + FN_IP0_3_0___7 = 330, + FN_DU_DR2___7 = 331, + FN_SCK4___2 = 332, + FN_GETHER_RMII_CRS_DV = 333, + FN_A0___7 = 334, + FN_IP1_3_0___7 = 335, + FN_DU_DG4___7 = 336, + FN_SCL5___2 = 337, + FN_A8___7 = 338, + FN_IP2_3_0___7 = 339, + FN_DU_DB6___7 = 340, + FN_MSIOF3_RXD___2 = 341, + FN_A16___7 = 342, + FN_IP3_3_0___7 = 343, + FN_VI0_CLKENB___2 = 344, + FN_MSIOF2_RXD___2 = 345, + FN_RX3___2 = 346, + FN_RD_WR_N___7 = 347, + FN_HCTS3_N___6 = 348, + FN_IP0_7_4___7 = 349, + FN_DU_DR3___7 = 350, + FN_RX4___2 = 351, + FN_GETHER_RMII_RX_ER = 352, + FN_A1___7 = 353, + FN_IP1_7_4___7 = 354, + FN_DU_DG5___7 = 355, + FN_SDA5___2 = 356, + FN_GETHER_MDC_B = 357, + FN_A9___7 = 358, + FN_IP2_7_4___7 = 359, + FN_DU_DB7___7 = 360, + FN_MSIOF3_TXD___2 = 361, + FN_A17___7 = 362, + FN_IP3_7_4___7 = 363, + FN_VI0_HSYNC_N___2 = 364, + FN_MSIOF2_TXD___2 = 365, + FN_TX3___2 = 366, + FN_HRTS3_N___6 = 367, + FN_IP0_11_8___7 = 368, + FN_DU_DR4___7 = 369, + FN_TX4___2 = 370, + FN_GETHER_RMII_RXD0 = 371, + FN_A2___7 = 372, + FN_IP1_11_8___7 = 373, + FN_DU_DG6___7 = 374, + FN_SCIF_CLK_A___7 = 375, + FN_GETHER_MDIO_B = 376, + FN_A10___7 = 377, + FN_IP2_11_8___7 = 378, + FN_DU_DOTCLKOUT___2 = 379, + FN_MSIOF3_SS1___2 = 380, + FN_GETHER_LINK_B = 381, + FN_A18___7 = 382, + FN_IP3_11_8___7 = 383, + FN_VI0_VSYNC_N___2 = 384, + FN_MSIOF2_SYNC___2 = 385, + FN_CTS3_N___6 = 386, + FN_HTX3___2 = 387, + FN_IP0_15_12___7 = 388, + FN_DU_DR5___7 = 389, + FN_CTS4_N___2 = 390, + FN_GETHER_RMII_RXD1 = 391, + FN_A3___7 = 392, + FN_IP1_15_12___7 = 393, + FN_DU_DG7___7 = 394, + FN_HRX0_A___2 = 395, + FN_A11___7 = 396, + FN_IP2_15_12___7 = 397, + FN_DU_EXHSYNC_DU_HSYNC___6 = 398, + FN_MSIOF3_SS2___2 = 399, + FN_GETHER_PHY_INT_B = 400, + FN_A19___7 = 401, + FN_FXR_TXENA_N___2 = 402, + FN_IP3_15_12___7 = 403, + FN_VI0_DATA0___2 = 404, + FN_MSIOF2_SS1___2 = 405, + FN_RTS3_N___6 = 406, + FN_HRX3___2 = 407, + FN_IP0_19_16___7 = 408, + FN_DU_DR6___7 = 409, + FN_RTS4_N___2 = 410, + FN_GETHER_RMII_TXD_EN = 411, + FN_A4___7 = 412, + FN_IP1_19_16___7 = 413, + FN_DU_DB2___7 = 414, + FN_HSCK0_A___2 = 415, + FN_A12___7 = 416, + FN_IRQ1___7 = 417, + FN_IP2_19_16___7 = 418, + FN_DU_EXVSYNC_DU_VSYNC___6 = 419, + FN_MSIOF3_SCK___2 = 420, + FN_FXR_TXENB_N___2 = 421, + FN_IP3_19_16___7 = 422, + FN_VI0_DATA1___2 = 423, + FN_MSIOF2_SS2___2 = 424, + FN_SCK1___7 = 425, + FN_SPEEDIN_A___7 = 426, + FN_IP0_23_20___7 = 427, + FN_DU_DR7___7 = 428, + FN_GETHER_RMII_TXD0 = 429, + FN_A5___7 = 430, + FN_IP1_23_20___7 = 431, + FN_DU_DB3___7 = 432, + FN_HRTS0_N_A___2 = 433, + FN_A13___7 = 434, + FN_IRQ2___7 = 435, + FN_IP2_23_20___7 = 436, + FN_DU_EXODDF_DU_ODDF_DISP_CDE___6 = 437, + FN_MSIOF3_SYNC___2 = 438, + FN_IP3_23_20___7 = 439, + FN_VI0_DATA2___2 = 440, + FN_AVB_AVTP_PPS___6 = 441, + FN_IP0_27_24___7 = 442, + FN_DU_DG2___7 = 443, + FN_GETHER_RMII_TXD1 = 444, + FN_A6___7 = 445, + FN_IP1_27_24___7 = 446, + FN_DU_DB4___7 = 447, + FN_HCTS0_N_A___2 = 448, + FN_A14___7 = 449, + FN_IRQ3___7 = 450, + FN_IP2_27_24___7 = 451, + FN_IRQ0___7 = 452, + FN_IP3_27_24___7 = 453, + FN_VI0_DATA3___2 = 454, + FN_HSCK1___2 = 455, + FN_IP0_31_28___7 = 456, + FN_DU_DG3___7 = 457, + FN_CPG_CPCKOUT = 458, + FN_GETHER_RMII_REFCLK = 459, + FN_A7___7 = 460, + FN_PWMFSW0___2 = 461, + FN_IP1_31_28___7 = 462, + FN_DU_DB5___7 = 463, + FN_HTX0_A___2 = 464, + FN_PWM0_A___3 = 465, + FN_A15___7 = 466, + FN_IP2_31_28___7 = 467, + FN_VI0_CLK___2 = 468, + FN_MSIOF2_SCK___2 = 469, + FN_SCK3___6 = 470, + FN_HSCK3___6 = 471, + FN_IP3_31_28___7 = 472, + FN_VI0_DATA4___2 = 473, + FN_HRTS1_N___2 = 474, + FN_RX1_A___6 = 475, + FN_IP4_3_0___7 = 476, + FN_VI0_DATA5___2 = 477, + FN_HCTS1_N___2 = 478, + FN_TX1_A___6 = 479, + FN_IP5_3_0___7 = 480, + FN_VI1_CLK___2 = 481, + FN_MSIOF1_RXD___3 = 482, + FN_CS0_N___7 = 483, + FN_IP6_3_0___7 = 484, + FN_VI1_DATA4___2 = 485, + FN_CANFD_CLK_B___2 = 486, + FN_D7___7 = 487, + FN_MMC_D0___2 = 488, + FN_IP7_3_0___7 = 489, + FN_VI1_FIELD___2 = 490, + FN_SDA4___3 = 491, + FN_D15___7 = 492, + FN_MMC_D7___2 = 493, + FN_IP4_7_4___7 = 494, + FN_VI0_DATA6___2 = 495, + FN_HTX1___2 = 496, + FN_CTS1_N___7 = 497, + FN_IP5_7_4___7 = 498, + FN_VI1_CLKENB___2 = 499, + FN_MSIOF1_TXD___3 = 500, + FN_D0___7 = 501, + FN_IP6_7_4___7 = 502, + FN_VI1_DATA5___2 = 503, + FN_D8___7 = 504, + FN_MMC_D1___2 = 505, + FN_IP7_7_4___7 = 506, + FN_SCL0___2 = 507, + FN_CLKOUT___6 = 508, + FN_IP4_11_8___7 = 509, + FN_VI0_DATA7___2 = 510, + FN_HRX1___2 = 511, + FN_RTS1_N___7 = 512, + FN_IP5_11_8___7 = 513, + FN_VI1_HSYNC_N___2 = 514, + FN_MSIOF1_SCK___3 = 515, + FN_D1___7 = 516, + FN_IP6_11_8___7 = 517, + FN_VI1_DATA6___2 = 518, + FN_D9___7 = 519, + FN_MMC_D2___2 = 520, + FN_IP7_11_8___7 = 521, + FN_SDA0___2 = 522, + FN_BS_N___7 = 523, + FN_SCK0___6 = 524, + FN_HSCK0_B___2 = 525, + FN_IP4_15_12___7 = 526, + FN_VI0_DATA8___2 = 527, + FN_HSCK2___2 = 528, + FN_IP5_15_12___7 = 529, + FN_VI1_VSYNC_N___2 = 530, + FN_MSIOF1_SYNC___3 = 531, + FN_D2___7 = 532, + FN_IP6_15_12___7 = 533, + FN_VI1_DATA7___2 = 534, + FN_D10___7 = 535, + FN_MMC_D3___2 = 536, + FN_IP7_15_12___4 = 537, + FN_SCL1___2 = 538, + FN_TPU0TO2___7 = 539, + FN_RD_N___7 = 540, + FN_CTS0_N___6 = 541, + FN_HCTS0_N_B = 542, + FN_IP4_19_16___7 = 543, + FN_VI0_DATA9___2 = 544, + FN_HCTS2_N___2 = 545, + FN_PWM1_A___7 = 546, + FN_IP5_19_16___7 = 547, + FN_VI1_DATA0___2 = 548, + FN_MSIOF1_SS1___3 = 549, + FN_D3___7 = 550, + FN_MMC_WP = 551, + FN_IP6_19_16___7 = 552, + FN_VI1_DATA8___2 = 553, + FN_D11___7 = 554, + FN_MMC_CLK___2 = 555, + FN_IP7_19_16___7 = 556, + FN_SDA1___2 = 557, + FN_TPU0TO3___7 = 558, + FN_WE0_N___7 = 559, + FN_RTS0_N___6 = 560, + FN_HRTS0_N_B = 561, + FN_IP4_23_20___7 = 562, + FN_VI0_DATA10___2 = 563, + FN_HRTS2_N___2 = 564, + FN_PWM2_A___7 = 565, + FN_IP5_23_20___7 = 566, + FN_VI1_DATA1___2 = 567, + FN_MSIOF1_SS2___3 = 568, + FN_D4___7 = 569, + FN_MMC_CD = 570, + FN_IP6_23_20___7 = 571, + FN_VI1_DATA9___2 = 572, + FN_TCLK1_A___7 = 573, + FN_D12___7 = 574, + FN_MMC_D4___2 = 575, + FN_IP7_23_20___7 = 576, + FN_SCL2___2 = 577, + FN_WE1_N___7 = 578, + FN_RX0___6 = 579, + FN_HRX0_B___2 = 580, + FN_IP4_27_24___7 = 581, + FN_VI0_DATA11___2 = 582, + FN_HTX2___2 = 583, + FN_PWM3_A___7 = 584, + FN_IP5_27_24___7 = 585, + FN_VI1_DATA2___2 = 586, + FN_CANFD0_TX_B___6 = 587, + FN_D5___7 = 588, + FN_MMC_DS = 589, + FN_IP6_27_24___7 = 590, + FN_VI1_DATA10___2 = 591, + FN_TCLK2_A___7 = 592, + FN_D13___7 = 593, + FN_MMC_D5___2 = 594, + FN_IP7_27_24___7 = 595, + FN_SDA2___2 = 596, + FN_EX_WAIT0___3 = 597, + FN_TX0___6 = 598, + FN_HTX0_B___2 = 599, + FN_IP4_31_28___7 = 600, + FN_VI0_FIELD___2 = 601, + FN_HRX2___2 = 602, + FN_PWM4_A___7 = 603, + FN_CS1_N___5 = 604, + FN_IP5_31_28___7 = 605, + FN_VI1_DATA3___2 = 606, + FN_CANFD0_RX_B___6 = 607, + FN_D6___7 = 608, + FN_MMC_CMD___2 = 609, + FN_IP6_31_28___7 = 610, + FN_VI1_DATA11___2 = 611, + FN_SCL4___3 = 612, + FN_D14___7 = 613, + FN_MMC_D6___2 = 614, + FN_IP7_31_28___7 = 615, + FN_AVB_AVTP_MATCH___2 = 616, + FN_TPU0TO0___7 = 617, + FN_IP8_3_0___7 = 618, + FN_AVB_AVTP_CAPTURE___2 = 619, + FN_TPU0TO1___7 = 620, + FN_IP9_3_0___6 = 621, + FN_IRQ4___7 = 622, + FN_VI0_DATA12 = 623, + FN_IP10_3_0___6 = 624, + FN_SCL3 = 625, + FN_VI0_DATA20 = 626, + FN_IP8_7_4___7 = 627, + FN_CANFD0_TX_A___6 = 628, + FN_FXR_TXDA___2 = 629, + FN_PWM0_B___3 = 630, + FN_DU_DISP___7 = 631, + FN_IP9_7_4___6 = 632, + FN_IRQ5___7 = 633, + FN_VI0_DATA13 = 634, + FN_IP10_7_4___6 = 635, + FN_SDA3 = 636, + FN_VI0_DATA21 = 637, + FN_IP8_11_8___7 = 638, + FN_CANFD0_RX_A___6 = 639, + FN_RXDA_EXTFXR___2 = 640, + FN_PWM1_B___7 = 641, + FN_DU_CDE___7 = 642, + FN_IP9_11_8___6 = 643, + FN_MSIOF0_RXD___7 = 644, + FN_DU_DR0___7 = 645, + FN_VI0_DATA14 = 646, + FN_IP10_11_8___6 = 647, + FN_FSO_CFE_0_N___4 = 648, + FN_VI0_DATA22 = 649, + FN_IP8_15_12___7 = 650, + FN_CANFD1_TX___7 = 651, + FN_FXR_TXDB___2 = 652, + FN_PWM2_B___7 = 653, + FN_TCLK1_B___7 = 654, + FN_TX1_B___6 = 655, + FN_IP9_15_12___6 = 656, + FN_MSIOF0_TXD___7 = 657, + FN_DU_DR1___7 = 658, + FN_VI0_DATA15 = 659, + FN_IP10_15_12___6 = 660, + FN_FSO_CFE_1_N___4 = 661, + FN_VI0_DATA23 = 662, + FN_IP8_19_16___7 = 663, + FN_CANFD1_RX___7 = 664, + FN_RXDB_EXTFXR___2 = 665, + FN_PWM3_B___7 = 666, + FN_TCLK2_B___7 = 667, + FN_RX1_B___6 = 668, + FN_IP9_19_16___6 = 669, + FN_MSIOF0_SCK___7 = 670, + FN_DU_DG0___7 = 671, + FN_VI0_DATA16 = 672, + FN_IP10_19_16___6 = 673, + FN_FSO_TOE_N___4 = 674, + FN_IP8_23_20___7 = 675, + FN_CANFD_CLK_A___2 = 676, + FN_CLK_EXTFXR___2 = 677, + FN_PWM4_B___7 = 678, + FN_SPEEDIN_B___7 = 679, + FN_SCIF_CLK_B___7 = 680, + FN_IP9_23_20___6 = 681, + FN_MSIOF0_SYNC___7 = 682, + FN_DU_DG1___7 = 683, + FN_VI0_DATA17 = 684, + FN_IP10_23_20___6 = 685, + FN_IP8_27_24___7 = 686, + FN_DIGRF_CLKIN___2 = 687, + FN_DIGRF_CLKEN_IN___2 = 688, + FN_IP9_27_24___6 = 689, + FN_MSIOF0_SS1___7 = 690, + FN_DU_DB0___7 = 691, + FN_TCLK3 = 692, + FN_VI0_DATA18 = 693, + FN_IP10_27_24___6 = 694, + FN_IP8_31_28___7 = 695, + FN_DIGRF_CLKOUT___2 = 696, + FN_DIGRF_CLKEN_OUT___2 = 697, + FN_IP9_31_28___6 = 698, + FN_MSIOF0_SS2___7 = 699, + FN_DU_DB1___7 = 700, + FN_TCLK4 = 701, + FN_VI0_DATA19 = 702, + FN_IP10_31_28___6 = 703, + FN_SEL_CANFD0_0___6 = 704, + FN_SEL_CANFD0_1___6 = 705, + FN_SEL_GETHER_0 = 706, + FN_SEL_GETHER_1 = 707, + FN_SEL_HSCIF0_0___3 = 708, + FN_SEL_HSCIF0_1___3 = 709, + FN_SEL_PWM0_0___3 = 710, + FN_SEL_PWM0_1___3 = 711, + FN_SEL_PWM1_0___7 = 712, + FN_SEL_PWM1_1___7 = 713, + FN_SEL_PWM2_0___7 = 714, + FN_SEL_PWM2_1___7 = 715, + FN_SEL_PWM3_0___7 = 716, + FN_SEL_PWM3_1___7 = 717, + FN_SEL_PWM4_0___7 = 718, + FN_SEL_PWM4_1___7 = 719, + FN_SEL_RSP_0___2 = 720, + FN_SEL_RSP_1___2 = 721, + FN_SEL_SCIF1_0___6 = 722, + FN_SEL_SCIF1_1___6 = 723, + FN_SEL_TMU_0___2 = 724, + FN_SEL_TMU_1___2 = 725, + PINMUX_FUNCTION_END___7 = 726, + PINMUX_MARK_BEGIN___7 = 727, + GETHER_LINK_A_MARK = 728, + GETHER_PHY_INT_A_MARK = 729, + GETHER_MAGIC_MARK = 730, + GETHER_MDC_A_MARK = 731, + GETHER_MDIO_A_MARK = 732, + GETHER_TXCREFCLK_MEGA_MARK = 733, + AVB_LINK_MARK___6 = 734, + GETHER_TXCREFCLK_MARK = 735, + AVB_PHY_INT_MARK___6 = 736, + GETHER_TD3_MARK = 737, + AVB_MAGIC_MARK___6 = 738, + GETHER_TD2_MARK = 739, + AVB_MDC_MARK___6 = 740, + GETHER_TD1_MARK = 741, + AVB_MDIO_MARK___6 = 742, + GETHER_TD0_MARK = 743, + RPC_INT_N_MARK___3 = 744, + AVB_TXCREFCLK_MARK___6 = 745, + GETHER_TXC_MARK = 746, + RPC_WP_N_MARK___2 = 747, + AVB_TD3_MARK___6 = 748, + GETHER_TX_CTL_MARK = 749, + RPC_RESET_N_MARK___3 = 750, + AVB_TD2_MARK___6 = 751, + GETHER_RD3_MARK = 752, + QSPI1_SSL_MARK___7 = 753, + AVB_TD1_MARK___6 = 754, + GETHER_RD2_MARK = 755, + QSPI1_IO3_MARK___7 = 756, + AVB_TD0_MARK___6 = 757, + GETHER_RD1_MARK = 758, + QSPI1_IO2_MARK___7 = 759, + AVB_TXC_MARK___6 = 760, + GETHER_RD0_MARK = 761, + QSPI1_MISO_IO1_MARK___7 = 762, + AVB_TX_CTL_MARK___6 = 763, + GETHER_RXC_MARK = 764, + QSPI1_MOSI_IO0_MARK___7 = 765, + AVB_RD3_MARK___6 = 766, + GETHER_RX_CTL_MARK = 767, + QSPI1_SPCLK_MARK___7 = 768, + AVB_RD2_MARK___6 = 769, + QSPI0_SSL_MARK___7 = 770, + AVB_RD1_MARK___6 = 771, + QSPI0_IO3_MARK___7 = 772, + AVB_RD0_MARK___6 = 773, + QSPI0_IO2_MARK___7 = 774, + AVB_RXC_MARK___6 = 775, + QSPI0_MISO_IO1_MARK___7 = 776, + AVB_RX_CTL_MARK___6 = 777, + QSPI0_MOSI_IO0_MARK___7 = 778, + QSPI0_SPCLK_MARK___7 = 779, + IP0_3_0_MARK___7 = 780, + DU_DR2_MARK___7 = 781, + SCK4_MARK___2 = 782, + GETHER_RMII_CRS_DV_MARK = 783, + A0_MARK___7 = 784, + IP1_3_0_MARK___7 = 785, + DU_DG4_MARK___7 = 786, + SCL5_MARK___6 = 787, + A8_MARK___7 = 788, + IP2_3_0_MARK___7 = 789, + DU_DB6_MARK___7 = 790, + MSIOF3_RXD_MARK___2 = 791, + A16_MARK___7 = 792, + IP3_3_0_MARK___7 = 793, + VI0_CLKENB_MARK___2 = 794, + MSIOF2_RXD_MARK___2 = 795, + RX3_MARK___2 = 796, + RD_WR_N_MARK___7 = 797, + HCTS3_N_MARK___6 = 798, + IP0_7_4_MARK___7 = 799, + DU_DR3_MARK___7 = 800, + RX4_MARK___2 = 801, + GETHER_RMII_RX_ER_MARK = 802, + A1_MARK___7 = 803, + IP1_7_4_MARK___7 = 804, + DU_DG5_MARK___7 = 805, + SDA5_MARK___6 = 806, + GETHER_MDC_B_MARK = 807, + A9_MARK___7 = 808, + IP2_7_4_MARK___7 = 809, + DU_DB7_MARK___7 = 810, + MSIOF3_TXD_MARK___2 = 811, + A17_MARK___7 = 812, + IP3_7_4_MARK___7 = 813, + VI0_HSYNC_N_MARK___2 = 814, + MSIOF2_TXD_MARK___2 = 815, + TX3_MARK___2 = 816, + HRTS3_N_MARK___6 = 817, + IP0_11_8_MARK___7 = 818, + DU_DR4_MARK___7 = 819, + TX4_MARK___2 = 820, + GETHER_RMII_RXD0_MARK = 821, + A2_MARK___7 = 822, + IP1_11_8_MARK___7 = 823, + DU_DG6_MARK___7 = 824, + SCIF_CLK_A_MARK___7 = 825, + GETHER_MDIO_B_MARK = 826, + A10_MARK___7 = 827, + IP2_11_8_MARK___7 = 828, + DU_DOTCLKOUT_MARK___2 = 829, + MSIOF3_SS1_MARK___2 = 830, + GETHER_LINK_B_MARK = 831, + A18_MARK___7 = 832, + IP3_11_8_MARK___7 = 833, + VI0_VSYNC_N_MARK___2 = 834, + MSIOF2_SYNC_MARK___2 = 835, + CTS3_N_MARK___6 = 836, + HTX3_MARK___2 = 837, + IP0_15_12_MARK___7 = 838, + DU_DR5_MARK___7 = 839, + CTS4_N_MARK___2 = 840, + GETHER_RMII_RXD1_MARK = 841, + A3_MARK___7 = 842, + IP1_15_12_MARK___7 = 843, + DU_DG7_MARK___7 = 844, + HRX0_A_MARK___2 = 845, + A11_MARK___7 = 846, + IP2_15_12_MARK___7 = 847, + DU_EXHSYNC_DU_HSYNC_MARK___6 = 848, + MSIOF3_SS2_MARK___2 = 849, + GETHER_PHY_INT_B_MARK = 850, + A19_MARK___7 = 851, + FXR_TXENA_N_MARK___2 = 852, + IP3_15_12_MARK___7 = 853, + VI0_DATA0_MARK___2 = 854, + MSIOF2_SS1_MARK___2 = 855, + RTS3_N_MARK___6 = 856, + HRX3_MARK___2 = 857, + IP0_19_16_MARK___7 = 858, + DU_DR6_MARK___7 = 859, + RTS4_N_MARK___2 = 860, + GETHER_RMII_TXD_EN_MARK = 861, + A4_MARK___7 = 862, + IP1_19_16_MARK___7 = 863, + DU_DB2_MARK___7 = 864, + HSCK0_A_MARK___2 = 865, + A12_MARK___7 = 866, + IRQ1_MARK___7 = 867, + IP2_19_16_MARK___7 = 868, + DU_EXVSYNC_DU_VSYNC_MARK___6 = 869, + MSIOF3_SCK_MARK___2 = 870, + FXR_TXENB_N_MARK___2 = 871, + IP3_19_16_MARK___7 = 872, + VI0_DATA1_MARK___2 = 873, + MSIOF2_SS2_MARK___2 = 874, + SCK1_MARK___7 = 875, + SPEEDIN_A_MARK___7 = 876, + IP0_23_20_MARK___7 = 877, + DU_DR7_MARK___7 = 878, + GETHER_RMII_TXD0_MARK = 879, + A5_MARK___7 = 880, + IP1_23_20_MARK___7 = 881, + DU_DB3_MARK___7 = 882, + HRTS0_N_A_MARK___2 = 883, + A13_MARK___7 = 884, + IRQ2_MARK___7 = 885, + IP2_23_20_MARK___7 = 886, + DU_EXODDF_DU_ODDF_DISP_CDE_MARK___6 = 887, + MSIOF3_SYNC_MARK___2 = 888, + IP3_23_20_MARK___7 = 889, + VI0_DATA2_MARK___2 = 890, + AVB_AVTP_PPS_MARK___6 = 891, + IP0_27_24_MARK___7 = 892, + DU_DG2_MARK___7 = 893, + GETHER_RMII_TXD1_MARK = 894, + A6_MARK___7 = 895, + IP1_27_24_MARK___7 = 896, + DU_DB4_MARK___7 = 897, + HCTS0_N_A_MARK___2 = 898, + A14_MARK___7 = 899, + IRQ3_MARK___7 = 900, + IP2_27_24_MARK___7 = 901, + IRQ0_MARK___7 = 902, + IP3_27_24_MARK___7 = 903, + VI0_DATA3_MARK___2 = 904, + HSCK1_MARK___2 = 905, + IP0_31_28_MARK___7 = 906, + DU_DG3_MARK___7 = 907, + CPG_CPCKOUT_MARK = 908, + GETHER_RMII_REFCLK_MARK = 909, + A7_MARK___7 = 910, + PWMFSW0_MARK___2 = 911, + IP1_31_28_MARK___7 = 912, + DU_DB5_MARK___7 = 913, + HTX0_A_MARK___2 = 914, + PWM0_A_MARK___3 = 915, + A15_MARK___7 = 916, + IP2_31_28_MARK___7 = 917, + VI0_CLK_MARK___2 = 918, + MSIOF2_SCK_MARK___2 = 919, + SCK3_MARK___6 = 920, + HSCK3_MARK___6 = 921, + IP3_31_28_MARK___7 = 922, + VI0_DATA4_MARK___2 = 923, + HRTS1_N_MARK___2 = 924, + RX1_A_MARK___6 = 925, + IP4_3_0_MARK___7 = 926, + VI0_DATA5_MARK___2 = 927, + HCTS1_N_MARK___2 = 928, + TX1_A_MARK___6 = 929, + IP5_3_0_MARK___7 = 930, + VI1_CLK_MARK___2 = 931, + MSIOF1_RXD_MARK___3 = 932, + CS0_N_MARK___7 = 933, + IP6_3_0_MARK___7 = 934, + VI1_DATA4_MARK___2 = 935, + CANFD_CLK_B_MARK___2 = 936, + D7_MARK___7 = 937, + MMC_D0_MARK___2 = 938, + IP7_3_0_MARK___7 = 939, + VI1_FIELD_MARK___2 = 940, + SDA4_MARK___3 = 941, + D15_MARK___7 = 942, + MMC_D7_MARK___2 = 943, + IP4_7_4_MARK___7 = 944, + VI0_DATA6_MARK___2 = 945, + HTX1_MARK___2 = 946, + CTS1_N_MARK___7 = 947, + IP5_7_4_MARK___7 = 948, + VI1_CLKENB_MARK___2 = 949, + MSIOF1_TXD_MARK___3 = 950, + D0_MARK___7 = 951, + IP6_7_4_MARK___7 = 952, + VI1_DATA5_MARK___2 = 953, + D8_MARK___7 = 954, + MMC_D1_MARK___2 = 955, + IP7_7_4_MARK___7 = 956, + SCL0_MARK___6 = 957, + CLKOUT_MARK___7 = 958, + IP4_11_8_MARK___7 = 959, + VI0_DATA7_MARK___2 = 960, + HRX1_MARK___2 = 961, + RTS1_N_MARK___7 = 962, + IP5_11_8_MARK___7 = 963, + VI1_HSYNC_N_MARK___2 = 964, + MSIOF1_SCK_MARK___3 = 965, + D1_MARK___7 = 966, + IP6_11_8_MARK___7 = 967, + VI1_DATA6_MARK___2 = 968, + D9_MARK___7 = 969, + MMC_D2_MARK___2 = 970, + IP7_11_8_MARK___7 = 971, + SDA0_MARK___6 = 972, + BS_N_MARK___7 = 973, + SCK0_MARK___6 = 974, + HSCK0_B_MARK___2 = 975, + IP4_15_12_MARK___7 = 976, + VI0_DATA8_MARK___2 = 977, + HSCK2_MARK___2 = 978, + IP5_15_12_MARK___7 = 979, + VI1_VSYNC_N_MARK___2 = 980, + MSIOF1_SYNC_MARK___3 = 981, + D2_MARK___7 = 982, + IP6_15_12_MARK___7 = 983, + VI1_DATA7_MARK___2 = 984, + D10_MARK___7 = 985, + MMC_D3_MARK___2 = 986, + IP7_15_12_MARK___4 = 987, + SCL1_MARK___2 = 988, + TPU0TO2_MARK___7 = 989, + RD_N_MARK___7 = 990, + CTS0_N_MARK___6 = 991, + HCTS0_N_B_MARK = 992, + IP4_19_16_MARK___7 = 993, + VI0_DATA9_MARK___2 = 994, + HCTS2_N_MARK___2 = 995, + PWM1_A_MARK___7 = 996, + IP5_19_16_MARK___7 = 997, + VI1_DATA0_MARK___2 = 998, + MSIOF1_SS1_MARK___3 = 999, + D3_MARK___7 = 1000, + MMC_WP_MARK = 1001, + IP6_19_16_MARK___7 = 1002, + VI1_DATA8_MARK___2 = 1003, + D11_MARK___7 = 1004, + MMC_CLK_MARK___2 = 1005, + IP7_19_16_MARK___7 = 1006, + SDA1_MARK___2 = 1007, + TPU0TO3_MARK___7 = 1008, + WE0_N_MARK___7 = 1009, + RTS0_N_MARK___6 = 1010, + HRTS0_N_B_MARK = 1011, + IP4_23_20_MARK___7 = 1012, + VI0_DATA10_MARK___2 = 1013, + HRTS2_N_MARK___2 = 1014, + PWM2_A_MARK___7 = 1015, + IP5_23_20_MARK___7 = 1016, + VI1_DATA1_MARK___2 = 1017, + MSIOF1_SS2_MARK___3 = 1018, + D4_MARK___7 = 1019, + MMC_CD_MARK = 1020, + IP6_23_20_MARK___7 = 1021, + VI1_DATA9_MARK___2 = 1022, + TCLK1_A_MARK___7 = 1023, + D12_MARK___7 = 1024, + MMC_D4_MARK___2 = 1025, + IP7_23_20_MARK___7 = 1026, + SCL2_MARK___2 = 1027, + WE1_N_MARK___7 = 1028, + RX0_MARK___6 = 1029, + HRX0_B_MARK___2 = 1030, + IP4_27_24_MARK___7 = 1031, + VI0_DATA11_MARK___2 = 1032, + HTX2_MARK___2 = 1033, + PWM3_A_MARK___7 = 1034, + IP5_27_24_MARK___7 = 1035, + VI1_DATA2_MARK___2 = 1036, + CANFD0_TX_B_MARK___6 = 1037, + D5_MARK___7 = 1038, + MMC_DS_MARK = 1039, + IP6_27_24_MARK___7 = 1040, + VI1_DATA10_MARK___2 = 1041, + TCLK2_A_MARK___7 = 1042, + D13_MARK___7 = 1043, + MMC_D5_MARK___2 = 1044, + IP7_27_24_MARK___7 = 1045, + SDA2_MARK___2 = 1046, + EX_WAIT0_MARK___3 = 1047, + TX0_MARK___6 = 1048, + HTX0_B_MARK___2 = 1049, + IP4_31_28_MARK___7 = 1050, + VI0_FIELD_MARK___2 = 1051, + HRX2_MARK___2 = 1052, + PWM4_A_MARK___7 = 1053, + CS1_N_MARK___5 = 1054, + IP5_31_28_MARK___7 = 1055, + VI1_DATA3_MARK___2 = 1056, + CANFD0_RX_B_MARK___6 = 1057, + D6_MARK___7 = 1058, + MMC_CMD_MARK___2 = 1059, + IP6_31_28_MARK___7 = 1060, + VI1_DATA11_MARK___2 = 1061, + SCL4_MARK___3 = 1062, + D14_MARK___7 = 1063, + MMC_D6_MARK___2 = 1064, + IP7_31_28_MARK___7 = 1065, + AVB_AVTP_MATCH_MARK___2 = 1066, + TPU0TO0_MARK___7 = 1067, + IP8_3_0_MARK___7 = 1068, + AVB_AVTP_CAPTURE_MARK___2 = 1069, + TPU0TO1_MARK___7 = 1070, + IP9_3_0_MARK___6 = 1071, + IRQ4_MARK___7 = 1072, + VI0_DATA12_MARK = 1073, + IP10_3_0_MARK___6 = 1074, + SCL3_MARK___5 = 1075, + VI0_DATA20_MARK = 1076, + IP8_7_4_MARK___7 = 1077, + CANFD0_TX_A_MARK___6 = 1078, + FXR_TXDA_MARK___2 = 1079, + PWM0_B_MARK___3 = 1080, + DU_DISP_MARK___7 = 1081, + IP9_7_4_MARK___6 = 1082, + IRQ5_MARK___7 = 1083, + VI0_DATA13_MARK = 1084, + IP10_7_4_MARK___6 = 1085, + SDA3_MARK___5 = 1086, + VI0_DATA21_MARK = 1087, + IP8_11_8_MARK___7 = 1088, + CANFD0_RX_A_MARK___6 = 1089, + RXDA_EXTFXR_MARK___2 = 1090, + PWM1_B_MARK___7 = 1091, + DU_CDE_MARK___7 = 1092, + IP9_11_8_MARK___6 = 1093, + MSIOF0_RXD_MARK___7 = 1094, + DU_DR0_MARK___7 = 1095, + VI0_DATA14_MARK = 1096, + IP10_11_8_MARK___6 = 1097, + FSO_CFE_0_N_MARK___4 = 1098, + VI0_DATA22_MARK = 1099, + IP8_15_12_MARK___7 = 1100, + CANFD1_TX_MARK___7 = 1101, + FXR_TXDB_MARK___2 = 1102, + PWM2_B_MARK___7 = 1103, + TCLK1_B_MARK___7 = 1104, + TX1_B_MARK___6 = 1105, + IP9_15_12_MARK___6 = 1106, + MSIOF0_TXD_MARK___7 = 1107, + DU_DR1_MARK___7 = 1108, + VI0_DATA15_MARK = 1109, + IP10_15_12_MARK___6 = 1110, + FSO_CFE_1_N_MARK___4 = 1111, + VI0_DATA23_MARK = 1112, + IP8_19_16_MARK___7 = 1113, + CANFD1_RX_MARK___7 = 1114, + RXDB_EXTFXR_MARK___2 = 1115, + PWM3_B_MARK___7 = 1116, + TCLK2_B_MARK___7 = 1117, + RX1_B_MARK___6 = 1118, + IP9_19_16_MARK___6 = 1119, + MSIOF0_SCK_MARK___7 = 1120, + DU_DG0_MARK___7 = 1121, + VI0_DATA16_MARK = 1122, + IP10_19_16_MARK___6 = 1123, + FSO_TOE_N_MARK___4 = 1124, + IP8_23_20_MARK___7 = 1125, + CANFD_CLK_A_MARK___2 = 1126, + CLK_EXTFXR_MARK___2 = 1127, + PWM4_B_MARK___7 = 1128, + SPEEDIN_B_MARK___7 = 1129, + SCIF_CLK_B_MARK___7 = 1130, + IP9_23_20_MARK___6 = 1131, + MSIOF0_SYNC_MARK___7 = 1132, + DU_DG1_MARK___7 = 1133, + VI0_DATA17_MARK = 1134, + IP10_23_20_MARK___6 = 1135, + IP8_27_24_MARK___7 = 1136, + DIGRF_CLKIN_MARK___2 = 1137, + DIGRF_CLKEN_IN_MARK___2 = 1138, + IP9_27_24_MARK___6 = 1139, + MSIOF0_SS1_MARK___7 = 1140, + DU_DB0_MARK___7 = 1141, + TCLK3_MARK = 1142, + VI0_DATA18_MARK = 1143, + IP10_27_24_MARK___6 = 1144, + IP8_31_28_MARK___7 = 1145, + DIGRF_CLKOUT_MARK___2 = 1146, + DIGRF_CLKEN_OUT_MARK___2 = 1147, + IP9_31_28_MARK___6 = 1148, + MSIOF0_SS2_MARK___7 = 1149, + DU_DB1_MARK___7 = 1150, + TCLK4_MARK = 1151, + VI0_DATA19_MARK = 1152, + IP10_31_28_MARK___6 = 1153, + SEL_CANFD0_0_MARK___6 = 1154, + SEL_CANFD0_1_MARK___6 = 1155, + SEL_GETHER_0_MARK = 1156, + SEL_GETHER_1_MARK = 1157, + SEL_HSCIF0_0_MARK___3 = 1158, + SEL_HSCIF0_1_MARK___3 = 1159, + SEL_PWM0_0_MARK___3 = 1160, + SEL_PWM0_1_MARK___3 = 1161, + SEL_PWM1_0_MARK___7 = 1162, + SEL_PWM1_1_MARK___7 = 1163, + SEL_PWM2_0_MARK___7 = 1164, + SEL_PWM2_1_MARK___7 = 1165, + SEL_PWM3_0_MARK___7 = 1166, + SEL_PWM3_1_MARK___7 = 1167, + SEL_PWM4_0_MARK___7 = 1168, + SEL_PWM4_1_MARK___7 = 1169, + SEL_RSP_0_MARK___2 = 1170, + SEL_RSP_1_MARK___2 = 1171, + SEL_SCIF1_0_MARK___6 = 1172, + SEL_SCIF1_1_MARK___6 = 1173, + SEL_TMU_0_MARK___2 = 1174, + SEL_TMU_1_MARK___2 = 1175, + PINMUX_MARK_END___7 = 1176, +}; + +enum { + GP_LAST___7 = 174, + PIN_DCUTCK_LPDCLK = 175, + PIN_DCUTDI_LPDI = 176, + PIN_DCUTMS = 177, + PIN_DCUTRST_N = 178, + PIN_DU_DOTCLKIN___2 = 179, + PIN_EXTALR___6 = 180, + PIN_FSCLKST___3 = 181, + PIN_FSCLKST_N___5 = 182, + PIN_PRESETOUT_N___7 = 183, +}; + +enum ioctrl_regs___4 { + POCCTRL0___3 = 0, + POCCTRL1___2 = 1, + POCCTRL2___2 = 2, + POCCTRL3 = 3, + TDSELCTRL___4 = 4, +}; + +enum { + PINMUX_RESERVED___8 = 0, + PINMUX_DATA_BEGIN___8 = 1, + GP_0_0_DATA___8 = 2, + GP_0_1_DATA___8 = 3, + GP_0_2_DATA___8 = 4, + GP_0_3_DATA___8 = 5, + GP_0_4_DATA___8 = 6, + GP_0_5_DATA___8 = 7, + GP_0_6_DATA___8 = 8, + GP_0_7_DATA___8 = 9, + GP_0_8_DATA___8 = 10, + GP_1_0_DATA___8 = 11, + GP_1_1_DATA___8 = 12, + GP_1_2_DATA___8 = 13, + GP_1_3_DATA___8 = 14, + GP_1_4_DATA___8 = 15, + GP_1_5_DATA___8 = 16, + GP_1_6_DATA___8 = 17, + GP_1_7_DATA___8 = 18, + GP_1_8_DATA___8 = 19, + GP_1_9_DATA___8 = 20, + GP_1_10_DATA___8 = 21, + GP_1_11_DATA___8 = 22, + GP_1_12_DATA___8 = 23, + GP_1_13_DATA___8 = 24, + GP_1_14_DATA___8 = 25, + GP_1_15_DATA___8 = 26, + GP_1_16_DATA___8 = 27, + GP_1_17_DATA___8 = 28, + GP_1_18_DATA___8 = 29, + GP_1_19_DATA___8 = 30, + GP_1_20_DATA___8 = 31, + GP_1_21_DATA___8 = 32, + GP_1_22_DATA___8 = 33, + GP_1_23_DATA___7 = 34, + GP_1_24_DATA___7 = 35, + GP_1_25_DATA___7 = 36, + GP_1_26_DATA___7 = 37, + GP_1_27_DATA___7 = 38, + GP_1_28_DATA___4 = 39, + GP_1_29_DATA = 40, + GP_1_30_DATA = 41, + GP_1_31_DATA = 42, + GP_2_0_DATA___8 = 43, + GP_2_1_DATA___8 = 44, + GP_2_2_DATA___8 = 45, + GP_2_3_DATA___8 = 46, + GP_2_4_DATA___8 = 47, + GP_2_5_DATA___8 = 48, + GP_2_6_DATA___8 = 49, + GP_2_7_DATA___8 = 50, + GP_2_8_DATA___8 = 51, + GP_2_9_DATA___8 = 52, + GP_2_10_DATA___8 = 53, + GP_2_11_DATA___8 = 54, + GP_2_12_DATA___8 = 55, + GP_2_13_DATA___8 = 56, + GP_2_14_DATA___8 = 57, + GP_2_15_DATA___4 = 58, + GP_2_16_DATA___4 = 59, + GP_2_17_DATA___3 = 60, + GP_2_18_DATA___3 = 61, + GP_2_19_DATA___3 = 62, + GP_2_20_DATA___3 = 63, + GP_2_21_DATA___3 = 64, + GP_2_22_DATA___3 = 65, + GP_2_23_DATA___3 = 66, + GP_2_24_DATA___3 = 67, + GP_2_25_DATA___3 = 68, + GP_2_26_DATA___2 = 69, + GP_2_27_DATA___2 = 70, + GP_2_28_DATA___2 = 71, + GP_2_29_DATA___2 = 72, + GP_2_30_DATA = 73, + GP_2_31_DATA = 74, + GP_3_0_DATA___8 = 75, + GP_3_1_DATA___8 = 76, + GP_3_2_DATA___8 = 77, + GP_3_3_DATA___8 = 78, + GP_3_4_DATA___8 = 79, + GP_3_5_DATA___8 = 80, + GP_3_6_DATA___8 = 81, + GP_3_7_DATA___8 = 82, + GP_3_8_DATA___8 = 83, + GP_3_9_DATA___8 = 84, + GP_4_0_DATA___8 = 85, + GP_4_1_DATA___8 = 86, + GP_4_2_DATA___8 = 87, + GP_4_3_DATA___8 = 88, + GP_4_4_DATA___8 = 89, + GP_4_5_DATA___8 = 90, + GP_4_6_DATA___7 = 91, + GP_4_7_DATA___7 = 92, + GP_4_8_DATA___7 = 93, + GP_4_9_DATA___7 = 94, + GP_4_10_DATA___7 = 95, + GP_4_11_DATA___6 = 96, + GP_4_12_DATA___6 = 97, + GP_4_13_DATA___6 = 98, + GP_4_14_DATA___6 = 99, + GP_4_15_DATA___6 = 100, + GP_4_16_DATA___6 = 101, + GP_4_17_DATA___6 = 102, + GP_4_18_DATA___2 = 103, + GP_4_19_DATA___2 = 104, + GP_4_20_DATA___2 = 105, + GP_4_21_DATA___2 = 106, + GP_4_22_DATA___2 = 107, + GP_4_23_DATA___2 = 108, + GP_4_24_DATA___2 = 109, + GP_4_25_DATA = 110, + GP_4_26_DATA = 111, + GP_4_27_DATA = 112, + GP_4_28_DATA = 113, + GP_4_29_DATA = 114, + GP_4_30_DATA = 115, + GP_4_31_DATA = 116, + GP_5_0_DATA___8 = 117, + GP_5_1_DATA___8 = 118, + GP_5_2_DATA___8 = 119, + GP_5_3_DATA___8 = 120, + GP_5_4_DATA___8 = 121, + GP_5_5_DATA___8 = 122, + GP_5_6_DATA___8 = 123, + GP_5_7_DATA___8 = 124, + GP_5_8_DATA___8 = 125, + GP_5_9_DATA___8 = 126, + GP_5_10_DATA___8 = 127, + GP_5_11_DATA___8 = 128, + GP_5_12_DATA___8 = 129, + GP_5_13_DATA___8 = 130, + GP_5_14_DATA___8 = 131, + GP_5_15_DATA___6 = 132, + GP_5_16_DATA___6 = 133, + GP_5_17_DATA___6 = 134, + GP_5_18_DATA___6 = 135, + GP_5_19_DATA___6 = 136, + GP_5_20_DATA___5 = 137, + GP_6_0_DATA___6 = 138, + GP_6_1_DATA___6 = 139, + GP_6_2_DATA___6 = 140, + GP_6_3_DATA___6 = 141, + GP_6_4_DATA___6 = 142, + GP_6_5_DATA___6 = 143, + GP_6_6_DATA___6 = 144, + GP_6_7_DATA___6 = 145, + GP_6_8_DATA___6 = 146, + GP_6_9_DATA___6 = 147, + GP_6_10_DATA___6 = 148, + GP_6_11_DATA___6 = 149, + GP_6_12_DATA___6 = 150, + GP_6_13_DATA___6 = 151, + PINMUX_DATA_END___8 = 152, + PINMUX_FUNCTION_BEGIN___8 = 153, + GP_0_0_FN___8 = 154, + GP_0_1_FN___8 = 155, + GP_0_2_FN___8 = 156, + GP_0_3_FN___8 = 157, + GP_0_4_FN___8 = 158, + GP_0_5_FN___8 = 159, + GP_0_6_FN___8 = 160, + GP_0_7_FN___8 = 161, + GP_0_8_FN___8 = 162, + GP_1_0_FN___8 = 163, + GP_1_1_FN___8 = 164, + GP_1_2_FN___8 = 165, + GP_1_3_FN___8 = 166, + GP_1_4_FN___8 = 167, + GP_1_5_FN___8 = 168, + GP_1_6_FN___8 = 169, + GP_1_7_FN___8 = 170, + GP_1_8_FN___8 = 171, + GP_1_9_FN___8 = 172, + GP_1_10_FN___8 = 173, + GP_1_11_FN___8 = 174, + GP_1_12_FN___8 = 175, + GP_1_13_FN___8 = 176, + GP_1_14_FN___8 = 177, + GP_1_15_FN___8 = 178, + GP_1_16_FN___8 = 179, + GP_1_17_FN___8 = 180, + GP_1_18_FN___8 = 181, + GP_1_19_FN___8 = 182, + GP_1_20_FN___8 = 183, + GP_1_21_FN___8 = 184, + GP_1_22_FN___8 = 185, + GP_1_23_FN___7 = 186, + GP_1_24_FN___7 = 187, + GP_1_25_FN___7 = 188, + GP_1_26_FN___7 = 189, + GP_1_27_FN___7 = 190, + GP_1_28_FN___4 = 191, + GP_1_29_FN = 192, + GP_1_30_FN = 193, + GP_1_31_FN = 194, + GP_2_0_FN___8 = 195, + GP_2_1_FN___8 = 196, + GP_2_2_FN___8 = 197, + GP_2_3_FN___8 = 198, + GP_2_4_FN___8 = 199, + GP_2_5_FN___8 = 200, + GP_2_6_FN___8 = 201, + GP_2_7_FN___8 = 202, + GP_2_8_FN___8 = 203, + GP_2_9_FN___8 = 204, + GP_2_10_FN___8 = 205, + GP_2_11_FN___8 = 206, + GP_2_12_FN___8 = 207, + GP_2_13_FN___8 = 208, + GP_2_14_FN___8 = 209, + GP_2_15_FN___4 = 210, + GP_2_16_FN___4 = 211, + GP_2_17_FN___3 = 212, + GP_2_18_FN___3 = 213, + GP_2_19_FN___3 = 214, + GP_2_20_FN___3 = 215, + GP_2_21_FN___3 = 216, + GP_2_22_FN___3 = 217, + GP_2_23_FN___3 = 218, + GP_2_24_FN___3 = 219, + GP_2_25_FN___3 = 220, + GP_2_26_FN___2 = 221, + GP_2_27_FN___2 = 222, + GP_2_28_FN___2 = 223, + GP_2_29_FN___2 = 224, + GP_2_30_FN = 225, + GP_2_31_FN = 226, + GP_3_0_FN___8 = 227, + GP_3_1_FN___8 = 228, + GP_3_2_FN___8 = 229, + GP_3_3_FN___8 = 230, + GP_3_4_FN___8 = 231, + GP_3_5_FN___8 = 232, + GP_3_6_FN___8 = 233, + GP_3_7_FN___8 = 234, + GP_3_8_FN___8 = 235, + GP_3_9_FN___8 = 236, + GP_4_0_FN___8 = 237, + GP_4_1_FN___8 = 238, + GP_4_2_FN___8 = 239, + GP_4_3_FN___8 = 240, + GP_4_4_FN___8 = 241, + GP_4_5_FN___8 = 242, + GP_4_6_FN___7 = 243, + GP_4_7_FN___7 = 244, + GP_4_8_FN___7 = 245, + GP_4_9_FN___7 = 246, + GP_4_10_FN___7 = 247, + GP_4_11_FN___6 = 248, + GP_4_12_FN___6 = 249, + GP_4_13_FN___6 = 250, + GP_4_14_FN___6 = 251, + GP_4_15_FN___6 = 252, + GP_4_16_FN___6 = 253, + GP_4_17_FN___6 = 254, + GP_4_18_FN___2 = 255, + GP_4_19_FN___2 = 256, + GP_4_20_FN___2 = 257, + GP_4_21_FN___2 = 258, + GP_4_22_FN___2 = 259, + GP_4_23_FN___2 = 260, + GP_4_24_FN___2 = 261, + GP_4_25_FN = 262, + GP_4_26_FN = 263, + GP_4_27_FN = 264, + GP_4_28_FN = 265, + GP_4_29_FN = 266, + GP_4_30_FN = 267, + GP_4_31_FN = 268, + GP_5_0_FN___8 = 269, + GP_5_1_FN___8 = 270, + GP_5_2_FN___8 = 271, + GP_5_3_FN___8 = 272, + GP_5_4_FN___8 = 273, + GP_5_5_FN___8 = 274, + GP_5_6_FN___8 = 275, + GP_5_7_FN___8 = 276, + GP_5_8_FN___8 = 277, + GP_5_9_FN___8 = 278, + GP_5_10_FN___8 = 279, + GP_5_11_FN___8 = 280, + GP_5_12_FN___8 = 281, + GP_5_13_FN___8 = 282, + GP_5_14_FN___8 = 283, + GP_5_15_FN___6 = 284, + GP_5_16_FN___6 = 285, + GP_5_17_FN___6 = 286, + GP_5_18_FN___6 = 287, + GP_5_19_FN___6 = 288, + GP_5_20_FN___5 = 289, + GP_6_0_FN___6 = 290, + GP_6_1_FN___6 = 291, + GP_6_2_FN___6 = 292, + GP_6_3_FN___6 = 293, + GP_6_4_FN___6 = 294, + GP_6_5_FN___6 = 295, + GP_6_6_FN___6 = 296, + GP_6_7_FN___6 = 297, + GP_6_8_FN___6 = 298, + GP_6_9_FN___6 = 299, + GP_6_10_FN___6 = 300, + GP_6_11_FN___6 = 301, + GP_6_12_FN___6 = 302, + GP_6_13_FN___6 = 303, + FN_TX2 = 304, + FN_RX2 = 305, + FN_AVB0_LINK___2 = 306, + FN_AVB0_PHY_INT___2 = 307, + FN_AVB0_MAGIC___2 = 308, + FN_AVB0_MDC___2 = 309, + FN_AVB0_MDIO___2 = 310, + FN_MSIOF0_RXD___8 = 311, + FN_AVB0_TXCREFCLK___2 = 312, + FN_MSIOF0_TXD___8 = 313, + FN_AVB0_TD3___2 = 314, + FN_MSIOF0_SYNC___8 = 315, + FN_AVB0_TD2___2 = 316, + FN_RPC_INT_N___4 = 317, + FN_MSIOF0_SCK___8 = 318, + FN_AVB0_TD1___2 = 319, + FN_RPC_RESET_N___4 = 320, + FN_AVB0_TD0___2 = 321, + FN_QSPI1_SSL___4 = 322, + FN_AVB0_TXC___2 = 323, + FN_QSPI1_IO3___4 = 324, + FN_SDA0___3 = 325, + FN_AVB0_TX_CTL___2 = 326, + FN_QSPI1_IO2___4 = 327, + FN_SCL0___3 = 328, + FN_AVB0_RD3___2 = 329, + FN_QSPI1_MISO_IO1___4 = 330, + FN_AVB0_RD2___2 = 331, + FN_QSPI1_MOSI_IO0___4 = 332, + FN_AVB0_RD1___2 = 333, + FN_QSPI1_SPCLK___4 = 334, + FN_VI4_DATA4 = 335, + FN_AVB0_RD0___2 = 336, + FN_QSPI0_SSL___4 = 337, + FN_AVB0_RXC___2 = 338, + FN_QSPI0_IO3___4 = 339, + FN_AVB0_RX_CTL___2 = 340, + FN_QSPI0_IO2___4 = 341, + FN_QSPI0_MISO_IO1___4 = 342, + FN_USB0_OVC___5 = 343, + FN_QSPI0_MOSI_IO0___4 = 344, + FN_USB0_PWEN___5 = 345, + FN_VI4_CLK___6 = 346, + FN_QSPI0_SPCLK___4 = 347, + FN_IP0_3_0___8 = 348, + FN_IRQ0_A = 349, + FN_MSIOF2_SYNC_B___6 = 350, + FN_IP1_3_0___8 = 351, + FN_DU_DB1___8 = 352, + FN_LCDOUT1___6 = 353, + FN_MSIOF3_RXD_B___6 = 354, + FN_IP2_3_0___8 = 355, + FN_DU_DG1___8 = 356, + FN_LCDOUT9___6 = 357, + FN_MSIOF3_SYNC_B___6 = 358, + FN_IP3_3_0___8 = 359, + FN_DU_DR1___8 = 360, + FN_LCDOUT17___6 = 361, + FN_TX4_B___6 = 362, + FN_IP0_7_4___8 = 363, + FN_MSIOF2_SCK___3 = 364, + FN_IP1_7_4___8 = 365, + FN_DU_DB2___8 = 366, + FN_LCDOUT2___6 = 367, + FN_IRQ0_B = 368, + FN_IP2_7_4___8 = 369, + FN_DU_DG2___8 = 370, + FN_LCDOUT10___6 = 371, + FN_IP3_7_4___8 = 372, + FN_DU_DR2___8 = 373, + FN_LCDOUT18___6 = 374, + FN_PWM0_B___4 = 375, + FN_IP0_11_8___8 = 376, + FN_MSIOF2_TXD___3 = 377, + FN_SCL3_A___2 = 378, + FN_IP1_11_8___8 = 379, + FN_DU_DB3___8 = 380, + FN_LCDOUT3___6 = 381, + FN_SCK5_B___4 = 382, + FN_IP2_11_8___8 = 383, + FN_DU_DG3___8 = 384, + FN_LCDOUT11___6 = 385, + FN_IRQ1_A = 386, + FN_IP3_11_8___8 = 387, + FN_DU_DR3___8 = 388, + FN_LCDOUT19___6 = 389, + FN_PWM1_B___8 = 390, + FN_IP0_15_12___8 = 391, + FN_MSIOF2_RXD___3 = 392, + FN_SDA3_A___2 = 393, + FN_IP1_15_12___8 = 394, + FN_DU_DB4___8 = 395, + FN_LCDOUT4___6 = 396, + FN_RX5_B___5 = 397, + FN_IP2_15_12___8 = 398, + FN_DU_DG4___8 = 399, + FN_LCDOUT12___6 = 400, + FN_HSCK3_B___2 = 401, + FN_IP3_15_12___8 = 402, + FN_DU_DR4___8 = 403, + FN_LCDOUT20___6 = 404, + FN_TCLK2_B___8 = 405, + FN_IP0_19_16___8 = 406, + FN_MLB_CLK___6 = 407, + FN_MSIOF2_SYNC_A___6 = 408, + FN_SCK5_A___5 = 409, + FN_IP1_19_16___8 = 410, + FN_DU_DB5___8 = 411, + FN_LCDOUT5___6 = 412, + FN_TX5_B___5 = 413, + FN_IP2_19_16___8 = 414, + FN_DU_DG5___8 = 415, + FN_LCDOUT13___6 = 416, + FN_HTX3_B___6 = 417, + FN_IP3_19_16___8 = 418, + FN_DU_DR5___8 = 419, + FN_LCDOUT21___6 = 420, + FN_NMI = 421, + FN_IP0_23_20___8 = 422, + FN_MLB_DAT___6 = 423, + FN_MSIOF2_SS1___3 = 424, + FN_RX5_A___5 = 425, + FN_SCL3_B___2 = 426, + FN_IP1_23_20___8 = 427, + FN_DU_DB6___8 = 428, + FN_LCDOUT6___6 = 429, + FN_MSIOF3_SS1_B___6 = 430, + FN_IP2_23_20___8 = 431, + FN_DU_DG6___8 = 432, + FN_LCDOUT14___6 = 433, + FN_HRX3_B___6 = 434, + FN_IP3_23_20___8 = 435, + FN_DU_DR6___8 = 436, + FN_LCDOUT22___6 = 437, + FN_PWM2_B___8 = 438, + FN_IP0_27_24___8 = 439, + FN_MLB_SIG___6 = 440, + FN_MSIOF2_SS2___3 = 441, + FN_TX5_A___5 = 442, + FN_SDA3_B___2 = 443, + FN_IP1_27_24___8 = 444, + FN_DU_DB7___8 = 445, + FN_LCDOUT7___6 = 446, + FN_MSIOF3_SS2_B___5 = 447, + FN_IP2_27_24___8 = 448, + FN_DU_DG7___8 = 449, + FN_LCDOUT15___6 = 450, + FN_SCK4_B___6 = 451, + FN_IP3_27_24___8 = 452, + FN_DU_DR7___8 = 453, + FN_LCDOUT23___6 = 454, + FN_TCLK1_B___8 = 455, + FN_IP0_31_28___8 = 456, + FN_DU_DB0___8 = 457, + FN_LCDOUT0___6 = 458, + FN_MSIOF3_TXD_B___6 = 459, + FN_IP1_31_28___8 = 460, + FN_DU_DG0___8 = 461, + FN_LCDOUT8___6 = 462, + FN_MSIOF3_SCK_B___6 = 463, + FN_IP2_31_28___8 = 464, + FN_DU_DR0___8 = 465, + FN_LCDOUT16___6 = 466, + FN_RX4_B___6 = 467, + FN_IP3_31_28___8 = 468, + FN_DU_DOTCLKOUT0___6 = 469, + FN_QCLK___6 = 470, + FN_IP4_3_0___8 = 471, + FN_DU_HSYNC___2 = 472, + FN_QSTH_QHS___6 = 473, + FN_IRQ3_A = 474, + FN_IP5_3_0___8 = 475, + FN_VI4_DATA1 = 476, + FN_PWM1_A___8 = 477, + FN_IP6_3_0___8 = 478, + FN_VI4_DATA10___6 = 479, + FN_RX4_A___6 = 480, + FN_IP7_3_0___8 = 481, + FN_VI4_DATA18___6 = 482, + FN_HSCK3_A = 483, + FN_IP4_7_4___8 = 484, + FN_DU_VSYNC___2 = 485, + FN_QSTVA_QVS___6 = 486, + FN_IRQ4_A = 487, + FN_IP5_7_4___8 = 488, + FN_VI4_DATA2 = 489, + FN_PWM2_A___8 = 490, + FN_IP6_7_4___8 = 491, + FN_VI4_DATA11___6 = 492, + FN_TX4_A___6 = 493, + FN_IP7_7_4___8 = 494, + FN_VI4_DATA19___6 = 495, + FN_SSI_WS4_B = 496, + FN_NFDATA15 = 497, + FN_IP4_11_8___8 = 498, + FN_DU_DISP___8 = 499, + FN_QSTVB_QVE___6 = 500, + FN_PWM3_B___8 = 501, + FN_IP5_11_8___8 = 502, + FN_VI4_DATA3 = 503, + FN_PWM3_A___8 = 504, + FN_IP6_11_8___8 = 505, + FN_VI4_DATA12___6 = 506, + FN_TCLK1_A___8 = 507, + FN_IP7_11_8___8 = 508, + FN_VI4_DATA20___6 = 509, + FN_MSIOF3_SYNC_A___6 = 510, + FN_NFDATA14 = 511, + FN_IP4_15_12___8 = 512, + FN_DU_DISP_CDE___2 = 513, + FN_QCPV_QDE___6 = 514, + FN_IRQ2_B = 515, + FN_DU_DOTCLKIN1___2 = 516, + FN_IP5_15_12___8 = 517, + FN_VI4_DATA5 = 518, + FN_SCK4_A___6 = 519, + FN_IP6_15_12___8 = 520, + FN_VI4_DATA13___6 = 521, + FN_MSIOF3_SS1_A___6 = 522, + FN_HCTS3_N___7 = 523, + FN_IP7_15_12___5 = 524, + FN_VI4_DATA21___6 = 525, + FN_MSIOF3_TXD_A___6 = 526, + FN_NFDATA13___5 = 527, + FN_IP4_19_16___8 = 528, + FN_DU_CDE___8 = 529, + FN_QSTB_QHE___6 = 530, + FN_SCK3_B = 531, + FN_IP5_19_16___8 = 532, + FN_VI4_DATA6 = 533, + FN_IRQ2_A = 534, + FN_IP6_19_16___8 = 535, + FN_VI4_DATA14___6 = 536, + FN_SSI_SCK4_B = 537, + FN_HRTS3_N___7 = 538, + FN_IP7_19_16___8 = 539, + FN_VI4_DATA22___6 = 540, + FN_MSIOF3_RXD_A___6 = 541, + FN_NFDATA12___5 = 542, + FN_IP4_23_20___8 = 543, + FN_QPOLA___6 = 544, + FN_RX3_B___6 = 545, + FN_IP5_23_20___8 = 546, + FN_VI4_DATA7 = 547, + FN_TCLK2_A___8 = 548, + FN_IP6_23_20___8 = 549, + FN_VI4_DATA15___6 = 550, + FN_SSI_SDATA4_B = 551, + FN_IP7_23_20___8 = 552, + FN_VI4_DATA23___6 = 553, + FN_MSIOF3_SCK_A___6 = 554, + FN_NFDATA11___5 = 555, + FN_IP4_27_24___8 = 556, + FN_QPOLB___6 = 557, + FN_TX3_B___6 = 558, + FN_IP5_27_24___8 = 559, + FN_VI4_DATA8___6 = 560, + FN_IP6_27_24___8 = 561, + FN_VI4_DATA16___6 = 562, + FN_HRX3_A___6 = 563, + FN_IP7_27_24___8 = 564, + FN_VI4_VSYNC_N___6 = 565, + FN_SCK1_B = 566, + FN_NFDATA10___5 = 567, + FN_IP4_31_28___8 = 568, + FN_VI4_DATA0 = 569, + FN_PWM0_A___4 = 570, + FN_IP5_31_28___8 = 571, + FN_VI4_DATA9___6 = 572, + FN_MSIOF3_SS2_A___6 = 573, + FN_IRQ1_B = 574, + FN_IP6_31_28___8 = 575, + FN_VI4_DATA17___6 = 576, + FN_HTX3_A___6 = 577, + FN_IP7_31_28___8 = 578, + FN_VI4_HSYNC_N___6 = 579, + FN_RX1_B___7 = 580, + FN_NFDATA9___5 = 581, + FN_IP8_3_0___8 = 582, + FN_VI4_FIELD___6 = 583, + FN_AUDIO_CLKB = 584, + FN_IRQ5_A = 585, + FN_SCIF_CLK = 586, + FN_NFDATA8___5 = 587, + FN_IP9_3_0___7 = 588, + FN_NFDATA0___5 = 589, + FN_MMC_D0___3 = 590, + FN_IP10_3_0___7 = 591, + FN_AUDIO_CLKA___2 = 592, + FN_DVC_MUTE_B = 593, + FN_IP11_3_0___6 = 594, + FN_SDA1___3 = 595, + FN_RTS1_N___8 = 596, + FN_IP8_7_4___8 = 597, + FN_VI4_CLKENB___6 = 598, + FN_TX1_B___7 = 599, + FN_NFWP_N = 600, + FN_DVC_MUTE_A = 601, + FN_IP9_7_4___7 = 602, + FN_NFDATA1___5 = 603, + FN_MMC_D1___3 = 604, + FN_IP10_7_4___7 = 605, + FN_SSI_SCK34 = 606, + FN_FSO_CFE_0_N_A___3 = 607, + FN_IP11_7_4___6 = 608, + FN_MSIOF1_SCK___4 = 609, + FN_AVB0_AVTP_PPS_B = 610, + FN_IP8_11_8___8 = 611, + FN_NFALE___4 = 612, + FN_SCL2_B___6 = 613, + FN_IRQ3_B = 614, + FN_PWM0_C = 615, + FN_IP9_11_8___7 = 616, + FN_NFDATA2___5 = 617, + FN_MMC_D2___3 = 618, + FN_IP10_11_8___7 = 619, + FN_SSI_SDATA3___6 = 620, + FN_FSO_CFE_1_N_A___3 = 621, + FN_IP11_11_8___6 = 622, + FN_MSIOF1_TXD___4 = 623, + FN_AVB0_AVTP_CAPTURE_B = 624, + FN_IP8_15_12___8 = 625, + FN_NFCLE___5 = 626, + FN_SDA2_B___6 = 627, + FN_SCK3_A___2 = 628, + FN_PWM1_C = 629, + FN_IP9_15_12___7 = 630, + FN_NFDATA3___5 = 631, + FN_MMC_D3___3 = 632, + FN_IP10_15_12___7 = 633, + FN_SSI_WS34 = 634, + FN_FSO_TOE_N_A___3 = 635, + FN_IP11_15_12___6 = 636, + FN_MSIOF1_RXD___4 = 637, + FN_AVB0_AVTP_MATCH_B = 638, + FN_IP8_19_16___8 = 639, + FN_NFCE_N = 640, + FN_RX3_A___6 = 641, + FN_PWM2_C___2 = 642, + FN_IP9_19_16___7 = 643, + FN_NFDATA4___5 = 644, + FN_MMC_D4___3 = 645, + FN_IP10_19_16___7 = 646, + FN_SSI_SCK4_A = 647, + FN_HSCK0___6 = 648, + FN_AUDIO_CLKOUT = 649, + FN_CAN0_RX_B___5 = 650, + FN_IRQ4_B = 651, + FN_IP11_19_16___6 = 652, + FN_SCK0_A___2 = 653, + FN_MSIOF1_SYNC___4 = 654, + FN_FSO_CFE_0_N_B___3 = 655, + FN_IP8_23_20___8 = 656, + FN_NFRB_N = 657, + FN_TX3_A___6 = 658, + FN_PWM3_C___2 = 659, + FN_IP9_23_20___7 = 660, + FN_NFDATA5___5 = 661, + FN_MMC_D5___3 = 662, + FN_IP10_23_20___7 = 663, + FN_SSI_SDATA4_A = 664, + FN_HTX0___6 = 665, + FN_SCL2_A___6 = 666, + FN_CAN1_RX_B = 667, + FN_IP11_23_20___6 = 668, + FN_RX0_A___2 = 669, + FN_MSIOF0_SS1___8 = 670, + FN_FSO_CFE_1_N_B___3 = 671, + FN_IP8_27_24___8 = 672, + FN_NFRE_N___5 = 673, + FN_MMC_CMD___3 = 674, + FN_IP9_27_24___7 = 675, + FN_NFDATA6___5 = 676, + FN_MMC_D6___3 = 677, + FN_IP10_27_24___7 = 678, + FN_SSI_WS4_A = 679, + FN_HRX0___6 = 680, + FN_SDA2_A___6 = 681, + FN_CAN1_TX_B = 682, + FN_IP11_27_24___6 = 683, + FN_TX0_A___2 = 684, + FN_MSIOF0_SS2___8 = 685, + FN_FSO_TOE_N_B___3 = 686, + FN_IP8_31_28___8 = 687, + FN_NFWE_N___5 = 688, + FN_MMC_CLK___3 = 689, + FN_IP9_31_28___7 = 690, + FN_NFDATA7___5 = 691, + FN_MMC_D7___3 = 692, + FN_IP10_31_28___7 = 693, + FN_SCL1___3 = 694, + FN_CTS1_N___8 = 695, + FN_IP11_31_28___6 = 696, + FN_SCK1_A = 697, + FN_MSIOF1_SS2___4 = 698, + FN_TPU0TO2_B = 699, + FN_CAN0_TX_B___5 = 700, + FN_AUDIO_CLKOUT1 = 701, + FN_IP12_3_0___6 = 702, + FN_RX1_A___7 = 703, + FN_CTS0_N___7 = 704, + FN_TPU0TO0_B = 705, + FN_IP13_3_0___6 = 706, + FN_CAN1_RX_A = 707, + FN_CANFD1_RX___8 = 708, + FN_TPU0TO2_A = 709, + FN_IP12_7_4___6 = 710, + FN_TX1_A___7 = 711, + FN_RTS0_N___7 = 712, + FN_TPU0TO1_B = 713, + FN_IP13_7_4___6 = 714, + FN_CAN1_TX_A = 715, + FN_CANFD1_TX___8 = 716, + FN_TPU0TO3_A = 717, + FN_IP12_11_8___6 = 718, + FN_SCK2___5 = 719, + FN_MSIOF1_SS1___4 = 720, + FN_TPU0TO3_B = 721, + FN_IP12_15_12___6 = 722, + FN_TPU0TO0_A = 723, + FN_AVB0_AVTP_CAPTURE_A = 724, + FN_HCTS0_N___6 = 725, + FN_IP12_19_16___6 = 726, + FN_TPU0TO1_A = 727, + FN_AVB0_AVTP_MATCH_A = 728, + FN_HRTS0_N___6 = 729, + FN_IP12_23_20___6 = 730, + FN_CAN_CLK___6 = 731, + FN_AVB0_AVTP_PPS_A = 732, + FN_SCK0_B___2 = 733, + FN_IRQ5_B = 734, + FN_IP12_27_24___6 = 735, + FN_CAN0_RX_A___5 = 736, + FN_CANFD0_RX___2 = 737, + FN_RX0_B___2 = 738, + FN_IP12_31_28___6 = 739, + FN_CAN0_TX_A___5 = 740, + FN_CANFD0_TX___2 = 741, + FN_TX0_B___2 = 742, + FN_SEL_CAN0_0 = 743, + FN_SEL_CAN0_1 = 744, + FN_SEL_MSIOF2_0___6 = 745, + FN_SEL_MSIOF2_1___6 = 746, + FN_SEL_CAN1_0 = 747, + FN_SEL_CAN1_1 = 748, + FN_SEL_I2C3_0___2 = 749, + FN_SEL_I2C3_1___2 = 750, + FN_SEL_I2C2_0___6 = 751, + FN_SEL_I2C2_1___6 = 752, + FN_SEL_SCIF5_0___5 = 753, + FN_SEL_SCIF5_1___5 = 754, + FN_SEL_ETHERAVB_0___5 = 755, + FN_SEL_ETHERAVB_1___5 = 756, + FN_SEL_MSIOF3_0___6 = 757, + FN_SEL_MSIOF3_1___6 = 758, + FN_SEL_SCIF0_0___2 = 759, + FN_SEL_SCIF0_1___2 = 760, + FN_SEL_HSCIF3_0___6 = 761, + FN_SEL_HSCIF3_1___6 = 762, + FN_SEL_SSIF4_0 = 763, + FN_SEL_SSIF4_1 = 764, + FN_SEL_SCIF4_0___6 = 765, + FN_SEL_SCIF4_1___6 = 766, + FN_SEL_PWM0_0___4 = 767, + FN_SEL_PWM0_2 = 768, + FN_SEL_PWM0_1___4 = 769, + FN_SEL_PWM1_0___8 = 770, + FN_SEL_PWM1_2 = 771, + FN_SEL_PWM1_1___8 = 772, + FN_SEL_PWM2_0___8 = 773, + FN_SEL_PWM2_2___2 = 774, + FN_SEL_PWM2_1___8 = 775, + FN_SEL_PWM3_0___8 = 776, + FN_SEL_PWM3_2___2 = 777, + FN_SEL_PWM3_1___8 = 778, + FN_SEL_IRQ_0_0 = 779, + FN_SEL_IRQ_0_1 = 780, + FN_SEL_IRQ_1_0 = 781, + FN_SEL_IRQ_1_1 = 782, + FN_SEL_IRQ_2_0 = 783, + FN_SEL_IRQ_2_1 = 784, + FN_SEL_IRQ_3_0 = 785, + FN_SEL_IRQ_3_1 = 786, + FN_SEL_IRQ_4_0 = 787, + FN_SEL_IRQ_4_1 = 788, + FN_SEL_IRQ_5_0 = 789, + FN_SEL_IRQ_5_1 = 790, + FN_SEL_TMU_0_0 = 791, + FN_SEL_TMU_0_1 = 792, + FN_SEL_TMU_1_0 = 793, + FN_SEL_TMU_1_1 = 794, + FN_SEL_SCIF3_0___6 = 795, + FN_SEL_SCIF3_1___6 = 796, + FN_SEL_SCIF1_0___7 = 797, + FN_SEL_SCIF1_1___7 = 798, + FN_SEL_SCU_0 = 799, + FN_SEL_SCU_1 = 800, + FN_SEL_RFSO_0___2 = 801, + FN_SEL_RFSO_1___2 = 802, + PINMUX_FUNCTION_END___8 = 803, + PINMUX_MARK_BEGIN___8 = 804, + TX2_MARK = 805, + RX2_MARK = 806, + AVB0_LINK_MARK___2 = 807, + AVB0_PHY_INT_MARK___2 = 808, + AVB0_MAGIC_MARK___2 = 809, + AVB0_MDC_MARK___2 = 810, + AVB0_MDIO_MARK___2 = 811, + MSIOF0_RXD_MARK___8 = 812, + AVB0_TXCREFCLK_MARK___2 = 813, + MSIOF0_TXD_MARK___8 = 814, + AVB0_TD3_MARK___2 = 815, + MSIOF0_SYNC_MARK___8 = 816, + AVB0_TD2_MARK___2 = 817, + RPC_INT_N_MARK___4 = 818, + MSIOF0_SCK_MARK___8 = 819, + AVB0_TD1_MARK___2 = 820, + RPC_RESET_N_MARK___4 = 821, + AVB0_TD0_MARK___2 = 822, + QSPI1_SSL_MARK___8 = 823, + AVB0_TXC_MARK___2 = 824, + QSPI1_IO3_MARK___8 = 825, + SDA0_MARK___7 = 826, + AVB0_TX_CTL_MARK___2 = 827, + QSPI1_IO2_MARK___8 = 828, + SCL0_MARK___7 = 829, + AVB0_RD3_MARK___2 = 830, + QSPI1_MISO_IO1_MARK___8 = 831, + AVB0_RD2_MARK___2 = 832, + QSPI1_MOSI_IO0_MARK___8 = 833, + AVB0_RD1_MARK___2 = 834, + QSPI1_SPCLK_MARK___8 = 835, + VI4_DATA4_MARK = 836, + AVB0_RD0_MARK___2 = 837, + QSPI0_SSL_MARK___8 = 838, + AVB0_RXC_MARK___2 = 839, + QSPI0_IO3_MARK___8 = 840, + AVB0_RX_CTL_MARK___2 = 841, + QSPI0_IO2_MARK___8 = 842, + QSPI0_MISO_IO1_MARK___8 = 843, + USB0_OVC_MARK___5 = 844, + QSPI0_MOSI_IO0_MARK___8 = 845, + USB0_PWEN_MARK___5 = 846, + VI4_CLK_MARK___6 = 847, + QSPI0_SPCLK_MARK___8 = 848, + IP0_3_0_MARK___8 = 849, + IRQ0_A_MARK = 850, + MSIOF2_SYNC_B_MARK___6 = 851, + IP1_3_0_MARK___8 = 852, + DU_DB1_MARK___8 = 853, + LCDOUT1_MARK___6 = 854, + MSIOF3_RXD_B_MARK___6 = 855, + IP2_3_0_MARK___8 = 856, + DU_DG1_MARK___8 = 857, + LCDOUT9_MARK___6 = 858, + MSIOF3_SYNC_B_MARK___6 = 859, + IP3_3_0_MARK___8 = 860, + DU_DR1_MARK___8 = 861, + LCDOUT17_MARK___6 = 862, + TX4_B_MARK___6 = 863, + IP0_7_4_MARK___8 = 864, + MSIOF2_SCK_MARK___3 = 865, + IP1_7_4_MARK___8 = 866, + DU_DB2_MARK___8 = 867, + LCDOUT2_MARK___6 = 868, + IRQ0_B_MARK = 869, + IP2_7_4_MARK___8 = 870, + DU_DG2_MARK___8 = 871, + LCDOUT10_MARK___6 = 872, + IP3_7_4_MARK___8 = 873, + DU_DR2_MARK___8 = 874, + LCDOUT18_MARK___6 = 875, + PWM0_B_MARK___4 = 876, + IP0_11_8_MARK___8 = 877, + MSIOF2_TXD_MARK___3 = 878, + SCL3_A_MARK___2 = 879, + IP1_11_8_MARK___8 = 880, + DU_DB3_MARK___8 = 881, + LCDOUT3_MARK___6 = 882, + SCK5_B_MARK___4 = 883, + IP2_11_8_MARK___8 = 884, + DU_DG3_MARK___8 = 885, + LCDOUT11_MARK___6 = 886, + IRQ1_A_MARK = 887, + IP3_11_8_MARK___8 = 888, + DU_DR3_MARK___8 = 889, + LCDOUT19_MARK___6 = 890, + PWM1_B_MARK___8 = 891, + IP0_15_12_MARK___8 = 892, + MSIOF2_RXD_MARK___3 = 893, + SDA3_A_MARK___2 = 894, + IP1_15_12_MARK___8 = 895, + DU_DB4_MARK___8 = 896, + LCDOUT4_MARK___6 = 897, + RX5_B_MARK___5 = 898, + IP2_15_12_MARK___8 = 899, + DU_DG4_MARK___8 = 900, + LCDOUT12_MARK___6 = 901, + HSCK3_B_MARK___2 = 902, + IP3_15_12_MARK___8 = 903, + DU_DR4_MARK___8 = 904, + LCDOUT20_MARK___6 = 905, + TCLK2_B_MARK___8 = 906, + IP0_19_16_MARK___8 = 907, + MLB_CLK_MARK___6 = 908, + MSIOF2_SYNC_A_MARK___6 = 909, + SCK5_A_MARK___5 = 910, + IP1_19_16_MARK___8 = 911, + DU_DB5_MARK___8 = 912, + LCDOUT5_MARK___6 = 913, + TX5_B_MARK___5 = 914, + IP2_19_16_MARK___8 = 915, + DU_DG5_MARK___8 = 916, + LCDOUT13_MARK___6 = 917, + HTX3_B_MARK___6 = 918, + IP3_19_16_MARK___8 = 919, + DU_DR5_MARK___8 = 920, + LCDOUT21_MARK___6 = 921, + NMI_MARK = 922, + IP0_23_20_MARK___8 = 923, + MLB_DAT_MARK___6 = 924, + MSIOF2_SS1_MARK___3 = 925, + RX5_A_MARK___5 = 926, + SCL3_B_MARK___2 = 927, + IP1_23_20_MARK___8 = 928, + DU_DB6_MARK___8 = 929, + LCDOUT6_MARK___6 = 930, + MSIOF3_SS1_B_MARK___6 = 931, + IP2_23_20_MARK___8 = 932, + DU_DG6_MARK___8 = 933, + LCDOUT14_MARK___6 = 934, + HRX3_B_MARK___6 = 935, + IP3_23_20_MARK___8 = 936, + DU_DR6_MARK___8 = 937, + LCDOUT22_MARK___6 = 938, + PWM2_B_MARK___8 = 939, + IP0_27_24_MARK___8 = 940, + MLB_SIG_MARK___6 = 941, + MSIOF2_SS2_MARK___3 = 942, + TX5_A_MARK___5 = 943, + SDA3_B_MARK___2 = 944, + IP1_27_24_MARK___8 = 945, + DU_DB7_MARK___8 = 946, + LCDOUT7_MARK___6 = 947, + MSIOF3_SS2_B_MARK___5 = 948, + IP2_27_24_MARK___8 = 949, + DU_DG7_MARK___8 = 950, + LCDOUT15_MARK___6 = 951, + SCK4_B_MARK___6 = 952, + IP3_27_24_MARK___8 = 953, + DU_DR7_MARK___8 = 954, + LCDOUT23_MARK___6 = 955, + TCLK1_B_MARK___8 = 956, + IP0_31_28_MARK___8 = 957, + DU_DB0_MARK___8 = 958, + LCDOUT0_MARK___6 = 959, + MSIOF3_TXD_B_MARK___6 = 960, + IP1_31_28_MARK___8 = 961, + DU_DG0_MARK___8 = 962, + LCDOUT8_MARK___6 = 963, + MSIOF3_SCK_B_MARK___6 = 964, + IP2_31_28_MARK___8 = 965, + DU_DR0_MARK___8 = 966, + LCDOUT16_MARK___6 = 967, + RX4_B_MARK___6 = 968, + IP3_31_28_MARK___8 = 969, + DU_DOTCLKOUT0_MARK___6 = 970, + QCLK_MARK___6 = 971, + IP4_3_0_MARK___8 = 972, + DU_HSYNC_MARK___2 = 973, + QSTH_QHS_MARK___6 = 974, + IRQ3_A_MARK = 975, + IP5_3_0_MARK___8 = 976, + VI4_DATA1_MARK = 977, + PWM1_A_MARK___8 = 978, + IP6_3_0_MARK___8 = 979, + VI4_DATA10_MARK___6 = 980, + RX4_A_MARK___6 = 981, + IP7_3_0_MARK___8 = 982, + VI4_DATA18_MARK___6 = 983, + HSCK3_A_MARK = 984, + IP4_7_4_MARK___8 = 985, + DU_VSYNC_MARK___2 = 986, + QSTVA_QVS_MARK___6 = 987, + IRQ4_A_MARK = 988, + IP5_7_4_MARK___8 = 989, + VI4_DATA2_MARK = 990, + PWM2_A_MARK___8 = 991, + IP6_7_4_MARK___8 = 992, + VI4_DATA11_MARK___6 = 993, + TX4_A_MARK___6 = 994, + IP7_7_4_MARK___8 = 995, + VI4_DATA19_MARK___6 = 996, + SSI_WS4_B_MARK = 997, + NFDATA15_MARK = 998, + IP4_11_8_MARK___8 = 999, + DU_DISP_MARK___8 = 1000, + QSTVB_QVE_MARK___6 = 1001, + PWM3_B_MARK___8 = 1002, + IP5_11_8_MARK___8 = 1003, + VI4_DATA3_MARK = 1004, + PWM3_A_MARK___8 = 1005, + IP6_11_8_MARK___8 = 1006, + VI4_DATA12_MARK___6 = 1007, + TCLK1_A_MARK___8 = 1008, + IP7_11_8_MARK___8 = 1009, + VI4_DATA20_MARK___6 = 1010, + MSIOF3_SYNC_A_MARK___6 = 1011, + NFDATA14_MARK = 1012, + IP4_15_12_MARK___8 = 1013, + DU_DISP_CDE_MARK___2 = 1014, + QCPV_QDE_MARK___6 = 1015, + IRQ2_B_MARK = 1016, + DU_DOTCLKIN1_MARK___6 = 1017, + IP5_15_12_MARK___8 = 1018, + VI4_DATA5_MARK = 1019, + SCK4_A_MARK___6 = 1020, + IP6_15_12_MARK___8 = 1021, + VI4_DATA13_MARK___6 = 1022, + MSIOF3_SS1_A_MARK___6 = 1023, + HCTS3_N_MARK___7 = 1024, + IP7_15_12_MARK___5 = 1025, + VI4_DATA21_MARK___6 = 1026, + MSIOF3_TXD_A_MARK___6 = 1027, + NFDATA13_MARK___5 = 1028, + IP4_19_16_MARK___8 = 1029, + DU_CDE_MARK___8 = 1030, + QSTB_QHE_MARK___6 = 1031, + SCK3_B_MARK = 1032, + IP5_19_16_MARK___8 = 1033, + VI4_DATA6_MARK = 1034, + IRQ2_A_MARK = 1035, + IP6_19_16_MARK___8 = 1036, + VI4_DATA14_MARK___6 = 1037, + SSI_SCK4_B_MARK = 1038, + HRTS3_N_MARK___7 = 1039, + IP7_19_16_MARK___8 = 1040, + VI4_DATA22_MARK___6 = 1041, + MSIOF3_RXD_A_MARK___6 = 1042, + NFDATA12_MARK___5 = 1043, + IP4_23_20_MARK___8 = 1044, + QPOLA_MARK___6 = 1045, + RX3_B_MARK___6 = 1046, + IP5_23_20_MARK___8 = 1047, + VI4_DATA7_MARK = 1048, + TCLK2_A_MARK___8 = 1049, + IP6_23_20_MARK___8 = 1050, + VI4_DATA15_MARK___6 = 1051, + SSI_SDATA4_B_MARK = 1052, + IP7_23_20_MARK___8 = 1053, + VI4_DATA23_MARK___6 = 1054, + MSIOF3_SCK_A_MARK___6 = 1055, + NFDATA11_MARK___5 = 1056, + IP4_27_24_MARK___8 = 1057, + QPOLB_MARK___6 = 1058, + TX3_B_MARK___6 = 1059, + IP5_27_24_MARK___8 = 1060, + VI4_DATA8_MARK___6 = 1061, + IP6_27_24_MARK___8 = 1062, + VI4_DATA16_MARK___6 = 1063, + HRX3_A_MARK___6 = 1064, + IP7_27_24_MARK___8 = 1065, + VI4_VSYNC_N_MARK___6 = 1066, + SCK1_B_MARK = 1067, + NFDATA10_MARK___5 = 1068, + IP4_31_28_MARK___8 = 1069, + VI4_DATA0_MARK = 1070, + PWM0_A_MARK___4 = 1071, + IP5_31_28_MARK___8 = 1072, + VI4_DATA9_MARK___6 = 1073, + MSIOF3_SS2_A_MARK___6 = 1074, + IRQ1_B_MARK = 1075, + IP6_31_28_MARK___8 = 1076, + VI4_DATA17_MARK___6 = 1077, + HTX3_A_MARK___6 = 1078, + IP7_31_28_MARK___8 = 1079, + VI4_HSYNC_N_MARK___6 = 1080, + RX1_B_MARK___7 = 1081, + NFDATA9_MARK___5 = 1082, + IP8_3_0_MARK___8 = 1083, + VI4_FIELD_MARK___6 = 1084, + AUDIO_CLKB_MARK = 1085, + IRQ5_A_MARK = 1086, + SCIF_CLK_MARK = 1087, + NFDATA8_MARK___5 = 1088, + IP9_3_0_MARK___7 = 1089, + NFDATA0_MARK___5 = 1090, + MMC_D0_MARK___3 = 1091, + IP10_3_0_MARK___7 = 1092, + AUDIO_CLKA_MARK___2 = 1093, + DVC_MUTE_B_MARK = 1094, + IP11_3_0_MARK___6 = 1095, + SDA1_MARK___3 = 1096, + RTS1_N_MARK___8 = 1097, + IP8_7_4_MARK___8 = 1098, + VI4_CLKENB_MARK___6 = 1099, + TX1_B_MARK___7 = 1100, + NFWP_N_MARK = 1101, + DVC_MUTE_A_MARK = 1102, + IP9_7_4_MARK___7 = 1103, + NFDATA1_MARK___5 = 1104, + MMC_D1_MARK___3 = 1105, + IP10_7_4_MARK___7 = 1106, + SSI_SCK34_MARK = 1107, + FSO_CFE_0_N_A_MARK___3 = 1108, + IP11_7_4_MARK___6 = 1109, + MSIOF1_SCK_MARK___4 = 1110, + AVB0_AVTP_PPS_B_MARK = 1111, + IP8_11_8_MARK___8 = 1112, + NFALE_MARK___4 = 1113, + SCL2_B_MARK___6 = 1114, + IRQ3_B_MARK = 1115, + PWM0_C_MARK = 1116, + IP9_11_8_MARK___7 = 1117, + NFDATA2_MARK___5 = 1118, + MMC_D2_MARK___3 = 1119, + IP10_11_8_MARK___7 = 1120, + SSI_SDATA3_MARK___6 = 1121, + FSO_CFE_1_N_A_MARK___3 = 1122, + IP11_11_8_MARK___6 = 1123, + MSIOF1_TXD_MARK___4 = 1124, + AVB0_AVTP_CAPTURE_B_MARK = 1125, + IP8_15_12_MARK___8 = 1126, + NFCLE_MARK___5 = 1127, + SDA2_B_MARK___6 = 1128, + SCK3_A_MARK___2 = 1129, + PWM1_C_MARK = 1130, + IP9_15_12_MARK___7 = 1131, + NFDATA3_MARK___5 = 1132, + MMC_D3_MARK___3 = 1133, + IP10_15_12_MARK___7 = 1134, + SSI_WS34_MARK = 1135, + FSO_TOE_N_A_MARK___3 = 1136, + IP11_15_12_MARK___6 = 1137, + MSIOF1_RXD_MARK___4 = 1138, + AVB0_AVTP_MATCH_B_MARK = 1139, + IP8_19_16_MARK___8 = 1140, + NFCE_N_MARK = 1141, + RX3_A_MARK___6 = 1142, + PWM2_C_MARK___2 = 1143, + IP9_19_16_MARK___7 = 1144, + NFDATA4_MARK___5 = 1145, + MMC_D4_MARK___3 = 1146, + IP10_19_16_MARK___7 = 1147, + SSI_SCK4_A_MARK = 1148, + HSCK0_MARK___6 = 1149, + AUDIO_CLKOUT_MARK = 1150, + CAN0_RX_B_MARK___5 = 1151, + IRQ4_B_MARK = 1152, + IP11_19_16_MARK___6 = 1153, + SCK0_A_MARK___2 = 1154, + MSIOF1_SYNC_MARK___4 = 1155, + FSO_CFE_0_N_B_MARK___3 = 1156, + IP8_23_20_MARK___8 = 1157, + NFRB_N_MARK = 1158, + TX3_A_MARK___6 = 1159, + PWM3_C_MARK___2 = 1160, + IP9_23_20_MARK___7 = 1161, + NFDATA5_MARK___5 = 1162, + MMC_D5_MARK___3 = 1163, + IP10_23_20_MARK___7 = 1164, + SSI_SDATA4_A_MARK = 1165, + HTX0_MARK___6 = 1166, + SCL2_A_MARK___6 = 1167, + CAN1_RX_B_MARK = 1168, + IP11_23_20_MARK___6 = 1169, + RX0_A_MARK___2 = 1170, + MSIOF0_SS1_MARK___8 = 1171, + FSO_CFE_1_N_B_MARK___3 = 1172, + IP8_27_24_MARK___8 = 1173, + NFRE_N_MARK___5 = 1174, + MMC_CMD_MARK___3 = 1175, + IP9_27_24_MARK___7 = 1176, + NFDATA6_MARK___5 = 1177, + MMC_D6_MARK___3 = 1178, + IP10_27_24_MARK___7 = 1179, + SSI_WS4_A_MARK = 1180, + HRX0_MARK___6 = 1181, + SDA2_A_MARK___6 = 1182, + CAN1_TX_B_MARK = 1183, + IP11_27_24_MARK___6 = 1184, + TX0_A_MARK___2 = 1185, + MSIOF0_SS2_MARK___8 = 1186, + FSO_TOE_N_B_MARK___3 = 1187, + IP8_31_28_MARK___8 = 1188, + NFWE_N_MARK___5 = 1189, + MMC_CLK_MARK___3 = 1190, + IP9_31_28_MARK___7 = 1191, + NFDATA7_MARK___5 = 1192, + MMC_D7_MARK___3 = 1193, + IP10_31_28_MARK___7 = 1194, + SCL1_MARK___3 = 1195, + CTS1_N_MARK___8 = 1196, + IP11_31_28_MARK___6 = 1197, + SCK1_A_MARK = 1198, + MSIOF1_SS2_MARK___4 = 1199, + TPU0TO2_B_MARK = 1200, + CAN0_TX_B_MARK___5 = 1201, + AUDIO_CLKOUT1_MARK = 1202, + IP12_3_0_MARK___6 = 1203, + RX1_A_MARK___7 = 1204, + CTS0_N_MARK___7 = 1205, + TPU0TO0_B_MARK = 1206, + IP13_3_0_MARK___6 = 1207, + CAN1_RX_A_MARK = 1208, + CANFD1_RX_MARK___8 = 1209, + TPU0TO2_A_MARK = 1210, + IP12_7_4_MARK___6 = 1211, + TX1_A_MARK___7 = 1212, + RTS0_N_MARK___7 = 1213, + TPU0TO1_B_MARK = 1214, + IP13_7_4_MARK___6 = 1215, + CAN1_TX_A_MARK = 1216, + CANFD1_TX_MARK___8 = 1217, + TPU0TO3_A_MARK = 1218, + IP12_11_8_MARK___6 = 1219, + SCK2_MARK___5 = 1220, + MSIOF1_SS1_MARK___4 = 1221, + TPU0TO3_B_MARK = 1222, + IP12_15_12_MARK___6 = 1223, + TPU0TO0_A_MARK = 1224, + AVB0_AVTP_CAPTURE_A_MARK = 1225, + HCTS0_N_MARK___6 = 1226, + IP12_19_16_MARK___6 = 1227, + TPU0TO1_A_MARK = 1228, + AVB0_AVTP_MATCH_A_MARK = 1229, + HRTS0_N_MARK___6 = 1230, + IP12_23_20_MARK___6 = 1231, + CAN_CLK_MARK___6 = 1232, + AVB0_AVTP_PPS_A_MARK = 1233, + SCK0_B_MARK___2 = 1234, + IRQ5_B_MARK = 1235, + IP12_27_24_MARK___6 = 1236, + CAN0_RX_A_MARK___5 = 1237, + CANFD0_RX_MARK___2 = 1238, + RX0_B_MARK___2 = 1239, + IP12_31_28_MARK___6 = 1240, + CAN0_TX_A_MARK___5 = 1241, + CANFD0_TX_MARK___2 = 1242, + TX0_B_MARK___2 = 1243, + SEL_CAN0_0_MARK = 1244, + SEL_CAN0_1_MARK = 1245, + SEL_MSIOF2_0_MARK___6 = 1246, + SEL_MSIOF2_1_MARK___6 = 1247, + SEL_CAN1_0_MARK = 1248, + SEL_CAN1_1_MARK = 1249, + SEL_I2C3_0_MARK___2 = 1250, + SEL_I2C3_1_MARK___2 = 1251, + SEL_I2C2_0_MARK___6 = 1252, + SEL_I2C2_1_MARK___6 = 1253, + SEL_SCIF5_0_MARK___5 = 1254, + SEL_SCIF5_1_MARK___5 = 1255, + SEL_ETHERAVB_0_MARK___5 = 1256, + SEL_ETHERAVB_1_MARK___5 = 1257, + SEL_MSIOF3_0_MARK___6 = 1258, + SEL_MSIOF3_1_MARK___6 = 1259, + SEL_SCIF0_0_MARK___2 = 1260, + SEL_SCIF0_1_MARK___2 = 1261, + SEL_HSCIF3_0_MARK___6 = 1262, + SEL_HSCIF3_1_MARK___6 = 1263, + SEL_SSIF4_0_MARK = 1264, + SEL_SSIF4_1_MARK = 1265, + SEL_SCIF4_0_MARK___6 = 1266, + SEL_SCIF4_1_MARK___6 = 1267, + SEL_PWM0_0_MARK___4 = 1268, + SEL_PWM0_2_MARK = 1269, + SEL_PWM0_1_MARK___4 = 1270, + SEL_PWM1_0_MARK___8 = 1271, + SEL_PWM1_2_MARK = 1272, + SEL_PWM1_1_MARK___8 = 1273, + SEL_PWM2_0_MARK___8 = 1274, + SEL_PWM2_2_MARK___2 = 1275, + SEL_PWM2_1_MARK___8 = 1276, + SEL_PWM3_0_MARK___8 = 1277, + SEL_PWM3_2_MARK___2 = 1278, + SEL_PWM3_1_MARK___8 = 1279, + SEL_IRQ_0_0_MARK = 1280, + SEL_IRQ_0_1_MARK = 1281, + SEL_IRQ_1_0_MARK = 1282, + SEL_IRQ_1_1_MARK = 1283, + SEL_IRQ_2_0_MARK = 1284, + SEL_IRQ_2_1_MARK = 1285, + SEL_IRQ_3_0_MARK = 1286, + SEL_IRQ_3_1_MARK = 1287, + SEL_IRQ_4_0_MARK = 1288, + SEL_IRQ_4_1_MARK = 1289, + SEL_IRQ_5_0_MARK = 1290, + SEL_IRQ_5_1_MARK = 1291, + SEL_TMU_0_0_MARK = 1292, + SEL_TMU_0_1_MARK = 1293, + SEL_TMU_1_0_MARK = 1294, + SEL_TMU_1_1_MARK = 1295, + SEL_SCIF3_0_MARK___6 = 1296, + SEL_SCIF3_1_MARK___6 = 1297, + SEL_SCIF1_0_MARK___7 = 1298, + SEL_SCIF1_1_MARK___7 = 1299, + SEL_SCU_0_MARK = 1300, + SEL_SCU_1_MARK = 1301, + SEL_RFSO_0_MARK___2 = 1302, + SEL_RFSO_1_MARK___2 = 1303, + PINMUX_MARK_END___8 = 1304, +}; + +enum { + GP_LAST___8 = 205, + PIN_DU_DOTCLKIN0___5 = 206, + PIN_FSCLKST_N___6 = 207, + PIN_MLB_REF___6 = 208, + PIN_PRESETOUT_N___8 = 209, + PIN_TCK___7 = 210, + PIN_TDI___7 = 211, + PIN_TMS___7 = 212, + PIN_TRST_N___7 = 213, +}; + +enum ioctrl_regs___5 { + TDSELCTRL___5 = 0, +}; + +enum { + PINMUX_RESERVED___9 = 0, + PINMUX_DATA_BEGIN___9 = 1, + GP_0_0_DATA___9 = 2, + GP_0_1_DATA___9 = 3, + GP_0_2_DATA___9 = 4, + GP_0_3_DATA___9 = 5, + GP_0_4_DATA___9 = 6, + GP_0_5_DATA___9 = 7, + GP_0_6_DATA___9 = 8, + GP_0_7_DATA___9 = 9, + GP_0_8_DATA___9 = 10, + GP_0_9_DATA___8 = 11, + GP_0_10_DATA___8 = 12, + GP_0_11_DATA___8 = 13, + GP_0_12_DATA___8 = 14, + GP_0_13_DATA___8 = 15, + GP_0_14_DATA___8 = 16, + GP_0_15_DATA___8 = 17, + GP_0_16_DATA___4 = 18, + GP_0_17_DATA___4 = 19, + GP_0_18_DATA___3 = 20, + GP_0_19_DATA___3 = 21, + GP_0_20_DATA___3 = 22, + GP_0_21_DATA___3 = 23, + GP_0_22_DATA = 24, + GP_0_23_DATA = 25, + GP_0_24_DATA = 26, + GP_0_25_DATA = 27, + GP_0_26_DATA = 28, + GP_0_27_DATA = 29, + GP_1_0_DATA___9 = 30, + GP_1_1_DATA___9 = 31, + GP_1_2_DATA___9 = 32, + GP_1_3_DATA___9 = 33, + GP_1_4_DATA___9 = 34, + GP_1_5_DATA___9 = 35, + GP_1_6_DATA___9 = 36, + GP_1_7_DATA___9 = 37, + GP_1_8_DATA___9 = 38, + GP_1_9_DATA___9 = 39, + GP_1_10_DATA___9 = 40, + GP_1_11_DATA___9 = 41, + GP_1_12_DATA___9 = 42, + GP_1_13_DATA___9 = 43, + GP_1_14_DATA___9 = 44, + GP_1_15_DATA___9 = 45, + GP_1_16_DATA___9 = 46, + GP_1_17_DATA___9 = 47, + GP_1_18_DATA___9 = 48, + GP_1_19_DATA___9 = 49, + GP_1_20_DATA___9 = 50, + GP_1_21_DATA___9 = 51, + GP_1_22_DATA___9 = 52, + GP_1_23_DATA___8 = 53, + GP_1_24_DATA___8 = 54, + GP_1_25_DATA___8 = 55, + GP_1_26_DATA___8 = 56, + GP_1_27_DATA___8 = 57, + GP_1_28_DATA___5 = 58, + GP_1_29_DATA___2 = 59, + GP_1_30_DATA___2 = 60, + GP_2_0_DATA___9 = 61, + GP_2_1_DATA___9 = 62, + GP_2_2_DATA___9 = 63, + GP_2_3_DATA___9 = 64, + GP_2_4_DATA___9 = 65, + GP_2_5_DATA___9 = 66, + GP_2_6_DATA___9 = 67, + GP_2_7_DATA___9 = 68, + GP_2_8_DATA___9 = 69, + GP_2_9_DATA___9 = 70, + GP_2_10_DATA___9 = 71, + GP_2_11_DATA___9 = 72, + GP_2_12_DATA___9 = 73, + GP_2_13_DATA___9 = 74, + GP_2_14_DATA___9 = 75, + GP_2_15_DATA___5 = 76, + GP_2_16_DATA___5 = 77, + GP_2_17_DATA___4 = 78, + GP_2_18_DATA___4 = 79, + GP_2_19_DATA___4 = 80, + GP_2_20_DATA___4 = 81, + GP_2_21_DATA___4 = 82, + GP_2_22_DATA___4 = 83, + GP_2_23_DATA___4 = 84, + GP_2_24_DATA___4 = 85, + GP_3_0_DATA___9 = 86, + GP_3_1_DATA___9 = 87, + GP_3_2_DATA___9 = 88, + GP_3_3_DATA___9 = 89, + GP_3_4_DATA___9 = 90, + GP_3_5_DATA___9 = 91, + GP_3_6_DATA___9 = 92, + GP_3_7_DATA___9 = 93, + GP_3_8_DATA___9 = 94, + GP_3_9_DATA___9 = 95, + GP_3_10_DATA___8 = 96, + GP_3_11_DATA___8 = 97, + GP_3_12_DATA___8 = 98, + GP_3_13_DATA___8 = 99, + GP_3_14_DATA___8 = 100, + GP_3_15_DATA___8 = 101, + GP_3_16_DATA___3 = 102, + GP_4_0_DATA___9 = 103, + GP_4_1_DATA___9 = 104, + GP_4_2_DATA___9 = 105, + GP_4_3_DATA___9 = 106, + GP_4_4_DATA___9 = 107, + GP_4_5_DATA___9 = 108, + GP_4_6_DATA___8 = 109, + GP_4_7_DATA___8 = 110, + GP_4_8_DATA___8 = 111, + GP_4_9_DATA___8 = 112, + GP_4_10_DATA___8 = 113, + GP_4_11_DATA___7 = 114, + GP_4_12_DATA___7 = 115, + GP_4_13_DATA___7 = 116, + GP_4_14_DATA___7 = 117, + GP_4_15_DATA___7 = 118, + GP_4_16_DATA___7 = 119, + GP_4_17_DATA___7 = 120, + GP_4_18_DATA___3 = 121, + GP_4_19_DATA___3 = 122, + GP_4_20_DATA___3 = 123, + GP_4_21_DATA___3 = 124, + GP_4_22_DATA___3 = 125, + GP_4_23_DATA___3 = 126, + GP_4_24_DATA___3 = 127, + GP_4_25_DATA___2 = 128, + GP_4_26_DATA___2 = 129, + GP_5_0_DATA___9 = 130, + GP_5_1_DATA___9 = 131, + GP_5_2_DATA___9 = 132, + GP_5_3_DATA___9 = 133, + GP_5_4_DATA___9 = 134, + GP_5_5_DATA___9 = 135, + GP_5_6_DATA___9 = 136, + GP_5_7_DATA___9 = 137, + GP_5_8_DATA___9 = 138, + GP_5_9_DATA___9 = 139, + GP_5_10_DATA___9 = 140, + GP_5_11_DATA___9 = 141, + GP_5_12_DATA___9 = 142, + GP_5_13_DATA___9 = 143, + GP_5_14_DATA___9 = 144, + GP_5_15_DATA___7 = 145, + GP_5_16_DATA___7 = 146, + GP_5_17_DATA___7 = 147, + GP_5_18_DATA___7 = 148, + GP_5_19_DATA___7 = 149, + GP_5_20_DATA___6 = 150, + GP_6_0_DATA___7 = 151, + GP_6_1_DATA___7 = 152, + GP_6_2_DATA___7 = 153, + GP_6_3_DATA___7 = 154, + GP_6_4_DATA___7 = 155, + GP_6_5_DATA___7 = 156, + GP_6_6_DATA___7 = 157, + GP_6_7_DATA___7 = 158, + GP_6_8_DATA___7 = 159, + GP_6_9_DATA___7 = 160, + GP_6_10_DATA___7 = 161, + GP_6_11_DATA___7 = 162, + GP_6_12_DATA___7 = 163, + GP_6_13_DATA___7 = 164, + GP_6_14_DATA___6 = 165, + GP_6_15_DATA___6 = 166, + GP_6_16_DATA___6 = 167, + GP_6_17_DATA___6 = 168, + GP_6_18_DATA___5 = 169, + GP_6_19_DATA___5 = 170, + GP_6_20_DATA___5 = 171, + GP_7_0_DATA___5 = 172, + GP_7_1_DATA___5 = 173, + GP_7_2_DATA___5 = 174, + GP_7_3_DATA___5 = 175, + GP_7_4_DATA = 176, + GP_7_5_DATA = 177, + GP_7_6_DATA = 178, + GP_7_7_DATA = 179, + GP_7_8_DATA = 180, + GP_7_9_DATA = 181, + GP_7_10_DATA = 182, + GP_7_11_DATA = 183, + GP_7_12_DATA = 184, + GP_7_13_DATA = 185, + GP_7_14_DATA = 186, + GP_7_15_DATA = 187, + GP_7_16_DATA = 188, + GP_7_17_DATA = 189, + GP_7_18_DATA = 190, + GP_7_19_DATA = 191, + GP_7_20_DATA = 192, + GP_8_0_DATA = 193, + GP_8_1_DATA = 194, + GP_8_2_DATA = 195, + GP_8_3_DATA = 196, + GP_8_4_DATA = 197, + GP_8_5_DATA = 198, + GP_8_6_DATA = 199, + GP_8_7_DATA = 200, + GP_8_8_DATA = 201, + GP_8_9_DATA = 202, + GP_8_10_DATA = 203, + GP_8_11_DATA = 204, + GP_8_12_DATA = 205, + GP_8_13_DATA = 206, + GP_8_14_DATA = 207, + GP_8_15_DATA = 208, + GP_8_16_DATA = 209, + GP_8_17_DATA = 210, + GP_8_18_DATA = 211, + GP_8_19_DATA = 212, + GP_8_20_DATA = 213, + GP_9_0_DATA = 214, + GP_9_1_DATA = 215, + GP_9_2_DATA = 216, + GP_9_3_DATA = 217, + GP_9_4_DATA = 218, + GP_9_5_DATA = 219, + GP_9_6_DATA = 220, + GP_9_7_DATA = 221, + GP_9_8_DATA = 222, + GP_9_9_DATA = 223, + GP_9_10_DATA = 224, + GP_9_11_DATA = 225, + GP_9_12_DATA = 226, + GP_9_13_DATA = 227, + GP_9_14_DATA = 228, + GP_9_15_DATA = 229, + GP_9_16_DATA = 230, + GP_9_17_DATA = 231, + GP_9_18_DATA = 232, + GP_9_19_DATA = 233, + GP_9_20_DATA = 234, + PINMUX_DATA_END___9 = 235, + PINMUX_FUNCTION_BEGIN___9 = 236, + GP_0_0_FN___9 = 237, + GP_0_1_FN___9 = 238, + GP_0_2_FN___9 = 239, + GP_0_3_FN___9 = 240, + GP_0_4_FN___9 = 241, + GP_0_5_FN___9 = 242, + GP_0_6_FN___9 = 243, + GP_0_7_FN___9 = 244, + GP_0_8_FN___9 = 245, + GP_0_9_FN___8 = 246, + GP_0_10_FN___8 = 247, + GP_0_11_FN___8 = 248, + GP_0_12_FN___8 = 249, + GP_0_13_FN___8 = 250, + GP_0_14_FN___8 = 251, + GP_0_15_FN___8 = 252, + GP_0_16_FN___4 = 253, + GP_0_17_FN___4 = 254, + GP_0_18_FN___3 = 255, + GP_0_19_FN___3 = 256, + GP_0_20_FN___3 = 257, + GP_0_21_FN___3 = 258, + GP_0_22_FN = 259, + GP_0_23_FN = 260, + GP_0_24_FN = 261, + GP_0_25_FN = 262, + GP_0_26_FN = 263, + GP_0_27_FN = 264, + GP_1_0_FN___9 = 265, + GP_1_1_FN___9 = 266, + GP_1_2_FN___9 = 267, + GP_1_3_FN___9 = 268, + GP_1_4_FN___9 = 269, + GP_1_5_FN___9 = 270, + GP_1_6_FN___9 = 271, + GP_1_7_FN___9 = 272, + GP_1_8_FN___9 = 273, + GP_1_9_FN___9 = 274, + GP_1_10_FN___9 = 275, + GP_1_11_FN___9 = 276, + GP_1_12_FN___9 = 277, + GP_1_13_FN___9 = 278, + GP_1_14_FN___9 = 279, + GP_1_15_FN___9 = 280, + GP_1_16_FN___9 = 281, + GP_1_17_FN___9 = 282, + GP_1_18_FN___9 = 283, + GP_1_19_FN___9 = 284, + GP_1_20_FN___9 = 285, + GP_1_21_FN___9 = 286, + GP_1_22_FN___9 = 287, + GP_1_23_FN___8 = 288, + GP_1_24_FN___8 = 289, + GP_1_25_FN___8 = 290, + GP_1_26_FN___8 = 291, + GP_1_27_FN___8 = 292, + GP_1_28_FN___5 = 293, + GP_1_29_FN___2 = 294, + GP_1_30_FN___2 = 295, + GP_2_0_FN___9 = 296, + GP_2_1_FN___9 = 297, + GP_2_2_FN___9 = 298, + GP_2_3_FN___9 = 299, + GP_2_4_FN___9 = 300, + GP_2_5_FN___9 = 301, + GP_2_6_FN___9 = 302, + GP_2_7_FN___9 = 303, + GP_2_8_FN___9 = 304, + GP_2_9_FN___9 = 305, + GP_2_10_FN___9 = 306, + GP_2_11_FN___9 = 307, + GP_2_12_FN___9 = 308, + GP_2_13_FN___9 = 309, + GP_2_14_FN___9 = 310, + GP_2_15_FN___5 = 311, + GP_2_16_FN___5 = 312, + GP_2_17_FN___4 = 313, + GP_2_18_FN___4 = 314, + GP_2_19_FN___4 = 315, + GP_2_20_FN___4 = 316, + GP_2_21_FN___4 = 317, + GP_2_22_FN___4 = 318, + GP_2_23_FN___4 = 319, + GP_2_24_FN___4 = 320, + GP_3_0_FN___9 = 321, + GP_3_1_FN___9 = 322, + GP_3_2_FN___9 = 323, + GP_3_3_FN___9 = 324, + GP_3_4_FN___9 = 325, + GP_3_5_FN___9 = 326, + GP_3_6_FN___9 = 327, + GP_3_7_FN___9 = 328, + GP_3_8_FN___9 = 329, + GP_3_9_FN___9 = 330, + GP_3_10_FN___8 = 331, + GP_3_11_FN___8 = 332, + GP_3_12_FN___8 = 333, + GP_3_13_FN___8 = 334, + GP_3_14_FN___8 = 335, + GP_3_15_FN___8 = 336, + GP_3_16_FN___3 = 337, + GP_4_0_FN___9 = 338, + GP_4_1_FN___9 = 339, + GP_4_2_FN___9 = 340, + GP_4_3_FN___9 = 341, + GP_4_4_FN___9 = 342, + GP_4_5_FN___9 = 343, + GP_4_6_FN___8 = 344, + GP_4_7_FN___8 = 345, + GP_4_8_FN___8 = 346, + GP_4_9_FN___8 = 347, + GP_4_10_FN___8 = 348, + GP_4_11_FN___7 = 349, + GP_4_12_FN___7 = 350, + GP_4_13_FN___7 = 351, + GP_4_14_FN___7 = 352, + GP_4_15_FN___7 = 353, + GP_4_16_FN___7 = 354, + GP_4_17_FN___7 = 355, + GP_4_18_FN___3 = 356, + GP_4_19_FN___3 = 357, + GP_4_20_FN___3 = 358, + GP_4_21_FN___3 = 359, + GP_4_22_FN___3 = 360, + GP_4_23_FN___3 = 361, + GP_4_24_FN___3 = 362, + GP_4_25_FN___2 = 363, + GP_4_26_FN___2 = 364, + GP_5_0_FN___9 = 365, + GP_5_1_FN___9 = 366, + GP_5_2_FN___9 = 367, + GP_5_3_FN___9 = 368, + GP_5_4_FN___9 = 369, + GP_5_5_FN___9 = 370, + GP_5_6_FN___9 = 371, + GP_5_7_FN___9 = 372, + GP_5_8_FN___9 = 373, + GP_5_9_FN___9 = 374, + GP_5_10_FN___9 = 375, + GP_5_11_FN___9 = 376, + GP_5_12_FN___9 = 377, + GP_5_13_FN___9 = 378, + GP_5_14_FN___9 = 379, + GP_5_15_FN___7 = 380, + GP_5_16_FN___7 = 381, + GP_5_17_FN___7 = 382, + GP_5_18_FN___7 = 383, + GP_5_19_FN___7 = 384, + GP_5_20_FN___6 = 385, + GP_6_0_FN___7 = 386, + GP_6_1_FN___7 = 387, + GP_6_2_FN___7 = 388, + GP_6_3_FN___7 = 389, + GP_6_4_FN___7 = 390, + GP_6_5_FN___7 = 391, + GP_6_6_FN___7 = 392, + GP_6_7_FN___7 = 393, + GP_6_8_FN___7 = 394, + GP_6_9_FN___7 = 395, + GP_6_10_FN___7 = 396, + GP_6_11_FN___7 = 397, + GP_6_12_FN___7 = 398, + GP_6_13_FN___7 = 399, + GP_6_14_FN___6 = 400, + GP_6_15_FN___6 = 401, + GP_6_16_FN___6 = 402, + GP_6_17_FN___6 = 403, + GP_6_18_FN___5 = 404, + GP_6_19_FN___5 = 405, + GP_6_20_FN___5 = 406, + GP_7_0_FN___5 = 407, + GP_7_1_FN___5 = 408, + GP_7_2_FN___5 = 409, + GP_7_3_FN___5 = 410, + GP_7_4_FN = 411, + GP_7_5_FN = 412, + GP_7_6_FN = 413, + GP_7_7_FN = 414, + GP_7_8_FN = 415, + GP_7_9_FN = 416, + GP_7_10_FN = 417, + GP_7_11_FN = 418, + GP_7_12_FN = 419, + GP_7_13_FN = 420, + GP_7_14_FN = 421, + GP_7_15_FN = 422, + GP_7_16_FN = 423, + GP_7_17_FN = 424, + GP_7_18_FN = 425, + GP_7_19_FN = 426, + GP_7_20_FN = 427, + GP_8_0_FN = 428, + GP_8_1_FN = 429, + GP_8_2_FN = 430, + GP_8_3_FN = 431, + GP_8_4_FN = 432, + GP_8_5_FN = 433, + GP_8_6_FN = 434, + GP_8_7_FN = 435, + GP_8_8_FN = 436, + GP_8_9_FN = 437, + GP_8_10_FN = 438, + GP_8_11_FN = 439, + GP_8_12_FN = 440, + GP_8_13_FN = 441, + GP_8_14_FN = 442, + GP_8_15_FN = 443, + GP_8_16_FN = 444, + GP_8_17_FN = 445, + GP_8_18_FN = 446, + GP_8_19_FN = 447, + GP_8_20_FN = 448, + GP_9_0_FN = 449, + GP_9_1_FN = 450, + GP_9_2_FN = 451, + GP_9_3_FN = 452, + GP_9_4_FN = 453, + GP_9_5_FN = 454, + GP_9_6_FN = 455, + GP_9_7_FN = 456, + GP_9_8_FN = 457, + GP_9_9_FN = 458, + GP_9_10_FN = 459, + GP_9_11_FN = 460, + GP_9_12_FN = 461, + GP_9_13_FN = 462, + GP_9_14_FN = 463, + GP_9_15_FN = 464, + GP_9_16_FN = 465, + GP_9_17_FN = 466, + GP_9_18_FN = 467, + GP_9_19_FN = 468, + GP_9_20_FN = 469, + FN_MMC_D7___4 = 470, + FN_MMC_D6___4 = 471, + FN_AVS1___5 = 472, + FN_MMC_D5___4 = 473, + FN_AVS0 = 474, + FN_MMC_D4___4 = 475, + FN_TCLK2_A___9 = 476, + FN_PCIE3_CLKREQ_N = 477, + FN_MMC_SD_CLK = 478, + FN_PCIE2_CLKREQ_N = 479, + FN_MMC_SD_D3 = 480, + FN_PCIE1_CLKREQ_N = 481, + FN_MMC_SD_D2 = 482, + FN_PCIE0_CLKREQ_N = 483, + FN_MMC_SD_D1 = 484, + FN_AVB2_AVTP_PPS = 485, + FN_AVB3_AVTP_PPS = 486, + FN_AVB4_AVTP_PPS = 487, + FN_AVB5_AVTP_PPS = 488, + FN_MMC_SD_D0 = 489, + FN_AVB2_AVTP_CAPTURE = 490, + FN_AVB3_AVTP_CAPTURE = 491, + FN_AVB4_AVTP_CAPTURE = 492, + FN_AVB5_AVTP_CAPTURE = 493, + FN_MMC_SD_CMD = 494, + FN_AVB2_AVTP_MATCH = 495, + FN_AVB3_AVTP_MATCH = 496, + FN_AVB4_AVTP_MATCH = 497, + FN_AVB5_AVTP_MATCH = 498, + FN_MMC_DS___2 = 499, + FN_AVB2_LINK = 500, + FN_AVB3_LINK = 501, + FN_AVB4_LINK = 502, + FN_AVB5_LINK = 503, + FN_SD_CD = 504, + FN_CANFD7_RX = 505, + FN_AVB0_PHY_INT___3 = 506, + FN_AVB1_PHY_INT = 507, + FN_AVB2_PHY_INT = 508, + FN_AVB3_PHY_INT = 509, + FN_AVB4_PHY_INT = 510, + FN_AVB5_PHY_INT = 511, + FN_SD_WP = 512, + FN_CANFD7_TX = 513, + FN_AVB2_MAGIC = 514, + FN_AVB3_MAGIC = 515, + FN_AVB4_MAGIC = 516, + FN_AVB5_MAGIC = 517, + FN_RPC_INT_N___5 = 518, + FN_CANFD6_RX = 519, + FN_AVB2_MDC = 520, + FN_AVB3_MDC = 521, + FN_AVB4_MDC = 522, + FN_AVB5_MDC = 523, + FN_RPC_WP_N___3 = 524, + FN_AVB2_MDIO = 525, + FN_AVB3_MDIO = 526, + FN_AVB4_MDIO = 527, + FN_AVB5_MDIO = 528, + FN_RPC_RESET_N___5 = 529, + FN_AVB2_TXCREFCLK = 530, + FN_AVB3_TXCREFCLK = 531, + FN_AVB4_TXCREFCLK = 532, + FN_AVB5_TXCREFCLK = 533, + FN_QSPI1_SSL___5 = 534, + FN_AVB2_TD3 = 535, + FN_AVB3_TD3 = 536, + FN_AVB4_TD3 = 537, + FN_AVB5_TD3 = 538, + FN_QSPI1_IO3___5 = 539, + FN_AVB2_TD2 = 540, + FN_AVB3_TD2 = 541, + FN_AVB4_TD2 = 542, + FN_AVB5_TD2 = 543, + FN_QSPI1_IO2___5 = 544, + FN_AVB2_TD1 = 545, + FN_AVB3_TD1 = 546, + FN_AVB4_TD1 = 547, + FN_AVB5_TD1 = 548, + FN_QSPI1_MISO_IO1___5 = 549, + FN_AVB2_TD0 = 550, + FN_AVB3_TD0 = 551, + FN_AVB4_TD0 = 552, + FN_AVB5_TD0 = 553, + FN_QSPI1_MOSI_IO0___5 = 554, + FN_AVB2_TXC = 555, + FN_AVB3_TXC = 556, + FN_AVB4_TXC = 557, + FN_AVB5_TXC = 558, + FN_QSPI1_SPCLK___5 = 559, + FN_AVB2_TX_CTL = 560, + FN_AVB3_TX_CTL = 561, + FN_AVB4_TX_CTL = 562, + FN_AVB5_TX_CTL = 563, + FN_QSPI0_SSL___5 = 564, + FN_AVB2_RD3 = 565, + FN_AVB3_RD3 = 566, + FN_AVB4_RD3 = 567, + FN_AVB5_RD3 = 568, + FN_QSPI0_IO3___5 = 569, + FN_CANFD1_RX___9 = 570, + FN_AVB2_RD2 = 571, + FN_AVB3_RD2 = 572, + FN_AVB4_RD2 = 573, + FN_AVB5_RD2 = 574, + FN_QSPI0_IO2___5 = 575, + FN_CANFD1_TX___9 = 576, + FN_AVB2_RD1 = 577, + FN_AVB3_RD1 = 578, + FN_AVB4_RD1 = 579, + FN_AVB5_RD1 = 580, + FN_QSPI0_MISO_IO1___5 = 581, + FN_AVB2_RD0 = 582, + FN_AVB3_RD0 = 583, + FN_AVB4_RD0 = 584, + FN_AVB5_RD0 = 585, + FN_QSPI0_MOSI_IO0___5 = 586, + FN_AVB2_RXC = 587, + FN_AVB3_RXC = 588, + FN_AVB4_RXC = 589, + FN_AVB5_RXC = 590, + FN_QSPI0_SPCLK___5 = 591, + FN_CAN_CLK___7 = 592, + FN_AVB2_RX_CTL = 593, + FN_AVB3_RX_CTL = 594, + FN_AVB4_RX_CTL = 595, + FN_AVB5_RX_CTL = 596, + FN_IP0SR1_3_0 = 597, + FN_SCIF_CLK___2 = 598, + FN_A0___8 = 599, + FN_IP1SR1_3_0 = 600, + FN_MSIOF0_SCK___9 = 601, + FN_DU_DR4___9 = 602, + FN_A8___8 = 603, + FN_IP2SR1_3_0 = 604, + FN_MSIOF1_SS1___5 = 605, + FN_HCTS3_N___8 = 606, + FN_RX3___3 = 607, + FN_DU_DG6___9 = 608, + FN_A16___8 = 609, + FN_IP3SR1_3_0 = 610, + FN_IRQ0___8 = 611, + FN_DU_DOTCLKOUT___3 = 612, + FN_A24___3 = 613, + FN_IP0SR1_7_4 = 614, + FN_HRX0___7 = 615, + FN_RX0___7 = 616, + FN_A1___8 = 617, + FN_IP1SR1_7_4 = 618, + FN_MSIOF0_SYNC___9 = 619, + FN_DU_DR5___9 = 620, + FN_A9___8 = 621, + FN_IP2SR1_7_4 = 622, + FN_MSIOF1_SS2___5 = 623, + FN_HTX3___3 = 624, + FN_TX3___3 = 625, + FN_DU_DG7___9 = 626, + FN_A17___8 = 627, + FN_IP3SR1_7_4 = 628, + FN_IRQ1___8 = 629, + FN_DU_HSYNC___3 = 630, + FN_A25___3 = 631, + FN_IP0SR1_11_8 = 632, + FN_HSCK0___7 = 633, + FN_SCK0___7 = 634, + FN_A2___8 = 635, + FN_IP1SR1_11_8 = 636, + FN_MSIOF0_SS1___9 = 637, + FN_DU_DR6___9 = 638, + FN_A10___8 = 639, + FN_IP2SR1_11_8 = 640, + FN_MSIOF2_RXD___4 = 641, + FN_HSCK1___3 = 642, + FN_SCK1___8 = 643, + FN_DU_DB2___9 = 644, + FN_A18___8 = 645, + FN_IP3SR1_11_8 = 646, + FN_IRQ2___8 = 647, + FN_DU_VSYNC___3 = 648, + FN_CS1_N_A26___3 = 649, + FN_IP0SR1_15_12 = 650, + FN_HRTS0_N___7 = 651, + FN_RTS0_N___8 = 652, + FN_A3___8 = 653, + FN_IP1SR1_15_12 = 654, + FN_MSIOF0_SS2___9 = 655, + FN_DU_DR7___9 = 656, + FN_A11___8 = 657, + FN_IP2SR1_15_12 = 658, + FN_MSIOF2_TXD___4 = 659, + FN_HCTS1_N___3 = 660, + FN_CTS1_N___9 = 661, + FN_DU_DB3___9 = 662, + FN_A19___8 = 663, + FN_IP3SR1_15_12 = 664, + FN_IRQ3___8 = 665, + FN_DU_ODDF_DISP_CDE = 666, + FN_CS0_N___8 = 667, + FN_IP0SR1_19_16 = 668, + FN_HCTS0_N___7 = 669, + FN_CTS0_N___8 = 670, + FN_A4___8 = 671, + FN_IP1SR1_19_16 = 672, + FN_MSIOF1_RXD___5 = 673, + FN_DU_DG2___9 = 674, + FN_A12___8 = 675, + FN_IP2SR1_19_16 = 676, + FN_MSIOF2_SCK___4 = 677, + FN_HRTS1_N___3 = 678, + FN_RTS1_N___9 = 679, + FN_DU_DB4___9 = 680, + FN_A20___2 = 681, + FN_IP3SR1_19_16 = 682, + FN_GP1_28 = 683, + FN_D0___8 = 684, + FN_IP0SR1_23_20 = 685, + FN_HTX0___7 = 686, + FN_TX0___7 = 687, + FN_A5___8 = 688, + FN_IP1SR1_23_20 = 689, + FN_MSIOF1_TXD___5 = 690, + FN_HRX3___3 = 691, + FN_SCK3___7 = 692, + FN_DU_DG3___9 = 693, + FN_A13___8 = 694, + FN_IP2SR1_23_20 = 695, + FN_MSIOF2_SYNC___3 = 696, + FN_HRX1___3 = 697, + FN_RX1_A___8 = 698, + FN_DU_DB5___9 = 699, + FN_A21___2 = 700, + FN_IP3SR1_23_20 = 701, + FN_GP1_29 = 702, + FN_D1___8 = 703, + FN_IP0SR1_27_24 = 704, + FN_MSIOF0_RXD___9 = 705, + FN_DU_DR2___9 = 706, + FN_A6___8 = 707, + FN_IP1SR1_27_24 = 708, + FN_MSIOF1_SCK___5 = 709, + FN_HSCK3___7 = 710, + FN_CTS3_N___7 = 711, + FN_DU_DG4___9 = 712, + FN_A14___8 = 713, + FN_IP2SR1_27_24 = 714, + FN_MSIOF2_SS1___4 = 715, + FN_HTX1___3 = 716, + FN_TX1_A___8 = 717, + FN_DU_DB6___9 = 718, + FN_A22___3 = 719, + FN_IP3SR1_27_24 = 720, + FN_GP1_30 = 721, + FN_D2___8 = 722, + FN_IP0SR1_31_28 = 723, + FN_MSIOF0_TXD___9 = 724, + FN_DU_DR3___9 = 725, + FN_A7___8 = 726, + FN_IP1SR1_31_28 = 727, + FN_MSIOF1_SYNC___5 = 728, + FN_HRTS3_N___8 = 729, + FN_RTS3_N___7 = 730, + FN_DU_DG5___9 = 731, + FN_A15___8 = 732, + FN_IP2SR1_31_28 = 733, + FN_MSIOF2_SS2___4 = 734, + FN_TCLK1_B___9 = 735, + FN_DU_DB7___9 = 736, + FN_A23___3 = 737, + FN_IP3SR1_31_28 = 738, + FN_IP0SR2_3_0 = 739, + FN_IPC_CLKIN = 740, + FN_IPC_CLKEN_IN = 741, + FN_DU_DOTCLKIN = 742, + FN_IP1SR2_3_0 = 743, + FN_GP2_08 = 744, + FN_HRX2___3 = 745, + FN_MSIOF4_SS1 = 746, + FN_RX4___3 = 747, + FN_D9___8 = 748, + FN_IP2SR2_3_0 = 749, + FN_FXR_TXDA_A = 750, + FN_MSIOF3_SS1___3 = 751, + FN_IP0SR2_7_4 = 752, + FN_IPC_CLKOUT = 753, + FN_IPC_CLKEN_OUT = 754, + FN_IP1SR2_7_4 = 755, + FN_GP2_09 = 756, + FN_HTX2___3 = 757, + FN_MSIOF4_SS2 = 758, + FN_TX4___3 = 759, + FN_D10___8 = 760, + FN_IP2SR2_7_4 = 761, + FN_RXDA_EXTFXR_A = 762, + FN_MSIOF3_SS2___3 = 763, + FN_BS_N___8 = 764, + FN_IP0SR2_11_8 = 765, + FN_GP2_02 = 766, + FN_D3___8 = 767, + FN_IP1SR2_11_8 = 768, + FN_GP2_10 = 769, + FN_TCLK2_B___9 = 770, + FN_MSIOF5_RXD = 771, + FN_D11___8 = 772, + FN_IP2SR2_11_8 = 773, + FN_FXR_TXDB___3 = 774, + FN_MSIOF3_RXD___3 = 775, + FN_RD_N___8 = 776, + FN_IP0SR2_15_12 = 777, + FN_GP2_03 = 778, + FN_D4___8 = 779, + FN_IP1SR2_15_12 = 780, + FN_GP2_11 = 781, + FN_TCLK3___2 = 782, + FN_MSIOF5_TXD = 783, + FN_D12___8 = 784, + FN_IP2SR2_15_12 = 785, + FN_RXDB_EXTFXR___3 = 786, + FN_MSIOF3_TXD___3 = 787, + FN_WE0_N___8 = 788, + FN_IP0SR2_19_16 = 789, + FN_GP2_04 = 790, + FN_MSIOF4_RXD = 791, + FN_D5___8 = 792, + FN_IP1SR2_19_16 = 793, + FN_GP2_12 = 794, + FN_TCLK4___2 = 795, + FN_MSIOF5_SCK = 796, + FN_D13___8 = 797, + FN_IP2SR2_19_16 = 798, + FN_CLK_EXTFXR___3 = 799, + FN_MSIOF3_SCK___3 = 800, + FN_WE1_N___8 = 801, + FN_IP0SR2_23_20 = 802, + FN_GP2_05 = 803, + FN_HSCK2___3 = 804, + FN_MSIOF4_TXD = 805, + FN_SCK4___3 = 806, + FN_D6___8 = 807, + FN_IP1SR2_23_20 = 808, + FN_GP2_13 = 809, + FN_MSIOF5_SYNC = 810, + FN_D14___8 = 811, + FN_IP2SR2_23_20 = 812, + FN_TPU0TO0___8 = 813, + FN_MSIOF3_SYNC___3 = 814, + FN_RD_WR_N___8 = 815, + FN_IP0SR2_27_24 = 816, + FN_GP2_06 = 817, + FN_HCTS2_N___3 = 818, + FN_MSIOF4_SCK = 819, + FN_CTS4_N___3 = 820, + FN_D7___8 = 821, + FN_IP1SR2_27_24 = 822, + FN_GP2_14 = 823, + FN_IRQ4___8 = 824, + FN_MSIOF5_SS1 = 825, + FN_D15___8 = 826, + FN_IP2SR2_27_24 = 827, + FN_TPU0TO1___8 = 828, + FN_CLKOUT___7 = 829, + FN_IP0SR2_31_28 = 830, + FN_GP2_07 = 831, + FN_HRTS2_N___3 = 832, + FN_MSIOF4_SYNC = 833, + FN_RTS4_N___3 = 834, + FN_D8___8 = 835, + FN_IP1SR2_31_28 = 836, + FN_GP2_15 = 837, + FN_IRQ5___8 = 838, + FN_MSIOF5_SS2 = 839, + FN_CPG_CPCKOUT___2 = 840, + FN_IP2SR2_31_28 = 841, + FN_TCLK1_A___9 = 842, + FN_EX_WAIT0___4 = 843, + FN_IP0SR3_3_0 = 844, + FN_IP1SR3_3_0 = 845, + FN_CANFD3_RX = 846, + FN_PWM3 = 847, + FN_IP0SR3_7_4 = 848, + FN_CANFD0_TX___3 = 849, + FN_FXR_TXDA_B = 850, + FN_TX1_B___8 = 851, + FN_IP1SR3_7_4 = 852, + FN_CANFD4_TX = 853, + FN_PWM4 = 854, + FN_FXR_CLKOUT1___2 = 855, + FN_IP0SR3_11_8 = 856, + FN_CANFD0_RX___3 = 857, + FN_RXDA_EXTFXR_B = 858, + FN_RX1_B___8 = 859, + FN_IP1SR3_11_8 = 860, + FN_CANFD4_RX = 861, + FN_FXR_CLKOUT2___2 = 862, + FN_IP0SR3_15_12 = 863, + FN_IP1SR3_15_12 = 864, + FN_CANFD5_TX = 865, + FN_FXR_TXENA_N___3 = 866, + FN_IP0SR3_19_16 = 867, + FN_IP1SR3_19_16 = 868, + FN_CANFD5_RX = 869, + FN_FXR_TXENB_N___3 = 870, + FN_IP0SR3_23_20 = 871, + FN_CANFD2_TX = 872, + FN_TPU0TO2___8 = 873, + FN_PWM0___5 = 874, + FN_IP1SR3_23_20 = 875, + FN_CANFD6_TX = 876, + FN_STPWT_EXTFXR = 877, + FN_IP0SR3_27_24 = 878, + FN_CANFD2_RX = 879, + FN_TPU0TO3___8 = 880, + FN_PWM1 = 881, + FN_IP1SR3_27_24 = 882, + FN_IP0SR3_31_28 = 883, + FN_CANFD3_TX = 884, + FN_PWM2 = 885, + FN_IP1SR3_31_28 = 886, + FN_IP0SR4_3_0 = 887, + FN_AVB0_RX_CTL___3 = 888, + FN_AVB0_MII_RX_DV = 889, + FN_IP1SR4_3_0 = 890, + FN_AVB0_TD0___3 = 891, + FN_AVB0_MII_TD0 = 892, + FN_IP2SR4_3_0 = 893, + FN_IP0SR4_7_4 = 894, + FN_AVB0_RXC___3 = 895, + FN_AVB0_MII_RXC = 896, + FN_IP1SR4_7_4 = 897, + FN_AVB0_TD1___3 = 898, + FN_AVB0_MII_TD1 = 899, + FN_IP2SR4_7_4 = 900, + FN_AVB0_LINK___3 = 901, + FN_AVB0_MII_TX_ER = 902, + FN_IP0SR4_11_8 = 903, + FN_AVB0_RD0___3 = 904, + FN_AVB0_MII_RD0 = 905, + FN_IP1SR4_11_8 = 906, + FN_AVB0_TD2___3 = 907, + FN_AVB0_MII_TD2 = 908, + FN_IP2SR4_11_8 = 909, + FN_AVB0_AVTP_MATCH___2 = 910, + FN_AVB0_MII_RX_ER = 911, + FN_CC5_OSCOUT = 912, + FN_IP0SR4_15_12 = 913, + FN_AVB0_RD1___3 = 914, + FN_AVB0_MII_RD1 = 915, + FN_IP1SR4_15_12 = 916, + FN_AVB0_TD3___3 = 917, + FN_AVB0_MII_TD3 = 918, + FN_IP2SR4_15_12 = 919, + FN_AVB0_AVTP_CAPTURE___2 = 920, + FN_AVB0_MII_CRS = 921, + FN_IP0SR4_19_16 = 922, + FN_AVB0_RD2___3 = 923, + FN_AVB0_MII_RD2 = 924, + FN_IP1SR4_19_16 = 925, + FN_AVB0_TXCREFCLK___3 = 926, + FN_IP2SR4_19_16 = 927, + FN_AVB0_AVTP_PPS___2 = 928, + FN_AVB0_MII_COL = 929, + FN_IP0SR4_23_20 = 930, + FN_AVB0_RD3___3 = 931, + FN_AVB0_MII_RD3 = 932, + FN_IP1SR4_23_20 = 933, + FN_AVB0_MDIO___3 = 934, + FN_IP2SR4_23_20 = 935, + FN_IP0SR4_27_24 = 936, + FN_AVB0_TX_CTL___3 = 937, + FN_AVB0_MII_TX_EN = 938, + FN_IP1SR4_27_24 = 939, + FN_AVB0_MDC___3 = 940, + FN_IP2SR4_27_24 = 941, + FN_IP0SR4_31_28 = 942, + FN_AVB0_TXC___3 = 943, + FN_AVB0_MII_TXC = 944, + FN_IP1SR4_31_28 = 945, + FN_AVB0_MAGIC___3 = 946, + FN_IP2SR4_31_28 = 947, + FN_IP0SR5_3_0 = 948, + FN_AVB1_RX_CTL = 949, + FN_AVB1_MII_RX_DV = 950, + FN_IP1SR5_3_0 = 951, + FN_AVB1_TD0 = 952, + FN_AVB1_MII_TD0 = 953, + FN_IP2SR5_3_0 = 954, + FN_IP0SR5_7_4 = 955, + FN_AVB1_RXC = 956, + FN_AVB1_MII_RXC = 957, + FN_IP1SR5_7_4 = 958, + FN_AVB1_TD1 = 959, + FN_AVB1_MII_TD1 = 960, + FN_IP2SR5_7_4 = 961, + FN_AVB1_LINK = 962, + FN_AVB1_MII_TX_ER = 963, + FN_IP0SR5_11_8 = 964, + FN_AVB1_RD0 = 965, + FN_AVB1_MII_RD0 = 966, + FN_IP1SR5_11_8 = 967, + FN_AVB1_TD2 = 968, + FN_AVB1_MII_TD2 = 969, + FN_IP2SR5_11_8 = 970, + FN_AVB1_AVTP_MATCH = 971, + FN_AVB1_MII_RX_ER = 972, + FN_IP0SR5_15_12 = 973, + FN_AVB1_RD1 = 974, + FN_AVB1_MII_RD1 = 975, + FN_IP1SR5_15_12 = 976, + FN_AVB1_TD3 = 977, + FN_AVB1_MII_TD3 = 978, + FN_IP2SR5_15_12 = 979, + FN_AVB1_AVTP_CAPTURE = 980, + FN_AVB1_MII_CRS = 981, + FN_IP0SR5_19_16 = 982, + FN_AVB1_RD2 = 983, + FN_AVB1_MII_RD2 = 984, + FN_IP1SR5_19_16 = 985, + FN_AVB1_TXCREFCLK = 986, + FN_IP2SR5_19_16 = 987, + FN_AVB1_AVTP_PPS = 988, + FN_AVB1_MII_COL = 989, + FN_IP0SR5_23_20 = 990, + FN_AVB1_RD3 = 991, + FN_AVB1_MII_RD3 = 992, + FN_IP1SR5_23_20 = 993, + FN_AVB1_MDIO = 994, + FN_IP2SR5_23_20 = 995, + FN_IP0SR5_27_24 = 996, + FN_AVB1_TX_CTL = 997, + FN_AVB1_MII_TX_EN = 998, + FN_IP1SR5_27_24 = 999, + FN_AVB1_MDC = 1000, + FN_IP2SR5_27_24 = 1001, + FN_IP0SR5_31_28 = 1002, + FN_AVB1_TXC = 1003, + FN_AVB1_MII_TXC = 1004, + FN_IP1SR5_31_28 = 1005, + FN_AVB1_MAGIC = 1006, + FN_IP2SR5_31_28 = 1007, + FN_SEL_I2C6_0___6 = 1008, + FN_SEL_I2C6_3 = 1009, + FN_SEL_I2C5_0 = 1010, + FN_SEL_I2C5_3 = 1011, + FN_SEL_I2C4_0 = 1012, + FN_SEL_I2C4_3 = 1013, + FN_SEL_I2C3_0___3 = 1014, + FN_SEL_I2C3_3 = 1015, + FN_SEL_I2C2_0___7 = 1016, + FN_SEL_I2C2_3___2 = 1017, + FN_SEL_I2C1_0___6 = 1018, + FN_SEL_I2C1_3___2 = 1019, + FN_SEL_I2C0_0 = 1020, + FN_SEL_I2C0_3 = 1021, + PINMUX_FUNCTION_END___9 = 1022, + PINMUX_MARK_BEGIN___9 = 1023, + MMC_D7_MARK___4 = 1024, + MMC_D6_MARK___4 = 1025, + AVS1_MARK___5 = 1026, + MMC_D5_MARK___4 = 1027, + AVS0_MARK = 1028, + MMC_D4_MARK___4 = 1029, + TCLK2_A_MARK___9 = 1030, + PCIE3_CLKREQ_N_MARK = 1031, + MMC_SD_CLK_MARK = 1032, + PCIE2_CLKREQ_N_MARK = 1033, + MMC_SD_D3_MARK = 1034, + PCIE1_CLKREQ_N_MARK = 1035, + MMC_SD_D2_MARK = 1036, + PCIE0_CLKREQ_N_MARK = 1037, + MMC_SD_D1_MARK = 1038, + AVB2_AVTP_PPS_MARK = 1039, + AVB3_AVTP_PPS_MARK = 1040, + AVB4_AVTP_PPS_MARK = 1041, + AVB5_AVTP_PPS_MARK = 1042, + MMC_SD_D0_MARK = 1043, + AVB2_AVTP_CAPTURE_MARK = 1044, + AVB3_AVTP_CAPTURE_MARK = 1045, + AVB4_AVTP_CAPTURE_MARK = 1046, + AVB5_AVTP_CAPTURE_MARK = 1047, + MMC_SD_CMD_MARK = 1048, + AVB2_AVTP_MATCH_MARK = 1049, + AVB3_AVTP_MATCH_MARK = 1050, + AVB4_AVTP_MATCH_MARK = 1051, + AVB5_AVTP_MATCH_MARK = 1052, + MMC_DS_MARK___2 = 1053, + AVB2_LINK_MARK = 1054, + AVB3_LINK_MARK = 1055, + AVB4_LINK_MARK = 1056, + AVB5_LINK_MARK = 1057, + SD_CD_MARK = 1058, + CANFD7_RX_MARK = 1059, + AVB0_PHY_INT_MARK___3 = 1060, + AVB1_PHY_INT_MARK = 1061, + AVB2_PHY_INT_MARK = 1062, + AVB3_PHY_INT_MARK = 1063, + AVB4_PHY_INT_MARK = 1064, + AVB5_PHY_INT_MARK = 1065, + SD_WP_MARK = 1066, + CANFD7_TX_MARK = 1067, + AVB2_MAGIC_MARK = 1068, + AVB3_MAGIC_MARK = 1069, + AVB4_MAGIC_MARK = 1070, + AVB5_MAGIC_MARK = 1071, + RPC_INT_N_MARK___5 = 1072, + CANFD6_RX_MARK = 1073, + AVB2_MDC_MARK = 1074, + AVB3_MDC_MARK = 1075, + AVB4_MDC_MARK = 1076, + AVB5_MDC_MARK = 1077, + RPC_WP_N_MARK___3 = 1078, + AVB2_MDIO_MARK = 1079, + AVB3_MDIO_MARK = 1080, + AVB4_MDIO_MARK = 1081, + AVB5_MDIO_MARK = 1082, + RPC_RESET_N_MARK___5 = 1083, + AVB2_TXCREFCLK_MARK = 1084, + AVB3_TXCREFCLK_MARK = 1085, + AVB4_TXCREFCLK_MARK = 1086, + AVB5_TXCREFCLK_MARK = 1087, + QSPI1_SSL_MARK___9 = 1088, + AVB2_TD3_MARK = 1089, + AVB3_TD3_MARK = 1090, + AVB4_TD3_MARK = 1091, + AVB5_TD3_MARK = 1092, + QSPI1_IO3_MARK___9 = 1093, + AVB2_TD2_MARK = 1094, + AVB3_TD2_MARK = 1095, + AVB4_TD2_MARK = 1096, + AVB5_TD2_MARK = 1097, + QSPI1_IO2_MARK___9 = 1098, + AVB2_TD1_MARK = 1099, + AVB3_TD1_MARK = 1100, + AVB4_TD1_MARK = 1101, + AVB5_TD1_MARK = 1102, + QSPI1_MISO_IO1_MARK___9 = 1103, + AVB2_TD0_MARK = 1104, + AVB3_TD0_MARK = 1105, + AVB4_TD0_MARK = 1106, + AVB5_TD0_MARK = 1107, + QSPI1_MOSI_IO0_MARK___9 = 1108, + AVB2_TXC_MARK = 1109, + AVB3_TXC_MARK = 1110, + AVB4_TXC_MARK = 1111, + AVB5_TXC_MARK = 1112, + QSPI1_SPCLK_MARK___9 = 1113, + AVB2_TX_CTL_MARK = 1114, + AVB3_TX_CTL_MARK = 1115, + AVB4_TX_CTL_MARK = 1116, + AVB5_TX_CTL_MARK = 1117, + QSPI0_SSL_MARK___9 = 1118, + AVB2_RD3_MARK = 1119, + AVB3_RD3_MARK = 1120, + AVB4_RD3_MARK = 1121, + AVB5_RD3_MARK = 1122, + QSPI0_IO3_MARK___9 = 1123, + CANFD1_RX_MARK___9 = 1124, + AVB2_RD2_MARK = 1125, + AVB3_RD2_MARK = 1126, + AVB4_RD2_MARK = 1127, + AVB5_RD2_MARK = 1128, + QSPI0_IO2_MARK___9 = 1129, + CANFD1_TX_MARK___9 = 1130, + AVB2_RD1_MARK = 1131, + AVB3_RD1_MARK = 1132, + AVB4_RD1_MARK = 1133, + AVB5_RD1_MARK = 1134, + QSPI0_MISO_IO1_MARK___9 = 1135, + AVB2_RD0_MARK = 1136, + AVB3_RD0_MARK = 1137, + AVB4_RD0_MARK = 1138, + AVB5_RD0_MARK = 1139, + QSPI0_MOSI_IO0_MARK___9 = 1140, + AVB2_RXC_MARK = 1141, + AVB3_RXC_MARK = 1142, + AVB4_RXC_MARK = 1143, + AVB5_RXC_MARK = 1144, + QSPI0_SPCLK_MARK___9 = 1145, + CAN_CLK_MARK___7 = 1146, + AVB2_RX_CTL_MARK = 1147, + AVB3_RX_CTL_MARK = 1148, + AVB4_RX_CTL_MARK = 1149, + AVB5_RX_CTL_MARK = 1150, + IP0SR1_3_0_MARK = 1151, + SCIF_CLK_MARK___2 = 1152, + A0_MARK___8 = 1153, + IP1SR1_3_0_MARK = 1154, + MSIOF0_SCK_MARK___9 = 1155, + DU_DR4_MARK___9 = 1156, + A8_MARK___8 = 1157, + IP2SR1_3_0_MARK = 1158, + MSIOF1_SS1_MARK___5 = 1159, + HCTS3_N_MARK___8 = 1160, + RX3_MARK___3 = 1161, + DU_DG6_MARK___9 = 1162, + A16_MARK___8 = 1163, + IP3SR1_3_0_MARK = 1164, + IRQ0_MARK___8 = 1165, + DU_DOTCLKOUT_MARK___3 = 1166, + A24_MARK___3 = 1167, + IP0SR1_7_4_MARK = 1168, + HRX0_MARK___7 = 1169, + RX0_MARK___7 = 1170, + A1_MARK___8 = 1171, + IP1SR1_7_4_MARK = 1172, + MSIOF0_SYNC_MARK___9 = 1173, + DU_DR5_MARK___9 = 1174, + A9_MARK___8 = 1175, + IP2SR1_7_4_MARK = 1176, + MSIOF1_SS2_MARK___5 = 1177, + HTX3_MARK___3 = 1178, + TX3_MARK___3 = 1179, + DU_DG7_MARK___9 = 1180, + A17_MARK___8 = 1181, + IP3SR1_7_4_MARK = 1182, + IRQ1_MARK___8 = 1183, + DU_HSYNC_MARK___3 = 1184, + A25_MARK___3 = 1185, + IP0SR1_11_8_MARK = 1186, + HSCK0_MARK___7 = 1187, + SCK0_MARK___7 = 1188, + A2_MARK___8 = 1189, + IP1SR1_11_8_MARK = 1190, + MSIOF0_SS1_MARK___9 = 1191, + DU_DR6_MARK___9 = 1192, + A10_MARK___8 = 1193, + IP2SR1_11_8_MARK = 1194, + MSIOF2_RXD_MARK___4 = 1195, + HSCK1_MARK___3 = 1196, + SCK1_MARK___8 = 1197, + DU_DB2_MARK___9 = 1198, + A18_MARK___8 = 1199, + IP3SR1_11_8_MARK = 1200, + IRQ2_MARK___8 = 1201, + DU_VSYNC_MARK___3 = 1202, + CS1_N_A26_MARK___3 = 1203, + IP0SR1_15_12_MARK = 1204, + HRTS0_N_MARK___7 = 1205, + RTS0_N_MARK___8 = 1206, + A3_MARK___8 = 1207, + IP1SR1_15_12_MARK = 1208, + MSIOF0_SS2_MARK___9 = 1209, + DU_DR7_MARK___9 = 1210, + A11_MARK___8 = 1211, + IP2SR1_15_12_MARK = 1212, + MSIOF2_TXD_MARK___4 = 1213, + HCTS1_N_MARK___3 = 1214, + CTS1_N_MARK___9 = 1215, + DU_DB3_MARK___9 = 1216, + A19_MARK___8 = 1217, + IP3SR1_15_12_MARK = 1218, + IRQ3_MARK___8 = 1219, + DU_ODDF_DISP_CDE_MARK = 1220, + CS0_N_MARK___8 = 1221, + IP0SR1_19_16_MARK = 1222, + HCTS0_N_MARK___7 = 1223, + CTS0_N_MARK___8 = 1224, + A4_MARK___8 = 1225, + IP1SR1_19_16_MARK = 1226, + MSIOF1_RXD_MARK___5 = 1227, + DU_DG2_MARK___9 = 1228, + A12_MARK___8 = 1229, + IP2SR1_19_16_MARK = 1230, + MSIOF2_SCK_MARK___4 = 1231, + HRTS1_N_MARK___3 = 1232, + RTS1_N_MARK___9 = 1233, + DU_DB4_MARK___9 = 1234, + A20_MARK___2 = 1235, + IP3SR1_19_16_MARK = 1236, + GP1_28_MARK = 1237, + D0_MARK___8 = 1238, + IP0SR1_23_20_MARK = 1239, + HTX0_MARK___7 = 1240, + TX0_MARK___7 = 1241, + A5_MARK___8 = 1242, + IP1SR1_23_20_MARK = 1243, + MSIOF1_TXD_MARK___5 = 1244, + HRX3_MARK___3 = 1245, + SCK3_MARK___7 = 1246, + DU_DG3_MARK___9 = 1247, + A13_MARK___8 = 1248, + IP2SR1_23_20_MARK = 1249, + MSIOF2_SYNC_MARK___3 = 1250, + HRX1_MARK___3 = 1251, + RX1_A_MARK___8 = 1252, + DU_DB5_MARK___9 = 1253, + A21_MARK___2 = 1254, + IP3SR1_23_20_MARK = 1255, + GP1_29_MARK = 1256, + D1_MARK___8 = 1257, + IP0SR1_27_24_MARK = 1258, + MSIOF0_RXD_MARK___9 = 1259, + DU_DR2_MARK___9 = 1260, + A6_MARK___8 = 1261, + IP1SR1_27_24_MARK = 1262, + MSIOF1_SCK_MARK___5 = 1263, + HSCK3_MARK___7 = 1264, + CTS3_N_MARK___7 = 1265, + DU_DG4_MARK___9 = 1266, + A14_MARK___8 = 1267, + IP2SR1_27_24_MARK = 1268, + MSIOF2_SS1_MARK___4 = 1269, + HTX1_MARK___3 = 1270, + TX1_A_MARK___8 = 1271, + DU_DB6_MARK___9 = 1272, + A22_MARK___3 = 1273, + IP3SR1_27_24_MARK = 1274, + GP1_30_MARK = 1275, + D2_MARK___8 = 1276, + IP0SR1_31_28_MARK = 1277, + MSIOF0_TXD_MARK___9 = 1278, + DU_DR3_MARK___9 = 1279, + A7_MARK___8 = 1280, + IP1SR1_31_28_MARK = 1281, + MSIOF1_SYNC_MARK___5 = 1282, + HRTS3_N_MARK___8 = 1283, + RTS3_N_MARK___7 = 1284, + DU_DG5_MARK___9 = 1285, + A15_MARK___8 = 1286, + IP2SR1_31_28_MARK = 1287, + MSIOF2_SS2_MARK___4 = 1288, + TCLK1_B_MARK___9 = 1289, + DU_DB7_MARK___9 = 1290, + A23_MARK___3 = 1291, + IP3SR1_31_28_MARK = 1292, + IP0SR2_3_0_MARK = 1293, + IPC_CLKIN_MARK = 1294, + IPC_CLKEN_IN_MARK = 1295, + DU_DOTCLKIN_MARK = 1296, + IP1SR2_3_0_MARK = 1297, + GP2_08_MARK = 1298, + HRX2_MARK___3 = 1299, + MSIOF4_SS1_MARK = 1300, + RX4_MARK___3 = 1301, + D9_MARK___8 = 1302, + IP2SR2_3_0_MARK = 1303, + FXR_TXDA_A_MARK = 1304, + MSIOF3_SS1_MARK___3 = 1305, + IP0SR2_7_4_MARK = 1306, + IPC_CLKOUT_MARK = 1307, + IPC_CLKEN_OUT_MARK = 1308, + IP1SR2_7_4_MARK = 1309, + GP2_09_MARK = 1310, + HTX2_MARK___3 = 1311, + MSIOF4_SS2_MARK = 1312, + TX4_MARK___3 = 1313, + D10_MARK___8 = 1314, + IP2SR2_7_4_MARK = 1315, + RXDA_EXTFXR_A_MARK = 1316, + MSIOF3_SS2_MARK___3 = 1317, + BS_N_MARK___8 = 1318, + IP0SR2_11_8_MARK = 1319, + GP2_02_MARK = 1320, + D3_MARK___8 = 1321, + IP1SR2_11_8_MARK = 1322, + GP2_10_MARK = 1323, + TCLK2_B_MARK___9 = 1324, + MSIOF5_RXD_MARK = 1325, + D11_MARK___8 = 1326, + IP2SR2_11_8_MARK = 1327, + FXR_TXDB_MARK___3 = 1328, + MSIOF3_RXD_MARK___3 = 1329, + RD_N_MARK___8 = 1330, + IP0SR2_15_12_MARK = 1331, + GP2_03_MARK = 1332, + D4_MARK___8 = 1333, + IP1SR2_15_12_MARK = 1334, + GP2_11_MARK = 1335, + TCLK3_MARK___2 = 1336, + MSIOF5_TXD_MARK = 1337, + D12_MARK___8 = 1338, + IP2SR2_15_12_MARK = 1339, + RXDB_EXTFXR_MARK___3 = 1340, + MSIOF3_TXD_MARK___3 = 1341, + WE0_N_MARK___8 = 1342, + IP0SR2_19_16_MARK = 1343, + GP2_04_MARK = 1344, + MSIOF4_RXD_MARK = 1345, + D5_MARK___8 = 1346, + IP1SR2_19_16_MARK = 1347, + GP2_12_MARK = 1348, + TCLK4_MARK___2 = 1349, + MSIOF5_SCK_MARK = 1350, + D13_MARK___8 = 1351, + IP2SR2_19_16_MARK = 1352, + CLK_EXTFXR_MARK___3 = 1353, + MSIOF3_SCK_MARK___3 = 1354, + WE1_N_MARK___8 = 1355, + IP0SR2_23_20_MARK = 1356, + GP2_05_MARK = 1357, + HSCK2_MARK___3 = 1358, + MSIOF4_TXD_MARK = 1359, + SCK4_MARK___3 = 1360, + D6_MARK___8 = 1361, + IP1SR2_23_20_MARK = 1362, + GP2_13_MARK = 1363, + MSIOF5_SYNC_MARK = 1364, + D14_MARK___8 = 1365, + IP2SR2_23_20_MARK = 1366, + TPU0TO0_MARK___8 = 1367, + MSIOF3_SYNC_MARK___3 = 1368, + RD_WR_N_MARK___8 = 1369, + IP0SR2_27_24_MARK = 1370, + GP2_06_MARK = 1371, + HCTS2_N_MARK___3 = 1372, + MSIOF4_SCK_MARK = 1373, + CTS4_N_MARK___3 = 1374, + D7_MARK___8 = 1375, + IP1SR2_27_24_MARK = 1376, + GP2_14_MARK = 1377, + IRQ4_MARK___8 = 1378, + MSIOF5_SS1_MARK = 1379, + D15_MARK___8 = 1380, + IP2SR2_27_24_MARK = 1381, + TPU0TO1_MARK___8 = 1382, + CLKOUT_MARK___8 = 1383, + IP0SR2_31_28_MARK = 1384, + GP2_07_MARK = 1385, + HRTS2_N_MARK___3 = 1386, + MSIOF4_SYNC_MARK = 1387, + RTS4_N_MARK___3 = 1388, + D8_MARK___8 = 1389, + IP1SR2_31_28_MARK = 1390, + GP2_15_MARK = 1391, + IRQ5_MARK___8 = 1392, + MSIOF5_SS2_MARK = 1393, + CPG_CPCKOUT_MARK___2 = 1394, + IP2SR2_31_28_MARK = 1395, + TCLK1_A_MARK___9 = 1396, + EX_WAIT0_MARK___4 = 1397, + IP0SR3_3_0_MARK = 1398, + IP1SR3_3_0_MARK = 1399, + CANFD3_RX_MARK = 1400, + PWM3_MARK = 1401, + IP0SR3_7_4_MARK = 1402, + CANFD0_TX_MARK___3 = 1403, + FXR_TXDA_B_MARK = 1404, + TX1_B_MARK___8 = 1405, + IP1SR3_7_4_MARK = 1406, + CANFD4_TX_MARK = 1407, + PWM4_MARK = 1408, + FXR_CLKOUT1_MARK___2 = 1409, + IP0SR3_11_8_MARK = 1410, + CANFD0_RX_MARK___3 = 1411, + RXDA_EXTFXR_B_MARK = 1412, + RX1_B_MARK___8 = 1413, + IP1SR3_11_8_MARK = 1414, + CANFD4_RX_MARK = 1415, + FXR_CLKOUT2_MARK___2 = 1416, + IP0SR3_15_12_MARK = 1417, + IP1SR3_15_12_MARK = 1418, + CANFD5_TX_MARK = 1419, + FXR_TXENA_N_MARK___3 = 1420, + IP0SR3_19_16_MARK = 1421, + IP1SR3_19_16_MARK = 1422, + CANFD5_RX_MARK = 1423, + FXR_TXENB_N_MARK___3 = 1424, + IP0SR3_23_20_MARK = 1425, + CANFD2_TX_MARK = 1426, + TPU0TO2_MARK___8 = 1427, + PWM0_MARK___5 = 1428, + IP1SR3_23_20_MARK = 1429, + CANFD6_TX_MARK = 1430, + STPWT_EXTFXR_MARK = 1431, + IP0SR3_27_24_MARK = 1432, + CANFD2_RX_MARK = 1433, + TPU0TO3_MARK___8 = 1434, + PWM1_MARK = 1435, + IP1SR3_27_24_MARK = 1436, + IP0SR3_31_28_MARK = 1437, + CANFD3_TX_MARK = 1438, + PWM2_MARK = 1439, + IP1SR3_31_28_MARK = 1440, + IP0SR4_3_0_MARK = 1441, + AVB0_RX_CTL_MARK___3 = 1442, + AVB0_MII_RX_DV_MARK = 1443, + IP1SR4_3_0_MARK = 1444, + AVB0_TD0_MARK___3 = 1445, + AVB0_MII_TD0_MARK = 1446, + IP2SR4_3_0_MARK = 1447, + IP0SR4_7_4_MARK = 1448, + AVB0_RXC_MARK___3 = 1449, + AVB0_MII_RXC_MARK = 1450, + IP1SR4_7_4_MARK = 1451, + AVB0_TD1_MARK___3 = 1452, + AVB0_MII_TD1_MARK = 1453, + IP2SR4_7_4_MARK = 1454, + AVB0_LINK_MARK___3 = 1455, + AVB0_MII_TX_ER_MARK = 1456, + IP0SR4_11_8_MARK = 1457, + AVB0_RD0_MARK___3 = 1458, + AVB0_MII_RD0_MARK = 1459, + IP1SR4_11_8_MARK = 1460, + AVB0_TD2_MARK___3 = 1461, + AVB0_MII_TD2_MARK = 1462, + IP2SR4_11_8_MARK = 1463, + AVB0_AVTP_MATCH_MARK___2 = 1464, + AVB0_MII_RX_ER_MARK = 1465, + CC5_OSCOUT_MARK = 1466, + IP0SR4_15_12_MARK = 1467, + AVB0_RD1_MARK___3 = 1468, + AVB0_MII_RD1_MARK = 1469, + IP1SR4_15_12_MARK = 1470, + AVB0_TD3_MARK___3 = 1471, + AVB0_MII_TD3_MARK = 1472, + IP2SR4_15_12_MARK = 1473, + AVB0_AVTP_CAPTURE_MARK___2 = 1474, + AVB0_MII_CRS_MARK = 1475, + IP0SR4_19_16_MARK = 1476, + AVB0_RD2_MARK___3 = 1477, + AVB0_MII_RD2_MARK = 1478, + IP1SR4_19_16_MARK = 1479, + AVB0_TXCREFCLK_MARK___3 = 1480, + IP2SR4_19_16_MARK = 1481, + AVB0_AVTP_PPS_MARK___2 = 1482, + AVB0_MII_COL_MARK = 1483, + IP0SR4_23_20_MARK = 1484, + AVB0_RD3_MARK___3 = 1485, + AVB0_MII_RD3_MARK = 1486, + IP1SR4_23_20_MARK = 1487, + AVB0_MDIO_MARK___3 = 1488, + IP2SR4_23_20_MARK = 1489, + IP0SR4_27_24_MARK = 1490, + AVB0_TX_CTL_MARK___3 = 1491, + AVB0_MII_TX_EN_MARK = 1492, + IP1SR4_27_24_MARK = 1493, + AVB0_MDC_MARK___3 = 1494, + IP2SR4_27_24_MARK = 1495, + IP0SR4_31_28_MARK = 1496, + AVB0_TXC_MARK___3 = 1497, + AVB0_MII_TXC_MARK = 1498, + IP1SR4_31_28_MARK = 1499, + AVB0_MAGIC_MARK___3 = 1500, + IP2SR4_31_28_MARK = 1501, + IP0SR5_3_0_MARK = 1502, + AVB1_RX_CTL_MARK = 1503, + AVB1_MII_RX_DV_MARK = 1504, + IP1SR5_3_0_MARK = 1505, + AVB1_TD0_MARK = 1506, + AVB1_MII_TD0_MARK = 1507, + IP2SR5_3_0_MARK = 1508, + IP0SR5_7_4_MARK = 1509, + AVB1_RXC_MARK = 1510, + AVB1_MII_RXC_MARK = 1511, + IP1SR5_7_4_MARK = 1512, + AVB1_TD1_MARK = 1513, + AVB1_MII_TD1_MARK = 1514, + IP2SR5_7_4_MARK = 1515, + AVB1_LINK_MARK = 1516, + AVB1_MII_TX_ER_MARK = 1517, + IP0SR5_11_8_MARK = 1518, + AVB1_RD0_MARK = 1519, + AVB1_MII_RD0_MARK = 1520, + IP1SR5_11_8_MARK = 1521, + AVB1_TD2_MARK = 1522, + AVB1_MII_TD2_MARK = 1523, + IP2SR5_11_8_MARK = 1524, + AVB1_AVTP_MATCH_MARK = 1525, + AVB1_MII_RX_ER_MARK = 1526, + IP0SR5_15_12_MARK = 1527, + AVB1_RD1_MARK = 1528, + AVB1_MII_RD1_MARK = 1529, + IP1SR5_15_12_MARK = 1530, + AVB1_TD3_MARK = 1531, + AVB1_MII_TD3_MARK = 1532, + IP2SR5_15_12_MARK = 1533, + AVB1_AVTP_CAPTURE_MARK = 1534, + AVB1_MII_CRS_MARK = 1535, + IP0SR5_19_16_MARK = 1536, + AVB1_RD2_MARK = 1537, + AVB1_MII_RD2_MARK = 1538, + IP1SR5_19_16_MARK = 1539, + AVB1_TXCREFCLK_MARK = 1540, + IP2SR5_19_16_MARK = 1541, + AVB1_AVTP_PPS_MARK = 1542, + AVB1_MII_COL_MARK = 1543, + IP0SR5_23_20_MARK = 1544, + AVB1_RD3_MARK = 1545, + AVB1_MII_RD3_MARK = 1546, + IP1SR5_23_20_MARK = 1547, + AVB1_MDIO_MARK = 1548, + IP2SR5_23_20_MARK = 1549, + IP0SR5_27_24_MARK = 1550, + AVB1_TX_CTL_MARK = 1551, + AVB1_MII_TX_EN_MARK = 1552, + IP1SR5_27_24_MARK = 1553, + AVB1_MDC_MARK = 1554, + IP2SR5_27_24_MARK = 1555, + IP0SR5_31_28_MARK = 1556, + AVB1_TXC_MARK = 1557, + AVB1_MII_TXC_MARK = 1558, + IP1SR5_31_28_MARK = 1559, + AVB1_MAGIC_MARK = 1560, + IP2SR5_31_28_MARK = 1561, + SEL_I2C6_0_MARK___6 = 1562, + SEL_I2C6_3_MARK = 1563, + SEL_I2C5_0_MARK = 1564, + SEL_I2C5_3_MARK = 1565, + SEL_I2C4_0_MARK = 1566, + SEL_I2C4_3_MARK = 1567, + SEL_I2C3_0_MARK___3 = 1568, + SEL_I2C3_3_MARK = 1569, + SEL_I2C2_0_MARK___7 = 1570, + SEL_I2C2_3_MARK___2 = 1571, + SEL_I2C1_0_MARK___6 = 1572, + SEL_I2C1_3_MARK___2 = 1573, + SEL_I2C0_0_MARK = 1574, + SEL_I2C0_3_MARK = 1575, + SCL0_MARK___8 = 1576, + SDA0_MARK___8 = 1577, + SCL1_MARK___4 = 1578, + SDA1_MARK___4 = 1579, + SCL2_MARK___3 = 1580, + SDA2_MARK___3 = 1581, + SCL3_MARK___6 = 1582, + SDA3_MARK___6 = 1583, + SCL4_MARK___4 = 1584, + SDA4_MARK___4 = 1585, + SCL5_MARK___7 = 1586, + SDA5_MARK___7 = 1587, + SCL6_MARK = 1588, + SDA6_MARK = 1589, + PINMUX_MARK_END___9 = 1590, +}; + +enum ioctrl_regs___6 { + POC0 = 0, + POC1 = 1, + POC2 = 2, + POC4 = 3, + POC5 = 4, + POC6 = 5, + POC7 = 6, + POC8 = 7, + POC9 = 8, + TD1SEL0 = 9, +}; + +struct rzg2l_dedicated_configs { + const char *name; + u32 config; +}; + +struct rzg2l_pinctrl_data { + const char * const *port_pins; + const u32 *port_pin_configs; + struct rzg2l_dedicated_configs *dedicated_pins; + unsigned int n_port_pins; + unsigned int n_dedicated_pins; +}; + +struct rzg2l_pinctrl { + struct pinctrl_dev *pctl; + struct pinctrl_desc desc; + struct pinctrl_pin_desc *pins; + const struct rzg2l_pinctrl_data *data; + void *base; + struct device *dev; + struct clk *clk; + struct gpio_chip gpio_chip; + struct pinctrl_gpio_range gpio_range; + spinlock_t lock; +}; + +enum pin_type { + GLOBAL_CTRL_PIN = 0, + COMMON_PIN = 1, + MISC_PIN = 2, +}; + +struct sprd_pins_info { + const char *name; + unsigned int num; + enum pin_type type; + long unsigned int bit_offset; + long unsigned int bit_width; + unsigned int reg; +}; + +enum pin_sleep_mode { + AP_SLEEP = 1, + PUBCP_SLEEP = 2, + TGLDSP_SLEEP = 4, + AGDSP_SLEEP = 8, + CM4_SLEEP = 16, +}; + +enum pin_func_sel { + PIN_FUNC_1 = 0, + PIN_FUNC_2 = 1, + PIN_FUNC_3 = 2, + PIN_FUNC_4 = 3, + PIN_FUNC_MAX = 4, +}; + +struct sprd_pin { + const char *name; + unsigned int number; + enum pin_type type; + long unsigned int reg; + long unsigned int bit_offset; + long unsigned int bit_width; +}; + +struct sprd_pin_group { + const char *name; + unsigned int npins; + unsigned int *pins; +}; + +struct sprd_pinctrl_soc_info { + struct sprd_pin_group *groups; + unsigned int ngroups; + struct sprd_pin *pins; + unsigned int npins; + const char **grp_names; +}; + +struct sprd_pinctrl { + struct device *dev; + struct pinctrl_dev *pctl; + void *base; + struct sprd_pinctrl_soc_info *info; +}; + +enum sprd_sc9860_pins { + SC9860_VIO28_0_IRTE = 2832, + SC9860_VIO_SD2_IRTE = 1051152, + SC9860_VIO_SD0_IRTE = 2099472, + SC9860_VIO_SIM2_IRTE = 3147792, + SC9860_VIO_SIM1_IRTE = 4196112, + SC9860_VIO_SIM0_IRTE = 5244432, + SC9860_VIO28_0_MS = 6292752, + SC9860_VIO_SD2_MS = 7341072, + SC9860_VIO_SD0_MS = 8389392, + SC9860_VIO_SIM2_MS = 9437712, + SC9860_VIO_SIM1_MS = 10486032, + SC9860_VIO_SIM0_MS = 11534352, + SC9860_SPSPI_PIN_IN_SEL = 12590866, + SC9860_UART1_USB30_PHY_SEL = 13639186, + SC9860_USB30_PHY_DM_OE = 14687506, + SC9860_USB30_PHY_DP_OE = 15735826, + SC9860_UART5_SYS_SEL = 16783666, + SC9860_ORP_URXD_PIN_IN_SEL = 17831954, + SC9860_SIM2_SYS_SEL = 18880274, + SC9860_SIM1_SYS_SEL = 19928594, + SC9860_SIM0_SYS_SEL = 20976914, + SC9860_CLK26MHZ_BUF_OUT_SEL = 22025234, + SC9860_UART4_SYS_SEL = 23072818, + SC9860_UART3_SYS_SEL = 24120626, + SC9860_UART2_SYS_SEL = 25168434, + SC9860_UART1_SYS_SEL = 26216242, + SC9860_UART0_SYS_SEL = 27264050, + SC9860_UART24_LOOP_SEL = 28312338, + SC9860_UART23_LOOP_SEL = 29360658, + SC9860_UART14_LOOP_SEL = 30408978, + SC9860_UART13_LOOP_SEL = 31457298, + SC9860_IIS3_SYS_SEL = 32510531, + SC9860_IIS2_SYS_SEL = 33558083, + SC9860_IIS1_SYS_SEL = 34605635, + SC9860_IIS0_SYS_SEL = 35653187, + SC9860_IIS23_LOOP_SEL = 36701459, + SC9860_IIS13_LOOP_SEL = 37749779, + SC9860_IIS12_LOOP_SEL = 38798099, + SC9860_IIS03_LOOP_SEL = 39846419, + SC9860_IIS02_LOOP_SEL = 40894739, + SC9860_IIS01_LOOP_SEL = 41943059, + SC9860_IIS6_SYS_SEL = 42998596, + SC9860_IIS5_SYS_SEL = 44046148, + SC9860_IIS4_SYS_SEL = 45093700, + SC9860_I2C_INF6_SYS_SEL = 46139428, + SC9860_I2C_INF4_SYS_SEL = 47187492, + SC9860_I2C_INF2_SYS_SEL = 48235556, + SC9860_I2C_INF1_SYS_SEL = 49283620, + SC9860_I2C_INF0_SYS_SEL = 50331684, + SC9860_GPIO_INF7_SYS_SEL = 51387157, + SC9860_GPIO_INF6_SYS_SEL = 52435477, + SC9860_GPIO_INF5_SYS_SEL = 53483797, + SC9860_GPIO_INF4_SYS_SEL = 54532117, + SC9860_GPIO_INF3_SYS_SEL = 55580437, + SC9860_GPIO_INF2_SYS_SEL = 56628757, + SC9860_GPIO_INF1_SYS_SEL = 57677077, + SC9860_GPIO_INF0_SYS_SEL = 58725397, + SC9860_WDRST_OUT_SEL = 59772981, + SC9860_ADI_SYNC_PIN_OUT_SEL = 60821013, + SC9860_CMRST_SEL = 61869333, + SC9860_CMPD_SEL = 62917653, + SC9860_TEST_DBG_MODE11 = 63965973, + SC9860_TEST_DBG_MODE10 = 65014293, + SC9860_TEST_DBG_MODE9 = 66062613, + SC9860_TEST_DBG_MODE8 = 67110933, + SC9860_TEST_DBG_MODE7 = 68159253, + SC9860_TEST_DBG_MODE6 = 69207573, + SC9860_TEST_DBG_MODE5 = 70255893, + SC9860_TEST_DBG_MODE4 = 71304213, + SC9860_TEST_DBG_MODE3 = 72352533, + SC9860_TEST_DBG_MODE2 = 73400853, + SC9860_TEST_DBG_MODE1 = 74449173, + SC9860_TEST_DBG_MODE0 = 75497493, + SC9860_SP_EIC_DPAD3_SEL = 76552326, + SC9860_SP_EIC_DPAD2_SEL = 77598854, + SC9860_SP_EIC_DPAD1_SEL = 78645382, + SC9860_SP_EIC_DPAD0_SEL = 79691910, + SC9860_SP_EIC_DPAD7_SEL = 80746631, + SC9860_SP_EIC_DPAD6_SEL = 81793159, + SC9860_SP_EIC_DPAD5_SEL = 82839687, + SC9860_SP_EIC_DPAD4_SEL = 83886215, + SC9860_RFCTL20 = 85000192, + SC9860_RFCTL21 = 87097344, + SC9860_RFCTL30 = 89194496, + SC9860_RFCTL31 = 91291648, + SC9860_RFCTL32 = 93388800, + SC9860_RFCTL33 = 95485952, + SC9860_RFCTL34 = 97583104, + SC9860_RFCTL35 = 99680256, + SC9860_RFCTL36 = 101777408, + SC9860_RFCTL37 = 103874560, + SC9860_RFCTL22 = 105971712, + SC9860_RFCTL23 = 108068864, + SC9860_RFCTL24 = 110166016, + SC9860_RFCTL25 = 112263168, + SC9860_RFCTL26 = 114360320, + SC9860_RFCTL27 = 116457472, + SC9860_RFCTL28 = 118554624, + SC9860_RFCTL29 = 120651776, + SC9860_SCL2 = 122748928, + SC9860_SDA2 = 124846080, + SC9860_MTCK_ARM = 126943232, + SC9860_MTMS_ARM = 129040384, + SC9860_XTL_EN0 = 131137536, + SC9860_PTEST = 133234688, + SC9860_AUD_DAD1 = 135331840, + SC9860_AUD_ADD0 = 137428992, + SC9860_AUD_ADSYNC = 139526144, + SC9860_AUD_SCLK = 141623296, + SC9860_CHIP_SLEEP = 143720448, + SC9860_CLK_32K = 145817600, + SC9860_DCDC_ARM_EN = 147914752, + SC9860_EXT_RST_B = 150011904, + SC9860_ADI_D = 152109056, + SC9860_ADI_SCLK = 154206208, + SC9860_XTL_EN1 = 156303360, + SC9860_ANA_INT = 158400512, + SC9860_AUD_DAD0 = 160497664, + SC9860_AUD_DASYNC = 162594816, + SC9860_LCM_RSTN = 164691968, + SC9860_DSI_TE = 166789120, + SC9860_PWMA = 168886272, + SC9860_EXTINT0 = 170983424, + SC9860_EXTINT1 = 173080576, + SC9860_SDA1 = 175177728, + SC9860_SCL1 = 177274880, + SC9860_SIMCLK2 = 179372032, + SC9860_SIMDA2 = 181469184, + SC9860_SIMRST2 = 183566336, + SC9860_SIMCLK1 = 185663488, + SC9860_SIMDA1 = 187760640, + SC9860_SIMRST1 = 189857792, + SC9860_SIMCLK0 = 191954944, + SC9860_SIMDA0 = 194052096, + SC9860_SIMRST0 = 196149248, + SC9860_SD2_CMD = 198246400, + SC9860_SD2_D0 = 200343552, + SC9860_SD2_D1 = 202440704, + SC9860_SD2_CLK = 204537856, + SC9860_SD2_D2 = 206635008, + SC9860_SD2_D3 = 208732160, + SC9860_SD0_D3 = 210829312, + SC9860_SD0_D2 = 212926464, + SC9860_SD0_CMD = 215023616, + SC9860_SD0_D0 = 217120768, + SC9860_SD0_D1 = 219217920, + SC9860_SD0_CLK = 221315072, + SC9860_EMMC_CMD_reserved = 223412224, + SC9860_EMMC_CMD = 225509376, + SC9860_EMMC_D6 = 227606528, + SC9860_EMMC_D7 = 229703680, + SC9860_EMMC_CLK = 231800832, + SC9860_EMMC_D5 = 233897984, + SC9860_EMMC_D4 = 235995136, + SC9860_EMMC_DS = 238092288, + SC9860_EMMC_D3_reserved = 240189440, + SC9860_EMMC_D3 = 242286592, + SC9860_EMMC_RST = 244383744, + SC9860_EMMC_D1 = 246480896, + SC9860_EMMC_D2 = 248578048, + SC9860_EMMC_D0 = 250675200, + SC9860_IIS0DI = 252772352, + SC9860_IIS0DO = 254869504, + SC9860_IIS0CLK = 256966656, + SC9860_IIS0LRCK = 259063808, + SC9860_SD1_CLK = 261160960, + SC9860_SD1_CMD = 263258112, + SC9860_SD1_D0 = 265355264, + SC9860_SD1_D1 = 267452416, + SC9860_SD1_D2 = 269549568, + SC9860_SD1_D3 = 271646720, + SC9860_CLK_AUX0 = 273743872, + SC9860_WIFI_COEXIST = 275841024, + SC9860_BEIDOU_COEXIST = 277938176, + SC9860_U3TXD = 280035328, + SC9860_U3RXD = 282132480, + SC9860_U3CTS = 284229632, + SC9860_U3RTS = 286326784, + SC9860_U0TXD = 288423936, + SC9860_U0RXD = 290521088, + SC9860_U0CTS = 292618240, + SC9860_U0RTS = 294715392, + SC9860_IIS1DI = 296812544, + SC9860_IIS1DO = 298909696, + SC9860_IIS1CLK = 301006848, + SC9860_IIS1LRCK = 303104000, + SC9860_SPI0_CSN = 305201152, + SC9860_SPI0_DO = 307298304, + SC9860_SPI0_DI = 309395456, + SC9860_SPI0_CLK = 311492608, + SC9860_U2TXD = 313589760, + SC9860_U2RXD = 315686912, + SC9860_U4TXD = 317784064, + SC9860_U4RXD = 319881216, + SC9860_CMMCLK1 = 321978368, + SC9860_CMRST1 = 324075520, + SC9860_CMMCLK0 = 326172672, + SC9860_CMRST0 = 328269824, + SC9860_CMPD0 = 330366976, + SC9860_CMPD1 = 332464128, + SC9860_SCL0 = 334561280, + SC9860_SDA0 = 336658432, + SC9860_SDA6 = 338755584, + SC9860_SCL6 = 340852736, + SC9860_U1TXD = 342949888, + SC9860_U1RXD = 345047040, + SC9860_KEYOUT0 = 347144192, + SC9860_KEYOUT1 = 349241344, + SC9860_KEYOUT2 = 351338496, + SC9860_KEYIN0 = 353435648, + SC9860_KEYIN1 = 355532800, + SC9860_KEYIN2 = 357629952, + SC9860_IIS3DI = 359727104, + SC9860_IIS3DO = 361824256, + SC9860_IIS3CLK = 363921408, + SC9860_IIS3LRCK = 366018560, + SC9860_RFCTL0 = 368115712, + SC9860_RFCTL1 = 370212864, + SC9860_RFCTL10 = 372310016, + SC9860_RFCTL11 = 374407168, + SC9860_RFCTL12 = 376504320, + SC9860_RFCTL13 = 378601472, + SC9860_RFCTL14 = 380698624, + SC9860_RFCTL15 = 382795776, + SC9860_RFCTL16 = 384892928, + SC9860_RFCTL17 = 386990080, + SC9860_RFCTL18 = 389087232, + SC9860_RFCTL19 = 391184384, + SC9860_RFCTL2 = 393281536, + SC9860_EXTINT5 = 395378688, + SC9860_EXTINT6 = 397475840, + SC9860_EXTINT7 = 399572992, + SC9860_GPIO30 = 401670144, + SC9860_GPIO31 = 403767296, + SC9860_GPIO32 = 405864448, + SC9860_GPIO33 = 407961600, + SC9860_GPIO34 = 410058752, + SC9860_RFCTL3 = 412155904, + SC9860_RFCTL4 = 414253056, + SC9860_RFCTL5 = 416350208, + SC9860_RFCTL6 = 418447360, + SC9860_RFCTL7 = 420544512, + SC9860_RFCTL8 = 422641664, + SC9860_RFCTL9 = 424738816, + SC9860_RFFE0_SCK0 = 426835968, + SC9860_GPIO38 = 428933120, + SC9860_RFFE0_SDA0 = 431030272, + SC9860_GPIO39 = 433127424, + SC9860_RFFE1_SCK0 = 435224576, + SC9860_GPIO181 = 437321728, + SC9860_RFFE1_SDA0 = 439418880, + SC9860_GPIO182 = 441516032, + SC9860_RF_LVDS0_ADC_ON = 443613184, + SC9860_RF_LVDS0_DAC_ON = 445710336, + SC9860_RFSCK0 = 447807488, + SC9860_RFSDA0 = 449904640, + SC9860_RFSEN0 = 452001792, + SC9860_RF_LVDS1_ADC_ON = 454098944, + SC9860_RF_LVDS1_DAC_ON = 456196096, + SC9860_RFSCK1 = 458293248, + SC9860_RFSDA1 = 460390400, + SC9860_RFSEN1 = 462487552, + SC9860_RFCTL38 = 464584704, + SC9860_RFCTL39 = 466681856, + SC9860_RFCTL20_MISC = 86114304, + SC9860_RFCTL21_MISC = 88211456, + SC9860_RFCTL30_MISC = 90308608, + SC9860_RFCTL31_MISC = 92405760, + SC9860_RFCTL32_MISC = 94502912, + SC9860_RFCTL33_MISC = 96600064, + SC9860_RFCTL34_MISC = 98697216, + SC9860_RFCTL35_MISC = 100794368, + SC9860_RFCTL36_MISC = 102891520, + SC9860_RFCTL37_MISC = 104988672, + SC9860_RFCTL22_MISC = 107085824, + SC9860_RFCTL23_MISC = 109182976, + SC9860_RFCTL24_MISC = 111280128, + SC9860_RFCTL25_MISC = 113377280, + SC9860_RFCTL26_MISC = 115474432, + SC9860_RFCTL27_MISC = 117571584, + SC9860_RFCTL28_MISC = 119668736, + SC9860_RFCTL29_MISC = 121765888, + SC9860_SCL2_MISC = 123863040, + SC9860_SDA2_MISC = 125960192, + SC9860_MTCK_ARM_MISC = 128057344, + SC9860_MTMS_ARM_MISC = 130154496, + SC9860_XTL_EN0_MISC = 132251648, + SC9860_PTEST_MISC = 134348800, + SC9860_AUD_DAD1_MISC = 136445952, + SC9860_AUD_ADD0_MISC = 138543104, + SC9860_AUD_ADSYNC_MISC = 140640256, + SC9860_AUD_SCLK_MISC = 142737408, + SC9860_CHIP_SLEEP_MISC = 144834560, + SC9860_CLK_32K_MISC = 146931712, + SC9860_DCDC_ARM_EN_MISC = 149028864, + SC9860_EXT_RST_B_MISC = 151126016, + SC9860_ADI_D_MISC = 153223168, + SC9860_ADI_SCLK_MISC = 155320320, + SC9860_XTL_EN1_MISC = 157417472, + SC9860_ANA_INT_MISC = 159514624, + SC9860_AUD_DAD0_MISC = 161611776, + SC9860_AUD_DASYNC_MISC = 163708928, + SC9860_LCM_RSTN_MISC = 165806080, + SC9860_DSI_TE_MISC = 167903232, + SC9860_PWMA_MISC = 170000384, + SC9860_EXTINT0_MISC = 172097536, + SC9860_EXTINT1_MISC = 174194688, + SC9860_SDA1_MISC = 176291840, + SC9860_SCL1_MISC = 178388992, + SC9860_SIMCLK2_MISC = 180486144, + SC9860_SIMDA2_MISC = 182583296, + SC9860_SIMRST2_MISC = 184680448, + SC9860_SIMCLK1_MISC = 186777600, + SC9860_SIMDA1_MISC = 188874752, + SC9860_SIMRST1_MISC = 190971904, + SC9860_SIMCLK0_MISC = 193069056, + SC9860_SIMDA0_MISC = 195166208, + SC9860_SIMRST0_MISC = 197263360, + SC9860_SD2_CMD_MISC = 199360512, + SC9860_SD2_D0_MISC = 201457664, + SC9860_SD2_D1_MISC = 203554816, + SC9860_SD2_CLK_MISC = 205651968, + SC9860_SD2_D2_MISC = 207749120, + SC9860_SD2_D3_MISC = 209846272, + SC9860_SD0_D3_MISC = 211943424, + SC9860_SD0_D2_MISC = 214040576, + SC9860_SD0_CMD_MISC = 216137728, + SC9860_SD0_D0_MISC = 218234880, + SC9860_SD0_D1_MISC = 220332032, + SC9860_SD0_CLK_MISC = 222429184, + SC9860_EMMC_CMD_reserved_MISC = 224526336, + SC9860_EMMC_CMD_MISC = 226623488, + SC9860_EMMC_D6_MISC = 228720640, + SC9860_EMMC_D7_MISC = 230817792, + SC9860_EMMC_CLK_MISC = 232914944, + SC9860_EMMC_D5_MISC = 235012096, + SC9860_EMMC_D4_MISC = 237109248, + SC9860_EMMC_DS_MISC = 239206400, + SC9860_EMMC_D3_reserved_MISC = 241303552, + SC9860_EMMC_D3_MISC = 243400704, + SC9860_EMMC_RST_MISC = 245497856, + SC9860_EMMC_D1_MISC = 247595008, + SC9860_EMMC_D2_MISC = 249692160, + SC9860_EMMC_D0_MISC = 251789312, + SC9860_IIS0DI_MISC = 253886464, + SC9860_IIS0DO_MISC = 255983616, + SC9860_IIS0CLK_MISC = 258080768, + SC9860_IIS0LRCK_MISC = 260177920, + SC9860_SD1_CLK_MISC = 262275072, + SC9860_SD1_CMD_MISC = 264372224, + SC9860_SD1_D0_MISC = 266469376, + SC9860_SD1_D1_MISC = 268566528, + SC9860_SD1_D2_MISC = 270663680, + SC9860_SD1_D3_MISC = 272760832, + SC9860_CLK_AUX0_MISC = 274857984, + SC9860_WIFI_COEXIST_MISC = 276955136, + SC9860_BEIDOU_COEXIST_MISC = 279052288, + SC9860_U3TXD_MISC = 281149440, + SC9860_U3RXD_MISC = 283246592, + SC9860_U3CTS_MISC = 285343744, + SC9860_U3RTS_MISC = 287440896, + SC9860_U0TXD_MISC = 289538048, + SC9860_U0RXD_MISC = 291635200, + SC9860_U0CTS_MISC = 293732352, + SC9860_U0RTS_MISC = 295829504, + SC9860_IIS1DI_MISC = 297926656, + SC9860_IIS1DO_MISC = 300023808, + SC9860_IIS1CLK_MISC = 302120960, + SC9860_IIS1LRCK_MISC = 304218112, + SC9860_SPI0_CSN_MISC = 306315264, + SC9860_SPI0_DO_MISC = 308412416, + SC9860_SPI0_DI_MISC = 310509568, + SC9860_SPI0_CLK_MISC = 312606720, + SC9860_U2TXD_MISC = 314703872, + SC9860_U2RXD_MISC = 316801024, + SC9860_U4TXD_MISC = 318898176, + SC9860_U4RXD_MISC = 320995328, + SC9860_CMMCLK1_MISC = 323092480, + SC9860_CMRST1_MISC = 325189632, + SC9860_CMMCLK0_MISC = 327286784, + SC9860_CMRST0_MISC = 329383936, + SC9860_CMPD0_MISC = 331481088, + SC9860_CMPD1_MISC = 333578240, + SC9860_SCL0_MISC = 335675392, + SC9860_SDA0_MISC = 337772544, + SC9860_SDA6_MISC = 339869696, + SC9860_SCL6_MISC = 341966848, + SC9860_U1TXD_MISC = 344064000, + SC9860_U1RXD_MISC = 346161152, + SC9860_KEYOUT0_MISC = 348258304, + SC9860_KEYOUT1_MISC = 350355456, + SC9860_KEYOUT2_MISC = 352452608, + SC9860_KEYIN0_MISC = 354549760, + SC9860_KEYIN1_MISC = 356646912, + SC9860_KEYIN2_MISC = 358744064, + SC9860_IIS3DI_MISC = 360841216, + SC9860_IIS3DO_MISC = 362938368, + SC9860_IIS3CLK_MISC = 365035520, + SC9860_IIS3LRCK_MISC = 367132672, + SC9860_RFCTL0_MISC = 369229824, + SC9860_RFCTL1_MISC = 371326976, + SC9860_RFCTL10_MISC = 373424128, + SC9860_RFCTL11_MISC = 375521280, + SC9860_RFCTL12_MISC = 377618432, + SC9860_RFCTL13_MISC = 379715584, + SC9860_RFCTL14_MISC = 381812736, + SC9860_RFCTL15_MISC = 383909888, + SC9860_RFCTL16_MISC = 386007040, + SC9860_RFCTL17_MISC = 388104192, + SC9860_RFCTL18_MISC = 390201344, + SC9860_RFCTL19_MISC = 392298496, + SC9860_RFCTL2_MISC = 394395648, + SC9860_EXTINT5_MISC = 396492800, + SC9860_EXTINT6_MISC = 398589952, + SC9860_EXTINT7_MISC = 400687104, + SC9860_GPIO30_MISC = 402784256, + SC9860_GPIO31_MISC = 404881408, + SC9860_GPIO32_MISC = 406978560, + SC9860_GPIO33_MISC = 409075712, + SC9860_GPIO34_MISC = 411172864, + SC9860_RFCTL3_MISC = 413270016, + SC9860_RFCTL4_MISC = 415367168, + SC9860_RFCTL5_MISC = 417464320, + SC9860_RFCTL6_MISC = 419561472, + SC9860_RFCTL7_MISC = 421658624, + SC9860_RFCTL8_MISC = 423755776, + SC9860_RFCTL9_MISC = 425852928, + SC9860_RFFE0_SCK0_MISC = 427950080, + SC9860_GPIO38_MISC = 430047232, + SC9860_RFFE0_SDA0_MISC = 432144384, + SC9860_GPIO39_MISC = 434241536, + SC9860_RFFE1_SCK0_MISC = 436338688, + SC9860_GPIO181_MISC = 438435840, + SC9860_RFFE1_SDA0_MISC = 440532992, + SC9860_GPIO182_MISC = 442630144, + SC9860_RF_LVDS0_ADC_ON_MISC = 444727296, + SC9860_RF_LVDS0_DAC_ON_MISC = 446824448, + SC9860_RFSCK0_MISC = 448921600, + SC9860_RFSDA0_MISC = 451018752, + SC9860_RFSEN0_MISC = 453115904, + SC9860_RF_LVDS1_ADC_ON_MISC = 455213056, + SC9860_RF_LVDS1_DAC_ON_MISC = 457310208, + SC9860_RFSCK1_MISC = 459407360, + SC9860_RFSDA1_MISC = 461504512, + SC9860_RFSEN1_MISC = 463601664, + SC9860_RFCTL38_MISC = 465698816, + SC9860_RFCTL39_MISC = 467795968, +}; + +enum sunxi_desc_bias_voltage { + BIAS_VOLTAGE_NONE = 0, + BIAS_VOLTAGE_GRP_CONFIG = 1, + BIAS_VOLTAGE_PIO_POW_MODE_SEL = 2, +}; + +struct sunxi_desc_function { + long unsigned int variant; + const char *name; + u8 muxval; + u8 irqbank; + u8 irqnum; +}; + +struct sunxi_desc_pin { + struct pinctrl_pin_desc pin; + long unsigned int variant; + struct sunxi_desc_function *functions; +}; + +struct sunxi_pinctrl_desc { + const struct sunxi_desc_pin *pins; + int npins; + unsigned int pin_base; + unsigned int irq_banks; + const unsigned int *irq_bank_map; + bool irq_read_needs_mux; + bool disable_strict_mode; + enum sunxi_desc_bias_voltage io_bias_cfg_variant; +}; + +struct sunxi_pinctrl_function { + const char *name; + const char **groups; + unsigned int ngroups; +}; + +struct sunxi_pinctrl_group { + const char *name; + unsigned int pin; +}; + +struct sunxi_pinctrl_regulator { + struct regulator *regulator; + refcount_t refcount; +}; + +struct sunxi_pinctrl { + void *membase; + struct gpio_chip *chip; + const struct sunxi_pinctrl_desc *desc; + struct device *dev; + struct sunxi_pinctrl_regulator regulators[9]; + struct irq_domain *domain; + struct sunxi_pinctrl_function *functions; + unsigned int nfunctions; + struct sunxi_pinctrl_group *groups; + unsigned int ngroups; + int *irq; + unsigned int *irq_array; + raw_spinlock_t lock; + struct pinctrl_dev *pctl_dev; + long unsigned int variant; +}; + +struct mtk_eint_regs { + unsigned int stat; + unsigned int ack; + unsigned int mask; + unsigned int mask_set; + unsigned int mask_clr; + unsigned int sens; + unsigned int sens_set; + unsigned int sens_clr; + unsigned int soft; + unsigned int soft_set; + unsigned int soft_clr; + unsigned int pol; + unsigned int pol_set; + unsigned int pol_clr; + unsigned int dom_en; + unsigned int dbnc_ctrl; + unsigned int dbnc_set; + unsigned int dbnc_clr; +}; + +struct mtk_eint_hw { + u8 port_mask; + u8 ports; + unsigned int ap_num; + unsigned int db_cnt; +}; + +struct mtk_eint_xt { + int (*get_gpio_n)(void *, long unsigned int, unsigned int *, struct gpio_chip **); + int (*get_gpio_state)(void *, long unsigned int); + int (*set_gpio_as_eint)(void *, long unsigned int); +}; + +struct mtk_eint { + struct device *dev; + void *base; + struct irq_domain *domain; + int irq; + int *dual_edge; + u32 *wake_mask; + u32 *cur_mask; + const struct mtk_eint_hw *hw; + const struct mtk_eint_regs *regs; + void *pctl; + const struct mtk_eint_xt *gpio_xlate; +}; + +struct mtk_desc_function { + const char *name; + unsigned char muxval; +}; + +struct mtk_desc_eint { + unsigned char eintmux; + unsigned char eintnum; +}; + +struct mtk_desc_pin { + struct pinctrl_pin_desc pin; + const struct mtk_desc_eint eint; + const struct mtk_desc_function *functions; +}; + +struct mtk_pinctrl_group { + const char *name; + long unsigned int config; + unsigned int pin; +}; + +struct mtk_drv_group_desc { + unsigned char min_drv; + unsigned char max_drv; + unsigned char low_bit; + unsigned char high_bit; + unsigned char step; +}; + +struct mtk_pin_drv_grp { + short unsigned int pin; + short unsigned int offset; + unsigned char bit; + unsigned char grp; +}; + +struct mtk_pin_spec_pupd_set_samereg { + short unsigned int pin; + short unsigned int offset; + unsigned char pupd_bit; + unsigned char r1_bit; + unsigned char r0_bit; +}; + +struct mtk_pin_ies_smt_set { + short unsigned int start; + short unsigned int end; + short unsigned int offset; + unsigned char bit; +}; + +struct mtk_pinctrl_devdata { + const struct mtk_desc_pin *pins; + unsigned int npins; + const struct mtk_drv_group_desc *grp_desc; + unsigned int n_grp_cls; + const struct mtk_pin_drv_grp *pin_drv_grp; + unsigned int n_pin_drv_grps; + int (*spec_pull_set)(struct regmap *, unsigned int, unsigned char, bool, unsigned int); + int (*spec_ies_smt_set)(struct regmap *, unsigned int, unsigned char, int, enum pin_config_param); + void (*spec_pinmux_set)(struct regmap *, unsigned int, unsigned int); + void (*spec_dir_set)(unsigned int *, unsigned int); + unsigned int dir_offset; + unsigned int ies_offset; + unsigned int smt_offset; + unsigned int pullen_offset; + unsigned int pullsel_offset; + unsigned int drv_offset; + unsigned int dout_offset; + unsigned int din_offset; + unsigned int pinmux_offset; + short unsigned int type1_start; + short unsigned int type1_end; + unsigned char port_shf; + unsigned char port_mask; + unsigned char port_align; + struct mtk_eint_hw eint_hw; + struct mtk_eint_regs *eint_regs; + unsigned int mode_mask; + unsigned int mode_per_reg; + unsigned int mode_shf; +}; + +struct mtk_pinctrl { + struct regmap *regmap1; + struct regmap *regmap2; + struct pinctrl_desc pctl_desc; + struct device *dev; + struct gpio_chip *chip; + struct mtk_pinctrl_group *groups; + unsigned int ngroups; + const char **grp_names; + struct pinctrl_dev *pctl_dev; + const struct mtk_pinctrl_devdata *devdata; + struct mtk_eint *eint; +}; + +enum { + PINCTRL_PIN_REG_MODE = 0, + PINCTRL_PIN_REG_DIR = 1, + PINCTRL_PIN_REG_DI = 2, + PINCTRL_PIN_REG_DO = 3, + PINCTRL_PIN_REG_SR = 4, + PINCTRL_PIN_REG_SMT = 5, + PINCTRL_PIN_REG_PD = 6, + PINCTRL_PIN_REG_PU = 7, + PINCTRL_PIN_REG_E4 = 8, + PINCTRL_PIN_REG_E8 = 9, + PINCTRL_PIN_REG_TDSEL = 10, + PINCTRL_PIN_REG_RDSEL = 11, + PINCTRL_PIN_REG_DRV = 12, + PINCTRL_PIN_REG_PUPD = 13, + PINCTRL_PIN_REG_R0 = 14, + PINCTRL_PIN_REG_R1 = 15, + PINCTRL_PIN_REG_IES = 16, + PINCTRL_PIN_REG_PULLEN = 17, + PINCTRL_PIN_REG_PULLSEL = 18, + PINCTRL_PIN_REG_DRV_EN = 19, + PINCTRL_PIN_REG_DRV_E0 = 20, + PINCTRL_PIN_REG_DRV_E1 = 21, + PINCTRL_PIN_REG_DRV_ADV = 22, + PINCTRL_PIN_REG_RSEL = 23, + PINCTRL_PIN_REG_MAX = 24, +}; + +enum { + DRV_FIXED = 0, + DRV_GRP0 = 1, + DRV_GRP1 = 2, + DRV_GRP2 = 3, + DRV_GRP3 = 4, + DRV_GRP4 = 5, + DRV_GRP_MAX = 6, +}; + +struct mtk_pin_field { + u8 index; + u32 offset; + u32 mask; + u8 bitpos; + u8 next; +}; + +struct mtk_pin_field_calc { + u16 s_pin; + u16 e_pin; + u8 i_base; + u32 s_addr; + u8 x_addrs; + u8 s_bit; + u8 x_bits; + u8 sz_reg; + u8 fixed; +}; + +struct mtk_pin_rsel { + u16 s_pin; + u16 e_pin; + u16 rsel_index; + u32 up_rsel; + u32 down_rsel; +}; + +struct mtk_pin_reg_calc { + const struct mtk_pin_field_calc *range; + unsigned int nranges; +}; + +struct mtk_func_desc { + const char *name; + u8 muxval; +}; + +struct mtk_eint_desc { + u16 eint_m; + u16 eint_n; +}; + +struct mtk_pin_desc { + unsigned int number; + const char *name; + struct mtk_eint_desc eint; + u8 drv_n; + struct mtk_func_desc *funcs; +}; + +struct mtk_pinctrl___2; + +struct mtk_pin_soc { + const struct mtk_pin_reg_calc *reg_cal; + const struct mtk_pin_desc *pins; + unsigned int npins; + const struct group_desc *grps; + unsigned int ngrps; + const struct function_desc *funcs; + unsigned int nfuncs; + const struct mtk_eint_regs *eint_regs; + const struct mtk_eint_hw *eint_hw; + u8 gpio_m; + bool ies_present; + const char * const *base_names; + unsigned int nbase_names; + const unsigned int *pull_type; + const struct mtk_pin_rsel *pin_rsel; + unsigned int npin_rsel; + int (*bias_disable_set)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *); + int (*bias_disable_get)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, int *); + int (*bias_set)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, bool); + int (*bias_get)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, bool, int *); + int (*bias_set_combo)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, u32, u32); + int (*bias_get_combo)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, u32 *, u32 *); + int (*drive_set)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, u32); + int (*drive_get)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, int *); + int (*adv_pull_set)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, bool, u32); + int (*adv_pull_get)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, bool, u32 *); + int (*adv_drive_set)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, u32); + int (*adv_drive_get)(struct mtk_pinctrl___2 *, const struct mtk_pin_desc *, u32 *); + void *driver_data; +}; + +struct mtk_pinctrl___2 { + struct pinctrl_dev *pctrl; + void **base; + u8 nbase; + struct device *dev; + struct gpio_chip chip; + const struct mtk_pin_soc *soc; + struct mtk_eint *eint; + struct mtk_pinctrl_group *groups; + const char **grp_names; + spinlock_t lock; + bool rsel_si_unit; +}; + +struct mtk_drive_desc { + u8 min; + u8 max; + u8 step; + u8 scal; +}; + +enum { + GPIO_BASE = 0, + IOCFG_RT_BASE = 1, + IOCFG_RB_BASE = 2, + IOCFG_LT_BASE = 3, + IOCFG_LB_BASE = 4, + IOCFG_TR_BASE = 5, + IOCFG_TL_BASE = 6, +}; + +struct mt6397_chip { + struct device *dev; + struct regmap *regmap; + struct notifier_block pm_nb; + int irq; + struct irq_domain *irq_domain; + struct mutex irqlock; + u16 wake_mask[2]; + u16 irq_masks_cur[2]; + u16 irq_masks_cache[2]; + u16 int_con[2]; + u16 int_status[2]; + u16 chip_id; + void *irq_data; +}; + +struct visconti_desc_pin { + struct pinctrl_pin_desc pin; + unsigned int dsel_offset; + unsigned int dsel_shift; + unsigned int pude_offset; + unsigned int pudsel_offset; + unsigned int pud_shift; +}; + +struct visconti_mux { + unsigned int offset; + unsigned int mask; + unsigned int val; +}; + +struct visconti_pin_group { + const char *name; + const unsigned int *pins; + unsigned int nr_pins; + struct visconti_mux mux; +}; + +struct visconti_pin_function { + const char *name; + const char * const *groups; + unsigned int nr_groups; +}; + +struct visconti_pinctrl_devdata { + const struct visconti_desc_pin *pins; + unsigned int nr_pins; + const struct visconti_pin_group *groups; + unsigned int nr_groups; + const struct visconti_pin_function *functions; + unsigned int nr_functions; + const struct visconti_mux *gpio_mux; + void (*unlock)(void *); +}; + +struct visconti_pinctrl { + void *base; + struct device *dev; + struct pinctrl_dev *pctl; + struct pinctrl_desc pctl_desc; + const struct visconti_pinctrl_devdata *devdata; + spinlock_t lock; +}; + +struct gpio_pin_range { + struct list_head node; + struct pinctrl_dev *pctldev; + struct pinctrl_gpio_range range; +}; + +struct gpio_array; + +struct gpio_descs { + struct gpio_array *info; + unsigned int ndescs; + struct gpio_desc___2 *desc[0]; +}; + +struct gpio_array { + struct gpio_desc___2 **desc; + unsigned int size; + struct gpio_chip *chip; + long unsigned int *get_mask; + long unsigned int *set_mask; + long unsigned int invert_mask[0]; +}; + +enum gpiod_flags { + GPIOD_ASIS = 0, + GPIOD_IN = 1, + GPIOD_OUT_LOW = 3, + GPIOD_OUT_HIGH = 7, + GPIOD_OUT_LOW_OPEN_DRAIN = 11, + GPIOD_OUT_HIGH_OPEN_DRAIN = 15, +}; + +enum gpio_lookup_flags { + GPIO_ACTIVE_HIGH = 0, + GPIO_ACTIVE_LOW = 1, + GPIO_OPEN_DRAIN = 2, + GPIO_OPEN_SOURCE = 4, + GPIO_PERSISTENT = 0, + GPIO_TRANSITORY = 8, + GPIO_PULL_UP = 16, + GPIO_PULL_DOWN = 32, + GPIO_LOOKUP_FLAGS_DEFAULT = 0, +}; + +struct gpiod_lookup { + const char *key; + u16 chip_hwnum; + const char *con_id; + unsigned int idx; + long unsigned int flags; +}; + +struct gpiod_lookup_table { + struct list_head list; + const char *dev_id; + struct gpiod_lookup table[0]; +}; + +struct gpiod_hog { + struct list_head list; + const char *chip_label; + u16 chip_hwnum; + const char *line_name; + long unsigned int lflags; + int dflags; +}; + +enum { + GPIOLINE_CHANGED_REQUESTED = 1, + GPIOLINE_CHANGED_RELEASED = 2, + GPIOLINE_CHANGED_CONFIG = 3, +}; + +struct acpi_gpio_info { + struct acpi_device *adev; + enum gpiod_flags flags; + bool gpioint; + int pin_config; + int polarity; + int triggering; + unsigned int debounce; + unsigned int quirks; +}; + +struct trace_event_raw_gpio_direction { + struct trace_entry ent; + unsigned int gpio; + int in; + int err; + char __data[0]; +}; + +struct trace_event_raw_gpio_value { + struct trace_entry ent; + unsigned int gpio; + int get; + int value; + char __data[0]; +}; + +struct trace_event_data_offsets_gpio_direction {}; + +struct trace_event_data_offsets_gpio_value {}; + +typedef void (*btf_trace_gpio_direction)(void *, unsigned int, int, int); + +typedef void (*btf_trace_gpio_value)(void *, unsigned int, int, int); + +struct devres; + +struct gpio { + unsigned int gpio; + long unsigned int flags; + const char *label; +}; + +struct of_reconfig_data { + struct device_node *dn; + struct property *prop; + struct property *old_prop; +}; + +enum of_reconfig_change { + OF_RECONFIG_NO_CHANGE = 0, + OF_RECONFIG_CHANGE_ADD = 1, + OF_RECONFIG_CHANGE_REMOVE = 2, +}; + +enum of_gpio_flags { + OF_GPIO_ACTIVE_LOW = 1, + OF_GPIO_SINGLE_ENDED = 2, + OF_GPIO_OPEN_DRAIN = 4, + OF_GPIO_TRANSITORY = 8, + OF_GPIO_PULL_UP = 16, + OF_GPIO_PULL_DOWN = 32, +}; + +struct of_mm_gpio_chip { + struct gpio_chip gc; + void (*save_regs)(struct of_mm_gpio_chip *); + void *regs; +}; + +struct gpiochip_info { + char name[32]; + char label[32]; + __u32 lines; +}; + +enum gpio_v2_line_flag { + GPIO_V2_LINE_FLAG_USED = 1, + GPIO_V2_LINE_FLAG_ACTIVE_LOW = 2, + GPIO_V2_LINE_FLAG_INPUT = 4, + GPIO_V2_LINE_FLAG_OUTPUT = 8, + GPIO_V2_LINE_FLAG_EDGE_RISING = 16, + GPIO_V2_LINE_FLAG_EDGE_FALLING = 32, + GPIO_V2_LINE_FLAG_OPEN_DRAIN = 64, + GPIO_V2_LINE_FLAG_OPEN_SOURCE = 128, + GPIO_V2_LINE_FLAG_BIAS_PULL_UP = 256, + GPIO_V2_LINE_FLAG_BIAS_PULL_DOWN = 512, + GPIO_V2_LINE_FLAG_BIAS_DISABLED = 1024, + GPIO_V2_LINE_FLAG_EVENT_CLOCK_REALTIME = 2048, +}; + +struct gpio_v2_line_values { + __u64 bits; + __u64 mask; +}; + +enum gpio_v2_line_attr_id { + GPIO_V2_LINE_ATTR_ID_FLAGS = 1, + GPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES = 2, + GPIO_V2_LINE_ATTR_ID_DEBOUNCE = 3, +}; + +struct gpio_v2_line_attribute { + __u32 id; + __u32 padding; + union { + __u64 flags; + __u64 values; + __u32 debounce_period_us; + }; +}; + +struct gpio_v2_line_config_attribute { + struct gpio_v2_line_attribute attr; + __u64 mask; +}; + +struct gpio_v2_line_config { + __u64 flags; + __u32 num_attrs; + __u32 padding[5]; + struct gpio_v2_line_config_attribute attrs[10]; +}; + +struct gpio_v2_line_request { + __u32 offsets[64]; + char consumer[32]; + struct gpio_v2_line_config config; + __u32 num_lines; + __u32 event_buffer_size; + __u32 padding[5]; + __s32 fd; +}; + +struct gpio_v2_line_info { + char name[32]; + char consumer[32]; + __u32 offset; + __u32 num_attrs; + __u64 flags; + struct gpio_v2_line_attribute attrs[10]; + __u32 padding[4]; +}; + +enum gpio_v2_line_changed_type { + GPIO_V2_LINE_CHANGED_REQUESTED = 1, + GPIO_V2_LINE_CHANGED_RELEASED = 2, + GPIO_V2_LINE_CHANGED_CONFIG = 3, +}; + +struct gpio_v2_line_info_changed { + struct gpio_v2_line_info info; + __u64 timestamp_ns; + __u32 event_type; + __u32 padding[5]; +}; + +enum gpio_v2_line_event_id { + GPIO_V2_LINE_EVENT_RISING_EDGE = 1, + GPIO_V2_LINE_EVENT_FALLING_EDGE = 2, +}; + +struct gpio_v2_line_event { + __u64 timestamp_ns; + __u32 id; + __u32 offset; + __u32 seqno; + __u32 line_seqno; + __u32 padding[6]; +}; + +struct linereq; + +struct line { + struct gpio_desc___2 *desc; + struct linereq *req; + unsigned int irq; + u64 eflags; + u64 timestamp_ns; + u32 req_seqno; + u32 line_seqno; + struct delayed_work work; + unsigned int sw_debounced; + unsigned int level; +}; + +struct linereq { + struct gpio_device *gdev; + const char *label; + u32 num_lines; + wait_queue_head_t wait; + u32 event_buffer_size; + struct { + union { + struct __kfifo kfifo; + struct gpio_v2_line_event *type; + const struct gpio_v2_line_event *const_type; + char (*rectype)[0]; + struct gpio_v2_line_event *ptr; + const struct gpio_v2_line_event *ptr_const; + }; + struct gpio_v2_line_event buf[0]; + } events; + atomic_t seqno; + struct mutex config_mutex; + struct line lines[0]; +}; + +struct gpio_chardev_data { + struct gpio_device *gdev; + wait_queue_head_t wait; + struct { + union { + struct __kfifo kfifo; + struct gpio_v2_line_info_changed *type; + const struct gpio_v2_line_info_changed *const_type; + char (*rectype)[0]; + struct gpio_v2_line_info_changed *ptr; + const struct gpio_v2_line_info_changed *ptr_const; + }; + struct gpio_v2_line_info_changed buf[32]; + } events; + struct notifier_block lineinfo_changed_nb; + long unsigned int *watched_lines; +}; + +struct class_attribute { + struct attribute attr; + ssize_t (*show)(struct class *, struct class_attribute *, char *); + ssize_t (*store)(struct class *, struct class_attribute *, const char *, size_t); +}; + +struct gpiod_data { + struct gpio_desc___2 *desc; + struct mutex mutex; + struct kernfs_node *value_kn; + int irq; + unsigned char irq_flags; + bool direction_can_change; +}; + +enum dmi_field { + DMI_NONE = 0, + DMI_BIOS_VENDOR = 1, + DMI_BIOS_VERSION = 2, + DMI_BIOS_DATE = 3, + DMI_BIOS_RELEASE = 4, + DMI_EC_FIRMWARE_RELEASE = 5, + DMI_SYS_VENDOR = 6, + DMI_PRODUCT_NAME = 7, + DMI_PRODUCT_VERSION = 8, + DMI_PRODUCT_SERIAL = 9, + DMI_PRODUCT_UUID = 10, + DMI_PRODUCT_SKU = 11, + DMI_PRODUCT_FAMILY = 12, + DMI_BOARD_VENDOR = 13, + DMI_BOARD_NAME = 14, + DMI_BOARD_VERSION = 15, + DMI_BOARD_SERIAL = 16, + DMI_BOARD_ASSET_TAG = 17, + DMI_CHASSIS_VENDOR = 18, + DMI_CHASSIS_TYPE = 19, + DMI_CHASSIS_VERSION = 20, + DMI_CHASSIS_SERIAL = 21, + DMI_CHASSIS_ASSET_TAG = 22, + DMI_STRING_MAX = 23, + DMI_OEM_STRING = 24, +}; + +struct dmi_strmatch { + unsigned char slot: 7; + unsigned char exact_match: 1; + char substr[79]; +}; + +struct dmi_system_id { + int (*callback)(const struct dmi_system_id *); + const char *ident; + struct dmi_strmatch matches[4]; + void *driver_data; +}; + +typedef u8 acpi_adr_space_type; + +struct acpi_object_list { + u32 count; + union acpi_object *pointer; +}; + +struct acpi_buffer { + acpi_size length; + void *pointer; +}; + +typedef void (*acpi_object_handler)(acpi_handle, void *); + +typedef acpi_status (*acpi_adr_space_handler)(u32, acpi_physical_address, u32, u64 *, void *, void *); + +struct acpi_connection_info { + u8 *connection; + u16 length; + u8 access_length; +}; + +typedef acpi_status (*acpi_adr_space_setup)(acpi_handle, u32, void *, void **); + +struct acpi_gpiolib_dmi_quirk { + bool no_edge_events_on_boot; + char *ignore_wake; +}; + +struct acpi_gpio_event { + struct list_head node; + acpi_handle handle; + irq_handler_t handler; + unsigned int pin; + unsigned int irq; + long unsigned int irqflags; + bool irq_is_wake; + bool irq_requested; + struct gpio_desc___2 *desc; +}; + +struct acpi_gpio_connection { + struct list_head node; + unsigned int pin; + struct gpio_desc___2 *desc; +}; + +struct acpi_gpio_chip { + struct acpi_connection_info conn_info; + struct list_head conns; + struct mutex conn_lock; + struct gpio_chip *chip; + struct list_head events; + struct list_head deferred_req_irqs_list_entry; +}; + +struct acpi_gpio_lookup { + struct acpi_gpio_info info; + int index; + u16 pin_index; + bool active_low; + struct gpio_desc___2 *desc; + int n; +}; + +struct bgpio_pdata { + const char *label; + int base; + int ngpio; +}; + +struct davinci_gpio_platform_data { + bool no_auto_base; + u32 base; + u32 ngpio; + u32 gpio_unbanked; +}; + +struct davinci_gpio_regs { + u32 dir; + u32 out_data; + u32 set_data; + u32 clr_data; + u32 in_data; + u32 set_rising; + u32 clr_rising; + u32 set_falling; + u32 clr_falling; + u32 intstat; +}; + +typedef struct irq_chip * (*gpio_get_irq_chip_cb_t)(unsigned int); + +struct davinci_gpio_controller; + +struct davinci_gpio_irq_data { + void *regs; + struct davinci_gpio_controller *chip; + int bank_num; +}; + +struct davinci_gpio_controller { + struct gpio_chip chip; + struct irq_domain *irq_domain; + spinlock_t lock; + void *regs[5]; + int gpio_unbanked; + int irqs[32]; +}; + +struct ftgpio_gpio { + struct device *dev; + struct gpio_chip gc; + struct irq_chip irq; + void *base; + struct clk *clk; +}; + +struct mpc8xxx_gpio_chip { + struct gpio_chip gc; + void *regs; + raw_spinlock_t lock; + int (*direction_output)(struct gpio_chip *, unsigned int, int); + struct irq_domain *irq; + unsigned int irqn; +}; + +struct mpc8xxx_gpio_devtype { + int (*gpio_dir_out)(struct gpio_chip *, unsigned int, int); + int (*gpio_get)(struct gpio_chip *, unsigned int); + int (*irq_set_type)(struct irq_data *, unsigned int); +}; + +enum pwm_polarity { + PWM_POLARITY_NORMAL = 0, + PWM_POLARITY_INVERSED = 1, +}; + +struct pwm_args { + u64 period; + enum pwm_polarity polarity; +}; + +struct pwm_state { + u64 period; + u64 duty_cycle; + enum pwm_polarity polarity; + bool enabled; + bool usage_power; +}; + +struct pwm_chip; + +struct pwm_device { + const char *label; + long unsigned int flags; + unsigned int hwpwm; + unsigned int pwm; + struct pwm_chip *chip; + void *chip_data; + struct pwm_args args; + struct pwm_state state; + struct pwm_state last; +}; + +struct pwm_ops; + +struct pwm_chip { + struct device *dev; + const struct pwm_ops *ops; + int base; + unsigned int npwm; + struct pwm_device * (*of_xlate)(struct pwm_chip *, const struct of_phandle_args *); + unsigned int of_pwm_n_cells; + struct list_head list; + struct pwm_device *pwms; +}; + +struct pwm_capture; + +struct pwm_ops { + int (*request)(struct pwm_chip *, struct pwm_device *); + void (*free)(struct pwm_chip *, struct pwm_device *); + int (*capture)(struct pwm_chip *, struct pwm_device *, struct pwm_capture *, long unsigned int); + int (*apply)(struct pwm_chip *, struct pwm_device *, const struct pwm_state *); + void (*get_state)(struct pwm_chip *, struct pwm_device *, struct pwm_state *); + struct module *owner; + int (*config)(struct pwm_chip *, struct pwm_device *, int, int); + int (*set_polarity)(struct pwm_chip *, struct pwm_device *, enum pwm_polarity); + int (*enable)(struct pwm_chip *, struct pwm_device *); + void (*disable)(struct pwm_chip *, struct pwm_device *); +}; + +struct pwm_capture { + unsigned int period; + unsigned int duty_cycle; +}; + +struct mvebu_gpio_chip; + +struct mvebu_pwm { + struct regmap *regs; + u32 offset; + long unsigned int clk_rate; + struct gpio_desc *gpiod; + struct pwm_chip chip; + spinlock_t lock; + struct mvebu_gpio_chip *mvchip; + u32 blink_select; + u32 blink_on_duration; + u32 blink_off_duration; +}; + +struct mvebu_gpio_chip { + struct gpio_chip chip; + struct regmap *regs; + u32 offset; + struct regmap *percpu_regs; + int irqbase; + struct irq_domain *domain; + int soc_variant; + struct clk *clk; + struct mvebu_pwm *mvpwm; + u32 out_reg; + u32 io_conf_reg; + u32 blink_en_reg; + u32 in_pol_reg; + u32 edge_mask_regs[4]; + u32 level_mask_regs[4]; +}; + +struct mxc_gpio_hwdata { + unsigned int dr_reg; + unsigned int gdir_reg; + unsigned int psr_reg; + unsigned int icr1_reg; + unsigned int icr2_reg; + unsigned int imr_reg; + unsigned int isr_reg; + int edge_sel_reg; + unsigned int low_level; + unsigned int high_level; + unsigned int rise_edge; + unsigned int fall_edge; +}; + +struct mxc_gpio_reg_saved { + u32 icr1; + u32 icr2; + u32 imr; + u32 gdir; + u32 edge_sel; + u32 dr; +}; + +struct mxc_gpio_port { + struct list_head node; + void *base; + struct clk *clk; + int irq; + int irq_high; + struct irq_domain *domain; + struct gpio_chip gc; + struct device *dev; + u32 both_edges; + struct mxc_gpio_reg_saved gpio_saved_reg; + bool power_off; + const struct mxc_gpio_hwdata *hwdata; +}; + +struct palmas_adc_wakeup_property { + int adc_channel_number; + int adc_high_threshold; + int adc_low_threshold; +}; + +struct palmas_gpadc_platform_data { + int ch3_current; + int ch0_current; + bool extended_delay; + int bat_removal; + int start_polarity; + int auto_conversion_period_ms; + struct palmas_adc_wakeup_property *adc_wakeup1_data; + struct palmas_adc_wakeup_property *adc_wakeup2_data; +}; + +struct palmas_usb_platform_data { + int wakeup; +}; + +struct palmas_resource_platform_data { + int regen1_mode_sleep; + int regen2_mode_sleep; + int sysen1_mode_sleep; + int sysen2_mode_sleep; + u8 nsleep_res; + u8 nsleep_smps; + u8 nsleep_ldo1; + u8 nsleep_ldo2; + u8 enable1_res; + u8 enable1_smps; + u8 enable1_ldo1; + u8 enable1_ldo2; + u8 enable2_res; + u8 enable2_smps; + u8 enable2_ldo1; + u8 enable2_ldo2; +}; + +struct palmas_clk_platform_data { + int clk32kg_mode_sleep; + int clk32kgaudio_mode_sleep; +}; + +struct palmas_platform_data { + int irq_flags; + int gpio_base; + u8 power_ctrl; + int mux_from_pdata; + u8 pad1; + u8 pad2; + bool pm_off; + struct palmas_pmic_platform_data *pmic_pdata; + struct palmas_gpadc_platform_data *gpadc_pdata; + struct palmas_usb_platform_data *usb_pdata; + struct palmas_resource_platform_data *resource_pdata; + struct palmas_clk_platform_data *clk_pdata; +}; + +enum palmas_irqs { + PALMAS_CHARG_DET_N_VBUS_OVV_IRQ = 0, + PALMAS_PWRON_IRQ = 1, + PALMAS_LONG_PRESS_KEY_IRQ = 2, + PALMAS_RPWRON_IRQ = 3, + PALMAS_PWRDOWN_IRQ = 4, + PALMAS_HOTDIE_IRQ = 5, + PALMAS_VSYS_MON_IRQ = 6, + PALMAS_VBAT_MON_IRQ = 7, + PALMAS_RTC_ALARM_IRQ = 8, + PALMAS_RTC_TIMER_IRQ = 9, + PALMAS_WDT_IRQ = 10, + PALMAS_BATREMOVAL_IRQ = 11, + PALMAS_RESET_IN_IRQ = 12, + PALMAS_FBI_BB_IRQ = 13, + PALMAS_SHORT_IRQ = 14, + PALMAS_VAC_ACOK_IRQ = 15, + PALMAS_GPADC_AUTO_0_IRQ = 16, + PALMAS_GPADC_AUTO_1_IRQ = 17, + PALMAS_GPADC_EOC_SW_IRQ = 18, + PALMAS_GPADC_EOC_RT_IRQ = 19, + PALMAS_ID_OTG_IRQ = 20, + PALMAS_ID_IRQ = 21, + PALMAS_VBUS_OTG_IRQ = 22, + PALMAS_VBUS_IRQ = 23, + PALMAS_GPIO_0_IRQ = 24, + PALMAS_GPIO_1_IRQ = 25, + PALMAS_GPIO_2_IRQ = 26, + PALMAS_GPIO_3_IRQ = 27, + PALMAS_GPIO_4_IRQ = 28, + PALMAS_GPIO_5_IRQ = 29, + PALMAS_GPIO_6_IRQ = 30, + PALMAS_GPIO_7_IRQ = 31, + PALMAS_NUM_IRQ = 32, +}; + +struct palmas_gpio { + struct gpio_chip gpio_chip; + struct palmas *palmas; +}; + +struct palmas_device_data { + int ngpio; +}; + +struct amba_id { + unsigned int id; + unsigned int mask; + void *data; +}; + +struct amba_cs_uci_id { + unsigned int devarch; + unsigned int devarch_mask; + unsigned int devtype; + void *data; +}; + +struct amba_device { + struct device dev; + struct resource res; + struct clk *pclk; + struct device_dma_parameters dma_parms; + unsigned int periphid; + unsigned int cid; + struct amba_cs_uci_id uci; + unsigned int irq[9]; + char *driver_override; +}; + +struct amba_driver { + struct device_driver drv; + int (*probe)(struct amba_device *, const struct amba_id *); + void (*remove)(struct amba_device *); + void (*shutdown)(struct amba_device *); + const struct amba_id *id_table; +}; + +struct pl061_context_save_regs { + u8 gpio_data; + u8 gpio_dir; + u8 gpio_is; + u8 gpio_ibe; + u8 gpio_iev; + u8 gpio_ie; +}; + +struct pl061 { + raw_spinlock_t lock; + void *base; + struct gpio_chip gc; + struct irq_chip irq_chip; + int parent_irq; + struct pl061_context_save_regs csave_regs; +}; + +enum { + RC5T583_IRQ_ONKEY = 0, + RC5T583_IRQ_ACOK = 1, + RC5T583_IRQ_LIDOPEN = 2, + RC5T583_IRQ_PREOT = 3, + RC5T583_IRQ_CLKSTP = 4, + RC5T583_IRQ_ONKEY_OFF = 5, + RC5T583_IRQ_WD = 6, + RC5T583_IRQ_EN_PWRREQ1 = 7, + RC5T583_IRQ_EN_PWRREQ2 = 8, + RC5T583_IRQ_PRE_VINDET = 9, + RC5T583_IRQ_DC0LIM = 10, + RC5T583_IRQ_DC1LIM = 11, + RC5T583_IRQ_DC2LIM = 12, + RC5T583_IRQ_DC3LIM = 13, + RC5T583_IRQ_CTC = 14, + RC5T583_IRQ_YALE = 15, + RC5T583_IRQ_DALE = 16, + RC5T583_IRQ_WALE = 17, + RC5T583_IRQ_AIN1L = 18, + RC5T583_IRQ_AIN2L = 19, + RC5T583_IRQ_AIN3L = 20, + RC5T583_IRQ_VBATL = 21, + RC5T583_IRQ_VIN3L = 22, + RC5T583_IRQ_VIN8L = 23, + RC5T583_IRQ_AIN1H = 24, + RC5T583_IRQ_AIN2H = 25, + RC5T583_IRQ_AIN3H = 26, + RC5T583_IRQ_VBATH = 27, + RC5T583_IRQ_VIN3H = 28, + RC5T583_IRQ_VIN8H = 29, + RC5T583_IRQ_ADCEND = 30, + RC5T583_IRQ_GPIO0 = 31, + RC5T583_IRQ_GPIO1 = 32, + RC5T583_IRQ_GPIO2 = 33, + RC5T583_IRQ_GPIO3 = 34, + RC5T583_IRQ_GPIO4 = 35, + RC5T583_IRQ_GPIO5 = 36, + RC5T583_IRQ_GPIO6 = 37, + RC5T583_IRQ_GPIO7 = 38, + RC5T583_MAX_IRQS = 39, +}; + +enum { + RC5T583_GPIO0 = 0, + RC5T583_GPIO1 = 1, + RC5T583_GPIO2 = 2, + RC5T583_GPIO3 = 3, + RC5T583_GPIO4 = 4, + RC5T583_GPIO5 = 5, + RC5T583_GPIO6 = 6, + RC5T583_GPIO7 = 7, + RC5T583_MAX_GPIO = 8, +}; + +enum { + RC5T583_REGULATOR_DC0 = 0, + RC5T583_REGULATOR_DC1 = 1, + RC5T583_REGULATOR_DC2 = 2, + RC5T583_REGULATOR_DC3 = 3, + RC5T583_REGULATOR_LDO0 = 4, + RC5T583_REGULATOR_LDO1 = 5, + RC5T583_REGULATOR_LDO2 = 6, + RC5T583_REGULATOR_LDO3 = 7, + RC5T583_REGULATOR_LDO4 = 8, + RC5T583_REGULATOR_LDO5 = 9, + RC5T583_REGULATOR_LDO6 = 10, + RC5T583_REGULATOR_LDO7 = 11, + RC5T583_REGULATOR_LDO8 = 12, + RC5T583_REGULATOR_LDO9 = 13, + RC5T583_REGULATOR_MAX = 14, +}; + +struct rc5t583 { + struct device *dev; + struct regmap *regmap; + int chip_irq; + int irq_base; + struct mutex irq_lock; + long unsigned int group_irq_en[5]; + uint8_t intc_inten_reg; + uint8_t irq_en_reg[8]; + uint8_t gpedge_reg[2]; +}; + +struct rc5t583_platform_data { + int irq_base; + int gpio_base; + bool enable_shutdown; + int regulator_deepsleep_slot[14]; + long unsigned int regulator_ext_pwr_control[14]; + struct regulator_init_data *reg_init_data[14]; +}; + +struct rc5t583_gpio { + struct gpio_chip gpio_chip; + struct rc5t583 *rc5t583; +}; + +struct sifive_gpio { + void *base; + struct gpio_chip gc; + struct regmap *regs; + long unsigned int irq_state; + unsigned int trigger[32]; + unsigned int irq_number[32]; +}; + +enum stmpe_block { + STMPE_BLOCK_GPIO = 1, + STMPE_BLOCK_KEYPAD = 2, + STMPE_BLOCK_TOUCHSCREEN = 4, + STMPE_BLOCK_ADC = 8, + STMPE_BLOCK_PWM = 16, + STMPE_BLOCK_ROTATOR = 32, +}; + +enum stmpe_partnum { + STMPE610 = 0, + STMPE801 = 1, + STMPE811 = 2, + STMPE1600 = 3, + STMPE1601 = 4, + STMPE1801 = 5, + STMPE2401 = 6, + STMPE2403 = 7, + STMPE_NBR_PARTS = 8, +}; + +enum { + STMPE_IDX_CHIP_ID = 0, + STMPE_IDX_SYS_CTRL = 1, + STMPE_IDX_SYS_CTRL2 = 2, + STMPE_IDX_ICR_LSB = 3, + STMPE_IDX_IER_LSB = 4, + STMPE_IDX_IER_MSB = 5, + STMPE_IDX_ISR_LSB = 6, + STMPE_IDX_ISR_MSB = 7, + STMPE_IDX_GPMR_LSB = 8, + STMPE_IDX_GPMR_CSB = 9, + STMPE_IDX_GPMR_MSB = 10, + STMPE_IDX_GPSR_LSB = 11, + STMPE_IDX_GPSR_CSB = 12, + STMPE_IDX_GPSR_MSB = 13, + STMPE_IDX_GPCR_LSB = 14, + STMPE_IDX_GPCR_CSB = 15, + STMPE_IDX_GPCR_MSB = 16, + STMPE_IDX_GPDR_LSB = 17, + STMPE_IDX_GPDR_CSB = 18, + STMPE_IDX_GPDR_MSB = 19, + STMPE_IDX_GPEDR_LSB = 20, + STMPE_IDX_GPEDR_CSB = 21, + STMPE_IDX_GPEDR_MSB = 22, + STMPE_IDX_GPRER_LSB = 23, + STMPE_IDX_GPRER_CSB = 24, + STMPE_IDX_GPRER_MSB = 25, + STMPE_IDX_GPFER_LSB = 26, + STMPE_IDX_GPFER_CSB = 27, + STMPE_IDX_GPFER_MSB = 28, + STMPE_IDX_GPPUR_LSB = 29, + STMPE_IDX_GPPDR_LSB = 30, + STMPE_IDX_GPAFR_U_MSB = 31, + STMPE_IDX_IEGPIOR_LSB = 32, + STMPE_IDX_IEGPIOR_CSB = 33, + STMPE_IDX_IEGPIOR_MSB = 34, + STMPE_IDX_ISGPIOR_LSB = 35, + STMPE_IDX_ISGPIOR_CSB = 36, + STMPE_IDX_ISGPIOR_MSB = 37, + STMPE_IDX_MAX = 38, +}; + +struct stmpe_client_info; + +struct stmpe_variant_info; + +struct stmpe_platform_data; + +struct stmpe { + struct regulator *vcc; + struct regulator *vio; + struct mutex lock; + struct mutex irq_lock; + struct device *dev; + struct irq_domain *domain; + void *client; + struct stmpe_client_info *ci; + enum stmpe_partnum partnum; + struct stmpe_variant_info *variant; + const u8 *regs; + int irq; + int num_gpios; + u8 ier[2]; + u8 oldier[2]; + struct stmpe_platform_data *pdata; + u8 sample_time; + u8 mod_12b; + u8 ref_sel; + u8 adc_freq; +}; + +enum { + REG_RE = 0, + REG_FE = 1, + REG_IE = 2, +}; + +enum { + LSB = 0, + CSB = 1, + MSB = 2, +}; + +struct stmpe_gpio { + struct gpio_chip chip; + struct stmpe *stmpe; + struct device *dev; + struct mutex irq_lock; + u32 norequest_mask; + u8 regs[9]; + u8 oldregs[9]; +}; + +struct tc3589x_platform_data; + +struct tc3589x { + struct mutex lock; + struct device *dev; + struct i2c_client *i2c; + struct irq_domain *domain; + int irq_base; + int num_gpio; + struct tc3589x_platform_data *pdata; +}; + +struct tc3589x_platform_data { + unsigned int block; +}; + +enum { + REG_IBE = 0, + REG_IEV = 1, + REG_IS = 2, + REG_IE___2 = 3, + REG_DIRECT = 4, +}; + +struct tc3589x_gpio { + struct gpio_chip chip; + struct tc3589x *tc3589x; + struct device *dev; + struct mutex irq_lock; + u8 regs[15]; + u8 oldregs[15]; +}; + +struct tegra_gpio_port { + const char *name; + unsigned int bank; + unsigned int port; + unsigned int pins; +}; + +struct tegra186_pin_range { + unsigned int offset; + const char *group; +}; + +struct tegra_gpio_soc { + const struct tegra_gpio_port *ports; + unsigned int num_ports; + const char *name; + unsigned int instance; + unsigned int num_irqs_per_bank; + const struct tegra186_pin_range *pin_ranges; + unsigned int num_pin_ranges; + const char *pinmux; +}; + +struct tegra_gpio { + struct gpio_chip gpio; + struct irq_chip intc; + unsigned int num_irq; + unsigned int *irq; + const struct tegra_gpio_soc *soc; + unsigned int num_irqs_per_bank; + unsigned int num_banks; + void *secure; + void *base; +}; + +struct tegra_gpio_bank { + unsigned int bank; + raw_spinlock_t lvl_lock[4]; + spinlock_t dbc_lock[4]; + u32 cnf[4]; + u32 out[4]; + u32 oe[4]; + u32 int_enb[4]; + u32 int_lvl[4]; + u32 wake_enb[4]; + u32 dbc_enb[4]; + u32 dbc_cnt[4]; +}; + +struct tegra_gpio_soc_config { + bool debounce_supported; + u32 bank_stride; + u32 upper_offset; +}; + +struct tegra_gpio_info { + struct device *dev; + void *regs; + struct tegra_gpio_bank *bank_info; + const struct tegra_gpio_soc_config *soc; + struct gpio_chip gc; + struct irq_chip ic; + u32 bank_count; + unsigned int *irqs; +}; + +enum { + TPS6586X_ID_SYS = 0, + TPS6586X_ID_SM_0 = 1, + TPS6586X_ID_SM_1 = 2, + TPS6586X_ID_SM_2 = 3, + TPS6586X_ID_LDO_0 = 4, + TPS6586X_ID_LDO_1 = 5, + TPS6586X_ID_LDO_2 = 6, + TPS6586X_ID_LDO_3 = 7, + TPS6586X_ID_LDO_4 = 8, + TPS6586X_ID_LDO_5 = 9, + TPS6586X_ID_LDO_6 = 10, + TPS6586X_ID_LDO_7 = 11, + TPS6586X_ID_LDO_8 = 12, + TPS6586X_ID_LDO_9 = 13, + TPS6586X_ID_LDO_RTC = 14, + TPS6586X_ID_MAX_REGULATOR = 15, +}; + +enum { + TPS6586X_INT_PLDO_0 = 0, + TPS6586X_INT_PLDO_1 = 1, + TPS6586X_INT_PLDO_2 = 2, + TPS6586X_INT_PLDO_3 = 3, + TPS6586X_INT_PLDO_4 = 4, + TPS6586X_INT_PLDO_5 = 5, + TPS6586X_INT_PLDO_6 = 6, + TPS6586X_INT_PLDO_7 = 7, + TPS6586X_INT_COMP_DET = 8, + TPS6586X_INT_ADC = 9, + TPS6586X_INT_PLDO_8 = 10, + TPS6586X_INT_PLDO_9 = 11, + TPS6586X_INT_PSM_0 = 12, + TPS6586X_INT_PSM_1 = 13, + TPS6586X_INT_PSM_2 = 14, + TPS6586X_INT_PSM_3 = 15, + TPS6586X_INT_RTC_ALM1 = 16, + TPS6586X_INT_ACUSB_OVP = 17, + TPS6586X_INT_USB_DET = 18, + TPS6586X_INT_AC_DET = 19, + TPS6586X_INT_BAT_DET = 20, + TPS6586X_INT_CHG_STAT = 21, + TPS6586X_INT_CHG_TEMP = 22, + TPS6586X_INT_PP = 23, + TPS6586X_INT_RESUME = 24, + TPS6586X_INT_LOW_SYS = 25, + TPS6586X_INT_RTC_ALM2 = 26, +}; + +struct tps6586x_subdev_info { + int id; + const char *name; + void *platform_data; + struct device_node *of_node; +}; + +struct tps6586x_platform_data { + int num_subdevs; + struct tps6586x_subdev_info *subdevs; + int gpio_base; + int irq_base; + bool pm_off; + struct regulator_init_data *reg_init_data[15]; +}; + +struct tps6586x_gpio { + struct gpio_chip gpio_chip; + struct device *parent; +}; + +struct tps65910_sleep_keepon_data { + unsigned int therm_keepon: 1; + unsigned int clkout32k_keepon: 1; + unsigned int i2chs_keepon: 1; +}; + +struct tps65910_board { + int gpio_base; + int irq; + int irq_base; + int vmbch_threshold; + int vmbch2_threshold; + bool en_ck32k_xtal; + bool en_dev_slp; + bool pm_off; + struct tps65910_sleep_keepon_data slp_keepon; + bool en_gpio_sleep[9]; + long unsigned int regulator_ext_sleep_control[14]; + struct regulator_init_data *tps65910_pmic_init_data[14]; +}; + +struct tps65910 { + struct device *dev; + struct i2c_client *i2c_client; + struct regmap *regmap; + long unsigned int id; + struct tps65910_board *of_plat_data; + int chip_irq; + struct regmap_irq_chip_data *irq_data; +}; + +struct tps65910_gpio { + struct gpio_chip gpio_chip; + struct tps65910 *tps65910; +}; + +struct xgene_gpio { + struct gpio_chip chip; + void *base; + spinlock_t lock; + u32 set_dr_val[3]; +}; + +struct xgpio_instance { + struct gpio_chip gc; + void *regs; + long unsigned int hw_map[1]; + long unsigned int sw_map[1]; + long unsigned int state[1]; + long unsigned int last_irq_read[1]; + long unsigned int dir[1]; + spinlock_t gpio_lock; + int irq; + struct irq_chip irqchip; + long unsigned int enable[1]; + long unsigned int rising_edge[1]; + long unsigned int falling_edge[1]; + struct clk *clk; +}; + +enum { + PWMF_REQUESTED = 1, + PWMF_EXPORTED = 2, +}; + +struct pwm_lookup { + struct list_head list; + const char *provider; + unsigned int index; + const char *dev_id; + const char *con_id; + unsigned int period; + enum pwm_polarity polarity; + const char *module; +}; + +struct trace_event_raw_pwm { + struct trace_entry ent; + struct pwm_device *pwm; + u64 period; + u64 duty_cycle; + enum pwm_polarity polarity; + bool enabled; + char __data[0]; +}; + +struct trace_event_data_offsets_pwm {}; + +typedef void (*btf_trace_pwm_apply)(void *, struct pwm_device *, const struct pwm_state *); + +typedef void (*btf_trace_pwm_get)(void *, struct pwm_device *, const struct pwm_state *); + +struct pwm_export { + struct device child; + struct pwm_device *pwm; + struct mutex lock; + struct pwm_state suspend; +}; + +struct stmpe_pwm { + struct stmpe *stmpe; + struct pwm_chip chip; + u8 last_duty; +}; + +enum { + pci_channel_io_normal = 1, + pci_channel_io_frozen = 2, + pci_channel_io_perm_failure = 3, +}; + +struct pci_sriov { + int pos; + int nres; + u32 cap; + u16 ctrl; + u16 total_VFs; + u16 initial_VFs; + u16 num_VFs; + u16 offset; + u16 stride; + u16 vf_device; + u32 pgsz; + u8 link; + u8 max_VF_buses; + u16 driver_max_VFs; + struct pci_dev *dev; + struct pci_dev *self; + u32 class; + u8 hdr_type; + u16 subsystem_vendor; + u16 subsystem_device; + resource_size_t barsz[6]; + bool drivers_autoprobe; +}; + +struct rcec_ea { + u8 nextbusn; + u8 lastbusn; + u32 bitmap; +}; + +struct pci_bus_resource { + struct list_head list; + struct resource *res; + unsigned int flags; +}; + +typedef u64 pci_bus_addr_t; + +struct pci_bus_region { + pci_bus_addr_t start; + pci_bus_addr_t end; +}; + +enum pci_fixup_pass { + pci_fixup_early = 0, + pci_fixup_header = 1, + pci_fixup_final = 2, + pci_fixup_enable = 3, + pci_fixup_resume = 4, + pci_fixup_suspend = 5, + pci_fixup_resume_early = 6, + pci_fixup_suspend_late = 7, +}; + +struct hotplug_slot_ops; + +struct hotplug_slot { + const struct hotplug_slot_ops *ops; + struct list_head slot_list; + struct pci_slot *pci_slot; + struct module *owner; + const char *mod_name; +}; + +enum pci_dev_flags { + PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = 1, + PCI_DEV_FLAGS_NO_D3 = 2, + PCI_DEV_FLAGS_ASSIGNED = 4, + PCI_DEV_FLAGS_ACS_ENABLED_QUIRK = 8, + PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = 32, + PCI_DEV_FLAGS_NO_BUS_RESET = 64, + PCI_DEV_FLAGS_NO_PM_RESET = 128, + PCI_DEV_FLAGS_VPD_REF_F0 = 256, + PCI_DEV_FLAGS_BRIDGE_XLATE_ROOT = 512, + PCI_DEV_FLAGS_NO_FLR_RESET = 1024, + PCI_DEV_FLAGS_NO_RELAXED_ORDERING = 2048, + PCI_DEV_FLAGS_HAS_MSI_MASKING = 4096, +}; + +enum pci_bus_flags { + PCI_BUS_FLAGS_NO_MSI = 1, + PCI_BUS_FLAGS_NO_MMRBC = 2, + PCI_BUS_FLAGS_NO_AERSID = 4, + PCI_BUS_FLAGS_NO_EXTCFG = 8, +}; + +enum pci_bus_speed { + PCI_SPEED_33MHz = 0, + PCI_SPEED_66MHz = 1, + PCI_SPEED_66MHz_PCIX = 2, + PCI_SPEED_100MHz_PCIX = 3, + PCI_SPEED_133MHz_PCIX = 4, + PCI_SPEED_66MHz_PCIX_ECC = 5, + PCI_SPEED_100MHz_PCIX_ECC = 6, + PCI_SPEED_133MHz_PCIX_ECC = 7, + PCI_SPEED_66MHz_PCIX_266 = 9, + PCI_SPEED_100MHz_PCIX_266 = 10, + PCI_SPEED_133MHz_PCIX_266 = 11, + AGP_UNKNOWN = 12, + AGP_1X = 13, + AGP_2X = 14, + AGP_4X = 15, + AGP_8X = 16, + PCI_SPEED_66MHz_PCIX_533 = 17, + PCI_SPEED_100MHz_PCIX_533 = 18, + PCI_SPEED_133MHz_PCIX_533 = 19, + PCIE_SPEED_2_5GT = 20, + PCIE_SPEED_5_0GT = 21, + PCIE_SPEED_8_0GT = 22, + PCIE_SPEED_16_0GT = 23, + PCIE_SPEED_32_0GT = 24, + PCIE_SPEED_64_0GT = 25, + PCI_SPEED_UNKNOWN = 255, +}; + +enum { + PCI_REASSIGN_ALL_RSRC = 1, + PCI_REASSIGN_ALL_BUS = 2, + PCI_PROBE_ONLY = 4, + PCI_CAN_SKIP_ISA_ALIGN = 8, + PCI_ENABLE_PROC_DOMAINS = 16, + PCI_COMPAT_DOMAIN_0 = 32, + PCI_SCAN_ALL_PCIE_DEVS = 64, +}; + +enum pcie_bus_config_types { + PCIE_BUS_TUNE_OFF = 0, + PCIE_BUS_DEFAULT = 1, + PCIE_BUS_SAFE = 2, + PCIE_BUS_PERFORMANCE = 3, + PCIE_BUS_PEER2PEER = 4, +}; + +struct hotplug_slot_ops { + int (*enable_slot)(struct hotplug_slot *); + int (*disable_slot)(struct hotplug_slot *); + int (*set_attention_status)(struct hotplug_slot *, u8); + int (*hardware_test)(struct hotplug_slot *, u32); + int (*get_power_status)(struct hotplug_slot *, u8 *); + int (*get_attention_status)(struct hotplug_slot *, u8 *); + int (*get_latch_status)(struct hotplug_slot *, u8 *); + int (*get_adapter_status)(struct hotplug_slot *, u8 *); + int (*reset_slot)(struct hotplug_slot *, bool); +}; + +enum pci_bar_type { + pci_bar_unknown = 0, + pci_bar_io = 1, + pci_bar_mem32 = 2, + pci_bar_mem64 = 3, +}; + +struct pci_domain_busn_res { + struct list_head list; + struct resource res; + int domain_nr; +}; + +enum pcie_reset_state { + pcie_deassert_reset = 1, + pcie_warm_reset = 2, + pcie_hot_reset = 3, +}; + +enum pcie_link_width { + PCIE_LNK_WIDTH_RESRV = 0, + PCIE_LNK_X1 = 1, + PCIE_LNK_X2 = 2, + PCIE_LNK_X4 = 4, + PCIE_LNK_X8 = 8, + PCIE_LNK_X12 = 12, + PCIE_LNK_X16 = 16, + PCIE_LNK_X32 = 32, + PCIE_LNK_WIDTH_UNKNOWN = 255, +}; + +typedef int (*arch_set_vga_state_t)(struct pci_dev *, bool, unsigned int, u32); + +struct pci_cap_saved_data { + u16 cap_nr; + bool cap_extended; + unsigned int size; + u32 data[0]; +}; + +struct pci_cap_saved_state { + struct hlist_node next; + struct pci_cap_saved_data cap; +}; + +struct pci_reset_fn_method { + int (*reset_fn)(struct pci_dev *, bool); + char *name; +}; + +struct pci_pme_device { + struct list_head list; + struct pci_dev *dev; +}; + +struct pci_saved_state { + u32 config_space[16]; + struct pci_cap_saved_data cap[0]; +}; + +struct pci_devres { + unsigned int enabled: 1; + unsigned int pinned: 1; + unsigned int orig_intx: 1; + unsigned int restore_intx: 1; + unsigned int mwi: 1; + u32 region_mask; +}; + +struct driver_attribute { + struct attribute attr; + ssize_t (*show)(struct device_driver *, char *); + ssize_t (*store)(struct device_driver *, const char *, size_t); +}; + +enum pci_ers_result { + PCI_ERS_RESULT_NONE = 1, + PCI_ERS_RESULT_CAN_RECOVER = 2, + PCI_ERS_RESULT_NEED_RESET = 3, + PCI_ERS_RESULT_DISCONNECT = 4, + PCI_ERS_RESULT_RECOVERED = 5, + PCI_ERS_RESULT_NO_AER_DRIVER = 6, +}; + +struct pcie_device { + int irq; + struct pci_dev *port; + u32 service; + void *priv_data; + struct device device; +}; + +struct pcie_port_service_driver { + const char *name; + int (*probe)(struct pcie_device *); + void (*remove)(struct pcie_device *); + int (*suspend)(struct pcie_device *); + int (*resume_noirq)(struct pcie_device *); + int (*resume)(struct pcie_device *); + int (*runtime_suspend)(struct pcie_device *); + int (*runtime_resume)(struct pcie_device *); + int (*slot_reset)(struct pcie_device *); + int port_type; + u32 service; + struct device_driver driver; +}; + +struct pci_dynid { + struct list_head node; + struct pci_device_id id; +}; + +struct drv_dev_and_id { + struct pci_driver *drv; + struct pci_dev *dev; + const struct pci_device_id *id; +}; + +enum pci_mmap_state { + pci_mmap_io = 0, + pci_mmap_mem = 1, +}; + +enum pci_mmap_api { + PCI_MMAP_SYSFS = 0, + PCI_MMAP_PROCFS = 1, +}; + +struct pci_dev_resource { + struct list_head list; + struct resource *res; + struct pci_dev *dev; + resource_size_t start; + resource_size_t end; + resource_size_t add_size; + resource_size_t min_align; + long unsigned int flags; +}; + +enum release_type { + leaf_only = 0, + whole_subtree = 1, +}; + +enum enable_type { + undefined = 4294967295, + user_disabled = 0, + auto_disabled = 1, + user_enabled = 2, + auto_enabled = 3, +}; + +struct msix_entry { + u32 vector; + u16 entry; +}; + +struct portdrv_service_data { + struct pcie_port_service_driver *drv; + struct device *dev; + u32 service; +}; + +typedef int (*pcie_callback_t)(struct pcie_device *); + +struct walk_rcec_data { + struct pci_dev *rcec; + int (*user_callback)(struct pci_dev *, void *); + void *user_data; +}; + +struct aspm_latency { + u32 l0s; + u32 l1; +}; + +struct pcie_link_state { + struct pci_dev *pdev; + struct pci_dev *downstream; + struct pcie_link_state *root; + struct pcie_link_state *parent; + struct list_head sibling; + u32 aspm_support: 7; + u32 aspm_enabled: 7; + u32 aspm_capable: 7; + u32 aspm_default: 7; + char: 4; + u32 aspm_disable: 7; + u32 clkpm_capable: 1; + u32 clkpm_enabled: 1; + u32 clkpm_default: 1; + u32 clkpm_disable: 1; + struct aspm_latency latency_up; + struct aspm_latency latency_dw; + struct aspm_latency acceptable[8]; +}; + +enum { + CPER_SEV_RECOVERABLE = 0, + CPER_SEV_FATAL = 1, + CPER_SEV_CORRECTED = 2, + CPER_SEV_INFORMATIONAL = 3, +}; + +struct aer_stats { + u64 dev_cor_errs[16]; + u64 dev_fatal_errs[27]; + u64 dev_nonfatal_errs[27]; + u64 dev_total_cor_errs; + u64 dev_total_fatal_errs; + u64 dev_total_nonfatal_errs; + u64 rootport_total_cor_errs; + u64 rootport_total_fatal_errs; + u64 rootport_total_nonfatal_errs; +}; + +struct aer_header_log_regs { + unsigned int dw0; + unsigned int dw1; + unsigned int dw2; + unsigned int dw3; +}; + +struct aer_capability_regs { + u32 header; + u32 uncor_status; + u32 uncor_mask; + u32 uncor_severity; + u32 cor_status; + u32 cor_mask; + u32 cap_control; + struct aer_header_log_regs header_log; + u32 root_command; + u32 root_status; + u16 cor_err_source; + u16 uncor_err_source; +}; + +struct aer_err_info { + struct pci_dev *dev[5]; + int error_dev_num; + unsigned int id: 16; + unsigned int severity: 2; + unsigned int __pad1: 5; + unsigned int multi_error_valid: 1; + unsigned int first_error: 5; + unsigned int __pad2: 2; + unsigned int tlp_header_valid: 1; + unsigned int status; + unsigned int mask; + struct aer_header_log_regs tlp; +}; + +struct aer_err_source { + unsigned int status; + unsigned int id; +}; + +struct aer_rpc { + struct pci_dev *rpd; + struct { + union { + struct __kfifo kfifo; + struct aer_err_source *type; + const struct aer_err_source *const_type; + char (*rectype)[0]; + struct aer_err_source *ptr; + const struct aer_err_source *ptr_const; + }; + struct aer_err_source buf[128]; + } aer_fifo; +}; + +struct aer_recover_entry { + u8 bus; + u8 devfn; + u16 domain; + int severity; + struct aer_capability_regs *regs; +}; + +struct pcie_pme_service_data { + spinlock_t lock; + struct pcie_device *srv; + struct work_struct work; + bool noirq; +}; + +struct pci_slot_attribute { + struct attribute attr; + ssize_t (*show)(struct pci_slot *, char *); + ssize_t (*store)(struct pci_slot *, const char *, size_t); +}; + +typedef acpi_status (*acpi_walk_callback)(acpi_handle, u32, void *, void **); + +enum pm_qos_flags_status { + PM_QOS_FLAGS_UNDEFINED = 4294967295, + PM_QOS_FLAGS_NONE = 0, + PM_QOS_FLAGS_SOME = 1, + PM_QOS_FLAGS_ALL = 2, +}; + +struct hpx_type0 { + u32 revision; + u8 cache_line_size; + u8 latency_timer; + u8 enable_serr; + u8 enable_perr; +}; + +struct hpx_type1 { + u32 revision; + u8 max_mem_read; + u8 avg_max_split; + u16 tot_max_split; +}; + +struct hpx_type2 { + u32 revision; + u32 unc_err_mask_and; + u32 unc_err_mask_or; + u32 unc_err_sever_and; + u32 unc_err_sever_or; + u32 cor_err_mask_and; + u32 cor_err_mask_or; + u32 adv_err_cap_and; + u32 adv_err_cap_or; + u16 pci_exp_devctl_and; + u16 pci_exp_devctl_or; + u16 pci_exp_lnkctl_and; + u16 pci_exp_lnkctl_or; + u32 sec_unc_err_sever_and; + u32 sec_unc_err_sever_or; + u32 sec_unc_err_mask_and; + u32 sec_unc_err_mask_or; +}; + +struct hpx_type3 { + u16 device_type; + u16 function_type; + u16 config_space_location; + u16 pci_exp_cap_id; + u16 pci_exp_cap_ver; + u16 pci_exp_vendor_id; + u16 dvsec_id; + u16 dvsec_rev; + u16 match_offset; + u32 match_mask_and; + u32 match_value; + u16 reg_offset; + u32 reg_mask_and; + u32 reg_mask_or; +}; + +enum hpx_type3_dev_type { + HPX_TYPE_ENDPOINT = 1, + HPX_TYPE_LEG_END = 2, + HPX_TYPE_RC_END = 4, + HPX_TYPE_RC_EC = 8, + HPX_TYPE_ROOT_PORT = 16, + HPX_TYPE_UPSTREAM = 32, + HPX_TYPE_DOWNSTREAM = 64, + HPX_TYPE_PCI_BRIDGE = 128, + HPX_TYPE_PCIE_BRIDGE = 256, +}; + +enum hpx_type3_fn_type { + HPX_FN_NORMAL = 1, + HPX_FN_SRIOV_PHYS = 2, + HPX_FN_SRIOV_VIRT = 4, +}; + +enum hpx_type3_cfg_loc { + HPX_CFG_PCICFG = 0, + HPX_CFG_PCIE_CAP = 1, + HPX_CFG_PCIE_CAP_EXT = 2, + HPX_CFG_VEND_CAP = 3, + HPX_CFG_DVSEC = 4, + HPX_CFG_MAX = 5, +}; + +struct of_bus; + +struct of_pci_range_parser { + struct device_node *node; + struct of_bus *bus; + const __be32 *range; + const __be32 *end; + int na; + int ns; + int pna; + bool dma; +}; + +struct of_pci_range { + union { + u64 pci_addr; + u64 bus_addr; + }; + u64 cpu_addr; + u64 size; + u32 flags; +}; + +struct pci_fixup { + u16 vendor; + u16 device; + u32 class; + unsigned int class_shift; + int hook_offset; +}; + +enum { + NVME_REG_CAP = 0, + NVME_REG_VS = 8, + NVME_REG_INTMS = 12, + NVME_REG_INTMC = 16, + NVME_REG_CC = 20, + NVME_REG_CSTS = 28, + NVME_REG_NSSR = 32, + NVME_REG_AQA = 36, + NVME_REG_ASQ = 40, + NVME_REG_ACQ = 48, + NVME_REG_CMBLOC = 56, + NVME_REG_CMBSZ = 60, + NVME_REG_BPINFO = 64, + NVME_REG_BPRSEL = 68, + NVME_REG_BPMBL = 72, + NVME_REG_CMBMSC = 80, + NVME_REG_PMRCAP = 3584, + NVME_REG_PMRCTL = 3588, + NVME_REG_PMRSTS = 3592, + NVME_REG_PMREBS = 3596, + NVME_REG_PMRSWTP = 3600, + NVME_REG_DBS = 4096, +}; + +enum { + NVME_CC_ENABLE = 1, + NVME_CC_EN_SHIFT = 0, + NVME_CC_CSS_SHIFT = 4, + NVME_CC_MPS_SHIFT = 7, + NVME_CC_AMS_SHIFT = 11, + NVME_CC_SHN_SHIFT = 14, + NVME_CC_IOSQES_SHIFT = 16, + NVME_CC_IOCQES_SHIFT = 20, + NVME_CC_CSS_NVM = 0, + NVME_CC_CSS_CSI = 96, + NVME_CC_CSS_MASK = 112, + NVME_CC_AMS_RR = 0, + NVME_CC_AMS_WRRU = 2048, + NVME_CC_AMS_VS = 14336, + NVME_CC_SHN_NONE = 0, + NVME_CC_SHN_NORMAL = 16384, + NVME_CC_SHN_ABRUPT = 32768, + NVME_CC_SHN_MASK = 49152, + NVME_CC_IOSQES = 393216, + NVME_CC_IOCQES = 4194304, + NVME_CAP_CSS_NVM = 1, + NVME_CAP_CSS_CSI = 64, + NVME_CSTS_RDY = 1, + NVME_CSTS_CFS = 2, + NVME_CSTS_NSSRO = 16, + NVME_CSTS_PP = 32, + NVME_CSTS_SHST_NORMAL = 0, + NVME_CSTS_SHST_OCCUR = 4, + NVME_CSTS_SHST_CMPLT = 8, + NVME_CSTS_SHST_MASK = 12, + NVME_CMBMSC_CRE = 1, + NVME_CMBMSC_CMSE = 2, +}; + +enum { + NVME_AEN_BIT_NS_ATTR = 8, + NVME_AEN_BIT_FW_ACT = 9, + NVME_AEN_BIT_ANA_CHANGE = 11, + NVME_AEN_BIT_DISC_CHANGE = 31, +}; + +enum { + SWITCHTEC_GAS_MRPC_OFFSET = 0, + SWITCHTEC_GAS_TOP_CFG_OFFSET = 4096, + SWITCHTEC_GAS_SW_EVENT_OFFSET = 6144, + SWITCHTEC_GAS_SYS_INFO_OFFSET = 8192, + SWITCHTEC_GAS_FLASH_INFO_OFFSET = 8704, + SWITCHTEC_GAS_PART_CFG_OFFSET = 16384, + SWITCHTEC_GAS_NTB_OFFSET = 65536, + SWITCHTEC_GAS_PFF_CSR_OFFSET = 1261568, +}; + +enum { + SWITCHTEC_NTB_REG_INFO_OFFSET = 0, + SWITCHTEC_NTB_REG_CTRL_OFFSET = 16384, + SWITCHTEC_NTB_REG_DBMSG_OFFSET = 409600, +}; + +struct nt_partition_info { + u32 xlink_enabled; + u32 target_part_low; + u32 target_part_high; + u32 reserved; +}; + +struct ntb_info_regs { + u8 partition_count; + u8 partition_id; + u16 reserved1; + u64 ep_map; + u16 requester_id; + u16 reserved2; + u32 reserved3[4]; + struct nt_partition_info ntp_info[48]; +} __attribute__((packed)); + +struct ntb_ctrl_regs { + u32 partition_status; + u32 partition_op; + u32 partition_ctrl; + u32 bar_setup; + u32 bar_error; + u16 lut_table_entries; + u16 lut_table_offset; + u32 lut_error; + u16 req_id_table_size; + u16 req_id_table_offset; + u32 req_id_error; + u32 reserved1[7]; + struct { + u32 ctl; + u32 win_size; + u64 xlate_addr; + } bar_entry[6]; + struct { + u32 win_size; + u32 reserved[3]; + } bar_ext_entry[6]; + u32 reserved2[192]; + u32 req_id_table[512]; + u32 reserved3[256]; + u64 lut_entry[512]; +}; + +struct pci_dev_reset_methods { + u16 vendor; + u16 device; + int (*reset)(struct pci_dev *, bool); +}; + +struct pci_dev_acs_enabled { + u16 vendor; + u16 device; + int (*acs_enabled)(struct pci_dev *, u16); +}; + +struct pci_dev_acs_ops { + u16 vendor; + u16 device; + int (*enable_acs)(struct pci_dev *); + int (*disable_acs_redir)(struct pci_dev *); +}; + +struct slot { + u8 number; + unsigned int devfn; + struct pci_bus *bus; + struct pci_dev *dev; + unsigned int latch_status: 1; + unsigned int adapter_status: 1; + unsigned int extracting; + struct hotplug_slot hotplug_slot; + struct list_head slot_list; +}; + +struct cpci_hp_controller_ops { + int (*query_enum)(); + int (*enable_irq)(); + int (*disable_irq)(); + int (*check_irq)(void *); + int (*hardware_test)(struct slot *, u32); + u8 (*get_power)(struct slot *); + int (*set_power)(struct slot *, int); +}; + +struct cpci_hp_controller { + unsigned int irq; + long unsigned int irq_flags; + char *devname; + void *dev_id; + char *name; + struct cpci_hp_controller_ops *ops; +}; + +struct controller { + struct pcie_device *pcie; + u32 slot_cap; + unsigned int inband_presence_disabled: 1; + u16 slot_ctrl; + struct mutex ctrl_lock; + long unsigned int cmd_started; + unsigned int cmd_busy: 1; + wait_queue_head_t queue; + atomic_t pending_events; + unsigned int notification_enabled: 1; + unsigned int power_fault_detected; + struct task_struct *poll_thread; + u8 state; + struct mutex state_lock; + struct delayed_work button_work; + struct hotplug_slot hotplug_slot; + struct rw_semaphore reset_lock; + unsigned int ist_running; + int request_result; + wait_queue_head_t requester; +}; + +struct controller___2; + +struct hpc_ops; + +struct slot___2 { + u8 bus; + u8 device; + u16 status; + u32 number; + u8 is_a_board; + u8 state; + u8 attention_save; + u8 presence_save; + u8 latch_save; + u8 pwr_save; + struct controller___2 *ctrl; + const struct hpc_ops *hpc_ops; + struct hotplug_slot hotplug_slot; + struct list_head slot_list; + struct delayed_work work; + struct mutex lock; + struct workqueue_struct *wq; + u8 hp_slot; +}; + +struct controller___2 { + struct mutex crit_sect; + struct mutex cmd_lock; + int num_slots; + int slot_num_inc; + struct pci_dev *pci_dev; + struct list_head slot_list; + const struct hpc_ops *hpc_ops; + wait_queue_head_t queue; + u8 slot_device_offset; + u32 pcix_misc2_reg; + u32 first_slot; + u32 cap_offset; + long unsigned int mmio_base; + long unsigned int mmio_size; + void *creg; + struct timer_list poll_timer; +}; + +struct hpc_ops { + int (*power_on_slot)(struct slot___2 *); + int (*slot_enable)(struct slot___2 *); + int (*slot_disable)(struct slot___2 *); + int (*set_bus_speed_mode)(struct slot___2 *, enum pci_bus_speed); + int (*get_power_status)(struct slot___2 *, u8 *); + int (*get_attention_status)(struct slot___2 *, u8 *); + int (*set_attention_status)(struct slot___2 *, u8); + int (*get_latch_status)(struct slot___2 *, u8 *); + int (*get_adapter_status)(struct slot___2 *, u8 *); + int (*get_adapter_speed)(struct slot___2 *, enum pci_bus_speed *); + int (*get_mode1_ECC_cap)(struct slot___2 *, u8 *); + int (*get_prog_int)(struct slot___2 *, u8 *); + int (*query_power_fault)(struct slot___2 *); + void (*green_led_on)(struct slot___2 *); + void (*green_led_off)(struct slot___2 *); + void (*green_led_blink)(struct slot___2 *); + void (*release_ctlr)(struct controller___2 *); + int (*check_cmd_status)(struct controller___2 *); +}; + +struct event_info { + u32 event_type; + struct slot___2 *p_slot; + struct work_struct work; +}; + +struct pushbutton_work_info { + struct slot___2 *p_slot; + struct work_struct work; +}; + +enum ctrl_offsets { + BASE_OFFSET = 0, + SLOT_AVAIL1 = 4, + SLOT_AVAIL2 = 8, + SLOT_CONFIG = 12, + SEC_BUS_CONFIG = 16, + MSI_CTRL = 18, + PROG_INTERFACE = 19, + CMD = 20, + CMD_STATUS = 22, + INTR_LOC = 24, + SERR_LOC = 28, + SERR_INTR_ENABLE = 32, + SLOT1 = 36, +}; + +struct acpiphp_slot; + +struct slot___3 { + struct hotplug_slot hotplug_slot; + struct acpiphp_slot *acpi_slot; + unsigned int sun; +}; + +struct acpiphp_slot { + struct list_head node; + struct pci_bus *bus; + struct list_head funcs; + struct slot___3 *slot; + u8 device; + u32 flags; +}; + +struct acpiphp_attention_info { + int (*set_attn)(struct hotplug_slot *, u8); + int (*get_attn)(struct hotplug_slot *, u8 *); + struct module *owner; +}; + +struct acpiphp_context; + +struct acpiphp_bridge { + struct list_head list; + struct list_head slots; + struct kref ref; + struct acpiphp_context *context; + int nr_slots; + struct pci_bus *pci_bus; + struct pci_dev *pci_dev; + bool is_going_away; +}; + +struct acpiphp_func { + struct acpiphp_bridge *parent; + struct acpiphp_slot *slot; + struct list_head sibling; + u8 function; + u32 flags; +}; + +struct acpiphp_context { + struct acpi_hotplug_context hp; + struct acpiphp_func func; + struct acpiphp_bridge *bridge; + unsigned int refcount; +}; + +struct acpiphp_root_context { + struct acpi_hotplug_context hp; + struct acpiphp_bridge *root_bridge; +}; + +struct pci_bridge_emul_conf { + __le16 vendor; + __le16 device; + __le16 command; + __le16 status; + __le32 class_revision; + u8 cache_line_size; + u8 latency_timer; + u8 header_type; + u8 bist; + __le32 bar[2]; + u8 primary_bus; + u8 secondary_bus; + u8 subordinate_bus; + u8 secondary_latency_timer; + u8 iobase; + u8 iolimit; + __le16 secondary_status; + __le16 membase; + __le16 memlimit; + __le16 pref_mem_base; + __le16 pref_mem_limit; + __le32 prefbaseupper; + __le32 preflimitupper; + __le16 iobaseupper; + __le16 iolimitupper; + u8 capabilities_pointer; + u8 reserve[3]; + __le32 romaddr; + u8 intline; + u8 intpin; + __le16 bridgectrl; +}; + +struct pci_bridge_emul_pcie_conf { + u8 cap_id; + u8 next; + __le16 cap; + __le32 devcap; + __le16 devctl; + __le16 devsta; + __le32 lnkcap; + __le16 lnkctl; + __le16 lnksta; + __le32 slotcap; + __le16 slotctl; + __le16 slotsta; + __le16 rootctl; + __le16 rootcap; + __le32 rootsta; + __le32 devcap2; + __le16 devctl2; + __le16 devsta2; + __le32 lnkcap2; + __le16 lnkctl2; + __le16 lnksta2; + __le32 slotcap2; + __le16 slotctl2; + __le16 slotsta2; +}; + +typedef enum { + PCI_BRIDGE_EMUL_HANDLED = 0, + PCI_BRIDGE_EMUL_NOT_HANDLED = 1, +} pci_bridge_emul_read_status_t; + +struct pci_bridge_emul; + +struct pci_bridge_emul_ops { + pci_bridge_emul_read_status_t (*read_base)(struct pci_bridge_emul *, int, u32 *); + pci_bridge_emul_read_status_t (*read_pcie)(struct pci_bridge_emul *, int, u32 *); + void (*write_base)(struct pci_bridge_emul *, int, u32, u32, u32); + void (*write_pcie)(struct pci_bridge_emul *, int, u32, u32, u32); +}; + +struct pci_bridge_reg_behavior; + +struct pci_bridge_emul { + struct pci_bridge_emul_conf conf; + struct pci_bridge_emul_pcie_conf pcie_conf; + struct pci_bridge_emul_ops *ops; + struct pci_bridge_reg_behavior *pci_regs_behavior; + struct pci_bridge_reg_behavior *pcie_cap_regs_behavior; + void *data; + bool has_pcie; +}; + +struct pci_bridge_reg_behavior { + u32 ro; + u32 rw; + u32 w1c; +}; + +enum { + PCI_BRIDGE_EMUL_NO_PREFETCHABLE_BAR = 1, +}; + +enum dmi_device_type { + DMI_DEV_TYPE_ANY = 0, + DMI_DEV_TYPE_OTHER = 1, + DMI_DEV_TYPE_UNKNOWN = 2, + DMI_DEV_TYPE_VIDEO = 3, + DMI_DEV_TYPE_SCSI = 4, + DMI_DEV_TYPE_ETHERNET = 5, + DMI_DEV_TYPE_TOKENRING = 6, + DMI_DEV_TYPE_SOUND = 7, + DMI_DEV_TYPE_PATA = 8, + DMI_DEV_TYPE_SATA = 9, + DMI_DEV_TYPE_SAS = 10, + DMI_DEV_TYPE_IPMI = 4294967295, + DMI_DEV_TYPE_OEM_STRING = 4294967294, + DMI_DEV_TYPE_DEV_ONBOARD = 4294967293, + DMI_DEV_TYPE_DEV_SLOT = 4294967292, +}; + +struct dmi_device { + struct list_head list; + int type; + const char *name; + void *device_data; +}; + +struct dmi_dev_onboard { + struct dmi_device dev; + int instance; + int segment; + int bus; + int devfn; +}; + +enum smbios_attr_enum { + SMBIOS_ATTR_NONE = 0, + SMBIOS_ATTR_LABEL_SHOW = 1, + SMBIOS_ATTR_INSTANCE_SHOW = 2, +}; + +enum acpi_attr_enum { + ACPI_ATTR_LABEL_SHOW = 0, + ACPI_ATTR_INDEX_SHOW = 1, +}; + +struct pci_epf_device_id { + char name[20]; + kernel_ulong_t driver_data; +}; + +enum pci_interrupt_pin { + PCI_INTERRUPT_UNKNOWN = 0, + PCI_INTERRUPT_INTA = 1, + PCI_INTERRUPT_INTB = 2, + PCI_INTERRUPT_INTC = 3, + PCI_INTERRUPT_INTD = 4, +}; + +enum pci_barno { + NO_BAR = 4294967295, + BAR_0 = 0, + BAR_1 = 1, + BAR_2 = 2, + BAR_3 = 3, + BAR_4 = 4, + BAR_5 = 5, +}; + +struct pci_epf_header { + u16 vendorid; + u16 deviceid; + u8 revid; + u8 progif_code; + u8 subclass_code; + u8 baseclass_code; + u8 cache_line_size; + u16 subsys_vendor_id; + u16 subsys_id; + enum pci_interrupt_pin interrupt_pin; +}; + +struct pci_epf; + +struct pci_epf_ops { + int (*bind)(struct pci_epf *); + void (*unbind)(struct pci_epf *); + struct config_group * (*add_cfs)(struct pci_epf *, struct config_group *); +}; + +struct pci_epf_bar { + dma_addr_t phys_addr; + void *addr; + size_t size; + enum pci_barno barno; + int flags; +}; + +struct pci_epc; + +struct pci_epf_driver; + +struct pci_epf { + struct device dev; + const char *name; + struct pci_epf_header *header; + struct pci_epf_bar bar[6]; + u8 msi_interrupts; + u16 msix_interrupts; + u8 func_no; + u8 vfunc_no; + struct pci_epc *epc; + struct pci_epf *epf_pf; + struct pci_epf_driver *driver; + struct list_head list; + struct notifier_block nb; + struct mutex lock; + struct pci_epc *sec_epc; + struct list_head sec_epc_list; + struct pci_epf_bar sec_epc_bar[6]; + u8 sec_epc_func_no; + struct config_group *group; + unsigned int is_bound; + unsigned int is_vf; + long unsigned int vfunction_num_map; + struct list_head pci_vepf; +}; + +struct pci_epf_driver { + int (*probe)(struct pci_epf *); + void (*remove)(struct pci_epf *); + struct device_driver driver; + struct pci_epf_ops *ops; + struct module *owner; + struct list_head epf_group; + const struct pci_epf_device_id *id_table; +}; + +struct pci_epc_ops; + +struct pci_epc_mem; + +struct pci_epc { + struct device dev; + struct list_head pci_epf; + const struct pci_epc_ops *ops; + struct pci_epc_mem **windows; + struct pci_epc_mem *mem; + unsigned int num_windows; + u8 max_functions; + u8 *max_vfs; + struct config_group *group; + struct mutex lock; + long unsigned int function_num_map; + struct atomic_notifier_head notifier; +}; + +enum pci_epc_interface_type { + UNKNOWN_INTERFACE = 4294967295, + PRIMARY_INTERFACE = 0, + SECONDARY_INTERFACE = 1, +}; + +enum pci_epc_irq_type { + PCI_EPC_IRQ_UNKNOWN = 0, + PCI_EPC_IRQ_LEGACY = 1, + PCI_EPC_IRQ_MSI = 2, + PCI_EPC_IRQ_MSIX = 3, +}; + +struct pci_epc_features; + +struct pci_epc_ops { + int (*write_header)(struct pci_epc *, u8, u8, struct pci_epf_header *); + int (*set_bar)(struct pci_epc *, u8, u8, struct pci_epf_bar *); + void (*clear_bar)(struct pci_epc *, u8, u8, struct pci_epf_bar *); + int (*map_addr)(struct pci_epc *, u8, u8, phys_addr_t, u64, size_t); + void (*unmap_addr)(struct pci_epc *, u8, u8, phys_addr_t); + int (*set_msi)(struct pci_epc *, u8, u8, u8); + int (*get_msi)(struct pci_epc *, u8, u8); + int (*set_msix)(struct pci_epc *, u8, u8, u16, enum pci_barno, u32); + int (*get_msix)(struct pci_epc *, u8, u8); + int (*raise_irq)(struct pci_epc *, u8, u8, enum pci_epc_irq_type, u16); + int (*map_msi_irq)(struct pci_epc *, u8, u8, phys_addr_t, u8, u32, u32 *, u32 *); + int (*start)(struct pci_epc *); + void (*stop)(struct pci_epc *); + const struct pci_epc_features * (*get_features)(struct pci_epc *, u8, u8); + struct module *owner; +}; + +struct pci_epc_features { + unsigned int linkup_notifier: 1; + unsigned int core_init_notifier: 1; + unsigned int msi_capable: 1; + unsigned int msix_capable: 1; + u8 reserved_bar; + u8 bar_fixed_64bit; + u64 bar_fixed_size[6]; + size_t align; +}; + +struct pci_epc_mem_window { + phys_addr_t phys_base; + size_t size; + size_t page_size; +}; + +struct pci_epc_mem { + struct pci_epc_mem_window window; + long unsigned int *bitmap; + int pages; + struct mutex lock; +}; + +struct pci_epf_group { + struct config_group group; + struct config_group primary_epc_group; + struct config_group secondary_epc_group; + struct delayed_work cfs_work; + struct pci_epf *epf; + int index; +}; + +struct pci_epc_group { + struct config_group group; + struct pci_epc *epc; + bool start; +}; + +enum pci_notify_event { + CORE_INIT = 0, + LINK_UP = 1, +}; + +struct cdns_pcie; + +struct cdns_pcie_ops { + int (*start_link)(struct cdns_pcie *); + void (*stop_link)(struct cdns_pcie *); + bool (*link_up)(struct cdns_pcie *); + u64 (*cpu_addr_fixup)(struct cdns_pcie *, u64); +}; + +struct cdns_pcie { + void *reg_base; + struct resource *mem_res; + struct device *dev; + bool is_rc; + int phy_count; + struct phy **phy; + struct device_link **link; + const struct cdns_pcie_ops *ops; +}; + +enum cdns_pcie_rp_bar { + RP_BAR_UNDEFINED = 4294967295, + RP_BAR0 = 0, + RP_BAR1 = 1, + RP_NO_BAR = 2, +}; + +struct cdns_pcie_rc { + struct cdns_pcie pcie; + struct resource *cfg_res; + void *cfg_base; + u32 vendor_id; + u32 device_id; + bool avail_ib_bar[3]; + unsigned int quirk_retrain_flag: 1; + unsigned int quirk_detect_quiet_flag: 1; +}; + +struct pci_epf_msix_tbl { + u64 msg_addr; + u32 msg_data; + u32 vector_ctrl; +}; + +enum cdns_pcie_msg_code { + MSG_CODE_ASSERT_INTA = 32, + MSG_CODE_ASSERT_INTB = 33, + MSG_CODE_ASSERT_INTC = 34, + MSG_CODE_ASSERT_INTD = 35, + MSG_CODE_DEASSERT_INTA = 36, + MSG_CODE_DEASSERT_INTB = 37, + MSG_CODE_DEASSERT_INTC = 38, + MSG_CODE_DEASSERT_INTD = 39, +}; + +enum cdns_pcie_msg_routing { + MSG_ROUTING_TO_RC = 0, + MSG_ROUTING_BY_ADDR = 1, + MSG_ROUTING_BY_ID = 2, + MSG_ROUTING_BCAST = 3, + MSG_ROUTING_LOCAL = 4, + MSG_ROUTING_GATHER = 5, +}; + +struct cdns_pcie_epf { + struct cdns_pcie_epf *epf; + struct pci_epf_bar *epf_bar[6]; +}; + +struct cdns_pcie_ep { + struct cdns_pcie pcie; + u32 max_regions; + long unsigned int ob_region_map; + phys_addr_t *ob_addr; + phys_addr_t irq_phys_addr; + void *irq_cpu_addr; + u64 irq_pci_addr; + u8 irq_pci_fn; + u8 irq_pending; + spinlock_t lock; + struct cdns_pcie_epf *epf; + unsigned int quirk_detect_quiet_flag: 1; +}; + +struct cdns_plat_pcie { + struct cdns_pcie *pcie; + bool is_rc; +}; + +struct cdns_plat_pcie_of_data { + bool is_rc; +}; + +enum link_status { + NO_RECEIVERS_DETECTED = 0, + LINK_TRAINING_IN_PROGRESS = 1, + LINK_UP_DL_IN_PROGRESS = 2, + LINK_UP_DL_COMPLETED = 3, +}; + +struct j721e_pcie { + struct device *dev; + struct clk *refclk; + u32 mode; + u32 num_lanes; + struct cdns_pcie *cdns_pcie; + void *user_cfg_base; + void *intd_cfg_base; + u32 linkdown_irq_regfield; +}; + +enum j721e_pcie_mode { + PCI_MODE_RC = 0, + PCI_MODE_EP = 1, +}; + +struct j721e_pcie_data { + enum j721e_pcie_mode mode; + unsigned int quirk_retrain_flag: 1; + unsigned int quirk_detect_quiet_flag: 1; + u32 linkdown_irq_regfield; + unsigned int byte_access_allowed: 1; +}; + +struct faraday_pci_variant { + bool cascaded_irq; +}; + +struct faraday_pci { + struct device *dev; + void *base; + struct irq_domain *irqdomain; + struct pci_bus *bus; + struct clk *bus_clk; +}; + +enum { + LTSSM_DETECT_QUIET = 0, + LTSSM_DETECT_ACTIVE = 1, + LTSSM_POLLING_ACTIVE = 2, + LTSSM_POLLING_COMPLIANCE = 3, + LTSSM_POLLING_CONFIGURATION = 4, + LTSSM_CONFIG_LINKWIDTH_START = 5, + LTSSM_CONFIG_LINKWIDTH_ACCEPT = 6, + LTSSM_CONFIG_LANENUM_ACCEPT = 7, + LTSSM_CONFIG_LANENUM_WAIT = 8, + LTSSM_CONFIG_COMPLETE = 9, + LTSSM_CONFIG_IDLE = 10, + LTSSM_RECOVERY_RCVR_LOCK = 11, + LTSSM_RECOVERY_SPEED = 12, + LTSSM_RECOVERY_RCVR_CFG = 13, + LTSSM_RECOVERY_IDLE = 14, + LTSSM_L0 = 16, + LTSSM_RX_L0S_ENTRY = 17, + LTSSM_RX_L0S_IDLE = 18, + LTSSM_RX_L0S_FTS = 19, + LTSSM_TX_L0S_ENTRY = 20, + LTSSM_TX_L0S_IDLE = 21, + LTSSM_TX_L0S_FTS = 22, + LTSSM_L1_ENTRY = 23, + LTSSM_L1_IDLE = 24, + LTSSM_L2_IDLE = 25, + LTSSM_L2_TRANSMIT_WAKE = 26, + LTSSM_DISABLED = 32, + LTSSM_LOOPBACK_ENTRY_MASTER = 33, + LTSSM_LOOPBACK_ACTIVE_MASTER = 34, + LTSSM_LOOPBACK_EXIT_MASTER = 35, + LTSSM_LOOPBACK_ENTRY_SLAVE = 36, + LTSSM_LOOPBACK_ACTIVE_SLAVE = 37, + LTSSM_LOOPBACK_EXIT_SLAVE = 38, + LTSSM_HOT_RESET = 39, + LTSSM_RECOVERY_EQUALIZATION_PHASE0 = 40, + LTSSM_RECOVERY_EQUALIZATION_PHASE1 = 41, + LTSSM_RECOVERY_EQUALIZATION_PHASE2 = 42, + LTSSM_RECOVERY_EQUALIZATION_PHASE3 = 43, +}; + +struct advk_pcie { + struct platform_device *pdev; + void *base; + struct { + phys_addr_t match; + phys_addr_t remap; + phys_addr_t mask; + u32 actions; + } wins[8]; + u8 wins_count; + struct irq_domain *irq_domain; + struct irq_chip irq_chip; + raw_spinlock_t irq_lock; + struct irq_domain *msi_domain; + struct irq_domain *msi_inner_domain; + struct irq_chip msi_bottom_irq_chip; + struct irq_chip msi_irq_chip; + struct msi_domain_info msi_domain_info; + long unsigned int msi_used[1]; + struct mutex msi_used_lock; + u16 msi_msg; + int link_gen; + struct pci_bridge_emul bridge; + struct gpio_desc *reset_gpio; + struct phy *phy; +}; + +struct regulator_bulk_data { + const char *supply; + struct regulator *consumer; + int ret; +}; + +struct tegra_msi { + long unsigned int used[4]; + struct irq_domain *domain; + struct mutex map_lock; + spinlock_t mask_lock; + void *virt; + dma_addr_t phys; + int irq; +}; + +struct tegra_pcie_port_soc { + struct { + u8 turnoff_bit; + u8 ack_bit; + } pme; +}; + +struct tegra_pcie_soc { + unsigned int num_ports; + const struct tegra_pcie_port_soc *ports; + unsigned int msi_base_shift; + long unsigned int afi_pex2_ctrl; + u32 pads_pll_ctl; + u32 tx_ref_sel; + u32 pads_refclk_cfg0; + u32 pads_refclk_cfg1; + u32 update_fc_threshold; + bool has_pex_clkreq_en; + bool has_pex_bias_ctrl; + bool has_intr_prsnt_sense; + bool has_cml_clk; + bool has_gen2; + bool force_pca_enable; + bool program_uphy; + bool update_clamp_threshold; + bool program_deskew_time; + bool update_fc_timer; + bool has_cache_bars; + struct { + struct { + u32 rp_ectl_2_r1; + u32 rp_ectl_4_r1; + u32 rp_ectl_5_r1; + u32 rp_ectl_6_r1; + u32 rp_ectl_2_r2; + u32 rp_ectl_4_r2; + u32 rp_ectl_5_r2; + u32 rp_ectl_6_r2; + } regs; + bool enable; + } ectl; +}; + +struct tegra_pcie { + struct device *dev; + void *pads; + void *afi; + void *cfg; + int irq; + struct resource cs; + struct clk *pex_clk; + struct clk *afi_clk; + struct clk *pll_e; + struct clk *cml_clk; + struct reset_control *pex_rst; + struct reset_control *afi_rst; + struct reset_control *pcie_xrst; + bool legacy_phy; + struct phy *phy; + struct tegra_msi msi; + struct list_head ports; + u32 xbar_config; + struct regulator_bulk_data *supplies; + unsigned int num_supplies; + const struct tegra_pcie_soc *soc; + struct dentry *debugfs; +}; + +struct tegra_pcie_port { + struct tegra_pcie *pcie; + struct device_node *np; + struct list_head list; + struct resource regs; + void *base; + unsigned int index; + unsigned int lanes; + struct phy **phys; + struct gpio_desc *reset_gpio; +}; + +struct rcar_pcie { + struct device *dev; + void *base; +}; + +enum { + RCAR_PCI_ACCESS_READ = 0, + RCAR_PCI_ACCESS_WRITE = 1, +}; + +struct rcar_msi { + long unsigned int used[1]; + struct irq_domain *domain; + struct mutex map_lock; + spinlock_t mask_lock; + int irq1; + int irq2; +}; + +struct rcar_pcie_host { + struct rcar_pcie pcie; + struct phy *phy; + struct clk *bus_clk; + struct rcar_msi msi; + int (*phy_init_fn)(struct rcar_pcie_host *); +}; + +struct rcar_pcie_endpoint { + struct rcar_pcie pcie; + phys_addr_t *ob_mapped_addr; + struct pci_epc_mem_window *ob_window; + u8 max_functions; + unsigned int bar_to_atu[6]; + long unsigned int *ib_window_map; + u32 num_ib_windows; + u32 num_ob_windows; +}; + +struct thunder_pem_pci { + u32 ea_entry[3]; + void *pem_reg_base; +}; + +struct xilinx_pcie_port { + void *reg_base; + struct device *dev; + long unsigned int msi_map[2]; + struct mutex map_lock; + struct irq_domain *msi_domain; + struct irq_domain *leg_domain; + struct list_head resources; +}; + +struct nwl_msi { + struct irq_domain *msi_domain; + long unsigned int *bitmap; + struct irq_domain *dev_domain; + struct mutex lock; + int irq_msi0; + int irq_msi1; +}; + +struct nwl_pcie { + struct device *dev; + void *breg_base; + void *pcireg_base; + void *ecam_base; + phys_addr_t phys_breg_base; + phys_addr_t phys_pcie_reg_base; + phys_addr_t phys_ecam_base; + u32 breg_size; + u32 pcie_reg_size; + u32 ecam_size; + int irq_intx; + int irq_misc; + u32 ecam_value; + u8 last_busno; + struct nwl_msi msi; + struct irq_domain *legacy_irq_domain; + struct clk *clk; + raw_spinlock_t leg_mask_lock; +}; + +struct xilinx_cpm_pcie_port { + void *reg_base; + void *cpm_base; + struct device *dev; + struct irq_domain *intx_domain; + struct irq_domain *cpm_domain; + struct pci_config_window *cfg; + int intx_irq; + int irq; + raw_spinlock_t lock; +}; + +struct xgene_pcie_port { + struct device_node *node; + struct device *dev; + struct clk *clk; + void *csr_base; + void *cfg_base; + long unsigned int cfg_addr; + bool link_up; + u32 version; +}; + +struct xgene_msi; + +struct xgene_msi_group { + struct xgene_msi *msi; + int gic_irq; + u32 msi_grp; +}; + +struct xgene_msi { + struct device_node *node; + struct irq_domain *inner_domain; + struct irq_domain *msi_domain; + u64 msi_addr; + void *msi_regs; + long unsigned int *bitmap; + struct mutex bitmap_lock; + struct xgene_msi_group *msi_groups; + int num_cpus; +}; + +enum iproc_pcie_type { + IPROC_PCIE_PAXB_BCMA = 0, + IPROC_PCIE_PAXB = 1, + IPROC_PCIE_PAXB_V2 = 2, + IPROC_PCIE_PAXC = 3, + IPROC_PCIE_PAXC_V2 = 4, +}; + +struct iproc_pcie_ob { + resource_size_t axi_offset; + unsigned int nr_windows; +}; + +struct iproc_pcie_ib { + unsigned int nr_regions; +}; + +struct iproc_pcie_ob_map; + +struct iproc_pcie_ib_map; + +struct iproc_msi; + +struct iproc_pcie { + struct device *dev; + enum iproc_pcie_type type; + u16 *reg_offsets; + void *base; + phys_addr_t base_addr; + struct resource mem; + struct phy *phy; + int (*map_irq)(const struct pci_dev *, u8, u8); + bool ep_is_internal; + bool iproc_cfg_read; + bool rej_unconfig_pf; + bool has_apb_err_disable; + bool fix_paxc_cap; + bool need_ob_cfg; + struct iproc_pcie_ob ob; + const struct iproc_pcie_ob_map *ob_map; + bool need_ib_cfg; + struct iproc_pcie_ib ib; + const struct iproc_pcie_ib_map *ib_map; + bool need_msi_steer; + struct iproc_msi *msi; +}; + +struct iproc_msi_grp; + +struct iproc_msi { + struct iproc_pcie *pcie; + const u16 (*reg_offsets)[8]; + struct iproc_msi_grp *grps; + int nr_irqs; + int nr_cpus; + bool has_inten_reg; + long unsigned int *bitmap; + struct mutex bitmap_lock; + unsigned int nr_msi_vecs; + struct irq_domain *inner_domain; + struct irq_domain *msi_domain; + unsigned int nr_eq_region; + unsigned int nr_msi_region; + void *eq_cpu; + dma_addr_t eq_dma; + phys_addr_t msi_addr; +}; + +enum iproc_msi_reg { + IPROC_MSI_EQ_PAGE = 0, + IPROC_MSI_EQ_PAGE_UPPER = 1, + IPROC_MSI_PAGE = 2, + IPROC_MSI_PAGE_UPPER = 3, + IPROC_MSI_CTRL = 4, + IPROC_MSI_EQ_HEAD = 5, + IPROC_MSI_EQ_TAIL = 6, + IPROC_MSI_INTS_EN = 7, + IPROC_MSI_REG_SIZE = 8, +}; + +struct iproc_msi_grp { + struct iproc_msi *msi; + int gic_irq; + unsigned int eq; +}; + +enum altera_pcie_version { + ALTERA_PCIE_V1 = 0, + ALTERA_PCIE_V2 = 1, +}; + +struct altera_pcie_data; + +struct altera_pcie { + struct platform_device *pdev; + void *cra_base; + void *hip_base; + int irq; + u8 root_bus_nr; + struct irq_domain *irq_domain; + struct resource bus_range; + const struct altera_pcie_data *pcie_data; +}; + +struct altera_pcie_ops; + +struct altera_pcie_data { + const struct altera_pcie_ops *ops; + enum altera_pcie_version version; + u32 cap_offset; + u32 cfgrd0; + u32 cfgrd1; + u32 cfgwr0; + u32 cfgwr1; +}; + +struct altera_pcie_ops { + int (*tlp_read_pkt)(struct altera_pcie *, u32 *); + void (*tlp_write_pkt)(struct altera_pcie *, u32 *, u32, bool); + bool (*get_link_status)(struct altera_pcie *); + int (*rp_read_cfg)(struct altera_pcie *, int, int, u32 *); + int (*rp_write_cfg)(struct altera_pcie *, u8, int, int, u32); +}; + +struct tlp_rp_regpair_t { + u32 ctrl; + u32 reg0; + u32 reg1; +}; + +struct altera_msi { + long unsigned int used[1]; + struct mutex lock; + struct platform_device *pdev; + struct irq_domain *msi_domain; + struct irq_domain *inner_domain; + void *csr_base; + void *vector_base; + phys_addr_t vector_phy; + u32 num_of_vectors; + int irq; +}; + +struct rockchip_pcie { + void *reg_base; + void *apb_base; + bool legacy_phy; + struct phy *phys[4]; + struct reset_control *core_rst; + struct reset_control *mgmt_rst; + struct reset_control *mgmt_sticky_rst; + struct reset_control *pipe_rst; + struct reset_control *pm_rst; + struct reset_control *aclk_rst; + struct reset_control *pclk_rst; + struct clk *aclk_pcie; + struct clk *aclk_perf_pcie; + struct clk *hclk_pcie; + struct clk *clk_pcie_pm; + struct regulator *vpcie12v; + struct regulator *vpcie3v3; + struct regulator *vpcie1v8; + struct regulator *vpcie0v9; + struct gpio_desc *ep_gpio; + u32 lanes; + u8 lanes_map; + int link_gen; + struct device *dev; + struct irq_domain *irq_domain; + int offset; + void *msg_region; + phys_addr_t msg_bus_addr; + bool is_rc; + struct resource *mem_res; +}; + +struct rockchip_pcie_ep { + struct rockchip_pcie rockchip; + struct pci_epc *epc; + u32 max_regions; + long unsigned int ob_region_map; + phys_addr_t *ob_addr; + phys_addr_t irq_phys_addr; + void *irq_cpu_addr; + u64 irq_pci_addr; + u8 irq_pci_fn; + u8 irq_pending; +}; + +struct mtk_pcie_port; + +struct mtk_pcie_soc { + bool need_fix_class_id; + bool need_fix_device_id; + bool no_msi; + unsigned int device_id; + struct pci_ops *ops; + int (*startup)(struct mtk_pcie_port *); + int (*setup_irq)(struct mtk_pcie_port *, struct device_node *); +}; + +struct mtk_pcie; + +struct mtk_pcie_port { + void *base; + struct list_head list; + struct mtk_pcie *pcie; + struct reset_control *reset; + struct clk *sys_ck; + struct clk *ahb_ck; + struct clk *axi_ck; + struct clk *aux_ck; + struct clk *obff_ck; + struct clk *pipe_ck; + struct phy *phy; + u32 slot; + int irq; + struct irq_domain *irq_domain; + struct irq_domain *inner_domain; + struct irq_domain *msi_domain; + struct mutex lock; + long unsigned int msi_irq_in_use[1]; +}; + +struct mtk_pcie { + struct device *dev; + void *base; + struct regmap *cfg; + struct clk *free_ck; + struct list_head ports; + const struct mtk_pcie_soc *soc; +}; + +struct event_map { + u32 reg_mask; + u32 event_bit; +}; + +struct mc_msi { + struct mutex lock; + struct irq_domain *msi_domain; + struct irq_domain *dev_domain; + u32 num_vectors; + u64 vector_phy; + long unsigned int used[1]; +}; + +struct mc_port { + void *axi_base_addr; + struct device *dev; + struct irq_domain *intx_domain; + struct irq_domain *event_domain; + raw_spinlock_t lock; + struct mc_msi msi; +}; + +struct cause { + const char *sym; + const char *str; +}; + +struct acpi_hest_generic_data { + u8 section_type[16]; + u32 error_severity; + u16 revision; + u8 validation_bits; + u8 flags; + u32 error_data_length; + u8 fru_id[16]; + u8 fru_text[20]; +}; + +struct acpi_hest_generic_data_v300 { + u8 section_type[16]; + u32 error_severity; + u16 revision; + u8 validation_bits; + u8 flags; + u32 error_data_length; + u8 fru_id[16]; + u8 fru_text[20]; + u64 time_stamp; +}; + +struct hisi_pcie_error_data { + u64 val_bits; + u8 version; + u8 soc_id; + u8 socket_id; + u8 nimbus_id; + u8 sub_module_id; + u8 core_id; + u8 port_id; + u8 err_severity; + u16 err_type; + u8 reserv[2]; + u32 err_misc[33]; +}; + +struct hisi_pcie_error_private { + struct notifier_block nb; + struct device *dev; +}; + +enum hisi_pcie_submodule_id { + HISI_PCIE_SUB_MODULE_ID_AP = 0, + HISI_PCIE_SUB_MODULE_ID_TL = 1, + HISI_PCIE_SUB_MODULE_ID_MAC = 2, + HISI_PCIE_SUB_MODULE_ID_DL = 3, + HISI_PCIE_SUB_MODULE_ID_SDI = 4, +}; + +enum hisi_pcie_err_severity { + HISI_PCIE_ERR_SEV_RECOVERABLE = 0, + HISI_PCIE_ERR_SEV_FATAL = 1, + HISI_PCIE_ERR_SEV_CORRECTED = 2, + HISI_PCIE_ERR_SEV_NONE = 3, +}; + +enum dw_pcie_region_type { + DW_PCIE_REGION_UNKNOWN = 0, + DW_PCIE_REGION_INBOUND = 1, + DW_PCIE_REGION_OUTBOUND = 2, +}; + +struct pcie_port; + +struct dw_pcie_host_ops { + int (*host_init)(struct pcie_port *); + int (*msi_host_init)(struct pcie_port *); +}; + +struct pcie_port { + bool has_msi_ctrl: 1; + u64 cfg0_base; + void *va_cfg0_base; + u32 cfg0_size; + resource_size_t io_base; + phys_addr_t io_bus_addr; + u32 io_size; + int irq; + const struct dw_pcie_host_ops *ops; + int msi_irq; + struct irq_domain *irq_domain; + struct irq_domain *msi_domain; + u16 msi_msg; + dma_addr_t msi_data; + struct irq_chip *msi_irq_chip; + u32 num_vectors; + u32 irq_mask[8]; + struct pci_host_bridge *bridge; + raw_spinlock_t lock; + long unsigned int msi_irq_in_use[4]; +}; + +enum dw_pcie_as_type { + DW_PCIE_AS_UNKNOWN = 0, + DW_PCIE_AS_MEM = 1, + DW_PCIE_AS_IO = 2, +}; + +struct dw_pcie_ep; + +struct dw_pcie_ep_ops { + void (*ep_init)(struct dw_pcie_ep *); + int (*raise_irq)(struct dw_pcie_ep *, u8, enum pci_epc_irq_type, u16); + const struct pci_epc_features * (*get_features)(struct dw_pcie_ep *); + unsigned int (*func_conf_select)(struct dw_pcie_ep *, u8); +}; + +struct dw_pcie_ep { + struct pci_epc *epc; + struct list_head func_list; + const struct dw_pcie_ep_ops *ops; + phys_addr_t phys_base; + size_t addr_size; + size_t page_size; + u8 bar_to_atu[6]; + phys_addr_t *outbound_addr; + long unsigned int *ib_window_map; + long unsigned int *ob_window_map; + void *msi_mem; + phys_addr_t msi_mem_phys; + struct pci_epf_bar *epf_bar[6]; +}; + +struct dw_pcie; + +struct dw_pcie_ops { + u64 (*cpu_addr_fixup)(struct dw_pcie *, u64); + u32 (*read_dbi)(struct dw_pcie *, void *, u32, size_t); + void (*write_dbi)(struct dw_pcie *, void *, u32, size_t, u32); + void (*write_dbi2)(struct dw_pcie *, void *, u32, size_t, u32); + int (*link_up)(struct dw_pcie *); + int (*start_link)(struct dw_pcie *); + void (*stop_link)(struct dw_pcie *); +}; + +struct dw_pcie { + struct device *dev; + void *dbi_base; + void *dbi_base2; + void *atu_base; + size_t atu_size; + u32 num_ib_windows; + u32 num_ob_windows; + struct pcie_port pp; + struct dw_pcie_ep ep; + const struct dw_pcie_ops *ops; + unsigned int version; + int num_lanes; + int link_gen; + u8 n_fts[2]; + bool iatu_unroll_enabled: 1; + bool io_cfg_atu_shared: 1; +}; + +struct dw_pcie_ep_func { + struct list_head list; + u8 func_no; + u8 msi_cap; + u8 msix_cap; +}; + +enum dw_pcie_device_mode { + DW_PCIE_UNKNOWN_TYPE = 0, + DW_PCIE_EP_TYPE = 1, + DW_PCIE_LEG_EP_TYPE = 2, + DW_PCIE_RC_TYPE = 3, +}; + +struct dw_plat_pcie { + struct dw_pcie *pci; + struct regmap *regmap; + enum dw_pcie_device_mode mode; +}; + +struct dw_plat_pcie_of_data { + enum dw_pcie_device_mode mode; +}; + +struct pm_domain_data { + struct list_head list_node; + struct device *dev; +}; + +enum imx6_pcie_variants { + IMX6Q = 0, + IMX6SX = 1, + IMX6QP = 2, + IMX7D = 3, + IMX8MQ = 4, +}; + +struct imx6_pcie_drvdata { + enum imx6_pcie_variants variant; + u32 flags; + int dbi_length; +}; + +struct imx6_pcie { + struct dw_pcie *pci; + int reset_gpio; + bool gpio_active_high; + struct clk *pcie_bus; + struct clk *pcie_phy; + struct clk *pcie_inbound_axi; + struct clk *pcie; + struct clk *pcie_aux; + struct regmap *iomuxc_gpr; + u32 controller_id; + struct reset_control *pciephy_reset; + struct reset_control *apps_reset; + struct reset_control *turnoff_reset; + u32 tx_deemph_gen1; + u32 tx_deemph_gen2_3p5db; + u32 tx_deemph_gen2_6db; + u32 tx_swing_full; + u32 tx_swing_low; + struct regulator *vpcie; + struct regulator *vph; + void *phy_base; + struct device *pd_pcie; + struct device *pd_pcie_phy; + const struct imx6_pcie_drvdata *drvdata; +}; + +struct ks_pcie_of_data { + enum dw_pcie_device_mode mode; + const struct dw_pcie_host_ops *host_ops; + const struct dw_pcie_ep_ops *ep_ops; + unsigned int version; +}; + +struct keystone_pcie { + struct dw_pcie *pci; + u32 device_id; + int legacy_host_irqs[4]; + struct device_node *legacy_intc_np; + int msi_host_irq; + int num_lanes; + u32 num_viewport; + struct phy **phy; + struct device_link **link; + struct device_node *msi_intc_np; + struct irq_domain *legacy_irq_domain; + struct device_node *np; + void *va_app_base; + struct resource app; + bool is_am6; +}; + +struct ls_pcie_drvdata { + u32 lut_offset; + u32 ltssm_shift; + u32 lut_dbg; + const struct dw_pcie_host_ops *ops; + const struct dw_pcie_ops *dw_pcie_ops; +}; + +struct ls_pcie { + struct dw_pcie *pci; + void *lut; + struct regmap *scfg; + const struct ls_pcie_drvdata *drvdata; + int index; +}; + +struct ls_pcie_ep_drvdata { + u32 func_offset; + const struct dw_pcie_ep_ops *ops; + const struct dw_pcie_ops *dw_pcie_ops; +}; + +struct ls_pcie_ep { + struct dw_pcie *pci; + struct pci_epc_features *ls_epc; + const struct ls_pcie_ep_drvdata *drvdata; +}; + +struct qcom_pcie_resources_2_1_0 { + struct clk_bulk_data clks[5]; + struct reset_control *pci_reset; + struct reset_control *axi_reset; + struct reset_control *ahb_reset; + struct reset_control *por_reset; + struct reset_control *phy_reset; + struct reset_control *ext_reset; + struct regulator_bulk_data supplies[3]; +}; + +struct qcom_pcie_resources_1_0_0 { + struct clk *iface; + struct clk *aux; + struct clk *master_bus; + struct clk *slave_bus; + struct reset_control *core; + struct regulator *vdda; +}; + +struct qcom_pcie_resources_2_3_2 { + struct clk *aux_clk; + struct clk *master_clk; + struct clk *slave_clk; + struct clk *cfg_clk; + struct clk *pipe_clk; + struct regulator_bulk_data supplies[2]; +}; + +struct qcom_pcie_resources_2_4_0 { + struct clk_bulk_data clks[4]; + int num_clks; + struct reset_control *axi_m_reset; + struct reset_control *axi_s_reset; + struct reset_control *pipe_reset; + struct reset_control *axi_m_vmid_reset; + struct reset_control *axi_s_xpu_reset; + struct reset_control *parf_reset; + struct reset_control *phy_reset; + struct reset_control *axi_m_sticky_reset; + struct reset_control *pipe_sticky_reset; + struct reset_control *pwr_reset; + struct reset_control *ahb_reset; + struct reset_control *phy_ahb_reset; +}; + +struct qcom_pcie_resources_2_3_3 { + struct clk *iface; + struct clk *axi_m_clk; + struct clk *axi_s_clk; + struct clk *ahb_clk; + struct clk *aux_clk; + struct reset_control *rst[7]; +}; + +struct qcom_pcie_resources_2_7_0 { + struct clk_bulk_data clks[7]; + int num_clks; + struct regulator_bulk_data supplies[2]; + struct reset_control *pci_reset; + struct clk *pipe_clk; + struct clk *pipe_clk_src; + struct clk *phy_pipe_clk; + struct clk *ref_clk_src; +}; + +union qcom_pcie_resources { + struct qcom_pcie_resources_1_0_0 v1_0_0; + struct qcom_pcie_resources_2_1_0 v2_1_0; + struct qcom_pcie_resources_2_3_2 v2_3_2; + struct qcom_pcie_resources_2_3_3 v2_3_3; + struct qcom_pcie_resources_2_4_0 v2_4_0; + struct qcom_pcie_resources_2_7_0 v2_7_0; +}; + +struct qcom_pcie; + +struct qcom_pcie_ops { + int (*get_resources)(struct qcom_pcie *); + int (*init)(struct qcom_pcie *); + int (*post_init)(struct qcom_pcie *); + void (*deinit)(struct qcom_pcie *); + void (*post_deinit)(struct qcom_pcie *); + void (*ltssm_enable)(struct qcom_pcie *); + int (*config_sid)(struct qcom_pcie *); +}; + +struct qcom_pcie { + struct dw_pcie *pci; + void *parf; + void *elbi; + union qcom_pcie_resources res; + struct phy *phy; + struct gpio_desc *reset; + const struct qcom_pcie_ops *ops; + unsigned int pipe_clk_need_muxing: 1; +}; + +struct qcom_pcie_cfg { + const struct qcom_pcie_ops *ops; + unsigned int pipe_clk_need_muxing: 1; +}; + +struct armada8k_pcie { + struct dw_pcie *pci; + struct clk *clk; + struct clk *clk_reg; + struct phy *phy[4]; + unsigned int phy_count; +}; + +struct rockchip_pcie___2 { + struct dw_pcie pci; + void *apb_base; + struct phy *phy; + struct clk_bulk_data *clks; + unsigned int clk_cnt; + struct reset_control *rst; + struct gpio_desc *rst_gpio; + struct regulator *vpcie3v3; +}; + +struct keembay_pcie { + struct dw_pcie pci; + void *apb_base; + enum dw_pcie_device_mode mode; + struct clk *clk_master; + struct clk *clk_aux; + struct gpio_desc *reset; +}; + +struct keembay_pcie_of_data { + enum dw_pcie_device_mode mode; +}; + +enum pcie_kirin_phy_type { + PCIE_KIRIN_INTERNAL_PHY = 0, + PCIE_KIRIN_EXTERNAL_PHY = 1, +}; + +struct kirin_pcie { + enum pcie_kirin_phy_type type; + struct dw_pcie *pci; + struct regmap *apb; + struct phy *phy; + void *phy_priv; + int gpio_id_dwc_perst; + int num_slots; + int gpio_id_reset[3]; + const char *reset_names[3]; + int n_gpio_clkreq; + int gpio_id_clkreq[3]; + const char *clkreq_names[3]; +}; + +struct hi3660_pcie_phy { + struct device *dev; + void *base; + struct regmap *crgctrl; + struct regmap *sysctrl; + struct clk *apb_sys_clk; + struct clk *apb_phy_clk; + struct clk *phy_ref_clk; + struct clk *aclk; + struct clk *aux_clk; +}; + +struct histb_pcie { + struct dw_pcie *pci; + struct clk *aux_clk; + struct clk *pipe_clk; + struct clk *sys_clk; + struct clk *bus_clk; + struct phy *phy; + struct reset_control *soft_reset; + struct reset_control *sys_reset; + struct reset_control *bus_reset; + void *ctrl; + int reset_gpio; + struct regulator *vpcie; +}; + +struct visconti_pcie { + struct dw_pcie pci; + void *ulreg_base; + void *smu_base; + void *mpu_base; + struct clk *refclk; + struct clk *coreclk; + struct clk *auxclk; +}; + +struct al_pcie_acpi { + void *dbi_base; +}; + +struct al_pcie_reg_offsets { + unsigned int ob_ctrl; +}; + +struct al_pcie_target_bus_cfg { + u8 reg_val; + u8 reg_mask; + u8 ecam_mask; +}; + +struct al_pcie { + struct dw_pcie *pci; + void *controller_base; + struct device *dev; + resource_size_t ecam_size; + unsigned int controller_rev_id; + struct al_pcie_reg_offsets reg_offsets; + struct al_pcie_target_bus_cfg target_bus_cfg; +}; + +struct tegra194_pcie_ecam { + void *config_base; + void *iatu_base; + void *dbi_base; +}; + +struct rio_device_id { + __u16 did; + __u16 vid; + __u16 asm_did; + __u16 asm_vid; +}; + +typedef s32 dma_cookie_t; + +enum dma_status { + DMA_COMPLETE = 0, + DMA_IN_PROGRESS = 1, + DMA_PAUSED = 2, + DMA_ERROR = 3, + DMA_OUT_OF_ORDER = 4, +}; + +enum dma_transaction_type { + DMA_MEMCPY = 0, + DMA_XOR = 1, + DMA_PQ = 2, + DMA_XOR_VAL = 3, + DMA_PQ_VAL = 4, + DMA_MEMSET = 5, + DMA_MEMSET_SG = 6, + DMA_INTERRUPT = 7, + DMA_PRIVATE = 8, + DMA_ASYNC_TX = 9, + DMA_SLAVE = 10, + DMA_CYCLIC = 11, + DMA_INTERLEAVE = 12, + DMA_COMPLETION_NO_ORDER = 13, + DMA_REPEAT = 14, + DMA_LOAD_EOT = 15, + DMA_TX_TYPE_END = 16, +}; + +enum dma_transfer_direction { + DMA_MEM_TO_MEM = 0, + DMA_MEM_TO_DEV = 1, + DMA_DEV_TO_MEM = 2, + DMA_DEV_TO_DEV = 3, + DMA_TRANS_NONE = 4, +}; + +struct data_chunk { + size_t size; + size_t icg; + size_t dst_icg; + size_t src_icg; +}; + +struct dma_interleaved_template { + dma_addr_t src_start; + dma_addr_t dst_start; + enum dma_transfer_direction dir; + bool src_inc; + bool dst_inc; + bool src_sgl; + bool dst_sgl; + size_t numf; + size_t frame_size; + struct data_chunk sgl[0]; +}; + +enum dma_ctrl_flags { + DMA_PREP_INTERRUPT = 1, + DMA_CTRL_ACK = 2, + DMA_PREP_PQ_DISABLE_P = 4, + DMA_PREP_PQ_DISABLE_Q = 8, + DMA_PREP_CONTINUE = 16, + DMA_PREP_FENCE = 32, + DMA_CTRL_REUSE = 64, + DMA_PREP_CMD = 128, + DMA_PREP_REPEAT = 256, + DMA_PREP_LOAD_EOT = 512, +}; + +enum sum_check_bits { + SUM_CHECK_P = 0, + SUM_CHECK_Q = 1, +}; + +enum sum_check_flags { + SUM_CHECK_P_RESULT = 1, + SUM_CHECK_Q_RESULT = 2, +}; + +typedef struct { + long unsigned int bits[1]; +} dma_cap_mask_t; + +enum dma_desc_metadata_mode { + DESC_METADATA_NONE = 0, + DESC_METADATA_CLIENT = 1, + DESC_METADATA_ENGINE = 2, +}; + +struct dma_chan_percpu { + long unsigned int memcpy_count; + long unsigned int bytes_transferred; +}; + +struct dma_router { + struct device *dev; + void (*route_free)(struct device *, void *); +}; + +struct dma_device; + +struct dma_chan_dev; + +struct dma_chan { + struct dma_device *device; + struct device *slave; + dma_cookie_t cookie; + dma_cookie_t completed_cookie; + int chan_id; + struct dma_chan_dev *dev; + const char *name; + char *dbg_client_name; + struct list_head device_node; + struct dma_chan_percpu *local; + int client_count; + int table_count; + struct dma_router *router; + void *route_data; + void *private; +}; + +typedef bool (*dma_filter_fn)(struct dma_chan *, void *); + +struct dma_slave_map; + +struct dma_filter { + dma_filter_fn fn; + int mapcnt; + const struct dma_slave_map *map; +}; + +enum dmaengine_alignment { + DMAENGINE_ALIGN_1_BYTE = 0, + DMAENGINE_ALIGN_2_BYTES = 1, + DMAENGINE_ALIGN_4_BYTES = 2, + DMAENGINE_ALIGN_8_BYTES = 3, + DMAENGINE_ALIGN_16_BYTES = 4, + DMAENGINE_ALIGN_32_BYTES = 5, + DMAENGINE_ALIGN_64_BYTES = 6, + DMAENGINE_ALIGN_128_BYTES = 7, + DMAENGINE_ALIGN_256_BYTES = 8, +}; + +enum dma_residue_granularity { + DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0, + DMA_RESIDUE_GRANULARITY_SEGMENT = 1, + DMA_RESIDUE_GRANULARITY_BURST = 2, +}; + +struct dma_async_tx_descriptor; + +struct dma_slave_caps; + +struct dma_slave_config; + +struct dma_tx_state; + +struct dma_device { + struct kref ref; + unsigned int chancnt; + unsigned int privatecnt; + struct list_head channels; + struct list_head global_node; + struct dma_filter filter; + dma_cap_mask_t cap_mask; + enum dma_desc_metadata_mode desc_metadata_modes; + short unsigned int max_xor; + short unsigned int max_pq; + enum dmaengine_alignment copy_align; + enum dmaengine_alignment xor_align; + enum dmaengine_alignment pq_align; + enum dmaengine_alignment fill_align; + int dev_id; + struct device *dev; + struct module *owner; + struct ida chan_ida; + struct mutex chan_mutex; + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool descriptor_reuse; + enum dma_residue_granularity residue_granularity; + int (*device_alloc_chan_resources)(struct dma_chan *); + int (*device_router_config)(struct dma_chan *); + void (*device_free_chan_resources)(struct dma_chan *); + struct dma_async_tx_descriptor * (*device_prep_dma_memcpy)(struct dma_chan *, dma_addr_t, dma_addr_t, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_xor)(struct dma_chan *, dma_addr_t, dma_addr_t *, unsigned int, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_xor_val)(struct dma_chan *, dma_addr_t *, unsigned int, size_t, enum sum_check_flags *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_pq)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_pq_val)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, enum sum_check_flags *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_memset)(struct dma_chan *, dma_addr_t, int, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_memset_sg)(struct dma_chan *, struct scatterlist *, unsigned int, int, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_interrupt)(struct dma_chan *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_slave_sg)(struct dma_chan *, struct scatterlist *, unsigned int, enum dma_transfer_direction, long unsigned int, void *); + struct dma_async_tx_descriptor * (*device_prep_dma_cyclic)(struct dma_chan *, dma_addr_t, size_t, size_t, enum dma_transfer_direction, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_interleaved_dma)(struct dma_chan *, struct dma_interleaved_template *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_imm_data)(struct dma_chan *, dma_addr_t, u64, long unsigned int); + void (*device_caps)(struct dma_chan *, struct dma_slave_caps *); + int (*device_config)(struct dma_chan *, struct dma_slave_config *); + int (*device_pause)(struct dma_chan *); + int (*device_resume)(struct dma_chan *); + int (*device_terminate_all)(struct dma_chan *); + void (*device_synchronize)(struct dma_chan *); + enum dma_status (*device_tx_status)(struct dma_chan *, dma_cookie_t, struct dma_tx_state *); + void (*device_issue_pending)(struct dma_chan *); + void (*device_release)(struct dma_device *); + void (*dbg_summary_show)(struct seq_file *, struct dma_device *); + struct dentry *dbg_dev_root; +}; + +struct dma_chan_dev { + struct dma_chan *chan; + struct device device; + int dev_id; + bool chan_dma_dev; +}; + +enum dma_slave_buswidth { + DMA_SLAVE_BUSWIDTH_UNDEFINED = 0, + DMA_SLAVE_BUSWIDTH_1_BYTE = 1, + DMA_SLAVE_BUSWIDTH_2_BYTES = 2, + DMA_SLAVE_BUSWIDTH_3_BYTES = 3, + DMA_SLAVE_BUSWIDTH_4_BYTES = 4, + DMA_SLAVE_BUSWIDTH_8_BYTES = 8, + DMA_SLAVE_BUSWIDTH_16_BYTES = 16, + DMA_SLAVE_BUSWIDTH_32_BYTES = 32, + DMA_SLAVE_BUSWIDTH_64_BYTES = 64, + DMA_SLAVE_BUSWIDTH_128_BYTES = 128, +}; + +struct dma_slave_config { + enum dma_transfer_direction direction; + phys_addr_t src_addr; + phys_addr_t dst_addr; + enum dma_slave_buswidth src_addr_width; + enum dma_slave_buswidth dst_addr_width; + u32 src_maxburst; + u32 dst_maxburst; + u32 src_port_window_size; + u32 dst_port_window_size; + bool device_fc; + unsigned int slave_id; + void *peripheral_config; + size_t peripheral_size; +}; + +struct dma_slave_caps { + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool cmd_pause; + bool cmd_resume; + bool cmd_terminate; + enum dma_residue_granularity residue_granularity; + bool descriptor_reuse; +}; + +typedef void (*dma_async_tx_callback)(void *); + +enum dmaengine_tx_result { + DMA_TRANS_NOERROR = 0, + DMA_TRANS_READ_FAILED = 1, + DMA_TRANS_WRITE_FAILED = 2, + DMA_TRANS_ABORTED = 3, +}; + +struct dmaengine_result { + enum dmaengine_tx_result result; + u32 residue; +}; + +typedef void (*dma_async_tx_callback_result)(void *, const struct dmaengine_result *); + +struct dmaengine_unmap_data { + u16 map_cnt; + u8 to_cnt; + u8 from_cnt; + u8 bidi_cnt; + struct device *dev; + struct kref kref; + size_t len; + dma_addr_t addr[0]; +}; + +struct dma_descriptor_metadata_ops { + int (*attach)(struct dma_async_tx_descriptor *, void *, size_t); + void * (*get_ptr)(struct dma_async_tx_descriptor *, size_t *, size_t *); + int (*set_len)(struct dma_async_tx_descriptor *, size_t); +}; + +struct dma_async_tx_descriptor { + dma_cookie_t cookie; + enum dma_ctrl_flags flags; + dma_addr_t phys; + struct dma_chan *chan; + dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *); + int (*desc_free)(struct dma_async_tx_descriptor *); + dma_async_tx_callback callback; + dma_async_tx_callback_result callback_result; + void *callback_param; + struct dmaengine_unmap_data *unmap; + enum dma_desc_metadata_mode desc_metadata_mode; + struct dma_descriptor_metadata_ops *metadata_ops; + struct dma_async_tx_descriptor *next; + struct dma_async_tx_descriptor *parent; + spinlock_t lock; +}; + +struct dma_tx_state { + dma_cookie_t last; + dma_cookie_t used; + u32 residue; + u32 in_flight_bytes; +}; + +struct dma_slave_map { + const char *devname; + const char *slave; + void *param; +}; + +struct rio_switch_ops; + +struct rio_dev; + +struct rio_switch { + struct list_head node; + u8 *route_table; + u32 port_ok; + struct rio_switch_ops *ops; + spinlock_t lock; + struct rio_dev *nextdev[0]; +}; + +struct rio_mport; + +struct rio_switch_ops { + struct module *owner; + int (*add_entry)(struct rio_mport *, u16, u8, u16, u16, u8); + int (*get_entry)(struct rio_mport *, u16, u8, u16, u16, u8 *); + int (*clr_table)(struct rio_mport *, u16, u8, u16); + int (*set_domain)(struct rio_mport *, u16, u8, u8); + int (*get_domain)(struct rio_mport *, u16, u8, u8 *); + int (*em_init)(struct rio_dev *); + int (*em_handle)(struct rio_dev *, u8); +}; + +struct rio_net; + +struct rio_driver; + +union rio_pw_msg; + +struct rio_dev { + struct list_head global_list; + struct list_head net_list; + struct rio_net *net; + bool do_enum; + u16 did; + u16 vid; + u32 device_rev; + u16 asm_did; + u16 asm_vid; + u16 asm_rev; + u16 efptr; + u32 pef; + u32 swpinfo; + u32 src_ops; + u32 dst_ops; + u32 comp_tag; + u32 phys_efptr; + u32 phys_rmap; + u32 em_efptr; + u64 dma_mask; + struct rio_driver *driver; + struct device dev; + struct resource riores[16]; + int (*pwcback)(struct rio_dev *, union rio_pw_msg *, int); + u16 destid; + u8 hopcount; + struct rio_dev *prev; + atomic_t state; + struct rio_switch rswitch[0]; +}; + +struct rio_msg { + struct resource *res; + void (*mcback)(struct rio_mport *, void *, int, int); +}; + +struct rio_ops; + +struct rio_scan; + +struct rio_mport { + struct list_head dbells; + struct list_head pwrites; + struct list_head node; + struct list_head nnode; + struct rio_net *net; + struct mutex lock; + struct resource iores; + struct resource riores[16]; + struct rio_msg inb_msg[4]; + struct rio_msg outb_msg[4]; + int host_deviceid; + struct rio_ops *ops; + unsigned char id; + unsigned char index; + unsigned int sys_size; + u32 phys_efptr; + u32 phys_rmap; + unsigned char name[40]; + struct device dev; + void *priv; + struct dma_device dma; + struct rio_scan *nscan; + atomic_t state; + unsigned int pwe_refcnt; +}; + +enum rio_device_state { + RIO_DEVICE_INITIALIZING = 0, + RIO_DEVICE_RUNNING = 1, + RIO_DEVICE_GONE = 2, + RIO_DEVICE_SHUTDOWN = 3, +}; + +struct rio_net { + struct list_head node; + struct list_head devices; + struct list_head switches; + struct list_head mports; + struct rio_mport *hport; + unsigned char id; + struct device dev; + void *enum_data; + void (*release)(struct rio_net *); +}; + +struct rio_driver { + struct list_head node; + char *name; + const struct rio_device_id *id_table; + int (*probe)(struct rio_dev *, const struct rio_device_id *); + void (*remove)(struct rio_dev *); + void (*shutdown)(struct rio_dev *); + int (*suspend)(struct rio_dev *, u32); + int (*resume)(struct rio_dev *); + int (*enable_wake)(struct rio_dev *, u32, int); + struct device_driver driver; +}; + +union rio_pw_msg { + struct { + u32 comptag; + u32 errdetect; + u32 is_port; + u32 ltlerrdet; + u32 padding[12]; + } em; + u32 raw[16]; +}; + +struct rio_dbell { + struct list_head node; + struct resource *res; + void (*dinb)(struct rio_mport *, void *, u16, u16, u16); + void *dev_id; +}; + +struct rio_mport_attr; + +struct rio_ops { + int (*lcread)(struct rio_mport *, int, u32, int, u32 *); + int (*lcwrite)(struct rio_mport *, int, u32, int, u32); + int (*cread)(struct rio_mport *, int, u16, u8, u32, int, u32 *); + int (*cwrite)(struct rio_mport *, int, u16, u8, u32, int, u32); + int (*dsend)(struct rio_mport *, int, u16, u16); + int (*pwenable)(struct rio_mport *, int); + int (*open_outb_mbox)(struct rio_mport *, void *, int, int); + void (*close_outb_mbox)(struct rio_mport *, int); + int (*open_inb_mbox)(struct rio_mport *, void *, int, int); + void (*close_inb_mbox)(struct rio_mport *, int); + int (*add_outb_message)(struct rio_mport *, struct rio_dev *, int, void *, size_t); + int (*add_inb_buffer)(struct rio_mport *, int, void *); + void * (*get_inb_message)(struct rio_mport *, int); + int (*map_inb)(struct rio_mport *, dma_addr_t, u64, u64, u32); + void (*unmap_inb)(struct rio_mport *, dma_addr_t); + int (*query_mport)(struct rio_mport *, struct rio_mport_attr *); + int (*map_outb)(struct rio_mport *, u16, u64, u32, u32, dma_addr_t *); + void (*unmap_outb)(struct rio_mport *, u16, u64); +}; + +struct rio_scan { + struct module *owner; + int (*enumerate)(struct rio_mport *, u32); + int (*discover)(struct rio_mport *, u32); +}; + +struct rio_mport_attr { + int flags; + int link_speed; + int link_width; + int dma_max_sge; + int dma_max_size; + int dma_align; +}; + +enum rio_write_type { + RDW_DEFAULT = 0, + RDW_ALL_NWRITE = 1, + RDW_ALL_NWRITE_R = 2, + RDW_LAST_NWRITE_R = 3, +}; + +struct rio_dma_ext { + u16 destid; + u64 rio_addr; + u8 rio_addr_u; + enum rio_write_type wr_type; +}; + +struct rio_dma_data { + struct scatterlist *sg; + unsigned int sg_len; + u64 rio_addr; + u8 rio_addr_u; + enum rio_write_type wr_type; +}; + +struct rio_scan_node { + int mport_id; + struct list_head node; + struct rio_scan *ops; +}; + +struct rio_pwrite { + struct list_head node; + int (*pwcback)(struct rio_mport *, void *, union rio_pw_msg *, int); + void *context; +}; + +struct rio_disc_work { + struct work_struct work; + struct rio_mport *mport; +}; + +enum hdmi_infoframe_type { + HDMI_INFOFRAME_TYPE_VENDOR = 129, + HDMI_INFOFRAME_TYPE_AVI = 130, + HDMI_INFOFRAME_TYPE_SPD = 131, + HDMI_INFOFRAME_TYPE_AUDIO = 132, + HDMI_INFOFRAME_TYPE_DRM = 135, +}; + +struct hdmi_any_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; +}; + +enum hdmi_colorspace { + HDMI_COLORSPACE_RGB = 0, + HDMI_COLORSPACE_YUV422 = 1, + HDMI_COLORSPACE_YUV444 = 2, + HDMI_COLORSPACE_YUV420 = 3, + HDMI_COLORSPACE_RESERVED4 = 4, + HDMI_COLORSPACE_RESERVED5 = 5, + HDMI_COLORSPACE_RESERVED6 = 6, + HDMI_COLORSPACE_IDO_DEFINED = 7, +}; + +enum hdmi_scan_mode { + HDMI_SCAN_MODE_NONE = 0, + HDMI_SCAN_MODE_OVERSCAN = 1, + HDMI_SCAN_MODE_UNDERSCAN = 2, + HDMI_SCAN_MODE_RESERVED = 3, +}; + +enum hdmi_colorimetry { + HDMI_COLORIMETRY_NONE = 0, + HDMI_COLORIMETRY_ITU_601 = 1, + HDMI_COLORIMETRY_ITU_709 = 2, + HDMI_COLORIMETRY_EXTENDED = 3, +}; + +enum hdmi_picture_aspect { + HDMI_PICTURE_ASPECT_NONE = 0, + HDMI_PICTURE_ASPECT_4_3 = 1, + HDMI_PICTURE_ASPECT_16_9 = 2, + HDMI_PICTURE_ASPECT_64_27 = 3, + HDMI_PICTURE_ASPECT_256_135 = 4, + HDMI_PICTURE_ASPECT_RESERVED = 5, +}; + +enum hdmi_active_aspect { + HDMI_ACTIVE_ASPECT_16_9_TOP = 2, + HDMI_ACTIVE_ASPECT_14_9_TOP = 3, + HDMI_ACTIVE_ASPECT_16_9_CENTER = 4, + HDMI_ACTIVE_ASPECT_PICTURE = 8, + HDMI_ACTIVE_ASPECT_4_3 = 9, + HDMI_ACTIVE_ASPECT_16_9 = 10, + HDMI_ACTIVE_ASPECT_14_9 = 11, + HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13, + HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14, + HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15, +}; + +enum hdmi_extended_colorimetry { + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601 = 0, + HDMI_EXTENDED_COLORIMETRY_XV_YCC_709 = 1, + HDMI_EXTENDED_COLORIMETRY_S_YCC_601 = 2, + HDMI_EXTENDED_COLORIMETRY_OPYCC_601 = 3, + HDMI_EXTENDED_COLORIMETRY_OPRGB = 4, + HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM = 5, + HDMI_EXTENDED_COLORIMETRY_BT2020 = 6, + HDMI_EXTENDED_COLORIMETRY_RESERVED = 7, +}; + +enum hdmi_quantization_range { + HDMI_QUANTIZATION_RANGE_DEFAULT = 0, + HDMI_QUANTIZATION_RANGE_LIMITED = 1, + HDMI_QUANTIZATION_RANGE_FULL = 2, + HDMI_QUANTIZATION_RANGE_RESERVED = 3, +}; + +enum hdmi_nups { + HDMI_NUPS_UNKNOWN = 0, + HDMI_NUPS_HORIZONTAL = 1, + HDMI_NUPS_VERTICAL = 2, + HDMI_NUPS_BOTH = 3, +}; + +enum hdmi_ycc_quantization_range { + HDMI_YCC_QUANTIZATION_RANGE_LIMITED = 0, + HDMI_YCC_QUANTIZATION_RANGE_FULL = 1, +}; + +enum hdmi_content_type { + HDMI_CONTENT_TYPE_GRAPHICS = 0, + HDMI_CONTENT_TYPE_PHOTO = 1, + HDMI_CONTENT_TYPE_CINEMA = 2, + HDMI_CONTENT_TYPE_GAME = 3, +}; + +enum hdmi_metadata_type { + HDMI_STATIC_METADATA_TYPE1 = 0, +}; + +enum hdmi_eotf { + HDMI_EOTF_TRADITIONAL_GAMMA_SDR = 0, + HDMI_EOTF_TRADITIONAL_GAMMA_HDR = 1, + HDMI_EOTF_SMPTE_ST2084 = 2, + HDMI_EOTF_BT_2100_HLG = 3, +}; + +struct hdmi_avi_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + enum hdmi_colorspace colorspace; + enum hdmi_scan_mode scan_mode; + enum hdmi_colorimetry colorimetry; + enum hdmi_picture_aspect picture_aspect; + enum hdmi_active_aspect active_aspect; + bool itc; + enum hdmi_extended_colorimetry extended_colorimetry; + enum hdmi_quantization_range quantization_range; + enum hdmi_nups nups; + unsigned char video_code; + enum hdmi_ycc_quantization_range ycc_quantization_range; + enum hdmi_content_type content_type; + unsigned char pixel_repeat; + short unsigned int top_bar; + short unsigned int bottom_bar; + short unsigned int left_bar; + short unsigned int right_bar; +}; + +struct hdmi_drm_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + enum hdmi_eotf eotf; + enum hdmi_metadata_type metadata_type; + struct { + u16 x; + u16 y; + } display_primaries[3]; + struct { + u16 x; + u16 y; + } white_point; + u16 max_display_mastering_luminance; + u16 min_display_mastering_luminance; + u16 max_cll; + u16 max_fall; +}; + +enum hdmi_spd_sdi { + HDMI_SPD_SDI_UNKNOWN = 0, + HDMI_SPD_SDI_DSTB = 1, + HDMI_SPD_SDI_DVDP = 2, + HDMI_SPD_SDI_DVHS = 3, + HDMI_SPD_SDI_HDDVR = 4, + HDMI_SPD_SDI_DVC = 5, + HDMI_SPD_SDI_DSC = 6, + HDMI_SPD_SDI_VCD = 7, + HDMI_SPD_SDI_GAME = 8, + HDMI_SPD_SDI_PC = 9, + HDMI_SPD_SDI_BD = 10, + HDMI_SPD_SDI_SACD = 11, + HDMI_SPD_SDI_HDDVD = 12, + HDMI_SPD_SDI_PMP = 13, +}; + +struct hdmi_spd_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + char vendor[8]; + char product[16]; + enum hdmi_spd_sdi sdi; +}; + +enum hdmi_audio_coding_type { + HDMI_AUDIO_CODING_TYPE_STREAM = 0, + HDMI_AUDIO_CODING_TYPE_PCM = 1, + HDMI_AUDIO_CODING_TYPE_AC3 = 2, + HDMI_AUDIO_CODING_TYPE_MPEG1 = 3, + HDMI_AUDIO_CODING_TYPE_MP3 = 4, + HDMI_AUDIO_CODING_TYPE_MPEG2 = 5, + HDMI_AUDIO_CODING_TYPE_AAC_LC = 6, + HDMI_AUDIO_CODING_TYPE_DTS = 7, + HDMI_AUDIO_CODING_TYPE_ATRAC = 8, + HDMI_AUDIO_CODING_TYPE_DSD = 9, + HDMI_AUDIO_CODING_TYPE_EAC3 = 10, + HDMI_AUDIO_CODING_TYPE_DTS_HD = 11, + HDMI_AUDIO_CODING_TYPE_MLP = 12, + HDMI_AUDIO_CODING_TYPE_DST = 13, + HDMI_AUDIO_CODING_TYPE_WMA_PRO = 14, + HDMI_AUDIO_CODING_TYPE_CXT = 15, +}; + +enum hdmi_audio_sample_size { + HDMI_AUDIO_SAMPLE_SIZE_STREAM = 0, + HDMI_AUDIO_SAMPLE_SIZE_16 = 1, + HDMI_AUDIO_SAMPLE_SIZE_20 = 2, + HDMI_AUDIO_SAMPLE_SIZE_24 = 3, +}; + +enum hdmi_audio_sample_frequency { + HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM = 0, + HDMI_AUDIO_SAMPLE_FREQUENCY_32000 = 1, + HDMI_AUDIO_SAMPLE_FREQUENCY_44100 = 2, + HDMI_AUDIO_SAMPLE_FREQUENCY_48000 = 3, + HDMI_AUDIO_SAMPLE_FREQUENCY_88200 = 4, + HDMI_AUDIO_SAMPLE_FREQUENCY_96000 = 5, + HDMI_AUDIO_SAMPLE_FREQUENCY_176400 = 6, + HDMI_AUDIO_SAMPLE_FREQUENCY_192000 = 7, +}; + +enum hdmi_audio_coding_type_ext { + HDMI_AUDIO_CODING_TYPE_EXT_CT = 0, + HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC = 1, + HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2 = 2, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND = 3, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC = 4, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_V2 = 5, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC = 6, + HDMI_AUDIO_CODING_TYPE_EXT_DRA = 7, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_SURROUND = 8, + HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC_SURROUND = 10, +}; + +struct hdmi_audio_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + unsigned char channels; + enum hdmi_audio_coding_type coding_type; + enum hdmi_audio_sample_size sample_size; + enum hdmi_audio_sample_frequency sample_frequency; + enum hdmi_audio_coding_type_ext coding_type_ext; + unsigned char channel_allocation; + unsigned char level_shift_value; + bool downmix_inhibit; +}; + +enum hdmi_3d_structure { + HDMI_3D_STRUCTURE_INVALID = 4294967295, + HDMI_3D_STRUCTURE_FRAME_PACKING = 0, + HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE = 1, + HDMI_3D_STRUCTURE_LINE_ALTERNATIVE = 2, + HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL = 3, + HDMI_3D_STRUCTURE_L_DEPTH = 4, + HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH = 5, + HDMI_3D_STRUCTURE_TOP_AND_BOTTOM = 6, + HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8, +}; + +struct hdmi_vendor_infoframe { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + unsigned int oui; + u8 vic; + enum hdmi_3d_structure s3d_struct; + unsigned int s3d_ext_data; +}; + +union hdmi_vendor_any_infoframe { + struct { + enum hdmi_infoframe_type type; + unsigned char version; + unsigned char length; + unsigned int oui; + } any; + struct hdmi_vendor_infoframe hdmi; +}; + +union hdmi_infoframe { + struct hdmi_any_infoframe any; + struct hdmi_avi_infoframe avi; + struct hdmi_spd_infoframe spd; + union hdmi_vendor_any_infoframe vendor; + struct hdmi_audio_infoframe audio; + struct hdmi_drm_infoframe drm; +}; + +enum con_scroll { + SM_UP = 0, + SM_DOWN = 1, +}; + +enum vc_intensity { + VCI_HALF_BRIGHT = 0, + VCI_NORMAL = 1, + VCI_BOLD = 2, + VCI_MASK = 3, +}; + +struct vc_data; + +struct console_font; + +struct consw { + struct module *owner; + const char * (*con_startup)(); + void (*con_init)(struct vc_data *, int); + void (*con_deinit)(struct vc_data *); + void (*con_clear)(struct vc_data *, int, int, int, int); + void (*con_putc)(struct vc_data *, int, int, int); + void (*con_putcs)(struct vc_data *, const short unsigned int *, int, int, int); + void (*con_cursor)(struct vc_data *, int); + bool (*con_scroll)(struct vc_data *, unsigned int, unsigned int, enum con_scroll, unsigned int); + int (*con_switch)(struct vc_data *); + int (*con_blank)(struct vc_data *, int, int); + int (*con_font_set)(struct vc_data *, struct console_font *, unsigned int); + int (*con_font_get)(struct vc_data *, struct console_font *); + int (*con_font_default)(struct vc_data *, struct console_font *, char *); + int (*con_resize)(struct vc_data *, unsigned int, unsigned int, unsigned int); + void (*con_set_palette)(struct vc_data *, const unsigned char *); + void (*con_scrolldelta)(struct vc_data *, int); + int (*con_set_origin)(struct vc_data *); + void (*con_save_screen)(struct vc_data *); + u8 (*con_build_attr)(struct vc_data *, u8, enum vc_intensity, bool, bool, bool, bool); + void (*con_invert_region)(struct vc_data *, u16 *, int); + u16 * (*con_screen_pos)(const struct vc_data *, int); + long unsigned int (*con_getxy)(struct vc_data *, long unsigned int, int *, int *); + void (*con_flush_scrollback)(struct vc_data *); + int (*con_debug_enter)(struct vc_data *); + int (*con_debug_leave)(struct vc_data *); +}; + +struct vc_state { + unsigned int x; + unsigned int y; + unsigned char color; + unsigned char Gx_charset[2]; + unsigned int charset: 1; + enum vc_intensity intensity; + bool italic; + bool underline; + bool blink; + bool reverse; +}; + +struct console_font { + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char *data; +}; + +struct vt_mode { + char mode; + char waitv; + short int relsig; + short int acqsig; + short int frsig; +}; + +struct uni_pagedir; + +struct uni_screen; + +struct vc_data { + struct tty_port port; + struct vc_state state; + struct vc_state saved_state; + short unsigned int vc_num; + unsigned int vc_cols; + unsigned int vc_rows; + unsigned int vc_size_row; + unsigned int vc_scan_lines; + unsigned int vc_cell_height; + long unsigned int vc_origin; + long unsigned int vc_scr_end; + long unsigned int vc_visible_origin; + unsigned int vc_top; + unsigned int vc_bottom; + const struct consw *vc_sw; + short unsigned int *vc_screenbuf; + unsigned int vc_screenbuf_size; + unsigned char vc_mode; + unsigned char vc_attr; + unsigned char vc_def_color; + unsigned char vc_ulcolor; + unsigned char vc_itcolor; + unsigned char vc_halfcolor; + unsigned int vc_cursor_type; + short unsigned int vc_complement_mask; + short unsigned int vc_s_complement_mask; + long unsigned int vc_pos; + short unsigned int vc_hi_font_mask; + struct console_font vc_font; + short unsigned int vc_video_erase_char; + unsigned int vc_state; + unsigned int vc_npar; + unsigned int vc_par[16]; + struct vt_mode vt_mode; + struct pid *vt_pid; + int vt_newvt; + wait_queue_head_t paste_wait; + unsigned int vc_disp_ctrl: 1; + unsigned int vc_toggle_meta: 1; + unsigned int vc_decscnm: 1; + unsigned int vc_decom: 1; + unsigned int vc_decawm: 1; + unsigned int vc_deccm: 1; + unsigned int vc_decim: 1; + unsigned int vc_priv: 3; + unsigned int vc_need_wrap: 1; + unsigned int vc_can_do_color: 1; + unsigned int vc_report_mouse: 2; + unsigned char vc_utf: 1; + unsigned char vc_utf_count; + int vc_utf_char; + long unsigned int vc_tab_stop[4]; + unsigned char vc_palette[48]; + short unsigned int *vc_translate; + unsigned int vc_resize_user; + unsigned int vc_bell_pitch; + unsigned int vc_bell_duration; + short unsigned int vc_cur_blink_ms; + struct vc_data **vc_display_fg; + struct uni_pagedir *vc_uni_pagedir; + struct uni_pagedir **vc_uni_pagedir_loc; + struct uni_screen *vc_uni_screen; +}; + +struct fb_fix_screeninfo { + char id[16]; + long unsigned int smem_start; + __u32 smem_len; + __u32 type; + __u32 type_aux; + __u32 visual; + __u16 xpanstep; + __u16 ypanstep; + __u16 ywrapstep; + __u32 line_length; + long unsigned int mmio_start; + __u32 mmio_len; + __u32 accel; + __u16 capabilities; + __u16 reserved[2]; +}; + +struct fb_bitfield { + __u32 offset; + __u32 length; + __u32 msb_right; +}; + +struct fb_var_screeninfo { + __u32 xres; + __u32 yres; + __u32 xres_virtual; + __u32 yres_virtual; + __u32 xoffset; + __u32 yoffset; + __u32 bits_per_pixel; + __u32 grayscale; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + __u32 nonstd; + __u32 activate; + __u32 height; + __u32 width; + __u32 accel_flags; + __u32 pixclock; + __u32 left_margin; + __u32 right_margin; + __u32 upper_margin; + __u32 lower_margin; + __u32 hsync_len; + __u32 vsync_len; + __u32 sync; + __u32 vmode; + __u32 rotate; + __u32 colorspace; + __u32 reserved[4]; +}; + +struct fb_cmap { + __u32 start; + __u32 len; + __u16 *red; + __u16 *green; + __u16 *blue; + __u16 *transp; +}; + +enum { + FB_BLANK_UNBLANK = 0, + FB_BLANK_NORMAL = 1, + FB_BLANK_VSYNC_SUSPEND = 2, + FB_BLANK_HSYNC_SUSPEND = 3, + FB_BLANK_POWERDOWN = 4, +}; + +struct fb_copyarea { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 sx; + __u32 sy; +}; + +struct fb_fillrect { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 color; + __u32 rop; +}; + +struct fb_image { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 fg_color; + __u32 bg_color; + __u8 depth; + const char *data; + struct fb_cmap cmap; +}; + +struct fbcurpos { + __u16 x; + __u16 y; +}; + +struct fb_cursor { + __u16 set; + __u16 enable; + __u16 rop; + const char *mask; + struct fbcurpos hot; + struct fb_image image; +}; + +struct fb_chroma { + __u32 redx; + __u32 greenx; + __u32 bluex; + __u32 whitex; + __u32 redy; + __u32 greeny; + __u32 bluey; + __u32 whitey; +}; + +struct fb_videomode; + +struct fb_monspecs { + struct fb_chroma chroma; + struct fb_videomode *modedb; + __u8 manufacturer[4]; + __u8 monitor[14]; + __u8 serial_no[14]; + __u8 ascii[14]; + __u32 modedb_len; + __u32 model; + __u32 serial; + __u32 year; + __u32 week; + __u32 hfmin; + __u32 hfmax; + __u32 dclkmin; + __u32 dclkmax; + __u16 input; + __u16 dpms; + __u16 signal; + __u16 vfmin; + __u16 vfmax; + __u16 gamma; + __u16 gtf: 1; + __u16 misc; + __u8 version; + __u8 revision; + __u8 max_x; + __u8 max_y; +}; + +struct fb_videomode { + const char *name; + u32 refresh; + u32 xres; + u32 yres; + u32 pixclock; + u32 left_margin; + u32 right_margin; + u32 upper_margin; + u32 lower_margin; + u32 hsync_len; + u32 vsync_len; + u32 sync; + u32 vmode; + u32 flag; +}; + +struct fb_info; + +struct fb_event { + struct fb_info *info; + void *data; +}; + +struct fb_pixmap { + u8 *addr; + u32 size; + u32 offset; + u32 buf_align; + u32 scan_align; + u32 access_align; + u32 flags; + u32 blit_x; + u32 blit_y; + void (*writeio)(struct fb_info *, void *, void *, unsigned int); + void (*readio)(struct fb_info *, void *, void *, unsigned int); +}; + +struct backlight_device; + +struct fb_deferred_io; + +struct fb_ops; + +struct fb_tile_ops; + +struct apertures_struct; + +struct fb_info { + refcount_t count; + int node; + int flags; + int fbcon_rotate_hint; + struct mutex lock; + struct mutex mm_lock; + struct fb_var_screeninfo var; + struct fb_fix_screeninfo fix; + struct fb_monspecs monspecs; + struct work_struct queue; + struct fb_pixmap pixmap; + struct fb_pixmap sprite; + struct fb_cmap cmap; + struct list_head modelist; + struct fb_videomode *mode; + struct backlight_device *bl_dev; + struct mutex bl_curve_mutex; + u8 bl_curve[128]; + struct delayed_work deferred_work; + struct fb_deferred_io *fbdefio; + const struct fb_ops *fbops; + struct device *device; + struct device *dev; + int class_flag; + struct fb_tile_ops *tileops; + union { + char *screen_base; + char *screen_buffer; + }; + long unsigned int screen_size; + void *pseudo_palette; + u32 state; + void *fbcon_par; + void *par; + struct apertures_struct *apertures; + bool skip_vt_switch; +}; + +struct fb_blit_caps { + u32 x; + u32 y; + u32 len; + u32 flags; +}; + +struct fb_deferred_io { + long unsigned int delay; + struct mutex lock; + struct list_head pagelist; + void (*first_io)(struct fb_info *); + void (*deferred_io)(struct fb_info *, struct list_head *); +}; + +struct fb_ops { + struct module *owner; + int (*fb_open)(struct fb_info *, int); + int (*fb_release)(struct fb_info *, int); + ssize_t (*fb_read)(struct fb_info *, char *, size_t, loff_t *); + ssize_t (*fb_write)(struct fb_info *, const char *, size_t, loff_t *); + int (*fb_check_var)(struct fb_var_screeninfo *, struct fb_info *); + int (*fb_set_par)(struct fb_info *); + int (*fb_setcolreg)(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, struct fb_info *); + int (*fb_setcmap)(struct fb_cmap *, struct fb_info *); + int (*fb_blank)(int, struct fb_info *); + int (*fb_pan_display)(struct fb_var_screeninfo *, struct fb_info *); + void (*fb_fillrect)(struct fb_info *, const struct fb_fillrect *); + void (*fb_copyarea)(struct fb_info *, const struct fb_copyarea *); + void (*fb_imageblit)(struct fb_info *, const struct fb_image *); + int (*fb_cursor)(struct fb_info *, struct fb_cursor *); + int (*fb_sync)(struct fb_info *); + int (*fb_ioctl)(struct fb_info *, unsigned int, long unsigned int); + int (*fb_compat_ioctl)(struct fb_info *, unsigned int, long unsigned int); + int (*fb_mmap)(struct fb_info *, struct vm_area_struct *); + void (*fb_get_caps)(struct fb_info *, struct fb_blit_caps *, struct fb_var_screeninfo *); + void (*fb_destroy)(struct fb_info *); + int (*fb_debug_enter)(struct fb_info *); + int (*fb_debug_leave)(struct fb_info *); +}; + +struct fb_tilemap { + __u32 width; + __u32 height; + __u32 depth; + __u32 length; + const __u8 *data; +}; + +struct fb_tilerect { + __u32 sx; + __u32 sy; + __u32 width; + __u32 height; + __u32 index; + __u32 fg; + __u32 bg; + __u32 rop; +}; + +struct fb_tilearea { + __u32 sx; + __u32 sy; + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; +}; + +struct fb_tileblit { + __u32 sx; + __u32 sy; + __u32 width; + __u32 height; + __u32 fg; + __u32 bg; + __u32 length; + __u32 *indices; +}; + +struct fb_tilecursor { + __u32 sx; + __u32 sy; + __u32 mode; + __u32 shape; + __u32 fg; + __u32 bg; +}; + +struct fb_tile_ops { + void (*fb_settile)(struct fb_info *, struct fb_tilemap *); + void (*fb_tilecopy)(struct fb_info *, struct fb_tilearea *); + void (*fb_tilefill)(struct fb_info *, struct fb_tilerect *); + void (*fb_tileblit)(struct fb_info *, struct fb_tileblit *); + void (*fb_tilecursor)(struct fb_info *, struct fb_tilecursor *); + int (*fb_get_tilemax)(struct fb_info *); +}; + +struct aperture { + resource_size_t base; + resource_size_t size; +}; + +struct apertures_struct { + unsigned int count; + struct aperture ranges[0]; +}; + +enum backlight_type { + BACKLIGHT_RAW = 1, + BACKLIGHT_PLATFORM = 2, + BACKLIGHT_FIRMWARE = 3, + BACKLIGHT_TYPE_MAX = 4, +}; + +enum backlight_scale { + BACKLIGHT_SCALE_UNKNOWN = 0, + BACKLIGHT_SCALE_LINEAR = 1, + BACKLIGHT_SCALE_NON_LINEAR = 2, +}; + +struct backlight_properties { + int brightness; + int max_brightness; + int power; + int fb_blank; + enum backlight_type type; + unsigned int state; + enum backlight_scale scale; +}; + +struct backlight_ops; + +struct backlight_device { + struct backlight_properties props; + struct mutex update_lock; + struct mutex ops_lock; + const struct backlight_ops *ops; + struct notifier_block fb_notif; + struct list_head entry; + struct device dev; + bool fb_bl_on[32]; + int use_count; +}; + +enum backlight_update_reason { + BACKLIGHT_UPDATE_HOTKEY = 0, + BACKLIGHT_UPDATE_SYSFS = 1, +}; + +enum backlight_notification { + BACKLIGHT_REGISTERED = 0, + BACKLIGHT_UNREGISTERED = 1, +}; + +struct backlight_ops { + unsigned int options; + int (*update_status)(struct backlight_device *); + int (*get_brightness)(struct backlight_device *); + int (*check_fb)(struct backlight_device *, struct fb_info *); +}; + +struct fb_cmap_user { + __u32 start; + __u32 len; + __u16 *red; + __u16 *green; + __u16 *blue; + __u16 *transp; +}; + +struct fb_modelist { + struct list_head list; + struct fb_videomode mode; +}; + +struct fb_fix_screeninfo32 { + char id[16]; + compat_caddr_t smem_start; + u32 smem_len; + u32 type; + u32 type_aux; + u32 visual; + u16 xpanstep; + u16 ypanstep; + u16 ywrapstep; + u32 line_length; + compat_caddr_t mmio_start; + u32 mmio_len; + u32 accel; + u16 reserved[3]; +}; + +struct fb_cmap32 { + u32 start; + u32 len; + compat_caddr_t red; + compat_caddr_t green; + compat_caddr_t blue; + compat_caddr_t transp; +}; + +struct dmt_videomode { + u32 dmt_id; + u32 std_2byte_code; + u32 cvt_3byte_code; + const struct fb_videomode *mode; +}; + +enum display_flags { + DISPLAY_FLAGS_HSYNC_LOW = 1, + DISPLAY_FLAGS_HSYNC_HIGH = 2, + DISPLAY_FLAGS_VSYNC_LOW = 4, + DISPLAY_FLAGS_VSYNC_HIGH = 8, + DISPLAY_FLAGS_DE_LOW = 16, + DISPLAY_FLAGS_DE_HIGH = 32, + DISPLAY_FLAGS_PIXDATA_POSEDGE = 64, + DISPLAY_FLAGS_PIXDATA_NEGEDGE = 128, + DISPLAY_FLAGS_INTERLACED = 256, + DISPLAY_FLAGS_DOUBLESCAN = 512, + DISPLAY_FLAGS_DOUBLECLK = 1024, + DISPLAY_FLAGS_SYNC_POSEDGE = 2048, + DISPLAY_FLAGS_SYNC_NEGEDGE = 4096, +}; + +struct videomode { + long unsigned int pixelclock; + u32 hactive; + u32 hfront_porch; + u32 hback_porch; + u32 hsync_len; + u32 vactive; + u32 vfront_porch; + u32 vback_porch; + u32 vsync_len; + enum display_flags flags; +}; + +struct broken_edid { + u8 manufacturer[4]; + u32 model; + u32 fix; +}; + +struct __fb_timings { + u32 dclk; + u32 hfreq; + u32 vfreq; + u32 hactive; + u32 vactive; + u32 hblank; + u32 vblank; + u32 htotal; + u32 vtotal; +}; + +typedef unsigned int u_int; + +struct fb_cvt_data { + u32 xres; + u32 yres; + u32 refresh; + u32 f_refresh; + u32 pixclock; + u32 hperiod; + u32 hblank; + u32 hfreq; + u32 htotal; + u32 vtotal; + u32 vsync; + u32 hsync; + u32 h_front_porch; + u32 h_back_porch; + u32 v_front_porch; + u32 v_back_porch; + u32 h_margin; + u32 v_margin; + u32 interlace; + u32 aspect_ratio; + u32 active_pixels; + u32 flags; + u32 status; +}; + +typedef unsigned char u_char; + +struct fb_con2fbmap { + __u32 console; + __u32 framebuffer; +}; + +struct vc { + struct vc_data *d; + struct work_struct SAK_work; +}; + +struct fbcon_display { + const u_char *fontdata; + int userfont; + u_short inverse; + short int yscroll; + int vrows; + int cursor_shape; + int con_rotate; + u32 xres_virtual; + u32 yres_virtual; + u32 height; + u32 width; + u32 bits_per_pixel; + u32 grayscale; + u32 nonstd; + u32 accel_flags; + u32 rotate; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + const struct fb_videomode *mode; +}; + +struct fbcon_ops { + void (*clear)(struct vc_data *, struct fb_info *, int, int, int, int); + void (*putcs)(struct vc_data *, struct fb_info *, const short unsigned int *, int, int, int, int, int); + void (*clear_margins)(struct vc_data *, struct fb_info *, int, int); + void (*cursor)(struct vc_data *, struct fb_info *, int, int, int); + int (*update_start)(struct fb_info *); + int (*rotate_font)(struct fb_info *, struct vc_data *); + struct fb_var_screeninfo var; + struct timer_list cursor_timer; + struct fb_cursor cursor_state; + struct fbcon_display *p; + struct fb_info *info; + int currcon; + int cur_blink_jiffies; + int cursor_flash; + int cursor_reset; + int blank_state; + int graphics; + int save_graphics; + int flags; + int rotate; + int cur_rotate; + char *cursor_data; + u8 *fontbuffer; + u8 *fontdata; + u8 *cursor_src; + u32 cursor_size; + u32 fd_size; +}; + +enum { + FBCON_LOGO_CANSHOW = 4294967295, + FBCON_LOGO_DRAW = 4294967294, + FBCON_LOGO_DONTSHOW = 4294967293, +}; + +typedef long unsigned int u_long; + +enum { + S1SA = 0, + S2SA = 1, + SP = 2, + DSA = 3, + CNT = 4, + DP_OCTL = 5, + CLR = 6, + BI = 8, + MBC = 9, + BLTCTL = 10, + HES = 12, + HEB = 13, + HSB = 14, + HT = 15, + VES = 16, + VEB = 17, + VSB = 18, + VT = 19, + HCIV = 20, + VCIV = 21, + TCDR = 22, + VIL = 23, + STGCTL = 24, + SSR = 25, + HRIR = 26, + SPR = 27, + CMR = 28, + SRGCTL = 29, + RRCIV = 30, + RRSC = 31, + RRCR = 34, + GIOE = 32, + GIO = 33, + SCR = 35, + SSTATUS = 36, + PRC = 37, +}; + +enum { + PADDRW = 0, + PDATA = 4, + PPMASK = 8, + PADDRR = 12, + PIDXLO = 16, + PIDXHI = 20, + PIDXDATA = 24, + PIDXCTL = 28, +}; + +enum { + CLKCTL = 2, + SYNCCTL = 3, + HSYNCPOS = 4, + PWRMNGMT = 5, + DACOP = 6, + PALETCTL = 7, + SYSCLKCTL = 8, + PIXFMT = 10, + BPP8 = 11, + BPP16 = 12, + BPP24 = 13, + BPP32 = 14, + PIXCTL1 = 16, + PIXCTL2 = 17, + SYSCLKN = 21, + SYSCLKM = 22, + SYSCLKP = 23, + SYSCLKC = 24, + PIXM0 = 32, + PIXN0 = 33, + PIXP0 = 34, + PIXC0 = 35, + CURSCTL = 48, + CURSXLO = 49, + CURSXHI = 50, + CURSYLO = 51, + CURSYHI = 52, + CURSHOTX = 53, + CURSHOTY = 54, + CURSACCTL = 55, + CURSACATTR = 56, + CURS1R = 64, + CURS1G = 65, + CURS1B = 66, + CURS2R = 67, + CURS2G = 68, + CURS2B = 69, + CURS3R = 70, + CURS3G = 71, + CURS3B = 72, + BORDR = 96, + BORDG = 97, + BORDB = 98, + MISCTL1 = 112, + MISCTL2 = 113, + MISCTL3 = 114, + KEYCTL = 120, +}; + +enum { + TVPADDRW = 0, + TVPPDATA = 4, + TVPPMASK = 8, + TVPPADRR = 12, + TVPCADRW = 16, + TVPCDATA = 20, + TVPCADRR = 28, + TVPDCCTL = 36, + TVPIDATA = 40, + TVPCRDAT = 44, + TVPCXPOL = 48, + TVPCXPOH = 52, + TVPCYPOL = 56, + TVPCYPOH = 60, +}; + +enum { + TVPIRREV = 1, + TVPIRICC = 6, + TVPIRBRC = 7, + TVPIRLAC = 15, + TVPIRTCC = 24, + TVPIRMXC = 25, + TVPIRCLS = 26, + TVPIRPPG = 28, + TVPIRGEC = 29, + TVPIRMIC = 30, + TVPIRPLA = 44, + TVPIRPPD = 45, + TVPIRMPD = 46, + TVPIRLPD = 47, + TVPIRCKL = 48, + TVPIRCKH = 49, + TVPIRCRL = 50, + TVPIRCRH = 51, + TVPIRCGL = 52, + TVPIRCGH = 53, + TVPIRCBL = 54, + TVPIRCBH = 55, + TVPIRCKC = 56, + TVPIRMLC = 57, + TVPIRSEN = 58, + TVPIRTMD = 59, + TVPIRRML = 60, + TVPIRRMM = 61, + TVPIRRMS = 62, + TVPIRDID = 63, + TVPIRRES = 255, +}; + +struct initvalues { + __u8 addr; + __u8 value; +}; + +struct imstt_regvals { + __u32 pitch; + __u16 hes; + __u16 heb; + __u16 hsb; + __u16 ht; + __u16 ves; + __u16 veb; + __u16 vsb; + __u16 vt; + __u16 vil; + __u8 pclk_m; + __u8 pclk_n; + __u8 pclk_p; + __u8 mlc[3]; + __u8 lckl_p[3]; +}; + +struct imstt_par { + struct imstt_regvals init; + __u32 *dc_regs; + long unsigned int cmap_regs_phys; + __u8 *cmap_regs; + __u32 ramdac; + __u32 palette[16]; +}; + +enum { + IBM = 0, + TVP = 1, +}; + +struct chips_init_reg { + unsigned char addr; + unsigned char data; +}; + +struct acpi_table_bgrt { + struct acpi_table_header header; + u16 version; + u8 status; + u8 image_type; + u64 image_address; + u32 image_offset_x; + u32 image_offset_y; +}; + +enum drm_panel_orientation { + DRM_MODE_PANEL_ORIENTATION_UNKNOWN = 4294967295, + DRM_MODE_PANEL_ORIENTATION_NORMAL = 0, + DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP = 1, + DRM_MODE_PANEL_ORIENTATION_LEFT_UP = 2, + DRM_MODE_PANEL_ORIENTATION_RIGHT_UP = 3, +}; + +struct bmp_file_header { + u16 id; + u32 file_size; + u32 reserved; + u32 bitmap_offset; +} __attribute__((packed)); + +struct bmp_dib_header { + u32 dib_header_size; + s32 width; + s32 height; + u16 planes; + u16 bpp; + u32 compression; + u32 bitmap_size; + u32 horz_resolution; + u32 vert_resolution; + u32 colors_used; + u32 colors_important; +}; + +enum ipu_channel { + IDMAC_IC_0 = 0, + IDMAC_IC_1 = 1, + IDMAC_ADC_0 = 1, + IDMAC_IC_2 = 2, + IDMAC_ADC_1 = 2, + IDMAC_IC_3 = 3, + IDMAC_IC_4 = 4, + IDMAC_IC_5 = 5, + IDMAC_IC_6 = 6, + IDMAC_IC_7 = 7, + IDMAC_IC_8 = 8, + IDMAC_IC_9 = 9, + IDMAC_IC_10 = 10, + IDMAC_IC_11 = 11, + IDMAC_IC_12 = 12, + IDMAC_IC_13 = 13, + IDMAC_SDC_0 = 14, + IDMAC_SDC_1 = 15, + IDMAC_SDC_2 = 16, + IDMAC_SDC_3 = 17, + IDMAC_ADC_2 = 18, + IDMAC_ADC_3 = 19, + IDMAC_ADC_4 = 20, + IDMAC_ADC_5 = 21, + IDMAC_ADC_6 = 22, + IDMAC_ADC_7 = 23, + IDMAC_PF_0 = 24, + IDMAC_PF_1 = 25, + IDMAC_PF_2 = 26, + IDMAC_PF_3 = 27, + IDMAC_PF_4 = 28, + IDMAC_PF_5 = 29, + IDMAC_PF_6 = 30, + IDMAC_PF_7 = 31, +}; + +enum ipu_channel_status { + IPU_CHANNEL_FREE = 0, + IPU_CHANNEL_INITIALIZED = 1, + IPU_CHANNEL_READY = 2, + IPU_CHANNEL_ENABLED = 3, +}; + +enum pixel_fmt { + IPU_PIX_FMT_GENERIC = 0, + IPU_PIX_FMT_RGB332 = 1, + IPU_PIX_FMT_YUV420P = 2, + IPU_PIX_FMT_YUV422P = 3, + IPU_PIX_FMT_YUV420P2 = 4, + IPU_PIX_FMT_YVU422P = 5, + IPU_PIX_FMT_RGB565 = 6, + IPU_PIX_FMT_RGB666 = 7, + IPU_PIX_FMT_BGR666 = 8, + IPU_PIX_FMT_YUYV = 9, + IPU_PIX_FMT_UYVY = 10, + IPU_PIX_FMT_RGB24 = 11, + IPU_PIX_FMT_BGR24 = 12, + IPU_PIX_FMT_GENERIC_32 = 13, + IPU_PIX_FMT_RGB32 = 14, + IPU_PIX_FMT_BGR32 = 15, + IPU_PIX_FMT_ABGR32 = 16, + IPU_PIX_FMT_BGRA32 = 17, + IPU_PIX_FMT_RGBA32 = 18, +}; + +enum display_port { + DISP0 = 0, + DISP1 = 1, + DISP2 = 2, + DISP3 = 3, +}; + +struct idmac_video_param { + short unsigned int in_width; + short unsigned int in_height; + uint32_t in_pixel_fmt; + short unsigned int out_width; + short unsigned int out_height; + uint32_t out_pixel_fmt; + short unsigned int out_stride; + bool graphics_combine_en; + bool global_alpha_en; + bool key_color_en; + enum display_port disp; + short unsigned int out_left; + short unsigned int out_top; +}; + +union ipu_channel_param { + struct idmac_video_param video; +}; + +struct idmac_tx_desc { + struct dma_async_tx_descriptor txd; + struct scatterlist *sg; + unsigned int sg_len; + struct list_head list; +}; + +struct idmac_channel { + struct dma_chan dma_chan; + dma_cookie_t completed; + union ipu_channel_param params; + enum ipu_channel link; + enum ipu_channel_status status; + void *client; + unsigned int n_tx_desc; + struct idmac_tx_desc *desc; + struct scatterlist *sg[2]; + struct list_head free_list; + struct list_head queue; + spinlock_t lock; + struct mutex chan_mutex; + bool sec_chan_en; + int active_buffer; + unsigned int eof_irq; + char eof_name[16]; +}; + +enum disp_data_mapping { + IPU_DISP_DATA_MAPPING_RGB666 = 0, + IPU_DISP_DATA_MAPPING_RGB565 = 1, + IPU_DISP_DATA_MAPPING_RGB888 = 2, +}; + +struct mx3fb_platform_data { + struct device *dma_dev; + const char *name; + const struct fb_videomode *mode; + int num_modes; + enum disp_data_mapping disp_data_fmt; +}; + +enum ipu_panel { + IPU_PANEL_SHARP_TFT = 0, + IPU_PANEL_TFT = 1, +}; + +struct ipu_di_signal_cfg { + unsigned int datamask_en: 1; + unsigned int clksel_en: 1; + unsigned int clkidle_en: 1; + unsigned int data_pol: 1; + unsigned int clk_pol: 1; + unsigned int enable_pol: 1; + unsigned int Hsync_pol: 1; + unsigned int Vsync_pol: 1; +}; + +struct mx3fb_data { + struct fb_info *fbi; + int backlight_level; + void *reg_base; + spinlock_t lock; + struct device *dev; + struct backlight_device *bl; + uint32_t h_start_width; + uint32_t v_start_width; + enum disp_data_mapping disp_data_fmt; +}; + +struct dma_chan_request { + struct mx3fb_data *mx3fb; + enum ipu_channel id; +}; + +struct mx3fb_info { + int blank; + enum ipu_channel ipu_ch; + uint32_t cur_ipu_buf; + u32 pseudo_palette[16]; + struct completion flip_cmpl; + struct mutex mutex; + struct mx3fb_data *mx3fb; + struct idmac_channel *idmac_channel; + struct dma_async_tx_descriptor *txd; + dma_cookie_t cookie; + struct scatterlist sg[2]; + struct fb_var_screeninfo cur_var; +}; + +struct di_mapping { + uint32_t b0; + uint32_t b1; + uint32_t b2; +}; + +struct timing_entry { + u32 min; + u32 typ; + u32 max; +}; + +struct display_timing { + struct timing_entry pixelclock; + struct timing_entry hactive; + struct timing_entry hfront_porch; + struct timing_entry hback_porch; + struct timing_entry hsync_len; + struct timing_entry vactive; + struct timing_entry vfront_porch; + struct timing_entry vback_porch; + struct timing_entry vsync_len; + enum display_flags flags; +}; + +struct display_timings { + unsigned int num_timings; + unsigned int native_mode; + struct display_timing **timings; +}; + +enum ipmi_addr_src { + SI_INVALID = 0, + SI_HOTMOD = 1, + SI_HARDCODED = 2, + SI_SPMI = 3, + SI_ACPI = 4, + SI_SMBIOS = 5, + SI_PCI = 6, + SI_DEVICETREE = 7, + SI_PLATFORM = 8, + SI_LAST = 9, +}; + +struct dmi_header { + u8 type; + u8 length; + u16 handle; +}; + +enum si_type { + SI_TYPE_INVALID = 0, + SI_KCS = 1, + SI_SMIC = 2, + SI_BT = 3, + SI_TYPE_MAX = 4, +}; + +enum ipmi_addr_space { + IPMI_IO_ADDR_SPACE = 0, + IPMI_MEM_ADDR_SPACE = 1, +}; + +enum ipmi_plat_interface_type { + IPMI_PLAT_IF_SI = 0, + IPMI_PLAT_IF_SSIF = 1, +}; + +struct ipmi_plat_data { + enum ipmi_plat_interface_type iftype; + unsigned int type; + unsigned int space; + long unsigned int addr; + unsigned int regspacing; + unsigned int regsize; + unsigned int regshift; + unsigned int irq; + unsigned int slave_addr; + enum ipmi_addr_src addr_source; +}; + +struct ipmi_dmi_info { + enum si_type si_type; + unsigned int space; + long unsigned int addr; + u8 slave_addr; + struct ipmi_dmi_info *next; +}; + +typedef u16 acpi_owner_id; + +union acpi_name_union { + u32 integer; + char ascii[4]; +}; + +struct acpi_table_desc { + acpi_physical_address address; + struct acpi_table_header *pointer; + u32 length; + union acpi_name_union signature; + acpi_owner_id owner_id; + u8 flags; + u16 validation_count; +}; + +struct acpi_madt_local_apic { + struct acpi_subtable_header header; + u8 processor_id; + u8 id; + u32 lapic_flags; +}; + +struct acpi_madt_io_apic { + struct acpi_subtable_header header; + u8 id; + u8 reserved; + u32 address; + u32 global_irq_base; +}; + +struct acpi_madt_interrupt_override { + struct acpi_subtable_header header; + u8 bus; + u8 source_irq; + u32 global_irq; + u16 inti_flags; +} __attribute__((packed)); + +struct acpi_madt_nmi_source { + struct acpi_subtable_header header; + u16 inti_flags; + u32 global_irq; +}; + +struct acpi_madt_local_apic_nmi { + struct acpi_subtable_header header; + u8 processor_id; + u16 inti_flags; + u8 lint; +} __attribute__((packed)); + +struct acpi_madt_local_apic_override { + struct acpi_subtable_header header; + u16 reserved; + u64 address; +} __attribute__((packed)); + +struct acpi_madt_io_sapic { + struct acpi_subtable_header header; + u8 id; + u8 reserved; + u32 global_irq_base; + u64 address; +}; + +struct acpi_madt_local_sapic { + struct acpi_subtable_header header; + u8 processor_id; + u8 id; + u8 eid; + u8 reserved[3]; + u32 lapic_flags; + u32 uid; + char uid_string[1]; +} __attribute__((packed)); + +struct acpi_madt_interrupt_source { + struct acpi_subtable_header header; + u16 inti_flags; + u8 type; + u8 id; + u8 eid; + u8 io_sapic_vector; + u32 global_irq; + u32 flags; +}; + +struct acpi_madt_local_x2apic { + struct acpi_subtable_header header; + u16 reserved; + u32 local_apic_id; + u32 lapic_flags; + u32 uid; +}; + +struct acpi_madt_local_x2apic_nmi { + struct acpi_subtable_header header; + u16 inti_flags; + u32 uid; + u8 lint; + u8 reserved[3]; +}; + +struct acpi_subtable_proc { + int id; + acpi_tbl_entry_handler handler; + int count; +}; + +enum acpi_subtable_type { + ACPI_SUBTABLE_COMMON = 0, + ACPI_SUBTABLE_HMAT = 1, + ACPI_SUBTABLE_PRMT = 2, +}; + +struct acpi_subtable_entry { + union acpi_subtable_headers *hdr; + enum acpi_subtable_type type; +}; + +typedef u32 (*acpi_interface_handler)(acpi_string, u32); + +struct acpi_osi_entry { + char string[64]; + bool enable; +}; + +struct acpi_osi_config { + u8 default_disabling; + unsigned int linux_enable: 1; + unsigned int linux_dmi: 1; + unsigned int linux_cmdline: 1; + unsigned int darwin_enable: 1; + unsigned int darwin_dmi: 1; + unsigned int darwin_cmdline: 1; +}; + +struct acpi_predefined_names { + const char *name; + u8 type; + char *val; +}; + +typedef u32 (*acpi_osd_handler)(void *); + +typedef void (*acpi_osd_exec_callback)(void *); + +typedef u32 (*acpi_gpe_handler)(acpi_handle, u32, void *); + +typedef void (*acpi_notify_handler)(acpi_handle, u32, void *); + +struct acpi_pci_id { + u16 segment; + u16 bus; + u16 device; + u16 function; +}; + +struct acpi_mem_mapping { + acpi_physical_address physical_address; + u8 *logical_address; + acpi_size length; + struct acpi_mem_mapping *next_mm; +}; + +struct acpi_mem_space_context { + u32 length; + acpi_physical_address address; + struct acpi_mem_mapping *cur_mm; + struct acpi_mem_mapping *first_mm; +}; + +typedef enum { + OSL_GLOBAL_LOCK_HANDLER = 0, + OSL_NOTIFY_HANDLER = 1, + OSL_GPE_HANDLER = 2, + OSL_DEBUGGER_MAIN_THREAD = 3, + OSL_DEBUGGER_EXEC_THREAD = 4, + OSL_EC_POLL_HANDLER = 5, + OSL_EC_BURST_HANDLER = 6, +} acpi_execute_type; + +union acpi_operand_object; + +struct acpi_namespace_node { + union acpi_operand_object *object; + u8 descriptor_type; + u8 type; + u16 flags; + union acpi_name_union name; + struct acpi_namespace_node *parent; + struct acpi_namespace_node *child; + struct acpi_namespace_node *peer; + acpi_owner_id owner_id; +}; + +struct acpi_object_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; +}; + +struct acpi_object_integer { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 fill[3]; + u64 value; +}; + +struct acpi_object_string { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + char *pointer; + u32 length; +}; + +struct acpi_object_buffer { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 *pointer; + u32 length; + u32 aml_length; + u8 *aml_start; + struct acpi_namespace_node *node; +}; + +struct acpi_object_package { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *node; + union acpi_operand_object **elements; + u8 *aml_start; + u32 aml_length; + u32 count; +}; + +struct acpi_object_event { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + void *os_semaphore; +}; + +struct acpi_walk_state; + +typedef acpi_status (*acpi_internal_method)(struct acpi_walk_state *); + +struct acpi_object_method { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 info_flags; + u8 param_count; + u8 sync_level; + union acpi_operand_object *mutex; + union acpi_operand_object *node; + u8 *aml_start; + union { + acpi_internal_method implementation; + union acpi_operand_object *handler; + } dispatch; + u32 aml_length; + acpi_owner_id owner_id; + u8 thread_count; +}; + +struct acpi_thread_state; + +struct acpi_object_mutex { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 sync_level; + u16 acquisition_depth; + void *os_mutex; + u64 thread_id; + struct acpi_thread_state *owner_thread; + union acpi_operand_object *prev; + union acpi_operand_object *next; + struct acpi_namespace_node *node; + u8 original_sync_level; +}; + +struct acpi_object_region { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 space_id; + struct acpi_namespace_node *node; + union acpi_operand_object *handler; + union acpi_operand_object *next; + acpi_physical_address address; + u32 length; +}; + +struct acpi_object_notify_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; +}; + +struct acpi_gpe_block_info; + +struct acpi_object_device { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + struct acpi_gpe_block_info *gpe_block; +}; + +struct acpi_object_power_resource { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + u32 system_level; + u32 resource_order; +}; + +struct acpi_object_processor { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 proc_id; + u8 length; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + acpi_io_address address; +}; + +struct acpi_object_thermal_zone { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; +}; + +struct acpi_object_field_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *region_obj; +}; + +struct acpi_object_region_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + u16 resource_length; + union acpi_operand_object *region_obj; + u8 *resource_buffer; + u16 pin_number_index; + u8 *internal_pcc_buffer; +}; + +struct acpi_object_buffer_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + u8 is_create_field; + union acpi_operand_object *buffer_obj; +}; + +struct acpi_object_bank_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *region_obj; + union acpi_operand_object *bank_obj; +}; + +struct acpi_object_index_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *index_obj; + union acpi_operand_object *data_obj; +}; + +struct acpi_object_notify_handler { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *node; + u32 handler_type; + acpi_notify_handler handler; + void *context; + union acpi_operand_object *next[2]; +}; + +struct acpi_object_addr_handler { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 space_id; + u8 handler_flags; + acpi_adr_space_handler handler; + struct acpi_namespace_node *node; + void *context; + void *context_mutex; + acpi_adr_space_setup setup; + union acpi_operand_object *region_list; + union acpi_operand_object *next; +}; + +struct acpi_object_reference { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 class; + u8 target_type; + u8 resolved; + void *object; + struct acpi_namespace_node *node; + union acpi_operand_object **where; + u8 *index_pointer; + u8 *aml; + u32 value; +}; + +struct acpi_object_extra { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *method_REG; + struct acpi_namespace_node *scope_node; + void *region_context; + u8 *aml_start; + u32 aml_length; +}; + +struct acpi_object_data { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + acpi_object_handler handler; + void *pointer; +}; + +struct acpi_object_cache_list { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *next; +}; + +union acpi_operand_object { + struct acpi_object_common common; + struct acpi_object_integer integer; + struct acpi_object_string string; + struct acpi_object_buffer buffer; + struct acpi_object_package package; + struct acpi_object_event event; + struct acpi_object_method method; + struct acpi_object_mutex mutex; + struct acpi_object_region region; + struct acpi_object_notify_common common_notify; + struct acpi_object_device device; + struct acpi_object_power_resource power_resource; + struct acpi_object_processor processor; + struct acpi_object_thermal_zone thermal_zone; + struct acpi_object_field_common common_field; + struct acpi_object_region_field field; + struct acpi_object_buffer_field buffer_field; + struct acpi_object_bank_field bank_field; + struct acpi_object_index_field index_field; + struct acpi_object_notify_handler notify; + struct acpi_object_addr_handler address_space; + struct acpi_object_reference reference; + struct acpi_object_extra extra; + struct acpi_object_data data; + struct acpi_object_cache_list cache; + struct acpi_namespace_node node; +}; + +union acpi_parse_object; + +union acpi_generic_state; + +struct acpi_parse_state { + u8 *aml_start; + u8 *aml; + u8 *aml_end; + u8 *pkg_start; + u8 *pkg_end; + union acpi_parse_object *start_op; + struct acpi_namespace_node *start_node; + union acpi_generic_state *scope; + union acpi_parse_object *start_scope; + u32 aml_size; +}; + +typedef acpi_status (*acpi_parse_downwards)(struct acpi_walk_state *, union acpi_parse_object **); + +typedef acpi_status (*acpi_parse_upwards)(struct acpi_walk_state *); + +struct acpi_opcode_info; + +struct acpi_walk_state { + struct acpi_walk_state *next; + u8 descriptor_type; + u8 walk_type; + u16 opcode; + u8 next_op_info; + u8 num_operands; + u8 operand_index; + acpi_owner_id owner_id; + u8 last_predicate; + u8 current_result; + u8 return_used; + u8 scope_depth; + u8 pass_number; + u8 namespace_override; + u8 result_size; + u8 result_count; + u8 *aml; + u32 arg_types; + u32 method_breakpoint; + u32 user_breakpoint; + u32 parse_flags; + struct acpi_parse_state parser_state; + u32 prev_arg_types; + u32 arg_count; + u16 method_nesting_depth; + u8 method_is_nested; + struct acpi_namespace_node arguments[7]; + struct acpi_namespace_node local_variables[8]; + union acpi_operand_object *operands[9]; + union acpi_operand_object **params; + u8 *aml_last_while; + union acpi_operand_object **caller_return_desc; + union acpi_generic_state *control_state; + struct acpi_namespace_node *deferred_node; + union acpi_operand_object *implicit_return_obj; + struct acpi_namespace_node *method_call_node; + union acpi_parse_object *method_call_op; + union acpi_operand_object *method_desc; + struct acpi_namespace_node *method_node; + char *method_pathname; + union acpi_parse_object *op; + const struct acpi_opcode_info *op_info; + union acpi_parse_object *origin; + union acpi_operand_object *result_obj; + union acpi_generic_state *results; + union acpi_operand_object *return_desc; + union acpi_generic_state *scope_info; + union acpi_parse_object *prev_op; + union acpi_parse_object *next_op; + struct acpi_thread_state *thread; + acpi_parse_downwards descending_callback; + acpi_parse_upwards ascending_callback; +}; + +struct acpi_gpe_handler_info { + acpi_gpe_handler address; + void *context; + struct acpi_namespace_node *method_node; + u8 original_flags; + u8 originally_enabled; +}; + +struct acpi_gpe_notify_info { + struct acpi_namespace_node *device_node; + struct acpi_gpe_notify_info *next; +}; + +union acpi_gpe_dispatch_info { + struct acpi_namespace_node *method_node; + struct acpi_gpe_handler_info *handler; + struct acpi_gpe_notify_info *notify_list; +}; + +struct acpi_gpe_register_info; + +struct acpi_gpe_event_info { + union acpi_gpe_dispatch_info dispatch; + struct acpi_gpe_register_info *register_info; + u8 flags; + u8 gpe_number; + u8 runtime_count; + u8 disable_for_dispatch; +}; + +struct acpi_gpe_address { + u8 space_id; + u64 address; +}; + +struct acpi_gpe_register_info { + struct acpi_gpe_address status_address; + struct acpi_gpe_address enable_address; + u16 base_gpe_number; + u8 enable_for_wake; + u8 enable_for_run; + u8 mask_for_run; + u8 enable_mask; +}; + +struct acpi_gpe_xrupt_info; + +struct acpi_gpe_block_info { + struct acpi_namespace_node *node; + struct acpi_gpe_block_info *previous; + struct acpi_gpe_block_info *next; + struct acpi_gpe_xrupt_info *xrupt_block; + struct acpi_gpe_register_info *register_info; + struct acpi_gpe_event_info *event_info; + u64 address; + u32 register_count; + u16 gpe_count; + u16 block_base_number; + u8 space_id; + u8 initialized; +}; + +struct acpi_gpe_xrupt_info { + struct acpi_gpe_xrupt_info *previous; + struct acpi_gpe_xrupt_info *next; + struct acpi_gpe_block_info *gpe_block_list_head; + u32 interrupt_number; +}; + +struct acpi_common_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; +}; + +struct acpi_update_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + union acpi_operand_object *object; +}; + +struct acpi_pkg_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u32 index; + union acpi_operand_object *source_object; + union acpi_operand_object *dest_object; + struct acpi_walk_state *walk_state; + void *this_target_obj; + u32 num_packages; +}; + +struct acpi_control_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u16 opcode; + union acpi_parse_object *predicate_op; + u8 *aml_predicate_start; + u8 *package_end; + u64 loop_timeout; +}; + +union acpi_parse_value { + u64 integer; + u32 size; + char *string; + u8 *buffer; + char *name; + union acpi_parse_object *arg; +}; + +struct acpi_parse_obj_common { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; +}; + +struct acpi_parse_obj_named { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; + char *path; + u8 *data; + u32 length; + u32 name; +}; + +struct acpi_parse_obj_asl { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; + union acpi_parse_object *child; + union acpi_parse_object *parent_method; + char *filename; + u8 file_changed; + char *parent_filename; + char *external_name; + char *namepath; + char name_seg[4]; + u32 extra_value; + u32 column; + u32 line_number; + u32 logical_line_number; + u32 logical_byte_offset; + u32 end_line; + u32 end_logical_line; + u32 acpi_btype; + u32 aml_length; + u32 aml_subtree_length; + u32 final_aml_length; + u32 final_aml_offset; + u32 compile_flags; + u16 parse_opcode; + u8 aml_opcode_length; + u8 aml_pkg_len_bytes; + u8 extra; + char parse_op_name[20]; +}; + +union acpi_parse_object { + struct acpi_parse_obj_common common; + struct acpi_parse_obj_named named; + struct acpi_parse_obj_asl asl; +}; + +struct acpi_scope_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + struct acpi_namespace_node *node; +}; + +struct acpi_pscope_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u32 arg_count; + union acpi_parse_object *op; + u8 *arg_end; + u8 *pkg_end; + u32 arg_list; +}; + +struct acpi_thread_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u8 current_sync_level; + struct acpi_walk_state *walk_state_list; + union acpi_operand_object *acquired_mutex_list; + u64 thread_id; +}; + +struct acpi_result_values { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + union acpi_operand_object *obj_desc[8]; +}; + +struct acpi_global_notify_handler { + acpi_notify_handler handler; + void *context; +}; + +struct acpi_notify_info { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u8 handler_list_id; + struct acpi_namespace_node *node; + union acpi_operand_object *handler_list_head; + struct acpi_global_notify_handler *global; +}; + +union acpi_generic_state { + struct acpi_common_state common; + struct acpi_control_state control; + struct acpi_update_state update; + struct acpi_scope_state scope; + struct acpi_pscope_state parse_scope; + struct acpi_pkg_state pkg; + struct acpi_thread_state thread; + struct acpi_result_values results; + struct acpi_notify_info notify; +}; + +struct acpi_opcode_info { + u32 parse_args; + u32 runtime_args; + u16 flags; + u8 object_type; + u8 class; + u8 type; +}; + +struct acpi_os_dpc { + acpi_osd_exec_callback function; + void *context; + struct work_struct work; +}; + +struct acpi_ioremap { + struct list_head list; + void *virt; + acpi_physical_address phys; + acpi_size size; + union { + long unsigned int refcount; + struct rcu_work rwork; + } track; +}; + +struct acpi_hp_work { + struct work_struct work; + struct acpi_device *adev; + u32 src; +}; + +struct acpi_pld_info { + u8 revision; + u8 ignore_color; + u8 red; + u8 green; + u8 blue; + u16 width; + u16 height; + u8 user_visible; + u8 dock; + u8 lid; + u8 panel; + u8 vertical_position; + u8 horizontal_position; + u8 shape; + u8 group_orientation; + u8 group_token; + u8 group_position; + u8 bay; + u8 ejectable; + u8 ospm_eject_required; + u8 cabinet_number; + u8 card_cage_number; + u8 reference; + u8 rotation; + u8 order; + u8 reserved; + u16 vertical_offset; + u16 horizontal_offset; +}; + +struct acpi_handle_list { + u32 count; + acpi_handle handles[10]; +}; + +enum acpi_predicate { + all_versions = 0, + less_than_or_equal = 1, + equal = 2, + greater_than_or_equal = 3, +}; + +struct acpi_platform_list { + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; + char *table; + enum acpi_predicate pred; + char *reason; + u32 data; +}; + +struct acpi_device_bus_id { + const char *bus_id; + struct ida instance_ida; + struct list_head node; +}; + +struct acpi_dev_match_info { + struct acpi_device_id hid[2]; + const char *uid; + s64 hrv; +}; + +struct nvs_region { + __u64 phys_start; + __u64 size; + struct list_head node; +}; + +struct acpi_wakeup_handler { + struct list_head list_node; + bool (*wakeup)(void *); + void *context; +}; + +struct acpi_hardware_id { + struct list_head list; + const char *id; +}; + +struct acpi_data_node { + const char *name; + acpi_handle handle; + struct fwnode_handle fwnode; + struct fwnode_handle *parent; + struct acpi_device_data data; + struct list_head sibling; + struct kobject kobj; + struct completion kobj_done; +}; + +struct acpi_data_node_attr { + struct attribute attr; + ssize_t (*show)(struct acpi_data_node *, char *); + ssize_t (*store)(struct acpi_data_node *, const char *, size_t); +}; + +typedef u32 (*acpi_event_handler)(void *); + +typedef acpi_status (*acpi_table_handler)(u32, void *, void *); + +enum acpi_bus_device_type { + ACPI_BUS_TYPE_DEVICE = 0, + ACPI_BUS_TYPE_POWER = 1, + ACPI_BUS_TYPE_PROCESSOR = 2, + ACPI_BUS_TYPE_THERMAL = 3, + ACPI_BUS_TYPE_POWER_BUTTON = 4, + ACPI_BUS_TYPE_SLEEP_BUTTON = 5, + ACPI_BUS_TYPE_ECDT_EC = 6, + ACPI_BUS_DEVICE_TYPE_COUNT = 7, +}; + +struct acpi_device_physical_node { + unsigned int node_id; + struct list_head node; + struct device *dev; + bool put_online: 1; +}; + +struct acpi_osc_context { + char *uuid_str; + int rev; + struct acpi_buffer cap; + struct acpi_buffer ret; +}; + +struct acpi_bus_type { + struct list_head list; + const char *name; + bool (*match)(struct device *); + struct acpi_device * (*find_companion)(struct device *); + void (*setup)(struct device *); +}; + +struct acpi_pnp_device_id { + u32 length; + char *string; +}; + +struct acpi_pnp_device_id_list { + u32 count; + u32 list_size; + struct acpi_pnp_device_id ids[0]; +}; + +struct acpi_device_info { + u32 info_size; + u32 name; + acpi_object_type type; + u8 param_count; + u16 valid; + u8 flags; + u8 highest_dstates[4]; + u8 lowest_dstates[5]; + u64 address; + struct acpi_pnp_device_id hardware_id; + struct acpi_pnp_device_id unique_id; + struct acpi_pnp_device_id class_code; + struct acpi_pnp_device_id_list compatible_id_list; +}; + +struct acpi_table_spcr { + struct acpi_table_header header; + u8 interface_type; + u8 reserved[3]; + struct acpi_generic_address serial_port; + u8 interrupt_type; + u8 pc_interrupt; + u32 interrupt; + u8 baud_rate; + u8 parity; + u8 stop_bits; + u8 flow_control; + u8 terminal_type; + u8 reserved1; + u16 pci_device_id; + u16 pci_vendor_id; + u8 pci_bus; + u8 pci_device; + u8 pci_function; + u32 pci_flags; + u8 pci_segment; + u32 reserved2; +} __attribute__((packed)); + +struct acpi_table_stao { + struct acpi_table_header header; + u8 ignore_uart; +} __attribute__((packed)); + +struct acpi_dep_data { + struct list_head node; + acpi_handle supplier; + acpi_handle consumer; +}; + +enum acpi_reconfig_event { + ACPI_RECONFIG_DEVICE_ADD = 0, + ACPI_RECONFIG_DEVICE_REMOVE = 1, +}; + +struct acpi_scan_clear_dep_work { + struct work_struct work; + struct acpi_device *adev; +}; + +struct resource_win { + struct resource res; + resource_size_t offset; +}; + +struct irq_override_cmp { + const struct dmi_system_id *system; + unsigned char irq; + unsigned char triggering; + unsigned char polarity; + unsigned char shareable; +}; + +struct res_proc_context { + struct list_head *list; + int (*preproc)(struct acpi_resource *, void *); + void *preproc_data; + int count; + int error; +}; + +struct acpi_processor_errata { + u8 smp; + struct { + u8 throttle: 1; + u8 fdma: 1; + u8 reserved: 6; + u32 bmisx; + } piix4; +}; + +typedef u32 acpi_event_status; + +struct acpi_table_ecdt { + struct acpi_table_header header; + struct acpi_generic_address control; + struct acpi_generic_address data; + u32 uid; + u8 gpe; + u8 id[1]; +} __attribute__((packed)); + +struct transaction; + +struct acpi_ec { + acpi_handle handle; + int gpe; + int irq; + long unsigned int command_addr; + long unsigned int data_addr; + bool global_lock; + long unsigned int flags; + long unsigned int reference_count; + struct mutex mutex; + wait_queue_head_t wait; + struct list_head list; + struct transaction *curr; + spinlock_t lock; + struct work_struct work; + long unsigned int timestamp; + long unsigned int nr_pending_queries; + bool busy_polling; + unsigned int polling_guard; +}; + +struct transaction { + const u8 *wdata; + u8 *rdata; + short unsigned int irq_count; + u8 command; + u8 wi; + u8 ri; + u8 wlen; + u8 rlen; + u8 flags; +}; + +typedef int (*acpi_ec_query_func)(void *); + +enum ec_command { + ACPI_EC_COMMAND_READ = 128, + ACPI_EC_COMMAND_WRITE = 129, + ACPI_EC_BURST_ENABLE = 130, + ACPI_EC_BURST_DISABLE = 131, + ACPI_EC_COMMAND_QUERY = 132, +}; + +enum { + EC_FLAGS_QUERY_ENABLED = 0, + EC_FLAGS_QUERY_PENDING = 1, + EC_FLAGS_QUERY_GUARDING = 2, + EC_FLAGS_EVENT_HANDLER_INSTALLED = 3, + EC_FLAGS_EC_HANDLER_INSTALLED = 4, + EC_FLAGS_QUERY_METHODS_INSTALLED = 5, + EC_FLAGS_STARTED = 6, + EC_FLAGS_STOPPED = 7, + EC_FLAGS_EVENTS_MASKED = 8, +}; + +struct acpi_ec_query_handler { + struct list_head node; + acpi_ec_query_func func; + acpi_handle handle; + void *data; + u8 query_bit; + struct kref kref; +}; + +struct acpi_ec_query { + struct transaction transaction; + struct work_struct work; + struct acpi_ec_query_handler *handler; +}; + +struct dock_station { + acpi_handle handle; + long unsigned int last_dock_time; + u32 flags; + struct list_head dependent_devices; + struct list_head sibling; + struct platform_device *dock_device; +}; + +struct dock_dependent_device { + struct list_head list; + struct acpi_device *adev; +}; + +enum dock_callback_type { + DOCK_CALL_HANDLER = 0, + DOCK_CALL_FIXUP = 1, + DOCK_CALL_UEVENT = 2, +}; + +struct pci_osc_bit_struct { + u32 bit; + char *desc; +}; + +struct acpi_handle_node { + struct list_head node; + acpi_handle handle; +}; + +struct acpi_pci_link_irq { + u32 active; + u8 triggering; + u8 polarity; + u8 resource_type; + u8 possible_count; + u32 possible[16]; + u8 initialized: 1; + u8 reserved: 7; +}; + +struct acpi_pci_link { + struct list_head list; + struct acpi_device *device; + struct acpi_pci_link_irq irq; + int refcnt; +}; + +struct acpi_pci_routing_table { + u32 length; + u32 pin; + u64 address; + u32 source_index; + char source[4]; +}; + +struct acpi_prt_entry { + struct acpi_pci_id id; + u8 pin; + acpi_handle link; + u32 index; +}; + +struct prt_quirk { + const struct dmi_system_id *system; + unsigned int segment; + unsigned int bus; + unsigned int device; + unsigned char pin; + const char *source; + const char *actual_source; +}; + +struct apd_private_data; + +struct apd_device_desc { + unsigned int fixed_clk_rate; + struct property_entry *properties; + int (*setup)(struct apd_private_data *); +}; + +struct apd_private_data { + struct clk *clk; + struct acpi_device *adev; + const struct apd_device_desc *dev_desc; +}; + +struct acpi_power_dependent_device { + struct device *dev; + struct list_head node; +}; + +struct acpi_power_resource { + struct acpi_device device; + struct list_head list_node; + u32 system_level; + u32 order; + unsigned int ref_count; + u8 state; + struct mutex resource_lock; + struct list_head dependents; +}; + +struct acpi_power_resource_entry { + struct list_head node; + struct acpi_power_resource *resource; +}; + +struct acpi_bus_event { + struct list_head node; + acpi_device_class device_class; + acpi_bus_id bus_id; + u32 type; + u32 data; +}; + +struct acpi_genl_event { + acpi_device_class device_class; + char bus_id[15]; + u32 type; + u32 data; +}; + +enum { + ACPI_GENL_ATTR_UNSPEC = 0, + ACPI_GENL_ATTR_EVENT = 1, + __ACPI_GENL_ATTR_MAX = 2, +}; + +enum { + ACPI_GENL_CMD_UNSPEC = 0, + ACPI_GENL_CMD_EVENT = 1, + __ACPI_GENL_CMD_MAX = 2, +}; + +struct acpi_ged_device { + struct device *dev; + struct list_head event_list; +}; + +struct acpi_ged_event { + struct list_head node; + struct device *dev; + unsigned int gsi; + unsigned int irq; + acpi_handle handle; +}; + +typedef void (*acpi_gbl_event_handler)(u32, acpi_handle, u32, void *); + +struct acpi_table_bert { + struct acpi_table_header header; + u32 region_length; + u64 address; +}; + +struct acpi_table_attr { + struct bin_attribute attr; + char name[4]; + int instance; + char filename[8]; + struct list_head node; +}; + +struct acpi_data_attr { + struct bin_attribute attr; + u64 addr; +}; + +struct acpi_data_obj { + char *name; + int (*fn)(void *, struct acpi_data_attr *); +}; + +struct event_counter { + u32 count; + u32 flags; +}; + +struct acpi_device_properties { + const guid_t *guid; + const union acpi_object *properties; + struct list_head list; +}; + +struct acpi_lpat { + int temp; + int raw; +}; + +struct acpi_lpat_conversion_table { + struct acpi_lpat *lpat; + int lpat_count; +}; + +struct acpi_irq_parse_one_ctx { + int rc; + unsigned int index; + long unsigned int *res_flags; + struct irq_fwspec *fwspec; +}; + +struct acpi_table_wdat { + struct acpi_table_header header; + u32 header_length; + u16 pci_segment; + u8 pci_bus; + u8 pci_device; + u8 pci_function; + u8 reserved[3]; + u32 timer_period; + u32 max_count; + u32 min_count; + u8 flags; + u8 reserved2[3]; + u32 entries; +}; + +struct acpi_wdat_entry { + u8 action; + u8 instruction; + u16 reserved; + struct acpi_generic_address register_region; + u32 value; + u32 mask; +} __attribute__((packed)); + +struct acpi_name_info { + char name[4]; + u16 argument_list; + u8 expected_btypes; +} __attribute__((packed)); + +struct acpi_package_info { + u8 type; + u8 object_type1; + u8 count1; + u8 object_type2; + u8 count2; + u16 reserved; +} __attribute__((packed)); + +struct acpi_package_info2 { + u8 type; + u8 count; + u8 object_type[4]; + u8 reserved; +}; + +struct acpi_package_info3 { + u8 type; + u8 count; + u8 object_type[2]; + u8 tail_object_type; + u16 reserved; +} __attribute__((packed)); + +struct acpi_package_info4 { + u8 type; + u8 object_type1; + u8 count1; + u8 sub_object_types; + u8 pkg_count; + u16 reserved; +} __attribute__((packed)); + +union acpi_predefined_info { + struct acpi_name_info info; + struct acpi_package_info ret_info; + struct acpi_package_info2 ret_info2; + struct acpi_package_info3 ret_info3; + struct acpi_package_info4 ret_info4; +}; + +struct acpi_evaluate_info { + struct acpi_namespace_node *prefix_node; + const char *relative_pathname; + union acpi_operand_object **parameters; + struct acpi_namespace_node *node; + union acpi_operand_object *obj_desc; + char *full_pathname; + const union acpi_predefined_info *predefined; + union acpi_operand_object *return_object; + union acpi_operand_object *parent_package; + u32 return_flags; + u32 return_btype; + u16 param_count; + u16 node_flags; + u8 pass_number; + u8 return_object_type; + u8 flags; +}; + +enum { + ACPI_REFCLASS_LOCAL = 0, + ACPI_REFCLASS_ARG = 1, + ACPI_REFCLASS_REFOF = 2, + ACPI_REFCLASS_INDEX = 3, + ACPI_REFCLASS_TABLE = 4, + ACPI_REFCLASS_NAME = 5, + ACPI_REFCLASS_DEBUG = 6, + ACPI_REFCLASS_MAX = 6, +}; + +struct acpi_common_descriptor { + void *common_pointer; + u8 descriptor_type; +}; + +union acpi_descriptor { + struct acpi_common_descriptor common; + union acpi_operand_object object; + struct acpi_namespace_node node; + union acpi_parse_object op; +}; + +typedef enum { + ACPI_IMODE_LOAD_PASS1 = 1, + ACPI_IMODE_LOAD_PASS2 = 2, + ACPI_IMODE_EXECUTE = 3, +} acpi_interpreter_mode; + +struct acpi_create_field_info { + struct acpi_namespace_node *region_node; + struct acpi_namespace_node *field_node; + struct acpi_namespace_node *register_node; + struct acpi_namespace_node *data_register_node; + struct acpi_namespace_node *connection_node; + u8 *resource_buffer; + u32 bank_value; + u32 field_bit_position; + u32 field_bit_length; + u16 resource_length; + u16 pin_number_index; + u8 field_flags; + u8 attribute; + u8 field_type; + u8 access_length; +}; + +struct acpi_init_walk_info { + u32 table_index; + u32 object_count; + u32 method_count; + u32 serial_method_count; + u32 non_serial_method_count; + u32 serialized_method_count; + u32 device_count; + u32 op_region_count; + u32 field_count; + u32 buffer_count; + u32 package_count; + u32 op_region_init; + u32 field_init; + u32 buffer_init; + u32 package_init; + acpi_owner_id owner_id; +}; + +typedef u32 acpi_name; + +typedef acpi_status (*acpi_exception_handler)(acpi_status, acpi_name, u16, u32, void *); + +enum { + AML_FIELD_ACCESS_ANY = 0, + AML_FIELD_ACCESS_BYTE = 1, + AML_FIELD_ACCESS_WORD = 2, + AML_FIELD_ACCESS_DWORD = 3, + AML_FIELD_ACCESS_QWORD = 4, + AML_FIELD_ACCESS_BUFFER = 5, +}; + +typedef acpi_status (*acpi_execute_op)(struct acpi_walk_state *); + +typedef u32 acpi_mutex_handle; + +struct acpi_reg_walk_info { + u32 function; + u32 reg_run_count; + acpi_adr_space_type space_id; +}; + +enum { + AML_FIELD_UPDATE_PRESERVE = 0, + AML_FIELD_UPDATE_WRITE_AS_ONES = 32, + AML_FIELD_UPDATE_WRITE_AS_ZEROS = 64, +}; + +struct acpi_signal_fatal_info { + u32 type; + u32 code; + u32 argument; +}; + +enum { + MATCH_MTR = 0, + MATCH_MEQ = 1, + MATCH_MLE = 2, + MATCH_MLT = 3, + MATCH_MGE = 4, + MATCH_MGT = 5, +}; + +enum { + AML_FIELD_ATTRIB_QUICK = 2, + AML_FIELD_ATTRIB_SEND_RECEIVE = 4, + AML_FIELD_ATTRIB_BYTE = 6, + AML_FIELD_ATTRIB_WORD = 8, + AML_FIELD_ATTRIB_BLOCK = 10, + AML_FIELD_ATTRIB_BYTES = 11, + AML_FIELD_ATTRIB_PROCESS_CALL = 12, + AML_FIELD_ATTRIB_BLOCK_PROCESS_CALL = 13, + AML_FIELD_ATTRIB_RAW_BYTES = 14, + AML_FIELD_ATTRIB_RAW_PROCESS_BYTES = 15, +}; + +typedef enum { + ACPI_TRACE_AML_METHOD = 0, + ACPI_TRACE_AML_OPCODE = 1, + ACPI_TRACE_AML_REGION = 2, +} acpi_trace_event_type; + +struct acpi_port_info { + char *name; + u16 start; + u16 end; + u8 osi_dependency; +}; + +struct acpi_pci_device { + acpi_handle device; + struct acpi_pci_device *next; +}; + +typedef acpi_status (*acpi_init_handler)(acpi_handle, u32); + +struct acpi_device_walk_info { + struct acpi_table_desc *table_desc; + struct acpi_evaluate_info *evaluate_info; + u32 device_count; + u32 num_STA; + u32 num_INI; +}; + +typedef acpi_status (*acpi_pkg_callback)(u8, union acpi_operand_object *, union acpi_generic_state *, void *); + +struct acpi_table_list { + struct acpi_table_desc *tables; + u32 current_table_count; + u32 max_table_count; + u8 flags; +}; + +enum acpi_return_package_types { + ACPI_PTYPE1_FIXED = 1, + ACPI_PTYPE1_VAR = 2, + ACPI_PTYPE1_OPTION = 3, + ACPI_PTYPE2 = 4, + ACPI_PTYPE2_COUNT = 5, + ACPI_PTYPE2_PKG_COUNT = 6, + ACPI_PTYPE2_FIXED = 7, + ACPI_PTYPE2_MIN = 8, + ACPI_PTYPE2_REV_FIXED = 9, + ACPI_PTYPE2_FIX_VAR = 10, + ACPI_PTYPE2_VAR_VAR = 11, + ACPI_PTYPE2_UUID_PAIR = 12, + ACPI_PTYPE_CUSTOM = 13, +}; + +typedef acpi_status (*acpi_object_converter)(struct acpi_namespace_node *, union acpi_operand_object *, union acpi_operand_object **); + +struct acpi_simple_repair_info { + char name[4]; + u32 unexpected_btypes; + u32 package_index; + acpi_object_converter object_converter; +}; + +typedef acpi_status (*acpi_repair_function)(struct acpi_evaluate_info *, union acpi_operand_object **); + +struct acpi_repair_info { + char name[4]; + acpi_repair_function repair_function; +}; + +struct acpi_namestring_info { + const char *external_name; + const char *next_external_char; + char *internal_name; + u32 length; + u32 num_segments; + u32 num_carats; + u8 fully_qualified; +}; + +struct acpi_rw_lock { + void *writer_mutex; + void *reader_mutex; + u32 num_readers; +}; + +struct acpi_get_devices_info { + acpi_walk_callback user_function; + void *context; + const char *hid; +}; + +struct aml_resource_small_header { + u8 descriptor_type; +}; + +struct aml_resource_irq { + u8 descriptor_type; + u16 irq_mask; + u8 flags; +} __attribute__((packed)); + +struct aml_resource_dma { + u8 descriptor_type; + u8 dma_channel_mask; + u8 flags; +}; + +struct aml_resource_start_dependent { + u8 descriptor_type; + u8 flags; +}; + +struct aml_resource_end_dependent { + u8 descriptor_type; +}; + +struct aml_resource_io { + u8 descriptor_type; + u8 flags; + u16 minimum; + u16 maximum; + u8 alignment; + u8 address_length; +}; + +struct aml_resource_fixed_io { + u8 descriptor_type; + u16 address; + u8 address_length; +} __attribute__((packed)); + +struct aml_resource_vendor_small { + u8 descriptor_type; +}; + +struct aml_resource_end_tag { + u8 descriptor_type; + u8 checksum; +}; + +struct aml_resource_fixed_dma { + u8 descriptor_type; + u16 request_lines; + u16 channels; + u8 width; +} __attribute__((packed)); + +struct aml_resource_large_header { + u8 descriptor_type; + u16 resource_length; +} __attribute__((packed)); + +struct aml_resource_memory24 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u16 minimum; + u16 maximum; + u16 alignment; + u16 address_length; +} __attribute__((packed)); + +struct aml_resource_vendor_large { + u8 descriptor_type; + u16 resource_length; +} __attribute__((packed)); + +struct aml_resource_memory32 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u32 minimum; + u32 maximum; + u32 alignment; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_fixed_memory32 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u32 address; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_address { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; +} __attribute__((packed)); + +struct aml_resource_extended_address64 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u8 revision_ID; + u8 reserved; + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; + u64 type_specific; +} __attribute__((packed)); + +struct aml_resource_address64 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; +} __attribute__((packed)); + +struct aml_resource_address32 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u32 granularity; + u32 minimum; + u32 maximum; + u32 translation_offset; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_address16 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u16 granularity; + u16 minimum; + u16 maximum; + u16 translation_offset; + u16 address_length; +} __attribute__((packed)); + +struct aml_resource_extended_irq { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u8 interrupt_count; + u32 interrupts[1]; +} __attribute__((packed)); + +struct aml_resource_generic_register { + u8 descriptor_type; + u16 resource_length; + u8 address_space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct aml_resource_gpio { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 connection_type; + u16 flags; + u16 int_flags; + u8 pin_config; + u16 drive_strength; + u16 debounce_timeout; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_common_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; +} __attribute__((packed)); + +struct aml_resource_csi2_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; +} __attribute__((packed)); + +struct aml_resource_i2c_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 connection_speed; + u16 slave_address; +} __attribute__((packed)); + +struct aml_resource_spi_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 connection_speed; + u8 data_bit_length; + u8 clock_phase; + u8 clock_polarity; + u16 device_selection; +} __attribute__((packed)); + +struct aml_resource_uart_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 default_baud_rate; + u16 rx_fifo_size; + u16 tx_fifo_size; + u8 parity; + u8 lines_enabled; +} __attribute__((packed)); + +struct aml_resource_pin_function { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config; + u16 function_number; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_config { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config_type; + u32 pin_config_value; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 pin_table_offset; + u16 label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group_function { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 function_number; + u8 res_source_index; + u16 res_source_offset; + u16 res_source_label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group_config { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config_type; + u32 pin_config_value; + u8 res_source_index; + u16 res_source_offset; + u16 res_source_label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +union aml_resource { + u8 descriptor_type; + struct aml_resource_small_header small_header; + struct aml_resource_large_header large_header; + struct aml_resource_irq irq; + struct aml_resource_dma dma; + struct aml_resource_start_dependent start_dpf; + struct aml_resource_end_dependent end_dpf; + struct aml_resource_io io; + struct aml_resource_fixed_io fixed_io; + struct aml_resource_fixed_dma fixed_dma; + struct aml_resource_vendor_small vendor_small; + struct aml_resource_end_tag end_tag; + struct aml_resource_memory24 memory24; + struct aml_resource_generic_register generic_reg; + struct aml_resource_vendor_large vendor_large; + struct aml_resource_memory32 memory32; + struct aml_resource_fixed_memory32 fixed_memory32; + struct aml_resource_address16 address16; + struct aml_resource_address32 address32; + struct aml_resource_address64 address64; + struct aml_resource_extended_address64 ext_address64; + struct aml_resource_extended_irq extended_irq; + struct aml_resource_gpio gpio; + struct aml_resource_i2c_serialbus i2c_serial_bus; + struct aml_resource_spi_serialbus spi_serial_bus; + struct aml_resource_uart_serialbus uart_serial_bus; + struct aml_resource_csi2_serialbus csi2_serial_bus; + struct aml_resource_common_serialbus common_serial_bus; + struct aml_resource_pin_function pin_function; + struct aml_resource_pin_config pin_config; + struct aml_resource_pin_group pin_group; + struct aml_resource_pin_group_function pin_group_function; + struct aml_resource_pin_group_config pin_group_config; + struct aml_resource_address address; + u32 dword_item; + u16 word_item; + u8 byte_item; +}; + +struct acpi_rsconvert_info { + u8 opcode; + u8 resource_offset; + u8 aml_offset; + u8 value; +}; + +enum { + ACPI_RSC_INITGET = 0, + ACPI_RSC_INITSET = 1, + ACPI_RSC_FLAGINIT = 2, + ACPI_RSC_1BITFLAG = 3, + ACPI_RSC_2BITFLAG = 4, + ACPI_RSC_3BITFLAG = 5, + ACPI_RSC_6BITFLAG = 6, + ACPI_RSC_ADDRESS = 7, + ACPI_RSC_BITMASK = 8, + ACPI_RSC_BITMASK16 = 9, + ACPI_RSC_COUNT = 10, + ACPI_RSC_COUNT16 = 11, + ACPI_RSC_COUNT_GPIO_PIN = 12, + ACPI_RSC_COUNT_GPIO_RES = 13, + ACPI_RSC_COUNT_GPIO_VEN = 14, + ACPI_RSC_COUNT_SERIAL_RES = 15, + ACPI_RSC_COUNT_SERIAL_VEN = 16, + ACPI_RSC_DATA8 = 17, + ACPI_RSC_EXIT_EQ = 18, + ACPI_RSC_EXIT_LE = 19, + ACPI_RSC_EXIT_NE = 20, + ACPI_RSC_LENGTH = 21, + ACPI_RSC_MOVE_GPIO_PIN = 22, + ACPI_RSC_MOVE_GPIO_RES = 23, + ACPI_RSC_MOVE_SERIAL_RES = 24, + ACPI_RSC_MOVE_SERIAL_VEN = 25, + ACPI_RSC_MOVE8 = 26, + ACPI_RSC_MOVE16 = 27, + ACPI_RSC_MOVE32 = 28, + ACPI_RSC_MOVE64 = 29, + ACPI_RSC_SET8 = 30, + ACPI_RSC_SOURCE = 31, + ACPI_RSC_SOURCEX = 32, +}; + +typedef u16 acpi_rs_length; + +typedef acpi_status (*acpi_walk_aml_callback)(u8 *, u32, u32, u8, void **); + +typedef u32 acpi_rsdesc_size; + +struct acpi_vendor_uuid { + u8 subtype; + u8 data[16]; +}; + +struct acpi_vendor_walk_info { + struct acpi_vendor_uuid *uuid; + struct acpi_buffer *buffer; + acpi_status status; +}; + +struct acpi_fadt_info { + const char *name; + u16 address64; + u16 address32; + u16 length; + u8 default_length; + u8 flags; +}; + +struct acpi_fadt_pm_info { + struct acpi_generic_address *target; + u16 source; + u8 register_num; +}; + +struct acpi_table_rsdp { + char signature[8]; + u8 checksum; + char oem_id[6]; + u8 revision; + u32 rsdt_physical_address; + u32 length; + u64 xsdt_physical_address; + u8 extended_checksum; + u8 reserved[3]; +} __attribute__((packed)); + +struct acpi_address_range { + struct acpi_address_range *next; + struct acpi_namespace_node *region_node; + acpi_physical_address start_address; + acpi_physical_address end_address; +}; + +struct acpi_pkg_info { + u8 *free_space; + acpi_size length; + u32 object_space; + u32 num_packages; +}; + +struct acpi_exception_info { + char *name; +}; + +typedef u32 (*acpi_sci_handler)(void *); + +struct acpi_mutex_info { + void *mutex; + u32 use_count; + u64 thread_id; +}; + +struct acpi_sci_handler_info { + struct acpi_sci_handler_info *next; + acpi_sci_handler address; + void *context; +}; + +struct acpi_comment_node { + char *comment; + struct acpi_comment_node *next; +}; + +struct acpi_interface_info { + char *name; + struct acpi_interface_info *next; + u8 flags; + u8 value; +}; + +struct acpi_table_mcfg { + struct acpi_table_header header; + u8 reserved[8]; +}; + +struct acpi_mcfg_allocation { + u64 address; + u16 pci_segment; + u8 start_bus_number; + u8 end_bus_number; + u32 reserved; +}; + +struct mcfg_entry { + struct list_head list; + phys_addr_t addr; + u16 segment; + u8 bus_start; + u8 bus_end; +}; + +struct mcfg_fixup { + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; + u16 segment; + struct resource bus_range; + const struct pci_ecam_ops *ops; + struct resource cfgres; +}; + +enum led_brightness { + LED_OFF = 0, + LED_ON = 1, + LED_HALF = 127, + LED_FULL = 255, +}; + +struct led_hw_trigger_type { + int dummy; +}; + +struct led_pattern; + +struct led_trigger; + +struct led_classdev { + const char *name; + unsigned int brightness; + unsigned int max_brightness; + int flags; + long unsigned int work_flags; + void (*brightness_set)(struct led_classdev *, enum led_brightness); + int (*brightness_set_blocking)(struct led_classdev *, enum led_brightness); + enum led_brightness (*brightness_get)(struct led_classdev *); + int (*blink_set)(struct led_classdev *, long unsigned int *, long unsigned int *); + int (*pattern_set)(struct led_classdev *, struct led_pattern *, u32, int); + int (*pattern_clear)(struct led_classdev *); + struct device *dev; + const struct attribute_group **groups; + struct list_head node; + const char *default_trigger; + long unsigned int blink_delay_on; + long unsigned int blink_delay_off; + struct timer_list blink_timer; + int blink_brightness; + int new_blink_brightness; + void (*flash_resume)(struct led_classdev *); + struct work_struct set_brightness_work; + int delayed_set_value; + struct rw_semaphore trigger_lock; + struct led_trigger *trigger; + struct list_head trig_list; + void *trigger_data; + bool activated; + struct led_hw_trigger_type *trigger_type; + int brightness_hw_changed; + struct kernfs_node *brightness_hw_changed_kn; + struct mutex led_access; +}; + +struct led_pattern { + u32 delta_t; + int brightness; +}; + +struct led_trigger { + const char *name; + int (*activate)(struct led_classdev *); + void (*deactivate)(struct led_classdev *); + struct led_hw_trigger_type *trigger_type; + spinlock_t leddev_list_lock; + struct list_head led_cdevs; + struct list_head next_trig; + const struct attribute_group **groups; +}; + +enum power_supply_property { + POWER_SUPPLY_PROP_STATUS = 0, + POWER_SUPPLY_PROP_CHARGE_TYPE = 1, + POWER_SUPPLY_PROP_HEALTH = 2, + POWER_SUPPLY_PROP_PRESENT = 3, + POWER_SUPPLY_PROP_ONLINE = 4, + POWER_SUPPLY_PROP_AUTHENTIC = 5, + POWER_SUPPLY_PROP_TECHNOLOGY = 6, + POWER_SUPPLY_PROP_CYCLE_COUNT = 7, + POWER_SUPPLY_PROP_VOLTAGE_MAX = 8, + POWER_SUPPLY_PROP_VOLTAGE_MIN = 9, + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN = 10, + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN = 11, + POWER_SUPPLY_PROP_VOLTAGE_NOW = 12, + POWER_SUPPLY_PROP_VOLTAGE_AVG = 13, + POWER_SUPPLY_PROP_VOLTAGE_OCV = 14, + POWER_SUPPLY_PROP_VOLTAGE_BOOT = 15, + POWER_SUPPLY_PROP_CURRENT_MAX = 16, + POWER_SUPPLY_PROP_CURRENT_NOW = 17, + POWER_SUPPLY_PROP_CURRENT_AVG = 18, + POWER_SUPPLY_PROP_CURRENT_BOOT = 19, + POWER_SUPPLY_PROP_POWER_NOW = 20, + POWER_SUPPLY_PROP_POWER_AVG = 21, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN = 22, + POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN = 23, + POWER_SUPPLY_PROP_CHARGE_FULL = 24, + POWER_SUPPLY_PROP_CHARGE_EMPTY = 25, + POWER_SUPPLY_PROP_CHARGE_NOW = 26, + POWER_SUPPLY_PROP_CHARGE_AVG = 27, + POWER_SUPPLY_PROP_CHARGE_COUNTER = 28, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT = 29, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX = 30, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE = 31, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX = 32, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT = 33, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX = 34, + POWER_SUPPLY_PROP_CHARGE_CONTROL_START_THRESHOLD = 35, + POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD = 36, + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT = 37, + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT = 38, + POWER_SUPPLY_PROP_INPUT_POWER_LIMIT = 39, + POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN = 40, + POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN = 41, + POWER_SUPPLY_PROP_ENERGY_FULL = 42, + POWER_SUPPLY_PROP_ENERGY_EMPTY = 43, + POWER_SUPPLY_PROP_ENERGY_NOW = 44, + POWER_SUPPLY_PROP_ENERGY_AVG = 45, + POWER_SUPPLY_PROP_CAPACITY = 46, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN = 47, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MAX = 48, + POWER_SUPPLY_PROP_CAPACITY_ERROR_MARGIN = 49, + POWER_SUPPLY_PROP_CAPACITY_LEVEL = 50, + POWER_SUPPLY_PROP_TEMP = 51, + POWER_SUPPLY_PROP_TEMP_MAX = 52, + POWER_SUPPLY_PROP_TEMP_MIN = 53, + POWER_SUPPLY_PROP_TEMP_ALERT_MIN = 54, + POWER_SUPPLY_PROP_TEMP_ALERT_MAX = 55, + POWER_SUPPLY_PROP_TEMP_AMBIENT = 56, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN = 57, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX = 58, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW = 59, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG = 60, + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW = 61, + POWER_SUPPLY_PROP_TIME_TO_FULL_AVG = 62, + POWER_SUPPLY_PROP_TYPE = 63, + POWER_SUPPLY_PROP_USB_TYPE = 64, + POWER_SUPPLY_PROP_SCOPE = 65, + POWER_SUPPLY_PROP_PRECHARGE_CURRENT = 66, + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT = 67, + POWER_SUPPLY_PROP_CALIBRATE = 68, + POWER_SUPPLY_PROP_MANUFACTURE_YEAR = 69, + POWER_SUPPLY_PROP_MANUFACTURE_MONTH = 70, + POWER_SUPPLY_PROP_MANUFACTURE_DAY = 71, + POWER_SUPPLY_PROP_MODEL_NAME = 72, + POWER_SUPPLY_PROP_MANUFACTURER = 73, + POWER_SUPPLY_PROP_SERIAL_NUMBER = 74, +}; + +enum power_supply_type { + POWER_SUPPLY_TYPE_UNKNOWN = 0, + POWER_SUPPLY_TYPE_BATTERY = 1, + POWER_SUPPLY_TYPE_UPS = 2, + POWER_SUPPLY_TYPE_MAINS = 3, + POWER_SUPPLY_TYPE_USB = 4, + POWER_SUPPLY_TYPE_USB_DCP = 5, + POWER_SUPPLY_TYPE_USB_CDP = 6, + POWER_SUPPLY_TYPE_USB_ACA = 7, + POWER_SUPPLY_TYPE_USB_TYPE_C = 8, + POWER_SUPPLY_TYPE_USB_PD = 9, + POWER_SUPPLY_TYPE_USB_PD_DRP = 10, + POWER_SUPPLY_TYPE_APPLE_BRICK_ID = 11, + POWER_SUPPLY_TYPE_WIRELESS = 12, +}; + +enum power_supply_usb_type { + POWER_SUPPLY_USB_TYPE_UNKNOWN = 0, + POWER_SUPPLY_USB_TYPE_SDP = 1, + POWER_SUPPLY_USB_TYPE_DCP = 2, + POWER_SUPPLY_USB_TYPE_CDP = 3, + POWER_SUPPLY_USB_TYPE_ACA = 4, + POWER_SUPPLY_USB_TYPE_C = 5, + POWER_SUPPLY_USB_TYPE_PD = 6, + POWER_SUPPLY_USB_TYPE_PD_DRP = 7, + POWER_SUPPLY_USB_TYPE_PD_PPS = 8, + POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID = 9, +}; + +union power_supply_propval { + int intval; + const char *strval; +}; + +struct power_supply_config { + struct device_node *of_node; + struct fwnode_handle *fwnode; + void *drv_data; + const struct attribute_group **attr_grp; + char **supplied_to; + size_t num_supplicants; +}; + +struct power_supply; + +struct power_supply_desc { + const char *name; + enum power_supply_type type; + const enum power_supply_usb_type *usb_types; + size_t num_usb_types; + const enum power_supply_property *properties; + size_t num_properties; + int (*get_property)(struct power_supply *, enum power_supply_property, union power_supply_propval *); + int (*set_property)(struct power_supply *, enum power_supply_property, const union power_supply_propval *); + int (*property_is_writeable)(struct power_supply *, enum power_supply_property); + void (*external_power_changed)(struct power_supply *); + void (*set_charged)(struct power_supply *); + bool no_thermal; + int use_for_apm; +}; + +struct thermal_zone_device; + +struct power_supply { + const struct power_supply_desc *desc; + char **supplied_to; + size_t num_supplicants; + char **supplied_from; + size_t num_supplies; + struct device_node *of_node; + void *drv_data; + struct device dev; + struct work_struct changed_work; + struct delayed_work deferred_register_work; + spinlock_t changed_lock; + bool changed; + bool initialized; + bool removing; + atomic_t use_cnt; + struct thermal_zone_device *tzd; + struct thermal_cooling_device *tcd; + struct led_trigger *charging_full_trig; + char *charging_full_trig_name; + struct led_trigger *charging_trig; + char *charging_trig_name; + struct led_trigger *full_trig; + char *full_trig_name; + struct led_trigger *online_trig; + char *online_trig_name; + struct led_trigger *charging_blink_full_solid_trig; + char *charging_blink_full_solid_trig_name; +}; + +struct acpi_ac_bl { + const char *hid; + int hrv; +}; + +struct acpi_ac { + struct power_supply *charger; + struct power_supply_desc charger_desc; + struct acpi_device *device; + long long unsigned int state; + struct notifier_block battery_nb; +}; + +struct input_id { + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; +}; + +struct input_absinfo { + __s32 value; + __s32 minimum; + __s32 maximum; + __s32 fuzz; + __s32 flat; + __s32 resolution; +}; + +struct input_keymap_entry { + __u8 flags; + __u8 len; + __u16 index; + __u32 keycode; + __u8 scancode[32]; +}; + +struct ff_replay { + __u16 length; + __u16 delay; +}; + +struct ff_trigger { + __u16 button; + __u16 interval; +}; + +struct ff_envelope { + __u16 attack_length; + __u16 attack_level; + __u16 fade_length; + __u16 fade_level; +}; + +struct ff_constant_effect { + __s16 level; + struct ff_envelope envelope; +}; + +struct ff_ramp_effect { + __s16 start_level; + __s16 end_level; + struct ff_envelope envelope; +}; + +struct ff_condition_effect { + __u16 right_saturation; + __u16 left_saturation; + __s16 right_coeff; + __s16 left_coeff; + __u16 deadband; + __s16 center; +}; + +struct ff_periodic_effect { + __u16 waveform; + __u16 period; + __s16 magnitude; + __s16 offset; + __u16 phase; + struct ff_envelope envelope; + __u32 custom_len; + __s16 *custom_data; +}; + +struct ff_rumble_effect { + __u16 strong_magnitude; + __u16 weak_magnitude; +}; + +struct ff_effect { + __u16 type; + __s16 id; + __u16 direction; + struct ff_trigger trigger; + struct ff_replay replay; + union { + struct ff_constant_effect constant; + struct ff_ramp_effect ramp; + struct ff_periodic_effect periodic; + struct ff_condition_effect condition[2]; + struct ff_rumble_effect rumble; + } u; +}; + +struct input_device_id { + kernel_ulong_t flags; + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; + kernel_ulong_t evbit[1]; + kernel_ulong_t keybit[12]; + kernel_ulong_t relbit[1]; + kernel_ulong_t absbit[1]; + kernel_ulong_t mscbit[1]; + kernel_ulong_t ledbit[1]; + kernel_ulong_t sndbit[1]; + kernel_ulong_t ffbit[2]; + kernel_ulong_t swbit[1]; + kernel_ulong_t propbit[1]; + kernel_ulong_t driver_info; +}; + +struct input_value { + __u16 type; + __u16 code; + __s32 value; +}; + +enum input_clock_type { + INPUT_CLK_REAL = 0, + INPUT_CLK_MONO = 1, + INPUT_CLK_BOOT = 2, + INPUT_CLK_MAX = 3, +}; + +struct ff_device; + +struct input_dev_poller; + +struct input_mt; + +struct input_handle; + +struct input_dev { + const char *name; + const char *phys; + const char *uniq; + struct input_id id; + long unsigned int propbit[1]; + long unsigned int evbit[1]; + long unsigned int keybit[12]; + long unsigned int relbit[1]; + long unsigned int absbit[1]; + long unsigned int mscbit[1]; + long unsigned int ledbit[1]; + long unsigned int sndbit[1]; + long unsigned int ffbit[2]; + long unsigned int swbit[1]; + unsigned int hint_events_per_packet; + unsigned int keycodemax; + unsigned int keycodesize; + void *keycode; + int (*setkeycode)(struct input_dev *, const struct input_keymap_entry *, unsigned int *); + int (*getkeycode)(struct input_dev *, struct input_keymap_entry *); + struct ff_device *ff; + struct input_dev_poller *poller; + unsigned int repeat_key; + struct timer_list timer; + int rep[2]; + struct input_mt *mt; + struct input_absinfo *absinfo; + long unsigned int key[12]; + long unsigned int led[1]; + long unsigned int snd[1]; + long unsigned int sw[1]; + int (*open)(struct input_dev *); + void (*close)(struct input_dev *); + int (*flush)(struct input_dev *, struct file *); + int (*event)(struct input_dev *, unsigned int, unsigned int, int); + struct input_handle *grab; + spinlock_t event_lock; + struct mutex mutex; + unsigned int users; + bool going_away; + struct device dev; + struct list_head h_list; + struct list_head node; + unsigned int num_vals; + unsigned int max_vals; + struct input_value *vals; + bool devres_managed; + ktime_t timestamp[3]; + bool inhibited; +}; + +struct ff_device { + int (*upload)(struct input_dev *, struct ff_effect *, struct ff_effect *); + int (*erase)(struct input_dev *, int); + int (*playback)(struct input_dev *, int, int); + void (*set_gain)(struct input_dev *, u16); + void (*set_autocenter)(struct input_dev *, u16); + void (*destroy)(struct ff_device *); + void *private; + long unsigned int ffbit[2]; + struct mutex mutex; + int max_effects; + struct ff_effect *effects; + struct file *effect_owners[0]; +}; + +struct input_handler; + +struct input_handle { + void *private; + int open; + const char *name; + struct input_dev *dev; + struct input_handler *handler; + struct list_head d_node; + struct list_head h_node; +}; + +struct input_handler { + void *private; + void (*event)(struct input_handle *, unsigned int, unsigned int, int); + void (*events)(struct input_handle *, const struct input_value *, unsigned int); + bool (*filter)(struct input_handle *, unsigned int, unsigned int, int); + bool (*match)(struct input_handler *, struct input_dev *); + int (*connect)(struct input_handler *, struct input_dev *, const struct input_device_id *); + void (*disconnect)(struct input_handle *); + void (*start)(struct input_handle *); + bool legacy_minors; + int minor; + const char *name; + const struct input_device_id *id_table; + struct list_head h_list; + struct list_head node; +}; + +enum { + ACPI_BUTTON_LID_INIT_IGNORE = 0, + ACPI_BUTTON_LID_INIT_OPEN = 1, + ACPI_BUTTON_LID_INIT_METHOD = 2, + ACPI_BUTTON_LID_INIT_DISABLED = 3, +}; + +struct acpi_button { + unsigned int type; + struct input_dev *input; + char phys[32]; + long unsigned int pushed; + int last_state; + ktime_t last_time; + bool suspended; + bool lid_state_initialized; +}; + +struct acpi_fan_fps { + u64 control; + u64 trip_point; + u64 speed; + u64 noise_level; + u64 power; + char name[20]; + struct device_attribute dev_attr; +}; + +struct acpi_fan_fif { + u64 revision; + u64 fine_grain_ctrl; + u64 step_size; + u64 low_speed_notification; +}; + +struct acpi_fan { + bool acpi4; + struct acpi_fan_fif fif; + struct acpi_fan_fps *fps; + int fps_count; + struct thermal_cooling_device *cdev; +}; + +struct acpi_pci_slot { + struct pci_slot *pci_slot; + struct list_head list; +}; + +struct acpi_power_register { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct acpi_lpi_states_array { + unsigned int size; + unsigned int composite_states_size; + struct acpi_lpi_state *entries; + struct acpi_lpi_state *composite_states[8]; +}; + +struct container_dev { + struct device dev; + int (*offline)(struct container_dev *); +}; + +enum thermal_device_mode { + THERMAL_DEVICE_DISABLED = 0, + THERMAL_DEVICE_ENABLED = 1, +}; + +enum thermal_trip_type { + THERMAL_TRIP_ACTIVE = 0, + THERMAL_TRIP_PASSIVE = 1, + THERMAL_TRIP_HOT = 2, + THERMAL_TRIP_CRITICAL = 3, +}; + +enum thermal_trend { + THERMAL_TREND_STABLE = 0, + THERMAL_TREND_RAISING = 1, + THERMAL_TREND_DROPPING = 2, + THERMAL_TREND_RAISE_FULL = 3, + THERMAL_TREND_DROP_FULL = 4, +}; + +enum thermal_notify_event { + THERMAL_EVENT_UNSPECIFIED = 0, + THERMAL_EVENT_TEMP_SAMPLE = 1, + THERMAL_TRIP_VIOLATED = 2, + THERMAL_TRIP_CHANGED = 3, + THERMAL_DEVICE_DOWN = 4, + THERMAL_DEVICE_UP = 5, + THERMAL_DEVICE_POWER_CAPABILITY_CHANGED = 6, + THERMAL_TABLE_CHANGED = 7, + THERMAL_EVENT_KEEP_ALIVE = 8, +}; + +struct thermal_zone_device_ops { + int (*bind)(struct thermal_zone_device *, struct thermal_cooling_device *); + int (*unbind)(struct thermal_zone_device *, struct thermal_cooling_device *); + int (*get_temp)(struct thermal_zone_device *, int *); + int (*set_trips)(struct thermal_zone_device *, int, int); + int (*change_mode)(struct thermal_zone_device *, enum thermal_device_mode); + int (*get_trip_type)(struct thermal_zone_device *, int, enum thermal_trip_type *); + int (*get_trip_temp)(struct thermal_zone_device *, int, int *); + int (*set_trip_temp)(struct thermal_zone_device *, int, int); + int (*get_trip_hyst)(struct thermal_zone_device *, int, int *); + int (*set_trip_hyst)(struct thermal_zone_device *, int, int); + int (*get_crit_temp)(struct thermal_zone_device *, int *); + int (*set_emul_temp)(struct thermal_zone_device *, int); + int (*get_trend)(struct thermal_zone_device *, int, enum thermal_trend *); + void (*hot)(struct thermal_zone_device *); + void (*critical)(struct thermal_zone_device *); +}; + +struct thermal_attr; + +struct thermal_zone_params; + +struct thermal_governor; + +struct thermal_zone_device { + int id; + char type[20]; + struct device device; + struct attribute_group trips_attribute_group; + struct thermal_attr *trip_temp_attrs; + struct thermal_attr *trip_type_attrs; + struct thermal_attr *trip_hyst_attrs; + enum thermal_device_mode mode; + void *devdata; + int trips; + long unsigned int trips_disabled; + long unsigned int passive_delay_jiffies; + long unsigned int polling_delay_jiffies; + int temperature; + int last_temperature; + int emul_temperature; + int passive; + int prev_low_trip; + int prev_high_trip; + atomic_t need_update; + struct thermal_zone_device_ops *ops; + struct thermal_zone_params *tzp; + struct thermal_governor *governor; + void *governor_data; + struct list_head thermal_instances; + struct ida ida; + struct mutex lock; + struct list_head node; + struct delayed_work poll_queue; + enum thermal_notify_event notify_event; +}; + +struct thermal_bind_params; + +struct thermal_zone_params { + char governor_name[20]; + bool no_hwmon; + int num_tbps; + struct thermal_bind_params *tbp; + u32 sustainable_power; + s32 k_po; + s32 k_pu; + s32 k_i; + s32 k_d; + s32 integral_cutoff; + int slope; + int offset; +}; + +struct thermal_governor { + char name[20]; + int (*bind_to_tz)(struct thermal_zone_device *); + void (*unbind_from_tz)(struct thermal_zone_device *); + int (*throttle)(struct thermal_zone_device *, int); + struct list_head governor_list; +}; + +struct thermal_bind_params { + struct thermal_cooling_device *cdev; + int weight; + int trip_mask; + long unsigned int *binding_limits; + int (*match)(struct thermal_zone_device *, struct thermal_cooling_device *); +}; + +struct acpi_thermal_state { + u8 critical: 1; + u8 hot: 1; + u8 passive: 1; + u8 active: 1; + u8 reserved: 4; + int active_index; +}; + +struct acpi_thermal_state_flags { + u8 valid: 1; + u8 enabled: 1; + u8 reserved: 6; +}; + +struct acpi_thermal_critical { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; +}; + +struct acpi_thermal_hot { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; +}; + +struct acpi_thermal_passive { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; + long unsigned int tc1; + long unsigned int tc2; + long unsigned int tsp; + struct acpi_handle_list devices; +}; + +struct acpi_thermal_active { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; + struct acpi_handle_list devices; +}; + +struct acpi_thermal_trips { + struct acpi_thermal_critical critical; + struct acpi_thermal_hot hot; + struct acpi_thermal_passive passive; + struct acpi_thermal_active active[10]; +}; + +struct acpi_thermal_flags { + u8 cooling_mode: 1; + u8 devices: 1; + u8 reserved: 6; +}; + +struct acpi_thermal { + struct acpi_device *device; + acpi_bus_id name; + long unsigned int temperature; + long unsigned int last_temperature; + long unsigned int polling_frequency; + volatile u8 zombie; + struct acpi_thermal_flags flags; + struct acpi_thermal_state state; + struct acpi_thermal_trips trips; + struct acpi_handle_list devices; + struct thermal_zone_device *thermal_zone; + int kelvin_offset; + struct work_struct thermal_check_work; + struct mutex thermal_check_lock; + refcount_t thermal_check_count; +}; + +struct acpi_table_slit { + struct acpi_table_header header; + u64 locality_count; + u8 entry[1]; +} __attribute__((packed)); + +struct acpi_table_srat { + struct acpi_table_header header; + u32 table_revision; + u64 reserved; +}; + +struct acpi_srat_cpu_affinity { + struct acpi_subtable_header header; + u8 proximity_domain_lo; + u8 apic_id; + u32 flags; + u8 local_sapic_eid; + u8 proximity_domain_hi[3]; + u32 clock_domain; +}; + +struct acpi_srat_mem_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u16 reserved; + u64 base_address; + u64 length; + u32 reserved1; + u32 flags; + u64 reserved2; +} __attribute__((packed)); + +struct acpi_srat_x2apic_cpu_affinity { + struct acpi_subtable_header header; + u16 reserved; + u32 proximity_domain; + u32 apic_id; + u32 flags; + u32 clock_domain; + u32 reserved2; +}; + +struct acpi_srat_generic_affinity { + struct acpi_subtable_header header; + u8 reserved; + u8 device_handle_type; + u32 proximity_domain; + u8 device_handle[16]; + u32 flags; + u32 reserved1; +}; + +enum acpi_hmat_type { + ACPI_HMAT_TYPE_PROXIMITY = 0, + ACPI_HMAT_TYPE_LOCALITY = 1, + ACPI_HMAT_TYPE_CACHE = 2, + ACPI_HMAT_TYPE_RESERVED = 3, +}; + +struct acpi_hmat_proximity_domain { + struct acpi_hmat_structure header; + u16 flags; + u16 reserved1; + u32 processor_PD; + u32 memory_PD; + u32 reserved2; + u64 reserved3; + u64 reserved4; +}; + +struct acpi_hmat_locality { + struct acpi_hmat_structure header; + u8 flags; + u8 data_type; + u8 min_transfer_size; + u8 reserved1; + u32 number_of_initiator_Pds; + u32 number_of_target_Pds; + u32 reserved2; + u64 entry_base_unit; +}; + +struct acpi_hmat_cache { + struct acpi_hmat_structure header; + u32 memory_PD; + u32 reserved1; + u64 cache_size; + u32 cache_attributes; + u16 reserved2; + u16 number_of_SMBIOShandles; +}; + +struct node_hmem_attrs { + unsigned int read_bandwidth; + unsigned int write_bandwidth; + unsigned int read_latency; + unsigned int write_latency; +}; + +enum cache_indexing { + NODE_CACHE_DIRECT_MAP = 0, + NODE_CACHE_INDEXED = 1, + NODE_CACHE_OTHER = 2, +}; + +enum cache_write_policy { + NODE_CACHE_WRITE_BACK = 0, + NODE_CACHE_WRITE_THROUGH = 1, + NODE_CACHE_WRITE_OTHER = 2, +}; + +struct node_cache_attrs { + enum cache_indexing indexing; + enum cache_write_policy write_policy; + u64 size; + u16 line_size; + u8 level; +}; + +enum locality_types { + WRITE_LATENCY = 0, + READ_LATENCY = 1, + WRITE_BANDWIDTH = 2, + READ_BANDWIDTH = 3, +}; + +struct memory_locality { + struct list_head node; + struct acpi_hmat_locality *hmat_loc; +}; + +struct target_cache { + struct list_head node; + struct node_cache_attrs cache_attrs; +}; + +struct memory_target { + struct list_head node; + unsigned int memory_pxm; + unsigned int processor_pxm; + struct resource memregions; + struct node_hmem_attrs hmem_attrs[2]; + struct list_head caches; + struct node_cache_attrs cache_attrs; + bool registered; +}; + +struct memory_initiator { + struct list_head node; + unsigned int processor_pxm; + bool has_cpu; +}; + +struct acpi_memory_info { + struct list_head list; + u64 start_addr; + u64 length; + short unsigned int caching; + short unsigned int write_protect; + unsigned int enabled: 1; +}; + +struct acpi_memory_device { + struct acpi_device *device; + struct list_head res_list; + int mgid; +}; + +enum dmi_entry_type { + DMI_ENTRY_BIOS = 0, + DMI_ENTRY_SYSTEM = 1, + DMI_ENTRY_BASEBOARD = 2, + DMI_ENTRY_CHASSIS = 3, + DMI_ENTRY_PROCESSOR = 4, + DMI_ENTRY_MEM_CONTROLLER = 5, + DMI_ENTRY_MEM_MODULE = 6, + DMI_ENTRY_CACHE = 7, + DMI_ENTRY_PORT_CONNECTOR = 8, + DMI_ENTRY_SYSTEM_SLOT = 9, + DMI_ENTRY_ONBOARD_DEVICE = 10, + DMI_ENTRY_OEMSTRINGS = 11, + DMI_ENTRY_SYSCONF = 12, + DMI_ENTRY_BIOS_LANG = 13, + DMI_ENTRY_GROUP_ASSOC = 14, + DMI_ENTRY_SYSTEM_EVENT_LOG = 15, + DMI_ENTRY_PHYS_MEM_ARRAY = 16, + DMI_ENTRY_MEM_DEVICE = 17, + DMI_ENTRY_32_MEM_ERROR = 18, + DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR = 19, + DMI_ENTRY_MEM_DEV_MAPPED_ADDR = 20, + DMI_ENTRY_BUILTIN_POINTING_DEV = 21, + DMI_ENTRY_PORTABLE_BATTERY = 22, + DMI_ENTRY_SYSTEM_RESET = 23, + DMI_ENTRY_HW_SECURITY = 24, + DMI_ENTRY_SYSTEM_POWER_CONTROLS = 25, + DMI_ENTRY_VOLTAGE_PROBE = 26, + DMI_ENTRY_COOLING_DEV = 27, + DMI_ENTRY_TEMP_PROBE = 28, + DMI_ENTRY_ELECTRICAL_CURRENT_PROBE = 29, + DMI_ENTRY_OOB_REMOTE_ACCESS = 30, + DMI_ENTRY_BIS_ENTRY = 31, + DMI_ENTRY_SYSTEM_BOOT = 32, + DMI_ENTRY_MGMT_DEV = 33, + DMI_ENTRY_MGMT_DEV_COMPONENT = 34, + DMI_ENTRY_MGMT_DEV_THRES = 35, + DMI_ENTRY_MEM_CHANNEL = 36, + DMI_ENTRY_IPMI_DEV = 37, + DMI_ENTRY_SYS_POWER_SUPPLY = 38, + DMI_ENTRY_ADDITIONAL = 39, + DMI_ENTRY_ONBOARD_DEV_EXT = 40, + DMI_ENTRY_MGMT_CONTROLLER_HOST = 41, + DMI_ENTRY_INACTIVE = 126, + DMI_ENTRY_END_OF_TABLE = 127, +}; + +enum { + POWER_SUPPLY_STATUS_UNKNOWN = 0, + POWER_SUPPLY_STATUS_CHARGING = 1, + POWER_SUPPLY_STATUS_DISCHARGING = 2, + POWER_SUPPLY_STATUS_NOT_CHARGING = 3, + POWER_SUPPLY_STATUS_FULL = 4, +}; + +enum { + POWER_SUPPLY_TECHNOLOGY_UNKNOWN = 0, + POWER_SUPPLY_TECHNOLOGY_NiMH = 1, + POWER_SUPPLY_TECHNOLOGY_LION = 2, + POWER_SUPPLY_TECHNOLOGY_LIPO = 3, + POWER_SUPPLY_TECHNOLOGY_LiFe = 4, + POWER_SUPPLY_TECHNOLOGY_NiCd = 5, + POWER_SUPPLY_TECHNOLOGY_LiMn = 6, +}; + +enum { + POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN = 0, + POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL = 1, + POWER_SUPPLY_CAPACITY_LEVEL_LOW = 2, + POWER_SUPPLY_CAPACITY_LEVEL_NORMAL = 3, + POWER_SUPPLY_CAPACITY_LEVEL_HIGH = 4, + POWER_SUPPLY_CAPACITY_LEVEL_FULL = 5, +}; + +struct acpi_battery_hook { + const char *name; + int (*add_battery)(struct power_supply *); + int (*remove_battery)(struct power_supply *); + struct list_head list; +}; + +enum { + ACPI_BATTERY_ALARM_PRESENT = 0, + ACPI_BATTERY_XINFO_PRESENT = 1, + ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY = 2, + ACPI_BATTERY_QUIRK_THINKPAD_MAH = 3, + ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE = 4, +}; + +struct acpi_battery { + struct mutex lock; + struct mutex sysfs_lock; + struct power_supply *bat; + struct power_supply_desc bat_desc; + struct acpi_device *device; + struct notifier_block pm_nb; + struct list_head list; + long unsigned int update_time; + int revision; + int rate_now; + int capacity_now; + int voltage_now; + int design_capacity; + int full_charge_capacity; + int technology; + int design_voltage; + int design_capacity_warning; + int design_capacity_low; + int cycle_count; + int measurement_accuracy; + int max_sampling_time; + int min_sampling_time; + int max_averaging_interval; + int min_averaging_interval; + int capacity_granularity_1; + int capacity_granularity_2; + int alarm; + char model_number[32]; + char serial_number[32]; + char type[32]; + char oem_info[32]; + int state; + int power_unit; + long unsigned int flags; +}; + +struct acpi_offsets { + size_t offset; + u8 mode; +}; + +struct acpi_pcct_shared_memory { + u32 signature; + u16 command; + u16 status; +}; + +struct mbox_chan; + +struct mbox_chan_ops { + int (*send_data)(struct mbox_chan *, void *); + int (*flush)(struct mbox_chan *, long unsigned int); + int (*startup)(struct mbox_chan *); + void (*shutdown)(struct mbox_chan *); + bool (*last_tx_done)(struct mbox_chan *); + bool (*peek_data)(struct mbox_chan *); +}; + +struct mbox_controller; + +struct mbox_client; + +struct mbox_chan { + struct mbox_controller *mbox; + unsigned int txdone_method; + struct mbox_client *cl; + struct completion tx_complete; + void *active_req; + unsigned int msg_count; + unsigned int msg_free; + void *msg_data[20]; + spinlock_t lock; + void *con_priv; +}; + +struct mbox_controller { + struct device *dev; + const struct mbox_chan_ops *ops; + struct mbox_chan *chans; + int num_chans; + bool txdone_irq; + bool txdone_poll; + unsigned int txpoll_period; + struct mbox_chan * (*of_xlate)(struct mbox_controller *, const struct of_phandle_args *); + struct hrtimer poll_hrt; + struct list_head node; +}; + +struct mbox_client { + struct device *dev; + bool tx_block; + long unsigned int tx_tout; + bool knows_txdone; + void (*rx_callback)(struct mbox_client *, void *); + void (*tx_prepare)(struct mbox_client *, void *); + void (*tx_done)(struct mbox_client *, void *, int); +}; + +struct pcc_mbox_chan { + struct mbox_chan *mchan; + u64 shmem_base_addr; + u64 shmem_size; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +}; + +struct cpc_register_resource { + acpi_object_type type; + u64 *sys_mem_vaddr; + union { + struct cpc_reg reg; + u64 int_value; + } cpc_entry; +}; + +struct cpc_desc { + int num_entries; + int version; + int cpu_id; + int write_cmd_status; + int write_cmd_id; + struct cpc_register_resource cpc_regs[21]; + struct acpi_psd_package domain_info; + struct kobject kobj; +}; + +enum cppc_regs { + HIGHEST_PERF = 0, + NOMINAL_PERF = 1, + LOW_NON_LINEAR_PERF = 2, + LOWEST_PERF = 3, + GUARANTEED_PERF = 4, + DESIRED_PERF = 5, + MIN_PERF = 6, + MAX_PERF = 7, + PERF_REDUC_TOLERANCE = 8, + TIME_WINDOW = 9, + CTR_WRAP_TIME = 10, + REFERENCE_CTR = 11, + DELIVERED_CTR = 12, + PERF_LIMITED = 13, + ENABLE = 14, + AUTO_SEL_ENABLE = 15, + AUTO_ACT_WINDOW = 16, + ENERGY_PERF = 17, + REFERENCE_PERF = 18, + LOWEST_FREQ = 19, + NOMINAL_FREQ = 20, +}; + +struct cppc_perf_caps { + u32 guaranteed_perf; + u32 highest_perf; + u32 nominal_perf; + u32 lowest_perf; + u32 lowest_nonlinear_perf; + u32 lowest_freq; + u32 nominal_freq; +}; + +struct cppc_perf_ctrls { + u32 max_perf; + u32 min_perf; + u32 desired_perf; +}; + +struct cppc_perf_fb_ctrs { + u64 reference; + u64 delivered; + u64 reference_perf; + u64 wraparound_time; +}; + +struct cppc_cpudata { + struct list_head node; + struct cppc_perf_caps perf_caps; + struct cppc_perf_ctrls perf_ctrls; + struct cppc_perf_fb_ctrs perf_fb_ctrs; + unsigned int shared_type; + cpumask_var_t shared_cpu_map; +}; + +struct cppc_pcc_data { + struct pcc_mbox_chan *pcc_channel; + void *pcc_comm_addr; + bool pcc_channel_acquired; + unsigned int deadline_us; + unsigned int pcc_mpar; + unsigned int pcc_mrtt; + unsigned int pcc_nominal; + bool pending_pcc_write_cmd; + bool platform_owns_pcc; + unsigned int pcc_write_cnt; + struct rw_semaphore pcc_lock; + wait_queue_head_t pcc_write_wait_q; + ktime_t last_cmd_cmpl_time; + ktime_t last_mpar_reset; + int mpar_count; + int refcount; +}; + +enum acpi_pptt_type { + ACPI_PPTT_TYPE_PROCESSOR = 0, + ACPI_PPTT_TYPE_CACHE = 1, + ACPI_PPTT_TYPE_ID = 2, + ACPI_PPTT_TYPE_RESERVED = 3, +}; + +struct acpi_pptt_processor { + struct acpi_subtable_header header; + u16 reserved; + u32 flags; + u32 parent; + u32 acpi_processor_id; + u32 number_of_priv_resources; +}; + +struct acpi_pptt_cache { + struct acpi_subtable_header header; + u16 reserved; + u32 flags; + u32 next_level_of_cache; + u32 size; + u32 number_of_sets; + u8 associativity; + u8 attributes; + u16 line_size; +}; + +struct acpi_pptt_cache_v1 { + u32 cache_id; +}; + +struct acpi_whea_header { + u8 action; + u8 instruction; + u8 flags; + u8 reserved; + struct acpi_generic_address register_region; + u64 value; + u64 mask; +} __attribute__((packed)); + +struct acpi_hest_header { + u16 type; + u16 source_id; +}; + +struct cper_sec_mem_err { + u64 validation_bits; + u64 error_status; + u64 physical_addr; + u64 physical_addr_mask; + u16 node; + u16 card; + u16 module; + u16 bank; + u16 device; + u16 row; + u16 column; + u16 bit_pos; + u64 requestor_id; + u64 responder_id; + u64 target_id; + u8 error_type; + u8 extended; + u16 rank; + u16 mem_array_handle; + u16 mem_dev_handle; +}; + +struct apei_exec_context; + +typedef int (*apei_exec_ins_func_t)(struct apei_exec_context *, struct acpi_whea_header *); + +struct apei_exec_ins_type; + +struct apei_exec_context { + u32 ip; + u64 value; + u64 var1; + u64 var2; + u64 src_base; + u64 dst_base; + struct apei_exec_ins_type *ins_table; + u32 instructions; + struct acpi_whea_header *action_table; + u32 entries; +}; + +struct apei_exec_ins_type { + u32 flags; + apei_exec_ins_func_t run; +}; + +struct apei_resources { + struct list_head iomem; + struct list_head ioport; +}; + +typedef int (*apei_exec_entry_func_t)(struct apei_exec_context *, struct acpi_whea_header *, void *); + +struct apei_res { + struct list_head list; + long unsigned int start; + long unsigned int end; +}; + +struct acpi_table_hest { + struct acpi_table_header header; + u32 error_source_count; +}; + +enum acpi_hest_types { + ACPI_HEST_TYPE_IA32_CHECK = 0, + ACPI_HEST_TYPE_IA32_CORRECTED_CHECK = 1, + ACPI_HEST_TYPE_IA32_NMI = 2, + ACPI_HEST_TYPE_NOT_USED3 = 3, + ACPI_HEST_TYPE_NOT_USED4 = 4, + ACPI_HEST_TYPE_NOT_USED5 = 5, + ACPI_HEST_TYPE_AER_ROOT_PORT = 6, + ACPI_HEST_TYPE_AER_ENDPOINT = 7, + ACPI_HEST_TYPE_AER_BRIDGE = 8, + ACPI_HEST_TYPE_GENERIC_ERROR = 9, + ACPI_HEST_TYPE_GENERIC_ERROR_V2 = 10, + ACPI_HEST_TYPE_IA32_DEFERRED_CHECK = 11, + ACPI_HEST_TYPE_RESERVED = 12, +}; + +struct acpi_hest_notify { + u8 type; + u8 length; + u16 config_write_enable; + u32 poll_interval; + u32 vector; + u32 polling_threshold_value; + u32 polling_threshold_window; + u32 error_threshold_value; + u32 error_threshold_window; +}; + +struct acpi_hest_ia_machine_check { + struct acpi_hest_header header; + u16 reserved1; + u8 flags; + u8 enabled; + u32 records_to_preallocate; + u32 max_sections_per_record; + u64 global_capability_data; + u64 global_control_data; + u8 num_hardware_banks; + u8 reserved3[7]; +}; + +struct acpi_hest_ia_corrected { + struct acpi_hest_header header; + u16 reserved1; + u8 flags; + u8 enabled; + u32 records_to_preallocate; + u32 max_sections_per_record; + struct acpi_hest_notify notify; + u8 num_hardware_banks; + u8 reserved2[3]; +}; + +struct acpi_hest_generic { + struct acpi_hest_header header; + u16 related_source_id; + u8 reserved; + u8 enabled; + u32 records_to_preallocate; + u32 max_sections_per_record; + u32 max_raw_data_length; + struct acpi_generic_address error_status_address; + struct acpi_hest_notify notify; + u32 error_block_length; +} __attribute__((packed)); + +struct acpi_hest_ia_deferred_check { + struct acpi_hest_header header; + u16 reserved1; + u8 flags; + u8 enabled; + u32 records_to_preallocate; + u32 max_sections_per_record; + struct acpi_hest_notify notify; + u8 num_hardware_banks; + u8 reserved2[3]; +}; + +enum hest_status { + HEST_ENABLED = 0, + HEST_DISABLED = 1, + HEST_NOT_FOUND = 2, +}; + +typedef int (*apei_hest_func_t)(struct acpi_hest_header *, void *); + +struct ghes_arr { + struct platform_device **ghes_devs; + unsigned int count; +}; + +struct acpi_table_erst { + struct acpi_table_header header; + u32 header_length; + u32 reserved; + u32 entries; +}; + +enum acpi_erst_actions { + ACPI_ERST_BEGIN_WRITE = 0, + ACPI_ERST_BEGIN_READ = 1, + ACPI_ERST_BEGIN_CLEAR = 2, + ACPI_ERST_END = 3, + ACPI_ERST_SET_RECORD_OFFSET = 4, + ACPI_ERST_EXECUTE_OPERATION = 5, + ACPI_ERST_CHECK_BUSY_STATUS = 6, + ACPI_ERST_GET_COMMAND_STATUS = 7, + ACPI_ERST_GET_RECORD_ID = 8, + ACPI_ERST_SET_RECORD_ID = 9, + ACPI_ERST_GET_RECORD_COUNT = 10, + ACPI_ERST_BEGIN_DUMMY_WRIITE = 11, + ACPI_ERST_NOT_USED = 12, + ACPI_ERST_GET_ERROR_RANGE = 13, + ACPI_ERST_GET_ERROR_LENGTH = 14, + ACPI_ERST_GET_ERROR_ATTRIBUTES = 15, + ACPI_ERST_EXECUTE_TIMINGS = 16, + ACPI_ERST_ACTION_RESERVED = 17, +}; + +enum acpi_erst_instructions { + ACPI_ERST_READ_REGISTER = 0, + ACPI_ERST_READ_REGISTER_VALUE = 1, + ACPI_ERST_WRITE_REGISTER = 2, + ACPI_ERST_WRITE_REGISTER_VALUE = 3, + ACPI_ERST_NOOP = 4, + ACPI_ERST_LOAD_VAR1 = 5, + ACPI_ERST_LOAD_VAR2 = 6, + ACPI_ERST_STORE_VAR1 = 7, + ACPI_ERST_ADD = 8, + ACPI_ERST_SUBTRACT = 9, + ACPI_ERST_ADD_VALUE = 10, + ACPI_ERST_SUBTRACT_VALUE = 11, + ACPI_ERST_STALL = 12, + ACPI_ERST_STALL_WHILE_TRUE = 13, + ACPI_ERST_SKIP_NEXT_IF_TRUE = 14, + ACPI_ERST_GOTO = 15, + ACPI_ERST_SET_SRC_ADDRESS_BASE = 16, + ACPI_ERST_SET_DST_ADDRESS_BASE = 17, + ACPI_ERST_MOVE_DATA = 18, + ACPI_ERST_INSTRUCTION_RESERVED = 19, +}; + +struct cper_record_header { + char signature[4]; + u16 revision; + u32 signature_end; + u16 section_count; + u32 error_severity; + u32 validation_bits; + u32 record_length; + u64 timestamp; + guid_t platform_id; + guid_t partition_id; + guid_t creator_id; + guid_t notification_type; + u64 record_id; + u32 flags; + u64 persistence_information; + u8 reserved[12]; +} __attribute__((packed)); + +struct cper_section_descriptor { + u32 section_offset; + u32 section_length; + u16 revision; + u8 validation_bits; + u8 reserved; + u32 flags; + guid_t section_type; + guid_t fru_id; + u32 section_severity; + u8 fru_text[20]; +}; + +struct erst_erange { + u64 base; + u64 size; + void *vaddr; + u32 attr; +}; + +struct erst_record_id_cache { + struct mutex lock; + u64 *entries; + int len; + int size; + int refcount; +}; + +struct cper_pstore_record { + struct cper_record_header hdr; + struct cper_section_descriptor sec_hdr; + char data[0]; +}; + +struct acpi_bert_region { + u32 block_status; + u32 raw_data_offset; + u32 raw_data_length; + u32 data_length; + u32 error_severity; +}; + +struct acpi_hest_generic_status { + u32 block_status; + u32 raw_data_offset; + u32 raw_data_length; + u32 data_length; + u32 error_severity; +}; + +enum acpi_hest_notify_types { + ACPI_HEST_NOTIFY_POLLED = 0, + ACPI_HEST_NOTIFY_EXTERNAL = 1, + ACPI_HEST_NOTIFY_LOCAL = 2, + ACPI_HEST_NOTIFY_SCI = 3, + ACPI_HEST_NOTIFY_NMI = 4, + ACPI_HEST_NOTIFY_CMCI = 5, + ACPI_HEST_NOTIFY_MCE = 6, + ACPI_HEST_NOTIFY_GPIO = 7, + ACPI_HEST_NOTIFY_SEA = 8, + ACPI_HEST_NOTIFY_SEI = 9, + ACPI_HEST_NOTIFY_GSIV = 10, + ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED = 11, + ACPI_HEST_NOTIFY_RESERVED = 12, +}; + +struct acpi_hest_generic_v2 { + struct acpi_hest_header header; + u16 related_source_id; + u8 reserved; + u8 enabled; + u32 records_to_preallocate; + u32 max_sections_per_record; + u32 max_raw_data_length; + struct acpi_generic_address error_status_address; + struct acpi_hest_notify notify; + u32 error_block_length; + struct acpi_generic_address read_ack_register; + u64 read_ack_preserve; + u64 read_ack_write; +} __attribute__((packed)); + +struct cper_sec_proc_arm { + u32 validation_bits; + u16 err_info_num; + u16 context_info_num; + u32 section_length; + u8 affinity_level; + u8 reserved[3]; + u64 mpidr; + u64 midr; + u32 running_state; + u32 psci_state; +}; + +struct cper_arm_err_info { + u8 version; + u8 length; + u16 validation_bits; + u8 type; + u16 multiple_error; + u8 flags; + u64 error_info; + u64 virt_fault_addr; + u64 physical_fault_addr; +} __attribute__((packed)); + +struct cper_sec_pcie { + u64 validation_bits; + u32 port_type; + struct { + u8 minor; + u8 major; + u8 reserved[2]; + } version; + u16 command; + u16 status; + u32 reserved; + struct { + u16 vendor_id; + u16 device_id; + u8 class_code[3]; + u8 function; + u8 device; + u16 segment; + u8 bus; + u8 secondary_bus; + u16 slot; + u8 reserved; + } __attribute__((packed)) device_id; + struct { + u32 lower; + u32 upper; + } serial_number; + struct { + u16 secondary_status; + u16 control; + } bridge; + u8 capability[60]; + u8 aer_info[96]; +}; + +struct ghes { + union { + struct acpi_hest_generic *generic; + struct acpi_hest_generic_v2 *generic_v2; + }; + struct acpi_hest_generic_status *estatus; + long unsigned int flags; + union { + struct list_head list; + struct timer_list timer; + unsigned int irq; + }; +}; + +struct ghes_estatus_node { + struct llist_node llnode; + struct acpi_hest_generic *generic; + struct ghes *ghes; + int task_work_cpu; + struct callback_head task_work; +}; + +struct ghes_estatus_cache { + u32 estatus_len; + atomic_t count; + struct acpi_hest_generic *generic; + long long unsigned int time_in; + struct callback_head rcu; +}; + +enum { + GHES_SEV_NO = 0, + GHES_SEV_CORRECTED = 1, + GHES_SEV_RECOVERABLE = 2, + GHES_SEV_PANIC = 3, +}; + +struct ghes_vendor_record_entry { + struct work_struct work; + int error_severity; + char vendor_record[0]; +}; + +struct acpi_table_iort { + struct acpi_table_header header; + u32 node_count; + u32 node_offset; + u32 reserved; +}; + +struct acpi_iort_node { + u8 type; + u16 length; + u8 revision; + u32 identifier; + u32 mapping_count; + u32 mapping_offset; + char node_data[1]; +} __attribute__((packed)); + +enum acpi_iort_node_type { + ACPI_IORT_NODE_ITS_GROUP = 0, + ACPI_IORT_NODE_NAMED_COMPONENT = 1, + ACPI_IORT_NODE_PCI_ROOT_COMPLEX = 2, + ACPI_IORT_NODE_SMMU = 3, + ACPI_IORT_NODE_SMMU_V3 = 4, + ACPI_IORT_NODE_PMCG = 5, + ACPI_IORT_NODE_RMR = 6, +}; + +struct acpi_iort_id_mapping { + u32 input_base; + u32 id_count; + u32 output_base; + u32 output_reference; + u32 flags; +}; + +struct acpi_iort_its_group { + u32 its_count; + u32 identifiers[1]; +}; + +struct acpi_iort_named_component { + u32 node_flags; + u64 memory_properties; + u8 memory_address_limit; + char device_name[1]; +} __attribute__((packed)); + +struct acpi_iort_root_complex { + u64 memory_properties; + u32 ats_attribute; + u32 pci_segment_number; + u8 memory_address_limit; + u8 reserved[3]; +} __attribute__((packed)); + +struct acpi_iort_smmu { + u64 base_address; + u64 span; + u32 model; + u32 flags; + u32 global_interrupt_offset; + u32 context_interrupt_count; + u32 context_interrupt_offset; + u32 pmu_interrupt_count; + u32 pmu_interrupt_offset; + u64 interrupts[1]; +} __attribute__((packed)); + +struct acpi_iort_smmu_v3 { + u64 base_address; + u32 flags; + u32 reserved; + u64 vatos_address; + u32 model; + u32 event_gsiv; + u32 pri_gsiv; + u32 gerr_gsiv; + u32 sync_gsiv; + u32 pxm; + u32 id_mapping_index; +} __attribute__((packed)); + +struct acpi_iort_pmcg { + u64 page0_base_address; + u32 overflow_gsiv; + u32 node_reference; + u64 page1_base_address; +}; + +struct iort_its_msi_chip { + struct list_head list; + struct fwnode_handle *fw_node; + phys_addr_t base_addr; + u32 translation_id; +}; + +struct iort_fwnode { + struct list_head list; + struct acpi_iort_node *iort_node; + struct fwnode_handle *fwnode; +}; + +typedef acpi_status (*iort_find_node_callback)(struct acpi_iort_node *, void *); + +struct iort_pci_alias_info { + struct device *dev; + struct acpi_iort_node *node; +}; + +struct iort_dev_config { + const char *name; + int (*dev_init)(struct acpi_iort_node *); + void (*dev_dma_configure)(struct device *, struct acpi_iort_node *); + int (*dev_count_resources)(struct acpi_iort_node *); + void (*dev_init_resources)(struct resource *, struct acpi_iort_node *); + int (*dev_set_proximity)(struct device *, struct acpi_iort_node *); + int (*dev_add_platdata)(struct platform_device *); +}; + +enum arch_timer_ppi_nr { + ARCH_TIMER_PHYS_SECURE_PPI = 0, + ARCH_TIMER_PHYS_NONSECURE_PPI = 1, + ARCH_TIMER_VIRT_PPI = 2, + ARCH_TIMER_HYP_PPI = 3, + ARCH_TIMER_HYP_VIRT_PPI = 4, + ARCH_TIMER_MAX_TIMER_PPI = 5, +}; + +struct arch_timer_mem_frame { + bool valid; + phys_addr_t cntbase; + size_t size; + int phys_irq; + int virt_irq; +}; + +struct arch_timer_mem { + phys_addr_t cntctlbase; + size_t size; + struct arch_timer_mem_frame frame[8]; +}; + +struct acpi_table_gtdt { + struct acpi_table_header header; + u64 counter_block_addresss; + u32 reserved; + u32 secure_el1_interrupt; + u32 secure_el1_flags; + u32 non_secure_el1_interrupt; + u32 non_secure_el1_flags; + u32 virtual_timer_interrupt; + u32 virtual_timer_flags; + u32 non_secure_el2_interrupt; + u32 non_secure_el2_flags; + u64 counter_read_block_address; + u32 platform_timer_count; + u32 platform_timer_offset; +} __attribute__((packed)); + +struct acpi_gtdt_header { + u8 type; + u16 length; +} __attribute__((packed)); + +enum acpi_gtdt_type { + ACPI_GTDT_TYPE_TIMER_BLOCK = 0, + ACPI_GTDT_TYPE_WATCHDOG = 1, + ACPI_GTDT_TYPE_RESERVED = 2, +}; + +struct acpi_gtdt_timer_block { + struct acpi_gtdt_header header; + u8 reserved; + u64 block_address; + u32 timer_count; + u32 timer_offset; +} __attribute__((packed)); + +struct acpi_gtdt_timer_entry { + u8 frame_number; + u8 reserved[3]; + u64 base_address; + u64 el0_base_address; + u32 timer_interrupt; + u32 timer_flags; + u32 virtual_timer_interrupt; + u32 virtual_timer_flags; + u32 common_flags; +} __attribute__((packed)); + +struct acpi_gtdt_watchdog { + struct acpi_gtdt_header header; + u8 reserved; + u64 refresh_frame_address; + u64 control_frame_address; + u32 timer_interrupt; + u32 timer_flags; +} __attribute__((packed)); + +struct acpi_gtdt_descriptor { + struct acpi_table_gtdt *gtdt; + void *gtdt_end; + void *platform_timer; +}; + +struct acpi_table_viot { + struct acpi_table_header header; + u16 node_count; + u16 node_offset; + u8 reserved[8]; +}; + +struct acpi_viot_header { + u8 type; + u8 reserved; + u16 length; +}; + +enum acpi_viot_node_type { + ACPI_VIOT_NODE_PCI_RANGE = 1, + ACPI_VIOT_NODE_MMIO = 2, + ACPI_VIOT_NODE_VIRTIO_IOMMU_PCI = 3, + ACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO = 4, + ACPI_VIOT_RESERVED = 5, +}; + +struct acpi_viot_pci_range { + struct acpi_viot_header header; + u32 endpoint_start; + u16 segment_start; + u16 segment_end; + u16 bdf_start; + u16 bdf_end; + u16 output_node; + u8 reserved[6]; +}; + +struct acpi_viot_mmio { + struct acpi_viot_header header; + u32 endpoint; + u64 base_address; + u16 output_node; + u8 reserved[6]; +}; + +struct acpi_viot_virtio_iommu_pci { + struct acpi_viot_header header; + u16 segment; + u16 bdf; + u8 reserved[8]; +}; + +struct acpi_viot_virtio_iommu_mmio { + struct acpi_viot_header header; + u8 reserved[4]; + u64 base_address; +}; + +struct viot_iommu { + unsigned int offset; + struct fwnode_handle *fwnode; + struct list_head list; +}; + +struct viot_endpoint { + union { + struct { + u16 segment_start; + u16 segment_end; + u16 bdf_start; + u16 bdf_end; + }; + u64 address; + }; + u32 endpoint_id; + struct viot_iommu *viommu; + struct list_head list; +}; + +struct pnp_device_id { + __u8 id[8]; + kernel_ulong_t driver_data; +}; + +struct pnp_card_device_id { + __u8 id[8]; + kernel_ulong_t driver_data; + struct { + __u8 id[8]; + } devs[8]; +}; + +struct pnp_protocol; + +struct pnp_id; + +struct pnp_card { + struct device dev; + unsigned char number; + struct list_head global_list; + struct list_head protocol_list; + struct list_head devices; + struct pnp_protocol *protocol; + struct pnp_id *id; + char name[50]; + unsigned char pnpver; + unsigned char productver; + unsigned int serial; + unsigned char checksum; + struct proc_dir_entry *procdir; +}; + +struct pnp_dev; + +struct pnp_protocol { + struct list_head protocol_list; + char *name; + int (*get)(struct pnp_dev *); + int (*set)(struct pnp_dev *); + int (*disable)(struct pnp_dev *); + bool (*can_wakeup)(struct pnp_dev *); + int (*suspend)(struct pnp_dev *, pm_message_t); + int (*resume)(struct pnp_dev *); + unsigned char number; + struct device dev; + struct list_head cards; + struct list_head devices; +}; + +struct pnp_id { + char id[8]; + struct pnp_id *next; +}; + +struct pnp_card_driver; + +struct pnp_card_link { + struct pnp_card *card; + struct pnp_card_driver *driver; + void *driver_data; + pm_message_t pm_state; +}; + +struct pnp_driver { + const char *name; + const struct pnp_device_id *id_table; + unsigned int flags; + int (*probe)(struct pnp_dev *, const struct pnp_device_id *); + void (*remove)(struct pnp_dev *); + void (*shutdown)(struct pnp_dev *); + int (*suspend)(struct pnp_dev *, pm_message_t); + int (*resume)(struct pnp_dev *); + struct device_driver driver; +}; + +struct pnp_card_driver { + struct list_head global_list; + char *name; + const struct pnp_card_device_id *id_table; + unsigned int flags; + int (*probe)(struct pnp_card_link *, const struct pnp_card_device_id *); + void (*remove)(struct pnp_card_link *); + int (*suspend)(struct pnp_card_link *, pm_message_t); + int (*resume)(struct pnp_card_link *); + struct pnp_driver link; +}; + +struct pnp_dev { + struct device dev; + u64 dma_mask; + unsigned int number; + int status; + struct list_head global_list; + struct list_head protocol_list; + struct list_head card_list; + struct list_head rdev_list; + struct pnp_protocol *protocol; + struct pnp_card *card; + struct pnp_driver *driver; + struct pnp_card_link *card_link; + struct pnp_id *id; + int active; + int capabilities; + unsigned int num_dependent_sets; + struct list_head resources; + struct list_head options; + char name[50]; + int flags; + struct proc_dir_entry *procent; + void *data; +}; + +struct pnp_resource { + struct list_head list; + struct resource res; +}; + +struct pnp_port { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t size; + unsigned char flags; +}; + +typedef struct { + long unsigned int bits[4]; +} pnp_irq_mask_t; + +struct pnp_irq { + pnp_irq_mask_t map; + unsigned char flags; +}; + +struct pnp_dma { + unsigned char map; + unsigned char flags; +}; + +struct pnp_mem { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t size; + unsigned char flags; +}; + +struct pnp_option { + struct list_head list; + unsigned int flags; + long unsigned int type; + union { + struct pnp_port port; + struct pnp_irq irq; + struct pnp_dma dma; + struct pnp_mem mem; + } u; +}; + +struct pnp_info_buffer { + char *buffer; + char *curr; + long unsigned int size; + long unsigned int len; + int stop; + int error; +}; + +typedef struct pnp_info_buffer pnp_info_buffer_t; + +struct pnp_fixup { + char id[7]; + void (*quirk_function)(struct pnp_dev *); +}; + +struct acpipnp_parse_option_s { + struct pnp_dev *dev; + unsigned int option_flags; +}; + +struct deferred_device { + struct amba_device *dev; + struct resource *parent; + struct list_head node; +}; + +struct find_data { + struct amba_device *dev; + struct device *parent; + const char *busid; + unsigned int id; + unsigned int mask; +}; + +struct tegra_ahb { + void *regs; + struct device *dev; + u32 ctx[0]; +}; + +struct clk_bulk_devres { + struct clk_bulk_data *clks; + int num_clks; +}; + +struct clk_hw; + +struct clk_lookup { + struct list_head node; + const char *dev_id; + const char *con_id; + struct clk *clk; + struct clk_hw *clk_hw; +}; + +struct clk_init_data; + +struct clk_hw { + struct clk_core *core; + struct clk *clk; + const struct clk_init_data *init; +}; + +struct clk_rate_request { + long unsigned int rate; + long unsigned int min_rate; + long unsigned int max_rate; + long unsigned int best_parent_rate; + struct clk_hw *best_parent_hw; +}; + +struct clk_duty { + unsigned int num; + unsigned int den; +}; + +struct clk_ops { + int (*prepare)(struct clk_hw *); + void (*unprepare)(struct clk_hw *); + int (*is_prepared)(struct clk_hw *); + void (*unprepare_unused)(struct clk_hw *); + int (*enable)(struct clk_hw *); + void (*disable)(struct clk_hw *); + int (*is_enabled)(struct clk_hw *); + void (*disable_unused)(struct clk_hw *); + int (*save_context)(struct clk_hw *); + void (*restore_context)(struct clk_hw *); + long unsigned int (*recalc_rate)(struct clk_hw *, long unsigned int); + long int (*round_rate)(struct clk_hw *, long unsigned int, long unsigned int *); + int (*determine_rate)(struct clk_hw *, struct clk_rate_request *); + int (*set_parent)(struct clk_hw *, u8); + u8 (*get_parent)(struct clk_hw *); + int (*set_rate)(struct clk_hw *, long unsigned int, long unsigned int); + int (*set_rate_and_parent)(struct clk_hw *, long unsigned int, long unsigned int, u8); + long unsigned int (*recalc_accuracy)(struct clk_hw *, long unsigned int); + int (*get_phase)(struct clk_hw *); + int (*set_phase)(struct clk_hw *, int); + int (*get_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*set_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*init)(struct clk_hw *); + void (*terminate)(struct clk_hw *); + void (*debug_init)(struct clk_hw *, struct dentry *); +}; + +struct clk_parent_data { + const struct clk_hw *hw; + const char *fw_name; + const char *name; + int index; +}; + +struct clk_init_data { + const char *name; + const struct clk_ops *ops; + const char * const *parent_names; + const struct clk_parent_data *parent_data; + const struct clk_hw **parent_hws; + u8 num_parents; + long unsigned int flags; +}; + +struct clk_lookup_alloc { + struct clk_lookup cl; + char dev_id[20]; + char con_id[16]; +}; + +struct clk_notifier { + struct clk *clk; + struct srcu_notifier_head notifier_head; + struct list_head node; +}; + +struct clk_notifier_data { + struct clk *clk; + long unsigned int old_rate; + long unsigned int new_rate; +}; + +struct clk_parent_map; + +struct clk_core { + const char *name; + const struct clk_ops *ops; + struct clk_hw *hw; + struct module *owner; + struct device *dev; + struct device_node *of_node; + struct clk_core *parent; + struct clk_parent_map *parents; + u8 num_parents; + u8 new_parent_index; + long unsigned int rate; + long unsigned int req_rate; + long unsigned int new_rate; + struct clk_core *new_parent; + struct clk_core *new_child; + long unsigned int flags; + bool orphan; + bool rpm_enabled; + unsigned int enable_count; + unsigned int prepare_count; + unsigned int protect_count; + long unsigned int min_rate; + long unsigned int max_rate; + long unsigned int accuracy; + int phase; + struct clk_duty duty; + struct hlist_head children; + struct hlist_node child_node; + struct hlist_head clks; + unsigned int notifier_count; + struct dentry *dentry; + struct hlist_node debug_node; + struct kref ref; +}; + +struct clk_onecell_data { + struct clk **clks; + unsigned int clk_num; +}; + +struct clk_hw_onecell_data { + unsigned int num; + struct clk_hw *hws[0]; +}; + +struct clk_parent_map { + const struct clk_hw *hw; + struct clk_core *core; + const char *fw_name; + const char *name; + int index; +}; + +struct trace_event_raw_clk { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_clk_rate { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int rate; + char __data[0]; +}; + +struct trace_event_raw_clk_rate_range { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int min; + long unsigned int max; + char __data[0]; +}; + +struct trace_event_raw_clk_parent { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_pname; + char __data[0]; +}; + +struct trace_event_raw_clk_phase { + struct trace_entry ent; + u32 __data_loc_name; + int phase; + char __data[0]; +}; + +struct trace_event_raw_clk_duty_cycle { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int num; + unsigned int den; + char __data[0]; +}; + +struct trace_event_data_offsets_clk { + u32 name; +}; + +struct trace_event_data_offsets_clk_rate { + u32 name; +}; + +struct trace_event_data_offsets_clk_rate_range { + u32 name; +}; + +struct trace_event_data_offsets_clk_parent { + u32 name; + u32 pname; +}; + +struct trace_event_data_offsets_clk_phase { + u32 name; +}; + +struct trace_event_data_offsets_clk_duty_cycle { + u32 name; +}; + +typedef void (*btf_trace_clk_enable)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_enable_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_disable)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_disable_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_prepare)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_prepare_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_unprepare)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_unprepare_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_set_rate)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_rate_complete)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_min_rate)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_max_rate)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_rate_range)(void *, struct clk_core *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_clk_set_parent)(void *, struct clk_core *, struct clk_core *); + +typedef void (*btf_trace_clk_set_parent_complete)(void *, struct clk_core *, struct clk_core *); + +typedef void (*btf_trace_clk_set_phase)(void *, struct clk_core *, int); + +typedef void (*btf_trace_clk_set_phase_complete)(void *, struct clk_core *, int); + +typedef void (*btf_trace_clk_set_duty_cycle)(void *, struct clk_core *, struct clk_duty *); + +typedef void (*btf_trace_clk_set_duty_cycle_complete)(void *, struct clk_core *, struct clk_duty *); + +struct clk_notifier_devres { + struct clk *clk; + struct notifier_block *nb; +}; + +struct of_clk_provider { + struct list_head link; + struct device_node *node; + struct clk * (*get)(struct of_phandle_args *, void *); + struct clk_hw * (*get_hw)(struct of_phandle_args *, void *); + void *data; +}; + +struct clock_provider { + void (*clk_init_cb)(struct device_node *); + struct device_node *np; + struct list_head node; +}; + +struct clk_div_table { + unsigned int val; + unsigned int div; +}; + +struct clk_divider { + struct clk_hw hw; + void *reg; + u8 shift; + u8 width; + u8 flags; + const struct clk_div_table *table; + spinlock_t *lock; +}; + +typedef void (*of_init_fn_1)(struct device_node *); + +struct clk_fixed_factor { + struct clk_hw hw; + unsigned int mult; + unsigned int div; +}; + +struct clk_fixed_rate { + struct clk_hw hw; + long unsigned int fixed_rate; + long unsigned int fixed_accuracy; + long unsigned int flags; +}; + +struct clk_gate { + struct clk_hw hw; + void *reg; + u8 bit_idx; + u8 flags; + spinlock_t *lock; +}; + +struct clk_multiplier { + struct clk_hw hw; + void *reg; + u8 shift; + u8 width; + u8 flags; + spinlock_t *lock; +}; + +struct clk_mux { + struct clk_hw hw; + void *reg; + u32 *table; + u32 mask; + u8 shift; + u8 flags; + spinlock_t *lock; +}; + +struct clk_composite { + struct clk_hw hw; + struct clk_ops ops; + struct clk_hw *mux_hw; + struct clk_hw *rate_hw; + struct clk_hw *gate_hw; + const struct clk_ops *mux_ops; + const struct clk_ops *rate_ops; + const struct clk_ops *gate_ops; +}; + +struct clk_fractional_divider { + struct clk_hw hw; + void *reg; + u8 mshift; + u8 mwidth; + u32 mmask; + u8 nshift; + u8 nwidth; + u32 nmask; + u8 flags; + void (*approximation)(struct clk_hw *, long unsigned int, long unsigned int *, long unsigned int *, long unsigned int *); + spinlock_t *lock; +}; + +struct clk_gpio { + struct clk_hw hw; + struct gpio_desc *gpiod; +}; + +struct bm1880_clock_data { + void *pll_base; + void *sys_base; + struct clk_hw_onecell_data hw_data; +}; + +struct bm1880_gate_clock { + unsigned int id; + const char *name; + const char *parent; + u32 gate_reg; + s8 gate_shift; + long unsigned int flags; +}; + +struct bm1880_mux_clock { + unsigned int id; + const char *name; + const char * const *parents; + s8 num_parents; + u32 reg; + s8 shift; + long unsigned int flags; +}; + +struct bm1880_div_clock { + unsigned int id; + const char *name; + u32 reg; + u8 shift; + u8 width; + u32 initval; + const struct clk_div_table *table; + long unsigned int flags; +}; + +struct bm1880_div_hw_clock { + struct bm1880_div_clock div; + void *base; + spinlock_t *lock; + struct clk_hw hw; + struct clk_init_data init; +}; + +struct bm1880_composite_clock { + unsigned int id; + const char *name; + const char *parent; + const char * const *parents; + unsigned int num_parents; + long unsigned int flags; + u32 gate_reg; + u32 mux_reg; + u32 div_reg; + s8 gate_shift; + s8 mux_shift; + s8 div_shift; + s8 div_width; + s16 div_initval; + const struct clk_div_table *table; +}; + +struct bm1880_pll_clock { + unsigned int id; + const char *name; + u32 reg; + long unsigned int flags; +}; + +struct bm1880_pll_hw_clock { + struct bm1880_pll_clock pll; + void *base; + struct clk_hw hw; + struct clk_init_data init; +}; + +struct s5_hw_clk { + struct clk_hw hw; + void *reg; +}; + +struct s5_clk_data { + void *base; + struct s5_hw_clk s5_hw[9]; +}; + +struct s5_pll_conf { + long unsigned int freq; + u8 div; + bool rot_ena; + u8 rot_sel; + u8 rot_dir; + u8 pre_div; +}; + +struct fsl_sai_clk { + struct clk_divider div; + struct clk_gate gate; + spinlock_t lock; +}; + +struct ccsr_guts { + u32 porpllsr; + u32 porbmsr; + u32 porimpscr; + u32 pordevsr; + u32 pordbgmsr; + u32 pordevsr2; + u8 res018[8]; + u32 porcir; + u8 res024[12]; + u32 gpiocr; + u8 res034[12]; + u32 gpoutdr; + u8 res044[12]; + u32 gpindr; + u8 res054[12]; + u32 pmuxcr; + u32 pmuxcr2; + u32 dmuxcr; + u8 res06c[4]; + u32 devdisr; + u32 devdisr2; + u8 res078[4]; + u32 pmjcr; + u32 powmgtcsr; + u32 pmrccr; + u32 pmpdccr; + u32 pmcdr; + u32 mcpsumr; + u32 rstrscr; + u32 ectrstcr; + u32 autorstsr; + u32 pvr; + u32 svr; + u8 res0a8[8]; + u32 rstcr; + u8 res0b4[12]; + u32 iovselsr; + u8 res0c4[60]; + u32 rcwsr[16]; + u8 res140[228]; + u32 iodelay1; + u32 iodelay2; + u8 res22c[984]; + u32 pamubypenr; + u8 res608[504]; + u32 clkdvdr; + u8 res804[252]; + u32 ircr; + u8 res904[4]; + u32 dmacr; + u8 res90c[8]; + u32 elbccr; + u8 res918[520]; + u32 ddr1clkdr; + u32 ddr2clkdr; + u32 ddrclkdr; + u8 resb2c[724]; + u32 clkocr; + u8 rese04[12]; + u32 ddrdllcr; + u8 rese14[12]; + u32 lbcdllcr; + u32 cpfor; + u8 rese28[220]; + u32 srds1cr0; + u32 srds1cr1; + u8 resf0c[32]; + u32 itcr; + u8 resf30[16]; + u32 srds2cr0; + u32 srds2cr1; +}; + +struct clockgen_pll_div { + struct clk *clk; + char name[32]; +}; + +struct clockgen_pll { + struct clockgen_pll_div div[32]; +}; + +struct clockgen_sourceinfo { + u32 flags; + int pll; + int div; +}; + +struct clockgen_muxinfo { + struct clockgen_sourceinfo clksel[16]; +}; + +struct clockgen; + +struct clockgen_chipinfo { + const char *compat; + const char *guts_compat; + const struct clockgen_muxinfo *cmux_groups[2]; + const struct clockgen_muxinfo *hwaccel[5]; + void (*init_periph)(struct clockgen *); + int cmux_to_group[9]; + u32 pll_mask; + u32 flags; +}; + +struct clockgen { + struct device_node *node; + void *regs; + struct clockgen_chipinfo info; + struct clk *sysclk; + struct clk *coreclk; + struct clockgen_pll pll[6]; + struct clk *cmux[8]; + struct clk *hwaccel[5]; + struct clk *fman[2]; + struct ccsr_guts *guts; +}; + +struct mux_hwclock { + struct clk_hw hw; + struct clockgen *cg; + const struct clockgen_muxinfo *info; + u32 *reg; + u8 parent_to_clksel[16]; + s8 clksel_to_parent[16]; + int num_parents; +}; + +enum xgene_pll_type { + PLL_TYPE_PCP = 0, + PLL_TYPE_SOC = 1, +}; + +struct xgene_clk_pll { + struct clk_hw hw; + void *reg; + spinlock_t *lock; + u32 pll_offset; + enum xgene_pll_type type; + int version; +}; + +struct xgene_clk_pmd { + struct clk_hw hw; + void *reg; + u8 shift; + u32 mask; + u64 denom; + u32 flags; + spinlock_t *lock; +}; + +struct xgene_dev_parameters { + void *csr_reg; + u32 reg_clk_offset; + u32 reg_clk_mask; + u32 reg_csr_offset; + u32 reg_csr_mask; + void *divider_reg; + u32 reg_divider_offset; + u32 reg_divider_shift; + u32 reg_divider_width; +}; + +struct xgene_clk { + struct clk_hw hw; + spinlock_t *lock; + struct xgene_dev_parameters param; +}; + +struct owl_clk_common { + struct regmap *regmap; + struct clk_hw hw; +}; + +struct owl_reset_map; + +struct owl_clk_desc { + struct owl_clk_common **clks; + long unsigned int num_clks; + struct clk_hw_onecell_data *hw_clks; + const struct owl_reset_map *resets; + long unsigned int num_resets; + struct regmap *regmap; +}; + +struct owl_reset_map { + u32 reg; + u32 bit; +}; + +struct owl_gate_hw { + u32 reg; + u8 bit_idx; + u8 gate_flags; +}; + +struct owl_gate { + struct owl_gate_hw gate_hw; + struct owl_clk_common common; +}; + +struct owl_mux_hw { + u32 reg; + u8 shift; + u8 width; +}; + +struct owl_mux { + struct owl_mux_hw mux_hw; + struct owl_clk_common common; +}; + +struct owl_divider_hw { + u32 reg; + u8 shift; + u8 width; + u8 div_flags; + struct clk_div_table *table; +}; + +struct owl_divider { + struct owl_divider_hw div_hw; + struct owl_clk_common common; +}; + +struct clk_factor_table { + unsigned int val; + unsigned int mul; + unsigned int div; +}; + +struct owl_factor_hw { + u32 reg; + u8 shift; + u8 width; + u8 fct_flags; + struct clk_factor_table *table; +}; + +struct owl_factor { + struct owl_factor_hw factor_hw; + struct owl_clk_common common; +}; + +union owl_rate { + struct owl_divider_hw div_hw; + struct owl_factor_hw factor_hw; + struct clk_fixed_factor fix_fact_hw; +}; + +struct owl_composite { + struct owl_mux_hw mux_hw; + struct owl_gate_hw gate_hw; + union owl_rate rate; + const struct clk_ops *fix_fact_ops; + struct owl_clk_common common; +}; + +struct clk_pll_table { + unsigned int val; + long unsigned int rate; +}; + +struct owl_pll_hw { + u32 reg; + u32 bfreq; + u8 bit_idx; + u8 shift; + u8 width; + u8 min_mul; + u8 max_mul; + u8 delay; + const struct clk_pll_table *table; +}; + +struct owl_pll { + struct owl_pll_hw pll_hw; + struct owl_clk_common common; +}; + +struct reset_controller_dev; + +struct reset_control_ops { + int (*reset)(struct reset_controller_dev *, long unsigned int); + int (*assert)(struct reset_controller_dev *, long unsigned int); + int (*deassert)(struct reset_controller_dev *, long unsigned int); + int (*status)(struct reset_controller_dev *, long unsigned int); +}; + +struct reset_controller_dev { + const struct reset_control_ops *ops; + struct module *owner; + struct list_head list; + struct list_head reset_control_head; + struct device *dev; + struct device_node *of_node; + int of_reset_n_cells; + int (*of_xlate)(struct reset_controller_dev *, const struct of_phandle_args *); + unsigned int nr_resets; +}; + +struct owl_reset { + struct reset_controller_dev rcdev; + const struct owl_reset_map *reset_map; + struct regmap *regmap; +}; + +enum iproc_arm_pll_fid { + ARM_PLL_FID_CRYSTAL_CLK = 0, + ARM_PLL_FID_SYS_CLK = 2, + ARM_PLL_FID_CH0_SLOW_CLK = 6, + ARM_PLL_FID_CH1_FAST_CLK = 7, +}; + +struct iproc_arm_pll { + struct clk_hw hw; + void *base; + long unsigned int rate; +}; + +struct iproc_pll_vco_param { + long unsigned int rate; + unsigned int ndiv_int; + unsigned int ndiv_frac; + unsigned int pdiv; +}; + +struct iproc_clk_reg_op { + unsigned int offset; + unsigned int shift; + unsigned int width; +}; + +struct iproc_asiu_gate { + unsigned int offset; + unsigned int en_shift; +}; + +struct iproc_pll_aon_pwr_ctrl { + unsigned int offset; + unsigned int pwr_width; + unsigned int pwr_shift; + unsigned int iso_shift; +}; + +struct iproc_pll_reset_ctrl { + unsigned int offset; + unsigned int reset_shift; + unsigned int p_reset_shift; +}; + +struct iproc_pll_dig_filter_ctrl { + unsigned int offset; + unsigned int ki_shift; + unsigned int ki_width; + unsigned int kp_shift; + unsigned int kp_width; + unsigned int ka_shift; + unsigned int ka_width; +}; + +struct iproc_pll_sw_ctrl { + unsigned int offset; + unsigned int shift; +}; + +struct iproc_pll_vco_ctrl { + unsigned int u_offset; + unsigned int l_offset; +}; + +struct iproc_pll_ctrl { + long unsigned int flags; + struct iproc_pll_aon_pwr_ctrl aon; + struct iproc_asiu_gate asiu; + struct iproc_pll_reset_ctrl reset; + struct iproc_pll_dig_filter_ctrl dig_filter; + struct iproc_pll_sw_ctrl sw_ctrl; + struct iproc_clk_reg_op ndiv_int; + struct iproc_clk_reg_op ndiv_frac; + struct iproc_clk_reg_op pdiv; + struct iproc_pll_vco_ctrl vco_ctrl; + struct iproc_clk_reg_op status; + struct iproc_clk_reg_op macro_mode; +}; + +struct iproc_clk_enable_ctrl { + unsigned int offset; + unsigned int enable_shift; + unsigned int hold_shift; + unsigned int bypass_shift; +}; + +struct iproc_clk_ctrl { + unsigned int channel; + long unsigned int flags; + struct iproc_clk_enable_ctrl enable; + struct iproc_clk_reg_op mdiv; +}; + +enum kp_band { + KP_BAND_MID = 0, + KP_BAND_HIGH = 1, + KP_BAND_HIGH_HIGH = 2, +}; + +enum vco_freq_range { + VCO_LOW = 700000000, + VCO_MID = 1200000000, + VCO_HIGH = 2200000000, + VCO_HIGH_HIGH = 3100000000, + VCO_MAX = 4000000000, +}; + +struct iproc_pll { + void *status_base; + void *control_base; + void *pwr_base; + void *asiu_base; + const struct iproc_pll_ctrl *ctrl; + const struct iproc_pll_vco_param *vco_param; + unsigned int num_vco_entries; +}; + +struct iproc_clk { + struct clk_hw hw; + struct iproc_pll *pll; + const struct iproc_clk_ctrl *ctrl; +}; + +struct iproc_asiu_div { + unsigned int offset; + unsigned int en_shift; + unsigned int high_shift; + unsigned int high_width; + unsigned int low_shift; + unsigned int low_width; +}; + +struct iproc_asiu; + +struct iproc_asiu_clk { + struct clk_hw hw; + const char *name; + struct iproc_asiu *asiu; + long unsigned int rate; + struct iproc_asiu_div div; + struct iproc_asiu_gate gate; +}; + +struct iproc_asiu { + void *div_base; + void *gate_base; + struct clk_hw_onecell_data *clk_data; + struct iproc_asiu_clk *clks; +}; + +struct bcm2835_cprman { + struct device *dev; + void *regs; + spinlock_t regs_lock; + unsigned int soc; + const char *real_parent_names[7]; + struct clk_hw_onecell_data onecell; +}; + +struct cprman_plat_data { + unsigned int soc; +}; + +struct bcm2835_pll_ana_bits; + +struct bcm2835_pll_data { + const char *name; + u32 cm_ctrl_reg; + u32 a2w_ctrl_reg; + u32 frac_reg; + u32 ana_reg_base; + u32 reference_enable_mask; + u32 lock_mask; + u32 flags; + const struct bcm2835_pll_ana_bits *ana; + long unsigned int min_rate; + long unsigned int max_rate; + long unsigned int max_fb_rate; +}; + +struct bcm2835_pll_ana_bits { + u32 mask0; + u32 set0; + u32 mask1; + u32 set1; + u32 mask3; + u32 set3; + u32 fb_prediv_mask; +}; + +struct bcm2835_pll_divider_data { + const char *name; + const char *source_pll; + u32 cm_reg; + u32 a2w_reg; + u32 load_mask; + u32 hold_mask; + u32 fixed_divider; + u32 flags; +}; + +struct bcm2835_clock_data { + const char *name; + const char * const *parents; + int num_mux_parents; + unsigned int set_rate_parent; + u32 ctl_reg; + u32 div_reg; + u32 int_bits; + u32 frac_bits; + u32 flags; + bool is_vpu_clock; + bool is_mash_clock; + bool low_jitter; + u32 tcnt_mux; +}; + +struct bcm2835_gate_data { + const char *name; + const char *parent; + u32 ctl_reg; +}; + +struct bcm2835_pll { + struct clk_hw hw; + struct bcm2835_cprman *cprman; + const struct bcm2835_pll_data *data; +}; + +struct bcm2835_pll_divider { + struct clk_divider div; + struct bcm2835_cprman *cprman; + const struct bcm2835_pll_divider_data *data; +}; + +struct bcm2835_clock { + struct clk_hw hw; + struct bcm2835_cprman *cprman; + const struct bcm2835_clock_data *data; +}; + +struct bcm2835_clk_desc { + struct clk_hw * (*clk_register)(struct bcm2835_cprman *, const void *); + unsigned int supported; + const void *data; +}; + +struct berlin2_avpll_vco { + struct clk_hw hw; + void *base; + u8 flags; +}; + +struct berlin2_avpll_channel { + struct clk_hw hw; + void *base; + u8 flags; + u8 index; +}; + +struct berlin2_pll_map { + const u8 vcodiv[16]; + u8 mult; + u8 fbdiv_shift; + u8 rfdiv_shift; + u8 divsel_shift; +}; + +struct berlin2_pll { + struct clk_hw hw; + void *base; + struct berlin2_pll_map map; +}; + +struct berlin2_div_map { + u16 pll_select_offs; + u16 pll_switch_offs; + u16 div_select_offs; + u16 div_switch_offs; + u16 div3_switch_offs; + u16 gate_offs; + u8 pll_select_shift; + u8 pll_switch_shift; + u8 div_select_shift; + u8 div_switch_shift; + u8 div3_switch_shift; + u8 gate_shift; +}; + +struct berlin2_div { + struct clk_hw hw; + void *base; + struct berlin2_div_map map; + spinlock_t *lock; +}; + +struct hisi_clock_data { + struct clk_onecell_data clk_data; + void *base; +}; + +struct hisi_fixed_rate_clock { + unsigned int id; + char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int fixed_rate; +}; + +struct hisi_fixed_factor_clock { + unsigned int id; + char *name; + const char *parent_name; + long unsigned int mult; + long unsigned int div; + long unsigned int flags; +}; + +struct hisi_mux_clock { + unsigned int id; + const char *name; + const char * const *parent_names; + u8 num_parents; + long unsigned int flags; + long unsigned int offset; + u8 shift; + u8 width; + u8 mux_flags; + const u32 *table; + const char *alias; +}; + +struct hisi_phase_clock { + unsigned int id; + const char *name; + const char *parent_names; + long unsigned int flags; + long unsigned int offset; + u8 shift; + u8 width; + u32 *phase_degrees; + u32 *phase_regvals; + u8 phase_num; +}; + +struct hisi_divider_clock { + unsigned int id; + const char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int offset; + u8 shift; + u8 width; + u8 div_flags; + struct clk_div_table *table; + const char *alias; +}; + +struct hi6220_divider_clock { + unsigned int id; + const char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int offset; + u8 shift; + u8 width; + u32 mask_bit; + const char *alias; +}; + +struct hisi_gate_clock { + unsigned int id; + const char *name; + const char *parent_name; + long unsigned int flags; + long unsigned int offset; + u8 bit_idx; + u8 gate_flags; + const char *alias; +}; + +struct clkgate_separated { + struct clk_hw hw; + void *enable; + u8 bit_idx; + u8 flags; + spinlock_t *lock; +}; + +struct hi6220_clk_divider { + struct clk_hw hw; + void *reg; + u8 shift; + u8 width; + u32 mask; + const struct clk_div_table *table; + spinlock_t *lock; +}; + +struct clk_hisi_phase { + struct clk_hw hw; + void *reg; + u32 *phase_degrees; + u32 *phase_regvals; + u8 phase_num; + u32 mask; + u8 shift; + u8 flags; + spinlock_t *lock; +}; + +struct hisi_crg_funcs { + struct hisi_clock_data * (*register_clks)(struct platform_device *); + void (*unregister_clks)(struct platform_device *); +}; + +struct hisi_reset_controller; + +struct hisi_crg_dev { + struct hisi_clock_data *clk_data; + struct hisi_reset_controller *rstc; + const struct hisi_crg_funcs *funcs; +}; + +struct hi3559av100_pll_clock { + u32 id; + const char *name; + const char *parent_name; + const u32 ctrl_reg1; + const u8 frac_shift; + const u8 frac_width; + const u8 postdiv1_shift; + const u8 postdiv1_width; + const u8 postdiv2_shift; + const u8 postdiv2_width; + const u32 ctrl_reg2; + const u8 fbdiv_shift; + const u8 fbdiv_width; + const u8 refdiv_shift; + const u8 refdiv_width; +}; + +struct hi3559av100_clk_pll { + struct clk_hw hw; + u32 id; + void *ctrl_reg1; + u8 frac_shift; + u8 frac_width; + u8 postdiv1_shift; + u8 postdiv1_width; + u8 postdiv2_shift; + u8 postdiv2_width; + void *ctrl_reg2; + u8 fbdiv_shift; + u8 fbdiv_width; + u8 refdiv_shift; + u8 refdiv_width; +}; + +struct hisi_reset_controller___2 { + spinlock_t lock; + void *membase; + struct reset_controller_dev rcdev; +}; + +struct mbox_chan___2; + +struct hi6220_stub_clk { + u32 id; + struct device *dev; + struct clk_hw hw; + struct regmap *dfs_map; + struct mbox_client cl; + struct mbox_chan___2 *mbox; +}; + +struct hi6220_mbox_msg { + unsigned char type; + unsigned char cmd; + unsigned char obj; + unsigned char src; + unsigned char para[4]; +}; + +union hi6220_mbox_data { + unsigned int data[8]; + struct hi6220_mbox_msg msg; +}; + +struct hi3660_stub_clk_chan { + struct mbox_client cl; + struct mbox_chan___2 *mbox; +}; + +struct hi3660_stub_clk { + unsigned int id; + struct clk_hw hw; + unsigned int cmd; + unsigned int msg[8]; + unsigned int rate; +}; + +struct clk_busy_divider { + struct clk_divider div; + const struct clk_ops *div_ops; + void *reg; + u8 shift; +}; + +struct clk_busy_mux { + struct clk_mux mux; + const struct clk_ops *mux_ops; + void *reg; + u8 shift; +}; + +struct clk_cpu { + struct clk_hw hw; + struct clk *div; + struct clk *mux; + struct clk *pll; + struct clk *step; +}; + +struct clk_divider_gate { + struct clk_divider divider; + u32 cached_val; +}; + +struct clk_fixup_div { + struct clk_divider divider; + const struct clk_ops *ops; + void (*fixup)(u32 *); +}; + +struct clk_fixup_mux { + struct clk_mux mux; + const struct clk_ops *ops; + void (*fixup)(u32 *); +}; + +struct clk_frac_pll { + struct clk_hw hw; + void *base; +}; + +struct clk_gate2 { + struct clk_hw hw; + void *reg; + u8 bit_idx; + u8 cgr_val; + u8 cgr_mask; + u8 flags; + spinlock_t *lock; + unsigned int *share_count; +}; + +struct clk_gate_exclusive { + struct clk_gate gate; + u32 exclusive_mask; +}; + +struct clk_pfd { + struct clk_hw hw; + void *reg; + u8 idx; +}; + +enum imx_pfdv2_type { + IMX_PFDV2_IMX7ULP = 0, + IMX_PFDV2_IMX8ULP = 1, +}; + +struct clk_pfdv2 { + struct clk_hw hw; + void *reg; + u8 gate_bit; + u8 vld_bit; + u8 frac_off; +}; + +enum imx_pllv1_type { + IMX_PLLV1_IMX1 = 0, + IMX_PLLV1_IMX21 = 1, + IMX_PLLV1_IMX25 = 2, + IMX_PLLV1_IMX27 = 3, + IMX_PLLV1_IMX31 = 4, + IMX_PLLV1_IMX35 = 5, +}; + +struct clk_pllv1 { + struct clk_hw hw; + void *base; + enum imx_pllv1_type type; +}; + +struct clk_pllv2 { + struct clk_hw hw; + void *base; +}; + +enum imx_pllv3_type { + IMX_PLLV3_GENERIC = 0, + IMX_PLLV3_SYS = 1, + IMX_PLLV3_USB = 2, + IMX_PLLV3_USB_VF610 = 3, + IMX_PLLV3_AV = 4, + IMX_PLLV3_ENET = 5, + IMX_PLLV3_ENET_IMX7 = 6, + IMX_PLLV3_SYS_VF610 = 7, + IMX_PLLV3_DDR_IMX7 = 8, + IMX_PLLV3_AV_IMX7 = 9, +}; + +struct clk_pllv3 { + struct clk_hw hw; + void *base; + u32 power_bit; + bool powerup_set; + u32 div_mask; + u32 div_shift; + long unsigned int ref_clock; + u32 num_offset; + u32 denom_offset; +}; + +struct clk_pllv3_vf610_mf { + u32 mfi; + u32 mfn; + u32 mfd; +}; + +enum imx_pllv4_type { + IMX_PLLV4_IMX7ULP = 0, + IMX_PLLV4_IMX8ULP = 1, +}; + +struct clk_pllv4 { + struct clk_hw hw; + void *base; + u32 cfg_offset; + u32 num_offset; + u32 denom_offset; +}; + +enum imx_pll14xx_type { + PLL_1416X = 0, + PLL_1443X = 1, +}; + +struct imx_pll14xx_rate_table { + unsigned int rate; + unsigned int pdiv; + unsigned int mdiv; + unsigned int sdiv; + unsigned int kdiv; +}; + +struct imx_pll14xx_clk { + enum imx_pll14xx_type type; + const struct imx_pll14xx_rate_table *rate_table; + int rate_count; + int flags; +}; + +struct clk_pll14xx { + struct clk_hw hw; + void *base; + enum imx_pll14xx_type type; + const struct imx_pll14xx_rate_table *rate_table; + int rate_count; +}; + +struct clk_sscg_pll_setup { + int divr1; + int divf1; + int divr2; + int divf2; + int divq; + int bypass; + uint64_t vco1; + uint64_t vco2; + uint64_t fout; + uint64_t ref; + uint64_t ref_div1; + uint64_t ref_div2; + uint64_t fout_request; + int fout_error; +}; + +struct clk_sscg_pll { + struct clk_hw hw; + const struct clk_ops ops; + void *base; + struct clk_sscg_pll_setup setup; + u8 parent; + u8 bypass1; + u8 bypass2; +}; + +struct arm_smccc_quirk { + int id; + union { + long unsigned int a6; + } state; +}; + +enum imx_sc_pm_func { + IMX_SC_PM_FUNC_UNKNOWN = 0, + IMX_SC_PM_FUNC_SET_SYS_POWER_MODE = 19, + IMX_SC_PM_FUNC_SET_PARTITION_POWER_MODE = 1, + IMX_SC_PM_FUNC_GET_SYS_POWER_MODE = 2, + IMX_SC_PM_FUNC_SET_RESOURCE_POWER_MODE = 3, + IMX_SC_PM_FUNC_GET_RESOURCE_POWER_MODE = 4, + IMX_SC_PM_FUNC_REQ_LOW_POWER_MODE = 16, + IMX_SC_PM_FUNC_SET_CPU_RESUME_ADDR = 17, + IMX_SC_PM_FUNC_REQ_SYS_IF_POWER_MODE = 18, + IMX_SC_PM_FUNC_SET_CLOCK_RATE = 5, + IMX_SC_PM_FUNC_GET_CLOCK_RATE = 6, + IMX_SC_PM_FUNC_CLOCK_ENABLE = 7, + IMX_SC_PM_FUNC_SET_CLOCK_PARENT = 14, + IMX_SC_PM_FUNC_GET_CLOCK_PARENT = 15, + IMX_SC_PM_FUNC_RESET = 13, + IMX_SC_PM_FUNC_RESET_REASON = 10, + IMX_SC_PM_FUNC_BOOT = 8, + IMX_SC_PM_FUNC_REBOOT = 9, + IMX_SC_PM_FUNC_REBOOT_PARTITION = 12, + IMX_SC_PM_FUNC_CPU_START = 11, +}; + +struct imx_clk_scu_rsrc_table { + const u32 *rsrc; + u8 num; +}; + +struct imx_scu_clk_node { + const char *name; + u32 rsrc; + u8 clk_type; + const char * const *parents; + int num_parents; + struct clk_hw *hw; + struct list_head node; +}; + +struct clk_scu { + struct clk_hw hw; + u16 rsrc_id; + u8 clk_type; + struct clk_hw *parent; + u8 parent_index; + bool is_enabled; + u32 rate; +}; + +struct clk_gpr_scu { + struct clk_hw hw; + u16 rsrc_id; + u8 gpr_id; + u8 flags; + bool gate_invert; +}; + +struct imx_sc_msg_req_set_clock_rate { + struct imx_sc_rpc_msg hdr; + __le32 rate; + __le16 resource; + u8 clk; +}; + +struct req_get_clock_rate { + __le16 resource; + u8 clk; +}; + +struct resp_get_clock_rate { + __le32 rate; +}; + +struct imx_sc_msg_get_clock_rate { + struct imx_sc_rpc_msg hdr; + union { + struct req_get_clock_rate req; + struct resp_get_clock_rate resp; + } data; +}; + +struct req_get_clock_parent { + __le16 resource; + u8 clk; +}; + +struct resp_get_clock_parent { + u8 parent; +}; + +struct imx_sc_msg_get_clock_parent { + struct imx_sc_rpc_msg hdr; + union { + struct req_get_clock_parent req; + struct resp_get_clock_parent resp; + } data; +}; + +struct imx_sc_msg_set_clock_parent { + struct imx_sc_rpc_msg hdr; + __le16 resource; + u8 clk; + u8 parent; +}; + +struct imx_sc_msg_req_clock_enable { + struct imx_sc_rpc_msg hdr; + __le16 resource; + u8 clk; + u8 enable; + u8 autog; + int: 24; +}; + +struct clk_lpcg_scu { + struct clk_hw hw; + void *reg; + u8 bit_idx; + bool hw_gate; + u32 state; +}; + +struct imx8qxp_lpcg_data { + int id; + char *name; + char *parent; + long unsigned int flags; + u32 offset; + u8 bit_idx; + bool hw_gate; +}; + +struct imx8qxp_ss_lpcg { + const struct imx8qxp_lpcg_data *lpcg; + u8 num_lpcg; + u8 num_max; +}; + +struct ti_syscon_gate_clk_priv { + struct clk_hw hw; + struct regmap *regmap; + u32 reg; + u32 idx; +}; + +struct ti_syscon_gate_clk_data { + char *name; + u32 offset; + u32 bit_idx; +}; + +struct mtk_fixed_clk { + int id; + const char *name; + const char *parent; + long unsigned int rate; +}; + +struct mtk_fixed_factor { + int id; + const char *name; + const char *parent_name; + int mult; + int div; +}; + +struct mtk_composite { + int id; + const char *name; + const char * const *parent_names; + const char *parent; + unsigned int flags; + uint32_t mux_reg; + uint32_t divider_reg; + uint32_t gate_reg; + signed char mux_shift; + signed char mux_width; + signed char gate_shift; + signed char divider_shift; + signed char divider_width; + u8 mux_flags; + signed char num_parents; +}; + +struct mtk_gate_regs { + u32 sta_ofs; + u32 clr_ofs; + u32 set_ofs; +}; + +struct mtk_gate { + int id; + const char *name; + const char *parent_name; + const struct mtk_gate_regs *regs; + int shift; + const struct clk_ops *ops; + long unsigned int flags; +}; + +struct mtk_clk_divider { + int id; + const char *name; + const char *parent_name; + long unsigned int flags; + u32 div_reg; + unsigned char div_shift; + unsigned char div_width; + unsigned char clk_divider_flags; + const struct clk_div_table *clk_div_table; +}; + +struct mtk_clk_desc { + const struct mtk_gate *clks; + size_t num_clks; +}; + +struct mtk_pll_div_table { + u32 div; + long unsigned int freq; +}; + +struct mtk_pll_data { + int id; + const char *name; + u32 reg; + u32 pwr_reg; + u32 en_mask; + u32 pd_reg; + u32 tuner_reg; + u32 tuner_en_reg; + u8 tuner_en_bit; + int pd_shift; + unsigned int flags; + const struct clk_ops *ops; + u32 rst_bar_mask; + long unsigned int fmin; + long unsigned int fmax; + int pcwbits; + int pcwibits; + u32 pcw_reg; + int pcw_shift; + u32 pcw_chg_reg; + const struct mtk_pll_div_table *div_table; + const char *parent_name; + u32 en_reg; + u8 pll_en_bit; +}; + +struct mtk_clk_pll { + struct clk_hw hw; + void *base_addr; + void *pd_addr; + void *pwr_addr; + void *tuner_addr; + void *tuner_en_addr; + void *pcw_addr; + void *pcw_chg_addr; + void *en_addr; + const struct mtk_pll_data *data; +}; + +struct mtk_clk_gate { + struct clk_hw hw; + struct regmap *regmap; + int set_ofs; + int clr_ofs; + int sta_ofs; + u8 bit; +}; + +struct mtk_ref2usb_tx { + struct clk_hw hw; + void *base_addr; +}; + +struct mtk_clk_cpumux { + struct clk_hw hw; + struct regmap *regmap; + u32 reg; + u32 mask; + u8 shift; +}; + +struct mtk_reset { + struct regmap *regmap; + int regofs; + struct reset_controller_dev rcdev; +}; + +struct mtk_mux; + +struct mtk_clk_mux { + struct clk_hw hw; + struct regmap *regmap; + const struct mtk_mux *data; + spinlock_t *lock; + bool reparent; +}; + +struct mtk_mux { + int id; + const char *name; + const char * const *parent_names; + unsigned int flags; + u32 mux_ofs; + u32 set_ofs; + u32 clr_ofs; + u32 upd_ofs; + u8 mux_shift; + u8 mux_width; + u8 gate_shift; + s8 upd_shift; + const struct clk_ops *ops; + signed char num_parents; +}; + +struct clk_mt8167_mm_driver_data { + const struct mtk_gate *gates_clk; + int gates_num; +}; + +struct mtk_clk_usb { + int id; + const char *name; + const char *parent; + u32 reg_ofs; +}; + +struct clk_mt8173_mm_driver_data { + const struct mtk_gate *gates_clk; + int gates_num; +}; + +struct clk_regmap { + struct clk_hw hw; + struct regmap *map; + void *data; +}; + +struct meson_aoclk_data { + const unsigned int reset_reg; + const int num_reset; + const unsigned int *reset; + const int num_clks; + struct clk_regmap **clks; + const struct clk_hw_onecell_data *hw_data; +}; + +struct meson_aoclk_reset_controller { + struct reset_controller_dev reset; + const struct meson_aoclk_data *data; + struct regmap *regmap; +}; + +struct parm { + u16 reg_off; + u8 shift; + u8 width; +}; + +struct meson_clk_cpu_dyndiv_data { + struct parm div; + struct parm dyn; +}; + +struct meson_clk_dualdiv_param { + unsigned int n1; + unsigned int n2; + unsigned int m1; + unsigned int m2; + unsigned int dual; +}; + +struct meson_clk_dualdiv_data { + struct parm n1; + struct parm n2; + struct parm m1; + struct parm m2; + struct parm dual; + const struct meson_clk_dualdiv_param *table; +}; + +struct reg_sequence { + unsigned int reg; + unsigned int def; + unsigned int delay_us; +}; + +struct meson_eeclkc_data { + struct clk_regmap * const *regmap_clks; + unsigned int regmap_clk_num; + const struct reg_sequence *init_regs; + unsigned int init_count; + struct clk_hw_onecell_data *hw_onecell_data; +}; + +struct meson_clk_mpll_data { + struct parm sdm; + struct parm sdm_en; + struct parm n2; + struct parm ssen; + struct parm misc; + const struct reg_sequence *init_regs; + unsigned int init_count; + spinlock_t *lock; + u8 flags; +}; + +struct pll_params_table { + unsigned int m; + unsigned int n; +}; + +struct pll_mult_range { + unsigned int min; + unsigned int max; +}; + +struct meson_clk_pll_data { + struct parm en; + struct parm m; + struct parm n; + struct parm frac; + struct parm l; + struct parm rst; + const struct reg_sequence *init_regs; + unsigned int init_count; + const struct pll_params_table *table; + const struct pll_mult_range *range; + u8 flags; +}; + +struct clk_regmap_gate_data { + unsigned int offset; + u8 bit_idx; + u8 flags; +}; + +struct clk_regmap_div_data { + unsigned int offset; + u8 shift; + u8 width; + u8 flags; + const struct clk_div_table *table; +}; + +struct clk_regmap_mux_data { + unsigned int offset; + u32 *table; + u32 mask; + u8 shift; + u8 flags; +}; + +struct meson_vid_pll_div_data { + struct parm val; + struct parm sel; +}; + +struct vid_pll_div { + unsigned int shift_val; + unsigned int shift_sel; + unsigned int divider; + unsigned int multiplier; +}; + +struct g12a_cpu_clk_postmux_nb_data { + struct notifier_block nb; + struct clk_hw *xtal; + struct clk_hw *cpu_clk_dyn; + struct clk_hw *cpu_clk_postmux0; + struct clk_hw *cpu_clk_postmux1; + struct clk_hw *cpu_clk_premux1; +}; + +struct g12a_sys_pll_nb_data { + struct notifier_block nb; + struct clk_hw *sys_pll; + struct clk_hw *cpu_clk; + struct clk_hw *cpu_clk_dyn; +}; + +struct meson_g12a_data { + const struct meson_eeclkc_data eeclkc_data; + int (*dvfs_setup)(struct platform_device *); +}; + +struct tbg_def { + char *name; + u32 refdiv_offset; + u32 fbdiv_offset; + u32 vcodiv_reg; + u32 vcodiv_offset; +}; + +struct clk_periph_driver_data { + struct clk_hw_onecell_data *hw_data; + spinlock_t lock; + void *reg; + u32 tbg_sel; + u32 div_sel0; + u32 div_sel1; + u32 div_sel2; + u32 clk_sel; + u32 clk_dis; +}; + +struct clk_double_div { + struct clk_hw hw; + void *reg1; + u8 shift1; + void *reg2; + u8 shift2; +}; + +struct clk_pm_cpu { + struct clk_hw hw; + void *reg_mux; + u8 shift_mux; + u32 mask_mux; + void *reg_div; + u8 shift_div; + struct regmap *nb_pm_base; + long unsigned int l1_expiration; +}; + +struct clk_periph_data { + const char *name; + const char * const *parent_names; + int num_parents; + struct clk_hw *mux_hw; + struct clk_hw *rate_hw; + struct clk_hw *gate_hw; + struct clk_hw *muxrate_hw; + bool is_double_div; +}; + +struct cpu_dfs_regs { + unsigned int divider_reg; + unsigned int force_reg; + unsigned int ratio_reg; + unsigned int ratio_state_reg; + unsigned int divider_mask; + unsigned int cluster_offset; + unsigned int force_mask; + int divider_offset; + int divider_ratio; + int ratio_offset; + int ratio_state_offset; + int ratio_state_cluster_offset; +}; + +struct ap_cpu_clk { + unsigned int cluster; + const char *clk_name; + struct device *dev; + struct clk_hw hw; + struct regmap *pll_cr_base; + const struct cpu_dfs_regs *pll_regs; +}; + +enum { + CP110_CLK_TYPE_CORE = 0, + CP110_CLK_TYPE_GATABLE = 1, +}; + +struct cp110_gate_clk { + struct clk_hw hw; + struct regmap *regmap; + u8 bit_idx; +}; + +struct cpg_core_clk { + const char *name; + unsigned int id; + unsigned int type; + unsigned int parent; + unsigned int div; + unsigned int mult; + unsigned int offset; +}; + +enum clk_types { + CLK_TYPE_IN = 0, + CLK_TYPE_FF = 1, + CLK_TYPE_DIV6P1 = 2, + CLK_TYPE_DIV6_RO = 3, + CLK_TYPE_FR = 4, + CLK_TYPE_CUSTOM = 5, +}; + +struct mssr_mod_clk { + const char *name; + unsigned int id; + unsigned int parent; +}; + +enum clk_reg_layout { + CLK_REG_LAYOUT_RCAR_GEN2_AND_GEN3 = 0, + CLK_REG_LAYOUT_RZ_A = 1, + CLK_REG_LAYOUT_RCAR_V3U = 2, +}; + +struct cpg_mssr_info { + const struct cpg_core_clk *early_core_clks; + unsigned int num_early_core_clks; + const struct mssr_mod_clk *early_mod_clks; + unsigned int num_early_mod_clks; + const struct cpg_core_clk *core_clks; + unsigned int num_core_clks; + unsigned int last_dt_core_clk; + unsigned int num_total_core_clks; + enum clk_reg_layout reg_layout; + const struct mssr_mod_clk *mod_clks; + unsigned int num_mod_clks; + unsigned int num_hw_mod_clks; + const unsigned int *crit_mod_clks; + unsigned int num_crit_mod_clks; + const unsigned int *core_pm_clks; + unsigned int num_core_pm_clks; + int (*init)(struct device *); + struct clk * (*cpg_clk_register)(struct device *, const struct cpg_core_clk *, const struct cpg_mssr_info *, struct clk **, void *, struct raw_notifier_head *); +}; + +enum rcar_gen3_clk_types { + CLK_TYPE_GEN3_MAIN = 5, + CLK_TYPE_GEN3_PLL0 = 6, + CLK_TYPE_GEN3_PLL1 = 7, + CLK_TYPE_GEN3_PLL2 = 8, + CLK_TYPE_GEN3_PLL3 = 9, + CLK_TYPE_GEN3_PLL4 = 10, + CLK_TYPE_GEN3_SD = 11, + CLK_TYPE_GEN3_R = 12, + CLK_TYPE_GEN3_MDSEL = 13, + CLK_TYPE_GEN3_Z = 14, + CLK_TYPE_GEN3_OSC = 15, + CLK_TYPE_GEN3_RCKSEL = 16, + CLK_TYPE_GEN3_RPCSRC = 17, + CLK_TYPE_GEN3_E3_RPCSRC = 18, + CLK_TYPE_GEN3_RPC = 19, + CLK_TYPE_GEN3_RPCD2 = 20, + CLK_TYPE_GEN3_SOC_BASE = 21, +}; + +struct rcar_gen3_cpg_pll_config { + u8 extal_div; + u8 pll1_mult; + u8 pll1_div; + u8 pll3_mult; + u8 pll3_div; + u8 osc_prediv; +}; + +enum clk_ids { + LAST_DT_CORE_CLK = 46, + CLK_EXTAL = 47, + CLK_EXTALR = 48, + CLK_MAIN = 49, + CLK_PLL0 = 50, + CLK_PLL1 = 51, + CLK_PLL2 = 52, + CLK_PLL3 = 53, + CLK_PLL4 = 54, + CLK_PLL1_DIV2 = 55, + CLK_PLL1_DIV4 = 56, + CLK_S0 = 57, + CLK_S1 = 58, + CLK_S2 = 59, + CLK_S3 = 60, + CLK_SDSRC = 61, + CLK_RPCSRC = 62, + CLK_RINT = 63, + MOD_CLK_BASE = 64, +}; + +enum clk_ids___2 { + LAST_DT_CORE_CLK___2 = 44, + CLK_EXTAL___2 = 45, + CLK_EXTALR___2 = 46, + CLK_MAIN___2 = 47, + CLK_PLL0___2 = 48, + CLK_PLL1___2 = 49, + CLK_PLL3___2 = 50, + CLK_PLL4___2 = 51, + CLK_PLL1_DIV2___2 = 52, + CLK_PLL1_DIV4___2 = 53, + CLK_S0___2 = 54, + CLK_S1___2 = 55, + CLK_S2___2 = 56, + CLK_S3___2 = 57, + CLK_SDSRC___2 = 58, + CLK_RPCSRC___2 = 59, + CLK_RINT___2 = 60, + MOD_CLK_BASE___2 = 61, +}; + +enum clk_ids___3 { + LAST_DT_CORE_CLK___3 = 48, + CLK_EXTAL___3 = 49, + CLK_MAIN___3 = 50, + CLK_PLL0___3 = 51, + CLK_PLL1___3 = 52, + CLK_PLL3___3 = 53, + CLK_PLL0D4 = 54, + CLK_PLL0D6 = 55, + CLK_PLL0D8 = 56, + CLK_PLL0D20 = 57, + CLK_PLL0D24 = 58, + CLK_PLL1D2 = 59, + CLK_PE = 60, + CLK_S0___3 = 61, + CLK_S1___3 = 62, + CLK_S2___3 = 63, + CLK_S3___3 = 64, + CLK_SDSRC___3 = 65, + CLK_RPCSRC___3 = 66, + CLK_RINT___3 = 67, + CLK_OCO = 68, + MOD_CLK_BASE___3 = 69, +}; + +struct mssr_mod_reparent { + unsigned int clk; + unsigned int parent; +}; + +enum clk_ids___4 { + LAST_DT_CORE_CLK___4 = 51, + CLK_EXTAL___4 = 52, + CLK_EXTALR___3 = 53, + CLK_MAIN___4 = 54, + CLK_PLL0___4 = 55, + CLK_PLL1___4 = 56, + CLK_PLL2___2 = 57, + CLK_PLL3___4 = 58, + CLK_PLL4___3 = 59, + CLK_PLL1_DIV2___3 = 60, + CLK_PLL1_DIV4___3 = 61, + CLK_S0___4 = 62, + CLK_S1___4 = 63, + CLK_S2___4 = 64, + CLK_S3___4 = 65, + CLK_SDSRC___4 = 66, + CLK_SSPSRC = 67, + CLK_RPCSRC___4 = 68, + CLK_RINT___4 = 69, + MOD_CLK_BASE___4 = 70, +}; + +enum clk_ids___5 { + LAST_DT_CORE_CLK___5 = 52, + CLK_EXTAL___5 = 53, + CLK_EXTALR___4 = 54, + CLK_MAIN___5 = 55, + CLK_PLL0___5 = 56, + CLK_PLL1___5 = 57, + CLK_PLL2___3 = 58, + CLK_PLL3___5 = 59, + CLK_PLL4___4 = 60, + CLK_PLL1_DIV2___4 = 61, + CLK_PLL1_DIV4___4 = 62, + CLK_S0___5 = 63, + CLK_S1___5 = 64, + CLK_S2___5 = 65, + CLK_S3___5 = 66, + CLK_SDSRC___5 = 67, + CLK_SSPSRC___2 = 68, + CLK_RPCSRC___5 = 69, + CLK_RINT___5 = 70, + MOD_CLK_BASE___5 = 71, +}; + +enum clk_ids___6 { + LAST_DT_CORE_CLK___6 = 49, + CLK_EXTAL___6 = 50, + CLK_EXTALR___5 = 51, + CLK_MAIN___6 = 52, + CLK_PLL0___6 = 53, + CLK_PLL1___6 = 54, + CLK_PLL3___6 = 55, + CLK_PLL4___5 = 56, + CLK_PLL1_DIV2___5 = 57, + CLK_PLL1_DIV4___5 = 58, + CLK_S0___6 = 59, + CLK_S1___6 = 60, + CLK_S2___6 = 61, + CLK_S3___6 = 62, + CLK_SDSRC___6 = 63, + CLK_SSPSRC___3 = 64, + CLK_RPCSRC___6 = 65, + CLK_RINT___6 = 66, + MOD_CLK_BASE___6 = 67, +}; + +enum r8a77970_clk_types { + CLK_TYPE_R8A77970_SD0H = 21, + CLK_TYPE_R8A77970_SD0 = 22, +}; + +enum clk_ids___7 { + LAST_DT_CORE_CLK___7 = 30, + CLK_EXTAL___7 = 31, + CLK_EXTALR___6 = 32, + CLK_MAIN___7 = 33, + CLK_PLL0___7 = 34, + CLK_PLL1___7 = 35, + CLK_PLL3___7 = 36, + CLK_PLL1_DIV2___6 = 37, + CLK_PLL1_DIV4___6 = 38, + MOD_CLK_BASE___7 = 39, +}; + +enum clk_ids___8 { + LAST_DT_CORE_CLK___8 = 37, + CLK_EXTAL___8 = 38, + CLK_EXTALR___7 = 39, + CLK_MAIN___8 = 40, + CLK_PLL1___8 = 41, + CLK_PLL2___4 = 42, + CLK_PLL3___8 = 43, + CLK_PLL1_DIV2___7 = 44, + CLK_PLL1_DIV4___7 = 45, + CLK_S0___7 = 46, + CLK_S1___7 = 47, + CLK_S2___7 = 48, + CLK_S3___7 = 49, + CLK_SDSRC___7 = 50, + CLK_RPCSRC___7 = 51, + CLK_OCO___2 = 52, + MOD_CLK_BASE___8 = 53, +}; + +enum clk_ids___9 { + LAST_DT_CORE_CLK___9 = 49, + CLK_EXTAL___9 = 50, + CLK_MAIN___9 = 51, + CLK_PLL0___8 = 52, + CLK_PLL1___9 = 53, + CLK_PLL3___9 = 54, + CLK_PLL0D4___2 = 55, + CLK_PLL0D6___2 = 56, + CLK_PLL0D8___2 = 57, + CLK_PLL0D20___2 = 58, + CLK_PLL0D24___2 = 59, + CLK_PLL1D2___2 = 60, + CLK_PE___2 = 61, + CLK_S0___8 = 62, + CLK_S1___8 = 63, + CLK_S2___8 = 64, + CLK_S3___8 = 65, + CLK_SDSRC___8 = 66, + CLK_RINT___7 = 67, + CLK_OCO___3 = 68, + MOD_CLK_BASE___9 = 69, +}; + +enum clk_ids___10 { + LAST_DT_CORE_CLK___10 = 41, + CLK_EXTAL___10 = 42, + CLK_MAIN___10 = 43, + CLK_PLL0___9 = 44, + CLK_PLL1___10 = 45, + CLK_PLL3___10 = 46, + CLK_PLL0D2 = 47, + CLK_PLL0D3 = 48, + CLK_PLL0D5 = 49, + CLK_PLL1D2___3 = 50, + CLK_PE___3 = 51, + CLK_S0___9 = 52, + CLK_S1___9 = 53, + CLK_S2___9 = 54, + CLK_S3___9 = 55, + CLK_SDSRC___9 = 56, + CLK_RINT___8 = 57, + CLK_OCO___4 = 58, + MOD_CLK_BASE___10 = 59, +}; + +enum rcar_r8a779a0_clk_types { + CLK_TYPE_R8A779A0_MAIN = 5, + CLK_TYPE_R8A779A0_PLL1 = 6, + CLK_TYPE_R8A779A0_PLL2X_3X = 7, + CLK_TYPE_R8A779A0_PLL5 = 8, + CLK_TYPE_R8A779A0_Z = 9, + CLK_TYPE_R8A779A0_SD = 10, + CLK_TYPE_R8A779A0_MDSEL = 11, + CLK_TYPE_R8A779A0_OSC = 12, + CLK_TYPE_R8A779A0_RPCSRC = 13, + CLK_TYPE_R8A779A0_RPC = 14, + CLK_TYPE_R8A779A0_RPCD2 = 15, +}; + +struct rcar_r8a779a0_cpg_pll_config { + u8 extal_div; + u8 pll1_mult; + u8 pll1_div; + u8 pll5_mult; + u8 pll5_div; + u8 osc_prediv; +}; + +enum clk_ids___11 { + LAST_DT_CORE_CLK___11 = 42, + CLK_EXTAL___11 = 43, + CLK_EXTALR___8 = 44, + CLK_MAIN___11 = 45, + CLK_PLL1___11 = 46, + CLK_PLL20 = 47, + CLK_PLL21 = 48, + CLK_PLL30 = 49, + CLK_PLL31 = 50, + CLK_PLL5 = 51, + CLK_PLL1_DIV2___8 = 52, + CLK_PLL20_DIV2 = 53, + CLK_PLL21_DIV2 = 54, + CLK_PLL30_DIV2 = 55, + CLK_PLL31_DIV2 = 56, + CLK_PLL5_DIV2 = 57, + CLK_PLL5_DIV4 = 58, + CLK_S1___10 = 59, + CLK_S3___10 = 60, + CLK_SDSRC___10 = 61, + CLK_RPCSRC___8 = 62, + CLK_OCO___5 = 63, + MOD_CLK_BASE___11 = 64, +}; + +struct cpg_z_clk { + struct clk_hw hw; + void *reg; + void *kick_reg; + long unsigned int max_rate; + unsigned int fixed_div; + u32 mask; +}; + +struct cpg_core_clk___2 { + const char *name; + unsigned int id; + unsigned int parent; + unsigned int div; + unsigned int mult; + unsigned int type; + unsigned int conf; + const struct clk_div_table *dtable; + const char * const *parent_names; + int flag; + int mux_flags; + int num_parents; +}; + +enum clk_types___2 { + CLK_TYPE_IN___2 = 0, + CLK_TYPE_FF___2 = 1, + CLK_TYPE_SAM_PLL = 2, + CLK_TYPE_DIV = 3, + CLK_TYPE_MUX = 4, + CLK_TYPE_SD_MUX = 5, +}; + +struct rzg2l_mod_clk { + const char *name; + unsigned int id; + unsigned int parent; + u16 off; + u8 bit; + bool is_coupled; +}; + +struct rzg2l_reset { + u16 off; + u8 bit; +}; + +struct rzg2l_cpg_info { + const struct cpg_core_clk___2 *core_clks; + unsigned int num_core_clks; + unsigned int last_dt_core_clk; + unsigned int num_total_core_clks; + const struct rzg2l_mod_clk *mod_clks; + unsigned int num_mod_clks; + unsigned int num_hw_mod_clks; + const struct rzg2l_reset *resets; + unsigned int num_resets; + const unsigned int *crit_mod_clks; + unsigned int num_crit_mod_clks; +}; + +enum clk_ids___12 { + LAST_DT_CORE_CLK___12 = 22, + CLK_EXTAL___12 = 23, + CLK_OSC_DIV1000 = 24, + CLK_PLL1___12 = 25, + CLK_PLL2___5 = 26, + CLK_PLL2_DIV2 = 27, + CLK_PLL2_DIV16 = 28, + CLK_PLL2_DIV20 = 29, + CLK_PLL3___11 = 30, + CLK_PLL3_400 = 31, + CLK_PLL3_533 = 32, + CLK_PLL3_DIV2 = 33, + CLK_PLL3_DIV2_4 = 34, + CLK_PLL3_DIV2_4_2 = 35, + CLK_PLL3_DIV4 = 36, + CLK_SEL_PLL3_3 = 37, + CLK_DIV_PLL3_C = 38, + CLK_PLL4___6 = 39, + CLK_PLL5___2 = 40, + CLK_PLL5_FOUT3 = 41, + CLK_PLL5_250 = 42, + CLK_PLL6 = 43, + CLK_PLL6_250 = 44, + CLK_P1_DIV2 = 45, + CLK_PLL2_800 = 46, + CLK_PLL2_SDHI_533 = 47, + CLK_PLL2_SDHI_400 = 48, + CLK_PLL2_SDHI_266 = 49, + CLK_SD0_DIV4 = 50, + CLK_SD1_DIV4 = 51, + MOD_CLK_BASE___12 = 52, +}; + +struct cpg_simple_notifier { + struct notifier_block nb; + void *reg; + u32 saved; +}; + +struct sd_div_table { + u32 val; + unsigned int div; +}; + +struct sd_clock { + struct clk_hw hw; + const struct sd_div_table *div_table; + struct cpg_simple_notifier csn; + unsigned int div_num; + unsigned int cur_div_idx; +}; + +struct rpc_clock { + struct clk_divider div; + struct clk_gate gate; + struct cpg_simple_notifier csn; +}; + +struct rpcd2_clock { + struct clk_fixed_factor fixed; + struct clk_gate gate; +}; + +struct cpg_pll_clk { + struct clk_hw hw; + void *pllcr_reg; + void *pllecr_reg; + unsigned int fixed_mult; + u32 pllecr_pllst_mask; +}; + +struct usb2_clock_sel_priv { + void *base; + struct clk_hw hw; + struct clk_bulk_data clks[2]; + struct reset_control *rsts; + bool extal; + bool xtal; +}; + +enum gpd_status { + GENPD_STATE_ON = 0, + GENPD_STATE_OFF = 1, +}; + +struct dev_power_governor { + bool (*power_down_ok)(struct dev_pm_domain *); + bool (*suspend_ok)(struct device *); +}; + +struct gpd_dev_ops { + int (*start)(struct device *); + int (*stop)(struct device *); +}; + +struct genpd_power_state { + s64 power_off_latency_ns; + s64 power_on_latency_ns; + s64 residency_ns; + u64 usage; + u64 rejected; + struct fwnode_handle *fwnode; + ktime_t idle_time; + void *data; +}; + +struct opp_table; + +struct dev_pm_opp; + +struct genpd_lock_ops; + +struct generic_pm_domain { + struct device dev; + struct dev_pm_domain domain; + struct list_head gpd_list_node; + struct list_head parent_links; + struct list_head child_links; + struct list_head dev_list; + struct dev_power_governor *gov; + struct work_struct power_off_work; + struct fwnode_handle *provider; + bool has_provider; + const char *name; + atomic_t sd_count; + enum gpd_status status; + unsigned int device_count; + unsigned int suspended_count; + unsigned int prepared_count; + unsigned int performance_state; + cpumask_var_t cpus; + int (*power_off)(struct generic_pm_domain *); + int (*power_on)(struct generic_pm_domain *); + struct raw_notifier_head power_notifiers; + struct opp_table *opp_table; + unsigned int (*opp_to_performance_state)(struct generic_pm_domain *, struct dev_pm_opp *); + int (*set_performance_state)(struct generic_pm_domain *, unsigned int); + struct gpd_dev_ops dev_ops; + s64 max_off_time_ns; + ktime_t next_wakeup; + bool max_off_time_changed; + bool cached_power_down_ok; + bool cached_power_down_state_idx; + int (*attach_dev)(struct generic_pm_domain *, struct device *); + void (*detach_dev)(struct generic_pm_domain *, struct device *); + unsigned int flags; + struct genpd_power_state *states; + void (*free_states)(struct genpd_power_state *, unsigned int); + unsigned int state_count; + unsigned int state_idx; + ktime_t on_time; + ktime_t accounting_time; + const struct genpd_lock_ops *lock_ops; + union { + struct mutex mlock; + struct { + spinlock_t slock; + long unsigned int lock_flags; + }; + }; +}; + +struct genpd_lock_ops { + void (*lock)(struct generic_pm_domain *); + void (*lock_nested)(struct generic_pm_domain *, int); + int (*lock_interruptible)(struct generic_pm_domain *); + void (*unlock)(struct generic_pm_domain *); +}; + +struct rzg2l_cpg_priv; + +struct sd_hw_data { + struct clk_hw hw; + u32 conf; + struct rzg2l_cpg_priv *priv; +}; + +struct rzg2l_cpg_priv { + struct reset_controller_dev rcdev; + struct device *dev; + void *base; + spinlock_t rmw_lock; + struct clk **clks; + unsigned int num_core_clks; + unsigned int num_mod_clks; + unsigned int num_resets; + unsigned int last_dt_core_clk; + struct raw_notifier_head notifiers; + const struct rzg2l_cpg_info *info; +}; + +struct pll_clk { + struct clk_hw hw; + unsigned int conf; + unsigned int type; + void *base; + struct rzg2l_cpg_priv *priv; +}; + +struct mstp_clock { + struct clk_hw hw; + u16 off; + u8 bit; + bool enabled; + struct rzg2l_cpg_priv *priv; + struct mstp_clock *sibling; +}; + +struct cpg_mssr_priv { + struct reset_controller_dev rcdev; + struct device *dev; + void *base; + enum clk_reg_layout reg_layout; + spinlock_t rmw_lock; + struct device_node *np; + unsigned int num_core_clks; + unsigned int num_mod_clks; + unsigned int last_dt_core_clk; + struct raw_notifier_head notifiers; + const u16 *status_regs; + const u16 *control_regs; + const u16 *reset_regs; + const u16 *reset_clear_regs; + struct { + u32 mask; + u32 val; + } smstpcr_saved[15]; + struct clk *clks[0]; +}; + +struct mstp_clock___2 { + struct clk_hw hw; + u32 index; + struct cpg_mssr_priv *priv; +}; + +struct cpg_mssr_clk_domain { + struct generic_pm_domain genpd; + unsigned int num_core_pm_clks; + unsigned int core_pm_clks[0]; +}; + +struct div6_clock { + struct clk_hw hw; + void *reg; + unsigned int div; + u32 src_mask; + struct notifier_block nb; + u8 parents[0]; +}; + +enum rockchip_pll_type { + pll_rk3036 = 0, + pll_rk3066 = 1, + pll_rk3328 = 2, + pll_rk3399 = 3, +}; + +struct rockchip_clk_provider { + void *reg_base; + struct clk_onecell_data clk_data; + struct device_node *cru_node; + struct regmap *grf; + spinlock_t lock; +}; + +struct rockchip_pll_rate_table { + long unsigned int rate; + union { + struct { + unsigned int nr; + unsigned int nf; + unsigned int no; + unsigned int nb; + }; + struct { + unsigned int fbdiv; + unsigned int postdiv1; + unsigned int refdiv; + unsigned int postdiv2; + unsigned int dsmpd; + unsigned int frac; + }; + }; +}; + +struct rockchip_pll_clock { + unsigned int id; + const char *name; + const char * const *parent_names; + u8 num_parents; + long unsigned int flags; + int con_offset; + int mode_offset; + int mode_shift; + int lock_shift; + enum rockchip_pll_type type; + u8 pll_flags; + struct rockchip_pll_rate_table *rate_table; +}; + +struct rockchip_cpuclk_clksel { + int reg; + u32 val; +}; + +struct rockchip_cpuclk_rate_table { + long unsigned int prate; + struct rockchip_cpuclk_clksel divs[5]; +}; + +struct rockchip_cpuclk_reg_data { + int core_reg[4]; + u8 div_core_shift[4]; + u32 div_core_mask[4]; + int num_cores; + u8 mux_core_alt; + u8 mux_core_main; + u8 mux_core_shift; + u32 mux_core_mask; +}; + +enum rockchip_clk_branch_type { + branch_composite = 0, + branch_mux = 1, + branch_muxgrf = 2, + branch_divider = 3, + branch_fraction_divider = 4, + branch_gate = 5, + branch_mmc = 6, + branch_inverter = 7, + branch_factor = 8, + branch_ddrclk = 9, + branch_half_divider = 10, +}; + +struct rockchip_clk_branch { + unsigned int id; + enum rockchip_clk_branch_type branch_type; + const char *name; + const char * const *parent_names; + u8 num_parents; + long unsigned int flags; + int muxdiv_offset; + u8 mux_shift; + u8 mux_width; + u8 mux_flags; + int div_offset; + u8 div_shift; + u8 div_width; + u8 div_flags; + struct clk_div_table *div_table; + int gate_offset; + u8 gate_shift; + u8 gate_flags; + struct rockchip_clk_branch *child; +}; + +struct rockchip_clk_frac { + struct notifier_block clk_nb; + struct clk_fractional_divider div; + struct clk_gate gate; + struct clk_mux mux; + const struct clk_ops *mux_ops; + int mux_frac_idx; + bool rate_change_remuxed; + int rate_change_idx; +}; + +struct rockchip_clk_pll { + struct clk_hw hw; + struct clk_mux pll_mux; + const struct clk_ops *pll_mux_ops; + struct notifier_block clk_nb; + void *reg_base; + int lock_offset; + unsigned int lock_shift; + enum rockchip_pll_type type; + u8 flags; + const struct rockchip_pll_rate_table *rate_table; + unsigned int rate_count; + spinlock_t *lock; + struct rockchip_clk_provider *ctx; +}; + +struct rockchip_cpuclk { + struct clk_hw hw; + struct clk *alt_parent; + void *reg_base; + struct notifier_block clk_nb; + unsigned int rate_count; + struct rockchip_cpuclk_rate_table *rate_table; + const struct rockchip_cpuclk_reg_data *reg_data; + spinlock_t *lock; +}; + +struct rockchip_inv_clock { + struct clk_hw hw; + void *reg; + int shift; + int flags; + spinlock_t *lock; +}; + +struct rockchip_mmc_clock { + struct clk_hw hw; + void *reg; + int id; + int shift; + int cached_phase; + struct notifier_block clk_rate_change_nb; +}; + +struct rockchip_muxgrf_clock { + struct clk_hw hw; + struct regmap *regmap; + u32 reg; + u32 shift; + u32 width; + int flags; +}; + +struct rockchip_ddrclk { + struct clk_hw hw; + void *reg_base; + int mux_offset; + int mux_shift; + int mux_width; + int div_shift; + int div_width; + int ddr_flag; + spinlock_t *lock; +}; + +struct rockchip_softrst { + struct reset_controller_dev rcdev; + void *reg_base; + int num_regs; + int num_per_reg; + u8 flags; + spinlock_t lock; +}; + +enum px30_plls { + apll = 0, + dpll = 1, + cpll = 2, + npll = 3, + apll_b_h = 4, + apll_b_l = 5, +}; + +enum px30_pmu_plls { + gpll = 0, +}; + +enum rk3308_plls { + apll___2 = 0, + dpll___2 = 1, + vpll0 = 2, + vpll1 = 3, +}; + +enum rk3328_plls { + apll___3 = 0, + dpll___3 = 1, + cpll___2 = 2, + gpll___2 = 3, + npll___2 = 4, +}; + +enum rk3368_plls { + apllb = 0, + aplll = 1, + dpll___4 = 2, + cpll___3 = 3, + gpll___3 = 4, + npll___3 = 5, +}; + +enum rk3399_plls { + lpll = 0, + bpll = 1, + dpll___5 = 2, + cpll___4 = 3, + gpll___4 = 4, + npll___4 = 5, + vpll = 6, +}; + +enum rk3399_pmu_plls { + ppll = 0, +}; + +struct clk_rk3399_inits { + void (*inits)(struct device_node *); +}; + +enum rk3568_pmu_plls { + ppll___2 = 0, + hpll = 1, +}; + +enum rk3568_plls { + apll___4 = 0, + dpll___6 = 1, + gpll___5 = 2, + cpll___5 = 3, + npll___5 = 4, + vpll___2 = 5, +}; + +struct clk_rk3568_inits { + void (*inits)(struct device_node *); +}; + +struct stratix10_clock_data { + struct clk_hw_onecell_data clk_data; + void *base; +}; + +struct stratix10_pll_clock { + unsigned int id; + const char *name; + const struct clk_parent_data *parent_data; + u8 num_parents; + long unsigned int flags; + long unsigned int offset; +}; + +struct stratix10_perip_c_clock { + unsigned int id; + const char *name; + const char *parent_name; + const struct clk_parent_data *parent_data; + u8 num_parents; + long unsigned int flags; + long unsigned int offset; +}; + +struct stratix10_perip_cnt_clock { + unsigned int id; + const char *name; + const char *parent_name; + const struct clk_parent_data *parent_data; + u8 num_parents; + long unsigned int flags; + long unsigned int offset; + u8 fixed_divider; + long unsigned int bypass_reg; + long unsigned int bypass_shift; +}; + +struct stratix10_gate_clock { + unsigned int id; + const char *name; + const char *parent_name; + const struct clk_parent_data *parent_data; + u8 num_parents; + long unsigned int flags; + long unsigned int gate_reg; + u8 gate_idx; + long unsigned int div_reg; + u8 div_offset; + u8 div_width; + long unsigned int bypass_reg; + u8 bypass_shift; + u8 fixed_div; +}; + +struct socfpga_pll { + struct clk_gate hw; +}; + +struct n5x_perip_c_clock { + unsigned int id; + const char *name; + const char *parent_name; + const char * const *parent_names; + u8 num_parents; + long unsigned int flags; + long unsigned int offset; + long unsigned int shift; +}; + +struct socfpga_periph_clk { + struct clk_gate hw; + char *parent_name; + u32 fixed_div; + void *div_reg; + void *bypass_reg; + u32 width; + u32 shift; + u32 bypass_shift; +}; + +struct socfpga_gate_clk { + struct clk_gate hw; + char *parent_name; + u32 fixed_div; + void *div_reg; + void *bypass_reg; + struct regmap *sys_mgr_base_addr; + u32 width; + u32 shift; + u32 bypass_shift; + u32 clk_phase[2]; +}; + +struct clk_factors_config { + u8 nshift; + u8 nwidth; + u8 kshift; + u8 kwidth; + u8 mshift; + u8 mwidth; + u8 pshift; + u8 pwidth; + u8 n_start; +}; + +struct factors_request { + long unsigned int rate; + long unsigned int parent_rate; + u8 parent_index; + u8 n; + u8 k; + u8 m; + u8 p; +}; + +struct factors_data { + int enable; + int mux; + int muxmask; + const struct clk_factors_config *table; + void (*getter)(struct factors_request *); + void (*recalc)(struct factors_request *); + const char *name; +}; + +struct clk_factors { + struct clk_hw hw; + void *reg; + const struct clk_factors_config *config; + void (*get_factors)(struct factors_request *); + void (*recalc)(struct factors_request *); + spinlock_t *lock; + struct clk_mux *mux; + struct clk_gate *gate; +}; + +struct mux_data { + u8 shift; +}; + +struct div_data { + u8 shift; + u8 pow; + u8 width; + const struct clk_div_table *table; +}; + +struct divs_data { + const struct factors_data *factors; + int ndivs; + struct { + u8 self; + u8 fixed; + struct clk_div_table *table; + u8 shift; + u8 pow; + u8 gate; + bool critical; + } div[4]; +}; + +struct ve_reset_data { + void *reg; + spinlock_t *lock; + struct reset_controller_dev rcdev; +}; + +struct mmc_phase { + struct clk_hw hw; + u8 offset; + void *reg; + spinlock_t *lock; +}; + +struct sun4i_a10_display_clk_data { + bool has_div; + u8 num_rst; + u8 parents; + u8 offset_en; + u8 offset_div; + u8 offset_mux; + u8 offset_rst; + u8 width_div; + u8 width_mux; + u32 flags; +}; + +struct reset_data { + void *reg; + spinlock_t *lock; + struct reset_controller_dev rcdev; + u8 offset; +}; + +struct tcon_ch1_clk { + struct clk_hw hw; + spinlock_t lock; + void *reg; +}; + +enum { + AHB1 = 0, + AHB2 = 1, + APB1 = 2, + APB2 = 3, + PARENT_MAX = 4, +}; + +struct sun9i_mmc_clk_data { + spinlock_t lock; + void *membase; + struct clk *clk; + struct reset_control *reset; + struct clk_onecell_data clk_data; + struct reset_controller_dev rcdev; +}; + +struct usb_reset_data { + void *reg; + spinlock_t *lock; + struct clk *clk; + struct reset_controller_dev rcdev; +}; + +struct usb_clk_data { + u32 clk_mask; + u32 reset_mask; + bool reset_needs_clk; +}; + +struct sun9i_a80_cpus_clk { + struct clk_hw hw; + void *reg; +}; + +struct gates_data { + long unsigned int mask[1]; +}; + +struct ccu_common { + void *base; + u16 reg; + u16 lock_reg; + u32 prediv; + long unsigned int features; + spinlock_t *lock; + struct clk_hw hw; +}; + +struct ccu_reset_map; + +struct sunxi_ccu_desc { + struct ccu_common **ccu_clks; + long unsigned int num_ccu_clks; + struct clk_hw_onecell_data *hw_clks; + struct ccu_reset_map *resets; + long unsigned int num_resets; +}; + +struct ccu_reset_map { + u16 reg; + u32 bit; +}; + +struct ccu_pll_nb { + struct notifier_block clk_nb; + struct ccu_common *common; + u32 enable; + u32 lock; +}; + +struct ccu_reset { + void *base; + struct ccu_reset_map *reset_map; + spinlock_t *lock; + struct reset_controller_dev rcdev; +}; + +struct sunxi_ccu { + const struct sunxi_ccu_desc *desc; + spinlock_t lock; + struct ccu_reset reset; +}; + +struct ccu_mux_fixed_prediv { + u8 index; + u16 div; +}; + +struct ccu_mux_var_prediv { + u8 index; + u8 shift; + u8 width; +}; + +struct ccu_mux_internal { + u8 shift; + u8 width; + const u8 *table; + const struct ccu_mux_fixed_prediv *fixed_predivs; + u8 n_predivs; + const struct ccu_mux_var_prediv *var_predivs; + u8 n_var_predivs; +}; + +struct ccu_div_internal { + u8 shift; + u8 width; + u32 max; + u32 offset; + u32 flags; + struct clk_div_table *table; +}; + +struct ccu_div { + u32 enable; + struct ccu_div_internal div; + struct ccu_mux_internal mux; + struct ccu_common common; + unsigned int fixed_post_div; +}; + +struct ccu_frac_internal { + u32 enable; + u32 select; + long unsigned int rates[2]; +}; + +struct ccu_gate { + u32 enable; + struct ccu_common common; +}; + +struct ccu_mux { + u32 enable; + struct ccu_mux_internal mux; + struct ccu_common common; +}; + +struct ccu_mux_nb { + struct notifier_block clk_nb; + struct ccu_common *common; + struct ccu_mux_internal *cm; + u32 delay_us; + u8 bypass_index; + u8 original_index; +}; + +struct ccu_mult_internal { + u8 offset; + u8 shift; + u8 width; + u8 min; + u8 max; +}; + +struct ccu_mult { + u32 enable; + u32 lock; + struct ccu_frac_internal frac; + struct ccu_mult_internal mult; + struct ccu_mux_internal mux; + struct ccu_common common; +}; + +struct _ccu_mult { + long unsigned int mult; + long unsigned int min; + long unsigned int max; +}; + +struct ccu_phase { + u8 shift; + u8 width; + struct ccu_common common; +}; + +struct ccu_sdm_setting { + long unsigned int rate; + u32 pattern; + u32 m; + u32 n; +}; + +struct ccu_sdm_internal { + struct ccu_sdm_setting *table; + u32 table_size; + u32 enable; + u32 tuning_enable; + u16 tuning_reg; +}; + +struct ccu_nk { + u16 reg; + u32 enable; + u32 lock; + struct ccu_mult_internal n; + struct ccu_mult_internal k; + unsigned int fixed_post_div; + struct ccu_common common; +}; + +struct _ccu_nk { + long unsigned int n; + long unsigned int min_n; + long unsigned int max_n; + long unsigned int k; + long unsigned int min_k; + long unsigned int max_k; +}; + +struct ccu_nkm { + u32 enable; + u32 lock; + struct ccu_mult_internal n; + struct ccu_mult_internal k; + struct ccu_div_internal m; + struct ccu_mux_internal mux; + unsigned int fixed_post_div; + struct ccu_common common; +}; + +struct _ccu_nkm { + long unsigned int n; + long unsigned int min_n; + long unsigned int max_n; + long unsigned int k; + long unsigned int min_k; + long unsigned int max_k; + long unsigned int m; + long unsigned int min_m; + long unsigned int max_m; +}; + +struct ccu_nkmp { + u32 enable; + u32 lock; + struct ccu_mult_internal n; + struct ccu_mult_internal k; + struct ccu_div_internal m; + struct ccu_div_internal p; + unsigned int fixed_post_div; + unsigned int max_rate; + struct ccu_common common; +}; + +struct _ccu_nkmp { + long unsigned int n; + long unsigned int min_n; + long unsigned int max_n; + long unsigned int k; + long unsigned int min_k; + long unsigned int max_k; + long unsigned int m; + long unsigned int min_m; + long unsigned int max_m; + long unsigned int p; + long unsigned int min_p; + long unsigned int max_p; +}; + +struct ccu_nm { + u32 enable; + u32 lock; + struct ccu_mult_internal n; + struct ccu_div_internal m; + struct ccu_frac_internal frac; + struct ccu_sdm_internal sdm; + unsigned int fixed_post_div; + unsigned int min_rate; + unsigned int max_rate; + struct ccu_common common; +}; + +struct _ccu_nm { + long unsigned int n; + long unsigned int min_n; + long unsigned int max_n; + long unsigned int m; + long unsigned int min_m; + long unsigned int max_m; +}; + +struct ccu_mp { + u32 enable; + struct ccu_div_internal m; + struct ccu_div_internal p; + struct ccu_mux_internal mux; + unsigned int fixed_post_div; + struct ccu_common common; +}; + +struct tegra_cpu_car_ops { + void (*wait_for_reset)(u32); + void (*put_in_reset)(u32); + void (*out_of_reset)(u32); + void (*enable_clock)(u32); + void (*disable_clock)(u32); + bool (*rail_off_ready)(); + void (*suspend)(); + void (*resume)(); +}; + +struct tegra_clk_periph_regs { + u32 enb_reg; + u32 enb_set_reg; + u32 enb_clr_reg; + u32 rst_reg; + u32 rst_set_reg; + u32 rst_clr_reg; +}; + +struct tegra_clk_init_table { + unsigned int clk_id; + unsigned int parent_id; + long unsigned int rate; + int state; +}; + +struct tegra_clk_duplicate { + int clk_id; + struct clk_lookup lookup; +}; + +struct tegra_clk { + int dt_id; + bool present; +}; + +struct tegra_devclk { + int dt_id; + char *dev_id; + char *con_id; +}; + +typedef void (*tegra_clk_apply_init_table_func)(); + +struct tegra_clk_sync_source { + struct clk_hw hw; + long unsigned int rate; + long unsigned int max_rate; +}; + +struct rail_alignment { + int offset_uv; + int step_uv; +}; + +struct cvb_coefficients { + int c0; + int c1; + int c2; +}; + +struct cvb_table_freq_entry { + long unsigned int freq; + struct cvb_coefficients coefficients; +}; + +struct cvb_cpu_dfll_data { + u32 tune0_low; + u32 tune0_high; + u32 tune1; + unsigned int tune_high_min_millivolts; +}; + +struct cvb_table { + int speedo_id; + int process_id; + int min_millivolts; + int max_millivolts; + int speedo_scale; + int voltage_scale; + struct cvb_table_freq_entry entries[40]; + struct cvb_cpu_dfll_data cpu_dfll_data; +}; + +struct tegra_dfll_soc_data { + struct device *dev; + long unsigned int max_freq; + const struct cvb_table *cvb; + struct rail_alignment alignment; + void (*init_clock_trimmers)(); + void (*set_clock_trimmers_high)(); + void (*set_clock_trimmers_low)(); +}; + +enum dfll_ctrl_mode { + DFLL_UNINITIALIZED = 0, + DFLL_DISABLED = 1, + DFLL_OPEN_LOOP = 2, + DFLL_CLOSED_LOOP = 3, +}; + +enum dfll_tune_range { + DFLL_TUNE_UNINITIALIZED = 0, + DFLL_TUNE_LOW = 1, +}; + +enum tegra_dfll_pmu_if { + TEGRA_DFLL_PMU_I2C = 0, + TEGRA_DFLL_PMU_PWM = 1, +}; + +struct dfll_rate_req { + long unsigned int rate; + long unsigned int dvco_target_rate; + int lut_index; + u8 mult_bits; + u8 scale_bits; +}; + +struct tegra_dfll { + struct device *dev; + struct tegra_dfll_soc_data *soc; + void *base; + void *i2c_base; + void *i2c_controller_base; + void *lut_base; + struct regulator *vdd_reg; + struct clk *soc_clk; + struct clk *ref_clk; + struct clk *i2c_clk; + struct clk *dfll_clk; + struct reset_control *dvco_rst; + long unsigned int ref_rate; + long unsigned int i2c_clk_rate; + long unsigned int dvco_rate_min; + enum dfll_ctrl_mode mode; + enum dfll_tune_range tune_range; + struct dentry *debugfs_dir; + struct clk_hw dfll_clk_hw; + const char *output_clock_name; + struct dfll_rate_req last_req; + long unsigned int last_unrounded_rate; + u32 droop_ctrl; + u32 sample_rate; + u32 force_mode; + u32 cf; + u32 ci; + u32 cg; + bool cg_scale; + u32 i2c_fs_rate; + u32 i2c_reg; + u32 i2c_slave_addr; + unsigned int lut[33]; + long unsigned int lut_uv[33]; + int lut_size; + u8 lut_bottom; + u8 lut_min; + u8 lut_max; + u8 lut_safe; + enum tegra_dfll_pmu_if pmu_if; + long unsigned int pwm_rate; + struct pinctrl *pwm_pin; + struct pinctrl_state *pwm_enable_state; + struct pinctrl_state *pwm_disable_state; + u32 reg_init_uV; +}; + +struct tegra_clk_frac_div { + struct clk_hw hw; + void *reg; + u8 flags; + u8 shift; + u8 width; + u8 frac_width; + spinlock_t *lock; +}; + +struct tegra_clk_periph_gate { + u32 magic; + struct clk_hw hw; + void *clk_base; + u8 flags; + int clk_num; + int *enable_refcnt; + const struct tegra_clk_periph_regs *regs; +}; + +struct tegra_clk_periph { + u32 magic; + struct clk_hw hw; + struct clk_mux mux; + struct tegra_clk_frac_div divider; + struct tegra_clk_periph_gate gate; + const struct clk_ops *mux_ops; + const struct clk_ops *div_ops; + const struct clk_ops *gate_ops; +}; + +struct tegra_periph_init_data { + const char *name; + int clk_id; + union { + const char * const *parent_names; + const char *parent_name; + } p; + int num_parents; + struct tegra_clk_periph periph; + u32 offset; + const char *con_id; + const char *dev_id; + long unsigned int flags; +}; + +struct tegra_clk_periph_fixed { + struct clk_hw hw; + void *base; + const struct tegra_clk_periph_regs *regs; + unsigned int mul; + unsigned int div; + unsigned int num; +}; + +struct tegra_clk_pll_freq_table { + long unsigned int input_rate; + long unsigned int output_rate; + u32 n; + u32 m; + u8 p; + u8 cpcon; + u16 sdm_data; +}; + +struct pdiv_map { + u8 pdiv; + u8 hw_val; +}; + +struct div_nmp { + u8 divn_shift; + u8 divn_width; + u8 divm_shift; + u8 divm_width; + u8 divp_shift; + u8 divp_width; + u8 override_divn_shift; + u8 override_divm_shift; + u8 override_divp_shift; +}; + +struct tegra_clk_pll; + +struct tegra_clk_pll_params { + long unsigned int input_min; + long unsigned int input_max; + long unsigned int cf_min; + long unsigned int cf_max; + long unsigned int vco_min; + long unsigned int vco_max; + u32 base_reg; + u32 misc_reg; + u32 lock_reg; + u32 lock_mask; + u32 lock_enable_bit_idx; + u32 iddq_reg; + u32 iddq_bit_idx; + u32 reset_reg; + u32 reset_bit_idx; + u32 sdm_din_reg; + u32 sdm_din_mask; + u32 sdm_ctrl_reg; + u32 sdm_ctrl_en_mask; + u32 ssc_ctrl_reg; + u32 ssc_ctrl_en_mask; + u32 aux_reg; + u32 dyn_ramp_reg; + u32 ext_misc_reg[6]; + u32 pmc_divnm_reg; + u32 pmc_divp_reg; + u32 flags; + int stepa_shift; + int stepb_shift; + int lock_delay; + int max_p; + bool defaults_set; + const struct pdiv_map *pdiv_tohw; + struct div_nmp *div_nmp; + struct tegra_clk_pll_freq_table *freq_table; + long unsigned int fixed_rate; + u16 mdiv_default; + u32 (*round_p_to_pdiv)(u32, u32 *); + void (*set_gain)(struct tegra_clk_pll_freq_table *); + int (*calc_rate)(struct clk_hw *, struct tegra_clk_pll_freq_table *, long unsigned int, long unsigned int); + long unsigned int (*adjust_vco)(struct tegra_clk_pll_params *, long unsigned int); + void (*set_defaults)(struct tegra_clk_pll *); + int (*dyn_ramp)(struct tegra_clk_pll *, struct tegra_clk_pll_freq_table *); + int (*pre_rate_change)(); + void (*post_rate_change)(); +}; + +struct tegra_clk_pll { + struct clk_hw hw; + void *clk_base; + void *pmc; + spinlock_t *lock; + struct tegra_clk_pll_params *params; +}; + +struct utmi_clk_param { + u32 osc_frequency; + u8 enable_delay_count; + u8 stable_count; + u8 active_delay_count; + u8 xtal_freq_count; +}; + +struct tegra_clk_pll_out { + struct clk_hw hw; + void *reg; + u8 enb_bit_idx; + u8 rst_bit_idx; + spinlock_t *lock; + u8 flags; +}; + +struct tegra_sdmmc_mux { + struct clk_hw hw; + void *reg; + spinlock_t *lock; + const struct clk_ops *gate_ops; + struct tegra_clk_periph_gate gate; + u8 div_flags; +}; + +struct tegra_clk_super_mux { + struct clk_hw hw; + void *reg; + struct tegra_clk_frac_div frac_div; + const struct clk_ops *div_ops; + u8 width; + u8 flags; + u8 div2_index; + u8 pllx_index; + spinlock_t *lock; +}; + +struct tegra_audio_clk_info { + char *name; + struct tegra_clk_pll_params *pll_params; + int clk_id; + char *parent; +}; + +enum clk_id { + tegra_clk_actmon = 0, + tegra_clk_adx = 1, + tegra_clk_adx1 = 2, + tegra_clk_afi = 3, + tegra_clk_amx = 4, + tegra_clk_amx1 = 5, + tegra_clk_apb2ape = 6, + tegra_clk_ahbdma = 7, + tegra_clk_apbdma = 8, + tegra_clk_apbif = 9, + tegra_clk_ape = 10, + tegra_clk_audio0 = 11, + tegra_clk_audio0_2x = 12, + tegra_clk_audio0_mux = 13, + tegra_clk_audio1 = 14, + tegra_clk_audio1_2x = 15, + tegra_clk_audio1_mux = 16, + tegra_clk_audio2 = 17, + tegra_clk_audio2_2x = 18, + tegra_clk_audio2_mux = 19, + tegra_clk_audio3 = 20, + tegra_clk_audio3_2x = 21, + tegra_clk_audio3_mux = 22, + tegra_clk_audio4 = 23, + tegra_clk_audio4_2x = 24, + tegra_clk_audio4_mux = 25, + tegra_clk_bsea = 26, + tegra_clk_bsev = 27, + tegra_clk_cclk_g = 28, + tegra_clk_cclk_lp = 29, + tegra_clk_cilab = 30, + tegra_clk_cilcd = 31, + tegra_clk_cile = 32, + tegra_clk_clk_32k = 33, + tegra_clk_clk72Mhz = 34, + tegra_clk_clk72Mhz_8 = 35, + tegra_clk_clk_m = 36, + tegra_clk_osc = 37, + tegra_clk_osc_div2 = 38, + tegra_clk_osc_div4 = 39, + tegra_clk_cml0 = 40, + tegra_clk_cml1 = 41, + tegra_clk_csi = 42, + tegra_clk_csite = 43, + tegra_clk_csite_8 = 44, + tegra_clk_csus = 45, + tegra_clk_cve = 46, + tegra_clk_dam0 = 47, + tegra_clk_dam1 = 48, + tegra_clk_dam2 = 49, + tegra_clk_d_audio = 50, + tegra_clk_dbgapb = 51, + tegra_clk_dds = 52, + tegra_clk_dfll_ref = 53, + tegra_clk_dfll_soc = 54, + tegra_clk_disp1 = 55, + tegra_clk_disp1_8 = 56, + tegra_clk_disp2 = 57, + tegra_clk_disp2_8 = 58, + tegra_clk_dp2 = 59, + tegra_clk_dpaux = 60, + tegra_clk_dpaux1 = 61, + tegra_clk_dsialp = 62, + tegra_clk_dsia_mux = 63, + tegra_clk_dsiblp = 64, + tegra_clk_dsib_mux = 65, + tegra_clk_dtv = 66, + tegra_clk_emc = 67, + tegra_clk_entropy = 68, + tegra_clk_entropy_8 = 69, + tegra_clk_epp = 70, + tegra_clk_epp_8 = 71, + tegra_clk_extern1 = 72, + tegra_clk_extern2 = 73, + tegra_clk_extern3 = 74, + tegra_clk_fuse = 75, + tegra_clk_fuse_burn = 76, + tegra_clk_gpu = 77, + tegra_clk_gr2d = 78, + tegra_clk_gr2d_8 = 79, + tegra_clk_gr3d = 80, + tegra_clk_gr3d_8 = 81, + tegra_clk_hclk = 82, + tegra_clk_hda = 83, + tegra_clk_hda_8 = 84, + tegra_clk_hda2codec_2x = 85, + tegra_clk_hda2codec_2x_8 = 86, + tegra_clk_hda2hdmi = 87, + tegra_clk_hdmi = 88, + tegra_clk_hdmi_audio = 89, + tegra_clk_host1x = 90, + tegra_clk_host1x_8 = 91, + tegra_clk_host1x_9 = 92, + tegra_clk_hsic_trk = 93, + tegra_clk_i2c1 = 94, + tegra_clk_i2c2 = 95, + tegra_clk_i2c3 = 96, + tegra_clk_i2c4 = 97, + tegra_clk_i2c5 = 98, + tegra_clk_i2c6 = 99, + tegra_clk_i2cslow = 100, + tegra_clk_i2s0 = 101, + tegra_clk_i2s0_sync = 102, + tegra_clk_i2s1 = 103, + tegra_clk_i2s1_sync = 104, + tegra_clk_i2s2 = 105, + tegra_clk_i2s2_sync = 106, + tegra_clk_i2s3 = 107, + tegra_clk_i2s3_sync = 108, + tegra_clk_i2s4 = 109, + tegra_clk_i2s4_sync = 110, + tegra_clk_isp = 111, + tegra_clk_isp_8 = 112, + tegra_clk_isp_9 = 113, + tegra_clk_ispb = 114, + tegra_clk_kbc = 115, + tegra_clk_kfuse = 116, + tegra_clk_la = 117, + tegra_clk_maud = 118, + tegra_clk_mipi = 119, + tegra_clk_mipibif = 120, + tegra_clk_mipi_cal = 121, + tegra_clk_mpe = 122, + tegra_clk_mselect = 123, + tegra_clk_msenc = 124, + tegra_clk_ndflash = 125, + tegra_clk_ndflash_8 = 126, + tegra_clk_ndspeed = 127, + tegra_clk_ndspeed_8 = 128, + tegra_clk_nor = 129, + tegra_clk_nvdec = 130, + tegra_clk_nvenc = 131, + tegra_clk_nvjpg = 132, + tegra_clk_owr = 133, + tegra_clk_owr_8 = 134, + tegra_clk_pcie = 135, + tegra_clk_pclk = 136, + tegra_clk_pll_a = 137, + tegra_clk_pll_a_out0 = 138, + tegra_clk_pll_a1 = 139, + tegra_clk_pll_c = 140, + tegra_clk_pll_c2 = 141, + tegra_clk_pll_c3 = 142, + tegra_clk_pll_c4 = 143, + tegra_clk_pll_c4_out0 = 144, + tegra_clk_pll_c4_out1 = 145, + tegra_clk_pll_c4_out2 = 146, + tegra_clk_pll_c4_out3 = 147, + tegra_clk_pll_c_out1 = 148, + tegra_clk_pll_d = 149, + tegra_clk_pll_d2 = 150, + tegra_clk_pll_d2_out0 = 151, + tegra_clk_pll_d_out0 = 152, + tegra_clk_pll_dp = 153, + tegra_clk_pll_e_out0 = 154, + tegra_clk_pll_g_ref = 155, + tegra_clk_pll_m = 156, + tegra_clk_pll_m_out1 = 157, + tegra_clk_pll_mb = 158, + tegra_clk_pll_p = 159, + tegra_clk_pll_p_out1 = 160, + tegra_clk_pll_p_out2 = 161, + tegra_clk_pll_p_out2_int = 162, + tegra_clk_pll_p_out3 = 163, + tegra_clk_pll_p_out4 = 164, + tegra_clk_pll_p_out4_cpu = 165, + tegra_clk_pll_p_out5 = 166, + tegra_clk_pll_p_out_hsio = 167, + tegra_clk_pll_p_out_xusb = 168, + tegra_clk_pll_p_out_cpu = 169, + tegra_clk_pll_p_out_adsp = 170, + tegra_clk_pll_ref = 171, + tegra_clk_pll_re_out = 172, + tegra_clk_pll_re_vco = 173, + tegra_clk_pll_u = 174, + tegra_clk_pll_u_out = 175, + tegra_clk_pll_u_out1 = 176, + tegra_clk_pll_u_out2 = 177, + tegra_clk_pll_u_12m = 178, + tegra_clk_pll_u_480m = 179, + tegra_clk_pll_u_48m = 180, + tegra_clk_pll_u_60m = 181, + tegra_clk_pll_x = 182, + tegra_clk_pll_x_out0 = 183, + tegra_clk_pwm = 184, + tegra_clk_qspi = 185, + tegra_clk_rtc = 186, + tegra_clk_sata = 187, + tegra_clk_sata_8 = 188, + tegra_clk_sata_cold = 189, + tegra_clk_sata_oob = 190, + tegra_clk_sata_oob_8 = 191, + tegra_clk_sbc1 = 192, + tegra_clk_sbc1_8 = 193, + tegra_clk_sbc1_9 = 194, + tegra_clk_sbc2 = 195, + tegra_clk_sbc2_8 = 196, + tegra_clk_sbc2_9 = 197, + tegra_clk_sbc3 = 198, + tegra_clk_sbc3_8 = 199, + tegra_clk_sbc3_9 = 200, + tegra_clk_sbc4 = 201, + tegra_clk_sbc4_8 = 202, + tegra_clk_sbc4_9 = 203, + tegra_clk_sbc5 = 204, + tegra_clk_sbc5_8 = 205, + tegra_clk_sbc6 = 206, + tegra_clk_sbc6_8 = 207, + tegra_clk_sclk = 208, + tegra_clk_sdmmc_legacy = 209, + tegra_clk_sdmmc1 = 210, + tegra_clk_sdmmc1_8 = 211, + tegra_clk_sdmmc1_9 = 212, + tegra_clk_sdmmc2 = 213, + tegra_clk_sdmmc2_8 = 214, + tegra_clk_sdmmc3 = 215, + tegra_clk_sdmmc3_8 = 216, + tegra_clk_sdmmc3_9 = 217, + tegra_clk_sdmmc4 = 218, + tegra_clk_sdmmc4_8 = 219, + tegra_clk_se = 220, + tegra_clk_se_10 = 221, + tegra_clk_soc_therm = 222, + tegra_clk_soc_therm_8 = 223, + tegra_clk_sor0 = 224, + tegra_clk_sor0_out = 225, + tegra_clk_sor1 = 226, + tegra_clk_sor1_out = 227, + tegra_clk_spdif = 228, + tegra_clk_spdif_2x = 229, + tegra_clk_spdif_in = 230, + tegra_clk_spdif_in_8 = 231, + tegra_clk_spdif_in_sync = 232, + tegra_clk_spdif_mux = 233, + tegra_clk_spdif_out = 234, + tegra_clk_timer = 235, + tegra_clk_trace = 236, + tegra_clk_tsec = 237, + tegra_clk_tsec_8 = 238, + tegra_clk_tsecb = 239, + tegra_clk_tsensor = 240, + tegra_clk_tvdac = 241, + tegra_clk_tvo = 242, + tegra_clk_uarta = 243, + tegra_clk_uarta_8 = 244, + tegra_clk_uartb = 245, + tegra_clk_uartb_8 = 246, + tegra_clk_uartc = 247, + tegra_clk_uartc_8 = 248, + tegra_clk_uartd = 249, + tegra_clk_uartd_8 = 250, + tegra_clk_uarte = 251, + tegra_clk_uarte_8 = 252, + tegra_clk_uartape = 253, + tegra_clk_usb2 = 254, + tegra_clk_usb2_hsic_trk = 255, + tegra_clk_usb2_trk = 256, + tegra_clk_usb3 = 257, + tegra_clk_usbd = 258, + tegra_clk_vcp = 259, + tegra_clk_vde = 260, + tegra_clk_vde_8 = 261, + tegra_clk_vfir = 262, + tegra_clk_vi = 263, + tegra_clk_vi_8 = 264, + tegra_clk_vi_9 = 265, + tegra_clk_vi_10 = 266, + tegra_clk_vi_i2c = 267, + tegra_clk_vic03 = 268, + tegra_clk_vic03_8 = 269, + tegra_clk_vim2_clk = 270, + tegra_clk_vimclk_sync = 271, + tegra_clk_vi_sensor = 272, + tegra_clk_vi_sensor_8 = 273, + tegra_clk_vi_sensor_9 = 274, + tegra_clk_vi_sensor2 = 275, + tegra_clk_vi_sensor2_8 = 276, + tegra_clk_xusb_dev = 277, + tegra_clk_xusb_dev_src = 278, + tegra_clk_xusb_dev_src_8 = 279, + tegra_clk_xusb_falcon_src = 280, + tegra_clk_xusb_falcon_src_8 = 281, + tegra_clk_xusb_fs_src = 282, + tegra_clk_xusb_gate = 283, + tegra_clk_xusb_host = 284, + tegra_clk_xusb_host_src = 285, + tegra_clk_xusb_host_src_8 = 286, + tegra_clk_xusb_hs_src = 287, + tegra_clk_xusb_hs_src_4 = 288, + tegra_clk_xusb_ss = 289, + tegra_clk_xusb_ss_src = 290, + tegra_clk_xusb_ss_src_8 = 291, + tegra_clk_xusb_ss_div2 = 292, + tegra_clk_xusb_ssp_src = 293, + tegra_clk_sclk_mux = 294, + tegra_clk_sor_safe = 295, + tegra_clk_cec = 296, + tegra_clk_ispa = 297, + tegra_clk_dmic1 = 298, + tegra_clk_dmic2 = 299, + tegra_clk_dmic3 = 300, + tegra_clk_dmic1_sync_clk = 301, + tegra_clk_dmic2_sync_clk = 302, + tegra_clk_dmic3_sync_clk = 303, + tegra_clk_dmic1_sync_clk_mux = 304, + tegra_clk_dmic2_sync_clk_mux = 305, + tegra_clk_dmic3_sync_clk_mux = 306, + tegra_clk_iqc1 = 307, + tegra_clk_iqc2 = 308, + tegra_clk_pll_a_out_adsp = 309, + tegra_clk_pll_a_out0_out_adsp = 310, + tegra_clk_adsp = 311, + tegra_clk_adsp_neon = 312, + tegra_clk_max = 313, +}; + +struct tegra_sync_source_initdata { + char *name; + long unsigned int rate; + long unsigned int max_rate; + int clk_id; +}; + +struct tegra_audio_clk_initdata { + char *gate_name; + char *mux_name; + u32 offset; + int gate_clk_id; + int mux_clk_id; +}; + +struct tegra_audio2x_clk_initdata { + char *parent; + char *gate_name; + char *name_2x; + char *div_name; + int clk_id; + int clk_num; + u8 div_offset; +}; + +struct pll_out_data { + char *div_name; + char *pll_out_name; + u32 offset; + int clk_id; + u8 div_shift; + u8 div_flags; + u8 rst_shift; + spinlock_t *lock; +}; + +enum tegra_super_gen { + gen4 = 4, + gen5 = 5, +}; + +struct tegra_super_gen_info { + enum tegra_super_gen gen; + const char **sclk_parents; + const char **cclk_g_parents; + const char **cclk_lp_parents; + int num_sclk_parents; + int num_cclk_g_parents; + int num_cclk_lp_parents; +}; + +enum tegra_revision { + TEGRA_REVISION_UNKNOWN = 0, + TEGRA_REVISION_A01 = 1, + TEGRA_REVISION_A02 = 2, + TEGRA_REVISION_A03 = 3, + TEGRA_REVISION_A03p = 4, + TEGRA_REVISION_A04 = 5, + TEGRA_REVISION_MAX = 6, +}; + +struct tegra_sku_info { + int sku_id; + int cpu_process_id; + int cpu_speedo_id; + int cpu_speedo_value; + int cpu_iddq_value; + int soc_process_id; + int soc_speedo_id; + int soc_speedo_value; + int gpu_process_id; + int gpu_speedo_id; + int gpu_speedo_value; + enum tegra_revision revision; +}; + +struct dfll_fcpu_data { + const long unsigned int *cpu_max_freq_table; + unsigned int cpu_max_freq_table_size; + const struct cvb_table *cpu_cvb_tables; + unsigned int cpu_cvb_tables_size; +}; + +struct cpu_clk_suspend_context { + u32 clk_csite_src; + u32 cclkg_burst; + u32 cclkg_divider; +}; + +enum { + DOWN___2 = 0, + UP___2 = 1, +}; + +struct cpu_clk_suspend_context___2 { + u32 clk_csite_src; +}; + +struct tegra210_domain_mbist_war { + void (*handle_lvl2_ovr)(struct tegra210_domain_mbist_war *); + const u32 lvl2_offset; + const u32 lvl2_mask; + const unsigned int num_clks; + const unsigned int *clk_init_data; + struct clk_bulk_data *clks; +}; + +struct utmi_clk_param___2 { + u32 osc_frequency; + u8 enable_delay_count; + u16 stable_count; + u8 active_delay_count; + u16 xtal_freq_count; +}; + +struct tegra210_clk_emc_config { + long unsigned int rate; + bool same_freq; + u32 value; + long unsigned int parent_rate; + u8 parent; +}; + +struct tegra210_clk_emc_provider { + struct module *owner; + struct device *dev; + struct tegra210_clk_emc_config *configs; + unsigned int num_configs; + int (*set_rate)(struct device *, const struct tegra210_clk_emc_config *); +}; + +struct tegra210_clk_emc { + struct clk_hw hw; + void *regs; + struct tegra210_clk_emc_provider *provider; + struct clk *parents[8]; +}; + +typedef struct generic_pm_domain * (*genpd_xlate_t)(struct of_phandle_args *, void *); + +struct genpd_onecell_data { + struct generic_pm_domain **domains; + unsigned int num_domains; + genpd_xlate_t xlate; +}; + +enum { + CMD_CLK_GET_RATE = 1, + CMD_CLK_SET_RATE = 2, + CMD_CLK_ROUND_RATE = 3, + CMD_CLK_GET_PARENT = 4, + CMD_CLK_SET_PARENT = 5, + CMD_CLK_IS_ENABLED = 6, + CMD_CLK_ENABLE = 7, + CMD_CLK_DISABLE = 8, + CMD_CLK_GET_ALL_INFO = 14, + CMD_CLK_GET_MAX_CLK_ID = 15, + CMD_CLK_GET_FMAX_AT_VMIN = 16, + CMD_CLK_MAX = 17, +}; + +struct cmd_clk_get_rate_request {}; + +struct cmd_clk_get_rate_response { + int64_t rate; +}; + +struct cmd_clk_set_rate_request { + int32_t unused; + int64_t rate; +} __attribute__((packed)); + +struct cmd_clk_set_rate_response { + int64_t rate; +}; + +struct cmd_clk_round_rate_request { + int32_t unused; + int64_t rate; +} __attribute__((packed)); + +struct cmd_clk_round_rate_response { + int64_t rate; +}; + +struct cmd_clk_get_parent_request {}; + +struct cmd_clk_get_parent_response { + uint32_t parent_id; +}; + +struct cmd_clk_set_parent_request { + uint32_t parent_id; +}; + +struct cmd_clk_set_parent_response { + uint32_t parent_id; +}; + +struct cmd_clk_is_enabled_request {}; + +struct cmd_clk_is_enabled_response { + int32_t state; +}; + +struct cmd_clk_enable_request {}; + +struct cmd_clk_disable_request {}; + +struct cmd_clk_get_all_info_request {}; + +struct cmd_clk_get_all_info_response { + uint32_t flags; + uint32_t parent; + uint32_t parents[16]; + uint8_t num_parents; + uint8_t name[40]; +} __attribute__((packed)); + +struct cmd_clk_get_max_clk_id_request {}; + +struct cmd_clk_get_max_clk_id_response { + uint32_t max_id; +}; + +struct cmd_clk_get_fmax_at_vmin_request {}; + +struct mrq_clk_request { + uint32_t cmd_and_id; + union { + struct cmd_clk_get_rate_request clk_get_rate; + struct cmd_clk_set_rate_request clk_set_rate; + struct cmd_clk_round_rate_request clk_round_rate; + struct cmd_clk_get_parent_request clk_get_parent; + struct cmd_clk_set_parent_request clk_set_parent; + struct cmd_clk_enable_request clk_enable; + struct cmd_clk_disable_request clk_disable; + struct cmd_clk_is_enabled_request clk_is_enabled; + struct cmd_clk_get_all_info_request clk_get_all_info; + struct cmd_clk_get_max_clk_id_request clk_get_max_clk_id; + struct cmd_clk_get_fmax_at_vmin_request clk_get_fmax_at_vmin; + }; +} __attribute__((packed)); + +struct tegra_bpmp_ops; + +struct tegra_bpmp_soc { + struct { + struct { + unsigned int offset; + unsigned int count; + unsigned int timeout; + } cpu_tx; + struct { + unsigned int offset; + unsigned int count; + unsigned int timeout; + } thread; + struct { + unsigned int offset; + unsigned int count; + unsigned int timeout; + } cpu_rx; + } channels; + const struct tegra_bpmp_ops *ops; + unsigned int num_resets; +}; + +struct tegra_bpmp; + +struct tegra_bpmp_channel; + +struct tegra_bpmp_ops { + int (*init)(struct tegra_bpmp *); + void (*deinit)(struct tegra_bpmp *); + bool (*is_response_ready)(struct tegra_bpmp_channel *); + bool (*is_request_ready)(struct tegra_bpmp_channel *); + int (*ack_response)(struct tegra_bpmp_channel *); + int (*ack_request)(struct tegra_bpmp_channel *); + bool (*is_response_channel_free)(struct tegra_bpmp_channel *); + bool (*is_request_channel_free)(struct tegra_bpmp_channel *); + int (*post_response)(struct tegra_bpmp_channel *); + int (*post_request)(struct tegra_bpmp_channel *); + int (*ring_doorbell)(struct tegra_bpmp *); + int (*resume)(struct tegra_bpmp *); +}; + +struct tegra_bpmp_mb_data { + u32 code; + u32 flags; + u8 data[120]; +}; + +struct tegra_ivc; + +struct tegra_bpmp_channel { + struct tegra_bpmp *bpmp; + struct tegra_bpmp_mb_data *ib; + struct tegra_bpmp_mb_data *ob; + struct completion completion; + struct tegra_ivc *ivc; + unsigned int index; +}; + +struct tegra_bpmp_clk; + +struct tegra_bpmp { + const struct tegra_bpmp_soc *soc; + struct device *dev; + void *priv; + struct { + struct mbox_client client; + struct mbox_chan___2 *channel; + } mbox; + spinlock_t atomic_tx_lock; + struct tegra_bpmp_channel *tx_channel; + struct tegra_bpmp_channel *rx_channel; + struct tegra_bpmp_channel *threaded_channels; + struct { + long unsigned int *allocated; + long unsigned int *busy; + unsigned int count; + struct semaphore lock; + } threaded; + struct list_head mrqs; + spinlock_t lock; + struct tegra_bpmp_clk **clocks; + unsigned int num_clocks; + struct reset_controller_dev rstc; + struct genpd_onecell_data genpd; + struct dentry *debugfs_mirror; +}; + +struct tegra_bpmp_clk { + struct clk_hw hw; + struct tegra_bpmp *bpmp; + unsigned int id; + unsigned int num_parents; + unsigned int *parents; +}; + +struct tegra_bpmp_message { + unsigned int mrq; + struct { + const void *data; + size_t size; + } tx; + struct { + void *data; + size_t size; + int ret; + } rx; +}; + +struct tegra_bpmp_clk_info { + unsigned int id; + char name[40]; + unsigned int parents[16]; + unsigned int num_parents; + long unsigned int flags; +}; + +struct tegra_bpmp_clk_message { + unsigned int cmd; + unsigned int id; + struct { + const void *data; + size_t size; + } tx; + struct { + void *data; + size_t size; + int ret; + } rx; +}; + +struct clk_sp810; + +struct clk_sp810_timerclken { + struct clk_hw hw; + struct clk *clk; + struct clk_sp810 *sp810; + int channel; +}; + +struct clk_sp810 { + struct device_node *node; + void *base; + spinlock_t lock; + struct clk_sp810_timerclken timerclken[4]; +}; + +struct vexpress_osc { + struct regmap *reg; + struct clk_hw hw; + long unsigned int rate_min; + long unsigned int rate_max; +}; + +struct clock_topology { + u32 type; + u32 flag; + u32 type_flag; + u8 custom_type_flag; +}; + +struct zynqmp_pll { + struct clk_hw hw; + u32 clk_id; + bool set_pll_mode; +}; + +enum pll_mode { + PLL_MODE_INT = 0, + PLL_MODE_FRAC = 1, + PLL_MODE_ERROR = 2, +}; + +struct zynqmp_clk_gate { + struct clk_hw hw; + u8 flags; + u32 clk_id; +}; + +enum pm_query_id { + PM_QID_INVALID = 0, + PM_QID_CLOCK_GET_NAME = 1, + PM_QID_CLOCK_GET_TOPOLOGY = 2, + PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS = 3, + PM_QID_CLOCK_GET_PARENTS = 4, + PM_QID_CLOCK_GET_ATTRIBUTES = 5, + PM_QID_PINCTRL_GET_NUM_PINS = 6, + PM_QID_PINCTRL_GET_NUM_FUNCTIONS = 7, + PM_QID_PINCTRL_GET_NUM_FUNCTION_GROUPS = 8, + PM_QID_PINCTRL_GET_FUNCTION_NAME = 9, + PM_QID_PINCTRL_GET_FUNCTION_GROUPS = 10, + PM_QID_PINCTRL_GET_PIN_GROUPS = 11, + PM_QID_CLOCK_GET_NUM_CLOCKS = 12, + PM_QID_CLOCK_GET_MAX_DIVISOR = 13, +}; + +struct zynqmp_pm_query_data { + u32 qid; + u32 arg1; + u32 arg2; + u32 arg3; +}; + +enum topology_type { + TYPE_INVALID = 0, + TYPE_MUX = 1, + TYPE_PLL = 2, + TYPE_FIXEDFACTOR = 3, + TYPE_DIV1 = 4, + TYPE_DIV2 = 5, + TYPE_GATE = 6, +}; + +struct zynqmp_clk_divider { + struct clk_hw hw; + u8 flags; + bool is_frac; + u32 clk_id; + u32 div_type; + u16 max_div; +}; + +struct zynqmp_clk_mux { + struct clk_hw hw; + u8 flags; + u32 clk_id; +}; + +enum clk_type { + CLK_TYPE_OUTPUT = 0, + CLK_TYPE_EXTERNAL = 1, +}; + +struct clock_parent { + char name[50]; + int id; + u32 flag; +}; + +struct zynqmp_clock { + char clk_name[50]; + u32 valid; + enum clk_type type; + struct clock_topology node[6]; + u32 num_nodes; + struct clock_parent parent[100]; + u32 num_parents; + u32 clk_id; +}; + +struct name_resp { + char name[16]; +}; + +struct topology_resp { + u32 topology[3]; +}; + +struct parents_resp { + u32 parents[3]; +}; + +struct attr_resp { + u32 attr[1]; +}; + +struct dma_chan_tbl_ent { + struct dma_chan *chan; +}; + +struct dmaengine_unmap_pool { + struct kmem_cache *cache; + const char *name; + mempool_t *pool; + size_t size; +}; + +struct dmaengine_desc_callback { + dma_async_tx_callback callback; + dma_async_tx_callback_result callback_result; + void *callback_param; +}; + +struct virt_dma_desc { + struct dma_async_tx_descriptor tx; + struct dmaengine_result tx_result; + struct list_head node; +}; + +struct virt_dma_chan { + struct dma_chan chan; + struct tasklet_struct task; + void (*desc_free)(struct virt_dma_desc *); + spinlock_t lock; + struct list_head desc_allocated; + struct list_head desc_submitted; + struct list_head desc_issued; + struct list_head desc_completed; + struct list_head desc_terminated; + struct virt_dma_desc *cyclic; +}; + +struct acpi_table_csrt { + struct acpi_table_header header; +}; + +struct acpi_csrt_group { + u32 length; + u32 vendor_id; + u32 subvendor_id; + u16 device_id; + u16 subdevice_id; + u16 revision; + u16 reserved; + u32 shared_info_length; +}; + +struct acpi_csrt_shared_info { + u16 major_version; + u16 minor_version; + u32 mmio_base_low; + u32 mmio_base_high; + u32 gsi_interrupt; + u8 interrupt_polarity; + u8 interrupt_mode; + u8 num_channels; + u8 dma_address_width; + u16 base_request_line; + u16 num_handshake_signals; + u32 max_block_size; +}; + +struct acpi_dma_spec { + int chan_id; + int slave_id; + struct device *dev; +}; + +struct acpi_dma { + struct list_head dma_controllers; + struct device *dev; + struct dma_chan * (*acpi_dma_xlate)(struct acpi_dma_spec *, struct acpi_dma *); + void *data; + short unsigned int base_request_line; + short unsigned int end_request_line; +}; + +struct acpi_dma_filter_info { + dma_cap_mask_t dma_cap; + dma_filter_fn filter_fn; +}; + +struct acpi_dma_parser_data { + struct acpi_dma_spec dma_spec; + size_t index; + size_t n; +}; + +struct of_dma { + struct list_head of_dma_controllers; + struct device_node *of_node; + struct dma_chan * (*of_dma_xlate)(struct of_phandle_args *, struct of_dma *); + void * (*of_dma_route_allocate)(struct of_phandle_args *, struct of_dma *); + struct dma_router *dma_router; + void *of_dma_data; +}; + +struct of_dma_filter_info { + dma_cap_mask_t dma_cap; + dma_filter_fn filter_fn; +}; + +enum { + PL08X_AHB1 = 1, + PL08X_AHB2 = 2, +}; + +struct pl08x_channel_data { + const char *bus_id; + int min_signal; + int max_signal; + u32 muxval; + dma_addr_t addr; + bool single; + u8 periph_buses; +}; + +enum pl08x_burst_size { + PL08X_BURST_SZ_1 = 0, + PL08X_BURST_SZ_4 = 1, + PL08X_BURST_SZ_8 = 2, + PL08X_BURST_SZ_16 = 3, + PL08X_BURST_SZ_32 = 4, + PL08X_BURST_SZ_64 = 5, + PL08X_BURST_SZ_128 = 6, + PL08X_BURST_SZ_256 = 7, +}; + +enum pl08x_bus_width { + PL08X_BUS_WIDTH_8_BITS = 0, + PL08X_BUS_WIDTH_16_BITS = 1, + PL08X_BUS_WIDTH_32_BITS = 2, +}; + +struct pl08x_platform_data { + struct pl08x_channel_data *slave_channels; + unsigned int num_slave_channels; + enum pl08x_burst_size memcpy_burst_size; + enum pl08x_bus_width memcpy_bus_width; + bool memcpy_prot_buff; + bool memcpy_prot_cache; + int (*get_xfer_signal)(const struct pl08x_channel_data *); + void (*put_xfer_signal)(const struct pl08x_channel_data *, int); + u8 lli_buses; + u8 mem_buses; + const struct dma_slave_map *slave_map; + int slave_map_len; +}; + +struct vendor_data { + u8 config_offset; + u8 channels; + u8 signals; + bool dualmaster; + bool nomadik; + bool pl080s; + bool ftdmac020; + u32 max_transfer_size; +}; + +struct pl08x_bus_data { + dma_addr_t addr; + u8 maxwidth; + u8 buswidth; +}; + +struct pl08x_dma_chan; + +struct pl08x_phy_chan { + unsigned int id; + void *base; + void *reg_config; + void *reg_control; + void *reg_src; + void *reg_dst; + void *reg_lli; + void *reg_busy; + spinlock_t lock; + struct pl08x_dma_chan *serving; + bool locked; + bool ftdmac020; + bool pl080s; +}; + +enum pl08x_dma_chan_state { + PL08X_CHAN_IDLE = 0, + PL08X_CHAN_RUNNING = 1, + PL08X_CHAN_PAUSED = 2, + PL08X_CHAN_WAITING = 3, +}; + +struct pl08x_txd; + +struct pl08x_driver_data; + +struct pl08x_dma_chan { + struct virt_dma_chan vc; + struct pl08x_phy_chan *phychan; + const char *name; + struct pl08x_channel_data *cd; + struct dma_slave_config cfg; + struct pl08x_txd *at; + struct pl08x_driver_data *host; + enum pl08x_dma_chan_state state; + bool slave; + int signal; + unsigned int mux_use; + long unsigned int waiting_at; +}; + +struct pl08x_sg { + dma_addr_t src_addr; + dma_addr_t dst_addr; + size_t len; + struct list_head node; +}; + +struct pl08x_txd { + struct virt_dma_desc vd; + struct list_head dsg_list; + dma_addr_t llis_bus; + u32 *llis_va; + u32 cctl; + u32 ccfg; + bool done; + bool cyclic; +}; + +struct dma_pool___2; + +struct pl08x_driver_data { + struct dma_device slave; + struct dma_device memcpy; + bool has_slave; + void *base; + struct amba_device *adev; + const struct vendor_data *vd; + struct pl08x_platform_data *pd; + struct pl08x_phy_chan *phy_chans; + struct dma_pool___2 *pool; + u8 lli_buses; + u8 mem_buses; + u8 lli_words; +}; + +struct pl08x_lli_build_data { + struct pl08x_txd *txd; + struct pl08x_bus_data srcbus; + struct pl08x_bus_data dstbus; + size_t remainder; + u32 lli_bus; +}; + +struct burst_table { + u32 burstwords; + u32 reg; +}; + +struct bcm2835_dmadev { + struct dma_device ddev; + void *base; + dma_addr_t zero_page; +}; + +struct bcm2835_dma_cb { + uint32_t info; + uint32_t src; + uint32_t dst; + uint32_t length; + uint32_t stride; + uint32_t next; + uint32_t pad[2]; +}; + +struct bcm2835_cb_entry { + struct bcm2835_dma_cb *cb; + dma_addr_t paddr; +}; + +struct bcm2835_desc; + +struct bcm2835_chan { + struct virt_dma_chan vc; + struct dma_slave_config cfg; + unsigned int dreq; + int ch; + struct bcm2835_desc *desc; + struct dma_pool___2 *cb_pool; + void *chan_base; + int irq_number; + unsigned int irq_flags; + bool is_lite_channel; +}; + +struct bcm2835_desc { + struct bcm2835_chan *c; + struct virt_dma_desc vd; + enum dma_transfer_direction dir; + unsigned int frames; + size_t size; + bool cyclic; + struct bcm2835_cb_entry cb_list[0]; +}; + +struct mbus_dram_window { + u8 cs_index; + u8 mbus_attr; + u64 base; + u64 size; +}; + +struct mbus_dram_target_info { + u8 mbus_dram_target_id; + int num_cs; + struct mbus_dram_window cs[4]; +}; + +struct mv_xor_channel_data { + dma_cap_mask_t cap_mask; +}; + +struct mv_xor_platform_data { + struct mv_xor_channel_data *channels; +}; + +struct mv_xor_chan; + +struct mv_xor_device { + void *xor_base; + void *xor_high_base; + struct clk *clk; + struct mv_xor_chan *channels[2]; + int xor_type; + u32 win_start[8]; + u32 win_end[8]; +}; + +struct mv_xor_chan { + int pending; + spinlock_t lock; + void *mmr_base; + void *mmr_high_base; + unsigned int idx; + int irq; + struct list_head chain; + struct list_head free_slots; + struct list_head allocated_slots; + struct list_head completed_slots; + dma_addr_t dma_desc_pool; + void *dma_desc_pool_virt; + size_t pool_size; + struct dma_device dmadev; + struct dma_chan dmachan; + int slots_allocated; + struct tasklet_struct irq_tasklet; + int op_in_desc; + char dummy_src[128]; + char dummy_dst[128]; + dma_addr_t dummy_src_addr; + dma_addr_t dummy_dst_addr; + u32 saved_config_reg; + u32 saved_int_mask_reg; + struct mv_xor_device *xordev; +}; + +struct mv_xor_desc_slot { + struct list_head node; + struct list_head sg_tx_list; + enum dma_transaction_type type; + void *hw_desc; + u16 idx; + struct dma_async_tx_descriptor async_tx; +}; + +struct mv_xor_desc { + u32 status; + u32 crc32_result; + u32 desc_command; + u32 phy_next_desc; + u32 byte_count; + u32 phy_dest_addr; + u32 phy_src_addr[8]; + u32 reserved0; + u32 reserved1; +}; + +enum mv_xor_type { + XOR_ORION = 0, + XOR_ARMADA_38X = 1, + XOR_ARMADA_37XX = 2, +}; + +enum mv_xor_mode { + XOR_MODE_IN_REG = 0, + XOR_MODE_IN_DESC = 1, +}; + +struct mv_xor_v2_descriptor { + u16 desc_id; + u16 flags; + u32 crc32_result; + u32 desc_ctrl; + u32 buff_size; + u32 fill_pattern_src_addr[4]; + u32 data_buff_addr[12]; + u32 reserved[12]; +}; + +struct mv_xor_v2_sw_desc; + +struct mv_xor_v2_device { + spinlock_t lock; + void *dma_base; + void *glob_base; + struct clk *clk; + struct clk *reg_clk; + struct tasklet_struct irq_tasklet; + struct list_head free_sw_desc; + struct dma_device dmadev; + struct dma_chan dmachan; + dma_addr_t hw_desq; + struct mv_xor_v2_descriptor *hw_desq_virt; + struct mv_xor_v2_sw_desc *sw_desq; + int desc_size; + unsigned int npendings; + unsigned int hw_queue_idx; + struct msi_desc *msi_desc; +}; + +struct mv_xor_v2_sw_desc { + int idx; + struct dma_async_tx_descriptor async_tx; + struct mv_xor_v2_descriptor hw_desc; + struct list_head free_list; +}; + +struct mxs_dma_ccw { + u32 next; + u16 bits; + u16 xfer_bytes; + u32 bufaddr; + u32 pio_words[16]; +}; + +struct mxs_dma_engine; + +struct mxs_dma_chan { + struct mxs_dma_engine *mxs_dma; + struct dma_chan chan; + struct dma_async_tx_descriptor desc; + struct tasklet_struct tasklet; + unsigned int chan_irq; + struct mxs_dma_ccw *ccw; + dma_addr_t ccw_phys; + int desc_count; + enum dma_status status; + unsigned int flags; + bool reset; +}; + +enum mxs_dma_id { + IMX23_DMA = 0, + IMX28_DMA = 1, +}; + +enum mxs_dma_devtype { + MXS_DMA_APBH = 0, + MXS_DMA_APBX = 1, +}; + +struct mxs_dma_engine { + enum mxs_dma_id dev_id; + enum mxs_dma_devtype type; + void *base; + struct clk *clk; + struct dma_device dma_device; + struct mxs_dma_chan mxs_chans[16]; + struct platform_device *pdev; + unsigned int nr_channels; +}; + +struct mxs_dma_type { + enum mxs_dma_id id; + enum mxs_dma_devtype type; +}; + +struct mxs_dma_filter_param { + unsigned int chan_id; +}; + +struct idmac { + struct dma_device dma; +}; + +struct ipu { + void *reg_ipu; + void *reg_ic; + unsigned int irq_fn; + unsigned int irq_err; + unsigned int irq_base; + long unsigned int channel_init_mask; + spinlock_t lock; + struct clk *ipu_clk; + struct device *dev; + struct idmac idmac; + struct idmac_channel channel[32]; + struct tasklet_struct tasklet; +}; + +struct ipu_irq_bank { + unsigned int control; + unsigned int status; + struct ipu *ipu; +}; + +struct ipu_irq_map { + unsigned int irq; + int source; + struct ipu_irq_bank *bank; + struct ipu *ipu; +}; + +enum ipu_color_space { + IPU_COLORSPACE_RGB = 0, + IPU_COLORSPACE_YCBCR = 1, + IPU_COLORSPACE_YUV = 2, +}; + +enum ipu_rotate_mode { + IPU_ROTATE_NONE = 0, + IPU_ROTATE_VERT_FLIP = 1, + IPU_ROTATE_HORIZ_FLIP = 2, + IPU_ROTATE_180 = 3, + IPU_ROTATE_90_RIGHT = 4, + IPU_ROTATE_90_RIGHT_VFLIP = 5, + IPU_ROTATE_90_RIGHT_HFLIP = 6, + IPU_ROTATE_90_LEFT = 7, +}; + +struct chan_param_mem_planar { + u32 xv: 10; + u32 yv: 10; + u32 xb: 12; + u32 yb: 12; + u32 res1: 2; + u32 nsb: 1; + u32 lnpb: 6; + u32 ubo_l: 11; + u32 ubo_h: 15; + u32 vbo_l: 17; + u32 vbo_h: 9; + u32 res2: 3; + u32 fw: 12; + u32 fh_l: 8; + u32 fh_h: 4; + u32 res3: 28; + u32 eba0; + u32 eba1; + u32 bpp: 3; + u32 sl: 14; + u32 pfs: 3; + u32 bam: 3; + u32 res4: 2; + u32 npb: 6; + u32 res5: 1; + u32 sat: 2; + u32 res6: 30; +}; + +struct chan_param_mem_interleaved { + u32 xv: 10; + u32 yv: 10; + u32 xb: 12; + u32 yb: 12; + u32 sce: 1; + u32 res1: 1; + u32 nsb: 1; + u32 lnpb: 6; + u32 sx: 10; + u32 sy_l: 1; + u32 sy_h: 9; + u32 ns: 10; + u32 sm: 10; + u32 sdx_l: 3; + u32 sdx_h: 2; + u32 sdy: 5; + u32 sdrx: 1; + u32 sdry: 1; + u32 sdr1: 1; + u32 res2: 2; + u32 fw: 12; + u32 fh_l: 8; + u32 fh_h: 4; + u32 res3: 28; + u32 eba0; + u32 eba1; + u32 bpp: 3; + u32 sl: 14; + u32 pfs: 3; + u32 bam: 3; + u32 res4: 2; + u32 npb: 6; + u32 res5: 1; + u32 sat: 2; + u32 scc: 1; + u32 ofs0: 5; + u32 ofs1: 5; + u32 ofs2: 5; + u32 ofs3: 5; + u32 wid0: 3; + u32 wid1: 3; + u32 wid2: 3; + u32 wid3: 3; + u32 dec_sel: 1; + u32 res6: 28; +}; + +union chan_param_mem { + struct chan_param_mem_planar pp; + struct chan_param_mem_interleaved ip; +}; + +struct trace_event_raw_tegra_dma_tx_status { + struct trace_entry ent; + u32 __data_loc_chan; + dma_cookie_t cookie; + __u32 residue; + char __data[0]; +}; + +struct trace_event_raw_tegra_dma_complete_cb { + struct trace_entry ent; + u32 __data_loc_chan; + int count; + void *ptr; + char __data[0]; +}; + +struct trace_event_raw_tegra_dma_isr { + struct trace_entry ent; + u32 __data_loc_chan; + int irq; + char __data[0]; +}; + +struct trace_event_data_offsets_tegra_dma_tx_status { + u32 chan; +}; + +struct trace_event_data_offsets_tegra_dma_complete_cb { + u32 chan; +}; + +struct trace_event_data_offsets_tegra_dma_isr { + u32 chan; +}; + +typedef void (*btf_trace_tegra_dma_tx_status)(void *, struct dma_chan *, dma_cookie_t, struct dma_tx_state *); + +typedef void (*btf_trace_tegra_dma_complete_cb)(void *, struct dma_chan *, int, void *); + +typedef void (*btf_trace_tegra_dma_isr)(void *, struct dma_chan *, int); + +struct tegra_dma_chip_data { + unsigned int nr_channels; + unsigned int channel_reg_size; + unsigned int max_dma_count; + bool support_channel_pause; + bool support_separate_wcount_reg; +}; + +struct tegra_dma_channel_regs { + u32 csr; + u32 ahb_ptr; + u32 apb_ptr; + u32 ahb_seq; + u32 apb_seq; + u32 wcount; +}; + +struct tegra_dma_desc; + +struct tegra_dma_sg_req { + struct tegra_dma_channel_regs ch_regs; + unsigned int req_len; + bool configured; + bool last_sg; + struct list_head node; + struct tegra_dma_desc *dma_desc; + unsigned int words_xferred; +}; + +struct tegra_dma_desc { + struct dma_async_tx_descriptor txd; + unsigned int bytes_requested; + unsigned int bytes_transferred; + enum dma_status dma_status; + struct list_head node; + struct list_head tx_list; + struct list_head cb_node; + unsigned int cb_count; +}; + +struct tegra_dma_channel; + +typedef void (*dma_isr_handler)(struct tegra_dma_channel *, bool); + +struct tegra_dma; + +struct tegra_dma_channel { + struct dma_chan dma_chan; + char name[12]; + bool config_init; + unsigned int id; + void *chan_addr; + spinlock_t lock; + bool busy; + struct tegra_dma *tdma; + bool cyclic; + struct list_head free_sg_req; + struct list_head pending_sg_req; + struct list_head free_dma_desc; + struct list_head cb_desc; + dma_isr_handler isr_handler; + struct tasklet_struct tasklet; + unsigned int slave_id; + struct dma_slave_config dma_sconfig; + struct tegra_dma_channel_regs channel_reg; + struct wait_queue_head wq; +}; + +struct tegra_dma { + struct dma_device dma_dev; + struct device *dev; + struct clk *dma_clk; + struct reset_control *rst; + spinlock_t global_lock; + void *base_addr; + const struct tegra_dma_chip_data *chip_data; + u32 global_pause_count; + struct tegra_dma_channel channels[0]; +}; + +enum k3_ring_mode { + K3_RINGACC_RING_MODE_RING = 0, + K3_RINGACC_RING_MODE_MESSAGE = 1, + K3_RINGACC_RING_MODE_CREDENTIALS = 2, + K3_RINGACC_RING_MODE_INVALID = 3, +}; + +enum k3_ring_size { + K3_RINGACC_RING_ELSIZE_4 = 0, + K3_RINGACC_RING_ELSIZE_8 = 1, + K3_RINGACC_RING_ELSIZE_16 = 2, + K3_RINGACC_RING_ELSIZE_32 = 3, + K3_RINGACC_RING_ELSIZE_64 = 4, + K3_RINGACC_RING_ELSIZE_128 = 5, + K3_RINGACC_RING_ELSIZE_256 = 6, + K3_RINGACC_RING_ELSIZE_INVALID = 7, +}; + +struct k3_ring_cfg { + u32 size; + enum k3_ring_size elm_size; + enum k3_ring_mode mode; + u32 flags; + struct device *dma_dev; + u32 asel; +}; + +struct k3_ringacc_init_data { + const struct ti_sci_handle *tisci; + u32 tisci_dev_id; + u32 num_rings; +}; + +struct k3_event_route_data { + void *priv; + int (*set_event)(void *, u32); +}; + +struct cppi5_desc_hdr_t { + u32 pkt_info0; + u32 pkt_info1; + u32 pkt_info2; + u32 src_dst_tag; +}; + +struct cppi5_host_desc_t { + struct cppi5_desc_hdr_t hdr; + u64 next_desc; + u64 buf_ptr; + u32 buf_info1; + u32 org_buf_len; + u64 org_buf_ptr; + u32 epib[0]; +}; + +enum cppi5_tr_types { + CPPI5_TR_TYPE0 = 0, + CPPI5_TR_TYPE1 = 1, + CPPI5_TR_TYPE2 = 2, + CPPI5_TR_TYPE3 = 3, + CPPI5_TR_TYPE4 = 4, + CPPI5_TR_TYPE5 = 5, + CPPI5_TR_TYPE8 = 8, + CPPI5_TR_TYPE9 = 9, + CPPI5_TR_TYPE10 = 10, + CPPI5_TR_TYPE11 = 11, + CPPI5_TR_TYPE15 = 15, + CPPI5_TR_TYPE_MAX = 16, +}; + +enum cppi5_tr_event_size { + CPPI5_TR_EVENT_SIZE_COMPLETION = 0, + CPPI5_TR_EVENT_SIZE_ICNT1_DEC = 1, + CPPI5_TR_EVENT_SIZE_ICNT2_DEC = 2, + CPPI5_TR_EVENT_SIZE_ICNT3_DEC = 3, + CPPI5_TR_EVENT_SIZE_MAX = 4, +}; + +enum cppi5_tr_trigger { + CPPI5_TR_TRIGGER_NONE = 0, + CPPI5_TR_TRIGGER_GLOBAL0 = 1, + CPPI5_TR_TRIGGER_GLOBAL1 = 2, + CPPI5_TR_TRIGGER_LOCAL_EVENT = 3, + CPPI5_TR_TRIGGER_MAX = 4, +}; + +enum cppi5_tr_trigger_type { + CPPI5_TR_TRIGGER_TYPE_ICNT1_DEC = 0, + CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC = 1, + CPPI5_TR_TRIGGER_TYPE_ICNT3_DEC = 2, + CPPI5_TR_TRIGGER_TYPE_ALL = 3, + CPPI5_TR_TRIGGER_TYPE_MAX = 4, +}; + +typedef u32 cppi5_tr_flags_t; + +struct cppi5_tr_type1_t { + cppi5_tr_flags_t flags; + u16 icnt0; + u16 icnt1; + u64 addr; + s32 dim1; + long: 32; + long: 64; +}; + +struct cppi5_tr_type15_t { + cppi5_tr_flags_t flags; + u16 icnt0; + u16 icnt1; + u64 addr; + s32 dim1; + u16 icnt2; + u16 icnt3; + s32 dim2; + s32 dim3; + u32 _reserved; + s32 ddim1; + u64 daddr; + s32 ddim2; + s32 ddim3; + u16 dicnt0; + u16 dicnt1; + u16 dicnt2; + u16 dicnt3; +}; + +struct cppi5_tr_resp_t { + u8 status; + u8 _reserved; + u8 cmd_id; + u8 flags; +}; + +enum udma_rm_range { + RM_RANGE_BCHAN = 0, + RM_RANGE_TCHAN = 1, + RM_RANGE_RCHAN = 2, + RM_RANGE_RFLOW = 3, + RM_RANGE_TFLOW = 4, + RM_RANGE_LAST = 5, +}; + +struct udma_tisci_rm { + const struct ti_sci_handle *tisci; + const struct ti_sci_rm_udmap_ops *tisci_udmap_ops; + u32 tisci_dev_id; + const struct ti_sci_rm_psil_ops *tisci_psil_ops; + u32 tisci_navss_dev_id; + struct ti_sci_resource *rm_ranges[5]; +}; + +enum udma_tp_level { + UDMA_TP_NORMAL = 0, + UDMA_TP_HIGH = 1, + UDMA_TP_ULTRAHIGH = 2, + UDMA_TP_LAST = 3, +}; + +enum psil_endpoint_type { + PSIL_EP_NATIVE = 0, + PSIL_EP_PDMA_XY = 1, + PSIL_EP_PDMA_MCAN = 2, + PSIL_EP_PDMA_AASRC = 3, +}; + +struct psil_endpoint_config { + enum psil_endpoint_type ep_type; + enum udma_tp_level channel_tpl; + unsigned int pkt_mode: 1; + unsigned int notdpkt: 1; + unsigned int needs_epib: 1; + unsigned int pdma_acc32: 1; + unsigned int pdma_burst: 1; + u32 psd_size; + s16 mapped_channel_id; + u16 flow_start; + u16 flow_num; + s16 default_flow_id; +}; + +struct udma_static_tr { + u8 elsize; + u16 elcnt; + u16 bstcnt; +}; + +enum k3_dma_type { + DMA_TYPE_UDMA = 0, + DMA_TYPE_BCDMA = 1, + DMA_TYPE_PKTDMA = 2, +}; + +enum udma_mmr { + MMR_GCFG = 0, + MMR_BCHANRT = 1, + MMR_RCHANRT = 2, + MMR_TCHANRT = 3, + MMR_LAST = 4, +}; + +struct k3_ring; + +struct udma_tchan { + void *reg_rt; + int id; + struct k3_ring *t_ring; + struct k3_ring *tc_ring; + int tflow_id; +}; + +struct udma_rflow { + int id; + struct k3_ring *fd_ring; + struct k3_ring *r_ring; +}; + +struct udma_rchan { + void *reg_rt; + int id; +}; + +struct udma_oes_offsets { + u32 udma_rchan; + u32 bcdma_bchan_data; + u32 bcdma_bchan_ring; + u32 bcdma_tchan_data; + u32 bcdma_tchan_ring; + u32 bcdma_rchan_data; + u32 bcdma_rchan_ring; + u32 pktdma_tchan_flow; + u32 pktdma_rchan_flow; +}; + +struct udma_match_data { + enum k3_dma_type type; + u32 psil_base; + bool enable_memcpy_support; + u32 flags; + u32 statictr_z_mask; + u8 burst_size[3]; +}; + +struct udma_soc_data { + struct udma_oes_offsets oes; + u32 bcdma_trigger_event_offset; +}; + +struct udma_hwdesc { + size_t cppi5_desc_size; + void *cppi5_desc_vaddr; + dma_addr_t cppi5_desc_paddr; + void *tr_req_base; + struct cppi5_tr_resp_t *tr_resp_base; +}; + +struct udma_rx_flush { + struct udma_hwdesc hwdescs[2]; + size_t buffer_size; + void *buffer_vaddr; + dma_addr_t buffer_paddr; +}; + +struct udma_tpl { + u8 levels; + u32 start_idx[3]; +}; + +struct k3_ringacc; + +struct udma_chan; + +struct udma_dev { + struct dma_device ddev; + struct device *dev; + void *mmrs[4]; + const struct udma_match_data *match_data; + const struct udma_soc_data *soc_data; + struct udma_tpl bchan_tpl; + struct udma_tpl tchan_tpl; + struct udma_tpl rchan_tpl; + size_t desc_align; + struct udma_tisci_rm tisci_rm; + struct k3_ringacc *ringacc; + struct work_struct purge_work; + struct list_head desc_to_purge; + spinlock_t lock; + struct udma_rx_flush rx_flush; + int bchan_cnt; + int tchan_cnt; + int echan_cnt; + int rchan_cnt; + int rflow_cnt; + int tflow_cnt; + long unsigned int *bchan_map; + long unsigned int *tchan_map; + long unsigned int *rchan_map; + long unsigned int *rflow_gp_map; + long unsigned int *rflow_gp_map_allocated; + long unsigned int *rflow_in_use; + long unsigned int *tflow_map; + struct udma_tchan *bchans; + struct udma_tchan *tchans; + struct udma_rchan *rchans; + struct udma_rflow *rflows; + struct udma_chan *channels; + u32 psil_base; + u32 atype; + u32 asel; +}; + +enum udma_chan_state { + UDMA_CHAN_IS_IDLE = 0, + UDMA_CHAN_IS_ACTIVE = 1, + UDMA_CHAN_IS_TERMINATING = 2, +}; + +struct udma_tx_drain { + struct delayed_work work; + ktime_t tstamp; + u32 residue; +}; + +struct udma_chan_config { + bool pkt_mode; + bool needs_epib; + u32 psd_size; + u32 metadata_size; + u32 hdesc_size; + bool notdpkt; + int remote_thread_id; + u32 atype; + u32 asel; + u32 src_thread; + u32 dst_thread; + enum psil_endpoint_type ep_type; + bool enable_acc32; + bool enable_burst; + enum udma_tp_level channel_tpl; + u32 tr_trigger_type; + int mapped_channel_id; + int default_flow_id; + enum dma_transfer_direction dir; +}; + +struct udma_desc; + +struct udma_chan { + struct virt_dma_chan vc; + struct dma_slave_config cfg; + struct udma_dev *ud; + struct device *dma_dev; + struct udma_desc *desc; + struct udma_desc *terminated_desc; + struct udma_static_tr static_tr; + char *name; + struct udma_tchan *bchan; + struct udma_tchan *tchan; + struct udma_rchan *rchan; + struct udma_rflow *rflow; + bool psil_paired; + int irq_num_ring; + int irq_num_udma; + bool cyclic; + bool paused; + enum udma_chan_state state; + struct completion teardown_completed; + struct udma_tx_drain tx_drain; + u32 bcnt; + struct udma_chan_config config; + bool use_dma_pool; + struct dma_pool___2 *hdesc_pool; + u32 id; +}; + +struct udma_desc { + struct virt_dma_desc vd; + bool terminated; + enum dma_transfer_direction dir; + struct udma_static_tr static_tr; + u32 residue; + unsigned int sglen; + unsigned int desc_idx; + unsigned int tr_idx; + u32 metadata_size; + void *metadata; + unsigned int hwdesc_count; + struct udma_hwdesc hwdesc[0]; +}; + +struct udma_filter_param { + int remote_thread_id; + u32 atype; + u32 asel; + u32 tr_trigger_type; +}; + +struct k3_udma_glue_tx_channel_cfg { + struct k3_ring_cfg tx_cfg; + struct k3_ring_cfg txcq_cfg; + bool tx_pause_on_err; + bool tx_filt_einfo; + bool tx_filt_pswords; + bool tx_supr_tdpkt; + u32 swdata_size; +}; + +struct k3_udma_glue_rx_flow_cfg { + struct k3_ring_cfg rx_cfg; + struct k3_ring_cfg rxfdq_cfg; + int ring_rxq_id; + int ring_rxfdq0_id; + bool rx_error_handling; + int src_tag_lo_sel; +}; + +struct k3_udma_glue_rx_channel_cfg { + u32 swdata_size; + int flow_id_base; + int flow_id_num; + bool flow_id_use_rxchan_id; + bool remote; + struct k3_udma_glue_rx_flow_cfg *def_flow_cfg; +}; + +struct udma_dev___2; + +struct k3_udma_glue_common { + struct device *dev; + struct device chan_dev; + struct udma_dev___2 *udmax; + const struct udma_tisci_rm *tisci_rm; + struct k3_ringacc *ringacc; + u32 src_thread; + u32 dst_thread; + u32 hdesc_size; + bool epib; + u32 psdata_size; + u32 swdata_size; + u32 atype_asel; + struct psil_endpoint_config *ep_config; +}; + +struct udma_tchan___2; + +struct k3_udma_glue_tx_channel { + struct k3_udma_glue_common common; + struct udma_tchan___2 *udma_tchanx; + int udma_tchan_id; + struct k3_ring *ringtx; + struct k3_ring *ringtxcq; + bool psil_paired; + int virq; + atomic_t free_pkts; + bool tx_pause_on_err; + bool tx_filt_einfo; + bool tx_filt_pswords; + bool tx_supr_tdpkt; + int udma_tflow_id; +}; + +struct udma_rflow___2; + +struct k3_udma_glue_rx_flow { + struct udma_rflow___2 *udma_rflow; + int udma_rflow_id; + struct k3_ring *ringrx; + struct k3_ring *ringrxfdq; + int virq; +}; + +struct udma_rchan___2; + +struct k3_udma_glue_rx_channel { + struct k3_udma_glue_common common; + struct udma_rchan___2 *udma_rchanx; + int udma_rchan_id; + bool remote; + bool psil_paired; + u32 swdata_size; + int flow_id_base; + struct k3_udma_glue_rx_flow *flows; + u32 flow_num; + u32 flows_ready; +}; + +struct psil_ep { + u32 thread_id; + struct psil_endpoint_config ep_config; +}; + +struct psil_ep_map { + char *name; + struct psil_ep *src; + int src_count; + struct psil_ep *dst; + int dst_count; +}; + +struct owl_sps_domain_info { + const char *name; + int pwr_bit; + int ack_bit; + unsigned int genpd_flags; +}; + +struct owl_sps_info { + unsigned int num_domains; + const struct owl_sps_domain_info *domains; +}; + +struct owl_sps { + struct device *dev; + const struct owl_sps_info *info; + void *base; + struct genpd_onecell_data genpd_data; + struct generic_pm_domain *domains[0]; +}; + +struct owl_sps_domain { + struct generic_pm_domain genpd; + const struct owl_sps_domain_info *info; + struct owl_sps *sps; +}; + +struct bcm2835_pm { + struct device *dev; + void *base; + void *asb; +}; + +struct bcm2835_power; + +struct bcm2835_power_domain { + struct generic_pm_domain base; + struct bcm2835_power *power; + u32 domain; + struct clk *clk; +}; + +struct bcm2835_power { + struct device *dev; + void *base; + void *asb; + struct genpd_onecell_data pd_xlate; + struct bcm2835_power_domain domains[13]; + struct reset_controller_dev reset; +}; + +enum rpi_firmware_property_tag { + RPI_FIRMWARE_PROPERTY_END = 0, + RPI_FIRMWARE_GET_FIRMWARE_REVISION = 1, + RPI_FIRMWARE_SET_CURSOR_INFO = 32784, + RPI_FIRMWARE_SET_CURSOR_STATE = 32785, + RPI_FIRMWARE_GET_BOARD_MODEL = 65537, + RPI_FIRMWARE_GET_BOARD_REVISION = 65538, + RPI_FIRMWARE_GET_BOARD_MAC_ADDRESS = 65539, + RPI_FIRMWARE_GET_BOARD_SERIAL = 65540, + RPI_FIRMWARE_GET_ARM_MEMORY = 65541, + RPI_FIRMWARE_GET_VC_MEMORY = 65542, + RPI_FIRMWARE_GET_CLOCKS = 65543, + RPI_FIRMWARE_GET_POWER_STATE = 131073, + RPI_FIRMWARE_GET_TIMING = 131074, + RPI_FIRMWARE_SET_POWER_STATE = 163841, + RPI_FIRMWARE_GET_CLOCK_STATE = 196609, + RPI_FIRMWARE_GET_CLOCK_RATE = 196610, + RPI_FIRMWARE_GET_VOLTAGE = 196611, + RPI_FIRMWARE_GET_MAX_CLOCK_RATE = 196612, + RPI_FIRMWARE_GET_MAX_VOLTAGE = 196613, + RPI_FIRMWARE_GET_TEMPERATURE = 196614, + RPI_FIRMWARE_GET_MIN_CLOCK_RATE = 196615, + RPI_FIRMWARE_GET_MIN_VOLTAGE = 196616, + RPI_FIRMWARE_GET_TURBO = 196617, + RPI_FIRMWARE_GET_MAX_TEMPERATURE = 196618, + RPI_FIRMWARE_GET_STC = 196619, + RPI_FIRMWARE_ALLOCATE_MEMORY = 196620, + RPI_FIRMWARE_LOCK_MEMORY = 196621, + RPI_FIRMWARE_UNLOCK_MEMORY = 196622, + RPI_FIRMWARE_RELEASE_MEMORY = 196623, + RPI_FIRMWARE_EXECUTE_CODE = 196624, + RPI_FIRMWARE_EXECUTE_QPU = 196625, + RPI_FIRMWARE_SET_ENABLE_QPU = 196626, + RPI_FIRMWARE_GET_DISPMANX_RESOURCE_MEM_HANDLE = 196628, + RPI_FIRMWARE_GET_EDID_BLOCK = 196640, + RPI_FIRMWARE_GET_CUSTOMER_OTP = 196641, + RPI_FIRMWARE_GET_DOMAIN_STATE = 196656, + RPI_FIRMWARE_GET_THROTTLED = 196678, + RPI_FIRMWARE_GET_CLOCK_MEASURED = 196679, + RPI_FIRMWARE_NOTIFY_REBOOT = 196680, + RPI_FIRMWARE_SET_CLOCK_STATE = 229377, + RPI_FIRMWARE_SET_CLOCK_RATE = 229378, + RPI_FIRMWARE_SET_VOLTAGE = 229379, + RPI_FIRMWARE_SET_TURBO = 229385, + RPI_FIRMWARE_SET_CUSTOMER_OTP = 229409, + RPI_FIRMWARE_SET_DOMAIN_STATE = 229424, + RPI_FIRMWARE_GET_GPIO_STATE = 196673, + RPI_FIRMWARE_SET_GPIO_STATE = 229441, + RPI_FIRMWARE_SET_SDHOST_CLOCK = 229442, + RPI_FIRMWARE_GET_GPIO_CONFIG = 196675, + RPI_FIRMWARE_SET_GPIO_CONFIG = 229443, + RPI_FIRMWARE_GET_PERIPH_REG = 196677, + RPI_FIRMWARE_SET_PERIPH_REG = 229445, + RPI_FIRMWARE_GET_POE_HAT_VAL = 196681, + RPI_FIRMWARE_SET_POE_HAT_VAL = 196688, + RPI_FIRMWARE_NOTIFY_XHCI_RESET = 196696, + RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 262145, + RPI_FIRMWARE_FRAMEBUFFER_BLANK = 262146, + RPI_FIRMWARE_FRAMEBUFFER_GET_PHYSICAL_WIDTH_HEIGHT = 262147, + RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_WIDTH_HEIGHT = 262148, + RPI_FIRMWARE_FRAMEBUFFER_GET_DEPTH = 262149, + RPI_FIRMWARE_FRAMEBUFFER_GET_PIXEL_ORDER = 262150, + RPI_FIRMWARE_FRAMEBUFFER_GET_ALPHA_MODE = 262151, + RPI_FIRMWARE_FRAMEBUFFER_GET_PITCH = 262152, + RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_OFFSET = 262153, + RPI_FIRMWARE_FRAMEBUFFER_GET_OVERSCAN = 262154, + RPI_FIRMWARE_FRAMEBUFFER_GET_PALETTE = 262155, + RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF = 262159, + RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF = 262160, + RPI_FIRMWARE_FRAMEBUFFER_RELEASE = 294913, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PHYSICAL_WIDTH_HEIGHT = 278531, + RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_WIDTH_HEIGHT = 278532, + RPI_FIRMWARE_FRAMEBUFFER_TEST_DEPTH = 278533, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PIXEL_ORDER = 278534, + RPI_FIRMWARE_FRAMEBUFFER_TEST_ALPHA_MODE = 278535, + RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_OFFSET = 278537, + RPI_FIRMWARE_FRAMEBUFFER_TEST_OVERSCAN = 278538, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PALETTE = 278539, + RPI_FIRMWARE_FRAMEBUFFER_TEST_VSYNC = 278542, + RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT = 294915, + RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT = 294916, + RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH = 294917, + RPI_FIRMWARE_FRAMEBUFFER_SET_PIXEL_ORDER = 294918, + RPI_FIRMWARE_FRAMEBUFFER_SET_ALPHA_MODE = 294919, + RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET = 294921, + RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN = 294922, + RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE = 294923, + RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF = 294943, + RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF = 294944, + RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC = 294926, + RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT = 294927, + RPI_FIRMWARE_VCHIQ_INIT = 294928, + RPI_FIRMWARE_GET_COMMAND_LINE = 327681, + RPI_FIRMWARE_GET_DMA_CHANNELS = 393217, +}; + +struct rpi_firmware; + +struct rpi_power_domain { + u32 domain; + bool enabled; + bool old_interface; + struct generic_pm_domain base; + struct rpi_firmware *fw; +}; + +struct rpi_power_domains { + bool has_new_interface; + struct genpd_onecell_data xlate; + struct rpi_firmware *fw; + struct rpi_power_domain domains[23]; +}; + +struct rpi_power_domain_packet { + u32 domain; + u32 on; +}; + +struct bcm_pmb { + struct device *dev; + void *base; + spinlock_t lock; + bool little_endian; + struct genpd_onecell_data genpd_onecell_data; +}; + +struct bcm_pmb_pd_data { + const char * const name; + int id; + u8 bus; + u8 device; +}; + +struct bcm_pmb_pm_domain { + struct bcm_pmb *pmb; + const struct bcm_pmb_pd_data *data; + struct generic_pm_domain genpd; +}; + +struct soc_device; + +enum cpubiuctrl_regs { + CPU_CREDIT_REG = 0, + CPU_MCP_FLOW_REG = 1, + CPU_WRITEBACK_CTRL_REG = 2, + RAC_CONFIG0_REG = 3, + RAC_CONFIG1_REG = 4, + NUM_CPU_BIUCTRL_REGS = 5, +}; + +struct bman_hwerr_txt { + u32 mask; + const char *txt; +}; + +enum qm_wq_class { + qm_wq_portal = 0, + qm_wq_pool = 1, + qm_wq_fman0 = 2, + qm_wq_fman1 = 3, + qm_wq_caam = 4, + qm_wq_pme = 5, + qm_wq_first = 0, + qm_wq_last = 5, +}; + +enum qm_memory { + qm_memory_fqd = 0, + qm_memory_pfdr = 1, +}; + +struct qm_ecir { + u32 info; +}; + +struct qm_ecir2 { + u32 info; +}; + +struct qm_eadr { + u32 info; +}; + +struct qman_hwerr_txt { + u32 mask; + const char *txt; +}; + +struct qman_error_info_mdata { + u16 addr_mask; + u16 bits; + const char *txt; +}; + +enum qm_dc_portal { + qm_dc_portal_fman0 = 0, + qm_dc_portal_fman1 = 1, +}; + +struct bm_portal_config { + void *addr_virt_ce; + void *addr_virt_ci; + struct list_head list; + struct device *dev; + int cpu; + int irq; +}; + +struct bman_portal; + +struct qman_portal; + +struct __qm_mcr_querycongestion { + u32 state[8]; +}; + +struct qman_cgrs { + struct __qm_mcr_querycongestion q; +}; + +struct qm_portal_config { + void *addr_virt_ce; + void *addr_virt_ci; + struct device *dev; + struct iommu_domain *iommu_domain; + struct list_head list; + int cpu; + int irq; + u16 channel; + u32 pools; +}; + +struct bm_buffer { + union { + struct { + __be16 bpid; + __be16 hi; + __be32 lo; + }; + __be64 data; + }; +}; + +enum bm_rcr_pmode { + bm_rcr_pci = 0, + bm_rcr_pce = 1, + bm_rcr_pvb = 2, +}; + +enum bm_rcr_cmode { + bm_rcr_cci = 0, + bm_rcr_cce = 1, +}; + +struct bm_rcr_entry { + union { + struct { + u8 _ncw_verb; + u8 bpid; + u8 __reserved1[62]; + }; + struct bm_buffer bufs[8]; + }; +}; + +struct bm_rcr { + struct bm_rcr_entry *ring; + struct bm_rcr_entry *cursor; + u8 ci; + u8 available; + u8 ithresh; + u8 vbit; + u32 busy; + enum bm_rcr_pmode pmode; + enum bm_rcr_cmode cmode; +}; + +struct bm_mc_command { + u8 _ncw_verb; + u8 bpid; + u8 __reserved[62]; +}; + +union bm_mc_result { + struct { + u8 verb; + u8 bpid; + u8 __reserved[62]; + }; + struct bm_buffer bufs[8]; +}; + +struct bm_mc { + struct bm_mc_command *cr; + union bm_mc_result *rr; + u8 rridx; + u8 vbit; + enum { + mc_idle = 0, + mc_user = 1, + mc_hw = 2, + } state; +}; + +struct bm_addr { + void *ce; + __be32 *ce_be; + void *ci; +}; + +struct bm_portal { + struct bm_addr addr; + struct bm_rcr rcr; + struct bm_mc mc; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bman_portal___2 { + struct bm_portal p; + long unsigned int irq_sources; + const struct bm_portal_config *config; + char irqname[16]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bman_pool { + u32 bpid; + struct bman_portal___2 *portal; + struct bman_pool *next; +}; + +struct qm_fd { + union { + struct { + u8 cfg8b_w1; + u8 bpid; + u8 cfg8b_w3; + u8 addr_hi; + __be32 addr_lo; + }; + __be64 data; + }; + __be32 cfg; + union { + __be32 cmd; + __be32 status; + }; +}; + +struct qm_dqrr_entry { + u8 verb; + u8 stat; + __be16 seqnum; + u8 tok; + u8 __reserved2[3]; + __be32 fqid; + __be32 context_b; + struct qm_fd fd; + u8 __reserved4[32]; +}; + +union qm_mr_entry { + struct { + u8 verb; + u8 __reserved[63]; + }; + struct { + u8 verb; + u8 dca; + __be16 seqnum; + u8 rc; + u8 __reserved[3]; + __be32 fqid; + __be32 tag; + struct qm_fd fd; + u8 __reserved1[32]; + } ern; + struct { + u8 verb; + u8 fqs; + u8 __reserved1[6]; + __be32 fqid; + __be32 context_b; + u8 __reserved2[48]; + } fq; +}; + +struct qm_fqd_stashing { + u8 exclusive; + u8 cl; +}; + +struct qm_fqd_oac { + u8 oac; + s8 oal; +}; + +struct qm_fqd { + u8 orpc; + u8 cgid; + __be16 fq_ctrl; + __be16 dest_wq; + __be16 ics_cred; + union { + __be16 td; + struct qm_fqd_oac oac_init; + }; + __be32 context_b; + union { + __be64 opaque; + struct { + __be32 hi; + __be32 lo; + }; + struct { + struct qm_fqd_stashing stashing; + __be16 context_hi; + __be32 context_lo; + }; + } context_a; + struct qm_fqd_oac oac_query; +} __attribute__((packed)); + +struct qm_cgr_wr_parm { + __be32 word; +}; + +struct qm_cgr_cs_thres { + __be16 word; +}; + +struct __qm_mc_cgr { + struct qm_cgr_wr_parm wr_parm_g; + struct qm_cgr_wr_parm wr_parm_y; + struct qm_cgr_wr_parm wr_parm_r; + u8 wr_en_g; + u8 wr_en_y; + u8 wr_en_r; + u8 cscn_en; + union { + struct { + __be16 cscn_targ_upd_ctrl; + __be16 cscn_targ_dcp_low; + }; + __be32 cscn_targ; + }; + u8 cstd_en; + u8 cs; + struct qm_cgr_cs_thres cs_thres; + u8 mode; +} __attribute__((packed)); + +struct qm_mcc_initfq { + u8 __reserved1[2]; + __be16 we_mask; + __be32 fqid; + __be16 count; + struct qm_fqd fqd; + u8 __reserved2[30]; +} __attribute__((packed)); + +struct qm_mcc_initcgr { + u8 __reserve1[2]; + __be16 we_mask; + struct __qm_mc_cgr cgr; + u8 __reserved2[2]; + u8 cgid; + u8 __reserved3[32]; +}; + +enum qman_cb_dqrr_result { + qman_cb_dqrr_consume = 0, + qman_cb_dqrr_park = 1, + qman_cb_dqrr_defer = 2, + qman_cb_dqrr_stop = 3, + qman_cb_dqrr_consume_stop = 4, +}; + +struct qman_portal___2; + +struct qman_fq; + +typedef enum qman_cb_dqrr_result (*qman_cb_dqrr)(struct qman_portal___2 *, struct qman_fq *, const struct qm_dqrr_entry *, bool); + +struct qm_addr { + void *ce; + __be32 *ce_be; + void *ci; +}; + +enum qm_eqcr_pmode { + qm_eqcr_pci = 0, + qm_eqcr_pce = 1, + qm_eqcr_pvb = 2, +}; + +struct qm_eqcr_entry; + +struct qm_eqcr { + struct qm_eqcr_entry *ring; + struct qm_eqcr_entry *cursor; + u8 ci; + u8 available; + u8 ithresh; + u8 vbit; + u32 busy; + enum qm_eqcr_pmode pmode; +}; + +enum qm_dqrr_dmode { + qm_dqrr_dpush = 0, + qm_dqrr_dpull = 1, +}; + +enum qm_dqrr_pmode { + qm_dqrr_pci = 0, + qm_dqrr_pce = 1, + qm_dqrr_pvb = 2, +}; + +enum qm_dqrr_cmode { + qm_dqrr_cci = 0, + qm_dqrr_cce = 1, + qm_dqrr_cdc = 2, +}; + +struct qm_dqrr { + const struct qm_dqrr_entry *ring; + const struct qm_dqrr_entry *cursor; + u8 pi; + u8 ci; + u8 fill; + u8 ithresh; + u8 vbit; + enum qm_dqrr_dmode dmode; + enum qm_dqrr_pmode pmode; + enum qm_dqrr_cmode cmode; +}; + +enum qm_mr_pmode { + qm_mr_pci = 0, + qm_mr_pce = 1, + qm_mr_pvb = 2, +}; + +enum qm_mr_cmode { + qm_mr_cci = 0, + qm_mr_cce = 1, +}; + +struct qm_mr { + union qm_mr_entry *ring; + union qm_mr_entry *cursor; + u8 pi; + u8 ci; + u8 fill; + u8 ithresh; + u8 vbit; + enum qm_mr_pmode pmode; + enum qm_mr_cmode cmode; +}; + +union qm_mc_command; + +union qm_mc_result; + +struct qm_mc { + union qm_mc_command *cr; + union qm_mc_result *rr; + u8 rridx; + u8 vbit; + enum { + qman_mc_idle = 0, + qman_mc_user = 1, + qman_mc_hw = 2, + } state; +}; + +struct qm_portal { + struct qm_addr addr; + struct qm_eqcr eqcr; + struct qm_dqrr dqrr; + struct qm_mr mr; + struct qm_mc mc; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct qman_portal___2 { + struct qm_portal p; + long unsigned int bits; + long unsigned int irq_sources; + u32 use_eqcr_ci_stashing; + struct qman_fq *vdqcr_owned; + u32 sdqcr; + const struct qm_portal_config *config; + struct qman_cgrs *cgrs; + struct list_head cgr_cbs; + spinlock_t cgr_lock; + struct work_struct congestion_work; + struct work_struct mr_work; + char irqname[16]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef void (*qman_cb_mr)(struct qman_portal___2 *, struct qman_fq *, const union qm_mr_entry *); + +struct qman_fq_cb { + qman_cb_dqrr dqrr; + qman_cb_mr ern; + qman_cb_mr fqs; +}; + +enum qman_fq_state { + qman_fq_state_oos = 0, + qman_fq_state_parked = 1, + qman_fq_state_sched = 2, + qman_fq_state_retired = 3, +}; + +struct qman_fq { + struct qman_fq_cb cb; + u32 fqid; + u32 idx; + long unsigned int flags; + enum qman_fq_state state; + int cgr_groupid; +}; + +struct qman_cgr; + +typedef void (*qman_cb_cgr)(struct qman_portal___2 *, struct qman_cgr *, int); + +struct qman_cgr { + u32 cgrid; + qman_cb_cgr cb; + u16 chan; + struct list_head node; +}; + +struct qm_mcr_queryfq_np { + u8 verb; + u8 result; + u8 __reserved1; + u8 state; + u32 fqd_link; + u16 odp_seq; + u16 orp_nesn; + u16 orp_ea_hseq; + u16 orp_ea_tseq; + u32 orp_ea_hptr; + u32 orp_ea_tptr; + u32 pfdr_hptr; + u32 pfdr_tptr; + u8 __reserved2[5]; + u8 is; + u16 ics_surp; + u32 byte_cnt; + u32 frm_cnt; + u32 __reserved3; + u16 ra1_sfdr; + u16 ra2_sfdr; + u16 __reserved4; + u16 od1_sfdr; + u16 od2_sfdr; + u16 od3_sfdr; +}; + +struct qm_mcr_querywq { + u8 verb; + u8 result; + u16 channel_wq; + u8 __reserved[28]; + u32 wq_len[8]; +}; + +struct qm_mcr_querycongestion { + u8 verb; + u8 result; + u8 __reserved[30]; + struct __qm_mcr_querycongestion state; +}; + +struct qm_mcr_querycgr { + u8 verb; + u8 result; + u16 __reserved1; + struct __qm_mc_cgr cgr; + u8 __reserved2[6]; + u8 i_bcnt_hi; + __be32 i_bcnt_lo; + u8 __reserved3[3]; + u8 a_bcnt_hi; + __be32 a_bcnt_lo; + __be32 cscn_targ_swp[4]; +}; + +struct qm_eqcr_entry { + u8 _ncw_verb; + u8 dca; + __be16 seqnum; + u8 __reserved[4]; + __be32 fqid; + __be32 tag; + struct qm_fd fd; + u8 __reserved3[32]; +}; + +struct qm_mcc_fq { + u8 _ncw_verb; + u8 __reserved1[3]; + __be32 fqid; + u8 __reserved2[56]; +}; + +struct qm_mcc_cgr { + u8 _ncw_verb; + u8 __reserved1[30]; + u8 cgid; + u8 __reserved2[32]; +}; + +union qm_mc_command { + struct { + u8 _ncw_verb; + u8 __reserved[63]; + }; + struct qm_mcc_initfq initfq; + struct qm_mcc_initcgr initcgr; + struct qm_mcc_fq fq; + struct qm_mcc_cgr cgr; +}; + +struct qm_mcr_queryfq { + u8 verb; + u8 result; + u8 __reserved1[8]; + struct qm_fqd fqd; + u8 __reserved2[30]; +} __attribute__((packed)); + +struct qm_mcr_alterfq { + u8 verb; + u8 result; + u8 fqs; + u8 __reserved1[61]; +}; + +union qm_mc_result { + struct { + u8 verb; + u8 result; + u8 __reserved1[62]; + }; + struct qm_mcr_queryfq queryfq; + struct qm_mcr_alterfq alterfq; + struct qm_mcr_querycgr querycgr; + struct qm_mcr_querycongestion querycongestion; + struct qm_mcr_querywq querywq; + struct qm_mcr_queryfq_np queryfq_np; +}; + +struct qe_iram { + __be32 iadd; + __be32 idata; + u8 res0[4]; + __be32 iready; + u8 res1[112]; +}; + +struct qe_ic_regs { + __be32 qicr; + __be32 qivec; + __be32 qripnr; + __be32 qipnr; + __be32 qipxcc; + __be32 qipycc; + __be32 qipwcc; + __be32 qipzcc; + __be32 qimr; + __be32 qrimr; + __be32 qicnr; + u8 res0[4]; + __be32 qiprta; + __be32 qiprtb; + u8 res1[4]; + __be32 qricr; + u8 res2[32]; + __be32 qhivec; + u8 res3[28]; +}; + +struct cp_qe { + __be32 cecr; + __be32 ceccr; + __be32 cecdr; + u8 res0[10]; + __be16 ceter; + u8 res1[2]; + __be16 cetmr; + __be32 cetscr; + __be32 cetsr1; + __be32 cetsr2; + u8 res2[8]; + __be32 cevter; + __be32 cevtmr; + __be16 cercr; + u8 res3[2]; + u8 res4[36]; + __be16 ceexe1; + u8 res5[2]; + __be16 ceexm1; + u8 res6[2]; + __be16 ceexe2; + u8 res7[2]; + __be16 ceexm2; + u8 res8[2]; + __be16 ceexe3; + u8 res9[2]; + __be16 ceexm3; + u8 res10[2]; + __be16 ceexe4; + u8 res11[2]; + __be16 ceexm4; + u8 res12[58]; + __be32 ceurnr; + u8 res13[580]; +}; + +struct qe_mux { + __be32 cmxgcr; + __be32 cmxsi1cr_l; + __be32 cmxsi1cr_h; + __be32 cmxsi1syr; + __be32 cmxucr[4]; + __be32 cmxupcr; + u8 res0[28]; +}; + +struct qe_timers { + u8 gtcfr1; + u8 res0[3]; + u8 gtcfr2; + u8 res1[11]; + __be16 gtmdr1; + __be16 gtmdr2; + __be16 gtrfr1; + __be16 gtrfr2; + __be16 gtcpr1; + __be16 gtcpr2; + __be16 gtcnr1; + __be16 gtcnr2; + __be16 gtmdr3; + __be16 gtmdr4; + __be16 gtrfr3; + __be16 gtrfr4; + __be16 gtcpr3; + __be16 gtcpr4; + __be16 gtcnr3; + __be16 gtcnr4; + __be16 gtevr1; + __be16 gtevr2; + __be16 gtevr3; + __be16 gtevr4; + __be16 gtps; + u8 res2[70]; +}; + +struct qe_brg { + __be32 brgc[16]; + u8 res0[64]; +}; + +struct spi { + u8 res0[32]; + __be32 spmode; + u8 res1[2]; + u8 spie; + u8 res2[1]; + u8 res3[2]; + u8 spim; + u8 res4[1]; + u8 res5[1]; + u8 spcom; + u8 res6[2]; + __be32 spitd; + __be32 spird; + u8 res7[8]; +}; + +struct si1 { + __be16 sixmr1[4]; + u8 siglmr1_h; + u8 res0[1]; + u8 sicmdr1_h; + u8 res2[1]; + u8 sistr1_h; + u8 res3[1]; + __be16 sirsr1_h; + u8 sitarc1; + u8 sitbrc1; + u8 sitcrc1; + u8 sitdrc1; + u8 sirarc1; + u8 sirbrc1; + u8 sircrc1; + u8 sirdrc1; + u8 res4[8]; + __be16 siemr1; + __be16 sifmr1; + __be16 sigmr1; + __be16 sihmr1; + u8 siglmg1_l; + u8 res5[1]; + u8 sicmdr1_l; + u8 res6[1]; + u8 sistr1_l; + u8 res7[1]; + __be16 sirsr1_l; + u8 siterc1; + u8 sitfrc1; + u8 sitgrc1; + u8 sithrc1; + u8 sirerc1; + u8 sirfrc1; + u8 sirgrc1; + u8 sirhrc1; + u8 res8[8]; + __be32 siml1; + u8 siedm1; + u8 res9[187]; +}; + +struct sir { + u8 tx[1024]; + u8 rx[1024]; + u8 res0[2048]; +}; + +struct qe_usb_ctlr { + u8 usb_usmod; + u8 usb_usadr; + u8 usb_uscom; + u8 res1[1]; + __be16 usb_usep[4]; + u8 res2[4]; + __be16 usb_usber; + u8 res3[2]; + __be16 usb_usbmr; + u8 res4[1]; + u8 usb_usbs; + __be16 usb_ussft; + u8 res5[2]; + __be16 usb_usfrn; + u8 res6[34]; +}; + +struct qe_mcc { + __be32 mcce; + __be32 mccm; + __be32 mccf; + __be32 merl; + u8 res0[240]; +}; + +struct ucc_slow { + __be32 gumr_l; + __be32 gumr_h; + __be16 upsmr; + u8 res0[2]; + __be16 utodr; + __be16 udsr; + __be16 ucce; + u8 res1[2]; + __be16 uccm; + u8 res2[1]; + u8 uccs; + u8 res3[36]; + __be16 utpt; + u8 res4[82]; + u8 guemr; +} __attribute__((packed)); + +struct ucc_fast { + __be32 gumr; + __be32 upsmr; + __be16 utodr; + u8 res0[2]; + __be16 udsr; + u8 res1[2]; + __be32 ucce; + __be32 uccm; + u8 uccs; + u8 res2[7]; + __be32 urfb; + __be16 urfs; + u8 res3[2]; + __be16 urfet; + __be16 urfset; + __be32 utfb; + __be16 utfs; + u8 res4[2]; + __be16 utfet; + u8 res5[2]; + __be16 utftt; + u8 res6[2]; + __be16 utpt; + u8 res7[2]; + __be32 urtry; + u8 res8[76]; + u8 guemr; +} __attribute__((packed)); + +struct ucc { + union { + struct ucc_slow slow; + struct ucc_fast fast; + u8 res[512]; + }; +}; + +struct upc { + __be32 upgcr; + __be32 uplpa; + __be32 uphec; + __be32 upuc; + __be32 updc1; + __be32 updc2; + __be32 updc3; + __be32 updc4; + __be32 upstpa; + u8 res0[12]; + __be32 updrs1_h; + __be32 updrs1_l; + __be32 updrs2_h; + __be32 updrs2_l; + __be32 updrs3_h; + __be32 updrs3_l; + __be32 updrs4_h; + __be32 updrs4_l; + __be32 updrp1; + __be32 updrp2; + __be32 updrp3; + __be32 updrp4; + __be32 upde1; + __be32 upde2; + __be32 upde3; + __be32 upde4; + __be16 uprp1; + __be16 uprp2; + __be16 uprp3; + __be16 uprp4; + u8 res1[8]; + __be16 uptirr1_0; + __be16 uptirr1_1; + __be16 uptirr1_2; + __be16 uptirr1_3; + __be16 uptirr2_0; + __be16 uptirr2_1; + __be16 uptirr2_2; + __be16 uptirr2_3; + __be16 uptirr3_0; + __be16 uptirr3_1; + __be16 uptirr3_2; + __be16 uptirr3_3; + __be16 uptirr4_0; + __be16 uptirr4_1; + __be16 uptirr4_2; + __be16 uptirr4_3; + __be32 uper1; + __be32 uper2; + __be32 uper3; + __be32 uper4; + u8 res2[336]; +}; + +struct sdma { + __be32 sdsr; + __be32 sdmr; + __be32 sdtr1; + __be32 sdtr2; + __be32 sdhy1; + __be32 sdhy2; + __be32 sdta1; + __be32 sdta2; + __be32 sdtm1; + __be32 sdtm2; + u8 res0[16]; + __be32 sdaqr; + __be32 sdaqmr; + u8 res1[4]; + __be32 sdebcr; + u8 res2[56]; +}; + +struct dbg { + __be32 bpdcr; + __be32 bpdsr; + __be32 bpdmr; + __be32 bprmrr0; + __be32 bprmrr1; + u8 res0[8]; + __be32 bprmtr0; + __be32 bprmtr1; + u8 res1[8]; + __be32 bprmir; + __be32 bprmsr; + __be32 bpemr; + u8 res2[72]; +}; + +struct rsp { + __be32 tibcr[16]; + u8 res0[64]; + __be32 ibcr0; + __be32 ibs0; + __be32 ibcnr0; + u8 res1[4]; + __be32 ibcr1; + __be32 ibs1; + __be32 ibcnr1; + __be32 npcr; + __be32 dbcr; + __be32 dbar; + __be32 dbamr; + __be32 dbsr; + __be32 dbcnr; + u8 res2[12]; + __be32 dbdr_h; + __be32 dbdr_l; + __be32 dbdmr_h; + __be32 dbdmr_l; + __be32 bsr; + __be32 bor; + __be32 bior; + u8 res3[4]; + __be32 iatr[4]; + __be32 eccr; + __be32 eicr; + u8 res4[8]; +}; + +struct qe_immap { + struct qe_iram iram; + struct qe_ic_regs ic; + struct cp_qe cp; + struct qe_mux qmx; + struct qe_timers qet; + struct spi spi[2]; + struct qe_mcc mcc; + struct qe_brg brg; + struct qe_usb_ctlr usb; + struct si1 si1; + u8 res11[2048]; + struct sir sir; + struct ucc ucc1; + struct ucc ucc3; + struct ucc ucc5; + struct ucc ucc7; + u8 res12[1536]; + struct upc upc1; + struct ucc ucc2; + struct ucc ucc4; + struct ucc ucc6; + struct ucc ucc8; + u8 res13[1536]; + struct upc upc2; + struct sdma sdma; + struct dbg dbg; + struct rsp rsp[2]; + u8 res14[768]; + u8 res15[14848]; + u8 res16[32768]; + u8 muram[49152]; + u8 res17[147456]; + u8 res18[786432]; +}; + +enum qe_clock { + QE_CLK_NONE = 0, + QE_BRG1 = 1, + QE_BRG2 = 2, + QE_BRG3 = 3, + QE_BRG4 = 4, + QE_BRG5 = 5, + QE_BRG6 = 6, + QE_BRG7 = 7, + QE_BRG8 = 8, + QE_BRG9 = 9, + QE_BRG10 = 10, + QE_BRG11 = 11, + QE_BRG12 = 12, + QE_BRG13 = 13, + QE_BRG14 = 14, + QE_BRG15 = 15, + QE_BRG16 = 16, + QE_CLK1 = 17, + QE_CLK2 = 18, + QE_CLK3 = 19, + QE_CLK4 = 20, + QE_CLK5 = 21, + QE_CLK6 = 22, + QE_CLK7 = 23, + QE_CLK8 = 24, + QE_CLK9 = 25, + QE_CLK10 = 26, + QE_CLK11 = 27, + QE_CLK12 = 28, + QE_CLK13 = 29, + QE_CLK14 = 30, + QE_CLK15 = 31, + QE_CLK16 = 32, + QE_CLK17 = 33, + QE_CLK18 = 34, + QE_CLK19 = 35, + QE_CLK20 = 36, + QE_CLK21 = 37, + QE_CLK22 = 38, + QE_CLK23 = 39, + QE_CLK24 = 40, + QE_RSYNC_PIN = 41, + QE_TSYNC_PIN = 42, + QE_CLK_DUMMY = 43, +}; + +struct qe_header { + __be32 length; + u8 magic[3]; + u8 version; +}; + +struct qe_microcode { + u8 id[32]; + __be32 traps[16]; + __be32 eccr; + __be32 iram_offset; + __be32 count; + __be32 code_offset; + u8 major; + u8 minor; + u8 revision; + u8 padding; + u8 reserved[4]; +}; + +struct qe_firmware { + struct qe_header header; + u8 id[62]; + u8 split; + u8 count; + struct { + __be16 model; + u8 major; + u8 minor; + } soc; + u8 padding[4]; + __be64 extended_modes; + __be32 vtraps[8]; + u8 reserved[4]; + struct qe_microcode microcode[0]; +} __attribute__((packed)); + +struct qe_firmware_info { + char id[64]; + u32 vtraps[8]; + u64 extended_modes; +}; + +enum qe_fltr_tbl_lookup_key_size { + QE_FLTR_TABLE_LOOKUP_KEY_SIZE_8_BYTES = 63, + QE_FLTR_TABLE_LOOKUP_KEY_SIZE_16_BYTES = 95, +}; + +struct muram_block { + struct list_head head; + s32 start; + int size; +}; + +struct qe_ic { + __be32 *regs; + struct irq_domain *irqhost; + struct irq_chip hc_irq; + int virq_high; + int virq_low; +}; + +struct qe_ic_info { + u32 mask; + u32 mask_reg; + u8 pri_code; + u32 pri_reg; +}; + +struct qe_pio_regs { + __be32 cpodr; + __be32 cpdata; + __be32 cpdir1; + __be32 cpdir2; + __be32 cppar1; + __be32 cppar2; +}; + +enum comm_dir { + COMM_DIR_NONE = 0, + COMM_DIR_RX = 1, + COMM_DIR_TX = 2, + COMM_DIR_RX_AND_TX = 3, +}; + +enum ucc_speed_type { + UCC_SPEED_TYPE_FAST = 3, + UCC_SPEED_TYPE_SLOW = 0, +}; + +struct qe_bd { + __be16 status; + __be16 length; + __be32 buf; +}; + +struct ucc_slow_pram { + __be16 rbase; + __be16 tbase; + u8 rbmr; + u8 tbmr; + __be16 mrblr; + __be32 rstate; + __be32 rptr; + __be16 rbptr; + __be16 rcount; + __be32 rtemp; + __be32 tstate; + __be32 tptr; + __be16 tbptr; + __be16 tcount; + __be32 ttemp; + __be32 rcrc; + __be32 tcrc; +}; + +enum ucc_slow_channel_protocol_mode { + UCC_SLOW_CHANNEL_PROTOCOL_MODE_QMC = 2, + UCC_SLOW_CHANNEL_PROTOCOL_MODE_UART = 4, + UCC_SLOW_CHANNEL_PROTOCOL_MODE_BISYNC = 8, +}; + +enum ucc_slow_transparent_tcrc { + UCC_SLOW_TRANSPARENT_TCRC_CCITT_CRC16 = 0, + UCC_SLOW_TRANSPARENT_TCRC_CRC16 = 16384, + UCC_SLOW_TRANSPARENT_TCRC_CCITT_CRC32 = 32768, +}; + +enum ucc_slow_tx_oversampling_rate { + UCC_SLOW_OVERSAMPLING_RATE_TX_TDCR_1 = 0, + UCC_SLOW_OVERSAMPLING_RATE_TX_TDCR_8 = 65536, + UCC_SLOW_OVERSAMPLING_RATE_TX_TDCR_16 = 131072, + UCC_SLOW_OVERSAMPLING_RATE_TX_TDCR_32 = 196608, +}; + +enum ucc_slow_rx_oversampling_rate { + UCC_SLOW_OVERSAMPLING_RATE_RX_RDCR_1 = 0, + UCC_SLOW_OVERSAMPLING_RATE_RX_RDCR_8 = 16384, + UCC_SLOW_OVERSAMPLING_RATE_RX_RDCR_16 = 32768, + UCC_SLOW_OVERSAMPLING_RATE_RX_RDCR_32 = 49152, +}; + +enum ucc_slow_tx_encoding_method { + UCC_SLOW_TRANSMITTER_ENCODING_METHOD_TENC_NRZ = 0, + UCC_SLOW_TRANSMITTER_ENCODING_METHOD_TENC_NRZI = 256, +}; + +enum ucc_slow_rx_decoding_method { + UCC_SLOW_RECEIVER_DECODING_METHOD_RENC_NRZ = 0, + UCC_SLOW_RECEIVER_DECODING_METHOD_RENC_NRZI = 2048, +}; + +enum ucc_slow_diag_mode { + UCC_SLOW_DIAG_MODE_NORMAL = 0, + UCC_SLOW_DIAG_MODE_LOOPBACK = 64, + UCC_SLOW_DIAG_MODE_ECHO = 128, + UCC_SLOW_DIAG_MODE_LOOPBACK_ECHO = 192, +}; + +struct ucc_slow_info { + int ucc_num; + int protocol; + enum qe_clock rx_clock; + enum qe_clock tx_clock; + phys_addr_t regs; + int irq; + u16 uccm_mask; + int data_mem_part; + int init_tx; + int init_rx; + u32 tx_bd_ring_len; + u32 rx_bd_ring_len; + int rx_interrupts; + int brkpt_support; + int grant_support; + int tsa; + int cdp; + int cds; + int ctsp; + int ctss; + int rinv; + int tinv; + int rtsm; + int rfw; + int tci; + int tend; + int tfl; + int txsy; + u16 max_rx_buf_length; + enum ucc_slow_transparent_tcrc tcrc; + enum ucc_slow_channel_protocol_mode mode; + enum ucc_slow_diag_mode diag; + enum ucc_slow_tx_oversampling_rate tdcr; + enum ucc_slow_rx_oversampling_rate rdcr; + enum ucc_slow_tx_encoding_method tenc; + enum ucc_slow_rx_decoding_method renc; +}; + +struct ucc_slow_private { + struct ucc_slow_info *us_info; + struct ucc_slow *us_regs; + struct ucc_slow_pram *us_pram; + s32 us_pram_offset; + int enabled_tx; + int enabled_rx; + int stopped_tx; + int stopped_rx; + struct list_head confQ; + u32 first_tx_bd_mask; + s32 tx_base_offset; + s32 rx_base_offset; + struct qe_bd *confBd; + struct qe_bd *tx_bd; + struct qe_bd *rx_bd; + void *p_rx_frame; + __be16 *p_ucce; + __be16 *p_uccm; + u16 saved_uccm; + u32 tx_frames; + u32 rx_frames; + u32 rx_discarded; +}; + +enum ucc_fast_channel_protocol_mode { + UCC_FAST_PROTOCOL_MODE_HDLC = 0, + UCC_FAST_PROTOCOL_MODE_RESERVED01 = 1, + UCC_FAST_PROTOCOL_MODE_RESERVED_QMC = 2, + UCC_FAST_PROTOCOL_MODE_RESERVED02 = 3, + UCC_FAST_PROTOCOL_MODE_RESERVED_UART = 4, + UCC_FAST_PROTOCOL_MODE_RESERVED03 = 5, + UCC_FAST_PROTOCOL_MODE_RESERVED_EX_MAC_1 = 6, + UCC_FAST_PROTOCOL_MODE_RESERVED_EX_MAC_2 = 7, + UCC_FAST_PROTOCOL_MODE_RESERVED_BISYNC = 8, + UCC_FAST_PROTOCOL_MODE_RESERVED04 = 9, + UCC_FAST_PROTOCOL_MODE_ATM = 10, + UCC_FAST_PROTOCOL_MODE_RESERVED05 = 11, + UCC_FAST_PROTOCOL_MODE_ETHERNET = 12, + UCC_FAST_PROTOCOL_MODE_RESERVED06 = 13, + UCC_FAST_PROTOCOL_MODE_POS = 14, + UCC_FAST_PROTOCOL_MODE_RESERVED07 = 15, +}; + +enum ucc_fast_transparent_txrx { + UCC_FAST_GUMR_TRANSPARENT_TTX_TRX_NORMAL = 0, + UCC_FAST_GUMR_TRANSPARENT_TTX_TRX_TRANSPARENT = 402653184, +}; + +enum ucc_fast_sync_len { + UCC_FAST_SYNC_LEN_NOT_USED = 0, + UCC_FAST_SYNC_LEN_AUTOMATIC = 16384, + UCC_FAST_SYNC_LEN_8_BIT = 32768, + UCC_FAST_SYNC_LEN_16_BIT = 49152, +}; + +enum ucc_fast_rx_decoding_method { + UCC_FAST_RX_ENCODING_NRZ = 0, + UCC_FAST_RX_ENCODING_NRZI = 2048, + UCC_FAST_RX_ENCODING_RESERVED0 = 4096, + UCC_FAST_RX_ENCODING_RESERVED1 = 6144, +}; + +enum ucc_fast_tx_encoding_method { + UCC_FAST_TX_ENCODING_NRZ = 0, + UCC_FAST_TX_ENCODING_NRZI = 256, + UCC_FAST_TX_ENCODING_RESERVED0 = 512, + UCC_FAST_TX_ENCODING_RESERVED1 = 768, +}; + +enum ucc_fast_transparent_tcrc { + UCC_FAST_16_BIT_CRC = 0, + UCC_FAST_CRC_RESERVED0 = 64, + UCC_FAST_32_BIT_CRC = 128, + UCC_FAST_CRC_RESERVED1 = 192, +}; + +struct ucc_fast_info { + int ucc_num; + int tdm_num; + enum qe_clock rx_clock; + enum qe_clock tx_clock; + enum qe_clock rx_sync; + enum qe_clock tx_sync; + resource_size_t regs; + int irq; + u32 uccm_mask; + int brkpt_support; + int grant_support; + int tsa; + int cdp; + int cds; + int ctsp; + int ctss; + int tci; + int txsy; + int rtsm; + int revd; + int rsyn; + u16 max_rx_buf_length; + u16 urfs; + u16 urfet; + u16 urfset; + u16 utfs; + u16 utfet; + u16 utftt; + u16 ufpt; + enum ucc_fast_channel_protocol_mode mode; + enum ucc_fast_transparent_txrx ttx_trx; + enum ucc_fast_tx_encoding_method tenc; + enum ucc_fast_rx_decoding_method renc; + enum ucc_fast_transparent_tcrc tcrc; + enum ucc_fast_sync_len synl; +}; + +struct ucc_fast_private { + struct ucc_fast_info *uf_info; + struct ucc_fast *uf_regs; + __be32 *p_ucce; + __be32 *p_uccm; + int enabled_tx; + int enabled_rx; + int stopped_tx; + int stopped_rx; + s32 ucc_fast_tx_virtual_fifo_base_offset; + s32 ucc_fast_rx_virtual_fifo_base_offset; + u32 tx_frames; + u32 rx_frames; + u32 tx_discarded; + u32 rx_discarded; + u16 mrblr; +}; + +enum tdm_framer_t { + TDM_FRAMER_T1 = 0, + TDM_FRAMER_E1 = 1, +}; + +enum tdm_mode_t { + TDM_INTERNAL_LOOPBACK = 0, + TDM_NORMAL = 1, +}; + +struct si_mode_info { + u8 simr_rfsd; + u8 simr_tfsd; + u8 simr_crt; + u8 simr_sl; + u8 simr_ce; + u8 simr_fe; + u8 simr_gm; +}; + +struct ucc_tdm_info { + struct ucc_fast_info uf_info; + struct si_mode_info si_info; +}; + +struct ucc_tdm { + u16 tdm_port; + u32 siram_entry_id; + u16 *siram; + struct si1 *si_regs; + enum tdm_framer_t tdm_framer_type; + enum tdm_mode_t tdm_mode; + u8 num_of_ts; + u32 tx_ts_mask; + u32 rx_ts_mask; +}; + +struct rcpm { + unsigned int wakeup_cells; + void *ippdexpcr_base; + bool little_endian; +}; + +struct guts { + struct ccsr_guts *regs; + bool little_endian; +}; + +struct fsl_soc_die_attr { + char *die; + u32 svr; + u32 mask; +}; + +struct imx_pgc_domain { + struct generic_pm_domain genpd; + struct regmap *regmap; + struct regulator *regulator; + struct reset_control *reset; + struct clk_bulk_data *clks; + int num_clks; + long unsigned int pgc; + const struct { + u32 pxx; + u32 map; + u32 hskreq; + u32 hskack; + } bits; + const int voltage; + const bool keep_clocks; + struct device *dev; +}; + +struct imx_pgc_domain_data { + const struct imx_pgc_domain *domains; + size_t domains_num; + const struct regmap_access_table *reg_access_table; +}; + +struct imx8_soc_data { + char *name; + u32 (*soc_revision)(); +}; + +enum genpd_notication { + GENPD_NOTIFY_PRE_OFF = 0, + GENPD_NOTIFY_OFF = 1, + GENPD_NOTIFY_PRE_ON = 2, + GENPD_NOTIFY_ON = 3, +}; + +struct imx8m_blk_ctrl_domain; + +struct imx8m_blk_ctrl { + struct device *dev; + struct notifier_block power_nb; + struct device *bus_power_dev; + struct regmap *regmap; + struct imx8m_blk_ctrl_domain *domains; + struct genpd_onecell_data onecell_data; +}; + +struct imx8m_blk_ctrl_domain_data; + +struct imx8m_blk_ctrl_domain { + struct generic_pm_domain genpd; + const struct imx8m_blk_ctrl_domain_data *data; + struct clk_bulk_data clks[3]; + struct device *power_dev; + struct imx8m_blk_ctrl *bc; +}; + +struct imx8m_blk_ctrl_domain_data { + const char *name; + const char * const *clk_names; + int num_clks; + const char *gpc_name; + u32 rst_mask; + u32 clk_mask; + u32 mipi_phy_rst_mask; +}; + +struct imx8m_blk_ctrl_data { + int max_reg; + notifier_fn_t power_notifier_fn; + const struct imx8m_blk_ctrl_domain_data *domains; + int num_domains; +}; + +enum clk_id___2 { + CLK_NONE = 0, + CLK_MM = 1, + CLK_MFG = 2, + CLK_VENC = 3, + CLK_VENC_LT = 4, + CLK_ETHIF = 5, + CLK_VDEC = 6, + CLK_HIFSEL = 7, + CLK_JPGDEC = 8, + CLK_AUDIO = 9, + CLK_MAX = 10, +}; + +struct scp_domain_data { + const char *name; + u32 sta_mask; + int ctl_offs; + u32 sram_pdn_bits; + u32 sram_pdn_ack_bits; + u32 bus_prot_mask; + enum clk_id___2 clk_id[3]; + u8 caps; +}; + +struct scp; + +struct scp_domain { + struct generic_pm_domain genpd; + struct scp *scp; + struct clk *clk[3]; + const struct scp_domain_data *data; + struct regulator *supply; +}; + +struct scp_ctrl_reg { + int pwr_sta_offs; + int pwr_sta2nd_offs; +}; + +struct scp { + struct scp_domain *domains; + struct genpd_onecell_data pd_data; + struct device *dev; + void *base; + struct regmap *infracfg; + struct scp_ctrl_reg ctrl_reg; + bool bus_prot_reg_update; +}; + +struct scp_subdomain { + int origin; + int subdomain; +}; + +struct scp_soc_data { + const struct scp_domain_data *domains; + int num_domains; + const struct scp_subdomain *subdomains; + int num_subdomains; + const struct scp_ctrl_reg regs; + bool bus_prot_reg_update; +}; + +struct scpsys_bus_prot_data { + u32 bus_prot_mask; + u32 bus_prot_set; + u32 bus_prot_clr; + u32 bus_prot_sta; + bool bus_prot_reg_update; + bool ignore_clr_ack; +}; + +struct scpsys_domain_data { + const char *name; + u32 sta_mask; + int ctl_offs; + u32 sram_pdn_bits; + u32 sram_pdn_ack_bits; + u8 caps; + const struct scpsys_bus_prot_data bp_infracfg[5]; + const struct scpsys_bus_prot_data bp_smi[5]; +}; + +struct scpsys_soc_data { + const struct scpsys_domain_data *domains_data; + int num_domains; + int pwr_sta_offs; + int pwr_sta2nd_offs; +}; + +struct scpsys; + +struct scpsys_domain { + struct generic_pm_domain genpd; + const struct scpsys_domain_data *data; + struct scpsys *scpsys; + int num_clks; + struct clk_bulk_data *clks; + int num_subsys_clks; + struct clk_bulk_data *subsys_clks; + struct regmap *infracfg; + struct regmap *smi; + struct regulator *supply; +}; + +struct scpsys { + struct device *dev; + struct regmap *base; + const struct scpsys_soc_data *soc_data; + struct genpd_onecell_data pd_data; + struct generic_pm_domain *domains[0]; +}; + +enum mtk_ddp_comp_id { + DDP_COMPONENT_AAL0 = 0, + DDP_COMPONENT_AAL1 = 1, + DDP_COMPONENT_BLS = 2, + DDP_COMPONENT_CCORR = 3, + DDP_COMPONENT_COLOR0 = 4, + DDP_COMPONENT_COLOR1 = 5, + DDP_COMPONENT_DITHER = 6, + DDP_COMPONENT_DPI0 = 7, + DDP_COMPONENT_DPI1 = 8, + DDP_COMPONENT_DSI0 = 9, + DDP_COMPONENT_DSI1 = 10, + DDP_COMPONENT_DSI2 = 11, + DDP_COMPONENT_DSI3 = 12, + DDP_COMPONENT_GAMMA = 13, + DDP_COMPONENT_OD0 = 14, + DDP_COMPONENT_OD1 = 15, + DDP_COMPONENT_OVL0 = 16, + DDP_COMPONENT_OVL_2L0 = 17, + DDP_COMPONENT_OVL_2L1 = 18, + DDP_COMPONENT_OVL_2L2 = 19, + DDP_COMPONENT_OVL1 = 20, + DDP_COMPONENT_POSTMASK0 = 21, + DDP_COMPONENT_PWM0 = 22, + DDP_COMPONENT_PWM1 = 23, + DDP_COMPONENT_PWM2 = 24, + DDP_COMPONENT_RDMA0 = 25, + DDP_COMPONENT_RDMA1 = 26, + DDP_COMPONENT_RDMA2 = 27, + DDP_COMPONENT_RDMA4 = 28, + DDP_COMPONENT_UFOE = 29, + DDP_COMPONENT_WDMA0 = 30, + DDP_COMPONENT_WDMA1 = 31, + DDP_COMPONENT_ID_MAX = 32, +}; + +struct mtk_mmsys_routes { + u32 from_comp; + u32 to_comp; + u32 addr; + u32 mask; + u32 val; +}; + +struct mtk_mmsys_driver_data { + const char *clk_driver; + const struct mtk_mmsys_routes *routes; + const unsigned int num_routes; +}; + +struct mtk_mmsys { + void *regs; + const struct mtk_mmsys_driver_data *data; + spinlock_t lock; + struct reset_controller_dev rcdev; +}; + +struct mtk_mutex { + int id; + bool claimed; +}; + +enum mtk_mutex_sof_id { + MUTEX_SOF_SINGLE_MODE = 0, + MUTEX_SOF_DSI0 = 1, + MUTEX_SOF_DSI1 = 2, + MUTEX_SOF_DPI0 = 3, + MUTEX_SOF_DPI1 = 4, + MUTEX_SOF_DSI2 = 5, + MUTEX_SOF_DSI3 = 6, +}; + +struct mtk_mutex_data { + const unsigned int *mutex_mod; + const unsigned int *mutex_sof; + const unsigned int mutex_mod_reg; + const unsigned int mutex_sof_reg; + const bool no_clk; +}; + +struct mtk_mutex_ctx { + struct device *dev; + struct clk *clk; + void *regs; + struct mtk_mutex mutex[10]; + const struct mtk_mutex_data *data; +}; + +struct meson_msr; + +struct meson_msr_id { + struct meson_msr *priv; + unsigned int id; + const char *name; +}; + +struct meson_msr { + struct regmap *regmap; + struct meson_msr_id msr_table[128]; +}; + +struct meson_gx_soc_id { + const char *name; + unsigned int id; +}; + +struct meson_gx_package_id { + const char *name; + unsigned int major_id; + unsigned int pack_id; + unsigned int pack_mask; +}; + +struct meson_gx_pwrc_vpu { + struct generic_pm_domain genpd; + struct regmap *regmap_ao; + struct regmap *regmap_hhi; + struct reset_control *rstc; + struct clk *vpu_clk; + struct clk *vapb_clk; +}; + +struct meson_ee_pwrc_mem_domain { + unsigned int reg; + unsigned int mask; +}; + +struct meson_ee_pwrc_top_domain { + unsigned int sleep_reg; + unsigned int sleep_mask; + unsigned int iso_reg; + unsigned int iso_mask; +}; + +struct meson_ee_pwrc_domain; + +struct meson_ee_pwrc_domain_desc { + char *name; + unsigned int reset_names_count; + unsigned int clk_names_count; + struct meson_ee_pwrc_top_domain *top_pd; + unsigned int mem_pd_count; + struct meson_ee_pwrc_mem_domain *mem_pd; + bool (*is_powered_off)(struct meson_ee_pwrc_domain *); +}; + +struct meson_ee_pwrc; + +struct meson_ee_pwrc_domain { + struct generic_pm_domain base; + bool enabled; + struct meson_ee_pwrc *pwrc; + struct meson_ee_pwrc_domain_desc desc; + struct clk_bulk_data *clks; + int num_clks; + struct reset_control *rstc; + int num_rstc; +}; + +struct meson_ee_pwrc_domain_data { + unsigned int count; + struct meson_ee_pwrc_domain_desc *domains; +}; + +struct meson_ee_pwrc { + struct regmap *regmap_ao; + struct regmap *regmap_hhi; + struct meson_ee_pwrc_domain *domains; + struct genpd_onecell_data xlate; +}; + +enum { + SM_EFUSE_READ = 0, + SM_EFUSE_WRITE = 1, + SM_EFUSE_USER_MAX = 2, + SM_GET_CHIP_ID = 3, + SM_A1_PWRC_SET = 4, + SM_A1_PWRC_GET = 5, +}; + +struct meson_secure_pwrc; + +struct meson_secure_pwrc_domain { + struct generic_pm_domain base; + unsigned int index; + struct meson_secure_pwrc *pwrc; +}; + +struct meson_sm_firmware; + +struct meson_secure_pwrc { + struct meson_secure_pwrc_domain *domains; + struct genpd_onecell_data xlate; + struct meson_sm_firmware *fw; +}; + +struct meson_secure_pwrc_domain_desc { + unsigned int index; + unsigned int flags; + char *name; + bool (*is_off)(struct meson_secure_pwrc_domain *); +}; + +struct meson_secure_pwrc_domain_data { + unsigned int count; + struct meson_secure_pwrc_domain_desc *domains; +}; + +enum cmd_db_hw_type { + CMD_DB_HW_INVALID = 0, + CMD_DB_HW_MIN = 3, + CMD_DB_HW_ARC = 3, + CMD_DB_HW_VRM = 4, + CMD_DB_HW_BCM = 5, + CMD_DB_HW_MAX = 5, + CMD_DB_HW_ALL = 255, +}; + +struct entry_header { + u8 id[8]; + __le32 priority[2]; + __le32 addr; + __le16 len; + __le16 offset; +}; + +struct rsc_hdr { + __le16 slv_id; + __le16 header_offset; + __le16 data_offset; + __le16 cnt; + __le16 version; + __le16 reserved[3]; +}; + +struct cmd_db_header { + __le32 version; + u8 magic[4]; + struct rsc_hdr header[8]; + __le32 checksum; + __le32 reserved; + u8 data[0]; +}; + +enum rpmh_state { + RPMH_SLEEP_STATE = 0, + RPMH_WAKE_ONLY_STATE = 1, + RPMH_ACTIVE_ONLY_STATE = 2, +}; + +struct tcs_cmd { + u32 addr; + u32 data; + u32 wait; +}; + +struct tcs_request { + enum rpmh_state state; + u32 wait_for_compl; + u32 num_cmds; + struct tcs_cmd *cmds; +}; + +struct rsc_drv; + +struct tcs_group { + struct rsc_drv *drv; + int type; + u32 mask; + u32 offset; + int num_tcs; + int ncpt; + const struct tcs_request *req[3]; + long unsigned int slots[1]; +}; + +struct rpmh_ctrlr { + struct list_head cache; + spinlock_t cache_lock; + bool dirty; + struct list_head batch_cache; +}; + +struct rsc_drv { + const char *name; + void *tcs_base; + int id; + int num_tcs; + struct notifier_block rsc_pm; + atomic_t cpus_in_pm; + struct tcs_group tcs[4]; + long unsigned int tcs_in_use[1]; + spinlock_t lock; + wait_queue_head_t tcs_wait; + struct rpmh_ctrlr client; +}; + +struct trace_event_raw_rpmh_tx_done { + struct trace_entry ent; + u32 __data_loc_name; + int m; + u32 addr; + u32 data; + int err; + char __data[0]; +}; + +struct trace_event_raw_rpmh_send_msg { + struct trace_entry ent; + u32 __data_loc_name; + int m; + int n; + u32 hdr; + u32 addr; + u32 data; + bool wait; + char __data[0]; +}; + +struct trace_event_data_offsets_rpmh_tx_done { + u32 name; +}; + +struct trace_event_data_offsets_rpmh_send_msg { + u32 name; +}; + +typedef void (*btf_trace_rpmh_tx_done)(void *, struct rsc_drv *, int, const struct tcs_request *, int); + +typedef void (*btf_trace_rpmh_send_msg)(void *, struct rsc_drv *, int, int, u32, const struct tcs_cmd *); + +struct tcs_type_config { + u32 type; + u32 n; +}; + +struct rpmh_request { + struct tcs_request msg; + struct tcs_cmd cmd[16]; + struct completion *completion; + const struct device *dev; + int err; + bool needs_free; +}; + +struct cache_req___2 { + u32 addr; + u32 sleep_val; + u32 wake_val; + struct list_head list; +}; + +struct batch_cache_req { + struct list_head list; + int count; + struct rpmh_request rpm_msgs[0]; +}; + +struct qcom_smem_state_ops { + int (*update_bits)(void *, u32, u32); +}; + +struct qcom_smem_state { + struct kref refcount; + bool orphan; + struct list_head list; + struct device_node *of_node; + void *priv; + struct qcom_smem_state_ops ops; +}; + +struct rpmhpd { + struct device *dev; + struct generic_pm_domain pd; + struct generic_pm_domain *parent; + struct rpmhpd *peer; + const bool active_only; + unsigned int corner; + unsigned int active_corner; + unsigned int enable_corner; + u32 level[16]; + size_t level_count; + bool enabled; + const char *res_name; + u32 addr; +}; + +struct rpmhpd_desc { + struct rpmhpd **rpmhpds; + size_t num_pds; +}; + +struct renesas_family { + const char name[16]; + u32 reg; +}; + +struct renesas_soc { + const struct renesas_family *family; + u32 id; +}; + +struct rcar_sysc_area { + const char *name; + u16 chan_offs; + u8 chan_bit; + u8 isr_bit; + int parent; + unsigned int flags; +}; + +struct rcar_sysc_info { + int (*init)(); + const struct rcar_sysc_area *areas; + unsigned int num_areas; + u32 extmask_offs; + u32 extmask_val; +}; + +struct r8a779a0_sysc_area { + const char *name; + u8 pdr; + int parent; + unsigned int flags; +}; + +struct r8a779a0_sysc_info { + const struct r8a779a0_sysc_area *areas; + unsigned int num_areas; +}; + +struct r8a779a0_sysc_pd { + struct generic_pm_domain genpd; + u8 pdr; + unsigned int flags; + char name[0]; +}; + +struct r8a779a0_pm_domains { + struct genpd_onecell_data onecell_data; + struct generic_pm_domain *domains[65]; +}; + +struct rst_config { + unsigned int modemr; + int (*configure)(void *); +}; + +struct rcar_sysc_ch { + u16 chan_offs; + u8 chan_bit; + u8 isr_bit; +}; + +struct rcar_sysc_pd { + struct generic_pm_domain genpd; + struct rcar_sysc_ch ch; + unsigned int flags; + char name[0]; +}; + +struct rcar_pm_domains { + struct genpd_onecell_data onecell_data; + struct generic_pm_domain *domains[33]; +}; + +struct rockchip_grf_value { + const char *desc; + u32 reg; + u32 val; +}; + +struct rockchip_grf_info { + const struct rockchip_grf_value *values; + int num_values; +}; + +struct rockchip_domain_info { + const char *name; + int pwr_mask; + int status_mask; + int req_mask; + int idle_mask; + int ack_mask; + bool active_wakeup; + int pwr_w_mask; + int req_w_mask; +}; + +struct rockchip_pmu_info { + u32 pwr_offset; + u32 status_offset; + u32 req_offset; + u32 idle_offset; + u32 ack_offset; + u32 core_pwrcnt_offset; + u32 gpu_pwrcnt_offset; + unsigned int core_power_transition_time; + unsigned int gpu_power_transition_time; + int num_domains; + const struct rockchip_domain_info *domain_info; +}; + +struct rockchip_pmu; + +struct rockchip_pm_domain { + struct generic_pm_domain genpd; + const struct rockchip_domain_info *info; + struct rockchip_pmu *pmu; + int num_qos; + struct regmap **qos_regmap; + u32 *qos_save_regs[5]; + int num_clks; + struct clk_bulk_data *clks; +}; + +struct rockchip_pmu { + struct device *dev; + struct regmap *regmap; + const struct rockchip_pmu_info *info; + struct mutex mutex; + struct genpd_onecell_data genpd_data; + struct generic_pm_domain *domains[0]; +}; + +struct sunxi_sram_func { + char *func; + u8 val; + u32 reg_val; +}; + +struct sunxi_sram_data { + char *name; + u8 reg; + u8 offset; + u8 width; + struct sunxi_sram_func *func; + struct list_head list; +}; + +struct sunxi_sram_desc { + struct sunxi_sram_data data; + bool claimed; +}; + +struct sunxi_sramc_variant { + int num_emac_clocks; +}; + +struct nvmem_cell_info { + const char *name; + unsigned int offset; + unsigned int bytes; + unsigned int bit_offset; + unsigned int nbits; +}; + +struct nvmem_cell_lookup { + const char *nvmem_name; + const char *cell_name; + const char *dev_id; + const char *con_id; + struct list_head node; +}; + +typedef int (*nvmem_reg_read_t)(void *, unsigned int, void *, size_t); + +typedef int (*nvmem_reg_write_t)(void *, unsigned int, void *, size_t); + +typedef int (*nvmem_cell_post_process_t)(void *, const char *, unsigned int, void *, size_t); + +enum nvmem_type { + NVMEM_TYPE_UNKNOWN = 0, + NVMEM_TYPE_EEPROM = 1, + NVMEM_TYPE_OTP = 2, + NVMEM_TYPE_BATTERY_BACKED = 3, + NVMEM_TYPE_FRAM = 4, +}; + +struct nvmem_keepout { + unsigned int start; + unsigned int end; + unsigned char value; +}; + +struct nvmem_config { + struct device *dev; + const char *name; + int id; + struct module *owner; + struct gpio_desc *wp_gpio; + const struct nvmem_cell_info *cells; + int ncells; + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + enum nvmem_type type; + bool read_only; + bool root_only; + struct device_node *of_node; + bool no_of_node; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + nvmem_cell_post_process_t cell_post_process; + int size; + int word_size; + int stride; + void *priv; + bool compat; + struct device *base_dev; +}; + +struct tegra_fuse; + +struct tegra_fuse_info { + u32 (*read)(struct tegra_fuse *, unsigned int); + unsigned int size; + unsigned int spare; +}; + +struct nvmem_device; + +struct tegra_fuse_soc; + +struct tegra_fuse { + struct device *dev; + void *base; + phys_addr_t phys; + struct clk *clk; + u32 (*read_early)(struct tegra_fuse *, unsigned int); + u32 (*read)(struct tegra_fuse *, unsigned int); + const struct tegra_fuse_soc *soc; + struct { + struct mutex lock; + struct completion wait; + struct dma_chan *chan; + struct dma_slave_config config; + dma_addr_t phys; + u32 *virt; + } apbdma; + struct nvmem_device *nvmem; + struct nvmem_cell_lookup *lookups; +}; + +struct tegra_fuse_soc { + void (*init)(struct tegra_fuse *); + void (*speedo_init)(struct tegra_sku_info *); + int (*probe)(struct tegra_fuse *); + const struct tegra_fuse_info *info; + const struct nvmem_cell_lookup *lookups; + unsigned int num_lookups; + const struct attribute_group *soc_attr_group; + bool clk_suspend_on; +}; + +enum { + THRESHOLD_INDEX_0 = 0, + THRESHOLD_INDEX_1 = 1, + THRESHOLD_INDEX_COUNT = 2, +}; + +struct tegra_core_opp_params { + bool init_state; +}; + +enum tegra_suspend_mode { + TEGRA_SUSPEND_NONE = 0, + TEGRA_SUSPEND_LP2 = 1, + TEGRA_SUSPEND_LP1 = 2, + TEGRA_SUSPEND_LP0 = 3, + TEGRA_MAX_SUSPEND_MODE = 4, + TEGRA_SUSPEND_NOT_READY = 5, +}; + +enum tegra_io_pad { + TEGRA_IO_PAD_AUDIO = 0, + TEGRA_IO_PAD_AUDIO_HV = 1, + TEGRA_IO_PAD_BB = 2, + TEGRA_IO_PAD_CAM = 3, + TEGRA_IO_PAD_COMP = 4, + TEGRA_IO_PAD_CONN = 5, + TEGRA_IO_PAD_CSIA = 6, + TEGRA_IO_PAD_CSIB = 7, + TEGRA_IO_PAD_CSIC = 8, + TEGRA_IO_PAD_CSID = 9, + TEGRA_IO_PAD_CSIE = 10, + TEGRA_IO_PAD_CSIF = 11, + TEGRA_IO_PAD_CSIG = 12, + TEGRA_IO_PAD_CSIH = 13, + TEGRA_IO_PAD_DAP3 = 14, + TEGRA_IO_PAD_DAP5 = 15, + TEGRA_IO_PAD_DBG = 16, + TEGRA_IO_PAD_DEBUG_NONAO = 17, + TEGRA_IO_PAD_DMIC = 18, + TEGRA_IO_PAD_DMIC_HV = 19, + TEGRA_IO_PAD_DP = 20, + TEGRA_IO_PAD_DSI = 21, + TEGRA_IO_PAD_DSIB = 22, + TEGRA_IO_PAD_DSIC = 23, + TEGRA_IO_PAD_DSID = 24, + TEGRA_IO_PAD_EDP = 25, + TEGRA_IO_PAD_EMMC = 26, + TEGRA_IO_PAD_EMMC2 = 27, + TEGRA_IO_PAD_EQOS = 28, + TEGRA_IO_PAD_GPIO = 29, + TEGRA_IO_PAD_GP_PWM2 = 30, + TEGRA_IO_PAD_GP_PWM3 = 31, + TEGRA_IO_PAD_HDMI = 32, + TEGRA_IO_PAD_HDMI_DP0 = 33, + TEGRA_IO_PAD_HDMI_DP1 = 34, + TEGRA_IO_PAD_HDMI_DP2 = 35, + TEGRA_IO_PAD_HDMI_DP3 = 36, + TEGRA_IO_PAD_HSIC = 37, + TEGRA_IO_PAD_HV = 38, + TEGRA_IO_PAD_LVDS = 39, + TEGRA_IO_PAD_MIPI_BIAS = 40, + TEGRA_IO_PAD_NAND = 41, + TEGRA_IO_PAD_PEX_BIAS = 42, + TEGRA_IO_PAD_PEX_CLK_BIAS = 43, + TEGRA_IO_PAD_PEX_CLK1 = 44, + TEGRA_IO_PAD_PEX_CLK2 = 45, + TEGRA_IO_PAD_PEX_CLK3 = 46, + TEGRA_IO_PAD_PEX_CLK_2_BIAS = 47, + TEGRA_IO_PAD_PEX_CLK_2 = 48, + TEGRA_IO_PAD_PEX_CNTRL = 49, + TEGRA_IO_PAD_PEX_CTL2 = 50, + TEGRA_IO_PAD_PEX_L0_RST_N = 51, + TEGRA_IO_PAD_PEX_L1_RST_N = 52, + TEGRA_IO_PAD_PEX_L5_RST_N = 53, + TEGRA_IO_PAD_PWR_CTL = 54, + TEGRA_IO_PAD_SDMMC1 = 55, + TEGRA_IO_PAD_SDMMC1_HV = 56, + TEGRA_IO_PAD_SDMMC2 = 57, + TEGRA_IO_PAD_SDMMC2_HV = 58, + TEGRA_IO_PAD_SDMMC3 = 59, + TEGRA_IO_PAD_SDMMC3_HV = 60, + TEGRA_IO_PAD_SDMMC4 = 61, + TEGRA_IO_PAD_SOC_GPIO10 = 62, + TEGRA_IO_PAD_SOC_GPIO12 = 63, + TEGRA_IO_PAD_SOC_GPIO13 = 64, + TEGRA_IO_PAD_SOC_GPIO53 = 65, + TEGRA_IO_PAD_SPI = 66, + TEGRA_IO_PAD_SPI_HV = 67, + TEGRA_IO_PAD_SYS_DDC = 68, + TEGRA_IO_PAD_UART = 69, + TEGRA_IO_PAD_UART4 = 70, + TEGRA_IO_PAD_UART5 = 71, + TEGRA_IO_PAD_UFS = 72, + TEGRA_IO_PAD_USB0 = 73, + TEGRA_IO_PAD_USB1 = 74, + TEGRA_IO_PAD_USB2 = 75, + TEGRA_IO_PAD_USB3 = 76, + TEGRA_IO_PAD_USB_BIAS = 77, + TEGRA_IO_PAD_AO_HV = 78, +}; + +struct pmc_clk { + struct clk_hw hw; + long unsigned int offs; + u32 mux_shift; + u32 force_en_shift; +}; + +struct pmc_clk_gate { + struct clk_hw hw; + long unsigned int offs; + u32 shift; +}; + +struct pmc_clk_init_data { + char *name; + const char * const *parents; + int num_parents; + int clk_id; + u8 mux_shift; + u8 force_en_shift; +}; + +struct tegra_pmc; + +struct tegra_powergate { + struct generic_pm_domain genpd; + struct tegra_pmc *pmc; + unsigned int id; + struct clk **clks; + unsigned int num_clks; + long unsigned int *clk_rates; + struct reset_control *reset; +}; + +struct tegra_pmc_soc; + +struct tegra_pmc { + struct device *dev; + void *base; + void *wake; + void *aotag; + void *scratch; + struct clk *clk; + struct dentry *debugfs; + const struct tegra_pmc_soc *soc; + bool tz_only; + long unsigned int rate; + enum tegra_suspend_mode suspend_mode; + u32 cpu_good_time; + u32 cpu_off_time; + u32 core_osc_time; + u32 core_pmu_time; + u32 core_off_time; + bool corereq_high; + bool sysclkreq_high; + bool combined_req; + bool cpu_pwr_good_en; + u32 lp0_vec_phys; + u32 lp0_vec_size; + long unsigned int powergates_available[1]; + struct mutex powergates_lock; + struct pinctrl_dev *pctl_dev; + struct irq_domain *domain; + struct irq_chip irq; + struct notifier_block clk_nb; + bool core_domain_state_synced; + bool core_domain_registered; +}; + +struct tegra_io_pad_soc { + enum tegra_io_pad id; + unsigned int dpd; + unsigned int voltage; + const char *name; +}; + +struct tegra_pmc_regs { + unsigned int scratch0; + unsigned int dpd_req; + unsigned int dpd_status; + unsigned int dpd2_req; + unsigned int dpd2_status; + unsigned int rst_status; + unsigned int rst_source_shift; + unsigned int rst_source_mask; + unsigned int rst_level_shift; + unsigned int rst_level_mask; +}; + +struct tegra_wake_event { + const char *name; + unsigned int id; + unsigned int irq; + struct { + unsigned int instance; + unsigned int pin; + } gpio; +}; + +struct tegra_pmc_soc { + unsigned int num_powergates; + const char * const *powergates; + unsigned int num_cpu_powergates; + const u8 *cpu_powergates; + bool has_tsense_reset; + bool has_gpu_clamps; + bool needs_mbist_war; + bool has_impl_33v_pwr; + bool maybe_tz_only; + const struct tegra_io_pad_soc *io_pads; + unsigned int num_io_pads; + const struct pinctrl_pin_desc *pin_descs; + unsigned int num_pin_descs; + const struct tegra_pmc_regs *regs; + void (*init)(struct tegra_pmc *); + void (*setup_irq_polarity)(struct tegra_pmc *, struct device_node *, bool); + int (*irq_set_wake)(struct irq_data *, unsigned int); + int (*irq_set_type)(struct irq_data *, unsigned int); + int (*powergate_set)(struct tegra_pmc *, unsigned int, bool); + const char * const *reset_sources; + unsigned int num_reset_sources; + const char * const *reset_levels; + unsigned int num_reset_levels; + const struct tegra_wake_event *wake_events; + unsigned int num_wake_events; + const struct pmc_clk_init_data *pmc_clks_data; + unsigned int num_pmc_clks; + bool has_blink_output; + bool has_usb_sleepwalk; + bool supports_core_domain; +}; + +enum mrq_pg_cmd { + CMD_PG_QUERY_ABI = 0, + CMD_PG_SET_STATE = 1, + CMD_PG_GET_STATE = 2, + CMD_PG_GET_NAME = 3, + CMD_PG_GET_MAX_ID = 4, +}; + +enum pg_states { + PG_STATE_OFF = 0, + PG_STATE_ON = 1, + PG_STATE_RUNNING = 2, +}; + +struct cmd_pg_query_abi_request { + uint32_t type; +}; + +struct cmd_pg_set_state_request { + uint32_t state; +}; + +struct cmd_pg_get_state_response { + uint32_t state; +}; + +struct cmd_pg_get_name_response { + uint8_t name[40]; +}; + +struct cmd_pg_get_max_id_response { + uint32_t max_id; +}; + +struct mrq_pg_request { + uint32_t cmd; + uint32_t id; + union { + struct cmd_pg_query_abi_request query_abi; + struct cmd_pg_set_state_request set_state; + }; +}; + +struct mrq_pg_response { + union { + struct cmd_pg_get_state_response get_state; + struct cmd_pg_get_name_response get_name; + struct cmd_pg_get_max_id_response get_max_id; + }; +}; + +struct tegra_powergate_info { + unsigned int id; + char *name; +}; + +struct tegra_powergate___2 { + struct generic_pm_domain genpd; + struct tegra_bpmp *bpmp; + unsigned int id; +}; + +struct k3_ring_rt_regs { + u32 resv_16[4]; + u32 db; + u32 resv_4[1]; + u32 occ; + u32 indx; + u32 hwocc; + u32 hwindx; +}; + +struct k3_ring_fifo_regs { + u32 head_data[128]; + u32 tail_data[128]; + u32 peek_head_data[128]; + u32 peek_tail_data[128]; +}; + +struct k3_ringacc_proxy_gcfg_regs { + u32 revision; + u32 config; +}; + +struct k3_ringacc_proxy_target_regs { + u32 control; + u32 status; + u8 resv_512[504]; + u32 data[128]; +}; + +enum k3_ringacc_proxy_access_mode { + PROXY_ACCESS_MODE_HEAD = 0, + PROXY_ACCESS_MODE_TAIL = 1, + PROXY_ACCESS_MODE_PEEK_HEAD = 2, + PROXY_ACCESS_MODE_PEEK_TAIL = 3, +}; + +struct k3_ring___2; + +struct k3_ring_ops { + int (*push_tail)(struct k3_ring___2 *, void *); + int (*push_head)(struct k3_ring___2 *, void *); + int (*pop_tail)(struct k3_ring___2 *, void *); + int (*pop_head)(struct k3_ring___2 *, void *); +}; + +struct k3_ring_state { + u32 free; + u32 occ; + u32 windex; + u32 rindex; + u32 tdown_complete: 1; +}; + +struct k3_ringacc___2; + +struct k3_ring___2 { + struct k3_ring_rt_regs *rt; + struct k3_ring_fifo_regs *fifos; + struct k3_ringacc_proxy_target_regs *proxy; + dma_addr_t ring_mem_dma; + void *ring_mem_virt; + struct k3_ring_ops *ops; + u32 size; + enum k3_ring_size elm_size; + enum k3_ring_mode mode; + u32 flags; + struct k3_ring_state state; + u32 ring_id; + struct k3_ringacc___2 *parent; + u32 use_count; + int proxy_id; + struct device *dma_dev; + u32 asel; +}; + +struct k3_ringacc_ops; + +struct k3_ringacc___2 { + struct device *dev; + struct k3_ringacc_proxy_gcfg_regs *proxy_gcfg; + void *proxy_target_base; + u32 num_rings; + long unsigned int *rings_inuse; + struct ti_sci_resource *rm_gp_range; + bool dma_ring_reset_quirk; + u32 num_proxies; + long unsigned int *proxy_inuse; + struct k3_ring___2 *rings; + struct list_head list; + struct mutex req_lock; + const struct ti_sci_handle *tisci; + const struct ti_sci_rm_ringacc_ops *tisci_ring_ops; + u32 tisci_dev_id; + const struct k3_ringacc_ops *ops; + bool dma_rings; +}; + +struct k3_ringacc_ops { + int (*init)(struct platform_device *, struct k3_ringacc___2 *); +}; + +struct k3_ringacc_soc_data { + unsigned int dma_ring_reset_quirk: 1; +}; + +enum k3_ringacc_access_mode { + K3_RINGACC_ACCESS_MODE_PUSH_HEAD = 0, + K3_RINGACC_ACCESS_MODE_POP_HEAD = 1, + K3_RINGACC_ACCESS_MODE_PUSH_TAIL = 2, + K3_RINGACC_ACCESS_MODE_POP_TAIL = 3, + K3_RINGACC_ACCESS_MODE_PEEK_HEAD = 4, + K3_RINGACC_ACCESS_MODE_PEEK_TAIL = 5, +}; + +struct ringacc_match_data { + struct k3_ringacc_ops ops; +}; + +struct k3_soc_id { + unsigned int id; + const char *family_name; +}; + +enum zynqmp_pm_suspend_reason { + SUSPEND_POWER_REQUEST = 201, + SUSPEND_ALERT = 202, + SUSPEND_SYSTEM_SHUTDOWN = 203, +}; + +struct zynqmp_ipi_message { + size_t len; + u8 data[0]; +}; + +struct zynqmp_pm_work_struct { + struct work_struct callback_work; + u32 args[4]; +}; + +enum pm_suspend_mode { + PM_SUSPEND_MODE_FIRST = 0, + PM_SUSPEND_MODE_STD = 0, + PM_SUSPEND_MODE_POWER_OFF = 1, +}; + +enum pm_api_cb_id { + PM_INIT_SUSPEND_CB = 30, + PM_ACKNOWLEDGE_CB = 31, + PM_NOTIFY_CB = 32, +}; + +enum zynqmp_pm_request_ack { + ZYNQMP_PM_REQUEST_ACK_NO = 1, + ZYNQMP_PM_REQUEST_ACK_BLOCKING = 2, + ZYNQMP_PM_REQUEST_ACK_NON_BLOCKING = 3, +}; + +struct zynqmp_pm_domain { + struct generic_pm_domain gpd; + u32 node_id; + u8 flags; +}; + +struct virtio_driver { + struct device_driver driver; + const struct virtio_device_id *id_table; + const unsigned int *feature_table; + unsigned int feature_table_size; + const unsigned int *feature_table_legacy; + unsigned int feature_table_size_legacy; + int (*validate)(struct virtio_device *); + int (*probe)(struct virtio_device *); + void (*scan)(struct virtio_device *); + void (*remove)(struct virtio_device *); + void (*config_changed)(struct virtio_device *); + int (*freeze)(struct virtio_device *); + int (*restore)(struct virtio_device *); +}; + +typedef __u16 __virtio16; + +typedef __u32 __virtio32; + +typedef __u64 __virtio64; + +struct vring_desc { + __virtio64 addr; + __virtio32 len; + __virtio16 flags; + __virtio16 next; +}; + +struct vring_avail { + __virtio16 flags; + __virtio16 idx; + __virtio16 ring[0]; +}; + +struct vring_used_elem { + __virtio32 id; + __virtio32 len; +}; + +typedef struct vring_used_elem vring_used_elem_t; + +struct vring_used { + __virtio16 flags; + __virtio16 idx; + vring_used_elem_t ring[0]; +}; + +typedef struct vring_desc vring_desc_t; + +typedef struct vring_avail vring_avail_t; + +typedef struct vring_used vring_used_t; + +struct vring { + unsigned int num; + vring_desc_t *desc; + vring_avail_t *avail; + vring_used_t *used; +}; + +struct vring_packed_desc_event { + __le16 off_wrap; + __le16 flags; +}; + +struct vring_packed_desc { + __le64 addr; + __le32 len; + __le16 id; + __le16 flags; +}; + +struct vring_desc_state_split { + void *data; + struct vring_desc *indir_desc; +}; + +struct vring_desc_state_packed { + void *data; + struct vring_packed_desc *indir_desc; + u16 num; + u16 last; +}; + +struct vring_desc_extra { + dma_addr_t addr; + u32 len; + u16 flags; + u16 next; +}; + +struct vring_virtqueue { + struct virtqueue vq; + bool packed_ring; + bool use_dma_api; + bool weak_barriers; + bool broken; + bool indirect; + bool event; + unsigned int free_head; + unsigned int num_added; + u16 last_used_idx; + bool event_triggered; + union { + struct { + struct vring vring; + u16 avail_flags_shadow; + u16 avail_idx_shadow; + struct vring_desc_state_split *desc_state; + struct vring_desc_extra *desc_extra; + dma_addr_t queue_dma_addr; + size_t queue_size_in_bytes; + } split; + struct { + struct { + unsigned int num; + struct vring_packed_desc *desc; + struct vring_packed_desc_event *driver; + struct vring_packed_desc_event *device; + } vring; + bool avail_wrap_counter; + bool used_wrap_counter; + u16 avail_used_flags; + u16 next_avail_idx; + u16 event_flags_shadow; + struct vring_desc_state_packed *desc_state; + struct vring_desc_extra *desc_extra; + dma_addr_t ring_dma_addr; + dma_addr_t driver_event_dma_addr; + dma_addr_t device_event_dma_addr; + size_t ring_size_in_bytes; + size_t event_size_in_bytes; + } packed; + }; + bool (*notify)(struct virtqueue *); + bool we_own_ring; +}; + +struct virtio_pci_common_cfg { + __le32 device_feature_select; + __le32 device_feature; + __le32 guest_feature_select; + __le32 guest_feature; + __le16 msix_config; + __le16 num_queues; + __u8 device_status; + __u8 config_generation; + __le16 queue_select; + __le16 queue_size; + __le16 queue_msix_vector; + __le16 queue_enable; + __le16 queue_notify_off; + __le32 queue_desc_lo; + __le32 queue_desc_hi; + __le32 queue_avail_lo; + __le32 queue_avail_hi; + __le32 queue_used_lo; + __le32 queue_used_hi; +}; + +struct virtio_pci_modern_device { + struct pci_dev *pci_dev; + struct virtio_pci_common_cfg *common; + void *device; + void *notify_base; + resource_size_t notify_pa; + u8 *isr; + size_t notify_len; + size_t device_len; + int notify_map_cap; + u32 notify_offset_multiplier; + int modern_bars; + struct virtio_device_id id; +}; + +struct virtio_pci_legacy_device { + struct pci_dev *pci_dev; + u8 *isr; + void *ioaddr; + struct virtio_device_id id; +}; + +struct virtio_mmio_device { + struct virtio_device vdev; + struct platform_device *pdev; + void *base; + long unsigned int version; + spinlock_t lock; + struct list_head virtqueues; +}; + +struct virtio_mmio_vq_info { + struct virtqueue *vq; + struct list_head node; +}; + +struct virtio_pci_vq_info { + struct virtqueue *vq; + struct list_head node; + unsigned int msix_vector; +}; + +struct virtio_pci_device { + struct virtio_device vdev; + struct pci_dev *pci_dev; + struct virtio_pci_legacy_device ldev; + struct virtio_pci_modern_device mdev; + bool is_legacy; + u8 *isr; + spinlock_t lock; + struct list_head virtqueues; + struct virtio_pci_vq_info **vqs; + int msix_enabled; + int intx_enabled; + bool intx_soft_enabled; + cpumask_var_t *msix_affinity_masks; + char (*msix_names)[256]; + unsigned int msix_vectors; + unsigned int msix_used_vectors; + bool per_vq_vectors; + struct virtqueue * (*setup_vq)(struct virtio_pci_device *, struct virtio_pci_vq_info *, unsigned int, void (*)(struct virtqueue *), const char *, bool, u16); + void (*del_vq)(struct virtio_pci_vq_info *); + u16 (*config_vector)(struct virtio_pci_device *, u16); +}; + +enum { + VP_MSIX_CONFIG_VECTOR = 0, + VP_MSIX_VQ_VECTOR = 1, +}; + +struct virtio_balloon_config { + __le32 num_pages; + __le32 actual; + union { + __le32 free_page_hint_cmd_id; + __le32 free_page_report_cmd_id; + }; + __le32 poison_val; +}; + +struct virtio_balloon_stat { + __virtio16 tag; + __virtio64 val; +} __attribute__((packed)); + +enum virtio_balloon_vq { + VIRTIO_BALLOON_VQ_INFLATE = 0, + VIRTIO_BALLOON_VQ_DEFLATE = 1, + VIRTIO_BALLOON_VQ_STATS = 2, + VIRTIO_BALLOON_VQ_FREE_PAGE = 3, + VIRTIO_BALLOON_VQ_REPORTING = 4, + VIRTIO_BALLOON_VQ_MAX = 5, +}; + +enum virtio_balloon_config_read { + VIRTIO_BALLOON_CONFIG_READ_CMD_ID = 0, +}; + +struct virtio_balloon { + struct virtio_device *vdev; + struct virtqueue *inflate_vq; + struct virtqueue *deflate_vq; + struct virtqueue *stats_vq; + struct virtqueue *free_page_vq; + struct workqueue_struct *balloon_wq; + struct work_struct report_free_page_work; + struct work_struct update_balloon_stats_work; + struct work_struct update_balloon_size_work; + spinlock_t stop_update_lock; + bool stop_update; + int: 24; + long unsigned int config_read_bitmap; + struct list_head free_page_list; + spinlock_t free_page_list_lock; + int: 32; + long unsigned int num_free_page_blocks; + u32 cmd_id_received_cache; + __virtio32 cmd_id_active; + __virtio32 cmd_id_stop; + int: 32; + wait_queue_head_t acked; + unsigned int num_pages; + int: 32; + struct balloon_dev_info vb_dev_info; + struct mutex balloon_lock; + unsigned int num_pfns; + __virtio32 pfns[256]; + struct virtio_balloon_stat stats[10]; + struct shrinker shrinker; + struct notifier_block oom_nb; + struct virtqueue *reporting_vq; + struct page_reporting_dev_info pr_dev_info; +} __attribute__((packed)); + +struct xenbus_watch { + struct list_head list; + const char *node; + unsigned int nr_pending; + bool (*will_handle)(struct xenbus_watch *, const char *, const char *); + void (*callback)(struct xenbus_watch *, const char *, const char *); +}; + +struct xenbus_transaction { + u32 id; +}; + +typedef struct { + union { + xen_pfn_t *p; + uint64_t q; + }; +} __guest_handle_xen_pfn_t; + +struct grant_entry_v1 { + uint16_t flags; + domid_t domid; + uint32_t frame; +}; + +struct grant_entry_header { + uint16_t flags; + domid_t domid; +}; + +union grant_entry_v2 { + struct grant_entry_header hdr; + struct { + struct grant_entry_header hdr; + uint32_t pad0; + uint64_t frame; + } full_page; + struct { + struct grant_entry_header hdr; + uint16_t page_off; + uint16_t length; + uint64_t frame; + } sub_page; + struct { + struct grant_entry_header hdr; + domid_t trans_domid; + uint16_t pad0; + grant_ref_t gref; + } transitive; + uint32_t __spacer[4]; +}; + +struct gnttab_setup_table { + domid_t dom; + uint32_t nr_frames; + int16_t status; + __guest_handle_xen_pfn_t frame_list; +}; + +struct gnttab_copy { + struct { + union { + grant_ref_t ref; + xen_pfn_t gmfn; + } u; + domid_t domid; + uint16_t offset; + } source; + struct { + union { + grant_ref_t ref; + xen_pfn_t gmfn; + } u; + domid_t domid; + uint16_t offset; + } dest; + uint16_t len; + uint16_t flags; + int16_t status; +}; + +struct gnttab_query_size { + domid_t dom; + uint32_t nr_frames; + uint32_t max_nr_frames; + int16_t status; +}; + +struct gnttab_set_version { + uint32_t version; +}; + +struct gnttab_get_status_frames { + uint32_t nr_frames; + domid_t dom; + int16_t status; + __guest_handle_uint64_t frame_list; +}; + +struct gnttab_free_callback { + struct gnttab_free_callback *next; + void (*fn)(void *); + void *arg; + u16 count; +}; + +struct gntab_unmap_queue_data; + +typedef void (*gnttab_unmap_refs_done)(int, struct gntab_unmap_queue_data *); + +struct gntab_unmap_queue_data { + struct delayed_work gnttab_work; + void *data; + gnttab_unmap_refs_done done; + struct gnttab_unmap_grant_ref *unmap_ops; + struct gnttab_unmap_grant_ref *kunmap_ops; + struct page **pages; + unsigned int count; + unsigned int age; +}; + +struct gnttab_page_cache { + spinlock_t lock; + struct list_head pages; + unsigned int num_pages; +}; + +struct gnttab_dma_alloc_args { + struct device *dev; + bool coherent; + int nr_pages; + struct page **pages; + xen_pfn_t *frames; + void *vaddr; + dma_addr_t dev_bus_addr; +}; + +struct xen_page_foreign { + domid_t domid; + grant_ref_t gref; +}; + +typedef void (*xen_grant_fn_t)(long unsigned int, unsigned int, unsigned int, void *); + +struct gnttab_ops { + unsigned int version; + unsigned int grefs_per_grant_frame; + int (*map_frames)(xen_pfn_t *, unsigned int); + void (*unmap_frames)(); + void (*update_entry)(grant_ref_t, domid_t, long unsigned int, unsigned int); + int (*end_foreign_access_ref)(grant_ref_t, int); + long unsigned int (*end_foreign_transfer_ref)(grant_ref_t); + int (*query_foreign_access)(grant_ref_t); +}; + +struct unmap_refs_callback_data { + struct completion completion; + int result; +}; + +struct deferred_entry { + struct list_head list; + grant_ref_t ref; + bool ro; + uint16_t warn_delay; + struct page *page; +}; + +struct xen_feature_info { + unsigned int submap_idx; + uint32_t submap; +}; + +struct balloon_stats { + long unsigned int current_pages; + long unsigned int target_pages; + long unsigned int target_unpopulated; + long unsigned int balloon_low; + long unsigned int balloon_high; + long unsigned int total_pages; + long unsigned int schedule_delay; + long unsigned int max_schedule_delay; + long unsigned int retry_count; + long unsigned int max_retry_count; +}; + +enum bp_state { + BP_DONE = 0, + BP_WAIT = 1, + BP_EAGAIN = 2, + BP_ECANCELED = 3, +}; + +enum shutdown_state { + SHUTDOWN_INVALID = 4294967295, + SHUTDOWN_POWEROFF = 0, + SHUTDOWN_SUSPEND = 2, + SHUTDOWN_HALT = 4, +}; + +struct shutdown_handler { + const char command[11]; + bool flag; + void (*cb)(); +}; + +struct vcpu_runstate_info { + int state; + uint64_t state_entry_time; + uint64_t time[4]; +}; + +typedef struct { + union { + struct vcpu_runstate_info *p; + uint64_t q; + }; +} __guest_handle_vcpu_runstate_info; + +struct vcpu_register_runstate_memory_area { + union { + __guest_handle_vcpu_runstate_info h; + struct vcpu_runstate_info *v; + uint64_t p; + } addr; +}; + +struct xen_memory_reservation { + __guest_handle_xen_pfn_t extent_start; + xen_ulong_t nr_extents; + unsigned int extent_order; + unsigned int address_bits; + domid_t domid; +}; + +typedef uint32_t evtchn_port_t; + +typedef struct { + union { + evtchn_port_t *p; + uint64_t q; + }; +} __guest_handle_evtchn_port_t; + +struct evtchn_bind_interdomain { + domid_t remote_dom; + evtchn_port_t remote_port; + evtchn_port_t local_port; +}; + +struct evtchn_bind_virq { + uint32_t virq; + uint32_t vcpu; + evtchn_port_t port; +}; + +struct evtchn_bind_pirq { + uint32_t pirq; + uint32_t flags; + evtchn_port_t port; +}; + +struct evtchn_bind_ipi { + uint32_t vcpu; + evtchn_port_t port; +}; + +struct evtchn_close { + evtchn_port_t port; +}; + +struct evtchn_send { + evtchn_port_t port; +}; + +struct evtchn_status { + domid_t dom; + evtchn_port_t port; + uint32_t status; + uint32_t vcpu; + union { + struct { + domid_t dom; + } unbound; + struct { + domid_t dom; + evtchn_port_t port; + } interdomain; + uint32_t pirq; + uint32_t virq; + } u; +}; + +struct evtchn_bind_vcpu { + evtchn_port_t port; + uint32_t vcpu; +}; + +struct evtchn_set_priority { + evtchn_port_t port; + uint32_t priority; +}; + +struct sched_poll { + __guest_handle_evtchn_port_t ports; + unsigned int nr_ports; + uint64_t timeout; +}; + +enum ipi_vector { + XEN_PLACEHOLDER_VECTOR = 0, + XEN_NR_IPIS = 1, +}; + +struct physdev_eoi { + uint32_t irq; +}; + +struct physdev_irq_status_query { + uint32_t irq; + uint32_t flags; +}; + +struct physdev_irq { + uint32_t irq; + uint32_t vector; +}; + +struct physdev_map_pirq { + domid_t domid; + int type; + int index; + int pirq; + int bus; + int devfn; + int entry_nr; + uint64_t table_base; +}; + +struct physdev_unmap_pirq { + domid_t domid; + int pirq; +}; + +struct physdev_get_free_pirq { + int type; + uint32_t pirq; +}; + +enum xenbus_state { + XenbusStateUnknown = 0, + XenbusStateInitialising = 1, + XenbusStateInitWait = 2, + XenbusStateInitialised = 3, + XenbusStateConnected = 4, + XenbusStateClosing = 5, + XenbusStateClosed = 6, + XenbusStateReconfiguring = 7, + XenbusStateReconfigured = 8, +}; + +struct xenbus_device { + const char *devicetype; + const char *nodename; + const char *otherend; + int otherend_id; + struct xenbus_watch otherend_watch; + struct device dev; + enum xenbus_state state; + struct completion down; + struct work_struct work; + struct semaphore reclaim_sem; + atomic_t event_channels; + atomic_t events; + atomic_t spurious_events; + atomic_t jiffies_eoi_delayed; + unsigned int spurious_threshold; +}; + +struct evtchn_loop_ctrl; + +struct evtchn_ops { + unsigned int (*max_channels)(); + unsigned int (*nr_channels)(); + int (*setup)(evtchn_port_t); + void (*remove)(evtchn_port_t, unsigned int); + void (*bind_to_cpu)(evtchn_port_t, unsigned int, unsigned int); + void (*clear_pending)(evtchn_port_t); + void (*set_pending)(evtchn_port_t); + bool (*is_pending)(evtchn_port_t); + void (*mask)(evtchn_port_t); + void (*unmask)(evtchn_port_t); + void (*handle_events)(unsigned int, struct evtchn_loop_ctrl *); + void (*resume)(); + int (*percpu_init)(unsigned int); + int (*percpu_deinit)(unsigned int); +}; + +struct evtchn_loop_ctrl { + ktime_t timeout; + unsigned int count; + bool defer_eoi; +}; + +enum xen_irq_type { + IRQT_UNBOUND = 0, + IRQT_PIRQ = 1, + IRQT_VIRQ = 2, + IRQT_IPI = 3, + IRQT_EVTCHN = 4, +}; + +struct irq_info { + struct list_head list; + struct list_head eoi_list; + short int refcnt; + u8 spurious_cnt; + u8 is_accounted; + short int type; + u8 mask_reason; + u8 is_active; + unsigned int irq; + evtchn_port_t evtchn; + short unsigned int cpu; + short unsigned int eoi_cpu; + unsigned int irq_epoch; + u64 eoi_time; + raw_spinlock_t lock; + union { + short unsigned int virq; + enum ipi_vector ipi; + struct { + short unsigned int pirq; + short unsigned int gsi; + unsigned char vector; + unsigned char flags; + uint16_t domid; + } pirq; + struct xenbus_device *interdomain; + } u; +}; + +struct lateeoi_work { + struct delayed_work delayed; + spinlock_t eoi_list_lock; + struct list_head eoi_list; +}; + +struct evtchn_unmask { + evtchn_port_t port; +}; + +struct evtchn_init_control { + uint64_t control_gfn; + uint32_t offset; + uint32_t vcpu; + uint8_t link_bits; + uint8_t _pad[7]; +}; + +struct evtchn_expand_array { + uint64_t array_gfn; +}; + +typedef uint32_t event_word_t; + +struct evtchn_fifo_control_block { + uint32_t ready; + uint32_t _rsvd; + event_word_t head[16]; +}; + +struct evtchn_fifo_queue { + uint32_t head[16]; +}; + +struct evtchn_alloc_unbound { + domid_t dom; + domid_t remote_dom; + evtchn_port_t port; +}; + +struct xenbus_map_node { + struct list_head next; + union { + struct { + struct vm_struct *area; + } pv; + struct { + struct page *pages[16]; + long unsigned int addrs[16]; + void *addr; + } hvm; + }; + grant_handle_t handles[16]; + unsigned int nr_handles; +}; + +struct map_ring_valloc { + struct xenbus_map_node *node; + long unsigned int addrs[16]; + phys_addr_t phys_addrs[16]; + struct gnttab_map_grant_ref map[16]; + struct gnttab_unmap_grant_ref unmap[16]; + unsigned int idx; +}; + +struct xenbus_ring_ops { + int (*map)(struct xenbus_device *, struct map_ring_valloc *, grant_ref_t *, unsigned int, void **); + int (*unmap)(struct xenbus_device *, void *); +}; + +struct unmap_ring_hvm { + unsigned int idx; + long unsigned int addrs[16]; +}; + +enum xsd_sockmsg_type { + XS_DEBUG = 0, + XS_DIRECTORY = 1, + XS_READ = 2, + XS_GET_PERMS = 3, + XS_WATCH = 4, + XS_UNWATCH = 5, + XS_TRANSACTION_START = 6, + XS_TRANSACTION_END = 7, + XS_INTRODUCE = 8, + XS_RELEASE = 9, + XS_GET_DOMAIN_PATH = 10, + XS_WRITE = 11, + XS_MKDIR = 12, + XS_RM = 13, + XS_SET_PERMS = 14, + XS_WATCH_EVENT = 15, + XS_ERROR = 16, + XS_IS_DOMAIN_INTRODUCED = 17, + XS_RESUME = 18, + XS_SET_TARGET = 19, + XS_RESTRICT = 20, + XS_RESET_WATCHES = 21, +}; + +struct xsd_sockmsg { + uint32_t type; + uint32_t req_id; + uint32_t tx_id; + uint32_t len; +}; + +typedef uint32_t XENSTORE_RING_IDX; + +struct xenstore_domain_interface { + char req[1024]; + char rsp[1024]; + XENSTORE_RING_IDX req_cons; + XENSTORE_RING_IDX req_prod; + XENSTORE_RING_IDX rsp_cons; + XENSTORE_RING_IDX rsp_prod; +}; + +struct xs_watch_event { + struct list_head list; + unsigned int len; + struct xenbus_watch *handle; + const char *path; + const char *token; + char body[0]; +}; + +enum xb_req_state { + xb_req_state_queued = 0, + xb_req_state_wait_reply = 1, + xb_req_state_got_reply = 2, + xb_req_state_aborted = 3, +}; + +struct xb_req_data { + struct list_head list; + wait_queue_head_t wq; + struct xsd_sockmsg msg; + uint32_t caller_req_id; + enum xsd_sockmsg_type type; + char *body; + const struct kvec *vec; + int num_vecs; + int err; + enum xb_req_state state; + bool user_req; + void (*cb)(struct xb_req_data *); + void *par; +}; + +enum xenstore_init { + XS_UNKNOWN = 0, + XS_PV = 1, + XS_HVM = 2, + XS_LOCAL = 3, +}; + +struct xenbus_device_id { + char devicetype[32]; +}; + +struct xenbus_driver { + const char *name; + const struct xenbus_device_id *ids; + bool allow_rebind; + bool not_essential; + int (*probe)(struct xenbus_device *, const struct xenbus_device_id *); + void (*otherend_changed)(struct xenbus_device *, enum xenbus_state); + int (*remove)(struct xenbus_device *); + int (*suspend)(struct xenbus_device *); + int (*resume)(struct xenbus_device *); + int (*uevent)(struct xenbus_device *, struct kobj_uevent_env *); + struct device_driver driver; + int (*read_otherend_details)(struct xenbus_device *); + int (*is_ready)(struct xenbus_device *); + void (*reclaim_memory)(struct xenbus_device *); +}; + +struct xen_bus_type { + char *root; + unsigned int levels; + int (*get_bus_id)(char *, const char *); + int (*probe)(struct xen_bus_type *, const char *, const char *); + bool (*otherend_will_handle)(struct xenbus_watch *, const char *, const char *); + void (*otherend_changed)(struct xenbus_watch *, const char *, const char *); + struct bus_type bus; +}; + +struct xb_find_info { + struct xenbus_device *dev; + const char *nodename; +}; + +struct xenbus_transaction_holder { + struct list_head list; + struct xenbus_transaction handle; + unsigned int generation_id; +}; + +struct read_buffer { + struct list_head list; + unsigned int cons; + unsigned int len; + char msg[0]; +}; + +struct xenbus_file_priv { + struct mutex msgbuffer_mutex; + struct list_head transactions; + struct list_head watches; + unsigned int len; + union { + struct xsd_sockmsg msg; + char buffer[4096]; + } u; + struct mutex reply_mutex; + struct list_head read_buffers; + wait_queue_head_t read_waitq; + struct kref kref; + struct work_struct wq; +}; + +struct watch_adapter { + struct list_head list; + struct xenbus_watch watch; + struct xenbus_file_priv *dev_data; + char *token; +}; + +typedef struct { + union { + int *p; + uint64_t q; + }; +} __guest_handle_int; + +typedef struct { + union { + xen_ulong_t *p; + uint64_t q; + }; +} __guest_handle_xen_ulong_t; + +struct xen_add_to_physmap_range { + domid_t domid; + uint16_t space; + uint16_t size; + domid_t foreign_domid; + __guest_handle_xen_ulong_t idxs; + __guest_handle_xen_pfn_t gpfns; + __guest_handle_int errs; +}; + +struct xen_remove_from_physmap { + domid_t domid; + xen_pfn_t gpfn; +}; + +struct physdev_manage_pci { + uint8_t bus; + uint8_t devfn; +}; + +struct physdev_manage_pci_ext { + uint8_t bus; + uint8_t devfn; + unsigned int is_extfn; + unsigned int is_virtfn; + struct { + uint8_t bus; + uint8_t devfn; + } physfn; +}; + +struct physdev_pci_device_add { + uint16_t seg; + uint8_t bus; + uint8_t devfn; + uint32_t flags; + struct { + uint8_t bus; + uint8_t devfn; + } physfn; + uint32_t optarr[0]; +}; + +struct physdev_pci_device { + uint16_t seg; + uint8_t bus; + uint8_t devfn; +}; + +struct xen_device_domain_owner { + domid_t domain; + struct pci_dev *dev; + struct list_head list; +}; + +struct usb_device_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 bcdUSB; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bMaxPacketSize0; + __le16 idVendor; + __le16 idProduct; + __le16 bcdDevice; + __u8 iManufacturer; + __u8 iProduct; + __u8 iSerialNumber; + __u8 bNumConfigurations; +}; + +struct usb_config_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wTotalLength; + __u8 bNumInterfaces; + __u8 bConfigurationValue; + __u8 iConfiguration; + __u8 bmAttributes; + __u8 bMaxPower; +} __attribute__((packed)); + +struct usb_interface_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bInterfaceNumber; + __u8 bAlternateSetting; + __u8 bNumEndpoints; + __u8 bInterfaceClass; + __u8 bInterfaceSubClass; + __u8 bInterfaceProtocol; + __u8 iInterface; +}; + +struct usb_endpoint_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bEndpointAddress; + __u8 bmAttributes; + __le16 wMaxPacketSize; + __u8 bInterval; + __u8 bRefresh; + __u8 bSynchAddress; +} __attribute__((packed)); + +struct usb_ssp_isoc_ep_comp_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wReseved; + __le32 dwBytesPerInterval; +}; + +struct usb_ss_ep_comp_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bMaxBurst; + __u8 bmAttributes; + __le16 wBytesPerInterval; +}; + +struct usb_interface_assoc_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bFirstInterface; + __u8 bInterfaceCount; + __u8 bFunctionClass; + __u8 bFunctionSubClass; + __u8 bFunctionProtocol; + __u8 iFunction; +}; + +struct usb_bos_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wTotalLength; + __u8 bNumDeviceCaps; +} __attribute__((packed)); + +struct usb_ext_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __le32 bmAttributes; +} __attribute__((packed)); + +struct usb_ss_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __u8 bmAttributes; + __le16 wSpeedSupported; + __u8 bFunctionalitySupport; + __u8 bU1devExitLat; + __le16 bU2DevExitLat; +}; + +struct usb_ss_container_id_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __u8 bReserved; + __u8 ContainerID[16]; +}; + +struct usb_ssp_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; + __u8 bReserved; + __le32 bmAttributes; + __le16 wFunctionalitySupport; + __le16 wReserved; + __le32 bmSublinkSpeedAttr[1]; +}; + +struct usb_ptm_cap_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; +}; + +enum usb_device_speed { + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW = 1, + USB_SPEED_FULL = 2, + USB_SPEED_HIGH = 3, + USB_SPEED_WIRELESS = 4, + USB_SPEED_SUPER = 5, + USB_SPEED_SUPER_PLUS = 6, +}; + +enum usb_device_state { + USB_STATE_NOTATTACHED = 0, + USB_STATE_ATTACHED = 1, + USB_STATE_POWERED = 2, + USB_STATE_RECONNECTING = 3, + USB_STATE_UNAUTHENTICATED = 4, + USB_STATE_DEFAULT = 5, + USB_STATE_ADDRESS = 6, + USB_STATE_CONFIGURED = 7, + USB_STATE_SUSPENDED = 8, +}; + +enum usb3_link_state { + USB3_LPM_U0 = 0, + USB3_LPM_U1 = 1, + USB3_LPM_U2 = 2, + USB3_LPM_U3 = 3, +}; + +enum usb_ssp_rate { + USB_SSP_GEN_UNKNOWN = 0, + USB_SSP_GEN_2x1 = 1, + USB_SSP_GEN_1x2 = 2, + USB_SSP_GEN_2x2 = 3, +}; + +struct ep_device; + +struct usb_host_endpoint { + struct usb_endpoint_descriptor desc; + struct usb_ss_ep_comp_descriptor ss_ep_comp; + struct usb_ssp_isoc_ep_comp_descriptor ssp_isoc_ep_comp; + char: 8; + struct list_head urb_list; + void *hcpriv; + struct ep_device *ep_dev; + unsigned char *extra; + int extralen; + int enabled; + int streams; + int: 32; +} __attribute__((packed)); + +struct usb_host_interface { + struct usb_interface_descriptor desc; + int extralen; + unsigned char *extra; + struct usb_host_endpoint *endpoint; + char *string; +}; + +enum usb_interface_condition { + USB_INTERFACE_UNBOUND = 0, + USB_INTERFACE_BINDING = 1, + USB_INTERFACE_BOUND = 2, + USB_INTERFACE_UNBINDING = 3, +}; + +struct usb_interface { + struct usb_host_interface *altsetting; + struct usb_host_interface *cur_altsetting; + unsigned int num_altsetting; + struct usb_interface_assoc_descriptor *intf_assoc; + int minor; + enum usb_interface_condition condition; + unsigned int sysfs_files_created: 1; + unsigned int ep_devs_created: 1; + unsigned int unregistering: 1; + unsigned int needs_remote_wakeup: 1; + unsigned int needs_altsetting0: 1; + unsigned int needs_binding: 1; + unsigned int resetting_device: 1; + unsigned int authorized: 1; + struct device dev; + struct device *usb_dev; + struct work_struct reset_ws; +}; + +struct usb_interface_cache { + unsigned int num_altsetting; + struct kref ref; + struct usb_host_interface altsetting[0]; +}; + +struct usb_host_config { + struct usb_config_descriptor desc; + char *string; + struct usb_interface_assoc_descriptor *intf_assoc[16]; + struct usb_interface *interface[32]; + struct usb_interface_cache *intf_cache[32]; + unsigned char *extra; + int extralen; +}; + +struct usb_host_bos { + struct usb_bos_descriptor *desc; + struct usb_ext_cap_descriptor *ext_cap; + struct usb_ss_cap_descriptor *ss_cap; + struct usb_ssp_cap_descriptor *ssp_cap; + struct usb_ss_container_id_descriptor *ss_id; + struct usb_ptm_cap_descriptor *ptm_cap; +}; + +struct usb_devmap { + long unsigned int devicemap[2]; +}; + +struct mon_bus; + +struct usb_device; + +struct usb_bus { + struct device *controller; + struct device *sysdev; + int busnum; + const char *bus_name; + u8 uses_pio_for_control; + u8 otg_port; + unsigned int is_b_host: 1; + unsigned int b_hnp_enable: 1; + unsigned int no_stop_on_short: 1; + unsigned int no_sg_constraint: 1; + unsigned int sg_tablesize; + int devnum_next; + struct mutex devnum_next_mutex; + struct usb_devmap devmap; + struct usb_device *root_hub; + struct usb_bus *hs_companion; + int bandwidth_allocated; + int bandwidth_int_reqs; + int bandwidth_isoc_reqs; + unsigned int resuming_ports; + struct mon_bus *mon_bus; + int monitored; +}; + +struct wusb_dev; + +struct usb2_lpm_parameters { + unsigned int besl; + int timeout; +}; + +struct usb3_lpm_parameters { + unsigned int mel; + unsigned int pel; + unsigned int sel; + int timeout; +}; + +struct usb_tt; + +struct usb_device { + int devnum; + char devpath[16]; + u32 route; + enum usb_device_state state; + enum usb_device_speed speed; + unsigned int rx_lanes; + unsigned int tx_lanes; + enum usb_ssp_rate ssp_rate; + struct usb_tt *tt; + int ttport; + unsigned int toggle[2]; + struct usb_device *parent; + struct usb_bus *bus; + struct usb_host_endpoint ep0; + struct device dev; + struct usb_device_descriptor descriptor; + struct usb_host_bos *bos; + struct usb_host_config *config; + struct usb_host_config *actconfig; + struct usb_host_endpoint *ep_in[16]; + struct usb_host_endpoint *ep_out[16]; + char **rawdescriptors; + short unsigned int bus_mA; + u8 portnum; + u8 level; + u8 devaddr; + unsigned int can_submit: 1; + unsigned int persist_enabled: 1; + unsigned int have_langid: 1; + unsigned int authorized: 1; + unsigned int authenticated: 1; + unsigned int wusb: 1; + unsigned int lpm_capable: 1; + unsigned int usb2_hw_lpm_capable: 1; + unsigned int usb2_hw_lpm_besl_capable: 1; + unsigned int usb2_hw_lpm_enabled: 1; + unsigned int usb2_hw_lpm_allowed: 1; + unsigned int usb3_lpm_u1_enabled: 1; + unsigned int usb3_lpm_u2_enabled: 1; + int string_langid; + char *product; + char *manufacturer; + char *serial; + struct list_head filelist; + int maxchild; + u32 quirks; + atomic_t urbnum; + long unsigned int active_duration; + long unsigned int connect_time; + unsigned int do_remote_wakeup: 1; + unsigned int reset_resume: 1; + unsigned int port_is_suspended: 1; + struct wusb_dev *wusb_dev; + int slot_id; + struct usb2_lpm_parameters l1_params; + struct usb3_lpm_parameters u1_params; + struct usb3_lpm_parameters u2_params; + unsigned int lpm_disable_count; + u16 hub_delay; + unsigned int use_generic_driver: 1; +}; + +struct usb_tt { + struct usb_device *hub; + int multi; + unsigned int think_time; + void *hcpriv; + spinlock_t lock; + struct list_head clear_list; + struct work_struct clear_work; +}; + +struct usb_iso_packet_descriptor { + unsigned int offset; + unsigned int length; + unsigned int actual_length; + int status; +}; + +struct usb_anchor { + struct list_head urb_list; + wait_queue_head_t wait; + spinlock_t lock; + atomic_t suspend_wakeups; + unsigned int poisoned: 1; +}; + +struct urb; + +typedef void (*usb_complete_t)(struct urb *); + +struct urb { + struct kref kref; + int unlinked; + void *hcpriv; + atomic_t use_count; + atomic_t reject; + struct list_head urb_list; + struct list_head anchor_list; + struct usb_anchor *anchor; + struct usb_device *dev; + struct usb_host_endpoint *ep; + unsigned int pipe; + unsigned int stream_id; + int status; + unsigned int transfer_flags; + void *transfer_buffer; + dma_addr_t transfer_dma; + struct scatterlist *sg; + int num_mapped_sgs; + int num_sgs; + u32 transfer_buffer_length; + u32 actual_length; + unsigned char *setup_packet; + dma_addr_t setup_dma; + int start_frame; + int number_of_packets; + int interval; + int error_count; + void *context; + usb_complete_t complete; + struct usb_iso_packet_descriptor iso_frame_desc[0]; +}; + +struct giveback_urb_bh { + bool running; + spinlock_t lock; + struct list_head head; + struct tasklet_struct bh; + struct usb_host_endpoint *completing_ep; +}; + +enum usb_dev_authorize_policy { + USB_DEVICE_AUTHORIZE_NONE = 0, + USB_DEVICE_AUTHORIZE_ALL = 1, + USB_DEVICE_AUTHORIZE_INTERNAL = 2, +}; + +struct usb_phy_roothub; + +struct hc_driver; + +struct usb_phy; + +struct usb_hcd { + struct usb_bus self; + struct kref kref; + const char *product_desc; + int speed; + char irq_descr[24]; + struct timer_list rh_timer; + struct urb *status_urb; + struct work_struct wakeup_work; + struct work_struct died_work; + const struct hc_driver *driver; + struct usb_phy *usb_phy; + struct usb_phy_roothub *phy_roothub; + long unsigned int flags; + enum usb_dev_authorize_policy dev_policy; + unsigned int rh_registered: 1; + unsigned int rh_pollable: 1; + unsigned int msix_enabled: 1; + unsigned int msi_enabled: 1; + unsigned int skip_phy_initialization: 1; + unsigned int uses_new_polling: 1; + unsigned int wireless: 1; + unsigned int has_tt: 1; + unsigned int amd_resume_bug: 1; + unsigned int can_do_streams: 1; + unsigned int tpl_support: 1; + unsigned int cant_recv_wakeups: 1; + unsigned int irq; + void *regs; + resource_size_t rsrc_start; + resource_size_t rsrc_len; + unsigned int power_budget; + struct giveback_urb_bh high_prio_bh; + struct giveback_urb_bh low_prio_bh; + struct mutex *address0_mutex; + struct mutex *bandwidth_mutex; + struct usb_hcd *shared_hcd; + struct usb_hcd *primary_hcd; + struct dma_pool___2 *pool[4]; + int state; + struct gen_pool *localmem_pool; + long unsigned int hcd_priv[0]; +}; + +struct hc_driver { + const char *description; + const char *product_desc; + size_t hcd_priv_size; + irqreturn_t (*irq)(struct usb_hcd *); + int flags; + int (*reset)(struct usb_hcd *); + int (*start)(struct usb_hcd *); + int (*pci_suspend)(struct usb_hcd *, bool); + int (*pci_resume)(struct usb_hcd *, bool); + void (*stop)(struct usb_hcd *); + void (*shutdown)(struct usb_hcd *); + int (*get_frame_number)(struct usb_hcd *); + int (*urb_enqueue)(struct usb_hcd *, struct urb *, gfp_t); + int (*urb_dequeue)(struct usb_hcd *, struct urb *, int); + int (*map_urb_for_dma)(struct usb_hcd *, struct urb *, gfp_t); + void (*unmap_urb_for_dma)(struct usb_hcd *, struct urb *); + void (*endpoint_disable)(struct usb_hcd *, struct usb_host_endpoint *); + void (*endpoint_reset)(struct usb_hcd *, struct usb_host_endpoint *); + int (*hub_status_data)(struct usb_hcd *, char *); + int (*hub_control)(struct usb_hcd *, u16, u16, u16, char *, u16); + int (*bus_suspend)(struct usb_hcd *); + int (*bus_resume)(struct usb_hcd *); + int (*start_port_reset)(struct usb_hcd *, unsigned int); + long unsigned int (*get_resuming_ports)(struct usb_hcd *); + void (*relinquish_port)(struct usb_hcd *, int); + int (*port_handed_over)(struct usb_hcd *, int); + void (*clear_tt_buffer_complete)(struct usb_hcd *, struct usb_host_endpoint *); + int (*alloc_dev)(struct usb_hcd *, struct usb_device *); + void (*free_dev)(struct usb_hcd *, struct usb_device *); + int (*alloc_streams)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint **, unsigned int, unsigned int, gfp_t); + int (*free_streams)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint **, unsigned int, gfp_t); + int (*add_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*drop_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*check_bandwidth)(struct usb_hcd *, struct usb_device *); + void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *); + int (*address_device)(struct usb_hcd *, struct usb_device *); + int (*enable_device)(struct usb_hcd *, struct usb_device *); + int (*update_hub_device)(struct usb_hcd *, struct usb_device *, struct usb_tt *, gfp_t); + int (*reset_device)(struct usb_hcd *, struct usb_device *); + int (*update_device)(struct usb_hcd *, struct usb_device *); + int (*set_usb2_hw_lpm)(struct usb_hcd *, struct usb_device *, int); + int (*enable_usb3_lpm_timeout)(struct usb_hcd *, struct usb_device *, enum usb3_link_state); + int (*disable_usb3_lpm_timeout)(struct usb_hcd *, struct usb_device *, enum usb3_link_state); + int (*find_raw_port_number)(struct usb_hcd *, int); + int (*port_power)(struct usb_hcd *, int, bool); + int (*submit_single_step_set_feature)(struct usb_hcd *, struct urb *, int); +}; + +struct physdev_dbgp_op { + uint8_t op; + uint8_t bus; + union { + struct physdev_pci_device pci; + } u; +}; + +struct dev_ext_attribute { + struct device_attribute attr; + void *var; +}; + +typedef uint8_t xen_domain_handle_t[16]; + +struct xen_compile_info { + char compiler[64]; + char compile_by[16]; + char compile_domain[32]; + char compile_date[32]; +}; + +struct xen_platform_parameters { + xen_ulong_t virt_start; +}; + +struct xen_build_id { + uint32_t len; + unsigned char buf[0]; +}; + +struct hyp_sysfs_attr { + struct attribute attr; + ssize_t (*show)(struct hyp_sysfs_attr *, char *); + ssize_t (*store)(struct hyp_sysfs_attr *, const char *, size_t); + void *hyp_attr_data; +}; + +enum xen_swiotlb_err { + XEN_SWIOTLB_UNKNOWN = 0, + XEN_SWIOTLB_ENOMEM = 1, + XEN_SWIOTLB_EFIXUP = 2, +}; + +typedef void (*xen_gfn_fn_t)(long unsigned int, void *); + +struct xen_remap_gfn_info; + +struct remap_data { + xen_pfn_t *fgfn; + int nr_fgfn; + pgprot_t prot; + domid_t domid; + struct vm_area_struct *vma; + int index; + struct page **pages; + struct xen_remap_gfn_info *info; + int *err_ptr; + int mapped; + int h_errs[1]; + xen_ulong_t h_idxs[1]; + xen_pfn_t h_gpfns[1]; + int h_iter; +}; + +struct map_balloon_pages { + xen_pfn_t *pfns; + unsigned int idx; +}; + +struct remap_pfn { + struct mm_struct *mm; + struct page **pages; + pgprot_t prot; + long unsigned int i; +}; + +struct ww_class { + atomic_long_t stamp; + struct lock_class_key acquire_key; + struct lock_class_key mutex_key; + const char *acquire_name; + const char *mutex_name; + unsigned int is_wait_die; +}; + +struct pre_voltage_change_data { + long unsigned int old_uV; + long unsigned int min_uV; + long unsigned int max_uV; +}; + +struct regulator_voltage { + int min_uV; + int max_uV; +}; + +struct regulator { + struct device *dev; + struct list_head list; + unsigned int always_on: 1; + unsigned int bypass: 1; + unsigned int device_link: 1; + int uA_load; + unsigned int enable_count; + unsigned int deferred_disables; + struct regulator_voltage voltage[5]; + const char *supply_name; + struct device_attribute dev_attr; + struct regulator_dev *rdev; + struct dentry *debugfs; +}; + +struct regulator_coupler { + struct list_head list; + int (*attach_regulator)(struct regulator_coupler *, struct regulator_dev *); + int (*detach_regulator)(struct regulator_coupler *, struct regulator_dev *); + int (*balance_voltage)(struct regulator_coupler *, struct regulator_dev *, suspend_state_t); +}; + +enum regulator_status { + REGULATOR_STATUS_OFF = 0, + REGULATOR_STATUS_ON = 1, + REGULATOR_STATUS_ERROR = 2, + REGULATOR_STATUS_FAST = 3, + REGULATOR_STATUS_NORMAL = 4, + REGULATOR_STATUS_IDLE = 5, + REGULATOR_STATUS_STANDBY = 6, + REGULATOR_STATUS_BYPASS = 7, + REGULATOR_STATUS_UNDEFINED = 8, +}; + +enum regulator_detection_severity { + REGULATOR_SEVERITY_PROT = 0, + REGULATOR_SEVERITY_ERR = 1, + REGULATOR_SEVERITY_WARN = 2, +}; + +struct regulator_enable_gpio { + struct list_head list; + struct gpio_desc *gpiod; + u32 enable_count; + u32 request_count; +}; + +enum regulator_active_discharge { + REGULATOR_ACTIVE_DISCHARGE_DEFAULT = 0, + REGULATOR_ACTIVE_DISCHARGE_DISABLE = 1, + REGULATOR_ACTIVE_DISCHARGE_ENABLE = 2, +}; + +struct regulator_consumer_supply { + const char *dev_name; + const char *supply; +}; + +struct trace_event_raw_regulator_basic { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_regulator_range { + struct trace_entry ent; + u32 __data_loc_name; + int min; + int max; + char __data[0]; +}; + +struct trace_event_raw_regulator_value { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int val; + char __data[0]; +}; + +struct trace_event_data_offsets_regulator_basic { + u32 name; +}; + +struct trace_event_data_offsets_regulator_range { + u32 name; +}; + +struct trace_event_data_offsets_regulator_value { + u32 name; +}; + +typedef void (*btf_trace_regulator_enable)(void *, const char *); + +typedef void (*btf_trace_regulator_enable_delay)(void *, const char *); + +typedef void (*btf_trace_regulator_enable_complete)(void *, const char *); + +typedef void (*btf_trace_regulator_disable)(void *, const char *); + +typedef void (*btf_trace_regulator_disable_complete)(void *, const char *); + +typedef void (*btf_trace_regulator_bypass_enable)(void *, const char *); + +typedef void (*btf_trace_regulator_bypass_enable_complete)(void *, const char *); + +typedef void (*btf_trace_regulator_bypass_disable)(void *, const char *); + +typedef void (*btf_trace_regulator_bypass_disable_complete)(void *, const char *); + +typedef void (*btf_trace_regulator_set_voltage)(void *, const char *, int, int); + +typedef void (*btf_trace_regulator_set_voltage_complete)(void *, const char *, unsigned int); + +enum regulator_get_type { + NORMAL_GET = 0, + EXCLUSIVE_GET = 1, + OPTIONAL_GET = 2, + MAX_GET_TYPE = 3, +}; + +struct regulator_map { + struct list_head list; + const char *dev_name; + const char *supply; + struct regulator_dev *regulator; +}; + +struct regulator_supply_alias { + struct list_head list; + struct device *src_dev; + const char *src_supply; + struct device *alias_dev; + const char *alias_supply; +}; + +struct summary_data { + struct seq_file *s; + struct regulator_dev *parent; + int level; +}; + +struct summary_lock_data { + struct ww_acquire_ctx *ww_ctx; + struct regulator_dev **new_contended_rdev; + struct regulator_dev **old_contended_rdev; +}; + +struct fixed_voltage_config { + const char *supply_name; + const char *input_supply; + int microvolts; + unsigned int startup_delay; + unsigned int off_on_delay; + unsigned int enabled_at_boot: 1; + struct regulator_init_data *init_data; +}; + +struct fixed_regulator_data { + struct fixed_voltage_config cfg; + struct regulator_init_data init_data; + struct platform_device pdev; +}; + +struct regulator_err_state { + struct regulator_dev *rdev; + long unsigned int notifs; + long unsigned int errors; + int possible_errs; +}; + +struct regulator_irq_data { + struct regulator_err_state *states; + int num_states; + void *data; + long int opaque; +}; + +struct regulator_irq_desc { + const char *name; + int irq_flags; + int fatal_cnt; + int reread_ms; + int irq_off_ms; + bool skip_off; + bool high_prio; + void *data; + int (*die)(struct regulator_irq_data *); + int (*map_event)(int, struct regulator_irq_data *, long unsigned int *); + int (*renable)(struct regulator_irq_data *); +}; + +struct regulator_bulk_devres { + struct regulator_bulk_data *consumers; + int num_consumers; +}; + +struct regulator_supply_alias_match { + struct device *dev; + const char *id; +}; + +struct regulator_notifier_match { + struct regulator *regulator; + struct notifier_block *nb; +}; + +enum { + REGULATOR_ERROR_CLEARED = 0, + REGULATOR_FAILED_RETRY = 1, + REGULATOR_ERROR_ON = 2, +}; + +struct regulator_irq { + struct regulator_irq_data rdata; + struct regulator_irq_desc desc; + int irq; + int retry_cnt; + struct delayed_work isr_work; +}; + +struct of_regulator_match___2 { + const char *name; + void *driver_data; + struct regulator_init_data *init_data; + struct device_node *of_node; + const struct regulator_desc *desc; +}; + +struct devm_of_regulator_matches { + struct of_regulator_match___2 *matches; + unsigned int num_matches; +}; + +struct reset_control___2; + +struct reset_control_bulk_data { + const char *id; + struct reset_control___2 *rstc; +}; + +struct reset_control___2 { + struct reset_controller_dev *rcdev; + struct list_head list; + unsigned int id; + struct kref refcnt; + bool acquired; + bool shared; + bool array; + atomic_t deassert_count; + atomic_t triggered_count; +}; + +struct reset_control_lookup { + struct list_head list; + const char *provider; + unsigned int index; + const char *dev_id; + const char *con_id; +}; + +struct reset_control_array { + struct reset_control___2 base; + unsigned int num_rstcs; + struct reset_control___2 *rstc[0]; +}; + +struct reset_control_bulk_devres { + int num_rstcs; + struct reset_control_bulk_data *rstcs; +}; + +enum mrq_reset_commands { + CMD_RESET_ASSERT = 1, + CMD_RESET_DEASSERT = 2, + CMD_RESET_MODULE = 3, + CMD_RESET_GET_MAX_ID = 4, + CMD_RESET_MAX = 5, +}; + +struct mrq_reset_request { + uint32_t cmd; + uint32_t reset_id; +}; + +struct berlin_reset_priv { + struct regmap *regmap; + struct reset_controller_dev rcdev; +}; + +struct brcm_rescal_reset { + void *base; + struct device *dev; + struct reset_controller_dev rcdev; +}; + +struct imx7_src_signal { + unsigned int offset; + unsigned int bit; +}; + +struct imx7_src_variant { + const struct imx7_src_signal *signals; + unsigned int signals_num; + struct reset_control_ops ops; +}; + +struct imx7_src { + struct reset_controller_dev rcdev; + struct regmap *regmap; + const struct imx7_src_signal *signals; +}; + +enum imx7_src_registers { + SRC_A7RCR0 = 4, + SRC_M4RCR = 12, + SRC_ERCR = 20, + SRC_HSICPHY_RCR = 28, + SRC_USBOPHY1_RCR = 32, + SRC_USBOPHY2_RCR = 36, + SRC_MIPIPHY_RCR = 40, + SRC_PCIEPHY_RCR = 44, + SRC_DDRC_RCR = 4096, +}; + +enum imx8mq_src_registers { + SRC_A53RCR0 = 4, + SRC_HDMI_RCR = 48, + SRC_DISP_RCR = 52, + SRC_GPU_RCR = 64, + SRC_VPU_RCR = 68, + SRC_PCIE2_RCR = 72, + SRC_MIPIPHY1_RCR = 76, + SRC_MIPIPHY2_RCR = 80, + SRC_DDRC2_RCR = 4100, +}; + +enum imx8mp_src_registers { + SRC_SUPERMIX_RCR = 24, + SRC_AUDIOMIX_RCR = 28, + SRC_MLMIX_RCR = 40, + SRC_GPU2D_RCR = 56, + SRC_GPU3D_RCR = 60, + SRC_VPU_G1_RCR = 72, + SRC_VPU_G2_RCR = 76, + SRC_VPUVC8KE_RCR = 80, + SRC_NOC_RCR = 84, +}; + +struct reset_props { + u32 protect_reg; + u32 protect_bit; + u32 reset_reg; + u32 reset_bit; +}; + +struct mchp_reset_context { + struct regmap *cpu_ctrl; + struct regmap *gcb_ctrl; + struct reset_controller_dev rcdev; + const struct reset_props *props; +}; + +struct meson_reset_param { + int reg_count; + int level_offset; +}; + +struct meson_reset { + void *reg_base; + const struct meson_reset_param *param; + struct reset_controller_dev rcdev; + spinlock_t lock; +}; + +struct qcom_aoss_reset_map { + unsigned int reg; +}; + +struct qcom_aoss_desc { + const struct qcom_aoss_reset_map *resets; + size_t num_resets; +}; + +struct qcom_aoss_reset_data { + struct reset_controller_dev rcdev; + void *base; + const struct qcom_aoss_desc *desc; +}; + +struct reset_simple_data { + spinlock_t lock; + void *membase; + struct reset_controller_dev rcdev; + bool active_low; + bool status_active_low; + unsigned int reset_us; +}; + +struct reset_simple_devdata { + u32 reg_offset; + u32 nr_resets; + bool active_low; + bool status_active_low; +}; + +enum zynqmp_pm_reset_action { + PM_RESET_ACTION_RELEASE = 0, + PM_RESET_ACTION_ASSERT = 1, + PM_RESET_ACTION_PULSE = 2, +}; + +enum zynqmp_pm_reset { + ZYNQMP_PM_RESET_START = 1000, + ZYNQMP_PM_RESET_PCIE_CFG = 1000, + ZYNQMP_PM_RESET_PCIE_BRIDGE = 1001, + ZYNQMP_PM_RESET_PCIE_CTRL = 1002, + ZYNQMP_PM_RESET_DP = 1003, + ZYNQMP_PM_RESET_SWDT_CRF = 1004, + ZYNQMP_PM_RESET_AFI_FM5 = 1005, + ZYNQMP_PM_RESET_AFI_FM4 = 1006, + ZYNQMP_PM_RESET_AFI_FM3 = 1007, + ZYNQMP_PM_RESET_AFI_FM2 = 1008, + ZYNQMP_PM_RESET_AFI_FM1 = 1009, + ZYNQMP_PM_RESET_AFI_FM0 = 1010, + ZYNQMP_PM_RESET_GDMA = 1011, + ZYNQMP_PM_RESET_GPU_PP1 = 1012, + ZYNQMP_PM_RESET_GPU_PP0 = 1013, + ZYNQMP_PM_RESET_GPU = 1014, + ZYNQMP_PM_RESET_GT = 1015, + ZYNQMP_PM_RESET_SATA = 1016, + ZYNQMP_PM_RESET_ACPU3_PWRON = 1017, + ZYNQMP_PM_RESET_ACPU2_PWRON = 1018, + ZYNQMP_PM_RESET_ACPU1_PWRON = 1019, + ZYNQMP_PM_RESET_ACPU0_PWRON = 1020, + ZYNQMP_PM_RESET_APU_L2 = 1021, + ZYNQMP_PM_RESET_ACPU3 = 1022, + ZYNQMP_PM_RESET_ACPU2 = 1023, + ZYNQMP_PM_RESET_ACPU1 = 1024, + ZYNQMP_PM_RESET_ACPU0 = 1025, + ZYNQMP_PM_RESET_DDR = 1026, + ZYNQMP_PM_RESET_APM_FPD = 1027, + ZYNQMP_PM_RESET_SOFT = 1028, + ZYNQMP_PM_RESET_GEM0 = 1029, + ZYNQMP_PM_RESET_GEM1 = 1030, + ZYNQMP_PM_RESET_GEM2 = 1031, + ZYNQMP_PM_RESET_GEM3 = 1032, + ZYNQMP_PM_RESET_QSPI = 1033, + ZYNQMP_PM_RESET_UART0 = 1034, + ZYNQMP_PM_RESET_UART1 = 1035, + ZYNQMP_PM_RESET_SPI0 = 1036, + ZYNQMP_PM_RESET_SPI1 = 1037, + ZYNQMP_PM_RESET_SDIO0 = 1038, + ZYNQMP_PM_RESET_SDIO1 = 1039, + ZYNQMP_PM_RESET_CAN0 = 1040, + ZYNQMP_PM_RESET_CAN1 = 1041, + ZYNQMP_PM_RESET_I2C0 = 1042, + ZYNQMP_PM_RESET_I2C1 = 1043, + ZYNQMP_PM_RESET_TTC0 = 1044, + ZYNQMP_PM_RESET_TTC1 = 1045, + ZYNQMP_PM_RESET_TTC2 = 1046, + ZYNQMP_PM_RESET_TTC3 = 1047, + ZYNQMP_PM_RESET_SWDT_CRL = 1048, + ZYNQMP_PM_RESET_NAND = 1049, + ZYNQMP_PM_RESET_ADMA = 1050, + ZYNQMP_PM_RESET_GPIO = 1051, + ZYNQMP_PM_RESET_IOU_CC = 1052, + ZYNQMP_PM_RESET_TIMESTAMP = 1053, + ZYNQMP_PM_RESET_RPU_R50 = 1054, + ZYNQMP_PM_RESET_RPU_R51 = 1055, + ZYNQMP_PM_RESET_RPU_AMBA = 1056, + ZYNQMP_PM_RESET_OCM = 1057, + ZYNQMP_PM_RESET_RPU_PGE = 1058, + ZYNQMP_PM_RESET_USB0_CORERESET = 1059, + ZYNQMP_PM_RESET_USB1_CORERESET = 1060, + ZYNQMP_PM_RESET_USB0_HIBERRESET = 1061, + ZYNQMP_PM_RESET_USB1_HIBERRESET = 1062, + ZYNQMP_PM_RESET_USB0_APB = 1063, + ZYNQMP_PM_RESET_USB1_APB = 1064, + ZYNQMP_PM_RESET_IPI = 1065, + ZYNQMP_PM_RESET_APM_LPD = 1066, + ZYNQMP_PM_RESET_RTC = 1067, + ZYNQMP_PM_RESET_SYSMON = 1068, + ZYNQMP_PM_RESET_AFI_FM6 = 1069, + ZYNQMP_PM_RESET_LPD_SWDT = 1070, + ZYNQMP_PM_RESET_FPD = 1071, + ZYNQMP_PM_RESET_RPU_DBG1 = 1072, + ZYNQMP_PM_RESET_RPU_DBG0 = 1073, + ZYNQMP_PM_RESET_DBG_LPD = 1074, + ZYNQMP_PM_RESET_DBG_FPD = 1075, + ZYNQMP_PM_RESET_APLL = 1076, + ZYNQMP_PM_RESET_DPLL = 1077, + ZYNQMP_PM_RESET_VPLL = 1078, + ZYNQMP_PM_RESET_IOPLL = 1079, + ZYNQMP_PM_RESET_RPLL = 1080, + ZYNQMP_PM_RESET_GPO3_PL_0 = 1081, + ZYNQMP_PM_RESET_GPO3_PL_1 = 1082, + ZYNQMP_PM_RESET_GPO3_PL_2 = 1083, + ZYNQMP_PM_RESET_GPO3_PL_3 = 1084, + ZYNQMP_PM_RESET_GPO3_PL_4 = 1085, + ZYNQMP_PM_RESET_GPO3_PL_5 = 1086, + ZYNQMP_PM_RESET_GPO3_PL_6 = 1087, + ZYNQMP_PM_RESET_GPO3_PL_7 = 1088, + ZYNQMP_PM_RESET_GPO3_PL_8 = 1089, + ZYNQMP_PM_RESET_GPO3_PL_9 = 1090, + ZYNQMP_PM_RESET_GPO3_PL_10 = 1091, + ZYNQMP_PM_RESET_GPO3_PL_11 = 1092, + ZYNQMP_PM_RESET_GPO3_PL_12 = 1093, + ZYNQMP_PM_RESET_GPO3_PL_13 = 1094, + ZYNQMP_PM_RESET_GPO3_PL_14 = 1095, + ZYNQMP_PM_RESET_GPO3_PL_15 = 1096, + ZYNQMP_PM_RESET_GPO3_PL_16 = 1097, + ZYNQMP_PM_RESET_GPO3_PL_17 = 1098, + ZYNQMP_PM_RESET_GPO3_PL_18 = 1099, + ZYNQMP_PM_RESET_GPO3_PL_19 = 1100, + ZYNQMP_PM_RESET_GPO3_PL_20 = 1101, + ZYNQMP_PM_RESET_GPO3_PL_21 = 1102, + ZYNQMP_PM_RESET_GPO3_PL_22 = 1103, + ZYNQMP_PM_RESET_GPO3_PL_23 = 1104, + ZYNQMP_PM_RESET_GPO3_PL_24 = 1105, + ZYNQMP_PM_RESET_GPO3_PL_25 = 1106, + ZYNQMP_PM_RESET_GPO3_PL_26 = 1107, + ZYNQMP_PM_RESET_GPO3_PL_27 = 1108, + ZYNQMP_PM_RESET_GPO3_PL_28 = 1109, + ZYNQMP_PM_RESET_GPO3_PL_29 = 1110, + ZYNQMP_PM_RESET_GPO3_PL_30 = 1111, + ZYNQMP_PM_RESET_GPO3_PL_31 = 1112, + ZYNQMP_PM_RESET_RPU_LS = 1113, + ZYNQMP_PM_RESET_PS_ONLY = 1114, + ZYNQMP_PM_RESET_PL = 1115, + ZYNQMP_PM_RESET_PS_PL0 = 1116, + ZYNQMP_PM_RESET_PS_PL1 = 1117, + ZYNQMP_PM_RESET_PS_PL2 = 1118, + ZYNQMP_PM_RESET_PS_PL3 = 1119, + ZYNQMP_PM_RESET_END = 1119, +}; + +struct zynqmp_reset_soc_data { + u32 reset_id; + u32 num_resets; +}; + +struct zynqmp_reset_data { + struct reset_controller_dev rcdev; + const struct zynqmp_reset_soc_data *data; +}; + +struct serial_struct32 { + compat_int_t type; + compat_int_t line; + compat_uint_t port; + compat_int_t irq; + compat_int_t flags; + compat_int_t xmit_fifo_size; + compat_int_t custom_divisor; + compat_int_t baud_base; + short unsigned int close_delay; + char io_type; + char reserved_char; + compat_int_t hub6; + short unsigned int closing_wait; + short unsigned int closing_wait2; + compat_uint_t iomem_base; + short unsigned int iomem_reg_shift; + unsigned int port_high; + compat_int_t reserved; +}; + +struct n_tty_data { + size_t read_head; + size_t commit_head; + size_t canon_head; + size_t echo_head; + size_t echo_commit; + size_t echo_mark; + long unsigned int char_map[4]; + long unsigned int overrun_time; + int num_overrun; + bool no_room; + unsigned char lnext: 1; + unsigned char erasing: 1; + unsigned char raw: 1; + unsigned char real_raw: 1; + unsigned char icanon: 1; + unsigned char push: 1; + char read_buf[4096]; + long unsigned int read_flags[64]; + unsigned char echo_buf[4096]; + size_t read_tail; + size_t line_start; + unsigned int column; + unsigned int canon_column; + size_t echo_tail; + struct mutex atomic_read_lock; + struct mutex output_lock; +}; + +enum { + ERASE = 0, + WERASE = 1, + KILL = 2, +}; + +struct termios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; +}; + +struct termios2 { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +struct termio { + short unsigned int c_iflag; + short unsigned int c_oflag; + short unsigned int c_cflag; + short unsigned int c_lflag; + unsigned char c_line; + unsigned char c_cc[8]; +}; + +struct ldsem_waiter { + struct list_head list; + struct task_struct *task; +}; + +struct pts_fs_info___2; + +struct tty_audit_buf { + struct mutex mutex; + dev_t dev; + unsigned int icanon: 1; + size_t valid; + unsigned char *data; +}; + +struct sysrq_state { + struct input_handle handle; + struct work_struct reinject_work; + long unsigned int key_down[12]; + unsigned int alt; + unsigned int alt_use; + unsigned int shift; + unsigned int shift_use; + bool active; + bool need_reinject; + bool reinjecting; + bool reset_canceled; + bool reset_requested; + long unsigned int reset_keybit[12]; + int reset_seq_len; + int reset_seq_cnt; + int reset_seq_version; + struct timer_list keyreset_timer; +}; + +struct unipair { + short unsigned int unicode; + short unsigned int fontpos; +}; + +struct unimapdesc { + short unsigned int entry_ct; + struct unipair *entries; +}; + +struct kbentry { + unsigned char kb_table; + unsigned char kb_index; + short unsigned int kb_value; +}; + +struct kbsentry { + unsigned char kb_func; + unsigned char kb_string[512]; +}; + +struct kbkeycode { + unsigned int scancode; + unsigned int keycode; +}; + +struct kbd_repeat { + int delay; + int period; +}; + +struct console_font_op { + unsigned int op; + unsigned int flags; + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char *data; +}; + +struct vt_stat { + short unsigned int v_active; + short unsigned int v_signal; + short unsigned int v_state; +}; + +struct vt_sizes { + short unsigned int v_rows; + short unsigned int v_cols; + short unsigned int v_scrollsize; +}; + +struct vt_consize { + short unsigned int v_rows; + short unsigned int v_cols; + short unsigned int v_vlin; + short unsigned int v_clin; + short unsigned int v_vcol; + short unsigned int v_ccol; +}; + +struct vt_event { + unsigned int event; + unsigned int oldev; + unsigned int newev; + unsigned int pad[4]; +}; + +struct vt_setactivate { + unsigned int console; + struct vt_mode mode; +}; + +struct vt_spawn_console { + spinlock_t lock; + struct pid *pid; + int sig; +}; + +struct vt_event_wait { + struct list_head list; + struct vt_event event; + int done; +}; + +struct compat_console_font_op { + compat_uint_t op; + compat_uint_t flags; + compat_uint_t width; + compat_uint_t height; + compat_uint_t charcount; + compat_caddr_t data; +}; + +struct compat_unimapdesc { + short unsigned int entry_ct; + compat_caddr_t entries; +}; + +struct vt_notifier_param { + struct vc_data *vc; + unsigned int c; +}; + +struct vcs_poll_data { + struct notifier_block notifier; + unsigned int cons_num; + int event; + wait_queue_head_t waitq; + struct fasync_struct *fasync; +}; + +struct tiocl_selection { + short unsigned int xs; + short unsigned int ys; + short unsigned int xe; + short unsigned int ye; + short unsigned int sel_mode; +}; + +struct vc_selection { + struct mutex lock; + struct vc_data *cons; + char *buffer; + unsigned int buf_len; + volatile int start; + int end; +}; + +struct kbdiacr { + unsigned char diacr; + unsigned char base; + unsigned char result; +}; + +struct kbdiacrs { + unsigned int kb_cnt; + struct kbdiacr kbdiacr[256]; +}; + +struct kbdiacruc { + unsigned int diacr; + unsigned int base; + unsigned int result; +}; + +struct kbdiacrsuc { + unsigned int kb_cnt; + struct kbdiacruc kbdiacruc[256]; +}; + +struct keyboard_notifier_param { + struct vc_data *vc; + int down; + int shift; + int ledstate; + unsigned int value; +}; + +struct kbd_struct { + unsigned char lockstate; + unsigned char slockstate; + unsigned char ledmode: 1; + unsigned char ledflagstate: 4; + char: 3; + unsigned char default_ledflagstate: 4; + unsigned char kbdmode: 3; + char: 1; + unsigned char modeflags: 5; +}; + +typedef void k_handler_fn(struct vc_data *, unsigned char, char); + +typedef void fn_handler_fn(struct vc_data *); + +struct getset_keycode_data { + struct input_keymap_entry ke; + int error; +}; + +struct kbd_led_trigger { + struct led_trigger trigger; + unsigned int mask; +}; + +struct uni_pagedir { + u16 **uni_pgdir[32]; + long unsigned int refcount; + long unsigned int sum; + unsigned char *inverse_translations[4]; + u16 *inverse_trans_unicode; +}; + +typedef uint32_t char32_t; + +struct uni_screen { + char32_t *lines[0]; +}; + +struct con_driver { + const struct consw *con; + const char *desc; + struct device *dev; + int node; + int first; + int last; + int flag; +}; + +enum { + blank_off = 0, + blank_normal_wait = 1, + blank_vesa_wait = 2, +}; + +enum { + EPecma = 0, + EPdec = 1, + EPeq = 2, + EPgt = 3, + EPlt = 4, +}; + +struct rgb { + u8 r; + u8 g; + u8 b; +}; + +enum { + ESnormal = 0, + ESesc = 1, + ESsquare = 2, + ESgetpars = 3, + ESfunckey = 4, + EShash = 5, + ESsetG0 = 6, + ESsetG1 = 7, + ESpercent = 8, + EScsiignore = 9, + ESnonstd = 10, + ESpalette = 11, + ESosc = 12, + ESapc = 13, + ESpm = 14, + ESdcs = 15, +}; + +struct interval { + uint32_t first; + uint32_t last; +}; + +struct vc_draw_region { + long unsigned int from; + long unsigned int to; + int x; +}; + +struct hv_ops; + +struct hvc_struct { + struct tty_port port; + spinlock_t lock; + int index; + int do_wakeup; + char *outbuf; + int outbuf_size; + int n_outbuf; + uint32_t vtermno; + const struct hv_ops *ops; + int irq_requested; + int data; + struct winsize ws; + struct work_struct tty_resize; + struct list_head next; + long unsigned int flags; +}; + +struct hv_ops { + int (*get_chars)(uint32_t, char *, int); + int (*put_chars)(uint32_t, const char *, int); + int (*flush)(uint32_t, bool); + int (*notifier_add)(struct hvc_struct *, int); + void (*notifier_del)(struct hvc_struct *, int); + void (*notifier_hangup)(struct hvc_struct *, int); + int (*tiocmget)(struct hvc_struct *); + int (*tiocmset)(struct hvc_struct *, unsigned int, unsigned int); + void (*dtr_rts)(struct hvc_struct *, int); +}; + +struct earlycon_device { + struct console *con; + struct uart_port port; + char options[16]; + unsigned int baud; +}; + +struct earlycon_id { + char name[15]; + char name_term; + char compatible[128]; + int (*setup)(struct earlycon_device *, const char *); +}; + +typedef uint32_t XENCONS_RING_IDX; + +struct xencons_interface { + char in[1024]; + char out[2048]; + XENCONS_RING_IDX in_cons; + XENCONS_RING_IDX in_prod; + XENCONS_RING_IDX out_cons; + XENCONS_RING_IDX out_prod; +}; + +struct xencons_info { + struct list_head list; + struct xenbus_device *xbdev; + struct xencons_interface *intf; + unsigned int evtchn; + XENCONS_RING_IDX out_cons; + unsigned int out_cons_same; + struct hvc_struct *hvc; + int irq; + int vtermno; + grant_ref_t gntref; +}; + +struct uart_driver { + struct module *owner; + const char *driver_name; + const char *dev_name; + int major; + int minor; + int nr; + struct console *cons; + struct uart_state *state; + struct tty_driver *tty_driver; +}; + +struct uart_match { + struct uart_port *port; + struct uart_driver *driver; +}; + +enum hwparam_type { + hwparam_ioport = 0, + hwparam_iomem = 1, + hwparam_ioport_or_iomem = 2, + hwparam_irq = 3, + hwparam_dma = 4, + hwparam_dma_addr = 5, + hwparam_other = 6, +}; + +enum { + PLAT8250_DEV_LEGACY = 4294967295, + PLAT8250_DEV_PLATFORM = 0, + PLAT8250_DEV_PLATFORM1 = 1, + PLAT8250_DEV_PLATFORM2 = 2, + PLAT8250_DEV_FOURPORT = 3, + PLAT8250_DEV_ACCENT = 4, + PLAT8250_DEV_BOCA = 5, + PLAT8250_DEV_EXAR_ST16C554 = 6, + PLAT8250_DEV_HUB6 = 7, + PLAT8250_DEV_AU1X00 = 8, + PLAT8250_DEV_SM501 = 9, +}; + +struct uart_8250_port; + +struct uart_8250_ops { + int (*setup_irq)(struct uart_8250_port *); + void (*release_irq)(struct uart_8250_port *); +}; + +struct mctrl_gpios; + +struct uart_8250_dma; + +struct uart_8250_em485; + +struct uart_8250_port { + struct uart_port port; + struct timer_list timer; + struct list_head list; + u32 capabilities; + short unsigned int bugs; + bool fifo_bug; + unsigned int tx_loadsz; + unsigned char acr; + unsigned char fcr; + unsigned char ier; + unsigned char lcr; + unsigned char mcr; + unsigned char mcr_mask; + unsigned char mcr_force; + unsigned char cur_iotype; + unsigned int rpm_tx_active; + unsigned char canary; + unsigned char probe; + struct mctrl_gpios *gpios; + unsigned char lsr_saved_flags; + unsigned char msr_saved_flags; + struct uart_8250_dma *dma; + const struct uart_8250_ops *ops; + int (*dl_read)(struct uart_8250_port *); + void (*dl_write)(struct uart_8250_port *, int); + struct uart_8250_em485 *em485; + void (*rs485_start_tx)(struct uart_8250_port *); + void (*rs485_stop_tx)(struct uart_8250_port *); + struct delayed_work overrun_backoff; + u32 overrun_backoff_time_ms; +}; + +struct uart_8250_em485 { + struct hrtimer start_tx_timer; + struct hrtimer stop_tx_timer; + struct hrtimer *active_timer; + struct uart_8250_port *port; + unsigned int tx_stopped: 1; +}; + +struct uart_8250_dma { + int (*tx_dma)(struct uart_8250_port *); + int (*rx_dma)(struct uart_8250_port *); + dma_filter_fn fn; + void *rx_param; + void *tx_param; + struct dma_slave_config rxconf; + struct dma_slave_config txconf; + struct dma_chan *rxchan; + struct dma_chan *txchan; + phys_addr_t rx_dma_addr; + phys_addr_t tx_dma_addr; + dma_addr_t rx_addr; + dma_addr_t tx_addr; + dma_cookie_t rx_cookie; + dma_cookie_t tx_cookie; + void *rx_buf; + size_t rx_size; + size_t tx_size; + unsigned char tx_running; + unsigned char tx_err; + unsigned char rx_running; +}; + +struct old_serial_port { + unsigned int uart; + unsigned int baud_base; + unsigned int port; + unsigned int irq; + upf_t flags; + unsigned char io_type; + unsigned char *iomem_base; + short unsigned int iomem_reg_shift; +}; + +struct irq_info___2 { + struct hlist_node node; + int irq; + spinlock_t lock; + struct list_head *head; +}; + +struct serial8250_config { + const char *name; + short unsigned int fifo_size; + short unsigned int tx_loadsz; + unsigned char fcr; + unsigned char rxtrig_bytes[4]; + unsigned int flags; +}; + +struct dw8250_port_data { + int line; + struct uart_8250_dma dma; + u8 dlf_size; +}; + +struct fintek_8250 { + u16 pid; + u16 base_port; + u8 index; + u8 key; +}; + +struct pciserial_board { + unsigned int flags; + unsigned int num_ports; + unsigned int base_baud; + unsigned int uart_offset; + unsigned int reg_shift; + unsigned int first_offset; +}; + +struct serial_private; + +struct pci_serial_quirk { + u32 vendor; + u32 device; + u32 subvendor; + u32 subdevice; + int (*probe)(struct pci_dev *); + int (*init)(struct pci_dev *); + int (*setup)(struct serial_private *, const struct pciserial_board *, struct uart_8250_port *, int); + void (*exit)(struct pci_dev *); +}; + +struct serial_private { + struct pci_dev *dev; + unsigned int nr; + struct pci_serial_quirk *quirk; + const struct pciserial_board *board; + int line[0]; +}; + +struct f815xxa_data { + spinlock_t lock; + int idx; +}; + +struct timedia_struct { + int num; + const short unsigned int *ids; +}; + +enum pci_board_num_t { + pbn_default = 0, + pbn_b0_1_115200 = 1, + pbn_b0_2_115200 = 2, + pbn_b0_4_115200 = 3, + pbn_b0_5_115200 = 4, + pbn_b0_8_115200 = 5, + pbn_b0_1_921600 = 6, + pbn_b0_2_921600 = 7, + pbn_b0_4_921600 = 8, + pbn_b0_2_1130000 = 9, + pbn_b0_4_1152000 = 10, + pbn_b0_4_1250000 = 11, + pbn_b0_2_1843200 = 12, + pbn_b0_4_1843200 = 13, + pbn_b0_1_3906250 = 14, + pbn_b0_bt_1_115200 = 15, + pbn_b0_bt_2_115200 = 16, + pbn_b0_bt_4_115200 = 17, + pbn_b0_bt_8_115200 = 18, + pbn_b0_bt_1_460800 = 19, + pbn_b0_bt_2_460800 = 20, + pbn_b0_bt_4_460800 = 21, + pbn_b0_bt_1_921600 = 22, + pbn_b0_bt_2_921600 = 23, + pbn_b0_bt_4_921600 = 24, + pbn_b0_bt_8_921600 = 25, + pbn_b1_1_115200 = 26, + pbn_b1_2_115200 = 27, + pbn_b1_4_115200 = 28, + pbn_b1_8_115200 = 29, + pbn_b1_16_115200 = 30, + pbn_b1_1_921600 = 31, + pbn_b1_2_921600 = 32, + pbn_b1_4_921600 = 33, + pbn_b1_8_921600 = 34, + pbn_b1_2_1250000 = 35, + pbn_b1_bt_1_115200 = 36, + pbn_b1_bt_2_115200 = 37, + pbn_b1_bt_4_115200 = 38, + pbn_b1_bt_2_921600 = 39, + pbn_b1_1_1382400 = 40, + pbn_b1_2_1382400 = 41, + pbn_b1_4_1382400 = 42, + pbn_b1_8_1382400 = 43, + pbn_b2_1_115200 = 44, + pbn_b2_2_115200 = 45, + pbn_b2_4_115200 = 46, + pbn_b2_8_115200 = 47, + pbn_b2_1_460800 = 48, + pbn_b2_4_460800 = 49, + pbn_b2_8_460800 = 50, + pbn_b2_16_460800 = 51, + pbn_b2_1_921600 = 52, + pbn_b2_4_921600 = 53, + pbn_b2_8_921600 = 54, + pbn_b2_8_1152000 = 55, + pbn_b2_bt_1_115200 = 56, + pbn_b2_bt_2_115200 = 57, + pbn_b2_bt_4_115200 = 58, + pbn_b2_bt_2_921600 = 59, + pbn_b2_bt_4_921600 = 60, + pbn_b3_2_115200 = 61, + pbn_b3_4_115200 = 62, + pbn_b3_8_115200 = 63, + pbn_b4_bt_2_921600 = 64, + pbn_b4_bt_4_921600 = 65, + pbn_b4_bt_8_921600 = 66, + pbn_panacom = 67, + pbn_panacom2 = 68, + pbn_panacom4 = 69, + pbn_plx_romulus = 70, + pbn_endrun_2_4000000 = 71, + pbn_oxsemi = 72, + pbn_oxsemi_1_3906250 = 73, + pbn_oxsemi_2_3906250 = 74, + pbn_oxsemi_4_3906250 = 75, + pbn_oxsemi_8_3906250 = 76, + pbn_intel_i960 = 77, + pbn_sgi_ioc3 = 78, + pbn_computone_4 = 79, + pbn_computone_6 = 80, + pbn_computone_8 = 81, + pbn_sbsxrsio = 82, + pbn_pasemi_1682M = 83, + pbn_ni8430_2 = 84, + pbn_ni8430_4 = 85, + pbn_ni8430_8 = 86, + pbn_ni8430_16 = 87, + pbn_ADDIDATA_PCIe_1_3906250 = 88, + pbn_ADDIDATA_PCIe_2_3906250 = 89, + pbn_ADDIDATA_PCIe_4_3906250 = 90, + pbn_ADDIDATA_PCIe_8_3906250 = 91, + pbn_ce4100_1_115200 = 92, + pbn_omegapci = 93, + pbn_NETMOS9900_2s_115200 = 94, + pbn_brcm_trumanage = 95, + pbn_fintek_4 = 96, + pbn_fintek_8 = 97, + pbn_fintek_12 = 98, + pbn_fintek_F81504A = 99, + pbn_fintek_F81508A = 100, + pbn_fintek_F81512A = 101, + pbn_wch382_2 = 102, + pbn_wch384_4 = 103, + pbn_wch384_8 = 104, + pbn_pericom_PI7C9X7951 = 105, + pbn_pericom_PI7C9X7952 = 106, + pbn_pericom_PI7C9X7954 = 107, + pbn_pericom_PI7C9X7958 = 108, + pbn_sunix_pci_1s = 109, + pbn_sunix_pci_2s = 110, + pbn_sunix_pci_4s = 111, + pbn_sunix_pci_8s = 112, + pbn_sunix_pci_16s = 113, + pbn_titan_1_4000000 = 114, + pbn_titan_2_4000000 = 115, + pbn_titan_4_4000000 = 116, + pbn_titan_8_4000000 = 117, + pbn_moxa8250_2p = 118, + pbn_moxa8250_4p = 119, + pbn_moxa8250_8p = 120, +}; + +struct fsl8250_data { + int line; +}; + +struct dw8250_data { + struct dw8250_port_data data; + u8 usr_reg; + int msr_mask_on; + int msr_mask_off; + struct clk *clk; + struct clk *pclk; + struct notifier_block clk_notifier; + struct work_struct clk_work; + struct reset_control *rst; + unsigned int skip_autocfg: 1; + unsigned int uart_16550_compatible: 1; +}; + +enum mctrl_gpio_idx { + UART_GPIO_CTS = 0, + UART_GPIO_DSR = 1, + UART_GPIO_DCD = 2, + UART_GPIO_RNG = 3, + UART_GPIO_RI = 3, + UART_GPIO_RTS = 4, + UART_GPIO_DTR = 5, + UART_GPIO_MAX = 6, +}; + +struct omap8250_priv { + int line; + u8 habit; + u8 mdr1; + u8 efr; + u8 scr; + u8 wer; + u8 xon; + u8 xoff; + u8 delayed_restore; + u16 quot; + u8 tx_trigger; + u8 rx_trigger; + bool is_suspending; + int wakeirq; + int wakeups_enabled; + u32 latency; + u32 calc_latency; + struct pm_qos_request pm_qos_request; + struct work_struct qos_work; + struct uart_8250_dma omap8250_dma; + spinlock_t rx_dma_lock; + bool rx_dma_broken; + bool throttled; +}; + +struct omap8250_dma_params { + u32 rx_size; + u8 rx_trigger; + u8 tx_trigger; +}; + +struct omap8250_platdata { + struct omap8250_dma_params *dma_params; + u8 habit; +}; + +enum dma_rx_status { + DMA_RX_START = 0, + DMA_RX_RUNNING = 1, + DMA_RX_SHUTDOWN = 2, +}; + +struct mtk8250_data { + int line; + unsigned int rx_pos; + unsigned int clk_count; + struct clk *uart_clk; + struct clk *bus_clk; + struct uart_8250_dma *dma; + enum dma_rx_status rx_status; + int rx_wakeup_irq; +}; + +enum { + MTK_UART_FC_NONE = 0, + MTK_UART_FC_SW = 1, + MTK_UART_FC_HW = 2, +}; + +struct tegra_uart { + struct clk *clk; + struct reset_control *rst; + int line; +}; + +struct of_serial_info { + struct clk *clk; + struct reset_control *rst; + int type; + int line; +}; + +enum amba_vendor { + AMBA_VENDOR_ARM = 65, + AMBA_VENDOR_ST = 128, + AMBA_VENDOR_QCOM = 81, + AMBA_VENDOR_LSI = 182, + AMBA_VENDOR_LINUX = 254, +}; + +struct amba_pl011_data { + bool (*dma_filter)(struct dma_chan *, void *); + void *dma_rx_param; + void *dma_tx_param; + bool dma_rx_poll_enable; + unsigned int dma_rx_poll_rate; + unsigned int dma_rx_poll_timeout; + void (*init)(); + void (*exit)(); +}; + +enum { + REG_DR = 0, + REG_ST_DMAWM = 1, + REG_ST_TIMEOUT = 2, + REG_FR = 3, + REG_LCRH_RX = 4, + REG_LCRH_TX = 5, + REG_IBRD = 6, + REG_FBRD = 7, + REG_CR = 8, + REG_IFLS = 9, + REG_IMSC = 10, + REG_RIS = 11, + REG_MIS = 12, + REG_ICR = 13, + REG_DMACR = 14, + REG_ST_XFCR = 15, + REG_ST_XON1 = 16, + REG_ST_XON2 = 17, + REG_ST_XOFF1 = 18, + REG_ST_XOFF2 = 19, + REG_ST_ITCR = 20, + REG_ST_ITIP = 21, + REG_ST_ABCR = 22, + REG_ST_ABIMSC = 23, + REG_ARRAY_SIZE = 24, +}; + +struct vendor_data___2 { + const u16 *reg_offset; + unsigned int ifls; + unsigned int fr_busy; + unsigned int fr_dsr; + unsigned int fr_cts; + unsigned int fr_ri; + unsigned int inv_fr; + bool access_32b; + bool oversampling; + bool dma_threshold; + bool cts_event_workaround; + bool always_enabled; + bool fixed_options; + unsigned int (*get_fifosize)(struct amba_device *); +}; + +struct pl011_sgbuf { + struct scatterlist sg; + char *buf; +}; + +struct pl011_dmarx_data { + struct dma_chan *chan; + struct completion complete; + bool use_buf_b; + struct pl011_sgbuf sgbuf_a; + struct pl011_sgbuf sgbuf_b; + dma_cookie_t cookie; + bool running; + struct timer_list timer; + unsigned int last_residue; + long unsigned int last_jiffies; + bool auto_poll_rate; + unsigned int poll_rate; + unsigned int poll_timeout; +}; + +struct pl011_dmatx_data { + struct dma_chan *chan; + struct scatterlist sg; + char *buf; + bool queued; +}; + +struct uart_amba_port { + struct uart_port port; + const u16 *reg_offset; + struct clk *clk; + const struct vendor_data___2 *vendor; + unsigned int dmacr; + unsigned int im; + unsigned int old_status; + unsigned int fifosize; + unsigned int old_cr; + unsigned int fixed_baud; + char type[12]; + bool rs485_tx_started; + unsigned int rs485_tx_drain_interval; + bool using_tx_dma; + bool using_rx_dma; + struct pl011_dmarx_data dmarx; + struct pl011_dmatx_data dmatx; + bool dma_probed; +}; + +struct spi_device_id { + char name[32]; + kernel_ulong_t driver_data; +}; + +struct ptp_system_timestamp { + struct timespec64 pre_ts; + struct timespec64 post_ts; +}; + +struct spi_statistics { + spinlock_t lock; + long unsigned int messages; + long unsigned int transfers; + long unsigned int errors; + long unsigned int timedout; + long unsigned int spi_sync; + long unsigned int spi_sync_immediate; + long unsigned int spi_async; + long long unsigned int bytes; + long long unsigned int bytes_rx; + long long unsigned int bytes_tx; + long unsigned int transfer_bytes_histo[17]; + long unsigned int transfers_split_maxsize; +}; + +struct spi_delay { + u16 value; + u8 unit; +}; + +struct spi_controller; + +struct spi_device { + struct device dev; + struct spi_controller *controller; + struct spi_controller *master; + u32 max_speed_hz; + u8 chip_select; + u8 bits_per_word; + bool rt; + u32 mode; + int irq; + void *controller_state; + void *controller_data; + char modalias[32]; + const char *driver_override; + int cs_gpio; + struct gpio_desc *cs_gpiod; + struct spi_delay word_delay; + struct spi_delay cs_setup; + struct spi_delay cs_hold; + struct spi_delay cs_inactive; + struct spi_statistics statistics; +}; + +struct spi_message; + +struct spi_transfer; + +struct spi_controller_mem_ops; + +struct spi_controller { + struct device dev; + struct list_head list; + s16 bus_num; + u16 num_chipselect; + u16 dma_alignment; + u32 mode_bits; + u32 buswidth_override_bits; + u32 bits_per_word_mask; + u32 min_speed_hz; + u32 max_speed_hz; + u16 flags; + bool devm_allocated; + bool slave; + size_t (*max_transfer_size)(struct spi_device *); + size_t (*max_message_size)(struct spi_device *); + struct mutex io_mutex; + struct mutex add_lock; + spinlock_t bus_lock_spinlock; + struct mutex bus_lock_mutex; + bool bus_lock_flag; + int (*setup)(struct spi_device *); + int (*set_cs_timing)(struct spi_device *); + int (*transfer)(struct spi_device *, struct spi_message *); + void (*cleanup)(struct spi_device *); + bool (*can_dma)(struct spi_controller *, struct spi_device *, struct spi_transfer *); + struct device *dma_map_dev; + bool queued; + struct kthread_worker *kworker; + struct kthread_work pump_messages; + spinlock_t queue_lock; + struct list_head queue; + struct spi_message *cur_msg; + bool idling; + bool busy; + bool running; + bool rt; + bool auto_runtime_pm; + bool cur_msg_prepared; + bool cur_msg_mapped; + bool last_cs_enable; + bool last_cs_mode_high; + bool fallback; + struct completion xfer_completion; + size_t max_dma_len; + int (*prepare_transfer_hardware)(struct spi_controller *); + int (*transfer_one_message)(struct spi_controller *, struct spi_message *); + int (*unprepare_transfer_hardware)(struct spi_controller *); + int (*prepare_message)(struct spi_controller *, struct spi_message *); + int (*unprepare_message)(struct spi_controller *, struct spi_message *); + int (*slave_abort)(struct spi_controller *); + void (*set_cs)(struct spi_device *, bool); + int (*transfer_one)(struct spi_controller *, struct spi_device *, struct spi_transfer *); + void (*handle_err)(struct spi_controller *, struct spi_message *); + const struct spi_controller_mem_ops *mem_ops; + int *cs_gpios; + struct gpio_desc **cs_gpiods; + bool use_gpio_descriptors; + s8 unused_native_cs; + s8 max_native_cs; + struct spi_statistics statistics; + struct dma_chan *dma_tx; + struct dma_chan *dma_rx; + void *dummy_rx; + void *dummy_tx; + int (*fw_translate_cs)(struct spi_controller *, unsigned int); + bool ptp_sts_supported; + long unsigned int irq_flags; +}; + +struct spi_driver { + const struct spi_device_id *id_table; + int (*probe)(struct spi_device *); + int (*remove)(struct spi_device *); + void (*shutdown)(struct spi_device *); + struct device_driver driver; +}; + +struct spi_message { + struct list_head transfers; + struct spi_device *spi; + unsigned int is_dma_mapped: 1; + void (*complete)(void *); + void *context; + unsigned int frame_length; + unsigned int actual_length; + int status; + struct list_head queue; + void *state; + struct list_head resources; +}; + +struct spi_transfer { + const void *tx_buf; + void *rx_buf; + unsigned int len; + dma_addr_t tx_dma; + dma_addr_t rx_dma; + struct sg_table tx_sg; + struct sg_table rx_sg; + unsigned int dummy_data: 1; + unsigned int cs_change: 1; + unsigned int tx_nbits: 3; + unsigned int rx_nbits: 3; + u8 bits_per_word; + struct spi_delay delay; + struct spi_delay cs_change_delay; + struct spi_delay word_delay; + u32 speed_hz; + u32 effective_speed_hz; + unsigned int ptp_sts_word_pre; + unsigned int ptp_sts_word_post; + struct ptp_system_timestamp *ptp_sts; + bool timestamped; + struct list_head transfer_list; + u16 error; +}; + +struct spi_mem; + +struct spi_mem_op; + +struct spi_mem_dirmap_desc; + +struct spi_controller_mem_ops { + int (*adjust_op_size)(struct spi_mem *, struct spi_mem_op *); + bool (*supports_op)(struct spi_mem *, const struct spi_mem_op *); + int (*exec_op)(struct spi_mem *, const struct spi_mem_op *); + const char * (*get_name)(struct spi_mem *); + int (*dirmap_create)(struct spi_mem_dirmap_desc *); + void (*dirmap_destroy)(struct spi_mem_dirmap_desc *); + ssize_t (*dirmap_read)(struct spi_mem_dirmap_desc *, u64, size_t, void *); + ssize_t (*dirmap_write)(struct spi_mem_dirmap_desc *, u64, size_t, const void *); + int (*poll_status)(struct spi_mem *, const struct spi_mem_op *, u16, u16, long unsigned int, long unsigned int, long unsigned int); +}; + +struct max310x_devtype { + char name[9]; + int nr; + u8 mode1; + int (*detect)(struct device *); + void (*power)(struct uart_port *, int); +}; + +struct max310x_one { + struct uart_port port; + struct work_struct tx_work; + struct work_struct md_work; + struct work_struct rs_work; + u8 wr_header; + u8 rd_header; + u8 rx_buf[128]; +}; + +struct max310x_port { + const struct max310x_devtype *devtype; + struct regmap *regmap; + struct clk *clk; + struct gpio_chip gpio; + struct max310x_one p[0]; +}; + +enum imx_uart_type { + IMX1_UART = 0, + IMX21_UART = 1, + IMX53_UART = 2, + IMX6Q_UART = 3, +}; + +struct imx_uart_data { + unsigned int uts_reg; + enum imx_uart_type devtype; +}; + +enum imx_tx_state { + OFF = 0, + WAIT_AFTER_RTS = 1, + SEND = 2, + WAIT_AFTER_SEND = 3, +}; + +struct imx_port { + struct uart_port port; + struct timer_list timer; + unsigned int old_status; + unsigned int have_rtscts: 1; + unsigned int have_rtsgpio: 1; + unsigned int dte_mode: 1; + unsigned int inverted_tx: 1; + unsigned int inverted_rx: 1; + struct clk *clk_ipg; + struct clk *clk_per; + const struct imx_uart_data *devdata; + struct mctrl_gpios *gpios; + unsigned int ucr1; + unsigned int ucr2; + unsigned int ucr3; + unsigned int ucr4; + unsigned int ufcr; + unsigned int dma_is_enabled: 1; + unsigned int dma_is_rxing: 1; + unsigned int dma_is_txing: 1; + struct dma_chan *dma_chan_rx; + struct dma_chan *dma_chan_tx; + struct scatterlist rx_sgl; + struct scatterlist tx_sgl[2]; + void *rx_buf; + struct circ_buf rx_ring; + unsigned int rx_buf_size; + unsigned int rx_period_length; + unsigned int rx_periods; + dma_cookie_t rx_cookie; + unsigned int tx_bytes; + unsigned int dma_tx_nents; + unsigned int saved_reg[10]; + bool context_saved; + enum imx_tx_state tx_state; + struct hrtimer trigger_start_tx; + struct hrtimer trigger_stop_tx; +}; + +struct imx_port_ucrs { + unsigned int ucr1; + unsigned int ucr2; + unsigned int ucr3; +}; + +struct sccnxp_pdata { + const u8 reg_shift; + const u32 mctrl_cfg[2]; + const unsigned int poll_time_us; +}; + +struct sccnxp_chip { + const char *name; + unsigned int nr; + long unsigned int freq_min; + long unsigned int freq_std; + long unsigned int freq_max; + unsigned int flags; + unsigned int fifosize; + unsigned int trwd; +}; + +struct sccnxp_port { + struct uart_driver uart; + struct uart_port port[2]; + bool opened[2]; + int irq; + u8 imr; + struct sccnxp_chip *chip; + struct console console; + spinlock_t lock; + bool poll; + struct timer_list timer; + struct sccnxp_pdata pdata; + struct regulator *regulator; +}; + +enum { + UARTDM_1P1 = 1, + UARTDM_1P2 = 2, + UARTDM_1P3 = 3, + UARTDM_1P4 = 4, +}; + +struct msm_dma { + struct dma_chan *chan; + enum dma_data_direction dir; + dma_addr_t phys; + unsigned char *virt; + dma_cookie_t cookie; + u32 enable_bit; + unsigned int count; + struct dma_async_tx_descriptor *desc; +}; + +struct msm_port { + struct uart_port uart; + char name[16]; + struct clk *clk; + struct clk *pclk; + unsigned int imr; + int is_uartdm; + unsigned int old_snap_state; + bool break_detected; + struct msm_dma tx_dma; + struct msm_dma rx_dma; +}; + +struct msm_baud_map { + u16 divisor; + u8 code; + u8 rxstale; +}; + +struct tegra_tcu { + struct uart_driver driver; + struct console console; + struct uart_port port; + struct mbox_client tx_client; + struct mbox_client rx_client; + struct mbox_chan___2 *tx; + struct mbox_chan___2 *rx; +}; + +enum { + UART_IRQ_SUM = 0, + UART_RX_IRQ = 0, + UART_TX_IRQ = 1, + UART_IRQ_COUNT = 2, +}; + +struct uart_regs_layout { + unsigned int rbr; + unsigned int tsh; + unsigned int ctrl; + unsigned int intr; +}; + +struct uart_flags { + unsigned int ctrl_tx_rdy_int; + unsigned int ctrl_rx_rdy_int; + unsigned int stat_tx_rdy; + unsigned int stat_rx_rdy; +}; + +struct mvebu_uart_driver_data { + bool is_ext; + struct uart_regs_layout regs; + struct uart_flags flags; +}; + +struct mvebu_uart_pm_regs { + unsigned int rbr; + unsigned int tsh; + unsigned int ctrl; + unsigned int intr; + unsigned int stat; + unsigned int brdv; + unsigned int osamp; +}; + +struct mvebu_uart { + struct uart_port *port; + struct clk *clk; + int irq[2]; + struct mvebu_uart_driver_data *data; + struct mvebu_uart_pm_regs pm_regs; +}; + +struct owl_uart_info { + unsigned int tx_fifosize; +}; + +struct owl_uart_port { + struct uart_port port; + struct clk *clk; +}; + +struct gpio_array___2; + +struct mctrl_gpios___2 { + struct uart_port *port; + struct gpio_desc *gpio[6]; + int irq[6]; + unsigned int mctrl_prev; + bool mctrl_on; +}; + +typedef unsigned char unchar; + +struct kgdb_nmi_tty_priv { + struct tty_port port; + struct timer_list timer; + struct { + union { + struct __kfifo kfifo; + char *type; + const char *const_type; + char (*rectype)[0]; + char *ptr; + const char *ptr_const; + }; + char buf[64]; + } fifo; +}; + +struct serdev_device; + +struct serdev_device_ops { + int (*receive_buf)(struct serdev_device *, const unsigned char *, size_t); + void (*write_wakeup)(struct serdev_device *); +}; + +struct serdev_controller; + +struct serdev_device { + struct device dev; + int nr; + struct serdev_controller *ctrl; + const struct serdev_device_ops *ops; + struct completion write_comp; + struct mutex write_lock; +}; + +struct serdev_controller_ops; + +struct serdev_controller { + struct device dev; + unsigned int nr; + struct serdev_device *serdev; + const struct serdev_controller_ops *ops; +}; + +struct serdev_device_driver { + struct device_driver driver; + int (*probe)(struct serdev_device *); + void (*remove)(struct serdev_device *); +}; + +enum serdev_parity { + SERDEV_PARITY_NONE = 0, + SERDEV_PARITY_EVEN = 1, + SERDEV_PARITY_ODD = 2, +}; + +struct serdev_controller_ops { + int (*write_buf)(struct serdev_controller *, const unsigned char *, size_t); + void (*write_flush)(struct serdev_controller *); + int (*write_room)(struct serdev_controller *); + int (*open)(struct serdev_controller *); + void (*close)(struct serdev_controller *); + void (*set_flow_control)(struct serdev_controller *, bool); + int (*set_parity)(struct serdev_controller *, enum serdev_parity); + unsigned int (*set_baudrate)(struct serdev_controller *, unsigned int); + void (*wait_until_sent)(struct serdev_controller *, long int); + int (*get_tiocm)(struct serdev_controller *); + int (*set_tiocm)(struct serdev_controller *, unsigned int, unsigned int); +}; + +struct acpi_serdev_lookup { + acpi_handle device_handle; + acpi_handle controller_handle; + int n; + int index; +}; + +struct serport { + struct tty_port *port; + struct tty_struct *tty; + struct tty_driver *tty_drv; + int tty_idx; + long unsigned int flags; +}; + +struct memdev { + const char *name; + umode_t mode; + const struct file_operations *fops; + fmode_t fmode; +}; + +struct timer_rand_state { + cycles_t last_time; + long int last_delta; + long int last_delta2; +}; + +struct trace_event_raw_add_device_randomness { + struct trace_entry ent; + int bytes; + long unsigned int IP; + char __data[0]; +}; + +struct trace_event_raw_random__mix_pool_bytes { + struct trace_entry ent; + const char *pool_name; + int bytes; + long unsigned int IP; + char __data[0]; +}; + +struct trace_event_raw_credit_entropy_bits { + struct trace_entry ent; + const char *pool_name; + int bits; + int entropy_count; + long unsigned int IP; + char __data[0]; +}; + +struct trace_event_raw_debit_entropy { + struct trace_entry ent; + const char *pool_name; + int debit_bits; + char __data[0]; +}; + +struct trace_event_raw_add_input_randomness { + struct trace_entry ent; + int input_bits; + char __data[0]; +}; + +struct trace_event_raw_add_disk_randomness { + struct trace_entry ent; + dev_t dev; + int input_bits; + char __data[0]; +}; + +struct trace_event_raw_random__get_random_bytes { + struct trace_entry ent; + int nbytes; + long unsigned int IP; + char __data[0]; +}; + +struct trace_event_raw_random__extract_entropy { + struct trace_entry ent; + const char *pool_name; + int nbytes; + int entropy_count; + long unsigned int IP; + char __data[0]; +}; + +struct trace_event_raw_urandom_read { + struct trace_entry ent; + int got_bits; + int pool_left; + int input_left; + char __data[0]; +}; + +struct trace_event_raw_prandom_u32 { + struct trace_entry ent; + unsigned int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_add_device_randomness {}; + +struct trace_event_data_offsets_random__mix_pool_bytes {}; + +struct trace_event_data_offsets_credit_entropy_bits {}; + +struct trace_event_data_offsets_debit_entropy {}; + +struct trace_event_data_offsets_add_input_randomness {}; + +struct trace_event_data_offsets_add_disk_randomness {}; + +struct trace_event_data_offsets_random__get_random_bytes {}; + +struct trace_event_data_offsets_random__extract_entropy {}; + +struct trace_event_data_offsets_urandom_read {}; + +struct trace_event_data_offsets_prandom_u32 {}; + +typedef void (*btf_trace_add_device_randomness)(void *, int, long unsigned int); + +typedef void (*btf_trace_mix_pool_bytes)(void *, const char *, int, long unsigned int); + +typedef void (*btf_trace_mix_pool_bytes_nolock)(void *, const char *, int, long unsigned int); + +typedef void (*btf_trace_credit_entropy_bits)(void *, const char *, int, int, long unsigned int); + +typedef void (*btf_trace_debit_entropy)(void *, const char *, int); + +typedef void (*btf_trace_add_input_randomness)(void *, int); + +typedef void (*btf_trace_add_disk_randomness)(void *, dev_t, int); + +typedef void (*btf_trace_get_random_bytes)(void *, int, long unsigned int); + +typedef void (*btf_trace_get_random_bytes_arch)(void *, int, long unsigned int); + +typedef void (*btf_trace_extract_entropy)(void *, const char *, int, int, long unsigned int); + +typedef void (*btf_trace_urandom_read)(void *, int, int, int); + +typedef void (*btf_trace_prandom_u32)(void *, unsigned int); + +struct poolinfo { + int poolbitshift; + int poolwords; + int poolbytes; + int poolfracbits; + int tap1; + int tap2; + int tap3; + int tap4; + int tap5; +}; + +struct crng_state { + __u32 state[16]; + long unsigned int init_time; + spinlock_t lock; +}; + +struct entropy_store { + const struct poolinfo *poolinfo; + __u32 *pool; + const char *name; + spinlock_t lock; + short unsigned int add_ptr; + short unsigned int input_rotate; + int entropy_count; + unsigned int last_data_init: 1; + __u8 last_data[10]; +}; + +struct fast_pool { + __u32 pool[4]; + long unsigned int last; + short unsigned int reg_idx; + unsigned char count; +}; + +struct batched_entropy { + union { + u64 entropy_u64[8]; + u32 entropy_u32[16]; + }; + unsigned int position; + spinlock_t batch_lock; +}; + +struct ttyprintk_port { + struct tty_port port; + spinlock_t spinlock; +}; + +struct console___2 { + struct list_head list; + struct hvc_struct *hvc; + struct winsize ws; + u32 vtermno; +}; + +struct virtio_console_config { + __virtio16 cols; + __virtio16 rows; + __virtio32 max_nr_ports; + __virtio32 emerg_wr; +}; + +struct virtio_console_control { + __virtio32 id; + __virtio16 event; + __virtio16 value; +}; + +struct ports_driver_data { + struct class *class; + struct dentry *debugfs_dir; + struct list_head portdevs; + unsigned int next_vtermno; + struct list_head consoles; +}; + +struct port_buffer { + char *buf; + size_t size; + size_t len; + size_t offset; + dma_addr_t dma; + struct device *dev; + struct list_head list; + unsigned int sgpages; + struct scatterlist sg[0]; +}; + +struct ports_device { + struct list_head list; + struct work_struct control_work; + struct work_struct config_work; + struct list_head ports; + spinlock_t ports_lock; + spinlock_t c_ivq_lock; + spinlock_t c_ovq_lock; + u32 max_nr_ports; + struct virtio_device *vdev; + struct virtqueue *c_ivq; + struct virtqueue *c_ovq; + struct virtio_console_control cpkt; + struct virtqueue **in_vqs; + struct virtqueue **out_vqs; + int chr_major; +}; + +struct port_stats { + long unsigned int bytes_sent; + long unsigned int bytes_received; + long unsigned int bytes_discarded; +}; + +struct port { + struct list_head list; + struct ports_device *portdev; + struct port_buffer *inbuf; + spinlock_t inbuf_lock; + spinlock_t outvq_lock; + struct virtqueue *in_vq; + struct virtqueue *out_vq; + struct dentry *debugfs_file; + struct port_stats stats; + struct console___2 cons; + struct cdev *cdev; + struct device *dev; + struct kref kref; + wait_queue_head_t waitqueue; + char *name; + struct fasync_struct *async_queue; + u32 id; + bool outvq_full; + bool host_connected; + bool guest_connected; +}; + +struct sg_list { + unsigned int n; + unsigned int size; + size_t len; + struct scatterlist *sg; +}; + +enum tpm2_startup_types { + TPM2_SU_CLEAR = 0, + TPM2_SU_STATE = 1, +}; + +enum tpm_chip_flags { + TPM_CHIP_FLAG_TPM2 = 2, + TPM_CHIP_FLAG_IRQ = 4, + TPM_CHIP_FLAG_VIRTUAL = 8, + TPM_CHIP_FLAG_HAVE_TIMEOUTS = 16, + TPM_CHIP_FLAG_ALWAYS_POWERED = 32, + TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED = 64, +}; + +struct file_priv { + struct tpm_chip *chip; + struct tpm_space *space; + struct mutex buffer_mutex; + struct timer_list user_read_timer; + struct work_struct timeout_work; + struct work_struct async_work; + wait_queue_head_t async_wait; + ssize_t response_length; + bool response_read; + bool command_enqueued; + u8 data_buffer[4096]; +}; + +enum TPM_OPS_FLAGS { + TPM_OPS_AUTO_STARTUP = 1, +}; + +enum tpm2_timeouts { + TPM2_TIMEOUT_A = 750, + TPM2_TIMEOUT_B = 2000, + TPM2_TIMEOUT_C = 200, + TPM2_TIMEOUT_D = 30, + TPM2_DURATION_SHORT = 20, + TPM2_DURATION_MEDIUM = 750, + TPM2_DURATION_LONG = 2000, + TPM2_DURATION_LONG_LONG = 300000, + TPM2_DURATION_DEFAULT = 120000, +}; + +enum tpm_timeout { + TPM_TIMEOUT = 5, + TPM_TIMEOUT_RETRY = 100, + TPM_TIMEOUT_RANGE_US = 300, + TPM_TIMEOUT_POLL = 1, + TPM_TIMEOUT_USECS_MIN = 100, + TPM_TIMEOUT_USECS_MAX = 500, +}; + +struct stclear_flags_t { + __be16 tag; + u8 deactivated; + u8 disableForceClear; + u8 physicalPresence; + u8 physicalPresenceLock; + u8 bGlobalLock; +} __attribute__((packed)); + +struct tpm1_version { + u8 major; + u8 minor; + u8 rev_major; + u8 rev_minor; +}; + +struct tpm1_version2 { + __be16 tag; + struct tpm1_version version; +}; + +struct timeout_t { + __be32 a; + __be32 b; + __be32 c; + __be32 d; +}; + +struct duration_t { + __be32 tpm_short; + __be32 tpm_medium; + __be32 tpm_long; +}; + +struct permanent_flags_t { + __be16 tag; + u8 disable; + u8 ownership; + u8 deactivated; + u8 readPubek; + u8 disableOwnerClear; + u8 allowMaintenance; + u8 physicalPresenceLifetimeLock; + u8 physicalPresenceHWEnable; + u8 physicalPresenceCMDEnable; + u8 CEKPUsed; + u8 TPMpost; + u8 TPMpostLock; + u8 FIPS; + u8 operator; + u8 enableRevokeEK; + u8 nvLocked; + u8 readSRKPub; + u8 tpmEstablished; + u8 maintenanceDone; + u8 disableFullDALogicInfo; +}; + +typedef union { + struct permanent_flags_t perm_flags; + struct stclear_flags_t stclear_flags; + __u8 owned; + __be32 num_pcrs; + struct tpm1_version version1; + struct tpm1_version2 version2; + __be32 manufacturer_id; + struct timeout_t timeout; + struct duration_t duration; +} cap_t; + +enum tpm_capabilities { + TPM_CAP_FLAG = 4, + TPM_CAP_PROP = 5, + TPM_CAP_VERSION_1_1 = 6, + TPM_CAP_VERSION_1_2 = 26, +}; + +enum tpm_sub_capabilities { + TPM_CAP_PROP_PCR = 257, + TPM_CAP_PROP_MANUFACTURER = 259, + TPM_CAP_FLAG_PERM = 264, + TPM_CAP_FLAG_VOL = 265, + TPM_CAP_PROP_OWNER = 273, + TPM_CAP_PROP_TIS_TIMEOUT = 277, + TPM_CAP_PROP_TIS_DURATION = 288, +}; + +struct tpm1_get_random_out { + __be32 rng_data_len; + u8 rng_data[128]; +}; + +enum tpm2_const { + TPM2_PLATFORM_PCR = 24, + TPM2_PCR_SELECT_MIN = 3, +}; + +enum tpm2_capabilities { + TPM2_CAP_HANDLES = 1, + TPM2_CAP_COMMANDS = 2, + TPM2_CAP_PCRS = 5, + TPM2_CAP_TPM_PROPERTIES = 6, +}; + +enum tpm2_properties { + TPM_PT_TOTAL_COMMANDS = 297, +}; + +enum tpm2_cc_attrs { + TPM2_CC_ATTR_CHANDLES = 25, + TPM2_CC_ATTR_RHANDLE = 28, +}; + +struct tpm2_pcr_read_out { + __be32 update_cnt; + __be32 pcr_selects_cnt; + __be16 hash_alg; + u8 pcr_select_size; + u8 pcr_select[3]; + __be32 digests_cnt; + __be16 digest_size; + u8 digest[0]; +} __attribute__((packed)); + +struct tpm2_null_auth_area { + __be32 handle; + __be16 nonce_size; + u8 attributes; + __be16 auth_size; +} __attribute__((packed)); + +struct tpm2_get_random_out { + __be16 size; + u8 buffer[128]; +}; + +struct tpm2_get_cap_out { + u8 more_data; + __be32 subcap_id; + __be32 property_cnt; + __be32 property_id; + __be32 value; +} __attribute__((packed)); + +struct tpm2_pcr_selection { + __be16 hash_alg; + u8 size_of_select; + u8 pcr_select[3]; +}; + +struct tpmrm_priv { + struct file_priv priv; + struct tpm_space space; +}; + +enum tpm2_handle_types { + TPM2_HT_HMAC_SESSION = 33554432, + TPM2_HT_POLICY_SESSION = 50331648, + TPM2_HT_TRANSIENT = 2147483648, +}; + +struct tpm2_context { + __be64 sequence; + __be32 saved_handle; + __be32 hierarchy; + __be16 blob_size; +} __attribute__((packed)); + +struct tpm2_cap_handles { + u8 more_data; + __be32 capability; + __be32 count; + __be32 handles[0]; +} __attribute__((packed)); + +struct tpm_readpubek_out { + u8 algorithm[4]; + u8 encscheme[2]; + u8 sigscheme[2]; + __be32 paramsize; + u8 parameters[12]; + __be32 keysize; + u8 modulus[256]; + u8 checksum[20]; +}; + +struct tpm_pcr_attr { + int alg_id; + int pcr; + struct device_attribute attr; +}; + +struct tcpa_event { + u32 pcr_index; + u32 event_type; + u8 pcr_value[20]; + u32 event_size; + u8 event_data[0]; +}; + +enum tcpa_event_types { + PREBOOT = 0, + POST_CODE = 1, + UNUSED = 2, + NO_ACTION = 3, + SEPARATOR = 4, + ACTION = 5, + EVENT_TAG = 6, + SCRTM_CONTENTS = 7, + SCRTM_VERSION = 8, + CPU_MICROCODE = 9, + PLATFORM_CONFIG_FLAGS = 10, + TABLE_OF_DEVICES = 11, + COMPACT_HASH = 12, + IPL = 13, + IPL_PARTITION_DATA = 14, + NONHOST_CODE = 15, + NONHOST_CONFIG = 16, + NONHOST_INFO = 17, +}; + +struct tcpa_pc_event { + u32 event_id; + u32 event_size; + u8 event_data[0]; +}; + +enum tcpa_pc_event_ids { + SMBIOS = 1, + BIS_CERT = 2, + POST_BIOS_ROM = 3, + ESCD = 4, + CMOS = 5, + NVRAM = 6, + OPTION_ROM_EXEC = 7, + OPTION_ROM_CONFIG = 8, + OPTION_ROM_MICROCODE = 10, + S_CRTM_VERSION = 11, + S_CRTM_CONTENTS = 12, + POST_CONTENTS = 13, + HOST_TABLE_OF_DEVICES = 14, +}; + +struct tcg_efi_specid_event_algs { + u16 alg_id; + u16 digest_size; +}; + +struct tcg_efi_specid_event_head { + u8 signature[16]; + u32 platform_class; + u8 spec_version_minor; + u8 spec_version_major; + u8 spec_errata; + u8 uintnsize; + u32 num_algs; + struct tcg_efi_specid_event_algs digest_sizes[0]; +}; + +struct tcg_pcr_event { + u32 pcr_idx; + u32 event_type; + u8 digest[20]; + u32 event_size; + u8 event[0]; +}; + +struct tcg_event_field { + u32 event_size; + u8 event[0]; +}; + +struct tcg_pcr_event2_head { + u32 pcr_idx; + u32 event_type; + u32 count; + struct tpm_digest digests[0]; +}; + +struct acpi_table_tpm2 { + struct acpi_table_header header; + u16 platform_class; + u16 reserved; + u64 control_address; + u32 start_method; +} __attribute__((packed)); + +struct acpi_tpm2_phy { + u8 start_method_specific[12]; + u32 log_area_minimum_length; + u64 log_area_start_address; +}; + +enum bios_platform_class { + BIOS_CLIENT = 0, + BIOS_SERVER = 1, +}; + +struct client_hdr { + u32 log_max_len; + u64 log_start_addr; +} __attribute__((packed)); + +struct server_hdr { + u16 reserved; + u64 log_max_len; + u64 log_start_addr; +} __attribute__((packed)); + +struct acpi_tcpa { + struct acpi_table_header hdr; + u16 platform_class; + union { + struct client_hdr client; + struct server_hdr server; + }; +} __attribute__((packed)); + +struct linux_efi_tpm_eventlog { + u32 size; + u32 final_events_preboot_size; + u8 version; + u8 log[0]; +}; + +struct efi_tcg2_final_events_table { + u64 version; + u64 nr_events; + u8 events[0]; +}; + +enum tis_access { + TPM_ACCESS_VALID = 128, + TPM_ACCESS_ACTIVE_LOCALITY = 32, + TPM_ACCESS_REQUEST_PENDING = 4, + TPM_ACCESS_REQUEST_USE = 2, +}; + +enum tis_status { + TPM_STS_VALID = 128, + TPM_STS_COMMAND_READY = 64, + TPM_STS_GO = 32, + TPM_STS_DATA_AVAIL = 16, + TPM_STS_DATA_EXPECT = 8, + TPM_STS_READ_ZERO = 35, +}; + +enum tis_int_flags { + TPM_GLOBAL_INT_ENABLE = 2147483648, + TPM_INTF_BURST_COUNT_STATIC = 256, + TPM_INTF_CMD_READY_INT = 128, + TPM_INTF_INT_EDGE_FALLING = 64, + TPM_INTF_INT_EDGE_RISING = 32, + TPM_INTF_INT_LEVEL_LOW = 16, + TPM_INTF_INT_LEVEL_HIGH = 8, + TPM_INTF_LOCALITY_CHANGE_INT = 4, + TPM_INTF_STS_VALID_INT = 2, + TPM_INTF_DATA_AVAIL_INT = 1, +}; + +enum tis_defaults { + TIS_MEM_LEN = 20480, + TIS_SHORT_TIMEOUT = 750, + TIS_LONG_TIMEOUT = 2000, + TIS_TIMEOUT_MIN_ATML = 14700, + TIS_TIMEOUT_MAX_ATML = 15000, +}; + +enum tpm_tis_flags { + TPM_TIS_ITPM_WORKAROUND = 1, + TPM_TIS_INVALID_STATUS = 2, +}; + +struct tpm_tis_phy_ops; + +struct tpm_tis_data { + u16 manufacturer_id; + int locality; + int irq; + bool irq_tested; + long unsigned int flags; + void *ilb_base_addr; + u16 clkrun_enabled; + wait_queue_head_t int_queue; + wait_queue_head_t read_queue; + const struct tpm_tis_phy_ops *phy_ops; + short unsigned int rng_quality; + unsigned int timeout_min; + unsigned int timeout_max; +}; + +struct tpm_tis_phy_ops { + int (*read_bytes)(struct tpm_tis_data *, u32, u16, u8 *); + int (*write_bytes)(struct tpm_tis_data *, u32, u16, const u8 *); + int (*read16)(struct tpm_tis_data *, u32, u16 *); + int (*read32)(struct tpm_tis_data *, u32, u32 *); + int (*write32)(struct tpm_tis_data *, u32, u32); +}; + +struct tis_vendor_durations_override { + u32 did_vid; + struct tpm1_version version; + long unsigned int durations[3]; +}; + +struct tis_vendor_timeout_override { + u32 did_vid; + long unsigned int timeout_us[4]; +}; + +struct tpm_info { + struct resource res; + int irq; +}; + +struct tpm_tis_tcg_phy { + struct tpm_tis_data priv; + void *iobase; +}; + +enum crb_defaults { + CRB_ACPI_START_REVISION_ID = 1, + CRB_ACPI_START_INDEX = 1, +}; + +enum crb_loc_ctrl { + CRB_LOC_CTRL_REQUEST_ACCESS = 1, + CRB_LOC_CTRL_RELINQUISH = 2, +}; + +enum crb_loc_state { + CRB_LOC_STATE_LOC_ASSIGNED = 2, + CRB_LOC_STATE_TPM_REG_VALID_STS = 128, +}; + +enum crb_ctrl_req { + CRB_CTRL_REQ_CMD_READY = 1, + CRB_CTRL_REQ_GO_IDLE = 2, +}; + +enum crb_ctrl_sts { + CRB_CTRL_STS_ERROR = 1, + CRB_CTRL_STS_TPM_IDLE = 2, +}; + +enum crb_start { + CRB_START_INVOKE = 1, +}; + +enum crb_cancel { + CRB_CANCEL_INVOKE = 1, +}; + +struct crb_regs_head { + u32 loc_state; + u32 reserved1; + u32 loc_ctrl; + u32 loc_sts; + u8 reserved2[32]; + u64 intf_id; + u64 ctrl_ext; +}; + +struct crb_regs_tail { + u32 ctrl_req; + u32 ctrl_sts; + u32 ctrl_cancel; + u32 ctrl_start; + u32 ctrl_int_enable; + u32 ctrl_int_sts; + u32 ctrl_cmd_size; + u32 ctrl_cmd_pa_low; + u32 ctrl_cmd_pa_high; + u32 ctrl_rsp_size; + u64 ctrl_rsp_pa; +}; + +enum crb_status { + CRB_DRV_STS_COMPLETE = 1, +}; + +struct crb_priv { + u32 sm; + const char *hid; + struct crb_regs_head *regs_h; + struct crb_regs_tail *regs_t; + u8 *cmd; + u8 *rsp; + u32 cmd_size; + u32 smc_func_id; +}; + +struct tpm2_crb_smc { + u32 interrupt; + u8 interrupt_flags; + u8 op_flags; + u16 reserved2; + u32 smc_func_id; +}; + +enum io_pgtable_fmt { + ARM_32_LPAE_S1 = 0, + ARM_32_LPAE_S2 = 1, + ARM_64_LPAE_S1 = 2, + ARM_64_LPAE_S2 = 3, + ARM_V7S = 4, + ARM_MALI_LPAE = 5, + AMD_IOMMU_V1 = 6, + APPLE_DART = 7, + IO_PGTABLE_NUM_FMTS = 8, +}; + +struct iommu_flush_ops { + void (*tlb_flush_all)(void *); + void (*tlb_flush_walk)(long unsigned int, size_t, size_t, void *); + void (*tlb_add_page)(struct iommu_iotlb_gather *, long unsigned int, size_t, void *); +}; + +struct io_pgtable_cfg { + long unsigned int quirks; + long unsigned int pgsize_bitmap; + unsigned int ias; + unsigned int oas; + bool coherent_walk; + const struct iommu_flush_ops *tlb; + struct device *iommu_dev; + union { + struct { + u64 ttbr; + struct { + u32 ips: 3; + u32 tg: 2; + u32 sh: 2; + u32 orgn: 2; + u32 irgn: 2; + u32 tsz: 6; + } tcr; + u64 mair; + } arm_lpae_s1_cfg; + struct { + u64 vttbr; + struct { + u32 ps: 3; + u32 tg: 2; + u32 sh: 2; + u32 orgn: 2; + u32 irgn: 2; + u32 sl: 2; + u32 tsz: 6; + } vtcr; + } arm_lpae_s2_cfg; + struct { + u32 ttbr; + u32 tcr; + u32 nmrr; + u32 prrr; + } arm_v7s_cfg; + struct { + u64 transtab; + u64 memattr; + } arm_mali_lpae_cfg; + struct { + u64 ttbr[4]; + u32 n_ttbrs; + } apple_dart_cfg; + }; +}; + +struct io_pgtable_ops { + int (*map)(struct io_pgtable_ops *, long unsigned int, phys_addr_t, size_t, int, gfp_t); + int (*map_pages)(struct io_pgtable_ops *, long unsigned int, phys_addr_t, size_t, size_t, int, gfp_t, size_t *); + size_t (*unmap)(struct io_pgtable_ops *, long unsigned int, size_t, struct iommu_iotlb_gather *); + size_t (*unmap_pages)(struct io_pgtable_ops *, long unsigned int, size_t, size_t, struct iommu_iotlb_gather *); + phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *, long unsigned int); +}; + +struct io_pgtable { + enum io_pgtable_fmt fmt; + void *cookie; + struct io_pgtable_cfg cfg; + struct io_pgtable_ops ops; +}; + +enum qcom_iommu_clk { + CLK_IFACE = 0, + CLK_BUS = 1, + CLK_TBU = 2, + CLK_NUM = 3, +}; + +struct qcom_iommu_ctx; + +struct qcom_iommu_dev { + struct iommu_device iommu; + struct device *dev; + struct clk_bulk_data clks[3]; + void *local_base; + u32 sec_id; + u8 num_ctxs; + struct qcom_iommu_ctx *ctxs[0]; +}; + +struct qcom_iommu_ctx { + struct device *dev; + void *base; + bool secure_init; + u8 asid; + struct iommu_domain *domain; +}; + +struct qcom_iommu_domain { + struct io_pgtable_ops *pgtbl_ops; + spinlock_t pgtbl_lock; + struct mutex init_mutex; + struct iommu_domain domain; + struct qcom_iommu_dev *iommu; + struct iommu_fwspec *fwspec; +}; + +enum arm_smmu_s2cr_privcfg { + S2CR_PRIVCFG_DEFAULT = 0, + S2CR_PRIVCFG_DIPAN = 1, + S2CR_PRIVCFG_UNPRIV = 2, + S2CR_PRIVCFG_PRIV = 3, +}; + +enum arm_smmu_s2cr_type { + S2CR_TYPE_TRANS = 0, + S2CR_TYPE_BYPASS = 1, + S2CR_TYPE_FAULT = 2, +}; + +enum arm_smmu_cbar_type { + CBAR_TYPE_S2_TRANS = 0, + CBAR_TYPE_S1_TRANS_S2_BYPASS = 1, + CBAR_TYPE_S1_TRANS_S2_FAULT = 2, + CBAR_TYPE_S1_TRANS_S2_TRANS = 3, +}; + +enum arm_smmu_arch_version { + ARM_SMMU_V1 = 0, + ARM_SMMU_V1_64K = 1, + ARM_SMMU_V2 = 2, +}; + +enum arm_smmu_implementation { + GENERIC_SMMU = 0, + ARM_MMU500 = 1, + CAVIUM_SMMUV2 = 2, + QCOM_SMMUV2 = 3, +}; + +struct arm_smmu_s2cr { + struct iommu_group *group; + int count; + enum arm_smmu_s2cr_type type; + enum arm_smmu_s2cr_privcfg privcfg; + u8 cbndx; +}; + +struct arm_smmu_smr { + u16 mask; + u16 id; + bool valid; + bool pinned; +}; + +struct arm_smmu_impl; + +struct arm_smmu_cb; + +struct arm_smmu_device { + struct device *dev; + void *base; + unsigned int numpage; + unsigned int pgshift; + u32 features; + enum arm_smmu_arch_version version; + enum arm_smmu_implementation model; + const struct arm_smmu_impl *impl; + u32 num_context_banks; + u32 num_s2_context_banks; + long unsigned int context_map[2]; + struct arm_smmu_cb *cbs; + atomic_t irptndx; + u32 num_mapping_groups; + u16 streamid_mask; + u16 smr_mask_mask; + struct arm_smmu_smr *smrs; + struct arm_smmu_s2cr *s2crs; + struct mutex stream_map_mutex; + long unsigned int va_size; + long unsigned int ipa_size; + long unsigned int pa_size; + long unsigned int pgsize_bitmap; + u32 num_global_irqs; + u32 num_context_irqs; + unsigned int *irqs; + struct clk_bulk_data *clks; + int num_clks; + spinlock_t global_sync_lock; + struct iommu_device iommu; +}; + +struct arm_smmu_domain; + +struct arm_smmu_impl { + u32 (*read_reg)(struct arm_smmu_device *, int, int); + void (*write_reg)(struct arm_smmu_device *, int, int, u32); + u64 (*read_reg64)(struct arm_smmu_device *, int, int); + void (*write_reg64)(struct arm_smmu_device *, int, int, u64); + int (*cfg_probe)(struct arm_smmu_device *); + int (*reset)(struct arm_smmu_device *); + int (*init_context)(struct arm_smmu_domain *, struct io_pgtable_cfg *, struct device *); + void (*tlb_sync)(struct arm_smmu_device *, int, int, int); + int (*def_domain_type)(struct device *); + irqreturn_t (*global_fault)(int, void *); + irqreturn_t (*context_fault)(int, void *); + int (*alloc_context_bank)(struct arm_smmu_domain *, struct arm_smmu_device *, struct device *, int); + void (*write_s2cr)(struct arm_smmu_device *, int); + void (*write_sctlr)(struct arm_smmu_device *, int, u32); + void (*probe_finalize)(struct arm_smmu_device *, struct device *); +}; + +struct arm_smmu_cfg; + +struct arm_smmu_cb { + u64 ttbr[2]; + u32 tcr[2]; + u32 mair[2]; + struct arm_smmu_cfg *cfg; +}; + +enum arm_smmu_context_fmt { + ARM_SMMU_CTX_FMT_NONE = 0, + ARM_SMMU_CTX_FMT_AARCH64 = 1, + ARM_SMMU_CTX_FMT_AARCH32_L = 2, + ARM_SMMU_CTX_FMT_AARCH32_S = 3, +}; + +struct arm_smmu_cfg { + u8 cbndx; + u8 irptndx; + union { + u16 asid; + u16 vmid; + }; + enum arm_smmu_cbar_type cbar; + enum arm_smmu_context_fmt fmt; + bool flush_walk_prefer_tlbiasid; +}; + +enum arm_smmu_domain_stage { + ARM_SMMU_DOMAIN_S1 = 0, + ARM_SMMU_DOMAIN_S2 = 1, + ARM_SMMU_DOMAIN_NESTED = 2, + ARM_SMMU_DOMAIN_BYPASS = 3, +}; + +struct arm_smmu_domain { + struct arm_smmu_device *smmu; + struct io_pgtable_ops *pgtbl_ops; + long unsigned int pgtbl_quirks; + const struct iommu_flush_ops *flush_ops; + struct arm_smmu_cfg cfg; + enum arm_smmu_domain_stage stage; + struct mutex init_mutex; + spinlock_t cb_lock; + struct iommu_domain domain; +}; + +struct arm_smmu_master_cfg { + struct arm_smmu_device *smmu; + s16 smendx[0]; +}; + +struct arm_smmu_match_data { + enum arm_smmu_arch_version version; + enum arm_smmu_implementation model; +}; + +struct cavium_smmu { + struct arm_smmu_device smmu; + u32 id_base; +}; + +struct icc_node; + +struct icc_node_data { + struct icc_node *node; + u32 tag; +}; + +struct icc_provider; + +struct icc_node { + int id; + const char *name; + struct icc_node **links; + size_t num_links; + struct icc_provider *provider; + struct list_head node_list; + struct list_head search_list; + struct icc_node *reverse; + u8 is_traversed: 1; + struct hlist_head req_list; + u32 avg_bw; + u32 peak_bw; + u32 init_avg; + u32 init_peak; + void *data; +}; + +struct icc_provider { + struct list_head provider_list; + struct list_head nodes; + int (*set)(struct icc_node *, struct icc_node *); + int (*aggregate)(struct icc_node *, u32, u32, u32, u32 *, u32 *); + void (*pre_aggregate)(struct icc_node *); + int (*get_bw)(struct icc_node *, u32 *, u32 *); + struct icc_node * (*xlate)(struct of_phandle_args *, void *); + struct icc_node_data * (*xlate_extended)(struct of_phandle_args *, void *); + struct device *dev; + int users; + bool inter_set; + void *data; +}; + +struct tegra_mc_timing { + long unsigned int rate; + u32 *emem_data; +}; + +struct tegra_mc_client { + unsigned int id; + const char *name; + union { + unsigned int swgroup; + unsigned int sid; + }; + unsigned int fifo_size; + struct { + struct { + unsigned int reg; + unsigned int bit; + } smmu; + struct { + unsigned int reg; + unsigned int shift; + unsigned int mask; + unsigned int def; + } la; + struct { + unsigned int override; + unsigned int security; + } sid; + } regs; +}; + +struct tegra_smmu_swgroup { + const char *name; + unsigned int swgroup; + unsigned int reg; +}; + +struct tegra_smmu_group_soc { + const char *name; + const unsigned int *swgroups; + unsigned int num_swgroups; +}; + +struct tegra_smmu_soc { + const struct tegra_mc_client *clients; + unsigned int num_clients; + const struct tegra_smmu_swgroup *swgroups; + unsigned int num_swgroups; + const struct tegra_smmu_group_soc *groups; + unsigned int num_groups; + bool supports_round_robin_arbitration; + bool supports_request_limit; + unsigned int num_tlb_lines; + unsigned int num_asids; +}; + +struct tegra_mc_reset { + const char *name; + long unsigned int id; + unsigned int control; + unsigned int status; + unsigned int reset; + unsigned int bit; +}; + +struct tegra_mc; + +struct tegra_mc_reset_ops { + int (*hotreset_assert)(struct tegra_mc *, const struct tegra_mc_reset *); + int (*hotreset_deassert)(struct tegra_mc *, const struct tegra_mc_reset *); + int (*block_dma)(struct tegra_mc *, const struct tegra_mc_reset *); + bool (*dma_idling)(struct tegra_mc *, const struct tegra_mc_reset *); + int (*unblock_dma)(struct tegra_mc *, const struct tegra_mc_reset *); + int (*reset_status)(struct tegra_mc *, const struct tegra_mc_reset *); +}; + +struct gart_device; + +struct tegra_smmu; + +struct tegra_mc_soc; + +struct tegra_mc { + struct device *dev; + struct tegra_smmu *smmu; + struct gart_device *gart; + void *regs; + struct clk *clk; + int irq; + const struct tegra_mc_soc *soc; + long unsigned int tick; + struct tegra_mc_timing *timings; + unsigned int num_timings; + struct reset_controller_dev reset; + struct icc_provider provider; + spinlock_t lock; + struct { + struct dentry *root; + } debugfs; +}; + +struct tegra_mc_icc_ops { + int (*set)(struct icc_node *, struct icc_node *); + int (*aggregate)(struct icc_node *, u32, u32, u32, u32 *, u32 *); + struct icc_node_data * (*xlate_extended)(struct of_phandle_args *, void *); +}; + +struct tegra_mc_ops { + int (*probe)(struct tegra_mc *); + void (*remove)(struct tegra_mc *); + int (*suspend)(struct tegra_mc *); + int (*resume)(struct tegra_mc *); + irqreturn_t (*handle_irq)(int, void *); + int (*probe_device)(struct tegra_mc *, struct device *); +}; + +struct tegra_mc_soc { + const struct tegra_mc_client *clients; + unsigned int num_clients; + const long unsigned int *emem_regs; + unsigned int num_emem_regs; + unsigned int num_address_bits; + unsigned int atom_size; + u8 client_id_mask; + const struct tegra_smmu_soc *smmu; + u32 intmask; + const struct tegra_mc_reset_ops *reset_ops; + const struct tegra_mc_reset *resets; + unsigned int num_resets; + const struct tegra_mc_icc_ops *icc_ops; + const struct tegra_mc_ops *ops; +}; + +struct nvidia_smmu { + struct arm_smmu_device smmu; + void *bases[2]; + unsigned int num_instances; + struct tegra_mc *mc; +}; + +struct adreno_smmu_fault_info { + u64 far; + u64 ttbr0; + u32 contextidr; + u32 fsr; + u32 fsynr0; + u32 fsynr1; + u32 cbfrsynra; +}; + +struct adreno_smmu_priv { + const void *cookie; + const struct io_pgtable_cfg * (*get_ttbr1_cfg)(const void *); + int (*set_ttbr0_cfg)(const void *, const struct io_pgtable_cfg *); + void (*get_fault_info)(const void *, struct adreno_smmu_fault_info *); + void (*set_stall)(const void *, bool); + void (*resume_translation)(const void *, bool); +}; + +struct qcom_smmu { + struct arm_smmu_device smmu; + bool bypass_quirk; + u8 bypass_cbndx; + u32 stall_enabled; +}; + +enum iommu_fault_type { + IOMMU_FAULT_DMA_UNRECOV = 1, + IOMMU_FAULT_PAGE_REQ = 2, +}; + +enum iommu_fault_reason { + IOMMU_FAULT_REASON_UNKNOWN = 0, + IOMMU_FAULT_REASON_PASID_FETCH = 1, + IOMMU_FAULT_REASON_BAD_PASID_ENTRY = 2, + IOMMU_FAULT_REASON_PASID_INVALID = 3, + IOMMU_FAULT_REASON_WALK_EABT = 4, + IOMMU_FAULT_REASON_PTE_FETCH = 5, + IOMMU_FAULT_REASON_PERMISSION = 6, + IOMMU_FAULT_REASON_ACCESS = 7, + IOMMU_FAULT_REASON_OOR_ADDRESS = 8, +}; + +enum iommu_page_response_code { + IOMMU_PAGE_RESP_SUCCESS = 0, + IOMMU_PAGE_RESP_INVALID = 1, + IOMMU_PAGE_RESP_FAILURE = 2, +}; + +enum pri_resp { + PRI_RESP_DENY = 0, + PRI_RESP_FAIL = 1, + PRI_RESP_SUCC = 2, +}; + +struct arm_smmu_cmdq_ent { + u8 opcode; + bool substream_valid; + union { + struct { + u32 sid; + } prefetch; + struct { + u32 sid; + u32 ssid; + union { + bool leaf; + u8 span; + }; + } cfgi; + struct { + u8 num; + u8 scale; + u16 asid; + u16 vmid; + bool leaf; + u8 ttl; + u8 tg; + u64 addr; + } tlbi; + struct { + u32 sid; + u32 ssid; + u64 addr; + u8 size; + bool global; + } atc; + struct { + u32 sid; + u32 ssid; + u16 grpid; + enum pri_resp resp; + } pri; + struct { + u32 sid; + u16 stag; + u8 resp; + } resume; + struct { + u64 msiaddr; + } sync; + }; +}; + +struct arm_smmu_ll_queue { + union { + u64 val; + struct { + u32 prod; + u32 cons; + }; + struct { + atomic_t prod; + atomic_t cons; + } atomic; + u8 __pad[64]; + }; + u32 max_n_shift; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct arm_smmu_queue { + struct arm_smmu_ll_queue llq; + int irq; + __le64 *base; + dma_addr_t base_dma; + u64 q_base; + size_t ent_dwords; + u32 *prod_reg; + u32 *cons_reg; + long: 64; +}; + +struct arm_smmu_queue_poll { + ktime_t timeout; + unsigned int delay; + unsigned int spin_cnt; + bool wfe; +}; + +struct arm_smmu_cmdq { + struct arm_smmu_queue q; + atomic_long_t *valid_map; + atomic_t owner_prod; + atomic_t lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct arm_smmu_cmdq_batch { + u64 cmds[128]; + int num; +}; + +struct iopf_queue; + +struct arm_smmu_evtq { + struct arm_smmu_queue q; + struct iopf_queue *iopf; + u32 max_stalls; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct arm_smmu_priq { + struct arm_smmu_queue q; +}; + +struct arm_smmu_strtab_l1_desc { + u8 span; + __le64 *l2ptr; + dma_addr_t l2ptr_dma; +}; + +struct arm_smmu_ctx_desc { + u16 asid; + u64 ttbr; + u64 tcr; + u64 mair; + refcount_t refs; + struct mm_struct *mm; +}; + +struct arm_smmu_l1_ctx_desc { + __le64 *l2ptr; + dma_addr_t l2ptr_dma; +}; + +struct arm_smmu_ctx_desc_cfg { + __le64 *cdtab; + dma_addr_t cdtab_dma; + struct arm_smmu_l1_ctx_desc *l1_desc; + unsigned int num_l1_ents; +}; + +struct arm_smmu_s1_cfg { + struct arm_smmu_ctx_desc_cfg cdcfg; + struct arm_smmu_ctx_desc cd; + u8 s1fmt; + u8 s1cdmax; +}; + +struct arm_smmu_s2_cfg { + u16 vmid; + u64 vttbr; + u64 vtcr; +}; + +struct arm_smmu_strtab_cfg { + __le64 *strtab; + dma_addr_t strtab_dma; + struct arm_smmu_strtab_l1_desc *l1_desc; + unsigned int num_l1_ents; + u64 strtab_base; + u32 strtab_base_cfg; +}; + +struct arm_smmu_device___2 { + struct device *dev; + void *base; + void *page1; + u32 features; + u32 options; + long: 64; + long: 64; + long: 64; + long: 64; + struct arm_smmu_cmdq cmdq; + struct arm_smmu_evtq evtq; + struct arm_smmu_priq priq; + int gerr_irq; + int combined_irq; + long unsigned int ias; + long unsigned int oas; + long unsigned int pgsize_bitmap; + unsigned int asid_bits; + unsigned int vmid_bits; + long unsigned int vmid_map[1024]; + unsigned int ssid_bits; + unsigned int sid_bits; + struct arm_smmu_strtab_cfg strtab_cfg; + struct iommu_device iommu; + struct rb_root streams; + struct mutex streams_mutex; + long: 64; + long: 64; +}; + +struct arm_smmu_master; + +struct arm_smmu_stream { + u32 id; + struct arm_smmu_master *master; + struct rb_node node; +}; + +struct arm_smmu_domain___2; + +struct arm_smmu_master { + struct arm_smmu_device___2 *smmu; + struct device *dev; + struct arm_smmu_domain___2 *domain; + struct list_head domain_head; + struct arm_smmu_stream *streams; + unsigned int num_streams; + bool ats_enabled; + bool stall_enabled; + bool sva_enabled; + bool iopf_enabled; + struct list_head bonds; + unsigned int ssid_bits; +}; + +struct arm_smmu_domain___2 { + struct arm_smmu_device___2 *smmu; + struct mutex init_mutex; + struct io_pgtable_ops *pgtbl_ops; + bool stall_enabled; + atomic_t nr_ats_masters; + enum arm_smmu_domain_stage stage; + union { + struct arm_smmu_s1_cfg s1_cfg; + struct arm_smmu_s2_cfg s2_cfg; + }; + struct iommu_domain domain; + struct list_head devices; + spinlock_t devices_lock; + struct list_head mmu_notifiers; +}; + +enum arm_smmu_msi_index { + EVTQ_MSI_INDEX = 0, + GERROR_MSI_INDEX = 1, + PRIQ_MSI_INDEX = 2, + ARM_SMMU_MAX_MSIS = 3, +}; + +struct arm_smmu_option_prop { + u32 opt; + const char *prop; +}; + +typedef unsigned int ioasid_t; + +struct arm_smmu_mmu_notifier { + struct mmu_notifier mn; + struct arm_smmu_ctx_desc *cd; + bool cleared; + refcount_t refs; + struct list_head list; + struct arm_smmu_domain___2 *domain; +}; + +struct arm_smmu_bond { + struct iommu_sva sva; + struct mm_struct *mm; + struct arm_smmu_mmu_notifier *smmu_mn; + struct list_head list; + refcount_t refs; +}; + +struct iommu_group { + struct kobject kobj; + struct kobject *devices_kobj; + struct list_head devices; + struct mutex mutex; + struct blocking_notifier_head notifier; + void *iommu_data; + void (*iommu_data_release)(void *); + char *name; + int id; + struct iommu_domain *default_domain; + struct iommu_domain *domain; + struct list_head entry; +}; + +enum iommu_inv_granularity { + IOMMU_INV_GRANU_DOMAIN = 0, + IOMMU_INV_GRANU_PASID = 1, + IOMMU_INV_GRANU_ADDR = 2, + IOMMU_INV_GRANU_NR = 3, +}; + +struct group_device { + struct list_head list; + struct device *dev; + char *name; +}; + +struct iommu_group_attribute { + struct attribute attr; + ssize_t (*show)(struct iommu_group *, char *); + ssize_t (*store)(struct iommu_group *, const char *, size_t); +}; + +struct group_for_pci_data { + struct pci_dev *pdev; + struct iommu_group *group; +}; + +struct __group_domain_type { + struct device *dev; + unsigned int type; +}; + +struct trace_event_raw_iommu_group_event { + struct trace_entry ent; + int gid; + u32 __data_loc_device; + char __data[0]; +}; + +struct trace_event_raw_iommu_device_event { + struct trace_entry ent; + u32 __data_loc_device; + char __data[0]; +}; + +struct trace_event_raw_map { + struct trace_entry ent; + u64 iova; + u64 paddr; + size_t size; + char __data[0]; +}; + +struct trace_event_raw_unmap { + struct trace_entry ent; + u64 iova; + size_t size; + size_t unmapped_size; + char __data[0]; +}; + +struct trace_event_raw_iommu_error { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + u64 iova; + int flags; + char __data[0]; +}; + +struct trace_event_data_offsets_iommu_group_event { + u32 device; +}; + +struct trace_event_data_offsets_iommu_device_event { + u32 device; +}; + +struct trace_event_data_offsets_map {}; + +struct trace_event_data_offsets_unmap {}; + +struct trace_event_data_offsets_iommu_error { + u32 device; + u32 driver; +}; + +typedef void (*btf_trace_add_device_to_group)(void *, int, struct device *); + +typedef void (*btf_trace_remove_device_from_group)(void *, int, struct device *); + +typedef void (*btf_trace_attach_device_to_domain)(void *, struct device *); + +typedef void (*btf_trace_detach_device_from_domain)(void *, struct device *); + +typedef void (*btf_trace_map)(void *, long unsigned int, phys_addr_t, size_t); + +typedef void (*btf_trace_unmap)(void *, long unsigned int, size_t, size_t); + +typedef void (*btf_trace_io_page_fault)(void *, struct device *, long unsigned int, int); + +enum iommu_dma_cookie_type { + IOMMU_DMA_IOVA_COOKIE = 0, + IOMMU_DMA_MSI_COOKIE = 1, +}; + +struct iova { + struct rb_node node; + long unsigned int pfn_hi; + long unsigned int pfn_lo; +}; + +struct iova_magazine; + +struct iova_cpu_rcache; + +struct iova_rcache { + spinlock_t lock; + long unsigned int depot_size; + struct iova_magazine *depot[32]; + struct iova_cpu_rcache *cpu_rcaches; +}; + +struct iova_domain; + +typedef void (*iova_flush_cb)(struct iova_domain *); + +typedef void (*iova_entry_dtor)(long unsigned int); + +struct iova_fq; + +struct iova_domain { + spinlock_t iova_rbtree_lock; + struct rb_root rbroot; + struct rb_node *cached_node; + struct rb_node *cached32_node; + long unsigned int granule; + long unsigned int start_pfn; + long unsigned int dma_32bit_pfn; + long unsigned int max32_alloc_size; + struct iova_fq *fq; + atomic64_t fq_flush_start_cnt; + atomic64_t fq_flush_finish_cnt; + struct iova anchor; + struct iova_rcache rcaches[6]; + iova_flush_cb flush_cb; + iova_entry_dtor entry_dtor; + struct timer_list fq_timer; + atomic_t fq_timer_on; + struct hlist_node cpuhp_dead; +}; + +struct iommu_dma_cookie { + enum iommu_dma_cookie_type type; + union { + struct iova_domain iovad; + dma_addr_t msi_iova; + }; + struct list_head msi_page_list; + struct iommu_domain *fq_domain; +}; + +struct iova_fq_entry { + long unsigned int iova_pfn; + long unsigned int pages; + long unsigned int data; + u64 counter; +}; + +struct iova_fq { + struct iova_fq_entry entries[256]; + unsigned int head; + unsigned int tail; + spinlock_t lock; +}; + +struct iommu_dma_msi_page { + struct list_head list; + dma_addr_t iova; + phys_addr_t phys; +}; + +struct io_pgtable_init_fns { + struct io_pgtable * (*alloc)(struct io_pgtable_cfg *, void *); + void (*free)(struct io_pgtable *); +}; + +struct arm_lpae_io_pgtable { + struct io_pgtable iop; + int pgd_bits; + int start_level; + int bits_per_level; + void *pgd; +}; + +typedef u64 arm_lpae_iopte; + +typedef ioasid_t (*ioasid_alloc_fn_t)(ioasid_t, ioasid_t, void *); + +typedef void (*ioasid_free_fn_t)(ioasid_t, void *); + +struct ioasid_set { + int dummy; +}; + +struct ioasid_allocator_ops { + ioasid_alloc_fn_t alloc; + ioasid_free_fn_t free; + struct list_head list; + void *pdata; +}; + +struct ioasid_data { + ioasid_t id; + struct ioasid_set *set; + void *private; + struct callback_head rcu; + refcount_t refs; +}; + +struct ioasid_allocator_data { + struct ioasid_allocator_ops *ops; + struct list_head list; + struct list_head slist; + long unsigned int flags; + struct xarray xa; + struct callback_head rcu; +}; + +struct iova_magazine { + long unsigned int size; + long unsigned int pfns[128]; +}; + +struct iova_cpu_rcache { + spinlock_t lock; + struct iova_magazine *loaded; + struct iova_magazine *prev; +}; + +struct of_pci_iommu_alias_info { + struct device *dev; + struct device_node *np; +}; + +struct rk_iommu_domain { + struct list_head iommus; + u32 *dt; + dma_addr_t dt_dma; + spinlock_t iommus_lock; + spinlock_t dt_lock; + struct iommu_domain domain; +}; + +struct rk_iommu_ops { + phys_addr_t (*pt_address)(u32); + u32 (*mk_dtentries)(dma_addr_t); + u32 (*mk_ptentries)(phys_addr_t, int); + phys_addr_t (*dte_addr_phys)(u32); + u32 (*dma_addr_dte)(dma_addr_t); + u64 dma_bit_mask; +}; + +struct rk_iommu { + struct device *dev; + void **bases; + int num_mmu; + int num_irq; + struct clk_bulk_data *clocks; + int num_clocks; + bool reset_disabled; + struct iommu_device iommu; + struct list_head node; + struct iommu_domain *domain; + struct iommu_group *group; +}; + +struct rk_iommudata { + struct device_link *link; + struct rk_iommu *iommu; +}; + +struct sun50i_iommu { + struct iommu_device iommu; + spinlock_t iommu_lock; + struct device *dev; + void *base; + struct reset_control *reset; + struct clk *clk; + struct iommu_domain *domain; + struct iommu_group *group; + struct kmem_cache *pt_pool; +}; + +struct sun50i_iommu_domain { + struct iommu_domain domain; + refcount_t refcnt; + u32 *dt; + dma_addr_t dt_dma; + struct sun50i_iommu *iommu; +}; + +enum sun50i_iommu_aci { + SUN50I_IOMMU_ACI_DO_NOT_USE = 0, + SUN50I_IOMMU_ACI_NONE = 1, + SUN50I_IOMMU_ACI_RD = 2, + SUN50I_IOMMU_ACI_WR = 3, + SUN50I_IOMMU_ACI_RD_WR = 4, +}; + +struct tegra_smmu { + void *regs; + struct device *dev; + struct tegra_mc *mc; + const struct tegra_smmu_soc *soc; + struct list_head groups; + long unsigned int pfn_mask; + long unsigned int tlb_mask; + long unsigned int *asids; + struct mutex lock; + struct list_head list; + struct dentry *debugfs; + struct iommu_device iommu; +}; + +struct tegra_smmu_group { + struct list_head list; + struct tegra_smmu *smmu; + const struct tegra_smmu_group_soc *soc; + struct iommu_group *group; + unsigned int swgroup; +}; + +struct tegra_smmu_as { + struct iommu_domain domain; + struct tegra_smmu *smmu; + unsigned int use_count; + spinlock_t lock; + u32 *count; + struct page **pts; + struct page *pd; + dma_addr_t pd_dma; + unsigned int id; + u32 attr; +}; + +struct virtio_iommu_range_64 { + __le64 start; + __le64 end; +}; + +struct virtio_iommu_range_32 { + __le32 start; + __le32 end; +}; + +struct virtio_iommu_config { + __le64 page_size_mask; + struct virtio_iommu_range_64 input_range; + struct virtio_iommu_range_32 domain_range; + __le32 probe_size; +}; + +struct virtio_iommu_req_head { + __u8 type; + __u8 reserved[3]; +}; + +struct virtio_iommu_req_tail { + __u8 status; + __u8 reserved[3]; +}; + +struct virtio_iommu_req_attach { + struct virtio_iommu_req_head head; + __le32 domain; + __le32 endpoint; + __u8 reserved[8]; + struct virtio_iommu_req_tail tail; +}; + +struct virtio_iommu_req_map { + struct virtio_iommu_req_head head; + __le32 domain; + __le64 virt_start; + __le64 virt_end; + __le64 phys_start; + __le32 flags; + struct virtio_iommu_req_tail tail; +}; + +struct virtio_iommu_req_unmap { + struct virtio_iommu_req_head head; + __le32 domain; + __le64 virt_start; + __le64 virt_end; + __u8 reserved[4]; + struct virtio_iommu_req_tail tail; +}; + +struct virtio_iommu_probe_property { + __le16 type; + __le16 length; +}; + +struct virtio_iommu_probe_resv_mem { + struct virtio_iommu_probe_property head; + __u8 subtype; + __u8 reserved[3]; + __le64 start; + __le64 end; +}; + +struct virtio_iommu_req_probe { + struct virtio_iommu_req_head head; + __le32 endpoint; + __u8 reserved[64]; + __u8 properties[0]; +}; + +struct virtio_iommu_fault { + __u8 reason; + __u8 reserved[3]; + __le32 flags; + __le32 endpoint; + __u8 reserved2[4]; + __le64 address; +}; + +struct viommu_dev { + struct iommu_device iommu; + struct device *dev; + struct virtio_device *vdev; + struct ida domain_ids; + struct virtqueue *vqs[2]; + spinlock_t request_lock; + struct list_head requests; + void *evts; + struct iommu_domain_geometry geometry; + u64 pgsize_bitmap; + u32 first_domain; + u32 last_domain; + u32 map_flags; + u32 probe_size; +}; + +struct viommu_mapping { + phys_addr_t paddr; + struct interval_tree_node iova; + u32 flags; +}; + +struct viommu_domain { + struct iommu_domain domain; + struct viommu_dev *viommu; + struct mutex mutex; + unsigned int id; + u32 map_flags; + spinlock_t mappings_lock; + struct rb_root_cached mappings; + long unsigned int nr_endpoints; +}; + +struct viommu_endpoint { + struct device *dev; + struct viommu_dev *viommu; + struct viommu_domain *vdomain; + struct list_head resv_regions; +}; + +struct viommu_request { + struct list_head list; + void *writeback; + unsigned int write_offset; + unsigned int len; + char buf[0]; +}; + +struct viommu_event { + union { + u32 head; + struct virtio_iommu_fault fault; + }; +}; + +struct iopf_queue___2; + +struct iopf_device_param { + struct device *dev; + struct iopf_queue___2 *queue; + struct list_head queue_list; + struct list_head partial; +}; + +struct iopf_queue___2 { + struct workqueue_struct *wq; + struct list_head devices; + struct mutex lock; +}; + +struct iopf_fault { + struct iommu_fault fault; + struct list_head list; +}; + +struct iopf_group { + struct iopf_fault last_fault; + struct list_head faults; + struct work_struct work; + struct device *dev; +}; + +struct mipi_dsi_msg { + u8 channel; + u8 type; + u16 flags; + size_t tx_len; + const void *tx_buf; + size_t rx_len; + void *rx_buf; +}; + +struct mipi_dsi_packet { + size_t size; + u8 header[4]; + size_t payload_length; + const u8 *payload; +}; + +struct mipi_dsi_host; + +struct mipi_dsi_device; + +struct mipi_dsi_host_ops { + int (*attach)(struct mipi_dsi_host *, struct mipi_dsi_device *); + int (*detach)(struct mipi_dsi_host *, struct mipi_dsi_device *); + ssize_t (*transfer)(struct mipi_dsi_host *, const struct mipi_dsi_msg *); +}; + +struct mipi_dsi_host { + struct device *dev; + const struct mipi_dsi_host_ops *ops; + struct list_head list; +}; + +enum mipi_dsi_pixel_format { + MIPI_DSI_FMT_RGB888 = 0, + MIPI_DSI_FMT_RGB666 = 1, + MIPI_DSI_FMT_RGB666_PACKED = 2, + MIPI_DSI_FMT_RGB565 = 3, +}; + +struct mipi_dsi_device { + struct mipi_dsi_host *host; + struct device dev; + char name[20]; + unsigned int channel; + unsigned int lanes; + enum mipi_dsi_pixel_format format; + long unsigned int mode_flags; + long unsigned int hs_rate; + long unsigned int lp_rate; +}; + +struct mipi_dsi_device_info { + char type[20]; + u32 channel; + struct device_node *node; +}; + +enum mipi_dsi_dcs_tear_mode { + MIPI_DSI_DCS_TEAR_MODE_VBLANK = 0, + MIPI_DSI_DCS_TEAR_MODE_VHBLANK = 1, +}; + +struct mipi_dsi_driver { + struct device_driver driver; + int (*probe)(struct mipi_dsi_device *); + int (*remove)(struct mipi_dsi_device *); + void (*shutdown)(struct mipi_dsi_device *); +}; + +struct drm_dsc_picture_parameter_set { + u8 dsc_version; + u8 pps_identifier; + u8 pps_reserved; + u8 pps_3; + u8 pps_4; + u8 bits_per_pixel_low; + __be16 pic_height; + __be16 pic_width; + __be16 slice_height; + __be16 slice_width; + __be16 chunk_size; + u8 initial_xmit_delay_high; + u8 initial_xmit_delay_low; + __be16 initial_dec_delay; + u8 pps20_reserved; + u8 initial_scale_value; + __be16 scale_increment_interval; + u8 scale_decrement_interval_high; + u8 scale_decrement_interval_low; + u8 pps26_reserved; + u8 first_line_bpg_offset; + __be16 nfl_bpg_offset; + __be16 slice_bpg_offset; + __be16 initial_offset; + __be16 final_offset; + u8 flatness_min_qp; + u8 flatness_max_qp; + __be16 rc_model_size; + u8 rc_edge_factor; + u8 rc_quant_incr_limit0; + u8 rc_quant_incr_limit1; + u8 rc_tgt_offset; + u8 rc_buf_thresh[14]; + __be16 rc_range_parameters[15]; + u8 native_422_420; + u8 second_line_bpg_offset; + __be16 nsl_bpg_offset; + __be16 second_line_offset_adj; + u32 pps_long_94_reserved; + u32 pps_long_98_reserved; + u32 pps_long_102_reserved; + u32 pps_long_106_reserved; + u32 pps_long_110_reserved; + u32 pps_long_114_reserved; + u32 pps_long_118_reserved; + u32 pps_long_122_reserved; + __be16 pps_short_126_reserved; +} __attribute__((packed)); + +enum { + MIPI_DSI_V_SYNC_START = 1, + MIPI_DSI_V_SYNC_END = 17, + MIPI_DSI_H_SYNC_START = 33, + MIPI_DSI_H_SYNC_END = 49, + MIPI_DSI_COMPRESSION_MODE = 7, + MIPI_DSI_END_OF_TRANSMISSION = 8, + MIPI_DSI_COLOR_MODE_OFF = 2, + MIPI_DSI_COLOR_MODE_ON = 18, + MIPI_DSI_SHUTDOWN_PERIPHERAL = 34, + MIPI_DSI_TURN_ON_PERIPHERAL = 50, + MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM = 3, + MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM = 19, + MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM = 35, + MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM = 4, + MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM = 20, + MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM = 36, + MIPI_DSI_DCS_SHORT_WRITE = 5, + MIPI_DSI_DCS_SHORT_WRITE_PARAM = 21, + MIPI_DSI_DCS_READ = 6, + MIPI_DSI_EXECUTE_QUEUE = 22, + MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE = 55, + MIPI_DSI_NULL_PACKET = 9, + MIPI_DSI_BLANKING_PACKET = 25, + MIPI_DSI_GENERIC_LONG_WRITE = 41, + MIPI_DSI_DCS_LONG_WRITE = 57, + MIPI_DSI_PICTURE_PARAMETER_SET = 10, + MIPI_DSI_COMPRESSED_PIXEL_STREAM = 11, + MIPI_DSI_LOOSELY_PACKED_PIXEL_STREAM_YCBCR20 = 12, + MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR24 = 28, + MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16 = 44, + MIPI_DSI_PACKED_PIXEL_STREAM_30 = 13, + MIPI_DSI_PACKED_PIXEL_STREAM_36 = 29, + MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12 = 61, + MIPI_DSI_PACKED_PIXEL_STREAM_16 = 14, + MIPI_DSI_PACKED_PIXEL_STREAM_18 = 30, + MIPI_DSI_PIXEL_STREAM_3BYTE_18 = 46, + MIPI_DSI_PACKED_PIXEL_STREAM_24 = 62, +}; + +enum { + MIPI_DCS_NOP = 0, + MIPI_DCS_SOFT_RESET = 1, + MIPI_DCS_GET_COMPRESSION_MODE = 3, + MIPI_DCS_GET_DISPLAY_ID = 4, + MIPI_DCS_GET_ERROR_COUNT_ON_DSI = 5, + MIPI_DCS_GET_RED_CHANNEL = 6, + MIPI_DCS_GET_GREEN_CHANNEL = 7, + MIPI_DCS_GET_BLUE_CHANNEL = 8, + MIPI_DCS_GET_DISPLAY_STATUS = 9, + MIPI_DCS_GET_POWER_MODE = 10, + MIPI_DCS_GET_ADDRESS_MODE = 11, + MIPI_DCS_GET_PIXEL_FORMAT = 12, + MIPI_DCS_GET_DISPLAY_MODE = 13, + MIPI_DCS_GET_SIGNAL_MODE = 14, + MIPI_DCS_GET_DIAGNOSTIC_RESULT = 15, + MIPI_DCS_ENTER_SLEEP_MODE = 16, + MIPI_DCS_EXIT_SLEEP_MODE = 17, + MIPI_DCS_ENTER_PARTIAL_MODE = 18, + MIPI_DCS_ENTER_NORMAL_MODE = 19, + MIPI_DCS_GET_IMAGE_CHECKSUM_RGB = 20, + MIPI_DCS_GET_IMAGE_CHECKSUM_CT = 21, + MIPI_DCS_EXIT_INVERT_MODE = 32, + MIPI_DCS_ENTER_INVERT_MODE = 33, + MIPI_DCS_SET_GAMMA_CURVE = 38, + MIPI_DCS_SET_DISPLAY_OFF = 40, + MIPI_DCS_SET_DISPLAY_ON = 41, + MIPI_DCS_SET_COLUMN_ADDRESS = 42, + MIPI_DCS_SET_PAGE_ADDRESS = 43, + MIPI_DCS_WRITE_MEMORY_START = 44, + MIPI_DCS_WRITE_LUT = 45, + MIPI_DCS_READ_MEMORY_START = 46, + MIPI_DCS_SET_PARTIAL_ROWS = 48, + MIPI_DCS_SET_PARTIAL_COLUMNS = 49, + MIPI_DCS_SET_SCROLL_AREA = 51, + MIPI_DCS_SET_TEAR_OFF = 52, + MIPI_DCS_SET_TEAR_ON = 53, + MIPI_DCS_SET_ADDRESS_MODE = 54, + MIPI_DCS_SET_SCROLL_START = 55, + MIPI_DCS_EXIT_IDLE_MODE = 56, + MIPI_DCS_ENTER_IDLE_MODE = 57, + MIPI_DCS_SET_PIXEL_FORMAT = 58, + MIPI_DCS_WRITE_MEMORY_CONTINUE = 60, + MIPI_DCS_SET_3D_CONTROL = 61, + MIPI_DCS_READ_MEMORY_CONTINUE = 62, + MIPI_DCS_GET_3D_CONTROL = 63, + MIPI_DCS_SET_VSYNC_TIMING = 64, + MIPI_DCS_SET_TEAR_SCANLINE = 68, + MIPI_DCS_GET_SCANLINE = 69, + MIPI_DCS_SET_DISPLAY_BRIGHTNESS = 81, + MIPI_DCS_GET_DISPLAY_BRIGHTNESS = 82, + MIPI_DCS_WRITE_CONTROL_DISPLAY = 83, + MIPI_DCS_GET_CONTROL_DISPLAY = 84, + MIPI_DCS_WRITE_POWER_SAVE = 85, + MIPI_DCS_GET_POWER_SAVE = 86, + MIPI_DCS_SET_CABC_MIN_BRIGHTNESS = 94, + MIPI_DCS_GET_CABC_MIN_BRIGHTNESS = 95, + MIPI_DCS_READ_DDB_START = 161, + MIPI_DCS_READ_PPS_START = 162, + MIPI_DCS_READ_DDB_CONTINUE = 168, + MIPI_DCS_READ_PPS_CONTINUE = 169, +}; + +struct drm_dmi_panel_orientation_data { + int width; + int height; + const char * const *bios_dates; + int orientation; +}; + +struct vga_device { + struct list_head list; + struct pci_dev *pdev; + unsigned int decodes; + unsigned int owns; + unsigned int locks; + unsigned int io_lock_cnt; + unsigned int mem_lock_cnt; + unsigned int io_norm_cnt; + unsigned int mem_norm_cnt; + bool bridge_has_one_vga; + unsigned int (*set_decode)(struct pci_dev *, bool); +}; + +struct vga_arb_user_card { + struct pci_dev *pdev; + unsigned int mem_cnt; + unsigned int io_cnt; +}; + +struct vga_arb_private { + struct list_head list; + struct pci_dev *target; + struct vga_arb_user_card cards[16]; + spinlock_t lock; +}; + +struct cb_id { + __u32 idx; + __u32 val; +}; + +struct cn_msg { + struct cb_id id; + __u32 seq; + __u32 ack; + __u16 len; + __u16 flags; + __u8 data[0]; +}; + +struct cn_queue_dev { + atomic_t refcnt; + unsigned char name[32]; + struct list_head queue_list; + spinlock_t queue_lock; + struct sock *nls; +}; + +struct cn_callback_id { + unsigned char name[32]; + struct cb_id id; +}; + +struct cn_callback_entry { + struct list_head callback_entry; + refcount_t refcnt; + struct cn_queue_dev *pdev; + struct cn_callback_id id; + void (*callback)(struct cn_msg *, struct netlink_skb_parms *); + u32 seq; + u32 group; +}; + +struct cn_dev { + struct cb_id id; + u32 seq; + u32 groups; + struct sock *nls; + struct cn_queue_dev *cbdev; +}; + +enum proc_cn_mcast_op { + PROC_CN_MCAST_LISTEN = 1, + PROC_CN_MCAST_IGNORE = 2, +}; + +struct fork_proc_event { + __kernel_pid_t parent_pid; + __kernel_pid_t parent_tgid; + __kernel_pid_t child_pid; + __kernel_pid_t child_tgid; +}; + +struct exec_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; +}; + +struct id_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + union { + __u32 ruid; + __u32 rgid; + } r; + union { + __u32 euid; + __u32 egid; + } e; +}; + +struct sid_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; +}; + +struct ptrace_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + __kernel_pid_t tracer_pid; + __kernel_pid_t tracer_tgid; +}; + +struct comm_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + char comm[16]; +}; + +struct coredump_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + __kernel_pid_t parent_pid; + __kernel_pid_t parent_tgid; +}; + +struct exit_proc_event { + __kernel_pid_t process_pid; + __kernel_pid_t process_tgid; + __u32 exit_code; + __u32 exit_signal; + __kernel_pid_t parent_pid; + __kernel_pid_t parent_tgid; +}; + +struct proc_event { + enum what what; + __u32 cpu; + __u64 timestamp_ns; + union { + struct { + __u32 err; + } ack; + struct fork_proc_event fork; + struct exec_proc_event exec; + struct id_proc_event id; + struct sid_proc_event sid; + struct ptrace_proc_event ptrace; + struct comm_proc_event comm; + struct coredump_proc_event coredump; + struct exit_proc_event exit; + } event_data; +}; + +struct local_event { + local_lock_t lock; + __u32 count; +}; + +struct component_ops { + int (*bind)(struct device *, struct device *, void *); + void (*unbind)(struct device *, struct device *, void *); +}; + +struct component_master_ops { + int (*bind)(struct device *); + void (*unbind)(struct device *); +}; + +struct component; + +struct component_match_array { + void *data; + int (*compare)(struct device *, void *); + int (*compare_typed)(struct device *, int, void *); + void (*release)(struct device *, void *); + struct component *component; + bool duplicate; +}; + +struct master; + +struct component { + struct list_head node; + struct master *master; + bool bound; + const struct component_ops *ops; + int subcomponent; + struct device *dev; +}; + +struct component_match { + size_t alloc; + size_t num; + struct component_match_array *compare; +}; + +struct master { + struct list_head node; + bool bound; + const struct component_master_ops *ops; + struct device *parent; + struct component_match *match; +}; + +struct fwnode_link { + struct fwnode_handle *supplier; + struct list_head s_hook; + struct fwnode_handle *consumer; + struct list_head c_hook; +}; + +struct wake_irq { + struct device *dev; + unsigned int status; + int irq; + const char *name; +}; + +enum dpm_order { + DPM_ORDER_NONE = 0, + DPM_ORDER_DEV_AFTER_PARENT = 1, + DPM_ORDER_PARENT_BEFORE_DEV = 2, + DPM_ORDER_DEV_LAST = 3, +}; + +struct subsys_private { + struct kset subsys; + struct kset *devices_kset; + struct list_head interfaces; + struct mutex mutex; + struct kset *drivers_kset; + struct klist klist_devices; + struct klist klist_drivers; + struct blocking_notifier_head bus_notifier; + unsigned int drivers_autoprobe: 1; + struct bus_type *bus; + struct kset glue_dirs; + struct class *class; +}; + +struct driver_private { + struct kobject kobj; + struct klist klist_devices; + struct klist_node knode_bus; + struct module_kobject *mkobj; + struct device_driver *driver; +}; + +struct device_private { + struct klist klist_children; + struct klist_node knode_parent; + struct klist_node knode_driver; + struct klist_node knode_bus; + struct klist_node knode_class; + struct list_head deferred_probe; + struct device_driver *async_driver; + char *deferred_probe_reason; + struct device *device; + u8 dead: 1; +}; + +union device_attr_group_devres { + const struct attribute_group *group; + const struct attribute_group **groups; +}; + +struct class_dir { + struct kobject kobj; + struct class *class; +}; + +struct root_device { + struct device dev; + struct module *owner; +}; + +struct subsys_dev_iter { + struct klist_iter ki; + const struct device_type *type; +}; + +struct subsys_interface { + const char *name; + struct bus_type *subsys; + struct list_head node; + int (*add_dev)(struct device *, struct subsys_interface *); + void (*remove_dev)(struct device *, struct subsys_interface *); +}; + +struct device_attach_data { + struct device *dev; + bool check_async; + bool want_async; + bool have_async; +}; + +struct class_attribute_string { + struct class_attribute attr; + char *str; +}; + +struct class_compat { + struct kobject *kobj; +}; + +struct irq_affinity_devres { + unsigned int count; + unsigned int irq[0]; +}; + +struct platform_object { + struct platform_device pdev; + char name[0]; +}; + +struct cpu_attr { + struct device_attribute attr; + const struct cpumask * const map; +}; + +struct probe { + struct probe *next; + dev_t dev; + long unsigned int range; + struct module *owner; + kobj_probe_t *get; + int (*lock)(dev_t, void *); + void *data; +}; + +struct kobj_map___2 { + struct probe *probes[255]; + struct mutex *lock; +}; + +struct devres_node { + struct list_head entry; + dr_release_t release; + const char *name; + size_t size; +}; + +struct devres___2 { + struct devres_node node; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u8 data[0]; +}; + +struct devres_group { + struct devres_node node[2]; + void *id; + int color; +}; + +struct action_devres { + void *data; + void (*action)(void *); +}; + +struct pages_devres { + long unsigned int addr; + unsigned int order; +}; + +struct attribute_container { + struct list_head node; + struct klist containers; + struct class *class; + const struct attribute_group *grp; + struct device_attribute **attrs; + int (*match)(struct attribute_container *, struct device *); + long unsigned int flags; +}; + +struct internal_container { + struct klist_node node; + struct attribute_container *cont; + struct device classdev; +}; + +struct transport_container; + +struct transport_class { + struct class class; + int (*setup)(struct transport_container *, struct device *, struct device *); + int (*configure)(struct transport_container *, struct device *, struct device *); + int (*remove)(struct transport_container *, struct device *, struct device *); +}; + +struct transport_container { + struct attribute_container ac; + const struct attribute_group *statistics; +}; + +struct anon_transport_class { + struct transport_class tclass; + struct attribute_container container; +}; + +typedef void * (*devcon_match_fn_t)(struct fwnode_handle *, const char *, void *); + +typedef enum { + PHY_INTERFACE_MODE_NA = 0, + PHY_INTERFACE_MODE_INTERNAL = 1, + PHY_INTERFACE_MODE_MII = 2, + PHY_INTERFACE_MODE_GMII = 3, + PHY_INTERFACE_MODE_SGMII = 4, + PHY_INTERFACE_MODE_TBI = 5, + PHY_INTERFACE_MODE_REVMII = 6, + PHY_INTERFACE_MODE_RMII = 7, + PHY_INTERFACE_MODE_REVRMII = 8, + PHY_INTERFACE_MODE_RGMII = 9, + PHY_INTERFACE_MODE_RGMII_ID = 10, + PHY_INTERFACE_MODE_RGMII_RXID = 11, + PHY_INTERFACE_MODE_RGMII_TXID = 12, + PHY_INTERFACE_MODE_RTBI = 13, + PHY_INTERFACE_MODE_SMII = 14, + PHY_INTERFACE_MODE_XGMII = 15, + PHY_INTERFACE_MODE_XLGMII = 16, + PHY_INTERFACE_MODE_MOCA = 17, + PHY_INTERFACE_MODE_QSGMII = 18, + PHY_INTERFACE_MODE_TRGMII = 19, + PHY_INTERFACE_MODE_100BASEX = 20, + PHY_INTERFACE_MODE_1000BASEX = 21, + PHY_INTERFACE_MODE_2500BASEX = 22, + PHY_INTERFACE_MODE_5GBASER = 23, + PHY_INTERFACE_MODE_RXAUI = 24, + PHY_INTERFACE_MODE_XAUI = 25, + PHY_INTERFACE_MODE_10GBASER = 26, + PHY_INTERFACE_MODE_25GBASER = 27, + PHY_INTERFACE_MODE_USXGMII = 28, + PHY_INTERFACE_MODE_10GKR = 29, + PHY_INTERFACE_MODE_MAX = 30, +} phy_interface_t; + +struct cache_type_info { + const char *size_prop; + const char *line_size_props[2]; + const char *nr_sets_prop; +}; + +struct software_node_ref_args { + const struct software_node *node; + unsigned int nargs; + u64 args[8]; +}; + +struct swnode { + struct kobject kobj; + struct fwnode_handle fwnode; + const struct software_node *node; + int id; + struct ida child_ids; + struct list_head entry; + struct list_head children; + struct swnode *parent; + unsigned int allocated: 1; + unsigned int managed: 1; +}; + +struct auxiliary_device_id { + char name[32]; + kernel_ulong_t driver_data; +}; + +struct auxiliary_device { + struct device dev; + const char *name; + u32 id; +}; + +struct auxiliary_driver { + int (*probe)(struct auxiliary_device *, const struct auxiliary_device_id *); + void (*remove)(struct auxiliary_device *); + void (*shutdown)(struct auxiliary_device *); + int (*suspend)(struct auxiliary_device *, pm_message_t); + int (*resume)(struct auxiliary_device *); + const char *name; + struct device_driver driver; + const struct auxiliary_device_id *id_table; +}; + +struct req { + struct req *next; + struct completion done; + int err; + const char *name; + umode_t mode; + kuid_t uid; + kgid_t gid; + struct device *dev; +}; + +typedef int (*pm_callback_t)(struct device *); + +struct gpd_link { + struct generic_pm_domain *parent; + struct list_head parent_node; + struct generic_pm_domain *child; + struct list_head child_node; + unsigned int performance_state; + unsigned int prev_performance_state; +}; + +struct gpd_timing_data { + s64 suspend_latency_ns; + s64 resume_latency_ns; + s64 effective_constraint_ns; + bool constraint_changed; + bool cached_suspend_ok; +}; + +struct generic_pm_domain_data { + struct pm_domain_data base; + struct gpd_timing_data td; + struct notifier_block nb; + struct notifier_block *power_nb; + int cpu; + unsigned int performance_state; + unsigned int default_pstate; + unsigned int rpm_pstate; + ktime_t next_wakeup; + void *data; +}; + +struct of_genpd_provider { + struct list_head link; + struct device_node *node; + genpd_xlate_t xlate; + void *data; +}; + +struct pm_clk_notifier_block { + struct notifier_block nb; + struct dev_pm_domain *pm_domain; + char *con_ids[0]; +}; + +enum pce_status { + PCE_STATUS_NONE = 0, + PCE_STATUS_ACQUIRED = 1, + PCE_STATUS_PREPARED = 2, + PCE_STATUS_ENABLED = 3, + PCE_STATUS_ERROR = 4, +}; + +struct pm_clock_entry { + struct list_head node; + char *con_id; + struct clk *clk; + enum pce_status status; + bool enabled_when_prepared; +}; + +struct firmware_fallback_config { + unsigned int force_sysfs_fallback; + unsigned int ignore_sysfs_fallback; + int old_timeout; + int loading_timeout; +}; + +enum fw_opt { + FW_OPT_UEVENT = 1, + FW_OPT_NOWAIT = 2, + FW_OPT_USERHELPER = 4, + FW_OPT_NO_WARN = 8, + FW_OPT_NOCACHE = 16, + FW_OPT_NOFALLBACK_SYSFS = 32, + FW_OPT_FALLBACK_PLATFORM = 64, + FW_OPT_PARTIAL = 128, +}; + +enum fw_status { + FW_STATUS_UNKNOWN = 0, + FW_STATUS_LOADING = 1, + FW_STATUS_DONE = 2, + FW_STATUS_ABORTED = 3, +}; + +struct fw_state { + struct completion completion; + enum fw_status status; +}; + +struct firmware_cache; + +struct fw_priv { + struct kref ref; + struct list_head list; + struct firmware_cache *fwc; + struct fw_state fw_st; + void *data; + size_t size; + size_t allocated_size; + size_t offset; + u32 opt_flags; + bool is_paged_buf; + struct page **pages; + int nr_pages; + int page_array_size; + bool need_uevent; + struct list_head pending_list; + const char *fw_name; +}; + +struct firmware_cache { + spinlock_t lock; + struct list_head head; + int state; + spinlock_t name_lock; + struct list_head fw_names; + struct delayed_work work; + struct notifier_block pm_notify; +}; + +struct fw_cache_entry { + struct list_head list; + const char *name; +}; + +struct fw_name_devm { + long unsigned int magic; + const char *name; +}; + +struct firmware_work { + struct work_struct work; + struct module *module; + const char *name; + struct device *device; + void *context; + void (*cont)(const struct firmware *, void *); + u32 opt_flags; +}; + +struct fw_sysfs { + bool nowait; + struct device dev; + struct fw_priv *fw_priv; + struct firmware *fw; +}; + +struct builtin_fw { + char *name; + void *data; + long unsigned int size; +}; + +struct node_access_nodes { + struct device dev; + struct list_head list_node; + unsigned int access; + struct node_hmem_attrs hmem_attrs; +}; + +struct node_cache_info { + struct device dev; + struct list_head node; + struct node_cache_attrs cache_attrs; +}; + +struct node_attr { + struct device_attribute attr; + enum node_states state; +}; + +struct for_each_memory_block_cb_data { + walk_memory_blocks_func_t func; + void *arg; +}; + +struct regmap___2; + +struct regmap_async { + struct list_head list; + struct regmap___2 *map; + void *work_buf; +}; + +struct reg_field { + unsigned int reg; + unsigned int lsb; + unsigned int msb; + unsigned int id_size; + unsigned int id_offset; +}; + +struct regmap_format { + size_t buf_size; + size_t reg_bytes; + size_t pad_bytes; + size_t val_bytes; + void (*format_write)(struct regmap___2 *, unsigned int, unsigned int); + void (*format_reg)(void *, unsigned int, unsigned int); + void (*format_val)(void *, unsigned int, unsigned int); + unsigned int (*parse_val)(const void *); + void (*parse_inplace)(void *); +}; + +struct hwspinlock; + +struct regcache_ops; + +struct regmap___2 { + union { + struct mutex mutex; + struct { + spinlock_t spinlock; + long unsigned int spinlock_flags; + }; + struct { + raw_spinlock_t raw_spinlock; + long unsigned int raw_spinlock_flags; + }; + }; + regmap_lock lock; + regmap_unlock unlock; + void *lock_arg; + gfp_t alloc_flags; + struct device *dev; + void *work_buf; + struct regmap_format format; + const struct regmap_bus *bus; + void *bus_context; + const char *name; + bool async; + spinlock_t async_lock; + wait_queue_head_t async_waitq; + struct list_head async_list; + struct list_head async_free; + int async_ret; + bool debugfs_disable; + struct dentry *debugfs; + const char *debugfs_name; + unsigned int debugfs_reg_len; + unsigned int debugfs_val_len; + unsigned int debugfs_tot_len; + struct list_head debugfs_off_cache; + struct mutex cache_lock; + unsigned int max_register; + bool (*writeable_reg)(struct device *, unsigned int); + bool (*readable_reg)(struct device *, unsigned int); + bool (*volatile_reg)(struct device *, unsigned int); + bool (*precious_reg)(struct device *, unsigned int); + bool (*writeable_noinc_reg)(struct device *, unsigned int); + bool (*readable_noinc_reg)(struct device *, unsigned int); + const struct regmap_access_table *wr_table; + const struct regmap_access_table *rd_table; + const struct regmap_access_table *volatile_table; + const struct regmap_access_table *precious_table; + const struct regmap_access_table *wr_noinc_table; + const struct regmap_access_table *rd_noinc_table; + int (*reg_read)(void *, unsigned int, unsigned int *); + int (*reg_write)(void *, unsigned int, unsigned int); + int (*reg_update_bits)(void *, unsigned int, unsigned int, unsigned int); + bool defer_caching; + long unsigned int read_flag_mask; + long unsigned int write_flag_mask; + int reg_shift; + int reg_stride; + int reg_stride_order; + const struct regcache_ops *cache_ops; + enum regcache_type cache_type; + unsigned int cache_size_raw; + unsigned int cache_word_size; + unsigned int num_reg_defaults; + unsigned int num_reg_defaults_raw; + bool cache_only; + bool cache_bypass; + bool cache_free; + struct reg_default *reg_defaults; + const void *reg_defaults_raw; + void *cache; + bool cache_dirty; + bool no_sync_defaults; + struct reg_sequence *patch; + int patch_regs; + bool use_single_read; + bool use_single_write; + bool can_multi_write; + size_t max_raw_read; + size_t max_raw_write; + struct rb_root range_tree; + void *selector_work_buf; + struct hwspinlock *hwlock; + bool can_sleep; +}; + +struct regcache_ops { + const char *name; + enum regcache_type type; + int (*init)(struct regmap___2 *); + int (*exit)(struct regmap___2 *); + void (*debugfs_init)(struct regmap___2 *); + int (*read)(struct regmap___2 *, unsigned int, unsigned int *); + int (*write)(struct regmap___2 *, unsigned int, unsigned int); + int (*sync)(struct regmap___2 *, unsigned int, unsigned int); + int (*drop)(struct regmap___2 *, unsigned int, unsigned int); +}; + +struct regmap_range_node { + struct rb_node node; + const char *name; + struct regmap___2 *map; + unsigned int range_min; + unsigned int range_max; + unsigned int selector_reg; + unsigned int selector_mask; + int selector_shift; + unsigned int window_start; + unsigned int window_len; +}; + +struct regmap_field { + struct regmap___2 *regmap; + unsigned int mask; + unsigned int shift; + unsigned int reg; + unsigned int id_size; + unsigned int id_offset; +}; + +struct trace_event_raw_regmap_reg { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int reg; + unsigned int val; + char __data[0]; +}; + +struct trace_event_raw_regmap_block { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int reg; + int count; + char __data[0]; +}; + +struct trace_event_raw_regcache_sync { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_status; + u32 __data_loc_type; + char __data[0]; +}; + +struct trace_event_raw_regmap_bool { + struct trace_entry ent; + u32 __data_loc_name; + int flag; + char __data[0]; +}; + +struct trace_event_raw_regmap_async { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_regcache_drop_region { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int from; + unsigned int to; + char __data[0]; +}; + +struct trace_event_data_offsets_regmap_reg { + u32 name; +}; + +struct trace_event_data_offsets_regmap_block { + u32 name; +}; + +struct trace_event_data_offsets_regcache_sync { + u32 name; + u32 status; + u32 type; +}; + +struct trace_event_data_offsets_regmap_bool { + u32 name; +}; + +struct trace_event_data_offsets_regmap_async { + u32 name; +}; + +struct trace_event_data_offsets_regcache_drop_region { + u32 name; +}; + +typedef void (*btf_trace_regmap_reg_write)(void *, struct regmap___2 *, unsigned int, unsigned int); + +typedef void (*btf_trace_regmap_reg_read)(void *, struct regmap___2 *, unsigned int, unsigned int); + +typedef void (*btf_trace_regmap_reg_read_cache)(void *, struct regmap___2 *, unsigned int, unsigned int); + +typedef void (*btf_trace_regmap_hw_read_start)(void *, struct regmap___2 *, unsigned int, int); + +typedef void (*btf_trace_regmap_hw_read_done)(void *, struct regmap___2 *, unsigned int, int); + +typedef void (*btf_trace_regmap_hw_write_start)(void *, struct regmap___2 *, unsigned int, int); + +typedef void (*btf_trace_regmap_hw_write_done)(void *, struct regmap___2 *, unsigned int, int); + +typedef void (*btf_trace_regcache_sync)(void *, struct regmap___2 *, const char *, const char *); + +typedef void (*btf_trace_regmap_cache_only)(void *, struct regmap___2 *, bool); + +typedef void (*btf_trace_regmap_cache_bypass)(void *, struct regmap___2 *, bool); + +typedef void (*btf_trace_regmap_async_write_start)(void *, struct regmap___2 *, unsigned int, int); + +typedef void (*btf_trace_regmap_async_io_complete)(void *, struct regmap___2 *); + +typedef void (*btf_trace_regmap_async_complete_start)(void *, struct regmap___2 *); + +typedef void (*btf_trace_regmap_async_complete_done)(void *, struct regmap___2 *); + +typedef void (*btf_trace_regcache_drop_region)(void *, struct regmap___2 *, unsigned int, unsigned int); + +struct regcache_rbtree_node { + void *block; + long int *cache_present; + unsigned int base_reg; + unsigned int blklen; + struct rb_node node; +}; + +struct regcache_rbtree_ctx { + struct rb_root root; + struct regcache_rbtree_node *cached_rbnode; +}; + +struct regmap_debugfs_off_cache { + struct list_head list; + off_t min; + off_t max; + unsigned int base_reg; + unsigned int max_reg; +}; + +struct regmap_debugfs_node { + struct regmap___2 *map; + struct list_head link; +}; + +struct regmap_async_spi { + struct regmap_async core; + struct spi_message m; + struct spi_transfer t[2]; +}; + +struct regmap_mmio_context { + void *regs; + unsigned int val_bytes; + bool relaxed_mmio; + bool attached_clk; + struct clk *clk; + void (*reg_write)(struct regmap_mmio_context *, unsigned int, unsigned int); + unsigned int (*reg_read)(struct regmap_mmio_context *, unsigned int); +}; + +struct regmap_irq_type { + unsigned int type_reg_offset; + unsigned int type_reg_mask; + unsigned int type_rising_val; + unsigned int type_falling_val; + unsigned int type_level_low_val; + unsigned int type_level_high_val; + unsigned int types_supported; +}; + +struct regmap_irq { + unsigned int reg_offset; + unsigned int mask; + struct regmap_irq_type type; +}; + +struct regmap_irq_sub_irq_map { + unsigned int num_regs; + unsigned int *offset; +}; + +struct regmap_irq_chip { + const char *name; + unsigned int main_status; + unsigned int num_main_status_bits; + struct regmap_irq_sub_irq_map *sub_reg_offsets; + int num_main_regs; + unsigned int status_base; + unsigned int mask_base; + unsigned int unmask_base; + unsigned int ack_base; + unsigned int wake_base; + unsigned int type_base; + unsigned int *virt_reg_base; + unsigned int irq_reg_stride; + bool mask_writeonly: 1; + bool init_ack_masked: 1; + bool mask_invert: 1; + bool use_ack: 1; + bool ack_invert: 1; + bool clear_ack: 1; + bool wake_invert: 1; + bool runtime_pm: 1; + bool type_invert: 1; + bool type_in_mask: 1; + bool clear_on_unmask: 1; + bool not_fixed_stride: 1; + bool status_invert: 1; + int num_regs; + const struct regmap_irq *irqs; + int num_irqs; + int num_type_reg; + int num_virt_regs; + unsigned int type_reg_stride; + int (*handle_pre_irq)(void *); + int (*handle_post_irq)(void *); + int (*set_type_virt)(unsigned int **, unsigned int, long unsigned int, int); + void *irq_drv_data; +}; + +struct regmap_irq_chip_data___2 { + struct mutex lock; + struct irq_chip irq_chip; + struct regmap___2 *map; + const struct regmap_irq_chip *chip; + int irq_base; + struct irq_domain *domain; + int irq; + int wake_count; + void *status_reg_buf; + unsigned int *main_status_buf; + unsigned int *status_buf; + unsigned int *mask_buf; + unsigned int *mask_buf_def; + unsigned int *wake_buf; + unsigned int *type_buf; + unsigned int *type_buf_def; + unsigned int **virt_buf; + unsigned int irq_reg_stride; + unsigned int type_reg_stride; + bool clear_status: 1; +}; + +struct soc_device___2 { + struct device dev; + struct soc_device_attribute *attr; + int soc_dev_num; +}; + +struct devcd_entry { + struct device devcd_dev; + void *data; + size_t datalen; + struct module *owner; + ssize_t (*read)(char *, loff_t, size_t, void *, size_t); + void (*free)(void *); + struct delayed_work del_wk; + struct device *failing_dev; +}; + +struct platform_msi_priv_data { + struct device *dev; + void *host_data; + const struct attribute_group **msi_irq_groups; + msi_alloc_info_t arg; + irq_write_msi_msg_t write_msg; + int devid; +}; + +struct trace_event_raw_devres { + struct trace_entry ent; + u32 __data_loc_devname; + struct device *dev; + const char *op; + void *node; + const char *name; + size_t size; + char __data[0]; +}; + +struct trace_event_data_offsets_devres { + u32 devname; +}; + +typedef void (*btf_trace_devres_log)(void *, struct device *, const char *, void *, const char *, size_t); + +typedef unsigned int __kernel_old_dev_t; + +enum { + LO_FLAGS_READ_ONLY = 1, + LO_FLAGS_AUTOCLEAR = 4, + LO_FLAGS_PARTSCAN = 8, + LO_FLAGS_DIRECT_IO = 16, +}; + +struct loop_info { + int lo_number; + __kernel_old_dev_t lo_device; + long unsigned int lo_inode; + __kernel_old_dev_t lo_rdevice; + int lo_offset; + int lo_encrypt_type; + int lo_encrypt_key_size; + int lo_flags; + char lo_name[64]; + unsigned char lo_encrypt_key[32]; + long unsigned int lo_init[2]; + char reserved[4]; +}; + +struct loop_info64 { + __u64 lo_device; + __u64 lo_inode; + __u64 lo_rdevice; + __u64 lo_offset; + __u64 lo_sizelimit; + __u32 lo_number; + __u32 lo_encrypt_type; + __u32 lo_encrypt_key_size; + __u32 lo_flags; + __u8 lo_file_name[64]; + __u8 lo_crypt_name[64]; + __u8 lo_encrypt_key[32]; + __u64 lo_init[2]; +}; + +struct loop_config { + __u32 fd; + __u32 block_size; + struct loop_info64 info; + __u64 __reserved[8]; +}; + +enum { + Lo_unbound = 0, + Lo_bound = 1, + Lo_rundown = 2, + Lo_deleting = 3, +}; + +struct loop_device { + int lo_number; + atomic_t lo_refcnt; + loff_t lo_offset; + loff_t lo_sizelimit; + int lo_flags; + char lo_file_name[64]; + struct file *lo_backing_file; + struct block_device *lo_device; + gfp_t old_gfp_mask; + spinlock_t lo_lock; + int lo_state; + spinlock_t lo_work_lock; + struct workqueue_struct *workqueue; + struct work_struct rootcg_work; + struct list_head rootcg_cmd_list; + struct list_head idle_worker_list; + struct rb_root worker_tree; + struct timer_list timer; + bool use_dio; + bool sysfs_inited; + struct request_queue *lo_queue; + struct blk_mq_tag_set tag_set; + struct gendisk *lo_disk; + struct mutex lo_mutex; + bool idr_visible; +}; + +struct loop_cmd { + struct list_head list_entry; + bool use_aio; + atomic_t ref; + long int ret; + struct kiocb iocb; + struct bio_vec *bvec; + struct cgroup_subsys_state *blkcg_css; + struct cgroup_subsys_state *memcg_css; +}; + +struct loop_worker { + struct rb_node rb_node; + struct work_struct work; + struct list_head cmd_list; + struct list_head idle_list; + struct loop_device *lo; + struct cgroup_subsys_state *blkcg_css; + long unsigned int last_ran_at; +}; + +struct compat_loop_info { + compat_int_t lo_number; + compat_dev_t lo_device; + compat_ulong_t lo_inode; + compat_dev_t lo_rdevice; + compat_int_t lo_offset; + compat_int_t lo_encrypt_key_size; + compat_int_t lo_flags; + char lo_name[64]; + unsigned char lo_encrypt_key[32]; + compat_ulong_t lo_init[2]; + char reserved[4]; +}; + +struct cdrom_device_ops; + +struct cdrom_device_info { + const struct cdrom_device_ops *ops; + struct list_head list; + struct gendisk *disk; + void *handle; + int mask; + int speed; + int capacity; + unsigned int options: 30; + unsigned int mc_flags: 2; + unsigned int vfs_events; + unsigned int ioctl_events; + int use_count; + char name[20]; + __u8 sanyo_slot: 2; + __u8 keeplocked: 1; + __u8 reserved: 5; + int cdda_method; + __u8 last_sense; + __u8 media_written; + short unsigned int mmc3_profile; + int for_data; + int (*exit)(struct cdrom_device_info *); + int mrw_mode_page; + __s64 last_media_change_ms; +}; + +struct scsi_sense_hdr { + u8 response_code; + u8 sense_key; + u8 asc; + u8 ascq; + u8 byte4; + u8 byte5; + u8 byte6; + u8 additional_length; +}; + +struct cdrom_msf0 { + __u8 minute; + __u8 second; + __u8 frame; +}; + +union cdrom_addr { + struct cdrom_msf0 msf; + int lba; +}; + +struct cdrom_multisession { + union cdrom_addr addr; + __u8 xa_flag; + __u8 addr_format; +}; + +struct cdrom_mcn { + __u8 medium_catalog_number[14]; +}; + +struct packet_command { + unsigned char cmd[12]; + unsigned char *buffer; + unsigned int buflen; + int stat; + struct scsi_sense_hdr *sshdr; + unsigned char data_direction; + int quiet; + int timeout; + void *reserved[1]; +}; + +struct cdrom_device_ops { + int (*open)(struct cdrom_device_info *, int); + void (*release)(struct cdrom_device_info *); + int (*drive_status)(struct cdrom_device_info *, int); + unsigned int (*check_events)(struct cdrom_device_info *, unsigned int, int); + int (*tray_move)(struct cdrom_device_info *, int); + int (*lock_door)(struct cdrom_device_info *, int); + int (*select_speed)(struct cdrom_device_info *, int); + int (*select_disc)(struct cdrom_device_info *, int); + int (*get_last_session)(struct cdrom_device_info *, struct cdrom_multisession *); + int (*get_mcn)(struct cdrom_device_info *, struct cdrom_mcn *); + int (*reset)(struct cdrom_device_info *); + int (*audio_ioctl)(struct cdrom_device_info *, unsigned int, void *); + int (*generic_packet)(struct cdrom_device_info *, struct packet_command *); + int (*read_cdda_bpc)(struct cdrom_device_info *, void *, u32, u32, u8 *); + const int capability; +}; + +typedef unsigned int RING_IDX; + +typedef uint16_t blkif_vdev_t; + +typedef uint64_t blkif_sector_t; + +struct blkif_request_segment { + grant_ref_t gref; + uint8_t first_sect; + uint8_t last_sect; +}; + +struct blkif_request_rw { + uint8_t nr_segments; + blkif_vdev_t handle; + uint32_t _pad1; + uint64_t id; + blkif_sector_t sector_number; + struct blkif_request_segment seg[11]; +} __attribute__((packed)); + +struct blkif_request_discard { + uint8_t flag; + blkif_vdev_t _pad1; + uint32_t _pad2; + uint64_t id; + blkif_sector_t sector_number; + uint64_t nr_sectors; + uint8_t _pad3; +} __attribute__((packed)); + +struct blkif_request_other { + uint8_t _pad1; + blkif_vdev_t _pad2; + uint32_t _pad3; + uint64_t id; +} __attribute__((packed)); + +struct blkif_request_indirect { + uint8_t indirect_op; + uint16_t nr_segments; + uint32_t _pad1; + uint64_t id; + blkif_sector_t sector_number; + blkif_vdev_t handle; + uint16_t _pad2; + grant_ref_t indirect_grefs[8]; + uint32_t _pad3; +} __attribute__((packed)); + +struct blkif_request { + uint8_t operation; + union { + struct blkif_request_rw rw; + struct blkif_request_discard discard; + struct blkif_request_other other; + struct blkif_request_indirect indirect; + } u; +} __attribute__((packed)); + +struct blkif_response { + uint64_t id; + uint8_t operation; + int16_t status; +}; + +union blkif_sring_entry { + struct blkif_request req; + struct blkif_response rsp; +}; + +struct blkif_sring { + RING_IDX req_prod; + RING_IDX req_event; + RING_IDX rsp_prod; + RING_IDX rsp_event; + uint8_t __pad[48]; + union blkif_sring_entry ring[1]; +}; + +struct blkif_front_ring { + RING_IDX req_prod_pvt; + RING_IDX rsp_cons; + unsigned int nr_ents; + struct blkif_sring *sring; +}; + +enum blkif_state { + BLKIF_STATE_DISCONNECTED = 0, + BLKIF_STATE_CONNECTED = 1, + BLKIF_STATE_SUSPENDED = 2, + BLKIF_STATE_ERROR = 3, +}; + +struct grant { + grant_ref_t gref; + struct page *page; + struct list_head node; +}; + +enum blk_req_status { + REQ_PROCESSING = 0, + REQ_WAITING = 1, + REQ_DONE = 2, + REQ_ERROR = 3, + REQ_EOPNOTSUPP = 4, +}; + +struct blk_shadow { + struct blkif_request req; + struct request *request; + struct grant **grants_used; + struct grant **indirect_grants; + struct scatterlist *sg; + unsigned int num_sg; + enum blk_req_status status; + long unsigned int associated_id; +}; + +struct blkif_req { + blk_status_t error; +}; + +struct blkfront_info; + +struct blkfront_ring_info { + spinlock_t ring_lock; + struct blkif_front_ring ring; + unsigned int ring_ref[16]; + unsigned int evtchn; + unsigned int irq; + struct work_struct work; + struct gnttab_free_callback callback; + struct list_head indirect_pages; + struct list_head grants; + unsigned int persistent_gnts_c; + long unsigned int shadow_free; + struct blkfront_info *dev_info; + struct blk_shadow shadow[0]; +}; + +struct blkfront_info { + struct mutex mutex; + struct xenbus_device *xbdev; + struct gendisk *gd; + u16 sector_size; + unsigned int physical_sector_size; + int vdevice; + blkif_vdev_t handle; + enum blkif_state connected; + unsigned int nr_ring_pages; + struct request_queue *rq; + unsigned int feature_flush: 1; + unsigned int feature_fua: 1; + unsigned int feature_discard: 1; + unsigned int feature_secdiscard: 1; + unsigned int feature_persistent: 1; + unsigned int discard_granularity; + unsigned int discard_alignment; + unsigned int max_indirect_segments; + int is_ready; + struct blk_mq_tag_set tag_set; + struct blkfront_ring_info *rinfo; + unsigned int nr_rings; + unsigned int rinfo_size; + struct list_head requests; + struct bio_list bio_list; + struct list_head info_list; +}; + +struct setup_rw_req { + unsigned int grant_idx; + struct blkif_request_segment *segments; + struct blkfront_ring_info *rinfo; + struct blkif_request *ring_req; + grant_ref_t gref_head; + unsigned int id; + bool need_copy; + unsigned int bvec_off; + char *bvec_data; + bool require_extra_req; + struct blkif_request *extra_ring_req; +}; + +struct copy_from_grant { + const struct blk_shadow *s; + unsigned int grant_idx; + unsigned int bvec_offset; + char *bvec_data; +}; + +struct sram_config { + int (*init)(); + bool map_only_reserved; +}; + +struct sram_partition { + void *base; + struct gen_pool *pool; + struct bin_attribute battr; + struct mutex lock; + struct list_head list; +}; + +struct sram_dev { + const struct sram_config *config; + struct device *dev; + void *virt_base; + bool no_memory_wc; + struct gen_pool *pool; + struct clk *clk; + struct sram_partition *partition; + u32 partitions; +}; + +struct sram_reserve { + struct list_head list; + u32 start; + u32 size; + struct resource res; + bool export; + bool pool; + bool protect_exec; + const char *label; +}; + +struct mfd_cell_acpi_match; + +struct mfd_cell { + const char *name; + int id; + int level; + int (*enable)(struct platform_device *); + int (*disable)(struct platform_device *); + int (*suspend)(struct platform_device *); + int (*resume)(struct platform_device *); + void *platform_data; + size_t pdata_size; + const struct software_node *swnode; + const char *of_compatible; + const u64 of_reg; + bool use_of_reg; + const struct mfd_cell_acpi_match *acpi_match; + int num_resources; + const struct resource *resources; + bool ignore_resource_conflicts; + bool pm_runtime_no_callbacks; + const char * const *parent_supplies; + int num_parent_supplies; +}; + +struct mfd_cell_acpi_match { + const char *pnpid; + const long long unsigned int adr; +}; + +enum { + CHIP_INVALID = 0, + CHIP_PM8606 = 1, + CHIP_PM8607 = 2, + CHIP_MAX = 3, +}; + +enum pm8606_ref_gp_and_osc_clients { + REF_GP_NO_CLIENTS = 0, + WLED1_DUTY = 1, + WLED2_DUTY = 2, + WLED3_DUTY = 4, + RGB1_ENABLE = 8, + RGB2_ENABLE = 16, + LDO_VBR_EN = 32, + REF_GP_MAX_CLIENT = 65535, +}; + +enum { + PM8607_IRQ_ONKEY = 0, + PM8607_IRQ_EXTON = 1, + PM8607_IRQ_CHG = 2, + PM8607_IRQ_BAT = 3, + PM8607_IRQ_RTC = 4, + PM8607_IRQ_CC = 5, + PM8607_IRQ_VBAT = 6, + PM8607_IRQ_VCHG = 7, + PM8607_IRQ_VSYS = 8, + PM8607_IRQ_TINT = 9, + PM8607_IRQ_GPADC0 = 10, + PM8607_IRQ_GPADC1 = 11, + PM8607_IRQ_GPADC2 = 12, + PM8607_IRQ_GPADC3 = 13, + PM8607_IRQ_AUDIO_SHORT = 14, + PM8607_IRQ_PEN = 15, + PM8607_IRQ_HEADSET = 16, + PM8607_IRQ_HOOK = 17, + PM8607_IRQ_MICIN = 18, + PM8607_IRQ_CHG_FAIL = 19, + PM8607_IRQ_CHG_DONE = 20, + PM8607_IRQ_CHG_FAULT = 21, +}; + +struct pm860x_chip { + struct device *dev; + struct mutex irq_lock; + struct mutex osc_lock; + struct i2c_client *client; + struct i2c_client *companion; + struct regmap *regmap; + struct regmap *regmap_companion; + int buck3_double; + int companion_addr; + short unsigned int osc_vote; + int id; + int irq_mode; + int irq_base; + int core_irq; + unsigned char chip_version; + unsigned char osc_status; + unsigned int wakeup_flag; +}; + +enum { + GI2C_PORT = 0, + PI2C_PORT = 1, +}; + +struct pm860x_backlight_pdata { + int pwm; + int iset; +}; + +struct pm860x_led_pdata { + int iset; +}; + +struct pm860x_rtc_pdata { + int (*sync)(unsigned int); + int vrtc; +}; + +struct pm860x_touch_pdata { + int gpadc_prebias; + int slot_cycle; + int off_scale; + int sw_cal; + int tsi_prebias; + int pen_prebias; + int pen_prechg; + int res_x; + long unsigned int flags; +}; + +struct pm860x_power_pdata { + int max_capacity; + int resistor; +}; + +struct charger_desc; + +struct pm860x_platform_data { + struct pm860x_backlight_pdata *backlight; + struct pm860x_led_pdata *led; + struct pm860x_rtc_pdata *rtc; + struct pm860x_touch_pdata *touch; + struct pm860x_power_pdata *power; + struct regulator_init_data *buck1; + struct regulator_init_data *buck2; + struct regulator_init_data *buck3; + struct regulator_init_data *ldo1; + struct regulator_init_data *ldo2; + struct regulator_init_data *ldo3; + struct regulator_init_data *ldo4; + struct regulator_init_data *ldo5; + struct regulator_init_data *ldo6; + struct regulator_init_data *ldo7; + struct regulator_init_data *ldo8; + struct regulator_init_data *ldo9; + struct regulator_init_data *ldo10; + struct regulator_init_data *ldo12; + struct regulator_init_data *ldo_vibrator; + struct regulator_init_data *ldo14; + struct charger_desc *chg_desc; + int companion_addr; + int i2c_port; + int irq_mode; + int irq_base; + int num_leds; + int num_backlights; +}; + +enum polling_modes { + CM_POLL_DISABLE = 0, + CM_POLL_ALWAYS = 1, + CM_POLL_EXTERNAL_POWER_ONLY = 2, + CM_POLL_CHARGING_ONLY = 3, +}; + +enum data_source { + CM_BATTERY_PRESENT = 0, + CM_NO_BATTERY = 1, + CM_FUEL_GAUGE = 2, + CM_CHARGER_STAT = 3, +}; + +struct charger_regulator; + +struct charger_desc { + const char *psy_name; + enum polling_modes polling_mode; + unsigned int polling_interval_ms; + unsigned int fullbatt_vchkdrop_uV; + unsigned int fullbatt_uV; + unsigned int fullbatt_soc; + unsigned int fullbatt_full_capacity; + enum data_source battery_present; + const char **psy_charger_stat; + int num_charger_regulators; + struct charger_regulator *charger_regulators; + const struct attribute_group **sysfs_groups; + const char *psy_fuel_gauge; + const char *thermal_zone; + int temp_min; + int temp_max; + int temp_diff; + bool measure_battery_temp; + u32 charging_max_duration_ms; + u32 discharging_max_duration_ms; +}; + +struct charger_manager; + +struct charger_cable { + const char *extcon_name; + const char *name; + struct extcon_dev *extcon_dev; + u64 extcon_type; + struct work_struct wq; + struct notifier_block nb; + bool attached; + struct charger_regulator *charger; + int min_uA; + int max_uA; + struct charger_manager *cm; +}; + +struct charger_regulator { + const char *regulator_name; + struct regulator *consumer; + int externally_control; + struct charger_cable *cables; + int num_cables; + struct attribute_group attr_grp; + struct device_attribute attr_name; + struct device_attribute attr_state; + struct device_attribute attr_externally_control; + struct attribute *attrs[4]; + struct charger_manager *cm; +}; + +struct charger_manager { + struct list_head entry; + struct device *dev; + struct charger_desc *desc; + struct thermal_zone_device *tzd_batt; + bool charger_enabled; + int emergency_stop; + char psy_name_buf[31]; + struct power_supply_desc charger_psy_desc; + struct power_supply *charger_psy; + u64 charging_start_time; + u64 charging_end_time; + int battery_status; +}; + +struct pm860x_irq_data { + int reg; + int mask_reg; + int enable; + int offs; +}; + +struct htcpld_chip_platform_data { + unsigned int addr; + unsigned int reset; + unsigned int num_gpios; + unsigned int gpio_out_base; + unsigned int gpio_in_base; + unsigned int irq_base; + unsigned int num_irqs; +}; + +struct htcpld_core_platform_data { + unsigned int int_reset_gpio_hi; + unsigned int int_reset_gpio_lo; + unsigned int i2c_adapter_id; + struct htcpld_chip_platform_data *chip; + unsigned int num_chip; +}; + +struct htcpld_chip { + spinlock_t lock; + u8 reset; + u8 addr; + struct device *dev; + struct i2c_client *client; + u8 cache_out; + struct gpio_chip chip_out; + u8 cache_in; + struct gpio_chip chip_in; + u16 irqs_enabled; + uint irq_start; + int nirqs; + unsigned int flow_type; + struct work_struct set_val_work; +}; + +struct htcpld_data { + u16 irqs_enabled; + uint irq_start; + int nirqs; + uint chained_irq; + unsigned int int_reset_gpio_hi; + unsigned int int_reset_gpio_lo; + struct htcpld_chip *chip; + unsigned int nchips; +}; + +struct stmpe_client_info { + void *data; + int irq; + void *client; + struct device *dev; + int (*read_byte)(struct stmpe *, u8); + int (*write_byte)(struct stmpe *, u8, u8); + int (*read_block)(struct stmpe *, u8, u8, u8 *); + int (*write_block)(struct stmpe *, u8, u8, const u8 *); + void (*init)(struct stmpe *); +}; + +struct stmpe_variant_block; + +struct stmpe_variant_info { + const char *name; + u16 id_val; + u16 id_mask; + int num_gpios; + int af_bits; + const u8 *regs; + struct stmpe_variant_block *blocks; + int num_blocks; + int num_irqs; + int (*enable)(struct stmpe *, unsigned int, bool); + int (*get_altfunc)(struct stmpe *, enum stmpe_block); + int (*enable_autosleep)(struct stmpe *, int); +}; + +struct stmpe_platform_data { + int id; + unsigned int blocks; + unsigned int irq_trigger; + bool autosleep; + bool irq_over_gpio; + int irq_gpio; + int autosleep_timeout; +}; + +struct stmpe_variant_block { + const struct mfd_cell *cell; + int irq; + enum stmpe_block block; +}; + +struct prcm_data { + int nsubdevs; + const struct mfd_cell *subdevs; +}; + +enum tx3589x_block { + TC3589x_BLOCK_GPIO = 1, + TC3589x_BLOCK_KEYPAD = 2, +}; + +enum tc3589x_version { + TC3589X_TC35890 = 0, + TC3589X_TC35892 = 1, + TC3589X_TC35893 = 2, + TC3589X_TC35894 = 3, + TC3589X_TC35895 = 4, + TC3589X_TC35896 = 5, + TC3589X_UNKNOWN = 6, +}; + +enum lochnagar_type { + LOCHNAGAR1 = 0, + LOCHNAGAR2 = 1, +}; + +struct lochnagar { + enum lochnagar_type type; + struct device *dev; + struct regmap *regmap; + struct mutex analogue_config_lock; +}; + +struct lochnagar_config { + int id; + const char * const name; + enum lochnagar_type type; + const struct regmap_config *regmap; + const struct reg_sequence *patch; + int npatch; +}; + +struct wm8400_platform_data { + int (*platform_init)(struct device *); +}; + +struct wm8400 { + struct device *dev; + struct regmap *regmap; + struct platform_device regulators[6]; +}; + +enum wm831x_auxadc { + WM831X_AUX_CAL = 15, + WM831X_AUX_BKUP_BATT = 10, + WM831X_AUX_WALL = 9, + WM831X_AUX_BATT = 8, + WM831X_AUX_USB = 7, + WM831X_AUX_SYSVDD = 6, + WM831X_AUX_BATT_TEMP = 5, + WM831X_AUX_CHIP_TEMP = 4, + WM831X_AUX_AUX4 = 3, + WM831X_AUX_AUX3 = 2, + WM831X_AUX_AUX2 = 1, + WM831X_AUX_AUX1 = 0, +}; + +struct wm831x_backlight_pdata { + int isink; + int max_uA; +}; + +struct wm831x_backup_pdata { + int charger_enable; + int no_constant_voltage; + int vlim; + int ilim; +}; + +struct wm831x_battery_pdata { + int enable; + int fast_enable; + int off_mask; + int trickle_ilim; + int vsel; + int eoc_iterm; + int fast_ilim; + int timeout; +}; + +enum wm831x_status_src { + WM831X_STATUS_PRESERVE = 0, + WM831X_STATUS_OTP = 1, + WM831X_STATUS_POWER = 2, + WM831X_STATUS_CHARGER = 3, + WM831X_STATUS_MANUAL = 4, +}; + +struct wm831x_status_pdata { + enum wm831x_status_src default_src; + const char *name; + const char *default_trigger; +}; + +struct wm831x_touch_pdata { + int fivewire; + int isel; + int rpu; + int pressure; + unsigned int data_irq; + int data_irqf; + unsigned int pd_irq; + int pd_irqf; +}; + +enum wm831x_watchdog_action { + WM831X_WDOG_NONE = 0, + WM831X_WDOG_INTERRUPT = 1, + WM831X_WDOG_RESET = 2, + WM831X_WDOG_WAKE = 3, +}; + +struct wm831x_watchdog_pdata { + enum wm831x_watchdog_action primary; + enum wm831x_watchdog_action secondary; + unsigned int software: 1; +}; + +struct wm831x; + +struct wm831x_pdata { + int wm831x_num; + int (*pre_init)(struct wm831x *); + int (*post_init)(struct wm831x *); + bool irq_cmos; + bool disable_touch; + bool soft_shutdown; + int irq_base; + int gpio_base; + int gpio_defaults[16]; + struct wm831x_backlight_pdata *backlight; + struct wm831x_backup_pdata *backup; + struct wm831x_battery_pdata *battery; + struct wm831x_touch_pdata *touch; + struct wm831x_watchdog_pdata *watchdog; + struct wm831x_status_pdata *status[2]; + struct regulator_init_data *dcdc[4]; + struct regulator_init_data *epe[2]; + struct regulator_init_data *ldo[11]; + struct regulator_init_data *isink[2]; +}; + +enum wm831x_parent { + WM8310 = 33552, + WM8311 = 33553, + WM8312 = 33554, + WM8320 = 33568, + WM8321 = 33569, + WM8325 = 33573, + WM8326 = 33574, +}; + +typedef int (*wm831x_auxadc_read_fn)(struct wm831x *, enum wm831x_auxadc); + +struct wm831x { + struct mutex io_lock; + struct device *dev; + struct regmap *regmap; + struct wm831x_pdata pdata; + enum wm831x_parent type; + int irq; + struct mutex irq_lock; + struct irq_domain *irq_domain; + int irq_masks_cur[5]; + int irq_masks_cache[5]; + bool soft_shutdown; + unsigned int has_gpio_ena: 1; + unsigned int has_cs_sts: 1; + unsigned int charger_irq_wake: 1; + int num_gpio; + int gpio_update[16]; + bool gpio_level_high[16]; + bool gpio_level_low[16]; + struct mutex auxadc_lock; + struct list_head auxadc_pending; + u16 auxadc_active; + wm831x_auxadc_read_fn auxadc_read; + struct mutex key_lock; + unsigned int locked: 1; +}; + +struct wm831x_irq_data { + int primary; + int reg; + int mask; +}; + +struct wm831x_auxadc_req { + struct list_head list; + enum wm831x_auxadc input; + int val; + struct completion done; +}; + +struct wm8350_audio_platform_data { + int vmid_discharge_msecs; + int drain_msecs; + int cap_discharge_msecs; + int vmid_charge_msecs; + u32 vmid_s_curve: 2; + u32 dis_out4: 2; + u32 dis_out3: 2; + u32 dis_out2: 2; + u32 dis_out1: 2; + u32 vroi_out4: 1; + u32 vroi_out3: 1; + u32 vroi_out2: 1; + u32 vroi_out1: 1; + u32 vroi_enable: 1; + u32 codec_current_on: 2; + u32 codec_current_standby: 2; + u32 codec_current_charge: 2; +}; + +struct wm8350_codec { + struct platform_device *pdev; + struct wm8350_audio_platform_data *platform_data; +}; + +struct wm8350_gpio { + struct platform_device *pdev; +}; + +struct wm8350_led { + struct platform_device *pdev; + struct work_struct work; + spinlock_t value_lock; + enum led_brightness value; + struct led_classdev cdev; + int max_uA_index; + int enabled; + struct regulator *isink; + struct regulator_consumer_supply isink_consumer; + struct regulator_init_data isink_init; + struct regulator *dcdc; + struct regulator_consumer_supply dcdc_consumer; + struct regulator_init_data dcdc_init; +}; + +struct wm8350_pmic { + int max_dcdc; + int max_isink; + int isink_A_dcdc; + int isink_B_dcdc; + u16 dcdc1_hib_mode; + u16 dcdc3_hib_mode; + u16 dcdc4_hib_mode; + u16 dcdc6_hib_mode; + struct platform_device *pdev[12]; + struct wm8350_led led[2]; +}; + +struct wm8350_rtc { + struct platform_device *pdev; + struct rtc_device *rtc; + int alarm_enabled; + int update_enabled; +}; + +struct wm8350_charger_policy { + int eoc_mA; + int charge_mV; + int fast_limit_mA; + int fast_limit_USB_mA; + int charge_timeout; + int trickle_start_mV; + int trickle_charge_mA; + int trickle_charge_USB_mA; +}; + +struct wm8350_power { + struct platform_device *pdev; + struct power_supply *battery; + struct power_supply *usb; + struct power_supply *ac; + struct wm8350_charger_policy *policy; + int rev_g_coeff; +}; + +struct wm8350_wdt { + struct platform_device *pdev; +}; + +struct wm8350_hwmon { + struct platform_device *pdev; + struct device *classdev; +}; + +struct wm8350 { + struct device *dev; + struct regmap *regmap; + bool unlocked; + struct mutex auxadc_mutex; + struct completion auxadc_done; + struct mutex irq_lock; + int chip_irq; + int irq_base; + u16 irq_masks[7]; + struct wm8350_codec codec; + struct wm8350_gpio gpio; + struct wm8350_hwmon hwmon; + struct wm8350_pmic pmic; + struct wm8350_power power; + struct wm8350_rtc rtc; + struct wm8350_wdt wdt; +}; + +struct wm8350_platform_data { + int (*init)(struct wm8350 *); + int irq_high; + int irq_base; + int gpio_base; +}; + +struct wm8350_reg_access { + u16 readable; + u16 writable; + u16 vol; +}; + +struct wm8350_irq_data { + int primary; + int reg; + int mask; + int primary_only; +}; + +struct tps65910_platform_data { + int irq; + int irq_base; +}; + +enum tps65912_irqs { + TPS65912_IRQ_PWRHOLD_F = 0, + TPS65912_IRQ_VMON = 1, + TPS65912_IRQ_PWRON = 2, + TPS65912_IRQ_PWRON_LP = 3, + TPS65912_IRQ_PWRHOLD_R = 4, + TPS65912_IRQ_HOTDIE = 5, + TPS65912_IRQ_GPIO1_R = 6, + TPS65912_IRQ_GPIO1_F = 7, + TPS65912_IRQ_GPIO2_R = 8, + TPS65912_IRQ_GPIO2_F = 9, + TPS65912_IRQ_GPIO3_R = 10, + TPS65912_IRQ_GPIO3_F = 11, + TPS65912_IRQ_GPIO4_R = 12, + TPS65912_IRQ_GPIO4_F = 13, + TPS65912_IRQ_GPIO5_R = 14, + TPS65912_IRQ_GPIO5_F = 15, + TPS65912_IRQ_PGOOD_DCDC1 = 16, + TPS65912_IRQ_PGOOD_DCDC2 = 17, + TPS65912_IRQ_PGOOD_DCDC3 = 18, + TPS65912_IRQ_PGOOD_DCDC4 = 19, + TPS65912_IRQ_PGOOD_LDO1 = 20, + TPS65912_IRQ_PGOOD_LDO2 = 21, + TPS65912_IRQ_PGOOD_LDO3 = 22, + TPS65912_IRQ_PGOOD_LDO4 = 23, + TPS65912_IRQ_PGOOD_LDO5 = 24, + TPS65912_IRQ_PGOOD_LDO6 = 25, + TPS65912_IRQ_PGOOD_LDO7 = 26, + TPS65912_IRQ_PGOOD_LDO8 = 27, + TPS65912_IRQ_PGOOD_LDO9 = 28, + TPS65912_IRQ_PGOOD_LDO10 = 29, +}; + +struct tps65912 { + struct device *dev; + struct regmap *regmap; + int irq; + struct regmap_irq_chip_data *irq_data; +}; + +struct matrix_keymap_data { + const uint32_t *keymap; + unsigned int keymap_size; +}; + +enum twl_module_ids { + TWL_MODULE_USB = 0, + TWL_MODULE_PIH = 1, + TWL_MODULE_MAIN_CHARGE = 2, + TWL_MODULE_PM_MASTER = 3, + TWL_MODULE_PM_RECEIVER = 4, + TWL_MODULE_RTC = 5, + TWL_MODULE_PWM = 6, + TWL_MODULE_LED = 7, + TWL_MODULE_SECURED_REG = 8, + TWL_MODULE_LAST = 9, +}; + +enum twl4030_module_ids { + TWL4030_MODULE_AUDIO_VOICE = 9, + TWL4030_MODULE_GPIO = 10, + TWL4030_MODULE_INTBR = 11, + TWL4030_MODULE_TEST = 12, + TWL4030_MODULE_KEYPAD = 13, + TWL4030_MODULE_MADC = 14, + TWL4030_MODULE_INTERRUPTS = 15, + TWL4030_MODULE_PRECHARGE = 16, + TWL4030_MODULE_BACKUP = 17, + TWL4030_MODULE_INT = 18, + TWL5031_MODULE_ACCESSORY = 19, + TWL5031_MODULE_INTERRUPTS = 20, + TWL4030_MODULE_LAST = 21, +}; + +enum twl6030_module_ids { + TWL6030_MODULE_ID0 = 9, + TWL6030_MODULE_ID1 = 10, + TWL6030_MODULE_ID2 = 11, + TWL6030_MODULE_GPADC = 12, + TWL6030_MODULE_GASGAUGE = 13, + TWL6030_MODULE_LAST = 14, +}; + +struct twl4030_clock_init_data { + bool ck32k_lowpwr_enable; +}; + +struct twl4030_bci_platform_data { + int *battery_tmp_tbl; + unsigned int tblsize; + int bb_uvolt; + int bb_uamp; +}; + +struct twl4030_gpio_platform_data { + bool use_leds; + u8 mmc_cd; + u32 debounce; + u32 pullups; + u32 pulldowns; + int (*setup)(struct device *, unsigned int, unsigned int); + int (*teardown)(struct device *, unsigned int, unsigned int); +}; + +struct twl4030_madc_platform_data { + int irq_line; +}; + +struct twl4030_keypad_data { + const struct matrix_keymap_data *keymap_data; + unsigned int rows; + unsigned int cols; + bool rep; +}; + +enum twl4030_usb_mode { + T2_USB_MODE_ULPI = 1, + T2_USB_MODE_CEA2011_3PIN = 2, +}; + +struct twl4030_usb_data { + enum twl4030_usb_mode usb_mode; + long unsigned int features; + int (*phy_init)(struct device *); + int (*phy_exit)(struct device *); + int (*phy_power)(struct device *, int, int); + int (*phy_set_clock)(struct device *, int); + int (*phy_suspend)(struct device *, int); +}; + +struct twl4030_ins { + u16 pmb_message; + u8 delay; +}; + +struct twl4030_script { + struct twl4030_ins *script; + unsigned int size; + u8 flags; +}; + +struct twl4030_resconfig { + u8 resource; + u8 devgroup; + u8 type; + u8 type2; + u8 remap_off; + u8 remap_sleep; +}; + +struct twl4030_power_data { + struct twl4030_script **scripts; + unsigned int num; + struct twl4030_resconfig *resource_config; + struct twl4030_resconfig *board_config; + bool use_poweroff; + bool ac_charger_quirk; +}; + +struct twl4030_codec_data { + unsigned int digimic_delay; + unsigned int ramp_delay_value; + unsigned int offset_cncl_path; + unsigned int hs_extmute: 1; + int hs_extmute_gpio; +}; + +struct twl4030_vibra_data { + unsigned int coexist; +}; + +struct twl4030_audio_data { + unsigned int audio_mclk; + struct twl4030_codec_data *codec; + struct twl4030_vibra_data *vibra; + int audpwron_gpio; + int naudint_irq; + unsigned int irq_base; +}; + +struct twl4030_platform_data { + struct twl4030_clock_init_data *clock; + struct twl4030_bci_platform_data *bci; + struct twl4030_gpio_platform_data *gpio; + struct twl4030_madc_platform_data *madc; + struct twl4030_keypad_data *keypad; + struct twl4030_usb_data *usb; + struct twl4030_power_data *power; + struct twl4030_audio_data *audio; + struct regulator_init_data *vdac; + struct regulator_init_data *vaux1; + struct regulator_init_data *vaux2; + struct regulator_init_data *vaux3; + struct regulator_init_data *vdd1; + struct regulator_init_data *vdd2; + struct regulator_init_data *vdd3; + struct regulator_init_data *vpll1; + struct regulator_init_data *vpll2; + struct regulator_init_data *vmmc1; + struct regulator_init_data *vmmc2; + struct regulator_init_data *vsim; + struct regulator_init_data *vaux4; + struct regulator_init_data *vio; + struct regulator_init_data *vintana1; + struct regulator_init_data *vintana2; + struct regulator_init_data *vintdig; + struct regulator_init_data *vmmc; + struct regulator_init_data *vpp; + struct regulator_init_data *vusim; + struct regulator_init_data *vana; + struct regulator_init_data *vcxio; + struct regulator_init_data *vusb; + struct regulator_init_data *clk32kg; + struct regulator_init_data *v1v8; + struct regulator_init_data *v2v1; + struct regulator_init_data *ldo1; + struct regulator_init_data *ldo2; + struct regulator_init_data *ldo3; + struct regulator_init_data *ldo4; + struct regulator_init_data *ldo5; + struct regulator_init_data *ldo6; + struct regulator_init_data *ldo7; + struct regulator_init_data *ldoln; + struct regulator_init_data *ldousb; + struct regulator_init_data *smps3; + struct regulator_init_data *smps4; + struct regulator_init_data *vio6025; +}; + +struct twl_regulator_driver_data { + int (*set_voltage)(void *, int); + int (*get_voltage)(void *); + void *data; + long unsigned int features; +}; + +struct twl_client { + struct i2c_client *client; + struct regmap *regmap; +}; + +struct twl_mapping { + unsigned char sid; + unsigned char base; +}; + +struct twl_private { + bool ready; + u32 twl_idcode; + unsigned int twl_id; + struct twl_mapping *twl_map; + struct twl_client *twl_modules; +}; + +struct sih_irq_data { + u8 isr_offset; + u8 imr_offset; +}; + +struct sih { + char name[8]; + u8 module; + u8 control_offset; + bool set_cor; + u8 bits; + u8 bytes_ixr; + u8 edr_offset; + u8 bytes_edr; + u8 irq_lines; + struct sih_irq_data mask[2]; +}; + +struct sih_agent { + int irq_base; + const struct sih *sih; + u32 imr; + bool imr_change_pending; + u32 edge_change; + struct mutex irq_lock; + char *irq_name; +}; + +struct twl6030_irq { + unsigned int irq_base; + int twl_irq; + bool irq_wake_enabled; + atomic_t wakeirqs; + struct notifier_block pm_nb; + struct irq_chip irq_chip; + struct irq_domain *irq_domain; + const int *irq_mapping_tbl; +}; + +enum twl4030_audio_res { + TWL4030_AUDIO_RES_POWER = 0, + TWL4030_AUDIO_RES_APLL = 1, + TWL4030_AUDIO_RES_MAX = 2, +}; + +struct twl4030_audio_resource { + int request_count; + u8 reg; + u8 mask; +}; + +struct twl4030_audio { + unsigned int audio_mclk; + struct mutex mutex; + struct twl4030_audio_resource resource[2]; + struct mfd_cell cells[2]; +}; + +struct twl6040 { + struct device *dev; + struct regmap *regmap; + struct regmap_irq_chip_data *irq_data; + struct regulator_bulk_data supplies[2]; + struct clk *clk32k; + struct clk *mclk; + struct mutex mutex; + struct mutex irq_mutex; + struct mfd_cell cells[4]; + struct completion ready; + int audpwron; + int power_count; + int rev; + int pll; + unsigned int sysclk_rate; + unsigned int mclk_rate; + unsigned int irq; + unsigned int irq_ready; + unsigned int irq_th; +}; + +struct mfd_of_node_entry { + struct list_head list; + struct device *dev; + struct device_node *np; +}; + +struct pcap_subdev { + int id; + const char *name; + void *platform_data; +}; + +struct pcap_platform_data { + unsigned int irq_base; + unsigned int config; + int gpio; + void (*init)(void *); + int num_subdevs; + struct pcap_subdev *subdevs; +}; + +struct pcap_adc_request { + u8 bank; + u8 ch[2]; + u32 flags; + void (*callback)(void *, u16 *); + void *data; +}; + +struct pcap_adc_sync_request { + u16 res[2]; + struct completion completion; +}; + +struct pcap_chip { + struct spi_device *spi; + u32 buf; + spinlock_t io_lock; + unsigned int irq_base; + u32 msr; + struct work_struct isr_work; + struct work_struct msr_work; + struct workqueue_struct *workqueue; + struct pcap_adc_request *adc_queue[8]; + u8 adc_head; + u8 adc_tail; + spinlock_t adc_lock; +}; + +struct da903x_subdev_info { + int id; + const char *name; + void *platform_data; +}; + +struct da903x_platform_data { + int num_subdevs; + struct da903x_subdev_info *subdevs; +}; + +struct da903x_chip; + +struct da903x_chip_ops { + int (*init_chip)(struct da903x_chip *); + int (*unmask_events)(struct da903x_chip *, unsigned int); + int (*mask_events)(struct da903x_chip *, unsigned int); + int (*read_events)(struct da903x_chip *, unsigned int *); + int (*read_status)(struct da903x_chip *, unsigned int *); +}; + +struct da903x_chip { + struct i2c_client *client; + struct device *dev; + const struct da903x_chip_ops *ops; + int type; + uint32_t events_mask; + struct mutex lock; + struct work_struct irq_work; + struct blocking_notifier_head notifier_list; +}; + +struct da9052 { + struct device *dev; + struct regmap *regmap; + struct mutex auxadc_lock; + struct completion done; + int irq_base; + struct regmap_irq_chip_data *irq_data; + u8 chip_id; + int chip_irq; + int (*fix_io)(struct da9052 *, unsigned char); +}; + +struct led_platform_data; + +struct da9052_pdata { + struct led_platform_data *pled; + int (*init)(struct da9052 *); + int irq_base; + int gpio_base; + int use_for_apm; + struct regulator_init_data *regulators[14]; +}; + +enum da9052_chip_id { + DA9052 = 0, + DA9053_AA = 1, + DA9053_BA = 2, + DA9053_BB = 3, + DA9053_BC = 4, +}; + +enum lp8788_int_id { + LP8788_INT_TSDL = 0, + LP8788_INT_TSDH = 1, + LP8788_INT_UVLO = 2, + LP8788_INT_FLAGMON = 3, + LP8788_INT_PWRON_TIME = 4, + LP8788_INT_PWRON = 5, + LP8788_INT_COMP1 = 6, + LP8788_INT_COMP2 = 7, + LP8788_INT_CHG_INPUT_STATE = 8, + LP8788_INT_CHG_STATE = 9, + LP8788_INT_EOC = 10, + LP8788_INT_CHG_RESTART = 11, + LP8788_INT_RESTART_TIMEOUT = 12, + LP8788_INT_FULLCHG_TIMEOUT = 13, + LP8788_INT_PRECHG_TIMEOUT = 14, + LP8788_INT_RTC_ALARM1 = 17, + LP8788_INT_RTC_ALARM2 = 18, + LP8788_INT_ENTER_SYS_SUPPORT = 19, + LP8788_INT_EXIT_SYS_SUPPORT = 20, + LP8788_INT_BATT_LOW = 21, + LP8788_INT_NO_BATT = 22, + LP8788_INT_MAX = 24, +}; + +enum lp8788_dvs_sel { + DVS_SEL_V0 = 0, + DVS_SEL_V1 = 1, + DVS_SEL_V2 = 2, + DVS_SEL_V3 = 3, +}; + +enum lp8788_charger_event { + NO_CHARGER = 0, + CHARGER_DETECTED = 1, +}; + +enum lp8788_bl_ctrl_mode { + LP8788_BL_REGISTER_ONLY = 0, + LP8788_BL_COMB_PWM_BASED = 1, + LP8788_BL_COMB_REGISTER_BASED = 2, +}; + +enum lp8788_bl_dim_mode { + LP8788_DIM_EXPONENTIAL = 0, + LP8788_DIM_LINEAR = 1, +}; + +enum lp8788_bl_full_scale_current { + LP8788_FULLSCALE_5000uA = 0, + LP8788_FULLSCALE_8500uA = 1, + LP8788_FULLSCALE_1200uA = 2, + LP8788_FULLSCALE_1550uA = 3, + LP8788_FULLSCALE_1900uA = 4, + LP8788_FULLSCALE_2250uA = 5, + LP8788_FULLSCALE_2600uA = 6, + LP8788_FULLSCALE_2950uA = 7, +}; + +enum lp8788_bl_ramp_step { + LP8788_RAMP_8us = 0, + LP8788_RAMP_1024us = 1, + LP8788_RAMP_2048us = 2, + LP8788_RAMP_4096us = 3, + LP8788_RAMP_8192us = 4, + LP8788_RAMP_16384us = 5, + LP8788_RAMP_32768us = 6, + LP8788_RAMP_65538us = 7, +}; + +enum lp8788_isink_scale { + LP8788_ISINK_SCALE_100mA = 0, + LP8788_ISINK_SCALE_120mA = 1, +}; + +enum lp8788_isink_number { + LP8788_ISINK_1 = 0, + LP8788_ISINK_2 = 1, + LP8788_ISINK_3 = 2, +}; + +enum lp8788_alarm_sel { + LP8788_ALARM_1 = 0, + LP8788_ALARM_2 = 1, + LP8788_ALARM_MAX = 2, +}; + +struct lp8788_buck1_dvs { + int gpio; + enum lp8788_dvs_sel vsel; +}; + +struct lp8788_buck2_dvs { + int gpio[2]; + enum lp8788_dvs_sel vsel; +}; + +struct lp8788_chg_param { + u8 addr; + u8 val; +}; + +struct lp8788; + +struct lp8788_charger_platform_data { + const char *adc_vbatt; + const char *adc_batt_temp; + unsigned int max_vbatt_mv; + struct lp8788_chg_param *chg_params; + int num_chg_params; + void (*charger_event)(struct lp8788 *, enum lp8788_charger_event); +}; + +struct lp8788_platform_data; + +struct lp8788 { + struct device *dev; + struct regmap *regmap; + struct irq_domain *irqdm; + int irq; + struct lp8788_platform_data *pdata; +}; + +struct lp8788_backlight_platform_data { + char *name; + int initial_brightness; + enum lp8788_bl_ctrl_mode bl_mode; + enum lp8788_bl_dim_mode dim_mode; + enum lp8788_bl_full_scale_current full_scale; + enum lp8788_bl_ramp_step rise_time; + enum lp8788_bl_ramp_step fall_time; + enum pwm_polarity pwm_pol; + unsigned int period_ns; +}; + +struct lp8788_led_platform_data { + char *name; + enum lp8788_isink_scale scale; + enum lp8788_isink_number num; + int iout_code; +}; + +struct lp8788_vib_platform_data { + char *name; + enum lp8788_isink_scale scale; + enum lp8788_isink_number num; + int iout_code; + int pwm_code; +}; + +struct iio_map; + +struct lp8788_platform_data { + int (*init_func)(struct lp8788 *); + struct regulator_init_data *buck_data[4]; + struct regulator_init_data *dldo_data[12]; + struct regulator_init_data *aldo_data[10]; + struct lp8788_buck1_dvs *buck1_dvs; + struct lp8788_buck2_dvs *buck2_dvs; + struct lp8788_charger_platform_data *chg_pdata; + enum lp8788_alarm_sel alarm_sel; + struct lp8788_backlight_platform_data *bl_pdata; + struct lp8788_led_platform_data *led_pdata; + struct lp8788_vib_platform_data *vib_pdata; + struct iio_map *adc_pdata; +}; + +struct lp8788_irq_data { + struct lp8788 *lp; + struct mutex irq_lock; + struct irq_domain *domain; + int enabled[24]; +}; + +struct da9055 { + struct regmap *regmap; + struct regmap_irq_chip_data *irq_data; + struct device *dev; + struct i2c_client *i2c_client; + int irq_base; + int chip_irq; +}; + +enum gpio_select { + NO_GPIO = 0, + GPIO_1 = 1, + GPIO_2 = 2, +}; + +struct da9055_pdata { + int (*init)(struct da9055 *); + int irq_base; + int gpio_base; + struct regulator_init_data *regulators[8]; + bool reset_enable; + int *gpio_ren; + int *gpio_rsel; + enum gpio_select *reg_ren; + enum gpio_select *reg_rsel; + struct gpio_desc **ena_gpiods; +}; + +enum da9063_type { + PMIC_TYPE_DA9063 = 0, + PMIC_TYPE_DA9063L = 1, +}; + +enum da9063_irqs { + DA9063_IRQ_ONKEY = 0, + DA9063_IRQ_ALARM = 1, + DA9063_IRQ_TICK = 2, + DA9063_IRQ_ADC_RDY = 3, + DA9063_IRQ_SEQ_RDY = 4, + DA9063_IRQ_WAKE = 5, + DA9063_IRQ_TEMP = 6, + DA9063_IRQ_COMP_1V2 = 7, + DA9063_IRQ_LDO_LIM = 8, + DA9063_IRQ_REG_UVOV = 9, + DA9063_IRQ_DVC_RDY = 10, + DA9063_IRQ_VDD_MON = 11, + DA9063_IRQ_WARN = 12, + DA9063_IRQ_GPI0 = 13, + DA9063_IRQ_GPI1 = 14, + DA9063_IRQ_GPI2 = 15, + DA9063_IRQ_GPI3 = 16, + DA9063_IRQ_GPI4 = 17, + DA9063_IRQ_GPI5 = 18, + DA9063_IRQ_GPI6 = 19, + DA9063_IRQ_GPI7 = 20, + DA9063_IRQ_GPI8 = 21, + DA9063_IRQ_GPI9 = 22, + DA9063_IRQ_GPI10 = 23, + DA9063_IRQ_GPI11 = 24, + DA9063_IRQ_GPI12 = 25, + DA9063_IRQ_GPI13 = 26, + DA9063_IRQ_GPI14 = 27, + DA9063_IRQ_GPI15 = 28, +}; + +struct da9063 { + struct device *dev; + enum da9063_type type; + unsigned char variant_code; + unsigned int flags; + struct regmap *regmap; + int chip_irq; + unsigned int irq_base; + struct regmap_irq_chip_data *regmap_irq; +}; + +enum da9063_variant_codes { + PMIC_DA9063_AD = 3, + PMIC_DA9063_BB = 5, + PMIC_DA9063_CA = 6, + PMIC_DA9063_DA = 7, + PMIC_DA9063_EA = 8, +}; + +enum da9063_page_sel_buf_fmt { + DA9063_PAGE_SEL_BUF_PAGE_REG = 0, + DA9063_PAGE_SEL_BUF_PAGE_VAL = 1, + DA9063_PAGE_SEL_BUF_SIZE = 2, +}; + +enum da9063_paged_read_msgs { + DA9063_PAGED_READ_MSG_PAGE_SEL = 0, + DA9063_PAGED_READ_MSG_REG_SEL = 1, + DA9063_PAGED_READ_MSG_DATA = 2, + DA9063_PAGED_READ_MSG_CNT = 3, +}; + +enum { + DA9063_DEV_ID_REG = 0, + DA9063_VAR_ID_REG = 1, + DA9063_CHIP_ID_REGS = 2, +}; + +struct max14577_regulator_platform_data { + int id; + struct regulator_init_data *initdata; + struct device_node *of_node; +}; + +struct max14577_platform_data { + int irq_base; + int gpio_pogo_vbatt_en; + int gpio_pogo_vbus_en; + int (*set_gpio_pogo_vbatt_en)(int); + int (*set_gpio_pogo_vbus_en)(int); + int (*set_gpio_pogo_cb)(int); + struct max14577_regulator_platform_data *regulators; +}; + +struct maxim_charger_current { + unsigned int min; + unsigned int high_start; + unsigned int high_step; + unsigned int max; +}; + +enum maxim_device_type { + MAXIM_DEVICE_TYPE_UNKNOWN = 0, + MAXIM_DEVICE_TYPE_MAX14577 = 1, + MAXIM_DEVICE_TYPE_MAX77836 = 2, + MAXIM_DEVICE_TYPE_NUM = 3, +}; + +enum max14577_reg { + MAX14577_REG_DEVICEID = 0, + MAX14577_REG_INT1 = 1, + MAX14577_REG_INT2 = 2, + MAX14577_REG_INT3 = 3, + MAX14577_REG_STATUS1 = 4, + MAX14577_REG_STATUS2 = 5, + MAX14577_REG_STATUS3 = 6, + MAX14577_REG_INTMASK1 = 7, + MAX14577_REG_INTMASK2 = 8, + MAX14577_REG_INTMASK3 = 9, + MAX14577_REG_CDETCTRL1 = 10, + MAX14577_REG_RFU = 11, + MAX14577_REG_CONTROL1 = 12, + MAX14577_REG_CONTROL2 = 13, + MAX14577_REG_CONTROL3 = 14, + MAX14577_REG_CHGCTRL1 = 15, + MAX14577_REG_CHGCTRL2 = 16, + MAX14577_REG_CHGCTRL3 = 17, + MAX14577_REG_CHGCTRL4 = 18, + MAX14577_REG_CHGCTRL5 = 19, + MAX14577_REG_CHGCTRL6 = 20, + MAX14577_REG_CHGCTRL7 = 21, + MAX14577_REG_END = 22, +}; + +enum max77836_pmic_reg { + MAX77836_PMIC_REG_PMIC_ID = 32, + MAX77836_PMIC_REG_PMIC_REV = 33, + MAX77836_PMIC_REG_INTSRC = 34, + MAX77836_PMIC_REG_INTSRC_MASK = 35, + MAX77836_PMIC_REG_TOPSYS_INT = 36, + MAX77836_PMIC_REG_TOPSYS_INT_MASK = 38, + MAX77836_PMIC_REG_TOPSYS_STAT = 40, + MAX77836_PMIC_REG_MRSTB_CNTL = 42, + MAX77836_PMIC_REG_LSCNFG = 43, + MAX77836_LDO_REG_CNFG1_LDO1 = 81, + MAX77836_LDO_REG_CNFG2_LDO1 = 82, + MAX77836_LDO_REG_CNFG1_LDO2 = 83, + MAX77836_LDO_REG_CNFG2_LDO2 = 84, + MAX77836_LDO_REG_CNFG_LDO_BIAS = 85, + MAX77836_COMP_REG_COMP1 = 96, + MAX77836_PMIC_REG_END = 97, +}; + +enum max77836_fg_reg { + MAX77836_FG_REG_VCELL_MSB = 2, + MAX77836_FG_REG_VCELL_LSB = 3, + MAX77836_FG_REG_SOC_MSB = 4, + MAX77836_FG_REG_SOC_LSB = 5, + MAX77836_FG_REG_MODE_H = 6, + MAX77836_FG_REG_MODE_L = 7, + MAX77836_FG_REG_VERSION_MSB = 8, + MAX77836_FG_REG_VERSION_LSB = 9, + MAX77836_FG_REG_HIBRT_H = 10, + MAX77836_FG_REG_HIBRT_L = 11, + MAX77836_FG_REG_CONFIG_H = 12, + MAX77836_FG_REG_CONFIG_L = 13, + MAX77836_FG_REG_VALRT_MIN = 20, + MAX77836_FG_REG_VALRT_MAX = 21, + MAX77836_FG_REG_CRATE_MSB = 22, + MAX77836_FG_REG_CRATE_LSB = 23, + MAX77836_FG_REG_VRESET = 24, + MAX77836_FG_REG_FGID = 25, + MAX77836_FG_REG_STATUS_H = 26, + MAX77836_FG_REG_STATUS_L = 27, + MAX77836_FG_REG_END = 28, +}; + +struct max14577 { + struct device *dev; + struct i2c_client *i2c; + struct i2c_client *i2c_pmic; + enum maxim_device_type dev_type; + struct regmap *regmap; + struct regmap *regmap_pmic; + struct regmap_irq_chip_data *irq_data; + struct regmap_irq_chip_data *irq_data_pmic; + int irq; +}; + +enum { + MAX77620_IRQ_TOP_GLBL = 0, + MAX77620_IRQ_TOP_SD = 1, + MAX77620_IRQ_TOP_LDO = 2, + MAX77620_IRQ_TOP_GPIO = 3, + MAX77620_IRQ_TOP_RTC = 4, + MAX77620_IRQ_TOP_32K = 5, + MAX77620_IRQ_TOP_ONOFF = 6, + MAX77620_IRQ_LBT_MBATLOW = 7, + MAX77620_IRQ_LBT_TJALRM1 = 8, + MAX77620_IRQ_LBT_TJALRM2 = 9, +}; + +enum max77620_chip_id { + MAX77620 = 0, + MAX20024 = 1, + MAX77663 = 2, +}; + +struct max77620_chip { + struct device *dev; + struct regmap *rmap; + int chip_irq; + enum max77620_chip_id chip_id; + bool sleep_enable; + bool enable_global_lpm; + int shutdown_fps_period[3]; + int suspend_fps_period[3]; + struct regmap_irq_chip_data *top_irq_data; + struct regmap_irq_chip_data *gpio_irq_data; +}; + +enum max77686_pmic_reg { + MAX77686_REG_DEVICE_ID = 0, + MAX77686_REG_INTSRC = 1, + MAX77686_REG_INT1 = 2, + MAX77686_REG_INT2 = 3, + MAX77686_REG_INT1MSK = 4, + MAX77686_REG_INT2MSK = 5, + MAX77686_REG_STATUS1 = 6, + MAX77686_REG_STATUS2 = 7, + MAX77686_REG_PWRON = 8, + MAX77686_REG_ONOFF_DELAY = 9, + MAX77686_REG_MRSTB = 10, + MAX77686_REG_BUCK1CTRL = 16, + MAX77686_REG_BUCK1OUT = 17, + MAX77686_REG_BUCK2CTRL1 = 18, + MAX77686_REG_BUCK234FREQ = 19, + MAX77686_REG_BUCK2DVS1 = 20, + MAX77686_REG_BUCK2DVS2 = 21, + MAX77686_REG_BUCK2DVS3 = 22, + MAX77686_REG_BUCK2DVS4 = 23, + MAX77686_REG_BUCK2DVS5 = 24, + MAX77686_REG_BUCK2DVS6 = 25, + MAX77686_REG_BUCK2DVS7 = 26, + MAX77686_REG_BUCK2DVS8 = 27, + MAX77686_REG_BUCK3CTRL1 = 28, + MAX77686_REG_BUCK3DVS1 = 30, + MAX77686_REG_BUCK3DVS2 = 31, + MAX77686_REG_BUCK3DVS3 = 32, + MAX77686_REG_BUCK3DVS4 = 33, + MAX77686_REG_BUCK3DVS5 = 34, + MAX77686_REG_BUCK3DVS6 = 35, + MAX77686_REG_BUCK3DVS7 = 36, + MAX77686_REG_BUCK3DVS8 = 37, + MAX77686_REG_BUCK4CTRL1 = 38, + MAX77686_REG_BUCK4DVS1 = 40, + MAX77686_REG_BUCK4DVS2 = 41, + MAX77686_REG_BUCK4DVS3 = 42, + MAX77686_REG_BUCK4DVS4 = 43, + MAX77686_REG_BUCK4DVS5 = 44, + MAX77686_REG_BUCK4DVS6 = 45, + MAX77686_REG_BUCK4DVS7 = 46, + MAX77686_REG_BUCK4DVS8 = 47, + MAX77686_REG_BUCK5CTRL = 48, + MAX77686_REG_BUCK5OUT = 49, + MAX77686_REG_BUCK6CTRL = 50, + MAX77686_REG_BUCK6OUT = 51, + MAX77686_REG_BUCK7CTRL = 52, + MAX77686_REG_BUCK7OUT = 53, + MAX77686_REG_BUCK8CTRL = 54, + MAX77686_REG_BUCK8OUT = 55, + MAX77686_REG_BUCK9CTRL = 56, + MAX77686_REG_BUCK9OUT = 57, + MAX77686_REG_LDO1CTRL1 = 64, + MAX77686_REG_LDO2CTRL1 = 65, + MAX77686_REG_LDO3CTRL1 = 66, + MAX77686_REG_LDO4CTRL1 = 67, + MAX77686_REG_LDO5CTRL1 = 68, + MAX77686_REG_LDO6CTRL1 = 69, + MAX77686_REG_LDO7CTRL1 = 70, + MAX77686_REG_LDO8CTRL1 = 71, + MAX77686_REG_LDO9CTRL1 = 72, + MAX77686_REG_LDO10CTRL1 = 73, + MAX77686_REG_LDO11CTRL1 = 74, + MAX77686_REG_LDO12CTRL1 = 75, + MAX77686_REG_LDO13CTRL1 = 76, + MAX77686_REG_LDO14CTRL1 = 77, + MAX77686_REG_LDO15CTRL1 = 78, + MAX77686_REG_LDO16CTRL1 = 79, + MAX77686_REG_LDO17CTRL1 = 80, + MAX77686_REG_LDO18CTRL1 = 81, + MAX77686_REG_LDO19CTRL1 = 82, + MAX77686_REG_LDO20CTRL1 = 83, + MAX77686_REG_LDO21CTRL1 = 84, + MAX77686_REG_LDO22CTRL1 = 85, + MAX77686_REG_LDO23CTRL1 = 86, + MAX77686_REG_LDO24CTRL1 = 87, + MAX77686_REG_LDO25CTRL1 = 88, + MAX77686_REG_LDO26CTRL1 = 89, + MAX77686_REG_LDO1CTRL2 = 96, + MAX77686_REG_LDO2CTRL2 = 97, + MAX77686_REG_LDO3CTRL2 = 98, + MAX77686_REG_LDO4CTRL2 = 99, + MAX77686_REG_LDO5CTRL2 = 100, + MAX77686_REG_LDO6CTRL2 = 101, + MAX77686_REG_LDO7CTRL2 = 102, + MAX77686_REG_LDO8CTRL2 = 103, + MAX77686_REG_LDO9CTRL2 = 104, + MAX77686_REG_LDO10CTRL2 = 105, + MAX77686_REG_LDO11CTRL2 = 106, + MAX77686_REG_LDO12CTRL2 = 107, + MAX77686_REG_LDO13CTRL2 = 108, + MAX77686_REG_LDO14CTRL2 = 109, + MAX77686_REG_LDO15CTRL2 = 110, + MAX77686_REG_LDO16CTRL2 = 111, + MAX77686_REG_LDO17CTRL2 = 112, + MAX77686_REG_LDO18CTRL2 = 113, + MAX77686_REG_LDO19CTRL2 = 114, + MAX77686_REG_LDO20CTRL2 = 115, + MAX77686_REG_LDO21CTRL2 = 116, + MAX77686_REG_LDO22CTRL2 = 117, + MAX77686_REG_LDO23CTRL2 = 118, + MAX77686_REG_LDO24CTRL2 = 119, + MAX77686_REG_LDO25CTRL2 = 120, + MAX77686_REG_LDO26CTRL2 = 121, + MAX77686_REG_BBAT_CHG = 126, + MAX77686_REG_32KHZ = 127, + MAX77686_REG_PMIC_END = 128, +}; + +enum max77802_pmic_reg { + MAX77802_REG_DEVICE_ID = 0, + MAX77802_REG_INTSRC = 1, + MAX77802_REG_INT1 = 2, + MAX77802_REG_INT2 = 3, + MAX77802_REG_INT1MSK = 4, + MAX77802_REG_INT2MSK = 5, + MAX77802_REG_STATUS1 = 6, + MAX77802_REG_STATUS2 = 7, + MAX77802_REG_PWRON = 8, + MAX77802_REG_MRSTB = 10, + MAX77802_REG_EPWRHOLD = 11, + MAX77802_REG_BOOSTCTRL = 14, + MAX77802_REG_BOOSTOUT = 15, + MAX77802_REG_BUCK1CTRL = 16, + MAX77802_REG_BUCK1DVS1 = 17, + MAX77802_REG_BUCK1DVS2 = 18, + MAX77802_REG_BUCK1DVS3 = 19, + MAX77802_REG_BUCK1DVS4 = 20, + MAX77802_REG_BUCK1DVS5 = 21, + MAX77802_REG_BUCK1DVS6 = 22, + MAX77802_REG_BUCK1DVS7 = 23, + MAX77802_REG_BUCK1DVS8 = 24, + MAX77802_REG_BUCK2CTRL1 = 26, + MAX77802_REG_BUCK2CTRL2 = 27, + MAX77802_REG_BUCK2PHTRAN = 28, + MAX77802_REG_BUCK2DVS1 = 29, + MAX77802_REG_BUCK2DVS2 = 30, + MAX77802_REG_BUCK2DVS3 = 31, + MAX77802_REG_BUCK2DVS4 = 32, + MAX77802_REG_BUCK2DVS5 = 33, + MAX77802_REG_BUCK2DVS6 = 34, + MAX77802_REG_BUCK2DVS7 = 35, + MAX77802_REG_BUCK2DVS8 = 36, + MAX77802_REG_BUCK3CTRL1 = 39, + MAX77802_REG_BUCK3DVS1 = 40, + MAX77802_REG_BUCK3DVS2 = 41, + MAX77802_REG_BUCK3DVS3 = 42, + MAX77802_REG_BUCK3DVS4 = 43, + MAX77802_REG_BUCK3DVS5 = 44, + MAX77802_REG_BUCK3DVS6 = 45, + MAX77802_REG_BUCK3DVS7 = 46, + MAX77802_REG_BUCK3DVS8 = 47, + MAX77802_REG_BUCK4CTRL1 = 55, + MAX77802_REG_BUCK4DVS1 = 56, + MAX77802_REG_BUCK4DVS2 = 57, + MAX77802_REG_BUCK4DVS3 = 58, + MAX77802_REG_BUCK4DVS4 = 59, + MAX77802_REG_BUCK4DVS5 = 60, + MAX77802_REG_BUCK4DVS6 = 61, + MAX77802_REG_BUCK4DVS7 = 62, + MAX77802_REG_BUCK4DVS8 = 63, + MAX77802_REG_BUCK5CTRL = 65, + MAX77802_REG_BUCK5OUT = 66, + MAX77802_REG_BUCK6CTRL = 68, + MAX77802_REG_BUCK6DVS1 = 69, + MAX77802_REG_BUCK6DVS2 = 70, + MAX77802_REG_BUCK6DVS3 = 71, + MAX77802_REG_BUCK6DVS4 = 72, + MAX77802_REG_BUCK6DVS5 = 73, + MAX77802_REG_BUCK6DVS6 = 74, + MAX77802_REG_BUCK6DVS7 = 75, + MAX77802_REG_BUCK6DVS8 = 76, + MAX77802_REG_BUCK7CTRL = 78, + MAX77802_REG_BUCK7OUT = 79, + MAX77802_REG_BUCK8CTRL = 81, + MAX77802_REG_BUCK8OUT = 82, + MAX77802_REG_BUCK9CTRL = 84, + MAX77802_REG_BUCK9OUT = 85, + MAX77802_REG_BUCK10CTRL = 87, + MAX77802_REG_BUCK10OUT = 88, + MAX77802_REG_LDO1CTRL1 = 96, + MAX77802_REG_LDO2CTRL1 = 97, + MAX77802_REG_LDO3CTRL1 = 98, + MAX77802_REG_LDO4CTRL1 = 99, + MAX77802_REG_LDO5CTRL1 = 100, + MAX77802_REG_LDO6CTRL1 = 101, + MAX77802_REG_LDO7CTRL1 = 102, + MAX77802_REG_LDO8CTRL1 = 103, + MAX77802_REG_LDO9CTRL1 = 104, + MAX77802_REG_LDO10CTRL1 = 105, + MAX77802_REG_LDO11CTRL1 = 106, + MAX77802_REG_LDO12CTRL1 = 107, + MAX77802_REG_LDO13CTRL1 = 108, + MAX77802_REG_LDO14CTRL1 = 109, + MAX77802_REG_LDO15CTRL1 = 110, + MAX77802_REG_LDO17CTRL1 = 112, + MAX77802_REG_LDO18CTRL1 = 113, + MAX77802_REG_LDO19CTRL1 = 114, + MAX77802_REG_LDO20CTRL1 = 115, + MAX77802_REG_LDO21CTRL1 = 116, + MAX77802_REG_LDO22CTRL1 = 117, + MAX77802_REG_LDO23CTRL1 = 118, + MAX77802_REG_LDO24CTRL1 = 119, + MAX77802_REG_LDO25CTRL1 = 120, + MAX77802_REG_LDO26CTRL1 = 121, + MAX77802_REG_LDO27CTRL1 = 122, + MAX77802_REG_LDO28CTRL1 = 123, + MAX77802_REG_LDO29CTRL1 = 124, + MAX77802_REG_LDO30CTRL1 = 125, + MAX77802_REG_LDO32CTRL1 = 127, + MAX77802_REG_LDO33CTRL1 = 128, + MAX77802_REG_LDO34CTRL1 = 129, + MAX77802_REG_LDO35CTRL1 = 130, + MAX77802_REG_LDO1CTRL2 = 144, + MAX77802_REG_LDO2CTRL2 = 145, + MAX77802_REG_LDO3CTRL2 = 146, + MAX77802_REG_LDO4CTRL2 = 147, + MAX77802_REG_LDO5CTRL2 = 148, + MAX77802_REG_LDO6CTRL2 = 149, + MAX77802_REG_LDO7CTRL2 = 150, + MAX77802_REG_LDO8CTRL2 = 151, + MAX77802_REG_LDO9CTRL2 = 152, + MAX77802_REG_LDO10CTRL2 = 153, + MAX77802_REG_LDO11CTRL2 = 154, + MAX77802_REG_LDO12CTRL2 = 155, + MAX77802_REG_LDO13CTRL2 = 156, + MAX77802_REG_LDO14CTRL2 = 157, + MAX77802_REG_LDO15CTRL2 = 158, + MAX77802_REG_LDO17CTRL2 = 160, + MAX77802_REG_LDO18CTRL2 = 161, + MAX77802_REG_LDO19CTRL2 = 162, + MAX77802_REG_LDO20CTRL2 = 163, + MAX77802_REG_LDO21CTRL2 = 164, + MAX77802_REG_LDO22CTRL2 = 165, + MAX77802_REG_LDO23CTRL2 = 166, + MAX77802_REG_LDO24CTRL2 = 167, + MAX77802_REG_LDO25CTRL2 = 168, + MAX77802_REG_LDO26CTRL2 = 169, + MAX77802_REG_LDO27CTRL2 = 170, + MAX77802_REG_LDO28CTRL2 = 171, + MAX77802_REG_LDO29CTRL2 = 172, + MAX77802_REG_LDO30CTRL2 = 173, + MAX77802_REG_LDO32CTRL2 = 175, + MAX77802_REG_LDO33CTRL2 = 176, + MAX77802_REG_LDO34CTRL2 = 177, + MAX77802_REG_LDO35CTRL2 = 178, + MAX77802_REG_BBAT_CHG = 180, + MAX77802_REG_32KHZ = 181, + MAX77802_REG_PMIC_END = 182, +}; + +enum max77802_rtc_reg { + MAX77802_RTC_INT = 192, + MAX77802_RTC_INTM = 193, + MAX77802_RTC_CONTROLM = 194, + MAX77802_RTC_CONTROL = 195, + MAX77802_RTC_UPDATE0 = 196, + MAX77802_RTC_UPDATE1 = 197, + MAX77802_WTSR_SMPL_CNTL = 198, + MAX77802_RTC_SEC = 199, + MAX77802_RTC_MIN = 200, + MAX77802_RTC_HOUR = 201, + MAX77802_RTC_WEEKDAY = 202, + MAX77802_RTC_MONTH = 203, + MAX77802_RTC_YEAR = 204, + MAX77802_RTC_DATE = 205, + MAX77802_RTC_AE1 = 206, + MAX77802_ALARM1_SEC = 207, + MAX77802_ALARM1_MIN = 208, + MAX77802_ALARM1_HOUR = 209, + MAX77802_ALARM1_WEEKDAY = 210, + MAX77802_ALARM1_MONTH = 211, + MAX77802_ALARM1_YEAR = 212, + MAX77802_ALARM1_DATE = 213, + MAX77802_RTC_AE2 = 214, + MAX77802_ALARM2_SEC = 215, + MAX77802_ALARM2_MIN = 216, + MAX77802_ALARM2_HOUR = 217, + MAX77802_ALARM2_WEEKDAY = 218, + MAX77802_ALARM2_MONTH = 219, + MAX77802_ALARM2_YEAR = 220, + MAX77802_ALARM2_DATE = 221, + MAX77802_RTC_END = 223, +}; + +enum max77686_irq_source { + PMIC_INT1 = 0, + PMIC_INT2 = 1, + RTC_INT = 2, + MAX77686_IRQ_GROUP_NR = 3, +}; + +struct max77686_dev { + struct device *dev; + struct i2c_client *i2c; + long unsigned int type; + struct regmap *regmap; + struct regmap_irq_chip_data *irq_data; + int irq; + struct mutex irqlock; + int irq_masks_cur[3]; + int irq_masks_cache[3]; +}; + +enum max77686_types { + TYPE_MAX77686 = 0, + TYPE_MAX77802 = 1, +}; + +enum max77693_types { + TYPE_MAX77693_UNKNOWN = 0, + TYPE_MAX77693 = 1, + TYPE_MAX77843 = 2, + TYPE_MAX77693_NUM = 3, +}; + +struct max77693_dev { + struct device *dev; + struct i2c_client *i2c; + struct i2c_client *i2c_muic; + struct i2c_client *i2c_haptic; + struct i2c_client *i2c_chg; + enum max77693_types type; + struct regmap *regmap; + struct regmap *regmap_muic; + struct regmap *regmap_haptic; + struct regmap *regmap_chg; + struct regmap_irq_chip_data *irq_data_led; + struct regmap_irq_chip_data *irq_data_topsys; + struct regmap_irq_chip_data *irq_data_chg; + struct regmap_irq_chip_data *irq_data_muic; + int irq; +}; + +enum max77693_pmic_reg { + MAX77693_LED_REG_IFLASH1 = 0, + MAX77693_LED_REG_IFLASH2 = 1, + MAX77693_LED_REG_ITORCH = 2, + MAX77693_LED_REG_ITORCHTIMER = 3, + MAX77693_LED_REG_FLASH_TIMER = 4, + MAX77693_LED_REG_FLASH_EN = 5, + MAX77693_LED_REG_MAX_FLASH1 = 6, + MAX77693_LED_REG_MAX_FLASH2 = 7, + MAX77693_LED_REG_MAX_FLASH3 = 8, + MAX77693_LED_REG_MAX_FLASH4 = 9, + MAX77693_LED_REG_VOUT_CNTL = 10, + MAX77693_LED_REG_VOUT_FLASH1 = 11, + MAX77693_LED_REG_VOUT_FLASH2 = 12, + MAX77693_LED_REG_FLASH_INT = 14, + MAX77693_LED_REG_FLASH_INT_MASK = 15, + MAX77693_LED_REG_FLASH_STATUS = 16, + MAX77693_PMIC_REG_PMIC_ID1 = 32, + MAX77693_PMIC_REG_PMIC_ID2 = 33, + MAX77693_PMIC_REG_INTSRC = 34, + MAX77693_PMIC_REG_INTSRC_MASK = 35, + MAX77693_PMIC_REG_TOPSYS_INT = 36, + MAX77693_PMIC_REG_TOPSYS_INT_MASK = 38, + MAX77693_PMIC_REG_TOPSYS_STAT = 40, + MAX77693_PMIC_REG_MAINCTRL1 = 42, + MAX77693_PMIC_REG_LSCNFG = 43, + MAX77693_CHG_REG_CHG_INT = 176, + MAX77693_CHG_REG_CHG_INT_MASK = 177, + MAX77693_CHG_REG_CHG_INT_OK = 178, + MAX77693_CHG_REG_CHG_DETAILS_00 = 179, + MAX77693_CHG_REG_CHG_DETAILS_01 = 180, + MAX77693_CHG_REG_CHG_DETAILS_02 = 181, + MAX77693_CHG_REG_CHG_DETAILS_03 = 182, + MAX77693_CHG_REG_CHG_CNFG_00 = 183, + MAX77693_CHG_REG_CHG_CNFG_01 = 184, + MAX77693_CHG_REG_CHG_CNFG_02 = 185, + MAX77693_CHG_REG_CHG_CNFG_03 = 186, + MAX77693_CHG_REG_CHG_CNFG_04 = 187, + MAX77693_CHG_REG_CHG_CNFG_05 = 188, + MAX77693_CHG_REG_CHG_CNFG_06 = 189, + MAX77693_CHG_REG_CHG_CNFG_07 = 190, + MAX77693_CHG_REG_CHG_CNFG_08 = 191, + MAX77693_CHG_REG_CHG_CNFG_09 = 192, + MAX77693_CHG_REG_CHG_CNFG_10 = 193, + MAX77693_CHG_REG_CHG_CNFG_11 = 194, + MAX77693_CHG_REG_CHG_CNFG_12 = 195, + MAX77693_CHG_REG_CHG_CNFG_13 = 196, + MAX77693_CHG_REG_CHG_CNFG_14 = 197, + MAX77693_CHG_REG_SAFEOUT_CTRL = 198, + MAX77693_PMIC_REG_END = 199, +}; + +enum max77693_muic_reg { + MAX77693_MUIC_REG_ID = 0, + MAX77693_MUIC_REG_INT1 = 1, + MAX77693_MUIC_REG_INT2 = 2, + MAX77693_MUIC_REG_INT3 = 3, + MAX77693_MUIC_REG_STATUS1 = 4, + MAX77693_MUIC_REG_STATUS2 = 5, + MAX77693_MUIC_REG_STATUS3 = 6, + MAX77693_MUIC_REG_INTMASK1 = 7, + MAX77693_MUIC_REG_INTMASK2 = 8, + MAX77693_MUIC_REG_INTMASK3 = 9, + MAX77693_MUIC_REG_CDETCTRL1 = 10, + MAX77693_MUIC_REG_CDETCTRL2 = 11, + MAX77693_MUIC_REG_CTRL1 = 12, + MAX77693_MUIC_REG_CTRL2 = 13, + MAX77693_MUIC_REG_CTRL3 = 14, + MAX77693_MUIC_REG_END = 15, +}; + +enum max77693_haptic_reg { + MAX77693_HAPTIC_REG_STATUS = 0, + MAX77693_HAPTIC_REG_CONFIG1 = 1, + MAX77693_HAPTIC_REG_CONFIG2 = 2, + MAX77693_HAPTIC_REG_CONFIG_CHNL = 3, + MAX77693_HAPTIC_REG_CONFG_CYC1 = 4, + MAX77693_HAPTIC_REG_CONFG_CYC2 = 5, + MAX77693_HAPTIC_REG_CONFIG_PER1 = 6, + MAX77693_HAPTIC_REG_CONFIG_PER2 = 7, + MAX77693_HAPTIC_REG_CONFIG_PER3 = 8, + MAX77693_HAPTIC_REG_CONFIG_PER4 = 9, + MAX77693_HAPTIC_REG_CONFIG_DUTY1 = 10, + MAX77693_HAPTIC_REG_CONFIG_DUTY2 = 11, + MAX77693_HAPTIC_REG_CONFIG_PWM1 = 12, + MAX77693_HAPTIC_REG_CONFIG_PWM2 = 13, + MAX77693_HAPTIC_REG_CONFIG_PWM3 = 14, + MAX77693_HAPTIC_REG_CONFIG_PWM4 = 15, + MAX77693_HAPTIC_REG_REV = 16, + MAX77693_HAPTIC_REG_END = 17, +}; + +enum max77843_sys_reg { + MAX77843_SYS_REG_PMICID = 0, + MAX77843_SYS_REG_PMICREV = 1, + MAX77843_SYS_REG_MAINCTRL1 = 2, + MAX77843_SYS_REG_INTSRC = 34, + MAX77843_SYS_REG_INTSRCMASK = 35, + MAX77843_SYS_REG_SYSINTSRC = 36, + MAX77843_SYS_REG_SYSINTMASK = 38, + MAX77843_SYS_REG_TOPSYS_STAT = 40, + MAX77843_SYS_REG_SAFEOUTCTRL = 198, + MAX77843_SYS_REG_END = 199, +}; + +enum max77843_charger_reg { + MAX77843_CHG_REG_CHG_INT = 176, + MAX77843_CHG_REG_CHG_INT_MASK = 177, + MAX77843_CHG_REG_CHG_INT_OK = 178, + MAX77843_CHG_REG_CHG_DTLS_00 = 179, + MAX77843_CHG_REG_CHG_DTLS_01 = 180, + MAX77843_CHG_REG_CHG_DTLS_02 = 181, + MAX77843_CHG_REG_CHG_CNFG_00 = 183, + MAX77843_CHG_REG_CHG_CNFG_01 = 184, + MAX77843_CHG_REG_CHG_CNFG_02 = 185, + MAX77843_CHG_REG_CHG_CNFG_03 = 186, + MAX77843_CHG_REG_CHG_CNFG_04 = 187, + MAX77843_CHG_REG_CHG_CNFG_06 = 189, + MAX77843_CHG_REG_CHG_CNFG_07 = 190, + MAX77843_CHG_REG_CHG_CNFG_09 = 192, + MAX77843_CHG_REG_CHG_CNFG_10 = 193, + MAX77843_CHG_REG_CHG_CNFG_11 = 194, + MAX77843_CHG_REG_CHG_CNFG_12 = 195, + MAX77843_CHG_REG_END = 196, +}; + +enum { + MAX8925_IRQ_VCHG_DC_OVP = 0, + MAX8925_IRQ_VCHG_DC_F = 1, + MAX8925_IRQ_VCHG_DC_R = 2, + MAX8925_IRQ_VCHG_THM_OK_R = 3, + MAX8925_IRQ_VCHG_THM_OK_F = 4, + MAX8925_IRQ_VCHG_SYSLOW_F = 5, + MAX8925_IRQ_VCHG_SYSLOW_R = 6, + MAX8925_IRQ_VCHG_RST = 7, + MAX8925_IRQ_VCHG_DONE = 8, + MAX8925_IRQ_VCHG_TOPOFF = 9, + MAX8925_IRQ_VCHG_TMR_FAULT = 10, + MAX8925_IRQ_GPM_RSTIN = 11, + MAX8925_IRQ_GPM_MPL = 12, + MAX8925_IRQ_GPM_SW_3SEC = 13, + MAX8925_IRQ_GPM_EXTON_F = 14, + MAX8925_IRQ_GPM_EXTON_R = 15, + MAX8925_IRQ_GPM_SW_1SEC = 16, + MAX8925_IRQ_GPM_SW_F = 17, + MAX8925_IRQ_GPM_SW_R = 18, + MAX8925_IRQ_GPM_SYSCKEN_F = 19, + MAX8925_IRQ_GPM_SYSCKEN_R = 20, + MAX8925_IRQ_RTC_ALARM1 = 21, + MAX8925_IRQ_RTC_ALARM0 = 22, + MAX8925_IRQ_TSC_STICK = 23, + MAX8925_IRQ_TSC_NSTICK = 24, + MAX8925_NR_IRQS = 25, +}; + +struct max8925_chip { + struct device *dev; + struct i2c_client *i2c; + struct i2c_client *adc; + struct i2c_client *rtc; + struct mutex io_lock; + struct mutex irq_lock; + int irq_base; + int core_irq; + int tsc_irq; + unsigned int wakeup_flag; +}; + +struct max8925_backlight_pdata { + int lxw_scl; + int lxw_freq; + int dual_string; +}; + +struct max8925_touch_pdata { + unsigned int flags; +}; + +struct max8925_power_pdata { + int (*set_charger)(int); + unsigned int batt_detect: 1; + unsigned int topoff_threshold: 2; + unsigned int fast_charge: 3; + unsigned int no_temp_support: 1; + unsigned int no_insert_detect: 1; + char **supplied_to; + int num_supplicants; +}; + +struct max8925_platform_data { + struct max8925_backlight_pdata *backlight; + struct max8925_touch_pdata *touch; + struct max8925_power_pdata *power; + struct regulator_init_data *sd1; + struct regulator_init_data *sd2; + struct regulator_init_data *sd3; + struct regulator_init_data *ldo1; + struct regulator_init_data *ldo2; + struct regulator_init_data *ldo3; + struct regulator_init_data *ldo4; + struct regulator_init_data *ldo5; + struct regulator_init_data *ldo6; + struct regulator_init_data *ldo7; + struct regulator_init_data *ldo8; + struct regulator_init_data *ldo9; + struct regulator_init_data *ldo10; + struct regulator_init_data *ldo11; + struct regulator_init_data *ldo12; + struct regulator_init_data *ldo13; + struct regulator_init_data *ldo14; + struct regulator_init_data *ldo15; + struct regulator_init_data *ldo16; + struct regulator_init_data *ldo17; + struct regulator_init_data *ldo18; + struct regulator_init_data *ldo19; + struct regulator_init_data *ldo20; + int irq_base; + int tsc_irq; +}; + +enum { + FLAGS_ADC = 1, + FLAGS_RTC = 2, +}; + +struct max8925_irq_data { + int reg; + int mask_reg; + int enable; + int offs; + int flags; + int tsc_irq; +}; + +struct max8997_regulator_data { + int id; + struct regulator_init_data *initdata; + struct device_node *reg_node; +}; + +struct max8997_muic_reg_data { + u8 addr; + u8 data; +}; + +struct max8997_muic_platform_data { + struct max8997_muic_reg_data *init_data; + int num_init_data; + int detcable_delay_ms; + int path_usb; + int path_uart; +}; + +enum max8997_haptic_motor_type { + MAX8997_HAPTIC_ERM = 0, + MAX8997_HAPTIC_LRA = 1, +}; + +enum max8997_haptic_pulse_mode { + MAX8997_EXTERNAL_MODE = 0, + MAX8997_INTERNAL_MODE = 1, +}; + +enum max8997_haptic_pwm_divisor { + MAX8997_PWM_DIVISOR_32 = 0, + MAX8997_PWM_DIVISOR_64 = 1, + MAX8997_PWM_DIVISOR_128 = 2, + MAX8997_PWM_DIVISOR_256 = 3, +}; + +struct max8997_haptic_platform_data { + unsigned int pwm_channel_id; + unsigned int pwm_period; + enum max8997_haptic_motor_type type; + enum max8997_haptic_pulse_mode mode; + enum max8997_haptic_pwm_divisor pwm_divisor; + unsigned int internal_mode_pattern; + unsigned int pattern_cycle; + unsigned int pattern_signal_period; +}; + +enum max8997_led_mode { + MAX8997_NONE = 0, + MAX8997_FLASH_MODE = 1, + MAX8997_MOVIE_MODE = 2, + MAX8997_FLASH_PIN_CONTROL_MODE = 3, + MAX8997_MOVIE_PIN_CONTROL_MODE = 4, +}; + +struct max8997_led_platform_data { + enum max8997_led_mode mode[2]; + u8 brightness[2]; +}; + +struct max8997_platform_data { + int ono; + struct max8997_regulator_data *regulators; + int num_regulators; + bool ignore_gpiodvs_side_effect; + int buck125_gpios[3]; + int buck125_default_idx; + unsigned int buck1_voltage[8]; + bool buck1_gpiodvs; + unsigned int buck2_voltage[8]; + bool buck2_gpiodvs; + unsigned int buck5_voltage[8]; + bool buck5_gpiodvs; + int eoc_mA; + int timeout; + struct max8997_muic_platform_data *muic_pdata; + struct max8997_haptic_platform_data *haptic_pdata; + struct max8997_led_platform_data *led_pdata; +}; + +enum max8997_pmic_reg { + MAX8997_REG_PMIC_ID0 = 0, + MAX8997_REG_PMIC_ID1 = 1, + MAX8997_REG_INTSRC = 2, + MAX8997_REG_INT1 = 3, + MAX8997_REG_INT2 = 4, + MAX8997_REG_INT3 = 5, + MAX8997_REG_INT4 = 6, + MAX8997_REG_INT1MSK = 8, + MAX8997_REG_INT2MSK = 9, + MAX8997_REG_INT3MSK = 10, + MAX8997_REG_INT4MSK = 11, + MAX8997_REG_STATUS1 = 13, + MAX8997_REG_STATUS2 = 14, + MAX8997_REG_STATUS3 = 15, + MAX8997_REG_STATUS4 = 16, + MAX8997_REG_MAINCON1 = 19, + MAX8997_REG_MAINCON2 = 20, + MAX8997_REG_BUCKRAMP = 21, + MAX8997_REG_BUCK1CTRL = 24, + MAX8997_REG_BUCK1DVS1 = 25, + MAX8997_REG_BUCK1DVS2 = 26, + MAX8997_REG_BUCK1DVS3 = 27, + MAX8997_REG_BUCK1DVS4 = 28, + MAX8997_REG_BUCK1DVS5 = 29, + MAX8997_REG_BUCK1DVS6 = 30, + MAX8997_REG_BUCK1DVS7 = 31, + MAX8997_REG_BUCK1DVS8 = 32, + MAX8997_REG_BUCK2CTRL = 33, + MAX8997_REG_BUCK2DVS1 = 34, + MAX8997_REG_BUCK2DVS2 = 35, + MAX8997_REG_BUCK2DVS3 = 36, + MAX8997_REG_BUCK2DVS4 = 37, + MAX8997_REG_BUCK2DVS5 = 38, + MAX8997_REG_BUCK2DVS6 = 39, + MAX8997_REG_BUCK2DVS7 = 40, + MAX8997_REG_BUCK2DVS8 = 41, + MAX8997_REG_BUCK3CTRL = 42, + MAX8997_REG_BUCK3DVS = 43, + MAX8997_REG_BUCK4CTRL = 44, + MAX8997_REG_BUCK4DVS = 45, + MAX8997_REG_BUCK5CTRL = 46, + MAX8997_REG_BUCK5DVS1 = 47, + MAX8997_REG_BUCK5DVS2 = 48, + MAX8997_REG_BUCK5DVS3 = 49, + MAX8997_REG_BUCK5DVS4 = 50, + MAX8997_REG_BUCK5DVS5 = 51, + MAX8997_REG_BUCK5DVS6 = 52, + MAX8997_REG_BUCK5DVS7 = 53, + MAX8997_REG_BUCK5DVS8 = 54, + MAX8997_REG_BUCK6CTRL = 55, + MAX8997_REG_BUCK6BPSKIPCTRL = 56, + MAX8997_REG_BUCK7CTRL = 57, + MAX8997_REG_BUCK7DVS = 58, + MAX8997_REG_LDO1CTRL = 59, + MAX8997_REG_LDO2CTRL = 60, + MAX8997_REG_LDO3CTRL = 61, + MAX8997_REG_LDO4CTRL = 62, + MAX8997_REG_LDO5CTRL = 63, + MAX8997_REG_LDO6CTRL = 64, + MAX8997_REG_LDO7CTRL = 65, + MAX8997_REG_LDO8CTRL = 66, + MAX8997_REG_LDO9CTRL = 67, + MAX8997_REG_LDO10CTRL = 68, + MAX8997_REG_LDO11CTRL = 69, + MAX8997_REG_LDO12CTRL = 70, + MAX8997_REG_LDO13CTRL = 71, + MAX8997_REG_LDO14CTRL = 72, + MAX8997_REG_LDO15CTRL = 73, + MAX8997_REG_LDO16CTRL = 74, + MAX8997_REG_LDO17CTRL = 75, + MAX8997_REG_LDO18CTRL = 76, + MAX8997_REG_LDO21CTRL = 77, + MAX8997_REG_MBCCTRL1 = 80, + MAX8997_REG_MBCCTRL2 = 81, + MAX8997_REG_MBCCTRL3 = 82, + MAX8997_REG_MBCCTRL4 = 83, + MAX8997_REG_MBCCTRL5 = 84, + MAX8997_REG_MBCCTRL6 = 85, + MAX8997_REG_OTPCGHCVS = 86, + MAX8997_REG_SAFEOUTCTRL = 90, + MAX8997_REG_LBCNFG1 = 94, + MAX8997_REG_LBCNFG2 = 95, + MAX8997_REG_BBCCTRL = 96, + MAX8997_REG_FLASH1_CUR = 99, + MAX8997_REG_FLASH2_CUR = 100, + MAX8997_REG_MOVIE_CUR = 101, + MAX8997_REG_GSMB_CUR = 102, + MAX8997_REG_BOOST_CNTL = 103, + MAX8997_REG_LEN_CNTL = 104, + MAX8997_REG_FLASH_CNTL = 105, + MAX8997_REG_WDT_CNTL = 106, + MAX8997_REG_MAXFLASH1 = 107, + MAX8997_REG_MAXFLASH2 = 108, + MAX8997_REG_FLASHSTATUS = 109, + MAX8997_REG_FLASHSTATUSMASK = 110, + MAX8997_REG_GPIOCNTL1 = 112, + MAX8997_REG_GPIOCNTL2 = 113, + MAX8997_REG_GPIOCNTL3 = 114, + MAX8997_REG_GPIOCNTL4 = 115, + MAX8997_REG_GPIOCNTL5 = 116, + MAX8997_REG_GPIOCNTL6 = 117, + MAX8997_REG_GPIOCNTL7 = 118, + MAX8997_REG_GPIOCNTL8 = 119, + MAX8997_REG_GPIOCNTL9 = 120, + MAX8997_REG_GPIOCNTL10 = 121, + MAX8997_REG_GPIOCNTL11 = 122, + MAX8997_REG_GPIOCNTL12 = 123, + MAX8997_REG_LDO1CONFIG = 128, + MAX8997_REG_LDO2CONFIG = 129, + MAX8997_REG_LDO3CONFIG = 130, + MAX8997_REG_LDO4CONFIG = 131, + MAX8997_REG_LDO5CONFIG = 132, + MAX8997_REG_LDO6CONFIG = 133, + MAX8997_REG_LDO7CONFIG = 134, + MAX8997_REG_LDO8CONFIG = 135, + MAX8997_REG_LDO9CONFIG = 136, + MAX8997_REG_LDO10CONFIG = 137, + MAX8997_REG_LDO11CONFIG = 138, + MAX8997_REG_LDO12CONFIG = 139, + MAX8997_REG_LDO13CONFIG = 140, + MAX8997_REG_LDO14CONFIG = 141, + MAX8997_REG_LDO15CONFIG = 142, + MAX8997_REG_LDO16CONFIG = 143, + MAX8997_REG_LDO17CONFIG = 144, + MAX8997_REG_LDO18CONFIG = 145, + MAX8997_REG_LDO21CONFIG = 146, + MAX8997_REG_DVSOKTIMER1 = 151, + MAX8997_REG_DVSOKTIMER2 = 152, + MAX8997_REG_DVSOKTIMER4 = 153, + MAX8997_REG_DVSOKTIMER5 = 154, + MAX8997_REG_PMIC_END = 155, +}; + +enum max8997_muic_reg { + MAX8997_MUIC_REG_ID = 0, + MAX8997_MUIC_REG_INT1 = 1, + MAX8997_MUIC_REG_INT2 = 2, + MAX8997_MUIC_REG_INT3 = 3, + MAX8997_MUIC_REG_STATUS1 = 4, + MAX8997_MUIC_REG_STATUS2 = 5, + MAX8997_MUIC_REG_STATUS3 = 6, + MAX8997_MUIC_REG_INTMASK1 = 7, + MAX8997_MUIC_REG_INTMASK2 = 8, + MAX8997_MUIC_REG_INTMASK3 = 9, + MAX8997_MUIC_REG_CDETCTRL = 10, + MAX8997_MUIC_REG_CONTROL1 = 12, + MAX8997_MUIC_REG_CONTROL2 = 13, + MAX8997_MUIC_REG_CONTROL3 = 14, + MAX8997_MUIC_REG_END = 15, +}; + +enum max8997_haptic_reg { + MAX8997_HAPTIC_REG_GENERAL = 0, + MAX8997_HAPTIC_REG_CONF1 = 1, + MAX8997_HAPTIC_REG_CONF2 = 2, + MAX8997_HAPTIC_REG_DRVCONF = 3, + MAX8997_HAPTIC_REG_CYCLECONF1 = 4, + MAX8997_HAPTIC_REG_CYCLECONF2 = 5, + MAX8997_HAPTIC_REG_SIGCONF1 = 6, + MAX8997_HAPTIC_REG_SIGCONF2 = 7, + MAX8997_HAPTIC_REG_SIGCONF3 = 8, + MAX8997_HAPTIC_REG_SIGCONF4 = 9, + MAX8997_HAPTIC_REG_SIGDC1 = 10, + MAX8997_HAPTIC_REG_SIGDC2 = 11, + MAX8997_HAPTIC_REG_SIGPWMDC1 = 12, + MAX8997_HAPTIC_REG_SIGPWMDC2 = 13, + MAX8997_HAPTIC_REG_SIGPWMDC3 = 14, + MAX8997_HAPTIC_REG_SIGPWMDC4 = 15, + MAX8997_HAPTIC_REG_MTR_REV = 16, + MAX8997_HAPTIC_REG_END = 17, +}; + +enum max8997_irq_source { + PMIC_INT1___2 = 0, + PMIC_INT2___2 = 1, + PMIC_INT3 = 2, + PMIC_INT4 = 3, + FUEL_GAUGE = 4, + MUIC_INT1 = 5, + MUIC_INT2 = 6, + MUIC_INT3 = 7, + GPIO_LOW = 8, + GPIO_HI = 9, + FLASH_STATUS = 10, + MAX8997_IRQ_GROUP_NR = 11, +}; + +struct max8997_dev { + struct device *dev; + struct max8997_platform_data *pdata; + struct i2c_client *i2c; + struct i2c_client *rtc; + struct i2c_client *haptic; + struct i2c_client *muic; + struct mutex iolock; + long unsigned int type; + struct platform_device *battery; + int irq; + int ono; + struct irq_domain *irq_domain; + struct mutex irqlock; + int irq_masks_cur[11]; + int irq_masks_cache[11]; + u8 reg_dump[187]; + bool gpio_status[12]; +}; + +enum max8997_types { + TYPE_MAX8997 = 0, + TYPE_MAX8966 = 1, +}; + +enum max8997_irq { + MAX8997_PMICIRQ_PWRONR = 0, + MAX8997_PMICIRQ_PWRONF = 1, + MAX8997_PMICIRQ_PWRON1SEC = 2, + MAX8997_PMICIRQ_JIGONR = 3, + MAX8997_PMICIRQ_JIGONF = 4, + MAX8997_PMICIRQ_LOWBAT2 = 5, + MAX8997_PMICIRQ_LOWBAT1 = 6, + MAX8997_PMICIRQ_JIGR = 7, + MAX8997_PMICIRQ_JIGF = 8, + MAX8997_PMICIRQ_MR = 9, + MAX8997_PMICIRQ_DVS1OK = 10, + MAX8997_PMICIRQ_DVS2OK = 11, + MAX8997_PMICIRQ_DVS3OK = 12, + MAX8997_PMICIRQ_DVS4OK = 13, + MAX8997_PMICIRQ_CHGINS = 14, + MAX8997_PMICIRQ_CHGRM = 15, + MAX8997_PMICIRQ_DCINOVP = 16, + MAX8997_PMICIRQ_TOPOFFR = 17, + MAX8997_PMICIRQ_CHGRSTF = 18, + MAX8997_PMICIRQ_MBCHGTMEXPD = 19, + MAX8997_PMICIRQ_RTC60S = 20, + MAX8997_PMICIRQ_RTCA1 = 21, + MAX8997_PMICIRQ_RTCA2 = 22, + MAX8997_PMICIRQ_SMPL_INT = 23, + MAX8997_PMICIRQ_RTC1S = 24, + MAX8997_PMICIRQ_WTSR = 25, + MAX8997_MUICIRQ_ADCError = 26, + MAX8997_MUICIRQ_ADCLow = 27, + MAX8997_MUICIRQ_ADC = 28, + MAX8997_MUICIRQ_VBVolt = 29, + MAX8997_MUICIRQ_DBChg = 30, + MAX8997_MUICIRQ_DCDTmr = 31, + MAX8997_MUICIRQ_ChgDetRun = 32, + MAX8997_MUICIRQ_ChgTyp = 33, + MAX8997_MUICIRQ_OVP = 34, + MAX8997_IRQ_NR = 35, +}; + +struct max8997_irq_data { + int mask; + enum max8997_irq_source group; +}; + +struct max8998_regulator_data { + int id; + struct regulator_init_data *initdata; + struct device_node *reg_node; +}; + +struct max8998_platform_data { + struct max8998_regulator_data *regulators; + int num_regulators; + unsigned int irq_base; + int ono; + bool buck_voltage_lock; + int buck1_voltage[4]; + int buck2_voltage[2]; + int buck1_set1; + int buck1_set2; + int buck1_default_idx; + int buck2_set3; + int buck2_default_idx; + bool wakeup; + bool rtc_delay; + int eoc; + int restart; + int timeout; +}; + +enum { + MAX8998_REG_IRQ1 = 0, + MAX8998_REG_IRQ2 = 1, + MAX8998_REG_IRQ3 = 2, + MAX8998_REG_IRQ4 = 3, + MAX8998_REG_IRQM1 = 4, + MAX8998_REG_IRQM2 = 5, + MAX8998_REG_IRQM3 = 6, + MAX8998_REG_IRQM4 = 7, + MAX8998_REG_STATUS1 = 8, + MAX8998_REG_STATUS2 = 9, + MAX8998_REG_STATUSM1 = 10, + MAX8998_REG_STATUSM2 = 11, + MAX8998_REG_CHGR1 = 12, + MAX8998_REG_CHGR2 = 13, + MAX8998_REG_LDO_ACTIVE_DISCHARGE1 = 14, + MAX8998_REG_LDO_ACTIVE_DISCHARGE2 = 15, + MAX8998_REG_BUCK_ACTIVE_DISCHARGE3 = 16, + MAX8998_REG_ONOFF1 = 17, + MAX8998_REG_ONOFF2 = 18, + MAX8998_REG_ONOFF3 = 19, + MAX8998_REG_ONOFF4 = 20, + MAX8998_REG_BUCK1_VOLTAGE1 = 21, + MAX8998_REG_BUCK1_VOLTAGE2 = 22, + MAX8998_REG_BUCK1_VOLTAGE3 = 23, + MAX8998_REG_BUCK1_VOLTAGE4 = 24, + MAX8998_REG_BUCK2_VOLTAGE1 = 25, + MAX8998_REG_BUCK2_VOLTAGE2 = 26, + MAX8998_REG_BUCK3 = 27, + MAX8998_REG_BUCK4 = 28, + MAX8998_REG_LDO2_LDO3 = 29, + MAX8998_REG_LDO4 = 30, + MAX8998_REG_LDO5 = 31, + MAX8998_REG_LDO6 = 32, + MAX8998_REG_LDO7 = 33, + MAX8998_REG_LDO8_LDO9 = 34, + MAX8998_REG_LDO10_LDO11 = 35, + MAX8998_REG_LDO12 = 36, + MAX8998_REG_LDO13 = 37, + MAX8998_REG_LDO14 = 38, + MAX8998_REG_LDO15 = 39, + MAX8998_REG_LDO16 = 40, + MAX8998_REG_LDO17 = 41, + MAX8998_REG_BKCHR = 42, + MAX8998_REG_LBCNFG1 = 43, + MAX8998_REG_LBCNFG2 = 44, +}; + +enum { + TYPE_MAX8998 = 0, + TYPE_LP3974 = 1, + TYPE_LP3979 = 2, +}; + +struct max8998_dev { + struct device *dev; + struct max8998_platform_data *pdata; + struct i2c_client *i2c; + struct i2c_client *rtc; + struct mutex iolock; + struct mutex irqlock; + unsigned int irq_base; + struct irq_domain *irq_domain; + int irq; + int ono; + u8 irq_masks_cur[4]; + u8 irq_masks_cache[4]; + long unsigned int type; + bool wakeup; +}; + +struct max8998_reg_dump { + u8 addr; + u8 val; +}; + +enum { + MAX8998_IRQ_DCINF = 0, + MAX8998_IRQ_DCINR = 1, + MAX8998_IRQ_JIGF = 2, + MAX8998_IRQ_JIGR = 3, + MAX8998_IRQ_PWRONF = 4, + MAX8998_IRQ_PWRONR = 5, + MAX8998_IRQ_WTSREVNT = 6, + MAX8998_IRQ_SMPLEVNT = 7, + MAX8998_IRQ_ALARM1 = 8, + MAX8998_IRQ_ALARM0 = 9, + MAX8998_IRQ_ONKEY1S = 10, + MAX8998_IRQ_TOPOFFR = 11, + MAX8998_IRQ_DCINOVPR = 12, + MAX8998_IRQ_CHGRSTF = 13, + MAX8998_IRQ_DONER = 14, + MAX8998_IRQ_CHGFAULT = 15, + MAX8998_IRQ_LOBAT1 = 16, + MAX8998_IRQ_LOBAT2 = 17, + MAX8998_IRQ_NR = 18, +}; + +struct max8998_irq_data { + int reg; + int mask; +}; + +struct max8997_dev___2; + +struct adp5520_gpio_platform_data { + unsigned int gpio_start; + u8 gpio_en_mask; + u8 gpio_pullup_mask; +}; + +struct adp5520_keys_platform_data { + int rows_en_mask; + int cols_en_mask; + const short unsigned int *keymap; + short unsigned int keymapsize; + unsigned int repeat: 1; +}; + +struct led_info; + +struct adp5520_leds_platform_data { + int num_leds; + struct led_info *leds; + u8 fade_in; + u8 fade_out; + u8 led_on_time; +}; + +struct adp5520_backlight_platform_data { + u8 fade_in; + u8 fade_out; + u8 fade_led_law; + u8 en_ambl_sens; + u8 abml_filt; + u8 l1_daylight_max; + u8 l1_daylight_dim; + u8 l2_office_max; + u8 l2_office_dim; + u8 l3_dark_max; + u8 l3_dark_dim; + u8 l2_trip; + u8 l2_hyst; + u8 l3_trip; + u8 l3_hyst; +}; + +struct adp5520_platform_data { + struct adp5520_keys_platform_data *keys; + struct adp5520_gpio_platform_data *gpio; + struct adp5520_leds_platform_data *leds; + struct adp5520_backlight_platform_data *backlight; +}; + +struct adp5520_chip { + struct i2c_client *client; + struct device *dev; + struct mutex lock; + struct blocking_notifier_head notifier_list; + int irq; + long unsigned int id; + uint8_t mode; +}; + +struct tps6586x_irq_data { + u8 mask_reg; + u8 mask_mask; +}; + +struct tps6586x { + struct device *dev; + struct i2c_client *client; + struct regmap *regmap; + int version; + int irq; + struct irq_chip irq_chip; + struct mutex irq_lock; + int irq_base; + u32 irq_en; + u8 mask_reg[5]; + struct irq_domain *irq_domain; +}; + +enum { + TPS65090_IRQ_INTERRUPT = 0, + TPS65090_IRQ_VAC_STATUS_CHANGE = 1, + TPS65090_IRQ_VSYS_STATUS_CHANGE = 2, + TPS65090_IRQ_BAT_STATUS_CHANGE = 3, + TPS65090_IRQ_CHARGING_STATUS_CHANGE = 4, + TPS65090_IRQ_CHARGING_COMPLETE = 5, + TPS65090_IRQ_OVERLOAD_DCDC1 = 6, + TPS65090_IRQ_OVERLOAD_DCDC2 = 7, + TPS65090_IRQ_OVERLOAD_DCDC3 = 8, + TPS65090_IRQ_OVERLOAD_FET1 = 9, + TPS65090_IRQ_OVERLOAD_FET2 = 10, + TPS65090_IRQ_OVERLOAD_FET3 = 11, + TPS65090_IRQ_OVERLOAD_FET4 = 12, + TPS65090_IRQ_OVERLOAD_FET5 = 13, + TPS65090_IRQ_OVERLOAD_FET6 = 14, + TPS65090_IRQ_OVERLOAD_FET7 = 15, +}; + +enum { + TPS65090_REGULATOR_DCDC1 = 0, + TPS65090_REGULATOR_DCDC2 = 1, + TPS65090_REGULATOR_DCDC3 = 2, + TPS65090_REGULATOR_FET1 = 3, + TPS65090_REGULATOR_FET2 = 4, + TPS65090_REGULATOR_FET3 = 5, + TPS65090_REGULATOR_FET4 = 6, + TPS65090_REGULATOR_FET5 = 7, + TPS65090_REGULATOR_FET6 = 8, + TPS65090_REGULATOR_FET7 = 9, + TPS65090_REGULATOR_LDO1 = 10, + TPS65090_REGULATOR_LDO2 = 11, + TPS65090_REGULATOR_MAX = 12, +}; + +struct tps65090 { + struct device *dev; + struct regmap *rmap; + struct regmap_irq_chip_data *irq_data; +}; + +struct tps65090_regulator_plat_data { + struct regulator_init_data *reg_init_data; + bool enable_ext_control; + struct gpio_desc *gpiod; + bool overcurrent_wait_valid; + int overcurrent_wait; +}; + +struct tps65090_platform_data { + int irq_base; + char **supplied_to; + size_t num_supplicants; + int enable_low_current_chrg; + struct tps65090_regulator_plat_data *reg_pdata[12]; +}; + +enum tps65090_cells { + PMIC = 0, + CHARGER = 1, +}; + +enum aat2870_id { + AAT2870_ID_BL = 0, + AAT2870_ID_LDOA = 1, + AAT2870_ID_LDOB = 2, + AAT2870_ID_LDOC = 3, + AAT2870_ID_LDOD = 4, +}; + +struct aat2870_register { + bool readable; + bool writeable; + u8 value; +}; + +struct aat2870_data { + struct device *dev; + struct i2c_client *client; + struct mutex io_lock; + struct aat2870_register *reg_cache; + int en_pin; + bool is_enable; + int (*init)(struct aat2870_data *); + void (*uninit)(struct aat2870_data *); + int (*read)(struct aat2870_data *, u8, u8 *); + int (*write)(struct aat2870_data *, u8, u8); + int (*update)(struct aat2870_data *, u8, u8, u8); + struct dentry *dentry_root; +}; + +struct aat2870_subdev_info { + int id; + const char *name; + void *platform_data; +}; + +struct aat2870_platform_data { + int en_pin; + struct aat2870_subdev_info *subdevs; + int num_subdevs; + int (*init)(struct aat2870_data *); + void (*uninit)(struct aat2870_data *); +}; + +enum { + PALMAS_EXT_CONTROL_ENABLE1 = 1, + PALMAS_EXT_CONTROL_ENABLE2 = 2, + PALMAS_EXT_CONTROL_NSLEEP = 4, +}; + +enum palmas_external_requestor_id { + PALMAS_EXTERNAL_REQSTR_ID_REGEN1 = 0, + PALMAS_EXTERNAL_REQSTR_ID_REGEN2 = 1, + PALMAS_EXTERNAL_REQSTR_ID_SYSEN1 = 2, + PALMAS_EXTERNAL_REQSTR_ID_SYSEN2 = 3, + PALMAS_EXTERNAL_REQSTR_ID_CLK32KG = 4, + PALMAS_EXTERNAL_REQSTR_ID_CLK32KGAUDIO = 5, + PALMAS_EXTERNAL_REQSTR_ID_REGEN3 = 6, + PALMAS_EXTERNAL_REQSTR_ID_SMPS12 = 7, + PALMAS_EXTERNAL_REQSTR_ID_SMPS3 = 8, + PALMAS_EXTERNAL_REQSTR_ID_SMPS45 = 9, + PALMAS_EXTERNAL_REQSTR_ID_SMPS6 = 10, + PALMAS_EXTERNAL_REQSTR_ID_SMPS7 = 11, + PALMAS_EXTERNAL_REQSTR_ID_SMPS8 = 12, + PALMAS_EXTERNAL_REQSTR_ID_SMPS9 = 13, + PALMAS_EXTERNAL_REQSTR_ID_SMPS10 = 14, + PALMAS_EXTERNAL_REQSTR_ID_LDO1 = 15, + PALMAS_EXTERNAL_REQSTR_ID_LDO2 = 16, + PALMAS_EXTERNAL_REQSTR_ID_LDO3 = 17, + PALMAS_EXTERNAL_REQSTR_ID_LDO4 = 18, + PALMAS_EXTERNAL_REQSTR_ID_LDO5 = 19, + PALMAS_EXTERNAL_REQSTR_ID_LDO6 = 20, + PALMAS_EXTERNAL_REQSTR_ID_LDO7 = 21, + PALMAS_EXTERNAL_REQSTR_ID_LDO8 = 22, + PALMAS_EXTERNAL_REQSTR_ID_LDO9 = 23, + PALMAS_EXTERNAL_REQSTR_ID_LDOLN = 24, + PALMAS_EXTERNAL_REQSTR_ID_LDOUSB = 25, + PALMAS_EXTERNAL_REQSTR_ID_MAX = 26, +}; + +enum tps65917_irqs { + TPS65917_RESERVED1 = 0, + TPS65917_PWRON_IRQ = 1, + TPS65917_LONG_PRESS_KEY_IRQ = 2, + TPS65917_RESERVED2 = 3, + TPS65917_PWRDOWN_IRQ = 4, + TPS65917_HOTDIE_IRQ = 5, + TPS65917_VSYS_MON_IRQ = 6, + TPS65917_RESERVED3 = 7, + TPS65917_RESERVED4 = 8, + TPS65917_OTP_ERROR_IRQ = 9, + TPS65917_WDT_IRQ = 10, + TPS65917_RESERVED5 = 11, + TPS65917_RESET_IN_IRQ = 12, + TPS65917_FSD_IRQ = 13, + TPS65917_SHORT_IRQ = 14, + TPS65917_RESERVED6 = 15, + TPS65917_GPADC_AUTO_0_IRQ = 16, + TPS65917_GPADC_AUTO_1_IRQ = 17, + TPS65917_GPADC_EOC_SW_IRQ = 18, + TPS65917_RESREVED6 = 19, + TPS65917_RESERVED7 = 20, + TPS65917_RESERVED8 = 21, + TPS65917_RESERVED9 = 22, + TPS65917_VBUS_IRQ = 23, + TPS65917_GPIO_0_IRQ = 24, + TPS65917_GPIO_1_IRQ = 25, + TPS65917_GPIO_2_IRQ = 26, + TPS65917_GPIO_3_IRQ = 27, + TPS65917_GPIO_4_IRQ = 28, + TPS65917_GPIO_5_IRQ = 29, + TPS65917_GPIO_6_IRQ = 30, + TPS65917_RESERVED10 = 31, + TPS65917_NUM_IRQ = 32, +}; + +struct palmas_driver_data { + unsigned int *features; + struct regmap_irq_chip *irq_chip; +}; + +enum { + RC5T583_DS_NONE = 0, + RC5T583_DS_DC0 = 1, + RC5T583_DS_DC1 = 2, + RC5T583_DS_DC2 = 3, + RC5T583_DS_DC3 = 4, + RC5T583_DS_LDO0 = 5, + RC5T583_DS_LDO1 = 6, + RC5T583_DS_LDO2 = 7, + RC5T583_DS_LDO3 = 8, + RC5T583_DS_LDO4 = 9, + RC5T583_DS_LDO5 = 10, + RC5T583_DS_LDO6 = 11, + RC5T583_DS_LDO7 = 12, + RC5T583_DS_LDO8 = 13, + RC5T583_DS_LDO9 = 14, + RC5T583_DS_PSO0 = 15, + RC5T583_DS_PSO1 = 16, + RC5T583_DS_PSO2 = 17, + RC5T583_DS_PSO3 = 18, + RC5T583_DS_PSO4 = 19, + RC5T583_DS_PSO5 = 20, + RC5T583_DS_PSO6 = 21, + RC5T583_DS_PSO7 = 22, + RC5T583_DS_MAX = 23, +}; + +enum { + RC5T583_EXT_PWRREQ1_CONTROL = 1, + RC5T583_EXT_PWRREQ2_CONTROL = 2, +}; + +struct deepsleep_control_data { + u8 reg_add; + u8 ds_pos_bit; +}; + +enum int_type { + SYS_INT = 1, + DCDC_INT = 2, + RTC_INT___2 = 4, + ADC_INT = 8, + GPIO_INT = 16, +}; + +struct rc5t583_irq_data { + u8 int_type; + u8 master_bit; + u8 int_en_bit; + u8 mask_reg_index; + int grp_index; +}; + +enum sec_device_type { + S5M8751X = 0, + S5M8763X = 1, + S5M8767X = 2, + S2MPA01 = 3, + S2MPS11X = 4, + S2MPS13X = 5, + S2MPS14X = 6, + S2MPS15X = 7, + S2MPU02 = 8, +}; + +struct sec_platform_data; + +struct sec_pmic_dev { + struct device *dev; + struct sec_platform_data *pdata; + struct regmap *regmap_pmic; + struct i2c_client *i2c; + long unsigned int device_type; + int irq; + struct regmap_irq_chip_data *irq_data; +}; + +struct sec_regulator_data; + +struct sec_opmode_data; + +struct sec_platform_data { + struct sec_regulator_data *regulators; + struct sec_opmode_data *opmode; + int num_regulators; + int buck_gpios[3]; + int buck_ds[3]; + unsigned int buck2_voltage[8]; + bool buck2_gpiodvs; + unsigned int buck3_voltage[8]; + bool buck3_gpiodvs; + unsigned int buck4_voltage[8]; + bool buck4_gpiodvs; + int buck_default_idx; + int buck_ramp_delay; + bool buck2_ramp_enable; + bool buck3_ramp_enable; + bool buck4_ramp_enable; + int buck2_init; + int buck3_init; + int buck4_init; + bool manual_poweroff; + bool disable_wrstbi; +}; + +struct sec_regulator_data { + int id; + struct regulator_init_data *initdata; + struct device_node *reg_node; + struct gpio_desc *ext_control_gpiod; +}; + +struct sec_opmode_data { + int id; + unsigned int mode; +}; + +enum s2mpa01_reg { + S2MPA01_REG_ID = 0, + S2MPA01_REG_INT1 = 1, + S2MPA01_REG_INT2 = 2, + S2MPA01_REG_INT3 = 3, + S2MPA01_REG_INT1M = 4, + S2MPA01_REG_INT2M = 5, + S2MPA01_REG_INT3M = 6, + S2MPA01_REG_ST1 = 7, + S2MPA01_REG_ST2 = 8, + S2MPA01_REG_PWRONSRC = 9, + S2MPA01_REG_OFFSRC = 10, + S2MPA01_REG_RTC_BUF = 11, + S2MPA01_REG_CTRL1 = 12, + S2MPA01_REG_ETC_TEST = 13, + S2MPA01_REG_RSVD1 = 14, + S2MPA01_REG_BU_CHG = 15, + S2MPA01_REG_RAMP1 = 16, + S2MPA01_REG_RAMP2 = 17, + S2MPA01_REG_LDO_DSCH1 = 18, + S2MPA01_REG_LDO_DSCH2 = 19, + S2MPA01_REG_LDO_DSCH3 = 20, + S2MPA01_REG_LDO_DSCH4 = 21, + S2MPA01_REG_OTP_ADRL = 22, + S2MPA01_REG_OTP_ADRH = 23, + S2MPA01_REG_OTP_DATA = 24, + S2MPA01_REG_MON1SEL = 25, + S2MPA01_REG_MON2SEL = 26, + S2MPA01_REG_LEE = 27, + S2MPA01_REG_RSVD2 = 28, + S2MPA01_REG_RSVD3 = 29, + S2MPA01_REG_RSVD4 = 30, + S2MPA01_REG_RSVD5 = 31, + S2MPA01_REG_RSVD6 = 32, + S2MPA01_REG_TOP_RSVD = 33, + S2MPA01_REG_DVS_SEL = 34, + S2MPA01_REG_DVS_PTR = 35, + S2MPA01_REG_DVS_DATA = 36, + S2MPA01_REG_RSVD_NO = 37, + S2MPA01_REG_UVLO = 38, + S2MPA01_REG_LEE_NO = 39, + S2MPA01_REG_B1CTRL1 = 40, + S2MPA01_REG_B1CTRL2 = 41, + S2MPA01_REG_B2CTRL1 = 42, + S2MPA01_REG_B2CTRL2 = 43, + S2MPA01_REG_B3CTRL1 = 44, + S2MPA01_REG_B3CTRL2 = 45, + S2MPA01_REG_B4CTRL1 = 46, + S2MPA01_REG_B4CTRL2 = 47, + S2MPA01_REG_B5CTRL1 = 48, + S2MPA01_REG_B5CTRL2 = 49, + S2MPA01_REG_B5CTRL3 = 50, + S2MPA01_REG_B5CTRL4 = 51, + S2MPA01_REG_B5CTRL5 = 52, + S2MPA01_REG_B5CTRL6 = 53, + S2MPA01_REG_B6CTRL1 = 54, + S2MPA01_REG_B6CTRL2 = 55, + S2MPA01_REG_B7CTRL1 = 56, + S2MPA01_REG_B7CTRL2 = 57, + S2MPA01_REG_B8CTRL1 = 58, + S2MPA01_REG_B8CTRL2 = 59, + S2MPA01_REG_B9CTRL1 = 60, + S2MPA01_REG_B9CTRL2 = 61, + S2MPA01_REG_B10CTRL1 = 62, + S2MPA01_REG_B10CTRL2 = 63, + S2MPA01_REG_L1CTRL = 64, + S2MPA01_REG_L2CTRL = 65, + S2MPA01_REG_L3CTRL = 66, + S2MPA01_REG_L4CTRL = 67, + S2MPA01_REG_L5CTRL = 68, + S2MPA01_REG_L6CTRL = 69, + S2MPA01_REG_L7CTRL = 70, + S2MPA01_REG_L8CTRL = 71, + S2MPA01_REG_L9CTRL = 72, + S2MPA01_REG_L10CTRL = 73, + S2MPA01_REG_L11CTRL = 74, + S2MPA01_REG_L12CTRL = 75, + S2MPA01_REG_L13CTRL = 76, + S2MPA01_REG_L14CTRL = 77, + S2MPA01_REG_L15CTRL = 78, + S2MPA01_REG_L16CTRL = 79, + S2MPA01_REG_L17CTRL = 80, + S2MPA01_REG_L18CTRL = 81, + S2MPA01_REG_L19CTRL = 82, + S2MPA01_REG_L20CTRL = 83, + S2MPA01_REG_L21CTRL = 84, + S2MPA01_REG_L22CTRL = 85, + S2MPA01_REG_L23CTRL = 86, + S2MPA01_REG_L24CTRL = 87, + S2MPA01_REG_L25CTRL = 88, + S2MPA01_REG_L26CTRL = 89, + S2MPA01_REG_LDO_OVCB1 = 90, + S2MPA01_REG_LDO_OVCB2 = 91, + S2MPA01_REG_LDO_OVCB3 = 92, + S2MPA01_REG_LDO_OVCB4 = 93, +}; + +enum s2mps11_reg { + S2MPS11_REG_ID = 0, + S2MPS11_REG_INT1 = 1, + S2MPS11_REG_INT2 = 2, + S2MPS11_REG_INT3 = 3, + S2MPS11_REG_INT1M = 4, + S2MPS11_REG_INT2M = 5, + S2MPS11_REG_INT3M = 6, + S2MPS11_REG_ST1 = 7, + S2MPS11_REG_ST2 = 8, + S2MPS11_REG_OFFSRC = 9, + S2MPS11_REG_PWRONSRC = 10, + S2MPS11_REG_RTC_CTRL = 11, + S2MPS11_REG_CTRL1 = 12, + S2MPS11_REG_ETC_TEST = 13, + S2MPS11_REG_RSVD3 = 14, + S2MPS11_REG_BU_CHG = 15, + S2MPS11_REG_RAMP = 16, + S2MPS11_REG_RAMP_BUCK = 17, + S2MPS11_REG_LDO1_8 = 18, + S2MPS11_REG_LDO9_16 = 19, + S2MPS11_REG_LDO17_24 = 20, + S2MPS11_REG_LDO25_32 = 21, + S2MPS11_REG_LDO33_38 = 22, + S2MPS11_REG_LDO1_8_1 = 23, + S2MPS11_REG_LDO9_16_1 = 24, + S2MPS11_REG_LDO17_24_1 = 25, + S2MPS11_REG_LDO25_32_1 = 26, + S2MPS11_REG_LDO33_38_1 = 27, + S2MPS11_REG_OTP_ADRL = 28, + S2MPS11_REG_OTP_ADRH = 29, + S2MPS11_REG_OTP_DATA = 30, + S2MPS11_REG_MON1SEL = 31, + S2MPS11_REG_MON2SEL = 32, + S2MPS11_REG_LEE = 33, + S2MPS11_REG_RSVD_NO = 34, + S2MPS11_REG_UVLO = 35, + S2MPS11_REG_LEE_NO = 36, + S2MPS11_REG_B1CTRL1 = 37, + S2MPS11_REG_B1CTRL2 = 38, + S2MPS11_REG_B2CTRL1 = 39, + S2MPS11_REG_B2CTRL2 = 40, + S2MPS11_REG_B3CTRL1 = 41, + S2MPS11_REG_B3CTRL2 = 42, + S2MPS11_REG_B4CTRL1 = 43, + S2MPS11_REG_B4CTRL2 = 44, + S2MPS11_REG_B5CTRL1 = 45, + S2MPS11_REG_BUCK5_SW = 46, + S2MPS11_REG_B5CTRL2 = 47, + S2MPS11_REG_B5CTRL3 = 48, + S2MPS11_REG_B5CTRL4 = 49, + S2MPS11_REG_B5CTRL5 = 50, + S2MPS11_REG_B6CTRL1 = 51, + S2MPS11_REG_B6CTRL2 = 52, + S2MPS11_REG_B7CTRL1 = 53, + S2MPS11_REG_B7CTRL2 = 54, + S2MPS11_REG_B8CTRL1 = 55, + S2MPS11_REG_B8CTRL2 = 56, + S2MPS11_REG_B9CTRL1 = 57, + S2MPS11_REG_B9CTRL2 = 58, + S2MPS11_REG_B10CTRL1 = 59, + S2MPS11_REG_B10CTRL2 = 60, + S2MPS11_REG_L1CTRL = 61, + S2MPS11_REG_L2CTRL = 62, + S2MPS11_REG_L3CTRL = 63, + S2MPS11_REG_L4CTRL = 64, + S2MPS11_REG_L5CTRL = 65, + S2MPS11_REG_L6CTRL = 66, + S2MPS11_REG_L7CTRL = 67, + S2MPS11_REG_L8CTRL = 68, + S2MPS11_REG_L9CTRL = 69, + S2MPS11_REG_L10CTRL = 70, + S2MPS11_REG_L11CTRL = 71, + S2MPS11_REG_L12CTRL = 72, + S2MPS11_REG_L13CTRL = 73, + S2MPS11_REG_L14CTRL = 74, + S2MPS11_REG_L15CTRL = 75, + S2MPS11_REG_L16CTRL = 76, + S2MPS11_REG_L17CTRL = 77, + S2MPS11_REG_L18CTRL = 78, + S2MPS11_REG_L19CTRL = 79, + S2MPS11_REG_L20CTRL = 80, + S2MPS11_REG_L21CTRL = 81, + S2MPS11_REG_L22CTRL = 82, + S2MPS11_REG_L23CTRL = 83, + S2MPS11_REG_L24CTRL = 84, + S2MPS11_REG_L25CTRL = 85, + S2MPS11_REG_L26CTRL = 86, + S2MPS11_REG_L27CTRL = 87, + S2MPS11_REG_L28CTRL = 88, + S2MPS11_REG_L29CTRL = 89, + S2MPS11_REG_L30CTRL = 90, + S2MPS11_REG_L31CTRL = 91, + S2MPS11_REG_L32CTRL = 92, + S2MPS11_REG_L33CTRL = 93, + S2MPS11_REG_L34CTRL = 94, + S2MPS11_REG_L35CTRL = 95, + S2MPS11_REG_L36CTRL = 96, + S2MPS11_REG_L37CTRL = 97, + S2MPS11_REG_L38CTRL = 98, +}; + +enum s2mps13_reg { + S2MPS13_REG_ID = 0, + S2MPS13_REG_INT1 = 1, + S2MPS13_REG_INT2 = 2, + S2MPS13_REG_INT3 = 3, + S2MPS13_REG_INT1M = 4, + S2MPS13_REG_INT2M = 5, + S2MPS13_REG_INT3M = 6, + S2MPS13_REG_ST1 = 7, + S2MPS13_REG_ST2 = 8, + S2MPS13_REG_PWRONSRC = 9, + S2MPS13_REG_OFFSRC = 10, + S2MPS13_REG_BU_CHG = 11, + S2MPS13_REG_RTCCTRL = 12, + S2MPS13_REG_CTRL1 = 13, + S2MPS13_REG_CTRL2 = 14, + S2MPS13_REG_RSVD1 = 15, + S2MPS13_REG_RSVD2 = 16, + S2MPS13_REG_RSVD3 = 17, + S2MPS13_REG_RSVD4 = 18, + S2MPS13_REG_RSVD5 = 19, + S2MPS13_REG_RSVD6 = 20, + S2MPS13_REG_CTRL3 = 21, + S2MPS13_REG_RSVD7 = 22, + S2MPS13_REG_RSVD8 = 23, + S2MPS13_REG_WRSTBI = 24, + S2MPS13_REG_B1CTRL = 25, + S2MPS13_REG_B1OUT = 26, + S2MPS13_REG_B2CTRL = 27, + S2MPS13_REG_B2OUT = 28, + S2MPS13_REG_B3CTRL = 29, + S2MPS13_REG_B3OUT = 30, + S2MPS13_REG_B4CTRL = 31, + S2MPS13_REG_B4OUT = 32, + S2MPS13_REG_B5CTRL = 33, + S2MPS13_REG_B5OUT = 34, + S2MPS13_REG_B6CTRL = 35, + S2MPS13_REG_B6OUT = 36, + S2MPS13_REG_B7CTRL = 37, + S2MPS13_REG_B7SW = 38, + S2MPS13_REG_B7OUT = 39, + S2MPS13_REG_B8CTRL = 40, + S2MPS13_REG_B8OUT = 41, + S2MPS13_REG_B9CTRL = 42, + S2MPS13_REG_B9OUT = 43, + S2MPS13_REG_B10CTRL = 44, + S2MPS13_REG_B10OUT = 45, + S2MPS13_REG_BB1CTRL = 46, + S2MPS13_REG_BB1OUT = 47, + S2MPS13_REG_BUCK_RAMP1 = 48, + S2MPS13_REG_BUCK_RAMP2 = 49, + S2MPS13_REG_LDO_DVS1 = 50, + S2MPS13_REG_LDO_DVS2 = 51, + S2MPS13_REG_LDO_DVS3 = 52, + S2MPS13_REG_B6OUT2 = 53, + S2MPS13_REG_L1CTRL = 54, + S2MPS13_REG_L2CTRL = 55, + S2MPS13_REG_L3CTRL = 56, + S2MPS13_REG_L4CTRL = 57, + S2MPS13_REG_L5CTRL = 58, + S2MPS13_REG_L6CTRL = 59, + S2MPS13_REG_L7CTRL = 60, + S2MPS13_REG_L8CTRL = 61, + S2MPS13_REG_L9CTRL = 62, + S2MPS13_REG_L10CTRL = 63, + S2MPS13_REG_L11CTRL = 64, + S2MPS13_REG_L12CTRL = 65, + S2MPS13_REG_L13CTRL = 66, + S2MPS13_REG_L14CTRL = 67, + S2MPS13_REG_L15CTRL = 68, + S2MPS13_REG_L16CTRL = 69, + S2MPS13_REG_L17CTRL = 70, + S2MPS13_REG_L18CTRL = 71, + S2MPS13_REG_L19CTRL = 72, + S2MPS13_REG_L20CTRL = 73, + S2MPS13_REG_L21CTRL = 74, + S2MPS13_REG_L22CTRL = 75, + S2MPS13_REG_L23CTRL = 76, + S2MPS13_REG_L24CTRL = 77, + S2MPS13_REG_L25CTRL = 78, + S2MPS13_REG_L26CTRL = 79, + S2MPS13_REG_L27CTRL = 80, + S2MPS13_REG_L28CTRL = 81, + S2MPS13_REG_L29CTRL = 82, + S2MPS13_REG_L30CTRL = 83, + S2MPS13_REG_L31CTRL = 84, + S2MPS13_REG_L32CTRL = 85, + S2MPS13_REG_L33CTRL = 86, + S2MPS13_REG_L34CTRL = 87, + S2MPS13_REG_L35CTRL = 88, + S2MPS13_REG_L36CTRL = 89, + S2MPS13_REG_L37CTRL = 90, + S2MPS13_REG_L38CTRL = 91, + S2MPS13_REG_L39CTRL = 92, + S2MPS13_REG_L40CTRL = 93, + S2MPS13_REG_LDODSCH1 = 94, + S2MPS13_REG_LDODSCH2 = 95, + S2MPS13_REG_LDODSCH3 = 96, + S2MPS13_REG_LDODSCH4 = 97, + S2MPS13_REG_LDODSCH5 = 98, +}; + +enum s2mps14_reg { + S2MPS14_REG_ID = 0, + S2MPS14_REG_INT1 = 1, + S2MPS14_REG_INT2 = 2, + S2MPS14_REG_INT3 = 3, + S2MPS14_REG_INT1M = 4, + S2MPS14_REG_INT2M = 5, + S2MPS14_REG_INT3M = 6, + S2MPS14_REG_ST1 = 7, + S2MPS14_REG_ST2 = 8, + S2MPS14_REG_PWRONSRC = 9, + S2MPS14_REG_OFFSRC = 10, + S2MPS14_REG_BU_CHG = 11, + S2MPS14_REG_RTCCTRL = 12, + S2MPS14_REG_CTRL1 = 13, + S2MPS14_REG_CTRL2 = 14, + S2MPS14_REG_RSVD1 = 15, + S2MPS14_REG_RSVD2 = 16, + S2MPS14_REG_RSVD3 = 17, + S2MPS14_REG_RSVD4 = 18, + S2MPS14_REG_RSVD5 = 19, + S2MPS14_REG_RSVD6 = 20, + S2MPS14_REG_CTRL3 = 21, + S2MPS14_REG_RSVD7 = 22, + S2MPS14_REG_RSVD8 = 23, + S2MPS14_REG_WRSTBI = 24, + S2MPS14_REG_B1CTRL1 = 25, + S2MPS14_REG_B1CTRL2 = 26, + S2MPS14_REG_B2CTRL1 = 27, + S2MPS14_REG_B2CTRL2 = 28, + S2MPS14_REG_B3CTRL1 = 29, + S2MPS14_REG_B3CTRL2 = 30, + S2MPS14_REG_B4CTRL1 = 31, + S2MPS14_REG_B4CTRL2 = 32, + S2MPS14_REG_B5CTRL1 = 33, + S2MPS14_REG_B5CTRL2 = 34, + S2MPS14_REG_L1CTRL = 35, + S2MPS14_REG_L2CTRL = 36, + S2MPS14_REG_L3CTRL = 37, + S2MPS14_REG_L4CTRL = 38, + S2MPS14_REG_L5CTRL = 39, + S2MPS14_REG_L6CTRL = 40, + S2MPS14_REG_L7CTRL = 41, + S2MPS14_REG_L8CTRL = 42, + S2MPS14_REG_L9CTRL = 43, + S2MPS14_REG_L10CTRL = 44, + S2MPS14_REG_L11CTRL = 45, + S2MPS14_REG_L12CTRL = 46, + S2MPS14_REG_L13CTRL = 47, + S2MPS14_REG_L14CTRL = 48, + S2MPS14_REG_L15CTRL = 49, + S2MPS14_REG_L16CTRL = 50, + S2MPS14_REG_L17CTRL = 51, + S2MPS14_REG_L18CTRL = 52, + S2MPS14_REG_L19CTRL = 53, + S2MPS14_REG_L20CTRL = 54, + S2MPS14_REG_L21CTRL = 55, + S2MPS14_REG_L22CTRL = 56, + S2MPS14_REG_L23CTRL = 57, + S2MPS14_REG_L24CTRL = 58, + S2MPS14_REG_L25CTRL = 59, + S2MPS14_REG_LDODSCH1 = 60, + S2MPS14_REG_LDODSCH2 = 61, + S2MPS14_REG_LDODSCH3 = 62, +}; + +enum s2mps15_reg { + S2MPS15_REG_ID = 0, + S2MPS15_REG_INT1 = 1, + S2MPS15_REG_INT2 = 2, + S2MPS15_REG_INT3 = 3, + S2MPS15_REG_INT1M = 4, + S2MPS15_REG_INT2M = 5, + S2MPS15_REG_INT3M = 6, + S2MPS15_REG_ST1 = 7, + S2MPS15_REG_ST2 = 8, + S2MPS15_REG_PWRONSRC = 9, + S2MPS15_REG_OFFSRC = 10, + S2MPS15_REG_BU_CHG = 11, + S2MPS15_REG_RTC_BUF = 12, + S2MPS15_REG_CTRL1 = 13, + S2MPS15_REG_CTRL2 = 14, + S2MPS15_REG_RSVD1 = 15, + S2MPS15_REG_RSVD2 = 16, + S2MPS15_REG_RSVD3 = 17, + S2MPS15_REG_RSVD4 = 18, + S2MPS15_REG_RSVD5 = 19, + S2MPS15_REG_RSVD6 = 20, + S2MPS15_REG_CTRL3 = 21, + S2MPS15_REG_RSVD7 = 22, + S2MPS15_REG_RSVD8 = 23, + S2MPS15_REG_RSVD9 = 24, + S2MPS15_REG_B1CTRL1 = 25, + S2MPS15_REG_B1CTRL2 = 26, + S2MPS15_REG_B2CTRL1 = 27, + S2MPS15_REG_B2CTRL2 = 28, + S2MPS15_REG_B3CTRL1 = 29, + S2MPS15_REG_B3CTRL2 = 30, + S2MPS15_REG_B4CTRL1 = 31, + S2MPS15_REG_B4CTRL2 = 32, + S2MPS15_REG_B5CTRL1 = 33, + S2MPS15_REG_B5CTRL2 = 34, + S2MPS15_REG_B6CTRL1 = 35, + S2MPS15_REG_B6CTRL2 = 36, + S2MPS15_REG_B7CTRL1 = 37, + S2MPS15_REG_B7CTRL2 = 38, + S2MPS15_REG_B8CTRL1 = 39, + S2MPS15_REG_B8CTRL2 = 40, + S2MPS15_REG_B9CTRL1 = 41, + S2MPS15_REG_B9CTRL2 = 42, + S2MPS15_REG_B10CTRL1 = 43, + S2MPS15_REG_B10CTRL2 = 44, + S2MPS15_REG_BBCTRL1 = 45, + S2MPS15_REG_BBCTRL2 = 46, + S2MPS15_REG_BRAMP = 47, + S2MPS15_REG_LDODVS1 = 48, + S2MPS15_REG_LDODVS2 = 49, + S2MPS15_REG_LDODVS3 = 50, + S2MPS15_REG_LDODVS4 = 51, + S2MPS15_REG_L1CTRL = 52, + S2MPS15_REG_L2CTRL = 53, + S2MPS15_REG_L3CTRL = 54, + S2MPS15_REG_L4CTRL = 55, + S2MPS15_REG_L5CTRL = 56, + S2MPS15_REG_L6CTRL = 57, + S2MPS15_REG_L7CTRL = 58, + S2MPS15_REG_L8CTRL = 59, + S2MPS15_REG_L9CTRL = 60, + S2MPS15_REG_L10CTRL = 61, + S2MPS15_REG_L11CTRL = 62, + S2MPS15_REG_L12CTRL = 63, + S2MPS15_REG_L13CTRL = 64, + S2MPS15_REG_L14CTRL = 65, + S2MPS15_REG_L15CTRL = 66, + S2MPS15_REG_L16CTRL = 67, + S2MPS15_REG_L17CTRL = 68, + S2MPS15_REG_L18CTRL = 69, + S2MPS15_REG_L19CTRL = 70, + S2MPS15_REG_L20CTRL = 71, + S2MPS15_REG_L21CTRL = 72, + S2MPS15_REG_L22CTRL = 73, + S2MPS15_REG_L23CTRL = 74, + S2MPS15_REG_L24CTRL = 75, + S2MPS15_REG_L25CTRL = 76, + S2MPS15_REG_L26CTRL = 77, + S2MPS15_REG_L27CTRL = 78, + S2MPS15_REG_LDODSCH1 = 79, + S2MPS15_REG_LDODSCH2 = 80, + S2MPS15_REG_LDODSCH3 = 81, + S2MPS15_REG_LDODSCH4 = 82, +}; + +enum S2MPU02_reg { + S2MPU02_REG_ID = 0, + S2MPU02_REG_INT1 = 1, + S2MPU02_REG_INT2 = 2, + S2MPU02_REG_INT3 = 3, + S2MPU02_REG_INT1M = 4, + S2MPU02_REG_INT2M = 5, + S2MPU02_REG_INT3M = 6, + S2MPU02_REG_ST1 = 7, + S2MPU02_REG_ST2 = 8, + S2MPU02_REG_PWRONSRC = 9, + S2MPU02_REG_OFFSRC = 10, + S2MPU02_REG_BU_CHG = 11, + S2MPU02_REG_RTCCTRL = 12, + S2MPU02_REG_PMCTRL1 = 13, + S2MPU02_REG_RSVD1 = 14, + S2MPU02_REG_RSVD2 = 15, + S2MPU02_REG_RSVD3 = 16, + S2MPU02_REG_RSVD4 = 17, + S2MPU02_REG_RSVD5 = 18, + S2MPU02_REG_RSVD6 = 19, + S2MPU02_REG_RSVD7 = 20, + S2MPU02_REG_WRSTEN = 21, + S2MPU02_REG_RSVD8 = 22, + S2MPU02_REG_RSVD9 = 23, + S2MPU02_REG_RSVD10 = 24, + S2MPU02_REG_B1CTRL1 = 25, + S2MPU02_REG_B1CTRL2 = 26, + S2MPU02_REG_B2CTRL1 = 27, + S2MPU02_REG_B2CTRL2 = 28, + S2MPU02_REG_B3CTRL1 = 29, + S2MPU02_REG_B3CTRL2 = 30, + S2MPU02_REG_B4CTRL1 = 31, + S2MPU02_REG_B4CTRL2 = 32, + S2MPU02_REG_B5CTRL1 = 33, + S2MPU02_REG_B5CTRL2 = 34, + S2MPU02_REG_B5CTRL3 = 35, + S2MPU02_REG_B5CTRL4 = 36, + S2MPU02_REG_B5CTRL5 = 37, + S2MPU02_REG_B6CTRL1 = 38, + S2MPU02_REG_B6CTRL2 = 39, + S2MPU02_REG_B7CTRL1 = 40, + S2MPU02_REG_B7CTRL2 = 41, + S2MPU02_REG_RAMP1 = 42, + S2MPU02_REG_RAMP2 = 43, + S2MPU02_REG_L1CTRL = 44, + S2MPU02_REG_L2CTRL1 = 45, + S2MPU02_REG_L2CTRL2 = 46, + S2MPU02_REG_L2CTRL3 = 47, + S2MPU02_REG_L2CTRL4 = 48, + S2MPU02_REG_L3CTRL = 49, + S2MPU02_REG_L4CTRL = 50, + S2MPU02_REG_L5CTRL = 51, + S2MPU02_REG_L6CTRL = 52, + S2MPU02_REG_L7CTRL = 53, + S2MPU02_REG_L8CTRL = 54, + S2MPU02_REG_L9CTRL = 55, + S2MPU02_REG_L10CTRL = 56, + S2MPU02_REG_L11CTRL = 57, + S2MPU02_REG_L12CTRL = 58, + S2MPU02_REG_L13CTRL = 59, + S2MPU02_REG_L14CTRL = 60, + S2MPU02_REG_L15CTRL = 61, + S2MPU02_REG_L16CTRL = 62, + S2MPU02_REG_L17CTRL = 63, + S2MPU02_REG_L18CTRL = 64, + S2MPU02_REG_L19CTRL = 65, + S2MPU02_REG_L20CTRL = 66, + S2MPU02_REG_L21CTRL = 67, + S2MPU02_REG_L22CTRL = 68, + S2MPU02_REG_L23CTRL = 69, + S2MPU02_REG_L24CTRL = 70, + S2MPU02_REG_L25CTRL = 71, + S2MPU02_REG_L26CTRL = 72, + S2MPU02_REG_L27CTRL = 73, + S2MPU02_REG_L28CTRL = 74, + S2MPU02_REG_LDODSCH1 = 75, + S2MPU02_REG_LDODSCH2 = 76, + S2MPU02_REG_LDODSCH3 = 77, + S2MPU02_REG_LDODSCH4 = 78, + S2MPU02_REG_SELMIF = 79, + S2MPU02_REG_RSVD11 = 80, + S2MPU02_REG_RSVD12 = 81, + S2MPU02_REG_RSVD13 = 82, + S2MPU02_REG_DVSSEL = 83, + S2MPU02_REG_DVSPTR = 84, + S2MPU02_REG_DVSDATA = 85, +}; + +enum s5m8763_reg { + S5M8763_REG_IRQ1 = 0, + S5M8763_REG_IRQ2 = 1, + S5M8763_REG_IRQ3 = 2, + S5M8763_REG_IRQ4 = 3, + S5M8763_REG_IRQM1 = 4, + S5M8763_REG_IRQM2 = 5, + S5M8763_REG_IRQM3 = 6, + S5M8763_REG_IRQM4 = 7, + S5M8763_REG_STATUS1 = 8, + S5M8763_REG_STATUS2 = 9, + S5M8763_REG_STATUSM1 = 10, + S5M8763_REG_STATUSM2 = 11, + S5M8763_REG_CHGR1 = 12, + S5M8763_REG_CHGR2 = 13, + S5M8763_REG_LDO_ACTIVE_DISCHARGE1 = 14, + S5M8763_REG_LDO_ACTIVE_DISCHARGE2 = 15, + S5M8763_REG_BUCK_ACTIVE_DISCHARGE3 = 16, + S5M8763_REG_ONOFF1 = 17, + S5M8763_REG_ONOFF2 = 18, + S5M8763_REG_ONOFF3 = 19, + S5M8763_REG_ONOFF4 = 20, + S5M8763_REG_BUCK1_VOLTAGE1 = 21, + S5M8763_REG_BUCK1_VOLTAGE2 = 22, + S5M8763_REG_BUCK1_VOLTAGE3 = 23, + S5M8763_REG_BUCK1_VOLTAGE4 = 24, + S5M8763_REG_BUCK2_VOLTAGE1 = 25, + S5M8763_REG_BUCK2_VOLTAGE2 = 26, + S5M8763_REG_BUCK3 = 27, + S5M8763_REG_BUCK4 = 28, + S5M8763_REG_LDO1_LDO2 = 29, + S5M8763_REG_LDO3 = 30, + S5M8763_REG_LDO4 = 31, + S5M8763_REG_LDO5 = 32, + S5M8763_REG_LDO6 = 33, + S5M8763_REG_LDO7 = 34, + S5M8763_REG_LDO7_LDO8 = 35, + S5M8763_REG_LDO9_LDO10 = 36, + S5M8763_REG_LDO11 = 37, + S5M8763_REG_LDO12 = 38, + S5M8763_REG_LDO13 = 39, + S5M8763_REG_LDO14 = 40, + S5M8763_REG_LDO15 = 41, + S5M8763_REG_LDO16 = 42, + S5M8763_REG_BKCHR = 43, + S5M8763_REG_LBCNFG1 = 44, + S5M8763_REG_LBCNFG2 = 45, +}; + +enum s5m8767_reg { + S5M8767_REG_ID = 0, + S5M8767_REG_INT1 = 1, + S5M8767_REG_INT2 = 2, + S5M8767_REG_INT3 = 3, + S5M8767_REG_INT1M = 4, + S5M8767_REG_INT2M = 5, + S5M8767_REG_INT3M = 6, + S5M8767_REG_STATUS1 = 7, + S5M8767_REG_STATUS2 = 8, + S5M8767_REG_STATUS3 = 9, + S5M8767_REG_CTRL1 = 10, + S5M8767_REG_CTRL2 = 11, + S5M8767_REG_LOWBAT1 = 12, + S5M8767_REG_LOWBAT2 = 13, + S5M8767_REG_BUCHG = 14, + S5M8767_REG_DVSRAMP = 15, + S5M8767_REG_DVSTIMER2 = 16, + S5M8767_REG_DVSTIMER3 = 17, + S5M8767_REG_DVSTIMER4 = 18, + S5M8767_REG_LDO1 = 19, + S5M8767_REG_LDO2 = 20, + S5M8767_REG_LDO3 = 21, + S5M8767_REG_LDO4 = 22, + S5M8767_REG_LDO5 = 23, + S5M8767_REG_LDO6 = 24, + S5M8767_REG_LDO7 = 25, + S5M8767_REG_LDO8 = 26, + S5M8767_REG_LDO9 = 27, + S5M8767_REG_LDO10 = 28, + S5M8767_REG_LDO11 = 29, + S5M8767_REG_LDO12 = 30, + S5M8767_REG_LDO13 = 31, + S5M8767_REG_LDO14 = 32, + S5M8767_REG_LDO15 = 33, + S5M8767_REG_LDO16 = 34, + S5M8767_REG_LDO17 = 35, + S5M8767_REG_LDO18 = 36, + S5M8767_REG_LDO19 = 37, + S5M8767_REG_LDO20 = 38, + S5M8767_REG_LDO21 = 39, + S5M8767_REG_LDO22 = 40, + S5M8767_REG_LDO23 = 41, + S5M8767_REG_LDO24 = 42, + S5M8767_REG_LDO25 = 43, + S5M8767_REG_LDO26 = 44, + S5M8767_REG_LDO27 = 45, + S5M8767_REG_LDO28 = 46, + S5M8767_REG_UVLO = 49, + S5M8767_REG_BUCK1CTRL1 = 50, + S5M8767_REG_BUCK1CTRL2 = 51, + S5M8767_REG_BUCK2CTRL = 52, + S5M8767_REG_BUCK2DVS1 = 53, + S5M8767_REG_BUCK2DVS2 = 54, + S5M8767_REG_BUCK2DVS3 = 55, + S5M8767_REG_BUCK2DVS4 = 56, + S5M8767_REG_BUCK2DVS5 = 57, + S5M8767_REG_BUCK2DVS6 = 58, + S5M8767_REG_BUCK2DVS7 = 59, + S5M8767_REG_BUCK2DVS8 = 60, + S5M8767_REG_BUCK3CTRL = 61, + S5M8767_REG_BUCK3DVS1 = 62, + S5M8767_REG_BUCK3DVS2 = 63, + S5M8767_REG_BUCK3DVS3 = 64, + S5M8767_REG_BUCK3DVS4 = 65, + S5M8767_REG_BUCK3DVS5 = 66, + S5M8767_REG_BUCK3DVS6 = 67, + S5M8767_REG_BUCK3DVS7 = 68, + S5M8767_REG_BUCK3DVS8 = 69, + S5M8767_REG_BUCK4CTRL = 70, + S5M8767_REG_BUCK4DVS1 = 71, + S5M8767_REG_BUCK4DVS2 = 72, + S5M8767_REG_BUCK4DVS3 = 73, + S5M8767_REG_BUCK4DVS4 = 74, + S5M8767_REG_BUCK4DVS5 = 75, + S5M8767_REG_BUCK4DVS6 = 76, + S5M8767_REG_BUCK4DVS7 = 77, + S5M8767_REG_BUCK4DVS8 = 78, + S5M8767_REG_BUCK5CTRL1 = 79, + S5M8767_REG_BUCK5CTRL2 = 80, + S5M8767_REG_BUCK5CTRL3 = 81, + S5M8767_REG_BUCK5CTRL4 = 82, + S5M8767_REG_BUCK5CTRL5 = 83, + S5M8767_REG_BUCK6CTRL1 = 84, + S5M8767_REG_BUCK6CTRL2 = 85, + S5M8767_REG_BUCK7CTRL1 = 86, + S5M8767_REG_BUCK7CTRL2 = 87, + S5M8767_REG_BUCK8CTRL1 = 88, + S5M8767_REG_BUCK8CTRL2 = 89, + S5M8767_REG_BUCK9CTRL1 = 90, + S5M8767_REG_BUCK9CTRL2 = 91, + S5M8767_REG_LDO1CTRL = 92, + S5M8767_REG_LDO2_1CTRL = 93, + S5M8767_REG_LDO2_2CTRL = 94, + S5M8767_REG_LDO2_3CTRL = 95, + S5M8767_REG_LDO2_4CTRL = 96, + S5M8767_REG_LDO3CTRL = 97, + S5M8767_REG_LDO4CTRL = 98, + S5M8767_REG_LDO5CTRL = 99, + S5M8767_REG_LDO6CTRL = 100, + S5M8767_REG_LDO7CTRL = 101, + S5M8767_REG_LDO8CTRL = 102, + S5M8767_REG_LDO9CTRL = 103, + S5M8767_REG_LDO10CTRL = 104, + S5M8767_REG_LDO11CTRL = 105, + S5M8767_REG_LDO12CTRL = 106, + S5M8767_REG_LDO13CTRL = 107, + S5M8767_REG_LDO14CTRL = 108, + S5M8767_REG_LDO15CTRL = 109, + S5M8767_REG_LDO16CTRL = 110, + S5M8767_REG_LDO17CTRL = 111, + S5M8767_REG_LDO18CTRL = 112, + S5M8767_REG_LDO19CTRL = 113, + S5M8767_REG_LDO20CTRL = 114, + S5M8767_REG_LDO21CTRL = 115, + S5M8767_REG_LDO22CTRL = 116, + S5M8767_REG_LDO23CTRL = 117, + S5M8767_REG_LDO24CTRL = 118, + S5M8767_REG_LDO25CTRL = 119, + S5M8767_REG_LDO26CTRL = 120, + S5M8767_REG_LDO27CTRL = 121, + S5M8767_REG_LDO28CTRL = 122, +}; + +enum s2mps11_irq { + S2MPS11_IRQ_PWRONF = 0, + S2MPS11_IRQ_PWRONR = 1, + S2MPS11_IRQ_JIGONBF = 2, + S2MPS11_IRQ_JIGONBR = 3, + S2MPS11_IRQ_ACOKBF = 4, + S2MPS11_IRQ_ACOKBR = 5, + S2MPS11_IRQ_PWRON1S = 6, + S2MPS11_IRQ_MRB = 7, + S2MPS11_IRQ_RTC60S = 8, + S2MPS11_IRQ_RTCA1 = 9, + S2MPS11_IRQ_RTCA0 = 10, + S2MPS11_IRQ_SMPL = 11, + S2MPS11_IRQ_RTC1S = 12, + S2MPS11_IRQ_WTSR = 13, + S2MPS11_IRQ_INT120C = 14, + S2MPS11_IRQ_INT140C = 15, + S2MPS11_IRQ_NR = 16, +}; + +enum s2mps14_irq { + S2MPS14_IRQ_PWRONF = 0, + S2MPS14_IRQ_PWRONR = 1, + S2MPS14_IRQ_JIGONBF = 2, + S2MPS14_IRQ_JIGONBR = 3, + S2MPS14_IRQ_ACOKBF = 4, + S2MPS14_IRQ_ACOKBR = 5, + S2MPS14_IRQ_PWRON1S = 6, + S2MPS14_IRQ_MRB = 7, + S2MPS14_IRQ_RTC60S = 8, + S2MPS14_IRQ_RTCA1 = 9, + S2MPS14_IRQ_RTCA0 = 10, + S2MPS14_IRQ_SMPL = 11, + S2MPS14_IRQ_RTC1S = 12, + S2MPS14_IRQ_WTSR = 13, + S2MPS14_IRQ_INT120C = 14, + S2MPS14_IRQ_INT140C = 15, + S2MPS14_IRQ_TSD = 16, + S2MPS14_IRQ_NR = 17, +}; + +enum s2mpu02_irq { + S2MPU02_IRQ_PWRONF = 0, + S2MPU02_IRQ_PWRONR = 1, + S2MPU02_IRQ_JIGONBF = 2, + S2MPU02_IRQ_JIGONBR = 3, + S2MPU02_IRQ_ACOKBF = 4, + S2MPU02_IRQ_ACOKBR = 5, + S2MPU02_IRQ_PWRON1S = 6, + S2MPU02_IRQ_MRB = 7, + S2MPU02_IRQ_RTC60S = 8, + S2MPU02_IRQ_RTCA1 = 9, + S2MPU02_IRQ_RTCA0 = 10, + S2MPU02_IRQ_SMPL = 11, + S2MPU02_IRQ_RTC1S = 12, + S2MPU02_IRQ_WTSR = 13, + S2MPU02_IRQ_INT120C = 14, + S2MPU02_IRQ_INT140C = 15, + S2MPU02_IRQ_TSD = 16, + S2MPU02_IRQ_NR = 17, +}; + +enum s5m8767_irq { + S5M8767_IRQ_PWRR = 0, + S5M8767_IRQ_PWRF = 1, + S5M8767_IRQ_PWR1S = 2, + S5M8767_IRQ_JIGR = 3, + S5M8767_IRQ_JIGF = 4, + S5M8767_IRQ_LOWBAT2 = 5, + S5M8767_IRQ_LOWBAT1 = 6, + S5M8767_IRQ_MRB = 7, + S5M8767_IRQ_DVSOK2 = 8, + S5M8767_IRQ_DVSOK3 = 9, + S5M8767_IRQ_DVSOK4 = 10, + S5M8767_IRQ_RTC60S = 11, + S5M8767_IRQ_RTCA1 = 12, + S5M8767_IRQ_RTCA2 = 13, + S5M8767_IRQ_SMPL = 14, + S5M8767_IRQ_RTC1S = 15, + S5M8767_IRQ_WTSR = 16, + S5M8767_IRQ_NR = 17, +}; + +enum s5m8763_irq { + S5M8763_IRQ_DCINF = 0, + S5M8763_IRQ_DCINR = 1, + S5M8763_IRQ_JIGF = 2, + S5M8763_IRQ_JIGR = 3, + S5M8763_IRQ_PWRONF = 4, + S5M8763_IRQ_PWRONR = 5, + S5M8763_IRQ_WTSREVNT = 6, + S5M8763_IRQ_SMPLEVNT = 7, + S5M8763_IRQ_ALARM1 = 8, + S5M8763_IRQ_ALARM0 = 9, + S5M8763_IRQ_ONKEY1S = 10, + S5M8763_IRQ_TOPOFFR = 11, + S5M8763_IRQ_DCINOVPR = 12, + S5M8763_IRQ_CHGRSTF = 13, + S5M8763_IRQ_DONER = 14, + S5M8763_IRQ_CHGFAULT = 15, + S5M8763_IRQ_LOBAT1 = 16, + S5M8763_IRQ_LOBAT2 = 17, + S5M8763_IRQ_NR = 18, +}; + +struct syscon_platform_data { + const char *label; +}; + +struct syscon { + struct device_node *np; + struct regmap *regmap; + struct list_head list; +}; + +enum { + AS3711_REGULATOR_SD_1 = 0, + AS3711_REGULATOR_SD_2 = 1, + AS3711_REGULATOR_SD_3 = 2, + AS3711_REGULATOR_SD_4 = 3, + AS3711_REGULATOR_LDO_1 = 4, + AS3711_REGULATOR_LDO_2 = 5, + AS3711_REGULATOR_LDO_3 = 6, + AS3711_REGULATOR_LDO_4 = 7, + AS3711_REGULATOR_LDO_5 = 8, + AS3711_REGULATOR_LDO_6 = 9, + AS3711_REGULATOR_LDO_7 = 10, + AS3711_REGULATOR_LDO_8 = 11, + AS3711_REGULATOR_MAX = 12, +}; + +struct as3711 { + struct device *dev; + struct regmap *regmap; +}; + +enum as3711_su2_feedback { + AS3711_SU2_VOLTAGE = 0, + AS3711_SU2_CURR1 = 1, + AS3711_SU2_CURR2 = 2, + AS3711_SU2_CURR3 = 3, + AS3711_SU2_CURR_AUTO = 4, +}; + +enum as3711_su2_fbprot { + AS3711_SU2_LX_SD4 = 0, + AS3711_SU2_GPIO2 = 1, + AS3711_SU2_GPIO3 = 2, + AS3711_SU2_GPIO4 = 3, +}; + +struct as3711_regulator_pdata { + struct regulator_init_data *init_data[12]; +}; + +struct as3711_bl_pdata { + bool su1_fb; + int su1_max_uA; + bool su2_fb; + int su2_max_uA; + enum as3711_su2_feedback su2_feedback; + enum as3711_su2_fbprot su2_fbprot; + bool su2_auto_curr1; + bool su2_auto_curr2; + bool su2_auto_curr3; +}; + +struct as3711_platform_data { + struct as3711_regulator_pdata regulator; + struct as3711_bl_pdata backlight; +}; + +enum { + AS3711_REGULATOR = 0, + AS3711_BACKLIGHT = 1, +}; + +enum as3722_irq { + AS3722_IRQ_LID = 0, + AS3722_IRQ_ACOK = 1, + AS3722_IRQ_ENABLE1 = 2, + AS3722_IRQ_OCCUR_ALARM_SD0 = 3, + AS3722_IRQ_ONKEY_LONG_PRESS = 4, + AS3722_IRQ_ONKEY = 5, + AS3722_IRQ_OVTMP = 6, + AS3722_IRQ_LOWBAT = 7, + AS3722_IRQ_SD0_LV = 8, + AS3722_IRQ_SD1_LV = 9, + AS3722_IRQ_SD2_LV = 10, + AS3722_IRQ_PWM1_OV_PROT = 11, + AS3722_IRQ_PWM2_OV_PROT = 12, + AS3722_IRQ_ENABLE2 = 13, + AS3722_IRQ_SD6_LV = 14, + AS3722_IRQ_RTC_REP = 15, + AS3722_IRQ_RTC_ALARM = 16, + AS3722_IRQ_GPIO1 = 17, + AS3722_IRQ_GPIO2 = 18, + AS3722_IRQ_GPIO3 = 19, + AS3722_IRQ_GPIO4 = 20, + AS3722_IRQ_GPIO5 = 21, + AS3722_IRQ_WATCHDOG = 22, + AS3722_IRQ_ENABLE3 = 23, + AS3722_IRQ_TEMP_SD0_SHUTDOWN = 24, + AS3722_IRQ_TEMP_SD1_SHUTDOWN = 25, + AS3722_IRQ_TEMP_SD2_SHUTDOWN = 26, + AS3722_IRQ_TEMP_SD0_ALARM = 27, + AS3722_IRQ_TEMP_SD1_ALARM = 28, + AS3722_IRQ_TEMP_SD6_ALARM = 29, + AS3722_IRQ_OCCUR_ALARM_SD6 = 30, + AS3722_IRQ_ADC = 31, + AS3722_IRQ_MAX = 32, +}; + +struct altr_a10sr { + struct device *dev; + struct regmap *regmap; +}; + +struct altr_sysmgr { + struct regmap *regmap; +}; + +struct badrange { + struct list_head list; + spinlock_t lock; +}; + +enum { + NDD_ALIASING = 0, + NDD_UNARMED = 1, + NDD_LOCKED = 2, + NDD_SECURITY_OVERWRITE = 3, + NDD_WORK_PENDING = 4, + NDD_NOBLK = 5, + NDD_LABELING = 6, + ND_IOCTL_MAX_BUFLEN = 4194304, + ND_CMD_MAX_ELEM = 5, + ND_CMD_MAX_ENVELOPE = 256, + ND_MAX_MAPPINGS = 32, + ND_REGION_PAGEMAP = 0, + ND_REGION_PERSIST_CACHE = 1, + ND_REGION_PERSIST_MEMCTRL = 2, + ND_REGION_ASYNC = 3, + DPA_RESOURCE_ADJUSTED = 1, +}; + +struct nvdimm_bus_descriptor; + +struct nvdimm; + +typedef int (*ndctl_fn)(struct nvdimm_bus_descriptor *, struct nvdimm *, unsigned int, void *, unsigned int, int *); + +struct nvdimm_bus_fw_ops; + +struct nvdimm_bus_descriptor { + const struct attribute_group **attr_groups; + long unsigned int cmd_mask; + long unsigned int dimm_family_mask; + long unsigned int bus_family_mask; + struct module *module; + char *provider_name; + struct device_node *of_node; + ndctl_fn ndctl; + int (*flush_probe)(struct nvdimm_bus_descriptor *); + int (*clear_to_send)(struct nvdimm_bus_descriptor *, struct nvdimm *, unsigned int, void *); + const struct nvdimm_bus_fw_ops *fw_ops; +}; + +struct nvdimm_security_ops; + +struct nvdimm_fw_ops; + +struct nvdimm { + long unsigned int flags; + void *provider_data; + long unsigned int cmd_mask; + struct device dev; + atomic_t busy; + int id; + int num_flush; + struct resource *flush_wpq; + const char *dimm_id; + struct { + const struct nvdimm_security_ops *ops; + long unsigned int flags; + long unsigned int ext_flags; + unsigned int overwrite_tmo; + struct kernfs_node *overwrite_state; + } sec; + struct delayed_work dwork; + const struct nvdimm_fw_ops *fw_ops; +}; + +enum nvdimm_fwa_state { + NVDIMM_FWA_INVALID = 0, + NVDIMM_FWA_IDLE = 1, + NVDIMM_FWA_ARMED = 2, + NVDIMM_FWA_BUSY = 3, + NVDIMM_FWA_ARM_OVERFLOW = 4, +}; + +enum nvdimm_fwa_capability { + NVDIMM_FWA_CAP_INVALID = 0, + NVDIMM_FWA_CAP_NONE = 1, + NVDIMM_FWA_CAP_QUIESCE = 2, + NVDIMM_FWA_CAP_LIVE = 3, +}; + +struct nvdimm_bus_fw_ops { + enum nvdimm_fwa_state (*activate_state)(struct nvdimm_bus_descriptor *); + enum nvdimm_fwa_capability (*capability)(struct nvdimm_bus_descriptor *); + int (*activate)(struct nvdimm_bus_descriptor *); +}; + +struct nvdimm_bus { + struct nvdimm_bus_descriptor *nd_desc; + wait_queue_head_t wait; + struct list_head list; + struct device dev; + int id; + int probe_active; + atomic_t ioctl_active; + struct list_head mapping_list; + struct mutex reconfig_mutex; + struct badrange badrange; +}; + +struct nvdimm_key_data { + u8 data[32]; +}; + +enum nvdimm_passphrase_type { + NVDIMM_USER = 0, + NVDIMM_MASTER = 1, +}; + +struct nvdimm_security_ops { + long unsigned int (*get_flags)(struct nvdimm *, enum nvdimm_passphrase_type); + int (*freeze)(struct nvdimm *); + int (*change_key)(struct nvdimm *, const struct nvdimm_key_data *, const struct nvdimm_key_data *, enum nvdimm_passphrase_type); + int (*unlock)(struct nvdimm *, const struct nvdimm_key_data *); + int (*disable)(struct nvdimm *, const struct nvdimm_key_data *); + int (*erase)(struct nvdimm *, const struct nvdimm_key_data *, enum nvdimm_passphrase_type); + int (*overwrite)(struct nvdimm *, const struct nvdimm_key_data *); + int (*query_overwrite)(struct nvdimm *); +}; + +enum nvdimm_fwa_trigger { + NVDIMM_FWA_ARM = 0, + NVDIMM_FWA_DISARM = 1, +}; + +enum nvdimm_fwa_result { + NVDIMM_FWA_RESULT_INVALID = 0, + NVDIMM_FWA_RESULT_NONE = 1, + NVDIMM_FWA_RESULT_SUCCESS = 2, + NVDIMM_FWA_RESULT_NOTSTAGED = 3, + NVDIMM_FWA_RESULT_NEEDRESET = 4, + NVDIMM_FWA_RESULT_FAIL = 5, +}; + +struct nvdimm_fw_ops { + enum nvdimm_fwa_state (*activate_state)(struct nvdimm *); + enum nvdimm_fwa_result (*activate_result)(struct nvdimm *); + int (*arm)(struct nvdimm *, enum nvdimm_fwa_trigger); +}; + +enum { + ND_CMD_IMPLEMENTED = 0, + ND_CMD_ARS_CAP = 1, + ND_CMD_ARS_START = 2, + ND_CMD_ARS_STATUS = 3, + ND_CMD_CLEAR_ERROR = 4, + ND_CMD_SMART = 1, + ND_CMD_SMART_THRESHOLD = 2, + ND_CMD_DIMM_FLAGS = 3, + ND_CMD_GET_CONFIG_SIZE = 4, + ND_CMD_GET_CONFIG_DATA = 5, + ND_CMD_SET_CONFIG_DATA = 6, + ND_CMD_VENDOR_EFFECT_LOG_SIZE = 7, + ND_CMD_VENDOR_EFFECT_LOG = 8, + ND_CMD_VENDOR = 9, + ND_CMD_CALL = 10, +}; + +enum { + NSINDEX_SIG_LEN = 16, + NSINDEX_ALIGN = 256, + NSINDEX_SEQ_MASK = 3, + NSLABEL_UUID_LEN = 16, + NSLABEL_NAME_LEN = 64, + NSLABEL_FLAG_ROLABEL = 1, + NSLABEL_FLAG_LOCAL = 2, + NSLABEL_FLAG_BTT = 4, + NSLABEL_FLAG_UPDATING = 8, + BTT_ALIGN = 4096, + BTTINFO_SIG_LEN = 16, + BTTINFO_UUID_LEN = 16, + BTTINFO_FLAG_ERROR = 1, + BTTINFO_MAJOR_VERSION = 1, + ND_LABEL_MIN_SIZE = 1024, + ND_LABEL_ID_SIZE = 50, + ND_NSINDEX_INIT = 1, +}; + +struct nvdimm_map { + struct nvdimm_bus *nvdimm_bus; + struct list_head list; + resource_size_t offset; + long unsigned int flags; + size_t size; + union { + void *mem; + void *iomem; + }; + struct kref kref; +}; + +struct badrange_entry { + u64 start; + u64 length; + struct list_head list; +}; + +struct nd_cmd_desc { + int in_num; + int out_num; + u32 in_sizes[5]; + int out_sizes[5]; +}; + +struct nd_interleave_set { + u64 cookie1; + u64 cookie2; + u64 altcookie; + guid_t type_guid; +}; + +struct nvdimm_drvdata; + +struct nd_mapping { + struct nvdimm *nvdimm; + u64 start; + u64 size; + int position; + struct list_head labels; + struct mutex lock; + struct nvdimm_drvdata *ndd; +}; + +struct nd_percpu_lane; + +struct nd_region { + struct device dev; + struct ida ns_ida; + struct ida btt_ida; + struct ida pfn_ida; + struct ida dax_ida; + long unsigned int flags; + struct device *ns_seed; + struct device *btt_seed; + struct device *pfn_seed; + struct device *dax_seed; + long unsigned int align; + u16 ndr_mappings; + u64 ndr_size; + u64 ndr_start; + int id; + int num_lanes; + int ro; + int numa_node; + int target_node; + void *provider_data; + struct kernfs_node *bb_state; + struct badblocks bb; + struct nd_interleave_set *nd_set; + struct nd_percpu_lane *lane; + int (*flush)(struct nd_region *, struct bio *); + struct nd_mapping mapping[0]; +}; + +struct nd_cmd_get_config_size { + __u32 status; + __u32 config_size; + __u32 max_xfer; +}; + +struct nd_cmd_set_config_hdr { + __u32 in_offset; + __u32 in_length; + __u8 in_buf[0]; +}; + +struct nd_cmd_vendor_hdr { + __u32 opcode; + __u32 in_length; + __u8 in_buf[0]; +}; + +struct nd_cmd_ars_cap { + __u64 address; + __u64 length; + __u32 status; + __u32 max_ars_out; + __u32 clear_err_unit; + __u16 flags; + __u16 reserved; +}; + +struct nd_cmd_clear_error { + __u64 address; + __u64 length; + __u32 status; + __u8 reserved[4]; + __u64 cleared; +}; + +struct nd_cmd_pkg { + __u64 nd_family; + __u64 nd_command; + __u32 nd_size_in; + __u32 nd_size_out; + __u32 nd_reserved2[9]; + __u32 nd_fw_size; + unsigned char nd_payload[0]; +}; + +enum nvdimm_event { + NVDIMM_REVALIDATE_POISON = 0, + NVDIMM_REVALIDATE_REGION = 1, +}; + +enum nvdimm_claim_class { + NVDIMM_CCLASS_NONE = 0, + NVDIMM_CCLASS_BTT = 1, + NVDIMM_CCLASS_BTT2 = 2, + NVDIMM_CCLASS_PFN = 3, + NVDIMM_CCLASS_DAX = 4, + NVDIMM_CCLASS_UNKNOWN = 5, +}; + +struct nd_device_driver { + struct device_driver drv; + long unsigned int type; + int (*probe)(struct device *); + void (*remove)(struct device *); + void (*shutdown)(struct device *); + void (*notify)(struct device *, enum nvdimm_event); +}; + +struct nd_namespace_common { + int force_raw; + struct device dev; + struct device *claim; + enum nvdimm_claim_class claim_class; + int (*rw_bytes)(struct nd_namespace_common *, resource_size_t, void *, size_t, int, long unsigned int); +}; + +struct nd_namespace_io { + struct nd_namespace_common common; + struct resource res; + resource_size_t size; + void *addr; + struct badblocks bb; +}; + +struct nvdimm_drvdata { + struct device *dev; + int nslabel_size; + struct nd_cmd_get_config_size nsarea; + void *data; + bool cxl; + int ns_current; + int ns_next; + struct resource dpa; + struct kref kref; +}; + +struct nd_percpu_lane { + int count; + spinlock_t lock; +}; + +struct btt; + +struct nd_btt { + struct device dev; + struct nd_namespace_common *ndns; + struct btt *btt; + long unsigned int lbasize; + u64 size; + uuid_t *uuid; + int id; + int initial_offset; + u16 version_major; + u16 version_minor; +}; + +enum nd_pfn_mode { + PFN_MODE_NONE = 0, + PFN_MODE_RAM = 1, + PFN_MODE_PMEM = 2, +}; + +struct nd_pfn_sb; + +struct nd_pfn { + int id; + uuid_t *uuid; + struct device dev; + long unsigned int align; + long unsigned int npfns; + enum nd_pfn_mode mode; + struct nd_pfn_sb *pfn_sb; + struct nd_namespace_common *ndns; +}; + +struct nd_pfn_sb { + u8 signature[16]; + u8 uuid[16]; + u8 parent_uuid[16]; + __le32 flags; + __le16 version_major; + __le16 version_minor; + __le64 dataoff; + __le64 npfns; + __le32 mode; + __le32 start_pad; + __le32 end_trunc; + __le32 align; + __le32 page_size; + __le16 page_struct_size; + u8 padding[3994]; + __le64 checksum; +}; + +struct nd_dax { + struct nd_pfn nd_pfn; +}; + +enum nd_async_mode { + ND_SYNC = 0, + ND_ASYNC = 1, +}; + +struct clear_badblocks_context { + resource_size_t phys; + resource_size_t cleared; +}; + +enum nd_ioctl_mode { + BUS_IOCTL = 0, + DIMM_IOCTL = 1, +}; + +struct nd_cmd_get_config_data_hdr { + __u32 in_offset; + __u32 in_length; + __u32 status; + __u8 out_buf[0]; +}; + +struct nd_blk_region { + int (*enable)(struct nvdimm_bus *, struct device *); + int (*do_io)(struct nd_blk_region *, resource_size_t, void *, u64, int); + void *blk_provider_data; + struct nd_region nd_region; +}; + +enum nvdimm_security_bits { + NVDIMM_SECURITY_DISABLED = 0, + NVDIMM_SECURITY_UNLOCKED = 1, + NVDIMM_SECURITY_LOCKED = 2, + NVDIMM_SECURITY_FROZEN = 3, + NVDIMM_SECURITY_OVERWRITE = 4, +}; + +struct nd_label_id { + char id[50]; +}; + +struct blk_alloc_info { + struct nd_mapping *nd_mapping; + resource_size_t available; + resource_size_t busy; + struct resource *res; +}; + +enum nd_driver_flags { + ND_DRIVER_DIMM = 2, + ND_DRIVER_REGION_PMEM = 4, + ND_DRIVER_REGION_BLK = 8, + ND_DRIVER_NAMESPACE_IO = 16, + ND_DRIVER_NAMESPACE_PMEM = 32, + ND_DRIVER_NAMESPACE_BLK = 64, + ND_DRIVER_DAX_PMEM = 128, +}; + +struct nd_mapping_desc { + struct nvdimm *nvdimm; + u64 start; + u64 size; + int position; +}; + +struct nd_region_desc { + struct resource *res; + struct nd_mapping_desc *mapping; + u16 num_mappings; + const struct attribute_group **attr_groups; + struct nd_interleave_set *nd_set; + void *provider_data; + int num_lanes; + int numa_node; + int target_node; + long unsigned int flags; + struct device_node *of_node; + int (*flush)(struct nd_region *, struct bio *); +}; + +struct nd_blk_region_desc { + int (*enable)(struct nvdimm_bus *, struct device *); + int (*do_io)(struct nd_blk_region *, resource_size_t, void *, u64, int); + struct nd_region_desc ndr_desc; +}; + +struct nd_namespace_index { + u8 sig[16]; + u8 flags[3]; + u8 labelsize; + __le32 seq; + __le64 myoff; + __le64 mysize; + __le64 otheroff; + __le64 labeloff; + __le32 nslot; + __le16 major; + __le16 minor; + __le64 checksum; + u8 free[0]; +}; + +struct nvdimm_efi_label { + u8 uuid[16]; + u8 name[64]; + __le32 flags; + __le16 nlabel; + __le16 position; + __le64 isetcookie; + __le64 lbasize; + __le64 dpa; + __le64 rawsize; + __le32 slot; + u8 align; + u8 reserved[3]; + guid_t type_guid; + guid_t abstraction_guid; + u8 reserved2[88]; + __le64 checksum; +}; + +struct nvdimm_cxl_label { + u8 type[16]; + u8 uuid[16]; + u8 name[64]; + __le32 flags; + __le16 nrange; + __le16 position; + __le64 dpa; + __le64 rawsize; + __le32 slot; + __le32 align; + u8 region_uuid[16]; + u8 abstraction_uuid[16]; + __le16 lbasize; + u8 reserved[86]; + __le64 checksum; +}; + +struct nd_namespace_label { + union { + struct nvdimm_cxl_label cxl; + struct nvdimm_efi_label efi; + }; +}; + +enum { + ND_MAX_LANES = 256, + INT_LBASIZE_ALIGNMENT = 64, + NVDIMM_IO_ATOMIC = 1, +}; + +struct nd_region_data { + int ns_count; + int ns_active; + unsigned int hints_shift; + void *flush_wpq[0]; +}; + +struct nd_label_ent { + struct list_head list; + long unsigned int flags; + struct nd_namespace_label *label; +}; + +struct conflict_context { + struct nd_region *nd_region; + resource_size_t start; + resource_size_t size; +}; + +enum { + ND_MIN_NAMESPACE_SIZE = 4096, +}; + +struct nd_namespace_pmem { + struct nd_namespace_io nsio; + long unsigned int lbasize; + char *alt_name; + uuid_t *uuid; + int id; +}; + +struct nd_namespace_blk { + struct nd_namespace_common common; + char *alt_name; + uuid_t *uuid; + int id; + long unsigned int lbasize; + resource_size_t size; + int num_resources; + struct resource **res; +}; + +enum nd_label_flags { + ND_LABEL_REAP = 0, +}; + +enum alloc_loc { + ALLOC_ERR = 0, + ALLOC_BEFORE = 1, + ALLOC_MID = 2, + ALLOC_AFTER = 3, +}; + +struct btt { + struct gendisk *btt_disk; + struct list_head arena_list; + struct dentry *debugfs_dir; + struct nd_btt *nd_btt; + u64 nlba; + long long unsigned int rawsize; + u32 lbasize; + u32 sector_size; + struct nd_region *nd_region; + struct mutex init_lock; + int init_state; + int num_arenas; + struct badblocks *phys_bb; +}; + +struct nd_gen_sb { + char reserved[4088]; + __le64 checksum; +}; + +struct btt_sb { + u8 signature[16]; + u8 uuid[16]; + u8 parent_uuid[16]; + __le32 flags; + __le16 version_major; + __le16 version_minor; + __le32 external_lbasize; + __le32 external_nlba; + __le32 internal_lbasize; + __le32 internal_nlba; + __le32 nfree; + __le32 infosize; + __le64 nextoff; + __le64 dataoff; + __le64 mapoff; + __le64 logoff; + __le64 info2off; + u8 padding[3968]; + __le64 checksum; +}; + +enum nvdimmsec_op_ids { + OP_FREEZE = 0, + OP_DISABLE = 1, + OP_UPDATE = 2, + OP_ERASE = 3, + OP_OVERWRITE = 4, + OP_MASTER_UPDATE = 5, + OP_MASTER_ERASE = 6, +}; + +struct dax_operations { + long int (*direct_access)(struct dax_device *, long unsigned int, long int, void **, pfn_t *); + bool (*dax_supported)(struct dax_device *, struct block_device *, int, sector_t, sector_t); + size_t (*copy_from_iter)(struct dax_device *, long unsigned int, void *, size_t, struct iov_iter *); + size_t (*copy_to_iter)(struct dax_device *, long unsigned int, void *, size_t, struct iov_iter *); + int (*zero_page_range)(struct dax_device *, long unsigned int, size_t); +}; + +struct dax_device { + struct hlist_node list; + struct inode inode; + struct cdev cdev; + const char *host; + void *private; + long unsigned int flags; + const struct dax_operations *ops; +}; + +enum dax_device_flags { + DAXDEV_ALIVE = 0, + DAXDEV_WRITE_CACHE = 1, + DAXDEV_SYNC = 2, +}; + +struct dax_region { + int id; + int target_node; + struct kref kref; + struct device *dev; + unsigned int align; + struct ida ida; + struct resource res; + struct device *seed; + struct device *youngest; +}; + +struct dax_mapping { + struct device dev; + int range_id; + int id; +}; + +struct dev_dax_range { + long unsigned int pgoff; + struct range range; + struct dax_mapping *mapping; +}; + +struct dev_dax { + struct dax_region *region; + struct dax_device *dax_dev; + unsigned int align; + int target_node; + int id; + struct ida ida; + struct device dev; + struct dev_pagemap *pgmap; + int nr_range; + struct dev_dax_range *ranges; +}; + +enum dev_dax_subsys { + DEV_DAX_BUS = 0, + DEV_DAX_CLASS = 1, +}; + +struct dev_dax_data { + struct dax_region *dax_region; + struct dev_pagemap *pgmap; + enum dev_dax_subsys subsys; + resource_size_t size; + int id; +}; + +struct dax_device_driver { + struct device_driver drv; + struct list_head ids; + int match_always; + int (*probe)(struct dev_dax *); + void (*remove)(struct dev_dax *); +}; + +struct dax_id { + struct list_head list; + char dev_name[30]; +}; + +enum id_action { + ID_REMOVE = 0, + ID_ADD = 1, +}; + +struct memregion_info { + int target_node; +}; + +struct seqcount_ww_mutex { + seqcount_t seqcount; +}; + +typedef struct seqcount_ww_mutex seqcount_ww_mutex_t; + +struct dma_buf_map { + union { + void *vaddr_iomem; + void *vaddr; + }; + bool is_iomem; +}; + +struct dma_fence_ops; + +struct dma_fence { + spinlock_t *lock; + const struct dma_fence_ops *ops; + union { + struct list_head cb_list; + ktime_t timestamp; + struct callback_head rcu; + }; + u64 context; + u64 seqno; + long unsigned int flags; + struct kref refcount; + int error; +}; + +struct dma_fence_ops { + bool use_64bit_seqno; + const char * (*get_driver_name)(struct dma_fence *); + const char * (*get_timeline_name)(struct dma_fence *); + bool (*enable_signaling)(struct dma_fence *); + bool (*signaled)(struct dma_fence *); + long int (*wait)(struct dma_fence *, bool, long int); + void (*release)(struct dma_fence *); + void (*fence_value_str)(struct dma_fence *, char *, int); + void (*timeline_value_str)(struct dma_fence *, char *, int); +}; + +enum dma_fence_flag_bits { + DMA_FENCE_FLAG_SIGNALED_BIT = 0, + DMA_FENCE_FLAG_TIMESTAMP_BIT = 1, + DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT = 2, + DMA_FENCE_FLAG_USER_BITS = 3, +}; + +struct dma_fence_cb; + +typedef void (*dma_fence_func_t)(struct dma_fence *, struct dma_fence_cb *); + +struct dma_fence_cb { + struct list_head node; + dma_fence_func_t func; +}; + +struct dma_buf; + +struct dma_buf_attachment; + +struct dma_buf_ops { + bool cache_sgt_mapping; + int (*attach)(struct dma_buf *, struct dma_buf_attachment *); + void (*detach)(struct dma_buf *, struct dma_buf_attachment *); + int (*pin)(struct dma_buf_attachment *); + void (*unpin)(struct dma_buf_attachment *); + struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *, enum dma_data_direction); + void (*unmap_dma_buf)(struct dma_buf_attachment *, struct sg_table *, enum dma_data_direction); + void (*release)(struct dma_buf *); + int (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*end_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*mmap)(struct dma_buf *, struct vm_area_struct *); + int (*vmap)(struct dma_buf *, struct dma_buf_map *); + void (*vunmap)(struct dma_buf *, struct dma_buf_map *); +}; + +struct dma_buf_poll_cb_t { + struct dma_fence_cb cb; + wait_queue_head_t *poll; + __poll_t active; +}; + +struct dma_resv; + +struct dma_buf { + size_t size; + struct file *file; + struct list_head attachments; + const struct dma_buf_ops *ops; + struct mutex lock; + unsigned int vmapping_counter; + struct dma_buf_map vmap_ptr; + const char *exp_name; + const char *name; + spinlock_t name_lock; + struct module *owner; + struct list_head list_node; + void *priv; + struct dma_resv *resv; + wait_queue_head_t poll; + struct dma_buf_poll_cb_t cb_in; + struct dma_buf_poll_cb_t cb_out; +}; + +struct dma_buf_attach_ops; + +struct dma_buf_attachment { + struct dma_buf *dmabuf; + struct device *dev; + struct list_head node; + struct sg_table *sgt; + enum dma_data_direction dir; + bool peer2peer; + const struct dma_buf_attach_ops *importer_ops; + void *importer_priv; + void *priv; +}; + +struct dma_resv_list; + +struct dma_resv { + struct ww_mutex lock; + seqcount_ww_mutex_t seq; + struct dma_fence *fence_excl; + struct dma_resv_list *fence; +}; + +struct dma_buf_attach_ops { + bool allow_peer2peer; + void (*move_notify)(struct dma_buf_attachment *); +}; + +struct dma_buf_export_info { + const char *exp_name; + struct module *owner; + const struct dma_buf_ops *ops; + size_t size; + int flags; + struct dma_resv *resv; + void *priv; +}; + +struct dma_resv_list { + struct callback_head rcu; + u32 shared_count; + u32 shared_max; + struct dma_fence *shared[0]; +}; + +struct dma_resv_iter { + struct dma_resv *obj; + bool all_fences; + struct dma_fence *fence; + unsigned int seq; + unsigned int index; + struct dma_resv_list *fences; + unsigned int shared_count; + bool is_restarted; +}; + +struct dma_buf_sync { + __u64 flags; +}; + +struct dma_buf_list { + struct list_head head; + struct mutex lock; +}; + +struct trace_event_raw_dma_fence { + struct trace_entry ent; + u32 __data_loc_driver; + u32 __data_loc_timeline; + unsigned int context; + unsigned int seqno; + char __data[0]; +}; + +struct trace_event_data_offsets_dma_fence { + u32 driver; + u32 timeline; +}; + +typedef void (*btf_trace_dma_fence_emit)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_init)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_destroy)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_enable_signal)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_signaled)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_start)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_end)(void *, struct dma_fence *); + +struct default_wait_cb { + struct dma_fence_cb base; + struct task_struct *task; +}; + +struct dma_fence_array; + +struct dma_fence_array_cb { + struct dma_fence_cb cb; + struct dma_fence_array *array; +}; + +struct dma_fence_array { + struct dma_fence base; + spinlock_t lock; + unsigned int num_fences; + atomic_t num_pending; + struct dma_fence **fences; + struct irq_work work; +}; + +struct dma_fence_chain { + struct dma_fence base; + struct dma_fence *prev; + u64 prev_seqno; + struct dma_fence *fence; + union { + struct dma_fence_cb cb; + struct irq_work work; + }; + spinlock_t lock; +}; + +struct dma_heap; + +struct dma_heap_ops { + struct dma_buf * (*allocate)(struct dma_heap *, long unsigned int, long unsigned int, long unsigned int); +}; + +struct dma_heap { + const char *name; + const struct dma_heap_ops *ops; + void *priv; + dev_t heap_devt; + struct list_head list; + struct cdev heap_cdev; +}; + +struct dma_heap_export_info { + const char *name; + const struct dma_heap_ops *ops; + void *priv; +}; + +struct dma_heap_allocation_data { + __u64 len; + __u32 fd; + __u32 fd_flags; + __u64 heap_flags; +}; + +struct system_heap_buffer { + struct dma_heap *heap; + struct list_head attachments; + struct mutex lock; + long unsigned int len; + struct sg_table sg_table; + int vmap_cnt; + void *vaddr; +}; + +struct dma_heap_attachment { + struct device *dev; + struct sg_table *table; + struct list_head list; + bool mapped; +}; + +struct cma_heap { + struct dma_heap *heap; + struct cma *cma; +}; + +struct cma_heap_buffer { + struct cma_heap *heap; + struct list_head attachments; + struct mutex lock; + long unsigned int len; + struct page *cma_pages; + struct page **pages; + long unsigned int pagecount; + int vmap_cnt; + void *vaddr; +}; + +struct dma_heap_attachment___2 { + struct device *dev; + struct sg_table table; + struct list_head list; + bool mapped; +}; + +struct sync_file { + struct file *file; + char user_name[32]; + struct list_head sync_file_list; + wait_queue_head_t wq; + long unsigned int flags; + struct dma_fence *fence; + struct dma_fence_cb cb; +}; + +struct sync_merge_data { + char name[32]; + __s32 fd2; + __s32 fence; + __u32 flags; + __u32 pad; +}; + +struct sync_fence_info { + char obj_name[32]; + char driver_name[32]; + __s32 status; + __u32 flags; + __u64 timestamp_ns; +}; + +struct sync_file_info { + char name[32]; + __s32 status; + __u32 flags; + __u32 num_fences; + __u32 pad; + __u64 sync_fence_info; +}; + +struct sync_timeline { + struct kref kref; + char name[32]; + u64 context; + int value; + struct rb_root pt_tree; + struct list_head pt_list; + spinlock_t lock; + struct list_head sync_timeline_list; +}; + +struct sync_pt { + struct dma_fence base; + struct list_head link; + struct rb_node node; +}; + +struct trace_event_raw_sync_timeline { + struct trace_entry ent; + u32 __data_loc_name; + u32 value; + char __data[0]; +}; + +struct trace_event_data_offsets_sync_timeline { + u32 name; +}; + +typedef void (*btf_trace_sync_timeline)(void *, struct sync_timeline *); + +struct sw_sync_create_fence_data { + __u32 value; + char name[32]; + __s32 fence; +}; + +struct udmabuf_create { + __u32 memfd; + __u32 flags; + __u64 offset; + __u64 size; +}; + +struct udmabuf_create_item { + __u32 memfd; + __u32 __pad; + __u64 offset; + __u64 size; +}; + +struct udmabuf_create_list { + __u32 flags; + __u32 count; + struct udmabuf_create_item list[0]; +}; + +struct udmabuf { + long unsigned int pagecount; + struct page **pages; + struct sg_table *sg; + struct miscdevice *device; +}; + +enum sam_status { + SAM_STAT_GOOD = 0, + SAM_STAT_CHECK_CONDITION = 2, + SAM_STAT_CONDITION_MET = 4, + SAM_STAT_BUSY = 8, + SAM_STAT_INTERMEDIATE = 16, + SAM_STAT_INTERMEDIATE_CONDITION_MET = 20, + SAM_STAT_RESERVATION_CONFLICT = 24, + SAM_STAT_COMMAND_TERMINATED = 34, + SAM_STAT_TASK_SET_FULL = 40, + SAM_STAT_ACA_ACTIVE = 48, + SAM_STAT_TASK_ABORTED = 64, +}; + +enum scsi_host_status { + DID_OK = 0, + DID_NO_CONNECT = 1, + DID_BUS_BUSY = 2, + DID_TIME_OUT = 3, + DID_BAD_TARGET = 4, + DID_ABORT = 5, + DID_PARITY = 6, + DID_ERROR = 7, + DID_RESET = 8, + DID_BAD_INTR = 9, + DID_PASSTHROUGH = 10, + DID_SOFT_ERROR = 11, + DID_IMM_RETRY = 12, + DID_REQUEUE = 13, + DID_TRANSPORT_DISRUPTED = 14, + DID_TRANSPORT_FAILFAST = 15, + DID_TARGET_FAILURE = 16, + DID_NEXUS_FAILURE = 17, + DID_ALLOC_FAILURE = 18, + DID_MEDIUM_ERROR = 19, + DID_TRANSPORT_MARGINAL = 20, +}; + +enum scsi_disposition { + NEEDS_RETRY = 8193, + SUCCESS = 8194, + FAILED = 8195, + QUEUED = 8196, + SOFT_ERROR = 8197, + ADD_TO_MLQUEUE = 8198, + TIMEOUT_ERROR = 8199, + SCSI_RETURN_NOT_HANDLED = 8200, + FAST_IO_FAIL = 8201, +}; + +typedef __u64 blist_flags_t; + +enum scsi_device_state { + SDEV_CREATED = 1, + SDEV_RUNNING = 2, + SDEV_CANCEL = 3, + SDEV_DEL = 4, + SDEV_QUIESCE = 5, + SDEV_OFFLINE = 6, + SDEV_TRANSPORT_OFFLINE = 7, + SDEV_BLOCK = 8, + SDEV_CREATED_BLOCK = 9, +}; + +struct scsi_vpd { + struct callback_head rcu; + int len; + unsigned char data[0]; +}; + +struct Scsi_Host; + +struct scsi_target; + +struct scsi_device_handler; + +struct scsi_device { + struct Scsi_Host *host; + struct request_queue *request_queue; + struct list_head siblings; + struct list_head same_target_siblings; + struct sbitmap budget_map; + atomic_t device_blocked; + atomic_t restarts; + spinlock_t list_lock; + struct list_head starved_entry; + short unsigned int queue_depth; + short unsigned int max_queue_depth; + short unsigned int last_queue_full_depth; + short unsigned int last_queue_full_count; + long unsigned int last_queue_full_time; + long unsigned int queue_ramp_up_period; + long unsigned int last_queue_ramp_up; + unsigned int id; + unsigned int channel; + u64 lun; + unsigned int manufacturer; + unsigned int sector_size; + void *hostdata; + unsigned char type; + char scsi_level; + char inq_periph_qual; + struct mutex inquiry_mutex; + unsigned char inquiry_len; + unsigned char *inquiry; + const char *vendor; + const char *model; + const char *rev; + struct scsi_vpd *vpd_pg0; + struct scsi_vpd *vpd_pg83; + struct scsi_vpd *vpd_pg80; + struct scsi_vpd *vpd_pg89; + struct scsi_target *sdev_target; + blist_flags_t sdev_bflags; + unsigned int eh_timeout; + unsigned int removable: 1; + unsigned int changed: 1; + unsigned int busy: 1; + unsigned int lockable: 1; + unsigned int locked: 1; + unsigned int borken: 1; + unsigned int disconnect: 1; + unsigned int soft_reset: 1; + unsigned int sdtr: 1; + unsigned int wdtr: 1; + unsigned int ppr: 1; + unsigned int tagged_supported: 1; + unsigned int simple_tags: 1; + unsigned int was_reset: 1; + unsigned int expecting_cc_ua: 1; + unsigned int use_10_for_rw: 1; + unsigned int use_10_for_ms: 1; + unsigned int set_dbd_for_ms: 1; + unsigned int no_report_opcodes: 1; + unsigned int no_write_same: 1; + unsigned int use_16_for_rw: 1; + unsigned int skip_ms_page_8: 1; + unsigned int skip_ms_page_3f: 1; + unsigned int skip_vpd_pages: 1; + unsigned int try_vpd_pages: 1; + unsigned int use_192_bytes_for_3f: 1; + unsigned int no_start_on_add: 1; + unsigned int allow_restart: 1; + unsigned int manage_start_stop: 1; + unsigned int start_stop_pwr_cond: 1; + unsigned int no_uld_attach: 1; + unsigned int select_no_atn: 1; + unsigned int fix_capacity: 1; + unsigned int guess_capacity: 1; + unsigned int retry_hwerror: 1; + unsigned int last_sector_bug: 1; + unsigned int no_read_disc_info: 1; + unsigned int no_read_capacity_16: 1; + unsigned int try_rc_10_first: 1; + unsigned int security_supported: 1; + unsigned int is_visible: 1; + unsigned int wce_default_on: 1; + unsigned int no_dif: 1; + unsigned int broken_fua: 1; + unsigned int lun_in_cdb: 1; + unsigned int unmap_limit_for_ws: 1; + unsigned int rpm_autosuspend: 1; + unsigned int ignore_media_change: 1; + unsigned int queue_stopped; + bool offline_already; + atomic_t disk_events_disable_depth; + long unsigned int supported_events[1]; + long unsigned int pending_events[1]; + struct list_head event_list; + struct work_struct event_work; + unsigned int max_device_blocked; + atomic_t iorequest_cnt; + atomic_t iodone_cnt; + atomic_t ioerr_cnt; + struct device sdev_gendev; + struct device sdev_dev; + struct execute_work ew; + struct work_struct requeue_work; + struct scsi_device_handler *handler; + void *handler_data; + size_t dma_drain_len; + void *dma_drain_buf; + unsigned int sg_timeout; + unsigned int sg_reserved_size; + struct bsg_device___2 *bsg_dev; + unsigned char access_state; + struct mutex state_mutex; + enum scsi_device_state sdev_state; + struct task_struct *quiesced_by; + long unsigned int sdev_data[0]; +}; + +enum scsi_host_state { + SHOST_CREATED = 1, + SHOST_RUNNING = 2, + SHOST_CANCEL = 3, + SHOST_DEL = 4, + SHOST_RECOVERY = 5, + SHOST_CANCEL_RECOVERY = 6, + SHOST_DEL_RECOVERY = 7, +}; + +struct scsi_host_template; + +struct scsi_transport_template; + +struct Scsi_Host { + struct list_head __devices; + struct list_head __targets; + struct list_head starved_list; + spinlock_t default_lock; + spinlock_t *host_lock; + struct mutex scan_mutex; + struct list_head eh_abort_list; + struct list_head eh_cmd_q; + struct task_struct *ehandler; + struct completion *eh_action; + wait_queue_head_t host_wait; + struct scsi_host_template *hostt; + struct scsi_transport_template *transportt; + struct blk_mq_tag_set tag_set; + atomic_t host_blocked; + unsigned int host_failed; + unsigned int host_eh_scheduled; + unsigned int host_no; + int eh_deadline; + long unsigned int last_reset; + unsigned int max_channel; + unsigned int max_id; + u64 max_lun; + unsigned int unique_id; + short unsigned int max_cmd_len; + int this_id; + int can_queue; + short int cmd_per_lun; + short unsigned int sg_tablesize; + short unsigned int sg_prot_tablesize; + unsigned int max_sectors; + unsigned int max_segment_size; + long unsigned int dma_boundary; + long unsigned int virt_boundary_mask; + unsigned int nr_hw_queues; + unsigned int nr_maps; + unsigned int active_mode: 2; + unsigned int host_self_blocked: 1; + unsigned int reverse_ordering: 1; + unsigned int tmf_in_progress: 1; + unsigned int async_scan: 1; + unsigned int eh_noresume: 1; + unsigned int no_write_same: 1; + unsigned int host_tagset: 1; + unsigned int short_inquiry: 1; + unsigned int no_scsi2_lun_in_cdb: 1; + char work_q_name[20]; + struct workqueue_struct *work_q; + struct workqueue_struct *tmf_work_q; + unsigned int max_host_blocked; + unsigned int prot_capabilities; + unsigned char prot_guard_type; + long unsigned int base; + long unsigned int io_port; + unsigned char n_io_port; + unsigned char dma_channel; + unsigned int irq; + enum scsi_host_state shost_state; + struct device shost_gendev; + struct device shost_dev; + const struct attribute_group *shost_dev_attr_groups[3]; + void *shost_data; + struct device *dma_dev; + long unsigned int hostdata[0]; +}; + +enum scsi_target_state { + STARGET_CREATED = 1, + STARGET_RUNNING = 2, + STARGET_REMOVE = 3, + STARGET_CREATED_REMOVE = 4, + STARGET_DEL = 5, +}; + +struct scsi_target { + struct scsi_device *starget_sdev_user; + struct list_head siblings; + struct list_head devices; + struct device dev; + struct kref reap_ref; + unsigned int channel; + unsigned int id; + unsigned int create: 1; + unsigned int single_lun: 1; + unsigned int pdt_1f_for_no_lun: 1; + unsigned int no_report_luns: 1; + unsigned int expecting_lun_change: 1; + atomic_t target_busy; + atomic_t target_blocked; + unsigned int can_queue; + unsigned int max_target_blocked; + char scsi_level; + enum scsi_target_state state; + void *hostdata; + long unsigned int starget_data[0]; +}; + +struct scsi_request { + unsigned char __cmd[16]; + unsigned char *cmd; + short unsigned int cmd_len; + int result; + unsigned int sense_len; + unsigned int resid_len; + int retries; + void *sense; +}; + +struct scsi_data_buffer { + struct sg_table table; + unsigned int length; +}; + +struct scsi_pointer { + char *ptr; + int this_residual; + struct scatterlist *buffer; + int buffers_residual; + dma_addr_t dma_handle; + volatile int Status; + volatile int Message; + volatile int have_data_in; + volatile int sent_command; + volatile int phase; +}; + +enum scsi_cmnd_submitter { + SUBMITTED_BY_BLOCK_LAYER = 0, + SUBMITTED_BY_SCSI_ERROR_HANDLER = 1, + SUBMITTED_BY_SCSI_RESET_IOCTL = 2, +}; + +struct scsi_cmnd { + struct scsi_request req; + struct scsi_device *device; + struct list_head eh_entry; + struct delayed_work abort_work; + struct callback_head rcu; + int eh_eflags; + int budget_token; + long unsigned int jiffies_at_alloc; + int retries; + int allowed; + unsigned char prot_op; + unsigned char prot_type; + unsigned char prot_flags; + enum scsi_cmnd_submitter submitter; + short unsigned int cmd_len; + enum dma_data_direction sc_data_direction; + unsigned char *cmnd; + struct scsi_data_buffer sdb; + struct scsi_data_buffer *prot_sdb; + unsigned int underflow; + unsigned int transfersize; + unsigned char *sense_buffer; + struct scsi_pointer SCp; + unsigned char *host_scribble; + int result; + int flags; + long unsigned int state; + unsigned int extra_len; +}; + +enum scsi_prot_operations { + SCSI_PROT_NORMAL = 0, + SCSI_PROT_READ_INSERT = 1, + SCSI_PROT_WRITE_STRIP = 2, + SCSI_PROT_READ_STRIP = 3, + SCSI_PROT_WRITE_INSERT = 4, + SCSI_PROT_READ_PASS = 5, + SCSI_PROT_WRITE_PASS = 6, +}; + +struct scsi_driver { + struct device_driver gendrv; + void (*rescan)(struct device *); + blk_status_t (*init_command)(struct scsi_cmnd *); + void (*uninit_command)(struct scsi_cmnd *); + int (*done)(struct scsi_cmnd *); + int (*eh_action)(struct scsi_cmnd *, int); + void (*eh_reset)(struct scsi_cmnd *); +}; + +struct scsi_host_cmd_pool; + +struct scsi_host_template { + unsigned int cmd_size; + int (*queuecommand)(struct Scsi_Host *, struct scsi_cmnd *); + void (*commit_rqs)(struct Scsi_Host *, u16); + struct module *module; + const char *name; + const char * (*info)(struct Scsi_Host *); + int (*ioctl)(struct scsi_device *, unsigned int, void *); + int (*compat_ioctl)(struct scsi_device *, unsigned int, void *); + int (*init_cmd_priv)(struct Scsi_Host *, struct scsi_cmnd *); + int (*exit_cmd_priv)(struct Scsi_Host *, struct scsi_cmnd *); + int (*eh_abort_handler)(struct scsi_cmnd *); + int (*eh_device_reset_handler)(struct scsi_cmnd *); + int (*eh_target_reset_handler)(struct scsi_cmnd *); + int (*eh_bus_reset_handler)(struct scsi_cmnd *); + int (*eh_host_reset_handler)(struct scsi_cmnd *); + int (*slave_alloc)(struct scsi_device *); + int (*slave_configure)(struct scsi_device *); + void (*slave_destroy)(struct scsi_device *); + int (*target_alloc)(struct scsi_target *); + void (*target_destroy)(struct scsi_target *); + int (*scan_finished)(struct Scsi_Host *, long unsigned int); + void (*scan_start)(struct Scsi_Host *); + int (*change_queue_depth)(struct scsi_device *, int); + int (*map_queues)(struct Scsi_Host *); + int (*mq_poll)(struct Scsi_Host *, unsigned int); + bool (*dma_need_drain)(struct request *); + int (*bios_param)(struct scsi_device *, struct block_device *, sector_t, int *); + void (*unlock_native_capacity)(struct scsi_device *); + int (*show_info)(struct seq_file *, struct Scsi_Host *); + int (*write_info)(struct Scsi_Host *, char *, int); + enum blk_eh_timer_return (*eh_timed_out)(struct scsi_cmnd *); + bool (*eh_should_retry_cmd)(struct scsi_cmnd *); + int (*host_reset)(struct Scsi_Host *, int); + const char *proc_name; + struct proc_dir_entry *proc_dir; + int can_queue; + int this_id; + short unsigned int sg_tablesize; + short unsigned int sg_prot_tablesize; + unsigned int max_sectors; + unsigned int max_segment_size; + long unsigned int dma_boundary; + long unsigned int virt_boundary_mask; + short int cmd_per_lun; + unsigned char present; + int tag_alloc_policy; + unsigned int track_queue_depth: 1; + unsigned int supported_mode: 2; + unsigned int emulated: 1; + unsigned int skip_settle_delay: 1; + unsigned int no_write_same: 1; + unsigned int host_tagset: 1; + unsigned int max_host_blocked; + const struct attribute_group **shost_groups; + const struct attribute_group **sdev_groups; + u64 vendor_id; + struct scsi_host_cmd_pool *cmd_pool; + int rpm_autosuspend_delay; +}; + +struct trace_event_raw_scsi_dispatch_cmd_start { + struct trace_entry ent; + unsigned int host_no; + unsigned int channel; + unsigned int id; + unsigned int lun; + unsigned int opcode; + unsigned int cmd_len; + unsigned int data_sglen; + unsigned int prot_sglen; + unsigned char prot_op; + u32 __data_loc_cmnd; + char __data[0]; +}; + +struct trace_event_raw_scsi_dispatch_cmd_error { + struct trace_entry ent; + unsigned int host_no; + unsigned int channel; + unsigned int id; + unsigned int lun; + int rtn; + unsigned int opcode; + unsigned int cmd_len; + unsigned int data_sglen; + unsigned int prot_sglen; + unsigned char prot_op; + u32 __data_loc_cmnd; + char __data[0]; +}; + +struct trace_event_raw_scsi_cmd_done_timeout_template { + struct trace_entry ent; + unsigned int host_no; + unsigned int channel; + unsigned int id; + unsigned int lun; + int result; + unsigned int opcode; + unsigned int cmd_len; + unsigned int data_sglen; + unsigned int prot_sglen; + unsigned char prot_op; + u32 __data_loc_cmnd; + char __data[0]; +}; + +struct trace_event_raw_scsi_eh_wakeup { + struct trace_entry ent; + unsigned int host_no; + char __data[0]; +}; + +struct trace_event_data_offsets_scsi_dispatch_cmd_start { + u32 cmnd; +}; + +struct trace_event_data_offsets_scsi_dispatch_cmd_error { + u32 cmnd; +}; + +struct trace_event_data_offsets_scsi_cmd_done_timeout_template { + u32 cmnd; +}; + +struct trace_event_data_offsets_scsi_eh_wakeup {}; + +typedef void (*btf_trace_scsi_dispatch_cmd_start)(void *, struct scsi_cmnd *); + +typedef void (*btf_trace_scsi_dispatch_cmd_error)(void *, struct scsi_cmnd *, int); + +typedef void (*btf_trace_scsi_dispatch_cmd_done)(void *, struct scsi_cmnd *); + +typedef void (*btf_trace_scsi_dispatch_cmd_timeout)(void *, struct scsi_cmnd *); + +typedef void (*btf_trace_scsi_eh_wakeup)(void *, struct Scsi_Host *); + +struct scsi_transport_template { + struct transport_container host_attrs; + struct transport_container target_attrs; + struct transport_container device_attrs; + int (*user_scan)(struct Scsi_Host *, uint, uint, u64); + int device_size; + int device_private_offset; + int target_size; + int target_private_offset; + int host_size; + unsigned int create_work_queue: 1; + void (*eh_strategy_handler)(struct Scsi_Host *); +}; + +struct scsi_host_busy_iter_data { + bool (*fn)(struct scsi_cmnd *, void *, bool); + void *priv; +}; + +struct request_sense; + +struct cdrom_generic_command { + unsigned char cmd[12]; + unsigned char *buffer; + unsigned int buflen; + int stat; + struct request_sense *sense; + unsigned char data_direction; + int quiet; + int timeout; + union { + void *reserved[1]; + void *unused; + }; +}; + +struct request_sense { + __u8 error_code: 7; + __u8 valid: 1; + __u8 segment_number; + __u8 sense_key: 4; + __u8 reserved2: 1; + __u8 ili: 1; + __u8 reserved1: 2; + __u8 information[4]; + __u8 add_sense_len; + __u8 command_info[4]; + __u8 asc; + __u8 ascq; + __u8 fruc; + __u8 sks[3]; + __u8 asb[46]; +}; + +enum scsi_msg_byte { + COMMAND_COMPLETE = 0, + EXTENDED_MESSAGE = 1, + SAVE_POINTERS = 2, + RESTORE_POINTERS = 3, + DISCONNECT = 4, + INITIATOR_ERROR = 5, + ABORT_TASK_SET = 6, + MESSAGE_REJECT = 7, + NOP = 8, + MSG_PARITY_ERROR = 9, + LINKED_CMD_COMPLETE = 10, + LINKED_FLG_CMD_COMPLETE = 11, + TARGET_RESET = 12, + ABORT_TASK = 13, + CLEAR_TASK_SET = 14, + INITIATE_RECOVERY = 15, + RELEASE_RECOVERY = 16, + TERMINATE_IO_PROC = 17, + CLEAR_ACA = 22, + LOGICAL_UNIT_RESET = 23, + SIMPLE_QUEUE_TAG = 32, + HEAD_OF_QUEUE_TAG = 33, + ORDERED_QUEUE_TAG = 34, + IGNORE_WIDE_RESIDUE = 35, + ACA = 36, + QAS_REQUEST = 85, + BUS_DEVICE_RESET = 12, + ABORT = 6, +}; + +struct scsi_ioctl_command { + unsigned int inlen; + unsigned int outlen; + unsigned char data[0]; +}; + +struct scsi_idlun { + __u32 dev_id; + __u32 host_unique_id; +}; + +struct sg_io_hdr { + int interface_id; + int dxfer_direction; + unsigned char cmd_len; + unsigned char mx_sb_len; + short unsigned int iovec_count; + unsigned int dxfer_len; + void *dxferp; + unsigned char *cmdp; + void *sbp; + unsigned int timeout; + unsigned int flags; + int pack_id; + void *usr_ptr; + unsigned char status; + unsigned char masked_status; + unsigned char msg_status; + unsigned char sb_len_wr; + short unsigned int host_status; + short unsigned int driver_status; + int resid; + unsigned int duration; + unsigned int info; +}; + +struct compat_sg_io_hdr { + compat_int_t interface_id; + compat_int_t dxfer_direction; + unsigned char cmd_len; + unsigned char mx_sb_len; + short unsigned int iovec_count; + compat_uint_t dxfer_len; + compat_uint_t dxferp; + compat_uptr_t cmdp; + compat_uptr_t sbp; + compat_uint_t timeout; + compat_uint_t flags; + compat_int_t pack_id; + compat_uptr_t usr_ptr; + unsigned char status; + unsigned char masked_status; + unsigned char msg_status; + unsigned char sb_len_wr; + short unsigned int host_status; + short unsigned int driver_status; + compat_int_t resid; + compat_uint_t duration; + compat_uint_t info; +}; + +struct compat_cdrom_generic_command { + unsigned char cmd[12]; + compat_caddr_t buffer; + compat_uint_t buflen; + compat_int_t stat; + compat_caddr_t sense; + unsigned char data_direction; + unsigned char pad[3]; + compat_int_t quiet; + compat_int_t timeout; + compat_caddr_t unused; +}; + +enum { + OMAX_SB_LEN = 16, +}; + +typedef void (*activate_complete)(void *, int); + +struct scsi_device_handler { + struct list_head list; + struct module *module; + const char *name; + enum scsi_disposition (*check_sense)(struct scsi_device *, struct scsi_sense_hdr *); + int (*attach)(struct scsi_device *); + void (*detach)(struct scsi_device *); + int (*activate)(struct scsi_device *, activate_complete, void *); + blk_status_t (*prep_fn)(struct scsi_device *, struct request *); + int (*set_params)(struct scsi_device *, const char *); + void (*rescan)(struct scsi_device *); +}; + +struct scsi_eh_save { + int result; + unsigned int resid_len; + int eh_eflags; + enum dma_data_direction data_direction; + unsigned int underflow; + unsigned char cmd_len; + unsigned char prot_op; + unsigned char *cmnd; + struct scsi_data_buffer sdb; + unsigned char eh_cmnd[16]; + struct scatterlist sense_sgl; +}; + +struct scsi_mode_data { + __u32 length; + __u16 block_descriptor_length; + __u8 medium_type; + __u8 device_specific; + __u8 header_length; + __u8 longlba: 1; +}; + +struct scsi_event { + enum scsi_device_event evt_type; + struct list_head node; +}; + +enum scsi_host_prot_capabilities { + SHOST_DIF_TYPE1_PROTECTION = 1, + SHOST_DIF_TYPE2_PROTECTION = 2, + SHOST_DIF_TYPE3_PROTECTION = 4, + SHOST_DIX_TYPE0_PROTECTION = 8, + SHOST_DIX_TYPE1_PROTECTION = 16, + SHOST_DIX_TYPE2_PROTECTION = 32, + SHOST_DIX_TYPE3_PROTECTION = 64, +}; + +enum { + ACTION_FAIL = 0, + ACTION_REPREP = 1, + ACTION_RETRY = 2, + ACTION_DELAYED_RETRY = 3, +}; + +struct value_name_pair; + +struct sa_name_list { + int opcode; + const struct value_name_pair *arr; + int arr_sz; +}; + +struct value_name_pair { + int value; + const char *name; +}; + +struct error_info { + short unsigned int code12; + short unsigned int size; +}; + +struct error_info2 { + unsigned char code1; + unsigned char code2_min; + unsigned char code2_max; + const char *str; + const char *fmt; +}; + +struct scsi_lun { + __u8 scsi_lun[8]; +}; + +enum scsi_timeouts { + SCSI_DEFAULT_EH_TIMEOUT = 2500, +}; + +enum scsi_scan_mode { + SCSI_SCAN_INITIAL = 0, + SCSI_SCAN_RESCAN = 1, + SCSI_SCAN_MANUAL = 2, +}; + +struct async_scan_data { + struct list_head list; + struct Scsi_Host *shost; + struct completion prev_finished; +}; + +enum scsi_devinfo_key { + SCSI_DEVINFO_GLOBAL = 0, + SCSI_DEVINFO_SPI = 1, +}; + +struct scsi_dev_info_list { + struct list_head dev_info_list; + char vendor[8]; + char model[16]; + blist_flags_t flags; + unsigned int compatible; +}; + +struct scsi_dev_info_list_table { + struct list_head node; + struct list_head scsi_dev_info_list; + const char *name; + int key; +}; + +struct double_list { + struct list_head *top; + struct list_head *bottom; +}; + +struct scsi_nl_hdr { + __u8 version; + __u8 transport; + __u16 magic; + __u16 msgtype; + __u16 msglen; +}; + +struct scsi_varlen_cdb_hdr { + __u8 opcode; + __u8 control; + __u8 misc[5]; + __u8 additional_cdb_length; + __be16 service_action; +}; + +enum { + SCSI_DH_OK = 0, + SCSI_DH_DEV_FAILED = 1, + SCSI_DH_DEV_TEMP_BUSY = 2, + SCSI_DH_DEV_UNSUPP = 3, + SCSI_DH_DEVICE_MAX = 4, + SCSI_DH_NOTCONN = 5, + SCSI_DH_CONN_FAILURE = 6, + SCSI_DH_TRANSPORT_MAX = 7, + SCSI_DH_IO = 8, + SCSI_DH_INVALID_IO = 9, + SCSI_DH_RETRY = 10, + SCSI_DH_IMM_RETRY = 11, + SCSI_DH_TIMED_OUT = 12, + SCSI_DH_RES_TEMP_UNAVAIL = 13, + SCSI_DH_DEV_OFFLINED = 14, + SCSI_DH_NOMEM = 15, + SCSI_DH_NOSYS = 16, + SCSI_DH_DRIVER_MAX = 17, +}; + +struct scsi_dh_blist { + const char *vendor; + const char *model; + const char *driver; +}; + +enum scsi_prot_flags { + SCSI_PROT_TRANSFER_PI = 1, + SCSI_PROT_GUARD_CHECK = 2, + SCSI_PROT_REF_CHECK = 4, + SCSI_PROT_REF_INCREMENT = 8, + SCSI_PROT_IP_CHECKSUM = 16, +}; + +enum { + SD_EXT_CDB_SIZE = 32, + SD_MEMPOOL_SIZE = 2, +}; + +enum { + SD_DEF_XFER_BLOCKS = 65535, + SD_MAX_XFER_BLOCKS = 4294967295, + SD_MAX_WS10_BLOCKS = 65535, + SD_MAX_WS16_BLOCKS = 8388607, +}; + +enum { + SD_LBP_FULL = 0, + SD_LBP_UNMAP = 1, + SD_LBP_WS16 = 2, + SD_LBP_WS10 = 3, + SD_LBP_ZERO = 4, + SD_LBP_DISABLE = 5, +}; + +enum { + SD_ZERO_WRITE = 0, + SD_ZERO_WS = 1, + SD_ZERO_WS16_UNMAP = 2, + SD_ZERO_WS10_UNMAP = 3, +}; + +struct opal_dev___2; + +struct scsi_disk { + struct scsi_driver *driver; + struct scsi_device *device; + struct device dev; + struct gendisk *disk; + struct opal_dev___2 *opal_dev; + u32 nr_zones; + u32 rev_nr_zones; + u32 zone_blocks; + u32 rev_zone_blocks; + u32 zones_optimal_open; + u32 zones_optimal_nonseq; + u32 zones_max_open; + u32 *zones_wp_offset; + spinlock_t zones_wp_offset_lock; + u32 *rev_wp_offset; + struct mutex rev_mutex; + struct work_struct zone_wp_offset_work; + char *zone_wp_update_buf; + atomic_t openers; + sector_t capacity; + int max_retries; + u32 max_xfer_blocks; + u32 opt_xfer_blocks; + u32 max_ws_blocks; + u32 max_unmap_blocks; + u32 unmap_granularity; + u32 unmap_alignment; + u32 index; + unsigned int physical_block_size; + unsigned int max_medium_access_timeouts; + unsigned int medium_access_timed_out; + u8 media_present; + u8 write_prot; + u8 protection_type; + u8 provisioning_mode; + u8 zeroing_mode; + u8 nr_actuators; + unsigned int ATO: 1; + unsigned int cache_override: 1; + unsigned int WCE: 1; + unsigned int RCD: 1; + unsigned int DPOFUA: 1; + unsigned int first_scan: 1; + unsigned int lbpme: 1; + unsigned int lbprz: 1; + unsigned int lbpu: 1; + unsigned int lbpws: 1; + unsigned int lbpws10: 1; + unsigned int lbpvpd: 1; + unsigned int ws10: 1; + unsigned int ws16: 1; + unsigned int rc_basis: 2; + unsigned int zoned: 2; + unsigned int urswrz: 1; + unsigned int security: 1; + unsigned int ignore_medium_access_errors: 1; +}; + +enum scsi_host_guard_type { + SHOST_DIX_GUARD_CRC = 1, + SHOST_DIX_GUARD_IP = 2, +}; + +enum zbc_zone_type { + ZBC_ZONE_TYPE_CONV = 1, + ZBC_ZONE_TYPE_SEQWRITE_REQ = 2, + ZBC_ZONE_TYPE_SEQWRITE_PREF = 3, +}; + +enum zbc_zone_cond { + ZBC_ZONE_COND_NO_WP = 0, + ZBC_ZONE_COND_EMPTY = 1, + ZBC_ZONE_COND_IMP_OPEN = 2, + ZBC_ZONE_COND_EXP_OPEN = 3, + ZBC_ZONE_COND_CLOSED = 4, + ZBC_ZONE_COND_READONLY = 13, + ZBC_ZONE_COND_FULL = 14, + ZBC_ZONE_COND_OFFLINE = 15, +}; + +enum { + mechtype_caddy = 0, + mechtype_tray = 1, + mechtype_popup = 2, + mechtype_individual_changer = 4, + mechtype_cartridge_changer = 5, +}; + +struct event_header { + __be16 data_len; + __u8 notification_class: 3; + __u8 reserved1: 4; + __u8 nea: 1; + __u8 supp_event_class; +}; + +struct media_event_desc { + __u8 media_event_code: 4; + __u8 reserved1: 4; + __u8 door_open: 1; + __u8 media_present: 1; + __u8 reserved2: 6; + __u8 start_slot; + __u8 end_slot; +}; + +struct scsi_cd { + struct scsi_driver *driver; + unsigned int capacity; + struct scsi_device *device; + unsigned int vendor; + long unsigned int ms_offset; + unsigned int writeable: 1; + unsigned int use: 1; + unsigned int xa_flag: 1; + unsigned int readcd_known: 1; + unsigned int readcd_cdda: 1; + unsigned int media_present: 1; + int tur_mismatch; + bool tur_changed: 1; + bool get_event_changed: 1; + bool ignore_get_event: 1; + struct cdrom_device_info cdi; + struct mutex lock; + struct kref kref; + struct gendisk *disk; +}; + +typedef struct scsi_cd Scsi_CD; + +struct cdrom_ti { + __u8 cdti_trk0; + __u8 cdti_ind0; + __u8 cdti_trk1; + __u8 cdti_ind1; +}; + +struct cdrom_tochdr { + __u8 cdth_trk0; + __u8 cdth_trk1; +}; + +struct cdrom_tocentry { + __u8 cdte_track; + __u8 cdte_adr: 4; + __u8 cdte_ctrl: 4; + __u8 cdte_format; + union cdrom_addr cdte_addr; + __u8 cdte_datamode; +}; + +struct ccs_modesel_head { + __u8 _r1; + __u8 medium; + __u8 _r2; + __u8 block_desc_length; + __u8 density; + __u8 number_blocks_hi; + __u8 number_blocks_med; + __u8 number_blocks_lo; + __u8 _r3; + __u8 block_length_hi; + __u8 block_length_med; + __u8 block_length_lo; +}; + +typedef struct sg_io_hdr sg_io_hdr_t; + +struct sg_scsi_id { + int host_no; + int channel; + int scsi_id; + int lun; + int scsi_type; + short int h_cmd_per_lun; + short int d_queue_depth; + int unused[2]; +}; + +typedef struct sg_scsi_id sg_scsi_id_t; + +struct sg_req_info { + char req_state; + char orphan; + char sg_io_owned; + char problem; + int pack_id; + void *usr_ptr; + unsigned int duration; + int unused; +}; + +typedef struct sg_req_info sg_req_info_t; + +struct sg_header { + int pack_len; + int reply_len; + int pack_id; + int result; + unsigned int twelve_byte: 1; + unsigned int target_status: 5; + unsigned int host_status: 8; + unsigned int driver_status: 8; + unsigned int other_flags: 10; + unsigned char sense_buffer[16]; +}; + +struct sg_scatter_hold { + short unsigned int k_use_sg; + unsigned int sglist_len; + unsigned int bufflen; + struct page **pages; + int page_order; + char dio_in_use; + unsigned char cmd_opcode; +}; + +typedef struct sg_scatter_hold Sg_scatter_hold; + +struct sg_fd; + +struct sg_request { + struct list_head entry; + struct sg_fd *parentfp; + Sg_scatter_hold data; + sg_io_hdr_t header; + unsigned char sense_b[96]; + char res_used; + char orphan; + char sg_io_owned; + char done; + struct request *rq; + struct bio *bio; + struct execute_work ew; +}; + +typedef struct sg_request Sg_request; + +struct sg_device; + +struct sg_fd { + struct list_head sfd_siblings; + struct sg_device *parentdp; + wait_queue_head_t read_wait; + rwlock_t rq_list_lock; + struct mutex f_mutex; + int timeout; + int timeout_user; + Sg_scatter_hold reserve; + struct list_head rq_list; + struct fasync_struct *async_qp; + Sg_request req_arr[16]; + char force_packid; + char cmd_q; + unsigned char next_cmd_len; + char keep_orphan; + char mmap_called; + char res_in_use; + struct kref f_ref; + struct execute_work ew; +}; + +struct sg_device { + struct scsi_device *device; + wait_queue_head_t open_wait; + struct mutex open_rel_lock; + int sg_tablesize; + u32 index; + struct list_head sfds; + rwlock_t sfd_lock; + atomic_t detaching; + bool exclude; + int open_cnt; + char sgdebug; + char name[32]; + struct cdev *cdev; + struct kref d_ref; +}; + +typedef struct sg_fd Sg_fd; + +typedef struct sg_device Sg_device; + +struct compat_sg_req_info { + char req_state; + char orphan; + char sg_io_owned; + char problem; + int pack_id; + compat_uptr_t usr_ptr; + unsigned int duration; + int unused; +}; + +struct sg_proc_deviter { + loff_t index; + size_t max; +}; + +enum { + ATA_MAX_DEVICES = 2, + ATA_MAX_PRD = 256, + ATA_SECT_SIZE = 512, + ATA_MAX_SECTORS_128 = 128, + ATA_MAX_SECTORS = 256, + ATA_MAX_SECTORS_1024 = 1024, + ATA_MAX_SECTORS_LBA48 = 65535, + ATA_MAX_SECTORS_TAPE = 65535, + ATA_MAX_TRIM_RNUM = 64, + ATA_ID_WORDS = 256, + ATA_ID_CONFIG = 0, + ATA_ID_CYLS = 1, + ATA_ID_HEADS = 3, + ATA_ID_SECTORS = 6, + ATA_ID_SERNO = 10, + ATA_ID_BUF_SIZE = 21, + ATA_ID_FW_REV = 23, + ATA_ID_PROD = 27, + ATA_ID_MAX_MULTSECT = 47, + ATA_ID_DWORD_IO = 48, + ATA_ID_TRUSTED = 48, + ATA_ID_CAPABILITY = 49, + ATA_ID_OLD_PIO_MODES = 51, + ATA_ID_OLD_DMA_MODES = 52, + ATA_ID_FIELD_VALID = 53, + ATA_ID_CUR_CYLS = 54, + ATA_ID_CUR_HEADS = 55, + ATA_ID_CUR_SECTORS = 56, + ATA_ID_MULTSECT = 59, + ATA_ID_LBA_CAPACITY = 60, + ATA_ID_SWDMA_MODES = 62, + ATA_ID_MWDMA_MODES = 63, + ATA_ID_PIO_MODES = 64, + ATA_ID_EIDE_DMA_MIN = 65, + ATA_ID_EIDE_DMA_TIME = 66, + ATA_ID_EIDE_PIO = 67, + ATA_ID_EIDE_PIO_IORDY = 68, + ATA_ID_ADDITIONAL_SUPP = 69, + ATA_ID_QUEUE_DEPTH = 75, + ATA_ID_SATA_CAPABILITY = 76, + ATA_ID_SATA_CAPABILITY_2 = 77, + ATA_ID_FEATURE_SUPP = 78, + ATA_ID_MAJOR_VER = 80, + ATA_ID_COMMAND_SET_1 = 82, + ATA_ID_COMMAND_SET_2 = 83, + ATA_ID_CFSSE = 84, + ATA_ID_CFS_ENABLE_1 = 85, + ATA_ID_CFS_ENABLE_2 = 86, + ATA_ID_CSF_DEFAULT = 87, + ATA_ID_UDMA_MODES = 88, + ATA_ID_HW_CONFIG = 93, + ATA_ID_SPG = 98, + ATA_ID_LBA_CAPACITY_2 = 100, + ATA_ID_SECTOR_SIZE = 106, + ATA_ID_WWN = 108, + ATA_ID_LOGICAL_SECTOR_SIZE = 117, + ATA_ID_COMMAND_SET_3 = 119, + ATA_ID_COMMAND_SET_4 = 120, + ATA_ID_LAST_LUN = 126, + ATA_ID_DLF = 128, + ATA_ID_CSFO = 129, + ATA_ID_CFA_POWER = 160, + ATA_ID_CFA_KEY_MGMT = 162, + ATA_ID_CFA_MODES = 163, + ATA_ID_DATA_SET_MGMT = 169, + ATA_ID_SCT_CMD_XPORT = 206, + ATA_ID_ROT_SPEED = 217, + ATA_ID_PIO4 = 2, + ATA_ID_SERNO_LEN = 20, + ATA_ID_FW_REV_LEN = 8, + ATA_ID_PROD_LEN = 40, + ATA_ID_WWN_LEN = 8, + ATA_PCI_CTL_OFS = 2, + ATA_PIO0 = 1, + ATA_PIO1 = 3, + ATA_PIO2 = 7, + ATA_PIO3 = 15, + ATA_PIO4 = 31, + ATA_PIO5 = 63, + ATA_PIO6 = 127, + ATA_PIO4_ONLY = 16, + ATA_SWDMA0 = 1, + ATA_SWDMA1 = 3, + ATA_SWDMA2 = 7, + ATA_SWDMA2_ONLY = 4, + ATA_MWDMA0 = 1, + ATA_MWDMA1 = 3, + ATA_MWDMA2 = 7, + ATA_MWDMA3 = 15, + ATA_MWDMA4 = 31, + ATA_MWDMA12_ONLY = 6, + ATA_MWDMA2_ONLY = 4, + ATA_UDMA0 = 1, + ATA_UDMA1 = 3, + ATA_UDMA2 = 7, + ATA_UDMA3 = 15, + ATA_UDMA4 = 31, + ATA_UDMA5 = 63, + ATA_UDMA6 = 127, + ATA_UDMA7 = 255, + ATA_UDMA24_ONLY = 20, + ATA_UDMA_MASK_40C = 7, + ATA_PRD_SZ = 8, + ATA_PRD_TBL_SZ = 2048, + ATA_PRD_EOT = 2147483648, + ATA_DMA_TABLE_OFS = 4, + ATA_DMA_STATUS = 2, + ATA_DMA_CMD = 0, + ATA_DMA_WR = 8, + ATA_DMA_START = 1, + ATA_DMA_INTR = 4, + ATA_DMA_ERR = 2, + ATA_DMA_ACTIVE = 1, + ATA_HOB = 128, + ATA_NIEN = 2, + ATA_LBA = 64, + ATA_DEV1 = 16, + ATA_DEVICE_OBS = 160, + ATA_DEVCTL_OBS = 8, + ATA_BUSY = 128, + ATA_DRDY = 64, + ATA_DF = 32, + ATA_DSC = 16, + ATA_DRQ = 8, + ATA_CORR = 4, + ATA_SENSE = 2, + ATA_ERR = 1, + ATA_SRST = 4, + ATA_ICRC = 128, + ATA_BBK = 128, + ATA_UNC = 64, + ATA_MC = 32, + ATA_IDNF = 16, + ATA_MCR = 8, + ATA_ABORTED = 4, + ATA_TRK0NF = 2, + ATA_AMNF = 1, + ATAPI_LFS = 240, + ATAPI_EOM = 2, + ATAPI_ILI = 1, + ATAPI_IO = 2, + ATAPI_COD = 1, + ATA_REG_DATA = 0, + ATA_REG_ERR = 1, + ATA_REG_NSECT = 2, + ATA_REG_LBAL = 3, + ATA_REG_LBAM = 4, + ATA_REG_LBAH = 5, + ATA_REG_DEVICE = 6, + ATA_REG_STATUS = 7, + ATA_REG_FEATURE = 1, + ATA_REG_CMD = 7, + ATA_REG_BYTEL = 4, + ATA_REG_BYTEH = 5, + ATA_REG_DEVSEL = 6, + ATA_REG_IRQ = 2, + ATA_CMD_DEV_RESET = 8, + ATA_CMD_CHK_POWER = 229, + ATA_CMD_STANDBY = 226, + ATA_CMD_IDLE = 227, + ATA_CMD_EDD = 144, + ATA_CMD_DOWNLOAD_MICRO = 146, + ATA_CMD_DOWNLOAD_MICRO_DMA = 147, + ATA_CMD_NOP = 0, + ATA_CMD_FLUSH = 231, + ATA_CMD_FLUSH_EXT = 234, + ATA_CMD_ID_ATA = 236, + ATA_CMD_ID_ATAPI = 161, + ATA_CMD_SERVICE = 162, + ATA_CMD_READ = 200, + ATA_CMD_READ_EXT = 37, + ATA_CMD_READ_QUEUED = 38, + ATA_CMD_READ_STREAM_EXT = 43, + ATA_CMD_READ_STREAM_DMA_EXT = 42, + ATA_CMD_WRITE = 202, + ATA_CMD_WRITE_EXT = 53, + ATA_CMD_WRITE_QUEUED = 54, + ATA_CMD_WRITE_STREAM_EXT = 59, + ATA_CMD_WRITE_STREAM_DMA_EXT = 58, + ATA_CMD_WRITE_FUA_EXT = 61, + ATA_CMD_WRITE_QUEUED_FUA_EXT = 62, + ATA_CMD_FPDMA_READ = 96, + ATA_CMD_FPDMA_WRITE = 97, + ATA_CMD_NCQ_NON_DATA = 99, + ATA_CMD_FPDMA_SEND = 100, + ATA_CMD_FPDMA_RECV = 101, + ATA_CMD_PIO_READ = 32, + ATA_CMD_PIO_READ_EXT = 36, + ATA_CMD_PIO_WRITE = 48, + ATA_CMD_PIO_WRITE_EXT = 52, + ATA_CMD_READ_MULTI = 196, + ATA_CMD_READ_MULTI_EXT = 41, + ATA_CMD_WRITE_MULTI = 197, + ATA_CMD_WRITE_MULTI_EXT = 57, + ATA_CMD_WRITE_MULTI_FUA_EXT = 206, + ATA_CMD_SET_FEATURES = 239, + ATA_CMD_SET_MULTI = 198, + ATA_CMD_PACKET = 160, + ATA_CMD_VERIFY = 64, + ATA_CMD_VERIFY_EXT = 66, + ATA_CMD_WRITE_UNCORR_EXT = 69, + ATA_CMD_STANDBYNOW1 = 224, + ATA_CMD_IDLEIMMEDIATE = 225, + ATA_CMD_SLEEP = 230, + ATA_CMD_INIT_DEV_PARAMS = 145, + ATA_CMD_READ_NATIVE_MAX = 248, + ATA_CMD_READ_NATIVE_MAX_EXT = 39, + ATA_CMD_SET_MAX = 249, + ATA_CMD_SET_MAX_EXT = 55, + ATA_CMD_READ_LOG_EXT = 47, + ATA_CMD_WRITE_LOG_EXT = 63, + ATA_CMD_READ_LOG_DMA_EXT = 71, + ATA_CMD_WRITE_LOG_DMA_EXT = 87, + ATA_CMD_TRUSTED_NONDATA = 91, + ATA_CMD_TRUSTED_RCV = 92, + ATA_CMD_TRUSTED_RCV_DMA = 93, + ATA_CMD_TRUSTED_SND = 94, + ATA_CMD_TRUSTED_SND_DMA = 95, + ATA_CMD_PMP_READ = 228, + ATA_CMD_PMP_READ_DMA = 233, + ATA_CMD_PMP_WRITE = 232, + ATA_CMD_PMP_WRITE_DMA = 235, + ATA_CMD_CONF_OVERLAY = 177, + ATA_CMD_SEC_SET_PASS = 241, + ATA_CMD_SEC_UNLOCK = 242, + ATA_CMD_SEC_ERASE_PREP = 243, + ATA_CMD_SEC_ERASE_UNIT = 244, + ATA_CMD_SEC_FREEZE_LOCK = 245, + ATA_CMD_SEC_DISABLE_PASS = 246, + ATA_CMD_CONFIG_STREAM = 81, + ATA_CMD_SMART = 176, + ATA_CMD_MEDIA_LOCK = 222, + ATA_CMD_MEDIA_UNLOCK = 223, + ATA_CMD_DSM = 6, + ATA_CMD_CHK_MED_CRD_TYP = 209, + ATA_CMD_CFA_REQ_EXT_ERR = 3, + ATA_CMD_CFA_WRITE_NE = 56, + ATA_CMD_CFA_TRANS_SECT = 135, + ATA_CMD_CFA_ERASE = 192, + ATA_CMD_CFA_WRITE_MULT_NE = 205, + ATA_CMD_REQ_SENSE_DATA = 11, + ATA_CMD_SANITIZE_DEVICE = 180, + ATA_CMD_ZAC_MGMT_IN = 74, + ATA_CMD_ZAC_MGMT_OUT = 159, + ATA_CMD_RESTORE = 16, + ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT = 1, + ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN = 2, + ATA_SUBCMD_FPDMA_SEND_DSM = 0, + ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT = 2, + ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE = 0, + ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES = 5, + ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT = 6, + ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT = 7, + ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES = 0, + ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE = 1, + ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE = 2, + ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE = 3, + ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER = 4, + ATA_LOG_DIRECTORY = 0, + ATA_LOG_SATA_NCQ = 16, + ATA_LOG_NCQ_NON_DATA = 18, + ATA_LOG_NCQ_SEND_RECV = 19, + ATA_LOG_IDENTIFY_DEVICE = 48, + ATA_LOG_SECURITY = 6, + ATA_LOG_SATA_SETTINGS = 8, + ATA_LOG_ZONED_INFORMATION = 9, + ATA_LOG_CONCURRENT_POSITIONING_RANGES = 71, + ATA_LOG_DEVSLP_OFFSET = 48, + ATA_LOG_DEVSLP_SIZE = 8, + ATA_LOG_DEVSLP_MDAT = 0, + ATA_LOG_DEVSLP_MDAT_MASK = 31, + ATA_LOG_DEVSLP_DETO = 1, + ATA_LOG_DEVSLP_VALID = 7, + ATA_LOG_DEVSLP_VALID_MASK = 128, + ATA_LOG_NCQ_PRIO_OFFSET = 9, + ATA_LOG_NCQ_SEND_RECV_SUBCMDS_OFFSET = 0, + ATA_LOG_NCQ_SEND_RECV_SUBCMDS_DSM = 1, + ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET = 4, + ATA_LOG_NCQ_SEND_RECV_DSM_TRIM = 1, + ATA_LOG_NCQ_SEND_RECV_RD_LOG_OFFSET = 8, + ATA_LOG_NCQ_SEND_RECV_RD_LOG_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_WR_LOG_OFFSET = 12, + ATA_LOG_NCQ_SEND_RECV_WR_LOG_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OFFSET = 16, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OUT_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_IN_SUPPORTED = 2, + ATA_LOG_NCQ_SEND_RECV_SIZE = 20, + ATA_LOG_NCQ_NON_DATA_SUBCMDS_OFFSET = 0, + ATA_LOG_NCQ_NON_DATA_ABORT_OFFSET = 0, + ATA_LOG_NCQ_NON_DATA_ABORT_NCQ = 1, + ATA_LOG_NCQ_NON_DATA_ABORT_ALL = 2, + ATA_LOG_NCQ_NON_DATA_ABORT_STREAMING = 4, + ATA_LOG_NCQ_NON_DATA_ABORT_NON_STREAMING = 8, + ATA_LOG_NCQ_NON_DATA_ABORT_SELECTED = 16, + ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET = 28, + ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT = 1, + ATA_LOG_NCQ_NON_DATA_SIZE = 64, + ATA_CMD_READ_LONG = 34, + ATA_CMD_READ_LONG_ONCE = 35, + ATA_CMD_WRITE_LONG = 50, + ATA_CMD_WRITE_LONG_ONCE = 51, + SETFEATURES_XFER = 3, + XFER_UDMA_7 = 71, + XFER_UDMA_6 = 70, + XFER_UDMA_5 = 69, + XFER_UDMA_4 = 68, + XFER_UDMA_3 = 67, + XFER_UDMA_2 = 66, + XFER_UDMA_1 = 65, + XFER_UDMA_0 = 64, + XFER_MW_DMA_4 = 36, + XFER_MW_DMA_3 = 35, + XFER_MW_DMA_2 = 34, + XFER_MW_DMA_1 = 33, + XFER_MW_DMA_0 = 32, + XFER_SW_DMA_2 = 18, + XFER_SW_DMA_1 = 17, + XFER_SW_DMA_0 = 16, + XFER_PIO_6 = 14, + XFER_PIO_5 = 13, + XFER_PIO_4 = 12, + XFER_PIO_3 = 11, + XFER_PIO_2 = 10, + XFER_PIO_1 = 9, + XFER_PIO_0 = 8, + XFER_PIO_SLOW = 0, + SETFEATURES_WC_ON = 2, + SETFEATURES_WC_OFF = 130, + SETFEATURES_RA_ON = 170, + SETFEATURES_RA_OFF = 85, + SETFEATURES_AAM_ON = 66, + SETFEATURES_AAM_OFF = 194, + SETFEATURES_SPINUP = 7, + SETFEATURES_SPINUP_TIMEOUT = 30000, + SETFEATURES_SATA_ENABLE = 16, + SETFEATURES_SATA_DISABLE = 144, + SATA_FPDMA_OFFSET = 1, + SATA_FPDMA_AA = 2, + SATA_DIPM = 3, + SATA_FPDMA_IN_ORDER = 4, + SATA_AN = 5, + SATA_SSP = 6, + SATA_DEVSLP = 9, + SETFEATURE_SENSE_DATA = 195, + ATA_SET_MAX_ADDR = 0, + ATA_SET_MAX_PASSWD = 1, + ATA_SET_MAX_LOCK = 2, + ATA_SET_MAX_UNLOCK = 3, + ATA_SET_MAX_FREEZE_LOCK = 4, + ATA_SET_MAX_PASSWD_DMA = 5, + ATA_SET_MAX_UNLOCK_DMA = 6, + ATA_DCO_RESTORE = 192, + ATA_DCO_FREEZE_LOCK = 193, + ATA_DCO_IDENTIFY = 194, + ATA_DCO_SET = 195, + ATA_SMART_ENABLE = 216, + ATA_SMART_READ_VALUES = 208, + ATA_SMART_READ_THRESHOLDS = 209, + ATA_DSM_TRIM = 1, + ATA_SMART_LBAM_PASS = 79, + ATA_SMART_LBAH_PASS = 194, + ATAPI_PKT_DMA = 1, + ATAPI_DMADIR = 4, + ATAPI_CDB_LEN = 16, + SATA_PMP_MAX_PORTS = 15, + SATA_PMP_CTRL_PORT = 15, + SATA_PMP_GSCR_DWORDS = 128, + SATA_PMP_GSCR_PROD_ID = 0, + SATA_PMP_GSCR_REV = 1, + SATA_PMP_GSCR_PORT_INFO = 2, + SATA_PMP_GSCR_ERROR = 32, + SATA_PMP_GSCR_ERROR_EN = 33, + SATA_PMP_GSCR_FEAT = 64, + SATA_PMP_GSCR_FEAT_EN = 96, + SATA_PMP_PSCR_STATUS = 0, + SATA_PMP_PSCR_ERROR = 1, + SATA_PMP_PSCR_CONTROL = 2, + SATA_PMP_FEAT_BIST = 1, + SATA_PMP_FEAT_PMREQ = 2, + SATA_PMP_FEAT_DYNSSC = 4, + SATA_PMP_FEAT_NOTIFY = 8, + ATA_CBL_NONE = 0, + ATA_CBL_PATA40 = 1, + ATA_CBL_PATA80 = 2, + ATA_CBL_PATA40_SHORT = 3, + ATA_CBL_PATA_UNK = 4, + ATA_CBL_PATA_IGN = 5, + ATA_CBL_SATA = 6, + SCR_STATUS = 0, + SCR_ERROR = 1, + SCR_CONTROL = 2, + SCR_ACTIVE = 3, + SCR_NOTIFICATION = 4, + SERR_DATA_RECOVERED = 1, + SERR_COMM_RECOVERED = 2, + SERR_DATA = 256, + SERR_PERSISTENT = 512, + SERR_PROTOCOL = 1024, + SERR_INTERNAL = 2048, + SERR_PHYRDY_CHG = 65536, + SERR_PHY_INT_ERR = 131072, + SERR_COMM_WAKE = 262144, + SERR_10B_8B_ERR = 524288, + SERR_DISPARITY = 1048576, + SERR_CRC = 2097152, + SERR_HANDSHAKE = 4194304, + SERR_LINK_SEQ_ERR = 8388608, + SERR_TRANS_ST_ERROR = 16777216, + SERR_UNRECOG_FIS = 33554432, + SERR_DEV_XCHG = 67108864, +}; + +enum ata_prot_flags { + ATA_PROT_FLAG_PIO = 1, + ATA_PROT_FLAG_DMA = 2, + ATA_PROT_FLAG_NCQ = 4, + ATA_PROT_FLAG_ATAPI = 8, + ATA_PROT_UNKNOWN = 255, + ATA_PROT_NODATA = 0, + ATA_PROT_PIO = 1, + ATA_PROT_DMA = 2, + ATA_PROT_NCQ_NODATA = 4, + ATA_PROT_NCQ = 6, + ATAPI_PROT_NODATA = 8, + ATAPI_PROT_PIO = 9, + ATAPI_PROT_DMA = 10, +}; + +struct ata_bmdma_prd { + __le32 addr; + __le32 flags_len; +}; + +enum { + ATA_MSG_DRV = 1, + ATA_MSG_INFO = 2, + ATA_MSG_PROBE = 4, + ATA_MSG_WARN = 8, + ATA_MSG_MALLOC = 16, + ATA_MSG_CTL = 32, + ATA_MSG_INTR = 64, + ATA_MSG_ERR = 128, +}; + +enum { + LIBATA_MAX_PRD = 128, + LIBATA_DUMB_MAX_PRD = 64, + ATA_DEF_QUEUE = 1, + ATA_MAX_QUEUE = 32, + ATA_TAG_INTERNAL = 32, + ATA_SHORT_PAUSE = 16, + ATAPI_MAX_DRAIN = 16384, + ATA_ALL_DEVICES = 3, + ATA_SHT_EMULATED = 1, + ATA_SHT_THIS_ID = 4294967295, + ATA_TFLAG_LBA48 = 1, + ATA_TFLAG_ISADDR = 2, + ATA_TFLAG_DEVICE = 4, + ATA_TFLAG_WRITE = 8, + ATA_TFLAG_LBA = 16, + ATA_TFLAG_FUA = 32, + ATA_TFLAG_POLLING = 64, + ATA_DFLAG_LBA = 1, + ATA_DFLAG_LBA48 = 2, + ATA_DFLAG_CDB_INTR = 4, + ATA_DFLAG_NCQ = 8, + ATA_DFLAG_FLUSH_EXT = 16, + ATA_DFLAG_ACPI_PENDING = 32, + ATA_DFLAG_ACPI_FAILED = 64, + ATA_DFLAG_AN = 128, + ATA_DFLAG_TRUSTED = 256, + ATA_DFLAG_DMADIR = 1024, + ATA_DFLAG_CFG_MASK = 4095, + ATA_DFLAG_PIO = 4096, + ATA_DFLAG_NCQ_OFF = 8192, + ATA_DFLAG_SLEEPING = 32768, + ATA_DFLAG_DUBIOUS_XFER = 65536, + ATA_DFLAG_NO_UNLOAD = 131072, + ATA_DFLAG_UNLOCK_HPA = 262144, + ATA_DFLAG_NCQ_SEND_RECV = 524288, + ATA_DFLAG_NCQ_PRIO = 1048576, + ATA_DFLAG_NCQ_PRIO_ENABLE = 2097152, + ATA_DFLAG_INIT_MASK = 16777215, + ATA_DFLAG_DETACH = 16777216, + ATA_DFLAG_DETACHED = 33554432, + ATA_DFLAG_DA = 67108864, + ATA_DFLAG_DEVSLP = 134217728, + ATA_DFLAG_ACPI_DISABLED = 268435456, + ATA_DFLAG_D_SENSE = 536870912, + ATA_DFLAG_ZAC = 1073741824, + ATA_DFLAG_FEATURES_MASK = 202899712, + ATA_DEV_UNKNOWN = 0, + ATA_DEV_ATA = 1, + ATA_DEV_ATA_UNSUP = 2, + ATA_DEV_ATAPI = 3, + ATA_DEV_ATAPI_UNSUP = 4, + ATA_DEV_PMP = 5, + ATA_DEV_PMP_UNSUP = 6, + ATA_DEV_SEMB = 7, + ATA_DEV_SEMB_UNSUP = 8, + ATA_DEV_ZAC = 9, + ATA_DEV_ZAC_UNSUP = 10, + ATA_DEV_NONE = 11, + ATA_LFLAG_NO_HRST = 2, + ATA_LFLAG_NO_SRST = 4, + ATA_LFLAG_ASSUME_ATA = 8, + ATA_LFLAG_ASSUME_SEMB = 16, + ATA_LFLAG_ASSUME_CLASS = 24, + ATA_LFLAG_NO_RETRY = 32, + ATA_LFLAG_DISABLED = 64, + ATA_LFLAG_SW_ACTIVITY = 128, + ATA_LFLAG_NO_LPM = 256, + ATA_LFLAG_RST_ONCE = 512, + ATA_LFLAG_CHANGED = 1024, + ATA_LFLAG_NO_DB_DELAY = 2048, + ATA_FLAG_SLAVE_POSS = 1, + ATA_FLAG_SATA = 2, + ATA_FLAG_NO_LPM = 4, + ATA_FLAG_NO_LOG_PAGE = 32, + ATA_FLAG_NO_ATAPI = 64, + ATA_FLAG_PIO_DMA = 128, + ATA_FLAG_PIO_LBA48 = 256, + ATA_FLAG_PIO_POLLING = 512, + ATA_FLAG_NCQ = 1024, + ATA_FLAG_NO_POWEROFF_SPINDOWN = 2048, + ATA_FLAG_NO_HIBERNATE_SPINDOWN = 4096, + ATA_FLAG_DEBUGMSG = 8192, + ATA_FLAG_FPDMA_AA = 16384, + ATA_FLAG_IGN_SIMPLEX = 32768, + ATA_FLAG_NO_IORDY = 65536, + ATA_FLAG_ACPI_SATA = 131072, + ATA_FLAG_AN = 262144, + ATA_FLAG_PMP = 524288, + ATA_FLAG_FPDMA_AUX = 1048576, + ATA_FLAG_EM = 2097152, + ATA_FLAG_SW_ACTIVITY = 4194304, + ATA_FLAG_NO_DIPM = 8388608, + ATA_FLAG_SAS_HOST = 16777216, + ATA_PFLAG_EH_PENDING = 1, + ATA_PFLAG_EH_IN_PROGRESS = 2, + ATA_PFLAG_FROZEN = 4, + ATA_PFLAG_RECOVERED = 8, + ATA_PFLAG_LOADING = 16, + ATA_PFLAG_SCSI_HOTPLUG = 64, + ATA_PFLAG_INITIALIZING = 128, + ATA_PFLAG_RESETTING = 256, + ATA_PFLAG_UNLOADING = 512, + ATA_PFLAG_UNLOADED = 1024, + ATA_PFLAG_SUSPENDED = 131072, + ATA_PFLAG_PM_PENDING = 262144, + ATA_PFLAG_INIT_GTM_VALID = 524288, + ATA_PFLAG_PIO32 = 1048576, + ATA_PFLAG_PIO32CHANGE = 2097152, + ATA_PFLAG_EXTERNAL = 4194304, + ATA_QCFLAG_ACTIVE = 1, + ATA_QCFLAG_DMAMAP = 2, + ATA_QCFLAG_IO = 8, + ATA_QCFLAG_RESULT_TF = 16, + ATA_QCFLAG_CLEAR_EXCL = 32, + ATA_QCFLAG_QUIET = 64, + ATA_QCFLAG_RETRY = 128, + ATA_QCFLAG_FAILED = 65536, + ATA_QCFLAG_SENSE_VALID = 131072, + ATA_QCFLAG_EH_SCHEDULED = 262144, + ATA_HOST_SIMPLEX = 1, + ATA_HOST_STARTED = 2, + ATA_HOST_PARALLEL_SCAN = 4, + ATA_HOST_IGNORE_ATA = 8, + ATA_TMOUT_BOOT = 30000, + ATA_TMOUT_BOOT_QUICK = 7000, + ATA_TMOUT_INTERNAL_QUICK = 5000, + ATA_TMOUT_MAX_PARK = 30000, + ATA_TMOUT_FF_WAIT_LONG = 2000, + ATA_TMOUT_FF_WAIT = 800, + ATA_WAIT_AFTER_RESET = 150, + ATA_TMOUT_PMP_SRST_WAIT = 5000, + ATA_TMOUT_SPURIOUS_PHY = 10000, + BUS_UNKNOWN = 0, + BUS_DMA = 1, + BUS_IDLE = 2, + BUS_NOINTR = 3, + BUS_NODATA = 4, + BUS_TIMER = 5, + BUS_PIO = 6, + BUS_EDD = 7, + BUS_IDENTIFY = 8, + BUS_PACKET = 9, + PORT_UNKNOWN = 0, + PORT_ENABLED = 1, + PORT_DISABLED = 2, + ATA_NR_PIO_MODES = 7, + ATA_NR_MWDMA_MODES = 5, + ATA_NR_UDMA_MODES = 8, + ATA_SHIFT_PIO = 0, + ATA_SHIFT_MWDMA = 7, + ATA_SHIFT_UDMA = 12, + ATA_SHIFT_PRIO = 6, + ATA_PRIO_HIGH = 2, + ATA_DMA_PAD_SZ = 4, + ATA_ERING_SIZE = 32, + ATA_DEFER_LINK = 1, + ATA_DEFER_PORT = 2, + ATA_EH_DESC_LEN = 80, + ATA_EH_REVALIDATE = 1, + ATA_EH_SOFTRESET = 2, + ATA_EH_HARDRESET = 4, + ATA_EH_RESET = 6, + ATA_EH_ENABLE_LINK = 8, + ATA_EH_PARK = 32, + ATA_EH_PERDEV_MASK = 33, + ATA_EH_ALL_ACTIONS = 15, + ATA_EHI_HOTPLUGGED = 1, + ATA_EHI_NO_AUTOPSY = 4, + ATA_EHI_QUIET = 8, + ATA_EHI_NO_RECOVERY = 16, + ATA_EHI_DID_SOFTRESET = 65536, + ATA_EHI_DID_HARDRESET = 131072, + ATA_EHI_PRINTINFO = 262144, + ATA_EHI_SETMODE = 524288, + ATA_EHI_POST_SETMODE = 1048576, + ATA_EHI_DID_RESET = 196608, + ATA_EHI_TO_SLAVE_MASK = 12, + ATA_EH_MAX_TRIES = 5, + ATA_LINK_RESUME_TRIES = 5, + ATA_PROBE_MAX_TRIES = 3, + ATA_EH_DEV_TRIES = 3, + ATA_EH_PMP_TRIES = 5, + ATA_EH_PMP_LINK_TRIES = 3, + SATA_PMP_RW_TIMEOUT = 3000, + ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 7, + ATA_HORKAGE_DIAGNOSTIC = 1, + ATA_HORKAGE_NODMA = 2, + ATA_HORKAGE_NONCQ = 4, + ATA_HORKAGE_MAX_SEC_128 = 8, + ATA_HORKAGE_BROKEN_HPA = 16, + ATA_HORKAGE_DISABLE = 32, + ATA_HORKAGE_HPA_SIZE = 64, + ATA_HORKAGE_IVB = 256, + ATA_HORKAGE_STUCK_ERR = 512, + ATA_HORKAGE_BRIDGE_OK = 1024, + ATA_HORKAGE_ATAPI_MOD16_DMA = 2048, + ATA_HORKAGE_FIRMWARE_WARN = 4096, + ATA_HORKAGE_1_5_GBPS = 8192, + ATA_HORKAGE_NOSETXFER = 16384, + ATA_HORKAGE_BROKEN_FPDMA_AA = 32768, + ATA_HORKAGE_DUMP_ID = 65536, + ATA_HORKAGE_MAX_SEC_LBA48 = 131072, + ATA_HORKAGE_ATAPI_DMADIR = 262144, + ATA_HORKAGE_NO_NCQ_TRIM = 524288, + ATA_HORKAGE_NOLPM = 1048576, + ATA_HORKAGE_WD_BROKEN_LPM = 2097152, + ATA_HORKAGE_ZERO_AFTER_TRIM = 4194304, + ATA_HORKAGE_NO_DMA_LOG = 8388608, + ATA_HORKAGE_NOTRIM = 16777216, + ATA_HORKAGE_MAX_SEC_1024 = 33554432, + ATA_HORKAGE_MAX_TRIM_128M = 67108864, + ATA_HORKAGE_NO_NCQ_ON_ATI = 134217728, + ATA_HORKAGE_NO_ID_DEV_LOG = 268435456, + ATA_DMA_MASK_ATA = 1, + ATA_DMA_MASK_ATAPI = 2, + ATA_DMA_MASK_CFA = 4, + ATAPI_READ = 0, + ATAPI_WRITE = 1, + ATAPI_READ_CD = 2, + ATAPI_PASS_THRU = 3, + ATAPI_MISC = 4, + ATA_TIMING_SETUP = 1, + ATA_TIMING_ACT8B = 2, + ATA_TIMING_REC8B = 4, + ATA_TIMING_CYC8B = 8, + ATA_TIMING_8BIT = 14, + ATA_TIMING_ACTIVE = 16, + ATA_TIMING_RECOVER = 32, + ATA_TIMING_DMACK_HOLD = 64, + ATA_TIMING_CYCLE = 128, + ATA_TIMING_UDMA = 256, + ATA_TIMING_ALL = 511, + ATA_ACPI_FILTER_SETXFER = 1, + ATA_ACPI_FILTER_LOCK = 2, + ATA_ACPI_FILTER_DIPM = 4, + ATA_ACPI_FILTER_FPDMA_OFFSET = 8, + ATA_ACPI_FILTER_FPDMA_AA = 16, + ATA_ACPI_FILTER_DEFAULT = 7, +}; + +enum ata_xfer_mask { + ATA_MASK_PIO = 127, + ATA_MASK_MWDMA = 3968, + ATA_MASK_UDMA = 1044480, +}; + +enum ata_completion_errors { + AC_ERR_OK = 0, + AC_ERR_DEV = 1, + AC_ERR_HSM = 2, + AC_ERR_TIMEOUT = 4, + AC_ERR_MEDIA = 8, + AC_ERR_ATA_BUS = 16, + AC_ERR_HOST_BUS = 32, + AC_ERR_SYSTEM = 64, + AC_ERR_INVALID = 128, + AC_ERR_OTHER = 256, + AC_ERR_NODEV_HINT = 512, + AC_ERR_NCQ = 1024, +}; + +enum ata_lpm_policy { + ATA_LPM_UNKNOWN = 0, + ATA_LPM_MAX_POWER = 1, + ATA_LPM_MED_POWER = 2, + ATA_LPM_MED_POWER_WITH_DIPM = 3, + ATA_LPM_MIN_POWER_WITH_PARTIAL = 4, + ATA_LPM_MIN_POWER = 5, +}; + +struct ata_queued_cmd; + +typedef void (*ata_qc_cb_t)(struct ata_queued_cmd *); + +struct ata_taskfile { + long unsigned int flags; + u8 protocol; + u8 ctl; + u8 hob_feature; + u8 hob_nsect; + u8 hob_lbal; + u8 hob_lbam; + u8 hob_lbah; + u8 feature; + u8 nsect; + u8 lbal; + u8 lbam; + u8 lbah; + u8 device; + u8 command; + u32 auxiliary; +}; + +struct ata_port; + +struct ata_device; + +struct ata_queued_cmd { + struct ata_port *ap; + struct ata_device *dev; + struct scsi_cmnd *scsicmd; + void (*scsidone)(struct scsi_cmnd *); + struct ata_taskfile tf; + u8 cdb[16]; + long unsigned int flags; + unsigned int tag; + unsigned int hw_tag; + unsigned int n_elem; + unsigned int orig_n_elem; + int dma_dir; + unsigned int sect_size; + unsigned int nbytes; + unsigned int extrabytes; + unsigned int curbytes; + struct scatterlist sgent; + struct scatterlist *sg; + struct scatterlist *cursg; + unsigned int cursg_ofs; + unsigned int err_mask; + struct ata_taskfile result_tf; + ata_qc_cb_t complete_fn; + void *private_data; + void *lldd_task; +}; + +struct ata_link; + +typedef int (*ata_prereset_fn_t)(struct ata_link *, long unsigned int); + +struct ata_eh_info { + struct ata_device *dev; + u32 serror; + unsigned int err_mask; + unsigned int action; + unsigned int dev_action[2]; + unsigned int flags; + unsigned int probe_mask; + char desc[80]; + int desc_len; +}; + +struct ata_eh_context { + struct ata_eh_info i; + int tries[2]; + int cmd_timeout_idx[14]; + unsigned int classes[2]; + unsigned int did_probe_mask; + unsigned int unloaded_mask; + unsigned int saved_ncq_enabled; + u8 saved_xfer_mode[2]; + long unsigned int last_reset; +}; + +struct ata_ering_entry { + unsigned int eflags; + unsigned int err_mask; + u64 timestamp; +}; + +struct ata_ering { + int cursor; + struct ata_ering_entry ring[32]; +}; + +struct ata_cpr_log; + +struct ata_device { + struct ata_link *link; + unsigned int devno; + unsigned int horkage; + long unsigned int flags; + struct scsi_device *sdev; + void *private_data; + union acpi_object *gtf_cache; + unsigned int gtf_filter; + void *zpodd; + struct device tdev; + u64 n_sectors; + u64 n_native_sectors; + unsigned int class; + long unsigned int unpark_deadline; + u8 pio_mode; + u8 dma_mode; + u8 xfer_mode; + unsigned int xfer_shift; + unsigned int multi_count; + unsigned int max_sectors; + unsigned int cdb_len; + long unsigned int pio_mask; + long unsigned int mwdma_mask; + long unsigned int udma_mask; + u16 cylinders; + u16 heads; + u16 sectors; + long: 16; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + u16 id[256]; + u32 gscr[128]; + }; + u8 devslp_timing[8]; + u8 ncq_send_recv_cmds[20]; + u8 ncq_non_data_cmds[64]; + u32 zac_zoned_cap; + u32 zac_zones_optimal_open; + u32 zac_zones_optimal_nonseq; + u32 zac_zones_max_open; + struct ata_cpr_log *cpr_log; + int spdn_cnt; + struct ata_ering ering; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct ata_link { + struct ata_port *ap; + int pmp; + struct device tdev; + unsigned int active_tag; + u32 sactive; + unsigned int flags; + u32 saved_scontrol; + unsigned int hw_sata_spd_limit; + unsigned int sata_spd_limit; + unsigned int sata_spd; + enum ata_lpm_policy lpm_policy; + struct ata_eh_info eh_info; + struct ata_eh_context eh_context; + long: 64; + struct ata_device device[2]; + long unsigned int last_lpm_change; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef int (*ata_reset_fn_t)(struct ata_link *, unsigned int *, long unsigned int); + +typedef void (*ata_postreset_fn_t)(struct ata_link *, unsigned int *); + +enum sw_activity { + OFF___2 = 0, + BLINK_ON = 1, + BLINK_OFF = 2, +}; + +struct ata_ioports { + void *cmd_addr; + void *data_addr; + void *error_addr; + void *feature_addr; + void *nsect_addr; + void *lbal_addr; + void *lbam_addr; + void *lbah_addr; + void *device_addr; + void *status_addr; + void *command_addr; + void *altstatus_addr; + void *ctl_addr; + void *bmdma_addr; + void *scr_addr; +}; + +struct ata_port_operations; + +struct ata_host { + spinlock_t lock; + struct device *dev; + void * const *iomap; + unsigned int n_ports; + unsigned int n_tags; + void *private_data; + struct ata_port_operations *ops; + long unsigned int flags; + struct kref kref; + struct mutex eh_mutex; + struct task_struct *eh_owner; + struct ata_port *simplex_claimed; + struct ata_port *ports[0]; +}; + +struct ata_port_operations { + int (*qc_defer)(struct ata_queued_cmd *); + int (*check_atapi_dma)(struct ata_queued_cmd *); + enum ata_completion_errors (*qc_prep)(struct ata_queued_cmd *); + unsigned int (*qc_issue)(struct ata_queued_cmd *); + bool (*qc_fill_rtf)(struct ata_queued_cmd *); + int (*cable_detect)(struct ata_port *); + long unsigned int (*mode_filter)(struct ata_device *, long unsigned int); + void (*set_piomode)(struct ata_port *, struct ata_device *); + void (*set_dmamode)(struct ata_port *, struct ata_device *); + int (*set_mode)(struct ata_link *, struct ata_device **); + unsigned int (*read_id)(struct ata_device *, struct ata_taskfile *, u16 *); + void (*dev_config)(struct ata_device *); + void (*freeze)(struct ata_port *); + void (*thaw)(struct ata_port *); + ata_prereset_fn_t prereset; + ata_reset_fn_t softreset; + ata_reset_fn_t hardreset; + ata_postreset_fn_t postreset; + ata_prereset_fn_t pmp_prereset; + ata_reset_fn_t pmp_softreset; + ata_reset_fn_t pmp_hardreset; + ata_postreset_fn_t pmp_postreset; + void (*error_handler)(struct ata_port *); + void (*lost_interrupt)(struct ata_port *); + void (*post_internal_cmd)(struct ata_queued_cmd *); + void (*sched_eh)(struct ata_port *); + void (*end_eh)(struct ata_port *); + int (*scr_read)(struct ata_link *, unsigned int, u32 *); + int (*scr_write)(struct ata_link *, unsigned int, u32); + void (*pmp_attach)(struct ata_port *); + void (*pmp_detach)(struct ata_port *); + int (*set_lpm)(struct ata_link *, enum ata_lpm_policy, unsigned int); + int (*port_suspend)(struct ata_port *, pm_message_t); + int (*port_resume)(struct ata_port *); + int (*port_start)(struct ata_port *); + void (*port_stop)(struct ata_port *); + void (*host_stop)(struct ata_host *); + void (*sff_dev_select)(struct ata_port *, unsigned int); + void (*sff_set_devctl)(struct ata_port *, u8); + u8 (*sff_check_status)(struct ata_port *); + u8 (*sff_check_altstatus)(struct ata_port *); + void (*sff_tf_load)(struct ata_port *, const struct ata_taskfile *); + void (*sff_tf_read)(struct ata_port *, struct ata_taskfile *); + void (*sff_exec_command)(struct ata_port *, const struct ata_taskfile *); + unsigned int (*sff_data_xfer)(struct ata_queued_cmd *, unsigned char *, unsigned int, int); + void (*sff_irq_on)(struct ata_port *); + bool (*sff_irq_check)(struct ata_port *); + void (*sff_irq_clear)(struct ata_port *); + void (*sff_drain_fifo)(struct ata_queued_cmd *); + void (*bmdma_setup)(struct ata_queued_cmd *); + void (*bmdma_start)(struct ata_queued_cmd *); + void (*bmdma_stop)(struct ata_queued_cmd *); + u8 (*bmdma_status)(struct ata_port *); + ssize_t (*em_show)(struct ata_port *, char *); + ssize_t (*em_store)(struct ata_port *, const char *, size_t); + ssize_t (*sw_activity_show)(struct ata_device *, char *); + ssize_t (*sw_activity_store)(struct ata_device *, enum sw_activity); + ssize_t (*transmit_led_message)(struct ata_port *, u32, ssize_t); + void (*phy_reset)(struct ata_port *); + void (*eng_timeout)(struct ata_port *); + const struct ata_port_operations *inherits; +}; + +struct ata_port_stats { + long unsigned int unhandled_irq; + long unsigned int idle_irq; + long unsigned int rw_reqbuf; +}; + +struct ata_acpi_drive { + u32 pio; + u32 dma; +}; + +struct ata_acpi_gtm { + struct ata_acpi_drive drive[2]; + u32 flags; +}; + +struct ata_port { + struct Scsi_Host *scsi_host; + struct ata_port_operations *ops; + spinlock_t *lock; + long unsigned int flags; + unsigned int pflags; + unsigned int print_id; + unsigned int local_port_no; + unsigned int port_no; + struct ata_ioports ioaddr; + u8 ctl; + u8 last_ctl; + struct ata_link *sff_pio_task_link; + struct delayed_work sff_pio_task; + struct ata_bmdma_prd *bmdma_prd; + dma_addr_t bmdma_prd_dma; + unsigned int pio_mask; + unsigned int mwdma_mask; + unsigned int udma_mask; + unsigned int cbl; + struct ata_queued_cmd qcmd[33]; + long unsigned int sas_tag_allocated; + u64 qc_active; + int nr_active_links; + unsigned int sas_last_tag; + long: 64; + struct ata_link link; + struct ata_link *slave_link; + int nr_pmp_links; + struct ata_link *pmp_link; + struct ata_link *excl_link; + struct ata_port_stats stats; + struct ata_host *host; + struct device *dev; + struct device tdev; + struct mutex scsi_scan_mutex; + struct delayed_work hotplug_task; + struct work_struct scsi_rescan_task; + unsigned int hsm_task_state; + u32 msg_enable; + struct list_head eh_done_q; + wait_queue_head_t eh_wait_q; + int eh_tries; + struct completion park_req_pending; + pm_message_t pm_mesg; + enum ata_lpm_policy target_lpm_policy; + struct timer_list fastdrain_timer; + long unsigned int fastdrain_cnt; + async_cookie_t cookie; + int em_message_type; + void *private_data; + struct ata_acpi_gtm __acpi_init_gtm; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u8 sector_buf[512]; +}; + +struct ata_cpr { + u8 num; + u8 num_storage_elements; + u64 start_lba; + u64 num_lbas; +}; + +struct ata_cpr_log { + u8 nr_cpr; + struct ata_cpr cpr[0]; +}; + +struct ata_port_info { + long unsigned int flags; + long unsigned int link_flags; + long unsigned int pio_mask; + long unsigned int mwdma_mask; + long unsigned int udma_mask; + struct ata_port_operations *port_ops; + void *private_data; +}; + +struct ata_timing { + short unsigned int mode; + short unsigned int setup; + short unsigned int act8b; + short unsigned int rec8b; + short unsigned int cyc8b; + short unsigned int active; + short unsigned int recover; + short unsigned int dmack_hold; + short unsigned int cycle; + short unsigned int udma; +}; + +struct pci_bits { + unsigned int reg; + unsigned int width; + long unsigned int mask; + long unsigned int val; +}; + +enum ata_link_iter_mode { + ATA_LITER_EDGE = 0, + ATA_LITER_HOST_FIRST = 1, + ATA_LITER_PMP_FIRST = 2, +}; + +enum ata_dev_iter_mode { + ATA_DITER_ENABLED = 0, + ATA_DITER_ENABLED_REVERSE = 1, + ATA_DITER_ALL = 2, + ATA_DITER_ALL_REVERSE = 3, +}; + +struct trace_event_raw_ata_qc_issue { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int tag; + unsigned char cmd; + unsigned char dev; + unsigned char lbal; + unsigned char lbam; + unsigned char lbah; + unsigned char nsect; + unsigned char feature; + unsigned char hob_lbal; + unsigned char hob_lbam; + unsigned char hob_lbah; + unsigned char hob_nsect; + unsigned char hob_feature; + unsigned char ctl; + unsigned char proto; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ata_qc_complete_template { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int tag; + unsigned char status; + unsigned char dev; + unsigned char lbal; + unsigned char lbam; + unsigned char lbah; + unsigned char nsect; + unsigned char error; + unsigned char hob_lbal; + unsigned char hob_lbam; + unsigned char hob_lbah; + unsigned char hob_nsect; + unsigned char hob_feature; + unsigned char ctl; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ata_eh_link_autopsy { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int eh_action; + unsigned int eh_err_mask; + char __data[0]; +}; + +struct trace_event_raw_ata_eh_link_autopsy_qc { + struct trace_entry ent; + unsigned int ata_port; + unsigned int ata_dev; + unsigned int tag; + unsigned int qc_flags; + unsigned int eh_err_mask; + char __data[0]; +}; + +struct trace_event_data_offsets_ata_qc_issue {}; + +struct trace_event_data_offsets_ata_qc_complete_template {}; + +struct trace_event_data_offsets_ata_eh_link_autopsy {}; + +struct trace_event_data_offsets_ata_eh_link_autopsy_qc {}; + +typedef void (*btf_trace_ata_qc_issue)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_qc_complete_internal)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_qc_complete_failed)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_qc_complete_done)(void *, struct ata_queued_cmd *); + +typedef void (*btf_trace_ata_eh_link_autopsy)(void *, struct ata_device *, unsigned int, unsigned int); + +typedef void (*btf_trace_ata_eh_link_autopsy_qc)(void *, struct ata_queued_cmd *); + +enum { + ATA_READID_POSTRESET = 1, + ATA_DNXFER_PIO = 0, + ATA_DNXFER_DMA = 1, + ATA_DNXFER_40C = 2, + ATA_DNXFER_FORCE_PIO = 3, + ATA_DNXFER_FORCE_PIO0 = 4, + ATA_DNXFER_QUIET = 2147483648, +}; + +struct ata_force_param { + const char *name; + u8 cbl; + u8 spd_limit; + long unsigned int xfer_mask; + unsigned int horkage_on; + unsigned int horkage_off; + u16 lflags; +}; + +struct ata_force_ent { + int port; + int device; + struct ata_force_param param; +}; + +struct ata_xfer_ent { + int shift; + int bits; + u8 base; +}; + +struct ata_blacklist_entry { + const char *model_num; + const char *model_rev; + long unsigned int horkage; +}; + +typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *); + +struct ata_scsi_args { + struct ata_device *dev; + u16 *id; + struct scsi_cmnd *cmd; +}; + +enum ata_lpm_hints { + ATA_LPM_EMPTY = 1, + ATA_LPM_HIPM = 2, + ATA_LPM_WAKE_ONLY = 4, +}; + +enum { + ATA_EH_SPDN_NCQ_OFF = 1, + ATA_EH_SPDN_SPEED_DOWN = 2, + ATA_EH_SPDN_FALLBACK_TO_PIO = 4, + ATA_EH_SPDN_KEEP_ERRORS = 8, + ATA_EFLAG_IS_IO = 1, + ATA_EFLAG_DUBIOUS_XFER = 2, + ATA_EFLAG_OLD_ER = 2147483648, + ATA_ECAT_NONE = 0, + ATA_ECAT_ATA_BUS = 1, + ATA_ECAT_TOUT_HSM = 2, + ATA_ECAT_UNK_DEV = 3, + ATA_ECAT_DUBIOUS_NONE = 4, + ATA_ECAT_DUBIOUS_ATA_BUS = 5, + ATA_ECAT_DUBIOUS_TOUT_HSM = 6, + ATA_ECAT_DUBIOUS_UNK_DEV = 7, + ATA_ECAT_NR = 8, + ATA_EH_CMD_DFL_TIMEOUT = 5000, + ATA_EH_RESET_COOL_DOWN = 5000, + ATA_EH_PRERESET_TIMEOUT = 10000, + ATA_EH_FASTDRAIN_INTERVAL = 3000, + ATA_EH_UA_TRIES = 5, + ATA_EH_PROBE_TRIAL_INTERVAL = 60000, + ATA_EH_PROBE_TRIALS = 2, +}; + +struct ata_eh_cmd_timeout_ent { + const u8 *commands; + const long unsigned int *timeouts; +}; + +struct speed_down_verdict_arg { + u64 since; + int xfer_ok; + int nr_errors[8]; +}; + +struct ata_internal { + struct scsi_transport_template t; + struct device_attribute private_port_attrs[3]; + struct device_attribute private_link_attrs[3]; + struct device_attribute private_dev_attrs[9]; + struct transport_container link_attr_cont; + struct transport_container dev_attr_cont; + struct device_attribute *link_attrs[4]; + struct device_attribute *port_attrs[4]; + struct device_attribute *dev_attrs[10]; +}; + +struct ata_show_ering_arg { + char *buf; + int written; +}; + +enum hsm_task_states { + HSM_ST_IDLE = 0, + HSM_ST_FIRST = 1, + HSM_ST = 2, + HSM_ST_LAST = 3, + HSM_ST_ERR = 4, +}; + +struct ata_acpi_gtf { + u8 tf[7]; +}; + +struct ata_acpi_hotplug_context { + struct acpi_hotplug_context hp; + union { + struct ata_port *ap; + struct ata_device *dev; + } data; +}; + +struct rm_feature_desc { + __be16 feature_code; + __u8 curr: 1; + __u8 persistent: 1; + __u8 feature_version: 4; + __u8 reserved1: 2; + __u8 add_len; + __u8 lock: 1; + __u8 dbml: 1; + __u8 pvnt_jmpr: 1; + __u8 eject: 1; + __u8 load: 1; + __u8 mech_type: 3; + __u8 reserved2; + __u8 reserved3; + __u8 reserved4; +}; + +enum odd_mech_type { + ODD_MECH_TYPE_SLOT = 0, + ODD_MECH_TYPE_DRAWER = 1, + ODD_MECH_TYPE_UNSUPPORTED = 2, +}; + +struct zpodd { + enum odd_mech_type mech_type; + struct ata_device *dev; + bool from_notify; + bool zp_ready; + long unsigned int last_ready; + bool zp_sampled; + bool powered_off; +}; + +struct sensor_device_attribute { + struct device_attribute dev_attr; + int index; +}; + +struct thermal_zone_of_device_ops { + int (*get_temp)(void *, int *); + int (*get_trend)(void *, int, enum thermal_trend *); + int (*set_trips)(void *, int, int); + int (*set_emul_temp)(void *, int); + int (*set_trip_temp)(void *, int, int); +}; + +enum { + AHCI_MAX_PORTS = 32, + AHCI_MAX_CLKS = 5, + AHCI_MAX_SG = 168, + AHCI_DMA_BOUNDARY = 4294967295, + AHCI_MAX_CMDS = 32, + AHCI_CMD_SZ = 32, + AHCI_CMD_SLOT_SZ = 1024, + AHCI_RX_FIS_SZ = 256, + AHCI_CMD_TBL_CDB = 64, + AHCI_CMD_TBL_HDR_SZ = 128, + AHCI_CMD_TBL_SZ = 2816, + AHCI_CMD_TBL_AR_SZ = 90112, + AHCI_PORT_PRIV_DMA_SZ = 91392, + AHCI_PORT_PRIV_FBS_DMA_SZ = 95232, + AHCI_IRQ_ON_SG = 2147483648, + AHCI_CMD_ATAPI = 32, + AHCI_CMD_WRITE = 64, + AHCI_CMD_PREFETCH = 128, + AHCI_CMD_RESET = 256, + AHCI_CMD_CLR_BUSY = 1024, + RX_FIS_PIO_SETUP = 32, + RX_FIS_D2H_REG = 64, + RX_FIS_SDB = 88, + RX_FIS_UNK = 96, + HOST_CAP = 0, + HOST_CTL = 4, + HOST_IRQ_STAT = 8, + HOST_PORTS_IMPL = 12, + HOST_VERSION = 16, + HOST_EM_LOC = 28, + HOST_EM_CTL = 32, + HOST_CAP2 = 36, + HOST_RESET = 1, + HOST_IRQ_EN = 2, + HOST_MRSM = 4, + HOST_AHCI_EN = 2147483648, + HOST_CAP_SXS = 32, + HOST_CAP_EMS = 64, + HOST_CAP_CCC = 128, + HOST_CAP_PART = 8192, + HOST_CAP_SSC = 16384, + HOST_CAP_PIO_MULTI = 32768, + HOST_CAP_FBS = 65536, + HOST_CAP_PMP = 131072, + HOST_CAP_ONLY = 262144, + HOST_CAP_CLO = 16777216, + HOST_CAP_LED = 33554432, + HOST_CAP_ALPM = 67108864, + HOST_CAP_SSS = 134217728, + HOST_CAP_MPS = 268435456, + HOST_CAP_SNTF = 536870912, + HOST_CAP_NCQ = 1073741824, + HOST_CAP_64 = 2147483648, + HOST_CAP2_BOH = 1, + HOST_CAP2_NVMHCI = 2, + HOST_CAP2_APST = 4, + HOST_CAP2_SDS = 8, + HOST_CAP2_SADM = 16, + HOST_CAP2_DESO = 32, + PORT_LST_ADDR = 0, + PORT_LST_ADDR_HI = 4, + PORT_FIS_ADDR = 8, + PORT_FIS_ADDR_HI = 12, + PORT_IRQ_STAT = 16, + PORT_IRQ_MASK = 20, + PORT_CMD = 24, + PORT_TFDATA = 32, + PORT_SIG = 36, + PORT_CMD_ISSUE = 56, + PORT_SCR_STAT = 40, + PORT_SCR_CTL = 44, + PORT_SCR_ERR = 48, + PORT_SCR_ACT = 52, + PORT_SCR_NTF = 60, + PORT_FBS = 64, + PORT_DEVSLP = 68, + PORT_IRQ_COLD_PRES = 2147483648, + PORT_IRQ_TF_ERR = 1073741824, + PORT_IRQ_HBUS_ERR = 536870912, + PORT_IRQ_HBUS_DATA_ERR = 268435456, + PORT_IRQ_IF_ERR = 134217728, + PORT_IRQ_IF_NONFATAL = 67108864, + PORT_IRQ_OVERFLOW = 16777216, + PORT_IRQ_BAD_PMP = 8388608, + PORT_IRQ_PHYRDY = 4194304, + PORT_IRQ_DEV_ILCK = 128, + PORT_IRQ_CONNECT = 64, + PORT_IRQ_SG_DONE = 32, + PORT_IRQ_UNK_FIS = 16, + PORT_IRQ_SDB_FIS = 8, + PORT_IRQ_DMAS_FIS = 4, + PORT_IRQ_PIOS_FIS = 2, + PORT_IRQ_D2H_REG_FIS = 1, + PORT_IRQ_FREEZE = 683671632, + PORT_IRQ_ERROR = 2025848912, + DEF_PORT_IRQ = 2025848959, + PORT_CMD_ASP = 134217728, + PORT_CMD_ALPE = 67108864, + PORT_CMD_ATAPI = 16777216, + PORT_CMD_FBSCP = 4194304, + PORT_CMD_ESP = 2097152, + PORT_CMD_HPCP = 262144, + PORT_CMD_PMP = 131072, + PORT_CMD_LIST_ON = 32768, + PORT_CMD_FIS_ON = 16384, + PORT_CMD_FIS_RX = 16, + PORT_CMD_CLO = 8, + PORT_CMD_POWER_ON = 4, + PORT_CMD_SPIN_UP = 2, + PORT_CMD_START = 1, + PORT_CMD_ICC_MASK = 4026531840, + PORT_CMD_ICC_ACTIVE = 268435456, + PORT_CMD_ICC_PARTIAL = 536870912, + PORT_CMD_ICC_SLUMBER = 1610612736, + PORT_FBS_DWE_OFFSET = 16, + PORT_FBS_ADO_OFFSET = 12, + PORT_FBS_DEV_OFFSET = 8, + PORT_FBS_DEV_MASK = 3840, + PORT_FBS_SDE = 4, + PORT_FBS_DEC = 2, + PORT_FBS_EN = 1, + PORT_DEVSLP_DM_OFFSET = 25, + PORT_DEVSLP_DM_MASK = 503316480, + PORT_DEVSLP_DITO_OFFSET = 15, + PORT_DEVSLP_MDAT_OFFSET = 10, + PORT_DEVSLP_DETO_OFFSET = 2, + PORT_DEVSLP_DSP = 2, + PORT_DEVSLP_ADSE = 1, + AHCI_HFLAG_NO_NCQ = 1, + AHCI_HFLAG_IGN_IRQ_IF_ERR = 2, + AHCI_HFLAG_IGN_SERR_INTERNAL = 4, + AHCI_HFLAG_32BIT_ONLY = 8, + AHCI_HFLAG_MV_PATA = 16, + AHCI_HFLAG_NO_MSI = 32, + AHCI_HFLAG_NO_PMP = 64, + AHCI_HFLAG_SECT255 = 256, + AHCI_HFLAG_YES_NCQ = 512, + AHCI_HFLAG_NO_SUSPEND = 1024, + AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = 2048, + AHCI_HFLAG_NO_SNTF = 4096, + AHCI_HFLAG_NO_FPDMA_AA = 8192, + AHCI_HFLAG_YES_FBS = 16384, + AHCI_HFLAG_DELAY_ENGINE = 32768, + AHCI_HFLAG_NO_DEVSLP = 131072, + AHCI_HFLAG_NO_FBS = 262144, + AHCI_HFLAG_MULTI_MSI = 1048576, + AHCI_HFLAG_WAKE_BEFORE_STOP = 4194304, + AHCI_HFLAG_YES_ALPM = 8388608, + AHCI_HFLAG_NO_WRITE_TO_RO = 16777216, + AHCI_HFLAG_IS_MOBILE = 33554432, + AHCI_HFLAG_SUSPEND_PHYS = 67108864, + AHCI_HFLAG_IGN_NOTSUPP_POWER_ON = 134217728, + AHCI_HFLAG_NO_SXS = 268435456, + AHCI_FLAG_COMMON = 393346, + ICH_MAP = 144, + PCS_6 = 146, + PCS_7 = 148, + EM_MAX_SLOTS = 8, + EM_MAX_RETRY = 5, + EM_CTL_RST = 512, + EM_CTL_TM = 256, + EM_CTL_MR = 1, + EM_CTL_ALHD = 67108864, + EM_CTL_XMT = 33554432, + EM_CTL_SMB = 16777216, + EM_CTL_SGPIO = 524288, + EM_CTL_SES = 262144, + EM_CTL_SAFTE = 131072, + EM_CTL_LED = 65536, + EM_MSG_TYPE_LED = 1, + EM_MSG_TYPE_SAFTE = 2, + EM_MSG_TYPE_SES2 = 4, + EM_MSG_TYPE_SGPIO = 8, +}; + +struct ahci_host_priv { + unsigned int flags; + u32 force_port_map; + u32 mask_port_map; + void *mmio; + u32 cap; + u32 cap2; + u32 version; + u32 port_map; + u32 saved_cap; + u32 saved_cap2; + u32 saved_port_map; + u32 em_loc; + u32 em_buf_sz; + u32 em_msg_type; + u32 remapped_nvme; + bool got_runtime_pm; + struct clk *clks[5]; + struct reset_control *rsts; + struct regulator **target_pwrs; + struct regulator *ahci_regulator; + struct regulator *phy_regulator; + struct phy **phys; + unsigned int nports; + void *plat_data; + unsigned int irq; + void (*start_engine)(struct ata_port *); + int (*stop_engine)(struct ata_port *); + irqreturn_t (*irq_handler)(int, void *); + int (*get_irq_vector)(struct ata_host *, int); +}; + +enum { + IMX_TIMER1MS = 224, + IMX_P0PHYCR = 376, + IMX_P0PHYCR_TEST_PDDQ = 1048576, + IMX_P0PHYCR_CR_READ = 524288, + IMX_P0PHYCR_CR_WRITE = 262144, + IMX_P0PHYCR_CR_CAP_DATA = 131072, + IMX_P0PHYCR_CR_CAP_ADDR = 65536, + IMX_P0PHYSR = 380, + IMX_P0PHYSR_CR_ACK = 262144, + IMX_P0PHYSR_CR_DATA_OUT = 65535, + IMX_LANE0_OUT_STAT = 8195, + IMX_LANE0_OUT_STAT_RX_PLL_STATE = 2, + IMX_CLOCK_RESET = 32575, + IMX_CLOCK_RESET_RESET = 1, + IMX8QM_SATA_PHY_RX_IMPED_RATIO_OFFSET = 3, + IMX8QM_SATA_PHY_TX_IMPED_RATIO_OFFSET = 9, + IMX8QM_SATA_PHY_IMPED_RATIO_85OHM = 108, + IMX8QM_LPCG_PHYX2_OFFSET = 0, + IMX8QM_CSR_PHYX2_OFFSET = 589824, + IMX8QM_CSR_PHYX1_OFFSET = 655360, + IMX8QM_CSR_PHYX_STTS0_OFFSET = 4, + IMX8QM_CSR_PCIEA_OFFSET = 720896, + IMX8QM_CSR_PCIEB_OFFSET = 786432, + IMX8QM_CSR_SATA_OFFSET = 851968, + IMX8QM_CSR_PCIE_CTRL2_OFFSET = 8, + IMX8QM_CSR_MISC_OFFSET = 917504, + IMX8QM_LPCG_PHYX2_PCLK0_MASK = 196608, + IMX8QM_LPCG_PHYX2_PCLK1_MASK = 3145728, + IMX8QM_PHY_APB_RSTN_0 = 1, + IMX8QM_PHY_MODE_SATA = 524288, + IMX8QM_PHY_MODE_MASK = 1966080, + IMX8QM_PHY_PIPE_RSTN_0 = 16777216, + IMX8QM_PHY_PIPE_RSTN_OVERRIDE_0 = 33554432, + IMX8QM_PHY_PIPE_RSTN_1 = 67108864, + IMX8QM_PHY_PIPE_RSTN_OVERRIDE_1 = 134217728, + IMX8QM_STTS0_LANE0_TX_PLL_LOCK = 16, + IMX8QM_MISC_IOB_RXENA = 1, + IMX8QM_MISC_IOB_TXENA = 2, + IMX8QM_MISC_PHYX1_EPCS_SEL = 4096, + IMX8QM_MISC_CLKREQN_OUT_OVERRIDE_1 = 16777216, + IMX8QM_MISC_CLKREQN_OUT_OVERRIDE_0 = 33554432, + IMX8QM_MISC_CLKREQN_IN_OVERRIDE_1 = 268435456, + IMX8QM_MISC_CLKREQN_IN_OVERRIDE_0 = 536870912, + IMX8QM_SATA_CTRL_RESET_N = 4096, + IMX8QM_SATA_CTRL_EPCS_PHYRESET_N = 128, + IMX8QM_CTRL_BUTTON_RST_N = 2097152, + IMX8QM_CTRL_POWER_UP_RST_N = 8388608, + IMX8QM_CTRL_LTSSM_ENABLE = 16, +}; + +enum ahci_imx_type { + AHCI_IMX53 = 0, + AHCI_IMX6Q = 1, + AHCI_IMX6QP = 2, + AHCI_IMX8QM = 3, +}; + +struct imx_ahci_priv { + struct platform_device *ahci_pdev; + enum ahci_imx_type type; + struct clk *sata_clk; + struct clk *sata_ref_clk; + struct clk *ahb_clk; + struct clk *epcs_tx_clk; + struct clk *epcs_rx_clk; + struct clk *phy_apbclk; + struct clk *phy_pclk0; + struct clk *phy_pclk1; + void *phy_base; + struct gpio_desc *clkreq_gpiod; + struct regmap *gpr; + bool no_device; + bool first_time; + u32 phy_params; + u32 imped_ratio; +}; + +enum { + SATA_PHY_CR_CLOCK_CRCMP_LT_LIMIT = 1, + SATA_PHY_CR_CLOCK_DAC_CTL = 8, + SATA_PHY_CR_CLOCK_RTUNE_CTL = 9, + SATA_PHY_CR_CLOCK_ADC_OUT = 10, + SATA_PHY_CR_CLOCK_MPLL_TST = 23, +}; + +struct reg_value { + u32 of_value; + u32 reg_value; +}; + +struct reg_property { + const char *name; + const struct reg_value *values; + size_t num_values; + u32 def_value; + u32 set_value; +}; + +struct ahci_cmd_hdr { + __le32 opts; + __le32 status; + __le32 tbl_addr; + __le32 tbl_addr_hi; + __le32 reserved[4]; +}; + +struct ahci_sg { + __le32 addr; + __le32 addr_hi; + __le32 reserved; + __le32 flags_size; +}; + +struct ahci_em_priv { + enum sw_activity blink_policy; + struct timer_list timer; + long unsigned int saved_activity; + long unsigned int activity; + long unsigned int led_state; + struct ata_link *link; +}; + +struct ahci_port_priv { + struct ata_link *active_link; + struct ahci_cmd_hdr *cmd_slot; + dma_addr_t cmd_slot_dma; + void *cmd_tbl; + dma_addr_t cmd_tbl_dma; + void *rx_fis; + dma_addr_t rx_fis_dma; + unsigned int ncq_saw_d2h: 1; + unsigned int ncq_saw_dmas: 1; + unsigned int ncq_saw_sdb: 1; + spinlock_t lock; + u32 intr_mask; + bool fbs_supported; + bool fbs_enabled; + int fbs_last_dev; + struct ahci_em_priv em_priv[8]; + char *irq_desc; +}; + +typedef void (*spi_res_release_t)(struct spi_controller *, struct spi_message *, void *); + +struct spi_res { + struct list_head entry; + spi_res_release_t release; + long long unsigned int data[0]; +}; + +struct spi_replaced_transfers; + +typedef void (*spi_replaced_release_t)(struct spi_controller *, struct spi_message *, struct spi_replaced_transfers *); + +struct spi_replaced_transfers { + spi_replaced_release_t release; + void *extradata; + struct list_head replaced_transfers; + struct list_head *replaced_after; + size_t inserted; + struct spi_transfer inserted_transfers[0]; +}; + +struct spi_board_info { + char modalias[32]; + const void *platform_data; + const struct software_node *swnode; + void *controller_data; + int irq; + u32 max_speed_hz; + u16 bus_num; + u16 chip_select; + u32 mode; +}; + +enum spi_mem_data_dir { + SPI_MEM_NO_DATA = 0, + SPI_MEM_DATA_IN = 1, + SPI_MEM_DATA_OUT = 2, +}; + +struct spi_mem_op { + struct { + u8 nbytes; + u8 buswidth; + u8 dtr: 1; + u16 opcode; + } cmd; + struct { + u8 nbytes; + u8 buswidth; + u8 dtr: 1; + u64 val; + } addr; + struct { + u8 nbytes; + u8 buswidth; + u8 dtr: 1; + } dummy; + struct { + u8 buswidth; + u8 dtr: 1; + enum spi_mem_data_dir dir; + unsigned int nbytes; + union { + void *in; + const void *out; + } buf; + } data; +}; + +struct spi_mem_dirmap_info { + struct spi_mem_op op_tmpl; + u64 offset; + u64 length; +}; + +struct spi_mem_dirmap_desc { + struct spi_mem *mem; + struct spi_mem_dirmap_info info; + unsigned int nodirmap; + void *priv; +}; + +struct spi_mem { + struct spi_device *spi; + void *drvpriv; + const char *name; +}; + +struct trace_event_raw_spi_controller { + struct trace_entry ent; + int bus_num; + char __data[0]; +}; + +struct trace_event_raw_spi_setup { + struct trace_entry ent; + int bus_num; + int chip_select; + long unsigned int mode; + unsigned int bits_per_word; + unsigned int max_speed_hz; + int status; + char __data[0]; +}; + +struct trace_event_raw_spi_set_cs { + struct trace_entry ent; + int bus_num; + int chip_select; + long unsigned int mode; + bool enable; + char __data[0]; +}; + +struct trace_event_raw_spi_message { + struct trace_entry ent; + int bus_num; + int chip_select; + struct spi_message *msg; + char __data[0]; +}; + +struct trace_event_raw_spi_message_done { + struct trace_entry ent; + int bus_num; + int chip_select; + struct spi_message *msg; + unsigned int frame; + unsigned int actual; + char __data[0]; +}; + +struct trace_event_raw_spi_transfer { + struct trace_entry ent; + int bus_num; + int chip_select; + struct spi_transfer *xfer; + int len; + u32 __data_loc_rx_buf; + u32 __data_loc_tx_buf; + char __data[0]; +}; + +struct trace_event_data_offsets_spi_controller {}; + +struct trace_event_data_offsets_spi_setup {}; + +struct trace_event_data_offsets_spi_set_cs {}; + +struct trace_event_data_offsets_spi_message {}; + +struct trace_event_data_offsets_spi_message_done {}; + +struct trace_event_data_offsets_spi_transfer { + u32 rx_buf; + u32 tx_buf; +}; + +typedef void (*btf_trace_spi_controller_idle)(void *, struct spi_controller *); + +typedef void (*btf_trace_spi_controller_busy)(void *, struct spi_controller *); + +typedef void (*btf_trace_spi_setup)(void *, struct spi_device *, int); + +typedef void (*btf_trace_spi_set_cs)(void *, struct spi_device *, bool); + +typedef void (*btf_trace_spi_message_submit)(void *, struct spi_message *); + +typedef void (*btf_trace_spi_message_start)(void *, struct spi_message *); + +typedef void (*btf_trace_spi_message_done)(void *, struct spi_message *); + +typedef void (*btf_trace_spi_transfer_start)(void *, struct spi_message *, struct spi_transfer *); + +typedef void (*btf_trace_spi_transfer_stop)(void *, struct spi_message *, struct spi_transfer *); + +struct boardinfo { + struct list_head list; + struct spi_board_info board_info; +}; + +struct acpi_spi_lookup { + struct spi_controller *ctlr; + u32 max_speed_hz; + u32 mode; + int irq; + u8 bits_per_word; + u8 chip_select; +}; + +struct spi_mem_driver { + struct spi_driver spidrv; + int (*probe)(struct spi_mem *); + int (*remove)(struct spi_mem *); + void (*shutdown)(struct spi_mem *); +}; + +struct fsl_spi_platform_data { + u32 initial_spmode; + s16 bus_num; + unsigned int flags; + u16 max_chipselect; + void (*cs_control)(struct spi_device *, bool); + u32 sysclk; +}; + +struct spi_pram; + +struct mpc8xxx_spi { + struct device *dev; + void *reg_base; + const void *tx; + void *rx; + int subblock; + struct spi_pram *pram; + struct spi_transfer *xfer_in_progress; + dma_addr_t tx_dma; + dma_addr_t rx_dma; + bool map_tx_dma; + bool map_rx_dma; + dma_addr_t dma_dummy_tx; + dma_addr_t dma_dummy_rx; + void (*get_rx)(u32, struct mpc8xxx_spi *); + u32 (*get_tx)(struct mpc8xxx_spi *); + unsigned int count; + unsigned int irq; + unsigned int nsecs; + u32 spibrg; + u32 rx_shift; + u32 tx_shift; + unsigned int flags; + int type; + int native_chipselects; + u8 max_bits_per_word; + void (*set_shifts)(u32 *, u32 *, int, int); + struct completion done; +}; + +struct mpc8xxx_spi_probe_info { + struct fsl_spi_platform_data pdata; + __be32 *immr_spi_cs; +}; + +struct spi_mpc8xxx_cs { + void (*get_rx)(u32, struct mpc8xxx_spi *); + u32 (*get_tx)(struct mpc8xxx_spi *); + u32 rx_shift; + u32 tx_shift; + u32 hw_mode; +}; + +struct fsl_spi_reg { + __be32 cap; + u8 res1[28]; + __be32 mode; + __be32 event; + __be32 mask; + __be32 command; + __be32 transmit; + __be32 receive; + __be32 slvsel; +}; + +struct fsl_spi_match_data { + int type; +}; + +struct omap2_mcspi_platform_config { + short unsigned int num_cs; + unsigned int regs_offset; + unsigned int pin_dir: 1; + size_t max_xfer_len; +}; + +struct omap2_mcspi_device_config { + unsigned int turbo_mode: 1; + unsigned int cs_per_word: 1; +}; + +struct omap2_mcspi_dma { + struct dma_chan *dma_tx; + struct dma_chan *dma_rx; + struct completion dma_tx_completion; + struct completion dma_rx_completion; + char dma_rx_ch_name[14]; + char dma_tx_ch_name[14]; +}; + +struct omap2_mcspi_regs { + u32 modulctrl; + u32 wakeupenable; + struct list_head cs; +}; + +struct omap2_mcspi { + struct completion txdone; + struct spi_controller *master; + void *base; + long unsigned int phys; + struct omap2_mcspi_dma *dma_channels; + struct device *dev; + struct omap2_mcspi_regs ctx; + int fifo_depth; + bool slave_aborted; + unsigned int pin_dir: 1; + size_t max_xfer_len; +}; + +struct omap2_mcspi_cs { + void *base; + long unsigned int phys; + int word_len; + u16 mode; + struct list_head node; + u32 chconf0; + u32 chctrl0; +}; + +enum netdev_state_t { + __LINK_STATE_START = 0, + __LINK_STATE_PRESENT = 1, + __LINK_STATE_NOCARRIER = 2, + __LINK_STATE_LINKWATCH_PENDING = 3, + __LINK_STATE_DORMANT = 4, + __LINK_STATE_TESTING = 5, +}; + +struct ethtool_cmd { + __u32 cmd; + __u32 supported; + __u32 advertising; + __u16 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 transceiver; + __u8 autoneg; + __u8 mdio_support; + __u32 maxtxpkt; + __u32 maxrxpkt; + __u16 speed_hi; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __u32 lp_advertising; + __u32 reserved[2]; +}; + +struct mii_ioctl_data { + __u16 phy_id; + __u16 reg_num; + __u16 val_in; + __u16 val_out; +}; + +struct mii_if_info { + int phy_id; + int advertising; + int phy_id_mask; + int reg_num_mask; + unsigned int full_duplex: 1; + unsigned int force_media: 1; + unsigned int supports_gmii: 1; + struct net_device *dev; + int (*mdio_read)(struct net_device *, int, int); + void (*mdio_write)(struct net_device *, int, int, int); +}; + +enum { + NETIF_F_SG_BIT = 0, + NETIF_F_IP_CSUM_BIT = 1, + __UNUSED_NETIF_F_1 = 2, + NETIF_F_HW_CSUM_BIT = 3, + NETIF_F_IPV6_CSUM_BIT = 4, + NETIF_F_HIGHDMA_BIT = 5, + NETIF_F_FRAGLIST_BIT = 6, + NETIF_F_HW_VLAN_CTAG_TX_BIT = 7, + NETIF_F_HW_VLAN_CTAG_RX_BIT = 8, + NETIF_F_HW_VLAN_CTAG_FILTER_BIT = 9, + NETIF_F_VLAN_CHALLENGED_BIT = 10, + NETIF_F_GSO_BIT = 11, + NETIF_F_LLTX_BIT = 12, + NETIF_F_NETNS_LOCAL_BIT = 13, + NETIF_F_GRO_BIT = 14, + NETIF_F_LRO_BIT = 15, + NETIF_F_GSO_SHIFT = 16, + NETIF_F_TSO_BIT = 16, + NETIF_F_GSO_ROBUST_BIT = 17, + NETIF_F_TSO_ECN_BIT = 18, + NETIF_F_TSO_MANGLEID_BIT = 19, + NETIF_F_TSO6_BIT = 20, + NETIF_F_FSO_BIT = 21, + NETIF_F_GSO_GRE_BIT = 22, + NETIF_F_GSO_GRE_CSUM_BIT = 23, + NETIF_F_GSO_IPXIP4_BIT = 24, + NETIF_F_GSO_IPXIP6_BIT = 25, + NETIF_F_GSO_UDP_TUNNEL_BIT = 26, + NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT = 27, + NETIF_F_GSO_PARTIAL_BIT = 28, + NETIF_F_GSO_TUNNEL_REMCSUM_BIT = 29, + NETIF_F_GSO_SCTP_BIT = 30, + NETIF_F_GSO_ESP_BIT = 31, + NETIF_F_GSO_UDP_BIT = 32, + NETIF_F_GSO_UDP_L4_BIT = 33, + NETIF_F_GSO_FRAGLIST_BIT = 34, + NETIF_F_GSO_LAST = 34, + NETIF_F_FCOE_CRC_BIT = 35, + NETIF_F_SCTP_CRC_BIT = 36, + NETIF_F_FCOE_MTU_BIT = 37, + NETIF_F_NTUPLE_BIT = 38, + NETIF_F_RXHASH_BIT = 39, + NETIF_F_RXCSUM_BIT = 40, + NETIF_F_NOCACHE_COPY_BIT = 41, + NETIF_F_LOOPBACK_BIT = 42, + NETIF_F_RXFCS_BIT = 43, + NETIF_F_RXALL_BIT = 44, + NETIF_F_HW_VLAN_STAG_TX_BIT = 45, + NETIF_F_HW_VLAN_STAG_RX_BIT = 46, + NETIF_F_HW_VLAN_STAG_FILTER_BIT = 47, + NETIF_F_HW_L2FW_DOFFLOAD_BIT = 48, + NETIF_F_HW_TC_BIT = 49, + NETIF_F_HW_ESP_BIT = 50, + NETIF_F_HW_ESP_TX_CSUM_BIT = 51, + NETIF_F_RX_UDP_TUNNEL_PORT_BIT = 52, + NETIF_F_HW_TLS_TX_BIT = 53, + NETIF_F_HW_TLS_RX_BIT = 54, + NETIF_F_GRO_HW_BIT = 55, + NETIF_F_HW_TLS_RECORD_BIT = 56, + NETIF_F_GRO_FRAGLIST_BIT = 57, + NETIF_F_HW_MACSEC_BIT = 58, + NETIF_F_GRO_UDP_FWD_BIT = 59, + NETIF_F_HW_HSR_TAG_INS_BIT = 60, + NETIF_F_HW_HSR_TAG_RM_BIT = 61, + NETIF_F_HW_HSR_FWD_BIT = 62, + NETIF_F_HW_HSR_DUP_BIT = 63, + NETDEV_FEATURE_COUNT = 64, +}; + +typedef struct bio_vec skb_frag_t; + +struct skb_shared_hwtstamps { + ktime_t hwtstamp; +}; + +enum { + SKBTX_HW_TSTAMP = 1, + SKBTX_SW_TSTAMP = 2, + SKBTX_IN_PROGRESS = 4, + SKBTX_WIFI_STATUS = 16, + SKBTX_SCHED_TSTAMP = 64, +}; + +struct skb_shared_info { + __u8 flags; + __u8 meta_len; + __u8 nr_frags; + __u8 tx_flags; + short unsigned int gso_size; + short unsigned int gso_segs; + struct sk_buff *frag_list; + struct skb_shared_hwtstamps hwtstamps; + unsigned int gso_type; + u32 tskey; + atomic_t dataref; + void *destructor_arg; + skb_frag_t frags[17]; +}; + +struct mdio_board_info { + const char *bus_id; + char modalias[32]; + int mdio_addr; + const void *platform_data; +}; + +struct mdio_board_entry { + struct list_head list; + struct mdio_board_info board_info; +}; + +struct mdiobus_devres { + struct mii_bus *mii; +}; + +struct phy_c45_device_ids { + u32 devices_in_package; + u32 mmds_present; + u32 device_ids[32]; +}; + +enum phy_state { + PHY_DOWN = 0, + PHY_READY = 1, + PHY_HALTED = 2, + PHY_UP = 3, + PHY_RUNNING = 4, + PHY_NOLINK = 5, + PHY_CABLETEST = 6, +}; + +struct phylink; + +struct phy_driver; + +struct phy_led_trigger; + +struct mii_timestamper; + +struct phy_device { + struct mdio_device mdio; + struct phy_driver *drv; + u32 phy_id; + struct phy_c45_device_ids c45_ids; + unsigned int is_c45: 1; + unsigned int is_internal: 1; + unsigned int is_pseudo_fixed_link: 1; + unsigned int is_gigabit_capable: 1; + unsigned int has_fixups: 1; + unsigned int suspended: 1; + unsigned int suspended_by_mdio_bus: 1; + unsigned int sysfs_links: 1; + unsigned int loopback_enabled: 1; + unsigned int downshifted_rate: 1; + unsigned int is_on_sfp_module: 1; + unsigned int mac_managed_pm: 1; + unsigned int autoneg: 1; + unsigned int link: 1; + unsigned int autoneg_complete: 1; + unsigned int interrupts: 1; + enum phy_state state; + u32 dev_flags; + phy_interface_t interface; + int speed; + int duplex; + int port; + int pause; + int asym_pause; + u8 master_slave_get; + u8 master_slave_set; + u8 master_slave_state; + long unsigned int supported[2]; + long unsigned int advertising[2]; + long unsigned int lp_advertising[2]; + long unsigned int adv_old[2]; + u32 eee_broken_modes; + struct phy_led_trigger *phy_led_triggers; + unsigned int phy_num_led_triggers; + struct phy_led_trigger *last_triggered; + struct phy_led_trigger *led_link_trigger; + int irq; + void *priv; + struct phy_package_shared *shared; + struct sk_buff *skb; + void *ehdr; + struct nlattr *nest; + struct delayed_work state_queue; + struct mutex lock; + bool sfp_bus_attached; + struct sfp_bus *sfp_bus; + struct phylink *phylink; + struct net_device *attached_dev; + struct mii_timestamper *mii_ts; + u8 mdix; + u8 mdix_ctrl; + void (*phy_link_change)(struct phy_device *, bool); + void (*adjust_link)(struct net_device *); + const struct macsec_ops *macsec_ops; +}; + +struct phy_tdr_config { + u32 first; + u32 last; + u32 step; + s8 pair; +}; + +enum { + ETHTOOL_MSG_KERNEL_NONE = 0, + ETHTOOL_MSG_STRSET_GET_REPLY = 1, + ETHTOOL_MSG_LINKINFO_GET_REPLY = 2, + ETHTOOL_MSG_LINKINFO_NTF = 3, + ETHTOOL_MSG_LINKMODES_GET_REPLY = 4, + ETHTOOL_MSG_LINKMODES_NTF = 5, + ETHTOOL_MSG_LINKSTATE_GET_REPLY = 6, + ETHTOOL_MSG_DEBUG_GET_REPLY = 7, + ETHTOOL_MSG_DEBUG_NTF = 8, + ETHTOOL_MSG_WOL_GET_REPLY = 9, + ETHTOOL_MSG_WOL_NTF = 10, + ETHTOOL_MSG_FEATURES_GET_REPLY = 11, + ETHTOOL_MSG_FEATURES_SET_REPLY = 12, + ETHTOOL_MSG_FEATURES_NTF = 13, + ETHTOOL_MSG_PRIVFLAGS_GET_REPLY = 14, + ETHTOOL_MSG_PRIVFLAGS_NTF = 15, + ETHTOOL_MSG_RINGS_GET_REPLY = 16, + ETHTOOL_MSG_RINGS_NTF = 17, + ETHTOOL_MSG_CHANNELS_GET_REPLY = 18, + ETHTOOL_MSG_CHANNELS_NTF = 19, + ETHTOOL_MSG_COALESCE_GET_REPLY = 20, + ETHTOOL_MSG_COALESCE_NTF = 21, + ETHTOOL_MSG_PAUSE_GET_REPLY = 22, + ETHTOOL_MSG_PAUSE_NTF = 23, + ETHTOOL_MSG_EEE_GET_REPLY = 24, + ETHTOOL_MSG_EEE_NTF = 25, + ETHTOOL_MSG_TSINFO_GET_REPLY = 26, + ETHTOOL_MSG_CABLE_TEST_NTF = 27, + ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 28, + ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 29, + ETHTOOL_MSG_FEC_GET_REPLY = 30, + ETHTOOL_MSG_FEC_NTF = 31, + ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY = 32, + ETHTOOL_MSG_STATS_GET_REPLY = 33, + ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY = 34, + ETHTOOL_MSG_MODULE_GET_REPLY = 35, + ETHTOOL_MSG_MODULE_NTF = 36, + __ETHTOOL_MSG_KERNEL_CNT = 37, + ETHTOOL_MSG_KERNEL_MAX = 36, +}; + +enum { + ETHTOOL_A_STATS_UNSPEC = 0, + ETHTOOL_A_STATS_PAD = 1, + ETHTOOL_A_STATS_HEADER = 2, + ETHTOOL_A_STATS_GROUPS = 3, + ETHTOOL_A_STATS_GRP = 4, + __ETHTOOL_A_STATS_CNT = 5, + ETHTOOL_A_STATS_MAX = 4, +}; + +struct mii_timestamper { + bool (*rxtstamp)(struct mii_timestamper *, struct sk_buff *, int); + void (*txtstamp)(struct mii_timestamper *, struct sk_buff *, int); + int (*hwtstamp)(struct mii_timestamper *, struct ifreq *); + void (*link_state)(struct mii_timestamper *, struct phy_device *); + int (*ts_info)(struct mii_timestamper *, struct ethtool_ts_info *); + struct device *device; +}; + +struct phy_driver { + struct mdio_driver_common mdiodrv; + u32 phy_id; + char *name; + u32 phy_id_mask; + const long unsigned int * const features; + u32 flags; + const void *driver_data; + int (*soft_reset)(struct phy_device *); + int (*config_init)(struct phy_device *); + int (*probe)(struct phy_device *); + int (*get_features)(struct phy_device *); + int (*suspend)(struct phy_device *); + int (*resume)(struct phy_device *); + int (*config_aneg)(struct phy_device *); + int (*aneg_done)(struct phy_device *); + int (*read_status)(struct phy_device *); + int (*config_intr)(struct phy_device *); + irqreturn_t (*handle_interrupt)(struct phy_device *); + void (*remove)(struct phy_device *); + int (*match_phy_device)(struct phy_device *); + int (*set_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*get_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*link_change_notify)(struct phy_device *); + int (*read_mmd)(struct phy_device *, int, u16); + int (*write_mmd)(struct phy_device *, int, u16, u16); + int (*read_page)(struct phy_device *); + int (*write_page)(struct phy_device *, int); + int (*module_info)(struct phy_device *, struct ethtool_modinfo *); + int (*module_eeprom)(struct phy_device *, struct ethtool_eeprom *, u8 *); + int (*cable_test_start)(struct phy_device *); + int (*cable_test_tdr_start)(struct phy_device *, const struct phy_tdr_config *); + int (*cable_test_get_status)(struct phy_device *, bool *); + int (*get_sset_count)(struct phy_device *); + void (*get_strings)(struct phy_device *, u8 *); + void (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*get_tunable)(struct phy_device *, struct ethtool_tunable *, void *); + int (*set_tunable)(struct phy_device *, struct ethtool_tunable *, const void *); + int (*set_loopback)(struct phy_device *, bool); + int (*get_sqi)(struct phy_device *); + int (*get_sqi_max)(struct phy_device *); +}; + +struct phy_led_trigger { + struct led_trigger trigger; + char name[76]; + unsigned int speed; +}; + +struct phy_setting { + u32 speed; + u8 duplex; + u8 bit; +}; + +struct ethtool_phy_ops { + int (*get_sset_count)(struct phy_device *); + int (*get_strings)(struct phy_device *, u8 *); + int (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*start_cable_test)(struct phy_device *, struct netlink_ext_ack *); + int (*start_cable_test_tdr)(struct phy_device *, struct netlink_ext_ack *, const struct phy_tdr_config *); +}; + +struct phy_fixup { + struct list_head list; + char bus_id[64]; + u32 phy_uid; + u32 phy_uid_mask; + int (*run)(struct phy_device *); +}; + +struct sfp_eeprom_base { + u8 phys_id; + u8 phys_ext_id; + u8 connector; + u8 if_1x_copper_passive: 1; + u8 if_1x_copper_active: 1; + u8 if_1x_lx: 1; + u8 if_1x_sx: 1; + u8 e10g_base_sr: 1; + u8 e10g_base_lr: 1; + u8 e10g_base_lrm: 1; + u8 e10g_base_er: 1; + u8 sonet_oc3_short_reach: 1; + u8 sonet_oc3_smf_intermediate_reach: 1; + u8 sonet_oc3_smf_long_reach: 1; + u8 unallocated_5_3: 1; + u8 sonet_oc12_short_reach: 1; + u8 sonet_oc12_smf_intermediate_reach: 1; + u8 sonet_oc12_smf_long_reach: 1; + u8 unallocated_5_7: 1; + u8 sonet_oc48_short_reach: 1; + u8 sonet_oc48_intermediate_reach: 1; + u8 sonet_oc48_long_reach: 1; + u8 sonet_reach_bit2: 1; + u8 sonet_reach_bit1: 1; + u8 sonet_oc192_short_reach: 1; + u8 escon_smf_1310_laser: 1; + u8 escon_mmf_1310_led: 1; + u8 e1000_base_sx: 1; + u8 e1000_base_lx: 1; + u8 e1000_base_cx: 1; + u8 e1000_base_t: 1; + u8 e100_base_lx: 1; + u8 e100_base_fx: 1; + u8 e_base_bx10: 1; + u8 e_base_px: 1; + u8 fc_tech_electrical_inter_enclosure: 1; + u8 fc_tech_lc: 1; + u8 fc_tech_sa: 1; + u8 fc_ll_m: 1; + u8 fc_ll_l: 1; + u8 fc_ll_i: 1; + u8 fc_ll_s: 1; + u8 fc_ll_v: 1; + u8 unallocated_8_0: 1; + u8 unallocated_8_1: 1; + u8 sfp_ct_passive: 1; + u8 sfp_ct_active: 1; + u8 fc_tech_ll: 1; + u8 fc_tech_sl: 1; + u8 fc_tech_sn: 1; + u8 fc_tech_electrical_intra_enclosure: 1; + u8 fc_media_sm: 1; + u8 unallocated_9_1: 1; + u8 fc_media_m5: 1; + u8 fc_media_m6: 1; + u8 fc_media_tv: 1; + u8 fc_media_mi: 1; + u8 fc_media_tp: 1; + u8 fc_media_tw: 1; + u8 fc_speed_100: 1; + u8 unallocated_10_1: 1; + u8 fc_speed_200: 1; + u8 fc_speed_3200: 1; + u8 fc_speed_400: 1; + u8 fc_speed_1600: 1; + u8 fc_speed_800: 1; + u8 fc_speed_1200: 1; + u8 encoding; + u8 br_nominal; + u8 rate_id; + u8 link_len[6]; + char vendor_name[16]; + u8 extended_cc; + char vendor_oui[3]; + char vendor_pn[16]; + char vendor_rev[4]; + union { + __be16 optical_wavelength; + __be16 cable_compliance; + struct { + u8 sff8431_app_e: 1; + u8 fc_pi_4_app_h: 1; + u8 reserved60_2: 6; + u8 reserved61: 8; + } passive; + struct { + u8 sff8431_app_e: 1; + u8 fc_pi_4_app_h: 1; + u8 sff8431_lim: 1; + u8 fc_pi_4_lim: 1; + u8 reserved60_4: 4; + u8 reserved61: 8; + } active; + }; + u8 reserved62; + u8 cc_base; +}; + +struct sfp_eeprom_ext { + __be16 options; + u8 br_max; + u8 br_min; + char vendor_sn[16]; + char datecode[8]; + u8 diagmon; + u8 enhopts; + u8 sff8472_compliance; + u8 cc_ext; +}; + +struct sfp_eeprom_id { + struct sfp_eeprom_base base; + struct sfp_eeprom_ext ext; +}; + +struct sfp_upstream_ops { + void (*attach)(void *, struct sfp_bus *); + void (*detach)(void *, struct sfp_bus *); + int (*module_insert)(void *, const struct sfp_eeprom_id *); + void (*module_remove)(void *); + int (*module_start)(void *); + void (*module_stop)(void *); + void (*link_down)(void *); + void (*link_up)(void *); + int (*connect_phy)(void *, struct phy_device *); + void (*disconnect_phy)(void *); +}; + +struct trace_event_raw_mdio_access { + struct trace_entry ent; + char busid[61]; + char read; + u8 addr; + u16 val; + unsigned int regnum; + char __data[0]; +}; + +struct trace_event_data_offsets_mdio_access {}; + +typedef void (*btf_trace_mdio_access)(void *, struct mii_bus *, char, u8, unsigned int, u16, int); + +struct mdio_bus_stat_attr { + int addr; + unsigned int field_offset; +}; + +struct fixed_phy_status { + int link; + int speed; + int duplex; + int pause; + int asym_pause; +}; + +struct swmii_regs { + u16 bmsr; + u16 lpa; + u16 lpagb; + u16 estat; +}; + +enum { + SWMII_SPEED_10 = 0, + SWMII_SPEED_100 = 1, + SWMII_SPEED_1000 = 2, + SWMII_DUPLEX_HALF = 0, + SWMII_DUPLEX_FULL = 1, +}; + +struct mii_timestamping_ctrl { + struct mii_timestamper * (*probe_channel)(struct device *, unsigned int); + void (*release_channel)(struct device *, struct mii_timestamper *); +}; + +struct mii_timestamping_desc { + struct list_head list; + struct mii_timestamping_ctrl *ctrl; + struct device *device; +}; + +struct sfp; + +struct sfp_socket_ops; + +struct sfp_quirk; + +struct sfp_bus { + struct kref kref; + struct list_head node; + struct fwnode_handle *fwnode; + const struct sfp_socket_ops *socket_ops; + struct device *sfp_dev; + struct sfp *sfp; + const struct sfp_quirk *sfp_quirk; + const struct sfp_upstream_ops *upstream_ops; + void *upstream; + struct phy_device *phydev; + bool registered; + bool started; +}; + +enum { + SFF8024_ID_UNK = 0, + SFF8024_ID_SFF_8472 = 2, + SFF8024_ID_SFP = 3, + SFF8024_ID_DWDM_SFP = 11, + SFF8024_ID_QSFP_8438 = 12, + SFF8024_ID_QSFP_8436_8636 = 13, + SFF8024_ID_QSFP28_8636 = 17, + SFF8024_ENCODING_UNSPEC = 0, + SFF8024_ENCODING_8B10B = 1, + SFF8024_ENCODING_4B5B = 2, + SFF8024_ENCODING_NRZ = 3, + SFF8024_ENCODING_8472_MANCHESTER = 4, + SFF8024_ENCODING_8472_SONET = 5, + SFF8024_ENCODING_8472_64B66B = 6, + SFF8024_ENCODING_8436_MANCHESTER = 6, + SFF8024_ENCODING_8436_SONET = 4, + SFF8024_ENCODING_8436_64B66B = 5, + SFF8024_ENCODING_256B257B = 7, + SFF8024_ENCODING_PAM4 = 8, + SFF8024_CONNECTOR_UNSPEC = 0, + SFF8024_CONNECTOR_SC = 1, + SFF8024_CONNECTOR_FIBERJACK = 6, + SFF8024_CONNECTOR_LC = 7, + SFF8024_CONNECTOR_MT_RJ = 8, + SFF8024_CONNECTOR_MU = 9, + SFF8024_CONNECTOR_SG = 10, + SFF8024_CONNECTOR_OPTICAL_PIGTAIL = 11, + SFF8024_CONNECTOR_MPO_1X12 = 12, + SFF8024_CONNECTOR_MPO_2X16 = 13, + SFF8024_CONNECTOR_HSSDC_II = 32, + SFF8024_CONNECTOR_COPPER_PIGTAIL = 33, + SFF8024_CONNECTOR_RJ45 = 34, + SFF8024_CONNECTOR_NOSEPARATE = 35, + SFF8024_CONNECTOR_MXC_2X16 = 36, + SFF8024_ECC_UNSPEC = 0, + SFF8024_ECC_100G_25GAUI_C2M_AOC = 1, + SFF8024_ECC_100GBASE_SR4_25GBASE_SR = 2, + SFF8024_ECC_100GBASE_LR4_25GBASE_LR = 3, + SFF8024_ECC_100GBASE_ER4_25GBASE_ER = 4, + SFF8024_ECC_100GBASE_SR10 = 5, + SFF8024_ECC_100GBASE_CR4 = 11, + SFF8024_ECC_25GBASE_CR_S = 12, + SFF8024_ECC_25GBASE_CR_N = 13, + SFF8024_ECC_10GBASE_T_SFI = 22, + SFF8024_ECC_10GBASE_T_SR = 28, + SFF8024_ECC_5GBASE_T = 29, + SFF8024_ECC_2_5GBASE_T = 30, +}; + +struct sfp_socket_ops { + void (*attach)(struct sfp *); + void (*detach)(struct sfp *); + void (*start)(struct sfp *); + void (*stop)(struct sfp *); + int (*module_info)(struct sfp *, struct ethtool_modinfo *); + int (*module_eeprom)(struct sfp *, struct ethtool_eeprom *, u8 *); + int (*module_eeprom_by_page)(struct sfp *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *); +}; + +struct sfp_quirk { + const char *vendor; + const char *part; + void (*modes)(const struct sfp_eeprom_id *, long unsigned int *); +}; + +struct mdio_device_id { + __u32 phy_id; + __u32 phy_id_mask; +}; + +enum { + MDIO_AN_C22 = 65504, +}; + +struct fixed_mdio_bus { + struct mii_bus *mii_bus; + struct list_head phys; +}; + +struct fixed_phy { + int addr; + struct phy_device *phydev; + struct fixed_phy_status status; + bool no_carrier; + int (*link_update)(struct net_device *, struct fixed_phy_status *); + struct list_head node; + struct gpio_desc *link_gpiod; +}; + +struct mdio_mux_child_bus; + +struct mdio_mux_parent_bus { + struct mii_bus *mii_bus; + int current_child; + int parent_id; + void *switch_data; + int (*switch_fn)(int, int, void *); + struct mdio_mux_child_bus *children; +}; + +struct mdio_mux_child_bus { + struct mii_bus *mii_bus; + struct mdio_mux_parent_bus *parent; + struct mdio_mux_child_bus *next; + int bus_number; +}; + +struct iproc_mdiomux_desc { + void *mux_handle; + void *base; + struct device *dev; + struct mii_bus *mii_bus; + struct clk *core_clk; +}; + +struct flow_dissector_key_control { + u16 thoff; + u16 addr_type; + u32 flags; +}; + +struct flow_dissector_key_basic { + __be16 n_proto; + u8 ip_proto; + u8 padding; +}; + +struct flow_dissector { + unsigned int used_keys; + short unsigned int offset[28]; +}; + +struct flow_keys_basic { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; +}; + +struct nf_conntrack { + atomic_t use; +}; + +enum { + SKBFL_ZEROCOPY_ENABLE = 1, + SKBFL_SHARED_FRAG = 2, + SKBFL_PURE_ZEROCOPY = 4, +}; + +struct mmpin { + struct user_struct *user; + unsigned int num_pg; +}; + +struct ubuf_info { + void (*callback)(struct sk_buff *, struct ubuf_info *, bool); + union { + struct { + long unsigned int desc; + void *ctx; + }; + struct { + u32 id; + u16 len; + u16 zerocopy: 1; + u32 bytelen; + }; + }; + refcount_t refcnt; + u8 flags; + struct mmpin mmp; +}; + +enum { + SKB_GSO_TCPV4 = 1, + SKB_GSO_DODGY = 2, + SKB_GSO_TCP_ECN = 4, + SKB_GSO_TCP_FIXEDID = 8, + SKB_GSO_TCPV6 = 16, + SKB_GSO_FCOE = 32, + SKB_GSO_GRE = 64, + SKB_GSO_GRE_CSUM = 128, + SKB_GSO_IPXIP4 = 256, + SKB_GSO_IPXIP6 = 512, + SKB_GSO_UDP_TUNNEL = 1024, + SKB_GSO_UDP_TUNNEL_CSUM = 2048, + SKB_GSO_PARTIAL = 4096, + SKB_GSO_TUNNEL_REMCSUM = 8192, + SKB_GSO_SCTP = 16384, + SKB_GSO_ESP = 32768, + SKB_GSO_UDP = 65536, + SKB_GSO_UDP_L4 = 131072, + SKB_GSO_FRAGLIST = 262144, +}; + +enum { + IFLA_TUN_UNSPEC = 0, + IFLA_TUN_OWNER = 1, + IFLA_TUN_GROUP = 2, + IFLA_TUN_TYPE = 3, + IFLA_TUN_PI = 4, + IFLA_TUN_VNET_HDR = 5, + IFLA_TUN_PERSIST = 6, + IFLA_TUN_MULTI_QUEUE = 7, + IFLA_TUN_NUM_QUEUES = 8, + IFLA_TUN_NUM_DISABLED_QUEUES = 9, + __IFLA_TUN_MAX = 10, +}; + +struct gro_list { + struct list_head list; + int count; +}; + +struct napi_struct { + struct list_head poll_list; + long unsigned int state; + int weight; + int defer_hard_irqs_count; + long unsigned int gro_bitmask; + int (*poll)(struct napi_struct *, int); + int poll_owner; + struct net_device *dev; + struct gro_list gro_hash[8]; + struct sk_buff *skb; + struct list_head rx_list; + int rx_count; + struct hrtimer timer; + struct list_head dev_list; + struct hlist_node napi_hash_node; + unsigned int napi_id; + struct task_struct *thread; +}; + +enum gro_result { + GRO_MERGED = 0, + GRO_MERGED_FREE = 1, + GRO_HELD = 2, + GRO_NORMAL = 3, + GRO_CONSUMED = 4, +}; + +typedef enum gro_result gro_result_t; + +enum netdev_queue_state_t { + __QUEUE_STATE_DRV_XOFF = 0, + __QUEUE_STATE_STACK_XOFF = 1, + __QUEUE_STATE_FROZEN = 2, +}; + +struct rps_sock_flow_table { + u32 mask; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 ents[0]; +}; + +struct ip_tunnel_parm { + char name[16]; + int link; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + struct iphdr iph; +}; + +struct wpan_phy; + +struct wpan_dev_header_ops; + +struct wpan_dev { + struct wpan_phy *wpan_phy; + int iftype; + struct list_head list; + struct net_device *netdev; + const struct wpan_dev_header_ops *header_ops; + struct net_device *lowpan_dev; + u32 identifier; + __le16 pan_id; + __le16 short_addr; + __le64 extended_addr; + atomic_t bsn; + atomic_t dsn; + u8 min_be; + u8 max_be; + u8 csma_retries; + s8 frame_retries; + bool lbt; + bool promiscuous_mode; + bool ackreq; +}; + +struct tun_pi { + __u16 flags; + __be16 proto; +}; + +struct tun_filter { + __u16 flags; + __u16 count; + __u8 addr[0]; +}; + +struct virtio_net_hdr { + __u8 flags; + __u8 gso_type; + __virtio16 hdr_len; + __virtio16 gso_size; + __virtio16 csum_start; + __virtio16 csum_offset; +}; + +struct tun_msg_ctl { + short unsigned int type; + short unsigned int num; + void *ptr; +}; + +struct tun_xdp_hdr { + int buflen; + struct virtio_net_hdr gso; +}; + +struct fib_info; + +struct fib_nh { + struct fib_nh_common nh_common; + struct hlist_node nh_hash; + struct fib_info *nh_parent; + __u32 nh_tclassid; + __be32 nh_saddr; + int nh_saddr_genid; +}; + +struct fib_info { + struct hlist_node fib_hash; + struct hlist_node fib_lhash; + struct list_head nh_list; + struct net *fib_net; + refcount_t fib_treeref; + refcount_t fib_clntref; + unsigned int fib_flags; + unsigned char fib_dead; + unsigned char fib_protocol; + unsigned char fib_scope; + unsigned char fib_type; + __be32 fib_prefsrc; + u32 fib_tb_id; + u32 fib_priority; + struct dst_metrics *fib_metrics; + int fib_nhs; + bool fib_nh_is_v6; + bool nh_updated; + struct nexthop *nh; + struct callback_head rcu; + struct fib_nh fib_nh[0]; +}; + +struct nh_info; + +struct nh_group; + +struct nexthop { + struct rb_node rb_node; + struct list_head fi_list; + struct list_head f6i_list; + struct list_head fdb_list; + struct list_head grp_list; + struct net *net; + u32 id; + u8 protocol; + u8 nh_flags; + bool is_group; + refcount_t refcnt; + struct callback_head rcu; + union { + struct nh_info *nh_info; + struct nh_group *nh_grp; + }; +}; + +struct nh_info { + struct hlist_node dev_hash; + struct nexthop *nh_parent; + u8 family; + bool reject_nh; + bool fdb_nh; + union { + struct fib_nh_common fib_nhc; + struct fib_nh fib_nh; + struct fib6_nh fib6_nh; + }; +}; + +struct nh_grp_entry; + +struct nh_res_bucket { + struct nh_grp_entry *nh_entry; + atomic_long_t used_time; + long unsigned int migrated_time; + bool occupied; + u8 nh_flags; +}; + +struct nh_grp_entry { + struct nexthop *nh; + u8 weight; + union { + struct { + atomic_t upper_bound; + } hthr; + struct { + struct list_head uw_nh_entry; + u16 count_buckets; + u16 wants_buckets; + } res; + }; + struct list_head nh_list; + struct nexthop *nh_parent; +}; + +struct nh_res_table { + struct net *net; + u32 nhg_id; + struct delayed_work upkeep_dw; + struct list_head uw_nh_entries; + long unsigned int unbalanced_since; + u32 idle_timer; + u32 unbalanced_timer; + u16 num_nh_buckets; + struct nh_res_bucket nh_buckets[0]; +}; + +struct nh_group { + struct nh_group *spare; + u16 num_nh; + bool is_multipath; + bool hash_threshold; + bool resilient; + bool fdb_nh; + bool has_v4; + struct nh_res_table *res_table; + struct nh_grp_entry nh_entries[0]; +}; + +enum { + AX25_VALUES_IPDEFMODE = 0, + AX25_VALUES_AXDEFMODE = 1, + AX25_VALUES_BACKOFF = 2, + AX25_VALUES_CONMODE = 3, + AX25_VALUES_WINDOW = 4, + AX25_VALUES_EWINDOW = 5, + AX25_VALUES_T1 = 6, + AX25_VALUES_T2 = 7, + AX25_VALUES_T3 = 8, + AX25_VALUES_IDLE = 9, + AX25_VALUES_N2 = 10, + AX25_VALUES_PACLEN = 11, + AX25_VALUES_PROTOCOL = 12, + AX25_VALUES_DS_TIMEOUT = 13, + AX25_MAX_VALUES = 14, +}; + +enum nl802154_cca_modes { + __NL802154_CCA_INVALID = 0, + NL802154_CCA_ENERGY = 1, + NL802154_CCA_CARRIER = 2, + NL802154_CCA_ENERGY_CARRIER = 3, + NL802154_CCA_ALOHA = 4, + NL802154_CCA_UWB_SHR = 5, + NL802154_CCA_UWB_MULTIPLEXED = 6, + __NL802154_CCA_ATTR_AFTER_LAST = 7, + NL802154_CCA_ATTR_MAX = 6, +}; + +enum nl802154_cca_opts { + NL802154_CCA_OPT_ENERGY_CARRIER_AND = 0, + NL802154_CCA_OPT_ENERGY_CARRIER_OR = 1, + __NL802154_CCA_OPT_ATTR_AFTER_LAST = 2, + NL802154_CCA_OPT_ATTR_MAX = 1, +}; + +enum nl802154_supported_bool_states { + NL802154_SUPPORTED_BOOL_FALSE = 0, + NL802154_SUPPORTED_BOOL_TRUE = 1, + __NL802154_SUPPORTED_BOOL_INVALD = 2, + NL802154_SUPPORTED_BOOL_BOTH = 3, + __NL802154_SUPPORTED_BOOL_AFTER_LAST = 4, + NL802154_SUPPORTED_BOOL_MAX = 3, +}; + +struct wpan_phy_supported { + u32 channels[32]; + u32 cca_modes; + u32 cca_opts; + u32 iftypes; + enum nl802154_supported_bool_states lbt; + u8 min_minbe; + u8 max_minbe; + u8 min_maxbe; + u8 max_maxbe; + u8 min_csma_backoffs; + u8 max_csma_backoffs; + s8 min_frame_retries; + s8 max_frame_retries; + size_t tx_powers_size; + size_t cca_ed_levels_size; + const s32 *tx_powers; + const s32 *cca_ed_levels; +}; + +struct wpan_phy_cca { + enum nl802154_cca_modes mode; + enum nl802154_cca_opts opt; +}; + +struct wpan_phy { + const void *privid; + u32 flags; + u8 current_channel; + u8 current_page; + struct wpan_phy_supported supported; + s32 transmit_power; + struct wpan_phy_cca cca; + __le64 perm_extended_addr; + s32 cca_ed_level; + u8 symbol_duration; + u16 lifs_period; + u16 sifs_period; + struct device dev; + possible_net_t _net; + long: 64; + long: 64; + char priv[0]; +}; + +struct ieee802154_addr { + u8 mode; + __le16 pan_id; + union { + __le16 short_addr; + __le64 extended_addr; + }; +}; + +struct wpan_dev_header_ops { + int (*create)(struct sk_buff *, struct net_device *, const struct ieee802154_addr *, const struct ieee802154_addr *, unsigned int); +}; + +struct tap_filter { + unsigned int count; + u32 mask[2]; + unsigned char addr[48]; +}; + +struct tun_struct; + +struct tun_file { + struct sock sk; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct socket socket; + struct tun_struct *tun; + struct fasync_struct *fasync; + unsigned int flags; + union { + u16 queue_index; + unsigned int ifindex; + }; + struct napi_struct napi; + bool napi_enabled; + bool napi_frags_enabled; + struct mutex napi_mutex; + struct list_head next; + struct tun_struct *detached; + long: 64; + long: 64; + long: 64; + struct ptr_ring tx_ring; + struct xdp_rxq_info xdp_rxq; +}; + +struct tun_prog; + +struct tun_struct { + struct tun_file *tfiles[256]; + unsigned int numqueues; + unsigned int flags; + kuid_t owner; + kgid_t group; + struct net_device *dev; + netdev_features_t set_features; + int align; + int vnet_hdr_sz; + int sndbuf; + struct tap_filter txflt; + struct sock_fprog fprog; + bool filter_attached; + u32 msg_enable; + spinlock_t lock; + struct hlist_head flows[1024]; + struct timer_list flow_gc_timer; + long unsigned int ageing_time; + unsigned int numdisabled; + struct list_head disabled; + void *security; + u32 flow_count; + u32 rx_batched; + atomic_long_t rx_frame_errors; + struct bpf_prog *xdp_prog; + struct tun_prog *steering_prog; + struct tun_prog *filter_prog; + struct ethtool_link_ksettings link_ksettings; + struct file *file; + struct ifreq *ifr; +}; + +struct tun_page { + struct page *page; + int count; +}; + +struct tun_flow_entry { + struct hlist_node hash_link; + struct callback_head rcu; + struct tun_struct *tun; + u32 rxhash; + u32 rps_rxhash; + int queue_index; + long: 32; + long: 64; + long unsigned int updated; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct tun_prog { + struct callback_head rcu; + struct bpf_prog *prog; +}; + +struct veth { + __be16 h_vlan_proto; + __be16 h_vlan_TCI; +}; + +struct bcma_device_id { + __u16 manuf; + __u16 id; + __u8 rev; + __u8 class; +}; + +struct bcma_device; + +struct bcma_chipcommon_pmu { + struct bcma_device *core; + u8 rev; + u32 crystalfreq; +}; + +struct bcma_bus; + +struct bcma_device { + struct bcma_bus *bus; + struct bcma_device_id id; + struct device dev; + struct device *dma_dev; + unsigned int irq; + bool dev_registered; + u8 core_index; + u8 core_unit; + u32 addr; + u32 addr_s[8]; + u32 wrap; + void *io_addr; + void *io_wrap; + void *drvdata; + struct list_head list; +}; + +struct bcma_sflash { + bool present; + u32 blocksize; + u16 numblocks; + u32 size; +}; + +struct bcma_drv_cc { + struct bcma_device *core; + u32 status; + u32 capabilities; + u32 capabilities_ext; + u8 setup_done: 1; + u8 early_setup_done: 1; + u16 fast_pwrup_delay; + struct bcma_chipcommon_pmu pmu; + struct bcma_sflash sflash; + u32 ticks_per_ms; + struct platform_device *watchdog; + spinlock_t gpio_lock; + struct gpio_chip gpio; +}; + +struct bcma_drv_cc_b { + struct bcma_device *core; + u8 setup_done: 1; + void *mii; +}; + +struct bcma_drv_pci { + struct bcma_device *core; + u8 early_setup_done: 1; + u8 setup_done: 1; + u8 hostmode: 1; +}; + +struct bcma_drv_pcie2 { + struct bcma_device *core; + u16 reqsize; +}; + +struct bcma_drv_mips { + struct bcma_device *core; + u8 setup_done: 1; + u8 early_setup_done: 1; +}; + +struct bcma_drv_gmac_cmn { + struct bcma_device *core; + struct mutex phy_mutex; +}; + +struct ssb_sprom_core_pwr_info { + u8 itssi_2g; + u8 itssi_5g; + u8 maxpwr_2g; + u8 maxpwr_5gl; + u8 maxpwr_5g; + u8 maxpwr_5gh; + u16 pa_2g[4]; + u16 pa_5gl[4]; + u16 pa_5g[4]; + u16 pa_5gh[4]; +}; + +struct ssb_sprom { + u8 revision; + char: 8; + u8 il0mac[6]; + u8 et0mac[6]; + u8 et1mac[6]; + u8 et2mac[6]; + u8 et0phyaddr; + u8 et1phyaddr; + u8 et2phyaddr; + u8 et0mdcport; + u8 et1mdcport; + u8 et2mdcport; + u16 dev_id; + u16 board_rev; + u16 board_num; + u16 board_type; + u8 country_code; + char alpha2[2]; + u8 leddc_on_time; + u8 leddc_off_time; + u8 ant_available_a; + u8 ant_available_bg; + u16 pa0b0; + u16 pa0b1; + u16 pa0b2; + u16 pa1b0; + u16 pa1b1; + u16 pa1b2; + u16 pa1lob0; + u16 pa1lob1; + u16 pa1lob2; + u16 pa1hib0; + u16 pa1hib1; + u16 pa1hib2; + u8 gpio0; + u8 gpio1; + u8 gpio2; + u8 gpio3; + u8 maxpwr_bg; + u8 maxpwr_al; + u8 maxpwr_a; + u8 maxpwr_ah; + u8 itssi_a; + u8 itssi_bg; + u8 tri2g; + u8 tri5gl; + u8 tri5g; + u8 tri5gh; + u8 txpid2g[4]; + u8 txpid5gl[4]; + u8 txpid5g[4]; + u8 txpid5gh[4]; + s8 rxpo2g; + s8 rxpo5g; + u8 rssisav2g; + u8 rssismc2g; + u8 rssismf2g; + u8 bxa2g; + u8 rssisav5g; + u8 rssismc5g; + u8 rssismf5g; + u8 bxa5g; + u16 cck2gpo; + u32 ofdm2gpo; + u32 ofdm5glpo; + u32 ofdm5gpo; + u32 ofdm5ghpo; + u32 boardflags; + u32 boardflags2; + u32 boardflags3; + u16 boardflags_lo; + u16 boardflags_hi; + u16 boardflags2_lo; + u16 boardflags2_hi; + struct ssb_sprom_core_pwr_info core_pwr_info[4]; + struct { + s8 a0; + s8 a1; + s8 a2; + s8 a3; + } antenna_gain; + struct { + struct { + u8 tssipos; + u8 extpa_gain; + u8 pdet_range; + u8 tr_iso; + u8 antswlut; + } ghz2; + struct { + u8 tssipos; + u8 extpa_gain; + u8 pdet_range; + u8 tr_iso; + u8 antswlut; + } ghz5; + } fem; + u16 mcs2gpo[8]; + u16 mcs5gpo[8]; + u16 mcs5glpo[8]; + u16 mcs5ghpo[8]; + u8 opo; + u8 rxgainerr2ga[3]; + u8 rxgainerr5gla[3]; + u8 rxgainerr5gma[3]; + u8 rxgainerr5gha[3]; + u8 rxgainerr5gua[3]; + u8 noiselvl2ga[3]; + u8 noiselvl5gla[3]; + u8 noiselvl5gma[3]; + u8 noiselvl5gha[3]; + u8 noiselvl5gua[3]; + u8 regrev; + u8 txchain; + u8 rxchain; + u8 antswitch; + u16 cddpo; + u16 stbcpo; + u16 bw40po; + u16 bwduppo; + u8 tempthresh; + u8 tempoffset; + u16 rawtempsense; + u8 measpower; + u8 tempsense_slope; + u8 tempcorrx; + u8 tempsense_option; + u8 freqoffset_corr; + u8 iqcal_swp_dis; + u8 hw_iqcal_en; + u8 elna2g; + u8 elna5g; + u8 phycal_tempdelta; + u8 temps_period; + u8 temps_hysteresis; + u8 measpower1; + u8 measpower2; + u8 pcieingress_war; + u16 cckbw202gpo; + u16 cckbw20ul2gpo; + u32 legofdmbw202gpo; + u32 legofdmbw20ul2gpo; + u32 legofdmbw205glpo; + u32 legofdmbw20ul5glpo; + u32 legofdmbw205gmpo; + u32 legofdmbw20ul5gmpo; + u32 legofdmbw205ghpo; + u32 legofdmbw20ul5ghpo; + u32 mcsbw202gpo; + u32 mcsbw20ul2gpo; + u32 mcsbw402gpo; + u32 mcsbw205glpo; + u32 mcsbw20ul5glpo; + u32 mcsbw405glpo; + u32 mcsbw205gmpo; + u32 mcsbw20ul5gmpo; + u32 mcsbw405gmpo; + u32 mcsbw205ghpo; + u32 mcsbw20ul5ghpo; + u32 mcsbw405ghpo; + u16 mcs32po; + u16 legofdm40duppo; + u8 sar2g; + u8 sar5g; +}; + +enum bcma_hosttype { + BCMA_HOSTTYPE_PCI = 0, + BCMA_HOSTTYPE_SDIO = 1, + BCMA_HOSTTYPE_SOC = 2, +}; + +struct bcma_chipinfo { + u16 id; + u8 rev; + u8 pkg; +}; + +struct bcma_boardinfo { + u16 vendor; + u16 type; +}; + +struct bcma_host_ops { + u8 (*read8)(struct bcma_device *, u16); + u16 (*read16)(struct bcma_device *, u16); + u32 (*read32)(struct bcma_device *, u16); + void (*write8)(struct bcma_device *, u16, u8); + void (*write16)(struct bcma_device *, u16, u16); + void (*write32)(struct bcma_device *, u16, u32); + void (*block_read)(struct bcma_device *, void *, size_t, u16, u8); + void (*block_write)(struct bcma_device *, const void *, size_t, u16, u8); + u32 (*aread32)(struct bcma_device *, u16); + void (*awrite32)(struct bcma_device *, u16, u32); +}; + +struct bcma_bus { + struct device *dev; + void *mmio; + const struct bcma_host_ops *ops; + enum bcma_hosttype hosttype; + bool host_is_pcie2; + struct pci_dev *host_pci; + struct bcma_chipinfo chipinfo; + struct bcma_boardinfo boardinfo; + struct bcma_device *mapped_core; + struct list_head cores; + u8 nr_cores; + u8 num; + struct bcma_drv_cc drv_cc; + struct bcma_drv_cc_b drv_cc_b; + struct bcma_drv_pci drv_pci[2]; + struct bcma_drv_pcie2 drv_pcie2; + struct bcma_drv_mips drv_mips; + struct bcma_drv_gmac_cmn drv_gmac_cmn; + struct ssb_sprom sprom; +}; + +enum devlink_port_type { + DEVLINK_PORT_TYPE_NOTSET = 0, + DEVLINK_PORT_TYPE_AUTO = 1, + DEVLINK_PORT_TYPE_ETH = 2, + DEVLINK_PORT_TYPE_IB = 3, +}; + +enum devlink_port_flavour { + DEVLINK_PORT_FLAVOUR_PHYSICAL = 0, + DEVLINK_PORT_FLAVOUR_CPU = 1, + DEVLINK_PORT_FLAVOUR_DSA = 2, + DEVLINK_PORT_FLAVOUR_PCI_PF = 3, + DEVLINK_PORT_FLAVOUR_PCI_VF = 4, + DEVLINK_PORT_FLAVOUR_VIRTUAL = 5, + DEVLINK_PORT_FLAVOUR_UNUSED = 6, + DEVLINK_PORT_FLAVOUR_PCI_SF = 7, +}; + +struct devlink_port_phys_attrs { + u32 port_number; + u32 split_subport_number; +}; + +struct devlink_port_pci_pf_attrs { + u32 controller; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_pci_vf_attrs { + u32 controller; + u16 pf; + u16 vf; + u8 external: 1; +}; + +struct devlink_port_pci_sf_attrs { + u32 controller; + u32 sf; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_attrs { + u8 split: 1; + u8 splittable: 1; + u32 lanes; + enum devlink_port_flavour flavour; + struct netdev_phys_item_id switch_id; + union { + struct devlink_port_phys_attrs phys; + struct devlink_port_pci_pf_attrs pci_pf; + struct devlink_port_pci_vf_attrs pci_vf; + struct devlink_port_pci_sf_attrs pci_sf; + }; +}; + +struct devlink; + +struct devlink_rate; + +struct devlink_port { + struct list_head list; + struct list_head param_list; + struct list_head region_list; + struct devlink *devlink; + unsigned int index; + spinlock_t type_lock; + enum devlink_port_type type; + enum devlink_port_type desired_type; + void *type_dev; + struct devlink_port_attrs attrs; + u8 attrs_set: 1; + u8 switch_port: 1; + struct delayed_work type_warn_dw; + struct list_head reporter_list; + struct mutex reporters_lock; + struct devlink_rate *devlink_rate; +}; + +enum phylink_op_type { + PHYLINK_NETDEV = 0, + PHYLINK_DEV = 1, +}; + +struct phylink_link_state; + +struct phylink_config { + struct device *dev; + enum phylink_op_type type; + bool pcs_poll; + bool poll_fixed_state; + bool ovr_an_inband; + void (*get_fixed_state)(struct phylink_config *, struct phylink_link_state *); + long unsigned int supported_interfaces[1]; +}; + +struct dsa_device_ops; + +struct dsa_switch_tree; + +struct dsa_switch; + +struct dsa_netdevice_ops; + +struct dsa_port { + union { + struct net_device *master; + struct net_device *slave; + }; + const struct dsa_device_ops *tag_ops; + struct dsa_switch_tree *dst; + struct sk_buff * (*rcv)(struct sk_buff *, struct net_device *); + enum { + DSA_PORT_TYPE_UNUSED = 0, + DSA_PORT_TYPE_CPU = 1, + DSA_PORT_TYPE_DSA = 2, + DSA_PORT_TYPE_USER = 3, + } type; + struct dsa_switch *ds; + unsigned int index; + const char *name; + struct dsa_port *cpu_dp; + u8 mac[6]; + struct device_node *dn; + unsigned int ageing_time; + bool vlan_filtering; + bool learning; + u8 stp_state; + struct net_device *bridge_dev; + int bridge_num; + struct devlink_port devlink_port; + bool devlink_port_setup; + struct phylink *pl; + struct phylink_config pl_config; + struct net_device *lag_dev; + bool lag_tx_enabled; + struct net_device *hsr_dev; + struct list_head list; + void *priv; + const struct ethtool_ops *orig_ethtool_ops; + const struct dsa_netdevice_ops *netdev_ops; + struct mutex addr_lists_lock; + struct list_head fdbs; + struct list_head mdbs; + bool setup; +}; + +enum netdev_lag_tx_type { + NETDEV_LAG_TX_TYPE_UNKNOWN = 0, + NETDEV_LAG_TX_TYPE_RANDOM = 1, + NETDEV_LAG_TX_TYPE_BROADCAST = 2, + NETDEV_LAG_TX_TYPE_ROUNDROBIN = 3, + NETDEV_LAG_TX_TYPE_ACTIVEBACKUP = 4, + NETDEV_LAG_TX_TYPE_HASH = 5, +}; + +enum netdev_lag_hash { + NETDEV_LAG_HASH_NONE = 0, + NETDEV_LAG_HASH_L2 = 1, + NETDEV_LAG_HASH_L34 = 2, + NETDEV_LAG_HASH_L23 = 3, + NETDEV_LAG_HASH_E23 = 4, + NETDEV_LAG_HASH_E34 = 5, + NETDEV_LAG_HASH_VLAN_SRCMAC = 6, + NETDEV_LAG_HASH_UNKNOWN = 7, +}; + +struct netdev_lag_upper_info { + enum netdev_lag_tx_type tx_type; + enum netdev_lag_hash hash_type; +}; + +struct netdev_notifier_changeupper_info { + struct netdev_notifier_info info; + struct net_device *upper_dev; + bool master; + bool linking; + void *upper_info; +}; + +enum ethtool_stringset { + ETH_SS_TEST = 0, + ETH_SS_STATS = 1, + ETH_SS_PRIV_FLAGS = 2, + ETH_SS_NTUPLE_FILTERS = 3, + ETH_SS_FEATURES = 4, + ETH_SS_RSS_HASH_FUNCS = 5, + ETH_SS_TUNABLES = 6, + ETH_SS_PHY_STATS = 7, + ETH_SS_PHY_TUNABLES = 8, + ETH_SS_LINK_MODES = 9, + ETH_SS_MSG_CLASSES = 10, + ETH_SS_WOL_MODES = 11, + ETH_SS_SOF_TIMESTAMPING = 12, + ETH_SS_TS_TX_TYPES = 13, + ETH_SS_TS_RX_FILTERS = 14, + ETH_SS_UDP_TUNNEL_TYPES = 15, + ETH_SS_STATS_STD = 16, + ETH_SS_STATS_ETH_PHY = 17, + ETH_SS_STATS_ETH_MAC = 18, + ETH_SS_STATS_ETH_CTRL = 19, + ETH_SS_STATS_RMON = 20, + ETH_SS_COUNT = 21, +}; + +struct flow_match { + struct flow_dissector *dissector; + void *mask; + void *key; +}; + +enum flow_action_id { + FLOW_ACTION_ACCEPT = 0, + FLOW_ACTION_DROP = 1, + FLOW_ACTION_TRAP = 2, + FLOW_ACTION_GOTO = 3, + FLOW_ACTION_REDIRECT = 4, + FLOW_ACTION_MIRRED = 5, + FLOW_ACTION_REDIRECT_INGRESS = 6, + FLOW_ACTION_MIRRED_INGRESS = 7, + FLOW_ACTION_VLAN_PUSH = 8, + FLOW_ACTION_VLAN_POP = 9, + FLOW_ACTION_VLAN_MANGLE = 10, + FLOW_ACTION_TUNNEL_ENCAP = 11, + FLOW_ACTION_TUNNEL_DECAP = 12, + FLOW_ACTION_MANGLE = 13, + FLOW_ACTION_ADD = 14, + FLOW_ACTION_CSUM = 15, + FLOW_ACTION_MARK = 16, + FLOW_ACTION_PTYPE = 17, + FLOW_ACTION_PRIORITY = 18, + FLOW_ACTION_WAKE = 19, + FLOW_ACTION_QUEUE = 20, + FLOW_ACTION_SAMPLE = 21, + FLOW_ACTION_POLICE = 22, + FLOW_ACTION_CT = 23, + FLOW_ACTION_CT_METADATA = 24, + FLOW_ACTION_MPLS_PUSH = 25, + FLOW_ACTION_MPLS_POP = 26, + FLOW_ACTION_MPLS_MANGLE = 27, + FLOW_ACTION_GATE = 28, + FLOW_ACTION_PPPOE_PUSH = 29, + NUM_FLOW_ACTIONS = 30, +}; + +enum flow_action_hw_stats { + FLOW_ACTION_HW_STATS_IMMEDIATE = 1, + FLOW_ACTION_HW_STATS_DELAYED = 2, + FLOW_ACTION_HW_STATS_ANY = 3, + FLOW_ACTION_HW_STATS_DISABLED = 4, + FLOW_ACTION_HW_STATS_DONT_CARE = 7, +}; + +typedef void (*action_destr)(void *); + +enum flow_action_mangle_base { + FLOW_ACT_MANGLE_UNSPEC = 0, + FLOW_ACT_MANGLE_HDR_TYPE_ETH = 1, + FLOW_ACT_MANGLE_HDR_TYPE_IP4 = 2, + FLOW_ACT_MANGLE_HDR_TYPE_IP6 = 3, + FLOW_ACT_MANGLE_HDR_TYPE_TCP = 4, + FLOW_ACT_MANGLE_HDR_TYPE_UDP = 5, +}; + +struct nf_flowtable; + +struct ip_tunnel_info; + +struct psample_group; + +struct action_gate_entry; + +struct flow_action_cookie; + +struct flow_action_entry { + enum flow_action_id id; + enum flow_action_hw_stats hw_stats; + action_destr destructor; + void *destructor_priv; + union { + u32 chain_index; + struct net_device *dev; + struct { + u16 vid; + __be16 proto; + u8 prio; + } vlan; + struct { + enum flow_action_mangle_base htype; + u32 offset; + u32 mask; + u32 val; + } mangle; + struct ip_tunnel_info *tunnel; + u32 csum_flags; + u32 mark; + u16 ptype; + u32 priority; + struct { + u32 ctx; + u32 index; + u8 vf; + } queue; + struct { + struct psample_group *psample_group; + u32 rate; + u32 trunc_size; + bool truncate; + } sample; + struct { + u32 index; + u32 burst; + u64 rate_bytes_ps; + u64 burst_pkt; + u64 rate_pkt_ps; + u32 mtu; + } police; + struct { + int action; + u16 zone; + struct nf_flowtable *flow_table; + } ct; + struct { + long unsigned int cookie; + u32 mark; + u32 labels[4]; + bool orig_dir; + } ct_metadata; + struct { + u32 label; + __be16 proto; + u8 tc; + u8 bos; + u8 ttl; + } mpls_push; + struct { + __be16 proto; + } mpls_pop; + struct { + u32 label; + u8 tc; + u8 bos; + u8 ttl; + } mpls_mangle; + struct { + u32 index; + s32 prio; + u64 basetime; + u64 cycletime; + u64 cycletimeext; + u32 num_entries; + struct action_gate_entry *entries; + } gate; + struct { + u16 sid; + } pppoe; + }; + struct flow_action_cookie *cookie; +}; + +struct flow_action { + unsigned int num_entries; + struct flow_action_entry entries[0]; +}; + +struct flow_rule { + struct flow_match match; + struct flow_action action; +}; + +struct dsa_chip_data { + struct device *host_dev; + int sw_addr; + struct device *netdev[12]; + int eeprom_len; + struct device_node *of_node; + char *port_names[12]; + struct device_node *port_dn[12]; + s8 rtable[4]; +}; + +struct dsa_platform_data { + struct device *netdev; + struct net_device *of_netdev; + int nr_chips; + struct dsa_chip_data *chip; +}; + +struct phylink_link_state { + long unsigned int advertising[2]; + long unsigned int lp_advertising[2]; + phy_interface_t interface; + int speed; + int duplex; + int pause; + unsigned int link: 1; + unsigned int an_enabled: 1; + unsigned int an_complete: 1; +}; + +struct flow_action_cookie { + u32 cookie_len; + u8 cookie[0]; +}; + +struct flow_stats { + u64 pkts; + u64 bytes; + u64 drops; + u64 lastused; + enum flow_action_hw_stats used_hw_stats; + bool used_hw_stats_valid; +}; + +enum flow_cls_command { + FLOW_CLS_REPLACE = 0, + FLOW_CLS_DESTROY = 1, + FLOW_CLS_STATS = 2, + FLOW_CLS_TMPLT_CREATE = 3, + FLOW_CLS_TMPLT_DESTROY = 4, +}; + +struct flow_cls_common_offload { + u32 chain_index; + __be16 protocol; + u32 prio; + struct netlink_ext_ack *extack; +}; + +struct flow_cls_offload { + struct flow_cls_common_offload common; + enum flow_cls_command command; + long unsigned int cookie; + struct flow_rule *rule; + struct flow_stats stats; + u32 classid; +}; + +enum devlink_sb_pool_type { + DEVLINK_SB_POOL_TYPE_INGRESS = 0, + DEVLINK_SB_POOL_TYPE_EGRESS = 1, +}; + +enum devlink_sb_threshold_type { + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0, + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 1, +}; + +enum devlink_rate_type { + DEVLINK_RATE_TYPE_LEAF = 0, + DEVLINK_RATE_TYPE_NODE = 1, +}; + +enum devlink_param_cmode { + DEVLINK_PARAM_CMODE_RUNTIME = 0, + DEVLINK_PARAM_CMODE_DRIVERINIT = 1, + DEVLINK_PARAM_CMODE_PERMANENT = 2, + __DEVLINK_PARAM_CMODE_MAX = 3, + DEVLINK_PARAM_CMODE_MAX = 2, +}; + +struct devlink_rate { + struct list_head list; + enum devlink_rate_type type; + struct devlink *devlink; + void *priv; + u64 tx_share; + u64 tx_max; + struct devlink_rate *parent; + union { + struct devlink_port *devlink_port; + struct { + char *name; + refcount_t refcnt; + }; + }; +}; + +struct devlink_sb_pool_info { + enum devlink_sb_pool_type pool_type; + u32 size; + enum devlink_sb_threshold_type threshold_type; + u32 cell_size; +}; + +union devlink_param_value { + u8 vu8; + u16 vu16; + u32 vu32; + char vstr[32]; + bool vbool; +}; + +struct devlink_param_gset_ctx { + union devlink_param_value val; + enum devlink_param_cmode cmode; +}; + +struct devlink_info_req; + +struct switchdev_brport_flags { + long unsigned int val; + long unsigned int mask; +}; + +enum switchdev_obj_id { + SWITCHDEV_OBJ_ID_UNDEFINED = 0, + SWITCHDEV_OBJ_ID_PORT_VLAN = 1, + SWITCHDEV_OBJ_ID_PORT_MDB = 2, + SWITCHDEV_OBJ_ID_HOST_MDB = 3, + SWITCHDEV_OBJ_ID_MRP = 4, + SWITCHDEV_OBJ_ID_RING_TEST_MRP = 5, + SWITCHDEV_OBJ_ID_RING_ROLE_MRP = 6, + SWITCHDEV_OBJ_ID_RING_STATE_MRP = 7, + SWITCHDEV_OBJ_ID_IN_TEST_MRP = 8, + SWITCHDEV_OBJ_ID_IN_ROLE_MRP = 9, + SWITCHDEV_OBJ_ID_IN_STATE_MRP = 10, +}; + +struct switchdev_obj { + struct list_head list; + struct net_device *orig_dev; + enum switchdev_obj_id id; + u32 flags; + void *complete_priv; + void (*complete)(struct net_device *, int, void *); +}; + +struct switchdev_obj_port_vlan { + struct switchdev_obj obj; + u16 flags; + u16 vid; +}; + +struct switchdev_obj_port_mdb { + struct switchdev_obj obj; + unsigned char addr[6]; + u16 vid; +}; + +struct switchdev_obj_mrp { + struct switchdev_obj obj; + struct net_device *p_port; + struct net_device *s_port; + u32 ring_id; + u16 prio; +}; + +struct switchdev_obj_ring_role_mrp { + struct switchdev_obj obj; + u8 ring_role; + u32 ring_id; + u8 sw_backup; +}; + +enum dsa_tag_protocol { + DSA_TAG_PROTO_NONE = 0, + DSA_TAG_PROTO_BRCM = 1, + DSA_TAG_PROTO_BRCM_LEGACY = 22, + DSA_TAG_PROTO_BRCM_PREPEND = 2, + DSA_TAG_PROTO_DSA = 3, + DSA_TAG_PROTO_EDSA = 4, + DSA_TAG_PROTO_GSWIP = 5, + DSA_TAG_PROTO_KSZ9477 = 6, + DSA_TAG_PROTO_KSZ9893 = 7, + DSA_TAG_PROTO_LAN9303 = 8, + DSA_TAG_PROTO_MTK = 9, + DSA_TAG_PROTO_QCA = 10, + DSA_TAG_PROTO_TRAILER = 11, + DSA_TAG_PROTO_8021Q = 12, + DSA_TAG_PROTO_SJA1105 = 13, + DSA_TAG_PROTO_KSZ8795 = 14, + DSA_TAG_PROTO_OCELOT = 15, + DSA_TAG_PROTO_AR9331 = 16, + DSA_TAG_PROTO_RTL4_A = 17, + DSA_TAG_PROTO_HELLCREEK = 18, + DSA_TAG_PROTO_XRS700X = 19, + DSA_TAG_PROTO_OCELOT_8021Q = 20, + DSA_TAG_PROTO_SEVILLE = 21, + DSA_TAG_PROTO_SJA1110 = 23, + DSA_TAG_PROTO_RTL8_4 = 24, +}; + +struct dsa_device_ops { + struct sk_buff * (*xmit)(struct sk_buff *, struct net_device *); + struct sk_buff * (*rcv)(struct sk_buff *, struct net_device *); + void (*flow_dissect)(const struct sk_buff *, __be16 *, int *); + unsigned int needed_headroom; + unsigned int needed_tailroom; + const char *name; + enum dsa_tag_protocol proto; + bool promisc_on_master; +}; + +struct dsa_netdevice_ops { + int (*ndo_eth_ioctl)(struct net_device *, struct ifreq *, int); +}; + +struct dsa_switch_tree { + struct list_head list; + struct raw_notifier_head nh; + unsigned int index; + struct kref refcount; + bool setup; + const struct dsa_device_ops *tag_ops; + enum dsa_tag_protocol default_proto; + struct dsa_platform_data *pd; + struct list_head ports; + struct list_head rtable; + struct net_device **lags; + unsigned int lags_len; + unsigned int last_switch; +}; + +struct dsa_mall_mirror_tc_entry { + u8 to_local_port; + bool ingress; +}; + +struct dsa_mall_policer_tc_entry { + u32 burst; + u64 rate_bytes_per_sec; +}; + +struct dsa_8021q_context; + +struct dsa_switch_ops; + +struct dsa_switch { + bool setup; + struct device *dev; + struct dsa_switch_tree *dst; + unsigned int index; + struct notifier_block nb; + void *priv; + struct dsa_chip_data *cd; + const struct dsa_switch_ops *ops; + u32 phys_mii_mask; + struct mii_bus *slave_mii_bus; + unsigned int ageing_time_min; + unsigned int ageing_time_max; + struct dsa_8021q_context *tag_8021q_ctx; + struct devlink *devlink; + unsigned int num_tx_queues; + bool vlan_filtering_is_global; + bool needs_standalone_vlan_filtering; + bool configure_vlan_while_not_filtering; + bool untag_bridge_pvid; + bool assisted_learning_on_cpu_port; + bool vlan_filtering; + bool pcs_poll; + bool mtu_enforcement_ingress; + unsigned int num_lag_ids; + unsigned int num_fwd_offloading_bridges; + size_t num_ports; +}; + +typedef int dsa_fdb_dump_cb_t(const unsigned char *, u16, bool, void *); + +struct dsa_switch_ops { + enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *, int, enum dsa_tag_protocol); + int (*change_tag_protocol)(struct dsa_switch *, int, enum dsa_tag_protocol); + int (*setup)(struct dsa_switch *); + void (*teardown)(struct dsa_switch *); + int (*port_setup)(struct dsa_switch *, int); + void (*port_teardown)(struct dsa_switch *, int); + u32 (*get_phy_flags)(struct dsa_switch *, int); + int (*phy_read)(struct dsa_switch *, int, int); + int (*phy_write)(struct dsa_switch *, int, int, u16); + void (*adjust_link)(struct dsa_switch *, int, struct phy_device *); + void (*fixed_link_update)(struct dsa_switch *, int, struct fixed_phy_status *); + void (*phylink_get_interfaces)(struct dsa_switch *, int, long unsigned int *); + void (*phylink_validate)(struct dsa_switch *, int, long unsigned int *, struct phylink_link_state *); + int (*phylink_mac_link_state)(struct dsa_switch *, int, struct phylink_link_state *); + void (*phylink_mac_config)(struct dsa_switch *, int, unsigned int, const struct phylink_link_state *); + void (*phylink_mac_an_restart)(struct dsa_switch *, int); + void (*phylink_mac_link_down)(struct dsa_switch *, int, unsigned int, phy_interface_t); + void (*phylink_mac_link_up)(struct dsa_switch *, int, unsigned int, phy_interface_t, struct phy_device *, int, int, bool, bool); + void (*phylink_fixed_state)(struct dsa_switch *, int, struct phylink_link_state *); + void (*get_strings)(struct dsa_switch *, int, u32, uint8_t *); + void (*get_ethtool_stats)(struct dsa_switch *, int, uint64_t *); + int (*get_sset_count)(struct dsa_switch *, int, int); + void (*get_ethtool_phy_stats)(struct dsa_switch *, int, uint64_t *); + void (*get_eth_phy_stats)(struct dsa_switch *, int, struct ethtool_eth_phy_stats *); + void (*get_eth_mac_stats)(struct dsa_switch *, int, struct ethtool_eth_mac_stats *); + void (*get_eth_ctrl_stats)(struct dsa_switch *, int, struct ethtool_eth_ctrl_stats *); + void (*get_stats64)(struct dsa_switch *, int, struct rtnl_link_stats64 *); + void (*self_test)(struct dsa_switch *, int, struct ethtool_test *, u64 *); + void (*get_wol)(struct dsa_switch *, int, struct ethtool_wolinfo *); + int (*set_wol)(struct dsa_switch *, int, struct ethtool_wolinfo *); + int (*get_ts_info)(struct dsa_switch *, int, struct ethtool_ts_info *); + int (*suspend)(struct dsa_switch *); + int (*resume)(struct dsa_switch *); + int (*port_enable)(struct dsa_switch *, int, struct phy_device *); + void (*port_disable)(struct dsa_switch *, int); + int (*set_mac_eee)(struct dsa_switch *, int, struct ethtool_eee *); + int (*get_mac_eee)(struct dsa_switch *, int, struct ethtool_eee *); + int (*get_eeprom_len)(struct dsa_switch *); + int (*get_eeprom)(struct dsa_switch *, struct ethtool_eeprom *, u8 *); + int (*set_eeprom)(struct dsa_switch *, struct ethtool_eeprom *, u8 *); + int (*get_regs_len)(struct dsa_switch *, int); + void (*get_regs)(struct dsa_switch *, int, struct ethtool_regs *, void *); + int (*port_prechangeupper)(struct dsa_switch *, int, struct netdev_notifier_changeupper_info *); + int (*set_ageing_time)(struct dsa_switch *, unsigned int); + int (*port_bridge_join)(struct dsa_switch *, int, struct net_device *); + void (*port_bridge_leave)(struct dsa_switch *, int, struct net_device *); + int (*port_bridge_tx_fwd_offload)(struct dsa_switch *, int, struct net_device *, int); + void (*port_bridge_tx_fwd_unoffload)(struct dsa_switch *, int, struct net_device *, int); + void (*port_stp_state_set)(struct dsa_switch *, int, u8); + void (*port_fast_age)(struct dsa_switch *, int); + int (*port_pre_bridge_flags)(struct dsa_switch *, int, struct switchdev_brport_flags, struct netlink_ext_ack *); + int (*port_bridge_flags)(struct dsa_switch *, int, struct switchdev_brport_flags, struct netlink_ext_ack *); + int (*port_vlan_filtering)(struct dsa_switch *, int, bool, struct netlink_ext_ack *); + int (*port_vlan_add)(struct dsa_switch *, int, const struct switchdev_obj_port_vlan *, struct netlink_ext_ack *); + int (*port_vlan_del)(struct dsa_switch *, int, const struct switchdev_obj_port_vlan *); + int (*port_fdb_add)(struct dsa_switch *, int, const unsigned char *, u16); + int (*port_fdb_del)(struct dsa_switch *, int, const unsigned char *, u16); + int (*port_fdb_dump)(struct dsa_switch *, int, dsa_fdb_dump_cb_t *, void *); + int (*port_mdb_add)(struct dsa_switch *, int, const struct switchdev_obj_port_mdb *); + int (*port_mdb_del)(struct dsa_switch *, int, const struct switchdev_obj_port_mdb *); + int (*get_rxnfc)(struct dsa_switch *, int, struct ethtool_rxnfc *, u32 *); + int (*set_rxnfc)(struct dsa_switch *, int, struct ethtool_rxnfc *); + int (*cls_flower_add)(struct dsa_switch *, int, struct flow_cls_offload *, bool); + int (*cls_flower_del)(struct dsa_switch *, int, struct flow_cls_offload *, bool); + int (*cls_flower_stats)(struct dsa_switch *, int, struct flow_cls_offload *, bool); + int (*port_mirror_add)(struct dsa_switch *, int, struct dsa_mall_mirror_tc_entry *, bool); + void (*port_mirror_del)(struct dsa_switch *, int, struct dsa_mall_mirror_tc_entry *); + int (*port_policer_add)(struct dsa_switch *, int, struct dsa_mall_policer_tc_entry *); + void (*port_policer_del)(struct dsa_switch *, int); + int (*port_setup_tc)(struct dsa_switch *, int, enum tc_setup_type, void *); + int (*crosschip_bridge_join)(struct dsa_switch *, int, int, int, struct net_device *); + void (*crosschip_bridge_leave)(struct dsa_switch *, int, int, int, struct net_device *); + int (*crosschip_lag_change)(struct dsa_switch *, int, int); + int (*crosschip_lag_join)(struct dsa_switch *, int, int, struct net_device *, struct netdev_lag_upper_info *); + int (*crosschip_lag_leave)(struct dsa_switch *, int, int, struct net_device *); + int (*port_hwtstamp_get)(struct dsa_switch *, int, struct ifreq *); + int (*port_hwtstamp_set)(struct dsa_switch *, int, struct ifreq *); + void (*port_txtstamp)(struct dsa_switch *, int, struct sk_buff *); + bool (*port_rxtstamp)(struct dsa_switch *, int, struct sk_buff *, unsigned int); + int (*devlink_param_get)(struct dsa_switch *, u32, struct devlink_param_gset_ctx *); + int (*devlink_param_set)(struct dsa_switch *, u32, struct devlink_param_gset_ctx *); + int (*devlink_info_get)(struct dsa_switch *, struct devlink_info_req *, struct netlink_ext_ack *); + int (*devlink_sb_pool_get)(struct dsa_switch *, unsigned int, u16, struct devlink_sb_pool_info *); + int (*devlink_sb_pool_set)(struct dsa_switch *, unsigned int, u16, u32, enum devlink_sb_threshold_type, struct netlink_ext_ack *); + int (*devlink_sb_port_pool_get)(struct dsa_switch *, int, unsigned int, u16, u32 *); + int (*devlink_sb_port_pool_set)(struct dsa_switch *, int, unsigned int, u16, u32, struct netlink_ext_ack *); + int (*devlink_sb_tc_pool_bind_get)(struct dsa_switch *, int, unsigned int, u16, enum devlink_sb_pool_type, u16 *, u32 *); + int (*devlink_sb_tc_pool_bind_set)(struct dsa_switch *, int, unsigned int, u16, enum devlink_sb_pool_type, u16, u32, struct netlink_ext_ack *); + int (*devlink_sb_occ_snapshot)(struct dsa_switch *, unsigned int); + int (*devlink_sb_occ_max_clear)(struct dsa_switch *, unsigned int); + int (*devlink_sb_occ_port_pool_get)(struct dsa_switch *, int, unsigned int, u16, u32 *, u32 *); + int (*devlink_sb_occ_tc_port_bind_get)(struct dsa_switch *, int, unsigned int, u16, enum devlink_sb_pool_type, u32 *, u32 *); + int (*port_change_mtu)(struct dsa_switch *, int, int); + int (*port_max_mtu)(struct dsa_switch *, int); + int (*port_lag_change)(struct dsa_switch *, int); + int (*port_lag_join)(struct dsa_switch *, int, struct net_device *, struct netdev_lag_upper_info *); + int (*port_lag_leave)(struct dsa_switch *, int, struct net_device *); + int (*port_hsr_join)(struct dsa_switch *, int, struct net_device *); + int (*port_hsr_leave)(struct dsa_switch *, int, struct net_device *); + int (*port_mrp_add)(struct dsa_switch *, int, const struct switchdev_obj_mrp *); + int (*port_mrp_del)(struct dsa_switch *, int, const struct switchdev_obj_mrp *); + int (*port_mrp_add_ring_role)(struct dsa_switch *, int, const struct switchdev_obj_ring_role_mrp *); + int (*port_mrp_del_ring_role)(struct dsa_switch *, int, const struct switchdev_obj_ring_role_mrp *); + int (*tag_8021q_vlan_add)(struct dsa_switch *, int, u16, u16); + int (*tag_8021q_vlan_del)(struct dsa_switch *, int, u16); +}; + +struct bgmac_slot_info { + union { + struct sk_buff *skb; + void *buf; + }; + dma_addr_t dma_addr; +}; + +struct bgmac_dma_desc { + __le32 ctl0; + __le32 ctl1; + __le32 addr_low; + __le32 addr_high; +}; + +enum bgmac_dma_ring_type { + BGMAC_DMA_RING_TX = 0, + BGMAC_DMA_RING_RX = 1, +}; + +struct bgmac_dma_ring { + u32 start; + u32 end; + struct bgmac_dma_desc *cpu_base; + dma_addr_t dma_base; + u32 index_base; + u16 mmio_base; + bool unaligned; + struct bgmac_slot_info slots[512]; +}; + +struct bgmac_rx_header { + __le16 len; + __le16 flags; + __le16 pad[12]; +}; + +struct bgmac { + union { + struct { + void *base; + void *idm_base; + void *nicpm_base; + } plat; + struct { + struct bcma_device *core; + struct bcma_device *cmn; + } bcma; + }; + struct device *dev; + struct device *dma_dev; + u32 feature_flags; + struct net_device *net_dev; + struct napi_struct napi; + struct mii_bus *mii_bus; + struct bgmac_dma_ring tx_ring[4]; + struct bgmac_dma_ring rx_ring[1]; + bool stats_grabbed; + u32 mib_tx_regs[43]; + u32 mib_rx_regs[31]; + int irq; + u32 int_mask; + int mac_speed; + int mac_duplex; + u8 phyaddr; + bool has_robosw; + bool loopback; + u32 (*read)(struct bgmac *, u16); + void (*write)(struct bgmac *, u16, u32); + u32 (*idm_read)(struct bgmac *, u16); + void (*idm_write)(struct bgmac *, u16, u32); + bool (*clk_enabled)(struct bgmac *); + void (*clk_enable)(struct bgmac *, u32); + void (*cco_ctl_maskset)(struct bgmac *, u32, u32, u32); + u32 (*get_bus_clock)(struct bgmac *); + void (*cmn_maskset32)(struct bgmac *, u16, u32, u32); + int (*phy_connect)(struct bgmac *); +}; + +struct bgmac_stat { + u8 size; + u32 offset; + const char *name; +}; + +struct netdev_hw_addr { + struct list_head list; + struct rb_node node; + unsigned char addr[32]; + unsigned char type; + bool global_use; + int sync_cnt; + int refcount; + int synced; + struct callback_head callback_head; +}; + +enum skb_free_reason { + SKB_REASON_CONSUMED = 0, + SKB_REASON_DROPPED = 1, +}; + +struct vlan_hdr { + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +struct vlan_ethhdr { + unsigned char h_dest[6]; + unsigned char h_source[6]; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +enum { + SOF_TIMESTAMPING_TX_HARDWARE = 1, + SOF_TIMESTAMPING_TX_SOFTWARE = 2, + SOF_TIMESTAMPING_RX_HARDWARE = 4, + SOF_TIMESTAMPING_RX_SOFTWARE = 8, + SOF_TIMESTAMPING_SOFTWARE = 16, + SOF_TIMESTAMPING_SYS_HARDWARE = 32, + SOF_TIMESTAMPING_RAW_HARDWARE = 64, + SOF_TIMESTAMPING_OPT_ID = 128, + SOF_TIMESTAMPING_TX_SCHED = 256, + SOF_TIMESTAMPING_TX_ACK = 512, + SOF_TIMESTAMPING_OPT_CMSG = 1024, + SOF_TIMESTAMPING_OPT_TSONLY = 2048, + SOF_TIMESTAMPING_OPT_STATS = 4096, + SOF_TIMESTAMPING_OPT_PKTINFO = 8192, + SOF_TIMESTAMPING_OPT_TX_SWHW = 16384, + SOF_TIMESTAMPING_BIND_PHC = 32768, + SOF_TIMESTAMPING_LAST = 32768, + SOF_TIMESTAMPING_MASK = 65535, +}; + +enum hwtstamp_tx_types { + HWTSTAMP_TX_OFF = 0, + HWTSTAMP_TX_ON = 1, + HWTSTAMP_TX_ONESTEP_SYNC = 2, + HWTSTAMP_TX_ONESTEP_P2P = 3, + __HWTSTAMP_TX_CNT = 4, +}; + +enum hwtstamp_rx_filters { + HWTSTAMP_FILTER_NONE = 0, + HWTSTAMP_FILTER_ALL = 1, + HWTSTAMP_FILTER_SOME = 2, + HWTSTAMP_FILTER_PTP_V1_L4_EVENT = 3, + HWTSTAMP_FILTER_PTP_V1_L4_SYNC = 4, + HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ = 5, + HWTSTAMP_FILTER_PTP_V2_L4_EVENT = 6, + HWTSTAMP_FILTER_PTP_V2_L4_SYNC = 7, + HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ = 8, + HWTSTAMP_FILTER_PTP_V2_L2_EVENT = 9, + HWTSTAMP_FILTER_PTP_V2_L2_SYNC = 10, + HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ = 11, + HWTSTAMP_FILTER_PTP_V2_EVENT = 12, + HWTSTAMP_FILTER_PTP_V2_SYNC = 13, + HWTSTAMP_FILTER_PTP_V2_DELAY_REQ = 14, + HWTSTAMP_FILTER_NTP_ALL = 15, + __HWTSTAMP_FILTER_CNT = 16, +}; + +enum tunable_id { + ETHTOOL_ID_UNSPEC = 0, + ETHTOOL_RX_COPYBREAK = 1, + ETHTOOL_TX_COPYBREAK = 2, + ETHTOOL_PFC_PREVENTION_TOUT = 3, + __ETHTOOL_TUNABLE_COUNT = 4, +}; + +struct tso_t { + int next_frag_idx; + int size; + void *data; + u16 ip_id; + u8 tlen; + bool ipv6; + u32 tcp_seq; +}; + +struct fec_platform_data { + phy_interface_t phy; + unsigned char mac[6]; + void (*sleep_mode_enable)(int); +}; + +struct ptp_clock_time { + __s64 sec; + __u32 nsec; + __u32 reserved; +}; + +struct ptp_extts_request { + unsigned int index; + unsigned int flags; + unsigned int rsv[2]; +}; + +struct ptp_perout_request { + union { + struct ptp_clock_time start; + struct ptp_clock_time phase; + }; + struct ptp_clock_time period; + unsigned int index; + unsigned int flags; + union { + struct ptp_clock_time on; + unsigned int rsv[4]; + }; +}; + +enum ptp_pin_function { + PTP_PF_NONE = 0, + PTP_PF_EXTTS = 1, + PTP_PF_PEROUT = 2, + PTP_PF_PHYSYNC = 3, +}; + +struct ptp_pin_desc { + char name[64]; + unsigned int index; + unsigned int func; + unsigned int chan; + unsigned int rsv[5]; +}; + +struct ptp_clock_request { + enum { + PTP_CLK_REQ_EXTTS = 0, + PTP_CLK_REQ_PEROUT = 1, + PTP_CLK_REQ_PPS = 2, + } type; + union { + struct ptp_extts_request extts; + struct ptp_perout_request perout; + }; +}; + +struct ptp_clock_info { + struct module *owner; + char name[32]; + s32 max_adj; + int n_alarm; + int n_ext_ts; + int n_per_out; + int n_pins; + int pps; + struct ptp_pin_desc *pin_config; + int (*adjfine)(struct ptp_clock_info *, long int); + int (*adjfreq)(struct ptp_clock_info *, s32); + int (*adjphase)(struct ptp_clock_info *, s32); + int (*adjtime)(struct ptp_clock_info *, s64); + int (*gettime64)(struct ptp_clock_info *, struct timespec64 *); + int (*gettimex64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *); + int (*getcrosststamp)(struct ptp_clock_info *, struct system_device_crosststamp *); + int (*settime64)(struct ptp_clock_info *, const struct timespec64 *); + int (*enable)(struct ptp_clock_info *, struct ptp_clock_request *, int); + int (*verify)(struct ptp_clock_info *, unsigned int, enum ptp_pin_function, unsigned int); + long int (*do_aux_work)(struct ptp_clock_info *); +}; + +struct bufdesc { + __le16 cbd_datlen; + __le16 cbd_sc; + __le32 cbd_bufaddr; +}; + +struct bufdesc_ex { + struct bufdesc desc; + __le32 cbd_esc; + __le32 cbd_prot; + __le32 cbd_bdu; + __le32 ts; + __le16 res0[4]; +}; + +struct bufdesc_prop { + int qid; + struct bufdesc *base; + struct bufdesc *last; + struct bufdesc *cur; + void *reg_desc_active; + dma_addr_t dma; + short unsigned int ring_size; + unsigned char dsize; + unsigned char dsize_log2; +}; + +struct fec_enet_priv_tx_q { + struct bufdesc_prop bd; + unsigned char *tx_bounce[512]; + struct sk_buff *tx_skbuff[512]; + short unsigned int tx_stop_threshold; + short unsigned int tx_wake_threshold; + struct bufdesc *dirty_tx; + char *tso_hdrs; + dma_addr_t tso_hdrs_dma; +}; + +struct fec_enet_priv_rx_q { + struct bufdesc_prop bd; + struct sk_buff *rx_skbuff[512]; +}; + +struct fec_stop_mode_gpr { + struct regmap *gpr; + u8 reg; + u8 bit; +}; + +struct ptp_clock; + +struct fec_enet_private { + void *hwp; + struct net_device *netdev; + struct clk *clk_ipg; + struct clk *clk_ahb; + struct clk *clk_ref; + struct clk *clk_enet_out; + struct clk *clk_ptp; + struct clk *clk_2x_txclk; + bool ptp_clk_on; + struct mutex ptp_clk_mutex; + unsigned int num_tx_queues; + unsigned int num_rx_queues; + struct fec_enet_priv_tx_q *tx_queue[3]; + struct fec_enet_priv_rx_q *rx_queue[3]; + unsigned int total_tx_ring_size; + unsigned int total_rx_ring_size; + struct platform_device *pdev; + int dev_id; + struct mii_bus *mii_bus; + uint phy_speed; + phy_interface_t phy_interface; + struct device_node *phy_node; + bool rgmii_txc_dly; + bool rgmii_rxc_dly; + int link; + int full_duplex; + int speed; + int irq[3]; + bool bufdesc_ex; + int pause_flag; + int wol_flag; + int wake_irq; + u32 quirks; + struct napi_struct napi; + int csum_flags; + struct work_struct tx_timeout_work; + struct ptp_clock *ptp_clock; + struct ptp_clock_info ptp_caps; + long unsigned int last_overflow_check; + spinlock_t tmreg_lock; + struct cyclecounter cc; + struct timecounter tc; + int rx_hwtstamp_filter; + u32 base_incval; + u32 cycle_speed; + int hwts_rx_en; + int hwts_tx_en; + struct delayed_work time_keep; + struct regulator *reg_phy; + struct fec_stop_mode_gpr stop_gpr; + unsigned int tx_align; + unsigned int rx_align; + unsigned int rx_pkts_itr; + unsigned int rx_time_itr; + unsigned int tx_pkts_itr; + unsigned int tx_time_itr; + unsigned int itr_clk_rate; + struct ethtool_eee eee; + unsigned int clk_ref_rate; + u32 rx_copybreak; + unsigned int ptp_inc; + int pps_channel; + unsigned int reload_period; + int pps_enable; + unsigned int next_counter; + u64 ethtool_stats[0]; +}; + +struct fec_devinfo { + u32 quirks; +}; + +enum imx_fec_type { + IMX25_FEC = 1, + IMX27_FEC = 2, + IMX28_FEC = 3, + IMX6Q_FEC = 4, + MVF600_FEC = 5, + IMX6SX_FEC = 6, + IMX6UL_FEC = 7, + IMX8MQ_FEC = 8, + IMX8QM_FEC = 9, +}; + +struct fec_stat { + char name[32]; + u16 offset; +}; + +struct hwtstamp_config { + int flags; + int tx_type; + int rx_filter; +}; + +struct pps_event_time { + struct timespec64 ts_real; +}; + +enum ptp_clock_events { + PTP_CLOCK_ALARM = 0, + PTP_CLOCK_EXTTS = 1, + PTP_CLOCK_PPS = 2, + PTP_CLOCK_PPSUSR = 3, +}; + +struct ptp_clock_event { + int type; + int index; + union { + u64 timestamp; + struct pps_event_time pps_times; + }; +}; + +struct tgec_mdio_controller { + __be32 reserved[12]; + __be32 mdio_stat; + __be32 mdio_ctl; + __be32 mdio_data; + __be32 mdio_addr; +}; + +struct mdio_fsl_priv { + struct tgec_mdio_controller *mdio_base; + bool is_little_endian; + bool has_a011043; +}; + +struct muram_info { + struct gen_pool *pool; + void *vbase; + size_t size; + phys_addr_t pbase; +}; + +enum fman_port_type { + FMAN_PORT_TYPE_TX = 0, + FMAN_PORT_TYPE_RX = 1, +}; + +struct fman_rev_info { + u8 major; + u8 minor; +}; + +enum fman_exceptions { + FMAN_EX_DMA_BUS_ERROR = 0, + FMAN_EX_DMA_READ_ECC = 1, + FMAN_EX_DMA_SYSTEM_WRITE_ECC = 2, + FMAN_EX_DMA_FM_WRITE_ECC = 3, + FMAN_EX_DMA_SINGLE_PORT_ECC = 4, + FMAN_EX_FPM_STALL_ON_TASKS = 5, + FMAN_EX_FPM_SINGLE_ECC = 6, + FMAN_EX_FPM_DOUBLE_ECC = 7, + FMAN_EX_QMI_SINGLE_ECC = 8, + FMAN_EX_QMI_DOUBLE_ECC = 9, + FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID = 10, + FMAN_EX_BMI_LIST_RAM_ECC = 11, + FMAN_EX_BMI_STORAGE_PROFILE_ECC = 12, + FMAN_EX_BMI_STATISTICS_RAM_ECC = 13, + FMAN_EX_BMI_DISPATCH_RAM_ECC = 14, + FMAN_EX_IRAM_ECC = 15, + FMAN_EX_MURAM_ECC = 16, +}; + +enum fman_event_modules { + FMAN_MOD_MAC = 0, + FMAN_MOD_FMAN_CTRL = 1, + FMAN_MOD_DUMMY_LAST = 2, +}; + +enum fman_intr_type { + FMAN_INTR_TYPE_ERR = 0, + FMAN_INTR_TYPE_NORMAL = 1, +}; + +enum fman_inter_module_event { + FMAN_EV_ERR_MAC0 = 0, + FMAN_EV_ERR_MAC1 = 1, + FMAN_EV_ERR_MAC2 = 2, + FMAN_EV_ERR_MAC3 = 3, + FMAN_EV_ERR_MAC4 = 4, + FMAN_EV_ERR_MAC5 = 5, + FMAN_EV_ERR_MAC6 = 6, + FMAN_EV_ERR_MAC7 = 7, + FMAN_EV_ERR_MAC8 = 8, + FMAN_EV_ERR_MAC9 = 9, + FMAN_EV_MAC0 = 10, + FMAN_EV_MAC1 = 11, + FMAN_EV_MAC2 = 12, + FMAN_EV_MAC3 = 13, + FMAN_EV_MAC4 = 14, + FMAN_EV_MAC5 = 15, + FMAN_EV_MAC6 = 16, + FMAN_EV_MAC7 = 17, + FMAN_EV_MAC8 = 18, + FMAN_EV_MAC9 = 19, + FMAN_EV_FMAN_CTRL_0 = 20, + FMAN_EV_FMAN_CTRL_1 = 21, + FMAN_EV_FMAN_CTRL_2 = 22, + FMAN_EV_FMAN_CTRL_3 = 23, + FMAN_EV_CNT = 24, +}; + +struct fman_intr_src { + void (*isr_cb)(void *); + void *src_handle; +}; + +struct fman; + +typedef irqreturn_t fman_exceptions_cb(struct fman *, enum fman_exceptions); + +struct fman_kg_regs; + +typedef irqreturn_t fman_bus_error_cb(struct fman *, u8, u64, u8, u16); + +struct muram_info___2; + +struct fman_keygen; + +struct fman_dts_params { + void *base_addr; + struct resource *res; + u8 id; + int err_irq; + u16 clk_freq; + u32 qman_channel_base; + u32 num_of_qman_channels; + struct resource muram_res; +}; + +struct fman_fpm_regs; + +struct fman_bmi_regs; + +struct fman_qmi_regs; + +struct fman_dma_regs; + +struct fman_hwp_regs; + +struct fman_state_struct; + +struct fman_cfg; + +struct fman { + struct device *dev; + void *base_addr; + struct fman_intr_src intr_mng[24]; + struct fman_fpm_regs *fpm_regs; + struct fman_bmi_regs *bmi_regs; + struct fman_qmi_regs *qmi_regs; + struct fman_dma_regs *dma_regs; + struct fman_hwp_regs *hwp_regs; + struct fman_kg_regs *kg_regs; + fman_exceptions_cb *exception_cb; + fman_bus_error_cb *bus_error_cb; + spinlock_t spinlock; + struct fman_state_struct *state; + struct fman_cfg *cfg; + struct muram_info___2 *muram; + struct fman_keygen *keygen; + long unsigned int cam_offset; + size_t cam_size; + long unsigned int fifo_offset; + size_t fifo_size; + u32 liodn_base[64]; + u32 liodn_offset[64]; + struct fman_dts_params dts_params; +}; + +struct fman_fpm_regs { + u32 fmfp_tnc; + u32 fmfp_prc; + u32 fmfp_brkc; + u32 fmfp_mxd; + u32 fmfp_dist1; + u32 fmfp_dist2; + u32 fm_epi; + u32 fm_rie; + u32 fmfp_fcev[4]; + u32 res0030[4]; + u32 fmfp_cee[4]; + u32 res0050[4]; + u32 fmfp_tsc1; + u32 fmfp_tsc2; + u32 fmfp_tsp; + u32 fmfp_tsf; + u32 fm_rcr; + u32 fmfp_extc; + u32 fmfp_ext1; + u32 fmfp_ext2; + u32 fmfp_drd[16]; + u32 fmfp_dra; + u32 fm_ip_rev_1; + u32 fm_ip_rev_2; + u32 fm_rstc; + u32 fm_cld; + u32 fm_npi; + u32 fmfp_exte; + u32 fmfp_ee; + u32 fmfp_cev[4]; + u32 res00f0[4]; + u32 fmfp_ps[50]; + u32 res01c8[14]; + u32 fmfp_clfabc; + u32 fmfp_clfcc; + u32 fmfp_clfaval; + u32 fmfp_clfbval; + u32 fmfp_clfcval; + u32 fmfp_clfamsk; + u32 fmfp_clfbmsk; + u32 fmfp_clfcmsk; + u32 fmfp_clfamc; + u32 fmfp_clfbmc; + u32 fmfp_clfcmc; + u32 fmfp_decceh; + u32 res0230[116]; + u32 fmfp_ts[128]; + u32 res0600[640]; +}; + +struct fman_bmi_regs { + u32 fmbm_init; + u32 fmbm_cfg1; + u32 fmbm_cfg2; + u32 res000c[5]; + u32 fmbm_ievr; + u32 fmbm_ier; + u32 fmbm_ifr; + u32 res002c[5]; + u32 fmbm_arb[8]; + u32 res0060[12]; + u32 fmbm_dtc[3]; + u32 res009c; + u32 fmbm_dcv[12]; + u32 fmbm_dcm[12]; + u32 fmbm_gde; + u32 fmbm_pp[63]; + u32 res0200; + u32 fmbm_pfs[63]; + u32 res0300; + u32 fmbm_spliodn[63]; +}; + +struct fman_qmi_regs { + u32 fmqm_gc; + u32 res0004; + u32 fmqm_eie; + u32 fmqm_eien; + u32 fmqm_eif; + u32 fmqm_ie; + u32 fmqm_ien; + u32 fmqm_if; + u32 fmqm_gs; + u32 fmqm_ts; + u32 fmqm_etfc; + u32 fmqm_dtfc; + u32 fmqm_dc0; + u32 fmqm_dc1; + u32 fmqm_dc2; + u32 fmqm_dc3; + u32 fmqm_dfdc; + u32 fmqm_dfcc; + u32 fmqm_dffc; + u32 fmqm_dcc; + u32 res0050[7]; + u32 fmqm_tapc; + u32 fmqm_dmcvc; + u32 fmqm_difdcc; + u32 fmqm_da1v; + u32 res007c; + u32 fmqm_dtc; + u32 fmqm_efddd; + u32 res0088[2]; + struct { + u32 fmqm_dtcfg1; + u32 fmqm_dtval1; + u32 fmqm_dtm1; + u32 fmqm_dtc1; + u32 fmqm_dtcfg2; + u32 fmqm_dtval2; + u32 fmqm_dtm2; + u32 res001c; + } dbg_traps[3]; + u8 res00f0[784]; +}; + +struct fman_dma_regs { + u32 fmdmsr; + u32 fmdmmr; + u32 fmdmtr; + u32 fmdmhy; + u32 fmdmsetr; + u32 fmdmtah; + u32 fmdmtal; + u32 fmdmtcid; + u32 fmdmra; + u32 fmdmrd; + u32 fmdmwcr; + u32 fmdmebcr; + u32 fmdmccqdr; + u32 fmdmccqvr1; + u32 fmdmccqvr2; + u32 fmdmcqvr3; + u32 fmdmcqvr4; + u32 fmdmcqvr5; + u32 fmdmsefrc; + u32 fmdmsqfrc; + u32 fmdmssrc; + u32 fmdmdcr; + u32 fmdmemsr; + u32 res005c; + u32 fmdmplr[32]; + u32 res00e0[968]; +}; + +struct fman_hwp_regs { + u32 res0000[529]; + u32 fmprrpimac; + u32 res[494]; +}; + +struct fman_state_struct { + u8 fm_id; + u16 fm_clk_freq; + struct fman_rev_info rev_info; + bool enabled_time_stamp; + u8 count1_micro_bit; + u8 total_num_of_tasks; + u8 accumulated_num_of_tasks; + u32 accumulated_fifo_size; + u8 accumulated_num_of_open_dmas; + u8 accumulated_num_of_deq_tnums; + u32 exceptions; + u32 extra_fifo_pool_size; + u8 extra_tasks_pool_size; + u8 extra_open_dmas_pool_size; + u16 port_mfl[10]; + u16 mac_mfl[10]; + u32 fm_iram_size; + u32 dma_thresh_max_commq; + u32 dma_thresh_max_buf; + u32 max_num_of_open_dmas; + u32 qmi_max_num_of_tnums; + u32 qmi_def_tnums_thresh; + u32 bmi_max_num_of_tasks; + u32 bmi_max_fifo_size; + u32 fm_port_num_of_cg; + u32 num_of_rx_ports; + u32 total_fifo_size; + u32 qman_channel_base; + u32 num_of_qman_channels; + struct resource *res; +}; + +enum fman_dma_aid_mode { + FMAN_DMA_AID_OUT_PORT_ID = 0, + FMAN_DMA_AID_OUT_TNUM = 1, +}; + +struct fman_cfg { + u8 disp_limit_tsh; + u8 prs_disp_tsh; + u8 plcr_disp_tsh; + u8 kg_disp_tsh; + u8 bmi_disp_tsh; + u8 qmi_enq_disp_tsh; + u8 qmi_deq_disp_tsh; + u8 fm_ctl1_disp_tsh; + u8 fm_ctl2_disp_tsh; + int dma_cache_override; + enum fman_dma_aid_mode dma_aid_mode; + u32 dma_axi_dbg_num_of_beats; + u32 dma_cam_num_of_entries; + u32 dma_watchdog; + u8 dma_comm_qtsh_asrt_emer; + u32 dma_write_buf_tsh_asrt_emer; + u32 dma_read_buf_tsh_asrt_emer; + u8 dma_comm_qtsh_clr_emer; + u32 dma_write_buf_tsh_clr_emer; + u32 dma_read_buf_tsh_clr_emer; + u32 dma_sos_emergency; + int dma_dbg_cnt_mode; + int catastrophic_err; + int dma_err; + u32 exceptions; + u16 clk_freq; + u32 cam_base_addr; + u32 fifo_base_addr; + u32 total_fifo_size; + u32 total_num_of_tasks; + u32 qmi_def_tnums_thresh; +}; + +struct fman_port_init_params { + u8 port_id; + enum fman_port_type port_type; + u16 port_speed; + u16 liodn_offset; + u8 num_of_tasks; + u8 num_of_extra_tasks; + u8 num_of_open_dmas; + u8 num_of_extra_open_dmas; + u32 size_of_fifo; + u32 extra_size_of_fifo; + u8 deq_pipeline_depth; + u16 max_frame_length; + u16 liodn_base; +}; + +struct fman_iram_regs { + u32 iadd; + u32 idata; + u32 itcfg; + u32 iready; +}; + +struct fman_buffer_prefix_content { + u16 priv_data_size; + bool pass_prs_result; + bool pass_time_stamp; + bool pass_hash_result; + u16 data_align; +}; + +struct fman_ext_pool_params { + u8 id; + u16 size; +}; + +struct fman_ext_pools { + u8 num_of_pools_used; + struct fman_ext_pool_params ext_buf_pool[8]; +}; + +struct fman_sp_int_context_data_copy { + u16 ext_buf_offset; + u8 int_context_offset; + u16 size; +}; + +struct fman_sp_buf_margins { + u16 start_margins; + u16 end_margins; +}; + +struct fman_sp_buffer_offsets { + u32 data_offset; + u32 prs_result_offset; + u32 time_stamp_offset; + u32 hash_result_offset; +}; + +struct fman_kg_scheme_regs { + u32 kgse_mode; + u32 kgse_ekfc; + u32 kgse_ekdv; + u32 kgse_bmch; + u32 kgse_bmcl; + u32 kgse_fqb; + u32 kgse_hc; + u32 kgse_ppc; + u32 kgse_gec[8]; + u32 kgse_spc; + u32 kgse_dv0; + u32 kgse_dv1; + u32 kgse_ccbs; + u32 kgse_mv; + u32 kgse_om; + u32 kgse_vsp; +}; + +struct fman_kg_pe_regs { + u32 fmkg_pe_sp; + u32 fmkg_pe_cpp; +}; + +struct fman_kg_regs___2 { + u32 fmkg_gcr; + u32 res004; + u32 res008; + u32 fmkg_eer; + u32 fmkg_eeer; + u32 res014; + u32 res018; + u32 fmkg_seer; + u32 fmkg_seeer; + u32 fmkg_gsr; + u32 fmkg_tpc; + u32 fmkg_serc; + u32 res030[4]; + u32 fmkg_fdor; + u32 fmkg_gdv0r; + u32 fmkg_gdv1r; + u32 res04c[6]; + u32 fmkg_feer; + u32 res068[38]; + union { + u32 fmkg_indirect[63]; + struct fman_kg_scheme_regs fmkg_sch; + struct fman_kg_pe_regs fmkg_pe; + }; + u32 fmkg_ar; +}; + +struct keygen_scheme { + bool used; + u8 hw_port_id; + u32 base_fqid; + u32 hash_fqid_count; + bool use_hashing; + bool symmetric_hash; + u8 hashShift; + u32 match_vector; +}; + +struct fman_keygen___2 { + struct keygen_scheme schemes[32]; + struct fman_kg_regs___2 *keygen_regs; +}; + +struct fman_buf_pool_depletion { + bool pools_grp_mode_enable; + u8 num_of_pools; + bool pools_to_consider[64]; + bool single_pool_mode_enable; + bool pools_to_consider_for_single_mode[64]; +}; + +struct fman_port_rx_params { + u32 err_fqid; + u32 dflt_fqid; + u32 pcd_base_fqid; + u32 pcd_fqs_count; + struct fman_ext_pools ext_buf_pools; +}; + +struct fman_port_non_rx_params { + u32 err_fqid; + u32 dflt_fqid; +}; + +union fman_port_specific_params { + struct fman_port_rx_params rx_params; + struct fman_port_non_rx_params non_rx_params; +}; + +struct fman_port_params { + void *fm; + union fman_port_specific_params specific_params; +}; + +struct fman_port_rx_bmi_regs { + u32 fmbm_rcfg; + u32 fmbm_rst; + u32 fmbm_rda; + u32 fmbm_rfp; + u32 fmbm_rfed; + u32 fmbm_ricp; + u32 fmbm_rim; + u32 fmbm_rebm; + u32 fmbm_rfne; + u32 fmbm_rfca; + u32 fmbm_rfpne; + u32 fmbm_rpso; + u32 fmbm_rpp; + u32 fmbm_rccb; + u32 fmbm_reth; + u32 reserved003c[1]; + u32 fmbm_rprai[8]; + u32 fmbm_rfqid; + u32 fmbm_refqid; + u32 fmbm_rfsdm; + u32 fmbm_rfsem; + u32 fmbm_rfene; + u32 reserved0074[2]; + u32 fmbm_rcmne; + u32 reserved0080[32]; + u32 fmbm_ebmpi[8]; + u32 fmbm_acnt[8]; + u32 reserved0130[8]; + u32 fmbm_rcgm[8]; + u32 fmbm_mpd; + u32 reserved0184[31]; + u32 fmbm_rstc; + u32 fmbm_rfrc; + u32 fmbm_rfbc; + u32 fmbm_rlfc; + u32 fmbm_rffc; + u32 fmbm_rfdc; + u32 fmbm_rfldec; + u32 fmbm_rodc; + u32 fmbm_rbdc; + u32 fmbm_rpec; + u32 reserved0224[22]; + u32 fmbm_rpc; + u32 fmbm_rpcp; + u32 fmbm_rccn; + u32 fmbm_rtuc; + u32 fmbm_rrquc; + u32 fmbm_rduc; + u32 fmbm_rfuc; + u32 fmbm_rpac; + u32 reserved02a0[24]; + u32 fmbm_rdcfg[3]; + u32 fmbm_rgpr; + u32 reserved0310[58]; +}; + +struct fman_port_tx_bmi_regs { + u32 fmbm_tcfg; + u32 fmbm_tst; + u32 fmbm_tda; + u32 fmbm_tfp; + u32 fmbm_tfed; + u32 fmbm_ticp; + u32 fmbm_tfdne; + u32 fmbm_tfca; + u32 fmbm_tcfqid; + u32 fmbm_tefqid; + u32 fmbm_tfene; + u32 fmbm_trlmts; + u32 fmbm_trlmt; + u32 reserved0034[14]; + u32 fmbm_tccb; + u32 fmbm_tfne; + u32 fmbm_tpfcm[2]; + u32 fmbm_tcmne; + u32 reserved0080[96]; + u32 fmbm_tstc; + u32 fmbm_tfrc; + u32 fmbm_tfdc; + u32 fmbm_tfledc; + u32 fmbm_tfufdc; + u32 fmbm_tbdc; + u32 reserved0218[26]; + u32 fmbm_tpc; + u32 fmbm_tpcp; + u32 fmbm_tccn; + u32 fmbm_ttuc; + u32 fmbm_ttcquc; + u32 fmbm_tduc; + u32 fmbm_tfuc; + u32 reserved029c[16]; + u32 fmbm_tdcfg[3]; + u32 fmbm_tgpr; + u32 reserved0310[58]; +}; + +union fman_port_bmi_regs { + struct fman_port_rx_bmi_regs rx; + struct fman_port_tx_bmi_regs tx; +}; + +struct fman_port_qmi_regs { + u32 fmqm_pnc; + u32 fmqm_pns; + u32 fmqm_pnts; + u32 reserved00c[4]; + u32 fmqm_pnen; + u32 fmqm_pnetfc; + u32 reserved024[2]; + u32 fmqm_pndn; + u32 fmqm_pndc; + u32 fmqm_pndtfc; + u32 fmqm_pndfdc; + u32 fmqm_pndcc; +}; + +struct fman_port_hwp_regs { + struct { + u32 ssa; + u32 lcv; + } pmda[16]; + u32 reserved080[222]; + u32 fmpr_pcac; +}; + +enum fman_port_deq_prefetch { + FMAN_PORT_DEQ_NO_PREFETCH = 0, + FMAN_PORT_DEQ_PART_PREFETCH = 1, + FMAN_PORT_DEQ_FULL_PREFETCH = 2, +}; + +struct fman_port_rsrc { + u32 num; + u32 extra; +}; + +enum fman_port_dma_swap { + FMAN_PORT_DMA_NO_SWAP = 0, + FMAN_PORT_DMA_SWAP_LE = 1, + FMAN_PORT_DMA_SWAP_BE = 2, +}; + +enum fman_port_color { + FMAN_PORT_COLOR_GREEN = 0, + FMAN_PORT_COLOR_YELLOW = 1, + FMAN_PORT_COLOR_RED = 2, + FMAN_PORT_COLOR_OVERRIDE = 3, +}; + +enum fman_port_deq_type { + FMAN_PORT_DEQ_BY_PRI = 0, + FMAN_PORT_DEQ_ACTIVE_FQ = 1, + FMAN_PORT_DEQ_ACTIVE_FQ_NO_ICS = 2, +}; + +struct fman_port_bpools { + u8 count; + bool counters_enable; + u8 grp_bp_depleted_num; + struct { + u8 bpid; + u16 size; + bool is_backup; + bool grp_bp_depleted; + bool single_bp_depleted; + } bpool[8]; +}; + +struct fman_port_cfg { + u32 dflt_fqid; + u32 err_fqid; + u32 pcd_base_fqid; + u32 pcd_fqs_count; + u8 deq_sp; + bool deq_high_priority; + enum fman_port_deq_type deq_type; + enum fman_port_deq_prefetch deq_prefetch_option; + u16 deq_byte_cnt; + u8 cheksum_last_bytes_ignore; + u8 rx_cut_end_bytes; + struct fman_buf_pool_depletion buf_pool_depletion; + struct fman_ext_pools ext_buf_pools; + u32 tx_fifo_min_level; + u32 tx_fifo_low_comf_level; + u32 rx_pri_elevation; + u32 rx_fifo_thr; + struct fman_sp_buf_margins buf_margins; + u32 int_buf_start_margin; + struct fman_sp_int_context_data_copy int_context; + u32 discard_mask; + u32 err_mask; + struct fman_buffer_prefix_content buffer_prefix_content; + bool dont_release_buf; + u8 rx_fd_bits; + u32 tx_fifo_deq_pipeline_depth; + bool errata_A006320; + bool excessive_threshold_register; + bool fmbm_tfne_has_features; + enum fman_port_dma_swap dma_swap_data; + enum fman_port_color color; +}; + +struct fman_port_rx_pools_params { + u8 num_of_pools; + u16 largest_buf_size; +}; + +struct fman_port_dts_params { + void *base_addr; + enum fman_port_type type; + u16 speed; + u8 id; + u32 qman_channel_id; + struct fman *fman; +}; + +struct fman_port { + void *fm; + struct device *dev; + struct fman_rev_info rev_info; + u8 port_id; + enum fman_port_type port_type; + u16 port_speed; + union fman_port_bmi_regs *bmi_regs; + struct fman_port_qmi_regs *qmi_regs; + struct fman_port_hwp_regs *hwp_regs; + struct fman_sp_buffer_offsets buffer_offsets; + u8 internal_buf_offset; + struct fman_ext_pools ext_buf_pools; + u16 max_frame_length; + struct fman_port_rsrc open_dmas; + struct fman_port_rsrc tasks; + struct fman_port_rsrc fifo_bufs; + struct fman_port_rx_pools_params rx_pools_params; + struct fman_port_cfg *cfg; + struct fman_port_dts_params dts_params; + u8 ext_pools_num; + u32 max_port_fifo_size; + u32 max_num_of_ext_pools; + u32 max_num_of_sub_portals; + u32 bm_max_num_of_pools; +}; + +typedef u8 enet_addr_t[6]; + +enum comm_mode { + COMM_MODE_NONE = 0, + COMM_MODE_RX = 1, + COMM_MODE_TX = 2, + COMM_MODE_RX_AND_TX = 3, +}; + +enum fman_mac_exceptions { + FM_MAC_EX_10G_MDIO_SCAN_EVENT = 0, + FM_MAC_EX_10G_MDIO_CMD_CMPL = 1, + FM_MAC_EX_10G_REM_FAULT = 2, + FM_MAC_EX_10G_LOC_FAULT = 3, + FM_MAC_EX_10G_TX_ECC_ER = 4, + FM_MAC_EX_10G_TX_FIFO_UNFL = 5, + FM_MAC_EX_10G_TX_FIFO_OVFL = 6, + FM_MAC_EX_10G_TX_ER = 7, + FM_MAC_EX_10G_RX_FIFO_OVFL = 8, + FM_MAC_EX_10G_RX_ECC_ER = 9, + FM_MAC_EX_10G_RX_JAB_FRM = 10, + FM_MAC_EX_10G_RX_OVRSZ_FRM = 11, + FM_MAC_EX_10G_RX_RUNT_FRM = 12, + FM_MAC_EX_10G_RX_FRAG_FRM = 13, + FM_MAC_EX_10G_RX_LEN_ER = 14, + FM_MAC_EX_10G_RX_CRC_ER = 15, + FM_MAC_EX_10G_RX_ALIGN_ER = 16, + FM_MAC_EX_1G_BAB_RX = 17, + FM_MAC_EX_1G_RX_CTL = 18, + FM_MAC_EX_1G_GRATEFUL_TX_STP_COMPLET = 19, + FM_MAC_EX_1G_BAB_TX = 20, + FM_MAC_EX_1G_TX_CTL = 21, + FM_MAC_EX_1G_TX_ERR = 22, + FM_MAC_EX_1G_LATE_COL = 23, + FM_MAC_EX_1G_COL_RET_LMT = 24, + FM_MAC_EX_1G_TX_FIFO_UNDRN = 25, + FM_MAC_EX_1G_MAG_PCKT = 26, + FM_MAC_EX_1G_MII_MNG_RD_COMPLET = 27, + FM_MAC_EX_1G_MII_MNG_WR_COMPLET = 28, + FM_MAC_EX_1G_GRATEFUL_RX_STP_COMPLET = 29, + FM_MAC_EX_1G_DATA_ERR = 30, + FM_MAC_1G_RX_DATA_ERR = 31, + FM_MAC_EX_1G_1588_TS_RX_ERR = 32, + FM_MAC_EX_1G_RX_MIB_CNT_OVFL = 33, + FM_MAC_EX_TS_FIFO_ECC_ERR = 34, + FM_MAC_EX_MAGIC_PACKET_INDICATION = 26, +}; + +typedef void fman_mac_exception_cb(void *, enum fman_mac_exceptions); + +struct fman_mac_params { + void *base_addr; + enet_addr_t addr; + u8 mac_id; + phy_interface_t phy_if; + u16 max_speed; + void *fm; + void *dev_id; + fman_mac_exception_cb *event_cb; + fman_mac_exception_cb *exception_cb; + bool basex_if; + struct device_node *internal_phy_node; +}; + +struct fman_port___2; + +struct fman_mac; + +struct mac_priv_s; + +struct mac_device { + struct resource *res; + u8 addr[6]; + struct fman_port___2 *port[2]; + u32 if_support; + struct phy_device *phy_dev; + phy_interface_t phy_if; + struct device_node *phy_node; + bool autoneg_pause; + bool rx_pause_req; + bool tx_pause_req; + bool rx_pause_active; + bool tx_pause_active; + bool promisc; + bool allmulti; + int (*init)(struct mac_device *); + int (*start)(struct mac_device *); + int (*stop)(struct mac_device *); + void (*adjust_link)(struct mac_device *); + int (*set_promisc)(struct fman_mac *, bool); + int (*change_addr)(struct fman_mac *, u8(*)[6]); + int (*set_allmulti)(struct fman_mac *, bool); + int (*set_tstamp)(struct fman_mac *, bool); + int (*set_multi)(struct net_device *, struct mac_device *); + int (*set_rx_pause)(struct fman_mac *, bool); + int (*set_tx_pause)(struct fman_mac *, u8, u16, u16); + int (*set_exception)(struct fman_mac *, enum fman_mac_exceptions, bool); + int (*add_hash_mac_addr)(struct fman_mac *, enet_addr_t *); + int (*remove_hash_mac_addr)(struct fman_mac *, enet_addr_t *); + struct fman_mac *fman_mac; + struct mac_priv_s *priv; +}; + +struct mac_priv_s { + struct device *dev; + void *vaddr; + u8 cell_index; + struct fman *fman; + struct device_node *internal_phy_node; + struct list_head mc_addr_list; + struct platform_device *eth_dev; + struct fixed_phy_status *fixed_link; + u16 speed; + u16 max_speed; + int (*enable)(struct fman_mac *, enum comm_mode); + int (*disable)(struct fman_mac *, enum comm_mode); +}; + +struct dpaa_eth_data { + struct mac_device *mac_dev; + int mac_hw_id; + int fman_hw_id; +}; + +struct mac_address { + u8 addr[6]; + struct list_head list; +}; + +struct eth_hash_entry { + u64 addr; + struct list_head node; +}; + +struct eth_hash_t { + u16 size; + struct list_head *lsts; +}; + +struct dtsec_regs { + u32 tsec_id; + u32 tsec_id2; + u32 ievent; + u32 imask; + u32 reserved0010[1]; + u32 ecntrl; + u32 ptv; + u32 tbipa; + u32 tmr_ctrl; + u32 tmr_pevent; + u32 tmr_pemask; + u32 reserved002c[5]; + u32 tctrl; + u32 reserved0044[3]; + u32 rctrl; + u32 reserved0054[11]; + u32 igaddr[8]; + u32 gaddr[8]; + u32 reserved00c0[16]; + u32 maccfg1; + u32 maccfg2; + u32 ipgifg; + u32 hafdup; + u32 maxfrm; + u32 reserved0114[10]; + u32 ifstat; + u32 macstnaddr1; + u32 macstnaddr2; + struct { + u32 exact_match1; + u32 exact_match2; + } macaddr[15]; + u32 reserved01c0[16]; + u32 tr64; + u32 tr127; + u32 tr255; + u32 tr511; + u32 tr1k; + u32 trmax; + u32 trmgv; + u32 rbyt; + u32 rpkt; + u32 rfcs; + u32 rmca; + u32 rbca; + u32 rxcf; + u32 rxpf; + u32 rxuo; + u32 raln; + u32 rflr; + u32 rcde; + u32 rcse; + u32 rund; + u32 rovr; + u32 rfrg; + u32 rjbr; + u32 rdrp; + u32 tbyt; + u32 tpkt; + u32 tmca; + u32 tbca; + u32 txpf; + u32 tdfr; + u32 tedf; + u32 tscl; + u32 tmcl; + u32 tlcl; + u32 txcl; + u32 tncl; + u32 reserved0290[1]; + u32 tdrp; + u32 tjbr; + u32 tfcs; + u32 txcf; + u32 tovr; + u32 tund; + u32 tfrg; + u32 car1; + u32 car2; + u32 cam1; + u32 cam2; + u32 reserved02c0[848]; +}; + +struct dtsec_cfg { + u16 halfdup_retransmit; + u16 halfdup_coll_window; + bool tx_pad_crc; + u16 tx_pause_time; + bool ptp_tsu_en; + bool ptp_exception_en; + u32 preamble_len; + u32 rx_prepend; + u16 tx_pause_time_extd; + u16 maximum_frame; + u32 non_back_to_back_ipg1; + u32 non_back_to_back_ipg2; + u32 min_ifg_enforcement; + u32 back_to_back_ipg; +}; + +struct fman_mac___2 { + struct dtsec_regs *regs; + u64 addr; + phy_interface_t phy_if; + u16 max_speed; + void *dev_id; + fman_mac_exception_cb *exception_cb; + fman_mac_exception_cb *event_cb; + u8 num_of_ind_addr_in_regs; + struct eth_hash_t *multicast_addr_hash; + struct eth_hash_t *unicast_addr_hash; + u8 mac_id; + u32 exceptions; + bool ptp_tsu_enabled; + bool en_tsu_err_exception; + struct dtsec_cfg *dtsec_drv_param; + void *fm; + struct fman_rev_info fm_rev_info; + bool basex_if; + struct phy_device *tbiphy; +}; + +struct mac_addr { + u32 mac_addr_l; + u32 mac_addr_u; +}; + +struct memac_regs { + u32 res0000[2]; + u32 command_config; + struct mac_addr mac_addr0; + u32 maxfrm; + u32 res0018[1]; + u32 rx_fifo_sections; + u32 tx_fifo_sections; + u32 res0024[2]; + u32 hashtable_ctrl; + u32 res0030[4]; + u32 ievent; + u32 tx_ipg_length; + u32 res0048; + u32 imask; + u32 res0050; + u32 pause_quanta[4]; + u32 pause_thresh[4]; + u32 rx_pause_status; + u32 res0078[2]; + struct mac_addr mac_addr[7]; + u32 lpwake_timer; + u32 sleep_timer; + u32 res00c0[8]; + u32 statn_config; + u32 res00e4[7]; + u32 reoct_l; + u32 reoct_u; + u32 roct_l; + u32 roct_u; + u32 raln_l; + u32 raln_u; + u32 rxpf_l; + u32 rxpf_u; + u32 rfrm_l; + u32 rfrm_u; + u32 rfcs_l; + u32 rfcs_u; + u32 rvlan_l; + u32 rvlan_u; + u32 rerr_l; + u32 rerr_u; + u32 ruca_l; + u32 ruca_u; + u32 rmca_l; + u32 rmca_u; + u32 rbca_l; + u32 rbca_u; + u32 rdrp_l; + u32 rdrp_u; + u32 rpkt_l; + u32 rpkt_u; + u32 rund_l; + u32 rund_u; + u32 r64_l; + u32 r64_u; + u32 r127_l; + u32 r127_u; + u32 r255_l; + u32 r255_u; + u32 r511_l; + u32 r511_u; + u32 r1023_l; + u32 r1023_u; + u32 r1518_l; + u32 r1518_u; + u32 r1519x_l; + u32 r1519x_u; + u32 rovr_l; + u32 rovr_u; + u32 rjbr_l; + u32 rjbr_u; + u32 rfrg_l; + u32 rfrg_u; + u32 rcnp_l; + u32 rcnp_u; + u32 rdrntp_l; + u32 rdrntp_u; + u32 res01d0[12]; + u32 teoct_l; + u32 teoct_u; + u32 toct_l; + u32 toct_u; + u32 res0210[2]; + u32 txpf_l; + u32 txpf_u; + u32 tfrm_l; + u32 tfrm_u; + u32 tfcs_l; + u32 tfcs_u; + u32 tvlan_l; + u32 tvlan_u; + u32 terr_l; + u32 terr_u; + u32 tuca_l; + u32 tuca_u; + u32 tmca_l; + u32 tmca_u; + u32 tbca_l; + u32 tbca_u; + u32 res0258[2]; + u32 tpkt_l; + u32 tpkt_u; + u32 tund_l; + u32 tund_u; + u32 t64_l; + u32 t64_u; + u32 t127_l; + u32 t127_u; + u32 t255_l; + u32 t255_u; + u32 t511_l; + u32 t511_u; + u32 t1023_l; + u32 t1023_u; + u32 t1518_l; + u32 t1518_u; + u32 t1519x_l; + u32 t1519x_u; + u32 res02a8[6]; + u32 tcnp_l; + u32 tcnp_u; + u32 res02c8[14]; + u32 if_mode; + u32 if_status; + u32 res0308[14]; + u32 hg_config; + u32 res0344[3]; + u32 hg_pause_quanta; + u32 res0354[3]; + u32 hg_pause_thresh; + u32 res0364[3]; + u32 hgrx_pause_status; + u32 hg_fifos_status; + u32 rhm; + u32 thm; +}; + +struct memac_cfg { + bool reset_on_init; + bool pause_ignore; + bool promiscuous_mode_enable; + struct fixed_phy_status *fixed_link; + u16 max_frame_length; + u16 pause_quanta; + u32 tx_ipg_length; +}; + +struct fman_mac___3 { + struct memac_regs *regs; + u64 addr; + phy_interface_t phy_if; + u16 max_speed; + void *dev_id; + fman_mac_exception_cb *exception_cb; + fman_mac_exception_cb *event_cb; + struct eth_hash_t *multicast_addr_hash; + struct eth_hash_t *unicast_addr_hash; + u8 mac_id; + u32 exceptions; + struct memac_cfg *memac_drv_param; + void *fm; + struct fman_rev_info fm_rev_info; + bool basex_if; + struct phy_device *pcsphy; + bool allmulti_enabled; +}; + +struct tgec_regs { + u32 tgec_id; + u32 reserved001[1]; + u32 command_config; + u32 mac_addr_0; + u32 mac_addr_1; + u32 maxfrm; + u32 pause_quant; + u32 rx_fifo_sections; + u32 tx_fifo_sections; + u32 rx_fifo_almost_f_e; + u32 tx_fifo_almost_f_e; + u32 hashtable_ctrl; + u32 mdio_cfg_status; + u32 mdio_command; + u32 mdio_data; + u32 mdio_regaddr; + u32 status; + u32 tx_ipg_len; + u32 mac_addr_2; + u32 mac_addr_3; + u32 rx_fifo_ptr_rd; + u32 rx_fifo_ptr_wr; + u32 tx_fifo_ptr_rd; + u32 tx_fifo_ptr_wr; + u32 imask; + u32 ievent; + u32 udp_port; + u32 type_1588v2; + u32 reserved070[4]; + u32 tfrm_u; + u32 tfrm_l; + u32 rfrm_u; + u32 rfrm_l; + u32 rfcs_u; + u32 rfcs_l; + u32 raln_u; + u32 raln_l; + u32 txpf_u; + u32 txpf_l; + u32 rxpf_u; + u32 rxpf_l; + u32 rlong_u; + u32 rlong_l; + u32 rflr_u; + u32 rflr_l; + u32 tvlan_u; + u32 tvlan_l; + u32 rvlan_u; + u32 rvlan_l; + u32 toct_u; + u32 toct_l; + u32 roct_u; + u32 roct_l; + u32 ruca_u; + u32 ruca_l; + u32 rmca_u; + u32 rmca_l; + u32 rbca_u; + u32 rbca_l; + u32 terr_u; + u32 terr_l; + u32 reserved100[2]; + u32 tuca_u; + u32 tuca_l; + u32 tmca_u; + u32 tmca_l; + u32 tbca_u; + u32 tbca_l; + u32 rdrp_u; + u32 rdrp_l; + u32 reoct_u; + u32 reoct_l; + u32 rpkt_u; + u32 rpkt_l; + u32 trund_u; + u32 trund_l; + u32 r64_u; + u32 r64_l; + u32 r127_u; + u32 r127_l; + u32 r255_u; + u32 r255_l; + u32 r511_u; + u32 r511_l; + u32 r1023_u; + u32 r1023_l; + u32 r1518_u; + u32 r1518_l; + u32 r1519x_u; + u32 r1519x_l; + u32 trovr_u; + u32 trovr_l; + u32 trjbr_u; + u32 trjbr_l; + u32 trfrg_u; + u32 trfrg_l; + u32 rerr_u; + u32 rerr_l; +}; + +struct tgec_cfg { + bool pause_ignore; + bool promiscuous_mode_enable; + u16 max_frame_length; + u16 pause_quant; + u32 tx_ipg_length; +}; + +struct fman_mac___4 { + struct tgec_regs *regs; + u64 addr; + u16 max_speed; + void *dev_id; + fman_mac_exception_cb *exception_cb; + fman_mac_exception_cb *event_cb; + struct eth_hash_t *multicast_addr_hash; + struct eth_hash_t *unicast_addr_hash; + u8 mac_id; + u32 exceptions; + struct tgec_cfg *cfg; + void *fm; + struct fman_rev_info fm_rev_info; + bool allmulti_enabled; +}; + +struct smc91x_platdata { + long unsigned int flags; + unsigned char leda; + unsigned char ledb; + bool pxa_u16_align4; +}; + +struct smc_local { + struct sk_buff *pending_tx_skb; + struct tasklet_struct tx_task; + struct gpio_desc *power_gpio; + struct gpio_desc *reset_gpio; + int version; + int tcr_cur_mode; + int rcr_cur_mode; + int rpc_cur_mode; + int ctl_rfduplx; + int ctl_rspeed; + u32 msg_enable; + u32 phy_type; + struct mii_if_info mii; + struct work_struct phy_configure; + struct net_device *dev; + int work_pending; + spinlock_t lock; + struct dma_chan *dma_chan; + void *base; + void *datacs; + int io_shift; + bool half_word_align4; + struct smc91x_platdata cfg; +}; + +struct mdio_platform_data { + long unsigned int bus_freq; +}; + +struct davinci_mdio_of_param { + int autosuspend_delay_ms; +}; + +struct davinci_mdio_regs { + u32 version; + u32 control; + u32 alive; + u32 link; + u32 linkintraw; + u32 linkintmasked; + u32 __reserved_0[2]; + u32 userintraw; + u32 userintmasked; + u32 userintmaskset; + u32 userintmaskclr; + u32 __reserved_1[20]; + struct { + u32 access; + u32 physel; + } user[0]; +}; + +struct davinci_mdio_data { + struct mdio_platform_data pdata; + struct davinci_mdio_regs *regs; + struct clk *clk; + struct device *dev; + struct mii_bus *bus; + bool active_in_suspend; + long unsigned int access_time; + bool skip_scan; + u32 clk_div; +}; + +enum { + IFLA_UNSPEC = 0, + IFLA_ADDRESS = 1, + IFLA_BROADCAST = 2, + IFLA_IFNAME = 3, + IFLA_MTU = 4, + IFLA_LINK = 5, + IFLA_QDISC = 6, + IFLA_STATS = 7, + IFLA_COST = 8, + IFLA_PRIORITY = 9, + IFLA_MASTER = 10, + IFLA_WIRELESS = 11, + IFLA_PROTINFO = 12, + IFLA_TXQLEN = 13, + IFLA_MAP = 14, + IFLA_WEIGHT = 15, + IFLA_OPERSTATE = 16, + IFLA_LINKMODE = 17, + IFLA_LINKINFO = 18, + IFLA_NET_NS_PID = 19, + IFLA_IFALIAS = 20, + IFLA_NUM_VF = 21, + IFLA_VFINFO_LIST = 22, + IFLA_STATS64 = 23, + IFLA_VF_PORTS = 24, + IFLA_PORT_SELF = 25, + IFLA_AF_SPEC = 26, + IFLA_GROUP = 27, + IFLA_NET_NS_FD = 28, + IFLA_EXT_MASK = 29, + IFLA_PROMISCUITY = 30, + IFLA_NUM_TX_QUEUES = 31, + IFLA_NUM_RX_QUEUES = 32, + IFLA_CARRIER = 33, + IFLA_PHYS_PORT_ID = 34, + IFLA_CARRIER_CHANGES = 35, + IFLA_PHYS_SWITCH_ID = 36, + IFLA_LINK_NETNSID = 37, + IFLA_PHYS_PORT_NAME = 38, + IFLA_PROTO_DOWN = 39, + IFLA_GSO_MAX_SEGS = 40, + IFLA_GSO_MAX_SIZE = 41, + IFLA_PAD = 42, + IFLA_XDP = 43, + IFLA_EVENT = 44, + IFLA_NEW_NETNSID = 45, + IFLA_IF_NETNSID = 46, + IFLA_TARGET_NETNSID = 46, + IFLA_CARRIER_UP_COUNT = 47, + IFLA_CARRIER_DOWN_COUNT = 48, + IFLA_NEW_IFINDEX = 49, + IFLA_MIN_MTU = 50, + IFLA_MAX_MTU = 51, + IFLA_PROP_LIST = 52, + IFLA_ALT_IFNAME = 53, + IFLA_PERM_ADDRESS = 54, + IFLA_PROTO_DOWN_REASON = 55, + IFLA_PARENT_DEV_NAME = 56, + IFLA_PARENT_DEV_BUS_NAME = 57, + __IFLA_MAX = 58, +}; + +enum { + IFLA_PPP_UNSPEC = 0, + IFLA_PPP_DEV_FD = 1, + __IFLA_PPP_MAX = 2, +}; + +enum NPmode { + NPMODE_PASS = 0, + NPMODE_DROP = 1, + NPMODE_ERROR = 2, + NPMODE_QUEUE = 3, +}; + +struct pppstat { + __u32 ppp_discards; + __u32 ppp_ibytes; + __u32 ppp_ioctects; + __u32 ppp_ipackets; + __u32 ppp_ierrors; + __u32 ppp_ilqrs; + __u32 ppp_obytes; + __u32 ppp_ooctects; + __u32 ppp_opackets; + __u32 ppp_oerrors; + __u32 ppp_olqrs; +}; + +struct vjstat { + __u32 vjs_packets; + __u32 vjs_compressed; + __u32 vjs_searches; + __u32 vjs_misses; + __u32 vjs_uncompressedin; + __u32 vjs_compressedin; + __u32 vjs_errorin; + __u32 vjs_tossed; +}; + +struct compstat { + __u32 unc_bytes; + __u32 unc_packets; + __u32 comp_bytes; + __u32 comp_packets; + __u32 inc_bytes; + __u32 inc_packets; + __u32 in_count; + __u32 bytes_out; + double ratio; +}; + +struct ppp_stats { + struct pppstat p; + struct vjstat vj; +}; + +struct ppp_comp_stats { + struct compstat c; + struct compstat d; +}; + +struct ppp_idle32 { + __s32 xmit_idle; + __s32 recv_idle; +}; + +struct ppp_idle64 { + __s64 xmit_idle; + __s64 recv_idle; +}; + +struct npioctl { + int protocol; + enum NPmode mode; +}; + +struct ppp_option_data { + __u8 *ptr; + __u32 length; + int transmit; +}; + +struct ppp_channel; + +struct ppp_channel_ops { + int (*start_xmit)(struct ppp_channel *, struct sk_buff *); + int (*ioctl)(struct ppp_channel *, unsigned int, long unsigned int); + int (*fill_forward_path)(struct net_device_path_ctx *, struct net_device_path *, const struct ppp_channel *); +}; + +struct ppp_channel { + void *private; + const struct ppp_channel_ops *ops; + int mtu; + int hdrlen; + void *ppp; + int speed; + int latency; +}; + +struct compressor { + int compress_proto; + void * (*comp_alloc)(unsigned char *, int); + void (*comp_free)(void *); + int (*comp_init)(void *, unsigned char *, int, int, int, int); + void (*comp_reset)(void *); + int (*compress)(void *, unsigned char *, unsigned char *, int, int); + void (*comp_stat)(void *, struct compstat *); + void * (*decomp_alloc)(unsigned char *, int); + void (*decomp_free)(void *); + int (*decomp_init)(void *, unsigned char *, int, int, int, int, int); + void (*decomp_reset)(void *); + int (*decompress)(void *, unsigned char *, int, unsigned char *, int); + void (*incomp)(void *, unsigned char *, int); + void (*decomp_stat)(void *, struct compstat *); + struct module *owner; + unsigned int comp_extra; +}; + +typedef __u8 byte_t; + +typedef __u32 int32; + +struct cstate___2 { + byte_t cs_this; + bool initialized; + struct cstate___2 *next; + struct iphdr cs_ip; + struct tcphdr cs_tcp; + unsigned char cs_ipopt[64]; + unsigned char cs_tcpopt[64]; + int cs_hsize; +}; + +struct slcompress { + struct cstate___2 *tstate; + struct cstate___2 *rstate; + byte_t tslot_limit; + byte_t rslot_limit; + byte_t xmit_oldest; + byte_t xmit_current; + byte_t recv_current; + byte_t flags; + int32 sls_o_nontcp; + int32 sls_o_tcp; + int32 sls_o_uncompressed; + int32 sls_o_compressed; + int32 sls_o_searches; + int32 sls_o_misses; + int32 sls_i_uncompressed; + int32 sls_i_compressed; + int32 sls_i_error; + int32 sls_i_tossed; + int32 sls_i_runt; + int32 sls_i_badcheck; +}; + +struct ppp_file { + enum { + INTERFACE = 1, + CHANNEL = 2, + } kind; + struct sk_buff_head xq; + struct sk_buff_head rq; + wait_queue_head_t rwait; + refcount_t refcnt; + int hdrlen; + int index; + int dead; +}; + +struct ppp_link_stats { + u64 rx_packets; + u64 tx_packets; + u64 rx_bytes; + u64 tx_bytes; +}; + +struct ppp { + struct ppp_file file; + struct file *owner; + struct list_head channels; + int n_channels; + spinlock_t rlock; + spinlock_t wlock; + int *xmit_recursion; + int mru; + unsigned int flags; + unsigned int xstate; + unsigned int rstate; + int debug; + struct slcompress *vj; + enum NPmode npmode[6]; + struct sk_buff *xmit_pending; + struct compressor *xcomp; + void *xc_state; + struct compressor *rcomp; + void *rc_state; + long unsigned int last_xmit; + long unsigned int last_recv; + struct net_device *dev; + int closing; + int nxchan; + u32 nxseq; + int mrru; + u32 nextseq; + u32 minseq; + struct sk_buff_head mrq; + struct bpf_prog *pass_filter; + struct bpf_prog *active_filter; + struct net *ppp_net; + struct ppp_link_stats stats64; +}; + +struct channel { + struct ppp_file file; + struct list_head list; + struct ppp_channel *chan; + struct rw_semaphore chan_sem; + spinlock_t downl; + struct ppp *ppp; + struct net *chan_net; + struct list_head clist; + rwlock_t upl; + struct channel *bridge; + u8 avail; + u8 had_frag; + u32 lastseq; + int speed; +}; + +struct ppp_config { + struct file *file; + s32 unit; + bool ifname_is_set; +}; + +struct ppp_net { + struct idr units_idr; + struct mutex all_ppp_mutex; + struct list_head all_channels; + struct list_head new_channels; + int last_channel_index; + spinlock_t all_channels_lock; +}; + +struct sock_fprog32 { + short unsigned int len; + compat_caddr_t filter; +}; + +struct ppp_option_data32 { + compat_uptr_t ptr; + u32 length; + compat_int_t transmit; +}; + +struct ppp_mp_skb_parm { + u32 sequence; + u8 BEbits; +}; + +struct compressor_entry { + struct list_head list; + struct compressor *comp; +}; + +struct wl1251_platform_data { + int power_gpio; + int irq; + bool use_eeprom; +}; + +enum { + IFLA_INFO_UNSPEC = 0, + IFLA_INFO_KIND = 1, + IFLA_INFO_DATA = 2, + IFLA_INFO_XSTATS = 3, + IFLA_INFO_SLAVE_KIND = 4, + IFLA_INFO_SLAVE_DATA = 5, + __IFLA_INFO_MAX = 6, +}; + +enum wwan_port_type { + WWAN_PORT_AT = 0, + WWAN_PORT_MBIM = 1, + WWAN_PORT_QMI = 2, + WWAN_PORT_QCDM = 3, + WWAN_PORT_FIREHOSE = 4, + __WWAN_PORT_MAX = 5, + WWAN_PORT_MAX = 4, + WWAN_PORT_UNKNOWN = 5, +}; + +struct wwan_port; + +struct wwan_port_ops { + int (*start)(struct wwan_port *); + void (*stop)(struct wwan_port *); + int (*tx)(struct wwan_port *, struct sk_buff *); + int (*tx_blocking)(struct wwan_port *, struct sk_buff *); + __poll_t (*tx_poll)(struct wwan_port *, struct file *, poll_table *); +}; + +struct wwan_port { + enum wwan_port_type type; + unsigned int start_count; + long unsigned int flags; + const struct wwan_port_ops *ops; + struct mutex ops_lock; + struct device dev; + struct sk_buff_head rxq; + wait_queue_head_t waitqueue; + struct mutex data_lock; + union { + struct { + struct ktermios termios; + int mdmbits; + } at_data; + }; +}; + +struct wwan_netdev_priv { + u32 link_id; + int: 32; + u8 drv_priv[0]; +}; + +struct wwan_ops { + unsigned int priv_size; + void (*setup)(struct net_device *); + int (*newlink)(void *, struct net_device *, u32, struct netlink_ext_ack *); + void (*dellink)(void *, struct net_device *, struct list_head *); +}; + +struct ifinfomsg { + unsigned char ifi_family; + unsigned char __ifi_pad; + short unsigned int ifi_type; + int ifi_index; + unsigned int ifi_flags; + unsigned int ifi_change; +}; + +enum { + IFLA_WWAN_UNSPEC = 0, + IFLA_WWAN_LINK_ID = 1, + __IFLA_WWAN_MAX = 2, +}; + +struct wwan_device { + unsigned int id; + struct device dev; + atomic_t port_id; + const struct wwan_ops *ops; + void *ops_ctxt; +}; + +struct xen_netif_tx_request { + grant_ref_t gref; + uint16_t offset; + uint16_t flags; + uint16_t id; + uint16_t size; +}; + +struct xen_netif_extra_info { + uint8_t type; + uint8_t flags; + union { + struct { + uint16_t size; + uint8_t type; + uint8_t pad; + uint16_t features; + } gso; + struct { + uint8_t addr[6]; + } mcast; + struct { + uint8_t type; + uint8_t algorithm; + uint8_t value[4]; + } hash; + struct { + uint16_t headroom; + uint16_t pad[2]; + } xdp; + uint16_t pad[3]; + } u; +}; + +struct xen_netif_tx_response { + uint16_t id; + int16_t status; +}; + +struct xen_netif_rx_request { + uint16_t id; + uint16_t pad; + grant_ref_t gref; +}; + +struct xen_netif_rx_response { + uint16_t id; + uint16_t offset; + uint16_t flags; + int16_t status; +}; + +union xen_netif_tx_sring_entry { + struct xen_netif_tx_request req; + struct xen_netif_tx_response rsp; +}; + +struct xen_netif_tx_sring { + RING_IDX req_prod; + RING_IDX req_event; + RING_IDX rsp_prod; + RING_IDX rsp_event; + uint8_t __pad[48]; + union xen_netif_tx_sring_entry ring[1]; +}; + +struct xen_netif_tx_front_ring { + RING_IDX req_prod_pvt; + RING_IDX rsp_cons; + unsigned int nr_ents; + struct xen_netif_tx_sring *sring; +}; + +union xen_netif_rx_sring_entry { + struct xen_netif_rx_request req; + struct xen_netif_rx_response rsp; +}; + +struct xen_netif_rx_sring { + RING_IDX req_prod; + RING_IDX req_event; + RING_IDX rsp_prod; + RING_IDX rsp_event; + uint8_t __pad[48]; + union xen_netif_rx_sring_entry ring[1]; +}; + +struct xen_netif_rx_front_ring { + RING_IDX req_prod_pvt; + RING_IDX rsp_cons; + unsigned int nr_ents; + struct xen_netif_rx_sring *sring; +}; + +struct netfront_cb { + int pull_to; +}; + +struct netfront_stats { + u64 packets; + u64 bytes; + struct u64_stats_sync syncp; +}; + +struct netfront_info; + +struct netfront_queue { + unsigned int id; + char name[22]; + struct netfront_info *info; + struct bpf_prog *xdp_prog; + struct napi_struct napi; + unsigned int tx_evtchn; + unsigned int rx_evtchn; + unsigned int tx_irq; + unsigned int rx_irq; + char tx_irq_name[25]; + char rx_irq_name[25]; + spinlock_t tx_lock; + struct xen_netif_tx_front_ring tx; + int tx_ring_ref; + struct sk_buff *tx_skbs[256]; + short unsigned int tx_link[256]; + grant_ref_t gref_tx_head; + grant_ref_t grant_tx_ref[256]; + struct page *grant_tx_page[256]; + unsigned int tx_skb_freelist; + unsigned int tx_pend_queue; + long: 64; + spinlock_t rx_lock; + struct xen_netif_rx_front_ring rx; + int rx_ring_ref; + struct timer_list rx_refill_timer; + struct sk_buff *rx_skbs[256]; + grant_ref_t gref_rx_head; + grant_ref_t grant_rx_ref[256]; + unsigned int rx_rsp_unconsumed; + spinlock_t rx_cons_lock; + struct page_pool *page_pool; + long: 64; + long: 64; + long: 64; + struct xdp_rxq_info xdp_rxq; +}; + +struct netfront_info { + struct list_head list; + struct net_device *netdev; + struct xenbus_device *xbdev; + struct netfront_queue *queues; + struct netfront_stats *rx_stats; + struct netfront_stats *tx_stats; + bool netback_has_xdp_headroom; + bool netfront_xdp_enabled; + bool broken; + atomic_t rx_gso_checksum_fixup; +}; + +struct netfront_rx_info { + struct xen_netif_rx_response rx; + struct xen_netif_extra_info extras[5]; +}; + +struct xennet_gnttab_make_txreq { + struct netfront_queue *queue; + struct sk_buff *skb; + struct page *page; + struct xen_netif_tx_request *tx; + struct xen_netif_tx_request tx_local; + unsigned int size; +}; + +struct xennet_stat { + char name[32]; + u16 offset; +}; + +struct cdrom_msf { + __u8 cdmsf_min0; + __u8 cdmsf_sec0; + __u8 cdmsf_frame0; + __u8 cdmsf_min1; + __u8 cdmsf_sec1; + __u8 cdmsf_frame1; +}; + +struct cdrom_volctrl { + __u8 channel0; + __u8 channel1; + __u8 channel2; + __u8 channel3; +}; + +struct cdrom_subchnl { + __u8 cdsc_format; + __u8 cdsc_audiostatus; + __u8 cdsc_adr: 4; + __u8 cdsc_ctrl: 4; + __u8 cdsc_trk; + __u8 cdsc_ind; + union cdrom_addr cdsc_absaddr; + union cdrom_addr cdsc_reladdr; +}; + +struct cdrom_read_audio { + union cdrom_addr addr; + __u8 addr_format; + int nframes; + __u8 *buf; +}; + +struct cdrom_blk { + unsigned int from; + short unsigned int len; +}; + +struct cdrom_timed_media_change_info { + __s64 last_media_change; + __u64 media_flags; +}; + +struct dvd_layer { + __u8 book_version: 4; + __u8 book_type: 4; + __u8 min_rate: 4; + __u8 disc_size: 4; + __u8 layer_type: 4; + __u8 track_path: 1; + __u8 nlayers: 2; + char: 1; + __u8 track_density: 4; + __u8 linear_density: 4; + __u8 bca: 1; + __u32 start_sector; + __u32 end_sector; + __u32 end_sector_l0; +}; + +struct dvd_physical { + __u8 type; + __u8 layer_num; + struct dvd_layer layer[4]; +}; + +struct dvd_copyright { + __u8 type; + __u8 layer_num; + __u8 cpst; + __u8 rmi; +}; + +struct dvd_disckey { + __u8 type; + unsigned int agid: 2; + __u8 value[2048]; +}; + +struct dvd_bca { + __u8 type; + int len; + __u8 value[188]; +}; + +struct dvd_manufact { + __u8 type; + __u8 layer_num; + int len; + __u8 value[2048]; +}; + +typedef union { + __u8 type; + struct dvd_physical physical; + struct dvd_copyright copyright; + struct dvd_disckey disckey; + struct dvd_bca bca; + struct dvd_manufact manufact; +} dvd_struct; + +typedef __u8 dvd_key[5]; + +typedef __u8 dvd_challenge[10]; + +struct dvd_lu_send_agid { + __u8 type; + unsigned int agid: 2; +}; + +struct dvd_host_send_challenge { + __u8 type; + unsigned int agid: 2; + dvd_challenge chal; +}; + +struct dvd_send_key { + __u8 type; + unsigned int agid: 2; + dvd_key key; +}; + +struct dvd_lu_send_challenge { + __u8 type; + unsigned int agid: 2; + dvd_challenge chal; +}; + +struct dvd_lu_send_title_key { + __u8 type; + unsigned int agid: 2; + dvd_key title_key; + int lba; + unsigned int cpm: 1; + unsigned int cp_sec: 1; + unsigned int cgms: 2; +}; + +struct dvd_lu_send_asf { + __u8 type; + unsigned int agid: 2; + unsigned int asf: 1; +}; + +struct dvd_host_send_rpcstate { + __u8 type; + __u8 pdrc; +}; + +struct dvd_lu_send_rpcstate { + __u8 type: 2; + __u8 vra: 3; + __u8 ucca: 3; + __u8 region_mask; + __u8 rpc_scheme; +}; + +typedef union { + __u8 type; + struct dvd_lu_send_agid lsa; + struct dvd_host_send_challenge hsc; + struct dvd_send_key lsk; + struct dvd_lu_send_challenge lsc; + struct dvd_send_key hsk; + struct dvd_lu_send_title_key lstk; + struct dvd_lu_send_asf lsasf; + struct dvd_host_send_rpcstate hrpcs; + struct dvd_lu_send_rpcstate lrpcs; +} dvd_authinfo; + +struct mrw_feature_desc { + __be16 feature_code; + __u8 curr: 1; + __u8 persistent: 1; + __u8 feature_version: 4; + __u8 reserved1: 2; + __u8 add_len; + __u8 write: 1; + __u8 reserved2: 7; + __u8 reserved3; + __u8 reserved4; + __u8 reserved5; +}; + +struct rwrt_feature_desc { + __be16 feature_code; + __u8 curr: 1; + __u8 persistent: 1; + __u8 feature_version: 4; + __u8 reserved1: 2; + __u8 add_len; + __u32 last_lba; + __u32 block_size; + __u16 blocking; + __u8 page_present: 1; + __u8 reserved2: 7; + __u8 reserved3; +}; + +typedef struct { + __be16 disc_information_length; + __u8 disc_status: 2; + __u8 border_status: 2; + __u8 erasable: 1; + __u8 reserved1: 3; + __u8 n_first_track; + __u8 n_sessions_lsb; + __u8 first_track_lsb; + __u8 last_track_lsb; + __u8 mrw_status: 2; + __u8 dbit: 1; + __u8 reserved2: 2; + __u8 uru: 1; + __u8 dbc_v: 1; + __u8 did_v: 1; + __u8 disc_type; + __u8 n_sessions_msb; + __u8 first_track_msb; + __u8 last_track_msb; + __u32 disc_id; + __u32 lead_in; + __u32 lead_out; + __u8 disc_bar_code[8]; + __u8 reserved3; + __u8 n_opc; +} disc_information; + +typedef struct { + __be16 track_information_length; + __u8 track_lsb; + __u8 session_lsb; + __u8 reserved1; + __u8 track_mode: 4; + __u8 copy: 1; + __u8 damage: 1; + __u8 reserved2: 2; + __u8 data_mode: 4; + __u8 fp: 1; + __u8 packet: 1; + __u8 blank: 1; + __u8 rt: 1; + __u8 nwa_v: 1; + __u8 lra_v: 1; + __u8 reserved3: 6; + __be32 track_start; + __be32 next_writable; + __be32 free_blocks; + __be32 fixed_packet_size; + __be32 track_size; + __be32 last_rec_address; +} track_information; + +struct mode_page_header { + __be16 mode_data_length; + __u8 medium_type; + __u8 reserved1; + __u8 reserved2; + __u8 reserved3; + __be16 desc_length; +}; + +typedef struct { + int data; + int audio; + int cdi; + int xa; + long int error; +} tracktype; + +struct cdrom_mechstat_header { + __u8 curslot: 5; + __u8 changer_state: 2; + __u8 fault: 1; + __u8 reserved1: 4; + __u8 door_open: 1; + __u8 mech_state: 3; + __u8 curlba[3]; + __u8 nslots; + __u16 slot_tablelen; +}; + +struct cdrom_slot { + __u8 change: 1; + __u8 reserved1: 6; + __u8 disc_present: 1; + __u8 reserved2[3]; +}; + +struct cdrom_changer_info { + struct cdrom_mechstat_header hdr; + struct cdrom_slot slots[256]; +}; + +struct modesel_head { + __u8 reserved1; + __u8 medium; + __u8 reserved2; + __u8 block_desc_length; + __u8 density; + __u8 number_of_blocks_hi; + __u8 number_of_blocks_med; + __u8 number_of_blocks_lo; + __u8 reserved3; + __u8 block_length_hi; + __u8 block_length_med; + __u8 block_length_lo; +}; + +typedef struct { + __u16 report_key_length; + __u8 reserved1; + __u8 reserved2; + __u8 ucca: 3; + __u8 vra: 3; + __u8 type_code: 2; + __u8 region_mask; + __u8 rpc_scheme; + __u8 reserved3; +} rpc_state_t; + +struct cdrom_sysctl_settings { + char info[1000]; + int autoclose; + int autoeject; + int debug; + int lock; + int check; +}; + +enum cdrom_print_option { + CTL_NAME = 0, + CTL_SPEED = 1, + CTL_SLOTS = 2, + CTL_CAPABILITY = 3, +}; + +struct compat_cdrom_read_audio { + union cdrom_addr addr; + u8 addr_format; + compat_int_t nframes; + compat_caddr_t buf; +}; + +enum usb_otg_state { + OTG_STATE_UNDEFINED = 0, + OTG_STATE_B_IDLE = 1, + OTG_STATE_B_SRP_INIT = 2, + OTG_STATE_B_PERIPHERAL = 3, + OTG_STATE_B_WAIT_ACON = 4, + OTG_STATE_B_HOST = 5, + OTG_STATE_A_IDLE = 6, + OTG_STATE_A_WAIT_VRISE = 7, + OTG_STATE_A_WAIT_BCON = 8, + OTG_STATE_A_HOST = 9, + OTG_STATE_A_SUSPEND = 10, + OTG_STATE_A_PERIPHERAL = 11, + OTG_STATE_A_WAIT_VFALL = 12, + OTG_STATE_A_VBUS_ERR = 13, +}; + +struct usb_otg_caps { + u16 otg_rev; + bool hnp_support; + bool srp_support; + bool adp_support; +}; + +enum usb_dr_mode { + USB_DR_MODE_UNKNOWN = 0, + USB_DR_MODE_HOST = 1, + USB_DR_MODE_PERIPHERAL = 2, + USB_DR_MODE_OTG = 3, +}; + +enum usb_led_event { + USB_LED_EVENT_HOST = 0, + USB_LED_EVENT_GADGET = 1, +}; + +struct usb_device_id { + __u16 match_flags; + __u16 idVendor; + __u16 idProduct; + __u16 bcdDevice_lo; + __u16 bcdDevice_hi; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bInterfaceClass; + __u8 bInterfaceSubClass; + __u8 bInterfaceProtocol; + __u8 bInterfaceNumber; + kernel_ulong_t driver_info; +}; + +struct usb_descriptor_header { + __u8 bLength; + __u8 bDescriptorType; +}; + +enum usb_port_connect_type { + USB_PORT_CONNECT_TYPE_UNKNOWN = 0, + USB_PORT_CONNECT_TYPE_HOT_PLUG = 1, + USB_PORT_CONNECT_TYPE_HARD_WIRED = 2, + USB_PORT_NOT_USED = 3, +}; + +struct usb_dynids { + spinlock_t lock; + struct list_head list; +}; + +struct usbdrv_wrap { + struct device_driver driver; + int for_devices; +}; + +struct usb_driver { + const char *name; + int (*probe)(struct usb_interface *, const struct usb_device_id *); + void (*disconnect)(struct usb_interface *); + int (*unlocked_ioctl)(struct usb_interface *, unsigned int, void *); + int (*suspend)(struct usb_interface *, pm_message_t); + int (*resume)(struct usb_interface *); + int (*reset_resume)(struct usb_interface *); + int (*pre_reset)(struct usb_interface *); + int (*post_reset)(struct usb_interface *); + const struct usb_device_id *id_table; + const struct attribute_group **dev_groups; + struct usb_dynids dynids; + struct usbdrv_wrap drvwrap; + unsigned int no_dynamic_id: 1; + unsigned int supports_autosuspend: 1; + unsigned int disable_hub_initiated_lpm: 1; + unsigned int soft_unbind: 1; +}; + +struct usb_device_driver { + const char *name; + bool (*match)(struct usb_device *); + int (*probe)(struct usb_device *); + void (*disconnect)(struct usb_device *); + int (*suspend)(struct usb_device *, pm_message_t); + int (*resume)(struct usb_device *, pm_message_t); + const struct attribute_group **dev_groups; + struct usbdrv_wrap drvwrap; + const struct usb_device_id *id_table; + unsigned int supports_autosuspend: 1; + unsigned int generic_subclass: 1; +}; + +enum usb_phy_type { + USB_PHY_TYPE_UNDEFINED = 0, + USB_PHY_TYPE_USB2 = 1, + USB_PHY_TYPE_USB3 = 2, +}; + +enum usb_phy_events { + USB_EVENT_NONE = 0, + USB_EVENT_VBUS = 1, + USB_EVENT_ID = 2, + USB_EVENT_CHARGER = 3, + USB_EVENT_ENUMERATED = 4, +}; + +enum usb_charger_type { + UNKNOWN_TYPE = 0, + SDP_TYPE = 1, + DCP_TYPE = 2, + CDP_TYPE = 3, + ACA_TYPE = 4, +}; + +enum usb_charger_state { + USB_CHARGER_DEFAULT = 0, + USB_CHARGER_PRESENT = 1, + USB_CHARGER_ABSENT = 2, +}; + +struct usb_charger_current { + unsigned int sdp_min; + unsigned int sdp_max; + unsigned int dcp_min; + unsigned int dcp_max; + unsigned int cdp_min; + unsigned int cdp_max; + unsigned int aca_min; + unsigned int aca_max; +}; + +struct usb_otg; + +struct usb_phy_io_ops; + +struct usb_phy { + struct device *dev; + const char *label; + unsigned int flags; + enum usb_phy_type type; + enum usb_phy_events last_event; + struct usb_otg *otg; + struct device *io_dev; + struct usb_phy_io_ops *io_ops; + void *io_priv; + struct extcon_dev *edev; + struct extcon_dev *id_edev; + struct notifier_block vbus_nb; + struct notifier_block id_nb; + struct notifier_block type_nb; + enum usb_charger_type chg_type; + enum usb_charger_state chg_state; + struct usb_charger_current chg_cur; + struct work_struct chg_work; + struct atomic_notifier_head notifier; + u16 port_status; + u16 port_change; + struct list_head head; + int (*init)(struct usb_phy *); + void (*shutdown)(struct usb_phy *); + int (*set_vbus)(struct usb_phy *, int); + int (*set_power)(struct usb_phy *, unsigned int); + int (*set_suspend)(struct usb_phy *, int); + int (*set_wakeup)(struct usb_phy *, bool); + int (*notify_connect)(struct usb_phy *, enum usb_device_speed); + int (*notify_disconnect)(struct usb_phy *, enum usb_device_speed); + enum usb_charger_type (*charger_detect)(struct usb_phy *); +}; + +struct usb_port_status { + __le16 wPortStatus; + __le16 wPortChange; + __le32 dwExtPortStatus; +}; + +struct usb_hub_status { + __le16 wHubStatus; + __le16 wHubChange; +}; + +struct usb_hub_descriptor { + __u8 bDescLength; + __u8 bDescriptorType; + __u8 bNbrPorts; + __le16 wHubCharacteristics; + __u8 bPwrOn2PwrGood; + __u8 bHubContrCurrent; + union { + struct { + __u8 DeviceRemovable[4]; + __u8 PortPwrCtrlMask[4]; + } hs; + struct { + __u8 bHubHdrDecLat; + __le16 wHubDelay; + __le16 DeviceRemovable; + } __attribute__((packed)) ss; + } u; +} __attribute__((packed)); + +struct usb_phy_io_ops { + int (*read)(struct usb_phy *, u32); + int (*write)(struct usb_phy *, u32, u32); +}; + +struct usb_gadget; + +struct usb_otg { + u8 default_a; + struct phy *phy; + struct usb_phy *usb_phy; + struct usb_bus *host; + struct usb_gadget *gadget; + enum usb_otg_state state; + int (*set_host)(struct usb_otg *, struct usb_bus *); + int (*set_peripheral)(struct usb_otg *, struct usb_gadget *); + int (*set_vbus)(struct usb_otg *, bool); + int (*start_srp)(struct usb_otg *); + int (*start_hnp)(struct usb_otg *); +}; + +typedef u32 usb_port_location_t; + +struct usb_port; + +struct usb_hub { + struct device *intfdev; + struct usb_device *hdev; + struct kref kref; + struct urb *urb; + u8 (*buffer)[8]; + union { + struct usb_hub_status hub; + struct usb_port_status port; + } *status; + struct mutex status_mutex; + int error; + int nerrors; + long unsigned int event_bits[1]; + long unsigned int change_bits[1]; + long unsigned int removed_bits[1]; + long unsigned int wakeup_bits[1]; + long unsigned int power_bits[1]; + long unsigned int child_usage_bits[1]; + long unsigned int warm_reset_bits[1]; + struct usb_hub_descriptor *descriptor; + struct usb_tt tt; + unsigned int mA_per_port; + unsigned int wakeup_enabled_descendants; + unsigned int limited_power: 1; + unsigned int quiescing: 1; + unsigned int disconnected: 1; + unsigned int in_reset: 1; + unsigned int quirk_disable_autosuspend: 1; + unsigned int quirk_check_port_auto_suspend: 1; + unsigned int has_indicators: 1; + u8 indicator[31]; + struct delayed_work leds; + struct delayed_work init_work; + struct work_struct events; + spinlock_t irq_urb_lock; + struct timer_list irq_urb_retry; + struct usb_port **ports; +}; + +struct usb_dev_state; + +struct usb_port { + struct usb_device *child; + struct device dev; + struct usb_dev_state *port_owner; + struct usb_port *peer; + struct dev_pm_qos_request *req; + enum usb_port_connect_type connect_type; + usb_port_location_t location; + struct mutex status_lock; + u32 over_current_count; + u8 portnum; + u32 quirks; + unsigned int is_superspeed: 1; + unsigned int usb3_lpm_u1_permit: 1; + unsigned int usb3_lpm_u2_permit: 1; +}; + +struct find_interface_arg { + int minor; + struct device_driver *drv; +}; + +struct each_dev_arg { + void *data; + int (*fn)(struct usb_device *, void *); +}; + +struct each_hub_arg { + void *data; + int (*fn)(struct device *, void *); +}; + +struct usb_qualifier_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 bcdUSB; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bMaxPacketSize0; + __u8 bNumConfigurations; + __u8 bRESERVED; +}; + +struct usb_set_sel_req { + __u8 u1_sel; + __u8 u1_pel; + __le16 u2_sel; + __le16 u2_pel; +}; + +struct usbdevfs_hub_portinfo { + char nports; + char port[127]; +}; + +enum hub_led_mode { + INDICATOR_AUTO = 0, + INDICATOR_CYCLE = 1, + INDICATOR_GREEN_BLINK = 2, + INDICATOR_GREEN_BLINK_OFF = 3, + INDICATOR_AMBER_BLINK = 4, + INDICATOR_AMBER_BLINK_OFF = 5, + INDICATOR_ALT_BLINK = 6, + INDICATOR_ALT_BLINK_OFF = 7, +}; + +struct usb_tt_clear { + struct list_head clear_list; + unsigned int tt; + u16 devinfo; + struct usb_hcd *hcd; + struct usb_host_endpoint *ep; +}; + +enum hub_activation_type { + HUB_INIT = 0, + HUB_INIT2 = 1, + HUB_INIT3 = 2, + HUB_POST_RESET = 3, + HUB_RESUME = 4, + HUB_RESET_RESUME = 5, +}; + +enum hub_quiescing_type { + HUB_DISCONNECT = 0, + HUB_PRE_RESET = 1, + HUB_SUSPEND = 2, +}; + +struct usb_ctrlrequest { + __u8 bRequestType; + __u8 bRequest; + __le16 wValue; + __le16 wIndex; + __le16 wLength; +}; + +struct usb_mon_operations { + void (*urb_submit)(struct usb_bus *, struct urb *); + void (*urb_submit_error)(struct usb_bus *, struct urb *, int); + void (*urb_complete)(struct usb_bus *, struct urb *, int); +}; + +struct usb_sg_request { + int status; + size_t bytes; + spinlock_t lock; + struct usb_device *dev; + int pipe; + int entries; + struct urb **urbs; + int count; + struct completion complete; +}; + +struct usb_cdc_header_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdCDC; +} __attribute__((packed)); + +struct usb_cdc_call_mgmt_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bmCapabilities; + __u8 bDataInterface; +}; + +struct usb_cdc_acm_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bmCapabilities; +}; + +struct usb_cdc_union_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bMasterInterface0; + __u8 bSlaveInterface0; +}; + +struct usb_cdc_country_functional_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 iCountryCodeRelDate; + __le16 wCountyCode0; +}; + +struct usb_cdc_network_terminal_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bEntityId; + __u8 iName; + __u8 bChannelIndex; + __u8 bPhysicalInterface; +}; + +struct usb_cdc_ether_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 iMACAddress; + __le32 bmEthernetStatistics; + __le16 wMaxSegmentSize; + __le16 wNumberMCFilters; + __u8 bNumberPowerFilters; +} __attribute__((packed)); + +struct usb_cdc_dmm_desc { + __u8 bFunctionLength; + __u8 bDescriptorType; + __u8 bDescriptorSubtype; + __u16 bcdVersion; + __le16 wMaxCommand; +} __attribute__((packed)); + +struct usb_cdc_mdlm_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdVersion; + __u8 bGUID[16]; +} __attribute__((packed)); + +struct usb_cdc_mdlm_detail_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bGuidDescriptorType; + __u8 bDetailData[0]; +}; + +struct usb_cdc_obex_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdVersion; +} __attribute__((packed)); + +struct usb_cdc_ncm_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdNcmVersion; + __u8 bmNetworkCapabilities; +} __attribute__((packed)); + +struct usb_cdc_mbim_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdMBIMVersion; + __le16 wMaxControlMessage; + __u8 bNumberFilters; + __u8 bMaxFilterSize; + __le16 wMaxSegmentSize; + __u8 bmNetworkCapabilities; +} __attribute__((packed)); + +struct usb_cdc_mbim_extended_desc { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __le16 bcdMBIMExtendedVersion; + __u8 bMaxOutstandingCommandMessages; + __le16 wMTU; +} __attribute__((packed)); + +struct usb_cdc_parsed_header { + struct usb_cdc_union_desc *usb_cdc_union_desc; + struct usb_cdc_header_desc *usb_cdc_header_desc; + struct usb_cdc_call_mgmt_descriptor *usb_cdc_call_mgmt_descriptor; + struct usb_cdc_acm_descriptor *usb_cdc_acm_descriptor; + struct usb_cdc_country_functional_desc *usb_cdc_country_functional_desc; + struct usb_cdc_network_terminal_desc *usb_cdc_network_terminal_desc; + struct usb_cdc_ether_desc *usb_cdc_ether_desc; + struct usb_cdc_dmm_desc *usb_cdc_dmm_desc; + struct usb_cdc_mdlm_desc *usb_cdc_mdlm_desc; + struct usb_cdc_mdlm_detail_desc *usb_cdc_mdlm_detail_desc; + struct usb_cdc_obex_desc *usb_cdc_obex_desc; + struct usb_cdc_ncm_desc *usb_cdc_ncm_desc; + struct usb_cdc_mbim_desc *usb_cdc_mbim_desc; + struct usb_cdc_mbim_extended_desc *usb_cdc_mbim_extended_desc; + bool phonet_magic_present; +}; + +struct api_context { + struct completion done; + int status; +}; + +struct set_config_request { + struct usb_device *udev; + int config; + struct work_struct work; + struct list_head node; +}; + +struct usb_dynid { + struct list_head node; + struct usb_device_id id; +}; + +struct usb_dev_cap_header { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDevCapabilityType; +}; + +struct usb_class_driver { + char *name; + char * (*devnode)(struct device *, umode_t *); + const struct file_operations *fops; + int minor_base; +}; + +struct usb_class { + struct kref kref; + struct class *class; +}; + +struct ep_device { + struct usb_endpoint_descriptor *desc; + struct usb_device *udev; + struct device dev; +}; + +struct usbdevfs_ctrltransfer { + __u8 bRequestType; + __u8 bRequest; + __u16 wValue; + __u16 wIndex; + __u16 wLength; + __u32 timeout; + void *data; +}; + +struct usbdevfs_bulktransfer { + unsigned int ep; + unsigned int len; + unsigned int timeout; + void *data; +}; + +struct usbdevfs_setinterface { + unsigned int interface; + unsigned int altsetting; +}; + +struct usbdevfs_disconnectsignal { + unsigned int signr; + void *context; +}; + +struct usbdevfs_getdriver { + unsigned int interface; + char driver[256]; +}; + +struct usbdevfs_connectinfo { + unsigned int devnum; + unsigned char slow; +}; + +struct usbdevfs_conninfo_ex { + __u32 size; + __u32 busnum; + __u32 devnum; + __u32 speed; + __u8 num_ports; + __u8 ports[7]; +}; + +struct usbdevfs_iso_packet_desc { + unsigned int length; + unsigned int actual_length; + unsigned int status; +}; + +struct usbdevfs_urb { + unsigned char type; + unsigned char endpoint; + int status; + unsigned int flags; + void *buffer; + int buffer_length; + int actual_length; + int start_frame; + union { + int number_of_packets; + unsigned int stream_id; + }; + int error_count; + unsigned int signr; + void *usercontext; + struct usbdevfs_iso_packet_desc iso_frame_desc[0]; +}; + +struct usbdevfs_ioctl { + int ifno; + int ioctl_code; + void *data; +}; + +struct usbdevfs_disconnect_claim { + unsigned int interface; + unsigned int flags; + char driver[256]; +}; + +struct usbdevfs_streams { + unsigned int num_streams; + unsigned int num_eps; + unsigned char eps[0]; +}; + +struct usbdevfs_ctrltransfer32 { + u8 bRequestType; + u8 bRequest; + u16 wValue; + u16 wIndex; + u16 wLength; + u32 timeout; + compat_caddr_t data; +}; + +struct usbdevfs_bulktransfer32 { + compat_uint_t ep; + compat_uint_t len; + compat_uint_t timeout; + compat_caddr_t data; +}; + +struct usbdevfs_disconnectsignal32 { + compat_int_t signr; + compat_caddr_t context; +}; + +struct usbdevfs_urb32 { + unsigned char type; + unsigned char endpoint; + compat_int_t status; + compat_uint_t flags; + compat_caddr_t buffer; + compat_int_t buffer_length; + compat_int_t actual_length; + compat_int_t start_frame; + compat_int_t number_of_packets; + compat_int_t error_count; + compat_uint_t signr; + compat_caddr_t usercontext; + struct usbdevfs_iso_packet_desc iso_frame_desc[0]; +}; + +struct usbdevfs_ioctl32 { + s32 ifno; + s32 ioctl_code; + compat_caddr_t data; +}; + +struct usb_dev_state___2 { + struct list_head list; + struct usb_device *dev; + struct file *file; + spinlock_t lock; + struct list_head async_pending; + struct list_head async_completed; + struct list_head memory_list; + wait_queue_head_t wait; + wait_queue_head_t wait_for_resume; + unsigned int discsignr; + struct pid *disc_pid; + const struct cred *cred; + sigval_t disccontext; + long unsigned int ifclaimed; + u32 disabled_bulk_eps; + long unsigned int interface_allowed_mask; + int not_yet_resumed; + bool suspend_allowed; + bool privileges_dropped; +}; + +struct usb_memory { + struct list_head memlist; + int vma_use_count; + int urb_use_count; + u32 size; + void *mem; + dma_addr_t dma_handle; + long unsigned int vm_start; + struct usb_dev_state___2 *ps; +}; + +struct async { + struct list_head asynclist; + struct usb_dev_state___2 *ps; + struct pid *pid; + const struct cred *cred; + unsigned int signr; + unsigned int ifnum; + void *userbuffer; + void *userurb; + sigval_t userurb_sigval; + struct urb *urb; + struct usb_memory *usbm; + unsigned int mem_usage; + int status; + u8 bulk_addr; + u8 bulk_status; +}; + +enum snoop_when { + SUBMIT = 0, + COMPLETE = 1, +}; + +struct quirk_entry { + u16 vid; + u16 pid; + u32 flags; +}; + +struct class_info { + int class; + char *class_name; +}; + +struct usb_phy_roothub___2 { + struct phy *phy; + struct list_head list; +}; + +typedef void (*companion_fn)(struct pci_dev *, struct usb_hcd *, struct pci_dev *, struct usb_hcd *); + +struct phy_devm { + struct usb_phy *phy; + struct notifier_block *nb; +}; + +enum usb_phy_interface { + USBPHY_INTERFACE_MODE_UNKNOWN = 0, + USBPHY_INTERFACE_MODE_UTMI = 1, + USBPHY_INTERFACE_MODE_UTMIW = 2, + USBPHY_INTERFACE_MODE_ULPI = 3, + USBPHY_INTERFACE_MODE_SERIAL = 4, + USBPHY_INTERFACE_MODE_HSIC = 5, +}; + +struct mxs_phy_data { + unsigned int flags; +}; + +struct mxs_phy { + struct usb_phy phy; + struct clk *clk; + const struct mxs_phy_data *data; + struct regmap *regmap_anatop; + int port_id; + u32 tx_reg_set; + u32 tx_reg_mask; +}; + +struct ulpi_info { + unsigned int id; + char *name; +}; + +struct usb_ep; + +struct usb_request { + void *buf; + unsigned int length; + dma_addr_t dma; + struct scatterlist *sg; + unsigned int num_sgs; + unsigned int num_mapped_sgs; + unsigned int stream_id: 16; + unsigned int is_last: 1; + unsigned int no_interrupt: 1; + unsigned int zero: 1; + unsigned int short_not_ok: 1; + unsigned int dma_mapped: 1; + void (*complete)(struct usb_ep *, struct usb_request *); + void *context; + struct list_head list; + unsigned int frame_number; + int status; + unsigned int actual; +}; + +struct usb_ep_caps { + unsigned int type_control: 1; + unsigned int type_iso: 1; + unsigned int type_bulk: 1; + unsigned int type_int: 1; + unsigned int dir_in: 1; + unsigned int dir_out: 1; +}; + +struct usb_ep_ops; + +struct usb_ep { + void *driver_data; + const char *name; + const struct usb_ep_ops *ops; + struct list_head ep_list; + struct usb_ep_caps caps; + bool claimed; + bool enabled; + unsigned int maxpacket: 16; + unsigned int maxpacket_limit: 16; + unsigned int max_streams: 16; + unsigned int mult: 2; + unsigned int maxburst: 5; + u8 address; + const struct usb_endpoint_descriptor *desc; + const struct usb_ss_ep_comp_descriptor *comp_desc; +}; + +struct usb_ep_ops { + int (*enable)(struct usb_ep *, const struct usb_endpoint_descriptor *); + int (*disable)(struct usb_ep *); + void (*dispose)(struct usb_ep *); + struct usb_request * (*alloc_request)(struct usb_ep *, gfp_t); + void (*free_request)(struct usb_ep *, struct usb_request *); + int (*queue)(struct usb_ep *, struct usb_request *, gfp_t); + int (*dequeue)(struct usb_ep *, struct usb_request *); + int (*set_halt)(struct usb_ep *, int); + int (*set_wedge)(struct usb_ep *); + int (*fifo_status)(struct usb_ep *); + void (*fifo_flush)(struct usb_ep *); +}; + +struct usb_dcd_config_params { + __u8 bU1devExitLat; + __le16 bU2DevExitLat; + __u8 besl_baseline; + __u8 besl_deep; +}; + +struct usb_gadget_driver; + +struct usb_gadget_ops { + int (*get_frame)(struct usb_gadget *); + int (*wakeup)(struct usb_gadget *); + int (*set_selfpowered)(struct usb_gadget *, int); + int (*vbus_session)(struct usb_gadget *, int); + int (*vbus_draw)(struct usb_gadget *, unsigned int); + int (*pullup)(struct usb_gadget *, int); + int (*ioctl)(struct usb_gadget *, unsigned int, long unsigned int); + void (*get_config_params)(struct usb_gadget *, struct usb_dcd_config_params *); + int (*udc_start)(struct usb_gadget *, struct usb_gadget_driver *); + int (*udc_stop)(struct usb_gadget *); + void (*udc_set_speed)(struct usb_gadget *, enum usb_device_speed); + void (*udc_set_ssp_rate)(struct usb_gadget *, enum usb_ssp_rate); + void (*udc_async_callbacks)(struct usb_gadget *, bool); + struct usb_ep * (*match_ep)(struct usb_gadget *, struct usb_endpoint_descriptor *, struct usb_ss_ep_comp_descriptor *); + int (*check_config)(struct usb_gadget *); +}; + +struct usb_udc; + +struct usb_gadget { + struct work_struct work; + struct usb_udc *udc; + const struct usb_gadget_ops *ops; + struct usb_ep *ep0; + struct list_head ep_list; + enum usb_device_speed speed; + enum usb_device_speed max_speed; + enum usb_ssp_rate ssp_rate; + enum usb_ssp_rate max_ssp_rate; + enum usb_device_state state; + const char *name; + struct device dev; + unsigned int isoch_delay; + unsigned int out_epnum; + unsigned int in_epnum; + unsigned int mA; + struct usb_otg_caps *otg_caps; + unsigned int sg_supported: 1; + unsigned int is_otg: 1; + unsigned int is_a_peripheral: 1; + unsigned int b_hnp_enable: 1; + unsigned int a_hnp_support: 1; + unsigned int a_alt_hnp_support: 1; + unsigned int hnp_polling_support: 1; + unsigned int host_request_flag: 1; + unsigned int quirk_ep_out_aligned_size: 1; + unsigned int quirk_altset_not_supp: 1; + unsigned int quirk_stall_not_supp: 1; + unsigned int quirk_zlp_not_supp: 1; + unsigned int quirk_avoids_skb_reserve: 1; + unsigned int is_selfpowered: 1; + unsigned int deactivated: 1; + unsigned int connected: 1; + unsigned int lpm_capable: 1; + int irq; +}; + +struct usb_gadget_driver { + char *function; + enum usb_device_speed max_speed; + int (*bind)(struct usb_gadget *, struct usb_gadget_driver *); + void (*unbind)(struct usb_gadget *); + int (*setup)(struct usb_gadget *, const struct usb_ctrlrequest *); + void (*disconnect)(struct usb_gadget *); + void (*suspend)(struct usb_gadget *); + void (*resume)(struct usb_gadget *); + void (*reset)(struct usb_gadget *); + struct device_driver driver; + char *udc_name; + struct list_head pending; + unsigned int match_existing_only: 1; +}; + +struct dwc2_dma_desc { + u32 status; + u32 buf; +}; + +struct dwc2_hw_params { + unsigned int op_mode: 3; + unsigned int arch: 2; + unsigned int dma_desc_enable: 1; + unsigned int enable_dynamic_fifo: 1; + unsigned int en_multiple_tx_fifo: 1; + unsigned int rx_fifo_size: 16; + char: 8; + unsigned int host_nperio_tx_fifo_size: 16; + unsigned int dev_nperio_tx_fifo_size: 16; + unsigned int host_perio_tx_fifo_size: 16; + unsigned int nperio_tx_q_depth: 3; + unsigned int host_perio_tx_q_depth: 3; + unsigned int dev_token_q_depth: 5; + char: 5; + unsigned int max_transfer_size: 26; + char: 6; + unsigned int max_packet_count: 11; + unsigned int host_channels: 5; + unsigned int hs_phy_type: 2; + unsigned int fs_phy_type: 2; + unsigned int i2c_enable: 1; + unsigned int acg_enable: 1; + unsigned int num_dev_ep: 4; + unsigned int num_dev_in_eps: 4; + char: 2; + unsigned int num_dev_perio_in_ep: 4; + unsigned int total_fifo_size: 16; + unsigned int power_optimized: 1; + unsigned int hibernation: 1; + unsigned int utmi_phy_data_width: 2; + unsigned int lpm_mode: 1; + unsigned int ipg_isoc_en: 1; + unsigned int service_interval_mode: 1; + u32 snpsid; + u32 dev_ep_dirs; + u32 g_tx_fifo_size[16]; +}; + +struct dwc2_core_params { + struct usb_otg_caps otg_caps; + u8 phy_type; + u8 speed; + u8 phy_utmi_width; + bool phy_ulpi_ddr; + bool phy_ulpi_ext_vbus; + bool enable_dynamic_fifo; + bool en_multiple_tx_fifo; + bool i2c_enable; + bool acg_enable; + bool ulpi_fs_ls; + bool ts_dline; + bool reload_ctl; + bool uframe_sched; + bool external_id_pin_ctl; + int power_down; + bool no_clock_gating; + bool lpm; + bool lpm_clock_gating; + bool besl; + bool hird_threshold_en; + bool service_interval; + u8 hird_threshold; + bool activate_stm_fs_transceiver; + bool activate_stm_id_vb_detection; + bool ipg_isoc_en; + u16 max_packet_count; + u32 max_transfer_size; + u32 ahbcfg; + u32 ref_clk_per; + u16 sof_cnt_wkup_alert; + bool host_dma; + bool dma_desc_enable; + bool dma_desc_fs_enable; + bool host_support_fs_ls_low_power; + bool host_ls_low_power_phy_clk; + bool oc_disable; + u8 host_channels; + u16 host_rx_fifo_size; + u16 host_nperio_tx_fifo_size; + u16 host_perio_tx_fifo_size; + bool g_dma; + bool g_dma_desc; + u32 g_rx_fifo_size; + u32 g_np_tx_fifo_size; + u32 g_tx_fifo_size[16]; + bool change_speed_quirk; +}; + +enum dwc2_lx_state { + DWC2_L0 = 0, + DWC2_L1 = 1, + DWC2_L2 = 2, + DWC2_L3 = 3, +}; + +struct dwc2_gregs_backup { + u32 gotgctl; + u32 gintmsk; + u32 gahbcfg; + u32 gusbcfg; + u32 grxfsiz; + u32 gnptxfsiz; + u32 gi2cctl; + u32 glpmcfg; + u32 pcgcctl; + u32 pcgcctl1; + u32 gdfifocfg; + u32 gpwrdn; + bool valid; +}; + +struct dwc2_dregs_backup { + u32 dcfg; + u32 dctl; + u32 daintmsk; + u32 diepmsk; + u32 doepmsk; + u32 diepctl[16]; + u32 dieptsiz[16]; + u32 diepdma[16]; + u32 doepctl[16]; + u32 doeptsiz[16]; + u32 doepdma[16]; + u32 dtxfsiz[16]; + bool valid; +}; + +struct dwc2_hregs_backup { + u32 hcfg; + u32 haintmsk; + u32 hcintmsk[16]; + u32 hprt0; + u32 hfir; + u32 hptxfsiz; + bool valid; +}; + +union dwc2_hcd_internal_flags { + u32 d32; + struct { + unsigned int port_connect_status_change: 1; + unsigned int port_connect_status: 1; + unsigned int port_reset_change: 1; + unsigned int port_enable_change: 1; + unsigned int port_suspend_change: 1; + unsigned int port_over_current_change: 1; + unsigned int port_l1_change: 1; + unsigned int reserved: 25; + } b; +}; + +struct usb_role_switch; + +struct dwc2_hsotg_plat; + +struct dwc2_host_chan; + +struct dwc2_hsotg { + struct device *dev; + void *regs; + struct dwc2_hw_params hw_params; + struct dwc2_core_params params; + enum usb_otg_state op_state; + enum usb_dr_mode dr_mode; + struct usb_role_switch *role_sw; + unsigned int hcd_enabled: 1; + unsigned int gadget_enabled: 1; + unsigned int ll_hw_enabled: 1; + unsigned int hibernated: 1; + unsigned int in_ppd: 1; + bool bus_suspended; + unsigned int reset_phy_on_wake: 1; + unsigned int need_phy_for_wake: 1; + unsigned int phy_off_for_suspend: 1; + u16 frame_number; + struct phy *phy; + struct usb_phy *uphy; + struct dwc2_hsotg_plat *plat; + struct regulator_bulk_data supplies[2]; + struct regulator *vbus_supply; + struct regulator *usb33d; + spinlock_t lock; + void *priv; + int irq; + struct clk *clk; + struct reset_control *reset; + struct reset_control *reset_ecc; + unsigned int queuing_high_bandwidth: 1; + unsigned int srp_success: 1; + struct workqueue_struct *wq_otg; + struct work_struct wf_otg; + struct timer_list wkp_timer; + enum dwc2_lx_state lx_state; + struct dwc2_gregs_backup gr_backup; + struct dwc2_dregs_backup dr_backup; + struct dwc2_hregs_backup hr_backup; + struct dentry *debug_root; + struct debugfs_regset32 *regset; + bool needs_byte_swap; + union dwc2_hcd_internal_flags flags; + struct list_head non_periodic_sched_inactive; + struct list_head non_periodic_sched_waiting; + struct list_head non_periodic_sched_active; + struct list_head *non_periodic_qh_ptr; + struct list_head periodic_sched_inactive; + struct list_head periodic_sched_ready; + struct list_head periodic_sched_assigned; + struct list_head periodic_sched_queued; + struct list_head split_order; + u16 periodic_usecs; + long unsigned int hs_periodic_bitmap[13]; + u16 periodic_qh_count; + bool new_connection; + u16 last_frame_num; + struct list_head free_hc_list; + int periodic_channels; + int non_periodic_channels; + int available_host_channels; + struct dwc2_host_chan *hc_ptr_array[16]; + u8 *status_buf; + dma_addr_t status_buf_dma; + struct delayed_work start_work; + struct delayed_work reset_work; + struct work_struct phy_reset_work; + u8 otg_port; + u32 *frame_list; + dma_addr_t frame_list_dma; + u32 frame_list_sz; + struct kmem_cache *desc_gen_cache; + struct kmem_cache *desc_hsisoc_cache; + struct kmem_cache *unaligned_cache; +}; + +enum dwc2_halt_status { + DWC2_HC_XFER_NO_HALT_STATUS = 0, + DWC2_HC_XFER_COMPLETE = 1, + DWC2_HC_XFER_URB_COMPLETE = 2, + DWC2_HC_XFER_ACK = 3, + DWC2_HC_XFER_NAK = 4, + DWC2_HC_XFER_NYET = 5, + DWC2_HC_XFER_STALL = 6, + DWC2_HC_XFER_XACT_ERR = 7, + DWC2_HC_XFER_FRAME_OVERRUN = 8, + DWC2_HC_XFER_BABBLE_ERR = 9, + DWC2_HC_XFER_DATA_TOGGLE_ERR = 10, + DWC2_HC_XFER_AHB_ERR = 11, + DWC2_HC_XFER_PERIODIC_INCOMPLETE = 12, + DWC2_HC_XFER_URB_DEQUEUE = 13, +}; + +struct dwc2_qh; + +struct dwc2_host_chan { + u8 hc_num; + unsigned int dev_addr: 7; + unsigned int ep_num: 4; + unsigned int ep_is_in: 1; + unsigned int speed: 4; + unsigned int ep_type: 2; + char: 6; + unsigned int max_packet: 11; + unsigned int data_pid_start: 2; + unsigned int multi_count: 2; + u8 *xfer_buf; + dma_addr_t xfer_dma; + dma_addr_t align_buf; + u32 xfer_len; + u32 xfer_count; + u16 start_pkt_count; + u8 xfer_started; + u8 do_ping; + u8 error_state; + u8 halt_on_queue; + u8 halt_pending; + u8 do_split; + u8 complete_split; + u8 hub_addr; + u8 hub_port; + u8 xact_pos; + u8 requests; + u8 schinfo; + u16 ntd; + enum dwc2_halt_status halt_status; + u32 hcint; + struct dwc2_qh *qh; + struct list_head hc_list_entry; + dma_addr_t desc_list_addr; + u32 desc_list_sz; + struct list_head split_order_list_entry; +}; + +struct dwc2_hs_transfer_time { + u32 start_schedule_us; + u16 duration_us; +}; + +struct dwc2_tt; + +struct dwc2_qh { + struct dwc2_hsotg *hsotg; + u8 ep_type; + u8 ep_is_in; + u16 maxp; + u16 maxp_mult; + u8 dev_speed; + u8 data_toggle; + u8 ping_state; + u8 do_split; + u8 td_first; + u8 td_last; + u16 host_us; + u16 device_us; + u16 host_interval; + u16 device_interval; + u16 next_active_frame; + u16 start_active_frame; + s16 num_hs_transfers; + struct dwc2_hs_transfer_time hs_transfers[8]; + u32 ls_start_schedule_slice; + u16 ntd; + u8 *dw_align_buf; + dma_addr_t dw_align_buf_dma; + struct list_head qtd_list; + struct dwc2_host_chan *channel; + struct list_head qh_list_entry; + struct dwc2_dma_desc *desc_list; + dma_addr_t desc_list_dma; + u32 desc_list_sz; + u32 *n_bytes; + struct timer_list unreserve_timer; + struct hrtimer wait_timer; + struct dwc2_tt *dwc_tt; + int ttport; + unsigned int tt_buffer_dirty: 1; + unsigned int unreserve_pending: 1; + unsigned int schedule_low_speed: 1; + unsigned int want_wait: 1; + unsigned int wait_timer_cancel: 1; +}; + +struct dwc2_tt { + int refcount; + struct usb_tt *usb_tt; + long unsigned int periodic_bitmaps[0]; +}; + +enum dwc2_hsotg_dmamode { + S3C_HSOTG_DMA_NONE = 0, + S3C_HSOTG_DMA_ONLY = 1, + S3C_HSOTG_DMA_DRV = 2, +}; + +struct dwc2_hsotg_plat { + enum dwc2_hsotg_dmamode dma; + unsigned int is_osc: 1; + int phy_type; + int (*phy_init)(struct platform_device *, int); + int (*phy_exit)(struct platform_device *, int); +}; + +enum usb_role { + USB_ROLE_NONE = 0, + USB_ROLE_HOST = 1, + USB_ROLE_DEVICE = 2, +}; + +typedef int (*usb_role_switch_set_t)(struct usb_role_switch *, enum usb_role); + +typedef enum usb_role (*usb_role_switch_get_t)(struct usb_role_switch *); + +struct usb_role_switch_desc { + struct fwnode_handle *fwnode; + struct device *usb2_port; + struct device *usb3_port; + struct device *udc; + usb_role_switch_set_t set; + usb_role_switch_get_t get; + bool allow_userspace_control; + void *driver_data; + const char *name; +}; + +typedef void (*set_params_cb)(struct dwc2_hsotg *); + +struct dwc2_hcd_pipe_info { + u8 dev_addr; + u8 ep_num; + u8 pipe_type; + u8 pipe_dir; + u16 maxp; + u16 maxp_mult; +}; + +struct dwc2_hcd_iso_packet_desc { + u32 offset; + u32 length; + u32 actual_length; + u32 status; +}; + +struct dwc2_qtd; + +struct dwc2_hcd_urb { + void *priv; + struct dwc2_qtd *qtd; + void *buf; + dma_addr_t dma; + void *setup_packet; + dma_addr_t setup_dma; + u32 length; + u32 actual_length; + u32 status; + u32 error_count; + u32 packet_count; + u32 flags; + u16 interval; + struct dwc2_hcd_pipe_info pipe_info; + struct dwc2_hcd_iso_packet_desc iso_descs[0]; +}; + +enum dwc2_control_phase { + DWC2_CONTROL_SETUP = 0, + DWC2_CONTROL_DATA = 1, + DWC2_CONTROL_STATUS = 2, +}; + +struct dwc2_qtd { + enum dwc2_control_phase control_phase; + u8 in_process; + u8 data_toggle; + u8 complete_split; + u8 isoc_split_pos; + u16 isoc_frame_index; + u16 isoc_split_offset; + u16 isoc_td_last; + u16 isoc_td_first; + u32 ssplit_out_xfer_count; + u8 error_count; + u8 n_desc; + u16 isoc_frame_index_last; + u16 num_naks; + struct dwc2_hcd_urb *urb; + struct dwc2_qh *qh; + struct list_head qtd_list_entry; +}; + +enum dwc2_transaction_type { + DWC2_TRANSACTION_NONE = 0, + DWC2_TRANSACTION_PERIODIC = 1, + DWC2_TRANSACTION_NON_PERIODIC = 2, + DWC2_TRANSACTION_ALL = 3, +}; + +struct wrapper_priv_data { + struct dwc2_hsotg *hsotg; +}; + +enum amd_chipset_gen { + NOT_AMD_CHIPSET = 0, + AMD_CHIPSET_SB600 = 1, + AMD_CHIPSET_SB700 = 2, + AMD_CHIPSET_SB800 = 3, + AMD_CHIPSET_HUDSON2 = 4, + AMD_CHIPSET_BOLTON = 5, + AMD_CHIPSET_YANGTZE = 6, + AMD_CHIPSET_TAISHAN = 7, + AMD_CHIPSET_UNKNOWN = 8, +}; + +struct amd_chipset_type { + enum amd_chipset_gen gen; + u8 rev; +}; + +struct amd_chipset_info { + struct pci_dev *nb_dev; + struct pci_dev *smbus_dev; + int nb_type; + struct amd_chipset_type sb_type; + int isoc_reqs; + int probe_count; + bool need_pll_quirk; +}; + +struct ehci_stats { + long unsigned int normal; + long unsigned int error; + long unsigned int iaa; + long unsigned int lost_iaa; + long unsigned int complete; + long unsigned int unlink; +}; + +struct ehci_per_sched { + struct usb_device *udev; + struct usb_host_endpoint *ep; + struct list_head ps_list; + u16 tt_usecs; + u16 cs_mask; + u16 period; + u16 phase; + u8 bw_phase; + u8 phase_uf; + u8 usecs; + u8 c_usecs; + u8 bw_uperiod; + u8 bw_period; +}; + +enum ehci_rh_state { + EHCI_RH_HALTED = 0, + EHCI_RH_SUSPENDED = 1, + EHCI_RH_RUNNING = 2, + EHCI_RH_STOPPING = 3, +}; + +enum ehci_hrtimer_event { + EHCI_HRTIMER_POLL_ASS = 0, + EHCI_HRTIMER_POLL_PSS = 1, + EHCI_HRTIMER_POLL_DEAD = 2, + EHCI_HRTIMER_UNLINK_INTR = 3, + EHCI_HRTIMER_FREE_ITDS = 4, + EHCI_HRTIMER_ACTIVE_UNLINK = 5, + EHCI_HRTIMER_START_UNLINK_INTR = 6, + EHCI_HRTIMER_ASYNC_UNLINKS = 7, + EHCI_HRTIMER_IAA_WATCHDOG = 8, + EHCI_HRTIMER_DISABLE_PERIODIC = 9, + EHCI_HRTIMER_DISABLE_ASYNC = 10, + EHCI_HRTIMER_IO_WATCHDOG = 11, + EHCI_HRTIMER_NUM_EVENTS = 12, +}; + +struct ehci_caps; + +struct ehci_regs; + +struct ehci_dbg_port; + +struct ehci_qh; + +union ehci_shadow; + +struct ehci_itd; + +struct ehci_sitd; + +struct ehci_hcd { + enum ehci_hrtimer_event next_hrtimer_event; + unsigned int enabled_hrtimer_events; + ktime_t hr_timeouts[12]; + struct hrtimer hrtimer; + int PSS_poll_count; + int ASS_poll_count; + int died_poll_count; + struct ehci_caps *caps; + struct ehci_regs *regs; + struct ehci_dbg_port *debug; + __u32 hcs_params; + spinlock_t lock; + enum ehci_rh_state rh_state; + bool scanning: 1; + bool need_rescan: 1; + bool intr_unlinking: 1; + bool iaa_in_progress: 1; + bool async_unlinking: 1; + bool shutdown: 1; + struct ehci_qh *qh_scan_next; + struct ehci_qh *async; + struct ehci_qh *dummy; + struct list_head async_unlink; + struct list_head async_idle; + unsigned int async_unlink_cycle; + unsigned int async_count; + __le32 old_current; + __le32 old_token; + unsigned int periodic_size; + __le32 *periodic; + dma_addr_t periodic_dma; + struct list_head intr_qh_list; + unsigned int i_thresh; + union ehci_shadow *pshadow; + struct list_head intr_unlink_wait; + struct list_head intr_unlink; + unsigned int intr_unlink_wait_cycle; + unsigned int intr_unlink_cycle; + unsigned int now_frame; + unsigned int last_iso_frame; + unsigned int intr_count; + unsigned int isoc_count; + unsigned int periodic_count; + unsigned int uframe_periodic_max; + struct list_head cached_itd_list; + struct ehci_itd *last_itd_to_free; + struct list_head cached_sitd_list; + struct ehci_sitd *last_sitd_to_free; + long unsigned int reset_done[15]; + long unsigned int bus_suspended; + long unsigned int companion_ports; + long unsigned int owned_ports; + long unsigned int port_c_suspend; + long unsigned int suspended_ports; + long unsigned int resuming_ports; + struct dma_pool___2 *qh_pool; + struct dma_pool___2 *qtd_pool; + struct dma_pool___2 *itd_pool; + struct dma_pool___2 *sitd_pool; + unsigned int random_frame; + long unsigned int next_statechange; + ktime_t last_periodic_enable; + u32 command; + unsigned int no_selective_suspend: 1; + unsigned int has_fsl_port_bug: 1; + unsigned int has_fsl_hs_errata: 1; + unsigned int has_fsl_susp_errata: 1; + unsigned int big_endian_mmio: 1; + unsigned int big_endian_desc: 1; + unsigned int big_endian_capbase: 1; + unsigned int has_amcc_usb23: 1; + unsigned int need_io_watchdog: 1; + unsigned int amd_pll_fix: 1; + unsigned int use_dummy_qh: 1; + unsigned int has_synopsys_hc_bug: 1; + unsigned int frame_index_bug: 1; + unsigned int need_oc_pp_cycle: 1; + unsigned int imx28_write_fix: 1; + unsigned int spurious_oc: 1; + unsigned int is_aspeed: 1; + __le32 *ohci_hcctrl_reg; + unsigned int has_hostpc: 1; + unsigned int has_tdi_phy_lpm: 1; + unsigned int has_ppcd: 1; + u8 sbrn; + struct ehci_stats stats; + struct dentry *debug_dir; + u8 bandwidth[64]; + u8 tt_budget[64]; + struct list_head tt_list; + long unsigned int priv[0]; +}; + +struct ehci_caps { + u32 hc_capbase; + u32 hcs_params; + u32 hcc_params; + u8 portroute[8]; +}; + +struct ehci_regs { + u32 command; + u32 status; + u32 intr_enable; + u32 frame_index; + u32 segment; + u32 frame_list; + u32 async_next; + u32 reserved1[2]; + u32 txfill_tuning; + u32 reserved2[6]; + u32 configured_flag; + union { + u32 port_status[15]; + struct { + u32 reserved3[9]; + u32 usbmode; + }; + }; + union { + struct { + u32 reserved4; + u32 hostpc[15]; + }; + u32 brcm_insnreg[4]; + }; + u32 reserved5[2]; + u32 usbmode_ex; +}; + +struct ehci_dbg_port { + u32 control; + u32 pids; + u32 data03; + u32 data47; + u32 address; +}; + +struct ehci_fstn; + +union ehci_shadow { + struct ehci_qh *qh; + struct ehci_itd *itd; + struct ehci_sitd *sitd; + struct ehci_fstn *fstn; + __le32 *hw_next; + void *ptr; +}; + +struct ehci_qh_hw; + +struct ehci_qtd; + +struct ehci_qh { + struct ehci_qh_hw *hw; + dma_addr_t qh_dma; + union ehci_shadow qh_next; + struct list_head qtd_list; + struct list_head intr_node; + struct ehci_qtd *dummy; + struct list_head unlink_node; + struct ehci_per_sched ps; + unsigned int unlink_cycle; + u8 qh_state; + u8 xacterrs; + u8 unlink_reason; + u8 gap_uf; + unsigned int is_out: 1; + unsigned int clearing_tt: 1; + unsigned int dequeue_during_giveback: 1; + unsigned int should_be_inactive: 1; +}; + +struct ehci_iso_stream; + +struct ehci_itd { + __le32 hw_next; + __le32 hw_transaction[8]; + __le32 hw_bufp[7]; + __le32 hw_bufp_hi[7]; + dma_addr_t itd_dma; + union ehci_shadow itd_next; + struct urb *urb; + struct ehci_iso_stream *stream; + struct list_head itd_list; + unsigned int frame; + unsigned int pg; + unsigned int index[8]; + long: 64; +}; + +struct ehci_sitd { + __le32 hw_next; + __le32 hw_fullspeed_ep; + __le32 hw_uframe; + __le32 hw_results; + __le32 hw_buf[2]; + __le32 hw_backpointer; + __le32 hw_buf_hi[2]; + dma_addr_t sitd_dma; + union ehci_shadow sitd_next; + struct urb *urb; + struct ehci_iso_stream *stream; + struct list_head sitd_list; + unsigned int frame; + unsigned int index; +}; + +struct ehci_qtd { + __le32 hw_next; + __le32 hw_alt_next; + __le32 hw_token; + __le32 hw_buf[5]; + __le32 hw_buf_hi[5]; + dma_addr_t qtd_dma; + struct list_head qtd_list; + struct urb *urb; + size_t length; +}; + +struct ehci_fstn { + __le32 hw_next; + __le32 hw_prev; + dma_addr_t fstn_dma; + union ehci_shadow fstn_next; + long: 64; +}; + +struct ehci_qh_hw { + __le32 hw_next; + __le32 hw_info1; + __le32 hw_info2; + __le32 hw_current; + __le32 hw_qtd_next; + __le32 hw_alt_next; + __le32 hw_token; + __le32 hw_buf[5]; + __le32 hw_buf_hi[5]; + long: 32; + long: 64; + long: 64; + long: 64; +}; + +struct ehci_iso_packet { + u64 bufp; + __le32 transaction; + u8 cross; + u32 buf1; +}; + +struct ehci_iso_sched { + struct list_head td_list; + unsigned int span; + unsigned int first_packet; + struct ehci_iso_packet packet[0]; +}; + +struct ehci_iso_stream { + struct ehci_qh_hw *hw; + u8 bEndpointAddress; + u8 highspeed; + struct list_head td_list; + struct list_head free_list; + struct ehci_per_sched ps; + unsigned int next_uframe; + __le32 splits; + u16 uperiod; + u16 maxp; + unsigned int bandwidth; + __le32 buf0; + __le32 buf1; + __le32 buf2; + __le32 address; +}; + +struct ehci_tt { + u16 bandwidth[8]; + struct list_head tt_list; + struct list_head ps_list; + struct usb_tt *usb_tt; + int tt_port; +}; + +struct ehci_driver_overrides { + size_t extra_priv_size; + int (*reset)(struct usb_hcd *); + int (*port_power)(struct usb_hcd *, int, bool); +}; + +struct debug_buffer { + ssize_t (*fill_func)(struct debug_buffer *); + struct usb_bus *bus; + struct mutex mutex; + size_t count; + char *output_buf; + size_t alloc_size; +}; + +enum orion_ehci_phy_ver { + EHCI_PHY_ORION = 0, + EHCI_PHY_DD = 1, + EHCI_PHY_KW = 2, + EHCI_PHY_NA = 3, +}; + +struct orion_ehci_data { + enum orion_ehci_phy_ver phy_version; +}; + +struct orion_ehci_hcd { + struct clk *clk; + struct phy *phy; +}; + +typedef __u32 __hc32; + +typedef __u16 __hc16; + +struct td; + +struct ed { + __hc32 hwINFO; + __hc32 hwTailP; + __hc32 hwHeadP; + __hc32 hwNextED; + dma_addr_t dma; + struct td *dummy; + struct ed *ed_next; + struct ed *ed_prev; + struct list_head td_list; + struct list_head in_use_list; + u8 state; + u8 type; + u8 branch; + u16 interval; + u16 load; + u16 last_iso; + u16 tick; + unsigned int takeback_wdh_cnt; + struct td *pending_td; + long: 64; +}; + +struct td { + __hc32 hwINFO; + __hc32 hwCBP; + __hc32 hwNextTD; + __hc32 hwBE; + __hc16 hwPSW[2]; + __u8 index; + struct ed *ed; + struct td *td_hash; + struct td *next_dl_td; + struct urb *urb; + dma_addr_t td_dma; + dma_addr_t data_dma; + struct list_head td_list; + long: 64; +}; + +struct ohci_hcca { + __hc32 int_table[32]; + __hc32 frame_no; + __hc32 done_head; + u8 reserved_for_hc[116]; + u8 what[4]; +}; + +struct ohci_roothub_regs { + __hc32 a; + __hc32 b; + __hc32 status; + __hc32 portstatus[15]; +}; + +struct ohci_regs { + __hc32 revision; + __hc32 control; + __hc32 cmdstatus; + __hc32 intrstatus; + __hc32 intrenable; + __hc32 intrdisable; + __hc32 hcca; + __hc32 ed_periodcurrent; + __hc32 ed_controlhead; + __hc32 ed_controlcurrent; + __hc32 ed_bulkhead; + __hc32 ed_bulkcurrent; + __hc32 donehead; + __hc32 fminterval; + __hc32 fmremaining; + __hc32 fmnumber; + __hc32 periodicstart; + __hc32 lsthresh; + struct ohci_roothub_regs roothub; + long: 64; + long: 64; +}; + +struct urb_priv { + struct ed *ed; + u16 length; + u16 td_cnt; + struct list_head pending; + struct td *td[0]; +}; + +typedef struct urb_priv urb_priv_t; + +enum ohci_rh_state { + OHCI_RH_HALTED = 0, + OHCI_RH_SUSPENDED = 1, + OHCI_RH_RUNNING = 2, +}; + +struct ohci_hcd { + spinlock_t lock; + struct ohci_regs *regs; + struct ohci_hcca *hcca; + dma_addr_t hcca_dma; + struct ed *ed_rm_list; + struct ed *ed_bulktail; + struct ed *ed_controltail; + struct ed *periodic[32]; + void (*start_hnp)(struct ohci_hcd *); + struct dma_pool___2 *td_cache; + struct dma_pool___2 *ed_cache; + struct td *td_hash[64]; + struct td *dl_start; + struct td *dl_end; + struct list_head pending; + struct list_head eds_in_use; + enum ohci_rh_state rh_state; + int num_ports; + int load[32]; + u32 hc_control; + long unsigned int next_statechange; + u32 fminterval; + unsigned int autostop: 1; + unsigned int working: 1; + unsigned int restart_work: 1; + long unsigned int flags; + unsigned int prev_frame_no; + unsigned int wdh_cnt; + unsigned int prev_wdh_cnt; + u32 prev_donehead; + struct timer_list io_watchdog; + struct work_struct nec_work; + struct dentry *debug_dir; + long unsigned int priv[0]; +}; + +struct ohci_driver_overrides { + const char *product_desc; + size_t extra_priv_size; + int (*reset)(struct usb_hcd *); +}; + +struct debug_buffer___2 { + ssize_t (*fill_func)(struct debug_buffer___2 *); + struct ohci_hcd *ohci; + struct mutex mutex; + size_t count; + char *page; +}; + +struct uhci_td; + +struct uhci_qh { + __le32 link; + __le32 element; + dma_addr_t dma_handle; + struct list_head node; + struct usb_host_endpoint *hep; + struct usb_device *udev; + struct list_head queue; + struct uhci_td *dummy_td; + struct uhci_td *post_td; + struct usb_iso_packet_descriptor *iso_packet_desc; + long unsigned int advance_jiffies; + unsigned int unlink_frame; + unsigned int period; + short int phase; + short int load; + unsigned int iso_frame; + int state; + int type; + int skel; + unsigned int initial_toggle: 1; + unsigned int needs_fixup: 1; + unsigned int is_stopped: 1; + unsigned int wait_expired: 1; + unsigned int bandwidth_reserved: 1; +}; + +struct uhci_td { + __le32 link; + __le32 status; + __le32 token; + __le32 buffer; + dma_addr_t dma_handle; + struct list_head list; + int frame; + struct list_head fl_list; +}; + +enum uhci_rh_state { + UHCI_RH_RESET = 0, + UHCI_RH_SUSPENDED = 1, + UHCI_RH_AUTO_STOPPED = 2, + UHCI_RH_RESUMING = 3, + UHCI_RH_SUSPENDING = 4, + UHCI_RH_RUNNING = 5, + UHCI_RH_RUNNING_NODEVS = 6, +}; + +struct uhci_hcd { + long unsigned int io_addr; + void *regs; + struct dma_pool___2 *qh_pool; + struct dma_pool___2 *td_pool; + struct uhci_td *term_td; + struct uhci_qh *skelqh[11]; + struct uhci_qh *next_qh; + spinlock_t lock; + dma_addr_t frame_dma_handle; + __le32 *frame; + void **frame_cpu; + enum uhci_rh_state rh_state; + long unsigned int auto_stop_time; + unsigned int frame_number; + unsigned int is_stopped; + unsigned int last_iso_frame; + unsigned int cur_iso_frame; + unsigned int scan_in_progress: 1; + unsigned int need_rescan: 1; + unsigned int dead: 1; + unsigned int RD_enable: 1; + unsigned int is_initialized: 1; + unsigned int fsbr_is_on: 1; + unsigned int fsbr_is_wanted: 1; + unsigned int fsbr_expiring: 1; + struct timer_list fsbr_timer; + unsigned int oc_low: 1; + unsigned int wait_for_hp: 1; + unsigned int big_endian_mmio: 1; + unsigned int big_endian_desc: 1; + unsigned int is_aspeed: 1; + long unsigned int port_c_suspend; + long unsigned int resuming_ports; + long unsigned int ports_timeout; + struct list_head idle_qh_list; + int rh_numports; + wait_queue_head_t waitqh; + int num_waiting; + int total_load; + short int load[32]; + struct clk *clk; + void (*reset_hc)(struct uhci_hcd *); + int (*check_and_reset_hc)(struct uhci_hcd *); + void (*configure_hc)(struct uhci_hcd *); + int (*resume_detect_interrupts_are_broken)(struct uhci_hcd *); + int (*global_suspend_mode_is_broken)(struct uhci_hcd *); +}; + +struct urb_priv___2 { + struct list_head node; + struct urb *urb; + struct uhci_qh *qh; + struct list_head td_list; + unsigned int fsbr: 1; +}; + +struct uhci_debug { + int size; + char *data; +}; + +struct xhci_cap_regs { + __le32 hc_capbase; + __le32 hcs_params1; + __le32 hcs_params2; + __le32 hcs_params3; + __le32 hcc_params; + __le32 db_off; + __le32 run_regs_off; + __le32 hcc_params2; +}; + +struct xhci_op_regs { + __le32 command; + __le32 status; + __le32 page_size; + __le32 reserved1; + __le32 reserved2; + __le32 dev_notification; + __le64 cmd_ring; + __le32 reserved3[4]; + __le64 dcbaa_ptr; + __le32 config_reg; + __le32 reserved4[241]; + __le32 port_status_base; + __le32 port_power_base; + __le32 port_link_base; + __le32 reserved5; + __le32 reserved6[1016]; +}; + +struct xhci_intr_reg { + __le32 irq_pending; + __le32 irq_control; + __le32 erst_size; + __le32 rsvd; + __le64 erst_base; + __le64 erst_dequeue; +}; + +struct xhci_run_regs { + __le32 microframe_index; + __le32 rsvd[7]; + struct xhci_intr_reg ir_set[128]; +}; + +struct xhci_doorbell_array { + __le32 doorbell[256]; +}; + +struct xhci_container_ctx { + unsigned int type; + int size; + u8 *bytes; + dma_addr_t dma; +}; + +struct xhci_slot_ctx { + __le32 dev_info; + __le32 dev_info2; + __le32 tt_info; + __le32 dev_state; + __le32 reserved[4]; +}; + +struct xhci_ep_ctx { + __le32 ep_info; + __le32 ep_info2; + __le64 deq; + __le32 tx_info; + __le32 reserved[3]; +}; + +struct xhci_input_control_ctx { + __le32 drop_flags; + __le32 add_flags; + __le32 rsvd2[6]; +}; + +union xhci_trb; + +struct xhci_command { + struct xhci_container_ctx *in_ctx; + u32 status; + int slot_id; + struct completion *completion; + union xhci_trb *command_trb; + struct list_head cmd_list; +}; + +struct xhci_link_trb { + __le64 segment_ptr; + __le32 intr_target; + __le32 control; +}; + +struct xhci_transfer_event { + __le64 buffer; + __le32 transfer_len; + __le32 flags; +}; + +struct xhci_event_cmd { + __le64 cmd_trb; + __le32 status; + __le32 flags; +}; + +struct xhci_generic_trb { + __le32 field[4]; +}; + +union xhci_trb { + struct xhci_link_trb link; + struct xhci_transfer_event trans_event; + struct xhci_event_cmd event_cmd; + struct xhci_generic_trb generic; +}; + +struct xhci_stream_ctx { + __le64 stream_ring; + __le32 reserved[2]; +}; + +struct xhci_ring; + +struct xhci_stream_info { + struct xhci_ring **stream_rings; + unsigned int num_streams; + struct xhci_stream_ctx *stream_ctx_array; + unsigned int num_stream_ctxs; + dma_addr_t ctx_array_dma; + struct xarray trb_address_map; + struct xhci_command *free_streams_command; +}; + +enum xhci_ring_type { + TYPE_CTRL = 0, + TYPE_ISOC = 1, + TYPE_BULK = 2, + TYPE_INTR = 3, + TYPE_STREAM = 4, + TYPE_COMMAND = 5, + TYPE_EVENT = 6, +}; + +struct xhci_segment; + +struct xhci_ring { + struct xhci_segment *first_seg; + struct xhci_segment *last_seg; + union xhci_trb *enqueue; + struct xhci_segment *enq_seg; + union xhci_trb *dequeue; + struct xhci_segment *deq_seg; + struct list_head td_list; + u32 cycle_state; + unsigned int err_count; + unsigned int stream_id; + unsigned int num_segs; + unsigned int num_trbs_free; + unsigned int num_trbs_free_temp; + unsigned int bounce_buf_len; + enum xhci_ring_type type; + bool last_td_was_short; + struct xarray *trb_address_map; +}; + +struct xhci_bw_info { + unsigned int ep_interval; + unsigned int mult; + unsigned int num_packets; + unsigned int max_packet_size; + unsigned int max_esit_payload; + unsigned int type; +}; + +struct xhci_virt_device; + +struct xhci_hcd; + +struct xhci_virt_ep { + struct xhci_virt_device *vdev; + unsigned int ep_index; + struct xhci_ring *ring; + struct xhci_stream_info *stream_info; + struct xhci_ring *new_ring; + unsigned int ep_state; + struct list_head cancelled_td_list; + struct timer_list stop_cmd_timer; + struct xhci_hcd *xhci; + struct xhci_segment *queued_deq_seg; + union xhci_trb *queued_deq_ptr; + bool skip; + struct xhci_bw_info bw_info; + struct list_head bw_endpoint_list; + int next_frame_id; + bool use_extended_tbc; +}; + +struct xhci_interval_bw_table; + +struct xhci_tt_bw_info; + +struct xhci_virt_device { + int slot_id; + struct usb_device *udev; + struct xhci_container_ctx *out_ctx; + struct xhci_container_ctx *in_ctx; + struct xhci_virt_ep eps[31]; + u8 fake_port; + u8 real_port; + struct xhci_interval_bw_table *bw_table; + struct xhci_tt_bw_info *tt_info; + long unsigned int flags; + u16 current_mel; + void *debugfs_private; +}; + +struct xhci_erst_entry; + +struct xhci_erst { + struct xhci_erst_entry *entries; + unsigned int num_entries; + dma_addr_t erst_dma_addr; + unsigned int erst_size; +}; + +struct s3_save { + u32 command; + u32 dev_nt; + u64 dcbaa_ptr; + u32 config_reg; + u32 irq_pending; + u32 irq_control; + u32 erst_size; + u64 erst_base; + u64 erst_dequeue; +}; + +struct xhci_bus_state { + long unsigned int bus_suspended; + long unsigned int next_statechange; + u32 port_c_suspend; + u32 suspended_ports; + u32 port_remote_wakeup; + long unsigned int resume_done[31]; + long unsigned int resuming_ports; + long unsigned int rexit_ports; + struct completion rexit_done[31]; + struct completion u3exit_done[31]; +}; + +struct xhci_port; + +struct xhci_hub { + struct xhci_port **ports; + unsigned int num_ports; + struct usb_hcd *hcd; + struct xhci_bus_state bus_state; + u8 maj_rev; + u8 min_rev; +}; + +struct xhci_device_context_array; + +struct xhci_scratchpad; + +struct xhci_root_port_bw_info; + +struct xhci_port_cap; + +struct xhci_hcd { + struct usb_hcd *main_hcd; + struct usb_hcd *shared_hcd; + struct xhci_cap_regs *cap_regs; + struct xhci_op_regs *op_regs; + struct xhci_run_regs *run_regs; + struct xhci_doorbell_array *dba; + struct xhci_intr_reg *ir_set; + __u32 hcs_params1; + __u32 hcs_params2; + __u32 hcs_params3; + __u32 hcc_params; + __u32 hcc_params2; + spinlock_t lock; + u8 sbrn; + u16 hci_version; + u8 max_slots; + u8 max_interrupters; + u8 max_ports; + u8 isoc_threshold; + u32 imod_interval; + u32 isoc_bei_interval; + int event_ring_max; + int page_size; + int page_shift; + int msix_count; + struct clk *clk; + struct clk *reg_clk; + struct reset_control *reset; + struct xhci_device_context_array *dcbaa; + struct xhci_ring *cmd_ring; + unsigned int cmd_ring_state; + struct list_head cmd_list; + unsigned int cmd_ring_reserved_trbs; + struct delayed_work cmd_timer; + struct completion cmd_ring_stop_completion; + struct xhci_command *current_cmd; + struct xhci_ring *event_ring; + struct xhci_erst erst; + struct xhci_scratchpad *scratchpad; + struct list_head lpm_failed_devs; + struct mutex mutex; + struct xhci_command *lpm_command; + struct xhci_virt_device *devs[256]; + struct xhci_root_port_bw_info *rh_bw; + struct dma_pool___2 *device_pool; + struct dma_pool___2 *segment_pool; + struct dma_pool___2 *small_streams_pool; + struct dma_pool___2 *medium_streams_pool; + unsigned int xhc_state; + u32 command; + struct s3_save s3; + long long unsigned int quirks; + unsigned int num_active_eps; + unsigned int limit_active_eps; + struct xhci_port *hw_ports; + struct xhci_hub usb2_rhub; + struct xhci_hub usb3_rhub; + unsigned int hw_lpm_support: 1; + unsigned int broken_suspend: 1; + u32 *ext_caps; + unsigned int num_ext_caps; + struct xhci_port_cap *port_caps; + unsigned int num_port_caps; + struct timer_list comp_mode_recovery_timer; + u32 port_status_u0; + u16 test_mode; + struct dentry *debugfs_root; + struct dentry *debugfs_slots; + struct list_head regset_list; + void *dbc; + long unsigned int priv[0]; +}; + +struct xhci_segment { + union xhci_trb *trbs; + struct xhci_segment *next; + dma_addr_t dma; + dma_addr_t bounce_dma; + void *bounce_buf; + unsigned int bounce_offs; + unsigned int bounce_len; +}; + +enum xhci_overhead_type { + LS_OVERHEAD_TYPE = 0, + FS_OVERHEAD_TYPE = 1, + HS_OVERHEAD_TYPE = 2, +}; + +struct xhci_interval_bw { + unsigned int num_packets; + struct list_head endpoints; + unsigned int overhead[3]; +}; + +struct xhci_interval_bw_table { + unsigned int interval0_esit_payload; + struct xhci_interval_bw interval_bw[16]; + unsigned int bw_used; + unsigned int ss_bw_in; + unsigned int ss_bw_out; +}; + +struct xhci_tt_bw_info { + struct list_head tt_list; + int slot_id; + int ttport; + struct xhci_interval_bw_table bw_table; + int active_eps; +}; + +struct xhci_root_port_bw_info { + struct list_head tts; + unsigned int num_active_tts; + struct xhci_interval_bw_table bw_table; +}; + +struct xhci_device_context_array { + __le64 dev_context_ptrs[256]; + dma_addr_t dma; +}; + +enum xhci_setup_dev { + SETUP_CONTEXT_ONLY = 0, + SETUP_CONTEXT_ADDRESS = 1, +}; + +enum xhci_cancelled_td_status { + TD_DIRTY = 0, + TD_HALTED = 1, + TD_CLEARING_CACHE = 2, + TD_CLEARED = 3, +}; + +struct xhci_td { + struct list_head td_list; + struct list_head cancelled_td_list; + int status; + enum xhci_cancelled_td_status cancel_status; + struct urb *urb; + struct xhci_segment *start_seg; + union xhci_trb *first_trb; + union xhci_trb *last_trb; + struct xhci_segment *last_trb_seg; + struct xhci_segment *bounce_seg; + bool urb_length_set; + unsigned int num_trbs; +}; + +struct xhci_erst_entry { + __le64 seg_addr; + __le32 seg_size; + __le32 rsvd; +}; + +struct xhci_scratchpad { + u64 *sp_array; + dma_addr_t sp_dma; + void **sp_buffers; +}; + +struct urb_priv___3 { + int num_tds; + int num_tds_done; + struct xhci_td td[0]; +}; + +struct xhci_port_cap { + u32 *psi; + u8 psi_count; + u8 psi_uid_count; + u8 maj_rev; + u8 min_rev; +}; + +struct xhci_port { + __le32 *addr; + int hw_portnum; + int hcd_portnum; + struct xhci_hub *rhub; + struct xhci_port_cap *port_cap; +}; + +struct xhci_driver_overrides { + size_t extra_priv_size; + int (*reset)(struct usb_hcd *); + int (*start)(struct usb_hcd *); + int (*add_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*drop_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *); + int (*check_bandwidth)(struct usb_hcd *, struct usb_device *); + void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *); +}; + +typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); + +enum xhci_ep_reset_type { + EP_HARD_RESET = 0, + EP_SOFT_RESET = 1, +}; + +struct dbc_regs { + __le32 capability; + __le32 doorbell; + __le32 ersts; + __le32 __reserved_0; + __le64 erstba; + __le64 erdp; + __le32 control; + __le32 status; + __le32 portsc; + __le32 __reserved_1; + __le64 dccp; + __le32 devinfo1; + __le32 devinfo2; +}; + +struct dbc_str_descs { + char string0[64]; + char manufacturer[64]; + char product[64]; + char serial[64]; +}; + +enum dbc_state { + DS_DISABLED = 0, + DS_INITIALIZED = 1, + DS_ENABLED = 2, + DS_CONNECTED = 3, + DS_CONFIGURED = 4, + DS_STALLED = 5, +}; + +struct xhci_dbc; + +struct dbc_ep { + struct xhci_dbc *dbc; + struct list_head list_pending; + struct xhci_ring *ring; + unsigned int direction: 1; +}; + +struct dbc_driver; + +struct xhci_dbc { + spinlock_t lock; + struct device *dev; + struct xhci_hcd *xhci; + struct dbc_regs *regs; + struct xhci_ring *ring_evt; + struct xhci_ring *ring_in; + struct xhci_ring *ring_out; + struct xhci_erst erst; + struct xhci_container_ctx *ctx; + struct dbc_str_descs *string; + dma_addr_t string_dma; + size_t string_size; + enum dbc_state state; + struct delayed_work event_work; + unsigned int resume_required: 1; + struct dbc_ep eps[2]; + const struct dbc_driver *driver; + void *priv; +}; + +struct dbc_driver { + int (*configure)(struct xhci_dbc *); + void (*disconnect)(struct xhci_dbc *); +}; + +struct dbc_request { + void *buf; + unsigned int length; + dma_addr_t dma; + void (*complete)(struct xhci_dbc *, struct dbc_request *); + struct list_head list_pool; + int status; + unsigned int actual; + struct xhci_dbc *dbc; + struct list_head list_pending; + dma_addr_t trb_dma; + union xhci_trb *trb; + unsigned int direction: 1; +}; + +struct trace_event_raw_xhci_log_msg { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_ctx { + struct trace_entry ent; + int ctx_64; + unsigned int ctx_type; + dma_addr_t ctx_dma; + u8 *ctx_va; + unsigned int ctx_ep_num; + int slot_id; + u32 __data_loc_ctx_data; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_trb { + struct trace_entry ent; + u32 type; + u32 field0; + u32 field1; + u32 field2; + u32 field3; + u32 __data_loc_str; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_free_virt_dev { + struct trace_entry ent; + void *vdev; + long long unsigned int out_ctx; + long long unsigned int in_ctx; + u8 fake_port; + u8 real_port; + u16 current_mel; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_virt_dev { + struct trace_entry ent; + void *vdev; + long long unsigned int out_ctx; + long long unsigned int in_ctx; + int devnum; + int state; + int speed; + u8 portnum; + u8 level; + int slot_id; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_urb { + struct trace_entry ent; + void *urb; + unsigned int pipe; + unsigned int stream; + int status; + unsigned int flags; + int num_mapped_sgs; + int num_sgs; + int length; + int actual; + int epnum; + int dir_in; + int type; + int slot_id; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_ep_ctx { + struct trace_entry ent; + u32 info; + u32 info2; + u64 deq; + u32 tx_info; + u32 __data_loc_str; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_slot_ctx { + struct trace_entry ent; + u32 info; + u32 info2; + u32 tt_info; + u32 state; + u32 __data_loc_str; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_ctrl_ctx { + struct trace_entry ent; + u32 drop; + u32 add; + u32 __data_loc_str; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_ring { + struct trace_entry ent; + u32 type; + void *ring; + dma_addr_t enq; + dma_addr_t deq; + dma_addr_t enq_seg; + dma_addr_t deq_seg; + unsigned int num_segs; + unsigned int stream_id; + unsigned int cycle_state; + unsigned int num_trbs_free; + unsigned int bounce_buf_len; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_portsc { + struct trace_entry ent; + u32 portnum; + u32 portsc; + u32 __data_loc_str; + char __data[0]; +}; + +struct trace_event_raw_xhci_log_doorbell { + struct trace_entry ent; + u32 slot; + u32 doorbell; + u32 __data_loc_str; + char __data[0]; +}; + +struct trace_event_raw_xhci_dbc_log_request { + struct trace_entry ent; + struct dbc_request *req; + bool dir; + unsigned int actual; + unsigned int length; + int status; + char __data[0]; +}; + +struct trace_event_data_offsets_xhci_log_msg { + u32 msg; +}; + +struct trace_event_data_offsets_xhci_log_ctx { + u32 ctx_data; +}; + +struct trace_event_data_offsets_xhci_log_trb { + u32 str; +}; + +struct trace_event_data_offsets_xhci_log_free_virt_dev {}; + +struct trace_event_data_offsets_xhci_log_virt_dev {}; + +struct trace_event_data_offsets_xhci_log_urb {}; + +struct trace_event_data_offsets_xhci_log_ep_ctx { + u32 str; +}; + +struct trace_event_data_offsets_xhci_log_slot_ctx { + u32 str; +}; + +struct trace_event_data_offsets_xhci_log_ctrl_ctx { + u32 str; +}; + +struct trace_event_data_offsets_xhci_log_ring {}; + +struct trace_event_data_offsets_xhci_log_portsc { + u32 str; +}; + +struct trace_event_data_offsets_xhci_log_doorbell { + u32 str; +}; + +struct trace_event_data_offsets_xhci_dbc_log_request {}; + +typedef void (*btf_trace_xhci_dbg_address)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_context_change)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_quirks)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_reset_ep)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_cancel_urb)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_init)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_dbg_ring_expansion)(void *, struct va_format *); + +typedef void (*btf_trace_xhci_address_ctx)(void *, struct xhci_hcd *, struct xhci_container_ctx *, unsigned int); + +typedef void (*btf_trace_xhci_handle_event)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_handle_command)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_handle_transfer)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_queue_trb)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_dbc_handle_event)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_dbc_handle_transfer)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_dbc_gadget_ep_queue)(void *, struct xhci_ring *, struct xhci_generic_trb *); + +typedef void (*btf_trace_xhci_free_virt_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_alloc_virt_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_setup_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_setup_addressable_virt_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_stop_device)(void *, struct xhci_virt_device *); + +typedef void (*btf_trace_xhci_urb_enqueue)(void *, struct urb *); + +typedef void (*btf_trace_xhci_urb_giveback)(void *, struct urb *); + +typedef void (*btf_trace_xhci_urb_dequeue)(void *, struct urb *); + +typedef void (*btf_trace_xhci_handle_cmd_stop_ep)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_set_deq_ep)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_reset_ep)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_config_ep)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_add_endpoint)(void *, struct xhci_ep_ctx *); + +typedef void (*btf_trace_xhci_alloc_dev)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_free_dev)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_disable_slot)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_discover_or_reset_device)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_setup_device_slot)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_addr_dev)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_reset_dev)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_handle_cmd_set_deq)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_configure_endpoint)(void *, struct xhci_slot_ctx *); + +typedef void (*btf_trace_xhci_address_ctrl_ctx)(void *, struct xhci_input_control_ctx *); + +typedef void (*btf_trace_xhci_configure_endpoint_ctrl_ctx)(void *, struct xhci_input_control_ctx *); + +typedef void (*btf_trace_xhci_ring_alloc)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_ring_free)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_ring_expansion)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_inc_enq)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_inc_deq)(void *, struct xhci_ring *); + +typedef void (*btf_trace_xhci_handle_port_status)(void *, u32, u32); + +typedef void (*btf_trace_xhci_get_port_status)(void *, u32, u32); + +typedef void (*btf_trace_xhci_hub_status_data)(void *, u32, u32); + +typedef void (*btf_trace_xhci_ring_ep_doorbell)(void *, u32, u32); + +typedef void (*btf_trace_xhci_ring_host_doorbell)(void *, u32, u32); + +typedef void (*btf_trace_xhci_dbc_alloc_request)(void *, struct dbc_request *); + +typedef void (*btf_trace_xhci_dbc_free_request)(void *, struct dbc_request *); + +typedef void (*btf_trace_xhci_dbc_queue_request)(void *, struct dbc_request *); + +typedef void (*btf_trace_xhci_dbc_giveback_request)(void *, struct dbc_request *); + +struct usb_string_descriptor { + __u8 bLength; + __u8 bDescriptorType; + __le16 wData[1]; +}; + +struct dbc_info_context { + __le64 string0; + __le64 manufacturer; + __le64 product; + __le64 serial; + __le32 length; + __le32 __reserved_0[7]; +}; + +enum evtreturn { + EVT_ERR = 4294967295, + EVT_DONE = 0, + EVT_GSER = 1, + EVT_DISC = 2, +}; + +struct kfifo { + union { + struct __kfifo kfifo; + unsigned char *type; + const unsigned char *const_type; + char (*rectype)[0]; + void *ptr; + const void *ptr_const; + }; + unsigned char buf[0]; +}; + +struct dbc_port { + struct tty_port port; + spinlock_t port_lock; + struct list_head read_pool; + struct list_head read_queue; + unsigned int n_read; + struct tasklet_struct push; + struct list_head write_pool; + struct kfifo write_fifo; + bool registered; +}; + +struct xhci_regset { + char name[32]; + struct debugfs_regset32 regset; + size_t nregs; + struct list_head list; +}; + +struct xhci_file_map { + const char *name; + int (*show)(struct seq_file *, void *); +}; + +struct xhci_ep_priv { + char name[32]; + struct dentry *root; + struct xhci_stream_info *stream_info; + struct xhci_ring *show_ring; + unsigned int stream_id; +}; + +struct xhci_slot_priv { + char name[32]; + struct dentry *root; + struct xhci_ep_priv *eps[31]; + struct xhci_virt_device *dev; +}; + +struct usb_role_switch { + struct device dev; + struct mutex lock; + enum usb_role role; + struct device *usb2_port; + struct device *usb3_port; + struct device *udc; + usb_role_switch_set_t set; + usb_role_switch_get_t get; + bool allow_userspace_control; +}; + +struct serio_device_id { + __u8 type; + __u8 extra; + __u8 id; + __u8 proto; +}; + +struct serio_driver; + +struct serio { + void *port_data; + char name[32]; + char phys[32]; + char firmware_id[128]; + bool manual_bind; + struct serio_device_id id; + spinlock_t lock; + int (*write)(struct serio *, unsigned char); + int (*open)(struct serio *); + void (*close)(struct serio *); + int (*start)(struct serio *); + void (*stop)(struct serio *); + struct serio *parent; + struct list_head child_node; + struct list_head children; + unsigned int depth; + struct serio_driver *drv; + struct mutex drv_mutex; + struct device dev; + struct list_head node; + struct mutex *ps2_cmd_mutex; +}; + +struct serio_driver { + const char *description; + const struct serio_device_id *id_table; + bool manual_bind; + void (*write_wakeup)(struct serio *); + irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int); + int (*connect)(struct serio *, struct serio_driver *); + int (*reconnect)(struct serio *); + int (*fast_reconnect)(struct serio *); + void (*disconnect)(struct serio *); + void (*cleanup)(struct serio *); + struct device_driver driver; +}; + +enum serio_event_type { + SERIO_RESCAN_PORT = 0, + SERIO_RECONNECT_PORT = 1, + SERIO_RECONNECT_SUBTREE = 2, + SERIO_REGISTER_PORT = 3, + SERIO_ATTACH_DRIVER = 4, +}; + +struct serio_event { + enum serio_event_type type; + void *object; + struct module *owner; + struct list_head node; +}; + +struct ps2dev { + struct serio *serio; + struct mutex cmd_mutex; + wait_queue_head_t wait; + long unsigned int flags; + u8 cmdbuf[8]; + u8 cmdcnt; + u8 nak; +}; + +struct input_mt_slot { + int abs[14]; + unsigned int frame; + unsigned int key; +}; + +struct input_mt { + int trkid; + int num_slots; + int slot; + unsigned int flags; + unsigned int frame; + int *red; + struct input_mt_slot slots[0]; +}; + +union input_seq_state { + struct { + short unsigned int pos; + bool mutex_acquired; + }; + void *p; +}; + +struct input_devres { + struct input_dev *input; +}; + +struct input_event { + __kernel_ulong_t __sec; + __kernel_ulong_t __usec; + __u16 type; + __u16 code; + __s32 value; +}; + +struct input_event_compat { + compat_ulong_t sec; + compat_ulong_t usec; + __u16 type; + __u16 code; + __s32 value; +}; + +struct ff_periodic_effect_compat { + __u16 waveform; + __u16 period; + __s16 magnitude; + __s16 offset; + __u16 phase; + struct ff_envelope envelope; + __u32 custom_len; + compat_uptr_t custom_data; +}; + +struct ff_effect_compat { + __u16 type; + __s16 id; + __u16 direction; + struct ff_trigger trigger; + struct ff_replay replay; + union { + struct ff_constant_effect constant; + struct ff_ramp_effect ramp; + struct ff_periodic_effect_compat periodic; + struct ff_condition_effect condition[2]; + struct ff_rumble_effect rumble; + } u; +}; + +struct input_mt_pos { + s16 x; + s16 y; +}; + +struct input_dev_poller { + void (*poll)(struct input_dev *); + unsigned int poll_interval; + unsigned int poll_interval_max; + unsigned int poll_interval_min; + struct input_dev *input; + struct delayed_work work; +}; + +struct touchscreen_properties { + unsigned int max_x; + unsigned int max_y; + bool invert_x; + bool invert_y; + bool swap_x_y; +}; + +struct mousedev_hw_data { + int dx; + int dy; + int dz; + int x; + int y; + int abs_event; + long unsigned int buttons; +}; + +struct mousedev { + int open; + struct input_handle handle; + wait_queue_head_t wait; + struct list_head client_list; + spinlock_t client_lock; + struct mutex mutex; + struct device dev; + struct cdev cdev; + bool exist; + struct list_head mixdev_node; + bool opened_by_mixdev; + struct mousedev_hw_data packet; + unsigned int pkt_count; + int old_x[4]; + int old_y[4]; + int frac_dx; + int frac_dy; + long unsigned int touch; + int (*open_device)(struct mousedev *); + void (*close_device)(struct mousedev *); +}; + +enum mousedev_emul { + MOUSEDEV_EMUL_PS2 = 0, + MOUSEDEV_EMUL_IMPS = 1, + MOUSEDEV_EMUL_EXPS = 2, +}; + +struct mousedev_motion { + int dx; + int dy; + int dz; + long unsigned int buttons; +}; + +struct mousedev_client { + struct fasync_struct *fasync; + struct mousedev *mousedev; + struct list_head node; + struct mousedev_motion packets[16]; + unsigned int head; + unsigned int tail; + spinlock_t packet_lock; + int pos_x; + int pos_y; + u8 ps2[6]; + unsigned char ready; + unsigned char buffer; + unsigned char bufsiz; + unsigned char imexseq; + unsigned char impsseq; + enum mousedev_emul mode; + long unsigned int last_buttons; +}; + +enum { + FRACTION_DENOM = 128, +}; + +struct input_mask { + __u32 type; + __u32 codes_size; + __u64 codes_ptr; +}; + +struct evdev_client; + +struct evdev { + int open; + struct input_handle handle; + struct evdev_client *grab; + struct list_head client_list; + spinlock_t client_lock; + struct mutex mutex; + struct device dev; + struct cdev cdev; + bool exist; +}; + +struct evdev_client { + unsigned int head; + unsigned int tail; + unsigned int packet_head; + spinlock_t buffer_lock; + wait_queue_head_t wait; + struct fasync_struct *fasync; + struct evdev *evdev; + struct list_head node; + enum input_clock_type clk_type; + bool revoked; + long unsigned int *evmasks[32]; + unsigned int bufsize; + struct input_event buffer[0]; +}; + +struct atkbd { + struct ps2dev ps2dev; + struct input_dev *dev; + char name[64]; + char phys[32]; + short unsigned int id; + short unsigned int keycode[512]; + long unsigned int force_release_mask[8]; + unsigned char set; + bool translated; + bool extra; + bool write; + bool softrepeat; + bool softraw; + bool scroll; + bool enabled; + unsigned char emul; + bool resend; + bool release; + long unsigned int xl_bit; + unsigned int last; + long unsigned int time; + long unsigned int err_count; + struct delayed_work event_work; + long unsigned int event_jiffies; + long unsigned int event_mask; + struct mutex mutex; + u32 function_row_physmap[24]; + int num_function_row_keys; +}; + +struct uinput_ff_upload { + __u32 request_id; + __s32 retval; + struct ff_effect effect; + struct ff_effect old; +}; + +struct uinput_ff_erase { + __u32 request_id; + __s32 retval; + __u32 effect_id; +}; + +struct uinput_setup { + struct input_id id; + char name[80]; + __u32 ff_effects_max; +}; + +struct uinput_abs_setup { + __u16 code; + struct input_absinfo absinfo; +}; + +struct uinput_user_dev { + char name[80]; + struct input_id id; + __u32 ff_effects_max; + __s32 absmax[64]; + __s32 absmin[64]; + __s32 absfuzz[64]; + __s32 absflat[64]; +}; + +enum uinput_state { + UIST_NEW_DEVICE = 0, + UIST_SETUP_COMPLETE = 1, + UIST_CREATED = 2, +}; + +struct uinput_request { + unsigned int id; + unsigned int code; + int retval; + struct completion done; + union { + unsigned int effect_id; + struct { + struct ff_effect *effect; + struct ff_effect *old; + } upload; + } u; +}; + +struct uinput_device { + struct input_dev *dev; + struct mutex mutex; + enum uinput_state state; + wait_queue_head_t waitq; + unsigned char ready; + unsigned char head; + unsigned char tail; + struct input_event buff[16]; + unsigned int ff_effects_max; + struct uinput_request *requests[16]; + wait_queue_head_t requests_waitq; + spinlock_t requests_lock; +}; + +struct uinput_ff_upload_compat { + __u32 request_id; + __s32 retval; + struct ff_effect_compat effect; + struct ff_effect_compat old; +}; + +struct trace_event_raw_rtc_time_alarm_class { + struct trace_entry ent; + time64_t secs; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_irq_set_freq { + struct trace_entry ent; + int freq; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_irq_set_state { + struct trace_entry ent; + int enabled; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_alarm_irq_enable { + struct trace_entry ent; + unsigned int enabled; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_offset_class { + struct trace_entry ent; + long int offset; + int err; + char __data[0]; +}; + +struct trace_event_raw_rtc_timer_class { + struct trace_entry ent; + struct rtc_timer *timer; + ktime_t expires; + ktime_t period; + char __data[0]; +}; + +struct trace_event_data_offsets_rtc_time_alarm_class {}; + +struct trace_event_data_offsets_rtc_irq_set_freq {}; + +struct trace_event_data_offsets_rtc_irq_set_state {}; + +struct trace_event_data_offsets_rtc_alarm_irq_enable {}; + +struct trace_event_data_offsets_rtc_offset_class {}; + +struct trace_event_data_offsets_rtc_timer_class {}; + +typedef void (*btf_trace_rtc_set_time)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_read_time)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_set_alarm)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_read_alarm)(void *, time64_t, int); + +typedef void (*btf_trace_rtc_irq_set_freq)(void *, int, int); + +typedef void (*btf_trace_rtc_irq_set_state)(void *, int, int); + +typedef void (*btf_trace_rtc_alarm_irq_enable)(void *, unsigned int, int); + +typedef void (*btf_trace_rtc_set_offset)(void *, long int, int); + +typedef void (*btf_trace_rtc_read_offset)(void *, long int, int); + +typedef void (*btf_trace_rtc_timer_enqueue)(void *, struct rtc_timer *); + +typedef void (*btf_trace_rtc_timer_dequeue)(void *, struct rtc_timer *); + +typedef void (*btf_trace_rtc_timer_fired)(void *, struct rtc_timer *); + +enum { + none = 0, + day = 1, + month = 2, + year = 3, +}; + +struct rtc_plat_data { + struct rtc_device *rtc; + void *ioaddr; + int irq; + struct clk *clk; +}; + +struct rtd119x_rtc { + void *base; + struct clk *clk; + struct rtc_device *rtcdev; + unsigned int base_year; +}; + +struct sun6i_rtc_clk_data { + long unsigned int rc_osc_rate; + unsigned int fixed_prescaler: 16; + unsigned int has_prescaler: 1; + unsigned int has_out_clk: 1; + unsigned int export_iosc: 1; + unsigned int has_losc_en: 1; + unsigned int has_auto_swt: 1; +}; + +struct sun6i_rtc_dev { + struct rtc_device *rtc; + const struct sun6i_rtc_clk_data *data; + void *base; + int irq; + long unsigned int alarm; + struct clk_hw hw; + struct clk_hw *int_osc; + struct clk *losc; + struct clk *ext_losc; + spinlock_t lock; +}; + +struct xgene_rtc_dev { + struct rtc_device *rtc; + void *csr_base; + struct clk *clk; + unsigned int irq_wake; + unsigned int irq_enabled; +}; + +struct i2c_devinfo { + struct list_head list; + int busnum; + struct i2c_board_info board_info; +}; + +struct i2c_device_identity { + u16 manufacturer_id; + u16 part_id; + u8 die_revision; +}; + +struct i2c_timings { + u32 bus_freq_hz; + u32 scl_rise_ns; + u32 scl_fall_ns; + u32 scl_int_delay_ns; + u32 sda_fall_ns; + u32 sda_hold_ns; + u32 digital_filter_width_ns; + u32 analog_filter_cutoff_freq_hz; +}; + +struct trace_event_raw_i2c_write { + struct trace_entry ent; + int adapter_nr; + __u16 msg_nr; + __u16 addr; + __u16 flags; + __u16 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_i2c_read { + struct trace_entry ent; + int adapter_nr; + __u16 msg_nr; + __u16 addr; + __u16 flags; + __u16 len; + char __data[0]; +}; + +struct trace_event_raw_i2c_reply { + struct trace_entry ent; + int adapter_nr; + __u16 msg_nr; + __u16 addr; + __u16 flags; + __u16 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_i2c_result { + struct trace_entry ent; + int adapter_nr; + __u16 nr_msgs; + __s16 ret; + char __data[0]; +}; + +struct trace_event_data_offsets_i2c_write { + u32 buf; +}; + +struct trace_event_data_offsets_i2c_read {}; + +struct trace_event_data_offsets_i2c_reply { + u32 buf; +}; + +struct trace_event_data_offsets_i2c_result {}; + +typedef void (*btf_trace_i2c_write)(void *, const struct i2c_adapter *, const struct i2c_msg *, int); + +typedef void (*btf_trace_i2c_read)(void *, const struct i2c_adapter *, const struct i2c_msg *, int); + +typedef void (*btf_trace_i2c_reply)(void *, const struct i2c_adapter *, const struct i2c_msg *, int); + +typedef void (*btf_trace_i2c_result)(void *, const struct i2c_adapter *, int, int); + +struct class_compat___2; + +struct i2c_cmd_arg { + unsigned int cmd; + void *arg; +}; + +struct i2c_smbus_alert_setup { + int irq; +}; + +struct trace_event_raw_smbus_write { + struct trace_entry ent; + int adapter_nr; + __u16 addr; + __u16 flags; + __u8 command; + __u8 len; + __u32 protocol; + __u8 buf[34]; + char __data[0]; +}; + +struct trace_event_raw_smbus_read { + struct trace_entry ent; + int adapter_nr; + __u16 flags; + __u16 addr; + __u8 command; + __u32 protocol; + __u8 buf[34]; + char __data[0]; +}; + +struct trace_event_raw_smbus_reply { + struct trace_entry ent; + int adapter_nr; + __u16 addr; + __u16 flags; + __u8 command; + __u8 len; + __u32 protocol; + __u8 buf[34]; + char __data[0]; +}; + +struct trace_event_raw_smbus_result { + struct trace_entry ent; + int adapter_nr; + __u16 addr; + __u16 flags; + __u8 read_write; + __u8 command; + __s16 res; + __u32 protocol; + char __data[0]; +}; + +struct trace_event_data_offsets_smbus_write {}; + +struct trace_event_data_offsets_smbus_read {}; + +struct trace_event_data_offsets_smbus_reply {}; + +struct trace_event_data_offsets_smbus_result {}; + +typedef void (*btf_trace_smbus_write)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int, const union i2c_smbus_data *); + +typedef void (*btf_trace_smbus_read)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int); + +typedef void (*btf_trace_smbus_reply)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int, const union i2c_smbus_data *, int); + +typedef void (*btf_trace_smbus_result)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int, int); + +enum i2c_driver_flags { + I2C_DRV_ACPI_WAIVE_D0_PROBE = 1, +}; + +struct i2c_acpi_handler_data { + struct acpi_connection_info info; + struct i2c_adapter *adapter; +}; + +struct gsb_buffer { + u8 status; + u8 len; + union { + u16 wdata; + u8 bdata; + u8 data[0]; + }; +}; + +struct i2c_acpi_lookup { + struct i2c_board_info *info; + acpi_handle adapter_handle; + acpi_handle device_handle; + acpi_handle search_handle; + int n; + int index; + u32 speed; + u32 min_speed; + u32 force_speed; +}; + +struct i2c_smbus_ioctl_data { + __u8 read_write; + __u8 command; + __u32 size; + union i2c_smbus_data *data; +}; + +struct i2c_rdwr_ioctl_data { + struct i2c_msg *msgs; + __u32 nmsgs; +}; + +struct i2c_dev { + struct list_head list; + struct i2c_adapter *adap; + struct device dev; + struct cdev cdev; +}; + +struct i2c_smbus_ioctl_data32 { + u8 read_write; + u8 command; + u32 size; + compat_caddr_t data; +}; + +struct i2c_msg32 { + u16 addr; + u16 flags; + u16 len; + compat_caddr_t buf; +}; + +struct i2c_rdwr_ioctl_data32 { + compat_caddr_t msgs; + u32 nmsgs; +}; + +struct dw_i2c_dev { + struct device *dev; + struct regmap *map; + struct regmap *sysmap; + void *base; + void *ext; + struct completion cmd_complete; + struct clk *clk; + struct clk *pclk; + struct reset_control *rst; + struct i2c_client *slave; + u32 (*get_clk_rate_khz)(struct dw_i2c_dev *); + int cmd_err; + struct i2c_msg *msgs; + int msgs_num; + int msg_write_idx; + u32 tx_buf_len; + u8 *tx_buf; + int msg_read_idx; + u32 rx_buf_len; + u8 *rx_buf; + int msg_err; + unsigned int status; + u32 abort_source; + int irq; + u32 flags; + struct i2c_adapter adapter; + u32 functionality; + u32 master_cfg; + u32 slave_cfg; + unsigned int tx_fifo_depth; + unsigned int rx_fifo_depth; + int rx_outstanding; + struct i2c_timings timings; + u32 sda_hold_time; + u16 ss_hcnt; + u16 ss_lcnt; + u16 fs_hcnt; + u16 fs_lcnt; + u16 fp_hcnt; + u16 fp_lcnt; + u16 hs_hcnt; + u16 hs_lcnt; + int (*acquire_lock)(); + void (*release_lock)(); + bool shared_with_punit; + void (*disable)(struct dw_i2c_dev *); + void (*disable_int)(struct dw_i2c_dev *); + int (*init)(struct dw_i2c_dev *); + int (*set_sda_hold_time)(struct dw_i2c_dev *); + int mode; + struct i2c_bus_recovery_info rinfo; + bool suspended; +}; + +struct omap_i2c_bus_platform_data { + u32 clkrate; + u32 rev; + u32 flags; + void (*set_mpu_wkup_lat)(struct device *, long int); +}; + +enum { + OMAP_I2C_REV_REG = 0, + OMAP_I2C_IE_REG = 1, + OMAP_I2C_STAT_REG = 2, + OMAP_I2C_IV_REG = 3, + OMAP_I2C_WE_REG = 4, + OMAP_I2C_SYSS_REG = 5, + OMAP_I2C_BUF_REG = 6, + OMAP_I2C_CNT_REG = 7, + OMAP_I2C_DATA_REG = 8, + OMAP_I2C_SYSC_REG = 9, + OMAP_I2C_CON_REG = 10, + OMAP_I2C_OA_REG = 11, + OMAP_I2C_SA_REG = 12, + OMAP_I2C_PSC_REG = 13, + OMAP_I2C_SCLL_REG = 14, + OMAP_I2C_SCLH_REG = 15, + OMAP_I2C_SYSTEST_REG = 16, + OMAP_I2C_BUFSTAT_REG = 17, + OMAP_I2C_IP_V2_REVNB_LO = 18, + OMAP_I2C_IP_V2_REVNB_HI = 19, + OMAP_I2C_IP_V2_IRQSTATUS_RAW = 20, + OMAP_I2C_IP_V2_IRQENABLE_SET = 21, + OMAP_I2C_IP_V2_IRQENABLE_CLR = 22, +}; + +struct omap_i2c_dev { + struct device *dev; + void *base; + int irq; + int reg_shift; + struct completion cmd_complete; + struct resource *ioarea; + u32 latency; + void (*set_mpu_wkup_lat)(struct device *, long int); + u32 speed; + u32 flags; + u16 scheme; + u16 cmd_err; + u8 *buf; + u8 *regs; + size_t buf_len; + struct i2c_adapter adapter; + u8 threshold; + u8 fifo_size; + u32 rev; + unsigned int b_hw: 1; + unsigned int bb_valid: 1; + unsigned int receiver: 1; + u16 iestate; + u16 pscstate; + u16 scllstate; + u16 sclhstate; + u16 syscstate; + u16 westate; + u16 errata; +}; + +struct pasemi_smbus { + struct device *dev; + struct i2c_adapter adapter; + void *ioaddr; + unsigned int clk_div; + int hw_rev; +}; + +struct pasemi_platform_i2c_data { + struct pasemi_smbus smbus; + struct clk *clk_ref; +}; + +struct sprd_i2c { + struct i2c_adapter adap; + struct device *dev; + void *base; + struct i2c_msg *msg; + struct clk *clk; + u32 src_clk; + u32 bus_freq; + struct completion complete; + u8 *buf; + u32 count; + int irq; + int err; +}; + +struct pps_ktime { + __s64 sec; + __s32 nsec; + __u32 flags; +}; + +struct pps_ktime_compat { + __s64 sec; + __s32 nsec; + __u32 flags; +}; + +struct pps_kinfo { + __u32 assert_sequence; + __u32 clear_sequence; + struct pps_ktime assert_tu; + struct pps_ktime clear_tu; + int current_mode; +}; + +struct pps_kinfo_compat { + __u32 assert_sequence; + __u32 clear_sequence; + struct pps_ktime_compat assert_tu; + struct pps_ktime_compat clear_tu; + int current_mode; +} __attribute__((packed)); + +struct pps_kparams { + int api_version; + int mode; + struct pps_ktime assert_off_tu; + struct pps_ktime clear_off_tu; +}; + +struct pps_fdata { + struct pps_kinfo info; + struct pps_ktime timeout; +}; + +struct pps_fdata_compat { + struct pps_kinfo_compat info; + struct pps_ktime_compat timeout; +} __attribute__((packed)); + +struct pps_bind_args { + int tsformat; + int edge; + int consumer; +}; + +struct pps_device; + +struct pps_source_info { + char name[32]; + char path[32]; + int mode; + void (*echo)(struct pps_device *, int, void *); + struct module *owner; + struct device *dev; +}; + +struct pps_device { + struct pps_source_info info; + struct pps_kparams params; + __u32 assert_sequence; + __u32 clear_sequence; + struct pps_ktime assert_tu; + struct pps_ktime clear_tu; + int current_mode; + unsigned int last_ev; + wait_queue_head_t queue; + unsigned int id; + const void *lookup_cookie; + struct cdev cdev; + struct device *dev; + struct fasync_struct *async_queue; + spinlock_t lock; +}; + +struct ptp_extts_event { + struct ptp_clock_time t; + unsigned int index; + unsigned int flags; + unsigned int rsv[2]; +}; + +struct timestamp_event_queue { + struct ptp_extts_event buf[128]; + int head; + int tail; + spinlock_t lock; +}; + +struct ptp_clock___2 { + struct posix_clock clock; + struct device dev; + struct ptp_clock_info *info; + dev_t devid; + int index; + struct pps_device *pps_source; + long int dialed_frequency; + struct timestamp_event_queue tsevq; + struct mutex tsevq_mux; + struct mutex pincfg_mux; + wait_queue_head_t tsev_wq; + int defunct; + struct device_attribute *pin_dev_attr; + struct attribute **pin_attr; + struct attribute_group pin_attr_group; + const struct attribute_group *pin_attr_groups[2]; + struct kthread_worker *kworker; + struct kthread_delayed_work aux_work; + unsigned int max_vclocks; + unsigned int n_vclocks; + int *vclock_index; + struct mutex n_vclocks_mux; + bool is_virtual_clock; +}; + +struct ptp_clock_caps { + int max_adj; + int n_alarm; + int n_ext_ts; + int n_per_out; + int pps; + int n_pins; + int cross_timestamping; + int adjust_phase; + int rsv[12]; +}; + +struct ptp_sys_offset { + unsigned int n_samples; + unsigned int rsv[3]; + struct ptp_clock_time ts[51]; +}; + +struct ptp_sys_offset_extended { + unsigned int n_samples; + unsigned int rsv[3]; + struct ptp_clock_time ts[75]; +}; + +struct ptp_sys_offset_precise { + struct ptp_clock_time device; + struct ptp_clock_time sys_realtime; + struct ptp_clock_time sys_monoraw; + unsigned int rsv[4]; +}; + +struct ptp_vclock { + struct ptp_clock___2 *pclock; + struct ptp_clock_info info; + struct ptp_clock___2 *clock; + struct cyclecounter cc; + struct timecounter tc; + spinlock_t lock; +}; + +struct as3722_poweroff { + struct device *dev; + struct as3722 *as3722; +}; + +struct gpio_restart { + struct gpio_desc *reset_gpio; + struct notifier_block restart_handler; + u32 active_delay_ms; + u32 inactive_delay_ms; + u32 wait_delay_ms; +}; + +struct mt6323_pwrc { + struct device *dev; + struct regmap *regmap; + u32 base; +}; + +struct reset_props___2 { + const char *syscon; + u32 protect_reg; + u32 vcore_protect; + u32 if_si_owner_bit; +}; + +struct ocelot_reset_context { + void *base; + struct regmap *cpu_ctrl; + const struct reset_props___2 *props; + struct notifier_block restart_handler; +}; + +struct ltc2952_poweroff { + struct hrtimer timer_trigger; + struct hrtimer timer_wde; + ktime_t trigger_delay; + ktime_t wde_interval; + struct device *dev; + struct gpio_desc *gpio_trigger; + struct gpio_desc *gpio_watchdog; + struct gpio_desc *gpio_kill; + bool kernel_panic; + struct notifier_block panic_notifier; +}; + +struct tps65086 { + struct device *dev; + struct regmap *regmap; + int irq; + struct regmap_irq_chip_data *irq_data; +}; + +struct tps65086_restart { + struct notifier_block handler; + struct device *dev; +}; + +enum vexpress_reset_func { + FUNC_RESET = 0, + FUNC_SHUTDOWN = 1, + FUNC_REBOOT = 2, +}; + +struct syscon_reboot_context { + struct regmap *map; + u32 offset; + u32 value; + u32 mask; + struct notifier_block restart_handler; +}; + +enum power_supply_notifier_events { + PSY_EVENT_PROP_CHANGED = 0, +}; + +struct power_supply_battery_ocv_table { + int ocv; + int capacity; +}; + +struct power_supply_resistance_temp_table { + int temp; + int resistance; +}; + +struct power_supply_battery_info { + unsigned int technology; + int energy_full_design_uwh; + int charge_full_design_uah; + int voltage_min_design_uv; + int voltage_max_design_uv; + int tricklecharge_current_ua; + int precharge_current_ua; + int precharge_voltage_max_uv; + int charge_term_current_ua; + int charge_restart_voltage_uv; + int overvoltage_limit_uv; + int constant_charge_current_max_ua; + int constant_charge_voltage_max_uv; + int factory_internal_resistance_uohm; + int ocv_temp[20]; + int temp_ambient_alert_min; + int temp_ambient_alert_max; + int temp_alert_min; + int temp_alert_max; + int temp_min; + int temp_max; + struct power_supply_battery_ocv_table *ocv_table[20]; + int ocv_table_size[20]; + struct power_supply_resistance_temp_table *resist_table; + int resist_table_size; +}; + +struct psy_am_i_supplied_data { + struct power_supply *psy; + unsigned int count; +}; + +enum { + POWER_SUPPLY_CHARGE_TYPE_UNKNOWN = 0, + POWER_SUPPLY_CHARGE_TYPE_NONE = 1, + POWER_SUPPLY_CHARGE_TYPE_TRICKLE = 2, + POWER_SUPPLY_CHARGE_TYPE_FAST = 3, + POWER_SUPPLY_CHARGE_TYPE_STANDARD = 4, + POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE = 5, + POWER_SUPPLY_CHARGE_TYPE_CUSTOM = 6, + POWER_SUPPLY_CHARGE_TYPE_LONGLIFE = 7, +}; + +enum { + POWER_SUPPLY_HEALTH_UNKNOWN = 0, + POWER_SUPPLY_HEALTH_GOOD = 1, + POWER_SUPPLY_HEALTH_OVERHEAT = 2, + POWER_SUPPLY_HEALTH_DEAD = 3, + POWER_SUPPLY_HEALTH_OVERVOLTAGE = 4, + POWER_SUPPLY_HEALTH_UNSPEC_FAILURE = 5, + POWER_SUPPLY_HEALTH_COLD = 6, + POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE = 7, + POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE = 8, + POWER_SUPPLY_HEALTH_OVERCURRENT = 9, + POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED = 10, + POWER_SUPPLY_HEALTH_WARM = 11, + POWER_SUPPLY_HEALTH_COOL = 12, + POWER_SUPPLY_HEALTH_HOT = 13, +}; + +enum { + POWER_SUPPLY_SCOPE_UNKNOWN = 0, + POWER_SUPPLY_SCOPE_SYSTEM = 1, + POWER_SUPPLY_SCOPE_DEVICE = 2, +}; + +struct power_supply_attr { + const char *prop_name; + char attr_name[31]; + struct device_attribute dev_attr; + const char * const *text_values; + int text_values_len; +}; + +enum hwmon_sensor_types { + hwmon_chip = 0, + hwmon_temp = 1, + hwmon_in = 2, + hwmon_curr = 3, + hwmon_power = 4, + hwmon_energy = 5, + hwmon_humidity = 6, + hwmon_fan = 7, + hwmon_pwm = 8, + hwmon_intrusion = 9, + hwmon_max = 10, +}; + +enum hwmon_temp_attributes { + hwmon_temp_enable = 0, + hwmon_temp_input = 1, + hwmon_temp_type = 2, + hwmon_temp_lcrit = 3, + hwmon_temp_lcrit_hyst = 4, + hwmon_temp_min = 5, + hwmon_temp_min_hyst = 6, + hwmon_temp_max = 7, + hwmon_temp_max_hyst = 8, + hwmon_temp_crit = 9, + hwmon_temp_crit_hyst = 10, + hwmon_temp_emergency = 11, + hwmon_temp_emergency_hyst = 12, + hwmon_temp_alarm = 13, + hwmon_temp_lcrit_alarm = 14, + hwmon_temp_min_alarm = 15, + hwmon_temp_max_alarm = 16, + hwmon_temp_crit_alarm = 17, + hwmon_temp_emergency_alarm = 18, + hwmon_temp_fault = 19, + hwmon_temp_offset = 20, + hwmon_temp_label = 21, + hwmon_temp_lowest = 22, + hwmon_temp_highest = 23, + hwmon_temp_reset_history = 24, + hwmon_temp_rated_min = 25, + hwmon_temp_rated_max = 26, +}; + +enum hwmon_in_attributes { + hwmon_in_enable = 0, + hwmon_in_input = 1, + hwmon_in_min = 2, + hwmon_in_max = 3, + hwmon_in_lcrit = 4, + hwmon_in_crit = 5, + hwmon_in_average = 6, + hwmon_in_lowest = 7, + hwmon_in_highest = 8, + hwmon_in_reset_history = 9, + hwmon_in_label = 10, + hwmon_in_alarm = 11, + hwmon_in_min_alarm = 12, + hwmon_in_max_alarm = 13, + hwmon_in_lcrit_alarm = 14, + hwmon_in_crit_alarm = 15, + hwmon_in_rated_min = 16, + hwmon_in_rated_max = 17, +}; + +enum hwmon_curr_attributes { + hwmon_curr_enable = 0, + hwmon_curr_input = 1, + hwmon_curr_min = 2, + hwmon_curr_max = 3, + hwmon_curr_lcrit = 4, + hwmon_curr_crit = 5, + hwmon_curr_average = 6, + hwmon_curr_lowest = 7, + hwmon_curr_highest = 8, + hwmon_curr_reset_history = 9, + hwmon_curr_label = 10, + hwmon_curr_alarm = 11, + hwmon_curr_min_alarm = 12, + hwmon_curr_max_alarm = 13, + hwmon_curr_lcrit_alarm = 14, + hwmon_curr_crit_alarm = 15, + hwmon_curr_rated_min = 16, + hwmon_curr_rated_max = 17, +}; + +struct hwmon_ops { + umode_t (*is_visible)(const void *, enum hwmon_sensor_types, u32, int); + int (*read)(struct device *, enum hwmon_sensor_types, u32, int, long int *); + int (*read_string)(struct device *, enum hwmon_sensor_types, u32, int, const char **); + int (*write)(struct device *, enum hwmon_sensor_types, u32, int, long int); +}; + +struct hwmon_channel_info { + enum hwmon_sensor_types type; + const u32 *config; +}; + +struct hwmon_chip_info { + const struct hwmon_ops *ops; + const struct hwmon_channel_info **info; +}; + +struct power_supply_hwmon { + struct power_supply *psy; + long unsigned int *props; +}; + +struct hwmon_type_attr_list { + const u32 *attrs; + size_t n_attrs; +}; + +enum cm_batt_temp { + CM_BATT_OK = 0, + CM_BATT_OVERHEAT = 1, + CM_BATT_COLD = 2, +}; + +enum hwmon_chip_attributes { + hwmon_chip_temp_reset_history = 0, + hwmon_chip_in_reset_history = 1, + hwmon_chip_curr_reset_history = 2, + hwmon_chip_power_reset_history = 3, + hwmon_chip_register_tz = 4, + hwmon_chip_update_interval = 5, + hwmon_chip_alarms = 6, + hwmon_chip_samples = 7, + hwmon_chip_curr_samples = 8, + hwmon_chip_in_samples = 9, + hwmon_chip_power_samples = 10, + hwmon_chip_temp_samples = 11, +}; + +enum hwmon_power_attributes { + hwmon_power_enable = 0, + hwmon_power_average = 1, + hwmon_power_average_interval = 2, + hwmon_power_average_interval_max = 3, + hwmon_power_average_interval_min = 4, + hwmon_power_average_highest = 5, + hwmon_power_average_lowest = 6, + hwmon_power_average_max = 7, + hwmon_power_average_min = 8, + hwmon_power_input = 9, + hwmon_power_input_highest = 10, + hwmon_power_input_lowest = 11, + hwmon_power_reset_history = 12, + hwmon_power_accuracy = 13, + hwmon_power_cap = 14, + hwmon_power_cap_hyst = 15, + hwmon_power_cap_max = 16, + hwmon_power_cap_min = 17, + hwmon_power_min = 18, + hwmon_power_max = 19, + hwmon_power_crit = 20, + hwmon_power_lcrit = 21, + hwmon_power_label = 22, + hwmon_power_alarm = 23, + hwmon_power_cap_alarm = 24, + hwmon_power_min_alarm = 25, + hwmon_power_max_alarm = 26, + hwmon_power_lcrit_alarm = 27, + hwmon_power_crit_alarm = 28, + hwmon_power_rated_min = 29, + hwmon_power_rated_max = 30, +}; + +enum hwmon_energy_attributes { + hwmon_energy_enable = 0, + hwmon_energy_input = 1, + hwmon_energy_label = 2, +}; + +enum hwmon_humidity_attributes { + hwmon_humidity_enable = 0, + hwmon_humidity_input = 1, + hwmon_humidity_label = 2, + hwmon_humidity_min = 3, + hwmon_humidity_min_hyst = 4, + hwmon_humidity_max = 5, + hwmon_humidity_max_hyst = 6, + hwmon_humidity_alarm = 7, + hwmon_humidity_fault = 8, + hwmon_humidity_rated_min = 9, + hwmon_humidity_rated_max = 10, +}; + +enum hwmon_fan_attributes { + hwmon_fan_enable = 0, + hwmon_fan_input = 1, + hwmon_fan_label = 2, + hwmon_fan_min = 3, + hwmon_fan_max = 4, + hwmon_fan_div = 5, + hwmon_fan_pulses = 6, + hwmon_fan_target = 7, + hwmon_fan_alarm = 8, + hwmon_fan_min_alarm = 9, + hwmon_fan_max_alarm = 10, + hwmon_fan_fault = 11, +}; + +enum hwmon_pwm_attributes { + hwmon_pwm_input = 0, + hwmon_pwm_enable = 1, + hwmon_pwm_mode = 2, + hwmon_pwm_freq = 3, +}; + +enum hwmon_intrusion_attributes { + hwmon_intrusion_alarm = 0, + hwmon_intrusion_beep = 1, +}; + +struct trace_event_raw_hwmon_attr_class { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + long int val; + char __data[0]; +}; + +struct trace_event_raw_hwmon_attr_show_string { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + u32 __data_loc_label; + char __data[0]; +}; + +struct trace_event_data_offsets_hwmon_attr_class { + u32 attr_name; +}; + +struct trace_event_data_offsets_hwmon_attr_show_string { + u32 attr_name; + u32 label; +}; + +typedef void (*btf_trace_hwmon_attr_show)(void *, int, const char *, long int); + +typedef void (*btf_trace_hwmon_attr_store)(void *, int, const char *, long int); + +typedef void (*btf_trace_hwmon_attr_show_string)(void *, int, const char *, const char *); + +struct hwmon_device { + const char *name; + struct device dev; + const struct hwmon_chip_info *chip; + struct list_head tzdata; + struct attribute_group group; + const struct attribute_group **groups; +}; + +struct hwmon_device_attribute { + struct device_attribute dev_attr; + const struct hwmon_ops *ops; + enum hwmon_sensor_types type; + u32 attr; + int index; + char name[32]; +}; + +struct hwmon_thermal_data { + struct list_head node; + struct device *dev; + int index; + struct thermal_zone_device *tzd; +}; + +struct thermal_attr { + struct device_attribute attr; + char name[20]; +}; + +struct devfreq_dev_status { + long unsigned int total_time; + long unsigned int busy_time; + long unsigned int current_frequency; + void *private_data; +}; + +struct trace_event_raw_thermal_temperature { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int temp_prev; + int temp; + char __data[0]; +}; + +struct trace_event_raw_cdev_update { + struct trace_entry ent; + u32 __data_loc_type; + long unsigned int target; + char __data[0]; +}; + +struct trace_event_raw_thermal_zone_trip { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int trip; + enum thermal_trip_type trip_type; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_cpu_get_power { + struct trace_entry ent; + u32 __data_loc_cpumask; + long unsigned int freq; + u32 __data_loc_load; + size_t load_len; + u32 dynamic_power; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_cpu_limit { + struct trace_entry ent; + u32 __data_loc_cpumask; + unsigned int freq; + long unsigned int cdev_state; + u32 power; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_devfreq_get_power { + struct trace_entry ent; + u32 __data_loc_type; + long unsigned int freq; + u32 busy_time; + u32 total_time; + u32 power; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_devfreq_limit { + struct trace_entry ent; + u32 __data_loc_type; + unsigned int freq; + long unsigned int cdev_state; + u32 power; + char __data[0]; +}; + +struct trace_event_data_offsets_thermal_temperature { + u32 thermal_zone; +}; + +struct trace_event_data_offsets_cdev_update { + u32 type; +}; + +struct trace_event_data_offsets_thermal_zone_trip { + u32 thermal_zone; +}; + +struct trace_event_data_offsets_thermal_power_cpu_get_power { + u32 cpumask; + u32 load; +}; + +struct trace_event_data_offsets_thermal_power_cpu_limit { + u32 cpumask; +}; + +struct trace_event_data_offsets_thermal_power_devfreq_get_power { + u32 type; +}; + +struct trace_event_data_offsets_thermal_power_devfreq_limit { + u32 type; +}; + +typedef void (*btf_trace_thermal_temperature)(void *, struct thermal_zone_device *); + +typedef void (*btf_trace_cdev_update)(void *, struct thermal_cooling_device *, long unsigned int); + +typedef void (*btf_trace_thermal_zone_trip)(void *, struct thermal_zone_device *, int, enum thermal_trip_type); + +typedef void (*btf_trace_thermal_power_cpu_get_power)(void *, const struct cpumask *, long unsigned int, u32 *, size_t, u32); + +typedef void (*btf_trace_thermal_power_cpu_limit)(void *, const struct cpumask *, unsigned int, long unsigned int, u32); + +typedef void (*btf_trace_thermal_power_devfreq_get_power)(void *, struct thermal_cooling_device *, struct devfreq_dev_status *, long unsigned int, u32); + +typedef void (*btf_trace_thermal_power_devfreq_limit)(void *, struct thermal_cooling_device *, long unsigned int, long unsigned int, u32); + +struct thermal_instance { + int id; + char name[20]; + struct thermal_zone_device *tz; + struct thermal_cooling_device *cdev; + int trip; + bool initialized; + long unsigned int upper; + long unsigned int lower; + long unsigned int target; + char attr_name[20]; + struct device_attribute attr; + char weight_attr_name[20]; + struct device_attribute weight_attr; + struct list_head tz_node; + struct list_head cdev_node; + unsigned int weight; +}; + +struct cooling_dev_stats { + spinlock_t lock; + unsigned int total_trans; + long unsigned int state; + long unsigned int max_states; + ktime_t last_time; + ktime_t *time_in_state; + unsigned int *trans_table; +}; + +struct genl_dumpit_info { + const struct genl_family *family; + struct genl_ops op; + struct nlattr **attrs; +}; + +enum thermal_genl_attr { + THERMAL_GENL_ATTR_UNSPEC = 0, + THERMAL_GENL_ATTR_TZ = 1, + THERMAL_GENL_ATTR_TZ_ID = 2, + THERMAL_GENL_ATTR_TZ_TEMP = 3, + THERMAL_GENL_ATTR_TZ_TRIP = 4, + THERMAL_GENL_ATTR_TZ_TRIP_ID = 5, + THERMAL_GENL_ATTR_TZ_TRIP_TYPE = 6, + THERMAL_GENL_ATTR_TZ_TRIP_TEMP = 7, + THERMAL_GENL_ATTR_TZ_TRIP_HYST = 8, + THERMAL_GENL_ATTR_TZ_MODE = 9, + THERMAL_GENL_ATTR_TZ_NAME = 10, + THERMAL_GENL_ATTR_TZ_CDEV_WEIGHT = 11, + THERMAL_GENL_ATTR_TZ_GOV = 12, + THERMAL_GENL_ATTR_TZ_GOV_NAME = 13, + THERMAL_GENL_ATTR_CDEV = 14, + THERMAL_GENL_ATTR_CDEV_ID = 15, + THERMAL_GENL_ATTR_CDEV_CUR_STATE = 16, + THERMAL_GENL_ATTR_CDEV_MAX_STATE = 17, + THERMAL_GENL_ATTR_CDEV_NAME = 18, + THERMAL_GENL_ATTR_GOV_NAME = 19, + __THERMAL_GENL_ATTR_MAX = 20, +}; + +enum thermal_genl_sampling { + THERMAL_GENL_SAMPLING_TEMP = 0, + __THERMAL_GENL_SAMPLING_MAX = 1, +}; + +enum thermal_genl_event { + THERMAL_GENL_EVENT_UNSPEC = 0, + THERMAL_GENL_EVENT_TZ_CREATE = 1, + THERMAL_GENL_EVENT_TZ_DELETE = 2, + THERMAL_GENL_EVENT_TZ_DISABLE = 3, + THERMAL_GENL_EVENT_TZ_ENABLE = 4, + THERMAL_GENL_EVENT_TZ_TRIP_UP = 5, + THERMAL_GENL_EVENT_TZ_TRIP_DOWN = 6, + THERMAL_GENL_EVENT_TZ_TRIP_CHANGE = 7, + THERMAL_GENL_EVENT_TZ_TRIP_ADD = 8, + THERMAL_GENL_EVENT_TZ_TRIP_DELETE = 9, + THERMAL_GENL_EVENT_CDEV_ADD = 10, + THERMAL_GENL_EVENT_CDEV_DELETE = 11, + THERMAL_GENL_EVENT_CDEV_STATE_UPDATE = 12, + THERMAL_GENL_EVENT_TZ_GOV_CHANGE = 13, + __THERMAL_GENL_EVENT_MAX = 14, +}; + +enum thermal_genl_cmd { + THERMAL_GENL_CMD_UNSPEC = 0, + THERMAL_GENL_CMD_TZ_GET_ID = 1, + THERMAL_GENL_CMD_TZ_GET_TRIP = 2, + THERMAL_GENL_CMD_TZ_GET_TEMP = 3, + THERMAL_GENL_CMD_TZ_GET_GOV = 4, + THERMAL_GENL_CMD_TZ_GET_MODE = 5, + THERMAL_GENL_CMD_CDEV_GET = 6, + __THERMAL_GENL_CMD_MAX = 7, +}; + +struct param { + struct nlattr **attrs; + struct sk_buff *msg; + const char *name; + int tz_id; + int cdev_id; + int trip_id; + int trip_temp; + int trip_type; + int trip_hyst; + int temp; + int cdev_state; + int cdev_max_state; +}; + +typedef int (*cb_t)(struct param *); + +struct thermal_hwmon_device { + char type[20]; + struct device *device; + int count; + struct list_head tz_list; + struct list_head node; +}; + +struct thermal_hwmon_attr { + struct device_attribute attr; + char name[16]; +}; + +struct thermal_hwmon_temp { + struct list_head hwmon_node; + struct thermal_zone_device *tz; + struct thermal_hwmon_attr temp_input; + struct thermal_hwmon_attr temp_crit; +}; + +struct thermal_trip { + struct device_node *np; + int temperature; + int hysteresis; + enum thermal_trip_type type; +}; + +struct __thermal_cooling_bind_param { + struct device_node *cooling_device; + long unsigned int min; + long unsigned int max; +}; + +struct __thermal_bind_params { + struct __thermal_cooling_bind_param *tcbp; + unsigned int count; + unsigned int trip_id; + unsigned int usage; +}; + +struct __thermal_zone { + int passive_delay; + int polling_delay; + int slope; + int offset; + int ntrips; + struct thermal_trip *trips; + int num_tbps; + struct __thermal_bind_params *tbps; + void *sensor_data; + const struct thermal_zone_of_device_ops *ops; +}; + +struct trace_event_raw_thermal_power_allocator { + struct trace_entry ent; + int tz_id; + u32 __data_loc_req_power; + u32 total_req_power; + u32 __data_loc_granted_power; + u32 total_granted_power; + size_t num_actors; + u32 power_range; + u32 max_allocatable_power; + int current_temp; + s32 delta_temp; + char __data[0]; +}; + +struct trace_event_raw_thermal_power_allocator_pid { + struct trace_entry ent; + int tz_id; + s32 err; + s32 err_integral; + s64 p; + s64 i; + s64 d; + s32 output; + char __data[0]; +}; + +struct trace_event_data_offsets_thermal_power_allocator { + u32 req_power; + u32 granted_power; +}; + +struct trace_event_data_offsets_thermal_power_allocator_pid {}; + +typedef void (*btf_trace_thermal_power_allocator)(void *, struct thermal_zone_device *, u32 *, u32, u32 *, u32, size_t, u32, u32, int, s32); + +typedef void (*btf_trace_thermal_power_allocator_pid)(void *, struct thermal_zone_device *, s32, s32, s64, s64, s64, s32); + +struct power_allocator_params { + bool allocated_tzp; + s64 err_integral; + s32 prev_err; + int trip_switch_on; + int trip_max_desired_temperature; + u32 sustainable_power; +}; + +struct cpufreq_cooling_device { + u32 last_load; + unsigned int cpufreq_state; + unsigned int max_level; + struct em_perf_domain *em; + struct cpufreq_policy *policy; + struct freq_qos_request qos_req; +}; + +struct idle_inject_device; + +struct cpuidle_cooling_device { + struct idle_inject_device *ii_dev; + long unsigned int state; +}; + +enum devfreq_timer { + DEVFREQ_TIMER_DEFERRABLE = 0, + DEVFREQ_TIMER_DELAYED = 1, + DEVFREQ_TIMER_NUM = 2, +}; + +struct devfreq_dev_profile { + long unsigned int initial_freq; + unsigned int polling_ms; + enum devfreq_timer timer; + bool is_cooling_device; + int (*target)(struct device *, long unsigned int *, u32); + int (*get_dev_status)(struct device *, struct devfreq_dev_status *); + int (*get_cur_freq)(struct device *, long unsigned int *); + void (*exit)(struct device *); + long unsigned int *freq_table; + unsigned int max_state; +}; + +struct devfreq_stats { + unsigned int total_trans; + unsigned int *trans_table; + u64 *time_in_state; + u64 last_update; +}; + +struct devfreq_governor; + +struct devfreq { + struct list_head node; + struct mutex lock; + struct device dev; + struct devfreq_dev_profile *profile; + const struct devfreq_governor *governor; + struct opp_table *opp_table; + struct notifier_block nb; + struct delayed_work work; + long unsigned int previous_freq; + struct devfreq_dev_status last_status; + void *data; + struct dev_pm_qos_request user_min_freq_req; + struct dev_pm_qos_request user_max_freq_req; + long unsigned int scaling_min_freq; + long unsigned int scaling_max_freq; + bool stop_polling; + long unsigned int suspend_freq; + long unsigned int resume_freq; + atomic_t suspend_count; + struct devfreq_stats stats; + struct srcu_notifier_head transition_notifier_list; + struct thermal_cooling_device *cdev; + struct notifier_block nb_min; + struct notifier_block nb_max; +}; + +struct devfreq_governor { + struct list_head node; + const char name[16]; + const u64 attrs; + const u64 flags; + int (*get_target_freq)(struct devfreq *, long unsigned int *); + int (*event_handler)(struct devfreq *, unsigned int, void *); +}; + +struct devfreq_cooling_power { + int (*get_real_power)(struct devfreq *, u32 *, long unsigned int, long unsigned int); +}; + +struct devfreq_cooling_device { + struct thermal_cooling_device *cdev; + struct devfreq *devfreq; + long unsigned int cooling_state; + u32 *freq_table; + size_t max_state; + struct devfreq_cooling_power *power_ops; + u32 res_util; + int capped_state; + struct dev_pm_qos_request req_max_freq; + struct em_perf_domain *em_pd; +}; + +struct armada_thermal_data; + +struct armada_thermal_priv { + struct device *dev; + struct regmap *syscon; + char zone_name[20]; + struct mutex update_lock; + struct armada_thermal_data *data; + struct thermal_zone_device *overheat_sensor; + int interrupt_source; + int current_channel; + long int current_threshold; + long int current_hysteresis; +}; + +struct armada_thermal_data { + void (*init)(struct platform_device *, struct armada_thermal_priv *); + s64 coef_b; + s64 coef_m; + u32 coef_div; + bool inverted; + bool signed_sample; + unsigned int temp_shift; + unsigned int temp_mask; + unsigned int thresh_shift; + unsigned int hyst_shift; + unsigned int hyst_mask; + u32 is_valid_bit; + unsigned int syscon_control0_off; + unsigned int syscon_control1_off; + unsigned int syscon_status_off; + unsigned int dfx_irq_cause_off; + unsigned int dfx_irq_mask_off; + unsigned int dfx_overheat_irq; + unsigned int dfx_server_irq_mask_off; + unsigned int dfx_server_irq_en; + unsigned int cpu_nr; +}; + +enum drvtype { + LEGACY = 0, + SYSCON = 1, +}; + +struct armada_drvdata { + enum drvtype type; + union { + struct armada_thermal_priv *priv; + struct thermal_zone_device *tz; + } data; +}; + +struct armada_thermal_sensor { + struct armada_thermal_priv *priv; + int id; +}; + +struct watchdog_info { + __u32 options; + __u32 firmware_version; + __u8 identity[32]; +}; + +struct watchdog_device; + +struct watchdog_ops { + struct module *owner; + int (*start)(struct watchdog_device *); + int (*stop)(struct watchdog_device *); + int (*ping)(struct watchdog_device *); + unsigned int (*status)(struct watchdog_device *); + int (*set_timeout)(struct watchdog_device *, unsigned int); + int (*set_pretimeout)(struct watchdog_device *, unsigned int); + unsigned int (*get_timeleft)(struct watchdog_device *); + int (*restart)(struct watchdog_device *, long unsigned int, void *); + long int (*ioctl)(struct watchdog_device *, unsigned int, long unsigned int); +}; + +struct watchdog_governor; + +struct watchdog_core_data; + +struct watchdog_device { + int id; + struct device *parent; + const struct attribute_group **groups; + const struct watchdog_info *info; + const struct watchdog_ops *ops; + const struct watchdog_governor *gov; + unsigned int bootstatus; + unsigned int timeout; + unsigned int pretimeout; + unsigned int min_timeout; + unsigned int max_timeout; + unsigned int min_hw_heartbeat_ms; + unsigned int max_hw_heartbeat_ms; + struct notifier_block reboot_nb; + struct notifier_block restart_nb; + struct notifier_block pm_nb; + void *driver_data; + struct watchdog_core_data *wd_data; + long unsigned int status; + struct list_head deferred; +}; + +struct watchdog_governor { + const char name[20]; + void (*pretimeout)(struct watchdog_device *); +}; + +struct watchdog_core_data { + struct device dev; + struct cdev cdev; + struct watchdog_device *wdd; + struct mutex lock; + ktime_t last_keepalive; + ktime_t last_hw_keepalive; + ktime_t open_deadline; + struct hrtimer timer; + struct kthread_work work; + long unsigned int status; +}; + +struct watchdog_pretimeout { + struct watchdog_device *wdd; + struct list_head entry; +}; + +struct governor_priv { + struct watchdog_governor *gov; + struct list_head entry; +}; + +struct rtd119x_watchdog_device { + struct watchdog_device wdt_dev; + void *base; + struct clk *clk; +}; + +struct mdp_device_descriptor_s { + __u32 number; + __u32 major; + __u32 minor; + __u32 raid_disk; + __u32 state; + __u32 reserved[27]; +}; + +typedef struct mdp_device_descriptor_s mdp_disk_t; + +struct mdp_superblock_s { + __u32 md_magic; + __u32 major_version; + __u32 minor_version; + __u32 patch_version; + __u32 gvalid_words; + __u32 set_uuid0; + __u32 ctime; + __u32 level; + __u32 size; + __u32 nr_disks; + __u32 raid_disks; + __u32 md_minor; + __u32 not_persistent; + __u32 set_uuid1; + __u32 set_uuid2; + __u32 set_uuid3; + __u32 gstate_creserved[16]; + __u32 utime; + __u32 state; + __u32 active_disks; + __u32 working_disks; + __u32 failed_disks; + __u32 spare_disks; + __u32 sb_csum; + __u32 events_lo; + __u32 events_hi; + __u32 cp_events_lo; + __u32 cp_events_hi; + __u32 recovery_cp; + __u64 reshape_position; + __u32 new_level; + __u32 delta_disks; + __u32 new_layout; + __u32 new_chunk; + __u32 gstate_sreserved[14]; + __u32 layout; + __u32 chunk_size; + __u32 root_pv; + __u32 root_block; + __u32 pstate_reserved[60]; + mdp_disk_t disks[27]; + __u32 reserved[0]; + mdp_disk_t this_disk; +}; + +typedef struct mdp_superblock_s mdp_super_t; + +struct mdp_superblock_1 { + __le32 magic; + __le32 major_version; + __le32 feature_map; + __le32 pad0; + __u8 set_uuid[16]; + char set_name[32]; + __le64 ctime; + __le32 level; + __le32 layout; + __le64 size; + __le32 chunksize; + __le32 raid_disks; + union { + __le32 bitmap_offset; + struct { + __le16 offset; + __le16 size; + } ppl; + }; + __le32 new_level; + __le64 reshape_position; + __le32 delta_disks; + __le32 new_layout; + __le32 new_chunk; + __le32 new_offset; + __le64 data_offset; + __le64 data_size; + __le64 super_offset; + union { + __le64 recovery_offset; + __le64 journal_tail; + }; + __le32 dev_number; + __le32 cnt_corrected_read; + __u8 device_uuid[16]; + __u8 devflags; + __u8 bblog_shift; + __le16 bblog_size; + __le32 bblog_offset; + __le64 utime; + __le64 events; + __le64 resync_offset; + __le32 sb_csum; + __le32 max_dev; + __u8 pad3[32]; + __le16 dev_roles[0]; +}; + +struct mdu_version_s { + int major; + int minor; + int patchlevel; +}; + +typedef struct mdu_version_s mdu_version_t; + +struct mdu_array_info_s { + int major_version; + int minor_version; + int patch_version; + unsigned int ctime; + int level; + int size; + int nr_disks; + int raid_disks; + int md_minor; + int not_persistent; + unsigned int utime; + int state; + int active_disks; + int working_disks; + int failed_disks; + int spare_disks; + int layout; + int chunk_size; +}; + +typedef struct mdu_array_info_s mdu_array_info_t; + +struct mdu_disk_info_s { + int number; + int major; + int minor; + int raid_disk; + int state; +}; + +typedef struct mdu_disk_info_s mdu_disk_info_t; + +struct mdu_bitmap_file_s { + char pathname[4096]; +}; + +typedef struct mdu_bitmap_file_s mdu_bitmap_file_t; + +struct mddev; + +struct md_rdev; + +struct md_cluster_operations { + int (*join)(struct mddev *, int); + int (*leave)(struct mddev *); + int (*slot_number)(struct mddev *); + int (*resync_info_update)(struct mddev *, sector_t, sector_t); + void (*resync_info_get)(struct mddev *, sector_t *, sector_t *); + int (*metadata_update_start)(struct mddev *); + int (*metadata_update_finish)(struct mddev *); + void (*metadata_update_cancel)(struct mddev *); + int (*resync_start)(struct mddev *); + int (*resync_finish)(struct mddev *); + int (*area_resyncing)(struct mddev *, int, sector_t, sector_t); + int (*add_new_disk)(struct mddev *, struct md_rdev *); + void (*add_new_disk_cancel)(struct mddev *); + int (*new_disk_ack)(struct mddev *, bool); + int (*remove_disk)(struct mddev *, struct md_rdev *); + void (*load_bitmaps)(struct mddev *, int); + int (*gather_bitmaps)(struct md_rdev *); + int (*resize_bitmaps)(struct mddev *, sector_t, sector_t); + int (*lock_all_bitmaps)(struct mddev *); + void (*unlock_all_bitmaps)(struct mddev *); + void (*update_size)(struct mddev *, sector_t); +}; + +struct md_cluster_info; + +struct md_personality; + +struct md_thread; + +struct bitmap; + +struct mddev { + void *private; + struct md_personality *pers; + dev_t unit; + int md_minor; + struct list_head disks; + long unsigned int flags; + long unsigned int sb_flags; + int suspended; + atomic_t active_io; + int ro; + int sysfs_active; + struct gendisk *gendisk; + struct kobject kobj; + int hold_active; + int major_version; + int minor_version; + int patch_version; + int persistent; + int external; + char metadata_type[17]; + int chunk_sectors; + time64_t ctime; + time64_t utime; + int level; + int layout; + char clevel[16]; + int raid_disks; + int max_disks; + sector_t dev_sectors; + sector_t array_sectors; + int external_size; + __u64 events; + int can_decrease_events; + char uuid[16]; + sector_t reshape_position; + int delta_disks; + int new_level; + int new_layout; + int new_chunk_sectors; + int reshape_backwards; + struct md_thread *thread; + struct md_thread *sync_thread; + char *last_sync_action; + sector_t curr_resync; + sector_t curr_resync_completed; + long unsigned int resync_mark; + sector_t resync_mark_cnt; + sector_t curr_mark_cnt; + sector_t resync_max_sectors; + atomic64_t resync_mismatches; + sector_t suspend_lo; + sector_t suspend_hi; + int sync_speed_min; + int sync_speed_max; + int parallel_resync; + int ok_start_degraded; + long unsigned int recovery; + int recovery_disabled; + int in_sync; + struct mutex open_mutex; + struct mutex reconfig_mutex; + atomic_t active; + atomic_t openers; + int changed; + int degraded; + atomic_t recovery_active; + wait_queue_head_t recovery_wait; + sector_t recovery_cp; + sector_t resync_min; + sector_t resync_max; + struct kernfs_node *sysfs_state; + struct kernfs_node *sysfs_action; + struct kernfs_node *sysfs_completed; + struct kernfs_node *sysfs_degraded; + struct kernfs_node *sysfs_level; + struct work_struct del_work; + spinlock_t lock; + wait_queue_head_t sb_wait; + atomic_t pending_writes; + unsigned int safemode; + unsigned int safemode_delay; + struct timer_list safemode_timer; + struct percpu_ref writes_pending; + int sync_checkers; + struct request_queue *queue; + struct bitmap *bitmap; + struct { + struct file *file; + loff_t offset; + long unsigned int space; + loff_t default_offset; + long unsigned int default_space; + struct mutex mutex; + long unsigned int chunksize; + long unsigned int daemon_sleep; + long unsigned int max_write_behind; + int external; + int nodes; + char cluster_name[64]; + } bitmap_info; + atomic_t max_corr_read_errors; + struct list_head all_mddevs; + const struct attribute_group *to_remove; + struct bio_set bio_set; + struct bio_set sync_set; + struct bio_set io_acct_set; + struct bio *flush_bio; + atomic_t flush_pending; + ktime_t start_flush; + ktime_t prev_flush_start; + struct work_struct flush_work; + struct work_struct event_work; + mempool_t *serial_info_pool; + void (*sync_super)(struct mddev *, struct md_rdev *); + struct md_cluster_info *cluster_info; + unsigned int good_device_nr; + unsigned int noio_flag; + bool has_superblocks: 1; + bool fail_last_dev: 1; + bool serialize_policy: 1; +}; + +struct serial_in_rdev; + +struct md_rdev { + struct list_head same_set; + sector_t sectors; + struct mddev *mddev; + int last_events; + struct block_device *meta_bdev; + struct block_device *bdev; + struct page *sb_page; + struct page *bb_page; + int sb_loaded; + __u64 sb_events; + sector_t data_offset; + sector_t new_data_offset; + sector_t sb_start; + int sb_size; + int preferred_minor; + struct kobject kobj; + long unsigned int flags; + wait_queue_head_t blocked_wait; + int desc_nr; + int raid_disk; + int new_raid_disk; + int saved_raid_disk; + union { + sector_t recovery_offset; + sector_t journal_tail; + }; + atomic_t nr_pending; + atomic_t read_errors; + time64_t last_read_error; + atomic_t corrected_errors; + struct serial_in_rdev *serial; + struct work_struct del_work; + struct kernfs_node *sysfs_state; + struct kernfs_node *sysfs_unack_badblocks; + struct kernfs_node *sysfs_badblocks; + struct badblocks badblocks; + struct { + short int offset; + unsigned int size; + sector_t sector; + } ppl; +}; + +struct serial_in_rdev { + struct rb_root_cached serial_rb; + spinlock_t serial_lock; + wait_queue_head_t serial_io_wait; +}; + +enum flag_bits { + Faulty = 0, + In_sync = 1, + Bitmap_sync = 2, + WriteMostly = 3, + AutoDetected = 4, + Blocked = 5, + WriteErrorSeen = 6, + FaultRecorded = 7, + BlockedBadBlocks = 8, + WantReplacement = 9, + Replacement = 10, + Candidate = 11, + Journal = 12, + ClusterRemove = 13, + RemoveSynchronized = 14, + ExternalBbl = 15, + FailFast = 16, + LastDev = 17, + CollisionCheck = 18, +}; + +enum mddev_flags { + MD_ARRAY_FIRST_USE = 0, + MD_CLOSING = 1, + MD_JOURNAL_CLEAN = 2, + MD_HAS_JOURNAL = 3, + MD_CLUSTER_RESYNC_LOCKED = 4, + MD_FAILFAST_SUPPORTED = 5, + MD_HAS_PPL = 6, + MD_HAS_MULTIPLE_PPLS = 7, + MD_ALLOW_SB_UPDATE = 8, + MD_UPDATING_SB = 9, + MD_NOT_READY = 10, + MD_BROKEN = 11, +}; + +enum mddev_sb_flags { + MD_SB_CHANGE_DEVS = 0, + MD_SB_CHANGE_CLEAN = 1, + MD_SB_CHANGE_PENDING = 2, + MD_SB_NEED_REWRITE = 3, +}; + +struct md_personality { + char *name; + int level; + struct list_head list; + struct module *owner; + bool (*make_request)(struct mddev *, struct bio *); + int (*run)(struct mddev *); + int (*start)(struct mddev *); + void (*free)(struct mddev *, void *); + void (*status)(struct seq_file *, struct mddev *); + void (*error_handler)(struct mddev *, struct md_rdev *); + int (*hot_add_disk)(struct mddev *, struct md_rdev *); + int (*hot_remove_disk)(struct mddev *, struct md_rdev *); + int (*spare_active)(struct mddev *); + sector_t (*sync_request)(struct mddev *, sector_t, int *); + int (*resize)(struct mddev *, sector_t); + sector_t (*size)(struct mddev *, sector_t, int); + int (*check_reshape)(struct mddev *); + int (*start_reshape)(struct mddev *); + void (*finish_reshape)(struct mddev *); + void (*update_reshape_pos)(struct mddev *); + void (*quiesce)(struct mddev *, int); + void * (*takeover)(struct mddev *); + int (*change_consistency_policy)(struct mddev *, const char *); +}; + +struct md_thread { + void (*run)(struct md_thread *); + struct mddev *mddev; + wait_queue_head_t wqueue; + long unsigned int flags; + struct task_struct *tsk; + long unsigned int timeout; + void *private; +}; + +struct bitmap_page; + +struct bitmap_counts { + spinlock_t lock; + struct bitmap_page *bp; + long unsigned int pages; + long unsigned int missing_pages; + long unsigned int chunkshift; + long unsigned int chunks; +}; + +struct bitmap_storage { + struct file *file; + struct page *sb_page; + struct page **filemap; + long unsigned int *filemap_attr; + long unsigned int file_pages; + long unsigned int bytes; +}; + +struct bitmap { + struct bitmap_counts counts; + struct mddev *mddev; + __u64 events_cleared; + int need_sync; + struct bitmap_storage storage; + long unsigned int flags; + int allclean; + atomic_t behind_writes; + long unsigned int behind_writes_used; + long unsigned int daemon_lastrun; + long unsigned int last_end_sync; + atomic_t pending_writes; + wait_queue_head_t write_wait; + wait_queue_head_t overflow_wait; + wait_queue_head_t behind_wait; + struct kernfs_node *sysfs_can_clear; + int cluster_slot; +}; + +enum recovery_flags { + MD_RECOVERY_RUNNING = 0, + MD_RECOVERY_SYNC = 1, + MD_RECOVERY_RECOVER = 2, + MD_RECOVERY_INTR = 3, + MD_RECOVERY_DONE = 4, + MD_RECOVERY_NEEDED = 5, + MD_RECOVERY_REQUESTED = 6, + MD_RECOVERY_CHECK = 7, + MD_RECOVERY_RESHAPE = 8, + MD_RECOVERY_FROZEN = 9, + MD_RECOVERY_ERROR = 10, + MD_RECOVERY_WAIT = 11, + MD_RESYNCING_REMOTE = 12, +}; + +struct md_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct mddev *, char *); + ssize_t (*store)(struct mddev *, const char *, size_t); +}; + +struct md_io_acct { + struct bio *orig_bio; + long unsigned int start_time; + struct bio bio_clone; +}; + +struct bitmap_page { + char *map; + unsigned int hijacked: 1; + unsigned int pending: 1; + unsigned int count: 30; +}; + +struct super_type { + char *name; + struct module *owner; + int (*load_super)(struct md_rdev *, struct md_rdev *, int); + int (*validate_super)(struct mddev *, struct md_rdev *); + void (*sync_super)(struct mddev *, struct md_rdev *); + long long unsigned int (*rdev_size_change)(struct md_rdev *, sector_t); + int (*allow_new_offset)(struct md_rdev *, long long unsigned int); +}; + +struct rdev_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct md_rdev *, char *); + ssize_t (*store)(struct md_rdev *, const char *, size_t); +}; + +enum array_state { + clear = 0, + inactive = 1, + suspended = 2, + readonly = 3, + read_auto = 4, + clean = 5, + active = 6, + write_pending = 7, + active_idle = 8, + broken = 9, + bad_word = 10, +}; + +struct detected_devices_node { + struct list_head list; + dev_t dev; +}; + +struct blkcg___2; + +typedef __u16 bitmap_counter_t; + +enum bitmap_state { + BITMAP_STALE = 1, + BITMAP_WRITE_ERROR = 2, + BITMAP_HOSTENDIAN = 15, +}; + +struct bitmap_super_s { + __le32 magic; + __le32 version; + __u8 uuid[16]; + __le64 events; + __le64 events_cleared; + __le64 sync_size; + __le32 state; + __le32 chunksize; + __le32 daemon_sleep; + __le32 write_behind; + __le32 sectors_reserved; + __le32 nodes; + __u8 cluster_name[64]; + __u8 pad[120]; +}; + +typedef struct bitmap_super_s bitmap_super_t; + +enum bitmap_page_attr { + BITMAP_PAGE_DIRTY = 0, + BITMAP_PAGE_PENDING = 1, + BITMAP_PAGE_NEEDWRITE = 2, +}; + +struct md_setup_args { + int minor; + int partitioned; + int level; + int chunk; + char *device_names; +}; + +struct dm_ioctl { + __u32 version[3]; + __u32 data_size; + __u32 data_start; + __u32 target_count; + __s32 open_count; + __u32 flags; + __u32 event_nr; + __u32 padding; + __u64 dev; + char name[128]; + char uuid[129]; + char data[7]; +}; + +struct dm_target_spec { + __u64 sector_start; + __u64 length; + __s32 status; + __u32 next; + char target_type[16]; +}; + +struct dm_device { + struct dm_ioctl dmi; + struct dm_target_spec *table[256]; + char *target_args_array[256]; + struct list_head list; +}; + +typedef enum { + STATUSTYPE_INFO = 0, + STATUSTYPE_TABLE = 1, + STATUSTYPE_IMA = 2, +} status_type_t; + +union map_info___2 { + void *ptr; +}; + +struct dm_target; + +typedef int (*dm_ctr_fn)(struct dm_target *, unsigned int, char **); + +struct dm_table; + +struct target_type; + +struct dm_target { + struct dm_table *table; + struct target_type *type; + sector_t begin; + sector_t len; + uint32_t max_io_len; + unsigned int num_flush_bios; + unsigned int num_discard_bios; + unsigned int num_secure_erase_bios; + unsigned int num_write_same_bios; + unsigned int num_write_zeroes_bios; + unsigned int per_io_data_size; + void *private; + char *error; + bool flush_supported: 1; + bool discards_supported: 1; + bool limit_swap_bios: 1; + bool emulate_zone_append: 1; +}; + +typedef void (*dm_dtr_fn)(struct dm_target *); + +typedef int (*dm_map_fn)(struct dm_target *, struct bio *); + +typedef int (*dm_clone_and_map_request_fn)(struct dm_target *, struct request *, union map_info___2 *, struct request **); + +typedef void (*dm_release_clone_request_fn)(struct request *, union map_info___2 *); + +typedef int (*dm_endio_fn)(struct dm_target *, struct bio *, blk_status_t *); + +typedef int (*dm_request_endio_fn)(struct dm_target *, struct request *, blk_status_t, union map_info___2 *); + +typedef void (*dm_presuspend_fn)(struct dm_target *); + +typedef void (*dm_presuspend_undo_fn)(struct dm_target *); + +typedef void (*dm_postsuspend_fn)(struct dm_target *); + +typedef int (*dm_preresume_fn)(struct dm_target *); + +typedef void (*dm_resume_fn)(struct dm_target *); + +typedef void (*dm_status_fn)(struct dm_target *, status_type_t, unsigned int, char *, unsigned int); + +typedef int (*dm_message_fn)(struct dm_target *, unsigned int, char **, char *, unsigned int); + +typedef int (*dm_prepare_ioctl_fn)(struct dm_target *, struct block_device **); + +struct dm_report_zones_args; + +typedef int (*dm_report_zones_fn)(struct dm_target *, struct dm_report_zones_args *, unsigned int); + +struct dm_report_zones_args { + struct dm_target *tgt; + sector_t next_sector; + void *orig_data; + report_zones_cb orig_cb; + unsigned int zone_idx; + sector_t start; +}; + +struct dm_dev; + +typedef int (*iterate_devices_callout_fn)(struct dm_target *, struct dm_dev *, sector_t, sector_t, void *); + +struct dm_dev { + struct block_device *bdev; + struct dax_device *dax_dev; + fmode_t mode; + char name[16]; +}; + +typedef int (*dm_iterate_devices_fn)(struct dm_target *, iterate_devices_callout_fn, void *); + +typedef void (*dm_io_hints_fn)(struct dm_target *, struct queue_limits *); + +typedef int (*dm_busy_fn)(struct dm_target *); + +typedef long int (*dm_dax_direct_access_fn)(struct dm_target *, long unsigned int, long int, void **, pfn_t *); + +typedef size_t (*dm_dax_copy_iter_fn)(struct dm_target *, long unsigned int, void *, size_t, struct iov_iter *); + +typedef int (*dm_dax_zero_page_range_fn)(struct dm_target *, long unsigned int, size_t); + +struct target_type { + uint64_t features; + const char *name; + struct module *module; + unsigned int version[3]; + dm_ctr_fn ctr; + dm_dtr_fn dtr; + dm_map_fn map; + dm_clone_and_map_request_fn clone_and_map_rq; + dm_release_clone_request_fn release_clone_rq; + dm_endio_fn end_io; + dm_request_endio_fn rq_end_io; + dm_presuspend_fn presuspend; + dm_presuspend_undo_fn presuspend_undo; + dm_postsuspend_fn postsuspend; + dm_preresume_fn preresume; + dm_resume_fn resume; + dm_status_fn status; + dm_message_fn message; + dm_prepare_ioctl_fn prepare_ioctl; + dm_report_zones_fn report_zones; + dm_busy_fn busy; + dm_iterate_devices_fn iterate_devices; + dm_io_hints_fn io_hints; + dm_dax_direct_access_fn direct_access; + dm_dax_copy_iter_fn dax_copy_from_iter; + dm_dax_copy_iter_fn dax_copy_to_iter; + dm_dax_zero_page_range_fn dax_zero_page_range; + struct list_head list; +}; + +enum dm_uevent_type { + DM_UEVENT_PATH_FAILED = 0, + DM_UEVENT_PATH_REINSTATED = 1, +}; + +struct mapped_device; + +struct dm_uevent { + struct mapped_device *md; + enum kobject_action action; + struct kobj_uevent_env ku_env; + struct list_head elist; + char name[128]; + char uuid[129]; +}; + +enum dm_queue_mode { + DM_TYPE_NONE = 0, + DM_TYPE_BIO_BASED = 1, + DM_TYPE_REQUEST_BASED = 2, + DM_TYPE_DAX_BIO_BASED = 3, +}; + +struct mapped_device___2; + +struct dm_md_mempools; + +struct dm_table { + struct mapped_device___2 *md; + enum dm_queue_mode type; + unsigned int depth; + unsigned int counts[16]; + sector_t *index[16]; + unsigned int num_targets; + unsigned int num_allocated; + sector_t *highs; + struct dm_target *targets; + struct target_type *immutable_target_type; + bool integrity_supported: 1; + bool singleton: 1; + unsigned int integrity_added: 1; + fmode_t mode; + struct list_head devices; + void (*event_fn)(void *); + void *event_context; + struct dm_md_mempools *mempools; + struct blk_crypto_profile *crypto_profile; +}; + +struct dm_stats_last_position; + +struct dm_stats { + struct mutex mutex; + struct list_head list; + struct dm_stats_last_position *last; + sector_t last_sector; + unsigned int last_rw; +}; + +struct dm_stats_aux { + bool merged; + long long unsigned int duration_ns; +}; + +struct dm_ima_device_table_metadata { + char *device_metadata; + unsigned int device_metadata_len; + unsigned int num_targets; + char *hash; + unsigned int hash_len; +}; + +struct dm_ima_measurements { + struct dm_ima_device_table_metadata active_table; + struct dm_ima_device_table_metadata inactive_table; + unsigned int dm_version_str_len; +}; + +struct dm_kobject_holder { + struct kobject kobj; + struct completion completion; +}; + +struct mapped_device___2 { + struct mutex suspend_lock; + struct mutex table_devices_lock; + struct list_head table_devices; + void *map; + long unsigned int flags; + struct mutex type_lock; + enum dm_queue_mode type; + int numa_node_id; + struct request_queue *queue; + atomic_t holders; + atomic_t open_count; + struct dm_target *immutable_target; + struct target_type *immutable_target_type; + char name[16]; + struct gendisk *disk; + struct dax_device *dax_dev; + struct work_struct work; + wait_queue_head_t wait; + spinlock_t deferred_lock; + struct bio_list deferred; + void *interface_ptr; + wait_queue_head_t eventq; + atomic_t event_nr; + atomic_t uevent_seq; + struct list_head uevent_list; + spinlock_t uevent_lock; + unsigned int internal_suspend_count; + struct bio_set io_bs; + struct bio_set bs; + struct workqueue_struct *wq; + struct hd_geometry geometry; + struct dm_kobject_holder kobj_holder; + int swap_bios; + struct semaphore swap_bios_semaphore; + struct mutex swap_bios_lock; + struct dm_stats stats; + struct blk_mq_tag_set *tag_set; + bool init_tio_pdu: 1; + struct srcu_struct io_barrier; + unsigned int nr_zones; + unsigned int *zwp_offset; + struct dm_ima_measurements ima; +}; + +struct dm_io; + +struct dm_target_io { + unsigned int magic; + struct dm_io *io; + struct dm_target *ti; + unsigned int target_bio_nr; + unsigned int *len_ptr; + bool inside_dm_io; + struct bio clone; +}; + +struct dm_io { + unsigned int magic; + struct mapped_device___2 *md; + blk_status_t status; + atomic_t io_count; + struct bio *orig_bio; + long unsigned int start_time; + spinlock_t endio_lock; + struct dm_stats_aux stats_aux; + struct dm_target_io tio; +}; + +struct dm_md_mempools { + struct bio_set bs; + struct bio_set io_bs; +}; + +struct clone_info { + struct dm_table *map; + struct bio *bio; + struct dm_io *io; + sector_t sector; + unsigned int sector_count; +}; + +struct table_device { + struct list_head list; + refcount_t count; + struct dm_dev dm_dev; +}; + +struct dm_pr { + u64 old_key; + u64 new_key; + u32 flags; + bool fail_early; +}; + +struct dm_arg_set { + unsigned int argc; + char **argv; +}; + +struct dm_arg { + unsigned int min; + unsigned int max; + char *error; +}; + +struct dm_dev_internal { + struct list_head list; + refcount_t count; + struct dm_dev *dm_dev; +}; + +struct dm_crypto_profile { + struct blk_crypto_profile profile; + struct mapped_device___2 *md; +}; + +struct dm_keyslot_evict_args { + const struct blk_crypto_key *key; + int err; +}; + +enum suspend_mode { + PRESUSPEND = 0, + PRESUSPEND_UNDO = 1, + POSTSUSPEND = 2, +}; + +struct linear_c { + struct dm_dev *dev; + sector_t start; +}; + +struct stripe { + struct dm_dev *dev; + sector_t physical_start; + atomic_t error_count; +}; + +struct stripe_c { + uint32_t stripes; + int stripes_shift; + sector_t stripe_width; + uint32_t chunk_size; + int chunk_size_shift; + struct dm_target *ti; + struct work_struct trigger_event; + struct stripe stripe[0]; +}; + +struct dm_target_deps { + __u32 count; + __u32 padding; + __u64 dev[0]; +}; + +struct dm_name_list { + __u64 dev; + __u32 next; + char name[0]; +}; + +struct dm_target_versions { + __u32 next; + __u32 version[3]; + char name[0]; +}; + +struct dm_target_msg { + __u64 sector; + char message[0]; +}; + +enum { + DM_VERSION_CMD = 0, + DM_REMOVE_ALL_CMD = 1, + DM_LIST_DEVICES_CMD = 2, + DM_DEV_CREATE_CMD = 3, + DM_DEV_REMOVE_CMD = 4, + DM_DEV_RENAME_CMD = 5, + DM_DEV_SUSPEND_CMD = 6, + DM_DEV_STATUS_CMD = 7, + DM_DEV_WAIT_CMD = 8, + DM_TABLE_LOAD_CMD = 9, + DM_TABLE_CLEAR_CMD = 10, + DM_TABLE_DEPS_CMD = 11, + DM_TABLE_STATUS_CMD = 12, + DM_LIST_VERSIONS_CMD = 13, + DM_TARGET_MSG_CMD = 14, + DM_DEV_SET_GEOMETRY_CMD = 15, + DM_DEV_ARM_POLL_CMD = 16, + DM_GET_TARGET_VERSION_CMD = 17, +}; + +struct dm_file { + volatile unsigned int global_event_nr; +}; + +struct hash_cell { + struct rb_node name_node; + struct rb_node uuid_node; + bool name_set; + bool uuid_set; + char *name; + char *uuid; + struct mapped_device___2 *md; + struct dm_table *new_map; +}; + +struct vers_iter { + size_t param_size; + struct dm_target_versions *vers; + struct dm_target_versions *old_vers; + char *end; + uint32_t flags; +}; + +typedef int (*ioctl_fn)(struct file *, struct dm_ioctl *, size_t); + +struct dm_io_region { + struct block_device *bdev; + sector_t sector; + sector_t count; +}; + +struct page_list { + struct page_list *next; + struct page *page; +}; + +typedef void (*io_notify_fn)(long unsigned int, void *); + +enum dm_io_mem_type { + DM_IO_PAGE_LIST = 0, + DM_IO_BIO = 1, + DM_IO_VMA = 2, + DM_IO_KMEM = 3, +}; + +struct dm_io_memory { + enum dm_io_mem_type type; + unsigned int offset; + union { + struct page_list *pl; + struct bio *bio; + void *vma; + void *addr; + } ptr; +}; + +struct dm_io_notify { + io_notify_fn fn; + void *context; +}; + +struct dm_io_client; + +struct dm_io_request { + int bi_op; + int bi_op_flags; + struct dm_io_memory mem; + struct dm_io_notify notify; + struct dm_io_client *client; +}; + +struct dm_io_client { + mempool_t pool; + struct bio_set bios; +}; + +struct io { + long unsigned int error_bits; + atomic_t count; + struct dm_io_client *client; + io_notify_fn callback; + void *context; + void *vma_invalidate_address; + long unsigned int vma_invalidate_size; + long: 64; +}; + +struct dpages { + void (*get_page)(struct dpages *, struct page **, long unsigned int *, unsigned int *); + void (*next_page)(struct dpages *); + union { + unsigned int context_u; + struct bvec_iter context_bi; + }; + void *context_ptr; + void *vma_invalidate_address; + long unsigned int vma_invalidate_size; +}; + +struct sync_io { + long unsigned int error_bits; + struct completion wait; +}; + +struct dm_kcopyd_throttle { + unsigned int throttle; + unsigned int num_io_jobs; + unsigned int io_period; + unsigned int total_period; + unsigned int last_jiffies; +}; + +typedef void (*dm_kcopyd_notify_fn)(int, long unsigned int, void *); + +struct dm_kcopyd_client { + struct page_list *pages; + unsigned int nr_reserved_pages; + unsigned int nr_free_pages; + unsigned int sub_job_size; + struct dm_io_client *io_client; + wait_queue_head_t destroyq; + mempool_t job_pool; + struct workqueue_struct *kcopyd_wq; + struct work_struct kcopyd_work; + struct dm_kcopyd_throttle *throttle; + atomic_t nr_jobs; + spinlock_t job_lock; + struct list_head callback_jobs; + struct list_head complete_jobs; + struct list_head io_jobs; + struct list_head pages_jobs; +}; + +struct kcopyd_job { + struct dm_kcopyd_client *kc; + struct list_head list; + unsigned int flags; + int read_err; + long unsigned int write_err; + int rw; + struct dm_io_region source; + unsigned int num_dests; + struct dm_io_region dests[8]; + struct page_list *pages; + dm_kcopyd_notify_fn fn; + void *context; + struct mutex lock; + atomic_t sub_jobs; + sector_t progress; + sector_t write_offset; + struct kcopyd_job *master_job; +}; + +struct dm_sysfs_attr { + struct attribute attr; + ssize_t (*show)(struct mapped_device___2 *, char *); + ssize_t (*store)(struct mapped_device___2 *, const char *, size_t); +}; + +struct dm_stats_last_position { + sector_t last_sector; + unsigned int last_rw; +}; + +struct dm_stat_percpu { + long long unsigned int sectors[2]; + long long unsigned int ios[2]; + long long unsigned int merges[2]; + long long unsigned int ticks[2]; + long long unsigned int io_ticks[2]; + long long unsigned int io_ticks_total; + long long unsigned int time_in_queue; + long long unsigned int *histogram; +}; + +struct dm_stat_shared { + atomic_t in_flight[2]; + long long unsigned int stamp; + struct dm_stat_percpu tmp; +}; + +struct dm_stat { + struct list_head list_entry; + int id; + unsigned int stat_flags; + size_t n_entries; + sector_t start; + sector_t end; + sector_t step; + unsigned int n_histogram_entries; + long long unsigned int *histogram_boundaries; + const char *program_id; + const char *aux_data; + struct callback_head callback_head; + size_t shared_alloc_size; + size_t percpu_alloc_size; + size_t histogram_alloc_size; + struct dm_stat_percpu *stat_percpu[256]; + struct dm_stat_shared stat_shared[0]; +}; + +struct dm_rq_target_io; + +struct dm_rq_clone_bio_info { + struct bio *orig; + struct dm_rq_target_io *tio; + struct bio clone; +}; + +struct dm_rq_target_io { + struct mapped_device___2 *md; + struct dm_target *ti; + struct request *orig; + struct request *clone; + struct kthread_work work; + blk_status_t error; + union map_info___2 info; + struct dm_stats_aux stats_aux; + long unsigned int duration_jiffies; + unsigned int n_sectors; + unsigned int completed; +}; + +enum dev_type { + DEV_UNKNOWN = 0, + DEV_X1 = 1, + DEV_X2 = 2, + DEV_X4 = 3, + DEV_X8 = 4, + DEV_X16 = 5, + DEV_X32 = 6, + DEV_X64 = 7, +}; + +enum hw_event_mc_err_type { + HW_EVENT_ERR_CORRECTED = 0, + HW_EVENT_ERR_UNCORRECTED = 1, + HW_EVENT_ERR_DEFERRED = 2, + HW_EVENT_ERR_FATAL = 3, + HW_EVENT_ERR_INFO = 4, +}; + +enum mem_type { + MEM_EMPTY = 0, + MEM_RESERVED = 1, + MEM_UNKNOWN = 2, + MEM_FPM = 3, + MEM_EDO = 4, + MEM_BEDO = 5, + MEM_SDR = 6, + MEM_RDR = 7, + MEM_DDR = 8, + MEM_RDDR = 9, + MEM_RMBS = 10, + MEM_DDR2 = 11, + MEM_FB_DDR2 = 12, + MEM_RDDR2 = 13, + MEM_XDR = 14, + MEM_DDR3 = 15, + MEM_RDDR3 = 16, + MEM_LRDDR3 = 17, + MEM_LPDDR3 = 18, + MEM_DDR4 = 19, + MEM_RDDR4 = 20, + MEM_LRDDR4 = 21, + MEM_LPDDR4 = 22, + MEM_DDR5 = 23, + MEM_NVDIMM = 24, + MEM_WIO2 = 25, + MEM_HBM2 = 26, +}; + +enum edac_type { + EDAC_UNKNOWN = 0, + EDAC_NONE = 1, + EDAC_RESERVED = 2, + EDAC_PARITY = 3, + EDAC_EC = 4, + EDAC_SECDED = 5, + EDAC_S2ECD2ED = 6, + EDAC_S4ECD4ED = 7, + EDAC_S8ECD8ED = 8, + EDAC_S16ECD16ED = 9, +}; + +enum scrub_type { + SCRUB_UNKNOWN = 0, + SCRUB_NONE = 1, + SCRUB_SW_PROG = 2, + SCRUB_SW_SRC = 3, + SCRUB_SW_PROG_SRC = 4, + SCRUB_SW_TUNABLE = 5, + SCRUB_HW_PROG = 6, + SCRUB_HW_SRC = 7, + SCRUB_HW_PROG_SRC = 8, + SCRUB_HW_TUNABLE = 9, +}; + +enum edac_mc_layer_type { + EDAC_MC_LAYER_BRANCH = 0, + EDAC_MC_LAYER_CHANNEL = 1, + EDAC_MC_LAYER_SLOT = 2, + EDAC_MC_LAYER_CHIP_SELECT = 3, + EDAC_MC_LAYER_ALL_MEM = 4, +}; + +struct edac_mc_layer { + enum edac_mc_layer_type type; + unsigned int size; + bool is_virt_csrow; +}; + +struct mem_ctl_info; + +struct dimm_info { + struct device dev; + char label[32]; + unsigned int location[3]; + struct mem_ctl_info *mci; + unsigned int idx; + u32 grain; + enum dev_type dtype; + enum mem_type mtype; + enum edac_type edac_mode; + u32 nr_pages; + unsigned int csrow; + unsigned int cschannel; + u16 smbios_handle; + u32 ce_count; + u32 ue_count; +}; + +struct mcidev_sysfs_attribute; + +struct edac_raw_error_desc { + char location[256]; + char label[296]; + long int grain; + u16 error_count; + enum hw_event_mc_err_type type; + int top_layer; + int mid_layer; + int low_layer; + long unsigned int page_frame_number; + long unsigned int offset_in_page; + long unsigned int syndrome; + const char *msg; + const char *other_detail; +}; + +struct csrow_info; + +struct mem_ctl_info { + struct device dev; + struct bus_type *bus; + struct list_head link; + struct module *owner; + long unsigned int mtype_cap; + long unsigned int edac_ctl_cap; + long unsigned int edac_cap; + long unsigned int scrub_cap; + enum scrub_type scrub_mode; + int (*set_sdram_scrub_rate)(struct mem_ctl_info *, u32); + int (*get_sdram_scrub_rate)(struct mem_ctl_info *); + void (*edac_check)(struct mem_ctl_info *); + long unsigned int (*ctl_page_to_phys)(struct mem_ctl_info *, long unsigned int); + int mc_idx; + struct csrow_info **csrows; + unsigned int nr_csrows; + unsigned int num_cschannel; + unsigned int n_layers; + struct edac_mc_layer *layers; + bool csbased; + unsigned int tot_dimms; + struct dimm_info **dimms; + struct device *pdev; + const char *mod_name; + const char *ctl_name; + const char *dev_name; + void *pvt_info; + long unsigned int start_time; + u32 ce_noinfo_count; + u32 ue_noinfo_count; + u32 ue_mc; + u32 ce_mc; + struct completion complete; + const struct mcidev_sysfs_attribute *mc_driver_sysfs_attributes; + struct delayed_work work; + struct edac_raw_error_desc error_desc; + int op_state; + struct dentry *debugfs; + u8 fake_inject_layer[3]; + bool fake_inject_ue; + u16 fake_inject_count; +}; + +struct rank_info { + int chan_idx; + struct csrow_info *csrow; + struct dimm_info *dimm; + u32 ce_count; +}; + +struct csrow_info { + struct device dev; + long unsigned int first_page; + long unsigned int last_page; + long unsigned int page_mask; + int csrow_idx; + u32 ue_count; + u32 ce_count; + struct mem_ctl_info *mci; + u32 nr_channels; + struct rank_info **channels; +}; + +struct edac_device_counter { + u32 ue_count; + u32 ce_count; +}; + +struct edac_device_ctl_info; + +struct edac_dev_sysfs_attribute { + struct attribute attr; + ssize_t (*show)(struct edac_device_ctl_info *, char *); + ssize_t (*store)(struct edac_device_ctl_info *, const char *, size_t); +}; + +struct edac_device_instance; + +struct edac_device_ctl_info { + struct list_head link; + struct module *owner; + int dev_idx; + int log_ue; + int log_ce; + int panic_on_ue; + unsigned int poll_msec; + long unsigned int delay; + struct edac_dev_sysfs_attribute *sysfs_attributes; + struct bus_type *edac_subsys; + int op_state; + struct delayed_work work; + void (*edac_check)(struct edac_device_ctl_info *); + struct device *dev; + const char *mod_name; + const char *ctl_name; + const char *dev_name; + void *pvt_info; + long unsigned int start_time; + struct completion removal_complete; + char name[32]; + u32 nr_instances; + struct edac_device_instance *instances; + struct edac_device_counter counters; + struct kobject kobj; +}; + +struct edac_device_block; + +struct edac_dev_sysfs_block_attribute { + struct attribute attr; + ssize_t (*show)(struct kobject *, struct attribute *, char *); + ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); + struct edac_device_block *block; + unsigned int value; +}; + +struct edac_device_block { + struct edac_device_instance *instance; + char name[32]; + struct edac_device_counter counters; + int nr_attribs; + struct edac_dev_sysfs_block_attribute *block_attributes; + struct kobject kobj; +}; + +struct edac_device_instance { + struct edac_device_ctl_info *ctl; + char name[35]; + struct edac_device_counter counters; + u32 nr_blocks; + struct edac_device_block *blocks; + struct kobject kobj; +}; + +struct ctl_info_attribute { + struct attribute attr; + ssize_t (*show)(struct edac_device_ctl_info *, char *); + ssize_t (*store)(struct edac_device_ctl_info *, const char *, size_t); +}; + +struct instance_attribute { + struct attribute attr; + ssize_t (*show)(struct edac_device_instance *, char *); + ssize_t (*store)(struct edac_device_instance *, const char *, size_t); +}; + +struct edac_pci_counter { + atomic_t pe_count; + atomic_t npe_count; +}; + +struct edac_pci_ctl_info { + struct list_head link; + int pci_idx; + struct bus_type *edac_subsys; + int op_state; + struct delayed_work work; + void (*edac_check)(struct edac_pci_ctl_info *); + struct device *dev; + const char *mod_name; + const char *ctl_name; + const char *dev_name; + void *pvt_info; + long unsigned int start_time; + struct completion complete; + char name[32]; + struct edac_pci_counter counters; + struct kobject kobj; +}; + +struct edac_pci_gen_data { + int edac_idx; +}; + +struct instance_attribute___2 { + struct attribute attr; + ssize_t (*show)(struct edac_pci_ctl_info *, char *); + ssize_t (*store)(struct edac_pci_ctl_info *, const char *, size_t); +}; + +struct edac_pci_dev_attribute { + struct attribute attr; + void *value; + ssize_t (*show)(void *, char *); + ssize_t (*store)(void *, const char *, size_t); +}; + +typedef void (*pci_parity_check_fn_t)(struct pci_dev *); + +struct ghes_pvt { + struct mem_ctl_info *mci; + char other_detail[400]; + char msg[80]; +}; + +struct ghes_hw_desc { + int num_dimms; + struct dimm_info *dimms; +}; + +struct memdev_dmi_entry { + u8 type; + u8 length; + u16 handle; + u16 phys_mem_array_handle; + u16 mem_err_info_handle; + u16 total_width; + u16 data_width; + u16 size; + u8 form_factor; + u8 device_set; + u8 device_locator; + u8 bank_locator; + u8 memory_type; + u16 type_detail; + u16 speed; + u8 manufacturer; + u8 serial_number; + u8 asset_tag; + u8 part_number; + u8 attributes; + u32 extended_size; + u16 conf_mem_clk_speed; +} __attribute__((packed)); + +struct altr_sdram_prv_data { + int ecc_ctrl_offset; + int ecc_ctl_en_mask; + int ecc_cecnt_offset; + int ecc_uecnt_offset; + int ecc_stat_offset; + int ecc_stat_ce_mask; + int ecc_stat_ue_mask; + int ecc_saddr_offset; + int ecc_daddr_offset; + int ecc_irq_en_offset; + int ecc_irq_en_mask; + int ecc_irq_clr_offset; + int ecc_irq_clr_mask; + int ecc_cnt_rst_offset; + int ecc_cnt_rst_mask; + struct edac_dev_sysfs_attribute *eccmgr_sysfs_attr; + int ecc_enable_mask; + int ce_set_mask; + int ue_set_mask; + int ce_ue_trgr_offset; +}; + +struct altr_sdram_mc_data { + struct regmap *mc_vbase; + int sb_irq; + int db_irq; + const struct altr_sdram_prv_data *data; +}; + +struct altr_edac_device_dev; + +struct edac_device_prv_data { + int (*setup)(struct altr_edac_device_dev *); + int ce_clear_mask; + int ue_clear_mask; + int irq_status_mask; + void * (*alloc_mem)(size_t, void **); + void (*free_mem)(void *, size_t, void *); + int ecc_enable_mask; + int ecc_en_ofst; + int ce_set_mask; + int ue_set_mask; + int set_err_ofst; + irqreturn_t (*ecc_irq_handler)(int, void *); + int trig_alloc_sz; + const struct file_operations *inject_fops; + bool panic; +}; + +struct altr_arria10_edac; + +struct altr_edac_device_dev { + struct list_head next; + void *base; + int sb_irq; + int db_irq; + const struct edac_device_prv_data *data; + struct dentry *debugfs_dir; + char *edac_dev_name; + struct altr_arria10_edac *edac; + struct edac_device_ctl_info *edac_dev; + struct device ddev; + int edac_idx; +}; + +struct altr_arria10_edac { + struct device *dev; + struct regmap *ecc_mgr_map; + int sb_irq; + int db_irq; + struct irq_domain *domain; + struct irq_chip irq_chip; + struct list_head a10_ecc_devices; + struct notifier_block panic_notifier; +}; + +enum opp_table_access { + OPP_TABLE_ACCESS_UNKNOWN = 0, + OPP_TABLE_ACCESS_EXCLUSIVE = 1, + OPP_TABLE_ACCESS_SHARED = 2, +}; + +struct icc_path; + +struct dev_pm_opp___2; + +struct dev_pm_set_opp_data; + +struct dev_pm_opp_supply; + +struct opp_table___2 { + struct list_head node; + struct list_head lazy; + struct blocking_notifier_head head; + struct list_head dev_list; + struct list_head opp_list; + struct kref kref; + struct mutex lock; + struct device_node *np; + long unsigned int clock_latency_ns_max; + unsigned int voltage_tolerance_v1; + unsigned int parsed_static_opps; + enum opp_table_access shared_opp; + long unsigned int current_rate; + struct dev_pm_opp___2 *current_opp; + struct dev_pm_opp___2 *suspend_opp; + struct mutex genpd_virt_dev_lock; + struct device **genpd_virt_devs; + struct opp_table___2 **required_opp_tables; + unsigned int required_opp_count; + unsigned int *supported_hw; + unsigned int supported_hw_count; + const char *prop_name; + struct clk *clk; + struct regulator **regulators; + int regulator_count; + struct icc_path **paths; + unsigned int path_count; + bool enabled; + bool genpd_performance_state; + bool is_genpd; + int (*set_opp)(struct dev_pm_set_opp_data *); + struct dev_pm_opp_supply *sod_supplies; + struct dev_pm_set_opp_data *set_opp_data; + struct dentry *dentry; + char dentry_name[255]; +}; + +struct dev_pm_opp_icc_bw; + +struct dev_pm_opp___2 { + struct list_head node; + struct kref kref; + bool available; + bool dynamic; + bool turbo; + bool suspend; + bool removed; + unsigned int pstate; + long unsigned int rate; + unsigned int level; + struct dev_pm_opp_supply *supplies; + struct dev_pm_opp_icc_bw *bandwidth; + long unsigned int clock_latency_ns; + struct dev_pm_opp___2 **required_opps; + struct opp_table___2 *opp_table; + struct device_node *np; + struct dentry *dentry; +}; + +enum dev_pm_opp_event { + OPP_EVENT_ADD = 0, + OPP_EVENT_REMOVE = 1, + OPP_EVENT_ENABLE = 2, + OPP_EVENT_DISABLE = 3, + OPP_EVENT_ADJUST_VOLTAGE = 4, +}; + +struct dev_pm_opp_supply { + long unsigned int u_volt; + long unsigned int u_volt_min; + long unsigned int u_volt_max; + long unsigned int u_amp; +}; + +struct dev_pm_opp_icc_bw { + u32 avg; + u32 peak; +}; + +struct dev_pm_opp_info { + long unsigned int rate; + struct dev_pm_opp_supply *supplies; +}; + +struct dev_pm_set_opp_data { + struct dev_pm_opp_info old_opp; + struct dev_pm_opp_info new_opp; + struct regulator **regulators; + unsigned int regulator_count; + struct clk *clk; + struct device *dev; +}; + +struct opp_device { + struct list_head node; + const struct device *dev; + struct dentry *dentry; +}; + +struct cpufreq_policy_data { + struct cpufreq_cpuinfo cpuinfo; + struct cpufreq_frequency_table *freq_table; + unsigned int cpu; + unsigned int min; + unsigned int max; +}; + +struct cpufreq_freqs { + struct cpufreq_policy *policy; + unsigned int old; + unsigned int new; + u8 flags; +}; + +struct freq_attr { + struct attribute attr; + ssize_t (*show)(struct cpufreq_policy *, char *); + ssize_t (*store)(struct cpufreq_policy *, const char *, size_t); +}; + +struct cpufreq_driver { + char name[16]; + u16 flags; + void *driver_data; + int (*init)(struct cpufreq_policy *); + int (*verify)(struct cpufreq_policy_data *); + int (*setpolicy)(struct cpufreq_policy *); + int (*target)(struct cpufreq_policy *, unsigned int, unsigned int); + int (*target_index)(struct cpufreq_policy *, unsigned int); + unsigned int (*fast_switch)(struct cpufreq_policy *, unsigned int); + void (*adjust_perf)(unsigned int, long unsigned int, long unsigned int, long unsigned int); + unsigned int (*get_intermediate)(struct cpufreq_policy *, unsigned int); + int (*target_intermediate)(struct cpufreq_policy *, unsigned int); + unsigned int (*get)(unsigned int); + void (*update_limits)(unsigned int); + int (*bios_limit)(int, unsigned int *); + int (*online)(struct cpufreq_policy *); + int (*offline)(struct cpufreq_policy *); + int (*exit)(struct cpufreq_policy *); + int (*suspend)(struct cpufreq_policy *); + int (*resume)(struct cpufreq_policy *); + struct freq_attr **attr; + bool boost_enabled; + int (*set_boost)(struct cpufreq_policy *, int); + void (*register_em)(struct cpufreq_policy *); +}; + +struct cpufreq_stats { + unsigned int total_trans; + long long unsigned int last_time; + unsigned int max_state; + unsigned int state_num; + unsigned int last_index; + u64 *time_in_state; + unsigned int *freq_table; + unsigned int *trans_table; + unsigned int reset_pending; + long long unsigned int reset_time; +}; + +enum { + OD_NORMAL_SAMPLE = 0, + OD_SUB_SAMPLE = 1, +}; + +struct dbs_data { + struct gov_attr_set attr_set; + void *tuners; + unsigned int ignore_nice_load; + unsigned int sampling_rate; + unsigned int sampling_down_factor; + unsigned int up_threshold; + unsigned int io_is_busy; +}; + +struct policy_dbs_info { + struct cpufreq_policy *policy; + struct mutex update_mutex; + u64 last_sample_time; + s64 sample_delay_ns; + atomic_t work_count; + struct irq_work irq_work; + struct work_struct work; + struct dbs_data *dbs_data; + struct list_head list; + unsigned int rate_mult; + unsigned int idle_periods; + bool is_shared; + bool work_in_progress; +}; + +struct dbs_governor { + struct cpufreq_governor gov; + struct kobj_type kobj_type; + struct dbs_data *gdbs_data; + unsigned int (*gov_dbs_update)(struct cpufreq_policy *); + struct policy_dbs_info * (*alloc)(); + void (*free)(struct policy_dbs_info *); + int (*init)(struct dbs_data *); + void (*exit)(struct dbs_data *); + void (*start)(struct cpufreq_policy *); +}; + +struct od_ops { + unsigned int (*powersave_bias_target)(struct cpufreq_policy *, unsigned int, unsigned int); +}; + +struct od_policy_dbs_info { + struct policy_dbs_info policy_dbs; + unsigned int freq_lo; + unsigned int freq_lo_delay_us; + unsigned int freq_hi_delay_us; + unsigned int sample_type: 1; +}; + +struct od_dbs_tuners { + unsigned int powersave_bias; +}; + +struct cs_policy_dbs_info { + struct policy_dbs_info policy_dbs; + unsigned int down_skip; + unsigned int requested_freq; +}; + +struct cs_dbs_tuners { + unsigned int down_threshold; + unsigned int freq_step; +}; + +struct cpu_dbs_info { + u64 prev_cpu_idle; + u64 prev_update_time; + u64 prev_cpu_nice; + unsigned int prev_load; + struct update_util_data update_util; + struct policy_dbs_info *policy_dbs; +}; + +struct cpufreq_dt_platform_data { + bool have_governor_per_policy; + unsigned int (*get_intermediate)(struct cpufreq_policy *, unsigned int); + int (*target_intermediate)(struct cpufreq_policy *, unsigned int); + int (*suspend)(struct cpufreq_policy *); + int (*resume)(struct cpufreq_policy *); +}; + +struct private_data { + struct list_head node; + cpumask_var_t cpus; + struct device *cpu_dev; + struct opp_table *opp_table; + struct cpufreq_frequency_table *freq_table; + bool have_static_opps; +}; + +struct tegra124_cpufreq_priv { + struct clk *cpu_clk; + struct clk *pllp_clk; + struct clk *pllx_clk; + struct clk *dfll_clk; + struct platform_device *cpufreq_dt_pdev; +}; + +struct cpuidle_governor { + char name[16]; + struct list_head governor_list; + unsigned int rating; + int (*enable)(struct cpuidle_driver *, struct cpuidle_device *); + void (*disable)(struct cpuidle_driver *, struct cpuidle_device *); + int (*select)(struct cpuidle_driver *, struct cpuidle_device *, bool *); + void (*reflect)(struct cpuidle_device *, int); +}; + +struct cpuidle_state_kobj { + struct cpuidle_state *state; + struct cpuidle_state_usage *state_usage; + struct completion kobj_unregister; + struct kobject kobj; + struct cpuidle_device *device; +}; + +struct cpuidle_driver_kobj { + struct cpuidle_driver *drv; + struct completion kobj_unregister; + struct kobject kobj; +}; + +struct cpuidle_device_kobj { + struct cpuidle_device *dev; + struct completion kobj_unregister; + struct kobject kobj; +}; + +struct cpuidle_attr { + struct attribute attr; + ssize_t (*show)(struct cpuidle_device *, char *); + ssize_t (*store)(struct cpuidle_device *, const char *, size_t); +}; + +struct cpuidle_state_attr { + struct attribute attr; + ssize_t (*show)(struct cpuidle_state *, struct cpuidle_state_usage *, char *); + ssize_t (*store)(struct cpuidle_state *, struct cpuidle_state_usage *, const char *, size_t); +}; + +struct cpuidle_driver_attr { + struct attribute attr; + ssize_t (*show)(struct cpuidle_driver *, char *); + ssize_t (*store)(struct cpuidle_driver *, const char *, size_t); +}; + +struct ladder_device_state { + struct { + u32 promotion_count; + u32 demotion_count; + u64 promotion_time_ns; + u64 demotion_time_ns; + } threshold; + struct { + int promotion_count; + int demotion_count; + } stats; +}; + +struct ladder_device { + struct ladder_device_state states[10]; +}; + +struct menu_device { + int needs_update; + int tick_wakeup; + u64 next_timer_ns; + unsigned int bucket; + unsigned int correction_factor[12]; + unsigned int intervals[8]; + int interval_ptr; +}; + +struct teo_bin { + unsigned int intercepts; + unsigned int hits; + unsigned int recent; +}; + +struct teo_cpu { + s64 time_span_ns; + s64 sleep_length_ns; + struct teo_bin state_bins[10]; + unsigned int total; + int next_recent_idx; + int recent_idx[9]; +}; + +struct psci_cpuidle_data { + u32 *psci_states; + struct device *dev; +}; + +struct psci_pd_provider { + struct list_head link; + struct device_node *node; +}; + +struct mmc_cid { + unsigned int manfid; + char prod_name[8]; + unsigned char prv; + unsigned int serial; + short unsigned int oemid; + short unsigned int year; + unsigned char hwrev; + unsigned char fwrev; + unsigned char month; +}; + +struct mmc_csd { + unsigned char structure; + unsigned char mmca_vsn; + short unsigned int cmdclass; + short unsigned int taac_clks; + unsigned int taac_ns; + unsigned int c_size; + unsigned int r2w_factor; + unsigned int max_dtr; + unsigned int erase_size; + unsigned int read_blkbits; + unsigned int write_blkbits; + unsigned int capacity; + unsigned int read_partial: 1; + unsigned int read_misalign: 1; + unsigned int write_partial: 1; + unsigned int write_misalign: 1; + unsigned int dsr_imp: 1; +}; + +struct mmc_ext_csd { + u8 rev; + u8 erase_group_def; + u8 sec_feature_support; + u8 rel_sectors; + u8 rel_param; + bool enhanced_rpmb_supported; + u8 part_config; + u8 cache_ctrl; + u8 rst_n_function; + u8 max_packed_writes; + u8 max_packed_reads; + u8 packed_event_en; + unsigned int part_time; + unsigned int sa_timeout; + unsigned int generic_cmd6_time; + unsigned int power_off_longtime; + u8 power_off_notification; + unsigned int hs_max_dtr; + unsigned int hs200_max_dtr; + unsigned int sectors; + unsigned int hc_erase_size; + unsigned int hc_erase_timeout; + unsigned int sec_trim_mult; + unsigned int sec_erase_mult; + unsigned int trim_timeout; + bool partition_setting_completed; + long long unsigned int enhanced_area_offset; + unsigned int enhanced_area_size; + unsigned int cache_size; + bool hpi_en; + bool hpi; + unsigned int hpi_cmd; + bool bkops; + bool man_bkops_en; + bool auto_bkops_en; + unsigned int data_sector_size; + unsigned int data_tag_unit_size; + unsigned int boot_ro_lock; + bool boot_ro_lockable; + bool ffu_capable; + bool cmdq_en; + bool cmdq_support; + unsigned int cmdq_depth; + u8 fwrev[8]; + u8 raw_exception_status; + u8 raw_partition_support; + u8 raw_rpmb_size_mult; + u8 raw_erased_mem_count; + u8 strobe_support; + u8 raw_ext_csd_structure; + u8 raw_card_type; + u8 raw_driver_strength; + u8 out_of_int_time; + u8 raw_pwr_cl_52_195; + u8 raw_pwr_cl_26_195; + u8 raw_pwr_cl_52_360; + u8 raw_pwr_cl_26_360; + u8 raw_s_a_timeout; + u8 raw_hc_erase_gap_size; + u8 raw_erase_timeout_mult; + u8 raw_hc_erase_grp_size; + u8 raw_boot_mult; + u8 raw_sec_trim_mult; + u8 raw_sec_erase_mult; + u8 raw_sec_feature_support; + u8 raw_trim_mult; + u8 raw_pwr_cl_200_195; + u8 raw_pwr_cl_200_360; + u8 raw_pwr_cl_ddr_52_195; + u8 raw_pwr_cl_ddr_52_360; + u8 raw_pwr_cl_ddr_200_360; + u8 raw_bkops_status; + u8 raw_sectors[4]; + u8 pre_eol_info; + u8 device_life_time_est_typ_a; + u8 device_life_time_est_typ_b; + unsigned int feature_support; +}; + +struct sd_scr { + unsigned char sda_vsn; + unsigned char sda_spec3; + unsigned char sda_spec4; + unsigned char sda_specx; + unsigned char bus_widths; + unsigned char cmds; +}; + +struct sd_ssr { + unsigned int au; + unsigned int erase_timeout; + unsigned int erase_offset; +}; + +struct sd_switch_caps { + unsigned int hs_max_dtr; + unsigned int uhs_max_dtr; + unsigned int sd3_bus_mode; + unsigned int sd3_drv_type; + unsigned int sd3_curr_limit; +}; + +struct sd_ext_reg { + u8 fno; + u8 page; + u16 offset; + u8 rev; + u8 feature_enabled; + u8 feature_support; +}; + +struct sdio_cccr { + unsigned int sdio_vsn; + unsigned int sd_vsn; + unsigned int multi_block: 1; + unsigned int low_speed: 1; + unsigned int wide_bus: 1; + unsigned int high_power: 1; + unsigned int high_speed: 1; + unsigned int disable_cd: 1; +}; + +struct sdio_cis { + short unsigned int vendor; + short unsigned int device; + short unsigned int blksize; + unsigned int max_dtr; +}; + +struct mmc_part { + u64 size; + unsigned int part_cfg; + char name[20]; + bool force_ro; + unsigned int area_type; +}; + +struct mmc_host; + +struct sdio_func; + +struct sdio_func_tuple; + +struct mmc_card { + struct mmc_host *host; + struct device dev; + u32 ocr; + unsigned int rca; + unsigned int type; + unsigned int state; + unsigned int quirks; + unsigned int quirk_max_rate; + bool reenable_cmdq; + unsigned int erase_size; + unsigned int erase_shift; + unsigned int pref_erase; + unsigned int eg_boundary; + unsigned int erase_arg; + u8 erased_byte; + u32 raw_cid[4]; + u32 raw_csd[4]; + u32 raw_scr[2]; + u32 raw_ssr[16]; + struct mmc_cid cid; + struct mmc_csd csd; + struct mmc_ext_csd ext_csd; + struct sd_scr scr; + struct sd_ssr ssr; + struct sd_switch_caps sw_caps; + struct sd_ext_reg ext_power; + struct sd_ext_reg ext_perf; + unsigned int sdio_funcs; + atomic_t sdio_funcs_probed; + struct sdio_cccr cccr; + struct sdio_cis cis; + struct sdio_func *sdio_func[7]; + struct sdio_func *sdio_single_irq; + u8 major_rev; + u8 minor_rev; + unsigned int num_info; + const char **info; + struct sdio_func_tuple *tuples; + unsigned int sd_bus_speed; + unsigned int mmc_avail_type; + unsigned int drive_strength; + struct dentry *debugfs_root; + struct mmc_part part[7]; + unsigned int nr_parts; + struct workqueue_struct *complete_wq; +}; + +typedef unsigned int mmc_pm_flag_t; + +struct mmc_ios { + unsigned int clock; + short unsigned int vdd; + unsigned int power_delay_ms; + unsigned char bus_mode; + unsigned char chip_select; + unsigned char power_mode; + unsigned char bus_width; + unsigned char timing; + unsigned char signal_voltage; + unsigned char drv_type; + bool enhanced_strobe; +}; + +struct mmc_ctx { + struct task_struct *task; +}; + +struct mmc_slot { + int cd_irq; + bool cd_wake_enabled; + void *handler_priv; +}; + +struct mmc_supply { + struct regulator *vmmc; + struct regulator *vqmmc; +}; + +struct mmc_host_ops; + +struct mmc_pwrseq; + +struct mmc_bus_ops; + +struct mmc_request; + +struct mmc_cqe_ops; + +struct mmc_host { + struct device *parent; + struct device class_dev; + int index; + const struct mmc_host_ops *ops; + struct mmc_pwrseq *pwrseq; + unsigned int f_min; + unsigned int f_max; + unsigned int f_init; + u32 ocr_avail; + u32 ocr_avail_sdio; + u32 ocr_avail_sd; + u32 ocr_avail_mmc; + struct wakeup_source *ws; + u32 max_current_330; + u32 max_current_300; + u32 max_current_180; + u32 caps; + u32 caps2; + int fixed_drv_type; + mmc_pm_flag_t pm_caps; + unsigned int max_seg_size; + short unsigned int max_segs; + short unsigned int unused; + unsigned int max_req_size; + unsigned int max_blk_size; + unsigned int max_blk_count; + unsigned int max_busy_timeout; + spinlock_t lock; + struct mmc_ios ios; + unsigned int use_spi_crc: 1; + unsigned int claimed: 1; + unsigned int doing_init_tune: 1; + unsigned int can_retune: 1; + unsigned int doing_retune: 1; + unsigned int retune_now: 1; + unsigned int retune_paused: 1; + unsigned int retune_crc_disable: 1; + unsigned int can_dma_map_merge: 1; + int rescan_disable; + int rescan_entered; + int need_retune; + int hold_retune; + unsigned int retune_period; + struct timer_list retune_timer; + bool trigger_card_event; + struct mmc_card *card; + wait_queue_head_t wq; + struct mmc_ctx *claimer; + int claim_cnt; + struct mmc_ctx default_ctx; + struct delayed_work detect; + int detect_change; + struct mmc_slot slot; + const struct mmc_bus_ops *bus_ops; + unsigned int sdio_irqs; + struct task_struct *sdio_irq_thread; + struct delayed_work sdio_irq_work; + bool sdio_irq_pending; + atomic_t sdio_irq_thread_abort; + mmc_pm_flag_t pm_flags; + struct led_trigger *led; + bool regulator_enabled; + struct mmc_supply supply; + struct dentry *debugfs_root; + struct mmc_request *ongoing_mrq; + unsigned int actual_clock; + unsigned int slotno; + int dsr_req; + u32 dsr; + const struct mmc_cqe_ops *cqe_ops; + void *cqe_private; + int cqe_qdepth; + bool cqe_enabled; + bool cqe_on; + struct blk_crypto_profile crypto_profile; + bool hsq_enabled; + long: 56; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int private[0]; +}; + +struct mmc_data; + +struct mmc_command { + u32 opcode; + u32 arg; + u32 resp[4]; + unsigned int flags; + unsigned int retries; + int error; + unsigned int busy_timeout; + struct mmc_data *data; + struct mmc_request *mrq; +}; + +struct mmc_data { + unsigned int timeout_ns; + unsigned int timeout_clks; + unsigned int blksz; + unsigned int blocks; + unsigned int blk_addr; + int error; + unsigned int flags; + unsigned int bytes_xfered; + struct mmc_command *stop; + struct mmc_request *mrq; + unsigned int sg_len; + int sg_count; + struct scatterlist *sg; + s32 host_cookie; +}; + +struct mmc_request { + struct mmc_command *sbc; + struct mmc_command *cmd; + struct mmc_data *data; + struct mmc_command *stop; + struct completion completion; + struct completion cmd_completion; + void (*done)(struct mmc_request *); + void (*recovery_notifier)(struct mmc_request *); + struct mmc_host *host; + bool cap_cmd_during_tfr; + int tag; + const struct bio_crypt_ctx *crypto_ctx; + int crypto_key_slot; +}; + +struct mmc_host_ops { + void (*post_req)(struct mmc_host *, struct mmc_request *, int); + void (*pre_req)(struct mmc_host *, struct mmc_request *); + void (*request)(struct mmc_host *, struct mmc_request *); + int (*request_atomic)(struct mmc_host *, struct mmc_request *); + void (*set_ios)(struct mmc_host *, struct mmc_ios *); + int (*get_ro)(struct mmc_host *); + int (*get_cd)(struct mmc_host *); + void (*enable_sdio_irq)(struct mmc_host *, int); + void (*ack_sdio_irq)(struct mmc_host *); + void (*init_card)(struct mmc_host *, struct mmc_card *); + int (*start_signal_voltage_switch)(struct mmc_host *, struct mmc_ios *); + int (*card_busy)(struct mmc_host *); + int (*execute_tuning)(struct mmc_host *, u32); + int (*prepare_hs400_tuning)(struct mmc_host *, struct mmc_ios *); + int (*execute_hs400_tuning)(struct mmc_host *, struct mmc_card *); + int (*hs400_prepare_ddr)(struct mmc_host *); + void (*hs400_downgrade)(struct mmc_host *); + void (*hs400_complete)(struct mmc_host *); + void (*hs400_enhanced_strobe)(struct mmc_host *, struct mmc_ios *); + int (*select_drive_strength)(struct mmc_card *, unsigned int, int, int, int *); + void (*hw_reset)(struct mmc_host *); + void (*card_event)(struct mmc_host *); + int (*multi_io_quirk)(struct mmc_card *, unsigned int, int); + int (*init_sd_express)(struct mmc_host *, struct mmc_ios *); +}; + +struct mmc_cqe_ops { + int (*cqe_enable)(struct mmc_host *, struct mmc_card *); + void (*cqe_disable)(struct mmc_host *); + int (*cqe_request)(struct mmc_host *, struct mmc_request *); + void (*cqe_post_req)(struct mmc_host *, struct mmc_request *); + void (*cqe_off)(struct mmc_host *); + int (*cqe_wait_for_idle)(struct mmc_host *); + bool (*cqe_timeout)(struct mmc_host *, struct mmc_request *, bool *); + void (*cqe_recovery_start)(struct mmc_host *); + void (*cqe_recovery_finish)(struct mmc_host *); +}; + +struct mmc_pwrseq_ops; + +struct mmc_pwrseq { + const struct mmc_pwrseq_ops *ops; + struct device *dev; + struct list_head pwrseq_node; + struct module *owner; +}; + +struct mmc_bus_ops { + void (*remove)(struct mmc_host *); + void (*detect)(struct mmc_host *); + int (*pre_suspend)(struct mmc_host *); + int (*suspend)(struct mmc_host *); + int (*resume)(struct mmc_host *); + int (*runtime_suspend)(struct mmc_host *); + int (*runtime_resume)(struct mmc_host *); + int (*alive)(struct mmc_host *); + int (*shutdown)(struct mmc_host *); + int (*hw_reset)(struct mmc_host *); + int (*sw_reset)(struct mmc_host *); + bool (*cache_enabled)(struct mmc_host *); + int (*flush_cache)(struct mmc_host *); +}; + +struct trace_event_raw_mmc_request_start { + struct trace_entry ent; + u32 cmd_opcode; + u32 cmd_arg; + unsigned int cmd_flags; + unsigned int cmd_retries; + u32 stop_opcode; + u32 stop_arg; + unsigned int stop_flags; + unsigned int stop_retries; + u32 sbc_opcode; + u32 sbc_arg; + unsigned int sbc_flags; + unsigned int sbc_retries; + unsigned int blocks; + unsigned int blk_addr; + unsigned int blksz; + unsigned int data_flags; + int tag; + unsigned int can_retune; + unsigned int doing_retune; + unsigned int retune_now; + int need_retune; + int hold_retune; + unsigned int retune_period; + struct mmc_request *mrq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_mmc_request_done { + struct trace_entry ent; + u32 cmd_opcode; + int cmd_err; + u32 cmd_resp[4]; + unsigned int cmd_retries; + u32 stop_opcode; + int stop_err; + u32 stop_resp[4]; + unsigned int stop_retries; + u32 sbc_opcode; + int sbc_err; + u32 sbc_resp[4]; + unsigned int sbc_retries; + unsigned int bytes_xfered; + int data_err; + int tag; + unsigned int can_retune; + unsigned int doing_retune; + unsigned int retune_now; + int need_retune; + int hold_retune; + unsigned int retune_period; + struct mmc_request *mrq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_data_offsets_mmc_request_start { + u32 name; +}; + +struct trace_event_data_offsets_mmc_request_done { + u32 name; +}; + +typedef void (*btf_trace_mmc_request_start)(void *, struct mmc_host *, struct mmc_request *); + +typedef void (*btf_trace_mmc_request_done)(void *, struct mmc_host *, struct mmc_request *); + +struct mmc_pwrseq_ops { + void (*pre_power_on)(struct mmc_host *); + void (*post_power_on)(struct mmc_host *); + void (*power_off)(struct mmc_host *); + void (*reset)(struct mmc_host *); +}; + +enum mmc_busy_cmd { + MMC_BUSY_CMD6 = 0, + MMC_BUSY_ERASE = 1, + MMC_BUSY_HPI = 2, + MMC_BUSY_EXTR_SINGLE = 3, + MMC_BUSY_IO = 4, +}; + +struct mmc_driver { + struct device_driver drv; + int (*probe)(struct mmc_card *); + void (*remove)(struct mmc_card *); + void (*shutdown)(struct mmc_card *); +}; + +struct mmc_clk_phase { + bool valid; + u16 in_deg; + u16 out_deg; +}; + +struct mmc_clk_phase_map { + struct mmc_clk_phase phase[11]; +}; + +struct mmc_fixup { + const char *name; + u64 rev_start; + u64 rev_end; + unsigned int manfid; + short unsigned int oemid; + u16 cis_vendor; + u16 cis_device; + unsigned int ext_csd_rev; + void (*vendor_fixup)(struct mmc_card *, int); + int data; +}; + +struct mmc_busy_data { + struct mmc_card *card; + bool retry_crc_err; + enum mmc_busy_cmd busy_cmd; +}; + +struct sd_busy_data { + struct mmc_card *card; + u8 *reg_buf; +}; + +typedef void sdio_irq_handler_t(struct sdio_func *); + +struct sdio_func { + struct mmc_card *card; + struct device dev; + sdio_irq_handler_t *irq_handler; + unsigned int num; + unsigned char class; + short unsigned int vendor; + short unsigned int device; + unsigned int max_blksize; + unsigned int cur_blksize; + unsigned int enable_timeout; + unsigned int state; + u8 *tmpbuf; + u8 major_rev; + u8 minor_rev; + unsigned int num_info; + const char **info; + struct sdio_func_tuple *tuples; +}; + +struct sdio_func_tuple { + struct sdio_func_tuple *next; + unsigned char code; + unsigned char size; + unsigned char data[0]; +}; + +struct sdio_device_id { + __u8 class; + __u16 vendor; + __u16 device; + kernel_ulong_t driver_data; +}; + +struct sdio_driver { + char *name; + const struct sdio_device_id *id_table; + int (*probe)(struct sdio_func *, const struct sdio_device_id *); + void (*remove)(struct sdio_func *); + struct device_driver drv; +}; + +typedef int tpl_parse_t(struct mmc_card *, struct sdio_func *, const unsigned char *, unsigned int); + +struct cis_tpl { + unsigned char code; + unsigned char min_size; + tpl_parse_t *parse; +}; + +struct mmc_gpio { + struct gpio_desc *ro_gpio; + struct gpio_desc *cd_gpio; + irqreturn_t (*cd_gpio_isr)(int, void *); + char *ro_label; + char *cd_label; + u32 cd_debounce_delay_ms; +}; + +enum mmc_issue_type { + MMC_ISSUE_SYNC = 0, + MMC_ISSUE_DCMD = 1, + MMC_ISSUE_ASYNC = 2, + MMC_ISSUE_MAX = 3, +}; + +struct mmc_blk_request { + struct mmc_request mrq; + struct mmc_command sbc; + struct mmc_command cmd; + struct mmc_command stop; + struct mmc_data data; +}; + +enum mmc_drv_op { + MMC_DRV_OP_IOCTL = 0, + MMC_DRV_OP_IOCTL_RPMB = 1, + MMC_DRV_OP_BOOT_WP = 2, + MMC_DRV_OP_GET_CARD_STATUS = 3, + MMC_DRV_OP_GET_EXT_CSD = 4, +}; + +struct mmc_queue_req { + struct mmc_blk_request brq; + struct scatterlist *sg; + enum mmc_drv_op drv_op; + int drv_op_result; + void *drv_op_data; + unsigned int ioc_count; + int retries; +}; + +struct mmc_ioc_cmd { + int write_flag; + int is_acmd; + __u32 opcode; + __u32 arg; + __u32 response[4]; + unsigned int flags; + unsigned int blksz; + unsigned int blocks; + unsigned int postsleep_min_us; + unsigned int postsleep_max_us; + unsigned int data_timeout_ns; + unsigned int cmd_timeout_ms; + __u32 __pad; + __u64 data_ptr; +}; + +struct mmc_ioc_multi_cmd { + __u64 num_of_cmds; + struct mmc_ioc_cmd cmds[0]; +}; + +enum mmc_issued { + MMC_REQ_STARTED = 0, + MMC_REQ_BUSY = 1, + MMC_REQ_FAILED_TO_START = 2, + MMC_REQ_FINISHED = 3, +}; + +struct mmc_blk_data; + +struct mmc_queue { + struct mmc_card *card; + struct mmc_ctx ctx; + struct blk_mq_tag_set tag_set; + struct mmc_blk_data *blkdata; + struct request_queue *queue; + spinlock_t lock; + int in_flight[3]; + unsigned int cqe_busy; + bool busy; + bool recovery_needed; + bool in_recovery; + bool rw_wait; + bool waiting; + struct work_struct recovery_work; + wait_queue_head_t wait; + struct request *recovery_req; + struct request *complete_req; + struct mutex complete_lock; + struct work_struct complete_work; +}; + +struct mmc_blk_data { + struct device *parent; + struct gendisk *disk; + struct mmc_queue queue; + struct list_head part; + struct list_head rpmbs; + unsigned int flags; + struct kref kref; + unsigned int read_only; + unsigned int part_type; + unsigned int reset_done; + unsigned int part_curr; + int area_type; + struct dentry *status_dentry; + struct dentry *ext_csd_dentry; +}; + +struct mmc_blk_busy_data { + struct mmc_card *card; + u32 status; +}; + +struct mmc_rpmb_data { + struct device dev; + struct cdev chrdev; + int id; + unsigned int part_index; + struct mmc_blk_data *md; + struct list_head node; +}; + +struct mmc_blk_ioc_data { + struct mmc_ioc_cmd ic; + unsigned char *buf; + u64 buf_bytes; + struct mmc_rpmb_data *rpmb; +}; + +struct mmci_platform_data { + unsigned int ocr_mask; + int (*ios_handler)(struct device *, struct mmc_ios *); + unsigned int (*status)(struct device *); +}; + +struct mmci_host; + +struct variant_data { + unsigned int clkreg; + unsigned int clkreg_enable; + unsigned int clkreg_8bit_bus_enable; + unsigned int clkreg_neg_edge_enable; + unsigned int cmdreg_cpsm_enable; + unsigned int cmdreg_lrsp_crc; + unsigned int cmdreg_srsp_crc; + unsigned int cmdreg_srsp; + unsigned int cmdreg_stop; + unsigned int datalength_bits; + unsigned int fifosize; + unsigned int fifohalfsize; + unsigned int data_cmd_enable; + unsigned int datactrl_mask_ddrmode; + unsigned int datactrl_mask_sdio; + unsigned int datactrl_blocksz; + u8 datactrl_any_blocksz: 1; + u8 dma_power_of_2: 1; + u8 datactrl_first: 1; + u8 datacnt_useless: 1; + u8 st_sdio: 1; + u8 st_clkdiv: 1; + u8 stm32_clkdiv: 1; + u32 pwrreg_powerup; + u32 f_max; + u8 signal_direction: 1; + u8 pwrreg_clkgate: 1; + u8 busy_detect: 1; + u8 busy_timeout: 1; + u32 busy_dpsm_flag; + u32 busy_detect_flag; + u32 busy_detect_mask; + u8 pwrreg_nopower: 1; + u8 explicit_mclk_control: 1; + u8 qcom_fifo: 1; + u8 qcom_dml: 1; + u8 reversed_irq_handling: 1; + u8 mmcimask1: 1; + unsigned int irq_pio_mask; + u32 start_err; + u32 opendrain; + u8 dma_lli: 1; + u32 stm32_idmabsize_mask; + void (*init)(struct mmci_host *); +}; + +struct mmci_host_ops; + +struct mmci_host { + phys_addr_t phybase; + void *base; + struct mmc_request *mrq; + struct mmc_command *cmd; + struct mmc_command stop_abort; + struct mmc_data *data; + struct mmc_host *mmc; + struct clk *clk; + u8 singleirq: 1; + struct reset_control *rst; + spinlock_t lock; + unsigned int mclk; + unsigned int clock_cache; + unsigned int cclk; + u32 pwr_reg; + u32 pwr_reg_add; + u32 clk_reg; + u32 clk_reg_add; + u32 datactrl_reg; + u32 busy_status; + u32 mask1_reg; + u8 vqmmc_enabled: 1; + struct mmci_platform_data *plat; + struct mmc_host_ops *mmc_ops; + struct mmci_host_ops *ops; + struct variant_data *variant; + void *variant_priv; + struct pinctrl *pinctrl; + struct pinctrl_state *pins_opendrain; + u8 hw_designer; + u8 hw_revision: 4; + struct timer_list timer; + unsigned int oldstat; + u32 irq_action; + struct sg_mapping_iter sg_miter; + unsigned int size; + int (*get_rx_fifocnt)(struct mmci_host *, u32, int); + u8 use_dma: 1; + u8 dma_in_progress: 1; + void *dma_priv; + s32 next_cookie; +}; + +struct mmci_host_ops { + int (*validate_data)(struct mmci_host *, struct mmc_data *); + int (*prep_data)(struct mmci_host *, struct mmc_data *, bool); + void (*unprep_data)(struct mmci_host *, struct mmc_data *, int); + u32 (*get_datactrl_cfg)(struct mmci_host *); + void (*get_next_data)(struct mmci_host *, struct mmc_data *); + int (*dma_setup)(struct mmci_host *); + void (*dma_release)(struct mmci_host *); + int (*dma_start)(struct mmci_host *, unsigned int *); + void (*dma_finalize)(struct mmci_host *, struct mmc_data *); + void (*dma_error)(struct mmci_host *); + void (*set_clkreg)(struct mmci_host *, unsigned int); + void (*set_pwrreg)(struct mmci_host *, unsigned int); + bool (*busy_complete)(struct mmci_host *, u32, u32); + void (*pre_sig_volt_switch)(struct mmci_host *); + int (*post_sig_volt_switch)(struct mmci_host *, struct mmc_ios *); +}; + +struct mmci_dmae_next { + struct dma_async_tx_descriptor *desc; + struct dma_chan *chan; +}; + +struct mmci_dmae_priv { + struct dma_chan *cur; + struct dma_chan *rx_channel; + struct dma_chan *tx_channel; + struct dma_async_tx_descriptor *desc_current; + struct mmci_dmae_next next_data; +}; + +struct sdmmc_lli_desc { + u32 idmalar; + u32 idmabase; + u32 idmasize; +}; + +struct sdmmc_idma { + dma_addr_t sg_dma; + void *sg_cpu; +}; + +struct sdmmc_dlyb { + void *base; + u32 unit; + u32 max; +}; + +enum led_default_state { + LEDS_DEFSTATE_OFF = 0, + LEDS_DEFSTATE_ON = 1, + LEDS_DEFSTATE_KEEP = 2, +}; + +struct led_init_data { + struct fwnode_handle *fwnode; + const char *default_label; + const char *devicename; + bool devname_mandatory; +}; + +struct led_properties { + u32 color; + bool color_present; + const char *function; + u32 func_enum; + bool func_enum_present; + const char *label; +}; + +struct syscon_led { + struct led_classdev cdev; + struct regmap *map; + u32 offset; + u32 mask; + bool state; +}; + +enum cpu_led_event { + CPU_LED_IDLE_START = 0, + CPU_LED_IDLE_END = 1, + CPU_LED_START = 2, + CPU_LED_STOP = 3, + CPU_LED_HALTED = 4, +}; + +struct led_trigger_cpu { + bool is_active; + char name[8]; + struct led_trigger *_trig; +}; + +struct sdei_event { + struct list_head list; + bool reregister; + bool reenable; + u32 event_num; + u8 type; + u8 priority; + union { + struct sdei_registered_event___2 *registered; + struct sdei_registered_event___2 *private_registered; + }; +}; + +struct sdei_crosscall_args { + struct sdei_event *event; + atomic_t errors; + int first_error; +}; + +struct dmi_memdev_info { + const char *device; + const char *bank; + u64 size; + u16 handle; + u8 type; +}; + +struct dmi_device_attribute { + struct device_attribute dev_attr; + int field; +}; + +struct mafield { + const char *prefix; + int field; +}; + +struct firmware_map_entry { + u64 start; + u64 end; + const char *type; + struct list_head list; + struct kobject kobj; +}; + +struct memmap_attribute { + struct attribute attr; + ssize_t (*show)(struct firmware_map_entry *, char *); +}; + +enum rpi_firmware_property_status { + RPI_FIRMWARE_STATUS_REQUEST = 0, + RPI_FIRMWARE_STATUS_SUCCESS = 2147483648, + RPI_FIRMWARE_STATUS_ERROR = 2147483649, +}; + +struct rpi_firmware_property_tag_header { + u32 tag; + u32 buf_size; + u32 req_resp_size; +}; + +struct rpi_firmware___2 { + struct mbox_client cl; + struct mbox_chan___2 *chan; + struct completion c; + u32 enabled; + struct kref consumers; +}; + +struct qcom_scm_hdcp_req { + u32 addr; + u32 val; +}; + +struct qcom_scm_vmperm { + int vmid; + int perm; +}; + +enum qcom_scm_ocmem_client { + QCOM_SCM_OCMEM_UNUSED_ID = 0, + QCOM_SCM_OCMEM_GRAPHICS_ID = 1, + QCOM_SCM_OCMEM_VIDEO_ID = 2, + QCOM_SCM_OCMEM_LP_AUDIO_ID = 3, + QCOM_SCM_OCMEM_SENSORS_ID = 4, + QCOM_SCM_OCMEM_OTHER_OS_ID = 5, + QCOM_SCM_OCMEM_DEBUG_ID = 6, +}; + +enum qcom_scm_ice_cipher { + QCOM_SCM_ICE_CIPHER_AES_128_XTS = 0, + QCOM_SCM_ICE_CIPHER_AES_128_CBC = 1, + QCOM_SCM_ICE_CIPHER_AES_256_XTS = 3, + QCOM_SCM_ICE_CIPHER_AES_256_CBC = 4, +}; + +enum qcom_scm_convention { + SMC_CONVENTION_UNKNOWN = 0, + SMC_CONVENTION_LEGACY = 1, + SMC_CONVENTION_ARM_32 = 2, + SMC_CONVENTION_ARM_64 = 3, +}; + +enum qcom_scm_arg_types { + QCOM_SCM_VAL = 0, + QCOM_SCM_RO = 1, + QCOM_SCM_RW = 2, + QCOM_SCM_BUFVAL = 3, +}; + +struct qcom_scm_desc { + u32 svc; + u32 cmd; + u32 arginfo; + u64 args[10]; + u32 owner; +}; + +struct qcom_scm_res { + u64 result[3]; +}; + +struct qcom_scm { + struct device *dev; + struct clk *core_clk; + struct clk *iface_clk; + struct clk *bus_clk; + struct reset_controller_dev reset; + u64 dload_mode_addr; +}; + +struct qcom_scm_current_perm_info { + __le32 vmid; + __le32 perm; + __le64 ctx; + __le32 ctx_size; + __le32 unused; +}; + +struct qcom_scm_mem_map_info { + __le64 mem_addr; + __le64 mem_size; +}; + +struct qcom_scm_wb_entry { + int flag; + void *entry; +}; + +struct arm_smccc_args { + long unsigned int args[8]; +}; + +struct scm_legacy_command { + __le32 len; + __le32 buf_offset; + __le32 resp_hdr_offset; + __le32 id; + __le32 buf[0]; +}; + +struct scm_legacy_response { + __le32 len; + __le32 buf_offset; + __le32 is_complete; +}; + +struct simplefb_platform_data { + u32 width; + u32 height; + u32 stride; + const char *format; +}; + +struct simplefb_format { + const char *name; + u32 bits_per_pixel; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + u32 fourcc; +}; + +struct ti_msgmgr_message { + size_t len; + u8 *buf; +}; + +struct ti_sci_msg_hdr { + u16 type; + u8 host; + u8 seq; + u32 flags; +}; + +struct ti_sci_msg_resp_version { + struct ti_sci_msg_hdr hdr; + char firmware_description[32]; + u16 firmware_revision; + u8 abi_major; + u8 abi_minor; +}; + +struct ti_sci_msg_req_reboot { + struct ti_sci_msg_hdr hdr; +}; + +struct ti_sci_msg_req_set_device_state { + struct ti_sci_msg_hdr hdr; + u32 id; + u32 reserved; + u8 state; +} __attribute__((packed)); + +struct ti_sci_msg_req_get_device_state { + struct ti_sci_msg_hdr hdr; + u32 id; +}; + +struct ti_sci_msg_resp_get_device_state { + struct ti_sci_msg_hdr hdr; + u32 context_loss_count; + u32 resets; + u8 programmed_state; + u8 current_state; +} __attribute__((packed)); + +struct ti_sci_msg_req_set_device_resets { + struct ti_sci_msg_hdr hdr; + u32 id; + u32 resets; +}; + +struct ti_sci_msg_req_set_clock_state { + struct ti_sci_msg_hdr hdr; + u32 dev_id; + u8 clk_id; + u8 request_state; + u32 clk_id_32; +} __attribute__((packed)); + +struct ti_sci_msg_req_get_clock_state { + struct ti_sci_msg_hdr hdr; + u32 dev_id; + u8 clk_id; + u32 clk_id_32; +} __attribute__((packed)); + +struct ti_sci_msg_resp_get_clock_state { + struct ti_sci_msg_hdr hdr; + u8 programmed_state; + u8 current_state; +} __attribute__((packed)); + +struct ti_sci_msg_req_set_clock_parent { + struct ti_sci_msg_hdr hdr; + u32 dev_id; + u8 clk_id; + u8 parent_id; + u32 clk_id_32; + u32 parent_id_32; +} __attribute__((packed)); + +struct ti_sci_msg_req_get_clock_parent { + struct ti_sci_msg_hdr hdr; + u32 dev_id; + u8 clk_id; + u32 clk_id_32; +} __attribute__((packed)); + +struct ti_sci_msg_resp_get_clock_parent { + struct ti_sci_msg_hdr hdr; + u8 parent_id; + u32 parent_id_32; +} __attribute__((packed)); + +struct ti_sci_msg_req_get_clock_num_parents { + struct ti_sci_msg_hdr hdr; + u32 dev_id; + u8 clk_id; + u32 clk_id_32; +} __attribute__((packed)); + +struct ti_sci_msg_resp_get_clock_num_parents { + struct ti_sci_msg_hdr hdr; + u8 num_parents; + u32 num_parents_32; +} __attribute__((packed)); + +struct ti_sci_msg_req_query_clock_freq { + struct ti_sci_msg_hdr hdr; + u32 dev_id; + u64 min_freq_hz; + u64 target_freq_hz; + u64 max_freq_hz; + u8 clk_id; + u32 clk_id_32; +} __attribute__((packed)); + +struct ti_sci_msg_resp_query_clock_freq { + struct ti_sci_msg_hdr hdr; + u64 freq_hz; +}; + +struct ti_sci_msg_req_set_clock_freq { + struct ti_sci_msg_hdr hdr; + u32 dev_id; + u64 min_freq_hz; + u64 target_freq_hz; + u64 max_freq_hz; + u8 clk_id; + u32 clk_id_32; +} __attribute__((packed)); + +struct ti_sci_msg_req_get_clock_freq { + struct ti_sci_msg_hdr hdr; + u32 dev_id; + u8 clk_id; + u32 clk_id_32; +} __attribute__((packed)); + +struct ti_sci_msg_resp_get_clock_freq { + struct ti_sci_msg_hdr hdr; + u64 freq_hz; +}; + +struct ti_sci_msg_req_get_resource_range { + struct ti_sci_msg_hdr hdr; + u16 type; + u8 subtype; + u8 secondary_host; +}; + +struct ti_sci_msg_resp_get_resource_range { + struct ti_sci_msg_hdr hdr; + u16 range_start; + u16 range_num; + u16 range_start_sec; + u16 range_num_sec; +}; + +struct ti_sci_msg_req_manage_irq { + struct ti_sci_msg_hdr hdr; + u32 valid_params; + u16 src_id; + u16 src_index; + u16 dst_id; + u16 dst_host_irq; + u16 ia_id; + u16 vint; + u16 global_event; + u8 vint_status_bit; + u8 secondary_host; +}; + +struct ti_sci_msg_rm_ring_cfg_req { + struct ti_sci_msg_hdr hdr; + u32 valid_params; + u16 nav_id; + u16 index; + u32 addr_lo; + u32 addr_hi; + u32 count; + u8 mode; + u8 size; + u8 order_id; + u16 virtid; + u8 asel; +} __attribute__((packed)); + +struct ti_sci_msg_psil_pair { + struct ti_sci_msg_hdr hdr; + u32 nav_id; + u32 src_thread; + u32 dst_thread; +}; + +struct ti_sci_msg_psil_unpair { + struct ti_sci_msg_hdr hdr; + u32 nav_id; + u32 src_thread; + u32 dst_thread; +}; + +struct ti_sci_msg_rm_udmap_tx_ch_cfg_req { + struct ti_sci_msg_hdr hdr; + u32 valid_params; + u16 nav_id; + u16 index; + u8 tx_pause_on_err; + u8 tx_filt_einfo; + u8 tx_filt_pswords; + u8 tx_atype; + u8 tx_chan_type; + u8 tx_supr_tdpkt; + u16 tx_fetch_size; + u8 tx_credit_count; + u16 txcq_qnum; + u8 tx_priority; + u8 tx_qos; + u8 tx_orderid; + u16 fdepth; + u8 tx_sched_priority; + u8 tx_burst_size; + u8 tx_tdtype; + u8 extended_ch_type; +} __attribute__((packed)); + +struct ti_sci_msg_rm_udmap_rx_ch_cfg_req { + struct ti_sci_msg_hdr hdr; + u32 valid_params; + u16 nav_id; + u16 index; + u16 rx_fetch_size; + u16 rxcq_qnum; + u8 rx_priority; + u8 rx_qos; + u8 rx_orderid; + u8 rx_sched_priority; + u16 flowid_start; + u16 flowid_cnt; + u8 rx_pause_on_err; + u8 rx_atype; + u8 rx_chan_type; + u8 rx_ignore_short; + u8 rx_ignore_long; + u8 rx_burst_size; +} __attribute__((packed)); + +struct ti_sci_msg_rm_udmap_flow_cfg_req { + struct ti_sci_msg_hdr hdr; + u32 valid_params; + u16 nav_id; + u16 flow_index; + u8 rx_einfo_present; + u8 rx_psinfo_present; + u8 rx_error_handling; + u8 rx_desc_type; + u16 rx_sop_offset; + u16 rx_dest_qnum; + u8 rx_src_tag_hi; + u8 rx_src_tag_lo; + u8 rx_dest_tag_hi; + u8 rx_dest_tag_lo; + u8 rx_src_tag_hi_sel; + u8 rx_src_tag_lo_sel; + u8 rx_dest_tag_hi_sel; + u8 rx_dest_tag_lo_sel; + u16 rx_fdq0_sz0_qnum; + u16 rx_fdq1_qnum; + u16 rx_fdq2_qnum; + u16 rx_fdq3_qnum; + u8 rx_ps_location; +} __attribute__((packed)); + +struct ti_sci_msg_req_proc_request { + struct ti_sci_msg_hdr hdr; + u8 processor_id; +} __attribute__((packed)); + +struct ti_sci_msg_req_proc_release { + struct ti_sci_msg_hdr hdr; + u8 processor_id; +} __attribute__((packed)); + +struct ti_sci_msg_req_proc_handover { + struct ti_sci_msg_hdr hdr; + u8 processor_id; + u8 host_id; +} __attribute__((packed)); + +struct ti_sci_msg_req_set_config { + struct ti_sci_msg_hdr hdr; + u8 processor_id; + u32 bootvector_low; + u32 bootvector_high; + u32 config_flags_set; + u32 config_flags_clear; +} __attribute__((packed)); + +struct ti_sci_msg_req_set_ctrl { + struct ti_sci_msg_hdr hdr; + u8 processor_id; + u32 control_flags_set; + u32 control_flags_clear; +} __attribute__((packed)); + +struct ti_sci_msg_req_get_status { + struct ti_sci_msg_hdr hdr; + u8 processor_id; +} __attribute__((packed)); + +struct ti_sci_msg_resp_get_status { + struct ti_sci_msg_hdr hdr; + u8 processor_id; + u32 bootvector_low; + u32 bootvector_high; + u32 config_flags; + u32 control_flags; + u32 status_flags; +} __attribute__((packed)); + +struct ti_sci_xfer { + struct ti_msgmgr_message tx_message; + u8 rx_len; + u8 *xfer_buf; + struct completion done; +}; + +struct ti_sci_xfers_info { + struct semaphore sem_xfer_count; + struct ti_sci_xfer *xfer_block; + long unsigned int *xfer_alloc_table; + spinlock_t xfer_lock; +}; + +struct ti_sci_desc { + u8 default_host_id; + int max_rx_timeout_ms; + int max_msgs; + int max_msg_size; +}; + +struct ti_sci_info { + struct device *dev; + struct notifier_block nb; + const struct ti_sci_desc *desc; + struct dentry *d; + void *debug_region; + char *debug_buffer; + size_t debug_region_size; + struct ti_sci_handle handle; + struct mbox_client cl; + struct mbox_chan___2 *chan_tx; + struct mbox_chan___2 *chan_rx; + struct ti_sci_xfers_info minfo; + struct list_head node; + u8 host_id; + int users; +}; + +struct scmi_revision_info { + u16 major_ver; + u16 minor_ver; + u8 num_protocols; + u8 num_agents; + u32 impl_ver; + char vendor_id[16]; + char sub_vendor_id[16]; +}; + +struct scmi_xfer_ops; + +struct scmi_protocol_handle { + struct device *dev; + const struct scmi_xfer_ops *xops; + int (*set_priv)(const struct scmi_protocol_handle *, void *); + void * (*get_priv)(const struct scmi_protocol_handle *); +}; + +struct scmi_device; + +struct scmi_handle; + +struct scmi_notify_ops { + int (*devm_event_notifier_register)(struct scmi_device *, u8, u8, const u32 *, struct notifier_block *); + int (*devm_event_notifier_unregister)(struct scmi_device *, u8, u8, const u32 *, struct notifier_block *); + int (*event_notifier_register)(const struct scmi_handle *, u8, u8, const u32 *, struct notifier_block *); + int (*event_notifier_unregister)(const struct scmi_handle *, u8, u8, const u32 *, struct notifier_block *); +}; + +struct scmi_device { + u32 id; + u8 protocol_id; + const char *name; + struct device dev; + struct scmi_handle *handle; +}; + +struct scmi_handle { + struct device *dev; + struct scmi_revision_info *version; + const void * (*devm_protocol_get)(struct scmi_device *, u8, struct scmi_protocol_handle **); + void (*devm_protocol_put)(struct scmi_device *, u8); + const struct scmi_notify_ops *notify_ops; +}; + +struct scmi_device_id { + u8 protocol_id; + const char *name; +}; + +struct scmi_driver { + const char *name; + int (*probe)(struct scmi_device *); + void (*remove)(struct scmi_device *); + const struct scmi_device_id *id_table; + struct device_driver driver; +}; + +struct scmi_event { + u8 id; + size_t max_payld_sz; + size_t max_report_sz; +}; + +struct scmi_event_ops { + int (*get_num_sources)(const struct scmi_protocol_handle *); + int (*set_notify_enabled)(const struct scmi_protocol_handle *, u8, u32, bool); + void * (*fill_custom_report)(const struct scmi_protocol_handle *, u8, ktime_t, const void *, size_t, void *, u32 *); +}; + +struct scmi_protocol_events { + size_t queue_sz; + const struct scmi_event_ops *ops; + const struct scmi_event *evts; + unsigned int num_events; + unsigned int num_sources; +}; + +struct scmi_msg_hdr { + u8 id; + u8 protocol_id; + u8 type; + u16 seq; + u32 status; + bool poll_completion; +}; + +struct scmi_msg { + void *buf; + size_t len; +}; + +struct scmi_xfer { + int transfer_id; + struct scmi_msg_hdr hdr; + struct scmi_msg tx; + struct scmi_msg rx; + struct completion done; + struct completion *async_done; + bool pending; + struct hlist_node node; + refcount_t users; + atomic_t busy; + int state; + spinlock_t lock; + void *priv; +}; + +struct scmi_xfer_ops { + int (*version_get)(const struct scmi_protocol_handle *, u32 *); + int (*xfer_get_init)(const struct scmi_protocol_handle *, u8, size_t, size_t, struct scmi_xfer **); + void (*reset_rx_to_maxsz)(const struct scmi_protocol_handle *, struct scmi_xfer *); + int (*do_xfer)(const struct scmi_protocol_handle *, struct scmi_xfer *); + int (*do_xfer_with_response)(const struct scmi_protocol_handle *, struct scmi_xfer *); + void (*xfer_put)(const struct scmi_protocol_handle *, struct scmi_xfer *); +}; + +typedef int (*scmi_prot_init_ph_fn_t)(const struct scmi_protocol_handle *); + +struct scmi_protocol { + const u8 id; + struct module *owner; + const scmi_prot_init_ph_fn_t instance_init; + const scmi_prot_init_ph_fn_t instance_deinit; + const void *ops; + const struct scmi_protocol_events *events; +}; + +enum scmi_std_protocol { + SCMI_PROTOCOL_BASE = 16, + SCMI_PROTOCOL_POWER = 17, + SCMI_PROTOCOL_SYSTEM = 18, + SCMI_PROTOCOL_PERF = 19, + SCMI_PROTOCOL_CLOCK = 20, + SCMI_PROTOCOL_SENSOR = 21, + SCMI_PROTOCOL_RESET = 22, + SCMI_PROTOCOL_VOLTAGE = 23, +}; + +enum scmi_common_cmd { + PROTOCOL_VERSION = 0, + PROTOCOL_ATTRIBUTES = 1, + PROTOCOL_MESSAGE_ATTRIBUTES = 2, +}; + +struct scmi_chan_info { + struct device *dev; + struct scmi_handle *handle; + void *transport_info; +}; + +struct scmi_transport_ops { + int (*link_supplier)(struct device *); + bool (*chan_available)(struct device *, int); + int (*chan_setup)(struct scmi_chan_info *, struct device *, bool); + int (*chan_free)(int, void *, void *); + unsigned int (*get_max_msg)(struct scmi_chan_info *); + int (*send_message)(struct scmi_chan_info *, struct scmi_xfer *); + void (*mark_txdone)(struct scmi_chan_info *, int); + void (*fetch_response)(struct scmi_chan_info *, struct scmi_xfer *); + void (*fetch_notification)(struct scmi_chan_info *, size_t, struct scmi_xfer *); + void (*clear_channel)(struct scmi_chan_info *); + bool (*poll_done)(struct scmi_chan_info *, struct scmi_xfer *); +}; + +struct scmi_desc { + int (*transport_init)(); + void (*transport_exit)(); + const struct scmi_transport_ops *ops; + int max_rx_timeout_ms; + int max_msg; + int max_msg_size; +}; + +struct trace_event_raw_scmi_xfer_begin { + struct trace_entry ent; + int transfer_id; + u8 msg_id; + u8 protocol_id; + u16 seq; + bool poll; + char __data[0]; +}; + +struct trace_event_raw_scmi_xfer_end { + struct trace_entry ent; + int transfer_id; + u8 msg_id; + u8 protocol_id; + u16 seq; + int status; + char __data[0]; +}; + +struct trace_event_raw_scmi_rx_done { + struct trace_entry ent; + int transfer_id; + u8 msg_id; + u8 protocol_id; + u16 seq; + u8 msg_type; + char __data[0]; +}; + +struct trace_event_data_offsets_scmi_xfer_begin {}; + +struct trace_event_data_offsets_scmi_xfer_end {}; + +struct trace_event_data_offsets_scmi_rx_done {}; + +typedef void (*btf_trace_scmi_xfer_begin)(void *, int, u8, u8, u16, bool); + +typedef void (*btf_trace_scmi_xfer_end)(void *, int, u8, u8, u16, int); + +typedef void (*btf_trace_scmi_rx_done)(void *, int, u8, u8, u16, u8); + +enum scmi_error_codes { + SCMI_SUCCESS = 0, + SCMI_ERR_SUPPORT = 4294967295, + SCMI_ERR_PARAMS = 4294967294, + SCMI_ERR_ACCESS = 4294967293, + SCMI_ERR_ENTRY = 4294967292, + SCMI_ERR_RANGE = 4294967291, + SCMI_ERR_BUSY = 4294967290, + SCMI_ERR_COMMS = 4294967289, + SCMI_ERR_GENERIC = 4294967288, + SCMI_ERR_HARDWARE = 4294967287, + SCMI_ERR_PROTOCOL = 4294967286, +}; + +struct scmi_requested_dev { + const struct scmi_device_id *id_table; + struct list_head node; +}; + +struct scmi_xfers_info { + long unsigned int *xfer_alloc_table; + spinlock_t xfer_lock; + int max_msg; + struct hlist_head free_xfers; + struct hlist_head pending_xfers[512]; +}; + +struct scmi_protocol_instance { + const struct scmi_handle *handle; + const struct scmi_protocol *proto; + void *gid; + refcount_t users; + void *priv; + struct scmi_protocol_handle ph; +}; + +struct scmi_info { + struct device *dev; + const struct scmi_desc *desc; + struct scmi_revision_info version; + struct scmi_handle handle; + struct scmi_xfers_info tx_minfo; + struct scmi_xfers_info rx_minfo; + struct idr tx_idr; + struct idr rx_idr; + struct idr protocols; + struct mutex protocols_mtx; + u8 *protocols_imp; + struct idr active_protocols; + void *notify_priv; + struct list_head node; + int users; +}; + +struct scmi_protocol_devres { + const struct scmi_handle *handle; + u8 protocol_id; +}; + +struct scmi_registered_events_desc; + +struct scmi_notify_instance { + void *gid; + struct scmi_handle *handle; + struct work_struct init_work; + struct workqueue_struct *notify_wq; + struct mutex pending_mtx; + struct scmi_registered_events_desc **registered_protocols; + struct hlist_head pending_events_handlers[16]; +}; + +struct events_queue { + size_t sz; + struct kfifo kfifo; + struct work_struct notify_work; + struct workqueue_struct *wq; +}; + +struct scmi_event_header; + +struct scmi_registered_event; + +struct scmi_registered_events_desc { + u8 id; + const struct scmi_event_ops *ops; + struct events_queue equeue; + struct scmi_notify_instance *ni; + struct scmi_event_header *eh; + size_t eh_sz; + void *in_flight; + int num_events; + struct scmi_registered_event **registered_events; + struct mutex registered_mtx; + const struct scmi_protocol_handle *ph; + struct hlist_head registered_events_handlers[64]; +}; + +struct scmi_event_header { + ktime_t timestamp; + size_t payld_sz; + unsigned char evt_id; + unsigned char payld[0]; +}; + +struct scmi_registered_event { + struct scmi_registered_events_desc *proto; + const struct scmi_event *evt; + void *report; + u32 num_sources; + refcount_t *sources; + struct mutex sources_mtx; +}; + +struct scmi_event_handler { + u32 key; + refcount_t users; + struct scmi_registered_event *r_evt; + struct blocking_notifier_head chain; + struct hlist_node hash; + bool enabled; +}; + +struct scmi_notifier_devres { + const struct scmi_handle *handle; + u8 proto_id; + u8 evt_id; + u32 __src_id; + u32 *src_id; + struct notifier_block *nb; +}; + +enum scmi_notification_events { + SCMI_EVENT_POWER_STATE_CHANGED = 0, + SCMI_EVENT_PERFORMANCE_LIMITS_CHANGED = 0, + SCMI_EVENT_PERFORMANCE_LEVEL_CHANGED = 1, + SCMI_EVENT_SENSOR_TRIP_POINT_EVENT = 0, + SCMI_EVENT_SENSOR_UPDATE = 1, + SCMI_EVENT_RESET_ISSUED = 0, + SCMI_EVENT_BASE_ERROR_EVENT = 0, + SCMI_EVENT_SYSTEM_POWER_STATE_NOTIFIER = 0, +}; + +struct scmi_base_error_report { + ktime_t timestamp; + unsigned int agent_id; + bool fatal; + unsigned int cmd_count; + long long unsigned int reports[0]; +}; + +enum scmi_base_protocol_cmd { + BASE_DISCOVER_VENDOR = 3, + BASE_DISCOVER_SUB_VENDOR = 4, + BASE_DISCOVER_IMPLEMENT_VERSION = 5, + BASE_DISCOVER_LIST_PROTOCOLS = 6, + BASE_DISCOVER_AGENT = 7, + BASE_NOTIFY_ERRORS = 8, + BASE_SET_DEVICE_PERMISSIONS = 9, + BASE_SET_PROTOCOL_PERMISSIONS = 10, + BASE_RESET_AGENT_CONFIGURATION = 11, +}; + +struct scmi_msg_resp_base_attributes { + u8 num_protocols; + u8 num_agents; + __le16 reserved; +}; + +struct scmi_msg_resp_base_discover_agent { + __le32 agent_id; + u8 name[16]; +}; + +struct scmi_msg_base_error_notify { + __le32 event_control; +}; + +struct scmi_base_error_notify_payld { + __le32 agent_id; + __le32 error_status; + __le64 msg_reports[1024]; +}; + +struct scmi_clock_info { + char name[16]; + bool rate_discrete; + union { + struct { + int num_rates; + u64 rates[16]; + } list; + struct { + u64 min_rate; + u64 max_rate; + u64 step_size; + } range; + }; +}; + +struct scmi_clk_proto_ops { + int (*count_get)(const struct scmi_protocol_handle *); + const struct scmi_clock_info * (*info_get)(const struct scmi_protocol_handle *, u32); + int (*rate_get)(const struct scmi_protocol_handle *, u32, u64 *); + int (*rate_set)(const struct scmi_protocol_handle *, u32, u64); + int (*enable)(const struct scmi_protocol_handle *, u32); + int (*disable)(const struct scmi_protocol_handle *, u32); +}; + +enum scmi_clock_protocol_cmd { + CLOCK_ATTRIBUTES = 3, + CLOCK_DESCRIBE_RATES = 4, + CLOCK_RATE_SET = 5, + CLOCK_RATE_GET = 6, + CLOCK_CONFIG_SET = 7, +}; + +struct scmi_msg_resp_clock_protocol_attributes { + __le16 num_clocks; + u8 max_async_req; + u8 reserved; +}; + +struct scmi_msg_resp_clock_attributes { + __le32 attributes; + u8 name[16]; +}; + +struct scmi_clock_set_config { + __le32 id; + __le32 attributes; +}; + +struct scmi_msg_clock_describe_rates { + __le32 id; + __le32 rate_index; +}; + +struct scmi_msg_resp_clock_describe_rates { + __le32 num_rates_flags; + struct { + __le32 value_low; + __le32 value_high; + } rate[0]; +}; + +struct scmi_clock_set_rate { + __le32 flags; + __le32 id; + __le32 value_low; + __le32 value_high; +}; + +struct clock_info { + u32 version; + int num_clocks; + int max_async_req; + atomic_t cur_async_req; + struct scmi_clock_info *clk; +}; + +struct scmi_perf_proto_ops { + int (*limits_set)(const struct scmi_protocol_handle *, u32, u32, u32); + int (*limits_get)(const struct scmi_protocol_handle *, u32, u32 *, u32 *); + int (*level_set)(const struct scmi_protocol_handle *, u32, u32, bool); + int (*level_get)(const struct scmi_protocol_handle *, u32, u32 *, bool); + int (*device_domain_id)(struct device *); + int (*transition_latency_get)(const struct scmi_protocol_handle *, struct device *); + int (*device_opps_add)(const struct scmi_protocol_handle *, struct device *); + int (*freq_set)(const struct scmi_protocol_handle *, u32, long unsigned int, bool); + int (*freq_get)(const struct scmi_protocol_handle *, u32, long unsigned int *, bool); + int (*est_power_get)(const struct scmi_protocol_handle *, u32, long unsigned int *, long unsigned int *); + bool (*fast_switch_possible)(const struct scmi_protocol_handle *, struct device *); + bool (*power_scale_mw_get)(const struct scmi_protocol_handle *); +}; + +struct scmi_perf_limits_report { + ktime_t timestamp; + unsigned int agent_id; + unsigned int domain_id; + unsigned int range_max; + unsigned int range_min; +}; + +struct scmi_perf_level_report { + ktime_t timestamp; + unsigned int agent_id; + unsigned int domain_id; + unsigned int performance_level; +}; + +enum scmi_performance_protocol_cmd { + PERF_DOMAIN_ATTRIBUTES = 3, + PERF_DESCRIBE_LEVELS = 4, + PERF_LIMITS_SET = 5, + PERF_LIMITS_GET = 6, + PERF_LEVEL_SET = 7, + PERF_LEVEL_GET = 8, + PERF_NOTIFY_LIMITS = 9, + PERF_NOTIFY_LEVEL = 10, + PERF_DESCRIBE_FASTCHANNEL = 11, +}; + +struct scmi_opp { + u32 perf; + u32 power; + u32 trans_latency_us; +}; + +struct scmi_msg_resp_perf_attributes { + __le16 num_domains; + __le16 flags; + __le32 stats_addr_low; + __le32 stats_addr_high; + __le32 stats_size; +}; + +struct scmi_msg_resp_perf_domain_attributes { + __le32 flags; + __le32 rate_limit_us; + __le32 sustained_freq_khz; + __le32 sustained_perf_level; + u8 name[16]; +}; + +struct scmi_msg_perf_describe_levels { + __le32 domain; + __le32 level_index; +}; + +struct scmi_perf_set_limits { + __le32 domain; + __le32 max_level; + __le32 min_level; +}; + +struct scmi_perf_get_limits { + __le32 max_level; + __le32 min_level; +}; + +struct scmi_perf_set_level { + __le32 domain; + __le32 level; +}; + +struct scmi_perf_notify_level_or_limits { + __le32 domain; + __le32 notify_enable; +}; + +struct scmi_perf_limits_notify_payld { + __le32 agent_id; + __le32 domain_id; + __le32 range_max; + __le32 range_min; +}; + +struct scmi_perf_level_notify_payld { + __le32 agent_id; + __le32 domain_id; + __le32 performance_level; +}; + +struct scmi_msg_resp_perf_describe_levels { + __le16 num_returned; + __le16 num_remaining; + struct { + __le32 perf_val; + __le32 power; + __le16 transition_latency_us; + __le16 reserved; + } opp[0]; +}; + +struct scmi_perf_get_fc_info { + __le32 domain; + __le32 message_id; +}; + +struct scmi_msg_resp_perf_desc_fc { + __le32 attr; + __le32 rate_limit; + __le32 chan_addr_low; + __le32 chan_addr_high; + __le32 chan_size; + __le32 db_addr_low; + __le32 db_addr_high; + __le32 db_set_lmask; + __le32 db_set_hmask; + __le32 db_preserve_lmask; + __le32 db_preserve_hmask; +}; + +struct scmi_fc_db_info { + int width; + u64 set; + u64 mask; + void *addr; +}; + +struct scmi_fc_info { + void *level_set_addr; + void *limit_set_addr; + void *level_get_addr; + void *limit_get_addr; + struct scmi_fc_db_info *level_set_db; + struct scmi_fc_db_info *limit_set_db; +}; + +struct perf_dom_info { + bool set_limits; + bool set_perf; + bool perf_limit_notify; + bool perf_level_notify; + bool perf_fastchannels; + u32 opp_count; + u32 sustained_freq_khz; + u32 sustained_perf_level; + u32 mult_factor; + char name[16]; + struct scmi_opp opp[16]; + struct scmi_fc_info *fc_info; +}; + +struct scmi_perf_info { + u32 version; + int num_domains; + bool power_scale_mw; + u64 stats_addr; + u32 stats_size; + struct perf_dom_info *dom_info; +}; + +struct scmi_power_proto_ops { + int (*num_domains_get)(const struct scmi_protocol_handle *); + char * (*name_get)(const struct scmi_protocol_handle *, u32); + int (*state_set)(const struct scmi_protocol_handle *, u32, u32); + int (*state_get)(const struct scmi_protocol_handle *, u32, u32 *); +}; + +struct scmi_power_state_changed_report { + ktime_t timestamp; + unsigned int agent_id; + unsigned int domain_id; + unsigned int power_state; +}; + +enum scmi_power_protocol_cmd { + POWER_DOMAIN_ATTRIBUTES = 3, + POWER_STATE_SET = 4, + POWER_STATE_GET = 5, + POWER_STATE_NOTIFY = 6, +}; + +struct scmi_msg_resp_power_attributes { + __le16 num_domains; + __le16 reserved; + __le32 stats_addr_low; + __le32 stats_addr_high; + __le32 stats_size; +}; + +struct scmi_msg_resp_power_domain_attributes { + __le32 flags; + u8 name[16]; +}; + +struct scmi_power_set_state { + __le32 flags; + __le32 domain; + __le32 state; +}; + +struct scmi_power_state_notify { + __le32 domain; + __le32 notify_enable; +}; + +struct scmi_power_state_notify_payld { + __le32 agent_id; + __le32 domain_id; + __le32 power_state; +}; + +struct power_dom_info { + bool state_set_sync; + bool state_set_async; + bool state_set_notify; + char name[16]; +}; + +struct scmi_power_info { + u32 version; + int num_domains; + u64 stats_addr; + u32 stats_size; + struct power_dom_info *dom_info; +}; + +struct scmi_reset_proto_ops { + int (*num_domains_get)(const struct scmi_protocol_handle *); + char * (*name_get)(const struct scmi_protocol_handle *, u32); + int (*latency_get)(const struct scmi_protocol_handle *, u32); + int (*reset)(const struct scmi_protocol_handle *, u32); + int (*assert)(const struct scmi_protocol_handle *, u32); + int (*deassert)(const struct scmi_protocol_handle *, u32); +}; + +struct scmi_reset_issued_report { + ktime_t timestamp; + unsigned int agent_id; + unsigned int domain_id; + unsigned int reset_state; +}; + +enum scmi_reset_protocol_cmd { + RESET_DOMAIN_ATTRIBUTES = 3, + RESET = 4, + RESET_NOTIFY = 5, +}; + +struct scmi_msg_resp_reset_domain_attributes { + __le32 attributes; + __le32 latency; + u8 name[16]; +}; + +struct scmi_msg_reset_domain_reset { + __le32 domain_id; + __le32 flags; + __le32 reset_state; +}; + +struct scmi_msg_reset_notify { + __le32 id; + __le32 event_control; +}; + +struct scmi_reset_issued_notify_payld { + __le32 agent_id; + __le32 domain_id; + __le32 reset_state; +}; + +struct reset_dom_info { + bool async_reset; + bool reset_notify; + u32 latency_us; + char name[16]; +}; + +struct scmi_reset_info { + u32 version; + int num_domains; + struct reset_dom_info *dom_info; +}; + +struct scmi_sensor_reading { + long long int value; + long long unsigned int timestamp; +}; + +struct scmi_range_attrs { + long long int min_range; + long long int max_range; +}; + +struct scmi_sensor_axis_info { + unsigned int id; + unsigned int type; + int scale; + char name[16]; + bool extended_attrs; + unsigned int resolution; + int exponent; + struct scmi_range_attrs attrs; +}; + +struct scmi_sensor_intervals_info { + bool segmented; + unsigned int count; + unsigned int *desc; + unsigned int prealloc_pool[16]; +}; + +struct scmi_sensor_info { + unsigned int id; + unsigned int type; + int scale; + unsigned int num_trip_points; + bool async; + bool update; + bool timestamped; + int tstamp_scale; + unsigned int num_axis; + struct scmi_sensor_axis_info *axis; + struct scmi_sensor_intervals_info intervals; + unsigned int sensor_config; + char name[16]; + bool extended_scalar_attrs; + unsigned int sensor_power; + unsigned int resolution; + int exponent; + struct scmi_range_attrs scalar_attrs; +}; + +struct scmi_sensor_proto_ops { + int (*count_get)(const struct scmi_protocol_handle *); + const struct scmi_sensor_info * (*info_get)(const struct scmi_protocol_handle *, u32); + int (*trip_point_config)(const struct scmi_protocol_handle *, u32, u8, u64); + int (*reading_get)(const struct scmi_protocol_handle *, u32, u64 *); + int (*reading_get_timestamped)(const struct scmi_protocol_handle *, u32, u8, struct scmi_sensor_reading *); + int (*config_get)(const struct scmi_protocol_handle *, u32, u32 *); + int (*config_set)(const struct scmi_protocol_handle *, u32, u32); +}; + +struct scmi_sensor_trip_point_report { + ktime_t timestamp; + unsigned int agent_id; + unsigned int sensor_id; + unsigned int trip_point_desc; +}; + +struct scmi_sensor_update_report { + ktime_t timestamp; + unsigned int agent_id; + unsigned int sensor_id; + unsigned int readings_count; + struct scmi_sensor_reading readings[0]; +}; + +enum scmi_sensor_protocol_cmd { + SENSOR_DESCRIPTION_GET = 3, + SENSOR_TRIP_POINT_NOTIFY = 4, + SENSOR_TRIP_POINT_CONFIG = 5, + SENSOR_READING_GET = 6, + SENSOR_AXIS_DESCRIPTION_GET = 7, + SENSOR_LIST_UPDATE_INTERVALS = 8, + SENSOR_CONFIG_GET = 9, + SENSOR_CONFIG_SET = 10, + SENSOR_CONTINUOUS_UPDATE_NOTIFY = 11, +}; + +struct scmi_msg_resp_sensor_attributes { + __le16 num_sensors; + u8 max_requests; + u8 reserved; + __le32 reg_addr_low; + __le32 reg_addr_high; + __le32 reg_size; +}; + +struct scmi_msg_resp_attrs { + __le32 min_range_low; + __le32 min_range_high; + __le32 max_range_low; + __le32 max_range_high; +}; + +struct scmi_sensor_descriptor { + __le32 id; + __le32 attributes_low; + __le32 attributes_high; + u8 name[16]; + __le32 power; + __le32 resolution; + struct scmi_msg_resp_attrs scalar_attrs; +}; + +struct scmi_msg_resp_sensor_description { + __le16 num_returned; + __le16 num_remaining; + struct scmi_sensor_descriptor desc[0]; +}; + +struct scmi_msg_sensor_axis_description_get { + __le32 id; + __le32 axis_desc_index; +}; + +struct scmi_axis_descriptor { + __le32 id; + __le32 attributes_low; + __le32 attributes_high; + u8 name[16]; + __le32 resolution; + struct scmi_msg_resp_attrs attrs; +}; + +struct scmi_msg_resp_sensor_axis_description { + __le32 num_axis_flags; + struct scmi_axis_descriptor desc[0]; +}; + +struct scmi_msg_sensor_list_update_intervals { + __le32 id; + __le32 index; +}; + +struct scmi_msg_resp_sensor_list_update_intervals { + __le32 num_intervals_flags; + __le32 intervals[0]; +}; + +struct scmi_msg_sensor_request_notify { + __le32 id; + __le32 event_control; +}; + +struct scmi_msg_set_sensor_trip_point { + __le32 id; + __le32 event_control; + __le32 value_low; + __le32 value_high; +}; + +struct scmi_msg_sensor_config_set { + __le32 id; + __le32 sensor_config; +}; + +struct scmi_msg_sensor_reading_get { + __le32 id; + __le32 flags; +}; + +struct scmi_resp_sensor_reading_complete { + __le32 id; + __le32 readings_low; + __le32 readings_high; +}; + +struct scmi_sensor_reading_resp { + __le32 sensor_value_low; + __le32 sensor_value_high; + __le32 timestamp_low; + __le32 timestamp_high; +}; + +struct scmi_resp_sensor_reading_complete_v3 { + __le32 id; + struct scmi_sensor_reading_resp readings[0]; +}; + +struct scmi_sensor_trip_notify_payld { + __le32 agent_id; + __le32 sensor_id; + __le32 trip_point_desc; +}; + +struct scmi_sensor_update_notify_payld { + __le32 agent_id; + __le32 sensor_id; + struct scmi_sensor_reading_resp readings[0]; +}; + +struct sensors_info { + u32 version; + int num_sensors; + int max_requests; + u64 reg_addr; + u32 reg_size; + struct scmi_sensor_info *sensors; +}; + +struct scmi_system_power_state_notifier_report { + ktime_t timestamp; + unsigned int agent_id; + unsigned int flags; + unsigned int system_state; +}; + +enum scmi_system_protocol_cmd { + SYSTEM_POWER_STATE_NOTIFY = 5, +}; + +struct scmi_system_power_state_notify { + __le32 notify_enable; +}; + +struct scmi_system_power_state_notifier_payld { + __le32 agent_id; + __le32 flags; + __le32 system_state; +}; + +struct scmi_system_info { + u32 version; +}; + +struct scmi_voltage_info { + unsigned int id; + bool segmented; + bool negative_volts_allowed; + unsigned int attributes; + char name[16]; + unsigned int num_levels; + int *levels_uv; +}; + +struct scmi_voltage_proto_ops { + int (*num_domains_get)(const struct scmi_protocol_handle *); + const struct scmi_voltage_info * (*info_get)(const struct scmi_protocol_handle *, u32); + int (*config_set)(const struct scmi_protocol_handle *, u32, u32); + int (*config_get)(const struct scmi_protocol_handle *, u32, u32 *); + int (*level_set)(const struct scmi_protocol_handle *, u32, u32, s32); + int (*level_get)(const struct scmi_protocol_handle *, u32, s32 *); +}; + +enum scmi_voltage_protocol_cmd { + VOLTAGE_DOMAIN_ATTRIBUTES = 3, + VOLTAGE_DESCRIBE_LEVELS = 4, + VOLTAGE_CONFIG_SET = 5, + VOLTAGE_CONFIG_GET = 6, + VOLTAGE_LEVEL_SET = 7, + VOLTAGE_LEVEL_GET = 8, +}; + +struct scmi_msg_resp_domain_attributes { + __le32 attr; + u8 name[16]; +}; + +struct scmi_msg_cmd_describe_levels { + __le32 domain_id; + __le32 level_index; +}; + +struct scmi_msg_resp_describe_levels { + __le32 flags; + __le32 voltage[0]; +}; + +struct scmi_msg_cmd_config_set { + __le32 domain_id; + __le32 config; +}; + +struct scmi_msg_cmd_level_set { + __le32 domain_id; + __le32 flags; + __le32 voltage_level; +}; + +struct voltage_info { + unsigned int version; + unsigned int num_domains; + struct scmi_voltage_info *domains; +}; + +struct scmi_shared_mem { + __le32 reserved; + __le32 channel_status; + __le32 reserved1[2]; + __le32 flags; + __le32 length; + __le32 msg_header; + u8 msg_payload[0]; +}; + +struct scmi_shared_mem___2; + +struct scmi_mailbox { + struct mbox_client cl; + struct mbox_chan___2 *chan; + struct scmi_chan_info *cinfo; + struct scmi_shared_mem___2 *shmem; +}; + +struct scmi_smc { + struct scmi_chan_info *cinfo; + struct scmi_shared_mem___2 *shmem; + struct mutex shmem_lock; + u32 func_id; + int irq; + struct completion tx_complete; +}; + +struct scmi_msg_payld { + __le32 msg_header; + __le32 msg_payload[0]; +}; + +struct scmi_vio_channel { + struct virtqueue *vqueue; + struct scmi_chan_info *cinfo; + struct list_head free_list; + bool is_rx; + bool ready; + unsigned int max_msg; + spinlock_t lock; + spinlock_t ready_lock; +}; + +struct scmi_msg_payld___2; + +struct scmi_vio_msg { + struct scmi_msg_payld___2 *request; + struct scmi_msg_payld___2 *input; + struct list_head list; + unsigned int rx_len; +}; + +struct meson_sm_cmd { + unsigned int index; + u32 smc_id; +}; + +struct meson_sm_chip { + unsigned int shmem_size; + u32 cmd_shmem_in_base; + u32 cmd_shmem_out_base; + struct meson_sm_cmd cmd[0]; +}; + +struct meson_sm_firmware___2 { + const struct meson_sm_chip *chip; + void *sm_shmem_in_base; + void *sm_shmem_out_base; +}; + +struct bmp_header { + u16 id; + u32 size; +} __attribute__((packed)); + +typedef efi_status_t efi_query_variable_store_t(u32, long unsigned int, bool); + +typedef struct { + efi_guid_t guid; + u64 table; +} efi_config_table_64_t; + +typedef struct { + efi_guid_t guid; + u32 table; +} efi_config_table_32_t; + +typedef union { + struct { + efi_guid_t guid; + void *table; + }; + efi_config_table_32_t mixed_mode; +} efi_config_table_t; + +typedef struct { + efi_guid_t guid; + long unsigned int *ptr; + const char name[16]; +} efi_config_table_type_t; + +typedef struct { + u16 version; + u16 length; + u32 runtime_services_supported; +} efi_rt_properties_table_t; + +struct efivar_operations { + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_store_t *query_variable_store; +}; + +struct efivars { + struct kset *kset; + struct kobject *kobject; + const struct efivar_operations *ops; +}; + +struct linux_efi_random_seed { + u32 size; + u8 bits[0]; +}; + +struct linux_efi_memreserve { + int size; + atomic_t count; + phys_addr_t next; + struct { + phys_addr_t base; + phys_addr_t size; + } entry[0]; +}; + +struct efi_generic_dev_path { + u8 type; + u8 sub_type; + u16 length; +}; + +struct variable_validate { + efi_guid_t vendor; + char *name; + bool (*validate)(efi_char16_t *, int, u8 *, long unsigned int); +}; + +typedef struct { + u32 version; + u32 num_entries; + u32 desc_size; + u32 reserved; + efi_memory_desc_t entry[0]; +} efi_memory_attributes_table_t; + +typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *); + +struct efi_memory_map_data { + phys_addr_t phys_map; + long unsigned int size; + long unsigned int desc_version; + long unsigned int desc_size; + long unsigned int flags; +}; + +struct efi_mem_range { + struct range range; + u64 attribute; +}; + +typedef u64 efi_physical_addr_t; + +typedef struct { + u64 length; + u64 data; +} efi_capsule_block_desc_t; + +enum { + SYSTAB = 0, + MMBASE = 1, + MMSIZE = 2, + DCSIZE = 3, + DCVERS = 4, + PARAMCOUNT = 5, +}; + +struct efi_system_resource_entry_v1 { + efi_guid_t fw_class; + u32 fw_type; + u32 fw_version; + u32 lowest_supported_fw_version; + u32 capsule_flags; + u32 last_attempt_version; + u32 last_attempt_status; +}; + +struct efi_system_resource_table { + u32 fw_resource_count; + u32 fw_resource_count_max; + u64 fw_resource_version; + u8 entries[0]; +}; + +struct esre_entry { + union { + struct efi_system_resource_entry_v1 *esre1; + } esre; + struct kobject kobj; + struct list_head list; +}; + +struct esre_attribute { + struct attribute attr; + ssize_t (*show)(struct esre_entry *, char *); + ssize_t (*store)(struct esre_entry *, const char *, size_t); +}; + +struct cper_sec_proc_generic { + u64 validation_bits; + u8 proc_type; + u8 proc_isa; + u8 proc_error_type; + u8 operation; + u8 flags; + u8 level; + u16 reserved; + u64 cpu_version; + char cpu_brand[128]; + u64 proc_id; + u64 target_addr; + u64 requestor_id; + u64 responder_id; + u64 ip; +}; + +struct cper_mem_err_compact { + u64 validation_bits; + u16 node; + u16 card; + u16 module; + u16 bank; + u16 device; + u16 row; + u16 column; + u16 bit_pos; + u64 requestor_id; + u64 responder_id; + u64 target_id; + u16 rank; + u16 mem_array_handle; + u16 mem_dev_handle; + u8 extended; +} __attribute__((packed)); + +struct cper_sec_fw_err_rec_ref { + u8 record_type; + u8 revision; + u8 reserved[6]; + u64 record_identifier; + guid_t record_identifier_guid; +}; + +enum efi_rts_ids { + EFI_NONE = 0, + EFI_GET_TIME = 1, + EFI_SET_TIME = 2, + EFI_GET_WAKEUP_TIME = 3, + EFI_SET_WAKEUP_TIME = 4, + EFI_GET_VARIABLE = 5, + EFI_GET_NEXT_VARIABLE = 6, + EFI_SET_VARIABLE = 7, + EFI_QUERY_VARIABLE_INFO = 8, + EFI_GET_NEXT_HIGH_MONO_COUNT = 9, + EFI_RESET_SYSTEM = 10, + EFI_UPDATE_CAPSULE = 11, + EFI_QUERY_CAPSULE_CAPS = 12, +}; + +struct efi_runtime_work { + void *arg1; + void *arg2; + void *arg3; + void *arg4; + void *arg5; + efi_status_t status; + struct work_struct work; + enum efi_rts_ids efi_rts_id; + struct completion efi_rts_comp; +}; + +struct efi_mokvar_sysfs_attr { + struct bin_attribute bin_attr; + struct list_head node; +}; + +enum { + M_I17 = 0, + M_I20 = 1, + M_I20_SR = 2, + M_I24 = 3, + M_I24_8_1 = 4, + M_I24_10_1 = 5, + M_I27_11_1 = 6, + M_MINI = 7, + M_MINI_3_1 = 8, + M_MINI_4_1 = 9, + M_MB = 10, + M_MB_2 = 11, + M_MB_3 = 12, + M_MB_5_1 = 13, + M_MB_6_1 = 14, + M_MB_7_1 = 15, + M_MB_SR = 16, + M_MBA = 17, + M_MBA_3 = 18, + M_MBP = 19, + M_MBP_2 = 20, + M_MBP_2_2 = 21, + M_MBP_SR = 22, + M_MBP_4 = 23, + M_MBP_5_1 = 24, + M_MBP_5_2 = 25, + M_MBP_5_3 = 26, + M_MBP_6_1 = 27, + M_MBP_6_2 = 28, + M_MBP_7_1 = 29, + M_MBP_8_2 = 30, + M_UNKNOWN = 31, +}; + +struct efifb_dmi_info { + char *optname; + long unsigned int base; + int stride; + int width; + int height; + int flags; +}; + +enum { + OVERRIDE_NONE = 0, + OVERRIDE_BASE = 1, + OVERRIDE_STRIDE = 2, + OVERRIDE_HEIGHT = 4, + OVERRIDE_WIDTH = 8, +}; + +typedef void *efi_event_t; + +typedef void (*efi_event_notify_t)(efi_event_t, void *); + +typedef enum { + EfiTimerCancel = 0, + EfiTimerPeriodic = 1, + EfiTimerRelative = 2, +} EFI_TIMER_DELAY; + +typedef void *efi_handle_t; + +typedef struct efi_generic_dev_path efi_device_path_protocol_t; + +union efi_boot_services { + struct { + efi_table_hdr_t hdr; + void *raise_tpl; + void *restore_tpl; + efi_status_t (*allocate_pages)(int, int, long unsigned int, efi_physical_addr_t *); + efi_status_t (*free_pages)(efi_physical_addr_t, long unsigned int); + efi_status_t (*get_memory_map)(long unsigned int *, void *, long unsigned int *, long unsigned int *, u32 *); + efi_status_t (*allocate_pool)(int, long unsigned int, void **); + efi_status_t (*free_pool)(void *); + efi_status_t (*create_event)(u32, long unsigned int, efi_event_notify_t, void *, efi_event_t *); + efi_status_t (*set_timer)(efi_event_t, EFI_TIMER_DELAY, u64); + efi_status_t (*wait_for_event)(long unsigned int, efi_event_t *, long unsigned int *); + void *signal_event; + efi_status_t (*close_event)(efi_event_t); + void *check_event; + void *install_protocol_interface; + void *reinstall_protocol_interface; + void *uninstall_protocol_interface; + efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **); + void *__reserved; + void *register_protocol_notify; + efi_status_t (*locate_handle)(int, efi_guid_t *, void *, long unsigned int *, efi_handle_t *); + efi_status_t (*locate_device_path)(efi_guid_t *, efi_device_path_protocol_t **, efi_handle_t *); + efi_status_t (*install_configuration_table)(efi_guid_t *, void *); + void *load_image; + void *start_image; + efi_status_t (*exit)(efi_handle_t, efi_status_t, long unsigned int, efi_char16_t *); + void *unload_image; + efi_status_t (*exit_boot_services)(efi_handle_t, long unsigned int); + void *get_next_monotonic_count; + efi_status_t (*stall)(long unsigned int); + void *set_watchdog_timer; + void *connect_controller; + efi_status_t (*disconnect_controller)(efi_handle_t, efi_handle_t, efi_handle_t); + void *open_protocol; + void *close_protocol; + void *open_protocol_information; + void *protocols_per_handle; + void *locate_handle_buffer; + efi_status_t (*locate_protocol)(efi_guid_t *, void *, void **); + void *install_multiple_protocol_interfaces; + void *uninstall_multiple_protocol_interfaces; + void *calculate_crc32; + void *copy_mem; + void *set_mem; + void *create_event_ex; + }; + struct { + efi_table_hdr_t hdr; + u32 raise_tpl; + u32 restore_tpl; + u32 allocate_pages; + u32 free_pages; + u32 get_memory_map; + u32 allocate_pool; + u32 free_pool; + u32 create_event; + u32 set_timer; + u32 wait_for_event; + u32 signal_event; + u32 close_event; + u32 check_event; + u32 install_protocol_interface; + u32 reinstall_protocol_interface; + u32 uninstall_protocol_interface; + u32 handle_protocol; + u32 __reserved; + u32 register_protocol_notify; + u32 locate_handle; + u32 locate_device_path; + u32 install_configuration_table; + u32 load_image; + u32 start_image; + u32 exit; + u32 unload_image; + u32 exit_boot_services; + u32 get_next_monotonic_count; + u32 stall; + u32 set_watchdog_timer; + u32 connect_controller; + u32 disconnect_controller; + u32 open_protocol; + u32 close_protocol; + u32 open_protocol_information; + u32 protocols_per_handle; + u32 locate_handle_buffer; + u32 locate_protocol; + u32 install_multiple_protocol_interfaces; + u32 uninstall_multiple_protocol_interfaces; + u32 calculate_crc32; + u32 copy_mem; + u32 set_mem; + u32 create_event_ex; + } mixed_mode; +}; + +typedef union efi_boot_services efi_boot_services_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 fw_vendor; + u32 fw_revision; + u32 con_in_handle; + u32 con_in; + u32 con_out_handle; + u32 con_out; + u32 stderr_handle; + u32 stderr; + u32 runtime; + u32 boottime; + u32 nr_tables; + u32 tables; +} efi_system_table_32_t; + +typedef struct { + u16 scan_code; + efi_char16_t unicode_char; +} efi_input_key_t; + +union efi_simple_text_input_protocol; + +typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; + +union efi_simple_text_input_protocol { + struct { + void *reset; + efi_status_t (*read_keystroke)(efi_simple_text_input_protocol_t *, efi_input_key_t *); + efi_event_t wait_for_key; + }; + struct { + u32 reset; + u32 read_keystroke; + u32 wait_for_key; + } mixed_mode; +}; + +union efi_simple_text_output_protocol; + +typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; + +union efi_simple_text_output_protocol { + struct { + void *reset; + efi_status_t (*output_string)(efi_simple_text_output_protocol_t *, efi_char16_t *); + void *test_string; + }; + struct { + u32 reset; + u32 output_string; + u32 test_string; + } mixed_mode; +}; + +typedef union { + struct { + efi_table_hdr_t hdr; + long unsigned int fw_vendor; + u32 fw_revision; + long unsigned int con_in_handle; + efi_simple_text_input_protocol_t *con_in; + long unsigned int con_out_handle; + efi_simple_text_output_protocol_t *con_out; + long unsigned int stderr_handle; + long unsigned int stderr; + efi_runtime_services_t *runtime; + efi_boot_services_t *boottime; + long unsigned int nr_tables; + long unsigned int tables; + }; + efi_system_table_32_t mixed_mode; +} efi_system_table_t; + +struct cper_arm_ctx_info { + u16 version; + u16 type; + u32 size; +}; + +enum imx_misc_func { + IMX_SC_MISC_FUNC_UNKNOWN = 0, + IMX_SC_MISC_FUNC_SET_CONTROL = 1, + IMX_SC_MISC_FUNC_GET_CONTROL = 2, + IMX_SC_MISC_FUNC_SET_MAX_DMA_GROUP = 4, + IMX_SC_MISC_FUNC_SET_DMA_GROUP = 5, + IMX_SC_MISC_FUNC_SECO_IMAGE_LOAD = 8, + IMX_SC_MISC_FUNC_SECO_AUTHENTICATE = 9, + IMX_SC_MISC_FUNC_DEBUG_OUT = 10, + IMX_SC_MISC_FUNC_WAVEFORM_CAPTURE = 6, + IMX_SC_MISC_FUNC_BUILD_INFO = 15, + IMX_SC_MISC_FUNC_UNIQUE_ID = 19, + IMX_SC_MISC_FUNC_SET_ARI = 3, + IMX_SC_MISC_FUNC_BOOT_STATUS = 7, + IMX_SC_MISC_FUNC_BOOT_DONE = 14, + IMX_SC_MISC_FUNC_OTP_FUSE_READ = 11, + IMX_SC_MISC_FUNC_OTP_FUSE_WRITE = 17, + IMX_SC_MISC_FUNC_SET_TEMP = 12, + IMX_SC_MISC_FUNC_GET_TEMP = 13, + IMX_SC_MISC_FUNC_GET_BOOT_DEV = 16, + IMX_SC_MISC_FUNC_GET_BUTTON_STATUS = 18, +}; + +struct imx_sc_ipc___2; + +struct imx_sc_chan { + struct imx_sc_ipc___2 *sc_ipc; + struct mbox_client cl; + struct mbox_chan___2 *ch; + int idx; + struct completion tx_done; +}; + +struct imx_sc_ipc___2 { + struct imx_sc_chan chans[8]; + struct device *dev; + struct mutex lock; + struct completion done; + bool fast_ipc; + u32 *msg; + u8 rx_size; + u8 count; +}; + +enum imx_sc_error_codes { + IMX_SC_ERR_NONE = 0, + IMX_SC_ERR_VERSION = 1, + IMX_SC_ERR_CONFIG = 2, + IMX_SC_ERR_PARM = 3, + IMX_SC_ERR_NOACCESS = 4, + IMX_SC_ERR_LOCKED = 5, + IMX_SC_ERR_UNAVAILABLE = 6, + IMX_SC_ERR_NOTFOUND = 7, + IMX_SC_ERR_NOPOWER = 8, + IMX_SC_ERR_IPC = 9, + IMX_SC_ERR_BUSY = 10, + IMX_SC_ERR_FAIL = 11, + IMX_SC_ERR_LAST = 12, +}; + +struct imx_sc_msg_req_misc_set_ctrl { + struct imx_sc_rpc_msg hdr; + u32 ctrl; + u32 val; + u16 resource; +}; + +struct imx_sc_msg_req_cpu_start { + struct imx_sc_rpc_msg hdr; + u32 address_hi; + u32 address_lo; + u16 resource; + u8 enable; +}; + +struct imx_sc_msg_req_misc_get_ctrl { + struct imx_sc_rpc_msg hdr; + u32 ctrl; + u16 resource; +}; + +struct imx_sc_msg_resp_misc_get_ctrl { + struct imx_sc_rpc_msg hdr; + u32 val; +}; + +struct imx_sc_msg_irq_get_status { + struct imx_sc_rpc_msg hdr; + union { + struct { + u16 resource; + u8 group; + u8 reserved; + } req; + struct { + u32 status; + } resp; + } data; +}; + +struct imx_sc_msg_irq_enable { + struct imx_sc_rpc_msg hdr; + u32 mask; + u16 resource; + u8 group; + u8 enable; +}; + +enum imx_sc_rm_func { + IMX_SC_RM_FUNC_UNKNOWN = 0, + IMX_SC_RM_FUNC_PARTITION_ALLOC = 1, + IMX_SC_RM_FUNC_SET_CONFIDENTIAL = 31, + IMX_SC_RM_FUNC_PARTITION_FREE = 2, + IMX_SC_RM_FUNC_GET_DID = 26, + IMX_SC_RM_FUNC_PARTITION_STATIC = 3, + IMX_SC_RM_FUNC_PARTITION_LOCK = 4, + IMX_SC_RM_FUNC_GET_PARTITION = 5, + IMX_SC_RM_FUNC_SET_PARENT = 6, + IMX_SC_RM_FUNC_MOVE_ALL = 7, + IMX_SC_RM_FUNC_ASSIGN_RESOURCE = 8, + IMX_SC_RM_FUNC_SET_RESOURCE_MOVABLE = 9, + IMX_SC_RM_FUNC_SET_SUBSYS_RSRC_MOVABLE = 28, + IMX_SC_RM_FUNC_SET_MASTER_ATTRIBUTES = 10, + IMX_SC_RM_FUNC_SET_MASTER_SID = 11, + IMX_SC_RM_FUNC_SET_PERIPHERAL_PERMISSIONS = 12, + IMX_SC_RM_FUNC_IS_RESOURCE_OWNED = 13, + IMX_SC_RM_FUNC_GET_RESOURCE_OWNER = 33, + IMX_SC_RM_FUNC_IS_RESOURCE_MASTER = 14, + IMX_SC_RM_FUNC_IS_RESOURCE_PERIPHERAL = 15, + IMX_SC_RM_FUNC_GET_RESOURCE_INFO = 16, + IMX_SC_RM_FUNC_MEMREG_ALLOC = 17, + IMX_SC_RM_FUNC_MEMREG_SPLIT = 29, + IMX_SC_RM_FUNC_MEMREG_FRAG = 32, + IMX_SC_RM_FUNC_MEMREG_FREE = 18, + IMX_SC_RM_FUNC_FIND_MEMREG = 30, + IMX_SC_RM_FUNC_ASSIGN_MEMREG = 19, + IMX_SC_RM_FUNC_SET_MEMREG_PERMISSIONS = 20, + IMX_SC_RM_FUNC_IS_MEMREG_OWNED = 21, + IMX_SC_RM_FUNC_GET_MEMREG_INFO = 22, + IMX_SC_RM_FUNC_ASSIGN_PAD = 23, + IMX_SC_RM_FUNC_SET_PAD_MOVABLE = 24, + IMX_SC_RM_FUNC_IS_PAD_OWNED = 25, + IMX_SC_RM_FUNC_DUMP = 27, +}; + +struct imx_sc_msg_rm_rsrc_owned { + struct imx_sc_rpc_msg hdr; + u16 resource; + short: 16; +}; + +struct imx_sc_msg_misc_get_soc_id { + struct imx_sc_rpc_msg hdr; + union { + struct { + u32 control; + u16 resource; + } __attribute__((packed)) req; + struct { + u32 id; + } resp; + } data; +}; + +struct imx_sc_msg_misc_get_soc_uid { + struct imx_sc_rpc_msg hdr; + u32 uid_low; + u32 uid_high; +}; + +struct imx_sc_msg_req_set_resource_power_mode { + struct imx_sc_rpc_msg hdr; + u16 resource; + u8 mode; +}; + +struct imx_sc_pm_domain { + struct generic_pm_domain pd; + char name[20]; + u32 rsrc; +}; + +struct imx_sc_pd_range { + char *name; + u32 rsrc; + u8 num; + bool postfix; + u8 start_from; +}; + +struct imx_sc_pd_soc { + const struct imx_sc_pd_range *pd_ranges; + u8 num_ranges; +}; + +typedef long unsigned int psci_fn(long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef int (*psci_initcall_t)(const struct device_node *); + +struct mrq_ping_request { + uint32_t challenge; +}; + +struct mrq_ping_response { + uint32_t reply; +}; + +struct mrq_query_tag_request { + uint32_t addr; +}; + +struct mrq_query_fw_tag_response { + uint8_t tag[32]; +}; + +struct mrq_query_abi_request { + uint32_t mrq; +}; + +struct mrq_query_abi_response { + int32_t status; +}; + +struct tegra_ivc_header; + +struct tegra_ivc { + struct device *peer; + struct { + struct tegra_ivc_header *channel; + unsigned int position; + dma_addr_t phys; + } rx; + struct { + struct tegra_ivc_header *channel; + unsigned int position; + dma_addr_t phys; + } tx; + void (*notify)(struct tegra_ivc *, void *); + void *notify_data; + unsigned int num_frames; + size_t frame_size; +}; + +typedef void (*tegra_bpmp_mrq_handler_t)(unsigned int, struct tegra_bpmp_channel *, void *); + +struct tegra_bpmp_mrq { + struct list_head list; + unsigned int mrq; + tegra_bpmp_mrq_handler_t handler; + void *data; +}; + +struct tegra210_bpmp { + void *atomics; + void *arb_sema; + struct irq_data *tx_irq_data; +}; + +struct tegra186_bpmp { + struct tegra_bpmp *parent; + struct { + struct gen_pool *pool; + dma_addr_t phys; + void *virt; + } tx; + struct { + struct gen_pool *pool; + dma_addr_t phys; + void *virt; + } rx; + struct { + struct mbox_client client; + struct mbox_chan___2 *channel; + } mbox; +}; + +enum mrq_debugfs_commands { + CMD_DEBUGFS_READ = 1, + CMD_DEBUGFS_WRITE = 2, + CMD_DEBUGFS_DUMPDIR = 3, + CMD_DEBUGFS_MAX = 4, +}; + +struct cmd_debugfs_fileop_request { + uint32_t fnameaddr; + uint32_t fnamelen; + uint32_t dataaddr; + uint32_t datalen; +}; + +struct cmd_debugfs_dumpdir_request { + uint32_t dataaddr; + uint32_t datalen; +}; + +struct cmd_debugfs_fileop_response { + uint32_t reserved; + uint32_t nbytes; +}; + +struct cmd_debugfs_dumpdir_response { + uint32_t reserved; + uint32_t nbytes; +}; + +struct mrq_debugfs_request { + uint32_t cmd; + union { + struct cmd_debugfs_fileop_request fop; + struct cmd_debugfs_dumpdir_request dumpdir; + }; +}; + +struct mrq_debugfs_response { + int32_t reserved; + union { + struct cmd_debugfs_fileop_response fop; + struct cmd_debugfs_dumpdir_response dumpdir; + }; +}; + +enum mrq_debug_commands { + CMD_DEBUG_OPEN_RO = 0, + CMD_DEBUG_OPEN_WO = 1, + CMD_DEBUG_READ = 2, + CMD_DEBUG_WRITE = 3, + CMD_DEBUG_CLOSE = 4, + CMD_DEBUG_MAX = 5, +}; + +struct cmd_debug_fopen_request { + char name[116]; +}; + +struct cmd_debug_fopen_response { + uint32_t fd; + uint32_t datalen; +}; + +struct cmd_debug_fread_request { + uint32_t fd; +}; + +struct cmd_debug_fread_response { + uint32_t readlen; + char data[116]; +}; + +struct cmd_debug_fwrite_request { + uint32_t fd; + uint32_t datalen; + char data[108]; +}; + +struct cmd_debug_fclose_request { + uint32_t fd; +}; + +struct mrq_debug_request { + uint32_t cmd; + union { + struct cmd_debug_fopen_request fop; + struct cmd_debug_fread_request frd; + struct cmd_debug_fwrite_request fwr; + struct cmd_debug_fclose_request fcl; + }; +}; + +struct mrq_debug_response { + union { + struct cmd_debug_fopen_response fop; + struct cmd_debug_fread_response frd; + }; +}; + +struct seqbuf { + char *buf; + size_t pos; + size_t size; +}; + +struct tegra_ivc_header { + union { + struct { + u32 count; + u32 state; + }; + u8 pad[64]; + } tx; + union { + u32 count; + u8 pad[64]; + } rx; +}; + +enum tegra_ivc_state { + TEGRA_IVC_STATE_ESTABLISHED = 0, + TEGRA_IVC_STATE_SYNC = 1, + TEGRA_IVC_STATE_ACK = 2, +}; + +enum pm_api_id { + PM_GET_API_VERSION = 1, + PM_SYSTEM_SHUTDOWN = 12, + PM_REQUEST_NODE = 13, + PM_RELEASE_NODE = 14, + PM_SET_REQUIREMENT = 15, + PM_RESET_ASSERT = 17, + PM_RESET_GET_STATUS = 18, + PM_MMIO_WRITE = 19, + PM_MMIO_READ = 20, + PM_PM_INIT_FINALIZE = 21, + PM_FPGA_LOAD = 22, + PM_FPGA_GET_STATUS = 23, + PM_GET_CHIPID = 24, + PM_PINCTRL_REQUEST = 28, + PM_PINCTRL_RELEASE = 29, + PM_PINCTRL_GET_FUNCTION = 30, + PM_PINCTRL_SET_FUNCTION = 31, + PM_PINCTRL_CONFIG_PARAM_GET = 32, + PM_PINCTRL_CONFIG_PARAM_SET = 33, + PM_IOCTL = 34, + PM_QUERY_DATA = 35, + PM_CLOCK_ENABLE = 36, + PM_CLOCK_DISABLE = 37, + PM_CLOCK_GETSTATE = 38, + PM_CLOCK_SETDIVIDER = 39, + PM_CLOCK_GETDIVIDER = 40, + PM_CLOCK_SETRATE = 41, + PM_CLOCK_GETRATE = 42, + PM_CLOCK_SETPARENT = 43, + PM_CLOCK_GETPARENT = 44, + PM_SECURE_AES = 47, + PM_FEATURE_CHECK = 63, +}; + +enum pm_ret_status { + XST_PM_SUCCESS = 0, + XST_PM_NO_FEATURE = 19, + XST_PM_INTERNAL = 2000, + XST_PM_CONFLICT = 2001, + XST_PM_NO_ACCESS = 2002, + XST_PM_INVALID_NODE = 2003, + XST_PM_DOUBLE_REQ = 2004, + XST_PM_ABORT_SUSPEND = 2005, + XST_PM_MULT_USER = 2008, +}; + +enum pm_ioctl_id { + IOCTL_SD_DLL_RESET = 6, + IOCTL_SET_SD_TAPDELAY = 7, + IOCTL_SET_PLL_FRAC_MODE = 8, + IOCTL_GET_PLL_FRAC_MODE = 9, + IOCTL_SET_PLL_FRAC_DATA = 10, + IOCTL_GET_PLL_FRAC_DATA = 11, + IOCTL_WRITE_GGS = 12, + IOCTL_READ_GGS = 13, + IOCTL_WRITE_PGGS = 14, + IOCTL_READ_PGGS = 15, + IOCTL_SET_BOOT_HEALTH_STATUS = 17, + IOCTL_OSPI_MUX_SELECT = 21, +}; + +enum zynqmp_pm_shutdown_type { + ZYNQMP_PM_SHUTDOWN_TYPE_SHUTDOWN = 0, + ZYNQMP_PM_SHUTDOWN_TYPE_RESET = 1, + ZYNQMP_PM_SHUTDOWN_TYPE_SETSCOPE_ONLY = 2, +}; + +enum zynqmp_pm_shutdown_subtype { + ZYNQMP_PM_SHUTDOWN_SUBTYPE_SUBSYSTEM = 0, + ZYNQMP_PM_SHUTDOWN_SUBTYPE_PS_ONLY = 1, + ZYNQMP_PM_SHUTDOWN_SUBTYPE_SYSTEM = 2, +}; + +struct pm_api_feature_data { + u32 pm_api_id; + int feature_status; + struct hlist_node hentry; +}; + +struct zynqmp_pm_shutdown_scope { + const enum zynqmp_pm_shutdown_subtype subtype; + const char *name; +}; + +struct of_timer_irq { + int irq; + int index; + int percpu; + const char *name; + long unsigned int flags; + irq_handler_t handler; +}; + +struct of_timer_base { + void *base; + const char *name; + int index; +}; + +struct of_timer_clk { + struct clk *clk; + const char *name; + int index; + long unsigned int rate; + long unsigned int period; +}; + +struct timer_of { + unsigned int flags; + struct device_node *np; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct clock_event_device clkevt; + struct of_timer_base of_base; + struct of_timer_irq of_irq; + struct of_timer_clk of_clk; + void *private_data; + long: 64; + long: 64; +}; + +typedef int (*of_init_fn_1_ret)(struct device_node *); + +struct sh_timer_config { + unsigned int channels_mask; +}; + +enum sh_cmt_model { + SH_CMT_16BIT = 0, + SH_CMT_32BIT = 1, + SH_CMT_48BIT = 2, + SH_CMT0_RCAR_GEN2 = 3, + SH_CMT1_RCAR_GEN2 = 4, +}; + +struct sh_cmt_info { + enum sh_cmt_model model; + unsigned int channels_mask; + long unsigned int width; + u32 overflow_bit; + u32 clear_bits; + u32 (*read_control)(void *, long unsigned int); + void (*write_control)(void *, long unsigned int, u32); + u32 (*read_count)(void *, long unsigned int); + void (*write_count)(void *, long unsigned int, u32); +}; + +struct sh_cmt_device; + +struct sh_cmt_channel { + struct sh_cmt_device *cmt; + unsigned int index; + unsigned int hwidx; + void *iostart; + void *ioctrl; + unsigned int timer_bit; + long unsigned int flags; + u32 match_value; + u32 next_match_value; + u32 max_match_value; + raw_spinlock_t lock; + struct clock_event_device ced; + struct clocksource cs; + u64 total_cycles; + bool cs_enabled; + long: 56; + long: 64; + long: 64; + long: 64; +}; + +struct sh_cmt_device { + struct platform_device *pdev; + const struct sh_cmt_info *info; + void *mapbase; + struct clk *clk; + long unsigned int rate; + raw_spinlock_t lock; + struct sh_cmt_channel *channels; + unsigned int num_channels; + unsigned int hw_channels; + bool has_clockevent; + bool has_clocksource; +}; + +enum sh_tmu_model { + SH_TMU = 0, + SH_TMU_SH3 = 1, +}; + +struct sh_tmu_device; + +struct sh_tmu_channel { + struct sh_tmu_device *tmu; + unsigned int index; + void *base; + int irq; + long unsigned int periodic; + long: 64; + long: 64; + long: 64; + struct clock_event_device ced; + struct clocksource cs; + bool cs_enabled; + unsigned int enable_count; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sh_tmu_device { + struct platform_device *pdev; + void *mapbase; + struct clk *clk; + long unsigned int rate; + enum sh_tmu_model model; + raw_spinlock_t lock; + struct sh_tmu_channel *channels; + unsigned int num_channels; + bool has_clockevent; + bool has_clocksource; +}; + +struct clocksource_mmio { + void *reg; + struct clocksource clksrc; +}; + +struct dw_apb_timer { + void *base; + long unsigned int freq; + int irq; +}; + +struct dw_apb_clock_event_device { + struct clock_event_device ced; + struct dw_apb_timer timer; + void (*eoi)(struct dw_apb_timer *); + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct dw_apb_clocksource { + struct dw_apb_timer timer; + struct clocksource cs; +}; + +struct rk_timer { + void *base; + void *ctrl; + struct clk *clk; + struct clk *pclk; + u32 freq; + int irq; +}; + +struct rk_clkevt { + struct clock_event_device ce; + struct rk_timer timer; + long: 64; + long: 64; + long: 64; +}; + +enum arch_timer_reg { + ARCH_TIMER_REG_CTRL = 0, + ARCH_TIMER_REG_CVAL = 1, +}; + +enum arch_timer_spi_nr { + ARCH_TIMER_PHYS_SPI = 0, + ARCH_TIMER_VIRT_SPI = 1, + ARCH_TIMER_MAX_TIMER_SPI = 2, +}; + +enum arch_timer_erratum_match_type { + ate_match_dt = 0, + ate_match_local_cap_id = 1, + ate_match_acpi_oem_info = 2, +}; + +struct arch_timer_erratum_workaround { + enum arch_timer_erratum_match_type match_type; + const void *id; + const char *desc; + u64 (*read_cntpct_el0)(); + u64 (*read_cntvct_el0)(); + int (*set_next_event_phys)(long unsigned int, struct clock_event_device *); + int (*set_next_event_virt)(long unsigned int, struct clock_event_device *); + bool disable_compat_vdso; +}; + +struct arch_timer { + void *base; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct clock_event_device evt; +}; + +struct ate_acpi_oem_info { + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; +}; + +typedef bool (*ate_match_fn_t)(const struct arch_timer_erratum_workaround *, const void *); + +struct sp804_timer { + int load; + int load_h; + int value; + int value_h; + int ctrl; + int intclr; + int ris; + int mis; + int bgload; + int bgload_h; + int timer_base[2]; + int width; +}; + +struct sp804_clkevt { + void *base; + void *load; + void *load_h; + void *value; + void *value_h; + void *ctrl; + void *intclr; + void *ris; + void *mis; + void *bgload; + void *bgload_h; + long unsigned int reload; + int width; +}; + +struct mchp_pit64b_timer { + void *base; + struct clk *pclk; + struct clk *gclk; + u32 mode; +}; + +struct mchp_pit64b_clkevt { + struct mchp_pit64b_timer timer; + long: 64; + long: 64; + long: 64; + long: 64; + struct clock_event_device clkevt; +}; + +struct mchp_pit64b_clksrc { + struct mchp_pit64b_timer timer; + struct clocksource clksrc; +}; + +struct alias_prop { + struct list_head link; + const char *alias; + struct device_node *np; + int id; + char stem[0]; +}; + +struct of_endpoint { + unsigned int port; + unsigned int id; + const struct device_node *local_node; +}; + +struct supplier_bindings { + struct device_node * (*parse_prop)(struct device_node *, const char *, int); + bool optional; + bool node_not_dev; +}; + +struct of_changeset_entry { + struct list_head node; + long unsigned int action; + struct device_node *np; + struct property *prop; + struct property *old_prop; +}; + +struct of_changeset { + struct list_head entries; +}; + +struct of_bus___2 { + void (*count_cells)(const void *, int, int *, int *); + u64 (*map)(__be32 *, const __be32 *, int, int, int); + int (*translate)(__be32 *, u64, int); +}; + +struct of_bus { + const char *name; + const char *addresses; + int (*match)(struct device_node *); + void (*count_cells)(struct device_node *, int *, int *); + u64 (*map)(__be32 *, const __be32 *, int, int, int); + int (*translate)(__be32 *, u64, int); + bool has_flags; + unsigned int (*get_flags)(const __be32 *); +}; + +struct of_intc_desc { + struct list_head list; + of_irq_init_cb_t irq_init_cb; + struct device_node *dev; + struct device_node *interrupt_parent; +}; + +struct rmem_assigned_device { + struct device *dev; + struct reserved_mem *rmem; + struct list_head list; +}; + +enum of_overlay_notify_action { + OF_OVERLAY_PRE_APPLY = 0, + OF_OVERLAY_POST_APPLY = 1, + OF_OVERLAY_PRE_REMOVE = 2, + OF_OVERLAY_POST_REMOVE = 3, +}; + +struct of_overlay_notify_data { + struct device_node *overlay; + struct device_node *target; +}; + +struct target { + struct device_node *np; + bool in_livetree; +}; + +struct fragment { + struct device_node *overlay; + struct device_node *target; +}; + +struct overlay_changeset { + int id; + struct list_head ovcs_list; + const void *fdt; + struct device_node *overlay_tree; + int count; + struct fragment *fragments; + bool symbols_fragment; + struct of_changeset cset; +}; + +enum ec_status { + EC_RES_SUCCESS = 0, + EC_RES_INVALID_COMMAND = 1, + EC_RES_ERROR = 2, + EC_RES_INVALID_PARAM = 3, + EC_RES_ACCESS_DENIED = 4, + EC_RES_INVALID_RESPONSE = 5, + EC_RES_INVALID_VERSION = 6, + EC_RES_INVALID_CHECKSUM = 7, + EC_RES_IN_PROGRESS = 8, + EC_RES_UNAVAILABLE = 9, + EC_RES_TIMEOUT = 10, + EC_RES_OVERFLOW = 11, + EC_RES_INVALID_HEADER = 12, + EC_RES_REQUEST_TRUNCATED = 13, + EC_RES_RESPONSE_TOO_BIG = 14, + EC_RES_BUS_ERROR = 15, + EC_RES_BUSY = 16, + EC_RES_INVALID_HEADER_VERSION = 17, + EC_RES_INVALID_HEADER_CRC = 18, + EC_RES_INVALID_DATA_CRC = 19, + EC_RES_DUP_UNAVAILABLE = 20, +}; + +enum host_event_code { + EC_HOST_EVENT_LID_CLOSED = 1, + EC_HOST_EVENT_LID_OPEN = 2, + EC_HOST_EVENT_POWER_BUTTON = 3, + EC_HOST_EVENT_AC_CONNECTED = 4, + EC_HOST_EVENT_AC_DISCONNECTED = 5, + EC_HOST_EVENT_BATTERY_LOW = 6, + EC_HOST_EVENT_BATTERY_CRITICAL = 7, + EC_HOST_EVENT_BATTERY = 8, + EC_HOST_EVENT_THERMAL_THRESHOLD = 9, + EC_HOST_EVENT_DEVICE = 10, + EC_HOST_EVENT_THERMAL = 11, + EC_HOST_EVENT_USB_CHARGER = 12, + EC_HOST_EVENT_KEY_PRESSED = 13, + EC_HOST_EVENT_INTERFACE_READY = 14, + EC_HOST_EVENT_KEYBOARD_RECOVERY = 15, + EC_HOST_EVENT_THERMAL_SHUTDOWN = 16, + EC_HOST_EVENT_BATTERY_SHUTDOWN = 17, + EC_HOST_EVENT_THROTTLE_START = 18, + EC_HOST_EVENT_THROTTLE_STOP = 19, + EC_HOST_EVENT_HANG_DETECT = 20, + EC_HOST_EVENT_HANG_REBOOT = 21, + EC_HOST_EVENT_PD_MCU = 22, + EC_HOST_EVENT_BATTERY_STATUS = 23, + EC_HOST_EVENT_PANIC = 24, + EC_HOST_EVENT_KEYBOARD_FASTBOOT = 25, + EC_HOST_EVENT_RTC = 26, + EC_HOST_EVENT_MKBP = 27, + EC_HOST_EVENT_USB_MUX = 28, + EC_HOST_EVENT_MODE_CHANGE = 29, + EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT = 30, + EC_HOST_EVENT_WOV = 31, + EC_HOST_EVENT_INVALID = 32, +}; + +struct ec_host_request { + uint8_t struct_version; + uint8_t checksum; + uint16_t command; + uint8_t command_version; + uint8_t reserved; + uint16_t data_len; +}; + +struct ec_params_hello { + uint32_t in_data; +}; + +struct ec_response_hello { + uint32_t out_data; +}; + +struct ec_params_get_cmd_versions { + uint8_t cmd; +}; + +struct ec_response_get_cmd_versions { + uint32_t version_mask; +}; + +enum ec_comms_status { + EC_COMMS_STATUS_PROCESSING = 1, +}; + +struct ec_response_get_comms_status { + uint32_t flags; +}; + +struct ec_response_get_protocol_info { + uint32_t protocol_versions; + uint16_t max_request_packet_size; + uint16_t max_response_packet_size; + uint32_t flags; +}; + +struct ec_response_get_features { + uint32_t flags[2]; +}; + +enum ec_led_colors { + EC_LED_COLOR_RED = 0, + EC_LED_COLOR_GREEN = 1, + EC_LED_COLOR_BLUE = 2, + EC_LED_COLOR_YELLOW = 3, + EC_LED_COLOR_WHITE = 4, + EC_LED_COLOR_AMBER = 5, + EC_LED_COLOR_COUNT = 6, +}; + +enum motionsense_command { + MOTIONSENSE_CMD_DUMP = 0, + MOTIONSENSE_CMD_INFO = 1, + MOTIONSENSE_CMD_EC_RATE = 2, + MOTIONSENSE_CMD_SENSOR_ODR = 3, + MOTIONSENSE_CMD_SENSOR_RANGE = 4, + MOTIONSENSE_CMD_KB_WAKE_ANGLE = 5, + MOTIONSENSE_CMD_DATA = 6, + MOTIONSENSE_CMD_FIFO_INFO = 7, + MOTIONSENSE_CMD_FIFO_FLUSH = 8, + MOTIONSENSE_CMD_FIFO_READ = 9, + MOTIONSENSE_CMD_PERFORM_CALIB = 10, + MOTIONSENSE_CMD_SENSOR_OFFSET = 11, + MOTIONSENSE_CMD_LIST_ACTIVITIES = 12, + MOTIONSENSE_CMD_SET_ACTIVITY = 13, + MOTIONSENSE_CMD_LID_ANGLE = 14, + MOTIONSENSE_CMD_FIFO_INT_ENABLE = 15, + MOTIONSENSE_CMD_SPOOF = 16, + MOTIONSENSE_CMD_TABLET_MODE_LID_ANGLE = 17, + MOTIONSENSE_CMD_SENSOR_SCALE = 18, + MOTIONSENSE_NUM_CMDS = 19, +}; + +struct ec_response_motion_sensor_data { + uint8_t flags; + uint8_t sensor_num; + union { + int16_t data[3]; + struct { + uint16_t reserved; + uint32_t timestamp; + } __attribute__((packed)); + struct { + uint8_t activity; + uint8_t state; + int16_t add_info[2]; + }; + }; +} __attribute__((packed)); + +struct ec_response_motion_sense_fifo_info { + uint16_t size; + uint16_t count; + uint32_t timestamp; + uint16_t total_lost; + uint16_t lost[0]; +} __attribute__((packed)); + +struct ec_response_motion_sense_fifo_data { + uint32_t number_data; + struct ec_response_motion_sensor_data data[0]; +}; + +struct ec_motion_sense_activity { + uint8_t sensor_num; + uint8_t activity; + uint8_t enable; + uint8_t reserved; + uint16_t parameters[3]; +}; + +struct ec_params_motion_sense { + uint8_t cmd; + union { + struct { + uint8_t max_sensor_count; + } dump; + struct { + int16_t data; + } kb_wake_angle; + struct { + uint8_t sensor_num; + } info; + struct { + uint8_t sensor_num; + } info_3; + struct { + uint8_t sensor_num; + } data; + struct { + uint8_t sensor_num; + } fifo_flush; + struct { + uint8_t sensor_num; + } perform_calib; + struct { + uint8_t sensor_num; + } list_activities; + struct { + uint8_t sensor_num; + uint8_t roundup; + uint16_t reserved; + int32_t data; + } ec_rate; + struct { + uint8_t sensor_num; + uint8_t roundup; + uint16_t reserved; + int32_t data; + } sensor_odr; + struct { + uint8_t sensor_num; + uint8_t roundup; + uint16_t reserved; + int32_t data; + } sensor_range; + struct { + uint8_t sensor_num; + uint16_t flags; + int16_t temp; + int16_t offset[3]; + } __attribute__((packed)) sensor_offset; + struct { + uint8_t sensor_num; + uint16_t flags; + int16_t temp; + uint16_t scale[3]; + } __attribute__((packed)) sensor_scale; + struct { + uint32_t max_data_vector; + } fifo_read; + struct ec_motion_sense_activity set_activity; + struct { + int8_t enable; + } fifo_int_enable; + struct { + uint8_t sensor_id; + uint8_t spoof_enable; + uint8_t reserved; + int16_t components[3]; + } __attribute__((packed)) spoof; + struct { + int16_t lid_angle; + int16_t hys_degree; + } tablet_mode_threshold; + }; +} __attribute__((packed)); + +struct ec_response_motion_sense { + union { + struct { + uint8_t module_flags; + uint8_t sensor_count; + struct ec_response_motion_sensor_data sensor[0]; + } __attribute__((packed)) dump; + struct { + uint8_t type; + uint8_t location; + uint8_t chip; + } info; + struct { + uint8_t type; + uint8_t location; + uint8_t chip; + uint32_t min_frequency; + uint32_t max_frequency; + uint32_t fifo_max_event_count; + } info_3; + struct ec_response_motion_sensor_data data; + struct { + int32_t ret; + } ec_rate; + struct { + int32_t ret; + } sensor_odr; + struct { + int32_t ret; + } sensor_range; + struct { + int32_t ret; + } kb_wake_angle; + struct { + int32_t ret; + } fifo_int_enable; + struct { + int32_t ret; + } spoof; + struct { + int16_t temp; + int16_t offset[3]; + } sensor_offset; + struct { + int16_t temp; + int16_t offset[3]; + } perform_calib; + struct { + int16_t temp; + uint16_t scale[3]; + } sensor_scale; + struct ec_response_motion_sense_fifo_info fifo_info; + struct ec_response_motion_sense_fifo_info fifo_flush; + struct ec_response_motion_sense_fifo_data fifo_read; + struct { + uint16_t reserved; + uint32_t enabled; + uint32_t disabled; + } __attribute__((packed)) list_activities; + struct { + uint16_t value; + } lid_angle; + struct { + uint16_t lid_angle; + uint16_t hys_degree; + } tablet_mode_threshold; + }; +}; + +enum ec_temp_thresholds { + EC_TEMP_THRESH_WARN = 0, + EC_TEMP_THRESH_HIGH = 1, + EC_TEMP_THRESH_HALT = 2, + EC_TEMP_THRESH_COUNT = 3, +}; + +enum ec_mkbp_event { + EC_MKBP_EVENT_KEY_MATRIX = 0, + EC_MKBP_EVENT_HOST_EVENT = 1, + EC_MKBP_EVENT_SENSOR_FIFO = 2, + EC_MKBP_EVENT_BUTTON = 3, + EC_MKBP_EVENT_SWITCH = 4, + EC_MKBP_EVENT_FINGERPRINT = 5, + EC_MKBP_EVENT_SYSRQ = 6, + EC_MKBP_EVENT_HOST_EVENT64 = 7, + EC_MKBP_EVENT_CEC_EVENT = 8, + EC_MKBP_EVENT_CEC_MESSAGE = 9, + EC_MKBP_EVENT_COUNT = 10, +}; + +union ec_response_get_next_data_v1 { + uint8_t key_matrix[16]; + uint32_t host_event; + uint64_t host_event64; + struct { + uint8_t reserved[3]; + struct ec_response_motion_sense_fifo_info info; + } __attribute__((packed)) sensor_fifo; + uint32_t buttons; + uint32_t switches; + uint32_t fp_events; + uint32_t sysrq; + uint32_t cec_events; + uint8_t cec_message[16]; +}; + +struct ec_response_get_next_event_v1 { + uint8_t event_type; + union ec_response_get_next_data_v1 data; +} __attribute__((packed)); + +struct ec_response_host_event_mask { + uint32_t mask; +}; + +enum { + EC_MSG_TX_HEADER_BYTES = 3, + EC_MSG_TX_TRAILER_BYTES = 1, + EC_MSG_TX_PROTO_BYTES = 4, + EC_MSG_RX_PROTO_BYTES = 3, + EC_PROTO2_MSG_BYTES = 256, + EC_MAX_MSG_BYTES = 65536, +}; + +struct cros_ec_command { + uint32_t version; + uint32_t command; + uint32_t outsize; + uint32_t insize; + uint32_t result; + uint8_t data[0]; +}; + +struct cros_ec_device { + const char *phys_name; + struct device *dev; + bool was_wake_device; + struct class *cros_class; + int (*cmd_readmem)(struct cros_ec_device *, unsigned int, unsigned int, void *); + u16 max_request; + u16 max_response; + u16 max_passthru; + u16 proto_version; + void *priv; + int irq; + u8 *din; + u8 *dout; + int din_size; + int dout_size; + bool wake_enabled; + bool suspended; + int (*cmd_xfer)(struct cros_ec_device *, struct cros_ec_command *); + int (*pkt_xfer)(struct cros_ec_device *, struct cros_ec_command *); + struct mutex lock; + u8 mkbp_event_supported; + bool host_sleep_v1; + struct blocking_notifier_head event_notifier; + struct ec_response_get_next_event_v1 event_data; + int event_size; + u32 host_event_wake_mask; + u32 last_resume_result; + ktime_t last_event_time; + struct notifier_block notifier_ready; + struct platform_device *ec; + struct platform_device *pd; +}; + +struct cros_ec_debugfs; + +struct cros_ec_dev { + struct device class_dev; + struct cros_ec_device *ec_dev; + struct device *dev; + struct cros_ec_debugfs *debug_info; + bool has_kb_wake_angle; + u16 cmd_offset; + struct ec_response_get_features features; +}; + +enum { + CROS_EC_SENSOR_LAST_TS = 0, + CROS_EC_SENSOR_NEW_TS = 1, + CROS_EC_SENSOR_ALL_TS = 2, +}; + +struct cros_ec_sensors_ts_filter_state { + s64 x_offset; + s64 y_offset; + s64 x_history[64]; + s64 y_history[64]; + s64 m_history[64]; + int history_len; + s64 temp_buf[64]; + s64 median_m; + s64 median_error; +}; + +struct trace_event_raw_cros_ec_request_start { + struct trace_entry ent; + uint32_t version; + uint32_t offset; + uint32_t command; + uint32_t outsize; + uint32_t insize; + char __data[0]; +}; + +struct trace_event_raw_cros_ec_request_done { + struct trace_entry ent; + uint32_t version; + uint32_t offset; + uint32_t command; + uint32_t outsize; + uint32_t insize; + uint32_t result; + int retval; + char __data[0]; +}; + +struct trace_event_raw_cros_ec_sensorhub_timestamp { + struct trace_entry ent; + u32 ec_sample_timestamp; + u32 ec_fifo_timestamp; + s64 fifo_timestamp; + s64 current_timestamp; + s64 current_time; + s64 delta; + char __data[0]; +}; + +struct trace_event_raw_cros_ec_sensorhub_data { + struct trace_entry ent; + u32 ec_sensor_num; + u32 ec_fifo_timestamp; + s64 fifo_timestamp; + s64 current_timestamp; + s64 current_time; + s64 delta; + char __data[0]; +}; + +struct trace_event_raw_cros_ec_sensorhub_filter { + struct trace_entry ent; + s64 dx; + s64 dy; + s64 median_m; + s64 median_error; + s64 history_len; + s64 x; + s64 y; + char __data[0]; +}; + +struct trace_event_data_offsets_cros_ec_request_start {}; + +struct trace_event_data_offsets_cros_ec_request_done {}; + +struct trace_event_data_offsets_cros_ec_sensorhub_timestamp {}; + +struct trace_event_data_offsets_cros_ec_sensorhub_data {}; + +struct trace_event_data_offsets_cros_ec_sensorhub_filter {}; + +typedef void (*btf_trace_cros_ec_request_start)(void *, struct cros_ec_command *); + +typedef void (*btf_trace_cros_ec_request_done)(void *, struct cros_ec_command *, int); + +typedef void (*btf_trace_cros_ec_sensorhub_timestamp)(void *, u32, u32, s64, s64, s64); + +typedef void (*btf_trace_cros_ec_sensorhub_data)(void *, u32, u32, s64, s64, s64); + +typedef void (*btf_trace_cros_ec_sensorhub_filter)(void *, struct cros_ec_sensors_ts_filter_state *, s64, s64); + +struct rockchip_mbox_msg { + u32 cmd; + int rx_size; +}; + +struct rockchip_mbox_data { + int num_chans; +}; + +struct rockchip_mbox; + +struct rockchip_mbox_chan { + int idx; + int irq; + struct rockchip_mbox_msg *msg; + struct rockchip_mbox *mb; +}; + +struct rockchip_mbox { + struct mbox_controller mbox; + struct clk *pclk; + void *mbox_base; + u32 buf_size; + struct rockchip_mbox_chan *chans; +}; + +struct acpi_table_pcct { + struct acpi_table_header header; + u32 flags; + u64 reserved; +}; + +enum acpi_pcct_type { + ACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0, + ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE = 1, + ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 = 2, + ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE = 3, + ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE = 4, + ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE = 5, + ACPI_PCCT_TYPE_RESERVED = 6, +}; + +struct acpi_pcct_subspace { + struct acpi_subtable_header header; + u8 reserved[6]; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +} __attribute__((packed)); + +struct acpi_pcct_hw_reduced { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +} __attribute__((packed)); + +struct acpi_pcct_hw_reduced_type2 { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; + struct acpi_generic_address platform_ack_register; + u64 ack_preserve_mask; + u64 ack_write_mask; +} __attribute__((packed)); + +struct acpi_pcct_ext_pcc_master { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved1; + u64 base_address; + u32 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u32 min_turnaround_time; + struct acpi_generic_address platform_ack_register; + u64 ack_preserve_mask; + u64 ack_set_mask; + u64 reserved2; + struct acpi_generic_address cmd_complete_register; + u64 cmd_complete_mask; + struct acpi_generic_address cmd_update_register; + u64 cmd_update_preserve_mask; + u64 cmd_update_set_mask; + struct acpi_generic_address error_status_register; + u64 error_status_mask; +} __attribute__((packed)); + +struct pcc_chan_reg { + void *vaddr; + struct acpi_generic_address *gas; + u64 preserve_mask; + u64 set_mask; + u64 status_mask; +}; + +struct pcc_chan_info { + struct pcc_mbox_chan chan; + struct pcc_chan_reg db; + struct pcc_chan_reg plat_irq_ack; + struct pcc_chan_reg cmd_complete; + struct pcc_chan_reg cmd_update; + struct pcc_chan_reg error; + int plat_irq; +}; + +struct bcm2835_mbox { + void *regs; + spinlock_t lock; + struct mbox_controller controller; +}; + +struct ti_msgmgr_valid_queue_desc { + u8 queue_id; + u8 proxy_id; + bool is_tx; +}; + +struct ti_msgmgr_desc { + u8 queue_count; + u8 max_message_size; + u8 max_messages; + u8 data_first_reg; + u8 data_last_reg; + u32 status_cnt_mask; + u32 status_err_mask; + bool tx_polled; + int tx_poll_timeout_ms; + const struct ti_msgmgr_valid_queue_desc *valid_queues; + const char *data_region_name; + const char *status_region_name; + const char *ctrl_region_name; + int num_valid_queues; + bool is_sproxy; +}; + +struct ti_queue_inst { + char name[30]; + u8 queue_id; + u8 proxy_id; + int irq; + bool is_tx; + void *queue_buff_start; + void *queue_buff_end; + void *queue_state; + void *queue_ctrl; + struct mbox_chan *chan; + u32 *rx_buff; +}; + +struct ti_msgmgr_inst { + struct device *dev; + const struct ti_msgmgr_desc *desc; + void *queue_proxy_region; + void *queue_state_debug_region; + void *queue_ctrl_region; + u8 num_valid_queues; + struct ti_queue_inst *qinsts; + struct mbox_controller mbox; + struct mbox_chan *chans; +}; + +struct tegra_hsp; + +struct tegra_hsp_channel { + struct tegra_hsp *hsp; + struct mbox_chan *chan; + void *regs; +}; + +struct tegra_hsp_soc; + +struct tegra_hsp_mailbox; + +struct tegra_hsp { + struct device *dev; + const struct tegra_hsp_soc *soc; + struct mbox_controller mbox_db; + struct mbox_controller mbox_sm; + void *regs; + unsigned int doorbell_irq; + unsigned int *shared_irqs; + unsigned int shared_irq; + unsigned int num_sm; + unsigned int num_as; + unsigned int num_ss; + unsigned int num_db; + unsigned int num_si; + spinlock_t lock; + struct lock_class_key lock_key; + struct list_head doorbells; + struct tegra_hsp_mailbox *mailboxes; + long unsigned int mask; +}; + +struct tegra_hsp_doorbell { + struct tegra_hsp_channel channel; + struct list_head list; + const char *name; + unsigned int master; + unsigned int index; +}; + +struct tegra_hsp_mailbox { + struct tegra_hsp_channel channel; + unsigned int index; + bool producer; +}; + +struct tegra_hsp_db_map { + const char *name; + unsigned int master; + unsigned int index; +}; + +struct tegra_hsp_soc { + const struct tegra_hsp_db_map *map; + bool has_per_mb_ie; +}; + +struct zynqmp_ipi_mchan { + int is_opened; + void *req_buf; + void *resp_buf; + void *rx_buf; + size_t req_buf_size; + size_t resp_buf_size; + unsigned int chan_type; +}; + +struct zynqmp_ipi_pdata; + +struct zynqmp_ipi_mbox { + struct zynqmp_ipi_pdata *pdata; + struct device dev; + u32 remote_id; + struct mbox_controller mbox; + struct zynqmp_ipi_mchan mchans[2]; +}; + +struct zynqmp_ipi_pdata { + struct device *dev; + int irq; + unsigned int method; + u32 local_id; + int num_mboxes; + struct zynqmp_ipi_mbox *ipi_mboxes; +}; + +struct sun6i_msgbox { + struct mbox_controller controller; + struct clk *clk; + spinlock_t lock; + void *regs; +}; + +struct qcom_ipcc_chan_info { + u16 client_id; + u16 signal_id; +}; + +struct qcom_ipcc { + struct device *dev; + void *base; + struct irq_domain *irq_domain; + struct mbox_chan chan[48]; + struct qcom_ipcc_chan_info mchan[48]; + struct mbox_controller mbox; + int irq; +}; + +struct apple_mbox_msg { + u64 msg0; + u32 msg1; +}; + +struct apple_mbox_hw { + unsigned int control_full; + unsigned int control_empty; + unsigned int a2i_control; + unsigned int a2i_send0; + unsigned int a2i_send1; + unsigned int i2a_control; + unsigned int i2a_recv0; + unsigned int i2a_recv1; + bool has_irq_controls; + unsigned int irq_enable; + unsigned int irq_ack; + unsigned int irq_bit_recv_not_empty; + unsigned int irq_bit_send_empty; +}; + +struct apple_mbox { + void *regs; + const struct apple_mbox_hw *hw; + int irq_recv_not_empty; + int irq_send_empty; + struct mbox_chan chan; + struct device *dev; + struct mbox_controller controller; +}; + +struct hwspinlock___2; + +struct hwspinlock_ops { + int (*trylock)(struct hwspinlock___2 *); + void (*unlock)(struct hwspinlock___2 *); + void (*relax)(struct hwspinlock___2 *); +}; + +struct hwspinlock_device; + +struct hwspinlock___2 { + struct hwspinlock_device *bank; + spinlock_t lock; + void *priv; +}; + +struct hwspinlock_device { + struct device *dev; + const struct hwspinlock_ops *ops; + int base_id; + int num_locks; + struct hwspinlock___2 lock[0]; +}; + +struct resource_table { + u32 ver; + u32 num; + u32 reserved[2]; + u32 offset[0]; +}; + +struct fw_rsc_hdr { + u32 type; + u8 data[0]; +}; + +enum fw_resource_type { + RSC_CARVEOUT = 0, + RSC_DEVMEM = 1, + RSC_TRACE = 2, + RSC_VDEV = 3, + RSC_LAST = 4, + RSC_VENDOR_START = 128, + RSC_VENDOR_END = 512, +}; + +struct fw_rsc_carveout { + u32 da; + u32 pa; + u32 len; + u32 flags; + u32 reserved; + u8 name[32]; +}; + +struct fw_rsc_devmem { + u32 da; + u32 pa; + u32 len; + u32 flags; + u32 reserved; + u8 name[32]; +}; + +struct fw_rsc_trace { + u32 da; + u32 len; + u32 reserved; + u8 name[32]; +}; + +struct fw_rsc_vdev_vring { + u32 da; + u32 align; + u32 num; + u32 notifyid; + u32 pa; +}; + +struct fw_rsc_vdev { + u32 id; + u32 notifyid; + u32 dfeatures; + u32 gfeatures; + u32 config_len; + u8 status; + u8 num_of_vrings; + u8 reserved[2]; + struct fw_rsc_vdev_vring vring[0]; +}; + +struct rproc; + +struct rproc_mem_entry { + void *va; + bool is_iomem; + dma_addr_t dma; + size_t len; + u32 da; + void *priv; + char name[32]; + struct list_head node; + u32 rsc_offset; + u32 flags; + u32 of_resm_idx; + int (*alloc)(struct rproc *, struct rproc_mem_entry *); + int (*release)(struct rproc *, struct rproc_mem_entry *); +}; + +enum rproc_dump_mechanism { + RPROC_COREDUMP_DISABLED = 0, + RPROC_COREDUMP_ENABLED = 1, + RPROC_COREDUMP_INLINE = 2, +}; + +struct rproc_ops; + +struct rproc { + struct list_head node; + struct iommu_domain *domain; + const char *name; + const char *firmware; + void *priv; + struct rproc_ops *ops; + struct device dev; + atomic_t power; + unsigned int state; + enum rproc_dump_mechanism dump_conf; + struct mutex lock; + struct dentry *dbg_dir; + struct list_head traces; + int num_traces; + struct list_head carveouts; + struct list_head mappings; + u64 bootaddr; + struct list_head rvdevs; + struct list_head subdevs; + struct idr notifyids; + int index; + struct work_struct crash_handler; + unsigned int crash_cnt; + bool recovery_disabled; + int max_notifyid; + struct resource_table *table_ptr; + struct resource_table *clean_table; + struct resource_table *cached_table; + size_t table_sz; + bool has_iommu; + bool auto_boot; + struct list_head dump_segments; + int nb_vdev; + u8 elf_class; + u16 elf_machine; + struct cdev cdev; + bool cdev_put_on_release; +}; + +enum rsc_handling_status { + RSC_HANDLED = 0, + RSC_IGNORED = 1, +}; + +struct rproc_ops { + int (*prepare)(struct rproc *); + int (*unprepare)(struct rproc *); + int (*start)(struct rproc *); + int (*stop)(struct rproc *); + int (*attach)(struct rproc *); + int (*detach)(struct rproc *); + void (*kick)(struct rproc *, int); + void * (*da_to_va)(struct rproc *, u64, size_t, bool *); + int (*parse_fw)(struct rproc *, const struct firmware *); + int (*handle_rsc)(struct rproc *, u32, void *, int, int); + struct resource_table * (*find_loaded_rsc_table)(struct rproc *, const struct firmware *); + struct resource_table * (*get_loaded_rsc_table)(struct rproc *, size_t *); + int (*load)(struct rproc *, const struct firmware *); + int (*sanity_check)(struct rproc *, const struct firmware *); + u64 (*get_boot_addr)(struct rproc *, const struct firmware *); + long unsigned int (*panic)(struct rproc *); + void (*coredump)(struct rproc *); +}; + +enum rproc_state { + RPROC_OFFLINE = 0, + RPROC_SUSPENDED = 1, + RPROC_RUNNING = 2, + RPROC_CRASHED = 3, + RPROC_DELETED = 4, + RPROC_ATTACHED = 5, + RPROC_DETACHED = 6, + RPROC_LAST = 7, +}; + +enum rproc_crash_type { + RPROC_MMUFAULT = 0, + RPROC_WATCHDOG = 1, + RPROC_FATAL_ERROR = 2, +}; + +struct rproc_subdev { + struct list_head node; + int (*prepare)(struct rproc_subdev *); + int (*start)(struct rproc_subdev *); + void (*stop)(struct rproc_subdev *, bool); + void (*unprepare)(struct rproc_subdev *); +}; + +struct rproc_vdev; + +struct rproc_vring { + void *va; + int len; + u32 da; + u32 align; + int notifyid; + struct rproc_vdev *rvdev; + struct virtqueue *vq; +}; + +struct rproc_vdev { + struct kref refcount; + struct rproc_subdev subdev; + struct device dev; + unsigned int id; + struct list_head node; + struct rproc *rproc; + struct rproc_vring vring[2]; + u32 rsc_offset; + u32 index; +}; + +struct rproc_debug_trace { + struct rproc *rproc; + struct dentry *tfile; + struct list_head node; + struct rproc_mem_entry trace_mem; +}; + +typedef int (*rproc_handle_resource_t)(struct rproc *, void *, int, int); + +struct rproc_dump_segment { + struct list_head node; + dma_addr_t da; + size_t size; + void *priv; + void (*dump)(struct rproc *, struct rproc_dump_segment *, void *, size_t, size_t); + loff_t offset; +}; + +struct rproc_coredump_state { + struct rproc *rproc; + void *header; + struct completion dump_done; +}; + +struct devfreq_freqs { + long unsigned int old; + long unsigned int new; +}; + +struct devfreq_passive_data { + struct devfreq *parent; + int (*get_target_freq)(struct devfreq *, long unsigned int *); + struct devfreq *this; + struct notifier_block nb; +}; + +struct trace_event_raw_devfreq_frequency { + struct trace_entry ent; + u32 __data_loc_dev_name; + long unsigned int freq; + long unsigned int prev_freq; + long unsigned int busy_time; + long unsigned int total_time; + char __data[0]; +}; + +struct trace_event_raw_devfreq_monitor { + struct trace_entry ent; + long unsigned int freq; + long unsigned int busy_time; + long unsigned int total_time; + unsigned int polling_ms; + u32 __data_loc_dev_name; + char __data[0]; +}; + +struct trace_event_data_offsets_devfreq_frequency { + u32 dev_name; +}; + +struct trace_event_data_offsets_devfreq_monitor { + u32 dev_name; +}; + +typedef void (*btf_trace_devfreq_frequency)(void *, struct devfreq *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_devfreq_monitor)(void *, struct devfreq *); + +struct devfreq_notifier_devres { + struct devfreq *devfreq; + struct notifier_block *nb; + unsigned int list; +}; + +struct devfreq_event_desc; + +struct devfreq_event_dev { + struct list_head node; + struct device dev; + struct mutex lock; + u32 enable_count; + const struct devfreq_event_desc *desc; +}; + +struct devfreq_event_ops; + +struct devfreq_event_desc { + const char *name; + u32 event_type; + void *driver_data; + const struct devfreq_event_ops *ops; +}; + +struct devfreq_event_data { + long unsigned int load_count; + long unsigned int total_count; +}; + +struct devfreq_event_ops { + int (*enable)(struct devfreq_event_dev *); + int (*disable)(struct devfreq_event_dev *); + int (*reset)(struct devfreq_event_dev *); + int (*set_event)(struct devfreq_event_dev *); + int (*get_event)(struct devfreq_event_dev *, struct devfreq_event_data *); +}; + +struct devfreq_simple_ondemand_data { + unsigned int upthreshold; + unsigned int downdifferential; +}; + +struct userspace_data { + long unsigned int user_frequency; + bool valid; +}; + +union extcon_property_value { + int intval; +}; + +struct extcon_cable; + +struct extcon_dev___2 { + const char *name; + const unsigned int *supported_cable; + const u32 *mutually_exclusive; + struct device dev; + struct raw_notifier_head nh_all; + struct raw_notifier_head *nh; + struct list_head entry; + int max_supported; + spinlock_t lock; + u32 state; + struct device_type extcon_dev_type; + struct extcon_cable *cables; + struct attribute_group attr_g_muex; + struct attribute **attrs_muex; + struct device_attribute *d_attrs_muex; +}; + +struct extcon_cable { + struct extcon_dev___2 *edev; + int cable_index; + struct attribute_group attr_g; + struct device_attribute attr_name; + struct device_attribute attr_state; + struct attribute *attrs[3]; + union extcon_property_value usb_propval[3]; + union extcon_property_value chg_propval[1]; + union extcon_property_value jack_propval[1]; + union extcon_property_value disp_propval[2]; + long unsigned int usb_bits[1]; + long unsigned int chg_bits[1]; + long unsigned int jack_bits[1]; + long unsigned int disp_bits[1]; +}; + +struct __extcon_info { + unsigned int type; + unsigned int id; + const char *name; +}; + +struct extcon_dev_notifier_devres { + struct extcon_dev___2 *edev; + unsigned int id; + struct notifier_block *nb; +}; + +enum dpfe_msg_fields { + MSG_HEADER = 0, + MSG_COMMAND = 1, + MSG_ARG_COUNT = 2, + MSG_ARG0 = 3, + MSG_FIELD_MAX = 16, +}; + +enum dpfe_commands { + DPFE_CMD_GET_INFO = 0, + DPFE_CMD_GET_REFRESH = 1, + DPFE_CMD_GET_VENDOR = 2, + DPFE_CMD_MAX = 3, +}; + +struct dpfe_firmware_header { + u32 magic; + u32 sequence; + u32 version; + u32 imem_size; + u32 dmem_size; +}; + +struct init_data { + unsigned int dmem_len; + unsigned int imem_len; + unsigned int chksum; + bool is_big_endian; +}; + +struct dpfe_api { + int version; + const char *fw_name; + const struct attribute_group **sysfs_attrs; + u32 command[48]; +}; + +struct brcmstb_dpfe_priv { + void *regs; + void *dmem; + void *imem; + struct device *dev; + const struct dpfe_api *dpfe_api; + struct mutex lock; +}; + +struct fsl_ifc_nand { + __be32 ncfgr; + u32 res1[4]; + __be32 nand_fcr0; + __be32 nand_fcr1; + u32 res2[8]; + __be32 row0; + u32 res3; + __be32 col0; + u32 res4; + __be32 row1; + u32 res5; + __be32 col1; + u32 res6; + __be32 row2; + u32 res7; + __be32 col2; + u32 res8; + __be32 row3; + u32 res9; + __be32 col3; + u32 res10[36]; + __be32 nand_fbcr; + u32 res11; + __be32 nand_fir0; + __be32 nand_fir1; + __be32 nand_fir2; + u32 res12[16]; + __be32 nand_csel; + u32 res13; + __be32 nandseq_strt; + u32 res14; + __be32 nand_evter_stat; + u32 res15; + __be32 pgrdcmpl_evt_stat; + u32 res16[2]; + __be32 nand_evter_en; + u32 res17[2]; + __be32 nand_evter_intr_en; + __be32 nand_vol_addr_stat; + u32 res18; + __be32 nand_erattr0; + __be32 nand_erattr1; + u32 res19[16]; + __be32 nand_fsr; + u32 res20; + __be32 nand_eccstat[8]; + u32 res21[28]; + __be32 nanndcr; + u32 res22[2]; + __be32 nand_autoboot_trgr; + u32 res23; + __be32 nand_mdr; + u32 res24[28]; + __be32 nand_dll_lowcfg0; + __be32 nand_dll_lowcfg1; + u32 res25; + __be32 nand_dll_lowstat; + u32 res26[60]; +}; + +struct fsl_ifc_nor { + __be32 nor_evter_stat; + u32 res1[2]; + __be32 nor_evter_en; + u32 res2[2]; + __be32 nor_evter_intr_en; + u32 res3[2]; + __be32 nor_erattr0; + __be32 nor_erattr1; + __be32 nor_erattr2; + u32 res4[4]; + __be32 norcr; + u32 res5[239]; +}; + +struct fsl_ifc_gpcm { + __be32 gpcm_evter_stat; + u32 res1[2]; + __be32 gpcm_evter_en; + u32 res2[2]; + __be32 gpcm_evter_intr_en; + u32 res3[2]; + __be32 gpcm_erattr0; + __be32 gpcm_erattr1; + __be32 gpcm_erattr2; + __be32 gpcm_stat; +}; + +struct fsl_ifc_global { + __be32 ifc_rev; + u32 res1[2]; + struct { + __be32 cspr_ext; + __be32 cspr; + u32 res2; + } cspr_cs[8]; + u32 res3[13]; + struct { + __be32 amask; + u32 res4[2]; + } amask_cs[8]; + u32 res5[12]; + struct { + __be32 csor; + __be32 csor_ext; + u32 res6; + } csor_cs[8]; + u32 res7[12]; + struct { + __be32 ftim[4]; + u32 res8[8]; + } ftim_cs[8]; + u32 res9[48]; + __be32 rb_stat; + __be32 rb_map; + __be32 wb_map; + __be32 ifc_gcr; + u32 res10[2]; + __be32 cm_evter_stat; + u32 res11[2]; + __be32 cm_evter_en; + u32 res12[2]; + __be32 cm_evter_intr_en; + u32 res13[2]; + __be32 cm_erattr0; + __be32 cm_erattr1; + u32 res14[2]; + __be32 ifc_ccr; + __be32 ifc_csr; + __be32 ddr_ccr_low; +}; + +struct fsl_ifc_runtime { + struct fsl_ifc_nand ifc_nand; + struct fsl_ifc_nor ifc_nor; + struct fsl_ifc_gpcm ifc_gpcm; +}; + +struct fsl_ifc_ctrl { + struct device *dev; + struct fsl_ifc_global *gregs; + struct fsl_ifc_runtime *rregs; + int irq; + int nand_irq; + spinlock_t lock; + void *nand; + int version; + int banks; + u32 nand_stat; + wait_queue_head_t nand_wait; + bool little_endian; +}; + +enum { + C0D0U0 = 0, + C0D0U1 = 1, + C0D1U0 = 2, + C0D1U1 = 3, + C1D0U0 = 4, + C1D0U1 = 5, + C1D1U0 = 6, + C1D1U1 = 7, + DRAM_CLKTREE_NUM = 8, +}; + +struct tegra210_emc_per_channel_regs { + u16 bank; + u16 offset; +}; + +struct tegra210_emc_table_register_offsets { + u16 burst[221]; + u16 trim[138]; + u16 burst_mc[33]; + u16 la_scale[24]; + struct tegra210_emc_per_channel_regs burst_per_channel[8]; + struct tegra210_emc_per_channel_regs trim_per_channel[10]; + struct tegra210_emc_per_channel_regs vref_per_channel[4]; +}; + +struct tegra210_emc_timing { + u32 revision; + const char dvfs_ver[60]; + u32 rate; + u32 min_volt; + u32 gpu_min_volt; + const char clock_src[32]; + u32 clk_src_emc; + u32 needs_training; + u32 training_pattern; + u32 trained; + u32 periodic_training; + u32 trained_dram_clktree[8]; + u32 current_dram_clktree[8]; + u32 run_clocks; + u32 tree_margin; + u32 num_burst; + u32 num_burst_per_ch; + u32 num_trim; + u32 num_trim_per_ch; + u32 num_mc_regs; + u32 num_up_down; + u32 vref_num; + u32 training_mod_num; + u32 dram_timing_num; + u32 ptfv_list[12]; + u32 burst_regs[221]; + u32 burst_reg_per_ch[8]; + u32 shadow_regs_ca_train[221]; + u32 shadow_regs_quse_train[221]; + u32 shadow_regs_rdwr_train[221]; + u32 trim_regs[138]; + u32 trim_perch_regs[10]; + u32 vref_perch_regs[4]; + u32 dram_timings[5]; + u32 training_mod_regs[20]; + u32 save_restore_mod_regs[12]; + u32 burst_mc_regs[33]; + u32 la_scale_regs[24]; + u32 min_mrs_wait; + u32 emc_mrw; + u32 emc_mrw2; + u32 emc_mrw3; + u32 emc_mrw4; + u32 emc_mrw9; + u32 emc_mrs; + u32 emc_emrs; + u32 emc_emrs2; + u32 emc_auto_cal_config; + u32 emc_auto_cal_config2; + u32 emc_auto_cal_config3; + u32 emc_auto_cal_config4; + u32 emc_auto_cal_config5; + u32 emc_auto_cal_config6; + u32 emc_auto_cal_config7; + u32 emc_auto_cal_config8; + u32 emc_cfg_2; + u32 emc_sel_dpd_ctrl; + u32 emc_fdpd_ctrl_cmd_no_ramp; + u32 dll_clk_src; + u32 clk_out_enb_x_0_clk_enb_emc_dll; + u32 latency; +}; + +enum tegra210_emc_refresh { + TEGRA210_EMC_REFRESH_NOMINAL = 0, + TEGRA210_EMC_REFRESH_2X = 1, + TEGRA210_EMC_REFRESH_4X = 2, + TEGRA210_EMC_REFRESH_THROTTLE = 3, +}; + +struct tegra_mc___2; + +struct tegra210_emc_sequence; + +struct tegra210_emc { + struct tegra_mc___2 *mc; + struct device *dev; + struct clk *clk; + struct tegra210_emc_timing *nominal; + struct tegra210_emc_timing *derated; + struct tegra210_emc_timing *timings; + unsigned int num_timings; + const struct tegra210_emc_table_register_offsets *offsets; + const struct tegra210_emc_sequence *sequence; + spinlock_t lock; + void *regs; + void *channel[2]; + unsigned int num_channels; + unsigned int num_devices; + unsigned int dram_type; + struct tegra210_emc_timing *last; + struct tegra210_emc_timing *next; + unsigned int training_interval; + struct timer_list training; + enum tegra210_emc_refresh refresh; + unsigned int refresh_poll_interval; + struct timer_list refresh_timer; + unsigned int temperature; + atomic_t refresh_poll; + ktime_t clkchange_time; + int clkchange_delay; + long unsigned int resume_rate; + struct { + struct dentry *root; + long unsigned int min_rate; + long unsigned int max_rate; + unsigned int temperature; + } debugfs; + struct tegra210_clk_emc_provider provider; +}; + +struct tegra210_emc_sequence { + u8 revision; + void (*set_clock)(struct tegra210_emc *, u32); + u32 (*periodic_compensation)(struct tegra210_emc *); +}; + +struct emc_dvfs_latency { + uint32_t freq; + uint32_t latency; +}; + +struct mrq_emc_dvfs_latency_response { + uint32_t num_pairs; + struct emc_dvfs_latency pairs[14]; +}; + +struct tegra186_emc_dvfs { + long unsigned int latency; + long unsigned int rate; +}; + +struct tegra186_emc { + struct tegra_bpmp *bpmp; + struct device *dev; + struct clk *clk; + struct tegra186_emc_dvfs *dvfs; + unsigned int num_dvfs; + struct { + struct dentry *root; + long unsigned int min_rate; + long unsigned int max_rate; + } debugfs; +}; + +enum vme_resource_type { + VME_MASTER = 0, + VME_SLAVE = 1, + VME_DMA = 2, + VME_LM = 3, +}; + +struct vme_dma_attr { + u32 type; + void *private; +}; + +struct vme_resource { + enum vme_resource_type type; + struct list_head *entry; +}; + +struct vme_bridge; + +struct vme_dev { + int num; + struct vme_bridge *bridge; + struct device dev; + struct list_head drv_list; + struct list_head bridge_list; +}; + +struct vme_callback { + void (*func)(int, int, void *); + void *priv_data; +}; + +struct vme_irq { + int count; + struct vme_callback callback[256]; +}; + +struct vme_slave_resource; + +struct vme_master_resource; + +struct vme_dma_list; + +struct vme_lm_resource; + +struct vme_bridge { + char name[16]; + int num; + struct list_head master_resources; + struct list_head slave_resources; + struct list_head dma_resources; + struct list_head lm_resources; + struct list_head vme_error_handlers; + struct list_head devices; + struct device *parent; + void *driver_priv; + struct list_head bus_list; + struct vme_irq irq[7]; + struct mutex irq_mtx; + int (*slave_get)(struct vme_slave_resource *, int *, long long unsigned int *, long long unsigned int *, dma_addr_t *, u32 *, u32 *); + int (*slave_set)(struct vme_slave_resource *, int, long long unsigned int, long long unsigned int, dma_addr_t, u32, u32); + int (*master_get)(struct vme_master_resource *, int *, long long unsigned int *, long long unsigned int *, u32 *, u32 *, u32 *); + int (*master_set)(struct vme_master_resource *, int, long long unsigned int, long long unsigned int, u32, u32, u32); + ssize_t (*master_read)(struct vme_master_resource *, void *, size_t, loff_t); + ssize_t (*master_write)(struct vme_master_resource *, void *, size_t, loff_t); + unsigned int (*master_rmw)(struct vme_master_resource *, unsigned int, unsigned int, unsigned int, loff_t); + int (*dma_list_add)(struct vme_dma_list *, struct vme_dma_attr *, struct vme_dma_attr *, size_t); + int (*dma_list_exec)(struct vme_dma_list *); + int (*dma_list_empty)(struct vme_dma_list *); + void (*irq_set)(struct vme_bridge *, int, int, int); + int (*irq_generate)(struct vme_bridge *, int, int); + int (*lm_set)(struct vme_lm_resource *, long long unsigned int, u32, u32); + int (*lm_get)(struct vme_lm_resource *, long long unsigned int *, u32 *, u32 *); + int (*lm_attach)(struct vme_lm_resource *, int, void (*)(void *), void *); + int (*lm_detach)(struct vme_lm_resource *, int); + int (*slot_get)(struct vme_bridge *); + void * (*alloc_consistent)(struct device *, size_t, dma_addr_t *); + void (*free_consistent)(struct device *, size_t, void *, dma_addr_t); +}; + +struct vme_driver { + const char *name; + int (*match)(struct vme_dev *); + int (*probe)(struct vme_dev *); + void (*remove)(struct vme_dev *); + struct device_driver driver; + struct list_head devices; +}; + +struct vme_master_resource { + struct list_head list; + struct vme_bridge *parent; + spinlock_t lock; + int locked; + int number; + u32 address_attr; + u32 cycle_attr; + u32 width_attr; + struct resource bus_resource; + void *kern_base; +}; + +struct vme_slave_resource { + struct list_head list; + struct vme_bridge *parent; + struct mutex mtx; + int locked; + int number; + u32 address_attr; + u32 cycle_attr; +}; + +struct vme_dma_pattern { + u32 pattern; + u32 type; +}; + +struct vme_dma_pci { + dma_addr_t address; +}; + +struct vme_dma_vme { + long long unsigned int address; + u32 aspace; + u32 cycle; + u32 dwidth; +}; + +struct vme_dma_resource; + +struct vme_dma_list { + struct list_head list; + struct vme_dma_resource *parent; + struct list_head entries; + struct mutex mtx; +}; + +struct vme_dma_resource { + struct list_head list; + struct vme_bridge *parent; + struct mutex mtx; + int locked; + int number; + struct list_head pending; + struct list_head running; + u32 route_attr; +}; + +struct vme_lm_resource { + struct list_head list; + struct vme_bridge *parent; + struct mutex mtx; + int locked; + int number; + int monitors; +}; + +struct vme_error_handler { + struct list_head list; + long long unsigned int start; + long long unsigned int end; + long long unsigned int first_error; + u32 aspace; + unsigned int num_errors; +}; + +struct powercap_control_type; + +struct powercap_control_type_ops { + int (*set_enable)(struct powercap_control_type *, bool); + int (*get_enable)(struct powercap_control_type *, bool *); + int (*release)(struct powercap_control_type *); +}; + +struct powercap_control_type { + struct device dev; + struct idr idr; + int nr_zones; + const struct powercap_control_type_ops *ops; + struct mutex lock; + bool allocated; + struct list_head node; +}; + +struct powercap_zone; + +struct powercap_zone_ops { + int (*get_max_energy_range_uj)(struct powercap_zone *, u64 *); + int (*get_energy_uj)(struct powercap_zone *, u64 *); + int (*reset_energy_uj)(struct powercap_zone *); + int (*get_max_power_range_uw)(struct powercap_zone *, u64 *); + int (*get_power_uw)(struct powercap_zone *, u64 *); + int (*set_enable)(struct powercap_zone *, bool); + int (*get_enable)(struct powercap_zone *, bool *); + int (*release)(struct powercap_zone *); +}; + +struct powercap_zone_constraint; + +struct powercap_zone { + int id; + char *name; + void *control_type_inst; + const struct powercap_zone_ops *ops; + struct device dev; + int const_id_cnt; + struct idr idr; + struct idr *parent_idr; + void *private_data; + struct attribute **zone_dev_attrs; + int zone_attr_count; + struct attribute_group dev_zone_attr_group; + const struct attribute_group *dev_attr_groups[2]; + bool allocated; + struct powercap_zone_constraint *constraints; +}; + +struct powercap_zone_constraint_ops; + +struct powercap_zone_constraint { + int id; + struct powercap_zone *power_zone; + const struct powercap_zone_constraint_ops *ops; +}; + +struct powercap_zone_constraint_ops { + int (*set_power_limit_uw)(struct powercap_zone *, int, u64); + int (*get_power_limit_uw)(struct powercap_zone *, int, u64 *); + int (*set_time_window_us)(struct powercap_zone *, int, u64); + int (*get_time_window_us)(struct powercap_zone *, int, u64 *); + int (*get_max_power_uw)(struct powercap_zone *, int, u64 *); + int (*get_min_power_uw)(struct powercap_zone *, int, u64 *); + int (*get_max_time_window_us)(struct powercap_zone *, int, u64 *); + int (*get_min_time_window_us)(struct powercap_zone *, int, u64 *); + const char * (*get_name)(struct powercap_zone *, int); +}; + +struct dtpm_ops; + +struct dtpm { + struct powercap_zone zone; + struct dtpm *parent; + struct list_head sibling; + struct list_head children; + struct dtpm_ops *ops; + long unsigned int flags; + u64 power_limit; + u64 power_max; + u64 power_min; + int weight; +}; + +struct dtpm_ops { + u64 (*set_power_uw)(struct dtpm *, u64); + u64 (*get_power_uw)(struct dtpm *); + int (*update_power_uw)(struct dtpm *); + void (*release)(struct dtpm *); +}; + +typedef int (*dtpm_init_t)(); + +struct dtpm_descr { + dtpm_init_t init; +}; + +struct dtpm_cpu { + struct dtpm dtpm; + struct freq_qos_request qos_req; + int cpu; +}; + +struct powercap_constraint_attr { + struct device_attribute power_limit_attr; + struct device_attribute time_window_attr; + struct device_attribute max_power_attr; + struct device_attribute min_power_attr; + struct device_attribute max_time_window_attr; + struct device_attribute min_time_window_attr; + struct device_attribute name_attr; +}; + +struct idle_inject_thread { + struct task_struct *tsk; + int should_run; +}; + +struct idle_inject_device___2 { + struct hrtimer timer; + unsigned int idle_duration_us; + unsigned int run_duration_us; + unsigned int latency_us; + long unsigned int cpumask[0]; +}; + +enum { + CCI_IF_SLAVE = 0, + CCI_IF_MASTER = 1, + CCI_IF_GLOBAL = 2, + CCI_IF_MAX = 3, +}; + +struct event_range { + u32 min; + u32 max; +}; + +struct cci_pmu_hw_events { + struct perf_event **events; + long unsigned int *used_mask; + raw_spinlock_t pmu_lock; +}; + +struct cci_pmu; + +struct cci_pmu_model { + char *name; + u32 fixed_hw_cntrs; + u32 num_hw_cntrs; + u32 cntr_size; + struct attribute **format_attrs; + struct attribute **event_attrs; + struct event_range event_ranges[3]; + int (*validate_hw_event)(struct cci_pmu *, long unsigned int); + int (*get_event_idx)(struct cci_pmu *, struct cci_pmu_hw_events *, long unsigned int); + void (*write_counters)(struct cci_pmu *, long unsigned int *); +}; + +struct cci_pmu { + void *base; + void *ctrl_base; + struct pmu pmu; + int cpu; + int nr_irqs; + int *irqs; + long unsigned int active_irqs; + const struct cci_pmu_model *model; + struct cci_pmu_hw_events hw_events; + struct platform_device *plat_device; + int num_cntrs; + atomic_t active_events; + struct mutex reserve_mutex; +}; + +enum cci_models { + CCI400_R0 = 0, + CCI400_R1 = 1, + CCI500_R0 = 2, + CCI550_R0 = 3, + CCI_MODEL_MAX = 4, +}; + +enum cci400_perf_events { + CCI400_PMU_CYCLES = 255, +}; + +struct arm_ccn_component { + void *base; + u32 type; + long unsigned int pmu_events_mask[1]; + union { + struct { + long unsigned int dt_cmp_mask[1]; + } xp; + }; +}; + +struct arm_ccn_dt { + int id; + void *base; + spinlock_t config_lock; + long unsigned int pmu_counters_mask[1]; + struct { + struct arm_ccn_component *source; + struct perf_event *event; + } pmu_counters[9]; + struct { + u64 l; + u64 h; + } cmp_mask[12]; + struct hrtimer hrtimer; + unsigned int cpu; + struct hlist_node node; + struct pmu pmu; +}; + +struct arm_ccn { + struct device *dev; + void *base; + unsigned int irq; + unsigned int sbas_present: 1; + unsigned int sbsx_present: 1; + int num_nodes; + struct arm_ccn_component *node; + int num_xps; + struct arm_ccn_component *xp; + struct arm_ccn_dt dt; + int mn_id; +}; + +struct arm_ccn_pmu_event { + struct device_attribute attr; + u32 type; + u32 event; + int num_ports; + int num_vcs; + const char *def; + int mask; +}; + +struct pmu_irq_ops { + void (*enable_pmuirq)(unsigned int); + void (*disable_pmuirq)(unsigned int); + void (*free_pmuirq)(unsigned int, int, void *); +}; + +struct hisi_pmu; + +struct hisi_uncore_ops { + void (*write_evtype)(struct hisi_pmu *, int, u32); + int (*get_event_idx)(struct perf_event *); + u64 (*read_counter)(struct hisi_pmu *, struct hw_perf_event *); + void (*write_counter)(struct hisi_pmu *, struct hw_perf_event *, u64); + void (*enable_counter)(struct hisi_pmu *, struct hw_perf_event *); + void (*disable_counter)(struct hisi_pmu *, struct hw_perf_event *); + void (*enable_counter_int)(struct hisi_pmu *, struct hw_perf_event *); + void (*disable_counter_int)(struct hisi_pmu *, struct hw_perf_event *); + void (*start_counters)(struct hisi_pmu *); + void (*stop_counters)(struct hisi_pmu *); + u32 (*get_int_status)(struct hisi_pmu *); + void (*clear_int_status)(struct hisi_pmu *, int); + void (*enable_filter)(struct perf_event *); + void (*disable_filter)(struct perf_event *); +}; + +struct hisi_pmu_hwevents { + struct perf_event *hw_events[16]; + long unsigned int used_mask[1]; + const struct attribute_group **attr_groups; +}; + +struct hisi_pmu { + struct pmu pmu; + const struct hisi_uncore_ops *ops; + struct hisi_pmu_hwevents pmu_events; + cpumask_t associated_cpus; + int on_cpu; + int irq; + struct device *dev; + struct hlist_node node; + int sccl_id; + int ccl_id; + void *base; + u32 index_id; + u32 sub_id; + int num_counters; + int counter_bits; + int check_event; + u32 identifier; +}; + +struct cluster_pmu; + +struct l2cache_pmu { + struct hlist_node node; + u32 num_pmus; + struct pmu pmu; + int num_counters; + cpumask_t cpumask; + struct platform_device *pdev; + struct cluster_pmu **pmu_cluster; + struct list_head clusters; +}; + +struct cluster_pmu { + struct list_head next; + struct perf_event *events[9]; + struct l2cache_pmu *l2cache_pmu; + long unsigned int used_counters[1]; + long unsigned int used_groups[1]; + int irq; + int cluster_id; + int on_cpu; + cpumask_t cluster_cpus; + spinlock_t pmu_lock; +}; + +struct l3cache_pmu { + struct pmu pmu; + struct hlist_node node; + void *regs; + struct perf_event *events[8]; + long unsigned int used_mask[1]; + cpumask_t cpumask; +}; + +struct l3cache_event_ops { + void (*start)(struct perf_event *); + void (*stop)(struct perf_event *, int); + void (*update)(struct perf_event *); +}; + +struct hw_pmu_info { + u32 type; + u32 enable_mask; + void *csr; +}; + +struct xgene_pmu; + +struct xgene_pmu_dev { + struct hw_pmu_info *inf; + struct xgene_pmu *parent; + struct pmu pmu; + u8 max_counters; + long unsigned int cntr_assign_mask[1]; + u64 max_period; + const struct attribute_group **attr_groups; + struct perf_event *pmu_counter_event[4]; +}; + +struct xgene_pmu_ops; + +struct xgene_pmu { + struct device *dev; + struct hlist_node node; + int version; + void *pcppmu_csr; + u32 mcb_active_mask; + u32 mc_active_mask; + u32 l3c_active_mask; + cpumask_t cpu; + int irq; + raw_spinlock_t lock; + const struct xgene_pmu_ops *ops; + struct list_head l3cpmus; + struct list_head iobpmus; + struct list_head mcbpmus; + struct list_head mcpmus; +}; + +struct xgene_pmu_ops { + void (*mask_int)(struct xgene_pmu *); + void (*unmask_int)(struct xgene_pmu *); + u64 (*read_counter)(struct xgene_pmu_dev *, int); + void (*write_counter)(struct xgene_pmu_dev *, int, u64); + void (*write_evttype)(struct xgene_pmu_dev *, int, u32); + void (*write_agentmsk)(struct xgene_pmu_dev *, u32); + void (*write_agent1msk)(struct xgene_pmu_dev *, u32); + void (*enable_counter)(struct xgene_pmu_dev *, int); + void (*disable_counter)(struct xgene_pmu_dev *, int); + void (*enable_counter_int)(struct xgene_pmu_dev *, int); + void (*disable_counter_int)(struct xgene_pmu_dev *, int); + void (*reset_counters)(struct xgene_pmu_dev *); + void (*start_counters)(struct xgene_pmu_dev *); + void (*stop_counters)(struct xgene_pmu_dev *); +}; + +struct xgene_pmu_dev_ctx { + char *name; + struct list_head next; + struct xgene_pmu_dev *pmu_dev; + struct hw_pmu_info inf; +}; + +struct xgene_pmu_data { + int id; + u32 data; +}; + +enum xgene_pmu_version { + PCP_PMU_V1 = 1, + PCP_PMU_V2 = 2, + PCP_PMU_V3 = 3, +}; + +enum xgene_pmu_dev_type { + PMU_TYPE_L3C = 0, + PMU_TYPE_IOB = 1, + PMU_TYPE_IOB_SLOW = 2, + PMU_TYPE_MCB = 3, + PMU_TYPE_MC = 4, +}; + +struct trace_event_raw_mc_event { + struct trace_entry ent; + unsigned int error_type; + u32 __data_loc_msg; + u32 __data_loc_label; + u16 error_count; + u8 mc_index; + s8 top_layer; + s8 middle_layer; + s8 lower_layer; + long int address; + u8 grain_bits; + long int syndrome; + u32 __data_loc_driver_detail; + char __data[0]; +}; + +struct trace_event_raw_arm_event { + struct trace_entry ent; + u64 mpidr; + u64 midr; + u32 running_state; + u32 psci_state; + u8 affinity; + char __data[0]; +}; + +struct trace_event_raw_non_standard_event { + struct trace_entry ent; + char sec_type[16]; + char fru_id[16]; + u32 __data_loc_fru_text; + u8 sev; + u32 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_aer_event { + struct trace_entry ent; + u32 __data_loc_dev_name; + u32 status; + u8 severity; + u8 tlp_header_valid; + u32 tlp_header[4]; + char __data[0]; +}; + +struct trace_event_raw_memory_failure_event { + struct trace_entry ent; + long unsigned int pfn; + int type; + int result; + char __data[0]; +}; + +struct trace_event_data_offsets_mc_event { + u32 msg; + u32 label; + u32 driver_detail; +}; + +struct trace_event_data_offsets_arm_event {}; + +struct trace_event_data_offsets_non_standard_event { + u32 fru_text; + u32 buf; +}; + +struct trace_event_data_offsets_aer_event { + u32 dev_name; +}; + +struct trace_event_data_offsets_memory_failure_event {}; + +typedef void (*btf_trace_mc_event)(void *, const unsigned int, const char *, const char *, const int, const u8, const s8, const s8, const s8, long unsigned int, const u8, long unsigned int, const char *); + +typedef void (*btf_trace_arm_event)(void *, const struct cper_sec_proc_arm *); + +typedef void (*btf_trace_non_standard_event)(void *, const guid_t *, const guid_t *, const char *, const u8, const u8 *, const u32); + +typedef void (*btf_trace_aer_event)(void *, const char *, const u32, const u8, const u8, struct aer_header_log_regs *); + +typedef void (*btf_trace_memory_failure_event)(void *, long unsigned int, int, int); + +enum { + NVMEM_ADD = 1, + NVMEM_REMOVE = 2, + NVMEM_CELL_ADD = 3, + NVMEM_CELL_REMOVE = 4, +}; + +struct nvmem_cell_table { + const char *nvmem_name; + const struct nvmem_cell_info *cells; + size_t ncells; + struct list_head node; +}; + +struct nvmem_device___2 { + struct module *owner; + struct device dev; + int stride; + int word_size; + int id; + struct kref refcnt; + size_t size; + bool read_only; + bool root_only; + int flags; + enum nvmem_type type; + struct bin_attribute eeprom; + struct device *base_dev; + struct list_head cells; + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + nvmem_cell_post_process_t cell_post_process; + struct gpio_desc *wp_gpio; + void *priv; +}; + +struct nvmem_cell_entry { + const char *name; + int offset; + int bytes; + int bit_offset; + int nbits; + struct device_node *np; + struct nvmem_device___2 *nvmem; + struct list_head node; +}; + +struct nvmem_cell { + struct nvmem_cell_entry *entry; + const char *id; +}; + +struct zynqmp_nvmem_data { + struct device *dev; + struct nvmem_device *nvmem; +}; + +struct icc_req { + struct hlist_node req_node; + struct icc_node *node; + struct device *dev; + bool enabled; + u32 tag; + u32 avg_bw; + u32 peak_bw; +}; + +struct icc_path___2 { + const char *name; + size_t num_nodes; + struct icc_req reqs[0]; +}; + +struct icc_onecell_data { + unsigned int num_nodes; + struct icc_node *nodes[0]; +}; + +struct trace_event_raw_icc_set_bw { + struct trace_entry ent; + u32 __data_loc_path_name; + u32 __data_loc_dev; + u32 __data_loc_node_name; + u32 avg_bw; + u32 peak_bw; + u32 node_avg_bw; + u32 node_peak_bw; + char __data[0]; +}; + +struct trace_event_raw_icc_set_bw_end { + struct trace_entry ent; + u32 __data_loc_path_name; + u32 __data_loc_dev; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_icc_set_bw { + u32 path_name; + u32 dev; + u32 node_name; +}; + +struct trace_event_data_offsets_icc_set_bw_end { + u32 path_name; + u32 dev; +}; + +typedef void (*btf_trace_icc_set_bw)(void *, struct icc_path___2 *, struct icc_node *, int, u32, u32); + +typedef void (*btf_trace_icc_set_bw_end)(void *, struct icc_path___2 *, int); + +struct icc_bulk_data { + struct icc_path *path; + const char *name; + u32 avg_bw; + u32 peak_bw; +}; + +struct net_device_devres { + struct net_device *ndev; +}; + +struct __kernel_old_timespec { + __kernel_old_time_t tv_sec; + long int tv_nsec; +}; + +struct __kernel_sock_timeval { + __s64 tv_sec; + __s64 tv_usec; +}; + +struct mmsghdr { + struct user_msghdr msg_hdr; + unsigned int msg_len; +}; + +struct scm_timestamping_internal { + struct timespec64 ts[3]; +}; + +struct ifconf { + int ifc_len; + union { + char *ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; +}; + +struct compat_ifmap { + compat_ulong_t mem_start; + compat_ulong_t mem_end; + short unsigned int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct compat_if_settings { + unsigned int type; + unsigned int size; + compat_uptr_t ifs_ifsu; +}; + +struct compat_ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + compat_int_t ifru_ivalue; + compat_int_t ifru_mtu; + struct compat_ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + compat_caddr_t ifru_data; + struct compat_if_settings ifru_settings; + } ifr_ifru; +}; + +enum sock_shutdown_cmd { + SHUT_RD = 0, + SHUT_WR = 1, + SHUT_RDWR = 2, +}; + +struct net_proto_family { + int family; + int (*create)(struct net *, struct socket *, int, int); + struct module *owner; +}; + +enum { + SOCK_WAKE_IO = 0, + SOCK_WAKE_WAITD = 1, + SOCK_WAKE_SPACE = 2, + SOCK_WAKE_URG = 3, +}; + +struct libipw_device; + +struct iw_spy_data; + +struct iw_public_data { + struct iw_spy_data *spy_data; + struct libipw_device *libipw; +}; + +struct iw_param { + __s32 value; + __u8 fixed; + __u8 disabled; + __u16 flags; +}; + +struct iw_point { + void *pointer; + __u16 length; + __u16 flags; +}; + +struct iw_freq { + __s32 m; + __s16 e; + __u8 i; + __u8 flags; +}; + +struct iw_quality { + __u8 qual; + __u8 level; + __u8 noise; + __u8 updated; +}; + +struct iw_discarded { + __u32 nwid; + __u32 code; + __u32 fragment; + __u32 retries; + __u32 misc; +}; + +struct iw_missed { + __u32 beacon; +}; + +struct iw_statistics { + __u16 status; + struct iw_quality qual; + struct iw_discarded discard; + struct iw_missed miss; +}; + +union iwreq_data { + char name[16]; + struct iw_point essid; + struct iw_param nwid; + struct iw_freq freq; + struct iw_param sens; + struct iw_param bitrate; + struct iw_param txpower; + struct iw_param rts; + struct iw_param frag; + __u32 mode; + struct iw_param retry; + struct iw_point encoding; + struct iw_param power; + struct iw_quality qual; + struct sockaddr ap_addr; + struct sockaddr addr; + struct iw_param param; + struct iw_point data; +}; + +struct iw_priv_args { + __u32 cmd; + __u16 set_args; + __u16 get_args; + char name[16]; +}; + +struct compat_mmsghdr { + struct compat_msghdr msg_hdr; + compat_uint_t msg_len; +}; + +struct iw_request_info { + __u16 cmd; + __u16 flags; +}; + +struct iw_spy_data { + int spy_number; + u_char spy_address[48]; + struct iw_quality spy_stat[8]; + struct iw_quality spy_thr_low; + struct iw_quality spy_thr_high; + u_char spy_thr_under[8]; +}; + +struct scm_ts_pktinfo { + __u32 if_index; + __u32 pkt_length; + __u32 reserved[2]; +}; + +struct sock_skb_cb { + u32 dropcount; +}; + +struct sock_ee_data_rfc4884 { + __u16 len; + __u8 flags; + __u8 reserved; +}; + +struct sock_extended_err { + __u32 ee_errno; + __u8 ee_origin; + __u8 ee_type; + __u8 ee_code; + __u8 ee_pad; + __u32 ee_info; + union { + __u32 ee_data; + struct sock_ee_data_rfc4884 ee_rfc4884; + }; +}; + +struct sock_exterr_skb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + struct sock_extended_err ee; + u16 addr_offset; + __be16 port; + u8 opt_stats: 1; + u8 unused: 7; +}; + +struct net_bridge; + +struct used_address { + struct __kernel_sockaddr_storage name; + unsigned int name_len; +}; + +struct linger { + int l_onoff; + int l_linger; +}; + +struct cmsghdr { + __kernel_size_t cmsg_len; + int cmsg_level; + int cmsg_type; +}; + +struct ucred { + __u32 pid; + __u32 uid; + __u32 gid; +}; + +struct prot_inuse { + int val[64]; +}; + +struct sd_flow_limit { + u64 count; + unsigned int num_buckets; + unsigned int history_head; + u16 history[128]; + u8 buckets[0]; +}; + +struct softnet_data { + struct list_head poll_list; + struct sk_buff_head process_queue; + unsigned int processed; + unsigned int time_squeeze; + unsigned int received_rps; + struct softnet_data *rps_ipi_list; + struct sd_flow_limit *flow_limit; + struct Qdisc *output_queue; + struct Qdisc **output_queue_tailp; + struct sk_buff *completion_queue; + struct sk_buff_head xfrm_backlog; + struct { + u16 recursion; + u8 more; + } xmit; + int: 32; + unsigned int input_queue_head; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + call_single_data_t csd; + struct softnet_data *rps_ipi_next; + unsigned int cpu; + unsigned int input_queue_tail; + unsigned int dropped; + struct sk_buff_head input_pkt_queue; + struct napi_struct backlog; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct so_timestamping { + int flags; + int bind_phc; +}; + +enum txtime_flags { + SOF_TXTIME_DEADLINE_MODE = 1, + SOF_TXTIME_REPORT_ERRORS = 2, + SOF_TXTIME_FLAGS_LAST = 2, + SOF_TXTIME_FLAGS_MASK = 3, +}; + +struct sock_txtime { + __kernel_clockid_t clockid; + __u32 flags; +}; + +enum sk_pacing { + SK_PACING_NONE = 0, + SK_PACING_NEEDED = 1, + SK_PACING_FQ = 2, +}; + +struct sockcm_cookie { + u64 transmit_time; + u32 mark; + u16 tsflags; +}; + +struct fastopen_queue { + struct request_sock *rskq_rst_head; + struct request_sock *rskq_rst_tail; + spinlock_t lock; + int qlen; + int max_qlen; + struct tcp_fastopen_context *ctx; +}; + +struct request_sock_queue { + spinlock_t rskq_lock; + u8 rskq_defer_accept; + u32 synflood_warned; + atomic_t qlen; + atomic_t young; + struct request_sock *rskq_accept_head; + struct request_sock *rskq_accept_tail; + struct fastopen_queue fastopenq; +}; + +struct inet_connection_sock_af_ops { + int (*queue_xmit)(struct sock *, struct sk_buff *, struct flowi *); + void (*send_check)(struct sock *, struct sk_buff *); + int (*rebuild_header)(struct sock *); + void (*sk_rx_dst_set)(struct sock *, const struct sk_buff *); + int (*conn_request)(struct sock *, struct sk_buff *); + struct sock * (*syn_recv_sock)(const struct sock *, struct sk_buff *, struct request_sock *, struct dst_entry *, struct request_sock *, bool *); + u16 net_header_len; + u16 net_frag_header_len; + u16 sockaddr_len; + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*addr2sockaddr)(struct sock *, struct sockaddr *); + void (*mtu_reduced)(struct sock *); +}; + +struct inet_bind_bucket; + +struct tcp_ulp_ops; + +struct inet_connection_sock { + struct inet_sock icsk_inet; + struct request_sock_queue icsk_accept_queue; + struct inet_bind_bucket *icsk_bind_hash; + long unsigned int icsk_timeout; + struct timer_list icsk_retransmit_timer; + struct timer_list icsk_delack_timer; + __u32 icsk_rto; + __u32 icsk_rto_min; + __u32 icsk_delack_max; + __u32 icsk_pmtu_cookie; + const struct tcp_congestion_ops *icsk_ca_ops; + const struct inet_connection_sock_af_ops *icsk_af_ops; + const struct tcp_ulp_ops *icsk_ulp_ops; + void *icsk_ulp_data; + void (*icsk_clean_acked)(struct sock *, u32); + struct hlist_node icsk_listen_portaddr_node; + unsigned int (*icsk_sync_mss)(struct sock *, u32); + __u8 icsk_ca_state: 5; + __u8 icsk_ca_initialized: 1; + __u8 icsk_ca_setsockopt: 1; + __u8 icsk_ca_dst_locked: 1; + __u8 icsk_retransmits; + __u8 icsk_pending; + __u8 icsk_backoff; + __u8 icsk_syn_retries; + __u8 icsk_probes_out; + __u16 icsk_ext_hdr_len; + struct { + __u8 pending; + __u8 quick; + __u8 pingpong; + __u8 retry; + __u32 ato; + long unsigned int timeout; + __u32 lrcvtime; + __u16 last_seg_size; + __u16 rcv_mss; + } icsk_ack; + struct { + int search_high; + int search_low; + u32 probe_size: 31; + u32 enabled: 1; + u32 probe_timestamp; + } icsk_mtup; + u32 icsk_probes_tstamp; + u32 icsk_user_timeout; + u64 icsk_ca_priv[13]; +}; + +struct inet_bind_bucket { + possible_net_t ib_net; + int l3mdev; + short unsigned int port; + signed char fastreuse; + signed char fastreuseport; + kuid_t fastuid; + struct in6_addr fast_v6_rcv_saddr; + __be32 fast_rcv_saddr; + short unsigned int fast_sk_family; + bool fast_ipv6_only; + struct hlist_node node; + struct hlist_head owners; +}; + +struct tcp_ulp_ops { + struct list_head list; + int (*init)(struct sock *); + void (*update)(struct sock *, struct proto *, void (*)(struct sock *)); + void (*release)(struct sock *); + int (*get_info)(const struct sock *, struct sk_buff *); + size_t (*get_info_size)(const struct sock *); + void (*clone)(const struct request_sock *, struct sock *, const gfp_t); + char name[16]; + struct module *owner; +}; + +struct tcp_fastopen_cookie { + __le64 val[2]; + s8 len; + bool exp; +}; + +struct tcp_sack_block { + u32 start_seq; + u32 end_seq; +}; + +struct tcp_options_received { + int ts_recent_stamp; + u32 ts_recent; + u32 rcv_tsval; + u32 rcv_tsecr; + u16 saw_tstamp: 1; + u16 tstamp_ok: 1; + u16 dsack: 1; + u16 wscale_ok: 1; + u16 sack_ok: 3; + u16 smc_ok: 1; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u8 saw_unknown: 1; + u8 unused: 7; + u8 num_sacks; + u16 user_mss; + u16 mss_clamp; +}; + +struct tcp_rack { + u64 mstamp; + u32 rtt_us; + u32 end_seq; + u32 last_delivered; + u8 reo_wnd_steps; + u8 reo_wnd_persist: 5; + u8 dsack_seen: 1; + u8 advanced: 1; +}; + +struct tcp_sock_af_ops; + +struct tcp_md5sig_info; + +struct tcp_fastopen_request; + +struct tcp_sock { + struct inet_connection_sock inet_conn; + u16 tcp_header_len; + u16 gso_segs; + __be32 pred_flags; + u64 bytes_received; + u32 segs_in; + u32 data_segs_in; + u32 rcv_nxt; + u32 copied_seq; + u32 rcv_wup; + u32 snd_nxt; + u32 segs_out; + u32 data_segs_out; + u64 bytes_sent; + u64 bytes_acked; + u32 dsack_dups; + u32 snd_una; + u32 snd_sml; + u32 rcv_tstamp; + u32 lsndtime; + u32 last_oow_ack_time; + u32 compressed_ack_rcv_nxt; + u32 tsoffset; + struct list_head tsq_node; + struct list_head tsorted_sent_queue; + u32 snd_wl1; + u32 snd_wnd; + u32 max_window; + u32 mss_cache; + u32 window_clamp; + u32 rcv_ssthresh; + struct tcp_rack rack; + u16 advmss; + u8 compressed_ack; + u8 dup_ack_counter: 2; + u8 tlp_retrans: 1; + u8 unused: 5; + u32 chrono_start; + u32 chrono_stat[3]; + u8 chrono_type: 2; + u8 rate_app_limited: 1; + u8 fastopen_connect: 1; + u8 fastopen_no_cookie: 1; + u8 is_sack_reneg: 1; + u8 fastopen_client_fail: 2; + u8 nonagle: 4; + u8 thin_lto: 1; + u8 recvmsg_inq: 1; + u8 repair: 1; + u8 frto: 1; + u8 repair_queue; + u8 save_syn: 2; + u8 syn_data: 1; + u8 syn_fastopen: 1; + u8 syn_fastopen_exp: 1; + u8 syn_fastopen_ch: 1; + u8 syn_data_acked: 1; + u8 is_cwnd_limited: 1; + u32 tlp_high_seq; + u32 tcp_tx_delay; + u64 tcp_wstamp_ns; + u64 tcp_clock_cache; + u64 tcp_mstamp; + u32 srtt_us; + u32 mdev_us; + u32 mdev_max_us; + u32 rttvar_us; + u32 rtt_seq; + struct minmax rtt_min; + u32 packets_out; + u32 retrans_out; + u32 max_packets_out; + u32 max_packets_seq; + u16 urg_data; + u8 ecn_flags; + u8 keepalive_probes; + u32 reordering; + u32 reord_seen; + u32 snd_up; + struct tcp_options_received rx_opt; + u32 snd_ssthresh; + u32 snd_cwnd; + u32 snd_cwnd_cnt; + u32 snd_cwnd_clamp; + u32 snd_cwnd_used; + u32 snd_cwnd_stamp; + u32 prior_cwnd; + u32 prr_delivered; + u32 prr_out; + u32 delivered; + u32 delivered_ce; + u32 lost; + u32 app_limited; + u64 first_tx_mstamp; + u64 delivered_mstamp; + u32 rate_delivered; + u32 rate_interval_us; + u32 rcv_wnd; + u32 write_seq; + u32 notsent_lowat; + u32 pushed_seq; + u32 lost_out; + u32 sacked_out; + struct hrtimer pacing_timer; + struct hrtimer compressed_ack_timer; + struct sk_buff *lost_skb_hint; + struct sk_buff *retransmit_skb_hint; + struct rb_root out_of_order_queue; + struct sk_buff *ooo_last_skb; + struct tcp_sack_block duplicate_sack[1]; + struct tcp_sack_block selective_acks[4]; + struct tcp_sack_block recv_sack_cache[4]; + struct sk_buff *highest_sack; + int lost_cnt_hint; + u32 prior_ssthresh; + u32 high_seq; + u32 retrans_stamp; + u32 undo_marker; + int undo_retrans; + u64 bytes_retrans; + u32 total_retrans; + u32 urg_seq; + unsigned int keepalive_time; + unsigned int keepalive_intvl; + int linger2; + u8 bpf_sock_ops_cb_flags; + u16 timeout_rehash; + u32 rcv_ooopack; + u32 rcv_rtt_last_tsecr; + struct { + u32 rtt_us; + u32 seq; + u64 time; + } rcv_rtt_est; + struct { + u32 space; + u32 seq; + u64 time; + } rcvq_space; + struct { + u32 probe_seq_start; + u32 probe_seq_end; + } mtu_probe; + u32 mtu_info; + bool is_mptcp; + bool syn_smc; + const struct tcp_sock_af_ops *af_specific; + struct tcp_md5sig_info *md5sig_info; + struct tcp_fastopen_request *fastopen_req; + struct request_sock *fastopen_rsk; + struct saved_syn *saved_syn; +}; + +struct tcp_md5sig_key; + +struct tcp_sock_af_ops { + struct tcp_md5sig_key * (*md5_lookup)(const struct sock *, const struct sock *); + int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); + int (*md5_parse)(struct sock *, int, sockptr_t, int); +}; + +struct tcp_md5sig_info { + struct hlist_head head; + struct callback_head rcu; +}; + +struct tcp_fastopen_request { + struct tcp_fastopen_cookie cookie; + struct msghdr *data; + size_t size; + int copied; + struct ubuf_info *uarg; +}; + +union tcp_md5_addr { + struct in_addr a4; + struct in6_addr a6; +}; + +struct tcp_md5sig_key { + struct hlist_node node; + u8 keylen; + u8 family; + u8 prefixlen; + u8 flags; + union tcp_md5_addr addr; + int l3index; + u8 key[80]; + struct callback_head rcu; +}; + +struct net_protocol { + int (*early_demux)(struct sk_buff *); + int (*early_demux_handler)(struct sk_buff *); + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, u32); + unsigned int no_policy: 1; + unsigned int icmp_strict_tag_validation: 1; +}; + +struct cgroup_cls_state { + struct cgroup_subsys_state css; + u32 classid; +}; + +enum { + SK_MEMINFO_RMEM_ALLOC = 0, + SK_MEMINFO_RCVBUF = 1, + SK_MEMINFO_WMEM_ALLOC = 2, + SK_MEMINFO_SNDBUF = 3, + SK_MEMINFO_FWD_ALLOC = 4, + SK_MEMINFO_WMEM_QUEUED = 5, + SK_MEMINFO_OPTMEM = 6, + SK_MEMINFO_BACKLOG = 7, + SK_MEMINFO_DROPS = 8, + SK_MEMINFO_VARS = 9, +}; + +enum sknetlink_groups { + SKNLGRP_NONE = 0, + SKNLGRP_INET_TCP_DESTROY = 1, + SKNLGRP_INET_UDP_DESTROY = 2, + SKNLGRP_INET6_TCP_DESTROY = 3, + SKNLGRP_INET6_UDP_DESTROY = 4, + __SKNLGRP_MAX = 5, +}; + +struct inet_request_sock { + struct request_sock req; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u16 tstamp_ok: 1; + u16 sack_ok: 1; + u16 wscale_ok: 1; + u16 ecn_ok: 1; + u16 acked: 1; + u16 no_srccheck: 1; + u16 smc_ok: 1; + u32 ir_mark; + union { + struct ip_options_rcu *ireq_opt; + struct { + struct ipv6_txoptions *ipv6_opt; + struct sk_buff *pktopts; + }; + }; +}; + +struct tcp_request_sock_ops; + +struct tcp_request_sock { + struct inet_request_sock req; + const struct tcp_request_sock_ops *af_specific; + u64 snt_synack; + bool tfo_listener; + bool is_mptcp; + bool drop_req; + u32 txhash; + u32 rcv_isn; + u32 snt_isn; + u32 ts_off; + u32 last_oow_ack_time; + u32 rcv_nxt; + u8 syn_tos; +}; + +enum tcp_synack_type { + TCP_SYNACK_NORMAL = 0, + TCP_SYNACK_FASTOPEN = 1, + TCP_SYNACK_COOKIE = 2, +}; + +struct tcp_request_sock_ops { + u16 mss_clamp; + struct tcp_md5sig_key * (*req_md5_lookup)(const struct sock *, const struct sock *); + int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); + __u32 (*cookie_init_seq)(const struct sk_buff *, __u16 *); + struct dst_entry * (*route_req)(const struct sock *, struct sk_buff *, struct flowi *, struct request_sock *); + u32 (*init_seq)(const struct sk_buff *); + u32 (*init_ts_off)(const struct net *, const struct sk_buff *); + int (*send_synack)(const struct sock *, struct dst_entry *, struct flowi *, struct request_sock *, struct tcp_fastopen_cookie *, enum tcp_synack_type, struct sk_buff *); +}; + +enum { + SKB_FCLONE_UNAVAILABLE = 0, + SKB_FCLONE_ORIG = 1, + SKB_FCLONE_CLONE = 2, +}; + +struct sk_buff_fclones { + struct sk_buff skb1; + struct sk_buff skb2; + refcount_t fclone_ref; +}; + +struct skb_seq_state { + __u32 lower_offset; + __u32 upper_offset; + __u32 frag_idx; + __u32 stepped_offset; + struct sk_buff *root_skb; + struct sk_buff *cur_skb; + __u8 *frag_data; + __u32 frag_off; +}; + +struct skb_checksum_ops { + __wsum (*update)(const void *, int, __wsum); + __wsum (*combine)(__wsum, __wsum, int, int); +}; + +struct skb_gso_cb { + union { + int mac_offset; + int data_offset; + }; + int encap_level; + __wsum csum; + __u16 csum_start; +}; + +struct napi_gro_cb { + void *frag0; + unsigned int frag0_len; + int data_offset; + u16 flush; + u16 flush_id; + u16 count; + u16 gro_remcsum_start; + long unsigned int age; + u16 proto; + u8 same_flow: 1; + u8 encap_mark: 1; + u8 csum_valid: 1; + u8 csum_cnt: 3; + u8 free: 2; + u8 is_ipv6: 1; + u8 is_fou: 1; + u8 is_atomic: 1; + u8 recursion_counter: 4; + u8 is_flist: 1; + __wsum csum; + struct sk_buff *last; +}; + +struct qdisc_walker { + int stop; + int skip; + int count; + int (*fn)(struct Qdisc *, long unsigned int, struct qdisc_walker *); +}; + +struct ip_auth_hdr { + __u8 nexthdr; + __u8 hdrlen; + __be16 reserved; + __be32 spi; + __be32 seq_no; + __u8 auth_data[0]; +}; + +struct frag_hdr { + __u8 nexthdr; + __u8 reserved; + __be16 frag_off; + __be32 identification; +}; + +enum { + SCM_TSTAMP_SND = 0, + SCM_TSTAMP_SCHED = 1, + SCM_TSTAMP_ACK = 2, +}; + +struct mpls_shim_hdr { + __be32 label_stack_entry; +}; + +struct napi_alloc_cache { + struct page_frag_cache page; + unsigned int skb_count; + void *skb_cache[64]; +}; + +typedef int (*sendmsg_func)(struct sock *, struct msghdr *, struct kvec *, size_t, size_t); + +typedef int (*sendpage_func)(struct sock *, struct page *, int, size_t, int); + +struct ahash_request___2; + +struct scm_cookie { + struct pid *pid; + struct scm_fp_list *fp; + struct scm_creds creds; + u32 secid; +}; + +struct scm_timestamping { + struct __kernel_old_timespec ts[3]; +}; + +struct scm_timestamping64 { + struct __kernel_timespec ts[3]; +}; + +enum { + TCA_STATS_UNSPEC = 0, + TCA_STATS_BASIC = 1, + TCA_STATS_RATE_EST = 2, + TCA_STATS_QUEUE = 3, + TCA_STATS_APP = 4, + TCA_STATS_RATE_EST64 = 5, + TCA_STATS_PAD = 6, + TCA_STATS_BASIC_HW = 7, + TCA_STATS_PKT64 = 8, + __TCA_STATS_MAX = 9, +}; + +struct gnet_stats_basic { + __u64 bytes; + __u32 packets; +}; + +struct gnet_stats_rate_est { + __u32 bps; + __u32 pps; +}; + +struct gnet_stats_rate_est64 { + __u64 bps; + __u64 pps; +}; + +struct gnet_estimator { + signed char interval; + unsigned char ewma_log; +}; + +struct net_rate_estimator { + struct gnet_stats_basic_sync *bstats; + spinlock_t *stats_lock; + bool running; + struct gnet_stats_basic_sync *cpu_bstats; + u8 ewma_log; + u8 intvl_log; + seqcount_t seq; + u64 last_packets; + u64 last_bytes; + u64 avpps; + u64 avbps; + long unsigned int next_jiffies; + struct timer_list timer; + struct callback_head rcu; +}; + +struct rtgenmsg { + unsigned char rtgen_family; +}; + +enum rtnetlink_groups { + RTNLGRP_NONE = 0, + RTNLGRP_LINK = 1, + RTNLGRP_NOTIFY = 2, + RTNLGRP_NEIGH = 3, + RTNLGRP_TC = 4, + RTNLGRP_IPV4_IFADDR = 5, + RTNLGRP_IPV4_MROUTE = 6, + RTNLGRP_IPV4_ROUTE = 7, + RTNLGRP_IPV4_RULE = 8, + RTNLGRP_IPV6_IFADDR = 9, + RTNLGRP_IPV6_MROUTE = 10, + RTNLGRP_IPV6_ROUTE = 11, + RTNLGRP_IPV6_IFINFO = 12, + RTNLGRP_DECnet_IFADDR = 13, + RTNLGRP_NOP2 = 14, + RTNLGRP_DECnet_ROUTE = 15, + RTNLGRP_DECnet_RULE = 16, + RTNLGRP_NOP4 = 17, + RTNLGRP_IPV6_PREFIX = 18, + RTNLGRP_IPV6_RULE = 19, + RTNLGRP_ND_USEROPT = 20, + RTNLGRP_PHONET_IFADDR = 21, + RTNLGRP_PHONET_ROUTE = 22, + RTNLGRP_DCB = 23, + RTNLGRP_IPV4_NETCONF = 24, + RTNLGRP_IPV6_NETCONF = 25, + RTNLGRP_MDB = 26, + RTNLGRP_MPLS_ROUTE = 27, + RTNLGRP_NSID = 28, + RTNLGRP_MPLS_NETCONF = 29, + RTNLGRP_IPV4_MROUTE_R = 30, + RTNLGRP_IPV6_MROUTE_R = 31, + RTNLGRP_NEXTHOP = 32, + RTNLGRP_BRVLAN = 33, + __RTNLGRP_MAX = 34, +}; + +enum { + NETNSA_NONE = 0, + NETNSA_NSID = 1, + NETNSA_PID = 2, + NETNSA_FD = 3, + NETNSA_TARGET_NSID = 4, + NETNSA_CURRENT_NSID = 5, + __NETNSA_MAX = 6, +}; + +struct pcpu_gen_cookie { + local_t nesting; + u64 last; +}; + +struct gen_cookie { + struct pcpu_gen_cookie *local; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + atomic64_t forward_last; + atomic64_t reverse_last; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, struct netlink_ext_ack *); + +typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *); + +enum rtnl_link_flags { + RTNL_FLAG_DOIT_UNLOCKED = 1, +}; + +struct net_fill_args { + u32 portid; + u32 seq; + int flags; + int cmd; + int nsid; + bool add_ref; + int ref_nsid; +}; + +struct rtnl_net_dump_cb { + struct net *tgt_net; + struct net *ref_net; + struct sk_buff *skb; + struct net_fill_args fillargs; + int idx; + int s_idx; +}; + +typedef u16 u_int16_t; + +typedef u32 u_int32_t; + +typedef u64 u_int64_t; + +enum flow_dissect_ret { + FLOW_DISSECT_RET_OUT_GOOD = 0, + FLOW_DISSECT_RET_OUT_BAD = 1, + FLOW_DISSECT_RET_PROTO_AGAIN = 2, + FLOW_DISSECT_RET_IPPROTO_AGAIN = 3, + FLOW_DISSECT_RET_CONTINUE = 4, +}; + +struct flow_dissector_key_tags { + u32 flow_label; +}; + +struct flow_dissector_key_vlan { + union { + struct { + u16 vlan_id: 12; + u16 vlan_dei: 1; + u16 vlan_priority: 3; + }; + __be16 vlan_tci; + }; + __be16 vlan_tpid; +}; + +struct flow_dissector_mpls_lse { + u32 mpls_ttl: 8; + u32 mpls_bos: 1; + u32 mpls_tc: 3; + u32 mpls_label: 20; +}; + +struct flow_dissector_key_mpls { + struct flow_dissector_mpls_lse ls[7]; + u8 used_lses; +}; + +struct flow_dissector_key_enc_opts { + u8 data[255]; + u8 len; + __be16 dst_opt_type; +}; + +struct flow_dissector_key_keyid { + __be32 keyid; +}; + +struct flow_dissector_key_ipv4_addrs { + __be32 src; + __be32 dst; +}; + +struct flow_dissector_key_ipv6_addrs { + struct in6_addr src; + struct in6_addr dst; +}; + +struct flow_dissector_key_tipc { + __be32 key; +}; + +struct flow_dissector_key_addrs { + union { + struct flow_dissector_key_ipv4_addrs v4addrs; + struct flow_dissector_key_ipv6_addrs v6addrs; + struct flow_dissector_key_tipc tipckey; + }; +}; + +struct flow_dissector_key_arp { + __u32 sip; + __u32 tip; + __u8 op; + unsigned char sha[6]; + unsigned char tha[6]; +}; + +struct flow_dissector_key_ports { + union { + __be32 ports; + struct { + __be16 src; + __be16 dst; + }; + }; +}; + +struct flow_dissector_key_icmp { + struct { + u8 type; + u8 code; + }; + u16 id; +}; + +struct flow_dissector_key_eth_addrs { + unsigned char dst[6]; + unsigned char src[6]; +}; + +struct flow_dissector_key_tcp { + __be16 flags; +}; + +struct flow_dissector_key_ip { + __u8 tos; + __u8 ttl; +}; + +struct flow_dissector_key_meta { + int ingress_ifindex; + u16 ingress_iftype; +}; + +struct flow_dissector_key_ct { + u16 ct_state; + u16 ct_zone; + u32 ct_mark; + u32 ct_labels[4]; +}; + +struct flow_dissector_key_hash { + u32 hash; +}; + +struct flow_dissector_key { + enum flow_dissector_key_id key_id; + size_t offset; +}; + +struct flow_keys { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; + struct flow_dissector_key_tags tags; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_vlan cvlan; + struct flow_dissector_key_keyid keyid; + struct flow_dissector_key_ports ports; + struct flow_dissector_key_icmp icmp; + struct flow_dissector_key_addrs addrs; + int: 32; +}; + +struct flow_keys_digest { + u8 data[16]; +}; + +enum ip_conntrack_info { + IP_CT_ESTABLISHED = 0, + IP_CT_RELATED = 1, + IP_CT_NEW = 2, + IP_CT_IS_REPLY = 3, + IP_CT_ESTABLISHED_REPLY = 3, + IP_CT_RELATED_REPLY = 4, + IP_CT_NUMBER = 5, + IP_CT_UNTRACKED = 7, +}; + +union nf_inet_addr { + __u32 all[4]; + __be32 ip; + __be32 ip6[4]; + struct in_addr in; + struct in6_addr in6; +}; + +struct ip_ct_tcp_state { + u_int32_t td_end; + u_int32_t td_maxend; + u_int32_t td_maxwin; + u_int32_t td_maxack; + u_int8_t td_scale; + u_int8_t flags; +}; + +struct ip_ct_tcp { + struct ip_ct_tcp_state seen[2]; + u_int8_t state; + u_int8_t last_dir; + u_int8_t retrans; + u_int8_t last_index; + u_int32_t last_seq; + u_int32_t last_ack; + u_int32_t last_end; + u_int16_t last_win; + u_int8_t last_wscale; + u_int8_t last_flags; +}; + +union nf_conntrack_man_proto { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + __be16 id; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; +}; + +struct nf_ct_dccp { + u_int8_t role[2]; + u_int8_t state; + u_int8_t last_pkt; + u_int8_t last_dir; + u_int64_t handshake_seq; +}; + +struct ip_ct_sctp { + enum sctp_conntrack state; + __be32 vtag[2]; + u8 last_dir; + u8 flags; +}; + +struct nf_ct_event; + +struct nf_exp_event; + +struct nf_ct_event_notifier { + int (*ct_event)(unsigned int, const struct nf_ct_event *); + int (*exp_event)(unsigned int, const struct nf_exp_event *); +}; + +enum bpf_ret_code { + BPF_OK = 0, + BPF_DROP = 2, + BPF_REDIRECT = 7, + BPF_LWT_REROUTE = 128, +}; + +enum { + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 1, + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 2, + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 4, +}; + +enum { + TCA_FLOWER_KEY_CT_FLAGS_NEW = 1, + TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED = 2, + TCA_FLOWER_KEY_CT_FLAGS_RELATED = 4, + TCA_FLOWER_KEY_CT_FLAGS_TRACKED = 8, + TCA_FLOWER_KEY_CT_FLAGS_INVALID = 16, + TCA_FLOWER_KEY_CT_FLAGS_REPLY = 32, + __TCA_FLOWER_KEY_CT_FLAGS_MAX = 33, +}; + +struct ip_tunnel_key { + __be64 tun_id; + union { + struct { + __be32 src; + __be32 dst; + } ipv4; + struct { + struct in6_addr src; + struct in6_addr dst; + } ipv6; + } u; + __be16 tun_flags; + u8 tos; + u8 ttl; + __be32 label; + __be16 tp_src; + __be16 tp_dst; +}; + +struct dst_cache_pcpu; + +struct dst_cache { + struct dst_cache_pcpu *cache; + long unsigned int reset_ts; +}; + +struct ip_tunnel_info { + struct ip_tunnel_key key; + struct dst_cache dst_cache; + u8 options_len; + u8 mode; +}; + +union tcp_word_hdr { + struct tcphdr hdr; + __be32 words[5]; +}; + +struct arphdr { + __be16 ar_hrd; + __be16 ar_pro; + unsigned char ar_hln; + unsigned char ar_pln; + __be16 ar_op; +}; + +enum lwtunnel_encap_types { + LWTUNNEL_ENCAP_NONE = 0, + LWTUNNEL_ENCAP_MPLS = 1, + LWTUNNEL_ENCAP_IP = 2, + LWTUNNEL_ENCAP_ILA = 3, + LWTUNNEL_ENCAP_IP6 = 4, + LWTUNNEL_ENCAP_SEG6 = 5, + LWTUNNEL_ENCAP_BPF = 6, + LWTUNNEL_ENCAP_SEG6_LOCAL = 7, + LWTUNNEL_ENCAP_RPL = 8, + LWTUNNEL_ENCAP_IOAM6 = 9, + __LWTUNNEL_ENCAP_MAX = 10, +}; + +enum metadata_type { + METADATA_IP_TUNNEL = 0, + METADATA_HW_PORT_MUX = 1, +}; + +struct hw_port_info { + struct net_device *lower_dev; + u32 port_id; +}; + +struct metadata_dst { + struct dst_entry dst; + enum metadata_type type; + union { + struct ip_tunnel_info tun_info; + struct hw_port_info port_info; + } u; +}; + +struct gre_base_hdr { + __be16 flags; + __be16 protocol; +}; + +struct gre_full_hdr { + struct gre_base_hdr fixed_header; + __be16 csum; + __be16 reserved1; + __be32 key; + __be32 seq; +}; + +struct pptp_gre_header { + struct gre_base_hdr gre_hd; + __be16 payload_len; + __be16 call_id; + __be32 seq; + __be32 ack; +}; + +struct tipc_basic_hdr { + __be32 w[4]; +}; + +struct icmphdr { + __u8 type; + __u8 code; + __sum16 checksum; + union { + struct { + __be16 id; + __be16 sequence; + } echo; + __be32 gateway; + struct { + __be16 __unused; + __be16 mtu; + } frag; + __u8 reserved[4]; + } un; +}; + +enum l2tp_debug_flags { + L2TP_MSG_DEBUG = 1, + L2TP_MSG_CONTROL = 2, + L2TP_MSG_SEQ = 4, + L2TP_MSG_DATA = 8, +}; + +struct pppoe_tag { + __be16 tag_type; + __be16 tag_len; + char tag_data[0]; +}; + +struct pppoe_hdr { + __u8 type: 4; + __u8 ver: 4; + __u8 code; + __be16 sid; + __be16 length; + struct pppoe_tag tag[0]; +}; + +struct mpls_label { + __be32 entry; +}; + +struct clock_identity { + u8 id[8]; +}; + +struct port_identity { + struct clock_identity clock_identity; + __be16 port_number; +}; + +struct ptp_header { + u8 tsmt; + u8 ver; + __be16 message_length; + u8 domain_number; + u8 reserved1; + u8 flag_field[2]; + __be64 correction; + __be32 reserved2; + struct port_identity source_port_identity; + __be16 sequence_id; + u8 control; + u8 log_message_interval; +} __attribute__((packed)); + +enum batadv_packettype { + BATADV_IV_OGM = 0, + BATADV_BCAST = 1, + BATADV_CODED = 2, + BATADV_ELP = 3, + BATADV_OGM2 = 4, + BATADV_UNICAST = 64, + BATADV_UNICAST_FRAG = 65, + BATADV_UNICAST_4ADDR = 66, + BATADV_ICMP = 67, + BATADV_UNICAST_TVLV = 68, +}; + +struct batadv_unicast_packet { + __u8 packet_type; + __u8 version; + __u8 ttl; + __u8 ttvn; + __u8 dest[6]; +}; + +struct nf_conntrack_zone { + u16 id; + u8 flags; + u8 dir; +}; + +struct nf_conntrack_man { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + u_int16_t l3num; +}; + +struct nf_conntrack_tuple { + struct nf_conntrack_man src; + struct { + union nf_inet_addr u3; + union { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + u_int8_t type; + u_int8_t code; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; + } u; + u_int8_t protonum; + u_int8_t dir; + } dst; +}; + +struct nf_conntrack_tuple_hash { + struct hlist_nulls_node hnnode; + struct nf_conntrack_tuple tuple; +}; + +struct nf_ct_udp { + long unsigned int stream_ts; +}; + +struct nf_ct_gre { + unsigned int stream_timeout; + unsigned int timeout; +}; + +union nf_conntrack_proto { + struct nf_ct_dccp dccp; + struct ip_ct_sctp sctp; + struct ip_ct_tcp tcp; + struct nf_ct_udp udp; + struct nf_ct_gre gre; + unsigned int tmpl_padto; +}; + +struct nf_ct_ext; + +struct nf_conn { + struct nf_conntrack ct_general; + spinlock_t lock; + u32 timeout; + struct nf_conntrack_zone zone; + struct nf_conntrack_tuple_hash tuplehash[2]; + long unsigned int status; + u16 cpu; + possible_net_t ct_net; + struct hlist_node nat_bysource; + struct { } __nfct_init_offset; + struct nf_conn *master; + u_int32_t mark; + u_int32_t secmark; + struct nf_ct_ext *ext; + union nf_conntrack_proto proto; +}; + +struct nf_conntrack_tuple_mask { + struct { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + } src; +}; + +struct nf_ct_ext { + u8 offset[9]; + u8 len; + char data[0]; +}; + +struct nf_conntrack_helper; + +struct nf_conntrack_expect { + struct hlist_node lnode; + struct hlist_node hnode; + struct nf_conntrack_tuple tuple; + struct nf_conntrack_tuple_mask mask; + void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); + struct nf_conntrack_helper *helper; + struct nf_conn *master; + struct timer_list timeout; + refcount_t use; + unsigned int flags; + unsigned int class; + union nf_inet_addr saved_addr; + union nf_conntrack_man_proto saved_proto; + enum ip_conntrack_dir dir; + struct callback_head rcu; +}; + +enum nf_ct_ext_id { + NF_CT_EXT_HELPER = 0, + NF_CT_EXT_NAT = 1, + NF_CT_EXT_SEQADJ = 2, + NF_CT_EXT_ACCT = 3, + NF_CT_EXT_ECACHE = 4, + NF_CT_EXT_TSTAMP = 5, + NF_CT_EXT_TIMEOUT = 6, + NF_CT_EXT_LABELS = 7, + NF_CT_EXT_SYNPROXY = 8, + NF_CT_EXT_NUM = 9, +}; + +struct nf_ct_event { + struct nf_conn *ct; + u32 portid; + int report; +}; + +struct nf_exp_event { + struct nf_conntrack_expect *exp; + u32 portid; + int report; +}; + +struct nf_conn_labels { + long unsigned int bits[2]; +}; + +struct _flow_keys_digest_data { + __be16 n_proto; + u8 ip_proto; + u8 padding; + __be32 ports; + __be32 src; + __be32 dst; +}; + +enum { + IF_OPER_UNKNOWN = 0, + IF_OPER_NOTPRESENT = 1, + IF_OPER_DOWN = 2, + IF_OPER_LOWERLAYERDOWN = 3, + IF_OPER_TESTING = 4, + IF_OPER_DORMANT = 5, + IF_OPER_UP = 6, +}; + +struct tc_skb_ext { + __u32 chain; + __u16 mru; + __u16 zone; + bool post_ct; +}; + +struct ipv4_devconf { + void *sysctl; + int data[33]; + long unsigned int state[1]; +}; + +enum nf_dev_hooks { + NF_NETDEV_INGRESS = 0, + NF_NETDEV_EGRESS = 1, + NF_NETDEV_NUMHOOKS = 2, +}; + +struct ifbond { + __s32 bond_mode; + __s32 num_slaves; + __s32 miimon; +}; + +typedef struct ifbond ifbond; + +struct ifslave { + __s32 slave_id; + char slave_name[16]; + __s8 link; + __s8 state; + __u32 link_failure_count; +}; + +typedef struct ifslave ifslave; + +enum { + NAPIF_STATE_SCHED = 1, + NAPIF_STATE_MISSED = 2, + NAPIF_STATE_DISABLE = 4, + NAPIF_STATE_NPSVC = 8, + NAPIF_STATE_LISTED = 16, + NAPIF_STATE_NO_BUSY_POLL = 32, + NAPIF_STATE_IN_BUSY_POLL = 64, + NAPIF_STATE_PREFER_BUSY_POLL = 128, + NAPIF_STATE_THREADED = 256, + NAPIF_STATE_SCHED_THREADED = 512, +}; + +struct net_device_path_stack { + int num_paths; + struct net_device_path path[5]; +}; + +struct bpf_xdp_link { + struct bpf_link link; + struct net_device *dev; + int flags; +}; + +struct netdev_net_notifier { + struct list_head list; + struct notifier_block *nb; +}; + +struct netpoll; + +struct netpoll_info { + refcount_t refcnt; + struct semaphore dev_lock; + struct sk_buff_head txq; + struct delayed_work tx_work; + struct netpoll *netpoll; + struct callback_head rcu; +}; + +struct in_ifaddr; + +struct ip_mc_list; + +struct in_device { + struct net_device *dev; + refcount_t refcnt; + int dead; + struct in_ifaddr *ifa_list; + struct ip_mc_list *mc_list; + struct ip_mc_list **mc_hash; + int mc_count; + spinlock_t mc_tomb_lock; + struct ip_mc_list *mc_tomb; + long unsigned int mr_v1_seen; + long unsigned int mr_v2_seen; + long unsigned int mr_maxdelay; + long unsigned int mr_qi; + long unsigned int mr_qri; + unsigned char mr_qrv; + unsigned char mr_gq_running; + u32 mr_ifc_count; + struct timer_list mr_gq_timer; + struct timer_list mr_ifc_timer; + struct neigh_parms *arp_parms; + struct ipv4_devconf cnf; + struct callback_head callback_head; +}; + +struct packet_type { + __be16 type; + bool ignore_outgoing; + struct net_device *dev; + int (*func)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); + void (*list_func)(struct list_head *, struct packet_type *, struct net_device *); + bool (*id_match)(struct packet_type *, struct sock *); + void *af_packet_priv; + struct list_head list; +}; + +struct offload_callbacks { + struct sk_buff * (*gso_segment)(struct sk_buff *, netdev_features_t); + struct sk_buff * (*gro_receive)(struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sk_buff *, int); +}; + +struct packet_offload { + __be16 type; + u16 priority; + struct offload_callbacks callbacks; + struct list_head list; +}; + +struct netdev_notifier_info_ext { + struct netdev_notifier_info info; + union { + u32 mtu; + } ext; +}; + +struct netdev_notifier_change_info { + struct netdev_notifier_info info; + unsigned int flags_changed; +}; + +struct netdev_notifier_changelowerstate_info { + struct netdev_notifier_info info; + void *lower_state_info; +}; + +struct netdev_notifier_pre_changeaddr_info { + struct netdev_notifier_info info; + const unsigned char *dev_addr; +}; + +typedef int (*bpf_op_t)(struct net_device *, struct netdev_bpf *); + +enum { + NESTED_SYNC_IMM_BIT = 0, + NESTED_SYNC_TODO_BIT = 1, +}; + +struct netdev_nested_priv { + unsigned char flags; + void *data; +}; + +struct netdev_bonding_info { + ifslave slave; + ifbond master; +}; + +struct netdev_notifier_bonding_info { + struct netdev_notifier_info info; + struct netdev_bonding_info bonding_info; +}; + +union inet_addr { + __u32 all[4]; + __be32 ip; + __be32 ip6[4]; + struct in_addr in; + struct in6_addr in6; +}; + +struct netpoll { + struct net_device *dev; + char dev_name[16]; + const char *name; + union inet_addr local_ip; + union inet_addr remote_ip; + bool ipv6; + u16 local_port; + u16 remote_port; + u8 remote_mac[6]; +}; + +enum qdisc_state_t { + __QDISC_STATE_SCHED = 0, + __QDISC_STATE_DEACTIVATED = 1, + __QDISC_STATE_MISSED = 2, + __QDISC_STATE_DRAINING = 3, +}; + +enum qdisc_state2_t { + __QDISC_STATE2_RUNNING = 0, +}; + +struct tcf_walker { + int stop; + int skip; + int count; + bool nonempty; + long unsigned int cookie; + int (*fn)(struct tcf_proto *, void *, struct tcf_walker *); +}; + +enum { + IPV4_DEVCONF_FORWARDING = 1, + IPV4_DEVCONF_MC_FORWARDING = 2, + IPV4_DEVCONF_PROXY_ARP = 3, + IPV4_DEVCONF_ACCEPT_REDIRECTS = 4, + IPV4_DEVCONF_SECURE_REDIRECTS = 5, + IPV4_DEVCONF_SEND_REDIRECTS = 6, + IPV4_DEVCONF_SHARED_MEDIA = 7, + IPV4_DEVCONF_RP_FILTER = 8, + IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE = 9, + IPV4_DEVCONF_BOOTP_RELAY = 10, + IPV4_DEVCONF_LOG_MARTIANS = 11, + IPV4_DEVCONF_TAG = 12, + IPV4_DEVCONF_ARPFILTER = 13, + IPV4_DEVCONF_MEDIUM_ID = 14, + IPV4_DEVCONF_NOXFRM = 15, + IPV4_DEVCONF_NOPOLICY = 16, + IPV4_DEVCONF_FORCE_IGMP_VERSION = 17, + IPV4_DEVCONF_ARP_ANNOUNCE = 18, + IPV4_DEVCONF_ARP_IGNORE = 19, + IPV4_DEVCONF_PROMOTE_SECONDARIES = 20, + IPV4_DEVCONF_ARP_ACCEPT = 21, + IPV4_DEVCONF_ARP_NOTIFY = 22, + IPV4_DEVCONF_ACCEPT_LOCAL = 23, + IPV4_DEVCONF_SRC_VMARK = 24, + IPV4_DEVCONF_PROXY_ARP_PVLAN = 25, + IPV4_DEVCONF_ROUTE_LOCALNET = 26, + IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL = 27, + IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL = 28, + IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 29, + IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 30, + IPV4_DEVCONF_DROP_GRATUITOUS_ARP = 31, + IPV4_DEVCONF_BC_FORWARDING = 32, + IPV4_DEVCONF_ARP_EVICT_NOCARRIER = 33, + __IPV4_DEVCONF_MAX = 34, +}; + +struct tc_skb_cb { + struct qdisc_skb_cb qdisc_cb; + u16 mru; + bool post_ct; + u16 zone; +}; + +struct in_ifaddr { + struct hlist_node hash; + struct in_ifaddr *ifa_next; + struct in_device *ifa_dev; + struct callback_head callback_head; + __be32 ifa_local; + __be32 ifa_address; + __be32 ifa_mask; + __u32 ifa_rt_priority; + __be32 ifa_broadcast; + unsigned char ifa_scope; + unsigned char ifa_prefixlen; + __u32 ifa_flags; + char ifa_label[16]; + __u32 ifa_valid_lft; + __u32 ifa_preferred_lft; + long unsigned int ifa_cstamp; + long unsigned int ifa_tstamp; +}; + +struct udp_tunnel_info { + short unsigned int type; + sa_family_t sa_family; + __be16 port; + u8 hw_priv; +}; + +struct udp_tunnel_nic_shared { + struct udp_tunnel_nic *udp_tunnel_nic_info; + struct list_head devices; +}; + +struct dev_kfree_skb_cb { + enum skb_free_reason reason; +}; + +struct netdev_adjacent { + struct net_device *dev; + bool master; + bool ignore; + u16 ref_nr; + void *private; + struct list_head list; + struct callback_head rcu; +}; + +enum { + NDA_UNSPEC = 0, + NDA_DST = 1, + NDA_LLADDR = 2, + NDA_CACHEINFO = 3, + NDA_PROBES = 4, + NDA_VLAN = 5, + NDA_PORT = 6, + NDA_VNI = 7, + NDA_IFINDEX = 8, + NDA_MASTER = 9, + NDA_LINK_NETNSID = 10, + NDA_SRC_VNI = 11, + NDA_PROTOCOL = 12, + NDA_NH_ID = 13, + NDA_FDB_EXT_ATTRS = 14, + NDA_FLAGS_EXT = 15, + __NDA_MAX = 16, +}; + +struct nda_cacheinfo { + __u32 ndm_confirmed; + __u32 ndm_used; + __u32 ndm_updated; + __u32 ndm_refcnt; +}; + +struct ndt_stats { + __u64 ndts_allocs; + __u64 ndts_destroys; + __u64 ndts_hash_grows; + __u64 ndts_res_failed; + __u64 ndts_lookups; + __u64 ndts_hits; + __u64 ndts_rcv_probes_mcast; + __u64 ndts_rcv_probes_ucast; + __u64 ndts_periodic_gc_runs; + __u64 ndts_forced_gc_runs; + __u64 ndts_table_fulls; +}; + +enum { + NDTPA_UNSPEC = 0, + NDTPA_IFINDEX = 1, + NDTPA_REFCNT = 2, + NDTPA_REACHABLE_TIME = 3, + NDTPA_BASE_REACHABLE_TIME = 4, + NDTPA_RETRANS_TIME = 5, + NDTPA_GC_STALETIME = 6, + NDTPA_DELAY_PROBE_TIME = 7, + NDTPA_QUEUE_LEN = 8, + NDTPA_APP_PROBES = 9, + NDTPA_UCAST_PROBES = 10, + NDTPA_MCAST_PROBES = 11, + NDTPA_ANYCAST_DELAY = 12, + NDTPA_PROXY_DELAY = 13, + NDTPA_PROXY_QLEN = 14, + NDTPA_LOCKTIME = 15, + NDTPA_QUEUE_LENBYTES = 16, + NDTPA_MCAST_REPROBES = 17, + NDTPA_PAD = 18, + __NDTPA_MAX = 19, +}; + +struct ndtmsg { + __u8 ndtm_family; + __u8 ndtm_pad1; + __u16 ndtm_pad2; +}; + +struct ndt_config { + __u16 ndtc_key_len; + __u16 ndtc_entry_size; + __u32 ndtc_entries; + __u32 ndtc_last_flush; + __u32 ndtc_last_rand; + __u32 ndtc_hash_rnd; + __u32 ndtc_hash_mask; + __u32 ndtc_hash_chain_gc; + __u32 ndtc_proxy_qlen; +}; + +enum { + NDTA_UNSPEC = 0, + NDTA_NAME = 1, + NDTA_THRESH1 = 2, + NDTA_THRESH2 = 3, + NDTA_THRESH3 = 4, + NDTA_CONFIG = 5, + NDTA_PARMS = 6, + NDTA_STATS = 7, + NDTA_GC_INTERVAL = 8, + NDTA_PAD = 9, + __NDTA_MAX = 10, +}; + +enum { + RTN_UNSPEC = 0, + RTN_UNICAST = 1, + RTN_LOCAL = 2, + RTN_BROADCAST = 3, + RTN_ANYCAST = 4, + RTN_MULTICAST = 5, + RTN_BLACKHOLE = 6, + RTN_UNREACHABLE = 7, + RTN_PROHIBIT = 8, + RTN_THROW = 9, + RTN_NAT = 10, + RTN_XRESOLVE = 11, + __RTN_MAX = 12, +}; + +enum { + NEIGH_ARP_TABLE = 0, + NEIGH_ND_TABLE = 1, + NEIGH_DN_TABLE = 2, + NEIGH_NR_TABLES = 3, + NEIGH_LINK_TABLE = 3, +}; + +struct neigh_seq_state { + struct seq_net_private p; + struct neigh_table *tbl; + struct neigh_hash_table *nht; + void * (*neigh_sub_iter)(struct neigh_seq_state *, struct neighbour *, loff_t *); + unsigned int bucket; + unsigned int flags; +}; + +struct neighbour_cb { + long unsigned int sched_next; + unsigned int flags; +}; + +enum netevent_notif_type { + NETEVENT_NEIGH_UPDATE = 1, + NETEVENT_REDIRECT = 2, + NETEVENT_DELAY_PROBE_TIME_UPDATE = 3, + NETEVENT_IPV4_MPATH_HASH_UPDATE = 4, + NETEVENT_IPV6_MPATH_HASH_UPDATE = 5, + NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE = 6, +}; + +struct neigh_dump_filter { + int master_idx; + int dev_idx; +}; + +struct neigh_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table neigh_vars[21]; +}; + +struct netlink_dump_control { + int (*start)(struct netlink_callback *); + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + void *data; + struct module *module; + u32 min_dump_alloc; +}; + +struct rtnl_link_stats { + __u32 rx_packets; + __u32 tx_packets; + __u32 rx_bytes; + __u32 tx_bytes; + __u32 rx_errors; + __u32 tx_errors; + __u32 rx_dropped; + __u32 tx_dropped; + __u32 multicast; + __u32 collisions; + __u32 rx_length_errors; + __u32 rx_over_errors; + __u32 rx_crc_errors; + __u32 rx_frame_errors; + __u32 rx_fifo_errors; + __u32 rx_missed_errors; + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + __u32 rx_compressed; + __u32 tx_compressed; + __u32 rx_nohandler; +}; + +struct rtnl_link_ifmap { + __u64 mem_start; + __u64 mem_end; + __u64 base_addr; + __u16 irq; + __u8 dma; + __u8 port; +}; + +enum { + IFLA_PROTO_DOWN_REASON_UNSPEC = 0, + IFLA_PROTO_DOWN_REASON_MASK = 1, + IFLA_PROTO_DOWN_REASON_VALUE = 2, + __IFLA_PROTO_DOWN_REASON_CNT = 3, + IFLA_PROTO_DOWN_REASON_MAX = 2, +}; + +enum { + IFLA_BRPORT_UNSPEC = 0, + IFLA_BRPORT_STATE = 1, + IFLA_BRPORT_PRIORITY = 2, + IFLA_BRPORT_COST = 3, + IFLA_BRPORT_MODE = 4, + IFLA_BRPORT_GUARD = 5, + IFLA_BRPORT_PROTECT = 6, + IFLA_BRPORT_FAST_LEAVE = 7, + IFLA_BRPORT_LEARNING = 8, + IFLA_BRPORT_UNICAST_FLOOD = 9, + IFLA_BRPORT_PROXYARP = 10, + IFLA_BRPORT_LEARNING_SYNC = 11, + IFLA_BRPORT_PROXYARP_WIFI = 12, + IFLA_BRPORT_ROOT_ID = 13, + IFLA_BRPORT_BRIDGE_ID = 14, + IFLA_BRPORT_DESIGNATED_PORT = 15, + IFLA_BRPORT_DESIGNATED_COST = 16, + IFLA_BRPORT_ID = 17, + IFLA_BRPORT_NO = 18, + IFLA_BRPORT_TOPOLOGY_CHANGE_ACK = 19, + IFLA_BRPORT_CONFIG_PENDING = 20, + IFLA_BRPORT_MESSAGE_AGE_TIMER = 21, + IFLA_BRPORT_FORWARD_DELAY_TIMER = 22, + IFLA_BRPORT_HOLD_TIMER = 23, + IFLA_BRPORT_FLUSH = 24, + IFLA_BRPORT_MULTICAST_ROUTER = 25, + IFLA_BRPORT_PAD = 26, + IFLA_BRPORT_MCAST_FLOOD = 27, + IFLA_BRPORT_MCAST_TO_UCAST = 28, + IFLA_BRPORT_VLAN_TUNNEL = 29, + IFLA_BRPORT_BCAST_FLOOD = 30, + IFLA_BRPORT_GROUP_FWD_MASK = 31, + IFLA_BRPORT_NEIGH_SUPPRESS = 32, + IFLA_BRPORT_ISOLATED = 33, + IFLA_BRPORT_BACKUP_PORT = 34, + IFLA_BRPORT_MRP_RING_OPEN = 35, + IFLA_BRPORT_MRP_IN_OPEN = 36, + IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT = 37, + IFLA_BRPORT_MCAST_EHT_HOSTS_CNT = 38, + __IFLA_BRPORT_MAX = 39, +}; + +enum { + IFLA_VF_INFO_UNSPEC = 0, + IFLA_VF_INFO = 1, + __IFLA_VF_INFO_MAX = 2, +}; + +enum { + IFLA_VF_UNSPEC = 0, + IFLA_VF_MAC = 1, + IFLA_VF_VLAN = 2, + IFLA_VF_TX_RATE = 3, + IFLA_VF_SPOOFCHK = 4, + IFLA_VF_LINK_STATE = 5, + IFLA_VF_RATE = 6, + IFLA_VF_RSS_QUERY_EN = 7, + IFLA_VF_STATS = 8, + IFLA_VF_TRUST = 9, + IFLA_VF_IB_NODE_GUID = 10, + IFLA_VF_IB_PORT_GUID = 11, + IFLA_VF_VLAN_LIST = 12, + IFLA_VF_BROADCAST = 13, + __IFLA_VF_MAX = 14, +}; + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; +}; + +struct ifla_vf_broadcast { + __u8 broadcast[32]; +}; + +struct ifla_vf_vlan { + __u32 vf; + __u32 vlan; + __u32 qos; +}; + +enum { + IFLA_VF_VLAN_INFO_UNSPEC = 0, + IFLA_VF_VLAN_INFO = 1, + __IFLA_VF_VLAN_INFO_MAX = 2, +}; + +struct ifla_vf_vlan_info { + __u32 vf; + __u32 vlan; + __u32 qos; + __be16 vlan_proto; +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; +}; + +struct ifla_vf_rate { + __u32 vf; + __u32 min_tx_rate; + __u32 max_tx_rate; +}; + +struct ifla_vf_spoofchk { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_link_state { + __u32 vf; + __u32 link_state; +}; + +struct ifla_vf_rss_query_en { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_STATS_RX_PACKETS = 0, + IFLA_VF_STATS_TX_PACKETS = 1, + IFLA_VF_STATS_RX_BYTES = 2, + IFLA_VF_STATS_TX_BYTES = 3, + IFLA_VF_STATS_BROADCAST = 4, + IFLA_VF_STATS_MULTICAST = 5, + IFLA_VF_STATS_PAD = 6, + IFLA_VF_STATS_RX_DROPPED = 7, + IFLA_VF_STATS_TX_DROPPED = 8, + __IFLA_VF_STATS_MAX = 9, +}; + +struct ifla_vf_trust { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_PORT_UNSPEC = 0, + IFLA_VF_PORT = 1, + __IFLA_VF_PORT_MAX = 2, +}; + +enum { + IFLA_PORT_UNSPEC = 0, + IFLA_PORT_VF = 1, + IFLA_PORT_PROFILE = 2, + IFLA_PORT_VSI_TYPE = 3, + IFLA_PORT_INSTANCE_UUID = 4, + IFLA_PORT_HOST_UUID = 5, + IFLA_PORT_REQUEST = 6, + IFLA_PORT_RESPONSE = 7, + __IFLA_PORT_MAX = 8, +}; + +struct if_stats_msg { + __u8 family; + __u8 pad1; + __u16 pad2; + __u32 ifindex; + __u32 filter_mask; +}; + +enum { + IFLA_STATS_UNSPEC = 0, + IFLA_STATS_LINK_64 = 1, + IFLA_STATS_LINK_XSTATS = 2, + IFLA_STATS_LINK_XSTATS_SLAVE = 3, + IFLA_STATS_LINK_OFFLOAD_XSTATS = 4, + IFLA_STATS_AF_SPEC = 5, + __IFLA_STATS_MAX = 6, +}; + +enum { + IFLA_OFFLOAD_XSTATS_UNSPEC = 0, + IFLA_OFFLOAD_XSTATS_CPU_HIT = 1, + __IFLA_OFFLOAD_XSTATS_MAX = 2, +}; + +enum { + XDP_ATTACHED_NONE = 0, + XDP_ATTACHED_DRV = 1, + XDP_ATTACHED_SKB = 2, + XDP_ATTACHED_HW = 3, + XDP_ATTACHED_MULTI = 4, +}; + +enum { + IFLA_XDP_UNSPEC = 0, + IFLA_XDP_FD = 1, + IFLA_XDP_ATTACHED = 2, + IFLA_XDP_FLAGS = 3, + IFLA_XDP_PROG_ID = 4, + IFLA_XDP_DRV_PROG_ID = 5, + IFLA_XDP_SKB_PROG_ID = 6, + IFLA_XDP_HW_PROG_ID = 7, + IFLA_XDP_EXPECTED_FD = 8, + __IFLA_XDP_MAX = 9, +}; + +enum { + IFLA_EVENT_NONE = 0, + IFLA_EVENT_REBOOT = 1, + IFLA_EVENT_FEATURES = 2, + IFLA_EVENT_BONDING_FAILOVER = 3, + IFLA_EVENT_NOTIFY_PEERS = 4, + IFLA_EVENT_IGMP_RESEND = 5, + IFLA_EVENT_BONDING_OPTIONS = 6, +}; + +enum { + IFLA_BRIDGE_FLAGS = 0, + IFLA_BRIDGE_MODE = 1, + IFLA_BRIDGE_VLAN_INFO = 2, + IFLA_BRIDGE_VLAN_TUNNEL_INFO = 3, + IFLA_BRIDGE_MRP = 4, + IFLA_BRIDGE_CFM = 5, + __IFLA_BRIDGE_MAX = 6, +}; + +enum { + BR_MCAST_DIR_RX = 0, + BR_MCAST_DIR_TX = 1, + BR_MCAST_DIR_SIZE = 2, +}; + +enum rtattr_type_t { + RTA_UNSPEC = 0, + RTA_DST = 1, + RTA_SRC = 2, + RTA_IIF = 3, + RTA_OIF = 4, + RTA_GATEWAY = 5, + RTA_PRIORITY = 6, + RTA_PREFSRC = 7, + RTA_METRICS = 8, + RTA_MULTIPATH = 9, + RTA_PROTOINFO = 10, + RTA_FLOW = 11, + RTA_CACHEINFO = 12, + RTA_SESSION = 13, + RTA_MP_ALGO = 14, + RTA_TABLE = 15, + RTA_MARK = 16, + RTA_MFC_STATS = 17, + RTA_VIA = 18, + RTA_NEWDST = 19, + RTA_PREF = 20, + RTA_ENCAP_TYPE = 21, + RTA_ENCAP = 22, + RTA_EXPIRES = 23, + RTA_PAD = 24, + RTA_UID = 25, + RTA_TTL_PROPAGATE = 26, + RTA_IP_PROTO = 27, + RTA_SPORT = 28, + RTA_DPORT = 29, + RTA_NH_ID = 30, + __RTA_MAX = 31, +}; + +struct rta_cacheinfo { + __u32 rta_clntref; + __u32 rta_lastuse; + __s32 rta_expires; + __u32 rta_error; + __u32 rta_used; + __u32 rta_id; + __u32 rta_ts; + __u32 rta_tsage; +}; + +struct rtnl_af_ops { + struct list_head list; + int family; + int (*fill_link_af)(struct sk_buff *, const struct net_device *, u32); + size_t (*get_link_af_size)(const struct net_device *, u32); + int (*validate_link_af)(const struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*set_link_af)(struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*fill_stats_af)(struct sk_buff *, const struct net_device *); + size_t (*get_stats_af_size)(const struct net_device *); +}; + +struct rtnl_link { + rtnl_doit_func doit; + rtnl_dumpit_func dumpit; + struct module *owner; + unsigned int flags; + struct callback_head rcu; +}; + +enum { + IF_LINK_MODE_DEFAULT = 0, + IF_LINK_MODE_DORMANT = 1, + IF_LINK_MODE_TESTING = 2, +}; + +enum lw_bits { + LW_URGENT = 0, +}; + +struct seg6_pernet_data { + struct mutex lock; + struct in6_addr *tun_src; + struct rhashtable hmac_infos; +}; + +enum { + BPF_F_RECOMPUTE_CSUM = 1, + BPF_F_INVALIDATE_HASH = 2, +}; + +enum { + BPF_F_HDR_FIELD_MASK = 15, +}; + +enum { + BPF_F_PSEUDO_HDR = 16, + BPF_F_MARK_MANGLED_0 = 32, + BPF_F_MARK_ENFORCE = 64, +}; + +enum { + BPF_F_INGRESS = 1, +}; + +enum { + BPF_F_TUNINFO_IPV6 = 1, +}; + +enum { + BPF_F_ZERO_CSUM_TX = 2, + BPF_F_DONT_FRAGMENT = 4, + BPF_F_SEQ_NUMBER = 8, +}; + +enum { + BPF_CSUM_LEVEL_QUERY = 0, + BPF_CSUM_LEVEL_INC = 1, + BPF_CSUM_LEVEL_DEC = 2, + BPF_CSUM_LEVEL_RESET = 3, +}; + +enum { + BPF_F_ADJ_ROOM_FIXED_GSO = 1, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 2, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 4, + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 8, + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 16, + BPF_F_ADJ_ROOM_NO_CSUM_RESET = 32, + BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 64, +}; + +enum { + BPF_ADJ_ROOM_ENCAP_L2_MASK = 255, + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, +}; + +enum { + BPF_SK_LOOKUP_F_REPLACE = 1, + BPF_SK_LOOKUP_F_NO_REUSEPORT = 2, +}; + +enum bpf_adj_room_mode { + BPF_ADJ_ROOM_NET = 0, + BPF_ADJ_ROOM_MAC = 1, +}; + +enum bpf_hdr_start_off { + BPF_HDR_START_MAC = 0, + BPF_HDR_START_NET = 1, +}; + +enum bpf_lwt_encap_mode { + BPF_LWT_ENCAP_SEG6 = 0, + BPF_LWT_ENCAP_SEG6_INLINE = 1, + BPF_LWT_ENCAP_IP = 2, +}; + +struct bpf_tunnel_key { + __u32 tunnel_id; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; + __u16 tunnel_ext; + __u32 tunnel_label; +}; + +struct bpf_xfrm_state { + __u32 reqid; + __u32 spi; + __u16 family; + __u16 ext; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; +}; + +struct bpf_tcp_sock { + __u32 snd_cwnd; + __u32 srtt_us; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u64 bytes_received; + __u64 bytes_acked; + __u32 dsack_dups; + __u32 delivered; + __u32 delivered_ce; + __u32 icsk_retransmits; +}; + +struct bpf_sock_tuple { + union { + struct { + __be32 saddr; + __be32 daddr; + __be16 sport; + __be16 dport; + } ipv4; + struct { + __be32 saddr[4]; + __be32 daddr[4]; + __be16 sport; + __be16 dport; + } ipv6; + }; +}; + +struct bpf_xdp_sock { + __u32 queue_id; +}; + +enum { + BPF_SOCK_OPS_RTO_CB_FLAG = 1, + BPF_SOCK_OPS_RETRANS_CB_FLAG = 2, + BPF_SOCK_OPS_STATE_CB_FLAG = 4, + BPF_SOCK_OPS_RTT_CB_FLAG = 8, + BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = 16, + BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = 32, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = 64, + BPF_SOCK_OPS_ALL_CB_FLAGS = 127, +}; + +enum { + BPF_SOCK_OPS_VOID = 0, + BPF_SOCK_OPS_TIMEOUT_INIT = 1, + BPF_SOCK_OPS_RWND_INIT = 2, + BPF_SOCK_OPS_TCP_CONNECT_CB = 3, + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 4, + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 5, + BPF_SOCK_OPS_NEEDS_ECN = 6, + BPF_SOCK_OPS_BASE_RTT = 7, + BPF_SOCK_OPS_RTO_CB = 8, + BPF_SOCK_OPS_RETRANS_CB = 9, + BPF_SOCK_OPS_STATE_CB = 10, + BPF_SOCK_OPS_TCP_LISTEN_CB = 11, + BPF_SOCK_OPS_RTT_CB = 12, + BPF_SOCK_OPS_PARSE_HDR_OPT_CB = 13, + BPF_SOCK_OPS_HDR_OPT_LEN_CB = 14, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB = 15, +}; + +enum { + TCP_BPF_IW = 1001, + TCP_BPF_SNDCWND_CLAMP = 1002, + TCP_BPF_DELACK_MAX = 1003, + TCP_BPF_RTO_MIN = 1004, + TCP_BPF_SYN = 1005, + TCP_BPF_SYN_IP = 1006, + TCP_BPF_SYN_MAC = 1007, +}; + +enum { + BPF_LOAD_HDR_OPT_TCP_SYN = 1, +}; + +enum { + BPF_FIB_LOOKUP_DIRECT = 1, + BPF_FIB_LOOKUP_OUTPUT = 2, +}; + +enum { + BPF_FIB_LKUP_RET_SUCCESS = 0, + BPF_FIB_LKUP_RET_BLACKHOLE = 1, + BPF_FIB_LKUP_RET_UNREACHABLE = 2, + BPF_FIB_LKUP_RET_PROHIBIT = 3, + BPF_FIB_LKUP_RET_NOT_FWDED = 4, + BPF_FIB_LKUP_RET_FWD_DISABLED = 5, + BPF_FIB_LKUP_RET_UNSUPP_LWT = 6, + BPF_FIB_LKUP_RET_NO_NEIGH = 7, + BPF_FIB_LKUP_RET_FRAG_NEEDED = 8, +}; + +struct bpf_fib_lookup { + __u8 family; + __u8 l4_protocol; + __be16 sport; + __be16 dport; + union { + __u16 tot_len; + __u16 mtu_result; + }; + __u32 ifindex; + union { + __u8 tos; + __be32 flowinfo; + __u32 rt_metric; + }; + union { + __be32 ipv4_src; + __u32 ipv6_src[4]; + }; + union { + __be32 ipv4_dst; + __u32 ipv6_dst[4]; + }; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __u8 smac[6]; + __u8 dmac[6]; +}; + +struct bpf_redir_neigh { + __u32 nh_family; + union { + __be32 ipv4_nh; + __u32 ipv6_nh[4]; + }; +}; + +enum bpf_check_mtu_flags { + BPF_MTU_CHK_SEGS = 1, +}; + +enum bpf_check_mtu_ret { + BPF_MTU_CHK_RET_SUCCESS = 0, + BPF_MTU_CHK_RET_FRAG_NEEDED = 1, + BPF_MTU_CHK_RET_SEGS_TOOBIG = 2, +}; + +enum rt_scope_t { + RT_SCOPE_UNIVERSE = 0, + RT_SCOPE_SITE = 200, + RT_SCOPE_LINK = 253, + RT_SCOPE_HOST = 254, + RT_SCOPE_NOWHERE = 255, +}; + +enum rt_class_t { + RT_TABLE_UNSPEC = 0, + RT_TABLE_COMPAT = 252, + RT_TABLE_DEFAULT = 253, + RT_TABLE_MAIN = 254, + RT_TABLE_LOCAL = 255, + RT_TABLE_MAX = 4294967295, +}; + +struct nl_info { + struct nlmsghdr *nlh; + struct net *nl_net; + u32 portid; + u8 skip_notify: 1; + u8 skip_notify_kernel: 1; +}; + +struct inet_timewait_sock { + struct sock_common __tw_common; + __u32 tw_mark; + volatile unsigned char tw_substate; + unsigned char tw_rcv_wscale; + __be16 tw_sport; + unsigned int tw_kill: 1; + unsigned int tw_transparent: 1; + unsigned int tw_flowlabel: 20; + unsigned int tw_pad: 2; + unsigned int tw_tos: 8; + u32 tw_txhash; + u32 tw_priority; + struct timer_list tw_timer; + struct inet_bind_bucket *tw_tb; +}; + +struct tcp_timewait_sock { + struct inet_timewait_sock tw_sk; + u32 tw_rcv_wnd; + u32 tw_ts_offset; + u32 tw_ts_recent; + u32 tw_last_oow_ack_time; + int tw_ts_recent_stamp; + u32 tw_tx_delay; + struct tcp_md5sig_key *tw_md5_key; +}; + +struct udp_sock { + struct inet_sock inet; + int pending; + unsigned int corkflag; + __u8 encap_type; + unsigned char no_check6_tx: 1; + unsigned char no_check6_rx: 1; + unsigned char encap_enabled: 1; + unsigned char gro_enabled: 1; + unsigned char accept_udp_l4: 1; + unsigned char accept_udp_fraglist: 1; + __u16 len; + __u16 gso_size; + __u16 pcslen; + __u16 pcrlen; + __u8 pcflag; + __u8 unused[3]; + int (*encap_rcv)(struct sock *, struct sk_buff *); + int (*encap_err_lookup)(struct sock *, struct sk_buff *); + void (*encap_destroy)(struct sock *); + struct sk_buff * (*gro_receive)(struct sock *, struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sock *, struct sk_buff *, int); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sk_buff_head reader_queue; + int forward_deficit; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct udp6_sock { + struct udp_sock udp; + struct ipv6_pinfo inet6; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct tcp6_sock { + struct tcp_sock tcp; + struct ipv6_pinfo inet6; +}; + +struct fib6_result; + +struct fib6_config; + +struct ipv6_stub { + int (*ipv6_sock_mc_join)(struct sock *, int, const struct in6_addr *); + int (*ipv6_sock_mc_drop)(struct sock *, int, const struct in6_addr *); + struct dst_entry * (*ipv6_dst_lookup_flow)(struct net *, const struct sock *, struct flowi6 *, const struct in6_addr *); + int (*ipv6_route_input)(struct sk_buff *); + struct fib6_table * (*fib6_get_table)(struct net *, u32); + int (*fib6_lookup)(struct net *, int, struct flowi6 *, struct fib6_result *, int); + int (*fib6_table_lookup)(struct net *, struct fib6_table *, int, struct flowi6 *, struct fib6_result *, int); + void (*fib6_select_path)(const struct net *, struct fib6_result *, struct flowi6 *, int, bool, const struct sk_buff *, int); + u32 (*ip6_mtu_from_fib6)(const struct fib6_result *, const struct in6_addr *, const struct in6_addr *); + int (*fib6_nh_init)(struct net *, struct fib6_nh *, struct fib6_config *, gfp_t, struct netlink_ext_ack *); + void (*fib6_nh_release)(struct fib6_nh *); + void (*fib6_nh_release_dsts)(struct fib6_nh *); + void (*fib6_update_sernum)(struct net *, struct fib6_info *); + int (*ip6_del_rt)(struct net *, struct fib6_info *, bool); + void (*fib6_rt_update)(struct net *, struct fib6_info *, struct nl_info *); + void (*udpv6_encap_enable)(); + void (*ndisc_send_na)(struct net_device *, const struct in6_addr *, const struct in6_addr *, bool, bool, bool, bool); + void (*xfrm6_local_rxpmtu)(struct sk_buff *, u32); + int (*xfrm6_udp_encap_rcv)(struct sock *, struct sk_buff *); + int (*xfrm6_rcv_encap)(struct sk_buff *, int, __be32, int); + struct neigh_table *nd_tbl; + int (*ipv6_fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + struct net_device * (*ipv6_dev_find)(struct net *, const struct in6_addr *, struct net_device *); +}; + +struct fib6_result { + struct fib6_nh *nh; + struct fib6_info *f6i; + u32 fib6_flags; + u8 fib6_type; + struct rt6_info *rt6; +}; + +struct fib6_config { + u32 fc_table; + u32 fc_metric; + int fc_dst_len; + int fc_src_len; + int fc_ifindex; + u32 fc_flags; + u32 fc_protocol; + u16 fc_type; + u16 fc_delete_all_nh: 1; + u16 fc_ignore_dev_down: 1; + u16 __unused: 14; + u32 fc_nh_id; + struct in6_addr fc_dst; + struct in6_addr fc_src; + struct in6_addr fc_prefsrc; + struct in6_addr fc_gateway; + long unsigned int fc_expires; + struct nlattr *fc_mx; + int fc_mx_len; + int fc_mp_len; + struct nlattr *fc_mp; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; + bool fc_is_fdb; +}; + +struct ipv6_bpf_stub { + int (*inet6_bind)(struct sock *, struct sockaddr *, int, u32); + struct sock * (*udp6_lib_lookup)(struct net *, const struct in6_addr *, __be16, const struct in6_addr *, __be16, int, int, struct udp_table *, struct sk_buff *); +}; + +struct fib_result { + __be32 prefix; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + u32 tclassid; + struct fib_nh_common *nhc; + struct fib_info *fi; + struct fib_table *table; + struct hlist_head *fa_head; +}; + +enum { + INET_ECN_NOT_ECT = 0, + INET_ECN_ECT_1 = 1, + INET_ECN_ECT_0 = 2, + INET_ECN_CE = 3, + INET_ECN_MASK = 3, +}; + +struct tcp_skb_cb { + __u32 seq; + __u32 end_seq; + union { + __u32 tcp_tw_isn; + struct { + u16 tcp_gso_segs; + u16 tcp_gso_size; + }; + }; + __u8 tcp_flags; + __u8 sacked; + __u8 ip_dsfield; + __u8 txstamp_ack: 1; + __u8 eor: 1; + __u8 has_rxtstamp: 1; + __u8 unused: 5; + __u32 ack_seq; + union { + struct { + __u32 is_app_limited: 1; + __u32 delivered_ce: 20; + __u32 unused: 11; + __u32 delivered; + u64 first_tx_mstamp; + u64 delivered_mstamp; + } tx; + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + }; +}; + +struct strp_msg { + int full_len; + int offset; +}; + +struct _strp_msg { + struct strp_msg strp; + int accum_len; +}; + +struct sk_skb_cb { + unsigned char data[20]; + struct _strp_msg strp; + u64 temp_reg; +}; + +struct xdp_umem { + void *addrs; + u64 size; + u32 headroom; + u32 chunk_size; + u32 chunks; + u32 npgs; + struct user_struct *user; + refcount_t users; + u8 flags; + bool zc; + struct page **pgs; + int id; + struct list_head xsk_dma_list; + struct work_struct work; +}; + +struct xsk_queue; + +struct xdp_sock { + struct sock sk; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct xsk_queue *rx; + struct net_device *dev; + struct xdp_umem *umem; + struct list_head flush_node; + struct xsk_buff_pool *pool; + u16 queue_id; + bool zc; + enum { + XSK_READY = 0, + XSK_BOUND = 1, + XSK_UNBOUND = 2, + } state; + long: 64; + struct xsk_queue *tx; + struct list_head tx_list; + spinlock_t rx_lock; + u64 rx_dropped; + u64 rx_queue_full; + struct list_head map_list; + spinlock_t map_list_lock; + struct mutex mutex; + struct xsk_queue *fq_tmp; + struct xsk_queue *cq_tmp; + long: 64; +}; + +struct ipv6_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u8 first_segment; + __u8 flags; + __u16 tag; + struct in6_addr segments[0]; +}; + +enum { + SEG6_LOCAL_ACTION_UNSPEC = 0, + SEG6_LOCAL_ACTION_END = 1, + SEG6_LOCAL_ACTION_END_X = 2, + SEG6_LOCAL_ACTION_END_T = 3, + SEG6_LOCAL_ACTION_END_DX2 = 4, + SEG6_LOCAL_ACTION_END_DX6 = 5, + SEG6_LOCAL_ACTION_END_DX4 = 6, + SEG6_LOCAL_ACTION_END_DT6 = 7, + SEG6_LOCAL_ACTION_END_DT4 = 8, + SEG6_LOCAL_ACTION_END_B6 = 9, + SEG6_LOCAL_ACTION_END_B6_ENCAP = 10, + SEG6_LOCAL_ACTION_END_BM = 11, + SEG6_LOCAL_ACTION_END_S = 12, + SEG6_LOCAL_ACTION_END_AS = 13, + SEG6_LOCAL_ACTION_END_AM = 14, + SEG6_LOCAL_ACTION_END_BPF = 15, + SEG6_LOCAL_ACTION_END_DT46 = 16, + __SEG6_LOCAL_ACTION_MAX = 17, +}; + +struct seg6_bpf_srh_state { + struct ipv6_sr_hdr *srh; + u16 hdrlen; + bool valid; +}; + +struct tls_crypto_info { + __u16 version; + __u16 cipher_type; +}; + +struct tls12_crypto_info_aes_gcm_128 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_aes_gcm_256 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[32]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_chacha20_poly1305 { + struct tls_crypto_info info; + unsigned char iv[12]; + unsigned char key[32]; + unsigned char salt[0]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_gcm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_ccm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls_sw_context_rx { + struct crypto_aead *aead_recv; + struct crypto_wait async_wait; + struct strparser strp; + struct sk_buff_head rx_list; + void (*saved_data_ready)(struct sock *); + struct sk_buff *recv_pkt; + u8 control; + u8 async_capable: 1; + u8 decrypted: 1; + atomic_t decrypt_pending; + spinlock_t decrypt_compl_lock; + bool async_notify; +}; + +struct cipher_context { + char *iv; + char *rec_seq; +}; + +union tls_crypto_context { + struct tls_crypto_info info; + union { + struct tls12_crypto_info_aes_gcm_128 aes_gcm_128; + struct tls12_crypto_info_aes_gcm_256 aes_gcm_256; + struct tls12_crypto_info_chacha20_poly1305 chacha20_poly1305; + struct tls12_crypto_info_sm4_gcm sm4_gcm; + struct tls12_crypto_info_sm4_ccm sm4_ccm; + }; +}; + +struct tls_prot_info { + u16 version; + u16 cipher_type; + u16 prepend_size; + u16 tag_size; + u16 overhead_size; + u16 iv_size; + u16 salt_size; + u16 rec_seq_size; + u16 aad_size; + u16 tail_size; +}; + +struct tls_context { + struct tls_prot_info prot_info; + u8 tx_conf: 3; + u8 rx_conf: 3; + int (*push_pending_record)(struct sock *, int); + void (*sk_write_space)(struct sock *); + void *priv_ctx_tx; + void *priv_ctx_rx; + struct net_device *netdev; + struct cipher_context tx; + struct cipher_context rx; + struct scatterlist *partially_sent_record; + u16 partially_sent_offset; + bool in_tcp_sendpages; + bool pending_open_record_frags; + struct mutex tx_lock; + long unsigned int flags; + struct proto *sk_proto; + struct sock *sk; + void (*sk_destruct)(struct sock *); + union tls_crypto_context crypto_send; + union tls_crypto_context crypto_recv; + struct list_head list; + refcount_t refcount; + struct callback_head rcu; +}; + +typedef u64 (*btf_bpf_skb_get_pay_offset)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_get_nlattr)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_get_nlattr_nest)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_load_helper_8)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_8_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_16)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_16_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_32)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_32_no_cache)(const struct sk_buff *, int); + +struct bpf_scratchpad { + union { + __be32 diff[128]; + u8 buff[512]; + }; +}; + +typedef u64 (*btf_bpf_skb_store_bytes)(struct sk_buff *, u32, const void *, u32, u64); + +typedef u64 (*btf_bpf_skb_load_bytes)(const struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_flow_dissector_load_bytes)(const struct bpf_flow_dissector *, u32, void *, u32); + +typedef u64 (*btf_bpf_skb_load_bytes_relative)(const struct sk_buff *, u32, void *, u32, u32); + +typedef u64 (*btf_bpf_skb_pull_data)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_sk_fullsock)(struct sock *); + +typedef u64 (*btf_sk_skb_pull_data)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_l3_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_l4_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_csum_diff)(__be32 *, u32, __be32 *, u32, __wsum); + +typedef u64 (*btf_bpf_csum_update)(struct sk_buff *, __wsum); + +typedef u64 (*btf_bpf_csum_level)(struct sk_buff *, u64); + +enum { + BPF_F_NEIGH = 2, + BPF_F_PEER = 4, + BPF_F_NEXTHOP = 8, +}; + +typedef u64 (*btf_bpf_clone_redirect)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_redirect)(u32, u64); + +typedef u64 (*btf_bpf_redirect_peer)(u32, u64); + +typedef u64 (*btf_bpf_redirect_neigh)(u32, struct bpf_redir_neigh *, int, u64); + +typedef u64 (*btf_bpf_msg_apply_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_cork_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_pull_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_push_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_pop_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_get_cgroup_classid_curr)(); + +typedef u64 (*btf_bpf_skb_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_route_realm)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_hash_recalc)(struct sk_buff *); + +typedef u64 (*btf_bpf_set_hash_invalid)(struct sk_buff *); + +typedef u64 (*btf_bpf_set_hash)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_skb_vlan_push)(struct sk_buff *, __be16, u16); + +typedef u64 (*btf_bpf_skb_vlan_pop)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_change_proto)(struct sk_buff *, __be16, u64); + +typedef u64 (*btf_bpf_skb_change_type)(struct sk_buff *, u32); + +typedef u64 (*btf_sk_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_bpf_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_bpf_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_xdp_adjust_head)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_adjust_tail)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_adjust_meta)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_redirect)(u32, u64); + +typedef u64 (*btf_bpf_xdp_redirect_map)(struct bpf_map *, u32, u64); + +typedef u64 (*btf_bpf_skb_event_output)(struct sk_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_skb_get_tunnel_key)(struct sk_buff *, struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_get_tunnel_opt)(struct sk_buff *, u8 *, u32); + +typedef u64 (*btf_bpf_skb_set_tunnel_key)(struct sk_buff *, const struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_set_tunnel_opt)(struct sk_buff *, const u8 *, u32); + +typedef u64 (*btf_bpf_skb_under_cgroup)(struct sk_buff *, struct bpf_map *, u32); + +typedef u64 (*btf_bpf_skb_cgroup_id)(const struct sk_buff *); + +typedef u64 (*btf_bpf_skb_ancestor_cgroup_id)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_sk_cgroup_id)(struct sock *); + +typedef u64 (*btf_bpf_sk_ancestor_cgroup_id)(struct sock *, int); + +typedef u64 (*btf_bpf_xdp_event_output)(struct xdp_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_socket_cookie)(struct sk_buff *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_ptr_cookie)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sk_msg)(struct sk_msg *); + +typedef u64 (*btf_bpf_get_socket_uid)(struct sk_buff *); + +typedef u64 (*btf_bpf_sk_setsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sk_getsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_setsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_getsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_setsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_getsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops_kern *, int); + +typedef u64 (*btf_bpf_bind)(struct bpf_sock_addr_kern *, struct sockaddr *, int); + +typedef u64 (*btf_bpf_skb_get_xfrm_state)(struct sk_buff *, u32, struct bpf_xfrm_state *, u32, u64); + +typedef u64 (*btf_bpf_xdp_fib_lookup)(struct xdp_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_skb_fib_lookup)(struct sk_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_skb_check_mtu)(struct sk_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_xdp_check_mtu)(struct xdp_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_lwt_in_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_xmit_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_store_bytes)(struct sk_buff *, u32, const void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_action)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_adjust_srh)(struct sk_buff *, u32, s32); + +typedef u64 (*btf_bpf_skc_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_lookup_udp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_release)(struct sock *); + +typedef u64 (*btf_bpf_xdp_sk_lookup_udp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_skc_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_sk_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_sock_addr_skc_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_udp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_listener_sock)(struct sock *); + +typedef u64 (*btf_bpf_skb_ecn_set_ce)(struct sk_buff *); + +typedef u64 (*btf_bpf_tcp_check_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_gen_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_sk_assign)(struct sk_buff *, struct sock *, u64); + +typedef u64 (*btf_bpf_sock_ops_load_hdr_opt)(struct bpf_sock_ops_kern *, void *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_store_hdr_opt)(struct bpf_sock_ops_kern *, const void *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_reserve_hdr_opt)(struct bpf_sock_ops_kern *, u32, u64); + +typedef u64 (*btf_sk_select_reuseport)(struct sk_reuseport_kern *, struct bpf_map *, void *, u32); + +typedef u64 (*btf_sk_reuseport_load_bytes)(const struct sk_reuseport_kern *, u32, void *, u32); + +typedef u64 (*btf_sk_reuseport_load_bytes_relative)(const struct sk_reuseport_kern *, u32, void *, u32, u32); + +typedef u64 (*btf_bpf_sk_lookup_assign)(struct bpf_sk_lookup_kern *, struct sock *, u64); + +typedef u64 (*btf_bpf_skc_to_tcp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_timewait_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_request_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_udp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_unix_sock)(struct sock *); + +typedef u64 (*btf_bpf_sock_from_file)(struct file *); + +struct bpf_cpu_map_entry___2; + +struct bpf_dtab_netdev___2; + +struct unix_sock___2; + +enum { + INET_DIAG_REQ_NONE = 0, + INET_DIAG_REQ_BYTECODE = 1, + INET_DIAG_REQ_SK_BPF_STORAGES = 2, + INET_DIAG_REQ_PROTOCOL = 3, + __INET_DIAG_REQ_MAX = 4, +}; + +struct sock_diag_req { + __u8 sdiag_family; + __u8 sdiag_protocol; +}; + +struct sock_diag_handler { + __u8 family; + int (*dump)(struct sk_buff *, struct nlmsghdr *); + int (*get_info)(struct sk_buff *, struct sock *); + int (*destroy)(struct sk_buff *, struct nlmsghdr *); +}; + +struct broadcast_sk { + struct sock *sk; + struct work_struct work; +}; + +struct compat_ifconf { + compat_int_t ifc_len; + compat_caddr_t ifcbuf; +}; + +struct fib_notifier_info { + int family; + struct netlink_ext_ack *extack; +}; + +enum fib_event_type { + FIB_EVENT_ENTRY_REPLACE = 0, + FIB_EVENT_ENTRY_APPEND = 1, + FIB_EVENT_ENTRY_ADD = 2, + FIB_EVENT_ENTRY_DEL = 3, + FIB_EVENT_RULE_ADD = 4, + FIB_EVENT_RULE_DEL = 5, + FIB_EVENT_NH_ADD = 6, + FIB_EVENT_NH_DEL = 7, + FIB_EVENT_VIF_ADD = 8, + FIB_EVENT_VIF_DEL = 9, +}; + +struct fib_notifier_net { + struct list_head fib_notifier_ops; + struct atomic_notifier_head fib_chain; +}; + +struct xdp_frame_bulk { + int count; + void *xa; + void *q[16]; +}; + +struct xdp_attachment_info { + struct bpf_prog *prog; + u32 flags; +}; + +struct xdp_buff_xsk; + +struct xsk_buff_pool { + struct device *dev; + struct net_device *netdev; + struct list_head xsk_tx_list; + spinlock_t xsk_tx_list_lock; + refcount_t users; + struct xdp_umem *umem; + struct work_struct work; + struct list_head free_list; + u32 heads_cnt; + u16 queue_id; + long: 16; + long: 64; + long: 64; + long: 64; + struct xsk_queue *fq; + struct xsk_queue *cq; + dma_addr_t *dma_pages; + struct xdp_buff_xsk *heads; + u64 chunk_mask; + u64 addrs_cnt; + u32 free_list_cnt; + u32 dma_pages_cnt; + u32 free_heads_cnt; + u32 headroom; + u32 chunk_size; + u32 chunk_shift; + u32 frame_len; + u8 cached_need_wakeup; + bool uses_need_wakeup; + bool dma_need_sync; + bool unaligned; + void *addrs; + spinlock_t cq_lock; + struct xdp_buff_xsk *free_heads[0]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_buff_xsk { + struct xdp_buff xdp; + dma_addr_t dma; + dma_addr_t frame_dma; + struct xsk_buff_pool *pool; + u64 orig_addr; + struct list_head free_list_node; +}; + +struct flow_match_meta { + struct flow_dissector_key_meta *key; + struct flow_dissector_key_meta *mask; +}; + +struct flow_match_basic { + struct flow_dissector_key_basic *key; + struct flow_dissector_key_basic *mask; +}; + +struct flow_match_control { + struct flow_dissector_key_control *key; + struct flow_dissector_key_control *mask; +}; + +struct flow_match_eth_addrs { + struct flow_dissector_key_eth_addrs *key; + struct flow_dissector_key_eth_addrs *mask; +}; + +struct flow_match_vlan { + struct flow_dissector_key_vlan *key; + struct flow_dissector_key_vlan *mask; +}; + +struct flow_match_ipv4_addrs { + struct flow_dissector_key_ipv4_addrs *key; + struct flow_dissector_key_ipv4_addrs *mask; +}; + +struct flow_match_ipv6_addrs { + struct flow_dissector_key_ipv6_addrs *key; + struct flow_dissector_key_ipv6_addrs *mask; +}; + +struct flow_match_ip { + struct flow_dissector_key_ip *key; + struct flow_dissector_key_ip *mask; +}; + +struct flow_match_ports { + struct flow_dissector_key_ports *key; + struct flow_dissector_key_ports *mask; +}; + +struct flow_match_icmp { + struct flow_dissector_key_icmp *key; + struct flow_dissector_key_icmp *mask; +}; + +struct flow_match_tcp { + struct flow_dissector_key_tcp *key; + struct flow_dissector_key_tcp *mask; +}; + +struct flow_match_mpls { + struct flow_dissector_key_mpls *key; + struct flow_dissector_key_mpls *mask; +}; + +struct flow_match_enc_keyid { + struct flow_dissector_key_keyid *key; + struct flow_dissector_key_keyid *mask; +}; + +struct flow_match_enc_opts { + struct flow_dissector_key_enc_opts *key; + struct flow_dissector_key_enc_opts *mask; +}; + +struct flow_match_ct { + struct flow_dissector_key_ct *key; + struct flow_dissector_key_ct *mask; +}; + +enum flow_block_command { + FLOW_BLOCK_BIND = 0, + FLOW_BLOCK_UNBIND = 1, +}; + +enum flow_block_binder_type { + FLOW_BLOCK_BINDER_TYPE_UNSPEC = 0, + FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS = 1, + FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS = 2, + FLOW_BLOCK_BINDER_TYPE_RED_EARLY_DROP = 3, + FLOW_BLOCK_BINDER_TYPE_RED_MARK = 4, +}; + +struct flow_block_offload { + enum flow_block_command command; + enum flow_block_binder_type binder_type; + bool block_shared; + bool unlocked_driver_cb; + struct net *net; + struct flow_block *block; + struct list_head cb_list; + struct list_head *driver_block_list; + struct netlink_ext_ack *extack; + struct Qdisc *sch; + struct list_head *cb_list_head; +}; + +struct flow_block_cb; + +struct flow_block_indr { + struct list_head list; + struct net_device *dev; + struct Qdisc *sch; + enum flow_block_binder_type binder_type; + void *data; + void *cb_priv; + void (*cleanup)(struct flow_block_cb *); +}; + +struct flow_block_cb { + struct list_head driver_list; + struct list_head list; + flow_setup_cb_t *cb; + void *cb_ident; + void *cb_priv; + void (*release)(void *); + struct flow_block_indr indr; + unsigned int refcnt; +}; + +typedef int flow_indr_block_bind_cb_t(struct net_device *, struct Qdisc *, void *, enum tc_setup_type, void *, void *, void (*)(struct flow_block_cb *)); + +struct flow_indr_dev { + struct list_head list; + flow_indr_block_bind_cb_t *cb; + void *cb_priv; + refcount_t refcnt; +}; + +struct flow_indir_dev_info { + void *data; + struct net_device *dev; + struct Qdisc *sch; + enum tc_setup_type type; + void (*cleanup)(struct flow_block_cb *); + struct list_head list; + enum flow_block_command command; + enum flow_block_binder_type binder_type; + struct list_head *cb_list; +}; + +struct rx_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_rx_queue *, char *); + ssize_t (*store)(struct netdev_rx_queue *, const char *, size_t); +}; + +struct netdev_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_queue *, char *); + ssize_t (*store)(struct netdev_queue *, const char *, size_t); +}; + +struct inet6_ifaddr { + struct in6_addr addr; + __u32 prefix_len; + __u32 rt_priority; + __u32 valid_lft; + __u32 prefered_lft; + refcount_t refcnt; + spinlock_t lock; + int state; + __u32 flags; + __u8 dad_probes; + __u8 stable_privacy_retry; + __u16 scope; + __u64 dad_nonce; + long unsigned int cstamp; + long unsigned int tstamp; + struct delayed_work dad_work; + struct inet6_dev *idev; + struct fib6_info *rt; + struct hlist_node addr_lst; + struct list_head if_list; + struct list_head tmp_list; + struct inet6_ifaddr *ifpub; + int regen_count; + bool tokenized; + struct callback_head rcu; + struct in6_addr peer_addr; +}; + +struct fib_rule_uid_range { + __u32 start; + __u32 end; +}; + +enum { + FRA_UNSPEC = 0, + FRA_DST = 1, + FRA_SRC = 2, + FRA_IIFNAME = 3, + FRA_GOTO = 4, + FRA_UNUSED2 = 5, + FRA_PRIORITY = 6, + FRA_UNUSED3 = 7, + FRA_UNUSED4 = 8, + FRA_UNUSED5 = 9, + FRA_FWMARK = 10, + FRA_FLOW = 11, + FRA_TUN_ID = 12, + FRA_SUPPRESS_IFGROUP = 13, + FRA_SUPPRESS_PREFIXLEN = 14, + FRA_TABLE = 15, + FRA_FWMASK = 16, + FRA_OIFNAME = 17, + FRA_PAD = 18, + FRA_L3MDEV = 19, + FRA_UID_RANGE = 20, + FRA_PROTOCOL = 21, + FRA_IP_PROTO = 22, + FRA_SPORT_RANGE = 23, + FRA_DPORT_RANGE = 24, + __FRA_MAX = 25, +}; + +enum { + FR_ACT_UNSPEC = 0, + FR_ACT_TO_TBL = 1, + FR_ACT_GOTO = 2, + FR_ACT_NOP = 3, + FR_ACT_RES3 = 4, + FR_ACT_RES4 = 5, + FR_ACT_BLACKHOLE = 6, + FR_ACT_UNREACHABLE = 7, + FR_ACT_PROHIBIT = 8, + __FR_ACT_MAX = 9, +}; + +struct fib_rule_notifier_info { + struct fib_notifier_info info; + struct fib_rule *rule; +}; + +struct trace_event_raw_kfree_skb { + struct trace_entry ent; + void *skbaddr; + void *location; + short unsigned int protocol; + char __data[0]; +}; + +struct trace_event_raw_consume_skb { + struct trace_entry ent; + void *skbaddr; + char __data[0]; +}; + +struct trace_event_raw_skb_copy_datagram_iovec { + struct trace_entry ent; + const void *skbaddr; + int len; + char __data[0]; +}; + +struct trace_event_data_offsets_kfree_skb {}; + +struct trace_event_data_offsets_consume_skb {}; + +struct trace_event_data_offsets_skb_copy_datagram_iovec {}; + +typedef void (*btf_trace_kfree_skb)(void *, struct sk_buff *, void *); + +typedef void (*btf_trace_consume_skb)(void *, struct sk_buff *); + +typedef void (*btf_trace_skb_copy_datagram_iovec)(void *, const struct sk_buff *, int); + +struct trace_event_raw_net_dev_start_xmit { + struct trace_entry ent; + u32 __data_loc_name; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + unsigned int len; + unsigned int data_len; + int network_offset; + bool transport_offset_valid; + int transport_offset; + u8 tx_flags; + u16 gso_size; + u16 gso_segs; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + int rc; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit_timeout { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_driver; + int queue_index; + char __data[0]; +}; + +struct trace_event_raw_net_dev_template { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_verbose_template { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int napi_id; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + u32 hash; + bool l4_hash; + unsigned int len; + unsigned int data_len; + unsigned int truesize; + bool mac_header_valid; + int mac_header; + unsigned char nr_frags; + u16 gso_size; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_exit_template { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_net_dev_start_xmit { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_xmit { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_xmit_timeout { + u32 name; + u32 driver; +}; + +struct trace_event_data_offsets_net_dev_template { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_rx_verbose_template { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_rx_exit_template {}; + +typedef void (*btf_trace_net_dev_start_xmit)(void *, const struct sk_buff *, const struct net_device *); + +typedef void (*btf_trace_net_dev_xmit)(void *, struct sk_buff *, int, struct net_device *, unsigned int); + +typedef void (*btf_trace_net_dev_xmit_timeout)(void *, struct net_device *, int); + +typedef void (*btf_trace_net_dev_queue)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_rx)(void *, struct sk_buff *); + +typedef void (*btf_trace_napi_gro_frags_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_receive_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_list_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_rx_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_rx_ni_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_frags_exit)(void *, int); + +typedef void (*btf_trace_napi_gro_receive_exit)(void *, int); + +typedef void (*btf_trace_netif_receive_skb_exit)(void *, int); + +typedef void (*btf_trace_netif_rx_exit)(void *, int); + +typedef void (*btf_trace_netif_rx_ni_exit)(void *, int); + +typedef void (*btf_trace_netif_receive_skb_list_exit)(void *, int); + +struct trace_event_raw_napi_poll { + struct trace_entry ent; + struct napi_struct *napi; + u32 __data_loc_dev_name; + int work; + int budget; + char __data[0]; +}; + +struct trace_event_data_offsets_napi_poll { + u32 dev_name; +}; + +typedef void (*btf_trace_napi_poll)(void *, struct napi_struct *, int, int); + +enum tcp_ca_state { + TCP_CA_Open = 0, + TCP_CA_Disorder = 1, + TCP_CA_CWR = 2, + TCP_CA_Recovery = 3, + TCP_CA_Loss = 4, +}; + +struct trace_event_raw_sock_rcvqueue_full { + struct trace_entry ent; + int rmem_alloc; + unsigned int truesize; + int sk_rcvbuf; + char __data[0]; +}; + +struct trace_event_raw_sock_exceed_buf_limit { + struct trace_entry ent; + char name[32]; + long int *sysctl_mem; + long int allocated; + int sysctl_rmem; + int rmem_alloc; + int sysctl_wmem; + int wmem_alloc; + int wmem_queued; + int kind; + char __data[0]; +}; + +struct trace_event_raw_inet_sock_set_state { + struct trace_entry ent; + const void *skaddr; + int oldstate; + int newstate; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_inet_sk_error_report { + struct trace_entry ent; + int error; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_sock_rcvqueue_full {}; + +struct trace_event_data_offsets_sock_exceed_buf_limit {}; + +struct trace_event_data_offsets_inet_sock_set_state {}; + +struct trace_event_data_offsets_inet_sk_error_report {}; + +typedef void (*btf_trace_sock_rcvqueue_full)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_sock_exceed_buf_limit)(void *, struct sock *, struct proto *, long int, int); + +typedef void (*btf_trace_inet_sock_set_state)(void *, const struct sock *, const int, const int); + +typedef void (*btf_trace_inet_sk_error_report)(void *, const struct sock *); + +struct trace_event_raw_udp_fail_queue_rcv_skb { + struct trace_entry ent; + int rc; + __u16 lport; + char __data[0]; +}; + +struct trace_event_data_offsets_udp_fail_queue_rcv_skb {}; + +typedef void (*btf_trace_udp_fail_queue_rcv_skb)(void *, int, struct sock *); + +struct trace_event_raw_tcp_event_sk_skb { + struct trace_entry ent; + const void *skbaddr; + const void *skaddr; + int state; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_sk { + struct trace_entry ent; + const void *skaddr; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + __u64 sock_cookie; + char __data[0]; +}; + +struct trace_event_raw_tcp_retransmit_synack { + struct trace_entry ent; + const void *skaddr; + const void *req; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_probe { + struct trace_entry ent; + __u8 saddr[28]; + __u8 daddr[28]; + __u16 sport; + __u16 dport; + __u16 family; + __u32 mark; + __u16 data_len; + __u32 snd_nxt; + __u32 snd_una; + __u32 snd_cwnd; + __u32 ssthresh; + __u32 snd_wnd; + __u32 srtt; + __u32 rcv_wnd; + __u64 sock_cookie; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_skb { + struct trace_entry ent; + const void *skbaddr; + __u8 saddr[28]; + __u8 daddr[28]; + char __data[0]; +}; + +struct trace_event_data_offsets_tcp_event_sk_skb {}; + +struct trace_event_data_offsets_tcp_event_sk {}; + +struct trace_event_data_offsets_tcp_retransmit_synack {}; + +struct trace_event_data_offsets_tcp_probe {}; + +struct trace_event_data_offsets_tcp_event_skb {}; + +typedef void (*btf_trace_tcp_retransmit_skb)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_send_reset)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_receive_reset)(void *, struct sock *); + +typedef void (*btf_trace_tcp_destroy_sock)(void *, struct sock *); + +typedef void (*btf_trace_tcp_rcv_space_adjust)(void *, struct sock *); + +typedef void (*btf_trace_tcp_retransmit_synack)(void *, const struct sock *, const struct request_sock *); + +typedef void (*btf_trace_tcp_probe)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_tcp_bad_csum)(void *, const struct sk_buff *); + +struct trace_event_raw_fib_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + u8 proto; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[4]; + __u8 dst[4]; + __u8 gw4[4]; + __u8 gw6[16]; + u16 sport; + u16 dport; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_data_offsets_fib_table_lookup { + u32 name; +}; + +typedef void (*btf_trace_fib_table_lookup)(void *, u32, const struct flowi4 *, const struct fib_nh_common *, int); + +struct trace_event_raw_qdisc_dequeue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + int packets; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + long unsigned int txq_state; + char __data[0]; +}; + +struct trace_event_raw_qdisc_enqueue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + char __data[0]; +}; + +struct trace_event_raw_qdisc_reset { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qdisc_destroy { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qdisc_create { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + char __data[0]; +}; + +struct trace_event_data_offsets_qdisc_dequeue {}; + +struct trace_event_data_offsets_qdisc_enqueue {}; + +struct trace_event_data_offsets_qdisc_reset { + u32 dev; + u32 kind; +}; + +struct trace_event_data_offsets_qdisc_destroy { + u32 dev; + u32 kind; +}; + +struct trace_event_data_offsets_qdisc_create { + u32 dev; + u32 kind; +}; + +typedef void (*btf_trace_qdisc_dequeue)(void *, struct Qdisc *, const struct netdev_queue *, int, struct sk_buff *); + +typedef void (*btf_trace_qdisc_enqueue)(void *, struct Qdisc *, const struct netdev_queue *, struct sk_buff *); + +typedef void (*btf_trace_qdisc_reset)(void *, struct Qdisc *); + +typedef void (*btf_trace_qdisc_destroy)(void *, struct Qdisc *); + +typedef void (*btf_trace_qdisc_create)(void *, const struct Qdisc_ops *, struct net_device *, u32); + +struct bridge_stp_xstats { + __u64 transition_blk; + __u64 transition_fwd; + __u64 rx_bpdu; + __u64 tx_bpdu; + __u64 rx_tcn; + __u64 tx_tcn; +}; + +struct br_mcast_stats { + __u64 igmp_v1queries[2]; + __u64 igmp_v2queries[2]; + __u64 igmp_v3queries[2]; + __u64 igmp_leaves[2]; + __u64 igmp_v1reports[2]; + __u64 igmp_v2reports[2]; + __u64 igmp_v3reports[2]; + __u64 igmp_parse_errors; + __u64 mld_v1queries[2]; + __u64 mld_v2queries[2]; + __u64 mld_leaves[2]; + __u64 mld_v1reports[2]; + __u64 mld_v2reports[2]; + __u64 mld_parse_errors; + __u64 mcast_bytes[2]; + __u64 mcast_packets[2]; +}; + +struct br_ip { + union { + __be32 ip4; + struct in6_addr ip6; + } src; + union { + __be32 ip4; + struct in6_addr ip6; + unsigned char mac_addr[6]; + } dst; + __be16 proto; + __u16 vid; +}; + +struct bridge_id { + unsigned char prio[2]; + unsigned char addr[6]; +}; + +typedef struct bridge_id bridge_id; + +struct mac_addr___2 { + unsigned char addr[6]; +}; + +typedef struct mac_addr___2 mac_addr; + +typedef __u16 port_id; + +struct bridge_mcast_own_query { + struct timer_list timer; + u32 startup_sent; +}; + +struct bridge_mcast_other_query { + struct timer_list timer; + long unsigned int delay_time; +}; + +struct bridge_mcast_querier { + struct br_ip addr; + int port_ifidx; + seqcount_spinlock_t seq; +}; + +struct bridge_mcast_stats { + struct br_mcast_stats mstats; + struct u64_stats_sync syncp; +}; + +struct net_bridge_port; + +struct net_bridge_vlan; + +struct net_bridge_mcast_port { + struct net_bridge_port *port; + struct net_bridge_vlan *vlan; + struct bridge_mcast_own_query ip4_own_query; + struct timer_list ip4_mc_router_timer; + struct hlist_node ip4_rlist; + struct bridge_mcast_own_query ip6_own_query; + struct timer_list ip6_mc_router_timer; + struct hlist_node ip6_rlist; + unsigned char multicast_router; +}; + +struct net_bridge___2; + +struct net_bridge_vlan_group; + +struct net_bridge_port { + struct net_bridge___2 *br; + struct net_device *dev; + struct list_head list; + long unsigned int flags; + struct net_bridge_vlan_group *vlgrp; + struct net_bridge_port *backup_port; + u8 priority; + u8 state; + u16 port_no; + unsigned char topology_change_ack; + unsigned char config_pending; + port_id port_id; + port_id designated_port; + bridge_id designated_root; + bridge_id designated_bridge; + u32 path_cost; + u32 designated_cost; + long unsigned int designated_age; + struct timer_list forward_delay_timer; + struct timer_list hold_timer; + struct timer_list message_age_timer; + struct kobject kobj; + struct callback_head rcu; + struct net_bridge_mcast_port multicast_ctx; + struct bridge_mcast_stats *mcast_stats; + u32 multicast_eht_hosts_limit; + u32 multicast_eht_hosts_cnt; + struct hlist_head mglist; + char sysfs_name[16]; + struct netpoll *np; + int hwdom; + int offload_count; + struct netdev_phys_item_id ppid; + u16 group_fwd_mask; + u16 backup_redirected_cnt; + struct bridge_stp_xstats stp_xstats; +}; + +struct metadata_dst___2; + +struct br_tunnel_info { + __be64 tunnel_id; + struct metadata_dst___2 *tunnel_dst; +}; + +struct net_bridge_mcast { + struct net_bridge___2 *br; + struct net_bridge_vlan *vlan; + u32 multicast_last_member_count; + u32 multicast_startup_query_count; + u8 multicast_querier; + u8 multicast_igmp_version; + u8 multicast_router; + u8 multicast_mld_version; + long unsigned int multicast_last_member_interval; + long unsigned int multicast_membership_interval; + long unsigned int multicast_querier_interval; + long unsigned int multicast_query_interval; + long unsigned int multicast_query_response_interval; + long unsigned int multicast_startup_query_interval; + struct hlist_head ip4_mc_router_list; + struct timer_list ip4_mc_router_timer; + struct bridge_mcast_other_query ip4_other_query; + struct bridge_mcast_own_query ip4_own_query; + struct bridge_mcast_querier ip4_querier; + struct hlist_head ip6_mc_router_list; + struct timer_list ip6_mc_router_timer; + struct bridge_mcast_other_query ip6_other_query; + struct bridge_mcast_own_query ip6_own_query; + struct bridge_mcast_querier ip6_querier; +}; + +struct net_bridge_vlan { + struct rhash_head vnode; + struct rhash_head tnode; + u16 vid; + u16 flags; + u16 priv_flags; + u8 state; + struct pcpu_sw_netstats *stats; + union { + struct net_bridge___2 *br; + struct net_bridge_port *port; + }; + union { + refcount_t refcnt; + struct net_bridge_vlan *brvlan; + }; + struct br_tunnel_info tinfo; + union { + struct net_bridge_mcast br_mcast_ctx; + struct net_bridge_mcast_port port_mcast_ctx; + }; + struct list_head vlist; + struct callback_head rcu; +}; + +struct net_bridge___2 { + spinlock_t lock; + spinlock_t hash_lock; + struct hlist_head frame_type_list; + struct net_device *dev; + long unsigned int options; + __be16 vlan_proto; + u16 default_pvid; + struct net_bridge_vlan_group *vlgrp; + struct rhashtable fdb_hash_tbl; + struct list_head port_list; + union { + struct rtable fake_rtable; + struct rt6_info fake_rt6_info; + }; + u16 group_fwd_mask; + u16 group_fwd_mask_required; + bridge_id designated_root; + bridge_id bridge_id; + unsigned char topology_change; + unsigned char topology_change_detected; + u16 root_port; + long unsigned int max_age; + long unsigned int hello_time; + long unsigned int forward_delay; + long unsigned int ageing_time; + long unsigned int bridge_max_age; + long unsigned int bridge_hello_time; + long unsigned int bridge_forward_delay; + long unsigned int bridge_ageing_time; + u32 root_path_cost; + u8 group_addr[6]; + enum { + BR_NO_STP = 0, + BR_KERNEL_STP = 1, + BR_USER_STP = 2, + } stp_enabled; + struct net_bridge_mcast multicast_ctx; + struct bridge_mcast_stats *mcast_stats; + u32 hash_max; + spinlock_t multicast_lock; + struct rhashtable mdb_hash_tbl; + struct rhashtable sg_port_tbl; + struct hlist_head mcast_gc_list; + struct hlist_head mdb_list; + struct work_struct mcast_gc_work; + struct timer_list hello_timer; + struct timer_list tcn_timer; + struct timer_list topology_change_timer; + struct delayed_work gc_work; + struct kobject *ifobj; + u32 auto_cnt; + int last_hwdom; + long unsigned int busy_hwdoms; + struct hlist_head fdb_list; + struct hlist_head mrp_list; + struct hlist_head mep_list; +}; + +struct net_bridge_vlan_group { + struct rhashtable vlan_hash; + struct rhashtable tunnel_hash; + struct list_head vlan_list; + u16 num_vlans; + u16 pvid; + u8 pvid_state; +}; + +struct net_bridge_fdb_key { + mac_addr addr; + u16 vlan_id; +}; + +struct net_bridge_fdb_entry { + struct rhash_head rhnode; + struct net_bridge_port *dst; + struct net_bridge_fdb_key key; + struct hlist_node fdb_node; + long unsigned int flags; + long: 64; + long: 64; + long unsigned int updated; + long unsigned int used; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct trace_event_raw_br_fdb_add { + struct trace_entry ent; + u8 ndm_flags; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + u16 nlh_flags; + char __data[0]; +}; + +struct trace_event_raw_br_fdb_external_learn_add { + struct trace_entry ent; + u32 __data_loc_br_dev; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + char __data[0]; +}; + +struct trace_event_raw_fdb_delete { + struct trace_entry ent; + u32 __data_loc_br_dev; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + char __data[0]; +}; + +struct trace_event_raw_br_fdb_update { + struct trace_entry ent; + u32 __data_loc_br_dev; + u32 __data_loc_dev; + unsigned char addr[6]; + u16 vid; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_data_offsets_br_fdb_add { + u32 dev; +}; + +struct trace_event_data_offsets_br_fdb_external_learn_add { + u32 br_dev; + u32 dev; +}; + +struct trace_event_data_offsets_fdb_delete { + u32 br_dev; + u32 dev; +}; + +struct trace_event_data_offsets_br_fdb_update { + u32 br_dev; + u32 dev; +}; + +typedef void (*btf_trace_br_fdb_add)(void *, struct ndmsg *, struct net_device *, const unsigned char *, u16, u16); + +typedef void (*btf_trace_br_fdb_external_learn_add)(void *, struct net_bridge___2 *, struct net_bridge_port *, const unsigned char *, u16); + +typedef void (*btf_trace_fdb_delete)(void *, struct net_bridge___2 *, struct net_bridge_fdb_entry *); + +typedef void (*btf_trace_br_fdb_update)(void *, struct net_bridge___2 *, struct net_bridge_port *, const unsigned char *, u16, long unsigned int); + +struct trace_event_raw_page_pool_release { + struct trace_entry ent; + const struct page_pool *pool; + s32 inflight; + u32 hold; + u32 release; + u64 cnt; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_release { + struct trace_entry ent; + const struct page_pool *pool; + const struct page *page; + u32 release; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_hold { + struct trace_entry ent; + const struct page_pool *pool; + const struct page *page; + u32 hold; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_update_nid { + struct trace_entry ent; + const struct page_pool *pool; + int pool_nid; + int new_nid; + char __data[0]; +}; + +struct trace_event_data_offsets_page_pool_release {}; + +struct trace_event_data_offsets_page_pool_state_release {}; + +struct trace_event_data_offsets_page_pool_state_hold {}; + +struct trace_event_data_offsets_page_pool_update_nid {}; + +typedef void (*btf_trace_page_pool_release)(void *, const struct page_pool *, s32, u32, u32); + +typedef void (*btf_trace_page_pool_state_release)(void *, const struct page_pool *, const struct page *, u32); + +typedef void (*btf_trace_page_pool_state_hold)(void *, const struct page_pool *, const struct page *, u32); + +typedef void (*btf_trace_page_pool_update_nid)(void *, const struct page_pool *, int); + +struct trace_event_raw_neigh_create { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + int entries; + u8 created; + u8 gc_exempt; + u8 primary_key4[4]; + u8 primary_key6[16]; + char __data[0]; +}; + +struct trace_event_raw_neigh_update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + long unsigned int confirmed; + long unsigned int updated; + long unsigned int used; + u8 new_lladdr[32]; + u8 new_state; + u32 update_flags; + u32 pid; + char __data[0]; +}; + +struct trace_event_raw_neigh__update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + long unsigned int confirmed; + long unsigned int updated; + long unsigned int used; + u32 err; + char __data[0]; +}; + +struct trace_event_data_offsets_neigh_create { + u32 dev; +}; + +struct trace_event_data_offsets_neigh_update { + u32 dev; +}; + +struct trace_event_data_offsets_neigh__update { + u32 dev; +}; + +typedef void (*btf_trace_neigh_create)(void *, struct neigh_table *, struct net_device *, const void *, const struct neighbour *, bool); + +typedef void (*btf_trace_neigh_update)(void *, struct neighbour *, const u8 *, u8, u32, u32); + +typedef void (*btf_trace_neigh_update_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_timer_handler)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_event_send_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_event_send_dead)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_cleanup_and_release)(void *, struct neighbour *, int); + +struct net_dm_drop_point { + __u8 pc[8]; + __u32 count; +}; + +struct net_dm_alert_msg { + __u32 entries; + struct net_dm_drop_point points[0]; +}; + +enum { + NET_DM_CMD_UNSPEC = 0, + NET_DM_CMD_ALERT = 1, + NET_DM_CMD_CONFIG = 2, + NET_DM_CMD_START = 3, + NET_DM_CMD_STOP = 4, + NET_DM_CMD_PACKET_ALERT = 5, + NET_DM_CMD_CONFIG_GET = 6, + NET_DM_CMD_CONFIG_NEW = 7, + NET_DM_CMD_STATS_GET = 8, + NET_DM_CMD_STATS_NEW = 9, + _NET_DM_CMD_MAX = 10, +}; + +enum net_dm_attr { + NET_DM_ATTR_UNSPEC = 0, + NET_DM_ATTR_ALERT_MODE = 1, + NET_DM_ATTR_PC = 2, + NET_DM_ATTR_SYMBOL = 3, + NET_DM_ATTR_IN_PORT = 4, + NET_DM_ATTR_TIMESTAMP = 5, + NET_DM_ATTR_PROTO = 6, + NET_DM_ATTR_PAYLOAD = 7, + NET_DM_ATTR_PAD = 8, + NET_DM_ATTR_TRUNC_LEN = 9, + NET_DM_ATTR_ORIG_LEN = 10, + NET_DM_ATTR_QUEUE_LEN = 11, + NET_DM_ATTR_STATS = 12, + NET_DM_ATTR_HW_STATS = 13, + NET_DM_ATTR_ORIGIN = 14, + NET_DM_ATTR_HW_TRAP_GROUP_NAME = 15, + NET_DM_ATTR_HW_TRAP_NAME = 16, + NET_DM_ATTR_HW_ENTRIES = 17, + NET_DM_ATTR_HW_ENTRY = 18, + NET_DM_ATTR_HW_TRAP_COUNT = 19, + NET_DM_ATTR_SW_DROPS = 20, + NET_DM_ATTR_HW_DROPS = 21, + NET_DM_ATTR_FLOW_ACTION_COOKIE = 22, + __NET_DM_ATTR_MAX = 23, + NET_DM_ATTR_MAX = 22, +}; + +enum net_dm_alert_mode { + NET_DM_ALERT_MODE_SUMMARY = 0, + NET_DM_ALERT_MODE_PACKET = 1, +}; + +enum { + NET_DM_ATTR_PORT_NETDEV_IFINDEX = 0, + NET_DM_ATTR_PORT_NETDEV_NAME = 1, + __NET_DM_ATTR_PORT_MAX = 2, + NET_DM_ATTR_PORT_MAX = 1, +}; + +enum { + NET_DM_ATTR_STATS_DROPPED = 0, + __NET_DM_ATTR_STATS_MAX = 1, + NET_DM_ATTR_STATS_MAX = 0, +}; + +enum net_dm_origin { + NET_DM_ORIGIN_SW = 0, + NET_DM_ORIGIN_HW = 1, +}; + +enum devlink_trap_type { + DEVLINK_TRAP_TYPE_DROP = 0, + DEVLINK_TRAP_TYPE_EXCEPTION = 1, + DEVLINK_TRAP_TYPE_CONTROL = 2, +}; + +struct devlink_dev_stats { + u32 reload_stats[6]; + u32 remote_reload_stats[6]; +}; + +struct devlink_dpipe_headers; + +struct devlink_ops; + +struct devlink { + u32 index; + struct list_head port_list; + struct list_head rate_list; + struct list_head sb_list; + struct list_head dpipe_table_list; + struct list_head resource_list; + struct list_head param_list; + struct list_head region_list; + struct list_head reporter_list; + struct mutex reporters_lock; + struct devlink_dpipe_headers *dpipe_headers; + struct list_head trap_list; + struct list_head trap_group_list; + struct list_head trap_policer_list; + const struct devlink_ops *ops; + u64 features; + struct xarray snapshot_ids; + struct devlink_dev_stats stats; + struct device *dev; + possible_net_t _net; + struct mutex lock; + u8 reload_failed: 1; + refcount_t refcount; + struct completion comp; + long: 64; + long: 64; + long: 64; + char priv[0]; +}; + +struct devlink_trap_metadata { + const char *trap_name; + const char *trap_group_name; + struct net_device *input_dev; + const struct flow_action_cookie *fa_cookie; + enum devlink_trap_type trap_type; +}; + +struct net_dm_stats { + u64 dropped; + struct u64_stats_sync syncp; +}; + +struct net_dm_hw_entry { + char trap_name[40]; + u32 count; +}; + +struct net_dm_hw_entries { + u32 num_entries; + struct net_dm_hw_entry entries[0]; +}; + +struct per_cpu_dm_data { + spinlock_t lock; + union { + struct sk_buff *skb; + struct net_dm_hw_entries *hw_entries; + }; + struct sk_buff_head drop_queue; + struct work_struct dm_alert_work; + struct timer_list send_timer; + struct net_dm_stats stats; +}; + +struct dm_hw_stat_delta { + struct net_device *dev; + long unsigned int last_rx; + struct list_head list; + struct callback_head rcu; + long unsigned int last_drop_val; +}; + +struct net_dm_alert_ops { + void (*kfree_skb_probe)(void *, struct sk_buff *, void *); + void (*napi_poll_probe)(void *, struct napi_struct *, int, int); + void (*work_item_func)(struct work_struct *); + void (*hw_work_item_func)(struct work_struct *); + void (*hw_trap_probe)(void *, const struct devlink *, struct sk_buff *, const struct devlink_trap_metadata *); +}; + +struct net_dm_skb_cb { + union { + struct devlink_trap_metadata *hw_metadata; + void *pc; + }; +}; + +enum ethtool_test_flags { + ETH_TEST_FL_OFFLINE = 1, + ETH_TEST_FL_FAILED = 2, + ETH_TEST_FL_EXTERNAL_LB = 4, + ETH_TEST_FL_EXTERNAL_LB_DONE = 8, +}; + +struct net_packet_attrs { + const unsigned char *src; + const unsigned char *dst; + u32 ip_src; + u32 ip_dst; + bool tcp; + u16 sport; + u16 dport; + int timeout; + int size; + int max_size; + u8 id; + u16 queue_mapping; +}; + +struct net_test_priv { + struct net_packet_attrs *packet; + struct packet_type pt; + struct completion comp; + int double_vlan; + int vlan_id; + int ok; +}; + +struct netsfhdr { + __be32 version; + __be64 magic; + u8 id; +} __attribute__((packed)); + +struct net_test { + char name[32]; + int (*fn)(struct net_device *); +}; + +struct update_classid_context { + u32 classid; + unsigned int batch; +}; + +struct rtnexthop { + short unsigned int rtnh_len; + unsigned char rtnh_flags; + unsigned char rtnh_hops; + int rtnh_ifindex; +}; + +struct lwtunnel_encap_ops { + int (*build_state)(struct net *, struct nlattr *, unsigned int, const void *, struct lwtunnel_state **, struct netlink_ext_ack *); + void (*destroy_state)(struct lwtunnel_state *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + int (*input)(struct sk_buff *); + int (*fill_encap)(struct sk_buff *, struct lwtunnel_state *); + int (*get_encap_size)(struct lwtunnel_state *); + int (*cmp_encap)(struct lwtunnel_state *, struct lwtunnel_state *); + int (*xmit)(struct sk_buff *); + struct module *owner; +}; + +enum { + LWT_BPF_PROG_UNSPEC = 0, + LWT_BPF_PROG_FD = 1, + LWT_BPF_PROG_NAME = 2, + __LWT_BPF_PROG_MAX = 3, +}; + +enum { + LWT_BPF_UNSPEC = 0, + LWT_BPF_IN = 1, + LWT_BPF_OUT = 2, + LWT_BPF_XMIT = 3, + LWT_BPF_XMIT_HEADROOM = 4, + __LWT_BPF_MAX = 5, +}; + +enum { + LWTUNNEL_XMIT_DONE = 0, + LWTUNNEL_XMIT_CONTINUE = 1, +}; + +struct bpf_lwt_prog { + struct bpf_prog *prog; + char *name; +}; + +struct bpf_lwt { + struct bpf_lwt_prog in; + struct bpf_lwt_prog out; + struct bpf_lwt_prog xmit; + int family; +}; + +struct dst_cache_pcpu { + long unsigned int refresh_ts; + struct dst_entry *dst; + u32 cookie; + union { + struct in_addr in_saddr; + struct in6_addr in6_saddr; + }; +}; + +enum devlink_command { + DEVLINK_CMD_UNSPEC = 0, + DEVLINK_CMD_GET = 1, + DEVLINK_CMD_SET = 2, + DEVLINK_CMD_NEW = 3, + DEVLINK_CMD_DEL = 4, + DEVLINK_CMD_PORT_GET = 5, + DEVLINK_CMD_PORT_SET = 6, + DEVLINK_CMD_PORT_NEW = 7, + DEVLINK_CMD_PORT_DEL = 8, + DEVLINK_CMD_PORT_SPLIT = 9, + DEVLINK_CMD_PORT_UNSPLIT = 10, + DEVLINK_CMD_SB_GET = 11, + DEVLINK_CMD_SB_SET = 12, + DEVLINK_CMD_SB_NEW = 13, + DEVLINK_CMD_SB_DEL = 14, + DEVLINK_CMD_SB_POOL_GET = 15, + DEVLINK_CMD_SB_POOL_SET = 16, + DEVLINK_CMD_SB_POOL_NEW = 17, + DEVLINK_CMD_SB_POOL_DEL = 18, + DEVLINK_CMD_SB_PORT_POOL_GET = 19, + DEVLINK_CMD_SB_PORT_POOL_SET = 20, + DEVLINK_CMD_SB_PORT_POOL_NEW = 21, + DEVLINK_CMD_SB_PORT_POOL_DEL = 22, + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 23, + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 24, + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 25, + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 26, + DEVLINK_CMD_SB_OCC_SNAPSHOT = 27, + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 28, + DEVLINK_CMD_ESWITCH_GET = 29, + DEVLINK_CMD_ESWITCH_SET = 30, + DEVLINK_CMD_DPIPE_TABLE_GET = 31, + DEVLINK_CMD_DPIPE_ENTRIES_GET = 32, + DEVLINK_CMD_DPIPE_HEADERS_GET = 33, + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 34, + DEVLINK_CMD_RESOURCE_SET = 35, + DEVLINK_CMD_RESOURCE_DUMP = 36, + DEVLINK_CMD_RELOAD = 37, + DEVLINK_CMD_PARAM_GET = 38, + DEVLINK_CMD_PARAM_SET = 39, + DEVLINK_CMD_PARAM_NEW = 40, + DEVLINK_CMD_PARAM_DEL = 41, + DEVLINK_CMD_REGION_GET = 42, + DEVLINK_CMD_REGION_SET = 43, + DEVLINK_CMD_REGION_NEW = 44, + DEVLINK_CMD_REGION_DEL = 45, + DEVLINK_CMD_REGION_READ = 46, + DEVLINK_CMD_PORT_PARAM_GET = 47, + DEVLINK_CMD_PORT_PARAM_SET = 48, + DEVLINK_CMD_PORT_PARAM_NEW = 49, + DEVLINK_CMD_PORT_PARAM_DEL = 50, + DEVLINK_CMD_INFO_GET = 51, + DEVLINK_CMD_HEALTH_REPORTER_GET = 52, + DEVLINK_CMD_HEALTH_REPORTER_SET = 53, + DEVLINK_CMD_HEALTH_REPORTER_RECOVER = 54, + DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE = 55, + DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET = 56, + DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR = 57, + DEVLINK_CMD_FLASH_UPDATE = 58, + DEVLINK_CMD_FLASH_UPDATE_END = 59, + DEVLINK_CMD_FLASH_UPDATE_STATUS = 60, + DEVLINK_CMD_TRAP_GET = 61, + DEVLINK_CMD_TRAP_SET = 62, + DEVLINK_CMD_TRAP_NEW = 63, + DEVLINK_CMD_TRAP_DEL = 64, + DEVLINK_CMD_TRAP_GROUP_GET = 65, + DEVLINK_CMD_TRAP_GROUP_SET = 66, + DEVLINK_CMD_TRAP_GROUP_NEW = 67, + DEVLINK_CMD_TRAP_GROUP_DEL = 68, + DEVLINK_CMD_TRAP_POLICER_GET = 69, + DEVLINK_CMD_TRAP_POLICER_SET = 70, + DEVLINK_CMD_TRAP_POLICER_NEW = 71, + DEVLINK_CMD_TRAP_POLICER_DEL = 72, + DEVLINK_CMD_HEALTH_REPORTER_TEST = 73, + DEVLINK_CMD_RATE_GET = 74, + DEVLINK_CMD_RATE_SET = 75, + DEVLINK_CMD_RATE_NEW = 76, + DEVLINK_CMD_RATE_DEL = 77, + __DEVLINK_CMD_MAX = 78, + DEVLINK_CMD_MAX = 77, +}; + +enum devlink_eswitch_mode { + DEVLINK_ESWITCH_MODE_LEGACY = 0, + DEVLINK_ESWITCH_MODE_SWITCHDEV = 1, +}; + +enum devlink_eswitch_encap_mode { + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0, + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1, +}; + +enum { + DEVLINK_ATTR_STATS_RX_PACKETS = 0, + DEVLINK_ATTR_STATS_RX_BYTES = 1, + DEVLINK_ATTR_STATS_RX_DROPPED = 2, + __DEVLINK_ATTR_STATS_MAX = 3, + DEVLINK_ATTR_STATS_MAX = 2, +}; + +enum { + DEVLINK_FLASH_OVERWRITE_SETTINGS_BIT = 0, + DEVLINK_FLASH_OVERWRITE_IDENTIFIERS_BIT = 1, + __DEVLINK_FLASH_OVERWRITE_MAX_BIT = 2, + DEVLINK_FLASH_OVERWRITE_MAX_BIT = 1, +}; + +enum devlink_trap_action { + DEVLINK_TRAP_ACTION_DROP = 0, + DEVLINK_TRAP_ACTION_TRAP = 1, + DEVLINK_TRAP_ACTION_MIRROR = 2, +}; + +enum { + DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT = 0, + DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE = 1, +}; + +enum devlink_reload_action { + DEVLINK_RELOAD_ACTION_UNSPEC = 0, + DEVLINK_RELOAD_ACTION_DRIVER_REINIT = 1, + DEVLINK_RELOAD_ACTION_FW_ACTIVATE = 2, + __DEVLINK_RELOAD_ACTION_MAX = 3, + DEVLINK_RELOAD_ACTION_MAX = 2, +}; + +enum devlink_reload_limit { + DEVLINK_RELOAD_LIMIT_UNSPEC = 0, + DEVLINK_RELOAD_LIMIT_NO_RESET = 1, + __DEVLINK_RELOAD_LIMIT_MAX = 2, + DEVLINK_RELOAD_LIMIT_MAX = 1, +}; + +enum devlink_attr { + DEVLINK_ATTR_UNSPEC = 0, + DEVLINK_ATTR_BUS_NAME = 1, + DEVLINK_ATTR_DEV_NAME = 2, + DEVLINK_ATTR_PORT_INDEX = 3, + DEVLINK_ATTR_PORT_TYPE = 4, + DEVLINK_ATTR_PORT_DESIRED_TYPE = 5, + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 6, + DEVLINK_ATTR_PORT_NETDEV_NAME = 7, + DEVLINK_ATTR_PORT_IBDEV_NAME = 8, + DEVLINK_ATTR_PORT_SPLIT_COUNT = 9, + DEVLINK_ATTR_PORT_SPLIT_GROUP = 10, + DEVLINK_ATTR_SB_INDEX = 11, + DEVLINK_ATTR_SB_SIZE = 12, + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 13, + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 14, + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 15, + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 16, + DEVLINK_ATTR_SB_POOL_INDEX = 17, + DEVLINK_ATTR_SB_POOL_TYPE = 18, + DEVLINK_ATTR_SB_POOL_SIZE = 19, + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 20, + DEVLINK_ATTR_SB_THRESHOLD = 21, + DEVLINK_ATTR_SB_TC_INDEX = 22, + DEVLINK_ATTR_SB_OCC_CUR = 23, + DEVLINK_ATTR_SB_OCC_MAX = 24, + DEVLINK_ATTR_ESWITCH_MODE = 25, + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 26, + DEVLINK_ATTR_DPIPE_TABLES = 27, + DEVLINK_ATTR_DPIPE_TABLE = 28, + DEVLINK_ATTR_DPIPE_TABLE_NAME = 29, + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 30, + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 31, + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 32, + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 33, + DEVLINK_ATTR_DPIPE_ENTRIES = 34, + DEVLINK_ATTR_DPIPE_ENTRY = 35, + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 36, + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 37, + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 38, + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 39, + DEVLINK_ATTR_DPIPE_MATCH = 40, + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 41, + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 42, + DEVLINK_ATTR_DPIPE_ACTION = 43, + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 44, + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 45, + DEVLINK_ATTR_DPIPE_VALUE = 46, + DEVLINK_ATTR_DPIPE_VALUE_MASK = 47, + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 48, + DEVLINK_ATTR_DPIPE_HEADERS = 49, + DEVLINK_ATTR_DPIPE_HEADER = 50, + DEVLINK_ATTR_DPIPE_HEADER_NAME = 51, + DEVLINK_ATTR_DPIPE_HEADER_ID = 52, + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 53, + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 54, + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 55, + DEVLINK_ATTR_DPIPE_FIELD = 56, + DEVLINK_ATTR_DPIPE_FIELD_NAME = 57, + DEVLINK_ATTR_DPIPE_FIELD_ID = 58, + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 59, + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 60, + DEVLINK_ATTR_PAD = 61, + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62, + DEVLINK_ATTR_RESOURCE_LIST = 63, + DEVLINK_ATTR_RESOURCE = 64, + DEVLINK_ATTR_RESOURCE_NAME = 65, + DEVLINK_ATTR_RESOURCE_ID = 66, + DEVLINK_ATTR_RESOURCE_SIZE = 67, + DEVLINK_ATTR_RESOURCE_SIZE_NEW = 68, + DEVLINK_ATTR_RESOURCE_SIZE_VALID = 69, + DEVLINK_ATTR_RESOURCE_SIZE_MIN = 70, + DEVLINK_ATTR_RESOURCE_SIZE_MAX = 71, + DEVLINK_ATTR_RESOURCE_SIZE_GRAN = 72, + DEVLINK_ATTR_RESOURCE_UNIT = 73, + DEVLINK_ATTR_RESOURCE_OCC = 74, + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID = 75, + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS = 76, + DEVLINK_ATTR_PORT_FLAVOUR = 77, + DEVLINK_ATTR_PORT_NUMBER = 78, + DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER = 79, + DEVLINK_ATTR_PARAM = 80, + DEVLINK_ATTR_PARAM_NAME = 81, + DEVLINK_ATTR_PARAM_GENERIC = 82, + DEVLINK_ATTR_PARAM_TYPE = 83, + DEVLINK_ATTR_PARAM_VALUES_LIST = 84, + DEVLINK_ATTR_PARAM_VALUE = 85, + DEVLINK_ATTR_PARAM_VALUE_DATA = 86, + DEVLINK_ATTR_PARAM_VALUE_CMODE = 87, + DEVLINK_ATTR_REGION_NAME = 88, + DEVLINK_ATTR_REGION_SIZE = 89, + DEVLINK_ATTR_REGION_SNAPSHOTS = 90, + DEVLINK_ATTR_REGION_SNAPSHOT = 91, + DEVLINK_ATTR_REGION_SNAPSHOT_ID = 92, + DEVLINK_ATTR_REGION_CHUNKS = 93, + DEVLINK_ATTR_REGION_CHUNK = 94, + DEVLINK_ATTR_REGION_CHUNK_DATA = 95, + DEVLINK_ATTR_REGION_CHUNK_ADDR = 96, + DEVLINK_ATTR_REGION_CHUNK_LEN = 97, + DEVLINK_ATTR_INFO_DRIVER_NAME = 98, + DEVLINK_ATTR_INFO_SERIAL_NUMBER = 99, + DEVLINK_ATTR_INFO_VERSION_FIXED = 100, + DEVLINK_ATTR_INFO_VERSION_RUNNING = 101, + DEVLINK_ATTR_INFO_VERSION_STORED = 102, + DEVLINK_ATTR_INFO_VERSION_NAME = 103, + DEVLINK_ATTR_INFO_VERSION_VALUE = 104, + DEVLINK_ATTR_SB_POOL_CELL_SIZE = 105, + DEVLINK_ATTR_FMSG = 106, + DEVLINK_ATTR_FMSG_OBJ_NEST_START = 107, + DEVLINK_ATTR_FMSG_PAIR_NEST_START = 108, + DEVLINK_ATTR_FMSG_ARR_NEST_START = 109, + DEVLINK_ATTR_FMSG_NEST_END = 110, + DEVLINK_ATTR_FMSG_OBJ_NAME = 111, + DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE = 112, + DEVLINK_ATTR_FMSG_OBJ_VALUE_DATA = 113, + DEVLINK_ATTR_HEALTH_REPORTER = 114, + DEVLINK_ATTR_HEALTH_REPORTER_NAME = 115, + DEVLINK_ATTR_HEALTH_REPORTER_STATE = 116, + DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT = 117, + DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT = 118, + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS = 119, + DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD = 120, + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER = 121, + DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME = 122, + DEVLINK_ATTR_FLASH_UPDATE_COMPONENT = 123, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG = 124, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE = 125, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL = 126, + DEVLINK_ATTR_PORT_PCI_PF_NUMBER = 127, + DEVLINK_ATTR_PORT_PCI_VF_NUMBER = 128, + DEVLINK_ATTR_STATS = 129, + DEVLINK_ATTR_TRAP_NAME = 130, + DEVLINK_ATTR_TRAP_ACTION = 131, + DEVLINK_ATTR_TRAP_TYPE = 132, + DEVLINK_ATTR_TRAP_GENERIC = 133, + DEVLINK_ATTR_TRAP_METADATA = 134, + DEVLINK_ATTR_TRAP_GROUP_NAME = 135, + DEVLINK_ATTR_RELOAD_FAILED = 136, + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS = 137, + DEVLINK_ATTR_NETNS_FD = 138, + DEVLINK_ATTR_NETNS_PID = 139, + DEVLINK_ATTR_NETNS_ID = 140, + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP = 141, + DEVLINK_ATTR_TRAP_POLICER_ID = 142, + DEVLINK_ATTR_TRAP_POLICER_RATE = 143, + DEVLINK_ATTR_TRAP_POLICER_BURST = 144, + DEVLINK_ATTR_PORT_FUNCTION = 145, + DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER = 146, + DEVLINK_ATTR_PORT_LANES = 147, + DEVLINK_ATTR_PORT_SPLITTABLE = 148, + DEVLINK_ATTR_PORT_EXTERNAL = 149, + DEVLINK_ATTR_PORT_CONTROLLER_NUMBER = 150, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT = 151, + DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK = 152, + DEVLINK_ATTR_RELOAD_ACTION = 153, + DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED = 154, + DEVLINK_ATTR_RELOAD_LIMITS = 155, + DEVLINK_ATTR_DEV_STATS = 156, + DEVLINK_ATTR_RELOAD_STATS = 157, + DEVLINK_ATTR_RELOAD_STATS_ENTRY = 158, + DEVLINK_ATTR_RELOAD_STATS_LIMIT = 159, + DEVLINK_ATTR_RELOAD_STATS_VALUE = 160, + DEVLINK_ATTR_REMOTE_RELOAD_STATS = 161, + DEVLINK_ATTR_RELOAD_ACTION_INFO = 162, + DEVLINK_ATTR_RELOAD_ACTION_STATS = 163, + DEVLINK_ATTR_PORT_PCI_SF_NUMBER = 164, + DEVLINK_ATTR_RATE_TYPE = 165, + DEVLINK_ATTR_RATE_TX_SHARE = 166, + DEVLINK_ATTR_RATE_TX_MAX = 167, + DEVLINK_ATTR_RATE_NODE_NAME = 168, + DEVLINK_ATTR_RATE_PARENT_NODE_NAME = 169, + DEVLINK_ATTR_REGION_MAX_SNAPSHOTS = 170, + __DEVLINK_ATTR_MAX = 171, + DEVLINK_ATTR_MAX = 170, +}; + +enum devlink_dpipe_field_mapping_type { + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0, + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 1, +}; + +enum devlink_dpipe_match_type { + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0, +}; + +enum devlink_dpipe_action_type { + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0, +}; + +enum devlink_dpipe_field_ethernet_id { + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0, +}; + +enum devlink_dpipe_field_ipv4_id { + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0, +}; + +enum devlink_dpipe_field_ipv6_id { + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0, +}; + +enum devlink_dpipe_header_id { + DEVLINK_DPIPE_HEADER_ETHERNET = 0, + DEVLINK_DPIPE_HEADER_IPV4 = 1, + DEVLINK_DPIPE_HEADER_IPV6 = 2, +}; + +enum devlink_resource_unit { + DEVLINK_RESOURCE_UNIT_ENTRY = 0, +}; + +enum devlink_port_function_attr { + DEVLINK_PORT_FUNCTION_ATTR_UNSPEC = 0, + DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR = 1, + DEVLINK_PORT_FN_ATTR_STATE = 2, + DEVLINK_PORT_FN_ATTR_OPSTATE = 3, + __DEVLINK_PORT_FUNCTION_ATTR_MAX = 4, + DEVLINK_PORT_FUNCTION_ATTR_MAX = 3, +}; + +enum devlink_port_fn_state { + DEVLINK_PORT_FN_STATE_INACTIVE = 0, + DEVLINK_PORT_FN_STATE_ACTIVE = 1, +}; + +enum devlink_port_fn_opstate { + DEVLINK_PORT_FN_OPSTATE_DETACHED = 0, + DEVLINK_PORT_FN_OPSTATE_ATTACHED = 1, +}; + +struct devlink_port_new_attrs { + enum devlink_port_flavour flavour; + unsigned int port_index; + u32 controller; + u32 sfnum; + u16 pfnum; + u8 port_index_valid: 1; + u8 controller_valid: 1; + u8 sfnum_valid: 1; +}; + +struct devlink_dpipe_field { + const char *name; + unsigned int id; + unsigned int bitwidth; + enum devlink_dpipe_field_mapping_type mapping_type; +}; + +struct devlink_dpipe_header { + const char *name; + unsigned int id; + struct devlink_dpipe_field *fields; + unsigned int fields_count; + bool global; +}; + +struct devlink_dpipe_match { + enum devlink_dpipe_match_type type; + unsigned int header_index; + struct devlink_dpipe_header *header; + unsigned int field_id; +}; + +struct devlink_dpipe_action { + enum devlink_dpipe_action_type type; + unsigned int header_index; + struct devlink_dpipe_header *header; + unsigned int field_id; +}; + +struct devlink_dpipe_value { + union { + struct devlink_dpipe_action *action; + struct devlink_dpipe_match *match; + }; + unsigned int mapping_value; + bool mapping_valid; + unsigned int value_size; + void *value; + void *mask; +}; + +struct devlink_dpipe_entry { + u64 index; + struct devlink_dpipe_value *match_values; + unsigned int match_values_count; + struct devlink_dpipe_value *action_values; + unsigned int action_values_count; + u64 counter; + bool counter_valid; +}; + +struct devlink_dpipe_dump_ctx { + struct genl_info *info; + enum devlink_command cmd; + struct sk_buff *skb; + struct nlattr *nest; + void *hdr; +}; + +struct devlink_dpipe_table_ops; + +struct devlink_dpipe_table { + void *priv; + struct list_head list; + const char *name; + bool counters_enabled; + bool counter_control_extern; + bool resource_valid; + u64 resource_id; + u64 resource_units; + struct devlink_dpipe_table_ops *table_ops; + struct callback_head rcu; +}; + +struct devlink_dpipe_table_ops { + int (*actions_dump)(void *, struct sk_buff *); + int (*matches_dump)(void *, struct sk_buff *); + int (*entries_dump)(void *, bool, struct devlink_dpipe_dump_ctx *); + int (*counters_set_update)(void *, bool); + u64 (*size_get)(void *); +}; + +struct devlink_dpipe_headers { + struct devlink_dpipe_header **headers; + unsigned int headers_count; +}; + +struct devlink_resource_size_params { + u64 size_min; + u64 size_max; + u64 size_granularity; + enum devlink_resource_unit unit; +}; + +typedef u64 devlink_resource_occ_get_t(void *); + +struct devlink_resource { + const char *name; + u64 id; + u64 size; + u64 size_new; + bool size_valid; + struct devlink_resource *parent; + struct devlink_resource_size_params size_params; + struct list_head list; + struct list_head resource_list; + devlink_resource_occ_get_t *occ_get; + void *occ_get_priv; +}; + +enum devlink_param_type { + DEVLINK_PARAM_TYPE_U8 = 0, + DEVLINK_PARAM_TYPE_U16 = 1, + DEVLINK_PARAM_TYPE_U32 = 2, + DEVLINK_PARAM_TYPE_STRING = 3, + DEVLINK_PARAM_TYPE_BOOL = 4, +}; + +struct devlink_flash_notify { + const char *status_msg; + const char *component; + long unsigned int done; + long unsigned int total; + long unsigned int timeout; +}; + +struct devlink_param { + u32 id; + const char *name; + bool generic; + enum devlink_param_type type; + long unsigned int supported_cmodes; + int (*get)(struct devlink *, u32, struct devlink_param_gset_ctx *); + int (*set)(struct devlink *, u32, struct devlink_param_gset_ctx *); + int (*validate)(struct devlink *, u32, union devlink_param_value, struct netlink_ext_ack *); +}; + +struct devlink_param_item { + struct list_head list; + const struct devlink_param *param; + union devlink_param_value driverinit_value; + bool driverinit_value_valid; +}; + +enum devlink_param_generic_id { + DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET = 0, + DEVLINK_PARAM_GENERIC_ID_MAX_MACS = 1, + DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV = 2, + DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT = 3, + DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI = 4, + DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX = 5, + DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN = 6, + DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY = 7, + DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE = 8, + DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE = 9, + DEVLINK_PARAM_GENERIC_ID_ENABLE_REMOTE_DEV_RESET = 10, + DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH = 11, + DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA = 12, + DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET = 13, + __DEVLINK_PARAM_GENERIC_ID_MAX = 14, + DEVLINK_PARAM_GENERIC_ID_MAX = 13, +}; + +struct devlink_flash_update_params { + const struct firmware *fw; + const char *component; + u32 overwrite_mask; +}; + +struct devlink_region_ops { + const char *name; + void (*destructor)(const void *); + int (*snapshot)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u8 **); + void *priv; +}; + +struct devlink_port_region_ops { + const char *name; + void (*destructor)(const void *); + int (*snapshot)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u8 **); + void *priv; +}; + +enum devlink_health_reporter_state { + DEVLINK_HEALTH_REPORTER_STATE_HEALTHY = 0, + DEVLINK_HEALTH_REPORTER_STATE_ERROR = 1, +}; + +struct devlink_health_reporter; + +struct devlink_fmsg; + +struct devlink_health_reporter_ops { + char *name; + int (*recover)(struct devlink_health_reporter *, void *, struct netlink_ext_ack *); + int (*dump)(struct devlink_health_reporter *, struct devlink_fmsg *, void *, struct netlink_ext_ack *); + int (*diagnose)(struct devlink_health_reporter *, struct devlink_fmsg *, struct netlink_ext_ack *); + int (*test)(struct devlink_health_reporter *, struct netlink_ext_ack *); +}; + +struct devlink_health_reporter { + struct list_head list; + void *priv; + const struct devlink_health_reporter_ops *ops; + struct devlink *devlink; + struct devlink_port *devlink_port; + struct devlink_fmsg *dump_fmsg; + struct mutex dump_lock; + u64 graceful_period; + bool auto_recover; + bool auto_dump; + u8 health_state; + u64 dump_ts; + u64 dump_real_ts; + u64 error_count; + u64 recovery_count; + u64 last_recovery_ts; + refcount_t refcount; +}; + +struct devlink_fmsg { + struct list_head item_list; + bool putting_binary; +}; + +struct devlink_trap_policer { + u32 id; + u64 init_rate; + u64 init_burst; + u64 max_rate; + u64 min_rate; + u64 max_burst; + u64 min_burst; +}; + +struct devlink_trap_group { + const char *name; + u16 id; + bool generic; + u32 init_policer_id; +}; + +struct devlink_trap { + enum devlink_trap_type type; + enum devlink_trap_action init_action; + bool generic; + u16 id; + const char *name; + u16 init_group_id; + u32 metadata_cap; +}; + +enum devlink_trap_generic_id { + DEVLINK_TRAP_GENERIC_ID_SMAC_MC = 0, + DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH = 1, + DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER = 2, + DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER = 3, + DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST = 4, + DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER = 5, + DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE = 6, + DEVLINK_TRAP_GENERIC_ID_TTL_ERROR = 7, + DEVLINK_TRAP_GENERIC_ID_TAIL_DROP = 8, + DEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET = 9, + DEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC = 10, + DEVLINK_TRAP_GENERIC_ID_DIP_LB = 11, + DEVLINK_TRAP_GENERIC_ID_SIP_MC = 12, + DEVLINK_TRAP_GENERIC_ID_SIP_LB = 13, + DEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR = 14, + DEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC = 15, + DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE = 16, + DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE = 17, + DEVLINK_TRAP_GENERIC_ID_MTU_ERROR = 18, + DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH = 19, + DEVLINK_TRAP_GENERIC_ID_RPF = 20, + DEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE = 21, + DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS = 22, + DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS = 23, + DEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE = 24, + DEVLINK_TRAP_GENERIC_ID_DECAP_ERROR = 25, + DEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC = 26, + DEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP = 27, + DEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP = 28, + DEVLINK_TRAP_GENERIC_ID_STP = 29, + DEVLINK_TRAP_GENERIC_ID_LACP = 30, + DEVLINK_TRAP_GENERIC_ID_LLDP = 31, + DEVLINK_TRAP_GENERIC_ID_IGMP_QUERY = 32, + DEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT = 33, + DEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT = 34, + DEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT = 35, + DEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE = 36, + DEVLINK_TRAP_GENERIC_ID_MLD_QUERY = 37, + DEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT = 38, + DEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT = 39, + DEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE = 40, + DEVLINK_TRAP_GENERIC_ID_IPV4_DHCP = 41, + DEVLINK_TRAP_GENERIC_ID_IPV6_DHCP = 42, + DEVLINK_TRAP_GENERIC_ID_ARP_REQUEST = 43, + DEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE = 44, + DEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY = 45, + DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT = 46, + DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT = 47, + DEVLINK_TRAP_GENERIC_ID_IPV4_BFD = 48, + DEVLINK_TRAP_GENERIC_ID_IPV6_BFD = 49, + DEVLINK_TRAP_GENERIC_ID_IPV4_OSPF = 50, + DEVLINK_TRAP_GENERIC_ID_IPV6_OSPF = 51, + DEVLINK_TRAP_GENERIC_ID_IPV4_BGP = 52, + DEVLINK_TRAP_GENERIC_ID_IPV6_BGP = 53, + DEVLINK_TRAP_GENERIC_ID_IPV4_VRRP = 54, + DEVLINK_TRAP_GENERIC_ID_IPV6_VRRP = 55, + DEVLINK_TRAP_GENERIC_ID_IPV4_PIM = 56, + DEVLINK_TRAP_GENERIC_ID_IPV6_PIM = 57, + DEVLINK_TRAP_GENERIC_ID_UC_LB = 58, + DEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE = 59, + DEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE = 60, + DEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE = 61, + DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES = 62, + DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS = 63, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT = 64, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT = 65, + DEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT = 66, + DEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT = 67, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT = 68, + DEVLINK_TRAP_GENERIC_ID_PTP_EVENT = 69, + DEVLINK_TRAP_GENERIC_ID_PTP_GENERAL = 70, + DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE = 71, + DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP = 72, + DEVLINK_TRAP_GENERIC_ID_EARLY_DROP = 73, + DEVLINK_TRAP_GENERIC_ID_VXLAN_PARSING = 74, + DEVLINK_TRAP_GENERIC_ID_LLC_SNAP_PARSING = 75, + DEVLINK_TRAP_GENERIC_ID_VLAN_PARSING = 76, + DEVLINK_TRAP_GENERIC_ID_PPPOE_PPP_PARSING = 77, + DEVLINK_TRAP_GENERIC_ID_MPLS_PARSING = 78, + DEVLINK_TRAP_GENERIC_ID_ARP_PARSING = 79, + DEVLINK_TRAP_GENERIC_ID_IP_1_PARSING = 80, + DEVLINK_TRAP_GENERIC_ID_IP_N_PARSING = 81, + DEVLINK_TRAP_GENERIC_ID_GRE_PARSING = 82, + DEVLINK_TRAP_GENERIC_ID_UDP_PARSING = 83, + DEVLINK_TRAP_GENERIC_ID_TCP_PARSING = 84, + DEVLINK_TRAP_GENERIC_ID_IPSEC_PARSING = 85, + DEVLINK_TRAP_GENERIC_ID_SCTP_PARSING = 86, + DEVLINK_TRAP_GENERIC_ID_DCCP_PARSING = 87, + DEVLINK_TRAP_GENERIC_ID_GTP_PARSING = 88, + DEVLINK_TRAP_GENERIC_ID_ESP_PARSING = 89, + DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_NEXTHOP = 90, + DEVLINK_TRAP_GENERIC_ID_DMAC_FILTER = 91, + __DEVLINK_TRAP_GENERIC_ID_MAX = 92, + DEVLINK_TRAP_GENERIC_ID_MAX = 91, +}; + +enum devlink_trap_group_generic_id { + DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS = 0, + DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS = 1, + DEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS = 2, + DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS = 3, + DEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS = 4, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS = 5, + DEVLINK_TRAP_GROUP_GENERIC_ID_STP = 6, + DEVLINK_TRAP_GROUP_GENERIC_ID_LACP = 7, + DEVLINK_TRAP_GROUP_GENERIC_ID_LLDP = 8, + DEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING = 9, + DEVLINK_TRAP_GROUP_GENERIC_ID_DHCP = 10, + DEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY = 11, + DEVLINK_TRAP_GROUP_GENERIC_ID_BFD = 12, + DEVLINK_TRAP_GROUP_GENERIC_ID_OSPF = 13, + DEVLINK_TRAP_GROUP_GENERIC_ID_BGP = 14, + DEVLINK_TRAP_GROUP_GENERIC_ID_VRRP = 15, + DEVLINK_TRAP_GROUP_GENERIC_ID_PIM = 16, + DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB = 17, + DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY = 18, + DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY = 19, + DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6 = 20, + DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT = 21, + DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL = 22, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE = 23, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP = 24, + DEVLINK_TRAP_GROUP_GENERIC_ID_PARSER_ERROR_DROPS = 25, + __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 26, + DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 25, +}; + +enum { + DEVLINK_F_RELOAD = 1, +}; + +struct devlink_info_req___2; + +struct devlink_ops { + u32 supported_flash_update_params; + long unsigned int reload_actions; + long unsigned int reload_limits; + int (*reload_down)(struct devlink *, bool, enum devlink_reload_action, enum devlink_reload_limit, struct netlink_ext_ack *); + int (*reload_up)(struct devlink *, enum devlink_reload_action, enum devlink_reload_limit, u32 *, struct netlink_ext_ack *); + int (*port_type_set)(struct devlink_port *, enum devlink_port_type); + int (*port_split)(struct devlink *, unsigned int, unsigned int, struct netlink_ext_ack *); + int (*port_unsplit)(struct devlink *, unsigned int, struct netlink_ext_ack *); + int (*sb_pool_get)(struct devlink *, unsigned int, u16, struct devlink_sb_pool_info *); + int (*sb_pool_set)(struct devlink *, unsigned int, u16, u32, enum devlink_sb_threshold_type, struct netlink_ext_ack *); + int (*sb_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *); + int (*sb_port_pool_set)(struct devlink_port *, unsigned int, u16, u32, struct netlink_ext_ack *); + int (*sb_tc_pool_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16 *, u32 *); + int (*sb_tc_pool_bind_set)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16, u32, struct netlink_ext_ack *); + int (*sb_occ_snapshot)(struct devlink *, unsigned int); + int (*sb_occ_max_clear)(struct devlink *, unsigned int); + int (*sb_occ_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *, u32 *); + int (*sb_occ_tc_port_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u32 *, u32 *); + int (*eswitch_mode_get)(struct devlink *, u16 *); + int (*eswitch_mode_set)(struct devlink *, u16, struct netlink_ext_ack *); + int (*eswitch_inline_mode_get)(struct devlink *, u8 *); + int (*eswitch_inline_mode_set)(struct devlink *, u8, struct netlink_ext_ack *); + int (*eswitch_encap_mode_get)(struct devlink *, enum devlink_eswitch_encap_mode *); + int (*eswitch_encap_mode_set)(struct devlink *, enum devlink_eswitch_encap_mode, struct netlink_ext_ack *); + int (*info_get)(struct devlink *, struct devlink_info_req___2 *, struct netlink_ext_ack *); + int (*flash_update)(struct devlink *, struct devlink_flash_update_params *, struct netlink_ext_ack *); + int (*trap_init)(struct devlink *, const struct devlink_trap *, void *); + void (*trap_fini)(struct devlink *, const struct devlink_trap *, void *); + int (*trap_action_set)(struct devlink *, const struct devlink_trap *, enum devlink_trap_action, struct netlink_ext_ack *); + int (*trap_group_init)(struct devlink *, const struct devlink_trap_group *); + int (*trap_group_set)(struct devlink *, const struct devlink_trap_group *, const struct devlink_trap_policer *, struct netlink_ext_ack *); + int (*trap_group_action_set)(struct devlink *, const struct devlink_trap_group *, enum devlink_trap_action, struct netlink_ext_ack *); + int (*trap_drop_counter_get)(struct devlink *, const struct devlink_trap *, u64 *); + int (*trap_policer_init)(struct devlink *, const struct devlink_trap_policer *); + void (*trap_policer_fini)(struct devlink *, const struct devlink_trap_policer *); + int (*trap_policer_set)(struct devlink *, const struct devlink_trap_policer *, u64, u64, struct netlink_ext_ack *); + int (*trap_policer_counter_get)(struct devlink *, const struct devlink_trap_policer *, u64 *); + int (*port_function_hw_addr_get)(struct devlink_port *, u8 *, int *, struct netlink_ext_ack *); + int (*port_function_hw_addr_set)(struct devlink_port *, const u8 *, int, struct netlink_ext_ack *); + int (*port_new)(struct devlink *, const struct devlink_port_new_attrs *, struct netlink_ext_ack *, unsigned int *); + int (*port_del)(struct devlink *, unsigned int, struct netlink_ext_ack *); + int (*port_fn_state_get)(struct devlink_port *, enum devlink_port_fn_state *, enum devlink_port_fn_opstate *, struct netlink_ext_ack *); + int (*port_fn_state_set)(struct devlink_port *, enum devlink_port_fn_state, struct netlink_ext_ack *); + int (*rate_leaf_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_leaf_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_node_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_node_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_node_new)(struct devlink_rate *, void **, struct netlink_ext_ack *); + int (*rate_node_del)(struct devlink_rate *, void *, struct netlink_ext_ack *); + int (*rate_leaf_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); + int (*rate_node_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); +}; + +struct devlink_info_req___2 { + struct sk_buff *msg; +}; + +struct trace_event_raw_devlink_hwmsg { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + bool incoming; + long unsigned int type; + u32 __data_loc_buf; + size_t len; + char __data[0]; +}; + +struct trace_event_raw_devlink_hwerr { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + int err; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_report { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_recover_aborted { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + bool health_state; + u64 time_since_last_recover; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_reporter_state_update { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + u8 new_state; + char __data[0]; +}; + +struct trace_event_raw_devlink_trap_report { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_trap_name; + u32 __data_loc_trap_group_name; + u32 __data_loc_input_dev_name; + char __data[0]; +}; + +struct trace_event_data_offsets_devlink_hwmsg { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 buf; +}; + +struct trace_event_data_offsets_devlink_hwerr { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 msg; +}; + +struct trace_event_data_offsets_devlink_health_report { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; + u32 msg; +}; + +struct trace_event_data_offsets_devlink_health_recover_aborted { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; +}; + +struct trace_event_data_offsets_devlink_health_reporter_state_update { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; +}; + +struct trace_event_data_offsets_devlink_trap_report { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 trap_name; + u32 trap_group_name; + u32 input_dev_name; +}; + +typedef void (*btf_trace_devlink_hwmsg)(void *, const struct devlink *, bool, long unsigned int, const u8 *, size_t); + +typedef void (*btf_trace_devlink_hwerr)(void *, const struct devlink *, int, const char *); + +typedef void (*btf_trace_devlink_health_report)(void *, const struct devlink *, const char *, const char *); + +typedef void (*btf_trace_devlink_health_recover_aborted)(void *, const struct devlink *, const char *, bool, u64); + +typedef void (*btf_trace_devlink_health_reporter_state_update)(void *, const struct devlink *, const char *, bool); + +typedef void (*btf_trace_devlink_trap_report)(void *, const struct devlink *, struct sk_buff *, const struct devlink_trap_metadata *); + +struct devlink_sb { + struct list_head list; + unsigned int index; + u32 size; + u16 ingress_pools_count; + u16 egress_pools_count; + u16 ingress_tc_count; + u16 egress_tc_count; +}; + +struct devlink_region { + struct devlink *devlink; + struct devlink_port *port; + struct list_head list; + union { + const struct devlink_region_ops *ops; + const struct devlink_port_region_ops *port_ops; + }; + struct list_head snapshot_list; + u32 max_snapshots; + u32 cur_snapshots; + u64 size; +}; + +struct devlink_snapshot { + struct list_head list; + struct devlink_region *region; + u8 *data; + u32 id; +}; + +enum devlink_multicast_groups { + DEVLINK_MCGRP_CONFIG = 0, +}; + +struct devlink_reload_combination { + enum devlink_reload_action action; + enum devlink_reload_limit limit; +}; + +struct devlink_fmsg_item { + struct list_head list; + int attrtype; + u8 nla_type; + u16 len; + int value[0]; +}; + +struct devlink_stats { + u64 rx_bytes; + u64 rx_packets; + struct u64_stats_sync syncp; +}; + +struct devlink_trap_policer_item { + const struct devlink_trap_policer *policer; + u64 rate; + u64 burst; + struct list_head list; +}; + +struct devlink_trap_group_item { + const struct devlink_trap_group *group; + struct devlink_trap_policer_item *policer_item; + struct list_head list; + struct devlink_stats *stats; +}; + +struct devlink_trap_item { + const struct devlink_trap *trap; + struct devlink_trap_group_item *group_item; + struct list_head list; + enum devlink_trap_action action; + struct devlink_stats *stats; + void *priv; +}; + +struct gro_cell; + +struct gro_cells { + struct gro_cell *cells; +}; + +struct gro_cell { + struct sk_buff_head napi_skbs; + struct napi_struct napi; +}; + +enum __sk_action { + __SK_DROP = 0, + __SK_PASS = 1, + __SK_REDIRECT = 2, + __SK_NONE = 3, +}; + +enum sk_psock_state_bits { + SK_PSOCK_TX_ENABLED = 0, +}; + +struct sk_psock_link { + struct list_head list; + struct bpf_map *map; + void *link_raw; +}; + +struct bpf_stab { + struct bpf_map map; + struct sock **sks; + struct sk_psock_progs progs; + raw_spinlock_t lock; + long: 32; + long: 64; + long: 64; +}; + +typedef u64 (*btf_bpf_sock_map_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sk_redirect_map)(struct sk_buff *, struct bpf_map *, u32, u64); + +typedef u64 (*btf_bpf_msg_redirect_map)(struct sk_msg *, struct bpf_map *, u32, u64); + +struct sock_map_seq_info { + struct bpf_map *map; + struct sock *sk; + u32 index; +}; + +struct bpf_iter__sockmap { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + struct sock *sk; + }; +}; + +struct bpf_shtab_elem { + struct callback_head rcu; + u32 hash; + struct sock *sk; + struct hlist_node node; + u8 key[0]; +}; + +struct bpf_shtab_bucket { + struct hlist_head head; + raw_spinlock_t lock; +}; + +struct bpf_shtab { + struct bpf_map map; + struct bpf_shtab_bucket *buckets; + u32 buckets_num; + u32 elem_size; + struct sk_psock_progs progs; + atomic_t count; + long: 32; + long: 64; +}; + +typedef u64 (*btf_bpf_sock_hash_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sk_redirect_hash)(struct sk_buff *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_msg_redirect_hash)(struct sk_msg *, struct bpf_map *, void *, u64); + +struct sock_hash_seq_info { + struct bpf_map *map; + struct bpf_shtab *htab; + u32 bucket_id; +}; + +enum { + SK_DIAG_BPF_STORAGE_REQ_NONE = 0, + SK_DIAG_BPF_STORAGE_REQ_MAP_FD = 1, + __SK_DIAG_BPF_STORAGE_REQ_MAX = 2, +}; + +enum { + SK_DIAG_BPF_STORAGE_REP_NONE = 0, + SK_DIAG_BPF_STORAGE = 1, + __SK_DIAG_BPF_STORAGE_REP_MAX = 2, +}; + +enum { + SK_DIAG_BPF_STORAGE_NONE = 0, + SK_DIAG_BPF_STORAGE_PAD = 1, + SK_DIAG_BPF_STORAGE_MAP_ID = 2, + SK_DIAG_BPF_STORAGE_MAP_VALUE = 3, + __SK_DIAG_BPF_STORAGE_MAX = 4, +}; + +typedef u64 (*btf_bpf_sk_storage_get)(struct bpf_map *, struct sock *, void *, u64); + +typedef u64 (*btf_bpf_sk_storage_delete)(struct bpf_map *, struct sock *); + +typedef u64 (*btf_bpf_sk_storage_get_tracing)(struct bpf_map *, struct sock *, void *, u64); + +typedef u64 (*btf_bpf_sk_storage_delete_tracing)(struct bpf_map *, struct sock *); + +struct bpf_sk_storage_diag { + u32 nr_maps; + struct bpf_map *maps[0]; +}; + +struct bpf_iter_seq_sk_storage_map_info { + struct bpf_map *map; + unsigned int bucket_id; + unsigned int skip_elems; +}; + +struct bpf_iter__bpf_sk_storage_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + struct sock *sk; + }; + union { + void *value; + }; +}; + +struct nvmem_cell___2; + +struct compat_cmsghdr { + compat_size_t cmsg_len; + compat_int_t cmsg_level; + compat_int_t cmsg_type; +}; + +struct fch_hdr { + __u8 daddr[6]; + __u8 saddr[6]; +}; + +struct fcllc { + __u8 dsap; + __u8 ssap; + __u8 llc; + __u8 protid[3]; + __be16 ethertype; +}; + +struct fddi_8022_1_hdr { + __u8 dsap; + __u8 ssap; + __u8 ctrl; +}; + +struct fddi_8022_2_hdr { + __u8 dsap; + __u8 ssap; + __u8 ctrl_1; + __u8 ctrl_2; +}; + +struct fddi_snap_hdr { + __u8 dsap; + __u8 ssap; + __u8 ctrl; + __u8 oui[3]; + __be16 ethertype; +}; + +struct fddihdr { + __u8 fc; + __u8 daddr[6]; + __u8 saddr[6]; + union { + struct fddi_8022_1_hdr llc_8022_1; + struct fddi_8022_2_hdr llc_8022_2; + struct fddi_snap_hdr llc_snap; + } hdr; +} __attribute__((packed)); + +enum macvlan_mode { + MACVLAN_MODE_PRIVATE = 1, + MACVLAN_MODE_VEPA = 2, + MACVLAN_MODE_BRIDGE = 4, + MACVLAN_MODE_PASSTHRU = 8, + MACVLAN_MODE_SOURCE = 16, +}; + +struct tc_ratespec { + unsigned char cell_log; + __u8 linklayer; + short unsigned int overhead; + short int cell_align; + short unsigned int mpu; + __u32 rate; +}; + +struct tc_prio_qopt { + int bands; + __u8 priomap[16]; +}; + +enum { + TCA_UNSPEC = 0, + TCA_KIND = 1, + TCA_OPTIONS = 2, + TCA_STATS = 3, + TCA_XSTATS = 4, + TCA_RATE = 5, + TCA_FCNT = 6, + TCA_STATS2 = 7, + TCA_STAB = 8, + TCA_PAD = 9, + TCA_DUMP_INVISIBLE = 10, + TCA_CHAIN = 11, + TCA_HW_OFFLOAD = 12, + TCA_INGRESS_BLOCK = 13, + TCA_EGRESS_BLOCK = 14, + TCA_DUMP_FLAGS = 15, + __TCA_MAX = 16, +}; + +struct vlan_pcpu_stats { + u64 rx_packets; + u64 rx_bytes; + u64 rx_multicast; + u64 tx_packets; + u64 tx_bytes; + struct u64_stats_sync syncp; + u32 rx_errors; + u32 tx_dropped; +}; + +struct netpoll___2; + +struct skb_array { + struct ptr_ring ring; +}; + +struct macvlan_port; + +struct macvlan_dev { + struct net_device *dev; + struct list_head list; + struct hlist_node hlist; + struct macvlan_port *port; + struct net_device *lowerdev; + void *accel_priv; + struct vlan_pcpu_stats *pcpu_stats; + long unsigned int mc_filter[4]; + netdev_features_t set_features; + enum macvlan_mode mode; + u16 flags; + unsigned int macaddr_count; + u32 bc_queue_len_req; + struct netpoll___2 *netpoll; +}; + +struct psched_ratecfg { + u64 rate_bytes_ps; + u32 mult; + u16 overhead; + u8 linklayer; + u8 shift; +}; + +struct psched_pktrate { + u64 rate_pkts_ps; + u32 mult; + u8 shift; +}; + +struct mini_Qdisc_pair { + struct mini_Qdisc miniq1; + struct mini_Qdisc miniq2; + struct mini_Qdisc **p_miniq; +}; + +struct pfifo_fast_priv { + struct skb_array q[3]; +}; + +struct tc_qopt_offload_stats { + struct gnet_stats_basic_sync *bstats; + struct gnet_stats_queue *qstats; +}; + +enum tc_mq_command { + TC_MQ_CREATE = 0, + TC_MQ_DESTROY = 1, + TC_MQ_STATS = 2, + TC_MQ_GRAFT = 3, +}; + +struct tc_mq_opt_offload_graft_params { + long unsigned int queue; + u32 child_handle; +}; + +struct tc_mq_qopt_offload { + enum tc_mq_command command; + u32 handle; + union { + struct tc_qopt_offload_stats stats; + struct tc_mq_opt_offload_graft_params graft_params; + }; +}; + +struct mq_sched { + struct Qdisc **qdiscs; +}; + +struct sch_frag_data { + long unsigned int dst; + struct qdisc_skb_cb cb; + __be16 inner_protocol; + u16 vlan_tci; + __be16 vlan_proto; + unsigned int l2_len; + u8 l2_data[18]; + int (*xmit)(struct sk_buff *); +}; + +enum tc_link_layer { + TC_LINKLAYER_UNAWARE = 0, + TC_LINKLAYER_ETHERNET = 1, + TC_LINKLAYER_ATM = 2, +}; + +enum { + TCA_STAB_UNSPEC = 0, + TCA_STAB_BASE = 1, + TCA_STAB_DATA = 2, + __TCA_STAB_MAX = 3, +}; + +struct qdisc_rate_table { + struct tc_ratespec rate; + u32 data[256]; + struct qdisc_rate_table *next; + int refcnt; +}; + +struct Qdisc_class_common { + u32 classid; + struct hlist_node hnode; +}; + +struct Qdisc_class_hash { + struct hlist_head *hash; + unsigned int hashsize; + unsigned int hashmask; + unsigned int hashelems; +}; + +struct qdisc_watchdog { + u64 last_expires; + struct hrtimer timer; + struct Qdisc *qdisc; +}; + +enum tc_root_command { + TC_ROOT_GRAFT = 0, +}; + +struct tc_root_qopt_offload { + enum tc_root_command command; + u32 handle; + bool ingress; +}; + +struct check_loop_arg { + struct qdisc_walker w; + struct Qdisc *p; + int depth; +}; + +struct tcf_bind_args { + struct tcf_walker w; + long unsigned int base; + long unsigned int cl; + u32 classid; +}; + +struct tc_bind_class_args { + struct qdisc_walker w; + long unsigned int new_cl; + u32 portid; + u32 clid; +}; + +struct qdisc_dump_args { + struct qdisc_walker w; + struct sk_buff *skb; + struct netlink_callback *cb; +}; + +enum net_xmit_qdisc_t { + __NET_XMIT_STOLEN = 65536, + __NET_XMIT_BYPASS = 131072, +}; + +enum { + TCA_ACT_UNSPEC = 0, + TCA_ACT_KIND = 1, + TCA_ACT_OPTIONS = 2, + TCA_ACT_INDEX = 3, + TCA_ACT_STATS = 4, + TCA_ACT_PAD = 5, + TCA_ACT_COOKIE = 6, + TCA_ACT_FLAGS = 7, + TCA_ACT_HW_STATS = 8, + TCA_ACT_USED_HW_STATS = 9, + __TCA_ACT_MAX = 10, +}; + +enum tca_id { + TCA_ID_UNSPEC = 0, + TCA_ID_POLICE = 1, + TCA_ID_GACT = 5, + TCA_ID_IPT = 6, + TCA_ID_PEDIT = 7, + TCA_ID_MIRRED = 8, + TCA_ID_NAT = 9, + TCA_ID_XT = 10, + TCA_ID_SKBEDIT = 11, + TCA_ID_VLAN = 12, + TCA_ID_BPF = 13, + TCA_ID_CONNMARK = 14, + TCA_ID_SKBMOD = 15, + TCA_ID_CSUM = 16, + TCA_ID_TUNNEL_KEY = 17, + TCA_ID_SIMP = 22, + TCA_ID_IFE = 25, + TCA_ID_SAMPLE = 26, + TCA_ID_CTINFO = 27, + TCA_ID_MPLS = 28, + TCA_ID_CT = 29, + TCA_ID_GATE = 30, + __TCA_ID_MAX = 255, +}; + +struct tcf_t { + __u64 install; + __u64 lastuse; + __u64 expires; + __u64 firstuse; +}; + +struct psample_group { + struct list_head list; + struct net *net; + u32 group_num; + u32 refcount; + u32 seq; + struct callback_head rcu; +}; + +struct action_gate_entry { + u8 gate_state; + u32 interval; + s32 ipv; + s32 maxoctets; +}; + +enum qdisc_class_ops_flags { + QDISC_CLASS_OPS_DOIT_UNLOCKED = 1, +}; + +enum tcf_proto_ops_flags { + TCF_PROTO_OPS_DOIT_UNLOCKED = 1, +}; + +typedef void tcf_chain_head_change_t(struct tcf_proto *, void *); + +struct tcf_idrinfo { + struct mutex lock; + struct idr action_idr; + struct net *net; +}; + +struct tc_action_ops; + +struct tc_cookie; + +struct tc_action { + const struct tc_action_ops *ops; + __u32 type; + struct tcf_idrinfo *idrinfo; + u32 tcfa_index; + refcount_t tcfa_refcnt; + atomic_t tcfa_bindcnt; + int tcfa_action; + struct tcf_t tcfa_tm; + long: 64; + struct gnet_stats_basic_sync tcfa_bstats; + struct gnet_stats_basic_sync tcfa_bstats_hw; + struct gnet_stats_queue tcfa_qstats; + struct net_rate_estimator *tcfa_rate_est; + spinlock_t tcfa_lock; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_basic_sync *cpu_bstats_hw; + struct gnet_stats_queue *cpu_qstats; + struct tc_cookie *act_cookie; + struct tcf_chain *goto_chain; + u32 tcfa_flags; + u8 hw_stats; + u8 used_hw_stats; + bool used_hw_stats_valid; + long: 8; + long: 64; +}; + +typedef void (*tc_action_priv_destructor)(void *); + +struct tc_action_ops { + struct list_head head; + char kind[16]; + enum tca_id id; + size_t size; + struct module *owner; + int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); + int (*dump)(struct sk_buff *, struct tc_action *, int, int); + void (*cleanup)(struct tc_action *); + int (*lookup)(struct net *, struct tc_action **, u32); + int (*init)(struct net *, struct nlattr *, struct nlattr *, struct tc_action **, struct tcf_proto *, u32, struct netlink_ext_ack *); + int (*walk)(struct net *, struct sk_buff *, struct netlink_callback *, int, const struct tc_action_ops *, struct netlink_ext_ack *); + void (*stats_update)(struct tc_action *, u64, u64, u64, u64, bool); + size_t (*get_fill_size)(const struct tc_action *); + struct net_device * (*get_dev)(const struct tc_action *, tc_action_priv_destructor *); + struct psample_group * (*get_psample_group)(const struct tc_action *, tc_action_priv_destructor *); +}; + +struct tc_cookie { + u8 *data; + u32 len; + struct callback_head rcu; +}; + +struct tcf_block_ext_info { + enum flow_block_binder_type binder_type; + tcf_chain_head_change_t *chain_head_change; + void *chain_head_change_priv; + u32 block_index; +}; + +struct tcf_qevent { + struct tcf_block *block; + struct tcf_block_ext_info info; + struct tcf_proto *filter_chain; +}; + +struct tcf_exts { + __u32 type; + int nr_actions; + struct tc_action **actions; + struct net *net; + int action; + int police; +}; + +enum pedit_header_type { + TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0, + TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1, + TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2, + TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3, + TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4, + TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5, + __PEDIT_HDR_TYPE_MAX = 6, +}; + +enum pedit_cmd { + TCA_PEDIT_KEY_EX_CMD_SET = 0, + TCA_PEDIT_KEY_EX_CMD_ADD = 1, + __PEDIT_CMD_MAX = 2, +}; + +struct tc_pedit_key { + __u32 mask; + __u32 val; + __u32 off; + __u32 at; + __u32 offmask; + __u32 shift; +}; + +struct tcf_pedit_key_ex { + enum pedit_header_type htype; + enum pedit_cmd cmd; +}; + +struct tcf_pedit { + struct tc_action common; + unsigned char tcfp_nkeys; + unsigned char tcfp_flags; + struct tc_pedit_key *tcfp_keys; + struct tcf_pedit_key_ex *tcfp_keys_ex; + long: 64; +}; + +struct tcf_mirred { + struct tc_action common; + int tcfm_eaction; + bool tcfm_mac_header_xmit; + struct net_device *tcfm_dev; + struct list_head tcfm_list; +}; + +struct tcf_vlan_params { + int tcfv_action; + unsigned char tcfv_push_dst[6]; + unsigned char tcfv_push_src[6]; + u16 tcfv_push_vid; + __be16 tcfv_push_proto; + u8 tcfv_push_prio; + bool tcfv_push_prio_exists; + struct callback_head rcu; +}; + +struct tcf_vlan { + struct tc_action common; + struct tcf_vlan_params *vlan_p; + long: 64; +}; + +struct tcf_tunnel_key_params { + struct callback_head rcu; + int tcft_action; + struct metadata_dst *tcft_enc_metadata; +}; + +struct tcf_tunnel_key { + struct tc_action common; + struct tcf_tunnel_key_params *params; + long: 64; +}; + +struct tcf_csum_params { + u32 update_flags; + struct callback_head rcu; +}; + +struct tcf_csum { + struct tc_action common; + struct tcf_csum_params *params; + long: 64; +}; + +struct tcf_gact { + struct tc_action common; + u16 tcfg_ptype; + u16 tcfg_pval; + int tcfg_paction; + atomic_t packets; +}; + +struct tcf_police_params { + int tcfp_result; + u32 tcfp_ewma_rate; + s64 tcfp_burst; + u32 tcfp_mtu; + s64 tcfp_mtu_ptoks; + s64 tcfp_pkt_burst; + struct psched_ratecfg rate; + bool rate_present; + struct psched_ratecfg peak; + bool peak_present; + struct psched_pktrate ppsrate; + bool pps_present; + struct callback_head rcu; +}; + +struct tcf_police { + struct tc_action common; + struct tcf_police_params *params; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t tcfp_lock; + s64 tcfp_toks; + s64 tcfp_ptoks; + s64 tcfp_pkttoks; + s64 tcfp_t_c; + long: 64; + long: 64; + long: 64; +}; + +struct tcf_sample { + struct tc_action common; + u32 rate; + bool truncate; + u32 trunc_size; + struct psample_group *psample_group; + u32 psample_group_num; + struct list_head tcfm_list; +}; + +struct tcf_skbedit_params { + u32 flags; + u32 priority; + u32 mark; + u32 mask; + u16 queue_mapping; + u16 ptype; + struct callback_head rcu; +}; + +struct tcf_skbedit { + struct tc_action common; + struct tcf_skbedit_params *params; + long: 64; +}; + +struct nf_nat_range2 { + unsigned int flags; + union nf_inet_addr min_addr; + union nf_inet_addr max_addr; + union nf_conntrack_man_proto min_proto; + union nf_conntrack_man_proto max_proto; + union nf_conntrack_man_proto base_proto; +}; + +struct tcf_ct_flow_table; + +struct tcf_ct_params { + struct nf_conn *tmpl; + u16 zone; + u32 mark; + u32 mark_mask; + u32 labels[4]; + u32 labels_mask[4]; + struct nf_nat_range2 range; + bool ipv4_range; + u16 ct_action; + struct callback_head rcu; + struct tcf_ct_flow_table *ct_ft; + struct nf_flowtable *nf_ft; +}; + +struct tcf_ct { + struct tc_action common; + struct tcf_ct_params *params; + long: 64; +}; + +struct tcf_mpls_params { + int tcfm_action; + u32 tcfm_label; + u8 tcfm_tc; + u8 tcfm_ttl; + u8 tcfm_bos; + __be16 tcfm_proto; + struct callback_head rcu; +}; + +struct tcf_mpls { + struct tc_action common; + struct tcf_mpls_params *mpls_p; + long: 64; +}; + +struct tcfg_gate_entry { + int index; + u8 gate_state; + u32 interval; + s32 ipv; + s32 maxoctets; + struct list_head list; +}; + +struct tcf_gate_params { + s32 tcfg_priority; + u64 tcfg_basetime; + u64 tcfg_cycletime; + u64 tcfg_cycletime_ext; + u32 tcfg_flags; + s32 tcfg_clockid; + size_t num_entries; + struct list_head entries; +}; + +struct tcf_gate { + struct tc_action common; + struct tcf_gate_params param; + u8 current_gate_status; + ktime_t current_close_time; + u32 current_entry_octets; + s32 current_max_octets; + struct tcfg_gate_entry *next_entry; + struct hrtimer hitimer; + enum tk_offsets tk_offset; + long: 32; + long: 64; +}; + +struct tcf_filter_chain_list_item { + struct list_head list; + tcf_chain_head_change_t *chain_head_change; + void *chain_head_change_priv; +}; + +struct tcf_net { + spinlock_t idr_lock; + struct idr idr; +}; + +struct tcf_block_owner_item { + struct list_head list; + struct Qdisc *q; + enum flow_block_binder_type binder_type; +}; + +struct tcf_chain_info { + struct tcf_proto **pprev; + struct tcf_proto *next; +}; + +struct tcf_dump_args { + struct tcf_walker w; + struct sk_buff *skb; + struct netlink_callback *cb; + struct tcf_block *block; + struct Qdisc *q; + u32 parent; + bool terse_dump; +}; + +struct tcamsg { + unsigned char tca_family; + unsigned char tca__pad1; + short unsigned int tca__pad2; +}; + +enum { + TCA_ROOT_UNSPEC = 0, + TCA_ROOT_TAB = 1, + TCA_ROOT_FLAGS = 2, + TCA_ROOT_COUNT = 3, + TCA_ROOT_TIME_DELTA = 4, + __TCA_ROOT_MAX = 5, +}; + +struct tc_action_net { + struct tcf_idrinfo *idrinfo; + const struct tc_action_ops *ops; +}; + +struct tc_fifo_qopt { + __u32 limit; +}; + +enum tc_fifo_command { + TC_FIFO_REPLACE = 0, + TC_FIFO_DESTROY = 1, + TC_FIFO_STATS = 2, +}; + +struct tc_fifo_qopt_offload { + enum tc_fifo_command command; + u32 handle; + u32 parent; + union { + struct tc_qopt_offload_stats stats; + }; +}; + +struct tcf_ematch_tree_hdr { + __u16 nmatches; + __u16 progid; +}; + +enum { + TCA_EMATCH_TREE_UNSPEC = 0, + TCA_EMATCH_TREE_HDR = 1, + TCA_EMATCH_TREE_LIST = 2, + __TCA_EMATCH_TREE_MAX = 3, +}; + +struct tcf_ematch_hdr { + __u16 matchid; + __u16 kind; + __u16 flags; + __u16 pad; +}; + +struct tcf_pkt_info { + unsigned char *ptr; + int nexthdr; +}; + +struct tcf_ematch_ops; + +struct tcf_ematch { + struct tcf_ematch_ops *ops; + long unsigned int data; + unsigned int datalen; + u16 matchid; + u16 flags; + struct net *net; +}; + +struct tcf_ematch_ops { + int kind; + int datalen; + int (*change)(struct net *, void *, int, struct tcf_ematch *); + int (*match)(struct sk_buff *, struct tcf_ematch *, struct tcf_pkt_info *); + void (*destroy)(struct tcf_ematch *); + int (*dump)(struct sk_buff *, struct tcf_ematch *); + struct module *owner; + struct list_head link; +}; + +struct tcf_ematch_tree { + struct tcf_ematch_tree_hdr hdr; + struct tcf_ematch *matches; +}; + +struct sockaddr_nl { + __kernel_sa_family_t nl_family; + short unsigned int nl_pad; + __u32 nl_pid; + __u32 nl_groups; +}; + +struct nlmsgerr { + int error; + struct nlmsghdr msg; +}; + +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED = 0, + NLMSGERR_ATTR_MSG = 1, + NLMSGERR_ATTR_OFFS = 2, + NLMSGERR_ATTR_COOKIE = 3, + NLMSGERR_ATTR_POLICY = 4, + __NLMSGERR_ATTR_MAX = 5, + NLMSGERR_ATTR_MAX = 4, +}; + +struct nl_pktinfo { + __u32 group; +}; + +enum { + NETLINK_UNCONNECTED = 0, + NETLINK_CONNECTED = 1, +}; + +enum netlink_skb_flags { + NETLINK_SKB_DST = 8, +}; + +struct netlink_notify { + struct net *net; + u32 portid; + int protocol; +}; + +struct netlink_tap { + struct net_device *dev; + struct module *module; + struct list_head list; +}; + +struct trace_event_raw_netlink_extack { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_data_offsets_netlink_extack { + u32 msg; +}; + +typedef void (*btf_trace_netlink_extack)(void *, const char *); + +struct netlink_sock { + struct sock sk; + u32 portid; + u32 dst_portid; + u32 dst_group; + u32 flags; + u32 subscriptions; + u32 ngroups; + long unsigned int *groups; + long unsigned int state; + size_t max_recvmsg_len; + wait_queue_head_t wait; + bool bound; + bool cb_running; + int dump_done_errno; + struct netlink_callback cb; + struct mutex *cb_mutex; + struct mutex cb_def_mutex; + void (*netlink_rcv)(struct sk_buff *); + int (*netlink_bind)(struct net *, int); + void (*netlink_unbind)(struct net *, int); + struct module *module; + struct rhash_head node; + struct callback_head rcu; + struct work_struct work; +}; + +struct listeners; + +struct netlink_table { + struct rhashtable hash; + struct hlist_head mc_list; + struct listeners *listeners; + unsigned int flags; + unsigned int groups; + struct mutex *cb_mutex; + struct module *module; + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); + bool (*compare)(struct net *, struct sock *); + int registered; +}; + +struct listeners { + struct callback_head rcu; + long unsigned int masks[0]; +}; + +struct netlink_tap_net { + struct list_head netlink_tap_all; + struct mutex netlink_tap_lock; +}; + +struct netlink_compare_arg { + possible_net_t pnet; + u32 portid; +}; + +struct netlink_broadcast_data { + struct sock *exclude_sk; + struct net *net; + u32 portid; + u32 group; + int failure; + int delivery_failure; + int congested; + int delivered; + gfp_t allocation; + struct sk_buff *skb; + struct sk_buff *skb2; +}; + +struct netlink_set_err_data { + struct sock *exclude_sk; + u32 portid; + u32 group; + int code; +}; + +struct nl_seq_iter { + struct seq_net_private p; + struct rhashtable_iter hti; + int link; +}; + +struct bpf_iter__netlink { + union { + struct bpf_iter_meta *meta; + }; + union { + struct netlink_sock *sk; + }; +}; + +enum { + CTRL_CMD_UNSPEC = 0, + CTRL_CMD_NEWFAMILY = 1, + CTRL_CMD_DELFAMILY = 2, + CTRL_CMD_GETFAMILY = 3, + CTRL_CMD_NEWOPS = 4, + CTRL_CMD_DELOPS = 5, + CTRL_CMD_GETOPS = 6, + CTRL_CMD_NEWMCAST_GRP = 7, + CTRL_CMD_DELMCAST_GRP = 8, + CTRL_CMD_GETMCAST_GRP = 9, + CTRL_CMD_GETPOLICY = 10, + __CTRL_CMD_MAX = 11, +}; + +enum { + CTRL_ATTR_UNSPEC = 0, + CTRL_ATTR_FAMILY_ID = 1, + CTRL_ATTR_FAMILY_NAME = 2, + CTRL_ATTR_VERSION = 3, + CTRL_ATTR_HDRSIZE = 4, + CTRL_ATTR_MAXATTR = 5, + CTRL_ATTR_OPS = 6, + CTRL_ATTR_MCAST_GROUPS = 7, + CTRL_ATTR_POLICY = 8, + CTRL_ATTR_OP_POLICY = 9, + CTRL_ATTR_OP = 10, + __CTRL_ATTR_MAX = 11, +}; + +enum { + CTRL_ATTR_OP_UNSPEC = 0, + CTRL_ATTR_OP_ID = 1, + CTRL_ATTR_OP_FLAGS = 2, + __CTRL_ATTR_OP_MAX = 3, +}; + +enum { + CTRL_ATTR_MCAST_GRP_UNSPEC = 0, + CTRL_ATTR_MCAST_GRP_NAME = 1, + CTRL_ATTR_MCAST_GRP_ID = 2, + __CTRL_ATTR_MCAST_GRP_MAX = 3, +}; + +enum { + CTRL_ATTR_POLICY_UNSPEC = 0, + CTRL_ATTR_POLICY_DO = 1, + CTRL_ATTR_POLICY_DUMP = 2, + __CTRL_ATTR_POLICY_DUMP_MAX = 3, + CTRL_ATTR_POLICY_DUMP_MAX = 2, +}; + +struct genl_start_context { + const struct genl_family *family; + struct nlmsghdr *nlh; + struct netlink_ext_ack *extack; + const struct genl_ops *ops; + int hdrlen; +}; + +struct netlink_policy_dump_state; + +struct ctrl_dump_policy_ctx { + struct netlink_policy_dump_state *state; + const struct genl_family *rt; + unsigned int opidx; + u32 op; + u16 fam_id; + u8 policies: 1; + u8 single_op: 1; +}; + +enum netlink_attribute_type { + NL_ATTR_TYPE_INVALID = 0, + NL_ATTR_TYPE_FLAG = 1, + NL_ATTR_TYPE_U8 = 2, + NL_ATTR_TYPE_U16 = 3, + NL_ATTR_TYPE_U32 = 4, + NL_ATTR_TYPE_U64 = 5, + NL_ATTR_TYPE_S8 = 6, + NL_ATTR_TYPE_S16 = 7, + NL_ATTR_TYPE_S32 = 8, + NL_ATTR_TYPE_S64 = 9, + NL_ATTR_TYPE_BINARY = 10, + NL_ATTR_TYPE_STRING = 11, + NL_ATTR_TYPE_NUL_STRING = 12, + NL_ATTR_TYPE_NESTED = 13, + NL_ATTR_TYPE_NESTED_ARRAY = 14, + NL_ATTR_TYPE_BITFIELD32 = 15, +}; + +enum netlink_policy_type_attr { + NL_POLICY_TYPE_ATTR_UNSPEC = 0, + NL_POLICY_TYPE_ATTR_TYPE = 1, + NL_POLICY_TYPE_ATTR_MIN_VALUE_S = 2, + NL_POLICY_TYPE_ATTR_MAX_VALUE_S = 3, + NL_POLICY_TYPE_ATTR_MIN_VALUE_U = 4, + NL_POLICY_TYPE_ATTR_MAX_VALUE_U = 5, + NL_POLICY_TYPE_ATTR_MIN_LENGTH = 6, + NL_POLICY_TYPE_ATTR_MAX_LENGTH = 7, + NL_POLICY_TYPE_ATTR_POLICY_IDX = 8, + NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 9, + NL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 10, + NL_POLICY_TYPE_ATTR_PAD = 11, + NL_POLICY_TYPE_ATTR_MASK = 12, + __NL_POLICY_TYPE_ATTR_MAX = 13, + NL_POLICY_TYPE_ATTR_MAX = 12, +}; + +struct netlink_policy_dump_state___2 { + unsigned int policy_idx; + unsigned int attr_idx; + unsigned int n_alloc; + struct { + const struct nla_policy *policy; + unsigned int maxtype; + } policies[0]; +}; + +struct trace_event_raw_bpf_test_finish { + struct trace_entry ent; + int err; + char __data[0]; +}; + +struct trace_event_data_offsets_bpf_test_finish {}; + +typedef void (*btf_trace_bpf_test_finish)(void *, int *); + +struct bpf_test_timer { + enum { + NO_PREEMPT = 0, + NO_MIGRATE = 1, + } mode; + u32 i; + u64 time_start; + u64 time_spent; +}; + +struct bpf_fentry_test_t { + struct bpf_fentry_test_t *a; +}; + +struct bpf_raw_tp_test_run_info { + struct bpf_prog *prog; + void *ctx; + u32 retval; +}; + +typedef int (*dummy_ops_test_ret_fn)(struct bpf_dummy_ops_state *, ...); + +struct bpf_dummy_ops_test_args { + u64 args[12]; + struct bpf_dummy_ops_state state; +}; + +struct ethtool_value { + __u32 cmd; + __u32 data; +}; + +enum tunable_type_id { + ETHTOOL_TUNABLE_UNSPEC = 0, + ETHTOOL_TUNABLE_U8 = 1, + ETHTOOL_TUNABLE_U16 = 2, + ETHTOOL_TUNABLE_U32 = 3, + ETHTOOL_TUNABLE_U64 = 4, + ETHTOOL_TUNABLE_STRING = 5, + ETHTOOL_TUNABLE_S8 = 6, + ETHTOOL_TUNABLE_S16 = 7, + ETHTOOL_TUNABLE_S32 = 8, + ETHTOOL_TUNABLE_S64 = 9, +}; + +enum phy_tunable_id { + ETHTOOL_PHY_ID_UNSPEC = 0, + ETHTOOL_PHY_DOWNSHIFT = 1, + ETHTOOL_PHY_FAST_LINK_DOWN = 2, + ETHTOOL_PHY_EDPD = 3, + __ETHTOOL_PHY_TUNABLE_COUNT = 4, +}; + +struct ethtool_gstrings { + __u32 cmd; + __u32 string_set; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_sset_info { + __u32 cmd; + __u32 reserved; + __u64 sset_mask; + __u32 data[0]; +}; + +struct ethtool_perm_addr { + __u32 cmd; + __u32 size; + __u8 data[0]; +}; + +enum ethtool_flags { + ETH_FLAG_TXVLAN = 128, + ETH_FLAG_RXVLAN = 256, + ETH_FLAG_LRO = 32768, + ETH_FLAG_NTUPLE = 134217728, + ETH_FLAG_RXHASH = 268435456, +}; + +struct ethtool_rxfh { + __u32 cmd; + __u32 rss_context; + __u32 indir_size; + __u32 key_size; + __u8 hfunc; + __u8 rsvd8[3]; + __u32 rsvd32; + __u32 rss_config[0]; +}; + +struct ethtool_get_features_block { + __u32 available; + __u32 requested; + __u32 active; + __u32 never_changed; +}; + +struct ethtool_gfeatures { + __u32 cmd; + __u32 size; + struct ethtool_get_features_block features[0]; +}; + +struct ethtool_set_features_block { + __u32 valid; + __u32 requested; +}; + +struct ethtool_sfeatures { + __u32 cmd; + __u32 size; + struct ethtool_set_features_block features[0]; +}; + +enum ethtool_sfeatures_retval_bits { + ETHTOOL_F_UNSUPPORTED__BIT = 0, + ETHTOOL_F_WISH__BIT = 1, + ETHTOOL_F_COMPAT__BIT = 2, +}; + +struct ethtool_per_queue_op { + __u32 cmd; + __u32 sub_command; + __u32 queue_mask[128]; + char data[0]; +}; + +enum ethtool_fec_config_bits { + ETHTOOL_FEC_NONE_BIT = 0, + ETHTOOL_FEC_AUTO_BIT = 1, + ETHTOOL_FEC_OFF_BIT = 2, + ETHTOOL_FEC_RS_BIT = 3, + ETHTOOL_FEC_BASER_BIT = 4, + ETHTOOL_FEC_LLRS_BIT = 5, +}; + +enum { + ETH_RSS_HASH_TOP_BIT = 0, + ETH_RSS_HASH_XOR_BIT = 1, + ETH_RSS_HASH_CRC32_BIT = 2, + ETH_RSS_HASH_FUNCS_COUNT = 3, +}; + +struct ethtool_rx_flow_rule { + struct flow_rule *rule; + long unsigned int priv[0]; +}; + +struct ethtool_rx_flow_spec_input { + const struct ethtool_rx_flow_spec *fs; + u32 rss_ctx; +}; + +struct ethtool_devlink_compat { + struct devlink *devlink; + union { + struct ethtool_flash efl; + struct ethtool_drvinfo info; + }; +}; + +struct ethtool_link_usettings { + struct ethtool_link_settings base; + struct { + __u32 supported[3]; + __u32 advertising[3]; + __u32 lp_advertising[3]; + } link_modes; +}; + +struct ethtool_rx_flow_key { + struct flow_dissector_key_basic basic; + union { + struct flow_dissector_key_ipv4_addrs ipv4; + struct flow_dissector_key_ipv6_addrs ipv6; + }; + struct flow_dissector_key_ports tp; + struct flow_dissector_key_ip ip; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_eth_addrs eth_addrs; + long: 48; +}; + +struct ethtool_rx_flow_match { + struct flow_dissector dissector; + int: 32; + struct ethtool_rx_flow_key key; + struct ethtool_rx_flow_key mask; +}; + +enum { + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN = 0, + ETHTOOL_UDP_TUNNEL_TYPE_GENEVE = 1, + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = 2, + __ETHTOOL_UDP_TUNNEL_TYPE_CNT = 3, +}; + +struct link_mode_info { + int speed; + u8 lanes; + u8 duplex; +}; + +enum { + ETHTOOL_MSG_USER_NONE = 0, + ETHTOOL_MSG_STRSET_GET = 1, + ETHTOOL_MSG_LINKINFO_GET = 2, + ETHTOOL_MSG_LINKINFO_SET = 3, + ETHTOOL_MSG_LINKMODES_GET = 4, + ETHTOOL_MSG_LINKMODES_SET = 5, + ETHTOOL_MSG_LINKSTATE_GET = 6, + ETHTOOL_MSG_DEBUG_GET = 7, + ETHTOOL_MSG_DEBUG_SET = 8, + ETHTOOL_MSG_WOL_GET = 9, + ETHTOOL_MSG_WOL_SET = 10, + ETHTOOL_MSG_FEATURES_GET = 11, + ETHTOOL_MSG_FEATURES_SET = 12, + ETHTOOL_MSG_PRIVFLAGS_GET = 13, + ETHTOOL_MSG_PRIVFLAGS_SET = 14, + ETHTOOL_MSG_RINGS_GET = 15, + ETHTOOL_MSG_RINGS_SET = 16, + ETHTOOL_MSG_CHANNELS_GET = 17, + ETHTOOL_MSG_CHANNELS_SET = 18, + ETHTOOL_MSG_COALESCE_GET = 19, + ETHTOOL_MSG_COALESCE_SET = 20, + ETHTOOL_MSG_PAUSE_GET = 21, + ETHTOOL_MSG_PAUSE_SET = 22, + ETHTOOL_MSG_EEE_GET = 23, + ETHTOOL_MSG_EEE_SET = 24, + ETHTOOL_MSG_TSINFO_GET = 25, + ETHTOOL_MSG_CABLE_TEST_ACT = 26, + ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 27, + ETHTOOL_MSG_TUNNEL_INFO_GET = 28, + ETHTOOL_MSG_FEC_GET = 29, + ETHTOOL_MSG_FEC_SET = 30, + ETHTOOL_MSG_MODULE_EEPROM_GET = 31, + ETHTOOL_MSG_STATS_GET = 32, + ETHTOOL_MSG_PHC_VCLOCKS_GET = 33, + ETHTOOL_MSG_MODULE_GET = 34, + ETHTOOL_MSG_MODULE_SET = 35, + __ETHTOOL_MSG_USER_CNT = 36, + ETHTOOL_MSG_USER_MAX = 35, +}; + +enum { + ETHTOOL_A_HEADER_UNSPEC = 0, + ETHTOOL_A_HEADER_DEV_INDEX = 1, + ETHTOOL_A_HEADER_DEV_NAME = 2, + ETHTOOL_A_HEADER_FLAGS = 3, + __ETHTOOL_A_HEADER_CNT = 4, + ETHTOOL_A_HEADER_MAX = 3, +}; + +enum { + ETHTOOL_A_STRSET_UNSPEC = 0, + ETHTOOL_A_STRSET_HEADER = 1, + ETHTOOL_A_STRSET_STRINGSETS = 2, + ETHTOOL_A_STRSET_COUNTS_ONLY = 3, + __ETHTOOL_A_STRSET_CNT = 4, + ETHTOOL_A_STRSET_MAX = 3, +}; + +enum { + ETHTOOL_A_LINKINFO_UNSPEC = 0, + ETHTOOL_A_LINKINFO_HEADER = 1, + ETHTOOL_A_LINKINFO_PORT = 2, + ETHTOOL_A_LINKINFO_PHYADDR = 3, + ETHTOOL_A_LINKINFO_TP_MDIX = 4, + ETHTOOL_A_LINKINFO_TP_MDIX_CTRL = 5, + ETHTOOL_A_LINKINFO_TRANSCEIVER = 6, + __ETHTOOL_A_LINKINFO_CNT = 7, + ETHTOOL_A_LINKINFO_MAX = 6, +}; + +enum { + ETHTOOL_A_LINKMODES_UNSPEC = 0, + ETHTOOL_A_LINKMODES_HEADER = 1, + ETHTOOL_A_LINKMODES_AUTONEG = 2, + ETHTOOL_A_LINKMODES_OURS = 3, + ETHTOOL_A_LINKMODES_PEER = 4, + ETHTOOL_A_LINKMODES_SPEED = 5, + ETHTOOL_A_LINKMODES_DUPLEX = 6, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = 7, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = 8, + ETHTOOL_A_LINKMODES_LANES = 9, + __ETHTOOL_A_LINKMODES_CNT = 10, + ETHTOOL_A_LINKMODES_MAX = 9, +}; + +enum { + ETHTOOL_A_LINKSTATE_UNSPEC = 0, + ETHTOOL_A_LINKSTATE_HEADER = 1, + ETHTOOL_A_LINKSTATE_LINK = 2, + ETHTOOL_A_LINKSTATE_SQI = 3, + ETHTOOL_A_LINKSTATE_SQI_MAX = 4, + ETHTOOL_A_LINKSTATE_EXT_STATE = 5, + ETHTOOL_A_LINKSTATE_EXT_SUBSTATE = 6, + __ETHTOOL_A_LINKSTATE_CNT = 7, + ETHTOOL_A_LINKSTATE_MAX = 6, +}; + +enum { + ETHTOOL_A_DEBUG_UNSPEC = 0, + ETHTOOL_A_DEBUG_HEADER = 1, + ETHTOOL_A_DEBUG_MSGMASK = 2, + __ETHTOOL_A_DEBUG_CNT = 3, + ETHTOOL_A_DEBUG_MAX = 2, +}; + +enum { + ETHTOOL_A_WOL_UNSPEC = 0, + ETHTOOL_A_WOL_HEADER = 1, + ETHTOOL_A_WOL_MODES = 2, + ETHTOOL_A_WOL_SOPASS = 3, + __ETHTOOL_A_WOL_CNT = 4, + ETHTOOL_A_WOL_MAX = 3, +}; + +enum { + ETHTOOL_A_FEATURES_UNSPEC = 0, + ETHTOOL_A_FEATURES_HEADER = 1, + ETHTOOL_A_FEATURES_HW = 2, + ETHTOOL_A_FEATURES_WANTED = 3, + ETHTOOL_A_FEATURES_ACTIVE = 4, + ETHTOOL_A_FEATURES_NOCHANGE = 5, + __ETHTOOL_A_FEATURES_CNT = 6, + ETHTOOL_A_FEATURES_MAX = 5, +}; + +enum { + ETHTOOL_A_PRIVFLAGS_UNSPEC = 0, + ETHTOOL_A_PRIVFLAGS_HEADER = 1, + ETHTOOL_A_PRIVFLAGS_FLAGS = 2, + __ETHTOOL_A_PRIVFLAGS_CNT = 3, + ETHTOOL_A_PRIVFLAGS_MAX = 2, +}; + +enum { + ETHTOOL_A_RINGS_UNSPEC = 0, + ETHTOOL_A_RINGS_HEADER = 1, + ETHTOOL_A_RINGS_RX_MAX = 2, + ETHTOOL_A_RINGS_RX_MINI_MAX = 3, + ETHTOOL_A_RINGS_RX_JUMBO_MAX = 4, + ETHTOOL_A_RINGS_TX_MAX = 5, + ETHTOOL_A_RINGS_RX = 6, + ETHTOOL_A_RINGS_RX_MINI = 7, + ETHTOOL_A_RINGS_RX_JUMBO = 8, + ETHTOOL_A_RINGS_TX = 9, + __ETHTOOL_A_RINGS_CNT = 10, + ETHTOOL_A_RINGS_MAX = 9, +}; + +enum { + ETHTOOL_A_CHANNELS_UNSPEC = 0, + ETHTOOL_A_CHANNELS_HEADER = 1, + ETHTOOL_A_CHANNELS_RX_MAX = 2, + ETHTOOL_A_CHANNELS_TX_MAX = 3, + ETHTOOL_A_CHANNELS_OTHER_MAX = 4, + ETHTOOL_A_CHANNELS_COMBINED_MAX = 5, + ETHTOOL_A_CHANNELS_RX_COUNT = 6, + ETHTOOL_A_CHANNELS_TX_COUNT = 7, + ETHTOOL_A_CHANNELS_OTHER_COUNT = 8, + ETHTOOL_A_CHANNELS_COMBINED_COUNT = 9, + __ETHTOOL_A_CHANNELS_CNT = 10, + ETHTOOL_A_CHANNELS_MAX = 9, +}; + +enum { + ETHTOOL_A_COALESCE_UNSPEC = 0, + ETHTOOL_A_COALESCE_HEADER = 1, + ETHTOOL_A_COALESCE_RX_USECS = 2, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES = 3, + ETHTOOL_A_COALESCE_RX_USECS_IRQ = 4, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = 5, + ETHTOOL_A_COALESCE_TX_USECS = 6, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES = 7, + ETHTOOL_A_COALESCE_TX_USECS_IRQ = 8, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = 9, + ETHTOOL_A_COALESCE_STATS_BLOCK_USECS = 10, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = 11, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = 12, + ETHTOOL_A_COALESCE_PKT_RATE_LOW = 13, + ETHTOOL_A_COALESCE_RX_USECS_LOW = 14, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = 15, + ETHTOOL_A_COALESCE_TX_USECS_LOW = 16, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = 17, + ETHTOOL_A_COALESCE_PKT_RATE_HIGH = 18, + ETHTOOL_A_COALESCE_RX_USECS_HIGH = 19, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = 20, + ETHTOOL_A_COALESCE_TX_USECS_HIGH = 21, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 22, + ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 23, + ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 24, + ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 25, + __ETHTOOL_A_COALESCE_CNT = 26, + ETHTOOL_A_COALESCE_MAX = 25, +}; + +enum { + ETHTOOL_A_PAUSE_UNSPEC = 0, + ETHTOOL_A_PAUSE_HEADER = 1, + ETHTOOL_A_PAUSE_AUTONEG = 2, + ETHTOOL_A_PAUSE_RX = 3, + ETHTOOL_A_PAUSE_TX = 4, + ETHTOOL_A_PAUSE_STATS = 5, + __ETHTOOL_A_PAUSE_CNT = 6, + ETHTOOL_A_PAUSE_MAX = 5, +}; + +enum { + ETHTOOL_A_EEE_UNSPEC = 0, + ETHTOOL_A_EEE_HEADER = 1, + ETHTOOL_A_EEE_MODES_OURS = 2, + ETHTOOL_A_EEE_MODES_PEER = 3, + ETHTOOL_A_EEE_ACTIVE = 4, + ETHTOOL_A_EEE_ENABLED = 5, + ETHTOOL_A_EEE_TX_LPI_ENABLED = 6, + ETHTOOL_A_EEE_TX_LPI_TIMER = 7, + __ETHTOOL_A_EEE_CNT = 8, + ETHTOOL_A_EEE_MAX = 7, +}; + +enum { + ETHTOOL_A_TSINFO_UNSPEC = 0, + ETHTOOL_A_TSINFO_HEADER = 1, + ETHTOOL_A_TSINFO_TIMESTAMPING = 2, + ETHTOOL_A_TSINFO_TX_TYPES = 3, + ETHTOOL_A_TSINFO_RX_FILTERS = 4, + ETHTOOL_A_TSINFO_PHC_INDEX = 5, + __ETHTOOL_A_TSINFO_CNT = 6, + ETHTOOL_A_TSINFO_MAX = 5, +}; + +enum { + ETHTOOL_A_PHC_VCLOCKS_UNSPEC = 0, + ETHTOOL_A_PHC_VCLOCKS_HEADER = 1, + ETHTOOL_A_PHC_VCLOCKS_NUM = 2, + ETHTOOL_A_PHC_VCLOCKS_INDEX = 3, + __ETHTOOL_A_PHC_VCLOCKS_CNT = 4, + ETHTOOL_A_PHC_VCLOCKS_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_HEADER = 1, + __ETHTOOL_A_CABLE_TEST_CNT = 2, + ETHTOOL_A_CABLE_TEST_MAX = 1, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_HEADER = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG = 2, + __ETHTOOL_A_CABLE_TEST_TDR_CNT = 3, + ETHTOOL_A_CABLE_TEST_TDR_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_INFO_UNSPEC = 0, + ETHTOOL_A_TUNNEL_INFO_HEADER = 1, + ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 2, + __ETHTOOL_A_TUNNEL_INFO_CNT = 3, + ETHTOOL_A_TUNNEL_INFO_MAX = 2, +}; + +enum { + ETHTOOL_A_FEC_UNSPEC = 0, + ETHTOOL_A_FEC_HEADER = 1, + ETHTOOL_A_FEC_MODES = 2, + ETHTOOL_A_FEC_AUTO = 3, + ETHTOOL_A_FEC_ACTIVE = 4, + ETHTOOL_A_FEC_STATS = 5, + __ETHTOOL_A_FEC_CNT = 6, + ETHTOOL_A_FEC_MAX = 5, +}; + +enum { + ETHTOOL_A_MODULE_EEPROM_UNSPEC = 0, + ETHTOOL_A_MODULE_EEPROM_HEADER = 1, + ETHTOOL_A_MODULE_EEPROM_OFFSET = 2, + ETHTOOL_A_MODULE_EEPROM_LENGTH = 3, + ETHTOOL_A_MODULE_EEPROM_PAGE = 4, + ETHTOOL_A_MODULE_EEPROM_BANK = 5, + ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS = 6, + ETHTOOL_A_MODULE_EEPROM_DATA = 7, + __ETHTOOL_A_MODULE_EEPROM_CNT = 8, + ETHTOOL_A_MODULE_EEPROM_MAX = 7, +}; + +enum { + ETHTOOL_STATS_ETH_PHY = 0, + ETHTOOL_STATS_ETH_MAC = 1, + ETHTOOL_STATS_ETH_CTRL = 2, + ETHTOOL_STATS_RMON = 3, + __ETHTOOL_STATS_CNT = 4, +}; + +enum { + ETHTOOL_A_STATS_ETH_PHY_5_SYM_ERR = 0, + __ETHTOOL_A_STATS_ETH_PHY_CNT = 1, + ETHTOOL_A_STATS_ETH_PHY_MAX = 0, +}; + +enum { + ETHTOOL_A_STATS_ETH_MAC_2_TX_PKT = 0, + ETHTOOL_A_STATS_ETH_MAC_3_SINGLE_COL = 1, + ETHTOOL_A_STATS_ETH_MAC_4_MULTI_COL = 2, + ETHTOOL_A_STATS_ETH_MAC_5_RX_PKT = 3, + ETHTOOL_A_STATS_ETH_MAC_6_FCS_ERR = 4, + ETHTOOL_A_STATS_ETH_MAC_7_ALIGN_ERR = 5, + ETHTOOL_A_STATS_ETH_MAC_8_TX_BYTES = 6, + ETHTOOL_A_STATS_ETH_MAC_9_TX_DEFER = 7, + ETHTOOL_A_STATS_ETH_MAC_10_LATE_COL = 8, + ETHTOOL_A_STATS_ETH_MAC_11_XS_COL = 9, + ETHTOOL_A_STATS_ETH_MAC_12_TX_INT_ERR = 10, + ETHTOOL_A_STATS_ETH_MAC_13_CS_ERR = 11, + ETHTOOL_A_STATS_ETH_MAC_14_RX_BYTES = 12, + ETHTOOL_A_STATS_ETH_MAC_15_RX_INT_ERR = 13, + ETHTOOL_A_STATS_ETH_MAC_18_TX_MCAST = 14, + ETHTOOL_A_STATS_ETH_MAC_19_TX_BCAST = 15, + ETHTOOL_A_STATS_ETH_MAC_20_XS_DEFER = 16, + ETHTOOL_A_STATS_ETH_MAC_21_RX_MCAST = 17, + ETHTOOL_A_STATS_ETH_MAC_22_RX_BCAST = 18, + ETHTOOL_A_STATS_ETH_MAC_23_IR_LEN_ERR = 19, + ETHTOOL_A_STATS_ETH_MAC_24_OOR_LEN = 20, + ETHTOOL_A_STATS_ETH_MAC_25_TOO_LONG_ERR = 21, + __ETHTOOL_A_STATS_ETH_MAC_CNT = 22, + ETHTOOL_A_STATS_ETH_MAC_MAX = 21, +}; + +enum { + ETHTOOL_A_STATS_ETH_CTRL_3_TX = 0, + ETHTOOL_A_STATS_ETH_CTRL_4_RX = 1, + ETHTOOL_A_STATS_ETH_CTRL_5_RX_UNSUP = 2, + __ETHTOOL_A_STATS_ETH_CTRL_CNT = 3, + ETHTOOL_A_STATS_ETH_CTRL_MAX = 2, +}; + +enum { + ETHTOOL_A_STATS_RMON_UNDERSIZE = 0, + ETHTOOL_A_STATS_RMON_OVERSIZE = 1, + ETHTOOL_A_STATS_RMON_FRAG = 2, + ETHTOOL_A_STATS_RMON_JABBER = 3, + __ETHTOOL_A_STATS_RMON_CNT = 4, + ETHTOOL_A_STATS_RMON_MAX = 3, +}; + +enum { + ETHTOOL_A_MODULE_UNSPEC = 0, + ETHTOOL_A_MODULE_HEADER = 1, + ETHTOOL_A_MODULE_POWER_MODE_POLICY = 2, + ETHTOOL_A_MODULE_POWER_MODE = 3, + __ETHTOOL_A_MODULE_CNT = 4, + ETHTOOL_A_MODULE_MAX = 3, +}; + +enum ethtool_multicast_groups { + ETHNL_MCGRP_MONITOR = 0, +}; + +struct ethnl_req_info { + struct net_device *dev; + u32 flags; +}; + +struct ethnl_reply_data { + struct net_device *dev; +}; + +struct ethnl_request_ops { + u8 request_cmd; + u8 reply_cmd; + u16 hdr_attr; + unsigned int req_info_size; + unsigned int reply_data_size; + bool allow_nodev_do; + int (*parse_request)(struct ethnl_req_info *, struct nlattr **, struct netlink_ext_ack *); + int (*prepare_data)(const struct ethnl_req_info *, struct ethnl_reply_data *, struct genl_info *); + int (*reply_size)(const struct ethnl_req_info *, const struct ethnl_reply_data *); + int (*fill_reply)(struct sk_buff *, const struct ethnl_req_info *, const struct ethnl_reply_data *); + void (*cleanup_data)(struct ethnl_reply_data *); +}; + +struct ethnl_dump_ctx { + const struct ethnl_request_ops *ops; + struct ethnl_req_info *req_info; + struct ethnl_reply_data *reply_data; + int pos_hash; + int pos_idx; +}; + +typedef void (*ethnl_notify_handler_t)(struct net_device *, unsigned int, const void *); + +enum { + ETHTOOL_A_BITSET_BIT_UNSPEC = 0, + ETHTOOL_A_BITSET_BIT_INDEX = 1, + ETHTOOL_A_BITSET_BIT_NAME = 2, + ETHTOOL_A_BITSET_BIT_VALUE = 3, + __ETHTOOL_A_BITSET_BIT_CNT = 4, + ETHTOOL_A_BITSET_BIT_MAX = 3, +}; + +enum { + ETHTOOL_A_BITSET_BITS_UNSPEC = 0, + ETHTOOL_A_BITSET_BITS_BIT = 1, + __ETHTOOL_A_BITSET_BITS_CNT = 2, + ETHTOOL_A_BITSET_BITS_MAX = 1, +}; + +enum { + ETHTOOL_A_BITSET_UNSPEC = 0, + ETHTOOL_A_BITSET_NOMASK = 1, + ETHTOOL_A_BITSET_SIZE = 2, + ETHTOOL_A_BITSET_BITS = 3, + ETHTOOL_A_BITSET_VALUE = 4, + ETHTOOL_A_BITSET_MASK = 5, + __ETHTOOL_A_BITSET_CNT = 6, + ETHTOOL_A_BITSET_MAX = 5, +}; + +typedef const char (* const ethnl_string_array_t)[32]; + +enum { + ETHTOOL_A_STRING_UNSPEC = 0, + ETHTOOL_A_STRING_INDEX = 1, + ETHTOOL_A_STRING_VALUE = 2, + __ETHTOOL_A_STRING_CNT = 3, + ETHTOOL_A_STRING_MAX = 2, +}; + +enum { + ETHTOOL_A_STRINGS_UNSPEC = 0, + ETHTOOL_A_STRINGS_STRING = 1, + __ETHTOOL_A_STRINGS_CNT = 2, + ETHTOOL_A_STRINGS_MAX = 1, +}; + +enum { + ETHTOOL_A_STRINGSET_UNSPEC = 0, + ETHTOOL_A_STRINGSET_ID = 1, + ETHTOOL_A_STRINGSET_COUNT = 2, + ETHTOOL_A_STRINGSET_STRINGS = 3, + __ETHTOOL_A_STRINGSET_CNT = 4, + ETHTOOL_A_STRINGSET_MAX = 3, +}; + +enum { + ETHTOOL_A_STRINGSETS_UNSPEC = 0, + ETHTOOL_A_STRINGSETS_STRINGSET = 1, + __ETHTOOL_A_STRINGSETS_CNT = 2, + ETHTOOL_A_STRINGSETS_MAX = 1, +}; + +struct strset_info { + bool per_dev; + bool free_strings; + unsigned int count; + const char (*strings)[32]; +}; + +struct strset_req_info { + struct ethnl_req_info base; + u32 req_ids; + bool counts_only; +}; + +struct strset_reply_data { + struct ethnl_reply_data base; + struct strset_info sets[21]; +}; + +struct linkinfo_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; +}; + +struct linkmodes_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; + bool peer_empty; +}; + +struct linkstate_reply_data { + struct ethnl_reply_data base; + int link; + int sqi; + int sqi_max; + bool link_ext_state_provided; + struct ethtool_link_ext_state_info ethtool_link_ext_state_info; +}; + +struct debug_reply_data { + struct ethnl_reply_data base; + u32 msg_mask; +}; + +struct wol_reply_data { + struct ethnl_reply_data base; + struct ethtool_wolinfo wol; + bool show_sopass; +}; + +struct features_reply_data { + struct ethnl_reply_data base; + u32 hw[2]; + u32 wanted[2]; + u32 active[2]; + u32 nochange[2]; + u32 all[2]; +}; + +struct privflags_reply_data { + struct ethnl_reply_data base; + const char (*priv_flag_names)[32]; + unsigned int n_priv_flags; + u32 priv_flags; +}; + +struct rings_reply_data { + struct ethnl_reply_data base; + struct ethtool_ringparam ringparam; +}; + +struct channels_reply_data { + struct ethnl_reply_data base; + struct ethtool_channels channels; +}; + +struct coalesce_reply_data { + struct ethnl_reply_data base; + struct ethtool_coalesce coalesce; + struct kernel_ethtool_coalesce kernel_coalesce; + u32 supported_params; +}; + +enum { + ETHTOOL_A_PAUSE_STAT_UNSPEC = 0, + ETHTOOL_A_PAUSE_STAT_PAD = 1, + ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 2, + ETHTOOL_A_PAUSE_STAT_RX_FRAMES = 3, + __ETHTOOL_A_PAUSE_STAT_CNT = 4, + ETHTOOL_A_PAUSE_STAT_MAX = 3, +}; + +struct pause_reply_data { + struct ethnl_reply_data base; + struct ethtool_pauseparam pauseparam; + struct ethtool_pause_stats pausestat; +}; + +struct eee_reply_data { + struct ethnl_reply_data base; + struct ethtool_eee eee; +}; + +struct tsinfo_reply_data { + struct ethnl_reply_data base; + struct ethtool_ts_info ts_info; +}; + +enum { + ETHTOOL_A_CABLE_PAIR_A = 0, + ETHTOOL_A_CABLE_PAIR_B = 1, + ETHTOOL_A_CABLE_PAIR_C = 2, + ETHTOOL_A_CABLE_PAIR_D = 3, +}; + +enum { + ETHTOOL_A_CABLE_RESULT_UNSPEC = 0, + ETHTOOL_A_CABLE_RESULT_PAIR = 1, + ETHTOOL_A_CABLE_RESULT_CODE = 2, + __ETHTOOL_A_CABLE_RESULT_CNT = 3, + ETHTOOL_A_CABLE_RESULT_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = 0, + ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = 1, + ETHTOOL_A_CABLE_FAULT_LENGTH_CM = 2, + __ETHTOOL_A_CABLE_FAULT_LENGTH_CNT = 3, + ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = 2, +}; + +enum { + ETHTOOL_A_CABLE_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_NEST_RESULT = 1, + ETHTOOL_A_CABLE_NEST_FAULT_LENGTH = 2, + __ETHTOOL_A_CABLE_NEST_CNT = 3, + ETHTOOL_A_CABLE_NEST_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_HEADER = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS = 2, + ETHTOOL_A_CABLE_TEST_NTF_NEST = 3, + __ETHTOOL_A_CABLE_TEST_NTF_CNT = 4, + ETHTOOL_A_CABLE_TEST_NTF_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = 2, + ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = 3, + ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = 4, + __ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT = 5, + ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = 4, +}; + +enum { + ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = 0, + ETHTOOL_A_CABLE_AMPLITUDE_PAIR = 1, + ETHTOOL_A_CABLE_AMPLITUDE_mV = 2, + __ETHTOOL_A_CABLE_AMPLITUDE_CNT = 3, + ETHTOOL_A_CABLE_AMPLITUDE_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_PULSE_UNSPEC = 0, + ETHTOOL_A_CABLE_PULSE_mV = 1, + __ETHTOOL_A_CABLE_PULSE_CNT = 2, + ETHTOOL_A_CABLE_PULSE_MAX = 1, +}; + +enum { + ETHTOOL_A_CABLE_STEP_UNSPEC = 0, + ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = 1, + ETHTOOL_A_CABLE_STEP_LAST_DISTANCE = 2, + ETHTOOL_A_CABLE_STEP_STEP_DISTANCE = 3, + __ETHTOOL_A_CABLE_STEP_CNT = 4, + ETHTOOL_A_CABLE_STEP_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TDR_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TDR_NEST_STEP = 1, + ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = 2, + ETHTOOL_A_CABLE_TDR_NEST_PULSE = 3, + __ETHTOOL_A_CABLE_TDR_NEST_CNT = 4, + ETHTOOL_A_CABLE_TDR_NEST_MAX = 3, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = 1, + ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = 2, + __ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT = 3, + ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = 1, + ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = 2, + ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = 3, + __ETHTOOL_A_TUNNEL_UDP_TABLE_CNT = 4, + ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = 3, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE = 1, + __ETHTOOL_A_TUNNEL_UDP_CNT = 2, + ETHTOOL_A_TUNNEL_UDP_MAX = 1, +}; + +enum udp_parsable_tunnel_type { + UDP_TUNNEL_TYPE_VXLAN = 1, + UDP_TUNNEL_TYPE_GENEVE = 2, + UDP_TUNNEL_TYPE_VXLAN_GPE = 4, +}; + +enum udp_tunnel_nic_info_flags { + UDP_TUNNEL_NIC_INFO_MAY_SLEEP = 1, + UDP_TUNNEL_NIC_INFO_OPEN_ONLY = 2, + UDP_TUNNEL_NIC_INFO_IPV4_ONLY = 4, + UDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN = 8, +}; + +struct udp_tunnel_nic_ops { + void (*get_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + void (*set_port_priv)(struct net_device *, unsigned int, unsigned int, u8); + void (*add_port)(struct net_device *, struct udp_tunnel_info *); + void (*del_port)(struct net_device *, struct udp_tunnel_info *); + void (*reset_ntf)(struct net_device *); + size_t (*dump_size)(struct net_device *, unsigned int); + int (*dump_write)(struct net_device *, unsigned int, struct sk_buff *); +}; + +struct ethnl_tunnel_info_dump_ctx { + struct ethnl_req_info req_info; + int pos_hash; + int pos_idx; +}; + +enum { + ETHTOOL_A_FEC_STAT_UNSPEC = 0, + ETHTOOL_A_FEC_STAT_PAD = 1, + ETHTOOL_A_FEC_STAT_CORRECTED = 2, + ETHTOOL_A_FEC_STAT_UNCORR = 3, + ETHTOOL_A_FEC_STAT_CORR_BITS = 4, + __ETHTOOL_A_FEC_STAT_CNT = 5, + ETHTOOL_A_FEC_STAT_MAX = 4, +}; + +struct fec_stat_grp { + u64 stats[9]; + u8 cnt; +}; + +struct fec_reply_data { + struct ethnl_reply_data base; + long unsigned int fec_link_modes[2]; + u32 active_fec; + u8 fec_auto; + struct fec_stat_grp corr; + struct fec_stat_grp uncorr; + struct fec_stat_grp corr_bits; +}; + +struct eeprom_req_info { + struct ethnl_req_info base; + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; +}; + +struct eeprom_reply_data { + struct ethnl_reply_data base; + u32 length; + u8 *data; +}; + +enum { + ETHTOOL_A_STATS_GRP_UNSPEC = 0, + ETHTOOL_A_STATS_GRP_PAD = 1, + ETHTOOL_A_STATS_GRP_ID = 2, + ETHTOOL_A_STATS_GRP_SS_ID = 3, + ETHTOOL_A_STATS_GRP_STAT = 4, + ETHTOOL_A_STATS_GRP_HIST_RX = 5, + ETHTOOL_A_STATS_GRP_HIST_TX = 6, + ETHTOOL_A_STATS_GRP_HIST_BKT_LOW = 7, + ETHTOOL_A_STATS_GRP_HIST_BKT_HI = 8, + ETHTOOL_A_STATS_GRP_HIST_VAL = 9, + __ETHTOOL_A_STATS_GRP_CNT = 10, + ETHTOOL_A_STATS_GRP_MAX = 4, +}; + +struct stats_req_info { + struct ethnl_req_info base; + long unsigned int stat_mask[1]; +}; + +struct stats_reply_data { + struct ethnl_reply_data base; + struct ethtool_eth_phy_stats phy_stats; + struct ethtool_eth_mac_stats mac_stats; + struct ethtool_eth_ctrl_stats ctrl_stats; + struct ethtool_rmon_stats rmon_stats; + const struct ethtool_rmon_hist_range *rmon_ranges; +}; + +struct phc_vclocks_reply_data { + struct ethnl_reply_data base; + int num; + int *index; +}; + +struct module_reply_data { + struct ethnl_reply_data base; + struct ethtool_module_power_mode_params power; +}; + +struct nf_hook_entries_rcu_head { + struct callback_head head; + void *allocation; +}; + +struct nf_conn___2; + +enum nf_nat_manip_type; + +struct nf_nat_hook { + int (*parse_nat_setup)(struct nf_conn___2 *, enum nf_nat_manip_type, const struct nlattr *); + void (*decode_session)(struct sk_buff *, struct flowi *); + unsigned int (*manip_pkt)(struct sk_buff *, struct nf_conn___2 *, enum nf_nat_manip_type, enum ip_conntrack_dir); +}; + +struct nf_conntrack_tuple___2; + +struct nf_ct_hook { + int (*update)(struct net *, struct sk_buff *); + void (*destroy)(struct nf_conntrack *); + bool (*get_tuple_skb)(struct nf_conntrack_tuple___2 *, const struct sk_buff *); +}; + +struct nfnl_ct_hook { + size_t (*build_size)(const struct nf_conn___2 *); + int (*build)(struct sk_buff *, struct nf_conn___2 *, enum ip_conntrack_info, u_int16_t, u_int16_t); + int (*parse)(const struct nlattr *, struct nf_conn___2 *); + int (*attach_expect)(const struct nlattr *, struct nf_conn___2 *, u32, u32); + void (*seq_adjust)(struct sk_buff *, struct nf_conn___2 *, enum ip_conntrack_info, s32); +}; + +struct nf_queue_entry; + +struct nf_ipv6_ops { + void (*route_input)(struct sk_buff *); + int (*fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + int (*reroute)(struct sk_buff *, const struct nf_queue_entry *); +}; + +struct nf_queue_entry { + struct list_head list; + struct sk_buff *skb; + unsigned int id; + unsigned int hook_index; + struct net_device *physin; + struct net_device *physout; + struct nf_hook_state state; + u16 size; +}; + +struct nf_loginfo { + u_int8_t type; + union { + struct { + u_int32_t copy_len; + u_int16_t group; + u_int16_t qthreshold; + u_int16_t flags; + } ulog; + struct { + u_int8_t level; + u_int8_t logflags; + } log; + } u; +}; + +struct nf_log_buf { + unsigned int count; + char buf[1020]; +}; + +struct nf_bridge_info { + enum { + BRNF_PROTO_UNCHANGED = 0, + BRNF_PROTO_8021Q = 1, + BRNF_PROTO_PPPOE = 2, + } orig_proto: 8; + u8 pkt_otherhost: 1; + u8 in_prerouting: 1; + u8 bridged_dnat: 1; + __u16 frag_max_size; + struct net_device *physindev; + struct net_device *physoutdev; + union { + __be32 ipv4_daddr; + struct in6_addr ipv6_daddr; + char neigh_header[8]; + }; +}; + +struct ip_rt_info { + __be32 daddr; + __be32 saddr; + u_int8_t tos; + u_int32_t mark; +}; + +struct ip6_rt_info { + struct in6_addr daddr; + struct in6_addr saddr; + u_int32_t mark; +}; + +struct nf_queue_handler { + int (*outfn)(struct nf_queue_entry *, unsigned int); + void (*nf_hook_drop)(struct net *); +}; + +struct nf_sockopt_ops { + struct list_head list; + u_int8_t pf; + int set_optmin; + int set_optmax; + int (*set)(struct sock *, int, sockptr_t, unsigned int); + int get_optmin; + int get_optmax; + int (*get)(struct sock *, int, void *, int *); + struct module *owner; +}; + +struct ip_mreqn { + struct in_addr imr_multiaddr; + struct in_addr imr_address; + int imr_ifindex; +}; + +struct rtmsg { + unsigned char rtm_family; + unsigned char rtm_dst_len; + unsigned char rtm_src_len; + unsigned char rtm_tos; + unsigned char rtm_table; + unsigned char rtm_protocol; + unsigned char rtm_scope; + unsigned char rtm_type; + unsigned int rtm_flags; +}; + +struct rtvia { + __kernel_sa_family_t rtvia_family; + __u8 rtvia_addr[0]; +}; + +struct ip_sf_list; + +struct ip_mc_list { + struct in_device *interface; + __be32 multiaddr; + unsigned int sfmode; + struct ip_sf_list *sources; + struct ip_sf_list *tomb; + long unsigned int sfcount[2]; + union { + struct ip_mc_list *next; + struct ip_mc_list *next_rcu; + }; + struct ip_mc_list *next_hash; + struct timer_list timer; + int users; + refcount_t refcnt; + spinlock_t lock; + char tm_running; + char reporter; + char unsolicit_count; + char loaded; + unsigned char gsquery; + unsigned char crcount; + struct callback_head rcu; +}; + +struct ip_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + __be32 sl_addr[0]; +}; + +struct ip_mc_socklist { + struct ip_mc_socklist *next_rcu; + struct ip_mreqn multi; + unsigned int sfmode; + struct ip_sf_socklist *sflist; + struct callback_head rcu; +}; + +struct ip_sf_list { + struct ip_sf_list *sf_next; + long unsigned int sf_count[2]; + __be32 sf_inaddr; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; +}; + +struct ipv4_addr_key { + __be32 addr; + int vif; +}; + +struct inetpeer_addr { + union { + struct ipv4_addr_key a4; + struct in6_addr a6; + u32 key[4]; + }; + __u16 family; +}; + +struct inet_peer { + struct rb_node rb_node; + struct inetpeer_addr daddr; + u32 metrics[17]; + u32 rate_tokens; + u32 n_redirects; + long unsigned int rate_last; + union { + struct { + atomic_t rid; + }; + struct callback_head rcu; + }; + __u32 dtime; + refcount_t refcnt; +}; + +struct fib_rt_info { + struct fib_info *fi; + u32 tb_id; + __be32 dst; + int dst_len; + u8 tos; + u8 type; + u8 offload: 1; + u8 trap: 1; + u8 offload_failed: 1; + u8 unused: 5; +}; + +struct uncached_list { + spinlock_t lock; + struct list_head head; +}; + +struct ip_rt_acct { + __u32 o_bytes; + __u32 o_packets; + __u32 i_bytes; + __u32 i_packets; +}; + +struct rt_cache_stat { + unsigned int in_slow_tot; + unsigned int in_slow_mc; + unsigned int in_no_route; + unsigned int in_brd; + unsigned int in_martian_dst; + unsigned int in_martian_src; + unsigned int out_slow_tot; + unsigned int out_slow_mc; +}; + +struct fib_alias { + struct hlist_node fa_list; + struct fib_info *fa_info; + u8 fa_tos; + u8 fa_type; + u8 fa_state; + u8 fa_slen; + u32 tb_id; + s16 fa_default; + u8 offload: 1; + u8 trap: 1; + u8 offload_failed: 1; + u8 unused: 5; + struct callback_head rcu; +}; + +struct fib_prop { + int error; + u8 scope; +}; + +struct net_offload { + struct offload_callbacks callbacks; + unsigned int flags; +}; + +struct raw_hashinfo { + rwlock_t lock; + struct hlist_head ht[256]; +}; + +enum ip_defrag_users { + IP_DEFRAG_LOCAL_DELIVER = 0, + IP_DEFRAG_CALL_RA_CHAIN = 1, + IP_DEFRAG_CONNTRACK_IN = 2, + __IP_DEFRAG_CONNTRACK_IN_END = 65537, + IP_DEFRAG_CONNTRACK_OUT = 65538, + __IP_DEFRAG_CONNTRACK_OUT_END = 131073, + IP_DEFRAG_CONNTRACK_BRIDGE_IN = 131074, + __IP_DEFRAG_CONNTRACK_BRIDGE_IN = 196609, + IP_DEFRAG_VS_IN = 196610, + IP_DEFRAG_VS_OUT = 196611, + IP_DEFRAG_VS_FWD = 196612, + IP_DEFRAG_AF_PACKET = 196613, + IP_DEFRAG_MACVLAN = 196614, +}; + +enum { + INET_FRAG_FIRST_IN = 1, + INET_FRAG_LAST_IN = 2, + INET_FRAG_COMPLETE = 4, + INET_FRAG_HASH_DEAD = 8, +}; + +struct ipq { + struct inet_frag_queue q; + u8 ecn; + u16 max_df_size; + int iif; + unsigned int rid; + struct inet_peer *peer; +}; + +struct ip_options_data { + struct ip_options_rcu opt; + char data[40]; +}; + +struct ipcm_cookie { + struct sockcm_cookie sockc; + __be32 addr; + int oif; + struct ip_options_rcu *opt; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; +}; + +struct ip_fraglist_iter { + struct sk_buff *frag; + struct iphdr *iph; + int offset; + unsigned int hlen; +}; + +struct ip_frag_state { + bool DF; + unsigned int hlen; + unsigned int ll_rs; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + __be16 not_last_frag; +}; + +struct ip_reply_arg { + struct kvec iov[1]; + int flags; + __wsum csum; + int csumoffset; + int bound_dev_if; + u8 tos; + kuid_t uid; +}; + +struct ip_mreq_source { + __be32 imr_multiaddr; + __be32 imr_interface; + __be32 imr_sourceaddr; +}; + +struct ip_msfilter { + union { + struct { + __be32 imsf_multiaddr_aux; + __be32 imsf_interface_aux; + __u32 imsf_fmode_aux; + __u32 imsf_numsrc_aux; + __be32 imsf_slist[1]; + }; + struct { + __be32 imsf_multiaddr; + __be32 imsf_interface; + __u32 imsf_fmode; + __u32 imsf_numsrc; + __be32 imsf_slist_flex[0]; + }; + }; +}; + +struct group_req { + __u32 gr_interface; + struct __kernel_sockaddr_storage gr_group; +}; + +struct group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +}; + +struct group_filter { + union { + struct { + __u32 gf_interface_aux; + struct __kernel_sockaddr_storage gf_group_aux; + __u32 gf_fmode_aux; + __u32 gf_numsrc_aux; + struct __kernel_sockaddr_storage gf_slist[1]; + }; + struct { + __u32 gf_interface; + struct __kernel_sockaddr_storage gf_group; + __u32 gf_fmode; + __u32 gf_numsrc; + struct __kernel_sockaddr_storage gf_slist_flex[0]; + }; + }; +}; + +struct in_pktinfo { + int ipi_ifindex; + struct in_addr ipi_spec_dst; + struct in_addr ipi_addr; +}; + +struct compat_group_req { + __u32 gr_interface; + struct __kernel_sockaddr_storage gr_group; +} __attribute__((packed)); + +struct compat_group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +} __attribute__((packed)); + +struct compat_group_filter { + union { + struct { + __u32 gf_interface_aux; + struct __kernel_sockaddr_storage gf_group_aux; + __u32 gf_fmode_aux; + __u32 gf_numsrc_aux; + struct __kernel_sockaddr_storage gf_slist[1]; + } __attribute__((packed)); + struct { + __u32 gf_interface; + struct __kernel_sockaddr_storage gf_group; + __u32 gf_fmode; + __u32 gf_numsrc; + struct __kernel_sockaddr_storage gf_slist_flex[0]; + } __attribute__((packed)); + }; +} __attribute__((packed)); + +enum { + BPFILTER_IPT_SO_SET_REPLACE = 64, + BPFILTER_IPT_SO_SET_ADD_COUNTERS = 65, + BPFILTER_IPT_SET_MAX = 66, +}; + +enum { + BPFILTER_IPT_SO_GET_INFO = 64, + BPFILTER_IPT_SO_GET_ENTRIES = 65, + BPFILTER_IPT_SO_GET_REVISION_MATCH = 66, + BPFILTER_IPT_SO_GET_REVISION_TARGET = 67, + BPFILTER_IPT_GET_MAX = 68, +}; + +struct tcpvegas_info { + __u32 tcpv_enabled; + __u32 tcpv_rttcnt; + __u32 tcpv_rtt; + __u32 tcpv_minrtt; +}; + +struct tcp_dctcp_info { + __u16 dctcp_enabled; + __u16 dctcp_ce_state; + __u32 dctcp_alpha; + __u32 dctcp_ab_ecn; + __u32 dctcp_ab_tot; +}; + +struct tcp_bbr_info { + __u32 bbr_bw_lo; + __u32 bbr_bw_hi; + __u32 bbr_min_rtt; + __u32 bbr_pacing_gain; + __u32 bbr_cwnd_gain; +}; + +union tcp_cc_info { + struct tcpvegas_info vegas; + struct tcp_dctcp_info dctcp; + struct tcp_bbr_info bbr; +}; + +enum { + BPF_TCP_ESTABLISHED = 1, + BPF_TCP_SYN_SENT = 2, + BPF_TCP_SYN_RECV = 3, + BPF_TCP_FIN_WAIT1 = 4, + BPF_TCP_FIN_WAIT2 = 5, + BPF_TCP_TIME_WAIT = 6, + BPF_TCP_CLOSE = 7, + BPF_TCP_CLOSE_WAIT = 8, + BPF_TCP_LAST_ACK = 9, + BPF_TCP_LISTEN = 10, + BPF_TCP_CLOSING = 11, + BPF_TCP_NEW_SYN_RECV = 12, + BPF_TCP_MAX_STATES = 13, +}; + +enum inet_csk_ack_state_t { + ICSK_ACK_SCHED = 1, + ICSK_ACK_TIMER = 2, + ICSK_ACK_PUSHED = 4, + ICSK_ACK_PUSHED2 = 8, + ICSK_ACK_NOW = 16, +}; + +enum { + TCP_FLAG_CWR = 32768, + TCP_FLAG_ECE = 16384, + TCP_FLAG_URG = 8192, + TCP_FLAG_ACK = 4096, + TCP_FLAG_PSH = 2048, + TCP_FLAG_RST = 1024, + TCP_FLAG_SYN = 512, + TCP_FLAG_FIN = 256, + TCP_RESERVED_BITS = 15, + TCP_DATA_OFFSET = 240, +}; + +struct tcp_repair_opt { + __u32 opt_code; + __u32 opt_val; +}; + +struct tcp_repair_window { + __u32 snd_wl1; + __u32 snd_wnd; + __u32 max_window; + __u32 rcv_wnd; + __u32 rcv_wup; +}; + +enum { + TCP_NO_QUEUE = 0, + TCP_RECV_QUEUE = 1, + TCP_SEND_QUEUE = 2, + TCP_QUEUES_NR = 3, +}; + +struct tcp_info { + __u8 tcpi_state; + __u8 tcpi_ca_state; + __u8 tcpi_retransmits; + __u8 tcpi_probes; + __u8 tcpi_backoff; + __u8 tcpi_options; + __u8 tcpi_snd_wscale: 4; + __u8 tcpi_rcv_wscale: 4; + __u8 tcpi_delivery_rate_app_limited: 1; + __u8 tcpi_fastopen_client_fail: 2; + __u32 tcpi_rto; + __u32 tcpi_ato; + __u32 tcpi_snd_mss; + __u32 tcpi_rcv_mss; + __u32 tcpi_unacked; + __u32 tcpi_sacked; + __u32 tcpi_lost; + __u32 tcpi_retrans; + __u32 tcpi_fackets; + __u32 tcpi_last_data_sent; + __u32 tcpi_last_ack_sent; + __u32 tcpi_last_data_recv; + __u32 tcpi_last_ack_recv; + __u32 tcpi_pmtu; + __u32 tcpi_rcv_ssthresh; + __u32 tcpi_rtt; + __u32 tcpi_rttvar; + __u32 tcpi_snd_ssthresh; + __u32 tcpi_snd_cwnd; + __u32 tcpi_advmss; + __u32 tcpi_reordering; + __u32 tcpi_rcv_rtt; + __u32 tcpi_rcv_space; + __u32 tcpi_total_retrans; + __u64 tcpi_pacing_rate; + __u64 tcpi_max_pacing_rate; + __u64 tcpi_bytes_acked; + __u64 tcpi_bytes_received; + __u32 tcpi_segs_out; + __u32 tcpi_segs_in; + __u32 tcpi_notsent_bytes; + __u32 tcpi_min_rtt; + __u32 tcpi_data_segs_in; + __u32 tcpi_data_segs_out; + __u64 tcpi_delivery_rate; + __u64 tcpi_busy_time; + __u64 tcpi_rwnd_limited; + __u64 tcpi_sndbuf_limited; + __u32 tcpi_delivered; + __u32 tcpi_delivered_ce; + __u64 tcpi_bytes_sent; + __u64 tcpi_bytes_retrans; + __u32 tcpi_dsack_dups; + __u32 tcpi_reord_seen; + __u32 tcpi_rcv_ooopack; + __u32 tcpi_snd_wnd; +}; + +enum { + TCP_NLA_PAD = 0, + TCP_NLA_BUSY = 1, + TCP_NLA_RWND_LIMITED = 2, + TCP_NLA_SNDBUF_LIMITED = 3, + TCP_NLA_DATA_SEGS_OUT = 4, + TCP_NLA_TOTAL_RETRANS = 5, + TCP_NLA_PACING_RATE = 6, + TCP_NLA_DELIVERY_RATE = 7, + TCP_NLA_SND_CWND = 8, + TCP_NLA_REORDERING = 9, + TCP_NLA_MIN_RTT = 10, + TCP_NLA_RECUR_RETRANS = 11, + TCP_NLA_DELIVERY_RATE_APP_LMT = 12, + TCP_NLA_SNDQ_SIZE = 13, + TCP_NLA_CA_STATE = 14, + TCP_NLA_SND_SSTHRESH = 15, + TCP_NLA_DELIVERED = 16, + TCP_NLA_DELIVERED_CE = 17, + TCP_NLA_BYTES_SENT = 18, + TCP_NLA_BYTES_RETRANS = 19, + TCP_NLA_DSACK_DUPS = 20, + TCP_NLA_REORD_SEEN = 21, + TCP_NLA_SRTT = 22, + TCP_NLA_TIMEOUT_REHASH = 23, + TCP_NLA_BYTES_NOTSENT = 24, + TCP_NLA_EDT = 25, + TCP_NLA_TTL = 26, +}; + +struct tcp_zerocopy_receive { + __u64 address; + __u32 length; + __u32 recv_skip_hint; + __u32 inq; + __s32 err; + __u64 copybuf_address; + __s32 copybuf_len; + __u32 flags; + __u64 msg_control; + __u64 msg_controllen; + __u32 msg_flags; + __u32 reserved; +}; + +struct tcp_md5sig_pool { + struct ahash_request *md5_req; + void *scratch; +}; + +enum tcp_chrono { + TCP_CHRONO_UNSPEC = 0, + TCP_CHRONO_BUSY = 1, + TCP_CHRONO_RWND_LIMITED = 2, + TCP_CHRONO_SNDBUF_LIMITED = 3, + __TCP_CHRONO_MAX = 4, +}; + +enum { + TCP_CMSG_INQ = 1, + TCP_CMSG_TS = 2, +}; + +struct tcp_splice_state { + struct pipe_inode_info *pipe; + size_t len; + unsigned int flags; +}; + +enum tcp_fastopen_client_fail { + TFO_STATUS_UNSPEC = 0, + TFO_COOKIE_UNAVAILABLE = 1, + TFO_DATA_NOT_ACKED = 2, + TFO_SYN_RETRANSMITTED = 3, +}; + +struct tcp_sack_block_wire { + __be32 start_seq; + __be32 end_seq; +}; + +struct static_key_false_deferred { + struct static_key_false key; + long unsigned int timeout; + struct delayed_work work; +}; + +struct mptcp_ext { + union { + u64 data_ack; + u32 data_ack32; + }; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + __sum16 csum; + u8 use_map: 1; + u8 dsn64: 1; + u8 data_fin: 1; + u8 use_ack: 1; + u8 ack64: 1; + u8 mpc_map: 1; + u8 frozen: 1; + u8 reset_transient: 1; + u8 reset_reason: 4; + u8 csum_reqd: 1; +}; + +enum tcp_queue { + TCP_FRAG_IN_WRITE_QUEUE = 0, + TCP_FRAG_IN_RTX_QUEUE = 1, +}; + +enum tcp_ca_ack_event_flags { + CA_ACK_SLOWPATH = 1, + CA_ACK_WIN_UPDATE = 2, + CA_ACK_ECE = 4, +}; + +struct tcp_sacktag_state { + u64 first_sackt; + u64 last_sackt; + u32 reord; + u32 sack_delivered; + int flag; + unsigned int mss_now; + struct rate_sample *rate; +}; + +enum pkt_hash_types { + PKT_HASH_TYPE_NONE = 0, + PKT_HASH_TYPE_L2 = 1, + PKT_HASH_TYPE_L3 = 2, + PKT_HASH_TYPE_L4 = 3, +}; + +enum { + BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, + BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, +}; + +enum tsq_flags { + TSQF_THROTTLED = 1, + TSQF_QUEUED = 2, + TCPF_TSQ_DEFERRED = 4, + TCPF_WRITE_TIMER_DEFERRED = 8, + TCPF_DELACK_TIMER_DEFERRED = 16, + TCPF_MTU_REDUCED_DEFERRED = 32, +}; + +struct mptcp_rm_list { + u8 ids[8]; + u8 nr; +}; + +struct mptcp_addr_info { + u8 id; + sa_family_t family; + __be16 port; + union { + struct in_addr addr; + struct in6_addr addr6; + }; +}; + +struct mptcp_out_options { + u16 suboptions; + struct mptcp_rm_list rm_list; + u8 join_id; + u8 backup; + u8 reset_reason: 4; + u8 reset_transient: 1; + u8 csum_reqd: 1; + u8 allow_join_id0: 1; + union { + struct { + u64 sndr_key; + u64 rcvr_key; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + __sum16 csum; + }; + struct { + struct mptcp_addr_info addr; + u64 ahmac; + }; + struct { + struct mptcp_ext ext_copy; + u64 fail_seq; + }; + struct { + u32 nonce; + u32 token; + u64 thmac; + u8 hmac[20]; + }; + }; +}; + +struct tcp_out_options { + u16 options; + u16 mss; + u8 ws; + u8 num_sack_blocks; + u8 hash_size; + u8 bpf_opt_len; + __u8 *hash_location; + __u32 tsval; + __u32 tsecr; + struct tcp_fastopen_cookie *fastopen_cookie; + struct mptcp_out_options mptcp; +}; + +struct tsq_tasklet { + struct tasklet_struct tasklet; + struct list_head head; +}; + +struct tcp_md5sig { + struct __kernel_sockaddr_storage tcpm_addr; + __u8 tcpm_flags; + __u8 tcpm_prefixlen; + __u16 tcpm_keylen; + int tcpm_ifindex; + __u8 tcpm_key[80]; +}; + +struct icmp_err { + int errno; + unsigned int fatal: 1; +}; + +enum tcp_tw_status { + TCP_TW_SUCCESS = 0, + TCP_TW_RST = 1, + TCP_TW_ACK = 2, + TCP_TW_SYN = 3, +}; + +struct tcp4_pseudohdr { + __be32 saddr; + __be32 daddr; + __u8 pad; + __u8 protocol; + __be16 len; +}; + +enum tcp_seq_states { + TCP_SEQ_STATE_LISTENING = 0, + TCP_SEQ_STATE_ESTABLISHED = 1, +}; + +struct tcp_seq_afinfo { + sa_family_t family; +}; + +struct tcp_iter_state { + struct seq_net_private p; + enum tcp_seq_states state; + struct sock *syn_wait_sk; + int bucket; + int offset; + int sbucket; + int num; + loff_t last_pos; +}; + +struct bpf_tcp_iter_state { + struct tcp_iter_state state; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + struct sock **batch; + bool st_bucket_done; +}; + +struct bpf_iter__tcp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct sock_common *sk_common; + }; + uid_t uid; +}; + +enum tcp_metric_index { + TCP_METRIC_RTT = 0, + TCP_METRIC_RTTVAR = 1, + TCP_METRIC_SSTHRESH = 2, + TCP_METRIC_CWND = 3, + TCP_METRIC_REORDERING = 4, + TCP_METRIC_RTT_US = 5, + TCP_METRIC_RTTVAR_US = 6, + __TCP_METRIC_MAX = 7, +}; + +enum { + TCP_METRICS_ATTR_UNSPEC = 0, + TCP_METRICS_ATTR_ADDR_IPV4 = 1, + TCP_METRICS_ATTR_ADDR_IPV6 = 2, + TCP_METRICS_ATTR_AGE = 3, + TCP_METRICS_ATTR_TW_TSVAL = 4, + TCP_METRICS_ATTR_TW_TS_STAMP = 5, + TCP_METRICS_ATTR_VALS = 6, + TCP_METRICS_ATTR_FOPEN_MSS = 7, + TCP_METRICS_ATTR_FOPEN_SYN_DROPS = 8, + TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS = 9, + TCP_METRICS_ATTR_FOPEN_COOKIE = 10, + TCP_METRICS_ATTR_SADDR_IPV4 = 11, + TCP_METRICS_ATTR_SADDR_IPV6 = 12, + TCP_METRICS_ATTR_PAD = 13, + __TCP_METRICS_ATTR_MAX = 14, +}; + +enum { + TCP_METRICS_CMD_UNSPEC = 0, + TCP_METRICS_CMD_GET = 1, + TCP_METRICS_CMD_DEL = 2, + __TCP_METRICS_CMD_MAX = 3, +}; + +struct tcp_fastopen_metrics { + u16 mss; + u16 syn_loss: 10; + u16 try_exp: 2; + long unsigned int last_syn_loss; + struct tcp_fastopen_cookie cookie; +}; + +struct tcp_metrics_block { + struct tcp_metrics_block *tcpm_next; + possible_net_t tcpm_net; + struct inetpeer_addr tcpm_saddr; + struct inetpeer_addr tcpm_daddr; + long unsigned int tcpm_stamp; + u32 tcpm_lock; + u32 tcpm_vals[5]; + struct tcp_fastopen_metrics tcpm_fastopen; + struct callback_head callback_head; +}; + +struct tcpm_hash_bucket { + struct tcp_metrics_block *chain; +}; + +struct icmp_filter { + __u32 data; +}; + +struct raw_iter_state { + struct seq_net_private p; + int bucket; +}; + +struct raw_sock { + struct inet_sock inet; + struct icmp_filter filter; + u32 ipmr_table; +}; + +struct raw_frag_vec { + struct msghdr *msg; + union { + struct icmphdr icmph; + char c[1]; + } hdr; + int hlen; +}; + +struct ip_tunnel_encap { + u16 type; + u16 flags; + __be16 sport; + __be16 dport; +}; + +struct ip_tunnel_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi4 *); + int (*err_handler)(struct sk_buff *, u32); +}; + +struct udp_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + __u16 cscov; + __u8 partial_cov; +}; + +struct udp_dev_scratch { + u32 _tsize_state; + u16 len; + bool is_linear; + bool csum_unnecessary; +}; + +struct udp_seq_afinfo { + sa_family_t family; + struct udp_table *udp_table; +}; + +struct udp_iter_state { + struct seq_net_private p; + int bucket; + struct udp_seq_afinfo *bpf_seq_afinfo; +}; + +struct bpf_iter__udp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct udp_sock *udp_sk; + }; + uid_t uid; + int: 32; + int bucket; +}; + +struct inet_protosw { + struct list_head list; + short unsigned int type; + short unsigned int protocol; + struct proto *prot; + const struct proto_ops *ops; + unsigned char flags; +}; + +typedef struct sk_buff * (*gro_receive_t)(struct list_head *, struct sk_buff *); + +typedef struct sk_buff * (*gro_receive_sk_t)(struct sock *, struct list_head *, struct sk_buff *); + +typedef struct sock * (*udp_lookup_t)(const struct sk_buff *, __be16, __be16); + +struct arpreq { + struct sockaddr arp_pa; + struct sockaddr arp_ha; + int arp_flags; + struct sockaddr arp_netmask; + char arp_dev[16]; +}; + +typedef struct { + char ax25_call[7]; +} ax25_address; + +enum ip_conntrack_status { + IPS_EXPECTED_BIT = 0, + IPS_EXPECTED = 1, + IPS_SEEN_REPLY_BIT = 1, + IPS_SEEN_REPLY = 2, + IPS_ASSURED_BIT = 2, + IPS_ASSURED = 4, + IPS_CONFIRMED_BIT = 3, + IPS_CONFIRMED = 8, + IPS_SRC_NAT_BIT = 4, + IPS_SRC_NAT = 16, + IPS_DST_NAT_BIT = 5, + IPS_DST_NAT = 32, + IPS_NAT_MASK = 48, + IPS_SEQ_ADJUST_BIT = 6, + IPS_SEQ_ADJUST = 64, + IPS_SRC_NAT_DONE_BIT = 7, + IPS_SRC_NAT_DONE = 128, + IPS_DST_NAT_DONE_BIT = 8, + IPS_DST_NAT_DONE = 256, + IPS_NAT_DONE_MASK = 384, + IPS_DYING_BIT = 9, + IPS_DYING = 512, + IPS_FIXED_TIMEOUT_BIT = 10, + IPS_FIXED_TIMEOUT = 1024, + IPS_TEMPLATE_BIT = 11, + IPS_TEMPLATE = 2048, + IPS_UNTRACKED_BIT = 12, + IPS_UNTRACKED = 4096, + IPS_NAT_CLASH_BIT = 12, + IPS_NAT_CLASH = 4096, + IPS_HELPER_BIT = 13, + IPS_HELPER = 8192, + IPS_OFFLOAD_BIT = 14, + IPS_OFFLOAD = 16384, + IPS_HW_OFFLOAD_BIT = 15, + IPS_HW_OFFLOAD = 32768, + IPS_UNCHANGEABLE_MASK = 56313, + __IPS_MAX_BIT = 16, +}; + +enum { + XFRM_LOOKUP_ICMP = 1, + XFRM_LOOKUP_QUEUE = 2, + XFRM_LOOKUP_KEEP_DST_REF = 4, +}; + +struct icmp_ext_hdr { + __u8 reserved1: 4; + __u8 version: 4; + __u8 reserved2; + __sum16 checksum; +}; + +struct icmp_extobj_hdr { + __be16 length; + __u8 class_num; + __u8 class_type; +}; + +struct icmp_ext_echo_ctype3_hdr { + __be16 afi; + __u8 addrlen; + __u8 reserved; +}; + +struct icmp_ext_echo_iio { + struct icmp_extobj_hdr extobj_hdr; + union { + char name[16]; + __be32 ifindex; + struct { + struct icmp_ext_echo_ctype3_hdr ctype3_hdr; + union { + __be32 ipv4_addr; + struct in6_addr ipv6_addr; + } ip_addr; + } addr; + } ident; +}; + +struct icmp_bxm { + struct sk_buff *skb; + int offset; + int data_len; + struct { + struct icmphdr icmph; + __be32 times[3]; + } data; + int head_len; + struct ip_options_data replyopts; +}; + +struct icmp_control { + bool (*handler)(struct sk_buff *); + short int error; +}; + +struct ifaddrmsg { + __u8 ifa_family; + __u8 ifa_prefixlen; + __u8 ifa_flags; + __u8 ifa_scope; + __u32 ifa_index; +}; + +enum { + IFA_UNSPEC = 0, + IFA_ADDRESS = 1, + IFA_LOCAL = 2, + IFA_LABEL = 3, + IFA_BROADCAST = 4, + IFA_ANYCAST = 5, + IFA_CACHEINFO = 6, + IFA_MULTICAST = 7, + IFA_FLAGS = 8, + IFA_RT_PRIORITY = 9, + IFA_TARGET_NETNSID = 10, + __IFA_MAX = 11, +}; + +struct ifa_cacheinfo { + __u32 ifa_prefered; + __u32 ifa_valid; + __u32 cstamp; + __u32 tstamp; +}; + +enum { + IFLA_INET_UNSPEC = 0, + IFLA_INET_CONF = 1, + __IFLA_INET_MAX = 2, +}; + +struct in_validator_info { + __be32 ivi_addr; + struct in_device *ivi_dev; + struct netlink_ext_ack *extack; +}; + +struct netconfmsg { + __u8 ncm_family; +}; + +enum { + NETCONFA_UNSPEC = 0, + NETCONFA_IFINDEX = 1, + NETCONFA_FORWARDING = 2, + NETCONFA_RP_FILTER = 3, + NETCONFA_MC_FORWARDING = 4, + NETCONFA_PROXY_NEIGH = 5, + NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN = 6, + NETCONFA_INPUT = 7, + NETCONFA_BC_FORWARDING = 8, + __NETCONFA_MAX = 9, +}; + +struct inet_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; +}; + +struct devinet_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table devinet_vars[34]; +}; + +struct rtentry { + long unsigned int rt_pad1; + struct sockaddr rt_dst; + struct sockaddr rt_gateway; + struct sockaddr rt_genmask; + short unsigned int rt_flags; + short int rt_pad2; + long unsigned int rt_pad3; + void *rt_pad4; + short int rt_metric; + char *rt_dev; + long unsigned int rt_mtu; + long unsigned int rt_window; + short unsigned int rt_irtt; +}; + +struct pingv6_ops { + int (*ipv6_recv_error)(struct sock *, struct msghdr *, int, int *); + void (*ip6_datagram_recv_common_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + void (*ip6_datagram_recv_specific_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + int (*icmpv6_err_convert)(u8, u8, int *); + void (*ipv6_icmp_error)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + int (*ipv6_chk_addr)(struct net *, const struct in6_addr *, const struct net_device *, int); +}; + +struct compat_rtentry { + u32 rt_pad1; + struct sockaddr rt_dst; + struct sockaddr rt_gateway; + struct sockaddr rt_genmask; + short unsigned int rt_flags; + short int rt_pad2; + u32 rt_pad3; + unsigned char rt_tos; + unsigned char rt_class; + short int rt_pad4; + short int rt_metric; + compat_uptr_t rt_dev; + u32 rt_mtu; + u32 rt_window; + short unsigned int rt_irtt; +}; + +struct igmphdr { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; +}; + +struct igmpv3_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + __be32 grec_mca; + __be32 grec_src[0]; +}; + +struct igmpv3_report { + __u8 type; + __u8 resv1; + __sum16 csum; + __be16 resv2; + __be16 ngrec; + struct igmpv3_grec grec[0]; +}; + +struct igmpv3_query { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; + __u8 qrv: 3; + __u8 suppress: 1; + __u8 resv: 4; + __u8 qqic; + __be16 nsrcs; + __be32 srcs[0]; +}; + +struct igmp_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *in_dev; +}; + +struct igmp_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *idev; + struct ip_mc_list *im; +}; + +struct fib_config { + u8 fc_dst_len; + u8 fc_tos; + u8 fc_protocol; + u8 fc_scope; + u8 fc_type; + u8 fc_gw_family; + u32 fc_table; + __be32 fc_dst; + union { + __be32 fc_gw4; + struct in6_addr fc_gw6; + }; + int fc_oif; + u32 fc_flags; + u32 fc_priority; + __be32 fc_prefsrc; + u32 fc_nh_id; + struct nlattr *fc_mx; + struct rtnexthop *fc_mp; + int fc_mx_len; + int fc_mp_len; + u32 fc_flow; + u32 fc_nlflags; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; +}; + +struct fib_result_nl { + __be32 fl_addr; + u32 fl_mark; + unsigned char fl_tos; + unsigned char fl_scope; + unsigned char tb_id_in; + unsigned char tb_id; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + int err; +}; + +struct fib_dump_filter { + u32 table_id; + bool filter_set; + bool dump_routes; + bool dump_exceptions; + unsigned char protocol; + unsigned char rt_type; + unsigned int flags; + struct net_device *dev; +}; + +struct fib_nh_notifier_info { + struct fib_notifier_info info; + struct fib_nh *fib_nh; +}; + +struct fib_entry_notifier_info { + struct fib_notifier_info info; + u32 dst; + int dst_len; + struct fib_info *fi; + u8 tos; + u8 type; + u32 tb_id; +}; + +typedef unsigned int t_key; + +struct key_vector { + t_key key; + unsigned char pos; + unsigned char bits; + unsigned char slen; + union { + struct hlist_head leaf; + struct key_vector *tnode[0]; + }; +}; + +struct tnode { + struct callback_head rcu; + t_key empty_children; + t_key full_children; + struct key_vector *parent; + struct key_vector kv[1]; +}; + +struct trie_use_stats { + unsigned int gets; + unsigned int backtrack; + unsigned int semantic_match_passed; + unsigned int semantic_match_miss; + unsigned int null_node_hit; + unsigned int resize_node_skipped; +}; + +struct trie_stat { + unsigned int totdepth; + unsigned int maxdepth; + unsigned int tnodes; + unsigned int leaves; + unsigned int nullpointers; + unsigned int prefixes; + unsigned int nodesizes[32]; +}; + +struct trie { + struct key_vector kv[1]; + struct trie_use_stats *stats; +}; + +struct fib_trie_iter { + struct seq_net_private p; + struct fib_table *tb; + struct key_vector *tnode; + unsigned int index; + unsigned int depth; +}; + +struct fib_route_iter { + struct seq_net_private p; + struct fib_table *main_tb; + struct key_vector *tnode; + loff_t pos; + t_key key; +}; + +struct ipfrag_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + }; + struct sk_buff *next_frag; + int frag_run_len; +}; + +struct icmpv6_echo { + __be16 identifier; + __be16 sequence; +}; + +struct icmpv6_nd_advt { + __u32 reserved: 5; + __u32 override: 1; + __u32 solicited: 1; + __u32 router: 1; + __u32 reserved2: 24; +}; + +struct icmpv6_nd_ra { + __u8 hop_limit; + __u8 reserved: 3; + __u8 router_pref: 2; + __u8 home_agent: 1; + __u8 other: 1; + __u8 managed: 1; + __be16 rt_lifetime; +}; + +struct icmp6hdr { + __u8 icmp6_type; + __u8 icmp6_code; + __sum16 icmp6_cksum; + union { + __be32 un_data32[1]; + __be16 un_data16[2]; + __u8 un_data8[4]; + struct icmpv6_echo u_echo; + struct icmpv6_nd_advt u_nd_advt; + struct icmpv6_nd_ra u_nd_ra; + } icmp6_dataun; +}; + +struct ping_iter_state { + struct seq_net_private p; + int bucket; + sa_family_t family; +}; + +struct pingfakehdr { + struct icmphdr icmph; + struct msghdr *msg; + sa_family_t family; + __wsum wcheck; +}; + +struct ping_table { + struct hlist_nulls_head hash[64]; + rwlock_t lock; +}; + +enum lwtunnel_ip_t { + LWTUNNEL_IP_UNSPEC = 0, + LWTUNNEL_IP_ID = 1, + LWTUNNEL_IP_DST = 2, + LWTUNNEL_IP_SRC = 3, + LWTUNNEL_IP_TTL = 4, + LWTUNNEL_IP_TOS = 5, + LWTUNNEL_IP_FLAGS = 6, + LWTUNNEL_IP_PAD = 7, + LWTUNNEL_IP_OPTS = 8, + __LWTUNNEL_IP_MAX = 9, +}; + +enum lwtunnel_ip6_t { + LWTUNNEL_IP6_UNSPEC = 0, + LWTUNNEL_IP6_ID = 1, + LWTUNNEL_IP6_DST = 2, + LWTUNNEL_IP6_SRC = 3, + LWTUNNEL_IP6_HOPLIMIT = 4, + LWTUNNEL_IP6_TC = 5, + LWTUNNEL_IP6_FLAGS = 6, + LWTUNNEL_IP6_PAD = 7, + LWTUNNEL_IP6_OPTS = 8, + __LWTUNNEL_IP6_MAX = 9, +}; + +enum { + LWTUNNEL_IP_OPTS_UNSPEC = 0, + LWTUNNEL_IP_OPTS_GENEVE = 1, + LWTUNNEL_IP_OPTS_VXLAN = 2, + LWTUNNEL_IP_OPTS_ERSPAN = 3, + __LWTUNNEL_IP_OPTS_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_GENEVE_UNSPEC = 0, + LWTUNNEL_IP_OPT_GENEVE_CLASS = 1, + LWTUNNEL_IP_OPT_GENEVE_TYPE = 2, + LWTUNNEL_IP_OPT_GENEVE_DATA = 3, + __LWTUNNEL_IP_OPT_GENEVE_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_VXLAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_VXLAN_GBP = 1, + __LWTUNNEL_IP_OPT_VXLAN_MAX = 2, +}; + +enum { + LWTUNNEL_IP_OPT_ERSPAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_ERSPAN_VER = 1, + LWTUNNEL_IP_OPT_ERSPAN_INDEX = 2, + LWTUNNEL_IP_OPT_ERSPAN_DIR = 3, + LWTUNNEL_IP_OPT_ERSPAN_HWID = 4, + __LWTUNNEL_IP_OPT_ERSPAN_MAX = 5, +}; + +struct ip6_tnl_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi6 *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); +}; + +struct geneve_opt { + __be16 opt_class; + u8 type; + u8 length: 5; + u8 r3: 1; + u8 r2: 1; + u8 r1: 1; + u8 opt_data[0]; +}; + +struct vxlan_metadata { + u32 gbp; +}; + +struct erspan_md2 { + __be32 timestamp; + __be16 sgt; + __u8 hwid_upper: 2; + __u8 ft: 5; + __u8 p: 1; + __u8 o: 1; + __u8 gra: 2; + __u8 dir: 1; + __u8 hwid: 4; +}; + +struct erspan_metadata { + int version; + union { + __be32 index; + struct erspan_md2 md2; + } u; +}; + +struct nhmsg { + unsigned char nh_family; + unsigned char nh_scope; + unsigned char nh_protocol; + unsigned char resvd; + unsigned int nh_flags; +}; + +struct nexthop_grp { + __u32 id; + __u8 weight; + __u8 resvd1; + __u16 resvd2; +}; + +enum { + NEXTHOP_GRP_TYPE_MPATH = 0, + NEXTHOP_GRP_TYPE_RES = 1, + __NEXTHOP_GRP_TYPE_MAX = 2, +}; + +enum { + NHA_UNSPEC = 0, + NHA_ID = 1, + NHA_GROUP = 2, + NHA_GROUP_TYPE = 3, + NHA_BLACKHOLE = 4, + NHA_OIF = 5, + NHA_GATEWAY = 6, + NHA_ENCAP_TYPE = 7, + NHA_ENCAP = 8, + NHA_GROUPS = 9, + NHA_MASTER = 10, + NHA_FDB = 11, + NHA_RES_GROUP = 12, + NHA_RES_BUCKET = 13, + __NHA_MAX = 14, +}; + +enum { + NHA_RES_GROUP_UNSPEC = 0, + NHA_RES_GROUP_PAD = 0, + NHA_RES_GROUP_BUCKETS = 1, + NHA_RES_GROUP_IDLE_TIMER = 2, + NHA_RES_GROUP_UNBALANCED_TIMER = 3, + NHA_RES_GROUP_UNBALANCED_TIME = 4, + __NHA_RES_GROUP_MAX = 5, +}; + +enum { + NHA_RES_BUCKET_UNSPEC = 0, + NHA_RES_BUCKET_PAD = 0, + NHA_RES_BUCKET_INDEX = 1, + NHA_RES_BUCKET_IDLE_TIME = 2, + NHA_RES_BUCKET_NH_ID = 3, + __NHA_RES_BUCKET_MAX = 4, +}; + +struct nh_config { + u32 nh_id; + u8 nh_family; + u8 nh_protocol; + u8 nh_blackhole; + u8 nh_fdb; + u32 nh_flags; + int nh_ifindex; + struct net_device *dev; + union { + __be32 ipv4; + struct in6_addr ipv6; + } gw; + struct nlattr *nh_grp; + u16 nh_grp_type; + u16 nh_grp_res_num_buckets; + long unsigned int nh_grp_res_idle_timer; + long unsigned int nh_grp_res_unbalanced_timer; + bool nh_grp_res_has_num_buckets; + bool nh_grp_res_has_idle_timer; + bool nh_grp_res_has_unbalanced_timer; + struct nlattr *nh_encap; + u16 nh_encap_type; + u32 nlflags; + struct nl_info nlinfo; +}; + +enum nexthop_event_type { + NEXTHOP_EVENT_DEL = 0, + NEXTHOP_EVENT_REPLACE = 1, + NEXTHOP_EVENT_RES_TABLE_PRE_REPLACE = 2, + NEXTHOP_EVENT_BUCKET_REPLACE = 3, +}; + +enum nh_notifier_info_type { + NH_NOTIFIER_INFO_TYPE_SINGLE = 0, + NH_NOTIFIER_INFO_TYPE_GRP = 1, + NH_NOTIFIER_INFO_TYPE_RES_TABLE = 2, + NH_NOTIFIER_INFO_TYPE_RES_BUCKET = 3, +}; + +struct nh_notifier_single_info { + struct net_device *dev; + u8 gw_family; + union { + __be32 ipv4; + struct in6_addr ipv6; + }; + u8 is_reject: 1; + u8 is_fdb: 1; + u8 has_encap: 1; +}; + +struct nh_notifier_grp_entry_info { + u8 weight; + u32 id; + struct nh_notifier_single_info nh; +}; + +struct nh_notifier_grp_info { + u16 num_nh; + bool is_fdb; + struct nh_notifier_grp_entry_info nh_entries[0]; +}; + +struct nh_notifier_res_bucket_info { + u16 bucket_index; + unsigned int idle_timer_ms; + bool force; + struct nh_notifier_single_info old_nh; + struct nh_notifier_single_info new_nh; +}; + +struct nh_notifier_res_table_info { + u16 num_nh_buckets; + struct nh_notifier_single_info nhs[0]; +}; + +struct nh_notifier_info { + struct net *net; + struct netlink_ext_ack *extack; + u32 id; + enum nh_notifier_info_type type; + union { + struct nh_notifier_single_info *nh; + struct nh_notifier_grp_info *nh_grp; + struct nh_notifier_res_table_info *nh_res_table; + struct nh_notifier_res_bucket_info *nh_res_bucket; + }; +}; + +struct nh_dump_filter { + u32 nh_id; + int dev_idx; + int master_idx; + bool group_filter; + bool fdb_filter; + u32 res_bucket_nh_id; +}; + +struct rtm_dump_nh_ctx { + u32 idx; +}; + +struct rtm_dump_res_bucket_ctx { + struct rtm_dump_nh_ctx nh; + u16 bucket_index; + u32 done_nh_idx; +}; + +struct rtm_dump_nexthop_bucket_data { + struct rtm_dump_res_bucket_ctx *ctx; + struct nh_dump_filter filter; +}; + +struct bpfilter_umh_ops { + struct umd_info info; + struct mutex lock; + int (*sockopt)(struct sock *, int, sockptr_t, unsigned int, bool); + int (*start)(); +}; + +struct inet6_protocol { + void (*early_demux)(struct sk_buff *); + void (*early_demux_handler)(struct sk_buff *); + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + unsigned int flags; +}; + +struct snmp_mib { + const char *name; + int entry; +}; + +struct fib4_rule { + struct fib_rule common; + u8 dst_len; + u8 src_len; + u8 tos; + __be32 src; + __be32 srcmask; + __be32 dst; + __be32 dstmask; + u32 tclassid; +}; + +enum { + PIM_TYPE_HELLO = 0, + PIM_TYPE_REGISTER = 1, + PIM_TYPE_REGISTER_STOP = 2, + PIM_TYPE_JOIN_PRUNE = 3, + PIM_TYPE_BOOTSTRAP = 4, + PIM_TYPE_ASSERT = 5, + PIM_TYPE_GRAFT = 6, + PIM_TYPE_GRAFT_ACK = 7, + PIM_TYPE_CANDIDATE_RP_ADV = 8, +}; + +struct pimreghdr { + __u8 type; + __u8 reserved; + __be16 csum; + __be32 flags; +}; + +typedef short unsigned int vifi_t; + +struct vifctl { + vifi_t vifc_vifi; + unsigned char vifc_flags; + unsigned char vifc_threshold; + unsigned int vifc_rate_limit; + union { + struct in_addr vifc_lcl_addr; + int vifc_lcl_ifindex; + }; + struct in_addr vifc_rmt_addr; +}; + +struct mfcctl { + struct in_addr mfcc_origin; + struct in_addr mfcc_mcastgrp; + vifi_t mfcc_parent; + unsigned char mfcc_ttls[32]; + unsigned int mfcc_pkt_cnt; + unsigned int mfcc_byte_cnt; + unsigned int mfcc_wrong_if; + int mfcc_expire; +}; + +struct sioc_sg_req { + struct in_addr src; + struct in_addr grp; + long unsigned int pktcnt; + long unsigned int bytecnt; + long unsigned int wrong_if; +}; + +struct sioc_vif_req { + vifi_t vifi; + long unsigned int icount; + long unsigned int ocount; + long unsigned int ibytes; + long unsigned int obytes; +}; + +struct igmpmsg { + __u32 unused1; + __u32 unused2; + unsigned char im_msgtype; + unsigned char im_mbz; + unsigned char im_vif; + unsigned char im_vif_hi; + struct in_addr im_src; + struct in_addr im_dst; +}; + +enum { + IPMRA_TABLE_UNSPEC = 0, + IPMRA_TABLE_ID = 1, + IPMRA_TABLE_CACHE_RES_QUEUE_LEN = 2, + IPMRA_TABLE_MROUTE_REG_VIF_NUM = 3, + IPMRA_TABLE_MROUTE_DO_ASSERT = 4, + IPMRA_TABLE_MROUTE_DO_PIM = 5, + IPMRA_TABLE_VIFS = 6, + IPMRA_TABLE_MROUTE_DO_WRVIFWHOLE = 7, + __IPMRA_TABLE_MAX = 8, +}; + +enum { + IPMRA_VIF_UNSPEC = 0, + IPMRA_VIF = 1, + __IPMRA_VIF_MAX = 2, +}; + +enum { + IPMRA_VIFA_UNSPEC = 0, + IPMRA_VIFA_IFINDEX = 1, + IPMRA_VIFA_VIF_ID = 2, + IPMRA_VIFA_FLAGS = 3, + IPMRA_VIFA_BYTES_IN = 4, + IPMRA_VIFA_BYTES_OUT = 5, + IPMRA_VIFA_PACKETS_IN = 6, + IPMRA_VIFA_PACKETS_OUT = 7, + IPMRA_VIFA_LOCAL_ADDR = 8, + IPMRA_VIFA_REMOTE_ADDR = 9, + IPMRA_VIFA_PAD = 10, + __IPMRA_VIFA_MAX = 11, +}; + +enum { + IPMRA_CREPORT_UNSPEC = 0, + IPMRA_CREPORT_MSGTYPE = 1, + IPMRA_CREPORT_VIF_ID = 2, + IPMRA_CREPORT_SRC_ADDR = 3, + IPMRA_CREPORT_DST_ADDR = 4, + IPMRA_CREPORT_PKT = 5, + IPMRA_CREPORT_TABLE = 6, + __IPMRA_CREPORT_MAX = 7, +}; + +struct vif_device { + struct net_device *dev; + long unsigned int bytes_in; + long unsigned int bytes_out; + long unsigned int pkt_in; + long unsigned int pkt_out; + long unsigned int rate_limit; + unsigned char threshold; + short unsigned int flags; + int link; + struct netdev_phys_item_id dev_parent_id; + __be32 local; + __be32 remote; +}; + +struct vif_entry_notifier_info { + struct fib_notifier_info info; + struct net_device *dev; + short unsigned int vif_index; + short unsigned int vif_flags; + u32 tb_id; +}; + +enum { + MFC_STATIC = 1, + MFC_OFFLOAD = 2, +}; + +struct mr_mfc { + struct rhlist_head mnode; + short unsigned int mfc_parent; + int mfc_flags; + union { + struct { + long unsigned int expires; + struct sk_buff_head unresolved; + } unres; + struct { + long unsigned int last_assert; + int minvif; + int maxvif; + long unsigned int bytes; + long unsigned int pkt; + long unsigned int wrong_if; + long unsigned int lastuse; + unsigned char ttls[32]; + refcount_t refcount; + } res; + } mfc_un; + struct list_head list; + struct callback_head rcu; + void (*free)(struct callback_head *); +}; + +struct mfc_entry_notifier_info { + struct fib_notifier_info info; + struct mr_mfc *mfc; + u32 tb_id; +}; + +struct mr_table_ops { + const struct rhashtable_params *rht_params; + void *cmparg_any; +}; + +struct mr_table { + struct list_head list; + possible_net_t net; + struct mr_table_ops ops; + u32 id; + struct sock *mroute_sk; + struct timer_list ipmr_expire_timer; + struct list_head mfc_unres_queue; + struct vif_device vif_table[32]; + struct rhltable mfc_hash; + struct list_head mfc_cache_list; + int maxvif; + atomic_t cache_resolve_queue_len; + bool mroute_do_assert; + bool mroute_do_pim; + bool mroute_do_wrvifwhole; + int mroute_reg_vif_num; +}; + +struct mr_vif_iter { + struct seq_net_private p; + struct mr_table *mrt; + int ct; +}; + +struct mr_mfc_iter { + struct seq_net_private p; + struct mr_table *mrt; + struct list_head *cache; + spinlock_t *lock; +}; + +struct mfc_cache_cmp_arg { + __be32 mfc_mcastgrp; + __be32 mfc_origin; +}; + +struct mfc_cache { + struct mr_mfc _c; + union { + struct { + __be32 mfc_mcastgrp; + __be32 mfc_origin; + }; + struct mfc_cache_cmp_arg cmparg; + }; +}; + +struct ipmr_result { + struct mr_table *mrt; +}; + +struct compat_sioc_sg_req { + struct in_addr src; + struct in_addr grp; + compat_ulong_t pktcnt; + compat_ulong_t bytecnt; + compat_ulong_t wrong_if; +}; + +struct compat_sioc_vif_req { + vifi_t vifi; + compat_ulong_t icount; + compat_ulong_t ocount; + compat_ulong_t ibytes; + compat_ulong_t obytes; +}; + +struct rta_mfc_stats { + __u64 mfcs_packets; + __u64 mfcs_bytes; + __u64 mfcs_wrong_if; +}; + +struct bictcp { + u32 cnt; + u32 last_max_cwnd; + u32 last_cwnd; + u32 last_time; + u32 bic_origin_point; + u32 bic_K; + u32 delay_min; + u32 epoch_start; + u32 ack_cnt; + u32 tcp_cwnd; + u16 unused; + u8 sample_cnt; + u8 found; + u32 round_start; + u32 end_seq; + u32 last_ack; + u32 curr_rtt; +}; + +struct tls_rec { + struct list_head list; + int tx_ready; + int tx_flags; + struct sk_msg msg_plaintext; + struct sk_msg msg_encrypted; + struct scatterlist sg_aead_in[2]; + struct scatterlist sg_aead_out[2]; + char content_type; + struct scatterlist sg_content_type; + char aad_space[13]; + u8 iv_data[16]; + long: 24; + long: 64; + long: 64; + struct aead_request aead_req; + u8 aead_req_ctx[0]; +}; + +struct tx_work { + struct delayed_work work; + struct sock *sk; +}; + +struct tls_sw_context_tx { + struct crypto_aead *aead_send; + struct crypto_wait async_wait; + struct tx_work tx_work; + struct tls_rec *open_rec; + struct list_head tx_list; + atomic_t encrypt_pending; + spinlock_t encrypt_compl_lock; + int async_notify; + u8 async_capable: 1; + long unsigned int tx_bitmask; +}; + +enum { + TCP_BPF_IPV4 = 0, + TCP_BPF_IPV6 = 1, + TCP_BPF_NUM_PROTS = 2, +}; + +enum { + TCP_BPF_BASE = 0, + TCP_BPF_TX = 1, + TCP_BPF_RX = 2, + TCP_BPF_TXRX = 3, + TCP_BPF_NUM_CFGS = 4, +}; + +enum { + UDP_BPF_IPV4 = 0, + UDP_BPF_IPV6 = 1, + UDP_BPF_NUM_PROTS = 2, +}; + +struct cipso_v4_map_cache_bkt { + spinlock_t lock; + u32 size; + struct list_head list; +}; + +struct cipso_v4_map_cache_entry { + u32 hash; + unsigned char *key; + size_t key_len; + struct netlbl_lsm_cache *lsm_data; + u32 activity; + struct list_head list; +}; + +struct xfrm_policy_afinfo { + struct dst_ops *dst_ops; + struct dst_entry * (*dst_lookup)(struct net *, int, int, const xfrm_address_t *, const xfrm_address_t *, u32); + int (*get_saddr)(struct net *, int, xfrm_address_t *, xfrm_address_t *, u32); + int (*fill_dst)(struct xfrm_dst *, struct net_device *, const struct flowi *); + struct dst_entry * (*blackhole_route)(struct net *, struct dst_entry *); +}; + +struct xfrm_state_afinfo { + u8 family; + u8 proto; + const struct xfrm_type_offload *type_offload_esp; + const struct xfrm_type *type_esp; + const struct xfrm_type *type_ipip; + const struct xfrm_type *type_ipip6; + const struct xfrm_type *type_comp; + const struct xfrm_type *type_ah; + const struct xfrm_type *type_routing; + const struct xfrm_type *type_dstopts; + int (*output)(struct net *, struct sock *, struct sk_buff *); + int (*transport_finish)(struct sk_buff *, int); + void (*local_error)(struct sk_buff *, u32); +}; + +struct ip_tunnel; + +struct ip6_tnl; + +struct xfrm_tunnel_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + union { + struct ip_tunnel *ip4; + struct ip6_tnl *ip6; + } tunnel; +}; + +struct xfrm_mode_skb_cb { + struct xfrm_tunnel_skb_cb header; + __be16 id; + __be16 frag_off; + u8 ihl; + u8 tos; + u8 ttl; + u8 protocol; + u8 optlen; + u8 flow_lbl[3]; +}; + +struct xfrm_spi_skb_cb { + struct xfrm_tunnel_skb_cb header; + unsigned int daddroff; + unsigned int family; + __be32 seq; +}; + +struct xfrm_input_afinfo { + u8 family; + bool is_ipip; + int (*callback)(struct sk_buff *, u8, int); +}; + +struct xfrm4_protocol { + int (*handler)(struct sk_buff *); + int (*input_handler)(struct sk_buff *, int, __be32, int); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, u32); + struct xfrm4_protocol *next; + int priority; +}; + +typedef u64 (*btf_bpf_tcp_send_ack)(struct tcp_sock *, u32); + +enum { + XFRM_STATE_VOID = 0, + XFRM_STATE_ACQ = 1, + XFRM_STATE_VALID = 2, + XFRM_STATE_ERROR = 3, + XFRM_STATE_EXPIRED = 4, + XFRM_STATE_DEAD = 5, +}; + +struct xfrm_if; + +struct xfrm_if_cb { + struct xfrm_if * (*decode_session)(struct sk_buff *, short unsigned int); +}; + +struct xfrm_if_parms { + int link; + u32 if_id; +}; + +struct xfrm_if { + struct xfrm_if *next; + struct net_device *dev; + struct net *net; + struct xfrm_if_parms p; + struct gro_cells gro_cells; +}; + +struct xfrm_policy_walk { + struct xfrm_policy_walk_entry walk; + u8 type; + u32 seq; +}; + +struct xfrmk_spdinfo { + u32 incnt; + u32 outcnt; + u32 fwdcnt; + u32 inscnt; + u32 outscnt; + u32 fwdscnt; + u32 spdhcnt; + u32 spdhmcnt; +}; + +struct ip6_mh { + __u8 ip6mh_proto; + __u8 ip6mh_hdrlen; + __u8 ip6mh_type; + __u8 ip6mh_reserved; + __u16 ip6mh_cksum; + __u8 data[0]; +}; + +struct xfrm_flo { + struct dst_entry *dst_orig; + u8 flags; +}; + +struct xfrm_pol_inexact_node { + struct rb_node node; + union { + xfrm_address_t addr; + struct callback_head rcu; + }; + u8 prefixlen; + struct rb_root root; + struct hlist_head hhead; +}; + +struct xfrm_pol_inexact_key { + possible_net_t net; + u32 if_id; + u16 family; + u8 dir; + u8 type; +}; + +struct xfrm_pol_inexact_bin { + struct xfrm_pol_inexact_key k; + struct rhash_head head; + struct hlist_head hhead; + seqcount_spinlock_t count; + struct rb_root root_d; + struct rb_root root_s; + struct list_head inexact_bins; + struct callback_head rcu; +}; + +enum xfrm_pol_inexact_candidate_type { + XFRM_POL_CAND_BOTH = 0, + XFRM_POL_CAND_SADDR = 1, + XFRM_POL_CAND_DADDR = 2, + XFRM_POL_CAND_ANY = 3, + XFRM_POL_CAND_MAX = 4, +}; + +struct xfrm_pol_inexact_candidates { + struct hlist_head *res[4]; +}; + +enum xfrm_ae_ftype_t { + XFRM_AE_UNSPEC = 0, + XFRM_AE_RTHR = 1, + XFRM_AE_RVAL = 2, + XFRM_AE_LVAL = 4, + XFRM_AE_ETHR = 8, + XFRM_AE_CR = 16, + XFRM_AE_CE = 32, + XFRM_AE_CU = 64, + __XFRM_AE_MAX = 65, +}; + +enum xfrm_nlgroups { + XFRMNLGRP_NONE = 0, + XFRMNLGRP_ACQUIRE = 1, + XFRMNLGRP_EXPIRE = 2, + XFRMNLGRP_SA = 3, + XFRMNLGRP_POLICY = 4, + XFRMNLGRP_AEVENTS = 5, + XFRMNLGRP_REPORT = 6, + XFRMNLGRP_MIGRATE = 7, + XFRMNLGRP_MAPPING = 8, + __XFRMNLGRP_MAX = 9, +}; + +enum { + XFRM_MODE_FLAG_TUNNEL = 1, +}; + +struct km_event { + union { + u32 hard; + u32 proto; + u32 byid; + u32 aevent; + u32 type; + } data; + u32 seq; + u32 portid; + u32 event; + struct net *net; +}; + +struct xfrm_kmaddress { + xfrm_address_t local; + xfrm_address_t remote; + u32 reserved; + u16 family; +}; + +struct xfrm_migrate { + xfrm_address_t old_daddr; + xfrm_address_t old_saddr; + xfrm_address_t new_daddr; + xfrm_address_t new_saddr; + u8 proto; + u8 mode; + u16 reserved; + u32 reqid; + u16 old_family; + u16 new_family; +}; + +struct xfrm_mgr { + struct list_head list; + int (*notify)(struct xfrm_state *, const struct km_event *); + int (*acquire)(struct xfrm_state *, struct xfrm_tmpl *, struct xfrm_policy *); + struct xfrm_policy * (*compile_policy)(struct sock *, int, u8 *, int, int *); + int (*new_mapping)(struct xfrm_state *, xfrm_address_t *, __be16); + int (*notify_policy)(struct xfrm_policy *, int, const struct km_event *); + int (*report)(struct net *, u8, struct xfrm_selector *, xfrm_address_t *); + int (*migrate)(const struct xfrm_selector *, u8, u8, const struct xfrm_migrate *, int, const struct xfrm_kmaddress *, const struct xfrm_encap_tmpl *); + bool (*is_alive)(const struct km_event *); +}; + +struct xfrmk_sadinfo { + u32 sadhcnt; + u32 sadhmcnt; + u32 sadcnt; +}; + +struct xfrm_translator { + int (*alloc_compat)(struct sk_buff *, const struct nlmsghdr *); + struct nlmsghdr * (*rcv_msg_compat)(const struct nlmsghdr *, int, const struct nla_policy *, struct netlink_ext_ack *); + int (*xlate_user_policy_sockptr)(u8 **, int); + struct module *owner; +}; + +struct ip_beet_phdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 padlen; + __u8 reserved; +}; + +struct ip_tunnel_6rd_parm { + struct in6_addr prefix; + __be32 relay_prefix; + u16 prefixlen; + u16 relay_prefixlen; +}; + +struct ip_tunnel_prl_entry; + +struct ip_tunnel { + struct ip_tunnel *next; + struct hlist_node hash_node; + struct net_device *dev; + struct net *net; + long unsigned int err_time; + int err_count; + u32 i_seqno; + u32 o_seqno; + int tun_hlen; + u32 index; + u8 erspan_ver; + u8 dir; + u16 hwid; + struct dst_cache dst_cache; + struct ip_tunnel_parm parms; + int mlink; + int encap_hlen; + int hlen; + struct ip_tunnel_encap encap; + struct ip_tunnel_6rd_parm ip6rd; + struct ip_tunnel_prl_entry *prl; + unsigned int prl_count; + unsigned int ip_tnl_net_id; + struct gro_cells gro_cells; + __u32 fwmark; + bool collect_md; + bool ignore_df; +}; + +struct __ip6_tnl_parm { + char name[16]; + int link; + __u8 proto; + __u8 encap_limit; + __u8 hop_limit; + bool collect_md; + __be32 flowinfo; + __u32 flags; + struct in6_addr laddr; + struct in6_addr raddr; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + __u32 fwmark; + __u32 index; + __u8 erspan_ver; + __u8 dir; + __u16 hwid; +}; + +struct ip6_tnl { + struct ip6_tnl *next; + struct net_device *dev; + struct net *net; + struct __ip6_tnl_parm parms; + struct flowi fl; + struct dst_cache dst_cache; + struct gro_cells gro_cells; + int err_count; + long unsigned int err_time; + __u32 i_seqno; + __u32 o_seqno; + int hlen; + int tun_hlen; + int encap_hlen; + struct ip_tunnel_encap encap; + int mlink; +}; + +struct xfrm_skb_cb { + struct xfrm_tunnel_skb_cb header; + union { + struct { + __u32 low; + __u32 hi; + } output; + struct { + __be32 low; + __be32 hi; + } input; + } seq; +}; + +struct ip_tunnel_prl_entry { + struct ip_tunnel_prl_entry *next; + __be32 addr; + u16 flags; + struct callback_head callback_head; +}; + +struct xfrm_trans_tasklet { + struct tasklet_struct tasklet; + struct sk_buff_head queue; +}; + +struct xfrm_trans_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + int (*finish)(struct net *, struct sock *, struct sk_buff *); + struct net *net; +}; + +struct xfrm_user_offload { + int ifindex; + __u8 flags; +}; + +struct espintcp_msg { + struct sk_buff *skb; + struct sk_msg skmsg; + int offset; + int len; +}; + +struct espintcp_ctx { + struct strparser strp; + struct sk_buff_head ike_queue; + struct sk_buff_head out_queue; + struct espintcp_msg partial; + void (*saved_data_ready)(struct sock *); + void (*saved_write_space)(struct sock *); + void (*saved_destruct)(struct sock *); + struct work_struct work; + bool tx_running; +}; + +struct unix_stream_read_state { + int (*recv_actor)(struct sk_buff *, int, int, struct unix_stream_read_state *); + struct socket *socket; + struct msghdr *msg; + struct pipe_inode_info *pipe; + size_t size; + int flags; + unsigned int splice_flags; +}; + +struct bpf_iter__unix { + union { + struct bpf_iter_meta *meta; + }; + union { + struct unix_sock *unix_sk; + }; + uid_t uid; +}; + +struct ioam6_pernet_data { + struct mutex lock; + struct rhashtable namespaces; + struct rhashtable schemas; +}; + +struct ipv6_params { + __s32 disable_ipv6; + __s32 autoconf; +}; + +enum flowlabel_reflect { + FLOWLABEL_REFLECT_ESTABLISHED = 1, + FLOWLABEL_REFLECT_TCP_RESET = 2, + FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES = 4, +}; + +struct in6_rtmsg { + struct in6_addr rtmsg_dst; + struct in6_addr rtmsg_src; + struct in6_addr rtmsg_gateway; + __u32 rtmsg_type; + __u16 rtmsg_dst_len; + __u16 rtmsg_src_len; + __u32 rtmsg_metric; + long unsigned int rtmsg_info; + __u32 rtmsg_flags; + int rtmsg_ifindex; +}; + +struct compat_in6_rtmsg { + struct in6_addr rtmsg_dst; + struct in6_addr rtmsg_src; + struct in6_addr rtmsg_gateway; + u32 rtmsg_type; + u16 rtmsg_dst_len; + u16 rtmsg_src_len; + u32 rtmsg_metric; + u32 rtmsg_info; + u32 rtmsg_flags; + s32 rtmsg_ifindex; +}; + +struct ac6_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; +}; + +struct ip6_fraglist_iter { + struct ipv6hdr *tmp_hdr; + struct sk_buff *frag; + int offset; + unsigned int hlen; + __be32 frag_id; + u8 nexthdr; +}; + +struct ip6_frag_state { + u8 *prevhdr; + unsigned int hlen; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + int hroom; + int troom; + __be32 frag_id; + u8 nexthdr; +}; + +struct ip6_ra_chain { + struct ip6_ra_chain *next; + struct sock *sk; + int sel; + void (*destructor)(struct sock *); +}; + +struct ipcm6_cookie { + struct sockcm_cookie sockc; + __s16 hlimit; + __s16 tclass; + __s8 dontfrag; + struct ipv6_txoptions *opt; + __u16 gso_size; +}; + +enum { + IFLA_INET6_UNSPEC = 0, + IFLA_INET6_FLAGS = 1, + IFLA_INET6_CONF = 2, + IFLA_INET6_STATS = 3, + IFLA_INET6_MCAST = 4, + IFLA_INET6_CACHEINFO = 5, + IFLA_INET6_ICMP6STATS = 6, + IFLA_INET6_TOKEN = 7, + IFLA_INET6_ADDR_GEN_MODE = 8, + IFLA_INET6_RA_MTU = 9, + __IFLA_INET6_MAX = 10, +}; + +enum in6_addr_gen_mode { + IN6_ADDR_GEN_MODE_EUI64 = 0, + IN6_ADDR_GEN_MODE_NONE = 1, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY = 2, + IN6_ADDR_GEN_MODE_RANDOM = 3, +}; + +struct ifla_cacheinfo { + __u32 max_reasm_len; + __u32 tstamp; + __u32 reachable_time; + __u32 retrans_time; +}; + +struct prefixmsg { + unsigned char prefix_family; + unsigned char prefix_pad1; + short unsigned int prefix_pad2; + int prefix_ifindex; + unsigned char prefix_type; + unsigned char prefix_len; + unsigned char prefix_flags; + unsigned char prefix_pad3; +}; + +enum { + PREFIX_UNSPEC = 0, + PREFIX_ADDRESS = 1, + PREFIX_CACHEINFO = 2, + __PREFIX_MAX = 3, +}; + +struct prefix_cacheinfo { + __u32 preferred_time; + __u32 valid_time; +}; + +struct in6_ifreq { + struct in6_addr ifr6_addr; + __u32 ifr6_prefixlen; + int ifr6_ifindex; +}; + +enum { + DEVCONF_FORWARDING = 0, + DEVCONF_HOPLIMIT = 1, + DEVCONF_MTU6 = 2, + DEVCONF_ACCEPT_RA = 3, + DEVCONF_ACCEPT_REDIRECTS = 4, + DEVCONF_AUTOCONF = 5, + DEVCONF_DAD_TRANSMITS = 6, + DEVCONF_RTR_SOLICITS = 7, + DEVCONF_RTR_SOLICIT_INTERVAL = 8, + DEVCONF_RTR_SOLICIT_DELAY = 9, + DEVCONF_USE_TEMPADDR = 10, + DEVCONF_TEMP_VALID_LFT = 11, + DEVCONF_TEMP_PREFERED_LFT = 12, + DEVCONF_REGEN_MAX_RETRY = 13, + DEVCONF_MAX_DESYNC_FACTOR = 14, + DEVCONF_MAX_ADDRESSES = 15, + DEVCONF_FORCE_MLD_VERSION = 16, + DEVCONF_ACCEPT_RA_DEFRTR = 17, + DEVCONF_ACCEPT_RA_PINFO = 18, + DEVCONF_ACCEPT_RA_RTR_PREF = 19, + DEVCONF_RTR_PROBE_INTERVAL = 20, + DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN = 21, + DEVCONF_PROXY_NDP = 22, + DEVCONF_OPTIMISTIC_DAD = 23, + DEVCONF_ACCEPT_SOURCE_ROUTE = 24, + DEVCONF_MC_FORWARDING = 25, + DEVCONF_DISABLE_IPV6 = 26, + DEVCONF_ACCEPT_DAD = 27, + DEVCONF_FORCE_TLLAO = 28, + DEVCONF_NDISC_NOTIFY = 29, + DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL = 30, + DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL = 31, + DEVCONF_SUPPRESS_FRAG_NDISC = 32, + DEVCONF_ACCEPT_RA_FROM_LOCAL = 33, + DEVCONF_USE_OPTIMISTIC = 34, + DEVCONF_ACCEPT_RA_MTU = 35, + DEVCONF_STABLE_SECRET = 36, + DEVCONF_USE_OIF_ADDRS_ONLY = 37, + DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT = 38, + DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 39, + DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 40, + DEVCONF_DROP_UNSOLICITED_NA = 41, + DEVCONF_KEEP_ADDR_ON_DOWN = 42, + DEVCONF_RTR_SOLICIT_MAX_INTERVAL = 43, + DEVCONF_SEG6_ENABLED = 44, + DEVCONF_SEG6_REQUIRE_HMAC = 45, + DEVCONF_ENHANCED_DAD = 46, + DEVCONF_ADDR_GEN_MODE = 47, + DEVCONF_DISABLE_POLICY = 48, + DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN = 49, + DEVCONF_NDISC_TCLASS = 50, + DEVCONF_RPL_SEG_ENABLED = 51, + DEVCONF_RA_DEFRTR_METRIC = 52, + DEVCONF_IOAM6_ENABLED = 53, + DEVCONF_IOAM6_ID = 54, + DEVCONF_IOAM6_ID_WIDE = 55, + DEVCONF_NDISC_EVICT_NOCARRIER = 56, + DEVCONF_MAX = 57, +}; + +enum { + INET6_IFADDR_STATE_PREDAD = 0, + INET6_IFADDR_STATE_DAD = 1, + INET6_IFADDR_STATE_POSTDAD = 2, + INET6_IFADDR_STATE_ERRDAD = 3, + INET6_IFADDR_STATE_DEAD = 4, +}; + +union fwnet_hwaddr { + u8 u[16]; + struct { + __be64 uniq_id; + u8 max_rec; + u8 sspd; + __be16 fifo_hi; + __be32 fifo_lo; + } uc; +}; + +struct in6_validator_info { + struct in6_addr i6vi_addr; + struct inet6_dev *i6vi_dev; + struct netlink_ext_ack *extack; +}; + +struct ifa6_config { + const struct in6_addr *pfx; + unsigned int plen; + const struct in6_addr *peer_pfx; + u32 rt_priority; + u32 ifa_flags; + u32 preferred_lft; + u32 valid_lft; + u16 scope; +}; + +enum cleanup_prefix_rt_t { + CLEANUP_PREFIX_RT_NOP = 0, + CLEANUP_PREFIX_RT_DEL = 1, + CLEANUP_PREFIX_RT_EXPIRE = 2, +}; + +enum { + IPV6_SADDR_RULE_INIT = 0, + IPV6_SADDR_RULE_LOCAL = 1, + IPV6_SADDR_RULE_SCOPE = 2, + IPV6_SADDR_RULE_PREFERRED = 3, + IPV6_SADDR_RULE_OIF = 4, + IPV6_SADDR_RULE_LABEL = 5, + IPV6_SADDR_RULE_PRIVACY = 6, + IPV6_SADDR_RULE_ORCHID = 7, + IPV6_SADDR_RULE_PREFIX = 8, + IPV6_SADDR_RULE_MAX = 9, +}; + +struct ipv6_saddr_score { + int rule; + int addr_type; + struct inet6_ifaddr *ifa; + long unsigned int scorebits[1]; + int scopedist; + int matchlen; +}; + +struct ipv6_saddr_dst { + const struct in6_addr *addr; + int ifindex; + int scope; + int label; + unsigned int prefs; +}; + +struct if6_iter_state { + struct seq_net_private p; + int bucket; + int offset; +}; + +enum addr_type_t { + UNICAST_ADDR = 0, + MULTICAST_ADDR = 1, + ANYCAST_ADDR = 2, +}; + +struct inet6_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; + enum addr_type_t type; +}; + +enum { + DAD_PROCESS = 0, + DAD_BEGIN = 1, + DAD_ABORT = 2, +}; + +struct ifaddrlblmsg { + __u8 ifal_family; + __u8 __ifal_reserved; + __u8 ifal_prefixlen; + __u8 ifal_flags; + __u32 ifal_index; + __u32 ifal_seq; +}; + +enum { + IFAL_ADDRESS = 1, + IFAL_LABEL = 2, + __IFAL_MAX = 3, +}; + +struct ip6addrlbl_entry { + struct in6_addr prefix; + int prefixlen; + int ifindex; + int addrtype; + u32 label; + struct hlist_node list; + struct callback_head rcu; +}; + +struct ip6addrlbl_init_table { + const struct in6_addr *prefix; + int prefixlen; + u32 label; +}; + +struct rd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + struct in6_addr dest; + __u8 opt[0]; +}; + +struct fib6_gc_args { + int timeout; + int more; +}; + +struct rt6_exception { + struct hlist_node hlist; + struct rt6_info *rt6i; + long unsigned int stamp; + struct callback_head rcu; +}; + +typedef struct rt6_info * (*pol_lookup_t)(struct net *, struct fib6_table *, struct flowi6 *, const struct sk_buff *, int); + +struct route_info { + __u8 type; + __u8 length; + __u8 prefix_len; + __u8 reserved_l: 3; + __u8 route_pref: 2; + __u8 reserved_h: 3; + __be32 lifetime; + __u8 prefix[0]; +}; + +struct rt6_rtnl_dump_arg { + struct sk_buff *skb; + struct netlink_callback *cb; + struct net *net; + struct fib_dump_filter filter; +}; + +struct netevent_redirect { + struct dst_entry *old; + struct dst_entry *new; + struct neighbour *neigh; + const void *daddr; +}; + +struct trace_event_raw_fib6_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[16]; + __u8 dst[16]; + u16 sport; + u16 dport; + u8 proto; + u8 rt_type; + u32 __data_loc_name; + __u8 gw[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_fib6_table_lookup { + u32 name; +}; + +typedef void (*btf_trace_fib6_table_lookup)(void *, const struct net *, const struct fib6_result *, struct fib6_table *, const struct flowi6 *); + +enum rt6_nud_state { + RT6_NUD_FAIL_HARD = 4294967293, + RT6_NUD_FAIL_PROBE = 4294967294, + RT6_NUD_FAIL_DO_RR = 4294967295, + RT6_NUD_SUCCEED = 1, +}; + +struct fib6_nh_dm_arg { + struct net *net; + const struct in6_addr *saddr; + int oif; + int flags; + struct fib6_nh *nh; +}; + +struct __rt6_probe_work { + struct work_struct work; + struct in6_addr target; + struct net_device *dev; +}; + +struct fib6_nh_frl_arg { + u32 flags; + int oif; + int strict; + int *mpri; + bool *do_rr; + struct fib6_nh *nh; +}; + +struct fib6_nh_excptn_arg { + struct rt6_info *rt; + int plen; +}; + +struct fib6_nh_match_arg { + const struct net_device *dev; + const struct in6_addr *gw; + struct fib6_nh *match; +}; + +struct fib6_nh_age_excptn_arg { + struct fib6_gc_args *gc_args; + long unsigned int now; +}; + +struct fib6_nh_rd_arg { + struct fib6_result *res; + struct flowi6 *fl6; + const struct in6_addr *gw; + struct rt6_info **ret; +}; + +struct ip6rd_flowi { + struct flowi6 fl6; + struct in6_addr gateway; +}; + +struct fib6_nh_del_cached_rt_arg { + struct fib6_config *cfg; + struct fib6_info *f6i; +}; + +struct arg_dev_net_ip { + struct net_device *dev; + struct net *net; + struct in6_addr *addr; +}; + +struct arg_netdev_event { + const struct net_device *dev; + union { + unsigned char nh_flags; + long unsigned int event; + }; +}; + +struct rt6_mtu_change_arg { + struct net_device *dev; + unsigned int mtu; + struct fib6_info *f6i; +}; + +struct rt6_nh { + struct fib6_info *fib6_info; + struct fib6_config r_cfg; + struct list_head next; +}; + +struct fib6_nh_exception_dump_walker { + struct rt6_rtnl_dump_arg *dump; + struct fib6_info *rt; + unsigned int flags; + unsigned int skip; + unsigned int count; +}; + +enum fib6_walk_state { + FWS_S = 0, + FWS_L = 1, + FWS_R = 2, + FWS_C = 3, + FWS_U = 4, +}; + +struct fib6_walker { + struct list_head lh; + struct fib6_node *root; + struct fib6_node *node; + struct fib6_info *leaf; + enum fib6_walk_state state; + unsigned int skip; + unsigned int count; + unsigned int skip_in_node; + int (*func)(struct fib6_walker *); + void *args; +}; + +struct fib6_entry_notifier_info { + struct fib_notifier_info info; + struct fib6_info *rt; + unsigned int nsiblings; +}; + +struct ipv6_route_iter { + struct seq_net_private p; + struct fib6_walker w; + loff_t skip; + struct fib6_table *tbl; + int sernum; +}; + +struct bpf_iter__ipv6_route { + union { + struct bpf_iter_meta *meta; + }; + union { + struct fib6_info *rt; + }; +}; + +struct fib6_cleaner { + struct fib6_walker w; + struct net *net; + int (*func)(struct fib6_info *, void *); + int sernum; + void *arg; + bool skip_notify; +}; + +enum { + FIB6_NO_SERNUM_CHANGE = 0, +}; + +struct fib6_dump_arg { + struct net *net; + struct notifier_block *nb; + struct netlink_ext_ack *extack; +}; + +struct fib6_nh_pcpu_arg { + struct fib6_info *from; + const struct fib6_table *table; +}; + +struct lookup_args { + int offset; + const struct in6_addr *addr; +}; + +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; + int ipv6mr_ifindex; +}; + +struct in6_flowlabel_req { + struct in6_addr flr_dst; + __be32 flr_label; + __u8 flr_action; + __u8 flr_share; + __u16 flr_flags; + __u16 flr_expires; + __u16 flr_linger; + __u32 __flr_pad; +}; + +struct ip6_mtuinfo { + struct sockaddr_in6 ip6m_addr; + __u32 ip6m_mtu; +}; + +struct nduseroptmsg { + unsigned char nduseropt_family; + unsigned char nduseropt_pad1; + short unsigned int nduseropt_opts_len; + int nduseropt_ifindex; + __u8 nduseropt_icmp_type; + __u8 nduseropt_icmp_code; + short unsigned int nduseropt_pad2; + unsigned int nduseropt_pad3; +}; + +enum { + NDUSEROPT_UNSPEC = 0, + NDUSEROPT_SRCADDR = 1, + __NDUSEROPT_MAX = 2, +}; + +struct nd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + __u8 opt[0]; +}; + +struct rs_msg { + struct icmp6hdr icmph; + __u8 opt[0]; +}; + +struct ra_msg { + struct icmp6hdr icmph; + __be32 reachable_time; + __be32 retrans_timer; +}; + +struct icmp6_filter { + __u32 data[8]; +}; + +struct raw6_sock { + struct inet_sock inet; + __u32 checksum; + __u32 offset; + struct icmp6_filter filter; + __u32 ip6mr_table; + struct ipv6_pinfo inet6; +}; + +typedef int mh_filter_t(struct sock *, struct sk_buff *); + +struct raw6_frag_vec { + struct msghdr *msg; + int hlen; + char c[4]; +}; + +struct ipv6_destopt_hao { + __u8 type; + __u8 length; + struct in6_addr addr; +} __attribute__((packed)); + +typedef void ip6_icmp_send_t(struct sk_buff *, u8, u8, __u32, const struct in6_addr *, const struct inet6_skb_parm *); + +struct icmpv6_msg { + struct sk_buff *skb; + int offset; + uint8_t type; +}; + +struct icmp6_err { + int err; + int fatal; +}; + +struct mld_msg { + struct icmp6hdr mld_hdr; + struct in6_addr mld_mca; +}; + +struct mld2_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + struct in6_addr grec_mca; + struct in6_addr grec_src[0]; +}; + +struct mld2_report { + struct icmp6hdr mld2r_hdr; + struct mld2_grec mld2r_grec[0]; +}; + +struct mld2_query { + struct icmp6hdr mld2q_hdr; + struct in6_addr mld2q_mca; + __u8 mld2q_qrv: 3; + __u8 mld2q_suppress: 1; + __u8 mld2q_resv2: 4; + __u8 mld2q_qqic; + __be16 mld2q_nsrcs; + struct in6_addr mld2q_srcs[0]; +}; + +struct igmp6_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; +}; + +struct igmp6_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; + struct ifmcaddr6 *im; +}; + +enum ip6_defrag_users { + IP6_DEFRAG_LOCAL_DELIVER = 0, + IP6_DEFRAG_CONNTRACK_IN = 1, + __IP6_DEFRAG_CONNTRACK_IN = 65536, + IP6_DEFRAG_CONNTRACK_OUT = 65537, + __IP6_DEFRAG_CONNTRACK_OUT = 131072, + IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 131073, + __IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 196608, +}; + +struct frag_queue { + struct inet_frag_queue q; + int iif; + __u16 nhoffset; + u8 ecn; +}; + +struct tcp6_pseudohdr { + struct in6_addr saddr; + struct in6_addr daddr; + __be32 len; + __be32 protocol; +}; + +struct rt0_hdr { + struct ipv6_rt_hdr rt_hdr; + __u32 reserved; + struct in6_addr addr[0]; +}; + +struct ipv6_rpl_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u32 cmpre: 4; + __u32 cmpri: 4; + __u32 reserved: 4; + __u32 pad: 4; + __u32 reserved1: 16; + union { + struct in6_addr addr[0]; + __u8 data[0]; + } segments; +}; + +struct ioam6_hdr { + __u8 opt_type; + __u8 opt_len; + char: 8; + __u8 type; +}; + +struct ioam6_trace_hdr { + __be16 namespace_id; + char: 2; + __u8 overflow: 1; + __u8 nodelen: 5; + __u8 remlen: 7; + union { + __be32 type_be32; + struct { + __u32 bit7: 1; + __u32 bit6: 1; + __u32 bit5: 1; + __u32 bit4: 1; + __u32 bit3: 1; + __u32 bit2: 1; + __u32 bit1: 1; + __u32 bit0: 1; + __u32 bit15: 1; + __u32 bit14: 1; + __u32 bit13: 1; + __u32 bit12: 1; + __u32 bit11: 1; + __u32 bit10: 1; + __u32 bit9: 1; + __u32 bit8: 1; + __u32 bit23: 1; + __u32 bit22: 1; + __u32 bit21: 1; + __u32 bit20: 1; + __u32 bit19: 1; + __u32 bit18: 1; + __u32 bit17: 1; + __u32 bit16: 1; + } type; + }; + __u8 data[0]; +}; + +struct ioam6_schema; + +struct ioam6_namespace { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_schema *schema; + __be16 id; + __be32 data; + __be64 data_wide; +}; + +struct ioam6_schema { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_namespace *ns; + u32 id; + int len; + __be32 hdr; + u8 data[0]; +}; + +struct ip6fl_iter_state { + struct seq_net_private p; + struct pid_namespace *pid_ns; + int bucket; +}; + +struct sr6_tlv { + __u8 type; + __u8 len; + __u8 data[0]; +}; + +enum { + SEG6_ATTR_UNSPEC = 0, + SEG6_ATTR_DST = 1, + SEG6_ATTR_DSTLEN = 2, + SEG6_ATTR_HMACKEYID = 3, + SEG6_ATTR_SECRET = 4, + SEG6_ATTR_SECRETLEN = 5, + SEG6_ATTR_ALGID = 6, + SEG6_ATTR_HMACINFO = 7, + __SEG6_ATTR_MAX = 8, +}; + +enum { + SEG6_CMD_UNSPEC = 0, + SEG6_CMD_SETHMAC = 1, + SEG6_CMD_DUMPHMAC = 2, + SEG6_CMD_SET_TUNSRC = 3, + SEG6_CMD_GET_TUNSRC = 4, + __SEG6_CMD_MAX = 5, +}; + +struct seg6_hmac_info { + struct rhash_head node; + struct callback_head rcu; + u32 hmackeyid; + char secret[64]; + u8 slen; + u8 alg_id; +}; + +enum { + IOAM6_ATTR_UNSPEC = 0, + IOAM6_ATTR_NS_ID = 1, + IOAM6_ATTR_NS_DATA = 2, + IOAM6_ATTR_NS_DATA_WIDE = 3, + IOAM6_ATTR_SC_ID = 4, + IOAM6_ATTR_SC_DATA = 5, + IOAM6_ATTR_SC_NONE = 6, + IOAM6_ATTR_PAD = 7, + __IOAM6_ATTR_MAX = 8, +}; + +enum { + IOAM6_CMD_UNSPEC = 0, + IOAM6_CMD_ADD_NAMESPACE = 1, + IOAM6_CMD_DEL_NAMESPACE = 2, + IOAM6_CMD_DUMP_NAMESPACES = 3, + IOAM6_CMD_ADD_SCHEMA = 4, + IOAM6_CMD_DEL_SCHEMA = 5, + IOAM6_CMD_DUMP_SCHEMAS = 6, + IOAM6_CMD_NS_SET_SCHEMA = 7, + __IOAM6_CMD_MAX = 8, +}; + +typedef short unsigned int mifi_t; + +typedef __u32 if_mask; + +struct if_set { + if_mask ifs_bits[8]; +}; + +struct mif6ctl { + mifi_t mif6c_mifi; + unsigned char mif6c_flags; + unsigned char vifc_threshold; + __u16 mif6c_pifi; + unsigned int vifc_rate_limit; +}; + +struct mf6cctl { + struct sockaddr_in6 mf6cc_origin; + struct sockaddr_in6 mf6cc_mcastgrp; + mifi_t mf6cc_parent; + struct if_set mf6cc_ifset; +}; + +struct sioc_sg_req6 { + struct sockaddr_in6 src; + struct sockaddr_in6 grp; + long unsigned int pktcnt; + long unsigned int bytecnt; + long unsigned int wrong_if; +}; + +struct sioc_mif_req6 { + mifi_t mifi; + long unsigned int icount; + long unsigned int ocount; + long unsigned int ibytes; + long unsigned int obytes; +}; + +struct mrt6msg { + __u8 im6_mbz; + __u8 im6_msgtype; + __u16 im6_mif; + __u32 im6_pad; + struct in6_addr im6_src; + struct in6_addr im6_dst; +}; + +enum { + IP6MRA_CREPORT_UNSPEC = 0, + IP6MRA_CREPORT_MSGTYPE = 1, + IP6MRA_CREPORT_MIF_ID = 2, + IP6MRA_CREPORT_SRC_ADDR = 3, + IP6MRA_CREPORT_DST_ADDR = 4, + IP6MRA_CREPORT_PKT = 5, + __IP6MRA_CREPORT_MAX = 6, +}; + +struct mfc6_cache_cmp_arg { + struct in6_addr mf6c_mcastgrp; + struct in6_addr mf6c_origin; +}; + +struct mfc6_cache { + struct mr_mfc _c; + union { + struct { + struct in6_addr mf6c_mcastgrp; + struct in6_addr mf6c_origin; + }; + struct mfc6_cache_cmp_arg cmparg; + }; +}; + +struct ip6mr_result { + struct mr_table *mrt; +}; + +struct compat_sioc_sg_req6 { + struct sockaddr_in6 src; + struct sockaddr_in6 grp; + compat_ulong_t pktcnt; + compat_ulong_t bytecnt; + compat_ulong_t wrong_if; +}; + +struct compat_sioc_mif_req6 { + mifi_t mifi; + compat_ulong_t icount; + compat_ulong_t ocount; + compat_ulong_t ibytes; + compat_ulong_t obytes; +}; + +struct xfrm6_protocol { + int (*handler)(struct sk_buff *); + int (*input_handler)(struct sk_buff *, int, __be32, int); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + struct xfrm6_protocol *next; + int priority; +}; + +struct br_input_skb_cb { + struct net_device *brdev; + u16 frag_max_size; + u8 igmp; + u8 mrouters_only: 1; + u8 proxyarp_replied: 1; + u8 src_port_isolated: 1; + u8 vlan_filtered: 1; + u8 br_netfilter_broute: 1; + u8 tx_fwd_offload: 1; + int src_hwdom; + long unsigned int fwd_hwdoms; +}; + +struct nf_bridge_frag_data; + +struct fib6_rule { + struct fib_rule common; + struct rt6key src; + struct rt6key dst; + u8 tclass; +}; + +struct calipso_doi; + +struct netlbl_calipso_ops { + int (*doi_add)(struct calipso_doi *, struct netlbl_audit *); + void (*doi_free)(struct calipso_doi *); + int (*doi_remove)(u32, struct netlbl_audit *); + struct calipso_doi * (*doi_getdef)(u32); + void (*doi_putdef)(struct calipso_doi *); + int (*doi_walk)(u32 *, int (*)(struct calipso_doi *, void *), void *); + int (*sock_getattr)(struct sock *, struct netlbl_lsm_secattr *); + int (*sock_setattr)(struct sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + void (*sock_delattr)(struct sock *); + int (*req_setattr)(struct request_sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + void (*req_delattr)(struct request_sock *); + int (*opt_getattr)(const unsigned char *, struct netlbl_lsm_secattr *); + unsigned char * (*skbuff_optptr)(const struct sk_buff *); + int (*skbuff_setattr)(struct sk_buff *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + int (*skbuff_delattr)(struct sk_buff *); + void (*cache_invalidate)(); + int (*cache_add)(const unsigned char *, const struct netlbl_lsm_secattr *); +}; + +struct calipso_doi { + u32 doi; + u32 type; + refcount_t refcount; + struct list_head list; + struct callback_head rcu; +}; + +struct calipso_map_cache_bkt { + spinlock_t lock; + u32 size; + struct list_head list; +}; + +struct calipso_map_cache_entry { + u32 hash; + unsigned char *key; + size_t key_len; + struct netlbl_lsm_cache *lsm_data; + u32 activity; + struct list_head list; +}; + +enum { + SEG6_IPTUNNEL_UNSPEC = 0, + SEG6_IPTUNNEL_SRH = 1, + __SEG6_IPTUNNEL_MAX = 2, +}; + +struct seg6_iptunnel_encap { + int mode; + struct ipv6_sr_hdr srh[0]; +}; + +enum { + SEG6_IPTUN_MODE_INLINE = 0, + SEG6_IPTUN_MODE_ENCAP = 1, + SEG6_IPTUN_MODE_L2ENCAP = 2, +}; + +struct seg6_lwt { + struct dst_cache cache; + struct seg6_iptunnel_encap tuninfo[0]; +}; + +enum l3mdev_type { + L3MDEV_TYPE_UNSPEC = 0, + L3MDEV_TYPE_VRF = 1, + __L3MDEV_TYPE_MAX = 2, +}; + +enum { + IP6_FH_F_FRAG = 1, + IP6_FH_F_AUTH = 2, + IP6_FH_F_SKIP_RH = 4, +}; + +enum { + SEG6_LOCAL_UNSPEC = 0, + SEG6_LOCAL_ACTION = 1, + SEG6_LOCAL_SRH = 2, + SEG6_LOCAL_TABLE = 3, + SEG6_LOCAL_NH4 = 4, + SEG6_LOCAL_NH6 = 5, + SEG6_LOCAL_IIF = 6, + SEG6_LOCAL_OIF = 7, + SEG6_LOCAL_BPF = 8, + SEG6_LOCAL_VRFTABLE = 9, + SEG6_LOCAL_COUNTERS = 10, + __SEG6_LOCAL_MAX = 11, +}; + +enum { + SEG6_LOCAL_BPF_PROG_UNSPEC = 0, + SEG6_LOCAL_BPF_PROG = 1, + SEG6_LOCAL_BPF_PROG_NAME = 2, + __SEG6_LOCAL_BPF_PROG_MAX = 3, +}; + +enum { + SEG6_LOCAL_CNT_UNSPEC = 0, + SEG6_LOCAL_CNT_PAD = 1, + SEG6_LOCAL_CNT_PACKETS = 2, + SEG6_LOCAL_CNT_BYTES = 3, + SEG6_LOCAL_CNT_ERRORS = 4, + __SEG6_LOCAL_CNT_MAX = 5, +}; + +struct seg6_local_lwt; + +struct seg6_local_lwtunnel_ops { + int (*build_state)(struct seg6_local_lwt *, const void *, struct netlink_ext_ack *); + void (*destroy_state)(struct seg6_local_lwt *); +}; + +enum seg6_end_dt_mode { + DT_INVALID_MODE = 4294967274, + DT_LEGACY_MODE = 0, + DT_VRF_MODE = 1, +}; + +struct seg6_end_dt_info { + enum seg6_end_dt_mode mode; + struct net *net; + int vrf_ifindex; + int vrf_table; + u16 family; +}; + +struct pcpu_seg6_local_counters; + +struct seg6_action_desc; + +struct seg6_local_lwt { + int action; + struct ipv6_sr_hdr *srh; + int table; + struct in_addr nh4; + struct in6_addr nh6; + int iif; + int oif; + struct bpf_lwt_prog bpf; + struct seg6_end_dt_info dt_info; + struct pcpu_seg6_local_counters *pcpu_counters; + int headroom; + struct seg6_action_desc *desc; + long unsigned int parsed_optattrs; +}; + +struct seg6_action_desc { + int action; + long unsigned int attrs; + long unsigned int optattrs; + int (*input)(struct sk_buff *, struct seg6_local_lwt *); + int static_headroom; + struct seg6_local_lwtunnel_ops slwt_ops; +}; + +struct pcpu_seg6_local_counters { + u64_stats_t packets; + u64_stats_t bytes; + u64_stats_t errors; + struct u64_stats_sync syncp; +}; + +struct seg6_local_counters { + __u64 packets; + __u64 bytes; + __u64 errors; +}; + +struct seg6_action_param { + int (*parse)(struct nlattr **, struct seg6_local_lwt *); + int (*put)(struct sk_buff *, struct seg6_local_lwt *); + int (*cmp)(struct seg6_local_lwt *, struct seg6_local_lwt *); + void (*destroy)(struct seg6_local_lwt *); +}; + +struct sr6_tlv_hmac { + struct sr6_tlv tlvhdr; + __u16 reserved; + __be32 hmackeyid; + __u8 hmac[32]; +}; + +enum { + SEG6_HMAC_ALGO_SHA1 = 1, + SEG6_HMAC_ALGO_SHA256 = 2, +}; + +struct seg6_hmac_algo { + u8 alg_id; + char name[64]; + struct crypto_shash **tfms; + struct shash_desc **shashs; +}; + +enum { + __IOAM6_IPTUNNEL_MODE_MIN = 0, + IOAM6_IPTUNNEL_MODE_INLINE = 1, + IOAM6_IPTUNNEL_MODE_ENCAP = 2, + IOAM6_IPTUNNEL_MODE_AUTO = 3, + __IOAM6_IPTUNNEL_MODE_MAX = 4, +}; + +enum { + IOAM6_IPTUNNEL_UNSPEC = 0, + IOAM6_IPTUNNEL_MODE = 1, + IOAM6_IPTUNNEL_DST = 2, + IOAM6_IPTUNNEL_TRACE = 3, + __IOAM6_IPTUNNEL_MAX = 4, +}; + +struct ioam6_lwt_encap { + struct ipv6_opt_hdr eh; + u8 pad[2]; + struct ioam6_hdr ioamh; + struct ioam6_trace_hdr traceh; +}; + +struct ioam6_lwt { + struct dst_cache cache; + u8 mode; + struct in6_addr tundst; + struct ioam6_lwt_encap tuninfo; +}; + +struct sockaddr_pkt { + short unsigned int spkt_family; + unsigned char spkt_device[14]; + __be16 spkt_protocol; +}; + +struct sockaddr_ll { + short unsigned int sll_family; + __be16 sll_protocol; + int sll_ifindex; + short unsigned int sll_hatype; + unsigned char sll_pkttype; + unsigned char sll_halen; + unsigned char sll_addr[8]; +}; + +struct tpacket_stats { + unsigned int tp_packets; + unsigned int tp_drops; +}; + +struct tpacket_stats_v3 { + unsigned int tp_packets; + unsigned int tp_drops; + unsigned int tp_freeze_q_cnt; +}; + +struct tpacket_rollover_stats { + __u64 tp_all; + __u64 tp_huge; + __u64 tp_failed; +}; + +union tpacket_stats_u { + struct tpacket_stats stats1; + struct tpacket_stats_v3 stats3; +}; + +struct tpacket_auxdata { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; +}; + +struct tpacket_hdr { + long unsigned int tp_status; + unsigned int tp_len; + unsigned int tp_snaplen; + short unsigned int tp_mac; + short unsigned int tp_net; + unsigned int tp_sec; + unsigned int tp_usec; +}; + +struct tpacket2_hdr { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u32 tp_sec; + __u32 tp_nsec; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u8 tp_padding[4]; +}; + +struct tpacket_hdr_variant1 { + __u32 tp_rxhash; + __u32 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u16 tp_padding; +}; + +struct tpacket3_hdr { + __u32 tp_next_offset; + __u32 tp_sec; + __u32 tp_nsec; + __u32 tp_snaplen; + __u32 tp_len; + __u32 tp_status; + __u16 tp_mac; + __u16 tp_net; + union { + struct tpacket_hdr_variant1 hv1; + }; + __u8 tp_padding[8]; +}; + +struct tpacket_bd_ts { + unsigned int ts_sec; + union { + unsigned int ts_usec; + unsigned int ts_nsec; + }; +}; + +struct tpacket_hdr_v1 { + __u32 block_status; + __u32 num_pkts; + __u32 offset_to_first_pkt; + __u32 blk_len; + __u64 seq_num; + struct tpacket_bd_ts ts_first_pkt; + struct tpacket_bd_ts ts_last_pkt; +}; + +union tpacket_bd_header_u { + struct tpacket_hdr_v1 bh1; +}; + +struct tpacket_block_desc { + __u32 version; + __u32 offset_to_priv; + union tpacket_bd_header_u hdr; +}; + +enum tpacket_versions { + TPACKET_V1 = 0, + TPACKET_V2 = 1, + TPACKET_V3 = 2, +}; + +struct tpacket_req { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; +}; + +struct tpacket_req3 { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; + unsigned int tp_retire_blk_tov; + unsigned int tp_sizeof_priv; + unsigned int tp_feature_req_word; +}; + +union tpacket_req_u { + struct tpacket_req req; + struct tpacket_req3 req3; +}; + +struct fanout_args { + __u16 id; + __u16 type_flags; + __u32 max_num_members; +}; + +struct packet_mclist { + struct packet_mclist *next; + int ifindex; + int count; + short unsigned int type; + short unsigned int alen; + unsigned char addr[32]; +}; + +struct pgv; + +struct tpacket_kbdq_core { + struct pgv *pkbdq; + unsigned int feature_req_word; + unsigned int hdrlen; + unsigned char reset_pending_on_curr_blk; + unsigned char delete_blk_timer; + short unsigned int kactive_blk_num; + short unsigned int blk_sizeof_priv; + short unsigned int last_kactive_blk_num; + char *pkblk_start; + char *pkblk_end; + int kblk_size; + unsigned int max_frame_len; + unsigned int knum_blocks; + uint64_t knxt_seq_num; + char *prev; + char *nxt_offset; + struct sk_buff *skb; + rwlock_t blk_fill_in_prog_lock; + short unsigned int retire_blk_tov; + short unsigned int version; + long unsigned int tov_in_jiffies; + struct timer_list retire_blk_timer; +}; + +struct pgv { + char *buffer; +}; + +struct packet_ring_buffer { + struct pgv *pg_vec; + unsigned int head; + unsigned int frames_per_block; + unsigned int frame_size; + unsigned int frame_max; + unsigned int pg_vec_order; + unsigned int pg_vec_pages; + unsigned int pg_vec_len; + unsigned int *pending_refcnt; + union { + long unsigned int *rx_owner_map; + struct tpacket_kbdq_core prb_bdqc; + }; +}; + +struct packet_fanout { + possible_net_t net; + unsigned int num_members; + u32 max_num_members; + u16 id; + u8 type; + u8 flags; + union { + atomic_t rr_cur; + struct bpf_prog *bpf_prog; + }; + struct list_head list; + spinlock_t lock; + refcount_t sk_ref; + long: 64; + struct packet_type prot_hook; + struct sock *arr[0]; +}; + +struct packet_rollover { + int sock; + atomic_long_t num; + atomic_long_t num_huge; + atomic_long_t num_failed; + long: 64; + long: 64; + long: 64; + long: 64; + u32 history[16]; +}; + +struct packet_sock { + struct sock sk; + struct packet_fanout *fanout; + union tpacket_stats_u stats; + struct packet_ring_buffer rx_ring; + struct packet_ring_buffer tx_ring; + int copy_thresh; + spinlock_t bind_lock; + struct mutex pg_vec_lock; + unsigned int running; + unsigned int auxdata: 1; + unsigned int origdev: 1; + unsigned int has_vnet_hdr: 1; + unsigned int tp_loss: 1; + unsigned int tp_tx_has_off: 1; + int pressure; + int ifindex; + __be16 num; + struct packet_rollover *rollover; + struct packet_mclist *mclist; + atomic_t mapped; + enum tpacket_versions tp_version; + unsigned int tp_hdrlen; + unsigned int tp_reserve; + unsigned int tp_tstamp; + struct completion skb_completion; + struct net_device *cached_dev; + int (*xmit)(struct sk_buff *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct packet_type prot_hook; + atomic_t tp_drops; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct packet_mreq_max { + int mr_ifindex; + short unsigned int mr_type; + short unsigned int mr_alen; + unsigned char mr_address[32]; +}; + +union tpacket_uhdr { + struct tpacket_hdr *h1; + struct tpacket2_hdr *h2; + struct tpacket3_hdr *h3; + void *raw; +}; + +struct packet_skb_cb { + union { + struct sockaddr_pkt pkt; + union { + unsigned int origlen; + struct sockaddr_ll ll; + }; + } sa; +}; + +struct vlan_group { + unsigned int nr_vlan_devs; + struct hlist_node hlist; + struct net_device **vlan_devices_arrays[16]; +}; + +struct vlan_info { + struct net_device *real_dev; + struct vlan_group grp; + struct list_head vid_list; + unsigned int nr_vids; + struct callback_head rcu; +}; + +enum vlan_flags { + VLAN_FLAG_REORDER_HDR = 1, + VLAN_FLAG_GVRP = 2, + VLAN_FLAG_LOOSE_BINDING = 4, + VLAN_FLAG_MVRP = 8, + VLAN_FLAG_BRIDGE_BINDING = 16, +}; + +struct vlan_priority_tci_mapping { + u32 priority; + u16 vlan_qos; + struct vlan_priority_tci_mapping *next; +}; + +struct vlan_dev_priv { + unsigned int nr_ingress_mappings; + u32 ingress_priority_map[8]; + unsigned int nr_egress_mappings; + struct vlan_priority_tci_mapping *egress_priority_map[16]; + __be16 vlan_proto; + u16 vlan_id; + u16 flags; + struct net_device *real_dev; + unsigned char real_dev_addr[6]; + struct proc_dir_entry *dent; + struct vlan_pcpu_stats *vlan_pcpu_stats; + struct netpoll *netpoll; +}; + +enum vlan_protos { + VLAN_PROTO_8021Q = 0, + VLAN_PROTO_8021AD = 1, + VLAN_PROTO_NUM = 2, +}; + +struct vlan_vid_info { + struct list_head list; + __be16 proto; + u16 vid; + int refcount; +}; + +enum nl80211_iftype { + NL80211_IFTYPE_UNSPECIFIED = 0, + NL80211_IFTYPE_ADHOC = 1, + NL80211_IFTYPE_STATION = 2, + NL80211_IFTYPE_AP = 3, + NL80211_IFTYPE_AP_VLAN = 4, + NL80211_IFTYPE_WDS = 5, + NL80211_IFTYPE_MONITOR = 6, + NL80211_IFTYPE_MESH_POINT = 7, + NL80211_IFTYPE_P2P_CLIENT = 8, + NL80211_IFTYPE_P2P_GO = 9, + NL80211_IFTYPE_P2P_DEVICE = 10, + NL80211_IFTYPE_OCB = 11, + NL80211_IFTYPE_NAN = 12, + NUM_NL80211_IFTYPES = 13, + NL80211_IFTYPE_MAX = 12, +}; + +struct cfg80211_conn; + +struct cfg80211_cached_keys; + +enum ieee80211_bss_type { + IEEE80211_BSS_TYPE_ESS = 0, + IEEE80211_BSS_TYPE_PBSS = 1, + IEEE80211_BSS_TYPE_IBSS = 2, + IEEE80211_BSS_TYPE_MBSS = 3, + IEEE80211_BSS_TYPE_ANY = 4, +}; + +struct cfg80211_internal_bss; + +enum nl80211_chan_width { + NL80211_CHAN_WIDTH_20_NOHT = 0, + NL80211_CHAN_WIDTH_20 = 1, + NL80211_CHAN_WIDTH_40 = 2, + NL80211_CHAN_WIDTH_80 = 3, + NL80211_CHAN_WIDTH_80P80 = 4, + NL80211_CHAN_WIDTH_160 = 5, + NL80211_CHAN_WIDTH_5 = 6, + NL80211_CHAN_WIDTH_10 = 7, + NL80211_CHAN_WIDTH_1 = 8, + NL80211_CHAN_WIDTH_2 = 9, + NL80211_CHAN_WIDTH_4 = 10, + NL80211_CHAN_WIDTH_8 = 11, + NL80211_CHAN_WIDTH_16 = 12, +}; + +enum ieee80211_edmg_bw_config { + IEEE80211_EDMG_BW_CONFIG_4 = 4, + IEEE80211_EDMG_BW_CONFIG_5 = 5, + IEEE80211_EDMG_BW_CONFIG_6 = 6, + IEEE80211_EDMG_BW_CONFIG_7 = 7, + IEEE80211_EDMG_BW_CONFIG_8 = 8, + IEEE80211_EDMG_BW_CONFIG_9 = 9, + IEEE80211_EDMG_BW_CONFIG_10 = 10, + IEEE80211_EDMG_BW_CONFIG_11 = 11, + IEEE80211_EDMG_BW_CONFIG_12 = 12, + IEEE80211_EDMG_BW_CONFIG_13 = 13, + IEEE80211_EDMG_BW_CONFIG_14 = 14, + IEEE80211_EDMG_BW_CONFIG_15 = 15, +}; + +struct ieee80211_edmg { + u8 channels; + enum ieee80211_edmg_bw_config bw_config; +}; + +struct ieee80211_channel; + +struct cfg80211_chan_def { + struct ieee80211_channel *chan; + enum nl80211_chan_width width; + u32 center_freq1; + u32 center_freq2; + struct ieee80211_edmg edmg; + u16 freq1_offset; +}; + +struct ieee80211_mcs_info { + u8 rx_mask[10]; + __le16 rx_highest; + u8 tx_params; + u8 reserved[3]; +}; + +struct ieee80211_ht_cap { + __le16 cap_info; + u8 ampdu_params_info; + struct ieee80211_mcs_info mcs; + __le16 extended_ht_cap_info; + __le32 tx_BF_cap_info; + u8 antenna_selection_info; +} __attribute__((packed)); + +struct key_params; + +struct cfg80211_ibss_params { + const u8 *ssid; + const u8 *bssid; + struct cfg80211_chan_def chandef; + const u8 *ie; + u8 ssid_len; + u8 ie_len; + u16 beacon_interval; + u32 basic_rates; + bool channel_fixed; + bool privacy; + bool control_port; + bool control_port_over_nl80211; + bool userspace_handles_dfs; + int: 24; + int mcast_rate[6]; + struct ieee80211_ht_cap ht_capa; + struct ieee80211_ht_cap ht_capa_mask; + int: 32; + struct key_params *wep_keys; + int wep_tx_key; + int: 32; +} __attribute__((packed)); + +enum nl80211_auth_type { + NL80211_AUTHTYPE_OPEN_SYSTEM = 0, + NL80211_AUTHTYPE_SHARED_KEY = 1, + NL80211_AUTHTYPE_FT = 2, + NL80211_AUTHTYPE_NETWORK_EAP = 3, + NL80211_AUTHTYPE_SAE = 4, + NL80211_AUTHTYPE_FILS_SK = 5, + NL80211_AUTHTYPE_FILS_SK_PFS = 6, + NL80211_AUTHTYPE_FILS_PK = 7, + __NL80211_AUTHTYPE_NUM = 8, + NL80211_AUTHTYPE_MAX = 7, + NL80211_AUTHTYPE_AUTOMATIC = 8, +}; + +enum nl80211_mfp { + NL80211_MFP_NO = 0, + NL80211_MFP_REQUIRED = 1, + NL80211_MFP_OPTIONAL = 2, +}; + +enum nl80211_sae_pwe_mechanism { + NL80211_SAE_PWE_UNSPECIFIED = 0, + NL80211_SAE_PWE_HUNT_AND_PECK = 1, + NL80211_SAE_PWE_HASH_TO_ELEMENT = 2, + NL80211_SAE_PWE_BOTH = 3, +}; + +struct cfg80211_crypto_settings { + u32 wpa_versions; + u32 cipher_group; + int n_ciphers_pairwise; + u32 ciphers_pairwise[5]; + int n_akm_suites; + u32 akm_suites[2]; + bool control_port; + __be16 control_port_ethertype; + bool control_port_no_encrypt; + bool control_port_over_nl80211; + bool control_port_no_preauth; + struct key_params *wep_keys; + int wep_tx_key; + const u8 *psk; + const u8 *sae_pwd; + u8 sae_pwd_len; + enum nl80211_sae_pwe_mechanism sae_pwe; +}; + +struct ieee80211_vht_mcs_info { + __le16 rx_mcs_map; + __le16 rx_highest; + __le16 tx_mcs_map; + __le16 tx_highest; +}; + +struct ieee80211_vht_cap { + __le32 vht_cap_info; + struct ieee80211_vht_mcs_info supp_mcs; +}; + +enum nl80211_bss_select_attr { + __NL80211_BSS_SELECT_ATTR_INVALID = 0, + NL80211_BSS_SELECT_ATTR_RSSI = 1, + NL80211_BSS_SELECT_ATTR_BAND_PREF = 2, + NL80211_BSS_SELECT_ATTR_RSSI_ADJUST = 3, + __NL80211_BSS_SELECT_ATTR_AFTER_LAST = 4, + NL80211_BSS_SELECT_ATTR_MAX = 3, +}; + +enum nl80211_band { + NL80211_BAND_2GHZ = 0, + NL80211_BAND_5GHZ = 1, + NL80211_BAND_60GHZ = 2, + NL80211_BAND_6GHZ = 3, + NL80211_BAND_S1GHZ = 4, + NL80211_BAND_LC = 5, + NUM_NL80211_BANDS = 6, +}; + +struct cfg80211_bss_select_adjust { + enum nl80211_band band; + s8 delta; +}; + +struct cfg80211_bss_selection { + enum nl80211_bss_select_attr behaviour; + union { + enum nl80211_band band_pref; + struct cfg80211_bss_select_adjust adjust; + } param; +}; + +struct cfg80211_connect_params { + struct ieee80211_channel *channel; + struct ieee80211_channel *channel_hint; + const u8 *bssid; + const u8 *bssid_hint; + const u8 *ssid; + size_t ssid_len; + enum nl80211_auth_type auth_type; + int: 32; + const u8 *ie; + size_t ie_len; + bool privacy; + int: 24; + enum nl80211_mfp mfp; + struct cfg80211_crypto_settings crypto; + const u8 *key; + u8 key_len; + u8 key_idx; + short: 16; + u32 flags; + int bg_scan_period; + struct ieee80211_ht_cap ht_capa; + struct ieee80211_ht_cap ht_capa_mask; + struct ieee80211_vht_cap vht_capa; + struct ieee80211_vht_cap vht_capa_mask; + bool pbss; + int: 24; + struct cfg80211_bss_selection bss_select; + const u8 *prev_bssid; + const u8 *fils_erp_username; + size_t fils_erp_username_len; + const u8 *fils_erp_realm; + size_t fils_erp_realm_len; + u16 fils_erp_next_seq_num; + long: 48; + const u8 *fils_erp_rrk; + size_t fils_erp_rrk_len; + bool want_1x; + int: 24; + struct ieee80211_edmg edmg; + int: 32; +} __attribute__((packed)); + +struct cfg80211_cqm_config; + +struct wiphy; + +struct wireless_dev { + struct wiphy *wiphy; + enum nl80211_iftype iftype; + struct list_head list; + struct net_device *netdev; + u32 identifier; + struct list_head mgmt_registrations; + u8 mgmt_registrations_need_update: 1; + struct mutex mtx; + bool use_4addr; + bool is_running; + bool registered; + bool registering; + u8 address[6]; + u8 ssid[32]; + u8 ssid_len; + u8 mesh_id_len; + u8 mesh_id_up_len; + struct cfg80211_conn *conn; + struct cfg80211_cached_keys *connect_keys; + enum ieee80211_bss_type conn_bss_type; + u32 conn_owner_nlportid; + struct work_struct disconnect_wk; + u8 disconnect_bssid[6]; + struct list_head event_list; + spinlock_t event_lock; + struct cfg80211_internal_bss *current_bss; + struct cfg80211_chan_def preset_chandef; + struct cfg80211_chan_def chandef; + bool ibss_fixed; + bool ibss_dfs_possible; + bool ps; + int ps_timeout; + int beacon_interval; + u32 ap_unexpected_nlportid; + u32 owner_nlportid; + bool nl_owner_dead; + bool cac_started; + long unsigned int cac_start_time; + unsigned int cac_time_ms; + struct { + struct cfg80211_ibss_params ibss; + struct cfg80211_connect_params connect; + struct cfg80211_cached_keys *keys; + const u8 *ie; + size_t ie_len; + u8 bssid[6]; + u8 prev_bssid[6]; + u8 ssid[32]; + s8 default_key; + s8 default_mgmt_key; + bool prev_bssid_valid; + } wext; + struct cfg80211_cqm_config *cqm_config; + struct list_head pmsr_list; + spinlock_t pmsr_lock; + struct work_struct pmsr_free_wk; + long unsigned int unprot_beacon_reported; +}; + +struct iw_encode_ext { + __u32 ext_flags; + __u8 tx_seq[8]; + __u8 rx_seq[8]; + struct sockaddr addr; + __u16 alg; + __u16 key_len; + __u8 key[0]; +}; + +struct iwreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union iwreq_data u; +}; + +struct iw_event { + __u16 len; + __u16 cmd; + union iwreq_data u; +}; + +struct compat_iw_point { + compat_caddr_t pointer; + __u16 length; + __u16 flags; +}; + +struct __compat_iw_event { + __u16 len; + __u16 cmd; + compat_caddr_t pointer; +}; + +enum nl80211_reg_initiator { + NL80211_REGDOM_SET_BY_CORE = 0, + NL80211_REGDOM_SET_BY_USER = 1, + NL80211_REGDOM_SET_BY_DRIVER = 2, + NL80211_REGDOM_SET_BY_COUNTRY_IE = 3, +}; + +enum nl80211_dfs_regions { + NL80211_DFS_UNSET = 0, + NL80211_DFS_FCC = 1, + NL80211_DFS_ETSI = 2, + NL80211_DFS_JP = 3, +}; + +enum nl80211_user_reg_hint_type { + NL80211_USER_REG_HINT_USER = 0, + NL80211_USER_REG_HINT_CELL_BASE = 1, + NL80211_USER_REG_HINT_INDOOR = 2, +}; + +enum nl80211_mntr_flags { + __NL80211_MNTR_FLAG_INVALID = 0, + NL80211_MNTR_FLAG_FCSFAIL = 1, + NL80211_MNTR_FLAG_PLCPFAIL = 2, + NL80211_MNTR_FLAG_CONTROL = 3, + NL80211_MNTR_FLAG_OTHER_BSS = 4, + NL80211_MNTR_FLAG_COOK_FRAMES = 5, + NL80211_MNTR_FLAG_ACTIVE = 6, + __NL80211_MNTR_FLAG_AFTER_LAST = 7, + NL80211_MNTR_FLAG_MAX = 6, +}; + +enum nl80211_key_mode { + NL80211_KEY_RX_TX = 0, + NL80211_KEY_NO_TX = 1, + NL80211_KEY_SET_TX = 2, +}; + +enum nl80211_bss_scan_width { + NL80211_BSS_CHAN_WIDTH_20 = 0, + NL80211_BSS_CHAN_WIDTH_10 = 1, + NL80211_BSS_CHAN_WIDTH_5 = 2, + NL80211_BSS_CHAN_WIDTH_1 = 3, + NL80211_BSS_CHAN_WIDTH_2 = 4, +}; + +struct nl80211_wowlan_tcp_data_seq { + __u32 start; + __u32 offset; + __u32 len; +}; + +struct nl80211_wowlan_tcp_data_token { + __u32 offset; + __u32 len; + __u8 token_stream[0]; +}; + +struct nl80211_wowlan_tcp_data_token_feature { + __u32 min_len; + __u32 max_len; + __u32 bufsize; +}; + +enum nl80211_ext_feature_index { + NL80211_EXT_FEATURE_VHT_IBSS = 0, + NL80211_EXT_FEATURE_RRM = 1, + NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER = 2, + NL80211_EXT_FEATURE_SCAN_START_TIME = 3, + NL80211_EXT_FEATURE_BSS_PARENT_TSF = 4, + NL80211_EXT_FEATURE_SET_SCAN_DWELL = 5, + NL80211_EXT_FEATURE_BEACON_RATE_LEGACY = 6, + NL80211_EXT_FEATURE_BEACON_RATE_HT = 7, + NL80211_EXT_FEATURE_BEACON_RATE_VHT = 8, + NL80211_EXT_FEATURE_FILS_STA = 9, + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA = 10, + NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED = 11, + NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI = 12, + NL80211_EXT_FEATURE_CQM_RSSI_LIST = 13, + NL80211_EXT_FEATURE_FILS_SK_OFFLOAD = 14, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK = 15, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X = 16, + NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME = 17, + NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP = 18, + NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE = 19, + NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION = 20, + NL80211_EXT_FEATURE_MFP_OPTIONAL = 21, + NL80211_EXT_FEATURE_LOW_SPAN_SCAN = 22, + NL80211_EXT_FEATURE_LOW_POWER_SCAN = 23, + NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN = 24, + NL80211_EXT_FEATURE_DFS_OFFLOAD = 25, + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211 = 26, + NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT = 27, + NL80211_EXT_FEATURE_DATA_ACK_SIGNAL_SUPPORT = 27, + NL80211_EXT_FEATURE_TXQS = 28, + NL80211_EXT_FEATURE_SCAN_RANDOM_SN = 29, + NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT = 30, + NL80211_EXT_FEATURE_CAN_REPLACE_PTK0 = 31, + NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER = 32, + NL80211_EXT_FEATURE_AIRTIME_FAIRNESS = 33, + NL80211_EXT_FEATURE_AP_PMKSA_CACHING = 34, + NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD = 35, + NL80211_EXT_FEATURE_EXT_KEY_ID = 36, + NL80211_EXT_FEATURE_STA_TX_PWR = 37, + NL80211_EXT_FEATURE_SAE_OFFLOAD = 38, + NL80211_EXT_FEATURE_VLAN_OFFLOAD = 39, + NL80211_EXT_FEATURE_AQL = 40, + NL80211_EXT_FEATURE_BEACON_PROTECTION = 41, + NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH = 42, + NL80211_EXT_FEATURE_PROTECTED_TWT = 43, + NL80211_EXT_FEATURE_DEL_IBSS_STA = 44, + NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS = 45, + NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT = 46, + NL80211_EXT_FEATURE_SCAN_FREQ_KHZ = 47, + NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS = 48, + NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION = 49, + NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK = 50, + NL80211_EXT_FEATURE_SAE_OFFLOAD_AP = 51, + NL80211_EXT_FEATURE_FILS_DISCOVERY = 52, + NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP = 53, + NL80211_EXT_FEATURE_BEACON_RATE_HE = 54, + NL80211_EXT_FEATURE_SECURE_LTF = 55, + NL80211_EXT_FEATURE_SECURE_RTT = 56, + NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE = 57, + NL80211_EXT_FEATURE_BSS_COLOR = 58, + NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD = 59, + NUM_NL80211_EXT_FEATURES = 60, + MAX_NL80211_EXT_FEATURES = 59, +}; + +enum nl80211_dfs_state { + NL80211_DFS_USABLE = 0, + NL80211_DFS_UNAVAILABLE = 1, + NL80211_DFS_AVAILABLE = 2, +}; + +struct nl80211_vendor_cmd_info { + __u32 vendor_id; + __u32 subcmd; +}; + +enum nl80211_sar_type { + NL80211_SAR_TYPE_POWER = 0, + NUM_NL80211_SAR_TYPE = 1, +}; + +struct ieee80211_he_cap_elem { + u8 mac_cap_info[6]; + u8 phy_cap_info[11]; +}; + +struct ieee80211_he_mcs_nss_supp { + __le16 rx_mcs_80; + __le16 tx_mcs_80; + __le16 rx_mcs_160; + __le16 tx_mcs_160; + __le16 rx_mcs_80p80; + __le16 tx_mcs_80p80; +}; + +struct ieee80211_he_6ghz_capa { + __le16 capa; +}; + +struct rfkill; + +enum environment_cap { + ENVIRON_ANY = 0, + ENVIRON_INDOOR = 1, + ENVIRON_OUTDOOR = 2, +}; + +struct regulatory_request { + struct callback_head callback_head; + int wiphy_idx; + enum nl80211_reg_initiator initiator; + enum nl80211_user_reg_hint_type user_reg_hint_type; + char alpha2[3]; + enum nl80211_dfs_regions dfs_region; + bool intersect; + bool processed; + enum environment_cap country_ie_env; + struct list_head list; +}; + +struct ieee80211_freq_range { + u32 start_freq_khz; + u32 end_freq_khz; + u32 max_bandwidth_khz; +}; + +struct ieee80211_power_rule { + u32 max_antenna_gain; + u32 max_eirp; +}; + +struct ieee80211_wmm_ac { + u16 cw_min; + u16 cw_max; + u16 cot; + u8 aifsn; +}; + +struct ieee80211_wmm_rule { + struct ieee80211_wmm_ac client[4]; + struct ieee80211_wmm_ac ap[4]; +}; + +struct ieee80211_reg_rule { + struct ieee80211_freq_range freq_range; + struct ieee80211_power_rule power_rule; + struct ieee80211_wmm_rule wmm_rule; + u32 flags; + u32 dfs_cac_ms; + bool has_wmm; +}; + +struct ieee80211_regdomain { + struct callback_head callback_head; + u32 n_reg_rules; + char alpha2[3]; + enum nl80211_dfs_regions dfs_region; + struct ieee80211_reg_rule reg_rules[0]; +}; + +struct ieee80211_channel { + enum nl80211_band band; + u32 center_freq; + u16 freq_offset; + u16 hw_value; + u32 flags; + int max_antenna_gain; + int max_power; + int max_reg_power; + bool beacon_found; + u32 orig_flags; + int orig_mag; + int orig_mpwr; + enum nl80211_dfs_state dfs_state; + long unsigned int dfs_state_entered; + unsigned int dfs_cac_ms; +}; + +struct ieee80211_rate { + u32 flags; + u16 bitrate; + u16 hw_value; + u16 hw_value_short; +}; + +struct ieee80211_sta_ht_cap { + u16 cap; + bool ht_supported; + u8 ampdu_factor; + u8 ampdu_density; + struct ieee80211_mcs_info mcs; + char: 8; +} __attribute__((packed)); + +struct ieee80211_sta_vht_cap { + bool vht_supported; + u32 cap; + struct ieee80211_vht_mcs_info vht_mcs; +}; + +struct ieee80211_sta_he_cap { + bool has_he; + struct ieee80211_he_cap_elem he_cap_elem; + struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp; + u8 ppe_thres[25]; +} __attribute__((packed)); + +struct ieee80211_sband_iftype_data { + u16 types_mask; + struct ieee80211_sta_he_cap he_cap; + struct ieee80211_he_6ghz_capa he_6ghz_capa; + long: 40; + struct { + const u8 *data; + unsigned int len; + } vendor_elems; +} __attribute__((packed)); + +struct ieee80211_sta_s1g_cap { + bool s1g; + u8 cap[10]; + u8 nss_mcs[5]; +}; + +struct ieee80211_supported_band { + struct ieee80211_channel *channels; + struct ieee80211_rate *bitrates; + enum nl80211_band band; + int n_channels; + int n_bitrates; + struct ieee80211_sta_ht_cap ht_cap; + struct ieee80211_sta_vht_cap vht_cap; + struct ieee80211_sta_s1g_cap s1g_cap; + struct ieee80211_edmg edmg_cap; + u16 n_iftype_data; + const struct ieee80211_sband_iftype_data *iftype_data; +}; + +struct key_params { + const u8 *key; + const u8 *seq; + int key_len; + int seq_len; + u16 vlan_id; + u32 cipher; + enum nl80211_key_mode mode; +}; + +struct mac_address___2 { + u8 addr[6]; +}; + +struct cfg80211_sar_freq_ranges { + u32 start_freq; + u32 end_freq; +}; + +struct cfg80211_sar_capa { + enum nl80211_sar_type type; + u32 num_freq_ranges; + const struct cfg80211_sar_freq_ranges *freq_ranges; +}; + +struct cfg80211_ssid { + u8 ssid[32]; + u8 ssid_len; +}; + +enum cfg80211_signal_type { + CFG80211_SIGNAL_TYPE_NONE = 0, + CFG80211_SIGNAL_TYPE_MBM = 1, + CFG80211_SIGNAL_TYPE_UNSPEC = 2, +}; + +struct ieee80211_txrx_stypes; + +struct ieee80211_iface_combination; + +struct wiphy_iftype_akm_suites; + +struct wiphy_wowlan_support; + +struct cfg80211_wowlan; + +struct wiphy_iftype_ext_capab; + +struct wiphy_coalesce_support; + +struct wiphy_vendor_command; + +struct cfg80211_pmsr_capabilities; + +struct wiphy { + struct mutex mtx; + u8 perm_addr[6]; + u8 addr_mask[6]; + struct mac_address___2 *addresses; + const struct ieee80211_txrx_stypes *mgmt_stypes; + const struct ieee80211_iface_combination *iface_combinations; + int n_iface_combinations; + u16 software_iftypes; + u16 n_addresses; + u16 interface_modes; + u16 max_acl_mac_addrs; + u32 flags; + u32 regulatory_flags; + u32 features; + u8 ext_features[8]; + u32 ap_sme_capa; + enum cfg80211_signal_type signal_type; + int bss_priv_size; + u8 max_scan_ssids; + u8 max_sched_scan_reqs; + u8 max_sched_scan_ssids; + u8 max_match_sets; + u16 max_scan_ie_len; + u16 max_sched_scan_ie_len; + u32 max_sched_scan_plans; + u32 max_sched_scan_plan_interval; + u32 max_sched_scan_plan_iterations; + int n_cipher_suites; + const u32 *cipher_suites; + int n_akm_suites; + const u32 *akm_suites; + const struct wiphy_iftype_akm_suites *iftype_akm_suites; + unsigned int num_iftype_akm_suites; + u8 retry_short; + u8 retry_long; + u32 frag_threshold; + u32 rts_threshold; + u8 coverage_class; + char fw_version[32]; + u32 hw_version; + const struct wiphy_wowlan_support *wowlan; + struct cfg80211_wowlan *wowlan_config; + u16 max_remain_on_channel_duration; + u8 max_num_pmkids; + u32 available_antennas_tx; + u32 available_antennas_rx; + u32 probe_resp_offload; + const u8 *extended_capabilities; + const u8 *extended_capabilities_mask; + u8 extended_capabilities_len; + const struct wiphy_iftype_ext_capab *iftype_ext_capab; + unsigned int num_iftype_ext_capab; + const void *privid; + struct ieee80211_supported_band *bands[6]; + void (*reg_notifier)(struct wiphy *, struct regulatory_request *); + const struct ieee80211_regdomain *regd; + struct device dev; + bool registered; + struct dentry *debugfsdir; + const struct ieee80211_ht_cap *ht_capa_mod_mask; + const struct ieee80211_vht_cap *vht_capa_mod_mask; + struct list_head wdev_list; + possible_net_t _net; + const struct iw_handler_def *wext; + const struct wiphy_coalesce_support *coalesce; + const struct wiphy_vendor_command *vendor_commands; + const struct nl80211_vendor_cmd_info *vendor_events; + int n_vendor_commands; + int n_vendor_events; + u16 max_ap_assoc_sta; + u8 max_num_csa_counters; + u32 bss_select_support; + u8 nan_supported_bands; + u32 txq_limit; + u32 txq_memory_limit; + u32 txq_quantum; + long unsigned int tx_queue_len; + u8 support_mbssid: 1; + u8 support_only_he_mbssid: 1; + const struct cfg80211_pmsr_capabilities *pmsr_capa; + struct { + u64 peer; + u64 vif; + u8 max_retry; + } tid_config_support; + u8 max_data_retry_count; + const struct cfg80211_sar_capa *sar_capa; + struct rfkill *rfkill; + u8 mbssid_max_interfaces; + u8 ema_max_profile_periodicity; + long: 48; + long: 64; + char priv[0]; +}; + +struct cfg80211_match_set { + struct cfg80211_ssid ssid; + u8 bssid[6]; + s32 rssi_thold; + s32 per_band_rssi_thold[6]; +}; + +struct cfg80211_sched_scan_plan { + u32 interval; + u32 iterations; +}; + +struct cfg80211_sched_scan_request { + u64 reqid; + struct cfg80211_ssid *ssids; + int n_ssids; + u32 n_channels; + enum nl80211_bss_scan_width scan_width; + const u8 *ie; + size_t ie_len; + u32 flags; + struct cfg80211_match_set *match_sets; + int n_match_sets; + s32 min_rssi_thold; + u32 delay; + struct cfg80211_sched_scan_plan *scan_plans; + int n_scan_plans; + u8 mac_addr[6]; + u8 mac_addr_mask[6]; + bool relative_rssi_set; + s8 relative_rssi; + struct cfg80211_bss_select_adjust rssi_adjust; + struct wiphy *wiphy; + struct net_device *dev; + long unsigned int scan_start; + bool report_results; + struct callback_head callback_head; + u32 owner_nlportid; + bool nl_owner_dead; + struct list_head list; + struct ieee80211_channel *channels[0]; +}; + +struct cfg80211_pkt_pattern { + const u8 *mask; + const u8 *pattern; + int pattern_len; + int pkt_offset; +}; + +struct cfg80211_wowlan_tcp { + struct socket *sock; + __be32 src; + __be32 dst; + u16 src_port; + u16 dst_port; + u8 dst_mac[6]; + int payload_len; + const u8 *payload; + struct nl80211_wowlan_tcp_data_seq payload_seq; + u32 data_interval; + u32 wake_len; + const u8 *wake_data; + const u8 *wake_mask; + u32 tokens_size; + struct nl80211_wowlan_tcp_data_token payload_tok; +}; + +struct cfg80211_wowlan { + bool any; + bool disconnect; + bool magic_pkt; + bool gtk_rekey_failure; + bool eap_identity_req; + bool four_way_handshake; + bool rfkill_release; + struct cfg80211_pkt_pattern *patterns; + struct cfg80211_wowlan_tcp *tcp; + int n_patterns; + struct cfg80211_sched_scan_request *nd_config; +}; + +struct ieee80211_iface_limit { + u16 max; + u16 types; +}; + +struct ieee80211_iface_combination { + const struct ieee80211_iface_limit *limits; + u32 num_different_channels; + u16 max_interfaces; + u8 n_limits; + bool beacon_int_infra_match; + u8 radar_detect_widths; + u8 radar_detect_regions; + u32 beacon_int_min_gcd; +}; + +struct ieee80211_txrx_stypes { + u16 tx; + u16 rx; +}; + +struct wiphy_wowlan_tcp_support { + const struct nl80211_wowlan_tcp_data_token_feature *tok; + u32 data_payload_max; + u32 data_interval_max; + u32 wake_payload_max; + bool seq; +}; + +struct wiphy_wowlan_support { + u32 flags; + int n_patterns; + int pattern_max_len; + int pattern_min_len; + int max_pkt_offset; + int max_nd_match_sets; + const struct wiphy_wowlan_tcp_support *tcp; +}; + +struct wiphy_coalesce_support { + int n_rules; + int max_delay; + int n_patterns; + int pattern_max_len; + int pattern_min_len; + int max_pkt_offset; +}; + +struct wiphy_vendor_command { + struct nl80211_vendor_cmd_info info; + u32 flags; + int (*doit)(struct wiphy *, struct wireless_dev *, const void *, int); + int (*dumpit)(struct wiphy *, struct wireless_dev *, struct sk_buff *, const void *, int, long unsigned int *); + const struct nla_policy *policy; + unsigned int maxattr; +}; + +struct wiphy_iftype_ext_capab { + enum nl80211_iftype iftype; + const u8 *extended_capabilities; + const u8 *extended_capabilities_mask; + u8 extended_capabilities_len; +}; + +struct cfg80211_pmsr_capabilities { + unsigned int max_peers; + u8 report_ap_tsf: 1; + u8 randomize_mac_addr: 1; + struct { + u32 preambles; + u32 bandwidths; + s8 max_bursts_exponent; + u8 max_ftms_per_burst; + u8 supported: 1; + u8 asap: 1; + u8 non_asap: 1; + u8 request_lci: 1; + u8 request_civicloc: 1; + u8 trigger_based: 1; + u8 non_trigger_based: 1; + } ftm; +}; + +struct wiphy_iftype_akm_suites { + u16 iftypes_mask; + const u32 *akm_suites; + int n_akm_suites; +}; + +struct iw_ioctl_description { + __u8 header_type; + __u8 token_type; + __u16 token_size; + __u16 min_tokens; + __u16 max_tokens; + __u32 flags; +}; + +typedef int (*wext_ioctl_func)(struct net_device *, struct iwreq *, unsigned int, struct iw_request_info *, iw_handler); + +struct iw_thrspy { + struct sockaddr addr; + struct iw_quality qual; + struct iw_quality low; + struct iw_quality high; +}; + +struct netlbl_af4list { + __be32 addr; + __be32 mask; + u32 valid; + struct list_head list; +}; + +struct netlbl_af6list { + struct in6_addr addr; + struct in6_addr mask; + u32 valid; + struct list_head list; +}; + +struct netlbl_domaddr_map { + struct list_head list4; + struct list_head list6; +}; + +struct netlbl_dommap_def { + u32 type; + union { + struct netlbl_domaddr_map *addrsel; + struct cipso_v4_doi *cipso; + struct calipso_doi *calipso; + }; +}; + +struct netlbl_domaddr4_map { + struct netlbl_dommap_def def; + struct netlbl_af4list list; +}; + +struct netlbl_domaddr6_map { + struct netlbl_dommap_def def; + struct netlbl_af6list list; +}; + +struct netlbl_dom_map { + char *domain; + u16 family; + struct netlbl_dommap_def def; + u32 valid; + struct list_head list; + struct callback_head rcu; +}; + +struct netlbl_domhsh_tbl { + struct list_head *tbl; + u32 size; +}; + +enum { + NLBL_MGMT_C_UNSPEC = 0, + NLBL_MGMT_C_ADD = 1, + NLBL_MGMT_C_REMOVE = 2, + NLBL_MGMT_C_LISTALL = 3, + NLBL_MGMT_C_ADDDEF = 4, + NLBL_MGMT_C_REMOVEDEF = 5, + NLBL_MGMT_C_LISTDEF = 6, + NLBL_MGMT_C_PROTOCOLS = 7, + NLBL_MGMT_C_VERSION = 8, + __NLBL_MGMT_C_MAX = 9, +}; + +enum { + NLBL_MGMT_A_UNSPEC = 0, + NLBL_MGMT_A_DOMAIN = 1, + NLBL_MGMT_A_PROTOCOL = 2, + NLBL_MGMT_A_VERSION = 3, + NLBL_MGMT_A_CV4DOI = 4, + NLBL_MGMT_A_IPV6ADDR = 5, + NLBL_MGMT_A_IPV6MASK = 6, + NLBL_MGMT_A_IPV4ADDR = 7, + NLBL_MGMT_A_IPV4MASK = 8, + NLBL_MGMT_A_ADDRSELECTOR = 9, + NLBL_MGMT_A_SELECTORLIST = 10, + NLBL_MGMT_A_FAMILY = 11, + NLBL_MGMT_A_CLPDOI = 12, + __NLBL_MGMT_A_MAX = 13, +}; + +struct netlbl_domhsh_walk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +enum { + NLBL_UNLABEL_C_UNSPEC = 0, + NLBL_UNLABEL_C_ACCEPT = 1, + NLBL_UNLABEL_C_LIST = 2, + NLBL_UNLABEL_C_STATICADD = 3, + NLBL_UNLABEL_C_STATICREMOVE = 4, + NLBL_UNLABEL_C_STATICLIST = 5, + NLBL_UNLABEL_C_STATICADDDEF = 6, + NLBL_UNLABEL_C_STATICREMOVEDEF = 7, + NLBL_UNLABEL_C_STATICLISTDEF = 8, + __NLBL_UNLABEL_C_MAX = 9, +}; + +enum { + NLBL_UNLABEL_A_UNSPEC = 0, + NLBL_UNLABEL_A_ACPTFLG = 1, + NLBL_UNLABEL_A_IPV6ADDR = 2, + NLBL_UNLABEL_A_IPV6MASK = 3, + NLBL_UNLABEL_A_IPV4ADDR = 4, + NLBL_UNLABEL_A_IPV4MASK = 5, + NLBL_UNLABEL_A_IFACE = 6, + NLBL_UNLABEL_A_SECCTX = 7, + __NLBL_UNLABEL_A_MAX = 8, +}; + +struct netlbl_unlhsh_tbl { + struct list_head *tbl; + u32 size; +}; + +struct netlbl_unlhsh_addr4 { + u32 secid; + struct netlbl_af4list list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_addr6 { + u32 secid; + struct netlbl_af6list list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_iface { + int ifindex; + struct list_head addr4_list; + struct list_head addr6_list; + u32 valid; + struct list_head list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_walk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +enum { + NLBL_CIPSOV4_C_UNSPEC = 0, + NLBL_CIPSOV4_C_ADD = 1, + NLBL_CIPSOV4_C_REMOVE = 2, + NLBL_CIPSOV4_C_LIST = 3, + NLBL_CIPSOV4_C_LISTALL = 4, + __NLBL_CIPSOV4_C_MAX = 5, +}; + +enum { + NLBL_CIPSOV4_A_UNSPEC = 0, + NLBL_CIPSOV4_A_DOI = 1, + NLBL_CIPSOV4_A_MTYPE = 2, + NLBL_CIPSOV4_A_TAG = 3, + NLBL_CIPSOV4_A_TAGLST = 4, + NLBL_CIPSOV4_A_MLSLVLLOC = 5, + NLBL_CIPSOV4_A_MLSLVLREM = 6, + NLBL_CIPSOV4_A_MLSLVL = 7, + NLBL_CIPSOV4_A_MLSLVLLST = 8, + NLBL_CIPSOV4_A_MLSCATLOC = 9, + NLBL_CIPSOV4_A_MLSCATREM = 10, + NLBL_CIPSOV4_A_MLSCAT = 11, + NLBL_CIPSOV4_A_MLSCATLST = 12, + __NLBL_CIPSOV4_A_MAX = 13, +}; + +struct netlbl_cipsov4_doiwalk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct netlbl_domhsh_walk_arg___2 { + struct netlbl_audit *audit_info; + u32 doi; +}; + +enum { + NLBL_CALIPSO_C_UNSPEC = 0, + NLBL_CALIPSO_C_ADD = 1, + NLBL_CALIPSO_C_REMOVE = 2, + NLBL_CALIPSO_C_LIST = 3, + NLBL_CALIPSO_C_LISTALL = 4, + __NLBL_CALIPSO_C_MAX = 5, +}; + +enum { + NLBL_CALIPSO_A_UNSPEC = 0, + NLBL_CALIPSO_A_DOI = 1, + NLBL_CALIPSO_A_MTYPE = 2, + __NLBL_CALIPSO_A_MAX = 3, +}; + +struct netlbl_calipso_doiwalk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +enum rfkill_type { + RFKILL_TYPE_ALL = 0, + RFKILL_TYPE_WLAN = 1, + RFKILL_TYPE_BLUETOOTH = 2, + RFKILL_TYPE_UWB = 3, + RFKILL_TYPE_WIMAX = 4, + RFKILL_TYPE_WWAN = 5, + RFKILL_TYPE_GPS = 6, + RFKILL_TYPE_FM = 7, + RFKILL_TYPE_NFC = 8, + NUM_RFKILL_TYPES = 9, +}; + +enum rfkill_operation { + RFKILL_OP_ADD = 0, + RFKILL_OP_DEL = 1, + RFKILL_OP_CHANGE = 2, + RFKILL_OP_CHANGE_ALL = 3, +}; + +enum rfkill_hard_block_reasons { + RFKILL_HARD_BLOCK_SIGNAL = 1, + RFKILL_HARD_BLOCK_NOT_OWNER = 2, +}; + +struct rfkill_event_ext { + __u32 idx; + __u8 type; + __u8 op; + __u8 soft; + __u8 hard; + __u8 hard_block_reasons; +} __attribute__((packed)); + +enum rfkill_user_states { + RFKILL_USER_STATE_SOFT_BLOCKED = 0, + RFKILL_USER_STATE_UNBLOCKED = 1, + RFKILL_USER_STATE_HARD_BLOCKED = 2, +}; + +struct rfkill___2; + +struct rfkill_ops { + void (*poll)(struct rfkill___2 *, void *); + void (*query)(struct rfkill___2 *, void *); + int (*set_block)(void *, bool); +}; + +struct rfkill___2 { + spinlock_t lock; + enum rfkill_type type; + long unsigned int state; + long unsigned int hard_block_reasons; + u32 idx; + bool registered; + bool persistent; + bool polling_paused; + bool suspended; + const struct rfkill_ops *ops; + void *data; + struct led_trigger led_trigger; + const char *ledtrigname; + struct device dev; + struct list_head node; + struct delayed_work poll_work; + struct work_struct uevent_work; + struct work_struct sync_work; + char name[0]; +}; + +struct rfkill_int_event { + struct list_head list; + struct rfkill_event_ext ev; +}; + +struct rfkill_data { + struct list_head list; + struct list_head events; + struct mutex mtx; + wait_queue_head_t read_wait; + bool input_handler; +}; + +enum rfkill_input_master_mode { + RFKILL_INPUT_MASTER_UNLOCK = 0, + RFKILL_INPUT_MASTER_RESTORE = 1, + RFKILL_INPUT_MASTER_UNBLOCKALL = 2, + NUM_RFKILL_INPUT_MASTER_MODES = 3, +}; + +enum rfkill_sched_op { + RFKILL_GLOBAL_OP_EPO = 0, + RFKILL_GLOBAL_OP_RESTORE = 1, + RFKILL_GLOBAL_OP_UNLOCK = 2, + RFKILL_GLOBAL_OP_UNBLOCK = 3, +}; + +struct dcbmsg { + __u8 dcb_family; + __u8 cmd; + __u16 dcb_pad; +}; + +enum dcbnl_commands { + DCB_CMD_UNDEFINED = 0, + DCB_CMD_GSTATE = 1, + DCB_CMD_SSTATE = 2, + DCB_CMD_PGTX_GCFG = 3, + DCB_CMD_PGTX_SCFG = 4, + DCB_CMD_PGRX_GCFG = 5, + DCB_CMD_PGRX_SCFG = 6, + DCB_CMD_PFC_GCFG = 7, + DCB_CMD_PFC_SCFG = 8, + DCB_CMD_SET_ALL = 9, + DCB_CMD_GPERM_HWADDR = 10, + DCB_CMD_GCAP = 11, + DCB_CMD_GNUMTCS = 12, + DCB_CMD_SNUMTCS = 13, + DCB_CMD_PFC_GSTATE = 14, + DCB_CMD_PFC_SSTATE = 15, + DCB_CMD_BCN_GCFG = 16, + DCB_CMD_BCN_SCFG = 17, + DCB_CMD_GAPP = 18, + DCB_CMD_SAPP = 19, + DCB_CMD_IEEE_SET = 20, + DCB_CMD_IEEE_GET = 21, + DCB_CMD_GDCBX = 22, + DCB_CMD_SDCBX = 23, + DCB_CMD_GFEATCFG = 24, + DCB_CMD_SFEATCFG = 25, + DCB_CMD_CEE_GET = 26, + DCB_CMD_IEEE_DEL = 27, + __DCB_CMD_ENUM_MAX = 28, + DCB_CMD_MAX = 27, +}; + +enum dcbnl_attrs { + DCB_ATTR_UNDEFINED = 0, + DCB_ATTR_IFNAME = 1, + DCB_ATTR_STATE = 2, + DCB_ATTR_PFC_STATE = 3, + DCB_ATTR_PFC_CFG = 4, + DCB_ATTR_NUM_TC = 5, + DCB_ATTR_PG_CFG = 6, + DCB_ATTR_SET_ALL = 7, + DCB_ATTR_PERM_HWADDR = 8, + DCB_ATTR_CAP = 9, + DCB_ATTR_NUMTCS = 10, + DCB_ATTR_BCN = 11, + DCB_ATTR_APP = 12, + DCB_ATTR_IEEE = 13, + DCB_ATTR_DCBX = 14, + DCB_ATTR_FEATCFG = 15, + DCB_ATTR_CEE = 16, + __DCB_ATTR_ENUM_MAX = 17, + DCB_ATTR_MAX = 16, +}; + +enum ieee_attrs { + DCB_ATTR_IEEE_UNSPEC = 0, + DCB_ATTR_IEEE_ETS = 1, + DCB_ATTR_IEEE_PFC = 2, + DCB_ATTR_IEEE_APP_TABLE = 3, + DCB_ATTR_IEEE_PEER_ETS = 4, + DCB_ATTR_IEEE_PEER_PFC = 5, + DCB_ATTR_IEEE_PEER_APP = 6, + DCB_ATTR_IEEE_MAXRATE = 7, + DCB_ATTR_IEEE_QCN = 8, + DCB_ATTR_IEEE_QCN_STATS = 9, + DCB_ATTR_DCB_BUFFER = 10, + __DCB_ATTR_IEEE_MAX = 11, +}; + +enum ieee_attrs_app { + DCB_ATTR_IEEE_APP_UNSPEC = 0, + DCB_ATTR_IEEE_APP = 1, + __DCB_ATTR_IEEE_APP_MAX = 2, +}; + +enum cee_attrs { + DCB_ATTR_CEE_UNSPEC = 0, + DCB_ATTR_CEE_PEER_PG = 1, + DCB_ATTR_CEE_PEER_PFC = 2, + DCB_ATTR_CEE_PEER_APP_TABLE = 3, + DCB_ATTR_CEE_TX_PG = 4, + DCB_ATTR_CEE_RX_PG = 5, + DCB_ATTR_CEE_PFC = 6, + DCB_ATTR_CEE_APP_TABLE = 7, + DCB_ATTR_CEE_FEAT = 8, + __DCB_ATTR_CEE_MAX = 9, +}; + +enum peer_app_attr { + DCB_ATTR_CEE_PEER_APP_UNSPEC = 0, + DCB_ATTR_CEE_PEER_APP_INFO = 1, + DCB_ATTR_CEE_PEER_APP = 2, + __DCB_ATTR_CEE_PEER_APP_MAX = 3, +}; + +enum dcbnl_pfc_up_attrs { + DCB_PFC_UP_ATTR_UNDEFINED = 0, + DCB_PFC_UP_ATTR_0 = 1, + DCB_PFC_UP_ATTR_1 = 2, + DCB_PFC_UP_ATTR_2 = 3, + DCB_PFC_UP_ATTR_3 = 4, + DCB_PFC_UP_ATTR_4 = 5, + DCB_PFC_UP_ATTR_5 = 6, + DCB_PFC_UP_ATTR_6 = 7, + DCB_PFC_UP_ATTR_7 = 8, + DCB_PFC_UP_ATTR_ALL = 9, + __DCB_PFC_UP_ATTR_ENUM_MAX = 10, + DCB_PFC_UP_ATTR_MAX = 9, +}; + +enum dcbnl_pg_attrs { + DCB_PG_ATTR_UNDEFINED = 0, + DCB_PG_ATTR_TC_0 = 1, + DCB_PG_ATTR_TC_1 = 2, + DCB_PG_ATTR_TC_2 = 3, + DCB_PG_ATTR_TC_3 = 4, + DCB_PG_ATTR_TC_4 = 5, + DCB_PG_ATTR_TC_5 = 6, + DCB_PG_ATTR_TC_6 = 7, + DCB_PG_ATTR_TC_7 = 8, + DCB_PG_ATTR_TC_MAX = 9, + DCB_PG_ATTR_TC_ALL = 10, + DCB_PG_ATTR_BW_ID_0 = 11, + DCB_PG_ATTR_BW_ID_1 = 12, + DCB_PG_ATTR_BW_ID_2 = 13, + DCB_PG_ATTR_BW_ID_3 = 14, + DCB_PG_ATTR_BW_ID_4 = 15, + DCB_PG_ATTR_BW_ID_5 = 16, + DCB_PG_ATTR_BW_ID_6 = 17, + DCB_PG_ATTR_BW_ID_7 = 18, + DCB_PG_ATTR_BW_ID_MAX = 19, + DCB_PG_ATTR_BW_ID_ALL = 20, + __DCB_PG_ATTR_ENUM_MAX = 21, + DCB_PG_ATTR_MAX = 20, +}; + +enum dcbnl_tc_attrs { + DCB_TC_ATTR_PARAM_UNDEFINED = 0, + DCB_TC_ATTR_PARAM_PGID = 1, + DCB_TC_ATTR_PARAM_UP_MAPPING = 2, + DCB_TC_ATTR_PARAM_STRICT_PRIO = 3, + DCB_TC_ATTR_PARAM_BW_PCT = 4, + DCB_TC_ATTR_PARAM_ALL = 5, + __DCB_TC_ATTR_PARAM_ENUM_MAX = 6, + DCB_TC_ATTR_PARAM_MAX = 5, +}; + +enum dcbnl_cap_attrs { + DCB_CAP_ATTR_UNDEFINED = 0, + DCB_CAP_ATTR_ALL = 1, + DCB_CAP_ATTR_PG = 2, + DCB_CAP_ATTR_PFC = 3, + DCB_CAP_ATTR_UP2TC = 4, + DCB_CAP_ATTR_PG_TCS = 5, + DCB_CAP_ATTR_PFC_TCS = 6, + DCB_CAP_ATTR_GSP = 7, + DCB_CAP_ATTR_BCN = 8, + DCB_CAP_ATTR_DCBX = 9, + __DCB_CAP_ATTR_ENUM_MAX = 10, + DCB_CAP_ATTR_MAX = 9, +}; + +enum dcbnl_numtcs_attrs { + DCB_NUMTCS_ATTR_UNDEFINED = 0, + DCB_NUMTCS_ATTR_ALL = 1, + DCB_NUMTCS_ATTR_PG = 2, + DCB_NUMTCS_ATTR_PFC = 3, + __DCB_NUMTCS_ATTR_ENUM_MAX = 4, + DCB_NUMTCS_ATTR_MAX = 3, +}; + +enum dcbnl_bcn_attrs { + DCB_BCN_ATTR_UNDEFINED = 0, + DCB_BCN_ATTR_RP_0 = 1, + DCB_BCN_ATTR_RP_1 = 2, + DCB_BCN_ATTR_RP_2 = 3, + DCB_BCN_ATTR_RP_3 = 4, + DCB_BCN_ATTR_RP_4 = 5, + DCB_BCN_ATTR_RP_5 = 6, + DCB_BCN_ATTR_RP_6 = 7, + DCB_BCN_ATTR_RP_7 = 8, + DCB_BCN_ATTR_RP_ALL = 9, + DCB_BCN_ATTR_BCNA_0 = 10, + DCB_BCN_ATTR_BCNA_1 = 11, + DCB_BCN_ATTR_ALPHA = 12, + DCB_BCN_ATTR_BETA = 13, + DCB_BCN_ATTR_GD = 14, + DCB_BCN_ATTR_GI = 15, + DCB_BCN_ATTR_TMAX = 16, + DCB_BCN_ATTR_TD = 17, + DCB_BCN_ATTR_RMIN = 18, + DCB_BCN_ATTR_W = 19, + DCB_BCN_ATTR_RD = 20, + DCB_BCN_ATTR_RU = 21, + DCB_BCN_ATTR_WRTT = 22, + DCB_BCN_ATTR_RI = 23, + DCB_BCN_ATTR_C = 24, + DCB_BCN_ATTR_ALL = 25, + __DCB_BCN_ATTR_ENUM_MAX = 26, + DCB_BCN_ATTR_MAX = 25, +}; + +enum dcb_general_attr_values { + DCB_ATTR_VALUE_UNDEFINED = 255, +}; + +enum dcbnl_app_attrs { + DCB_APP_ATTR_UNDEFINED = 0, + DCB_APP_ATTR_IDTYPE = 1, + DCB_APP_ATTR_ID = 2, + DCB_APP_ATTR_PRIORITY = 3, + __DCB_APP_ATTR_ENUM_MAX = 4, + DCB_APP_ATTR_MAX = 3, +}; + +enum dcbnl_featcfg_attrs { + DCB_FEATCFG_ATTR_UNDEFINED = 0, + DCB_FEATCFG_ATTR_ALL = 1, + DCB_FEATCFG_ATTR_PG = 2, + DCB_FEATCFG_ATTR_PFC = 3, + DCB_FEATCFG_ATTR_APP = 4, + __DCB_FEATCFG_ATTR_ENUM_MAX = 5, + DCB_FEATCFG_ATTR_MAX = 4, +}; + +struct dcb_app_type { + int ifindex; + struct dcb_app app; + struct list_head list; + u8 dcbx; +}; + +struct dcb_ieee_app_prio_map { + u64 map[8]; +}; + +struct dcb_ieee_app_dscp_map { + u8 map[64]; +}; + +enum dcbevent_notif_type { + DCB_APP_EVENT = 1, +}; + +struct reply_func { + int type; + int (*cb)(struct net_device *, struct nlmsghdr *, u32, struct nlattr **, struct sk_buff *); +}; + +enum dns_payload_content_type { + DNS_PAYLOAD_IS_SERVER_LIST = 0, +}; + +struct dns_payload_header { + __u8 zero; + __u8 content; + __u8 version; +}; + +enum { + dns_key_data = 0, + dns_key_error = 1, +}; + +enum switchdev_attr_id { + SWITCHDEV_ATTR_ID_UNDEFINED = 0, + SWITCHDEV_ATTR_ID_PORT_STP_STATE = 1, + SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS = 2, + SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS = 3, + SWITCHDEV_ATTR_ID_PORT_MROUTER = 4, + SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME = 5, + SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING = 6, + SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL = 7, + SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED = 8, + SWITCHDEV_ATTR_ID_BRIDGE_MROUTER = 9, + SWITCHDEV_ATTR_ID_MRP_PORT_ROLE = 10, +}; + +struct switchdev_attr { + struct net_device *orig_dev; + enum switchdev_attr_id id; + u32 flags; + void *complete_priv; + void (*complete)(struct net_device *, int, void *); + union { + u8 stp_state; + struct switchdev_brport_flags brport_flags; + bool mrouter; + clock_t ageing_time; + bool vlan_filtering; + u16 vlan_protocol; + bool mc_disabled; + u8 mrp_port_role; + } u; +}; + +struct switchdev_brport { + struct net_device *dev; + const void *ctx; + struct notifier_block *atomic_nb; + struct notifier_block *blocking_nb; + bool tx_fwd_offload; +}; + +enum switchdev_notifier_type { + SWITCHDEV_FDB_ADD_TO_BRIDGE = 1, + SWITCHDEV_FDB_DEL_TO_BRIDGE = 2, + SWITCHDEV_FDB_ADD_TO_DEVICE = 3, + SWITCHDEV_FDB_DEL_TO_DEVICE = 4, + SWITCHDEV_FDB_OFFLOADED = 5, + SWITCHDEV_FDB_FLUSH_TO_BRIDGE = 6, + SWITCHDEV_PORT_OBJ_ADD = 7, + SWITCHDEV_PORT_OBJ_DEL = 8, + SWITCHDEV_PORT_ATTR_SET = 9, + SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE = 10, + SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE = 11, + SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE = 12, + SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE = 13, + SWITCHDEV_VXLAN_FDB_OFFLOADED = 14, + SWITCHDEV_BRPORT_OFFLOADED = 15, + SWITCHDEV_BRPORT_UNOFFLOADED = 16, +}; + +struct switchdev_notifier_info { + struct net_device *dev; + struct netlink_ext_ack *extack; + const void *ctx; +}; + +struct switchdev_notifier_fdb_info { + struct switchdev_notifier_info info; + const unsigned char *addr; + u16 vid; + u8 added_by_user: 1; + u8 is_local: 1; + u8 offloaded: 1; +}; + +struct switchdev_notifier_port_obj_info { + struct switchdev_notifier_info info; + const struct switchdev_obj *obj; + bool handled; +}; + +struct switchdev_notifier_port_attr_info { + struct switchdev_notifier_info info; + const struct switchdev_attr *attr; + bool handled; +}; + +struct switchdev_notifier_brport_info { + struct switchdev_notifier_info info; + const struct switchdev_brport brport; +}; + +typedef void switchdev_deferred_func_t(struct net_device *, const void *); + +struct switchdev_deferred_item { + struct list_head list; + struct net_device *dev; + switchdev_deferred_func_t *func; + long unsigned int data[0]; +}; + +struct switchdev_nested_priv { + bool (*check_cb)(const struct net_device *); + bool (*foreign_dev_check_cb)(const struct net_device *, const struct net_device *); + const struct net_device *dev; + struct net_device *lower_dev; +}; + +typedef int (*lookup_by_table_id_t)(struct net *, u32); + +struct l3mdev_handler { + lookup_by_table_id_t dev_lookup; +}; + +struct ncsi_dev { + int state; + int link_up; + struct net_device *dev; + void (*handler)(struct ncsi_dev *); +}; + +struct ncsi_channel_version { + u32 version; + u32 alpha2; + u8 fw_name[12]; + u32 fw_version; + u16 pci_ids[4]; + u32 mf_id; +}; + +struct ncsi_channel_cap { + u32 index; + u32 cap; +}; + +struct ncsi_channel_mode { + u32 index; + u32 enable; + u32 size; + u32 data[8]; +}; + +struct ncsi_channel_mac_filter { + u8 n_uc; + u8 n_mc; + u8 n_mixed; + u64 bitmap; + unsigned char *addrs; +}; + +struct ncsi_channel_vlan_filter { + u8 n_vids; + u64 bitmap; + u16 *vids; +}; + +struct ncsi_channel_stats { + u32 hnc_cnt_hi; + u32 hnc_cnt_lo; + u32 hnc_rx_bytes; + u32 hnc_tx_bytes; + u32 hnc_rx_uc_pkts; + u32 hnc_rx_mc_pkts; + u32 hnc_rx_bc_pkts; + u32 hnc_tx_uc_pkts; + u32 hnc_tx_mc_pkts; + u32 hnc_tx_bc_pkts; + u32 hnc_fcs_err; + u32 hnc_align_err; + u32 hnc_false_carrier; + u32 hnc_runt_pkts; + u32 hnc_jabber_pkts; + u32 hnc_rx_pause_xon; + u32 hnc_rx_pause_xoff; + u32 hnc_tx_pause_xon; + u32 hnc_tx_pause_xoff; + u32 hnc_tx_s_collision; + u32 hnc_tx_m_collision; + u32 hnc_l_collision; + u32 hnc_e_collision; + u32 hnc_rx_ctl_frames; + u32 hnc_rx_64_frames; + u32 hnc_rx_127_frames; + u32 hnc_rx_255_frames; + u32 hnc_rx_511_frames; + u32 hnc_rx_1023_frames; + u32 hnc_rx_1522_frames; + u32 hnc_rx_9022_frames; + u32 hnc_tx_64_frames; + u32 hnc_tx_127_frames; + u32 hnc_tx_255_frames; + u32 hnc_tx_511_frames; + u32 hnc_tx_1023_frames; + u32 hnc_tx_1522_frames; + u32 hnc_tx_9022_frames; + u32 hnc_rx_valid_bytes; + u32 hnc_rx_runt_pkts; + u32 hnc_rx_jabber_pkts; + u32 ncsi_rx_cmds; + u32 ncsi_dropped_cmds; + u32 ncsi_cmd_type_errs; + u32 ncsi_cmd_csum_errs; + u32 ncsi_rx_pkts; + u32 ncsi_tx_pkts; + u32 ncsi_tx_aen_pkts; + u32 pt_tx_pkts; + u32 pt_tx_dropped; + u32 pt_tx_channel_err; + u32 pt_tx_us_err; + u32 pt_rx_pkts; + u32 pt_rx_dropped; + u32 pt_rx_channel_err; + u32 pt_rx_us_err; + u32 pt_rx_os_err; +}; + +struct ncsi_package; + +struct ncsi_channel { + unsigned char id; + int state; + bool reconfigure_needed; + spinlock_t lock; + struct ncsi_package *package; + struct ncsi_channel_version version; + struct ncsi_channel_cap caps[6]; + struct ncsi_channel_mode modes[8]; + struct ncsi_channel_mac_filter mac_filter; + struct ncsi_channel_vlan_filter vlan_filter; + struct ncsi_channel_stats stats; + struct { + struct timer_list timer; + bool enabled; + unsigned int state; + } monitor; + struct list_head node; + struct list_head link; +}; + +struct ncsi_dev_priv; + +struct ncsi_package { + unsigned char id; + unsigned char uuid[16]; + struct ncsi_dev_priv *ndp; + spinlock_t lock; + unsigned int channel_num; + struct list_head channels; + struct list_head node; + bool multi_channel; + u32 channel_whitelist; + struct ncsi_channel *preferred_channel; +}; + +struct ncsi_request { + unsigned char id; + bool used; + unsigned int flags; + struct ncsi_dev_priv *ndp; + struct sk_buff *cmd; + struct sk_buff *rsp; + struct timer_list timer; + bool enabled; + u32 snd_seq; + u32 snd_portid; + struct nlmsghdr nlhdr; +}; + +struct ncsi_dev_priv { + struct ncsi_dev ndev; + unsigned int flags; + unsigned int gma_flag; + spinlock_t lock; + unsigned int package_probe_id; + unsigned int package_num; + struct list_head packages; + struct ncsi_channel *hot_channel; + struct ncsi_request requests[256]; + unsigned int request_id; + unsigned int pending_req_num; + struct ncsi_package *active_package; + struct ncsi_channel *active_channel; + struct list_head channel_queue; + struct work_struct work; + struct packet_type ptype; + struct list_head node; + struct list_head vlan_vids; + bool multi_package; + bool mlx_multi_host; + u32 package_whitelist; +}; + +struct ncsi_cmd_arg { + struct ncsi_dev_priv *ndp; + unsigned char type; + unsigned char id; + unsigned char package; + unsigned char channel; + short unsigned int payload; + unsigned int req_flags; + union { + unsigned char bytes[16]; + short unsigned int words[8]; + unsigned int dwords[4]; + }; + unsigned char *data; + struct genl_info *info; +}; + +struct ncsi_pkt_hdr { + unsigned char mc_id; + unsigned char revision; + unsigned char reserved; + unsigned char id; + unsigned char type; + unsigned char channel; + __be16 length; + __be32 reserved1[2]; +}; + +struct ncsi_cmd_pkt_hdr { + struct ncsi_pkt_hdr common; +}; + +struct ncsi_cmd_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 checksum; + unsigned char pad[26]; +}; + +struct ncsi_cmd_sp_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char hw_arbitration; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_dc_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char ald; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_rc_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 reserved; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_ae_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char mc_id; + __be32 mode; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_cmd_sl_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 mode; + __be32 oem_mode; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_cmd_svf_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be16 reserved; + __be16 vlan; + __be16 reserved1; + unsigned char index; + unsigned char enable; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_cmd_ev_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char mode; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_sma_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char mac[6]; + unsigned char index; + unsigned char at_e; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_cmd_ebf_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 mode; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_egmf_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 mode; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_snfc_pkt { + struct ncsi_cmd_pkt_hdr cmd; + unsigned char reserved[3]; + unsigned char mode; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_cmd_oem_pkt { + struct ncsi_cmd_pkt_hdr cmd; + __be32 mfr_id; + unsigned char data[0]; +}; + +struct ncsi_cmd_handler { + unsigned char type; + int payload; + int (*handler)(struct sk_buff *, struct ncsi_cmd_arg *); +}; + +enum { + NCSI_CAP_BASE = 0, + NCSI_CAP_GENERIC = 0, + NCSI_CAP_BC = 1, + NCSI_CAP_MC = 2, + NCSI_CAP_BUFFER = 3, + NCSI_CAP_AEN = 4, + NCSI_CAP_VLAN = 5, + NCSI_CAP_MAX = 6, +}; + +enum { + NCSI_CAP_GENERIC_HWA = 1, + NCSI_CAP_GENERIC_HDS = 2, + NCSI_CAP_GENERIC_FC = 4, + NCSI_CAP_GENERIC_FC1 = 8, + NCSI_CAP_GENERIC_MC = 16, + NCSI_CAP_GENERIC_HWA_UNKNOWN = 0, + NCSI_CAP_GENERIC_HWA_SUPPORT = 32, + NCSI_CAP_GENERIC_HWA_NOT_SUPPORT = 64, + NCSI_CAP_GENERIC_HWA_RESERVED = 96, + NCSI_CAP_GENERIC_HWA_MASK = 96, + NCSI_CAP_GENERIC_MASK = 127, + NCSI_CAP_BC_ARP = 1, + NCSI_CAP_BC_DHCPC = 2, + NCSI_CAP_BC_DHCPS = 4, + NCSI_CAP_BC_NETBIOS = 8, + NCSI_CAP_BC_MASK = 15, + NCSI_CAP_MC_IPV6_NEIGHBOR = 1, + NCSI_CAP_MC_IPV6_ROUTER = 2, + NCSI_CAP_MC_DHCPV6_RELAY = 4, + NCSI_CAP_MC_DHCPV6_WELL_KNOWN = 8, + NCSI_CAP_MC_IPV6_MLD = 16, + NCSI_CAP_MC_IPV6_NEIGHBOR_S = 32, + NCSI_CAP_MC_MASK = 63, + NCSI_CAP_AEN_LSC = 1, + NCSI_CAP_AEN_CR = 2, + NCSI_CAP_AEN_HDS = 4, + NCSI_CAP_AEN_MASK = 7, + NCSI_CAP_VLAN_ONLY = 1, + NCSI_CAP_VLAN_NO = 2, + NCSI_CAP_VLAN_ANY = 4, + NCSI_CAP_VLAN_MASK = 7, +}; + +enum { + NCSI_MODE_BASE = 0, + NCSI_MODE_ENABLE = 0, + NCSI_MODE_TX_ENABLE = 1, + NCSI_MODE_LINK = 2, + NCSI_MODE_VLAN = 3, + NCSI_MODE_BC = 4, + NCSI_MODE_MC = 5, + NCSI_MODE_AEN = 6, + NCSI_MODE_FC = 7, + NCSI_MODE_MAX = 8, +}; + +struct ncsi_rsp_pkt_hdr { + struct ncsi_pkt_hdr common; + __be16 code; + __be16 reason; +}; + +struct ncsi_rsp_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 checksum; + unsigned char pad[22]; +}; + +struct ncsi_rsp_oem_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 mfr_id; + unsigned char data[0]; +}; + +struct ncsi_rsp_oem_mlx_pkt { + unsigned char cmd_rev; + unsigned char cmd; + unsigned char param; + unsigned char optional; + unsigned char data[0]; +}; + +struct ncsi_rsp_oem_bcm_pkt { + unsigned char ver; + unsigned char type; + __be16 len; + unsigned char data[0]; +}; + +struct ncsi_rsp_oem_intel_pkt { + unsigned char cmd; + unsigned char data[0]; +}; + +struct ncsi_rsp_gls_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 status; + __be32 other; + __be32 oem_status; + __be32 checksum; + unsigned char pad[10]; +}; + +struct ncsi_rsp_gvi_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 ncsi_version; + unsigned char reserved[3]; + unsigned char alpha2; + unsigned char fw_name[12]; + __be32 fw_version; + __be16 pci_ids[4]; + __be32 mf_id; + __be32 checksum; +}; + +struct ncsi_rsp_gc_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 cap; + __be32 bc_cap; + __be32 mc_cap; + __be32 buf_cap; + __be32 aen_cap; + unsigned char vlan_cnt; + unsigned char mixed_cnt; + unsigned char mc_cnt; + unsigned char uc_cnt; + unsigned char reserved[2]; + unsigned char vlan_mode; + unsigned char channel_cnt; + __be32 checksum; +}; + +struct ncsi_rsp_gp_pkt { + struct ncsi_rsp_pkt_hdr rsp; + unsigned char mac_cnt; + unsigned char reserved[2]; + unsigned char mac_enable; + unsigned char vlan_cnt; + unsigned char reserved1; + __be16 vlan_enable; + __be32 link_mode; + __be32 bc_mode; + __be32 valid_modes; + unsigned char vlan_mode; + unsigned char fc_mode; + unsigned char reserved2[2]; + __be32 aen_mode; + unsigned char mac[6]; + __be16 vlan; + __be32 checksum; +}; + +struct ncsi_rsp_gcps_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 cnt_hi; + __be32 cnt_lo; + __be32 rx_bytes; + __be32 tx_bytes; + __be32 rx_uc_pkts; + __be32 rx_mc_pkts; + __be32 rx_bc_pkts; + __be32 tx_uc_pkts; + __be32 tx_mc_pkts; + __be32 tx_bc_pkts; + __be32 fcs_err; + __be32 align_err; + __be32 false_carrier; + __be32 runt_pkts; + __be32 jabber_pkts; + __be32 rx_pause_xon; + __be32 rx_pause_xoff; + __be32 tx_pause_xon; + __be32 tx_pause_xoff; + __be32 tx_s_collision; + __be32 tx_m_collision; + __be32 l_collision; + __be32 e_collision; + __be32 rx_ctl_frames; + __be32 rx_64_frames; + __be32 rx_127_frames; + __be32 rx_255_frames; + __be32 rx_511_frames; + __be32 rx_1023_frames; + __be32 rx_1522_frames; + __be32 rx_9022_frames; + __be32 tx_64_frames; + __be32 tx_127_frames; + __be32 tx_255_frames; + __be32 tx_511_frames; + __be32 tx_1023_frames; + __be32 tx_1522_frames; + __be32 tx_9022_frames; + __be32 rx_valid_bytes; + __be32 rx_runt_pkts; + __be32 rx_jabber_pkts; + __be32 checksum; +}; + +struct ncsi_rsp_gns_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 rx_cmds; + __be32 dropped_cmds; + __be32 cmd_type_errs; + __be32 cmd_csum_errs; + __be32 rx_pkts; + __be32 tx_pkts; + __be32 tx_aen_pkts; + __be32 checksum; +}; + +struct ncsi_rsp_gnpts_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 tx_pkts; + __be32 tx_dropped; + __be32 tx_channel_err; + __be32 tx_us_err; + __be32 rx_pkts; + __be32 rx_dropped; + __be32 rx_channel_err; + __be32 rx_us_err; + __be32 rx_os_err; + __be32 checksum; +}; + +struct ncsi_rsp_gps_pkt { + struct ncsi_rsp_pkt_hdr rsp; + __be32 status; + __be32 checksum; +}; + +struct ncsi_rsp_gpuuid_pkt { + struct ncsi_rsp_pkt_hdr rsp; + unsigned char uuid[16]; + __be32 checksum; +}; + +struct ncsi_rsp_oem_handler { + unsigned int mfr_id; + int (*handler)(struct ncsi_request *); +}; + +struct ncsi_rsp_handler { + unsigned char type; + int payload; + int (*handler)(struct ncsi_request *); +}; + +struct ncsi_aen_pkt_hdr { + struct ncsi_pkt_hdr common; + unsigned char reserved2[3]; + unsigned char type; +}; + +struct ncsi_aen_lsc_pkt { + struct ncsi_aen_pkt_hdr aen; + __be32 status; + __be32 oem_status; + __be32 checksum; + unsigned char pad[14]; +}; + +struct ncsi_aen_hncdsc_pkt { + struct ncsi_aen_pkt_hdr aen; + __be32 status; + __be32 checksum; + unsigned char pad[18]; +}; + +struct ncsi_aen_handler { + unsigned char type; + int payload; + int (*handler)(struct ncsi_dev_priv *, struct ncsi_aen_pkt_hdr *); +}; + +enum { + ncsi_dev_state_registered = 0, + ncsi_dev_state_functional = 256, + ncsi_dev_state_probe = 512, + ncsi_dev_state_config = 768, + ncsi_dev_state_suspend = 1024, +}; + +enum { + MLX_MC_RBT_SUPPORT = 1, + MLX_MC_RBT_AVL = 8, +}; + +enum { + ncsi_dev_state_major = 65280, + ncsi_dev_state_minor = 255, + ncsi_dev_state_probe_deselect = 513, + ncsi_dev_state_probe_package = 514, + ncsi_dev_state_probe_channel = 515, + ncsi_dev_state_probe_mlx_gma = 516, + ncsi_dev_state_probe_mlx_smaf = 517, + ncsi_dev_state_probe_cis = 518, + ncsi_dev_state_probe_keep_phy = 519, + ncsi_dev_state_probe_gvi = 520, + ncsi_dev_state_probe_gc = 521, + ncsi_dev_state_probe_gls = 522, + ncsi_dev_state_probe_dp = 523, + ncsi_dev_state_config_sp = 769, + ncsi_dev_state_config_cis = 770, + ncsi_dev_state_config_oem_gma = 771, + ncsi_dev_state_config_clear_vids = 772, + ncsi_dev_state_config_svf = 773, + ncsi_dev_state_config_ev = 774, + ncsi_dev_state_config_sma = 775, + ncsi_dev_state_config_ebf = 776, + ncsi_dev_state_config_dgmf = 777, + ncsi_dev_state_config_ecnt = 778, + ncsi_dev_state_config_ec = 779, + ncsi_dev_state_config_ae = 780, + ncsi_dev_state_config_gls = 781, + ncsi_dev_state_config_done = 782, + ncsi_dev_state_suspend_select = 1025, + ncsi_dev_state_suspend_gls = 1026, + ncsi_dev_state_suspend_dcnt = 1027, + ncsi_dev_state_suspend_dc = 1028, + ncsi_dev_state_suspend_deselect = 1029, + ncsi_dev_state_suspend_done = 1030, +}; + +struct vlan_vid { + struct list_head list; + __be16 proto; + u16 vid; +}; + +struct ncsi_oem_gma_handler { + unsigned int mfr_id; + int (*handler)(struct ncsi_cmd_arg *); +}; + +enum ncsi_nl_commands { + NCSI_CMD_UNSPEC = 0, + NCSI_CMD_PKG_INFO = 1, + NCSI_CMD_SET_INTERFACE = 2, + NCSI_CMD_CLEAR_INTERFACE = 3, + NCSI_CMD_SEND_CMD = 4, + NCSI_CMD_SET_PACKAGE_MASK = 5, + NCSI_CMD_SET_CHANNEL_MASK = 6, + __NCSI_CMD_AFTER_LAST = 7, + NCSI_CMD_MAX = 6, +}; + +enum ncsi_nl_attrs { + NCSI_ATTR_UNSPEC = 0, + NCSI_ATTR_IFINDEX = 1, + NCSI_ATTR_PACKAGE_LIST = 2, + NCSI_ATTR_PACKAGE_ID = 3, + NCSI_ATTR_CHANNEL_ID = 4, + NCSI_ATTR_DATA = 5, + NCSI_ATTR_MULTI_FLAG = 6, + NCSI_ATTR_PACKAGE_MASK = 7, + NCSI_ATTR_CHANNEL_MASK = 8, + __NCSI_ATTR_AFTER_LAST = 9, + NCSI_ATTR_MAX = 8, +}; + +enum ncsi_nl_pkg_attrs { + NCSI_PKG_ATTR_UNSPEC = 0, + NCSI_PKG_ATTR = 1, + NCSI_PKG_ATTR_ID = 2, + NCSI_PKG_ATTR_FORCED = 3, + NCSI_PKG_ATTR_CHANNEL_LIST = 4, + __NCSI_PKG_ATTR_AFTER_LAST = 5, + NCSI_PKG_ATTR_MAX = 4, +}; + +enum ncsi_nl_channel_attrs { + NCSI_CHANNEL_ATTR_UNSPEC = 0, + NCSI_CHANNEL_ATTR = 1, + NCSI_CHANNEL_ATTR_ID = 2, + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 3, + NCSI_CHANNEL_ATTR_VERSION_MINOR = 4, + NCSI_CHANNEL_ATTR_VERSION_STR = 5, + NCSI_CHANNEL_ATTR_LINK_STATE = 6, + NCSI_CHANNEL_ATTR_ACTIVE = 7, + NCSI_CHANNEL_ATTR_FORCED = 8, + NCSI_CHANNEL_ATTR_VLAN_LIST = 9, + NCSI_CHANNEL_ATTR_VLAN_ID = 10, + __NCSI_CHANNEL_ATTR_AFTER_LAST = 11, + NCSI_CHANNEL_ATTR_MAX = 10, +}; + +struct sockaddr_xdp { + __u16 sxdp_family; + __u16 sxdp_flags; + __u32 sxdp_ifindex; + __u32 sxdp_queue_id; + __u32 sxdp_shared_umem_fd; +}; + +struct xdp_ring_offset { + __u64 producer; + __u64 consumer; + __u64 desc; + __u64 flags; +}; + +struct xdp_mmap_offsets { + struct xdp_ring_offset rx; + struct xdp_ring_offset tx; + struct xdp_ring_offset fr; + struct xdp_ring_offset cr; +}; + +struct xdp_umem_reg { + __u64 addr; + __u64 len; + __u32 chunk_size; + __u32 headroom; + __u32 flags; +}; + +struct xdp_statistics { + __u64 rx_dropped; + __u64 rx_invalid_descs; + __u64 tx_invalid_descs; + __u64 rx_ring_full; + __u64 rx_fill_ring_empty_descs; + __u64 tx_ring_empty_descs; +}; + +struct xdp_options { + __u32 flags; +}; + +struct xdp_desc { + __u64 addr; + __u32 len; + __u32 options; +}; + +struct xsk_map { + struct bpf_map map; + spinlock_t lock; + struct xdp_sock *xsk_map[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_ring; + +struct xsk_queue { + u32 ring_mask; + u32 nentries; + u32 cached_prod; + u32 cached_cons; + struct xdp_ring *ring; + u64 invalid_descs; + u64 queue_empty_descs; +}; + +struct xdp_ring_offset_v1 { + __u64 producer; + __u64 consumer; + __u64 desc; +}; + +struct xdp_mmap_offsets_v1 { + struct xdp_ring_offset_v1 rx; + struct xdp_ring_offset_v1 tx; + struct xdp_ring_offset_v1 fr; + struct xdp_ring_offset_v1 cr; +}; + +struct xsk_map_node { + struct list_head node; + struct xsk_map *map; + struct xdp_sock **map_entry; +}; + +struct xdp_ring { + u32 producer; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 pad1; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 consumer; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 pad2; + u32 flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 pad3; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_rxtx_ring { + struct xdp_ring ptrs; + struct xdp_desc desc[0]; +}; + +struct xdp_umem_ring { + struct xdp_ring ptrs; + u64 desc[0]; +}; + +struct xsk_dma_map { + dma_addr_t *dma_pages; + struct device *dev; + struct net_device *netdev; + refcount_t users; + struct list_head list; + u32 dma_pages_cnt; + bool dma_need_sync; +}; + +struct mptcp_mib { + long unsigned int mibs[41]; +}; + +enum mptcp_event_type { + MPTCP_EVENT_UNSPEC = 0, + MPTCP_EVENT_CREATED = 1, + MPTCP_EVENT_ESTABLISHED = 2, + MPTCP_EVENT_CLOSED = 3, + MPTCP_EVENT_ANNOUNCED = 6, + MPTCP_EVENT_REMOVED = 7, + MPTCP_EVENT_SUB_ESTABLISHED = 10, + MPTCP_EVENT_SUB_CLOSED = 11, + MPTCP_EVENT_SUB_PRIORITY = 13, +}; + +struct mptcp_options_received { + u64 sndr_key; + u64 rcvr_key; + u64 data_ack; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + __sum16 csum; + u16 suboptions; + u32 token; + u32 nonce; + u16 use_map: 1; + u16 dsn64: 1; + u16 data_fin: 1; + u16 use_ack: 1; + u16 ack64: 1; + u16 mpc_map: 1; + u16 reset_reason: 4; + u16 reset_transient: 1; + u16 echo: 1; + u16 backup: 1; + u16 deny_join_id0: 1; + u16 __unused: 2; + u8 join_id; + u64 thmac; + u8 hmac[20]; + struct mptcp_addr_info addr; + struct mptcp_rm_list rm_list; + u64 ahmac; + u64 fail_seq; +}; + +struct mptcp_pm_data { + struct mptcp_addr_info local; + struct mptcp_addr_info remote; + struct list_head anno_list; + spinlock_t lock; + u8 addr_signal; + bool server_side; + bool work_pending; + bool accept_addr; + bool accept_subflow; + bool remote_deny_join_id0; + u8 add_addr_signaled; + u8 add_addr_accepted; + u8 local_addr_used; + u8 subflows; + u8 status; + struct mptcp_rm_list rm_list_tx; + struct mptcp_rm_list rm_list_rx; +}; + +struct mptcp_data_frag { + struct list_head list; + u64 data_seq; + u16 data_len; + u16 offset; + u16 overhead; + u16 already_sent; + struct page *page; +}; + +struct mptcp_sock { + struct inet_connection_sock sk; + u64 local_key; + u64 remote_key; + u64 write_seq; + u64 snd_nxt; + u64 ack_seq; + u64 rcv_wnd_sent; + u64 rcv_data_fin_seq; + int rmem_fwd_alloc; + struct sock *last_snd; + int snd_burst; + int old_wspace; + u64 recovery_snd_nxt; + u64 snd_una; + u64 wnd_end; + long unsigned int timer_ival; + u32 token; + int rmem_released; + long unsigned int flags; + bool recovery; + bool can_ack; + bool fully_established; + bool rcv_data_fin; + bool snd_data_fin_enable; + bool rcv_fastclose; + bool use_64bit_ack; + bool csum_enabled; + spinlock_t join_list_lock; + struct work_struct work; + struct sk_buff *ooo_last_skb; + struct rb_root out_of_order_queue; + struct sk_buff_head receive_queue; + struct list_head conn_list; + struct list_head rtx_queue; + struct mptcp_data_frag *first_pending; + struct list_head join_list; + struct socket *subflow; + struct sock *first; + struct mptcp_pm_data pm; + struct { + u32 space; + u32 copied; + u64 time; + u64 rtt_us; + } rcvq_space; + u32 setsockopt_seq; + char ca_name[16]; +}; + +struct mptcp_subflow_request_sock { + struct tcp_request_sock sk; + u16 mp_capable: 1; + u16 mp_join: 1; + u16 backup: 1; + u16 csum_reqd: 1; + u16 allow_join_id0: 1; + u8 local_id; + u8 remote_id; + u64 local_key; + u64 idsn; + u32 token; + u32 ssn_offset; + u64 thmac; + u32 local_nonce; + u32 remote_nonce; + struct mptcp_sock *msk; + struct hlist_nulls_node token_node; +}; + +enum mptcp_data_avail { + MPTCP_SUBFLOW_NODATA = 0, + MPTCP_SUBFLOW_DATA_AVAIL = 1, +}; + +struct mptcp_delegated_action { + struct napi_struct napi; + struct list_head head; +}; + +struct mptcp_subflow_context { + struct list_head node; + u64 local_key; + u64 remote_key; + u64 idsn; + u64 map_seq; + u32 snd_isn; + u32 token; + u32 rel_write_seq; + u32 map_subflow_seq; + u32 ssn_offset; + u32 map_data_len; + __wsum map_data_csum; + u32 map_csum_len; + u32 request_mptcp: 1; + u32 request_join: 1; + u32 request_bkup: 1; + u32 mp_capable: 1; + u32 mp_join: 1; + u32 fully_established: 1; + u32 pm_notified: 1; + u32 conn_finished: 1; + u32 map_valid: 1; + u32 map_csum_reqd: 1; + u32 map_data_fin: 1; + u32 mpc_map: 1; + u32 backup: 1; + u32 send_mp_prio: 1; + u32 send_mp_fail: 1; + u32 rx_eof: 1; + u32 can_ack: 1; + u32 disposable: 1; + u32 stale: 1; + enum mptcp_data_avail data_avail; + u32 remote_nonce; + u64 thmac; + u32 local_nonce; + u32 remote_token; + u8 hmac[20]; + u8 local_id; + u8 remote_id; + u8 reset_seen: 1; + u8 reset_transient: 1; + u8 reset_reason: 4; + u8 stale_count; + long int delegated_status; + struct list_head delegated_node; + u32 setsockopt_seq; + u32 stale_rcv_tstamp; + struct sock *tcp_sock; + struct sock *conn; + const struct inet_connection_sock_af_ops *icsk_af_ops; + void (*tcp_data_ready)(struct sock *); + void (*tcp_state_change)(struct sock *); + void (*tcp_write_space)(struct sock *); + void (*tcp_error_report)(struct sock *); + struct callback_head rcu; +}; + +enum linux_mptcp_mib_field { + MPTCP_MIB_NUM = 0, + MPTCP_MIB_MPCAPABLEPASSIVE = 1, + MPTCP_MIB_MPCAPABLEACTIVE = 2, + MPTCP_MIB_MPCAPABLEACTIVEACK = 3, + MPTCP_MIB_MPCAPABLEPASSIVEACK = 4, + MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK = 5, + MPTCP_MIB_MPCAPABLEACTIVEFALLBACK = 6, + MPTCP_MIB_TOKENFALLBACKINIT = 7, + MPTCP_MIB_RETRANSSEGS = 8, + MPTCP_MIB_JOINNOTOKEN = 9, + MPTCP_MIB_JOINSYNRX = 10, + MPTCP_MIB_JOINSYNACKRX = 11, + MPTCP_MIB_JOINSYNACKMAC = 12, + MPTCP_MIB_JOINACKRX = 13, + MPTCP_MIB_JOINACKMAC = 14, + MPTCP_MIB_DSSNOMATCH = 15, + MPTCP_MIB_INFINITEMAPRX = 16, + MPTCP_MIB_DSSTCPMISMATCH = 17, + MPTCP_MIB_DATACSUMERR = 18, + MPTCP_MIB_OFOQUEUETAIL = 19, + MPTCP_MIB_OFOQUEUE = 20, + MPTCP_MIB_OFOMERGE = 21, + MPTCP_MIB_NODSSWINDOW = 22, + MPTCP_MIB_DUPDATA = 23, + MPTCP_MIB_ADDADDR = 24, + MPTCP_MIB_ECHOADD = 25, + MPTCP_MIB_PORTADD = 26, + MPTCP_MIB_JOINPORTSYNRX = 27, + MPTCP_MIB_JOINPORTSYNACKRX = 28, + MPTCP_MIB_JOINPORTACKRX = 29, + MPTCP_MIB_MISMATCHPORTSYNRX = 30, + MPTCP_MIB_MISMATCHPORTACKRX = 31, + MPTCP_MIB_RMADDR = 32, + MPTCP_MIB_RMSUBFLOW = 33, + MPTCP_MIB_MPPRIOTX = 34, + MPTCP_MIB_MPPRIORX = 35, + MPTCP_MIB_MPFAILTX = 36, + MPTCP_MIB_MPFAILRX = 37, + MPTCP_MIB_RCVPRUNED = 38, + MPTCP_MIB_SUBFLOWSTALE = 39, + MPTCP_MIB_SUBFLOWRECOVER = 40, + __MPTCP_MIB_MAX = 41, +}; + +struct trace_event_raw_mptcp_subflow_get_send { + struct trace_entry ent; + bool active; + bool free; + u32 snd_wnd; + u32 pace; + u8 backup; + u64 ratio; + char __data[0]; +}; + +struct trace_event_raw_mptcp_dump_mpext { + struct trace_entry ent; + u64 data_ack; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + u16 csum; + u8 use_map; + u8 dsn64; + u8 data_fin; + u8 use_ack; + u8 ack64; + u8 mpc_map; + u8 frozen; + u8 reset_transient; + u8 reset_reason; + u8 csum_reqd; + char __data[0]; +}; + +struct trace_event_raw_ack_update_msk { + struct trace_entry ent; + u64 data_ack; + u64 old_snd_una; + u64 new_snd_una; + u64 new_wnd_end; + u64 msk_wnd_end; + char __data[0]; +}; + +struct trace_event_raw_subflow_check_data_avail { + struct trace_entry ent; + u8 status; + const void *skb; + char __data[0]; +}; + +struct trace_event_data_offsets_mptcp_subflow_get_send {}; + +struct trace_event_data_offsets_mptcp_dump_mpext {}; + +struct trace_event_data_offsets_ack_update_msk {}; + +struct trace_event_data_offsets_subflow_check_data_avail {}; + +typedef void (*btf_trace_mptcp_subflow_get_send)(void *, struct mptcp_subflow_context *); + +typedef void (*btf_trace_get_mapping_status)(void *, struct mptcp_ext *); + +typedef void (*btf_trace_ack_update_msk)(void *, u64, u64, u64, u64, u64); + +typedef void (*btf_trace_subflow_check_data_avail)(void *, __u8, struct sk_buff *); + +struct mptcp_skb_cb { + u64 map_seq; + u64 end_seq; + u32 offset; + u8 has_rxtstamp: 1; +}; + +enum { + MPTCP_CMSG_TS = 1, +}; + +struct mptcp_sendmsg_info { + int mss_now; + int size_goal; + u16 limit; + u16 sent; + unsigned int flags; + bool data_lock_held; +}; + +struct subflow_send_info { + struct sock *ssk; + u64 ratio; +}; + +struct csum_pseudo_header { + __be64 data_seq; + __be32 subflow_seq; + __be16 data_len; + __sum16 csum; +}; + +enum mapping_status { + MAPPING_OK = 0, + MAPPING_INVALID = 1, + MAPPING_EMPTY = 2, + MAPPING_DATA_FIN = 3, + MAPPING_DUMMY = 4, +}; + +enum mptcp_addr_signal_status { + MPTCP_ADD_ADDR_SIGNAL = 0, + MPTCP_ADD_ADDR_ECHO = 1, + MPTCP_RM_ADDR_SIGNAL = 2, +}; + +struct mptcp_pm_add_entry; + +struct token_bucket { + spinlock_t lock; + int chain_len; + struct hlist_nulls_head req_chain; + struct hlist_nulls_head msk_chain; +}; + +struct mptcp_pernet { + struct ctl_table_header *ctl_table_hdr; + unsigned int add_addr_timeout; + unsigned int stale_loss_cnt; + u8 mptcp_enabled; + u8 checksum_enabled; + u8 allow_join_initial_addr_port; +}; + +enum mptcp_pm_status { + MPTCP_PM_ADD_ADDR_RECEIVED = 0, + MPTCP_PM_ADD_ADDR_SEND_ACK = 1, + MPTCP_PM_RM_ADDR_RECEIVED = 2, + MPTCP_PM_ESTABLISHED = 3, + MPTCP_PM_ALREADY_ESTABLISHED = 4, + MPTCP_PM_SUBFLOW_ESTABLISHED = 5, +}; + +enum { + INET_ULP_INFO_UNSPEC = 0, + INET_ULP_INFO_NAME = 1, + INET_ULP_INFO_TLS = 2, + INET_ULP_INFO_MPTCP = 3, + __INET_ULP_INFO_MAX = 4, +}; + +enum { + MPTCP_SUBFLOW_ATTR_UNSPEC = 0, + MPTCP_SUBFLOW_ATTR_TOKEN_REM = 1, + MPTCP_SUBFLOW_ATTR_TOKEN_LOC = 2, + MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ = 3, + MPTCP_SUBFLOW_ATTR_MAP_SEQ = 4, + MPTCP_SUBFLOW_ATTR_MAP_SFSEQ = 5, + MPTCP_SUBFLOW_ATTR_SSN_OFFSET = 6, + MPTCP_SUBFLOW_ATTR_MAP_DATALEN = 7, + MPTCP_SUBFLOW_ATTR_FLAGS = 8, + MPTCP_SUBFLOW_ATTR_ID_REM = 9, + MPTCP_SUBFLOW_ATTR_ID_LOC = 10, + MPTCP_SUBFLOW_ATTR_PAD = 11, + __MPTCP_SUBFLOW_ATTR_MAX = 12, +}; + +enum { + MPTCP_PM_ATTR_UNSPEC = 0, + MPTCP_PM_ATTR_ADDR = 1, + MPTCP_PM_ATTR_RCV_ADD_ADDRS = 2, + MPTCP_PM_ATTR_SUBFLOWS = 3, + __MPTCP_PM_ATTR_MAX = 4, +}; + +enum { + MPTCP_PM_ADDR_ATTR_UNSPEC = 0, + MPTCP_PM_ADDR_ATTR_FAMILY = 1, + MPTCP_PM_ADDR_ATTR_ID = 2, + MPTCP_PM_ADDR_ATTR_ADDR4 = 3, + MPTCP_PM_ADDR_ATTR_ADDR6 = 4, + MPTCP_PM_ADDR_ATTR_PORT = 5, + MPTCP_PM_ADDR_ATTR_FLAGS = 6, + MPTCP_PM_ADDR_ATTR_IF_IDX = 7, + __MPTCP_PM_ADDR_ATTR_MAX = 8, +}; + +enum { + MPTCP_PM_CMD_UNSPEC = 0, + MPTCP_PM_CMD_ADD_ADDR = 1, + MPTCP_PM_CMD_DEL_ADDR = 2, + MPTCP_PM_CMD_GET_ADDR = 3, + MPTCP_PM_CMD_FLUSH_ADDRS = 4, + MPTCP_PM_CMD_SET_LIMITS = 5, + MPTCP_PM_CMD_GET_LIMITS = 6, + MPTCP_PM_CMD_SET_FLAGS = 7, + __MPTCP_PM_CMD_AFTER_LAST = 8, +}; + +enum mptcp_event_attr { + MPTCP_ATTR_UNSPEC = 0, + MPTCP_ATTR_TOKEN = 1, + MPTCP_ATTR_FAMILY = 2, + MPTCP_ATTR_LOC_ID = 3, + MPTCP_ATTR_REM_ID = 4, + MPTCP_ATTR_SADDR4 = 5, + MPTCP_ATTR_SADDR6 = 6, + MPTCP_ATTR_DADDR4 = 7, + MPTCP_ATTR_DADDR6 = 8, + MPTCP_ATTR_SPORT = 9, + MPTCP_ATTR_DPORT = 10, + MPTCP_ATTR_BACKUP = 11, + MPTCP_ATTR_ERROR = 12, + MPTCP_ATTR_FLAGS = 13, + MPTCP_ATTR_TIMEOUT = 14, + MPTCP_ATTR_IF_IDX = 15, + MPTCP_ATTR_RESET_REASON = 16, + MPTCP_ATTR_RESET_FLAGS = 17, + __MPTCP_ATTR_AFTER_LAST = 18, +}; + +struct mptcp_pm_addr_entry { + struct list_head list; + struct mptcp_addr_info addr; + u8 flags; + int ifindex; + struct socket *lsk; +}; + +struct mptcp_pm_add_entry___2 { + struct list_head list; + struct mptcp_addr_info addr; + struct timer_list add_timer; + struct mptcp_sock *sock; + u8 retrans_times; +}; + +struct pm_nl_pernet { + spinlock_t lock; + struct list_head local_addr_list; + unsigned int addrs; + unsigned int stale_loss_cnt; + unsigned int add_addr_signal_max; + unsigned int add_addr_accept_max; + unsigned int local_addr_max; + unsigned int subflows_max; + unsigned int next_id; + long unsigned int id_bitmap[4]; +}; + +struct mptcp_info { + __u8 mptcpi_subflows; + __u8 mptcpi_add_addr_signal; + __u8 mptcpi_add_addr_accepted; + __u8 mptcpi_subflows_max; + __u8 mptcpi_add_addr_signal_max; + __u8 mptcpi_add_addr_accepted_max; + __u32 mptcpi_flags; + __u32 mptcpi_token; + __u64 mptcpi_write_seq; + __u64 mptcpi_snd_una; + __u64 mptcpi_rcv_nxt; + __u8 mptcpi_local_addr_used; + __u8 mptcpi_local_addr_max; + __u8 mptcpi_csum_enabled; +}; + +struct mptcp_subflow_data { + __u32 size_subflow_data; + __u32 num_subflows; + __u32 size_kernel; + __u32 size_user; +}; + +struct mptcp_subflow_addrs { + union { + __kernel_sa_family_t sa_family; + struct sockaddr sa_local; + struct sockaddr_in sin_local; + struct sockaddr_in6 sin6_local; + struct __kernel_sockaddr_storage ss_local; + }; + union { + struct sockaddr sa_remote; + struct sockaddr_in sin_remote; + struct sockaddr_in6 sin6_remote; + struct __kernel_sockaddr_storage ss_remote; + }; +}; + +struct join_entry { + u32 token; + u32 remote_nonce; + u32 local_nonce; + u8 join_id; + u8 local_id; + u8 backup; + u8 valid; +}; + +typedef struct { + u32 version; + u32 length; + u64 memory_protection_attribute; +} efi_properties_table_t; + +enum efi_secureboot_mode { + efi_secureboot_mode_unset = 0, + efi_secureboot_mode_unknown = 1, + efi_secureboot_mode_disabled = 2, + efi_secureboot_mode_enabled = 3, +}; + +typedef union { + struct { + u32 revision; + efi_handle_t parent_handle; + efi_system_table_t *system_table; + efi_handle_t device_handle; + void *file_path; + void *reserved; + u32 load_options_size; + void *load_options; + void *image_base; + __u64 image_size; + unsigned int image_code_type; + unsigned int image_data_type; + efi_status_t (*unload)(efi_handle_t); + }; + struct { + u32 revision; + u32 parent_handle; + u32 system_table; + u32 device_handle; + u32 file_path; + u32 reserved; + u32 load_options_size; + u32 load_options; + u32 image_base; + __u64 image_size; + u32 image_code_type; + u32 image_data_type; + u32 unload; + } mixed_mode; +} efi_loaded_image_t; + +struct efi_boot_memmap { + efi_memory_desc_t **map; + long unsigned int *map_size; + long unsigned int *desc_size; + u32 *desc_ver; + long unsigned int *key_ptr; + long unsigned int *buff_size; +}; + +typedef efi_status_t (*efi_exit_boot_map_processing)(struct efi_boot_memmap *, void *); + +struct exit_boot_struct { + efi_memory_desc_t *runtime_map; + int *runtime_entry_count; + void *new_fdt_addr; +}; + +typedef struct { + u32 red_mask; + u32 green_mask; + u32 blue_mask; + u32 reserved_mask; +} efi_pixel_bitmask_t; + +typedef struct { + u32 version; + u32 horizontal_resolution; + u32 vertical_resolution; + int pixel_format; + efi_pixel_bitmask_t pixel_information; + u32 pixels_per_scan_line; +} efi_graphics_output_mode_info_t; + +union efi_graphics_output_protocol_mode { + struct { + u32 max_mode; + u32 mode; + efi_graphics_output_mode_info_t *info; + long unsigned int size_of_info; + efi_physical_addr_t frame_buffer_base; + long unsigned int frame_buffer_size; + }; + struct { + u32 max_mode; + u32 mode; + u32 info; + u32 size_of_info; + u64 frame_buffer_base; + u32 frame_buffer_size; + } mixed_mode; +}; + +typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t; + +union efi_graphics_output_protocol; + +typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t; + +union efi_graphics_output_protocol { + struct { + efi_status_t (*query_mode)(efi_graphics_output_protocol_t *, u32, long unsigned int *, efi_graphics_output_mode_info_t **); + efi_status_t (*set_mode)(efi_graphics_output_protocol_t *, u32); + void *blt; + efi_graphics_output_protocol_mode_t *mode; + }; + struct { + u32 query_mode; + u32 set_mode; + u32 blt; + u32 mode; + } mixed_mode; +}; + +enum efi_cmdline_option { + EFI_CMDLINE_NONE = 0, + EFI_CMDLINE_MODE_NUM = 1, + EFI_CMDLINE_RES = 2, + EFI_CMDLINE_AUTO = 3, + EFI_CMDLINE_LIST = 4, +}; + +union efi_rng_protocol; + +typedef union efi_rng_protocol efi_rng_protocol_t; + +union efi_rng_protocol { + struct { + efi_status_t (*get_info)(efi_rng_protocol_t *, long unsigned int *, efi_guid_t *); + efi_status_t (*get_rng)(efi_rng_protocol_t *, efi_guid_t *, long unsigned int, u8 *); + }; + struct { + u32 get_info; + u32 get_rng; + } mixed_mode; +}; + +typedef u32 efi_tcg2_event_log_format; + +union efi_tcg2_protocol; + +typedef union efi_tcg2_protocol efi_tcg2_protocol_t; + +union efi_tcg2_protocol { + struct { + void *get_capability; + efi_status_t (*get_event_log)(efi_tcg2_protocol_t *, efi_tcg2_event_log_format, efi_physical_addr_t *, efi_physical_addr_t *, efi_bool_t *); + void *hash_log_extend_event; + void *submit_command; + void *get_active_pcr_banks; + void *set_active_pcr_banks; + void *get_result_of_set_active_pcr_banks; + }; + struct { + u32 get_capability; + u32 get_event_log; + u32 hash_log_extend_event; + u32 submit_command; + u32 get_active_pcr_banks; + u32 set_active_pcr_banks; + u32 get_result_of_set_active_pcr_banks; + } mixed_mode; +}; + +struct efi_vendor_dev_path { + struct efi_generic_dev_path header; + efi_guid_t vendorguid; + u8 vendordata[0]; +}; + +union efi_load_file_protocol; + +typedef union efi_load_file_protocol efi_load_file_protocol_t; + +union efi_load_file_protocol { + struct { + efi_status_t (*load_file)(efi_load_file_protocol_t *, efi_device_path_protocol_t *, bool, long unsigned int *, void *); + }; + struct { + u32 load_file; + } mixed_mode; +}; + +typedef union efi_load_file_protocol efi_load_file2_protocol_t; + +typedef struct { + u32 attributes; + u16 file_path_list_length; + u8 variable_data[0]; +} __attribute__((packed)) efi_load_option_t; + +typedef struct { + u32 attributes; + u16 file_path_list_length; + const efi_char16_t *description; + const efi_device_path_protocol_t *file_path_list; + size_t optional_data_size; + const void *optional_data; +} efi_load_option_unpacked_t; + +typedef struct { + u64 size; + u64 file_size; + u64 phys_size; + efi_time_t create_time; + efi_time_t last_access_time; + efi_time_t modification_time; + __u64 attribute; + efi_char16_t filename[0]; +} efi_file_info_t; + +struct efi_file_protocol; + +typedef struct efi_file_protocol efi_file_protocol_t; + +struct efi_file_protocol { + u64 revision; + efi_status_t (*open)(efi_file_protocol_t *, efi_file_protocol_t **, efi_char16_t *, u64, u64); + efi_status_t (*close)(efi_file_protocol_t *); + efi_status_t (*delete)(efi_file_protocol_t *); + efi_status_t (*read)(efi_file_protocol_t *, long unsigned int *, void *); + efi_status_t (*write)(efi_file_protocol_t *, long unsigned int, void *); + efi_status_t (*get_position)(efi_file_protocol_t *, u64 *); + efi_status_t (*set_position)(efi_file_protocol_t *, u64); + efi_status_t (*get_info)(efi_file_protocol_t *, efi_guid_t *, long unsigned int *, void *); + efi_status_t (*set_info)(efi_file_protocol_t *, efi_guid_t *, long unsigned int, void *); + efi_status_t (*flush)(efi_file_protocol_t *); +}; + +struct efi_simple_file_system_protocol; + +typedef struct efi_simple_file_system_protocol efi_simple_file_system_protocol_t; + +struct efi_simple_file_system_protocol { + u64 revision; + int (*open_volume)(efi_simple_file_system_protocol_t *, efi_file_protocol_t **); +}; + +struct finfo { + efi_file_info_t info; + efi_char16_t filename[256]; +}; + +typedef enum { + EfiPciIoWidthUint8 = 0, + EfiPciIoWidthUint16 = 1, + EfiPciIoWidthUint32 = 2, + EfiPciIoWidthUint64 = 3, + EfiPciIoWidthFifoUint8 = 4, + EfiPciIoWidthFifoUint16 = 5, + EfiPciIoWidthFifoUint32 = 6, + EfiPciIoWidthFifoUint64 = 7, + EfiPciIoWidthFillUint8 = 8, + EfiPciIoWidthFillUint16 = 9, + EfiPciIoWidthFillUint32 = 10, + EfiPciIoWidthFillUint64 = 11, + EfiPciIoWidthMaximum = 12, +} EFI_PCI_IO_PROTOCOL_WIDTH; + +typedef struct { + u32 read; + u32 write; +} efi_pci_io_protocol_access_32_t; + +typedef struct { + void *read; + void *write; +} efi_pci_io_protocol_access_t; + +union efi_pci_io_protocol; + +typedef union efi_pci_io_protocol efi_pci_io_protocol_t; + +typedef efi_status_t (*efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *, EFI_PCI_IO_PROTOCOL_WIDTH, u32, long unsigned int, void *); + +typedef struct { + efi_pci_io_protocol_cfg_t read; + efi_pci_io_protocol_cfg_t write; +} efi_pci_io_protocol_config_access_t; + +union efi_pci_io_protocol { + struct { + void *poll_mem; + void *poll_io; + efi_pci_io_protocol_access_t mem; + efi_pci_io_protocol_access_t io; + efi_pci_io_protocol_config_access_t pci; + void *copy_mem; + void *map; + void *unmap; + void *allocate_buffer; + void *free_buffer; + void *flush; + efi_status_t (*get_location)(efi_pci_io_protocol_t *, long unsigned int *, long unsigned int *, long unsigned int *, long unsigned int *); + void *attributes; + void *get_bar_attributes; + void *set_bar_attributes; + uint64_t romsize; + void *romimage; + }; + struct { + u32 poll_mem; + u32 poll_io; + efi_pci_io_protocol_access_32_t mem; + efi_pci_io_protocol_access_32_t io; + efi_pci_io_protocol_access_32_t pci; + u32 copy_mem; + u32 map; + u32 unmap; + u32 allocate_buffer; + u32 free_buffer; + u32 flush; + u32 get_location; + u32 attributes; + u32 get_bar_attributes; + u32 set_bar_attributes; + u64 romsize; + u32 romimage; + } mixed_mode; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +#endif /* __VMLINUX_H__ */ diff --git a/vmlinux/arm64/vmlinux_601.h b/vmlinux/arm64/vmlinux_601.h new file mode 100644 index 0000000..2c73dff --- /dev/null +++ b/vmlinux/arm64/vmlinux_601.h @@ -0,0 +1,91425 @@ +#ifndef __VMLINUX_H__ +#define __VMLINUX_H__ + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) +#endif + +typedef unsigned char __u8; + +typedef short unsigned int __u16; + +typedef int __s32; + +typedef unsigned int __u32; + +typedef long long int __s64; + +typedef long long unsigned int __u64; + +typedef __u8 u8; + +typedef __u16 u16; + +typedef __s32 s32; + +typedef __u32 u32; + +typedef __s64 s64; + +typedef __u64 u64; + +enum { + false = 0, + true = 1, +}; + +typedef long int __kernel_long_t; + +typedef long unsigned int __kernel_ulong_t; + +typedef int __kernel_pid_t; + +typedef unsigned int __kernel_uid32_t; + +typedef __kernel_ulong_t __kernel_size_t; + +typedef long long int __kernel_time64_t; + +typedef __kernel_long_t __kernel_clock_t; + +typedef int __kernel_timer_t; + +typedef int __kernel_clockid_t; + +typedef __kernel_pid_t pid_t; + +typedef __kernel_clockid_t clockid_t; + +typedef _Bool bool; + +typedef __kernel_uid32_t uid_t; + +typedef __kernel_size_t size_t; + +typedef unsigned int gfp_t; + +typedef u64 phys_addr_t; + +typedef struct { + int counter; +} atomic_t; + +typedef struct { + s64 counter; +} atomic64_t; + +struct list_head { + struct list_head *next; + struct list_head *prev; +}; + +struct hlist_node; + +struct hlist_head { + struct hlist_node *first; +}; + +struct hlist_node { + struct hlist_node *next; + struct hlist_node **pprev; +}; + +struct callback_head { + struct callback_head *next; + void (*func)(struct callback_head *); +}; + +struct jump_entry { + s32 code; + s32 target; + long int key; +}; + +struct static_key_mod; + +struct static_key { + atomic_t enabled; + union { + long unsigned int type; + struct jump_entry *entries; + struct static_key_mod *next; + }; +}; + +struct static_key_false { + struct static_key key; +}; + +struct qspinlock { + union { + atomic_t val; + struct { + u8 locked; + u8 pending; + }; + struct { + u16 locked_pending; + u16 tail; + }; + }; +}; + +typedef struct qspinlock arch_spinlock_t; + +struct qrwlock { + union { + atomic_t cnts; + struct { + u8 wlocked; + u8 __lstate[3]; + }; + }; + arch_spinlock_t wait_lock; +}; + +typedef struct qrwlock arch_rwlock_t; + +struct lockdep_subclass_key { + char __one_byte; +}; + +struct lock_class_key { + union { + struct hlist_node hash_entry; + struct lockdep_subclass_key subkeys[8]; + }; +}; + +struct lock_trace; + +struct lock_class { + struct hlist_node hash_entry; + struct list_head lock_entry; + struct list_head locks_after; + struct list_head locks_before; + const struct lockdep_subclass_key *key; + unsigned int subclass; + unsigned int dep_gen_id; + long unsigned int usage_mask; + const struct lock_trace *usage_traces[10]; + int name_version; + const char *name; + u8 wait_type_inner; + u8 wait_type_outer; + u8 lock_type; +}; + +struct lock_trace { + struct hlist_node hash_entry; + u32 hash; + u32 nr_entries; + long unsigned int entries[0]; +}; + +struct lockdep_map { + struct lock_class_key *key; + struct lock_class *class_cache[2]; + const char *name; + u8 wait_type_outer; + u8 wait_type_inner; + u8 lock_type; +}; + +struct raw_spinlock { + arch_spinlock_t raw_lock; + unsigned int magic; + unsigned int owner_cpu; + void *owner; + struct lockdep_map dep_map; +}; + +typedef struct raw_spinlock raw_spinlock_t; + +struct __kernel_timespec { + __kernel_time64_t tv_sec; + long long int tv_nsec; +}; + +enum timespec_type { + TT_NONE = 0, + TT_NATIVE = 1, + TT_COMPAT = 2, +}; + +typedef s32 old_time32_t; + +struct old_timespec32 { + old_time32_t tv_sec; + s32 tv_nsec; +}; + +struct pollfd; + +struct restart_block { + long unsigned int arch_data; + long int (*fn)(struct restart_block *); + union { + struct { + u32 *uaddr; + u32 val; + u32 flags; + u32 bitset; + u64 time; + u32 *uaddr2; + } futex; + struct { + clockid_t clockid; + enum timespec_type type; + union { + struct __kernel_timespec *rmtp; + struct old_timespec32 *compat_rmtp; + }; + u64 expires; + } nanosleep; + struct { + struct pollfd *ufds; + int nfds; + int has_timeout; + long unsigned int tv_sec; + long unsigned int tv_nsec; + } poll; + }; +}; + +typedef atomic64_t atomic_long_t; + +struct thread_info { + long unsigned int flags; + union { + u64 preempt_count; + struct { + u32 count; + u32 need_resched; + } preempt; + }; + u32 cpu; +}; + +struct user_fpsimd_state { + __int128 unsigned vregs[32]; + __u32 fpsr; + __u32 fpcr; + __u32 __reserved[2]; +}; + +struct irqtrace_events { + unsigned int irq_events; + long unsigned int hardirq_enable_ip; + long unsigned int hardirq_disable_ip; + unsigned int hardirq_enable_event; + unsigned int hardirq_disable_event; + long unsigned int softirq_disable_ip; + long unsigned int softirq_enable_ip; + unsigned int softirq_disable_event; + unsigned int softirq_enable_event; +}; + +struct cpumask { + long unsigned int bits[2]; +}; + +typedef struct cpumask cpumask_t; + +struct llist_node; + +struct llist_head { + struct llist_node *first; +}; + +struct llist_node { + struct llist_node *next; +}; + +struct __call_single_node { + struct llist_node llist; + union { + unsigned int u_flags; + atomic_t a_flags; + }; + u16 src; + u16 dst; +}; + +struct refcount_struct { + atomic_t refs; +}; + +typedef struct refcount_struct refcount_t; + +struct load_weight { + long unsigned int weight; + u32 inv_weight; +}; + +struct rb_node { + long unsigned int __rb_parent_color; + struct rb_node *rb_right; + struct rb_node *rb_left; +}; + +struct util_est { + unsigned int enqueued; + unsigned int ewma; +}; + +struct sched_avg { + u64 last_update_time; + u64 load_sum; + u64 runnable_sum; + u32 util_sum; + u32 period_contrib; + long unsigned int load_avg; + long unsigned int runnable_avg; + long unsigned int util_avg; + struct util_est util_est; +}; + +struct cfs_rq; + +struct sched_entity { + struct load_weight load; + struct rb_node run_node; + struct list_head group_node; + unsigned int on_rq; + u64 exec_start; + u64 sum_exec_runtime; + u64 vruntime; + u64 prev_sum_exec_runtime; + u64 nr_migrations; + int depth; + struct sched_entity *parent; + struct cfs_rq *cfs_rq; + struct cfs_rq *my_q; + long unsigned int runnable_weight; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_avg avg; +}; + +struct sched_rt_entity { + struct list_head run_list; + long unsigned int timeout; + long unsigned int watchdog_stamp; + unsigned int time_slice; + short unsigned int on_rq; + short unsigned int on_list; + struct sched_rt_entity *back; +}; + +typedef s64 ktime_t; + +struct timerqueue_node { + struct rb_node node; + ktime_t expires; +}; + +enum hrtimer_restart { + HRTIMER_NORESTART = 0, + HRTIMER_RESTART = 1, +}; + +struct hrtimer_clock_base; + +struct hrtimer { + struct timerqueue_node node; + ktime_t _softexpires; + enum hrtimer_restart (*function)(struct hrtimer *); + struct hrtimer_clock_base *base; + u8 state; + u8 is_rel; + u8 is_soft; + u8 is_hard; +}; + +struct sched_dl_entity { + struct rb_node rb_node; + u64 dl_runtime; + u64 dl_deadline; + u64 dl_period; + u64 dl_bw; + u64 dl_density; + s64 runtime; + u64 deadline; + unsigned int flags; + unsigned int dl_throttled: 1; + unsigned int dl_yielded: 1; + unsigned int dl_non_contending: 1; + unsigned int dl_overrun: 1; + struct hrtimer dl_timer; + struct hrtimer inactive_timer; + struct sched_dl_entity *pi_se; +}; + +struct sched_statistics { + u64 wait_start; + u64 wait_max; + u64 wait_count; + u64 wait_sum; + u64 iowait_count; + u64 iowait_sum; + u64 sleep_start; + u64 sleep_max; + s64 sum_sleep_runtime; + u64 block_start; + u64 block_max; + s64 sum_block_runtime; + u64 exec_max; + u64 slice_max; + u64 nr_migrations_cold; + u64 nr_failed_migrations_affine; + u64 nr_failed_migrations_running; + u64 nr_failed_migrations_hot; + u64 nr_forced_migrations; + u64 nr_wakeups; + u64 nr_wakeups_sync; + u64 nr_wakeups_migrate; + u64 nr_wakeups_local; + u64 nr_wakeups_remote; + u64 nr_wakeups_affine; + u64 nr_wakeups_affine_attempts; + u64 nr_wakeups_passive; + u64 nr_wakeups_idle; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +union rcu_special { + struct { + u8 blocked; + u8 need_qs; + u8 exp_hint; + u8 need_mb; + } b; + u32 s; +}; + +struct sched_info { + long unsigned int pcount; + long long unsigned int run_delay; + long long unsigned int last_arrival; + long long unsigned int last_queued; +}; + +struct plist_node { + int prio; + struct list_head prio_list; + struct list_head node_list; +}; + +struct task_rss_stat { + int events; + int count[4]; +}; + +struct prev_cputime { + u64 utime; + u64 stime; + raw_spinlock_t lock; +}; + +struct rb_root { + struct rb_node *rb_node; +}; + +struct rb_root_cached { + struct rb_root rb_root; + struct rb_node *rb_leftmost; +}; + +struct timerqueue_head { + struct rb_root_cached rb_root; +}; + +struct posix_cputimer_base { + u64 nextevt; + struct timerqueue_head tqhead; +}; + +struct posix_cputimers { + struct posix_cputimer_base bases[3]; + unsigned int timers_active; + unsigned int expiry_active; +}; + +struct posix_cputimers_work { + struct callback_head work; + unsigned int scheduled; +}; + +struct sem_undo_list; + +struct sysv_sem { + struct sem_undo_list *undo_list; +}; + +struct sysv_shm { + struct list_head shm_clist; +}; + +typedef struct { + long unsigned int sig[1]; +} sigset_t; + +struct sigpending { + struct list_head list; + sigset_t signal; +}; + +typedef struct { + uid_t val; +} kuid_t; + +struct seccomp_filter; + +struct seccomp { + int mode; + atomic_t filter_count; + struct seccomp_filter *filter; +}; + +struct syscall_user_dispatch {}; + +struct spinlock { + union { + struct raw_spinlock rlock; + struct { + u8 __padding[24]; + struct lockdep_map dep_map; + }; + }; +}; + +typedef struct spinlock spinlock_t; + +struct wake_q_node { + struct wake_q_node *next; +}; + +struct held_lock { + u64 prev_chain_key; + long unsigned int acquire_ip; + struct lockdep_map *instance; + struct lockdep_map *nest_lock; + unsigned int class_idx: 13; + unsigned int irq_context: 2; + unsigned int trylock: 1; + unsigned int read: 2; + unsigned int check: 1; + unsigned int hardirqs_off: 1; + unsigned int references: 12; + unsigned int pin_count; +}; + +struct task_io_accounting { + u64 rchar; + u64 wchar; + u64 syscr; + u64 syscw; + u64 read_bytes; + u64 write_bytes; + u64 cancelled_write_bytes; +}; + +typedef struct { + long unsigned int bits[1]; +} nodemask_t; + +struct seqcount { + unsigned int sequence; + struct lockdep_map dep_map; +}; + +typedef struct seqcount seqcount_t; + +struct seqcount_spinlock { + seqcount_t seqcount; + spinlock_t *lock; +}; + +typedef struct seqcount_spinlock seqcount_spinlock_t; + +struct optimistic_spin_queue { + atomic_t tail; +}; + +struct mutex { + atomic_long_t owner; + raw_spinlock_t wait_lock; + struct optimistic_spin_queue osq; + struct list_head wait_list; + void *magic; + struct lockdep_map dep_map; +}; + +struct tlbflush_unmap_batch {}; + +struct page; + +struct page_frag { + struct page *page; + __u32 offset; + __u32 size; +}; + +struct kmap_ctrl {}; + +struct timer_list { + struct hlist_node entry; + long unsigned int expires; + void (*function)(struct timer_list *); + u32 flags; + struct lockdep_map lockdep_map; +}; + +struct cpu_context { + long unsigned int x19; + long unsigned int x20; + long unsigned int x21; + long unsigned int x22; + long unsigned int x23; + long unsigned int x24; + long unsigned int x25; + long unsigned int x26; + long unsigned int x27; + long unsigned int x28; + long unsigned int fp; + long unsigned int sp; + long unsigned int pc; +}; + +enum fp_type { + FP_STATE_CURRENT = 0, + FP_STATE_FPSIMD = 1, + FP_STATE_SVE = 2, +}; + +struct perf_event; + +struct debug_info { + int suspended_step; + int bps_disabled; + int wps_disabled; + struct perf_event *hbp_break[16]; + struct perf_event *hbp_watch[16]; +}; + +struct ptrauth_key { + long unsigned int lo; + long unsigned int hi; +}; + +struct ptrauth_keys_user { + struct ptrauth_key apia; + struct ptrauth_key apib; + struct ptrauth_key apda; + struct ptrauth_key apdb; + struct ptrauth_key apga; +}; + +struct ptrauth_keys_kernel { + struct ptrauth_key apia; +}; + +struct thread_struct { + struct cpu_context cpu_context; + long: 64; + struct { + long unsigned int tp_value; + long unsigned int tp2_value; + struct user_fpsimd_state fpsimd_state; + } uw; + enum fp_type fp_type; + unsigned int fpsimd_cpu; + void *sve_state; + void *za_state; + unsigned int vl[2]; + unsigned int vl_onexec[2]; + long unsigned int fault_address; + long unsigned int fault_code; + struct debug_info debug; + struct ptrauth_keys_user keys_user; + struct ptrauth_keys_kernel keys_kernel; + u64 mte_ctrl; + u64 sctlr_user; + u64 svcr; + u64 tpidr2_el0; + long: 64; +}; + +struct sched_class; + +struct task_group; + +struct rcu_node; + +struct mm_struct; + +struct pid; + +struct completion; + +struct cred; + +struct key; + +struct nameidata; + +struct fs_struct; + +struct files_struct; + +struct io_uring_task; + +struct nsproxy; + +struct signal_struct; + +struct sighand_struct; + +struct audit_context; + +struct rt_mutex_waiter; + +struct mutex_waiter; + +struct bio_list; + +struct blk_plug; + +struct reclaim_state; + +struct backing_dev_info; + +struct io_context; + +struct capture_control; + +struct kernel_siginfo; + +typedef struct kernel_siginfo kernel_siginfo_t; + +struct css_set; + +struct robust_list_head; + +struct futex_pi_state; + +struct perf_event_context; + +struct mempolicy; + +struct numa_group; + +struct rseq; + +struct pipe_inode_info; + +struct task_delay_info; + +struct ftrace_ret_stack; + +struct mem_cgroup; + +struct request_queue; + +struct uprobe_task; + +struct vm_struct; + +struct bpf_local_storage; + +struct bpf_run_ctx; + +struct task_struct { + struct thread_info thread_info; + unsigned int __state; + void *stack; + refcount_t usage; + unsigned int flags; + unsigned int ptrace; + int on_cpu; + struct __call_single_node wake_entry; + unsigned int wakee_flips; + long unsigned int wakee_flip_decay_ts; + struct task_struct *last_wakee; + int recent_used_cpu; + int wake_cpu; + int on_rq; + int prio; + int static_prio; + int normal_prio; + unsigned int rt_priority; + struct sched_entity se; + struct sched_rt_entity rt; + struct sched_dl_entity dl; + const struct sched_class *sched_class; + struct task_group *sched_task_group; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_statistics stats; + unsigned int btrace_seq; + unsigned int policy; + int nr_cpus_allowed; + const cpumask_t *cpus_ptr; + cpumask_t *user_cpus_ptr; + cpumask_t cpus_mask; + void *migration_pending; + short unsigned int migration_disabled; + short unsigned int migration_flags; + int rcu_read_lock_nesting; + union rcu_special rcu_read_unlock_special; + struct list_head rcu_node_entry; + struct rcu_node *rcu_blocked_node; + long unsigned int rcu_tasks_nvcsw; + u8 rcu_tasks_holdout; + u8 rcu_tasks_idx; + int rcu_tasks_idle_cpu; + struct list_head rcu_tasks_holdout_list; + int trc_reader_nesting; + int trc_ipi_to_cpu; + union rcu_special trc_reader_special; + struct list_head trc_holdout_list; + struct list_head trc_blkd_node; + int trc_blkd_cpu; + struct sched_info sched_info; + struct list_head tasks; + struct plist_node pushable_tasks; + struct rb_node pushable_dl_tasks; + struct mm_struct *mm; + struct mm_struct *active_mm; + struct task_rss_stat rss_stat; + int exit_state; + int exit_code; + int exit_signal; + int pdeath_signal; + long unsigned int jobctl; + unsigned int personality; + unsigned int sched_reset_on_fork: 1; + unsigned int sched_contributes_to_load: 1; + unsigned int sched_migrated: 1; + int: 29; + unsigned int sched_remote_wakeup: 1; + unsigned int in_execve: 1; + unsigned int in_iowait: 1; + unsigned int in_user_fault: 1; + unsigned int brk_randomized: 1; + unsigned int no_cgroup_migration: 1; + unsigned int frozen: 1; + unsigned int use_memdelay: 1; + unsigned int in_eventfd: 1; + unsigned int in_thrashing: 1; + long unsigned int atomic_flags; + struct restart_block restart_block; + pid_t pid; + pid_t tgid; + long unsigned int stack_canary; + struct task_struct *real_parent; + struct task_struct *parent; + struct list_head children; + struct list_head sibling; + struct task_struct *group_leader; + struct list_head ptraced; + struct list_head ptrace_entry; + struct pid *thread_pid; + struct hlist_node pid_links[4]; + struct list_head thread_group; + struct list_head thread_node; + struct completion *vfork_done; + int *set_child_tid; + int *clear_child_tid; + void *worker_private; + u64 utime; + u64 stime; + u64 gtime; + struct prev_cputime prev_cputime; + long unsigned int nvcsw; + long unsigned int nivcsw; + u64 start_time; + u64 start_boottime; + long unsigned int min_flt; + long unsigned int maj_flt; + struct posix_cputimers posix_cputimers; + struct posix_cputimers_work posix_cputimers_work; + const struct cred *ptracer_cred; + const struct cred *real_cred; + const struct cred *cred; + struct key *cached_requested_key; + char comm[16]; + struct nameidata *nameidata; + struct sysv_sem sysvsem; + struct sysv_shm sysvshm; + long unsigned int last_switch_count; + long unsigned int last_switch_time; + struct fs_struct *fs; + struct files_struct *files; + struct io_uring_task *io_uring; + struct nsproxy *nsproxy; + struct signal_struct *signal; + struct sighand_struct *sighand; + sigset_t blocked; + sigset_t real_blocked; + sigset_t saved_sigmask; + struct sigpending pending; + long unsigned int sas_ss_sp; + size_t sas_ss_size; + unsigned int sas_ss_flags; + struct callback_head *task_works; + struct audit_context *audit_context; + kuid_t loginuid; + unsigned int sessionid; + struct seccomp seccomp; + struct syscall_user_dispatch syscall_dispatch; + u64 parent_exec_id; + u64 self_exec_id; + spinlock_t alloc_lock; + raw_spinlock_t pi_lock; + struct wake_q_node wake_q; + struct rb_root_cached pi_waiters; + struct task_struct *pi_top_task; + struct rt_mutex_waiter *pi_blocked_on; + struct mutex_waiter *blocked_on; + int non_block_count; + struct irqtrace_events irqtrace; + unsigned int hardirq_threaded; + u64 hardirq_chain_key; + int softirqs_enabled; + int softirq_context; + int irq_config; + u64 curr_chain_key; + int lockdep_depth; + unsigned int lockdep_recursion; + struct held_lock held_locks[48]; + void *journal_info; + struct bio_list *bio_list; + struct blk_plug *plug; + struct reclaim_state *reclaim_state; + struct backing_dev_info *backing_dev_info; + struct io_context *io_context; + struct capture_control *capture_control; + long unsigned int ptrace_message; + kernel_siginfo_t *last_siginfo; + struct task_io_accounting ioac; + u64 acct_rss_mem1; + u64 acct_vm_mem1; + u64 acct_timexpd; + nodemask_t mems_allowed; + seqcount_spinlock_t mems_allowed_seq; + int cpuset_mem_spread_rotor; + int cpuset_slab_spread_rotor; + struct css_set *cgroups; + struct list_head cg_list; + struct robust_list_head *robust_list; + struct list_head pi_state_list; + struct futex_pi_state *pi_state_cache; + struct mutex futex_exit_mutex; + unsigned int futex_state; + struct perf_event_context *perf_event_ctxp; + struct mutex perf_event_mutex; + struct list_head perf_event_list; + long unsigned int preempt_disable_ip; + struct mempolicy *mempolicy; + short int il_prev; + short int pref_node_fork; + int numa_scan_seq; + unsigned int numa_scan_period; + unsigned int numa_scan_period_max; + int numa_preferred_nid; + long unsigned int numa_migrate_retry; + u64 node_stamp; + u64 last_task_numa_placement; + u64 last_sum_exec_runtime; + struct callback_head numa_work; + struct numa_group *numa_group; + long unsigned int *numa_faults; + long unsigned int total_numa_faults; + long unsigned int numa_faults_locality[3]; + long unsigned int numa_pages_migrated; + struct rseq *rseq; + u32 rseq_sig; + long unsigned int rseq_event_mask; + struct tlbflush_unmap_batch tlb_ubc; + union { + refcount_t rcu_users; + struct callback_head rcu; + }; + struct pipe_inode_info *splice_pipe; + struct page_frag task_frag; + struct task_delay_info *delays; + int make_it_fail; + unsigned int fail_nth; + int nr_dirtied; + int nr_dirtied_pause; + long unsigned int dirty_paused_when; + u64 timer_slack_ns; + u64 default_timer_slack_ns; + int curr_ret_stack; + int curr_ret_depth; + struct ftrace_ret_stack *ret_stack; + long long unsigned int ftrace_timestamp; + atomic_t trace_overrun; + atomic_t tracing_graph_pause; + long unsigned int trace_recursion; + struct mem_cgroup *memcg_in_oom; + gfp_t memcg_oom_gfp_mask; + int memcg_oom_order; + unsigned int memcg_nr_pages_over_high; + struct mem_cgroup *active_memcg; + struct request_queue *throttle_queue; + struct uprobe_task *utask; + struct kmap_ctrl kmap_ctrl; + long unsigned int task_state_change; + int pagefault_disabled; + struct task_struct *oom_reaper_list; + struct timer_list oom_reaper_timer; + struct vm_struct *stack_vm_area; + refcount_t stack_refcount; + void *security; + struct bpf_local_storage *bpf_storage; + struct bpf_run_ctx *bpf_ctx; + struct llist_head kretprobe_instances; + struct thread_struct thread; +}; + +typedef struct { + arch_rwlock_t raw_lock; + unsigned int magic; + unsigned int owner_cpu; + void *owner; + struct lockdep_map dep_map; +} rwlock_t; + +typedef u64 pgdval_t; + +typedef struct { + pgdval_t pgd; +} pgd_t; + +enum pcpu_fc { + PCPU_FC_AUTO = 0, + PCPU_FC_EMBED = 1, + PCPU_FC_PAGE = 2, + PCPU_FC_NR = 3, +}; + +enum vec_type { + ARM64_VEC_SVE = 0, + ARM64_VEC_SME = 1, + ARM64_VEC_MAX = 2, +}; + +struct wait_queue_head { + spinlock_t lock; + struct list_head head; +}; + +typedef struct wait_queue_head wait_queue_head_t; + +enum pid_type { + PIDTYPE_PID = 0, + PIDTYPE_TGID = 1, + PIDTYPE_PGID = 2, + PIDTYPE_SID = 3, + PIDTYPE_MAX = 4, +}; + +struct pid_namespace; + +struct upid { + int nr; + struct pid_namespace *ns; +}; + +struct pid { + refcount_t count; + unsigned int level; + spinlock_t lock; + struct hlist_head tasks[4]; + struct hlist_head inodes; + wait_queue_head_t wait_pidfd; + struct callback_head rcu; + struct upid numbers[1]; +}; + +struct work_struct; + +typedef void (*work_func_t)(struct work_struct *); + +struct work_struct { + atomic_long_t data; + struct list_head entry; + work_func_t func; + struct lockdep_map lockdep_map; +}; + +enum { + UNAME26 = 131072, + ADDR_NO_RANDOMIZE = 262144, + FDPIC_FUNCPTRS = 524288, + MMAP_PAGE_ZERO = 1048576, + ADDR_COMPAT_LAYOUT = 2097152, + READ_IMPLIES_EXEC = 4194304, + ADDR_LIMIT_32BIT = 8388608, + SHORT_INODE = 16777216, + WHOLE_SECONDS = 33554432, + STICKY_TIMEOUTS = 67108864, + ADDR_LIMIT_3GB = 134217728, +}; + +typedef struct page *pgtable_t; + +struct address_space; + +struct page_pool; + +struct dev_pagemap; + +struct page { + long unsigned int flags; + union { + struct { + union { + struct list_head lru; + struct { + void *__filler; + unsigned int mlock_count; + }; + struct list_head buddy_list; + struct list_head pcp_list; + }; + struct address_space *mapping; + long unsigned int index; + long unsigned int private; + }; + struct { + long unsigned int pp_magic; + struct page_pool *pp; + long unsigned int _pp_mapping_pad; + long unsigned int dma_addr; + union { + long unsigned int dma_addr_upper; + atomic_long_t pp_frag_count; + }; + }; + struct { + long unsigned int compound_head; + unsigned char compound_dtor; + unsigned char compound_order; + atomic_t compound_mapcount; + atomic_t compound_pincount; + unsigned int compound_nr; + }; + struct { + long unsigned int _compound_pad_1; + long unsigned int _compound_pad_2; + struct list_head deferred_list; + }; + struct { + long unsigned int _pt_pad_1; + pgtable_t pmd_huge_pte; + long unsigned int _pt_pad_2; + union { + struct mm_struct *pt_mm; + atomic_t pt_frag_refcount; + }; + spinlock_t *ptl; + }; + struct { + struct dev_pagemap *pgmap; + void *zone_device_data; + }; + struct callback_head callback_head; + }; + union { + atomic_t _mapcount; + unsigned int page_type; + }; + atomic_t _refcount; + long unsigned int memcg_data; +}; + +struct seqcount_raw_spinlock { + seqcount_t seqcount; + raw_spinlock_t *lock; +}; + +typedef struct seqcount_raw_spinlock seqcount_raw_spinlock_t; + +struct hrtimer_cpu_base; + +struct hrtimer_clock_base { + struct hrtimer_cpu_base *cpu_base; + unsigned int index; + clockid_t clockid; + seqcount_raw_spinlock_t seq; + struct hrtimer *running; + struct timerqueue_head active; + ktime_t (*get_time)(); + ktime_t offset; + long: 64; + long: 64; +}; + +struct hrtimer_cpu_base { + raw_spinlock_t lock; + unsigned int cpu; + unsigned int active_bases; + unsigned int clock_was_set_seq; + unsigned int hres_active: 1; + unsigned int in_hrtirq: 1; + unsigned int hang_detected: 1; + unsigned int softirq_activated: 1; + unsigned int nr_events; + short unsigned int nr_retries; + short unsigned int nr_hangs; + unsigned int max_hang_time; + ktime_t expires_next; + struct hrtimer *next_timer; + ktime_t softirq_expires_next; + struct hrtimer *softirq_next_timer; + struct hrtimer_clock_base clock_base[8]; +}; + +enum hrtimer_base_type { + HRTIMER_BASE_MONOTONIC = 0, + HRTIMER_BASE_REALTIME = 1, + HRTIMER_BASE_BOOTTIME = 2, + HRTIMER_BASE_TAI = 3, + HRTIMER_BASE_MONOTONIC_SOFT = 4, + HRTIMER_BASE_REALTIME_SOFT = 5, + HRTIMER_BASE_BOOTTIME_SOFT = 6, + HRTIMER_BASE_TAI_SOFT = 7, + HRTIMER_MAX_CLOCK_BASES = 8, +}; + +enum node_states { + N_POSSIBLE = 0, + N_ONLINE = 1, + N_NORMAL_MEMORY = 2, + N_HIGH_MEMORY = 2, + N_MEMORY = 3, + N_CPU = 4, + N_GENERIC_INITIATOR = 5, + NR_NODE_STATES = 6, +}; + +union sigval { + int sival_int; + void *sival_ptr; +}; + +typedef union sigval sigval_t; + +union __sifields { + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + } _kill; + struct { + __kernel_timer_t _tid; + int _overrun; + sigval_t _sigval; + int _sys_private; + } _timer; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + sigval_t _sigval; + } _rt; + struct { + __kernel_pid_t _pid; + __kernel_uid32_t _uid; + int _status; + __kernel_clock_t _utime; + __kernel_clock_t _stime; + } _sigchld; + struct { + void *_addr; + union { + int _trapno; + short int _addr_lsb; + struct { + char _dummy_bnd[8]; + void *_lower; + void *_upper; + } _addr_bnd; + struct { + char _dummy_pkey[8]; + __u32 _pkey; + } _addr_pkey; + struct { + long unsigned int _data; + __u32 _type; + __u32 _flags; + } _perf; + }; + } _sigfault; + struct { + long int _band; + int _fd; + } _sigpoll; + struct { + void *_call_addr; + int _syscall; + unsigned int _arch; + } _sigsys; +}; + +struct kernel_siginfo { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; +}; + +enum { + MM_FILEPAGES = 0, + MM_ANONPAGES = 1, + MM_SWAPENTS = 2, + MM_SHMEMPAGES = 3, + NR_MM_COUNTERS = 4, +}; + +struct mm_rss_stat { + atomic_long_t count[4]; +}; + +enum rseq_cs_flags_bit { + RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT = 0, + RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT = 1, + RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT = 2, +}; + +struct rseq { + __u32 cpu_id_start; + __u32 cpu_id; + __u64 rseq_cs; + __u32 flags; + long: 32; + long: 64; +}; + +enum { + TASK_COMM_LEN = 16, +}; + +struct rq; + +struct rq_flags; + +struct affinity_context; + +struct sched_class { + void (*enqueue_task)(struct rq *, struct task_struct *, int); + void (*dequeue_task)(struct rq *, struct task_struct *, int); + void (*yield_task)(struct rq *); + bool (*yield_to_task)(struct rq *, struct task_struct *); + void (*check_preempt_curr)(struct rq *, struct task_struct *, int); + struct task_struct * (*pick_next_task)(struct rq *); + void (*put_prev_task)(struct rq *, struct task_struct *); + void (*set_next_task)(struct rq *, struct task_struct *, bool); + int (*balance)(struct rq *, struct task_struct *, struct rq_flags *); + int (*select_task_rq)(struct task_struct *, int, int); + struct task_struct * (*pick_task)(struct rq *); + void (*migrate_task_rq)(struct task_struct *, int); + void (*task_woken)(struct rq *, struct task_struct *); + void (*set_cpus_allowed)(struct task_struct *, struct affinity_context *); + void (*rq_online)(struct rq *); + void (*rq_offline)(struct rq *); + struct rq * (*find_lock_rq)(struct task_struct *, struct rq *); + void (*task_tick)(struct rq *, struct task_struct *, int); + void (*task_fork)(struct task_struct *); + void (*task_dead)(struct task_struct *); + void (*switched_from)(struct rq *, struct task_struct *); + void (*switched_to)(struct rq *, struct task_struct *); + void (*prio_changed)(struct rq *, struct task_struct *, int); + unsigned int (*get_rr_interval)(struct rq *, struct task_struct *); + void (*update_curr)(struct rq *); + void (*task_change_group)(struct task_struct *); +}; + +typedef struct lockdep_map *lockdep_map_p; + +struct maple_tree { + union { + spinlock_t ma_lock; + lockdep_map_p ma_external_lock; + }; + void *ma_root; + unsigned int ma_flags; +}; + +struct rw_semaphore { + atomic_long_t count; + atomic_long_t owner; + struct optimistic_spin_queue osq; + raw_spinlock_t wait_lock; + struct list_head wait_list; + void *magic; + struct lockdep_map dep_map; +}; + +typedef struct { + atomic64_t id; + refcount_t pinned; + void *vdso; + long unsigned int flags; +} mm_context_t; + +struct xol_area; + +struct uprobes_state { + struct xol_area *xol_area; +}; + +struct file; + +struct linux_binfmt; + +struct kioctx_table; + +struct user_namespace; + +struct mm_struct { + struct { + struct maple_tree mm_mt; + long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + long unsigned int mmap_base; + long unsigned int mmap_legacy_base; + long unsigned int task_size; + pgd_t *pgd; + atomic_t membarrier_state; + atomic_t mm_users; + atomic_t mm_count; + atomic_long_t pgtables_bytes; + int map_count; + spinlock_t page_table_lock; + struct rw_semaphore mmap_lock; + struct list_head mmlist; + long unsigned int hiwater_rss; + long unsigned int hiwater_vm; + long unsigned int total_vm; + long unsigned int locked_vm; + atomic64_t pinned_vm; + long unsigned int data_vm; + long unsigned int exec_vm; + long unsigned int stack_vm; + long unsigned int def_flags; + seqcount_t write_protect_seq; + spinlock_t arg_lock; + long unsigned int start_code; + long unsigned int end_code; + long unsigned int start_data; + long unsigned int end_data; + long unsigned int start_brk; + long unsigned int brk; + long unsigned int start_stack; + long unsigned int arg_start; + long unsigned int arg_end; + long unsigned int env_start; + long unsigned int env_end; + long unsigned int saved_auxv[46]; + struct mm_rss_stat rss_stat; + struct linux_binfmt *binfmt; + mm_context_t context; + long unsigned int flags; + spinlock_t ioctx_lock; + struct kioctx_table *ioctx_table; + struct task_struct *owner; + struct user_namespace *user_ns; + struct file *exe_file; + long unsigned int numa_next_scan; + long unsigned int numa_scan_offset; + int numa_scan_seq; + atomic_t tlb_flush_pending; + struct uprobes_state uprobes_state; + atomic_long_t hugetlb_usage; + struct work_struct async_put_work; + long unsigned int ksm_merging_pages; + long unsigned int ksm_rmap_items; + }; + long unsigned int cpu_bitmap[0]; +}; + +struct swait_queue_head { + raw_spinlock_t lock; + struct list_head task_list; +}; + +struct completion { + unsigned int done; + struct swait_queue_head wait; +}; + +typedef unsigned int __kernel_gid32_t; + +typedef __kernel_gid32_t gid_t; + +typedef struct { + gid_t val; +} kgid_t; + +struct kernel_cap_struct { + __u32 cap[2]; +}; + +typedef struct kernel_cap_struct kernel_cap_t; + +struct user_struct; + +struct ucounts; + +struct group_info; + +struct cred { + atomic_t usage; + atomic_t subscribers; + void *put_addr; + unsigned int magic; + kuid_t uid; + kgid_t gid; + kuid_t suid; + kgid_t sgid; + kuid_t euid; + kgid_t egid; + kuid_t fsuid; + kgid_t fsgid; + unsigned int securebits; + kernel_cap_t cap_inheritable; + kernel_cap_t cap_permitted; + kernel_cap_t cap_effective; + kernel_cap_t cap_bset; + kernel_cap_t cap_ambient; + unsigned char jit_keyring; + struct key *session_keyring; + struct key *process_keyring; + struct key *thread_keyring; + struct key *request_key_auth; + void *security; + struct user_struct *user; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct group_info *group_info; + union { + int non_rcu; + struct callback_head rcu; + }; +}; + +enum uprobe_task_state { + UTASK_RUNNING = 0, + UTASK_SSTEP = 1, + UTASK_SSTEP_ACK = 2, + UTASK_SSTEP_TRAPPED = 3, +}; + +struct arch_uprobe_task {}; + +struct uprobe; + +struct return_instance; + +struct uprobe_task { + enum uprobe_task_state state; + union { + struct { + struct arch_uprobe_task autask; + long unsigned int vaddr; + }; + struct { + struct callback_head dup_xol_work; + long unsigned int dup_xol_addr; + }; + }; + struct uprobe *active_uprobe; + long unsigned int xol_vaddr; + struct return_instance *return_instances; + unsigned int depth; +}; + +struct vm_struct { + struct vm_struct *next; + void *addr; + long unsigned int size; + long unsigned int flags; + struct page **pages; + unsigned int page_order; + unsigned int nr_pages; + phys_addr_t phys_addr; + const void *caller; +}; + +enum rseq_event_mask_bits { + RSEQ_EVENT_PREEMPT_BIT = 0, + RSEQ_EVENT_SIGNAL_BIT = 1, + RSEQ_EVENT_MIGRATE_BIT = 2, +}; + +struct return_instance { + struct uprobe *uprobe; + long unsigned int func; + long unsigned int stack; + long unsigned int orig_ret_vaddr; + bool chained; + struct return_instance *next; +}; + +typedef unsigned int vm_fault_t; + +enum migratetype { + MIGRATE_UNMOVABLE = 0, + MIGRATE_MOVABLE = 1, + MIGRATE_RECLAIMABLE = 2, + MIGRATE_PCPTYPES = 3, + MIGRATE_HIGHATOMIC = 3, + MIGRATE_CMA = 4, + MIGRATE_ISOLATE = 5, + MIGRATE_TYPES = 6, +}; + +enum numa_stat_item { + NUMA_HIT = 0, + NUMA_MISS = 1, + NUMA_FOREIGN = 2, + NUMA_INTERLEAVE_HIT = 3, + NUMA_LOCAL = 4, + NUMA_OTHER = 5, + NR_VM_NUMA_EVENT_ITEMS = 6, +}; + +enum zone_stat_item { + NR_FREE_PAGES = 0, + NR_ZONE_LRU_BASE = 1, + NR_ZONE_INACTIVE_ANON = 1, + NR_ZONE_ACTIVE_ANON = 2, + NR_ZONE_INACTIVE_FILE = 3, + NR_ZONE_ACTIVE_FILE = 4, + NR_ZONE_UNEVICTABLE = 5, + NR_ZONE_WRITE_PENDING = 6, + NR_MLOCK = 7, + NR_BOUNCE = 8, + NR_FREE_CMA_PAGES = 9, + NR_VM_ZONE_STAT_ITEMS = 10, +}; + +enum node_stat_item { + NR_LRU_BASE = 0, + NR_INACTIVE_ANON = 0, + NR_ACTIVE_ANON = 1, + NR_INACTIVE_FILE = 2, + NR_ACTIVE_FILE = 3, + NR_UNEVICTABLE = 4, + NR_SLAB_RECLAIMABLE_B = 5, + NR_SLAB_UNRECLAIMABLE_B = 6, + NR_ISOLATED_ANON = 7, + NR_ISOLATED_FILE = 8, + WORKINGSET_NODES = 9, + WORKINGSET_REFAULT_BASE = 10, + WORKINGSET_REFAULT_ANON = 10, + WORKINGSET_REFAULT_FILE = 11, + WORKINGSET_ACTIVATE_BASE = 12, + WORKINGSET_ACTIVATE_ANON = 12, + WORKINGSET_ACTIVATE_FILE = 13, + WORKINGSET_RESTORE_BASE = 14, + WORKINGSET_RESTORE_ANON = 14, + WORKINGSET_RESTORE_FILE = 15, + WORKINGSET_NODERECLAIM = 16, + NR_ANON_MAPPED = 17, + NR_FILE_MAPPED = 18, + NR_FILE_PAGES = 19, + NR_FILE_DIRTY = 20, + NR_WRITEBACK = 21, + NR_WRITEBACK_TEMP = 22, + NR_SHMEM = 23, + NR_SHMEM_THPS = 24, + NR_SHMEM_PMDMAPPED = 25, + NR_FILE_THPS = 26, + NR_FILE_PMDMAPPED = 27, + NR_ANON_THPS = 28, + NR_VMSCAN_WRITE = 29, + NR_VMSCAN_IMMEDIATE = 30, + NR_DIRTIED = 31, + NR_WRITTEN = 32, + NR_THROTTLED_WRITTEN = 33, + NR_KERNEL_MISC_RECLAIMABLE = 34, + NR_FOLL_PIN_ACQUIRED = 35, + NR_FOLL_PIN_RELEASED = 36, + NR_KERNEL_STACK_KB = 37, + NR_PAGETABLE = 38, + NR_SECONDARY_PAGETABLE = 39, + NR_SWAPCACHE = 40, + PGPROMOTE_SUCCESS = 41, + PGPROMOTE_CANDIDATE = 42, + NR_VM_NODE_STAT_ITEMS = 43, +}; + +enum lru_list { + LRU_INACTIVE_ANON = 0, + LRU_ACTIVE_ANON = 1, + LRU_INACTIVE_FILE = 2, + LRU_ACTIVE_FILE = 3, + LRU_UNEVICTABLE = 4, + NR_LRU_LISTS = 5, +}; + +enum vmscan_throttle_state { + VMSCAN_THROTTLE_WRITEBACK = 0, + VMSCAN_THROTTLE_ISOLATED = 1, + VMSCAN_THROTTLE_NOPROGRESS = 2, + VMSCAN_THROTTLE_CONGESTED = 3, + NR_VMSCAN_THROTTLE = 4, +}; + +enum zone_watermarks { + WMARK_MIN = 0, + WMARK_LOW = 1, + WMARK_HIGH = 2, + WMARK_PROMO = 3, + NR_WMARK = 4, +}; + +enum { + ZONELIST_FALLBACK = 0, + ZONELIST_NOFALLBACK = 1, + MAX_ZONELISTS = 2, +}; + +enum kmalloc_cache_type { + KMALLOC_NORMAL = 0, + KMALLOC_RECLAIM = 1, + KMALLOC_DMA = 2, + KMALLOC_CGROUP = 3, + NR_KMALLOC_TYPES = 4, +}; + +enum { + HI_SOFTIRQ = 0, + TIMER_SOFTIRQ = 1, + NET_TX_SOFTIRQ = 2, + NET_RX_SOFTIRQ = 3, + BLOCK_SOFTIRQ = 4, + IRQ_POLL_SOFTIRQ = 5, + TASKLET_SOFTIRQ = 6, + SCHED_SOFTIRQ = 7, + HRTIMER_SOFTIRQ = 8, + RCU_SOFTIRQ = 9, + NR_SOFTIRQS = 10, +}; + +typedef long unsigned int uintptr_t; + +struct optimistic_spin_node { + struct optimistic_spin_node *next; + struct optimistic_spin_node *prev; + int locked; + int cpu; +}; + +typedef signed char __s8; + +typedef __s8 s8; + +typedef __kernel_long_t __kernel_ssize_t; + +typedef long long int __kernel_loff_t; + +typedef __u32 __le32; + +typedef unsigned int __poll_t; + +typedef u32 __kernel_dev_t; + +typedef __kernel_dev_t dev_t; + +typedef short unsigned int umode_t; + +typedef __kernel_loff_t loff_t; + +typedef __kernel_ssize_t ssize_t; + +typedef s32 int32_t; + +typedef u32 uint32_t; + +typedef u64 sector_t; + +typedef u64 blkcnt_t; + +typedef unsigned int fmode_t; + +struct kernel_symbol { + int value_offset; + int name_offset; + int namespace_offset; +}; + +struct fs_context; + +struct fs_parameter_spec; + +struct dentry; + +struct super_block; + +struct module; + +struct file_system_type { + const char *name; + int fs_flags; + int (*init_fs_context)(struct fs_context *); + const struct fs_parameter_spec *parameters; + struct dentry * (*mount)(struct file_system_type *, int, const char *, void *); + void (*kill_sb)(struct super_block *); + struct module *owner; + struct file_system_type *next; + struct hlist_head fs_supers; + struct lock_class_key s_lock_key; + struct lock_class_key s_umount_key; + struct lock_class_key s_vfs_rename_key; + struct lock_class_key s_writers_key[3]; + struct lock_class_key i_lock_key; + struct lock_class_key i_mutex_key; + struct lock_class_key invalidate_lock_key; + struct lock_class_key i_mutex_dir_key; +}; + +struct ratelimit_state { + raw_spinlock_t lock; + int interval; + int burst; + int printed; + int missed; + long unsigned int begin; + long unsigned int flags; +}; + +typedef void *fl_owner_t; + +struct kiocb; + +struct iov_iter; + +struct io_comp_batch; + +struct dir_context; + +struct poll_table_struct; + +struct vm_area_struct; + +struct inode; + +struct file_lock; + +struct seq_file; + +struct io_uring_cmd; + +struct file_operations { + struct module *owner; + loff_t (*llseek)(struct file *, loff_t, int); + ssize_t (*read)(struct file *, char *, size_t, loff_t *); + ssize_t (*write)(struct file *, const char *, size_t, loff_t *); + ssize_t (*read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*write_iter)(struct kiocb *, struct iov_iter *); + int (*iopoll)(struct kiocb *, struct io_comp_batch *, unsigned int); + int (*iterate)(struct file *, struct dir_context *); + int (*iterate_shared)(struct file *, struct dir_context *); + __poll_t (*poll)(struct file *, struct poll_table_struct *); + long int (*unlocked_ioctl)(struct file *, unsigned int, long unsigned int); + long int (*compat_ioctl)(struct file *, unsigned int, long unsigned int); + int (*mmap)(struct file *, struct vm_area_struct *); + long unsigned int mmap_supported_flags; + int (*open)(struct inode *, struct file *); + int (*flush)(struct file *, fl_owner_t); + int (*release)(struct inode *, struct file *); + int (*fsync)(struct file *, loff_t, loff_t, int); + int (*fasync)(int, struct file *, int); + int (*lock)(struct file *, int, struct file_lock *); + ssize_t (*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int); + long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + int (*check_flags)(int); + int (*flock)(struct file *, int, struct file_lock *); + ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); + ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + int (*setlease)(struct file *, long int, struct file_lock **, void **); + long int (*fallocate)(struct file *, int, loff_t, loff_t); + void (*show_fdinfo)(struct seq_file *, struct file *); + ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int); + loff_t (*remap_file_range)(struct file *, loff_t, struct file *, loff_t, loff_t, unsigned int); + int (*fadvise)(struct file *, loff_t, loff_t, int); + int (*uring_cmd)(struct io_uring_cmd *, unsigned int); + int (*uring_cmd_iopoll)(struct io_uring_cmd *, struct io_comp_batch *, unsigned int); +}; + +struct static_call_key { + void *func; +}; + +struct bug_entry { + int bug_addr_disp; + int file_disp; + short unsigned int line; + short unsigned int flags; +}; + +typedef __s64 time64_t; + +struct timespec64 { + time64_t tv_sec; + long int tv_nsec; +}; + +typedef u64 pteval_t; + +typedef struct { + pteval_t pgprot; +} pgprot_t; + +struct workqueue_struct; + +struct delayed_work { + struct work_struct work; + struct timer_list timer; + struct workqueue_struct *wq; + int cpu; +}; + +typedef struct { + seqcount_spinlock_t seqcount; + spinlock_t lock; +} seqlock_t; + +struct rlimit { + __kernel_ulong_t rlim_cur; + __kernel_ulong_t rlim_max; +}; + +typedef void __signalfn_t(int); + +typedef __signalfn_t *__sighandler_t; + +typedef void __restorefn_t(); + +typedef __restorefn_t *__sigrestore_t; + +struct sigaction { + __sighandler_t sa_handler; + long unsigned int sa_flags; + __sigrestore_t sa_restorer; + sigset_t sa_mask; +}; + +struct k_sigaction { + struct sigaction sa; +}; + +struct cpu_itimer { + u64 expires; + u64 incr; +}; + +struct task_cputime_atomic { + atomic64_t utime; + atomic64_t stime; + atomic64_t sum_exec_runtime; +}; + +struct thread_group_cputimer { + struct task_cputime_atomic cputime_atomic; +}; + +struct pacct_struct { + int ac_flag; + long int ac_exitcode; + long unsigned int ac_mem; + u64 ac_utime; + u64 ac_stime; + long unsigned int ac_minflt; + long unsigned int ac_majflt; +}; + +struct core_state; + +struct tty_struct; + +struct taskstats; + +struct tty_audit_buf; + +struct signal_struct { + refcount_t sigcnt; + atomic_t live; + int nr_threads; + int quick_threads; + struct list_head thread_head; + wait_queue_head_t wait_chldexit; + struct task_struct *curr_target; + struct sigpending shared_pending; + struct hlist_head multiprocess; + int group_exit_code; + int notify_count; + struct task_struct *group_exec_task; + int group_stop_count; + unsigned int flags; + struct core_state *core_state; + unsigned int is_child_subreaper: 1; + unsigned int has_child_subreaper: 1; + int posix_timer_id; + struct list_head posix_timers; + struct hrtimer real_timer; + ktime_t it_real_incr; + struct cpu_itimer it[2]; + struct thread_group_cputimer cputimer; + struct posix_cputimers posix_cputimers; + struct pid *pids[4]; + struct pid *tty_old_pgrp; + int leader; + struct tty_struct *tty; + seqlock_t stats_lock; + u64 utime; + u64 stime; + u64 cutime; + u64 cstime; + u64 gtime; + u64 cgtime; + struct prev_cputime prev_cputime; + long unsigned int nvcsw; + long unsigned int nivcsw; + long unsigned int cnvcsw; + long unsigned int cnivcsw; + long unsigned int min_flt; + long unsigned int maj_flt; + long unsigned int cmin_flt; + long unsigned int cmaj_flt; + long unsigned int inblock; + long unsigned int oublock; + long unsigned int cinblock; + long unsigned int coublock; + long unsigned int maxrss; + long unsigned int cmaxrss; + struct task_io_accounting ioac; + long long unsigned int sum_sched_runtime; + struct rlimit rlim[16]; + struct pacct_struct pacct; + struct taskstats *stats; + unsigned int audit_tty; + struct tty_audit_buf *tty_audit_buf; + bool oom_flag_origin; + short int oom_score_adj; + short int oom_score_adj_min; + struct mm_struct *oom_mm; + struct mutex cred_guard_mutex; + struct rw_semaphore exec_update_lock; +}; + +typedef int32_t key_serial_t; + +typedef uint32_t key_perm_t; + +struct key_type; + +struct key_tag; + +struct keyring_index_key { + long unsigned int hash; + union { + struct { + u16 desc_len; + char desc[6]; + }; + long unsigned int x; + }; + struct key_type *type; + struct key_tag *domain_tag; + const char *description; +}; + +union key_payload { + void *rcu_data0; + void *data[4]; +}; + +struct assoc_array_ptr; + +struct assoc_array { + struct assoc_array_ptr *root; + long unsigned int nr_leaves_on_tree; +}; + +struct key_user; + +struct key_restriction; + +struct key { + refcount_t usage; + key_serial_t serial; + union { + struct list_head graveyard_link; + struct rb_node serial_node; + }; + struct rw_semaphore sem; + struct key_user *user; + void *security; + union { + time64_t expiry; + time64_t revoked_at; + }; + time64_t last_used_at; + kuid_t uid; + kgid_t gid; + key_perm_t perm; + short unsigned int quotalen; + short unsigned int datalen; + short int state; + long unsigned int flags; + union { + struct keyring_index_key index_key; + struct { + long unsigned int hash; + long unsigned int len_desc; + struct key_type *type; + struct key_tag *domain_tag; + char *description; + }; + }; + union { + union key_payload payload; + struct { + struct list_head name_link; + struct assoc_array keys; + }; + }; + struct key_restriction *restrict_link; +}; + +struct sighand_struct { + spinlock_t siglock; + refcount_t count; + wait_queue_head_t signalfd_wqh; + struct k_sigaction action[64]; +}; + +struct io_context { + atomic_long_t refcount; + atomic_t active_ref; + short unsigned int ioprio; +}; + +struct kref { + refcount_t refcount; +}; + +struct xarray { + spinlock_t xa_lock; + gfp_t xa_flags; + void *xa_head; +}; + +typedef u32 errseq_t; + +struct address_space_operations; + +struct address_space { + struct inode *host; + struct xarray i_pages; + struct rw_semaphore invalidate_lock; + gfp_t gfp_mask; + atomic_t i_mmap_writable; + struct rb_root_cached i_mmap; + struct rw_semaphore i_mmap_rwsem; + long unsigned int nrpages; + long unsigned int writeback_index; + const struct address_space_operations *a_ops; + long unsigned int flags; + errseq_t wb_err; + spinlock_t private_lock; + struct list_head private_list; + void *private_data; +}; + +struct folio { + union { + struct { + long unsigned int flags; + union { + struct list_head lru; + struct { + void *__filler; + unsigned int mlock_count; + }; + }; + struct address_space *mapping; + long unsigned int index; + void *private; + atomic_t _mapcount; + atomic_t _refcount; + long unsigned int memcg_data; + }; + struct page page; + }; + long unsigned int _flags_1; + long unsigned int __head; + unsigned char _folio_dtor; + unsigned char _folio_order; + atomic_t _total_mapcount; + atomic_t _pincount; + unsigned int _folio_nr_pages; +}; + +struct vfsmount; + +struct path { + struct vfsmount *mnt; + struct dentry *dentry; +}; + +struct fown_struct { + rwlock_t lock; + struct pid *pid; + enum pid_type pid_type; + kuid_t uid; + kuid_t euid; + int signum; +}; + +struct file_ra_state { + long unsigned int start; + unsigned int size; + unsigned int async_size; + unsigned int ra_pages; + unsigned int mmap_miss; + loff_t prev_pos; +}; + +struct file { + union { + struct llist_node f_llist; + struct callback_head f_rcuhead; + unsigned int f_iocb_flags; + }; + struct path f_path; + struct inode *f_inode; + const struct file_operations *f_op; + spinlock_t f_lock; + atomic_long_t f_count; + unsigned int f_flags; + fmode_t f_mode; + struct mutex f_pos_lock; + loff_t f_pos; + struct fown_struct f_owner; + const struct cred *f_cred; + struct file_ra_state f_ra; + u64 f_version; + void *f_security; + void *private_data; + struct hlist_head *f_ep; + struct address_space *f_mapping; + errseq_t f_wb_err; + errseq_t f_sb_err; +}; + +struct userfaultfd_ctx; + +struct vm_userfaultfd_ctx { + struct userfaultfd_ctx *ctx; +}; + +struct anon_vma_name { + struct kref kref; + char name[0]; +}; + +struct anon_vma; + +struct vm_operations_struct; + +struct vm_area_struct { + long unsigned int vm_start; + long unsigned int vm_end; + struct mm_struct *vm_mm; + pgprot_t vm_page_prot; + long unsigned int vm_flags; + union { + struct { + struct rb_node rb; + long unsigned int rb_subtree_last; + } shared; + struct anon_vma_name *anon_name; + }; + struct list_head anon_vma_chain; + struct anon_vma *anon_vma; + const struct vm_operations_struct *vm_ops; + long unsigned int vm_pgoff; + struct file *vm_file; + void *vm_private_data; + atomic_long_t swap_readahead_info; + struct mempolicy *vm_policy; + struct vm_userfaultfd_ctx vm_userfaultfd_ctx; +}; + +enum page_entry_size { + PE_SIZE_PTE = 0, + PE_SIZE_PMD = 1, + PE_SIZE_PUD = 2, +}; + +struct vm_fault; + +struct vm_operations_struct { + void (*open)(struct vm_area_struct *); + void (*close)(struct vm_area_struct *); + int (*may_split)(struct vm_area_struct *, long unsigned int); + int (*mremap)(struct vm_area_struct *); + int (*mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int, long unsigned int); + vm_fault_t (*fault)(struct vm_fault *); + vm_fault_t (*huge_fault)(struct vm_fault *, enum page_entry_size); + vm_fault_t (*map_pages)(struct vm_fault *, long unsigned int, long unsigned int); + long unsigned int (*pagesize)(struct vm_area_struct *); + vm_fault_t (*page_mkwrite)(struct vm_fault *); + vm_fault_t (*pfn_mkwrite)(struct vm_fault *); + int (*access)(struct vm_area_struct *, long unsigned int, void *, int, int); + const char * (*name)(struct vm_area_struct *); + int (*set_policy)(struct vm_area_struct *, struct mempolicy *); + struct mempolicy * (*get_policy)(struct vm_area_struct *, long unsigned int); + struct page * (*find_special_page)(struct vm_area_struct *, long unsigned int); +}; + +struct rcu_segcblist { + struct callback_head *head; + struct callback_head **tails[4]; + long unsigned int gp_seq[4]; + long int len; + long int seglen[4]; + u8 flags; +}; + +struct srcu_node; + +struct srcu_struct; + +struct srcu_data { + atomic_long_t srcu_lock_count[2]; + atomic_long_t srcu_unlock_count[2]; + int srcu_nmi_safety; + long: 32; + long: 64; + long: 64; + long: 64; + spinlock_t lock; + struct rcu_segcblist srcu_cblist; + long unsigned int srcu_gp_seq_needed; + long unsigned int srcu_gp_seq_needed_exp; + bool srcu_cblist_invoking; + struct timer_list delay_work; + struct work_struct work; + struct callback_head srcu_barrier_head; + struct srcu_node *mynode; + long unsigned int grpmask; + int cpu; + struct srcu_struct *ssp; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct srcu_node { + spinlock_t lock; + long unsigned int srcu_have_cbs[4]; + long unsigned int srcu_data_have_cbs[4]; + long unsigned int srcu_gp_seq_needed_exp; + struct srcu_node *srcu_parent; + int grplo; + int grphi; +}; + +struct srcu_struct { + struct srcu_node *node; + struct srcu_node *level[3]; + int srcu_size_state; + struct mutex srcu_cb_mutex; + spinlock_t lock; + struct mutex srcu_gp_mutex; + unsigned int srcu_idx; + long unsigned int srcu_gp_seq; + long unsigned int srcu_gp_seq_needed; + long unsigned int srcu_gp_seq_needed_exp; + long unsigned int srcu_gp_start; + long unsigned int srcu_last_gp_end; + long unsigned int srcu_size_jiffies; + long unsigned int srcu_n_lock_retries; + long unsigned int srcu_n_exp_nodelay; + struct srcu_data *sda; + bool sda_is_static; + long unsigned int srcu_barrier_seq; + struct mutex srcu_barrier_mutex; + struct completion srcu_barrier_completion; + atomic_t srcu_barrier_cpu_cnt; + long unsigned int reschedule_jiffies; + long unsigned int reschedule_count; + struct delayed_work work; + struct lockdep_map dep_map; +}; + +struct list_lru_node; + +struct list_lru { + struct list_lru_node *node; + struct list_head list; + int shrinker_id; + bool memcg_aware; + struct xarray xa; +}; + +struct kernfs_root; + +struct kernfs_elem_dir { + long unsigned int subdirs; + struct rb_root children; + struct kernfs_root *root; + long unsigned int rev; +}; + +struct kernfs_node; + +struct kernfs_elem_symlink { + struct kernfs_node *target_kn; +}; + +struct kernfs_ops; + +struct kernfs_open_node; + +struct kernfs_elem_attr { + const struct kernfs_ops *ops; + struct kernfs_open_node *open; + loff_t size; + struct kernfs_node *notify_next; +}; + +struct kernfs_iattrs; + +struct kernfs_node { + atomic_t count; + atomic_t active; + struct lockdep_map dep_map; + struct kernfs_node *parent; + const char *name; + struct rb_node rb; + const void *ns; + unsigned int hash; + union { + struct kernfs_elem_dir dir; + struct kernfs_elem_symlink symlink; + struct kernfs_elem_attr attr; + }; + void *priv; + u64 id; + short unsigned int flags; + umode_t mode; + struct kernfs_iattrs *iattr; +}; + +struct kernfs_open_file; + +struct kernfs_ops { + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + ssize_t (*read)(struct kernfs_open_file *, char *, size_t, loff_t); + size_t atomic_write_len; + bool prealloc; + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); + int (*mmap)(struct kernfs_open_file *, struct vm_area_struct *); +}; + +struct kernfs_open_file { + struct kernfs_node *kn; + struct file *file; + struct seq_file *seq_file; + void *priv; + struct mutex mutex; + struct mutex prealloc_mutex; + int event; + struct list_head list; + char *prealloc_buf; + size_t atomic_write_len; + bool mmapped: 1; + bool released: 1; + const struct vm_operations_struct *vm_ops; +}; + +enum kobj_ns_type { + KOBJ_NS_TYPE_NONE = 0, + KOBJ_NS_TYPE_NET = 1, + KOBJ_NS_TYPES = 2, +}; + +struct sock; + +struct kobj_ns_type_operations { + enum kobj_ns_type type; + bool (*current_may_mount)(); + void * (*grab_current_ns)(); + const void * (*netlink_ns)(struct sock *); + const void * (*initial_ns)(); + void (*drop_ns)(void *); +}; + +struct kstat { + u32 result_mask; + umode_t mode; + unsigned int nlink; + uint32_t blksize; + u64 attributes; + u64 attributes_mask; + u64 ino; + dev_t dev; + dev_t rdev; + kuid_t uid; + kgid_t gid; + loff_t size; + struct timespec64 atime; + struct timespec64 mtime; + struct timespec64 ctime; + struct timespec64 btime; + u64 blocks; + u64 mnt_id; + u32 dio_mem_align; + u32 dio_offset_align; +}; + +struct attribute { + const char *name; + umode_t mode; + bool ignore_lockdep: 1; + struct lock_class_key *key; + struct lock_class_key skey; +}; + +struct kobject; + +struct bin_attribute; + +struct attribute_group { + const char *name; + umode_t (*is_visible)(struct kobject *, struct attribute *, int); + umode_t (*is_bin_visible)(struct kobject *, struct bin_attribute *, int); + struct attribute **attrs; + struct bin_attribute **bin_attrs; +}; + +struct kset; + +struct kobj_type; + +struct kobject { + const char *name; + struct list_head entry; + struct kobject *parent; + struct kset *kset; + const struct kobj_type *ktype; + struct kernfs_node *sd; + struct kref kref; + unsigned int state_initialized: 1; + unsigned int state_in_sysfs: 1; + unsigned int state_add_uevent_sent: 1; + unsigned int state_remove_uevent_sent: 1; + unsigned int uevent_suppress: 1; +}; + +struct bin_attribute { + struct attribute attr; + size_t size; + void *private; + struct address_space * (*f_mapping)(); + ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t); + int (*mmap)(struct file *, struct kobject *, struct bin_attribute *, struct vm_area_struct *); +}; + +struct sysfs_ops { + ssize_t (*show)(struct kobject *, struct attribute *, char *); + ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); +}; + +struct kset_uevent_ops; + +struct kset { + struct list_head list; + spinlock_t list_lock; + struct kobject kobj; + const struct kset_uevent_ops *uevent_ops; +}; + +struct kobj_type { + void (*release)(struct kobject *); + const struct sysfs_ops *sysfs_ops; + const struct attribute_group **default_groups; + const struct kobj_ns_type_operations * (*child_ns_type)(struct kobject *); + const void * (*namespace)(struct kobject *); + void (*get_ownership)(struct kobject *, kuid_t *, kgid_t *); +}; + +struct kobj_uevent_env { + char *argv[3]; + char *envp[64]; + int envp_idx; + char buf[2048]; + int buflen; +}; + +struct kset_uevent_ops { + int (* const filter)(struct kobject *); + const char * (* const name)(struct kobject *); + int (* const uevent)(struct kobject *, struct kobj_uevent_env *); +}; + +enum module_state { + MODULE_STATE_LIVE = 0, + MODULE_STATE_COMING = 1, + MODULE_STATE_GOING = 2, + MODULE_STATE_UNFORMED = 3, +}; + +struct module_param_attrs; + +struct module_kobject { + struct kobject kobj; + struct module *mod; + struct kobject *drivers_dir; + struct module_param_attrs *mp; + struct completion *kobj_completion; +}; + +struct latch_tree_node { + struct rb_node node[2]; +}; + +struct mod_tree_node { + struct module *mod; + struct latch_tree_node node; +}; + +struct module_layout { + void *base; + unsigned int size; + unsigned int text_size; + unsigned int ro_size; + unsigned int ro_after_init_size; + struct mod_tree_node mtn; +}; + +struct mod_plt_sec { + int plt_shndx; + int plt_num_entries; + int plt_max_entries; +}; + +struct plt_entry; + +struct mod_arch_specific { + struct mod_plt_sec core; + struct mod_plt_sec init; + struct plt_entry *ftrace_trampolines; +}; + +struct elf64_sym; + +typedef struct elf64_sym Elf64_Sym; + +struct mod_kallsyms { + Elf64_Sym *symtab; + unsigned int num_symtab; + char *strtab; + char *typetab; +}; + +typedef const int tracepoint_ptr_t; + +struct module_attribute; + +struct kernel_param; + +struct exception_table_entry; + +struct module_sect_attrs; + +struct module_notes_attrs; + +struct bpf_raw_event_map; + +struct trace_event_call; + +struct trace_eval_map; + +struct error_injection_entry; + +struct module { + enum module_state state; + struct list_head list; + char name[56]; + struct module_kobject mkobj; + struct module_attribute *modinfo_attrs; + const char *version; + const char *srcversion; + struct kobject *holders_dir; + const struct kernel_symbol *syms; + const s32 *crcs; + unsigned int num_syms; + struct mutex param_lock; + struct kernel_param *kp; + unsigned int num_kp; + unsigned int num_gpl_syms; + const struct kernel_symbol *gpl_syms; + const s32 *gpl_crcs; + bool using_gplonly_symbols; + bool async_probe_requested; + unsigned int num_exentries; + struct exception_table_entry *extable; + int (*init)(); + long: 64; + long: 64; + struct module_layout core_layout; + struct module_layout init_layout; + struct mod_arch_specific arch; + long unsigned int taints; + unsigned int num_bugs; + struct list_head bug_list; + struct bug_entry *bug_table; + struct mod_kallsyms *kallsyms; + struct mod_kallsyms core_kallsyms; + struct module_sect_attrs *sect_attrs; + struct module_notes_attrs *notes_attrs; + char *args; + void *percpu; + unsigned int percpu_size; + void *noinstr_text_start; + unsigned int noinstr_text_size; + unsigned int num_tracepoints; + tracepoint_ptr_t *tracepoints_ptrs; + unsigned int num_srcu_structs; + struct srcu_struct **srcu_struct_ptrs; + unsigned int num_bpf_raw_events; + struct bpf_raw_event_map *bpf_raw_events; + unsigned int btf_data_size; + void *btf_data; + struct jump_entry *jump_entries; + unsigned int num_jump_entries; + unsigned int num_trace_bprintk_fmt; + const char **trace_bprintk_fmt_start; + struct trace_event_call **trace_events; + unsigned int num_trace_events; + struct trace_eval_map **trace_evals; + unsigned int num_trace_evals; + unsigned int num_ftrace_callsites; + long unsigned int *ftrace_callsites; + void *kprobes_text_start; + unsigned int kprobes_text_size; + long unsigned int *kprobe_blacklist; + unsigned int num_kprobe_blacklist; + struct list_head source_list; + struct list_head target_list; + void (*exit)(); + atomic_t refcnt; + struct error_injection_entry *ei_funcs; + unsigned int num_ei_funcs; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct tracepoint_func { + void *func; + void *data; + int prio; +}; + +struct tracepoint { + const char *name; + struct static_key key; + struct static_call_key *static_call_key; + void *static_call_tramp; + void *iterator; + int (*regfunc)(); + void (*unregfunc)(); + struct tracepoint_func *funcs; +}; + +struct bpf_raw_event_map { + struct tracepoint *tp; + void *bpf_func; + u32 num_args; + u32 writable_size; + long: 64; +}; + +enum cpu_idle_type { + CPU_IDLE = 0, + CPU_NOT_IDLE = 1, + CPU_NEWLY_IDLE = 2, + CPU_MAX_IDLE_TYPES = 3, +}; + +enum { + __SD_BALANCE_NEWIDLE = 0, + __SD_BALANCE_EXEC = 1, + __SD_BALANCE_FORK = 2, + __SD_BALANCE_WAKE = 3, + __SD_WAKE_AFFINE = 4, + __SD_ASYM_CPUCAPACITY = 5, + __SD_ASYM_CPUCAPACITY_FULL = 6, + __SD_SHARE_CPUCAPACITY = 7, + __SD_SHARE_PKG_RESOURCES = 8, + __SD_SERIALIZE = 9, + __SD_ASYM_PACKING = 10, + __SD_PREFER_SIBLING = 11, + __SD_OVERLAP = 12, + __SD_NUMA = 13, + __SD_FLAG_CNT = 14, +}; + +typedef __u64 Elf64_Addr; + +typedef __u16 Elf64_Half; + +typedef __u32 Elf64_Word; + +typedef __u64 Elf64_Xword; + +struct elf64_sym { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Half st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +}; + +struct hlist_bl_node; + +struct hlist_bl_head { + struct hlist_bl_node *first; +}; + +struct hlist_bl_node { + struct hlist_bl_node *next; + struct hlist_bl_node **pprev; +}; + +struct lockref { + union { + struct { + spinlock_t lock; + int count; + }; + }; +}; + +struct qstr { + union { + struct { + u32 hash; + u32 len; + }; + u64 hash_len; + }; + const unsigned char *name; +}; + +struct dentry_operations; + +struct dentry { + unsigned int d_flags; + seqcount_spinlock_t d_seq; + struct hlist_bl_node d_hash; + struct dentry *d_parent; + struct qstr d_name; + struct inode *d_inode; + unsigned char d_iname[32]; + struct lockref d_lockref; + const struct dentry_operations *d_op; + struct super_block *d_sb; + long unsigned int d_time; + void *d_fsdata; + union { + struct list_head d_lru; + wait_queue_head_t *d_wait; + }; + struct list_head d_child; + struct list_head d_subdirs; + union { + struct hlist_node d_alias; + struct hlist_bl_node d_in_lookup_hash; + struct callback_head d_rcu; + } d_u; +}; + +struct posix_acl; + +struct inode_operations; + +struct bdi_writeback; + +struct file_lock_context; + +struct cdev; + +struct fsnotify_mark_connector; + +struct inode { + umode_t i_mode; + short unsigned int i_opflags; + kuid_t i_uid; + kgid_t i_gid; + unsigned int i_flags; + struct posix_acl *i_acl; + struct posix_acl *i_default_acl; + const struct inode_operations *i_op; + struct super_block *i_sb; + struct address_space *i_mapping; + void *i_security; + long unsigned int i_ino; + union { + const unsigned int i_nlink; + unsigned int __i_nlink; + }; + dev_t i_rdev; + loff_t i_size; + struct timespec64 i_atime; + struct timespec64 i_mtime; + struct timespec64 i_ctime; + spinlock_t i_lock; + short unsigned int i_bytes; + u8 i_blkbits; + u8 i_write_hint; + blkcnt_t i_blocks; + long unsigned int i_state; + struct rw_semaphore i_rwsem; + long unsigned int dirtied_when; + long unsigned int dirtied_time_when; + struct hlist_node i_hash; + struct list_head i_io_list; + struct bdi_writeback *i_wb; + int i_wb_frn_winner; + u16 i_wb_frn_avg_time; + u16 i_wb_frn_history; + struct list_head i_lru; + struct list_head i_sb_list; + struct list_head i_wb_list; + union { + struct hlist_head i_dentry; + struct callback_head i_rcu; + }; + atomic64_t i_version; + atomic64_t i_sequence; + atomic_t i_count; + atomic_t i_dio_count; + atomic_t i_writecount; + atomic_t i_readcount; + union { + const struct file_operations *i_fop; + void (*free_inode)(struct inode *); + }; + struct file_lock_context *i_flctx; + struct address_space i_data; + struct list_head i_devices; + union { + struct pipe_inode_info *i_pipe; + struct cdev *i_cdev; + char *i_link; + unsigned int i_dir_seq; + }; + __u32 i_generation; + __u32 i_fsnotify_mask; + struct fsnotify_mark_connector *i_fsnotify_marks; + void *i_private; +}; + +struct dentry_operations { + int (*d_revalidate)(struct dentry *, unsigned int); + int (*d_weak_revalidate)(struct dentry *, unsigned int); + int (*d_hash)(const struct dentry *, struct qstr *); + int (*d_compare)(const struct dentry *, unsigned int, const char *, const struct qstr *); + int (*d_delete)(const struct dentry *); + int (*d_init)(struct dentry *); + void (*d_release)(struct dentry *); + void (*d_prune)(struct dentry *); + void (*d_iput)(struct dentry *, struct inode *); + char * (*d_dname)(struct dentry *, char *, int); + struct vfsmount * (*d_automount)(struct path *); + int (*d_manage)(const struct path *, bool); + struct dentry * (*d_real)(struct dentry *, const struct inode *); + long: 64; + long: 64; + long: 64; +}; + +struct mtd_info; + +typedef long long int qsize_t; + +struct quota_format_type; + +struct mem_dqinfo { + struct quota_format_type *dqi_format; + int dqi_fmt_id; + struct list_head dqi_dirty_list; + long unsigned int dqi_flags; + unsigned int dqi_bgrace; + unsigned int dqi_igrace; + qsize_t dqi_max_spc_limit; + qsize_t dqi_max_ino_limit; + void *dqi_priv; +}; + +struct quota_format_ops; + +struct quota_info { + unsigned int flags; + struct rw_semaphore dqio_sem; + struct inode *files[3]; + struct mem_dqinfo info[3]; + const struct quota_format_ops *ops[3]; +}; + +struct rcu_sync { + int gp_state; + int gp_count; + wait_queue_head_t gp_wait; + struct callback_head cb_head; +}; + +struct rcuwait { + struct task_struct *task; +}; + +struct percpu_rw_semaphore { + struct rcu_sync rss; + unsigned int *read_count; + struct rcuwait writer; + wait_queue_head_t waiters; + atomic_t block; + struct lockdep_map dep_map; +}; + +struct sb_writers { + int frozen; + wait_queue_head_t wait_unfrozen; + struct percpu_rw_semaphore rw_sem[3]; +}; + +typedef struct { + __u8 b[16]; +} uuid_t; + +struct shrink_control; + +struct shrinker { + long unsigned int (*count_objects)(struct shrinker *, struct shrink_control *); + long unsigned int (*scan_objects)(struct shrinker *, struct shrink_control *); + long int batch; + int seeks; + unsigned int flags; + struct list_head list; + int id; + atomic_long_t *nr_deferred; +}; + +struct super_operations; + +struct dquot_operations; + +struct quotactl_ops; + +struct export_operations; + +struct xattr_handler; + +struct block_device; + +struct super_block { + struct list_head s_list; + dev_t s_dev; + unsigned char s_blocksize_bits; + long unsigned int s_blocksize; + loff_t s_maxbytes; + struct file_system_type *s_type; + const struct super_operations *s_op; + const struct dquot_operations *dq_op; + const struct quotactl_ops *s_qcop; + const struct export_operations *s_export_op; + long unsigned int s_flags; + long unsigned int s_iflags; + long unsigned int s_magic; + struct dentry *s_root; + struct rw_semaphore s_umount; + int s_count; + atomic_t s_active; + void *s_security; + const struct xattr_handler **s_xattr; + struct hlist_bl_head s_roots; + struct list_head s_mounts; + struct block_device *s_bdev; + struct backing_dev_info *s_bdi; + struct mtd_info *s_mtd; + struct hlist_node s_instances; + unsigned int s_quota_types; + struct quota_info s_dquot; + struct sb_writers s_writers; + void *s_fs_info; + u32 s_time_gran; + time64_t s_time_min; + time64_t s_time_max; + __u32 s_fsnotify_mask; + struct fsnotify_mark_connector *s_fsnotify_marks; + char s_id[32]; + uuid_t s_uuid; + unsigned int s_max_links; + fmode_t s_mode; + struct mutex s_vfs_rename_mutex; + const char *s_subtype; + const struct dentry_operations *s_d_op; + struct shrinker s_shrink; + atomic_long_t s_remove_count; + atomic_long_t s_fsnotify_connectors; + int s_readonly_remount; + errseq_t s_wb_err; + struct workqueue_struct *s_dio_done_wq; + struct hlist_head s_pins; + struct user_namespace *s_user_ns; + struct list_lru s_dentry_lru; + struct list_lru s_inode_lru; + struct callback_head rcu; + struct work_struct destroy_work; + struct mutex s_sync_lock; + int s_stack_depth; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t s_inode_list_lock; + struct list_head s_inodes; + spinlock_t s_inode_wblist_lock; + struct list_head s_inodes_wb; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct mnt_idmap; + +struct vfsmount { + struct dentry *mnt_root; + struct super_block *mnt_sb; + int mnt_flags; + struct mnt_idmap *mnt_idmap; +}; + +struct shrink_control { + gfp_t gfp_mask; + int nid; + long unsigned int nr_to_scan; + long unsigned int nr_scanned; + struct mem_cgroup *memcg; +}; + +struct list_lru_one { + struct list_head list; + long int nr_items; +}; + +struct list_lru_node { + spinlock_t lock; + struct list_lru_one lru; + long int nr_items; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum migrate_mode { + MIGRATE_ASYNC = 0, + MIGRATE_SYNC_LIGHT = 1, + MIGRATE_SYNC = 2, + MIGRATE_SYNC_NO_COPY = 3, +}; + +struct exception_table_entry { + int insn; + int fixup; + short int type; + short int data; +}; + +struct key_tag { + struct callback_head rcu; + refcount_t usage; + bool removed; +}; + +typedef int (*request_key_actor_t)(struct key *, void *); + +struct key_preparsed_payload; + +struct key_match_data; + +struct kernel_pkey_params; + +struct kernel_pkey_query; + +struct key_type { + const char *name; + size_t def_datalen; + unsigned int flags; + int (*vet_description)(const char *); + int (*preparse)(struct key_preparsed_payload *); + void (*free_preparse)(struct key_preparsed_payload *); + int (*instantiate)(struct key *, struct key_preparsed_payload *); + int (*update)(struct key *, struct key_preparsed_payload *); + int (*match_preparse)(struct key_match_data *); + void (*match_free)(struct key_match_data *); + void (*revoke)(struct key *); + void (*destroy)(struct key *); + void (*describe)(const struct key *, struct seq_file *); + long int (*read)(const struct key *, char *, size_t); + request_key_actor_t request_key; + struct key_restriction * (*lookup_restriction)(const char *); + int (*asym_query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*asym_eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*asym_verify_signature)(struct kernel_pkey_params *, const void *, const void *); + struct list_head link; + struct lock_class_key lock_class; +}; + +typedef int (*key_restrict_link_func_t)(struct key *, const struct key_type *, const union key_payload *, struct key *); + +struct key_restriction { + key_restrict_link_func_t check; + struct key *key; + struct key_type *keytype; +}; + +struct percpu_counter { + raw_spinlock_t lock; + s64 count; + struct list_head list; + s32 *counters; +}; + +struct user_struct { + refcount_t __count; + struct percpu_counter epoll_watches; + long unsigned int unix_inflight; + atomic_long_t pipe_bufs; + struct hlist_node uidhash_node; + kuid_t uid; + atomic_long_t locked_vm; + struct ratelimit_state ratelimit; +}; + +struct group_info { + atomic_t usage; + int ngroups; + kgid_t gid[0]; +}; + +struct core_thread { + struct task_struct *task; + struct core_thread *next; +}; + +struct core_state { + atomic_t nr_threads; + struct core_thread dumper; + struct completion startup; +}; + +struct delayed_call { + void (*fn)(void *); + void *arg; +}; + +typedef struct { + uid_t val; +} vfsuid_t; + +typedef struct { + gid_t val; +} vfsgid_t; + +struct wait_page_queue; + +struct kiocb { + struct file *ki_filp; + loff_t ki_pos; + void (*ki_complete)(struct kiocb *, long int); + void *private; + int ki_flags; + u16 ki_ioprio; + struct wait_page_queue *ki_waitq; +}; + +struct iattr { + unsigned int ia_valid; + umode_t ia_mode; + union { + kuid_t ia_uid; + vfsuid_t ia_vfsuid; + }; + union { + kgid_t ia_gid; + vfsgid_t ia_vfsgid; + }; + loff_t ia_size; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct file *ia_file; +}; + +typedef __kernel_uid32_t projid_t; + +typedef struct { + projid_t val; +} kprojid_t; + +enum quota_type { + USRQUOTA = 0, + GRPQUOTA = 1, + PRJQUOTA = 2, +}; + +struct kqid { + union { + kuid_t uid; + kgid_t gid; + kprojid_t projid; + }; + enum quota_type type; +}; + +struct mem_dqblk { + qsize_t dqb_bhardlimit; + qsize_t dqb_bsoftlimit; + qsize_t dqb_curspace; + qsize_t dqb_rsvspace; + qsize_t dqb_ihardlimit; + qsize_t dqb_isoftlimit; + qsize_t dqb_curinodes; + time64_t dqb_btime; + time64_t dqb_itime; +}; + +struct dquot { + struct hlist_node dq_hash; + struct list_head dq_inuse; + struct list_head dq_free; + struct list_head dq_dirty; + struct mutex dq_lock; + spinlock_t dq_dqb_lock; + atomic_t dq_count; + struct super_block *dq_sb; + struct kqid dq_id; + loff_t dq_off; + long unsigned int dq_flags; + struct mem_dqblk dq_dqb; +}; + +enum { + DQF_ROOT_SQUASH_B = 0, + DQF_SYS_FILE_B = 16, + DQF_PRIVATE = 17, +}; + +struct quota_format_type { + int qf_fmt_id; + const struct quota_format_ops *qf_ops; + struct module *qf_owner; + struct quota_format_type *qf_next; +}; + +enum { + DQST_LOOKUPS = 0, + DQST_DROPS = 1, + DQST_READS = 2, + DQST_WRITES = 3, + DQST_CACHE_HITS = 4, + DQST_ALLOC_DQUOTS = 5, + DQST_FREE_DQUOTS = 6, + DQST_SYNCS = 7, + _DQST_DQSTAT_LAST = 8, +}; + +struct quota_format_ops { + int (*check_quota_file)(struct super_block *, int); + int (*read_file_info)(struct super_block *, int); + int (*write_file_info)(struct super_block *, int); + int (*free_file_info)(struct super_block *, int); + int (*read_dqblk)(struct dquot *); + int (*commit_dqblk)(struct dquot *); + int (*release_dqblk)(struct dquot *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct dquot_operations { + int (*write_dquot)(struct dquot *); + struct dquot * (*alloc_dquot)(struct super_block *, int); + void (*destroy_dquot)(struct dquot *); + int (*acquire_dquot)(struct dquot *); + int (*release_dquot)(struct dquot *); + int (*mark_dirty)(struct dquot *); + int (*write_info)(struct super_block *, int); + qsize_t * (*get_reserved_space)(struct inode *); + int (*get_projid)(struct inode *, kprojid_t *); + int (*get_inode_usage)(struct inode *, qsize_t *); + int (*get_next_id)(struct super_block *, struct kqid *); +}; + +struct qc_dqblk { + int d_fieldmask; + u64 d_spc_hardlimit; + u64 d_spc_softlimit; + u64 d_ino_hardlimit; + u64 d_ino_softlimit; + u64 d_space; + u64 d_ino_count; + s64 d_ino_timer; + s64 d_spc_timer; + int d_ino_warns; + int d_spc_warns; + u64 d_rt_spc_hardlimit; + u64 d_rt_spc_softlimit; + u64 d_rt_space; + s64 d_rt_spc_timer; + int d_rt_spc_warns; +}; + +struct qc_type_state { + unsigned int flags; + unsigned int spc_timelimit; + unsigned int ino_timelimit; + unsigned int rt_spc_timelimit; + unsigned int spc_warnlimit; + unsigned int ino_warnlimit; + unsigned int rt_spc_warnlimit; + long long unsigned int ino; + blkcnt_t blocks; + blkcnt_t nextents; +}; + +struct qc_state { + unsigned int s_incoredqs; + struct qc_type_state s_state[3]; +}; + +struct qc_info { + int i_fieldmask; + unsigned int i_flags; + unsigned int i_spc_timelimit; + unsigned int i_ino_timelimit; + unsigned int i_rt_spc_timelimit; + unsigned int i_spc_warnlimit; + unsigned int i_ino_warnlimit; + unsigned int i_rt_spc_warnlimit; +}; + +struct quotactl_ops { + int (*quota_on)(struct super_block *, int, int, const struct path *); + int (*quota_off)(struct super_block *, int); + int (*quota_enable)(struct super_block *, unsigned int); + int (*quota_disable)(struct super_block *, unsigned int); + int (*quota_sync)(struct super_block *, int); + int (*set_info)(struct super_block *, int, struct qc_info *); + int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_nextdqblk)(struct super_block *, struct kqid *, struct qc_dqblk *); + int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_state)(struct super_block *, struct qc_state *); + int (*rm_xquota)(struct super_block *, unsigned int); +}; + +struct writeback_control; + +struct readahead_control; + +struct swap_info_struct; + +struct address_space_operations { + int (*writepage)(struct page *, struct writeback_control *); + int (*read_folio)(struct file *, struct folio *); + int (*writepages)(struct address_space *, struct writeback_control *); + bool (*dirty_folio)(struct address_space *, struct folio *); + void (*readahead)(struct readahead_control *); + int (*write_begin)(struct file *, struct address_space *, loff_t, unsigned int, struct page **, void **); + int (*write_end)(struct file *, struct address_space *, loff_t, unsigned int, unsigned int, struct page *, void *); + sector_t (*bmap)(struct address_space *, sector_t); + void (*invalidate_folio)(struct folio *, size_t, size_t); + bool (*release_folio)(struct folio *, gfp_t); + void (*free_folio)(struct folio *); + ssize_t (*direct_IO)(struct kiocb *, struct iov_iter *); + int (*migrate_folio)(struct address_space *, struct folio *, struct folio *, enum migrate_mode); + int (*launder_folio)(struct folio *); + bool (*is_partially_uptodate)(struct folio *, size_t, size_t); + void (*is_dirty_writeback)(struct folio *, bool *, bool *); + int (*error_remove_page)(struct address_space *, struct page *); + int (*swap_activate)(struct swap_info_struct *, struct file *, sector_t *); + void (*swap_deactivate)(struct file *); + int (*swap_rw)(struct kiocb *, struct iov_iter *); +}; + +struct fiemap_extent_info; + +struct fileattr; + +struct inode_operations { + struct dentry * (*lookup)(struct inode *, struct dentry *, unsigned int); + const char * (*get_link)(struct dentry *, struct inode *, struct delayed_call *); + int (*permission)(struct user_namespace *, struct inode *, int); + struct posix_acl * (*get_inode_acl)(struct inode *, int, bool); + int (*readlink)(struct dentry *, char *, int); + int (*create)(struct user_namespace *, struct inode *, struct dentry *, umode_t, bool); + int (*link)(struct dentry *, struct inode *, struct dentry *); + int (*unlink)(struct inode *, struct dentry *); + int (*symlink)(struct user_namespace *, struct inode *, struct dentry *, const char *); + int (*mkdir)(struct user_namespace *, struct inode *, struct dentry *, umode_t); + int (*rmdir)(struct inode *, struct dentry *); + int (*mknod)(struct user_namespace *, struct inode *, struct dentry *, umode_t, dev_t); + int (*rename)(struct user_namespace *, struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); + int (*setattr)(struct user_namespace *, struct dentry *, struct iattr *); + int (*getattr)(struct user_namespace *, const struct path *, struct kstat *, u32, unsigned int); + ssize_t (*listxattr)(struct dentry *, char *, size_t); + int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64, u64); + int (*update_time)(struct inode *, struct timespec64 *, int); + int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned int, umode_t); + int (*tmpfile)(struct user_namespace *, struct inode *, struct file *, umode_t); + struct posix_acl * (*get_acl)(struct user_namespace *, struct dentry *, int); + int (*set_acl)(struct user_namespace *, struct dentry *, struct posix_acl *, int); + int (*fileattr_set)(struct user_namespace *, struct dentry *, struct fileattr *); + int (*fileattr_get)(struct dentry *, struct fileattr *); +}; + +struct file_lock_context { + spinlock_t flc_lock; + struct list_head flc_flock; + struct list_head flc_posix; + struct list_head flc_lease; +}; + +struct file_lock_operations { + void (*fl_copy_lock)(struct file_lock *, struct file_lock *); + void (*fl_release_private)(struct file_lock *); +}; + +struct nlm_lockowner; + +struct nfs_lock_info { + u32 state; + struct nlm_lockowner *owner; + struct list_head list; +}; + +struct nfs4_lock_state; + +struct nfs4_lock_info { + struct nfs4_lock_state *owner; +}; + +struct fasync_struct; + +struct lock_manager_operations; + +struct file_lock { + struct file_lock *fl_blocker; + struct list_head fl_list; + struct hlist_node fl_link; + struct list_head fl_blocked_requests; + struct list_head fl_blocked_member; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + unsigned int fl_pid; + int fl_link_cpu; + wait_queue_head_t fl_wait; + struct file *fl_file; + loff_t fl_start; + loff_t fl_end; + struct fasync_struct *fl_fasync; + long unsigned int fl_break_time; + long unsigned int fl_downgrade_time; + const struct file_lock_operations *fl_ops; + const struct lock_manager_operations *fl_lmops; + union { + struct nfs_lock_info nfs_fl; + struct nfs4_lock_info nfs4_fl; + struct { + struct list_head link; + int state; + unsigned int debug_id; + } afs; + } fl_u; +}; + +struct lock_manager_operations { + void *lm_mod_owner; + fl_owner_t (*lm_get_owner)(fl_owner_t); + void (*lm_put_owner)(fl_owner_t); + void (*lm_notify)(struct file_lock *); + int (*lm_grant)(struct file_lock *, int); + bool (*lm_break)(struct file_lock *); + int (*lm_change)(struct file_lock *, int, struct list_head *); + void (*lm_setup)(struct file_lock *, void **); + bool (*lm_breaker_owns_lease)(struct file_lock *); + bool (*lm_lock_expirable)(struct file_lock *); + void (*lm_expire_lock)(); +}; + +struct fasync_struct { + rwlock_t fa_lock; + int magic; + int fa_fd; + struct fasync_struct *fa_next; + struct file *fa_file; + struct callback_head fa_rcu; +}; + +enum { + SB_UNFROZEN = 0, + SB_FREEZE_WRITE = 1, + SB_FREEZE_PAGEFAULT = 2, + SB_FREEZE_FS = 3, + SB_FREEZE_COMPLETE = 4, +}; + +struct kstatfs; + +struct super_operations { + struct inode * (*alloc_inode)(struct super_block *); + void (*destroy_inode)(struct inode *); + void (*free_inode)(struct inode *); + void (*dirty_inode)(struct inode *, int); + int (*write_inode)(struct inode *, struct writeback_control *); + int (*drop_inode)(struct inode *); + void (*evict_inode)(struct inode *); + void (*put_super)(struct super_block *); + int (*sync_fs)(struct super_block *, int); + int (*freeze_super)(struct super_block *); + int (*freeze_fs)(struct super_block *); + int (*thaw_super)(struct super_block *); + int (*unfreeze_fs)(struct super_block *); + int (*statfs)(struct dentry *, struct kstatfs *); + int (*remount_fs)(struct super_block *, int *, char *); + void (*umount_begin)(struct super_block *); + int (*show_options)(struct seq_file *, struct dentry *); + int (*show_devname)(struct seq_file *, struct dentry *); + int (*show_path)(struct seq_file *, struct dentry *); + int (*show_stats)(struct seq_file *, struct dentry *); + long int (*nr_cached_objects)(struct super_block *, struct shrink_control *); + long int (*free_cached_objects)(struct super_block *, struct shrink_control *); +}; + +struct iomap; + +struct fid; + +struct export_operations { + int (*encode_fh)(struct inode *, __u32 *, int *, struct inode *); + struct dentry * (*fh_to_dentry)(struct super_block *, struct fid *, int, int); + struct dentry * (*fh_to_parent)(struct super_block *, struct fid *, int, int); + int (*get_name)(struct dentry *, char *, struct dentry *); + struct dentry * (*get_parent)(struct dentry *); + int (*commit_metadata)(struct inode *); + int (*get_uuid)(struct super_block *, u8 *, u32 *, u64 *); + int (*map_blocks)(struct inode *, loff_t, u64, struct iomap *, bool, u32 *); + int (*commit_blocks)(struct inode *, struct iomap *, int, struct iattr *); + u64 (*fetch_iversion)(struct inode *); + long unsigned int flags; +}; + +struct xattr_handler { + const char *name; + const char *prefix; + int flags; + bool (*list)(struct dentry *); + int (*get)(const struct xattr_handler *, struct dentry *, struct inode *, const char *, void *, size_t); + int (*set)(const struct xattr_handler *, struct user_namespace *, struct dentry *, struct inode *, const char *, const void *, size_t, int); +}; + +typedef bool (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64, unsigned int); + +struct dir_context { + filldir_t actor; + loff_t pos; +}; + +struct p_log; + +struct fs_parameter; + +struct fs_parse_result; + +typedef int fs_param_type(struct p_log *, const struct fs_parameter_spec *, struct fs_parameter *, struct fs_parse_result *); + +struct fs_parameter_spec { + const char *name; + fs_param_type *type; + u8 opt; + short unsigned int flags; + const void *data; +}; + +struct kernel_param_ops { + unsigned int flags; + int (*set)(const char *, const struct kernel_param *); + int (*get)(char *, const struct kernel_param *); + void (*free)(void *); +}; + +struct kparam_string; + +struct kparam_array; + +struct kernel_param { + const char *name; + struct module *mod; + const struct kernel_param_ops *ops; + const u16 perm; + s8 level; + u8 flags; + union { + void *arg; + const struct kparam_string *str; + const struct kparam_array *arr; + }; +}; + +struct kparam_string { + unsigned int maxlen; + char *string; +}; + +struct kparam_array { + unsigned int max; + unsigned int elemsize; + unsigned int *num; + const struct kernel_param_ops *ops; + void *elem; +}; + +struct error_injection_entry { + long unsigned int addr; + int etype; +}; + +struct plt_entry { + __le32 adrp; + __le32 add; + __le32 br; +}; + +struct module_attribute { + struct attribute attr; + ssize_t (*show)(struct module_attribute *, struct module_kobject *, char *); + ssize_t (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t); + void (*setup)(struct module *, const char *); + int (*test)(struct module *); + void (*free)(struct module *); +}; + +struct trace_eval_map { + const char *system; + const char *eval_string; + long unsigned int eval_value; +}; + +struct mcs_spinlock { + struct mcs_spinlock *next; + int locked; + int count; +}; + +struct qnode { + struct mcs_spinlock mcs; +}; + +typedef u64 uint64_t; + +enum lockdep_wait_type { + LD_WAIT_INV = 0, + LD_WAIT_FREE = 1, + LD_WAIT_SPIN = 2, + LD_WAIT_CONFIG = 2, + LD_WAIT_SLEEP = 3, + LD_WAIT_MAX = 4, +}; + +struct pollfd { + int fd; + short int events; + short int revents; +}; + +typedef void (*smp_call_func_t)(void *); + +typedef u64 pmdval_t; + +typedef struct { + pteval_t pte; +} pte_t; + +typedef struct { + pmdval_t pmd; +} pmd_t; + +typedef struct { + pgd_t pgd; +} p4d_t; + +typedef struct { + p4d_t p4d; +} pud_t; + +enum refcount_saturation_type { + REFCOUNT_ADD_NOT_ZERO_OVF = 0, + REFCOUNT_ADD_OVF = 1, + REFCOUNT_ADD_UAF = 2, + REFCOUNT_SUB_UAF = 3, + REFCOUNT_DEC_LEAK = 4, +}; + +struct vmem_altmap { + long unsigned int base_pfn; + const long unsigned int end_pfn; + const long unsigned int reserve; + long unsigned int free; + long unsigned int align; + long unsigned int alloc; +}; + +struct percpu_ref_data; + +struct percpu_ref { + long unsigned int percpu_count_ptr; + struct percpu_ref_data *data; +}; + +enum memory_type { + MEMORY_DEVICE_PRIVATE = 1, + MEMORY_DEVICE_COHERENT = 2, + MEMORY_DEVICE_FS_DAX = 3, + MEMORY_DEVICE_GENERIC = 4, + MEMORY_DEVICE_PCI_P2PDMA = 5, +}; + +struct range { + u64 start; + u64 end; +}; + +struct dev_pagemap_ops; + +struct dev_pagemap { + struct vmem_altmap altmap; + struct percpu_ref ref; + struct completion done; + enum memory_type type; + unsigned int flags; + long unsigned int vmemmap_shift; + const struct dev_pagemap_ops *ops; + void *owner; + int nr_range; + union { + struct range range; + struct range ranges[0]; + }; +}; + +enum vm_fault_reason { + VM_FAULT_OOM = 1, + VM_FAULT_SIGBUS = 2, + VM_FAULT_MAJOR = 4, + VM_FAULT_WRITE = 8, + VM_FAULT_HWPOISON = 16, + VM_FAULT_HWPOISON_LARGE = 32, + VM_FAULT_SIGSEGV = 64, + VM_FAULT_NOPAGE = 256, + VM_FAULT_LOCKED = 512, + VM_FAULT_RETRY = 1024, + VM_FAULT_FALLBACK = 2048, + VM_FAULT_DONE_COW = 4096, + VM_FAULT_NEEDDSYNC = 8192, + VM_FAULT_COMPLETED = 16384, + VM_FAULT_HINDEX_MASK = 983040, +}; + +enum fault_flag { + FAULT_FLAG_WRITE = 1, + FAULT_FLAG_MKWRITE = 2, + FAULT_FLAG_ALLOW_RETRY = 4, + FAULT_FLAG_RETRY_NOWAIT = 8, + FAULT_FLAG_KILLABLE = 16, + FAULT_FLAG_TRIED = 32, + FAULT_FLAG_USER = 64, + FAULT_FLAG_REMOTE = 128, + FAULT_FLAG_INSTRUCTION = 256, + FAULT_FLAG_INTERRUPTIBLE = 512, + FAULT_FLAG_UNSHARE = 1024, + FAULT_FLAG_ORIG_PTE_VALID = 2048, +}; + +struct vm_fault { + const struct { + struct vm_area_struct *vma; + gfp_t gfp_mask; + long unsigned int pgoff; + long unsigned int address; + long unsigned int real_address; + }; + enum fault_flag flags; + pmd_t *pmd; + pud_t *pud; + union { + pte_t orig_pte; + pmd_t orig_pmd; + }; + struct page *cow_page; + struct page *page; + pte_t *pte; + spinlock_t *ptl; + pgtable_t prealloc_pte; +}; + +enum pageflags { + PG_locked = 0, + PG_referenced = 1, + PG_uptodate = 2, + PG_dirty = 3, + PG_lru = 4, + PG_active = 5, + PG_workingset = 6, + PG_waiters = 7, + PG_error = 8, + PG_slab = 9, + PG_owner_priv_1 = 10, + PG_arch_1 = 11, + PG_reserved = 12, + PG_private = 13, + PG_private_2 = 14, + PG_writeback = 15, + PG_head = 16, + PG_mappedtodisk = 17, + PG_reclaim = 18, + PG_swapbacked = 19, + PG_unevictable = 20, + PG_mlocked = 21, + PG_hwpoison = 22, + PG_arch_2 = 23, + __NR_PAGEFLAGS = 24, + PG_readahead = 18, + PG_anon_exclusive = 17, + PG_checked = 10, + PG_swapcache = 10, + PG_fscache = 14, + PG_pinned = 10, + PG_savepinned = 3, + PG_foreign = 10, + PG_xen_remapped = 10, + PG_slob_free = 13, + PG_double_map = 6, + PG_has_hwpoisoned = 8, + PG_isolated = 18, + PG_reported = 2, +}; + +typedef void percpu_ref_func_t(struct percpu_ref *); + +struct percpu_ref_data { + atomic_long_t count; + percpu_ref_func_t *release; + percpu_ref_func_t *confirm_switch; + bool force_atomic: 1; + bool allow_reinit: 1; + struct callback_head rcu; + struct percpu_ref *ref; +}; + +struct pipe_buffer; + +struct pipe_inode_info { + struct mutex mutex; + wait_queue_head_t rd_wait; + wait_queue_head_t wr_wait; + unsigned int head; + unsigned int tail; + unsigned int max_usage; + unsigned int ring_size; + unsigned int nr_accounted; + unsigned int readers; + unsigned int writers; + unsigned int files; + unsigned int r_counter; + unsigned int w_counter; + bool poll_usage; + struct page *tmp_page; + struct fasync_struct *fasync_readers; + struct fasync_struct *fasync_writers; + struct pipe_buffer *bufs; + struct user_struct *user; +}; + +struct irq_work { + struct __call_single_node node; + void (*func)(struct irq_work *); + struct rcuwait irqwait; +}; + +typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *); + +struct poll_table_struct { + poll_queue_proc _qproc; + __poll_t _key; +}; + +typedef struct poll_table_struct poll_table; + +struct rchan; + +struct rchan_buf { + void *start; + void *data; + size_t offset; + size_t subbufs_produced; + size_t subbufs_consumed; + struct rchan *chan; + wait_queue_head_t read_wait; + struct irq_work wakeup_work; + struct dentry *dentry; + struct kref kref; + struct page **page_array; + unsigned int page_count; + unsigned int finalized; + size_t *padding; + size_t prev_padding; + size_t bytes_consumed; + size_t early_bytes; + unsigned int cpu; + long: 32; + long: 64; + long: 64; + long: 64; +}; + +struct rchan_callbacks; + +struct rchan { + u32 version; + size_t subbuf_size; + size_t n_subbufs; + size_t alloc_size; + const struct rchan_callbacks *cb; + struct kref kref; + void *private_data; + size_t last_toobig; + struct rchan_buf **buf; + int is_global; + struct list_head list; + struct dentry *parent; + int has_base_filename; + char base_filename[255]; +}; + +struct rchan_callbacks { + int (*subbuf_start)(struct rchan_buf *, void *, void *, size_t); + struct dentry * (*create_buf_file)(const char *, struct dentry *, umode_t, struct rchan_buf *, int *); + int (*remove_buf_file)(struct dentry *); +}; + +struct dev_pagemap_ops { + void (*page_free)(struct page *); + vm_fault_t (*migrate_to_ram)(struct vm_fault *); + int (*memory_failure)(struct dev_pagemap *, long unsigned int, long unsigned int, int); +}; + +enum compound_dtor_id { + NULL_COMPOUND_DTOR = 0, + COMPOUND_PAGE_DTOR = 1, + HUGETLB_PAGE_DTOR = 2, + TRANSHUGE_PAGE_DTOR = 3, + NR_COMPOUND_DTORS = 4, +}; + +enum vm_event_item { + PGPGIN = 0, + PGPGOUT = 1, + PSWPIN = 2, + PSWPOUT = 3, + PGALLOC_DMA = 4, + PGALLOC_DMA32 = 5, + PGALLOC_NORMAL = 6, + PGALLOC_MOVABLE = 7, + ALLOCSTALL_DMA = 8, + ALLOCSTALL_DMA32 = 9, + ALLOCSTALL_NORMAL = 10, + ALLOCSTALL_MOVABLE = 11, + PGSCAN_SKIP_DMA = 12, + PGSCAN_SKIP_DMA32 = 13, + PGSCAN_SKIP_NORMAL = 14, + PGSCAN_SKIP_MOVABLE = 15, + PGFREE = 16, + PGACTIVATE = 17, + PGDEACTIVATE = 18, + PGLAZYFREE = 19, + PGFAULT = 20, + PGMAJFAULT = 21, + PGLAZYFREED = 22, + PGREFILL = 23, + PGREUSE = 24, + PGSTEAL_KSWAPD = 25, + PGSTEAL_DIRECT = 26, + PGDEMOTE_KSWAPD = 27, + PGDEMOTE_DIRECT = 28, + PGSCAN_KSWAPD = 29, + PGSCAN_DIRECT = 30, + PGSCAN_DIRECT_THROTTLE = 31, + PGSCAN_ANON = 32, + PGSCAN_FILE = 33, + PGSTEAL_ANON = 34, + PGSTEAL_FILE = 35, + PGSCAN_ZONE_RECLAIM_FAILED = 36, + PGINODESTEAL = 37, + SLABS_SCANNED = 38, + KSWAPD_INODESTEAL = 39, + KSWAPD_LOW_WMARK_HIT_QUICKLY = 40, + KSWAPD_HIGH_WMARK_HIT_QUICKLY = 41, + PAGEOUTRUN = 42, + PGROTATED = 43, + DROP_PAGECACHE = 44, + DROP_SLAB = 45, + OOM_KILL = 46, + NUMA_PTE_UPDATES = 47, + NUMA_HUGE_PTE_UPDATES = 48, + NUMA_HINT_FAULTS = 49, + NUMA_HINT_FAULTS_LOCAL = 50, + NUMA_PAGE_MIGRATE = 51, + PGMIGRATE_SUCCESS = 52, + PGMIGRATE_FAIL = 53, + THP_MIGRATION_SUCCESS = 54, + THP_MIGRATION_FAIL = 55, + THP_MIGRATION_SPLIT = 56, + COMPACTMIGRATE_SCANNED = 57, + COMPACTFREE_SCANNED = 58, + COMPACTISOLATED = 59, + COMPACTSTALL = 60, + COMPACTFAIL = 61, + COMPACTSUCCESS = 62, + KCOMPACTD_WAKE = 63, + KCOMPACTD_MIGRATE_SCANNED = 64, + KCOMPACTD_FREE_SCANNED = 65, + HTLB_BUDDY_PGALLOC = 66, + HTLB_BUDDY_PGALLOC_FAIL = 67, + CMA_ALLOC_SUCCESS = 68, + CMA_ALLOC_FAIL = 69, + UNEVICTABLE_PGCULLED = 70, + UNEVICTABLE_PGSCANNED = 71, + UNEVICTABLE_PGRESCUED = 72, + UNEVICTABLE_PGMLOCKED = 73, + UNEVICTABLE_PGMUNLOCKED = 74, + UNEVICTABLE_PGCLEARED = 75, + UNEVICTABLE_PGSTRANDED = 76, + THP_FAULT_ALLOC = 77, + THP_FAULT_FALLBACK = 78, + THP_FAULT_FALLBACK_CHARGE = 79, + THP_COLLAPSE_ALLOC = 80, + THP_COLLAPSE_ALLOC_FAILED = 81, + THP_FILE_ALLOC = 82, + THP_FILE_FALLBACK = 83, + THP_FILE_FALLBACK_CHARGE = 84, + THP_FILE_MAPPED = 85, + THP_SPLIT_PAGE = 86, + THP_SPLIT_PAGE_FAILED = 87, + THP_DEFERRED_SPLIT_PAGE = 88, + THP_SPLIT_PMD = 89, + THP_SCAN_EXCEED_NONE_PTE = 90, + THP_SCAN_EXCEED_SWAP_PTE = 91, + THP_SCAN_EXCEED_SHARED_PTE = 92, + THP_ZERO_PAGE_ALLOC = 93, + THP_ZERO_PAGE_ALLOC_FAILED = 94, + THP_SWPOUT = 95, + THP_SWPOUT_FALLBACK = 96, + BALLOON_INFLATE = 97, + BALLOON_DEFLATE = 98, + BALLOON_MIGRATE = 99, + SWAP_RA = 100, + SWAP_RA_HIT = 101, + KSM_SWPIN_COPY = 102, + COW_KSM = 103, + NR_VM_EVENT_ITEMS = 104, +}; + +struct pipe_buf_operations; + +struct pipe_buffer { + struct page *page; + unsigned int offset; + unsigned int len; + const struct pipe_buf_operations *ops; + unsigned int flags; + long unsigned int private; +}; + +struct pipe_buf_operations { + int (*confirm)(struct pipe_inode_info *, struct pipe_buffer *); + void (*release)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *); + bool (*get)(struct pipe_inode_info *, struct pipe_buffer *); +}; + +struct partial_page { + unsigned int offset; + unsigned int len; + long unsigned int private; +}; + +struct splice_pipe_desc { + struct page **pages; + struct partial_page *partial; + int nr_pages; + unsigned int nr_pages_max; + const struct pipe_buf_operations *ops; + void (*spd_release)(struct splice_pipe_desc *, unsigned int); +}; + +struct rchan_percpu_buf_dispatcher { + struct rchan_buf *buf; + struct dentry *dentry; +}; + +struct static_key_true { + struct static_key key; +}; + +enum lockdep_lock_type { + LD_LOCK_NORMAL = 0, + LD_LOCK_PERCPU = 1, + LD_LOCK_MAX = 2, +}; + +enum system_states { + SYSTEM_BOOTING = 0, + SYSTEM_SCHEDULING = 1, + SYSTEM_FREEING_INITMEM = 2, + SYSTEM_RUNNING = 3, + SYSTEM_HALT = 4, + SYSTEM_POWER_OFF = 5, + SYSTEM_RESTART = 6, + SYSTEM_SUSPEND = 7, +}; + +struct cacheline_padding { + char x[0]; +}; + +struct wait_queue_entry; + +typedef int (*wait_queue_func_t)(struct wait_queue_entry *, unsigned int, int, void *); + +struct wait_queue_entry { + unsigned int flags; + void *private; + wait_queue_func_t func; + struct list_head entry; +}; + +typedef struct wait_queue_entry wait_queue_entry_t; + +struct uid_gid_extent { + u32 first; + u32 lower_first; + u32 count; +}; + +struct uid_gid_map { + u32 nr_extents; + union { + struct uid_gid_extent extent[5]; + struct { + struct uid_gid_extent *forward; + struct uid_gid_extent *reverse; + }; + }; +}; + +struct proc_ns_operations; + +struct ns_common { + atomic_long_t stashed; + const struct proc_ns_operations *ops; + unsigned int inum; + refcount_t count; +}; + +struct ctl_table; + +struct ctl_table_root; + +struct ctl_table_set; + +struct ctl_dir; + +struct ctl_node; + +struct ctl_table_header { + union { + struct { + struct ctl_table *ctl_table; + int used; + int count; + int nreg; + }; + struct callback_head rcu; + }; + struct completion *unregistering; + struct ctl_table *ctl_table_arg; + struct ctl_table_root *root; + struct ctl_table_set *set; + struct ctl_dir *parent; + struct ctl_node *node; + struct hlist_head inodes; +}; + +struct ctl_dir { + struct ctl_table_header header; + struct rb_root root; +}; + +struct ctl_table_set { + int (*is_seen)(struct ctl_table_set *); + struct ctl_dir dir; +}; + +struct user_namespace { + struct uid_gid_map uid_map; + struct uid_gid_map gid_map; + struct uid_gid_map projid_map; + struct user_namespace *parent; + int level; + kuid_t owner; + kgid_t group; + struct ns_common ns; + long unsigned int flags; + bool parent_could_setfcap; + struct list_head keyring_name_list; + struct key *user_keyring_register; + struct rw_semaphore keyring_sem; + struct work_struct work; + struct ctl_table_set set; + struct ctl_table_header *sysctls; + struct ucounts *ucounts; + long int ucount_max[10]; + long int rlimit_max[4]; +}; + +struct rcu_work { + struct work_struct work; + struct callback_head rcu; + struct workqueue_struct *wq; +}; + +struct cgroup; + +struct cgroup_subsys; + +struct cgroup_subsys_state { + struct cgroup *cgroup; + struct cgroup_subsys *ss; + struct percpu_ref refcnt; + struct list_head sibling; + struct list_head children; + struct list_head rstat_css_node; + int id; + unsigned int flags; + u64 serial_nr; + atomic_t online_cnt; + struct work_struct destroy_work; + struct rcu_work destroy_rwork; + struct cgroup_subsys_state *parent; +}; + +struct mem_cgroup_id { + int id; + refcount_t ref; +}; + +struct page_counter { + atomic_long_t usage; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + long unsigned int emin; + atomic_long_t min_usage; + atomic_long_t children_min_usage; + long unsigned int elow; + atomic_long_t low_usage; + atomic_long_t children_low_usage; + long unsigned int watermark; + long unsigned int failcnt; + struct cacheline_padding _pad2_; + long unsigned int min; + long unsigned int low; + long unsigned int high; + long unsigned int max; + struct page_counter *parent; + long: 64; + long: 64; + long: 64; +}; + +struct vmpressure { + long unsigned int scanned; + long unsigned int reclaimed; + long unsigned int tree_scanned; + long unsigned int tree_reclaimed; + spinlock_t sr_lock; + struct list_head events; + struct mutex events_lock; + struct work_struct work; +}; + +struct cgroup_file { + struct kernfs_node *kn; + long unsigned int notified_at; + struct timer_list notify_timer; +}; + +struct mem_cgroup_threshold_ary; + +struct mem_cgroup_thresholds { + struct mem_cgroup_threshold_ary *primary; + struct mem_cgroup_threshold_ary *spare; +}; + +struct fprop_global { + struct percpu_counter events; + unsigned int period; + seqcount_t sequence; +}; + +struct wb_domain { + spinlock_t lock; + struct fprop_global completions; + struct timer_list period_timer; + long unsigned int period_time; + long unsigned int dirty_limit_tstamp; + long unsigned int dirty_limit; +}; + +struct wb_completion { + atomic_t cnt; + wait_queue_head_t *waitq; +}; + +struct memcg_cgwb_frn { + u64 bdi_id; + int memcg_id; + u64 at; + struct wb_completion done; +}; + +struct deferred_split { + spinlock_t split_queue_lock; + struct list_head split_queue; + long unsigned int split_queue_len; +}; + +struct memcg_vmstats; + +struct obj_cgroup; + +struct memcg_vmstats_percpu; + +struct mem_cgroup_per_node; + +struct mem_cgroup { + struct cgroup_subsys_state css; + struct mem_cgroup_id id; + long: 64; + long: 64; + long: 64; + long: 64; + struct page_counter memory; + union { + struct page_counter swap; + struct page_counter memsw; + }; + struct page_counter kmem; + struct page_counter tcpmem; + struct work_struct high_work; + long unsigned int soft_limit; + struct vmpressure vmpressure; + bool oom_group; + bool oom_lock; + int under_oom; + int swappiness; + int oom_kill_disable; + struct cgroup_file events_file; + struct cgroup_file events_local_file; + struct cgroup_file swap_events_file; + struct mutex thresholds_lock; + struct mem_cgroup_thresholds thresholds; + struct mem_cgroup_thresholds memsw_thresholds; + struct list_head oom_notify; + long unsigned int move_charge_at_immigrate; + spinlock_t move_lock; + long unsigned int move_lock_flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + struct memcg_vmstats *vmstats; + atomic_long_t memory_events[9]; + atomic_long_t memory_events_local[9]; + long unsigned int socket_pressure; + bool tcpmem_active; + int tcpmem_pressure; + int kmemcg_id; + struct obj_cgroup *objcg; + struct list_head objcg_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad2_; + atomic_t moving_account; + struct task_struct *move_lock_task; + struct memcg_vmstats_percpu *vmstats_percpu; + struct list_head cgwb_list; + struct wb_domain cgwb_domain; + struct memcg_cgwb_frn cgwb_frn[4]; + struct list_head event_list; + spinlock_t event_list_lock; + struct deferred_split deferred_split_queue; + struct mem_cgroup_per_node *nodeinfo[0]; + long: 64; + long: 64; +}; + +enum { + WORK_STRUCT_PENDING_BIT = 0LL, + WORK_STRUCT_INACTIVE_BIT = 1LL, + WORK_STRUCT_PWQ_BIT = 2LL, + WORK_STRUCT_LINKED_BIT = 3LL, + WORK_STRUCT_COLOR_SHIFT = 4LL, + WORK_STRUCT_COLOR_BITS = 4LL, + WORK_STRUCT_PENDING = 1LL, + WORK_STRUCT_INACTIVE = 2LL, + WORK_STRUCT_PWQ = 4LL, + WORK_STRUCT_LINKED = 8LL, + WORK_STRUCT_STATIC = 0LL, + WORK_NR_COLORS = 16LL, + WORK_CPU_UNBOUND = 128LL, + WORK_STRUCT_FLAG_BITS = 8LL, + WORK_OFFQ_FLAG_BASE = 4LL, + __WORK_OFFQ_CANCELING = 4LL, + WORK_OFFQ_CANCELING = 16LL, + WORK_OFFQ_FLAG_BITS = 1LL, + WORK_OFFQ_POOL_SHIFT = 5LL, + WORK_OFFQ_LEFT = 59LL, + WORK_OFFQ_POOL_BITS = 31LL, + WORK_OFFQ_POOL_NONE = 2147483647LL, + WORK_STRUCT_FLAG_MASK = 255LL, + WORK_STRUCT_WQ_DATA_MASK = -256LL, + WORK_STRUCT_NO_POOL = 68719476704LL, + WORK_BUSY_PENDING = 1LL, + WORK_BUSY_RUNNING = 2LL, + WORKER_DESC_LEN = 24LL, +}; + +enum { + WQ_UNBOUND = 2, + WQ_FREEZABLE = 4, + WQ_MEM_RECLAIM = 8, + WQ_HIGHPRI = 16, + WQ_CPU_INTENSIVE = 32, + WQ_SYSFS = 64, + WQ_POWER_EFFICIENT = 128, + __WQ_DRAINING = 65536, + __WQ_ORDERED = 131072, + __WQ_LEGACY = 262144, + __WQ_ORDERED_EXPLICIT = 524288, + WQ_MAX_ACTIVE = 512, + WQ_MAX_UNBOUND_PER_CPU = 4, + WQ_DFL_ACTIVE = 256, +}; + +struct anon_vma { + struct anon_vma *root; + struct rw_semaphore rwsem; + atomic_t refcount; + long unsigned int num_children; + long unsigned int num_active_vmas; + struct anon_vma *parent; + struct rb_root_cached rb_root; +}; + +struct free_area { + struct list_head free_list[6]; + long unsigned int nr_free; +}; + +struct pglist_data; + +struct lruvec { + struct list_head lists[5]; + spinlock_t lru_lock; + long unsigned int anon_cost; + long unsigned int file_cost; + atomic_long_t nonresident_age; + long unsigned int refaults[2]; + long unsigned int flags; + struct pglist_data *pgdat; +}; + +struct per_cpu_pages; + +struct per_cpu_zonestat; + +struct zone { + long unsigned int _watermark[4]; + long unsigned int watermark_boost; + long unsigned int nr_reserved_highatomic; + long int lowmem_reserve[4]; + int node; + struct pglist_data *zone_pgdat; + struct per_cpu_pages *per_cpu_pageset; + struct per_cpu_zonestat *per_cpu_zonestats; + int pageset_high; + int pageset_batch; + long unsigned int zone_start_pfn; + atomic_long_t managed_pages; + long unsigned int spanned_pages; + long unsigned int present_pages; + long unsigned int cma_pages; + const char *name; + long unsigned int nr_isolate_pageblock; + int initialized; + long: 32; + long: 64; + struct cacheline_padding _pad1_; + struct free_area free_area[11]; + long unsigned int flags; + spinlock_t lock; + struct cacheline_padding _pad2_; + long unsigned int percpu_drift_mark; + long unsigned int compact_cached_free_pfn; + long unsigned int compact_cached_migrate_pfn[2]; + long unsigned int compact_init_migrate_pfn; + long unsigned int compact_init_free_pfn; + unsigned int compact_considered; + unsigned int compact_defer_shift; + int compact_order_failed; + bool compact_blockskip_flush; + bool contiguous; + short: 16; + struct cacheline_padding _pad3_; + atomic_long_t vm_stat[10]; + atomic_long_t vm_numa_event[6]; +}; + +struct zoneref { + struct zone *zone; + int zone_idx; +}; + +struct zonelist { + struct zoneref _zonerefs[257]; +}; + +enum zone_type { + ZONE_DMA = 0, + ZONE_DMA32 = 1, + ZONE_NORMAL = 2, + ZONE_MOVABLE = 3, + __MAX_NR_ZONES = 4, +}; + +struct per_cpu_nodestat; + +struct memory_tier; + +struct pglist_data { + struct zone node_zones[4]; + struct zonelist node_zonelists[2]; + int nr_zones; + long unsigned int node_start_pfn; + long unsigned int node_present_pages; + long unsigned int node_spanned_pages; + int node_id; + wait_queue_head_t kswapd_wait; + wait_queue_head_t pfmemalloc_wait; + wait_queue_head_t reclaim_wait[4]; + atomic_t nr_writeback_throttled; + long unsigned int nr_reclaim_start; + struct task_struct *kswapd; + int kswapd_order; + enum zone_type kswapd_highest_zoneidx; + int kswapd_failures; + int kcompactd_max_order; + enum zone_type kcompactd_highest_zoneidx; + wait_queue_head_t kcompactd_wait; + struct task_struct *kcompactd; + bool proactive_compact_trigger; + long unsigned int totalreserve_pages; + long unsigned int min_unmapped_pages; + long unsigned int min_slab_pages; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad1_; + struct deferred_split deferred_split_queue; + unsigned int nbp_rl_start; + long unsigned int nbp_rl_nr_cand; + unsigned int nbp_threshold; + unsigned int nbp_th_start; + long unsigned int nbp_th_nr_cand; + struct lruvec __lruvec; + long unsigned int flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cacheline_padding _pad2_; + struct per_cpu_nodestat *per_cpu_nodestats; + atomic_long_t vm_stat[43]; + struct memory_tier *memtier; + long: 64; + long: 64; + long: 64; +}; + +struct per_cpu_pages { + spinlock_t lock; + int count; + int high; + int batch; + short int free_factor; + short int expire; + struct list_head lists[13]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct per_cpu_zonestat { + s8 vm_stat_diff[10]; + s8 stat_threshold; + long unsigned int vm_numa_event[6]; +}; + +struct per_cpu_nodestat { + s8 stat_threshold; + s8 vm_node_stat_diff[43]; +}; + +typedef struct pglist_data pg_data_t; + +struct mem_section_usage { + long unsigned int subsection_map[1]; + long unsigned int pageblock_flags[0]; +}; + +struct mem_section { + long unsigned int section_mem_map; + struct mem_section_usage *usage; +}; + +enum { + SECTION_MARKED_PRESENT_BIT = 0, + SECTION_HAS_MEM_MAP_BIT = 1, + SECTION_IS_ONLINE_BIT = 2, + SECTION_IS_EARLY_BIT = 3, + SECTION_MAP_LAST_BIT = 4, +}; + +struct idr { + struct xarray idr_rt; + unsigned int idr_base; + unsigned int idr_next; +}; + +struct kmem_cache; + +struct fs_pin; + +struct pid_namespace { + struct idr idr; + struct callback_head rcu; + unsigned int pid_allocated; + struct task_struct *child_reaper; + struct kmem_cache *pid_cachep; + unsigned int level; + struct pid_namespace *parent; + struct fs_pin *bacct; + struct user_namespace *user_ns; + struct ucounts *ucounts; + int reboot; + struct ns_common ns; +}; + +struct task_cputime { + u64 stime; + u64 utime; + long long unsigned int sum_exec_runtime; +}; + +struct ucounts { + struct hlist_node node; + struct user_namespace *ns; + kuid_t uid; + atomic_t count; + atomic_long_t ucount[10]; + atomic_long_t rlimit[4]; +}; + +struct uts_namespace; + +struct ipc_namespace; + +struct mnt_namespace; + +struct net; + +struct time_namespace; + +struct cgroup_namespace; + +struct nsproxy { + atomic_t count; + struct uts_namespace *uts_ns; + struct ipc_namespace *ipc_ns; + struct mnt_namespace *mnt_ns; + struct pid_namespace *pid_ns_for_children; + struct net *net_ns; + struct time_namespace *time_ns; + struct time_namespace *time_ns_for_children; + struct cgroup_namespace *cgroup_ns; +}; + +struct bio; + +struct bio_list { + struct bio *head; + struct bio *tail; +}; + +struct reclaim_state { + long unsigned int reclaimed_slab; +}; + +struct fprop_local_percpu { + struct percpu_counter events; + unsigned int period; + raw_spinlock_t lock; +}; + +enum wb_reason { + WB_REASON_BACKGROUND = 0, + WB_REASON_VMSCAN = 1, + WB_REASON_SYNC = 2, + WB_REASON_PERIODIC = 3, + WB_REASON_LAPTOP_TIMER = 4, + WB_REASON_FS_FREE_SPACE = 5, + WB_REASON_FORKER_THREAD = 6, + WB_REASON_FOREIGN_FLUSH = 7, + WB_REASON_MAX = 8, +}; + +struct bdi_writeback { + struct backing_dev_info *bdi; + long unsigned int state; + long unsigned int last_old_flush; + struct list_head b_dirty; + struct list_head b_io; + struct list_head b_more_io; + struct list_head b_dirty_time; + spinlock_t list_lock; + atomic_t writeback_inodes; + struct percpu_counter stat[4]; + long unsigned int bw_time_stamp; + long unsigned int dirtied_stamp; + long unsigned int written_stamp; + long unsigned int write_bandwidth; + long unsigned int avg_write_bandwidth; + long unsigned int dirty_ratelimit; + long unsigned int balanced_dirty_ratelimit; + struct fprop_local_percpu completions; + int dirty_exceeded; + enum wb_reason start_all_reason; + spinlock_t work_lock; + struct list_head work_list; + struct delayed_work dwork; + struct delayed_work bw_dwork; + long unsigned int dirty_sleep; + struct list_head bdi_node; + struct percpu_ref refcnt; + struct fprop_local_percpu memcg_completions; + struct cgroup_subsys_state *memcg_css; + struct cgroup_subsys_state *blkcg_css; + struct list_head memcg_node; + struct list_head blkcg_node; + struct list_head b_attached; + struct list_head offline_node; + union { + struct work_struct release_work; + struct callback_head rcu; + }; +}; + +struct device; + +struct backing_dev_info { + u64 id; + struct rb_node rb_node; + struct list_head bdi_list; + long unsigned int ra_pages; + long unsigned int io_pages; + struct kref refcnt; + unsigned int capabilities; + unsigned int min_ratio; + unsigned int max_ratio; + unsigned int max_prop_frac; + atomic_long_t tot_write_bandwidth; + struct bdi_writeback wb; + struct list_head wb_list; + struct xarray cgwb_tree; + struct mutex cgwb_release_mutex; + struct rw_semaphore wb_switch_rwsem; + wait_queue_head_t wb_waitq; + struct device *dev; + char dev_name[64]; + struct device *owner; + struct timer_list laptop_mode_wb_timer; + struct dentry *debug_dir; +}; + +struct compact_control; + +struct capture_control { + struct compact_control *cc; + struct page *page; +}; + +struct css_set { + struct cgroup_subsys_state *subsys[10]; + refcount_t refcount; + struct css_set *dom_cset; + struct cgroup *dfl_cgrp; + int nr_tasks; + struct list_head tasks; + struct list_head mg_tasks; + struct list_head dying_tasks; + struct list_head task_iters; + struct list_head e_cset_node[10]; + struct list_head threaded_csets; + struct list_head threaded_csets_node; + struct hlist_node hlist; + struct list_head cgrp_links; + struct list_head mg_src_preload_node; + struct list_head mg_dst_preload_node; + struct list_head mg_node; + struct cgroup *mg_src_cgrp; + struct cgroup *mg_dst_cgrp; + struct css_set *mg_dst_cset; + bool dead; + struct callback_head callback_head; +}; + +struct ftrace_ret_stack { + long unsigned int ret; + long unsigned int func; + long long unsigned int calltime; + long unsigned int fp; + long unsigned int *retp; +}; + +struct cgroup_base_stat { + struct task_cputime cputime; +}; + +struct bpf_prog_array; + +struct cgroup_bpf { + struct bpf_prog_array *effective[33]; + struct hlist_head progs[33]; + u8 flags[33]; + struct list_head storages; + struct bpf_prog_array *inactive; + struct percpu_ref refcnt; + struct work_struct release_work; +}; + +struct cgroup_freezer_state { + bool freeze; + int e_freeze; + int nr_frozen_descendants; + int nr_frozen_tasks; +}; + +struct cgroup_root; + +struct cgroup_rstat_cpu; + +struct psi_group; + +struct cgroup { + struct cgroup_subsys_state self; + long unsigned int flags; + int level; + int max_depth; + int nr_descendants; + int nr_dying_descendants; + int max_descendants; + int nr_populated_csets; + int nr_populated_domain_children; + int nr_populated_threaded_children; + int nr_threaded_children; + struct kernfs_node *kn; + struct cgroup_file procs_file; + struct cgroup_file events_file; + struct cgroup_file psi_files[0]; + u16 subtree_control; + u16 subtree_ss_mask; + u16 old_subtree_control; + u16 old_subtree_ss_mask; + struct cgroup_subsys_state *subsys[10]; + struct cgroup_root *root; + struct list_head cset_links; + struct list_head e_csets[10]; + struct cgroup *dom_cgrp; + struct cgroup *old_dom_cgrp; + struct cgroup_rstat_cpu *rstat_cpu; + struct list_head rstat_css_list; + struct cgroup_base_stat last_bstat; + struct cgroup_base_stat bstat; + struct prev_cputime prev_cputime; + struct list_head pidlists; + struct mutex pidlist_mutex; + wait_queue_head_t offline_waitq; + struct work_struct release_agent_work; + struct psi_group *psi; + struct cgroup_bpf bpf; + atomic_t congestion_count; + struct cgroup_freezer_state freezer; + struct bpf_local_storage *bpf_cgrp_storage; + struct cgroup *ancestors[0]; +}; + +typedef int proc_handler(struct ctl_table *, int, void *, size_t *, loff_t *); + +struct ctl_table_poll; + +struct ctl_table { + const char *procname; + void *data; + int maxlen; + umode_t mode; + struct ctl_table *child; + proc_handler *proc_handler; + struct ctl_table_poll *poll; + void *extra1; + void *extra2; +}; + +struct ctl_table_poll { + atomic_t event; + wait_queue_head_t wait; +}; + +struct ctl_node { + struct rb_node node; + struct ctl_table_header *header; +}; + +struct ctl_table_root { + struct ctl_table_set default_set; + struct ctl_table_set * (*lookup)(struct ctl_table_root *); + void (*set_ownership)(struct ctl_table_header *, struct ctl_table *, kuid_t *, kgid_t *); + int (*permissions)(struct ctl_table_header *, struct ctl_table *); +}; + +struct taskstats { + __u16 version; + __u32 ac_exitcode; + __u8 ac_flag; + __u8 ac_nice; + __u64 cpu_count; + __u64 cpu_delay_total; + __u64 blkio_count; + __u64 blkio_delay_total; + __u64 swapin_count; + __u64 swapin_delay_total; + __u64 cpu_run_real_total; + __u64 cpu_run_virtual_total; + char ac_comm[32]; + __u8 ac_sched; + __u8 ac_pad[3]; + int: 32; + __u32 ac_uid; + __u32 ac_gid; + __u32 ac_pid; + __u32 ac_ppid; + __u32 ac_btime; + __u64 ac_etime; + __u64 ac_utime; + __u64 ac_stime; + __u64 ac_minflt; + __u64 ac_majflt; + __u64 coremem; + __u64 virtmem; + __u64 hiwater_rss; + __u64 hiwater_vm; + __u64 read_char; + __u64 write_char; + __u64 read_syscalls; + __u64 write_syscalls; + __u64 read_bytes; + __u64 write_bytes; + __u64 cancelled_write_bytes; + __u64 nvcsw; + __u64 nivcsw; + __u64 ac_utimescaled; + __u64 ac_stimescaled; + __u64 cpu_scaled_run_real_total; + __u64 freepages_count; + __u64 freepages_delay_total; + __u64 thrashing_count; + __u64 thrashing_delay_total; + __u64 ac_btime64; + __u64 compact_count; + __u64 compact_delay_total; + __u32 ac_tgid; + __u64 ac_tgetime; + __u64 ac_exe_dev; + __u64 ac_exe_inode; + __u64 wpcopy_count; + __u64 wpcopy_delay_total; +}; + +struct wait_page_queue { + struct folio *folio; + int bit_nr; + wait_queue_entry_t wait; +}; + +enum writeback_sync_modes { + WB_SYNC_NONE = 0, + WB_SYNC_ALL = 1, +}; + +struct swap_iocb; + +struct writeback_control { + long int nr_to_write; + long int pages_skipped; + loff_t range_start; + loff_t range_end; + enum writeback_sync_modes sync_mode; + unsigned int for_kupdate: 1; + unsigned int for_background: 1; + unsigned int tagged_writepages: 1; + unsigned int for_reclaim: 1; + unsigned int range_cyclic: 1; + unsigned int for_sync: 1; + unsigned int unpinned_fscache_wb: 1; + unsigned int no_cgroup_owner: 1; + unsigned int punt_to_cgroup: 1; + struct swap_iocb **swap_plug; + struct bdi_writeback *wb; + struct inode *inode; + int wb_id; + int wb_lcand_id; + int wb_tcand_id; + size_t wb_bytes; + size_t wb_lcand_bytes; + size_t wb_tcand_bytes; +}; + +struct readahead_control { + struct file *file; + struct address_space *mapping; + struct file_ra_state *ra; + long unsigned int _index; + unsigned int _nr_pages; + unsigned int _batch_count; + bool _workingset; + long unsigned int _pflags; +}; + +struct iovec; + +struct kvec; + +struct bio_vec; + +struct iov_iter { + u8 iter_type; + bool nofault; + bool data_source; + bool user_backed; + union { + size_t iov_offset; + int last_offset; + }; + size_t count; + union { + const struct iovec *iov; + const struct kvec *kvec; + const struct bio_vec *bvec; + struct xarray *xarray; + struct pipe_inode_info *pipe; + void *ubuf; + }; + union { + long unsigned int nr_segs; + struct { + unsigned int head; + unsigned int start_head; + }; + loff_t xarray_start; + }; +}; + +struct swap_cluster_info { + spinlock_t lock; + unsigned int data: 24; + unsigned int flags: 8; +}; + +struct swap_cluster_list { + struct swap_cluster_info head; + struct swap_cluster_info tail; +}; + +struct percpu_cluster; + +struct swap_info_struct { + struct percpu_ref users; + long unsigned int flags; + short int prio; + struct plist_node list; + signed char type; + unsigned int max; + unsigned char *swap_map; + struct swap_cluster_info *cluster_info; + struct swap_cluster_list free_clusters; + unsigned int lowest_bit; + unsigned int highest_bit; + unsigned int pages; + unsigned int inuse_pages; + unsigned int cluster_next; + unsigned int cluster_nr; + unsigned int *cluster_next_cpu; + struct percpu_cluster *percpu_cluster; + struct rb_root swap_extent_root; + struct block_device *bdev; + struct file *swap_file; + unsigned int old_block_size; + struct completion comp; + spinlock_t lock; + spinlock_t cont_lock; + struct work_struct discard_work; + struct swap_cluster_list discard_clusters; + struct plist_node avail_lists[0]; +}; + +enum dl_dev_state { + DL_DEV_NO_DRIVER = 0, + DL_DEV_PROBING = 1, + DL_DEV_DRIVER_BOUND = 2, + DL_DEV_UNBINDING = 3, +}; + +struct dev_links_info { + struct list_head suppliers; + struct list_head consumers; + struct list_head defer_sync; + enum dl_dev_state status; +}; + +struct pm_message { + int event; +}; + +typedef struct pm_message pm_message_t; + +enum rpm_request { + RPM_REQ_NONE = 0, + RPM_REQ_IDLE = 1, + RPM_REQ_SUSPEND = 2, + RPM_REQ_AUTOSUSPEND = 3, + RPM_REQ_RESUME = 4, +}; + +enum rpm_status { + RPM_INVALID = -1, + RPM_ACTIVE = 0, + RPM_RESUMING = 1, + RPM_SUSPENDED = 2, + RPM_SUSPENDING = 3, +}; + +struct wakeup_source; + +struct wake_irq; + +struct pm_subsys_data; + +struct dev_pm_qos; + +struct dev_pm_info { + pm_message_t power_state; + unsigned int can_wakeup: 1; + unsigned int async_suspend: 1; + bool in_dpm_list: 1; + bool is_prepared: 1; + bool is_suspended: 1; + bool is_noirq_suspended: 1; + bool is_late_suspended: 1; + bool no_pm: 1; + bool early_init: 1; + bool direct_complete: 1; + u32 driver_flags; + spinlock_t lock; + struct list_head entry; + struct completion completion; + struct wakeup_source *wakeup; + bool wakeup_path: 1; + bool syscore: 1; + bool no_pm_callbacks: 1; + unsigned int must_resume: 1; + unsigned int may_skip_resume: 1; + struct hrtimer suspend_timer; + u64 timer_expires; + struct work_struct work; + wait_queue_head_t wait_queue; + struct wake_irq *wakeirq; + atomic_t usage_count; + atomic_t child_count; + unsigned int disable_depth: 3; + unsigned int idle_notification: 1; + unsigned int request_pending: 1; + unsigned int deferred_resume: 1; + unsigned int needs_force_resume: 1; + unsigned int runtime_auto: 1; + bool ignore_children: 1; + unsigned int no_callbacks: 1; + unsigned int irq_safe: 1; + unsigned int use_autosuspend: 1; + unsigned int timer_autosuspends: 1; + unsigned int memalloc_noio: 1; + unsigned int links_count; + enum rpm_request request; + enum rpm_status runtime_status; + enum rpm_status last_status; + int runtime_error; + int autosuspend_delay; + u64 last_busy; + u64 active_time; + u64 suspended_time; + u64 accounting_timestamp; + struct pm_subsys_data *subsys_data; + void (*set_latency_tolerance)(struct device *, s32); + struct dev_pm_qos *qos; +}; + +struct irq_domain; + +struct msi_device_data; + +struct dev_msi_info { + struct irq_domain *domain; + struct msi_device_data *data; +}; + +struct dev_archdata {}; + +enum device_removable { + DEVICE_REMOVABLE_NOT_SUPPORTED = 0, + DEVICE_REMOVABLE_UNKNOWN = 1, + DEVICE_FIXED = 2, + DEVICE_REMOVABLE = 3, +}; + +struct device_private; + +struct device_type; + +struct bus_type; + +struct device_driver; + +struct dev_pm_domain; + +struct dma_map_ops; + +struct bus_dma_region; + +struct device_dma_parameters; + +struct dma_coherent_mem; + +struct cma; + +struct io_tlb_mem; + +struct device_node; + +struct fwnode_handle; + +struct class; + +struct iommu_group; + +struct dev_iommu; + +struct device_physical_location; + +struct device { + struct kobject kobj; + struct device *parent; + struct device_private *p; + const char *init_name; + const struct device_type *type; + struct bus_type *bus; + struct device_driver *driver; + void *platform_data; + void *driver_data; + struct mutex mutex; + struct dev_links_info links; + struct dev_pm_info power; + struct dev_pm_domain *pm_domain; + struct dev_msi_info msi; + const struct dma_map_ops *dma_ops; + u64 *dma_mask; + u64 coherent_dma_mask; + u64 bus_dma_limit; + const struct bus_dma_region *dma_range_map; + struct device_dma_parameters *dma_parms; + struct list_head dma_pools; + struct dma_coherent_mem *dma_mem; + struct cma *cma_area; + struct io_tlb_mem *dma_io_tlb_mem; + struct dev_archdata archdata; + struct device_node *of_node; + struct fwnode_handle *fwnode; + int numa_node; + dev_t devt; + u32 id; + spinlock_t devres_lock; + struct list_head devres_head; + struct class *class; + const struct attribute_group **groups; + void (*release)(struct device *); + struct iommu_group *iommu_group; + struct dev_iommu *iommu; + struct device_physical_location *physical_location; + enum device_removable removable; + bool offline_disabled: 1; + bool offline: 1; + bool of_node_reused: 1; + bool state_synced: 1; + bool can_match: 1; + bool dma_coherent: 1; +}; + +struct disk_stats; + +struct gendisk; + +struct partition_meta_info; + +struct block_device { + sector_t bd_start_sect; + sector_t bd_nr_sectors; + struct disk_stats *bd_stats; + long unsigned int bd_stamp; + bool bd_read_only; + dev_t bd_dev; + atomic_t bd_openers; + struct inode *bd_inode; + struct super_block *bd_super; + void *bd_claiming; + struct device bd_device; + void *bd_holder; + int bd_holders; + bool bd_write_holder; + struct kobject *bd_holder_dir; + u8 bd_partno; + spinlock_t bd_size_lock; + struct gendisk *bd_disk; + struct request_queue *bd_queue; + int bd_fsfreeze_count; + struct mutex bd_fsfreeze_mutex; + struct super_block *bd_fsfreeze_sb; + struct partition_meta_info *bd_meta_info; +}; + +struct seq_operations; + +struct seq_file { + char *buf; + size_t size; + size_t from; + size_t count; + size_t pad_until; + loff_t index; + loff_t read_pos; + struct mutex lock; + const struct seq_operations *op; + int poll_event; + const struct file *file; + void *private; +}; + +typedef __u32 blk_opf_t; + +typedef u8 blk_status_t; + +struct bvec_iter { + sector_t bi_sector; + unsigned int bi_size; + unsigned int bi_idx; + unsigned int bi_bvec_done; +} __attribute__((packed)); + +typedef unsigned int blk_qc_t; + +typedef void bio_end_io_t(struct bio *); + +struct bio_issue { + u64 value; +}; + +struct bio_vec { + struct page *bv_page; + unsigned int bv_len; + unsigned int bv_offset; +}; + +struct blkcg_gq; + +struct bio_set; + +struct bio { + struct bio *bi_next; + struct block_device *bi_bdev; + blk_opf_t bi_opf; + short unsigned int bi_flags; + short unsigned int bi_ioprio; + blk_status_t bi_status; + atomic_t __bi_remaining; + struct bvec_iter bi_iter; + blk_qc_t bi_cookie; + bio_end_io_t *bi_end_io; + void *bi_private; + struct blkcg_gq *bi_blkg; + struct bio_issue bi_issue; + union { }; + short unsigned int bi_vcnt; + short unsigned int bi_max_vecs; + atomic_t __bi_cnt; + struct bio_vec *bi_io_vec; + struct bio_set *bi_pool; + struct bio_vec bi_inline_vecs[0]; +}; + +enum writeback_stat_item { + NR_DIRTY_THRESHOLD = 0, + NR_DIRTY_BG_THRESHOLD = 1, + NR_VM_WRITEBACK_STAT_ITEMS = 2, +}; + +struct vm_event_state { + long unsigned int event[104]; +}; + +struct dev_pm_ops { + int (*prepare)(struct device *); + void (*complete)(struct device *); + int (*suspend)(struct device *); + int (*resume)(struct device *); + int (*freeze)(struct device *); + int (*thaw)(struct device *); + int (*poweroff)(struct device *); + int (*restore)(struct device *); + int (*suspend_late)(struct device *); + int (*resume_early)(struct device *); + int (*freeze_late)(struct device *); + int (*thaw_early)(struct device *); + int (*poweroff_late)(struct device *); + int (*restore_early)(struct device *); + int (*suspend_noirq)(struct device *); + int (*resume_noirq)(struct device *); + int (*freeze_noirq)(struct device *); + int (*thaw_noirq)(struct device *); + int (*poweroff_noirq)(struct device *); + int (*restore_noirq)(struct device *); + int (*runtime_suspend)(struct device *); + int (*runtime_resume)(struct device *); + int (*runtime_idle)(struct device *); +}; + +struct pm_subsys_data { + spinlock_t lock; + unsigned int refcount; + unsigned int clock_op_might_sleep; + struct mutex clock_mutex; + struct list_head clock_list; +}; + +struct wakeup_source { + const char *name; + int id; + struct list_head entry; + spinlock_t lock; + struct wake_irq *wakeirq; + struct timer_list timer; + long unsigned int timer_expires; + ktime_t total_time; + ktime_t max_time; + ktime_t last_time; + ktime_t start_prevent_time; + ktime_t prevent_sleep_time; + long unsigned int event_count; + long unsigned int active_count; + long unsigned int relax_count; + long unsigned int expire_count; + long unsigned int wakeup_count; + struct device *dev; + bool active: 1; + bool autosleep_enabled: 1; +}; + +struct dev_pm_domain { + struct dev_pm_ops ops; + int (*start)(struct device *); + void (*detach)(struct device *, bool); + int (*activate)(struct device *); + void (*sync)(struct device *); + void (*dismiss)(struct device *); +}; + +struct iommu_ops; + +struct subsys_private; + +struct bus_type { + const char *name; + const char *dev_name; + struct device *dev_root; + const struct attribute_group **bus_groups; + const struct attribute_group **dev_groups; + const struct attribute_group **drv_groups; + int (*match)(struct device *, struct device_driver *); + int (*uevent)(struct device *, struct kobj_uevent_env *); + int (*probe)(struct device *); + void (*sync_state)(struct device *); + void (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*online)(struct device *); + int (*offline)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + int (*num_vf)(struct device *); + int (*dma_configure)(struct device *); + void (*dma_cleanup)(struct device *); + const struct dev_pm_ops *pm; + const struct iommu_ops *iommu_ops; + struct subsys_private *p; + struct lock_class_key lock_key; + bool need_parent_lock; +}; + +enum probe_type { + PROBE_DEFAULT_STRATEGY = 0, + PROBE_PREFER_ASYNCHRONOUS = 1, + PROBE_FORCE_SYNCHRONOUS = 2, +}; + +struct of_device_id; + +struct acpi_device_id; + +struct driver_private; + +struct device_driver { + const char *name; + struct bus_type *bus; + struct module *owner; + const char *mod_name; + bool suppress_bind_attrs; + enum probe_type probe_type; + const struct of_device_id *of_match_table; + const struct acpi_device_id *acpi_match_table; + int (*probe)(struct device *); + void (*sync_state)(struct device *); + int (*remove)(struct device *); + void (*shutdown)(struct device *); + int (*suspend)(struct device *, pm_message_t); + int (*resume)(struct device *); + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + const struct dev_pm_ops *pm; + void (*coredump)(struct device *); + struct driver_private *p; +}; + +enum iommu_cap { + IOMMU_CAP_CACHE_COHERENCY = 0, + IOMMU_CAP_INTR_REMAP = 1, + IOMMU_CAP_NOEXEC = 2, + IOMMU_CAP_PRE_BOOT_PROTECTION = 3, +}; + +enum iommu_dev_features { + IOMMU_DEV_FEAT_SVA = 0, + IOMMU_DEV_FEAT_IOPF = 1, +}; + +struct iommu_domain; + +struct iommu_device; + +struct of_phandle_args; + +struct iommu_sva; + +struct iommu_fault_event; + +struct iommu_page_response; + +struct iommu_domain_ops; + +struct iommu_ops { + bool (*capable)(struct device *, enum iommu_cap); + struct iommu_domain * (*domain_alloc)(unsigned int); + struct iommu_device * (*probe_device)(struct device *); + void (*release_device)(struct device *); + void (*probe_finalize)(struct device *); + struct iommu_group * (*device_group)(struct device *); + void (*get_resv_regions)(struct device *, struct list_head *); + int (*of_xlate)(struct device *, struct of_phandle_args *); + bool (*is_attach_deferred)(struct device *); + int (*dev_enable_feat)(struct device *, enum iommu_dev_features); + int (*dev_disable_feat)(struct device *, enum iommu_dev_features); + struct iommu_sva * (*sva_bind)(struct device *, struct mm_struct *, void *); + void (*sva_unbind)(struct iommu_sva *); + u32 (*sva_get_pasid)(struct iommu_sva *); + int (*page_response)(struct device *, struct iommu_fault_event *, struct iommu_page_response *); + int (*def_domain_type)(struct device *); + const struct iommu_domain_ops *default_domain_ops; + long unsigned int pgsize_bitmap; + struct module *owner; +}; + +struct device_type { + const char *name; + const struct attribute_group **groups; + int (*uevent)(struct device *, struct kobj_uevent_env *); + char * (*devnode)(struct device *, umode_t *, kuid_t *, kgid_t *); + void (*release)(struct device *); + const struct dev_pm_ops *pm; +}; + +struct class { + const char *name; + struct module *owner; + const struct attribute_group **class_groups; + const struct attribute_group **dev_groups; + struct kobject *dev_kobj; + int (*dev_uevent)(struct device *, struct kobj_uevent_env *); + char * (*devnode)(struct device *, umode_t *); + void (*class_release)(struct class *); + void (*dev_release)(struct device *); + int (*shutdown_pre)(struct device *); + const struct kobj_ns_type_operations *ns_type; + const void * (*namespace)(struct device *); + void (*get_ownership)(struct device *, kuid_t *, kgid_t *); + const struct dev_pm_ops *pm; + struct subsys_private *p; +}; + +struct of_device_id { + char name[32]; + char type[32]; + char compatible[128]; + const void *data; +}; + +typedef long unsigned int kernel_ulong_t; + +struct acpi_device_id { + __u8 id[16]; + kernel_ulong_t driver_data; + __u32 cls; + __u32 cls_msk; +}; + +struct device_dma_parameters { + unsigned int max_segment_size; + unsigned int min_align_mask; + long unsigned int segment_boundary_mask; +}; + +enum device_physical_location_panel { + DEVICE_PANEL_TOP = 0, + DEVICE_PANEL_BOTTOM = 1, + DEVICE_PANEL_LEFT = 2, + DEVICE_PANEL_RIGHT = 3, + DEVICE_PANEL_FRONT = 4, + DEVICE_PANEL_BACK = 5, + DEVICE_PANEL_UNKNOWN = 6, +}; + +enum device_physical_location_vertical_position { + DEVICE_VERT_POS_UPPER = 0, + DEVICE_VERT_POS_CENTER = 1, + DEVICE_VERT_POS_LOWER = 2, +}; + +enum device_physical_location_horizontal_position { + DEVICE_HORI_POS_LEFT = 0, + DEVICE_HORI_POS_CENTER = 1, + DEVICE_HORI_POS_RIGHT = 2, +}; + +struct device_physical_location { + enum device_physical_location_panel panel; + enum device_physical_location_vertical_position vertical_position; + enum device_physical_location_horizontal_position horizontal_position; + bool dock; + bool lid; +}; + +typedef u64 dma_addr_t; + +enum dma_data_direction { + DMA_BIDIRECTIONAL = 0, + DMA_TO_DEVICE = 1, + DMA_FROM_DEVICE = 2, + DMA_NONE = 3, +}; + +struct sg_table; + +struct scatterlist; + +struct dma_map_ops { + unsigned int flags; + void * (*alloc)(struct device *, size_t, dma_addr_t *, gfp_t, long unsigned int); + void (*free)(struct device *, size_t, void *, dma_addr_t, long unsigned int); + struct page * (*alloc_pages)(struct device *, size_t, dma_addr_t *, enum dma_data_direction, gfp_t); + void (*free_pages)(struct device *, size_t, struct page *, dma_addr_t, enum dma_data_direction); + struct sg_table * (*alloc_noncontiguous)(struct device *, size_t, enum dma_data_direction, gfp_t, long unsigned int); + void (*free_noncontiguous)(struct device *, size_t, struct sg_table *, enum dma_data_direction); + int (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t, size_t, long unsigned int); + int (*get_sgtable)(struct device *, struct sg_table *, void *, dma_addr_t, size_t, long unsigned int); + dma_addr_t (*map_page)(struct device *, struct page *, long unsigned int, size_t, enum dma_data_direction, long unsigned int); + void (*unmap_page)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); + int (*map_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); + void (*unmap_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int); + dma_addr_t (*map_resource)(struct device *, phys_addr_t, size_t, enum dma_data_direction, long unsigned int); + void (*unmap_resource)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int); + void (*sync_single_for_cpu)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_single_for_device)(struct device *, dma_addr_t, size_t, enum dma_data_direction); + void (*sync_sg_for_cpu)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*sync_sg_for_device)(struct device *, struct scatterlist *, int, enum dma_data_direction); + void (*cache_sync)(struct device *, void *, size_t, enum dma_data_direction); + int (*dma_supported)(struct device *, u64); + u64 (*get_required_mask)(struct device *); + size_t (*max_mapping_size)(struct device *); + size_t (*opt_mapping_size)(); + long unsigned int (*get_merge_boundary)(struct device *); +}; + +struct bus_dma_region { + phys_addr_t cpu_start; + dma_addr_t dma_start; + u64 size; + u64 offset; +}; + +struct fwnode_operations; + +struct fwnode_handle { + struct fwnode_handle *secondary; + const struct fwnode_operations *ops; + struct device *dev; + struct list_head suppliers; + struct list_head consumers; + u8 flags; +}; + +enum cpuhp_state { + CPUHP_INVALID = -1, + CPUHP_OFFLINE = 0, + CPUHP_CREATE_THREADS = 1, + CPUHP_PERF_PREPARE = 2, + CPUHP_PERF_X86_PREPARE = 3, + CPUHP_PERF_X86_AMD_UNCORE_PREP = 4, + CPUHP_PERF_POWER = 5, + CPUHP_PERF_SUPERH = 6, + CPUHP_X86_HPET_DEAD = 7, + CPUHP_X86_APB_DEAD = 8, + CPUHP_X86_MCE_DEAD = 9, + CPUHP_VIRT_NET_DEAD = 10, + CPUHP_IBMVNIC_DEAD = 11, + CPUHP_SLUB_DEAD = 12, + CPUHP_DEBUG_OBJ_DEAD = 13, + CPUHP_MM_WRITEBACK_DEAD = 14, + CPUHP_MM_DEMOTION_DEAD = 15, + CPUHP_MM_VMSTAT_DEAD = 16, + CPUHP_SOFTIRQ_DEAD = 17, + CPUHP_NET_MVNETA_DEAD = 18, + CPUHP_CPUIDLE_DEAD = 19, + CPUHP_ARM64_FPSIMD_DEAD = 20, + CPUHP_ARM_OMAP_WAKE_DEAD = 21, + CPUHP_IRQ_POLL_DEAD = 22, + CPUHP_BLOCK_SOFTIRQ_DEAD = 23, + CPUHP_BIO_DEAD = 24, + CPUHP_ACPI_CPUDRV_DEAD = 25, + CPUHP_S390_PFAULT_DEAD = 26, + CPUHP_BLK_MQ_DEAD = 27, + CPUHP_FS_BUFF_DEAD = 28, + CPUHP_PRINTK_DEAD = 29, + CPUHP_MM_MEMCQ_DEAD = 30, + CPUHP_XFS_DEAD = 31, + CPUHP_PERCPU_CNT_DEAD = 32, + CPUHP_RADIX_DEAD = 33, + CPUHP_PAGE_ALLOC = 34, + CPUHP_NET_DEV_DEAD = 35, + CPUHP_PCI_XGENE_DEAD = 36, + CPUHP_IOMMU_IOVA_DEAD = 37, + CPUHP_LUSTRE_CFS_DEAD = 38, + CPUHP_AP_ARM_CACHE_B15_RAC_DEAD = 39, + CPUHP_PADATA_DEAD = 40, + CPUHP_AP_DTPM_CPU_DEAD = 41, + CPUHP_RANDOM_PREPARE = 42, + CPUHP_WORKQUEUE_PREP = 43, + CPUHP_POWER_NUMA_PREPARE = 44, + CPUHP_HRTIMERS_PREPARE = 45, + CPUHP_PROFILE_PREPARE = 46, + CPUHP_X2APIC_PREPARE = 47, + CPUHP_SMPCFD_PREPARE = 48, + CPUHP_RELAY_PREPARE = 49, + CPUHP_SLAB_PREPARE = 50, + CPUHP_MD_RAID5_PREPARE = 51, + CPUHP_RCUTREE_PREP = 52, + CPUHP_CPUIDLE_COUPLED_PREPARE = 53, + CPUHP_POWERPC_PMAC_PREPARE = 54, + CPUHP_POWERPC_MMU_CTX_PREPARE = 55, + CPUHP_XEN_PREPARE = 56, + CPUHP_XEN_EVTCHN_PREPARE = 57, + CPUHP_ARM_SHMOBILE_SCU_PREPARE = 58, + CPUHP_SH_SH3X_PREPARE = 59, + CPUHP_NET_FLOW_PREPARE = 60, + CPUHP_TOPOLOGY_PREPARE = 61, + CPUHP_NET_IUCV_PREPARE = 62, + CPUHP_ARM_BL_PREPARE = 63, + CPUHP_TRACE_RB_PREPARE = 64, + CPUHP_MM_ZS_PREPARE = 65, + CPUHP_MM_ZSWP_MEM_PREPARE = 66, + CPUHP_MM_ZSWP_POOL_PREPARE = 67, + CPUHP_KVM_PPC_BOOK3S_PREPARE = 68, + CPUHP_ZCOMP_PREPARE = 69, + CPUHP_TIMERS_PREPARE = 70, + CPUHP_MIPS_SOC_PREPARE = 71, + CPUHP_BP_PREPARE_DYN = 72, + CPUHP_BP_PREPARE_DYN_END = 92, + CPUHP_BRINGUP_CPU = 93, + CPUHP_AP_IDLE_DEAD = 94, + CPUHP_AP_OFFLINE = 95, + CPUHP_AP_CACHECTRL_STARTING = 96, + CPUHP_AP_SCHED_STARTING = 97, + CPUHP_AP_RCUTREE_DYING = 98, + CPUHP_AP_CPU_PM_STARTING = 99, + CPUHP_AP_IRQ_GIC_STARTING = 100, + CPUHP_AP_IRQ_HIP04_STARTING = 101, + CPUHP_AP_IRQ_APPLE_AIC_STARTING = 102, + CPUHP_AP_IRQ_ARMADA_XP_STARTING = 103, + CPUHP_AP_IRQ_BCM2836_STARTING = 104, + CPUHP_AP_IRQ_MIPS_GIC_STARTING = 105, + CPUHP_AP_IRQ_RISCV_STARTING = 106, + CPUHP_AP_IRQ_LOONGARCH_STARTING = 107, + CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING = 108, + CPUHP_AP_ARM_MVEBU_COHERENCY = 109, + CPUHP_AP_MICROCODE_LOADER = 110, + CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING = 111, + CPUHP_AP_PERF_X86_STARTING = 112, + CPUHP_AP_PERF_X86_AMD_IBS_STARTING = 113, + CPUHP_AP_PERF_X86_CQM_STARTING = 114, + CPUHP_AP_PERF_X86_CSTATE_STARTING = 115, + CPUHP_AP_PERF_XTENSA_STARTING = 116, + CPUHP_AP_MIPS_OP_LOONGSON3_STARTING = 117, + CPUHP_AP_ARM_SDEI_STARTING = 118, + CPUHP_AP_ARM_VFP_STARTING = 119, + CPUHP_AP_ARM64_DEBUG_MONITORS_STARTING = 120, + CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING = 121, + CPUHP_AP_PERF_ARM_ACPI_STARTING = 122, + CPUHP_AP_PERF_ARM_STARTING = 123, + CPUHP_AP_PERF_RISCV_STARTING = 124, + CPUHP_AP_ARM_L2X0_STARTING = 125, + CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING = 126, + CPUHP_AP_ARM_ARCH_TIMER_STARTING = 127, + CPUHP_AP_ARM_GLOBAL_TIMER_STARTING = 128, + CPUHP_AP_JCORE_TIMER_STARTING = 129, + CPUHP_AP_ARM_TWD_STARTING = 130, + CPUHP_AP_QCOM_TIMER_STARTING = 131, + CPUHP_AP_TEGRA_TIMER_STARTING = 132, + CPUHP_AP_ARMADA_TIMER_STARTING = 133, + CPUHP_AP_MARCO_TIMER_STARTING = 134, + CPUHP_AP_MIPS_GIC_TIMER_STARTING = 135, + CPUHP_AP_ARC_TIMER_STARTING = 136, + CPUHP_AP_RISCV_TIMER_STARTING = 137, + CPUHP_AP_CLINT_TIMER_STARTING = 138, + CPUHP_AP_CSKY_TIMER_STARTING = 139, + CPUHP_AP_TI_GP_TIMER_STARTING = 140, + CPUHP_AP_HYPERV_TIMER_STARTING = 141, + CPUHP_AP_KVM_STARTING = 142, + CPUHP_AP_KVM_ARM_VGIC_INIT_STARTING = 143, + CPUHP_AP_KVM_ARM_VGIC_STARTING = 144, + CPUHP_AP_KVM_ARM_TIMER_STARTING = 145, + CPUHP_AP_DUMMY_TIMER_STARTING = 146, + CPUHP_AP_ARM_XEN_STARTING = 147, + CPUHP_AP_ARM_CORESIGHT_STARTING = 148, + CPUHP_AP_ARM_CORESIGHT_CTI_STARTING = 149, + CPUHP_AP_ARM64_ISNDEP_STARTING = 150, + CPUHP_AP_SMPCFD_DYING = 151, + CPUHP_AP_X86_TBOOT_DYING = 152, + CPUHP_AP_ARM_CACHE_B15_RAC_DYING = 153, + CPUHP_AP_ONLINE = 154, + CPUHP_TEARDOWN_CPU = 155, + CPUHP_AP_ONLINE_IDLE = 156, + CPUHP_AP_SCHED_WAIT_EMPTY = 157, + CPUHP_AP_SMPBOOT_THREADS = 158, + CPUHP_AP_X86_VDSO_VMA_ONLINE = 159, + CPUHP_AP_IRQ_AFFINITY_ONLINE = 160, + CPUHP_AP_BLK_MQ_ONLINE = 161, + CPUHP_AP_ARM_MVEBU_SYNC_CLOCKS = 162, + CPUHP_AP_X86_INTEL_EPB_ONLINE = 163, + CPUHP_AP_PERF_ONLINE = 164, + CPUHP_AP_PERF_X86_ONLINE = 165, + CPUHP_AP_PERF_X86_UNCORE_ONLINE = 166, + CPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE = 167, + CPUHP_AP_PERF_X86_AMD_POWER_ONLINE = 168, + CPUHP_AP_PERF_X86_RAPL_ONLINE = 169, + CPUHP_AP_PERF_X86_CQM_ONLINE = 170, + CPUHP_AP_PERF_X86_CSTATE_ONLINE = 171, + CPUHP_AP_PERF_X86_IDXD_ONLINE = 172, + CPUHP_AP_PERF_S390_CF_ONLINE = 173, + CPUHP_AP_PERF_S390_SF_ONLINE = 174, + CPUHP_AP_PERF_ARM_CCI_ONLINE = 175, + CPUHP_AP_PERF_ARM_CCN_ONLINE = 176, + CPUHP_AP_PERF_ARM_HISI_CPA_ONLINE = 177, + CPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE = 178, + CPUHP_AP_PERF_ARM_HISI_HHA_ONLINE = 179, + CPUHP_AP_PERF_ARM_HISI_L3_ONLINE = 180, + CPUHP_AP_PERF_ARM_HISI_PA_ONLINE = 181, + CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE = 182, + CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE = 183, + CPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE = 184, + CPUHP_AP_PERF_ARM_L2X0_ONLINE = 185, + CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE = 186, + CPUHP_AP_PERF_ARM_QCOM_L3_ONLINE = 187, + CPUHP_AP_PERF_ARM_APM_XGENE_ONLINE = 188, + CPUHP_AP_PERF_ARM_CAVIUM_TX2_UNCORE_ONLINE = 189, + CPUHP_AP_PERF_ARM_MARVELL_CN10K_DDR_ONLINE = 190, + CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE = 191, + CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE = 192, + CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE = 193, + CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE = 194, + CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE = 195, + CPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE = 196, + CPUHP_AP_PERF_CSKY_ONLINE = 197, + CPUHP_AP_WATCHDOG_ONLINE = 198, + CPUHP_AP_WORKQUEUE_ONLINE = 199, + CPUHP_AP_RANDOM_ONLINE = 200, + CPUHP_AP_RCUTREE_ONLINE = 201, + CPUHP_AP_BASE_CACHEINFO_ONLINE = 202, + CPUHP_AP_ONLINE_DYN = 203, + CPUHP_AP_ONLINE_DYN_END = 233, + CPUHP_AP_MM_DEMOTION_ONLINE = 234, + CPUHP_AP_X86_HPET_ONLINE = 235, + CPUHP_AP_X86_KVM_CLK_ONLINE = 236, + CPUHP_AP_ACTIVE = 237, + CPUHP_ONLINE = 238, +}; + +struct seq_operations { + void * (*start)(struct seq_file *, loff_t *); + void (*stop)(struct seq_file *, void *); + void * (*next)(struct seq_file *, void *, loff_t *); + int (*show)(struct seq_file *, void *); +}; + +enum wb_stat_item { + WB_RECLAIMABLE = 0, + WB_WRITEBACK = 1, + WB_DIRTIED = 2, + WB_WRITTEN = 3, + NR_WB_STAT_ITEMS = 4, +}; + +enum dev_dma_attr { + DEV_DMA_NOT_SUPPORTED = 0, + DEV_DMA_NON_COHERENT = 1, + DEV_DMA_COHERENT = 2, +}; + +struct fwnode_reference_args; + +struct fwnode_endpoint; + +struct fwnode_operations { + struct fwnode_handle * (*get)(struct fwnode_handle *); + void (*put)(struct fwnode_handle *); + bool (*device_is_available)(const struct fwnode_handle *); + const void * (*device_get_match_data)(const struct fwnode_handle *, const struct device *); + bool (*device_dma_supported)(const struct fwnode_handle *); + enum dev_dma_attr (*device_get_dma_attr)(const struct fwnode_handle *); + bool (*property_present)(const struct fwnode_handle *, const char *); + int (*property_read_int_array)(const struct fwnode_handle *, const char *, unsigned int, void *, size_t); + int (*property_read_string_array)(const struct fwnode_handle *, const char *, const char **, size_t); + const char * (*get_name)(const struct fwnode_handle *); + const char * (*get_name_prefix)(const struct fwnode_handle *); + struct fwnode_handle * (*get_parent)(const struct fwnode_handle *); + struct fwnode_handle * (*get_next_child_node)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*get_named_child_node)(const struct fwnode_handle *, const char *); + int (*get_reference_args)(const struct fwnode_handle *, const char *, const char *, unsigned int, unsigned int, struct fwnode_reference_args *); + struct fwnode_handle * (*graph_get_next_endpoint)(const struct fwnode_handle *, struct fwnode_handle *); + struct fwnode_handle * (*graph_get_remote_endpoint)(const struct fwnode_handle *); + struct fwnode_handle * (*graph_get_port_parent)(struct fwnode_handle *); + int (*graph_parse_endpoint)(const struct fwnode_handle *, struct fwnode_endpoint *); + void * (*iomap)(struct fwnode_handle *, int); + int (*irq_get)(const struct fwnode_handle *, unsigned int); + int (*add_links)(struct fwnode_handle *); +}; + +struct fwnode_endpoint { + unsigned int port; + unsigned int id; + const struct fwnode_handle *local_fwnode; +}; + +struct fwnode_reference_args { + struct fwnode_handle *fwnode; + unsigned int nargs; + u64 args[8]; +}; + +struct cgroup_namespace { + struct ns_common ns; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct css_set *root_cset; +}; + +struct nsset; + +struct proc_ns_operations { + const char *name; + const char *real_ns_name; + int type; + struct ns_common * (*get)(struct task_struct *); + void (*put)(struct ns_common *); + int (*install)(struct nsset *, struct ns_common *); + struct user_namespace * (*owner)(struct ns_common *); + struct ns_common * (*get_parent)(struct ns_common *); +}; + +struct iovec { + void *iov_base; + __kernel_size_t iov_len; +}; + +struct kvec { + void *iov_base; + size_t iov_len; +}; + +typedef void *mempool_alloc_t(gfp_t, void *); + +typedef void mempool_free_t(void *, void *); + +struct mempool_s { + spinlock_t lock; + int min_nr; + int curr_nr; + void **elements; + void *pool_data; + mempool_alloc_t *alloc; + mempool_free_t *free; + wait_queue_head_t wait; +}; + +typedef struct mempool_s mempool_t; + +struct bio_alloc_cache; + +struct bio_set { + struct kmem_cache *bio_slab; + unsigned int front_pad; + struct bio_alloc_cache *cache; + mempool_t bio_pool; + mempool_t bvec_pool; + unsigned int back_pad; + spinlock_t rescue_lock; + struct bio_list rescue_list; + struct work_struct rescue_work; + struct workqueue_struct *rescue_workqueue; + struct hlist_node cpuhp_dead; +}; + +enum { + TASKSTATS_CMD_UNSPEC = 0, + TASKSTATS_CMD_GET = 1, + TASKSTATS_CMD_NEW = 2, + __TASKSTATS_CMD_MAX = 3, +}; + +enum ucount_type { + UCOUNT_USER_NAMESPACES = 0, + UCOUNT_PID_NAMESPACES = 1, + UCOUNT_UTS_NAMESPACES = 2, + UCOUNT_IPC_NAMESPACES = 3, + UCOUNT_NET_NAMESPACES = 4, + UCOUNT_MNT_NAMESPACES = 5, + UCOUNT_CGROUP_NAMESPACES = 6, + UCOUNT_TIME_NAMESPACES = 7, + UCOUNT_INOTIFY_INSTANCES = 8, + UCOUNT_INOTIFY_WATCHES = 9, + UCOUNT_COUNTS = 10, +}; + +enum rlimit_type { + UCOUNT_RLIMIT_NPROC = 0, + UCOUNT_RLIMIT_MSGQUEUE = 1, + UCOUNT_RLIMIT_SIGPENDING = 2, + UCOUNT_RLIMIT_MEMLOCK = 3, + UCOUNT_RLIMIT_COUNTS = 4, +}; + +enum cpu_usage_stat { + CPUTIME_USER = 0, + CPUTIME_NICE = 1, + CPUTIME_SYSTEM = 2, + CPUTIME_SOFTIRQ = 3, + CPUTIME_IRQ = 4, + CPUTIME_IDLE = 5, + CPUTIME_IOWAIT = 6, + CPUTIME_STEAL = 7, + CPUTIME_GUEST = 8, + CPUTIME_GUEST_NICE = 9, + NR_STATS = 10, +}; + +struct u64_stats_sync {}; + +enum cgroup_bpf_attach_type { + CGROUP_BPF_ATTACH_TYPE_INVALID = -1, + CGROUP_INET_INGRESS = 0, + CGROUP_INET_EGRESS = 1, + CGROUP_INET_SOCK_CREATE = 2, + CGROUP_SOCK_OPS = 3, + CGROUP_DEVICE = 4, + CGROUP_INET4_BIND = 5, + CGROUP_INET6_BIND = 6, + CGROUP_INET4_CONNECT = 7, + CGROUP_INET6_CONNECT = 8, + CGROUP_INET4_POST_BIND = 9, + CGROUP_INET6_POST_BIND = 10, + CGROUP_UDP4_SENDMSG = 11, + CGROUP_UDP6_SENDMSG = 12, + CGROUP_SYSCTL = 13, + CGROUP_UDP4_RECVMSG = 14, + CGROUP_UDP6_RECVMSG = 15, + CGROUP_GETSOCKOPT = 16, + CGROUP_SETSOCKOPT = 17, + CGROUP_INET4_GETPEERNAME = 18, + CGROUP_INET6_GETPEERNAME = 19, + CGROUP_INET4_GETSOCKNAME = 20, + CGROUP_INET6_GETSOCKNAME = 21, + CGROUP_INET_SOCK_RELEASE = 22, + CGROUP_LSM_START = 23, + CGROUP_LSM_END = 32, + MAX_CGROUP_BPF_ATTACH_TYPE = 33, +}; + +struct psi_group {}; + +enum cgroup_subsys_id { + cpuset_cgrp_id = 0, + cpu_cgrp_id = 1, + cpuacct_cgrp_id = 2, + io_cgrp_id = 3, + memory_cgrp_id = 4, + devices_cgrp_id = 5, + freezer_cgrp_id = 6, + net_cls_cgrp_id = 7, + perf_event_cgrp_id = 8, + hugetlb_cgrp_id = 9, + CGROUP_SUBSYS_COUNT = 10, +}; + +struct cgroup_taskset; + +struct cftype; + +struct cgroup_subsys { + struct cgroup_subsys_state * (*css_alloc)(struct cgroup_subsys_state *); + int (*css_online)(struct cgroup_subsys_state *); + void (*css_offline)(struct cgroup_subsys_state *); + void (*css_released)(struct cgroup_subsys_state *); + void (*css_free)(struct cgroup_subsys_state *); + void (*css_reset)(struct cgroup_subsys_state *); + void (*css_rstat_flush)(struct cgroup_subsys_state *, int); + int (*css_extra_stat_show)(struct seq_file *, struct cgroup_subsys_state *); + int (*can_attach)(struct cgroup_taskset *); + void (*cancel_attach)(struct cgroup_taskset *); + void (*attach)(struct cgroup_taskset *); + void (*post_attach)(); + int (*can_fork)(struct task_struct *, struct css_set *); + void (*cancel_fork)(struct task_struct *, struct css_set *); + void (*fork)(struct task_struct *); + void (*exit)(struct task_struct *); + void (*release)(struct task_struct *); + void (*bind)(struct cgroup_subsys_state *); + bool early_init: 1; + bool implicit_on_dfl: 1; + bool threaded: 1; + int id; + const char *name; + const char *legacy_name; + struct cgroup_root *root; + struct idr css_idr; + struct list_head cfts; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + unsigned int depends_on; +}; + +struct cgroup_rstat_cpu { + struct u64_stats_sync bsync; + struct cgroup_base_stat bstat; + struct cgroup_base_stat last_bstat; + struct cgroup *updated_children; + struct cgroup *updated_next; +}; + +struct cgroup_root { + struct kernfs_root *kf_root; + unsigned int subsys_mask; + int hierarchy_id; + struct cgroup cgrp; + struct cgroup *cgrp_ancestor_storage; + atomic_t nr_cgrps; + struct list_head root_list; + unsigned int flags; + char release_agent_path[4096]; + char name[64]; +}; + +struct cftype { + char name[64]; + long unsigned int private; + size_t max_write_len; + unsigned int flags; + unsigned int file_offset; + struct cgroup_subsys *ss; + struct list_head node; + struct kernfs_ops *kf_ops; + int (*open)(struct kernfs_open_file *); + void (*release)(struct kernfs_open_file *); + u64 (*read_u64)(struct cgroup_subsys_state *, struct cftype *); + s64 (*read_s64)(struct cgroup_subsys_state *, struct cftype *); + int (*seq_show)(struct seq_file *, void *); + void * (*seq_start)(struct seq_file *, loff_t *); + void * (*seq_next)(struct seq_file *, void *, loff_t *); + void (*seq_stop)(struct seq_file *, void *); + int (*write_u64)(struct cgroup_subsys_state *, struct cftype *, u64); + int (*write_s64)(struct cgroup_subsys_state *, struct cftype *, s64); + ssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t); + __poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *); + struct lock_class_key lockdep_key; +}; + +enum memcg_memory_event { + MEMCG_LOW = 0, + MEMCG_HIGH = 1, + MEMCG_MAX = 2, + MEMCG_OOM = 3, + MEMCG_OOM_KILL = 4, + MEMCG_OOM_GROUP_KILL = 5, + MEMCG_SWAP_HIGH = 6, + MEMCG_SWAP_MAX = 7, + MEMCG_SWAP_FAIL = 8, + MEMCG_NR_MEMORY_EVENTS = 9, +}; + +struct mem_cgroup_reclaim_iter { + struct mem_cgroup *position; + unsigned int generation; +}; + +struct shrinker_info { + struct callback_head rcu; + atomic_long_t *nr_deferred; + long unsigned int *map; +}; + +struct lruvec_stats_percpu { + long int state[43]; + long int state_prev[43]; +}; + +struct lruvec_stats { + long int state[43]; + long int state_pending[43]; +}; + +struct mem_cgroup_per_node { + struct lruvec lruvec; + struct lruvec_stats_percpu *lruvec_stats_percpu; + struct lruvec_stats lruvec_stats; + long unsigned int lru_zone_size[20]; + struct mem_cgroup_reclaim_iter iter; + struct shrinker_info *shrinker_info; + struct rb_node tree_node; + long unsigned int usage_in_excess; + bool on_tree; + struct mem_cgroup *memcg; +}; + +struct eventfd_ctx; + +struct mem_cgroup_threshold { + struct eventfd_ctx *eventfd; + long unsigned int threshold; +}; + +struct mem_cgroup_threshold_ary { + int current_threshold; + unsigned int size; + struct mem_cgroup_threshold entries[0]; +}; + +struct obj_cgroup { + struct percpu_ref refcnt; + struct mem_cgroup *memcg; + atomic_t nr_charged_bytes; + union { + struct list_head list; + struct callback_head rcu; + }; +}; + +struct percpu_cluster { + struct swap_cluster_info index; + unsigned int next; +}; + +struct compact_control { + struct list_head freepages; + struct list_head migratepages; + unsigned int nr_freepages; + unsigned int nr_migratepages; + long unsigned int free_pfn; + long unsigned int migrate_pfn; + long unsigned int fast_start_pfn; + struct zone *zone; + long unsigned int total_migrate_scanned; + long unsigned int total_free_scanned; + short unsigned int fast_search_fail; + short int search_order; + const gfp_t gfp_mask; + int order; + int migratetype; + const unsigned int alloc_flags; + const int highest_zoneidx; + enum migrate_mode mode; + bool ignore_skip_hint; + bool no_set_skip_hint; + bool ignore_block_suitable; + bool direct_compaction; + bool proactive_compaction; + bool whole_zone; + bool contended; + bool rescan; + bool alloc_contig; +}; + +struct contig_page_info { + long unsigned int free_pages; + long unsigned int free_blocks_total; + long unsigned int free_blocks_suitable; +}; + +struct hashtab_key_params { + u32 (*hash)(const void *); + int (*cmp)(const void *, const void *); +}; + +struct hashtab_node { + void *key; + void *datum; + struct hashtab_node *next; +}; + +struct hashtab { + struct hashtab_node **htable; + u32 size; + u32 nel; +}; + +struct symtab { + struct hashtab table; + u32 nprim; +}; + +typedef short int __s16; + +typedef __s16 s16; + +typedef __u16 __be16; + +typedef __u32 __be32; + +typedef __u32 __wsum; + +struct page_pool_params { + unsigned int flags; + unsigned int order; + unsigned int pool_size; + int nid; + struct device *dev; + enum dma_data_direction dma_dir; + unsigned int max_len; + unsigned int offset; + void (*init_callback)(struct page *, void *); + void *init_arg; +}; + +struct pp_alloc_cache { + u32 count; + struct page *cache[128]; +}; + +struct ptr_ring { + int producer; + spinlock_t producer_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + int consumer_head; + int consumer_tail; + spinlock_t consumer_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + int size; + int batch; + void **queue; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct page_pool { + struct page_pool_params p; + struct delayed_work release_dw; + void (*disconnect)(void *); + long unsigned int defer_start; + long unsigned int defer_warn; + u32 pages_state_hold_cnt; + unsigned int frag_offset; + struct page *frag_page; + long int frag_users; + u32 xdp_mem_id; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct pp_alloc_cache alloc; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct ptr_ring ring; + atomic_t pages_state_release_cnt; + refcount_t user_cnt; + u64 destroy_cnt; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct notifier_block; + +typedef int (*notifier_fn_t)(struct notifier_block *, long unsigned int, void *); + +struct notifier_block { + notifier_fn_t notifier_call; + struct notifier_block *next; + int priority; +}; + +struct blocking_notifier_head { + struct rw_semaphore rwsem; + struct notifier_block *head; +}; + +struct raw_notifier_head { + struct notifier_block *head; +}; + +struct crypto_async_request; + +typedef void (*crypto_completion_t)(struct crypto_async_request *, int); + +struct crypto_tfm; + +struct crypto_async_request { + struct list_head list; + crypto_completion_t complete; + void *data; + struct crypto_tfm *tfm; + u32 flags; +}; + +struct crypto_alg; + +struct crypto_tfm { + u32 crt_flags; + int node; + void (*exit)(struct crypto_tfm *); + struct crypto_alg *__crt_alg; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__crt_ctx[0]; +}; + +struct cipher_alg { + unsigned int cia_min_keysize; + unsigned int cia_max_keysize; + int (*cia_setkey)(struct crypto_tfm *, const u8 *, unsigned int); + void (*cia_encrypt)(struct crypto_tfm *, u8 *, const u8 *); + void (*cia_decrypt)(struct crypto_tfm *, u8 *, const u8 *); +}; + +struct compress_alg { + int (*coa_compress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); + int (*coa_decompress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *); +}; + +struct crypto_type; + +struct crypto_alg { + struct list_head cra_list; + struct list_head cra_users; + u32 cra_flags; + unsigned int cra_blocksize; + unsigned int cra_ctxsize; + unsigned int cra_alignmask; + int cra_priority; + refcount_t cra_refcnt; + char cra_name[128]; + char cra_driver_name[128]; + const struct crypto_type *cra_type; + union { + struct cipher_alg cipher; + struct compress_alg compress; + } cra_u; + int (*cra_init)(struct crypto_tfm *); + void (*cra_exit)(struct crypto_tfm *); + void (*cra_destroy)(struct crypto_alg *); + struct module *cra_module; +}; + +struct sk_buff; + +struct crypto_instance; + +struct crypto_type { + unsigned int (*ctxsize)(struct crypto_alg *, u32, u32); + unsigned int (*extsize)(struct crypto_alg *); + int (*init)(struct crypto_tfm *, u32, u32); + int (*init_tfm)(struct crypto_tfm *); + void (*show)(struct seq_file *, struct crypto_alg *); + int (*report)(struct sk_buff *, struct crypto_alg *); + void (*free)(struct crypto_instance *); + unsigned int type; + unsigned int maskclear; + unsigned int maskset; + unsigned int tfmsize; +}; + +struct aead_request { + struct crypto_async_request base; + unsigned int assoclen; + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct scatterlist { + long unsigned int page_link; + unsigned int offset; + unsigned int length; + dma_addr_t dma_address; + unsigned int dma_length; +}; + +struct crypto_aead; + +struct aead_alg { + int (*setkey)(struct crypto_aead *, const u8 *, unsigned int); + int (*setauthsize)(struct crypto_aead *, unsigned int); + int (*encrypt)(struct aead_request *); + int (*decrypt)(struct aead_request *); + int (*init)(struct crypto_aead *); + void (*exit)(struct crypto_aead *); + unsigned int ivsize; + unsigned int maxauthsize; + unsigned int chunksize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct crypto_aead { + unsigned int authsize; + unsigned int reqsize; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +typedef unsigned int sk_buff_data_t; + +struct net_device; + +struct skb_ext; + +struct sk_buff { + union { + struct { + struct sk_buff *next; + struct sk_buff *prev; + union { + struct net_device *dev; + long unsigned int dev_scratch; + }; + }; + struct rb_node rbnode; + struct list_head list; + struct llist_node ll_node; + }; + union { + struct sock *sk; + int ip_defrag_offset; + }; + union { + ktime_t tstamp; + u64 skb_mstamp_ns; + }; + char cb[48]; + union { + struct { + long unsigned int _skb_refdst; + void (*destructor)(struct sk_buff *); + }; + struct list_head tcp_tsorted_anchor; + long unsigned int _sk_redir; + }; + long unsigned int _nfct; + unsigned int len; + unsigned int data_len; + __u16 mac_len; + __u16 hdr_len; + __u16 queue_mapping; + __u8 __cloned_offset[0]; + __u8 cloned: 1; + __u8 nohdr: 1; + __u8 fclone: 2; + __u8 peeked: 1; + __u8 head_frag: 1; + __u8 pfmemalloc: 1; + __u8 pp_recycle: 1; + __u8 active_extensions; + union { + struct { + __u8 __pkt_type_offset[0]; + __u8 pkt_type: 3; + __u8 ignore_df: 1; + __u8 nf_trace: 1; + __u8 ip_summed: 2; + __u8 ooo_okay: 1; + __u8 l4_hash: 1; + __u8 sw_hash: 1; + __u8 wifi_acked_valid: 1; + __u8 wifi_acked: 1; + __u8 no_fcs: 1; + __u8 encapsulation: 1; + __u8 encap_hdr_csum: 1; + __u8 csum_valid: 1; + __u8 __pkt_vlan_present_offset[0]; + __u8 remcsum_offload: 1; + __u8 csum_complete_sw: 1; + __u8 csum_level: 2; + __u8 dst_pending_confirm: 1; + __u8 mono_delivery_time: 1; + __u8 tc_skip_classify: 1; + __u8 tc_at_ingress: 1; + __u8 ndisc_nodetype: 2; + __u8 ipvs_property: 1; + __u8 inner_protocol_type: 1; + __u8 redirected: 1; + __u8 nf_skip_egress: 1; + __u8 slow_gro: 1; + __u8 csum_not_inet: 1; + __u8 scm_io_uring: 1; + __u16 tc_index; + union { + __wsum csum; + struct { + __u16 csum_start; + __u16 csum_offset; + }; + }; + __u32 priority; + int skb_iif; + __u32 hash; + union { + u32 vlan_all; + struct { + __be16 vlan_proto; + __u16 vlan_tci; + }; + }; + union { + unsigned int napi_id; + unsigned int sender_cpu; + }; + u16 alloc_cpu; + __u32 secmark; + union { + __u32 mark; + __u32 reserved_tailroom; + }; + union { + __be16 inner_protocol; + __u8 inner_ipproto; + }; + __u16 inner_transport_header; + __u16 inner_network_header; + __u16 inner_mac_header; + __be16 protocol; + __u16 transport_header; + __u16 network_header; + __u16 mac_header; + }; + struct { + __u8 __pkt_type_offset[0]; + __u8 pkt_type: 3; + __u8 ignore_df: 1; + __u8 nf_trace: 1; + __u8 ip_summed: 2; + __u8 ooo_okay: 1; + __u8 l4_hash: 1; + __u8 sw_hash: 1; + __u8 wifi_acked_valid: 1; + __u8 wifi_acked: 1; + __u8 no_fcs: 1; + __u8 encapsulation: 1; + __u8 encap_hdr_csum: 1; + __u8 csum_valid: 1; + __u8 __pkt_vlan_present_offset[0]; + __u8 remcsum_offload: 1; + __u8 csum_complete_sw: 1; + __u8 csum_level: 2; + __u8 dst_pending_confirm: 1; + __u8 mono_delivery_time: 1; + __u8 tc_skip_classify: 1; + __u8 tc_at_ingress: 1; + __u8 ndisc_nodetype: 2; + __u8 ipvs_property: 1; + __u8 inner_protocol_type: 1; + __u8 redirected: 1; + __u8 nf_skip_egress: 1; + __u8 slow_gro: 1; + __u8 csum_not_inet: 1; + __u8 scm_io_uring: 1; + __u16 tc_index; + union { + __wsum csum; + struct { + __u16 csum_start; + __u16 csum_offset; + }; + }; + __u32 priority; + int skb_iif; + __u32 hash; + union { + u32 vlan_all; + struct { + __be16 vlan_proto; + __u16 vlan_tci; + }; + }; + union { + unsigned int napi_id; + unsigned int sender_cpu; + }; + u16 alloc_cpu; + __u32 secmark; + union { + __u32 mark; + __u32 reserved_tailroom; + }; + union { + __be16 inner_protocol; + __u8 inner_ipproto; + }; + __u16 inner_transport_header; + __u16 inner_network_header; + __u16 inner_mac_header; + __be16 protocol; + __u16 transport_header; + __u16 network_header; + __u16 mac_header; + } headers; + }; + sk_buff_data_t tail; + sk_buff_data_t end; + unsigned char *head; + unsigned char *data; + unsigned int truesize; + refcount_t users; + struct skb_ext *extensions; +}; + +struct crypto_template; + +struct crypto_spawn; + +struct crypto_instance { + struct crypto_alg alg; + struct crypto_template *tmpl; + union { + struct hlist_node list; + struct crypto_spawn *spawns; + }; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_spawn { + struct list_head list; + struct crypto_alg *alg; + union { + struct crypto_instance *inst; + struct crypto_spawn *next; + }; + const struct crypto_type *frontend; + u32 mask; + bool dead; + bool registered; +}; + +struct rtattr; + +struct crypto_template { + struct list_head list; + struct hlist_head instances; + struct module *module; + int (*create)(struct crypto_template *, struct rtattr **); + char name[128]; +}; + +struct rtattr { + short unsigned int rta_len; + short unsigned int rta_type; +}; + +struct scatter_walk { + struct scatterlist *sg; + unsigned int offset; +}; + +struct crypto_cipher { + struct crypto_tfm base; +}; + +struct crypto_cipher_spawn { + struct crypto_spawn base; +}; + +struct skcipher_request { + unsigned int cryptlen; + u8 *iv; + struct scatterlist *src; + struct scatterlist *dst; + struct crypto_async_request base; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_skcipher { + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +struct crypto_sync_skcipher { + struct crypto_skcipher base; +}; + +struct skcipher_alg { + int (*setkey)(struct crypto_skcipher *, const u8 *, unsigned int); + int (*encrypt)(struct skcipher_request *); + int (*decrypt)(struct skcipher_request *); + int (*init)(struct crypto_skcipher *); + void (*exit)(struct crypto_skcipher *); + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; + unsigned int chunksize; + unsigned int walksize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct skcipher_instance { + void (*free)(struct skcipher_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[128]; + struct crypto_instance base; + } s; + struct skcipher_alg alg; + }; +}; + +struct crypto_skcipher_spawn { + struct crypto_spawn base; +}; + +struct skcipher_walk { + union { + struct { + struct page *page; + long unsigned int offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } src; + union { + struct { + struct page *page; + long unsigned int offset; + } phys; + struct { + u8 *page; + void *addr; + } virt; + } dst; + struct scatter_walk in; + unsigned int nbytes; + struct scatter_walk out; + unsigned int total; + struct list_head buffers; + u8 *page; + u8 *buffer; + u8 *oiv; + void *iv; + unsigned int ivsize; + int flags; + unsigned int blocksize; + unsigned int stride; + unsigned int alignmask; +}; + +struct skcipher_ctx_simple { + struct crypto_cipher *cipher; +}; + +struct rhash_head { + struct rhash_head *next; +}; + +struct rhashtable; + +struct rhashtable_compare_arg { + struct rhashtable *ht; + const void *key; +}; + +typedef u32 (*rht_hashfn_t)(const void *, u32, u32); + +typedef u32 (*rht_obj_hashfn_t)(const void *, u32, u32); + +typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *, const void *); + +struct rhashtable_params { + u16 nelem_hint; + u16 key_len; + u16 key_offset; + u16 head_offset; + unsigned int max_size; + u16 min_size; + bool automatic_shrinking; + rht_hashfn_t hashfn; + rht_obj_hashfn_t obj_hashfn; + rht_obj_cmpfn_t obj_cmpfn; +}; + +struct bucket_table; + +struct rhashtable { + struct bucket_table *tbl; + unsigned int key_len; + unsigned int max_elems; + struct rhashtable_params p; + bool rhlist; + struct work_struct run_work; + struct mutex mutex; + spinlock_t lock; + atomic_t nelems; +}; + +struct ref_tracker_dir {}; + +struct prot_inuse; + +struct netns_core { + struct ctl_table_header *sysctl_hdr; + int sysctl_somaxconn; + u8 sysctl_txrehash; + struct prot_inuse *prot_inuse; +}; + +struct ipstats_mib; + +struct tcp_mib; + +struct linux_mib; + +struct udp_mib; + +struct linux_tls_mib; + +struct mptcp_mib; + +struct icmp_mib; + +struct icmpmsg_mib; + +struct icmpv6_mib; + +struct icmpv6msg_mib; + +struct proc_dir_entry; + +struct netns_mib { + struct ipstats_mib *ip_statistics; + struct ipstats_mib *ipv6_statistics; + struct tcp_mib *tcp_statistics; + struct linux_mib *net_statistics; + struct udp_mib *udp_statistics; + struct udp_mib *udp_stats_in6; + struct linux_tls_mib *tls_statistics; + struct mptcp_mib *mptcp_statistics; + struct udp_mib *udplite_statistics; + struct udp_mib *udplite_stats_in6; + struct icmp_mib *icmp_statistics; + struct icmpmsg_mib *icmpmsg_statistics; + struct icmpv6_mib *icmpv6_statistics; + struct icmpv6msg_mib *icmpv6msg_statistics; + struct proc_dir_entry *proc_net_devsnmp6; +}; + +struct netns_packet { + struct mutex sklist_lock; + struct hlist_head sklist; +}; + +struct unix_table { + spinlock_t *locks; + struct hlist_head *buckets; +}; + +struct netns_unix { + struct unix_table table; + int sysctl_max_dgram_qlen; + struct ctl_table_header *ctl; +}; + +struct netns_nexthop { + struct rb_root rb_root; + struct hlist_head *devhash; + unsigned int seq; + u32 last_id_allocated; + struct blocking_notifier_head notifier_chain; +}; + +struct inet_hashinfo; + +struct inet_timewait_death_row { + refcount_t tw_refcount; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct inet_hashinfo *hashinfo; + int sysctl_max_tw_buckets; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct local_ports { + seqlock_t lock; + int range[2]; + bool warned; +}; + +struct ping_group_range { + seqlock_t lock; + kgid_t range[2]; +}; + +typedef struct { + u64 key[2]; +} siphash_key_t; + +struct udp_table; + +struct ipv4_devconf; + +struct ip_ra_chain; + +struct fib_rules_ops; + +struct fib_table; + +struct inet_peer_base; + +struct fqdir; + +struct tcp_congestion_ops; + +struct tcp_fastopen_context; + +struct mr_table; + +struct fib_notifier_ops; + +struct netns_ipv4 { + struct inet_timewait_death_row tcp_death_row; + struct udp_table *udp_table; + struct ctl_table_header *forw_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *ipv4_hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *xfrm4_hdr; + struct ipv4_devconf *devconf_all; + struct ipv4_devconf *devconf_dflt; + struct ip_ra_chain *ra_chain; + struct mutex ra_mutex; + struct fib_rules_ops *rules_ops; + struct fib_table *fib_main; + struct fib_table *fib_default; + unsigned int fib_rules_require_fldissect; + bool fib_has_custom_rules; + bool fib_has_custom_local_routes; + bool fib_offload_disabled; + struct hlist_head *fib_table_hash; + struct sock *fibnl; + struct sock *mc_autojoin_sk; + struct inet_peer_base *peers; + struct fqdir *fqdir; + u8 sysctl_icmp_echo_ignore_all; + u8 sysctl_icmp_echo_enable_probe; + u8 sysctl_icmp_echo_ignore_broadcasts; + u8 sysctl_icmp_ignore_bogus_error_responses; + u8 sysctl_icmp_errors_use_inbound_ifaddr; + int sysctl_icmp_ratelimit; + int sysctl_icmp_ratemask; + u32 ip_rt_min_pmtu; + int ip_rt_mtu_expires; + int ip_rt_min_advmss; + struct local_ports ip_local_ports; + u8 sysctl_tcp_ecn; + u8 sysctl_tcp_ecn_fallback; + u8 sysctl_ip_default_ttl; + u8 sysctl_ip_no_pmtu_disc; + u8 sysctl_ip_fwd_use_pmtu; + u8 sysctl_ip_fwd_update_priority; + u8 sysctl_ip_nonlocal_bind; + u8 sysctl_ip_autobind_reuse; + u8 sysctl_ip_dynaddr; + u8 sysctl_ip_early_demux; + u8 sysctl_raw_l3mdev_accept; + u8 sysctl_tcp_early_demux; + u8 sysctl_udp_early_demux; + u8 sysctl_nexthop_compat_mode; + u8 sysctl_fwmark_reflect; + u8 sysctl_tcp_fwmark_accept; + u8 sysctl_tcp_l3mdev_accept; + u8 sysctl_tcp_mtu_probing; + int sysctl_tcp_mtu_probe_floor; + int sysctl_tcp_base_mss; + int sysctl_tcp_min_snd_mss; + int sysctl_tcp_probe_threshold; + u32 sysctl_tcp_probe_interval; + int sysctl_tcp_keepalive_time; + int sysctl_tcp_keepalive_intvl; + u8 sysctl_tcp_keepalive_probes; + u8 sysctl_tcp_syn_retries; + u8 sysctl_tcp_synack_retries; + u8 sysctl_tcp_syncookies; + u8 sysctl_tcp_migrate_req; + u8 sysctl_tcp_comp_sack_nr; + int sysctl_tcp_reordering; + u8 sysctl_tcp_retries1; + u8 sysctl_tcp_retries2; + u8 sysctl_tcp_orphan_retries; + u8 sysctl_tcp_tw_reuse; + int sysctl_tcp_fin_timeout; + unsigned int sysctl_tcp_notsent_lowat; + u8 sysctl_tcp_sack; + u8 sysctl_tcp_window_scaling; + u8 sysctl_tcp_timestamps; + u8 sysctl_tcp_early_retrans; + u8 sysctl_tcp_recovery; + u8 sysctl_tcp_thin_linear_timeouts; + u8 sysctl_tcp_slow_start_after_idle; + u8 sysctl_tcp_retrans_collapse; + u8 sysctl_tcp_stdurg; + u8 sysctl_tcp_rfc1337; + u8 sysctl_tcp_abort_on_overflow; + u8 sysctl_tcp_fack; + int sysctl_tcp_max_reordering; + int sysctl_tcp_adv_win_scale; + u8 sysctl_tcp_dsack; + u8 sysctl_tcp_app_win; + u8 sysctl_tcp_frto; + u8 sysctl_tcp_nometrics_save; + u8 sysctl_tcp_no_ssthresh_metrics_save; + u8 sysctl_tcp_moderate_rcvbuf; + u8 sysctl_tcp_tso_win_divisor; + u8 sysctl_tcp_workaround_signed_windows; + int sysctl_tcp_limit_output_bytes; + int sysctl_tcp_challenge_ack_limit; + int sysctl_tcp_min_rtt_wlen; + u8 sysctl_tcp_min_tso_segs; + u8 sysctl_tcp_tso_rtt_log; + u8 sysctl_tcp_autocorking; + u8 sysctl_tcp_reflect_tos; + int sysctl_tcp_invalid_ratelimit; + int sysctl_tcp_pacing_ss_ratio; + int sysctl_tcp_pacing_ca_ratio; + int sysctl_tcp_wmem[3]; + int sysctl_tcp_rmem[3]; + unsigned int sysctl_tcp_child_ehash_entries; + long unsigned int sysctl_tcp_comp_sack_delay_ns; + long unsigned int sysctl_tcp_comp_sack_slack_ns; + int sysctl_max_syn_backlog; + int sysctl_tcp_fastopen; + const struct tcp_congestion_ops *tcp_congestion_control; + struct tcp_fastopen_context *tcp_fastopen_ctx; + unsigned int sysctl_tcp_fastopen_blackhole_timeout; + atomic_t tfo_active_disable_times; + long unsigned int tfo_active_disable_stamp; + u32 tcp_challenge_timestamp; + u32 tcp_challenge_count; + u8 sysctl_tcp_plb_enabled; + u8 sysctl_tcp_plb_idle_rehash_rounds; + u8 sysctl_tcp_plb_rehash_rounds; + u8 sysctl_tcp_plb_suspend_rto_sec; + int sysctl_tcp_plb_cong_thresh; + int sysctl_udp_wmem_min; + int sysctl_udp_rmem_min; + u8 sysctl_fib_notify_on_flag_change; + u8 sysctl_udp_l3mdev_accept; + u8 sysctl_igmp_llm_reports; + int sysctl_igmp_max_memberships; + int sysctl_igmp_max_msf; + int sysctl_igmp_qrv; + struct ping_group_range ping_group_range; + atomic_t dev_addr_genid; + unsigned int sysctl_udp_child_hash_entries; + long unsigned int *sysctl_local_reserved_ports; + int sysctl_ip_prot_sock; + struct mr_table *mrt; + u32 sysctl_fib_multipath_hash_fields; + u8 sysctl_fib_multipath_use_neigh; + u8 sysctl_fib_multipath_hash_policy; + struct fib_notifier_ops *notifier_ops; + unsigned int fib_seq; + struct fib_notifier_ops *ipmr_notifier_ops; + unsigned int ipmr_seq; + atomic_t rt_genid; + siphash_key_t ip_id_key; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct dst_entry; + +struct neighbour; + +struct dst_ops { + short unsigned int family; + unsigned int gc_thresh; + int (*gc)(struct dst_ops *); + struct dst_entry * (*check)(struct dst_entry *, __u32); + unsigned int (*default_advmss)(const struct dst_entry *); + unsigned int (*mtu)(const struct dst_entry *); + u32 * (*cow_metrics)(struct dst_entry *, long unsigned int); + void (*destroy)(struct dst_entry *); + void (*ifdown)(struct dst_entry *, struct net_device *, int); + struct dst_entry * (*negative_advice)(struct dst_entry *); + void (*link_failure)(struct sk_buff *); + void (*update_pmtu)(struct dst_entry *, struct sock *, struct sk_buff *, u32, bool); + void (*redirect)(struct dst_entry *, struct sock *, struct sk_buff *); + int (*local_out)(struct net *, struct sock *, struct sk_buff *); + struct neighbour * (*neigh_lookup)(const struct dst_entry *, struct sk_buff *, const void *); + void (*confirm_neigh)(const struct dst_entry *, const void *); + struct kmem_cache *kmem_cachep; + struct percpu_counter pcpuc_entries; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct netns_sysctl_ipv6 { + struct ctl_table_header *hdr; + struct ctl_table_header *route_hdr; + struct ctl_table_header *icmp_hdr; + struct ctl_table_header *frags_hdr; + struct ctl_table_header *xfrm6_hdr; + int flush_delay; + int ip6_rt_max_size; + int ip6_rt_gc_min_interval; + int ip6_rt_gc_timeout; + int ip6_rt_gc_interval; + int ip6_rt_gc_elasticity; + int ip6_rt_mtu_expires; + int ip6_rt_min_advmss; + u32 multipath_hash_fields; + u8 multipath_hash_policy; + u8 bindv6only; + u8 flowlabel_consistency; + u8 auto_flowlabels; + int icmpv6_time; + u8 icmpv6_echo_ignore_all; + u8 icmpv6_echo_ignore_multicast; + u8 icmpv6_echo_ignore_anycast; + long unsigned int icmpv6_ratemask[4]; + long unsigned int *icmpv6_ratemask_ptr; + u8 anycast_src_echo_reply; + u8 ip_nonlocal_bind; + u8 fwmark_reflect; + u8 flowlabel_state_ranges; + int idgen_retries; + int idgen_delay; + int flowlabel_reflect; + int max_dst_opts_cnt; + int max_hbh_opts_cnt; + int max_dst_opts_len; + int max_hbh_opts_len; + int seg6_flowlabel; + u32 ioam6_id; + u64 ioam6_id_wide; + bool skip_notify_on_dev_down; + u8 fib_notify_on_flag_change; +}; + +struct ipv6_devconf; + +struct fib6_info; + +struct rt6_info; + +struct rt6_statistics; + +struct fib6_table; + +struct seg6_pernet_data; + +struct ioam6_pernet_data; + +struct netns_ipv6 { + struct dst_ops ip6_dst_ops; + struct netns_sysctl_ipv6 sysctl; + struct ipv6_devconf *devconf_all; + struct ipv6_devconf *devconf_dflt; + struct inet_peer_base *peers; + struct fqdir *fqdir; + struct fib6_info *fib6_null_entry; + struct rt6_info *ip6_null_entry; + struct rt6_statistics *rt6_stats; + struct timer_list ip6_fib_timer; + struct hlist_head *fib_table_hash; + struct fib6_table *fib6_main_tbl; + struct list_head fib6_walkers; + rwlock_t fib6_walker_lock; + spinlock_t fib6_gc_lock; + atomic_t ip6_rt_gc_expire; + long unsigned int ip6_rt_last_gc; + unsigned char flowlabel_has_excl; + bool fib6_has_custom_rules; + unsigned int fib6_rules_require_fldissect; + unsigned int fib6_routes_require_src; + struct rt6_info *ip6_prohibit_entry; + struct rt6_info *ip6_blk_hole_entry; + struct fib6_table *fib6_local_tbl; + struct fib_rules_ops *fib6_rules_ops; + struct sock *ndisc_sk; + struct sock *tcp_sk; + struct sock *igmp_sk; + struct sock *mc_autojoin_sk; + struct hlist_head *inet6_addr_lst; + spinlock_t addrconf_hash_lock; + struct delayed_work addr_chk_work; + atomic_t dev_addr_genid; + atomic_t fib6_sernum; + struct seg6_pernet_data *seg6_data; + struct fib_notifier_ops *notifier_ops; + struct fib_notifier_ops *ip6mr_notifier_ops; + unsigned int ipmr_seq; + struct { + struct hlist_head head; + spinlock_t lock; + u32 seq; + } ip6addrlbl_table; + struct ioam6_pernet_data *ioam6_data; + long: 64; + long: 64; +}; + +struct nf_logger; + +struct nf_hook_entries; + +struct netns_nf { + struct proc_dir_entry *proc_netfilter; + const struct nf_logger *nf_loggers[11]; + struct ctl_table_header *nf_log_dir_header; + struct nf_hook_entries *hooks_ipv4[5]; + struct nf_hook_entries *hooks_ipv6[5]; + unsigned int defrag_ipv4_users; + unsigned int defrag_ipv6_users; +}; + +struct nf_ct_event_notifier; + +struct nf_generic_net { + unsigned int timeout; +}; + +struct nf_tcp_net { + unsigned int timeouts[14]; + u8 tcp_loose; + u8 tcp_be_liberal; + u8 tcp_max_retrans; + u8 tcp_ignore_invalid_rst; +}; + +struct nf_udp_net { + unsigned int timeouts[2]; +}; + +struct nf_icmp_net { + unsigned int timeout; +}; + +struct nf_dccp_net { + u8 dccp_loose; + unsigned int dccp_timeout[10]; +}; + +struct nf_sctp_net { + unsigned int timeouts[11]; +}; + +struct nf_ip_net { + struct nf_generic_net generic; + struct nf_tcp_net tcp; + struct nf_udp_net udp; + struct nf_icmp_net icmp; + struct nf_icmp_net icmpv6; + struct nf_dccp_net dccp; + struct nf_sctp_net sctp; +}; + +struct ip_conntrack_stat; + +struct netns_ct { + u8 sysctl_log_invalid; + u8 sysctl_events; + u8 sysctl_acct; + u8 sysctl_tstamp; + u8 sysctl_checksum; + struct ip_conntrack_stat *stat; + struct nf_ct_event_notifier *nf_conntrack_event_cb; + struct nf_ip_net nf_ct_proto; +}; + +struct bpf_prog; + +struct netns_bpf { + struct bpf_prog_array *run_array[2]; + struct bpf_prog *progs[2]; + struct list_head links[2]; +}; + +struct xfrm_policy_hash { + struct hlist_head *table; + unsigned int hmask; + u8 dbits4; + u8 sbits4; + u8 dbits6; + u8 sbits6; +}; + +struct xfrm_policy_hthresh { + struct work_struct work; + seqlock_t lock; + u8 lbits4; + u8 rbits4; + u8 lbits6; + u8 rbits6; +}; + +struct netns_xfrm { + struct list_head state_all; + struct hlist_head *state_bydst; + struct hlist_head *state_bysrc; + struct hlist_head *state_byspi; + struct hlist_head *state_byseq; + unsigned int state_hmask; + unsigned int state_num; + struct work_struct state_hash_work; + struct list_head policy_all; + struct hlist_head *policy_byidx; + unsigned int policy_idx_hmask; + struct hlist_head policy_inexact[3]; + struct xfrm_policy_hash policy_bydst[3]; + unsigned int policy_count[6]; + struct work_struct policy_hash_work; + struct xfrm_policy_hthresh policy_hthresh; + struct list_head inexact_bins; + struct sock *nlsk; + struct sock *nlsk_stash; + u32 sysctl_aevent_etime; + u32 sysctl_aevent_rseqth; + int sysctl_larval_drop; + u32 sysctl_acq_expires; + u8 policy_default[3]; + struct ctl_table_header *sysctl_hdr; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct dst_ops xfrm4_dst_ops; + struct dst_ops xfrm6_dst_ops; + spinlock_t xfrm_state_lock; + seqcount_spinlock_t xfrm_state_hash_generation; + seqcount_spinlock_t xfrm_policy_hash_generation; + spinlock_t xfrm_policy_lock; + struct mutex xfrm_cfg_mutex; +}; + +struct mpls_route; + +struct netns_mpls { + int ip_ttl_propagate; + int default_ttl; + size_t platform_labels; + struct mpls_route **platform_label; + struct ctl_table_header *ctl; +}; + +struct netns_xdp { + struct mutex lock; + struct hlist_head list; +}; + +struct uevent_sock; + +struct net_generic; + +struct net { + refcount_t passive; + spinlock_t rules_mod_lock; + atomic_t dev_unreg_count; + unsigned int dev_base_seq; + int ifindex; + spinlock_t nsid_lock; + atomic_t fnhe_genid; + struct list_head list; + struct list_head exit_list; + struct llist_node cleanup_list; + struct key_tag *key_domain; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct idr netns_ids; + struct ns_common ns; + struct ref_tracker_dir refcnt_tracker; + struct ref_tracker_dir notrefcnt_tracker; + struct list_head dev_base_head; + struct proc_dir_entry *proc_net; + struct proc_dir_entry *proc_net_stat; + struct ctl_table_set sysctls; + struct sock *rtnl; + struct sock *genl_sock; + struct uevent_sock *uevent_sock; + struct hlist_head *dev_name_head; + struct hlist_head *dev_index_head; + struct raw_notifier_head netdev_chain; + u32 hash_mix; + struct net_device *loopback_dev; + struct list_head rules_ops; + struct netns_core core; + struct netns_mib mib; + struct netns_packet packet; + struct netns_unix unx; + struct netns_nexthop nexthop; + long: 64; + long: 64; + long: 64; + long: 64; + struct netns_ipv4 ipv4; + struct netns_ipv6 ipv6; + struct netns_nf nf; + struct netns_ct ct; + struct net_generic *gen; + struct netns_bpf bpf; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct netns_xfrm xfrm; + u64 net_cookie; + struct netns_mpls mpls; + struct netns_xdp xdp; + struct sock *diag_nlsk; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef short unsigned int __kernel_sa_family_t; + +typedef __kernel_sa_family_t sa_family_t; + +struct sockaddr { + sa_family_t sa_family; + union { + char sa_data_min[14]; + struct { + struct { } __empty_sa_data; + char sa_data[0]; + }; + }; +}; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + short unsigned int loopback; +} sync_serial_settings; + +typedef struct { + unsigned int clock_rate; + unsigned int clock_type; + short unsigned int loopback; + unsigned int slot_map; +} te1_settings; + +typedef struct { + short unsigned int encoding; + short unsigned int parity; +} raw_hdlc_proto; + +typedef struct { + unsigned int t391; + unsigned int t392; + unsigned int n391; + unsigned int n392; + unsigned int n393; + short unsigned int lmi; + short unsigned int dce; +} fr_proto; + +typedef struct { + unsigned int dlci; +} fr_proto_pvc; + +typedef struct { + unsigned int dlci; + char master[16]; +} fr_proto_pvc_info; + +typedef struct { + unsigned int interval; + unsigned int timeout; +} cisco_proto; + +typedef struct { + short unsigned int dce; + unsigned int modulo; + unsigned int window; + unsigned int t1; + unsigned int t2; + unsigned int n2; +} x25_hdlc_proto; + +struct ifmap { + long unsigned int mem_start; + long unsigned int mem_end; + short unsigned int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct if_settings { + unsigned int type; + unsigned int size; + union { + raw_hdlc_proto *raw_hdlc; + cisco_proto *cisco; + fr_proto *fr; + fr_proto_pvc *fr_pvc; + fr_proto_pvc_info *fr_pvc_info; + x25_hdlc_proto *x25; + sync_serial_settings *sync; + te1_settings *te1; + } ifs_ifsu; +}; + +struct ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + void *ifru_data; + struct if_settings ifru_settings; + } ifr_ifru; +}; + +enum crypto_attr_type_t { + CRYPTOCFGA_UNSPEC = 0, + CRYPTOCFGA_PRIORITY_VAL = 1, + CRYPTOCFGA_REPORT_LARVAL = 2, + CRYPTOCFGA_REPORT_HASH = 3, + CRYPTOCFGA_REPORT_BLKCIPHER = 4, + CRYPTOCFGA_REPORT_AEAD = 5, + CRYPTOCFGA_REPORT_COMPRESS = 6, + CRYPTOCFGA_REPORT_RNG = 7, + CRYPTOCFGA_REPORT_CIPHER = 8, + CRYPTOCFGA_REPORT_AKCIPHER = 9, + CRYPTOCFGA_REPORT_KPP = 10, + CRYPTOCFGA_REPORT_ACOMP = 11, + CRYPTOCFGA_STAT_LARVAL = 12, + CRYPTOCFGA_STAT_HASH = 13, + CRYPTOCFGA_STAT_BLKCIPHER = 14, + CRYPTOCFGA_STAT_AEAD = 15, + CRYPTOCFGA_STAT_COMPRESS = 16, + CRYPTOCFGA_STAT_RNG = 17, + CRYPTOCFGA_STAT_CIPHER = 18, + CRYPTOCFGA_STAT_AKCIPHER = 19, + CRYPTOCFGA_STAT_KPP = 20, + CRYPTOCFGA_STAT_ACOMP = 21, + __CRYPTOCFGA_MAX = 22, +}; + +struct crypto_report_blkcipher { + char type[64]; + char geniv[64]; + unsigned int blocksize; + unsigned int min_keysize; + unsigned int max_keysize; + unsigned int ivsize; +}; + +typedef struct { + atomic_long_t a; +} local_t; + +struct dql { + unsigned int num_queued; + unsigned int adj_limit; + unsigned int last_obj_cnt; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int limit; + unsigned int num_completed; + unsigned int prev_ovlimit; + unsigned int prev_num_queued; + unsigned int prev_last_obj_cnt; + unsigned int lowest_slack; + long unsigned int slack_start_time; + unsigned int max_limit; + unsigned int min_limit; + unsigned int slack_hold_time; + long: 32; + long: 64; + long: 64; +}; + +struct in6_addr { + union { + __u8 u6_addr8[16]; + __be16 u6_addr16[8]; + __be32 u6_addr32[4]; + } in6_u; +}; + +typedef struct { + local_t a; +} local64_t; + +typedef struct { + local64_t v; +} u64_stats_t; + +struct ipstats_mib { + u64 mibs[37]; + struct u64_stats_sync syncp; +}; + +struct icmp_mib { + long unsigned int mibs[28]; +}; + +struct icmpmsg_mib { + atomic_long_t mibs[512]; +}; + +struct icmpv6_mib { + long unsigned int mibs[6]; +}; + +struct icmpv6msg_mib { + atomic_long_t mibs[512]; +}; + +struct tcp_mib { + long unsigned int mibs[16]; +}; + +struct udp_mib { + long unsigned int mibs[10]; +}; + +struct linux_mib { + long unsigned int mibs[127]; +}; + +struct linux_tls_mib { + long unsigned int mibs[13]; +}; + +struct inet_frags; + +struct fqdir { + long int high_thresh; + long int low_thresh; + int timeout; + int max_dist; + struct inet_frags *f; + struct net *net; + bool dead; + long: 56; + long: 64; + long: 64; + struct rhashtable rhashtable; + long: 64; + long: 64; + long: 64; + long: 64; + atomic_long_t mem; + struct work_struct destroy_work; + struct llist_node free_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct inet_frag_queue; + +struct inet_frags { + unsigned int qsize; + void (*constructor)(struct inet_frag_queue *, const void *); + void (*destructor)(struct inet_frag_queue *); + void (*frag_expire)(struct timer_list *); + struct kmem_cache *frags_cachep; + const char *frags_cache_name; + struct rhashtable_params rhash_params; + refcount_t refcnt; + struct completion completion; +}; + +struct frag_v4_compare_key { + __be32 saddr; + __be32 daddr; + u32 user; + u32 vif; + __be16 id; + u16 protocol; +}; + +struct frag_v6_compare_key { + struct in6_addr saddr; + struct in6_addr daddr; + u32 user; + __be32 id; + u32 iif; +}; + +struct inet_frag_queue { + struct rhash_head node; + union { + struct frag_v4_compare_key v4; + struct frag_v6_compare_key v6; + } key; + struct timer_list timer; + spinlock_t lock; + refcount_t refcnt; + struct rb_root rb_fragments; + struct sk_buff *fragments_tail; + struct sk_buff *last_run_head; + ktime_t stamp; + int len; + int meat; + u8 mono_delivery_time; + __u8 flags; + u16 max_size; + struct fqdir *fqdir; + struct callback_head rcu; +}; + +enum tcp_ca_event { + CA_EVENT_TX_START = 0, + CA_EVENT_CWND_RESTART = 1, + CA_EVENT_COMPLETE_CWR = 2, + CA_EVENT_LOSS = 3, + CA_EVENT_ECN_NO_CE = 4, + CA_EVENT_ECN_IS_CE = 5, +}; + +struct ack_sample; + +struct rate_sample; + +union tcp_cc_info; + +struct tcp_congestion_ops { + u32 (*ssthresh)(struct sock *); + void (*cong_avoid)(struct sock *, u32, u32); + void (*set_state)(struct sock *, u8); + void (*cwnd_event)(struct sock *, enum tcp_ca_event); + void (*in_ack_event)(struct sock *, u32); + void (*pkts_acked)(struct sock *, const struct ack_sample *); + u32 (*min_tso_segs)(struct sock *); + void (*cong_control)(struct sock *, const struct rate_sample *); + u32 (*undo_cwnd)(struct sock *); + u32 (*sndbuf_expand)(struct sock *); + size_t (*get_info)(struct sock *, u32, int *, union tcp_cc_info *); + char name[16]; + struct module *owner; + struct list_head list; + u32 key; + u32 flags; + void (*init)(struct sock *); + void (*release)(struct sock *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef struct {} netdevice_tracker; + +struct xfrm_state; + +struct lwtunnel_state; + +struct dst_entry { + struct net_device *dev; + struct dst_ops *ops; + long unsigned int _metrics; + long unsigned int expires; + struct xfrm_state *xfrm; + int (*input)(struct sk_buff *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + short unsigned int flags; + short int obsolete; + short unsigned int header_len; + short unsigned int trailer_len; + atomic_t __refcnt; + int __use; + long unsigned int lastuse; + struct lwtunnel_state *lwtstate; + struct callback_head callback_head; + short int error; + short int __pad; + __u32 tclassid; + netdevice_tracker dev_tracker; +}; + +typedef u64 netdev_features_t; + +struct net_device_stats { + union { + long unsigned int rx_packets; + atomic_long_t __rx_packets; + }; + union { + long unsigned int tx_packets; + atomic_long_t __tx_packets; + }; + union { + long unsigned int rx_bytes; + atomic_long_t __rx_bytes; + }; + union { + long unsigned int tx_bytes; + atomic_long_t __tx_bytes; + }; + union { + long unsigned int rx_errors; + atomic_long_t __rx_errors; + }; + union { + long unsigned int tx_errors; + atomic_long_t __tx_errors; + }; + union { + long unsigned int rx_dropped; + atomic_long_t __rx_dropped; + }; + union { + long unsigned int tx_dropped; + atomic_long_t __tx_dropped; + }; + union { + long unsigned int multicast; + atomic_long_t __multicast; + }; + union { + long unsigned int collisions; + atomic_long_t __collisions; + }; + union { + long unsigned int rx_length_errors; + atomic_long_t __rx_length_errors; + }; + union { + long unsigned int rx_over_errors; + atomic_long_t __rx_over_errors; + }; + union { + long unsigned int rx_crc_errors; + atomic_long_t __rx_crc_errors; + }; + union { + long unsigned int rx_frame_errors; + atomic_long_t __rx_frame_errors; + }; + union { + long unsigned int rx_fifo_errors; + atomic_long_t __rx_fifo_errors; + }; + union { + long unsigned int rx_missed_errors; + atomic_long_t __rx_missed_errors; + }; + union { + long unsigned int tx_aborted_errors; + atomic_long_t __tx_aborted_errors; + }; + union { + long unsigned int tx_carrier_errors; + atomic_long_t __tx_carrier_errors; + }; + union { + long unsigned int tx_fifo_errors; + atomic_long_t __tx_fifo_errors; + }; + union { + long unsigned int tx_heartbeat_errors; + atomic_long_t __tx_heartbeat_errors; + }; + union { + long unsigned int tx_window_errors; + atomic_long_t __tx_window_errors; + }; + union { + long unsigned int rx_compressed; + atomic_long_t __rx_compressed; + }; + union { + long unsigned int tx_compressed; + atomic_long_t __tx_compressed; + }; +}; + +struct netdev_hw_addr_list { + struct list_head list; + int count; + struct rb_root tree; +}; + +enum rx_handler_result { + RX_HANDLER_CONSUMED = 0, + RX_HANDLER_ANOTHER = 1, + RX_HANDLER_EXACT = 2, + RX_HANDLER_PASS = 3, +}; + +typedef enum rx_handler_result rx_handler_result_t; + +typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **); + +typedef struct { + struct net *net; +} possible_net_t; + +enum netdev_ml_priv_type { + ML_PRIV_NONE = 0, + ML_PRIV_CAN = 1, +}; + +struct netdev_tc_txq { + u16 count; + u16 offset; +}; + +struct sfp_bus; + +struct bpf_xdp_link; + +struct bpf_xdp_entity { + struct bpf_prog *prog; + struct bpf_xdp_link *link; +}; + +struct netdev_name_node; + +struct dev_ifalias; + +struct net_device_ops; + +struct net_device_core_stats; + +struct ethtool_ops; + +struct l3mdev_ops; + +struct ndisc_ops; + +struct header_ops; + +struct in_device; + +struct inet6_dev; + +struct vlan_info; + +struct mpls_dev; + +struct netdev_rx_queue; + +struct mini_Qdisc; + +struct netdev_queue; + +struct cpu_rmap; + +struct Qdisc; + +struct xdp_dev_bulk_queue; + +struct xps_dev_maps; + +struct pcpu_lstats; + +struct pcpu_sw_netstats; + +struct pcpu_dstats; + +struct rtnl_link_ops; + +struct dcbnl_rtnl_ops; + +struct phy_device; + +struct udp_tunnel_nic_info; + +struct udp_tunnel_nic; + +struct rtnl_hw_stats64; + +struct devlink_port; + +struct net_device { + char name[16]; + struct netdev_name_node *name_node; + struct dev_ifalias *ifalias; + long unsigned int mem_end; + long unsigned int mem_start; + long unsigned int base_addr; + long unsigned int state; + struct list_head dev_list; + struct list_head napi_list; + struct list_head unreg_list; + struct list_head close_list; + struct list_head ptype_all; + struct list_head ptype_specific; + struct { + struct list_head upper; + struct list_head lower; + } adj_list; + unsigned int flags; + long long unsigned int priv_flags; + const struct net_device_ops *netdev_ops; + int ifindex; + short unsigned int gflags; + short unsigned int hard_header_len; + unsigned int mtu; + short unsigned int needed_headroom; + short unsigned int needed_tailroom; + netdev_features_t features; + netdev_features_t hw_features; + netdev_features_t wanted_features; + netdev_features_t vlan_features; + netdev_features_t hw_enc_features; + netdev_features_t mpls_features; + netdev_features_t gso_partial_features; + unsigned int min_mtu; + unsigned int max_mtu; + short unsigned int type; + unsigned char min_header_len; + unsigned char name_assign_type; + int group; + struct net_device_stats stats; + struct net_device_core_stats *core_stats; + atomic_t carrier_up_count; + atomic_t carrier_down_count; + const struct ethtool_ops *ethtool_ops; + const struct l3mdev_ops *l3mdev_ops; + const struct ndisc_ops *ndisc_ops; + const struct header_ops *header_ops; + unsigned char operstate; + unsigned char link_mode; + unsigned char if_port; + unsigned char dma; + unsigned char perm_addr[32]; + unsigned char addr_assign_type; + unsigned char addr_len; + unsigned char upper_level; + unsigned char lower_level; + short unsigned int neigh_priv_len; + short unsigned int dev_id; + short unsigned int dev_port; + short unsigned int padded; + spinlock_t addr_list_lock; + int irq; + struct netdev_hw_addr_list uc; + struct netdev_hw_addr_list mc; + struct netdev_hw_addr_list dev_addrs; + struct kset *queues_kset; + struct list_head unlink_list; + unsigned int promiscuity; + unsigned int allmulti; + bool uc_promisc; + unsigned char nested_level; + struct in_device *ip_ptr; + struct inet6_dev *ip6_ptr; + struct vlan_info *vlan_info; + struct mpls_dev *mpls_ptr; + const unsigned char *dev_addr; + struct netdev_rx_queue *_rx; + unsigned int num_rx_queues; + unsigned int real_num_rx_queues; + struct bpf_prog *xdp_prog; + long unsigned int gro_flush_timeout; + int napi_defer_hard_irqs; + unsigned int gro_max_size; + rx_handler_func_t *rx_handler; + void *rx_handler_data; + struct mini_Qdisc *miniq_ingress; + struct netdev_queue *ingress_queue; + struct nf_hook_entries *nf_hooks_ingress; + unsigned char broadcast[32]; + struct cpu_rmap *rx_cpu_rmap; + struct hlist_node index_hlist; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct netdev_queue *_tx; + unsigned int num_tx_queues; + unsigned int real_num_tx_queues; + struct Qdisc *qdisc; + unsigned int tx_queue_len; + spinlock_t tx_global_lock; + struct xdp_dev_bulk_queue *xdp_bulkq; + struct xps_dev_maps *xps_maps[2]; + struct mini_Qdisc *miniq_egress; + struct nf_hook_entries *nf_hooks_egress; + struct hlist_head qdisc_hash[16]; + struct timer_list watchdog_timer; + int watchdog_timeo; + u32 proto_down_reason; + struct list_head todo_list; + int *pcpu_refcnt; + struct ref_tracker_dir refcnt_tracker; + struct list_head link_watch_list; + enum { + NETREG_UNINITIALIZED = 0, + NETREG_REGISTERED = 1, + NETREG_UNREGISTERING = 2, + NETREG_UNREGISTERED = 3, + NETREG_RELEASED = 4, + NETREG_DUMMY = 5, + } reg_state: 8; + bool dismantle; + enum { + RTNL_LINK_INITIALIZED = 0, + RTNL_LINK_INITIALIZING = 1, + } rtnl_link_state: 16; + bool needs_free_netdev; + void (*priv_destructor)(struct net_device *); + possible_net_t nd_net; + void *ml_priv; + enum netdev_ml_priv_type ml_priv_type; + union { + struct pcpu_lstats *lstats; + struct pcpu_sw_netstats *tstats; + struct pcpu_dstats *dstats; + }; + struct device dev; + const struct attribute_group *sysfs_groups[4]; + const struct attribute_group *sysfs_rx_queue_group; + const struct rtnl_link_ops *rtnl_link_ops; + unsigned int gso_max_size; + unsigned int tso_max_size; + u16 gso_max_segs; + u16 tso_max_segs; + const struct dcbnl_rtnl_ops *dcbnl_ops; + s16 num_tc; + struct netdev_tc_txq tc_to_txq[16]; + u8 prio_tc_map[16]; + struct phy_device *phydev; + struct sfp_bus *sfp_bus; + struct lock_class_key *qdisc_tx_busylock; + bool proto_down; + unsigned int wol_enabled: 1; + unsigned int threaded: 1; + struct list_head net_notifier_list; + const struct udp_tunnel_nic_info *udp_tunnel_nic_info; + struct udp_tunnel_nic *udp_tunnel_nic; + struct bpf_xdp_entity xdp_state[3]; + u8 dev_addr_shadow[32]; + netdevice_tracker linkwatch_dev_tracker; + netdevice_tracker watchdog_dev_tracker; + netdevice_tracker dev_registered_tracker; + struct rtnl_hw_stats64 *offload_xstats_l3; + struct devlink_port *devlink_port; + long: 64; + long: 64; + long: 64; +}; + +struct sk_buff_list { + struct sk_buff *next; + struct sk_buff *prev; +}; + +struct sk_buff_head { + union { + struct { + struct sk_buff *next; + struct sk_buff *prev; + }; + struct sk_buff_list list; + }; + __u32 qlen; + spinlock_t lock; +}; + +struct hh_cache { + unsigned int hh_len; + seqlock_t hh_lock; + long unsigned int hh_data[12]; +}; + +struct neigh_table; + +struct neigh_parms; + +struct neigh_ops; + +struct neighbour { + struct neighbour *next; + struct neigh_table *tbl; + struct neigh_parms *parms; + long unsigned int confirmed; + long unsigned int updated; + rwlock_t lock; + refcount_t refcnt; + unsigned int arp_queue_len_bytes; + struct sk_buff_head arp_queue; + struct timer_list timer; + long unsigned int used; + atomic_t probes; + u8 nud_state; + u8 type; + u8 dead; + u8 protocol; + u32 flags; + seqlock_t ha_lock; + unsigned char ha[32]; + struct hh_cache hh; + int (*output)(struct neighbour *, struct sk_buff *); + const struct neigh_ops *ops; + struct list_head gc_list; + struct list_head managed_list; + struct callback_head rcu; + struct net_device *dev; + netdevice_tracker dev_tracker; + u8 primary_key[0]; +}; + +enum nf_log_type { + NF_LOG_TYPE_LOG = 0, + NF_LOG_TYPE_ULOG = 1, + NF_LOG_TYPE_MAX = 2, +}; + +typedef u8 u_int8_t; + +struct nf_loginfo; + +typedef void nf_logfn(struct net *, u_int8_t, unsigned int, const struct sk_buff *, const struct net_device *, const struct net_device *, const struct nf_loginfo *, const char *); + +struct nf_logger { + char *name; + enum nf_log_type type; + nf_logfn *logfn; + struct module *me; +}; + +struct ip_conntrack_stat { + unsigned int found; + unsigned int invalid; + unsigned int insert; + unsigned int insert_failed; + unsigned int clash_resolve; + unsigned int drop; + unsigned int early_drop; + unsigned int error; + unsigned int expect_new; + unsigned int expect_create; + unsigned int expect_delete; + unsigned int search_restart; + unsigned int chaintoolong; +}; + +struct skb_shared_hwtstamps { + union { + ktime_t hwtstamp; + void *netdev_data; + }; +}; + +struct skb_ext { + refcount_t refcnt; + u8 offset[3]; + u8 chunks; + char data[0]; +}; + +struct ieee_ets { + __u8 willing; + __u8 ets_cap; + __u8 cbs; + __u8 tc_tx_bw[8]; + __u8 tc_rx_bw[8]; + __u8 tc_tsa[8]; + __u8 prio_tc[8]; + __u8 tc_reco_bw[8]; + __u8 tc_reco_tsa[8]; + __u8 reco_prio_tc[8]; +}; + +struct ieee_maxrate { + __u64 tc_maxrate[8]; +}; + +struct ieee_qcn { + __u8 rpg_enable[8]; + __u32 rppp_max_rps[8]; + __u32 rpg_time_reset[8]; + __u32 rpg_byte_reset[8]; + __u32 rpg_threshold[8]; + __u32 rpg_max_rate[8]; + __u32 rpg_ai_rate[8]; + __u32 rpg_hai_rate[8]; + __u32 rpg_gd[8]; + __u32 rpg_min_dec_fac[8]; + __u32 rpg_min_rate[8]; + __u32 cndd_state_machine[8]; +}; + +struct ieee_qcn_stats { + __u64 rppp_rp_centiseconds[8]; + __u32 rppp_created_rps[8]; +}; + +struct ieee_pfc { + __u8 pfc_cap; + __u8 pfc_en; + __u8 mbc; + __u16 delay; + __u64 requests[8]; + __u64 indications[8]; +}; + +struct dcbnl_buffer { + __u8 prio2buffer[8]; + __u32 buffer_size[8]; + __u32 total_size; +}; + +struct cee_pg { + __u8 willing; + __u8 error; + __u8 pg_en; + __u8 tcs_supported; + __u8 pg_bw[8]; + __u8 prio_pg[8]; +}; + +struct cee_pfc { + __u8 willing; + __u8 error; + __u8 pfc_en; + __u8 tcs_supported; +}; + +struct dcb_app { + __u8 selector; + __u8 priority; + __u16 protocol; +}; + +struct dcb_peer_app_info { + __u8 willing; + __u8 error; +}; + +struct dcbnl_rtnl_ops { + int (*ieee_getets)(struct net_device *, struct ieee_ets *); + int (*ieee_setets)(struct net_device *, struct ieee_ets *); + int (*ieee_getmaxrate)(struct net_device *, struct ieee_maxrate *); + int (*ieee_setmaxrate)(struct net_device *, struct ieee_maxrate *); + int (*ieee_getqcn)(struct net_device *, struct ieee_qcn *); + int (*ieee_setqcn)(struct net_device *, struct ieee_qcn *); + int (*ieee_getqcnstats)(struct net_device *, struct ieee_qcn_stats *); + int (*ieee_getpfc)(struct net_device *, struct ieee_pfc *); + int (*ieee_setpfc)(struct net_device *, struct ieee_pfc *); + int (*ieee_getapp)(struct net_device *, struct dcb_app *); + int (*ieee_setapp)(struct net_device *, struct dcb_app *); + int (*ieee_delapp)(struct net_device *, struct dcb_app *); + int (*ieee_peer_getets)(struct net_device *, struct ieee_ets *); + int (*ieee_peer_getpfc)(struct net_device *, struct ieee_pfc *); + u8 (*getstate)(struct net_device *); + u8 (*setstate)(struct net_device *, u8); + void (*getpermhwaddr)(struct net_device *, u8 *); + void (*setpgtccfgtx)(struct net_device *, int, u8, u8, u8, u8); + void (*setpgbwgcfgtx)(struct net_device *, int, u8); + void (*setpgtccfgrx)(struct net_device *, int, u8, u8, u8, u8); + void (*setpgbwgcfgrx)(struct net_device *, int, u8); + void (*getpgtccfgtx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); + void (*getpgbwgcfgtx)(struct net_device *, int, u8 *); + void (*getpgtccfgrx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *); + void (*getpgbwgcfgrx)(struct net_device *, int, u8 *); + void (*setpfccfg)(struct net_device *, int, u8); + void (*getpfccfg)(struct net_device *, int, u8 *); + u8 (*setall)(struct net_device *); + u8 (*getcap)(struct net_device *, int, u8 *); + int (*getnumtcs)(struct net_device *, int, u8 *); + int (*setnumtcs)(struct net_device *, int, u8); + u8 (*getpfcstate)(struct net_device *); + void (*setpfcstate)(struct net_device *, u8); + void (*getbcncfg)(struct net_device *, int, u32 *); + void (*setbcncfg)(struct net_device *, int, u32); + void (*getbcnrp)(struct net_device *, int, u8 *); + void (*setbcnrp)(struct net_device *, int, u8); + int (*setapp)(struct net_device *, u8, u16, u8); + int (*getapp)(struct net_device *, u8, u16); + u8 (*getfeatcfg)(struct net_device *, int, u8 *); + u8 (*setfeatcfg)(struct net_device *, int, u8); + u8 (*getdcbx)(struct net_device *); + u8 (*setdcbx)(struct net_device *, u8); + int (*peer_getappinfo)(struct net_device *, struct dcb_peer_app_info *, u16 *); + int (*peer_getapptable)(struct net_device *, struct dcb_app *); + int (*cee_peer_getpg)(struct net_device *, struct cee_pg *); + int (*cee_peer_getpfc)(struct net_device *, struct cee_pfc *); + int (*dcbnl_getbuffer)(struct net_device *, struct dcbnl_buffer *); + int (*dcbnl_setbuffer)(struct net_device *, struct dcbnl_buffer *); + int (*dcbnl_setapptrust)(struct net_device *, u8 *, int); + int (*dcbnl_getapptrust)(struct net_device *, u8 *, int *); +}; + +struct xdp_mem_info { + u32 type; + u32 id; +}; + +struct xdp_rxq_info { + struct net_device *dev; + u32 queue_index; + u32 reg_state; + struct xdp_mem_info mem; + unsigned int napi_id; + u32 frag_size; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_txq_info { + struct net_device *dev; +}; + +struct xdp_buff { + void *data; + void *data_end; + void *data_meta; + void *data_hard_start; + struct xdp_rxq_info *rxq; + struct xdp_txq_info *txq; + u32 frame_sz; + u32 flags; +}; + +struct xdp_frame { + void *data; + u16 len; + u16 headroom; + u32 metasize; + struct xdp_mem_info mem; + struct net_device *dev_rx; + u32 frame_sz; + u32 flags; +}; + +struct nlmsghdr { + __u32 nlmsg_len; + __u16 nlmsg_type; + __u16 nlmsg_flags; + __u32 nlmsg_seq; + __u32 nlmsg_pid; +}; + +struct nlattr { + __u16 nla_len; + __u16 nla_type; +}; + +struct nla_policy; + +struct netlink_ext_ack { + const char *_msg; + const struct nlattr *bad_attr; + const struct nla_policy *policy; + const struct nlattr *miss_nest; + u16 miss_type; + u8 cookie[20]; + u8 cookie_len; + char _msg_buf[80]; +}; + +struct netlink_range_validation; + +struct netlink_range_validation_signed; + +struct nla_policy { + u8 type; + u8 validation_type; + u16 len; + union { + u16 strict_start_type; + const u32 bitfield32_valid; + const u32 mask; + const char *reject_message; + const struct nla_policy *nested_policy; + struct netlink_range_validation *range; + struct netlink_range_validation_signed *range_signed; + struct { + s16 min; + s16 max; + }; + int (*validate)(const struct nlattr *, struct netlink_ext_ack *); + }; +}; + +struct netlink_callback { + struct sk_buff *skb; + const struct nlmsghdr *nlh; + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + void *data; + struct module *module; + struct netlink_ext_ack *extack; + u16 family; + u16 answer_flags; + u32 min_dump_alloc; + unsigned int prev_seq; + unsigned int seq; + bool strict_check; + union { + u8 ctx[48]; + long int args[6]; + }; +}; + +struct ndmsg { + __u8 ndm_family; + __u8 ndm_pad1; + __u16 ndm_pad2; + __s32 ndm_ifindex; + __u16 ndm_state; + __u8 ndm_flags; + __u8 ndm_type; +}; + +struct rtnl_link_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; + __u64 collisions; + __u64 rx_length_errors; + __u64 rx_over_errors; + __u64 rx_crc_errors; + __u64 rx_frame_errors; + __u64 rx_fifo_errors; + __u64 rx_missed_errors; + __u64 tx_aborted_errors; + __u64 tx_carrier_errors; + __u64 tx_fifo_errors; + __u64 tx_heartbeat_errors; + __u64 tx_window_errors; + __u64 rx_compressed; + __u64 tx_compressed; + __u64 rx_nohandler; + __u64 rx_otherhost_dropped; +}; + +struct rtnl_hw_stats64 { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 multicast; +}; + +struct ifla_vf_guid { + __u32 vf; + __u64 guid; +}; + +struct ifla_vf_stats { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 broadcast; + __u64 multicast; + __u64 rx_dropped; + __u64 tx_dropped; +}; + +struct ifla_vf_info { + __u32 vf; + __u8 mac[32]; + __u32 vlan; + __u32 qos; + __u32 spoofchk; + __u32 linkstate; + __u32 min_tx_rate; + __u32 max_tx_rate; + __u32 rss_query_en; + __u32 trusted; + __be16 vlan_proto; +}; + +enum netdev_tx { + __NETDEV_TX_MIN = -2147483648, + NETDEV_TX_OK = 0, + NETDEV_TX_BUSY = 16, +}; + +typedef enum netdev_tx netdev_tx_t; + +struct net_device_core_stats { + long unsigned int rx_dropped; + long unsigned int tx_dropped; + long unsigned int rx_nohandler; + long unsigned int rx_otherhost_dropped; +}; + +struct header_ops { + int (*create)(struct sk_buff *, struct net_device *, short unsigned int, const void *, const void *, unsigned int); + int (*parse)(const struct sk_buff *, unsigned char *); + int (*cache)(const struct neighbour *, struct hh_cache *, __be16); + void (*cache_update)(struct hh_cache *, const struct net_device *, const unsigned char *); + bool (*validate)(const char *, unsigned int); + __be16 (*parse_protocol)(const struct sk_buff *); +}; + +enum { + NAPI_STATE_SCHED = 0, + NAPI_STATE_MISSED = 1, + NAPI_STATE_DISABLE = 2, + NAPI_STATE_NPSVC = 3, + NAPI_STATE_LISTED = 4, + NAPI_STATE_NO_BUSY_POLL = 5, + NAPI_STATE_IN_BUSY_POLL = 6, + NAPI_STATE_PREFER_BUSY_POLL = 7, + NAPI_STATE_THREADED = 8, + NAPI_STATE_SCHED_THREADED = 9, +}; + +struct xsk_buff_pool; + +struct netdev_queue { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct Qdisc *qdisc; + struct Qdisc *qdisc_sleeping; + struct kobject kobj; + int numa_node; + long unsigned int tx_maxrate; + atomic_long_t trans_timeout; + struct net_device *sb_dev; + struct xsk_buff_pool *pool; + spinlock_t _xmit_lock; + int xmit_lock_owner; + long unsigned int trans_start; + long unsigned int state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct dql dql; +}; + +struct rps_map { + unsigned int len; + struct callback_head rcu; + u16 cpus[0]; +}; + +struct rps_dev_flow { + u16 cpu; + u16 filter; + unsigned int last_qtail; +}; + +struct rps_dev_flow_table { + unsigned int mask; + struct callback_head rcu; + struct rps_dev_flow flows[0]; +}; + +struct netdev_rx_queue { + struct xdp_rxq_info xdp_rxq; + struct rps_map *rps_map; + struct rps_dev_flow_table *rps_flow_table; + struct kobject kobj; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct xsk_buff_pool *pool; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum xps_map_type { + XPS_CPUS = 0, + XPS_RXQS = 1, + XPS_MAPS_MAX = 2, +}; + +struct xps_map { + unsigned int len; + unsigned int alloc_len; + struct callback_head rcu; + u16 queues[0]; +}; + +struct xps_dev_maps { + struct callback_head rcu; + unsigned int nr_ids; + s16 num_tc; + struct xps_map *attr_map[0]; +}; + +struct netdev_phys_item_id { + unsigned char id[32]; + unsigned char id_len; +}; + +enum net_device_path_type { + DEV_PATH_ETHERNET = 0, + DEV_PATH_VLAN = 1, + DEV_PATH_BRIDGE = 2, + DEV_PATH_PPPOE = 3, + DEV_PATH_DSA = 4, + DEV_PATH_MTK_WDMA = 5, +}; + +struct net_device_path { + enum net_device_path_type type; + const struct net_device *dev; + union { + struct { + u16 id; + __be16 proto; + u8 h_dest[6]; + } encap; + struct { + enum { + DEV_PATH_BR_VLAN_KEEP = 0, + DEV_PATH_BR_VLAN_TAG = 1, + DEV_PATH_BR_VLAN_UNTAG = 2, + DEV_PATH_BR_VLAN_UNTAG_HW = 3, + } vlan_mode; + u16 vlan_id; + __be16 vlan_proto; + } bridge; + struct { + int port; + u16 proto; + } dsa; + struct { + u8 wdma_idx; + u8 queue; + u16 wcid; + u8 bss; + } mtk_wdma; + }; +}; + +struct net_device_path_ctx { + const struct net_device *dev; + u8 daddr[6]; + int num_vlans; + struct { + u16 id; + __be16 proto; + } vlan[2]; +}; + +enum tc_setup_type { + TC_QUERY_CAPS = 0, + TC_SETUP_QDISC_MQPRIO = 1, + TC_SETUP_CLSU32 = 2, + TC_SETUP_CLSFLOWER = 3, + TC_SETUP_CLSMATCHALL = 4, + TC_SETUP_CLSBPF = 5, + TC_SETUP_BLOCK = 6, + TC_SETUP_QDISC_CBS = 7, + TC_SETUP_QDISC_RED = 8, + TC_SETUP_QDISC_PRIO = 9, + TC_SETUP_QDISC_MQ = 10, + TC_SETUP_QDISC_ETF = 11, + TC_SETUP_ROOT_QDISC = 12, + TC_SETUP_QDISC_GRED = 13, + TC_SETUP_QDISC_TAPRIO = 14, + TC_SETUP_FT = 15, + TC_SETUP_QDISC_ETS = 16, + TC_SETUP_QDISC_TBF = 17, + TC_SETUP_QDISC_FIFO = 18, + TC_SETUP_QDISC_HTB = 19, + TC_SETUP_ACT = 20, +}; + +enum bpf_netdev_command { + XDP_SETUP_PROG = 0, + XDP_SETUP_PROG_HW = 1, + BPF_OFFLOAD_MAP_ALLOC = 2, + BPF_OFFLOAD_MAP_FREE = 3, + XDP_SETUP_XSK_POOL = 4, +}; + +enum bpf_xdp_mode { + XDP_MODE_SKB = 0, + XDP_MODE_DRV = 1, + XDP_MODE_HW = 2, + __MAX_XDP_MODE = 3, +}; + +struct bpf_offloaded_map; + +struct netdev_bpf { + enum bpf_netdev_command command; + union { + struct { + u32 flags; + struct bpf_prog *prog; + struct netlink_ext_ack *extack; + }; + struct { + struct bpf_offloaded_map *offmap; + }; + struct { + struct xsk_buff_pool *pool; + u16 queue_id; + } xsk; + }; +}; + +struct dev_ifalias { + struct callback_head rcuhead; + char ifalias[0]; +}; + +struct ip_tunnel_parm; + +struct net_device_ops { + int (*ndo_init)(struct net_device *); + void (*ndo_uninit)(struct net_device *); + int (*ndo_open)(struct net_device *); + int (*ndo_stop)(struct net_device *); + netdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *); + netdev_features_t (*ndo_features_check)(struct sk_buff *, struct net_device *, netdev_features_t); + u16 (*ndo_select_queue)(struct net_device *, struct sk_buff *, struct net_device *); + void (*ndo_change_rx_flags)(struct net_device *, int); + void (*ndo_set_rx_mode)(struct net_device *); + int (*ndo_set_mac_address)(struct net_device *, void *); + int (*ndo_validate_addr)(struct net_device *); + int (*ndo_do_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_eth_ioctl)(struct net_device *, struct ifreq *, int); + int (*ndo_siocbond)(struct net_device *, struct ifreq *, int); + int (*ndo_siocwandev)(struct net_device *, struct if_settings *); + int (*ndo_siocdevprivate)(struct net_device *, struct ifreq *, void *, int); + int (*ndo_set_config)(struct net_device *, struct ifmap *); + int (*ndo_change_mtu)(struct net_device *, int); + int (*ndo_neigh_setup)(struct net_device *, struct neigh_parms *); + void (*ndo_tx_timeout)(struct net_device *, unsigned int); + void (*ndo_get_stats64)(struct net_device *, struct rtnl_link_stats64 *); + bool (*ndo_has_offload_stats)(const struct net_device *, int); + int (*ndo_get_offload_stats)(int, const struct net_device *, void *); + struct net_device_stats * (*ndo_get_stats)(struct net_device *); + int (*ndo_vlan_rx_add_vid)(struct net_device *, __be16, u16); + int (*ndo_vlan_rx_kill_vid)(struct net_device *, __be16, u16); + int (*ndo_set_vf_mac)(struct net_device *, int, u8 *); + int (*ndo_set_vf_vlan)(struct net_device *, int, u16, u8, __be16); + int (*ndo_set_vf_rate)(struct net_device *, int, int, int); + int (*ndo_set_vf_spoofchk)(struct net_device *, int, bool); + int (*ndo_set_vf_trust)(struct net_device *, int, bool); + int (*ndo_get_vf_config)(struct net_device *, int, struct ifla_vf_info *); + int (*ndo_set_vf_link_state)(struct net_device *, int, int); + int (*ndo_get_vf_stats)(struct net_device *, int, struct ifla_vf_stats *); + int (*ndo_set_vf_port)(struct net_device *, int, struct nlattr **); + int (*ndo_get_vf_port)(struct net_device *, int, struct sk_buff *); + int (*ndo_get_vf_guid)(struct net_device *, int, struct ifla_vf_guid *, struct ifla_vf_guid *); + int (*ndo_set_vf_guid)(struct net_device *, int, u64, int); + int (*ndo_set_vf_rss_query_en)(struct net_device *, int, bool); + int (*ndo_setup_tc)(struct net_device *, enum tc_setup_type, void *); + int (*ndo_rx_flow_steer)(struct net_device *, const struct sk_buff *, u16, u32); + int (*ndo_add_slave)(struct net_device *, struct net_device *, struct netlink_ext_ack *); + int (*ndo_del_slave)(struct net_device *, struct net_device *); + struct net_device * (*ndo_get_xmit_slave)(struct net_device *, struct sk_buff *, bool); + struct net_device * (*ndo_sk_get_lower_dev)(struct net_device *, struct sock *); + netdev_features_t (*ndo_fix_features)(struct net_device *, netdev_features_t); + int (*ndo_set_features)(struct net_device *, netdev_features_t); + int (*ndo_neigh_construct)(struct net_device *, struct neighbour *); + void (*ndo_neigh_destroy)(struct net_device *, struct neighbour *); + int (*ndo_fdb_add)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, u16, struct netlink_ext_ack *); + int (*ndo_fdb_del)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, struct netlink_ext_ack *); + int (*ndo_fdb_del_bulk)(struct ndmsg *, struct nlattr **, struct net_device *, u16, struct netlink_ext_ack *); + int (*ndo_fdb_dump)(struct sk_buff *, struct netlink_callback *, struct net_device *, struct net_device *, int *); + int (*ndo_fdb_get)(struct sk_buff *, struct nlattr **, struct net_device *, const unsigned char *, u16, u32, u32, struct netlink_ext_ack *); + int (*ndo_bridge_setlink)(struct net_device *, struct nlmsghdr *, u16, struct netlink_ext_ack *); + int (*ndo_bridge_getlink)(struct sk_buff *, u32, u32, struct net_device *, u32, int); + int (*ndo_bridge_dellink)(struct net_device *, struct nlmsghdr *, u16); + int (*ndo_change_carrier)(struct net_device *, bool); + int (*ndo_get_phys_port_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_port_parent_id)(struct net_device *, struct netdev_phys_item_id *); + int (*ndo_get_phys_port_name)(struct net_device *, char *, size_t); + void * (*ndo_dfwd_add_station)(struct net_device *, struct net_device *); + void (*ndo_dfwd_del_station)(struct net_device *, void *); + int (*ndo_set_tx_maxrate)(struct net_device *, int, u32); + int (*ndo_get_iflink)(const struct net_device *); + int (*ndo_fill_metadata_dst)(struct net_device *, struct sk_buff *); + void (*ndo_set_rx_headroom)(struct net_device *, int); + int (*ndo_bpf)(struct net_device *, struct netdev_bpf *); + int (*ndo_xdp_xmit)(struct net_device *, int, struct xdp_frame **, u32); + struct net_device * (*ndo_xdp_get_xmit_slave)(struct net_device *, struct xdp_buff *); + int (*ndo_xsk_wakeup)(struct net_device *, u32, u32); + int (*ndo_tunnel_ctl)(struct net_device *, struct ip_tunnel_parm *, int); + struct net_device * (*ndo_get_peer_dev)(struct net_device *); + int (*ndo_fill_forward_path)(struct net_device_path_ctx *, struct net_device_path *); + ktime_t (*ndo_get_tstamp)(struct net_device *, const struct skb_shared_hwtstamps *, bool); +}; + +struct pcpu_lstats { + u64_stats_t packets; + u64_stats_t bytes; + struct u64_stats_sync syncp; +}; + +struct pcpu_sw_netstats { + u64_stats_t rx_packets; + u64_stats_t rx_bytes; + u64_stats_t tx_packets; + u64_stats_t tx_bytes; + struct u64_stats_sync syncp; +}; + +enum ethtool_phys_id_state { + ETHTOOL_ID_INACTIVE = 0, + ETHTOOL_ID_ACTIVE = 1, + ETHTOOL_ID_ON = 2, + ETHTOOL_ID_OFF = 3, +}; + +struct ethtool_drvinfo; + +struct ethtool_regs; + +struct ethtool_wolinfo; + +struct ethtool_link_ext_state_info; + +struct ethtool_link_ext_stats; + +struct ethtool_eeprom; + +struct ethtool_coalesce; + +struct kernel_ethtool_coalesce; + +struct ethtool_ringparam; + +struct kernel_ethtool_ringparam; + +struct ethtool_pause_stats; + +struct ethtool_pauseparam; + +struct ethtool_test; + +struct ethtool_stats; + +struct ethtool_rxnfc; + +struct ethtool_flash; + +struct ethtool_channels; + +struct ethtool_dump; + +struct ethtool_ts_info; + +struct ethtool_modinfo; + +struct ethtool_eee; + +struct ethtool_tunable; + +struct ethtool_link_ksettings; + +struct ethtool_fec_stats; + +struct ethtool_fecparam; + +struct ethtool_module_eeprom; + +struct ethtool_eth_phy_stats; + +struct ethtool_eth_mac_stats; + +struct ethtool_eth_ctrl_stats; + +struct ethtool_rmon_stats; + +struct ethtool_rmon_hist_range; + +struct ethtool_module_power_mode_params; + +struct ethtool_ops { + u32 cap_link_lanes_supported: 1; + u32 supported_coalesce_params; + u32 supported_ring_params; + void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); + int (*get_regs_len)(struct net_device *); + void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); + void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); + int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); + u32 (*get_msglevel)(struct net_device *); + void (*set_msglevel)(struct net_device *, u32); + int (*nway_reset)(struct net_device *); + u32 (*get_link)(struct net_device *); + int (*get_link_ext_state)(struct net_device *, struct ethtool_link_ext_state_info *); + void (*get_link_ext_stats)(struct net_device *, struct ethtool_link_ext_stats *); + int (*get_eeprom_len)(struct net_device *); + int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *); + void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); + int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *); + void (*get_pause_stats)(struct net_device *, struct ethtool_pause_stats *); + void (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + int (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam *); + void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); + void (*get_strings)(struct net_device *, u32, u8 *); + int (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state); + void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*begin)(struct net_device *); + void (*complete)(struct net_device *); + u32 (*get_priv_flags)(struct net_device *); + int (*set_priv_flags)(struct net_device *, u32); + int (*get_sset_count)(struct net_device *, int); + int (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, u32 *); + int (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *); + int (*flash_device)(struct net_device *, struct ethtool_flash *); + int (*reset)(struct net_device *, u32 *); + u32 (*get_rxfh_key_size)(struct net_device *); + u32 (*get_rxfh_indir_size)(struct net_device *); + int (*get_rxfh)(struct net_device *, u32 *, u8 *, u8 *); + int (*set_rxfh)(struct net_device *, const u32 *, const u8 *, const u8); + int (*get_rxfh_context)(struct net_device *, u32 *, u8 *, u8 *, u32); + int (*set_rxfh_context)(struct net_device *, const u32 *, const u8 *, const u8, u32 *, bool); + void (*get_channels)(struct net_device *, struct ethtool_channels *); + int (*set_channels)(struct net_device *, struct ethtool_channels *); + int (*get_dump_flag)(struct net_device *, struct ethtool_dump *); + int (*get_dump_data)(struct net_device *, struct ethtool_dump *, void *); + int (*set_dump)(struct net_device *, struct ethtool_dump *); + int (*get_ts_info)(struct net_device *, struct ethtool_ts_info *); + int (*get_module_info)(struct net_device *, struct ethtool_modinfo *); + int (*get_module_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_eee)(struct net_device *, struct ethtool_eee *); + int (*set_eee)(struct net_device *, struct ethtool_eee *); + int (*get_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*set_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *); + int (*get_link_ksettings)(struct net_device *, struct ethtool_link_ksettings *); + int (*set_link_ksettings)(struct net_device *, const struct ethtool_link_ksettings *); + void (*get_fec_stats)(struct net_device *, struct ethtool_fec_stats *); + int (*get_fecparam)(struct net_device *, struct ethtool_fecparam *); + int (*set_fecparam)(struct net_device *, struct ethtool_fecparam *); + void (*get_ethtool_phy_stats)(struct net_device *, struct ethtool_stats *, u64 *); + int (*get_phy_tunable)(struct net_device *, const struct ethtool_tunable *, void *); + int (*set_phy_tunable)(struct net_device *, const struct ethtool_tunable *, const void *); + int (*get_module_eeprom_by_page)(struct net_device *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *); + void (*get_eth_phy_stats)(struct net_device *, struct ethtool_eth_phy_stats *); + void (*get_eth_mac_stats)(struct net_device *, struct ethtool_eth_mac_stats *); + void (*get_eth_ctrl_stats)(struct net_device *, struct ethtool_eth_ctrl_stats *); + void (*get_rmon_stats)(struct net_device *, struct ethtool_rmon_stats *, const struct ethtool_rmon_hist_range **); + int (*get_module_power_mode)(struct net_device *, struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); + int (*set_module_power_mode)(struct net_device *, const struct ethtool_module_power_mode_params *, struct netlink_ext_ack *); +}; + +struct flowi6; + +struct l3mdev_ops { + u32 (*l3mdev_fib_table)(const struct net_device *); + struct sk_buff * (*l3mdev_l3_rcv)(struct net_device *, struct sk_buff *, u16); + struct sk_buff * (*l3mdev_l3_out)(struct net_device *, struct sock *, struct sk_buff *, u16); + struct dst_entry * (*l3mdev_link_scope_lookup)(const struct net_device *, struct flowi6 *); +}; + +struct nd_opt_hdr; + +struct ndisc_options; + +struct prefix_info; + +struct ndisc_ops { + int (*is_useropt)(u8); + int (*parse_options)(const struct net_device *, struct nd_opt_hdr *, struct ndisc_options *); + void (*update)(const struct net_device *, struct neighbour *, u32, u8, const struct ndisc_options *); + int (*opt_addr_space)(const struct net_device *, u8, struct neighbour *, u8 *, u8 **); + void (*fill_addr_option)(const struct net_device *, struct sk_buff *, u8, const u8 *); + void (*prefix_rcv_add_addr)(struct net *, struct net_device *, const struct prefix_info *, struct inet6_dev *, struct in6_addr *, int, u32, bool, bool, __u32, u32, bool); +}; + +struct rtnl_link_ops { + struct list_head list; + const char *kind; + size_t priv_size; + struct net_device * (*alloc)(struct nlattr **, const char *, unsigned char, unsigned int, unsigned int); + void (*setup)(struct net_device *); + bool netns_refund; + unsigned int maxtype; + const struct nla_policy *policy; + int (*validate)(struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*newlink)(struct net *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + int (*changelink)(struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + void (*dellink)(struct net_device *, struct list_head *); + size_t (*get_size)(const struct net_device *); + int (*fill_info)(struct sk_buff *, const struct net_device *); + size_t (*get_xstats_size)(const struct net_device *); + int (*fill_xstats)(struct sk_buff *, const struct net_device *); + unsigned int (*get_num_tx_queues)(); + unsigned int (*get_num_rx_queues)(); + unsigned int slave_maxtype; + const struct nla_policy *slave_policy; + int (*slave_changelink)(struct net_device *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *); + size_t (*get_slave_size)(const struct net_device *, const struct net_device *); + int (*fill_slave_info)(struct sk_buff *, const struct net_device *, const struct net_device *); + struct net * (*get_link_net)(const struct net_device *); + size_t (*get_linkxstats_size)(const struct net_device *, int); + int (*fill_linkxstats)(struct sk_buff *, const struct net_device *, int *, int); +}; + +struct udp_tunnel_nic_table_info { + unsigned int n_entries; + unsigned int tunnel_types; +}; + +struct udp_tunnel_info; + +struct udp_tunnel_nic_shared; + +struct udp_tunnel_nic_info { + int (*set_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*unset_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + int (*sync_table)(struct net_device *, unsigned int); + struct udp_tunnel_nic_shared *shared; + unsigned int flags; + struct udp_tunnel_nic_table_info tables[4]; +}; + +enum { + NETIF_MSG_DRV_BIT = 0, + NETIF_MSG_PROBE_BIT = 1, + NETIF_MSG_LINK_BIT = 2, + NETIF_MSG_TIMER_BIT = 3, + NETIF_MSG_IFDOWN_BIT = 4, + NETIF_MSG_IFUP_BIT = 5, + NETIF_MSG_RX_ERR_BIT = 6, + NETIF_MSG_TX_ERR_BIT = 7, + NETIF_MSG_TX_QUEUED_BIT = 8, + NETIF_MSG_INTR_BIT = 9, + NETIF_MSG_TX_DONE_BIT = 10, + NETIF_MSG_RX_STATUS_BIT = 11, + NETIF_MSG_PKTDATA_BIT = 12, + NETIF_MSG_HW_BIT = 13, + NETIF_MSG_WOL_BIT = 14, + NETIF_MSG_CLASS_COUNT = 15, +}; + +struct netlink_range_validation { + u64 min; + u64 max; +}; + +struct netlink_range_validation_signed { + s64 min; + s64 max; +}; + +enum { + SKCIPHER_WALK_PHYS = 1, + SKCIPHER_WALK_SLOW = 2, + SKCIPHER_WALK_COPY = 4, + SKCIPHER_WALK_DIFF = 8, + SKCIPHER_WALK_SLEEP = 16, +}; + +struct skcipher_walk_buffer { + struct list_head entry; + struct scatter_walk dst; + unsigned int len; + u8 *data; + u8 buffer[0]; +}; + +typedef u8 uint8_t; + +typedef u16 uint16_t; + +enum xz_mode { + XZ_SINGLE = 0, + XZ_PREALLOC = 1, + XZ_DYNALLOC = 2, +}; + +enum xz_ret { + XZ_OK = 0, + XZ_STREAM_END = 1, + XZ_UNSUPPORTED_CHECK = 2, + XZ_MEM_ERROR = 3, + XZ_MEMLIMIT_ERROR = 4, + XZ_FORMAT_ERROR = 5, + XZ_OPTIONS_ERROR = 6, + XZ_DATA_ERROR = 7, + XZ_BUF_ERROR = 8, +}; + +struct xz_buf { + const uint8_t *in; + size_t in_pos; + size_t in_size; + uint8_t *out; + size_t out_pos; + size_t out_size; +}; + +enum lzma_state { + STATE_LIT_LIT = 0, + STATE_MATCH_LIT_LIT = 1, + STATE_REP_LIT_LIT = 2, + STATE_SHORTREP_LIT_LIT = 3, + STATE_MATCH_LIT = 4, + STATE_REP_LIT = 5, + STATE_SHORTREP_LIT = 6, + STATE_LIT_MATCH = 7, + STATE_LIT_LONGREP = 8, + STATE_LIT_SHORTREP = 9, + STATE_NONLIT_MATCH = 10, + STATE_NONLIT_REP = 11, +}; + +struct dictionary { + uint8_t *buf; + size_t start; + size_t pos; + size_t full; + size_t limit; + size_t end; + uint32_t size; + uint32_t size_max; + uint32_t allocated; + enum xz_mode mode; +}; + +struct rc_dec { + uint32_t range; + uint32_t code; + uint32_t init_bytes_left; + const uint8_t *in; + size_t in_pos; + size_t in_limit; +}; + +struct lzma_len_dec { + uint16_t choice; + uint16_t choice2; + uint16_t low[128]; + uint16_t mid[128]; + uint16_t high[256]; +}; + +struct lzma_dec { + uint32_t rep0; + uint32_t rep1; + uint32_t rep2; + uint32_t rep3; + enum lzma_state state; + uint32_t len; + uint32_t lc; + uint32_t literal_pos_mask; + uint32_t pos_mask; + uint16_t is_match[192]; + uint16_t is_rep[12]; + uint16_t is_rep0[12]; + uint16_t is_rep1[12]; + uint16_t is_rep2[12]; + uint16_t is_rep0_long[192]; + uint16_t dist_slot[256]; + uint16_t dist_special[114]; + uint16_t dist_align[16]; + struct lzma_len_dec match_len_dec; + struct lzma_len_dec rep_len_dec; + uint16_t literal[12288]; +}; + +enum lzma2_seq { + SEQ_CONTROL = 0, + SEQ_UNCOMPRESSED_1 = 1, + SEQ_UNCOMPRESSED_2 = 2, + SEQ_COMPRESSED_0 = 3, + SEQ_COMPRESSED_1 = 4, + SEQ_PROPERTIES = 5, + SEQ_LZMA_PREPARE = 6, + SEQ_LZMA_RUN = 7, + SEQ_COPY = 8, +}; + +struct lzma2_dec { + enum lzma2_seq sequence; + enum lzma2_seq next_sequence; + uint32_t uncompressed; + uint32_t compressed; + bool need_dict_reset; + bool need_props; +}; + +struct xz_dec_lzma2 { + struct rc_dec rc; + struct dictionary dict; + struct lzma2_dec lzma2; + struct lzma_dec lzma; + struct { + uint32_t size; + uint8_t buf[63]; + } temp; +}; + +typedef phys_addr_t resource_size_t; + +struct resource { + resource_size_t start; + resource_size_t end; + const char *name; + long unsigned int flags; + long unsigned int desc; + struct resource *parent; + struct resource *sibling; + struct resource *child; +}; + +struct pci_device_id { + __u32 vendor; + __u32 device; + __u32 subvendor; + __u32 subdevice; + __u32 class; + __u32 class_mask; + kernel_ulong_t driver_data; + __u32 override_only; +}; + +struct pci_bus; + +struct hotplug_slot; + +struct pci_slot { + struct pci_bus *bus; + struct list_head list; + struct hotplug_slot *hotplug; + unsigned char number; + struct kobject kobj; +}; + +typedef short unsigned int pci_bus_flags_t; + +struct pci_dev; + +struct pci_ops; + +struct pci_bus { + struct list_head node; + struct pci_bus *parent; + struct list_head children; + struct list_head devices; + struct pci_dev *self; + struct list_head slots; + struct resource *resource[4]; + struct list_head resources; + struct resource busn_res; + struct pci_ops *ops; + void *sysdata; + struct proc_dir_entry *procdir; + unsigned char number; + unsigned char primary; + unsigned char max_bus_speed; + unsigned char cur_bus_speed; + int domain_nr; + char name[48]; + short unsigned int bridge_ctl; + pci_bus_flags_t bus_flags; + struct device *bridge; + struct device dev; + struct bin_attribute *legacy_io; + struct bin_attribute *legacy_mem; + unsigned int is_added: 1; + unsigned int unsafe_warn: 1; +}; + +enum pci_mmap_state { + pci_mmap_io = 0, + pci_mmap_mem = 1, +}; + +enum { + PCI_STD_RESOURCES = 0, + PCI_STD_RESOURCE_END = 5, + PCI_ROM_RESOURCE = 6, + PCI_IOV_RESOURCES = 7, + PCI_IOV_RESOURCE_END = 12, + PCI_BRIDGE_RESOURCES = 13, + PCI_BRIDGE_RESOURCE_END = 16, + PCI_NUM_RESOURCES = 17, + DEVICE_COUNT_RESOURCE = 17, +}; + +typedef int pci_power_t; + +typedef unsigned int pci_channel_state_t; + +typedef unsigned int pcie_reset_state_t; + +typedef short unsigned int pci_dev_flags_t; + +struct pci_vpd { + struct mutex lock; + unsigned int len; + u8 cap; +}; + +struct rcec_ea; + +struct pci_driver; + +struct pcie_link_state; + +struct pci_sriov; + +struct pci_dev { + struct list_head bus_list; + struct pci_bus *bus; + struct pci_bus *subordinate; + void *sysdata; + struct proc_dir_entry *procent; + struct pci_slot *slot; + unsigned int devfn; + short unsigned int vendor; + short unsigned int device; + short unsigned int subsystem_vendor; + short unsigned int subsystem_device; + unsigned int class; + u8 revision; + u8 hdr_type; + struct rcec_ea *rcec_ea; + struct pci_dev *rcec; + u32 devcap; + u8 pcie_cap; + u8 msi_cap; + u8 msix_cap; + u8 pcie_mpss: 3; + u8 rom_base_reg; + u8 pin; + u16 pcie_flags_reg; + long unsigned int *dma_alias_mask; + struct pci_driver *driver; + u64 dma_mask; + struct device_dma_parameters dma_parms; + pci_power_t current_state; + unsigned int imm_ready: 1; + u8 pm_cap; + unsigned int pme_support: 5; + unsigned int pme_poll: 1; + unsigned int d1_support: 1; + unsigned int d2_support: 1; + unsigned int no_d1d2: 1; + unsigned int no_d3cold: 1; + unsigned int bridge_d3: 1; + unsigned int d3cold_allowed: 1; + unsigned int mmio_always_on: 1; + unsigned int wakeup_prepared: 1; + unsigned int skip_bus_pm: 1; + unsigned int ignore_hotplug: 1; + unsigned int hotplug_user_indicators: 1; + unsigned int clear_retrain_link: 1; + unsigned int d3hot_delay; + unsigned int d3cold_delay; + struct pcie_link_state *link_state; + unsigned int ltr_path: 1; + u16 l1ss; + unsigned int pasid_no_tlp: 1; + unsigned int eetlp_prefix_path: 1; + pci_channel_state_t error_state; + struct device dev; + int cfg_size; + unsigned int irq; + struct resource resource[17]; + struct resource driver_exclusive_resource; + bool match_driver; + unsigned int transparent: 1; + unsigned int io_window: 1; + unsigned int pref_window: 1; + unsigned int pref_64_window: 1; + unsigned int multifunction: 1; + unsigned int is_busmaster: 1; + unsigned int no_msi: 1; + unsigned int no_64bit_msi: 1; + unsigned int block_cfg_access: 1; + unsigned int broken_parity_status: 1; + unsigned int irq_reroute_variant: 2; + unsigned int msi_enabled: 1; + unsigned int msix_enabled: 1; + unsigned int ari_enabled: 1; + unsigned int ats_enabled: 1; + unsigned int pasid_enabled: 1; + unsigned int pri_enabled: 1; + unsigned int is_managed: 1; + unsigned int is_msi_managed: 1; + unsigned int needs_freset: 1; + unsigned int state_saved: 1; + unsigned int is_physfn: 1; + unsigned int is_virtfn: 1; + unsigned int is_hotplug_bridge: 1; + unsigned int shpc_managed: 1; + unsigned int is_thunderbolt: 1; + unsigned int untrusted: 1; + unsigned int external_facing: 1; + unsigned int broken_intx_masking: 1; + unsigned int io_window_1k: 1; + unsigned int irq_managed: 1; + unsigned int non_compliant_bars: 1; + unsigned int is_probed: 1; + unsigned int link_active_reporting: 1; + unsigned int no_vf_scan: 1; + unsigned int no_command_memory: 1; + unsigned int rom_bar_overlap: 1; + pci_dev_flags_t dev_flags; + atomic_t enable_cnt; + u32 saved_config_space[16]; + struct hlist_head saved_cap_space; + int rom_attr_enabled; + struct bin_attribute *res_attr[17]; + struct bin_attribute *res_attr_wc[17]; + void *msix_base; + raw_spinlock_t msi_lock; + struct pci_vpd vpd; + union { + struct pci_sriov *sriov; + struct pci_dev *physfn; + }; + u16 ats_cap; + u8 ats_stu; + u16 acs_cap; + phys_addr_t rom; + size_t romlen; + const char *driver_override; + long unsigned int priv_flags; + u8 reset_methods[7]; +}; + +struct pci_dynids { + spinlock_t lock; + struct list_head list; +}; + +struct pci_error_handlers; + +struct pci_driver { + struct list_head node; + const char *name; + const struct pci_device_id *id_table; + int (*probe)(struct pci_dev *, const struct pci_device_id *); + void (*remove)(struct pci_dev *); + int (*suspend)(struct pci_dev *, pm_message_t); + int (*resume)(struct pci_dev *); + void (*shutdown)(struct pci_dev *); + int (*sriov_configure)(struct pci_dev *, int); + int (*sriov_set_msix_vec_count)(struct pci_dev *, int); + u32 (*sriov_get_vf_total_msix)(struct pci_dev *); + const struct pci_error_handlers *err_handler; + const struct attribute_group **groups; + const struct attribute_group **dev_groups; + struct device_driver driver; + struct pci_dynids dynids; + bool driver_managed_dma; +}; + +struct pci_ops { + int (*add_bus)(struct pci_bus *); + void (*remove_bus)(struct pci_bus *); + void * (*map_bus)(struct pci_bus *, unsigned int, int); + int (*read)(struct pci_bus *, unsigned int, int, int, u32 *); + int (*write)(struct pci_bus *, unsigned int, int, int, u32); +}; + +typedef unsigned int pci_ers_result_t; + +struct pci_error_handlers { + pci_ers_result_t (*error_detected)(struct pci_dev *, pci_channel_state_t); + pci_ers_result_t (*mmio_enabled)(struct pci_dev *); + pci_ers_result_t (*slot_reset)(struct pci_dev *); + void (*reset_prepare)(struct pci_dev *); + void (*reset_done)(struct pci_dev *); + void (*resume)(struct pci_dev *); + void (*cor_error_detected)(struct pci_dev *); +}; + +typedef long unsigned int irq_hw_number_t; + +enum irq_domain_bus_token { + DOMAIN_BUS_ANY = 0, + DOMAIN_BUS_WIRED = 1, + DOMAIN_BUS_GENERIC_MSI = 2, + DOMAIN_BUS_PCI_MSI = 3, + DOMAIN_BUS_PLATFORM_MSI = 4, + DOMAIN_BUS_NEXUS = 5, + DOMAIN_BUS_IPI = 6, + DOMAIN_BUS_FSL_MC_MSI = 7, + DOMAIN_BUS_TI_SCI_INTA_MSI = 8, + DOMAIN_BUS_WAKEUP = 9, + DOMAIN_BUS_VMD_MSI = 10, + DOMAIN_BUS_PCI_DEVICE_MSI = 11, + DOMAIN_BUS_PCI_DEVICE_MSIX = 12, + DOMAIN_BUS_DMAR = 13, + DOMAIN_BUS_AMDVI = 14, + DOMAIN_BUS_PCI_DEVICE_IMS = 15, +}; + +struct irq_desc; + +typedef void (*irq_flow_handler_t)(struct irq_desc *); + +typedef struct cpumask cpumask_var_t[1]; + +struct msi_desc; + +struct irq_common_data { + unsigned int state_use_accessors; + unsigned int node; + void *handler_data; + struct msi_desc *msi_desc; + cpumask_var_t affinity; + cpumask_var_t effective_affinity; + unsigned int ipi_offset; +}; + +struct irq_chip; + +struct irq_data { + u32 mask; + unsigned int irq; + long unsigned int hwirq; + struct irq_common_data *common; + struct irq_chip *chip; + struct irq_domain *domain; + struct irq_data *parent_data; + void *chip_data; +}; + +struct irqaction; + +struct irq_affinity_notify; + +struct irq_desc { + struct irq_common_data irq_common_data; + struct irq_data irq_data; + unsigned int *kstat_irqs; + irq_flow_handler_t handle_irq; + struct irqaction *action; + unsigned int status_use_accessors; + unsigned int core_internal_state__do_not_mess_with_it; + unsigned int depth; + unsigned int wake_depth; + unsigned int tot_count; + unsigned int irq_count; + long unsigned int last_unhandled; + unsigned int irqs_unhandled; + atomic_t threads_handled; + int threads_handled_last; + raw_spinlock_t lock; + struct cpumask *percpu_enabled; + const struct cpumask *percpu_affinity; + const struct cpumask *affinity_hint; + struct irq_affinity_notify *affinity_notify; + long unsigned int threads_oneshot; + atomic_t threads_active; + wait_queue_head_t wait_for_threads; + unsigned int nr_actions; + unsigned int no_suspend_depth; + unsigned int cond_suspend_depth; + unsigned int force_resume_depth; + struct proc_dir_entry *dir; + struct callback_head rcu; + struct kobject kobj; + struct mutex request_mutex; + int parent_irq; + struct module *owner; + const char *name; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef struct { + __u8 b[16]; +} guid_t; + +enum dev_prop_type { + DEV_PROP_U8 = 0, + DEV_PROP_U16 = 1, + DEV_PROP_U32 = 2, + DEV_PROP_U64 = 3, + DEV_PROP_STRING = 4, + DEV_PROP_REF = 5, +}; + +typedef u32 phandle; + +struct property { + char *name; + int length; + void *value; + struct property *next; + struct bin_attribute attr; +}; + +struct device_node { + const char *name; + phandle phandle; + const char *full_name; + struct fwnode_handle fwnode; + struct property *properties; + struct property *deadprops; + struct device_node *parent; + struct device_node *child; + struct device_node *sibling; + struct kobject kobj; + long unsigned int _flags; + void *data; +}; + +struct irq_fwspec { + struct fwnode_handle *fwnode; + int param_count; + u32 param[16]; +}; + +struct irq_domain_ops { + int (*match)(struct irq_domain *, struct device_node *, enum irq_domain_bus_token); + int (*select)(struct irq_domain *, struct irq_fwspec *, enum irq_domain_bus_token); + int (*map)(struct irq_domain *, unsigned int, irq_hw_number_t); + void (*unmap)(struct irq_domain *, unsigned int); + int (*xlate)(struct irq_domain *, struct device_node *, const u32 *, unsigned int, long unsigned int *, unsigned int *); + int (*alloc)(struct irq_domain *, unsigned int, unsigned int, void *); + void (*free)(struct irq_domain *, unsigned int, unsigned int); + int (*activate)(struct irq_domain *, struct irq_data *, bool); + void (*deactivate)(struct irq_domain *, struct irq_data *); + int (*translate)(struct irq_domain *, struct irq_fwspec *, long unsigned int *, unsigned int *); +}; + +struct irq_domain_chip_generic; + +struct msi_parent_ops; + +struct irq_domain { + struct list_head link; + const char *name; + const struct irq_domain_ops *ops; + void *host_data; + unsigned int flags; + unsigned int mapcount; + struct fwnode_handle *fwnode; + enum irq_domain_bus_token bus_token; + struct irq_domain_chip_generic *gc; + struct device *dev; + struct device *pm_dev; + struct irq_domain *parent; + const struct msi_parent_ops *msi_parent_ops; + irq_hw_number_t hwirq_max; + unsigned int revmap_size; + struct xarray revmap_tree; + struct mutex revmap_mutex; + struct irq_data *revmap[0]; +}; + +enum irq_gc_flags { + IRQ_GC_INIT_MASK_CACHE = 1, + IRQ_GC_INIT_NESTED_LOCK = 2, + IRQ_GC_MASK_CACHE_PER_TYPE = 4, + IRQ_GC_NO_MASK = 8, + IRQ_GC_BE_IO = 16, +}; + +struct irq_chip_generic; + +struct irq_domain_chip_generic { + unsigned int irqs_per_chip; + unsigned int num_chips; + unsigned int irq_flags_to_clear; + unsigned int irq_flags_to_set; + enum irq_gc_flags gc_flags; + struct irq_chip_generic *gc[0]; +}; + +struct msi_domain_info; + +struct msi_parent_ops { + u32 supported_flags; + const char *prefix; + bool (*init_dev_msi_info)(struct device *, struct irq_domain *, struct irq_domain *, struct msi_domain_info *); +}; + +struct cdev { + struct kobject kobj; + struct module *owner; + const struct file_operations *ops; + struct list_head list; + dev_t dev; + unsigned int count; +}; + +typedef u64 acpi_size; + +typedef u64 acpi_io_address; + +typedef u32 acpi_status; + +typedef char *acpi_string; + +typedef void *acpi_handle; + +typedef u32 acpi_object_type; + +union acpi_object { + acpi_object_type type; + struct { + acpi_object_type type; + u64 value; + } integer; + struct { + acpi_object_type type; + u32 length; + char *pointer; + } string; + struct { + acpi_object_type type; + u32 length; + u8 *pointer; + } buffer; + struct { + acpi_object_type type; + u32 count; + union acpi_object *elements; + } package; + struct { + acpi_object_type type; + acpi_object_type actual_type; + acpi_handle handle; + } reference; + struct { + acpi_object_type type; + u32 proc_id; + acpi_io_address pblk_address; + u32 pblk_length; + } processor; + struct { + acpi_object_type type; + u32 system_level; + u32 resource_order; + } power_resource; +}; + +struct acpi_object_list { + u32 count; + union acpi_object *pointer; +}; + +struct acpi_buffer { + acpi_size length; + void *pointer; +}; + +typedef void (*acpi_object_handler)(acpi_handle, void *); + +struct acpi_device; + +struct acpi_hotplug_profile { + struct kobject kobj; + int (*scan_dependent)(struct acpi_device *); + void (*notify_online)(struct acpi_device *); + bool enabled: 1; + bool demand_offline: 1; +}; + +struct acpi_device_status { + u32 present: 1; + u32 enabled: 1; + u32 show_in_ui: 1; + u32 functional: 1; + u32 battery_present: 1; + u32 reserved: 27; +}; + +struct acpi_device_flags { + u32 dynamic_status: 1; + u32 removable: 1; + u32 ejectable: 1; + u32 power_manageable: 1; + u32 match_driver: 1; + u32 initialized: 1; + u32 visited: 1; + u32 hotplug_notify: 1; + u32 is_dock_station: 1; + u32 of_compatible_ok: 1; + u32 coherent_dma: 1; + u32 cca_seen: 1; + u32 enumeration_by_parent: 1; + u32 honor_deps: 1; + u32 reserved: 18; +}; + +typedef char acpi_bus_id[8]; + +struct acpi_pnp_type { + u32 hardware_id: 1; + u32 bus_address: 1; + u32 platform_id: 1; + u32 reserved: 29; +}; + +typedef u64 acpi_bus_address; + +typedef char acpi_device_name[40]; + +typedef char acpi_device_class[20]; + +struct acpi_device_pnp { + acpi_bus_id bus_id; + int instance_no; + struct acpi_pnp_type type; + acpi_bus_address bus_address; + char *unique_id; + struct list_head ids; + acpi_device_name device_name; + acpi_device_class device_class; + union acpi_object *str_obj; +}; + +struct acpi_device_power_flags { + u32 explicit_get: 1; + u32 power_resources: 1; + u32 inrush_current: 1; + u32 power_removed: 1; + u32 ignore_parent: 1; + u32 dsw_present: 1; + u32 reserved: 26; +}; + +struct acpi_device_power_state { + struct { + u8 valid: 1; + u8 explicit_set: 1; + u8 reserved: 6; + } flags; + int power; + int latency; + struct list_head resources; +}; + +struct acpi_device_power { + int state; + struct acpi_device_power_flags flags; + struct acpi_device_power_state states[5]; + u8 state_for_enumeration; +}; + +struct acpi_device_wakeup_flags { + u8 valid: 1; + u8 notifier_present: 1; +}; + +struct acpi_device_wakeup_context { + void (*func)(struct acpi_device_wakeup_context *); + struct device *dev; +}; + +struct acpi_device_wakeup { + acpi_handle gpe_device; + u64 gpe_number; + u64 sleep_state; + struct list_head resources; + struct acpi_device_wakeup_flags flags; + struct acpi_device_wakeup_context context; + struct wakeup_source *ws; + int prepare_count; + int enable_count; +}; + +struct acpi_device_perf_flags { + u8 reserved: 8; +}; + +struct acpi_device_perf_state; + +struct acpi_device_perf { + int state; + struct acpi_device_perf_flags flags; + int state_count; + struct acpi_device_perf_state *states; +}; + +struct acpi_device_dir { + struct proc_dir_entry *entry; +}; + +struct acpi_device_data { + const union acpi_object *pointer; + struct list_head properties; + const union acpi_object *of_compatible; + struct list_head subnodes; +}; + +struct acpi_scan_handler; + +struct acpi_hotplug_context; + +struct acpi_gpio_mapping; + +struct acpi_device { + u32 pld_crc; + int device_type; + acpi_handle handle; + struct fwnode_handle fwnode; + struct list_head wakeup_list; + struct list_head del_list; + struct acpi_device_status status; + struct acpi_device_flags flags; + struct acpi_device_pnp pnp; + struct acpi_device_power power; + struct acpi_device_wakeup wakeup; + struct acpi_device_perf performance; + struct acpi_device_dir dir; + struct acpi_device_data data; + struct acpi_scan_handler *handler; + struct acpi_hotplug_context *hp; + const struct acpi_gpio_mapping *driver_gpios; + void *driver_data; + struct device dev; + unsigned int physical_node_count; + unsigned int dep_unmet; + struct list_head physical_node_list; + struct mutex physical_node_lock; + void (*remove)(struct acpi_device *); +}; + +struct acpi_scan_handler { + const struct acpi_device_id *ids; + struct list_head list_node; + bool (*match)(const char *, const struct acpi_device_id **); + int (*attach)(struct acpi_device *, const struct acpi_device_id *); + void (*detach)(struct acpi_device *); + void (*bind)(struct device *); + void (*unbind)(struct device *); + struct acpi_hotplug_profile hotplug; +}; + +struct acpi_hotplug_context { + struct acpi_device *self; + int (*notify)(struct acpi_device *, u32); + void (*uevent)(struct acpi_device *, u32); + void (*fixup)(struct acpi_device *); +}; + +struct acpi_hardware_id { + struct list_head list; + const char *id; +}; + +struct acpi_device_perf_state { + struct { + u8 valid: 1; + u8 reserved: 7; + } flags; + u8 power; + u8 performance; + int latency; +}; + +struct acpi_device_properties { + const guid_t *guid; + union acpi_object *properties; + struct list_head list; + void **bufs; +}; + +struct acpi_gpio_params; + +struct acpi_gpio_mapping { + const char *name; + const struct acpi_gpio_params *data; + unsigned int size; + unsigned int quirks; +}; + +struct acpi_data_node { + const char *name; + acpi_handle handle; + struct fwnode_handle fwnode; + struct fwnode_handle *parent; + struct acpi_device_data data; + struct list_head sibling; + struct kobject kobj; + struct completion kobj_done; +}; + +enum irqreturn { + IRQ_NONE = 0, + IRQ_HANDLED = 1, + IRQ_WAKE_THREAD = 2, +}; + +typedef enum irqreturn irqreturn_t; + +enum irqchip_irq_state { + IRQCHIP_STATE_PENDING = 0, + IRQCHIP_STATE_ACTIVE = 1, + IRQCHIP_STATE_MASKED = 2, + IRQCHIP_STATE_LINE_LEVEL = 3, +}; + +struct msi_msg; + +struct irq_chip { + const char *name; + unsigned int (*irq_startup)(struct irq_data *); + void (*irq_shutdown)(struct irq_data *); + void (*irq_enable)(struct irq_data *); + void (*irq_disable)(struct irq_data *); + void (*irq_ack)(struct irq_data *); + void (*irq_mask)(struct irq_data *); + void (*irq_mask_ack)(struct irq_data *); + void (*irq_unmask)(struct irq_data *); + void (*irq_eoi)(struct irq_data *); + int (*irq_set_affinity)(struct irq_data *, const struct cpumask *, bool); + int (*irq_retrigger)(struct irq_data *); + int (*irq_set_type)(struct irq_data *, unsigned int); + int (*irq_set_wake)(struct irq_data *, unsigned int); + void (*irq_bus_lock)(struct irq_data *); + void (*irq_bus_sync_unlock)(struct irq_data *); + void (*irq_suspend)(struct irq_data *); + void (*irq_resume)(struct irq_data *); + void (*irq_pm_shutdown)(struct irq_data *); + void (*irq_calc_mask)(struct irq_data *); + void (*irq_print_chip)(struct irq_data *, struct seq_file *); + int (*irq_request_resources)(struct irq_data *); + void (*irq_release_resources)(struct irq_data *); + void (*irq_compose_msi_msg)(struct irq_data *, struct msi_msg *); + void (*irq_write_msi_msg)(struct irq_data *, struct msi_msg *); + int (*irq_get_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool *); + int (*irq_set_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool); + int (*irq_set_vcpu_affinity)(struct irq_data *, void *); + void (*ipi_send_single)(struct irq_data *, unsigned int); + void (*ipi_send_mask)(struct irq_data *, const struct cpumask *); + int (*irq_nmi_setup)(struct irq_data *); + void (*irq_nmi_teardown)(struct irq_data *); + long unsigned int flags; +}; + +typedef irqreturn_t (*irq_handler_t)(int, void *); + +struct irqaction { + irq_handler_t handler; + void *dev_id; + void *percpu_dev_id; + struct irqaction *next; + irq_handler_t thread_fn; + struct task_struct *thread; + struct irqaction *secondary; + unsigned int irq; + unsigned int flags; + long unsigned int thread_flags; + long unsigned int thread_mask; + const char *name; + struct proc_dir_entry *dir; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct irq_affinity_notify { + unsigned int irq; + struct kref kref; + struct work_struct work; + void (*notify)(struct irq_affinity_notify *, const cpumask_t *); + void (*release)(struct kref *); +}; + +struct irq_chip_regs { + long unsigned int enable; + long unsigned int disable; + long unsigned int mask; + long unsigned int ack; + long unsigned int eoi; + long unsigned int type; + long unsigned int polarity; +}; + +struct irq_chip_type { + struct irq_chip chip; + struct irq_chip_regs regs; + irq_flow_handler_t handler; + u32 type; + u32 mask_cache_priv; + u32 *mask_cache; +}; + +struct irq_chip_generic { + raw_spinlock_t lock; + void *reg_base; + u32 (*reg_readl)(void *); + void (*reg_writel)(u32, void *); + void (*suspend)(struct irq_chip_generic *); + void (*resume)(struct irq_chip_generic *); + unsigned int irq_base; + unsigned int irq_cnt; + u32 mask_cache; + u32 type_cache; + u32 polarity_cache; + u32 wake_enabled; + u32 wake_active; + unsigned int num_ct; + void *private; + long unsigned int installed; + long unsigned int unused; + struct irq_domain *domain; + struct list_head list; + struct irq_chip_type chip_types[0]; +}; + +struct acpi_gpio_params { + unsigned int crs_entry_index; + unsigned int line_index; + bool active_low; +}; + +typedef u64 acpi_physical_address; + +typedef u16 acpi_owner_id; + +typedef u32 (*acpi_gpe_handler)(acpi_handle, u32, void *); + +typedef void (*acpi_notify_handler)(acpi_handle, u32, void *); + +typedef acpi_status (*acpi_adr_space_handler)(u32, acpi_physical_address, u32, u64 *, void *, void *); + +typedef acpi_status (*acpi_adr_space_setup)(acpi_handle, u32, void *, void **); + +union acpi_name_union { + u32 integer; + char ascii[4]; +}; + +struct acpi_signal_fatal_info { + u32 type; + u32 code; + u32 argument; +}; + +union acpi_operand_object; + +struct acpi_namespace_node { + union acpi_operand_object *object; + u8 descriptor_type; + u8 type; + u16 flags; + union acpi_name_union name; + struct acpi_namespace_node *parent; + struct acpi_namespace_node *child; + struct acpi_namespace_node *peer; + acpi_owner_id owner_id; +}; + +struct acpi_object_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; +}; + +struct acpi_object_integer { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 fill[3]; + u64 value; +}; + +struct acpi_object_string { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + char *pointer; + u32 length; +}; + +struct acpi_object_buffer { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 *pointer; + u32 length; + u32 aml_length; + u8 *aml_start; + struct acpi_namespace_node *node; +}; + +struct acpi_object_package { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *node; + union acpi_operand_object **elements; + u8 *aml_start; + u32 aml_length; + u32 count; +}; + +struct acpi_object_event { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + void *os_semaphore; +}; + +struct acpi_walk_state; + +typedef acpi_status (*acpi_internal_method)(struct acpi_walk_state *); + +struct acpi_object_method { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 info_flags; + u8 param_count; + u8 sync_level; + union acpi_operand_object *mutex; + union acpi_operand_object *node; + u8 *aml_start; + union { + acpi_internal_method implementation; + union acpi_operand_object *handler; + } dispatch; + u32 aml_length; + acpi_owner_id owner_id; + u8 thread_count; +}; + +struct acpi_thread_state; + +struct acpi_object_mutex { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 sync_level; + u16 acquisition_depth; + void *os_mutex; + u64 thread_id; + struct acpi_thread_state *owner_thread; + union acpi_operand_object *prev; + union acpi_operand_object *next; + struct acpi_namespace_node *node; + u8 original_sync_level; +}; + +struct acpi_object_region { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 space_id; + struct acpi_namespace_node *node; + union acpi_operand_object *handler; + union acpi_operand_object *next; + acpi_physical_address address; + u32 length; + void *pointer; +}; + +struct acpi_object_notify_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; +}; + +struct acpi_gpe_block_info; + +struct acpi_object_device { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + struct acpi_gpe_block_info *gpe_block; +}; + +struct acpi_object_power_resource { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + u32 system_level; + u32 resource_order; +}; + +struct acpi_object_processor { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 proc_id; + u8 length; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; + acpi_io_address address; +}; + +struct acpi_object_thermal_zone { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *notify_list[2]; + union acpi_operand_object *handler; +}; + +struct acpi_object_field_common { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *region_obj; +}; + +struct acpi_object_region_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + u16 resource_length; + union acpi_operand_object *region_obj; + u8 *resource_buffer; + u16 pin_number_index; + u8 *internal_pcc_buffer; +}; + +struct acpi_object_buffer_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + u8 is_create_field; + union acpi_operand_object *buffer_obj; +}; + +struct acpi_object_bank_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *region_obj; + union acpi_operand_object *bank_obj; +}; + +struct acpi_object_index_field { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 field_flags; + u8 attribute; + u8 access_byte_width; + struct acpi_namespace_node *node; + u32 bit_length; + u32 base_byte_offset; + u32 value; + u8 start_field_bit_offset; + u8 access_length; + union acpi_operand_object *index_obj; + union acpi_operand_object *data_obj; +}; + +struct acpi_object_notify_handler { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *node; + u32 handler_type; + acpi_notify_handler handler; + void *context; + union acpi_operand_object *next[2]; +}; + +struct acpi_object_addr_handler { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 space_id; + u8 handler_flags; + acpi_adr_space_handler handler; + struct acpi_namespace_node *node; + void *context; + void *context_mutex; + acpi_adr_space_setup setup; + union acpi_operand_object *region_list; + union acpi_operand_object *next; +}; + +struct acpi_object_reference { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + u8 class; + u8 target_type; + u8 resolved; + void *object; + struct acpi_namespace_node *node; + union acpi_operand_object **where; + u8 *index_pointer; + u8 *aml; + u32 value; +}; + +struct acpi_object_extra { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + struct acpi_namespace_node *method_REG; + struct acpi_namespace_node *scope_node; + void *region_context; + u8 *aml_start; + u32 aml_length; +}; + +struct acpi_object_data { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + acpi_object_handler handler; + void *pointer; +}; + +struct acpi_object_cache_list { + union acpi_operand_object *next_object; + u8 descriptor_type; + u8 type; + u16 reference_count; + u8 flags; + union acpi_operand_object *next; +}; + +union acpi_operand_object { + struct acpi_object_common common; + struct acpi_object_integer integer; + struct acpi_object_string string; + struct acpi_object_buffer buffer; + struct acpi_object_package package; + struct acpi_object_event event; + struct acpi_object_method method; + struct acpi_object_mutex mutex; + struct acpi_object_region region; + struct acpi_object_notify_common common_notify; + struct acpi_object_device device; + struct acpi_object_power_resource power_resource; + struct acpi_object_processor processor; + struct acpi_object_thermal_zone thermal_zone; + struct acpi_object_field_common common_field; + struct acpi_object_region_field field; + struct acpi_object_buffer_field buffer_field; + struct acpi_object_bank_field bank_field; + struct acpi_object_index_field index_field; + struct acpi_object_notify_handler notify; + struct acpi_object_addr_handler address_space; + struct acpi_object_reference reference; + struct acpi_object_extra extra; + struct acpi_object_data data; + struct acpi_object_cache_list cache; + struct acpi_namespace_node node; +}; + +union acpi_parse_object; + +union acpi_generic_state; + +struct acpi_parse_state { + u8 *aml_start; + u8 *aml; + u8 *aml_end; + u8 *pkg_start; + u8 *pkg_end; + union acpi_parse_object *start_op; + struct acpi_namespace_node *start_node; + union acpi_generic_state *scope; + union acpi_parse_object *start_scope; + u32 aml_size; +}; + +typedef acpi_status (*acpi_parse_downwards)(struct acpi_walk_state *, union acpi_parse_object **); + +typedef acpi_status (*acpi_parse_upwards)(struct acpi_walk_state *); + +struct acpi_opcode_info; + +struct acpi_walk_state { + struct acpi_walk_state *next; + u8 descriptor_type; + u8 walk_type; + u16 opcode; + u8 next_op_info; + u8 num_operands; + u8 operand_index; + acpi_owner_id owner_id; + u8 last_predicate; + u8 current_result; + u8 return_used; + u8 scope_depth; + u8 pass_number; + u8 namespace_override; + u8 result_size; + u8 result_count; + u8 *aml; + u32 arg_types; + u32 method_breakpoint; + u32 user_breakpoint; + u32 parse_flags; + struct acpi_parse_state parser_state; + u32 prev_arg_types; + u32 arg_count; + u16 method_nesting_depth; + u8 method_is_nested; + struct acpi_namespace_node arguments[7]; + struct acpi_namespace_node local_variables[8]; + union acpi_operand_object *operands[9]; + union acpi_operand_object **params; + u8 *aml_last_while; + union acpi_operand_object **caller_return_desc; + union acpi_generic_state *control_state; + struct acpi_namespace_node *deferred_node; + union acpi_operand_object *implicit_return_obj; + struct acpi_namespace_node *method_call_node; + union acpi_parse_object *method_call_op; + union acpi_operand_object *method_desc; + struct acpi_namespace_node *method_node; + char *method_pathname; + union acpi_parse_object *op; + const struct acpi_opcode_info *op_info; + union acpi_parse_object *origin; + union acpi_operand_object *result_obj; + union acpi_generic_state *results; + union acpi_operand_object *return_desc; + union acpi_generic_state *scope_info; + union acpi_parse_object *prev_op; + union acpi_parse_object *next_op; + struct acpi_thread_state *thread; + acpi_parse_downwards descending_callback; + acpi_parse_upwards ascending_callback; +}; + +struct acpi_gpe_handler_info { + acpi_gpe_handler address; + void *context; + struct acpi_namespace_node *method_node; + u8 original_flags; + u8 originally_enabled; +}; + +struct acpi_gpe_notify_info { + struct acpi_namespace_node *device_node; + struct acpi_gpe_notify_info *next; +}; + +union acpi_gpe_dispatch_info { + struct acpi_namespace_node *method_node; + struct acpi_gpe_handler_info *handler; + struct acpi_gpe_notify_info *notify_list; +}; + +struct acpi_gpe_register_info; + +struct acpi_gpe_event_info { + union acpi_gpe_dispatch_info dispatch; + struct acpi_gpe_register_info *register_info; + u8 flags; + u8 gpe_number; + u8 runtime_count; + u8 disable_for_dispatch; +}; + +struct acpi_gpe_address { + u8 space_id; + u64 address; +}; + +struct acpi_gpe_register_info { + struct acpi_gpe_address status_address; + struct acpi_gpe_address enable_address; + u16 base_gpe_number; + u8 enable_for_wake; + u8 enable_for_run; + u8 mask_for_run; + u8 enable_mask; +}; + +struct acpi_gpe_xrupt_info; + +struct acpi_gpe_block_info { + struct acpi_namespace_node *node; + struct acpi_gpe_block_info *previous; + struct acpi_gpe_block_info *next; + struct acpi_gpe_xrupt_info *xrupt_block; + struct acpi_gpe_register_info *register_info; + struct acpi_gpe_event_info *event_info; + u64 address; + u32 register_count; + u16 gpe_count; + u16 block_base_number; + u8 space_id; + u8 initialized; +}; + +struct acpi_gpe_xrupt_info { + struct acpi_gpe_xrupt_info *previous; + struct acpi_gpe_xrupt_info *next; + struct acpi_gpe_block_info *gpe_block_list_head; + u32 interrupt_number; +}; + +struct acpi_common_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; +}; + +struct acpi_update_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + union acpi_operand_object *object; +}; + +struct acpi_pkg_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u32 index; + union acpi_operand_object *source_object; + union acpi_operand_object *dest_object; + struct acpi_walk_state *walk_state; + void *this_target_obj; + u32 num_packages; +}; + +struct acpi_control_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u16 opcode; + union acpi_parse_object *predicate_op; + u8 *aml_predicate_start; + u8 *package_end; + u64 loop_timeout; +}; + +union acpi_parse_value { + u64 integer; + u32 size; + char *string; + u8 *buffer; + char *name; + union acpi_parse_object *arg; +}; + +struct acpi_parse_obj_common { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; +}; + +struct acpi_parse_obj_named { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; + char *path; + u8 *data; + u32 length; + u32 name; +}; + +struct acpi_parse_obj_asl { + union acpi_parse_object *parent; + u8 descriptor_type; + u8 flags; + u16 aml_opcode; + u8 *aml; + union acpi_parse_object *next; + struct acpi_namespace_node *node; + union acpi_parse_value value; + u8 arg_list_length; + union acpi_parse_object *child; + union acpi_parse_object *parent_method; + char *filename; + u8 file_changed; + char *parent_filename; + char *external_name; + char *namepath; + char name_seg[4]; + u32 extra_value; + u32 column; + u32 line_number; + u32 logical_line_number; + u32 logical_byte_offset; + u32 end_line; + u32 end_logical_line; + u32 acpi_btype; + u32 aml_length; + u32 aml_subtree_length; + u32 final_aml_length; + u32 final_aml_offset; + u32 compile_flags; + u16 parse_opcode; + u8 aml_opcode_length; + u8 aml_pkg_len_bytes; + u8 extra; + char parse_op_name[20]; +}; + +union acpi_parse_object { + struct acpi_parse_obj_common common; + struct acpi_parse_obj_named named; + struct acpi_parse_obj_asl asl; +}; + +struct acpi_scope_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + struct acpi_namespace_node *node; +}; + +struct acpi_pscope_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u32 arg_count; + union acpi_parse_object *op; + u8 *arg_end; + u8 *pkg_end; + u32 arg_list; +}; + +struct acpi_thread_state { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u8 current_sync_level; + struct acpi_walk_state *walk_state_list; + union acpi_operand_object *acquired_mutex_list; + u64 thread_id; +}; + +struct acpi_result_values { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + union acpi_operand_object *obj_desc[8]; +}; + +struct acpi_global_notify_handler { + acpi_notify_handler handler; + void *context; +}; + +struct acpi_notify_info { + void *next; + u8 descriptor_type; + u8 flags; + u16 value; + u16 state; + u8 handler_list_id; + struct acpi_namespace_node *node; + union acpi_operand_object *handler_list_head; + struct acpi_global_notify_handler *global; +}; + +union acpi_generic_state { + struct acpi_common_state common; + struct acpi_control_state control; + struct acpi_update_state update; + struct acpi_scope_state scope; + struct acpi_pscope_state parse_scope; + struct acpi_pkg_state pkg; + struct acpi_thread_state thread; + struct acpi_result_values results; + struct acpi_notify_info notify; +}; + +struct acpi_opcode_info { + u32 parse_args; + u32 runtime_args; + u16 flags; + u8 object_type; + u8 class; + u8 type; +}; + +typedef u32 acpi_name; + +typedef acpi_status (*acpi_init_handler)(acpi_handle, u32); + +typedef acpi_status (*acpi_exception_handler)(acpi_status, acpi_name, u16, u32, void *); + +typedef acpi_status (*acpi_table_handler)(u32, void *, void *); + +typedef u32 (*acpi_interface_handler)(acpi_string, u32); + +struct acpi_table_header { + char signature[4]; + u32 length; + u8 revision; + u8 checksum; + char oem_id[6]; + char oem_table_id[8]; + u32 oem_revision; + char asl_compiler_id[4]; + u32 asl_compiler_revision; +}; + +struct acpi_mutex_info { + void *mutex; + u32 use_count; + u64 thread_id; +}; + +struct acpi_address_range { + struct acpi_address_range *next; + struct acpi_namespace_node *region_node; + acpi_physical_address start_address; + acpi_physical_address end_address; +}; + +typedef __kernel_long_t __kernel_ptrdiff_t; + +typedef __kernel_ptrdiff_t ptrdiff_t; + +typedef short unsigned int ushort; + +typedef unsigned int uint; + +typedef int (*cmp_func_t)(const void *, const void *); + +struct atomic_notifier_head { + spinlock_t lock; + struct notifier_block *head; +}; + +struct ld_semaphore { + atomic_long_t count; + raw_spinlock_t wait_lock; + unsigned int wait_readers; + struct list_head read_wait; + struct list_head write_wait; + struct lockdep_map dep_map; +}; + +typedef unsigned int tcflag_t; + +typedef unsigned char cc_t; + +typedef unsigned int speed_t; + +struct ktermios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +struct winsize { + short unsigned int ws_row; + short unsigned int ws_col; + short unsigned int ws_xpixel; + short unsigned int ws_ypixel; +}; + +struct tty_driver; + +struct tty_operations; + +struct tty_ldisc; + +struct tty_port; + +struct tty_struct { + struct kref kref; + struct device *dev; + struct tty_driver *driver; + const struct tty_operations *ops; + int index; + struct ld_semaphore ldisc_sem; + struct tty_ldisc *ldisc; + struct mutex atomic_write_lock; + struct mutex legacy_mutex; + struct mutex throttle_mutex; + struct rw_semaphore termios_rwsem; + struct mutex winsize_mutex; + struct ktermios termios; + struct ktermios termios_locked; + char name[64]; + long unsigned int flags; + int count; + struct winsize winsize; + struct { + spinlock_t lock; + bool stopped; + bool tco_stopped; + long unsigned int unused[0]; + } flow; + struct { + spinlock_t lock; + struct pid *pgrp; + struct pid *session; + unsigned char pktstatus; + bool packet; + long unsigned int unused[0]; + } ctrl; + int hw_stopped; + unsigned int receive_room; + int flow_change; + struct tty_struct *link; + struct fasync_struct *fasync; + wait_queue_head_t write_wait; + wait_queue_head_t read_wait; + struct work_struct hangup_work; + void *disc_data; + void *driver_data; + spinlock_t files_lock; + struct list_head tty_files; + int closing; + unsigned char *write_buf; + int write_cnt; + struct work_struct SAK_work; + struct tty_port *port; +}; + +struct tty_buffer { + union { + struct tty_buffer *next; + struct llist_node free; + }; + int used; + int size; + int commit; + int lookahead; + int read; + int flags; + long unsigned int data[0]; +}; + +struct tty_bufhead { + struct tty_buffer *head; + struct work_struct work; + struct mutex lock; + atomic_t priority; + struct tty_buffer sentinel; + struct llist_head free; + atomic_t mem_used; + int mem_limit; + struct tty_buffer *tail; +}; + +struct device_attribute { + struct attribute attr; + ssize_t (*show)(struct device *, struct device_attribute *, char *); + ssize_t (*store)(struct device *, struct device_attribute *, const char *, size_t); +}; + +struct serial_icounter_struct; + +struct serial_struct; + +struct tty_operations { + struct tty_struct * (*lookup)(struct tty_driver *, struct file *, int); + int (*install)(struct tty_driver *, struct tty_struct *); + void (*remove)(struct tty_driver *, struct tty_struct *); + int (*open)(struct tty_struct *, struct file *); + void (*close)(struct tty_struct *, struct file *); + void (*shutdown)(struct tty_struct *); + void (*cleanup)(struct tty_struct *); + int (*write)(struct tty_struct *, const unsigned char *, int); + int (*put_char)(struct tty_struct *, unsigned char); + void (*flush_chars)(struct tty_struct *); + unsigned int (*write_room)(struct tty_struct *); + unsigned int (*chars_in_buffer)(struct tty_struct *); + int (*ioctl)(struct tty_struct *, unsigned int, long unsigned int); + long int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int); + void (*set_termios)(struct tty_struct *, const struct ktermios *); + void (*throttle)(struct tty_struct *); + void (*unthrottle)(struct tty_struct *); + void (*stop)(struct tty_struct *); + void (*start)(struct tty_struct *); + void (*hangup)(struct tty_struct *); + int (*break_ctl)(struct tty_struct *, int); + void (*flush_buffer)(struct tty_struct *); + void (*set_ldisc)(struct tty_struct *); + void (*wait_until_sent)(struct tty_struct *, int); + void (*send_xchar)(struct tty_struct *, char); + int (*tiocmget)(struct tty_struct *); + int (*tiocmset)(struct tty_struct *, unsigned int, unsigned int); + int (*resize)(struct tty_struct *, struct winsize *); + int (*get_icount)(struct tty_struct *, struct serial_icounter_struct *); + int (*get_serial)(struct tty_struct *, struct serial_struct *); + int (*set_serial)(struct tty_struct *, struct serial_struct *); + void (*show_fdinfo)(struct tty_struct *, struct seq_file *); + int (*proc_show)(struct seq_file *, void *); +}; + +struct tty_driver { + struct kref kref; + struct cdev **cdevs; + struct module *owner; + const char *driver_name; + const char *name; + int name_base; + int major; + int minor_start; + unsigned int num; + short int type; + short int subtype; + struct ktermios init_termios; + long unsigned int flags; + struct proc_dir_entry *proc_entry; + struct tty_driver *other; + struct tty_struct **ttys; + struct tty_port **ports; + struct ktermios **termios; + void *driver_state; + const struct tty_operations *ops; + struct list_head tty_drivers; +}; + +struct __kfifo { + unsigned int in; + unsigned int out; + unsigned int mask; + unsigned int esize; + void *data; +}; + +struct tty_port_operations; + +struct tty_port_client_operations; + +struct tty_port { + struct tty_bufhead buf; + struct tty_struct *tty; + struct tty_struct *itty; + const struct tty_port_operations *ops; + const struct tty_port_client_operations *client_ops; + spinlock_t lock; + int blocked_open; + int count; + wait_queue_head_t open_wait; + wait_queue_head_t delta_msr_wait; + long unsigned int flags; + long unsigned int iflags; + unsigned char console: 1; + struct mutex mutex; + struct mutex buf_mutex; + unsigned char *xmit_buf; + struct { + union { + struct __kfifo kfifo; + unsigned char *type; + const unsigned char *const_type; + char (*rectype)[0]; + unsigned char *ptr; + const unsigned char *ptr_const; + }; + unsigned char buf[0]; + } xmit_fifo; + unsigned int close_delay; + unsigned int closing_wait; + int drain_delay; + struct kref kref; + void *client_data; +}; + +struct tty_ldisc_ops { + char *name; + int num; + int (*open)(struct tty_struct *); + void (*close)(struct tty_struct *); + void (*flush_buffer)(struct tty_struct *); + ssize_t (*read)(struct tty_struct *, struct file *, unsigned char *, size_t, void **, long unsigned int); + ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t); + int (*ioctl)(struct tty_struct *, unsigned int, long unsigned int); + int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int); + void (*set_termios)(struct tty_struct *, const struct ktermios *); + __poll_t (*poll)(struct tty_struct *, struct file *, struct poll_table_struct *); + void (*hangup)(struct tty_struct *); + void (*receive_buf)(struct tty_struct *, const unsigned char *, const char *, int); + void (*write_wakeup)(struct tty_struct *); + void (*dcd_change)(struct tty_struct *, unsigned int); + int (*receive_buf2)(struct tty_struct *, const unsigned char *, const char *, int); + void (*lookahead_buf)(struct tty_struct *, const unsigned char *, const unsigned char *, unsigned int); + struct module *owner; +}; + +struct tty_ldisc { + struct tty_ldisc_ops *ops; + struct tty_struct *tty; +}; + +struct tty_port_operations { + int (*carrier_raised)(struct tty_port *); + void (*dtr_rts)(struct tty_port *, int); + void (*shutdown)(struct tty_port *); + int (*activate)(struct tty_port *, struct tty_struct *); + void (*destruct)(struct tty_port *); +}; + +struct tty_port_client_operations { + int (*receive_buf)(struct tty_port *, const unsigned char *, const unsigned char *, size_t); + void (*lookahead_buf)(struct tty_port *, const unsigned char *, const unsigned char *, unsigned int); + void (*write_wakeup)(struct tty_port *); +}; + +struct console_font_op { + unsigned int op; + unsigned int flags; + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char *data; +}; + +struct console_font { + unsigned int width; + unsigned int height; + unsigned int charcount; + unsigned char *data; +}; + +enum con_scroll { + SM_UP = 0, + SM_DOWN = 1, +}; + +enum vc_intensity { + VCI_HALF_BRIGHT = 0, + VCI_NORMAL = 1, + VCI_BOLD = 2, + VCI_MASK = 3, +}; + +struct vc_data; + +struct consw { + struct module *owner; + const char * (*con_startup)(); + void (*con_init)(struct vc_data *, int); + void (*con_deinit)(struct vc_data *); + void (*con_clear)(struct vc_data *, int, int, int, int); + void (*con_putc)(struct vc_data *, int, int, int); + void (*con_putcs)(struct vc_data *, const short unsigned int *, int, int, int); + void (*con_cursor)(struct vc_data *, int); + bool (*con_scroll)(struct vc_data *, unsigned int, unsigned int, enum con_scroll, unsigned int); + int (*con_switch)(struct vc_data *); + int (*con_blank)(struct vc_data *, int, int); + int (*con_font_set)(struct vc_data *, struct console_font *, unsigned int); + int (*con_font_get)(struct vc_data *, struct console_font *); + int (*con_font_default)(struct vc_data *, struct console_font *, char *); + int (*con_resize)(struct vc_data *, unsigned int, unsigned int, unsigned int); + void (*con_set_palette)(struct vc_data *, const unsigned char *); + void (*con_scrolldelta)(struct vc_data *, int); + int (*con_set_origin)(struct vc_data *); + void (*con_save_screen)(struct vc_data *); + u8 (*con_build_attr)(struct vc_data *, u8, enum vc_intensity, bool, bool, bool, bool); + void (*con_invert_region)(struct vc_data *, u16 *, int); + u16 * (*con_screen_pos)(const struct vc_data *, int); + long unsigned int (*con_getxy)(struct vc_data *, long unsigned int, int *, int *); + void (*con_flush_scrollback)(struct vc_data *); + int (*con_debug_enter)(struct vc_data *); + int (*con_debug_leave)(struct vc_data *); +}; + +struct vc_state { + unsigned int x; + unsigned int y; + unsigned char color; + unsigned char Gx_charset[2]; + unsigned int charset: 1; + enum vc_intensity intensity; + bool italic; + bool underline; + bool blink; + bool reverse; +}; + +struct vt_mode { + char mode; + char waitv; + short int relsig; + short int acqsig; + short int frsig; +}; + +struct uni_pagedict; + +struct uni_screen; + +struct vc_data { + struct tty_port port; + struct vc_state state; + struct vc_state saved_state; + short unsigned int vc_num; + unsigned int vc_cols; + unsigned int vc_rows; + unsigned int vc_size_row; + unsigned int vc_scan_lines; + unsigned int vc_cell_height; + long unsigned int vc_origin; + long unsigned int vc_scr_end; + long unsigned int vc_visible_origin; + unsigned int vc_top; + unsigned int vc_bottom; + const struct consw *vc_sw; + short unsigned int *vc_screenbuf; + unsigned int vc_screenbuf_size; + unsigned char vc_mode; + unsigned char vc_attr; + unsigned char vc_def_color; + unsigned char vc_ulcolor; + unsigned char vc_itcolor; + unsigned char vc_halfcolor; + unsigned int vc_cursor_type; + short unsigned int vc_complement_mask; + short unsigned int vc_s_complement_mask; + long unsigned int vc_pos; + short unsigned int vc_hi_font_mask; + struct console_font vc_font; + short unsigned int vc_video_erase_char; + unsigned int vc_state; + unsigned int vc_npar; + unsigned int vc_par[16]; + struct vt_mode vt_mode; + struct pid *vt_pid; + int vt_newvt; + wait_queue_head_t paste_wait; + unsigned int vc_disp_ctrl: 1; + unsigned int vc_toggle_meta: 1; + unsigned int vc_decscnm: 1; + unsigned int vc_decom: 1; + unsigned int vc_decawm: 1; + unsigned int vc_deccm: 1; + unsigned int vc_decim: 1; + unsigned int vc_priv: 3; + unsigned int vc_need_wrap: 1; + unsigned int vc_can_do_color: 1; + unsigned int vc_report_mouse: 2; + unsigned char vc_utf: 1; + unsigned char vc_utf_count; + int vc_utf_char; + long unsigned int vc_tab_stop[4]; + unsigned char vc_palette[48]; + short unsigned int *vc_translate; + unsigned int vc_resize_user; + unsigned int vc_bell_pitch; + unsigned int vc_bell_duration; + short unsigned int vc_cur_blink_ms; + struct vc_data **vc_display_fg; + struct uni_pagedict *uni_pagedict; + struct uni_pagedict **uni_pagedict_loc; + struct uni_screen *vc_uni_screen; +}; + +struct console { + char name[16]; + void (*write)(struct console *, const char *, unsigned int); + int (*read)(struct console *, char *, unsigned int); + struct tty_driver * (*device)(struct console *, int *); + void (*unblank)(); + int (*setup)(struct console *, char *); + int (*exit)(struct console *); + int (*match)(struct console *, char *, int, char *); + short int flags; + short int index; + int cflag; + uint ispeed; + uint ospeed; + u64 seq; + long unsigned int dropped; + void *data; + struct hlist_node node; +}; + +typedef uint32_t char32_t; + +struct uni_screen { + char32_t *lines[0]; +}; + +struct vc { + struct vc_data *d; + struct work_struct SAK_work; +}; + +enum translation_map { + LAT1_MAP = 0, + GRAF_MAP = 1, + IBMPC_MAP = 2, + USER_MAP = 3, + FIRST_MAP = 0, + LAST_MAP = 3, +}; + +struct vt_notifier_param { + struct vc_data *vc; + unsigned int c; +}; + +struct tiocl_selection { + short unsigned int xs; + short unsigned int ys; + short unsigned int xe; + short unsigned int ye; + short unsigned int sel_mode; +}; + +struct con_driver { + const struct consw *con; + const char *desc; + struct device *dev; + int node; + int first; + int last; + int flag; +}; + +enum { + blank_off = 0, + blank_normal_wait = 1, + blank_vesa_wait = 2, +}; + +enum { + EPecma = 0, + EPdec = 1, + EPeq = 2, + EPgt = 3, + EPlt = 4, +}; + +struct rgb { + u8 r; + u8 g; + u8 b; +}; + +enum { + ESnormal = 0, + ESesc = 1, + ESsquare = 2, + ESgetpars = 3, + ESfunckey = 4, + EShash = 5, + ESsetG0 = 6, + ESsetG1 = 7, + ESpercent = 8, + EScsiignore = 9, + ESnonstd = 10, + ESpalette = 11, + ESosc = 12, + ESapc = 13, + ESpm = 14, + ESdcs = 15, +}; + +struct interval { + uint32_t first; + uint32_t last; +}; + +struct vc_draw_region { + long unsigned int from; + long unsigned int to; + int x; +}; + +struct component_ops { + int (*bind)(struct device *, struct device *, void *); + void (*unbind)(struct device *, struct device *, void *); +}; + +struct component_master_ops { + int (*bind)(struct device *); + void (*unbind)(struct device *); +}; + +typedef void (*dr_release_t)(struct device *, void *); + +struct component; + +struct component_match_array { + void *data; + int (*compare)(struct device *, void *); + int (*compare_typed)(struct device *, int, void *); + void (*release)(struct device *, void *); + struct component *component; + bool duplicate; +}; + +struct aggregate_device; + +struct component { + struct list_head node; + struct aggregate_device *adev; + bool bound; + const struct component_ops *ops; + int subcomponent; + struct device *dev; +}; + +struct component_match { + size_t alloc; + size_t num; + struct component_match_array *compare; +}; + +struct aggregate_device { + struct list_head node; + bool bound; + const struct component_master_ops *ops; + struct device *parent; + struct component_match *match; +}; + +typedef void (*exitcall_t)(); + +enum input_clock_type { + INPUT_CLK_REAL = 0, + INPUT_CLK_MONO = 1, + INPUT_CLK_BOOT = 2, + INPUT_CLK_MAX = 3, +}; + +enum rc_proto { + RC_PROTO_UNKNOWN = 0, + RC_PROTO_OTHER = 1, + RC_PROTO_RC5 = 2, + RC_PROTO_RC5X_20 = 3, + RC_PROTO_RC5_SZ = 4, + RC_PROTO_JVC = 5, + RC_PROTO_SONY12 = 6, + RC_PROTO_SONY15 = 7, + RC_PROTO_SONY20 = 8, + RC_PROTO_NEC = 9, + RC_PROTO_NECX = 10, + RC_PROTO_NEC32 = 11, + RC_PROTO_SANYO = 12, + RC_PROTO_MCIR2_KBD = 13, + RC_PROTO_MCIR2_MSE = 14, + RC_PROTO_RC6_0 = 15, + RC_PROTO_RC6_6A_20 = 16, + RC_PROTO_RC6_6A_24 = 17, + RC_PROTO_RC6_6A_32 = 18, + RC_PROTO_RC6_MCE = 19, + RC_PROTO_SHARP = 20, + RC_PROTO_XMP = 21, + RC_PROTO_CEC = 22, + RC_PROTO_IMON = 23, + RC_PROTO_RCMM12 = 24, + RC_PROTO_RCMM24 = 25, + RC_PROTO_RCMM32 = 26, + RC_PROTO_XBOX_DVD = 27, + RC_PROTO_MAX = 27, +}; + +struct rc_map_table { + u64 scancode; + u32 keycode; +}; + +struct rc_map { + struct rc_map_table *scan; + unsigned int size; + unsigned int len; + unsigned int alloc; + enum rc_proto rc_proto; + const char *name; + spinlock_t lock; +}; + +struct rc_map_list { + struct list_head list; + struct rc_map map; +}; + +struct semaphore { + raw_spinlock_t lock; + unsigned int count; + struct list_head wait_list; +}; + +struct hid_device_id { + __u16 bus; + __u16 group; + __u32 vendor; + __u32 product; + kernel_ulong_t driver_data; +}; + +struct input_device_id { + kernel_ulong_t flags; + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; + kernel_ulong_t evbit[1]; + kernel_ulong_t keybit[12]; + kernel_ulong_t relbit[1]; + kernel_ulong_t absbit[1]; + kernel_ulong_t mscbit[1]; + kernel_ulong_t ledbit[1]; + kernel_ulong_t sndbit[1]; + kernel_ulong_t ffbit[2]; + kernel_ulong_t swbit[1]; + kernel_ulong_t propbit[1]; + kernel_ulong_t driver_info; +}; + +struct input_id { + __u16 bustype; + __u16 vendor; + __u16 product; + __u16 version; +}; + +struct input_absinfo { + __s32 value; + __s32 minimum; + __s32 maximum; + __s32 fuzz; + __s32 flat; + __s32 resolution; +}; + +struct input_keymap_entry { + __u8 flags; + __u8 len; + __u16 index; + __u32 keycode; + __u8 scancode[32]; +}; + +struct ff_replay { + __u16 length; + __u16 delay; +}; + +struct ff_trigger { + __u16 button; + __u16 interval; +}; + +struct ff_envelope { + __u16 attack_length; + __u16 attack_level; + __u16 fade_length; + __u16 fade_level; +}; + +struct ff_constant_effect { + __s16 level; + struct ff_envelope envelope; +}; + +struct ff_ramp_effect { + __s16 start_level; + __s16 end_level; + struct ff_envelope envelope; +}; + +struct ff_condition_effect { + __u16 right_saturation; + __u16 left_saturation; + __s16 right_coeff; + __s16 left_coeff; + __u16 deadband; + __s16 center; +}; + +struct ff_periodic_effect { + __u16 waveform; + __u16 period; + __s16 magnitude; + __s16 offset; + __u16 phase; + struct ff_envelope envelope; + __u32 custom_len; + __s16 *custom_data; +}; + +struct ff_rumble_effect { + __u16 strong_magnitude; + __u16 weak_magnitude; +}; + +struct ff_effect { + __u16 type; + __s16 id; + __u16 direction; + struct ff_trigger trigger; + struct ff_replay replay; + union { + struct ff_constant_effect constant; + struct ff_ramp_effect ramp; + struct ff_periodic_effect periodic; + struct ff_condition_effect condition[2]; + struct ff_rumble_effect rumble; + } u; +}; + +struct input_value { + __u16 type; + __u16 code; + __s32 value; +}; + +struct ff_device; + +struct input_dev_poller; + +struct input_mt; + +struct input_handle; + +struct input_dev { + const char *name; + const char *phys; + const char *uniq; + struct input_id id; + long unsigned int propbit[1]; + long unsigned int evbit[1]; + long unsigned int keybit[12]; + long unsigned int relbit[1]; + long unsigned int absbit[1]; + long unsigned int mscbit[1]; + long unsigned int ledbit[1]; + long unsigned int sndbit[1]; + long unsigned int ffbit[2]; + long unsigned int swbit[1]; + unsigned int hint_events_per_packet; + unsigned int keycodemax; + unsigned int keycodesize; + void *keycode; + int (*setkeycode)(struct input_dev *, const struct input_keymap_entry *, unsigned int *); + int (*getkeycode)(struct input_dev *, struct input_keymap_entry *); + struct ff_device *ff; + struct input_dev_poller *poller; + unsigned int repeat_key; + struct timer_list timer; + int rep[2]; + struct input_mt *mt; + struct input_absinfo *absinfo; + long unsigned int key[12]; + long unsigned int led[1]; + long unsigned int snd[1]; + long unsigned int sw[1]; + int (*open)(struct input_dev *); + void (*close)(struct input_dev *); + int (*flush)(struct input_dev *, struct file *); + int (*event)(struct input_dev *, unsigned int, unsigned int, int); + struct input_handle *grab; + spinlock_t event_lock; + struct mutex mutex; + unsigned int users; + bool going_away; + struct device dev; + struct list_head h_list; + struct list_head node; + unsigned int num_vals; + unsigned int max_vals; + struct input_value *vals; + bool devres_managed; + ktime_t timestamp[3]; + bool inhibited; +}; + +struct ff_device { + int (*upload)(struct input_dev *, struct ff_effect *, struct ff_effect *); + int (*erase)(struct input_dev *, int); + int (*playback)(struct input_dev *, int, int); + void (*set_gain)(struct input_dev *, u16); + void (*set_autocenter)(struct input_dev *, u16); + void (*destroy)(struct ff_device *); + void *private; + long unsigned int ffbit[2]; + struct mutex mutex; + int max_effects; + struct ff_effect *effects; + struct file *effect_owners[0]; +}; + +struct input_handler; + +struct input_handle { + void *private; + int open; + const char *name; + struct input_dev *dev; + struct input_handler *handler; + struct list_head d_node; + struct list_head h_node; +}; + +struct input_handler { + void *private; + void (*event)(struct input_handle *, unsigned int, unsigned int, int); + void (*events)(struct input_handle *, const struct input_value *, unsigned int); + bool (*filter)(struct input_handle *, unsigned int, unsigned int, int); + bool (*match)(struct input_handler *, struct input_dev *); + int (*connect)(struct input_handler *, struct input_dev *, const struct input_device_id *); + void (*disconnect)(struct input_handle *); + void (*start)(struct input_handle *); + bool legacy_minors; + int minor; + const char *name; + const struct input_device_id *id_table; + struct list_head h_list; + struct list_head node; +}; + +enum hid_report_type { + HID_INPUT_REPORT = 0, + HID_OUTPUT_REPORT = 1, + HID_FEATURE_REPORT = 2, + HID_REPORT_TYPES = 3, +}; + +struct hid_collection { + int parent_idx; + unsigned int type; + unsigned int usage; + unsigned int level; +}; + +struct hid_usage { + unsigned int hid; + unsigned int collection_index; + unsigned int usage_index; + __s8 resolution_multiplier; + __s8 wheel_factor; + __u16 code; + __u8 type; + __s8 hat_min; + __s8 hat_max; + __s8 hat_dir; + __s16 wheel_accumulated; +}; + +struct hid_report; + +struct hid_input; + +struct hid_field { + unsigned int physical; + unsigned int logical; + unsigned int application; + struct hid_usage *usage; + unsigned int maxusage; + unsigned int flags; + unsigned int report_offset; + unsigned int report_size; + unsigned int report_count; + unsigned int report_type; + __s32 *value; + __s32 *new_value; + __s32 *usages_priorities; + __s32 logical_minimum; + __s32 logical_maximum; + __s32 physical_minimum; + __s32 physical_maximum; + __s32 unit_exponent; + unsigned int unit; + bool ignored; + struct hid_report *report; + unsigned int index; + struct hid_input *hidinput; + __u16 dpad; + unsigned int slot_idx; +}; + +struct hid_field_entry; + +struct hid_device; + +struct hid_report { + struct list_head list; + struct list_head hidinput_list; + struct list_head field_entry_list; + unsigned int id; + enum hid_report_type type; + unsigned int application; + struct hid_field *field[256]; + struct hid_field_entry *field_entries; + unsigned int maxfield; + unsigned int size; + struct hid_device *device; + bool tool_active; + unsigned int tool; +}; + +struct hid_input { + struct list_head list; + struct hid_report *report; + struct input_dev *input; + const char *name; + bool registered; + struct list_head reports; + unsigned int application; +}; + +struct hid_field_entry { + struct list_head list; + struct hid_field *field; + unsigned int index; + __s32 priority; +}; + +enum hid_type { + HID_TYPE_OTHER = 0, + HID_TYPE_USBMOUSE = 1, + HID_TYPE_USBNONE = 2, +}; + +struct hid_report_enum { + unsigned int numbered; + struct list_head report_list; + struct hid_report *report_id_hash[256]; +}; + +struct hid_driver; + +struct hid_ll_driver; + +struct hid_device { + __u8 *dev_rdesc; + unsigned int dev_rsize; + __u8 *rdesc; + unsigned int rsize; + struct hid_collection *collection; + unsigned int collection_size; + unsigned int maxcollection; + unsigned int maxapplication; + __u16 bus; + __u16 group; + __u32 vendor; + __u32 product; + __u32 version; + enum hid_type type; + unsigned int country; + struct hid_report_enum report_enum[3]; + struct work_struct led_work; + struct semaphore driver_input_lock; + struct device dev; + struct hid_driver *driver; + struct hid_ll_driver *ll_driver; + struct mutex ll_open_lock; + unsigned int ll_open_count; + long unsigned int status; + unsigned int claimed; + unsigned int quirks; + bool io_started; + struct list_head inputs; + void *hiddev; + void *hidraw; + char name[128]; + char phys[64]; + char uniq[64]; + void *driver_data; + int (*ff_init)(struct hid_device *); + int (*hiddev_connect)(struct hid_device *, unsigned int); + void (*hiddev_disconnect)(struct hid_device *); + void (*hiddev_hid_event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); + void (*hiddev_report_event)(struct hid_device *, struct hid_report *); + short unsigned int debug; + struct dentry *debug_dir; + struct dentry *debug_rdesc; + struct dentry *debug_events; + struct list_head debug_list; + spinlock_t debug_list_lock; + wait_queue_head_t debug_wait; + unsigned int id; +}; + +struct hid_report_id; + +struct hid_usage_id; + +struct hid_driver { + char *name; + const struct hid_device_id *id_table; + struct list_head dyn_list; + spinlock_t dyn_lock; + bool (*match)(struct hid_device *, bool); + int (*probe)(struct hid_device *, const struct hid_device_id *); + void (*remove)(struct hid_device *); + const struct hid_report_id *report_table; + int (*raw_event)(struct hid_device *, struct hid_report *, u8 *, int); + const struct hid_usage_id *usage_table; + int (*event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); + void (*report)(struct hid_device *, struct hid_report *); + __u8 * (*report_fixup)(struct hid_device *, __u8 *, unsigned int *); + int (*input_mapping)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, long unsigned int **, int *); + int (*input_mapped)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, long unsigned int **, int *); + int (*input_configured)(struct hid_device *, struct hid_input *); + void (*feature_mapping)(struct hid_device *, struct hid_field *, struct hid_usage *); + int (*suspend)(struct hid_device *, pm_message_t); + int (*resume)(struct hid_device *); + int (*reset_resume)(struct hid_device *); + struct device_driver driver; +}; + +struct hid_ll_driver { + int (*start)(struct hid_device *); + void (*stop)(struct hid_device *); + int (*open)(struct hid_device *); + void (*close)(struct hid_device *); + int (*power)(struct hid_device *, int); + int (*parse)(struct hid_device *); + void (*request)(struct hid_device *, struct hid_report *, int); + int (*wait)(struct hid_device *); + int (*raw_request)(struct hid_device *, unsigned char, __u8 *, size_t, unsigned char, int); + int (*output_report)(struct hid_device *, __u8 *, size_t); + int (*idle)(struct hid_device *, int, int, int); + bool (*may_wakeup)(struct hid_device *); +}; + +struct hid_report_id { + __u32 report_type; +}; + +struct hid_usage_id { + __u32 usage_hid; + __u32 usage_type; + __u32 usage_code; +}; + +enum { + NETIF_F_SG_BIT = 0, + NETIF_F_IP_CSUM_BIT = 1, + __UNUSED_NETIF_F_1 = 2, + NETIF_F_HW_CSUM_BIT = 3, + NETIF_F_IPV6_CSUM_BIT = 4, + NETIF_F_HIGHDMA_BIT = 5, + NETIF_F_FRAGLIST_BIT = 6, + NETIF_F_HW_VLAN_CTAG_TX_BIT = 7, + NETIF_F_HW_VLAN_CTAG_RX_BIT = 8, + NETIF_F_HW_VLAN_CTAG_FILTER_BIT = 9, + NETIF_F_VLAN_CHALLENGED_BIT = 10, + NETIF_F_GSO_BIT = 11, + NETIF_F_LLTX_BIT = 12, + NETIF_F_NETNS_LOCAL_BIT = 13, + NETIF_F_GRO_BIT = 14, + NETIF_F_LRO_BIT = 15, + NETIF_F_GSO_SHIFT = 16, + NETIF_F_TSO_BIT = 16, + NETIF_F_GSO_ROBUST_BIT = 17, + NETIF_F_TSO_ECN_BIT = 18, + NETIF_F_TSO_MANGLEID_BIT = 19, + NETIF_F_TSO6_BIT = 20, + NETIF_F_FSO_BIT = 21, + NETIF_F_GSO_GRE_BIT = 22, + NETIF_F_GSO_GRE_CSUM_BIT = 23, + NETIF_F_GSO_IPXIP4_BIT = 24, + NETIF_F_GSO_IPXIP6_BIT = 25, + NETIF_F_GSO_UDP_TUNNEL_BIT = 26, + NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT = 27, + NETIF_F_GSO_PARTIAL_BIT = 28, + NETIF_F_GSO_TUNNEL_REMCSUM_BIT = 29, + NETIF_F_GSO_SCTP_BIT = 30, + NETIF_F_GSO_ESP_BIT = 31, + NETIF_F_GSO_UDP_BIT = 32, + NETIF_F_GSO_UDP_L4_BIT = 33, + NETIF_F_GSO_FRAGLIST_BIT = 34, + NETIF_F_GSO_LAST = 34, + NETIF_F_FCOE_CRC_BIT = 35, + NETIF_F_SCTP_CRC_BIT = 36, + NETIF_F_FCOE_MTU_BIT = 37, + NETIF_F_NTUPLE_BIT = 38, + NETIF_F_RXHASH_BIT = 39, + NETIF_F_RXCSUM_BIT = 40, + NETIF_F_NOCACHE_COPY_BIT = 41, + NETIF_F_LOOPBACK_BIT = 42, + NETIF_F_RXFCS_BIT = 43, + NETIF_F_RXALL_BIT = 44, + NETIF_F_HW_VLAN_STAG_TX_BIT = 45, + NETIF_F_HW_VLAN_STAG_RX_BIT = 46, + NETIF_F_HW_VLAN_STAG_FILTER_BIT = 47, + NETIF_F_HW_L2FW_DOFFLOAD_BIT = 48, + NETIF_F_HW_TC_BIT = 49, + NETIF_F_HW_ESP_BIT = 50, + NETIF_F_HW_ESP_TX_CSUM_BIT = 51, + NETIF_F_RX_UDP_TUNNEL_PORT_BIT = 52, + NETIF_F_HW_TLS_TX_BIT = 53, + NETIF_F_HW_TLS_RX_BIT = 54, + NETIF_F_GRO_HW_BIT = 55, + NETIF_F_HW_TLS_RECORD_BIT = 56, + NETIF_F_GRO_FRAGLIST_BIT = 57, + NETIF_F_HW_MACSEC_BIT = 58, + NETIF_F_GRO_UDP_FWD_BIT = 59, + NETIF_F_HW_HSR_TAG_INS_BIT = 60, + NETIF_F_HW_HSR_TAG_RM_BIT = 61, + NETIF_F_HW_HSR_FWD_BIT = 62, + NETIF_F_HW_HSR_DUP_BIT = 63, + NETDEV_FEATURE_COUNT = 64, +}; + +typedef struct bio_vec skb_frag_t; + +struct skb_shared_info { + __u8 flags; + __u8 meta_len; + __u8 nr_frags; + __u8 tx_flags; + short unsigned int gso_size; + short unsigned int gso_segs; + struct sk_buff *frag_list; + struct skb_shared_hwtstamps hwtstamps; + unsigned int gso_type; + u32 tskey; + atomic_t dataref; + unsigned int xdp_frags_size; + void *destructor_arg; + skb_frag_t frags[17]; +}; + +struct net_generic { + union { + struct { + unsigned int len; + struct callback_head rcu; + } s; + struct { + struct { } __empty_ptr; + void *ptr[0]; + }; + }; +}; + +struct tc_stats { + __u64 bytes; + __u32 packets; + __u32 drops; + __u32 overlimits; + __u32 bps; + __u32 pps; + __u32 qlen; + __u32 backlog; +}; + +struct tc_sizespec { + unsigned char cell_log; + unsigned char size_log; + short int cell_align; + int overhead; + unsigned int linklayer; + unsigned int mpu; + unsigned int mtu; + unsigned int tsize; +}; + +struct tc_fifo_qopt { + __u32 limit; +}; + +struct net_rate_estimator; + +struct qdisc_skb_head { + struct sk_buff *head; + struct sk_buff *tail; + __u32 qlen; + spinlock_t lock; +}; + +struct gnet_stats_basic_sync { + u64_stats_t bytes; + u64_stats_t packets; + struct u64_stats_sync syncp; +}; + +struct gnet_stats_queue { + __u32 qlen; + __u32 backlog; + __u32 drops; + __u32 requeues; + __u32 overlimits; +}; + +struct Qdisc_ops; + +struct qdisc_size_table; + +struct Qdisc { + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + unsigned int flags; + u32 limit; + const struct Qdisc_ops *ops; + struct qdisc_size_table *stab; + struct hlist_node hash; + u32 handle; + u32 parent; + struct netdev_queue *dev_queue; + struct net_rate_estimator *rate_est; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_queue *cpu_qstats; + int pad; + refcount_t refcnt; + long: 64; + long: 64; + long: 64; + struct sk_buff_head gso_skb; + struct qdisc_skb_head q; + struct gnet_stats_basic_sync bstats; + struct gnet_stats_queue qstats; + long unsigned int state; + long unsigned int state2; + struct Qdisc *next_sched; + struct sk_buff_head skb_bad_txq; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t busylock; + spinlock_t seqlock; + struct callback_head rcu; + netdevice_tracker dev_tracker; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long int privdata[0]; +}; + +struct tcf_proto; + +struct tcf_block; + +struct mini_Qdisc { + struct tcf_proto *filter_list; + struct tcf_block *block; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_queue *cpu_qstats; + long unsigned int rcu_state; +}; + +enum { + RTM_BASE = 16, + RTM_NEWLINK = 16, + RTM_DELLINK = 17, + RTM_GETLINK = 18, + RTM_SETLINK = 19, + RTM_NEWADDR = 20, + RTM_DELADDR = 21, + RTM_GETADDR = 22, + RTM_NEWROUTE = 24, + RTM_DELROUTE = 25, + RTM_GETROUTE = 26, + RTM_NEWNEIGH = 28, + RTM_DELNEIGH = 29, + RTM_GETNEIGH = 30, + RTM_NEWRULE = 32, + RTM_DELRULE = 33, + RTM_GETRULE = 34, + RTM_NEWQDISC = 36, + RTM_DELQDISC = 37, + RTM_GETQDISC = 38, + RTM_NEWTCLASS = 40, + RTM_DELTCLASS = 41, + RTM_GETTCLASS = 42, + RTM_NEWTFILTER = 44, + RTM_DELTFILTER = 45, + RTM_GETTFILTER = 46, + RTM_NEWACTION = 48, + RTM_DELACTION = 49, + RTM_GETACTION = 50, + RTM_NEWPREFIX = 52, + RTM_GETMULTICAST = 58, + RTM_GETANYCAST = 62, + RTM_NEWNEIGHTBL = 64, + RTM_GETNEIGHTBL = 66, + RTM_SETNEIGHTBL = 67, + RTM_NEWNDUSEROPT = 68, + RTM_NEWADDRLABEL = 72, + RTM_DELADDRLABEL = 73, + RTM_GETADDRLABEL = 74, + RTM_GETDCB = 78, + RTM_SETDCB = 79, + RTM_NEWNETCONF = 80, + RTM_DELNETCONF = 81, + RTM_GETNETCONF = 82, + RTM_NEWMDB = 84, + RTM_DELMDB = 85, + RTM_GETMDB = 86, + RTM_NEWNSID = 88, + RTM_DELNSID = 89, + RTM_GETNSID = 90, + RTM_NEWSTATS = 92, + RTM_GETSTATS = 94, + RTM_SETSTATS = 95, + RTM_NEWCACHEREPORT = 96, + RTM_NEWCHAIN = 100, + RTM_DELCHAIN = 101, + RTM_GETCHAIN = 102, + RTM_NEWNEXTHOP = 104, + RTM_DELNEXTHOP = 105, + RTM_GETNEXTHOP = 106, + RTM_NEWLINKPROP = 108, + RTM_DELLINKPROP = 109, + RTM_GETLINKPROP = 110, + RTM_NEWVLAN = 112, + RTM_DELVLAN = 113, + RTM_GETVLAN = 114, + RTM_NEWNEXTHOPBUCKET = 116, + RTM_DELNEXTHOPBUCKET = 117, + RTM_GETNEXTHOPBUCKET = 118, + RTM_NEWTUNNEL = 120, + RTM_DELTUNNEL = 121, + RTM_GETTUNNEL = 122, + __RTM_MAX = 123, +}; + +struct tcmsg { + unsigned char tcm_family; + unsigned char tcm__pad1; + short unsigned int tcm__pad2; + int tcm_ifindex; + __u32 tcm_handle; + __u32 tcm_parent; + __u32 tcm_info; +}; + +enum { + TCA_UNSPEC = 0, + TCA_KIND = 1, + TCA_OPTIONS = 2, + TCA_STATS = 3, + TCA_XSTATS = 4, + TCA_RATE = 5, + TCA_FCNT = 6, + TCA_STATS2 = 7, + TCA_STAB = 8, + TCA_PAD = 9, + TCA_DUMP_INVISIBLE = 10, + TCA_CHAIN = 11, + TCA_HW_OFFLOAD = 12, + TCA_INGRESS_BLOCK = 13, + TCA_EGRESS_BLOCK = 14, + TCA_DUMP_FLAGS = 15, + __TCA_MAX = 16, +}; + +struct gnet_dump { + spinlock_t *lock; + struct sk_buff *skb; + struct nlattr *tail; + int compat_tc_stats; + int compat_xstats; + int padattr; + void *xstats; + int xstats_len; + struct tc_stats tc_stats; +}; + +enum flow_action_hw_stats_bit { + FLOW_ACTION_HW_STATS_IMMEDIATE_BIT = 0, + FLOW_ACTION_HW_STATS_DELAYED_BIT = 1, + FLOW_ACTION_HW_STATS_DISABLED_BIT = 2, + FLOW_ACTION_HW_STATS_NUM_BITS = 3, +}; + +struct flow_block { + struct list_head cb_list; +}; + +typedef int flow_setup_cb_t(enum tc_setup_type, void *, void *); + +struct qdisc_size_table { + struct callback_head rcu; + struct list_head list; + struct tc_sizespec szopts; + int refcnt; + u16 data[0]; +}; + +struct Qdisc_class_ops; + +struct Qdisc_ops { + struct Qdisc_ops *next; + const struct Qdisc_class_ops *cl_ops; + char id[16]; + int priv_size; + unsigned int static_flags; + int (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **); + struct sk_buff * (*dequeue)(struct Qdisc *); + struct sk_buff * (*peek)(struct Qdisc *); + int (*init)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*reset)(struct Qdisc *); + void (*destroy)(struct Qdisc *); + int (*change)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *); + void (*attach)(struct Qdisc *); + int (*change_tx_queue_len)(struct Qdisc *, unsigned int); + void (*change_real_num_tx)(struct Qdisc *, unsigned int); + int (*dump)(struct Qdisc *, struct sk_buff *); + int (*dump_stats)(struct Qdisc *, struct gnet_dump *); + void (*ingress_block_set)(struct Qdisc *, u32); + void (*egress_block_set)(struct Qdisc *, u32); + u32 (*ingress_block_get)(struct Qdisc *); + u32 (*egress_block_get)(struct Qdisc *); + struct module *owner; +}; + +struct qdisc_walker; + +struct Qdisc_class_ops { + unsigned int flags; + struct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *); + int (*graft)(struct Qdisc *, long unsigned int, struct Qdisc *, struct Qdisc **, struct netlink_ext_ack *); + struct Qdisc * (*leaf)(struct Qdisc *, long unsigned int); + void (*qlen_notify)(struct Qdisc *, long unsigned int); + long unsigned int (*find)(struct Qdisc *, u32); + int (*change)(struct Qdisc *, u32, u32, struct nlattr **, long unsigned int *, struct netlink_ext_ack *); + int (*delete)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); + void (*walk)(struct Qdisc *, struct qdisc_walker *); + struct tcf_block * (*tcf_block)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *); + long unsigned int (*bind_tcf)(struct Qdisc *, long unsigned int, u32); + void (*unbind_tcf)(struct Qdisc *, long unsigned int); + int (*dump)(struct Qdisc *, long unsigned int, struct sk_buff *, struct tcmsg *); + int (*dump_stats)(struct Qdisc *, long unsigned int, struct gnet_dump *); +}; + +struct qdisc_walker { + int stop; + int skip; + int count; + int (*fn)(struct Qdisc *, long unsigned int, struct qdisc_walker *); +}; + +struct tcf_chain; + +struct tcf_block { + struct mutex lock; + struct list_head chain_list; + u32 index; + u32 classid; + refcount_t refcnt; + struct net *net; + struct Qdisc *q; + struct rw_semaphore cb_lock; + struct flow_block flow_block; + struct list_head owner_list; + bool keep_dst; + atomic_t offloadcnt; + unsigned int nooffloaddevcnt; + unsigned int lockeddevcnt; + struct { + struct tcf_chain *chain; + struct list_head filter_chain_list; + } chain0; + struct callback_head rcu; + struct hlist_head proto_destroy_ht[128]; + struct mutex proto_destroy_lock; +}; + +struct tcf_result; + +struct tcf_proto_ops; + +struct tcf_proto { + struct tcf_proto *next; + void *root; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + __be16 protocol; + u32 prio; + void *data; + const struct tcf_proto_ops *ops; + struct tcf_chain *chain; + spinlock_t lock; + bool deleting; + refcount_t refcnt; + struct callback_head rcu; + struct hlist_node destroy_ht_node; +}; + +struct tcf_result { + union { + struct { + long unsigned int class; + u32 classid; + }; + const struct tcf_proto *goto_tp; + }; +}; + +struct tcf_walker; + +struct tcf_proto_ops { + struct list_head head; + char kind[16]; + int (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *); + int (*init)(struct tcf_proto *); + void (*destroy)(struct tcf_proto *, bool, struct netlink_ext_ack *); + void * (*get)(struct tcf_proto *, u32); + void (*put)(struct tcf_proto *, void *); + int (*change)(struct net *, struct sk_buff *, struct tcf_proto *, long unsigned int, u32, struct nlattr **, void **, u32, struct netlink_ext_ack *); + int (*delete)(struct tcf_proto *, void *, bool *, bool, struct netlink_ext_ack *); + bool (*delete_empty)(struct tcf_proto *); + void (*walk)(struct tcf_proto *, struct tcf_walker *, bool); + int (*reoffload)(struct tcf_proto *, bool, flow_setup_cb_t *, void *, struct netlink_ext_ack *); + void (*hw_add)(struct tcf_proto *, void *); + void (*hw_del)(struct tcf_proto *, void *); + void (*bind_class)(void *, u32, long unsigned int, void *, long unsigned int); + void * (*tmplt_create)(struct net *, struct tcf_chain *, struct nlattr **, struct netlink_ext_ack *); + void (*tmplt_destroy)(void *); + int (*dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*terse_dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool); + int (*tmplt_dump)(struct sk_buff *, struct net *, void *); + struct module *owner; + int flags; +}; + +struct tcf_walker { + int stop; + int skip; + int count; + bool nonempty; + long unsigned int cookie; + int (*fn)(struct tcf_proto *, void *, struct tcf_walker *); +}; + +struct tcf_chain { + struct mutex filter_chain_lock; + struct tcf_proto *filter_chain; + struct list_head list; + struct tcf_block *block; + u32 index; + unsigned int refcnt; + unsigned int action_refcnt; + bool explicitly_created; + bool flushing; + const struct tcf_proto_ops *tmplt_ops; + void *tmplt_priv; + struct callback_head rcu; +}; + +struct qdisc_skb_cb { + struct { + unsigned int pkt_len; + u16 slave_dev_queue_mapping; + u16 tc_classid; + }; + unsigned char data[20]; +}; + +struct tc_qopt_offload_stats { + struct gnet_stats_basic_sync *bstats; + struct gnet_stats_queue *qstats; +}; + +enum tc_fifo_command { + TC_FIFO_REPLACE = 0, + TC_FIFO_DESTROY = 1, + TC_FIFO_STATS = 2, +}; + +struct tc_fifo_qopt_offload { + enum tc_fifo_command command; + u32 handle; + u32 parent; + union { + struct tc_qopt_offload_stats stats; + }; +}; + +typedef __u64 __be64; + +typedef unsigned int slab_flags_t; + +struct ipv6_rt_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; +}; + +struct ipv6_opt_hdr { + __u8 nexthdr; + __u8 hdrlen; +}; + +struct ipv6hdr { + __u8 priority: 4; + __u8 version: 4; + __u8 flow_lbl[3]; + __be16 payload_len; + __u8 nexthdr; + __u8 hop_limit; + union { + struct { + struct in6_addr saddr; + struct in6_addr daddr; + }; + struct { + struct in6_addr saddr; + struct in6_addr daddr; + } addrs; + }; +}; + +struct ipv6_stable_secret { + bool initialized; + struct in6_addr secret; +}; + +struct ipv6_devconf { + __s32 forwarding; + __s32 hop_limit; + __s32 mtu6; + __s32 accept_ra; + __s32 accept_redirects; + __s32 autoconf; + __s32 dad_transmits; + __s32 rtr_solicits; + __s32 rtr_solicit_interval; + __s32 rtr_solicit_max_interval; + __s32 rtr_solicit_delay; + __s32 force_mld_version; + __s32 mldv1_unsolicited_report_interval; + __s32 mldv2_unsolicited_report_interval; + __s32 use_tempaddr; + __s32 temp_valid_lft; + __s32 temp_prefered_lft; + __s32 regen_max_retry; + __s32 max_desync_factor; + __s32 max_addresses; + __s32 accept_ra_defrtr; + __u32 ra_defrtr_metric; + __s32 accept_ra_min_hop_limit; + __s32 accept_ra_pinfo; + __s32 ignore_routes_with_linkdown; + __s32 accept_ra_rtr_pref; + __s32 rtr_probe_interval; + __s32 accept_ra_rt_info_min_plen; + __s32 accept_ra_rt_info_max_plen; + __s32 proxy_ndp; + __s32 accept_source_route; + __s32 accept_ra_from_local; + __s32 disable_ipv6; + __s32 drop_unicast_in_l2_multicast; + __s32 accept_dad; + __s32 force_tllao; + __s32 ndisc_notify; + __s32 suppress_frag_ndisc; + __s32 accept_ra_mtu; + __s32 drop_unsolicited_na; + __s32 accept_untracked_na; + struct ipv6_stable_secret stable_secret; + __s32 use_oif_addrs_only; + __s32 keep_addr_on_down; + __s32 seg6_enabled; + __u32 enhanced_dad; + __u32 addr_gen_mode; + __s32 disable_policy; + __s32 ndisc_tclass; + __s32 rpl_seg_enabled; + __u32 ioam6_id; + __u32 ioam6_id_wide; + __u8 ioam6_enabled; + __u8 ndisc_evict_nocarrier; + struct ctl_table_header *sysctl_header; +}; + +typedef __u64 __addrpair; + +typedef __u32 __portpair; + +struct hlist_nulls_node { + struct hlist_nulls_node *next; + struct hlist_nulls_node **pprev; +}; + +struct proto; + +struct sock_common { + union { + __addrpair skc_addrpair; + struct { + __be32 skc_daddr; + __be32 skc_rcv_saddr; + }; + }; + union { + unsigned int skc_hash; + __u16 skc_u16hashes[2]; + }; + union { + __portpair skc_portpair; + struct { + __be16 skc_dport; + __u16 skc_num; + }; + }; + short unsigned int skc_family; + volatile unsigned char skc_state; + unsigned char skc_reuse: 4; + unsigned char skc_reuseport: 1; + unsigned char skc_ipv6only: 1; + unsigned char skc_net_refcnt: 1; + int skc_bound_dev_if; + union { + struct hlist_node skc_bind_node; + struct hlist_node skc_portaddr_node; + }; + struct proto *skc_prot; + possible_net_t skc_net; + struct in6_addr skc_v6_daddr; + struct in6_addr skc_v6_rcv_saddr; + atomic64_t skc_cookie; + union { + long unsigned int skc_flags; + struct sock *skc_listener; + struct inet_timewait_death_row *skc_tw_dr; + }; + int skc_dontcopy_begin[0]; + union { + struct hlist_node skc_node; + struct hlist_nulls_node skc_nulls_node; + }; + short unsigned int skc_tx_queue_mapping; + short unsigned int skc_rx_queue_mapping; + union { + int skc_incoming_cpu; + u32 skc_rcv_wnd; + u32 skc_tw_rcv_nxt; + }; + refcount_t skc_refcnt; + int skc_dontcopy_end[0]; + union { + u32 skc_rxhash; + u32 skc_window_clamp; + u32 skc_tw_snd_nxt; + }; +}; + +typedef struct { + spinlock_t slock; + int owned; + wait_queue_head_t wq; + struct lockdep_map dep_map; +} socket_lock_t; + +struct sock_cgroup_data { + struct cgroup *cgroup; + u32 classid; +}; + +typedef struct {} netns_tracker; + +struct sk_filter; + +struct socket_wq; + +struct xfrm_policy; + +struct socket; + +struct sock_reuseport; + +struct sock { + struct sock_common __sk_common; + struct dst_entry *sk_rx_dst; + int sk_rx_dst_ifindex; + u32 sk_rx_dst_cookie; + socket_lock_t sk_lock; + atomic_t sk_drops; + int sk_rcvlowat; + struct sk_buff_head sk_error_queue; + struct sk_buff_head sk_receive_queue; + struct { + atomic_t rmem_alloc; + int len; + struct sk_buff *head; + struct sk_buff *tail; + } sk_backlog; + int sk_forward_alloc; + u32 sk_reserved_mem; + unsigned int sk_ll_usec; + unsigned int sk_napi_id; + int sk_rcvbuf; + struct sk_filter *sk_filter; + union { + struct socket_wq *sk_wq; + struct socket_wq *sk_wq_raw; + }; + struct xfrm_policy *sk_policy[2]; + struct dst_entry *sk_dst_cache; + atomic_t sk_omem_alloc; + int sk_sndbuf; + int sk_wmem_queued; + refcount_t sk_wmem_alloc; + long unsigned int sk_tsq_flags; + union { + struct sk_buff *sk_send_head; + struct rb_root tcp_rtx_queue; + }; + struct sk_buff_head sk_write_queue; + __s32 sk_peek_off; + int sk_write_pending; + __u32 sk_dst_pending_confirm; + u32 sk_pacing_status; + long int sk_sndtimeo; + struct timer_list sk_timer; + __u32 sk_priority; + __u32 sk_mark; + long unsigned int sk_pacing_rate; + long unsigned int sk_max_pacing_rate; + struct page_frag sk_frag; + netdev_features_t sk_route_caps; + int sk_gso_type; + unsigned int sk_gso_max_size; + gfp_t sk_allocation; + __u32 sk_txhash; + u8 sk_gso_disabled: 1; + u8 sk_kern_sock: 1; + u8 sk_no_check_tx: 1; + u8 sk_no_check_rx: 1; + u8 sk_userlocks: 4; + u8 sk_pacing_shift; + u16 sk_type; + u16 sk_protocol; + u16 sk_gso_max_segs; + long unsigned int sk_lingertime; + struct proto *sk_prot_creator; + rwlock_t sk_callback_lock; + int sk_err; + int sk_err_soft; + u32 sk_ack_backlog; + u32 sk_max_ack_backlog; + kuid_t sk_uid; + u8 sk_txrehash; + u8 sk_prefer_busy_poll; + u16 sk_busy_poll_budget; + spinlock_t sk_peer_lock; + int sk_bind_phc; + struct pid *sk_peer_pid; + const struct cred *sk_peer_cred; + long int sk_rcvtimeo; + ktime_t sk_stamp; + atomic_t sk_tskey; + atomic_t sk_zckey; + u32 sk_tsflags; + u8 sk_shutdown; + u8 sk_clockid; + u8 sk_txtime_deadline_mode: 1; + u8 sk_txtime_report_errors: 1; + u8 sk_txtime_unused: 6; + struct socket *sk_socket; + void *sk_user_data; + void *sk_security; + struct sock_cgroup_data sk_cgrp_data; + struct mem_cgroup *sk_memcg; + void (*sk_state_change)(struct sock *); + void (*sk_data_ready)(struct sock *); + void (*sk_write_space)(struct sock *); + void (*sk_error_report)(struct sock *); + int (*sk_backlog_rcv)(struct sock *, struct sk_buff *); + void (*sk_destruct)(struct sock *); + struct sock_reuseport *sk_reuseport_cb; + struct bpf_local_storage *sk_bpf_storage; + struct callback_head sk_rcu; + netns_tracker ns_tracker; + struct hlist_node sk_bind2_node; +}; + +struct ubuf_info; + +struct msghdr { + void *msg_name; + int msg_namelen; + int msg_inq; + struct iov_iter msg_iter; + union { + void *msg_control; + void *msg_control_user; + }; + bool msg_control_is_user: 1; + bool msg_get_inq: 1; + unsigned int msg_flags; + __kernel_size_t msg_controllen; + struct kiocb *msg_iocb; + struct ubuf_info *msg_ubuf; + int (*sg_from_iter)(struct sock *, struct sk_buff *, struct iov_iter *, size_t); +}; + +struct ubuf_info { + void (*callback)(struct sk_buff *, struct ubuf_info *, bool); + refcount_t refcnt; + u8 flags; +}; + +typedef struct { + union { + void *kernel; + void *user; + }; + bool is_kernel: 1; +} sockptr_t; + +typedef enum { + SS_FREE = 0, + SS_UNCONNECTED = 1, + SS_CONNECTING = 2, + SS_CONNECTED = 3, + SS_DISCONNECTING = 4, +} socket_state; + +struct socket_wq { + wait_queue_head_t wait; + struct fasync_struct *fasync_list; + long unsigned int flags; + struct callback_head rcu; + long: 64; + long: 64; +}; + +struct proto_ops; + +struct socket { + socket_state state; + short int type; + long unsigned int flags; + struct file *file; + struct sock *sk; + const struct proto_ops *ops; + long: 64; + long: 64; + long: 64; + struct socket_wq wq; +}; + +typedef struct { + size_t written; + size_t count; + union { + char *buf; + void *data; + } arg; + int error; +} read_descriptor_t; + +typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *, unsigned int, size_t); + +typedef int (*skb_read_actor_t)(struct sock *, struct sk_buff *); + +struct proto_ops { + int family; + struct module *owner; + int (*release)(struct socket *); + int (*bind)(struct socket *, struct sockaddr *, int); + int (*connect)(struct socket *, struct sockaddr *, int, int); + int (*socketpair)(struct socket *, struct socket *); + int (*accept)(struct socket *, struct socket *, int, bool); + int (*getname)(struct socket *, struct sockaddr *, int); + __poll_t (*poll)(struct file *, struct socket *, struct poll_table_struct *); + int (*ioctl)(struct socket *, unsigned int, long unsigned int); + int (*gettstamp)(struct socket *, void *, bool, bool); + int (*listen)(struct socket *, int); + int (*shutdown)(struct socket *, int); + int (*setsockopt)(struct socket *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct socket *, int, int, char *, int *); + void (*show_fdinfo)(struct seq_file *, struct socket *); + int (*sendmsg)(struct socket *, struct msghdr *, size_t); + int (*recvmsg)(struct socket *, struct msghdr *, size_t, int); + int (*mmap)(struct file *, struct socket *, struct vm_area_struct *); + ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int); + ssize_t (*splice_read)(struct socket *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + int (*set_peek_off)(struct sock *, int); + int (*peek_len)(struct socket *); + int (*read_sock)(struct sock *, read_descriptor_t *, sk_read_actor_t); + int (*read_skb)(struct sock *, skb_read_actor_t); + int (*sendpage_locked)(struct sock *, struct page *, int, size_t, int); + int (*sendmsg_locked)(struct sock *, struct msghdr *, size_t); + int (*set_rcvlowat)(struct sock *, int); +}; + +struct flowi_tunnel { + __be64 tun_id; +}; + +struct flowi_common { + int flowic_oif; + int flowic_iif; + int flowic_l3mdev; + __u32 flowic_mark; + __u8 flowic_tos; + __u8 flowic_scope; + __u8 flowic_proto; + __u8 flowic_flags; + __u32 flowic_secid; + kuid_t flowic_uid; + struct flowi_tunnel flowic_tun_key; + __u32 flowic_multipath_hash; +}; + +union flowi_uli { + struct { + __be16 dport; + __be16 sport; + } ports; + struct { + __u8 type; + __u8 code; + } icmpt; + __be32 gre_key; + struct { + __u8 type; + } mht; +}; + +struct flowi4 { + struct flowi_common __fl_common; + __be32 saddr; + __be32 daddr; + union flowi_uli uli; +}; + +struct flowi6 { + struct flowi_common __fl_common; + struct in6_addr daddr; + struct in6_addr saddr; + __be32 flowlabel; + union flowi_uli uli; + __u32 mp_hash; +}; + +struct flowi { + union { + struct flowi_common __fl_common; + struct flowi4 ip4; + struct flowi6 ip6; + } u; +}; + +struct prot_inuse { + int all; + int val[64]; +}; + +struct icmpv6_mib_device { + atomic_long_t mibs[6]; +}; + +struct icmpv6msg_mib_device { + atomic_long_t mibs[512]; +}; + +struct fib_rule; + +struct fib_lookup_arg; + +struct fib_rule_hdr; + +struct fib_rules_ops { + int family; + struct list_head list; + int rule_size; + int addr_size; + int unresolved_rules; + int nr_goto_rules; + unsigned int fib_rules_seq; + int (*action)(struct fib_rule *, struct flowi *, int, struct fib_lookup_arg *); + bool (*suppress)(struct fib_rule *, int, struct fib_lookup_arg *); + int (*match)(struct fib_rule *, struct flowi *, int); + int (*configure)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *, struct nlattr **, struct netlink_ext_ack *); + int (*delete)(struct fib_rule *); + int (*compare)(struct fib_rule *, struct fib_rule_hdr *, struct nlattr **); + int (*fill)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *); + size_t (*nlmsg_payload)(struct fib_rule *); + void (*flush_cache)(struct fib_rules_ops *); + int nlgroup; + struct list_head rules_list; + struct module *owner; + struct net *fro_net; + struct callback_head rcu; +}; + +struct fib_notifier_ops { + int family; + struct list_head list; + unsigned int (*fib_seq_read)(struct net *); + int (*fib_dump)(struct net *, struct notifier_block *, struct netlink_ext_ack *); + struct module *owner; + struct callback_head rcu; +}; + +struct neigh_parms { + possible_net_t net; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head list; + int (*neigh_setup)(struct neighbour *); + struct neigh_table *tbl; + void *sysctl_table; + int dead; + refcount_t refcnt; + struct callback_head callback_head; + int reachable_time; + u32 qlen; + int data[14]; + long unsigned int data_state[1]; +}; + +struct ipv6_devstat { + struct proc_dir_entry *proc_dir_entry; + struct ipstats_mib *ipv6; + struct icmpv6_mib_device *icmpv6dev; + struct icmpv6msg_mib_device *icmpv6msgdev; +}; + +struct ifmcaddr6; + +struct ifacaddr6; + +struct inet6_dev { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct list_head addr_list; + struct ifmcaddr6 *mc_list; + struct ifmcaddr6 *mc_tomb; + unsigned char mc_qrv; + unsigned char mc_gq_running; + unsigned char mc_ifc_count; + unsigned char mc_dad_count; + long unsigned int mc_v1_seen; + long unsigned int mc_qi; + long unsigned int mc_qri; + long unsigned int mc_maxdelay; + struct delayed_work mc_gq_work; + struct delayed_work mc_ifc_work; + struct delayed_work mc_dad_work; + struct delayed_work mc_query_work; + struct delayed_work mc_report_work; + struct sk_buff_head mc_query_queue; + struct sk_buff_head mc_report_queue; + spinlock_t mc_query_lock; + spinlock_t mc_report_lock; + struct mutex mc_lock; + struct ifacaddr6 *ac_list; + rwlock_t lock; + refcount_t refcnt; + __u32 if_flags; + int dead; + u32 desync_factor; + struct list_head tempaddr_list; + struct in6_addr token; + struct neigh_parms *nd_parms; + struct ipv6_devconf cnf; + struct ipv6_devstat stats; + struct timer_list rs_timer; + __s32 rs_interval; + __u8 rs_probes; + long unsigned int tstamp; + struct callback_head rcu; + unsigned int ra_mtu; +}; + +enum { + RTAX_UNSPEC = 0, + RTAX_LOCK = 1, + RTAX_MTU = 2, + RTAX_WINDOW = 3, + RTAX_RTT = 4, + RTAX_RTTVAR = 5, + RTAX_SSTHRESH = 6, + RTAX_CWND = 7, + RTAX_ADVMSS = 8, + RTAX_REORDERING = 9, + RTAX_HOPLIMIT = 10, + RTAX_INITCWND = 11, + RTAX_FEATURES = 12, + RTAX_RTO_MIN = 13, + RTAX_INITRWND = 14, + RTAX_QUICKACK = 15, + RTAX_CC_ALGO = 16, + RTAX_FASTOPEN_NO_COOKIE = 17, + __RTAX_MAX = 18, +}; + +enum { + NEIGH_VAR_MCAST_PROBES = 0, + NEIGH_VAR_UCAST_PROBES = 1, + NEIGH_VAR_APP_PROBES = 2, + NEIGH_VAR_MCAST_REPROBES = 3, + NEIGH_VAR_RETRANS_TIME = 4, + NEIGH_VAR_BASE_REACHABLE_TIME = 5, + NEIGH_VAR_DELAY_PROBE_TIME = 6, + NEIGH_VAR_INTERVAL_PROBE_TIME_MS = 7, + NEIGH_VAR_GC_STALETIME = 8, + NEIGH_VAR_QUEUE_LEN_BYTES = 9, + NEIGH_VAR_PROXY_QLEN = 10, + NEIGH_VAR_ANYCAST_DELAY = 11, + NEIGH_VAR_PROXY_DELAY = 12, + NEIGH_VAR_LOCKTIME = 13, + NEIGH_VAR_QUEUE_LEN = 14, + NEIGH_VAR_RETRANS_TIME_MS = 15, + NEIGH_VAR_BASE_REACHABLE_TIME_MS = 16, + NEIGH_VAR_GC_INTERVAL = 17, + NEIGH_VAR_GC_THRESH1 = 18, + NEIGH_VAR_GC_THRESH2 = 19, + NEIGH_VAR_GC_THRESH3 = 20, + NEIGH_VAR_MAX = 21, +}; + +struct pneigh_entry; + +struct neigh_statistics; + +struct neigh_hash_table; + +struct neigh_table { + int family; + unsigned int entry_size; + unsigned int key_len; + __be16 protocol; + __u32 (*hash)(const void *, const struct net_device *, __u32 *); + bool (*key_eq)(const struct neighbour *, const void *); + int (*constructor)(struct neighbour *); + int (*pconstructor)(struct pneigh_entry *); + void (*pdestructor)(struct pneigh_entry *); + void (*proxy_redo)(struct sk_buff *); + int (*is_multicast)(const void *); + bool (*allow_add)(const struct net_device *, struct netlink_ext_ack *); + char *id; + struct neigh_parms parms; + struct list_head parms_list; + int gc_interval; + int gc_thresh1; + int gc_thresh2; + int gc_thresh3; + long unsigned int last_flush; + struct delayed_work gc_work; + struct delayed_work managed_work; + struct timer_list proxy_timer; + struct sk_buff_head proxy_queue; + atomic_t entries; + atomic_t gc_entries; + struct list_head gc_list; + struct list_head managed_list; + rwlock_t lock; + long unsigned int last_rand; + struct neigh_statistics *stats; + struct neigh_hash_table *nht; + struct pneigh_entry **phash_buckets; +}; + +struct neigh_statistics { + long unsigned int allocs; + long unsigned int destroys; + long unsigned int hash_grows; + long unsigned int res_failed; + long unsigned int lookups; + long unsigned int hits; + long unsigned int rcv_probes_mcast; + long unsigned int rcv_probes_ucast; + long unsigned int periodic_gc_runs; + long unsigned int forced_gc_runs; + long unsigned int unres_discards; + long unsigned int table_fulls; +}; + +struct neigh_ops { + int family; + void (*solicit)(struct neighbour *, struct sk_buff *); + void (*error_report)(struct neighbour *, struct sk_buff *); + int (*output)(struct neighbour *, struct sk_buff *); + int (*connected_output)(struct neighbour *, struct sk_buff *); +}; + +struct pneigh_entry { + struct pneigh_entry *next; + possible_net_t net; + struct net_device *dev; + netdevice_tracker dev_tracker; + u32 flags; + u8 protocol; + u8 key[0]; +}; + +struct neigh_hash_table { + struct neighbour **hash_buckets; + unsigned int hash_shift; + __u32 hash_rnd[4]; + struct callback_head rcu; +}; + +enum { + TCP_ESTABLISHED = 1, + TCP_SYN_SENT = 2, + TCP_SYN_RECV = 3, + TCP_FIN_WAIT1 = 4, + TCP_FIN_WAIT2 = 5, + TCP_TIME_WAIT = 6, + TCP_CLOSE = 7, + TCP_CLOSE_WAIT = 8, + TCP_LAST_ACK = 9, + TCP_LISTEN = 10, + TCP_CLOSING = 11, + TCP_NEW_SYN_RECV = 12, + TCP_MAX_STATES = 13, +}; + +struct fib_rule_hdr { + __u8 family; + __u8 dst_len; + __u8 src_len; + __u8 tos; + __u8 table; + __u8 res1; + __u8 res2; + __u8 action; + __u32 flags; +}; + +struct fib_rule_port_range { + __u16 start; + __u16 end; +}; + +struct fib_kuid_range { + kuid_t start; + kuid_t end; +}; + +struct fib_rule { + struct list_head list; + int iifindex; + int oifindex; + u32 mark; + u32 mark_mask; + u32 flags; + u32 table; + u8 action; + u8 l3mdev; + u8 proto; + u8 ip_proto; + u32 target; + __be64 tun_id; + struct fib_rule *ctarget; + struct net *fr_net; + refcount_t refcnt; + u32 pref; + int suppress_ifgroup; + int suppress_prefixlen; + char iifname[16]; + char oifname[16]; + struct fib_kuid_range uid_range; + struct fib_rule_port_range sport_range; + struct fib_rule_port_range dport_range; + struct callback_head rcu; +}; + +struct fib_lookup_arg { + void *lookup_ptr; + const void *lookup_data; + void *result; + struct fib_rule *rule; + u32 table; + int flags; +}; + +struct smc_hashinfo; + +struct sk_psock; + +struct request_sock_ops; + +struct timewait_sock_ops; + +struct raw_hashinfo; + +struct proto { + void (*close)(struct sock *, long int); + int (*pre_connect)(struct sock *, struct sockaddr *, int); + int (*connect)(struct sock *, struct sockaddr *, int); + int (*disconnect)(struct sock *, int); + struct sock * (*accept)(struct sock *, int, int *, bool); + int (*ioctl)(struct sock *, int, long unsigned int); + int (*init)(struct sock *); + void (*destroy)(struct sock *); + void (*shutdown)(struct sock *, int); + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*keepalive)(struct sock *, int); + int (*sendmsg)(struct sock *, struct msghdr *, size_t); + int (*recvmsg)(struct sock *, struct msghdr *, size_t, int, int *); + int (*sendpage)(struct sock *, struct page *, int, size_t, int); + int (*bind)(struct sock *, struct sockaddr *, int); + int (*bind_add)(struct sock *, struct sockaddr *, int); + int (*backlog_rcv)(struct sock *, struct sk_buff *); + bool (*bpf_bypass_getsockopt)(int, int); + void (*release_cb)(struct sock *); + int (*hash)(struct sock *); + void (*unhash)(struct sock *); + void (*rehash)(struct sock *); + int (*get_port)(struct sock *, short unsigned int); + void (*put_port)(struct sock *); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + unsigned int inuse_idx; + int (*forward_alloc_get)(const struct sock *); + bool (*stream_memory_free)(const struct sock *, int); + bool (*sock_is_readable)(struct sock *); + void (*enter_memory_pressure)(struct sock *); + void (*leave_memory_pressure)(struct sock *); + atomic_long_t *memory_allocated; + int *per_cpu_fw_alloc; + struct percpu_counter *sockets_allocated; + long unsigned int *memory_pressure; + long int *sysctl_mem; + int *sysctl_wmem; + int *sysctl_rmem; + u32 sysctl_wmem_offset; + u32 sysctl_rmem_offset; + int max_header; + bool no_autobind; + struct kmem_cache *slab; + unsigned int obj_size; + slab_flags_t slab_flags; + unsigned int useroffset; + unsigned int usersize; + unsigned int *orphan_count; + struct request_sock_ops *rsk_prot; + struct timewait_sock_ops *twsk_prot; + union { + struct inet_hashinfo *hashinfo; + struct udp_table *udp_table; + struct raw_hashinfo *raw_hash; + struct smc_hashinfo *smc_hash; + } h; + struct module *owner; + char name[32]; + struct list_head node; + int (*diag_destroy)(struct sock *, int); +}; + +struct request_sock; + +struct request_sock_ops { + int family; + unsigned int obj_size; + struct kmem_cache *slab; + char *slab_name; + int (*rtx_syn_ack)(const struct sock *, struct request_sock *); + void (*send_ack)(const struct sock *, struct sk_buff *, struct request_sock *); + void (*send_reset)(const struct sock *, struct sk_buff *); + void (*destructor)(struct request_sock *); + void (*syn_ack_timeout)(const struct request_sock *); +}; + +struct timewait_sock_ops { + struct kmem_cache *twsk_slab; + char *twsk_slab_name; + unsigned int twsk_obj_size; + int (*twsk_unique)(struct sock *, struct sock *, void *); + void (*twsk_destructor)(struct sock *); +}; + +struct saved_syn; + +struct request_sock { + struct sock_common __req_common; + struct request_sock *dl_next; + u16 mss; + u8 num_retrans; + u8 syncookie: 1; + u8 num_timeout: 7; + u32 ts_recent; + struct timer_list rsk_timer; + const struct request_sock_ops *rsk_ops; + struct sock *sk; + struct saved_syn *saved_syn; + u32 secid; + u32 peer_secid; + u32 timeout; +}; + +struct saved_syn { + u32 mac_hdrlen; + u32 network_hdrlen; + u32 tcp_hdrlen; + u8 data[0]; +}; + +enum tsq_enum { + TSQ_THROTTLED = 0, + TSQ_QUEUED = 1, + TCP_TSQ_DEFERRED = 2, + TCP_WRITE_TIMER_DEFERRED = 3, + TCP_DELACK_TIMER_DEFERRED = 4, + TCP_MTU_REDUCED_DEFERRED = 5, +}; + +struct ip6_sf_list { + struct ip6_sf_list *sf_next; + struct in6_addr sf_addr; + long unsigned int sf_count[2]; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; + struct callback_head rcu; +}; + +struct ifmcaddr6 { + struct in6_addr mca_addr; + struct inet6_dev *idev; + struct ifmcaddr6 *next; + struct ip6_sf_list *mca_sources; + struct ip6_sf_list *mca_tomb; + unsigned int mca_sfmode; + unsigned char mca_crcount; + long unsigned int mca_sfcount[2]; + struct delayed_work mca_work; + unsigned int mca_flags; + int mca_users; + refcount_t mca_refcnt; + long unsigned int mca_cstamp; + long unsigned int mca_tstamp; + struct callback_head rcu; +}; + +struct ifacaddr6 { + struct in6_addr aca_addr; + struct fib6_info *aca_rt; + struct ifacaddr6 *aca_next; + struct hlist_node aca_addr_lst; + int aca_users; + refcount_t aca_refcnt; + long unsigned int aca_cstamp; + long unsigned int aca_tstamp; + struct callback_head rcu; +}; + +enum { + IP6_FH_F_FRAG = 1, + IP6_FH_F_AUTH = 2, + IP6_FH_F_SKIP_RH = 4, +}; + +typedef unsigned char Byte; + +typedef long unsigned int uLong; + +struct internal_state; + +struct z_stream_s { + const Byte *next_in; + uLong avail_in; + uLong total_in; + Byte *next_out; + uLong avail_out; + uLong total_out; + char *msg; + struct internal_state *state; + void *workspace; + int data_type; + uLong adler; + uLong reserved; +}; + +typedef struct z_stream_s z_stream; + +typedef z_stream *z_streamp; + +typedef struct { + unsigned char op; + unsigned char bits; + short unsigned int val; +} code; + +typedef enum { + HEAD = 0, + FLAGS = 1, + TIME = 2, + OS = 3, + EXLEN = 4, + EXTRA = 5, + NAME = 6, + COMMENT = 7, + HCRC = 8, + DICTID = 9, + DICT = 10, + TYPE = 11, + TYPEDO = 12, + STORED = 13, + COPY = 14, + TABLE = 15, + LENLENS = 16, + CODELENS = 17, + LEN = 18, + LENEXT = 19, + DIST = 20, + DISTEXT = 21, + MATCH = 22, + LIT = 23, + CHECK = 24, + LENGTH = 25, + DONE = 26, + BAD = 27, + MEM = 28, + SYNC = 29, +} inflate_mode; + +struct inflate_state { + inflate_mode mode; + int last; + int wrap; + int havedict; + int flags; + unsigned int dmax; + long unsigned int check; + long unsigned int total; + unsigned int wbits; + unsigned int wsize; + unsigned int whave; + unsigned int write; + unsigned char *window; + long unsigned int hold; + unsigned int bits; + unsigned int length; + unsigned int offset; + unsigned int extra; + const code *lencode; + const code *distcode; + unsigned int lenbits; + unsigned int distbits; + unsigned int ncode; + unsigned int nlen; + unsigned int ndist; + unsigned int have; + code *next; + short unsigned int lens[320]; + short unsigned int work[288]; + code codes[2048]; +}; + +struct inflate_workspace { + struct inflate_state inflate_state; + unsigned char working_window[32768]; +}; + +struct xz_dec; + +struct __va_list { + void *__stack; + void *__gr_top; + void *__vr_top; + int __gr_offs; + int __vr_offs; +}; + +typedef struct __va_list va_list; + +enum kobject_action { + KOBJ_ADD = 0, + KOBJ_REMOVE = 1, + KOBJ_CHANGE = 2, + KOBJ_MOVE = 3, + KOBJ_ONLINE = 4, + KOBJ_OFFLINE = 5, + KOBJ_BIND = 6, + KOBJ_UNBIND = 7, +}; + +struct scm_creds { + u32 pid; + kuid_t uid; + kgid_t gid; +}; + +struct netlink_skb_parms { + struct scm_creds creds; + __u32 portid; + __u32 dst_group; + __u32 flags; + struct sock *sk; + bool nsid_is_set; + int nsid; +}; + +struct netlink_kernel_cfg { + unsigned int groups; + unsigned int flags; + void (*input)(struct sk_buff *); + struct mutex *cb_mutex; + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); + bool (*compare)(struct net *, struct sock *); +}; + +enum { + IPSTATS_MIB_NUM = 0, + IPSTATS_MIB_INPKTS = 1, + IPSTATS_MIB_INOCTETS = 2, + IPSTATS_MIB_INDELIVERS = 3, + IPSTATS_MIB_OUTFORWDATAGRAMS = 4, + IPSTATS_MIB_OUTPKTS = 5, + IPSTATS_MIB_OUTOCTETS = 6, + IPSTATS_MIB_INHDRERRORS = 7, + IPSTATS_MIB_INTOOBIGERRORS = 8, + IPSTATS_MIB_INNOROUTES = 9, + IPSTATS_MIB_INADDRERRORS = 10, + IPSTATS_MIB_INUNKNOWNPROTOS = 11, + IPSTATS_MIB_INTRUNCATEDPKTS = 12, + IPSTATS_MIB_INDISCARDS = 13, + IPSTATS_MIB_OUTDISCARDS = 14, + IPSTATS_MIB_OUTNOROUTES = 15, + IPSTATS_MIB_REASMTIMEOUT = 16, + IPSTATS_MIB_REASMREQDS = 17, + IPSTATS_MIB_REASMOKS = 18, + IPSTATS_MIB_REASMFAILS = 19, + IPSTATS_MIB_FRAGOKS = 20, + IPSTATS_MIB_FRAGFAILS = 21, + IPSTATS_MIB_FRAGCREATES = 22, + IPSTATS_MIB_INMCASTPKTS = 23, + IPSTATS_MIB_OUTMCASTPKTS = 24, + IPSTATS_MIB_INBCASTPKTS = 25, + IPSTATS_MIB_OUTBCASTPKTS = 26, + IPSTATS_MIB_INMCASTOCTETS = 27, + IPSTATS_MIB_OUTMCASTOCTETS = 28, + IPSTATS_MIB_INBCASTOCTETS = 29, + IPSTATS_MIB_OUTBCASTOCTETS = 30, + IPSTATS_MIB_CSUMERRORS = 31, + IPSTATS_MIB_NOECTPKTS = 32, + IPSTATS_MIB_ECT1PKTS = 33, + IPSTATS_MIB_ECT0PKTS = 34, + IPSTATS_MIB_CEPKTS = 35, + IPSTATS_MIB_REASM_OVERLAPS = 36, + __IPSTATS_MIB_MAX = 37, +}; + +enum { + ICMP_MIB_NUM = 0, + ICMP_MIB_INMSGS = 1, + ICMP_MIB_INERRORS = 2, + ICMP_MIB_INDESTUNREACHS = 3, + ICMP_MIB_INTIMEEXCDS = 4, + ICMP_MIB_INPARMPROBS = 5, + ICMP_MIB_INSRCQUENCHS = 6, + ICMP_MIB_INREDIRECTS = 7, + ICMP_MIB_INECHOS = 8, + ICMP_MIB_INECHOREPS = 9, + ICMP_MIB_INTIMESTAMPS = 10, + ICMP_MIB_INTIMESTAMPREPS = 11, + ICMP_MIB_INADDRMASKS = 12, + ICMP_MIB_INADDRMASKREPS = 13, + ICMP_MIB_OUTMSGS = 14, + ICMP_MIB_OUTERRORS = 15, + ICMP_MIB_OUTDESTUNREACHS = 16, + ICMP_MIB_OUTTIMEEXCDS = 17, + ICMP_MIB_OUTPARMPROBS = 18, + ICMP_MIB_OUTSRCQUENCHS = 19, + ICMP_MIB_OUTREDIRECTS = 20, + ICMP_MIB_OUTECHOS = 21, + ICMP_MIB_OUTECHOREPS = 22, + ICMP_MIB_OUTTIMESTAMPS = 23, + ICMP_MIB_OUTTIMESTAMPREPS = 24, + ICMP_MIB_OUTADDRMASKS = 25, + ICMP_MIB_OUTADDRMASKREPS = 26, + ICMP_MIB_CSUMERRORS = 27, + __ICMP_MIB_MAX = 28, +}; + +enum { + ICMP6_MIB_NUM = 0, + ICMP6_MIB_INMSGS = 1, + ICMP6_MIB_INERRORS = 2, + ICMP6_MIB_OUTMSGS = 3, + ICMP6_MIB_OUTERRORS = 4, + ICMP6_MIB_CSUMERRORS = 5, + __ICMP6_MIB_MAX = 6, +}; + +enum { + TCP_MIB_NUM = 0, + TCP_MIB_RTOALGORITHM = 1, + TCP_MIB_RTOMIN = 2, + TCP_MIB_RTOMAX = 3, + TCP_MIB_MAXCONN = 4, + TCP_MIB_ACTIVEOPENS = 5, + TCP_MIB_PASSIVEOPENS = 6, + TCP_MIB_ATTEMPTFAILS = 7, + TCP_MIB_ESTABRESETS = 8, + TCP_MIB_CURRESTAB = 9, + TCP_MIB_INSEGS = 10, + TCP_MIB_OUTSEGS = 11, + TCP_MIB_RETRANSSEGS = 12, + TCP_MIB_INERRS = 13, + TCP_MIB_OUTRSTS = 14, + TCP_MIB_CSUMERRORS = 15, + __TCP_MIB_MAX = 16, +}; + +enum { + UDP_MIB_NUM = 0, + UDP_MIB_INDATAGRAMS = 1, + UDP_MIB_NOPORTS = 2, + UDP_MIB_INERRORS = 3, + UDP_MIB_OUTDATAGRAMS = 4, + UDP_MIB_RCVBUFERRORS = 5, + UDP_MIB_SNDBUFERRORS = 6, + UDP_MIB_CSUMERRORS = 7, + UDP_MIB_IGNOREDMULTI = 8, + UDP_MIB_MEMERRORS = 9, + __UDP_MIB_MAX = 10, +}; + +enum { + LINUX_MIB_NUM = 0, + LINUX_MIB_SYNCOOKIESSENT = 1, + LINUX_MIB_SYNCOOKIESRECV = 2, + LINUX_MIB_SYNCOOKIESFAILED = 3, + LINUX_MIB_EMBRYONICRSTS = 4, + LINUX_MIB_PRUNECALLED = 5, + LINUX_MIB_RCVPRUNED = 6, + LINUX_MIB_OFOPRUNED = 7, + LINUX_MIB_OUTOFWINDOWICMPS = 8, + LINUX_MIB_LOCKDROPPEDICMPS = 9, + LINUX_MIB_ARPFILTER = 10, + LINUX_MIB_TIMEWAITED = 11, + LINUX_MIB_TIMEWAITRECYCLED = 12, + LINUX_MIB_TIMEWAITKILLED = 13, + LINUX_MIB_PAWSACTIVEREJECTED = 14, + LINUX_MIB_PAWSESTABREJECTED = 15, + LINUX_MIB_DELAYEDACKS = 16, + LINUX_MIB_DELAYEDACKLOCKED = 17, + LINUX_MIB_DELAYEDACKLOST = 18, + LINUX_MIB_LISTENOVERFLOWS = 19, + LINUX_MIB_LISTENDROPS = 20, + LINUX_MIB_TCPHPHITS = 21, + LINUX_MIB_TCPPUREACKS = 22, + LINUX_MIB_TCPHPACKS = 23, + LINUX_MIB_TCPRENORECOVERY = 24, + LINUX_MIB_TCPSACKRECOVERY = 25, + LINUX_MIB_TCPSACKRENEGING = 26, + LINUX_MIB_TCPSACKREORDER = 27, + LINUX_MIB_TCPRENOREORDER = 28, + LINUX_MIB_TCPTSREORDER = 29, + LINUX_MIB_TCPFULLUNDO = 30, + LINUX_MIB_TCPPARTIALUNDO = 31, + LINUX_MIB_TCPDSACKUNDO = 32, + LINUX_MIB_TCPLOSSUNDO = 33, + LINUX_MIB_TCPLOSTRETRANSMIT = 34, + LINUX_MIB_TCPRENOFAILURES = 35, + LINUX_MIB_TCPSACKFAILURES = 36, + LINUX_MIB_TCPLOSSFAILURES = 37, + LINUX_MIB_TCPFASTRETRANS = 38, + LINUX_MIB_TCPSLOWSTARTRETRANS = 39, + LINUX_MIB_TCPTIMEOUTS = 40, + LINUX_MIB_TCPLOSSPROBES = 41, + LINUX_MIB_TCPLOSSPROBERECOVERY = 42, + LINUX_MIB_TCPRENORECOVERYFAIL = 43, + LINUX_MIB_TCPSACKRECOVERYFAIL = 44, + LINUX_MIB_TCPRCVCOLLAPSED = 45, + LINUX_MIB_TCPDSACKOLDSENT = 46, + LINUX_MIB_TCPDSACKOFOSENT = 47, + LINUX_MIB_TCPDSACKRECV = 48, + LINUX_MIB_TCPDSACKOFORECV = 49, + LINUX_MIB_TCPABORTONDATA = 50, + LINUX_MIB_TCPABORTONCLOSE = 51, + LINUX_MIB_TCPABORTONMEMORY = 52, + LINUX_MIB_TCPABORTONTIMEOUT = 53, + LINUX_MIB_TCPABORTONLINGER = 54, + LINUX_MIB_TCPABORTFAILED = 55, + LINUX_MIB_TCPMEMORYPRESSURES = 56, + LINUX_MIB_TCPMEMORYPRESSURESCHRONO = 57, + LINUX_MIB_TCPSACKDISCARD = 58, + LINUX_MIB_TCPDSACKIGNOREDOLD = 59, + LINUX_MIB_TCPDSACKIGNOREDNOUNDO = 60, + LINUX_MIB_TCPSPURIOUSRTOS = 61, + LINUX_MIB_TCPMD5NOTFOUND = 62, + LINUX_MIB_TCPMD5UNEXPECTED = 63, + LINUX_MIB_TCPMD5FAILURE = 64, + LINUX_MIB_SACKSHIFTED = 65, + LINUX_MIB_SACKMERGED = 66, + LINUX_MIB_SACKSHIFTFALLBACK = 67, + LINUX_MIB_TCPBACKLOGDROP = 68, + LINUX_MIB_PFMEMALLOCDROP = 69, + LINUX_MIB_TCPMINTTLDROP = 70, + LINUX_MIB_TCPDEFERACCEPTDROP = 71, + LINUX_MIB_IPRPFILTER = 72, + LINUX_MIB_TCPTIMEWAITOVERFLOW = 73, + LINUX_MIB_TCPREQQFULLDOCOOKIES = 74, + LINUX_MIB_TCPREQQFULLDROP = 75, + LINUX_MIB_TCPRETRANSFAIL = 76, + LINUX_MIB_TCPRCVCOALESCE = 77, + LINUX_MIB_TCPBACKLOGCOALESCE = 78, + LINUX_MIB_TCPOFOQUEUE = 79, + LINUX_MIB_TCPOFODROP = 80, + LINUX_MIB_TCPOFOMERGE = 81, + LINUX_MIB_TCPCHALLENGEACK = 82, + LINUX_MIB_TCPSYNCHALLENGE = 83, + LINUX_MIB_TCPFASTOPENACTIVE = 84, + LINUX_MIB_TCPFASTOPENACTIVEFAIL = 85, + LINUX_MIB_TCPFASTOPENPASSIVE = 86, + LINUX_MIB_TCPFASTOPENPASSIVEFAIL = 87, + LINUX_MIB_TCPFASTOPENLISTENOVERFLOW = 88, + LINUX_MIB_TCPFASTOPENCOOKIEREQD = 89, + LINUX_MIB_TCPFASTOPENBLACKHOLE = 90, + LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES = 91, + LINUX_MIB_BUSYPOLLRXPACKETS = 92, + LINUX_MIB_TCPAUTOCORKING = 93, + LINUX_MIB_TCPFROMZEROWINDOWADV = 94, + LINUX_MIB_TCPTOZEROWINDOWADV = 95, + LINUX_MIB_TCPWANTZEROWINDOWADV = 96, + LINUX_MIB_TCPSYNRETRANS = 97, + LINUX_MIB_TCPORIGDATASENT = 98, + LINUX_MIB_TCPHYSTARTTRAINDETECT = 99, + LINUX_MIB_TCPHYSTARTTRAINCWND = 100, + LINUX_MIB_TCPHYSTARTDELAYDETECT = 101, + LINUX_MIB_TCPHYSTARTDELAYCWND = 102, + LINUX_MIB_TCPACKSKIPPEDSYNRECV = 103, + LINUX_MIB_TCPACKSKIPPEDPAWS = 104, + LINUX_MIB_TCPACKSKIPPEDSEQ = 105, + LINUX_MIB_TCPACKSKIPPEDFINWAIT2 = 106, + LINUX_MIB_TCPACKSKIPPEDTIMEWAIT = 107, + LINUX_MIB_TCPACKSKIPPEDCHALLENGE = 108, + LINUX_MIB_TCPWINPROBE = 109, + LINUX_MIB_TCPKEEPALIVE = 110, + LINUX_MIB_TCPMTUPFAIL = 111, + LINUX_MIB_TCPMTUPSUCCESS = 112, + LINUX_MIB_TCPDELIVERED = 113, + LINUX_MIB_TCPDELIVEREDCE = 114, + LINUX_MIB_TCPACKCOMPRESSED = 115, + LINUX_MIB_TCPZEROWINDOWDROP = 116, + LINUX_MIB_TCPRCVQDROP = 117, + LINUX_MIB_TCPWQUEUETOOBIG = 118, + LINUX_MIB_TCPFASTOPENPASSIVEALTKEY = 119, + LINUX_MIB_TCPTIMEOUTREHASH = 120, + LINUX_MIB_TCPDUPLICATEDATAREHASH = 121, + LINUX_MIB_TCPDSACKRECVSEGS = 122, + LINUX_MIB_TCPDSACKIGNOREDDUBIOUS = 123, + LINUX_MIB_TCPMIGRATEREQSUCCESS = 124, + LINUX_MIB_TCPMIGRATEREQFAILURE = 125, + LINUX_MIB_TCPPLBREHASH = 126, + __LINUX_MIB_MAX = 127, +}; + +enum { + LINUX_MIB_XFRMNUM = 0, + LINUX_MIB_XFRMINERROR = 1, + LINUX_MIB_XFRMINBUFFERERROR = 2, + LINUX_MIB_XFRMINHDRERROR = 3, + LINUX_MIB_XFRMINNOSTATES = 4, + LINUX_MIB_XFRMINSTATEPROTOERROR = 5, + LINUX_MIB_XFRMINSTATEMODEERROR = 6, + LINUX_MIB_XFRMINSTATESEQERROR = 7, + LINUX_MIB_XFRMINSTATEEXPIRED = 8, + LINUX_MIB_XFRMINSTATEMISMATCH = 9, + LINUX_MIB_XFRMINSTATEINVALID = 10, + LINUX_MIB_XFRMINTMPLMISMATCH = 11, + LINUX_MIB_XFRMINNOPOLS = 12, + LINUX_MIB_XFRMINPOLBLOCK = 13, + LINUX_MIB_XFRMINPOLERROR = 14, + LINUX_MIB_XFRMOUTERROR = 15, + LINUX_MIB_XFRMOUTBUNDLEGENERROR = 16, + LINUX_MIB_XFRMOUTBUNDLECHECKERROR = 17, + LINUX_MIB_XFRMOUTNOSTATES = 18, + LINUX_MIB_XFRMOUTSTATEPROTOERROR = 19, + LINUX_MIB_XFRMOUTSTATEMODEERROR = 20, + LINUX_MIB_XFRMOUTSTATESEQERROR = 21, + LINUX_MIB_XFRMOUTSTATEEXPIRED = 22, + LINUX_MIB_XFRMOUTPOLBLOCK = 23, + LINUX_MIB_XFRMOUTPOLDEAD = 24, + LINUX_MIB_XFRMOUTPOLERROR = 25, + LINUX_MIB_XFRMFWDHDRERROR = 26, + LINUX_MIB_XFRMOUTSTATEINVALID = 27, + LINUX_MIB_XFRMACQUIREERROR = 28, + __LINUX_MIB_XFRMMAX = 29, +}; + +enum { + LINUX_MIB_TLSNUM = 0, + LINUX_MIB_TLSCURRTXSW = 1, + LINUX_MIB_TLSCURRRXSW = 2, + LINUX_MIB_TLSCURRTXDEVICE = 3, + LINUX_MIB_TLSCURRRXDEVICE = 4, + LINUX_MIB_TLSTXSW = 5, + LINUX_MIB_TLSRXSW = 6, + LINUX_MIB_TLSTXDEVICE = 7, + LINUX_MIB_TLSRXDEVICE = 8, + LINUX_MIB_TLSDECRYPTERROR = 9, + LINUX_MIB_TLSRXDEVICERESYNC = 10, + LINUX_MIB_TLSDECRYPTRETRY = 11, + LINUX_MIB_TLSRXNOPADVIOL = 12, + __LINUX_MIB_TLSMAX = 13, +}; + +enum nf_inet_hooks { + NF_INET_PRE_ROUTING = 0, + NF_INET_LOCAL_IN = 1, + NF_INET_FORWARD = 2, + NF_INET_LOCAL_OUT = 3, + NF_INET_POST_ROUTING = 4, + NF_INET_NUMHOOKS = 5, + NF_INET_INGRESS = 5, +}; + +enum { + NFPROTO_UNSPEC = 0, + NFPROTO_INET = 1, + NFPROTO_IPV4 = 2, + NFPROTO_ARP = 3, + NFPROTO_NETDEV = 5, + NFPROTO_BRIDGE = 7, + NFPROTO_IPV6 = 10, + NFPROTO_NUMPROTO = 11, +}; + +enum tcp_conntrack { + TCP_CONNTRACK_NONE = 0, + TCP_CONNTRACK_SYN_SENT = 1, + TCP_CONNTRACK_SYN_RECV = 2, + TCP_CONNTRACK_ESTABLISHED = 3, + TCP_CONNTRACK_FIN_WAIT = 4, + TCP_CONNTRACK_CLOSE_WAIT = 5, + TCP_CONNTRACK_LAST_ACK = 6, + TCP_CONNTRACK_TIME_WAIT = 7, + TCP_CONNTRACK_CLOSE = 8, + TCP_CONNTRACK_LISTEN = 9, + TCP_CONNTRACK_MAX = 10, + TCP_CONNTRACK_IGNORE = 11, + TCP_CONNTRACK_RETRANS = 12, + TCP_CONNTRACK_UNACK = 13, + TCP_CONNTRACK_TIMEOUT_MAX = 14, +}; + +enum ct_dccp_states { + CT_DCCP_NONE = 0, + CT_DCCP_REQUEST = 1, + CT_DCCP_RESPOND = 2, + CT_DCCP_PARTOPEN = 3, + CT_DCCP_OPEN = 4, + CT_DCCP_CLOSEREQ = 5, + CT_DCCP_CLOSING = 6, + CT_DCCP_TIMEWAIT = 7, + CT_DCCP_IGNORE = 8, + CT_DCCP_INVALID = 9, + __CT_DCCP_MAX = 10, +}; + +enum ip_conntrack_dir { + IP_CT_DIR_ORIGINAL = 0, + IP_CT_DIR_REPLY = 1, + IP_CT_DIR_MAX = 2, +}; + +enum sctp_conntrack { + SCTP_CONNTRACK_NONE = 0, + SCTP_CONNTRACK_CLOSED = 1, + SCTP_CONNTRACK_COOKIE_WAIT = 2, + SCTP_CONNTRACK_COOKIE_ECHOED = 3, + SCTP_CONNTRACK_ESTABLISHED = 4, + SCTP_CONNTRACK_SHUTDOWN_SENT = 5, + SCTP_CONNTRACK_SHUTDOWN_RECD = 6, + SCTP_CONNTRACK_SHUTDOWN_ACK_SENT = 7, + SCTP_CONNTRACK_HEARTBEAT_SENT = 8, + SCTP_CONNTRACK_HEARTBEAT_ACKED = 9, + SCTP_CONNTRACK_DATA_SENT = 10, + SCTP_CONNTRACK_MAX = 11, +}; + +enum udp_conntrack { + UDP_CT_UNREPLIED = 0, + UDP_CT_REPLIED = 1, + UDP_CT_MAX = 2, +}; + +enum { + XFRM_POLICY_IN = 0, + XFRM_POLICY_OUT = 1, + XFRM_POLICY_FWD = 2, + XFRM_POLICY_MASK = 3, + XFRM_POLICY_MAX = 3, +}; + +enum netns_bpf_attach_type { + NETNS_BPF_INVALID = -1, + NETNS_BPF_FLOW_DISSECTOR = 0, + NETNS_BPF_SK_LOOKUP = 1, + MAX_NETNS_BPF_ATTACH_TYPE = 2, +}; + +struct uevent_sock { + struct list_head list; + struct sock *sk; +}; + +struct pernet_operations { + struct list_head list; + int (*init)(struct net *); + void (*pre_exit)(struct net *); + void (*exit)(struct net *); + void (*exit_batch)(struct list_head *); + unsigned int *id; + size_t size; +}; + +typedef int (*initcall_t)(); + +typedef int initcall_entry_t; + +struct obs_kernel_param { + const char *str; + int (*setup_func)(char *); + int early; +}; + +struct user_pt_regs { + __u64 regs[31]; + __u64 sp; + __u64 pc; + __u64 pstate; +}; + +struct pt_regs { + union { + struct user_pt_regs user_regs; + struct { + u64 regs[31]; + u64 sp; + u64 pc; + u64 pstate; + }; + }; + u64 orig_x0; + s32 syscallno; + u32 unused2; + u64 sdei_ttbr1; + u64 pmr_save; + u64 stackframe[2]; + u64 lockdep_hardirqs; + u64 exit_rcu; +}; + +struct arch_hw_breakpoint_ctrl { + u32 __reserved: 19; + u32 len: 8; + u32 type: 2; + u32 privilege: 2; + u32 enabled: 1; +}; + +struct arch_hw_breakpoint { + u64 address; + u64 trigger; + struct arch_hw_breakpoint_ctrl ctrl; +}; + +enum perf_event_state { + PERF_EVENT_STATE_DEAD = -4, + PERF_EVENT_STATE_EXIT = -3, + PERF_EVENT_STATE_ERROR = -2, + PERF_EVENT_STATE_OFF = -1, + PERF_EVENT_STATE_INACTIVE = 0, + PERF_EVENT_STATE_ACTIVE = 1, +}; + +struct perf_event_attr { + __u32 type; + __u32 size; + __u64 config; + union { + __u64 sample_period; + __u64 sample_freq; + }; + __u64 sample_type; + __u64 read_format; + __u64 disabled: 1; + __u64 inherit: 1; + __u64 pinned: 1; + __u64 exclusive: 1; + __u64 exclude_user: 1; + __u64 exclude_kernel: 1; + __u64 exclude_hv: 1; + __u64 exclude_idle: 1; + __u64 mmap: 1; + __u64 comm: 1; + __u64 freq: 1; + __u64 inherit_stat: 1; + __u64 enable_on_exec: 1; + __u64 task: 1; + __u64 watermark: 1; + __u64 precise_ip: 2; + __u64 mmap_data: 1; + __u64 sample_id_all: 1; + __u64 exclude_host: 1; + __u64 exclude_guest: 1; + __u64 exclude_callchain_kernel: 1; + __u64 exclude_callchain_user: 1; + __u64 mmap2: 1; + __u64 comm_exec: 1; + __u64 use_clockid: 1; + __u64 context_switch: 1; + __u64 write_backward: 1; + __u64 namespaces: 1; + __u64 ksymbol: 1; + __u64 bpf_event: 1; + __u64 aux_output: 1; + __u64 cgroup: 1; + __u64 text_poke: 1; + __u64 build_id: 1; + __u64 inherit_thread: 1; + __u64 remove_on_exec: 1; + __u64 sigtrap: 1; + __u64 __reserved_1: 26; + union { + __u32 wakeup_events; + __u32 wakeup_watermark; + }; + __u32 bp_type; + union { + __u64 bp_addr; + __u64 kprobe_func; + __u64 uprobe_path; + __u64 config1; + }; + union { + __u64 bp_len; + __u64 kprobe_addr; + __u64 probe_offset; + __u64 config2; + }; + __u64 branch_sample_type; + __u64 sample_regs_user; + __u32 sample_stack_user; + __s32 clockid; + __u64 sample_regs_intr; + __u32 aux_watermark; + __u16 sample_max_stack; + __u16 __reserved_2; + __u32 aux_sample_size; + __u32 __reserved_3; + __u64 sig_data; +}; + +struct hw_perf_event_extra { + u64 config; + unsigned int reg; + int alloc; + int idx; +}; + +struct rhlist_head { + struct rhash_head rhead; + struct rhlist_head *next; +}; + +struct hw_perf_event { + union { + struct { + u64 config; + u64 last_tag; + long unsigned int config_base; + long unsigned int event_base; + int event_base_rdpmc; + int idx; + int last_cpu; + int flags; + struct hw_perf_event_extra extra_reg; + struct hw_perf_event_extra branch_reg; + }; + struct { + struct hrtimer hrtimer; + }; + struct { + struct list_head tp_list; + }; + struct { + u64 pwr_acc; + u64 ptsc; + }; + struct { + struct arch_hw_breakpoint info; + struct rhlist_head bp_list; + }; + struct { + u8 iommu_bank; + u8 iommu_cntr; + u16 padding; + u64 conf; + u64 conf1; + }; + }; + struct task_struct *target; + void *addr_filters; + long unsigned int addr_filters_gen; + int state; + local64_t prev_count; + u64 sample_period; + union { + struct { + u64 last_period; + local64_t period_left; + }; + struct { + u64 saved_metric; + u64 saved_slots; + }; + }; + u64 interrupts_seq; + u64 interrupts; + u64 freq_time_stamp; + u64 freq_count_stamp; +}; + +struct perf_addr_filters_head { + struct list_head list; + raw_spinlock_t lock; + unsigned int nr_file_filters; +}; + +struct perf_sample_data; + +typedef void (*perf_overflow_handler_t)(struct perf_event *, struct perf_sample_data *, struct pt_regs *); + +struct ftrace_ops; + +struct ftrace_regs; + +typedef void (*ftrace_func_t)(long unsigned int, long unsigned int, struct ftrace_ops *, struct ftrace_regs *); + +struct ftrace_hash; + +struct ftrace_ops_hash { + struct ftrace_hash *notrace_hash; + struct ftrace_hash *filter_hash; + struct mutex regex_lock; +}; + +enum ftrace_ops_cmd { + FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_SELF = 0, + FTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_PEER = 1, + FTRACE_OPS_CMD_DISABLE_SHARE_IPMODIFY_PEER = 2, +}; + +typedef int (*ftrace_ops_func_t)(struct ftrace_ops *, enum ftrace_ops_cmd); + +struct ftrace_ops { + ftrace_func_t func; + struct ftrace_ops *next; + long unsigned int flags; + void *private; + ftrace_func_t saved_func; + struct ftrace_ops_hash local_hash; + struct ftrace_ops_hash *func_hash; + struct ftrace_ops_hash old_hash; + long unsigned int trampoline; + long unsigned int trampoline_size; + struct list_head list; + ftrace_ops_func_t ops_func; +}; + +struct pmu; + +struct perf_event_pmu_context; + +struct perf_buffer; + +struct perf_addr_filter_range; + +struct event_filter; + +struct perf_cgroup; + +struct perf_event { + struct list_head event_entry; + struct list_head sibling_list; + struct list_head active_list; + struct rb_node group_node; + u64 group_index; + struct list_head migrate_entry; + struct hlist_node hlist_entry; + struct list_head active_entry; + int nr_siblings; + int event_caps; + int group_caps; + struct perf_event *group_leader; + struct pmu *pmu; + void *pmu_private; + enum perf_event_state state; + unsigned int attach_state; + local64_t count; + atomic64_t child_count; + u64 total_time_enabled; + u64 total_time_running; + u64 tstamp; + struct perf_event_attr attr; + u16 header_size; + u16 id_header_size; + u16 read_size; + struct hw_perf_event hw; + struct perf_event_context *ctx; + struct perf_event_pmu_context *pmu_ctx; + atomic_long_t refcount; + atomic64_t child_total_time_enabled; + atomic64_t child_total_time_running; + struct mutex child_mutex; + struct list_head child_list; + struct perf_event *parent; + int oncpu; + int cpu; + struct list_head owner_entry; + struct task_struct *owner; + struct mutex mmap_mutex; + atomic_t mmap_count; + struct perf_buffer *rb; + struct list_head rb_entry; + long unsigned int rcu_batches; + int rcu_pending; + wait_queue_head_t waitq; + struct fasync_struct *fasync; + unsigned int pending_wakeup; + unsigned int pending_kill; + unsigned int pending_disable; + unsigned int pending_sigtrap; + long unsigned int pending_addr; + struct irq_work pending_irq; + struct callback_head pending_task; + unsigned int pending_work; + atomic_t event_limit; + struct perf_addr_filters_head addr_filters; + struct perf_addr_filter_range *addr_filter_ranges; + long unsigned int addr_filters_gen; + struct perf_event *aux_event; + void (*destroy)(struct perf_event *); + struct callback_head callback_head; + struct pid_namespace *ns; + u64 id; + atomic64_t lost_samples; + u64 (*clock)(); + perf_overflow_handler_t overflow_handler; + void *overflow_handler_context; + perf_overflow_handler_t orig_overflow_handler; + struct bpf_prog *prog; + u64 bpf_cookie; + struct trace_event_call *tp_event; + struct event_filter *filter; + struct ftrace_ops ftrace_ops; + struct perf_cgroup *cgrp; + void *security; + struct list_head sb_list; +}; + +struct mempolicy { + atomic_t refcnt; + short unsigned int mode; + short unsigned int flags; + nodemask_t nodes; + int home_node; + union { + nodemask_t cpuset_mems_allowed; + nodemask_t user_nodemask; + } w; +}; + +struct linux_binprm; + +struct coredump_params; + +struct linux_binfmt { + struct list_head lh; + struct module *module; + int (*load_binary)(struct linux_binprm *); + int (*load_shlib)(struct file *); + int (*core_dump)(struct coredump_params *); + long unsigned int min_coredump; +}; + +struct request; + +struct blk_plug { + struct request *mq_list; + struct request *cached_rq; + short unsigned int nr_ios; + short unsigned int rq_count; + bool multiple_queues; + bool has_elevator; + bool nowait; + struct list_head cb_list; +}; + +struct perf_event_groups { + struct rb_root tree; + u64 index; +}; + +struct perf_event_context { + raw_spinlock_t lock; + struct mutex mutex; + struct list_head pmu_ctx_list; + struct perf_event_groups pinned_groups; + struct perf_event_groups flexible_groups; + struct list_head event_list; + int nr_events; + int nr_user; + int is_active; + int nr_task_data; + int nr_stat; + int nr_freq; + int rotate_disable; + refcount_t refcount; + struct task_struct *task; + u64 time; + u64 timestamp; + u64 timeoffset; + struct perf_event_context *parent_ctx; + u64 parent_gen; + u64 generation; + int pin_count; + int nr_cgroups; + struct callback_head callback_head; + local_t nr_pending; +}; + +struct task_delay_info { + raw_spinlock_t lock; + u64 blkio_start; + u64 blkio_delay; + u64 swapin_start; + u64 swapin_delay; + u32 blkio_count; + u32 swapin_count; + u64 freepages_start; + u64 freepages_delay; + u64 thrashing_start; + u64 thrashing_delay; + u64 compact_start; + u64 compact_delay; + u64 wpcopy_start; + u64 wpcopy_delay; + u32 freepages_count; + u32 thrashing_count; + u32 compact_count; + u32 wpcopy_count; +}; + +enum blk_bounce { + BLK_BOUNCE_NONE = 0, + BLK_BOUNCE_HIGH = 1, +}; + +enum blk_zoned_model { + BLK_ZONED_NONE = 0, + BLK_ZONED_HA = 1, + BLK_ZONED_HM = 2, +}; + +struct queue_limits { + enum blk_bounce bounce; + long unsigned int seg_boundary_mask; + long unsigned int virt_boundary_mask; + unsigned int max_hw_sectors; + unsigned int max_dev_sectors; + unsigned int chunk_sectors; + unsigned int max_sectors; + unsigned int max_segment_size; + unsigned int physical_block_size; + unsigned int logical_block_size; + unsigned int alignment_offset; + unsigned int io_min; + unsigned int io_opt; + unsigned int max_discard_sectors; + unsigned int max_hw_discard_sectors; + unsigned int max_secure_erase_sectors; + unsigned int max_write_zeroes_sectors; + unsigned int max_zone_append_sectors; + unsigned int discard_granularity; + unsigned int discard_alignment; + unsigned int zone_write_granularity; + short unsigned int max_segments; + short unsigned int max_integrity_segments; + short unsigned int max_discard_segments; + unsigned char misaligned; + unsigned char discard_misaligned; + unsigned char raid_partial_stripes_expensive; + enum blk_zoned_model zoned; + unsigned int dma_alignment; +}; + +struct elevator_queue; + +struct blk_queue_stats; + +struct rq_qos; + +struct blk_mq_ops; + +struct blk_mq_ctx; + +struct blk_stat_callback; + +struct blk_rq_stat; + +struct blk_mq_tags; + +struct blk_trace; + +struct blk_flush_queue; + +struct throtl_data; + +struct blk_mq_tag_set; + +struct request_queue { + struct request *last_merge; + struct elevator_queue *elevator; + struct percpu_ref q_usage_counter; + struct blk_queue_stats *stats; + struct rq_qos *rq_qos; + const struct blk_mq_ops *mq_ops; + struct blk_mq_ctx *queue_ctx; + unsigned int queue_depth; + struct xarray hctx_table; + unsigned int nr_hw_queues; + void *queuedata; + long unsigned int queue_flags; + atomic_t pm_only; + int id; + spinlock_t queue_lock; + struct gendisk *disk; + refcount_t refs; + struct kobject *mq_kobj; + struct device *dev; + enum rpm_status rpm_status; + long unsigned int nr_requests; + unsigned int dma_pad_mask; + unsigned int rq_timeout; + int poll_nsec; + struct blk_stat_callback *poll_cb; + struct blk_rq_stat *poll_stat; + struct timer_list timeout; + struct work_struct timeout_work; + atomic_t nr_active_requests_shared_tags; + struct blk_mq_tags *sched_shared_tags; + struct list_head icq_list; + long unsigned int blkcg_pols[1]; + struct blkcg_gq *root_blkg; + struct list_head blkg_list; + struct queue_limits limits; + unsigned int required_elevator_features; + int node; + struct blk_trace *blk_trace; + struct blk_flush_queue *fq; + struct list_head requeue_list; + spinlock_t requeue_lock; + struct delayed_work requeue_work; + struct mutex sysfs_lock; + struct mutex sysfs_dir_lock; + struct list_head unused_hctx_list; + spinlock_t unused_hctx_lock; + int mq_freeze_depth; + struct throtl_data *td; + struct callback_head callback_head; + wait_queue_head_t mq_freeze_wq; + struct mutex mq_freeze_lock; + int quiesce_depth; + struct blk_mq_tag_set *tag_set; + struct list_head tag_set_list; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct dentry *rqos_debugfs_dir; + struct mutex debugfs_mutex; + bool mq_sysfs_init_done; +}; + +struct io_comp_batch { + struct request *req_list; + bool need_ts; + void (*complete)(struct io_comp_batch *); +}; + +struct fc_log; + +struct p_log { + const char *prefix; + struct fc_log *log; +}; + +enum fs_context_purpose { + FS_CONTEXT_FOR_MOUNT = 0, + FS_CONTEXT_FOR_SUBMOUNT = 1, + FS_CONTEXT_FOR_RECONFIGURE = 2, +}; + +enum fs_context_phase { + FS_CONTEXT_CREATE_PARAMS = 0, + FS_CONTEXT_CREATING = 1, + FS_CONTEXT_AWAITING_MOUNT = 2, + FS_CONTEXT_AWAITING_RECONF = 3, + FS_CONTEXT_RECONF_PARAMS = 4, + FS_CONTEXT_RECONFIGURING = 5, + FS_CONTEXT_FAILED = 6, +}; + +struct fs_context_operations; + +struct fs_context { + const struct fs_context_operations *ops; + struct mutex uapi_mutex; + struct file_system_type *fs_type; + void *fs_private; + void *sget_key; + struct dentry *root; + struct user_namespace *user_ns; + struct net *net_ns; + const struct cred *cred; + struct p_log log; + const char *source; + void *security; + void *s_fs_info; + unsigned int sb_flags; + unsigned int sb_flags_mask; + unsigned int s_iflags; + unsigned int lsm_flags; + enum fs_context_purpose purpose: 8; + enum fs_context_phase phase: 8; + bool need_free: 1; + bool global: 1; + bool oldapi: 1; +}; + +struct audit_names; + +struct filename { + const char *name; + const char *uptr; + int refcnt; + struct audit_names *aname; + const char iname[0]; +}; + +struct trace_event_functions; + +struct trace_event { + struct hlist_node node; + struct list_head list; + int type; + struct trace_event_functions *funcs; +}; + +struct trace_event_class; + +struct trace_event_call { + struct list_head list; + struct trace_event_class *class; + union { + char *name; + struct tracepoint *tp; + }; + struct trace_event event; + char *print_fmt; + struct event_filter *filter; + union { + void *module; + atomic_t refcnt; + }; + void *data; + int flags; + int perf_refcount; + struct hlist_head *perf_events; + struct bpf_prog_array *prog_array; + int (*perf_perm)(struct trace_event_call *, struct perf_event *); +}; + +struct linux_binprm { + struct vm_area_struct *vma; + long unsigned int vma_pages; + struct mm_struct *mm; + long unsigned int p; + long unsigned int argmin; + unsigned int have_execfd: 1; + unsigned int execfd_creds: 1; + unsigned int secureexec: 1; + unsigned int point_of_no_return: 1; + struct file *executable; + struct file *interpreter; + struct file *file; + struct cred *cred; + int unsafe; + unsigned int per_clear; + int argc; + int envc; + const char *filename; + const char *interp; + const char *fdpath; + unsigned int interp_flags; + int execfd; + long unsigned int loader; + long unsigned int exec; + struct rlimit rlim_stack; + char buf[256]; +}; + +struct ring_buffer_event { + u32 type_len: 5; + u32 time_delta: 27; + u32 array[0]; +}; + +struct seq_buf { + char *buffer; + size_t size; + size_t len; + loff_t readpos; +}; + +struct trace_seq { + char buffer[4096]; + struct seq_buf seq; + int full; +}; + +enum perf_sw_ids { + PERF_COUNT_SW_CPU_CLOCK = 0, + PERF_COUNT_SW_TASK_CLOCK = 1, + PERF_COUNT_SW_PAGE_FAULTS = 2, + PERF_COUNT_SW_CONTEXT_SWITCHES = 3, + PERF_COUNT_SW_CPU_MIGRATIONS = 4, + PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, + PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, + PERF_COUNT_SW_EMULATION_FAULTS = 8, + PERF_COUNT_SW_DUMMY = 9, + PERF_COUNT_SW_BPF_OUTPUT = 10, + PERF_COUNT_SW_CGROUP_SWITCHES = 11, + PERF_COUNT_SW_MAX = 12, +}; + +union perf_mem_data_src { + __u64 val; + struct { + __u64 mem_op: 5; + __u64 mem_lvl: 14; + __u64 mem_snoop: 5; + __u64 mem_lock: 2; + __u64 mem_dtlb: 7; + __u64 mem_lvl_num: 4; + __u64 mem_remote: 1; + __u64 mem_snoopx: 2; + __u64 mem_blk: 3; + __u64 mem_hops: 3; + __u64 mem_rsvd: 18; + }; +}; + +struct perf_branch_entry { + __u64 from; + __u64 to; + __u64 mispred: 1; + __u64 predicted: 1; + __u64 in_tx: 1; + __u64 abort: 1; + __u64 cycles: 16; + __u64 type: 4; + __u64 spec: 2; + __u64 new_type: 4; + __u64 priv: 3; + __u64 reserved: 31; +}; + +union perf_sample_weight { + __u64 full; + struct { + __u32 var1_dw; + __u16 var2_w; + __u16 var3_w; + }; +}; + +struct new_utsname { + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; + char domainname[65]; +}; + +struct uts_namespace { + struct new_utsname name; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; +}; + +struct nsset { + unsigned int flags; + struct nsproxy *nsproxy; + struct fs_struct *fs; + const struct cred *cred; +}; + +struct ftrace_regs { + long unsigned int regs[9]; + long unsigned int __unused; + long unsigned int fp; + long unsigned int lr; + long unsigned int sp; + long unsigned int pc; +}; + +struct perf_regs { + __u64 abi; + struct pt_regs *regs; +}; + +struct perf_callchain_entry { + __u64 nr; + __u64 ip[0]; +}; + +typedef long unsigned int (*perf_copy_f)(void *, const void *, long unsigned int, long unsigned int); + +struct perf_raw_frag { + union { + struct perf_raw_frag *next; + long unsigned int pad; + }; + perf_copy_f copy; + void *data; + u32 size; +} __attribute__((packed)); + +struct perf_raw_record { + struct perf_raw_frag frag; + u32 size; +}; + +struct perf_branch_stack { + __u64 nr; + __u64 hw_idx; + struct perf_branch_entry entries[0]; +}; + +struct perf_cpu_pmu_context; + +struct perf_output_handle; + +struct pmu { + struct list_head entry; + struct module *module; + struct device *dev; + const struct attribute_group **attr_groups; + const struct attribute_group **attr_update; + const char *name; + int type; + int capabilities; + int *pmu_disable_count; + struct perf_cpu_pmu_context *cpu_pmu_context; + atomic_t exclusive_cnt; + int task_ctx_nr; + int hrtimer_interval_ms; + unsigned int nr_addr_filters; + void (*pmu_enable)(struct pmu *); + void (*pmu_disable)(struct pmu *); + int (*event_init)(struct perf_event *); + void (*event_mapped)(struct perf_event *, struct mm_struct *); + void (*event_unmapped)(struct perf_event *, struct mm_struct *); + int (*add)(struct perf_event *, int); + void (*del)(struct perf_event *, int); + void (*start)(struct perf_event *, int); + void (*stop)(struct perf_event *, int); + void (*read)(struct perf_event *); + void (*start_txn)(struct pmu *, unsigned int); + int (*commit_txn)(struct pmu *); + void (*cancel_txn)(struct pmu *); + int (*event_idx)(struct perf_event *); + void (*sched_task)(struct perf_event_pmu_context *, bool); + struct kmem_cache *task_ctx_cache; + void (*swap_task_ctx)(struct perf_event_pmu_context *, struct perf_event_pmu_context *); + void * (*setup_aux)(struct perf_event *, void **, int, bool); + void (*free_aux)(void *); + long int (*snapshot_aux)(struct perf_event *, struct perf_output_handle *, long unsigned int); + int (*addr_filters_validate)(struct list_head *); + void (*addr_filters_sync)(struct perf_event *); + int (*aux_output_match)(struct perf_event *); + bool (*filter)(struct pmu *, int); + int (*check_period)(struct perf_event *, u64); +}; + +struct perf_event_pmu_context { + struct pmu *pmu; + struct perf_event_context *ctx; + struct list_head pmu_ctx_entry; + struct list_head pinned_active; + struct list_head flexible_active; + unsigned int embedded: 1; + unsigned int nr_events; + atomic_t refcount; + struct callback_head callback_head; + void *task_ctx_data; + int rotate_necessary; +}; + +struct perf_cpu_pmu_context { + struct perf_event_pmu_context epc; + struct perf_event_pmu_context *task_epc; + struct list_head sched_cb_entry; + int sched_cb_usage; + int active_oncpu; + int exclusive; + raw_spinlock_t hrtimer_lock; + struct hrtimer hrtimer; + ktime_t hrtimer_interval; + unsigned int hrtimer_active; +}; + +struct perf_output_handle { + struct perf_event *event; + struct perf_buffer *rb; + long unsigned int wakeup; + long unsigned int size; + u64 aux_flags; + union { + void *addr; + long unsigned int head; + }; + int page; +}; + +struct perf_addr_filter_range { + long unsigned int start; + long unsigned int size; +}; + +struct perf_sample_data { + u64 sample_flags; + u64 period; + struct perf_branch_stack *br_stack; + union perf_sample_weight weight; + union perf_mem_data_src data_src; + u64 txn; + u64 addr; + struct perf_raw_record *raw; + u64 type; + u64 ip; + struct { + u32 pid; + u32 tid; + } tid_entry; + u64 time; + u64 id; + u64 stream_id; + struct { + u32 cpu; + u32 reserved; + } cpu_entry; + struct perf_callchain_entry *callchain; + u64 aux_size; + struct perf_regs regs_user; + struct perf_regs regs_intr; + u64 stack_user_size; + u64 phys_addr; + u64 cgroup; + u64 data_page_size; + u64 code_page_size; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct perf_cgroup_info; + +struct perf_cgroup { + struct cgroup_subsys_state css; + struct perf_cgroup_info *info; +}; + +struct perf_cgroup_info { + u64 time; + u64 timestamp; + u64 timeoffset; + int active; +}; + +struct trace_entry { + short unsigned int type; + unsigned char flags; + unsigned char preempt_count; + int pid; +}; + +struct trace_array; + +struct tracer; + +struct array_buffer; + +struct ring_buffer_iter; + +struct trace_iterator { + struct trace_array *tr; + struct tracer *trace; + struct array_buffer *array_buffer; + void *private; + int cpu_file; + struct mutex mutex; + struct ring_buffer_iter **buffer_iter; + long unsigned int iter_flags; + void *temp; + unsigned int temp_size; + char *fmt; + unsigned int fmt_size; + long int wait_index; + struct trace_seq tmp_seq; + cpumask_var_t started; + bool snapshot; + struct trace_seq seq; + struct trace_entry *ent; + long unsigned int lost_events; + int leftover; + int ent_size; + int cpu; + u64 ts; + loff_t pos; + long int idx; +}; + +enum print_line_t { + TRACE_TYPE_PARTIAL_LINE = 0, + TRACE_TYPE_HANDLED = 1, + TRACE_TYPE_UNHANDLED = 2, + TRACE_TYPE_NO_CONSUME = 3, +}; + +typedef enum print_line_t (*trace_print_func)(struct trace_iterator *, int, struct trace_event *); + +struct trace_event_functions { + trace_print_func trace; + trace_print_func raw; + trace_print_func hex; + trace_print_func binary; +}; + +enum trace_reg { + TRACE_REG_REGISTER = 0, + TRACE_REG_UNREGISTER = 1, + TRACE_REG_PERF_REGISTER = 2, + TRACE_REG_PERF_UNREGISTER = 3, + TRACE_REG_PERF_OPEN = 4, + TRACE_REG_PERF_CLOSE = 5, + TRACE_REG_PERF_ADD = 6, + TRACE_REG_PERF_DEL = 7, +}; + +struct trace_event_fields { + const char *type; + union { + struct { + const char *name; + const int size; + const int align; + const int is_signed; + const int filter_type; + }; + int (*define_fields)(struct trace_event_call *); + }; +}; + +struct trace_event_class { + const char *system; + void *probe; + void *perf_probe; + int (*reg)(struct trace_event_call *, enum trace_reg, void *); + struct trace_event_fields *fields_array; + struct list_head * (*get_fields)(struct trace_event_call *); + struct list_head fields; + int (*raw_init)(struct trace_event_call *); +}; + +struct trace_buffer; + +struct trace_event_file; + +struct trace_event_buffer { + struct trace_buffer *buffer; + struct ring_buffer_event *event; + struct trace_event_file *trace_file; + void *entry; + unsigned int trace_ctx; + struct pt_regs *regs; +}; + +struct trace_subsystem_dir; + +struct trace_event_file { + struct list_head list; + struct trace_event_call *event_call; + struct event_filter *filter; + struct dentry *dir; + struct trace_array *tr; + struct trace_subsystem_dir *system; + struct list_head triggers; + long unsigned int flags; + atomic_t sm_ref; + atomic_t tm_ref; +}; + +enum { + TRACE_EVENT_FL_FILTERED_BIT = 0, + TRACE_EVENT_FL_CAP_ANY_BIT = 1, + TRACE_EVENT_FL_NO_SET_FILTER_BIT = 2, + TRACE_EVENT_FL_IGNORE_ENABLE_BIT = 3, + TRACE_EVENT_FL_TRACEPOINT_BIT = 4, + TRACE_EVENT_FL_DYNAMIC_BIT = 5, + TRACE_EVENT_FL_KPROBE_BIT = 6, + TRACE_EVENT_FL_UPROBE_BIT = 7, + TRACE_EVENT_FL_EPROBE_BIT = 8, + TRACE_EVENT_FL_CUSTOM_BIT = 9, +}; + +enum { + TRACE_EVENT_FL_FILTERED = 1, + TRACE_EVENT_FL_CAP_ANY = 2, + TRACE_EVENT_FL_NO_SET_FILTER = 4, + TRACE_EVENT_FL_IGNORE_ENABLE = 8, + TRACE_EVENT_FL_TRACEPOINT = 16, + TRACE_EVENT_FL_DYNAMIC = 32, + TRACE_EVENT_FL_KPROBE = 64, + TRACE_EVENT_FL_UPROBE = 128, + TRACE_EVENT_FL_EPROBE = 256, + TRACE_EVENT_FL_CUSTOM = 512, +}; + +enum { + EVENT_FILE_FL_ENABLED_BIT = 0, + EVENT_FILE_FL_RECORDED_CMD_BIT = 1, + EVENT_FILE_FL_RECORDED_TGID_BIT = 2, + EVENT_FILE_FL_FILTERED_BIT = 3, + EVENT_FILE_FL_NO_SET_FILTER_BIT = 4, + EVENT_FILE_FL_SOFT_MODE_BIT = 5, + EVENT_FILE_FL_SOFT_DISABLED_BIT = 6, + EVENT_FILE_FL_TRIGGER_MODE_BIT = 7, + EVENT_FILE_FL_TRIGGER_COND_BIT = 8, + EVENT_FILE_FL_PID_FILTER_BIT = 9, + EVENT_FILE_FL_WAS_ENABLED_BIT = 10, +}; + +enum { + EVENT_FILE_FL_ENABLED = 1, + EVENT_FILE_FL_RECORDED_CMD = 2, + EVENT_FILE_FL_RECORDED_TGID = 4, + EVENT_FILE_FL_FILTERED = 8, + EVENT_FILE_FL_NO_SET_FILTER = 16, + EVENT_FILE_FL_SOFT_MODE = 32, + EVENT_FILE_FL_SOFT_DISABLED = 64, + EVENT_FILE_FL_TRIGGER_MODE = 128, + EVENT_FILE_FL_TRIGGER_COND = 256, + EVENT_FILE_FL_PID_FILTER = 512, + EVENT_FILE_FL_WAS_ENABLED = 1024, +}; + +enum { + FILTER_OTHER = 0, + FILTER_STATIC_STRING = 1, + FILTER_DYN_STRING = 2, + FILTER_RDYN_STRING = 3, + FILTER_PTR_STRING = 4, + FILTER_TRACE_FN = 5, + FILTER_COMM = 6, + FILTER_CPU = 7, +}; + +struct xbc_node { + uint16_t next; + uint16_t child; + uint16_t parent; + uint16_t data; +}; + +struct block_device_operations; + +struct timer_rand_state; + +struct disk_events; + +struct badblocks; + +struct blk_independent_access_ranges; + +struct gendisk { + int major; + int first_minor; + int minors; + char disk_name[32]; + short unsigned int events; + short unsigned int event_flags; + struct xarray part_tbl; + struct block_device *part0; + const struct block_device_operations *fops; + struct request_queue *queue; + void *private_data; + struct bio_set bio_split; + int flags; + long unsigned int state; + struct mutex open_mutex; + unsigned int open_partitions; + struct backing_dev_info *bdi; + struct kobject queue_kobj; + struct kobject *slave_dir; + struct timer_rand_state *random; + atomic_t sync_io; + struct disk_events *ev; + int node_id; + struct badblocks *bb; + struct lockdep_map lockdep_map; + u64 diskseq; + struct blk_independent_access_ranges *ia_ranges; +}; + +struct partition_meta_info { + char uuid[37]; + u8 volname[64]; +}; + +enum req_op { + REQ_OP_READ = 0, + REQ_OP_WRITE = 1, + REQ_OP_FLUSH = 2, + REQ_OP_DISCARD = 3, + REQ_OP_SECURE_ERASE = 5, + REQ_OP_WRITE_ZEROES = 9, + REQ_OP_ZONE_OPEN = 10, + REQ_OP_ZONE_CLOSE = 11, + REQ_OP_ZONE_FINISH = 12, + REQ_OP_ZONE_APPEND = 13, + REQ_OP_ZONE_RESET = 15, + REQ_OP_ZONE_RESET_ALL = 17, + REQ_OP_DRV_IN = 34, + REQ_OP_DRV_OUT = 35, + REQ_OP_LAST = 36, +}; + +struct blk_rq_stat { + u64 mean; + u64 min; + u64 max; + u32 nr_samples; + u64 batch; +}; + +enum fs_value_type { + fs_value_is_undefined = 0, + fs_value_is_flag = 1, + fs_value_is_string = 2, + fs_value_is_blob = 3, + fs_value_is_filename = 4, + fs_value_is_file = 5, +}; + +struct fs_parameter { + const char *key; + enum fs_value_type type: 8; + union { + char *string; + void *blob; + struct filename *name; + struct file *file; + }; + size_t size; + int dirfd; +}; + +struct fc_log { + refcount_t usage; + u8 head; + u8 tail; + u8 need_free; + struct module *owner; + char *buffer[8]; +}; + +struct fs_context_operations { + void (*free)(struct fs_context *); + int (*dup)(struct fs_context *, struct fs_context *); + int (*parse_param)(struct fs_context *, struct fs_parameter *); + int (*parse_monolithic)(struct fs_context *, void *); + int (*get_tree)(struct fs_context *); + int (*reconfigure)(struct fs_context *); +}; + +struct fs_parse_result { + bool negated; + union { + bool boolean; + int int_32; + unsigned int uint_32; + u64 uint_64; + }; +}; + +struct blk_zone { + __u64 start; + __u64 len; + __u64 wp; + __u8 type; + __u8 cond; + __u8 non_seq; + __u8 reset; + __u8 resv[4]; + __u64 capacity; + __u8 reserved[24]; +}; + +typedef int (*report_zones_cb)(struct blk_zone *, unsigned int, void *); + +enum blk_unique_id { + BLK_UID_T10 = 1, + BLK_UID_EUI64 = 2, + BLK_UID_NAA = 3, +}; + +struct hd_geometry; + +struct pr_ops; + +struct block_device_operations { + void (*submit_bio)(struct bio *); + int (*poll_bio)(struct bio *, struct io_comp_batch *, unsigned int); + int (*open)(struct block_device *, fmode_t); + void (*release)(struct gendisk *, fmode_t); + int (*rw_page)(struct block_device *, sector_t, struct page *, enum req_op); + int (*ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); + int (*compat_ioctl)(struct block_device *, fmode_t, unsigned int, long unsigned int); + unsigned int (*check_events)(struct gendisk *, unsigned int); + void (*unlock_native_capacity)(struct gendisk *); + int (*getgeo)(struct block_device *, struct hd_geometry *); + int (*set_read_only)(struct block_device *, bool); + void (*free_disk)(struct gendisk *); + void (*swap_slot_free_notify)(struct block_device *, long unsigned int); + int (*report_zones)(struct gendisk *, sector_t, unsigned int, report_zones_cb, void *); + int (*get_unique_id)(struct gendisk *, u8 *, enum blk_unique_id); + struct module *owner; + const struct pr_ops *pr_ops; + int (*alternative_gpt_sector)(struct gendisk *, sector_t *); +}; + +struct blk_independent_access_range { + struct kobject kobj; + sector_t sector; + sector_t nr_sectors; +}; + +struct blk_independent_access_ranges { + struct kobject kobj; + bool sysfs_registered; + unsigned int nr_ia_ranges; + struct blk_independent_access_range ia_range[0]; +}; + +enum blk_eh_timer_return { + BLK_EH_DONE = 0, + BLK_EH_RESET_TIMER = 1, +}; + +struct blk_mq_hw_ctx; + +struct blk_mq_queue_data; + +struct blk_mq_ops { + blk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *); + void (*commit_rqs)(struct blk_mq_hw_ctx *); + void (*queue_rqs)(struct request **); + int (*get_budget)(struct request_queue *); + void (*put_budget)(struct request_queue *, int); + void (*set_rq_budget_token)(struct request *, int); + int (*get_rq_budget_token)(struct request *); + enum blk_eh_timer_return (*timeout)(struct request *); + int (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *); + void (*complete)(struct request *); + int (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + int (*init_request)(struct blk_mq_tag_set *, struct request *, unsigned int, unsigned int); + void (*exit_request)(struct blk_mq_tag_set *, struct request *, unsigned int); + void (*cleanup_rq)(struct request *); + bool (*busy)(struct request_queue *); + void (*map_queues)(struct blk_mq_tag_set *); + void (*show_rq)(struct seq_file *, struct request *); +}; + +enum pr_type { + PR_WRITE_EXCLUSIVE = 1, + PR_EXCLUSIVE_ACCESS = 2, + PR_WRITE_EXCLUSIVE_REG_ONLY = 3, + PR_EXCLUSIVE_ACCESS_REG_ONLY = 4, + PR_WRITE_EXCLUSIVE_ALL_REGS = 5, + PR_EXCLUSIVE_ACCESS_ALL_REGS = 6, +}; + +struct pr_ops { + int (*pr_register)(struct block_device *, u64, u64, u32); + int (*pr_reserve)(struct block_device *, u64, enum pr_type, u32); + int (*pr_release)(struct block_device *, u64, enum pr_type); + int (*pr_preempt)(struct block_device *, u64, u64, enum pr_type, bool); + int (*pr_clear)(struct block_device *, u64); +}; + +enum flow_dissector_key_id { + FLOW_DISSECTOR_KEY_CONTROL = 0, + FLOW_DISSECTOR_KEY_BASIC = 1, + FLOW_DISSECTOR_KEY_IPV4_ADDRS = 2, + FLOW_DISSECTOR_KEY_IPV6_ADDRS = 3, + FLOW_DISSECTOR_KEY_PORTS = 4, + FLOW_DISSECTOR_KEY_PORTS_RANGE = 5, + FLOW_DISSECTOR_KEY_ICMP = 6, + FLOW_DISSECTOR_KEY_ETH_ADDRS = 7, + FLOW_DISSECTOR_KEY_TIPC = 8, + FLOW_DISSECTOR_KEY_ARP = 9, + FLOW_DISSECTOR_KEY_VLAN = 10, + FLOW_DISSECTOR_KEY_FLOW_LABEL = 11, + FLOW_DISSECTOR_KEY_GRE_KEYID = 12, + FLOW_DISSECTOR_KEY_MPLS_ENTROPY = 13, + FLOW_DISSECTOR_KEY_ENC_KEYID = 14, + FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS = 15, + FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS = 16, + FLOW_DISSECTOR_KEY_ENC_CONTROL = 17, + FLOW_DISSECTOR_KEY_ENC_PORTS = 18, + FLOW_DISSECTOR_KEY_MPLS = 19, + FLOW_DISSECTOR_KEY_TCP = 20, + FLOW_DISSECTOR_KEY_IP = 21, + FLOW_DISSECTOR_KEY_CVLAN = 22, + FLOW_DISSECTOR_KEY_ENC_IP = 23, + FLOW_DISSECTOR_KEY_ENC_OPTS = 24, + FLOW_DISSECTOR_KEY_META = 25, + FLOW_DISSECTOR_KEY_CT = 26, + FLOW_DISSECTOR_KEY_HASH = 27, + FLOW_DISSECTOR_KEY_NUM_OF_VLANS = 28, + FLOW_DISSECTOR_KEY_PPPOE = 29, + FLOW_DISSECTOR_KEY_L2TPV3 = 30, + FLOW_DISSECTOR_KEY_MAX = 31, +}; + +enum skb_ext_id { + SKB_EXT_SEC_PATH = 0, + TC_SKB_EXT = 1, + SKB_EXT_MPTCP = 2, + SKB_EXT_NUM = 3, +}; + +struct trace_event_raw_initcall_level { + struct trace_entry ent; + u32 __data_loc_level; + char __data[0]; +}; + +struct trace_event_raw_initcall_start { + struct trace_entry ent; + initcall_t func; + char __data[0]; +}; + +struct trace_event_raw_initcall_finish { + struct trace_entry ent; + initcall_t func; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_initcall_level { + u32 level; +}; + +struct trace_event_data_offsets_initcall_start {}; + +struct trace_event_data_offsets_initcall_finish {}; + +typedef void (*btf_trace_initcall_level)(void *, const char *); + +typedef void (*btf_trace_initcall_start)(void *, initcall_t); + +typedef void (*btf_trace_initcall_finish)(void *, initcall_t, int); + +struct blacklist_entry { + struct list_head next; + char *buf; +}; + +enum { + CSD_FLAG_LOCK = 1, + IRQ_WORK_PENDING = 1, + IRQ_WORK_BUSY = 2, + IRQ_WORK_LAZY = 4, + IRQ_WORK_HARD_IRQ = 8, + IRQ_WORK_CLAIMED = 3, + CSD_TYPE_ASYNC = 0, + CSD_TYPE_SYNC = 16, + CSD_TYPE_IRQ_WORK = 32, + CSD_TYPE_TTWU = 48, + CSD_FLAG_TYPE_MASK = 240, +}; + +struct smp_hotplug_thread { + struct task_struct **store; + struct list_head list; + int (*thread_should_run)(unsigned int); + void (*thread_fn)(unsigned int); + void (*create)(unsigned int); + void (*setup)(unsigned int); + void (*cleanup)(unsigned int, bool); + void (*park)(unsigned int); + void (*unpark)(unsigned int); + bool selfparking; + const char *thread_comm; +}; + +typedef bool pstate_check_t(long unsigned int); + +struct maple_alloc { + long unsigned int total; + unsigned char node_count; + unsigned int request_count; + struct maple_alloc *slot[30]; +}; + +struct maple_enode; + +struct ma_state { + struct maple_tree *tree; + long unsigned int index; + long unsigned int last; + struct maple_enode *node; + long unsigned int min; + long unsigned int max; + struct maple_alloc *alloc; + unsigned char depth; + unsigned char offset; + unsigned char mas_flags; +}; + +enum uprobe_filter_ctx { + UPROBE_FILTER_REGISTER = 0, + UPROBE_FILTER_UNREGISTER = 1, + UPROBE_FILTER_MMAP = 2, +}; + +struct uprobe_consumer { + int (*handler)(struct uprobe_consumer *, struct pt_regs *); + int (*ret_handler)(struct uprobe_consumer *, long unsigned int, struct pt_regs *); + bool (*filter)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); + struct uprobe_consumer *next; +}; + +typedef u32 probe_opcode_t; + +typedef void probes_handler_t(u32, long int, struct pt_regs *); + +struct arch_probe_insn { + probe_opcode_t *insn; + pstate_check_t *pstate_cc; + probes_handler_t *handler; + long unsigned int restore; +}; + +typedef u32 uprobe_opcode_t; + +struct arch_uprobe { + union { + u8 insn[4]; + u8 ixol[4]; + }; + struct arch_probe_insn api; + bool simulate; +}; + +struct uprobe { + struct rb_node rb_node; + refcount_t ref; + struct rw_semaphore register_rwsem; + struct rw_semaphore consumer_rwsem; + struct list_head pending_list; + struct uprobe_consumer *consumers; + struct inode *inode; + loff_t offset; + loff_t ref_ctr_offset; + long unsigned int flags; + struct arch_uprobe arch; +}; + +enum rp_check { + RP_CHECK_CALL = 0, + RP_CHECK_CHAIN_CALL = 1, + RP_CHECK_RET = 2, +}; + +struct vm_special_mapping { + const char *name; + struct page **pages; + vm_fault_t (*fault)(const struct vm_special_mapping *, struct vm_area_struct *, struct vm_fault *); + int (*mremap)(const struct vm_special_mapping *, struct vm_area_struct *); +}; + +struct xol_area { + wait_queue_head_t wq; + atomic_t slot_count; + long unsigned int *bitmap; + struct vm_special_mapping xol_mapping; + struct page *pages[2]; + long unsigned int vaddr; +}; + +typedef long unsigned int vm_flags_t; + +struct vma_iterator { + struct ma_state mas; +}; + +typedef int filler_t(struct file *, struct folio *); + +struct page_vma_mapped_walk { + long unsigned int pfn; + long unsigned int nr_pages; + long unsigned int pgoff; + struct vm_area_struct *vma; + long unsigned int address; + pmd_t *pmd; + pte_t *pte; + spinlock_t *ptl; + unsigned int flags; +}; + +struct mmu_notifier_range { + long unsigned int start; + long unsigned int end; +}; + +typedef void (*task_work_func_t)(struct callback_head *); + +enum task_work_notify_mode { + TWA_NONE = 0, + TWA_RESUME = 1, + TWA_SIGNAL = 2, + TWA_SIGNAL_NO_IPI = 3, +}; + +struct delayed_uprobe { + struct list_head list; + struct uprobe *uprobe; + struct mm_struct *mm; +}; + +struct __uprobe_key { + struct inode *inode; + loff_t offset; +}; + +struct map_info { + struct map_info *next; + struct mm_struct *mm; + long unsigned int vaddr; +}; + +struct kobj_attribute { + struct attribute attr; + ssize_t (*show)(struct kobject *, struct kobj_attribute *, char *); + ssize_t (*store)(struct kobject *, struct kobj_attribute *, const char *, size_t); +}; + +struct anon_vma_chain { + struct vm_area_struct *vma; + struct anon_vma *anon_vma; + struct list_head same_vma; + struct rb_node rb; + long unsigned int rb_subtree_last; +}; + +typedef int rmap_t; + +struct rmap_walk_control { + void *arg; + bool try_lock; + bool contended; + bool (*rmap_one)(struct folio *, struct vm_area_struct *, long unsigned int, void *); + int (*done)(struct folio *); + struct anon_vma * (*anon_lock)(struct folio *, struct rmap_walk_control *); + bool (*invalid_vma)(struct vm_area_struct *, void *); +}; + +struct mm_slot { + struct hlist_node hash; + struct list_head mm_node; + struct mm_struct *mm; +}; + +struct ksm_rmap_item; + +struct ksm_mm_slot { + struct mm_slot slot; + struct ksm_rmap_item *rmap_list; +}; + +struct ksm_stable_node; + +struct ksm_rmap_item { + struct ksm_rmap_item *rmap_list; + union { + struct anon_vma *anon_vma; + int nid; + }; + struct mm_struct *mm; + long unsigned int address; + unsigned int oldchecksum; + union { + struct rb_node node; + struct { + struct ksm_stable_node *head; + struct hlist_node hlist; + }; + }; +}; + +struct ksm_scan { + struct ksm_mm_slot *mm_slot; + long unsigned int address; + struct ksm_rmap_item **rmap_list; + long unsigned int seqnr; +}; + +struct ksm_stable_node { + union { + struct rb_node node; + struct { + struct list_head *head; + struct { + struct hlist_node hlist_dup; + struct list_head list; + }; + }; + }; + struct hlist_head hlist; + union { + long unsigned int kpfn; + long unsigned int chain_prune_time; + }; + int rmap_hlist_len; + int nid; +}; + +enum get_ksm_page_flags { + GET_KSM_PAGE_NOLOCK = 0, + GET_KSM_PAGE_LOCK = 1, + GET_KSM_PAGE_TRYLOCK = 2, +}; + +typedef __kernel_long_t __kernel_off_t; + +typedef void (*rcu_callback_t)(struct callback_head *); + +struct fdtable { + unsigned int max_fds; + struct file **fd; + long unsigned int *close_on_exec; + long unsigned int *open_fds; + long unsigned int *full_fds_bits; + struct callback_head rcu; +}; + +struct files_struct { + atomic_t count; + bool resize_in_progress; + wait_queue_head_t resize_wait; + struct fdtable *fdt; + struct fdtable fdtab; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t file_lock; + unsigned int next_fd; + long unsigned int close_on_exec_init[1]; + long unsigned int open_fds_init[1]; + long unsigned int full_fds_bits_init[1]; + struct file *fd_array[64]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct f_owner_ex { + int type; + __kernel_pid_t pid; +}; + +struct flock { + short int l_type; + short int l_whence; + __kernel_off_t l_start; + __kernel_off_t l_len; + __kernel_pid_t l_pid; +}; + +typedef int __kernel_rwf_t; + +enum rw_hint { + WRITE_LIFE_NOT_SET = 0, + WRITE_LIFE_NONE = 1, + WRITE_LIFE_SHORT = 2, + WRITE_LIFE_MEDIUM = 3, + WRITE_LIFE_LONG = 4, + WRITE_LIFE_EXTREME = 5, +}; + +enum { + EI_ETYPE_NONE = 0, + EI_ETYPE_NULL = 1, + EI_ETYPE_ERRNO = 2, + EI_ETYPE_ERRNO_NULL = 3, + EI_ETYPE_TRUE = 4, +}; + +struct fd { + struct file *file; + unsigned int flags; +}; + +struct syscall_metadata { + const char *name; + int syscall_nr; + int nb_args; + const char **types; + const char **args; + struct list_head enter_fields; + struct trace_event_call *enter_event; + struct trace_event_call *exit_event; +}; + +struct constant_table { + const char *name; + int value; +}; + +typedef __kernel_ulong_t ino_t; + +typedef u32 nlink_t; + +typedef unsigned int xa_mark_t; + +enum xa_lock_type { + XA_LOCK_IRQ = 1, + XA_LOCK_BH = 2, +}; + +enum { + PROC_ENTRY_PERMANENT = 1, +}; + +struct proc_ops { + unsigned int proc_flags; + int (*proc_open)(struct inode *, struct file *); + ssize_t (*proc_read)(struct file *, char *, size_t, loff_t *); + ssize_t (*proc_read_iter)(struct kiocb *, struct iov_iter *); + ssize_t (*proc_write)(struct file *, const char *, size_t, loff_t *); + loff_t (*proc_lseek)(struct file *, loff_t, int); + int (*proc_release)(struct inode *, struct file *); + __poll_t (*proc_poll)(struct file *, struct poll_table_struct *); + long int (*proc_ioctl)(struct file *, unsigned int, long unsigned int); + int (*proc_mmap)(struct file *, struct vm_area_struct *); + long unsigned int (*proc_get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); +}; + +enum proc_hidepid { + HIDEPID_OFF = 0, + HIDEPID_NO_ACCESS = 1, + HIDEPID_INVISIBLE = 2, + HIDEPID_NOT_PTRACEABLE = 4, +}; + +enum proc_pidonly { + PROC_PIDONLY_OFF = 0, + PROC_PIDONLY_ON = 1, +}; + +struct proc_fs_info { + struct pid_namespace *pid_ns; + struct dentry *proc_self; + struct dentry *proc_thread_self; + kgid_t pid_gid; + enum proc_hidepid hide_pid; + enum proc_pidonly pidonly; +}; + +typedef int (*proc_write_t)(struct file *, char *, size_t); + +struct ida { + struct xarray xa; +}; + +struct proc_dir_entry { + atomic_t in_use; + refcount_t refcnt; + struct list_head pde_openers; + spinlock_t pde_unload_lock; + struct completion *pde_unload_completion; + const struct inode_operations *proc_iops; + union { + const struct proc_ops *proc_ops; + const struct file_operations *proc_dir_ops; + }; + const struct dentry_operations *proc_dops; + union { + const struct seq_operations *seq_ops; + int (*single_show)(struct seq_file *, void *); + }; + proc_write_t write; + void *data; + unsigned int state_size; + unsigned int low_ino; + nlink_t nlink; + kuid_t uid; + kgid_t gid; + loff_t size; + struct proc_dir_entry *parent; + struct rb_root subdir; + struct rb_node subdir_node; + char *name; + umode_t mode; + u8 flags; + u8 namelen; + char inline_name[0]; +}; + +union proc_op { + int (*proc_get_link)(struct dentry *, struct path *); + int (*proc_show)(struct seq_file *, struct pid_namespace *, struct pid *, struct task_struct *); + const char *lsm; +}; + +struct proc_inode { + struct pid *pid; + unsigned int fd; + union proc_op op; + struct proc_dir_entry *pde; + struct ctl_table_header *sysctl; + struct ctl_table *sysctl_entry; + struct hlist_node sibling_inodes; + const struct proc_ns_operations *ns_ops; + struct inode vfs_inode; +}; + +enum kernfs_node_type { + KERNFS_DIR = 1, + KERNFS_FILE = 2, + KERNFS_LINK = 4, +}; + +typedef __u16 __le16; + +typedef __u64 __le64; + +struct buffer_head; + +typedef void bh_end_io_t(struct buffer_head *, int); + +struct buffer_head { + long unsigned int b_state; + struct buffer_head *b_this_page; + struct page *b_page; + sector_t b_blocknr; + size_t b_size; + char *b_data; + struct block_device *b_bdev; + bh_end_io_t *b_end_io; + void *b_private; + struct list_head b_assoc_buffers; + struct address_space *b_assoc_map; + atomic_t b_count; + spinlock_t b_uptodate_lock; +}; + +struct fiemap_extent; + +struct fiemap_extent_info { + unsigned int fi_flags; + unsigned int fi_extents_mapped; + unsigned int fi_extents_max; + struct fiemap_extent *fi_extents_start; +}; + +enum bh_state_bits { + BH_Uptodate = 0, + BH_Dirty = 1, + BH_Lock = 2, + BH_Req = 3, + BH_Mapped = 4, + BH_New = 5, + BH_Async_Read = 6, + BH_Async_Write = 7, + BH_Delay = 8, + BH_Boundary = 9, + BH_Write_EIO = 10, + BH_Unwritten = 11, + BH_Quiet = 12, + BH_Meta = 13, + BH_Prio = 14, + BH_Defer_Completion = 15, + BH_PrivateStart = 16, +}; + +typedef unsigned int tid_t; + +struct transaction_chp_stats_s { + long unsigned int cs_chp_time; + __u32 cs_forced_to_close; + __u32 cs_written; + __u32 cs_dropped; +}; + +struct journal_s; + +typedef struct journal_s journal_t; + +struct journal_head; + +struct transaction_s; + +typedef struct transaction_s transaction_t; + +struct transaction_s { + journal_t *t_journal; + tid_t t_tid; + enum { + T_RUNNING = 0, + T_LOCKED = 1, + T_SWITCH = 2, + T_FLUSH = 3, + T_COMMIT = 4, + T_COMMIT_DFLUSH = 5, + T_COMMIT_JFLUSH = 6, + T_COMMIT_CALLBACK = 7, + T_FINISHED = 8, + } t_state; + long unsigned int t_log_start; + int t_nr_buffers; + struct journal_head *t_reserved_list; + struct journal_head *t_buffers; + struct journal_head *t_forget; + struct journal_head *t_checkpoint_list; + struct journal_head *t_checkpoint_io_list; + struct journal_head *t_shadow_list; + struct list_head t_inode_list; + spinlock_t t_handle_lock; + long unsigned int t_max_wait; + long unsigned int t_start; + long unsigned int t_requested; + struct transaction_chp_stats_s t_chp_stats; + atomic_t t_updates; + atomic_t t_outstanding_credits; + atomic_t t_outstanding_revokes; + atomic_t t_handle_count; + transaction_t *t_cpnext; + transaction_t *t_cpprev; + long unsigned int t_expires; + ktime_t t_start_time; + unsigned int t_synchronous_commit: 1; + int t_need_data_flush; + struct list_head t_private_list; +}; + +struct jbd2_buffer_trigger_type; + +struct journal_head { + struct buffer_head *b_bh; + spinlock_t b_state_lock; + int b_jcount; + unsigned int b_jlist; + unsigned int b_modified; + char *b_frozen_data; + char *b_committed_data; + transaction_t *b_transaction; + transaction_t *b_next_transaction; + struct journal_head *b_tnext; + struct journal_head *b_tprev; + transaction_t *b_cp_transaction; + struct journal_head *b_cpnext; + struct journal_head *b_cpprev; + struct jbd2_buffer_trigger_type *b_triggers; + struct jbd2_buffer_trigger_type *b_frozen_triggers; +}; + +struct jbd2_buffer_trigger_type { + void (*t_frozen)(struct jbd2_buffer_trigger_type *, struct buffer_head *, void *, size_t); + void (*t_abort)(struct jbd2_buffer_trigger_type *, struct buffer_head *); +}; + +struct crypto_shash { + unsigned int descsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +struct jbd2_journal_handle; + +typedef struct jbd2_journal_handle handle_t; + +struct jbd2_journal_handle { + union { + transaction_t *h_transaction; + journal_t *h_journal; + }; + handle_t *h_rsv_handle; + int h_total_credits; + int h_revoke_credits; + int h_revoke_credits_requested; + int h_ref; + int h_err; + unsigned int h_sync: 1; + unsigned int h_jdata: 1; + unsigned int h_reserved: 1; + unsigned int h_aborted: 1; + unsigned int h_type: 8; + unsigned int h_line_no: 16; + long unsigned int h_start_jiffies; + unsigned int h_requested_credits; + unsigned int saved_alloc_context; +}; + +struct transaction_run_stats_s { + long unsigned int rs_wait; + long unsigned int rs_request_delay; + long unsigned int rs_running; + long unsigned int rs_locked; + long unsigned int rs_flushing; + long unsigned int rs_logging; + __u32 rs_handle_count; + __u32 rs_blocks; + __u32 rs_blocks_logged; +}; + +struct transaction_stats_s { + long unsigned int ts_tid; + long unsigned int ts_requested; + struct transaction_run_stats_s run; +}; + +enum passtype { + PASS_SCAN = 0, + PASS_REVOKE = 1, + PASS_REPLAY = 2, +}; + +struct journal_superblock_s; + +typedef struct journal_superblock_s journal_superblock_t; + +struct jbd2_revoke_table_s; + +struct jbd2_inode; + +struct journal_s { + long unsigned int j_flags; + long unsigned int j_atomic_flags; + int j_errno; + struct mutex j_abort_mutex; + struct buffer_head *j_sb_buffer; + journal_superblock_t *j_superblock; + int j_format_version; + rwlock_t j_state_lock; + int j_barrier_count; + struct mutex j_barrier; + transaction_t *j_running_transaction; + transaction_t *j_committing_transaction; + transaction_t *j_checkpoint_transactions; + wait_queue_head_t j_wait_transaction_locked; + wait_queue_head_t j_wait_done_commit; + wait_queue_head_t j_wait_commit; + wait_queue_head_t j_wait_updates; + wait_queue_head_t j_wait_reserved; + wait_queue_head_t j_fc_wait; + struct mutex j_checkpoint_mutex; + struct buffer_head *j_chkpt_bhs[64]; + struct shrinker j_shrinker; + struct percpu_counter j_checkpoint_jh_count; + transaction_t *j_shrink_transaction; + long unsigned int j_head; + long unsigned int j_tail; + long unsigned int j_free; + long unsigned int j_first; + long unsigned int j_last; + long unsigned int j_fc_first; + long unsigned int j_fc_off; + long unsigned int j_fc_last; + struct block_device *j_dev; + int j_blocksize; + long long unsigned int j_blk_offset; + char j_devname[56]; + struct block_device *j_fs_dev; + unsigned int j_total_len; + atomic_t j_reserved_credits; + spinlock_t j_list_lock; + struct inode *j_inode; + tid_t j_tail_sequence; + tid_t j_transaction_sequence; + tid_t j_commit_sequence; + tid_t j_commit_request; + __u8 j_uuid[16]; + struct task_struct *j_task; + int j_max_transaction_buffers; + int j_revoke_records_per_block; + long unsigned int j_commit_interval; + struct timer_list j_commit_timer; + spinlock_t j_revoke_lock; + struct jbd2_revoke_table_s *j_revoke; + struct jbd2_revoke_table_s *j_revoke_table[2]; + struct buffer_head **j_wbuf; + struct buffer_head **j_fc_wbuf; + int j_wbufsize; + int j_fc_wbufsize; + pid_t j_last_sync_writer; + u64 j_average_commit_time; + u32 j_min_batch_time; + u32 j_max_batch_time; + void (*j_commit_callback)(journal_t *, transaction_t *); + int (*j_submit_inode_data_buffers)(struct jbd2_inode *); + int (*j_finish_inode_data_buffers)(struct jbd2_inode *); + spinlock_t j_history_lock; + struct proc_dir_entry *j_proc_entry; + struct transaction_stats_s j_stats; + unsigned int j_failed_commit; + void *j_private; + struct crypto_shash *j_chksum_driver; + __u32 j_csum_seed; + struct lockdep_map j_trans_commit_map; + void (*j_fc_cleanup_callback)(struct journal_s *, int, tid_t); + int (*j_fc_replay_callback)(struct journal_s *, struct buffer_head *, enum passtype, int, tid_t); +}; + +struct journal_header_s { + __be32 h_magic; + __be32 h_blocktype; + __be32 h_sequence; +}; + +typedef struct journal_header_s journal_header_t; + +struct journal_superblock_s { + journal_header_t s_header; + __be32 s_blocksize; + __be32 s_maxlen; + __be32 s_first; + __be32 s_sequence; + __be32 s_start; + __be32 s_errno; + __be32 s_feature_compat; + __be32 s_feature_incompat; + __be32 s_feature_ro_compat; + __u8 s_uuid[16]; + __be32 s_nr_users; + __be32 s_dynsuper; + __be32 s_max_transaction; + __be32 s_max_trans_data; + __u8 s_checksum_type; + __u8 s_padding2[3]; + __be32 s_num_fc_blks; + __u32 s_padding[41]; + __be32 s_checksum; + __u8 s_users[768]; +}; + +struct jbd2_inode { + transaction_t *i_transaction; + transaction_t *i_next_transaction; + struct list_head i_list; + struct inode *i_vfs_inode; + long unsigned int i_flags; + loff_t i_dirty_start; + loff_t i_dirty_end; +}; + +struct bgl_lock { + spinlock_t lock; +}; + +struct blockgroup_lock { + struct bgl_lock locks[128]; +}; + +struct fiemap_extent { + __u64 fe_logical; + __u64 fe_physical; + __u64 fe_length; + __u64 fe_reserved64[2]; + __u32 fe_flags; + __u32 fe_reserved[3]; +}; + +struct fscrypt_dummy_policy {}; + +typedef int ext4_grpblk_t; + +typedef long long unsigned int ext4_fsblk_t; + +typedef __u32 ext4_lblk_t; + +typedef unsigned int ext4_group_t; + +struct ext4_system_blocks { + struct rb_root root; + struct callback_head rcu; +}; + +struct ext4_group_desc { + __le32 bg_block_bitmap_lo; + __le32 bg_inode_bitmap_lo; + __le32 bg_inode_table_lo; + __le16 bg_free_blocks_count_lo; + __le16 bg_free_inodes_count_lo; + __le16 bg_used_dirs_count_lo; + __le16 bg_flags; + __le32 bg_exclude_bitmap_lo; + __le16 bg_block_bitmap_csum_lo; + __le16 bg_inode_bitmap_csum_lo; + __le16 bg_itable_unused_lo; + __le16 bg_checksum; + __le32 bg_block_bitmap_hi; + __le32 bg_inode_bitmap_hi; + __le32 bg_inode_table_hi; + __le16 bg_free_blocks_count_hi; + __le16 bg_free_inodes_count_hi; + __le16 bg_used_dirs_count_hi; + __le16 bg_itable_unused_hi; + __le32 bg_exclude_bitmap_hi; + __le16 bg_block_bitmap_csum_hi; + __le16 bg_inode_bitmap_csum_hi; + __u32 bg_reserved; +}; + +struct flex_groups { + atomic64_t free_clusters; + atomic_t free_inodes; + atomic_t used_dirs; +}; + +struct ext4_new_group_data { + __u32 group; + __u64 block_bitmap; + __u64 inode_bitmap; + __u64 inode_table; + __u32 blocks_count; + __u16 reserved_blocks; + __u16 mdata_blocks; + __u32 free_clusters_count; +}; + +enum { + BLOCK_BITMAP = 0, + INODE_BITMAP = 1, + INODE_TABLE = 2, + GROUP_TABLE_COUNT = 3, +}; + +struct extent_status { + struct rb_node rb_node; + ext4_lblk_t es_lblk; + ext4_lblk_t es_len; + ext4_fsblk_t es_pblk; +}; + +struct ext4_es_tree { + struct rb_root root; + struct extent_status *cache_es; +}; + +struct ext4_es_stats { + long unsigned int es_stats_shrunk; + struct percpu_counter es_stats_cache_hits; + struct percpu_counter es_stats_cache_misses; + u64 es_stats_scan_time; + u64 es_stats_max_scan_time; + struct percpu_counter es_stats_all_cnt; + struct percpu_counter es_stats_shk_cnt; +}; + +struct ext4_pending_tree { + struct rb_root root; +}; + +struct ext4_fc_stats { + unsigned int fc_ineligible_reason_count[10]; + long unsigned int fc_num_commits; + long unsigned int fc_ineligible_commits; + long unsigned int fc_failed_commits; + long unsigned int fc_skipped_commits; + long unsigned int fc_numblks; + u64 s_fc_avg_commit_time; +}; + +struct ext4_fc_alloc_region { + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + int ino; + int len; +}; + +struct ext4_fc_replay_state { + int fc_replay_num_tags; + int fc_replay_expected_off; + int fc_current_pass; + int fc_cur_tag; + int fc_crc; + struct ext4_fc_alloc_region *fc_regions; + int fc_regions_size; + int fc_regions_used; + int fc_regions_valid; + int *fc_modified_inodes; + int fc_modified_inodes_used; + int fc_modified_inodes_size; +}; + +struct ext4_inode_info { + __le32 i_data[15]; + __u32 i_dtime; + ext4_fsblk_t i_file_acl; + ext4_group_t i_block_group; + ext4_lblk_t i_dir_start_lookup; + long unsigned int i_flags; + struct rw_semaphore xattr_sem; + union { + struct list_head i_orphan; + unsigned int i_orphan_idx; + }; + struct list_head i_fc_dilist; + struct list_head i_fc_list; + ext4_lblk_t i_fc_lblk_start; + ext4_lblk_t i_fc_lblk_len; + atomic_t i_fc_updates; + wait_queue_head_t i_fc_wait; + struct mutex i_fc_lock; + loff_t i_disksize; + struct rw_semaphore i_data_sem; + struct inode vfs_inode; + struct jbd2_inode *jinode; + spinlock_t i_raw_lock; + struct timespec64 i_crtime; + atomic_t i_prealloc_active; + struct list_head i_prealloc_list; + spinlock_t i_prealloc_lock; + struct ext4_es_tree i_es_tree; + rwlock_t i_es_lock; + struct list_head i_es_list; + unsigned int i_es_all_nr; + unsigned int i_es_shk_nr; + ext4_lblk_t i_es_shrink_lblk; + ext4_group_t i_last_alloc_group; + unsigned int i_reserved_data_blocks; + struct ext4_pending_tree i_pending_tree; + __u16 i_extra_isize; + u16 i_inline_off; + u16 i_inline_size; + spinlock_t i_completed_io_lock; + struct list_head i_rsv_conversion_list; + struct work_struct i_rsv_conversion_work; + atomic_t i_unwritten; + spinlock_t i_block_reservation_lock; + tid_t i_sync_tid; + tid_t i_datasync_tid; + __u32 i_csum_seed; + kprojid_t i_projid; +}; + +struct ext4_super_block { + __le32 s_inodes_count; + __le32 s_blocks_count_lo; + __le32 s_r_blocks_count_lo; + __le32 s_free_blocks_count_lo; + __le32 s_free_inodes_count; + __le32 s_first_data_block; + __le32 s_log_block_size; + __le32 s_log_cluster_size; + __le32 s_blocks_per_group; + __le32 s_clusters_per_group; + __le32 s_inodes_per_group; + __le32 s_mtime; + __le32 s_wtime; + __le16 s_mnt_count; + __le16 s_max_mnt_count; + __le16 s_magic; + __le16 s_state; + __le16 s_errors; + __le16 s_minor_rev_level; + __le32 s_lastcheck; + __le32 s_checkinterval; + __le32 s_creator_os; + __le32 s_rev_level; + __le16 s_def_resuid; + __le16 s_def_resgid; + __le32 s_first_ino; + __le16 s_inode_size; + __le16 s_block_group_nr; + __le32 s_feature_compat; + __le32 s_feature_incompat; + __le32 s_feature_ro_compat; + __u8 s_uuid[16]; + char s_volume_name[16]; + char s_last_mounted[64]; + __le32 s_algorithm_usage_bitmap; + __u8 s_prealloc_blocks; + __u8 s_prealloc_dir_blocks; + __le16 s_reserved_gdt_blocks; + __u8 s_journal_uuid[16]; + __le32 s_journal_inum; + __le32 s_journal_dev; + __le32 s_last_orphan; + __le32 s_hash_seed[4]; + __u8 s_def_hash_version; + __u8 s_jnl_backup_type; + __le16 s_desc_size; + __le32 s_default_mount_opts; + __le32 s_first_meta_bg; + __le32 s_mkfs_time; + __le32 s_jnl_blocks[17]; + __le32 s_blocks_count_hi; + __le32 s_r_blocks_count_hi; + __le32 s_free_blocks_count_hi; + __le16 s_min_extra_isize; + __le16 s_want_extra_isize; + __le32 s_flags; + __le16 s_raid_stride; + __le16 s_mmp_update_interval; + __le64 s_mmp_block; + __le32 s_raid_stripe_width; + __u8 s_log_groups_per_flex; + __u8 s_checksum_type; + __u8 s_encryption_level; + __u8 s_reserved_pad; + __le64 s_kbytes_written; + __le32 s_snapshot_inum; + __le32 s_snapshot_id; + __le64 s_snapshot_r_blocks_count; + __le32 s_snapshot_list; + __le32 s_error_count; + __le32 s_first_error_time; + __le32 s_first_error_ino; + __le64 s_first_error_block; + __u8 s_first_error_func[32]; + __le32 s_first_error_line; + __le32 s_last_error_time; + __le32 s_last_error_ino; + __le32 s_last_error_line; + __le64 s_last_error_block; + __u8 s_last_error_func[32]; + __u8 s_mount_opts[64]; + __le32 s_usr_quota_inum; + __le32 s_grp_quota_inum; + __le32 s_overhead_clusters; + __le32 s_backup_bgs[2]; + __u8 s_encrypt_algos[4]; + __u8 s_encrypt_pw_salt[16]; + __le32 s_lpf_ino; + __le32 s_prj_quota_inum; + __le32 s_checksum_seed; + __u8 s_wtime_hi; + __u8 s_mtime_hi; + __u8 s_mkfs_time_hi; + __u8 s_lastcheck_hi; + __u8 s_first_error_time_hi; + __u8 s_last_error_time_hi; + __u8 s_first_error_errcode; + __u8 s_last_error_errcode; + __le16 s_encoding; + __le16 s_encoding_flags; + __le32 s_orphan_file_inum; + __le32 s_reserved[94]; + __le32 s_checksum; +}; + +enum ext4_journal_trigger_type { + EXT4_JTR_ORPHAN_FILE = 0, + EXT4_JTR_NONE = 1, +}; + +struct ext4_journal_trigger { + struct jbd2_buffer_trigger_type tr_triggers; + struct super_block *sb; +}; + +struct ext4_orphan_block { + atomic_t ob_free_entries; + struct buffer_head *ob_bh; +}; + +struct ext4_orphan_info { + int of_blocks; + __u32 of_csum_seed; + struct ext4_orphan_block *of_binfo; +}; + +struct mb_cache; + +struct dax_device; + +struct ext4_group_info; + +struct ext4_locality_group; + +struct ext4_li_request; + +struct ext4_sb_info { + long unsigned int s_desc_size; + long unsigned int s_inodes_per_block; + long unsigned int s_blocks_per_group; + long unsigned int s_clusters_per_group; + long unsigned int s_inodes_per_group; + long unsigned int s_itb_per_group; + long unsigned int s_gdb_count; + long unsigned int s_desc_per_block; + ext4_group_t s_groups_count; + ext4_group_t s_blockfile_groups; + long unsigned int s_overhead; + unsigned int s_cluster_ratio; + unsigned int s_cluster_bits; + loff_t s_bitmap_maxbytes; + struct buffer_head *s_sbh; + struct ext4_super_block *s_es; + struct buffer_head **s_group_desc; + unsigned int s_mount_opt; + unsigned int s_mount_opt2; + long unsigned int s_mount_flags; + unsigned int s_def_mount_opt; + ext4_fsblk_t s_sb_block; + atomic64_t s_resv_clusters; + kuid_t s_resuid; + kgid_t s_resgid; + short unsigned int s_mount_state; + short unsigned int s_pad; + int s_addr_per_block_bits; + int s_desc_per_block_bits; + int s_inode_size; + int s_first_ino; + unsigned int s_inode_readahead_blks; + unsigned int s_inode_goal; + u32 s_hash_seed[4]; + int s_def_hash_version; + int s_hash_unsigned; + struct percpu_counter s_freeclusters_counter; + struct percpu_counter s_freeinodes_counter; + struct percpu_counter s_dirs_counter; + struct percpu_counter s_dirtyclusters_counter; + struct percpu_counter s_sra_exceeded_retry_limit; + struct blockgroup_lock *s_blockgroup_lock; + struct proc_dir_entry *s_proc; + struct kobject s_kobj; + struct completion s_kobj_unregister; + struct super_block *s_sb; + struct buffer_head *s_mmp_bh; + struct journal_s *s_journal; + long unsigned int s_ext4_flags; + struct mutex s_orphan_lock; + struct list_head s_orphan; + struct ext4_orphan_info s_orphan_info; + long unsigned int s_commit_interval; + u32 s_max_batch_time; + u32 s_min_batch_time; + struct block_device *s_journal_bdev; + unsigned int s_want_extra_isize; + struct ext4_system_blocks *s_system_blks; + struct ext4_group_info ***s_group_info; + struct inode *s_buddy_cache; + spinlock_t s_md_lock; + short unsigned int *s_mb_offsets; + unsigned int *s_mb_maxs; + unsigned int s_group_info_size; + unsigned int s_mb_free_pending; + struct list_head s_freed_data_list; + struct list_head s_discard_list; + struct work_struct s_discard_work; + atomic_t s_retry_alloc_pending; + struct list_head *s_mb_avg_fragment_size; + rwlock_t *s_mb_avg_fragment_size_locks; + struct list_head *s_mb_largest_free_orders; + rwlock_t *s_mb_largest_free_orders_locks; + long unsigned int s_stripe; + unsigned int s_mb_max_linear_groups; + unsigned int s_mb_stream_request; + unsigned int s_mb_max_to_scan; + unsigned int s_mb_min_to_scan; + unsigned int s_mb_stats; + unsigned int s_mb_order2_reqs; + unsigned int s_mb_group_prealloc; + unsigned int s_mb_max_inode_prealloc; + unsigned int s_max_dir_size_kb; + long unsigned int s_mb_last_group; + long unsigned int s_mb_last_start; + unsigned int s_mb_prefetch; + unsigned int s_mb_prefetch_limit; + atomic_t s_bal_reqs; + atomic_t s_bal_success; + atomic_t s_bal_allocated; + atomic_t s_bal_ex_scanned; + atomic_t s_bal_groups_scanned; + atomic_t s_bal_goals; + atomic_t s_bal_breaks; + atomic_t s_bal_2orders; + atomic_t s_bal_cr0_bad_suggestions; + atomic_t s_bal_cr1_bad_suggestions; + atomic64_t s_bal_cX_groups_considered[4]; + atomic64_t s_bal_cX_hits[4]; + atomic64_t s_bal_cX_failed[4]; + atomic_t s_mb_buddies_generated; + atomic64_t s_mb_generation_time; + atomic_t s_mb_lost_chunks; + atomic_t s_mb_preallocated; + atomic_t s_mb_discarded; + atomic_t s_lock_busy; + struct ext4_locality_group *s_locality_groups; + long unsigned int s_sectors_written_start; + u64 s_kbytes_written; + unsigned int s_extent_max_zeroout_kb; + unsigned int s_log_groups_per_flex; + struct flex_groups **s_flex_groups; + ext4_group_t s_flex_groups_allocated; + struct workqueue_struct *rsv_conversion_wq; + struct timer_list s_err_report; + struct ext4_li_request *s_li_request; + unsigned int s_li_wait_mult; + struct task_struct *s_mmp_tsk; + long unsigned int s_last_trim_minblks; + struct crypto_shash *s_chksum_driver; + __u32 s_csum_seed; + struct shrinker s_es_shrinker; + struct list_head s_es_list; + long int s_es_nr_inode; + struct ext4_es_stats s_es_stats; + struct mb_cache *s_ea_block_cache; + struct mb_cache *s_ea_inode_cache; + spinlock_t s_es_lock; + struct ext4_journal_trigger s_journal_triggers[1]; + struct ratelimit_state s_err_ratelimit_state; + struct ratelimit_state s_warning_ratelimit_state; + struct ratelimit_state s_msg_ratelimit_state; + atomic_t s_warning_count; + atomic_t s_msg_count; + struct fscrypt_dummy_policy s_dummy_enc_policy; + struct percpu_rw_semaphore s_writepages_rwsem; + struct dax_device *s_daxdev; + u64 s_dax_part_off; + errseq_t s_bdev_wb_err; + spinlock_t s_bdev_wb_lock; + spinlock_t s_error_lock; + int s_add_error_count; + int s_first_error_code; + __u32 s_first_error_line; + __u32 s_first_error_ino; + __u64 s_first_error_block; + const char *s_first_error_func; + time64_t s_first_error_time; + int s_last_error_code; + __u32 s_last_error_line; + __u32 s_last_error_ino; + __u64 s_last_error_block; + const char *s_last_error_func; + time64_t s_last_error_time; + struct work_struct s_error_work; + atomic_t s_fc_subtid; + struct list_head s_fc_q[2]; + struct list_head s_fc_dentry_q[2]; + unsigned int s_fc_bytes; + spinlock_t s_fc_lock; + struct buffer_head *s_fc_bh; + struct ext4_fc_stats s_fc_stats; + tid_t s_fc_ineligible_tid; + struct ext4_fc_replay_state s_fc_replay_state; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct ext4_group_info { + long unsigned int bb_state; + struct rb_root bb_free_root; + ext4_grpblk_t bb_first_free; + ext4_grpblk_t bb_free; + ext4_grpblk_t bb_fragments; + int bb_avg_fragment_size_order; + ext4_grpblk_t bb_largest_free_order; + ext4_group_t bb_group; + struct list_head bb_prealloc_list; + struct rw_semaphore alloc_sem; + struct list_head bb_avg_fragment_size_node; + struct list_head bb_largest_free_order_node; + ext4_grpblk_t bb_counters[0]; +}; + +enum ext4_li_mode { + EXT4_LI_MODE_PREFETCH_BBITMAP = 0, + EXT4_LI_MODE_ITABLE = 1, +}; + +struct ext4_li_request { + struct super_block *lr_super; + enum ext4_li_mode lr_mode; + ext4_group_t lr_first_not_zeroed; + ext4_group_t lr_next_group; + struct list_head lr_request; + long unsigned int lr_next_sched; + long unsigned int lr_timeout; +}; + +struct ext4_iloc { + struct buffer_head *bh; + long unsigned int offset; + ext4_group_t block_group; +}; + +typedef enum { + EXT4_IGET_NORMAL = 0, + EXT4_IGET_SPECIAL = 1, + EXT4_IGET_HANDLE = 2, + EXT4_IGET_BAD = 4, +} ext4_iget_flags; + +struct ext4_rcu_ptr { + struct callback_head rcu; + void *ptr; +}; + +struct ext4_new_flex_group_data { + struct ext4_new_group_data *groups; + __u16 *bg_flags; + ext4_group_t count; +}; + +struct ipc_ids { + int in_use; + short unsigned int seq; + struct rw_semaphore rwsem; + struct idr ipcs_idr; + int max_idx; + int last_idx; + struct rhashtable key_ht; +}; + +struct ipc_namespace { + struct ipc_ids ids[3]; + int sem_ctls[4]; + int used_sems; + unsigned int msg_ctlmax; + unsigned int msg_ctlmnb; + unsigned int msg_ctlmni; + struct percpu_counter percpu_msg_bytes; + struct percpu_counter percpu_msg_hdrs; + size_t shm_ctlmax; + size_t shm_ctlall; + long unsigned int shm_tot; + int shm_ctlmni; + int shm_rmid_forced; + struct notifier_block ipcns_nb; + struct vfsmount *mq_mnt; + unsigned int mq_queues_count; + unsigned int mq_queues_max; + unsigned int mq_msg_max; + unsigned int mq_msgsize_max; + unsigned int mq_msg_default; + unsigned int mq_msgsize_default; + struct ctl_table_set mq_set; + struct ctl_table_header *mq_sysctls; + struct ctl_table_set ipc_set; + struct ctl_table_header *ipc_sysctls; + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct llist_node mnt_llist; + struct ns_common ns; +}; + +enum asn1_class { + ASN1_UNIV = 0, + ASN1_APPL = 1, + ASN1_CONT = 2, + ASN1_PRIV = 3, +}; + +enum asn1_method { + ASN1_PRIM = 0, + ASN1_CONS = 1, +}; + +enum asn1_tag { + ASN1_EOC = 0, + ASN1_BOOL = 1, + ASN1_INT = 2, + ASN1_BTS = 3, + ASN1_OTS = 4, + ASN1_NULL = 5, + ASN1_OID = 6, + ASN1_ODE = 7, + ASN1_EXT = 8, + ASN1_REAL = 9, + ASN1_ENUM = 10, + ASN1_EPDV = 11, + ASN1_UTF8STR = 12, + ASN1_RELOID = 13, + ASN1_SEQ = 16, + ASN1_SET = 17, + ASN1_NUMSTR = 18, + ASN1_PRNSTR = 19, + ASN1_TEXSTR = 20, + ASN1_VIDSTR = 21, + ASN1_IA5STR = 22, + ASN1_UNITIM = 23, + ASN1_GENTIM = 24, + ASN1_GRASTR = 25, + ASN1_VISSTR = 26, + ASN1_GENSTR = 27, + ASN1_UNISTR = 28, + ASN1_CHRSTR = 29, + ASN1_BMPSTR = 30, + ASN1_LONG_TAG = 31, +}; + +typedef int (*asn1_action_t)(void *, size_t, unsigned char, const void *, size_t); + +struct asn1_decoder { + const unsigned char *machine; + size_t machlen; + const asn1_action_t *actions; +}; + +enum asn1_opcode { + ASN1_OP_MATCH = 0, + ASN1_OP_MATCH_OR_SKIP = 1, + ASN1_OP_MATCH_ACT = 2, + ASN1_OP_MATCH_ACT_OR_SKIP = 3, + ASN1_OP_MATCH_JUMP = 4, + ASN1_OP_MATCH_JUMP_OR_SKIP = 5, + ASN1_OP_MATCH_ANY = 8, + ASN1_OP_MATCH_ANY_OR_SKIP = 9, + ASN1_OP_MATCH_ANY_ACT = 10, + ASN1_OP_MATCH_ANY_ACT_OR_SKIP = 11, + ASN1_OP_COND_MATCH_OR_SKIP = 17, + ASN1_OP_COND_MATCH_ACT_OR_SKIP = 19, + ASN1_OP_COND_MATCH_JUMP_OR_SKIP = 21, + ASN1_OP_COND_MATCH_ANY = 24, + ASN1_OP_COND_MATCH_ANY_OR_SKIP = 25, + ASN1_OP_COND_MATCH_ANY_ACT = 26, + ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 27, + ASN1_OP_COND_FAIL = 28, + ASN1_OP_COMPLETE = 29, + ASN1_OP_ACT = 30, + ASN1_OP_MAYBE_ACT = 31, + ASN1_OP_END_SEQ = 32, + ASN1_OP_END_SET = 33, + ASN1_OP_END_SEQ_OF = 34, + ASN1_OP_END_SET_OF = 35, + ASN1_OP_END_SEQ_ACT = 36, + ASN1_OP_END_SET_ACT = 37, + ASN1_OP_END_SEQ_OF_ACT = 38, + ASN1_OP_END_SET_OF_ACT = 39, + ASN1_OP_RETURN = 40, + ASN1_OP__NR = 41, +}; + +enum rsaprivkey_actions { + ACT_rsa_get_d = 0, + ACT_rsa_get_dp = 1, + ACT_rsa_get_dq = 2, + ACT_rsa_get_e = 3, + ACT_rsa_get_n = 4, + ACT_rsa_get_p = 5, + ACT_rsa_get_q = 6, + ACT_rsa_get_qinv = 7, + NR__rsaprivkey_actions = 8, +}; + +struct shash_desc { + struct crypto_shash *tfm; + void *__ctx[0]; +}; + +struct shash_alg { + int (*init)(struct shash_desc *); + int (*update)(struct shash_desc *, const u8 *, unsigned int); + int (*final)(struct shash_desc *, u8 *); + int (*finup)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*digest)(struct shash_desc *, const u8 *, unsigned int, u8 *); + int (*export)(struct shash_desc *, void *); + int (*import)(struct shash_desc *, const void *); + int (*setkey)(struct crypto_shash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_shash *); + void (*exit_tfm)(struct crypto_shash *); + unsigned int descsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int digestsize; + unsigned int statesize; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +enum hash_algo { + HASH_ALGO_MD4 = 0, + HASH_ALGO_MD5 = 1, + HASH_ALGO_SHA1 = 2, + HASH_ALGO_RIPE_MD_160 = 3, + HASH_ALGO_SHA256 = 4, + HASH_ALGO_SHA384 = 5, + HASH_ALGO_SHA512 = 6, + HASH_ALGO_SHA224 = 7, + HASH_ALGO_RIPE_MD_128 = 8, + HASH_ALGO_RIPE_MD_256 = 9, + HASH_ALGO_RIPE_MD_320 = 10, + HASH_ALGO_WP_256 = 11, + HASH_ALGO_WP_384 = 12, + HASH_ALGO_WP_512 = 13, + HASH_ALGO_TGR_128 = 14, + HASH_ALGO_TGR_160 = 15, + HASH_ALGO_TGR_192 = 16, + HASH_ALGO_SM3_256 = 17, + HASH_ALGO_STREEBOG_256 = 18, + HASH_ALGO_STREEBOG_512 = 19, + HASH_ALGO__LAST = 20, +}; + +enum OID { + OID_id_dsa_with_sha1 = 0, + OID_id_dsa = 1, + OID_id_ecPublicKey = 2, + OID_id_prime192v1 = 3, + OID_id_prime256v1 = 4, + OID_id_ecdsa_with_sha1 = 5, + OID_id_ecdsa_with_sha224 = 6, + OID_id_ecdsa_with_sha256 = 7, + OID_id_ecdsa_with_sha384 = 8, + OID_id_ecdsa_with_sha512 = 9, + OID_rsaEncryption = 10, + OID_md2WithRSAEncryption = 11, + OID_md3WithRSAEncryption = 12, + OID_md4WithRSAEncryption = 13, + OID_sha1WithRSAEncryption = 14, + OID_sha256WithRSAEncryption = 15, + OID_sha384WithRSAEncryption = 16, + OID_sha512WithRSAEncryption = 17, + OID_sha224WithRSAEncryption = 18, + OID_data = 19, + OID_signed_data = 20, + OID_email_address = 21, + OID_contentType = 22, + OID_messageDigest = 23, + OID_signingTime = 24, + OID_smimeCapabilites = 25, + OID_smimeAuthenticatedAttrs = 26, + OID_md2 = 27, + OID_md4 = 28, + OID_md5 = 29, + OID_mskrb5 = 30, + OID_krb5 = 31, + OID_krb5u2u = 32, + OID_msIndirectData = 33, + OID_msStatementType = 34, + OID_msSpOpusInfo = 35, + OID_msPeImageDataObjId = 36, + OID_msIndividualSPKeyPurpose = 37, + OID_msOutlookExpress = 38, + OID_ntlmssp = 39, + OID_spnego = 40, + OID_IAKerb = 41, + OID_PKU2U = 42, + OID_Scram = 43, + OID_certAuthInfoAccess = 44, + OID_sha1 = 45, + OID_id_ansip384r1 = 46, + OID_sha256 = 47, + OID_sha384 = 48, + OID_sha512 = 49, + OID_sha224 = 50, + OID_commonName = 51, + OID_surname = 52, + OID_countryName = 53, + OID_locality = 54, + OID_stateOrProvinceName = 55, + OID_organizationName = 56, + OID_organizationUnitName = 57, + OID_title = 58, + OID_description = 59, + OID_name = 60, + OID_givenName = 61, + OID_initials = 62, + OID_generationalQualifier = 63, + OID_subjectKeyIdentifier = 64, + OID_keyUsage = 65, + OID_subjectAltName = 66, + OID_issuerAltName = 67, + OID_basicConstraints = 68, + OID_crlDistributionPoints = 69, + OID_certPolicies = 70, + OID_authorityKeyIdentifier = 71, + OID_extKeyUsage = 72, + OID_NetlogonMechanism = 73, + OID_appleLocalKdcSupported = 74, + OID_gostCPSignA = 75, + OID_gostCPSignB = 76, + OID_gostCPSignC = 77, + OID_gost2012PKey256 = 78, + OID_gost2012PKey512 = 79, + OID_gost2012Digest256 = 80, + OID_gost2012Digest512 = 81, + OID_gost2012Signature256 = 82, + OID_gost2012Signature512 = 83, + OID_gostTC26Sign256A = 84, + OID_gostTC26Sign256B = 85, + OID_gostTC26Sign256C = 86, + OID_gostTC26Sign256D = 87, + OID_gostTC26Sign512A = 88, + OID_gostTC26Sign512B = 89, + OID_gostTC26Sign512C = 90, + OID_sm2 = 91, + OID_sm3 = 92, + OID_SM2_with_SM3 = 93, + OID_sm3WithRSAEncryption = 94, + OID_TPMLoadableKey = 95, + OID_TPMImportableKey = 96, + OID_TPMSealedData = 97, + OID__NR = 98, +}; + +struct public_key { + void *key; + u32 keylen; + enum OID algo; + void *params; + u32 paramlen; + bool key_is_private; + const char *id_type; + const char *pkey_algo; +}; + +struct asymmetric_key_id; + +struct public_key_signature { + struct asymmetric_key_id *auth_ids[3]; + u8 *s; + u8 *digest; + u32 s_size; + u32 digest_size; + const char *pkey_algo; + const char *hash_algo; + const char *encoding; + const void *data; + unsigned int data_size; +}; + +struct asymmetric_key_id { + short unsigned int len; + unsigned char data[0]; +}; + +enum key_being_used_for { + VERIFYING_MODULE_SIGNATURE = 0, + VERIFYING_FIRMWARE_SIGNATURE = 1, + VERIFYING_KEXEC_PE_SIGNATURE = 2, + VERIFYING_KEY_SIGNATURE = 3, + VERIFYING_KEY_SELF_SIGNATURE = 4, + VERIFYING_UNSPECIFIED_SIGNATURE = 5, + NR__KEY_BEING_USED_FOR = 6, +}; + +struct x509_certificate { + struct x509_certificate *next; + struct x509_certificate *signer; + struct public_key *pub; + struct public_key_signature *sig; + char *issuer; + char *subject; + struct asymmetric_key_id *id; + struct asymmetric_key_id *skid; + time64_t valid_from; + time64_t valid_to; + const void *tbs; + unsigned int tbs_size; + unsigned int raw_sig_size; + const void *raw_sig; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_subject; + unsigned int raw_subject_size; + unsigned int raw_skid_size; + const void *raw_skid; + unsigned int index; + bool seen; + bool verified; + bool self_signed; + bool unsupported_sig; + bool blacklisted; +}; + +struct pkcs7_signed_info { + struct pkcs7_signed_info *next; + struct x509_certificate *signer; + unsigned int index; + bool unsupported_crypto; + bool blacklisted; + const void *msgdigest; + unsigned int msgdigest_len; + unsigned int authattrs_len; + const void *authattrs; + long unsigned int aa_set; + time64_t signing_time; + struct public_key_signature *sig; +}; + +struct pkcs7_message { + struct x509_certificate *certs; + struct x509_certificate *crl; + struct pkcs7_signed_info *signed_infos; + u8 version; + bool have_authattrs; + enum OID data_type; + size_t data_len; + size_t data_hdrlen; + const void *data; +}; + +struct __call_single_data { + struct __call_single_node node; + smp_call_func_t func; + void *info; +}; + +struct io_cq { + struct request_queue *q; + struct io_context *ioc; + union { + struct list_head q_node; + struct kmem_cache *__rcu_icq_cache; + }; + union { + struct hlist_node ioc_node; + struct callback_head __rcu_head; + }; + unsigned int flags; +}; + +struct irq_affinity { + unsigned int pre_vectors; + unsigned int post_vectors; + unsigned int nr_sets; + unsigned int set_size[4]; + void (*calc_sets)(struct irq_affinity *, unsigned int); + void *priv; +}; + +typedef __u32 blk_mq_req_flags_t; + +struct sbitmap_word { + long unsigned int word; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int cleared; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sbitmap { + unsigned int depth; + unsigned int shift; + unsigned int map_nr; + bool round_robin; + struct sbitmap_word *map; + unsigned int *alloc_hint; +}; + +struct sbq_wait_state { + wait_queue_head_t wait; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sbitmap_queue { + struct sbitmap sb; + unsigned int wake_batch; + atomic_t wake_index; + struct sbq_wait_state *ws; + atomic_t ws_active; + unsigned int min_shallow_depth; + atomic_t completion_cnt; + atomic_t wakeup_cnt; +}; + +typedef __u32 req_flags_t; + +enum mq_rq_state { + MQ_RQ_IDLE = 0, + MQ_RQ_IN_FLIGHT = 1, + MQ_RQ_COMPLETE = 2, +}; + +enum rq_end_io_ret { + RQ_END_IO_NONE = 0, + RQ_END_IO_FREE = 1, +}; + +typedef enum rq_end_io_ret rq_end_io_fn(struct request *, blk_status_t); + +struct request { + struct request_queue *q; + struct blk_mq_ctx *mq_ctx; + struct blk_mq_hw_ctx *mq_hctx; + blk_opf_t cmd_flags; + req_flags_t rq_flags; + int tag; + int internal_tag; + unsigned int timeout; + unsigned int __data_len; + sector_t __sector; + struct bio *bio; + struct bio *biotail; + union { + struct list_head queuelist; + struct request *rq_next; + }; + struct block_device *part; + u64 start_time_ns; + u64 io_start_time_ns; + short unsigned int stats_sectors; + short unsigned int nr_phys_segments; + short unsigned int ioprio; + enum mq_rq_state state; + atomic_t ref; + long unsigned int deadline; + union { + struct hlist_node hash; + struct llist_node ipi_list; + }; + union { + struct rb_node rb_node; + struct bio_vec special_vec; + void *completion_data; + }; + union { + struct { + struct io_cq *icq; + void *priv[2]; + } elv; + struct { + unsigned int seq; + struct list_head list; + rq_end_io_fn *saved_end_io; + } flush; + }; + union { + struct __call_single_data csd; + u64 fifo_time; + }; + rq_end_io_fn *end_io; + void *end_io_data; +}; + +struct blk_mq_ctxs; + +struct blk_mq_ctx { + struct { + spinlock_t lock; + struct list_head rq_lists[3]; + long: 64; + long: 64; + }; + unsigned int cpu; + short unsigned int index_hw[3]; + struct blk_mq_hw_ctx *hctxs[3]; + struct request_queue *queue; + struct blk_mq_ctxs *ctxs; + struct kobject kobj; + long: 64; +}; + +struct blk_stat_callback { + struct list_head list; + struct timer_list timer; + struct blk_rq_stat *cpu_stat; + int (*bucket_fn)(const struct request *); + unsigned int buckets; + struct blk_rq_stat *stat; + void (*timer_fn)(struct blk_stat_callback *); + void *data; + struct callback_head rcu; +}; + +struct blk_mq_tags { + unsigned int nr_tags; + unsigned int nr_reserved_tags; + atomic_t active_queues; + struct sbitmap_queue bitmap_tags; + struct sbitmap_queue breserved_tags; + struct request **rqs; + struct request **static_rqs; + struct list_head page_list; + spinlock_t lock; +}; + +struct blk_mq_queue_map { + unsigned int *mq_map; + unsigned int nr_queues; + unsigned int queue_offset; +}; + +struct blk_mq_tag_set { + struct blk_mq_queue_map map[3]; + unsigned int nr_maps; + const struct blk_mq_ops *ops; + unsigned int nr_hw_queues; + unsigned int queue_depth; + unsigned int reserved_tags; + unsigned int cmd_size; + int numa_node; + unsigned int timeout; + unsigned int flags; + void *driver_data; + struct blk_mq_tags **tags; + struct blk_mq_tags *shared_tags; + struct mutex tag_list_lock; + struct list_head tag_list; + struct srcu_struct *srcu; +}; + +struct blk_mq_hw_ctx { + struct { + spinlock_t lock; + struct list_head dispatch; + long unsigned int state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct delayed_work run_work; + cpumask_var_t cpumask; + int next_cpu; + int next_cpu_batch; + long unsigned int flags; + void *sched_data; + struct request_queue *queue; + struct blk_flush_queue *fq; + void *driver_data; + struct sbitmap ctx_map; + struct blk_mq_ctx *dispatch_from; + unsigned int dispatch_busy; + short unsigned int type; + short unsigned int nr_ctx; + struct blk_mq_ctx **ctxs; + spinlock_t dispatch_wait_lock; + wait_queue_entry_t dispatch_wait; + atomic_t wait_index; + struct blk_mq_tags *tags; + struct blk_mq_tags *sched_tags; + long unsigned int queued; + long unsigned int run; + unsigned int numa_node; + unsigned int queue_num; + atomic_t nr_active; + struct hlist_node cpuhp_online; + struct hlist_node cpuhp_dead; + struct kobject kobj; + struct dentry *debugfs_dir; + struct dentry *sched_debugfs_dir; + struct list_head hctx_list; +}; + +enum hctx_type { + HCTX_TYPE_DEFAULT = 0, + HCTX_TYPE_READ = 1, + HCTX_TYPE_POLL = 2, + HCTX_MAX_TYPES = 3, +}; + +struct blk_mq_queue_data { + struct request *rq; + bool last; +}; + +struct virtio_device_id { + __u32 device; + __u32 vendor; +}; + +struct virtio_device; + +struct virtqueue { + struct list_head list; + void (*callback)(struct virtqueue *); + const char *name; + struct virtio_device *vdev; + unsigned int index; + unsigned int num_free; + unsigned int num_max; + void *priv; + bool reset; +}; + +struct vringh_config_ops; + +struct virtio_config_ops; + +struct virtio_device { + int index; + bool failed; + bool config_enabled; + bool config_change_pending; + spinlock_t config_lock; + spinlock_t vqs_list_lock; + struct device dev; + struct virtio_device_id id; + const struct virtio_config_ops *config; + const struct vringh_config_ops *vringh_config; + struct list_head vqs; + u64 features; + void *priv; +}; + +typedef void vq_callback_t(struct virtqueue *); + +struct virtio_shm_region; + +struct virtio_config_ops { + void (*get)(struct virtio_device *, unsigned int, void *, unsigned int); + void (*set)(struct virtio_device *, unsigned int, const void *, unsigned int); + u32 (*generation)(struct virtio_device *); + u8 (*get_status)(struct virtio_device *); + void (*set_status)(struct virtio_device *, u8); + void (*reset)(struct virtio_device *); + int (*find_vqs)(struct virtio_device *, unsigned int, struct virtqueue **, vq_callback_t **, const char * const *, const bool *, struct irq_affinity *); + void (*del_vqs)(struct virtio_device *); + void (*synchronize_cbs)(struct virtio_device *); + u64 (*get_features)(struct virtio_device *); + int (*finalize_features)(struct virtio_device *); + const char * (*bus_name)(struct virtio_device *); + int (*set_vq_affinity)(struct virtqueue *, const struct cpumask *); + const struct cpumask * (*get_vq_affinity)(struct virtio_device *, int); + bool (*get_shm_region)(struct virtio_device *, struct virtio_shm_region *, u8); + int (*disable_vq_and_reset)(struct virtqueue *); + int (*enable_vq_after_reset)(struct virtqueue *); +}; + +struct virtio_shm_region { + u64 addr; + u64 len; +}; + +struct blk_mq_ctxs { + struct kobject kobj; + struct blk_mq_ctx *queue_ctx; +}; + +struct font_desc { + int idx; + const char *name; + unsigned int width; + unsigned int height; + unsigned int charcount; + const void *data; + int pref; +}; + +struct font_data { + unsigned int extra[4]; + const unsigned char data[0]; +}; + +struct linux_logo { + int type; + unsigned int width; + unsigned int height; + unsigned int clutsize; + const unsigned char *clut; + const unsigned char *data; +}; + +typedef u8 acpi_adr_space_type; + +typedef enum { + ACPI_IMODE_LOAD_PASS1 = 1, + ACPI_IMODE_LOAD_PASS2 = 2, + ACPI_IMODE_EXECUTE = 3, +} acpi_interpreter_mode; + +struct acpi_rsconvert_info { + u8 opcode; + u8 resource_offset; + u8 aml_offset; + u8 value; +}; + +enum { + ACPI_RSC_INITGET = 0, + ACPI_RSC_INITSET = 1, + ACPI_RSC_FLAGINIT = 2, + ACPI_RSC_1BITFLAG = 3, + ACPI_RSC_2BITFLAG = 4, + ACPI_RSC_3BITFLAG = 5, + ACPI_RSC_6BITFLAG = 6, + ACPI_RSC_ADDRESS = 7, + ACPI_RSC_BITMASK = 8, + ACPI_RSC_BITMASK16 = 9, + ACPI_RSC_COUNT = 10, + ACPI_RSC_COUNT16 = 11, + ACPI_RSC_COUNT_GPIO_PIN = 12, + ACPI_RSC_COUNT_GPIO_RES = 13, + ACPI_RSC_COUNT_GPIO_VEN = 14, + ACPI_RSC_COUNT_SERIAL_RES = 15, + ACPI_RSC_COUNT_SERIAL_VEN = 16, + ACPI_RSC_DATA8 = 17, + ACPI_RSC_EXIT_EQ = 18, + ACPI_RSC_EXIT_LE = 19, + ACPI_RSC_EXIT_NE = 20, + ACPI_RSC_LENGTH = 21, + ACPI_RSC_MOVE_GPIO_PIN = 22, + ACPI_RSC_MOVE_GPIO_RES = 23, + ACPI_RSC_MOVE_SERIAL_RES = 24, + ACPI_RSC_MOVE_SERIAL_VEN = 25, + ACPI_RSC_MOVE8 = 26, + ACPI_RSC_MOVE16 = 27, + ACPI_RSC_MOVE32 = 28, + ACPI_RSC_MOVE64 = 29, + ACPI_RSC_SET8 = 30, + ACPI_RSC_SOURCE = 31, + ACPI_RSC_SOURCEX = 32, +}; + +struct hwrng { + const char *name; + int (*init)(struct hwrng *); + void (*cleanup)(struct hwrng *); + int (*data_present)(struct hwrng *, int); + int (*data_read)(struct hwrng *, u32 *); + int (*read)(struct hwrng *, void *, size_t, bool); + long unsigned int priv; + short unsigned int quality; + struct list_head list; + struct kref ref; + struct completion cleanup_done; + struct completion dying; +}; + +enum tpm_algorithms { + TPM_ALG_ERROR = 0, + TPM_ALG_SHA1 = 4, + TPM_ALG_KEYEDHASH = 8, + TPM_ALG_SHA256 = 11, + TPM_ALG_SHA384 = 12, + TPM_ALG_SHA512 = 13, + TPM_ALG_NULL = 16, + TPM_ALG_SM3_256 = 18, +}; + +struct tpm_digest { + u16 alg_id; + u8 digest[64]; +}; + +struct tpm_bank_info { + u16 alg_id; + u16 digest_size; + u16 crypto_id; +}; + +struct tpm_chip; + +struct tpm_class_ops { + unsigned int flags; + const u8 req_complete_mask; + const u8 req_complete_val; + bool (*req_canceled)(struct tpm_chip *, u8); + int (*recv)(struct tpm_chip *, u8 *, size_t); + int (*send)(struct tpm_chip *, u8 *, size_t); + void (*cancel)(struct tpm_chip *); + u8 (*status)(struct tpm_chip *); + void (*update_timeouts)(struct tpm_chip *, long unsigned int *); + void (*update_durations)(struct tpm_chip *, long unsigned int *); + int (*go_idle)(struct tpm_chip *); + int (*cmd_ready)(struct tpm_chip *); + int (*request_locality)(struct tpm_chip *, int); + int (*relinquish_locality)(struct tpm_chip *, int); + void (*clk_enable)(struct tpm_chip *, bool); +}; + +struct tpm_bios_log { + void *bios_event_log; + void *bios_event_log_end; +}; + +struct tpm_chip_seqops { + struct tpm_chip *chip; + const struct seq_operations *seqops; +}; + +struct tpm_space { + u32 context_tbl[3]; + u8 *context_buf; + u32 session_tbl[3]; + u8 *session_buf; + u32 buf_size; +}; + +struct tpm_chip { + struct device dev; + struct device devs; + struct cdev cdev; + struct cdev cdevs; + struct rw_semaphore ops_sem; + const struct tpm_class_ops *ops; + struct tpm_bios_log log; + struct tpm_chip_seqops bin_log_seqops; + struct tpm_chip_seqops ascii_log_seqops; + unsigned int flags; + int dev_num; + long unsigned int is_open; + char hwrng_name[64]; + struct hwrng hwrng; + struct mutex tpm_mutex; + long unsigned int timeout_a; + long unsigned int timeout_b; + long unsigned int timeout_c; + long unsigned int timeout_d; + bool timeout_adjusted; + long unsigned int duration[4]; + bool duration_adjusted; + struct dentry *bios_dir[3]; + const struct attribute_group *groups[8]; + unsigned int groups_cnt; + u32 nr_allocated_banks; + struct tpm_bank_info *allocated_banks; + acpi_handle acpi_dev_handle; + char ppi_version[4]; + struct tpm_space work_space; + u32 last_cc; + u32 nr_commands; + u32 *cc_attrs_tbl; + int locality; +}; + +enum tpm_duration { + TPM_SHORT = 0, + TPM_MEDIUM = 1, + TPM_LONG = 2, + TPM_LONG_LONG = 3, + TPM_UNDEFINED = 4, + TPM_NUM_DURATIONS = 4, +}; + +enum tpm2_const { + TPM2_PLATFORM_PCR = 24, + TPM2_PCR_SELECT_MIN = 3, +}; + +enum tpm2_timeouts { + TPM2_TIMEOUT_A = 750, + TPM2_TIMEOUT_B = 2000, + TPM2_TIMEOUT_C = 200, + TPM2_TIMEOUT_D = 30, + TPM2_DURATION_SHORT = 20, + TPM2_DURATION_MEDIUM = 750, + TPM2_DURATION_LONG = 2000, + TPM2_DURATION_LONG_LONG = 300000, + TPM2_DURATION_DEFAULT = 120000, +}; + +enum tpm2_structures { + TPM2_ST_NO_SESSIONS = 32769, + TPM2_ST_SESSIONS = 32770, +}; + +enum tpm2_return_codes { + TPM2_RC_SUCCESS = 0, + TPM2_RC_HASH = 131, + TPM2_RC_HANDLE = 139, + TPM2_RC_INITIALIZE = 256, + TPM2_RC_FAILURE = 257, + TPM2_RC_DISABLED = 288, + TPM2_RC_UPGRADE = 301, + TPM2_RC_COMMAND_CODE = 323, + TPM2_RC_TESTING = 2314, + TPM2_RC_REFERENCE_H0 = 2320, + TPM2_RC_RETRY = 2338, +}; + +enum tpm2_command_codes { + TPM2_CC_FIRST = 287, + TPM2_CC_HIERARCHY_CONTROL = 289, + TPM2_CC_HIERARCHY_CHANGE_AUTH = 297, + TPM2_CC_CREATE_PRIMARY = 305, + TPM2_CC_SEQUENCE_COMPLETE = 318, + TPM2_CC_SELF_TEST = 323, + TPM2_CC_STARTUP = 324, + TPM2_CC_SHUTDOWN = 325, + TPM2_CC_NV_READ = 334, + TPM2_CC_CREATE = 339, + TPM2_CC_LOAD = 343, + TPM2_CC_SEQUENCE_UPDATE = 348, + TPM2_CC_UNSEAL = 350, + TPM2_CC_CONTEXT_LOAD = 353, + TPM2_CC_CONTEXT_SAVE = 354, + TPM2_CC_FLUSH_CONTEXT = 357, + TPM2_CC_VERIFY_SIGNATURE = 375, + TPM2_CC_GET_CAPABILITY = 378, + TPM2_CC_GET_RANDOM = 379, + TPM2_CC_PCR_READ = 382, + TPM2_CC_PCR_EXTEND = 386, + TPM2_CC_EVENT_SEQUENCE_COMPLETE = 389, + TPM2_CC_HASH_SEQUENCE_START = 390, + TPM2_CC_CREATE_LOADED = 401, + TPM2_CC_LAST = 403, +}; + +enum tpm2_permanent_handles { + TPM2_RS_PW = 1073741833, +}; + +enum tpm2_capabilities { + TPM2_CAP_HANDLES = 1, + TPM2_CAP_COMMANDS = 2, + TPM2_CAP_PCRS = 5, + TPM2_CAP_TPM_PROPERTIES = 6, +}; + +enum tpm2_properties { + TPM_PT_TOTAL_COMMANDS = 297, +}; + +enum tpm2_startup_types { + TPM2_SU_CLEAR = 0, + TPM2_SU_STATE = 1, +}; + +enum tpm2_cc_attrs { + TPM2_CC_ATTR_CHANDLES = 25, + TPM2_CC_ATTR_RHANDLE = 28, +}; + +enum tpm_chip_flags { + TPM_CHIP_FLAG_TPM2 = 2, + TPM_CHIP_FLAG_IRQ = 4, + TPM_CHIP_FLAG_VIRTUAL = 8, + TPM_CHIP_FLAG_HAVE_TIMEOUTS = 16, + TPM_CHIP_FLAG_ALWAYS_POWERED = 32, + TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED = 64, + TPM_CHIP_FLAG_FIRMWARE_UPGRADE = 128, +}; + +struct tpm_header { + __be16 tag; + __be32 length; + union { + __be32 ordinal; + __be32 return_code; + }; +} __attribute__((packed)); + +enum tpm_buf_flags { + TPM_BUF_OVERFLOW = 1, +}; + +struct tpm_buf { + unsigned int flags; + u8 *data; +}; + +struct tpm2_hash { + unsigned int crypto_id; + unsigned int tpm_id; +}; + +struct tpm2_pcr_read_out { + __be32 update_cnt; + __be32 pcr_selects_cnt; + __be16 hash_alg; + u8 pcr_select_size; + u8 pcr_select[3]; + __be32 digests_cnt; + __be16 digest_size; + u8 digest[0]; +} __attribute__((packed)); + +struct tpm2_null_auth_area { + __be32 handle; + __be16 nonce_size; + u8 attributes; + __be16 auth_size; +} __attribute__((packed)); + +struct tpm2_get_random_out { + __be16 size; + u8 buffer[128]; +}; + +struct tpm2_get_cap_out { + u8 more_data; + __be32 subcap_id; + __be32 property_cnt; + __be32 property_id; + __be32 value; +} __attribute__((packed)); + +struct tpm2_pcr_selection { + __be16 hash_alg; + u8 size_of_select; + u8 pcr_select[3]; +}; + +enum dmi_field { + DMI_NONE = 0, + DMI_BIOS_VENDOR = 1, + DMI_BIOS_VERSION = 2, + DMI_BIOS_DATE = 3, + DMI_BIOS_RELEASE = 4, + DMI_EC_FIRMWARE_RELEASE = 5, + DMI_SYS_VENDOR = 6, + DMI_PRODUCT_NAME = 7, + DMI_PRODUCT_VERSION = 8, + DMI_PRODUCT_SERIAL = 9, + DMI_PRODUCT_UUID = 10, + DMI_PRODUCT_SKU = 11, + DMI_PRODUCT_FAMILY = 12, + DMI_BOARD_VENDOR = 13, + DMI_BOARD_NAME = 14, + DMI_BOARD_VERSION = 15, + DMI_BOARD_SERIAL = 16, + DMI_BOARD_ASSET_TAG = 17, + DMI_CHASSIS_VENDOR = 18, + DMI_CHASSIS_TYPE = 19, + DMI_CHASSIS_VERSION = 20, + DMI_CHASSIS_SERIAL = 21, + DMI_CHASSIS_ASSET_TAG = 22, + DMI_STRING_MAX = 23, + DMI_OEM_STRING = 24, +}; + +struct dmi_device_attribute { + struct device_attribute dev_attr; + int field; +}; + +struct mafield { + const char *prefix; + int field; +}; + +struct bpf_insn { + __u8 code; + __u8 dst_reg: 4; + __u8 src_reg: 4; + __s16 off; + __s32 imm; +}; + +struct bpf_cgroup_storage_key { + __u64 cgroup_inode_id; + __u32 attach_type; +}; + +enum bpf_cgroup_iter_order { + BPF_CGROUP_ITER_ORDER_UNSPEC = 0, + BPF_CGROUP_ITER_SELF_ONLY = 1, + BPF_CGROUP_ITER_DESCENDANTS_PRE = 2, + BPF_CGROUP_ITER_DESCENDANTS_POST = 3, + BPF_CGROUP_ITER_ANCESTORS_UP = 4, +}; + +union bpf_iter_link_info { + struct { + __u32 map_fd; + } map; + struct { + enum bpf_cgroup_iter_order order; + __u32 cgroup_fd; + __u64 cgroup_id; + } cgroup; + struct { + __u32 tid; + __u32 pid; + __u32 pid_fd; + } task; +}; + +enum bpf_map_type { + BPF_MAP_TYPE_UNSPEC = 0, + BPF_MAP_TYPE_HASH = 1, + BPF_MAP_TYPE_ARRAY = 2, + BPF_MAP_TYPE_PROG_ARRAY = 3, + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 4, + BPF_MAP_TYPE_PERCPU_HASH = 5, + BPF_MAP_TYPE_PERCPU_ARRAY = 6, + BPF_MAP_TYPE_STACK_TRACE = 7, + BPF_MAP_TYPE_CGROUP_ARRAY = 8, + BPF_MAP_TYPE_LRU_HASH = 9, + BPF_MAP_TYPE_LRU_PERCPU_HASH = 10, + BPF_MAP_TYPE_LPM_TRIE = 11, + BPF_MAP_TYPE_ARRAY_OF_MAPS = 12, + BPF_MAP_TYPE_HASH_OF_MAPS = 13, + BPF_MAP_TYPE_DEVMAP = 14, + BPF_MAP_TYPE_SOCKMAP = 15, + BPF_MAP_TYPE_CPUMAP = 16, + BPF_MAP_TYPE_XSKMAP = 17, + BPF_MAP_TYPE_SOCKHASH = 18, + BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED = 19, + BPF_MAP_TYPE_CGROUP_STORAGE = 19, + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 20, + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 21, + BPF_MAP_TYPE_QUEUE = 22, + BPF_MAP_TYPE_STACK = 23, + BPF_MAP_TYPE_SK_STORAGE = 24, + BPF_MAP_TYPE_DEVMAP_HASH = 25, + BPF_MAP_TYPE_STRUCT_OPS = 26, + BPF_MAP_TYPE_RINGBUF = 27, + BPF_MAP_TYPE_INODE_STORAGE = 28, + BPF_MAP_TYPE_TASK_STORAGE = 29, + BPF_MAP_TYPE_BLOOM_FILTER = 30, + BPF_MAP_TYPE_USER_RINGBUF = 31, + BPF_MAP_TYPE_CGRP_STORAGE = 32, +}; + +enum bpf_prog_type { + BPF_PROG_TYPE_UNSPEC = 0, + BPF_PROG_TYPE_SOCKET_FILTER = 1, + BPF_PROG_TYPE_KPROBE = 2, + BPF_PROG_TYPE_SCHED_CLS = 3, + BPF_PROG_TYPE_SCHED_ACT = 4, + BPF_PROG_TYPE_TRACEPOINT = 5, + BPF_PROG_TYPE_XDP = 6, + BPF_PROG_TYPE_PERF_EVENT = 7, + BPF_PROG_TYPE_CGROUP_SKB = 8, + BPF_PROG_TYPE_CGROUP_SOCK = 9, + BPF_PROG_TYPE_LWT_IN = 10, + BPF_PROG_TYPE_LWT_OUT = 11, + BPF_PROG_TYPE_LWT_XMIT = 12, + BPF_PROG_TYPE_SOCK_OPS = 13, + BPF_PROG_TYPE_SK_SKB = 14, + BPF_PROG_TYPE_CGROUP_DEVICE = 15, + BPF_PROG_TYPE_SK_MSG = 16, + BPF_PROG_TYPE_RAW_TRACEPOINT = 17, + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 18, + BPF_PROG_TYPE_LWT_SEG6LOCAL = 19, + BPF_PROG_TYPE_LIRC_MODE2 = 20, + BPF_PROG_TYPE_SK_REUSEPORT = 21, + BPF_PROG_TYPE_FLOW_DISSECTOR = 22, + BPF_PROG_TYPE_CGROUP_SYSCTL = 23, + BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 24, + BPF_PROG_TYPE_CGROUP_SOCKOPT = 25, + BPF_PROG_TYPE_TRACING = 26, + BPF_PROG_TYPE_STRUCT_OPS = 27, + BPF_PROG_TYPE_EXT = 28, + BPF_PROG_TYPE_LSM = 29, + BPF_PROG_TYPE_SK_LOOKUP = 30, + BPF_PROG_TYPE_SYSCALL = 31, +}; + +enum bpf_attach_type { + BPF_CGROUP_INET_INGRESS = 0, + BPF_CGROUP_INET_EGRESS = 1, + BPF_CGROUP_INET_SOCK_CREATE = 2, + BPF_CGROUP_SOCK_OPS = 3, + BPF_SK_SKB_STREAM_PARSER = 4, + BPF_SK_SKB_STREAM_VERDICT = 5, + BPF_CGROUP_DEVICE = 6, + BPF_SK_MSG_VERDICT = 7, + BPF_CGROUP_INET4_BIND = 8, + BPF_CGROUP_INET6_BIND = 9, + BPF_CGROUP_INET4_CONNECT = 10, + BPF_CGROUP_INET6_CONNECT = 11, + BPF_CGROUP_INET4_POST_BIND = 12, + BPF_CGROUP_INET6_POST_BIND = 13, + BPF_CGROUP_UDP4_SENDMSG = 14, + BPF_CGROUP_UDP6_SENDMSG = 15, + BPF_LIRC_MODE2 = 16, + BPF_FLOW_DISSECTOR = 17, + BPF_CGROUP_SYSCTL = 18, + BPF_CGROUP_UDP4_RECVMSG = 19, + BPF_CGROUP_UDP6_RECVMSG = 20, + BPF_CGROUP_GETSOCKOPT = 21, + BPF_CGROUP_SETSOCKOPT = 22, + BPF_TRACE_RAW_TP = 23, + BPF_TRACE_FENTRY = 24, + BPF_TRACE_FEXIT = 25, + BPF_MODIFY_RETURN = 26, + BPF_LSM_MAC = 27, + BPF_TRACE_ITER = 28, + BPF_CGROUP_INET4_GETPEERNAME = 29, + BPF_CGROUP_INET6_GETPEERNAME = 30, + BPF_CGROUP_INET4_GETSOCKNAME = 31, + BPF_CGROUP_INET6_GETSOCKNAME = 32, + BPF_XDP_DEVMAP = 33, + BPF_CGROUP_INET_SOCK_RELEASE = 34, + BPF_XDP_CPUMAP = 35, + BPF_SK_LOOKUP = 36, + BPF_XDP = 37, + BPF_SK_SKB_VERDICT = 38, + BPF_SK_REUSEPORT_SELECT = 39, + BPF_SK_REUSEPORT_SELECT_OR_MIGRATE = 40, + BPF_PERF_EVENT = 41, + BPF_TRACE_KPROBE_MULTI = 42, + BPF_LSM_CGROUP = 43, + __MAX_BPF_ATTACH_TYPE = 44, +}; + +enum { + BPF_ANY = 0, + BPF_NOEXIST = 1, + BPF_EXIST = 2, + BPF_F_LOCK = 4, +}; + +enum { + BPF_F_NO_PREALLOC = 1, + BPF_F_NO_COMMON_LRU = 2, + BPF_F_NUMA_NODE = 4, + BPF_F_RDONLY = 8, + BPF_F_WRONLY = 16, + BPF_F_STACK_BUILD_ID = 32, + BPF_F_ZERO_SEED = 64, + BPF_F_RDONLY_PROG = 128, + BPF_F_WRONLY_PROG = 256, + BPF_F_CLONE = 512, + BPF_F_MMAPABLE = 1024, + BPF_F_PRESERVE_ELEMS = 2048, + BPF_F_INNER_MAP = 4096, +}; + +union bpf_attr { + struct { + __u32 map_type; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + __u32 inner_map_fd; + __u32 numa_node; + char map_name[16]; + __u32 map_ifindex; + __u32 btf_fd; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u32 btf_vmlinux_value_type_id; + __u64 map_extra; + }; + struct { + __u32 map_fd; + __u64 key; + union { + __u64 value; + __u64 next_key; + }; + __u64 flags; + }; + struct { + __u64 in_batch; + __u64 out_batch; + __u64 keys; + __u64 values; + __u32 count; + __u32 map_fd; + __u64 elem_flags; + __u64 flags; + } batch; + struct { + __u32 prog_type; + __u32 insn_cnt; + __u64 insns; + __u64 license; + __u32 log_level; + __u32 log_size; + __u64 log_buf; + __u32 kern_version; + __u32 prog_flags; + char prog_name[16]; + __u32 prog_ifindex; + __u32 expected_attach_type; + __u32 prog_btf_fd; + __u32 func_info_rec_size; + __u64 func_info; + __u32 func_info_cnt; + __u32 line_info_rec_size; + __u64 line_info; + __u32 line_info_cnt; + __u32 attach_btf_id; + union { + __u32 attach_prog_fd; + __u32 attach_btf_obj_fd; + }; + __u32 core_relo_cnt; + __u64 fd_array; + __u64 core_relos; + __u32 core_relo_rec_size; + }; + struct { + __u64 pathname; + __u32 bpf_fd; + __u32 file_flags; + }; + struct { + __u32 target_fd; + __u32 attach_bpf_fd; + __u32 attach_type; + __u32 attach_flags; + __u32 replace_bpf_fd; + }; + struct { + __u32 prog_fd; + __u32 retval; + __u32 data_size_in; + __u32 data_size_out; + __u64 data_in; + __u64 data_out; + __u32 repeat; + __u32 duration; + __u32 ctx_size_in; + __u32 ctx_size_out; + __u64 ctx_in; + __u64 ctx_out; + __u32 flags; + __u32 cpu; + __u32 batch_size; + } test; + struct { + union { + __u32 start_id; + __u32 prog_id; + __u32 map_id; + __u32 btf_id; + __u32 link_id; + }; + __u32 next_id; + __u32 open_flags; + }; + struct { + __u32 bpf_fd; + __u32 info_len; + __u64 info; + } info; + struct { + __u32 target_fd; + __u32 attach_type; + __u32 query_flags; + __u32 attach_flags; + __u64 prog_ids; + __u32 prog_cnt; + __u64 prog_attach_flags; + } query; + struct { + __u64 name; + __u32 prog_fd; + } raw_tracepoint; + struct { + __u64 btf; + __u64 btf_log_buf; + __u32 btf_size; + __u32 btf_log_size; + __u32 btf_log_level; + }; + struct { + __u32 pid; + __u32 fd; + __u32 flags; + __u32 buf_len; + __u64 buf; + __u32 prog_id; + __u32 fd_type; + __u64 probe_offset; + __u64 probe_addr; + } task_fd_query; + struct { + __u32 prog_fd; + union { + __u32 target_fd; + __u32 target_ifindex; + }; + __u32 attach_type; + __u32 flags; + union { + __u32 target_btf_id; + struct { + __u64 iter_info; + __u32 iter_info_len; + }; + struct { + __u64 bpf_cookie; + } perf_event; + struct { + __u32 flags; + __u32 cnt; + __u64 syms; + __u64 addrs; + __u64 cookies; + } kprobe_multi; + struct { + __u32 target_btf_id; + __u64 cookie; + } tracing; + }; + } link_create; + struct { + __u32 link_fd; + __u32 new_prog_fd; + __u32 flags; + __u32 old_prog_fd; + } link_update; + struct { + __u32 link_fd; + } link_detach; + struct { + __u32 type; + } enable_stats; + struct { + __u32 link_fd; + __u32 flags; + } iter_create; + struct { + __u32 prog_fd; + __u32 map_fd; + __u32 flags; + } prog_bind_map; +}; + +enum bpf_func_id { + BPF_FUNC_unspec = 0, + BPF_FUNC_map_lookup_elem = 1, + BPF_FUNC_map_update_elem = 2, + BPF_FUNC_map_delete_elem = 3, + BPF_FUNC_probe_read = 4, + BPF_FUNC_ktime_get_ns = 5, + BPF_FUNC_trace_printk = 6, + BPF_FUNC_get_prandom_u32 = 7, + BPF_FUNC_get_smp_processor_id = 8, + BPF_FUNC_skb_store_bytes = 9, + BPF_FUNC_l3_csum_replace = 10, + BPF_FUNC_l4_csum_replace = 11, + BPF_FUNC_tail_call = 12, + BPF_FUNC_clone_redirect = 13, + BPF_FUNC_get_current_pid_tgid = 14, + BPF_FUNC_get_current_uid_gid = 15, + BPF_FUNC_get_current_comm = 16, + BPF_FUNC_get_cgroup_classid = 17, + BPF_FUNC_skb_vlan_push = 18, + BPF_FUNC_skb_vlan_pop = 19, + BPF_FUNC_skb_get_tunnel_key = 20, + BPF_FUNC_skb_set_tunnel_key = 21, + BPF_FUNC_perf_event_read = 22, + BPF_FUNC_redirect = 23, + BPF_FUNC_get_route_realm = 24, + BPF_FUNC_perf_event_output = 25, + BPF_FUNC_skb_load_bytes = 26, + BPF_FUNC_get_stackid = 27, + BPF_FUNC_csum_diff = 28, + BPF_FUNC_skb_get_tunnel_opt = 29, + BPF_FUNC_skb_set_tunnel_opt = 30, + BPF_FUNC_skb_change_proto = 31, + BPF_FUNC_skb_change_type = 32, + BPF_FUNC_skb_under_cgroup = 33, + BPF_FUNC_get_hash_recalc = 34, + BPF_FUNC_get_current_task = 35, + BPF_FUNC_probe_write_user = 36, + BPF_FUNC_current_task_under_cgroup = 37, + BPF_FUNC_skb_change_tail = 38, + BPF_FUNC_skb_pull_data = 39, + BPF_FUNC_csum_update = 40, + BPF_FUNC_set_hash_invalid = 41, + BPF_FUNC_get_numa_node_id = 42, + BPF_FUNC_skb_change_head = 43, + BPF_FUNC_xdp_adjust_head = 44, + BPF_FUNC_probe_read_str = 45, + BPF_FUNC_get_socket_cookie = 46, + BPF_FUNC_get_socket_uid = 47, + BPF_FUNC_set_hash = 48, + BPF_FUNC_setsockopt = 49, + BPF_FUNC_skb_adjust_room = 50, + BPF_FUNC_redirect_map = 51, + BPF_FUNC_sk_redirect_map = 52, + BPF_FUNC_sock_map_update = 53, + BPF_FUNC_xdp_adjust_meta = 54, + BPF_FUNC_perf_event_read_value = 55, + BPF_FUNC_perf_prog_read_value = 56, + BPF_FUNC_getsockopt = 57, + BPF_FUNC_override_return = 58, + BPF_FUNC_sock_ops_cb_flags_set = 59, + BPF_FUNC_msg_redirect_map = 60, + BPF_FUNC_msg_apply_bytes = 61, + BPF_FUNC_msg_cork_bytes = 62, + BPF_FUNC_msg_pull_data = 63, + BPF_FUNC_bind = 64, + BPF_FUNC_xdp_adjust_tail = 65, + BPF_FUNC_skb_get_xfrm_state = 66, + BPF_FUNC_get_stack = 67, + BPF_FUNC_skb_load_bytes_relative = 68, + BPF_FUNC_fib_lookup = 69, + BPF_FUNC_sock_hash_update = 70, + BPF_FUNC_msg_redirect_hash = 71, + BPF_FUNC_sk_redirect_hash = 72, + BPF_FUNC_lwt_push_encap = 73, + BPF_FUNC_lwt_seg6_store_bytes = 74, + BPF_FUNC_lwt_seg6_adjust_srh = 75, + BPF_FUNC_lwt_seg6_action = 76, + BPF_FUNC_rc_repeat = 77, + BPF_FUNC_rc_keydown = 78, + BPF_FUNC_skb_cgroup_id = 79, + BPF_FUNC_get_current_cgroup_id = 80, + BPF_FUNC_get_local_storage = 81, + BPF_FUNC_sk_select_reuseport = 82, + BPF_FUNC_skb_ancestor_cgroup_id = 83, + BPF_FUNC_sk_lookup_tcp = 84, + BPF_FUNC_sk_lookup_udp = 85, + BPF_FUNC_sk_release = 86, + BPF_FUNC_map_push_elem = 87, + BPF_FUNC_map_pop_elem = 88, + BPF_FUNC_map_peek_elem = 89, + BPF_FUNC_msg_push_data = 90, + BPF_FUNC_msg_pop_data = 91, + BPF_FUNC_rc_pointer_rel = 92, + BPF_FUNC_spin_lock = 93, + BPF_FUNC_spin_unlock = 94, + BPF_FUNC_sk_fullsock = 95, + BPF_FUNC_tcp_sock = 96, + BPF_FUNC_skb_ecn_set_ce = 97, + BPF_FUNC_get_listener_sock = 98, + BPF_FUNC_skc_lookup_tcp = 99, + BPF_FUNC_tcp_check_syncookie = 100, + BPF_FUNC_sysctl_get_name = 101, + BPF_FUNC_sysctl_get_current_value = 102, + BPF_FUNC_sysctl_get_new_value = 103, + BPF_FUNC_sysctl_set_new_value = 104, + BPF_FUNC_strtol = 105, + BPF_FUNC_strtoul = 106, + BPF_FUNC_sk_storage_get = 107, + BPF_FUNC_sk_storage_delete = 108, + BPF_FUNC_send_signal = 109, + BPF_FUNC_tcp_gen_syncookie = 110, + BPF_FUNC_skb_output = 111, + BPF_FUNC_probe_read_user = 112, + BPF_FUNC_probe_read_kernel = 113, + BPF_FUNC_probe_read_user_str = 114, + BPF_FUNC_probe_read_kernel_str = 115, + BPF_FUNC_tcp_send_ack = 116, + BPF_FUNC_send_signal_thread = 117, + BPF_FUNC_jiffies64 = 118, + BPF_FUNC_read_branch_records = 119, + BPF_FUNC_get_ns_current_pid_tgid = 120, + BPF_FUNC_xdp_output = 121, + BPF_FUNC_get_netns_cookie = 122, + BPF_FUNC_get_current_ancestor_cgroup_id = 123, + BPF_FUNC_sk_assign = 124, + BPF_FUNC_ktime_get_boot_ns = 125, + BPF_FUNC_seq_printf = 126, + BPF_FUNC_seq_write = 127, + BPF_FUNC_sk_cgroup_id = 128, + BPF_FUNC_sk_ancestor_cgroup_id = 129, + BPF_FUNC_ringbuf_output = 130, + BPF_FUNC_ringbuf_reserve = 131, + BPF_FUNC_ringbuf_submit = 132, + BPF_FUNC_ringbuf_discard = 133, + BPF_FUNC_ringbuf_query = 134, + BPF_FUNC_csum_level = 135, + BPF_FUNC_skc_to_tcp6_sock = 136, + BPF_FUNC_skc_to_tcp_sock = 137, + BPF_FUNC_skc_to_tcp_timewait_sock = 138, + BPF_FUNC_skc_to_tcp_request_sock = 139, + BPF_FUNC_skc_to_udp6_sock = 140, + BPF_FUNC_get_task_stack = 141, + BPF_FUNC_load_hdr_opt = 142, + BPF_FUNC_store_hdr_opt = 143, + BPF_FUNC_reserve_hdr_opt = 144, + BPF_FUNC_inode_storage_get = 145, + BPF_FUNC_inode_storage_delete = 146, + BPF_FUNC_d_path = 147, + BPF_FUNC_copy_from_user = 148, + BPF_FUNC_snprintf_btf = 149, + BPF_FUNC_seq_printf_btf = 150, + BPF_FUNC_skb_cgroup_classid = 151, + BPF_FUNC_redirect_neigh = 152, + BPF_FUNC_per_cpu_ptr = 153, + BPF_FUNC_this_cpu_ptr = 154, + BPF_FUNC_redirect_peer = 155, + BPF_FUNC_task_storage_get = 156, + BPF_FUNC_task_storage_delete = 157, + BPF_FUNC_get_current_task_btf = 158, + BPF_FUNC_bprm_opts_set = 159, + BPF_FUNC_ktime_get_coarse_ns = 160, + BPF_FUNC_ima_inode_hash = 161, + BPF_FUNC_sock_from_file = 162, + BPF_FUNC_check_mtu = 163, + BPF_FUNC_for_each_map_elem = 164, + BPF_FUNC_snprintf = 165, + BPF_FUNC_sys_bpf = 166, + BPF_FUNC_btf_find_by_name_kind = 167, + BPF_FUNC_sys_close = 168, + BPF_FUNC_timer_init = 169, + BPF_FUNC_timer_set_callback = 170, + BPF_FUNC_timer_start = 171, + BPF_FUNC_timer_cancel = 172, + BPF_FUNC_get_func_ip = 173, + BPF_FUNC_get_attach_cookie = 174, + BPF_FUNC_task_pt_regs = 175, + BPF_FUNC_get_branch_snapshot = 176, + BPF_FUNC_trace_vprintk = 177, + BPF_FUNC_skc_to_unix_sock = 178, + BPF_FUNC_kallsyms_lookup_name = 179, + BPF_FUNC_find_vma = 180, + BPF_FUNC_loop = 181, + BPF_FUNC_strncmp = 182, + BPF_FUNC_get_func_arg = 183, + BPF_FUNC_get_func_ret = 184, + BPF_FUNC_get_func_arg_cnt = 185, + BPF_FUNC_get_retval = 186, + BPF_FUNC_set_retval = 187, + BPF_FUNC_xdp_get_buff_len = 188, + BPF_FUNC_xdp_load_bytes = 189, + BPF_FUNC_xdp_store_bytes = 190, + BPF_FUNC_copy_from_user_task = 191, + BPF_FUNC_skb_set_tstamp = 192, + BPF_FUNC_ima_file_hash = 193, + BPF_FUNC_kptr_xchg = 194, + BPF_FUNC_map_lookup_percpu_elem = 195, + BPF_FUNC_skc_to_mptcp_sock = 196, + BPF_FUNC_dynptr_from_mem = 197, + BPF_FUNC_ringbuf_reserve_dynptr = 198, + BPF_FUNC_ringbuf_submit_dynptr = 199, + BPF_FUNC_ringbuf_discard_dynptr = 200, + BPF_FUNC_dynptr_read = 201, + BPF_FUNC_dynptr_write = 202, + BPF_FUNC_dynptr_data = 203, + BPF_FUNC_tcp_raw_gen_syncookie_ipv4 = 204, + BPF_FUNC_tcp_raw_gen_syncookie_ipv6 = 205, + BPF_FUNC_tcp_raw_check_syncookie_ipv4 = 206, + BPF_FUNC_tcp_raw_check_syncookie_ipv6 = 207, + BPF_FUNC_ktime_get_tai_ns = 208, + BPF_FUNC_user_ringbuf_drain = 209, + BPF_FUNC_cgrp_storage_get = 210, + BPF_FUNC_cgrp_storage_delete = 211, + __BPF_FUNC_MAX_ID = 212, +}; + +enum { + BPF_F_INGRESS = 1, +}; + +enum sk_action { + SK_DROP = 0, + SK_PASS = 1, +}; + +struct bpf_link_info { + __u32 type; + __u32 id; + __u32 prog_id; + union { + struct { + __u64 tp_name; + __u32 tp_name_len; + } raw_tracepoint; + struct { + __u32 attach_type; + __u32 target_obj_id; + __u32 target_btf_id; + } tracing; + struct { + __u64 cgroup_id; + __u32 attach_type; + } cgroup; + struct { + __u64 target_name; + __u32 target_name_len; + union { + struct { + __u32 map_id; + } map; + }; + union { + struct { + __u64 cgroup_id; + __u32 order; + } cgroup; + struct { + __u32 tid; + __u32 pid; + } task; + }; + } iter; + struct { + __u32 netns_ino; + __u32 attach_type; + } netns; + struct { + __u32 ifindex; + } xdp; + }; +}; + +enum { + BPF_SOCK_OPS_VOID = 0, + BPF_SOCK_OPS_TIMEOUT_INIT = 1, + BPF_SOCK_OPS_RWND_INIT = 2, + BPF_SOCK_OPS_TCP_CONNECT_CB = 3, + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 4, + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 5, + BPF_SOCK_OPS_NEEDS_ECN = 6, + BPF_SOCK_OPS_BASE_RTT = 7, + BPF_SOCK_OPS_RTO_CB = 8, + BPF_SOCK_OPS_RETRANS_CB = 9, + BPF_SOCK_OPS_STATE_CB = 10, + BPF_SOCK_OPS_TCP_LISTEN_CB = 11, + BPF_SOCK_OPS_RTT_CB = 12, + BPF_SOCK_OPS_PARSE_HDR_OPT_CB = 13, + BPF_SOCK_OPS_HDR_OPT_LEN_CB = 14, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB = 15, +}; + +struct bpf_func_info { + __u32 insn_off; + __u32 type_id; +}; + +struct bpf_line_info { + __u32 insn_off; + __u32 file_name_off; + __u32 line_off; + __u32 line_col; +}; + +struct sock_filter { + __u16 code; + __u8 jt; + __u8 jf; + __u32 k; +}; + +struct bpf_run_ctx {}; + +enum { + BTF_SOCK_TYPE_INET = 0, + BTF_SOCK_TYPE_INET_CONN = 1, + BTF_SOCK_TYPE_INET_REQ = 2, + BTF_SOCK_TYPE_INET_TW = 3, + BTF_SOCK_TYPE_REQ = 4, + BTF_SOCK_TYPE_SOCK = 5, + BTF_SOCK_TYPE_SOCK_COMMON = 6, + BTF_SOCK_TYPE_TCP = 7, + BTF_SOCK_TYPE_TCP_REQ = 8, + BTF_SOCK_TYPE_TCP_TW = 9, + BTF_SOCK_TYPE_TCP6 = 10, + BTF_SOCK_TYPE_UDP = 11, + BTF_SOCK_TYPE_UDP6 = 12, + BTF_SOCK_TYPE_UNIX = 13, + BTF_SOCK_TYPE_MPTCP = 14, + BTF_SOCK_TYPE_SOCKET = 15, + MAX_BTF_SOCK_TYPE = 16, +}; + +struct btf_type { + __u32 name_off; + __u32 info; + union { + __u32 size; + __u32 type; + }; +}; + +enum btf_field_type { + BPF_SPIN_LOCK = 1, + BPF_TIMER = 2, + BPF_KPTR_UNREF = 4, + BPF_KPTR_REF = 8, + BPF_KPTR = 12, + BPF_LIST_HEAD = 16, + BPF_LIST_NODE = 32, +}; + +typedef void (*btf_dtor_kfunc_t)(void *); + +struct btf; + +struct btf_field_kptr { + struct btf *btf; + struct module *module; + btf_dtor_kfunc_t dtor; + u32 btf_id; +}; + +struct btf_record; + +struct btf_field_list_head { + struct btf *btf; + u32 value_btf_id; + u32 node_offset; + struct btf_record *value_rec; +}; + +struct btf_field { + u32 offset; + enum btf_field_type type; + union { + struct btf_field_kptr kptr; + struct btf_field_list_head list_head; + }; +}; + +struct btf_record { + u32 cnt; + u32 field_mask; + int spin_lock_off; + int timer_off; + struct btf_field fields[0]; +}; + +struct btf_field_offs { + u32 cnt; + u32 field_off[10]; + u8 field_sz[10]; +}; + +typedef u64 (*bpf_callback_t)(u64, u64, u64, u64, u64); + +struct bpf_iter_aux_info; + +typedef int (*bpf_iter_init_seq_priv_t)(void *, struct bpf_iter_aux_info *); + +enum bpf_iter_task_type { + BPF_TASK_ITER_ALL = 0, + BPF_TASK_ITER_TID = 1, + BPF_TASK_ITER_TGID = 2, +}; + +struct bpf_map; + +struct bpf_iter_aux_info { + struct bpf_map *map; + struct { + struct cgroup *start; + enum bpf_cgroup_iter_order order; + } cgroup; + struct { + enum bpf_iter_task_type type; + u32 pid; + } task; +}; + +typedef void (*bpf_iter_fini_seq_priv_t)(void *); + +struct bpf_iter_seq_info { + const struct seq_operations *seq_ops; + bpf_iter_init_seq_priv_t init_seq_private; + bpf_iter_fini_seq_priv_t fini_seq_private; + u32 seq_priv_size; +}; + +struct bpf_prog_aux; + +struct bpf_local_storage_map; + +struct bpf_verifier_env; + +struct bpf_func_state; + +struct bpf_map_ops { + int (*map_alloc_check)(union bpf_attr *); + struct bpf_map * (*map_alloc)(union bpf_attr *); + void (*map_release)(struct bpf_map *, struct file *); + void (*map_free)(struct bpf_map *); + int (*map_get_next_key)(struct bpf_map *, void *, void *); + void (*map_release_uref)(struct bpf_map *); + void * (*map_lookup_elem_sys_only)(struct bpf_map *, void *); + int (*map_lookup_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + int (*map_lookup_and_delete_elem)(struct bpf_map *, void *, void *, u64); + int (*map_lookup_and_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + int (*map_update_batch)(struct bpf_map *, struct file *, const union bpf_attr *, union bpf_attr *); + int (*map_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *); + void * (*map_lookup_elem)(struct bpf_map *, void *); + int (*map_update_elem)(struct bpf_map *, void *, void *, u64); + int (*map_delete_elem)(struct bpf_map *, void *); + int (*map_push_elem)(struct bpf_map *, void *, u64); + int (*map_pop_elem)(struct bpf_map *, void *); + int (*map_peek_elem)(struct bpf_map *, void *); + void * (*map_lookup_percpu_elem)(struct bpf_map *, void *, u32); + void * (*map_fd_get_ptr)(struct bpf_map *, struct file *, int); + void (*map_fd_put_ptr)(void *); + int (*map_gen_lookup)(struct bpf_map *, struct bpf_insn *); + u32 (*map_fd_sys_lookup_elem)(void *); + void (*map_seq_show_elem)(struct bpf_map *, void *, struct seq_file *); + int (*map_check_btf)(const struct bpf_map *, const struct btf *, const struct btf_type *, const struct btf_type *); + int (*map_poke_track)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_untrack)(struct bpf_map *, struct bpf_prog_aux *); + void (*map_poke_run)(struct bpf_map *, u32, struct bpf_prog *, struct bpf_prog *); + int (*map_direct_value_addr)(const struct bpf_map *, u64 *, u32); + int (*map_direct_value_meta)(const struct bpf_map *, u64, u32 *); + int (*map_mmap)(struct bpf_map *, struct vm_area_struct *); + __poll_t (*map_poll)(struct bpf_map *, struct file *, struct poll_table_struct *); + int (*map_local_storage_charge)(struct bpf_local_storage_map *, void *, u32); + void (*map_local_storage_uncharge)(struct bpf_local_storage_map *, void *, u32); + struct bpf_local_storage ** (*map_owner_storage_ptr)(void *); + int (*map_redirect)(struct bpf_map *, u64, u64); + bool (*map_meta_equal)(const struct bpf_map *, const struct bpf_map *); + int (*map_set_for_each_callback_args)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *); + int (*map_for_each_callback)(struct bpf_map *, bpf_callback_t, void *, u64); + int *map_btf_id; + const struct bpf_iter_seq_info *iter_seq_info; +}; + +struct bpf_map { + const struct bpf_map_ops *ops; + struct bpf_map *inner_map_meta; + void *security; + enum bpf_map_type map_type; + u32 key_size; + u32 value_size; + u32 max_entries; + u64 map_extra; + u32 map_flags; + u32 id; + struct btf_record *record; + int numa_node; + u32 btf_key_type_id; + u32 btf_value_type_id; + u32 btf_vmlinux_value_type_id; + struct btf *btf; + struct obj_cgroup *objcg; + char name[16]; + struct btf_field_offs *field_offs; + long: 64; + atomic64_t refcnt; + atomic64_t usercnt; + struct work_struct work; + struct mutex freeze_mutex; + atomic64_t writecnt; + struct { + spinlock_t lock; + enum bpf_prog_type type; + bool jited; + bool xdp_has_frags; + } owner; + bool bypass_spec_v1; + bool frozen; +}; + +struct btf_header { + __u16 magic; + __u8 version; + __u8 flags; + __u32 hdr_len; + __u32 type_off; + __u32 type_len; + __u32 str_off; + __u32 str_len; +}; + +struct btf_kfunc_set_tab; + +struct btf_id_dtor_kfunc_tab; + +struct btf_struct_metas; + +struct btf { + void *data; + struct btf_type **types; + u32 *resolved_ids; + u32 *resolved_sizes; + const char *strings; + void *nohdr_data; + struct btf_header hdr; + u32 nr_types; + u32 types_size; + u32 data_size; + refcount_t refcnt; + u32 id; + struct callback_head rcu; + struct btf_kfunc_set_tab *kfunc_set_tab; + struct btf_id_dtor_kfunc_tab *dtor_kfunc_tab; + struct btf_struct_metas *struct_meta_tab; + struct btf *base_btf; + u32 start_id; + u32 start_str_off; + char name[56]; + bool kernel_btf; +}; + +struct bpf_ksym { + long unsigned int start; + long unsigned int end; + char name[512]; + struct list_head lnode; + struct latch_tree_node tnode; + bool prog; +}; + +struct bpf_ctx_arg_aux; + +struct bpf_trampoline; + +struct bpf_jit_poke_descriptor; + +struct bpf_kfunc_desc_tab; + +struct bpf_kfunc_btf_tab; + +struct bpf_prog_ops; + +struct btf_mod_pair; + +struct bpf_prog_offload; + +struct bpf_func_info_aux; + +struct bpf_prog_aux { + atomic64_t refcnt; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 max_ctx_offset; + u32 max_pkt_offset; + u32 max_tp_access; + u32 stack_depth; + u32 id; + u32 func_cnt; + u32 func_idx; + u32 attach_btf_id; + u32 ctx_arg_info_size; + u32 max_rdonly_access; + u32 max_rdwr_access; + struct btf *attach_btf; + const struct bpf_ctx_arg_aux *ctx_arg_info; + struct mutex dst_mutex; + struct bpf_prog *dst_prog; + struct bpf_trampoline *dst_trampoline; + enum bpf_prog_type saved_dst_prog_type; + enum bpf_attach_type saved_dst_attach_type; + bool verifier_zext; + bool offload_requested; + bool attach_btf_trace; + bool func_proto_unreliable; + bool sleepable; + bool tail_call_reachable; + bool xdp_has_frags; + const struct btf_type *attach_func_proto; + const char *attach_func_name; + struct bpf_prog **func; + void *jit_data; + struct bpf_jit_poke_descriptor *poke_tab; + struct bpf_kfunc_desc_tab *kfunc_tab; + struct bpf_kfunc_btf_tab *kfunc_btf_tab; + u32 size_poke_tab; + struct bpf_ksym ksym; + const struct bpf_prog_ops *ops; + struct bpf_map **used_maps; + struct mutex used_maps_mutex; + struct btf_mod_pair *used_btfs; + struct bpf_prog *prog; + struct user_struct *user; + u64 load_time; + u32 verified_insns; + int cgroup_atype; + struct bpf_map *cgroup_storage[2]; + char name[16]; + void *security; + struct bpf_prog_offload *offload; + struct btf *btf; + struct bpf_func_info *func_info; + struct bpf_func_info_aux *func_info_aux; + struct bpf_line_info *linfo; + void **jited_linfo; + u32 func_info_cnt; + u32 nr_linfo; + u32 linfo_idx; + u32 num_exentries; + struct exception_table_entry *extable; + union { + struct work_struct work; + struct callback_head rcu; + }; +}; + +struct bpf_prog_stats; + +struct sock_fprog_kern; + +struct bpf_prog { + u16 pages; + u16 jited: 1; + u16 jit_requested: 1; + u16 gpl_compatible: 1; + u16 cb_access: 1; + u16 dst_needed: 1; + u16 blinding_requested: 1; + u16 blinded: 1; + u16 is_func: 1; + u16 kprobe_override: 1; + u16 has_callchain_buf: 1; + u16 enforce_expected_attach_type: 1; + u16 call_get_stack: 1; + u16 call_get_func_ip: 1; + u16 tstamp_type_access: 1; + enum bpf_prog_type type; + enum bpf_attach_type expected_attach_type; + u32 len; + u32 jited_len; + u8 tag[8]; + struct bpf_prog_stats *stats; + int *active; + unsigned int (*bpf_func)(const void *, const struct bpf_insn *); + struct bpf_prog_aux *aux; + struct sock_fprog_kern *orig_prog; + union { + struct { + struct { } __empty_insns; + struct sock_filter insns[0]; + }; + struct { + struct { } __empty_insnsi; + struct bpf_insn insnsi[0]; + }; + }; +}; + +struct bpf_map_dev_ops { + int (*map_get_next_key)(struct bpf_offloaded_map *, void *, void *); + int (*map_lookup_elem)(struct bpf_offloaded_map *, void *, void *); + int (*map_update_elem)(struct bpf_offloaded_map *, void *, void *, u64); + int (*map_delete_elem)(struct bpf_offloaded_map *, void *); +}; + +struct bpf_offloaded_map { + struct bpf_map map; + struct net_device *netdev; + const struct bpf_map_dev_ops *dev_ops; + void *dev_priv; + struct list_head offloads; + long: 64; + long: 64; + long: 64; +}; + +enum bpf_type_flag { + PTR_MAYBE_NULL = 256, + MEM_RDONLY = 512, + MEM_RINGBUF = 1024, + MEM_USER = 2048, + MEM_PERCPU = 4096, + OBJ_RELEASE = 8192, + PTR_UNTRUSTED = 16384, + MEM_UNINIT = 32768, + DYNPTR_TYPE_LOCAL = 65536, + DYNPTR_TYPE_RINGBUF = 131072, + MEM_FIXED_SIZE = 262144, + MEM_ALLOC = 524288, + PTR_TRUSTED = 1048576, + MEM_RCU = 2097152, + __BPF_TYPE_FLAG_MAX = 2097153, + __BPF_TYPE_LAST_FLAG = 2097152, +}; + +enum bpf_arg_type { + ARG_DONTCARE = 0, + ARG_CONST_MAP_PTR = 1, + ARG_PTR_TO_MAP_KEY = 2, + ARG_PTR_TO_MAP_VALUE = 3, + ARG_PTR_TO_MEM = 4, + ARG_CONST_SIZE = 5, + ARG_CONST_SIZE_OR_ZERO = 6, + ARG_PTR_TO_CTX = 7, + ARG_ANYTHING = 8, + ARG_PTR_TO_SPIN_LOCK = 9, + ARG_PTR_TO_SOCK_COMMON = 10, + ARG_PTR_TO_INT = 11, + ARG_PTR_TO_LONG = 12, + ARG_PTR_TO_SOCKET = 13, + ARG_PTR_TO_BTF_ID = 14, + ARG_PTR_TO_RINGBUF_MEM = 15, + ARG_CONST_ALLOC_SIZE_OR_ZERO = 16, + ARG_PTR_TO_BTF_ID_SOCK_COMMON = 17, + ARG_PTR_TO_PERCPU_BTF_ID = 18, + ARG_PTR_TO_FUNC = 19, + ARG_PTR_TO_STACK = 20, + ARG_PTR_TO_CONST_STR = 21, + ARG_PTR_TO_TIMER = 22, + ARG_PTR_TO_KPTR = 23, + ARG_PTR_TO_DYNPTR = 24, + __BPF_ARG_TYPE_MAX = 25, + ARG_PTR_TO_MAP_VALUE_OR_NULL = 259, + ARG_PTR_TO_MEM_OR_NULL = 260, + ARG_PTR_TO_CTX_OR_NULL = 263, + ARG_PTR_TO_SOCKET_OR_NULL = 269, + ARG_PTR_TO_STACK_OR_NULL = 276, + ARG_PTR_TO_BTF_ID_OR_NULL = 270, + ARG_PTR_TO_UNINIT_MEM = 32772, + ARG_PTR_TO_FIXED_SIZE_MEM = 262148, + __BPF_ARG_TYPE_LIMIT = 4194303, +}; + +enum bpf_return_type { + RET_INTEGER = 0, + RET_VOID = 1, + RET_PTR_TO_MAP_VALUE = 2, + RET_PTR_TO_SOCKET = 3, + RET_PTR_TO_TCP_SOCK = 4, + RET_PTR_TO_SOCK_COMMON = 5, + RET_PTR_TO_MEM = 6, + RET_PTR_TO_MEM_OR_BTF_ID = 7, + RET_PTR_TO_BTF_ID = 8, + __BPF_RET_TYPE_MAX = 9, + RET_PTR_TO_MAP_VALUE_OR_NULL = 258, + RET_PTR_TO_SOCKET_OR_NULL = 259, + RET_PTR_TO_TCP_SOCK_OR_NULL = 260, + RET_PTR_TO_SOCK_COMMON_OR_NULL = 261, + RET_PTR_TO_RINGBUF_MEM_OR_NULL = 1286, + RET_PTR_TO_DYNPTR_MEM_OR_NULL = 262, + RET_PTR_TO_BTF_ID_OR_NULL = 264, + RET_PTR_TO_BTF_ID_TRUSTED = 1048584, + __BPF_RET_TYPE_LIMIT = 4194303, +}; + +struct bpf_func_proto { + u64 (*func)(u64, u64, u64, u64, u64); + bool gpl_only; + bool pkt_access; + bool might_sleep; + enum bpf_return_type ret_type; + union { + struct { + enum bpf_arg_type arg1_type; + enum bpf_arg_type arg2_type; + enum bpf_arg_type arg3_type; + enum bpf_arg_type arg4_type; + enum bpf_arg_type arg5_type; + }; + enum bpf_arg_type arg_type[5]; + }; + union { + struct { + u32 *arg1_btf_id; + u32 *arg2_btf_id; + u32 *arg3_btf_id; + u32 *arg4_btf_id; + u32 *arg5_btf_id; + }; + u32 *arg_btf_id[5]; + struct { + size_t arg1_size; + size_t arg2_size; + size_t arg3_size; + size_t arg4_size; + size_t arg5_size; + }; + size_t arg_size[5]; + }; + int *ret_btf_id; + bool (*allowed)(const struct bpf_prog *); +}; + +enum bpf_reg_type { + NOT_INIT = 0, + SCALAR_VALUE = 1, + PTR_TO_CTX = 2, + CONST_PTR_TO_MAP = 3, + PTR_TO_MAP_VALUE = 4, + PTR_TO_MAP_KEY = 5, + PTR_TO_STACK = 6, + PTR_TO_PACKET_META = 7, + PTR_TO_PACKET = 8, + PTR_TO_PACKET_END = 9, + PTR_TO_FLOW_KEYS = 10, + PTR_TO_SOCKET = 11, + PTR_TO_SOCK_COMMON = 12, + PTR_TO_TCP_SOCK = 13, + PTR_TO_TP_BUFFER = 14, + PTR_TO_XDP_SOCK = 15, + PTR_TO_BTF_ID = 16, + PTR_TO_MEM = 17, + PTR_TO_BUF = 18, + PTR_TO_FUNC = 19, + CONST_PTR_TO_DYNPTR = 20, + __BPF_REG_TYPE_MAX = 21, + PTR_TO_MAP_VALUE_OR_NULL = 260, + PTR_TO_SOCKET_OR_NULL = 267, + PTR_TO_SOCK_COMMON_OR_NULL = 268, + PTR_TO_TCP_SOCK_OR_NULL = 269, + PTR_TO_BTF_ID_OR_NULL = 272, + __BPF_REG_TYPE_LIMIT = 4194303, +}; + +struct bpf_prog_ops { + int (*test_run)(struct bpf_prog *, const union bpf_attr *, union bpf_attr *); +}; + +struct bpf_offload_dev; + +struct bpf_prog_offload { + struct bpf_prog *prog; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + void *dev_priv; + struct list_head offloads; + bool dev_state; + bool opt_failed; + void *jited_image; + u32 jited_len; +}; + +enum bpf_cgroup_storage_type { + BPF_CGROUP_STORAGE_SHARED = 0, + BPF_CGROUP_STORAGE_PERCPU = 1, + __BPF_CGROUP_STORAGE_MAX = 2, +}; + +struct btf_func_model { + u8 ret_size; + u8 nr_args; + u8 arg_size[12]; + u8 arg_flags[12]; +}; + +struct bpf_tramp_image { + void *image; + struct bpf_ksym ksym; + struct percpu_ref pcref; + void *ip_after_call; + void *ip_epilogue; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +struct bpf_trampoline { + struct hlist_node hlist; + struct ftrace_ops *fops; + struct mutex mutex; + refcount_t refcnt; + u32 flags; + u64 key; + struct { + struct btf_func_model model; + void *addr; + bool ftrace_managed; + } func; + struct bpf_prog *extension_prog; + struct hlist_head progs_hlist[3]; + int progs_cnt[3]; + struct bpf_tramp_image *cur_image; + u64 selector; + struct module *mod; +}; + +struct bpf_func_info_aux { + u16 linkage; + bool unreliable; +}; + +struct bpf_jit_poke_descriptor { + void *tailcall_target; + void *tailcall_bypass; + void *bypass_addr; + void *aux; + union { + struct { + struct bpf_map *map; + u32 key; + } tail_call; + }; + bool tailcall_target_stable; + u8 adj_off; + u16 reason; + u32 insn_idx; +}; + +struct bpf_ctx_arg_aux { + u32 offset; + enum bpf_reg_type reg_type; + u32 btf_id; +}; + +struct btf_mod_pair { + struct btf *btf; + struct module *module; +}; + +struct bpf_prog_stats { + u64_stats_t cnt; + u64_stats_t nsecs; + u64_stats_t misses; + struct u64_stats_sync syncp; + long: 64; +}; + +struct sock_fprog_kern { + u16 len; + struct sock_filter *filter; +}; + +struct bpf_storage_buffer; + +struct bpf_cgroup_storage_map; + +struct bpf_cgroup_storage { + union { + struct bpf_storage_buffer *buf; + void *percpu_buf; + }; + struct bpf_cgroup_storage_map *map; + struct bpf_cgroup_storage_key key; + struct list_head list_map; + struct list_head list_cg; + struct rb_node node; + struct callback_head rcu; +}; + +struct bpf_prog_array_item { + struct bpf_prog *prog; + union { + struct bpf_cgroup_storage *cgroup_storage[2]; + u64 bpf_cookie; + }; +}; + +struct bpf_prog_array { + struct callback_head rcu; + struct bpf_prog_array_item items[0]; +}; + +typedef int (*bpf_iter_attach_target_t)(struct bpf_prog *, union bpf_iter_link_info *, struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_detach_target_t)(struct bpf_iter_aux_info *); + +typedef void (*bpf_iter_show_fdinfo_t)(const struct bpf_iter_aux_info *, struct seq_file *); + +typedef int (*bpf_iter_fill_link_info_t)(const struct bpf_iter_aux_info *, struct bpf_link_info *); + +typedef const struct bpf_func_proto * (*bpf_iter_get_func_proto_t)(enum bpf_func_id, const struct bpf_prog *); + +struct bpf_iter_reg { + const char *target; + bpf_iter_attach_target_t attach_target; + bpf_iter_detach_target_t detach_target; + bpf_iter_show_fdinfo_t show_fdinfo; + bpf_iter_fill_link_info_t fill_link_info; + bpf_iter_get_func_proto_t get_func_proto; + u32 ctx_arg_info_size; + u32 feature; + struct bpf_ctx_arg_aux ctx_arg_info[2]; + const struct bpf_iter_seq_info *seq_info; +}; + +struct bpf_iter_meta { + union { + struct seq_file *seq; + }; + u64 session_id; + u64 seq_num; +}; + +enum sock_type { + SOCK_STREAM = 1, + SOCK_DGRAM = 2, + SOCK_RAW = 3, + SOCK_RDM = 4, + SOCK_SEQPACKET = 5, + SOCK_DCCP = 6, + SOCK_PACKET = 10, +}; + +struct inet_ehash_bucket; + +struct inet_bind_hashbucket; + +struct inet_listen_hashbucket; + +struct inet_hashinfo { + struct inet_ehash_bucket *ehash; + spinlock_t *ehash_locks; + unsigned int ehash_mask; + unsigned int ehash_locks_mask; + struct kmem_cache *bind_bucket_cachep; + struct inet_bind_hashbucket *bhash; + struct kmem_cache *bind2_bucket_cachep; + struct inet_bind_hashbucket *bhash2; + unsigned int bhash_size; + unsigned int lhash2_mask; + struct inet_listen_hashbucket *lhash2; + bool pernet; +}; + +struct udp_hslot; + +struct udp_table { + struct udp_hslot *hash; + struct udp_hslot *hash2; + unsigned int mask; + unsigned int log; +}; + +struct ip_ra_chain { + struct ip_ra_chain *next; + struct sock *sk; + union { + void (*destructor)(struct sock *); + struct sock *saved_sk; + }; + struct callback_head rcu; +}; + +struct fib_table { + struct hlist_node tb_hlist; + u32 tb_id; + int tb_num_default; + struct callback_head rcu; + long unsigned int *tb_data; + long unsigned int __data[0]; +}; + +struct inet_peer_base { + struct rb_root rb_root; + seqlock_t lock; + int total; +}; + +struct tcp_fastopen_context { + siphash_key_t key[2]; + int num; + struct callback_head rcu; +}; + +enum { + IPPROTO_IP = 0, + IPPROTO_ICMP = 1, + IPPROTO_IGMP = 2, + IPPROTO_IPIP = 4, + IPPROTO_TCP = 6, + IPPROTO_EGP = 8, + IPPROTO_PUP = 12, + IPPROTO_UDP = 17, + IPPROTO_IDP = 22, + IPPROTO_TP = 29, + IPPROTO_DCCP = 33, + IPPROTO_IPV6 = 41, + IPPROTO_RSVP = 46, + IPPROTO_GRE = 47, + IPPROTO_ESP = 50, + IPPROTO_AH = 51, + IPPROTO_MTP = 92, + IPPROTO_BEETPH = 94, + IPPROTO_ENCAP = 98, + IPPROTO_PIM = 103, + IPPROTO_COMP = 108, + IPPROTO_L2TP = 115, + IPPROTO_SCTP = 132, + IPPROTO_UDPLITE = 136, + IPPROTO_MPLS = 137, + IPPROTO_ETHERNET = 143, + IPPROTO_RAW = 255, + IPPROTO_MPTCP = 262, + IPPROTO_MAX = 263, +}; + +struct hlist_nulls_head { + struct hlist_nulls_node *first; +}; + +struct __una_u32 { + u32 x; +}; + +struct sk_filter { + refcount_t refcnt; + struct callback_head rcu; + struct bpf_prog *prog; +}; + +struct bpf_sock_ops_kern { + struct sock *sk; + union { + u32 args[4]; + u32 reply; + u32 replylong[4]; + }; + struct sk_buff *syn_skb; + struct sk_buff *skb; + void *skb_data_end; + u8 op; + u8 is_fullsock; + u8 remaining_opt_len; + u64 temp; +}; + +struct lwtunnel_state { + __u16 type; + __u16 flags; + __u16 headroom; + atomic_t refcnt; + int (*orig_output)(struct net *, struct sock *, struct sk_buff *); + int (*orig_input)(struct sk_buff *); + struct callback_head rcu; + __u8 data[0]; +}; + +enum { + TCPF_ESTABLISHED = 2, + TCPF_SYN_SENT = 4, + TCPF_SYN_RECV = 8, + TCPF_FIN_WAIT1 = 16, + TCPF_FIN_WAIT2 = 32, + TCPF_TIME_WAIT = 64, + TCPF_CLOSE = 128, + TCPF_CLOSE_WAIT = 256, + TCPF_LAST_ACK = 512, + TCPF_LISTEN = 1024, + TCPF_CLOSING = 2048, + TCPF_NEW_SYN_RECV = 4096, +}; + +struct sock_reuseport { + struct callback_head rcu; + u16 max_socks; + u16 num_socks; + u16 num_closed_socks; + u16 incoming_cpu; + unsigned int synq_overflow_ts; + unsigned int reuseport_id; + unsigned int bind_inany: 1; + unsigned int has_conns: 1; + struct bpf_prog *prog; + struct sock *socks[0]; +}; + +enum sock_flags { + SOCK_DEAD = 0, + SOCK_DONE = 1, + SOCK_URGINLINE = 2, + SOCK_KEEPOPEN = 3, + SOCK_LINGER = 4, + SOCK_DESTROY = 5, + SOCK_BROADCAST = 6, + SOCK_TIMESTAMP = 7, + SOCK_ZAPPED = 8, + SOCK_USE_WRITE_QUEUE = 9, + SOCK_DBG = 10, + SOCK_RCVTSTAMP = 11, + SOCK_RCVTSTAMPNS = 12, + SOCK_LOCALROUTE = 13, + SOCK_MEMALLOC = 14, + SOCK_TIMESTAMPING_RX_SOFTWARE = 15, + SOCK_FASYNC = 16, + SOCK_RXQ_OVFL = 17, + SOCK_ZEROCOPY = 18, + SOCK_WIFI_STATUS = 19, + SOCK_NOFCS = 20, + SOCK_FILTER_LOCKED = 21, + SOCK_SELECT_ERR_QUEUE = 22, + SOCK_RCU_FREE = 23, + SOCK_TXTIME = 24, + SOCK_XDP = 25, + SOCK_TSTAMP_NEW = 26, + SOCK_RCVMARK = 27, +}; + +struct sk_psock_progs { + struct bpf_prog *msg_parser; + struct bpf_prog *stream_parser; + struct bpf_prog *stream_verdict; + struct bpf_prog *skb_verdict; +}; + +struct strp_stats { + long long unsigned int msgs; + long long unsigned int bytes; + unsigned int mem_fail; + unsigned int need_more_hdr; + unsigned int msg_too_big; + unsigned int msg_timeouts; + unsigned int bad_hdr_len; +}; + +struct strparser; + +struct strp_callbacks { + int (*parse_msg)(struct strparser *, struct sk_buff *); + void (*rcv_msg)(struct strparser *, struct sk_buff *); + int (*read_sock_done)(struct strparser *, int); + void (*abort_parser)(struct strparser *, int); + void (*lock)(struct strparser *); + void (*unlock)(struct strparser *); +}; + +struct strparser { + struct sock *sk; + u32 stopped: 1; + u32 paused: 1; + u32 aborted: 1; + u32 interrupted: 1; + u32 unrecov_intr: 1; + struct sk_buff **skb_nextp; + struct sk_buff *skb_head; + unsigned int need_bytes; + struct delayed_work msg_timer_work; + struct work_struct work; + struct strp_stats stats; + struct strp_callbacks cb; +}; + +struct sk_psock_work_state { + struct sk_buff *skb; + u32 len; + u32 off; +}; + +struct sk_msg; + +struct sk_psock { + struct sock *sk; + struct sock *sk_redir; + u32 apply_bytes; + u32 cork_bytes; + u32 eval; + bool redir_ingress; + struct sk_msg *cork; + struct sk_psock_progs progs; + struct strparser strp; + struct sk_buff_head ingress_skb; + struct list_head ingress_msg; + spinlock_t ingress_lock; + long unsigned int state; + struct list_head link; + spinlock_t link_lock; + refcount_t refcnt; + void (*saved_unhash)(struct sock *); + void (*saved_destroy)(struct sock *); + void (*saved_close)(struct sock *, long int); + void (*saved_write_space)(struct sock *); + void (*saved_data_ready)(struct sock *); + int (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool); + struct proto *sk_proto; + struct mutex work_mutex; + struct sk_psock_work_state work_state; + struct work_struct work; + struct rcu_work rwork; +}; + +enum { + __ND_OPT_PREFIX_INFO_END = 0, + ND_OPT_SOURCE_LL_ADDR = 1, + ND_OPT_TARGET_LL_ADDR = 2, + ND_OPT_PREFIX_INFO = 3, + ND_OPT_REDIRECT_HDR = 4, + ND_OPT_MTU = 5, + ND_OPT_NONCE = 14, + __ND_OPT_ARRAY_MAX = 15, + ND_OPT_ROUTE_INFO = 24, + ND_OPT_RDNSS = 25, + ND_OPT_DNSSL = 31, + ND_OPT_6CO = 34, + ND_OPT_CAPTIVE_PORTAL = 37, + ND_OPT_PREF64 = 38, + __ND_OPT_MAX = 39, +}; + +struct nd_opt_hdr { + __u8 nd_opt_type; + __u8 nd_opt_len; +}; + +struct ndisc_options { + struct nd_opt_hdr *nd_opt_array[15]; + struct nd_opt_hdr *nd_opts_ri; + struct nd_opt_hdr *nd_opts_ri_end; + struct nd_opt_hdr *nd_useropts; + struct nd_opt_hdr *nd_useropts_end; +}; + +struct prefix_info { + __u8 type; + __u8 length; + __u8 prefix_len; + __u8 reserved: 6; + __u8 autoconf: 1; + __u8 onlink: 1; + __be32 valid; + __be32 prefered; + __be32 reserved2; + struct in6_addr prefix; +}; + +struct inet_ehash_bucket { + struct hlist_nulls_head chain; +}; + +struct inet_bind_hashbucket { + spinlock_t lock; + struct hlist_head chain; +}; + +struct inet_listen_hashbucket { + spinlock_t lock; + struct hlist_nulls_head nulls_head; +}; + +struct bpf_storage_buffer { + struct callback_head rcu; + char data[0]; +}; + +struct ack_sample { + u32 pkts_acked; + s32 rtt_us; + u32 in_flight; +}; + +struct rate_sample { + u64 prior_mstamp; + u32 prior_delivered; + u32 prior_delivered_ce; + s32 delivered; + s32 delivered_ce; + long int interval_us; + u32 snd_interval_us; + u32 rcv_interval_us; + long int rtt_us; + int losses; + u32 acked_sacked; + u32 prior_in_flight; + u32 last_end_seq; + bool is_app_limited; + bool is_retrans; + bool is_ack_delayed; +}; + +struct sk_msg_sg { + u32 start; + u32 curr; + u32 end; + u32 size; + u32 copybreak; + long unsigned int copy[1]; + struct scatterlist data[19]; +}; + +struct sk_msg { + struct sk_msg_sg sg; + void *data; + void *data_end; + u32 apply_bytes; + u32 cork_bytes; + u32 flags; + struct sk_buff *skb; + struct sock *sk_redir; + struct sock *sk; + struct list_head list; +}; + +struct sk_psock_link { + struct list_head list; + struct bpf_map *map; + void *link_raw; +}; + +struct udp_hslot { + struct hlist_head head; + int count; + spinlock_t lock; +}; + +struct bpf_stab { + struct bpf_map map; + struct sock **sks; + struct sk_psock_progs progs; + raw_spinlock_t lock; + long: 64; + long: 64; + long: 64; +}; + +typedef u64 (*btf_bpf_sock_map_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sk_redirect_map)(struct sk_buff *, struct bpf_map *, u32, u64); + +typedef u64 (*btf_bpf_msg_redirect_map)(struct sk_msg *, struct bpf_map *, u32, u64); + +struct sock_map_seq_info { + struct bpf_map *map; + struct sock *sk; + u32 index; +}; + +struct bpf_iter__sockmap { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + struct sock *sk; + }; +}; + +struct bpf_shtab_elem { + struct callback_head rcu; + u32 hash; + struct sock *sk; + struct hlist_node node; + u8 key[0]; +}; + +struct bpf_shtab_bucket { + struct hlist_head head; + raw_spinlock_t lock; +}; + +struct bpf_shtab { + struct bpf_map map; + struct bpf_shtab_bucket *buckets; + u32 buckets_num; + u32 elem_size; + struct sk_psock_progs progs; + atomic_t count; + long: 32; + long: 64; +}; + +typedef u64 (*btf_bpf_sock_hash_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_sk_redirect_hash)(struct sk_buff *, struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_msg_redirect_hash)(struct sk_msg *, struct bpf_map *, void *, u64); + +struct sock_hash_seq_info { + struct bpf_map *map; + struct bpf_shtab *htab; + u32 bucket_id; +}; + +enum skb_drop_reason { + SKB_NOT_DROPPED_YET = 0, + SKB_CONSUMED = 1, + SKB_DROP_REASON_NOT_SPECIFIED = 2, + SKB_DROP_REASON_NO_SOCKET = 3, + SKB_DROP_REASON_PKT_TOO_SMALL = 4, + SKB_DROP_REASON_TCP_CSUM = 5, + SKB_DROP_REASON_SOCKET_FILTER = 6, + SKB_DROP_REASON_UDP_CSUM = 7, + SKB_DROP_REASON_NETFILTER_DROP = 8, + SKB_DROP_REASON_OTHERHOST = 9, + SKB_DROP_REASON_IP_CSUM = 10, + SKB_DROP_REASON_IP_INHDR = 11, + SKB_DROP_REASON_IP_RPFILTER = 12, + SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST = 13, + SKB_DROP_REASON_XFRM_POLICY = 14, + SKB_DROP_REASON_IP_NOPROTO = 15, + SKB_DROP_REASON_SOCKET_RCVBUFF = 16, + SKB_DROP_REASON_PROTO_MEM = 17, + SKB_DROP_REASON_TCP_MD5NOTFOUND = 18, + SKB_DROP_REASON_TCP_MD5UNEXPECTED = 19, + SKB_DROP_REASON_TCP_MD5FAILURE = 20, + SKB_DROP_REASON_SOCKET_BACKLOG = 21, + SKB_DROP_REASON_TCP_FLAGS = 22, + SKB_DROP_REASON_TCP_ZEROWINDOW = 23, + SKB_DROP_REASON_TCP_OLD_DATA = 24, + SKB_DROP_REASON_TCP_OVERWINDOW = 25, + SKB_DROP_REASON_TCP_OFOMERGE = 26, + SKB_DROP_REASON_TCP_RFC7323_PAWS = 27, + SKB_DROP_REASON_TCP_INVALID_SEQUENCE = 28, + SKB_DROP_REASON_TCP_RESET = 29, + SKB_DROP_REASON_TCP_INVALID_SYN = 30, + SKB_DROP_REASON_TCP_CLOSE = 31, + SKB_DROP_REASON_TCP_FASTOPEN = 32, + SKB_DROP_REASON_TCP_OLD_ACK = 33, + SKB_DROP_REASON_TCP_TOO_OLD_ACK = 34, + SKB_DROP_REASON_TCP_ACK_UNSENT_DATA = 35, + SKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE = 36, + SKB_DROP_REASON_TCP_OFO_DROP = 37, + SKB_DROP_REASON_IP_OUTNOROUTES = 38, + SKB_DROP_REASON_BPF_CGROUP_EGRESS = 39, + SKB_DROP_REASON_IPV6DISABLED = 40, + SKB_DROP_REASON_NEIGH_CREATEFAIL = 41, + SKB_DROP_REASON_NEIGH_FAILED = 42, + SKB_DROP_REASON_NEIGH_QUEUEFULL = 43, + SKB_DROP_REASON_NEIGH_DEAD = 44, + SKB_DROP_REASON_TC_EGRESS = 45, + SKB_DROP_REASON_QDISC_DROP = 46, + SKB_DROP_REASON_CPU_BACKLOG = 47, + SKB_DROP_REASON_XDP = 48, + SKB_DROP_REASON_TC_INGRESS = 49, + SKB_DROP_REASON_UNHANDLED_PROTO = 50, + SKB_DROP_REASON_SKB_CSUM = 51, + SKB_DROP_REASON_SKB_GSO_SEG = 52, + SKB_DROP_REASON_SKB_UCOPY_FAULT = 53, + SKB_DROP_REASON_DEV_HDR = 54, + SKB_DROP_REASON_DEV_READY = 55, + SKB_DROP_REASON_FULL_RING = 56, + SKB_DROP_REASON_NOMEM = 57, + SKB_DROP_REASON_HDR_TRUNC = 58, + SKB_DROP_REASON_TAP_FILTER = 59, + SKB_DROP_REASON_TAP_TXFILTER = 60, + SKB_DROP_REASON_ICMP_CSUM = 61, + SKB_DROP_REASON_INVALID_PROTO = 62, + SKB_DROP_REASON_IP_INADDRERRORS = 63, + SKB_DROP_REASON_IP_INNOROUTES = 64, + SKB_DROP_REASON_PKT_TOO_BIG = 65, + SKB_DROP_REASON_DUP_FRAG = 66, + SKB_DROP_REASON_FRAG_REASM_TIMEOUT = 67, + SKB_DROP_REASON_FRAG_TOO_FAR = 68, + SKB_DROP_REASON_MAX = 69, +}; + +struct dcbmsg { + __u8 dcb_family; + __u8 cmd; + __u16 dcb_pad; +}; + +enum dcbnl_commands { + DCB_CMD_UNDEFINED = 0, + DCB_CMD_GSTATE = 1, + DCB_CMD_SSTATE = 2, + DCB_CMD_PGTX_GCFG = 3, + DCB_CMD_PGTX_SCFG = 4, + DCB_CMD_PGRX_GCFG = 5, + DCB_CMD_PGRX_SCFG = 6, + DCB_CMD_PFC_GCFG = 7, + DCB_CMD_PFC_SCFG = 8, + DCB_CMD_SET_ALL = 9, + DCB_CMD_GPERM_HWADDR = 10, + DCB_CMD_GCAP = 11, + DCB_CMD_GNUMTCS = 12, + DCB_CMD_SNUMTCS = 13, + DCB_CMD_PFC_GSTATE = 14, + DCB_CMD_PFC_SSTATE = 15, + DCB_CMD_BCN_GCFG = 16, + DCB_CMD_BCN_SCFG = 17, + DCB_CMD_GAPP = 18, + DCB_CMD_SAPP = 19, + DCB_CMD_IEEE_SET = 20, + DCB_CMD_IEEE_GET = 21, + DCB_CMD_GDCBX = 22, + DCB_CMD_SDCBX = 23, + DCB_CMD_GFEATCFG = 24, + DCB_CMD_SFEATCFG = 25, + DCB_CMD_CEE_GET = 26, + DCB_CMD_IEEE_DEL = 27, + __DCB_CMD_ENUM_MAX = 28, + DCB_CMD_MAX = 27, +}; + +enum dcbnl_attrs { + DCB_ATTR_UNDEFINED = 0, + DCB_ATTR_IFNAME = 1, + DCB_ATTR_STATE = 2, + DCB_ATTR_PFC_STATE = 3, + DCB_ATTR_PFC_CFG = 4, + DCB_ATTR_NUM_TC = 5, + DCB_ATTR_PG_CFG = 6, + DCB_ATTR_SET_ALL = 7, + DCB_ATTR_PERM_HWADDR = 8, + DCB_ATTR_CAP = 9, + DCB_ATTR_NUMTCS = 10, + DCB_ATTR_BCN = 11, + DCB_ATTR_APP = 12, + DCB_ATTR_IEEE = 13, + DCB_ATTR_DCBX = 14, + DCB_ATTR_FEATCFG = 15, + DCB_ATTR_CEE = 16, + __DCB_ATTR_ENUM_MAX = 17, + DCB_ATTR_MAX = 16, +}; + +enum ieee_attrs { + DCB_ATTR_IEEE_UNSPEC = 0, + DCB_ATTR_IEEE_ETS = 1, + DCB_ATTR_IEEE_PFC = 2, + DCB_ATTR_IEEE_APP_TABLE = 3, + DCB_ATTR_IEEE_PEER_ETS = 4, + DCB_ATTR_IEEE_PEER_PFC = 5, + DCB_ATTR_IEEE_PEER_APP = 6, + DCB_ATTR_IEEE_MAXRATE = 7, + DCB_ATTR_IEEE_QCN = 8, + DCB_ATTR_IEEE_QCN_STATS = 9, + DCB_ATTR_DCB_BUFFER = 10, + DCB_ATTR_DCB_APP_TRUST_TABLE = 11, + __DCB_ATTR_IEEE_MAX = 12, +}; + +enum ieee_attrs_app { + DCB_ATTR_IEEE_APP_UNSPEC = 0, + DCB_ATTR_IEEE_APP = 1, + DCB_ATTR_DCB_APP = 2, + __DCB_ATTR_IEEE_APP_MAX = 3, +}; + +enum cee_attrs { + DCB_ATTR_CEE_UNSPEC = 0, + DCB_ATTR_CEE_PEER_PG = 1, + DCB_ATTR_CEE_PEER_PFC = 2, + DCB_ATTR_CEE_PEER_APP_TABLE = 3, + DCB_ATTR_CEE_TX_PG = 4, + DCB_ATTR_CEE_RX_PG = 5, + DCB_ATTR_CEE_PFC = 6, + DCB_ATTR_CEE_APP_TABLE = 7, + DCB_ATTR_CEE_FEAT = 8, + __DCB_ATTR_CEE_MAX = 9, +}; + +enum peer_app_attr { + DCB_ATTR_CEE_PEER_APP_UNSPEC = 0, + DCB_ATTR_CEE_PEER_APP_INFO = 1, + DCB_ATTR_CEE_PEER_APP = 2, + __DCB_ATTR_CEE_PEER_APP_MAX = 3, +}; + +enum dcbnl_pfc_up_attrs { + DCB_PFC_UP_ATTR_UNDEFINED = 0, + DCB_PFC_UP_ATTR_0 = 1, + DCB_PFC_UP_ATTR_1 = 2, + DCB_PFC_UP_ATTR_2 = 3, + DCB_PFC_UP_ATTR_3 = 4, + DCB_PFC_UP_ATTR_4 = 5, + DCB_PFC_UP_ATTR_5 = 6, + DCB_PFC_UP_ATTR_6 = 7, + DCB_PFC_UP_ATTR_7 = 8, + DCB_PFC_UP_ATTR_ALL = 9, + __DCB_PFC_UP_ATTR_ENUM_MAX = 10, + DCB_PFC_UP_ATTR_MAX = 9, +}; + +enum dcbnl_pg_attrs { + DCB_PG_ATTR_UNDEFINED = 0, + DCB_PG_ATTR_TC_0 = 1, + DCB_PG_ATTR_TC_1 = 2, + DCB_PG_ATTR_TC_2 = 3, + DCB_PG_ATTR_TC_3 = 4, + DCB_PG_ATTR_TC_4 = 5, + DCB_PG_ATTR_TC_5 = 6, + DCB_PG_ATTR_TC_6 = 7, + DCB_PG_ATTR_TC_7 = 8, + DCB_PG_ATTR_TC_MAX = 9, + DCB_PG_ATTR_TC_ALL = 10, + DCB_PG_ATTR_BW_ID_0 = 11, + DCB_PG_ATTR_BW_ID_1 = 12, + DCB_PG_ATTR_BW_ID_2 = 13, + DCB_PG_ATTR_BW_ID_3 = 14, + DCB_PG_ATTR_BW_ID_4 = 15, + DCB_PG_ATTR_BW_ID_5 = 16, + DCB_PG_ATTR_BW_ID_6 = 17, + DCB_PG_ATTR_BW_ID_7 = 18, + DCB_PG_ATTR_BW_ID_MAX = 19, + DCB_PG_ATTR_BW_ID_ALL = 20, + __DCB_PG_ATTR_ENUM_MAX = 21, + DCB_PG_ATTR_MAX = 20, +}; + +enum dcbnl_tc_attrs { + DCB_TC_ATTR_PARAM_UNDEFINED = 0, + DCB_TC_ATTR_PARAM_PGID = 1, + DCB_TC_ATTR_PARAM_UP_MAPPING = 2, + DCB_TC_ATTR_PARAM_STRICT_PRIO = 3, + DCB_TC_ATTR_PARAM_BW_PCT = 4, + DCB_TC_ATTR_PARAM_ALL = 5, + __DCB_TC_ATTR_PARAM_ENUM_MAX = 6, + DCB_TC_ATTR_PARAM_MAX = 5, +}; + +enum dcbnl_cap_attrs { + DCB_CAP_ATTR_UNDEFINED = 0, + DCB_CAP_ATTR_ALL = 1, + DCB_CAP_ATTR_PG = 2, + DCB_CAP_ATTR_PFC = 3, + DCB_CAP_ATTR_UP2TC = 4, + DCB_CAP_ATTR_PG_TCS = 5, + DCB_CAP_ATTR_PFC_TCS = 6, + DCB_CAP_ATTR_GSP = 7, + DCB_CAP_ATTR_BCN = 8, + DCB_CAP_ATTR_DCBX = 9, + __DCB_CAP_ATTR_ENUM_MAX = 10, + DCB_CAP_ATTR_MAX = 9, +}; + +enum dcbnl_numtcs_attrs { + DCB_NUMTCS_ATTR_UNDEFINED = 0, + DCB_NUMTCS_ATTR_ALL = 1, + DCB_NUMTCS_ATTR_PG = 2, + DCB_NUMTCS_ATTR_PFC = 3, + __DCB_NUMTCS_ATTR_ENUM_MAX = 4, + DCB_NUMTCS_ATTR_MAX = 3, +}; + +enum dcbnl_bcn_attrs { + DCB_BCN_ATTR_UNDEFINED = 0, + DCB_BCN_ATTR_RP_0 = 1, + DCB_BCN_ATTR_RP_1 = 2, + DCB_BCN_ATTR_RP_2 = 3, + DCB_BCN_ATTR_RP_3 = 4, + DCB_BCN_ATTR_RP_4 = 5, + DCB_BCN_ATTR_RP_5 = 6, + DCB_BCN_ATTR_RP_6 = 7, + DCB_BCN_ATTR_RP_7 = 8, + DCB_BCN_ATTR_RP_ALL = 9, + DCB_BCN_ATTR_BCNA_0 = 10, + DCB_BCN_ATTR_BCNA_1 = 11, + DCB_BCN_ATTR_ALPHA = 12, + DCB_BCN_ATTR_BETA = 13, + DCB_BCN_ATTR_GD = 14, + DCB_BCN_ATTR_GI = 15, + DCB_BCN_ATTR_TMAX = 16, + DCB_BCN_ATTR_TD = 17, + DCB_BCN_ATTR_RMIN = 18, + DCB_BCN_ATTR_W = 19, + DCB_BCN_ATTR_RD = 20, + DCB_BCN_ATTR_RU = 21, + DCB_BCN_ATTR_WRTT = 22, + DCB_BCN_ATTR_RI = 23, + DCB_BCN_ATTR_C = 24, + DCB_BCN_ATTR_ALL = 25, + __DCB_BCN_ATTR_ENUM_MAX = 26, + DCB_BCN_ATTR_MAX = 25, +}; + +enum dcb_general_attr_values { + DCB_ATTR_VALUE_UNDEFINED = 255, +}; + +enum dcbnl_app_attrs { + DCB_APP_ATTR_UNDEFINED = 0, + DCB_APP_ATTR_IDTYPE = 1, + DCB_APP_ATTR_ID = 2, + DCB_APP_ATTR_PRIORITY = 3, + __DCB_APP_ATTR_ENUM_MAX = 4, + DCB_APP_ATTR_MAX = 3, +}; + +enum dcbnl_featcfg_attrs { + DCB_FEATCFG_ATTR_UNDEFINED = 0, + DCB_FEATCFG_ATTR_ALL = 1, + DCB_FEATCFG_ATTR_PG = 2, + DCB_FEATCFG_ATTR_PFC = 3, + DCB_FEATCFG_ATTR_APP = 4, + __DCB_FEATCFG_ATTR_ENUM_MAX = 5, + DCB_FEATCFG_ATTR_MAX = 4, +}; + +struct dcb_app_type { + int ifindex; + struct dcb_app app; + struct list_head list; + u8 dcbx; +}; + +struct dcb_ieee_app_prio_map { + u64 map[8]; +}; + +struct dcb_ieee_app_dscp_map { + u8 map[64]; +}; + +enum netdev_cmd { + NETDEV_UP = 1, + NETDEV_DOWN = 2, + NETDEV_REBOOT = 3, + NETDEV_CHANGE = 4, + NETDEV_REGISTER = 5, + NETDEV_UNREGISTER = 6, + NETDEV_CHANGEMTU = 7, + NETDEV_CHANGEADDR = 8, + NETDEV_PRE_CHANGEADDR = 9, + NETDEV_GOING_DOWN = 10, + NETDEV_CHANGENAME = 11, + NETDEV_FEAT_CHANGE = 12, + NETDEV_BONDING_FAILOVER = 13, + NETDEV_PRE_UP = 14, + NETDEV_PRE_TYPE_CHANGE = 15, + NETDEV_POST_TYPE_CHANGE = 16, + NETDEV_POST_INIT = 17, + NETDEV_PRE_UNINIT = 18, + NETDEV_RELEASE = 19, + NETDEV_NOTIFY_PEERS = 20, + NETDEV_JOIN = 21, + NETDEV_CHANGEUPPER = 22, + NETDEV_RESEND_IGMP = 23, + NETDEV_PRECHANGEMTU = 24, + NETDEV_CHANGEINFODATA = 25, + NETDEV_BONDING_INFO = 26, + NETDEV_PRECHANGEUPPER = 27, + NETDEV_CHANGELOWERSTATE = 28, + NETDEV_UDP_TUNNEL_PUSH_INFO = 29, + NETDEV_UDP_TUNNEL_DROP_INFO = 30, + NETDEV_CHANGE_TX_QUEUE_LEN = 31, + NETDEV_CVLAN_FILTER_PUSH_INFO = 32, + NETDEV_CVLAN_FILTER_DROP_INFO = 33, + NETDEV_SVLAN_FILTER_PUSH_INFO = 34, + NETDEV_SVLAN_FILTER_DROP_INFO = 35, + NETDEV_OFFLOAD_XSTATS_ENABLE = 36, + NETDEV_OFFLOAD_XSTATS_DISABLE = 37, + NETDEV_OFFLOAD_XSTATS_REPORT_USED = 38, + NETDEV_OFFLOAD_XSTATS_REPORT_DELTA = 39, +}; + +struct netdev_notifier_info { + struct net_device *dev; + struct netlink_ext_ack *extack; +}; + +enum { + NLA_UNSPEC = 0, + NLA_U8 = 1, + NLA_U16 = 2, + NLA_U32 = 3, + NLA_U64 = 4, + NLA_STRING = 5, + NLA_FLAG = 6, + NLA_MSECS = 7, + NLA_NESTED = 8, + NLA_NESTED_ARRAY = 9, + NLA_NUL_STRING = 10, + NLA_BINARY = 11, + NLA_S8 = 12, + NLA_S16 = 13, + NLA_S32 = 14, + NLA_S64 = 15, + NLA_BITFIELD32 = 16, + NLA_REJECT = 17, + NLA_BE16 = 18, + NLA_BE32 = 19, + __NLA_TYPE_MAX = 20, +}; + +enum netlink_validation { + NL_VALIDATE_LIBERAL = 0, + NL_VALIDATE_TRAILING = 1, + NL_VALIDATE_MAXTYPE = 2, + NL_VALIDATE_UNSPEC = 4, + NL_VALIDATE_STRICT_ATTRS = 8, + NL_VALIDATE_NESTED = 16, +}; + +enum rtnetlink_groups { + RTNLGRP_NONE = 0, + RTNLGRP_LINK = 1, + RTNLGRP_NOTIFY = 2, + RTNLGRP_NEIGH = 3, + RTNLGRP_TC = 4, + RTNLGRP_IPV4_IFADDR = 5, + RTNLGRP_IPV4_MROUTE = 6, + RTNLGRP_IPV4_ROUTE = 7, + RTNLGRP_IPV4_RULE = 8, + RTNLGRP_IPV6_IFADDR = 9, + RTNLGRP_IPV6_MROUTE = 10, + RTNLGRP_IPV6_ROUTE = 11, + RTNLGRP_IPV6_IFINFO = 12, + RTNLGRP_DECnet_IFADDR = 13, + RTNLGRP_NOP2 = 14, + RTNLGRP_DECnet_ROUTE = 15, + RTNLGRP_DECnet_RULE = 16, + RTNLGRP_NOP4 = 17, + RTNLGRP_IPV6_PREFIX = 18, + RTNLGRP_IPV6_RULE = 19, + RTNLGRP_ND_USEROPT = 20, + RTNLGRP_PHONET_IFADDR = 21, + RTNLGRP_PHONET_ROUTE = 22, + RTNLGRP_DCB = 23, + RTNLGRP_IPV4_NETCONF = 24, + RTNLGRP_IPV6_NETCONF = 25, + RTNLGRP_MDB = 26, + RTNLGRP_MPLS_ROUTE = 27, + RTNLGRP_NSID = 28, + RTNLGRP_MPLS_NETCONF = 29, + RTNLGRP_IPV4_MROUTE_R = 30, + RTNLGRP_IPV6_MROUTE_R = 31, + RTNLGRP_NEXTHOP = 32, + RTNLGRP_BRVLAN = 33, + RTNLGRP_MCTP_IFADDR = 34, + RTNLGRP_TUNNEL = 35, + RTNLGRP_STATS = 36, + __RTNLGRP_MAX = 37, +}; + +typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, struct netlink_ext_ack *); + +typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *); + +enum dcbevent_notif_type { + DCB_APP_EVENT = 1, +}; + +struct reply_func { + int type; + int (*cb)(struct net_device *, struct nlmsghdr *, u32, struct nlattr **, struct sk_buff *); +}; + +enum aarch64_insn_imm_type { + AARCH64_INSN_IMM_ADR = 0, + AARCH64_INSN_IMM_26 = 1, + AARCH64_INSN_IMM_19 = 2, + AARCH64_INSN_IMM_16 = 3, + AARCH64_INSN_IMM_14 = 4, + AARCH64_INSN_IMM_12 = 5, + AARCH64_INSN_IMM_9 = 6, + AARCH64_INSN_IMM_7 = 7, + AARCH64_INSN_IMM_6 = 8, + AARCH64_INSN_IMM_S = 9, + AARCH64_INSN_IMM_R = 10, + AARCH64_INSN_IMM_N = 11, + AARCH64_INSN_IMM_MAX = 12, +}; + +enum aarch64_insn_register_type { + AARCH64_INSN_REGTYPE_RT = 0, + AARCH64_INSN_REGTYPE_RN = 1, + AARCH64_INSN_REGTYPE_RT2 = 2, + AARCH64_INSN_REGTYPE_RM = 3, + AARCH64_INSN_REGTYPE_RD = 4, + AARCH64_INSN_REGTYPE_RA = 5, + AARCH64_INSN_REGTYPE_RS = 6, +}; + +enum aarch64_insn_register { + AARCH64_INSN_REG_0 = 0, + AARCH64_INSN_REG_1 = 1, + AARCH64_INSN_REG_2 = 2, + AARCH64_INSN_REG_3 = 3, + AARCH64_INSN_REG_4 = 4, + AARCH64_INSN_REG_5 = 5, + AARCH64_INSN_REG_6 = 6, + AARCH64_INSN_REG_7 = 7, + AARCH64_INSN_REG_8 = 8, + AARCH64_INSN_REG_9 = 9, + AARCH64_INSN_REG_10 = 10, + AARCH64_INSN_REG_11 = 11, + AARCH64_INSN_REG_12 = 12, + AARCH64_INSN_REG_13 = 13, + AARCH64_INSN_REG_14 = 14, + AARCH64_INSN_REG_15 = 15, + AARCH64_INSN_REG_16 = 16, + AARCH64_INSN_REG_17 = 17, + AARCH64_INSN_REG_18 = 18, + AARCH64_INSN_REG_19 = 19, + AARCH64_INSN_REG_20 = 20, + AARCH64_INSN_REG_21 = 21, + AARCH64_INSN_REG_22 = 22, + AARCH64_INSN_REG_23 = 23, + AARCH64_INSN_REG_24 = 24, + AARCH64_INSN_REG_25 = 25, + AARCH64_INSN_REG_26 = 26, + AARCH64_INSN_REG_27 = 27, + AARCH64_INSN_REG_28 = 28, + AARCH64_INSN_REG_29 = 29, + AARCH64_INSN_REG_FP = 29, + AARCH64_INSN_REG_30 = 30, + AARCH64_INSN_REG_LR = 30, + AARCH64_INSN_REG_ZR = 31, + AARCH64_INSN_REG_SP = 31, +}; + +enum aarch64_insn_variant { + AARCH64_INSN_VARIANT_32BIT = 0, + AARCH64_INSN_VARIANT_64BIT = 1, +}; + +enum aarch64_insn_condition { + AARCH64_INSN_COND_EQ = 0, + AARCH64_INSN_COND_NE = 1, + AARCH64_INSN_COND_CS = 2, + AARCH64_INSN_COND_CC = 3, + AARCH64_INSN_COND_MI = 4, + AARCH64_INSN_COND_PL = 5, + AARCH64_INSN_COND_VS = 6, + AARCH64_INSN_COND_VC = 7, + AARCH64_INSN_COND_HI = 8, + AARCH64_INSN_COND_LS = 9, + AARCH64_INSN_COND_GE = 10, + AARCH64_INSN_COND_LT = 11, + AARCH64_INSN_COND_GT = 12, + AARCH64_INSN_COND_LE = 13, + AARCH64_INSN_COND_AL = 14, +}; + +enum aarch64_insn_branch_type { + AARCH64_INSN_BRANCH_NOLINK = 0, + AARCH64_INSN_BRANCH_LINK = 1, + AARCH64_INSN_BRANCH_RETURN = 2, + AARCH64_INSN_BRANCH_COMP_ZERO = 3, + AARCH64_INSN_BRANCH_COMP_NONZERO = 4, +}; + +enum aarch64_insn_size_type { + AARCH64_INSN_SIZE_8 = 0, + AARCH64_INSN_SIZE_16 = 1, + AARCH64_INSN_SIZE_32 = 2, + AARCH64_INSN_SIZE_64 = 3, +}; + +enum aarch64_insn_ldst_type { + AARCH64_INSN_LDST_LOAD_REG_OFFSET = 0, + AARCH64_INSN_LDST_STORE_REG_OFFSET = 1, + AARCH64_INSN_LDST_LOAD_IMM_OFFSET = 2, + AARCH64_INSN_LDST_STORE_IMM_OFFSET = 3, + AARCH64_INSN_LDST_LOAD_PAIR_PRE_INDEX = 4, + AARCH64_INSN_LDST_STORE_PAIR_PRE_INDEX = 5, + AARCH64_INSN_LDST_LOAD_PAIR_POST_INDEX = 6, + AARCH64_INSN_LDST_STORE_PAIR_POST_INDEX = 7, + AARCH64_INSN_LDST_LOAD_EX = 8, + AARCH64_INSN_LDST_LOAD_ACQ_EX = 9, + AARCH64_INSN_LDST_STORE_EX = 10, + AARCH64_INSN_LDST_STORE_REL_EX = 11, +}; + +enum aarch64_insn_adsb_type { + AARCH64_INSN_ADSB_ADD = 0, + AARCH64_INSN_ADSB_SUB = 1, + AARCH64_INSN_ADSB_ADD_SETFLAGS = 2, + AARCH64_INSN_ADSB_SUB_SETFLAGS = 3, +}; + +enum aarch64_insn_movewide_type { + AARCH64_INSN_MOVEWIDE_ZERO = 0, + AARCH64_INSN_MOVEWIDE_KEEP = 1, + AARCH64_INSN_MOVEWIDE_INVERSE = 2, +}; + +enum aarch64_insn_bitfield_type { + AARCH64_INSN_BITFIELD_MOVE = 0, + AARCH64_INSN_BITFIELD_MOVE_UNSIGNED = 1, + AARCH64_INSN_BITFIELD_MOVE_SIGNED = 2, +}; + +enum aarch64_insn_data1_type { + AARCH64_INSN_DATA1_REVERSE_16 = 0, + AARCH64_INSN_DATA1_REVERSE_32 = 1, + AARCH64_INSN_DATA1_REVERSE_64 = 2, +}; + +enum aarch64_insn_data2_type { + AARCH64_INSN_DATA2_UDIV = 0, + AARCH64_INSN_DATA2_SDIV = 1, + AARCH64_INSN_DATA2_LSLV = 2, + AARCH64_INSN_DATA2_LSRV = 3, + AARCH64_INSN_DATA2_ASRV = 4, + AARCH64_INSN_DATA2_RORV = 5, +}; + +enum aarch64_insn_data3_type { + AARCH64_INSN_DATA3_MADD = 0, + AARCH64_INSN_DATA3_MSUB = 1, +}; + +enum aarch64_insn_logic_type { + AARCH64_INSN_LOGIC_AND = 0, + AARCH64_INSN_LOGIC_BIC = 1, + AARCH64_INSN_LOGIC_ORR = 2, + AARCH64_INSN_LOGIC_ORN = 3, + AARCH64_INSN_LOGIC_EOR = 4, + AARCH64_INSN_LOGIC_EON = 5, + AARCH64_INSN_LOGIC_AND_SETFLAGS = 6, + AARCH64_INSN_LOGIC_BIC_SETFLAGS = 7, +}; + +enum aarch64_insn_adr_type { + AARCH64_INSN_ADR_TYPE_ADRP = 0, + AARCH64_INSN_ADR_TYPE_ADR = 1, +}; + +enum aarch64_insn_mem_atomic_op { + AARCH64_INSN_MEM_ATOMIC_ADD = 0, + AARCH64_INSN_MEM_ATOMIC_CLR = 1, + AARCH64_INSN_MEM_ATOMIC_EOR = 2, + AARCH64_INSN_MEM_ATOMIC_SET = 3, + AARCH64_INSN_MEM_ATOMIC_SWP = 4, +}; + +enum aarch64_insn_mem_order_type { + AARCH64_INSN_MEM_ORDER_NONE = 0, + AARCH64_INSN_MEM_ORDER_ACQ = 1, + AARCH64_INSN_MEM_ORDER_REL = 2, + AARCH64_INSN_MEM_ORDER_ACQREL = 3, +}; + +enum aarch64_insn_mb_type { + AARCH64_INSN_MB_SY = 0, + AARCH64_INSN_MB_ST = 1, + AARCH64_INSN_MB_LD = 2, + AARCH64_INSN_MB_ISH = 3, + AARCH64_INSN_MB_ISHST = 4, + AARCH64_INSN_MB_ISHLD = 5, + AARCH64_INSN_MB_NSH = 6, + AARCH64_INSN_MB_NSHST = 7, + AARCH64_INSN_MB_NSHLD = 8, + AARCH64_INSN_MB_OSH = 9, + AARCH64_INSN_MB_OSHST = 10, + AARCH64_INSN_MB_OSHLD = 11, +}; + +typedef __be32 fdt32_t; + +typedef __be64 fdt64_t; + +struct fdt_header { + fdt32_t magic; + fdt32_t totalsize; + fdt32_t off_dt_struct; + fdt32_t off_dt_strings; + fdt32_t off_mem_rsvmap; + fdt32_t version; + fdt32_t last_comp_version; + fdt32_t boot_cpuid_phys; + fdt32_t size_dt_strings; + fdt32_t size_dt_struct; +}; + +struct fdt_reserve_entry { + fdt64_t address; + fdt64_t size; +}; + +struct fdt_node_header { + fdt32_t tag; + char name[0]; +}; + +struct fdt_property { + fdt32_t tag; + fdt32_t len; + fdt32_t nameoff; + char data[0]; +}; + +enum { + ASSUME_PERFECT = 255, + ASSUME_VALID_DTB = 1, + ASSUME_VALID_INPUT = 2, + ASSUME_LATEST = 4, + ASSUME_NO_ROLLBACK = 8, + ASSUME_LIBFDT_ORDER = 16, + ASSUME_LIBFDT_FLAWLESS = 32, +}; + +struct word_at_a_time { + const long unsigned int one_bits; + const long unsigned int high_bits; +}; + +typedef __u32 Elf32_Word; + +struct elf32_note { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +}; + +enum { + PROC_ROOT_INO = 1, + PROC_IPC_INIT_INO = 4026531839, + PROC_UTS_INIT_INO = 4026531838, + PROC_USER_INIT_INO = 4026531837, + PROC_PID_INIT_INO = 4026531836, + PROC_CGROUP_INIT_INO = 4026531835, + PROC_TIME_INIT_INO = 4026531834, +}; + +typedef __kernel_long_t __kernel_suseconds_t; + +typedef __kernel_suseconds_t suseconds_t; + +typedef __kernel_clock_t clock_t; + +typedef __u64 timeu64_t; + +struct __kernel_itimerspec { + struct __kernel_timespec it_interval; + struct __kernel_timespec it_value; +}; + +struct __kernel_old_timeval { + __kernel_long_t tv_sec; + __kernel_long_t tv_usec; +}; + +struct timezone { + int tz_minuteswest; + int tz_dsttime; +}; + +struct itimerspec64 { + struct timespec64 it_interval; + struct timespec64 it_value; +}; + +struct old_timeval32 { + old_time32_t tv_sec; + s32 tv_usec; +}; + +struct old_itimerspec32 { + struct old_timespec32 it_interval; + struct old_timespec32 it_value; +}; + +struct old_timex32 { + u32 modes; + s32 offset; + s32 freq; + s32 maxerror; + s32 esterror; + s32 status; + s32 constant; + s32 precision; + s32 tolerance; + struct old_timeval32 time; + s32 tick; + s32 ppsfreq; + s32 jitter; + s32 shift; + s32 stabil; + s32 jitcnt; + s32 calcnt; + s32 errcnt; + s32 stbcnt; + s32 tai; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct __kernel_timex_timeval { + __kernel_time64_t tv_sec; + long long int tv_usec; +}; + +struct __kernel_timex { + unsigned int modes; + long long int offset; + long long int freq; + long long int maxerror; + long long int esterror; + int status; + long long int constant; + long long int precision; + long long int tolerance; + struct __kernel_timex_timeval time; + long long int tick; + long long int ppsfreq; + long long int jitter; + int shift; + long long int stabil; + long long int jitcnt; + long long int calcnt; + long long int errcnt; + long long int stbcnt; + int tai; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef void (*swap_func_t)(void *, void *, int); + +typedef struct { + long unsigned int val; +} swp_entry_t; + +typedef struct { + struct lockdep_map dep_map; + struct task_struct *owner; +} local_lock_t; + +struct reciprocal_value { + u32 m; + u8 sh1; + u8 sh2; +}; + +struct kmem_cache_order_objects { + unsigned int x; +}; + +struct kmem_cache_cpu; + +struct kmem_cache_node; + +struct kmem_cache { + struct kmem_cache_cpu *cpu_slab; + slab_flags_t flags; + long unsigned int min_partial; + unsigned int size; + unsigned int object_size; + struct reciprocal_value reciprocal_size; + unsigned int offset; + unsigned int cpu_partial; + unsigned int cpu_partial_slabs; + struct kmem_cache_order_objects oo; + struct kmem_cache_order_objects min; + gfp_t allocflags; + int refcount; + void (*ctor)(void *); + unsigned int inuse; + unsigned int align; + unsigned int red_left_pad; + const char *name; + struct list_head list; + struct kobject kobj; + unsigned int remote_node_defrag_ratio; + struct kmem_cache_node *node[64]; +}; + +enum { + __PERCPU_REF_ATOMIC = 1, + __PERCPU_REF_DEAD = 2, + __PERCPU_REF_ATOMIC_DEAD = 3, + __PERCPU_REF_FLAG_BITS = 2, +}; + +enum { + CSS_NO_REF = 1, + CSS_ONLINE = 2, + CSS_RELEASED = 4, + CSS_VISIBLE = 8, + CSS_DYING = 16, +}; + +enum { + CGRP_ROOT_NOPREFIX = 2, + CGRP_ROOT_XATTR = 4, + CGRP_ROOT_NS_DELEGATE = 8, + CGRP_ROOT_FAVOR_DYNMODS = 16, + CGRP_ROOT_CPUSET_V2_MODE = 65536, + CGRP_ROOT_MEMORY_LOCAL_EVENTS = 131072, + CGRP_ROOT_MEMORY_RECURSIVE_PROT = 262144, +}; + +enum { + CFTYPE_ONLY_ON_ROOT = 1, + CFTYPE_NOT_ON_ROOT = 2, + CFTYPE_NS_DELEGATABLE = 4, + CFTYPE_NO_PREFIX = 8, + CFTYPE_WORLD_WRITABLE = 16, + CFTYPE_DEBUG = 32, + __CFTYPE_ONLY_ON_DFL = 65536, + __CFTYPE_NOT_ON_DFL = 131072, + __CFTYPE_ADDED = 262144, +}; + +struct css_task_iter { + struct cgroup_subsys *ss; + unsigned int flags; + struct list_head *cset_pos; + struct list_head *cset_head; + struct list_head *tcset_pos; + struct list_head *tcset_head; + struct list_head *task_pos; + struct list_head *cur_tasks_head; + struct css_set *cur_cset; + struct css_set *cur_dcset; + struct task_struct *cur_task; + struct list_head iters_node; +}; + +enum memcg_stat_item { + MEMCG_SWAP = 43, + MEMCG_SOCK = 44, + MEMCG_PERCPU_B = 45, + MEMCG_VMALLOC = 46, + MEMCG_KMEM = 47, + MEMCG_ZSWAP_B = 48, + MEMCG_ZSWAPPED = 49, + MEMCG_NR_STAT = 50, +}; + +struct mem_cgroup_reclaim_cookie { + pg_data_t *pgdat; + unsigned int generation; +}; + +enum mem_cgroup_events_target { + MEM_CGROUP_TARGET_THRESH = 0, + MEM_CGROUP_TARGET_SOFTLIMIT = 1, + MEM_CGROUP_NTARGETS = 2, +}; + +struct memcg_vmstats { + long int state[50]; + long unsigned int events[15]; + long int state_pending[50]; + long unsigned int events_pending[15]; +}; + +struct memcg_vmstats_percpu { + long int state[50]; + long unsigned int events[15]; + long int state_prev[50]; + long unsigned int events_prev[15]; + long unsigned int nr_page_events; + long unsigned int targets[2]; +}; + +enum page_memcg_data_flags { + MEMCG_DATA_OBJCGS = 1, + MEMCG_DATA_KMEM = 2, + __NR_MEMCG_DATA_FLAGS = 4, +}; + +struct mm_walk; + +struct mm_walk_ops { + int (*pgd_entry)(pgd_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*p4d_entry)(p4d_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pud_entry)(pud_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pmd_entry)(pmd_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pte_entry)(pte_t *, long unsigned int, long unsigned int, struct mm_walk *); + int (*pte_hole)(long unsigned int, long unsigned int, int, struct mm_walk *); + int (*hugetlb_entry)(pte_t *, long unsigned int, long unsigned int, long unsigned int, struct mm_walk *); + int (*test_walk)(long unsigned int, long unsigned int, struct mm_walk *); + int (*pre_vma)(long unsigned int, long unsigned int, struct mm_walk *); + void (*post_vma)(struct mm_walk *); +}; + +enum page_walk_action { + ACTION_SUBTREE = 0, + ACTION_CONTINUE = 1, + ACTION_AGAIN = 2, +}; + +struct mm_walk { + const struct mm_walk_ops *ops; + struct mm_struct *mm; + pgd_t *pgd; + struct vm_area_struct *vma; + enum page_walk_action action; + bool no_vma; + void *private; +}; + +enum oom_constraint { + CONSTRAINT_NONE = 0, + CONSTRAINT_CPUSET = 1, + CONSTRAINT_MEMORY_POLICY = 2, + CONSTRAINT_MEMCG = 3, +}; + +struct oom_control { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct mem_cgroup *memcg; + const gfp_t gfp_mask; + const int order; + long unsigned int totalpages; + struct task_struct *chosen; + long int chosen_points; + enum oom_constraint constraint; +}; + +struct slab { + long unsigned int __page_flags; + struct kmem_cache *slab_cache; + union { + struct { + union { + struct list_head slab_list; + struct { + struct slab *next; + int slabs; + }; + }; + void *freelist; + union { + long unsigned int counters; + struct { + unsigned int inuse: 16; + unsigned int objects: 15; + unsigned int frozen: 1; + }; + }; + }; + struct callback_head callback_head; + }; + unsigned int __unused; + atomic_t __page_refcount; + long unsigned int memcg_data; +}; + +struct kmem_cache_cpu { + void **freelist; + long unsigned int tid; + struct slab *slab; + struct slab *partial; + local_lock_t lock; +}; + +struct kmem_cache_node { + spinlock_t list_lock; + long unsigned int nr_partial; + struct list_head partial; + atomic_long_t nr_slabs; + atomic_long_t total_objects; + struct list_head full; +}; + +struct mem_cgroup_tree_per_node { + struct rb_root rb_root; + struct rb_node *rb_rightmost; + spinlock_t lock; +}; + +struct mem_cgroup_tree { + struct mem_cgroup_tree_per_node *rb_tree_per_node[64]; +}; + +struct mem_cgroup_eventfd_list { + struct list_head list; + struct eventfd_ctx *eventfd; +}; + +struct mem_cgroup_event { + struct mem_cgroup *memcg; + struct eventfd_ctx *eventfd; + struct list_head list; + int (*register_event)(struct mem_cgroup *, struct eventfd_ctx *, const char *); + void (*unregister_event)(struct mem_cgroup *, struct eventfd_ctx *); + poll_table pt; + wait_queue_head_t *wqh; + wait_queue_entry_t wait; + struct work_struct remove; +}; + +struct move_charge_struct { + spinlock_t lock; + struct mm_struct *mm; + struct mem_cgroup *from; + struct mem_cgroup *to; + long unsigned int flags; + long unsigned int precharge; + long unsigned int moved_charge; + long unsigned int moved_swap; + struct task_struct *moving_task; + wait_queue_head_t waitq; +}; + +enum res_type { + _MEM = 0, + _MEMSWAP = 1, + _KMEM = 2, + _TCP = 3, +}; + +struct memory_stat { + const char *name; + unsigned int idx; +}; + +struct oom_wait_info { + struct mem_cgroup *memcg; + wait_queue_entry_t wait; +}; + +struct memcg_stock_pcp { + local_lock_t stock_lock; + struct mem_cgroup *cached; + unsigned int nr_pages; + struct obj_cgroup *cached_objcg; + struct pglist_data *cached_pgdat; + unsigned int nr_bytes; + int nr_slab_reclaimable_b; + int nr_slab_unreclaimable_b; + struct work_struct work; + long unsigned int flags; +}; + +enum { + RES_USAGE = 0, + RES_LIMIT = 1, + RES_MAX_USAGE = 2, + RES_FAILCNT = 3, + RES_SOFT_LIMIT = 4, +}; + +union mc_target { + struct page *page; + swp_entry_t ent; +}; + +enum mc_target_type { + MC_TARGET_NONE = 0, + MC_TARGET_PAGE = 1, + MC_TARGET_SWAP = 2, + MC_TARGET_DEVICE = 3, +}; + +struct uncharge_gather { + struct mem_cgroup *memcg; + long unsigned int nr_memory; + long unsigned int pgpgout; + long unsigned int nr_kmem; + int nid; +}; + +struct numa_stat { + const char *name; + unsigned int lru_mask; +}; + +struct plist_head { + struct list_head node_list; +}; + +enum pm_qos_type { + PM_QOS_UNITIALIZED = 0, + PM_QOS_MAX = 1, + PM_QOS_MIN = 2, +}; + +struct pm_qos_constraints { + struct plist_head list; + s32 target_value; + s32 default_value; + s32 no_constraint_value; + enum pm_qos_type type; + struct blocking_notifier_head *notifiers; +}; + +enum freq_qos_req_type { + FREQ_QOS_MIN = 1, + FREQ_QOS_MAX = 2, +}; + +struct freq_constraints { + struct pm_qos_constraints min_freq; + struct blocking_notifier_head min_freq_notifiers; + struct pm_qos_constraints max_freq; + struct blocking_notifier_head max_freq_notifiers; +}; + +struct freq_qos_request { + enum freq_qos_req_type type; + struct plist_node pnode; + struct freq_constraints *qos; +}; + +enum cpufreq_table_sorting { + CPUFREQ_TABLE_UNSORTED = 0, + CPUFREQ_TABLE_SORTED_ASCENDING = 1, + CPUFREQ_TABLE_SORTED_DESCENDING = 2, +}; + +struct cpufreq_cpuinfo { + unsigned int max_freq; + unsigned int min_freq; + unsigned int transition_latency; +}; + +struct clk; + +struct cpufreq_governor; + +struct cpufreq_frequency_table; + +struct cpufreq_stats; + +struct thermal_cooling_device; + +struct cpufreq_policy { + cpumask_var_t cpus; + cpumask_var_t related_cpus; + cpumask_var_t real_cpus; + unsigned int shared_type; + unsigned int cpu; + struct clk *clk; + struct cpufreq_cpuinfo cpuinfo; + unsigned int min; + unsigned int max; + unsigned int cur; + unsigned int suspend_freq; + unsigned int policy; + unsigned int last_policy; + struct cpufreq_governor *governor; + void *governor_data; + char last_governor[16]; + struct work_struct update; + struct freq_constraints constraints; + struct freq_qos_request *min_freq_req; + struct freq_qos_request *max_freq_req; + struct cpufreq_frequency_table *freq_table; + enum cpufreq_table_sorting freq_table_sorted; + struct list_head policy_list; + struct kobject kobj; + struct completion kobj_unregister; + struct rw_semaphore rwsem; + bool fast_switch_possible; + bool fast_switch_enabled; + bool strict_target; + bool efficiencies_available; + unsigned int transition_delay_us; + bool dvfs_possible_from_any_cpu; + unsigned int cached_target_freq; + unsigned int cached_resolved_idx; + bool transition_ongoing; + spinlock_t transition_lock; + wait_queue_head_t transition_wait; + struct task_struct *transition_task; + struct cpufreq_stats *stats; + void *driver_data; + struct thermal_cooling_device *cdev; + struct notifier_block nb_min; + struct notifier_block nb_max; +}; + +struct cpufreq_governor { + char name[16]; + int (*init)(struct cpufreq_policy *); + void (*exit)(struct cpufreq_policy *); + int (*start)(struct cpufreq_policy *); + void (*stop)(struct cpufreq_policy *); + void (*limits)(struct cpufreq_policy *); + ssize_t (*show_setspeed)(struct cpufreq_policy *, char *); + int (*store_setspeed)(struct cpufreq_policy *, unsigned int); + struct list_head governor_list; + struct module *owner; + u8 flags; +}; + +struct cpufreq_frequency_table { + unsigned int flags; + unsigned int driver_data; + unsigned int frequency; +}; + +struct cpufreq_stats { + unsigned int total_trans; + long long unsigned int last_time; + unsigned int max_state; + unsigned int state_num; + unsigned int last_index; + u64 *time_in_state; + unsigned int *freq_table; + unsigned int *trans_table; + unsigned int reset_pending; + long long unsigned int reset_time; +}; + +struct freq_attr { + struct attribute attr; + ssize_t (*show)(struct cpufreq_policy *, char *); + ssize_t (*store)(struct cpufreq_policy *, const char *, size_t); +}; + +enum tk_offsets { + TK_OFFS_REAL = 0, + TK_OFFS_BOOT = 1, + TK_OFFS_TAI = 2, + TK_OFFS_MAX = 3, +}; + +typedef __u16 __sum16; + +typedef u16 u_int16_t; + +typedef u32 u_int32_t; + +typedef u64 u_int64_t; + +enum ip_conntrack_info { + IP_CT_ESTABLISHED = 0, + IP_CT_RELATED = 1, + IP_CT_NEW = 2, + IP_CT_IS_REPLY = 3, + IP_CT_ESTABLISHED_REPLY = 3, + IP_CT_RELATED_REPLY = 4, + IP_CT_NUMBER = 5, + IP_CT_UNTRACKED = 7, +}; + +struct nf_conntrack { + refcount_t use; +}; + +struct in_addr { + __be32 s_addr; +}; + +union nf_inet_addr { + __u32 all[4]; + __be32 ip; + __be32 ip6[4]; + struct in_addr in; + struct in6_addr in6; +}; + +struct rt6key { + struct in6_addr addr; + int plen; +}; + +struct rtable; + +struct fnhe_hash_bucket; + +struct fib_nh_common { + struct net_device *nhc_dev; + netdevice_tracker nhc_dev_tracker; + int nhc_oif; + unsigned char nhc_scope; + u8 nhc_family; + u8 nhc_gw_family; + unsigned char nhc_flags; + struct lwtunnel_state *nhc_lwtstate; + union { + __be32 ipv4; + struct in6_addr ipv6; + } nhc_gw; + int nhc_weight; + atomic_t nhc_upper_bound; + struct rtable **nhc_pcpu_rth_output; + struct rtable *nhc_rth_input; + struct fnhe_hash_bucket *nhc_exceptions; +}; + +struct rt6_exception_bucket; + +struct fib6_nh { + struct fib_nh_common nh_common; + long unsigned int last_probe; + struct rt6_info **rt6i_pcpu; + struct rt6_exception_bucket *rt6i_exception_bucket; +}; + +struct fib6_node; + +struct dst_metrics; + +struct nexthop; + +struct fib6_info { + struct fib6_table *fib6_table; + struct fib6_info *fib6_next; + struct fib6_node *fib6_node; + union { + struct list_head fib6_siblings; + struct list_head nh_list; + }; + unsigned int fib6_nsiblings; + refcount_t fib6_ref; + long unsigned int expires; + struct dst_metrics *fib6_metrics; + struct rt6key fib6_dst; + u32 fib6_flags; + struct rt6key fib6_src; + struct rt6key fib6_prefsrc; + u32 fib6_metric; + u8 fib6_protocol; + u8 fib6_type; + u8 offload; + u8 trap; + u8 offload_failed; + u8 should_flush: 1; + u8 dst_nocount: 1; + u8 dst_nopolicy: 1; + u8 fib6_destroying: 1; + u8 unused: 4; + struct callback_head rcu; + struct nexthop *nh; + struct fib6_nh fib6_nh[0]; +}; + +struct uncached_list; + +struct rt6_info { + struct dst_entry dst; + struct fib6_info *from; + int sernum; + struct rt6key rt6i_dst; + struct rt6key rt6i_src; + struct in6_addr rt6i_gateway; + struct inet6_dev *rt6i_idev; + u32 rt6i_flags; + struct list_head rt6i_uncached; + struct uncached_list *rt6i_uncached_list; + short unsigned int rt6i_nfheader_len; +}; + +struct rt6_statistics { + __u32 fib_nodes; + __u32 fib_route_nodes; + __u32 fib_rt_entries; + __u32 fib_rt_cache; + __u32 fib_discarded_routes; + atomic_t fib_rt_alloc; +}; + +struct fib6_node { + struct fib6_node *parent; + struct fib6_node *left; + struct fib6_node *right; + struct fib6_node *subtree; + struct fib6_info *leaf; + __u16 fn_bit; + __u16 fn_flags; + int fn_sernum; + struct fib6_info *rr_ptr; + struct callback_head rcu; +}; + +struct fib6_table { + struct hlist_node tb6_hlist; + u32 tb6_id; + spinlock_t tb6_lock; + struct fib6_node tb6_root; + struct inet_peer_base tb6_peers; + unsigned int flags; + unsigned int fib_seq; +}; + +struct nf_hook_state; + +typedef unsigned int nf_hookfn(void *, struct sk_buff *, const struct nf_hook_state *); + +struct nf_hook_entry { + nf_hookfn *hook; + void *priv; +}; + +struct nf_hook_entries { + u16 num_hook_entries; + struct nf_hook_entry hooks[0]; +}; + +struct ip_ct_tcp_state { + u_int32_t td_end; + u_int32_t td_maxend; + u_int32_t td_maxwin; + u_int32_t td_maxack; + u_int8_t td_scale; + u_int8_t flags; +}; + +struct ip_ct_tcp { + struct ip_ct_tcp_state seen[2]; + u_int8_t state; + u_int8_t last_dir; + u_int8_t retrans; + u_int8_t last_index; + u_int32_t last_seq; + u_int32_t last_ack; + u_int32_t last_end; + u_int16_t last_win; + u_int8_t last_wscale; + u_int8_t last_flags; +}; + +union nf_conntrack_man_proto { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + __be16 id; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; +}; + +struct nf_ct_dccp { + u_int8_t role[2]; + u_int8_t state; + u_int8_t last_pkt; + u_int8_t last_dir; + u_int64_t handshake_seq; +}; + +struct ip_ct_sctp { + enum sctp_conntrack state; + __be32 vtag[2]; + u8 last_dir; + u8 flags; +}; + +struct iphdr { + __u8 ihl: 4; + __u8 version: 4; + __u8 tos; + __be16 tot_len; + __be16 id; + __be16 frag_off; + __u8 ttl; + __u8 protocol; + __sum16 check; + union { + struct { + __be32 saddr; + __be32 daddr; + }; + struct { + __be32 saddr; + __be32 daddr; + } addrs; + }; +}; + +struct ip_tunnel_parm { + char name[16]; + int link; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + struct iphdr iph; +}; + +struct nf_hook_state { + u8 hook; + u8 pf; + struct net_device *in; + struct net_device *out; + struct sock *sk; + struct net *net; + int (*okfn)(struct net *, struct sock *, struct sk_buff *); +}; + +struct nf_conntrack_man { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + u_int16_t l3num; +}; + +struct nf_conntrack_tuple { + struct nf_conntrack_man src; + struct { + union nf_inet_addr u3; + union { + __be16 all; + struct { + __be16 port; + } tcp; + struct { + __be16 port; + } udp; + struct { + u_int8_t type; + u_int8_t code; + } icmp; + struct { + __be16 port; + } dccp; + struct { + __be16 port; + } sctp; + struct { + __be16 key; + } gre; + } u; + u_int8_t protonum; + u_int8_t dir; + } dst; +}; + +struct nf_conntrack_tuple_hash { + struct hlist_nulls_node hnnode; + struct nf_conntrack_tuple tuple; +}; + +struct nf_ct_udp { + long unsigned int stream_ts; +}; + +struct nf_ct_gre { + unsigned int stream_timeout; + unsigned int timeout; +}; + +union nf_conntrack_proto { + struct nf_ct_dccp dccp; + struct ip_ct_sctp sctp; + struct ip_ct_tcp tcp; + struct nf_ct_udp udp; + struct nf_ct_gre gre; + unsigned int tmpl_padto; +}; + +struct nf_ct_ext; + +struct nf_conn { + struct nf_conntrack ct_general; + spinlock_t lock; + u32 timeout; + struct nf_conntrack_tuple_hash tuplehash[2]; + long unsigned int status; + possible_net_t ct_net; + struct hlist_node nat_bysource; + struct { } __nfct_init_offset; + struct nf_conn *master; + u_int32_t mark; + struct nf_ct_ext *ext; + union nf_conntrack_proto proto; +}; + +struct nf_conntrack_zone { + u16 id; + u8 flags; + u8 dir; +}; + +struct icmphdr { + __u8 type; + __u8 code; + __sum16 checksum; + union { + struct { + __be16 id; + __be16 sequence; + } echo; + __be32 gateway; + struct { + __be16 __unused; + __be16 mtu; + } frag; + __u8 reserved[4]; + } un; +}; + +struct dst_metrics { + u32 metrics[17]; + refcount_t refcnt; +}; + +struct fib_nh_exception { + struct fib_nh_exception *fnhe_next; + int fnhe_genid; + __be32 fnhe_daddr; + u32 fnhe_pmtu; + bool fnhe_mtu_locked; + __be32 fnhe_gw; + long unsigned int fnhe_expires; + struct rtable *fnhe_rth_input; + struct rtable *fnhe_rth_output; + long unsigned int fnhe_stamp; + struct callback_head rcu; +}; + +struct rtable { + struct dst_entry dst; + int rt_genid; + unsigned int rt_flags; + __u16 rt_type; + __u8 rt_is_input; + __u8 rt_uses_gateway; + int rt_iif; + u8 rt_gw_family; + union { + __be32 rt_gw4; + struct in6_addr rt_gw6; + }; + u32 rt_mtu_locked: 1; + u32 rt_pmtu: 31; + struct list_head rt_uncached; + struct uncached_list *rt_uncached_list; +}; + +struct fnhe_hash_bucket { + struct fib_nh_exception *chain; +}; + +struct fib_info; + +struct fib_nh { + struct fib_nh_common nh_common; + struct hlist_node nh_hash; + struct fib_info *nh_parent; + __be32 nh_saddr; + int nh_saddr_genid; +}; + +struct fib_info { + struct hlist_node fib_hash; + struct hlist_node fib_lhash; + struct list_head nh_list; + struct net *fib_net; + refcount_t fib_treeref; + refcount_t fib_clntref; + unsigned int fib_flags; + unsigned char fib_dead; + unsigned char fib_protocol; + unsigned char fib_scope; + unsigned char fib_type; + __be32 fib_prefsrc; + u32 fib_tb_id; + u32 fib_priority; + struct dst_metrics *fib_metrics; + int fib_nhs; + bool fib_nh_is_v6; + bool nh_updated; + struct nexthop *nh; + struct callback_head rcu; + struct fib_nh fib_nh[0]; +}; + +struct nh_info; + +struct nh_group; + +struct nexthop { + struct rb_node rb_node; + struct list_head fi_list; + struct list_head f6i_list; + struct list_head fdb_list; + struct list_head grp_list; + struct net *net; + u32 id; + u8 protocol; + u8 nh_flags; + bool is_group; + refcount_t refcnt; + struct callback_head rcu; + union { + struct nh_info *nh_info; + struct nh_group *nh_grp; + }; +}; + +struct rt6_exception_bucket { + struct hlist_head chain; + int depth; +}; + +struct nh_info { + struct hlist_node dev_hash; + struct nexthop *nh_parent; + u8 family; + bool reject_nh; + bool fdb_nh; + union { + struct fib_nh_common fib_nhc; + struct fib_nh fib_nh; + struct fib6_nh fib6_nh; + }; +}; + +struct nh_grp_entry; + +struct nh_res_bucket { + struct nh_grp_entry *nh_entry; + atomic_long_t used_time; + long unsigned int migrated_time; + bool occupied; + u8 nh_flags; +}; + +struct nh_grp_entry { + struct nexthop *nh; + u8 weight; + union { + struct { + atomic_t upper_bound; + } hthr; + struct { + struct list_head uw_nh_entry; + u16 count_buckets; + u16 wants_buckets; + } res; + }; + struct list_head nh_list; + struct nexthop *nh_parent; +}; + +struct nh_res_table { + struct net *net; + u32 nhg_id; + struct delayed_work upkeep_dw; + struct list_head uw_nh_entries; + long unsigned int unbalanced_since; + u32 idle_timer; + u32 unbalanced_timer; + u16 num_nh_buckets; + struct nh_res_bucket nh_buckets[0]; +}; + +struct nh_group { + struct nh_group *spare; + u16 num_nh; + bool is_multipath; + bool hash_threshold; + bool resilient; + bool fdb_nh; + bool has_v4; + struct nh_res_table *res_table; + struct nh_grp_entry nh_entries[0]; +}; + +struct nf_conntrack_l4proto { + u_int8_t l4proto; + bool allow_clash; + u16 nlattr_size; + bool (*can_early_drop)(const struct nf_conn *); + int (*to_nlattr)(struct sk_buff *, struct nlattr *, struct nf_conn *, bool); + int (*from_nlattr)(struct nlattr **, struct nf_conn *); + int (*tuple_to_nlattr)(struct sk_buff *, const struct nf_conntrack_tuple *); + unsigned int (*nlattr_tuple_size)(); + int (*nlattr_to_tuple)(struct nlattr **, struct nf_conntrack_tuple *, u_int32_t); + const struct nla_policy *nla_policy; + struct { + int (*nlattr_to_obj)(struct nlattr **, struct net *, void *); + int (*obj_to_nlattr)(struct sk_buff *, const void *); + u16 obj_size; + u16 nlattr_max; + const struct nla_policy *nla_policy; + } ctnl_timeout; +}; + +struct nf_ct_ext { + u8 offset[5]; + u8 len; + unsigned int gen_id; + int: 32; + char data[0]; +}; + +struct nf_loginfo { + u_int8_t type; + union { + struct { + u_int32_t copy_len; + u_int16_t group; + u_int16_t qthreshold; + u_int16_t flags; + } ulog; + struct { + u_int8_t level; + u_int8_t logflags; + } log; + } u; +}; + +enum hrtimer_mode { + HRTIMER_MODE_ABS = 0, + HRTIMER_MODE_REL = 1, + HRTIMER_MODE_PINNED = 2, + HRTIMER_MODE_SOFT = 4, + HRTIMER_MODE_HARD = 8, + HRTIMER_MODE_ABS_PINNED = 2, + HRTIMER_MODE_REL_PINNED = 3, + HRTIMER_MODE_ABS_SOFT = 4, + HRTIMER_MODE_REL_SOFT = 5, + HRTIMER_MODE_ABS_PINNED_SOFT = 6, + HRTIMER_MODE_REL_PINNED_SOFT = 7, + HRTIMER_MODE_ABS_HARD = 8, + HRTIMER_MODE_REL_HARD = 9, + HRTIMER_MODE_ABS_PINNED_HARD = 10, + HRTIMER_MODE_REL_PINNED_HARD = 11, +}; + +struct minmax_sample { + u32 t; + u32 v; +}; + +struct minmax { + struct minmax_sample s[3]; +}; + +struct fastopen_queue { + struct request_sock *rskq_rst_head; + struct request_sock *rskq_rst_tail; + spinlock_t lock; + int qlen; + int max_qlen; + struct tcp_fastopen_context *ctx; +}; + +struct request_sock_queue { + spinlock_t rskq_lock; + u8 rskq_defer_accept; + u32 synflood_warned; + atomic_t qlen; + atomic_t young; + struct request_sock *rskq_accept_head; + struct request_sock *rskq_accept_tail; + struct fastopen_queue fastopenq; +}; + +struct ip_options { + __be32 faddr; + __be32 nexthop; + unsigned char optlen; + unsigned char srr; + unsigned char rr; + unsigned char ts; + unsigned char is_strictroute: 1; + unsigned char srr_is_hit: 1; + unsigned char is_changed: 1; + unsigned char rr_needaddr: 1; + unsigned char ts_needtime: 1; + unsigned char ts_needaddr: 1; + unsigned char router_alert; + unsigned char cipso; + unsigned char __pad2; + unsigned char __data[0]; +}; + +struct ip_options_rcu { + struct callback_head rcu; + struct ip_options opt; +}; + +struct ipv6_txoptions { + refcount_t refcnt; + int tot_len; + __u16 opt_flen; + __u16 opt_nflen; + struct ipv6_opt_hdr *hopopt; + struct ipv6_opt_hdr *dst0opt; + struct ipv6_rt_hdr *srcrt; + struct ipv6_opt_hdr *dst1opt; + struct callback_head rcu; +}; + +struct inet_request_sock { + struct request_sock req; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u16 tstamp_ok: 1; + u16 sack_ok: 1; + u16 wscale_ok: 1; + u16 ecn_ok: 1; + u16 acked: 1; + u16 no_srccheck: 1; + u16 smc_ok: 1; + u32 ir_mark; + union { + struct ip_options_rcu *ireq_opt; + struct { + struct ipv6_txoptions *ipv6_opt; + struct sk_buff *pktopts; + }; + }; +}; + +struct inet_cork { + unsigned int flags; + __be32 addr; + struct ip_options *opt; + unsigned int fragsize; + int length; + struct dst_entry *dst; + u8 tx_flags; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; + u64 transmit_time; + u32 mark; +}; + +struct inet_cork_full { + struct inet_cork base; + struct flowi fl; +}; + +struct ipv6_pinfo; + +struct ip_mc_socklist; + +struct inet_sock { + struct sock sk; + struct ipv6_pinfo *pinet6; + __be32 inet_saddr; + __s16 uc_ttl; + __u16 cmsg_flags; + struct ip_options_rcu *inet_opt; + __be16 inet_sport; + __u16 inet_id; + __u8 tos; + __u8 min_ttl; + __u8 mc_ttl; + __u8 pmtudisc; + __u8 recverr: 1; + __u8 is_icsk: 1; + __u8 freebind: 1; + __u8 hdrincl: 1; + __u8 mc_loop: 1; + __u8 transparent: 1; + __u8 mc_all: 1; + __u8 nodefrag: 1; + __u8 bind_address_no_port: 1; + __u8 recverr_rfc4884: 1; + __u8 defer_connect: 1; + __u8 rcv_tos; + __u8 convert_csum; + int uc_index; + int mc_index; + __be32 mc_addr; + struct ip_mc_socklist *mc_list; + struct inet_cork_full cork; +}; + +struct in6_pktinfo { + struct in6_addr ipi6_addr; + int ipi6_ifindex; +}; + +struct inet6_cork { + struct ipv6_txoptions *opt; + u8 hop_limit; + u8 tclass; +}; + +struct ipv6_mc_socklist; + +struct ipv6_ac_socklist; + +struct ipv6_fl_socklist; + +struct ipv6_pinfo { + struct in6_addr saddr; + struct in6_pktinfo sticky_pktinfo; + const struct in6_addr *daddr_cache; + const struct in6_addr *saddr_cache; + __be32 flow_label; + __u32 frag_size; + __u16 __unused_1: 7; + __s16 hop_limit: 9; + __u16 mc_loop: 1; + __u16 __unused_2: 6; + __s16 mcast_hops: 9; + int ucast_oif; + int mcast_oif; + union { + struct { + __u16 srcrt: 1; + __u16 osrcrt: 1; + __u16 rxinfo: 1; + __u16 rxoinfo: 1; + __u16 rxhlim: 1; + __u16 rxohlim: 1; + __u16 hopopts: 1; + __u16 ohopopts: 1; + __u16 dstopts: 1; + __u16 odstopts: 1; + __u16 rxflow: 1; + __u16 rxtclass: 1; + __u16 rxpmtu: 1; + __u16 rxorigdstaddr: 1; + __u16 recvfragsize: 1; + } bits; + __u16 all; + } rxopt; + __u16 recverr: 1; + __u16 sndflow: 1; + __u16 repflow: 1; + __u16 pmtudisc: 3; + __u16 padding: 1; + __u16 srcprefs: 3; + __u16 dontfrag: 1; + __u16 autoflowlabel: 1; + __u16 autoflowlabel_set: 1; + __u16 mc_all: 1; + __u16 recverr_rfc4884: 1; + __u16 rtalert_isolate: 1; + __u8 min_hopcount; + __u8 tclass; + __be32 rcv_flowinfo; + __u32 dst_cookie; + struct ipv6_mc_socklist *ipv6_mc_list; + struct ipv6_ac_socklist *ipv6_ac_list; + struct ipv6_fl_socklist *ipv6_fl_list; + struct ipv6_txoptions *opt; + struct sk_buff *pktoptions; + struct sk_buff *rxpmtu; + struct inet6_cork cork; +}; + +struct inet_connection_sock_af_ops { + int (*queue_xmit)(struct sock *, struct sk_buff *, struct flowi *); + void (*send_check)(struct sock *, struct sk_buff *); + int (*rebuild_header)(struct sock *); + void (*sk_rx_dst_set)(struct sock *, const struct sk_buff *); + int (*conn_request)(struct sock *, struct sk_buff *); + struct sock * (*syn_recv_sock)(const struct sock *, struct sk_buff *, struct request_sock *, struct dst_entry *, struct request_sock *, bool *); + u16 net_header_len; + u16 net_frag_header_len; + u16 sockaddr_len; + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*addr2sockaddr)(struct sock *, struct sockaddr *); + void (*mtu_reduced)(struct sock *); +}; + +struct inet_bind_bucket; + +struct inet_bind2_bucket; + +struct tcp_ulp_ops; + +struct inet_connection_sock { + struct inet_sock icsk_inet; + struct request_sock_queue icsk_accept_queue; + struct inet_bind_bucket *icsk_bind_hash; + struct inet_bind2_bucket *icsk_bind2_hash; + long unsigned int icsk_timeout; + struct timer_list icsk_retransmit_timer; + struct timer_list icsk_delack_timer; + __u32 icsk_rto; + __u32 icsk_rto_min; + __u32 icsk_delack_max; + __u32 icsk_pmtu_cookie; + const struct tcp_congestion_ops *icsk_ca_ops; + const struct inet_connection_sock_af_ops *icsk_af_ops; + const struct tcp_ulp_ops *icsk_ulp_ops; + void *icsk_ulp_data; + void (*icsk_clean_acked)(struct sock *, u32); + unsigned int (*icsk_sync_mss)(struct sock *, u32); + __u8 icsk_ca_state: 5; + __u8 icsk_ca_initialized: 1; + __u8 icsk_ca_setsockopt: 1; + __u8 icsk_ca_dst_locked: 1; + __u8 icsk_retransmits; + __u8 icsk_pending; + __u8 icsk_backoff; + __u8 icsk_syn_retries; + __u8 icsk_probes_out; + __u16 icsk_ext_hdr_len; + struct { + __u8 pending; + __u8 quick; + __u8 pingpong; + __u8 retry; + __u32 ato; + long unsigned int timeout; + __u32 lrcvtime; + __u16 last_seg_size; + __u16 rcv_mss; + } icsk_ack; + struct { + int search_high; + int search_low; + u32 probe_size: 31; + u32 enabled: 1; + u32 probe_timestamp; + } icsk_mtup; + u32 icsk_probes_tstamp; + u32 icsk_user_timeout; + u64 icsk_ca_priv[13]; +}; + +struct inet_bind_bucket { + possible_net_t ib_net; + int l3mdev; + short unsigned int port; + signed char fastreuse; + signed char fastreuseport; + kuid_t fastuid; + struct in6_addr fast_v6_rcv_saddr; + __be32 fast_rcv_saddr; + short unsigned int fast_sk_family; + bool fast_ipv6_only; + struct hlist_node node; + struct hlist_head owners; +}; + +struct inet_bind2_bucket { + possible_net_t ib_net; + int l3mdev; + short unsigned int port; + short unsigned int family; + union { + struct in6_addr v6_rcv_saddr; + __be32 rcv_saddr; + }; + struct hlist_node node; + struct hlist_head owners; +}; + +struct tcp_ulp_ops { + struct list_head list; + int (*init)(struct sock *); + void (*update)(struct sock *, struct proto *, void (*)(struct sock *)); + void (*release)(struct sock *); + int (*get_info)(const struct sock *, struct sk_buff *); + size_t (*get_info_size)(const struct sock *); + void (*clone)(const struct request_sock *, struct sock *, const gfp_t); + char name[16]; + struct module *owner; +}; + +enum inet_csk_ack_state_t { + ICSK_ACK_SCHED = 1, + ICSK_ACK_TIMER = 2, + ICSK_ACK_PUSHED = 4, + ICSK_ACK_PUSHED2 = 8, + ICSK_ACK_NOW = 16, +}; + +enum tcp_ca_state { + TCP_CA_Open = 0, + TCP_CA_Disorder = 1, + TCP_CA_CWR = 2, + TCP_CA_Recovery = 3, + TCP_CA_Loss = 4, +}; + +struct tcp_fastopen_cookie { + __le64 val[2]; + s8 len; + bool exp; +}; + +struct tcp_sack_block { + u32 start_seq; + u32 end_seq; +}; + +struct tcp_options_received { + int ts_recent_stamp; + u32 ts_recent; + u32 rcv_tsval; + u32 rcv_tsecr; + u16 saw_tstamp: 1; + u16 tstamp_ok: 1; + u16 dsack: 1; + u16 wscale_ok: 1; + u16 sack_ok: 3; + u16 smc_ok: 1; + u16 snd_wscale: 4; + u16 rcv_wscale: 4; + u8 saw_unknown: 1; + u8 unused: 7; + u8 num_sacks; + u16 user_mss; + u16 mss_clamp; +}; + +struct tcp_rack { + u64 mstamp; + u32 rtt_us; + u32 end_seq; + u32 last_delivered; + u8 reo_wnd_steps; + u8 reo_wnd_persist: 5; + u8 dsack_seen: 1; + u8 advanced: 1; +}; + +struct tcp_sock_af_ops; + +struct tcp_md5sig_info; + +struct tcp_fastopen_request; + +struct tcp_sock { + struct inet_connection_sock inet_conn; + u16 tcp_header_len; + u16 gso_segs; + __be32 pred_flags; + u64 bytes_received; + u32 segs_in; + u32 data_segs_in; + u32 rcv_nxt; + u32 copied_seq; + u32 rcv_wup; + u32 snd_nxt; + u32 segs_out; + u32 data_segs_out; + u64 bytes_sent; + u64 bytes_acked; + u32 dsack_dups; + u32 snd_una; + u32 snd_sml; + u32 rcv_tstamp; + u32 lsndtime; + u32 last_oow_ack_time; + u32 compressed_ack_rcv_nxt; + u32 tsoffset; + struct list_head tsq_node; + struct list_head tsorted_sent_queue; + u32 snd_wl1; + u32 snd_wnd; + u32 max_window; + u32 mss_cache; + u32 window_clamp; + u32 rcv_ssthresh; + struct tcp_rack rack; + u16 advmss; + u8 compressed_ack; + u8 dup_ack_counter: 2; + u8 tlp_retrans: 1; + u8 unused: 5; + u32 chrono_start; + u32 chrono_stat[3]; + u8 chrono_type: 2; + u8 rate_app_limited: 1; + u8 fastopen_connect: 1; + u8 fastopen_no_cookie: 1; + u8 is_sack_reneg: 1; + u8 fastopen_client_fail: 2; + u8 nonagle: 4; + u8 thin_lto: 1; + u8 recvmsg_inq: 1; + u8 repair: 1; + u8 frto: 1; + u8 repair_queue; + u8 save_syn: 2; + u8 syn_data: 1; + u8 syn_fastopen: 1; + u8 syn_fastopen_exp: 1; + u8 syn_fastopen_ch: 1; + u8 syn_data_acked: 1; + u8 is_cwnd_limited: 1; + u32 tlp_high_seq; + u32 tcp_tx_delay; + u64 tcp_wstamp_ns; + u64 tcp_clock_cache; + u64 tcp_mstamp; + u32 srtt_us; + u32 mdev_us; + u32 mdev_max_us; + u32 rttvar_us; + u32 rtt_seq; + struct minmax rtt_min; + u32 packets_out; + u32 retrans_out; + u32 max_packets_out; + u32 cwnd_usage_seq; + u16 urg_data; + u8 ecn_flags; + u8 keepalive_probes; + u32 reordering; + u32 reord_seen; + u32 snd_up; + struct tcp_options_received rx_opt; + u32 snd_ssthresh; + u32 snd_cwnd; + u32 snd_cwnd_cnt; + u32 snd_cwnd_clamp; + u32 snd_cwnd_used; + u32 snd_cwnd_stamp; + u32 prior_cwnd; + u32 prr_delivered; + u32 prr_out; + u32 delivered; + u32 delivered_ce; + u32 lost; + u32 app_limited; + u64 first_tx_mstamp; + u64 delivered_mstamp; + u32 rate_delivered; + u32 rate_interval_us; + u32 rcv_wnd; + u32 write_seq; + u32 notsent_lowat; + u32 pushed_seq; + u32 lost_out; + u32 sacked_out; + struct hrtimer pacing_timer; + struct hrtimer compressed_ack_timer; + struct sk_buff *lost_skb_hint; + struct sk_buff *retransmit_skb_hint; + struct rb_root out_of_order_queue; + struct sk_buff *ooo_last_skb; + struct tcp_sack_block duplicate_sack[1]; + struct tcp_sack_block selective_acks[4]; + struct tcp_sack_block recv_sack_cache[4]; + struct sk_buff *highest_sack; + int lost_cnt_hint; + u32 prior_ssthresh; + u32 high_seq; + u32 retrans_stamp; + u32 undo_marker; + int undo_retrans; + u64 bytes_retrans; + u32 total_retrans; + u32 urg_seq; + unsigned int keepalive_time; + unsigned int keepalive_intvl; + int linger2; + u8 bpf_sock_ops_cb_flags; + u8 bpf_chg_cc_inprogress: 1; + u16 timeout_rehash; + u32 rcv_ooopack; + u32 rcv_rtt_last_tsecr; + struct { + u32 rtt_us; + u32 seq; + u64 time; + } rcv_rtt_est; + struct { + u32 space; + u32 seq; + u64 time; + } rcvq_space; + struct { + u32 probe_seq_start; + u32 probe_seq_end; + } mtu_probe; + u32 plb_rehash; + u32 mtu_info; + bool is_mptcp; + const struct tcp_sock_af_ops *af_specific; + struct tcp_md5sig_info *md5sig_info; + struct tcp_fastopen_request *fastopen_req; + struct request_sock *fastopen_rsk; + struct saved_syn *saved_syn; +}; + +struct tcp_md5sig_key; + +struct tcp_sock_af_ops { + struct tcp_md5sig_key * (*md5_lookup)(const struct sock *, const struct sock *); + int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); + int (*md5_parse)(struct sock *, int, sockptr_t, int); +}; + +struct tcp_md5sig_info { + struct hlist_head head; + struct callback_head rcu; +}; + +struct tcp_fastopen_request { + struct tcp_fastopen_cookie cookie; + struct msghdr *data; + size_t size; + int copied; + struct ubuf_info *uarg; +}; + +union tcp_md5_addr { + struct in_addr a4; + struct in6_addr a6; +}; + +struct tcp_md5sig_key { + struct hlist_node node; + u8 keylen; + u8 family; + u8 prefixlen; + u8 flags; + union tcp_md5_addr addr; + int l3index; + u8 key[80]; + struct callback_head rcu; +}; + +struct ip6_sf_socklist; + +struct ipv6_mc_socklist { + struct in6_addr addr; + int ifindex; + unsigned int sfmode; + struct ipv6_mc_socklist *next; + struct ip6_sf_socklist *sflist; + struct callback_head rcu; +}; + +struct ipv6_ac_socklist { + struct in6_addr acl_addr; + int acl_ifindex; + struct ipv6_ac_socklist *acl_next; +}; + +struct ip6_flowlabel; + +struct ipv6_fl_socklist { + struct ipv6_fl_socklist *next; + struct ip6_flowlabel *fl; + struct callback_head rcu; +}; + +struct ip6_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + struct in6_addr sl_addr[0]; +}; + +struct ip6_flowlabel { + struct ip6_flowlabel *next; + __be32 label; + atomic_t users; + struct in6_addr dst; + struct ipv6_txoptions *opt; + long unsigned int linger; + struct callback_head rcu; + u8 share; + union { + struct pid *pid; + kuid_t uid; + } owner; + long unsigned int lastuse; + long unsigned int expires; + struct net *fl_net; +}; + +enum { + BPF_SOCK_OPS_RTO_CB_FLAG = 1, + BPF_SOCK_OPS_RETRANS_CB_FLAG = 2, + BPF_SOCK_OPS_STATE_CB_FLAG = 4, + BPF_SOCK_OPS_RTT_CB_FLAG = 8, + BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = 16, + BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = 32, + BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = 64, + BPF_SOCK_OPS_ALL_CB_FLAGS = 127, +}; + +struct fs_struct { + int users; + spinlock_t lock; + seqcount_spinlock_t seq; + int umask; + int in_exec; + struct path root; + struct path pwd; +}; + +struct posix_acl_entry { + short int e_tag; + short unsigned int e_perm; + union { + kuid_t e_uid; + kgid_t e_gid; + }; +}; + +struct posix_acl { + refcount_t a_refcount; + struct callback_head a_rcu; + unsigned int a_count; + struct posix_acl_entry a_entries[0]; +}; + +enum { + Root_NFS = 255, + Root_CIFS = 254, + Root_RAM0 = 1048576, + Root_RAM1 = 1048577, + Root_FD0 = 2097152, + Root_HDA1 = 3145729, + Root_HDA2 = 3145730, + Root_SDA1 = 8388609, + Root_SDA2 = 8388610, + Root_HDC1 = 23068673, + Root_SR0 = 11534336, +}; + +enum rpc_display_format_t { + RPC_DISPLAY_ADDR = 0, + RPC_DISPLAY_PORT = 1, + RPC_DISPLAY_PROTO = 2, + RPC_DISPLAY_HEX_ADDR = 3, + RPC_DISPLAY_HEX_PORT = 4, + RPC_DISPLAY_NETID = 5, + RPC_DISPLAY_MAX = 6, +}; + +enum nfs_opnum4 { + OP_ACCESS = 3, + OP_CLOSE = 4, + OP_COMMIT = 5, + OP_CREATE = 6, + OP_DELEGPURGE = 7, + OP_DELEGRETURN = 8, + OP_GETATTR = 9, + OP_GETFH = 10, + OP_LINK = 11, + OP_LOCK = 12, + OP_LOCKT = 13, + OP_LOCKU = 14, + OP_LOOKUP = 15, + OP_LOOKUPP = 16, + OP_NVERIFY = 17, + OP_OPEN = 18, + OP_OPENATTR = 19, + OP_OPEN_CONFIRM = 20, + OP_OPEN_DOWNGRADE = 21, + OP_PUTFH = 22, + OP_PUTPUBFH = 23, + OP_PUTROOTFH = 24, + OP_READ = 25, + OP_READDIR = 26, + OP_READLINK = 27, + OP_REMOVE = 28, + OP_RENAME = 29, + OP_RENEW = 30, + OP_RESTOREFH = 31, + OP_SAVEFH = 32, + OP_SECINFO = 33, + OP_SETATTR = 34, + OP_SETCLIENTID = 35, + OP_SETCLIENTID_CONFIRM = 36, + OP_VERIFY = 37, + OP_WRITE = 38, + OP_RELEASE_LOCKOWNER = 39, + OP_BACKCHANNEL_CTL = 40, + OP_BIND_CONN_TO_SESSION = 41, + OP_EXCHANGE_ID = 42, + OP_CREATE_SESSION = 43, + OP_DESTROY_SESSION = 44, + OP_FREE_STATEID = 45, + OP_GET_DIR_DELEGATION = 46, + OP_GETDEVICEINFO = 47, + OP_GETDEVICELIST = 48, + OP_LAYOUTCOMMIT = 49, + OP_LAYOUTGET = 50, + OP_LAYOUTRETURN = 51, + OP_SECINFO_NO_NAME = 52, + OP_SEQUENCE = 53, + OP_SET_SSV = 54, + OP_TEST_STATEID = 55, + OP_WANT_DELEGATION = 56, + OP_DESTROY_CLIENTID = 57, + OP_RECLAIM_COMPLETE = 58, + OP_ALLOCATE = 59, + OP_COPY = 60, + OP_COPY_NOTIFY = 61, + OP_DEALLOCATE = 62, + OP_IO_ADVISE = 63, + OP_LAYOUTERROR = 64, + OP_LAYOUTSTATS = 65, + OP_OFFLOAD_CANCEL = 66, + OP_OFFLOAD_STATUS = 67, + OP_READ_PLUS = 68, + OP_SEEK = 69, + OP_WRITE_SAME = 70, + OP_CLONE = 71, + OP_GETXATTR = 72, + OP_SETXATTR = 73, + OP_LISTXATTRS = 74, + OP_REMOVEXATTR = 75, + OP_ILLEGAL = 10044, +}; + +enum perf_branch_sample_type_shift { + PERF_SAMPLE_BRANCH_USER_SHIFT = 0, + PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, + PERF_SAMPLE_BRANCH_HV_SHIFT = 2, + PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, + PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, + PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, + PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, + PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, + PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, + PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, + PERF_SAMPLE_BRANCH_COND_SHIFT = 10, + PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, + PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, + PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, + PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, + PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, + PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, + PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, + PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18, + PERF_SAMPLE_BRANCH_MAX_SHIFT = 19, +}; + +struct uuidcmp { + const char *uuid; + int len; +}; + +struct perf_event_mmap_page { + __u32 version; + __u32 compat_version; + __u32 lock; + __u32 index; + __s64 offset; + __u64 time_enabled; + __u64 time_running; + union { + __u64 capabilities; + struct { + __u64 cap_bit0: 1; + __u64 cap_bit0_is_deprecated: 1; + __u64 cap_user_rdpmc: 1; + __u64 cap_user_time: 1; + __u64 cap_user_time_zero: 1; + __u64 cap_user_time_short: 1; + __u64 cap_____res: 58; + }; + }; + __u16 pmc_width; + __u16 time_shift; + __u32 time_mult; + __u64 time_offset; + __u64 time_zero; + __u32 size; + __u32 __reserved_1; + __u64 time_cycles; + __u64 time_mask; + __u8 __reserved[928]; + __u64 data_head; + __u64 data_tail; + __u64 data_offset; + __u64 data_size; + __u64 aux_head; + __u64 aux_tail; + __u64 aux_offset; + __u64 aux_size; +}; + +struct perf_event_header { + __u32 type; + __u16 misc; + __u16 size; +}; + +enum perf_event_type { + PERF_RECORD_MMAP = 1, + PERF_RECORD_LOST = 2, + PERF_RECORD_COMM = 3, + PERF_RECORD_EXIT = 4, + PERF_RECORD_THROTTLE = 5, + PERF_RECORD_UNTHROTTLE = 6, + PERF_RECORD_FORK = 7, + PERF_RECORD_READ = 8, + PERF_RECORD_SAMPLE = 9, + PERF_RECORD_MMAP2 = 10, + PERF_RECORD_AUX = 11, + PERF_RECORD_ITRACE_START = 12, + PERF_RECORD_LOST_SAMPLES = 13, + PERF_RECORD_SWITCH = 14, + PERF_RECORD_SWITCH_CPU_WIDE = 15, + PERF_RECORD_NAMESPACES = 16, + PERF_RECORD_KSYMBOL = 17, + PERF_RECORD_BPF_EVENT = 18, + PERF_RECORD_CGROUP = 19, + PERF_RECORD_TEXT_POKE = 20, + PERF_RECORD_AUX_OUTPUT_HW_ID = 21, + PERF_RECORD_MAX = 22, +}; + +struct perf_buffer { + refcount_t refcount; + struct callback_head callback_head; + int nr_pages; + int overwrite; + int paused; + atomic_t poll; + local_t head; + unsigned int nest; + local_t events; + local_t wakeup; + local_t lost; + long int watermark; + long int aux_watermark; + spinlock_t event_lock; + struct list_head event_list; + atomic_t mmap_count; + long unsigned int mmap_locked; + struct user_struct *mmap_user; + long int aux_head; + unsigned int aux_nest; + long int aux_wakeup; + long unsigned int aux_pgoff; + int aux_nr_pages; + int aux_overwrite; + atomic_t aux_mmap_count; + long unsigned int aux_mmap_locked; + void (*free_aux)(void *); + refcount_t aux_refcount; + int aux_in_sampling; + void **aux_pages; + void *aux_priv; + struct perf_event_mmap_page *user_page; + void *data_pages[0]; +}; + +enum { + SUBPAGE_INDEX_SUBPOOL = 1, + SUBPAGE_INDEX_CGROUP = 2, + SUBPAGE_INDEX_CGROUP_RSVD = 3, + __MAX_CGROUP_SUBPAGE_INDEX = 3, + SUBPAGE_INDEX_HWPOISON = 4, + __NR_USED_SUBPAGE = 5, +}; + +struct hstate { + struct mutex resize_lock; + int next_nid_to_alloc; + int next_nid_to_free; + unsigned int order; + unsigned int demote_order; + long unsigned int mask; + long unsigned int max_huge_pages; + long unsigned int nr_huge_pages; + long unsigned int free_huge_pages; + long unsigned int resv_huge_pages; + long unsigned int surplus_huge_pages; + long unsigned int nr_overcommit_huge_pages; + struct list_head hugepage_activelist; + struct list_head hugepage_freelists[64]; + unsigned int max_huge_pages_node[64]; + unsigned int nr_huge_pages_node[64]; + unsigned int free_huge_pages_node[64]; + unsigned int surplus_huge_pages_node[64]; + struct cftype cgroup_files_dfl[8]; + struct cftype cgroup_files_legacy[10]; + char name[32]; +}; + +enum hugetlb_page_flags { + HPG_restore_reserve = 0, + HPG_migratable = 1, + HPG_temporary = 2, + HPG_freed = 3, + HPG_vmemmap_optimized = 4, + HPG_raw_hwp_unreliable = 5, + __NR_HPAGEFLAGS = 6, +}; + +struct vmemmap_remap_walk { + void (*remap_pte)(pte_t *, long unsigned int, struct vmemmap_remap_walk *); + long unsigned int nr_walked; + struct page *reuse_page; + long unsigned int reuse_addr; + struct list_head *vmemmap_pages; +}; + +enum mapping_flags { + AS_EIO = 0, + AS_ENOSPC = 1, + AS_MM_ALL_LOCKS = 2, + AS_UNEVICTABLE = 3, + AS_EXITING = 4, + AS_NO_WRITEBACK_TAGS = 5, + AS_LARGE_FOLIO_SUPPORT = 6, +}; + +struct pseudo_fs_context { + const struct super_operations *ops; + const struct xattr_handler **xattr; + const struct dentry_operations *dops; + long unsigned int magic; +}; + +struct xattr; + +typedef int (*initxattrs)(struct inode *, const struct xattr *, void *); + +struct xattr { + const char *name; + void *value; + size_t value_len; +}; + +enum key_need_perm { + KEY_NEED_UNSPECIFIED = 0, + KEY_NEED_VIEW = 1, + KEY_NEED_READ = 2, + KEY_NEED_WRITE = 3, + KEY_NEED_SEARCH = 4, + KEY_NEED_LINK = 5, + KEY_NEED_SETATTR = 6, + KEY_NEED_UNLINK = 7, + KEY_SYSADMIN_OVERRIDE = 8, + KEY_AUTHTOKEN_OVERRIDE = 9, + KEY_DEFER_PERM_CHECK = 10, +}; + +struct __key_reference_with_attributes; + +typedef struct __key_reference_with_attributes *key_ref_t; + +enum key_state { + KEY_IS_UNINSTANTIATED = 0, + KEY_IS_POSITIVE = 1, +}; + +struct key_user { + struct rb_node node; + struct mutex cons_lock; + spinlock_t lock; + refcount_t usage; + atomic_t nkeys; + atomic_t nikeys; + kuid_t uid; + int qnkeys; + int qnbytes; +}; + +struct key_preparsed_payload { + const char *orig_description; + char *description; + union key_payload payload; + const void *data; + size_t datalen; + size_t quotalen; + time64_t expiry; +}; + +struct key_match_data { + bool (*cmp)(const struct key *, const struct key_match_data *); + const void *raw_data; + void *preparsed; + unsigned int lookup_type; +}; + +enum kernel_pkey_operation { + kernel_pkey_encrypt = 0, + kernel_pkey_decrypt = 1, + kernel_pkey_sign = 2, + kernel_pkey_verify = 3, +}; + +struct kernel_pkey_params { + struct key *key; + const char *encoding; + const char *hash_algo; + char *info; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + enum kernel_pkey_operation op: 8; +}; + +struct kernel_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; +}; + +enum key_notification_subtype { + NOTIFY_KEY_INSTANTIATED = 0, + NOTIFY_KEY_UPDATED = 1, + NOTIFY_KEY_LINKED = 2, + NOTIFY_KEY_UNLINKED = 3, + NOTIFY_KEY_CLEARED = 4, + NOTIFY_KEY_REVOKED = 5, + NOTIFY_KEY_INVALIDATED = 6, + NOTIFY_KEY_SETATTR = 7, +}; + +struct assoc_array_edit; + +struct crypto_wait { + struct completion completion; + int err; +}; + +struct hash_alg_common { + unsigned int digestsize; + unsigned int statesize; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct ahash_request { + struct crypto_async_request base; + unsigned int nbytes; + struct scatterlist *src; + u8 *result; + void *priv; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_ahash { + int (*init)(struct ahash_request *); + int (*update)(struct ahash_request *); + int (*final)(struct ahash_request *); + int (*finup)(struct ahash_request *); + int (*digest)(struct ahash_request *); + int (*export)(struct ahash_request *, void *); + int (*import)(struct ahash_request *, const void *); + int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +enum integrity_status { + INTEGRITY_PASS = 0, + INTEGRITY_PASS_IMMUTABLE = 1, + INTEGRITY_FAIL = 2, + INTEGRITY_FAIL_IMMUTABLE = 3, + INTEGRITY_NOLABEL = 4, + INTEGRITY_NOXATTRS = 5, + INTEGRITY_UNKNOWN = 6, +}; + +struct evm_ima_xattr_data { + u8 type; + u8 data[0]; +}; + +struct ima_digest_data { + u8 algo; + u8 length; + union { + struct { + u8 unused; + u8 type; + } sha1; + struct { + u8 type; + u8 algo; + } ng; + u8 data[2]; + } xattr; + u8 digest[0]; +}; + +struct integrity_iint_cache { + struct rb_node rb_node; + struct mutex mutex; + struct inode *inode; + u64 version; + long unsigned int flags; + long unsigned int measured_pcrs; + long unsigned int atomic_flags; + enum integrity_status ima_file_status: 4; + enum integrity_status ima_mmap_status: 4; + enum integrity_status ima_bprm_status: 4; + enum integrity_status ima_read_status: 4; + enum integrity_status ima_creds_status: 4; + enum integrity_status evm_status: 4; + struct ima_digest_data *ima_hash; +}; + +enum ima_show_type { + IMA_SHOW_BINARY = 0, + IMA_SHOW_BINARY_NO_FIELD_LEN = 1, + IMA_SHOW_BINARY_OLD_STRING_FMT = 2, + IMA_SHOW_ASCII = 3, +}; + +enum tpm_pcrs { + TPM_PCR0 = 0, + TPM_PCR8 = 8, + TPM_PCR10 = 10, +}; + +struct modsig; + +struct ima_event_data { + struct integrity_iint_cache *iint; + struct file *file; + const unsigned char *filename; + struct evm_ima_xattr_data *xattr_value; + int xattr_len; + const struct modsig *modsig; + const char *violation; + const void *buf; + int buf_len; +}; + +struct ima_field_data { + u8 *data; + u32 len; +}; + +struct ima_template_field { + const char field_id[16]; + int (*field_init)(struct ima_event_data *, struct ima_field_data *); + void (*field_show)(struct seq_file *, enum ima_show_type, struct ima_field_data *); +}; + +struct ima_template_desc { + struct list_head list; + char *name; + char *fmt; + int num_fields; + const struct ima_template_field **fields; +}; + +struct ima_template_entry { + int pcr; + struct tpm_digest *digests; + struct ima_template_desc *template_desc; + u32 template_data_len; + struct ima_field_data template_data[0]; +}; + +struct ima_algo_desc { + struct crypto_shash *tfm; + enum hash_algo algo; +}; + +enum { + AML_FIELD_ATTRIB_QUICK = 2, + AML_FIELD_ATTRIB_SEND_RECEIVE = 4, + AML_FIELD_ATTRIB_BYTE = 6, + AML_FIELD_ATTRIB_WORD = 8, + AML_FIELD_ATTRIB_BLOCK = 10, + AML_FIELD_ATTRIB_BYTES = 11, + AML_FIELD_ATTRIB_PROCESS_CALL = 12, + AML_FIELD_ATTRIB_BLOCK_PROCESS_CALL = 13, + AML_FIELD_ATTRIB_RAW_BYTES = 14, + AML_FIELD_ATTRIB_RAW_PROCESS_BYTES = 15, +}; + +struct acpi_interface_info { + char *name; + struct acpi_interface_info *next; + u8 flags; + u8 value; +}; + +struct msi_dev_domain { + struct xarray store; + struct irq_domain *domain; +}; + +struct platform_msi_priv_data; + +struct msi_device_data { + long unsigned int properties; + struct platform_msi_priv_data *platform_data; + struct mutex mutex; + struct msi_dev_domain __domains[2]; + long unsigned int __iter_idx; +}; + +struct arch_msi_msg_addr_lo { + u32 address_lo; +}; + +typedef struct arch_msi_msg_addr_lo arch_msi_msg_addr_lo_t; + +struct arch_msi_msg_addr_hi { + u32 address_hi; +}; + +typedef struct arch_msi_msg_addr_hi arch_msi_msg_addr_hi_t; + +struct arch_msi_msg_data { + u32 data; +}; + +typedef struct arch_msi_msg_data arch_msi_msg_data_t; + +struct msi_msg { + union { + u32 address_lo; + arch_msi_msg_addr_lo_t arch_addr_lo; + }; + union { + u32 address_hi; + arch_msi_msg_addr_hi_t arch_addr_hi; + }; + union { + u32 data; + arch_msi_msg_data_t arch_data; + }; +}; + +struct pci_msi_desc { + union { + u32 msi_mask; + u32 msix_ctrl; + }; + struct { + u8 is_msix: 1; + u8 multiple: 3; + u8 multi_cap: 3; + u8 can_mask: 1; + u8 is_64: 1; + u8 is_virtual: 1; + unsigned int default_irq; + } msi_attrib; + union { + u8 mask_pos; + void *mask_base; + }; +}; + +union msi_domain_cookie { + u64 value; + void *ptr; + void *iobase; +}; + +union msi_instance_cookie { + u64 value; + void *ptr; +}; + +struct msi_desc_data { + union msi_domain_cookie dcookie; + union msi_instance_cookie icookie; +}; + +struct irq_affinity_desc; + +struct msi_desc { + unsigned int irq; + unsigned int nvec_used; + struct device *dev; + struct msi_msg msg; + struct irq_affinity_desc *affinity; + const void *iommu_cookie; + struct device_attribute *sysfs_attrs; + void (*write_msi_msg)(struct msi_desc *, void *); + void *write_msi_msg_data; + u16 msi_index; + union { + struct pci_msi_desc pci; + struct msi_desc_data data; + }; +}; + +enum { + IRQCHIP_SET_TYPE_MASKED = 1, + IRQCHIP_EOI_IF_HANDLED = 2, + IRQCHIP_MASK_ON_SUSPEND = 4, + IRQCHIP_ONOFFLINE_ENABLED = 8, + IRQCHIP_SKIP_SET_WAKE = 16, + IRQCHIP_ONESHOT_SAFE = 32, + IRQCHIP_EOI_THREADED = 64, + IRQCHIP_SUPPORTS_LEVEL_MSI = 128, + IRQCHIP_SUPPORTS_NMI = 256, + IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND = 512, + IRQCHIP_AFFINITY_PRE_STARTUP = 1024, + IRQCHIP_IMMUTABLE = 2048, +}; + +enum msi_domain_ids { + MSI_DEFAULT_DOMAIN = 0, + MSI_SECONDARY_DOMAIN = 1, + MSI_MAX_DEVICE_IRQDOMAINS = 2, +}; + +struct msi_alloc_info { + struct msi_desc *desc; + irq_hw_number_t hwirq; + long unsigned int flags; + union { + long unsigned int ul; + void *ptr; + } scratchpad[2]; +}; + +typedef struct msi_alloc_info msi_alloc_info_t; + +typedef void (*irq_write_msi_msg_t)(struct msi_desc *, struct msi_msg *); + +struct platform_msi_priv_data { + struct device *dev; + void *host_data; + msi_alloc_info_t arg; + irq_write_msi_msg_t write_msg; + int devid; +}; + +struct msi_domain_ops { + irq_hw_number_t (*get_hwirq)(struct msi_domain_info *, msi_alloc_info_t *); + int (*msi_init)(struct irq_domain *, struct msi_domain_info *, unsigned int, irq_hw_number_t, msi_alloc_info_t *); + void (*msi_free)(struct irq_domain *, struct msi_domain_info *, unsigned int); + int (*msi_prepare)(struct irq_domain *, struct device *, int, msi_alloc_info_t *); + void (*prepare_desc)(struct irq_domain *, msi_alloc_info_t *, struct msi_desc *); + void (*set_desc)(msi_alloc_info_t *, struct msi_desc *); + int (*domain_alloc_irqs)(struct irq_domain *, struct device *, int); + void (*domain_free_irqs)(struct irq_domain *, struct device *); + void (*msi_post_free)(struct irq_domain *, struct device *); +}; + +struct msi_domain_info { + u32 flags; + enum irq_domain_bus_token bus_token; + unsigned int hwsize; + struct msi_domain_ops *ops; + struct irq_chip *chip; + void *chip_data; + irq_flow_handler_t handler; + void *handler_data; + const char *handler_name; + void *data; +}; + +enum { + MSI_FLAG_USE_DEF_DOM_OPS = 1, + MSI_FLAG_USE_DEF_CHIP_OPS = 2, + MSI_FLAG_ACTIVATE_EARLY = 4, + MSI_FLAG_MUST_REACTIVATE = 8, + MSI_FLAG_DEV_SYSFS = 16, + MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS = 32, + MSI_FLAG_FREE_MSI_DESCS = 64, + MSI_FLAG_NOMASK_QUIRK = 128, + MSI_GENERIC_FLAGS_MASK = 65535, + MSI_DOMAIN_FLAGS_MASK = 4294901760, + MSI_FLAG_MULTI_PCI_MSI = 65536, + MSI_FLAG_PCI_MSIX = 131072, + MSI_FLAG_LEVEL_CAPABLE = 262144, + MSI_FLAG_MSIX_CONTIGUOUS = 524288, + MSI_FLAG_PCI_MSIX_ALLOC_DYN = 1048576, + MSI_FLAG_PCI_IMS = 2097152, +}; + +struct ms_data { + long unsigned int quirks; + struct hid_device *hdev; + struct work_struct ff_worker; + __u8 strong; + __u8 weak; + void *output_report_dmabuf; +}; + +enum { + MAGNITUDE_STRONG = 2, + MAGNITUDE_WEAK = 3, + MAGNITUDE_NUM = 4, +}; + +struct xb1s_ff_report { + __u8 report_id; + __u8 enable; + __u8 magnitude[4]; + __u8 duration_10ms; + __u8 start_delay_10ms; + __u8 loop_count; +}; + +enum ip_conntrack_status { + IPS_EXPECTED_BIT = 0, + IPS_EXPECTED = 1, + IPS_SEEN_REPLY_BIT = 1, + IPS_SEEN_REPLY = 2, + IPS_ASSURED_BIT = 2, + IPS_ASSURED = 4, + IPS_CONFIRMED_BIT = 3, + IPS_CONFIRMED = 8, + IPS_SRC_NAT_BIT = 4, + IPS_SRC_NAT = 16, + IPS_DST_NAT_BIT = 5, + IPS_DST_NAT = 32, + IPS_NAT_MASK = 48, + IPS_SEQ_ADJUST_BIT = 6, + IPS_SEQ_ADJUST = 64, + IPS_SRC_NAT_DONE_BIT = 7, + IPS_SRC_NAT_DONE = 128, + IPS_DST_NAT_DONE_BIT = 8, + IPS_DST_NAT_DONE = 256, + IPS_NAT_DONE_MASK = 384, + IPS_DYING_BIT = 9, + IPS_DYING = 512, + IPS_FIXED_TIMEOUT_BIT = 10, + IPS_FIXED_TIMEOUT = 1024, + IPS_TEMPLATE_BIT = 11, + IPS_TEMPLATE = 2048, + IPS_UNTRACKED_BIT = 12, + IPS_UNTRACKED = 4096, + IPS_NAT_CLASH_BIT = 12, + IPS_NAT_CLASH = 4096, + IPS_HELPER_BIT = 13, + IPS_HELPER = 8192, + IPS_OFFLOAD_BIT = 14, + IPS_OFFLOAD = 16384, + IPS_HW_OFFLOAD_BIT = 15, + IPS_HW_OFFLOAD = 32768, + IPS_UNCHANGEABLE_MASK = 56313, + __IPS_MAX_BIT = 16, +}; + +struct icmpv6_echo { + __be16 identifier; + __be16 sequence; +}; + +struct icmpv6_nd_advt { + __u32 reserved: 5; + __u32 override: 1; + __u32 solicited: 1; + __u32 router: 1; + __u32 reserved2: 24; +}; + +struct icmpv6_nd_ra { + __u8 hop_limit; + __u8 reserved: 3; + __u8 router_pref: 2; + __u8 home_agent: 1; + __u8 other: 1; + __u8 managed: 1; + __be16 rt_lifetime; +}; + +struct icmp6hdr { + __u8 icmp6_type; + __u8 icmp6_code; + __sum16 icmp6_cksum; + union { + __be32 un_data32[1]; + __be16 un_data16[2]; + __u8 un_data8[4]; + struct icmpv6_echo u_echo; + struct icmpv6_nd_advt u_nd_advt; + struct icmpv6_nd_ra u_nd_ra; + } icmp6_dataun; +}; + +struct rd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + struct in6_addr dest; + __u8 opt[0]; +}; + +struct inet6_skb_parm { + int iif; + __be16 ra; + __u16 dst0; + __u16 srcrt; + __u16 dst1; + __u16 lastopt; + __u16 nhoff; + __u16 flags; + __u16 dsthao; + __u16 frag_max_size; + __u16 srhoff; +}; + +struct inet_skb_parm { + int iif; + struct ip_options opt; + u16 flags; + u16 frag_max_size; +}; + +enum tcp_queue { + TCP_FRAG_IN_WRITE_QUEUE = 0, + TCP_FRAG_IN_RTX_QUEUE = 1, +}; + +struct tcp_skb_cb { + __u32 seq; + __u32 end_seq; + union { + __u32 tcp_tw_isn; + struct { + u16 tcp_gso_segs; + u16 tcp_gso_size; + }; + }; + __u8 tcp_flags; + __u8 sacked; + __u8 ip_dsfield; + __u8 txstamp_ack: 1; + __u8 eor: 1; + __u8 has_rxtstamp: 1; + __u8 unused: 5; + __u32 ack_seq; + union { + struct { + __u32 is_app_limited: 1; + __u32 delivered_ce: 20; + __u32 unused: 11; + __u32 delivered; + u64 first_tx_mstamp; + u64 delivered_mstamp; + } tx; + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + }; +}; + +struct sockaddr_un { + __kernel_sa_family_t sun_family; + char sun_path[108]; +}; + +struct unix_address { + refcount_t refcnt; + int len; + struct sockaddr_un name[0]; +}; + +struct scm_stat { + atomic_t nr_fds; +}; + +struct unix_sock { + struct sock sk; + struct unix_address *addr; + struct path path; + struct mutex iolock; + struct mutex bindlock; + struct sock *peer; + struct list_head link; + atomic_long_t inflight; + spinlock_t lock; + long unsigned int gc_flags; + long: 64; + long: 64; + long: 64; + long: 64; + struct socket_wq peer_wq; + wait_queue_entry_t peer_wake; + struct scm_stat scm_stat; + struct sk_buff *oob_skb; + long: 64; +}; + +enum { + SKB_GSO_TCPV4 = 1, + SKB_GSO_DODGY = 2, + SKB_GSO_TCP_ECN = 4, + SKB_GSO_TCP_FIXEDID = 8, + SKB_GSO_TCPV6 = 16, + SKB_GSO_FCOE = 32, + SKB_GSO_GRE = 64, + SKB_GSO_GRE_CSUM = 128, + SKB_GSO_IPXIP4 = 256, + SKB_GSO_IPXIP6 = 512, + SKB_GSO_UDP_TUNNEL = 1024, + SKB_GSO_UDP_TUNNEL_CSUM = 2048, + SKB_GSO_PARTIAL = 4096, + SKB_GSO_TUNNEL_REMCSUM = 8192, + SKB_GSO_SCTP = 16384, + SKB_GSO_ESP = 32768, + SKB_GSO_UDP = 65536, + SKB_GSO_UDP_L4 = 131072, + SKB_GSO_FRAGLIST = 262144, +}; + +struct skb_gso_cb { + union { + int mac_offset; + int data_offset; + }; + int encap_level; + __wsum csum; + __u16 csum_start; +}; + +struct offload_callbacks { + struct sk_buff * (*gso_segment)(struct sk_buff *, netdev_features_t); + struct sk_buff * (*gro_receive)(struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sk_buff *, int); +}; + +struct udphdr { + __be16 source; + __be16 dest; + __be16 len; + __sum16 check; +}; + +struct net_offload { + struct offload_callbacks callbacks; + unsigned int flags; +}; + +struct frag_hdr { + __u8 nexthdr; + __u8 reserved; + __be16 frag_off; + __be32 identification; +}; + +typedef struct sock * (*udp_lookup_t)(const struct sk_buff *, __be16, __be16); + +struct napi_gro_cb { + void *frag0; + unsigned int frag0_len; + int data_offset; + u16 flush; + u16 flush_id; + u16 count; + u16 proto; + long unsigned int age; + union { + struct { + u16 gro_remcsum_start; + u8 same_flow: 1; + u8 encap_mark: 1; + u8 csum_valid: 1; + u8 csum_cnt: 3; + u8 free: 2; + u8 is_ipv6: 1; + u8 is_fou: 1; + u8 is_atomic: 1; + u8 recursion_counter: 4; + u8 is_flist: 1; + }; + struct { + u16 gro_remcsum_start; + u8 same_flow: 1; + u8 encap_mark: 1; + u8 csum_valid: 1; + u8 csum_cnt: 3; + u8 free: 2; + u8 is_ipv6: 1; + u8 is_fou: 1; + u8 is_atomic: 1; + u8 recursion_counter: 4; + u8 is_flist: 1; + } zeroed; + }; + __wsum csum; + struct sk_buff *last; +}; + +struct group_data { + int limit[21]; + int base[20]; + int permute[258]; + int minLen; + int maxLen; +}; + +struct bunzip_data { + int writeCopies; + int writePos; + int writeRunCountdown; + int writeCount; + int writeCurrent; + long int (*fill)(void *, long unsigned int); + long int inbufCount; + long int inbufPos; + unsigned char *inbuf; + unsigned int inbufBitCount; + unsigned int inbufBits; + unsigned int crc32Table[256]; + unsigned int headerCRC; + unsigned int totalCRC; + unsigned int writeCRC; + unsigned int *dbuf; + unsigned int dbufSize; + unsigned char selectors[32768]; + struct group_data groups[6]; + int io_error; + int byteCount[256]; + unsigned char symToByte[256]; + unsigned char mtfSymbol[256]; +}; + +struct klist_node; + +struct klist { + spinlock_t k_lock; + struct list_head k_list; + void (*get)(struct klist_node *); + void (*put)(struct klist_node *); +}; + +struct klist_node { + void *n_klist; + struct list_head n_node; + struct kref n_ref; +}; + +struct klist_iter { + struct klist *i_klist; + struct klist_node *i_cur; +}; + +struct klist_waiter { + struct list_head list; + struct klist_node *node; + struct task_struct *process; + int woken; +}; + +struct minix_super_block { + __u16 s_ninodes; + __u16 s_nzones; + __u16 s_imap_blocks; + __u16 s_zmap_blocks; + __u16 s_firstdatazone; + __u16 s_log_zone_size; + __u32 s_max_size; + __u16 s_magic; + __u16 s_state; + __u32 s_zones; +}; + +struct romfs_super_block { + __be32 word0; + __be32 word1; + __be32 size; + __be32 checksum; + char name[0]; +}; + +struct cramfs_inode { + __u32 mode: 16; + __u32 uid: 16; + __u32 size: 24; + __u32 gid: 8; + __u32 namelen: 6; + __u32 offset: 26; +}; + +struct cramfs_info { + __u32 crc; + __u32 edition; + __u32 blocks; + __u32 files; +}; + +struct cramfs_super { + __u32 magic; + __u32 size; + __u32 flags; + __u32 future; + __u8 signature[16]; + struct cramfs_info fsid; + __u8 name[16]; + struct cramfs_inode root; +}; + +struct squashfs_super_block { + __le32 s_magic; + __le32 inodes; + __le32 mkfs_time; + __le32 block_size; + __le32 fragments; + __le16 compression; + __le16 block_log; + __le16 flags; + __le16 no_ids; + __le16 s_major; + __le16 s_minor; + __le64 root_inode; + __le64 bytes_used; + __le64 id_table_start; + __le64 xattr_id_table_start; + __le64 inode_table_start; + __le64 directory_table_start; + __le64 fragment_table_start; + __le64 lookup_table_start; +}; + +typedef int (*decompress_fn)(unsigned char *, long int, long int (*)(void *, long unsigned int), long int (*)(void *, long unsigned int), unsigned char *, long int *, void (*)(char *)); + +typedef int suspend_state_t; + +enum suspend_stat_step { + SUSPEND_FREEZE = 1, + SUSPEND_PREPARE = 2, + SUSPEND_SUSPEND = 3, + SUSPEND_SUSPEND_LATE = 4, + SUSPEND_SUSPEND_NOIRQ = 5, + SUSPEND_RESUME_NOIRQ = 6, + SUSPEND_RESUME_EARLY = 7, + SUSPEND_RESUME = 8, +}; + +struct suspend_stats { + int success; + int fail; + int failed_freeze; + int failed_prepare; + int failed_suspend; + int failed_suspend_late; + int failed_suspend_noirq; + int failed_resume; + int failed_resume_early; + int failed_resume_noirq; + int last_failed_dev; + char failed_devs[80]; + int last_failed_errno; + int errno[2]; + int last_failed_step; + enum suspend_stat_step failed_steps[2]; +}; + +struct cgroupstats { + __u64 nr_sleeping; + __u64 nr_running; + __u64 nr_stopped; + __u64 nr_uninterruptible; + __u64 nr_io_wait; +}; + +struct kernfs_syscall_ops { + int (*show_options)(struct seq_file *, struct kernfs_root *); + int (*mkdir)(struct kernfs_node *, const char *, umode_t); + int (*rmdir)(struct kernfs_node *); + int (*rename)(struct kernfs_node *, struct kernfs_node *, const char *); + int (*show_path)(struct seq_file *, struct kernfs_node *, struct kernfs_root *); +}; + +struct kernfs_fs_context { + struct kernfs_root *root; + void *ns_tag; + long unsigned int magic; + bool new_sb_created; +}; + +enum { + CGRP_NOTIFY_ON_RELEASE = 0, + CGRP_CPUSET_CLONE_CHILDREN = 1, + CGRP_FREEZE = 2, + CGRP_FROZEN = 3, + CGRP_KILL = 4, +}; + +struct cgroup_taskset { + struct list_head src_csets; + struct list_head dst_csets; + int nr_tasks; + int ssid; + struct list_head *csets; + struct css_set *cur_cset; + struct task_struct *cur_task; +}; + +struct cgroup_fs_context { + struct kernfs_fs_context kfc; + struct cgroup_root *root; + struct cgroup_namespace *ns; + unsigned int flags; + bool cpuset_clone_children; + bool none; + bool all_ss; + u16 subsys_mask; + char *name; + char *release_agent; +}; + +enum cgroup_filetype { + CGROUP_FILE_PROCS = 0, + CGROUP_FILE_TASKS = 1, +}; + +struct cgroup_pidlist { + struct { + enum cgroup_filetype type; + struct pid_namespace *ns; + } key; + pid_t *list; + int length; + struct list_head links; + struct cgroup *owner; + struct delayed_work destroy_dwork; +}; + +struct cgroup_file_ctx { + struct cgroup_namespace *ns; + struct { + void *trigger; + } psi; + struct { + bool started; + struct css_task_iter iter; + } procs; + struct { + struct cgroup_pidlist *pidlist; + } procs1; +}; + +struct cgrp_cset_link { + struct cgroup *cgrp; + struct css_set *cset; + struct list_head cset_link; + struct list_head cgrp_link; +}; + +struct cgroup_mgctx { + struct list_head preloaded_src_csets; + struct list_head preloaded_dst_csets; + struct cgroup_taskset tset; + u16 ss_mask; +}; + +enum cgroup1_param { + Opt_all = 0, + Opt_clone_children = 1, + Opt_cpuset_v2_mode = 2, + Opt_name = 3, + Opt_none = 4, + Opt_noprefix = 5, + Opt_release_agent = 6, + Opt_xattr = 7, + Opt_favordynmods = 8, + Opt_nofavordynmods = 9, +}; + +enum lockdep_ok { + LOCKDEP_STILL_OK = 0, + LOCKDEP_NOW_UNRELIABLE = 1, +}; + +struct va_format { + const char *fmt; + va_list *va; +}; + +struct sysinfo { + __kernel_long_t uptime; + __kernel_ulong_t loads[3]; + __kernel_ulong_t totalram; + __kernel_ulong_t freeram; + __kernel_ulong_t sharedram; + __kernel_ulong_t bufferram; + __kernel_ulong_t totalswap; + __kernel_ulong_t freeswap; + __u16 procs; + __u16 pad; + __kernel_ulong_t totalhigh; + __kernel_ulong_t freehigh; + __u32 mem_unit; + char _f[0]; +}; + +enum pageblock_bits { + PB_migrate = 0, + PB_migrate_end = 2, + PB_migrate_skip = 3, + NR_PAGEBLOCK_BITS = 4, +}; + +struct page_frag_cache { + void *va; + __u16 offset; + __u16 size; + unsigned int pagecnt_bias; + bool pfmemalloc; +}; + +enum zone_flags { + ZONE_BOOSTED_WATERMARK = 0, + ZONE_RECLAIM_ACTIVE = 1, +}; + +enum meminit_context { + MEMINIT_EARLY = 0, + MEMINIT_HOTPLUG = 1, +}; + +enum migrate_reason { + MR_COMPACTION = 0, + MR_MEMORY_FAILURE = 1, + MR_MEMORY_HOTPLUG = 2, + MR_SYSCALL = 3, + MR_MEMPOLICY_MBIND = 4, + MR_NUMA_MISPLACED = 5, + MR_CONTIG_RANGE = 6, + MR_LONGTERM_PIN = 7, + MR_DEMOTION = 8, + MR_TYPES = 9, +}; + +typedef void compound_page_dtor(struct page *); + +enum memblock_flags { + MEMBLOCK_NONE = 0, + MEMBLOCK_HOTPLUG = 1, + MEMBLOCK_MIRROR = 2, + MEMBLOCK_NOMAP = 4, + MEMBLOCK_DRIVER_MANAGED = 8, +}; + +struct memblock_region { + phys_addr_t base; + phys_addr_t size; + enum memblock_flags flags; + int nid; +}; + +struct memblock_type { + long unsigned int cnt; + long unsigned int max; + phys_addr_t total_size; + struct memblock_region *regions; + char *name; +}; + +struct memblock { + bool bottom_up; + phys_addr_t current_limit; + struct memblock_type memory; + struct memblock_type reserved; +}; + +enum compact_priority { + COMPACT_PRIO_SYNC_FULL = 0, + MIN_COMPACT_PRIORITY = 0, + COMPACT_PRIO_SYNC_LIGHT = 1, + MIN_COMPACT_COSTLY_PRIORITY = 1, + DEF_COMPACT_PRIORITY = 1, + COMPACT_PRIO_ASYNC = 2, + INIT_COMPACT_PRIORITY = 2, +}; + +enum compact_result { + COMPACT_NOT_SUITABLE_ZONE = 0, + COMPACT_SKIPPED = 1, + COMPACT_DEFERRED = 2, + COMPACT_NO_SUITABLE_PAGE = 3, + COMPACT_CONTINUE = 4, + COMPACT_COMPLETE = 5, + COMPACT_PARTIAL_SKIPPED = 6, + COMPACT_CONTENDED = 7, + COMPACT_SUCCESS = 8, +}; + +typedef struct page *new_page_t(struct page *, long unsigned int); + +typedef void free_page_t(struct page *, long unsigned int); + +struct alloc_context { + struct zonelist *zonelist; + nodemask_t *nodemask; + struct zoneref *preferred_zoneref; + int migratetype; + enum zone_type highest_zoneidx; + bool spread_dirty_pages; +}; + +enum mminit_level { + MMINIT_WARNING = 0, + MMINIT_VERIFY = 1, + MMINIT_TRACE = 2, +}; + +struct migration_target_control { + int nid; + nodemask_t *nmask; + gfp_t gfp_mask; +}; + +typedef int fpi_t; + +struct mminit_pfnnid_cache { + long unsigned int last_start; + long unsigned int last_end; + int last_nid; +}; + +typedef unsigned char u_char; + +typedef short unsigned int u_short; + +struct fb_fix_screeninfo { + char id[16]; + long unsigned int smem_start; + __u32 smem_len; + __u32 type; + __u32 type_aux; + __u32 visual; + __u16 xpanstep; + __u16 ypanstep; + __u16 ywrapstep; + __u32 line_length; + long unsigned int mmio_start; + __u32 mmio_len; + __u32 accel; + __u16 capabilities; + __u16 reserved[2]; +}; + +struct fb_bitfield { + __u32 offset; + __u32 length; + __u32 msb_right; +}; + +struct fb_var_screeninfo { + __u32 xres; + __u32 yres; + __u32 xres_virtual; + __u32 yres_virtual; + __u32 xoffset; + __u32 yoffset; + __u32 bits_per_pixel; + __u32 grayscale; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + __u32 nonstd; + __u32 activate; + __u32 height; + __u32 width; + __u32 accel_flags; + __u32 pixclock; + __u32 left_margin; + __u32 right_margin; + __u32 upper_margin; + __u32 lower_margin; + __u32 hsync_len; + __u32 vsync_len; + __u32 sync; + __u32 vmode; + __u32 rotate; + __u32 colorspace; + __u32 reserved[4]; +}; + +struct fb_cmap { + __u32 start; + __u32 len; + __u16 *red; + __u16 *green; + __u16 *blue; + __u16 *transp; +}; + +struct fb_copyarea { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 sx; + __u32 sy; +}; + +struct fb_fillrect { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 color; + __u32 rop; +}; + +struct fb_image { + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; + __u32 fg_color; + __u32 bg_color; + __u8 depth; + const char *data; + struct fb_cmap cmap; +}; + +struct fbcurpos { + __u16 x; + __u16 y; +}; + +struct fb_cursor { + __u16 set; + __u16 enable; + __u16 rop; + const char *mask; + struct fbcurpos hot; + struct fb_image image; +}; + +struct fb_chroma { + __u32 redx; + __u32 greenx; + __u32 bluex; + __u32 whitex; + __u32 redy; + __u32 greeny; + __u32 bluey; + __u32 whitey; +}; + +struct fb_videomode; + +struct fb_monspecs { + struct fb_chroma chroma; + struct fb_videomode *modedb; + __u8 manufacturer[4]; + __u8 monitor[14]; + __u8 serial_no[14]; + __u8 ascii[14]; + __u32 modedb_len; + __u32 model; + __u32 serial; + __u32 year; + __u32 week; + __u32 hfmin; + __u32 hfmax; + __u32 dclkmin; + __u32 dclkmax; + __u16 input; + __u16 dpms; + __u16 signal; + __u16 vfmin; + __u16 vfmax; + __u16 gamma; + __u16 gtf: 1; + __u16 misc; + __u8 version; + __u8 revision; + __u8 max_x; + __u8 max_y; +}; + +struct fb_info; + +struct fb_pixmap { + u8 *addr; + u32 size; + u32 offset; + u32 buf_align; + u32 scan_align; + u32 access_align; + u32 flags; + u32 blit_x; + u32 blit_y; + void (*writeio)(struct fb_info *, void *, void *, unsigned int); + void (*readio)(struct fb_info *, void *, void *, unsigned int); +}; + +struct fb_ops; + +struct fb_tile_ops; + +struct apertures_struct; + +struct fb_info { + refcount_t count; + int node; + int flags; + int fbcon_rotate_hint; + struct mutex lock; + struct mutex mm_lock; + struct fb_var_screeninfo var; + struct fb_fix_screeninfo fix; + struct fb_monspecs monspecs; + struct fb_pixmap pixmap; + struct fb_pixmap sprite; + struct fb_cmap cmap; + struct list_head modelist; + struct fb_videomode *mode; + const struct fb_ops *fbops; + struct device *device; + struct device *dev; + int class_flag; + struct fb_tile_ops *tileops; + union { + char *screen_base; + char *screen_buffer; + }; + long unsigned int screen_size; + void *pseudo_palette; + u32 state; + void *fbcon_par; + void *par; + struct apertures_struct *apertures; + bool skip_vt_switch; +}; + +struct fb_videomode { + const char *name; + u32 refresh; + u32 xres; + u32 yres; + u32 pixclock; + u32 left_margin; + u32 right_margin; + u32 upper_margin; + u32 lower_margin; + u32 hsync_len; + u32 vsync_len; + u32 sync; + u32 vmode; + u32 flag; +}; + +struct fb_blit_caps { + u32 x; + u32 y; + u32 len; + u32 flags; +}; + +struct fb_ops { + struct module *owner; + int (*fb_open)(struct fb_info *, int); + int (*fb_release)(struct fb_info *, int); + ssize_t (*fb_read)(struct fb_info *, char *, size_t, loff_t *); + ssize_t (*fb_write)(struct fb_info *, const char *, size_t, loff_t *); + int (*fb_check_var)(struct fb_var_screeninfo *, struct fb_info *); + int (*fb_set_par)(struct fb_info *); + int (*fb_setcolreg)(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, struct fb_info *); + int (*fb_setcmap)(struct fb_cmap *, struct fb_info *); + int (*fb_blank)(int, struct fb_info *); + int (*fb_pan_display)(struct fb_var_screeninfo *, struct fb_info *); + void (*fb_fillrect)(struct fb_info *, const struct fb_fillrect *); + void (*fb_copyarea)(struct fb_info *, const struct fb_copyarea *); + void (*fb_imageblit)(struct fb_info *, const struct fb_image *); + int (*fb_cursor)(struct fb_info *, struct fb_cursor *); + int (*fb_sync)(struct fb_info *); + int (*fb_ioctl)(struct fb_info *, unsigned int, long unsigned int); + int (*fb_compat_ioctl)(struct fb_info *, unsigned int, long unsigned int); + int (*fb_mmap)(struct fb_info *, struct vm_area_struct *); + void (*fb_get_caps)(struct fb_info *, struct fb_blit_caps *, struct fb_var_screeninfo *); + void (*fb_destroy)(struct fb_info *); + int (*fb_debug_enter)(struct fb_info *); + int (*fb_debug_leave)(struct fb_info *); +}; + +struct fb_tilemap { + __u32 width; + __u32 height; + __u32 depth; + __u32 length; + const __u8 *data; +}; + +struct fb_tilerect { + __u32 sx; + __u32 sy; + __u32 width; + __u32 height; + __u32 index; + __u32 fg; + __u32 bg; + __u32 rop; +}; + +struct fb_tilearea { + __u32 sx; + __u32 sy; + __u32 dx; + __u32 dy; + __u32 width; + __u32 height; +}; + +struct fb_tileblit { + __u32 sx; + __u32 sy; + __u32 width; + __u32 height; + __u32 fg; + __u32 bg; + __u32 length; + __u32 *indices; +}; + +struct fb_tilecursor { + __u32 sx; + __u32 sy; + __u32 mode; + __u32 shape; + __u32 fg; + __u32 bg; +}; + +struct fb_tile_ops { + void (*fb_settile)(struct fb_info *, struct fb_tilemap *); + void (*fb_tilecopy)(struct fb_info *, struct fb_tilearea *); + void (*fb_tilefill)(struct fb_info *, struct fb_tilerect *); + void (*fb_tileblit)(struct fb_info *, struct fb_tileblit *); + void (*fb_tilecursor)(struct fb_info *, struct fb_tilecursor *); + int (*fb_get_tilemax)(struct fb_info *); +}; + +struct aperture { + resource_size_t base; + resource_size_t size; +}; + +struct apertures_struct { + unsigned int count; + struct aperture ranges[0]; +}; + +struct fbcon_display { + const u_char *fontdata; + int userfont; + u_short inverse; + short int yscroll; + int vrows; + int cursor_shape; + int con_rotate; + u32 xres_virtual; + u32 yres_virtual; + u32 height; + u32 width; + u32 bits_per_pixel; + u32 grayscale; + u32 nonstd; + u32 accel_flags; + u32 rotate; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + const struct fb_videomode *mode; +}; + +struct fbcon_ops { + void (*bmove)(struct vc_data *, struct fb_info *, int, int, int, int, int, int); + void (*clear)(struct vc_data *, struct fb_info *, int, int, int, int); + void (*putcs)(struct vc_data *, struct fb_info *, const short unsigned int *, int, int, int, int, int); + void (*clear_margins)(struct vc_data *, struct fb_info *, int, int); + void (*cursor)(struct vc_data *, struct fb_info *, int, int, int); + int (*update_start)(struct fb_info *); + int (*rotate_font)(struct fb_info *, struct vc_data *); + struct fb_var_screeninfo var; + struct delayed_work cursor_work; + struct fb_cursor cursor_state; + struct fbcon_display *p; + struct fb_info *info; + int currcon; + int cur_blink_jiffies; + int cursor_flash; + int cursor_reset; + int blank_state; + int graphics; + int save_graphics; + bool initialized; + int rotate; + int cur_rotate; + char *cursor_data; + u8 *fontbuffer; + u8 *fontdata; + u8 *cursor_src; + u32 cursor_size; + u32 fd_size; +}; + +struct acpi_name_info { + char name[4]; + u16 argument_list; + u8 expected_btypes; +} __attribute__((packed)); + +struct acpi_package_info { + u8 type; + u8 object_type1; + u8 count1; + u8 object_type2; + u8 count2; + u16 reserved; +} __attribute__((packed)); + +struct acpi_package_info2 { + u8 type; + u8 count; + u8 object_type[4]; + u8 reserved; +}; + +struct acpi_package_info3 { + u8 type; + u8 count; + u8 object_type[2]; + u8 tail_object_type; + u16 reserved; +} __attribute__((packed)); + +struct acpi_package_info4 { + u8 type; + u8 object_type1; + u8 count1; + u8 sub_object_types; + u8 pkg_count; + u16 reserved; +} __attribute__((packed)); + +union acpi_predefined_info { + struct acpi_name_info info; + struct acpi_package_info ret_info; + struct acpi_package_info2 ret_info2; + struct acpi_package_info3 ret_info3; + struct acpi_package_info4 ret_info4; +}; + +enum { + TTY_LOCK_NORMAL = 0, + TTY_LOCK_SLAVE = 1, +}; + +struct pts_fs_info; + +struct ipv4_devconf { + void *sysctl; + int data[33]; + long unsigned int state[1]; +}; + +struct in_ifaddr; + +struct ip_mc_list; + +struct in_device { + struct net_device *dev; + netdevice_tracker dev_tracker; + refcount_t refcnt; + int dead; + struct in_ifaddr *ifa_list; + struct ip_mc_list *mc_list; + struct ip_mc_list **mc_hash; + int mc_count; + spinlock_t mc_tomb_lock; + struct ip_mc_list *mc_tomb; + long unsigned int mr_v1_seen; + long unsigned int mr_v2_seen; + long unsigned int mr_maxdelay; + long unsigned int mr_qi; + long unsigned int mr_qri; + unsigned char mr_qrv; + unsigned char mr_gq_running; + u32 mr_ifc_count; + struct timer_list mr_gq_timer; + struct timer_list mr_ifc_timer; + struct neigh_parms *arp_parms; + struct ipv4_devconf cnf; + struct callback_head callback_head; +}; + +struct in_ifaddr { + struct hlist_node hash; + struct in_ifaddr *ifa_next; + struct in_device *ifa_dev; + struct callback_head callback_head; + __be32 ifa_local; + __be32 ifa_address; + __be32 ifa_mask; + __u32 ifa_rt_priority; + __be32 ifa_broadcast; + unsigned char ifa_scope; + unsigned char ifa_prefixlen; + unsigned char ifa_proto; + __u32 ifa_flags; + char ifa_label[16]; + __u32 ifa_valid_lft; + __u32 ifa_preferred_lft; + long unsigned int ifa_cstamp; + long unsigned int ifa_tstamp; +}; + +struct mac_addr { + u8 mac_addr_value[6]; +}; + +typedef enum { + AD_RX_DUMMY = 0, + AD_RX_INITIALIZE = 1, + AD_RX_PORT_DISABLED = 2, + AD_RX_LACP_DISABLED = 3, + AD_RX_EXPIRED = 4, + AD_RX_DEFAULTED = 5, + AD_RX_CURRENT = 6, +} rx_states_t; + +typedef enum { + AD_PERIODIC_DUMMY = 0, + AD_NO_PERIODIC = 1, + AD_FAST_PERIODIC = 2, + AD_SLOW_PERIODIC = 3, + AD_PERIODIC_TX = 4, +} periodic_states_t; + +typedef enum { + AD_MUX_DUMMY = 0, + AD_MUX_DETACHED = 1, + AD_MUX_WAITING = 2, + AD_MUX_ATTACHED = 3, + AD_MUX_COLLECTING_DISTRIBUTING = 4, +} mux_states_t; + +typedef enum { + AD_TX_DUMMY = 0, + AD_TRANSMIT = 1, +} tx_states_t; + +typedef enum { + AD_CHURN_MONITOR = 0, + AD_CHURN = 1, + AD_NO_CHURN = 2, +} churn_state_t; + +struct lacpdu { + u8 subtype; + u8 version_number; + u8 tlv_type_actor_info; + u8 actor_information_length; + __be16 actor_system_priority; + struct mac_addr actor_system; + __be16 actor_key; + __be16 actor_port_priority; + __be16 actor_port; + u8 actor_state; + u8 reserved_3_1[3]; + u8 tlv_type_partner_info; + u8 partner_information_length; + __be16 partner_system_priority; + struct mac_addr partner_system; + __be16 partner_key; + __be16 partner_port_priority; + __be16 partner_port; + u8 partner_state; + u8 reserved_3_2[3]; + u8 tlv_type_collector_info; + u8 collector_information_length; + __be16 collector_max_delay; + u8 reserved_12[12]; + u8 tlv_type_terminator; + u8 terminator_length; + u8 reserved_50[50]; +}; + +struct bond_3ad_stats { + atomic64_t lacpdu_rx; + atomic64_t lacpdu_tx; + atomic64_t lacpdu_unknown_rx; + atomic64_t lacpdu_illegal_rx; + atomic64_t marker_rx; + atomic64_t marker_tx; + atomic64_t marker_resp_rx; + atomic64_t marker_resp_tx; + atomic64_t marker_unknown_rx; +}; + +struct port; + +struct slave; + +struct aggregator { + struct mac_addr aggregator_mac_address; + u16 aggregator_identifier; + bool is_individual; + u16 actor_admin_aggregator_key; + u16 actor_oper_aggregator_key; + struct mac_addr partner_system; + u16 partner_system_priority; + u16 partner_oper_aggregator_key; + u16 receive_state; + u16 transmit_state; + struct port *lag_ports; + struct slave *slave; + u16 is_active; + u16 num_of_ports; +}; + +struct port_params { + struct mac_addr system; + u16 system_priority; + u16 key; + u16 port_number; + u16 port_priority; + u16 port_state; +}; + +struct port { + u16 actor_port_number; + u16 actor_port_priority; + struct mac_addr actor_system; + u16 actor_system_priority; + u16 actor_port_aggregator_identifier; + bool ntt; + u16 actor_admin_port_key; + u16 actor_oper_port_key; + u8 actor_admin_port_state; + u8 actor_oper_port_state; + struct port_params partner_admin; + struct port_params partner_oper; + bool is_enabled; + u16 sm_vars; + rx_states_t sm_rx_state; + u16 sm_rx_timer_counter; + periodic_states_t sm_periodic_state; + u16 sm_periodic_timer_counter; + mux_states_t sm_mux_state; + u16 sm_mux_timer_counter; + tx_states_t sm_tx_state; + u16 sm_tx_timer_counter; + u16 sm_churn_actor_timer_counter; + u16 sm_churn_partner_timer_counter; + u32 churn_actor_count; + u32 churn_partner_count; + churn_state_t sm_churn_actor_state; + churn_state_t sm_churn_partner_state; + struct slave *slave; + struct aggregator *aggregator; + struct port *next_port_in_aggregator; + u32 transaction_id; + struct lacpdu lacpdu; +}; + +struct tlb_slave_info { + u32 head; + u32 load; +}; + +struct bonding; + +struct ad_slave_info; + +struct slave { + struct net_device *dev; + struct bonding *bond; + int delay; + long unsigned int last_link_up; + long unsigned int last_tx; + long unsigned int last_rx; + long unsigned int target_last_arp_rx[16]; + s8 link; + s8 link_new_state; + u8 backup: 1; + u8 inactive: 1; + u8 should_notify: 1; + u8 should_notify_link: 1; + u8 duplex; + u32 original_mtu; + u32 link_failure_count; + u32 speed; + u16 queue_id; + u8 perm_hwaddr[32]; + int prio; + struct ad_slave_info *ad_info; + struct tlb_slave_info tlb_info; + struct delayed_work notify_work; + struct kobject kobj; + struct rtnl_link_stats64 slave_stats; +}; + +struct ad_system { + u16 sys_priority; + struct mac_addr sys_mac_addr; +}; + +struct ad_bond_info { + struct ad_system system; + struct bond_3ad_stats stats; + atomic_t agg_select_timer; + u16 aggregator_identifier; +}; + +struct ad_slave_info { + struct aggregator aggregator; + struct port port; + struct bond_3ad_stats stats; + u16 id; +}; + +struct tlb_client_info { + struct slave *tx_slave; + u32 tx_bytes; + u32 load_history; + u32 next; + u32 prev; +}; + +struct rlb_client_info { + __be32 ip_src; + __be32 ip_dst; + u8 mac_src[6]; + u8 mac_dst[6]; + u32 used_next; + u32 used_prev; + u32 src_next; + u32 src_prev; + u32 src_first; + u8 assigned; + u8 ntt; + struct slave *slave; + short unsigned int vlan_id; +}; + +struct alb_bond_info { + struct tlb_client_info *tx_hashtbl; + u32 unbalanced_load; + atomic_t tx_rebalance_counter; + int lp_counter; + int rlb_enabled; + struct rlb_client_info *rx_hashtbl; + u32 rx_hashtbl_used_head; + u8 rx_ntt; + struct slave *rx_slave; + u8 primary_is_promisc; + u32 rlb_promisc_timeout_counter; + u32 rlb_update_delay_counter; + u32 rlb_update_retry_counter; + u8 rlb_rebalance; +}; + +struct bond_params { + int mode; + int xmit_policy; + int miimon; + u8 num_peer_notif; + u8 missed_max; + int arp_interval; + int arp_validate; + int arp_all_targets; + int use_carrier; + int fail_over_mac; + int updelay; + int downdelay; + int peer_notif_delay; + int lacp_active; + int lacp_fast; + unsigned int min_links; + int ad_select; + char primary[16]; + int primary_reselect; + __be32 arp_targets[16]; + int tx_queues; + int all_slaves_active; + int resend_igmp; + int lp_interval; + int packets_per_slave; + int tlb_dynamic_lb; + struct reciprocal_value reciprocal_packets_per_slave; + u16 ad_actor_sys_prio; + u16 ad_user_port_key; + struct in6_addr ns_targets[16]; + u8 ad_actor_system[8]; +}; + +struct bond_up_slave; + +struct bonding { + struct net_device *dev; + struct slave *curr_active_slave; + struct slave *current_arp_slave; + struct slave *primary_slave; + struct bond_up_slave *usable_slaves; + struct bond_up_slave *all_slaves; + bool force_primary; + s32 slave_cnt; + int (*recv_probe)(const struct sk_buff *, struct bonding *, struct slave *); + spinlock_t mode_lock; + spinlock_t stats_lock; + u8 send_peer_notif; + u8 igmp_retrans; + struct proc_dir_entry *proc_entry; + char proc_file_name[16]; + struct list_head bond_list; + u32 *rr_tx_counter; + struct ad_bond_info ad_info; + struct alb_bond_info alb_info; + struct bond_params params; + struct workqueue_struct *wq; + struct delayed_work mii_work; + struct delayed_work arp_work; + struct delayed_work alb_work; + struct delayed_work ad_work; + struct delayed_work mcast_work; + struct delayed_work slave_arr_work; + struct dentry *debug_dir; + struct rtnl_link_stats64 bond_stats; + struct bpf_prog *xdp_prog; +}; + +struct bond_up_slave { + unsigned int count; + struct callback_head rcu; + struct slave *arr[0]; +}; + +struct slave_attribute { + struct attribute attr; + ssize_t (*show)(struct slave *, char *); +}; + +struct tcf_ematch_tree_hdr { + __u16 nmatches; + __u16 progid; +}; + +enum { + TCA_EMATCH_TREE_UNSPEC = 0, + TCA_EMATCH_TREE_HDR = 1, + TCA_EMATCH_TREE_LIST = 2, + __TCA_EMATCH_TREE_MAX = 3, +}; + +struct tcf_ematch_hdr { + __u16 matchid; + __u16 kind; + __u16 flags; + __u16 pad; +}; + +struct tcf_pkt_info { + unsigned char *ptr; + int nexthdr; +}; + +struct tcf_ematch_ops; + +struct tcf_ematch { + struct tcf_ematch_ops *ops; + long unsigned int data; + unsigned int datalen; + u16 matchid; + u16 flags; + struct net *net; +}; + +struct tcf_ematch_ops { + int kind; + int datalen; + int (*change)(struct net *, void *, int, struct tcf_ematch *); + int (*match)(struct sk_buff *, struct tcf_ematch *, struct tcf_pkt_info *); + void (*destroy)(struct tcf_ematch *); + int (*dump)(struct sk_buff *, struct tcf_ematch *); + struct module *owner; + struct list_head link; +}; + +struct tcf_ematch_tree { + struct tcf_ematch_tree_hdr hdr; + struct tcf_ematch *matches; +}; + +struct xt_action_param; + +struct xt_mtchk_param; + +struct xt_mtdtor_param; + +struct xt_match { + struct list_head list; + const char name[29]; + u_int8_t revision; + bool (*match)(const struct sk_buff *, struct xt_action_param *); + int (*checkentry)(const struct xt_mtchk_param *); + void (*destroy)(const struct xt_mtdtor_param *); + struct module *me; + const char *table; + unsigned int matchsize; + unsigned int usersize; + unsigned int hooks; + short unsigned int proto; + short unsigned int family; +}; + +struct xt_tgchk_param; + +struct xt_tgdtor_param; + +struct xt_target { + struct list_head list; + const char name[29]; + u_int8_t revision; + unsigned int (*target)(struct sk_buff *, const struct xt_action_param *); + int (*checkentry)(const struct xt_tgchk_param *); + void (*destroy)(const struct xt_tgdtor_param *); + struct module *me; + const char *table; + unsigned int targetsize; + unsigned int usersize; + unsigned int hooks; + short unsigned int proto; + short unsigned int family; +}; + +struct xt_action_param { + union { + const struct xt_match *match; + const struct xt_target *target; + }; + union { + const void *matchinfo; + const void *targinfo; + }; + const struct nf_hook_state *state; + unsigned int thoff; + u16 fragoff; + bool hotdrop; +}; + +struct xt_mtchk_param { + struct net *net; + const char *table; + const void *entryinfo; + const struct xt_match *match; + void *matchinfo; + unsigned int hook_mask; + u_int8_t family; + bool nft_compat; +}; + +struct xt_mtdtor_param { + struct net *net; + const struct xt_match *match; + void *matchinfo; + u_int8_t family; +}; + +struct xt_tgchk_param { + struct net *net; + const char *table; + const void *entryinfo; + const struct xt_target *target; + void *targinfo; + unsigned int hook_mask; + u_int8_t family; + bool nft_compat; +}; + +struct xt_tgdtor_param { + struct net *net; + const struct xt_target *target; + void *targinfo; + u_int8_t family; +}; + +struct xt_state_info { + unsigned int statemask; +}; + +struct subprocess_info { + struct work_struct work; + struct completion *complete; + const char *path; + char **argv; + char **envp; + int wait; + int retval; + int (*init)(struct subprocess_info *, struct cred *); + void (*cleanup)(struct subprocess_info *); + void *data; +}; + +struct cma { + long unsigned int base_pfn; + long unsigned int count; + long unsigned int *bitmap; + unsigned int order_per_bit; + spinlock_t lock; + char name[64]; + bool reserve_pages_on_error; +}; + +struct io_tlb_area; + +struct io_tlb_slot; + +struct io_tlb_mem { + phys_addr_t start; + phys_addr_t end; + void *vaddr; + long unsigned int nslabs; + long unsigned int used; + struct dentry *debugfs; + bool late_alloc; + bool force_bounce; + bool for_alloc; + unsigned int nareas; + unsigned int area_nslabs; + struct io_tlb_area *areas; + struct io_tlb_slot *slots; +}; + +struct sg_table { + struct scatterlist *sgl; + unsigned int nents; + unsigned int orig_nents; +}; + +struct gen_pool; + +typedef long unsigned int (*genpool_algo_t)(long unsigned int *, long unsigned int, long unsigned int, unsigned int, void *, struct gen_pool *, long unsigned int); + +struct gen_pool { + spinlock_t lock; + struct list_head chunks; + int min_alloc_order; + genpool_algo_t algo; + void *data; + const char *name; +}; + +typedef u64 pudval_t; + +typedef struct { + long unsigned int pd; +} hugepd_t; + +struct hugepage_subpool { + spinlock_t lock; + long int count; + long int max_hpages; + long int used_hpages; + struct hstate *hstate; + long int min_hpages; + long int rsv_hpages; +}; + +struct hugetlbfs_sb_info { + long int max_inodes; + long int free_inodes; + spinlock_t stat_lock; + struct hstate *hstate; + struct hugepage_subpool *spool; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +typedef struct { + int val[2]; +} __kernel_fsid_t; + +typedef struct fsnotify_mark_connector *fsnotify_connp_t; + +struct fsnotify_mark_connector { + spinlock_t lock; + short unsigned int type; + short unsigned int flags; + __kernel_fsid_t fsid; + union { + fsnotify_connp_t *obj; + struct fsnotify_mark_connector *destroy_next; + }; + struct hlist_head list; +}; + +struct core_vma_metadata; + +struct coredump_params { + const kernel_siginfo_t *siginfo; + struct file *file; + long unsigned int limit; + long unsigned int mm_flags; + int cpu; + loff_t written; + loff_t pos; + loff_t to_skip; + int vma_count; + size_t vma_data_size; + struct core_vma_metadata *vma_meta; +}; + +struct core_vma_metadata { + long unsigned int start; + long unsigned int end; + long unsigned int flags; + long unsigned int dump_size; + long unsigned int pgoff; + struct file *file; +}; + +enum audit_ntp_type { + AUDIT_NTP_OFFSET = 0, + AUDIT_NTP_FREQ = 1, + AUDIT_NTP_STATUS = 2, + AUDIT_NTP_TAI = 3, + AUDIT_NTP_TICK = 4, + AUDIT_NTP_ADJUST = 5, + AUDIT_NTP_NVALS = 6, +}; + +enum fsnotify_iter_type { + FSNOTIFY_ITER_TYPE_INODE = 0, + FSNOTIFY_ITER_TYPE_VFSMOUNT = 1, + FSNOTIFY_ITER_TYPE_SB = 2, + FSNOTIFY_ITER_TYPE_PARENT = 3, + FSNOTIFY_ITER_TYPE_INODE2 = 4, + FSNOTIFY_ITER_TYPE_COUNT = 5, +}; + +struct core_name { + char *corename; + int used; + int size; +}; + +struct chksum_ctx { + u32 key; +}; + +struct chksum_desc_ctx { + u32 crc; +}; + +enum rq_qos_id { + RQ_QOS_WBT = 0, + RQ_QOS_LATENCY = 1, + RQ_QOS_COST = 2, +}; + +struct rq_qos_ops; + +struct rq_qos { + struct rq_qos_ops *ops; + struct request_queue *q; + enum rq_qos_id id; + struct rq_qos *next; + struct dentry *debugfs_dir; +}; + +struct blk_mq_debugfs_attr { + const char *name; + umode_t mode; + int (*show)(void *, struct seq_file *); + ssize_t (*write)(void *, const char *, size_t, loff_t *); + const struct seq_operations *seq_ops; +}; + +struct rq_wait { + wait_queue_head_t wait; + atomic_t inflight; +}; + +struct rq_qos_ops { + void (*throttle)(struct rq_qos *, struct bio *); + void (*track)(struct rq_qos *, struct request *, struct bio *); + void (*merge)(struct rq_qos *, struct request *, struct bio *); + void (*issue)(struct rq_qos *, struct request *); + void (*requeue)(struct rq_qos *, struct request *); + void (*done)(struct rq_qos *, struct request *); + void (*done_bio)(struct rq_qos *, struct bio *); + void (*cleanup)(struct rq_qos *, struct bio *); + void (*queue_depth_changed)(struct rq_qos *); + void (*exit)(struct rq_qos *); + const struct blk_mq_debugfs_attr *debugfs_attrs; +}; + +struct rq_depth { + unsigned int max_depth; + int scale_step; + bool scaled_max; + unsigned int queue_depth; + unsigned int default_depth; +}; + +typedef bool acquire_inflight_cb_t(struct rq_wait *, void *); + +typedef void cleanup_cb_t(struct rq_wait *, void *); + +struct rq_qos_wait_data { + struct wait_queue_entry wq; + struct task_struct *task; + struct rq_wait *rqw; + acquire_inflight_cb_t *cb; + void *private_data; + bool got_token; +}; + +struct rhash_lock_head; + +struct bucket_table { + unsigned int size; + unsigned int nest; + u32 hash_rnd; + struct list_head walkers; + struct callback_head rcu; + struct bucket_table *future_tbl; + struct lockdep_map dep_map; + long: 64; + long: 64; + long: 64; + long: 64; + struct rhash_lock_head *buckets[0]; +}; + +struct rhltable { + struct rhashtable ht; +}; + +struct rhashtable_walker { + struct list_head list; + struct bucket_table *tbl; +}; + +struct rhashtable_iter { + struct rhashtable *ht; + struct rhash_head *p; + struct rhlist_head *list; + struct rhashtable_walker walker; + unsigned int slot; + unsigned int skip; + bool end_of_table; +}; + +struct rhash_lock_head {}; + +union nested_table { + union nested_table *table; + struct rhash_lock_head *bucket; +}; + +struct pci_sriov { + int pos; + int nres; + u32 cap; + u16 ctrl; + u16 total_VFs; + u16 initial_VFs; + u16 num_VFs; + u16 offset; + u16 stride; + u16 vf_device; + u32 pgsz; + u8 link; + u8 max_VF_buses; + u16 driver_max_VFs; + struct pci_dev *dev; + struct pci_dev *self; + u32 class; + u8 hdr_type; + u16 subsystem_vendor; + u16 subsystem_device; + resource_size_t barsz[6]; + bool drivers_autoprobe; +}; + +struct rcec_ea { + u8 nextbusn; + u8 lastbusn; + u32 bitmap; +}; + +struct pci_host_bridge { + struct device dev; + struct pci_bus *bus; + struct pci_ops *ops; + struct pci_ops *child_ops; + void *sysdata; + int busnr; + int domain_nr; + struct list_head windows; + struct list_head dma_ranges; + u8 (*swizzle_irq)(struct pci_dev *, u8 *); + int (*map_irq)(const struct pci_dev *, u8, u8); + void (*release_fn)(struct pci_host_bridge *); + void *release_data; + unsigned int ignore_reset_delay: 1; + unsigned int no_ext_tags: 1; + unsigned int native_aer: 1; + unsigned int native_pcie_hotplug: 1; + unsigned int native_shpc_hotplug: 1; + unsigned int native_pme: 1; + unsigned int native_ltr: 1; + unsigned int native_dpc: 1; + unsigned int preserve_config: 1; + unsigned int size_windows: 1; + unsigned int msi_domain: 1; + resource_size_t (*align_resource)(struct pci_dev *, const struct resource *, resource_size_t, resource_size_t, resource_size_t); + long: 64; + long: 64; + long: 64; + long unsigned int private[0]; +}; + +enum acpi_bus_device_type { + ACPI_BUS_TYPE_DEVICE = 0, + ACPI_BUS_TYPE_POWER = 1, + ACPI_BUS_TYPE_PROCESSOR = 2, + ACPI_BUS_TYPE_THERMAL = 3, + ACPI_BUS_TYPE_POWER_BUTTON = 4, + ACPI_BUS_TYPE_SLEEP_BUTTON = 5, + ACPI_BUS_TYPE_ECDT_EC = 6, + ACPI_BUS_DEVICE_TYPE_COUNT = 7, +}; + +struct acpi_power_dependent_device { + struct device *dev; + struct list_head node; +}; + +struct acpi_power_resource { + struct acpi_device device; + struct list_head list_node; + u32 system_level; + u32 order; + unsigned int ref_count; + u8 state; + struct mutex resource_lock; + struct list_head dependents; +}; + +struct acpi_power_resource_entry { + struct list_head node; + struct acpi_power_resource *resource; +}; + +struct acpi_generic_address { + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_width; + u64 address; +} __attribute__((packed)); + +struct acpi_table_spcr { + struct acpi_table_header header; + u8 interface_type; + u8 reserved[3]; + struct acpi_generic_address serial_port; + u8 interrupt_type; + u8 pc_interrupt; + u32 interrupt; + u8 baud_rate; + u8 parity; + u8 stop_bits; + u8 flow_control; + u8 terminal_type; + u8 reserved1; + u16 pci_device_id; + u16 pci_vendor_id; + u8 pci_bus; + u8 pci_device; + u8 pci_function; + u32 pci_flags; + u8 pci_segment; + u32 reserved2; +} __attribute__((packed)); + +struct serio_device_id { + __u8 type; + __u8 extra; + __u8 id; + __u8 proto; +}; + +struct serio_driver; + +struct serio { + void *port_data; + char name[32]; + char phys[32]; + char firmware_id[128]; + bool manual_bind; + struct serio_device_id id; + spinlock_t lock; + int (*write)(struct serio *, unsigned char); + int (*open)(struct serio *); + void (*close)(struct serio *); + int (*start)(struct serio *); + void (*stop)(struct serio *); + struct serio *parent; + struct list_head child_node; + struct list_head children; + unsigned int depth; + struct serio_driver *drv; + struct mutex drv_mutex; + struct device dev; + struct list_head node; + struct mutex *ps2_cmd_mutex; +}; + +struct serio_driver { + const char *description; + const struct serio_device_id *id_table; + bool manual_bind; + void (*write_wakeup)(struct serio *); + irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int); + int (*connect)(struct serio *, struct serio_driver *); + int (*reconnect)(struct serio *); + int (*fast_reconnect)(struct serio *); + void (*disconnect)(struct serio *); + void (*cleanup)(struct serio *); + struct device_driver driver; +}; + +struct ps2dev { + struct serio *serio; + struct mutex cmd_mutex; + wait_queue_head_t wait; + long unsigned int flags; + u8 cmdbuf[8]; + u8 cmdcnt; + u8 nak; +}; + +enum psmouse_state { + PSMOUSE_IGNORE = 0, + PSMOUSE_INITIALIZING = 1, + PSMOUSE_RESYNCING = 2, + PSMOUSE_CMD_MODE = 3, + PSMOUSE_ACTIVATED = 4, +}; + +typedef enum { + PSMOUSE_BAD_DATA = 0, + PSMOUSE_GOOD_DATA = 1, + PSMOUSE_FULL_PACKET = 2, +} psmouse_ret_t; + +enum psmouse_scale { + PSMOUSE_SCALE11 = 0, + PSMOUSE_SCALE21 = 1, +}; + +enum psmouse_type { + PSMOUSE_NONE = 0, + PSMOUSE_PS2 = 1, + PSMOUSE_PS2PP = 2, + PSMOUSE_THINKPS = 3, + PSMOUSE_GENPS = 4, + PSMOUSE_IMPS = 5, + PSMOUSE_IMEX = 6, + PSMOUSE_SYNAPTICS = 7, + PSMOUSE_ALPS = 8, + PSMOUSE_LIFEBOOK = 9, + PSMOUSE_TRACKPOINT = 10, + PSMOUSE_TOUCHKIT_PS2 = 11, + PSMOUSE_CORTRON = 12, + PSMOUSE_HGPK = 13, + PSMOUSE_ELANTECH = 14, + PSMOUSE_FSP = 15, + PSMOUSE_SYNAPTICS_RELATIVE = 16, + PSMOUSE_CYPRESS = 17, + PSMOUSE_FOCALTECH = 18, + PSMOUSE_VMMOUSE = 19, + PSMOUSE_BYD = 20, + PSMOUSE_SYNAPTICS_SMBUS = 21, + PSMOUSE_ELANTECH_SMBUS = 22, + PSMOUSE_AUTO = 23, +}; + +struct psmouse; + +struct psmouse_protocol { + enum psmouse_type type; + bool maxproto; + bool ignore_parity; + bool try_passthru; + bool smbus_companion; + const char *name; + const char *alias; + int (*detect)(struct psmouse *, bool); + int (*init)(struct psmouse *); +}; + +struct psmouse { + void *private; + struct input_dev *dev; + struct ps2dev ps2dev; + struct delayed_work resync_work; + const char *vendor; + const char *name; + const struct psmouse_protocol *protocol; + unsigned char packet[8]; + unsigned char badbyte; + unsigned char pktcnt; + unsigned char pktsize; + unsigned char oob_data_type; + unsigned char extra_buttons; + bool acks_disable_command; + unsigned int model; + long unsigned int last; + long unsigned int out_of_sync_cnt; + long unsigned int num_resyncs; + enum psmouse_state state; + char devname[64]; + char phys[32]; + unsigned int rate; + unsigned int resolution; + unsigned int resetafter; + unsigned int resync_time; + bool smartscroll; + psmouse_ret_t (*protocol_handler)(struct psmouse *); + void (*set_rate)(struct psmouse *, unsigned int); + void (*set_resolution)(struct psmouse *, unsigned int); + void (*set_scale)(struct psmouse *, enum psmouse_scale); + int (*reconnect)(struct psmouse *); + int (*fast_reconnect)(struct psmouse *); + void (*disconnect)(struct psmouse *); + void (*cleanup)(struct psmouse *); + int (*poll)(struct psmouse *); + void (*pt_activate)(struct psmouse *); + void (*pt_deactivate)(struct psmouse *); +}; + +struct psmouse_attribute { + struct device_attribute dattr; + void *data; + ssize_t (*show)(struct psmouse *, void *, char *); + ssize_t (*set)(struct psmouse *, void *, const char *, size_t); + bool protect; +}; + +struct ps2pp_info { + u8 model; + u8 kind; + u16 features; +}; + +enum { + TCA_FQ_CODEL_UNSPEC = 0, + TCA_FQ_CODEL_TARGET = 1, + TCA_FQ_CODEL_LIMIT = 2, + TCA_FQ_CODEL_INTERVAL = 3, + TCA_FQ_CODEL_ECN = 4, + TCA_FQ_CODEL_FLOWS = 5, + TCA_FQ_CODEL_QUANTUM = 6, + TCA_FQ_CODEL_CE_THRESHOLD = 7, + TCA_FQ_CODEL_DROP_BATCH_SIZE = 8, + TCA_FQ_CODEL_MEMORY_LIMIT = 9, + TCA_FQ_CODEL_CE_THRESHOLD_SELECTOR = 10, + TCA_FQ_CODEL_CE_THRESHOLD_MASK = 11, + __TCA_FQ_CODEL_MAX = 12, +}; + +enum { + TCA_FQ_CODEL_XSTATS_QDISC = 0, + TCA_FQ_CODEL_XSTATS_CLASS = 1, +}; + +struct tc_fq_codel_qd_stats { + __u32 maxpacket; + __u32 drop_overlimit; + __u32 ecn_mark; + __u32 new_flow_count; + __u32 new_flows_len; + __u32 old_flows_len; + __u32 ce_mark; + __u32 memory_usage; + __u32 drop_overmemory; +}; + +struct tc_fq_codel_cl_stats { + __s32 deficit; + __u32 ldelay; + __u32 count; + __u32 lastcount; + __u32 dropping; + __s32 drop_next; +}; + +struct tc_fq_codel_xstats { + __u32 type; + union { + struct tc_fq_codel_qd_stats qdisc_stats; + struct tc_fq_codel_cl_stats class_stats; + }; +}; + +struct vlan_hdr { + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +enum net_xmit_qdisc_t { + __NET_XMIT_STOLEN = 65536, + __NET_XMIT_BYPASS = 131072, +}; + +typedef u32 codel_time_t; + +typedef s32 codel_tdiff_t; + +struct codel_params { + codel_time_t target; + codel_time_t ce_threshold; + codel_time_t interval; + u32 mtu; + bool ecn; + u8 ce_threshold_selector; + u8 ce_threshold_mask; +}; + +struct codel_vars { + u32 count; + u32 lastcount; + bool dropping; + u16 rec_inv_sqrt; + codel_time_t first_above_time; + codel_time_t drop_next; + codel_time_t ldelay; +}; + +struct codel_stats { + u32 maxpacket; + u32 drop_count; + u32 drop_len; + u32 ecn_mark; + u32 ce_mark; +}; + +typedef u32 (*codel_skb_len_t)(const struct sk_buff *); + +typedef codel_time_t (*codel_skb_time_t)(const struct sk_buff *); + +typedef void (*codel_skb_drop_t)(struct sk_buff *, void *); + +typedef struct sk_buff * (*codel_skb_dequeue_t)(struct codel_vars *, void *); + +enum { + INET_ECN_NOT_ECT = 0, + INET_ECN_ECT_1 = 1, + INET_ECN_ECT_0 = 2, + INET_ECN_CE = 3, + INET_ECN_MASK = 3, +}; + +struct codel_skb_cb { + codel_time_t enqueue_time; + unsigned int mem_usage; +}; + +struct fq_codel_flow { + struct sk_buff *head; + struct sk_buff *tail; + struct list_head flowchain; + int deficit; + struct codel_vars cvars; +}; + +struct fq_codel_sched_data { + struct tcf_proto *filter_list; + struct tcf_block *block; + struct fq_codel_flow *flows; + u32 *backlogs; + u32 flows_cnt; + u32 quantum; + u32 drop_batch_size; + u32 memory_limit; + struct codel_params cparams; + struct codel_stats cstats; + u32 memory_usage; + u32 drop_overmemory; + u32 drop_overlimit; + u32 new_flow_count; + struct list_head new_flows; + struct list_head old_flows; +}; + +enum kernfs_node_flag { + KERNFS_ACTIVATED = 16, + KERNFS_NS = 32, + KERNFS_HAS_SEQ_SHOW = 64, + KERNFS_HAS_MMAP = 128, + KERNFS_LOCKDEP = 256, + KERNFS_HIDDEN = 512, + KERNFS_SUICIDAL = 1024, + KERNFS_SUICIDED = 2048, + KERNFS_EMPTY_DIR = 4096, + KERNFS_HAS_RELEASE = 8192, + KERNFS_REMOVING = 16384, +}; + +enum clock_event_state { + CLOCK_EVT_STATE_DETACHED = 0, + CLOCK_EVT_STATE_SHUTDOWN = 1, + CLOCK_EVT_STATE_PERIODIC = 2, + CLOCK_EVT_STATE_ONESHOT = 3, + CLOCK_EVT_STATE_ONESHOT_STOPPED = 4, +}; + +struct clock_event_device { + void (*event_handler)(struct clock_event_device *); + int (*set_next_event)(long unsigned int, struct clock_event_device *); + int (*set_next_ktime)(ktime_t, struct clock_event_device *); + ktime_t next_event; + u64 max_delta_ns; + u64 min_delta_ns; + u32 mult; + u32 shift; + enum clock_event_state state_use_accessors; + unsigned int features; + long unsigned int retries; + int (*set_state_periodic)(struct clock_event_device *); + int (*set_state_oneshot)(struct clock_event_device *); + int (*set_state_oneshot_stopped)(struct clock_event_device *); + int (*set_state_shutdown)(struct clock_event_device *); + int (*tick_resume)(struct clock_event_device *); + void (*broadcast)(const struct cpumask *); + void (*suspend)(struct clock_event_device *); + void (*resume)(struct clock_event_device *); + long unsigned int min_delta_ticks; + long unsigned int max_delta_ticks; + const char *name; + int rating; + int irq; + int bound_on; + const struct cpumask *cpumask; + struct list_head list; + struct module *owner; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum tick_device_mode { + TICKDEV_MODE_PERIODIC = 0, + TICKDEV_MODE_ONESHOT = 1, +}; + +struct tick_device { + struct clock_event_device *evtdev; + enum tick_device_mode mode; +}; + +struct pm_qos_flags { + struct list_head list; + s32 effective_flags; +}; + +struct dev_pm_qos_request; + +struct dev_pm_qos { + struct pm_qos_constraints resume_latency; + struct pm_qos_constraints latency_tolerance; + struct freq_constraints freq; + struct pm_qos_flags flags; + struct dev_pm_qos_request *resume_latency_req; + struct dev_pm_qos_request *latency_tolerance_req; + struct dev_pm_qos_request *flags_req; +}; + +struct pm_qos_flags_request { + struct list_head node; + s32 flags; +}; + +enum dev_pm_qos_req_type { + DEV_PM_QOS_RESUME_LATENCY = 1, + DEV_PM_QOS_LATENCY_TOLERANCE = 2, + DEV_PM_QOS_MIN_FREQUENCY = 3, + DEV_PM_QOS_MAX_FREQUENCY = 4, + DEV_PM_QOS_FLAGS = 5, +}; + +struct dev_pm_qos_request { + enum dev_pm_qos_req_type type; + union { + struct plist_node pnode; + struct pm_qos_flags_request flr; + struct freq_qos_request freq; + } data; + struct device *dev; +}; + +enum tick_broadcast_state { + TICK_BROADCAST_EXIT = 0, + TICK_BROADCAST_ENTER = 1, +}; + +enum bpf_link_type { + BPF_LINK_TYPE_UNSPEC = 0, + BPF_LINK_TYPE_RAW_TRACEPOINT = 1, + BPF_LINK_TYPE_TRACING = 2, + BPF_LINK_TYPE_CGROUP = 3, + BPF_LINK_TYPE_ITER = 4, + BPF_LINK_TYPE_NETNS = 5, + BPF_LINK_TYPE_XDP = 6, + BPF_LINK_TYPE_PERF_EVENT = 7, + BPF_LINK_TYPE_KPROBE_MULTI = 8, + BPF_LINK_TYPE_STRUCT_OPS = 9, + MAX_BPF_LINK_TYPE = 10, +}; + +typedef sockptr_t bpfptr_t; + +typedef unsigned int (*bpf_func_t)(const void *, const struct bpf_insn *); + +struct bpf_link_ops; + +struct bpf_link { + atomic64_t refcnt; + u32 id; + enum bpf_link_type type; + const struct bpf_link_ops *ops; + struct bpf_prog *prog; + struct work_struct work; +}; + +struct bpf_link_ops { + void (*release)(struct bpf_link *); + void (*dealloc)(struct bpf_link *); + int (*detach)(struct bpf_link *); + int (*update_prog)(struct bpf_link *, struct bpf_prog *, struct bpf_prog *); + void (*show_fdinfo)(const struct bpf_link *, struct seq_file *); + int (*fill_link_info)(const struct bpf_link *, struct bpf_link_info *); +}; + +struct bpf_link_primer { + struct bpf_link *link; + struct file *file; + int fd; + u32 id; +}; + +enum bpf_iter_feature { + BPF_ITER_RESCHED = 1, +}; + +typedef unsigned int (*bpf_dispatcher_fn)(const void *, const struct bpf_insn *, unsigned int (*)(const void *, const struct bpf_insn *)); + +struct bpf_iter_target_info { + struct list_head list; + const struct bpf_iter_reg *reg_info; + u32 btf_id; +}; + +struct bpf_iter_link { + struct bpf_link link; + struct bpf_iter_aux_info aux; + struct bpf_iter_target_info *tinfo; +}; + +struct bpf_iter_priv_data { + struct bpf_iter_target_info *tinfo; + const struct bpf_iter_seq_info *seq_info; + struct bpf_prog *prog; + u64 session_id; + u64 seq_num; + bool done_stop; + long: 56; + u8 target_private[0]; +}; + +typedef u64 (*btf_bpf_for_each_map_elem)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_loop)(u32, void *, void *, u64); + +typedef struct { + __le16 e_tag; + __le16 e_perm; + __le32 e_id; +} ext4_acl_entry; + +typedef struct { + __le32 a_version; +} ext4_acl_header; + +enum devcg_behavior { + DEVCG_DEFAULT_NONE = 0, + DEVCG_DEFAULT_ALLOW = 1, + DEVCG_DEFAULT_DENY = 2, +}; + +struct dev_exception_item { + u32 major; + u32 minor; + short int type; + short int access; + struct list_head list; + struct callback_head rcu; +}; + +struct dev_cgroup { + struct cgroup_subsys_state css; + struct list_head exceptions; + enum devcg_behavior behavior; +}; + +typedef void (*acpi_osd_exec_callback)(void *); + +typedef u32 (*acpi_event_handler)(void *); + +typedef enum { + OSL_GLOBAL_LOCK_HANDLER = 0, + OSL_NOTIFY_HANDLER = 1, + OSL_GPE_HANDLER = 2, + OSL_DEBUGGER_MAIN_THREAD = 3, + OSL_DEBUGGER_EXEC_THREAD = 4, + OSL_EC_POLL_HANDLER = 5, + OSL_EC_BURST_HANDLER = 6, +} acpi_execute_type; + +typedef int (*acpi_op_add)(struct acpi_device *); + +typedef void (*acpi_op_remove)(struct acpi_device *); + +typedef void (*acpi_op_notify)(struct acpi_device *, u32); + +struct acpi_device_ops { + acpi_op_add add; + acpi_op_remove remove; + acpi_op_notify notify; +}; + +struct acpi_driver { + char name[80]; + char class[80]; + const struct acpi_device_id *ids; + unsigned int flags; + struct acpi_device_ops ops; + struct device_driver drv; + struct module *owner; +}; + +struct acpi_device_physical_node { + unsigned int node_id; + struct list_head node; + struct device *dev; + bool put_online: 1; +}; + +enum acpi_irq_model_id { + ACPI_IRQ_MODEL_PIC = 0, + ACPI_IRQ_MODEL_IOAPIC = 1, + ACPI_IRQ_MODEL_IOSAPIC = 2, + ACPI_IRQ_MODEL_PLATFORM = 3, + ACPI_IRQ_MODEL_GIC = 4, + ACPI_IRQ_MODEL_LPIC = 5, + ACPI_IRQ_MODEL_COUNT = 6, +}; + +struct acpi_osc_context { + char *uuid_str; + int rev; + struct acpi_buffer cap; + struct acpi_buffer ret; +}; + +struct acpi_dev_walk_context { + int (*fn)(struct acpi_device *, void *); + void *data; +}; + +struct acpi_table_fadt { + struct acpi_table_header header; + u32 facs; + u32 dsdt; + u8 model; + u8 preferred_profile; + u16 sci_interrupt; + u32 smi_command; + u8 acpi_enable; + u8 acpi_disable; + u8 s4_bios_request; + u8 pstate_control; + u32 pm1a_event_block; + u32 pm1b_event_block; + u32 pm1a_control_block; + u32 pm1b_control_block; + u32 pm2_control_block; + u32 pm_timer_block; + u32 gpe0_block; + u32 gpe1_block; + u8 pm1_event_length; + u8 pm1_control_length; + u8 pm2_control_length; + u8 pm_timer_length; + u8 gpe0_block_length; + u8 gpe1_block_length; + u8 gpe1_base; + u8 cst_control; + u16 c2_latency; + u16 c3_latency; + u16 flush_size; + u16 flush_stride; + u8 duty_offset; + u8 duty_width; + u8 day_alarm; + u8 month_alarm; + u8 century; + u16 boot_flags; + u8 reserved; + u32 flags; + struct acpi_generic_address reset_register; + u8 reset_value; + u16 arm_boot_flags; + u8 minor_revision; + u64 Xfacs; + u64 Xdsdt; + struct acpi_generic_address xpm1a_event_block; + struct acpi_generic_address xpm1b_event_block; + struct acpi_generic_address xpm1a_control_block; + struct acpi_generic_address xpm1b_control_block; + struct acpi_generic_address xpm2_control_block; + struct acpi_generic_address xpm_timer_block; + struct acpi_generic_address xgpe0_block; + struct acpi_generic_address xgpe1_block; + struct acpi_generic_address sleep_control; + struct acpi_generic_address sleep_status; + u64 hypervisor_id; +} __attribute__((packed)); + +struct ldsem_waiter { + struct list_head list; + struct task_struct *task; +}; + +struct class_attribute { + struct attribute attr; + ssize_t (*show)(struct class *, struct class_attribute *, char *); + ssize_t (*store)(struct class *, struct class_attribute *, const char *, size_t); +}; + +enum device_link_state { + DL_STATE_NONE = -1, + DL_STATE_DORMANT = 0, + DL_STATE_AVAILABLE = 1, + DL_STATE_CONSUMER_PROBE = 2, + DL_STATE_ACTIVE = 3, + DL_STATE_SUPPLIER_UNBIND = 4, +}; + +struct device_link { + struct device *supplier; + struct list_head s_node; + struct device *consumer; + struct list_head c_node; + struct device link_dev; + enum device_link_state status; + u32 flags; + refcount_t rpm_active; + struct kref kref; + struct work_struct rm_work; + bool supplier_preactivated; +}; + +struct __kernel_sockaddr_storage { + union { + struct { + __kernel_sa_family_t ss_family; + char __data[126]; + }; + void *__align; + }; +}; + +enum net_device_flags { + IFF_UP = 1, + IFF_BROADCAST = 2, + IFF_DEBUG = 4, + IFF_LOOPBACK = 8, + IFF_POINTOPOINT = 16, + IFF_NOTRAILERS = 32, + IFF_RUNNING = 64, + IFF_NOARP = 128, + IFF_PROMISC = 256, + IFF_ALLMULTI = 512, + IFF_MASTER = 1024, + IFF_SLAVE = 2048, + IFF_MULTICAST = 4096, + IFF_PORTSEL = 8192, + IFF_AUTOMEDIA = 16384, + IFF_DYNAMIC = 32768, + IFF_LOWER_UP = 65536, + IFF_DORMANT = 131072, + IFF_ECHO = 262144, +}; + +struct ethhdr { + unsigned char h_dest[6]; + unsigned char h_source[6]; + __be16 h_proto; +}; + +struct flow_dissector_key_control { + u16 thoff; + u16 addr_type; + u32 flags; +}; + +struct flow_dissector_key_basic { + __be16 n_proto; + u8 ip_proto; + u8 padding; +}; + +struct flow_dissector_key_tags { + u32 flow_label; +}; + +struct flow_dissector_key_vlan { + union { + struct { + u16 vlan_id: 12; + u16 vlan_dei: 1; + u16 vlan_priority: 3; + }; + __be16 vlan_tci; + }; + __be16 vlan_tpid; + __be16 vlan_eth_type; + u16 padding; +}; + +struct flow_dissector_key_keyid { + __be32 keyid; +}; + +struct flow_dissector_key_ipv4_addrs { + __be32 src; + __be32 dst; +}; + +struct flow_dissector_key_ipv6_addrs { + struct in6_addr src; + struct in6_addr dst; +}; + +struct flow_dissector_key_tipc { + __be32 key; +}; + +struct flow_dissector_key_addrs { + union { + struct flow_dissector_key_ipv4_addrs v4addrs; + struct flow_dissector_key_ipv6_addrs v6addrs; + struct flow_dissector_key_tipc tipckey; + }; +}; + +struct flow_dissector_key_ports { + union { + __be32 ports; + struct { + __be16 src; + __be16 dst; + }; + }; +}; + +struct flow_dissector_key_icmp { + struct { + u8 type; + u8 code; + }; + u16 id; +}; + +struct flow_dissector_key { + enum flow_dissector_key_id key_id; + size_t offset; +}; + +struct flow_dissector { + unsigned int used_keys; + short unsigned int offset[31]; +}; + +struct flow_keys { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; + struct flow_dissector_key_tags tags; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_vlan cvlan; + struct flow_dissector_key_keyid keyid; + struct flow_dissector_key_ports ports; + struct flow_dissector_key_icmp icmp; + struct flow_dissector_key_addrs addrs; + int: 32; +}; + +struct ip_mreqn { + struct in_addr imr_multiaddr; + struct in_addr imr_address; + int imr_ifindex; +}; + +typedef union { + __be32 a4; + __be32 a6[4]; + struct in6_addr in6; +} xfrm_address_t; + +struct xfrm_id { + xfrm_address_t daddr; + __be32 spi; + __u8 proto; +}; + +struct xfrm_sec_ctx { + __u8 ctx_doi; + __u8 ctx_alg; + __u16 ctx_len; + __u32 ctx_sid; + char ctx_str[0]; +}; + +struct xfrm_selector { + xfrm_address_t daddr; + xfrm_address_t saddr; + __be16 dport; + __be16 dport_mask; + __be16 sport; + __be16 sport_mask; + __u16 family; + __u8 prefixlen_d; + __u8 prefixlen_s; + __u8 proto; + int ifindex; + __kernel_uid32_t user; +}; + +struct xfrm_lifetime_cfg { + __u64 soft_byte_limit; + __u64 hard_byte_limit; + __u64 soft_packet_limit; + __u64 hard_packet_limit; + __u64 soft_add_expires_seconds; + __u64 hard_add_expires_seconds; + __u64 soft_use_expires_seconds; + __u64 hard_use_expires_seconds; +}; + +struct xfrm_lifetime_cur { + __u64 bytes; + __u64 packets; + __u64 add_time; + __u64 use_time; +}; + +struct xfrm_replay_state { + __u32 oseq; + __u32 seq; + __u32 bitmap; +}; + +struct xfrm_replay_state_esn { + unsigned int bmp_len; + __u32 oseq; + __u32 seq; + __u32 oseq_hi; + __u32 seq_hi; + __u32 replay_window; + __u32 bmp[0]; +}; + +struct xfrm_algo { + char alg_name[64]; + unsigned int alg_key_len; + char alg_key[0]; +}; + +struct xfrm_algo_auth { + char alg_name[64]; + unsigned int alg_key_len; + unsigned int alg_trunc_len; + char alg_key[0]; +}; + +struct xfrm_algo_aead { + char alg_name[64]; + unsigned int alg_key_len; + unsigned int alg_icv_len; + char alg_key[0]; +}; + +struct xfrm_stats { + __u32 replay_window; + __u32 replay; + __u32 integrity_failed; +}; + +enum { + XFRM_POLICY_TYPE_MAIN = 0, + XFRM_POLICY_TYPE_SUB = 1, + XFRM_POLICY_TYPE_MAX = 2, + XFRM_POLICY_TYPE_ANY = 255, +}; + +enum { + XFRM_MSG_BASE = 16, + XFRM_MSG_NEWSA = 16, + XFRM_MSG_DELSA = 17, + XFRM_MSG_GETSA = 18, + XFRM_MSG_NEWPOLICY = 19, + XFRM_MSG_DELPOLICY = 20, + XFRM_MSG_GETPOLICY = 21, + XFRM_MSG_ALLOCSPI = 22, + XFRM_MSG_ACQUIRE = 23, + XFRM_MSG_EXPIRE = 24, + XFRM_MSG_UPDPOLICY = 25, + XFRM_MSG_UPDSA = 26, + XFRM_MSG_POLEXPIRE = 27, + XFRM_MSG_FLUSHSA = 28, + XFRM_MSG_FLUSHPOLICY = 29, + XFRM_MSG_NEWAE = 30, + XFRM_MSG_GETAE = 31, + XFRM_MSG_REPORT = 32, + XFRM_MSG_MIGRATE = 33, + XFRM_MSG_NEWSADINFO = 34, + XFRM_MSG_GETSADINFO = 35, + XFRM_MSG_NEWSPDINFO = 36, + XFRM_MSG_GETSPDINFO = 37, + XFRM_MSG_MAPPING = 38, + XFRM_MSG_SETDEFAULT = 39, + XFRM_MSG_GETDEFAULT = 40, + __XFRM_MSG_MAX = 41, +}; + +struct xfrm_encap_tmpl { + __u16 encap_type; + __be16 encap_sport; + __be16 encap_dport; + xfrm_address_t encap_oa; +}; + +enum xfrm_attr_type_t { + XFRMA_UNSPEC = 0, + XFRMA_ALG_AUTH = 1, + XFRMA_ALG_CRYPT = 2, + XFRMA_ALG_COMP = 3, + XFRMA_ENCAP = 4, + XFRMA_TMPL = 5, + XFRMA_SA = 6, + XFRMA_POLICY = 7, + XFRMA_SEC_CTX = 8, + XFRMA_LTIME_VAL = 9, + XFRMA_REPLAY_VAL = 10, + XFRMA_REPLAY_THRESH = 11, + XFRMA_ETIMER_THRESH = 12, + XFRMA_SRCADDR = 13, + XFRMA_COADDR = 14, + XFRMA_LASTUSED = 15, + XFRMA_POLICY_TYPE = 16, + XFRMA_MIGRATE = 17, + XFRMA_ALG_AEAD = 18, + XFRMA_KMADDRESS = 19, + XFRMA_ALG_AUTH_TRUNC = 20, + XFRMA_MARK = 21, + XFRMA_TFCPAD = 22, + XFRMA_REPLAY_ESN_VAL = 23, + XFRMA_SA_EXTRA_FLAGS = 24, + XFRMA_PROTO = 25, + XFRMA_ADDRESS_FILTER = 26, + XFRMA_PAD = 27, + XFRMA_OFFLOAD_DEV = 28, + XFRMA_SET_MARK = 29, + XFRMA_SET_MARK_MASK = 30, + XFRMA_IF_ID = 31, + XFRMA_MTIMER_THRESH = 32, + __XFRMA_MAX = 33, +}; + +struct xfrm_mark { + __u32 v; + __u32 m; +}; + +struct xfrm_address_filter { + xfrm_address_t saddr; + xfrm_address_t daddr; + __u16 family; + __u8 splen; + __u8 dplen; +}; + +struct ifbond { + __s32 bond_mode; + __s32 num_slaves; + __s32 miimon; +}; + +typedef struct ifbond ifbond; + +struct ifslave { + __s32 slave_id; + char slave_name[16]; + __s8 link; + __s8 state; + __u32 link_failure_count; +}; + +typedef struct ifslave ifslave; + +struct ad_info { + __u16 aggregator_id; + __u16 ports; + __u16 actor_key; + __u16 partner_key; + __u8 partner_system[6]; +}; + +enum netdev_state_t { + __LINK_STATE_START = 0, + __LINK_STATE_PRESENT = 1, + __LINK_STATE_NOCARRIER = 2, + __LINK_STATE_LINKWATCH_PENDING = 3, + __LINK_STATE_DORMANT = 4, + __LINK_STATE_TESTING = 5, +}; + +enum netdev_priv_flags { + IFF_802_1Q_VLAN = 1ULL, + IFF_EBRIDGE = 2ULL, + IFF_BONDING = 4ULL, + IFF_ISATAP = 8ULL, + IFF_WAN_HDLC = 16ULL, + IFF_XMIT_DST_RELEASE = 32ULL, + IFF_DONT_BRIDGE = 64ULL, + IFF_DISABLE_NETPOLL = 128ULL, + IFF_MACVLAN_PORT = 256ULL, + IFF_BRIDGE_PORT = 512ULL, + IFF_OVS_DATAPATH = 1024ULL, + IFF_TX_SKB_SHARING = 2048ULL, + IFF_UNICAST_FLT = 4096ULL, + IFF_TEAM_PORT = 8192ULL, + IFF_SUPP_NOFCS = 16384ULL, + IFF_LIVE_ADDR_CHANGE = 32768ULL, + IFF_MACVLAN = 65536ULL, + IFF_XMIT_DST_RELEASE_PERM = 131072ULL, + IFF_L3MDEV_MASTER = 262144ULL, + IFF_NO_QUEUE = 524288ULL, + IFF_OPENVSWITCH = 1048576ULL, + IFF_L3MDEV_SLAVE = 2097152ULL, + IFF_TEAM = 4194304ULL, + IFF_RXFH_CONFIGURED = 8388608ULL, + IFF_PHONY_HEADROOM = 16777216ULL, + IFF_MACSEC = 33554432ULL, + IFF_NO_RX_HANDLER = 67108864ULL, + IFF_FAILOVER = 134217728ULL, + IFF_FAILOVER_SLAVE = 268435456ULL, + IFF_L3MDEV_RX_HANDLER = 536870912ULL, + IFF_NO_ADDRCONF = 1073741824ULL, + IFF_TX_SKB_NO_LINEAR = 2147483648ULL, + IFF_CHANGE_PROTO_DOWN = 4294967296ULL, +}; + +struct gpio_desc; + +struct reset_control; + +struct mii_bus; + +struct mdio_device { + struct device dev; + struct mii_bus *bus; + char modalias[32]; + int (*bus_match)(struct device *, struct device_driver *); + void (*device_free)(struct mdio_device *); + void (*device_remove)(struct mdio_device *); + int addr; + int flags; + struct gpio_desc *reset_gpio; + struct reset_control *reset_ctrl; + unsigned int reset_assert_delay; + unsigned int reset_deassert_delay; +}; + +struct phy_c45_device_ids { + u32 devices_in_package; + u32 mmds_present; + u32 device_ids[32]; +}; + +enum phy_state { + PHY_DOWN = 0, + PHY_READY = 1, + PHY_HALTED = 2, + PHY_UP = 3, + PHY_RUNNING = 4, + PHY_NOLINK = 5, + PHY_CABLETEST = 6, +}; + +typedef enum { + PHY_INTERFACE_MODE_NA = 0, + PHY_INTERFACE_MODE_INTERNAL = 1, + PHY_INTERFACE_MODE_MII = 2, + PHY_INTERFACE_MODE_GMII = 3, + PHY_INTERFACE_MODE_SGMII = 4, + PHY_INTERFACE_MODE_TBI = 5, + PHY_INTERFACE_MODE_REVMII = 6, + PHY_INTERFACE_MODE_RMII = 7, + PHY_INTERFACE_MODE_REVRMII = 8, + PHY_INTERFACE_MODE_RGMII = 9, + PHY_INTERFACE_MODE_RGMII_ID = 10, + PHY_INTERFACE_MODE_RGMII_RXID = 11, + PHY_INTERFACE_MODE_RGMII_TXID = 12, + PHY_INTERFACE_MODE_RTBI = 13, + PHY_INTERFACE_MODE_SMII = 14, + PHY_INTERFACE_MODE_XGMII = 15, + PHY_INTERFACE_MODE_XLGMII = 16, + PHY_INTERFACE_MODE_MOCA = 17, + PHY_INTERFACE_MODE_QSGMII = 18, + PHY_INTERFACE_MODE_TRGMII = 19, + PHY_INTERFACE_MODE_100BASEX = 20, + PHY_INTERFACE_MODE_1000BASEX = 21, + PHY_INTERFACE_MODE_2500BASEX = 22, + PHY_INTERFACE_MODE_5GBASER = 23, + PHY_INTERFACE_MODE_RXAUI = 24, + PHY_INTERFACE_MODE_XAUI = 25, + PHY_INTERFACE_MODE_10GBASER = 26, + PHY_INTERFACE_MODE_25GBASER = 27, + PHY_INTERFACE_MODE_USXGMII = 28, + PHY_INTERFACE_MODE_10GKR = 29, + PHY_INTERFACE_MODE_QUSGMII = 30, + PHY_INTERFACE_MODE_1000BASEKX = 31, + PHY_INTERFACE_MODE_MAX = 32, +} phy_interface_t; + +struct phylink; + +struct pse_control; + +struct phy_driver; + +struct phy_package_shared; + +struct mii_timestamper; + +struct phy_device { + struct mdio_device mdio; + struct phy_driver *drv; + struct device_link *devlink; + u32 phy_id; + struct phy_c45_device_ids c45_ids; + unsigned int is_c45: 1; + unsigned int is_internal: 1; + unsigned int is_pseudo_fixed_link: 1; + unsigned int is_gigabit_capable: 1; + unsigned int has_fixups: 1; + unsigned int suspended: 1; + unsigned int suspended_by_mdio_bus: 1; + unsigned int sysfs_links: 1; + unsigned int loopback_enabled: 1; + unsigned int downshifted_rate: 1; + unsigned int is_on_sfp_module: 1; + unsigned int mac_managed_pm: 1; + unsigned int autoneg: 1; + unsigned int link: 1; + unsigned int autoneg_complete: 1; + unsigned int interrupts: 1; + unsigned int irq_suspended: 1; + unsigned int irq_rerun: 1; + int rate_matching; + enum phy_state state; + u32 dev_flags; + phy_interface_t interface; + int speed; + int duplex; + int port; + int pause; + int asym_pause; + u8 master_slave_get; + u8 master_slave_set; + u8 master_slave_state; + long unsigned int supported[2]; + long unsigned int advertising[2]; + long unsigned int lp_advertising[2]; + long unsigned int adv_old[2]; + long unsigned int host_interfaces[1]; + u32 eee_broken_modes; + int irq; + void *priv; + struct phy_package_shared *shared; + struct sk_buff *skb; + void *ehdr; + struct nlattr *nest; + struct delayed_work state_queue; + struct mutex lock; + bool sfp_bus_attached; + struct sfp_bus *sfp_bus; + struct phylink *phylink; + struct net_device *attached_dev; + struct mii_timestamper *mii_ts; + struct pse_control *psec; + u8 mdix; + u8 mdix_ctrl; + int pma_extable; + unsigned int link_down_events; + void (*phy_link_change)(struct phy_device *, bool); + void (*adjust_link)(struct net_device *); +}; + +enum netdev_lag_tx_type { + NETDEV_LAG_TX_TYPE_UNKNOWN = 0, + NETDEV_LAG_TX_TYPE_RANDOM = 1, + NETDEV_LAG_TX_TYPE_BROADCAST = 2, + NETDEV_LAG_TX_TYPE_ROUNDROBIN = 3, + NETDEV_LAG_TX_TYPE_ACTIVEBACKUP = 4, + NETDEV_LAG_TX_TYPE_HASH = 5, +}; + +enum netdev_lag_hash { + NETDEV_LAG_HASH_NONE = 0, + NETDEV_LAG_HASH_L2 = 1, + NETDEV_LAG_HASH_L34 = 2, + NETDEV_LAG_HASH_L23 = 3, + NETDEV_LAG_HASH_E23 = 4, + NETDEV_LAG_HASH_E34 = 5, + NETDEV_LAG_HASH_VLAN_SRCMAC = 6, + NETDEV_LAG_HASH_UNKNOWN = 7, +}; + +struct netdev_lag_upper_info { + enum netdev_lag_tx_type tx_type; + enum netdev_lag_hash hash_type; +}; + +struct netdev_lag_lower_state_info { + u8 link_up: 1; + u8 tx_enabled: 1; +}; + +enum skb_free_reason { + SKB_REASON_CONSUMED = 0, + SKB_REASON_DROPPED = 1, +}; + +struct netdev_nested_priv { + unsigned char flags; + void *data; +}; + +struct netdev_bonding_info { + ifslave slave; + ifbond master; +}; + +enum rt_scope_t { + RT_SCOPE_UNIVERSE = 0, + RT_SCOPE_SITE = 200, + RT_SCOPE_LINK = 253, + RT_SCOPE_HOST = 254, + RT_SCOPE_NOWHERE = 255, +}; + +struct vlan_ethhdr { + union { + struct { + unsigned char h_dest[6]; + unsigned char h_source[6]; + }; + struct { + unsigned char h_dest[6]; + unsigned char h_source[6]; + } addrs; + }; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __be16 h_vlan_encapsulated_proto; +}; + +enum { + IPV4_DEVCONF_FORWARDING = 1, + IPV4_DEVCONF_MC_FORWARDING = 2, + IPV4_DEVCONF_PROXY_ARP = 3, + IPV4_DEVCONF_ACCEPT_REDIRECTS = 4, + IPV4_DEVCONF_SECURE_REDIRECTS = 5, + IPV4_DEVCONF_SEND_REDIRECTS = 6, + IPV4_DEVCONF_SHARED_MEDIA = 7, + IPV4_DEVCONF_RP_FILTER = 8, + IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE = 9, + IPV4_DEVCONF_BOOTP_RELAY = 10, + IPV4_DEVCONF_LOG_MARTIANS = 11, + IPV4_DEVCONF_TAG = 12, + IPV4_DEVCONF_ARPFILTER = 13, + IPV4_DEVCONF_MEDIUM_ID = 14, + IPV4_DEVCONF_NOXFRM = 15, + IPV4_DEVCONF_NOPOLICY = 16, + IPV4_DEVCONF_FORCE_IGMP_VERSION = 17, + IPV4_DEVCONF_ARP_ANNOUNCE = 18, + IPV4_DEVCONF_ARP_IGNORE = 19, + IPV4_DEVCONF_PROMOTE_SECONDARIES = 20, + IPV4_DEVCONF_ARP_ACCEPT = 21, + IPV4_DEVCONF_ARP_NOTIFY = 22, + IPV4_DEVCONF_ACCEPT_LOCAL = 23, + IPV4_DEVCONF_SRC_VMARK = 24, + IPV4_DEVCONF_PROXY_ARP_PVLAN = 25, + IPV4_DEVCONF_ROUTE_LOCALNET = 26, + IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL = 27, + IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL = 28, + IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 29, + IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 30, + IPV4_DEVCONF_DROP_GRATUITOUS_ARP = 31, + IPV4_DEVCONF_BC_FORWARDING = 32, + IPV4_DEVCONF_ARP_EVICT_NOCARRIER = 33, + __IPV4_DEVCONF_MAX = 34, +}; + +struct xfrm_state_walk { + struct list_head all; + u8 state; + u8 dying; + u8 proto; + u32 seq; + struct xfrm_address_filter *filter; +}; + +enum xfrm_replay_mode { + XFRM_REPLAY_MODE_LEGACY = 0, + XFRM_REPLAY_MODE_BMP = 1, + XFRM_REPLAY_MODE_ESN = 2, +}; + +struct xfrm_dev_offload { + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net_device *real_dev; + long unsigned int offload_handle; + u8 dir: 2; + u8 type: 2; +}; + +struct xfrm_mode { + u8 encap; + u8 family; + u8 flags; +}; + +struct xfrm_type; + +struct xfrm_type_offload; + +struct xfrm_state { + possible_net_t xs_net; + union { + struct hlist_node gclist; + struct hlist_node bydst; + }; + struct hlist_node bysrc; + struct hlist_node byspi; + struct hlist_node byseq; + refcount_t refcnt; + spinlock_t lock; + struct xfrm_id id; + struct xfrm_selector sel; + struct xfrm_mark mark; + u32 if_id; + u32 tfcpad; + u32 genid; + struct xfrm_state_walk km; + struct { + u32 reqid; + u8 mode; + u8 replay_window; + u8 aalgo; + u8 ealgo; + u8 calgo; + u8 flags; + u16 family; + xfrm_address_t saddr; + int header_len; + int trailer_len; + u32 extra_flags; + struct xfrm_mark smark; + } props; + struct xfrm_lifetime_cfg lft; + struct xfrm_algo_auth *aalg; + struct xfrm_algo *ealg; + struct xfrm_algo *calg; + struct xfrm_algo_aead *aead; + const char *geniv; + __be16 new_mapping_sport; + u32 new_mapping; + u32 mapping_maxage; + struct xfrm_encap_tmpl *encap; + struct sock *encap_sk; + xfrm_address_t *coaddr; + struct xfrm_state *tunnel; + atomic_t tunnel_users; + struct xfrm_replay_state replay; + struct xfrm_replay_state_esn *replay_esn; + struct xfrm_replay_state preplay; + struct xfrm_replay_state_esn *preplay_esn; + enum xfrm_replay_mode repl_mode; + u32 xflags; + u32 replay_maxage; + u32 replay_maxdiff; + struct timer_list rtimer; + struct xfrm_stats stats; + struct xfrm_lifetime_cur curlft; + struct hrtimer mtimer; + struct xfrm_dev_offload xso; + long int saved_tmo; + time64_t lastused; + struct page_frag xfrag; + const struct xfrm_type *type; + struct xfrm_mode inner_mode; + struct xfrm_mode inner_mode_iaf; + struct xfrm_mode outer_mode; + const struct xfrm_type_offload *type_offload; + struct xfrm_sec_ctx *security; + void *data; +}; + +enum { + SOF_TIMESTAMPING_TX_HARDWARE = 1, + SOF_TIMESTAMPING_TX_SOFTWARE = 2, + SOF_TIMESTAMPING_RX_HARDWARE = 4, + SOF_TIMESTAMPING_RX_SOFTWARE = 8, + SOF_TIMESTAMPING_SOFTWARE = 16, + SOF_TIMESTAMPING_SYS_HARDWARE = 32, + SOF_TIMESTAMPING_RAW_HARDWARE = 64, + SOF_TIMESTAMPING_OPT_ID = 128, + SOF_TIMESTAMPING_TX_SCHED = 256, + SOF_TIMESTAMPING_TX_ACK = 512, + SOF_TIMESTAMPING_OPT_CMSG = 1024, + SOF_TIMESTAMPING_OPT_TSONLY = 2048, + SOF_TIMESTAMPING_OPT_STATS = 4096, + SOF_TIMESTAMPING_OPT_PKTINFO = 8192, + SOF_TIMESTAMPING_OPT_TX_SWHW = 16384, + SOF_TIMESTAMPING_BIND_PHC = 32768, + SOF_TIMESTAMPING_OPT_ID_TCP = 65536, + SOF_TIMESTAMPING_LAST = 65536, + SOF_TIMESTAMPING_MASK = 131071, +}; + +struct hwtstamp_config { + int flags; + int tx_type; + int rx_filter; +}; + +enum hwtstamp_flags { + HWTSTAMP_FLAG_BONDED_PHC_INDEX = 1, + HWTSTAMP_FLAG_LAST = 1, + HWTSTAMP_FLAG_MASK = 1, +}; + +struct xfrm_policy_walk_entry { + struct list_head all; + u8 dead; +}; + +struct xfrm_policy_queue { + struct sk_buff_head hold_queue; + struct timer_list hold_timer; + long unsigned int timeout; +}; + +struct xfrm_tmpl { + struct xfrm_id id; + xfrm_address_t saddr; + short unsigned int encap_family; + u32 reqid; + u8 mode; + u8 share; + u8 optional; + u8 allalgs; + u32 aalgos; + u32 ealgos; + u32 calgos; +}; + +struct xfrm_policy { + possible_net_t xp_net; + struct hlist_node bydst; + struct hlist_node byidx; + rwlock_t lock; + refcount_t refcnt; + u32 pos; + struct timer_list timer; + atomic_t genid; + u32 priority; + u32 index; + u32 if_id; + struct xfrm_mark mark; + struct xfrm_selector selector; + struct xfrm_lifetime_cfg lft; + struct xfrm_lifetime_cur curlft; + struct xfrm_policy_walk_entry walk; + struct xfrm_policy_queue polq; + bool bydst_reinsert; + u8 type; + u8 action; + u8 flags; + u8 xfrm_nr; + u16 family; + struct xfrm_sec_ctx *security; + struct xfrm_tmpl xfrm_vec[6]; + struct hlist_node bydst_inexact_list; + struct callback_head rcu; + struct xfrm_dev_offload xdo; +}; + +struct ip_sf_socklist; + +struct ip_mc_socklist { + struct ip_mc_socklist *next_rcu; + struct ip_mreqn multi; + unsigned int sfmode; + struct ip_sf_socklist *sflist; + struct callback_head rcu; +}; + +struct arphdr { + __be16 ar_hrd; + __be16 ar_pro; + unsigned char ar_hln; + unsigned char ar_pln; + __be16 ar_op; +}; + +struct ip_sf_list; + +struct ip_mc_list { + struct in_device *interface; + __be32 multiaddr; + unsigned int sfmode; + struct ip_sf_list *sources; + struct ip_sf_list *tomb; + long unsigned int sfcount[2]; + union { + struct ip_mc_list *next; + struct ip_mc_list *next_rcu; + }; + struct ip_mc_list *next_hash; + struct timer_list timer; + int users; + refcount_t refcnt; + spinlock_t lock; + char tm_running; + char reporter; + char unsolicit_count; + char loaded; + unsigned char gsquery; + unsigned char crcount; + struct callback_head rcu; +}; + +struct ip_sf_socklist { + unsigned int sl_max; + unsigned int sl_count; + struct callback_head rcu; + __be32 sl_addr[0]; +}; + +struct ip_sf_list { + struct ip_sf_list *sf_next; + long unsigned int sf_count[2]; + __be32 sf_inaddr; + unsigned char sf_gsresp; + unsigned char sf_oldin; + unsigned char sf_crcount; +}; + +struct ethtool_drvinfo { + __u32 cmd; + char driver[32]; + char version[32]; + char fw_version[32]; + char bus_info[32]; + char erom_version[32]; + char reserved2[12]; + __u32 n_priv_flags; + __u32 n_stats; + __u32 testinfo_len; + __u32 eedump_len; + __u32 regdump_len; +}; + +struct ethtool_wolinfo { + __u32 cmd; + __u32 supported; + __u32 wolopts; + __u8 sopass[6]; +}; + +struct ethtool_tunable { + __u32 cmd; + __u32 id; + __u32 type_id; + __u32 len; + void *data[0]; +}; + +struct ethtool_regs { + __u32 cmd; + __u32 version; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_eeprom { + __u32 cmd; + __u32 magic; + __u32 offset; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_eee { + __u32 cmd; + __u32 supported; + __u32 advertised; + __u32 lp_advertised; + __u32 eee_active; + __u32 eee_enabled; + __u32 tx_lpi_enabled; + __u32 tx_lpi_timer; + __u32 reserved[2]; +}; + +struct ethtool_modinfo { + __u32 cmd; + __u32 type; + __u32 eeprom_len; + __u32 reserved[8]; +}; + +struct ethtool_coalesce { + __u32 cmd; + __u32 rx_coalesce_usecs; + __u32 rx_max_coalesced_frames; + __u32 rx_coalesce_usecs_irq; + __u32 rx_max_coalesced_frames_irq; + __u32 tx_coalesce_usecs; + __u32 tx_max_coalesced_frames; + __u32 tx_coalesce_usecs_irq; + __u32 tx_max_coalesced_frames_irq; + __u32 stats_block_coalesce_usecs; + __u32 use_adaptive_rx_coalesce; + __u32 use_adaptive_tx_coalesce; + __u32 pkt_rate_low; + __u32 rx_coalesce_usecs_low; + __u32 rx_max_coalesced_frames_low; + __u32 tx_coalesce_usecs_low; + __u32 tx_max_coalesced_frames_low; + __u32 pkt_rate_high; + __u32 rx_coalesce_usecs_high; + __u32 rx_max_coalesced_frames_high; + __u32 tx_coalesce_usecs_high; + __u32 tx_max_coalesced_frames_high; + __u32 rate_sample_interval; +}; + +struct ethtool_ringparam { + __u32 cmd; + __u32 rx_max_pending; + __u32 rx_mini_max_pending; + __u32 rx_jumbo_max_pending; + __u32 tx_max_pending; + __u32 rx_pending; + __u32 rx_mini_pending; + __u32 rx_jumbo_pending; + __u32 tx_pending; +}; + +struct ethtool_channels { + __u32 cmd; + __u32 max_rx; + __u32 max_tx; + __u32 max_other; + __u32 max_combined; + __u32 rx_count; + __u32 tx_count; + __u32 other_count; + __u32 combined_count; +}; + +struct ethtool_pauseparam { + __u32 cmd; + __u32 autoneg; + __u32 rx_pause; + __u32 tx_pause; +}; + +enum ethtool_link_ext_state { + ETHTOOL_LINK_EXT_STATE_AUTONEG = 0, + ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = 1, + ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = 2, + ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = 3, + ETHTOOL_LINK_EXT_STATE_NO_CABLE = 4, + ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = 5, + ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = 6, + ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = 7, + ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = 8, + ETHTOOL_LINK_EXT_STATE_OVERHEAT = 9, + ETHTOOL_LINK_EXT_STATE_MODULE = 10, +}; + +enum ethtool_link_ext_substate_autoneg { + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = 2, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = 3, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = 4, + ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = 5, + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = 6, +}; + +enum ethtool_link_ext_substate_link_training { + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = 4, +}; + +enum ethtool_link_ext_substate_link_logical_mismatch { + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = 2, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = 3, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = 4, + ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = 5, +}; + +enum ethtool_link_ext_substate_bad_signal_integrity { + ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 2, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST = 3, + ETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS = 4, +}; + +enum ethtool_link_ext_substate_cable_issue { + ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1, + ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 2, +}; + +enum ethtool_link_ext_substate_module { + ETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY = 1, +}; + +enum ethtool_module_power_mode_policy { + ETHTOOL_MODULE_POWER_MODE_POLICY_HIGH = 1, + ETHTOOL_MODULE_POWER_MODE_POLICY_AUTO = 2, +}; + +enum ethtool_module_power_mode { + ETHTOOL_MODULE_POWER_MODE_LOW = 1, + ETHTOOL_MODULE_POWER_MODE_HIGH = 2, +}; + +struct ethtool_test { + __u32 cmd; + __u32 flags; + __u32 reserved; + __u32 len; + __u64 data[0]; +}; + +struct ethtool_stats { + __u32 cmd; + __u32 n_stats; + __u64 data[0]; +}; + +struct ethtool_tcpip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be16 psrc; + __be16 pdst; + __u8 tos; +}; + +struct ethtool_ah_espip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 spi; + __u8 tos; +}; + +struct ethtool_usrip4_spec { + __be32 ip4src; + __be32 ip4dst; + __be32 l4_4_bytes; + __u8 tos; + __u8 ip_ver; + __u8 proto; +}; + +struct ethtool_tcpip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be16 psrc; + __be16 pdst; + __u8 tclass; +}; + +struct ethtool_ah_espip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 spi; + __u8 tclass; +}; + +struct ethtool_usrip6_spec { + __be32 ip6src[4]; + __be32 ip6dst[4]; + __be32 l4_4_bytes; + __u8 tclass; + __u8 l4_proto; +}; + +union ethtool_flow_union { + struct ethtool_tcpip4_spec tcp_ip4_spec; + struct ethtool_tcpip4_spec udp_ip4_spec; + struct ethtool_tcpip4_spec sctp_ip4_spec; + struct ethtool_ah_espip4_spec ah_ip4_spec; + struct ethtool_ah_espip4_spec esp_ip4_spec; + struct ethtool_usrip4_spec usr_ip4_spec; + struct ethtool_tcpip6_spec tcp_ip6_spec; + struct ethtool_tcpip6_spec udp_ip6_spec; + struct ethtool_tcpip6_spec sctp_ip6_spec; + struct ethtool_ah_espip6_spec ah_ip6_spec; + struct ethtool_ah_espip6_spec esp_ip6_spec; + struct ethtool_usrip6_spec usr_ip6_spec; + struct ethhdr ether_spec; + __u8 hdata[52]; +}; + +struct ethtool_flow_ext { + __u8 padding[2]; + unsigned char h_dest[6]; + __be16 vlan_etype; + __be16 vlan_tci; + __be32 data[2]; +}; + +struct ethtool_rx_flow_spec { + __u32 flow_type; + union ethtool_flow_union h_u; + struct ethtool_flow_ext h_ext; + union ethtool_flow_union m_u; + struct ethtool_flow_ext m_ext; + __u64 ring_cookie; + __u32 location; +}; + +struct ethtool_rxnfc { + __u32 cmd; + __u32 flow_type; + __u64 data; + struct ethtool_rx_flow_spec fs; + union { + __u32 rule_cnt; + __u32 rss_context; + }; + __u32 rule_locs[0]; +}; + +struct ethtool_flash { + __u32 cmd; + __u32 region; + char data[128]; +}; + +struct ethtool_dump { + __u32 cmd; + __u32 version; + __u32 flag; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_ts_info { + __u32 cmd; + __u32 so_timestamping; + __s32 phc_index; + __u32 tx_types; + __u32 tx_reserved[3]; + __u32 rx_filters; + __u32 rx_reserved[3]; +}; + +struct ethtool_fecparam { + __u32 cmd; + __u32 active_fec; + __u32 fec; + __u32 reserved; +}; + +enum ethtool_link_mode_bit_indices { + ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0, + ETHTOOL_LINK_MODE_10baseT_Full_BIT = 1, + ETHTOOL_LINK_MODE_100baseT_Half_BIT = 2, + ETHTOOL_LINK_MODE_100baseT_Full_BIT = 3, + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4, + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5, + ETHTOOL_LINK_MODE_Autoneg_BIT = 6, + ETHTOOL_LINK_MODE_TP_BIT = 7, + ETHTOOL_LINK_MODE_AUI_BIT = 8, + ETHTOOL_LINK_MODE_MII_BIT = 9, + ETHTOOL_LINK_MODE_FIBRE_BIT = 10, + ETHTOOL_LINK_MODE_BNC_BIT = 11, + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12, + ETHTOOL_LINK_MODE_Pause_BIT = 13, + ETHTOOL_LINK_MODE_Asym_Pause_BIT = 14, + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15, + ETHTOOL_LINK_MODE_Backplane_BIT = 16, + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17, + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18, + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19, + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20, + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21, + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22, + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23, + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24, + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25, + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26, + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27, + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28, + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29, + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30, + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31, + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32, + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33, + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34, + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35, + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36, + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37, + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38, + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39, + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40, + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41, + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42, + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43, + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44, + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45, + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46, + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47, + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48, + ETHTOOL_LINK_MODE_FEC_NONE_BIT = 49, + ETHTOOL_LINK_MODE_FEC_RS_BIT = 50, + ETHTOOL_LINK_MODE_FEC_BASER_BIT = 51, + ETHTOOL_LINK_MODE_50000baseKR_Full_BIT = 52, + ETHTOOL_LINK_MODE_50000baseSR_Full_BIT = 53, + ETHTOOL_LINK_MODE_50000baseCR_Full_BIT = 54, + ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = 55, + ETHTOOL_LINK_MODE_50000baseDR_Full_BIT = 56, + ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = 57, + ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = 58, + ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = 59, + ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 60, + ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = 61, + ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = 62, + ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = 63, + ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 64, + ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = 65, + ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = 66, + ETHTOOL_LINK_MODE_100baseT1_Full_BIT = 67, + ETHTOOL_LINK_MODE_1000baseT1_Full_BIT = 68, + ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = 69, + ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = 70, + ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 71, + ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = 72, + ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = 73, + ETHTOOL_LINK_MODE_FEC_LLRS_BIT = 74, + ETHTOOL_LINK_MODE_100000baseKR_Full_BIT = 75, + ETHTOOL_LINK_MODE_100000baseSR_Full_BIT = 76, + ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = 77, + ETHTOOL_LINK_MODE_100000baseCR_Full_BIT = 78, + ETHTOOL_LINK_MODE_100000baseDR_Full_BIT = 79, + ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = 80, + ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = 81, + ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 82, + ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = 83, + ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = 84, + ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = 85, + ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = 86, + ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87, + ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 88, + ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 89, + ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 90, + ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 91, + ETHTOOL_LINK_MODE_10baseT1L_Full_BIT = 92, + ETHTOOL_LINK_MODE_800000baseCR8_Full_BIT = 93, + ETHTOOL_LINK_MODE_800000baseKR8_Full_BIT = 94, + ETHTOOL_LINK_MODE_800000baseDR8_Full_BIT = 95, + ETHTOOL_LINK_MODE_800000baseDR8_2_Full_BIT = 96, + ETHTOOL_LINK_MODE_800000baseSR8_Full_BIT = 97, + ETHTOOL_LINK_MODE_800000baseVR8_Full_BIT = 98, + __ETHTOOL_LINK_MODE_MASK_NBITS = 99, +}; + +struct ethtool_link_settings { + __u32 cmd; + __u32 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 autoneg; + __u8 mdio_support; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __s8 link_mode_masks_nwords; + __u8 transceiver; + __u8 master_slave_cfg; + __u8 master_slave_state; + __u8 rate_matching; + __u32 reserved[7]; + __u32 link_mode_masks[0]; +}; + +struct kernel_ethtool_ringparam { + u32 rx_buf_len; + u8 tcp_data_split; + u8 tx_push; + u32 cqe_size; +}; + +struct ethtool_link_ext_state_info { + enum ethtool_link_ext_state link_ext_state; + union { + enum ethtool_link_ext_substate_autoneg autoneg; + enum ethtool_link_ext_substate_link_training link_training; + enum ethtool_link_ext_substate_link_logical_mismatch link_logical_mismatch; + enum ethtool_link_ext_substate_bad_signal_integrity bad_signal_integrity; + enum ethtool_link_ext_substate_cable_issue cable_issue; + enum ethtool_link_ext_substate_module module; + u32 __link_ext_substate; + }; +}; + +struct ethtool_link_ext_stats { + u64 link_down_events; +}; + +struct ethtool_link_ksettings { + struct ethtool_link_settings base; + struct { + long unsigned int supported[2]; + long unsigned int advertising[2]; + long unsigned int lp_advertising[2]; + } link_modes; + u32 lanes; +}; + +struct kernel_ethtool_coalesce { + u8 use_cqe_mode_tx; + u8 use_cqe_mode_rx; +}; + +struct ethtool_eth_mac_stats { + u64 FramesTransmittedOK; + u64 SingleCollisionFrames; + u64 MultipleCollisionFrames; + u64 FramesReceivedOK; + u64 FrameCheckSequenceErrors; + u64 AlignmentErrors; + u64 OctetsTransmittedOK; + u64 FramesWithDeferredXmissions; + u64 LateCollisions; + u64 FramesAbortedDueToXSColls; + u64 FramesLostDueToIntMACXmitError; + u64 CarrierSenseErrors; + u64 OctetsReceivedOK; + u64 FramesLostDueToIntMACRcvError; + u64 MulticastFramesXmittedOK; + u64 BroadcastFramesXmittedOK; + u64 FramesWithExcessiveDeferral; + u64 MulticastFramesReceivedOK; + u64 BroadcastFramesReceivedOK; + u64 InRangeLengthErrors; + u64 OutOfRangeLengthField; + u64 FrameTooLongErrors; +}; + +struct ethtool_eth_phy_stats { + u64 SymbolErrorDuringCarrier; +}; + +struct ethtool_eth_ctrl_stats { + u64 MACControlFramesTransmitted; + u64 MACControlFramesReceived; + u64 UnsupportedOpcodesReceived; +}; + +struct ethtool_pause_stats { + u64 tx_pause_frames; + u64 rx_pause_frames; +}; + +struct ethtool_fec_stat { + u64 total; + u64 lanes[8]; +}; + +struct ethtool_fec_stats { + struct ethtool_fec_stat corrected_blocks; + struct ethtool_fec_stat uncorrectable_blocks; + struct ethtool_fec_stat corrected_bits; +}; + +struct ethtool_rmon_hist_range { + u16 low; + u16 high; +}; + +struct ethtool_rmon_stats { + u64 undersize_pkts; + u64 oversize_pkts; + u64 fragments; + u64 jabbers; + u64 hist[10]; + u64 hist_tx[10]; +}; + +struct ethtool_module_eeprom { + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; + u8 *data; +}; + +struct ethtool_module_power_mode_params { + enum ethtool_module_power_mode_policy policy; + enum ethtool_module_power_mode mode; +}; + +struct phy_tdr_config { + u32 first; + u32 last; + u32 step; + s8 pair; +}; + +struct mii_ioctl_data { + __u16 phy_id; + __u16 reg_num; + __u16 val_in; + __u16 val_out; +}; + +struct mdio_bus_stats { + u64_stats_t transfers; + u64_stats_t errors; + u64_stats_t writes; + u64_stats_t reads; + struct u64_stats_sync syncp; +}; + +struct mii_bus { + struct module *owner; + const char *name; + char id[61]; + void *priv; + int (*read)(struct mii_bus *, int, int); + int (*write)(struct mii_bus *, int, int, u16); + int (*reset)(struct mii_bus *); + struct mdio_bus_stats stats[32]; + struct mutex mdio_lock; + struct device *parent; + enum { + MDIOBUS_ALLOCATED = 1, + MDIOBUS_REGISTERED = 2, + MDIOBUS_UNREGISTERED = 3, + MDIOBUS_RELEASED = 4, + } state; + struct device dev; + struct mdio_device *mdio_map[32]; + u32 phy_mask; + u32 phy_ignore_ta_mask; + int irq[32]; + int reset_delay_us; + int reset_post_delay_us; + struct gpio_desc *reset_gpiod; + enum { + MDIOBUS_NO_CAP = 0, + MDIOBUS_C22 = 1, + MDIOBUS_C45 = 2, + MDIOBUS_C22_C45 = 3, + } probe_capabilities; + struct mutex shared_lock; + struct phy_package_shared *shared[32]; +}; + +struct mdio_driver_common { + struct device_driver driver; + int flags; +}; + +struct mii_timestamper { + bool (*rxtstamp)(struct mii_timestamper *, struct sk_buff *, int); + void (*txtstamp)(struct mii_timestamper *, struct sk_buff *, int); + int (*hwtstamp)(struct mii_timestamper *, struct ifreq *); + void (*link_state)(struct mii_timestamper *, struct phy_device *); + int (*ts_info)(struct mii_timestamper *, struct ethtool_ts_info *); + struct device *device; +}; + +struct phy_package_shared { + int addr; + refcount_t refcnt; + long unsigned int flags; + size_t priv_size; + void *priv; +}; + +struct phy_driver { + struct mdio_driver_common mdiodrv; + u32 phy_id; + char *name; + u32 phy_id_mask; + const long unsigned int * const features; + u32 flags; + const void *driver_data; + int (*soft_reset)(struct phy_device *); + int (*config_init)(struct phy_device *); + int (*probe)(struct phy_device *); + int (*get_features)(struct phy_device *); + int (*get_rate_matching)(struct phy_device *, phy_interface_t); + int (*suspend)(struct phy_device *); + int (*resume)(struct phy_device *); + int (*config_aneg)(struct phy_device *); + int (*aneg_done)(struct phy_device *); + int (*read_status)(struct phy_device *); + int (*config_intr)(struct phy_device *); + irqreturn_t (*handle_interrupt)(struct phy_device *); + void (*remove)(struct phy_device *); + int (*match_phy_device)(struct phy_device *); + int (*set_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*get_wol)(struct phy_device *, struct ethtool_wolinfo *); + void (*link_change_notify)(struct phy_device *); + int (*read_mmd)(struct phy_device *, int, u16); + int (*write_mmd)(struct phy_device *, int, u16, u16); + int (*read_page)(struct phy_device *); + int (*write_page)(struct phy_device *, int); + int (*module_info)(struct phy_device *, struct ethtool_modinfo *); + int (*module_eeprom)(struct phy_device *, struct ethtool_eeprom *, u8 *); + int (*cable_test_start)(struct phy_device *); + int (*cable_test_tdr_start)(struct phy_device *, const struct phy_tdr_config *); + int (*cable_test_get_status)(struct phy_device *, bool *); + int (*get_sset_count)(struct phy_device *); + void (*get_strings)(struct phy_device *, u8 *); + void (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*get_tunable)(struct phy_device *, struct ethtool_tunable *, void *); + int (*set_tunable)(struct phy_device *, struct ethtool_tunable *, const void *); + int (*set_loopback)(struct phy_device *, bool); + int (*get_sqi)(struct phy_device *); + int (*get_sqi_max)(struct phy_device *); +}; + +struct xfrm_type { + struct module *owner; + u8 proto; + u8 flags; + int (*init_state)(struct xfrm_state *, struct netlink_ext_ack *); + void (*destructor)(struct xfrm_state *); + int (*input)(struct xfrm_state *, struct sk_buff *); + int (*output)(struct xfrm_state *, struct sk_buff *); + int (*reject)(struct xfrm_state *, struct sk_buff *, const struct flowi *); +}; + +struct xfrm_type_offload { + struct module *owner; + u8 proto; + void (*encap)(struct xfrm_state *, struct sk_buff *); + int (*input_tail)(struct xfrm_state *, struct sk_buff *); + int (*xmit)(struct xfrm_state *, struct sk_buff *, netdev_features_t); +}; + +enum { + BOND_AD_STABLE = 0, + BOND_AD_BANDWIDTH = 1, + BOND_AD_COUNT = 2, +}; + +enum { + BOND_OPT_MODE = 0, + BOND_OPT_PACKETS_PER_SLAVE = 1, + BOND_OPT_XMIT_HASH = 2, + BOND_OPT_ARP_VALIDATE = 3, + BOND_OPT_ARP_ALL_TARGETS = 4, + BOND_OPT_FAIL_OVER_MAC = 5, + BOND_OPT_ARP_INTERVAL = 6, + BOND_OPT_ARP_TARGETS = 7, + BOND_OPT_DOWNDELAY = 8, + BOND_OPT_UPDELAY = 9, + BOND_OPT_LACP_RATE = 10, + BOND_OPT_MINLINKS = 11, + BOND_OPT_AD_SELECT = 12, + BOND_OPT_NUM_PEER_NOTIF = 13, + BOND_OPT_MIIMON = 14, + BOND_OPT_PRIMARY = 15, + BOND_OPT_PRIMARY_RESELECT = 16, + BOND_OPT_USE_CARRIER = 17, + BOND_OPT_ACTIVE_SLAVE = 18, + BOND_OPT_QUEUE_ID = 19, + BOND_OPT_ALL_SLAVES_ACTIVE = 20, + BOND_OPT_RESEND_IGMP = 21, + BOND_OPT_LP_INTERVAL = 22, + BOND_OPT_SLAVES = 23, + BOND_OPT_TLB_DYNAMIC_LB = 24, + BOND_OPT_AD_ACTOR_SYS_PRIO = 25, + BOND_OPT_AD_ACTOR_SYSTEM = 26, + BOND_OPT_AD_USER_PORT_KEY = 27, + BOND_OPT_NUM_PEER_NOTIF_ALIAS = 28, + BOND_OPT_PEER_NOTIF_DELAY = 29, + BOND_OPT_LACP_ACTIVE = 30, + BOND_OPT_MISSED_MAX = 31, + BOND_OPT_NS_TARGETS = 32, + BOND_OPT_PRIO = 33, + BOND_OPT_LAST = 34, +}; + +struct bond_opt_value { + char *string; + u64 value; + u32 flags; + union { + char extra[16]; + struct net_device *slave_dev; + }; +}; + +struct bond_option { + int id; + const char *name; + const char *desc; + u32 flags; + long unsigned int unsuppmodes; + const struct bond_opt_value *values; + int (*set)(struct bonding *, const struct bond_opt_value *); +}; + +struct bond_vlan_tag { + __be16 vlan_proto; + short unsigned int vlan_id; +}; + +struct bond_net { + struct net *net; + struct list_head dev_list; + struct proc_dir_entry *proc_dir; + struct class_attribute class_attr_bonding_masters; +}; + +enum { + IRQ_TYPE_NONE = 0, + IRQ_TYPE_EDGE_RISING = 1, + IRQ_TYPE_EDGE_FALLING = 2, + IRQ_TYPE_EDGE_BOTH = 3, + IRQ_TYPE_LEVEL_HIGH = 4, + IRQ_TYPE_LEVEL_LOW = 8, + IRQ_TYPE_LEVEL_MASK = 12, + IRQ_TYPE_SENSE_MASK = 15, + IRQ_TYPE_DEFAULT = 15, + IRQ_TYPE_PROBE = 16, + IRQ_LEVEL = 256, + IRQ_PER_CPU = 512, + IRQ_NOPROBE = 1024, + IRQ_NOREQUEST = 2048, + IRQ_NOAUTOEN = 4096, + IRQ_NO_BALANCING = 8192, + IRQ_MOVE_PCNTXT = 16384, + IRQ_NESTED_THREAD = 32768, + IRQ_NOTHREAD = 65536, + IRQ_PER_CPU_DEVID = 131072, + IRQ_IS_POLLED = 262144, + IRQ_DISABLE_UNLAZY = 524288, + IRQ_HIDDEN = 1048576, + IRQ_NO_DEBUG = 2097152, +}; + +enum { + IRQS_AUTODETECT = 1, + IRQS_SPURIOUS_DISABLED = 2, + IRQS_POLL_INPROGRESS = 8, + IRQS_ONESHOT = 32, + IRQS_REPLAY = 64, + IRQS_WAITING = 128, + IRQS_PENDING = 512, + IRQS_SUSPENDED = 2048, + IRQS_TIMINGS = 4096, + IRQS_NMI = 8192, + IRQS_SYSFS = 16384, +}; + +enum { + _IRQ_DEFAULT_INIT_FLAGS = 0, + _IRQ_PER_CPU = 512, + _IRQ_LEVEL = 256, + _IRQ_NOPROBE = 1024, + _IRQ_NOREQUEST = 2048, + _IRQ_NOTHREAD = 65536, + _IRQ_NOAUTOEN = 4096, + _IRQ_MOVE_PCNTXT = 16384, + _IRQ_NO_BALANCING = 8192, + _IRQ_NESTED_THREAD = 32768, + _IRQ_PER_CPU_DEVID = 131072, + _IRQ_IS_POLLED = 262144, + _IRQ_DISABLE_UNLAZY = 524288, + _IRQ_HIDDEN = 1048576, + _IRQ_NO_DEBUG = 2097152, + _IRQF_MODIFY_MASK = 2096911, +}; + +enum { + MBE_REFERENCED_B = 0, + MBE_REUSABLE_B = 1, +}; + +struct mb_cache_entry { + struct list_head e_list; + struct hlist_bl_node e_hash_list; + atomic_t e_refcnt; + u32 e_key; + long unsigned int e_flags; + u64 e_value; +}; + +enum req_flag_bits { + __REQ_FAILFAST_DEV = 8, + __REQ_FAILFAST_TRANSPORT = 9, + __REQ_FAILFAST_DRIVER = 10, + __REQ_SYNC = 11, + __REQ_META = 12, + __REQ_PRIO = 13, + __REQ_NOMERGE = 14, + __REQ_IDLE = 15, + __REQ_INTEGRITY = 16, + __REQ_FUA = 17, + __REQ_PREFLUSH = 18, + __REQ_RAHEAD = 19, + __REQ_BACKGROUND = 20, + __REQ_NOWAIT = 21, + __REQ_CGROUP_PUNT = 22, + __REQ_POLLED = 23, + __REQ_ALLOC_CACHE = 24, + __REQ_SWAP = 25, + __REQ_DRV = 26, + __REQ_NOUNMAP = 27, + __REQ_NR_BITS = 28, +}; + +enum jbd_state_bits { + BH_JBD = 16, + BH_JWrite = 17, + BH_Freed = 18, + BH_Revoked = 19, + BH_RevokeValid = 20, + BH_JBDDirty = 21, + BH_JournalHead = 22, + BH_Shadow = 23, + BH_Verified = 24, + BH_JBDPrivateStart = 25, +}; + +struct ext4_map_blocks { + ext4_fsblk_t m_pblk; + ext4_lblk_t m_lblk; + unsigned int m_len; + unsigned int m_flags; +}; + +enum { + EXT4_INODE_SECRM = 0, + EXT4_INODE_UNRM = 1, + EXT4_INODE_COMPR = 2, + EXT4_INODE_SYNC = 3, + EXT4_INODE_IMMUTABLE = 4, + EXT4_INODE_APPEND = 5, + EXT4_INODE_NODUMP = 6, + EXT4_INODE_NOATIME = 7, + EXT4_INODE_DIRTY = 8, + EXT4_INODE_COMPRBLK = 9, + EXT4_INODE_NOCOMPR = 10, + EXT4_INODE_ENCRYPT = 11, + EXT4_INODE_INDEX = 12, + EXT4_INODE_IMAGIC = 13, + EXT4_INODE_JOURNAL_DATA = 14, + EXT4_INODE_NOTAIL = 15, + EXT4_INODE_DIRSYNC = 16, + EXT4_INODE_TOPDIR = 17, + EXT4_INODE_HUGE_FILE = 18, + EXT4_INODE_EXTENTS = 19, + EXT4_INODE_VERITY = 20, + EXT4_INODE_EA_INODE = 21, + EXT4_INODE_DAX = 25, + EXT4_INODE_INLINE_DATA = 28, + EXT4_INODE_PROJINHERIT = 29, + EXT4_INODE_CASEFOLD = 30, + EXT4_INODE_RESERVED = 31, +}; + +struct ext4_inode { + __le16 i_mode; + __le16 i_uid; + __le32 i_size_lo; + __le32 i_atime; + __le32 i_ctime; + __le32 i_mtime; + __le32 i_dtime; + __le16 i_gid; + __le16 i_links_count; + __le32 i_blocks_lo; + __le32 i_flags; + union { + struct { + __le32 l_i_version; + } linux1; + struct { + __u32 h_i_translator; + } hurd1; + struct { + __u32 m_i_reserved1; + } masix1; + } osd1; + __le32 i_block[15]; + __le32 i_generation; + __le32 i_file_acl_lo; + __le32 i_size_high; + __le32 i_obso_faddr; + union { + struct { + __le16 l_i_blocks_high; + __le16 l_i_file_acl_high; + __le16 l_i_uid_high; + __le16 l_i_gid_high; + __le16 l_i_checksum_lo; + __le16 l_i_reserved; + } linux2; + struct { + __le16 h_i_reserved1; + __u16 h_i_mode_high; + __u16 h_i_uid_high; + __u16 h_i_gid_high; + __u32 h_i_author; + } hurd2; + struct { + __le16 h_i_reserved1; + __le16 m_i_file_acl_high; + __u32 m_i_reserved2[2]; + } masix2; + } osd2; + __le16 i_extra_isize; + __le16 i_checksum_hi; + __le32 i_ctime_extra; + __le32 i_mtime_extra; + __le32 i_atime_extra; + __le32 i_crtime; + __le32 i_crtime_extra; + __le32 i_version_hi; + __le32 i_projid; +}; + +enum { + EXT4_FC_REASON_XATTR = 0, + EXT4_FC_REASON_CROSS_RENAME = 1, + EXT4_FC_REASON_JOURNAL_FLAG_CHANGE = 2, + EXT4_FC_REASON_NOMEM = 3, + EXT4_FC_REASON_SWAP_BOOT = 4, + EXT4_FC_REASON_RESIZE = 5, + EXT4_FC_REASON_RENAME_DIR = 6, + EXT4_FC_REASON_FALLOC_RANGE = 7, + EXT4_FC_REASON_INODE_JOURNAL_DATA = 8, + EXT4_FC_REASON_ENCRYPTED_FILENAME = 9, + EXT4_FC_REASON_MAX = 10, +}; + +enum { + EXT4_STATE_JDATA = 0, + EXT4_STATE_NEW = 1, + EXT4_STATE_XATTR = 2, + EXT4_STATE_NO_EXPAND = 3, + EXT4_STATE_DA_ALLOC_CLOSE = 4, + EXT4_STATE_EXT_MIGRATE = 5, + EXT4_STATE_NEWENTRY = 6, + EXT4_STATE_MAY_INLINE_DATA = 7, + EXT4_STATE_EXT_PRECACHED = 8, + EXT4_STATE_LUSTRE_EA_INODE = 9, + EXT4_STATE_VERITY_IN_PROGRESS = 10, + EXT4_STATE_FC_COMMITTING = 11, + EXT4_STATE_ORPHAN_FILE = 12, +}; + +struct ext4_xattr_header { + __le32 h_magic; + __le32 h_refcount; + __le32 h_blocks; + __le32 h_hash; + __le32 h_checksum; + __u32 h_reserved[3]; +}; + +struct ext4_xattr_ibody_header { + __le32 h_magic; +}; + +struct ext4_xattr_entry { + __u8 e_name_len; + __u8 e_name_index; + __le16 e_value_offs; + __le32 e_value_inum; + __le32 e_value_size; + __le32 e_hash; + char e_name[0]; +}; + +struct ext4_xattr_info { + const char *name; + const void *value; + size_t value_len; + int name_index; + int in_inode; +}; + +struct ext4_xattr_search { + struct ext4_xattr_entry *first; + void *base; + void *end; + struct ext4_xattr_entry *here; + int not_found; +}; + +struct ext4_xattr_ibody_find { + struct ext4_xattr_search s; + struct ext4_iloc iloc; +}; + +struct ext4_xattr_inode_array { + unsigned int count; + struct inode *inodes[0]; +}; + +struct ext4_xattr_block_find { + struct ext4_xattr_search s; + struct buffer_head *bh; +}; + +struct crypto_aes_ctx { + u32 key_enc[60]; + u32 key_dec[60]; + u32 key_length; +}; + +typedef long unsigned int mpi_limb_t; + +struct gcry_mpi { + int alloced; + int nlimbs; + int nbits; + int sign; + unsigned int flags; + mpi_limb_t *d; +}; + +typedef struct gcry_mpi *MPI; + +struct barrett_ctx_s; + +typedef struct barrett_ctx_s *mpi_barrett_t; + +struct barrett_ctx_s { + MPI m; + int m_copied; + int k; + MPI y; + MPI r1; + MPI r2; + MPI r3; +}; + +struct pnp_device_id { + __u8 id[8]; + kernel_ulong_t driver_data; +}; + +struct pnp_card_device_id { + __u8 id[8]; + kernel_ulong_t driver_data; + struct { + __u8 id[8]; + } devs[8]; +}; + +enum { + ATA_MAX_DEVICES = 2, + ATA_MAX_PRD = 256, + ATA_SECT_SIZE = 512, + ATA_MAX_SECTORS_128 = 128, + ATA_MAX_SECTORS = 256, + ATA_MAX_SECTORS_1024 = 1024, + ATA_MAX_SECTORS_LBA48 = 65535, + ATA_MAX_SECTORS_TAPE = 65535, + ATA_MAX_TRIM_RNUM = 64, + ATA_ID_WORDS = 256, + ATA_ID_CONFIG = 0, + ATA_ID_CYLS = 1, + ATA_ID_HEADS = 3, + ATA_ID_SECTORS = 6, + ATA_ID_SERNO = 10, + ATA_ID_BUF_SIZE = 21, + ATA_ID_FW_REV = 23, + ATA_ID_PROD = 27, + ATA_ID_MAX_MULTSECT = 47, + ATA_ID_DWORD_IO = 48, + ATA_ID_TRUSTED = 48, + ATA_ID_CAPABILITY = 49, + ATA_ID_OLD_PIO_MODES = 51, + ATA_ID_OLD_DMA_MODES = 52, + ATA_ID_FIELD_VALID = 53, + ATA_ID_CUR_CYLS = 54, + ATA_ID_CUR_HEADS = 55, + ATA_ID_CUR_SECTORS = 56, + ATA_ID_MULTSECT = 59, + ATA_ID_LBA_CAPACITY = 60, + ATA_ID_SWDMA_MODES = 62, + ATA_ID_MWDMA_MODES = 63, + ATA_ID_PIO_MODES = 64, + ATA_ID_EIDE_DMA_MIN = 65, + ATA_ID_EIDE_DMA_TIME = 66, + ATA_ID_EIDE_PIO = 67, + ATA_ID_EIDE_PIO_IORDY = 68, + ATA_ID_ADDITIONAL_SUPP = 69, + ATA_ID_QUEUE_DEPTH = 75, + ATA_ID_SATA_CAPABILITY = 76, + ATA_ID_SATA_CAPABILITY_2 = 77, + ATA_ID_FEATURE_SUPP = 78, + ATA_ID_MAJOR_VER = 80, + ATA_ID_COMMAND_SET_1 = 82, + ATA_ID_COMMAND_SET_2 = 83, + ATA_ID_CFSSE = 84, + ATA_ID_CFS_ENABLE_1 = 85, + ATA_ID_CFS_ENABLE_2 = 86, + ATA_ID_CSF_DEFAULT = 87, + ATA_ID_UDMA_MODES = 88, + ATA_ID_HW_CONFIG = 93, + ATA_ID_SPG = 98, + ATA_ID_LBA_CAPACITY_2 = 100, + ATA_ID_SECTOR_SIZE = 106, + ATA_ID_WWN = 108, + ATA_ID_LOGICAL_SECTOR_SIZE = 117, + ATA_ID_COMMAND_SET_3 = 119, + ATA_ID_COMMAND_SET_4 = 120, + ATA_ID_LAST_LUN = 126, + ATA_ID_DLF = 128, + ATA_ID_CSFO = 129, + ATA_ID_CFA_POWER = 160, + ATA_ID_CFA_KEY_MGMT = 162, + ATA_ID_CFA_MODES = 163, + ATA_ID_DATA_SET_MGMT = 169, + ATA_ID_SCT_CMD_XPORT = 206, + ATA_ID_ROT_SPEED = 217, + ATA_ID_PIO4 = 2, + ATA_ID_SERNO_LEN = 20, + ATA_ID_FW_REV_LEN = 8, + ATA_ID_PROD_LEN = 40, + ATA_ID_WWN_LEN = 8, + ATA_PCI_CTL_OFS = 2, + ATA_PIO0 = 1, + ATA_PIO1 = 3, + ATA_PIO2 = 7, + ATA_PIO3 = 15, + ATA_PIO4 = 31, + ATA_PIO5 = 63, + ATA_PIO6 = 127, + ATA_PIO4_ONLY = 16, + ATA_SWDMA0 = 1, + ATA_SWDMA1 = 3, + ATA_SWDMA2 = 7, + ATA_SWDMA2_ONLY = 4, + ATA_MWDMA0 = 1, + ATA_MWDMA1 = 3, + ATA_MWDMA2 = 7, + ATA_MWDMA3 = 15, + ATA_MWDMA4 = 31, + ATA_MWDMA12_ONLY = 6, + ATA_MWDMA2_ONLY = 4, + ATA_UDMA0 = 1, + ATA_UDMA1 = 3, + ATA_UDMA2 = 7, + ATA_UDMA3 = 15, + ATA_UDMA4 = 31, + ATA_UDMA5 = 63, + ATA_UDMA6 = 127, + ATA_UDMA7 = 255, + ATA_UDMA24_ONLY = 20, + ATA_UDMA_MASK_40C = 7, + ATA_PRD_SZ = 8, + ATA_PRD_TBL_SZ = 2048, + ATA_PRD_EOT = -2147483648, + ATA_DMA_TABLE_OFS = 4, + ATA_DMA_STATUS = 2, + ATA_DMA_CMD = 0, + ATA_DMA_WR = 8, + ATA_DMA_START = 1, + ATA_DMA_INTR = 4, + ATA_DMA_ERR = 2, + ATA_DMA_ACTIVE = 1, + ATA_HOB = 128, + ATA_NIEN = 2, + ATA_LBA = 64, + ATA_DEV1 = 16, + ATA_DEVICE_OBS = 160, + ATA_DEVCTL_OBS = 8, + ATA_BUSY = 128, + ATA_DRDY = 64, + ATA_DF = 32, + ATA_DSC = 16, + ATA_DRQ = 8, + ATA_CORR = 4, + ATA_SENSE = 2, + ATA_ERR = 1, + ATA_SRST = 4, + ATA_ICRC = 128, + ATA_BBK = 128, + ATA_UNC = 64, + ATA_MC = 32, + ATA_IDNF = 16, + ATA_MCR = 8, + ATA_ABORTED = 4, + ATA_TRK0NF = 2, + ATA_AMNF = 1, + ATAPI_LFS = 240, + ATAPI_EOM = 2, + ATAPI_ILI = 1, + ATAPI_IO = 2, + ATAPI_COD = 1, + ATA_REG_DATA = 0, + ATA_REG_ERR = 1, + ATA_REG_NSECT = 2, + ATA_REG_LBAL = 3, + ATA_REG_LBAM = 4, + ATA_REG_LBAH = 5, + ATA_REG_DEVICE = 6, + ATA_REG_STATUS = 7, + ATA_REG_FEATURE = 1, + ATA_REG_CMD = 7, + ATA_REG_BYTEL = 4, + ATA_REG_BYTEH = 5, + ATA_REG_DEVSEL = 6, + ATA_REG_IRQ = 2, + ATA_CMD_DEV_RESET = 8, + ATA_CMD_CHK_POWER = 229, + ATA_CMD_STANDBY = 226, + ATA_CMD_IDLE = 227, + ATA_CMD_EDD = 144, + ATA_CMD_DOWNLOAD_MICRO = 146, + ATA_CMD_DOWNLOAD_MICRO_DMA = 147, + ATA_CMD_NOP = 0, + ATA_CMD_FLUSH = 231, + ATA_CMD_FLUSH_EXT = 234, + ATA_CMD_ID_ATA = 236, + ATA_CMD_ID_ATAPI = 161, + ATA_CMD_SERVICE = 162, + ATA_CMD_READ = 200, + ATA_CMD_READ_EXT = 37, + ATA_CMD_READ_QUEUED = 38, + ATA_CMD_READ_STREAM_EXT = 43, + ATA_CMD_READ_STREAM_DMA_EXT = 42, + ATA_CMD_WRITE = 202, + ATA_CMD_WRITE_EXT = 53, + ATA_CMD_WRITE_QUEUED = 54, + ATA_CMD_WRITE_STREAM_EXT = 59, + ATA_CMD_WRITE_STREAM_DMA_EXT = 58, + ATA_CMD_WRITE_FUA_EXT = 61, + ATA_CMD_WRITE_QUEUED_FUA_EXT = 62, + ATA_CMD_FPDMA_READ = 96, + ATA_CMD_FPDMA_WRITE = 97, + ATA_CMD_NCQ_NON_DATA = 99, + ATA_CMD_FPDMA_SEND = 100, + ATA_CMD_FPDMA_RECV = 101, + ATA_CMD_PIO_READ = 32, + ATA_CMD_PIO_READ_EXT = 36, + ATA_CMD_PIO_WRITE = 48, + ATA_CMD_PIO_WRITE_EXT = 52, + ATA_CMD_READ_MULTI = 196, + ATA_CMD_READ_MULTI_EXT = 41, + ATA_CMD_WRITE_MULTI = 197, + ATA_CMD_WRITE_MULTI_EXT = 57, + ATA_CMD_WRITE_MULTI_FUA_EXT = 206, + ATA_CMD_SET_FEATURES = 239, + ATA_CMD_SET_MULTI = 198, + ATA_CMD_PACKET = 160, + ATA_CMD_VERIFY = 64, + ATA_CMD_VERIFY_EXT = 66, + ATA_CMD_WRITE_UNCORR_EXT = 69, + ATA_CMD_STANDBYNOW1 = 224, + ATA_CMD_IDLEIMMEDIATE = 225, + ATA_CMD_SLEEP = 230, + ATA_CMD_INIT_DEV_PARAMS = 145, + ATA_CMD_READ_NATIVE_MAX = 248, + ATA_CMD_READ_NATIVE_MAX_EXT = 39, + ATA_CMD_SET_MAX = 249, + ATA_CMD_SET_MAX_EXT = 55, + ATA_CMD_READ_LOG_EXT = 47, + ATA_CMD_WRITE_LOG_EXT = 63, + ATA_CMD_READ_LOG_DMA_EXT = 71, + ATA_CMD_WRITE_LOG_DMA_EXT = 87, + ATA_CMD_TRUSTED_NONDATA = 91, + ATA_CMD_TRUSTED_RCV = 92, + ATA_CMD_TRUSTED_RCV_DMA = 93, + ATA_CMD_TRUSTED_SND = 94, + ATA_CMD_TRUSTED_SND_DMA = 95, + ATA_CMD_PMP_READ = 228, + ATA_CMD_PMP_READ_DMA = 233, + ATA_CMD_PMP_WRITE = 232, + ATA_CMD_PMP_WRITE_DMA = 235, + ATA_CMD_CONF_OVERLAY = 177, + ATA_CMD_SEC_SET_PASS = 241, + ATA_CMD_SEC_UNLOCK = 242, + ATA_CMD_SEC_ERASE_PREP = 243, + ATA_CMD_SEC_ERASE_UNIT = 244, + ATA_CMD_SEC_FREEZE_LOCK = 245, + ATA_CMD_SEC_DISABLE_PASS = 246, + ATA_CMD_CONFIG_STREAM = 81, + ATA_CMD_SMART = 176, + ATA_CMD_MEDIA_LOCK = 222, + ATA_CMD_MEDIA_UNLOCK = 223, + ATA_CMD_DSM = 6, + ATA_CMD_CHK_MED_CRD_TYP = 209, + ATA_CMD_CFA_REQ_EXT_ERR = 3, + ATA_CMD_CFA_WRITE_NE = 56, + ATA_CMD_CFA_TRANS_SECT = 135, + ATA_CMD_CFA_ERASE = 192, + ATA_CMD_CFA_WRITE_MULT_NE = 205, + ATA_CMD_REQ_SENSE_DATA = 11, + ATA_CMD_SANITIZE_DEVICE = 180, + ATA_CMD_ZAC_MGMT_IN = 74, + ATA_CMD_ZAC_MGMT_OUT = 159, + ATA_CMD_RESTORE = 16, + ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT = 1, + ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN = 2, + ATA_SUBCMD_FPDMA_SEND_DSM = 0, + ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT = 2, + ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE = 0, + ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES = 5, + ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT = 6, + ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT = 7, + ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES = 0, + ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE = 1, + ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE = 2, + ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE = 3, + ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER = 4, + ATA_LOG_DIRECTORY = 0, + ATA_LOG_SATA_NCQ = 16, + ATA_LOG_NCQ_NON_DATA = 18, + ATA_LOG_NCQ_SEND_RECV = 19, + ATA_LOG_IDENTIFY_DEVICE = 48, + ATA_LOG_CONCURRENT_POSITIONING_RANGES = 71, + ATA_LOG_SECURITY = 6, + ATA_LOG_SATA_SETTINGS = 8, + ATA_LOG_ZONED_INFORMATION = 9, + ATA_LOG_DEVSLP_OFFSET = 48, + ATA_LOG_DEVSLP_SIZE = 8, + ATA_LOG_DEVSLP_MDAT = 0, + ATA_LOG_DEVSLP_MDAT_MASK = 31, + ATA_LOG_DEVSLP_DETO = 1, + ATA_LOG_DEVSLP_VALID = 7, + ATA_LOG_DEVSLP_VALID_MASK = 128, + ATA_LOG_NCQ_PRIO_OFFSET = 9, + ATA_LOG_NCQ_SEND_RECV_SUBCMDS_OFFSET = 0, + ATA_LOG_NCQ_SEND_RECV_SUBCMDS_DSM = 1, + ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET = 4, + ATA_LOG_NCQ_SEND_RECV_DSM_TRIM = 1, + ATA_LOG_NCQ_SEND_RECV_RD_LOG_OFFSET = 8, + ATA_LOG_NCQ_SEND_RECV_RD_LOG_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_WR_LOG_OFFSET = 12, + ATA_LOG_NCQ_SEND_RECV_WR_LOG_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OFFSET = 16, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OUT_SUPPORTED = 1, + ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_IN_SUPPORTED = 2, + ATA_LOG_NCQ_SEND_RECV_SIZE = 20, + ATA_LOG_NCQ_NON_DATA_SUBCMDS_OFFSET = 0, + ATA_LOG_NCQ_NON_DATA_ABORT_OFFSET = 0, + ATA_LOG_NCQ_NON_DATA_ABORT_NCQ = 1, + ATA_LOG_NCQ_NON_DATA_ABORT_ALL = 2, + ATA_LOG_NCQ_NON_DATA_ABORT_STREAMING = 4, + ATA_LOG_NCQ_NON_DATA_ABORT_NON_STREAMING = 8, + ATA_LOG_NCQ_NON_DATA_ABORT_SELECTED = 16, + ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET = 28, + ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT = 1, + ATA_LOG_NCQ_NON_DATA_SIZE = 64, + ATA_CMD_READ_LONG = 34, + ATA_CMD_READ_LONG_ONCE = 35, + ATA_CMD_WRITE_LONG = 50, + ATA_CMD_WRITE_LONG_ONCE = 51, + SETFEATURES_XFER = 3, + XFER_UDMA_7 = 71, + XFER_UDMA_6 = 70, + XFER_UDMA_5 = 69, + XFER_UDMA_4 = 68, + XFER_UDMA_3 = 67, + XFER_UDMA_2 = 66, + XFER_UDMA_1 = 65, + XFER_UDMA_0 = 64, + XFER_MW_DMA_4 = 36, + XFER_MW_DMA_3 = 35, + XFER_MW_DMA_2 = 34, + XFER_MW_DMA_1 = 33, + XFER_MW_DMA_0 = 32, + XFER_SW_DMA_2 = 18, + XFER_SW_DMA_1 = 17, + XFER_SW_DMA_0 = 16, + XFER_PIO_6 = 14, + XFER_PIO_5 = 13, + XFER_PIO_4 = 12, + XFER_PIO_3 = 11, + XFER_PIO_2 = 10, + XFER_PIO_1 = 9, + XFER_PIO_0 = 8, + XFER_PIO_SLOW = 0, + SETFEATURES_WC_ON = 2, + SETFEATURES_WC_OFF = 130, + SETFEATURES_RA_ON = 170, + SETFEATURES_RA_OFF = 85, + SETFEATURES_AAM_ON = 66, + SETFEATURES_AAM_OFF = 194, + SETFEATURES_SPINUP = 7, + SETFEATURES_SPINUP_TIMEOUT = 30000, + SETFEATURES_SATA_ENABLE = 16, + SETFEATURES_SATA_DISABLE = 144, + SATA_FPDMA_OFFSET = 1, + SATA_FPDMA_AA = 2, + SATA_DIPM = 3, + SATA_FPDMA_IN_ORDER = 4, + SATA_AN = 5, + SATA_SSP = 6, + SATA_DEVSLP = 9, + SETFEATURE_SENSE_DATA = 195, + ATA_SET_MAX_ADDR = 0, + ATA_SET_MAX_PASSWD = 1, + ATA_SET_MAX_LOCK = 2, + ATA_SET_MAX_UNLOCK = 3, + ATA_SET_MAX_FREEZE_LOCK = 4, + ATA_SET_MAX_PASSWD_DMA = 5, + ATA_SET_MAX_UNLOCK_DMA = 6, + ATA_DCO_RESTORE = 192, + ATA_DCO_FREEZE_LOCK = 193, + ATA_DCO_IDENTIFY = 194, + ATA_DCO_SET = 195, + ATA_SMART_ENABLE = 216, + ATA_SMART_READ_VALUES = 208, + ATA_SMART_READ_THRESHOLDS = 209, + ATA_DSM_TRIM = 1, + ATA_SMART_LBAM_PASS = 79, + ATA_SMART_LBAH_PASS = 194, + ATAPI_PKT_DMA = 1, + ATAPI_DMADIR = 4, + ATAPI_CDB_LEN = 16, + SATA_PMP_MAX_PORTS = 15, + SATA_PMP_CTRL_PORT = 15, + SATA_PMP_GSCR_DWORDS = 128, + SATA_PMP_GSCR_PROD_ID = 0, + SATA_PMP_GSCR_REV = 1, + SATA_PMP_GSCR_PORT_INFO = 2, + SATA_PMP_GSCR_ERROR = 32, + SATA_PMP_GSCR_ERROR_EN = 33, + SATA_PMP_GSCR_FEAT = 64, + SATA_PMP_GSCR_FEAT_EN = 96, + SATA_PMP_PSCR_STATUS = 0, + SATA_PMP_PSCR_ERROR = 1, + SATA_PMP_PSCR_CONTROL = 2, + SATA_PMP_FEAT_BIST = 1, + SATA_PMP_FEAT_PMREQ = 2, + SATA_PMP_FEAT_DYNSSC = 4, + SATA_PMP_FEAT_NOTIFY = 8, + ATA_CBL_NONE = 0, + ATA_CBL_PATA40 = 1, + ATA_CBL_PATA80 = 2, + ATA_CBL_PATA40_SHORT = 3, + ATA_CBL_PATA_UNK = 4, + ATA_CBL_PATA_IGN = 5, + ATA_CBL_SATA = 6, + SCR_STATUS = 0, + SCR_ERROR = 1, + SCR_CONTROL = 2, + SCR_ACTIVE = 3, + SCR_NOTIFICATION = 4, + SERR_DATA_RECOVERED = 1, + SERR_COMM_RECOVERED = 2, + SERR_DATA = 256, + SERR_PERSISTENT = 512, + SERR_PROTOCOL = 1024, + SERR_INTERNAL = 2048, + SERR_PHYRDY_CHG = 65536, + SERR_PHY_INT_ERR = 131072, + SERR_COMM_WAKE = 262144, + SERR_10B_8B_ERR = 524288, + SERR_DISPARITY = 1048576, + SERR_CRC = 2097152, + SERR_HANDSHAKE = 4194304, + SERR_LINK_SEQ_ERR = 8388608, + SERR_TRANS_ST_ERROR = 16777216, + SERR_UNRECOG_FIS = 33554432, + SERR_DEV_XCHG = 67108864, +}; + +enum { + LIBATA_MAX_PRD = 128, + LIBATA_DUMB_MAX_PRD = 64, + ATA_DEF_QUEUE = 1, + ATA_MAX_QUEUE = 32, + ATA_TAG_INTERNAL = 32, + ATA_SHORT_PAUSE = 16, + ATAPI_MAX_DRAIN = 16384, + ATA_ALL_DEVICES = 3, + ATA_SHT_EMULATED = 1, + ATA_SHT_THIS_ID = -1, + ATA_TFLAG_LBA48 = 1, + ATA_TFLAG_ISADDR = 2, + ATA_TFLAG_DEVICE = 4, + ATA_TFLAG_WRITE = 8, + ATA_TFLAG_LBA = 16, + ATA_TFLAG_FUA = 32, + ATA_TFLAG_POLLING = 64, + ATA_DFLAG_LBA = 1, + ATA_DFLAG_LBA48 = 2, + ATA_DFLAG_CDB_INTR = 4, + ATA_DFLAG_NCQ = 8, + ATA_DFLAG_FLUSH_EXT = 16, + ATA_DFLAG_ACPI_PENDING = 32, + ATA_DFLAG_ACPI_FAILED = 64, + ATA_DFLAG_AN = 128, + ATA_DFLAG_TRUSTED = 256, + ATA_DFLAG_DMADIR = 1024, + ATA_DFLAG_CFG_MASK = 4095, + ATA_DFLAG_PIO = 4096, + ATA_DFLAG_NCQ_OFF = 8192, + ATA_DFLAG_SLEEPING = 32768, + ATA_DFLAG_DUBIOUS_XFER = 65536, + ATA_DFLAG_NO_UNLOAD = 131072, + ATA_DFLAG_UNLOCK_HPA = 262144, + ATA_DFLAG_NCQ_SEND_RECV = 524288, + ATA_DFLAG_NCQ_PRIO = 1048576, + ATA_DFLAG_NCQ_PRIO_ENABLED = 2097152, + ATA_DFLAG_INIT_MASK = 16777215, + ATA_DFLAG_DETACH = 16777216, + ATA_DFLAG_DETACHED = 33554432, + ATA_DFLAG_DA = 67108864, + ATA_DFLAG_DEVSLP = 134217728, + ATA_DFLAG_ACPI_DISABLED = 268435456, + ATA_DFLAG_D_SENSE = 536870912, + ATA_DFLAG_ZAC = 1073741824, + ATA_DFLAG_FEATURES_MASK = 202899712, + ATA_DEV_UNKNOWN = 0, + ATA_DEV_ATA = 1, + ATA_DEV_ATA_UNSUP = 2, + ATA_DEV_ATAPI = 3, + ATA_DEV_ATAPI_UNSUP = 4, + ATA_DEV_PMP = 5, + ATA_DEV_PMP_UNSUP = 6, + ATA_DEV_SEMB = 7, + ATA_DEV_SEMB_UNSUP = 8, + ATA_DEV_ZAC = 9, + ATA_DEV_ZAC_UNSUP = 10, + ATA_DEV_NONE = 11, + ATA_LFLAG_NO_HRST = 2, + ATA_LFLAG_NO_SRST = 4, + ATA_LFLAG_ASSUME_ATA = 8, + ATA_LFLAG_ASSUME_SEMB = 16, + ATA_LFLAG_ASSUME_CLASS = 24, + ATA_LFLAG_NO_RETRY = 32, + ATA_LFLAG_DISABLED = 64, + ATA_LFLAG_SW_ACTIVITY = 128, + ATA_LFLAG_NO_LPM = 256, + ATA_LFLAG_RST_ONCE = 512, + ATA_LFLAG_CHANGED = 1024, + ATA_LFLAG_NO_DEBOUNCE_DELAY = 2048, + ATA_FLAG_SLAVE_POSS = 1, + ATA_FLAG_SATA = 2, + ATA_FLAG_NO_LPM = 4, + ATA_FLAG_NO_LOG_PAGE = 32, + ATA_FLAG_NO_ATAPI = 64, + ATA_FLAG_PIO_DMA = 128, + ATA_FLAG_PIO_LBA48 = 256, + ATA_FLAG_PIO_POLLING = 512, + ATA_FLAG_NCQ = 1024, + ATA_FLAG_NO_POWEROFF_SPINDOWN = 2048, + ATA_FLAG_NO_HIBERNATE_SPINDOWN = 4096, + ATA_FLAG_DEBUGMSG = 8192, + ATA_FLAG_FPDMA_AA = 16384, + ATA_FLAG_IGN_SIMPLEX = 32768, + ATA_FLAG_NO_IORDY = 65536, + ATA_FLAG_ACPI_SATA = 131072, + ATA_FLAG_AN = 262144, + ATA_FLAG_PMP = 524288, + ATA_FLAG_FPDMA_AUX = 1048576, + ATA_FLAG_EM = 2097152, + ATA_FLAG_SW_ACTIVITY = 4194304, + ATA_FLAG_NO_DIPM = 8388608, + ATA_FLAG_SAS_HOST = 16777216, + ATA_PFLAG_EH_PENDING = 1, + ATA_PFLAG_EH_IN_PROGRESS = 2, + ATA_PFLAG_FROZEN = 4, + ATA_PFLAG_RECOVERED = 8, + ATA_PFLAG_LOADING = 16, + ATA_PFLAG_SCSI_HOTPLUG = 64, + ATA_PFLAG_INITIALIZING = 128, + ATA_PFLAG_RESETTING = 256, + ATA_PFLAG_UNLOADING = 512, + ATA_PFLAG_UNLOADED = 1024, + ATA_PFLAG_SUSPENDED = 131072, + ATA_PFLAG_PM_PENDING = 262144, + ATA_PFLAG_INIT_GTM_VALID = 524288, + ATA_PFLAG_PIO32 = 1048576, + ATA_PFLAG_PIO32CHANGE = 2097152, + ATA_PFLAG_EXTERNAL = 4194304, + ATA_QCFLAG_ACTIVE = 1, + ATA_QCFLAG_DMAMAP = 2, + ATA_QCFLAG_IO = 8, + ATA_QCFLAG_RESULT_TF = 16, + ATA_QCFLAG_CLEAR_EXCL = 32, + ATA_QCFLAG_QUIET = 64, + ATA_QCFLAG_RETRY = 128, + ATA_QCFLAG_FAILED = 65536, + ATA_QCFLAG_SENSE_VALID = 131072, + ATA_QCFLAG_EH_SCHEDULED = 262144, + ATA_HOST_SIMPLEX = 1, + ATA_HOST_STARTED = 2, + ATA_HOST_PARALLEL_SCAN = 4, + ATA_HOST_IGNORE_ATA = 8, + ATA_TMOUT_BOOT = 30000, + ATA_TMOUT_BOOT_QUICK = 7000, + ATA_TMOUT_INTERNAL_QUICK = 5000, + ATA_TMOUT_MAX_PARK = 30000, + ATA_TMOUT_FF_WAIT_LONG = 2000, + ATA_TMOUT_FF_WAIT = 800, + ATA_WAIT_AFTER_RESET = 150, + ATA_TMOUT_PMP_SRST_WAIT = 5000, + ATA_TMOUT_SPURIOUS_PHY = 10000, + BUS_UNKNOWN = 0, + BUS_DMA = 1, + BUS_IDLE = 2, + BUS_NOINTR = 3, + BUS_NODATA = 4, + BUS_TIMER = 5, + BUS_PIO = 6, + BUS_EDD = 7, + BUS_IDENTIFY = 8, + BUS_PACKET = 9, + PORT_UNKNOWN = 0, + PORT_ENABLED = 1, + PORT_DISABLED = 2, + ATA_NR_PIO_MODES = 7, + ATA_NR_MWDMA_MODES = 5, + ATA_NR_UDMA_MODES = 8, + ATA_SHIFT_PIO = 0, + ATA_SHIFT_MWDMA = 7, + ATA_SHIFT_UDMA = 12, + ATA_SHIFT_PRIO = 6, + ATA_PRIO_HIGH = 2, + ATA_DMA_PAD_SZ = 4, + ATA_ERING_SIZE = 32, + ATA_DEFER_LINK = 1, + ATA_DEFER_PORT = 2, + ATA_EH_DESC_LEN = 80, + ATA_EH_REVALIDATE = 1, + ATA_EH_SOFTRESET = 2, + ATA_EH_HARDRESET = 4, + ATA_EH_RESET = 6, + ATA_EH_ENABLE_LINK = 8, + ATA_EH_PARK = 32, + ATA_EH_PERDEV_MASK = 33, + ATA_EH_ALL_ACTIONS = 15, + ATA_EHI_HOTPLUGGED = 1, + ATA_EHI_NO_AUTOPSY = 4, + ATA_EHI_QUIET = 8, + ATA_EHI_NO_RECOVERY = 16, + ATA_EHI_DID_SOFTRESET = 65536, + ATA_EHI_DID_HARDRESET = 131072, + ATA_EHI_PRINTINFO = 262144, + ATA_EHI_SETMODE = 524288, + ATA_EHI_POST_SETMODE = 1048576, + ATA_EHI_DID_RESET = 196608, + ATA_EHI_TO_SLAVE_MASK = 12, + ATA_EH_MAX_TRIES = 5, + ATA_LINK_RESUME_TRIES = 5, + ATA_PROBE_MAX_TRIES = 3, + ATA_EH_DEV_TRIES = 3, + ATA_EH_PMP_TRIES = 5, + ATA_EH_PMP_LINK_TRIES = 3, + SATA_PMP_RW_TIMEOUT = 3000, + ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 7, + ATA_HORKAGE_DIAGNOSTIC = 1, + ATA_HORKAGE_NODMA = 2, + ATA_HORKAGE_NONCQ = 4, + ATA_HORKAGE_MAX_SEC_128 = 8, + ATA_HORKAGE_BROKEN_HPA = 16, + ATA_HORKAGE_DISABLE = 32, + ATA_HORKAGE_HPA_SIZE = 64, + ATA_HORKAGE_IVB = 256, + ATA_HORKAGE_STUCK_ERR = 512, + ATA_HORKAGE_BRIDGE_OK = 1024, + ATA_HORKAGE_ATAPI_MOD16_DMA = 2048, + ATA_HORKAGE_FIRMWARE_WARN = 4096, + ATA_HORKAGE_1_5_GBPS = 8192, + ATA_HORKAGE_NOSETXFER = 16384, + ATA_HORKAGE_BROKEN_FPDMA_AA = 32768, + ATA_HORKAGE_DUMP_ID = 65536, + ATA_HORKAGE_MAX_SEC_LBA48 = 131072, + ATA_HORKAGE_ATAPI_DMADIR = 262144, + ATA_HORKAGE_NO_NCQ_TRIM = 524288, + ATA_HORKAGE_NOLPM = 1048576, + ATA_HORKAGE_WD_BROKEN_LPM = 2097152, + ATA_HORKAGE_ZERO_AFTER_TRIM = 4194304, + ATA_HORKAGE_NO_DMA_LOG = 8388608, + ATA_HORKAGE_NOTRIM = 16777216, + ATA_HORKAGE_MAX_SEC_1024 = 33554432, + ATA_HORKAGE_MAX_TRIM_128M = 67108864, + ATA_HORKAGE_NO_NCQ_ON_ATI = 134217728, + ATA_HORKAGE_NO_ID_DEV_LOG = 268435456, + ATA_HORKAGE_NO_LOG_DIR = 536870912, + ATA_DMA_MASK_ATA = 1, + ATA_DMA_MASK_ATAPI = 2, + ATA_DMA_MASK_CFA = 4, + ATAPI_READ = 0, + ATAPI_WRITE = 1, + ATAPI_READ_CD = 2, + ATAPI_PASS_THRU = 3, + ATAPI_MISC = 4, + ATA_TIMING_SETUP = 1, + ATA_TIMING_ACT8B = 2, + ATA_TIMING_REC8B = 4, + ATA_TIMING_CYC8B = 8, + ATA_TIMING_8BIT = 14, + ATA_TIMING_ACTIVE = 16, + ATA_TIMING_RECOVER = 32, + ATA_TIMING_DMACK_HOLD = 64, + ATA_TIMING_CYCLE = 128, + ATA_TIMING_UDMA = 256, + ATA_TIMING_ALL = 511, + ATA_ACPI_FILTER_SETXFER = 1, + ATA_ACPI_FILTER_LOCK = 2, + ATA_ACPI_FILTER_DIPM = 4, + ATA_ACPI_FILTER_FPDMA_OFFSET = 8, + ATA_ACPI_FILTER_FPDMA_AA = 16, + ATA_ACPI_FILTER_DEFAULT = 7, +}; + +struct pnp_protocol; + +struct pnp_id; + +struct pnp_card { + struct device dev; + unsigned char number; + struct list_head global_list; + struct list_head protocol_list; + struct list_head devices; + struct pnp_protocol *protocol; + struct pnp_id *id; + char name[50]; + unsigned char pnpver; + unsigned char productver; + unsigned int serial; + unsigned char checksum; + struct proc_dir_entry *procdir; +}; + +struct pnp_dev; + +struct pnp_protocol { + struct list_head protocol_list; + char *name; + int (*get)(struct pnp_dev *); + int (*set)(struct pnp_dev *); + int (*disable)(struct pnp_dev *); + bool (*can_wakeup)(struct pnp_dev *); + int (*suspend)(struct pnp_dev *, pm_message_t); + int (*resume)(struct pnp_dev *); + unsigned char number; + struct device dev; + struct list_head cards; + struct list_head devices; +}; + +struct pnp_id { + char id[8]; + struct pnp_id *next; +}; + +struct pnp_card_driver; + +struct pnp_card_link { + struct pnp_card *card; + struct pnp_card_driver *driver; + void *driver_data; + pm_message_t pm_state; +}; + +struct pnp_driver { + const char *name; + const struct pnp_device_id *id_table; + unsigned int flags; + int (*probe)(struct pnp_dev *, const struct pnp_device_id *); + void (*remove)(struct pnp_dev *); + void (*shutdown)(struct pnp_dev *); + int (*suspend)(struct pnp_dev *, pm_message_t); + int (*resume)(struct pnp_dev *); + struct device_driver driver; +}; + +struct pnp_card_driver { + struct list_head global_list; + char *name; + const struct pnp_card_device_id *id_table; + unsigned int flags; + int (*probe)(struct pnp_card_link *, const struct pnp_card_device_id *); + void (*remove)(struct pnp_card_link *); + int (*suspend)(struct pnp_card_link *, pm_message_t); + int (*resume)(struct pnp_card_link *); + struct pnp_driver link; +}; + +struct pnp_dev { + struct device dev; + u64 dma_mask; + unsigned int number; + int status; + struct list_head global_list; + struct list_head protocol_list; + struct list_head card_list; + struct list_head rdev_list; + struct pnp_protocol *protocol; + struct pnp_card *card; + struct pnp_driver *driver; + struct pnp_card_link *card_link; + struct pnp_id *id; + int active; + int capabilities; + unsigned int num_dependent_sets; + struct list_head resources; + struct list_head options; + char name[50]; + int flags; + struct proc_dir_entry *procent; + void *data; +}; + +struct pnp_port { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t size; + unsigned char flags; +}; + +typedef struct { + long unsigned int bits[4]; +} pnp_irq_mask_t; + +struct pnp_irq { + pnp_irq_mask_t map; + unsigned char flags; +}; + +struct pnp_dma { + unsigned char map; + unsigned char flags; +}; + +struct pnp_mem { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t size; + unsigned char flags; +}; + +struct pnp_option { + struct list_head list; + unsigned int flags; + long unsigned int type; + union { + struct pnp_port port; + struct pnp_irq irq; + struct pnp_dma dma; + struct pnp_mem mem; + } u; +}; + +struct pnp_resource { + struct list_head list; + struct resource res; +}; + +typedef void * (*devcon_match_fn_t)(struct fwnode_handle *, const char *, void *); + +struct seq_net_private { + struct net *net; + netns_tracker ns_tracker; +}; + +enum { + NDA_UNSPEC = 0, + NDA_DST = 1, + NDA_LLADDR = 2, + NDA_CACHEINFO = 3, + NDA_PROBES = 4, + NDA_VLAN = 5, + NDA_PORT = 6, + NDA_VNI = 7, + NDA_IFINDEX = 8, + NDA_MASTER = 9, + NDA_LINK_NETNSID = 10, + NDA_SRC_VNI = 11, + NDA_PROTOCOL = 12, + NDA_NH_ID = 13, + NDA_FDB_EXT_ATTRS = 14, + NDA_FLAGS_EXT = 15, + NDA_NDM_STATE_MASK = 16, + NDA_NDM_FLAGS_MASK = 17, + __NDA_MAX = 18, +}; + +struct nda_cacheinfo { + __u32 ndm_confirmed; + __u32 ndm_used; + __u32 ndm_updated; + __u32 ndm_refcnt; +}; + +struct ndt_stats { + __u64 ndts_allocs; + __u64 ndts_destroys; + __u64 ndts_hash_grows; + __u64 ndts_res_failed; + __u64 ndts_lookups; + __u64 ndts_hits; + __u64 ndts_rcv_probes_mcast; + __u64 ndts_rcv_probes_ucast; + __u64 ndts_periodic_gc_runs; + __u64 ndts_forced_gc_runs; + __u64 ndts_table_fulls; +}; + +enum { + NDTPA_UNSPEC = 0, + NDTPA_IFINDEX = 1, + NDTPA_REFCNT = 2, + NDTPA_REACHABLE_TIME = 3, + NDTPA_BASE_REACHABLE_TIME = 4, + NDTPA_RETRANS_TIME = 5, + NDTPA_GC_STALETIME = 6, + NDTPA_DELAY_PROBE_TIME = 7, + NDTPA_QUEUE_LEN = 8, + NDTPA_APP_PROBES = 9, + NDTPA_UCAST_PROBES = 10, + NDTPA_MCAST_PROBES = 11, + NDTPA_ANYCAST_DELAY = 12, + NDTPA_PROXY_DELAY = 13, + NDTPA_PROXY_QLEN = 14, + NDTPA_LOCKTIME = 15, + NDTPA_QUEUE_LENBYTES = 16, + NDTPA_MCAST_REPROBES = 17, + NDTPA_PAD = 18, + NDTPA_INTERVAL_PROBE_TIME_MS = 19, + __NDTPA_MAX = 20, +}; + +struct ndtmsg { + __u8 ndtm_family; + __u8 ndtm_pad1; + __u16 ndtm_pad2; +}; + +struct ndt_config { + __u16 ndtc_key_len; + __u16 ndtc_entry_size; + __u32 ndtc_entries; + __u32 ndtc_last_flush; + __u32 ndtc_last_rand; + __u32 ndtc_hash_rnd; + __u32 ndtc_hash_mask; + __u32 ndtc_hash_chain_gc; + __u32 ndtc_proxy_qlen; +}; + +enum { + NDTA_UNSPEC = 0, + NDTA_NAME = 1, + NDTA_THRESH1 = 2, + NDTA_THRESH2 = 3, + NDTA_THRESH3 = 4, + NDTA_CONFIG = 5, + NDTA_PARMS = 6, + NDTA_STATS = 7, + NDTA_GC_INTERVAL = 8, + NDTA_PAD = 9, + __NDTA_MAX = 10, +}; + +enum { + RTN_UNSPEC = 0, + RTN_UNICAST = 1, + RTN_LOCAL = 2, + RTN_BROADCAST = 3, + RTN_ANYCAST = 4, + RTN_MULTICAST = 5, + RTN_BLACKHOLE = 6, + RTN_UNREACHABLE = 7, + RTN_PROHIBIT = 8, + RTN_THROW = 9, + RTN_NAT = 10, + RTN_XRESOLVE = 11, + __RTN_MAX = 12, +}; + +struct rtgenmsg { + unsigned char rtgen_family; +}; + +enum nla_policy_validation { + NLA_VALIDATE_NONE = 0, + NLA_VALIDATE_RANGE = 1, + NLA_VALIDATE_RANGE_WARN_TOO_LONG = 2, + NLA_VALIDATE_MIN = 3, + NLA_VALIDATE_MAX = 4, + NLA_VALIDATE_MASK = 5, + NLA_VALIDATE_RANGE_PTR = 6, + NLA_VALIDATE_FUNCTION = 7, +}; + +enum { + NEIGH_ARP_TABLE = 0, + NEIGH_ND_TABLE = 1, + NEIGH_DN_TABLE = 2, + NEIGH_NR_TABLES = 3, + NEIGH_LINK_TABLE = 3, +}; + +struct neigh_seq_state { + struct seq_net_private p; + struct neigh_table *tbl; + struct neigh_hash_table *nht; + void * (*neigh_sub_iter)(struct neigh_seq_state *, struct neighbour *, loff_t *); + unsigned int bucket; + unsigned int flags; +}; + +struct neighbour_cb { + long unsigned int sched_next; + unsigned int flags; +}; + +enum netevent_notif_type { + NETEVENT_NEIGH_UPDATE = 1, + NETEVENT_REDIRECT = 2, + NETEVENT_DELAY_PROBE_TIME_UPDATE = 3, + NETEVENT_IPV4_MPATH_HASH_UPDATE = 4, + NETEVENT_IPV6_MPATH_HASH_UPDATE = 5, + NETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE = 6, +}; + +struct neigh_dump_filter { + int master_idx; + int dev_idx; +}; + +struct neigh_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table neigh_vars[22]; +}; + +enum umh_disable_depth { + UMH_ENABLED = 0, + UMH_FREEZING = 1, + UMH_DISABLED = 2, +}; + +typedef u64 async_cookie_t; + +typedef void (*async_func_t)(void *, async_cookie_t); + +struct async_domain { + struct list_head pending; + unsigned int registered: 1; +}; + +struct hash { + int ino; + int minor; + int major; + umode_t mode; + struct hash *next; + char name[4098]; +}; + +struct dir_entry { + struct list_head list; + time64_t mtime; + char name[0]; +}; + +enum state { + Start = 0, + Collect = 1, + GotHeader = 2, + SkipIt = 3, + GotName = 4, + CopyFile = 5, + GotSymlink = 6, + Reset = 7, +}; + +enum { + MEMREMAP_WB = 1, + MEMREMAP_WT = 2, + MEMREMAP_WC = 4, + MEMREMAP_ENC = 8, + MEMREMAP_DEC = 16, +}; + +struct dma_coherent_mem { + void *virt_base; + dma_addr_t device_base; + long unsigned int pfn_base; + int size; + long unsigned int *bitmap; + spinlock_t spinlock; + bool use_dev_dma_pfn_offset; +}; + +struct reserved_mem_ops; + +struct reserved_mem { + const char *name; + long unsigned int fdt_node; + long unsigned int phandle; + const struct reserved_mem_ops *ops; + phys_addr_t base; + phys_addr_t size; + void *priv; +}; + +struct reserved_mem_ops { + int (*device_init)(struct reserved_mem *, struct device *); + void (*device_release)(struct reserved_mem *, struct device *); +}; + +typedef int (*reservedmem_of_init_fn)(struct reserved_mem *); + +enum ftrace_dump_mode { + DUMP_NONE = 0, + DUMP_ALL = 1, + DUMP_ORIG = 2, +}; + +enum { + TRACE_FTRACE_BIT = 0, + TRACE_FTRACE_NMI_BIT = 1, + TRACE_FTRACE_IRQ_BIT = 2, + TRACE_FTRACE_SIRQ_BIT = 3, + TRACE_FTRACE_TRANSITION_BIT = 4, + TRACE_INTERNAL_BIT = 5, + TRACE_INTERNAL_NMI_BIT = 6, + TRACE_INTERNAL_IRQ_BIT = 7, + TRACE_INTERNAL_SIRQ_BIT = 8, + TRACE_INTERNAL_TRANSITION_BIT = 9, + TRACE_BRANCH_BIT = 10, + TRACE_IRQ_BIT = 11, + TRACE_GRAPH_BIT = 12, + TRACE_GRAPH_DEPTH_START_BIT = 13, + TRACE_GRAPH_DEPTH_END_BIT = 14, + TRACE_GRAPH_NOTRACE_BIT = 15, + TRACE_RECORD_RECURSION_BIT = 16, +}; + +enum { + TRACE_CTX_NMI = 0, + TRACE_CTX_IRQ = 1, + TRACE_CTX_SOFTIRQ = 2, + TRACE_CTX_NORMAL = 3, + TRACE_CTX_TRANSITION = 4, +}; + +enum { + FTRACE_OPS_FL_ENABLED = 1, + FTRACE_OPS_FL_DYNAMIC = 2, + FTRACE_OPS_FL_SAVE_REGS = 4, + FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED = 8, + FTRACE_OPS_FL_RECURSION = 16, + FTRACE_OPS_FL_STUB = 32, + FTRACE_OPS_FL_INITIALIZED = 64, + FTRACE_OPS_FL_DELETED = 128, + FTRACE_OPS_FL_ADDING = 256, + FTRACE_OPS_FL_REMOVING = 512, + FTRACE_OPS_FL_MODIFYING = 1024, + FTRACE_OPS_FL_ALLOC_TRAMP = 2048, + FTRACE_OPS_FL_IPMODIFY = 4096, + FTRACE_OPS_FL_PID = 8192, + FTRACE_OPS_FL_RCU = 16384, + FTRACE_OPS_FL_TRACE_ARRAY = 32768, + FTRACE_OPS_FL_PERMANENT = 65536, + FTRACE_OPS_FL_DIRECT = 131072, +}; + +struct ftrace_hash { + long unsigned int size_bits; + struct hlist_head *buckets; + long unsigned int count; + long unsigned int flags; + struct callback_head rcu; +}; + +struct prog_entry; + +struct event_filter { + struct prog_entry *prog; + char *filter_string; +}; + +struct trace_array_cpu; + +struct array_buffer { + struct trace_array *tr; + struct trace_buffer *buffer; + struct trace_array_cpu *data; + u64 time_start; + int cpu; +}; + +struct trace_pid_list; + +struct trace_options; + +struct trace_func_repeats; + +struct trace_array { + struct list_head list; + char *name; + struct array_buffer array_buffer; + struct trace_pid_list *filtered_pids; + struct trace_pid_list *filtered_no_pids; + arch_spinlock_t max_lock; + int buffer_disabled; + int sys_refcount_enter; + int sys_refcount_exit; + struct trace_event_file *enter_syscall_files[451]; + struct trace_event_file *exit_syscall_files[451]; + int stop_count; + int clock_id; + int nr_topts; + bool clear_trace; + int buffer_percent; + unsigned int n_err_log_entries; + struct tracer *current_trace; + unsigned int trace_flags; + unsigned char trace_flags_index[32]; + unsigned int flags; + raw_spinlock_t start_lock; + struct list_head err_log; + struct dentry *dir; + struct dentry *options; + struct dentry *percpu_dir; + struct dentry *event_dir; + struct trace_options *topts; + struct list_head systems; + struct list_head events; + struct trace_event_file *trace_marker_file; + cpumask_var_t tracing_cpumask; + int ref; + int trace_ref; + struct ftrace_ops *ops; + struct trace_pid_list *function_pids; + struct trace_pid_list *function_no_pids; + struct list_head func_probes; + struct list_head mod_trace; + struct list_head mod_notrace; + int function_enabled; + int no_filter_buffering_ref; + struct list_head hist_vars; + struct trace_func_repeats *last_func_repeats; +}; + +struct tracer_flags; + +struct tracer { + const char *name; + int (*init)(struct trace_array *); + void (*reset)(struct trace_array *); + void (*start)(struct trace_array *); + void (*stop)(struct trace_array *); + int (*update_thresh)(struct trace_array *); + void (*open)(struct trace_iterator *); + void (*pipe_open)(struct trace_iterator *); + void (*close)(struct trace_iterator *); + void (*pipe_close)(struct trace_iterator *); + ssize_t (*read)(struct trace_iterator *, struct file *, char *, size_t, loff_t *); + ssize_t (*splice_read)(struct trace_iterator *, struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); + void (*print_header)(struct seq_file *); + enum print_line_t (*print_line)(struct trace_iterator *); + int (*set_flag)(struct trace_array *, u32, u32, int); + int (*flag_changed)(struct trace_array *, u32, int); + struct tracer *next; + struct tracer_flags *flags; + int enabled; + bool print_max; + bool allow_instances; + bool noboot; +}; + +enum trace_flag_type { + TRACE_FLAG_IRQS_OFF = 1, + TRACE_FLAG_IRQS_NOSUPPORT = 2, + TRACE_FLAG_NEED_RESCHED = 4, + TRACE_FLAG_HARDIRQ = 8, + TRACE_FLAG_SOFTIRQ = 16, + TRACE_FLAG_PREEMPT_RESCHED = 32, + TRACE_FLAG_NMI = 64, + TRACE_FLAG_BH_OFF = 128, +}; + +struct event_subsystem; + +struct trace_subsystem_dir { + struct list_head list; + struct event_subsystem *subsystem; + struct trace_array *tr; + struct dentry *entry; + int ref_count; + int nr_events; +}; + +union lower_chunk { + union lower_chunk *next; + long unsigned int data[256]; +}; + +union upper_chunk { + union upper_chunk *next; + union lower_chunk *data[256]; +}; + +struct trace_pid_list { + raw_spinlock_t lock; + struct irq_work refill_irqwork; + union upper_chunk *upper[256]; + union upper_chunk *upper_list; + union lower_chunk *lower_list; + int free_upper_chunks; + int free_lower_chunks; +}; + +struct trace_array_cpu { + atomic_t disabled; + void *buffer_page; + long unsigned int entries; + long unsigned int saved_latency; + long unsigned int critical_start; + long unsigned int critical_end; + long unsigned int critical_sequence; + long unsigned int nice; + long unsigned int policy; + long unsigned int rt_priority; + long unsigned int skipped_entries; + u64 preempt_timestamp; + pid_t pid; + kuid_t uid; + char comm[16]; + int ftrace_ignore_pid; + bool ignore_pid; +}; + +struct trace_option_dentry; + +struct trace_options { + struct tracer *tracer; + struct trace_option_dentry *topts; +}; + +struct tracer_opt; + +struct trace_option_dentry { + struct tracer_opt *opt; + struct tracer_flags *flags; + struct trace_array *tr; + struct dentry *entry; +}; + +struct trace_func_repeats { + long unsigned int ip; + long unsigned int parent_ip; + long unsigned int count; + u64 ts_last_call; +}; + +enum { + TRACE_ARRAY_FL_GLOBAL = 1, +}; + +struct tracer_opt { + const char *name; + u32 bit; +}; + +struct tracer_flags { + u32 val; + struct tracer_opt *opts; + struct tracer *trace; +}; + +struct ftrace_func_command { + struct list_head list; + char *name; + int (*func)(struct trace_array *, struct ftrace_hash *, char *, char *, char *, int); +}; + +struct ftrace_probe_ops { + void (*func)(long unsigned int, long unsigned int, struct trace_array *, struct ftrace_probe_ops *, void *); + int (*init)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *, void **); + void (*free)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *); + int (*print)(struct seq_file *, long unsigned int, struct ftrace_probe_ops *, void *); +}; + +typedef int (*ftrace_mapper_func)(void *); + +enum trace_iterator_bits { + TRACE_ITER_PRINT_PARENT_BIT = 0, + TRACE_ITER_SYM_OFFSET_BIT = 1, + TRACE_ITER_SYM_ADDR_BIT = 2, + TRACE_ITER_VERBOSE_BIT = 3, + TRACE_ITER_RAW_BIT = 4, + TRACE_ITER_HEX_BIT = 5, + TRACE_ITER_BIN_BIT = 6, + TRACE_ITER_BLOCK_BIT = 7, + TRACE_ITER_PRINTK_BIT = 8, + TRACE_ITER_ANNOTATE_BIT = 9, + TRACE_ITER_USERSTACKTRACE_BIT = 10, + TRACE_ITER_SYM_USEROBJ_BIT = 11, + TRACE_ITER_PRINTK_MSGONLY_BIT = 12, + TRACE_ITER_CONTEXT_INFO_BIT = 13, + TRACE_ITER_LATENCY_FMT_BIT = 14, + TRACE_ITER_RECORD_CMD_BIT = 15, + TRACE_ITER_RECORD_TGID_BIT = 16, + TRACE_ITER_OVERWRITE_BIT = 17, + TRACE_ITER_STOP_ON_FREE_BIT = 18, + TRACE_ITER_IRQ_INFO_BIT = 19, + TRACE_ITER_MARKERS_BIT = 20, + TRACE_ITER_EVENT_FORK_BIT = 21, + TRACE_ITER_PAUSE_ON_TRACE_BIT = 22, + TRACE_ITER_HASH_PTR_BIT = 23, + TRACE_ITER_FUNCTION_BIT = 24, + TRACE_ITER_FUNC_FORK_BIT = 25, + TRACE_ITER_DISPLAY_GRAPH_BIT = 26, + TRACE_ITER_STACKTRACE_BIT = 27, + TRACE_ITER_LAST_BIT = 28, +}; + +struct event_subsystem { + struct list_head list; + const char *name; + struct event_filter *filter; + int ref_count; +}; + +enum { + TRACE_FUNC_NO_OPTS = 0, + TRACE_FUNC_OPT_STACK = 1, + TRACE_FUNC_OPT_NO_REPEATS = 2, + TRACE_FUNC_OPT_HIGHEST_BIT = 4, +}; + +struct ftrace_func_mapper; + +struct xa_node { + unsigned char shift; + unsigned char offset; + unsigned char count; + unsigned char nr_values; + struct xa_node *parent; + struct xarray *array; + union { + struct list_head private_list; + struct callback_head callback_head; + }; + void *slots[64]; + union { + long unsigned int tags[3]; + long unsigned int marks[3]; + }; +}; + +typedef void (*xa_update_node_t)(struct xa_node *); + +enum lru_status { + LRU_REMOVED = 0, + LRU_REMOVED_RETRY = 1, + LRU_ROTATE = 2, + LRU_SKIP = 3, + LRU_RETRY = 4, +}; + +typedef enum lru_status (*list_lru_walk_cb)(struct list_head *, struct list_lru_one *, spinlock_t *, void *); + +typedef int (*dr_match_t)(struct device *, void *, void *); + +struct dma_pool { + struct list_head page_list; + spinlock_t lock; + size_t size; + struct device *dev; + size_t allocation; + size_t boundary; + char name[32]; + struct list_head pools; +}; + +struct dma_page { + struct list_head page_list; + void *vaddr; + dma_addr_t dma; + unsigned int in_use; + unsigned int offset; +}; + +typedef unsigned int isolate_mode_t; + +enum mf_flags { + MF_COUNT_INCREASED = 1, + MF_ACTION_REQUIRED = 2, + MF_MUST_KILL = 4, + MF_SOFT_OFFLINE = 8, + MF_UNPOISON = 16, + MF_SW_SIMULATED = 32, + MF_NO_RETRY = 64, +}; + +enum mf_result { + MF_IGNORED = 0, + MF_FAILED = 1, + MF_DELAYED = 2, + MF_RECOVERED = 3, +}; + +enum mf_action_page_type { + MF_MSG_KERNEL = 0, + MF_MSG_KERNEL_HIGH_ORDER = 1, + MF_MSG_SLAB = 2, + MF_MSG_DIFFERENT_COMPOUND = 3, + MF_MSG_HUGE = 4, + MF_MSG_FREE_HUGE = 5, + MF_MSG_UNMAP_FAILED = 6, + MF_MSG_DIRTY_SWAPCACHE = 7, + MF_MSG_CLEAN_SWAPCACHE = 8, + MF_MSG_DIRTY_MLOCKED_LRU = 9, + MF_MSG_CLEAN_MLOCKED_LRU = 10, + MF_MSG_DIRTY_UNEVICTABLE_LRU = 11, + MF_MSG_CLEAN_UNEVICTABLE_LRU = 12, + MF_MSG_DIRTY_LRU = 13, + MF_MSG_CLEAN_LRU = 14, + MF_MSG_TRUNCATED_LRU = 15, + MF_MSG_BUDDY = 16, + MF_MSG_DAX = 17, + MF_MSG_UNSPLIT_THP = 18, + MF_MSG_UNKNOWN = 19, +}; + +typedef long unsigned int dax_entry_t; + +enum ttu_flags { + TTU_SPLIT_HUGE_PMD = 4, + TTU_IGNORE_MLOCK = 8, + TTU_SYNC = 16, + TTU_IGNORE_HWPOISON = 32, + TTU_BATCH_FLUSH = 64, + TTU_RMAP_LOCKED = 128, +}; + +struct to_kill { + struct list_head nd; + struct task_struct *tsk; + long unsigned int addr; + short int size_shift; +}; + +struct hwp_walk { + struct to_kill tk; + long unsigned int pfn; + int flags; +}; + +struct page_state { + long unsigned int mask; + long unsigned int res; + enum mf_action_page_type type; + int (*action)(struct page_state *, struct page *); +}; + +struct raw_hwp_page { + struct llist_node node; + struct page *page; +}; + +struct memory_failure_entry { + long unsigned int pfn; + int flags; +}; + +struct memory_failure_cpu { + struct { + union { + struct __kfifo kfifo; + struct memory_failure_entry *type; + const struct memory_failure_entry *const_type; + char (*rectype)[0]; + struct memory_failure_entry *ptr; + const struct memory_failure_entry *ptr_const; + }; + struct memory_failure_entry buf[16]; + } fifo; + spinlock_t lock; + struct work_struct work; +}; + +struct match_token { + int token; + const char *pattern; +}; + +enum { + MAX_OPT_ARGS = 3, +}; + +typedef struct { + char *from; + char *to; +} substring_t; + +typedef s16 int16_t; + +typedef uint8_t BYTE; + +typedef uint16_t U16; + +typedef int16_t S16; + +typedef uint32_t U32; + +typedef uint64_t U64; + +typedef U32 HUF_DTable; + +typedef struct { + U16 nextState; + BYTE nbAdditionalBits; + BYTE nbBits; + U32 baseValue; +} ZSTD_seqSymbol; + +typedef struct { + ZSTD_seqSymbol LLTable[513]; + ZSTD_seqSymbol OFTable[257]; + ZSTD_seqSymbol MLTable[513]; + HUF_DTable hufTable[4097]; + U32 rep[3]; + U32 workspace[157]; +} ZSTD_entropyDTables_t; + +typedef enum { + ZSTD_frame = 0, + ZSTD_skippableFrame = 1, +} ZSTD_frameType_e; + +typedef struct { + long long unsigned int frameContentSize; + long long unsigned int windowSize; + unsigned int blockSizeMax; + ZSTD_frameType_e frameType; + unsigned int headerSize; + unsigned int dictID; + unsigned int checksumFlag; +} ZSTD_frameHeader; + +typedef enum { + bt_raw = 0, + bt_rle = 1, + bt_compressed = 2, + bt_reserved = 3, +} blockType_e; + +typedef enum { + ZSTDds_getFrameHeaderSize = 0, + ZSTDds_decodeFrameHeader = 1, + ZSTDds_decodeBlockHeader = 2, + ZSTDds_decompressBlock = 3, + ZSTDds_decompressLastBlock = 4, + ZSTDds_checkChecksum = 5, + ZSTDds_decodeSkippableHeader = 6, + ZSTDds_skipFrame = 7, +} ZSTD_dStage; + +struct xxh64_state { + uint64_t total_len; + uint64_t v1; + uint64_t v2; + uint64_t v3; + uint64_t v4; + uint64_t mem64[4]; + uint32_t memsize; +}; + +typedef enum { + ZSTD_f_zstd1 = 0, + ZSTD_f_zstd1_magicless = 1, +} ZSTD_format_e; + +typedef enum { + ZSTD_d_validateChecksum = 0, + ZSTD_d_ignoreChecksum = 1, +} ZSTD_forceIgnoreChecksum_e; + +typedef void * (*ZSTD_allocFunction)(void *, size_t); + +typedef void (*ZSTD_freeFunction)(void *, void *); + +typedef struct { + ZSTD_allocFunction customAlloc; + ZSTD_freeFunction customFree; + void *opaque; +} ZSTD_customMem; + +typedef enum { + ZSTD_use_indefinitely = -1, + ZSTD_dont_use = 0, + ZSTD_use_once = 1, +} ZSTD_dictUses_e; + +struct ZSTD_DDict_s; + +typedef struct ZSTD_DDict_s ZSTD_DDict; + +typedef struct { + const ZSTD_DDict **ddictPtrTable; + size_t ddictPtrTableSize; + size_t ddictPtrCount; +} ZSTD_DDictHashSet; + +typedef enum { + ZSTD_rmd_refSingleDDict = 0, + ZSTD_rmd_refMultipleDDicts = 1, +} ZSTD_refMultipleDDicts_e; + +typedef enum { + zdss_init = 0, + zdss_loadHeader = 1, + zdss_read = 2, + zdss_load = 3, + zdss_flush = 4, +} ZSTD_dStreamStage; + +typedef enum { + ZSTD_bm_buffered = 0, + ZSTD_bm_stable = 1, +} ZSTD_bufferMode_e; + +struct ZSTD_outBuffer_s { + void *dst; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_outBuffer_s ZSTD_outBuffer; + +struct ZSTD_DCtx_s { + const ZSTD_seqSymbol *LLTptr; + const ZSTD_seqSymbol *MLTptr; + const ZSTD_seqSymbol *OFTptr; + const HUF_DTable *HUFptr; + ZSTD_entropyDTables_t entropy; + U32 workspace[640]; + const void *previousDstEnd; + const void *prefixStart; + const void *virtualStart; + const void *dictEnd; + size_t expected; + ZSTD_frameHeader fParams; + U64 processedCSize; + U64 decodedSize; + blockType_e bType; + ZSTD_dStage stage; + U32 litEntropy; + U32 fseEntropy; + struct xxh64_state xxhState; + size_t headerSize; + ZSTD_format_e format; + ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; + U32 validateChecksum; + const BYTE *litPtr; + ZSTD_customMem customMem; + size_t litSize; + size_t rleSize; + size_t staticSize; + int bmi2; + ZSTD_DDict *ddictLocal; + const ZSTD_DDict *ddict; + U32 dictID; + int ddictIsCold; + ZSTD_dictUses_e dictUses; + ZSTD_DDictHashSet *ddictSet; + ZSTD_refMultipleDDicts_e refMultipleDDicts; + ZSTD_dStreamStage streamStage; + char *inBuff; + size_t inBuffSize; + size_t inPos; + size_t maxWindowSize; + char *outBuff; + size_t outBuffSize; + size_t outStart; + size_t outEnd; + size_t lhSize; + void *legacyContext; + U32 previousLegacyVersion; + U32 legacyVersion; + U32 hostageByte; + int noForwardProgress; + ZSTD_bufferMode_e outBufferMode; + ZSTD_outBuffer expectedOutBuffer; + BYTE litBuffer[131104]; + BYTE headerBuffer[18]; + size_t oversizedDuration; +}; + +typedef struct ZSTD_DCtx_s ZSTD_DCtx; + +struct ZSTD_DDict_s { + void *dictBuffer; + const void *dictContent; + size_t dictSize; + ZSTD_entropyDTables_t entropy; + U32 dictID; + U32 entropyPresent; + ZSTD_customMem cMem; +}; + +typedef enum { + ZSTD_dct_auto = 0, + ZSTD_dct_rawContent = 1, + ZSTD_dct_fullDict = 2, +} ZSTD_dictContentType_e; + +typedef enum { + ZSTD_dlm_byCopy = 0, + ZSTD_dlm_byRef = 1, +} ZSTD_dictLoadMethod_e; + +struct class_dev_iter { + struct klist_iter ki; + const struct device_type *type; +}; + +struct of_phandle_args { + struct device_node *np; + int args_count; + uint32_t args[16]; +}; + +struct regulator; + +struct phy_configure_opts_dp { + unsigned int link_rate; + unsigned int lanes; + unsigned int voltage[4]; + unsigned int pre[4]; + u8 ssc: 1; + u8 set_rate: 1; + u8 set_lanes: 1; + u8 set_voltages: 1; +}; + +struct phy_configure_opts_lvds { + unsigned int bits_per_lane_and_dclk_cycle; + long unsigned int differential_clk_rate; + unsigned int lanes; + bool is_slave; +}; + +struct phy_configure_opts_mipi_dphy { + unsigned int clk_miss; + unsigned int clk_post; + unsigned int clk_pre; + unsigned int clk_prepare; + unsigned int clk_settle; + unsigned int clk_term_en; + unsigned int clk_trail; + unsigned int clk_zero; + unsigned int d_term_en; + unsigned int eot; + unsigned int hs_exit; + unsigned int hs_prepare; + unsigned int hs_settle; + unsigned int hs_skip; + unsigned int hs_trail; + unsigned int hs_zero; + unsigned int init; + unsigned int lpx; + unsigned int ta_get; + unsigned int ta_go; + unsigned int ta_sure; + unsigned int wakeup; + long unsigned int hs_clk_rate; + long unsigned int lp_clk_rate; + unsigned char lanes; +}; + +enum phy_mode { + PHY_MODE_INVALID = 0, + PHY_MODE_USB_HOST = 1, + PHY_MODE_USB_HOST_LS = 2, + PHY_MODE_USB_HOST_FS = 3, + PHY_MODE_USB_HOST_HS = 4, + PHY_MODE_USB_HOST_SS = 5, + PHY_MODE_USB_DEVICE = 6, + PHY_MODE_USB_DEVICE_LS = 7, + PHY_MODE_USB_DEVICE_FS = 8, + PHY_MODE_USB_DEVICE_HS = 9, + PHY_MODE_USB_DEVICE_SS = 10, + PHY_MODE_USB_OTG = 11, + PHY_MODE_UFS_HS_A = 12, + PHY_MODE_UFS_HS_B = 13, + PHY_MODE_PCIE = 14, + PHY_MODE_ETHERNET = 15, + PHY_MODE_MIPI_DPHY = 16, + PHY_MODE_SATA = 17, + PHY_MODE_LVDS = 18, + PHY_MODE_DP = 19, +}; + +enum phy_media { + PHY_MEDIA_DEFAULT = 0, + PHY_MEDIA_SR = 1, + PHY_MEDIA_DAC = 2, +}; + +union phy_configure_opts { + struct phy_configure_opts_mipi_dphy mipi_dphy; + struct phy_configure_opts_dp dp; + struct phy_configure_opts_lvds lvds; +}; + +struct phy; + +struct phy_ops { + int (*init)(struct phy *); + int (*exit)(struct phy *); + int (*power_on)(struct phy *); + int (*power_off)(struct phy *); + int (*set_mode)(struct phy *, enum phy_mode, int); + int (*set_media)(struct phy *, enum phy_media); + int (*set_speed)(struct phy *, int); + int (*configure)(struct phy *, union phy_configure_opts *); + int (*validate)(struct phy *, enum phy_mode, int, union phy_configure_opts *); + int (*reset)(struct phy *); + int (*calibrate)(struct phy *); + void (*release)(struct phy *); + struct module *owner; +}; + +struct phy_attrs { + u32 bus_width; + u32 max_link_rate; + enum phy_mode mode; +}; + +struct phy { + struct device dev; + int id; + const struct phy_ops *ops; + struct mutex mutex; + int init_count; + int power_count; + struct phy_attrs attrs; + struct regulator *pwr; +}; + +struct phy_provider { + struct device *dev; + struct device_node *children; + struct module *owner; + struct list_head list; + struct phy * (*of_xlate)(struct device *, struct of_phandle_args *); +}; + +struct phy_lookup { + struct list_head node; + const char *dev_id; + const char *con_id; + struct phy *phy; +}; + +struct resource_entry { + struct list_head node; + struct resource *res; + resource_size_t offset; + struct resource __res; +}; + +struct acpi_resource_irq { + u8 descriptor_length; + u8 triggering; + u8 polarity; + u8 shareable; + u8 wake_capable; + u8 interrupt_count; + u8 interrupts[1]; +}; + +struct acpi_resource_dma { + u8 type; + u8 bus_master; + u8 transfer; + u8 channel_count; + u8 channels[1]; +}; + +struct acpi_resource_start_dependent { + u8 descriptor_length; + u8 compatibility_priority; + u8 performance_robustness; +}; + +struct acpi_resource_io { + u8 io_decode; + u8 alignment; + u8 address_length; + u16 minimum; + u16 maximum; +} __attribute__((packed)); + +struct acpi_resource_fixed_io { + u16 address; + u8 address_length; +} __attribute__((packed)); + +struct acpi_resource_fixed_dma { + u16 request_lines; + u16 channels; + u8 width; +} __attribute__((packed)); + +struct acpi_resource_vendor { + u16 byte_length; + u8 byte_data[1]; +} __attribute__((packed)); + +struct acpi_resource_vendor_typed { + u16 byte_length; + u8 uuid_subtype; + u8 uuid[16]; + u8 byte_data[1]; +}; + +struct acpi_resource_end_tag { + u8 checksum; +}; + +struct acpi_resource_memory24 { + u8 write_protect; + u16 minimum; + u16 maximum; + u16 alignment; + u16 address_length; +} __attribute__((packed)); + +struct acpi_resource_memory32 { + u8 write_protect; + u32 minimum; + u32 maximum; + u32 alignment; + u32 address_length; +} __attribute__((packed)); + +struct acpi_resource_fixed_memory32 { + u8 write_protect; + u32 address; + u32 address_length; +} __attribute__((packed)); + +struct acpi_memory_attribute { + u8 write_protect; + u8 caching; + u8 range_type; + u8 translation; +}; + +struct acpi_io_attribute { + u8 range_type; + u8 translation; + u8 translation_type; + u8 reserved1; +}; + +union acpi_resource_attribute { + struct acpi_memory_attribute mem; + struct acpi_io_attribute io; + u8 type_specific; +}; + +struct acpi_resource_label { + u16 string_length; + char *string_ptr; +} __attribute__((packed)); + +struct acpi_resource_source { + u8 index; + u16 string_length; + char *string_ptr; +} __attribute__((packed)); + +struct acpi_address16_attribute { + u16 granularity; + u16 minimum; + u16 maximum; + u16 translation_offset; + u16 address_length; +}; + +struct acpi_address32_attribute { + u32 granularity; + u32 minimum; + u32 maximum; + u32 translation_offset; + u32 address_length; +}; + +struct acpi_address64_attribute { + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; +}; + +struct acpi_resource_address { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; +}; + +struct acpi_resource_address16 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address16_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_address32 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address32_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_address64 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + struct acpi_address64_attribute address; + struct acpi_resource_source resource_source; +} __attribute__((packed)); + +struct acpi_resource_extended_address64 { + u8 resource_type; + u8 producer_consumer; + u8 decode; + u8 min_address_fixed; + u8 max_address_fixed; + union acpi_resource_attribute info; + u8 revision_ID; + struct acpi_address64_attribute address; + u64 type_specific; +} __attribute__((packed)); + +struct acpi_resource_extended_irq { + u8 producer_consumer; + u8 triggering; + u8 polarity; + u8 shareable; + u8 wake_capable; + u8 interrupt_count; + struct acpi_resource_source resource_source; + u32 interrupts[1]; +} __attribute__((packed)); + +struct acpi_resource_generic_register { + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct acpi_resource_gpio { + u8 revision_id; + u8 connection_type; + u8 producer_consumer; + u8 pin_config; + u8 shareable; + u8 wake_capable; + u8 io_restriction; + u8 triggering; + u8 polarity; + u16 drive_strength; + u16 debounce_timeout; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_common_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_i2c_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 access_mode; + u16 slave_address; + u32 connection_speed; +} __attribute__((packed)); + +struct acpi_resource_spi_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 wire_mode; + u8 device_polarity; + u8 data_bit_length; + u8 clock_phase; + u8 clock_polarity; + u16 device_selection; + u32 connection_speed; +} __attribute__((packed)); + +struct acpi_resource_uart_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 endian; + u8 data_bits; + u8 stop_bits; + u8 flow_control; + u8 parity; + u8 lines_enabled; + u16 rx_fifo_size; + u16 tx_fifo_size; + u32 default_baud_rate; +} __attribute__((packed)); + +struct acpi_resource_csi2_serialbus { + u8 revision_id; + u8 type; + u8 producer_consumer; + u8 slave_mode; + u8 connection_sharing; + u8 type_revision_id; + u16 type_data_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u8 *vendor_data; + u8 local_port_instance; + u8 phy_type; +} __attribute__((packed)); + +struct acpi_resource_pin_function { + u8 revision_id; + u8 pin_config; + u8 shareable; + u16 function_number; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_config { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u8 pin_config_type; + u32 pin_config_value; + u16 pin_table_length; + u16 vendor_length; + struct acpi_resource_source resource_source; + u16 *pin_table; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group { + u8 revision_id; + u8 producer_consumer; + u16 pin_table_length; + u16 vendor_length; + u16 *pin_table; + struct acpi_resource_label resource_label; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group_function { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u16 function_number; + u16 vendor_length; + struct acpi_resource_source resource_source; + struct acpi_resource_label resource_source_label; + u8 *vendor_data; +} __attribute__((packed)); + +struct acpi_resource_pin_group_config { + u8 revision_id; + u8 producer_consumer; + u8 shareable; + u8 pin_config_type; + u32 pin_config_value; + u16 vendor_length; + struct acpi_resource_source resource_source; + struct acpi_resource_label resource_source_label; + u8 *vendor_data; +} __attribute__((packed)); + +union acpi_resource_data { + struct acpi_resource_irq irq; + struct acpi_resource_dma dma; + struct acpi_resource_start_dependent start_dpf; + struct acpi_resource_io io; + struct acpi_resource_fixed_io fixed_io; + struct acpi_resource_fixed_dma fixed_dma; + struct acpi_resource_vendor vendor; + struct acpi_resource_vendor_typed vendor_typed; + struct acpi_resource_end_tag end_tag; + struct acpi_resource_memory24 memory24; + struct acpi_resource_memory32 memory32; + struct acpi_resource_fixed_memory32 fixed_memory32; + struct acpi_resource_address16 address16; + struct acpi_resource_address32 address32; + struct acpi_resource_address64 address64; + struct acpi_resource_extended_address64 ext_address64; + struct acpi_resource_extended_irq extended_irq; + struct acpi_resource_generic_register generic_reg; + struct acpi_resource_gpio gpio; + struct acpi_resource_i2c_serialbus i2c_serial_bus; + struct acpi_resource_spi_serialbus spi_serial_bus; + struct acpi_resource_uart_serialbus uart_serial_bus; + struct acpi_resource_csi2_serialbus csi2_serial_bus; + struct acpi_resource_common_serialbus common_serial_bus; + struct acpi_resource_pin_function pin_function; + struct acpi_resource_pin_config pin_config; + struct acpi_resource_pin_group pin_group; + struct acpi_resource_pin_group_function pin_group_function; + struct acpi_resource_pin_group_config pin_group_config; + struct acpi_resource_address address; +}; + +struct acpi_resource { + u32 type; + u32 length; + union acpi_resource_data data; +} __attribute__((packed)); + +struct amba_cs_uci_id { + unsigned int devarch; + unsigned int devarch_mask; + unsigned int devtype; + void *data; +}; + +struct amba_device { + struct device dev; + struct resource res; + struct clk *pclk; + struct device_dma_parameters dma_parms; + unsigned int periphid; + struct mutex periphid_lock; + unsigned int cid; + struct amba_cs_uci_id uci; + unsigned int irq[9]; + const char *driver_override; +}; + +struct aml_resource_small_header { + u8 descriptor_type; +}; + +struct aml_resource_irq { + u8 descriptor_type; + u16 irq_mask; + u8 flags; +} __attribute__((packed)); + +struct aml_resource_dma { + u8 descriptor_type; + u8 dma_channel_mask; + u8 flags; +}; + +struct aml_resource_start_dependent { + u8 descriptor_type; + u8 flags; +}; + +struct aml_resource_end_dependent { + u8 descriptor_type; +}; + +struct aml_resource_io { + u8 descriptor_type; + u8 flags; + u16 minimum; + u16 maximum; + u8 alignment; + u8 address_length; +}; + +struct aml_resource_fixed_io { + u8 descriptor_type; + u16 address; + u8 address_length; +} __attribute__((packed)); + +struct aml_resource_vendor_small { + u8 descriptor_type; +}; + +struct aml_resource_end_tag { + u8 descriptor_type; + u8 checksum; +}; + +struct aml_resource_fixed_dma { + u8 descriptor_type; + u16 request_lines; + u16 channels; + u8 width; +} __attribute__((packed)); + +struct aml_resource_large_header { + u8 descriptor_type; + u16 resource_length; +} __attribute__((packed)); + +struct aml_resource_memory24 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u16 minimum; + u16 maximum; + u16 alignment; + u16 address_length; +} __attribute__((packed)); + +struct aml_resource_vendor_large { + u8 descriptor_type; + u16 resource_length; +} __attribute__((packed)); + +struct aml_resource_memory32 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u32 minimum; + u32 maximum; + u32 alignment; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_fixed_memory32 { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u32 address; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_address { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; +} __attribute__((packed)); + +struct aml_resource_extended_address64 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u8 revision_ID; + u8 reserved; + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; + u64 type_specific; +} __attribute__((packed)); + +struct aml_resource_address64 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u64 granularity; + u64 minimum; + u64 maximum; + u64 translation_offset; + u64 address_length; +} __attribute__((packed)); + +struct aml_resource_address32 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u32 granularity; + u32 minimum; + u32 maximum; + u32 translation_offset; + u32 address_length; +} __attribute__((packed)); + +struct aml_resource_address16 { + u8 descriptor_type; + u16 resource_length; + u8 resource_type; + u8 flags; + u8 specific_flags; + u16 granularity; + u16 minimum; + u16 maximum; + u16 translation_offset; + u16 address_length; +} __attribute__((packed)); + +struct aml_resource_extended_irq { + u8 descriptor_type; + u16 resource_length; + u8 flags; + u8 interrupt_count; + u32 interrupts[1]; +} __attribute__((packed)); + +struct aml_resource_generic_register { + u8 descriptor_type; + u16 resource_length; + u8 address_space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct aml_resource_gpio { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 connection_type; + u16 flags; + u16 int_flags; + u8 pin_config; + u16 drive_strength; + u16 debounce_timeout; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_common_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; +} __attribute__((packed)); + +struct aml_resource_csi2_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; +} __attribute__((packed)); + +struct aml_resource_i2c_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 connection_speed; + u16 slave_address; +} __attribute__((packed)); + +struct aml_resource_spi_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 connection_speed; + u8 data_bit_length; + u8 clock_phase; + u8 clock_polarity; + u16 device_selection; +} __attribute__((packed)); + +struct aml_resource_uart_serialbus { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u8 res_source_index; + u8 type; + u8 flags; + u16 type_specific_flags; + u8 type_revision_id; + u16 type_data_length; + u32 default_baud_rate; + u16 rx_fifo_size; + u16 tx_fifo_size; + u8 parity; + u8 lines_enabled; +} __attribute__((packed)); + +struct aml_resource_pin_function { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config; + u16 function_number; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_config { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config_type; + u32 pin_config_value; + u16 pin_table_offset; + u8 res_source_index; + u16 res_source_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 pin_table_offset; + u16 label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group_function { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u16 function_number; + u8 res_source_index; + u16 res_source_offset; + u16 res_source_label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +struct aml_resource_pin_group_config { + u8 descriptor_type; + u16 resource_length; + u8 revision_id; + u16 flags; + u8 pin_config_type; + u32 pin_config_value; + u8 res_source_index; + u16 res_source_offset; + u16 res_source_label_offset; + u16 vendor_offset; + u16 vendor_length; +} __attribute__((packed)); + +union aml_resource { + u8 descriptor_type; + struct aml_resource_small_header small_header; + struct aml_resource_large_header large_header; + struct aml_resource_irq irq; + struct aml_resource_dma dma; + struct aml_resource_start_dependent start_dpf; + struct aml_resource_end_dependent end_dpf; + struct aml_resource_io io; + struct aml_resource_fixed_io fixed_io; + struct aml_resource_fixed_dma fixed_dma; + struct aml_resource_vendor_small vendor_small; + struct aml_resource_end_tag end_tag; + struct aml_resource_memory24 memory24; + struct aml_resource_generic_register generic_reg; + struct aml_resource_vendor_large vendor_large; + struct aml_resource_memory32 memory32; + struct aml_resource_fixed_memory32 fixed_memory32; + struct aml_resource_address16 address16; + struct aml_resource_address32 address32; + struct aml_resource_address64 address64; + struct aml_resource_extended_address64 ext_address64; + struct aml_resource_extended_irq extended_irq; + struct aml_resource_gpio gpio; + struct aml_resource_i2c_serialbus i2c_serial_bus; + struct aml_resource_spi_serialbus spi_serial_bus; + struct aml_resource_uart_serialbus uart_serial_bus; + struct aml_resource_csi2_serialbus csi2_serial_bus; + struct aml_resource_common_serialbus common_serial_bus; + struct aml_resource_pin_function pin_function; + struct aml_resource_pin_config pin_config; + struct aml_resource_pin_group pin_group; + struct aml_resource_pin_group_function pin_group_function; + struct aml_resource_pin_group_config pin_group_config; + struct aml_resource_address address; + u32 dword_item; + u16 word_item; + u8 byte_item; +}; + +enum { + ACPI_REFCLASS_LOCAL = 0, + ACPI_REFCLASS_ARG = 1, + ACPI_REFCLASS_REFOF = 2, + ACPI_REFCLASS_INDEX = 3, + ACPI_REFCLASS_TABLE = 4, + ACPI_REFCLASS_NAME = 5, + ACPI_REFCLASS_DEBUG = 6, + ACPI_REFCLASS_MAX = 6, +}; + +struct acpi_common_descriptor { + void *common_pointer; + u8 descriptor_type; +}; + +union acpi_descriptor { + struct acpi_common_descriptor common; + union acpi_operand_object object; + struct acpi_namespace_node node; + union acpi_parse_object op; +}; + +enum { + LDISC_SEM_NORMAL = 0, + LDISC_SEM_OTHER = 1, +}; + +struct ww_class { + atomic_long_t stamp; + struct lock_class_key acquire_key; + struct lock_class_key mutex_key; + const char *acquire_name; + const char *mutex_name; + unsigned int is_wait_die; +}; + +struct ww_acquire_ctx; + +struct ww_mutex { + struct mutex base; + struct ww_acquire_ctx *ctx; + struct ww_class *ww_class; +}; + +struct ww_acquire_ctx { + struct task_struct *task; + long unsigned int stamp; + unsigned int acquired; + short unsigned int wounded; + short unsigned int is_wait_die; + unsigned int done_acquire; + struct ww_class *ww_class; + void *contending_lock; + struct lockdep_map dep_map; + unsigned int deadlock_inject_interval; + unsigned int deadlock_inject_countdown; +}; + +struct dma_fence_ops; + +struct dma_fence { + spinlock_t *lock; + const struct dma_fence_ops *ops; + union { + struct list_head cb_list; + ktime_t timestamp; + struct callback_head rcu; + }; + u64 context; + u64 seqno; + long unsigned int flags; + struct kref refcount; + int error; +}; + +struct dma_fence_ops { + bool use_64bit_seqno; + const char * (*get_driver_name)(struct dma_fence *); + const char * (*get_timeline_name)(struct dma_fence *); + bool (*enable_signaling)(struct dma_fence *); + bool (*signaled)(struct dma_fence *); + long int (*wait)(struct dma_fence *, bool, long int); + void (*release)(struct dma_fence *); + void (*fence_value_str)(struct dma_fence *, char *, int); + void (*timeline_value_str)(struct dma_fence *, char *, int); +}; + +enum dma_fence_flag_bits { + DMA_FENCE_FLAG_SIGNALED_BIT = 0, + DMA_FENCE_FLAG_TIMESTAMP_BIT = 1, + DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT = 2, + DMA_FENCE_FLAG_USER_BITS = 3, +}; + +enum dma_resv_usage { + DMA_RESV_USAGE_KERNEL = 0, + DMA_RESV_USAGE_WRITE = 1, + DMA_RESV_USAGE_READ = 2, + DMA_RESV_USAGE_BOOKKEEP = 3, +}; + +struct dma_resv_list; + +struct dma_resv { + struct ww_mutex lock; + struct dma_resv_list *fences; +}; + +struct dma_resv_list { + struct callback_head rcu; + u32 num_fences; + u32 max_fences; + struct dma_fence *table[0]; +}; + +struct dma_resv_iter { + struct dma_resv *obj; + enum dma_resv_usage usage; + struct dma_fence *fence; + enum dma_resv_usage fence_usage; + unsigned int index; + struct dma_resv_list *fences; + unsigned int num_fences; + bool is_restarted; +}; + +struct dma_fence_array { + struct dma_fence base; + spinlock_t lock; + unsigned int num_fences; + atomic_t num_pending; + struct dma_fence **fences; + struct irq_work work; +}; + +struct screen_info { + __u8 orig_x; + __u8 orig_y; + __u16 ext_mem_k; + __u16 orig_video_page; + __u8 orig_video_mode; + __u8 orig_video_cols; + __u8 flags; + __u8 unused2; + __u16 orig_video_ega_bx; + __u16 unused3; + __u8 orig_video_lines; + __u8 orig_video_isVGA; + __u16 orig_video_points; + __u16 lfb_width; + __u16 lfb_height; + __u16 lfb_depth; + __u32 lfb_base; + __u32 lfb_size; + __u16 cl_magic; + __u16 cl_offset; + __u16 lfb_linelength; + __u8 red_size; + __u8 red_pos; + __u8 green_size; + __u8 green_pos; + __u8 blue_size; + __u8 blue_pos; + __u8 rsvd_size; + __u8 rsvd_pos; + __u16 vesapm_seg; + __u16 vesapm_off; + __u16 pages; + __u16 vesa_attributes; + __u32 capabilities; + __u32 ext_lfb_base; + __u8 _reserved[2]; +} __attribute__((packed)); + +struct circ_buf { + char *buf; + int head; + int tail; +}; + +struct serial_icounter_struct { + int cts; + int dsr; + int rng; + int dcd; + int rx; + int tx; + int frame; + int overrun; + int parity; + int brk; + int buf_overrun; + int reserved[9]; +}; + +struct serial_struct { + int type; + int line; + unsigned int port; + int irq; + int flags; + int xmit_fifo_size; + int custom_divisor; + int baud_base; + short unsigned int close_delay; + char io_type; + char reserved_char[1]; + int hub6; + short unsigned int closing_wait; + short unsigned int closing_wait2; + unsigned char *iomem_base; + short unsigned int iomem_reg_shift; + unsigned int port_high; + long unsigned int iomap_base; +}; + +struct serial_rs485 { + __u32 flags; + __u32 delay_rts_before_send; + __u32 delay_rts_after_send; + union { + __u32 padding[5]; + struct { + __u8 addr_recv; + __u8 addr_dest; + __u8 padding0[2]; + __u32 padding1[4]; + }; + }; +}; + +struct serial_iso7816 { + __u32 flags; + __u32 tg; + __u32 sc_fi; + __u32 sc_di; + __u32 clk; + __u32 reserved[5]; +}; + +struct uart_port; + +struct uart_ops { + unsigned int (*tx_empty)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_mctrl)(struct uart_port *); + void (*stop_tx)(struct uart_port *); + void (*start_tx)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + void (*send_xchar)(struct uart_port *, char); + void (*stop_rx)(struct uart_port *); + void (*start_rx)(struct uart_port *); + void (*enable_ms)(struct uart_port *); + void (*break_ctl)(struct uart_port *, int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*flush_buffer)(struct uart_port *); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + const char * (*type)(struct uart_port *); + void (*release_port)(struct uart_port *); + int (*request_port)(struct uart_port *); + void (*config_port)(struct uart_port *, int); + int (*verify_port)(struct uart_port *, struct serial_struct *); + int (*ioctl)(struct uart_port *, unsigned int, long unsigned int); +}; + +struct uart_icount { + __u32 cts; + __u32 dsr; + __u32 rng; + __u32 dcd; + __u32 rx; + __u32 tx; + __u32 frame; + __u32 overrun; + __u32 parity; + __u32 brk; + __u32 buf_overrun; +}; + +typedef u64 upf_t; + +typedef unsigned int upstat_t; + +struct uart_state; + +struct uart_port { + spinlock_t lock; + long unsigned int iobase; + unsigned char *membase; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + void (*set_mctrl)(struct uart_port *, unsigned int); + unsigned int (*get_divisor)(struct uart_port *, unsigned int, unsigned int *); + void (*set_divisor)(struct uart_port *, unsigned int, unsigned int, unsigned int); + int (*startup)(struct uart_port *); + void (*shutdown)(struct uart_port *); + void (*throttle)(struct uart_port *); + void (*unthrottle)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); + int (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *); + int (*iso7816_config)(struct uart_port *, struct serial_iso7816 *); + unsigned int irq; + long unsigned int irqflags; + unsigned int uartclk; + unsigned int fifosize; + unsigned char x_char; + unsigned char regshift; + unsigned char iotype; + unsigned char quirks; + unsigned int read_status_mask; + unsigned int ignore_status_mask; + struct uart_state *state; + struct uart_icount icount; + struct console *cons; + upf_t flags; + upstat_t status; + int hw_stopped; + unsigned int mctrl; + unsigned int frame_time; + unsigned int type; + const struct uart_ops *ops; + unsigned int custom_divisor; + unsigned int line; + unsigned int minor; + resource_size_t mapbase; + resource_size_t mapsize; + struct device *dev; + long unsigned int sysrq; + unsigned int sysrq_ch; + unsigned char has_sysrq; + unsigned char sysrq_seq; + unsigned char hub6; + unsigned char suspended; + unsigned char console_reinit; + const char *name; + struct attribute_group *attr_group; + const struct attribute_group **tty_groups; + struct serial_rs485 rs485; + struct serial_rs485 rs485_supported; + struct gpio_desc *rs485_term_gpio; + struct serial_iso7816 iso7816; + void *private_data; +}; + +enum uart_pm_state { + UART_PM_STATE_ON = 0, + UART_PM_STATE_OFF = 3, + UART_PM_STATE_UNDEFINED = 4, +}; + +struct uart_state { + struct tty_port port; + enum uart_pm_state pm_state; + struct circ_buf xmit; + atomic_t refcount; + wait_queue_head_t remove_wait; + struct uart_port *uart_port; +}; + +struct earlycon_device { + struct console *con; + struct uart_port port; + char options[16]; + unsigned int baud; +}; + +struct earlycon_id { + char name[15]; + char name_term; + char compatible[128]; + int (*setup)(struct earlycon_device *, const char *); +}; + +enum tc_mq_command { + TC_MQ_CREATE = 0, + TC_MQ_DESTROY = 1, + TC_MQ_STATS = 2, + TC_MQ_GRAFT = 3, +}; + +struct tc_mq_opt_offload_graft_params { + long unsigned int queue; + u32 child_handle; +}; + +struct tc_mq_qopt_offload { + enum tc_mq_command command; + u32 handle; + union { + struct tc_qopt_offload_stats stats; + struct tc_mq_opt_offload_graft_params graft_params; + }; +}; + +struct mq_sched { + struct Qdisc **qdiscs; +}; + +struct packet_offload { + __be16 type; + u16 priority; + struct offload_callbacks callbacks; + struct list_head list; +}; + +struct hop_jumbo_hdr { + u8 nexthdr; + u8 hdrlen; + u8 tlv_type; + u8 tlv_len; + __be32 jumbo_payload_len; +}; + +struct step_hook { + struct list_head node; + int (*fn)(struct pt_regs *, long unsigned int); +}; + +struct break_hook { + struct list_head node; + int (*fn)(struct pt_regs *, long unsigned int); + u16 imm; + u16 mask; +}; + +enum dbg_active_el { + DBG_ACTIVE_EL0 = 0, + DBG_ACTIVE_EL1 = 1, +}; + +struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + long int tm_year; + int tm_wday; + int tm_yday; +}; + +typedef bool (*smp_cond_func_t)(int, void *); + +enum lockdown_reason { + LOCKDOWN_NONE = 0, + LOCKDOWN_MODULE_SIGNATURE = 1, + LOCKDOWN_DEV_MEM = 2, + LOCKDOWN_EFI_TEST = 3, + LOCKDOWN_KEXEC = 4, + LOCKDOWN_HIBERNATION = 5, + LOCKDOWN_PCI_ACCESS = 6, + LOCKDOWN_IOPORT = 7, + LOCKDOWN_MSR = 8, + LOCKDOWN_ACPI_TABLES = 9, + LOCKDOWN_DEVICE_TREE = 10, + LOCKDOWN_PCMCIA_CIS = 11, + LOCKDOWN_TIOCSSERIAL = 12, + LOCKDOWN_MODULE_PARAMETERS = 13, + LOCKDOWN_MMIOTRACE = 14, + LOCKDOWN_DEBUGFS = 15, + LOCKDOWN_XMON_WR = 16, + LOCKDOWN_BPF_WRITE_USER = 17, + LOCKDOWN_DBG_WRITE_KERNEL = 18, + LOCKDOWN_RTAS_ERROR_INJECTION = 19, + LOCKDOWN_INTEGRITY_MAX = 20, + LOCKDOWN_KCORE = 21, + LOCKDOWN_KPROBES = 22, + LOCKDOWN_BPF_READ_KERNEL = 23, + LOCKDOWN_DBG_READ_KERNEL = 24, + LOCKDOWN_PERF = 25, + LOCKDOWN_TRACEFS = 26, + LOCKDOWN_XMON_RW = 27, + LOCKDOWN_XFRM_SECRET = 28, + LOCKDOWN_CONFIDENTIALITY_MAX = 29, +}; + +enum { + TRACE_PIDS = 1, + TRACE_NO_PIDS = 2, +}; + +struct trace_parser { + bool cont; + char *buffer; + unsigned int idx; + unsigned int size; +}; + +enum trace_iterator_flags { + TRACE_ITER_PRINT_PARENT = 1, + TRACE_ITER_SYM_OFFSET = 2, + TRACE_ITER_SYM_ADDR = 4, + TRACE_ITER_VERBOSE = 8, + TRACE_ITER_RAW = 16, + TRACE_ITER_HEX = 32, + TRACE_ITER_BIN = 64, + TRACE_ITER_BLOCK = 128, + TRACE_ITER_PRINTK = 256, + TRACE_ITER_ANNOTATE = 512, + TRACE_ITER_USERSTACKTRACE = 1024, + TRACE_ITER_SYM_USEROBJ = 2048, + TRACE_ITER_PRINTK_MSGONLY = 4096, + TRACE_ITER_CONTEXT_INFO = 8192, + TRACE_ITER_LATENCY_FMT = 16384, + TRACE_ITER_RECORD_CMD = 32768, + TRACE_ITER_RECORD_TGID = 65536, + TRACE_ITER_OVERWRITE = 131072, + TRACE_ITER_STOP_ON_FREE = 262144, + TRACE_ITER_IRQ_INFO = 524288, + TRACE_ITER_MARKERS = 1048576, + TRACE_ITER_EVENT_FORK = 2097152, + TRACE_ITER_PAUSE_ON_TRACE = 4194304, + TRACE_ITER_HASH_PTR = 8388608, + TRACE_ITER_FUNCTION = 16777216, + TRACE_ITER_FUNC_FORK = 33554432, + TRACE_ITER_DISPLAY_GRAPH = 67108864, + TRACE_ITER_STACKTRACE = 134217728, +}; + +struct ftrace_event_field { + struct list_head link; + const char *name; + const char *type; + int filter_type; + int offset; + int size; + int is_signed; +}; + +struct module_string { + struct list_head next; + struct module *module; + char *str; +}; + +enum { + FORMAT_HEADER = 1, + FORMAT_FIELD_SEPERATOR = 2, + FORMAT_PRINTFMT = 3, +}; + +struct event_probe_data { + struct trace_event_file *file; + long unsigned int count; + int ref; + bool enable; +}; + +struct srcu_notifier_head { + struct mutex mutex; + struct srcu_struct srcu; + struct notifier_block *head; +}; + +struct flock64 { + short int l_type; + short int l_whence; + __kernel_loff_t l_start; + __kernel_loff_t l_len; + __kernel_pid_t l_pid; +}; + +struct trace_print_flags { + long unsigned int mask; + const char *name; +}; + +struct trace_event_raw_locks_get_lock_context { + struct trace_entry ent; + long unsigned int i_ino; + dev_t s_dev; + unsigned char type; + struct file_lock_context *ctx; + char __data[0]; +}; + +struct trace_event_raw_filelock_lock { + struct trace_entry ent; + struct file_lock *fl; + long unsigned int i_ino; + dev_t s_dev; + struct file_lock *fl_blocker; + fl_owner_t fl_owner; + unsigned int fl_pid; + unsigned int fl_flags; + unsigned char fl_type; + loff_t fl_start; + loff_t fl_end; + int ret; + char __data[0]; +}; + +struct trace_event_raw_filelock_lease { + struct trace_entry ent; + struct file_lock *fl; + long unsigned int i_ino; + dev_t s_dev; + struct file_lock *fl_blocker; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + long unsigned int fl_break_time; + long unsigned int fl_downgrade_time; + char __data[0]; +}; + +struct trace_event_raw_generic_add_lease { + struct trace_entry ent; + long unsigned int i_ino; + int wcount; + int rcount; + int icount; + dev_t s_dev; + fl_owner_t fl_owner; + unsigned int fl_flags; + unsigned char fl_type; + char __data[0]; +}; + +struct trace_event_raw_leases_conflict { + struct trace_entry ent; + void *lease; + void *breaker; + unsigned int l_fl_flags; + unsigned int b_fl_flags; + unsigned char l_fl_type; + unsigned char b_fl_type; + bool conflict; + char __data[0]; +}; + +struct trace_event_data_offsets_locks_get_lock_context {}; + +struct trace_event_data_offsets_filelock_lock {}; + +struct trace_event_data_offsets_filelock_lease {}; + +struct trace_event_data_offsets_generic_add_lease {}; + +struct trace_event_data_offsets_leases_conflict {}; + +typedef void (*btf_trace_locks_get_lock_context)(void *, struct inode *, int, struct file_lock_context *); + +typedef void (*btf_trace_posix_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_fcntl_setlk)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_locks_remove_posix)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_flock_lock_inode)(void *, struct inode *, struct file_lock *, int); + +typedef void (*btf_trace_break_lease_noblock)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_break_lease_block)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_break_lease_unblock)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_generic_delete_lease)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_time_out_leases)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_generic_add_lease)(void *, struct inode *, struct file_lock *); + +typedef void (*btf_trace_leases_conflict)(void *, bool, struct file_lock *, struct file_lock *); + +struct file_lock_list_struct { + spinlock_t lock; + struct hlist_head hlist; +}; + +struct locks_iterator { + int li_cpu; + loff_t li_pos; +}; + +struct msg_msgseg; + +struct msg_msg { + struct list_head m_list; + long int m_type; + size_t m_ts; + struct msg_msgseg *next; + void *security; +}; + +struct msg_msgseg { + struct msg_msgseg *next; +}; + +struct aead_instance { + void (*free)(struct aead_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[128]; + struct crypto_instance base; + } s; + struct aead_alg alg; + }; +}; + +struct aead_geniv_ctx { + spinlock_t lock; + struct crypto_aead *child; + struct crypto_sync_skcipher *sknull; + u8 salt[0]; +}; + +typedef bool (*sb_for_each_fn)(struct sbitmap *, unsigned int, void *); + +struct sbq_wait { + struct sbitmap_queue *sbq; + struct wait_queue_entry wait; +}; + +struct elevator_type; + +struct elevator_queue { + struct elevator_type *type; + void *elevator_data; + struct kobject kobj; + struct mutex sysfs_lock; + long unsigned int flags; + struct hlist_head hash[64]; +}; + +struct blk_trace { + int trace_state; + struct rchan *rchan; + long unsigned int *sequence; + unsigned char *msg_data; + u16 act_mask; + u64 start_lba; + u64 end_lba; + u32 pid; + u32 dev; + struct dentry *dir; + struct list_head running_list; + atomic_t dropped; +}; + +struct blk_flush_queue { + unsigned int flush_pending_idx: 1; + unsigned int flush_running_idx: 1; + blk_status_t rq_status; + long unsigned int flush_pending_since; + struct list_head flush_queue[2]; + struct list_head flush_data_in_flight; + struct request *flush_rq; + spinlock_t mq_flush_lock; +}; + +enum blktrace_act { + __BLK_TA_QUEUE = 1, + __BLK_TA_BACKMERGE = 2, + __BLK_TA_FRONTMERGE = 3, + __BLK_TA_GETRQ = 4, + __BLK_TA_SLEEPRQ = 5, + __BLK_TA_REQUEUE = 6, + __BLK_TA_ISSUE = 7, + __BLK_TA_COMPLETE = 8, + __BLK_TA_PLUG = 9, + __BLK_TA_UNPLUG_IO = 10, + __BLK_TA_UNPLUG_TIMER = 11, + __BLK_TA_INSERT = 12, + __BLK_TA_SPLIT = 13, + __BLK_TA_BOUNCE = 14, + __BLK_TA_REMAP = 15, + __BLK_TA_ABORT = 16, + __BLK_TA_DRV_DATA = 17, + __BLK_TA_CGROUP = 256, +}; + +enum elv_merge { + ELEVATOR_NO_MERGE = 0, + ELEVATOR_FRONT_MERGE = 1, + ELEVATOR_BACK_MERGE = 2, + ELEVATOR_DISCARD_MERGE = 3, +}; + +struct blk_mq_alloc_data; + +struct elevator_mq_ops { + int (*init_sched)(struct request_queue *, struct elevator_type *); + void (*exit_sched)(struct elevator_queue *); + int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); + void (*depth_updated)(struct blk_mq_hw_ctx *); + bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); + bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int); + int (*request_merge)(struct request_queue *, struct request **, struct bio *); + void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); + void (*requests_merged)(struct request_queue *, struct request *, struct request *); + void (*limit_depth)(blk_opf_t, struct blk_mq_alloc_data *); + void (*prepare_request)(struct request *); + void (*finish_request)(struct request *); + void (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, bool); + struct request * (*dispatch_request)(struct blk_mq_hw_ctx *); + bool (*has_work)(struct blk_mq_hw_ctx *); + void (*completed_request)(struct request *, u64); + void (*requeue_request)(struct request *); + struct request * (*former_request)(struct request_queue *, struct request *); + struct request * (*next_request)(struct request_queue *, struct request *); + void (*init_icq)(struct io_cq *); + void (*exit_icq)(struct io_cq *); +}; + +struct elv_fs_entry; + +struct elevator_type { + struct kmem_cache *icq_cache; + struct elevator_mq_ops ops; + size_t icq_size; + size_t icq_align; + struct elv_fs_entry *elevator_attrs; + const char *elevator_name; + const char *elevator_alias; + const unsigned int elevator_features; + struct module *elevator_owner; + const struct blk_mq_debugfs_attr *queue_debugfs_attrs; + const struct blk_mq_debugfs_attr *hctx_debugfs_attrs; + char icq_cache_name[22]; + struct list_head list; +}; + +struct blk_mq_alloc_data { + struct request_queue *q; + blk_mq_req_flags_t flags; + unsigned int shallow_depth; + blk_opf_t cmd_flags; + req_flags_t rq_flags; + unsigned int nr_tags; + struct request **cached_rq; + struct blk_mq_ctx *ctx; + struct blk_mq_hw_ctx *hctx; +}; + +struct elv_fs_entry { + struct attribute attr; + ssize_t (*show)(struct elevator_queue *, char *); + ssize_t (*store)(struct elevator_queue *, const char *, size_t); +}; + +struct trace_event_raw_kyber_latency { + struct trace_entry ent; + dev_t dev; + char domain[16]; + char type[8]; + u8 percentile; + u8 numerator; + u8 denominator; + unsigned int samples; + char __data[0]; +}; + +struct trace_event_raw_kyber_adjust { + struct trace_entry ent; + dev_t dev; + char domain[16]; + unsigned int depth; + char __data[0]; +}; + +struct trace_event_raw_kyber_throttled { + struct trace_entry ent; + dev_t dev; + char domain[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_kyber_latency {}; + +struct trace_event_data_offsets_kyber_adjust {}; + +struct trace_event_data_offsets_kyber_throttled {}; + +typedef void (*btf_trace_kyber_latency)(void *, dev_t, const char *, const char *, unsigned int, unsigned int, unsigned int, unsigned int); + +typedef void (*btf_trace_kyber_adjust)(void *, dev_t, const char *, unsigned int); + +typedef void (*btf_trace_kyber_throttled)(void *, dev_t, const char *); + +enum { + KYBER_READ = 0, + KYBER_WRITE = 1, + KYBER_DISCARD = 2, + KYBER_OTHER = 3, + KYBER_NUM_DOMAINS = 4, +}; + +enum { + KYBER_ASYNC_PERCENT = 75, +}; + +enum { + KYBER_LATENCY_SHIFT = 2, + KYBER_GOOD_BUCKETS = 4, + KYBER_LATENCY_BUCKETS = 8, +}; + +enum { + KYBER_TOTAL_LATENCY = 0, + KYBER_IO_LATENCY = 1, +}; + +struct kyber_cpu_latency { + atomic_t buckets[48]; +}; + +struct kyber_ctx_queue { + spinlock_t lock; + struct list_head rq_list[4]; +}; + +struct kyber_queue_data { + struct request_queue *q; + dev_t dev; + struct sbitmap_queue domain_tokens[4]; + unsigned int async_depth; + struct kyber_cpu_latency *cpu_latency; + struct timer_list timer; + unsigned int latency_buckets[48]; + long unsigned int latency_timeout[3]; + int domain_p99[3]; + u64 latency_targets[3]; +}; + +struct kyber_hctx_data { + spinlock_t lock; + struct list_head rqs[4]; + unsigned int cur_domain; + unsigned int batching; + struct kyber_ctx_queue *kcqs; + struct sbitmap kcq_map[4]; + struct sbq_wait domain_wait[4]; + struct sbq_wait_state *domain_ws[4]; + atomic_t wait_index[4]; +}; + +struct flush_kcq_data { + struct kyber_hctx_data *khd; + unsigned int sched_domain; + struct list_head *list; +}; + +typedef mpi_limb_t *mpi_ptr_t; + +typedef int mpi_size_t; + +struct acpi_pci_root { + struct acpi_device *device; + struct pci_bus *bus; + u16 segment; + int bridge_type; + struct resource secondary; + u32 osc_support_set; + u32 osc_control_set; + u32 osc_ext_support_set; + u32 osc_ext_control_set; + phys_addr_t mcfg_addr; +}; + +struct pci_config_window; + +struct pci_ecam_ops { + unsigned int bus_shift; + struct pci_ops pci_ops; + int (*init)(struct pci_config_window *); +}; + +struct pci_config_window { + struct resource res; + struct resource busr; + unsigned int bus_shift; + void *priv; + const struct pci_ecam_ops *ops; + union { + void *win; + void **winp; + }; + struct device *parent; +}; + +struct hisi_pcie { + void *reg_base; +}; + +struct stclear_flags_t { + __be16 tag; + u8 deactivated; + u8 disableForceClear; + u8 physicalPresence; + u8 physicalPresenceLock; + u8 bGlobalLock; +} __attribute__((packed)); + +struct tpm1_version { + u8 major; + u8 minor; + u8 rev_major; + u8 rev_minor; +}; + +struct tpm1_version2 { + __be16 tag; + struct tpm1_version version; +}; + +struct timeout_t { + __be32 a; + __be32 b; + __be32 c; + __be32 d; +}; + +struct duration_t { + __be32 tpm_short; + __be32 tpm_medium; + __be32 tpm_long; +}; + +struct permanent_flags_t { + __be16 tag; + u8 disable; + u8 ownership; + u8 deactivated; + u8 readPubek; + u8 disableOwnerClear; + u8 allowMaintenance; + u8 physicalPresenceLifetimeLock; + u8 physicalPresenceHWEnable; + u8 physicalPresenceCMDEnable; + u8 CEKPUsed; + u8 TPMpost; + u8 TPMpostLock; + u8 FIPS; + u8 operator; + u8 enableRevokeEK; + u8 nvLocked; + u8 readSRKPub; + u8 tpmEstablished; + u8 maintenanceDone; + u8 disableFullDALogicInfo; +}; + +typedef union { + struct permanent_flags_t perm_flags; + struct stclear_flags_t stclear_flags; + __u8 owned; + __be32 num_pcrs; + struct tpm1_version version1; + struct tpm1_version2 version2; + __be32 manufacturer_id; + struct timeout_t timeout; + struct duration_t duration; +} cap_t; + +enum tpm_capabilities { + TPM_CAP_FLAG = 4, + TPM_CAP_PROP = 5, + TPM_CAP_VERSION_1_1 = 6, + TPM_CAP_VERSION_1_2 = 26, +}; + +enum tpm_sub_capabilities { + TPM_CAP_PROP_PCR = 257, + TPM_CAP_PROP_MANUFACTURER = 259, + TPM_CAP_FLAG_PERM = 264, + TPM_CAP_FLAG_VOL = 265, + TPM_CAP_PROP_OWNER = 273, + TPM_CAP_PROP_TIS_TIMEOUT = 277, + TPM_CAP_PROP_TIS_DURATION = 288, +}; + +struct tpm_readpubek_out { + u8 algorithm[4]; + u8 encscheme[2]; + u8 sigscheme[2]; + __be32 paramsize; + u8 parameters[12]; + __be32 keysize; + u8 modulus[256]; + u8 checksum[20]; +}; + +struct tpm_pcr_attr { + int alg_id; + int pcr; + struct device_attribute attr; +}; + +struct ml_effect_state { + struct ff_effect *effect; + long unsigned int flags; + int count; + long unsigned int play_at; + long unsigned int stop_at; + long unsigned int adj_at; +}; + +struct ml_device { + void *private; + struct ml_effect_state states[16]; + int gain; + struct timer_list timer; + struct input_dev *dev; + int (*play_effect)(struct input_dev *, void *, struct ff_effect *); +}; + +struct nla_bitfield32 { + __u32 value; + __u32 selector; +}; + +enum { + TCA_ACT_UNSPEC = 0, + TCA_ACT_KIND = 1, + TCA_ACT_OPTIONS = 2, + TCA_ACT_INDEX = 3, + TCA_ACT_STATS = 4, + TCA_ACT_PAD = 5, + TCA_ACT_COOKIE = 6, + TCA_ACT_FLAGS = 7, + TCA_ACT_HW_STATS = 8, + TCA_ACT_USED_HW_STATS = 9, + TCA_ACT_IN_HW_COUNT = 10, + __TCA_ACT_MAX = 11, +}; + +enum tca_id { + TCA_ID_UNSPEC = 0, + TCA_ID_POLICE = 1, + TCA_ID_GACT = 5, + TCA_ID_IPT = 6, + TCA_ID_PEDIT = 7, + TCA_ID_MIRRED = 8, + TCA_ID_NAT = 9, + TCA_ID_XT = 10, + TCA_ID_SKBEDIT = 11, + TCA_ID_VLAN = 12, + TCA_ID_BPF = 13, + TCA_ID_CONNMARK = 14, + TCA_ID_SKBMOD = 15, + TCA_ID_CSUM = 16, + TCA_ID_TUNNEL_KEY = 17, + TCA_ID_SIMP = 22, + TCA_ID_IFE = 25, + TCA_ID_SAMPLE = 26, + TCA_ID_CTINFO = 27, + TCA_ID_MPLS = 28, + TCA_ID_CT = 29, + TCA_ID_GATE = 30, + __TCA_ID_MAX = 255, +}; + +struct tcf_t { + __u64 install; + __u64 lastuse; + __u64 expires; + __u64 firstuse; +}; + +struct tcamsg { + unsigned char tca_family; + unsigned char tca__pad1; + short unsigned int tca__pad2; +}; + +enum { + TCA_ROOT_UNSPEC = 0, + TCA_ROOT_TAB = 1, + TCA_ROOT_FLAGS = 2, + TCA_ROOT_COUNT = 3, + TCA_ROOT_TIME_DELTA = 4, + __TCA_ROOT_MAX = 5, +}; + +enum flow_action_id { + FLOW_ACTION_ACCEPT = 0, + FLOW_ACTION_DROP = 1, + FLOW_ACTION_TRAP = 2, + FLOW_ACTION_GOTO = 3, + FLOW_ACTION_REDIRECT = 4, + FLOW_ACTION_MIRRED = 5, + FLOW_ACTION_REDIRECT_INGRESS = 6, + FLOW_ACTION_MIRRED_INGRESS = 7, + FLOW_ACTION_VLAN_PUSH = 8, + FLOW_ACTION_VLAN_POP = 9, + FLOW_ACTION_VLAN_MANGLE = 10, + FLOW_ACTION_TUNNEL_ENCAP = 11, + FLOW_ACTION_TUNNEL_DECAP = 12, + FLOW_ACTION_MANGLE = 13, + FLOW_ACTION_ADD = 14, + FLOW_ACTION_CSUM = 15, + FLOW_ACTION_MARK = 16, + FLOW_ACTION_PTYPE = 17, + FLOW_ACTION_PRIORITY = 18, + FLOW_ACTION_RX_QUEUE_MAPPING = 19, + FLOW_ACTION_WAKE = 20, + FLOW_ACTION_QUEUE = 21, + FLOW_ACTION_SAMPLE = 22, + FLOW_ACTION_POLICE = 23, + FLOW_ACTION_CT = 24, + FLOW_ACTION_CT_METADATA = 25, + FLOW_ACTION_MPLS_PUSH = 26, + FLOW_ACTION_MPLS_POP = 27, + FLOW_ACTION_MPLS_MANGLE = 28, + FLOW_ACTION_GATE = 29, + FLOW_ACTION_PPPOE_PUSH = 30, + FLOW_ACTION_JUMP = 31, + FLOW_ACTION_PIPE = 32, + FLOW_ACTION_VLAN_PUSH_ETH = 33, + FLOW_ACTION_VLAN_POP_ETH = 34, + FLOW_ACTION_CONTINUE = 35, + NUM_FLOW_ACTIONS = 36, +}; + +enum flow_action_mangle_base { + FLOW_ACT_MANGLE_UNSPEC = 0, + FLOW_ACT_MANGLE_HDR_TYPE_ETH = 1, + FLOW_ACT_MANGLE_HDR_TYPE_IP4 = 2, + FLOW_ACT_MANGLE_HDR_TYPE_IP6 = 3, + FLOW_ACT_MANGLE_HDR_TYPE_TCP = 4, + FLOW_ACT_MANGLE_HDR_TYPE_UDP = 5, +}; + +enum flow_action_hw_stats { + FLOW_ACTION_HW_STATS_IMMEDIATE = 1, + FLOW_ACTION_HW_STATS_DELAYED = 2, + FLOW_ACTION_HW_STATS_ANY = 3, + FLOW_ACTION_HW_STATS_DISABLED = 4, + FLOW_ACTION_HW_STATS_DONT_CARE = 7, +}; + +typedef void (*action_destr)(void *); + +struct flow_action_cookie { + u32 cookie_len; + u8 cookie[0]; +}; + +struct nf_flowtable; + +struct ip_tunnel_info; + +struct psample_group; + +struct action_gate_entry; + +struct flow_action_entry { + enum flow_action_id id; + u32 hw_index; + enum flow_action_hw_stats hw_stats; + action_destr destructor; + void *destructor_priv; + union { + u32 chain_index; + struct net_device *dev; + struct { + u16 vid; + __be16 proto; + u8 prio; + } vlan; + struct { + unsigned char dst[6]; + unsigned char src[6]; + } vlan_push_eth; + struct { + enum flow_action_mangle_base htype; + u32 offset; + u32 mask; + u32 val; + } mangle; + struct ip_tunnel_info *tunnel; + u32 csum_flags; + u32 mark; + u16 ptype; + u16 rx_queue; + u32 priority; + struct { + u32 ctx; + u32 index; + u8 vf; + } queue; + struct { + struct psample_group *psample_group; + u32 rate; + u32 trunc_size; + bool truncate; + } sample; + struct { + u32 burst; + u64 rate_bytes_ps; + u64 peakrate_bytes_ps; + u32 avrate; + u16 overhead; + u64 burst_pkt; + u64 rate_pkt_ps; + u32 mtu; + struct { + enum flow_action_id act_id; + u32 extval; + } exceed; + struct { + enum flow_action_id act_id; + u32 extval; + } notexceed; + } police; + struct { + int action; + u16 zone; + struct nf_flowtable *flow_table; + } ct; + struct { + long unsigned int cookie; + u32 mark; + u32 labels[4]; + bool orig_dir; + } ct_metadata; + struct { + u32 label; + __be16 proto; + u8 tc; + u8 bos; + u8 ttl; + } mpls_push; + struct { + __be16 proto; + } mpls_pop; + struct { + u32 label; + u8 tc; + u8 bos; + u8 ttl; + } mpls_mangle; + struct { + s32 prio; + u64 basetime; + u64 cycletime; + u64 cycletimeext; + u32 num_entries; + struct action_gate_entry *entries; + } gate; + struct { + u16 sid; + } pppoe; + }; + struct flow_action_cookie *cookie; +}; + +struct flow_action { + unsigned int num_entries; + struct flow_action_entry entries[0]; +}; + +struct flow_stats { + u64 pkts; + u64 bytes; + u64 drops; + u64 lastused; + enum flow_action_hw_stats used_hw_stats; + bool used_hw_stats_valid; +}; + +enum flow_block_command { + FLOW_BLOCK_BIND = 0, + FLOW_BLOCK_UNBIND = 1, +}; + +enum flow_block_binder_type { + FLOW_BLOCK_BINDER_TYPE_UNSPEC = 0, + FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS = 1, + FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS = 2, + FLOW_BLOCK_BINDER_TYPE_RED_EARLY_DROP = 3, + FLOW_BLOCK_BINDER_TYPE_RED_MARK = 4, +}; + +struct flow_block_offload { + enum flow_block_command command; + enum flow_block_binder_type binder_type; + bool block_shared; + bool unlocked_driver_cb; + struct net *net; + struct flow_block *block; + struct list_head cb_list; + struct list_head *driver_block_list; + struct netlink_ext_ack *extack; + struct Qdisc *sch; + struct list_head *cb_list_head; +}; + +struct flow_block_cb; + +struct flow_block_indr { + struct list_head list; + struct net_device *dev; + struct Qdisc *sch; + enum flow_block_binder_type binder_type; + void *data; + void *cb_priv; + void (*cleanup)(struct flow_block_cb *); +}; + +struct flow_block_cb { + struct list_head driver_list; + struct list_head list; + flow_setup_cb_t *cb; + void *cb_ident; + void *cb_priv; + void (*release)(void *); + struct flow_block_indr indr; + unsigned int refcnt; +}; + +enum offload_act_command { + FLOW_ACT_REPLACE = 0, + FLOW_ACT_DESTROY = 1, + FLOW_ACT_STATS = 2, +}; + +struct flow_offload_action { + struct netlink_ext_ack *extack; + enum offload_act_command command; + enum flow_action_id id; + u32 index; + struct flow_stats stats; + struct flow_action action; +}; + +typedef int flow_indr_block_bind_cb_t(struct net_device *, struct Qdisc *, void *, enum tc_setup_type, void *, void *, void (*)(struct flow_block_cb *)); + +struct tcf_idrinfo { + struct mutex lock; + struct idr action_idr; + struct net *net; +}; + +struct tc_action_ops; + +struct tc_cookie; + +struct tc_action { + const struct tc_action_ops *ops; + __u32 type; + struct tcf_idrinfo *idrinfo; + u32 tcfa_index; + refcount_t tcfa_refcnt; + atomic_t tcfa_bindcnt; + int tcfa_action; + struct tcf_t tcfa_tm; + long: 64; + struct gnet_stats_basic_sync tcfa_bstats; + struct gnet_stats_basic_sync tcfa_bstats_hw; + struct gnet_stats_queue tcfa_qstats; + struct net_rate_estimator *tcfa_rate_est; + spinlock_t tcfa_lock; + struct gnet_stats_basic_sync *cpu_bstats; + struct gnet_stats_basic_sync *cpu_bstats_hw; + struct gnet_stats_queue *cpu_qstats; + struct tc_cookie *act_cookie; + struct tcf_chain *goto_chain; + u32 tcfa_flags; + u8 hw_stats; + u8 used_hw_stats; + bool used_hw_stats_valid; + u32 in_hw_count; + long: 32; + long: 64; +}; + +typedef void (*tc_action_priv_destructor)(void *); + +struct tc_action_ops { + struct list_head head; + char kind[16]; + enum tca_id id; + unsigned int net_id; + size_t size; + struct module *owner; + int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *); + int (*dump)(struct sk_buff *, struct tc_action *, int, int); + void (*cleanup)(struct tc_action *); + int (*lookup)(struct net *, struct tc_action **, u32); + int (*init)(struct net *, struct nlattr *, struct nlattr *, struct tc_action **, struct tcf_proto *, u32, struct netlink_ext_ack *); + int (*walk)(struct net *, struct sk_buff *, struct netlink_callback *, int, const struct tc_action_ops *, struct netlink_ext_ack *); + void (*stats_update)(struct tc_action *, u64, u64, u64, u64, bool); + size_t (*get_fill_size)(const struct tc_action *); + struct net_device * (*get_dev)(const struct tc_action *, tc_action_priv_destructor *); + struct psample_group * (*get_psample_group)(const struct tc_action *, tc_action_priv_destructor *); + int (*offload_act_setup)(struct tc_action *, void *, u32 *, bool, struct netlink_ext_ack *); +}; + +struct tc_cookie { + u8 *data; + u32 len; + struct callback_head rcu; +}; + +struct tc_action_net { + struct tcf_idrinfo *idrinfo; + const struct tc_action_ops *ops; +}; + +enum pedit_header_type { + TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0, + TCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1, + TCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2, + TCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3, + TCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4, + TCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5, + __PEDIT_HDR_TYPE_MAX = 6, +}; + +enum pedit_cmd { + TCA_PEDIT_KEY_EX_CMD_SET = 0, + TCA_PEDIT_KEY_EX_CMD_ADD = 1, + __PEDIT_CMD_MAX = 2, +}; + +struct tc_pedit_key { + __u32 mask; + __u32 val; + __u32 off; + __u32 at; + __u32 offmask; + __u32 shift; +}; + +struct tcf_pedit_key_ex { + enum pedit_header_type htype; + enum pedit_cmd cmd; +}; + +struct tcf_pedit { + struct tc_action common; + unsigned char tcfp_nkeys; + unsigned char tcfp_flags; + u32 tcfp_off_max_hint; + struct tc_pedit_key *tcfp_keys; + struct tcf_pedit_key_ex *tcfp_keys_ex; + long: 64; +}; + +struct tc_act_pernet_id { + struct list_head list; + unsigned int id; +}; + +struct nmi_ctx { + u64 hcr; + unsigned int cnt; +}; + +struct dev_printk_info { + char subsystem[16]; + char device[48]; +}; + +struct printk_info { + u64 seq; + u64 ts_nsec; + u16 text_len; + u8 facility; + u8 flags: 5; + u8 level: 3; + u32 caller_id; + struct dev_printk_info dev_info; +}; + +struct printk_record { + struct printk_info *info; + char *text_buf; + unsigned int text_buf_size; +}; + +struct prb_data_blk_lpos { + long unsigned int begin; + long unsigned int next; +}; + +struct prb_desc { + atomic_long_t state_var; + struct prb_data_blk_lpos text_blk_lpos; +}; + +struct prb_data_ring { + unsigned int size_bits; + char *data; + atomic_long_t head_lpos; + atomic_long_t tail_lpos; +}; + +struct prb_desc_ring { + unsigned int count_bits; + struct prb_desc *descs; + struct printk_info *infos; + atomic_long_t head_id; + atomic_long_t tail_id; + atomic_long_t last_finalized_id; +}; + +struct printk_ringbuffer { + struct prb_desc_ring desc_ring; + struct prb_data_ring text_data_ring; + atomic_long_t fail; +}; + +struct prb_reserved_entry { + struct printk_ringbuffer *rb; + long unsigned int irqflags; + long unsigned int id; + unsigned int text_space; +}; + +enum desc_state { + desc_miss = -1, + desc_reserved = 0, + desc_committed = 1, + desc_finalized = 2, + desc_reusable = 3, +}; + +struct prb_data_block { + long unsigned int id; + char data[0]; +}; + +enum cc_attr { + CC_ATTR_MEM_ENCRYPT = 0, + CC_ATTR_HOST_MEM_ENCRYPT = 1, + CC_ATTR_GUEST_MEM_ENCRYPT = 2, + CC_ATTR_GUEST_STATE_ENCRYPT = 3, + CC_ATTR_GUEST_UNROLL_STRING_IO = 4, + CC_ATTR_GUEST_SEV_SNP = 5, + CC_ATTR_HOTPLUG_DISABLED = 6, +}; + +struct io_tlb_area { + long unsigned int used; + unsigned int index; + spinlock_t lock; +}; + +struct io_tlb_slot { + phys_addr_t orig_addr; + size_t alloc_size; + unsigned int list; +}; + +struct trace_event_raw_swiotlb_bounced { + struct trace_entry ent; + u32 __data_loc_dev_name; + u64 dma_mask; + dma_addr_t dev_addr; + size_t size; + bool force; + char __data[0]; +}; + +struct trace_event_data_offsets_swiotlb_bounced { + u32 dev_name; +}; + +typedef void (*btf_trace_swiotlb_bounced)(void *, struct device *, dma_addr_t, size_t); + +struct xa_state { + struct xarray *xa; + long unsigned int xa_index; + unsigned char xa_shift; + unsigned char xa_sibs; + unsigned char xa_offset; + unsigned char xa_pad; + struct xa_node *xa_node; + struct xa_node *xa_alloc; + xa_update_node_t xa_update; + struct list_lru *xa_lru; +}; + +enum netfs_io_source { + NETFS_FILL_WITH_ZEROES = 0, + NETFS_DOWNLOAD_FROM_SERVER = 1, + NETFS_READ_FROM_CACHE = 2, + NETFS_INVALID_READ = 3, +}; + +typedef void (*netfs_io_terminated_t)(void *, ssize_t, bool); + +struct netfs_request_ops; + +struct netfs_inode { + struct inode inode; + const struct netfs_request_ops *ops; + loff_t remote_i_size; +}; + +struct netfs_io_request; + +struct netfs_io_subrequest; + +struct netfs_request_ops { + int (*init_request)(struct netfs_io_request *, struct file *); + void (*free_request)(struct netfs_io_request *); + int (*begin_cache_operation)(struct netfs_io_request *); + void (*expand_readahead)(struct netfs_io_request *); + bool (*clamp_length)(struct netfs_io_subrequest *); + void (*issue_read)(struct netfs_io_subrequest *); + bool (*is_still_valid)(struct netfs_io_request *); + int (*check_write_begin)(struct file *, loff_t, unsigned int, struct folio **, void **); + void (*done)(struct netfs_io_request *); +}; + +struct netfs_cache_ops; + +struct netfs_cache_resources { + const struct netfs_cache_ops *ops; + void *cache_priv; + void *cache_priv2; + unsigned int debug_id; + unsigned int inval_counter; +}; + +enum netfs_read_from_hole { + NETFS_READ_HOLE_IGNORE = 0, + NETFS_READ_HOLE_CLEAR = 1, + NETFS_READ_HOLE_FAIL = 2, +}; + +struct netfs_cache_ops { + void (*end_operation)(struct netfs_cache_resources *); + int (*read)(struct netfs_cache_resources *, loff_t, struct iov_iter *, enum netfs_read_from_hole, netfs_io_terminated_t, void *); + int (*write)(struct netfs_cache_resources *, loff_t, struct iov_iter *, netfs_io_terminated_t, void *); + void (*expand_readahead)(struct netfs_cache_resources *, loff_t *, size_t *, loff_t); + enum netfs_io_source (*prepare_read)(struct netfs_io_subrequest *, loff_t); + int (*prepare_write)(struct netfs_cache_resources *, loff_t *, size_t *, loff_t, bool); + enum netfs_io_source (*prepare_ondemand_read)(struct netfs_cache_resources *, loff_t, size_t *, loff_t, long unsigned int *, ino_t); + int (*query_occupancy)(struct netfs_cache_resources *, loff_t, size_t, size_t, loff_t *, size_t *); +}; + +struct netfs_io_subrequest { + struct netfs_io_request *rreq; + struct list_head rreq_link; + loff_t start; + size_t len; + size_t transferred; + refcount_t ref; + short int error; + short unsigned int debug_index; + enum netfs_io_source source; + long unsigned int flags; +}; + +enum netfs_io_origin { + NETFS_READAHEAD = 0, + NETFS_READPAGE = 1, + NETFS_READ_FOR_WRITE = 2, +}; + +struct netfs_io_request { + struct work_struct work; + struct inode *inode; + struct address_space *mapping; + struct netfs_cache_resources cache_resources; + struct list_head subrequests; + void *netfs_priv; + unsigned int debug_id; + atomic_t nr_outstanding; + atomic_t nr_copy_ops; + size_t submitted; + size_t len; + short int error; + enum netfs_io_origin origin; + loff_t i_size; + loff_t start; + long unsigned int no_unlock_folio; + refcount_t ref; + long unsigned int flags; + const struct netfs_request_ops *netfs_ops; +}; + +enum netfs_read_trace { + netfs_read_trace_expanded = 0, + netfs_read_trace_readahead = 1, + netfs_read_trace_readpage = 2, + netfs_read_trace_write_begin = 3, +}; + +enum netfs_rreq_trace { + netfs_rreq_trace_assess = 0, + netfs_rreq_trace_copy = 1, + netfs_rreq_trace_done = 2, + netfs_rreq_trace_free = 3, + netfs_rreq_trace_resubmit = 4, + netfs_rreq_trace_unlock = 5, + netfs_rreq_trace_unmark = 6, +}; + +enum netfs_failure { + netfs_fail_check_write_begin = 0, + netfs_fail_copy_to_cache = 1, + netfs_fail_read = 2, + netfs_fail_short_read = 3, + netfs_fail_prepare_write = 4, +}; + +enum netfs_rreq_ref_trace { + netfs_rreq_trace_get_hold = 0, + netfs_rreq_trace_get_subreq = 1, + netfs_rreq_trace_put_complete = 2, + netfs_rreq_trace_put_discard = 3, + netfs_rreq_trace_put_failed = 4, + netfs_rreq_trace_put_hold = 5, + netfs_rreq_trace_put_subreq = 6, + netfs_rreq_trace_put_zero_len = 7, + netfs_rreq_trace_new = 8, +}; + +typedef int __kernel_mqd_t; + +typedef __kernel_mqd_t mqd_t; + +struct sigevent { + sigval_t sigev_value; + int sigev_signo; + int sigev_notify; + union { + int _pad[12]; + int _tid; + struct { + void (*_function)(sigval_t); + void *_attribute; + } _sigev_thread; + } _sigev_un; +}; + +enum inode_i_mutex_lock_class { + I_MUTEX_NORMAL = 0, + I_MUTEX_PARENT = 1, + I_MUTEX_CHILD = 2, + I_MUTEX_XATTR = 3, + I_MUTEX_NONDIR2 = 4, + I_MUTEX_PARENT2 = 5, +}; + +struct mq_attr { + __kernel_long_t mq_flags; + __kernel_long_t mq_maxmsg; + __kernel_long_t mq_msgsize; + __kernel_long_t mq_curmsgs; + __kernel_long_t __reserved[4]; +}; + +struct wake_q_head { + struct wake_q_node *first; + struct wake_q_node **lastp; +}; + +struct mqueue_fs_context { + struct ipc_namespace *ipc_ns; + bool newns; +}; + +struct posix_msg_tree_node { + struct rb_node rb_node; + struct list_head msg_list; + int priority; +}; + +struct ext_wait_queue { + struct task_struct *task; + struct list_head list; + struct msg_msg *msg; + int state; +}; + +struct mqueue_inode_info { + spinlock_t lock; + struct inode vfs_inode; + wait_queue_head_t wait_q; + struct rb_root msg_tree; + struct rb_node *msg_tree_rightmost; + struct posix_msg_tree_node *node_cache; + struct mq_attr attr; + struct sigevent notify; + struct pid *notify_owner; + u32 notify_self_exec_id; + struct user_namespace *notify_user_ns; + struct ucounts *ucounts; + struct sock *notify_sock; + struct sk_buff *notify_cookie; + struct ext_wait_queue e_wait_q[2]; + long unsigned int qsize; +}; + +enum { + BOND_3AD_STAT_LACPDU_RX = 0, + BOND_3AD_STAT_LACPDU_TX = 1, + BOND_3AD_STAT_LACPDU_UNKNOWN_RX = 2, + BOND_3AD_STAT_LACPDU_ILLEGAL_RX = 3, + BOND_3AD_STAT_MARKER_RX = 4, + BOND_3AD_STAT_MARKER_TX = 5, + BOND_3AD_STAT_MARKER_RESP_RX = 6, + BOND_3AD_STAT_MARKER_RESP_TX = 7, + BOND_3AD_STAT_MARKER_UNKNOWN_RX = 8, + BOND_3AD_STAT_PAD = 9, + __BOND_3AD_STAT_MAX = 10, +}; + +enum { + AD_TYPE_LACPDU = 1, + AD_TYPE_MARKER = 2, +}; + +enum { + AD_MARKER_INFORMATION_SUBTYPE = 1, + AD_MARKER_RESPONSE_SUBTYPE = 2, +}; + +enum { + AD_CURRENT_WHILE_TIMER = 0, + AD_ACTOR_CHURN_TIMER = 1, + AD_PERIODIC_TIMER = 2, + AD_PARTNER_CHURN_TIMER = 3, + AD_WAIT_WHILE_TIMER = 4, +}; + +struct lacpdu_header { + struct ethhdr hdr; + struct lacpdu lacpdu; +}; + +struct bond_marker { + u8 subtype; + u8 version_number; + u8 tlv_type; + u8 marker_length; + u16 requester_port; + struct mac_addr requester_system; + u32 requester_transaction_id; + u16 pad; + u8 tlv_type_terminator; + u8 terminator_length; + u8 reserved_90[90]; +} __attribute__((packed)); + +struct bond_marker_header { + struct ethhdr hdr; + struct bond_marker marker; +} __attribute__((packed)); + +enum ad_link_speed_type { + AD_LINK_SPEED_1MBPS = 1, + AD_LINK_SPEED_10MBPS = 2, + AD_LINK_SPEED_100MBPS = 3, + AD_LINK_SPEED_1000MBPS = 4, + AD_LINK_SPEED_2500MBPS = 5, + AD_LINK_SPEED_5000MBPS = 6, + AD_LINK_SPEED_10000MBPS = 7, + AD_LINK_SPEED_14000MBPS = 8, + AD_LINK_SPEED_20000MBPS = 9, + AD_LINK_SPEED_25000MBPS = 10, + AD_LINK_SPEED_40000MBPS = 11, + AD_LINK_SPEED_50000MBPS = 12, + AD_LINK_SPEED_56000MBPS = 13, + AD_LINK_SPEED_100000MBPS = 14, + AD_LINK_SPEED_200000MBPS = 15, + AD_LINK_SPEED_400000MBPS = 16, + AD_LINK_SPEED_800000MBPS = 17, +}; + +struct platform_device_id { + char name[20]; + kernel_ulong_t driver_data; +}; + +struct pdev_archdata {}; + +struct acpi_subtable_header { + u8 type; + u8 length; +}; + +struct acpi_madt_generic_interrupt { + struct acpi_subtable_header header; + u16 reserved; + u32 cpu_interface_number; + u32 uid; + u32 flags; + u32 parking_version; + u32 performance_interrupt; + u64 parked_address; + u64 base_address; + u64 gicv_base_address; + u64 gich_base_address; + u32 vgic_interrupt; + u64 gicr_base_address; + u64 arm_mpidr; + u8 efficiency_class; + u8 reserved2[1]; + u16 spe_interrupt; +} __attribute__((packed)); + +enum perf_hw_id { + PERF_COUNT_HW_CPU_CYCLES = 0, + PERF_COUNT_HW_INSTRUCTIONS = 1, + PERF_COUNT_HW_CACHE_REFERENCES = 2, + PERF_COUNT_HW_CACHE_MISSES = 3, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, + PERF_COUNT_HW_BRANCH_MISSES = 5, + PERF_COUNT_HW_BUS_CYCLES = 6, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, + PERF_COUNT_HW_REF_CPU_CYCLES = 9, + PERF_COUNT_HW_MAX = 10, +}; + +enum perf_hw_cache_id { + PERF_COUNT_HW_CACHE_L1D = 0, + PERF_COUNT_HW_CACHE_L1I = 1, + PERF_COUNT_HW_CACHE_LL = 2, + PERF_COUNT_HW_CACHE_DTLB = 3, + PERF_COUNT_HW_CACHE_ITLB = 4, + PERF_COUNT_HW_CACHE_BPU = 5, + PERF_COUNT_HW_CACHE_NODE = 6, + PERF_COUNT_HW_CACHE_MAX = 7, +}; + +enum perf_hw_cache_op_id { + PERF_COUNT_HW_CACHE_OP_READ = 0, + PERF_COUNT_HW_CACHE_OP_WRITE = 1, + PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, + PERF_COUNT_HW_CACHE_OP_MAX = 3, +}; + +enum perf_hw_cache_op_result_id { + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, + PERF_COUNT_HW_CACHE_RESULT_MISS = 1, + PERF_COUNT_HW_CACHE_RESULT_MAX = 2, +}; + +struct cpu { + int node_id; + int hotpluggable; + struct device dev; +}; + +struct mfd_cell; + +struct platform_device { + const char *name; + int id; + bool id_auto; + struct device dev; + u64 platform_dma_mask; + struct device_dma_parameters dma_parms; + u32 num_resources; + struct resource *resource; + const struct platform_device_id *id_entry; + const char *driver_override; + struct mfd_cell *mfd_cell; + struct pdev_archdata archdata; +}; + +struct arm_pmu; + +struct pmu_hw_events { + struct perf_event *events[32]; + long unsigned int used_mask[1]; + raw_spinlock_t pmu_lock; + struct arm_pmu *percpu_pmu; + int irq; +}; + +struct arm_pmu { + struct pmu pmu; + cpumask_t supported_cpus; + char *name; + int pmuver; + irqreturn_t (*handle_irq)(struct arm_pmu *); + void (*enable)(struct perf_event *); + void (*disable)(struct perf_event *); + int (*get_event_idx)(struct pmu_hw_events *, struct perf_event *); + void (*clear_event_idx)(struct pmu_hw_events *, struct perf_event *); + int (*set_event_filter)(struct hw_perf_event *, struct perf_event_attr *); + u64 (*read_counter)(struct perf_event *); + void (*write_counter)(struct perf_event *, u64); + void (*start)(struct arm_pmu *); + void (*stop)(struct arm_pmu *); + void (*reset)(void *); + int (*map_event)(struct perf_event *); + bool (*filter)(struct pmu *, int); + int num_events; + bool secure_access; + long unsigned int pmceid_bitmap[1]; + long unsigned int pmceid_ext_bitmap[1]; + struct platform_device *plat_device; + struct pmu_hw_events *hw_events; + struct hlist_node node; + struct notifier_block cpu_pm_nb; + const struct attribute_group *attr_groups[5]; + u64 reg_pmmir; + long unsigned int acpi_cpuid; +}; + +enum armpmu_attr_groups { + ARMPMU_ATTR_GROUP_COMMON = 0, + ARMPMU_ATTR_GROUP_EVENTS = 1, + ARMPMU_ATTR_GROUP_FORMATS = 2, + ARMPMU_ATTR_GROUP_CAPS = 3, + ARMPMU_NR_ATTR_GROUPS = 4, +}; + +typedef int (*armpmu_init_fn)(struct arm_pmu *); + +struct cpuinfo_32bit { + u32 reg_id_dfr0; + u32 reg_id_dfr1; + u32 reg_id_isar0; + u32 reg_id_isar1; + u32 reg_id_isar2; + u32 reg_id_isar3; + u32 reg_id_isar4; + u32 reg_id_isar5; + u32 reg_id_isar6; + u32 reg_id_mmfr0; + u32 reg_id_mmfr1; + u32 reg_id_mmfr2; + u32 reg_id_mmfr3; + u32 reg_id_mmfr4; + u32 reg_id_mmfr5; + u32 reg_id_pfr0; + u32 reg_id_pfr1; + u32 reg_id_pfr2; + u32 reg_mvfr0; + u32 reg_mvfr1; + u32 reg_mvfr2; +}; + +struct cpuinfo_arm64 { + struct cpu cpu; + struct kobject kobj; + u64 reg_ctr; + u64 reg_cntfrq; + u64 reg_dczid; + u64 reg_midr; + u64 reg_revidr; + u64 reg_gmid; + u64 reg_smidr; + u64 reg_id_aa64dfr0; + u64 reg_id_aa64dfr1; + u64 reg_id_aa64isar0; + u64 reg_id_aa64isar1; + u64 reg_id_aa64isar2; + u64 reg_id_aa64mmfr0; + u64 reg_id_aa64mmfr1; + u64 reg_id_aa64mmfr2; + u64 reg_id_aa64pfr0; + u64 reg_id_aa64pfr1; + u64 reg_id_aa64zfr0; + u64 reg_id_aa64smfr0; + struct cpuinfo_32bit aarch32; + u64 reg_zcr; + u64 reg_smcr; +}; + +enum hwtstamp_tx_types { + HWTSTAMP_TX_OFF = 0, + HWTSTAMP_TX_ON = 1, + HWTSTAMP_TX_ONESTEP_SYNC = 2, + HWTSTAMP_TX_ONESTEP_P2P = 3, + __HWTSTAMP_TX_CNT = 4, +}; + +enum hwtstamp_rx_filters { + HWTSTAMP_FILTER_NONE = 0, + HWTSTAMP_FILTER_ALL = 1, + HWTSTAMP_FILTER_SOME = 2, + HWTSTAMP_FILTER_PTP_V1_L4_EVENT = 3, + HWTSTAMP_FILTER_PTP_V1_L4_SYNC = 4, + HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ = 5, + HWTSTAMP_FILTER_PTP_V2_L4_EVENT = 6, + HWTSTAMP_FILTER_PTP_V2_L4_SYNC = 7, + HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ = 8, + HWTSTAMP_FILTER_PTP_V2_L2_EVENT = 9, + HWTSTAMP_FILTER_PTP_V2_L2_SYNC = 10, + HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ = 11, + HWTSTAMP_FILTER_PTP_V2_EVENT = 12, + HWTSTAMP_FILTER_PTP_V2_SYNC = 13, + HWTSTAMP_FILTER_PTP_V2_DELAY_REQ = 14, + HWTSTAMP_FILTER_NTP_ALL = 15, + __HWTSTAMP_FILTER_CNT = 16, +}; + +enum tunable_id { + ETHTOOL_ID_UNSPEC = 0, + ETHTOOL_RX_COPYBREAK = 1, + ETHTOOL_TX_COPYBREAK = 2, + ETHTOOL_PFC_PREVENTION_TOUT = 3, + ETHTOOL_TX_COPYBREAK_BUF_SIZE = 4, + __ETHTOOL_TUNABLE_COUNT = 5, +}; + +enum phy_tunable_id { + ETHTOOL_PHY_ID_UNSPEC = 0, + ETHTOOL_PHY_DOWNSHIFT = 1, + ETHTOOL_PHY_FAST_LINK_DOWN = 2, + ETHTOOL_PHY_EDPD = 3, + __ETHTOOL_PHY_TUNABLE_COUNT = 4, +}; + +enum { + ETH_RSS_HASH_TOP_BIT = 0, + ETH_RSS_HASH_XOR_BIT = 1, + ETH_RSS_HASH_CRC32_BIT = 2, + ETH_RSS_HASH_FUNCS_COUNT = 3, +}; + +enum { + ETHTOOL_MSG_USER_NONE = 0, + ETHTOOL_MSG_STRSET_GET = 1, + ETHTOOL_MSG_LINKINFO_GET = 2, + ETHTOOL_MSG_LINKINFO_SET = 3, + ETHTOOL_MSG_LINKMODES_GET = 4, + ETHTOOL_MSG_LINKMODES_SET = 5, + ETHTOOL_MSG_LINKSTATE_GET = 6, + ETHTOOL_MSG_DEBUG_GET = 7, + ETHTOOL_MSG_DEBUG_SET = 8, + ETHTOOL_MSG_WOL_GET = 9, + ETHTOOL_MSG_WOL_SET = 10, + ETHTOOL_MSG_FEATURES_GET = 11, + ETHTOOL_MSG_FEATURES_SET = 12, + ETHTOOL_MSG_PRIVFLAGS_GET = 13, + ETHTOOL_MSG_PRIVFLAGS_SET = 14, + ETHTOOL_MSG_RINGS_GET = 15, + ETHTOOL_MSG_RINGS_SET = 16, + ETHTOOL_MSG_CHANNELS_GET = 17, + ETHTOOL_MSG_CHANNELS_SET = 18, + ETHTOOL_MSG_COALESCE_GET = 19, + ETHTOOL_MSG_COALESCE_SET = 20, + ETHTOOL_MSG_PAUSE_GET = 21, + ETHTOOL_MSG_PAUSE_SET = 22, + ETHTOOL_MSG_EEE_GET = 23, + ETHTOOL_MSG_EEE_SET = 24, + ETHTOOL_MSG_TSINFO_GET = 25, + ETHTOOL_MSG_CABLE_TEST_ACT = 26, + ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 27, + ETHTOOL_MSG_TUNNEL_INFO_GET = 28, + ETHTOOL_MSG_FEC_GET = 29, + ETHTOOL_MSG_FEC_SET = 30, + ETHTOOL_MSG_MODULE_EEPROM_GET = 31, + ETHTOOL_MSG_STATS_GET = 32, + ETHTOOL_MSG_PHC_VCLOCKS_GET = 33, + ETHTOOL_MSG_MODULE_GET = 34, + ETHTOOL_MSG_MODULE_SET = 35, + ETHTOOL_MSG_PSE_GET = 36, + ETHTOOL_MSG_PSE_SET = 37, + ETHTOOL_MSG_RSS_GET = 38, + __ETHTOOL_MSG_USER_CNT = 39, + ETHTOOL_MSG_USER_MAX = 38, +}; + +enum { + ETHTOOL_MSG_KERNEL_NONE = 0, + ETHTOOL_MSG_STRSET_GET_REPLY = 1, + ETHTOOL_MSG_LINKINFO_GET_REPLY = 2, + ETHTOOL_MSG_LINKINFO_NTF = 3, + ETHTOOL_MSG_LINKMODES_GET_REPLY = 4, + ETHTOOL_MSG_LINKMODES_NTF = 5, + ETHTOOL_MSG_LINKSTATE_GET_REPLY = 6, + ETHTOOL_MSG_DEBUG_GET_REPLY = 7, + ETHTOOL_MSG_DEBUG_NTF = 8, + ETHTOOL_MSG_WOL_GET_REPLY = 9, + ETHTOOL_MSG_WOL_NTF = 10, + ETHTOOL_MSG_FEATURES_GET_REPLY = 11, + ETHTOOL_MSG_FEATURES_SET_REPLY = 12, + ETHTOOL_MSG_FEATURES_NTF = 13, + ETHTOOL_MSG_PRIVFLAGS_GET_REPLY = 14, + ETHTOOL_MSG_PRIVFLAGS_NTF = 15, + ETHTOOL_MSG_RINGS_GET_REPLY = 16, + ETHTOOL_MSG_RINGS_NTF = 17, + ETHTOOL_MSG_CHANNELS_GET_REPLY = 18, + ETHTOOL_MSG_CHANNELS_NTF = 19, + ETHTOOL_MSG_COALESCE_GET_REPLY = 20, + ETHTOOL_MSG_COALESCE_NTF = 21, + ETHTOOL_MSG_PAUSE_GET_REPLY = 22, + ETHTOOL_MSG_PAUSE_NTF = 23, + ETHTOOL_MSG_EEE_GET_REPLY = 24, + ETHTOOL_MSG_EEE_NTF = 25, + ETHTOOL_MSG_TSINFO_GET_REPLY = 26, + ETHTOOL_MSG_CABLE_TEST_NTF = 27, + ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 28, + ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 29, + ETHTOOL_MSG_FEC_GET_REPLY = 30, + ETHTOOL_MSG_FEC_NTF = 31, + ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY = 32, + ETHTOOL_MSG_STATS_GET_REPLY = 33, + ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY = 34, + ETHTOOL_MSG_MODULE_GET_REPLY = 35, + ETHTOOL_MSG_MODULE_NTF = 36, + ETHTOOL_MSG_PSE_GET_REPLY = 37, + ETHTOOL_MSG_RSS_GET_REPLY = 38, + __ETHTOOL_MSG_KERNEL_CNT = 39, + ETHTOOL_MSG_KERNEL_MAX = 38, +}; + +enum { + ETHTOOL_A_HEADER_UNSPEC = 0, + ETHTOOL_A_HEADER_DEV_INDEX = 1, + ETHTOOL_A_HEADER_DEV_NAME = 2, + ETHTOOL_A_HEADER_FLAGS = 3, + __ETHTOOL_A_HEADER_CNT = 4, + ETHTOOL_A_HEADER_MAX = 3, +}; + +enum { + ETHTOOL_A_STRSET_UNSPEC = 0, + ETHTOOL_A_STRSET_HEADER = 1, + ETHTOOL_A_STRSET_STRINGSETS = 2, + ETHTOOL_A_STRSET_COUNTS_ONLY = 3, + __ETHTOOL_A_STRSET_CNT = 4, + ETHTOOL_A_STRSET_MAX = 3, +}; + +enum { + ETHTOOL_A_LINKINFO_UNSPEC = 0, + ETHTOOL_A_LINKINFO_HEADER = 1, + ETHTOOL_A_LINKINFO_PORT = 2, + ETHTOOL_A_LINKINFO_PHYADDR = 3, + ETHTOOL_A_LINKINFO_TP_MDIX = 4, + ETHTOOL_A_LINKINFO_TP_MDIX_CTRL = 5, + ETHTOOL_A_LINKINFO_TRANSCEIVER = 6, + __ETHTOOL_A_LINKINFO_CNT = 7, + ETHTOOL_A_LINKINFO_MAX = 6, +}; + +enum { + ETHTOOL_A_LINKMODES_UNSPEC = 0, + ETHTOOL_A_LINKMODES_HEADER = 1, + ETHTOOL_A_LINKMODES_AUTONEG = 2, + ETHTOOL_A_LINKMODES_OURS = 3, + ETHTOOL_A_LINKMODES_PEER = 4, + ETHTOOL_A_LINKMODES_SPEED = 5, + ETHTOOL_A_LINKMODES_DUPLEX = 6, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = 7, + ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = 8, + ETHTOOL_A_LINKMODES_LANES = 9, + ETHTOOL_A_LINKMODES_RATE_MATCHING = 10, + __ETHTOOL_A_LINKMODES_CNT = 11, + ETHTOOL_A_LINKMODES_MAX = 10, +}; + +enum { + ETHTOOL_A_LINKSTATE_UNSPEC = 0, + ETHTOOL_A_LINKSTATE_HEADER = 1, + ETHTOOL_A_LINKSTATE_LINK = 2, + ETHTOOL_A_LINKSTATE_SQI = 3, + ETHTOOL_A_LINKSTATE_SQI_MAX = 4, + ETHTOOL_A_LINKSTATE_EXT_STATE = 5, + ETHTOOL_A_LINKSTATE_EXT_SUBSTATE = 6, + ETHTOOL_A_LINKSTATE_EXT_DOWN_CNT = 7, + __ETHTOOL_A_LINKSTATE_CNT = 8, + ETHTOOL_A_LINKSTATE_MAX = 7, +}; + +enum { + ETHTOOL_A_DEBUG_UNSPEC = 0, + ETHTOOL_A_DEBUG_HEADER = 1, + ETHTOOL_A_DEBUG_MSGMASK = 2, + __ETHTOOL_A_DEBUG_CNT = 3, + ETHTOOL_A_DEBUG_MAX = 2, +}; + +enum { + ETHTOOL_A_WOL_UNSPEC = 0, + ETHTOOL_A_WOL_HEADER = 1, + ETHTOOL_A_WOL_MODES = 2, + ETHTOOL_A_WOL_SOPASS = 3, + __ETHTOOL_A_WOL_CNT = 4, + ETHTOOL_A_WOL_MAX = 3, +}; + +enum { + ETHTOOL_A_FEATURES_UNSPEC = 0, + ETHTOOL_A_FEATURES_HEADER = 1, + ETHTOOL_A_FEATURES_HW = 2, + ETHTOOL_A_FEATURES_WANTED = 3, + ETHTOOL_A_FEATURES_ACTIVE = 4, + ETHTOOL_A_FEATURES_NOCHANGE = 5, + __ETHTOOL_A_FEATURES_CNT = 6, + ETHTOOL_A_FEATURES_MAX = 5, +}; + +enum { + ETHTOOL_A_PRIVFLAGS_UNSPEC = 0, + ETHTOOL_A_PRIVFLAGS_HEADER = 1, + ETHTOOL_A_PRIVFLAGS_FLAGS = 2, + __ETHTOOL_A_PRIVFLAGS_CNT = 3, + ETHTOOL_A_PRIVFLAGS_MAX = 2, +}; + +enum { + ETHTOOL_A_RINGS_UNSPEC = 0, + ETHTOOL_A_RINGS_HEADER = 1, + ETHTOOL_A_RINGS_RX_MAX = 2, + ETHTOOL_A_RINGS_RX_MINI_MAX = 3, + ETHTOOL_A_RINGS_RX_JUMBO_MAX = 4, + ETHTOOL_A_RINGS_TX_MAX = 5, + ETHTOOL_A_RINGS_RX = 6, + ETHTOOL_A_RINGS_RX_MINI = 7, + ETHTOOL_A_RINGS_RX_JUMBO = 8, + ETHTOOL_A_RINGS_TX = 9, + ETHTOOL_A_RINGS_RX_BUF_LEN = 10, + ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 11, + ETHTOOL_A_RINGS_CQE_SIZE = 12, + ETHTOOL_A_RINGS_TX_PUSH = 13, + __ETHTOOL_A_RINGS_CNT = 14, + ETHTOOL_A_RINGS_MAX = 13, +}; + +enum { + ETHTOOL_A_CHANNELS_UNSPEC = 0, + ETHTOOL_A_CHANNELS_HEADER = 1, + ETHTOOL_A_CHANNELS_RX_MAX = 2, + ETHTOOL_A_CHANNELS_TX_MAX = 3, + ETHTOOL_A_CHANNELS_OTHER_MAX = 4, + ETHTOOL_A_CHANNELS_COMBINED_MAX = 5, + ETHTOOL_A_CHANNELS_RX_COUNT = 6, + ETHTOOL_A_CHANNELS_TX_COUNT = 7, + ETHTOOL_A_CHANNELS_OTHER_COUNT = 8, + ETHTOOL_A_CHANNELS_COMBINED_COUNT = 9, + __ETHTOOL_A_CHANNELS_CNT = 10, + ETHTOOL_A_CHANNELS_MAX = 9, +}; + +enum { + ETHTOOL_A_COALESCE_UNSPEC = 0, + ETHTOOL_A_COALESCE_HEADER = 1, + ETHTOOL_A_COALESCE_RX_USECS = 2, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES = 3, + ETHTOOL_A_COALESCE_RX_USECS_IRQ = 4, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = 5, + ETHTOOL_A_COALESCE_TX_USECS = 6, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES = 7, + ETHTOOL_A_COALESCE_TX_USECS_IRQ = 8, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = 9, + ETHTOOL_A_COALESCE_STATS_BLOCK_USECS = 10, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = 11, + ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = 12, + ETHTOOL_A_COALESCE_PKT_RATE_LOW = 13, + ETHTOOL_A_COALESCE_RX_USECS_LOW = 14, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = 15, + ETHTOOL_A_COALESCE_TX_USECS_LOW = 16, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = 17, + ETHTOOL_A_COALESCE_PKT_RATE_HIGH = 18, + ETHTOOL_A_COALESCE_RX_USECS_HIGH = 19, + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = 20, + ETHTOOL_A_COALESCE_TX_USECS_HIGH = 21, + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 22, + ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 23, + ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 24, + ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 25, + __ETHTOOL_A_COALESCE_CNT = 26, + ETHTOOL_A_COALESCE_MAX = 25, +}; + +enum { + ETHTOOL_A_PAUSE_UNSPEC = 0, + ETHTOOL_A_PAUSE_HEADER = 1, + ETHTOOL_A_PAUSE_AUTONEG = 2, + ETHTOOL_A_PAUSE_RX = 3, + ETHTOOL_A_PAUSE_TX = 4, + ETHTOOL_A_PAUSE_STATS = 5, + __ETHTOOL_A_PAUSE_CNT = 6, + ETHTOOL_A_PAUSE_MAX = 5, +}; + +enum { + ETHTOOL_A_EEE_UNSPEC = 0, + ETHTOOL_A_EEE_HEADER = 1, + ETHTOOL_A_EEE_MODES_OURS = 2, + ETHTOOL_A_EEE_MODES_PEER = 3, + ETHTOOL_A_EEE_ACTIVE = 4, + ETHTOOL_A_EEE_ENABLED = 5, + ETHTOOL_A_EEE_TX_LPI_ENABLED = 6, + ETHTOOL_A_EEE_TX_LPI_TIMER = 7, + __ETHTOOL_A_EEE_CNT = 8, + ETHTOOL_A_EEE_MAX = 7, +}; + +enum { + ETHTOOL_A_TSINFO_UNSPEC = 0, + ETHTOOL_A_TSINFO_HEADER = 1, + ETHTOOL_A_TSINFO_TIMESTAMPING = 2, + ETHTOOL_A_TSINFO_TX_TYPES = 3, + ETHTOOL_A_TSINFO_RX_FILTERS = 4, + ETHTOOL_A_TSINFO_PHC_INDEX = 5, + __ETHTOOL_A_TSINFO_CNT = 6, + ETHTOOL_A_TSINFO_MAX = 5, +}; + +enum { + ETHTOOL_A_PHC_VCLOCKS_UNSPEC = 0, + ETHTOOL_A_PHC_VCLOCKS_HEADER = 1, + ETHTOOL_A_PHC_VCLOCKS_NUM = 2, + ETHTOOL_A_PHC_VCLOCKS_INDEX = 3, + __ETHTOOL_A_PHC_VCLOCKS_CNT = 4, + ETHTOOL_A_PHC_VCLOCKS_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_HEADER = 1, + __ETHTOOL_A_CABLE_TEST_CNT = 2, + ETHTOOL_A_CABLE_TEST_MAX = 1, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_HEADER = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG = 2, + __ETHTOOL_A_CABLE_TEST_TDR_CNT = 3, + ETHTOOL_A_CABLE_TEST_TDR_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_INFO_UNSPEC = 0, + ETHTOOL_A_TUNNEL_INFO_HEADER = 1, + ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 2, + __ETHTOOL_A_TUNNEL_INFO_CNT = 3, + ETHTOOL_A_TUNNEL_INFO_MAX = 2, +}; + +enum { + ETHTOOL_A_FEC_UNSPEC = 0, + ETHTOOL_A_FEC_HEADER = 1, + ETHTOOL_A_FEC_MODES = 2, + ETHTOOL_A_FEC_AUTO = 3, + ETHTOOL_A_FEC_ACTIVE = 4, + ETHTOOL_A_FEC_STATS = 5, + __ETHTOOL_A_FEC_CNT = 6, + ETHTOOL_A_FEC_MAX = 5, +}; + +enum { + ETHTOOL_A_MODULE_EEPROM_UNSPEC = 0, + ETHTOOL_A_MODULE_EEPROM_HEADER = 1, + ETHTOOL_A_MODULE_EEPROM_OFFSET = 2, + ETHTOOL_A_MODULE_EEPROM_LENGTH = 3, + ETHTOOL_A_MODULE_EEPROM_PAGE = 4, + ETHTOOL_A_MODULE_EEPROM_BANK = 5, + ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS = 6, + ETHTOOL_A_MODULE_EEPROM_DATA = 7, + __ETHTOOL_A_MODULE_EEPROM_CNT = 8, + ETHTOOL_A_MODULE_EEPROM_MAX = 7, +}; + +enum { + ETHTOOL_A_STATS_UNSPEC = 0, + ETHTOOL_A_STATS_PAD = 1, + ETHTOOL_A_STATS_HEADER = 2, + ETHTOOL_A_STATS_GROUPS = 3, + ETHTOOL_A_STATS_GRP = 4, + __ETHTOOL_A_STATS_CNT = 5, + ETHTOOL_A_STATS_MAX = 4, +}; + +enum { + ETHTOOL_STATS_ETH_PHY = 0, + ETHTOOL_STATS_ETH_MAC = 1, + ETHTOOL_STATS_ETH_CTRL = 2, + ETHTOOL_STATS_RMON = 3, + __ETHTOOL_STATS_CNT = 4, +}; + +enum { + ETHTOOL_A_STATS_ETH_PHY_5_SYM_ERR = 0, + __ETHTOOL_A_STATS_ETH_PHY_CNT = 1, + ETHTOOL_A_STATS_ETH_PHY_MAX = 0, +}; + +enum { + ETHTOOL_A_STATS_ETH_MAC_2_TX_PKT = 0, + ETHTOOL_A_STATS_ETH_MAC_3_SINGLE_COL = 1, + ETHTOOL_A_STATS_ETH_MAC_4_MULTI_COL = 2, + ETHTOOL_A_STATS_ETH_MAC_5_RX_PKT = 3, + ETHTOOL_A_STATS_ETH_MAC_6_FCS_ERR = 4, + ETHTOOL_A_STATS_ETH_MAC_7_ALIGN_ERR = 5, + ETHTOOL_A_STATS_ETH_MAC_8_TX_BYTES = 6, + ETHTOOL_A_STATS_ETH_MAC_9_TX_DEFER = 7, + ETHTOOL_A_STATS_ETH_MAC_10_LATE_COL = 8, + ETHTOOL_A_STATS_ETH_MAC_11_XS_COL = 9, + ETHTOOL_A_STATS_ETH_MAC_12_TX_INT_ERR = 10, + ETHTOOL_A_STATS_ETH_MAC_13_CS_ERR = 11, + ETHTOOL_A_STATS_ETH_MAC_14_RX_BYTES = 12, + ETHTOOL_A_STATS_ETH_MAC_15_RX_INT_ERR = 13, + ETHTOOL_A_STATS_ETH_MAC_18_TX_MCAST = 14, + ETHTOOL_A_STATS_ETH_MAC_19_TX_BCAST = 15, + ETHTOOL_A_STATS_ETH_MAC_20_XS_DEFER = 16, + ETHTOOL_A_STATS_ETH_MAC_21_RX_MCAST = 17, + ETHTOOL_A_STATS_ETH_MAC_22_RX_BCAST = 18, + ETHTOOL_A_STATS_ETH_MAC_23_IR_LEN_ERR = 19, + ETHTOOL_A_STATS_ETH_MAC_24_OOR_LEN = 20, + ETHTOOL_A_STATS_ETH_MAC_25_TOO_LONG_ERR = 21, + __ETHTOOL_A_STATS_ETH_MAC_CNT = 22, + ETHTOOL_A_STATS_ETH_MAC_MAX = 21, +}; + +enum { + ETHTOOL_A_STATS_ETH_CTRL_3_TX = 0, + ETHTOOL_A_STATS_ETH_CTRL_4_RX = 1, + ETHTOOL_A_STATS_ETH_CTRL_5_RX_UNSUP = 2, + __ETHTOOL_A_STATS_ETH_CTRL_CNT = 3, + ETHTOOL_A_STATS_ETH_CTRL_MAX = 2, +}; + +enum { + ETHTOOL_A_STATS_RMON_UNDERSIZE = 0, + ETHTOOL_A_STATS_RMON_OVERSIZE = 1, + ETHTOOL_A_STATS_RMON_FRAG = 2, + ETHTOOL_A_STATS_RMON_JABBER = 3, + __ETHTOOL_A_STATS_RMON_CNT = 4, + ETHTOOL_A_STATS_RMON_MAX = 3, +}; + +enum { + ETHTOOL_A_MODULE_UNSPEC = 0, + ETHTOOL_A_MODULE_HEADER = 1, + ETHTOOL_A_MODULE_POWER_MODE_POLICY = 2, + ETHTOOL_A_MODULE_POWER_MODE = 3, + __ETHTOOL_A_MODULE_CNT = 4, + ETHTOOL_A_MODULE_MAX = 3, +}; + +enum { + ETHTOOL_A_PSE_UNSPEC = 0, + ETHTOOL_A_PSE_HEADER = 1, + ETHTOOL_A_PODL_PSE_ADMIN_STATE = 2, + ETHTOOL_A_PODL_PSE_ADMIN_CONTROL = 3, + ETHTOOL_A_PODL_PSE_PW_D_STATUS = 4, + __ETHTOOL_A_PSE_CNT = 5, + ETHTOOL_A_PSE_MAX = 4, +}; + +enum { + ETHTOOL_A_RSS_UNSPEC = 0, + ETHTOOL_A_RSS_HEADER = 1, + ETHTOOL_A_RSS_CONTEXT = 2, + ETHTOOL_A_RSS_HFUNC = 3, + ETHTOOL_A_RSS_INDIR = 4, + ETHTOOL_A_RSS_HKEY = 5, + __ETHTOOL_A_RSS_CNT = 6, + ETHTOOL_A_RSS_MAX = 5, +}; + +struct genlmsghdr { + __u8 cmd; + __u8 version; + __u16 reserved; +}; + +struct genl_info { + u32 snd_seq; + u32 snd_portid; + struct nlmsghdr *nlhdr; + struct genlmsghdr *genlhdr; + void *userhdr; + struct nlattr **attrs; + possible_net_t _net; + void *user_ptr[2]; + struct netlink_ext_ack *extack; +}; + +struct ethnl_req_info { + struct net_device *dev; + netdevice_tracker dev_tracker; + u32 flags; +}; + +struct ethnl_reply_data { + struct net_device *dev; +}; + +struct ethnl_request_ops { + u8 request_cmd; + u8 reply_cmd; + u16 hdr_attr; + unsigned int req_info_size; + unsigned int reply_data_size; + bool allow_nodev_do; + int (*parse_request)(struct ethnl_req_info *, struct nlattr **, struct netlink_ext_ack *); + int (*prepare_data)(const struct ethnl_req_info *, struct ethnl_reply_data *, struct genl_info *); + int (*reply_size)(const struct ethnl_req_info *, const struct ethnl_reply_data *); + int (*fill_reply)(struct sk_buff *, const struct ethnl_req_info *, const struct ethnl_reply_data *); + void (*cleanup_data)(struct ethnl_reply_data *); +}; + +typedef const char (* const ethnl_string_array_t)[32]; + +struct tsinfo_reply_data { + struct ethnl_reply_data base; + struct ethtool_ts_info ts_info; +}; + +enum { + IFLA_UNSPEC = 0, + IFLA_ADDRESS = 1, + IFLA_BROADCAST = 2, + IFLA_IFNAME = 3, + IFLA_MTU = 4, + IFLA_LINK = 5, + IFLA_QDISC = 6, + IFLA_STATS = 7, + IFLA_COST = 8, + IFLA_PRIORITY = 9, + IFLA_MASTER = 10, + IFLA_WIRELESS = 11, + IFLA_PROTINFO = 12, + IFLA_TXQLEN = 13, + IFLA_MAP = 14, + IFLA_WEIGHT = 15, + IFLA_OPERSTATE = 16, + IFLA_LINKMODE = 17, + IFLA_LINKINFO = 18, + IFLA_NET_NS_PID = 19, + IFLA_IFALIAS = 20, + IFLA_NUM_VF = 21, + IFLA_VFINFO_LIST = 22, + IFLA_STATS64 = 23, + IFLA_VF_PORTS = 24, + IFLA_PORT_SELF = 25, + IFLA_AF_SPEC = 26, + IFLA_GROUP = 27, + IFLA_NET_NS_FD = 28, + IFLA_EXT_MASK = 29, + IFLA_PROMISCUITY = 30, + IFLA_NUM_TX_QUEUES = 31, + IFLA_NUM_RX_QUEUES = 32, + IFLA_CARRIER = 33, + IFLA_PHYS_PORT_ID = 34, + IFLA_CARRIER_CHANGES = 35, + IFLA_PHYS_SWITCH_ID = 36, + IFLA_LINK_NETNSID = 37, + IFLA_PHYS_PORT_NAME = 38, + IFLA_PROTO_DOWN = 39, + IFLA_GSO_MAX_SEGS = 40, + IFLA_GSO_MAX_SIZE = 41, + IFLA_PAD = 42, + IFLA_XDP = 43, + IFLA_EVENT = 44, + IFLA_NEW_NETNSID = 45, + IFLA_IF_NETNSID = 46, + IFLA_TARGET_NETNSID = 46, + IFLA_CARRIER_UP_COUNT = 47, + IFLA_CARRIER_DOWN_COUNT = 48, + IFLA_NEW_IFINDEX = 49, + IFLA_MIN_MTU = 50, + IFLA_MAX_MTU = 51, + IFLA_PROP_LIST = 52, + IFLA_ALT_IFNAME = 53, + IFLA_PERM_ADDRESS = 54, + IFLA_PROTO_DOWN_REASON = 55, + IFLA_PARENT_DEV_NAME = 56, + IFLA_PARENT_DEV_BUS_NAME = 57, + IFLA_GRO_MAX_SIZE = 58, + IFLA_TSO_MAX_SIZE = 59, + IFLA_TSO_MAX_SEGS = 60, + IFLA_ALLMULTI = 61, + IFLA_DEVLINK_PORT = 62, + __IFLA_MAX = 63, +}; + +enum { + IFLA_IPTUN_UNSPEC = 0, + IFLA_IPTUN_LINK = 1, + IFLA_IPTUN_LOCAL = 2, + IFLA_IPTUN_REMOTE = 3, + IFLA_IPTUN_TTL = 4, + IFLA_IPTUN_TOS = 5, + IFLA_IPTUN_ENCAP_LIMIT = 6, + IFLA_IPTUN_FLOWINFO = 7, + IFLA_IPTUN_FLAGS = 8, + IFLA_IPTUN_PROTO = 9, + IFLA_IPTUN_PMTUDISC = 10, + IFLA_IPTUN_6RD_PREFIX = 11, + IFLA_IPTUN_6RD_RELAY_PREFIX = 12, + IFLA_IPTUN_6RD_PREFIXLEN = 13, + IFLA_IPTUN_6RD_RELAY_PREFIXLEN = 14, + IFLA_IPTUN_ENCAP_TYPE = 15, + IFLA_IPTUN_ENCAP_FLAGS = 16, + IFLA_IPTUN_ENCAP_SPORT = 17, + IFLA_IPTUN_ENCAP_DPORT = 18, + IFLA_IPTUN_COLLECT_METADATA = 19, + IFLA_IPTUN_FWMARK = 20, + __IFLA_IPTUN_MAX = 21, +}; + +enum tunnel_encap_types { + TUNNEL_ENCAP_NONE = 0, + TUNNEL_ENCAP_FOU = 1, + TUNNEL_ENCAP_GUE = 2, + TUNNEL_ENCAP_MPLS = 3, +}; + +struct ip_tunnel_prl { + __be32 addr; + __u16 flags; + __u16 __reserved; + __u32 datalen; + __u32 __reserved2; +}; + +struct gro_cell; + +struct gro_cells { + struct gro_cell *cells; +}; + +struct dst_cache_pcpu; + +struct dst_cache { + struct dst_cache_pcpu *cache; + long unsigned int reset_ts; +}; + +struct ip_tunnel_encap { + u16 type; + u16 flags; + __be16 sport; + __be16 dport; +}; + +struct ip_tunnel_prl_entry { + struct ip_tunnel_prl_entry *next; + __be32 addr; + u16 flags; + struct callback_head callback_head; +}; + +struct ip_tunnel { + struct ip_tunnel *next; + struct hlist_node hash_node; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net *net; + long unsigned int err_time; + int err_count; + u32 i_seqno; + atomic_t o_seqno; + int tun_hlen; + u32 index; + u8 erspan_ver; + u8 dir; + u16 hwid; + struct dst_cache dst_cache; + struct ip_tunnel_parm parms; + int mlink; + int encap_hlen; + int hlen; + struct ip_tunnel_encap encap; + struct ip_tunnel_prl_entry *prl; + unsigned int prl_count; + unsigned int ip_tnl_net_id; + struct gro_cells gro_cells; + __u32 fwmark; + bool collect_md; + bool ignore_df; +}; + +struct tnl_ptk_info { + __be16 flags; + __be16 proto; + __be32 key; + __be32 seq; + int hdr_len; +}; + +struct ip_tunnel_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi4 *); + int (*err_handler)(struct sk_buff *, u32); +}; + +enum { + XFRM_DEV_OFFLOAD_UNSPECIFIED = 0, + XFRM_DEV_OFFLOAD_CRYPTO = 1, + XFRM_DEV_OFFLOAD_PACKET = 2, +}; + +struct xfrm_offload { + struct { + __u32 low; + __u32 hi; + } seq; + __u32 flags; + __u32 status; + __u8 proto; + __u8 inner_ipproto; +}; + +struct sec_path { + int len; + int olen; + struct xfrm_state *xvec[6]; + struct xfrm_offload ovec[1]; +}; + +struct xfrm_tunnel { + int (*handler)(struct sk_buff *); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, u32); + struct xfrm_tunnel *next; + int priority; +}; + +struct sit_net { + struct ip_tunnel *tunnels_r_l[16]; + struct ip_tunnel *tunnels_r[16]; + struct ip_tunnel *tunnels_l[16]; + struct ip_tunnel *tunnels_wc[1]; + struct ip_tunnel **tunnels[4]; + struct net_device *fb_tunnel_dev; +}; + +struct metadata_dst; + +typedef long unsigned int efi_status_t; + +typedef u8 efi_bool_t; + +typedef u16 efi_char16_t; + +typedef u64 efi_physical_addr_t; + +typedef void *efi_handle_t; + +typedef guid_t efi_guid_t; + +typedef struct { + u64 signature; + u32 revision; + u32 headersize; + u32 crc32; + u32 reserved; +} efi_table_hdr_t; + +typedef struct { + u32 type; + u32 pad; + u64 phys_addr; + u64 virt_addr; + u64 num_pages; + u64 attribute; +} efi_memory_desc_t; + +typedef struct { + efi_guid_t guid; + u32 headersize; + u32 flags; + u32 imagesize; +} efi_capsule_header_t; + +typedef struct { + u16 year; + u8 month; + u8 day; + u8 hour; + u8 minute; + u8 second; + u8 pad1; + u32 nanosecond; + s16 timezone; + u8 daylight; + u8 pad2; +} efi_time_t; + +typedef struct { + u32 resolution; + u32 accuracy; + u8 sets_to_zero; +} efi_time_cap_t; + +typedef void *efi_event_t; + +typedef void (*efi_event_notify_t)(efi_event_t, void *); + +typedef enum { + EfiTimerCancel = 0, + EfiTimerPeriodic = 1, + EfiTimerRelative = 2, +} EFI_TIMER_DELAY; + +struct efi_generic_dev_path; + +typedef struct efi_generic_dev_path efi_device_path_protocol_t; + +union efi_boot_services { + struct { + efi_table_hdr_t hdr; + void *raise_tpl; + void *restore_tpl; + efi_status_t (*allocate_pages)(int, int, long unsigned int, efi_physical_addr_t *); + efi_status_t (*free_pages)(efi_physical_addr_t, long unsigned int); + efi_status_t (*get_memory_map)(long unsigned int *, void *, long unsigned int *, long unsigned int *, u32 *); + efi_status_t (*allocate_pool)(int, long unsigned int, void **); + efi_status_t (*free_pool)(void *); + efi_status_t (*create_event)(u32, long unsigned int, efi_event_notify_t, void *, efi_event_t *); + efi_status_t (*set_timer)(efi_event_t, EFI_TIMER_DELAY, u64); + efi_status_t (*wait_for_event)(long unsigned int, efi_event_t *, long unsigned int *); + void *signal_event; + efi_status_t (*close_event)(efi_event_t); + void *check_event; + void *install_protocol_interface; + void *reinstall_protocol_interface; + void *uninstall_protocol_interface; + efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **); + void *__reserved; + void *register_protocol_notify; + efi_status_t (*locate_handle)(int, efi_guid_t *, void *, long unsigned int *, efi_handle_t *); + efi_status_t (*locate_device_path)(efi_guid_t *, efi_device_path_protocol_t **, efi_handle_t *); + efi_status_t (*install_configuration_table)(efi_guid_t *, void *); + efi_status_t (*load_image)(bool, efi_handle_t, efi_device_path_protocol_t *, void *, long unsigned int, efi_handle_t *); + efi_status_t (*start_image)(efi_handle_t, long unsigned int *, efi_char16_t **); + efi_status_t (*exit)(efi_handle_t, efi_status_t, long unsigned int, efi_char16_t *); + efi_status_t (*unload_image)(efi_handle_t); + efi_status_t (*exit_boot_services)(efi_handle_t, long unsigned int); + void *get_next_monotonic_count; + efi_status_t (*stall)(long unsigned int); + void *set_watchdog_timer; + void *connect_controller; + efi_status_t (*disconnect_controller)(efi_handle_t, efi_handle_t, efi_handle_t); + void *open_protocol; + void *close_protocol; + void *open_protocol_information; + void *protocols_per_handle; + void *locate_handle_buffer; + efi_status_t (*locate_protocol)(efi_guid_t *, void *, void **); + efi_status_t (*install_multiple_protocol_interfaces)(efi_handle_t *, ...); + efi_status_t (*uninstall_multiple_protocol_interfaces)(efi_handle_t, ...); + void *calculate_crc32; + void (*copy_mem)(void *, const void *, long unsigned int); + void (*set_mem)(void *, long unsigned int, unsigned char); + void *create_event_ex; + }; + struct { + efi_table_hdr_t hdr; + u32 raise_tpl; + u32 restore_tpl; + u32 allocate_pages; + u32 free_pages; + u32 get_memory_map; + u32 allocate_pool; + u32 free_pool; + u32 create_event; + u32 set_timer; + u32 wait_for_event; + u32 signal_event; + u32 close_event; + u32 check_event; + u32 install_protocol_interface; + u32 reinstall_protocol_interface; + u32 uninstall_protocol_interface; + u32 handle_protocol; + u32 __reserved; + u32 register_protocol_notify; + u32 locate_handle; + u32 locate_device_path; + u32 install_configuration_table; + u32 load_image; + u32 start_image; + u32 exit; + u32 unload_image; + u32 exit_boot_services; + u32 get_next_monotonic_count; + u32 stall; + u32 set_watchdog_timer; + u32 connect_controller; + u32 disconnect_controller; + u32 open_protocol; + u32 close_protocol; + u32 open_protocol_information; + u32 protocols_per_handle; + u32 locate_handle_buffer; + u32 locate_protocol; + u32 install_multiple_protocol_interfaces; + u32 uninstall_multiple_protocol_interfaces; + u32 calculate_crc32; + u32 copy_mem; + u32 set_mem; + u32 create_event_ex; + } mixed_mode; +}; + +typedef union efi_boot_services efi_boot_services_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 get_time; + u32 set_time; + u32 get_wakeup_time; + u32 set_wakeup_time; + u32 set_virtual_address_map; + u32 convert_pointer; + u32 get_variable; + u32 get_next_variable; + u32 set_variable; + u32 get_next_high_mono_count; + u32 reset_system; + u32 update_capsule; + u32 query_capsule_caps; + u32 query_variable_info; +} efi_runtime_services_32_t; + +typedef efi_status_t efi_get_time_t(efi_time_t *, efi_time_cap_t *); + +typedef efi_status_t efi_set_time_t(efi_time_t *); + +typedef efi_status_t efi_get_wakeup_time_t(efi_bool_t *, efi_bool_t *, efi_time_t *); + +typedef efi_status_t efi_set_wakeup_time_t(efi_bool_t, efi_time_t *); + +typedef efi_status_t efi_get_variable_t(efi_char16_t *, efi_guid_t *, u32 *, long unsigned int *, void *); + +typedef efi_status_t efi_get_next_variable_t(long unsigned int *, efi_char16_t *, efi_guid_t *); + +typedef efi_status_t efi_set_variable_t(efi_char16_t *, efi_guid_t *, u32, long unsigned int, void *); + +typedef efi_status_t efi_get_next_high_mono_count_t(u32 *); + +typedef void efi_reset_system_t(int, efi_status_t, long unsigned int, efi_char16_t *); + +typedef efi_status_t efi_set_virtual_address_map_t(long unsigned int, long unsigned int, u32, efi_memory_desc_t *); + +typedef efi_status_t efi_query_variable_info_t(u32, u64 *, u64 *, u64 *); + +typedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **, long unsigned int, long unsigned int); + +typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **, long unsigned int, u64 *, int *); + +typedef union { + struct { + efi_table_hdr_t hdr; + efi_get_time_t *get_time; + efi_set_time_t *set_time; + efi_get_wakeup_time_t *get_wakeup_time; + efi_set_wakeup_time_t *set_wakeup_time; + efi_set_virtual_address_map_t *set_virtual_address_map; + void *convert_pointer; + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_get_next_high_mono_count_t *get_next_high_mono_count; + efi_reset_system_t *reset_system; + efi_update_capsule_t *update_capsule; + efi_query_capsule_caps_t *query_capsule_caps; + efi_query_variable_info_t *query_variable_info; + }; + efi_runtime_services_32_t mixed_mode; +} efi_runtime_services_t; + +typedef struct { + efi_table_hdr_t hdr; + u32 fw_vendor; + u32 fw_revision; + u32 con_in_handle; + u32 con_in; + u32 con_out_handle; + u32 con_out; + u32 stderr_handle; + u32 stderr; + u32 runtime; + u32 boottime; + u32 nr_tables; + u32 tables; +} efi_system_table_32_t; + +typedef struct { + u16 scan_code; + efi_char16_t unicode_char; +} efi_input_key_t; + +union efi_simple_text_input_protocol; + +typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; + +union efi_simple_text_input_protocol { + struct { + void *reset; + efi_status_t (*read_keystroke)(efi_simple_text_input_protocol_t *, efi_input_key_t *); + efi_event_t wait_for_key; + }; + struct { + u32 reset; + u32 read_keystroke; + u32 wait_for_key; + } mixed_mode; +}; + +union efi_simple_text_output_protocol; + +typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; + +union efi_simple_text_output_protocol { + struct { + void *reset; + efi_status_t (*output_string)(efi_simple_text_output_protocol_t *, efi_char16_t *); + void *test_string; + }; + struct { + u32 reset; + u32 output_string; + u32 test_string; + } mixed_mode; +}; + +typedef union { + struct { + efi_table_hdr_t hdr; + long unsigned int fw_vendor; + u32 fw_revision; + long unsigned int con_in_handle; + efi_simple_text_input_protocol_t *con_in; + long unsigned int con_out_handle; + efi_simple_text_output_protocol_t *con_out; + long unsigned int stderr_handle; + long unsigned int stderr; + efi_runtime_services_t *runtime; + efi_boot_services_t *boottime; + long unsigned int nr_tables; + long unsigned int tables; + }; + efi_system_table_32_t mixed_mode; +} efi_system_table_t; + +struct efi_generic_dev_path { + u8 type; + u8 sub_type; + u16 length; +}; + +struct midr_range { + u32 model; + u32 rv_min; + u32 rv_max; +}; + +struct arm64_midr_revidr { + u32 midr_rv; + u32 revidr_mask; +}; + +struct arm64_cpu_capabilities { + const char *desc; + u16 capability; + u16 type; + bool (*matches)(const struct arm64_cpu_capabilities *, int); + void (*cpu_enable)(const struct arm64_cpu_capabilities *); + union { + struct { + struct midr_range midr_range; + const struct arm64_midr_revidr * const fixed_revs; + }; + const struct midr_range *midr_range_list; + struct { + u32 sys_reg; + u8 field_pos; + u8 field_width; + u8 min_field_value; + u8 hwcap_type; + bool sign; + long unsigned int hwcap; + }; + }; + const struct arm64_cpu_capabilities *match_list; +}; + +struct cpu_fp_state { + struct user_fpsimd_state *st; + void *sve_state; + void *za_state; + u64 *svcr; + unsigned int sve_vl; + unsigned int sme_vl; + enum fp_type *fp_type; + enum fp_type to_save; +}; + +struct vl_info { + enum vec_type type; + const char *name; + int min_vl; + int max_vl; + int max_virtualisable_vl; + long unsigned int vq_map[8]; + long unsigned int vq_partial_map[8]; +}; + +enum cpu_pm_event { + CPU_PM_ENTER = 0, + CPU_PM_ENTER_FAILED = 1, + CPU_PM_EXIT = 2, + CPU_CLUSTER_PM_ENTER = 3, + CPU_CLUSTER_PM_ENTER_FAILED = 4, + CPU_CLUSTER_PM_EXIT = 5, +}; + +struct vl_config { + int __default_vl; +}; + +typedef void (*call_rcu_func_t)(struct callback_head *, rcu_callback_t); + +typedef int (*task_call_f)(struct task_struct *, void *); + +struct rcu_cblist { + struct callback_head *head; + struct callback_head **tail; + long int len; +}; + +struct rcu_synchronize { + struct callback_head head; + struct completion completion; +}; + +enum hk_type { + HK_TYPE_TIMER = 0, + HK_TYPE_RCU = 1, + HK_TYPE_MISC = 2, + HK_TYPE_SCHED = 3, + HK_TYPE_TICK = 4, + HK_TYPE_DOMAIN = 5, + HK_TYPE_WQ = 6, + HK_TYPE_MANAGED_IRQ = 7, + HK_TYPE_KTHREAD = 8, + HK_TYPE_MAX = 9, +}; + +struct trace_event_raw_rcu_utilization { + struct trace_entry ent; + const char *s; + char __data[0]; +}; + +struct trace_event_raw_rcu_grace_period { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_future_grace_period { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + long int gp_seq_req; + u8 level; + int grplo; + int grphi; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_grace_period_init { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + u8 level; + int grplo; + int grphi; + long unsigned int qsmask; + char __data[0]; +}; + +struct trace_event_raw_rcu_exp_grace_period { + struct trace_entry ent; + const char *rcuname; + long int gpseq; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_exp_funnel_lock { + struct trace_entry ent; + const char *rcuname; + u8 level; + int grplo; + int grphi; + const char *gpevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_preempt_task { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + int pid; + char __data[0]; +}; + +struct trace_event_raw_rcu_unlock_preempted_task { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + int pid; + char __data[0]; +}; + +struct trace_event_raw_rcu_quiescent_state_report { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + long unsigned int mask; + long unsigned int qsmask; + u8 level; + int grplo; + int grphi; + u8 gp_tasks; + char __data[0]; +}; + +struct trace_event_raw_rcu_fqs { + struct trace_entry ent; + const char *rcuname; + long int gp_seq; + int cpu; + const char *qsevent; + char __data[0]; +}; + +struct trace_event_raw_rcu_stall_warning { + struct trace_entry ent; + const char *rcuname; + const char *msg; + char __data[0]; +}; + +struct trace_event_raw_rcu_dyntick { + struct trace_entry ent; + const char *polarity; + long int oldnesting; + long int newnesting; + int dynticks; + char __data[0]; +}; + +struct trace_event_raw_rcu_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + void *func; + long int qlen; + char __data[0]; +}; + +struct trace_event_raw_rcu_segcb_stats { + struct trace_entry ent; + const char *ctx; + long unsigned int gp_seq[4]; + long int seglen[4]; + char __data[0]; +}; + +struct trace_event_raw_rcu_kvfree_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + long unsigned int offset; + long int qlen; + char __data[0]; +}; + +struct trace_event_raw_rcu_batch_start { + struct trace_entry ent; + const char *rcuname; + long int qlen; + long int blimit; + char __data[0]; +}; + +struct trace_event_raw_rcu_invoke_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + void *func; + char __data[0]; +}; + +struct trace_event_raw_rcu_invoke_kvfree_callback { + struct trace_entry ent; + const char *rcuname; + void *rhp; + long unsigned int offset; + char __data[0]; +}; + +struct trace_event_raw_rcu_invoke_kfree_bulk_callback { + struct trace_entry ent; + const char *rcuname; + long unsigned int nr_records; + void **p; + char __data[0]; +}; + +struct trace_event_raw_rcu_batch_end { + struct trace_entry ent; + const char *rcuname; + int callbacks_invoked; + char cb; + char nr; + char iit; + char risk; + char __data[0]; +}; + +struct trace_event_raw_rcu_torture_read { + struct trace_entry ent; + char rcutorturename[8]; + struct callback_head *rhp; + long unsigned int secs; + long unsigned int c_old; + long unsigned int c; + char __data[0]; +}; + +struct trace_event_raw_rcu_barrier { + struct trace_entry ent; + const char *rcuname; + const char *s; + int cpu; + int cnt; + long unsigned int done; + char __data[0]; +}; + +struct trace_event_data_offsets_rcu_utilization {}; + +struct trace_event_data_offsets_rcu_grace_period {}; + +struct trace_event_data_offsets_rcu_future_grace_period {}; + +struct trace_event_data_offsets_rcu_grace_period_init {}; + +struct trace_event_data_offsets_rcu_exp_grace_period {}; + +struct trace_event_data_offsets_rcu_exp_funnel_lock {}; + +struct trace_event_data_offsets_rcu_preempt_task {}; + +struct trace_event_data_offsets_rcu_unlock_preempted_task {}; + +struct trace_event_data_offsets_rcu_quiescent_state_report {}; + +struct trace_event_data_offsets_rcu_fqs {}; + +struct trace_event_data_offsets_rcu_stall_warning {}; + +struct trace_event_data_offsets_rcu_dyntick {}; + +struct trace_event_data_offsets_rcu_callback {}; + +struct trace_event_data_offsets_rcu_segcb_stats {}; + +struct trace_event_data_offsets_rcu_kvfree_callback {}; + +struct trace_event_data_offsets_rcu_batch_start {}; + +struct trace_event_data_offsets_rcu_invoke_callback {}; + +struct trace_event_data_offsets_rcu_invoke_kvfree_callback {}; + +struct trace_event_data_offsets_rcu_invoke_kfree_bulk_callback {}; + +struct trace_event_data_offsets_rcu_batch_end {}; + +struct trace_event_data_offsets_rcu_torture_read {}; + +struct trace_event_data_offsets_rcu_barrier {}; + +typedef void (*btf_trace_rcu_utilization)(void *, const char *); + +typedef void (*btf_trace_rcu_grace_period)(void *, const char *, long unsigned int, const char *); + +typedef void (*btf_trace_rcu_future_grace_period)(void *, const char *, long unsigned int, long unsigned int, u8, int, int, const char *); + +typedef void (*btf_trace_rcu_grace_period_init)(void *, const char *, long unsigned int, u8, int, int, long unsigned int); + +typedef void (*btf_trace_rcu_exp_grace_period)(void *, const char *, long unsigned int, const char *); + +typedef void (*btf_trace_rcu_exp_funnel_lock)(void *, const char *, u8, int, int, const char *); + +typedef void (*btf_trace_rcu_preempt_task)(void *, const char *, int, long unsigned int); + +typedef void (*btf_trace_rcu_unlock_preempted_task)(void *, const char *, long unsigned int, int); + +typedef void (*btf_trace_rcu_quiescent_state_report)(void *, const char *, long unsigned int, long unsigned int, long unsigned int, u8, int, int, int); + +typedef void (*btf_trace_rcu_fqs)(void *, const char *, long unsigned int, int, const char *); + +typedef void (*btf_trace_rcu_stall_warning)(void *, const char *, const char *); + +typedef void (*btf_trace_rcu_dyntick)(void *, const char *, long int, long int, int); + +typedef void (*btf_trace_rcu_callback)(void *, const char *, struct callback_head *, long int); + +typedef void (*btf_trace_rcu_segcb_stats)(void *, struct rcu_segcblist *, const char *); + +typedef void (*btf_trace_rcu_kvfree_callback)(void *, const char *, struct callback_head *, long unsigned int, long int); + +typedef void (*btf_trace_rcu_batch_start)(void *, const char *, long int, long int); + +typedef void (*btf_trace_rcu_invoke_callback)(void *, const char *, struct callback_head *); + +typedef void (*btf_trace_rcu_invoke_kvfree_callback)(void *, const char *, struct callback_head *, long unsigned int); + +typedef void (*btf_trace_rcu_invoke_kfree_bulk_callback)(void *, const char *, long unsigned int, void **); + +typedef void (*btf_trace_rcu_batch_end)(void *, const char *, int, char, char, char, char); + +typedef void (*btf_trace_rcu_torture_read)(void *, const char *, struct callback_head *, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_rcu_barrier)(void *, const char *, const char *, int, int, long unsigned int); + +struct early_boot_kfree_rcu { + struct callback_head rh; +}; + +struct rcu_tasks; + +typedef void (*rcu_tasks_gp_func_t)(struct rcu_tasks *); + +typedef void (*pregp_func_t)(struct list_head *); + +typedef void (*pertask_func_t)(struct task_struct *, struct list_head *); + +typedef void (*postscan_func_t)(struct list_head *); + +typedef void (*holdouts_func_t)(struct list_head *, bool, bool *); + +typedef void (*postgp_func_t)(struct rcu_tasks *); + +struct rcu_tasks_percpu; + +struct rcu_tasks { + struct rcuwait cbs_wait; + raw_spinlock_t cbs_gbl_lock; + struct mutex tasks_gp_mutex; + int gp_state; + int gp_sleep; + int init_fract; + long unsigned int gp_jiffies; + long unsigned int gp_start; + long unsigned int tasks_gp_seq; + long unsigned int n_ipis; + long unsigned int n_ipis_fails; + struct task_struct *kthread_ptr; + rcu_tasks_gp_func_t gp_func; + pregp_func_t pregp_func; + pertask_func_t pertask_func; + postscan_func_t postscan_func; + holdouts_func_t holdouts_func; + postgp_func_t postgp_func; + call_rcu_func_t call_func; + struct rcu_tasks_percpu *rtpcpu; + int percpu_enqueue_shift; + int percpu_enqueue_lim; + int percpu_dequeue_lim; + long unsigned int percpu_dequeue_gpseq; + struct mutex barrier_q_mutex; + atomic_t barrier_q_count; + struct completion barrier_q_completion; + long unsigned int barrier_q_seq; + char *name; + char *kname; +}; + +struct rcu_tasks_percpu { + struct rcu_segcblist cblist; + raw_spinlock_t lock; + long unsigned int rtp_jiffies; + long unsigned int rtp_n_lock_retries; + struct work_struct rtp_work; + struct irq_work rtp_irq_work; + struct callback_head barrier_q_head; + struct list_head rtp_blkd_tasks; + int cpu; + struct rcu_tasks *rtpp; +}; + +struct trc_stall_chk_rdr { + int nesting; + int ipi_to_cpu; + u8 needqs; +}; + +struct rcu_tasks_test_desc { + struct callback_head rh; + const char *name; + bool notrun; + long unsigned int runstart; +}; + +struct wait_bit_key { + void *flags; + int bit_nr; + long unsigned int timeout; +}; + +struct wait_bit_queue_entry { + struct wait_bit_key key; + struct wait_queue_entry wq_entry; +}; + +struct mb_cache { + struct hlist_bl_head *c_hash; + int c_bucket_bits; + long unsigned int c_max_entries; + spinlock_t c_list_lock; + struct list_head c_list; + long unsigned int c_entry_count; + struct shrinker c_shrink; + struct work_struct c_shrink_work; +}; + +enum netfs_sreq_trace { + netfs_sreq_trace_download_instead = 0, + netfs_sreq_trace_free = 1, + netfs_sreq_trace_prepare = 2, + netfs_sreq_trace_resubmit_short = 3, + netfs_sreq_trace_submit = 4, + netfs_sreq_trace_terminated = 5, + netfs_sreq_trace_write = 6, + netfs_sreq_trace_write_skip = 7, + netfs_sreq_trace_write_term = 8, +}; + +enum netfs_sreq_ref_trace { + netfs_sreq_trace_get_copy_to_cache = 0, + netfs_sreq_trace_get_resubmit = 1, + netfs_sreq_trace_get_short_read = 2, + netfs_sreq_trace_new = 3, + netfs_sreq_trace_put_clear = 4, + netfs_sreq_trace_put_failed = 5, + netfs_sreq_trace_put_merged = 6, + netfs_sreq_trace_put_no_copy = 7, + netfs_sreq_trace_put_terminated = 8, +}; + +struct trace_event_raw_netfs_read { + struct trace_entry ent; + unsigned int rreq; + unsigned int cookie; + loff_t start; + size_t len; + enum netfs_read_trace what; + unsigned int netfs_inode; + char __data[0]; +}; + +struct trace_event_raw_netfs_rreq { + struct trace_entry ent; + unsigned int rreq; + unsigned int flags; + enum netfs_io_origin origin; + enum netfs_rreq_trace what; + char __data[0]; +}; + +struct trace_event_raw_netfs_sreq { + struct trace_entry ent; + unsigned int rreq; + short unsigned int index; + short int error; + short unsigned int flags; + enum netfs_io_source source; + enum netfs_sreq_trace what; + size_t len; + size_t transferred; + loff_t start; + char __data[0]; +}; + +struct trace_event_raw_netfs_failure { + struct trace_entry ent; + unsigned int rreq; + short int index; + short int error; + short unsigned int flags; + enum netfs_io_source source; + enum netfs_failure what; + size_t len; + size_t transferred; + loff_t start; + char __data[0]; +}; + +struct trace_event_raw_netfs_rreq_ref { + struct trace_entry ent; + unsigned int rreq; + int ref; + enum netfs_rreq_ref_trace what; + char __data[0]; +}; + +struct trace_event_raw_netfs_sreq_ref { + struct trace_entry ent; + unsigned int rreq; + unsigned int subreq; + int ref; + enum netfs_sreq_ref_trace what; + char __data[0]; +}; + +struct trace_event_data_offsets_netfs_read {}; + +struct trace_event_data_offsets_netfs_rreq {}; + +struct trace_event_data_offsets_netfs_sreq {}; + +struct trace_event_data_offsets_netfs_failure {}; + +struct trace_event_data_offsets_netfs_rreq_ref {}; + +struct trace_event_data_offsets_netfs_sreq_ref {}; + +typedef void (*btf_trace_netfs_read)(void *, struct netfs_io_request *, loff_t, size_t, enum netfs_read_trace); + +typedef void (*btf_trace_netfs_rreq)(void *, struct netfs_io_request *, enum netfs_rreq_trace); + +typedef void (*btf_trace_netfs_sreq)(void *, struct netfs_io_subrequest *, enum netfs_sreq_trace); + +typedef void (*btf_trace_netfs_failure)(void *, struct netfs_io_request *, struct netfs_io_subrequest *, int, enum netfs_failure); + +typedef void (*btf_trace_netfs_rreq_ref)(void *, unsigned int, int, enum netfs_rreq_ref_trace); + +typedef void (*btf_trace_netfs_sreq_ref)(void *, unsigned int, unsigned int, int, enum netfs_sreq_ref_trace); + +enum fid_type { + FILEID_ROOT = 0, + FILEID_INO32_GEN = 1, + FILEID_INO32_GEN_PARENT = 2, + FILEID_BTRFS_WITHOUT_PARENT = 77, + FILEID_BTRFS_WITH_PARENT = 78, + FILEID_BTRFS_WITH_PARENT_ROOT = 79, + FILEID_UDF_WITHOUT_PARENT = 81, + FILEID_UDF_WITH_PARENT = 82, + FILEID_NILFS_WITHOUT_PARENT = 97, + FILEID_NILFS_WITH_PARENT = 98, + FILEID_FAT_WITHOUT_PARENT = 113, + FILEID_FAT_WITH_PARENT = 114, + FILEID_LUSTRE = 151, + FILEID_KERNFS = 254, + FILEID_INVALID = 255, +}; + +struct fid { + union { + struct { + u32 ino; + u32 gen; + u32 parent_ino; + u32 parent_gen; + } i32; + struct { + u32 block; + u16 partref; + u16 parent_partref; + u32 generation; + u32 parent_block; + u32 parent_generation; + } udf; + __u32 raw[0]; + }; +}; + +struct getdents_callback { + struct dir_context ctx; + char *name; + u64 ino; + int found; + int sequence; +}; + +typedef int __kernel_key_t; + +typedef __kernel_key_t key_t; + +enum kernel_read_file_id { + READING_UNKNOWN = 0, + READING_FIRMWARE = 1, + READING_MODULE = 2, + READING_KEXEC_IMAGE = 3, + READING_KEXEC_INITRAMFS = 4, + READING_POLICY = 5, + READING_X509_CERTIFICATE = 6, + READING_MAX_ID = 7, +}; + +struct kern_ipc_perm { + spinlock_t lock; + bool deleted; + int id; + key_t key; + kuid_t uid; + kgid_t gid; + kuid_t cuid; + kgid_t cgid; + umode_t mode; + long unsigned int seq; + void *security; + struct rhash_head khtnode; + struct callback_head rcu; + refcount_t refcount; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct sembuf { + short unsigned int sem_num; + short int sem_op; + short int sem_flg; +}; + +struct io_uring_cmd { + struct file *file; + const void *cmd; + union { + void (*task_work_cb)(struct io_uring_cmd *); + void *cookie; + }; + u32 cmd_op; + u32 flags; + u8 pdu[32]; +}; + +enum lsm_event { + LSM_POLICY_CHANGE = 0, +}; + +enum kernel_load_data_id { + LOADING_UNKNOWN = 0, + LOADING_FIRMWARE = 1, + LOADING_MODULE = 2, + LOADING_KEXEC_IMAGE = 3, + LOADING_KEXEC_INITRAMFS = 4, + LOADING_POLICY = 5, + LOADING_X509_CERTIFICATE = 6, + LOADING_MAX_ID = 7, +}; + +struct sctp_association; + +struct audit_krule; + +union security_list_options { + int (*binder_set_context_mgr)(const struct cred *); + int (*binder_transaction)(const struct cred *, const struct cred *); + int (*binder_transfer_binder)(const struct cred *, const struct cred *); + int (*binder_transfer_file)(const struct cred *, const struct cred *, struct file *); + int (*ptrace_access_check)(struct task_struct *, unsigned int); + int (*ptrace_traceme)(struct task_struct *); + int (*capget)(struct task_struct *, kernel_cap_t *, kernel_cap_t *, kernel_cap_t *); + int (*capset)(struct cred *, const struct cred *, const kernel_cap_t *, const kernel_cap_t *, const kernel_cap_t *); + int (*capable)(const struct cred *, struct user_namespace *, int, unsigned int); + int (*quotactl)(int, int, int, struct super_block *); + int (*quota_on)(struct dentry *); + int (*syslog)(int); + int (*settime)(const struct timespec64 *, const struct timezone *); + int (*vm_enough_memory)(struct mm_struct *, long int); + int (*bprm_creds_for_exec)(struct linux_binprm *); + int (*bprm_creds_from_file)(struct linux_binprm *, struct file *); + int (*bprm_check_security)(struct linux_binprm *); + void (*bprm_committing_creds)(struct linux_binprm *); + void (*bprm_committed_creds)(struct linux_binprm *); + int (*fs_context_dup)(struct fs_context *, struct fs_context *); + int (*fs_context_parse_param)(struct fs_context *, struct fs_parameter *); + int (*sb_alloc_security)(struct super_block *); + void (*sb_delete)(struct super_block *); + void (*sb_free_security)(struct super_block *); + void (*sb_free_mnt_opts)(void *); + int (*sb_eat_lsm_opts)(char *, void **); + int (*sb_mnt_opts_compat)(struct super_block *, void *); + int (*sb_remount)(struct super_block *, void *); + int (*sb_kern_mount)(struct super_block *); + int (*sb_show_options)(struct seq_file *, struct super_block *); + int (*sb_statfs)(struct dentry *); + int (*sb_mount)(const char *, const struct path *, const char *, long unsigned int, void *); + int (*sb_umount)(struct vfsmount *, int); + int (*sb_pivotroot)(const struct path *, const struct path *); + int (*sb_set_mnt_opts)(struct super_block *, void *, long unsigned int, long unsigned int *); + int (*sb_clone_mnt_opts)(const struct super_block *, struct super_block *, long unsigned int, long unsigned int *); + int (*move_mount)(const struct path *, const struct path *); + int (*dentry_init_security)(struct dentry *, int, const struct qstr *, const char **, void **, u32 *); + int (*dentry_create_files_as)(struct dentry *, int, struct qstr *, const struct cred *, struct cred *); + int (*path_notify)(const struct path *, u64, unsigned int); + int (*inode_alloc_security)(struct inode *); + void (*inode_free_security)(struct inode *); + int (*inode_init_security)(struct inode *, struct inode *, const struct qstr *, const char **, void **, size_t *); + int (*inode_init_security_anon)(struct inode *, const struct qstr *, const struct inode *); + int (*inode_create)(struct inode *, struct dentry *, umode_t); + int (*inode_link)(struct dentry *, struct inode *, struct dentry *); + int (*inode_unlink)(struct inode *, struct dentry *); + int (*inode_symlink)(struct inode *, struct dentry *, const char *); + int (*inode_mkdir)(struct inode *, struct dentry *, umode_t); + int (*inode_rmdir)(struct inode *, struct dentry *); + int (*inode_mknod)(struct inode *, struct dentry *, umode_t, dev_t); + int (*inode_rename)(struct inode *, struct dentry *, struct inode *, struct dentry *); + int (*inode_readlink)(struct dentry *); + int (*inode_follow_link)(struct dentry *, struct inode *, bool); + int (*inode_permission)(struct inode *, int); + int (*inode_setattr)(struct dentry *, struct iattr *); + int (*inode_getattr)(const struct path *); + int (*inode_setxattr)(struct user_namespace *, struct dentry *, const char *, const void *, size_t, int); + void (*inode_post_setxattr)(struct dentry *, const char *, const void *, size_t, int); + int (*inode_getxattr)(struct dentry *, const char *); + int (*inode_listxattr)(struct dentry *); + int (*inode_removexattr)(struct user_namespace *, struct dentry *, const char *); + int (*inode_set_acl)(struct user_namespace *, struct dentry *, const char *, struct posix_acl *); + int (*inode_get_acl)(struct user_namespace *, struct dentry *, const char *); + int (*inode_remove_acl)(struct user_namespace *, struct dentry *, const char *); + int (*inode_need_killpriv)(struct dentry *); + int (*inode_killpriv)(struct user_namespace *, struct dentry *); + int (*inode_getsecurity)(struct user_namespace *, struct inode *, const char *, void **, bool); + int (*inode_setsecurity)(struct inode *, const char *, const void *, size_t, int); + int (*inode_listsecurity)(struct inode *, char *, size_t); + void (*inode_getsecid)(struct inode *, u32 *); + int (*inode_copy_up)(struct dentry *, struct cred **); + int (*inode_copy_up_xattr)(const char *); + int (*kernfs_init_security)(struct kernfs_node *, struct kernfs_node *); + int (*file_permission)(struct file *, int); + int (*file_alloc_security)(struct file *); + void (*file_free_security)(struct file *); + int (*file_ioctl)(struct file *, unsigned int, long unsigned int); + int (*mmap_addr)(long unsigned int); + int (*mmap_file)(struct file *, long unsigned int, long unsigned int, long unsigned int); + int (*file_mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int); + int (*file_lock)(struct file *, unsigned int); + int (*file_fcntl)(struct file *, unsigned int, long unsigned int); + void (*file_set_fowner)(struct file *); + int (*file_send_sigiotask)(struct task_struct *, struct fown_struct *, int); + int (*file_receive)(struct file *); + int (*file_open)(struct file *); + int (*file_truncate)(struct file *); + int (*task_alloc)(struct task_struct *, long unsigned int); + void (*task_free)(struct task_struct *); + int (*cred_alloc_blank)(struct cred *, gfp_t); + void (*cred_free)(struct cred *); + int (*cred_prepare)(struct cred *, const struct cred *, gfp_t); + void (*cred_transfer)(struct cred *, const struct cred *); + void (*cred_getsecid)(const struct cred *, u32 *); + int (*kernel_act_as)(struct cred *, u32); + int (*kernel_create_files_as)(struct cred *, struct inode *); + int (*kernel_module_request)(char *); + int (*kernel_load_data)(enum kernel_load_data_id, bool); + int (*kernel_post_load_data)(char *, loff_t, enum kernel_load_data_id, char *); + int (*kernel_read_file)(struct file *, enum kernel_read_file_id, bool); + int (*kernel_post_read_file)(struct file *, char *, loff_t, enum kernel_read_file_id); + int (*task_fix_setuid)(struct cred *, const struct cred *, int); + int (*task_fix_setgid)(struct cred *, const struct cred *, int); + int (*task_fix_setgroups)(struct cred *, const struct cred *); + int (*task_setpgid)(struct task_struct *, pid_t); + int (*task_getpgid)(struct task_struct *); + int (*task_getsid)(struct task_struct *); + void (*current_getsecid_subj)(u32 *); + void (*task_getsecid_obj)(struct task_struct *, u32 *); + int (*task_setnice)(struct task_struct *, int); + int (*task_setioprio)(struct task_struct *, int); + int (*task_getioprio)(struct task_struct *); + int (*task_prlimit)(const struct cred *, const struct cred *, unsigned int); + int (*task_setrlimit)(struct task_struct *, unsigned int, struct rlimit *); + int (*task_setscheduler)(struct task_struct *); + int (*task_getscheduler)(struct task_struct *); + int (*task_movememory)(struct task_struct *); + int (*task_kill)(struct task_struct *, struct kernel_siginfo *, int, const struct cred *); + int (*task_prctl)(int, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + void (*task_to_inode)(struct task_struct *, struct inode *); + int (*userns_create)(const struct cred *); + int (*ipc_permission)(struct kern_ipc_perm *, short int); + void (*ipc_getsecid)(struct kern_ipc_perm *, u32 *); + int (*msg_msg_alloc_security)(struct msg_msg *); + void (*msg_msg_free_security)(struct msg_msg *); + int (*msg_queue_alloc_security)(struct kern_ipc_perm *); + void (*msg_queue_free_security)(struct kern_ipc_perm *); + int (*msg_queue_associate)(struct kern_ipc_perm *, int); + int (*msg_queue_msgctl)(struct kern_ipc_perm *, int); + int (*msg_queue_msgsnd)(struct kern_ipc_perm *, struct msg_msg *, int); + int (*msg_queue_msgrcv)(struct kern_ipc_perm *, struct msg_msg *, struct task_struct *, long int, int); + int (*shm_alloc_security)(struct kern_ipc_perm *); + void (*shm_free_security)(struct kern_ipc_perm *); + int (*shm_associate)(struct kern_ipc_perm *, int); + int (*shm_shmctl)(struct kern_ipc_perm *, int); + int (*shm_shmat)(struct kern_ipc_perm *, char *, int); + int (*sem_alloc_security)(struct kern_ipc_perm *); + void (*sem_free_security)(struct kern_ipc_perm *); + int (*sem_associate)(struct kern_ipc_perm *, int); + int (*sem_semctl)(struct kern_ipc_perm *, int); + int (*sem_semop)(struct kern_ipc_perm *, struct sembuf *, unsigned int, int); + int (*netlink_send)(struct sock *, struct sk_buff *); + void (*d_instantiate)(struct dentry *, struct inode *); + int (*getprocattr)(struct task_struct *, const char *, char **); + int (*setprocattr)(const char *, void *, size_t); + int (*ismaclabel)(const char *); + int (*secid_to_secctx)(u32, char **, u32 *); + int (*secctx_to_secid)(const char *, u32, u32 *); + void (*release_secctx)(char *, u32); + void (*inode_invalidate_secctx)(struct inode *); + int (*inode_notifysecctx)(struct inode *, void *, u32); + int (*inode_setsecctx)(struct dentry *, void *, u32); + int (*inode_getsecctx)(struct inode *, void **, u32 *); + int (*unix_stream_connect)(struct sock *, struct sock *, struct sock *); + int (*unix_may_send)(struct socket *, struct socket *); + int (*socket_create)(int, int, int, int); + int (*socket_post_create)(struct socket *, int, int, int, int); + int (*socket_socketpair)(struct socket *, struct socket *); + int (*socket_bind)(struct socket *, struct sockaddr *, int); + int (*socket_connect)(struct socket *, struct sockaddr *, int); + int (*socket_listen)(struct socket *, int); + int (*socket_accept)(struct socket *, struct socket *); + int (*socket_sendmsg)(struct socket *, struct msghdr *, int); + int (*socket_recvmsg)(struct socket *, struct msghdr *, int, int); + int (*socket_getsockname)(struct socket *); + int (*socket_getpeername)(struct socket *); + int (*socket_getsockopt)(struct socket *, int, int); + int (*socket_setsockopt)(struct socket *, int, int); + int (*socket_shutdown)(struct socket *, int); + int (*socket_sock_rcv_skb)(struct sock *, struct sk_buff *); + int (*socket_getpeersec_stream)(struct socket *, sockptr_t, sockptr_t, unsigned int); + int (*socket_getpeersec_dgram)(struct socket *, struct sk_buff *, u32 *); + int (*sk_alloc_security)(struct sock *, int, gfp_t); + void (*sk_free_security)(struct sock *); + void (*sk_clone_security)(const struct sock *, struct sock *); + void (*sk_getsecid)(struct sock *, u32 *); + void (*sock_graft)(struct sock *, struct socket *); + int (*inet_conn_request)(const struct sock *, struct sk_buff *, struct request_sock *); + void (*inet_csk_clone)(struct sock *, const struct request_sock *); + void (*inet_conn_established)(struct sock *, struct sk_buff *); + int (*secmark_relabel_packet)(u32); + void (*secmark_refcount_inc)(); + void (*secmark_refcount_dec)(); + void (*req_classify_flow)(const struct request_sock *, struct flowi_common *); + int (*tun_dev_alloc_security)(void **); + void (*tun_dev_free_security)(void *); + int (*tun_dev_create)(); + int (*tun_dev_attach_queue)(void *); + int (*tun_dev_attach)(struct sock *, void *); + int (*tun_dev_open)(void *); + int (*sctp_assoc_request)(struct sctp_association *, struct sk_buff *); + int (*sctp_bind_connect)(struct sock *, int, struct sockaddr *, int); + void (*sctp_sk_clone)(struct sctp_association *, struct sock *, struct sock *); + int (*sctp_assoc_established)(struct sctp_association *, struct sk_buff *); + int (*key_alloc)(struct key *, const struct cred *, long unsigned int); + void (*key_free)(struct key *); + int (*key_permission)(key_ref_t, const struct cred *, enum key_need_perm); + int (*key_getsecurity)(struct key *, char **); + int (*audit_rule_init)(u32, u32, char *, void **); + int (*audit_rule_known)(struct audit_krule *); + int (*audit_rule_match)(u32, u32, u32, void *); + void (*audit_rule_free)(void *); + int (*bpf)(int, union bpf_attr *, unsigned int); + int (*bpf_map)(struct bpf_map *, fmode_t); + int (*bpf_prog)(struct bpf_prog *); + int (*bpf_map_alloc_security)(struct bpf_map *); + void (*bpf_map_free_security)(struct bpf_map *); + int (*bpf_prog_alloc_security)(struct bpf_prog_aux *); + void (*bpf_prog_free_security)(struct bpf_prog_aux *); + int (*locked_down)(enum lockdown_reason); + int (*perf_event_open)(struct perf_event_attr *, int); + int (*perf_event_alloc)(struct perf_event *); + void (*perf_event_free)(struct perf_event *); + int (*perf_event_read)(struct perf_event *); + int (*perf_event_write)(struct perf_event *); + int (*uring_override_creds)(const struct cred *); + int (*uring_sqpoll)(); + int (*uring_cmd)(struct io_uring_cmd *); +}; + +enum sctp_endpoint_type { + SCTP_EP_TYPE_SOCKET = 0, + SCTP_EP_TYPE_ASSOCIATION = 1, +}; + +struct sctp_chunk; + +struct sctp_inq { + struct list_head in_chunk_list; + struct sctp_chunk *in_progress; + struct work_struct immediate; +}; + +struct sctp_bind_addr { + __u16 port; + struct list_head address_list; +}; + +struct sctp_ep_common { + enum sctp_endpoint_type type; + refcount_t refcnt; + bool dead; + struct sock *sk; + struct net *net; + struct sctp_inq inqueue; + struct sctp_bind_addr bind_addr; +}; + +typedef __s32 sctp_assoc_t; + +struct sockaddr_in { + __kernel_sa_family_t sin_family; + __be16 sin_port; + struct in_addr sin_addr; + unsigned char __pad[8]; +}; + +struct sockaddr_in6 { + short unsigned int sin6_family; + __be16 sin6_port; + __be32 sin6_flowinfo; + struct in6_addr sin6_addr; + __u32 sin6_scope_id; +}; + +union sctp_addr { + struct sockaddr_in v4; + struct sockaddr_in6 v6; + struct sockaddr sa; +}; + +struct sctp_chunkhdr { + __u8 type; + __u8 flags; + __be16 length; +}; + +struct sctp_inithdr { + __be32 init_tag; + __be32 a_rwnd; + __be16 num_outbound_streams; + __be16 num_inbound_streams; + __be32 initial_tsn; + __u8 params[0]; +}; + +struct sctp_init_chunk { + struct sctp_chunkhdr chunk_hdr; + struct sctp_inithdr init_hdr; +}; + +struct sctp_cookie { + __u32 my_vtag; + __u32 peer_vtag; + __u32 my_ttag; + __u32 peer_ttag; + ktime_t expiration; + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u32 initial_tsn; + union sctp_addr peer_addr; + __u16 my_port; + __u8 prsctp_capable; + __u8 padding; + __u32 adaptation_ind; + __u8 auth_random[36]; + __u8 auth_hmacs[10]; + __u8 auth_chunks[20]; + __u32 raw_addr_list_len; + struct sctp_init_chunk peer_init[0]; +}; + +struct sctp_tsnmap { + long unsigned int *tsn_map; + __u32 base_tsn; + __u32 cumulative_tsn_ack_point; + __u32 max_tsn_seen; + __u16 len; + __u16 pending_data; + __u16 num_dup_tsns; + __be32 dup_tsns[16]; +}; + +struct sctp_inithdr_host { + __u32 init_tag; + __u32 a_rwnd; + __u16 num_outbound_streams; + __u16 num_inbound_streams; + __u32 initial_tsn; +}; + +enum sctp_state { + SCTP_STATE_CLOSED = 0, + SCTP_STATE_COOKIE_WAIT = 1, + SCTP_STATE_COOKIE_ECHOED = 2, + SCTP_STATE_ESTABLISHED = 3, + SCTP_STATE_SHUTDOWN_PENDING = 4, + SCTP_STATE_SHUTDOWN_SENT = 5, + SCTP_STATE_SHUTDOWN_RECEIVED = 6, + SCTP_STATE_SHUTDOWN_ACK_SENT = 7, +}; + +struct genradix_root; + +struct __genradix { + struct genradix_root *root; +}; + +struct sctp_stream_out_ext; + +struct sctp_stream_out { + union { + __u32 mid; + __u16 ssn; + }; + __u32 mid_uo; + struct sctp_stream_out_ext *ext; + __u8 state; +}; + +struct sctp_stream_in { + union { + __u32 mid; + __u16 ssn; + }; + __u32 mid_uo; + __u32 fsn; + __u32 fsn_uo; + char pd_mode; + char pd_mode_uo; +}; + +struct sctp_stream_interleave; + +struct sctp_stream { + struct { + struct __genradix tree; + struct sctp_stream_out type[0]; + } out; + struct { + struct __genradix tree; + struct sctp_stream_in type[0]; + } in; + __u16 outcnt; + __u16 incnt; + struct sctp_stream_out *out_curr; + union { + struct { + struct list_head prio_list; + }; + struct { + struct list_head rr_list; + struct sctp_stream_out_ext *rr_next; + }; + }; + struct sctp_stream_interleave *si; +}; + +struct sctp_sched_ops; + +struct sctp_outq { + struct sctp_association *asoc; + struct list_head out_chunk_list; + struct sctp_sched_ops *sched; + unsigned int out_qlen; + unsigned int error; + struct list_head control_chunk_list; + struct list_head sacked; + struct list_head retransmit; + struct list_head abandoned; + __u32 outstanding_bytes; + char fast_rtx; + char cork; +}; + +struct sctp_ulpq { + char pd_mode; + struct sctp_association *asoc; + struct sk_buff_head reasm; + struct sk_buff_head reasm_uo; + struct sk_buff_head lobby; +}; + +struct sctp_priv_assoc_stats { + struct __kernel_sockaddr_storage obs_rto_ipaddr; + __u64 max_obs_rto; + __u64 isacks; + __u64 osacks; + __u64 opackets; + __u64 ipackets; + __u64 rtxchunks; + __u64 outofseqtsns; + __u64 idupchunks; + __u64 gapcnt; + __u64 ouodchunks; + __u64 iuodchunks; + __u64 oodchunks; + __u64 iodchunks; + __u64 octrlchunks; + __u64 ictrlchunks; +}; + +struct sctp_endpoint; + +struct sctp_transport; + +struct sctp_random_param; + +struct sctp_chunks_param; + +struct sctp_hmac_algo_param; + +struct sctp_auth_bytes; + +struct sctp_shared_key; + +struct sctp_association { + struct sctp_ep_common base; + struct list_head asocs; + sctp_assoc_t assoc_id; + struct sctp_endpoint *ep; + struct sctp_cookie c; + struct { + struct list_head transport_addr_list; + __u32 rwnd; + __u16 transport_count; + __u16 port; + struct sctp_transport *primary_path; + union sctp_addr primary_addr; + struct sctp_transport *active_path; + struct sctp_transport *retran_path; + struct sctp_transport *last_sent_to; + struct sctp_transport *last_data_from; + struct sctp_tsnmap tsn_map; + __be16 addip_disabled_mask; + __u16 ecn_capable: 1; + __u16 ipv4_address: 1; + __u16 ipv6_address: 1; + __u16 hostname_address: 1; + __u16 asconf_capable: 1; + __u16 prsctp_capable: 1; + __u16 reconf_capable: 1; + __u16 intl_capable: 1; + __u16 auth_capable: 1; + __u16 sack_needed: 1; + __u16 sack_generation: 1; + __u16 zero_window_announced: 1; + __u32 sack_cnt; + __u32 adaptation_ind; + struct sctp_inithdr_host i; + void *cookie; + int cookie_len; + __u32 addip_serial; + struct sctp_random_param *peer_random; + struct sctp_chunks_param *peer_chunks; + struct sctp_hmac_algo_param *peer_hmacs; + } peer; + enum sctp_state state; + int overall_error_count; + ktime_t cookie_life; + long unsigned int rto_initial; + long unsigned int rto_max; + long unsigned int rto_min; + int max_burst; + int max_retrans; + __u16 pf_retrans; + __u16 ps_retrans; + __u16 max_init_attempts; + __u16 init_retries; + long unsigned int max_init_timeo; + long unsigned int hbinterval; + long unsigned int probe_interval; + __be16 encap_port; + __u16 pathmaxrxt; + __u32 flowlabel; + __u8 dscp; + __u8 pmtu_pending; + __u32 pathmtu; + __u32 param_flags; + __u32 sackfreq; + long unsigned int sackdelay; + long unsigned int timeouts[12]; + struct timer_list timers[12]; + struct sctp_transport *shutdown_last_sent_to; + struct sctp_transport *init_last_sent_to; + int shutdown_retries; + __u32 next_tsn; + __u32 ctsn_ack_point; + __u32 adv_peer_ack_point; + __u32 highest_sacked; + __u32 fast_recovery_exit; + __u8 fast_recovery; + __u16 unack_data; + __u32 rtx_data_chunks; + __u32 rwnd; + __u32 a_rwnd; + __u32 rwnd_over; + __u32 rwnd_press; + int sndbuf_used; + atomic_t rmem_alloc; + wait_queue_head_t wait; + __u32 frag_point; + __u32 user_frag; + int init_err_counter; + int init_cycle; + __u16 default_stream; + __u16 default_flags; + __u32 default_ppid; + __u32 default_context; + __u32 default_timetolive; + __u32 default_rcv_context; + struct sctp_stream stream; + struct sctp_outq outqueue; + struct sctp_ulpq ulpq; + __u32 last_ecne_tsn; + __u32 last_cwr_tsn; + int numduptsns; + struct sctp_chunk *addip_last_asconf; + struct list_head asconf_ack_list; + struct list_head addip_chunk_list; + __u32 addip_serial; + int src_out_of_asoc_ok; + union sctp_addr *asconf_addr_del_pending; + struct sctp_transport *new_transport; + struct list_head endpoint_shared_keys; + struct sctp_auth_bytes *asoc_shared_key; + struct sctp_shared_key *shkey; + __u16 default_hmac_id; + __u16 active_key_id; + __u8 need_ecne: 1; + __u8 temp: 1; + __u8 pf_expose: 2; + __u8 force_delay: 1; + __u8 strreset_enable; + __u8 strreset_outstanding; + __u32 strreset_outseq; + __u32 strreset_inseq; + __u32 strreset_result[2]; + struct sctp_chunk *strreset_chunk; + struct sctp_priv_assoc_stats stats; + int sent_cnt_removable; + __u16 subscribe; + __u64 abandoned_unsent[3]; + __u64 abandoned_sent[3]; + u32 secid; + u32 peer_secid; + struct callback_head rcu; +}; + +struct audit_field; + +struct audit_watch; + +struct audit_tree; + +struct audit_fsnotify_mark; + +struct audit_krule { + u32 pflags; + u32 flags; + u32 listnr; + u32 action; + u32 mask[64]; + u32 buflen; + u32 field_count; + char *filterkey; + struct audit_field *fields; + struct audit_field *arch_f; + struct audit_field *inode_f; + struct audit_watch *watch; + struct audit_tree *tree; + struct audit_fsnotify_mark *exe; + struct list_head rlist; + struct list_head list; + u64 prio; +}; + +struct security_hook_heads { + struct hlist_head binder_set_context_mgr; + struct hlist_head binder_transaction; + struct hlist_head binder_transfer_binder; + struct hlist_head binder_transfer_file; + struct hlist_head ptrace_access_check; + struct hlist_head ptrace_traceme; + struct hlist_head capget; + struct hlist_head capset; + struct hlist_head capable; + struct hlist_head quotactl; + struct hlist_head quota_on; + struct hlist_head syslog; + struct hlist_head settime; + struct hlist_head vm_enough_memory; + struct hlist_head bprm_creds_for_exec; + struct hlist_head bprm_creds_from_file; + struct hlist_head bprm_check_security; + struct hlist_head bprm_committing_creds; + struct hlist_head bprm_committed_creds; + struct hlist_head fs_context_dup; + struct hlist_head fs_context_parse_param; + struct hlist_head sb_alloc_security; + struct hlist_head sb_delete; + struct hlist_head sb_free_security; + struct hlist_head sb_free_mnt_opts; + struct hlist_head sb_eat_lsm_opts; + struct hlist_head sb_mnt_opts_compat; + struct hlist_head sb_remount; + struct hlist_head sb_kern_mount; + struct hlist_head sb_show_options; + struct hlist_head sb_statfs; + struct hlist_head sb_mount; + struct hlist_head sb_umount; + struct hlist_head sb_pivotroot; + struct hlist_head sb_set_mnt_opts; + struct hlist_head sb_clone_mnt_opts; + struct hlist_head move_mount; + struct hlist_head dentry_init_security; + struct hlist_head dentry_create_files_as; + struct hlist_head path_notify; + struct hlist_head inode_alloc_security; + struct hlist_head inode_free_security; + struct hlist_head inode_init_security; + struct hlist_head inode_init_security_anon; + struct hlist_head inode_create; + struct hlist_head inode_link; + struct hlist_head inode_unlink; + struct hlist_head inode_symlink; + struct hlist_head inode_mkdir; + struct hlist_head inode_rmdir; + struct hlist_head inode_mknod; + struct hlist_head inode_rename; + struct hlist_head inode_readlink; + struct hlist_head inode_follow_link; + struct hlist_head inode_permission; + struct hlist_head inode_setattr; + struct hlist_head inode_getattr; + struct hlist_head inode_setxattr; + struct hlist_head inode_post_setxattr; + struct hlist_head inode_getxattr; + struct hlist_head inode_listxattr; + struct hlist_head inode_removexattr; + struct hlist_head inode_set_acl; + struct hlist_head inode_get_acl; + struct hlist_head inode_remove_acl; + struct hlist_head inode_need_killpriv; + struct hlist_head inode_killpriv; + struct hlist_head inode_getsecurity; + struct hlist_head inode_setsecurity; + struct hlist_head inode_listsecurity; + struct hlist_head inode_getsecid; + struct hlist_head inode_copy_up; + struct hlist_head inode_copy_up_xattr; + struct hlist_head kernfs_init_security; + struct hlist_head file_permission; + struct hlist_head file_alloc_security; + struct hlist_head file_free_security; + struct hlist_head file_ioctl; + struct hlist_head mmap_addr; + struct hlist_head mmap_file; + struct hlist_head file_mprotect; + struct hlist_head file_lock; + struct hlist_head file_fcntl; + struct hlist_head file_set_fowner; + struct hlist_head file_send_sigiotask; + struct hlist_head file_receive; + struct hlist_head file_open; + struct hlist_head file_truncate; + struct hlist_head task_alloc; + struct hlist_head task_free; + struct hlist_head cred_alloc_blank; + struct hlist_head cred_free; + struct hlist_head cred_prepare; + struct hlist_head cred_transfer; + struct hlist_head cred_getsecid; + struct hlist_head kernel_act_as; + struct hlist_head kernel_create_files_as; + struct hlist_head kernel_module_request; + struct hlist_head kernel_load_data; + struct hlist_head kernel_post_load_data; + struct hlist_head kernel_read_file; + struct hlist_head kernel_post_read_file; + struct hlist_head task_fix_setuid; + struct hlist_head task_fix_setgid; + struct hlist_head task_fix_setgroups; + struct hlist_head task_setpgid; + struct hlist_head task_getpgid; + struct hlist_head task_getsid; + struct hlist_head current_getsecid_subj; + struct hlist_head task_getsecid_obj; + struct hlist_head task_setnice; + struct hlist_head task_setioprio; + struct hlist_head task_getioprio; + struct hlist_head task_prlimit; + struct hlist_head task_setrlimit; + struct hlist_head task_setscheduler; + struct hlist_head task_getscheduler; + struct hlist_head task_movememory; + struct hlist_head task_kill; + struct hlist_head task_prctl; + struct hlist_head task_to_inode; + struct hlist_head userns_create; + struct hlist_head ipc_permission; + struct hlist_head ipc_getsecid; + struct hlist_head msg_msg_alloc_security; + struct hlist_head msg_msg_free_security; + struct hlist_head msg_queue_alloc_security; + struct hlist_head msg_queue_free_security; + struct hlist_head msg_queue_associate; + struct hlist_head msg_queue_msgctl; + struct hlist_head msg_queue_msgsnd; + struct hlist_head msg_queue_msgrcv; + struct hlist_head shm_alloc_security; + struct hlist_head shm_free_security; + struct hlist_head shm_associate; + struct hlist_head shm_shmctl; + struct hlist_head shm_shmat; + struct hlist_head sem_alloc_security; + struct hlist_head sem_free_security; + struct hlist_head sem_associate; + struct hlist_head sem_semctl; + struct hlist_head sem_semop; + struct hlist_head netlink_send; + struct hlist_head d_instantiate; + struct hlist_head getprocattr; + struct hlist_head setprocattr; + struct hlist_head ismaclabel; + struct hlist_head secid_to_secctx; + struct hlist_head secctx_to_secid; + struct hlist_head release_secctx; + struct hlist_head inode_invalidate_secctx; + struct hlist_head inode_notifysecctx; + struct hlist_head inode_setsecctx; + struct hlist_head inode_getsecctx; + struct hlist_head unix_stream_connect; + struct hlist_head unix_may_send; + struct hlist_head socket_create; + struct hlist_head socket_post_create; + struct hlist_head socket_socketpair; + struct hlist_head socket_bind; + struct hlist_head socket_connect; + struct hlist_head socket_listen; + struct hlist_head socket_accept; + struct hlist_head socket_sendmsg; + struct hlist_head socket_recvmsg; + struct hlist_head socket_getsockname; + struct hlist_head socket_getpeername; + struct hlist_head socket_getsockopt; + struct hlist_head socket_setsockopt; + struct hlist_head socket_shutdown; + struct hlist_head socket_sock_rcv_skb; + struct hlist_head socket_getpeersec_stream; + struct hlist_head socket_getpeersec_dgram; + struct hlist_head sk_alloc_security; + struct hlist_head sk_free_security; + struct hlist_head sk_clone_security; + struct hlist_head sk_getsecid; + struct hlist_head sock_graft; + struct hlist_head inet_conn_request; + struct hlist_head inet_csk_clone; + struct hlist_head inet_conn_established; + struct hlist_head secmark_relabel_packet; + struct hlist_head secmark_refcount_inc; + struct hlist_head secmark_refcount_dec; + struct hlist_head req_classify_flow; + struct hlist_head tun_dev_alloc_security; + struct hlist_head tun_dev_free_security; + struct hlist_head tun_dev_create; + struct hlist_head tun_dev_attach_queue; + struct hlist_head tun_dev_attach; + struct hlist_head tun_dev_open; + struct hlist_head sctp_assoc_request; + struct hlist_head sctp_bind_connect; + struct hlist_head sctp_sk_clone; + struct hlist_head sctp_assoc_established; + struct hlist_head key_alloc; + struct hlist_head key_free; + struct hlist_head key_permission; + struct hlist_head key_getsecurity; + struct hlist_head audit_rule_init; + struct hlist_head audit_rule_known; + struct hlist_head audit_rule_match; + struct hlist_head audit_rule_free; + struct hlist_head bpf; + struct hlist_head bpf_map; + struct hlist_head bpf_prog; + struct hlist_head bpf_map_alloc_security; + struct hlist_head bpf_map_free_security; + struct hlist_head bpf_prog_alloc_security; + struct hlist_head bpf_prog_free_security; + struct hlist_head locked_down; + struct hlist_head perf_event_open; + struct hlist_head perf_event_alloc; + struct hlist_head perf_event_free; + struct hlist_head perf_event_read; + struct hlist_head perf_event_write; + struct hlist_head uring_override_creds; + struct hlist_head uring_sqpoll; + struct hlist_head uring_cmd; +}; + +struct security_hook_list { + struct hlist_node list; + struct hlist_head *head; + union security_list_options hook; + const char *lsm; +}; + +struct lsm_blob_sizes { + int lbs_cred; + int lbs_file; + int lbs_inode; + int lbs_superblock; + int lbs_ipc; + int lbs_msg_msg; + int lbs_task; +}; + +enum lsm_order { + LSM_ORDER_FIRST = -1, + LSM_ORDER_MUTABLE = 0, +}; + +struct lsm_info { + const char *name; + enum lsm_order order; + long unsigned int flags; + int *enabled; + int (*init)(); + struct lsm_blob_sizes *blobs; +}; + +enum nf_hook_ops_type { + NF_HOOK_OP_UNDEFINED = 0, + NF_HOOK_OP_NF_TABLES = 1, +}; + +struct nf_hook_ops { + nf_hookfn *hook; + struct net_device *dev; + void *priv; + u8 pf; + enum nf_hook_ops_type hook_ops_type: 8; + unsigned int hooknum; + int priority; +}; + +enum nf_ip_hook_priorities { + NF_IP_PRI_FIRST = -2147483648, + NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, + NF_IP_PRI_CONNTRACK_DEFRAG = -400, + NF_IP_PRI_RAW = -300, + NF_IP_PRI_SELINUX_FIRST = -225, + NF_IP_PRI_CONNTRACK = -200, + NF_IP_PRI_MANGLE = -150, + NF_IP_PRI_NAT_DST = -100, + NF_IP_PRI_FILTER = 0, + NF_IP_PRI_SECURITY = 50, + NF_IP_PRI_NAT_SRC = 100, + NF_IP_PRI_SELINUX_LAST = 225, + NF_IP_PRI_CONNTRACK_HELPER = 300, + NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, + NF_IP_PRI_LAST = 2147483647, +}; + +enum nf_ip6_hook_priorities { + NF_IP6_PRI_FIRST = -2147483648, + NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, + NF_IP6_PRI_CONNTRACK_DEFRAG = -400, + NF_IP6_PRI_RAW = -300, + NF_IP6_PRI_SELINUX_FIRST = -225, + NF_IP6_PRI_CONNTRACK = -200, + NF_IP6_PRI_MANGLE = -150, + NF_IP6_PRI_NAT_DST = -100, + NF_IP6_PRI_FILTER = 0, + NF_IP6_PRI_SECURITY = 50, + NF_IP6_PRI_NAT_SRC = 100, + NF_IP6_PRI_SELINUX_LAST = 225, + NF_IP6_PRI_CONNTRACK_HELPER = 300, + NF_IP6_PRI_LAST = 2147483647, +}; + +struct socket_alloc { + struct socket socket; + struct inode vfs_inode; + long: 64; +}; + +struct tcphdr { + __be16 source; + __be16 dest; + __be32 seq; + __be32 ack_seq; + __u16 res1: 4; + __u16 doff: 4; + __u16 fin: 1; + __u16 syn: 1; + __u16 rst: 1; + __u16 psh: 1; + __u16 ack: 1; + __u16 urg: 1; + __u16 ece: 1; + __u16 cwr: 1; + __be16 window; + __sum16 check; + __be16 urg_ptr; +}; + +enum bpf_cmd { + BPF_MAP_CREATE = 0, + BPF_MAP_LOOKUP_ELEM = 1, + BPF_MAP_UPDATE_ELEM = 2, + BPF_MAP_DELETE_ELEM = 3, + BPF_MAP_GET_NEXT_KEY = 4, + BPF_PROG_LOAD = 5, + BPF_OBJ_PIN = 6, + BPF_OBJ_GET = 7, + BPF_PROG_ATTACH = 8, + BPF_PROG_DETACH = 9, + BPF_PROG_TEST_RUN = 10, + BPF_PROG_RUN = 10, + BPF_PROG_GET_NEXT_ID = 11, + BPF_MAP_GET_NEXT_ID = 12, + BPF_PROG_GET_FD_BY_ID = 13, + BPF_MAP_GET_FD_BY_ID = 14, + BPF_OBJ_GET_INFO_BY_FD = 15, + BPF_PROG_QUERY = 16, + BPF_RAW_TRACEPOINT_OPEN = 17, + BPF_BTF_LOAD = 18, + BPF_BTF_GET_FD_BY_ID = 19, + BPF_TASK_FD_QUERY = 20, + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 21, + BPF_MAP_FREEZE = 22, + BPF_BTF_GET_NEXT_ID = 23, + BPF_MAP_LOOKUP_BATCH = 24, + BPF_MAP_LOOKUP_AND_DELETE_BATCH = 25, + BPF_MAP_UPDATE_BATCH = 26, + BPF_MAP_DELETE_BATCH = 27, + BPF_LINK_CREATE = 28, + BPF_LINK_UPDATE = 29, + BPF_LINK_GET_FD_BY_ID = 30, + BPF_LINK_GET_NEXT_ID = 31, + BPF_ENABLE_STATS = 32, + BPF_ITER_CREATE = 33, + BPF_LINK_DETACH = 34, + BPF_PROG_BIND_MAP = 35, +}; + +struct tty_file_private { + struct tty_struct *tty; + struct file *file; + struct list_head list; +}; + +struct netlbl_lsm_cache { + refcount_t refcount; + void (*free)(const void *); + void *data; +}; + +struct netlbl_lsm_catmap { + u32 startbit; + u64 bitmap[4]; + struct netlbl_lsm_catmap *next; +}; + +struct netlbl_lsm_secattr { + u32 flags; + u32 type; + char *domain; + struct netlbl_lsm_cache *cache; + struct { + struct { + struct netlbl_lsm_catmap *cat; + u32 lvl; + } mls; + u32 secid; + } attr; +}; + +struct dccp_hdr { + __be16 dccph_sport; + __be16 dccph_dport; + __u8 dccph_doff; + __u8 dccph_cscov: 4; + __u8 dccph_ccval: 4; + __sum16 dccph_checksum; + __u8 dccph_x: 1; + __u8 dccph_type: 4; + __u8 dccph_reserved: 3; + __u8 dccph_seq2; + __be16 dccph_seq; +}; + +enum dccp_state { + DCCP_OPEN = 1, + DCCP_REQUESTING = 2, + DCCP_LISTEN = 10, + DCCP_RESPOND = 3, + DCCP_ACTIVE_CLOSEREQ = 4, + DCCP_PASSIVE_CLOSE = 8, + DCCP_CLOSING = 11, + DCCP_TIME_WAIT = 6, + DCCP_CLOSED = 7, + DCCP_NEW_SYN_RECV = 12, + DCCP_PARTOPEN = 13, + DCCP_PASSIVE_CLOSEREQ = 14, + DCCP_MAX_STATES = 15, +}; + +enum sctp_msg_flags { + MSG_NOTIFICATION = 32768, +}; + +struct sctp_initmsg { + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u16 sinit_max_attempts; + __u16 sinit_max_init_timeo; +}; + +struct sctp_sndrcvinfo { + __u16 sinfo_stream; + __u16 sinfo_ssn; + __u16 sinfo_flags; + __u32 sinfo_ppid; + __u32 sinfo_context; + __u32 sinfo_timetolive; + __u32 sinfo_tsn; + __u32 sinfo_cumtsn; + sctp_assoc_t sinfo_assoc_id; +}; + +struct sctp_rtoinfo { + sctp_assoc_t srto_assoc_id; + __u32 srto_initial; + __u32 srto_max; + __u32 srto_min; +}; + +struct sctp_assocparams { + sctp_assoc_t sasoc_assoc_id; + __u16 sasoc_asocmaxrxt; + __u16 sasoc_number_peer_destinations; + __u32 sasoc_peer_rwnd; + __u32 sasoc_local_rwnd; + __u32 sasoc_cookie_life; +}; + +struct sctp_paddrparams { + sctp_assoc_t spp_assoc_id; + struct __kernel_sockaddr_storage spp_address; + __u32 spp_hbinterval; + __u16 spp_pathmaxrxt; + __u32 spp_pathmtu; + __u32 spp_sackdelay; + __u32 spp_flags; + __u32 spp_ipv6_flowlabel; + __u8 spp_dscp; + char: 8; +} __attribute__((packed)); + +struct sctphdr { + __be16 source; + __be16 dest; + __be32 vtag; + __le32 checksum; +}; + +enum sctp_cid { + SCTP_CID_DATA = 0, + SCTP_CID_INIT = 1, + SCTP_CID_INIT_ACK = 2, + SCTP_CID_SACK = 3, + SCTP_CID_HEARTBEAT = 4, + SCTP_CID_HEARTBEAT_ACK = 5, + SCTP_CID_ABORT = 6, + SCTP_CID_SHUTDOWN = 7, + SCTP_CID_SHUTDOWN_ACK = 8, + SCTP_CID_ERROR = 9, + SCTP_CID_COOKIE_ECHO = 10, + SCTP_CID_COOKIE_ACK = 11, + SCTP_CID_ECN_ECNE = 12, + SCTP_CID_ECN_CWR = 13, + SCTP_CID_SHUTDOWN_COMPLETE = 14, + SCTP_CID_AUTH = 15, + SCTP_CID_I_DATA = 64, + SCTP_CID_FWD_TSN = 192, + SCTP_CID_ASCONF = 193, + SCTP_CID_I_FWD_TSN = 194, + SCTP_CID_ASCONF_ACK = 128, + SCTP_CID_RECONF = 130, + SCTP_CID_PAD = 132, +}; + +struct sctp_paramhdr { + __be16 type; + __be16 length; +}; + +enum sctp_param { + SCTP_PARAM_HEARTBEAT_INFO = 256, + SCTP_PARAM_IPV4_ADDRESS = 1280, + SCTP_PARAM_IPV6_ADDRESS = 1536, + SCTP_PARAM_STATE_COOKIE = 1792, + SCTP_PARAM_UNRECOGNIZED_PARAMETERS = 2048, + SCTP_PARAM_COOKIE_PRESERVATIVE = 2304, + SCTP_PARAM_HOST_NAME_ADDRESS = 2816, + SCTP_PARAM_SUPPORTED_ADDRESS_TYPES = 3072, + SCTP_PARAM_ECN_CAPABLE = 128, + SCTP_PARAM_RANDOM = 640, + SCTP_PARAM_CHUNKS = 896, + SCTP_PARAM_HMAC_ALGO = 1152, + SCTP_PARAM_SUPPORTED_EXT = 2176, + SCTP_PARAM_FWD_TSN_SUPPORT = 192, + SCTP_PARAM_ADD_IP = 448, + SCTP_PARAM_DEL_IP = 704, + SCTP_PARAM_ERR_CAUSE = 960, + SCTP_PARAM_SET_PRIMARY = 1216, + SCTP_PARAM_SUCCESS_REPORT = 1472, + SCTP_PARAM_ADAPTATION_LAYER_IND = 1728, + SCTP_PARAM_RESET_OUT_REQUEST = 3328, + SCTP_PARAM_RESET_IN_REQUEST = 3584, + SCTP_PARAM_RESET_TSN_REQUEST = 3840, + SCTP_PARAM_RESET_RESPONSE = 4096, + SCTP_PARAM_RESET_ADD_OUT_STREAMS = 4352, + SCTP_PARAM_RESET_ADD_IN_STREAMS = 4608, +}; + +struct sctp_datahdr { + __be32 tsn; + __be16 stream; + __be16 ssn; + __u32 ppid; + __u8 payload[0]; +}; + +struct sctp_idatahdr { + __be32 tsn; + __be16 stream; + __be16 reserved; + __be32 mid; + union { + __u32 ppid; + __be32 fsn; + }; + __u8 payload[0]; +}; + +struct sctp_ipv4addr_param { + struct sctp_paramhdr param_hdr; + struct in_addr addr; +}; + +struct sctp_ipv6addr_param { + struct sctp_paramhdr param_hdr; + struct in6_addr addr; +}; + +struct sctp_cookie_preserve_param { + struct sctp_paramhdr param_hdr; + __be32 lifespan_increment; +}; + +struct sctp_hostname_param { + struct sctp_paramhdr param_hdr; + uint8_t hostname[0]; +}; + +struct sctp_supported_addrs_param { + struct sctp_paramhdr param_hdr; + __be16 types[0]; +}; + +struct sctp_adaptation_ind_param { + struct sctp_paramhdr param_hdr; + __be32 adaptation_ind; +}; + +struct sctp_supported_ext_param { + struct sctp_paramhdr param_hdr; + __u8 chunks[0]; +}; + +struct sctp_random_param { + struct sctp_paramhdr param_hdr; + __u8 random_val[0]; +}; + +struct sctp_chunks_param { + struct sctp_paramhdr param_hdr; + __u8 chunks[0]; +}; + +struct sctp_hmac_algo_param { + struct sctp_paramhdr param_hdr; + __be16 hmac_ids[0]; +}; + +struct sctp_cookie_param { + struct sctp_paramhdr p; + __u8 body[0]; +}; + +struct sctp_gap_ack_block { + __be16 start; + __be16 end; +}; + +union sctp_sack_variable { + struct sctp_gap_ack_block gab; + __be32 dup; +}; + +struct sctp_sackhdr { + __be32 cum_tsn_ack; + __be32 a_rwnd; + __be16 num_gap_ack_blocks; + __be16 num_dup_tsns; + union sctp_sack_variable variable[0]; +}; + +struct sctp_heartbeathdr { + struct sctp_paramhdr info; +}; + +struct sctp_shutdownhdr { + __be32 cum_tsn_ack; +}; + +struct sctp_errhdr { + __be16 cause; + __be16 length; + __u8 variable[0]; +}; + +struct sctp_ecnehdr { + __be32 lowest_tsn; +}; + +struct sctp_cwrhdr { + __be32 lowest_tsn; +}; + +struct sctp_fwdtsn_skip { + __be16 stream; + __be16 ssn; +}; + +struct sctp_fwdtsn_hdr { + __be32 new_cum_tsn; + struct sctp_fwdtsn_skip skip[0]; +}; + +struct sctp_ifwdtsn_skip { + __be16 stream; + __u8 reserved; + __u8 flags; + __be32 mid; +}; + +struct sctp_ifwdtsn_hdr { + __be32 new_cum_tsn; + struct sctp_ifwdtsn_skip skip[0]; +}; + +struct sctp_addip_param { + struct sctp_paramhdr param_hdr; + __be32 crr_id; +}; + +struct sctp_addiphdr { + __be32 serial; + __u8 params[0]; +}; + +struct sctp_authhdr { + __be16 shkey_id; + __be16 hmac_id; + __u8 hmac[0]; +}; + +struct sctp_auth_bytes { + refcount_t refcnt; + __u32 len; + __u8 data[0]; +}; + +struct sctp_shared_key { + struct list_head key_list; + struct sctp_auth_bytes *key; + refcount_t refcnt; + __u16 key_id; + __u8 deactivated; +}; + +enum { + SCTP_MAX_STREAM = 65535, +}; + +enum sctp_event_timeout { + SCTP_EVENT_TIMEOUT_NONE = 0, + SCTP_EVENT_TIMEOUT_T1_COOKIE = 1, + SCTP_EVENT_TIMEOUT_T1_INIT = 2, + SCTP_EVENT_TIMEOUT_T2_SHUTDOWN = 3, + SCTP_EVENT_TIMEOUT_T3_RTX = 4, + SCTP_EVENT_TIMEOUT_T4_RTO = 5, + SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD = 6, + SCTP_EVENT_TIMEOUT_HEARTBEAT = 7, + SCTP_EVENT_TIMEOUT_RECONF = 8, + SCTP_EVENT_TIMEOUT_PROBE = 9, + SCTP_EVENT_TIMEOUT_SACK = 10, + SCTP_EVENT_TIMEOUT_AUTOCLOSE = 11, +}; + +enum { + SCTP_MAX_DUP_TSNS = 16, +}; + +enum sctp_scope { + SCTP_SCOPE_GLOBAL = 0, + SCTP_SCOPE_PRIVATE = 1, + SCTP_SCOPE_LINK = 2, + SCTP_SCOPE_LOOPBACK = 3, + SCTP_SCOPE_UNUSABLE = 4, +}; + +enum { + SCTP_AUTH_HMAC_ID_RESERVED_0 = 0, + SCTP_AUTH_HMAC_ID_SHA1 = 1, + SCTP_AUTH_HMAC_ID_RESERVED_2 = 2, + SCTP_AUTH_HMAC_ID_SHA256 = 3, + __SCTP_AUTH_HMAC_MAX = 4, +}; + +struct sctp_ulpevent { + struct sctp_association *asoc; + struct sctp_chunk *chunk; + unsigned int rmem_len; + union { + __u32 mid; + __u16 ssn; + }; + union { + __u32 ppid; + __u32 fsn; + }; + __u32 tsn; + __u32 cumtsn; + __u16 stream; + __u16 flags; + __u16 msg_flags; +} __attribute__((packed)); + +union sctp_addr_param; + +union sctp_params { + void *v; + struct sctp_paramhdr *p; + struct sctp_cookie_preserve_param *life; + struct sctp_hostname_param *dns; + struct sctp_cookie_param *cookie; + struct sctp_supported_addrs_param *sat; + struct sctp_ipv4addr_param *v4; + struct sctp_ipv6addr_param *v6; + union sctp_addr_param *addr; + struct sctp_adaptation_ind_param *aind; + struct sctp_supported_ext_param *ext; + struct sctp_random_param *random; + struct sctp_chunks_param *chunks; + struct sctp_hmac_algo_param *hmac_algo; + struct sctp_addip_param *addip; +}; + +struct sctp_sender_hb_info; + +struct sctp_signed_cookie; + +struct sctp_datamsg; + +struct sctp_chunk { + struct list_head list; + refcount_t refcnt; + int sent_count; + union { + struct list_head transmitted_list; + struct list_head stream_list; + }; + struct list_head frag_list; + struct sk_buff *skb; + union { + struct sk_buff *head_skb; + struct sctp_shared_key *shkey; + }; + union sctp_params param_hdr; + union { + __u8 *v; + struct sctp_datahdr *data_hdr; + struct sctp_inithdr *init_hdr; + struct sctp_sackhdr *sack_hdr; + struct sctp_heartbeathdr *hb_hdr; + struct sctp_sender_hb_info *hbs_hdr; + struct sctp_shutdownhdr *shutdown_hdr; + struct sctp_signed_cookie *cookie_hdr; + struct sctp_ecnehdr *ecne_hdr; + struct sctp_cwrhdr *ecn_cwr_hdr; + struct sctp_errhdr *err_hdr; + struct sctp_addiphdr *addip_hdr; + struct sctp_fwdtsn_hdr *fwdtsn_hdr; + struct sctp_authhdr *auth_hdr; + struct sctp_idatahdr *idata_hdr; + struct sctp_ifwdtsn_hdr *ifwdtsn_hdr; + } subh; + __u8 *chunk_end; + struct sctp_chunkhdr *chunk_hdr; + struct sctphdr *sctp_hdr; + struct sctp_sndrcvinfo sinfo; + struct sctp_association *asoc; + struct sctp_ep_common *rcvr; + long unsigned int sent_at; + union sctp_addr source; + union sctp_addr dest; + struct sctp_datamsg *msg; + struct sctp_transport *transport; + struct sk_buff *auth_chunk; + __u16 rtt_in_progress: 1; + __u16 has_tsn: 1; + __u16 has_ssn: 1; + __u16 singleton: 1; + __u16 end_of_packet: 1; + __u16 ecn_ce_done: 1; + __u16 pdiscard: 1; + __u16 tsn_gap_acked: 1; + __u16 data_accepted: 1; + __u16 auth: 1; + __u16 has_asconf: 1; + __u16 pmtu_probe: 1; + __u16 tsn_missing_report: 2; + __u16 fast_retransmit: 2; +}; + +struct sctp_stream_interleave { + __u16 data_chunk_len; + __u16 ftsn_chunk_len; + struct sctp_chunk * (*make_datafrag)(const struct sctp_association *, const struct sctp_sndrcvinfo *, int, __u8, gfp_t); + void (*assign_number)(struct sctp_chunk *); + bool (*validate_data)(struct sctp_chunk *); + int (*ulpevent_data)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); + int (*enqueue_event)(struct sctp_ulpq *, struct sctp_ulpevent *); + void (*renege_events)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t); + void (*start_pd)(struct sctp_ulpq *, gfp_t); + void (*abort_pd)(struct sctp_ulpq *, gfp_t); + void (*generate_ftsn)(struct sctp_outq *, __u32); + bool (*validate_ftsn)(struct sctp_chunk *); + void (*report_ftsn)(struct sctp_ulpq *, __u32); + void (*handle_ftsn)(struct sctp_ulpq *, struct sctp_chunk *); +}; + +struct sctp_bind_bucket { + short unsigned int port; + signed char fastreuse; + signed char fastreuseport; + kuid_t fastuid; + struct hlist_node node; + struct hlist_head owner; + struct net *net; +}; + +enum sctp_socket_type { + SCTP_SOCKET_UDP = 0, + SCTP_SOCKET_UDP_HIGH_BANDWIDTH = 1, + SCTP_SOCKET_TCP = 2, +}; + +struct crypto_shash; + +struct sctp_pf; + +struct sctp_sock { + struct inet_sock inet; + enum sctp_socket_type type; + int: 32; + struct sctp_pf *pf; + struct crypto_shash *hmac; + char *sctp_hmac_alg; + struct sctp_endpoint *ep; + struct sctp_bind_bucket *bind_hash; + __u16 default_stream; + short: 16; + __u32 default_ppid; + __u16 default_flags; + short: 16; + __u32 default_context; + __u32 default_timetolive; + __u32 default_rcv_context; + int max_burst; + __u32 hbinterval; + __u32 probe_interval; + __be16 udp_port; + __be16 encap_port; + __u16 pathmaxrxt; + short: 16; + __u32 flowlabel; + __u8 dscp; + char: 8; + __u16 pf_retrans; + __u16 ps_retrans; + short: 16; + __u32 pathmtu; + __u32 sackdelay; + __u32 sackfreq; + __u32 param_flags; + __u32 default_ss; + struct sctp_rtoinfo rtoinfo; + struct sctp_paddrparams paddrparam; + struct sctp_assocparams assocparams; + __u16 subscribe; + struct sctp_initmsg initmsg; + short: 16; + int user_frag; + __u32 autoclose; + __u32 adaptation_ind; + __u32 pd_point; + __u16 nodelay: 1; + __u16 pf_expose: 2; + __u16 reuse: 1; + __u16 disable_fragments: 1; + __u16 v4mapped: 1; + __u16 frag_interleave: 1; + __u16 recvrcvinfo: 1; + __u16 recvnxtinfo: 1; + __u16 data_ready_signalled: 1; + int: 22; + atomic_t pd_mode; + struct sk_buff_head pd_lobby; + struct list_head auto_asconf_list; + int do_auto_asconf; + int: 32; +} __attribute__((packed)); + +struct sctp_af; + +struct sctp_pf { + void (*event_msgname)(struct sctp_ulpevent *, char *, int *); + void (*skb_msgname)(struct sk_buff *, char *, int *); + int (*af_supported)(sa_family_t, struct sctp_sock *); + int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *, struct sctp_sock *); + int (*bind_verify)(struct sctp_sock *, union sctp_addr *); + int (*send_verify)(struct sctp_sock *, union sctp_addr *); + int (*supported_addrs)(const struct sctp_sock *, __be16 *); + struct sock * (*create_accept_sk)(struct sock *, struct sctp_association *, bool); + int (*addr_to_user)(struct sctp_sock *, union sctp_addr *); + void (*to_sk_saddr)(union sctp_addr *, struct sock *); + void (*to_sk_daddr)(union sctp_addr *, struct sock *); + void (*copy_ip_options)(struct sock *, struct sock *); + struct sctp_af *af; +}; + +struct sctp_endpoint { + struct sctp_ep_common base; + struct hlist_node node; + int hashent; + struct list_head asocs; + __u8 secret_key[32]; + __u8 *digest; + __u32 sndbuf_policy; + __u32 rcvbuf_policy; + struct crypto_shash **auth_hmacs; + struct sctp_hmac_algo_param *auth_hmacs_list; + struct sctp_chunks_param *auth_chunk_list; + struct list_head endpoint_shared_keys; + __u16 active_key_id; + __u8 ecn_enable: 1; + __u8 auth_enable: 1; + __u8 intl_enable: 1; + __u8 prsctp_enable: 1; + __u8 asconf_enable: 1; + __u8 reconf_enable: 1; + __u8 strreset_enable; + struct callback_head rcu; +}; + +struct sctp_signed_cookie { + __u8 signature[32]; + __u32 __pad; + struct sctp_cookie c; +} __attribute__((packed)); + +union sctp_addr_param { + struct sctp_paramhdr p; + struct sctp_ipv4addr_param v4; + struct sctp_ipv6addr_param v6; +}; + +struct sctp_sender_hb_info { + struct sctp_paramhdr param_hdr; + union sctp_addr daddr; + long unsigned int sent_at; + __u64 hb_nonce; + __u32 probe_size; +}; + +struct sctp_af { + int (*sctp_xmit)(struct sk_buff *, struct sctp_transport *); + int (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*getsockopt)(struct sock *, int, int, char *, int *); + void (*get_dst)(struct sctp_transport *, union sctp_addr *, struct flowi *, struct sock *); + void (*get_saddr)(struct sctp_sock *, struct sctp_transport *, struct flowi *); + void (*copy_addrlist)(struct list_head *, struct net_device *); + int (*cmp_addr)(const union sctp_addr *, const union sctp_addr *); + void (*addr_copy)(union sctp_addr *, union sctp_addr *); + void (*from_skb)(union sctp_addr *, struct sk_buff *, int); + void (*from_sk)(union sctp_addr *, struct sock *); + bool (*from_addr_param)(union sctp_addr *, union sctp_addr_param *, __be16, int); + int (*to_addr_param)(const union sctp_addr *, union sctp_addr_param *); + int (*addr_valid)(union sctp_addr *, struct sctp_sock *, const struct sk_buff *); + enum sctp_scope (*scope)(union sctp_addr *); + void (*inaddr_any)(union sctp_addr *, __be16); + int (*is_any)(const union sctp_addr *); + int (*available)(union sctp_addr *, struct sctp_sock *); + int (*skb_iif)(const struct sk_buff *); + int (*skb_sdif)(const struct sk_buff *); + int (*is_ce)(const struct sk_buff *); + void (*seq_dump_addr)(struct seq_file *, union sctp_addr *); + void (*ecn_capable)(struct sock *); + __u16 net_header_len; + int sockaddr_len; + int (*ip_options_len)(struct sock *); + sa_family_t sa_family; + struct list_head list; +}; + +struct sctp_packet { + __u16 source_port; + __u16 destination_port; + __u32 vtag; + struct list_head chunk_list; + size_t overhead; + size_t size; + size_t max_size; + struct sctp_transport *transport; + struct sctp_chunk *auth; + u8 has_cookie_echo: 1; + u8 has_sack: 1; + u8 has_auth: 1; + u8 has_data: 1; + u8 ipfragok: 1; +}; + +struct sctp_transport { + struct list_head transports; + struct rhlist_head node; + refcount_t refcnt; + __u32 rto_pending: 1; + __u32 hb_sent: 1; + __u32 pmtu_pending: 1; + __u32 dst_pending_confirm: 1; + __u32 sack_generation: 1; + u32 dst_cookie; + struct flowi fl; + union sctp_addr ipaddr; + struct sctp_af *af_specific; + struct sctp_association *asoc; + long unsigned int rto; + __u32 rtt; + __u32 rttvar; + __u32 srtt; + __u32 cwnd; + __u32 ssthresh; + __u32 partial_bytes_acked; + __u32 flight_size; + __u32 burst_limited; + struct dst_entry *dst; + union sctp_addr saddr; + long unsigned int hbinterval; + long unsigned int probe_interval; + long unsigned int sackdelay; + __u32 sackfreq; + atomic_t mtu_info; + ktime_t last_time_heard; + long unsigned int last_time_sent; + long unsigned int last_time_ecne_reduced; + __be16 encap_port; + __u16 pathmaxrxt; + __u32 flowlabel; + __u8 dscp; + __u16 pf_retrans; + __u16 ps_retrans; + __u32 pathmtu; + __u32 param_flags; + int init_sent_count; + int state; + short unsigned int error_count; + struct timer_list T3_rtx_timer; + struct timer_list hb_timer; + struct timer_list proto_unreach_timer; + struct timer_list reconf_timer; + struct timer_list probe_timer; + struct list_head transmitted; + struct sctp_packet packet; + struct list_head send_ready; + struct { + __u32 next_tsn_at_change; + char changeover_active; + char cycling_changeover; + char cacc_saw_newack; + } cacc; + struct { + __u16 pmtu; + __u16 probe_size; + __u16 probe_high; + __u8 probe_count; + __u8 state; + } pl; + __u64 hb_nonce; + struct callback_head rcu; +}; + +struct sctp_datamsg { + struct list_head chunks; + refcount_t refcnt; + long unsigned int expires_at; + int send_error; + u8 send_failed: 1; + u8 can_delay: 1; + u8 abandoned: 1; +}; + +struct sctp_stream_priorities { + struct list_head prio_sched; + struct list_head active; + struct sctp_stream_out_ext *next; + __u16 prio; +}; + +struct sctp_stream_out_ext { + __u64 abandoned_unsent[3]; + __u64 abandoned_sent[3]; + struct list_head outq; + union { + struct { + struct list_head prio_list; + struct sctp_stream_priorities *prio_head; + }; + struct { + struct list_head rr_list; + }; + }; +}; + +struct audit_field { + u32 type; + union { + u32 val; + kuid_t uid; + kgid_t gid; + struct { + char *lsm_str; + void *lsm_rule; + }; + }; + u32 op; +}; + +enum fsnotify_obj_type { + FSNOTIFY_OBJ_TYPE_ANY = -1, + FSNOTIFY_OBJ_TYPE_INODE = 0, + FSNOTIFY_OBJ_TYPE_VFSMOUNT = 1, + FSNOTIFY_OBJ_TYPE_SB = 2, + FSNOTIFY_OBJ_TYPE_COUNT = 3, + FSNOTIFY_OBJ_TYPE_DETACHED = 3, +}; + +enum ib_uverbs_write_cmds { + IB_USER_VERBS_CMD_GET_CONTEXT = 0, + IB_USER_VERBS_CMD_QUERY_DEVICE = 1, + IB_USER_VERBS_CMD_QUERY_PORT = 2, + IB_USER_VERBS_CMD_ALLOC_PD = 3, + IB_USER_VERBS_CMD_DEALLOC_PD = 4, + IB_USER_VERBS_CMD_CREATE_AH = 5, + IB_USER_VERBS_CMD_MODIFY_AH = 6, + IB_USER_VERBS_CMD_QUERY_AH = 7, + IB_USER_VERBS_CMD_DESTROY_AH = 8, + IB_USER_VERBS_CMD_REG_MR = 9, + IB_USER_VERBS_CMD_REG_SMR = 10, + IB_USER_VERBS_CMD_REREG_MR = 11, + IB_USER_VERBS_CMD_QUERY_MR = 12, + IB_USER_VERBS_CMD_DEREG_MR = 13, + IB_USER_VERBS_CMD_ALLOC_MW = 14, + IB_USER_VERBS_CMD_BIND_MW = 15, + IB_USER_VERBS_CMD_DEALLOC_MW = 16, + IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL = 17, + IB_USER_VERBS_CMD_CREATE_CQ = 18, + IB_USER_VERBS_CMD_RESIZE_CQ = 19, + IB_USER_VERBS_CMD_DESTROY_CQ = 20, + IB_USER_VERBS_CMD_POLL_CQ = 21, + IB_USER_VERBS_CMD_PEEK_CQ = 22, + IB_USER_VERBS_CMD_REQ_NOTIFY_CQ = 23, + IB_USER_VERBS_CMD_CREATE_QP = 24, + IB_USER_VERBS_CMD_QUERY_QP = 25, + IB_USER_VERBS_CMD_MODIFY_QP = 26, + IB_USER_VERBS_CMD_DESTROY_QP = 27, + IB_USER_VERBS_CMD_POST_SEND = 28, + IB_USER_VERBS_CMD_POST_RECV = 29, + IB_USER_VERBS_CMD_ATTACH_MCAST = 30, + IB_USER_VERBS_CMD_DETACH_MCAST = 31, + IB_USER_VERBS_CMD_CREATE_SRQ = 32, + IB_USER_VERBS_CMD_MODIFY_SRQ = 33, + IB_USER_VERBS_CMD_QUERY_SRQ = 34, + IB_USER_VERBS_CMD_DESTROY_SRQ = 35, + IB_USER_VERBS_CMD_POST_SRQ_RECV = 36, + IB_USER_VERBS_CMD_OPEN_XRCD = 37, + IB_USER_VERBS_CMD_CLOSE_XRCD = 38, + IB_USER_VERBS_CMD_CREATE_XSRQ = 39, + IB_USER_VERBS_CMD_OPEN_QP = 40, +}; + +enum ib_uverbs_wc_opcode { + IB_UVERBS_WC_SEND = 0, + IB_UVERBS_WC_RDMA_WRITE = 1, + IB_UVERBS_WC_RDMA_READ = 2, + IB_UVERBS_WC_COMP_SWAP = 3, + IB_UVERBS_WC_FETCH_ADD = 4, + IB_UVERBS_WC_BIND_MW = 5, + IB_UVERBS_WC_LOCAL_INV = 6, + IB_UVERBS_WC_TSO = 7, +}; + +enum ib_uverbs_create_qp_mask { + IB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1, +}; + +enum ib_uverbs_wr_opcode { + IB_UVERBS_WR_RDMA_WRITE = 0, + IB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1, + IB_UVERBS_WR_SEND = 2, + IB_UVERBS_WR_SEND_WITH_IMM = 3, + IB_UVERBS_WR_RDMA_READ = 4, + IB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5, + IB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6, + IB_UVERBS_WR_LOCAL_INV = 7, + IB_UVERBS_WR_BIND_MW = 8, + IB_UVERBS_WR_SEND_WITH_INV = 9, + IB_UVERBS_WR_TSO = 10, + IB_UVERBS_WR_RDMA_READ_WITH_INV = 11, + IB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, + IB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, +}; + +enum ib_uverbs_device_cap_flags { + IB_UVERBS_DEVICE_RESIZE_MAX_WR = 1ULL, + IB_UVERBS_DEVICE_BAD_PKEY_CNTR = 2ULL, + IB_UVERBS_DEVICE_BAD_QKEY_CNTR = 4ULL, + IB_UVERBS_DEVICE_RAW_MULTI = 8ULL, + IB_UVERBS_DEVICE_AUTO_PATH_MIG = 16ULL, + IB_UVERBS_DEVICE_CHANGE_PHY_PORT = 32ULL, + IB_UVERBS_DEVICE_UD_AV_PORT_ENFORCE = 64ULL, + IB_UVERBS_DEVICE_CURR_QP_STATE_MOD = 128ULL, + IB_UVERBS_DEVICE_SHUTDOWN_PORT = 256ULL, + IB_UVERBS_DEVICE_PORT_ACTIVE_EVENT = 1024ULL, + IB_UVERBS_DEVICE_SYS_IMAGE_GUID = 2048ULL, + IB_UVERBS_DEVICE_RC_RNR_NAK_GEN = 4096ULL, + IB_UVERBS_DEVICE_SRQ_RESIZE = 8192ULL, + IB_UVERBS_DEVICE_N_NOTIFY_CQ = 16384ULL, + IB_UVERBS_DEVICE_MEM_WINDOW = 131072ULL, + IB_UVERBS_DEVICE_UD_IP_CSUM = 262144ULL, + IB_UVERBS_DEVICE_XRC = 1048576ULL, + IB_UVERBS_DEVICE_MEM_MGT_EXTENSIONS = 2097152ULL, + IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2A = 8388608ULL, + IB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2B = 16777216ULL, + IB_UVERBS_DEVICE_RC_IP_CSUM = 33554432ULL, + IB_UVERBS_DEVICE_RAW_IP_CSUM = 67108864ULL, + IB_UVERBS_DEVICE_MANAGED_FLOW_STEERING = 536870912ULL, + IB_UVERBS_DEVICE_RAW_SCATTER_FCS = 17179869184ULL, + IB_UVERBS_DEVICE_PCI_WRITE_END_PADDING = 68719476736ULL, +}; + +enum ib_uverbs_raw_packet_caps { + IB_UVERBS_RAW_PACKET_CAP_CVLAN_STRIPPING = 1, + IB_UVERBS_RAW_PACKET_CAP_SCATTER_FCS = 2, + IB_UVERBS_RAW_PACKET_CAP_IP_CSUM = 4, + IB_UVERBS_RAW_PACKET_CAP_DELAY_DROP = 8, +}; + +enum ib_uverbs_access_flags { + IB_UVERBS_ACCESS_LOCAL_WRITE = 1, + IB_UVERBS_ACCESS_REMOTE_WRITE = 2, + IB_UVERBS_ACCESS_REMOTE_READ = 4, + IB_UVERBS_ACCESS_REMOTE_ATOMIC = 8, + IB_UVERBS_ACCESS_MW_BIND = 16, + IB_UVERBS_ACCESS_ZERO_BASED = 32, + IB_UVERBS_ACCESS_ON_DEMAND = 64, + IB_UVERBS_ACCESS_HUGETLB = 128, + IB_UVERBS_ACCESS_RELAXED_ORDERING = 1048576, + IB_UVERBS_ACCESS_OPTIONAL_RANGE = 1072693248, +}; + +enum ib_uverbs_srq_type { + IB_UVERBS_SRQT_BASIC = 0, + IB_UVERBS_SRQT_XRC = 1, + IB_UVERBS_SRQT_TM = 2, +}; + +enum ib_uverbs_wq_type { + IB_UVERBS_WQT_RQ = 0, +}; + +enum ib_uverbs_wq_flags { + IB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING = 1, + IB_UVERBS_WQ_FLAGS_SCATTER_FCS = 2, + IB_UVERBS_WQ_FLAGS_DELAY_DROP = 4, + IB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING = 8, +}; + +enum ib_uverbs_qp_type { + IB_UVERBS_QPT_RC = 2, + IB_UVERBS_QPT_UC = 3, + IB_UVERBS_QPT_UD = 4, + IB_UVERBS_QPT_RAW_PACKET = 8, + IB_UVERBS_QPT_XRC_INI = 9, + IB_UVERBS_QPT_XRC_TGT = 10, + IB_UVERBS_QPT_DRIVER = 255, +}; + +enum ib_uverbs_qp_create_flags { + IB_UVERBS_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 2, + IB_UVERBS_QP_CREATE_SCATTER_FCS = 256, + IB_UVERBS_QP_CREATE_CVLAN_STRIPPING = 512, + IB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING = 2048, + IB_UVERBS_QP_CREATE_SQ_SIG_ALL = 4096, +}; + +enum ib_uverbs_gid_type { + IB_UVERBS_GID_TYPE_IB = 0, + IB_UVERBS_GID_TYPE_ROCE_V1 = 1, + IB_UVERBS_GID_TYPE_ROCE_V2 = 2, +}; + +enum ib_poll_context { + IB_POLL_SOFTIRQ = 0, + IB_POLL_WORKQUEUE = 1, + IB_POLL_UNBOUND_WORKQUEUE = 2, + IB_POLL_LAST_POOL_TYPE = 2, + IB_POLL_DIRECT = 3, +}; + +struct lsm_network_audit { + int netif; + const struct sock *sk; + u16 family; + __be16 dport; + __be16 sport; + union { + struct { + __be32 daddr; + __be32 saddr; + } v4; + struct { + struct in6_addr daddr; + struct in6_addr saddr; + } v6; + } fam; +}; + +struct lsm_ioctlop_audit { + struct path path; + u16 cmd; +}; + +struct lsm_ibpkey_audit { + u64 subnet_prefix; + u16 pkey; +}; + +struct lsm_ibendport_audit { + const char *dev_name; + u8 port; +}; + +struct selinux_state; + +struct selinux_audit_data { + u32 ssid; + u32 tsid; + u16 tclass; + u32 requested; + u32 audited; + u32 denied; + int result; + struct selinux_state *state; +}; + +struct common_audit_data { + char type; + union { + struct path path; + struct dentry *dentry; + struct inode *inode; + struct lsm_network_audit *net; + int cap; + int ipc_id; + struct task_struct *tsk; + struct { + key_serial_t key; + char *key_desc; + } key_struct; + char *kmod_name; + struct lsm_ioctlop_audit *op; + struct file *file; + struct lsm_ibpkey_audit *ibpkey; + struct lsm_ibendport_audit *ibendport; + int reason; + const char *anonclass; + } u; + union { + struct selinux_audit_data *selinux_audit_data; + }; +}; + +enum { + POLICYDB_CAP_NETPEER = 0, + POLICYDB_CAP_OPENPERM = 1, + POLICYDB_CAP_EXTSOCKCLASS = 2, + POLICYDB_CAP_ALWAYSNETWORK = 3, + POLICYDB_CAP_CGROUPSECLABEL = 4, + POLICYDB_CAP_NNP_NOSUID_TRANSITION = 5, + POLICYDB_CAP_GENFS_SECLABEL_SYMLINKS = 6, + POLICYDB_CAP_IOCTL_SKIP_CLOEXEC = 7, + __POLICYDB_CAP_MAX = 8, +}; + +struct selinux_avc; + +struct selinux_policy; + +struct selinux_state { + bool enforcing; + bool checkreqprot; + bool initialized; + bool policycap[8]; + struct page *status_page; + struct mutex status_lock; + struct selinux_avc *avc; + struct selinux_policy *policy; + struct mutex policy_mutex; +}; + +struct av_decision { + u32 allowed; + u32 auditallow; + u32 auditdeny; + u32 seqno; + u32 flags; +}; + +struct task_security_struct { + u32 osid; + u32 sid; + u32 exec_sid; + u32 create_sid; + u32 keycreate_sid; + u32 sockcreate_sid; +}; + +enum label_initialized { + LABEL_INVALID = 0, + LABEL_INITIALIZED = 1, + LABEL_PENDING = 2, +}; + +struct inode_security_struct { + struct inode *inode; + struct list_head list; + u32 task_sid; + u32 sid; + u16 sclass; + unsigned char initialized; + spinlock_t lock; +}; + +struct file_security_struct { + u32 sid; + u32 fown_sid; + u32 isid; + u32 pseqno; +}; + +struct superblock_security_struct { + u32 sid; + u32 def_sid; + u32 mntpoint_sid; + short unsigned int behavior; + short unsigned int flags; + struct mutex lock; + struct list_head isec_head; + spinlock_t isec_lock; +}; + +struct msg_security_struct { + u32 sid; +}; + +struct ipc_security_struct { + u16 sclass; + u32 sid; +}; + +struct sk_security_struct { + enum { + NLBL_UNSET = 0, + NLBL_REQUIRE = 1, + NLBL_LABELED = 2, + NLBL_REQSKB = 3, + NLBL_CONNLABELED = 4, + } nlbl_state; + struct netlbl_lsm_secattr *nlbl_secattr; + u32 sid; + u32 peer_sid; + u16 sclass; + enum { + SCTP_ASSOC_UNSET = 0, + SCTP_ASSOC_SET = 1, + } sctp_assoc_state; +}; + +struct tun_security_struct { + u32 sid; +}; + +struct key_security_struct { + u32 sid; +}; + +struct bpf_security_struct { + u32 sid; +}; + +struct perf_event_security_struct { + u32 sid; +}; + +struct security_class_mapping { + const char *name; + const char *perms[33]; +}; + +struct selinux_mnt_opts { + u32 fscontext_sid; + u32 context_sid; + u32 rootcontext_sid; + u32 defcontext_sid; +}; + +enum { + Opt_error = -1, + Opt_context = 0, + Opt_defcontext = 1, + Opt_fscontext = 2, + Opt_rootcontext = 3, + Opt_seclabel = 4, +}; + +struct audit_buffer; + +struct dmi_strmatch { + unsigned char slot: 7; + unsigned char exact_match: 1; + char substr[79]; +}; + +struct dmi_system_id { + int (*callback)(const struct dmi_system_id *); + const char *ident; + struct dmi_strmatch matches[4]; + void *driver_data; +}; + +enum dmi_device_type { + DMI_DEV_TYPE_ANY = 0, + DMI_DEV_TYPE_OTHER = 1, + DMI_DEV_TYPE_UNKNOWN = 2, + DMI_DEV_TYPE_VIDEO = 3, + DMI_DEV_TYPE_SCSI = 4, + DMI_DEV_TYPE_ETHERNET = 5, + DMI_DEV_TYPE_TOKENRING = 6, + DMI_DEV_TYPE_SOUND = 7, + DMI_DEV_TYPE_PATA = 8, + DMI_DEV_TYPE_SATA = 9, + DMI_DEV_TYPE_SAS = 10, + DMI_DEV_TYPE_IPMI = -1, + DMI_DEV_TYPE_OEM_STRING = -2, + DMI_DEV_TYPE_DEV_ONBOARD = -3, + DMI_DEV_TYPE_DEV_SLOT = -4, +}; + +enum dmi_entry_type { + DMI_ENTRY_BIOS = 0, + DMI_ENTRY_SYSTEM = 1, + DMI_ENTRY_BASEBOARD = 2, + DMI_ENTRY_CHASSIS = 3, + DMI_ENTRY_PROCESSOR = 4, + DMI_ENTRY_MEM_CONTROLLER = 5, + DMI_ENTRY_MEM_MODULE = 6, + DMI_ENTRY_CACHE = 7, + DMI_ENTRY_PORT_CONNECTOR = 8, + DMI_ENTRY_SYSTEM_SLOT = 9, + DMI_ENTRY_ONBOARD_DEVICE = 10, + DMI_ENTRY_OEMSTRINGS = 11, + DMI_ENTRY_SYSCONF = 12, + DMI_ENTRY_BIOS_LANG = 13, + DMI_ENTRY_GROUP_ASSOC = 14, + DMI_ENTRY_SYSTEM_EVENT_LOG = 15, + DMI_ENTRY_PHYS_MEM_ARRAY = 16, + DMI_ENTRY_MEM_DEVICE = 17, + DMI_ENTRY_32_MEM_ERROR = 18, + DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR = 19, + DMI_ENTRY_MEM_DEV_MAPPED_ADDR = 20, + DMI_ENTRY_BUILTIN_POINTING_DEV = 21, + DMI_ENTRY_PORTABLE_BATTERY = 22, + DMI_ENTRY_SYSTEM_RESET = 23, + DMI_ENTRY_HW_SECURITY = 24, + DMI_ENTRY_SYSTEM_POWER_CONTROLS = 25, + DMI_ENTRY_VOLTAGE_PROBE = 26, + DMI_ENTRY_COOLING_DEV = 27, + DMI_ENTRY_TEMP_PROBE = 28, + DMI_ENTRY_ELECTRICAL_CURRENT_PROBE = 29, + DMI_ENTRY_OOB_REMOTE_ACCESS = 30, + DMI_ENTRY_BIS_ENTRY = 31, + DMI_ENTRY_SYSTEM_BOOT = 32, + DMI_ENTRY_MGMT_DEV = 33, + DMI_ENTRY_MGMT_DEV_COMPONENT = 34, + DMI_ENTRY_MGMT_DEV_THRES = 35, + DMI_ENTRY_MEM_CHANNEL = 36, + DMI_ENTRY_IPMI_DEV = 37, + DMI_ENTRY_SYS_POWER_SUPPLY = 38, + DMI_ENTRY_ADDITIONAL = 39, + DMI_ENTRY_ONBOARD_DEV_EXT = 40, + DMI_ENTRY_MGMT_CONTROLLER_HOST = 41, + DMI_ENTRY_INACTIVE = 126, + DMI_ENTRY_END_OF_TABLE = 127, +}; + +struct dmi_header { + u8 type; + u8 length; + u16 handle; +}; + +struct dmi_device { + struct list_head list; + int type; + const char *name; + void *device_data; +}; + +struct dmi_dev_onboard { + struct dmi_device dev; + int instance; + int segment; + int bus; + int devfn; +}; + +struct efi_memory_map { + phys_addr_t phys_map; + void *map; + void *map_end; + int nr_map; + long unsigned int desc_version; + long unsigned int desc_size; + long unsigned int flags; +}; + +struct efi { + const efi_runtime_services_t *runtime; + unsigned int runtime_version; + unsigned int runtime_supported_mask; + long unsigned int acpi; + long unsigned int acpi20; + long unsigned int smbios; + long unsigned int smbios3; + long unsigned int esrt; + long unsigned int tpm_log; + long unsigned int tpm_final_log; + long unsigned int mokvar_table; + long unsigned int coco_secret; + efi_get_time_t *get_time; + efi_set_time_t *set_time; + efi_get_wakeup_time_t *get_wakeup_time; + efi_set_wakeup_time_t *set_wakeup_time; + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_info_t *query_variable_info; + efi_query_variable_info_t *query_variable_info_nonblocking; + efi_update_capsule_t *update_capsule; + efi_query_capsule_caps_t *query_capsule_caps; + efi_get_next_high_mono_count_t *get_next_high_mono_count; + efi_reset_system_t *reset_system; + struct efi_memory_map memmap; + long unsigned int flags; +}; + +struct dmi_memdev_info { + const char *device; + const char *bank; + u64 size; + u16 handle; + u8 type; +}; + +struct bpf_flow_keys { + __u16 nhoff; + __u16 thoff; + __u16 addr_proto; + __u8 is_frag; + __u8 is_first_frag; + __u8 is_encap; + __u8 ip_proto; + __be16 n_proto; + __be16 sport; + __be16 dport; + union { + struct { + __be32 ipv4_src; + __be32 ipv4_dst; + }; + struct { + __u32 ipv6_src[4]; + __u32 ipv6_dst[4]; + }; + }; + __u32 flags; + __be32 flow_label; +}; + +struct bpf_sock { + __u32 bound_dev_if; + __u32 family; + __u32 type; + __u32 protocol; + __u32 mark; + __u32 priority; + __u32 src_ip4; + __u32 src_ip6[4]; + __u32 src_port; + __be16 dst_port; + __u32 dst_ip4; + __u32 dst_ip6[4]; + __u32 state; + __s32 rx_queue_mapping; +}; + +struct __sk_buff { + __u32 len; + __u32 pkt_type; + __u32 mark; + __u32 queue_mapping; + __u32 protocol; + __u32 vlan_present; + __u32 vlan_tci; + __u32 vlan_proto; + __u32 priority; + __u32 ingress_ifindex; + __u32 ifindex; + __u32 tc_index; + __u32 cb[5]; + __u32 hash; + __u32 tc_classid; + __u32 data; + __u32 data_end; + __u32 napi_id; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 data_meta; + union { + struct bpf_flow_keys *flow_keys; + }; + __u64 tstamp; + __u32 wire_len; + __u32 gso_segs; + union { + struct bpf_sock *sk; + }; + __u32 gso_size; + __u8 tstamp_type; + __u64 hwtstamp; +}; + +enum bpf_ret_code { + BPF_OK = 0, + BPF_DROP = 2, + BPF_REDIRECT = 7, + BPF_LWT_REROUTE = 128, + BPF_FLOW_DISSECTOR_CONTINUE = 129, +}; + +struct nl_info { + struct nlmsghdr *nlh; + struct net *nl_net; + u32 portid; + u8 skip_notify: 1; + u8 skip_notify_kernel: 1; +}; + +struct bpf_skb_data_end { + struct qdisc_skb_cb qdisc_cb; + void *data_meta; + void *data_end; +}; + +enum lwtunnel_encap_types { + LWTUNNEL_ENCAP_NONE = 0, + LWTUNNEL_ENCAP_MPLS = 1, + LWTUNNEL_ENCAP_IP = 2, + LWTUNNEL_ENCAP_ILA = 3, + LWTUNNEL_ENCAP_IP6 = 4, + LWTUNNEL_ENCAP_SEG6 = 5, + LWTUNNEL_ENCAP_BPF = 6, + LWTUNNEL_ENCAP_SEG6_LOCAL = 7, + LWTUNNEL_ENCAP_RPL = 8, + LWTUNNEL_ENCAP_IOAM6 = 9, + LWTUNNEL_ENCAP_XFRM = 10, + __LWTUNNEL_ENCAP_MAX = 11, +}; + +enum { + LWT_BPF_PROG_UNSPEC = 0, + LWT_BPF_PROG_FD = 1, + LWT_BPF_PROG_NAME = 2, + __LWT_BPF_PROG_MAX = 3, +}; + +enum { + LWT_BPF_UNSPEC = 0, + LWT_BPF_IN = 1, + LWT_BPF_OUT = 2, + LWT_BPF_XMIT = 3, + LWT_BPF_XMIT_HEADROOM = 4, + __LWT_BPF_MAX = 5, +}; + +struct fib6_result; + +struct fib6_config; + +struct ipv6_stub { + int (*ipv6_sock_mc_join)(struct sock *, int, const struct in6_addr *); + int (*ipv6_sock_mc_drop)(struct sock *, int, const struct in6_addr *); + struct dst_entry * (*ipv6_dst_lookup_flow)(struct net *, const struct sock *, struct flowi6 *, const struct in6_addr *); + int (*ipv6_route_input)(struct sk_buff *); + struct fib6_table * (*fib6_get_table)(struct net *, u32); + int (*fib6_lookup)(struct net *, int, struct flowi6 *, struct fib6_result *, int); + int (*fib6_table_lookup)(struct net *, struct fib6_table *, int, struct flowi6 *, struct fib6_result *, int); + void (*fib6_select_path)(const struct net *, struct fib6_result *, struct flowi6 *, int, bool, const struct sk_buff *, int); + u32 (*ip6_mtu_from_fib6)(const struct fib6_result *, const struct in6_addr *, const struct in6_addr *); + int (*fib6_nh_init)(struct net *, struct fib6_nh *, struct fib6_config *, gfp_t, struct netlink_ext_ack *); + void (*fib6_nh_release)(struct fib6_nh *); + void (*fib6_nh_release_dsts)(struct fib6_nh *); + void (*fib6_update_sernum)(struct net *, struct fib6_info *); + int (*ip6_del_rt)(struct net *, struct fib6_info *, bool); + void (*fib6_rt_update)(struct net *, struct fib6_info *, struct nl_info *); + void (*udpv6_encap_enable)(); + void (*ndisc_send_na)(struct net_device *, const struct in6_addr *, const struct in6_addr *, bool, bool, bool, bool); + void (*xfrm6_local_rxpmtu)(struct sk_buff *, u32); + int (*xfrm6_udp_encap_rcv)(struct sock *, struct sk_buff *); + int (*xfrm6_rcv_encap)(struct sk_buff *, int, __be32, int); + struct neigh_table *nd_tbl; + int (*ipv6_fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + struct net_device * (*ipv6_dev_find)(struct net *, const struct in6_addr *, struct net_device *); +}; + +struct fib6_result { + struct fib6_nh *nh; + struct fib6_info *f6i; + u32 fib6_flags; + u8 fib6_type; + struct rt6_info *rt6; +}; + +struct fib6_config { + u32 fc_table; + u32 fc_metric; + int fc_dst_len; + int fc_src_len; + int fc_ifindex; + u32 fc_flags; + u32 fc_protocol; + u16 fc_type; + u16 fc_delete_all_nh: 1; + u16 fc_ignore_dev_down: 1; + u16 __unused: 14; + u32 fc_nh_id; + struct in6_addr fc_dst; + struct in6_addr fc_src; + struct in6_addr fc_prefsrc; + struct in6_addr fc_gateway; + long unsigned int fc_expires; + struct nlattr *fc_mx; + int fc_mx_len; + int fc_mp_len; + struct nlattr *fc_mp; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; + bool fc_is_fdb; +}; + +enum { + LWTUNNEL_XMIT_DONE = 0, + LWTUNNEL_XMIT_CONTINUE = 1, +}; + +struct lwtunnel_encap_ops { + int (*build_state)(struct net *, struct nlattr *, unsigned int, const void *, struct lwtunnel_state **, struct netlink_ext_ack *); + void (*destroy_state)(struct lwtunnel_state *); + int (*output)(struct net *, struct sock *, struct sk_buff *); + int (*input)(struct sk_buff *); + int (*fill_encap)(struct sk_buff *, struct lwtunnel_state *); + int (*get_encap_size)(struct lwtunnel_state *); + int (*cmp_encap)(struct lwtunnel_state *, struct lwtunnel_state *); + int (*xmit)(struct sk_buff *); + struct module *owner; +}; + +struct gre_base_hdr { + __be16 flags; + __be16 protocol; +}; + +struct bpf_lwt_prog { + struct bpf_prog *prog; + char *name; +}; + +struct bpf_lwt { + struct bpf_lwt_prog in; + struct bpf_lwt_prog out; + struct bpf_lwt_prog xmit; + int family; +}; + +enum { + SOCK_WAKE_IO = 0, + SOCK_WAKE_WAITD = 1, + SOCK_WAKE_SPACE = 2, + SOCK_WAKE_URG = 3, +}; + +enum { + SKBFL_ZEROCOPY_ENABLE = 1, + SKBFL_SHARED_FRAG = 2, + SKBFL_PURE_ZEROCOPY = 4, + SKBFL_DONT_ORPHAN = 8, + SKBFL_MANAGED_FRAG_REFS = 16, +}; + +union tcp_word_hdr { + struct tcphdr hdr; + __be32 words[5]; +}; + +enum { + TCP_FLAG_CWR = 32768, + TCP_FLAG_ECE = 16384, + TCP_FLAG_URG = 8192, + TCP_FLAG_ACK = 4096, + TCP_FLAG_PSH = 2048, + TCP_FLAG_RST = 1024, + TCP_FLAG_SYN = 512, + TCP_FLAG_FIN = 256, + TCP_RESERVED_BITS = 15, + TCP_DATA_OFFSET = 240, +}; + +enum tcp_fastopen_client_fail { + TFO_STATUS_UNSPEC = 0, + TFO_COOKIE_UNAVAILABLE = 1, + TFO_DATA_NOT_ACKED = 2, + TFO_SYN_RETRANSMITTED = 3, +}; + +struct tcp_sack_block_wire { + __be32 start_seq; + __be32 end_seq; +}; + +struct tcp_request_sock_ops; + +struct tcp_request_sock { + struct inet_request_sock req; + const struct tcp_request_sock_ops *af_specific; + u64 snt_synack; + bool tfo_listener; + bool is_mptcp; + bool drop_req; + u32 txhash; + u32 rcv_isn; + u32 snt_isn; + u32 ts_off; + u32 last_oow_ack_time; + u32 rcv_nxt; + u8 syn_tos; +}; + +enum tcp_synack_type { + TCP_SYNACK_NORMAL = 0, + TCP_SYNACK_FASTOPEN = 1, + TCP_SYNACK_COOKIE = 2, +}; + +struct tcp_request_sock_ops { + u16 mss_clamp; + struct tcp_md5sig_key * (*req_md5_lookup)(const struct sock *, const struct sock *); + int (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *); + __u32 (*cookie_init_seq)(const struct sk_buff *, __u16 *); + struct dst_entry * (*route_req)(const struct sock *, struct sk_buff *, struct flowi *, struct request_sock *); + u32 (*init_seq)(const struct sk_buff *); + u32 (*init_ts_off)(const struct net *, const struct sk_buff *); + int (*send_synack)(const struct sock *, struct dst_entry *, struct flowi *, struct request_sock *, struct tcp_fastopen_cookie *, enum tcp_synack_type, struct sk_buff *); +}; + +struct mptcp_ext { + union { + u64 data_ack; + u32 data_ack32; + }; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + __sum16 csum; + u8 use_map: 1; + u8 dsn64: 1; + u8 data_fin: 1; + u8 use_ack: 1; + u8 ack64: 1; + u8 mpc_map: 1; + u8 frozen: 1; + u8 reset_transient: 1; + u8 reset_reason: 4; + u8 csum_reqd: 1; + u8 infinite_map: 1; +}; + +enum tcp_ca_ack_event_flags { + CA_ACK_SLOWPATH = 1, + CA_ACK_WIN_UPDATE = 2, + CA_ACK_ECE = 4, +}; + +enum tcp_chrono { + TCP_CHRONO_UNSPEC = 0, + TCP_CHRONO_BUSY = 1, + TCP_CHRONO_RWND_LIMITED = 2, + TCP_CHRONO_SNDBUF_LIMITED = 3, + __TCP_CHRONO_MAX = 4, +}; + +enum { + SCM_TSTAMP_SND = 0, + SCM_TSTAMP_SCHED = 1, + SCM_TSTAMP_ACK = 2, +}; + +struct tcp_sacktag_state { + u64 first_sackt; + u64 last_sackt; + u32 reord; + u32 sack_delivered; + int flag; + unsigned int mss_now; + struct rate_sample *rate; +}; + +enum arm64_hyp_spectre_vector { + HYP_VECTOR_DIRECT = 0, + HYP_VECTOR_SPECTRE_DIRECT = 1, + HYP_VECTOR_INDIRECT = 2, + HYP_VECTOR_SPECTRE_INDIRECT = 3, +}; + +typedef void (*bp_hardening_cb_t)(); + +struct bp_hardening_data { + enum arm64_hyp_spectre_vector slot; + bp_hardening_cb_t fn; +}; + +struct stack_info { + long unsigned int low; + long unsigned int high; +}; + +enum { + IRQD_TRIGGER_MASK = 15, + IRQD_SETAFFINITY_PENDING = 256, + IRQD_ACTIVATED = 512, + IRQD_NO_BALANCING = 1024, + IRQD_PER_CPU = 2048, + IRQD_AFFINITY_SET = 4096, + IRQD_LEVEL = 8192, + IRQD_WAKEUP_STATE = 16384, + IRQD_MOVE_PCNTXT = 32768, + IRQD_IRQ_DISABLED = 65536, + IRQD_IRQ_MASKED = 131072, + IRQD_IRQ_INPROGRESS = 262144, + IRQD_WAKEUP_ARMED = 524288, + IRQD_FORWARDED_TO_VCPU = 1048576, + IRQD_AFFINITY_MANAGED = 2097152, + IRQD_IRQ_STARTED = 4194304, + IRQD_MANAGED_SHUTDOWN = 8388608, + IRQD_SINGLE_TARGET = 16777216, + IRQD_DEFAULT_TRIGGER_SET = 33554432, + IRQD_CAN_RESERVE = 67108864, + IRQD_MSI_NOMASK_QUIRK = 134217728, + IRQD_HANDLE_ENFORCE_IRQCTX = 268435456, + IRQD_AFFINITY_ON_ACTIVATE = 536870912, + IRQD_IRQ_ENABLED_ON_SUSPEND = 1073741824, +}; + +struct irq_affinity_desc { + struct cpumask mask; + unsigned int is_managed: 1; +}; + +struct kernel_stat { + long unsigned int irqs_sum; + unsigned int softirqs[10]; +}; + +enum audit_state { + AUDIT_STATE_DISABLED = 0, + AUDIT_STATE_BUILD = 1, + AUDIT_STATE_RECORD = 2, +}; + +struct audit_cap_data { + kernel_cap_t permitted; + kernel_cap_t inheritable; + union { + unsigned int fE; + kernel_cap_t effective; + }; + kernel_cap_t ambient; + kuid_t rootid; +}; + +struct audit_names { + struct list_head list; + struct filename *name; + int name_len; + bool hidden; + long unsigned int ino; + dev_t dev; + umode_t mode; + kuid_t uid; + kgid_t gid; + dev_t rdev; + u32 osid; + struct audit_cap_data fcap; + unsigned int fcap_ver; + unsigned char type; + bool should_free; +}; + +struct open_how { + __u64 flags; + __u64 mode; + __u64 resolve; +}; + +struct audit_ntp_val { + long long int oldval; + long long int newval; +}; + +struct audit_ntp_data { + struct audit_ntp_val vals[6]; +}; + +struct audit_proctitle { + int len; + char *value; +}; + +struct audit_aux_data; + +struct audit_tree_refs; + +struct audit_context { + int dummy; + enum { + AUDIT_CTX_UNUSED = 0, + AUDIT_CTX_SYSCALL = 1, + AUDIT_CTX_URING = 2, + } context; + enum audit_state state; + enum audit_state current_state; + unsigned int serial; + int major; + int uring_op; + struct timespec64 ctime; + long unsigned int argv[4]; + long int return_code; + u64 prio; + int return_valid; + struct audit_names preallocated_names[5]; + int name_count; + struct list_head names_list; + char *filterkey; + struct path pwd; + struct audit_aux_data *aux; + struct audit_aux_data *aux_pids; + struct __kernel_sockaddr_storage *sockaddr; + size_t sockaddr_len; + pid_t ppid; + kuid_t uid; + kuid_t euid; + kuid_t suid; + kuid_t fsuid; + kgid_t gid; + kgid_t egid; + kgid_t sgid; + kgid_t fsgid; + long unsigned int personality; + int arch; + pid_t target_pid; + kuid_t target_auid; + kuid_t target_uid; + unsigned int target_sessionid; + u32 target_sid; + char target_comm[16]; + struct audit_tree_refs *trees; + struct audit_tree_refs *first_trees; + struct list_head killed_trees; + int tree_count; + int type; + union { + struct { + int nargs; + long int args[6]; + } socketcall; + struct { + kuid_t uid; + kgid_t gid; + umode_t mode; + u32 osid; + int has_perm; + uid_t perm_uid; + gid_t perm_gid; + umode_t perm_mode; + long unsigned int qbytes; + } ipc; + struct { + mqd_t mqdes; + struct mq_attr mqstat; + } mq_getsetattr; + struct { + mqd_t mqdes; + int sigev_signo; + } mq_notify; + struct { + mqd_t mqdes; + size_t msg_len; + unsigned int msg_prio; + struct timespec64 abs_timeout; + } mq_sendrecv; + struct { + int oflag; + umode_t mode; + struct mq_attr attr; + } mq_open; + struct { + pid_t pid; + struct audit_cap_data cap; + } capset; + struct { + int fd; + int flags; + } mmap; + struct open_how openat2; + struct { + int argc; + } execve; + struct { + char *name; + } module; + struct { + struct audit_ntp_data ntp_data; + struct timespec64 tk_injoffset; + } time; + }; + int fds[2]; + struct audit_proctitle proctitle; +}; + +enum audit_nlgrps { + AUDIT_NLGRP_NONE = 0, + AUDIT_NLGRP_READLOG = 1, + __AUDIT_NLGRP_MAX = 2, +}; + +struct audit_status { + __u32 mask; + __u32 enabled; + __u32 failure; + __u32 pid; + __u32 rate_limit; + __u32 backlog_limit; + __u32 lost; + __u32 backlog; + union { + __u32 version; + __u32 feature_bitmap; + }; + __u32 backlog_wait_time; + __u32 backlog_wait_time_actual; +}; + +struct audit_features { + __u32 vers; + __u32 mask; + __u32 features; + __u32 lock; +}; + +struct audit_tty_status { + __u32 enabled; + __u32 log_passwd; +}; + +struct audit_sig_info { + uid_t uid; + pid_t pid; + char ctx[0]; +}; + +struct audit_netlink_list { + __u32 portid; + struct net *net; + struct sk_buff_head q; +}; + +struct audit_net { + struct sock *sk; +}; + +struct auditd_connection { + struct pid *pid; + u32 portid; + struct net *net; + struct callback_head rcu; +}; + +struct audit_ctl_mutex { + struct mutex lock; + void *owner; +}; + +struct audit_buffer { + struct sk_buff *skb; + struct audit_context *ctx; + gfp_t gfp_mask; +}; + +struct audit_reply { + __u32 portid; + struct net *net; + struct sk_buff *skb; +}; + +enum blake2b_lengths { + BLAKE2B_BLOCK_SIZE = 128, + BLAKE2B_HASH_SIZE = 64, + BLAKE2B_KEY_SIZE = 64, + BLAKE2B_160_HASH_SIZE = 20, + BLAKE2B_256_HASH_SIZE = 32, + BLAKE2B_384_HASH_SIZE = 48, + BLAKE2B_512_HASH_SIZE = 64, +}; + +struct blake2b_state { + u64 h[8]; + u64 t[2]; + u64 f[2]; + u8 buf[128]; + unsigned int buflen; + unsigned int outlen; +}; + +enum blake2b_iv { + BLAKE2B_IV0 = 7640891576956012808ULL, + BLAKE2B_IV1 = 13503953896175478587ULL, + BLAKE2B_IV2 = 4354685564936845355ULL, + BLAKE2B_IV3 = 11912009170470909681ULL, + BLAKE2B_IV4 = 5840696475078001361ULL, + BLAKE2B_IV5 = 11170449401992604703ULL, + BLAKE2B_IV6 = 2270897969802886507ULL, + BLAKE2B_IV7 = 6620516959819538809ULL, +}; + +typedef void (*blake2b_compress_t)(struct blake2b_state *, const u8 *, size_t, u32); + +struct blake2b_tfm_ctx { + u8 key[64]; + unsigned int keylen; +}; + +struct parsed_partitions { + struct gendisk *disk; + char name[32]; + struct { + sector_t from; + sector_t size; + int flags; + bool has_info; + struct partition_meta_info info; + } *parts; + int next; + int limit; + bool access_beyond_eod; + char *pp_buf; +}; + +typedef struct { + struct folio *v; +} Sector; + +enum { + SUN_WHOLE_DISK = 5, + LINUX_RAID_PARTITION = 253, +}; + +struct sun_info { + __be16 id; + __be16 flags; +}; + +struct sun_vtoc { + __be32 version; + char volume[8]; + __be16 nparts; + struct sun_info infos[8]; + __be16 padding; + __be32 bootinfo[3]; + __be32 sanity; + __be32 reserved[10]; + __be32 timestamp[8]; +}; + +struct sun_partition { + __be32 start_cylinder; + __be32 num_sectors; +}; + +struct sun_disklabel { + unsigned char info[128]; + struct sun_vtoc vtoc; + __be32 write_reinstruct; + __be32 read_reinstruct; + unsigned char spare[148]; + __be16 rspeed; + __be16 pcylcount; + __be16 sparecyl; + __be16 obs1; + __be16 obs2; + __be16 ilfact; + __be16 ncyl; + __be16 nacyl; + __be16 ntrks; + __be16 nsect; + __be16 obs3; + __be16 obs4; + struct sun_partition partitions[8]; + __be16 magic; + __be16 csum; +}; + +struct fault_attr { + long unsigned int probability; + long unsigned int interval; + atomic_t times; + atomic_t space; + long unsigned int verbose; + bool task_filter; + long unsigned int stacktrace_depth; + long unsigned int require_start; + long unsigned int require_end; + long unsigned int reject_start; + long unsigned int reject_end; + long unsigned int count; + struct ratelimit_state ratelimit_state; + struct dentry *dname; +}; + +enum fault_flags { + FAULT_NOWARN = 1, +}; + +struct miscdevice { + int minor; + const char *name; + const struct file_operations *fops; + struct list_head list; + struct device *parent; + struct device *this_device; + const struct attribute_group **groups; + const char *nodename; + umode_t mode; +}; + +struct vga_device { + struct list_head list; + struct pci_dev *pdev; + unsigned int decodes; + unsigned int owns; + unsigned int locks; + unsigned int io_lock_cnt; + unsigned int mem_lock_cnt; + unsigned int io_norm_cnt; + unsigned int mem_norm_cnt; + bool bridge_has_one_vga; + bool is_firmware_default; + unsigned int (*set_decode)(struct pci_dev *, bool); +}; + +struct vga_arb_user_card { + struct pci_dev *pdev; + unsigned int mem_cnt; + unsigned int io_cnt; +}; + +struct vga_arb_private { + struct list_head list; + struct pci_dev *target; + struct vga_arb_user_card cards[16]; + spinlock_t lock; +}; + +typedef acpi_status (*acpi_walk_callback)(acpi_handle, u32, void *, void **); + +typedef u32 acpi_mutex_handle; + +typedef u16 acpi_rs_length; + +typedef u32 acpi_rsdesc_size; + +struct acpi_table_desc { + acpi_physical_address address; + struct acpi_table_header *pointer; + u32 length; + union acpi_name_union signature; + acpi_owner_id owner_id; + u8 flags; + u16 validation_count; +}; + +struct acpi_table_list { + struct acpi_table_desc *tables; + u32 current_table_count; + u32 max_table_count; + u8 flags; +}; + +struct acpi_exception_info { + char *name; +}; + +struct module_version_attribute { + struct module_attribute mattr; + const char *module_name; + const char *version; +}; + +struct virtio_pci_legacy_device { + struct pci_dev *pci_dev; + u8 *isr; + void *ioaddr; + struct virtio_device_id id; +}; + +struct trace_event_raw_devres { + struct trace_entry ent; + u32 __data_loc_devname; + struct device *dev; + const char *op; + void *node; + const char *name; + size_t size; + char __data[0]; +}; + +struct trace_event_data_offsets_devres { + u32 devname; +}; + +typedef void (*btf_trace_devres_log)(void *, struct device *, const char *, void *, const char *, size_t); + +struct dst_cache_pcpu { + long unsigned int refresh_ts; + struct dst_entry *dst; + u32 cookie; + union { + struct in_addr in_saddr; + struct in6_addr in6_saddr; + }; +}; + +enum audit_nfcfgop { + AUDIT_XT_OP_REGISTER = 0, + AUDIT_XT_OP_REPLACE = 1, + AUDIT_XT_OP_UNREGISTER = 2, + AUDIT_NFT_OP_TABLE_REGISTER = 3, + AUDIT_NFT_OP_TABLE_UNREGISTER = 4, + AUDIT_NFT_OP_CHAIN_REGISTER = 5, + AUDIT_NFT_OP_CHAIN_UNREGISTER = 6, + AUDIT_NFT_OP_RULE_REGISTER = 7, + AUDIT_NFT_OP_RULE_UNREGISTER = 8, + AUDIT_NFT_OP_SET_REGISTER = 9, + AUDIT_NFT_OP_SET_UNREGISTER = 10, + AUDIT_NFT_OP_SETELEM_REGISTER = 11, + AUDIT_NFT_OP_SETELEM_UNREGISTER = 12, + AUDIT_NFT_OP_GEN_REGISTER = 13, + AUDIT_NFT_OP_OBJ_REGISTER = 14, + AUDIT_NFT_OP_OBJ_UNREGISTER = 15, + AUDIT_NFT_OP_OBJ_RESET = 16, + AUDIT_NFT_OP_FLOWTABLE_REGISTER = 17, + AUDIT_NFT_OP_FLOWTABLE_UNREGISTER = 18, + AUDIT_NFT_OP_INVALID = 19, +}; + +struct xt_entry_match { + union { + struct { + __u16 match_size; + char name[29]; + __u8 revision; + } user; + struct { + __u16 match_size; + struct xt_match *match; + } kernel; + __u16 match_size; + } u; + unsigned char data[0]; +}; + +struct xt_entry_target { + union { + struct { + __u16 target_size; + char name[29]; + __u8 revision; + } user; + struct { + __u16 target_size; + struct xt_target *target; + } kernel; + __u16 target_size; + } u; + unsigned char data[0]; +}; + +struct xt_standard_target { + struct xt_entry_target target; + int verdict; +}; + +struct xt_error_target { + struct xt_entry_target target; + char errorname[30]; +}; + +struct xt_counters { + __u64 pcnt; + __u64 bcnt; +}; + +struct xt_counters_info { + char name[32]; + unsigned int num_counters; + struct xt_counters counters[0]; +}; + +struct xt_table_info; + +struct xt_table { + struct list_head list; + unsigned int valid_hooks; + struct xt_table_info *private; + struct nf_hook_ops *ops; + struct module *me; + u_int8_t af; + int priority; + const char name[32]; +}; + +struct xt_table_info { + unsigned int size; + unsigned int number; + unsigned int initial_entries; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int stacksize; + void ***jumpstack; + unsigned char entries[0]; +}; + +struct xt_percpu_counter_alloc_state { + unsigned int off; + const char *mem; +}; + +struct xt_template { + struct list_head list; + int (*table_init)(struct net *); + struct module *me; + char name[32]; +}; + +struct xt_pernet { + struct list_head tables[11]; +}; + +struct xt_af { + struct mutex mutex; + struct list_head match; + struct list_head target; +}; + +struct nf_mttg_trav { + struct list_head *head; + struct list_head *curr; + uint8_t class; +}; + +enum { + MTTG_TRAV_INIT = 0, + MTTG_TRAV_NFP_UNSPEC = 1, + MTTG_TRAV_NFP_SPEC = 2, + MTTG_TRAV_DONE = 3, +}; + +struct btf_id_set8 { + u32 cnt; + u32 flags; + struct { + u32 id; + u32 flags; + } pairs[0]; +}; + +struct btf_kfunc_id_set { + struct module *owner; + struct btf_id_set8 *set; +}; + +enum sk_pacing { + SK_PACING_NONE = 0, + SK_PACING_NEEDED = 1, + SK_PACING_FQ = 2, +}; + +struct bictcp { + u32 cnt; + u32 last_max_cwnd; + u32 last_cwnd; + u32 last_time; + u32 bic_origin_point; + u32 bic_K; + u32 delay_min; + u32 epoch_start; + u32 ack_cnt; + u32 tcp_cwnd; + u16 unused; + u8 sample_cnt; + u8 found; + u32 round_start; + u32 end_seq; + u32 last_ack; + u32 curr_rtt; +}; + +struct inet6_protocol { + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + unsigned int flags; +}; + +struct xfrm6_tunnel { + int (*handler)(struct sk_buff *); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + struct xfrm6_tunnel *next; + int priority; +}; + +enum sock_shutdown_cmd { + SHUT_RD = 0, + SHUT_WR = 1, + SHUT_RDWR = 2, +}; + +struct udp_sock { + struct inet_sock inet; + int pending; + unsigned int corkflag; + __u8 encap_type; + unsigned char no_check6_tx: 1; + unsigned char no_check6_rx: 1; + unsigned char encap_enabled: 1; + unsigned char gro_enabled: 1; + unsigned char accept_udp_l4: 1; + unsigned char accept_udp_fraglist: 1; + __u16 len; + __u16 gso_size; + __u16 pcslen; + __u16 pcrlen; + __u8 pcflag; + __u8 unused[3]; + int (*encap_rcv)(struct sock *, struct sk_buff *); + void (*encap_err_rcv)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + int (*encap_err_lookup)(struct sock *, struct sk_buff *); + void (*encap_destroy)(struct sock *); + struct sk_buff * (*gro_receive)(struct sock *, struct list_head *, struct sk_buff *); + int (*gro_complete)(struct sock *, struct sk_buff *, int); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sk_buff_head reader_queue; + int forward_deficit; + int forward_threshold; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct udp_port_cfg { + u8 family; + union { + struct in_addr local_ip; + struct in6_addr local_ip6; + }; + union { + struct in_addr peer_ip; + struct in6_addr peer_ip6; + }; + __be16 local_udp_port; + __be16 peer_udp_port; + int bind_ifindex; + unsigned int use_udp_checksums: 1; + unsigned int use_udp6_tx_checksums: 1; + unsigned int use_udp6_rx_checksums: 1; + unsigned int ipv6_v6only: 1; +}; + +struct udp_tunnel_info { + short unsigned int type; + sa_family_t sa_family; + __be16 port; + u8 hw_priv; +}; + +struct udp_tunnel_nic_shared { + struct udp_tunnel_nic *udp_tunnel_nic_info; + struct list_head devices; +}; + +enum { + BIO_NO_PAGE_REF = 0, + BIO_CLONED = 1, + BIO_BOUNCED = 2, + BIO_QUIET = 3, + BIO_CHAIN = 4, + BIO_REFFED = 5, + BIO_BPS_THROTTLED = 6, + BIO_TRACE_COMPLETION = 7, + BIO_CGROUP_ACCT = 8, + BIO_QOS_THROTTLED = 9, + BIO_QOS_MERGED = 10, + BIO_REMAPPED = 11, + BIO_ZONE_WRITE_LOCKED = 12, + BIO_FLAG_LAST = 13, +}; + +struct swap_iocb { + struct kiocb iocb; + struct bio_vec bvec[32]; + int pages; + int len; +}; + +enum { + SWP_USED = 1, + SWP_WRITEOK = 2, + SWP_DISCARDABLE = 4, + SWP_DISCARDING = 8, + SWP_SOLIDSTATE = 16, + SWP_CONTINUED = 32, + SWP_BLKDEV = 64, + SWP_ACTIVATED = 128, + SWP_FS_OPS = 256, + SWP_AREA_DISCARD = 512, + SWP_PAGE_DISCARD = 1024, + SWP_STABLE_WRITES = 2048, + SWP_SYNCHRONOUS_IO = 4096, + SWP_SCANNING = 16384, +}; + +enum { + SELNL_MSG_SETENFORCE = 16, + SELNL_MSG_POLICYLOAD = 17, + SELNL_MSG_MAX = 18, +}; + +enum selinux_nlgroups { + SELNLGRP_NONE = 0, + SELNLGRP_AVC = 1, + __SELNLGRP_MAX = 2, +}; + +struct selnl_msg_setenforce { + __s32 val; +}; + +struct selnl_msg_policyload { + __u32 seqno; +}; + +typedef __kernel_off_t off_t; + +struct akcipher_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_akcipher { + struct crypto_tfm base; +}; + +struct akcipher_alg { + int (*sign)(struct akcipher_request *); + int (*verify)(struct akcipher_request *); + int (*encrypt)(struct akcipher_request *); + int (*decrypt)(struct akcipher_request *); + int (*set_pub_key)(struct crypto_akcipher *, const void *, unsigned int); + int (*set_priv_key)(struct crypto_akcipher *, const void *, unsigned int); + unsigned int (*max_size)(struct crypto_akcipher *); + int (*init)(struct crypto_akcipher *); + void (*exit)(struct crypto_akcipher *); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct akcipher_instance { + void (*free)(struct akcipher_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[128]; + struct crypto_instance base; + } s; + struct akcipher_alg alg; + }; +}; + +struct crypto_akcipher_spawn { + struct crypto_spawn base; +}; + +struct rsa_asn1_template { + const char *name; + const u8 *data; + size_t size; +}; + +struct pkcs1pad_ctx { + struct crypto_akcipher *child; + unsigned int key_size; +}; + +struct pkcs1pad_inst_ctx { + struct crypto_akcipher_spawn spawn; + const struct rsa_asn1_template *digest_info; +}; + +struct pkcs1pad_request { + struct scatterlist in_sg[2]; + struct scatterlist out_sg[1]; + uint8_t *in_buf; + uint8_t *out_buf; + long: 64; + long: 64; + struct akcipher_request child_req; +}; + +struct disk_stats { + u64 nsecs[4]; + long unsigned int sectors[4]; + long unsigned int ios[4]; + long unsigned int merges[4]; + long unsigned int io_ticks; + local_t in_flight[2]; +}; + +struct blkg_iostat { + u64 bytes[3]; + u64 ios[3]; +}; + +struct blkg_iostat_set { + struct u64_stats_sync sync; + struct blkcg_gq *blkg; + struct llist_node lnode; + int lqueued; + struct blkg_iostat cur; + struct blkg_iostat last; +}; + +struct blkcg; + +struct blkg_policy_data; + +struct blkcg_gq { + struct request_queue *q; + struct list_head q_node; + struct hlist_node blkcg_node; + struct blkcg *blkcg; + struct blkcg_gq *parent; + struct percpu_ref refcnt; + bool online; + struct blkg_iostat_set *iostat_cpu; + struct blkg_iostat_set iostat; + struct blkg_policy_data *pd[6]; + spinlock_t async_bio_lock; + struct bio_list async_bios; + union { + struct work_struct async_bio_work; + struct work_struct free_work; + }; + atomic_t use_delay; + atomic64_t delay_nsec; + atomic64_t delay_start; + u64 last_delay; + int last_use; + struct callback_head callback_head; +}; + +enum stat_group { + STAT_READ = 0, + STAT_WRITE = 1, + STAT_DISCARD = 2, + STAT_FLUSH = 3, + NR_STAT_GROUPS = 4, +}; + +struct req_iterator { + struct bvec_iter iter; + struct bio *bio; +}; + +enum xen_domain_type { + XEN_NATIVE = 0, + XEN_PV_DOMAIN = 1, + XEN_HVM_DOMAIN = 2, +}; + +enum blkg_iostat_type { + BLKG_IOSTAT_READ = 0, + BLKG_IOSTAT_WRITE = 1, + BLKG_IOSTAT_DISCARD = 2, + BLKG_IOSTAT_NR = 3, +}; + +struct blkcg_policy_data; + +struct blkcg { + struct cgroup_subsys_state css; + spinlock_t lock; + refcount_t online_pin; + struct xarray blkg_tree; + struct blkcg_gq *blkg_hint; + struct hlist_head blkg_list; + struct blkcg_policy_data *cpd[6]; + struct list_head all_blkcgs_node; + struct llist_head *lhead; + struct list_head cgwb_list; +}; + +struct blkg_policy_data { + struct blkcg_gq *blkg; + int plid; +}; + +struct blkcg_policy_data { + struct blkcg *blkcg; + int plid; +}; + +enum blkg_rwstat_type { + BLKG_RWSTAT_READ = 0, + BLKG_RWSTAT_WRITE = 1, + BLKG_RWSTAT_SYNC = 2, + BLKG_RWSTAT_ASYNC = 3, + BLKG_RWSTAT_DISCARD = 4, + BLKG_RWSTAT_NR = 5, + BLKG_RWSTAT_TOTAL = 5, +}; + +enum { + LIMIT_LOW = 0, + LIMIT_MAX = 1, + LIMIT_CNT = 2, +}; + +enum bio_merge_status { + BIO_MERGE_OK = 0, + BIO_MERGE_NONE = 1, + BIO_MERGE_FAILED = 2, +}; + +struct acpi_bus_type { + struct list_head list; + const char *name; + bool (*match)(struct device *); + struct acpi_device * (*find_companion)(struct device *); + void (*setup)(struct device *); +}; + +struct find_child_walk_data { + struct acpi_device *adev; + u64 address; + int score; + bool check_sta; + bool check_children; +}; + +typedef acpi_status (*acpi_walk_aml_callback)(u8 *, u32, u32, u8, void **); + +struct uart_8250_port; + +struct uart_8250_ops { + int (*setup_irq)(struct uart_8250_port *); + void (*release_irq)(struct uart_8250_port *); + void (*setup_timer)(struct uart_8250_port *); +}; + +struct mctrl_gpios; + +struct uart_8250_dma; + +struct uart_8250_em485; + +struct uart_8250_port { + struct uart_port port; + struct timer_list timer; + struct list_head list; + u32 capabilities; + short unsigned int bugs; + bool fifo_bug; + unsigned int tx_loadsz; + unsigned char acr; + unsigned char fcr; + unsigned char ier; + unsigned char lcr; + unsigned char mcr; + unsigned char cur_iotype; + unsigned int rpm_tx_active; + unsigned char canary; + unsigned char probe; + struct mctrl_gpios *gpios; + u16 lsr_saved_flags; + u16 lsr_save_mask; + unsigned char msr_saved_flags; + struct uart_8250_dma *dma; + const struct uart_8250_ops *ops; + int (*dl_read)(struct uart_8250_port *); + void (*dl_write)(struct uart_8250_port *, int); + struct uart_8250_em485 *em485; + void (*rs485_start_tx)(struct uart_8250_port *); + void (*rs485_stop_tx)(struct uart_8250_port *); + struct delayed_work overrun_backoff; + u32 overrun_backoff_time_ms; +}; + +struct uart_8250_em485 { + struct hrtimer start_tx_timer; + struct hrtimer stop_tx_timer; + struct hrtimer *active_timer; + struct uart_8250_port *port; + unsigned int tx_stopped: 1; +}; + +struct dma_chan; + +typedef bool (*dma_filter_fn)(struct dma_chan *, void *); + +enum dma_transfer_direction { + DMA_MEM_TO_MEM = 0, + DMA_MEM_TO_DEV = 1, + DMA_DEV_TO_MEM = 2, + DMA_DEV_TO_DEV = 3, + DMA_TRANS_NONE = 4, +}; + +enum dma_slave_buswidth { + DMA_SLAVE_BUSWIDTH_UNDEFINED = 0, + DMA_SLAVE_BUSWIDTH_1_BYTE = 1, + DMA_SLAVE_BUSWIDTH_2_BYTES = 2, + DMA_SLAVE_BUSWIDTH_3_BYTES = 3, + DMA_SLAVE_BUSWIDTH_4_BYTES = 4, + DMA_SLAVE_BUSWIDTH_8_BYTES = 8, + DMA_SLAVE_BUSWIDTH_16_BYTES = 16, + DMA_SLAVE_BUSWIDTH_32_BYTES = 32, + DMA_SLAVE_BUSWIDTH_64_BYTES = 64, + DMA_SLAVE_BUSWIDTH_128_BYTES = 128, +}; + +struct dma_slave_config { + enum dma_transfer_direction direction; + phys_addr_t src_addr; + phys_addr_t dst_addr; + enum dma_slave_buswidth src_addr_width; + enum dma_slave_buswidth dst_addr_width; + u32 src_maxburst; + u32 dst_maxburst; + u32 src_port_window_size; + u32 dst_port_window_size; + bool device_fc; + void *peripheral_config; + size_t peripheral_size; +}; + +typedef s32 dma_cookie_t; + +struct uart_8250_dma { + int (*tx_dma)(struct uart_8250_port *); + int (*rx_dma)(struct uart_8250_port *); + void (*prepare_tx_dma)(struct uart_8250_port *); + void (*prepare_rx_dma)(struct uart_8250_port *); + dma_filter_fn fn; + void *rx_param; + void *tx_param; + struct dma_slave_config rxconf; + struct dma_slave_config txconf; + struct dma_chan *rxchan; + struct dma_chan *txchan; + phys_addr_t rx_dma_addr; + phys_addr_t tx_dma_addr; + dma_addr_t rx_addr; + dma_addr_t tx_addr; + dma_cookie_t rx_cookie; + dma_cookie_t tx_cookie; + void *rx_buf; + size_t rx_size; + size_t tx_size; + unsigned char tx_running; + unsigned char tx_err; + unsigned char rx_running; +}; + +enum dma_status { + DMA_COMPLETE = 0, + DMA_IN_PROGRESS = 1, + DMA_PAUSED = 2, + DMA_ERROR = 3, + DMA_OUT_OF_ORDER = 4, +}; + +enum dma_transaction_type { + DMA_MEMCPY = 0, + DMA_XOR = 1, + DMA_PQ = 2, + DMA_XOR_VAL = 3, + DMA_PQ_VAL = 4, + DMA_MEMSET = 5, + DMA_MEMSET_SG = 6, + DMA_INTERRUPT = 7, + DMA_PRIVATE = 8, + DMA_ASYNC_TX = 9, + DMA_SLAVE = 10, + DMA_CYCLIC = 11, + DMA_INTERLEAVE = 12, + DMA_COMPLETION_NO_ORDER = 13, + DMA_REPEAT = 14, + DMA_LOAD_EOT = 15, + DMA_TX_TYPE_END = 16, +}; + +struct data_chunk { + size_t size; + size_t icg; + size_t dst_icg; + size_t src_icg; +}; + +struct dma_interleaved_template { + dma_addr_t src_start; + dma_addr_t dst_start; + enum dma_transfer_direction dir; + bool src_inc; + bool dst_inc; + bool src_sgl; + bool dst_sgl; + size_t numf; + size_t frame_size; + struct data_chunk sgl[0]; +}; + +enum dma_ctrl_flags { + DMA_PREP_INTERRUPT = 1, + DMA_CTRL_ACK = 2, + DMA_PREP_PQ_DISABLE_P = 4, + DMA_PREP_PQ_DISABLE_Q = 8, + DMA_PREP_CONTINUE = 16, + DMA_PREP_FENCE = 32, + DMA_CTRL_REUSE = 64, + DMA_PREP_CMD = 128, + DMA_PREP_REPEAT = 256, + DMA_PREP_LOAD_EOT = 512, +}; + +enum sum_check_bits { + SUM_CHECK_P = 0, + SUM_CHECK_Q = 1, +}; + +enum sum_check_flags { + SUM_CHECK_P_RESULT = 1, + SUM_CHECK_Q_RESULT = 2, +}; + +typedef struct { + long unsigned int bits[1]; +} dma_cap_mask_t; + +enum dma_desc_metadata_mode { + DESC_METADATA_NONE = 0, + DESC_METADATA_CLIENT = 1, + DESC_METADATA_ENGINE = 2, +}; + +struct dma_chan_percpu { + long unsigned int memcpy_count; + long unsigned int bytes_transferred; +}; + +struct dma_router { + struct device *dev; + void (*route_free)(struct device *, void *); +}; + +struct dma_device; + +struct dma_chan_dev; + +struct dma_chan { + struct dma_device *device; + struct device *slave; + dma_cookie_t cookie; + dma_cookie_t completed_cookie; + int chan_id; + struct dma_chan_dev *dev; + const char *name; + char *dbg_client_name; + struct list_head device_node; + struct dma_chan_percpu *local; + int client_count; + int table_count; + struct dma_router *router; + void *route_data; + void *private; +}; + +struct dma_slave_map; + +struct dma_filter { + dma_filter_fn fn; + int mapcnt; + const struct dma_slave_map *map; +}; + +enum dmaengine_alignment { + DMAENGINE_ALIGN_1_BYTE = 0, + DMAENGINE_ALIGN_2_BYTES = 1, + DMAENGINE_ALIGN_4_BYTES = 2, + DMAENGINE_ALIGN_8_BYTES = 3, + DMAENGINE_ALIGN_16_BYTES = 4, + DMAENGINE_ALIGN_32_BYTES = 5, + DMAENGINE_ALIGN_64_BYTES = 6, + DMAENGINE_ALIGN_128_BYTES = 7, + DMAENGINE_ALIGN_256_BYTES = 8, +}; + +enum dma_residue_granularity { + DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0, + DMA_RESIDUE_GRANULARITY_SEGMENT = 1, + DMA_RESIDUE_GRANULARITY_BURST = 2, +}; + +struct dma_async_tx_descriptor; + +struct dma_slave_caps; + +struct dma_tx_state; + +struct dma_device { + struct kref ref; + unsigned int chancnt; + unsigned int privatecnt; + struct list_head channels; + struct list_head global_node; + struct dma_filter filter; + dma_cap_mask_t cap_mask; + enum dma_desc_metadata_mode desc_metadata_modes; + short unsigned int max_xor; + short unsigned int max_pq; + enum dmaengine_alignment copy_align; + enum dmaengine_alignment xor_align; + enum dmaengine_alignment pq_align; + enum dmaengine_alignment fill_align; + int dev_id; + struct device *dev; + struct module *owner; + struct ida chan_ida; + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool descriptor_reuse; + enum dma_residue_granularity residue_granularity; + int (*device_alloc_chan_resources)(struct dma_chan *); + int (*device_router_config)(struct dma_chan *); + void (*device_free_chan_resources)(struct dma_chan *); + struct dma_async_tx_descriptor * (*device_prep_dma_memcpy)(struct dma_chan *, dma_addr_t, dma_addr_t, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_xor)(struct dma_chan *, dma_addr_t, dma_addr_t *, unsigned int, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_xor_val)(struct dma_chan *, dma_addr_t *, unsigned int, size_t, enum sum_check_flags *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_pq)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_pq_val)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, enum sum_check_flags *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_memset)(struct dma_chan *, dma_addr_t, int, size_t, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_memset_sg)(struct dma_chan *, struct scatterlist *, unsigned int, int, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_interrupt)(struct dma_chan *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_slave_sg)(struct dma_chan *, struct scatterlist *, unsigned int, enum dma_transfer_direction, long unsigned int, void *); + struct dma_async_tx_descriptor * (*device_prep_dma_cyclic)(struct dma_chan *, dma_addr_t, size_t, size_t, enum dma_transfer_direction, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_interleaved_dma)(struct dma_chan *, struct dma_interleaved_template *, long unsigned int); + struct dma_async_tx_descriptor * (*device_prep_dma_imm_data)(struct dma_chan *, dma_addr_t, u64, long unsigned int); + void (*device_caps)(struct dma_chan *, struct dma_slave_caps *); + int (*device_config)(struct dma_chan *, struct dma_slave_config *); + int (*device_pause)(struct dma_chan *); + int (*device_resume)(struct dma_chan *); + int (*device_terminate_all)(struct dma_chan *); + void (*device_synchronize)(struct dma_chan *); + enum dma_status (*device_tx_status)(struct dma_chan *, dma_cookie_t, struct dma_tx_state *); + void (*device_issue_pending)(struct dma_chan *); + void (*device_release)(struct dma_device *); + void (*dbg_summary_show)(struct seq_file *, struct dma_device *); + struct dentry *dbg_dev_root; +}; + +struct dma_chan_dev { + struct dma_chan *chan; + struct device device; + int dev_id; + bool chan_dma_dev; +}; + +struct dma_slave_caps { + u32 src_addr_widths; + u32 dst_addr_widths; + u32 directions; + u32 min_burst; + u32 max_burst; + u32 max_sg_burst; + bool cmd_pause; + bool cmd_resume; + bool cmd_terminate; + enum dma_residue_granularity residue_granularity; + bool descriptor_reuse; +}; + +typedef void (*dma_async_tx_callback)(void *); + +enum dmaengine_tx_result { + DMA_TRANS_NOERROR = 0, + DMA_TRANS_READ_FAILED = 1, + DMA_TRANS_WRITE_FAILED = 2, + DMA_TRANS_ABORTED = 3, +}; + +struct dmaengine_result { + enum dmaengine_tx_result result; + u32 residue; +}; + +typedef void (*dma_async_tx_callback_result)(void *, const struct dmaengine_result *); + +struct dmaengine_unmap_data { + u8 map_cnt; + u8 to_cnt; + u8 from_cnt; + u8 bidi_cnt; + struct device *dev; + struct kref kref; + size_t len; + dma_addr_t addr[0]; +}; + +struct dma_descriptor_metadata_ops { + int (*attach)(struct dma_async_tx_descriptor *, void *, size_t); + void * (*get_ptr)(struct dma_async_tx_descriptor *, size_t *, size_t *); + int (*set_len)(struct dma_async_tx_descriptor *, size_t); +}; + +struct dma_async_tx_descriptor { + dma_cookie_t cookie; + enum dma_ctrl_flags flags; + dma_addr_t phys; + struct dma_chan *chan; + dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *); + int (*desc_free)(struct dma_async_tx_descriptor *); + dma_async_tx_callback callback; + dma_async_tx_callback_result callback_result; + void *callback_param; + struct dmaengine_unmap_data *unmap; + enum dma_desc_metadata_mode desc_metadata_mode; + struct dma_descriptor_metadata_ops *metadata_ops; +}; + +struct dma_tx_state { + dma_cookie_t last; + dma_cookie_t used; + u32 residue; + u32 in_flight_bytes; +}; + +struct dma_slave_map { + const char *devname; + const char *slave; + void *param; +}; + +struct serial8250_config { + const char *name; + short unsigned int fifo_size; + short unsigned int tx_loadsz; + unsigned char fcr; + unsigned char rxtrig_bytes[4]; + unsigned int flags; +}; + +struct gro_list { + struct list_head list; + int count; +}; + +struct napi_struct { + struct list_head poll_list; + long unsigned int state; + int weight; + int defer_hard_irqs_count; + long unsigned int gro_bitmask; + int (*poll)(struct napi_struct *, int); + struct net_device *dev; + struct gro_list gro_hash[8]; + struct sk_buff *skb; + struct list_head rx_list; + int rx_count; + struct hrtimer timer; + struct list_head dev_list; + struct hlist_node napi_hash_node; + unsigned int napi_id; + struct task_struct *thread; +}; + +struct trace_event_raw_kfree_skb { + struct trace_entry ent; + void *skbaddr; + void *location; + short unsigned int protocol; + enum skb_drop_reason reason; + char __data[0]; +}; + +struct trace_event_raw_consume_skb { + struct trace_entry ent; + void *skbaddr; + char __data[0]; +}; + +struct trace_event_raw_skb_copy_datagram_iovec { + struct trace_entry ent; + const void *skbaddr; + int len; + char __data[0]; +}; + +struct trace_event_data_offsets_kfree_skb {}; + +struct trace_event_data_offsets_consume_skb {}; + +struct trace_event_data_offsets_skb_copy_datagram_iovec {}; + +typedef void (*btf_trace_kfree_skb)(void *, struct sk_buff *, void *, enum skb_drop_reason); + +typedef void (*btf_trace_consume_skb)(void *, struct sk_buff *); + +typedef void (*btf_trace_skb_copy_datagram_iovec)(void *, const struct sk_buff *, int); + +struct trace_event_raw_net_dev_start_xmit { + struct trace_entry ent; + u32 __data_loc_name; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + unsigned int len; + unsigned int data_len; + int network_offset; + bool transport_offset_valid; + int transport_offset; + u8 tx_flags; + u16 gso_size; + u16 gso_segs; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + int rc; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_xmit_timeout { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_driver; + int queue_index; + char __data[0]; +}; + +struct trace_event_raw_net_dev_template { + struct trace_entry ent; + void *skbaddr; + unsigned int len; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_verbose_template { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int napi_id; + u16 queue_mapping; + const void *skbaddr; + bool vlan_tagged; + u16 vlan_proto; + u16 vlan_tci; + u16 protocol; + u8 ip_summed; + u32 hash; + bool l4_hash; + unsigned int len; + unsigned int data_len; + unsigned int truesize; + bool mac_header_valid; + int mac_header; + unsigned char nr_frags; + u16 gso_size; + u16 gso_type; + char __data[0]; +}; + +struct trace_event_raw_net_dev_rx_exit_template { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_net_dev_start_xmit { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_xmit { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_xmit_timeout { + u32 name; + u32 driver; +}; + +struct trace_event_data_offsets_net_dev_template { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_rx_verbose_template { + u32 name; +}; + +struct trace_event_data_offsets_net_dev_rx_exit_template {}; + +typedef void (*btf_trace_net_dev_start_xmit)(void *, const struct sk_buff *, const struct net_device *); + +typedef void (*btf_trace_net_dev_xmit)(void *, struct sk_buff *, int, struct net_device *, unsigned int); + +typedef void (*btf_trace_net_dev_xmit_timeout)(void *, struct net_device *, int); + +typedef void (*btf_trace_net_dev_queue)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb)(void *, struct sk_buff *); + +typedef void (*btf_trace_netif_rx)(void *, struct sk_buff *); + +typedef void (*btf_trace_napi_gro_frags_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_receive_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_receive_skb_list_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_netif_rx_entry)(void *, const struct sk_buff *); + +typedef void (*btf_trace_napi_gro_frags_exit)(void *, int); + +typedef void (*btf_trace_napi_gro_receive_exit)(void *, int); + +typedef void (*btf_trace_netif_receive_skb_exit)(void *, int); + +typedef void (*btf_trace_netif_rx_exit)(void *, int); + +typedef void (*btf_trace_netif_receive_skb_list_exit)(void *, int); + +struct trace_event_raw_napi_poll { + struct trace_entry ent; + struct napi_struct *napi; + u32 __data_loc_dev_name; + int work; + int budget; + char __data[0]; +}; + +struct trace_event_data_offsets_napi_poll { + u32 dev_name; +}; + +typedef void (*btf_trace_napi_poll)(void *, struct napi_struct *, int, int); + +struct trace_event_raw_sock_rcvqueue_full { + struct trace_entry ent; + int rmem_alloc; + unsigned int truesize; + int sk_rcvbuf; + char __data[0]; +}; + +struct trace_event_raw_sock_exceed_buf_limit { + struct trace_entry ent; + char name[32]; + long int sysctl_mem[3]; + long int allocated; + int sysctl_rmem; + int rmem_alloc; + int sysctl_wmem; + int wmem_alloc; + int wmem_queued; + int kind; + char __data[0]; +}; + +struct trace_event_raw_inet_sock_set_state { + struct trace_entry ent; + const void *skaddr; + int oldstate; + int newstate; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_inet_sk_error_report { + struct trace_entry ent; + int error; + __u16 sport; + __u16 dport; + __u16 family; + __u16 protocol; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_sock_rcvqueue_full {}; + +struct trace_event_data_offsets_sock_exceed_buf_limit {}; + +struct trace_event_data_offsets_inet_sock_set_state {}; + +struct trace_event_data_offsets_inet_sk_error_report {}; + +typedef void (*btf_trace_sock_rcvqueue_full)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_sock_exceed_buf_limit)(void *, struct sock *, struct proto *, long int, int); + +typedef void (*btf_trace_inet_sock_set_state)(void *, const struct sock *, const int, const int); + +typedef void (*btf_trace_inet_sk_error_report)(void *, const struct sock *); + +struct trace_event_raw_udp_fail_queue_rcv_skb { + struct trace_entry ent; + int rc; + __u16 lport; + char __data[0]; +}; + +struct trace_event_data_offsets_udp_fail_queue_rcv_skb {}; + +typedef void (*btf_trace_udp_fail_queue_rcv_skb)(void *, int, struct sock *); + +enum { + BTF_FIELDS_MAX = 10, +}; + +enum bpf_tramp_prog_type { + BPF_TRAMP_FENTRY = 0, + BPF_TRAMP_FEXIT = 1, + BPF_TRAMP_MODIFY_RETURN = 2, + BPF_TRAMP_MAX = 3, + BPF_TRAMP_REPLACE = 4, +}; + +struct trace_event_raw_tcp_event_sk_skb { + struct trace_entry ent; + const void *skbaddr; + const void *skaddr; + int state; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_sk { + struct trace_entry ent; + const void *skaddr; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + __u64 sock_cookie; + char __data[0]; +}; + +struct trace_event_raw_tcp_retransmit_synack { + struct trace_entry ent; + const void *skaddr; + const void *req; + __u16 sport; + __u16 dport; + __u16 family; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + char __data[0]; +}; + +struct trace_event_raw_tcp_probe { + struct trace_entry ent; + __u8 saddr[28]; + __u8 daddr[28]; + __u16 sport; + __u16 dport; + __u16 family; + __u32 mark; + __u16 data_len; + __u32 snd_nxt; + __u32 snd_una; + __u32 snd_cwnd; + __u32 ssthresh; + __u32 snd_wnd; + __u32 srtt; + __u32 rcv_wnd; + __u64 sock_cookie; + char __data[0]; +}; + +struct trace_event_raw_tcp_event_skb { + struct trace_entry ent; + const void *skbaddr; + __u8 saddr[28]; + __u8 daddr[28]; + char __data[0]; +}; + +struct trace_event_raw_tcp_cong_state_set { + struct trace_entry ent; + const void *skaddr; + __u16 sport; + __u16 dport; + __u8 saddr[4]; + __u8 daddr[4]; + __u8 saddr_v6[16]; + __u8 daddr_v6[16]; + __u8 cong_state; + char __data[0]; +}; + +struct trace_event_data_offsets_tcp_event_sk_skb {}; + +struct trace_event_data_offsets_tcp_event_sk {}; + +struct trace_event_data_offsets_tcp_retransmit_synack {}; + +struct trace_event_data_offsets_tcp_probe {}; + +struct trace_event_data_offsets_tcp_event_skb {}; + +struct trace_event_data_offsets_tcp_cong_state_set {}; + +typedef void (*btf_trace_tcp_retransmit_skb)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_send_reset)(void *, const struct sock *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_receive_reset)(void *, struct sock *); + +typedef void (*btf_trace_tcp_destroy_sock)(void *, struct sock *); + +typedef void (*btf_trace_tcp_rcv_space_adjust)(void *, struct sock *); + +typedef void (*btf_trace_tcp_retransmit_synack)(void *, const struct sock *, const struct request_sock *); + +typedef void (*btf_trace_tcp_probe)(void *, struct sock *, struct sk_buff *); + +typedef void (*btf_trace_tcp_bad_csum)(void *, const struct sk_buff *); + +typedef void (*btf_trace_tcp_cong_state_set)(void *, struct sock *, const u8); + +struct trace_event_raw_fib_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + u8 proto; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[4]; + __u8 dst[4]; + __u8 gw4[4]; + __u8 gw6[16]; + u16 sport; + u16 dport; + char name[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_fib_table_lookup {}; + +typedef void (*btf_trace_fib_table_lookup)(void *, u32, const struct flowi4 *, const struct fib_nh_common *, int); + +struct trace_event_raw_qdisc_dequeue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + int packets; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + long unsigned int txq_state; + char __data[0]; +}; + +struct trace_event_raw_qdisc_enqueue { + struct trace_entry ent; + struct Qdisc *qdisc; + const struct netdev_queue *txq; + void *skbaddr; + int ifindex; + u32 handle; + u32 parent; + char __data[0]; +}; + +struct trace_event_raw_qdisc_reset { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qdisc_destroy { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + u32 handle; + char __data[0]; +}; + +struct trace_event_raw_qdisc_create { + struct trace_entry ent; + u32 __data_loc_dev; + u32 __data_loc_kind; + u32 parent; + char __data[0]; +}; + +struct trace_event_data_offsets_qdisc_dequeue {}; + +struct trace_event_data_offsets_qdisc_enqueue {}; + +struct trace_event_data_offsets_qdisc_reset { + u32 dev; + u32 kind; +}; + +struct trace_event_data_offsets_qdisc_destroy { + u32 dev; + u32 kind; +}; + +struct trace_event_data_offsets_qdisc_create { + u32 dev; + u32 kind; +}; + +typedef void (*btf_trace_qdisc_dequeue)(void *, struct Qdisc *, const struct netdev_queue *, int, struct sk_buff *); + +typedef void (*btf_trace_qdisc_enqueue)(void *, struct Qdisc *, const struct netdev_queue *, struct sk_buff *); + +typedef void (*btf_trace_qdisc_reset)(void *, struct Qdisc *); + +typedef void (*btf_trace_qdisc_destroy)(void *, struct Qdisc *); + +typedef void (*btf_trace_qdisc_create)(void *, const struct Qdisc_ops *, struct net_device *, u32); + +struct trace_event_raw_page_pool_release { + struct trace_entry ent; + const struct page_pool *pool; + s32 inflight; + u32 hold; + u32 release; + u64 cnt; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_release { + struct trace_entry ent; + const struct page_pool *pool; + const struct page *page; + u32 release; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_state_hold { + struct trace_entry ent; + const struct page_pool *pool; + const struct page *page; + u32 hold; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_page_pool_update_nid { + struct trace_entry ent; + const struct page_pool *pool; + int pool_nid; + int new_nid; + char __data[0]; +}; + +struct trace_event_data_offsets_page_pool_release {}; + +struct trace_event_data_offsets_page_pool_state_release {}; + +struct trace_event_data_offsets_page_pool_state_hold {}; + +struct trace_event_data_offsets_page_pool_update_nid {}; + +typedef void (*btf_trace_page_pool_release)(void *, const struct page_pool *, s32, u32, u32); + +typedef void (*btf_trace_page_pool_state_release)(void *, const struct page_pool *, const struct page *, u32); + +typedef void (*btf_trace_page_pool_state_hold)(void *, const struct page_pool *, const struct page *, u32); + +typedef void (*btf_trace_page_pool_update_nid)(void *, const struct page_pool *, int); + +struct trace_event_raw_neigh_create { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + int entries; + u8 created; + u8 gc_exempt; + u8 primary_key4[4]; + u8 primary_key6[16]; + char __data[0]; +}; + +struct trace_event_raw_neigh_update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + long unsigned int confirmed; + long unsigned int updated; + long unsigned int used; + u8 new_lladdr[32]; + u8 new_state; + u32 update_flags; + u32 pid; + char __data[0]; +}; + +struct trace_event_raw_neigh__update { + struct trace_entry ent; + u32 family; + u32 __data_loc_dev; + u8 lladdr[32]; + u8 lladdr_len; + u8 flags; + u8 nud_state; + u8 type; + u8 dead; + int refcnt; + __u8 primary_key4[4]; + __u8 primary_key6[16]; + long unsigned int confirmed; + long unsigned int updated; + long unsigned int used; + u32 err; + char __data[0]; +}; + +struct trace_event_data_offsets_neigh_create { + u32 dev; +}; + +struct trace_event_data_offsets_neigh_update { + u32 dev; +}; + +struct trace_event_data_offsets_neigh__update { + u32 dev; +}; + +typedef void (*btf_trace_neigh_create)(void *, struct neigh_table *, struct net_device *, const void *, const struct neighbour *, bool); + +typedef void (*btf_trace_neigh_update)(void *, struct neighbour *, const u8 *, u8, u32, u32); + +typedef void (*btf_trace_neigh_update_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_timer_handler)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_event_send_done)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_event_send_dead)(void *, struct neighbour *, int); + +typedef void (*btf_trace_neigh_cleanup_and_release)(void *, struct neighbour *, int); + +typedef bool (*stack_trace_consume_fn)(void *, long unsigned int); + +struct kernel_clone_args { + u64 flags; + int *pidfd; + int *child_tid; + int *parent_tid; + int exit_signal; + long unsigned int stack; + long unsigned int stack_size; + long unsigned int tls; + pid_t *set_tid; + size_t set_tid_size; + int cgroup; + int io_thread; + int kthread; + int idle; + int (*fn)(void *); + void *fn_arg; + struct cgroup *cgrp; + struct css_set *cset; +}; + +struct arch_elf_state { + int flags; +}; + +enum reboot_mode { + REBOOT_UNDEFINED = -1, + REBOOT_COLD = 0, + REBOOT_WARM = 1, + REBOOT_HARD = 2, + REBOOT_SOFT = 3, + REBOOT_GPIO = 4, +}; + +struct wchan_info { + long unsigned int pc; + int count; +}; + +struct dev_printk_info; + +struct bpf_local_storage_data; + +struct bpf_local_storage { + struct bpf_local_storage_data *cache[16]; + struct hlist_head list; + void *owner; + struct callback_head rcu; + raw_spinlock_t lock; +}; + +enum { + BPF_REG_0 = 0, + BPF_REG_1 = 1, + BPF_REG_2 = 2, + BPF_REG_3 = 3, + BPF_REG_4 = 4, + BPF_REG_5 = 5, + BPF_REG_6 = 6, + BPF_REG_7 = 7, + BPF_REG_8 = 8, + BPF_REG_9 = 9, + BPF_REG_10 = 10, + __MAX_BPF_REG = 11, +}; + +enum { + BPF_F_SYSCTL_BASE_NAME = 1, +}; + +struct bpf_cgroup_dev_ctx { + __u32 access_type; + __u32 major; + __u32 minor; +}; + +struct bpf_sysctl { + __u32 write; + __u32 file_pos; +}; + +struct btf_struct_meta { + u32 btf_id; + struct btf_record *record; + struct btf_field_offs *field_offs; +}; + +struct bpf_local_storage_map_bucket; + +struct bpf_local_storage_map { + struct bpf_map map; + struct bpf_local_storage_map_bucket *buckets; + u32 bucket_log; + u16 elem_size; + u16 cache_idx; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_verifier_log { + u32 level; + char kbuf[1024]; + char *ubuf; + u32 len_used; + u32 len_total; +}; + +struct bpf_subprog_info { + u32 start; + u32 linfo_idx; + u16 stack_depth; + bool has_tail_call; + bool tail_call_reachable; + bool has_ld_abs; + bool is_async_cb; +}; + +struct bpf_id_pair { + u32 old; + u32 cur; +}; + +struct bpf_verifier_ops; + +struct bpf_verifier_stack_elem; + +struct bpf_verifier_state; + +struct bpf_verifier_state_list; + +struct bpf_insn_aux_data; + +struct bpf_verifier_env { + u32 insn_idx; + u32 prev_insn_idx; + struct bpf_prog *prog; + const struct bpf_verifier_ops *ops; + struct bpf_verifier_stack_elem *head; + int stack_size; + bool strict_alignment; + bool test_state_freq; + struct bpf_verifier_state *cur_state; + struct bpf_verifier_state_list **explored_states; + struct bpf_verifier_state_list *free_list; + struct bpf_map *used_maps[64]; + struct btf_mod_pair used_btfs[64]; + u32 used_map_cnt; + u32 used_btf_cnt; + u32 id_gen; + bool explore_alu_limits; + bool allow_ptr_leaks; + bool allow_uninit_stack; + bool bpf_capable; + bool bypass_spec_v1; + bool bypass_spec_v4; + bool seen_direct_write; + bool rcu_tag_supported; + struct bpf_insn_aux_data *insn_aux_data; + const struct bpf_line_info *prev_linfo; + struct bpf_verifier_log log; + struct bpf_subprog_info subprog_info[257]; + struct bpf_id_pair idmap_scratch[600]; + struct { + int *insn_state; + int *insn_stack; + int cur_stack; + } cfg; + u32 pass_cnt; + u32 subprog_cnt; + u32 prev_insn_processed; + u32 insn_processed; + u32 prev_jmps_processed; + u32 jmps_processed; + u64 verification_time; + u32 max_states_per_insn; + u32 total_states; + u32 peak_states; + u32 longest_mark_read_walk; + bpfptr_t fd_array; + u32 scratched_regs; + u64 scratched_stack_slots; + u32 prev_log_len; + u32 prev_insn_print_len; + char type_str_buf[128]; +}; + +enum bpf_dynptr_type { + BPF_DYNPTR_TYPE_INVALID = 0, + BPF_DYNPTR_TYPE_LOCAL = 1, + BPF_DYNPTR_TYPE_RINGBUF = 2, +}; + +struct tnum { + u64 value; + u64 mask; +}; + +enum bpf_reg_liveness { + REG_LIVE_NONE = 0, + REG_LIVE_READ32 = 1, + REG_LIVE_READ64 = 2, + REG_LIVE_READ = 3, + REG_LIVE_WRITTEN = 4, + REG_LIVE_DONE = 8, +}; + +struct bpf_reg_state { + enum bpf_reg_type type; + s32 off; + union { + int range; + struct { + struct bpf_map *map_ptr; + u32 map_uid; + }; + struct { + struct btf *btf; + u32 btf_id; + }; + u32 mem_size; + struct { + enum bpf_dynptr_type type; + bool first_slot; + } dynptr; + struct { + long unsigned int raw1; + long unsigned int raw2; + } raw; + u32 subprogno; + }; + u32 id; + u32 ref_obj_id; + struct tnum var_off; + s64 smin_value; + s64 smax_value; + u64 umin_value; + u64 umax_value; + s32 s32_min_value; + s32 s32_max_value; + u32 u32_min_value; + u32 u32_max_value; + struct bpf_reg_state *parent; + u32 frameno; + s32 subreg_def; + enum bpf_reg_liveness live; + bool precise; +}; + +struct bpf_reference_state; + +struct bpf_stack_state; + +struct bpf_func_state { + struct bpf_reg_state regs[11]; + int callsite; + u32 frameno; + u32 subprogno; + u32 async_entry_cnt; + bool in_callback_fn; + struct tnum callback_ret_range; + bool in_async_callback_fn; + int acquired_refs; + struct bpf_reference_state *refs; + int allocated_stack; + struct bpf_stack_state *stack; +}; + +enum bpf_access_type { + BPF_READ = 1, + BPF_WRITE = 2, +}; + +struct bpf_insn_access_aux { + enum bpf_reg_type reg_type; + union { + int ctx_field_size; + struct { + struct btf *btf; + u32 btf_id; + }; + }; + struct bpf_verifier_log *log; +}; + +struct bpf_verifier_ops { + const struct bpf_func_proto * (*get_func_proto)(enum bpf_func_id, const struct bpf_prog *); + bool (*is_valid_access)(int, int, enum bpf_access_type, const struct bpf_prog *, struct bpf_insn_access_aux *); + int (*gen_prologue)(struct bpf_insn *, bool, const struct bpf_prog *); + int (*gen_ld_abs)(const struct bpf_insn *, struct bpf_insn *); + u32 (*convert_ctx_access)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + int (*btf_struct_access)(struct bpf_verifier_log *, const struct bpf_reg_state *, int, int, enum bpf_access_type, u32 *, enum bpf_type_flag *); +}; + +struct bpf_cg_run_ctx { + struct bpf_run_ctx run_ctx; + const struct bpf_prog_array_item *prog_item; + int retval; +}; + +typedef u32 (*bpf_prog_run_fn)(const struct bpf_prog *, const void *); + +struct bpf_sock_addr_kern { + struct sock *sk; + struct sockaddr *uaddr; + u64 tmp_reg; + void *t_ctx; +}; + +struct bpf_sysctl_kern { + struct ctl_table_header *head; + struct ctl_table *table; + void *cur_val; + size_t cur_len; + void *new_val; + size_t new_len; + int new_updated; + int write; + loff_t *ppos; + u64 tmp_reg; +}; + +struct bpf_sockopt_buf { + u8 data[32]; +}; + +struct bpf_sockopt_kern { + struct sock *sk; + u8 *optval; + u8 *optval_end; + s32 level; + s32 optname; + s32 optlen; + struct task_struct *current_task; + u64 tmp_reg; +}; + +struct bpf_cgroup_link { + struct bpf_link link; + struct cgroup *cgroup; + enum bpf_attach_type type; +}; + +struct bpf_prog_list { + struct hlist_node node; + struct bpf_prog *prog; + struct bpf_cgroup_link *link; + struct bpf_cgroup_storage *storage[2]; +}; + +struct bpf_stack_state { + struct bpf_reg_state spilled_ptr; + u8 slot_type[8]; +}; + +struct bpf_reference_state { + int id; + int insn_idx; + int callback_ref; + bool release_on_unlock; +}; + +struct bpf_idx_pair { + u32 prev_idx; + u32 idx; +}; + +struct bpf_verifier_state { + struct bpf_func_state *frame[8]; + struct bpf_verifier_state *parent; + u32 branches; + u32 insn_idx; + u32 curframe; + struct { + void *ptr; + u32 id; + } active_lock; + bool speculative; + bool active_rcu_lock; + u32 first_insn_idx; + u32 last_insn_idx; + struct bpf_idx_pair *jmp_history; + u32 jmp_history_cnt; +}; + +struct bpf_verifier_state_list { + struct bpf_verifier_state state; + struct bpf_verifier_state_list *next; + int miss_cnt; + int hit_cnt; +}; + +struct bpf_loop_inline_state { + unsigned int initialized: 1; + unsigned int fit_for_inline: 1; + u32 callback_subprogno; +}; + +struct bpf_insn_aux_data { + union { + enum bpf_reg_type ptr_type; + long unsigned int map_ptr_state; + s32 call_imm; + u32 alu_limit; + struct { + u32 map_index; + u32 map_off; + }; + struct { + enum bpf_reg_type reg_type; + union { + struct { + struct btf *btf; + u32 btf_id; + }; + u32 mem_size; + }; + } btf_var; + struct bpf_loop_inline_state loop_inline_state; + }; + u64 obj_new_size; + struct btf_struct_meta *kptr_struct_meta; + u64 map_key_state; + int ctx_field_size; + u32 seen; + bool sanitize_stack_spill; + bool zext_dst; + bool storage_get_func_atomic; + u8 alu_state; + unsigned int orig_idx; + bool prune_point; + bool jmp_point; +}; + +struct bpf_local_storage_map_bucket { + struct hlist_head list; + raw_spinlock_t lock; +}; + +struct bpf_local_storage_data { + struct bpf_local_storage_map *smap; + u8 data[0]; +}; + +struct cgroup_lsm_atype { + u32 attach_btf_id; + int refcnt; +}; + +typedef u64 (*btf_bpf_get_local_storage)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_retval)(); + +typedef u64 (*btf_bpf_set_retval)(int); + +typedef u64 (*btf_bpf_sysctl_get_name)(struct bpf_sysctl_kern *, char *, size_t, u64); + +typedef u64 (*btf_bpf_sysctl_get_current_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_get_new_value)(struct bpf_sysctl_kern *, char *, size_t); + +typedef u64 (*btf_bpf_sysctl_set_new_value)(struct bpf_sysctl_kern *, const char *, size_t); + +typedef u64 (*btf_bpf_get_netns_cookie_sockopt)(struct bpf_sockopt_kern *); + +struct sha256_state { + u32 state[8]; + u64 count; + u8 buf[64]; +}; + +typedef mpi_limb_t UWtype; + +typedef unsigned int UHWtype; + +typedef u64 pci_bus_addr_t; + +struct pci_bus_region { + pci_bus_addr_t start; + pci_bus_addr_t end; +}; + +struct pnp_fixup { + char id[7]; + void (*quirk_function)(struct pnp_dev *); +}; + +struct cpu_topology { + int thread_id; + int core_id; + int cluster_id; + int package_id; + cpumask_t thread_sibling; + cpumask_t core_sibling; + cpumask_t cluster_sibling; + cpumask_t llc_sibling; +}; + +enum thermal_device_mode { + THERMAL_DEVICE_DISABLED = 0, + THERMAL_DEVICE_ENABLED = 1, +}; + +enum thermal_trip_type { + THERMAL_TRIP_ACTIVE = 0, + THERMAL_TRIP_PASSIVE = 1, + THERMAL_TRIP_HOT = 2, + THERMAL_TRIP_CRITICAL = 3, +}; + +enum thermal_trend { + THERMAL_TREND_STABLE = 0, + THERMAL_TREND_RAISING = 1, + THERMAL_TREND_DROPPING = 2, +}; + +enum thermal_notify_event { + THERMAL_EVENT_UNSPECIFIED = 0, + THERMAL_EVENT_TEMP_SAMPLE = 1, + THERMAL_TRIP_VIOLATED = 2, + THERMAL_TRIP_CHANGED = 3, + THERMAL_DEVICE_DOWN = 4, + THERMAL_DEVICE_UP = 5, + THERMAL_DEVICE_POWER_CAPABILITY_CHANGED = 6, + THERMAL_TABLE_CHANGED = 7, + THERMAL_EVENT_KEEP_ALIVE = 8, +}; + +struct thermal_zone_device; + +struct thermal_zone_device_ops { + int (*bind)(struct thermal_zone_device *, struct thermal_cooling_device *); + int (*unbind)(struct thermal_zone_device *, struct thermal_cooling_device *); + int (*get_temp)(struct thermal_zone_device *, int *); + int (*set_trips)(struct thermal_zone_device *, int, int); + int (*change_mode)(struct thermal_zone_device *, enum thermal_device_mode); + int (*get_trip_type)(struct thermal_zone_device *, int, enum thermal_trip_type *); + int (*get_trip_temp)(struct thermal_zone_device *, int, int *); + int (*set_trip_temp)(struct thermal_zone_device *, int, int); + int (*get_trip_hyst)(struct thermal_zone_device *, int, int *); + int (*set_trip_hyst)(struct thermal_zone_device *, int, int); + int (*get_crit_temp)(struct thermal_zone_device *, int *); + int (*set_emul_temp)(struct thermal_zone_device *, int); + int (*get_trend)(struct thermal_zone_device *, int, enum thermal_trend *); + void (*hot)(struct thermal_zone_device *); + void (*critical)(struct thermal_zone_device *); +}; + +struct thermal_attr; + +struct thermal_trip; + +struct thermal_zone_params; + +struct thermal_governor; + +struct thermal_zone_device { + int id; + char type[20]; + struct device device; + struct attribute_group trips_attribute_group; + struct thermal_attr *trip_temp_attrs; + struct thermal_attr *trip_type_attrs; + struct thermal_attr *trip_hyst_attrs; + enum thermal_device_mode mode; + void *devdata; + struct thermal_trip *trips; + int num_trips; + long unsigned int trips_disabled; + long unsigned int passive_delay_jiffies; + long unsigned int polling_delay_jiffies; + int temperature; + int last_temperature; + int emul_temperature; + int passive; + int prev_low_trip; + int prev_high_trip; + atomic_t need_update; + struct thermal_zone_device_ops *ops; + struct thermal_zone_params *tzp; + struct thermal_governor *governor; + void *governor_data; + struct list_head thermal_instances; + struct ida ida; + struct mutex lock; + struct list_head node; + struct delayed_work poll_queue; + enum thermal_notify_event notify_event; +}; + +struct thermal_cooling_device_ops; + +struct thermal_cooling_device { + int id; + char *type; + long unsigned int max_state; + struct device device; + struct device_node *np; + void *devdata; + void *stats; + const struct thermal_cooling_device_ops *ops; + bool updated; + struct mutex lock; + struct list_head thermal_instances; + struct list_head node; +}; + +struct thermal_trip { + int temperature; + int hysteresis; + enum thermal_trip_type type; +}; + +struct thermal_cooling_device_ops { + int (*get_max_state)(struct thermal_cooling_device *, long unsigned int *); + int (*get_cur_state)(struct thermal_cooling_device *, long unsigned int *); + int (*set_cur_state)(struct thermal_cooling_device *, long unsigned int); + int (*get_requested_power)(struct thermal_cooling_device *, u32 *); + int (*state2power)(struct thermal_cooling_device *, long unsigned int, u32 *); + int (*power2state)(struct thermal_cooling_device *, u32, long unsigned int *); +}; + +struct thermal_attr { + struct device_attribute attr; + char name[20]; +}; + +struct thermal_bind_params; + +struct thermal_zone_params { + char governor_name[20]; + bool no_hwmon; + int num_tbps; + struct thermal_bind_params *tbp; + u32 sustainable_power; + s32 k_po; + s32 k_pu; + s32 k_i; + s32 k_d; + s32 integral_cutoff; + int slope; + int offset; +}; + +struct thermal_governor { + char name[20]; + int (*bind_to_tz)(struct thermal_zone_device *); + void (*unbind_from_tz)(struct thermal_zone_device *); + int (*throttle)(struct thermal_zone_device *, int); + struct list_head governor_list; +}; + +struct thermal_bind_params { + struct thermal_cooling_device *cdev; + int weight; + int trip_mask; + long unsigned int *binding_limits; + int (*match)(struct thermal_zone_device *, struct thermal_cooling_device *); +}; + +struct thermal_instance { + int id; + char name[20]; + struct thermal_zone_device *tz; + struct thermal_cooling_device *cdev; + int trip; + bool initialized; + long unsigned int upper; + long unsigned int lower; + long unsigned int target; + char attr_name[20]; + struct device_attribute attr; + char weight_attr_name[20]; + struct device_attribute weight_attr; + struct list_head tz_node; + struct list_head cdev_node; + unsigned int weight; +}; + +struct csum_state { + __wsum csum; + size_t off; +}; + +struct ahash_request; + +struct ip_tunnel_key { + __be64 tun_id; + union { + struct { + __be32 src; + __be32 dst; + } ipv4; + struct { + struct in6_addr src; + struct in6_addr dst; + } ipv6; + } u; + __be16 tun_flags; + u8 tos; + u8 ttl; + __be32 label; + __be16 tp_src; + __be16 tp_dst; + __u8 flow_flags; +}; + +struct ip_tunnel_info { + struct ip_tunnel_key key; + struct dst_cache dst_cache; + u8 options_len; + u8 mode; +}; + +struct ip6_tnl_parm { + char name[16]; + int link; + __u8 proto; + __u8 encap_limit; + __u8 hop_limit; + __be32 flowinfo; + __u32 flags; + struct in6_addr laddr; + struct in6_addr raddr; +}; + +struct __ip6_tnl_parm { + char name[16]; + int link; + __u8 proto; + __u8 encap_limit; + __u8 hop_limit; + bool collect_md; + __be32 flowinfo; + __u32 flags; + struct in6_addr laddr; + struct in6_addr raddr; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; + __u32 fwmark; + __u32 index; + __u8 erspan_ver; + __u8 dir; + __u16 hwid; +}; + +struct ip6_tnl { + struct ip6_tnl *next; + struct net_device *dev; + netdevice_tracker dev_tracker; + struct net *net; + struct __ip6_tnl_parm parms; + struct flowi fl; + struct dst_cache dst_cache; + struct gro_cells gro_cells; + int err_count; + long unsigned int err_time; + __u32 i_seqno; + atomic_t o_seqno; + int hlen; + int tun_hlen; + int encap_hlen; + struct ip_tunnel_encap encap; + int mlink; +}; + +struct ip6_tnl_encap_ops { + size_t (*encap_hlen)(struct ip_tunnel_encap *); + int (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi6 *); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); +}; + +struct ipv6_tlv_tnl_enc_lim { + __u8 type; + __u8 length; + __u8 encap_limit; +}; + +typedef u64 sci_t; + +enum metadata_type { + METADATA_IP_TUNNEL = 0, + METADATA_HW_PORT_MUX = 1, + METADATA_MACSEC = 2, + METADATA_XFRM = 3, +}; + +struct hw_port_info { + struct net_device *lower_dev; + u32 port_id; +}; + +struct macsec_info { + sci_t sci; +}; + +struct xfrm_md_info { + u32 if_id; + int link; + struct dst_entry *dst_orig; +}; + +struct metadata_dst { + struct dst_entry dst; + enum metadata_type type; + union { + struct ip_tunnel_info tun_info; + struct hw_port_info port_info; + struct macsec_info macsec_info; + struct xfrm_md_info xfrm_info; + } u; +}; + +struct ip6_tnl_net { + struct net_device *fb_tnl_dev; + struct ip6_tnl *tnls_r_l[32]; + struct ip6_tnl *tnls_wc[1]; + struct ip6_tnl **tnls[2]; + struct ip6_tnl *collect_md_tun; +}; + +struct ipv6_tel_txoption { + struct ipv6_txoptions ops; + __u8 dst_opt[8]; +}; + +struct user_key_payload { + struct callback_head rcu; + short unsigned int datalen; + long: 48; + char data[0]; +}; + +enum { + dns_key_data = 0, + dns_key_error = 1, +}; + +struct user_sve_header { + __u32 size; + __u32 max_size; + __u16 vl; + __u16 max_vl; + __u16 flags; + __u16 __reserved; +}; + +struct user_pac_mask { + __u64 data_mask; + __u64 insn_mask; +}; + +struct user_za_header { + __u32 size; + __u32 max_size; + __u16 vl; + __u16 max_vl; + __u16 flags; + __u16 __reserved; +}; + +struct seccomp_data { + int nr; + __u32 arch; + __u64 instruction_pointer; + __u64 args[6]; +}; + +enum perf_type_id { + PERF_TYPE_HARDWARE = 0, + PERF_TYPE_SOFTWARE = 1, + PERF_TYPE_TRACEPOINT = 2, + PERF_TYPE_HW_CACHE = 3, + PERF_TYPE_RAW = 4, + PERF_TYPE_BREAKPOINT = 5, + PERF_TYPE_MAX = 6, +}; + +enum { + HW_BREAKPOINT_LEN_1 = 1, + HW_BREAKPOINT_LEN_2 = 2, + HW_BREAKPOINT_LEN_3 = 3, + HW_BREAKPOINT_LEN_4 = 4, + HW_BREAKPOINT_LEN_5 = 5, + HW_BREAKPOINT_LEN_6 = 6, + HW_BREAKPOINT_LEN_7 = 7, + HW_BREAKPOINT_LEN_8 = 8, +}; + +enum { + HW_BREAKPOINT_EMPTY = 0, + HW_BREAKPOINT_R = 1, + HW_BREAKPOINT_W = 2, + HW_BREAKPOINT_RW = 3, + HW_BREAKPOINT_X = 4, + HW_BREAKPOINT_INVALID = 7, +}; + +enum bp_type_idx { + TYPE_INST = 0, + TYPE_DATA = 1, + TYPE_MAX = 2, +}; + +struct membuf { + void *p; + size_t left; +}; + +struct user_regset; + +typedef int user_regset_active_fn(struct task_struct *, const struct user_regset *); + +typedef int user_regset_get2_fn(struct task_struct *, const struct user_regset *, struct membuf); + +typedef int user_regset_set_fn(struct task_struct *, const struct user_regset *, unsigned int, unsigned int, const void *, const void *); + +typedef int user_regset_writeback_fn(struct task_struct *, const struct user_regset *, int); + +struct user_regset { + user_regset_get2_fn *regset_get; + user_regset_set_fn *set; + user_regset_active_fn *active; + user_regset_writeback_fn *writeback; + unsigned int n; + unsigned int size; + unsigned int align; + unsigned int bias; + unsigned int core_note_type; +}; + +struct user_regset_view { + const char *name; + const struct user_regset *regsets; + unsigned int n; + u32 e_flags; + u16 e_machine; + u8 ei_osabi; +}; + +struct trace_event_raw_sys_enter { + struct trace_entry ent; + long int id; + long unsigned int args[6]; + char __data[0]; +}; + +struct trace_event_raw_sys_exit { + struct trace_entry ent; + long int id; + long int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_sys_enter {}; + +struct trace_event_data_offsets_sys_exit {}; + +typedef void (*btf_trace_sys_enter)(void *, struct pt_regs *, long int); + +typedef void (*btf_trace_sys_exit)(void *, struct pt_regs *, long int); + +struct pt_regs_offset { + const char *name; + int offset; +}; + +enum aarch64_regset { + REGSET_GPR = 0, + REGSET_FPR = 1, + REGSET_TLS = 2, + REGSET_HW_BREAK = 3, + REGSET_HW_WATCH = 4, + REGSET_SYSTEM_CALL = 5, + REGSET_SVE = 6, + REGSET_SSVE = 7, + REGSET_ZA = 8, + REGSET_PAC_MASK = 9, + REGSET_PAC_ENABLED_KEYS = 10, + REGSET_TAGGED_ADDR_CTRL = 11, +}; + +enum ptrace_syscall_dir { + PTRACE_SYSCALL_ENTER = 0, + PTRACE_SYSCALL_EXIT = 1, +}; + +enum ring_buffer_flags { + RB_FL_OVERWRITE = 1, +}; + +typedef struct vfsmount * (*debugfs_automount_t)(struct dentry *, void *); + +enum die_val { + DIE_UNUSED = 0, + DIE_OOPS = 1, +}; + +struct trace_export { + struct trace_export *next; + void (*write)(struct trace_export *, const void *, unsigned int); + int flags; +}; + +enum trace_iter_flags { + TRACE_FILE_LAT_FMT = 1, + TRACE_FILE_ANNOTATE = 2, + TRACE_FILE_TIME_IN_NS = 4, +}; + +enum event_trigger_type { + ETT_NONE = 0, + ETT_TRACE_ONOFF = 1, + ETT_SNAPSHOT = 2, + ETT_STACKTRACE = 4, + ETT_EVENT_ENABLE = 8, + ETT_EVENT_HIST = 16, + ETT_HIST_ENABLE = 32, + ETT_EVENT_EPROBE = 64, +}; + +enum trace_type { + __TRACE_FIRST_TYPE = 0, + TRACE_FN = 1, + TRACE_CTX = 2, + TRACE_WAKE = 3, + TRACE_STACK = 4, + TRACE_PRINT = 5, + TRACE_BPRINT = 6, + TRACE_MMIO_RW = 7, + TRACE_MMIO_MAP = 8, + TRACE_BRANCH = 9, + TRACE_GRAPH_RET = 10, + TRACE_GRAPH_ENT = 11, + TRACE_USER_STACK = 12, + TRACE_BLK = 13, + TRACE_BPUTS = 14, + TRACE_HWLAT = 15, + TRACE_OSNOISE = 16, + TRACE_TIMERLAT = 17, + TRACE_RAW_DATA = 18, + TRACE_FUNC_REPEATS = 19, + __TRACE_LAST_TYPE = 20, +}; + +struct ftrace_entry { + struct trace_entry ent; + long unsigned int ip; + long unsigned int parent_ip; +}; + +struct stack_entry { + struct trace_entry ent; + int size; + long unsigned int caller[8]; +}; + +struct bprint_entry { + struct trace_entry ent; + long unsigned int ip; + const char *fmt; + u32 buf[0]; +}; + +struct print_entry { + struct trace_entry ent; + long unsigned int ip; + char buf[0]; +}; + +struct raw_data_entry { + struct trace_entry ent; + unsigned int id; + char buf[0]; +}; + +struct bputs_entry { + struct trace_entry ent; + long unsigned int ip; + const char *str; +}; + +struct func_repeats_entry { + struct trace_entry ent; + long unsigned int ip; + long unsigned int parent_ip; + u16 count; + u16 top_delta_ts; + u32 bottom_delta_ts; +}; + +typedef bool (*cond_update_fn_t)(struct trace_array *, void *); + +struct trace_min_max_param { + struct mutex *lock; + u64 *val; + u64 *min; + u64 *max; +}; + +struct saved_cmdlines_buffer { + unsigned int map_pid_to_cmdline[32769]; + unsigned int *map_cmdline_to_pid; + unsigned int cmdline_num; + int cmdline_idx; + char *saved_cmdlines; +}; + +struct ftrace_stack { + long unsigned int calls[1024]; +}; + +struct ftrace_stacks { + struct ftrace_stack stacks[4]; +}; + +struct trace_buffer_struct { + int nesting; + char buffer[4096]; +}; + +struct ftrace_buffer_info { + struct trace_iterator iter; + void *spare; + unsigned int spare_cpu; + unsigned int read; +}; + +struct err_info { + const char **errs; + u8 type; + u16 pos; + u64 ts; +}; + +struct tracing_log_err { + struct list_head list; + struct err_info info; + char loc[128]; + char *cmd; +}; + +struct buffer_ref { + struct trace_buffer *buffer; + void *page; + int cpu; + refcount_t refcount; +}; + +struct ima_kexec_hdr { + u16 version; + u16 _reserved0; + u32 _reserved1; + u64 buffer_size; + u64 count; +}; + +enum header_fields { + HDR_PCR = 0, + HDR_DIGEST = 1, + HDR_TEMPLATE_NAME = 2, + HDR_TEMPLATE_DATA = 3, + HDR__LAST = 4, +}; + +enum blk_default_limits { + BLK_MAX_SEGMENTS = 128, + BLK_SAFE_MAX_SECTORS = 255, + BLK_DEF_MAX_SECTORS = 2560, + BLK_MAX_SEGMENT_SIZE = 65536, + BLK_SEG_BOUNDARY_MASK = 4294967295, +}; + +enum { + WBT_RWQ_BG = 0, + WBT_RWQ_KSWAPD = 1, + WBT_RWQ_DISCARD = 2, + WBT_NUM_RWQ = 3, +}; + +typedef enum { + ZSTD_error_no_error = 0, + ZSTD_error_GENERIC = 1, + ZSTD_error_prefix_unknown = 10, + ZSTD_error_version_unsupported = 12, + ZSTD_error_frameParameter_unsupported = 14, + ZSTD_error_frameParameter_windowTooLarge = 16, + ZSTD_error_corruption_detected = 20, + ZSTD_error_checksum_wrong = 22, + ZSTD_error_dictionary_corrupted = 30, + ZSTD_error_dictionary_wrong = 32, + ZSTD_error_dictionaryCreation_failed = 34, + ZSTD_error_parameter_unsupported = 40, + ZSTD_error_parameter_outOfBound = 42, + ZSTD_error_tableLog_tooLarge = 44, + ZSTD_error_maxSymbolValue_tooLarge = 46, + ZSTD_error_maxSymbolValue_tooSmall = 48, + ZSTD_error_stage_wrong = 60, + ZSTD_error_init_missing = 62, + ZSTD_error_memory_allocation = 64, + ZSTD_error_workSpace_tooSmall = 66, + ZSTD_error_dstSize_tooSmall = 70, + ZSTD_error_srcSize_wrong = 72, + ZSTD_error_dstBuffer_null = 74, + ZSTD_error_frameIndex_tooLarge = 100, + ZSTD_error_seekableIO = 102, + ZSTD_error_dstBuffer_wrong = 104, + ZSTD_error_srcBuffer_wrong = 105, + ZSTD_error_maxCode = 120, +} ZSTD_ErrorCode; + +typedef ZSTD_ErrorCode ERR_enum; + +struct platform_driver { + int (*probe)(struct platform_device *); + int (*remove)(struct platform_device *); + void (*shutdown)(struct platform_device *); + int (*suspend)(struct platform_device *, pm_message_t); + int (*resume)(struct platform_device *); + struct device_driver driver; + const struct platform_device_id *id_table; + bool prevent_deferred_probe; + bool driver_managed_dma; +}; + +struct of_dev_auxdata { + char *compatible; + resource_size_t phys_addr; + char *name; + void *platform_data; +}; + +struct hotplug_slot_ops; + +struct hotplug_slot { + const struct hotplug_slot_ops *ops; + struct list_head slot_list; + struct pci_slot *pci_slot; + struct module *owner; + const char *mod_name; +}; + +struct hotplug_slot_ops { + int (*enable_slot)(struct hotplug_slot *); + int (*disable_slot)(struct hotplug_slot *); + int (*set_attention_status)(struct hotplug_slot *, u8); + int (*hardware_test)(struct hotplug_slot *, u32); + int (*get_power_status)(struct hotplug_slot *, u8 *); + int (*get_attention_status)(struct hotplug_slot *, u8 *); + int (*get_latch_status)(struct hotplug_slot *, u8 *); + int (*get_adapter_status)(struct hotplug_slot *, u8 *); + int (*reset_slot)(struct hotplug_slot *, bool); +}; + +enum pm_qos_flags_status { + PM_QOS_FLAGS_UNDEFINED = -1, + PM_QOS_FLAGS_NONE = 0, + PM_QOS_FLAGS_SOME = 1, + PM_QOS_FLAGS_ALL = 2, +}; + +struct hpx_type0 { + u32 revision; + u8 cache_line_size; + u8 latency_timer; + u8 enable_serr; + u8 enable_perr; +}; + +struct hpx_type1 { + u32 revision; + u8 max_mem_read; + u8 avg_max_split; + u16 tot_max_split; +}; + +struct hpx_type2 { + u32 revision; + u32 unc_err_mask_and; + u32 unc_err_mask_or; + u32 unc_err_sever_and; + u32 unc_err_sever_or; + u32 cor_err_mask_and; + u32 cor_err_mask_or; + u32 adv_err_cap_and; + u32 adv_err_cap_or; + u16 pci_exp_devctl_and; + u16 pci_exp_devctl_or; + u16 pci_exp_lnkctl_and; + u16 pci_exp_lnkctl_or; + u32 sec_unc_err_sever_and; + u32 sec_unc_err_sever_or; + u32 sec_unc_err_mask_and; + u32 sec_unc_err_mask_or; +}; + +struct hpx_type3 { + u16 device_type; + u16 function_type; + u16 config_space_location; + u16 pci_exp_cap_id; + u16 pci_exp_cap_ver; + u16 pci_exp_vendor_id; + u16 dvsec_id; + u16 dvsec_rev; + u16 match_offset; + u32 match_mask_and; + u32 match_value; + u16 reg_offset; + u32 reg_mask_and; + u32 reg_mask_or; +}; + +enum hpx_type3_dev_type { + HPX_TYPE_ENDPOINT = 1, + HPX_TYPE_LEG_END = 2, + HPX_TYPE_RC_END = 4, + HPX_TYPE_RC_EC = 8, + HPX_TYPE_ROOT_PORT = 16, + HPX_TYPE_UPSTREAM = 32, + HPX_TYPE_DOWNSTREAM = 64, + HPX_TYPE_PCI_BRIDGE = 128, + HPX_TYPE_PCIE_BRIDGE = 256, +}; + +enum hpx_type3_fn_type { + HPX_FN_NORMAL = 1, + HPX_FN_SRIOV_PHYS = 2, + HPX_FN_SRIOV_VIRT = 4, +}; + +enum hpx_type3_cfg_loc { + HPX_CFG_PCICFG = 0, + HPX_CFG_PCIE_CAP = 1, + HPX_CFG_PCIE_CAP_EXT = 2, + HPX_CFG_VEND_CAP = 3, + HPX_CFG_DVSEC = 4, + HPX_CFG_MAX = 5, +}; + +struct soc_device_attribute { + const char *machine; + const char *family; + const char *revision; + const char *serial_number; + const char *soc_id; + const void *data; + const struct attribute_group *custom_attr_group; +}; + +struct soc_device { + struct device dev; + struct soc_device_attribute *attr; + int soc_dev_num; +}; + +struct alias_prop { + struct list_head link; + const char *alias; + struct device_node *np; + int id; + char stem[0]; +}; + +enum ip_defrag_users { + IP_DEFRAG_LOCAL_DELIVER = 0, + IP_DEFRAG_CALL_RA_CHAIN = 1, + IP_DEFRAG_CONNTRACK_IN = 2, + __IP_DEFRAG_CONNTRACK_IN_END = 65537, + IP_DEFRAG_CONNTRACK_OUT = 65538, + __IP_DEFRAG_CONNTRACK_OUT_END = 131073, + IP_DEFRAG_CONNTRACK_BRIDGE_IN = 131074, + __IP_DEFRAG_CONNTRACK_BRIDGE_IN = 196609, + IP_DEFRAG_VS_IN = 196610, + IP_DEFRAG_VS_OUT = 196611, + IP_DEFRAG_VS_FWD = 196612, + IP_DEFRAG_AF_PACKET = 196613, + IP_DEFRAG_MACVLAN = 196614, +}; + +enum l2tp_debug_flags { + L2TP_MSG_DEBUG = 1, + L2TP_MSG_CONTROL = 2, + L2TP_MSG_SEQ = 4, + L2TP_MSG_DATA = 8, +}; + +struct seg6_pernet_data { + struct mutex lock; + struct in6_addr *tun_src; +}; + +struct ioam6_pernet_data { + struct mutex lock; + struct rhashtable namespaces; + struct rhashtable schemas; +}; + +struct rt0_hdr { + struct ipv6_rt_hdr rt_hdr; + __u32 reserved; + struct in6_addr addr[0]; +}; + +struct ipv6_destopt_hao { + __u8 type; + __u8 length; + struct in6_addr addr; +} __attribute__((packed)); + +struct raw_hashinfo { + spinlock_t lock; + struct hlist_nulls_head ht[256]; +}; + +struct ipv6_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u8 first_segment; + __u8 flags; + __u16 tag; + struct in6_addr segments[0]; +}; + +struct ipv6_rpl_sr_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + __u32 cmpre: 4; + __u32 cmpri: 4; + __u32 reserved: 4; + __u32 pad: 4; + __u32 reserved1: 16; + union { + struct in6_addr addr[0]; + __u8 data[0]; + } segments; +}; + +struct ioam6_hdr { + __u8 opt_type; + __u8 opt_len; + char: 8; + __u8 type; +}; + +struct ioam6_trace_hdr { + __be16 namespace_id; + char: 2; + __u8 overflow: 1; + __u8 nodelen: 5; + __u8 remlen: 7; + union { + __be32 type_be32; + struct { + __u32 bit7: 1; + __u32 bit6: 1; + __u32 bit5: 1; + __u32 bit4: 1; + __u32 bit3: 1; + __u32 bit2: 1; + __u32 bit1: 1; + __u32 bit0: 1; + __u32 bit15: 1; + __u32 bit14: 1; + __u32 bit13: 1; + __u32 bit12: 1; + __u32 bit11: 1; + __u32 bit10: 1; + __u32 bit9: 1; + __u32 bit8: 1; + __u32 bit23: 1; + __u32 bit22: 1; + __u32 bit21: 1; + __u32 bit20: 1; + __u32 bit19: 1; + __u32 bit18: 1; + __u32 bit17: 1; + __u32 bit16: 1; + } type; + }; + __u8 data[0]; +}; + +struct ioam6_schema; + +struct ioam6_namespace { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_schema *schema; + __be16 id; + __be32 data; + __be64 data_wide; +}; + +struct ioam6_schema { + struct rhash_head head; + struct callback_head rcu; + struct ioam6_namespace *ns; + u32 id; + int len; + __be32 hdr; + u8 data[0]; +}; + +struct rt2_hdr { + struct ipv6_rt_hdr rt_hdr; + __u32 reserved; + struct in6_addr addr; +}; + +struct ip6_mh { + __u8 ip6mh_proto; + __u8 ip6mh_hdrlen; + __u8 ip6mh_type; + __u8 ip6mh_reserved; + __u16 ip6mh_cksum; + __u8 data[0]; +}; + +struct mip6_report_rate_limiter { + spinlock_t lock; + ktime_t stamp; + int iif; + struct in6_addr src; + struct in6_addr dst; +}; + +struct rc { + long int (*fill)(void *, long unsigned int); + uint8_t *ptr; + uint8_t *buffer; + uint8_t *buffer_end; + long int buffer_size; + uint32_t code; + uint32_t range; + uint32_t bound; + void (*error)(char *); +}; + +struct lzma_header { + uint8_t pos; + uint32_t dict_size; + uint64_t dst_size; +} __attribute__((packed)); + +struct writer { + uint8_t *buffer; + uint8_t previous_byte; + size_t buffer_pos; + int bufsize; + size_t global_pos; + long int (*flush)(void *, long unsigned int); + struct lzma_header *header; +}; + +struct cstate { + int state; + uint32_t rep0; + uint32_t rep1; + uint32_t rep2; + uint32_t rep3; +}; + +typedef struct { + u32 red_mask; + u32 green_mask; + u32 blue_mask; + u32 reserved_mask; +} efi_pixel_bitmask_t; + +typedef struct { + u32 version; + u32 horizontal_resolution; + u32 vertical_resolution; + int pixel_format; + efi_pixel_bitmask_t pixel_information; + u32 pixels_per_scan_line; +} efi_graphics_output_mode_info_t; + +union efi_graphics_output_protocol_mode { + struct { + u32 max_mode; + u32 mode; + efi_graphics_output_mode_info_t *info; + long unsigned int size_of_info; + efi_physical_addr_t frame_buffer_base; + long unsigned int frame_buffer_size; + }; + struct { + u32 max_mode; + u32 mode; + u32 info; + u32 size_of_info; + u64 frame_buffer_base; + u32 frame_buffer_size; + } mixed_mode; +}; + +typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t; + +union efi_graphics_output_protocol; + +typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t; + +union efi_graphics_output_protocol { + struct { + efi_status_t (*query_mode)(efi_graphics_output_protocol_t *, u32, long unsigned int *, efi_graphics_output_mode_info_t **); + efi_status_t (*set_mode)(efi_graphics_output_protocol_t *, u32); + void *blt; + efi_graphics_output_protocol_mode_t *mode; + }; + struct { + u32 query_mode; + u32 set_mode; + u32 blt; + u32 mode; + } mixed_mode; +}; + +enum efi_cmdline_option { + EFI_CMDLINE_NONE = 0, + EFI_CMDLINE_MODE_NUM = 1, + EFI_CMDLINE_RES = 2, + EFI_CMDLINE_AUTO = 3, + EFI_CMDLINE_LIST = 4, +}; + +struct mpidr_hash { + u64 mask; + u32 shift_aff[4]; + u32 bits; +}; + +struct cpu_operations { + const char *name; + int (*cpu_init)(unsigned int); + int (*cpu_prepare)(unsigned int); + int (*cpu_boot)(unsigned int); + void (*cpu_postboot)(); + bool (*cpu_can_disable)(unsigned int); + int (*cpu_disable)(unsigned int); + void (*cpu_die)(unsigned int); + int (*cpu_kill)(unsigned int); +}; + +struct bpf_mem_caches; + +struct bpf_mem_cache; + +struct bpf_mem_alloc { + struct bpf_mem_caches *caches; + struct bpf_mem_cache *cache; + struct work_struct work; +}; + +struct bpf_mem_cache { + struct llist_head free_llist; + local_t active; + struct llist_head free_llist_extra; + struct irq_work refill_work; + struct obj_cgroup *objcg; + int unit_size; + int free_cnt; + int low_watermark; + int high_watermark; + int batch; + int percpu_size; + struct callback_head rcu; + struct llist_head free_by_rcu; + struct llist_head waiting_for_gp; + atomic_t call_rcu_in_progress; +}; + +struct bpf_mem_caches { + struct bpf_mem_cache cache[11]; +}; + +struct file_clone_range { + __s64 src_fd; + __u64 src_offset; + __u64 src_length; + __u64 dest_offset; +}; + +struct file_dedupe_range_info { + __s64 dest_fd; + __u64 dest_offset; + __u64 bytes_deduped; + __s32 status; + __u32 reserved; +}; + +struct file_dedupe_range { + __u64 src_offset; + __u64 src_length; + __u16 dest_count; + __u16 reserved1; + __u32 reserved2; + struct file_dedupe_range_info info[0]; +}; + +struct fsxattr { + __u32 fsx_xflags; + __u32 fsx_extsize; + __u32 fsx_nextents; + __u32 fsx_projid; + __u32 fsx_cowextsize; + unsigned char fsx_pad[8]; +}; + +struct fileattr { + u32 flags; + u32 fsx_xflags; + u32 fsx_extsize; + u32 fsx_nextents; + u32 fsx_projid; + u32 fsx_cowextsize; + bool flags_valid: 1; + bool fsx_valid: 1; +}; + +struct space_resv { + __s16 l_type; + __s16 l_whence; + __s64 l_start; + __s64 l_len; + __s32 l_sysid; + __u32 l_pid; + __s32 l_pad[4]; +}; + +struct fiemap { + __u64 fm_start; + __u64 fm_length; + __u32 fm_flags; + __u32 fm_mapped_extents; + __u32 fm_extent_count; + __u32 fm_reserved; + struct fiemap_extent fm_extents[0]; +}; + +struct fsnotify_group; + +struct fsnotify_iter_info; + +struct fsnotify_mark; + +struct fsnotify_event; + +struct fsnotify_ops { + int (*handle_event)(struct fsnotify_group *, u32, const void *, int, struct inode *, const struct qstr *, u32, struct fsnotify_iter_info *); + int (*handle_inode_event)(struct fsnotify_mark *, u32, struct inode *, struct inode *, const struct qstr *, u32); + void (*free_group_priv)(struct fsnotify_group *); + void (*freeing_mark)(struct fsnotify_mark *, struct fsnotify_group *); + void (*free_event)(struct fsnotify_group *, struct fsnotify_event *); + void (*free_mark)(struct fsnotify_mark *); +}; + +struct inotify_group_private_data { + spinlock_t idr_lock; + struct idr idr; + struct ucounts *ucounts; +}; + +struct fsnotify_group { + const struct fsnotify_ops *ops; + refcount_t refcnt; + spinlock_t notification_lock; + struct list_head notification_list; + wait_queue_head_t notification_waitq; + unsigned int q_len; + unsigned int max_events; + unsigned int priority; + bool shutdown; + int flags; + unsigned int owner_flags; + struct mutex mark_mutex; + atomic_t user_waits; + struct list_head marks_list; + struct fasync_struct *fsn_fa; + struct fsnotify_event *overflow_event; + struct mem_cgroup *memcg; + union { + void *private; + struct inotify_group_private_data inotify_data; + }; +}; + +struct fsnotify_iter_info { + struct fsnotify_mark *marks[5]; + struct fsnotify_group *current_group; + unsigned int report_mask; + int srcu_idx; +}; + +struct fsnotify_mark { + __u32 mask; + refcount_t refcnt; + struct fsnotify_group *group; + struct list_head g_list; + spinlock_t lock; + struct hlist_node obj_list; + struct fsnotify_mark_connector *connector; + __u32 ignore_mask; + unsigned int flags; +}; + +struct fsnotify_event { + struct list_head list; +}; + +struct inotify_event_info { + struct fsnotify_event fse; + u32 mask; + int wd; + u32 sync_cookie; + int name_len; + char name[0]; +}; + +struct inotify_inode_mark { + struct fsnotify_mark fsn_mark; + int wd; +}; + +struct file_handle { + __u32 handle_bytes; + int handle_type; + unsigned char f_handle[0]; +}; + +struct mount; + +struct mnt_namespace { + struct ns_common ns; + struct mount *root; + struct list_head list; + spinlock_t ns_lock; + struct user_namespace *user_ns; + struct ucounts *ucounts; + u64 seq; + wait_queue_head_t poll; + u64 event; + unsigned int mounts; + unsigned int pending_mounts; +}; + +struct fs_pin { + wait_queue_head_t wait; + int done; + struct hlist_node s_list; + struct hlist_node m_list; + void (*kill)(struct fs_pin *); +}; + +enum fsnotify_data_type { + FSNOTIFY_EVENT_NONE = 0, + FSNOTIFY_EVENT_PATH = 1, + FSNOTIFY_EVENT_INODE = 2, + FSNOTIFY_EVENT_DENTRY = 3, + FSNOTIFY_EVENT_ERROR = 4, +}; + +struct mnt_pcp; + +struct mountpoint; + +struct mount { + struct hlist_node mnt_hash; + struct mount *mnt_parent; + struct dentry *mnt_mountpoint; + struct vfsmount mnt; + union { + struct callback_head mnt_rcu; + struct llist_node mnt_llist; + }; + struct mnt_pcp *mnt_pcp; + struct list_head mnt_mounts; + struct list_head mnt_child; + struct list_head mnt_instance; + const char *mnt_devname; + struct list_head mnt_list; + struct list_head mnt_expire; + struct list_head mnt_share; + struct list_head mnt_slave_list; + struct list_head mnt_slave; + struct mount *mnt_master; + struct mnt_namespace *mnt_ns; + struct mountpoint *mnt_mp; + union { + struct hlist_node mnt_mp_list; + struct hlist_node mnt_umount; + }; + struct list_head mnt_umounting; + struct fsnotify_mark_connector *mnt_fsnotify_marks; + __u32 mnt_fsnotify_mask; + int mnt_id; + int mnt_group_id; + int mnt_expiry_mark; + struct hlist_head mnt_pins; + struct hlist_head mnt_stuck_children; +}; + +struct mnt_pcp { + int mnt_count; + int mnt_writers; +}; + +struct mountpoint { + struct hlist_node m_hash; + struct dentry *m_dentry; + struct hlist_head m_list; + int m_count; +}; + +struct iomap_page_ops; + +struct iomap { + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + struct block_device *bdev; + struct dax_device *dax_dev; + void *inline_data; + void *private; + const struct iomap_page_ops *page_ops; +}; + +struct iomap_page_ops { + int (*page_prepare)(struct inode *, loff_t, unsigned int); + void (*page_done)(struct inode *, loff_t, unsigned int, struct page *); +}; + +struct iomap_ops { + int (*iomap_begin)(struct inode *, loff_t, loff_t, unsigned int, struct iomap *, struct iomap *); + int (*iomap_end)(struct inode *, loff_t, loff_t, ssize_t, unsigned int, struct iomap *); +}; + +struct iomap_iter { + struct inode *inode; + loff_t pos; + u64 len; + s64 processed; + unsigned int flags; + struct iomap iomap; + struct iomap srcmap; + void *private; +}; + +struct iomap_dio_ops { + int (*end_io)(struct kiocb *, ssize_t, int, unsigned int); + void (*submit_io)(const struct iomap_iter *, struct bio *, loff_t); + struct bio_set *bio_set; +}; + +enum { + EXT4_MF_MNTDIR_SAMPLED = 0, + EXT4_MF_FS_ABORTED = 1, + EXT4_MF_FC_INELIGIBLE = 2, +}; + +struct fname; + +struct dir_private_info { + struct rb_root root; + struct rb_node *curr_node; + struct fname *extra_fname; + loff_t last_pos; + __u32 curr_hash; + __u32 curr_minor_hash; + __u32 next_hash; +}; + +struct keyring_search_context { + struct keyring_index_key index_key; + const struct cred *cred; + struct key_match_data match_data; + unsigned int flags; + int (*iterator)(const void *, void *); + int skipped_ret; + bool possessed; + key_ref_t result; + time64_t now; +}; + +struct hrtimer_sleeper { + struct hrtimer timer; + struct task_struct *task; +}; + +enum { + IOPRIO_CLASS_NONE = 0, + IOPRIO_CLASS_RT = 1, + IOPRIO_CLASS_BE = 2, + IOPRIO_CLASS_IDLE = 3, +}; + +struct softirq_action { + void (*action)(struct softirq_action *); +}; + +typedef bool busy_tag_iter_fn(struct request *, void *); + +enum { + BLK_MQ_F_SHOULD_MERGE = 1, + BLK_MQ_F_TAG_QUEUE_SHARED = 2, + BLK_MQ_F_STACKING = 4, + BLK_MQ_F_TAG_HCTX_SHARED = 8, + BLK_MQ_F_BLOCKING = 32, + BLK_MQ_F_NO_SCHED = 64, + BLK_MQ_F_NO_SCHED_BY_DEFAULT = 128, + BLK_MQ_F_ALLOC_POLICY_START_BIT = 8, + BLK_MQ_F_ALLOC_POLICY_BITS = 1, + BLK_MQ_S_STOPPED = 0, + BLK_MQ_S_TAG_ACTIVE = 1, + BLK_MQ_S_SCHED_RESTART = 2, + BLK_MQ_S_INACTIVE = 3, + BLK_MQ_MAX_DEPTH = 10240, + BLK_MQ_CPU_WORK_BATCH = 8, +}; + +enum { + BLK_MQ_REQ_NOWAIT = 1, + BLK_MQ_REQ_RESERVED = 2, + BLK_MQ_REQ_PM = 4, +}; + +enum { + BLK_MQ_UNIQUE_TAG_BITS = 16, + BLK_MQ_UNIQUE_TAG_MASK = 65535, +}; + +enum { + BLK_MQ_NO_TAG = 4294967295, + BLK_MQ_TAG_MIN = 1, + BLK_MQ_TAG_MAX = 4294967294, +}; + +struct mq_inflight { + struct block_device *part; + unsigned int inflight[2]; +}; + +struct blk_rq_wait { + struct completion done; + blk_status_t ret; +}; + +struct blk_expired_data { + bool has_timedout_rq; + long unsigned int next; + long unsigned int timeout_start; +}; + +struct flush_busy_ctx_data { + struct blk_mq_hw_ctx *hctx; + struct list_head *list; +}; + +struct dispatch_rq_data { + struct blk_mq_hw_ctx *hctx; + struct request *rq; +}; + +enum prep_dispatch { + PREP_DISPATCH_OK = 0, + PREP_DISPATCH_NO_TAG = 1, + PREP_DISPATCH_NO_BUDGET = 2, +}; + +struct rq_iter_data { + struct blk_mq_hw_ctx *hctx; + bool has_rq; +}; + +struct blk_mq_qe_pair { + struct list_head node; + struct request_queue *q; + struct elevator_type *type; +}; + +typedef struct { + u32 version; + u32 num_entries; + u32 desc_size; + u32 reserved; + efi_memory_desc_t entry[0]; +} efi_memory_attributes_table_t; + +typedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *); + +typedef struct sk_buff * (*gro_receive_t)(struct list_head *, struct sk_buff *); + +struct nf_sockopt_ops { + struct list_head list; + u_int8_t pf; + int set_optmin; + int set_optmax; + int (*set)(struct sock *, int, sockptr_t, unsigned int); + int get_optmin; + int get_optmax; + int (*get)(struct sock *, int, void *, int *); + struct module *owner; +}; + +struct xt_get_revision { + char name[29]; + __u8 revision; +}; + +struct ipt_ip { + struct in_addr src; + struct in_addr dst; + struct in_addr smsk; + struct in_addr dmsk; + char iniface[16]; + char outiface[16]; + unsigned char iniface_mask[16]; + unsigned char outiface_mask[16]; + __u16 proto; + __u8 flags; + __u8 invflags; +}; + +struct ipt_entry { + struct ipt_ip ip; + unsigned int nfcache; + __u16 target_offset; + __u16 next_offset; + unsigned int comefrom; + struct xt_counters counters; + unsigned char elems[0]; +}; + +struct ipt_icmp { + __u8 type; + __u8 code[2]; + __u8 invflags; +}; + +struct ipt_getinfo { + char name[32]; + unsigned int valid_hooks; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_entries; + unsigned int size; +}; + +struct ipt_replace { + char name[32]; + unsigned int valid_hooks; + unsigned int num_entries; + unsigned int size; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_counters; + struct xt_counters *counters; + struct ipt_entry entries[0]; +}; + +struct ipt_get_entries { + char name[32]; + unsigned int size; + struct ipt_entry entrytable[0]; +}; + +struct ipt_standard { + struct ipt_entry entry; + struct xt_standard_target target; +}; + +struct ipt_error { + struct ipt_entry entry; + struct xt_error_target target; +}; + +struct sr6_tlv { + __u8 type; + __u8 len; + __u8 data[0]; +}; + +struct genl_multicast_group { + char name[16]; + u8 flags; +}; + +struct genl_split_ops; + +struct genl_ops; + +struct genl_small_ops; + +struct genl_family { + unsigned int hdrsize; + char name[16]; + unsigned int version; + unsigned int maxattr; + u8 netnsok: 1; + u8 parallel_ops: 1; + u8 n_ops; + u8 n_small_ops; + u8 n_split_ops; + u8 n_mcgrps; + u8 resv_start_op; + const struct nla_policy *policy; + int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + const struct genl_ops *ops; + const struct genl_small_ops *small_ops; + const struct genl_split_ops *split_ops; + const struct genl_multicast_group *mcgrps; + struct module *module; + int id; + unsigned int mcgrp_offset; +}; + +struct genl_split_ops { + union { + struct { + int (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + int (*doit)(struct sk_buff *, struct genl_info *); + void (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *); + }; + struct { + int (*start)(struct netlink_callback *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + }; + }; + const struct nla_policy *policy; + unsigned int maxattr; + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genl_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*start)(struct netlink_callback *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + const struct nla_policy *policy; + unsigned int maxattr; + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +struct genl_small_ops { + int (*doit)(struct sk_buff *, struct genl_info *); + int (*dumpit)(struct sk_buff *, struct netlink_callback *); + u8 cmd; + u8 internal_flags; + u8 flags; + u8 validate; +}; + +enum genl_validate_flags { + GENL_DONT_VALIDATE_STRICT = 1, + GENL_DONT_VALIDATE_DUMP = 2, + GENL_DONT_VALIDATE_DUMP_STRICT = 4, +}; + +enum { + SEG6_ATTR_UNSPEC = 0, + SEG6_ATTR_DST = 1, + SEG6_ATTR_DSTLEN = 2, + SEG6_ATTR_HMACKEYID = 3, + SEG6_ATTR_SECRET = 4, + SEG6_ATTR_SECRETLEN = 5, + SEG6_ATTR_ALGID = 6, + SEG6_ATTR_HMACINFO = 7, + __SEG6_ATTR_MAX = 8, +}; + +enum { + SEG6_CMD_UNSPEC = 0, + SEG6_CMD_SETHMAC = 1, + SEG6_CMD_DUMPHMAC = 2, + SEG6_CMD_SET_TUNSRC = 3, + SEG6_CMD_GET_TUNSRC = 4, + __SEG6_CMD_MAX = 5, +}; + +struct mpls_nh { + struct net_device *nh_dev; + unsigned int nh_flags; + u8 nh_labels; + u8 nh_via_alen; + u8 nh_via_table; + u8 nh_reserved1; + u32 nh_label[0]; +}; + +struct mpls_route { + struct callback_head rt_rcu; + u8 rt_protocol; + u8 rt_payload_type; + u8 rt_max_alen; + u8 rt_ttl_propagate; + u8 rt_nhn; + u8 rt_nhn_alive; + u8 rt_nh_size; + u8 rt_via_offset; + u8 rt_reserved1; + struct mpls_nh rt_nh[0]; +}; + +struct mpls_pcpu_stats; + +struct mpls_dev { + int input_enabled; + struct net_device *dev; + struct mpls_pcpu_stats *stats; + struct ctl_table_header *sysctl; + struct callback_head rcu; +}; + +struct packet_type { + __be16 type; + bool ignore_outgoing; + struct net_device *dev; + netdevice_tracker dev_tracker; + int (*func)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); + void (*list_func)(struct list_head *, struct packet_type *, struct net_device *); + bool (*id_match)(struct packet_type *, struct sock *); + struct net *af_packet_net; + void *af_packet_priv; + struct list_head list; +}; + +struct rtmsg { + unsigned char rtm_family; + unsigned char rtm_dst_len; + unsigned char rtm_src_len; + unsigned char rtm_tos; + unsigned char rtm_table; + unsigned char rtm_protocol; + unsigned char rtm_scope; + unsigned char rtm_type; + unsigned int rtm_flags; +}; + +enum rt_class_t { + RT_TABLE_UNSPEC = 0, + RT_TABLE_COMPAT = 252, + RT_TABLE_DEFAULT = 253, + RT_TABLE_MAIN = 254, + RT_TABLE_LOCAL = 255, + RT_TABLE_MAX = 4294967295, +}; + +enum rtattr_type_t { + RTA_UNSPEC = 0, + RTA_DST = 1, + RTA_SRC = 2, + RTA_IIF = 3, + RTA_OIF = 4, + RTA_GATEWAY = 5, + RTA_PRIORITY = 6, + RTA_PREFSRC = 7, + RTA_METRICS = 8, + RTA_MULTIPATH = 9, + RTA_PROTOINFO = 10, + RTA_FLOW = 11, + RTA_CACHEINFO = 12, + RTA_SESSION = 13, + RTA_MP_ALGO = 14, + RTA_TABLE = 15, + RTA_MARK = 16, + RTA_MFC_STATS = 17, + RTA_VIA = 18, + RTA_NEWDST = 19, + RTA_PREF = 20, + RTA_ENCAP_TYPE = 21, + RTA_ENCAP = 22, + RTA_EXPIRES = 23, + RTA_PAD = 24, + RTA_UID = 25, + RTA_TTL_PROPAGATE = 26, + RTA_IP_PROTO = 27, + RTA_SPORT = 28, + RTA_DPORT = 29, + RTA_NH_ID = 30, + __RTA_MAX = 31, +}; + +struct rtnexthop { + short unsigned int rtnh_len; + unsigned char rtnh_flags; + unsigned char rtnh_hops; + int rtnh_ifindex; +}; + +struct rtvia { + __kernel_sa_family_t rtvia_family; + __u8 rtvia_addr[0]; +}; + +struct rtnl_af_ops { + struct list_head list; + int family; + int (*fill_link_af)(struct sk_buff *, const struct net_device *, u32); + size_t (*get_link_af_size)(const struct net_device *, u32); + int (*validate_link_af)(const struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*set_link_af)(struct net_device *, const struct nlattr *, struct netlink_ext_ack *); + int (*fill_stats_af)(struct sk_buff *, const struct net_device *); + size_t (*get_stats_af_size)(const struct net_device *); +}; + +enum { + MPLS_STATS_UNSPEC = 0, + MPLS_STATS_LINK = 1, + __MPLS_STATS_MAX = 2, +}; + +struct mpls_link_stats { + __u64 rx_packets; + __u64 tx_packets; + __u64 rx_bytes; + __u64 tx_bytes; + __u64 rx_errors; + __u64 tx_errors; + __u64 rx_dropped; + __u64 tx_dropped; + __u64 rx_noroute; +}; + +struct netconfmsg { + __u8 ncm_family; +}; + +enum { + NETCONFA_UNSPEC = 0, + NETCONFA_IFINDEX = 1, + NETCONFA_FORWARDING = 2, + NETCONFA_RP_FILTER = 3, + NETCONFA_MC_FORWARDING = 4, + NETCONFA_PROXY_NEIGH = 5, + NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN = 6, + NETCONFA_INPUT = 7, + NETCONFA_BC_FORWARDING = 8, + __NETCONFA_MAX = 9, +}; + +struct fib_dump_filter { + u32 table_id; + bool filter_set; + bool dump_routes; + bool dump_exceptions; + unsigned char protocol; + unsigned char rt_type; + unsigned int flags; + struct net_device *dev; +}; + +struct mpls_shim_hdr { + __be32 label_stack_entry; +}; + +struct mpls_entry_decoded { + u32 label; + u8 ttl; + u8 tc; + u8 bos; +}; + +struct mpls_pcpu_stats { + struct mpls_link_stats stats; + struct u64_stats_sync syncp; +}; + +enum mpls_payload_type { + MPT_UNSPEC = 0, + MPT_IPV4 = 4, + MPT_IPV6 = 6, +}; + +enum mpls_ttl_propagation { + MPLS_TTL_PROP_DEFAULT = 0, + MPLS_TTL_PROP_ENABLED = 1, + MPLS_TTL_PROP_DISABLED = 2, +}; + +struct mpls_route_config { + u32 rc_protocol; + u32 rc_ifindex; + u8 rc_via_table; + u8 rc_via_alen; + u8 rc_via[32]; + u32 rc_label; + u8 rc_ttl_propagate; + u8 rc_output_labels; + u32 rc_output_label[30]; + u32 rc_nlflags; + enum mpls_payload_type rc_payload_type; + struct nl_info rc_nlinfo; + struct rtnexthop *rc_mp; + int rc_mp_len; +}; + +typedef enum { + EfiPciIoWidthUint8 = 0, + EfiPciIoWidthUint16 = 1, + EfiPciIoWidthUint32 = 2, + EfiPciIoWidthUint64 = 3, + EfiPciIoWidthFifoUint8 = 4, + EfiPciIoWidthFifoUint16 = 5, + EfiPciIoWidthFifoUint32 = 6, + EfiPciIoWidthFifoUint64 = 7, + EfiPciIoWidthFillUint8 = 8, + EfiPciIoWidthFillUint16 = 9, + EfiPciIoWidthFillUint32 = 10, + EfiPciIoWidthFillUint64 = 11, + EfiPciIoWidthMaximum = 12, +} EFI_PCI_IO_PROTOCOL_WIDTH; + +typedef struct { + u32 read; + u32 write; +} efi_pci_io_protocol_access_32_t; + +typedef struct { + void *read; + void *write; +} efi_pci_io_protocol_access_t; + +union efi_pci_io_protocol; + +typedef union efi_pci_io_protocol efi_pci_io_protocol_t; + +typedef efi_status_t (*efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *, EFI_PCI_IO_PROTOCOL_WIDTH, u32, long unsigned int, void *); + +typedef struct { + efi_pci_io_protocol_cfg_t read; + efi_pci_io_protocol_cfg_t write; +} efi_pci_io_protocol_config_access_t; + +union efi_pci_io_protocol { + struct { + void *poll_mem; + void *poll_io; + efi_pci_io_protocol_access_t mem; + efi_pci_io_protocol_access_t io; + efi_pci_io_protocol_config_access_t pci; + void *copy_mem; + void *map; + void *unmap; + void *allocate_buffer; + void *free_buffer; + void *flush; + efi_status_t (*get_location)(efi_pci_io_protocol_t *, long unsigned int *, long unsigned int *, long unsigned int *, long unsigned int *); + void *attributes; + void *get_bar_attributes; + void *set_bar_attributes; + uint64_t romsize; + void *romimage; + }; + struct { + u32 poll_mem; + u32 poll_io; + efi_pci_io_protocol_access_32_t mem; + efi_pci_io_protocol_access_32_t io; + efi_pci_io_protocol_access_32_t pci; + u32 copy_mem; + u32 map; + u32 unmap; + u32 allocate_buffer; + u32 free_buffer; + u32 flush; + u32 get_location; + u32 attributes; + u32 get_bar_attributes; + u32 set_bar_attributes; + u64 romsize; + u32 romimage; + } mixed_mode; +}; + +struct sigcontext { + __u64 fault_address; + __u64 regs[31]; + __u64 sp; + __u64 pc; + __u64 pstate; + long: 64; + __u8 __reserved[4096]; +}; + +struct _aarch64_ctx { + __u32 magic; + __u32 size; +}; + +struct fpsimd_context { + struct _aarch64_ctx head; + __u32 fpsr; + __u32 fpcr; + __int128 unsigned vregs[32]; +}; + +struct esr_context { + struct _aarch64_ctx head; + __u64 esr; +}; + +struct extra_context { + struct _aarch64_ctx head; + __u64 datap; + __u32 size; + __u32 __reserved[3]; +}; + +struct sve_context { + struct _aarch64_ctx head; + __u16 vl; + __u16 flags; + __u16 __reserved[2]; +}; + +struct za_context { + struct _aarch64_ctx head; + __u16 vl; + __u16 __reserved[3]; +}; + +struct sigaltstack { + void *ss_sp; + int ss_flags; + __kernel_size_t ss_size; +}; + +typedef struct sigaltstack stack_t; + +struct siginfo { + union { + struct { + int si_signo; + int si_errno; + int si_code; + union __sifields _sifields; + }; + int _si_pad[32]; + }; +}; + +typedef struct siginfo siginfo_t; + +struct ksignal { + struct k_sigaction ka; + kernel_siginfo_t info; + int sig; +}; + +struct ucontext { + long unsigned int uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + sigset_t uc_sigmask; + __u8 __unused[120]; + long: 64; + struct sigcontext uc_mcontext; +}; + +struct rt_sigframe { + struct siginfo info; + struct ucontext uc; +}; + +struct frame_record { + u64 fp; + u64 lr; +}; + +struct rt_sigframe_user_layout { + struct rt_sigframe *sigframe; + struct frame_record *next_frame; + long unsigned int size; + long unsigned int limit; + long unsigned int fpsimd_offset; + long unsigned int esr_offset; + long unsigned int sve_offset; + long unsigned int za_offset; + long unsigned int extra_offset; + long unsigned int end_offset; +}; + +struct user_ctxs { + struct fpsimd_context *fpsimd; + struct sve_context *sve; + struct za_context *za; +}; + +struct kstatfs { + long int f_type; + long int f_bsize; + u64 f_blocks; + u64 f_bfree; + u64 f_bavail; + u64 f_files; + u64 f_ffree; + __kernel_fsid_t f_fsid; + long int f_namelen; + long int f_frsize; + long int f_flags; + long int f_spare[4]; +}; + +typedef __u16 comp_t; + +typedef __u32 comp2_t; + +struct acct { + char ac_flag; + char ac_version; + __u16 ac_uid16; + __u16 ac_gid16; + __u16 ac_tty; + __u32 ac_btime; + comp_t ac_utime; + comp_t ac_stime; + comp_t ac_etime; + comp_t ac_mem; + comp_t ac_io; + comp_t ac_rw; + comp_t ac_minflt; + comp_t ac_majflt; + comp_t ac_swaps; + __u16 ac_ahz; + __u32 ac_exitcode; + char ac_comm[17]; + __u8 ac_etime_hi; + __u16 ac_etime_lo; + __u32 ac_uid; + __u32 ac_gid; +}; + +typedef struct acct acct_t; + +struct bsd_acct_struct { + struct fs_pin pin; + atomic_long_t count; + struct callback_head rcu; + struct mutex lock; + int active; + long unsigned int needcheck; + struct file *file; + struct pid_namespace *ns; + struct work_struct work; + struct completion done; +}; + +struct bpf_queue_stack { + struct bpf_map map; + raw_spinlock_t lock; + u32 head; + u32 tail; + u32 size; + int: 32; + char elements[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct pagevec { + unsigned char nr; + bool percpu_pvec_drained; + struct page *pages[15]; +}; + +struct folio_batch { + unsigned char nr; + bool percpu_pvec_drained; + struct folio *folios[15]; +}; + +typedef struct kobject *kobj_probe_t(dev_t, int *, void *); + +struct kobj_map; + +struct char_device_struct { + struct char_device_struct *next; + unsigned int major; + unsigned int baseminor; + int minorct; + char name[64]; + struct cdev *cdev; +}; + +typedef int wait_bit_action_f(struct wait_bit_key *, int); + +enum wb_state { + WB_registered = 0, + WB_writeback_running = 1, + WB_has_dirty_io = 2, + WB_start_all = 3, +}; + +struct wb_writeback_work { + long int nr_pages; + struct super_block *sb; + enum writeback_sync_modes sync_mode; + unsigned int tagged_writepages: 1; + unsigned int for_kupdate: 1; + unsigned int range_cyclic: 1; + unsigned int for_background: 1; + unsigned int for_sync: 1; + unsigned int auto_free: 1; + enum wb_reason reason; + struct list_head list; + struct wb_completion *done; +}; + +struct trace_event_raw_writeback_folio_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int index; + char __data[0]; +}; + +struct trace_event_raw_writeback_dirty_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_inode_foreign_history { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t cgroup_ino; + unsigned int history; + char __data[0]; +}; + +struct trace_event_raw_inode_switch_wbs { + struct trace_entry ent; + char name[32]; + ino_t ino; + ino_t old_cgroup_ino; + ino_t new_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_track_foreign_dirty { + struct trace_entry ent; + char name[32]; + u64 bdi_id; + ino_t ino; + unsigned int memcg_id; + ino_t cgroup_ino; + ino_t page_cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_flush_foreign { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + unsigned int frn_bdi_id; + unsigned int frn_memcg_id; + char __data[0]; +}; + +struct trace_event_raw_writeback_write_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + int sync_mode; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_work_class { + struct trace_entry ent; + char name[32]; + long int nr_pages; + dev_t sb_dev; + int sync_mode; + int for_kupdate; + int range_cyclic; + int for_background; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_pages_written { + struct trace_entry ent; + long int pages; + char __data[0]; +}; + +struct trace_event_raw_writeback_class { + struct trace_entry ent; + char name[32]; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_bdi_register { + struct trace_entry ent; + char name[32]; + char __data[0]; +}; + +struct trace_event_raw_wbc_class { + struct trace_entry ent; + char name[32]; + long int nr_to_write; + long int pages_skipped; + int sync_mode; + int for_kupdate; + int for_background; + int for_reclaim; + int range_cyclic; + long int range_start; + long int range_end; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_queue_io { + struct trace_entry ent; + char name[32]; + long unsigned int older; + long int age; + int moved; + int reason; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_global_dirty_state { + struct trace_entry ent; + long unsigned int nr_dirty; + long unsigned int nr_writeback; + long unsigned int background_thresh; + long unsigned int dirty_thresh; + long unsigned int dirty_limit; + long unsigned int nr_dirtied; + long unsigned int nr_written; + char __data[0]; +}; + +struct trace_event_raw_bdi_dirty_ratelimit { + struct trace_entry ent; + char bdi[32]; + long unsigned int write_bw; + long unsigned int avg_write_bw; + long unsigned int dirty_rate; + long unsigned int dirty_ratelimit; + long unsigned int task_ratelimit; + long unsigned int balanced_dirty_ratelimit; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_balance_dirty_pages { + struct trace_entry ent; + char bdi[32]; + long unsigned int limit; + long unsigned int setpoint; + long unsigned int dirty; + long unsigned int bdi_setpoint; + long unsigned int bdi_dirty; + long unsigned int dirty_ratelimit; + long unsigned int task_ratelimit; + unsigned int dirtied; + unsigned int dirtied_pause; + long unsigned int paused; + long int pause; + long unsigned int period; + long int think; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_sb_inodes_requeue { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int dirtied_when; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_single_inode_template { + struct trace_entry ent; + char name[32]; + ino_t ino; + long unsigned int state; + long unsigned int dirtied_when; + long unsigned int writeback_index; + long int nr_to_write; + long unsigned int wrote; + ino_t cgroup_ino; + char __data[0]; +}; + +struct trace_event_raw_writeback_inode_template { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int state; + __u16 mode; + long unsigned int dirtied_when; + char __data[0]; +}; + +struct trace_event_data_offsets_writeback_folio_template {}; + +struct trace_event_data_offsets_writeback_dirty_inode_template {}; + +struct trace_event_data_offsets_inode_foreign_history {}; + +struct trace_event_data_offsets_inode_switch_wbs {}; + +struct trace_event_data_offsets_track_foreign_dirty {}; + +struct trace_event_data_offsets_flush_foreign {}; + +struct trace_event_data_offsets_writeback_write_inode_template {}; + +struct trace_event_data_offsets_writeback_work_class {}; + +struct trace_event_data_offsets_writeback_pages_written {}; + +struct trace_event_data_offsets_writeback_class {}; + +struct trace_event_data_offsets_writeback_bdi_register {}; + +struct trace_event_data_offsets_wbc_class {}; + +struct trace_event_data_offsets_writeback_queue_io {}; + +struct trace_event_data_offsets_global_dirty_state {}; + +struct trace_event_data_offsets_bdi_dirty_ratelimit {}; + +struct trace_event_data_offsets_balance_dirty_pages {}; + +struct trace_event_data_offsets_writeback_sb_inodes_requeue {}; + +struct trace_event_data_offsets_writeback_single_inode_template {}; + +struct trace_event_data_offsets_writeback_inode_template {}; + +typedef void (*btf_trace_writeback_dirty_folio)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_folio_wait_writeback)(void *, struct folio *, struct address_space *); + +typedef void (*btf_trace_writeback_mark_inode_dirty)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_dirty_inode_start)(void *, struct inode *, int); + +typedef void (*btf_trace_writeback_dirty_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_inode_foreign_history)(void *, struct inode *, struct writeback_control *, unsigned int); + +typedef void (*btf_trace_inode_switch_wbs)(void *, struct inode *, struct bdi_writeback *, struct bdi_writeback *); + +typedef void (*btf_trace_track_foreign_dirty)(void *, struct folio *, struct bdi_writeback *); + +typedef void (*btf_trace_flush_foreign)(void *, struct bdi_writeback *, unsigned int, unsigned int); + +typedef void (*btf_trace_writeback_write_inode_start)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_write_inode)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_writeback_queue)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_exec)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_start)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_written)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_wait)(void *, struct bdi_writeback *, struct wb_writeback_work *); + +typedef void (*btf_trace_writeback_pages_written)(void *, long int); + +typedef void (*btf_trace_writeback_wake_background)(void *, struct bdi_writeback *); + +typedef void (*btf_trace_writeback_bdi_register)(void *, struct backing_dev_info *); + +typedef void (*btf_trace_wbc_writepage)(void *, struct writeback_control *, struct backing_dev_info *); + +typedef void (*btf_trace_writeback_queue_io)(void *, struct bdi_writeback *, struct wb_writeback_work *, long unsigned int, int); + +typedef void (*btf_trace_global_dirty_state)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_bdi_dirty_ratelimit)(void *, struct bdi_writeback *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_balance_dirty_pages)(void *, struct bdi_writeback *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long int, long unsigned int); + +typedef void (*btf_trace_writeback_sb_inodes_requeue)(void *, struct inode *); + +typedef void (*btf_trace_writeback_single_inode_start)(void *, struct inode *, struct writeback_control *, long unsigned int); + +typedef void (*btf_trace_writeback_single_inode)(void *, struct inode *, struct writeback_control *, long unsigned int); + +typedef void (*btf_trace_writeback_lazytime)(void *, struct inode *); + +typedef void (*btf_trace_writeback_lazytime_iput)(void *, struct inode *); + +typedef void (*btf_trace_writeback_dirty_inode_enqueue)(void *, struct inode *); + +typedef void (*btf_trace_sb_mark_inode_writeback)(void *, struct inode *); + +typedef void (*btf_trace_sb_clear_inode_writeback)(void *, struct inode *); + +struct inode_switch_wbs_context { + struct rcu_work work; + struct bdi_writeback *new_wb; + struct inode *inodes[0]; +}; + +typedef u64 phys_cpuid_t; + +struct acpi_processor_cx { + u8 valid; + u8 type; + u32 address; + u8 entry_method; + u8 index; + u32 latency; + u8 bm_sts_skip; + char desc[32]; +}; + +struct acpi_lpi_state { + u32 min_residency; + u32 wake_latency; + u32 flags; + u32 arch_flags; + u32 res_cnt_freq; + u32 enable_parent_state; + u64 address; + u8 index; + u8 entry_method; + char desc[32]; +}; + +struct acpi_processor_power { + int count; + union { + struct acpi_processor_cx states[8]; + struct acpi_lpi_state lpi_states[8]; + }; + int timer_broadcast_on_state; +}; + +struct acpi_psd_package { + u64 num_entries; + u64 revision; + u64 domain; + u64 coord_type; + u64 num_processors; +}; + +struct acpi_pct_register { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 reserved; + u64 address; +} __attribute__((packed)); + +struct acpi_processor_px { + u64 core_frequency; + u64 power; + u64 transition_latency; + u64 bus_master_latency; + u64 control; + u64 status; +}; + +struct acpi_processor_performance { + unsigned int state; + unsigned int platform_limit; + struct acpi_pct_register control_register; + struct acpi_pct_register status_register; + short: 16; + unsigned int state_count; + int: 32; + struct acpi_processor_px *states; + struct acpi_psd_package domain_info; + cpumask_var_t shared_cpu_map; + unsigned int shared_type; + int: 32; +} __attribute__((packed)); + +struct acpi_tsd_package { + u64 num_entries; + u64 revision; + u64 domain; + u64 coord_type; + u64 num_processors; +}; + +struct acpi_processor_tx_tss { + u64 freqpercentage; + u64 power; + u64 transition_latency; + u64 control; + u64 status; +}; + +struct acpi_processor_tx { + u16 power; + u16 performance; +}; + +struct acpi_processor; + +struct acpi_processor_throttling { + unsigned int state; + unsigned int platform_limit; + struct acpi_pct_register control_register; + struct acpi_pct_register status_register; + short: 16; + unsigned int state_count; + int: 32; + struct acpi_processor_tx_tss *states_tss; + struct acpi_tsd_package domain_info; + cpumask_var_t shared_cpu_map; + int (*acpi_processor_get_throttling)(struct acpi_processor *); + int (*acpi_processor_set_throttling)(struct acpi_processor *, int, bool); + u32 address; + u8 duty_offset; + u8 duty_width; + u8 tsd_valid_flag; + char: 8; + unsigned int shared_type; + struct acpi_processor_tx states[16]; + int: 32; +} __attribute__((packed)); + +struct acpi_processor_flags { + u8 power: 1; + u8 performance: 1; + u8 throttling: 1; + u8 limit: 1; + u8 bm_control: 1; + u8 bm_check: 1; + u8 has_cst: 1; + u8 has_lpi: 1; + u8 power_setup_done: 1; + u8 bm_rld_set: 1; + u8 need_hotplug_init: 1; +}; + +struct acpi_processor_lx { + int px; + int tx; +}; + +struct acpi_processor_limit { + struct acpi_processor_lx state; + struct acpi_processor_lx thermal; + struct acpi_processor_lx user; +}; + +struct acpi_processor { + acpi_handle handle; + u32 acpi_id; + phys_cpuid_t phys_id; + u32 id; + u32 pblk; + int performance_platform_limit; + int throttling_platform_limit; + struct acpi_processor_flags flags; + struct acpi_processor_power power; + struct acpi_processor_performance *performance; + struct acpi_processor_throttling throttling; + struct acpi_processor_limit limit; + struct thermal_cooling_device *cdev; + struct device *dev; + struct freq_qos_request perflib_req; + struct freq_qos_request thermal_req; +}; + +enum hwmon_sensor_types { + hwmon_chip = 0, + hwmon_temp = 1, + hwmon_in = 2, + hwmon_curr = 3, + hwmon_power = 4, + hwmon_energy = 5, + hwmon_humidity = 6, + hwmon_fan = 7, + hwmon_pwm = 8, + hwmon_intrusion = 9, + hwmon_max = 10, +}; + +enum hwmon_chip_attributes { + hwmon_chip_temp_reset_history = 0, + hwmon_chip_in_reset_history = 1, + hwmon_chip_curr_reset_history = 2, + hwmon_chip_power_reset_history = 3, + hwmon_chip_register_tz = 4, + hwmon_chip_update_interval = 5, + hwmon_chip_alarms = 6, + hwmon_chip_samples = 7, + hwmon_chip_curr_samples = 8, + hwmon_chip_in_samples = 9, + hwmon_chip_power_samples = 10, + hwmon_chip_temp_samples = 11, +}; + +enum hwmon_temp_attributes { + hwmon_temp_enable = 0, + hwmon_temp_input = 1, + hwmon_temp_type = 2, + hwmon_temp_lcrit = 3, + hwmon_temp_lcrit_hyst = 4, + hwmon_temp_min = 5, + hwmon_temp_min_hyst = 6, + hwmon_temp_max = 7, + hwmon_temp_max_hyst = 8, + hwmon_temp_crit = 9, + hwmon_temp_crit_hyst = 10, + hwmon_temp_emergency = 11, + hwmon_temp_emergency_hyst = 12, + hwmon_temp_alarm = 13, + hwmon_temp_lcrit_alarm = 14, + hwmon_temp_min_alarm = 15, + hwmon_temp_max_alarm = 16, + hwmon_temp_crit_alarm = 17, + hwmon_temp_emergency_alarm = 18, + hwmon_temp_fault = 19, + hwmon_temp_offset = 20, + hwmon_temp_label = 21, + hwmon_temp_lowest = 22, + hwmon_temp_highest = 23, + hwmon_temp_reset_history = 24, + hwmon_temp_rated_min = 25, + hwmon_temp_rated_max = 26, +}; + +enum hwmon_in_attributes { + hwmon_in_enable = 0, + hwmon_in_input = 1, + hwmon_in_min = 2, + hwmon_in_max = 3, + hwmon_in_lcrit = 4, + hwmon_in_crit = 5, + hwmon_in_average = 6, + hwmon_in_lowest = 7, + hwmon_in_highest = 8, + hwmon_in_reset_history = 9, + hwmon_in_label = 10, + hwmon_in_alarm = 11, + hwmon_in_min_alarm = 12, + hwmon_in_max_alarm = 13, + hwmon_in_lcrit_alarm = 14, + hwmon_in_crit_alarm = 15, + hwmon_in_rated_min = 16, + hwmon_in_rated_max = 17, +}; + +enum hwmon_curr_attributes { + hwmon_curr_enable = 0, + hwmon_curr_input = 1, + hwmon_curr_min = 2, + hwmon_curr_max = 3, + hwmon_curr_lcrit = 4, + hwmon_curr_crit = 5, + hwmon_curr_average = 6, + hwmon_curr_lowest = 7, + hwmon_curr_highest = 8, + hwmon_curr_reset_history = 9, + hwmon_curr_label = 10, + hwmon_curr_alarm = 11, + hwmon_curr_min_alarm = 12, + hwmon_curr_max_alarm = 13, + hwmon_curr_lcrit_alarm = 14, + hwmon_curr_crit_alarm = 15, + hwmon_curr_rated_min = 16, + hwmon_curr_rated_max = 17, +}; + +enum hwmon_power_attributes { + hwmon_power_enable = 0, + hwmon_power_average = 1, + hwmon_power_average_interval = 2, + hwmon_power_average_interval_max = 3, + hwmon_power_average_interval_min = 4, + hwmon_power_average_highest = 5, + hwmon_power_average_lowest = 6, + hwmon_power_average_max = 7, + hwmon_power_average_min = 8, + hwmon_power_input = 9, + hwmon_power_input_highest = 10, + hwmon_power_input_lowest = 11, + hwmon_power_reset_history = 12, + hwmon_power_accuracy = 13, + hwmon_power_cap = 14, + hwmon_power_cap_hyst = 15, + hwmon_power_cap_max = 16, + hwmon_power_cap_min = 17, + hwmon_power_min = 18, + hwmon_power_max = 19, + hwmon_power_crit = 20, + hwmon_power_lcrit = 21, + hwmon_power_label = 22, + hwmon_power_alarm = 23, + hwmon_power_cap_alarm = 24, + hwmon_power_min_alarm = 25, + hwmon_power_max_alarm = 26, + hwmon_power_lcrit_alarm = 27, + hwmon_power_crit_alarm = 28, + hwmon_power_rated_min = 29, + hwmon_power_rated_max = 30, +}; + +enum hwmon_energy_attributes { + hwmon_energy_enable = 0, + hwmon_energy_input = 1, + hwmon_energy_label = 2, +}; + +enum hwmon_humidity_attributes { + hwmon_humidity_enable = 0, + hwmon_humidity_input = 1, + hwmon_humidity_label = 2, + hwmon_humidity_min = 3, + hwmon_humidity_min_hyst = 4, + hwmon_humidity_max = 5, + hwmon_humidity_max_hyst = 6, + hwmon_humidity_alarm = 7, + hwmon_humidity_fault = 8, + hwmon_humidity_rated_min = 9, + hwmon_humidity_rated_max = 10, +}; + +enum hwmon_fan_attributes { + hwmon_fan_enable = 0, + hwmon_fan_input = 1, + hwmon_fan_label = 2, + hwmon_fan_min = 3, + hwmon_fan_max = 4, + hwmon_fan_div = 5, + hwmon_fan_pulses = 6, + hwmon_fan_target = 7, + hwmon_fan_alarm = 8, + hwmon_fan_min_alarm = 9, + hwmon_fan_max_alarm = 10, + hwmon_fan_fault = 11, +}; + +enum hwmon_pwm_attributes { + hwmon_pwm_input = 0, + hwmon_pwm_enable = 1, + hwmon_pwm_mode = 2, + hwmon_pwm_freq = 3, + hwmon_pwm_auto_channels_temp = 4, +}; + +enum hwmon_intrusion_attributes { + hwmon_intrusion_alarm = 0, + hwmon_intrusion_beep = 1, +}; + +struct hwmon_ops { + umode_t (*is_visible)(const void *, enum hwmon_sensor_types, u32, int); + int (*read)(struct device *, enum hwmon_sensor_types, u32, int, long int *); + int (*read_string)(struct device *, enum hwmon_sensor_types, u32, int, const char **); + int (*write)(struct device *, enum hwmon_sensor_types, u32, int, long int); +}; + +struct hwmon_channel_info { + enum hwmon_sensor_types type; + const u32 *config; +}; + +struct hwmon_chip_info { + const struct hwmon_ops *ops; + const struct hwmon_channel_info **info; +}; + +struct trace_event_raw_hwmon_attr_class { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + long int val; + char __data[0]; +}; + +struct trace_event_raw_hwmon_attr_show_string { + struct trace_entry ent; + int index; + u32 __data_loc_attr_name; + u32 __data_loc_label; + char __data[0]; +}; + +struct trace_event_data_offsets_hwmon_attr_class { + u32 attr_name; +}; + +struct trace_event_data_offsets_hwmon_attr_show_string { + u32 attr_name; + u32 label; +}; + +typedef void (*btf_trace_hwmon_attr_show)(void *, int, const char *, long int); + +typedef void (*btf_trace_hwmon_attr_store)(void *, int, const char *, long int); + +typedef void (*btf_trace_hwmon_attr_show_string)(void *, int, const char *, const char *); + +struct hwmon_device { + const char *name; + const char *label; + struct device dev; + const struct hwmon_chip_info *chip; + struct list_head tzdata; + struct attribute_group group; + const struct attribute_group **groups; +}; + +struct hwmon_device_attribute { + struct device_attribute dev_attr; + const struct hwmon_ops *ops; + enum hwmon_sensor_types type; + u32 attr; + int index; + char name[32]; +}; + +struct hwmon_thermal_data { + struct list_head node; + struct device *dev; + int index; + struct thermal_zone_device *tzd; +}; + +enum { + IF_OPER_UNKNOWN = 0, + IF_OPER_NOTPRESENT = 1, + IF_OPER_DOWN = 2, + IF_OPER_LOWERLAYERDOWN = 3, + IF_OPER_TESTING = 4, + IF_OPER_DORMANT = 5, + IF_OPER_UP = 6, +}; + +struct netlink_dump_control { + int (*start)(struct netlink_callback *); + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + void *data; + struct module *module; + u32 min_dump_alloc; +}; + +struct rtnl_link_stats { + __u32 rx_packets; + __u32 tx_packets; + __u32 rx_bytes; + __u32 tx_bytes; + __u32 rx_errors; + __u32 tx_errors; + __u32 rx_dropped; + __u32 tx_dropped; + __u32 multicast; + __u32 collisions; + __u32 rx_length_errors; + __u32 rx_over_errors; + __u32 rx_crc_errors; + __u32 rx_frame_errors; + __u32 rx_fifo_errors; + __u32 rx_missed_errors; + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + __u32 rx_compressed; + __u32 tx_compressed; + __u32 rx_nohandler; +}; + +struct rtnl_link_ifmap { + __u64 mem_start; + __u64 mem_end; + __u64 base_addr; + __u16 irq; + __u8 dma; + __u8 port; +}; + +enum { + IFLA_PROTO_DOWN_REASON_UNSPEC = 0, + IFLA_PROTO_DOWN_REASON_MASK = 1, + IFLA_PROTO_DOWN_REASON_VALUE = 2, + __IFLA_PROTO_DOWN_REASON_CNT = 3, + IFLA_PROTO_DOWN_REASON_MAX = 2, +}; + +enum { + IFLA_BRPORT_UNSPEC = 0, + IFLA_BRPORT_STATE = 1, + IFLA_BRPORT_PRIORITY = 2, + IFLA_BRPORT_COST = 3, + IFLA_BRPORT_MODE = 4, + IFLA_BRPORT_GUARD = 5, + IFLA_BRPORT_PROTECT = 6, + IFLA_BRPORT_FAST_LEAVE = 7, + IFLA_BRPORT_LEARNING = 8, + IFLA_BRPORT_UNICAST_FLOOD = 9, + IFLA_BRPORT_PROXYARP = 10, + IFLA_BRPORT_LEARNING_SYNC = 11, + IFLA_BRPORT_PROXYARP_WIFI = 12, + IFLA_BRPORT_ROOT_ID = 13, + IFLA_BRPORT_BRIDGE_ID = 14, + IFLA_BRPORT_DESIGNATED_PORT = 15, + IFLA_BRPORT_DESIGNATED_COST = 16, + IFLA_BRPORT_ID = 17, + IFLA_BRPORT_NO = 18, + IFLA_BRPORT_TOPOLOGY_CHANGE_ACK = 19, + IFLA_BRPORT_CONFIG_PENDING = 20, + IFLA_BRPORT_MESSAGE_AGE_TIMER = 21, + IFLA_BRPORT_FORWARD_DELAY_TIMER = 22, + IFLA_BRPORT_HOLD_TIMER = 23, + IFLA_BRPORT_FLUSH = 24, + IFLA_BRPORT_MULTICAST_ROUTER = 25, + IFLA_BRPORT_PAD = 26, + IFLA_BRPORT_MCAST_FLOOD = 27, + IFLA_BRPORT_MCAST_TO_UCAST = 28, + IFLA_BRPORT_VLAN_TUNNEL = 29, + IFLA_BRPORT_BCAST_FLOOD = 30, + IFLA_BRPORT_GROUP_FWD_MASK = 31, + IFLA_BRPORT_NEIGH_SUPPRESS = 32, + IFLA_BRPORT_ISOLATED = 33, + IFLA_BRPORT_BACKUP_PORT = 34, + IFLA_BRPORT_MRP_RING_OPEN = 35, + IFLA_BRPORT_MRP_IN_OPEN = 36, + IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT = 37, + IFLA_BRPORT_MCAST_EHT_HOSTS_CNT = 38, + IFLA_BRPORT_LOCKED = 39, + IFLA_BRPORT_MAB = 40, + __IFLA_BRPORT_MAX = 41, +}; + +enum { + IFLA_INFO_UNSPEC = 0, + IFLA_INFO_KIND = 1, + IFLA_INFO_DATA = 2, + IFLA_INFO_XSTATS = 3, + IFLA_INFO_SLAVE_KIND = 4, + IFLA_INFO_SLAVE_DATA = 5, + __IFLA_INFO_MAX = 6, +}; + +enum { + IFLA_VF_INFO_UNSPEC = 0, + IFLA_VF_INFO = 1, + __IFLA_VF_INFO_MAX = 2, +}; + +enum { + IFLA_VF_UNSPEC = 0, + IFLA_VF_MAC = 1, + IFLA_VF_VLAN = 2, + IFLA_VF_TX_RATE = 3, + IFLA_VF_SPOOFCHK = 4, + IFLA_VF_LINK_STATE = 5, + IFLA_VF_RATE = 6, + IFLA_VF_RSS_QUERY_EN = 7, + IFLA_VF_STATS = 8, + IFLA_VF_TRUST = 9, + IFLA_VF_IB_NODE_GUID = 10, + IFLA_VF_IB_PORT_GUID = 11, + IFLA_VF_VLAN_LIST = 12, + IFLA_VF_BROADCAST = 13, + __IFLA_VF_MAX = 14, +}; + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; +}; + +struct ifla_vf_broadcast { + __u8 broadcast[32]; +}; + +struct ifla_vf_vlan { + __u32 vf; + __u32 vlan; + __u32 qos; +}; + +enum { + IFLA_VF_VLAN_INFO_UNSPEC = 0, + IFLA_VF_VLAN_INFO = 1, + __IFLA_VF_VLAN_INFO_MAX = 2, +}; + +struct ifla_vf_vlan_info { + __u32 vf; + __u32 vlan; + __u32 qos; + __be16 vlan_proto; +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; +}; + +struct ifla_vf_rate { + __u32 vf; + __u32 min_tx_rate; + __u32 max_tx_rate; +}; + +struct ifla_vf_spoofchk { + __u32 vf; + __u32 setting; +}; + +struct ifla_vf_link_state { + __u32 vf; + __u32 link_state; +}; + +struct ifla_vf_rss_query_en { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_STATS_RX_PACKETS = 0, + IFLA_VF_STATS_TX_PACKETS = 1, + IFLA_VF_STATS_RX_BYTES = 2, + IFLA_VF_STATS_TX_BYTES = 3, + IFLA_VF_STATS_BROADCAST = 4, + IFLA_VF_STATS_MULTICAST = 5, + IFLA_VF_STATS_PAD = 6, + IFLA_VF_STATS_RX_DROPPED = 7, + IFLA_VF_STATS_TX_DROPPED = 8, + __IFLA_VF_STATS_MAX = 9, +}; + +struct ifla_vf_trust { + __u32 vf; + __u32 setting; +}; + +enum { + IFLA_VF_PORT_UNSPEC = 0, + IFLA_VF_PORT = 1, + __IFLA_VF_PORT_MAX = 2, +}; + +enum { + IFLA_PORT_UNSPEC = 0, + IFLA_PORT_VF = 1, + IFLA_PORT_PROFILE = 2, + IFLA_PORT_VSI_TYPE = 3, + IFLA_PORT_INSTANCE_UUID = 4, + IFLA_PORT_HOST_UUID = 5, + IFLA_PORT_REQUEST = 6, + IFLA_PORT_RESPONSE = 7, + __IFLA_PORT_MAX = 8, +}; + +struct if_stats_msg { + __u8 family; + __u8 pad1; + __u16 pad2; + __u32 ifindex; + __u32 filter_mask; +}; + +enum { + IFLA_STATS_UNSPEC = 0, + IFLA_STATS_LINK_64 = 1, + IFLA_STATS_LINK_XSTATS = 2, + IFLA_STATS_LINK_XSTATS_SLAVE = 3, + IFLA_STATS_LINK_OFFLOAD_XSTATS = 4, + IFLA_STATS_AF_SPEC = 5, + __IFLA_STATS_MAX = 6, +}; + +enum { + IFLA_STATS_GETSET_UNSPEC = 0, + IFLA_STATS_GET_FILTERS = 1, + IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS = 2, + __IFLA_STATS_GETSET_MAX = 3, +}; + +enum { + IFLA_OFFLOAD_XSTATS_UNSPEC = 0, + IFLA_OFFLOAD_XSTATS_CPU_HIT = 1, + IFLA_OFFLOAD_XSTATS_HW_S_INFO = 2, + IFLA_OFFLOAD_XSTATS_L3_STATS = 3, + __IFLA_OFFLOAD_XSTATS_MAX = 4, +}; + +enum { + IFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC = 0, + IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST = 1, + IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED = 2, + __IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX = 3, +}; + +enum { + XDP_ATTACHED_NONE = 0, + XDP_ATTACHED_DRV = 1, + XDP_ATTACHED_SKB = 2, + XDP_ATTACHED_HW = 3, + XDP_ATTACHED_MULTI = 4, +}; + +enum { + IFLA_XDP_UNSPEC = 0, + IFLA_XDP_FD = 1, + IFLA_XDP_ATTACHED = 2, + IFLA_XDP_FLAGS = 3, + IFLA_XDP_PROG_ID = 4, + IFLA_XDP_DRV_PROG_ID = 5, + IFLA_XDP_SKB_PROG_ID = 6, + IFLA_XDP_HW_PROG_ID = 7, + IFLA_XDP_EXPECTED_FD = 8, + __IFLA_XDP_MAX = 9, +}; + +enum { + IFLA_EVENT_NONE = 0, + IFLA_EVENT_REBOOT = 1, + IFLA_EVENT_FEATURES = 2, + IFLA_EVENT_BONDING_FAILOVER = 3, + IFLA_EVENT_NOTIFY_PEERS = 4, + IFLA_EVENT_IGMP_RESEND = 5, + IFLA_EVENT_BONDING_OPTIONS = 6, +}; + +struct netdev_hw_addr { + struct list_head list; + struct rb_node node; + unsigned char addr[32]; + unsigned char type; + bool global_use; + int sync_cnt; + int refcount; + int synced; + struct callback_head callback_head; +}; + +struct netdev_name_node { + struct hlist_node hlist; + struct list_head list; + struct net_device *dev; + const char *name; +}; + +enum devlink_port_type { + DEVLINK_PORT_TYPE_NOTSET = 0, + DEVLINK_PORT_TYPE_AUTO = 1, + DEVLINK_PORT_TYPE_ETH = 2, + DEVLINK_PORT_TYPE_IB = 3, +}; + +enum devlink_port_flavour { + DEVLINK_PORT_FLAVOUR_PHYSICAL = 0, + DEVLINK_PORT_FLAVOUR_CPU = 1, + DEVLINK_PORT_FLAVOUR_DSA = 2, + DEVLINK_PORT_FLAVOUR_PCI_PF = 3, + DEVLINK_PORT_FLAVOUR_PCI_VF = 4, + DEVLINK_PORT_FLAVOUR_VIRTUAL = 5, + DEVLINK_PORT_FLAVOUR_UNUSED = 6, + DEVLINK_PORT_FLAVOUR_PCI_SF = 7, +}; + +struct devlink_port_phys_attrs { + u32 port_number; + u32 split_subport_number; +}; + +struct devlink_port_pci_pf_attrs { + u32 controller; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_pci_vf_attrs { + u32 controller; + u16 pf; + u16 vf; + u8 external: 1; +}; + +struct devlink_port_pci_sf_attrs { + u32 controller; + u32 sf; + u16 pf; + u8 external: 1; +}; + +struct devlink_port_attrs { + u8 split: 1; + u8 splittable: 1; + u32 lanes; + enum devlink_port_flavour flavour; + struct netdev_phys_item_id switch_id; + union { + struct devlink_port_phys_attrs phys; + struct devlink_port_pci_pf_attrs pci_pf; + struct devlink_port_pci_vf_attrs pci_vf; + struct devlink_port_pci_sf_attrs pci_sf; + }; +}; + +struct devlink; + +struct ib_device; + +struct devlink_rate; + +struct devlink_linecard; + +struct devlink_port { + struct list_head list; + struct list_head region_list; + struct devlink *devlink; + unsigned int index; + spinlock_t type_lock; + enum devlink_port_type type; + enum devlink_port_type desired_type; + union { + struct { + struct net_device *netdev; + int ifindex; + char ifname[16]; + } type_eth; + struct { + struct ib_device *ibdev; + } type_ib; + }; + struct devlink_port_attrs attrs; + u8 attrs_set: 1; + u8 switch_port: 1; + u8 registered: 1; + u8 initialized: 1; + struct delayed_work type_warn_dw; + struct list_head reporter_list; + struct mutex reporters_lock; + struct devlink_rate *devlink_rate; + struct devlink_linecard *linecard; +}; + +enum netdev_offload_xstats_type { + NETDEV_OFFLOAD_XSTATS_TYPE_L3 = 1, +}; + +enum { + IFLA_BRIDGE_FLAGS = 0, + IFLA_BRIDGE_MODE = 1, + IFLA_BRIDGE_VLAN_INFO = 2, + IFLA_BRIDGE_VLAN_TUNNEL_INFO = 3, + IFLA_BRIDGE_MRP = 4, + IFLA_BRIDGE_CFM = 5, + IFLA_BRIDGE_MST = 6, + __IFLA_BRIDGE_MAX = 7, +}; + +enum { + BR_MCAST_DIR_RX = 0, + BR_MCAST_DIR_TX = 1, + BR_MCAST_DIR_SIZE = 2, +}; + +struct rta_cacheinfo { + __u32 rta_clntref; + __u32 rta_lastuse; + __s32 rta_expires; + __u32 rta_error; + __u32 rta_used; + __u32 rta_id; + __u32 rta_ts; + __u32 rta_tsage; +}; + +struct ifinfomsg { + unsigned char ifi_family; + unsigned char __ifi_pad; + short unsigned int ifi_type; + int ifi_index; + unsigned int ifi_flags; + unsigned int ifi_change; +}; + +enum rtnl_link_flags { + RTNL_FLAG_DOIT_UNLOCKED = 1, + RTNL_FLAG_BULK_DEL_SUPPORTED = 2, +}; + +enum rtnl_kinds { + RTNL_KIND_NEW = 0, + RTNL_KIND_DEL = 1, + RTNL_KIND_GET = 2, + RTNL_KIND_SET = 3, +}; + +enum devlink_rate_type { + DEVLINK_RATE_TYPE_LEAF = 0, + DEVLINK_RATE_TYPE_NODE = 1, +}; + +struct devlink_rate { + struct list_head list; + enum devlink_rate_type type; + struct devlink *devlink; + void *priv; + u64 tx_share; + u64 tx_max; + struct devlink_rate *parent; + union { + struct devlink_port *devlink_port; + struct { + char *name; + refcount_t refcnt; + }; + }; + u32 tx_priority; + u32 tx_weight; +}; + +struct rtnl_link { + rtnl_doit_func doit; + rtnl_dumpit_func dumpit; + struct module *owner; + unsigned int flags; + struct callback_head rcu; +}; + +struct rtnl_newlink_tbs { + struct nlattr *tb[63]; + struct nlattr *attr[51]; + struct nlattr *slave_attr[41]; +}; + +struct rtnl_offload_xstats_request_used { + bool request; + bool used; +}; + +struct rtnl_stats_dump_filters { + u32 mask[6]; +}; + +struct ac6_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; +}; + +enum mptcp_pm_type { + MPTCP_PM_TYPE_KERNEL = 0, + MPTCP_PM_TYPE_USERSPACE = 1, + __MPTCP_PM_TYPE_NR = 2, + __MPTCP_PM_TYPE_MAX = 1, +}; + +struct mptcp_pernet { + struct ctl_table_header *ctl_table_hdr; + unsigned int add_addr_timeout; + unsigned int stale_loss_cnt; + u8 mptcp_enabled; + u8 checksum_enabled; + u8 allow_join_initial_addr_port; + u8 pm_type; +}; + +enum { + PER_LINUX = 0, + PER_LINUX_32BIT = 8388608, + PER_LINUX_FDPIC = 524288, + PER_SVR4 = 68157441, + PER_SVR3 = 83886082, + PER_SCOSVR3 = 117440515, + PER_OSR5 = 100663299, + PER_WYSEV386 = 83886084, + PER_ISCR4 = 67108869, + PER_BSD = 6, + PER_SUNOS = 67108870, + PER_XENIX = 83886087, + PER_LINUX32 = 8, + PER_LINUX32_3GB = 134217736, + PER_IRIX32 = 67108873, + PER_IRIXN32 = 67108874, + PER_IRIX64 = 67108875, + PER_RISCOS = 12, + PER_SOLARIS = 67108877, + PER_UW7 = 68157454, + PER_OSF4 = 15, + PER_HPUX = 16, + PER_MASK = 255, +}; + +typedef long int (*syscall_fn_t)(const struct pt_regs *); + +typedef __u64 Elf64_Off; + +struct elf64_hdr { + unsigned char e_ident[16]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +}; + +typedef struct elf64_hdr Elf64_Ehdr; + +struct elf64_shdr { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +}; + +typedef struct elf64_shdr Elf64_Shdr; + +struct modversion_info { + long unsigned int crc; + char name[56]; +}; + +struct _ddebug { + const char *modname; + const char *function; + const char *filename; + const char *format; + unsigned int lineno: 18; + unsigned int class_id: 6; + unsigned int flags: 8; + union { + struct static_key_true dd_key_true; + struct static_key_false dd_key_false; + } key; +}; + +enum class_map_type { + DD_CLASS_TYPE_DISJOINT_BITS = 0, + DD_CLASS_TYPE_LEVEL_NUM = 1, + DD_CLASS_TYPE_DISJOINT_NAMES = 2, + DD_CLASS_TYPE_LEVEL_NAMES = 3, +}; + +struct ddebug_class_map { + struct list_head link; + struct module *mod; + const char *mod_name; + const char **class_names; + const int length; + const int base; + enum class_map_type map_type; +}; + +struct _ddebug_info { + struct _ddebug *descs; + struct ddebug_class_map *classes; + unsigned int num_descs; + unsigned int num_classes; +}; + +struct load_info { + const char *name; + struct module *mod; + Elf64_Ehdr *hdr; + long unsigned int len; + Elf64_Shdr *sechdrs; + char *secstrings; + char *strtab; + long unsigned int symoffs; + long unsigned int stroffs; + long unsigned int init_typeoffs; + long unsigned int core_typeoffs; + struct _ddebug_info dyndbg; + bool sig_ok; + long unsigned int mod_kallsyms_init_off; + struct { + unsigned int sym; + unsigned int str; + unsigned int mod; + unsigned int vers; + unsigned int info; + unsigned int pcpu; + } index; +}; + +enum mod_license { + NOT_GPL_ONLY = 0, + GPL_ONLY = 1, +}; + +struct find_symbol_arg { + const char *name; + bool gplok; + bool warn; + struct module *owner; + const s32 *crc; + const struct kernel_symbol *sym; + enum mod_license license; +}; + +enum blktrace_cat { + BLK_TC_READ = 1, + BLK_TC_WRITE = 2, + BLK_TC_FLUSH = 4, + BLK_TC_SYNC = 8, + BLK_TC_SYNCIO = 8, + BLK_TC_QUEUE = 16, + BLK_TC_REQUEUE = 32, + BLK_TC_ISSUE = 64, + BLK_TC_COMPLETE = 128, + BLK_TC_FS = 256, + BLK_TC_PC = 512, + BLK_TC_NOTIFY = 1024, + BLK_TC_AHEAD = 2048, + BLK_TC_META = 4096, + BLK_TC_DISCARD = 8192, + BLK_TC_DRV_DATA = 16384, + BLK_TC_FUA = 32768, + BLK_TC_END = 32768, +}; + +enum blktrace_notify { + __BLK_TN_PROCESS = 0, + __BLK_TN_TIMESTAMP = 1, + __BLK_TN_MESSAGE = 2, + __BLK_TN_CGROUP = 256, +}; + +struct blk_io_trace { + __u32 magic; + __u32 sequence; + __u64 time; + __u64 sector; + __u32 bytes; + __u32 action; + __u32 pid; + __u32 device; + __u32 cpu; + __u16 error; + __u16 pdu_len; +}; + +struct blk_io_trace_remap { + __be32 device_from; + __be32 device_to; + __be64 sector_from; +}; + +enum { + Blktrace_setup = 1, + Blktrace_running = 2, + Blktrace_stopped = 3, +}; + +struct blk_user_trace_setup { + char name[32]; + __u16 act_mask; + __u32 buf_size; + __u32 buf_nr; + __u64 start_lba; + __u64 end_lba; + __u32 pid; +}; + +typedef void blk_log_action_t(struct trace_iterator *, const char *, bool); + +struct files_stat_struct { + long unsigned int nr_files; + long unsigned int nr_free_files; + long unsigned int max_files; +}; + +enum dentry_d_lock_class { + DENTRY_D_LOCK_NORMAL = 0, + DENTRY_D_LOCK_NESTED = 1, +}; + +struct name_snapshot { + struct qstr name; + unsigned char inline_name[32]; +}; + +struct dentry_stat_t { + long int nr_dentry; + long int nr_unused; + long int age_limit; + long int want_pages; + long int nr_negative; + long int dummy; +}; + +struct external_name { + union { + atomic_t count; + struct callback_head head; + } u; + unsigned char name[0]; +}; + +enum d_walk_ret { + D_WALK_CONTINUE = 0, + D_WALK_QUIT = 1, + D_WALK_NORETRY = 2, + D_WALK_SKIP = 3, +}; + +struct check_mount { + struct vfsmount *mnt; + unsigned int mounted; +}; + +struct select_data { + struct dentry *start; + union { + long int found; + struct dentry *victim; + }; + struct list_head dispose; +}; + +struct proc_mounts { + struct mnt_namespace *ns; + struct path root; + int (*show)(struct seq_file *, struct vfsmount *); + struct mount cursor; +}; + +struct proc_fs_opts { + int flag; + const char *str; +}; + +enum utf8_normalization { + UTF8_NFDI = 0, + UTF8_NFDICF = 1, + UTF8_NMAX = 2, +}; + +struct fscrypt_str { + unsigned char *name; + u32 len; +}; + +struct ext4_dir_entry_hash { + __le32 hash; + __le32 minor_hash; +}; + +struct ext4_dir_entry_2 { + __le32 inode; + __le16 rec_len; + __u8 name_len; + __u8 file_type; + char name[255]; +}; + +struct fname { + __u32 hash; + __u32 minor_hash; + struct rb_node rb_hash; + struct fname *next; + __u32 inode; + __u8 name_len; + __u8 file_type; + char name[0]; +}; + +typedef u16 wchar_t; + +typedef u32 unicode_t; + +struct nls_table { + const char *charset; + const char *alias; + int (*uni2char)(wchar_t, unsigned char *, int); + int (*char2uni)(const unsigned char *, int, wchar_t *); + const unsigned char *charset2lower; + const unsigned char *charset2upper; + struct module *owner; + struct nls_table *next; +}; + +enum utf16_endian { + UTF16_HOST_ENDIAN = 0, + UTF16_LITTLE_ENDIAN = 1, + UTF16_BIG_ENDIAN = 2, +}; + +struct utf8_table { + int cmask; + int cval; + int shift; + long int lmask; + long int lval; +}; + +struct ebitmap_node { + struct ebitmap_node *next; + long unsigned int maps[6]; + u32 startbit; +}; + +struct ebitmap { + struct ebitmap_node *node; + u32 highbit; +}; + +struct policy_file { + char *data; + size_t len; +}; + +struct crypto_report_kpp { + char type[64]; +}; + +struct kpp_request { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int src_len; + unsigned int dst_len; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_kpp { + struct crypto_tfm base; +}; + +struct kpp_alg { + int (*set_secret)(struct crypto_kpp *, const void *, unsigned int); + int (*generate_public_key)(struct kpp_request *); + int (*compute_shared_secret)(struct kpp_request *); + unsigned int (*max_size)(struct crypto_kpp *); + int (*init)(struct crypto_kpp *); + void (*exit)(struct crypto_kpp *); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct kpp_instance { + void (*free)(struct kpp_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[128]; + struct crypto_instance base; + } s; + struct kpp_alg alg; + }; +}; + +struct crypto_kpp_spawn { + struct crypto_spawn base; +}; + +enum tpm2_handle_types { + TPM2_HT_HMAC_SESSION = 33554432, + TPM2_HT_POLICY_SESSION = 50331648, + TPM2_HT_TRANSIENT = 2147483648, +}; + +struct tpm2_context { + __be64 sequence; + __be32 saved_handle; + __be32 hierarchy; + __be16 blob_size; +} __attribute__((packed)); + +struct tpm2_cap_handles { + u8 more_data; + __be32 capability; + __be32 count; + __be32 handles[0]; +} __attribute__((packed)); + +struct driver_attribute { + struct attribute attr; + ssize_t (*show)(struct device_driver *, char *); + ssize_t (*store)(struct device_driver *, const char *, size_t); +}; + +enum serio_event_type { + SERIO_RESCAN_PORT = 0, + SERIO_RECONNECT_PORT = 1, + SERIO_RECONNECT_SUBTREE = 2, + SERIO_REGISTER_PORT = 3, + SERIO_ATTACH_DRIVER = 4, +}; + +struct serio_event { + enum serio_event_type type; + void *object; + struct module *owner; + struct list_head node; +}; + +enum { + LOGIC_PIO_INDIRECT = 0, + LOGIC_PIO_CPU_MMIO = 1, +}; + +struct logic_pio_host_ops; + +struct logic_pio_hwaddr { + struct list_head list; + struct fwnode_handle *fwnode; + resource_size_t hw_start; + resource_size_t io_start; + resource_size_t size; + long unsigned int flags; + void *hostdata; + const struct logic_pio_host_ops *ops; +}; + +struct logic_pio_host_ops { + u32 (*in)(void *, long unsigned int, size_t); + void (*out)(void *, long unsigned int, u32, size_t); + u32 (*ins)(void *, long unsigned int, void *, size_t, unsigned int); + void (*outs)(void *, long unsigned int, const void *, size_t, unsigned int); +}; + +struct of_bus; + +struct of_pci_range_parser { + struct device_node *node; + struct of_bus *bus; + const __be32 *range; + const __be32 *end; + int na; + int ns; + int pna; + bool dma; +}; + +struct of_bus { + const char *name; + const char *addresses; + int (*match)(struct device_node *); + void (*count_cells)(struct device_node *, int *, int *); + u64 (*map)(__be32 *, const __be32 *, int, int, int); + int (*translate)(__be32 *, u64, int); + bool has_flags; + unsigned int (*get_flags)(const __be32 *); +}; + +struct of_pci_range { + union { + u64 pci_addr; + u64 bus_addr; + }; + u64 cpu_addr; + u64 size; + u32 flags; +}; + +struct wol_reply_data { + struct ethnl_reply_data base; + struct ethtool_wolinfo wol; + bool show_sopass; +}; + +enum { + IOAM6_ATTR_UNSPEC = 0, + IOAM6_ATTR_NS_ID = 1, + IOAM6_ATTR_NS_DATA = 2, + IOAM6_ATTR_NS_DATA_WIDE = 3, + IOAM6_ATTR_SC_ID = 4, + IOAM6_ATTR_SC_DATA = 5, + IOAM6_ATTR_SC_NONE = 6, + IOAM6_ATTR_PAD = 7, + __IOAM6_ATTR_MAX = 8, +}; + +enum { + IOAM6_CMD_UNSPEC = 0, + IOAM6_CMD_ADD_NAMESPACE = 1, + IOAM6_CMD_DEL_NAMESPACE = 2, + IOAM6_CMD_DUMP_NAMESPACES = 3, + IOAM6_CMD_ADD_SCHEMA = 4, + IOAM6_CMD_DEL_SCHEMA = 5, + IOAM6_CMD_DUMP_SCHEMAS = 6, + IOAM6_CMD_NS_SET_SCHEMA = 7, + __IOAM6_CMD_MAX = 8, +}; + +struct p9_fcall { + u32 size; + u8 id; + u16 tag; + size_t offset; + size_t capacity; + struct kmem_cache *cache; + u8 *sdata; +}; + +enum p9_trans_status { + Connected = 0, + BeginDisconnect = 1, + Disconnected = 2, + Hung = 3, +}; + +struct p9_req_t { + int status; + int t_err; + refcount_t refcount; + wait_queue_head_t wq; + struct p9_fcall tc; + struct p9_fcall rc; + struct list_head req_list; +}; + +struct p9_trans_module; + +struct p9_client { + spinlock_t lock; + unsigned int msize; + unsigned char proto_version; + struct p9_trans_module *trans_mod; + enum p9_trans_status status; + void *trans; + struct kmem_cache *fcall_cache; + union { + struct { + int rfd; + int wfd; + } fd; + struct { + u16 port; + bool privport; + } tcp; + } trans_opts; + struct idr fids; + struct idr reqs; + char name[65]; +}; + +struct p9_trans_module { + struct list_head list; + char *name; + int maxsize; + bool pooled_rbuffers; + int def; + struct module *owner; + int (*create)(struct p9_client *, const char *, char *); + void (*close)(struct p9_client *); + int (*request)(struct p9_client *, struct p9_req_t *); + int (*cancel)(struct p9_client *, struct p9_req_t *); + int (*cancelled)(struct p9_client *, struct p9_req_t *); + int (*zc_request)(struct p9_client *, struct p9_req_t *, struct iov_iter *, struct iov_iter *, int, int, int); + int (*show_options)(struct seq_file *, struct p9_client *); +}; + +struct mpls_iptunnel_encap { + u8 labels; + u8 ttl_propagate; + u8 default_ttl; + u8 reserved1; + u32 label[0]; +}; + +enum { + MPLS_IPTUNNEL_UNSPEC = 0, + MPLS_IPTUNNEL_DST = 1, + MPLS_IPTUNNEL_TTL = 2, + __MPLS_IPTUNNEL_MAX = 3, +}; + +struct unwind_state { + long unsigned int fp; + long unsigned int pc; + struct llist_node *kr_cur; + struct task_struct *task; + struct stack_info stack; + struct stack_info *stacks; + int nr_stacks; +}; + +struct ctx_switch_entry { + struct trace_entry ent; + unsigned int prev_pid; + unsigned int next_pid; + unsigned int next_cpu; + unsigned char prev_prio; + unsigned char prev_state; + unsigned char next_prio; + unsigned char next_state; +}; + +struct userstack_entry { + struct trace_entry ent; + unsigned int tgid; + long unsigned int caller[8]; +}; + +struct hwlat_entry { + struct trace_entry ent; + u64 duration; + u64 outer_duration; + u64 nmi_total_ts; + struct timespec64 timestamp; + unsigned int nmi_count; + unsigned int seqnum; + unsigned int count; +}; + +struct osnoise_entry { + struct trace_entry ent; + u64 noise; + u64 runtime; + u64 max_sample; + unsigned int hw_count; + unsigned int nmi_count; + unsigned int irq_count; + unsigned int softirq_count; + unsigned int thread_count; +}; + +struct timerlat_entry { + struct trace_entry ent; + unsigned int seqnum; + int context; + u64 timer_latency; +}; + +struct trace_mark { + long long unsigned int val; + char sym; +}; + +enum fsconfig_command { + FSCONFIG_SET_FLAG = 0, + FSCONFIG_SET_STRING = 1, + FSCONFIG_SET_BINARY = 2, + FSCONFIG_SET_PATH = 3, + FSCONFIG_SET_PATH_EMPTY = 4, + FSCONFIG_SET_FD = 5, + FSCONFIG_CMD_CREATE = 6, + FSCONFIG_CMD_RECONFIGURE = 7, +}; + +typedef unsigned int __kernel_mode_t; + +typedef int __kernel_ipc_pid_t; + +typedef unsigned int __kernel_uid_t; + +typedef unsigned int __kernel_gid_t; + +typedef __kernel_long_t __kernel_old_time_t; + +struct ipc_perm { + __kernel_key_t key; + __kernel_uid_t uid; + __kernel_gid_t gid; + __kernel_uid_t cuid; + __kernel_gid_t cgid; + __kernel_mode_t mode; + short unsigned int seq; +}; + +struct ipc64_perm { + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; + __kernel_mode_t mode; + unsigned char __pad1[0]; + short unsigned int seq; + short unsigned int __pad2; + __kernel_ulong_t __unused1; + __kernel_ulong_t __unused2; +}; + +struct msgbuf { + __kernel_long_t mtype; + char mtext[1]; +}; + +struct msg; + +struct msqid_ds { + struct ipc_perm msg_perm; + struct msg *msg_first; + struct msg *msg_last; + __kernel_old_time_t msg_stime; + __kernel_old_time_t msg_rtime; + __kernel_old_time_t msg_ctime; + long unsigned int msg_lcbytes; + long unsigned int msg_lqbytes; + short unsigned int msg_cbytes; + short unsigned int msg_qnum; + short unsigned int msg_qbytes; + __kernel_ipc_pid_t msg_lspid; + __kernel_ipc_pid_t msg_lrpid; +}; + +struct msqid64_ds { + struct ipc64_perm msg_perm; + long int msg_stime; + long int msg_rtime; + long int msg_ctime; + long unsigned int msg_cbytes; + long unsigned int msg_qnum; + long unsigned int msg_qbytes; + __kernel_pid_t msg_lspid; + __kernel_pid_t msg_lrpid; + long unsigned int __unused4; + long unsigned int __unused5; +}; + +struct msginfo { + int msgpool; + int msgmap; + int msgmax; + int msgmnb; + int msgmni; + int msgssz; + int msgtql; + short unsigned int msgseg; +}; + +struct ipc_params { + key_t key; + int flg; + union { + size_t size; + int nsems; + } u; +}; + +struct ipc_ops { + int (*getnew)(struct ipc_namespace *, struct ipc_params *); + int (*associate)(struct kern_ipc_perm *, int); + int (*more_checks)(struct kern_ipc_perm *, struct ipc_params *); +}; + +struct msg_queue { + struct kern_ipc_perm q_perm; + time64_t q_stime; + time64_t q_rtime; + time64_t q_ctime; + long unsigned int q_cbytes; + long unsigned int q_qnum; + long unsigned int q_qbytes; + struct pid *q_lspid; + struct pid *q_lrpid; + struct list_head q_messages; + struct list_head q_receivers; + struct list_head q_senders; + long: 64; + long: 64; +}; + +struct msg_receiver { + struct list_head r_list; + struct task_struct *r_tsk; + int r_mode; + long int r_msgtype; + long int r_maxsize; + struct msg_msg *r_msg; +}; + +struct msg_sender { + struct list_head list; + struct task_struct *tsk; + size_t msgsz; +}; + +struct sg_append_table { + struct sg_table sgt; + struct scatterlist *prv; + unsigned int total_nents; +}; + +typedef struct scatterlist *sg_alloc_fn(unsigned int, gfp_t); + +typedef void sg_free_fn(struct scatterlist *, unsigned int); + +struct sg_page_iter { + struct scatterlist *sg; + unsigned int sg_pgoffset; + unsigned int __nents; + int __pg_advance; +}; + +struct sg_dma_page_iter { + struct sg_page_iter base; +}; + +struct sg_mapping_iter { + struct page *page; + void *addr; + size_t length; + size_t consumed; + struct sg_page_iter piter; + unsigned int __offset; + unsigned int __remaining; + unsigned int __flags; +}; + +struct property_entry { + const char *name; + size_t length; + bool is_inline; + enum dev_prop_type type; + union { + const void *pointer; + union { + u8 u8_data[8]; + u16 u16_data[4]; + u32 u32_data[2]; + u64 u64_data[1]; + const char *str[1]; + } value; + }; +}; + +struct iopf_device_param; + +struct iommu_fault_param; + +struct iommu_fwspec; + +struct dev_iommu { + struct mutex lock; + struct iommu_fault_param *fault_param; + struct iopf_device_param *iopf_param; + struct iommu_fwspec *fwspec; + struct iommu_device *iommu_dev; + void *priv; +}; + +struct acpi_pnp_device_id { + u32 length; + char *string; +}; + +struct acpi_pnp_device_id_list { + u32 count; + u32 list_size; + struct acpi_pnp_device_id ids[0]; +}; + +struct acpi_device_info { + u32 info_size; + u32 name; + acpi_object_type type; + u8 param_count; + u16 valid; + u8 flags; + u8 highest_dstates[4]; + u8 lowest_dstates[5]; + u64 address; + struct acpi_pnp_device_id hardware_id; + struct acpi_pnp_device_id unique_id; + struct acpi_pnp_device_id class_code; + struct acpi_pnp_device_id_list compatible_id_list; +}; + +struct acpi_cedt_header { + u8 type; + u8 reserved; + u16 length; +}; + +struct acpi_hmat_structure { + u16 type; + u16 reserved; + u32 length; +}; + +enum acpi_madt_type { + ACPI_MADT_TYPE_LOCAL_APIC = 0, + ACPI_MADT_TYPE_IO_APIC = 1, + ACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2, + ACPI_MADT_TYPE_NMI_SOURCE = 3, + ACPI_MADT_TYPE_LOCAL_APIC_NMI = 4, + ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5, + ACPI_MADT_TYPE_IO_SAPIC = 6, + ACPI_MADT_TYPE_LOCAL_SAPIC = 7, + ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8, + ACPI_MADT_TYPE_LOCAL_X2APIC = 9, + ACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10, + ACPI_MADT_TYPE_GENERIC_INTERRUPT = 11, + ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12, + ACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13, + ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14, + ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15, + ACPI_MADT_TYPE_MULTIPROC_WAKEUP = 16, + ACPI_MADT_TYPE_CORE_PIC = 17, + ACPI_MADT_TYPE_LIO_PIC = 18, + ACPI_MADT_TYPE_HT_PIC = 19, + ACPI_MADT_TYPE_EIO_PIC = 20, + ACPI_MADT_TYPE_MSI_PIC = 21, + ACPI_MADT_TYPE_BIO_PIC = 22, + ACPI_MADT_TYPE_LPC_PIC = 23, + ACPI_MADT_TYPE_RESERVED = 24, + ACPI_MADT_TYPE_OEM_RESERVED = 128, +}; + +struct acpi_prmt_module_header { + u16 revision; + u16 length; +}; + +struct acpi_table_stao { + struct acpi_table_header header; + u8 ignore_uart; +} __attribute__((packed)); + +struct acpi_pld_info { + u8 revision; + u8 ignore_color; + u8 red; + u8 green; + u8 blue; + u16 width; + u16 height; + u8 user_visible; + u8 dock; + u8 lid; + u8 panel; + u8 vertical_position; + u8 horizontal_position; + u8 shape; + u8 group_orientation; + u8 group_token; + u8 group_position; + u8 bay; + u8 ejectable; + u8 ospm_eject_required; + u8 cabinet_number; + u8 card_cage_number; + u8 reference; + u8 rotation; + u8 order; + u8 reserved; + u16 vertical_offset; + u16 horizontal_offset; +}; + +typedef acpi_status (*acpi_walk_resource_callback)(struct acpi_resource *, void *); + +struct acpi_handle_list { + u32 count; + acpi_handle handles[10]; +}; + +struct acpi_dep_data { + struct list_head node; + acpi_handle supplier; + acpi_handle consumer; + bool honor_dep; +}; + +union acpi_subtable_headers { + struct acpi_subtable_header common; + struct acpi_hmat_structure hmat; + struct acpi_prmt_module_header prmt; + struct acpi_cedt_header cedt; +}; + +typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *); + +typedef int (*acpi_tbl_entry_handler)(union acpi_subtable_headers *, const long unsigned int); + +enum acpi_reconfig_event { + ACPI_RECONFIG_DEVICE_ADD = 0, + ACPI_RECONFIG_DEVICE_REMOVE = 1, +}; + +struct acpi_probe_entry; + +typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *, struct acpi_probe_entry *); + +struct acpi_probe_entry { + __u8 id[5]; + __u8 type; + acpi_probe_entry_validate_subtbl subtable_valid; + union { + acpi_tbl_table_handler probe_table; + acpi_tbl_entry_handler probe_subtbl; + }; + kernel_ulong_t driver_data; +}; + +struct iommu_fault_unrecoverable { + __u32 reason; + __u32 flags; + __u32 pasid; + __u32 perm; + __u64 addr; + __u64 fetch_addr; +}; + +struct iommu_fault_page_request { + __u32 flags; + __u32 pasid; + __u32 grpid; + __u32 perm; + __u64 addr; + __u64 private_data[2]; +}; + +struct iommu_fault { + __u32 type; + __u32 padding; + union { + struct iommu_fault_unrecoverable event; + struct iommu_fault_page_request prm; + __u8 padding2[56]; + }; +}; + +struct iommu_page_response { + __u32 argsz; + __u32 version; + __u32 flags; + __u32 pasid; + __u32 grpid; + __u32 code; +}; + +typedef int (*iommu_fault_handler_t)(struct iommu_domain *, struct device *, long unsigned int, int, void *); + +struct iommu_domain_geometry { + dma_addr_t aperture_start; + dma_addr_t aperture_end; + bool force_aperture; +}; + +struct iommu_dma_cookie; + +struct iommu_domain { + unsigned int type; + const struct iommu_domain_ops *ops; + long unsigned int pgsize_bitmap; + iommu_fault_handler_t handler; + void *handler_token; + struct iommu_domain_geometry geometry; + struct iommu_dma_cookie *iova_cookie; +}; + +typedef int (*iommu_dev_fault_handler_t)(struct iommu_fault *, void *); + +struct iommu_iotlb_gather; + +struct iommu_domain_ops { + int (*attach_dev)(struct iommu_domain *, struct device *); + void (*detach_dev)(struct iommu_domain *, struct device *); + int (*map)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, int, gfp_t); + int (*map_pages)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, size_t, int, gfp_t, size_t *); + size_t (*unmap)(struct iommu_domain *, long unsigned int, size_t, struct iommu_iotlb_gather *); + size_t (*unmap_pages)(struct iommu_domain *, long unsigned int, size_t, size_t, struct iommu_iotlb_gather *); + void (*flush_iotlb_all)(struct iommu_domain *); + void (*iotlb_sync_map)(struct iommu_domain *, long unsigned int, size_t); + void (*iotlb_sync)(struct iommu_domain *, struct iommu_iotlb_gather *); + phys_addr_t (*iova_to_phys)(struct iommu_domain *, dma_addr_t); + bool (*enforce_cache_coherency)(struct iommu_domain *); + int (*enable_nesting)(struct iommu_domain *); + int (*set_pgtable_quirks)(struct iommu_domain *, long unsigned int); + void (*free)(struct iommu_domain *); +}; + +struct iommu_iotlb_gather { + long unsigned int start; + long unsigned int end; + size_t pgsize; + struct list_head freelist; + bool queued; +}; + +struct iommu_device { + struct list_head list; + const struct iommu_ops *ops; + struct fwnode_handle *fwnode; + struct device *dev; +}; + +struct iommu_sva { + struct device *dev; +}; + +struct iommu_fault_event { + struct iommu_fault fault; + struct list_head list; +}; + +struct iommu_fault_param { + iommu_dev_fault_handler_t handler; + void *data; + struct list_head faults; + struct mutex lock; +}; + +struct iommu_fwspec { + const struct iommu_ops *ops; + struct fwnode_handle *iommu_fwnode; + u32 flags; + unsigned int num_ids; + u32 ids[0]; +}; + +struct acpi_device_bus_id { + const char *bus_id; + struct ida instance_ida; + struct list_head node; +}; + +struct acpi_scan_clear_dep_work { + struct work_struct work; + struct acpi_device *adev; +}; + +struct platform_device; + +struct container_dev { + struct device dev; + int (*offline)(struct container_dev *); +}; + +typedef struct __call_single_data call_single_data_t; + +struct rps_sock_flow_table { + u32 mask; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 ents[0]; +}; + +struct sd_flow_limit; + +struct softnet_data { + struct list_head poll_list; + struct sk_buff_head process_queue; + unsigned int processed; + unsigned int time_squeeze; + struct softnet_data *rps_ipi_list; + struct sd_flow_limit *flow_limit; + struct Qdisc *output_queue; + struct Qdisc **output_queue_tailp; + struct sk_buff *completion_queue; + struct { + u16 recursion; + u8 more; + u8 skip_txqueue; + } xmit; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int input_queue_head; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + call_single_data_t csd; + struct softnet_data *rps_ipi_next; + unsigned int cpu; + unsigned int input_queue_tail; + unsigned int received_rps; + unsigned int dropped; + struct sk_buff_head input_pkt_queue; + struct napi_struct backlog; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t defer_lock; + int defer_count; + int defer_ipi_scheduled; + struct sk_buff *defer_list; + long: 64; + long: 64; + call_single_data_t defer_csd; +}; + +struct sd_flow_limit { + u64 count; + unsigned int num_buckets; + unsigned int history_head; + u16 history[128]; + u8 buckets[0]; +}; + +enum tcp_metric_index { + TCP_METRIC_RTT = 0, + TCP_METRIC_RTTVAR = 1, + TCP_METRIC_SSTHRESH = 2, + TCP_METRIC_CWND = 3, + TCP_METRIC_REORDERING = 4, + TCP_METRIC_RTT_US = 5, + TCP_METRIC_RTTVAR_US = 6, + __TCP_METRIC_MAX = 7, +}; + +enum { + TCP_METRICS_ATTR_UNSPEC = 0, + TCP_METRICS_ATTR_ADDR_IPV4 = 1, + TCP_METRICS_ATTR_ADDR_IPV6 = 2, + TCP_METRICS_ATTR_AGE = 3, + TCP_METRICS_ATTR_TW_TSVAL = 4, + TCP_METRICS_ATTR_TW_TS_STAMP = 5, + TCP_METRICS_ATTR_VALS = 6, + TCP_METRICS_ATTR_FOPEN_MSS = 7, + TCP_METRICS_ATTR_FOPEN_SYN_DROPS = 8, + TCP_METRICS_ATTR_FOPEN_SYN_DROP_TS = 9, + TCP_METRICS_ATTR_FOPEN_COOKIE = 10, + TCP_METRICS_ATTR_SADDR_IPV4 = 11, + TCP_METRICS_ATTR_SADDR_IPV6 = 12, + TCP_METRICS_ATTR_PAD = 13, + __TCP_METRICS_ATTR_MAX = 14, +}; + +enum { + TCP_METRICS_CMD_UNSPEC = 0, + TCP_METRICS_CMD_GET = 1, + TCP_METRICS_CMD_DEL = 2, + __TCP_METRICS_CMD_MAX = 3, +}; + +struct ipv4_addr_key { + __be32 addr; + int vif; +}; + +struct inetpeer_addr { + union { + struct ipv4_addr_key a4; + struct in6_addr a6; + u32 key[4]; + }; + __u16 family; +}; + +struct tcp_fastopen_metrics { + u16 mss; + u16 syn_loss: 10; + u16 try_exp: 2; + long unsigned int last_syn_loss; + struct tcp_fastopen_cookie cookie; +}; + +struct tcp_metrics_block { + struct tcp_metrics_block *tcpm_next; + possible_net_t tcpm_net; + struct inetpeer_addr tcpm_saddr; + struct inetpeer_addr tcpm_daddr; + long unsigned int tcpm_stamp; + u32 tcpm_lock; + u32 tcpm_vals[5]; + struct tcp_fastopen_metrics tcpm_fastopen; + struct callback_head callback_head; +}; + +struct tcpm_hash_bucket { + struct tcp_metrics_block *chain; +}; + +struct guehdr { + union { + struct { + __u8 hlen: 5; + __u8 control: 1; + __u8 version: 2; + __u8 proto_ctype; + __be16 flags; + }; + __be32 word; + }; +}; + +struct netlbl_audit { + u32 secid; + kuid_t loginuid; + unsigned int sessionid; +}; + +struct calipso_doi { + u32 doi; + u32 type; + refcount_t refcount; + struct list_head list; + struct callback_head rcu; +}; + +struct cipso_v4_std_map_tbl { + struct { + u32 *cipso; + u32 *local; + u32 cipso_size; + u32 local_size; + } lvl; + struct { + u32 *cipso; + u32 *local; + u32 cipso_size; + u32 local_size; + } cat; +}; + +struct cipso_v4_doi { + u32 doi; + u32 type; + union { + struct cipso_v4_std_map_tbl *std; + } map; + u8 tags[5]; + refcount_t refcount; + struct list_head list; + struct callback_head rcu; +}; + +struct netlbl_af4list { + __be32 addr; + __be32 mask; + u32 valid; + struct list_head list; +}; + +struct netlbl_af6list { + struct in6_addr addr; + struct in6_addr mask; + u32 valid; + struct list_head list; +}; + +struct netlbl_domaddr_map { + struct list_head list4; + struct list_head list6; +}; + +struct netlbl_dommap_def { + u32 type; + union { + struct netlbl_domaddr_map *addrsel; + struct cipso_v4_doi *cipso; + struct calipso_doi *calipso; + }; +}; + +struct netlbl_domaddr4_map { + struct netlbl_dommap_def def; + struct netlbl_af4list list; +}; + +struct netlbl_domaddr6_map { + struct netlbl_dommap_def def; + struct netlbl_af6list list; +}; + +struct netlbl_dom_map { + char *domain; + u16 family; + struct netlbl_dommap_def def; + u32 valid; + struct list_head list; + struct callback_head rcu; +}; + +enum { + Audit_equal = 0, + Audit_not_equal = 1, + Audit_bitmask = 2, + Audit_bittest = 3, + Audit_lt = 4, + Audit_gt = 5, + Audit_le = 6, + Audit_ge = 7, + Audit_bad = 8, +}; + +struct audit_chunk; + +struct audit_tree { + refcount_t count; + int goner; + struct audit_chunk *root; + struct list_head chunks; + struct list_head rules; + struct list_head list; + struct list_head same_root; + struct callback_head head; + char pathname[0]; +}; + +struct audit_entry { + struct list_head list; + struct callback_head rcu; + struct audit_krule rule; +}; + +struct audit_node { + struct list_head list; + struct audit_tree *owner; + unsigned int index; +}; + +struct audit_chunk { + struct list_head hash; + long unsigned int key; + struct fsnotify_mark *mark; + struct list_head trees; + int count; + atomic_long_t refs; + struct callback_head head; + struct audit_node owners[0]; +}; + +struct audit_tree_mark { + struct fsnotify_mark mark; + struct audit_chunk *chunk; +}; + +enum { + HASH_SIZE = 128, +}; + +struct vma_swap_readahead { + short unsigned int win; + short unsigned int offset; + short unsigned int nr_pte; + pte_t *ptes; +}; + +typedef struct dentry *instantiate_t(struct dentry *, struct task_struct *, const void *); + +struct fd_data { + fmode_t mode; + unsigned int fd; +}; + +enum { + ES_WRITTEN_B = 0, + ES_UNWRITTEN_B = 1, + ES_DELAYED_B = 2, + ES_HOLE_B = 3, + ES_REFERENCED_B = 4, + ES_FLAGS = 5, +}; + +struct pending_reservation { + struct rb_node rb_node; + ext4_lblk_t lclu; +}; + +struct rsvd_count { + int ndelonly; + bool first_do_lblk_found; + ext4_lblk_t first_do_lblk; + ext4_lblk_t last_do_lblk; + struct extent_status *left_es; + bool partial; + ext4_lblk_t lclu; +}; + +struct sockaddr_alg_new { + __u16 salg_family; + __u8 salg_type[14]; + __u32 salg_feat; + __u32 salg_mask; + __u8 salg_name[0]; +}; + +struct af_alg_iv { + __u32 ivlen; + __u8 iv[0]; +}; + +struct cmsghdr { + __kernel_size_t cmsg_len; + int cmsg_level; + int cmsg_type; +}; + +struct net_proto_family { + int family; + int (*create)(struct net *, struct socket *, int, int); + struct module *owner; +}; + +struct af_alg_type; + +struct alg_sock { + struct sock sk; + struct sock *parent; + atomic_t refcnt; + atomic_t nokey_refcnt; + const struct af_alg_type *type; + void *private; +}; + +struct af_alg_type { + void * (*bind)(const char *, u32, u32); + void (*release)(void *); + int (*setkey)(void *, const u8 *, unsigned int); + int (*setentropy)(void *, sockptr_t, unsigned int); + int (*accept)(void *, struct sock *); + int (*accept_nokey)(void *, struct sock *); + int (*setauthsize)(void *, unsigned int); + struct proto_ops *ops; + struct proto_ops *ops_nokey; + struct module *owner; + char name[14]; +}; + +struct af_alg_control { + struct af_alg_iv *iv; + int op; + unsigned int aead_assoclen; +}; + +struct af_alg_sgl { + struct scatterlist sg[17]; + struct page *pages[16]; + unsigned int npages; +}; + +struct af_alg_tsgl { + struct list_head list; + unsigned int cur; + struct scatterlist sg[0]; +}; + +struct af_alg_rsgl { + struct af_alg_sgl sgl; + struct list_head list; + size_t sg_num_bytes; +}; + +struct af_alg_async_req { + struct kiocb *iocb; + struct sock *sk; + struct af_alg_rsgl first_rsgl; + struct af_alg_rsgl *last_rsgl; + struct list_head rsgl_list; + struct scatterlist *tsgl; + unsigned int tsgl_entries; + unsigned int outlen; + unsigned int areqlen; + union { + struct aead_request aead_req; + struct skcipher_request skcipher_req; + } cra_u; +}; + +struct af_alg_ctx { + struct list_head tsgl_list; + void *iv; + size_t aead_assoclen; + struct crypto_wait wait; + size_t used; + atomic_t rcvused; + bool more; + bool merge; + bool enc; + bool init; + unsigned int len; +}; + +struct alg_type_list { + const struct af_alg_type *type; + struct list_head list; +}; + +struct kbdiacruc { + unsigned int diacr; + unsigned int base; + unsigned int result; +}; + +enum fixed_addresses { + FIX_HOLE = 0, + FIX_FDT_END = 1, + FIX_FDT = 1024, + FIX_EARLYCON_MEM_BASE = 1025, + FIX_TEXT_POKE0 = 1026, + FIX_ENTRY_TRAMP_TEXT4 = 1027, + FIX_ENTRY_TRAMP_TEXT3 = 1028, + FIX_ENTRY_TRAMP_TEXT2 = 1029, + FIX_ENTRY_TRAMP_TEXT1 = 1030, + __end_of_permanent_fixed_addresses = 1031, + FIX_BTMAP_END = 1031, + FIX_BTMAP_BEGIN = 1478, + FIX_PTE = 1479, + FIX_PMD = 1480, + FIX_PUD = 1481, + FIX_PGD = 1482, + __end_of_fixed_addresses = 1483, +}; + +struct hid_debug_list { + struct { + union { + struct __kfifo kfifo; + char *type; + const char *const_type; + char (*rectype)[0]; + char *ptr; + const char *ptr_const; + }; + char buf[0]; + } hid_debug_fifo; + struct fasync_struct *fasync; + struct hid_device *hdev; + struct list_head node; + struct mutex read_mutex; +}; + +struct hid_usage_entry { + unsigned int page; + unsigned int usage; + const char *description; +}; + +struct nf_log_buf { + unsigned int count; + char buf[1020]; +}; + +enum bug_trap_type { + BUG_TRAP_TYPE_NONE = 0, + BUG_TRAP_TYPE_WARN = 1, + BUG_TRAP_TYPE_BUG = 2, +}; + +enum ftr_type { + FTR_EXACT = 0, + FTR_LOWER_SAFE = 1, + FTR_HIGHER_SAFE = 2, + FTR_HIGHER_OR_ZERO_SAFE = 3, +}; + +struct arm64_ftr_bits { + bool sign; + bool visible; + bool strict; + enum ftr_type type; + u8 shift; + u8 width; + s64 safe_val; +}; + +struct arm64_ftr_override { + u64 val; + u64 mask; +}; + +struct arm64_ftr_reg { + const char *name; + u64 strict_mask; + u64 user_mask; + u64 sys_val; + u64 user_val; + struct arm64_ftr_override *override; + const struct arm64_ftr_bits *ftr_bits; +}; + +enum siginfo_layout { + SIL_KILL = 0, + SIL_TIMER = 1, + SIL_POLL = 2, + SIL_FAULT = 3, + SIL_FAULT_TRAPNO = 4, + SIL_FAULT_MCEERR = 5, + SIL_FAULT_BNDERR = 6, + SIL_FAULT_PKUERR = 7, + SIL_FAULT_PERF_EVENT = 8, + SIL_CHLD = 9, + SIL_RT = 10, + SIL_SYS = 11, +}; + +struct sys64_hook { + long unsigned int esr_mask; + long unsigned int esr_val; + void (*handler)(long unsigned int, struct pt_regs *); +}; + +enum { + IRQ_SET_MASK_OK = 0, + IRQ_SET_MASK_OK_NOCOPY = 1, + IRQ_SET_MASK_OK_DONE = 2, +}; + +enum { + IRQC_IS_HARDIRQ = 0, + IRQC_IS_NESTED = 1, +}; + +enum { + IRQTF_RUNTHREAD = 0, + IRQTF_WARNED = 1, + IRQTF_AFFINITY = 2, + IRQTF_FORCED_THREAD = 3, + IRQTF_READY = 4, +}; + +enum ring_buffer_type { + RINGBUF_TYPE_DATA_TYPE_LEN_MAX = 28, + RINGBUF_TYPE_PADDING = 29, + RINGBUF_TYPE_TIME_EXTEND = 30, + RINGBUF_TYPE_TIME_STAMP = 31, +}; + +struct ring_buffer_per_cpu; + +struct buffer_page; + +struct ring_buffer_iter { + struct ring_buffer_per_cpu *cpu_buffer; + long unsigned int head; + long unsigned int next_event; + struct buffer_page *head_page; + struct buffer_page *cache_reader_page; + long unsigned int cache_read; + u64 read_stamp; + u64 page_stamp; + struct ring_buffer_event *event; + int missed_events; +}; + +struct rb_irq_work { + struct irq_work work; + wait_queue_head_t waiters; + wait_queue_head_t full_waiters; + long int wait_index; + bool waiters_pending; + bool full_waiters_pending; + bool wakeup_full; +}; + +struct trace_buffer { + unsigned int flags; + int cpus; + atomic_t record_disabled; + cpumask_var_t cpumask; + struct lock_class_key *reader_lock_key; + struct mutex mutex; + struct ring_buffer_per_cpu **buffers; + struct hlist_node node; + u64 (*clock)(); + struct rb_irq_work irq_work; + bool time_stamp_abs; +}; + +enum { + RB_LEN_TIME_EXTEND = 8, + RB_LEN_TIME_STAMP = 8, +}; + +struct buffer_data_page { + u64 time_stamp; + local_t commit; + unsigned char data[0]; +}; + +struct buffer_page { + struct list_head list; + local_t write; + unsigned int read; + local_t entries; + long unsigned int real_end; + struct buffer_data_page *page; +}; + +struct rb_event_info { + u64 ts; + u64 delta; + u64 before; + u64 after; + long unsigned int length; + struct buffer_page *tail_page; + int add_timestamp; +}; + +enum { + RB_ADD_STAMP_NONE = 0, + RB_ADD_STAMP_EXTEND = 2, + RB_ADD_STAMP_ABSOLUTE = 4, + RB_ADD_STAMP_FORCE = 8, +}; + +enum { + RB_CTX_TRANSITION = 0, + RB_CTX_NMI = 1, + RB_CTX_IRQ = 2, + RB_CTX_SOFTIRQ = 3, + RB_CTX_NORMAL = 4, + RB_CTX_MAX = 5, +}; + +struct rb_time_struct { + local64_t time; +}; + +typedef struct rb_time_struct rb_time_t; + +struct ring_buffer_per_cpu { + int cpu; + atomic_t record_disabled; + atomic_t resize_disabled; + struct trace_buffer *buffer; + raw_spinlock_t reader_lock; + arch_spinlock_t lock; + struct lock_class_key lock_key; + struct buffer_data_page *free_page; + long unsigned int nr_pages; + unsigned int current_context; + struct list_head *pages; + struct buffer_page *head_page; + struct buffer_page *tail_page; + struct buffer_page *commit_page; + struct buffer_page *reader_page; + long unsigned int lost_events; + long unsigned int last_overrun; + long unsigned int nest; + local_t entries_bytes; + local_t entries; + local_t overrun; + local_t commit_overrun; + local_t dropped_events; + local_t committing; + local_t commits; + local_t pages_touched; + local_t pages_lost; + local_t pages_read; + long int last_pages_touch; + size_t shortest_full; + long unsigned int read; + long unsigned int read_bytes; + rb_time_t write_stamp; + rb_time_t before_stamp; + u64 event_stamp[5]; + u64 read_stamp; + long int nr_pages_to_update; + struct list_head new_pages; + struct work_struct update_pages_work; + struct completion update_done; + struct rb_irq_work irq_work; +}; + +struct p9_qid { + u8 type; + u32 version; + u64 path; +}; + +struct p9_fid { + struct p9_client *clnt; + u32 fid; + refcount_t count; + int mode; + struct p9_qid qid; + u32 iounit; + kuid_t uid; + void *rdir; + struct hlist_node dlist; + struct hlist_node ilist; +}; + +enum p9_session_flags { + V9FS_PROTO_2000U = 1, + V9FS_PROTO_2000L = 2, + V9FS_ACCESS_SINGLE = 4, + V9FS_ACCESS_USER = 8, + V9FS_ACCESS_CLIENT = 16, + V9FS_POSIX_ACL = 32, +}; + +struct v9fs_session_info { + unsigned char flags; + unsigned char nodev; + short unsigned int debug; + unsigned int afid; + unsigned int cache; + char *uname; + char *aname; + unsigned int maxdata; + kuid_t dfltuid; + kgid_t dfltgid; + kuid_t uid; + struct p9_client *clnt; + struct list_head slist; + struct rw_semaphore rename_sem; + long int session_lock_timeout; +}; + +enum x509_akid_actions { + ACT_x509_akid_note_kid = 0, + ACT_x509_akid_note_name = 1, + ACT_x509_akid_note_serial = 2, + ACT_x509_extract_name_segment = 3, + ACT_x509_note_OID = 4, + NR__x509_akid_actions = 5, +}; + +typedef int get_block_t(struct inode *, sector_t, struct buffer_head *, int); + +enum iter_type { + ITER_IOVEC = 0, + ITER_KVEC = 1, + ITER_BVEC = 2, + ITER_PIPE = 3, + ITER_XARRAY = 4, + ITER_DISCARD = 5, + ITER_UBUF = 6, +}; + +enum { + BIOSET_NEED_BVECS = 1, + BIOSET_NEED_RESCUER = 2, + BIOSET_PERCPU_CACHE = 4, +}; + +enum { + DIO_SHOULD_DIRTY = 1, + DIO_IS_SYNC = 2, +}; + +struct blkdev_dio { + union { + struct kiocb *iocb; + struct task_struct *waiter; + }; + size_t size; + atomic_t ref; + unsigned int flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bio bio; + long: 64; + long: 64; +}; + +struct io_ring_ctx; + +struct io_wq; + +struct io_uring_task { + int cached_refs; + const struct io_ring_ctx *last; + struct io_wq *io_wq; + struct file *registered_rings[16]; + struct xarray xa; + struct wait_queue_head wait; + atomic_t in_idle; + atomic_t inflight_tracked; + struct percpu_counter inflight; + long: 64; + long: 64; + long: 64; + long: 64; + struct { + struct llist_head task_list; + struct callback_head task_work; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; +}; + +struct io_uring_sqe { + __u8 opcode; + __u8 flags; + __u16 ioprio; + __s32 fd; + union { + __u64 off; + __u64 addr2; + struct { + __u32 cmd_op; + __u32 __pad1; + }; + }; + union { + __u64 addr; + __u64 splice_off_in; + }; + __u32 len; + union { + __kernel_rwf_t rw_flags; + __u32 fsync_flags; + __u16 poll_events; + __u32 poll32_events; + __u32 sync_range_flags; + __u32 msg_flags; + __u32 timeout_flags; + __u32 accept_flags; + __u32 cancel_flags; + __u32 open_flags; + __u32 statx_flags; + __u32 fadvise_advice; + __u32 splice_flags; + __u32 rename_flags; + __u32 unlink_flags; + __u32 hardlink_flags; + __u32 xattr_flags; + __u32 msg_ring_flags; + __u32 uring_cmd_flags; + }; + __u64 user_data; + union { + __u16 buf_index; + __u16 buf_group; + }; + __u16 personality; + union { + __s32 splice_fd_in; + __u32 file_index; + struct { + __u16 addr_len; + __u16 __pad3[1]; + }; + }; + union { + struct { + __u64 addr3; + __u64 __pad2[1]; + }; + __u8 cmd[0]; + }; +}; + +struct io_uring_cqe { + __u64 user_data; + __s32 res; + __u32 flags; + __u64 big_cqe[0]; +}; + +enum { + IORING_CQE_BUFFER_SHIFT = 16, +}; + +struct io_uring_buf { + __u64 addr; + __u32 len; + __u16 bid; + __u16 resv; +}; + +struct io_uring_buf_ring { + union { + struct { + __u64 resv1; + __u32 resv2; + __u16 resv3; + __u16 tail; + }; + struct io_uring_buf bufs[0]; + }; +}; + +struct io_uring_buf_reg { + __u64 ring_addr; + __u32 ring_entries; + __u16 bgid; + __u16 pad; + __u64 resv[3]; +}; + +enum io_uring_cmd_flags { + IO_URING_F_COMPLETE_DEFER = 1, + IO_URING_F_UNLOCKED = 2, + IO_URING_F_MULTISHOT = 4, + IO_URING_F_IOWQ = 8, + IO_URING_F_NONBLOCK = -2147483648, + IO_URING_F_SQE128 = 256, + IO_URING_F_CQE32 = 512, + IO_URING_F_IOPOLL = 1024, +}; + +struct io_wq_work_node { + struct io_wq_work_node *next; +}; + +struct io_wq_work_list { + struct io_wq_work_node *first; + struct io_wq_work_node *last; +}; + +struct io_wq_work { + struct io_wq_work_node list; + unsigned int flags; + int cancel_seq; +}; + +struct io_fixed_file { + long unsigned int file_ptr; +}; + +struct io_file_table { + struct io_fixed_file *files; + long unsigned int *bitmap; + unsigned int alloc_hint; +}; + +struct io_hash_bucket { + spinlock_t lock; + struct hlist_head list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_hash_table { + struct io_hash_bucket *hbs; + unsigned int hash_bits; +}; + +struct io_kiocb; + +struct io_submit_link { + struct io_kiocb *head; + struct io_kiocb *last; +}; + +struct io_submit_state { + struct io_wq_work_node free_list; + struct io_wq_work_list compl_reqs; + struct io_submit_link link; + bool plug_started; + bool need_plug; + short unsigned int submit_nr; + unsigned int cqes_count; + struct blk_plug plug; + struct io_uring_cqe cqes[16]; +}; + +struct io_alloc_cache { + struct hlist_head list; + unsigned int nr_cached; +}; + +struct io_restriction { + long unsigned int register_op[1]; + long unsigned int sqe_op[1]; + u8 sqe_flags_allowed; + u8 sqe_flags_required; + bool registered; +}; + +struct io_rings; + +struct io_rsrc_node; + +struct io_mapped_ubuf; + +struct io_buffer_list; + +struct io_sq_data; + +struct io_ev_fd; + +struct io_rsrc_data; + +struct io_wq_hash; + +struct io_ring_ctx { + struct { + struct percpu_ref refs; + struct io_rings *rings; + unsigned int flags; + enum task_work_notify_mode notify_method; + unsigned int compat: 1; + unsigned int drain_next: 1; + unsigned int restricted: 1; + unsigned int off_timeout_used: 1; + unsigned int drain_active: 1; + unsigned int drain_disabled: 1; + unsigned int has_evfd: 1; + unsigned int syscall_iopoll: 1; + unsigned int task_complete: 1; + long: 55; + long: 64; + long: 64; + long: 64; + }; + struct { + struct mutex uring_lock; + u32 *sq_array; + struct io_uring_sqe *sq_sqes; + unsigned int cached_sq_head; + unsigned int sq_entries; + struct io_rsrc_node *rsrc_node; + int rsrc_cached_refs; + atomic_t cancel_seq; + struct io_file_table file_table; + unsigned int nr_user_files; + unsigned int nr_user_bufs; + struct io_mapped_ubuf **user_bufs; + struct io_submit_state submit_state; + struct io_buffer_list *io_bl; + struct xarray io_bl_xa; + struct list_head io_buffers_cache; + struct io_hash_table cancel_table_locked; + struct list_head cq_overflow_list; + struct io_alloc_cache apoll_cache; + struct io_alloc_cache netmsg_cache; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct io_wq_work_list locked_free_list; + unsigned int locked_free_nr; + const struct cred *sq_creds; + struct io_sq_data *sq_data; + struct wait_queue_head sqo_sq_wait; + struct list_head sqd_list; + long unsigned int check_cq; + unsigned int file_alloc_start; + unsigned int file_alloc_end; + struct xarray personalities; + u32 pers_next; + long: 32; + long: 64; + long: 64; + struct { + struct io_uring_cqe *cqe_cached; + struct io_uring_cqe *cqe_sentinel; + unsigned int cached_cq_tail; + unsigned int cq_entries; + struct io_ev_fd *io_ev_fd; + struct wait_queue_head cq_wait; + unsigned int cq_extra; + long: 32; + long: 64; + }; + struct { + spinlock_t completion_lock; + struct io_wq_work_list iopoll_list; + struct io_hash_table cancel_table; + bool poll_multi_queue; + struct llist_head work_llist; + struct list_head io_buffers_comp; + }; + struct { + spinlock_t timeout_lock; + atomic_t cq_timeouts; + struct list_head timeout_list; + struct list_head ltimeout_list; + unsigned int cq_last_tm_flush; + long: 32; + long: 64; + long: 64; + }; + struct io_restriction restrictions; + struct task_struct *submitter_task; + struct io_rsrc_node *rsrc_backup_node; + struct io_mapped_ubuf *dummy_ubuf; + struct io_rsrc_data *file_data; + struct io_rsrc_data *buf_data; + struct delayed_work rsrc_put_work; + struct callback_head rsrc_put_tw; + struct llist_head rsrc_put_llist; + struct list_head rsrc_ref_list; + spinlock_t rsrc_ref_lock; + struct list_head io_buffers_pages; + struct socket *ring_sock; + struct io_wq_hash *hash_map; + struct user_struct *user; + struct mm_struct *mm_account; + struct llist_head fallback_llist; + struct delayed_work fallback_work; + struct work_struct exit_work; + struct list_head tctx_list; + struct completion ref_comp; + u32 iowq_limits[2]; + bool iowq_limits_set; + struct list_head defer_list; + unsigned int sq_thread_idle; + unsigned int evfd_last_cq_tail; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_uring { + u32 head; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 tail; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct io_rings { + struct io_uring sq; + struct io_uring cq; + u32 sq_ring_mask; + u32 cq_ring_mask; + u32 sq_ring_entries; + u32 cq_ring_entries; + u32 sq_dropped; + atomic_t sq_flags; + u32 cq_flags; + u32 cq_overflow; + long: 64; + long: 64; + long: 64; + long: 64; + struct io_uring_cqe cqes[0]; +}; + +struct io_cmd_data { + struct file *file; + __u8 data[56]; +}; + +struct io_cqe { + __u64 user_data; + __s32 res; + union { + __u32 flags; + int fd; + }; +}; + +typedef void (*io_req_tw_func_t)(struct io_kiocb *, bool *); + +struct io_task_work { + struct llist_node node; + io_req_tw_func_t func; +}; + +struct io_buffer; + +struct async_poll; + +struct io_kiocb { + union { + struct file *file; + struct io_cmd_data cmd; + }; + u8 opcode; + u8 iopoll_completed; + u16 buf_index; + unsigned int flags; + struct io_cqe cqe; + struct io_ring_ctx *ctx; + struct task_struct *task; + struct io_rsrc_node *rsrc_node; + union { + struct io_mapped_ubuf *imu; + struct io_buffer *kbuf; + struct io_buffer_list *buf_list; + }; + union { + struct io_wq_work_node comp_list; + __poll_t apoll_events; + }; + atomic_t refs; + atomic_t poll_refs; + struct io_task_work io_task_work; + union { + struct hlist_node hash_node; + struct { + u64 extra1; + u64 extra2; + }; + }; + struct async_poll *apoll; + void *async_data; + struct io_kiocb *link; + const struct cred *creds; + struct io_wq_work work; +}; + +struct io_ev_fd { + struct eventfd_ctx *cq_ev_fd; + unsigned int eventfd_async: 1; + struct callback_head rcu; + atomic_t refs; + atomic_t ops; +}; + +struct io_buffer_list { + union { + struct list_head buf_list; + struct { + struct page **buf_pages; + struct io_uring_buf_ring *buf_ring; + }; + }; + __u16 bgid; + __u16 buf_nr_pages; + __u16 nr_entries; + __u16 head; + __u16 mask; +}; + +struct io_wq_hash { + refcount_t refs; + long unsigned int map; + struct wait_queue_head wait; +}; + +enum { + REQ_F_FIXED_FILE = 1, + REQ_F_IO_DRAIN = 2, + REQ_F_LINK = 4, + REQ_F_HARDLINK = 8, + REQ_F_FORCE_ASYNC = 16, + REQ_F_BUFFER_SELECT = 32, + REQ_F_CQE_SKIP = 64, + REQ_F_FAIL = 256, + REQ_F_INFLIGHT = 512, + REQ_F_CUR_POS = 1024, + REQ_F_NOWAIT = 2048, + REQ_F_LINK_TIMEOUT = 4096, + REQ_F_NEED_CLEANUP = 8192, + REQ_F_POLLED = 16384, + REQ_F_BUFFER_SELECTED = 32768, + REQ_F_BUFFER_RING = 65536, + REQ_F_REISSUE = 131072, + REQ_F_SUPPORT_NOWAIT = 1073741824, + REQ_F_ISREG = 2147483648, + REQ_F_CREDS = 262144, + REQ_F_REFCOUNT = 524288, + REQ_F_ARM_LTIMEOUT = 1048576, + REQ_F_ASYNC_DATA = 2097152, + REQ_F_SKIP_LINK_CQES = 4194304, + REQ_F_SINGLE_POLL = 8388608, + REQ_F_DOUBLE_POLL = 16777216, + REQ_F_PARTIAL_IO = 33554432, + REQ_F_APOLL_MULTISHOT = 134217728, + REQ_F_CQE32_INIT = 67108864, + REQ_F_CLEAR_POLLIN = 268435456, + REQ_F_HASH_LOCKED = 536870912, +}; + +struct io_buffer { + struct list_head list; + __u64 addr; + __u32 len; + __u16 bid; + __u16 bgid; +}; + +enum { + IOU_OK = 0, + IOU_ISSUE_SKIP_COMPLETE = -529, + IOU_STOP_MULTISHOT = -125, +}; + +struct io_provide_buf { + struct file *file; + __u64 addr; + __u32 len; + __u32 bgid; + __u16 nbufs; + __u16 bid; +}; + +enum pci_dev_flags { + PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = 1, + PCI_DEV_FLAGS_NO_D3 = 2, + PCI_DEV_FLAGS_ASSIGNED = 4, + PCI_DEV_FLAGS_ACS_ENABLED_QUIRK = 8, + PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = 32, + PCI_DEV_FLAGS_NO_BUS_RESET = 64, + PCI_DEV_FLAGS_NO_PM_RESET = 128, + PCI_DEV_FLAGS_VPD_REF_F0 = 256, + PCI_DEV_FLAGS_BRIDGE_XLATE_ROOT = 512, + PCI_DEV_FLAGS_NO_FLR_RESET = 1024, + PCI_DEV_FLAGS_NO_RELAXED_ORDERING = 2048, + PCI_DEV_FLAGS_HAS_MSI_MASKING = 4096, +}; + +enum pci_bus_flags { + PCI_BUS_FLAGS_NO_MSI = 1, + PCI_BUS_FLAGS_NO_MMRBC = 2, + PCI_BUS_FLAGS_NO_AERSID = 4, + PCI_BUS_FLAGS_NO_EXTCFG = 8, +}; + +enum pcie_bus_config_types { + PCIE_BUS_TUNE_OFF = 0, + PCIE_BUS_DEFAULT = 1, + PCIE_BUS_SAFE = 2, + PCIE_BUS_PERFORMANCE = 3, + PCIE_BUS_PEER2PEER = 4, +}; + +struct pci_fixup { + u16 vendor; + u16 device; + u32 class; + unsigned int class_shift; + int hook_offset; +}; + +enum pci_fixup_pass { + pci_fixup_early = 0, + pci_fixup_header = 1, + pci_fixup_final = 2, + pci_fixup_enable = 3, + pci_fixup_resume = 4, + pci_fixup_suspend = 5, + pci_fixup_resume_early = 6, + pci_fixup_suspend_late = 7, +}; + +struct software_node { + const char *name; + const struct software_node *parent; + const struct property_entry *properties; +}; + +enum { + NVME_REG_CAP = 0, + NVME_REG_VS = 8, + NVME_REG_INTMS = 12, + NVME_REG_INTMC = 16, + NVME_REG_CC = 20, + NVME_REG_CSTS = 28, + NVME_REG_NSSR = 32, + NVME_REG_AQA = 36, + NVME_REG_ASQ = 40, + NVME_REG_ACQ = 48, + NVME_REG_CMBLOC = 56, + NVME_REG_CMBSZ = 60, + NVME_REG_BPINFO = 64, + NVME_REG_BPRSEL = 68, + NVME_REG_BPMBL = 72, + NVME_REG_CMBMSC = 80, + NVME_REG_CRTO = 104, + NVME_REG_PMRCAP = 3584, + NVME_REG_PMRCTL = 3588, + NVME_REG_PMRSTS = 3592, + NVME_REG_PMREBS = 3596, + NVME_REG_PMRSWTP = 3600, + NVME_REG_DBS = 4096, +}; + +enum { + NVME_CC_ENABLE = 1, + NVME_CC_EN_SHIFT = 0, + NVME_CC_CSS_SHIFT = 4, + NVME_CC_MPS_SHIFT = 7, + NVME_CC_AMS_SHIFT = 11, + NVME_CC_SHN_SHIFT = 14, + NVME_CC_IOSQES_SHIFT = 16, + NVME_CC_IOCQES_SHIFT = 20, + NVME_CC_CSS_NVM = 0, + NVME_CC_CSS_CSI = 96, + NVME_CC_CSS_MASK = 112, + NVME_CC_AMS_RR = 0, + NVME_CC_AMS_WRRU = 2048, + NVME_CC_AMS_VS = 14336, + NVME_CC_SHN_NONE = 0, + NVME_CC_SHN_NORMAL = 16384, + NVME_CC_SHN_ABRUPT = 32768, + NVME_CC_SHN_MASK = 49152, + NVME_CC_IOSQES = 393216, + NVME_CC_IOCQES = 4194304, + NVME_CC_CRIME = 16777216, +}; + +enum { + NVME_CSTS_RDY = 1, + NVME_CSTS_CFS = 2, + NVME_CSTS_NSSRO = 16, + NVME_CSTS_PP = 32, + NVME_CSTS_SHST_NORMAL = 0, + NVME_CSTS_SHST_OCCUR = 4, + NVME_CSTS_SHST_CMPLT = 8, + NVME_CSTS_SHST_MASK = 12, +}; + +enum { + NVME_AEN_BIT_NS_ATTR = 8, + NVME_AEN_BIT_FW_ACT = 9, + NVME_AEN_BIT_ANA_CHANGE = 11, + NVME_AEN_BIT_DISC_CHANGE = 31, +}; + +enum { + SWITCHTEC_GAS_MRPC_OFFSET = 0, + SWITCHTEC_GAS_TOP_CFG_OFFSET = 4096, + SWITCHTEC_GAS_SW_EVENT_OFFSET = 6144, + SWITCHTEC_GAS_SYS_INFO_OFFSET = 8192, + SWITCHTEC_GAS_FLASH_INFO_OFFSET = 8704, + SWITCHTEC_GAS_PART_CFG_OFFSET = 16384, + SWITCHTEC_GAS_NTB_OFFSET = 65536, + SWITCHTEC_GAS_PFF_CSR_OFFSET = 1261568, +}; + +enum { + SWITCHTEC_NTB_REG_INFO_OFFSET = 0, + SWITCHTEC_NTB_REG_CTRL_OFFSET = 16384, + SWITCHTEC_NTB_REG_DBMSG_OFFSET = 409600, +}; + +struct nt_partition_info { + u32 xlink_enabled; + u32 target_part_low; + u32 target_part_high; + u32 reserved; +}; + +struct ntb_info_regs { + u8 partition_count; + u8 partition_id; + u16 reserved1; + u64 ep_map; + u16 requester_id; + u16 reserved2; + u32 reserved3[4]; + struct nt_partition_info ntp_info[48]; +} __attribute__((packed)); + +struct ntb_ctrl_regs { + u32 partition_status; + u32 partition_op; + u32 partition_ctrl; + u32 bar_setup; + u32 bar_error; + u16 lut_table_entries; + u16 lut_table_offset; + u32 lut_error; + u16 req_id_table_size; + u16 req_id_table_offset; + u32 req_id_error; + u32 reserved1[7]; + struct { + u32 ctl; + u32 win_size; + u64 xlate_addr; + } bar_entry[6]; + struct { + u32 win_size; + u32 reserved[3]; + } bar_ext_entry[6]; + u32 reserved2[192]; + u32 req_id_table[512]; + u32 reserved3[256]; + u64 lut_entry[512]; +}; + +struct pci_cap_saved_data { + u16 cap_nr; + bool cap_extended; + unsigned int size; + u32 data[0]; +}; + +struct pci_cap_saved_state { + struct hlist_node next; + struct pci_cap_saved_data cap; +}; + +struct pci_dev_reset_methods { + u16 vendor; + u16 device; + int (*reset)(struct pci_dev *, bool); +}; + +struct pci_dev_acs_enabled { + u16 vendor; + u16 device; + int (*acs_enabled)(struct pci_dev *, u16); +}; + +struct pci_dev_acs_ops { + u16 vendor; + u16 device; + int (*enable_acs)(struct pci_dev *); + int (*disable_acs_redir)(struct pci_dev *); +}; + +typedef struct { + efi_guid_t guid; + u32 table; +} efi_config_table_32_t; + +typedef union { + struct { + efi_guid_t guid; + void *table; + }; + efi_config_table_32_t mixed_mode; +} efi_config_table_t; + +typedef struct { + efi_guid_t guid; + long unsigned int *ptr; + const char name[16]; +} efi_config_table_type_t; + +struct efi_memory_map_data { + phys_addr_t phys_map; + long unsigned int size; + long unsigned int desc_version; + long unsigned int desc_size; + long unsigned int flags; +}; + +struct flow_dissector_mpls_lse { + u32 mpls_ttl: 8; + u32 mpls_bos: 1; + u32 mpls_tc: 3; + u32 mpls_label: 20; +}; + +struct flow_dissector_key_mpls { + struct flow_dissector_mpls_lse ls[7]; + u8 used_lses; +}; + +struct flow_dissector_key_enc_opts { + u8 data[255]; + u8 len; + __be16 dst_opt_type; +}; + +struct flow_dissector_key_arp { + __u32 sip; + __u32 tip; + __u8 op; + unsigned char sha[6]; + unsigned char tha[6]; +}; + +struct flow_dissector_key_ports_range { + union { + struct flow_dissector_key_ports tp; + struct { + struct flow_dissector_key_ports tp_min; + struct flow_dissector_key_ports tp_max; + }; + }; +}; + +struct flow_dissector_key_eth_addrs { + unsigned char dst[6]; + unsigned char src[6]; +}; + +struct flow_dissector_key_tcp { + __be16 flags; +}; + +struct flow_dissector_key_ip { + __u8 tos; + __u8 ttl; +}; + +struct flow_dissector_key_meta { + int ingress_ifindex; + u16 ingress_iftype; +}; + +struct flow_dissector_key_ct { + u16 ct_state; + u16 ct_zone; + u32 ct_mark; + u32 ct_labels[4]; +}; + +struct flow_dissector_key_pppoe { + __be16 session_id; + __be16 ppp_proto; + __be16 type; +}; + +struct flow_dissector_key_l2tpv3 { + __be32 session_id; +}; + +struct flow_match { + struct flow_dissector *dissector; + void *mask; + void *key; +}; + +struct flow_match_meta { + struct flow_dissector_key_meta *key; + struct flow_dissector_key_meta *mask; +}; + +struct flow_match_basic { + struct flow_dissector_key_basic *key; + struct flow_dissector_key_basic *mask; +}; + +struct flow_match_control { + struct flow_dissector_key_control *key; + struct flow_dissector_key_control *mask; +}; + +struct flow_match_eth_addrs { + struct flow_dissector_key_eth_addrs *key; + struct flow_dissector_key_eth_addrs *mask; +}; + +struct flow_match_vlan { + struct flow_dissector_key_vlan *key; + struct flow_dissector_key_vlan *mask; +}; + +struct flow_match_arp { + struct flow_dissector_key_arp *key; + struct flow_dissector_key_arp *mask; +}; + +struct flow_match_ipv4_addrs { + struct flow_dissector_key_ipv4_addrs *key; + struct flow_dissector_key_ipv4_addrs *mask; +}; + +struct flow_match_ipv6_addrs { + struct flow_dissector_key_ipv6_addrs *key; + struct flow_dissector_key_ipv6_addrs *mask; +}; + +struct flow_match_ip { + struct flow_dissector_key_ip *key; + struct flow_dissector_key_ip *mask; +}; + +struct flow_match_ports { + struct flow_dissector_key_ports *key; + struct flow_dissector_key_ports *mask; +}; + +struct flow_match_ports_range { + struct flow_dissector_key_ports_range *key; + struct flow_dissector_key_ports_range *mask; +}; + +struct flow_match_icmp { + struct flow_dissector_key_icmp *key; + struct flow_dissector_key_icmp *mask; +}; + +struct flow_match_tcp { + struct flow_dissector_key_tcp *key; + struct flow_dissector_key_tcp *mask; +}; + +struct flow_match_mpls { + struct flow_dissector_key_mpls *key; + struct flow_dissector_key_mpls *mask; +}; + +struct flow_match_enc_keyid { + struct flow_dissector_key_keyid *key; + struct flow_dissector_key_keyid *mask; +}; + +struct flow_match_enc_opts { + struct flow_dissector_key_enc_opts *key; + struct flow_dissector_key_enc_opts *mask; +}; + +struct flow_match_ct { + struct flow_dissector_key_ct *key; + struct flow_dissector_key_ct *mask; +}; + +struct flow_match_pppoe { + struct flow_dissector_key_pppoe *key; + struct flow_dissector_key_pppoe *mask; +}; + +struct flow_match_l2tpv3 { + struct flow_dissector_key_l2tpv3 *key; + struct flow_dissector_key_l2tpv3 *mask; +}; + +struct flow_rule { + struct flow_match match; + struct flow_action action; +}; + +struct flow_indr_dev { + struct list_head list; + flow_indr_block_bind_cb_t *cb; + void *cb_priv; + refcount_t refcnt; +}; + +struct flow_indir_dev_info { + void *data; + struct net_device *dev; + struct Qdisc *sch; + enum tc_setup_type type; + void (*cleanup)(struct flow_block_cb *); + struct list_head list; + enum flow_block_command command; + enum flow_block_binder_type binder_type; + struct list_head *cb_list; +}; + +enum ip_conntrack_events { + IPCT_NEW = 0, + IPCT_RELATED = 1, + IPCT_DESTROY = 2, + IPCT_REPLY = 3, + IPCT_ASSURED = 4, + IPCT_PROTOINFO = 5, + IPCT_HELPER = 6, + IPCT_MARK = 7, + IPCT_SEQADJ = 8, + IPCT_NATSEQADJ = 8, + IPCT_SECMARK = 9, + IPCT_LABEL = 10, + IPCT_SYNPROXY = 11, + __IPCT_MAX = 12, +}; + +enum ct_dccp_roles { + CT_DCCP_ROLE_CLIENT = 0, + CT_DCCP_ROLE_SERVER = 1, + __CT_DCCP_ROLE_MAX = 2, +}; + +struct dccp_hdr_ext { + __be32 dccph_seq_low; +}; + +struct dccp_hdr_ack_bits { + __be16 dccph_reserved1; + __be16 dccph_ack_nr_high; + __be32 dccph_ack_nr_low; +}; + +enum dccp_pkt_type { + DCCP_PKT_REQUEST = 0, + DCCP_PKT_RESPONSE = 1, + DCCP_PKT_DATA = 2, + DCCP_PKT_ACK = 3, + DCCP_PKT_DATAACK = 4, + DCCP_PKT_CLOSEREQ = 5, + DCCP_PKT_CLOSE = 6, + DCCP_PKT_RESET = 7, + DCCP_PKT_SYNC = 8, + DCCP_PKT_SYNCACK = 9, + DCCP_PKT_INVALID = 10, +}; + +struct ip_tunnel_net { + struct net_device *fb_tunnel_dev; + struct rtnl_link_ops *rtnl_link_ops; + struct hlist_head tunnels[128]; + struct ip_tunnel *collect_md_tun; + int type; +}; + +struct fdt_errtabent { + const char *str; +}; + +struct efi_file_path_dev_path { + struct efi_generic_dev_path header; + efi_char16_t filename[0]; +}; + +union efi_device_path_from_text_protocol { + struct { + efi_device_path_protocol_t * (*convert_text_to_device_node)(const efi_char16_t *); + efi_device_path_protocol_t * (*convert_text_to_device_path)(const efi_char16_t *); + }; + struct { + u32 convert_text_to_device_node; + u32 convert_text_to_device_path; + } mixed_mode; +}; + +typedef union efi_device_path_from_text_protocol efi_device_path_from_text_protocol_t; + +typedef union { + struct { + u32 revision; + efi_handle_t parent_handle; + efi_system_table_t *system_table; + efi_handle_t device_handle; + void *file_path; + void *reserved; + u32 load_options_size; + void *load_options; + void *image_base; + __u64 image_size; + unsigned int image_code_type; + unsigned int image_data_type; + efi_status_t (*unload)(efi_handle_t); + }; + struct { + u32 revision; + u32 parent_handle; + u32 system_table; + u32 device_handle; + u32 file_path; + u32 reserved; + u32 load_options_size; + u32 load_options; + u32 image_base; + __u64 image_size; + u32 image_code_type; + u32 image_data_type; + u32 unload; + } mixed_mode; +} efi_loaded_image_t; + +typedef struct { + u64 size; + u64 file_size; + u64 phys_size; + efi_time_t create_time; + efi_time_t last_access_time; + efi_time_t modification_time; + __u64 attribute; + efi_char16_t filename[0]; +} efi_file_info_t; + +union efi_file_protocol; + +typedef union efi_file_protocol efi_file_protocol_t; + +union efi_file_protocol { + struct { + u64 revision; + efi_status_t (*open)(efi_file_protocol_t *, efi_file_protocol_t **, efi_char16_t *, u64, u64); + efi_status_t (*close)(efi_file_protocol_t *); + efi_status_t (*delete)(efi_file_protocol_t *); + efi_status_t (*read)(efi_file_protocol_t *, long unsigned int *, void *); + efi_status_t (*write)(efi_file_protocol_t *, long unsigned int, void *); + efi_status_t (*get_position)(efi_file_protocol_t *, u64 *); + efi_status_t (*set_position)(efi_file_protocol_t *, u64); + efi_status_t (*get_info)(efi_file_protocol_t *, efi_guid_t *, long unsigned int *, void *); + efi_status_t (*set_info)(efi_file_protocol_t *, efi_guid_t *, long unsigned int, void *); + efi_status_t (*flush)(efi_file_protocol_t *); + }; + struct { + u64 revision; + u32 open; + u32 close; + u32 delete; + u32 read; + u32 write; + u32 get_position; + u32 set_position; + u32 get_info; + u32 set_info; + u32 flush; + } mixed_mode; +}; + +union efi_simple_file_system_protocol; + +typedef union efi_simple_file_system_protocol efi_simple_file_system_protocol_t; + +union efi_simple_file_system_protocol { + struct { + u64 revision; + efi_status_t (*open_volume)(efi_simple_file_system_protocol_t *, efi_file_protocol_t **); + }; + struct { + u64 revision; + u32 open_volume; + } mixed_mode; +}; + +struct finfo { + efi_file_info_t info; + efi_char16_t filename[256]; +}; + +struct trace_event_raw_mm_lru_insertion { + struct trace_entry ent; + struct folio *folio; + long unsigned int pfn; + enum lru_list lru; + long unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_mm_lru_activate { + struct trace_entry ent; + struct folio *folio; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_lru_insertion {}; + +struct trace_event_data_offsets_mm_lru_activate {}; + +typedef void (*btf_trace_mm_lru_insertion)(void *, struct folio *); + +typedef void (*btf_trace_mm_lru_activate)(void *, struct folio *); + +struct lru_rotate { + local_lock_t lock; + struct folio_batch fbatch; +}; + +struct cpu_fbatches { + local_lock_t lock; + struct folio_batch lru_add; + struct folio_batch lru_deactivate_file; + struct folio_batch lru_deactivate; + struct folio_batch lru_lazyfree; + struct folio_batch activate; +}; + +typedef void (*move_fn_t)(struct lruvec *, struct folio *); + +struct bt_iter_data { + struct blk_mq_hw_ctx *hctx; + struct request_queue *q; + busy_tag_iter_fn *fn; + void *data; + bool reserved; +}; + +struct bt_tags_iter_data { + struct blk_mq_tags *tags; + busy_tag_iter_fn *fn; + void *data; + unsigned int flags; +}; + +enum io_uring_op { + IORING_OP_NOP = 0, + IORING_OP_READV = 1, + IORING_OP_WRITEV = 2, + IORING_OP_FSYNC = 3, + IORING_OP_READ_FIXED = 4, + IORING_OP_WRITE_FIXED = 5, + IORING_OP_POLL_ADD = 6, + IORING_OP_POLL_REMOVE = 7, + IORING_OP_SYNC_FILE_RANGE = 8, + IORING_OP_SENDMSG = 9, + IORING_OP_RECVMSG = 10, + IORING_OP_TIMEOUT = 11, + IORING_OP_TIMEOUT_REMOVE = 12, + IORING_OP_ACCEPT = 13, + IORING_OP_ASYNC_CANCEL = 14, + IORING_OP_LINK_TIMEOUT = 15, + IORING_OP_CONNECT = 16, + IORING_OP_FALLOCATE = 17, + IORING_OP_OPENAT = 18, + IORING_OP_CLOSE = 19, + IORING_OP_FILES_UPDATE = 20, + IORING_OP_STATX = 21, + IORING_OP_READ = 22, + IORING_OP_WRITE = 23, + IORING_OP_FADVISE = 24, + IORING_OP_MADVISE = 25, + IORING_OP_SEND = 26, + IORING_OP_RECV = 27, + IORING_OP_OPENAT2 = 28, + IORING_OP_EPOLL_CTL = 29, + IORING_OP_SPLICE = 30, + IORING_OP_PROVIDE_BUFFERS = 31, + IORING_OP_REMOVE_BUFFERS = 32, + IORING_OP_TEE = 33, + IORING_OP_SHUTDOWN = 34, + IORING_OP_RENAMEAT = 35, + IORING_OP_UNLINKAT = 36, + IORING_OP_MKDIRAT = 37, + IORING_OP_SYMLINKAT = 38, + IORING_OP_LINKAT = 39, + IORING_OP_MSG_RING = 40, + IORING_OP_FSETXATTR = 41, + IORING_OP_SETXATTR = 42, + IORING_OP_FGETXATTR = 43, + IORING_OP_GETXATTR = 44, + IORING_OP_SOCKET = 45, + IORING_OP_URING_CMD = 46, + IORING_OP_SEND_ZC = 47, + IORING_OP_SENDMSG_ZC = 48, + IORING_OP_LAST = 49, +}; + +struct io_rsrc_node { + struct percpu_ref refs; + struct list_head node; + struct list_head rsrc_list; + struct io_rsrc_data *rsrc_data; + struct llist_node llist; + bool done; +}; + +struct io_mapped_ubuf { + u64 ubuf; + u64 ubuf_end; + unsigned int nr_bvecs; + long unsigned int acct_pages; + struct bio_vec bvec[0]; +}; + +struct io_sq_data { + refcount_t refs; + atomic_t park_pending; + struct mutex lock; + struct list_head ctx_list; + struct task_struct *thread; + struct wait_queue_head wait; + unsigned int sq_thread_idle; + int sq_cpu; + pid_t task_pid; + pid_t task_tgid; + long unsigned int state; + struct completion exited; +}; + +struct io_rsrc_put; + +typedef void rsrc_put_fn(struct io_ring_ctx *, struct io_rsrc_put *); + +struct io_rsrc_data { + struct io_ring_ctx *ctx; + u64 **tags; + unsigned int nr; + rsrc_put_fn *do_put; + atomic_t refs; + struct completion done; + bool quiesce; +}; + +struct io_poll { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + struct wait_queue_entry wait; +}; + +struct io_cache_entry { + struct hlist_node node; +}; + +struct async_poll { + union { + struct io_poll poll; + struct io_cache_entry cache; + }; + struct io_poll *double_poll; +}; + +struct io_op_def { + unsigned int needs_file: 1; + unsigned int plug: 1; + unsigned int hash_reg_file: 1; + unsigned int unbound_nonreg_file: 1; + unsigned int pollin: 1; + unsigned int pollout: 1; + unsigned int poll_exclusive: 1; + unsigned int buffer_select: 1; + unsigned int not_supported: 1; + unsigned int audit_skip: 1; + unsigned int ioprio: 1; + unsigned int iopoll: 1; + unsigned int iopoll_queue: 1; + unsigned int manual_alloc: 1; + short unsigned int async_size; + const char *name; + int (*prep)(struct io_kiocb *, const struct io_uring_sqe *); + int (*issue)(struct io_kiocb *, unsigned int); + int (*prep_async)(struct io_kiocb *); + void (*cleanup)(struct io_kiocb *); + void (*fail)(struct io_kiocb *); +}; + +struct io_rsrc_put { + struct list_head list; + u64 tag; + union { + void *rsrc; + struct file *file; + struct io_mapped_ubuf *buf; + }; +}; + +enum power_supply_property { + POWER_SUPPLY_PROP_STATUS = 0, + POWER_SUPPLY_PROP_CHARGE_TYPE = 1, + POWER_SUPPLY_PROP_HEALTH = 2, + POWER_SUPPLY_PROP_PRESENT = 3, + POWER_SUPPLY_PROP_ONLINE = 4, + POWER_SUPPLY_PROP_AUTHENTIC = 5, + POWER_SUPPLY_PROP_TECHNOLOGY = 6, + POWER_SUPPLY_PROP_CYCLE_COUNT = 7, + POWER_SUPPLY_PROP_VOLTAGE_MAX = 8, + POWER_SUPPLY_PROP_VOLTAGE_MIN = 9, + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN = 10, + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN = 11, + POWER_SUPPLY_PROP_VOLTAGE_NOW = 12, + POWER_SUPPLY_PROP_VOLTAGE_AVG = 13, + POWER_SUPPLY_PROP_VOLTAGE_OCV = 14, + POWER_SUPPLY_PROP_VOLTAGE_BOOT = 15, + POWER_SUPPLY_PROP_CURRENT_MAX = 16, + POWER_SUPPLY_PROP_CURRENT_NOW = 17, + POWER_SUPPLY_PROP_CURRENT_AVG = 18, + POWER_SUPPLY_PROP_CURRENT_BOOT = 19, + POWER_SUPPLY_PROP_POWER_NOW = 20, + POWER_SUPPLY_PROP_POWER_AVG = 21, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN = 22, + POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN = 23, + POWER_SUPPLY_PROP_CHARGE_FULL = 24, + POWER_SUPPLY_PROP_CHARGE_EMPTY = 25, + POWER_SUPPLY_PROP_CHARGE_NOW = 26, + POWER_SUPPLY_PROP_CHARGE_AVG = 27, + POWER_SUPPLY_PROP_CHARGE_COUNTER = 28, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT = 29, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX = 30, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE = 31, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX = 32, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT = 33, + POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX = 34, + POWER_SUPPLY_PROP_CHARGE_CONTROL_START_THRESHOLD = 35, + POWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD = 36, + POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR = 37, + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT = 38, + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT = 39, + POWER_SUPPLY_PROP_INPUT_POWER_LIMIT = 40, + POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN = 41, + POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN = 42, + POWER_SUPPLY_PROP_ENERGY_FULL = 43, + POWER_SUPPLY_PROP_ENERGY_EMPTY = 44, + POWER_SUPPLY_PROP_ENERGY_NOW = 45, + POWER_SUPPLY_PROP_ENERGY_AVG = 46, + POWER_SUPPLY_PROP_CAPACITY = 47, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN = 48, + POWER_SUPPLY_PROP_CAPACITY_ALERT_MAX = 49, + POWER_SUPPLY_PROP_CAPACITY_ERROR_MARGIN = 50, + POWER_SUPPLY_PROP_CAPACITY_LEVEL = 51, + POWER_SUPPLY_PROP_TEMP = 52, + POWER_SUPPLY_PROP_TEMP_MAX = 53, + POWER_SUPPLY_PROP_TEMP_MIN = 54, + POWER_SUPPLY_PROP_TEMP_ALERT_MIN = 55, + POWER_SUPPLY_PROP_TEMP_ALERT_MAX = 56, + POWER_SUPPLY_PROP_TEMP_AMBIENT = 57, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN = 58, + POWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX = 59, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW = 60, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG = 61, + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW = 62, + POWER_SUPPLY_PROP_TIME_TO_FULL_AVG = 63, + POWER_SUPPLY_PROP_TYPE = 64, + POWER_SUPPLY_PROP_USB_TYPE = 65, + POWER_SUPPLY_PROP_SCOPE = 66, + POWER_SUPPLY_PROP_PRECHARGE_CURRENT = 67, + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT = 68, + POWER_SUPPLY_PROP_CALIBRATE = 69, + POWER_SUPPLY_PROP_MANUFACTURE_YEAR = 70, + POWER_SUPPLY_PROP_MANUFACTURE_MONTH = 71, + POWER_SUPPLY_PROP_MANUFACTURE_DAY = 72, + POWER_SUPPLY_PROP_MODEL_NAME = 73, + POWER_SUPPLY_PROP_MANUFACTURER = 74, + POWER_SUPPLY_PROP_SERIAL_NUMBER = 75, +}; + +enum power_supply_type { + POWER_SUPPLY_TYPE_UNKNOWN = 0, + POWER_SUPPLY_TYPE_BATTERY = 1, + POWER_SUPPLY_TYPE_UPS = 2, + POWER_SUPPLY_TYPE_MAINS = 3, + POWER_SUPPLY_TYPE_USB = 4, + POWER_SUPPLY_TYPE_USB_DCP = 5, + POWER_SUPPLY_TYPE_USB_CDP = 6, + POWER_SUPPLY_TYPE_USB_ACA = 7, + POWER_SUPPLY_TYPE_USB_TYPE_C = 8, + POWER_SUPPLY_TYPE_USB_PD = 9, + POWER_SUPPLY_TYPE_USB_PD_DRP = 10, + POWER_SUPPLY_TYPE_APPLE_BRICK_ID = 11, + POWER_SUPPLY_TYPE_WIRELESS = 12, +}; + +enum power_supply_usb_type { + POWER_SUPPLY_USB_TYPE_UNKNOWN = 0, + POWER_SUPPLY_USB_TYPE_SDP = 1, + POWER_SUPPLY_USB_TYPE_DCP = 2, + POWER_SUPPLY_USB_TYPE_CDP = 3, + POWER_SUPPLY_USB_TYPE_ACA = 4, + POWER_SUPPLY_USB_TYPE_C = 5, + POWER_SUPPLY_USB_TYPE_PD = 6, + POWER_SUPPLY_USB_TYPE_PD_DRP = 7, + POWER_SUPPLY_USB_TYPE_PD_PPS = 8, + POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID = 9, +}; + +union power_supply_propval { + int intval; + const char *strval; +}; + +struct power_supply_config { + struct device_node *of_node; + struct fwnode_handle *fwnode; + void *drv_data; + const struct attribute_group **attr_grp; + char **supplied_to; + size_t num_supplicants; +}; + +struct power_supply; + +struct power_supply_desc { + const char *name; + enum power_supply_type type; + const enum power_supply_usb_type *usb_types; + size_t num_usb_types; + const enum power_supply_property *properties; + size_t num_properties; + int (*get_property)(struct power_supply *, enum power_supply_property, union power_supply_propval *); + int (*set_property)(struct power_supply *, enum power_supply_property, const union power_supply_propval *); + int (*property_is_writeable)(struct power_supply *, enum power_supply_property); + void (*external_power_changed)(struct power_supply *); + void (*set_charged)(struct power_supply *); + bool no_thermal; + int use_for_apm; +}; + +struct power_supply { + const struct power_supply_desc *desc; + char **supplied_to; + size_t num_supplicants; + char **supplied_from; + size_t num_supplies; + struct device_node *of_node; + void *drv_data; + struct device dev; + struct work_struct changed_work; + struct delayed_work deferred_register_work; + spinlock_t changed_lock; + bool changed; + bool initialized; + bool removing; + atomic_t use_cnt; + struct thermal_zone_device *tzd; + struct thermal_cooling_device *tcd; +}; + +struct acpi_bus_event { + struct list_head node; + acpi_device_class device_class; + acpi_bus_id bus_id; + u32 type; + u32 data; +}; + +struct acpi_ac { + struct power_supply *charger; + struct power_supply_desc charger_desc; + struct acpi_device *device; + long long unsigned int state; + struct notifier_block battery_nb; +}; + +enum TPM_OPS_FLAGS { + TPM_OPS_AUTO_STARTUP = 1, +}; + +enum tpm_timeout { + TPM_TIMEOUT = 5, + TPM_TIMEOUT_RETRY = 100, + TPM_TIMEOUT_RANGE_US = 300, + TPM_TIMEOUT_POLL = 1, + TPM_TIMEOUT_USECS_MIN = 100, + TPM_TIMEOUT_USECS_MAX = 500, +}; + +struct wake_irq { + struct device *dev; + unsigned int status; + int irq; + const char *name; +}; + +struct subsys_private { + struct kset subsys; + struct kset *devices_kset; + struct list_head interfaces; + struct mutex mutex; + struct kset *drivers_kset; + struct klist klist_devices; + struct klist klist_drivers; + struct blocking_notifier_head bus_notifier; + unsigned int drivers_autoprobe: 1; + struct bus_type *bus; + struct kset glue_dirs; + struct class *class; +}; + +struct driver_private { + struct kobject kobj; + struct klist klist_devices; + struct klist_node knode_bus; + struct module_kobject *mkobj; + struct device_driver *driver; +}; + +struct device_private { + struct klist klist_children; + struct klist_node knode_parent; + struct klist_node knode_driver; + struct klist_node knode_bus; + struct klist_node knode_class; + struct list_head deferred_probe; + struct device_driver *async_driver; + char *deferred_probe_reason; + struct device *device; + u8 dead: 1; +}; + +struct platform_device_info { + struct device *parent; + struct fwnode_handle *fwnode; + bool of_node_reused; + const char *name; + int id; + const struct resource *res; + unsigned int num_res; + const void *data; + size_t size_data; + u64 dma_mask; + const struct property_entry *properties; +}; + +struct irq_affinity_devres { + unsigned int count; + unsigned int irq[0]; +}; + +struct platform_object { + struct platform_device pdev; + char name[0]; +}; + +struct cyclecounter { + u64 (*read)(const struct cyclecounter *); + u64 mask; + u32 mult; + u32 shift; +}; + +struct timecounter { + const struct cyclecounter *cc; + u64 cycle_last; + u64 nsec; + u64 mask; + u64 frac; +}; + +struct system_device_crosststamp { + ktime_t device; + ktime_t sys_realtime; + ktime_t sys_monoraw; +}; + +struct kthread_work; + +typedef void (*kthread_work_func_t)(struct kthread_work *); + +struct kthread_worker; + +struct kthread_work { + struct list_head node; + kthread_work_func_t func; + struct kthread_worker *worker; + int canceling; +}; + +struct kthread_worker { + unsigned int flags; + raw_spinlock_t lock; + struct list_head work_list; + struct list_head delayed_work_list; + struct task_struct *task; + struct kthread_work *current_work; +}; + +struct kthread_delayed_work { + struct kthread_work work; + struct timer_list timer; +}; + +struct posix_clock; + +struct posix_clock_operations { + struct module *owner; + int (*clock_adjtime)(struct posix_clock *, struct __kernel_timex *); + int (*clock_gettime)(struct posix_clock *, struct timespec64 *); + int (*clock_getres)(struct posix_clock *, struct timespec64 *); + int (*clock_settime)(struct posix_clock *, const struct timespec64 *); + long int (*ioctl)(struct posix_clock *, unsigned int, long unsigned int); + int (*open)(struct posix_clock *, fmode_t); + __poll_t (*poll)(struct posix_clock *, struct file *, poll_table *); + int (*release)(struct posix_clock *); + ssize_t (*read)(struct posix_clock *, uint, char *, size_t); +}; + +struct posix_clock { + struct posix_clock_operations ops; + struct cdev cdev; + struct device *dev; + struct rw_semaphore rwsem; + bool zombie; +}; + +struct ptp_clock_time { + __s64 sec; + __u32 nsec; + __u32 reserved; +}; + +struct ptp_extts_request { + unsigned int index; + unsigned int flags; + unsigned int rsv[2]; +}; + +struct ptp_perout_request { + union { + struct ptp_clock_time start; + struct ptp_clock_time phase; + }; + struct ptp_clock_time period; + unsigned int index; + unsigned int flags; + union { + struct ptp_clock_time on; + unsigned int rsv[4]; + }; +}; + +enum ptp_pin_function { + PTP_PF_NONE = 0, + PTP_PF_EXTTS = 1, + PTP_PF_PEROUT = 2, + PTP_PF_PHYSYNC = 3, +}; + +struct ptp_pin_desc { + char name[64]; + unsigned int index; + unsigned int func; + unsigned int chan; + unsigned int rsv[5]; +}; + +struct ptp_extts_event { + struct ptp_clock_time t; + unsigned int index; + unsigned int flags; + unsigned int rsv[2]; +}; + +struct pps_ktime { + __s64 sec; + __s32 nsec; + __u32 flags; +}; + +struct pps_kparams { + int api_version; + int mode; + struct pps_ktime assert_off_tu; + struct pps_ktime clear_off_tu; +}; + +struct pps_device; + +struct pps_source_info { + char name[32]; + char path[32]; + int mode; + void (*echo)(struct pps_device *, int, void *); + struct module *owner; + struct device *dev; +}; + +struct pps_device { + struct pps_source_info info; + struct pps_kparams params; + __u32 assert_sequence; + __u32 clear_sequence; + struct pps_ktime assert_tu; + struct pps_ktime clear_tu; + int current_mode; + unsigned int last_ev; + wait_queue_head_t queue; + unsigned int id; + const void *lookup_cookie; + struct cdev cdev; + struct device *dev; + struct fasync_struct *async_queue; + spinlock_t lock; +}; + +struct ptp_clock_request { + enum { + PTP_CLK_REQ_EXTTS = 0, + PTP_CLK_REQ_PEROUT = 1, + PTP_CLK_REQ_PPS = 2, + } type; + union { + struct ptp_extts_request extts; + struct ptp_perout_request perout; + }; +}; + +struct ptp_system_timestamp { + struct timespec64 pre_ts; + struct timespec64 post_ts; +}; + +struct ptp_clock_info { + struct module *owner; + char name[32]; + s32 max_adj; + int n_alarm; + int n_ext_ts; + int n_per_out; + int n_pins; + int pps; + struct ptp_pin_desc *pin_config; + int (*adjfine)(struct ptp_clock_info *, long int); + int (*adjphase)(struct ptp_clock_info *, s32); + int (*adjtime)(struct ptp_clock_info *, s64); + int (*gettime64)(struct ptp_clock_info *, struct timespec64 *); + int (*gettimex64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *); + int (*getcrosststamp)(struct ptp_clock_info *, struct system_device_crosststamp *); + int (*settime64)(struct ptp_clock_info *, const struct timespec64 *); + int (*getcycles64)(struct ptp_clock_info *, struct timespec64 *); + int (*getcyclesx64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *); + int (*getcrosscycles)(struct ptp_clock_info *, struct system_device_crosststamp *); + int (*enable)(struct ptp_clock_info *, struct ptp_clock_request *, int); + int (*verify)(struct ptp_clock_info *, unsigned int, enum ptp_pin_function, unsigned int); + long int (*do_aux_work)(struct ptp_clock_info *); +}; + +struct timestamp_event_queue { + struct ptp_extts_event buf[128]; + int head; + int tail; + spinlock_t lock; +}; + +struct ptp_clock { + struct posix_clock clock; + struct device dev; + struct ptp_clock_info *info; + dev_t devid; + int index; + struct pps_device *pps_source; + long int dialed_frequency; + struct timestamp_event_queue tsevq; + struct mutex tsevq_mux; + struct mutex pincfg_mux; + wait_queue_head_t tsev_wq; + int defunct; + struct device_attribute *pin_dev_attr; + struct attribute **pin_attr; + struct attribute_group pin_attr_group; + const struct attribute_group *pin_attr_groups[2]; + struct kthread_worker *kworker; + struct kthread_delayed_work aux_work; + unsigned int max_vclocks; + unsigned int n_vclocks; + int *vclock_index; + struct mutex n_vclocks_mux; + bool is_virtual_clock; + bool has_cycles; +}; + +struct ptp_vclock { + struct ptp_clock *pclock; + struct ptp_clock_info info; + struct ptp_clock *clock; + struct hlist_node vclock_hash_node; + struct cyclecounter cc; + struct timecounter tc; + spinlock_t lock; +}; + +struct __kernel_old_timespec { + __kernel_old_time_t tv_sec; + long int tv_nsec; +}; + +struct __kernel_sock_timeval { + __s64 tv_sec; + __s64 tv_usec; +}; + +struct bpf_empty_prog_array { + struct bpf_prog_array hdr; + struct bpf_prog *null_prog; +}; + +struct user_msghdr { + void *msg_name; + int msg_namelen; + struct iovec *msg_iov; + __kernel_size_t msg_iovlen; + void *msg_control; + __kernel_size_t msg_controllen; + unsigned int msg_flags; +}; + +struct mmsghdr { + struct user_msghdr msg_hdr; + unsigned int msg_len; +}; + +struct scm_timestamping_internal { + struct timespec64 ts[3]; +}; + +struct ifconf { + int ifc_len; + union { + char *ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; +}; + +typedef u32 compat_size_t; + +typedef s32 compat_int_t; + +typedef u32 compat_uint_t; + +typedef u32 compat_ulong_t; + +typedef u32 compat_uptr_t; + +typedef u32 compat_caddr_t; + +struct compat_ifmap { + compat_ulong_t mem_start; + compat_ulong_t mem_end; + short unsigned int base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; +}; + +struct compat_if_settings { + unsigned int type; + unsigned int size; + compat_uptr_t ifs_ifsu; +}; + +struct compat_ifreq { + union { + char ifrn_name[16]; + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + compat_int_t ifru_ivalue; + compat_int_t ifru_mtu; + struct compat_ifmap ifru_map; + char ifru_slave[16]; + char ifru_newname[16]; + compat_caddr_t ifru_data; + struct compat_if_settings ifru_settings; + } ifr_ifru; +}; + +enum { + SKBTX_HW_TSTAMP = 1, + SKBTX_SW_TSTAMP = 2, + SKBTX_IN_PROGRESS = 4, + SKBTX_HW_TSTAMP_USE_CYCLES = 8, + SKBTX_WIFI_STATUS = 16, + SKBTX_HW_TSTAMP_NETDEV = 32, + SKBTX_SCHED_TSTAMP = 64, +}; + +struct scm_ts_pktinfo { + __u32 if_index; + __u32 pkt_length; + __u32 reserved[2]; +}; + +struct sock_skb_cb { + u32 dropcount; +}; + +struct compat_msghdr { + compat_uptr_t msg_name; + compat_int_t msg_namelen; + compat_uptr_t msg_iov; + compat_size_t msg_iovlen; + compat_uptr_t msg_control; + compat_size_t msg_controllen; + compat_uint_t msg_flags; +}; + +struct compat_mmsghdr { + struct compat_msghdr msg_hdr; + compat_uint_t msg_len; +}; + +struct sock_ee_data_rfc4884 { + __u16 len; + __u8 flags; + __u8 reserved; +}; + +struct sock_extended_err { + __u32 ee_errno; + __u8 ee_origin; + __u8 ee_type; + __u8 ee_code; + __u8 ee_pad; + __u32 ee_info; + union { + __u32 ee_data; + struct sock_ee_data_rfc4884 ee_rfc4884; + }; +}; + +struct sock_exterr_skb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + struct sock_extended_err ee; + u16 addr_offset; + __be16 port; + u8 opt_stats: 1; + u8 unused: 7; +}; + +struct net_bridge; + +struct used_address { + struct __kernel_sockaddr_storage name; + unsigned int name_len; +}; + +enum clocksource_ids { + CSID_GENERIC = 0, + CSID_ARM_ARCH_COUNTER = 1, + CSID_MAX = 2, +}; + +enum vdso_clock_mode { + VDSO_CLOCKMODE_NONE = 0, + VDSO_CLOCKMODE_ARCHTIMER = 1, + VDSO_CLOCKMODE_ARCHTIMER_NOCOMPAT = 2, + VDSO_CLOCKMODE_MAX = 3, + VDSO_CLOCKMODE_TIMENS = 2147483647, +}; + +struct clocksource { + u64 (*read)(struct clocksource *); + u64 mask; + u32 mult; + u32 shift; + u64 max_idle_ns; + u32 maxadj; + u32 uncertainty_margin; + u64 max_cycles; + const char *name; + struct list_head list; + int rating; + enum clocksource_ids id; + enum vdso_clock_mode vdso_clock_mode; + long unsigned int flags; + int (*enable)(struct clocksource *); + void (*disable)(struct clocksource *); + void (*suspend)(struct clocksource *); + void (*resume)(struct clocksource *); + void (*mark_unstable)(struct clocksource *); + void (*tick_stable)(struct clocksource *); + struct module *owner; +}; + +enum bpf_task_fd_type { + BPF_FD_TYPE_RAW_TRACEPOINT = 0, + BPF_FD_TYPE_TRACEPOINT = 1, + BPF_FD_TYPE_KPROBE = 2, + BPF_FD_TYPE_KRETPROBE = 3, + BPF_FD_TYPE_UPROBE = 4, + BPF_FD_TYPE_URETPROBE = 5, +}; + +typedef u32 kprobe_opcode_t; + +struct arch_specific_insn { + struct arch_probe_insn api; +}; + +struct freelist_node { + atomic_t refs; + struct freelist_node *next; +}; + +struct freelist_head { + struct freelist_node *head; +}; + +struct kprobe; + +typedef int (*kprobe_pre_handler_t)(struct kprobe *, struct pt_regs *); + +typedef void (*kprobe_post_handler_t)(struct kprobe *, struct pt_regs *, long unsigned int); + +struct kprobe { + struct hlist_node hlist; + struct list_head list; + long unsigned int nmissed; + kprobe_opcode_t *addr; + const char *symbol_name; + unsigned int offset; + kprobe_pre_handler_t pre_handler; + kprobe_post_handler_t post_handler; + kprobe_opcode_t opcode; + struct arch_specific_insn ainsn; + u32 flags; +}; + +struct kretprobe_instance; + +typedef int (*kretprobe_handler_t)(struct kretprobe_instance *, struct pt_regs *); + +struct kretprobe_holder; + +struct kretprobe_instance { + union { + struct freelist_node freelist; + struct callback_head rcu; + }; + struct llist_node llist; + struct kretprobe_holder *rph; + kprobe_opcode_t *ret_addr; + void *fp; + char data[0]; +}; + +struct kretprobe; + +struct kretprobe_holder { + struct kretprobe *rp; + refcount_t ref; +}; + +struct kretprobe { + struct kprobe kp; + kretprobe_handler_t handler; + kretprobe_handler_t entry_handler; + int maxactive; + int nmissed; + size_t data_size; + struct freelist_head freelist; + struct kretprobe_holder *rph; +}; + +enum dynevent_type { + DYNEVENT_TYPE_SYNTH = 1, + DYNEVENT_TYPE_KPROBE = 2, + DYNEVENT_TYPE_NONE = 3, +}; + +struct dynevent_cmd; + +typedef int (*dynevent_create_fn_t)(struct dynevent_cmd *); + +struct dynevent_cmd { + struct seq_buf seq; + const char *event_name; + unsigned int n_fields; + enum dynevent_type type; + dynevent_create_fn_t run_command; + void *private_data; +}; + +struct kprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int ip; +}; + +struct kretprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int func; + long unsigned int ret_ip; +}; + +struct dyn_event; + +struct dyn_event_operations { + struct list_head list; + int (*create)(const char *); + int (*show)(struct seq_file *, struct dyn_event *); + bool (*is_busy)(struct dyn_event *); + int (*free)(struct dyn_event *); + bool (*match)(const char *, const char *, int, const char **, struct dyn_event *); +}; + +struct dyn_event { + struct list_head list; + struct dyn_event_operations *ops; +}; + +typedef int (*dynevent_check_arg_fn_t)(void *); + +struct dynevent_arg { + const char *str; + char separator; +}; + +typedef int (*print_type_func_t)(struct trace_seq *, void *, void *); + +enum fetch_op { + FETCH_OP_NOP = 0, + FETCH_OP_REG = 1, + FETCH_OP_STACK = 2, + FETCH_OP_STACKP = 3, + FETCH_OP_RETVAL = 4, + FETCH_OP_IMM = 5, + FETCH_OP_COMM = 6, + FETCH_OP_ARG = 7, + FETCH_OP_FOFFS = 8, + FETCH_OP_DATA = 9, + FETCH_OP_DEREF = 10, + FETCH_OP_UDEREF = 11, + FETCH_OP_ST_RAW = 12, + FETCH_OP_ST_MEM = 13, + FETCH_OP_ST_UMEM = 14, + FETCH_OP_ST_STRING = 15, + FETCH_OP_ST_USTRING = 16, + FETCH_OP_MOD_BF = 17, + FETCH_OP_LP_ARRAY = 18, + FETCH_OP_TP_ARG = 19, + FETCH_OP_END = 20, + FETCH_NOP_SYMBOL = 21, +}; + +struct fetch_insn { + enum fetch_op op; + union { + unsigned int param; + struct { + unsigned int size; + int offset; + }; + struct { + unsigned char basesize; + unsigned char lshift; + unsigned char rshift; + }; + long unsigned int immediate; + void *data; + }; +}; + +struct fetch_type { + const char *name; + size_t size; + int is_signed; + print_type_func_t print; + const char *fmt; + const char *fmttype; +}; + +struct probe_arg { + struct fetch_insn *code; + bool dynamic; + unsigned int offset; + unsigned int count; + const char *name; + const char *comm; + char *fmt; + const struct fetch_type *type; +}; + +struct trace_uprobe_filter { + rwlock_t rwlock; + int nr_systemwide; + struct list_head perf_events; +}; + +struct trace_probe_event { + unsigned int flags; + struct trace_event_class class; + struct trace_event_call call; + struct list_head files; + struct list_head probes; + struct trace_uprobe_filter filter[0]; +}; + +struct trace_probe { + struct list_head list; + struct trace_probe_event *event; + ssize_t size; + unsigned int nr_args; + struct probe_arg args[0]; +}; + +struct event_file_link { + struct trace_event_file *file; + struct list_head list; +}; + +enum probe_print_type { + PROBE_PRINT_NORMAL = 0, + PROBE_PRINT_RETURN = 1, + PROBE_PRINT_EVENT = 2, +}; + +enum { + TP_ERR_FILE_NOT_FOUND = 0, + TP_ERR_NO_REGULAR_FILE = 1, + TP_ERR_BAD_REFCNT = 2, + TP_ERR_REFCNT_OPEN_BRACE = 3, + TP_ERR_BAD_REFCNT_SUFFIX = 4, + TP_ERR_BAD_UPROBE_OFFS = 5, + TP_ERR_MAXACT_NO_KPROBE = 6, + TP_ERR_BAD_MAXACT = 7, + TP_ERR_MAXACT_TOO_BIG = 8, + TP_ERR_BAD_PROBE_ADDR = 9, + TP_ERR_BAD_RETPROBE = 10, + TP_ERR_BAD_ADDR_SUFFIX = 11, + TP_ERR_NO_GROUP_NAME = 12, + TP_ERR_GROUP_TOO_LONG = 13, + TP_ERR_BAD_GROUP_NAME = 14, + TP_ERR_NO_EVENT_NAME = 15, + TP_ERR_EVENT_TOO_LONG = 16, + TP_ERR_BAD_EVENT_NAME = 17, + TP_ERR_EVENT_EXIST = 18, + TP_ERR_RETVAL_ON_PROBE = 19, + TP_ERR_BAD_STACK_NUM = 20, + TP_ERR_BAD_ARG_NUM = 21, + TP_ERR_BAD_VAR = 22, + TP_ERR_BAD_REG_NAME = 23, + TP_ERR_BAD_MEM_ADDR = 24, + TP_ERR_BAD_IMM = 25, + TP_ERR_IMMSTR_NO_CLOSE = 26, + TP_ERR_FILE_ON_KPROBE = 27, + TP_ERR_BAD_FILE_OFFS = 28, + TP_ERR_SYM_ON_UPROBE = 29, + TP_ERR_TOO_MANY_OPS = 30, + TP_ERR_DEREF_NEED_BRACE = 31, + TP_ERR_BAD_DEREF_OFFS = 32, + TP_ERR_DEREF_OPEN_BRACE = 33, + TP_ERR_COMM_CANT_DEREF = 34, + TP_ERR_BAD_FETCH_ARG = 35, + TP_ERR_ARRAY_NO_CLOSE = 36, + TP_ERR_BAD_ARRAY_SUFFIX = 37, + TP_ERR_BAD_ARRAY_NUM = 38, + TP_ERR_ARRAY_TOO_BIG = 39, + TP_ERR_BAD_TYPE = 40, + TP_ERR_BAD_STRING = 41, + TP_ERR_BAD_BITFIELD = 42, + TP_ERR_ARG_NAME_TOO_LONG = 43, + TP_ERR_NO_ARG_NAME = 44, + TP_ERR_BAD_ARG_NAME = 45, + TP_ERR_USED_ARG_NAME = 46, + TP_ERR_ARG_TOO_LONG = 47, + TP_ERR_NO_ARG_BODY = 48, + TP_ERR_BAD_INSN_BNDRY = 49, + TP_ERR_FAIL_REG_PROBE = 50, + TP_ERR_DIFF_PROBE_TYPE = 51, + TP_ERR_DIFF_ARG_TYPE = 52, + TP_ERR_SAME_PROBE = 53, + TP_ERR_NO_EVENT_INFO = 54, + TP_ERR_BAD_ATTACH_EVENT = 55, + TP_ERR_BAD_ATTACH_ARG = 56, + TP_ERR_NO_EP_FILTER = 57, +}; + +struct trace_kprobe { + struct dyn_event devent; + struct kretprobe rp; + long unsigned int *nhit; + const char *symbol; + struct trace_probe tp; +}; + +struct irq_poll; + +typedef int irq_poll_fn(struct irq_poll *, int); + +struct irq_poll { + struct list_head list; + long unsigned int state; + int weight; + irq_poll_fn *poll; +}; + +enum { + IRQ_POLL_F_SCHED = 0, + IRQ_POLL_F_DISABLE = 1, +}; + +struct u32_fract { + __u32 numerator; + __u32 denominator; +}; + +struct clk_core; + +struct clk_hw; + +struct clk_rate_request { + struct clk_core *core; + long unsigned int rate; + long unsigned int min_rate; + long unsigned int max_rate; + long unsigned int best_parent_rate; + struct clk_hw *best_parent_hw; +}; + +struct clk_init_data; + +struct clk_hw { + struct clk_core *core; + struct clk *clk; + const struct clk_init_data *init; +}; + +struct clk_duty { + unsigned int num; + unsigned int den; +}; + +struct clk_ops { + int (*prepare)(struct clk_hw *); + void (*unprepare)(struct clk_hw *); + int (*is_prepared)(struct clk_hw *); + void (*unprepare_unused)(struct clk_hw *); + int (*enable)(struct clk_hw *); + void (*disable)(struct clk_hw *); + int (*is_enabled)(struct clk_hw *); + void (*disable_unused)(struct clk_hw *); + int (*save_context)(struct clk_hw *); + void (*restore_context)(struct clk_hw *); + long unsigned int (*recalc_rate)(struct clk_hw *, long unsigned int); + long int (*round_rate)(struct clk_hw *, long unsigned int, long unsigned int *); + int (*determine_rate)(struct clk_hw *, struct clk_rate_request *); + int (*set_parent)(struct clk_hw *, u8); + u8 (*get_parent)(struct clk_hw *); + int (*set_rate)(struct clk_hw *, long unsigned int, long unsigned int); + int (*set_rate_and_parent)(struct clk_hw *, long unsigned int, long unsigned int, u8); + long unsigned int (*recalc_accuracy)(struct clk_hw *, long unsigned int); + int (*get_phase)(struct clk_hw *); + int (*set_phase)(struct clk_hw *, int); + int (*get_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*set_duty_cycle)(struct clk_hw *, struct clk_duty *); + int (*init)(struct clk_hw *); + void (*terminate)(struct clk_hw *); + void (*debug_init)(struct clk_hw *, struct dentry *); +}; + +struct clk_parent_data { + const struct clk_hw *hw; + const char *fw_name; + const char *name; + int index; +}; + +struct clk_init_data { + const char *name; + const struct clk_ops *ops; + const char * const *parent_names; + const struct clk_parent_data *parent_data; + const struct clk_hw **parent_hws; + u8 num_parents; + long unsigned int flags; +}; + +struct clk_fractional_divider { + struct clk_hw hw; + void *reg; + u8 mshift; + u8 mwidth; + u32 mmask; + u8 nshift; + u8 nwidth; + u32 nmask; + u8 flags; + void (*approximation)(struct clk_hw *, long unsigned int, long unsigned int *, long unsigned int *, long unsigned int *); + spinlock_t *lock; +}; + +struct input_mt_slot { + int abs[14]; + unsigned int frame; + unsigned int key; +}; + +struct input_mt { + int trkid; + int num_slots; + int slot; + unsigned int flags; + unsigned int frame; + int *red; + struct input_mt_slot slots[0]; +}; + +struct input_mt_pos { + s16 x; + s16 y; +}; + +enum { + TCA_STATS_UNSPEC = 0, + TCA_STATS_BASIC = 1, + TCA_STATS_RATE_EST = 2, + TCA_STATS_QUEUE = 3, + TCA_STATS_APP = 4, + TCA_STATS_RATE_EST64 = 5, + TCA_STATS_PAD = 6, + TCA_STATS_BASIC_HW = 7, + TCA_STATS_PKT64 = 8, + __TCA_STATS_MAX = 9, +}; + +struct gnet_stats_basic { + __u64 bytes; + __u32 packets; +}; + +struct gnet_stats_rate_est { + __u32 bps; + __u32 pps; +}; + +struct gnet_stats_rate_est64 { + __u64 bps; + __u64 pps; +}; + +struct flow_keys_basic { + struct flow_dissector_key_control control; + struct flow_dissector_key_basic basic; +}; + +struct sockaddr_pkt { + short unsigned int spkt_family; + unsigned char spkt_device[14]; + __be16 spkt_protocol; +}; + +struct sockaddr_ll { + short unsigned int sll_family; + __be16 sll_protocol; + int sll_ifindex; + short unsigned int sll_hatype; + unsigned char sll_pkttype; + unsigned char sll_halen; + unsigned char sll_addr[8]; +}; + +struct tpacket_stats { + unsigned int tp_packets; + unsigned int tp_drops; +}; + +struct tpacket_stats_v3 { + unsigned int tp_packets; + unsigned int tp_drops; + unsigned int tp_freeze_q_cnt; +}; + +struct tpacket_rollover_stats { + __u64 tp_all; + __u64 tp_huge; + __u64 tp_failed; +}; + +union tpacket_stats_u { + struct tpacket_stats stats1; + struct tpacket_stats_v3 stats3; +}; + +struct tpacket_auxdata { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; +}; + +struct tpacket_hdr { + long unsigned int tp_status; + unsigned int tp_len; + unsigned int tp_snaplen; + short unsigned int tp_mac; + short unsigned int tp_net; + unsigned int tp_sec; + unsigned int tp_usec; +}; + +struct tpacket2_hdr { + __u32 tp_status; + __u32 tp_len; + __u32 tp_snaplen; + __u16 tp_mac; + __u16 tp_net; + __u32 tp_sec; + __u32 tp_nsec; + __u16 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u8 tp_padding[4]; +}; + +struct tpacket_hdr_variant1 { + __u32 tp_rxhash; + __u32 tp_vlan_tci; + __u16 tp_vlan_tpid; + __u16 tp_padding; +}; + +struct tpacket3_hdr { + __u32 tp_next_offset; + __u32 tp_sec; + __u32 tp_nsec; + __u32 tp_snaplen; + __u32 tp_len; + __u32 tp_status; + __u16 tp_mac; + __u16 tp_net; + union { + struct tpacket_hdr_variant1 hv1; + }; + __u8 tp_padding[8]; +}; + +struct tpacket_bd_ts { + unsigned int ts_sec; + union { + unsigned int ts_usec; + unsigned int ts_nsec; + }; +}; + +struct tpacket_hdr_v1 { + __u32 block_status; + __u32 num_pkts; + __u32 offset_to_first_pkt; + __u32 blk_len; + __u64 seq_num; + struct tpacket_bd_ts ts_first_pkt; + struct tpacket_bd_ts ts_last_pkt; +}; + +union tpacket_bd_header_u { + struct tpacket_hdr_v1 bh1; +}; + +struct tpacket_block_desc { + __u32 version; + __u32 offset_to_priv; + union tpacket_bd_header_u hdr; +}; + +enum tpacket_versions { + TPACKET_V1 = 0, + TPACKET_V2 = 1, + TPACKET_V3 = 2, +}; + +struct tpacket_req { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; +}; + +struct tpacket_req3 { + unsigned int tp_block_size; + unsigned int tp_block_nr; + unsigned int tp_frame_size; + unsigned int tp_frame_nr; + unsigned int tp_retire_blk_tov; + unsigned int tp_sizeof_priv; + unsigned int tp_feature_req_word; +}; + +union tpacket_req_u { + struct tpacket_req req; + struct tpacket_req3 req3; +}; + +struct fanout_args { + __u16 id; + __u16 type_flags; + __u32 max_num_members; +}; + +struct sock_fprog { + short unsigned int len; + struct sock_filter *filter; +}; + +enum nf_dev_hooks { + NF_NETDEV_INGRESS = 0, + NF_NETDEV_EGRESS = 1, + NF_NETDEV_NUMHOOKS = 2, +}; + +typedef int (*bpf_aux_classic_check_t)(struct sock_filter *, unsigned int); + +struct sockcm_cookie { + u64 transmit_time; + u32 mark; + u32 tsflags; +}; + +typedef __u16 __virtio16; + +struct virtio_net_hdr { + __u8 flags; + __u8 gso_type; + __virtio16 hdr_len; + __virtio16 gso_size; + __virtio16 csum_start; + __virtio16 csum_offset; +}; + +struct packet_mclist { + struct packet_mclist *next; + int ifindex; + int count; + short unsigned int type; + short unsigned int alen; + unsigned char addr[32]; +}; + +struct pgv; + +struct tpacket_kbdq_core { + struct pgv *pkbdq; + unsigned int feature_req_word; + unsigned int hdrlen; + unsigned char reset_pending_on_curr_blk; + unsigned char delete_blk_timer; + short unsigned int kactive_blk_num; + short unsigned int blk_sizeof_priv; + short unsigned int last_kactive_blk_num; + char *pkblk_start; + char *pkblk_end; + int kblk_size; + unsigned int max_frame_len; + unsigned int knum_blocks; + uint64_t knxt_seq_num; + char *prev; + char *nxt_offset; + struct sk_buff *skb; + rwlock_t blk_fill_in_prog_lock; + short unsigned int retire_blk_tov; + short unsigned int version; + long unsigned int tov_in_jiffies; + struct timer_list retire_blk_timer; +}; + +struct pgv { + char *buffer; +}; + +struct packet_ring_buffer { + struct pgv *pg_vec; + unsigned int head; + unsigned int frames_per_block; + unsigned int frame_size; + unsigned int frame_max; + unsigned int pg_vec_order; + unsigned int pg_vec_pages; + unsigned int pg_vec_len; + unsigned int *pending_refcnt; + union { + long unsigned int *rx_owner_map; + struct tpacket_kbdq_core prb_bdqc; + }; +}; + +struct packet_fanout { + possible_net_t net; + unsigned int num_members; + u32 max_num_members; + u16 id; + u8 type; + u8 flags; + union { + atomic_t rr_cur; + struct bpf_prog *bpf_prog; + }; + struct list_head list; + spinlock_t lock; + refcount_t sk_ref; + long: 32; + long: 64; + struct packet_type prot_hook; + struct sock *arr[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct packet_rollover { + int sock; + atomic_long_t num; + atomic_long_t num_huge; + atomic_long_t num_failed; + long: 64; + long: 64; + long: 64; + long: 64; + u32 history[16]; +}; + +struct packet_sock { + struct sock sk; + struct packet_fanout *fanout; + union tpacket_stats_u stats; + struct packet_ring_buffer rx_ring; + struct packet_ring_buffer tx_ring; + int copy_thresh; + spinlock_t bind_lock; + struct mutex pg_vec_lock; + unsigned int running; + unsigned int auxdata: 1; + unsigned int origdev: 1; + unsigned int has_vnet_hdr: 1; + unsigned int tp_loss: 1; + unsigned int tp_tx_has_off: 1; + int pressure; + int ifindex; + __be16 num; + struct packet_rollover *rollover; + struct packet_mclist *mclist; + atomic_t mapped; + enum tpacket_versions tp_version; + unsigned int tp_hdrlen; + unsigned int tp_reserve; + unsigned int tp_tstamp; + struct completion skb_completion; + struct net_device *cached_dev; + int (*xmit)(struct sk_buff *); + long: 64; + long: 64; + long: 64; + struct packet_type prot_hook; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + atomic_t tp_drops; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct packet_mreq_max { + int mr_ifindex; + short unsigned int mr_type; + short unsigned int mr_alen; + unsigned char mr_address[32]; +}; + +union tpacket_uhdr { + struct tpacket_hdr *h1; + struct tpacket2_hdr *h2; + struct tpacket3_hdr *h3; + void *raw; +}; + +struct packet_skb_cb { + union { + struct sockaddr_pkt pkt; + union { + unsigned int origlen; + struct sockaddr_ll ll; + }; + } sa; +}; + +struct module_use { + struct list_head source_list; + struct list_head target_list; + struct module *source; + struct module *target; +}; + +struct pcpu_group_info { + int nr_units; + long unsigned int base_offset; + unsigned int *cpu_map; +}; + +struct pcpu_alloc_info { + size_t static_size; + size_t reserved_size; + size_t dyn_size; + size_t unit_size; + size_t atom_size; + size_t alloc_size; + size_t __ai_size; + int nr_groups; + struct pcpu_group_info groups[0]; +}; + +typedef int pcpu_fc_cpu_to_node_fn_t(int); + +typedef int pcpu_fc_cpu_distance_fn_t(unsigned int, unsigned int); + +struct trace_event_raw_percpu_alloc_percpu { + struct trace_entry ent; + long unsigned int call_site; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + void *base_addr; + int off; + void *ptr; + size_t bytes_alloc; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_percpu_free_percpu { + struct trace_entry ent; + void *base_addr; + int off; + void *ptr; + char __data[0]; +}; + +struct trace_event_raw_percpu_alloc_percpu_fail { + struct trace_entry ent; + bool reserved; + bool is_atomic; + size_t size; + size_t align; + char __data[0]; +}; + +struct trace_event_raw_percpu_create_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_raw_percpu_destroy_chunk { + struct trace_entry ent; + void *base_addr; + char __data[0]; +}; + +struct trace_event_data_offsets_percpu_alloc_percpu {}; + +struct trace_event_data_offsets_percpu_free_percpu {}; + +struct trace_event_data_offsets_percpu_alloc_percpu_fail {}; + +struct trace_event_data_offsets_percpu_create_chunk {}; + +struct trace_event_data_offsets_percpu_destroy_chunk {}; + +typedef void (*btf_trace_percpu_alloc_percpu)(void *, long unsigned int, bool, bool, size_t, size_t, void *, int, void *, size_t, gfp_t); + +typedef void (*btf_trace_percpu_free_percpu)(void *, void *, int, void *); + +typedef void (*btf_trace_percpu_alloc_percpu_fail)(void *, bool, bool, size_t, size_t); + +typedef void (*btf_trace_percpu_create_chunk)(void *, void *); + +typedef void (*btf_trace_percpu_destroy_chunk)(void *, void *); + +struct pcpu_block_md { + int scan_hint; + int scan_hint_start; + int contig_hint; + int contig_hint_start; + int left_free; + int right_free; + int first_free; + int nr_bits; +}; + +struct pcpu_chunk { + struct list_head list; + int free_bytes; + struct pcpu_block_md chunk_md; + void *base_addr; + long unsigned int *alloc_map; + long unsigned int *bound_map; + struct pcpu_block_md *md_blocks; + void *data; + bool immutable; + bool isolated; + int start_offset; + int end_offset; + struct obj_cgroup **obj_cgroups; + int nr_pages; + int nr_populated; + int nr_empty_pop_pages; + long unsigned int populated[0]; +}; + +struct pci_dev_resource { + struct list_head list; + struct resource *res; + struct pci_dev *dev; + resource_size_t start; + resource_size_t end; + resource_size_t add_size; + resource_size_t min_align; + long unsigned int flags; +}; + +enum release_type { + leaf_only = 0, + whole_subtree = 1, +}; + +enum enable_type { + undefined = -1, + user_disabled = 0, + auto_disabled = 1, + user_enabled = 2, + auto_enabled = 3, +}; + +struct clk_gate { + struct clk_hw hw; + void *reg; + u8 bit_idx; + u8 flags; + spinlock_t *lock; +}; + +enum { + DUMP_PREFIX_NONE = 0, + DUMP_PREFIX_ADDRESS = 1, + DUMP_PREFIX_OFFSET = 2, +}; + +enum xdp_mem_type { + MEM_TYPE_PAGE_SHARED = 0, + MEM_TYPE_PAGE_ORDER0 = 1, + MEM_TYPE_PAGE_POOL = 2, + MEM_TYPE_XSK_BUFF_POOL = 3, + MEM_TYPE_MAX = 4, +}; + +enum { + IFLA_TUN_UNSPEC = 0, + IFLA_TUN_OWNER = 1, + IFLA_TUN_GROUP = 2, + IFLA_TUN_TYPE = 3, + IFLA_TUN_PI = 4, + IFLA_TUN_VNET_HDR = 5, + IFLA_TUN_PERSIST = 6, + IFLA_TUN_MULTI_QUEUE = 7, + IFLA_TUN_NUM_QUEUES = 8, + IFLA_TUN_NUM_DISABLED_QUEUES = 9, + __IFLA_TUN_MAX = 10, +}; + +enum gro_result { + GRO_MERGED = 0, + GRO_MERGED_FREE = 1, + GRO_HELD = 2, + GRO_NORMAL = 3, + GRO_CONSUMED = 4, +}; + +typedef enum gro_result gro_result_t; + +enum netdev_queue_state_t { + __QUEUE_STATE_DRV_XOFF = 0, + __QUEUE_STATE_STACK_XOFF = 1, + __QUEUE_STATE_FROZEN = 2, +}; + +enum xdp_action { + XDP_ABORTED = 0, + XDP_DROP = 1, + XDP_PASS = 2, + XDP_TX = 3, + XDP_REDIRECT = 4, +}; + +struct tun_pi { + __u16 flags; + __be16 proto; +}; + +struct tun_filter { + __u16 flags; + __u16 count; + __u8 addr[0]; +}; + +struct tun_msg_ctl { + short unsigned int type; + short unsigned int num; + void *ptr; +}; + +struct tun_xdp_hdr { + int buflen; + struct virtio_net_hdr gso; +}; + +enum { + AX25_VALUES_IPDEFMODE = 0, + AX25_VALUES_AXDEFMODE = 1, + AX25_VALUES_BACKOFF = 2, + AX25_VALUES_CONMODE = 3, + AX25_VALUES_WINDOW = 4, + AX25_VALUES_EWINDOW = 5, + AX25_VALUES_T1 = 6, + AX25_VALUES_T2 = 7, + AX25_VALUES_T3 = 8, + AX25_VALUES_IDLE = 9, + AX25_VALUES_N2 = 10, + AX25_VALUES_PACLEN = 11, + AX25_VALUES_PROTOCOL = 12, + AX25_VALUES_DS_TIMEOUT = 13, + AX25_MAX_VALUES = 14, +}; + +struct tap_filter { + unsigned int count; + u32 mask[2]; + unsigned char addr[48]; +}; + +struct tun_struct; + +struct tun_file { + struct sock sk; + struct socket socket; + struct tun_struct *tun; + struct fasync_struct *fasync; + unsigned int flags; + union { + u16 queue_index; + unsigned int ifindex; + }; + struct napi_struct napi; + bool napi_enabled; + bool napi_frags_enabled; + struct mutex napi_mutex; + struct list_head next; + struct tun_struct *detached; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct ptr_ring tx_ring; + struct xdp_rxq_info xdp_rxq; +}; + +struct tun_prog; + +struct tun_struct { + struct tun_file *tfiles[256]; + unsigned int numqueues; + unsigned int flags; + kuid_t owner; + kgid_t group; + struct net_device *dev; + netdev_features_t set_features; + int align; + int vnet_hdr_sz; + int sndbuf; + struct tap_filter txflt; + struct sock_fprog fprog; + bool filter_attached; + u32 msg_enable; + spinlock_t lock; + struct hlist_head flows[1024]; + struct timer_list flow_gc_timer; + long unsigned int ageing_time; + unsigned int numdisabled; + struct list_head disabled; + void *security; + u32 flow_count; + u32 rx_batched; + atomic_long_t rx_frame_errors; + struct bpf_prog *xdp_prog; + struct tun_prog *steering_prog; + struct tun_prog *filter_prog; + struct ethtool_link_ksettings link_ksettings; + struct file *file; + struct ifreq *ifr; +}; + +struct tun_page { + struct page *page; + int count; +}; + +struct tun_flow_entry { + struct hlist_node hash_link; + struct callback_head rcu; + struct tun_struct *tun; + u32 rxhash; + u32 rps_rxhash; + int queue_index; + long: 32; + long: 64; + long unsigned int updated; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct tun_prog { + struct callback_head rcu; + struct bpf_prog *prog; +}; + +struct veth { + __be16 h_vlan_proto; + __be16 h_vlan_TCI; +}; + +struct psci_operations { + u32 (*get_version)(); + int (*cpu_suspend)(u32, long unsigned int); + int (*cpu_off)(u32); + int (*cpu_on)(long unsigned int, long unsigned int); + int (*migrate)(long unsigned int); + int (*affinity_info)(long unsigned int, long unsigned int); + int (*migrate_info_type)(); +}; + +struct fei_attr { + struct list_head list; + struct kprobe kp; + long unsigned int retval; +}; + +enum vmpressure_levels { + VMPRESSURE_LOW = 0, + VMPRESSURE_MEDIUM = 1, + VMPRESSURE_CRITICAL = 2, + VMPRESSURE_NUM_LEVELS = 3, +}; + +enum vmpressure_modes { + VMPRESSURE_NO_PASSTHROUGH = 0, + VMPRESSURE_HIERARCHY = 1, + VMPRESSURE_LOCAL = 2, + VMPRESSURE_NUM_MODES = 3, +}; + +struct vmpressure_event { + struct eventfd_ctx *efd; + enum vmpressure_levels level; + enum vmpressure_modes mode; + struct list_head node; +}; + +struct request_key_auth { + struct callback_head rcu; + struct key *target_key; + struct key *dest_keyring; + const struct cred *cred; + void *callout_info; + size_t callout_len; + pid_t pid; + char op[8]; +}; + +struct crypto_report_acomp { + char type[64]; +}; + +struct acomp_req { + struct crypto_async_request base; + struct scatterlist *src; + struct scatterlist *dst; + unsigned int slen; + unsigned int dlen; + u32 flags; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *__ctx[0]; +}; + +struct crypto_acomp { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_tfm base; +}; + +struct acomp_alg { + int (*compress)(struct acomp_req *); + int (*decompress)(struct acomp_req *); + void (*dst_free)(struct scatterlist *); + int (*init)(struct crypto_acomp *); + void (*exit)(struct crypto_acomp *); + unsigned int reqsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct epoll_event { + __poll_t events; + __u64 data; +}; + +struct io_epoll { + struct file *file; + int epfd; + int op; + int fd; + struct epoll_event event; +}; + +struct assoc_array_ops { + long unsigned int (*get_key_chunk)(const void *, int); + long unsigned int (*get_object_key_chunk)(const void *, int); + bool (*compare_object)(const void *, const void *); + int (*diff_objects)(const void *, const void *); + void (*free_object)(void *); +}; + +struct assoc_array_node { + struct assoc_array_ptr *back_pointer; + u8 parent_slot; + struct assoc_array_ptr *slots[16]; + long unsigned int nr_leaves_on_branch; +}; + +struct assoc_array_shortcut { + struct assoc_array_ptr *back_pointer; + int parent_slot; + int skip_to_level; + struct assoc_array_ptr *next_node; + long unsigned int index_key[0]; +}; + +struct assoc_array_edit { + struct callback_head rcu; + struct assoc_array *array; + const struct assoc_array_ops *ops; + const struct assoc_array_ops *ops_for_excised_subtree; + struct assoc_array_ptr *leaf; + struct assoc_array_ptr **leaf_p; + struct assoc_array_ptr *dead_leaf; + struct assoc_array_ptr *new_meta[3]; + struct assoc_array_ptr *excised_meta[1]; + struct assoc_array_ptr *excised_subtree; + struct assoc_array_ptr **set_backpointers[16]; + struct assoc_array_ptr *set_backpointers_to; + struct assoc_array_node *adjust_count_on; + long int adjust_count_by; + struct { + struct assoc_array_ptr **ptr; + struct assoc_array_ptr *to; + } set[2]; + struct { + u8 *p; + u8 to; + } set_parent_slot[1]; + u8 segment_cache[17]; +}; + +enum assoc_array_walk_status { + assoc_array_walk_tree_empty = 0, + assoc_array_walk_found_terminal_node = 1, + assoc_array_walk_found_wrong_shortcut = 2, +}; + +struct assoc_array_walk_result { + struct { + struct assoc_array_node *node; + int level; + int slot; + } terminal_node; + struct { + struct assoc_array_shortcut *shortcut; + int level; + int sc_level; + long unsigned int sc_segments; + long unsigned int dissimilarity; + } wrong_shortcut; +}; + +struct assoc_array_delete_collapse_context { + struct assoc_array_node *node; + const void *skip_leaf; + int slot; +}; + +typedef unsigned int u_int; + +enum { + KERNEL_PARAM_FL_UNSAFE = 1, + KERNEL_PARAM_FL_HWPARAM = 2, +}; + +struct fb_con2fbmap { + __u32 console; + __u32 framebuffer; +}; + +enum { + FB_BLANK_UNBLANK = 0, + FB_BLANK_NORMAL = 1, + FB_BLANK_VSYNC_SUSPEND = 2, + FB_BLANK_HSYNC_SUSPEND = 3, + FB_BLANK_POWERDOWN = 4, +}; + +enum { + FBCON_LOGO_CANSHOW = -1, + FBCON_LOGO_DRAW = -2, + FBCON_LOGO_DONTSHOW = -3, +}; + +struct cpuidle_state_usage { + long long unsigned int disable; + long long unsigned int usage; + u64 time_ns; + long long unsigned int above; + long long unsigned int below; + long long unsigned int rejected; + long long unsigned int s2idle_usage; + long long unsigned int s2idle_time; +}; + +struct cpuidle_device; + +struct cpuidle_driver; + +struct cpuidle_state { + char name[16]; + char desc[32]; + s64 exit_latency_ns; + s64 target_residency_ns; + unsigned int flags; + unsigned int exit_latency; + int power_usage; + unsigned int target_residency; + int (*enter)(struct cpuidle_device *, struct cpuidle_driver *, int); + int (*enter_dead)(struct cpuidle_device *, int); + int (*enter_s2idle)(struct cpuidle_device *, struct cpuidle_driver *, int); +}; + +struct cpuidle_driver_kobj; + +struct cpuidle_state_kobj; + +struct cpuidle_device_kobj; + +struct cpuidle_device { + unsigned int registered: 1; + unsigned int enabled: 1; + unsigned int poll_time_limit: 1; + unsigned int cpu; + ktime_t next_hrtimer; + int last_state_idx; + u64 last_residency_ns; + u64 poll_limit_ns; + u64 forced_idle_latency_limit_ns; + struct cpuidle_state_usage states_usage[10]; + struct cpuidle_state_kobj *kobjs[10]; + struct cpuidle_driver_kobj *kobj_driver; + struct cpuidle_device_kobj *kobj_dev; + struct list_head device_list; +}; + +struct cpuidle_driver { + const char *name; + struct module *owner; + unsigned int bctimer: 1; + struct cpuidle_state states[10]; + int state_count; + int safe_state_index; + struct cpumask *cpumask; + const char *governor; +}; + +struct cpuidle_governor { + char name[16]; + struct list_head governor_list; + unsigned int rating; + int (*enable)(struct cpuidle_driver *, struct cpuidle_device *); + void (*disable)(struct cpuidle_driver *, struct cpuidle_device *); + int (*select)(struct cpuidle_driver *, struct cpuidle_device *, bool *); + void (*reflect)(struct cpuidle_device *, int); +}; + +enum tick_broadcast_mode { + TICK_BROADCAST_OFF = 0, + TICK_BROADCAST_ON = 1, + TICK_BROADCAST_FORCE = 2, +}; + +struct pcpu_gen_cookie { + local_t nesting; + u64 last; +}; + +struct gen_cookie { + struct pcpu_gen_cookie *local; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + atomic64_t forward_last; + atomic64_t reverse_last; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum { + INET_DIAG_REQ_NONE = 0, + INET_DIAG_REQ_BYTECODE = 1, + INET_DIAG_REQ_SK_BPF_STORAGES = 2, + INET_DIAG_REQ_PROTOCOL = 3, + __INET_DIAG_REQ_MAX = 4, +}; + +struct sock_diag_req { + __u8 sdiag_family; + __u8 sdiag_protocol; +}; + +enum { + SK_MEMINFO_RMEM_ALLOC = 0, + SK_MEMINFO_RCVBUF = 1, + SK_MEMINFO_WMEM_ALLOC = 2, + SK_MEMINFO_SNDBUF = 3, + SK_MEMINFO_FWD_ALLOC = 4, + SK_MEMINFO_WMEM_QUEUED = 5, + SK_MEMINFO_OPTMEM = 6, + SK_MEMINFO_BACKLOG = 7, + SK_MEMINFO_DROPS = 8, + SK_MEMINFO_VARS = 9, +}; + +enum sknetlink_groups { + SKNLGRP_NONE = 0, + SKNLGRP_INET_TCP_DESTROY = 1, + SKNLGRP_INET_UDP_DESTROY = 2, + SKNLGRP_INET6_TCP_DESTROY = 3, + SKNLGRP_INET6_UDP_DESTROY = 4, + __SKNLGRP_MAX = 5, +}; + +struct sock_diag_handler { + __u8 family; + int (*dump)(struct sk_buff *, struct nlmsghdr *); + int (*get_info)(struct sk_buff *, struct sock *); + int (*destroy)(struct sk_buff *, struct nlmsghdr *); +}; + +struct broadcast_sk { + struct sock *sk; + struct work_struct work; +}; + +struct sysrq_key_op { + void (* const handler)(int); + const char * const help_msg; + const char * const action_msg; + const int enable_mask; +}; + +struct audit_parent; + +struct audit_watch { + refcount_t count; + dev_t dev; + char *path; + long unsigned int ino; + struct audit_parent *parent; + struct list_head wlist; + struct list_head rules; +}; + +struct audit_parent { + struct list_head watches; + struct fsnotify_mark mark; +}; + +struct radix_tree_iter { + long unsigned int index; + long unsigned int next_index; + long unsigned int tags; + struct xa_node *node; +}; + +enum { + RADIX_TREE_ITER_TAG_MASK = 15, + RADIX_TREE_ITER_TAGGED = 16, + RADIX_TREE_ITER_CONTIG = 32, +}; + +struct pts_mount_opts { + int setuid; + int setgid; + kuid_t uid; + kgid_t gid; + umode_t mode; + umode_t ptmxmode; + int reserve; + int max; +}; + +enum { + Opt_uid = 0, + Opt_gid = 1, + Opt_mode = 2, + Opt_ptmxmode = 3, + Opt_newinstance = 4, + Opt_max = 5, + Opt_err = 6, +}; + +struct pts_fs_info { + struct ida allocated_ptys; + struct pts_mount_opts mount_opts; + struct super_block *sb; + struct dentry *ptmx_dentry; +}; + +struct p9_stat_dotl { + u64 st_result_mask; + struct p9_qid qid; + u32 st_mode; + kuid_t st_uid; + kgid_t st_gid; + u64 st_nlink; + u64 st_rdev; + u64 st_size; + u64 st_blksize; + u64 st_blocks; + u64 st_atime_sec; + u64 st_atime_nsec; + u64 st_mtime_sec; + u64 st_mtime_nsec; + u64 st_ctime_sec; + u64 st_ctime_nsec; + u64 st_btime_sec; + u64 st_btime_nsec; + u64 st_gen; + u64 st_data_version; +}; + +struct p9_iattr_dotl { + u32 valid; + u32 mode; + kuid_t uid; + kgid_t gid; + u64 size; + u64 atime_sec; + u64 atime_nsec; + u64 mtime_sec; + u64 mtime_nsec; +}; + +enum p9_cache_modes { + CACHE_NONE = 0, + CACHE_MMAP = 1, + CACHE_LOOSE = 2, + CACHE_FSCACHE = 3, + nr__p9_cache_modes = 4, +}; + +struct v9fs_inode { + struct netfs_inode netfs; + struct p9_qid qid; + unsigned int cache_validity; + struct p9_fid *writeback_fid; + struct mutex v_mutex; +}; + +enum fscache_cookie_state { + FSCACHE_COOKIE_STATE_QUIESCENT = 0, + FSCACHE_COOKIE_STATE_LOOKING_UP = 1, + FSCACHE_COOKIE_STATE_CREATING = 2, + FSCACHE_COOKIE_STATE_ACTIVE = 3, + FSCACHE_COOKIE_STATE_INVALIDATING = 4, + FSCACHE_COOKIE_STATE_FAILED = 5, + FSCACHE_COOKIE_STATE_LRU_DISCARDING = 6, + FSCACHE_COOKIE_STATE_WITHDRAWING = 7, + FSCACHE_COOKIE_STATE_RELINQUISHING = 8, + FSCACHE_COOKIE_STATE_DROPPED = 9, +}; + +struct fscache_cache; + +struct fscache_volume { + refcount_t ref; + atomic_t n_cookies; + atomic_t n_accesses; + unsigned int debug_id; + unsigned int key_hash; + u8 *key; + struct list_head proc_link; + struct hlist_bl_node hash_link; + struct work_struct work; + struct fscache_cache *cache; + void *cache_priv; + spinlock_t lock; + long unsigned int flags; + u8 coherency_len; + u8 coherency[0]; +}; + +struct fscache_cookie { + refcount_t ref; + atomic_t n_active; + atomic_t n_accesses; + unsigned int debug_id; + unsigned int inval_counter; + spinlock_t lock; + struct fscache_volume *volume; + void *cache_priv; + struct hlist_bl_node hash_link; + struct list_head proc_link; + struct list_head commit_link; + struct work_struct work; + loff_t object_size; + long unsigned int unused_at; + long unsigned int flags; + enum fscache_cookie_state state; + u8 advice; + u8 key_len; + u8 aux_len; + u32 key_hash; + union { + void *key; + u8 inline_key[16]; + }; + union { + void *aux; + u8 inline_aux[8]; + }; +}; + +struct dotl_openflag_map { + int open_flag; + int dotl_flag; +}; + +struct dotl_iattr_map { + int iattr_valid; + int p9_iattr_valid; +}; + +struct acpi_fan_fps { + u64 control; + u64 trip_point; + u64 speed; + u64 noise_level; + u64 power; + char name[20]; + struct device_attribute dev_attr; +}; + +struct acpi_fan_fif { + u8 revision; + u8 fine_grain_ctrl; + u8 step_size; + u8 low_speed_notification; +}; + +struct acpi_fan_fst { + u64 revision; + u64 control; + u64 speed; +}; + +struct acpi_fan { + bool acpi4; + struct acpi_fan_fif fif; + struct acpi_fan_fps *fps; + int fps_count; + struct thermal_cooling_device *cdev; + struct device_attribute fst_speed; + struct device_attribute fine_grain_control; +}; + +enum { + IFLA_VXLAN_UNSPEC = 0, + IFLA_VXLAN_ID = 1, + IFLA_VXLAN_GROUP = 2, + IFLA_VXLAN_LINK = 3, + IFLA_VXLAN_LOCAL = 4, + IFLA_VXLAN_TTL = 5, + IFLA_VXLAN_TOS = 6, + IFLA_VXLAN_LEARNING = 7, + IFLA_VXLAN_AGEING = 8, + IFLA_VXLAN_LIMIT = 9, + IFLA_VXLAN_PORT_RANGE = 10, + IFLA_VXLAN_PROXY = 11, + IFLA_VXLAN_RSC = 12, + IFLA_VXLAN_L2MISS = 13, + IFLA_VXLAN_L3MISS = 14, + IFLA_VXLAN_PORT = 15, + IFLA_VXLAN_GROUP6 = 16, + IFLA_VXLAN_LOCAL6 = 17, + IFLA_VXLAN_UDP_CSUM = 18, + IFLA_VXLAN_UDP_ZERO_CSUM6_TX = 19, + IFLA_VXLAN_UDP_ZERO_CSUM6_RX = 20, + IFLA_VXLAN_REMCSUM_TX = 21, + IFLA_VXLAN_REMCSUM_RX = 22, + IFLA_VXLAN_GBP = 23, + IFLA_VXLAN_REMCSUM_NOPARTIAL = 24, + IFLA_VXLAN_COLLECT_METADATA = 25, + IFLA_VXLAN_LABEL = 26, + IFLA_VXLAN_GPE = 27, + IFLA_VXLAN_TTL_INHERIT = 28, + IFLA_VXLAN_DF = 29, + IFLA_VXLAN_VNIFILTER = 30, + __IFLA_VXLAN_MAX = 31, +}; + +struct ifla_vxlan_port_range { + __be16 low; + __be16 high; +}; + +enum ifla_vxlan_df { + VXLAN_DF_UNSET = 0, + VXLAN_DF_SET = 1, + VXLAN_DF_INHERIT = 2, + __VXLAN_DF_END = 3, + VXLAN_DF_MAX = 2, +}; + +struct nd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + __u8 opt[0]; +}; + +struct gro_remcsum { + int offset; + __wsum delta; +}; + +enum nexthop_event_type { + NEXTHOP_EVENT_DEL = 0, + NEXTHOP_EVENT_REPLACE = 1, + NEXTHOP_EVENT_RES_TABLE_PRE_REPLACE = 2, + NEXTHOP_EVENT_BUCKET_REPLACE = 3, +}; + +enum nh_notifier_info_type { + NH_NOTIFIER_INFO_TYPE_SINGLE = 0, + NH_NOTIFIER_INFO_TYPE_GRP = 1, + NH_NOTIFIER_INFO_TYPE_RES_TABLE = 2, + NH_NOTIFIER_INFO_TYPE_RES_BUCKET = 3, +}; + +struct nh_notifier_single_info { + struct net_device *dev; + u8 gw_family; + union { + __be32 ipv4; + struct in6_addr ipv6; + }; + u8 is_reject: 1; + u8 is_fdb: 1; + u8 has_encap: 1; +}; + +struct nh_notifier_grp_entry_info { + u8 weight; + u32 id; + struct nh_notifier_single_info nh; +}; + +struct nh_notifier_grp_info { + u16 num_nh; + bool is_fdb; + struct nh_notifier_grp_entry_info nh_entries[0]; +}; + +struct nh_notifier_res_bucket_info { + u16 bucket_index; + unsigned int idle_timer_ms; + bool force; + struct nh_notifier_single_info old_nh; + struct nh_notifier_single_info new_nh; +}; + +struct nh_notifier_res_table_info { + u16 num_nh_buckets; + struct nh_notifier_single_info nhs[0]; +}; + +struct nh_notifier_info { + struct net *net; + struct netlink_ext_ack *extack; + u32 id; + enum nh_notifier_info_type type; + union { + struct nh_notifier_single_info *nh; + struct nh_notifier_grp_info *nh_grp; + struct nh_notifier_res_table_info *nh_res_table; + struct nh_notifier_res_bucket_info *nh_res_bucket; + }; +}; + +typedef int (*udp_tunnel_encap_rcv_t)(struct sock *, struct sk_buff *); + +typedef int (*udp_tunnel_encap_err_lookup_t)(struct sock *, struct sk_buff *); + +typedef void (*udp_tunnel_encap_err_rcv_t)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + +typedef void (*udp_tunnel_encap_destroy_t)(struct sock *); + +typedef struct sk_buff * (*udp_tunnel_gro_receive_t)(struct sock *, struct list_head *, struct sk_buff *); + +typedef int (*udp_tunnel_gro_complete_t)(struct sock *, struct sk_buff *, int); + +struct udp_tunnel_sock_cfg { + void *sk_user_data; + __u8 encap_type; + udp_tunnel_encap_rcv_t encap_rcv; + udp_tunnel_encap_err_lookup_t encap_err_lookup; + udp_tunnel_encap_err_rcv_t encap_err_rcv; + udp_tunnel_encap_destroy_t encap_destroy; + udp_tunnel_gro_receive_t gro_receive; + udp_tunnel_gro_complete_t gro_complete; +}; + +enum udp_parsable_tunnel_type { + UDP_TUNNEL_TYPE_VXLAN = 1, + UDP_TUNNEL_TYPE_GENEVE = 2, + UDP_TUNNEL_TYPE_VXLAN_GPE = 4, +}; + +enum switchdev_notifier_type { + SWITCHDEV_FDB_ADD_TO_BRIDGE = 1, + SWITCHDEV_FDB_DEL_TO_BRIDGE = 2, + SWITCHDEV_FDB_ADD_TO_DEVICE = 3, + SWITCHDEV_FDB_DEL_TO_DEVICE = 4, + SWITCHDEV_FDB_OFFLOADED = 5, + SWITCHDEV_FDB_FLUSH_TO_BRIDGE = 6, + SWITCHDEV_PORT_OBJ_ADD = 7, + SWITCHDEV_PORT_OBJ_DEL = 8, + SWITCHDEV_PORT_ATTR_SET = 9, + SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE = 10, + SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE = 11, + SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE = 12, + SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE = 13, + SWITCHDEV_VXLAN_FDB_OFFLOADED = 14, + SWITCHDEV_BRPORT_OFFLOADED = 15, + SWITCHDEV_BRPORT_UNOFFLOADED = 16, +}; + +struct switchdev_notifier_info { + struct net_device *dev; + struct netlink_ext_ack *extack; + const void *ctx; +}; + +struct vxlanhdr { + __be32 vx_flags; + __be32 vx_vni; +}; + +struct vxlanhdr_gbp { + u8 vx_flags; + u8 reserved_flags1: 3; + u8 policy_applied: 1; + u8 reserved_flags2: 2; + u8 dont_learn: 1; + u8 reserved_flags3: 1; + __be16 policy_id; + __be32 vx_vni; +}; + +struct vxlanhdr_gpe { + u8 oam_flag: 1; + u8 reserved_flags1: 1; + u8 np_applied: 1; + u8 instance_applied: 1; + u8 version: 2; + u8 reserved_flags2: 2; + u8 reserved_flags3; + u8 reserved_flags4; + u8 next_protocol; + __be32 vx_vni; +}; + +struct vxlan_metadata { + u32 gbp; +}; + +struct vxlan_sock { + struct hlist_node hlist; + struct socket *sock; + struct hlist_head vni_list[1024]; + refcount_t refcnt; + u32 flags; +}; + +union vxlan_addr { + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + struct sockaddr sa; +}; + +struct vxlan_rdst { + union vxlan_addr remote_ip; + __be16 remote_port; + u8 offloaded: 1; + __be32 remote_vni; + u32 remote_ifindex; + struct net_device *remote_dev; + struct list_head list; + struct callback_head rcu; + struct dst_cache dst_cache; +}; + +struct vxlan_config { + union vxlan_addr remote_ip; + union vxlan_addr saddr; + __be32 vni; + int remote_ifindex; + int mtu; + __be16 dst_port; + u16 port_min; + u16 port_max; + u8 tos; + u8 ttl; + __be32 label; + u32 flags; + long unsigned int age_interval; + unsigned int addrmax; + bool no_share; + enum ifla_vxlan_df df; +}; + +enum { + VXLAN_VNI_STATS_RX = 0, + VXLAN_VNI_STATS_RX_DROPS = 1, + VXLAN_VNI_STATS_RX_ERRORS = 2, + VXLAN_VNI_STATS_TX = 3, + VXLAN_VNI_STATS_TX_DROPS = 4, + VXLAN_VNI_STATS_TX_ERRORS = 5, +}; + +struct vxlan_vni_stats { + u64 rx_packets; + u64 rx_bytes; + u64 rx_drops; + u64 rx_errors; + u64 tx_packets; + u64 tx_bytes; + u64 tx_drops; + u64 tx_errors; +}; + +struct vxlan_vni_stats_pcpu { + struct vxlan_vni_stats stats; + struct u64_stats_sync syncp; +}; + +struct vxlan_dev; + +struct vxlan_dev_node { + struct hlist_node hlist; + struct vxlan_dev *vxlan; +}; + +struct vxlan_vni_group; + +struct vxlan_dev { + struct vxlan_dev_node hlist4; + struct vxlan_dev_node hlist6; + struct list_head next; + struct vxlan_sock *vn4_sock; + struct vxlan_sock *vn6_sock; + struct net_device *dev; + struct net *net; + struct vxlan_rdst default_dst; + struct timer_list age_timer; + spinlock_t hash_lock[256]; + unsigned int addrcnt; + struct gro_cells gro_cells; + struct vxlan_config cfg; + struct vxlan_vni_group *vnigrp; + struct hlist_head fdb_head[256]; +}; + +struct vxlan_vni_node { + struct rhash_head vnode; + struct vxlan_dev_node hlist4; + struct vxlan_dev_node hlist6; + struct list_head vlist; + __be32 vni; + union vxlan_addr remote_ip; + struct vxlan_vni_stats_pcpu *stats; + struct callback_head rcu; +}; + +struct vxlan_vni_group { + struct rhashtable vni_hash; + struct list_head vni_list; + u32 num_vnis; +}; + +struct switchdev_notifier_vxlan_fdb_info { + struct switchdev_notifier_info info; + union vxlan_addr remote_ip; + __be16 remote_port; + __be32 remote_vni; + u32 remote_ifindex; + u8 eth_addr[6]; + __be32 vni; + bool offloaded; + bool added_by_user; +}; + +struct vxlan_net { + struct list_head vxlan_list; + struct hlist_head sock_list[256]; + spinlock_t sock_lock; + struct notifier_block nexthop_notifier_block; +}; + +struct vxlan_fdb { + struct hlist_node hlist; + struct callback_head rcu; + long unsigned int updated; + long unsigned int used; + struct list_head remotes; + u8 eth_addr[6]; + u16 state; + __be32 vni; + u16 flags; + struct list_head nh_list; + struct nexthop *nh; + struct vxlan_dev *vdev; +}; + +struct return_address_data { + unsigned int level; + void *addr; +}; + +struct tp_module { + struct list_head list; + struct module *mod; +}; + +enum tp_func_state { + TP_FUNC_0 = 0, + TP_FUNC_1 = 1, + TP_FUNC_2 = 2, + TP_FUNC_N = 3, +}; + +enum tp_transition_sync { + TP_TRANSITION_SYNC_1_0_1 = 0, + TP_TRANSITION_SYNC_N_2_1 = 1, + _NR_TP_TRANSITION_SYNC = 2, +}; + +struct tp_transition_snapshot { + long unsigned int rcu; + long unsigned int srcu; + bool ongoing; +}; + +struct tp_probes { + struct callback_head rcu; + struct tracepoint_func probes[0]; +}; + +struct bpf_netns_link { + struct bpf_link link; + enum bpf_attach_type type; + enum netns_bpf_attach_type netns_type; + struct net *net; + struct list_head node; +}; + +struct netnode_security_struct { + union { + __be32 ipv4; + struct in6_addr ipv6; + } addr; + u32 sid; + u16 family; +}; + +struct sel_netnode_bkt { + unsigned int size; + struct list_head list; +}; + +struct sel_netnode { + struct netnode_security_struct nsec; + struct list_head list; + struct callback_head rcu; +}; + +struct al_pcie_acpi { + void *dbi_base; +}; + +struct of_endpoint { + unsigned int port; + unsigned int id; + const struct device_node *local_node; +}; + +struct supplier_bindings { + struct device_node * (*parse_prop)(struct device_node *, const char *, int); + bool optional; + bool node_not_dev; +}; + +struct coalesce_reply_data { + struct ethnl_reply_data base; + struct ethtool_coalesce coalesce; + struct kernel_ethtool_coalesce kernel_coalesce; + u32 supported_params; +}; + +struct mptcp_rm_list { + u8 ids[8]; + u8 nr; +}; + +struct mptcp_addr_info { + u8 id; + sa_family_t family; + __be16 port; + union { + struct in_addr addr; + struct in6_addr addr6; + }; +}; + +struct mptcp_pm_data { + struct mptcp_addr_info local; + struct mptcp_addr_info remote; + struct list_head anno_list; + struct list_head userspace_pm_local_addr_list; + spinlock_t lock; + u8 addr_signal; + bool server_side; + bool work_pending; + bool accept_addr; + bool accept_subflow; + bool remote_deny_join_id0; + u8 add_addr_signaled; + u8 add_addr_accepted; + u8 local_addr_used; + u8 pm_type; + u8 subflows; + u8 status; + long unsigned int id_avail_bitmap[4]; + struct mptcp_rm_list rm_list_tx; + struct mptcp_rm_list rm_list_rx; +}; + +struct mptcp_data_frag { + struct list_head list; + u64 data_seq; + u16 data_len; + u16 offset; + u16 overhead; + u16 already_sent; + struct page *page; +}; + +struct mptcp_sock { + struct inet_connection_sock sk; + u64 local_key; + u64 remote_key; + u64 write_seq; + u64 snd_nxt; + u64 ack_seq; + atomic64_t rcv_wnd_sent; + u64 rcv_data_fin_seq; + int rmem_fwd_alloc; + struct sock *last_snd; + int snd_burst; + int old_wspace; + u64 recovery_snd_nxt; + u64 snd_una; + u64 wnd_end; + long unsigned int timer_ival; + u32 token; + int rmem_released; + long unsigned int flags; + long unsigned int cb_flags; + long unsigned int push_pending; + bool recovery; + bool can_ack; + bool fully_established; + bool rcv_data_fin; + bool snd_data_fin_enable; + bool rcv_fastclose; + bool use_64bit_ack; + bool csum_enabled; + bool allow_infinite_fallback; + u8 mpc_endpoint_id; + u8 recvmsg_inq: 1; + u8 cork: 1; + u8 nodelay: 1; + u8 is_sendmsg: 1; + int connect_flags; + struct work_struct work; + struct sk_buff *ooo_last_skb; + struct rb_root out_of_order_queue; + struct sk_buff_head receive_queue; + struct list_head conn_list; + struct list_head rtx_queue; + struct mptcp_data_frag *first_pending; + struct list_head join_list; + struct socket *subflow; + struct sock *first; + struct mptcp_pm_data pm; + struct { + u32 space; + u32 copied; + u64 time; + u64 rtt_us; + } rcvq_space; + u32 setsockopt_seq; + char ca_name[16]; + struct mptcp_sock *dl_next; +}; + +struct mptcp_subflow_request_sock { + struct tcp_request_sock sk; + u16 mp_capable: 1; + u16 mp_join: 1; + u16 backup: 1; + u16 csum_reqd: 1; + u16 allow_join_id0: 1; + u8 local_id; + u8 remote_id; + u64 local_key; + u64 idsn; + u32 token; + u32 ssn_offset; + u64 thmac; + u32 local_nonce; + u32 remote_nonce; + struct mptcp_sock *msk; + struct hlist_nulls_node token_node; +}; + +struct join_entry { + u32 token; + u32 remote_nonce; + u32 local_nonce; + u8 join_id; + u8 local_id; + u8 backup; + u8 valid; +}; + +struct rt_mutex_base; + +struct rt_mutex_waiter { + struct rb_node tree_entry; + struct rb_node pi_tree_entry; + struct task_struct *task; + struct rt_mutex_base *lock; + unsigned int wake_state; + int prio; + u64 deadline; + struct ww_acquire_ctx *ww_ctx; +}; + +struct robust_list { + struct robust_list *next; +}; + +struct robust_list_head { + struct robust_list list; + long int futex_offset; + struct robust_list *list_op_pending; +}; + +struct rt_mutex_base { + raw_spinlock_t wait_lock; + struct rb_root_cached waiters; + struct task_struct *owner; +}; + +union futex_key { + struct { + u64 i_seq; + long unsigned int pgoff; + unsigned int offset; + } shared; + struct { + union { + struct mm_struct *mm; + u64 __tmp; + }; + long unsigned int address; + unsigned int offset; + } private; + struct { + u64 ptr; + long unsigned int word; + unsigned int offset; + } both; +}; + +struct futex_pi_state { + struct list_head list; + struct rt_mutex_base pi_mutex; + struct task_struct *owner; + refcount_t refcount; + union futex_key key; +}; + +enum { + FUTEX_STATE_OK = 0, + FUTEX_STATE_EXITING = 1, + FUTEX_STATE_DEAD = 2, +}; + +struct futex_hash_bucket { + atomic_t waiters; + spinlock_t lock; + struct plist_head chain; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct futex_q { + struct plist_node list; + struct task_struct *task; + spinlock_t *lock_ptr; + union futex_key key; + struct futex_pi_state *pi_state; + struct rt_mutex_waiter *rt_waiter; + union futex_key *requeue_pi_key; + u32 bitset; + atomic_t requeue_state; +}; + +enum futex_access { + FUTEX_READ = 0, + FUTEX_WRITE = 1, +}; + +struct rt_wake_q_head { + struct wake_q_head head; + struct task_struct *rtlock_task; +}; + +struct tree_descr { + const char *name; + const struct file_operations *ops; + int mode; +}; + +struct bpf_preload_info { + char link_name[16]; + struct bpf_link *link; +}; + +struct bpf_preload_ops { + int (*preload)(struct bpf_preload_info *); + struct module *owner; +}; + +enum bpf_type { + BPF_TYPE_UNSPEC = 0, + BPF_TYPE_PROG = 1, + BPF_TYPE_MAP = 2, + BPF_TYPE_LINK = 3, +}; + +struct map_iter { + void *key; + bool done; +}; + +enum { + OPT_MODE = 0, +}; + +struct bpf_mount_opts { + umode_t mode; +}; + +struct extended_perms_data { + u32 p[8]; +}; + +struct extended_perms_decision { + u8 used; + u8 driver; + struct extended_perms_data *allowed; + struct extended_perms_data *auditallow; + struct extended_perms_data *dontaudit; +}; + +struct extended_perms { + u16 len; + struct extended_perms_data drivers; +}; + +struct avtab_key { + u16 source_type; + u16 target_type; + u16 target_class; + u16 specified; +}; + +struct avtab_extended_perms { + u8 specified; + u8 driver; + struct extended_perms_data perms; +}; + +struct avtab_datum { + union { + u32 data; + struct avtab_extended_perms *xperms; + } u; +}; + +struct avtab_node { + struct avtab_key key; + struct avtab_datum datum; + struct avtab_node *next; +}; + +struct avtab { + struct avtab_node **htable; + u32 nel; + u32 nslot; + u32 mask; +}; + +struct mls_level { + u32 sens; + struct ebitmap cat; +}; + +struct mls_range { + struct mls_level level[2]; +}; + +struct context { + u32 user; + u32 role; + u32 type; + u32 len; + struct mls_range range; + char *str; +}; + +struct type_set; + +struct constraint_expr { + u32 expr_type; + u32 attr; + u32 op; + struct ebitmap names; + struct type_set *type_names; + struct constraint_expr *next; +}; + +struct type_set { + struct ebitmap types; + struct ebitmap negset; + u32 flags; +}; + +struct constraint_node { + u32 permissions; + struct constraint_expr *expr; + struct constraint_node *next; +}; + +struct common_datum { + u32 value; + struct symtab permissions; +}; + +struct class_datum { + u32 value; + char *comkey; + struct common_datum *comdatum; + struct symtab permissions; + struct constraint_node *constraints; + struct constraint_node *validatetrans; + char default_user; + char default_role; + char default_type; + char default_range; +}; + +struct role_datum { + u32 value; + u32 bounds; + struct ebitmap dominates; + struct ebitmap types; +}; + +struct role_allow { + u32 role; + u32 new_role; + struct role_allow *next; +}; + +struct type_datum { + u32 value; + u32 bounds; + unsigned char primary; + unsigned char attribute; +}; + +struct user_datum { + u32 value; + u32 bounds; + struct ebitmap roles; + struct mls_range range; + struct mls_level dfltlevel; +}; + +struct cond_bool_datum { + __u32 value; + int state; +}; + +struct ocontext { + union { + char *name; + struct { + u8 protocol; + u16 low_port; + u16 high_port; + } port; + struct { + u32 addr; + u32 mask; + } node; + struct { + u32 addr[4]; + u32 mask[4]; + } node6; + struct { + u64 subnet_prefix; + u16 low_pkey; + u16 high_pkey; + } ibpkey; + struct { + char *dev_name; + u8 port; + } ibendport; + } u; + union { + u32 sclass; + u32 behavior; + } v; + struct context context[2]; + u32 sid[2]; + struct ocontext *next; +}; + +struct genfs { + char *fstype; + struct ocontext *head; + struct genfs *next; +}; + +struct cond_node; + +struct policydb { + int mls_enabled; + struct symtab symtab[8]; + char **sym_val_to_name[8]; + struct class_datum **class_val_to_struct; + struct role_datum **role_val_to_struct; + struct user_datum **user_val_to_struct; + struct type_datum **type_val_to_struct; + struct avtab te_avtab; + struct hashtab role_tr; + struct ebitmap filename_trans_ttypes; + struct hashtab filename_trans; + u32 compat_filename_trans_count; + struct cond_bool_datum **bool_val_to_struct; + struct avtab te_cond_avtab; + struct cond_node *cond_list; + u32 cond_list_len; + struct role_allow *role_allow; + struct ocontext *ocontexts[9]; + struct genfs *genfs; + struct hashtab range_tr; + struct ebitmap *type_attr_map_array; + struct ebitmap policycaps; + struct ebitmap permissive_map; + size_t len; + unsigned int policyvers; + unsigned int reject_unknown: 1; + unsigned int allow_unknown: 1; + u16 process_class; + u32 process_trans_perms; +}; + +struct cond_expr_node; + +struct cond_expr { + struct cond_expr_node *nodes; + u32 len; +}; + +struct cond_av_list { + struct avtab_node **nodes; + u32 len; +}; + +struct cond_node { + int cur_state; + struct cond_expr expr; + struct cond_av_list true_list; + struct cond_av_list false_list; +}; + +struct policy_data { + struct policydb *p; + void *fp; +}; + +struct cond_expr_node { + u32 expr_type; + u32 bool; +}; + +struct cond_insertf_data { + struct policydb *p; + struct avtab_node **dst; + struct cond_av_list *other; +}; + +struct rsa_key { + const u8 *n; + const u8 *e; + const u8 *d; + const u8 *p; + const u8 *q; + const u8 *dp; + const u8 *dq; + const u8 *qinv; + size_t n_sz; + size_t e_sz; + size_t d_sz; + size_t p_sz; + size_t q_sz; + size_t dp_sz; + size_t dq_sz; + size_t qinv_sz; +}; + +struct asn1_decoder; + +typedef struct blkcg_policy_data *blkcg_pol_alloc_cpd_fn(gfp_t); + +typedef void blkcg_pol_init_cpd_fn(struct blkcg_policy_data *); + +typedef void blkcg_pol_free_cpd_fn(struct blkcg_policy_data *); + +typedef void blkcg_pol_bind_cpd_fn(struct blkcg_policy_data *); + +typedef struct blkg_policy_data *blkcg_pol_alloc_pd_fn(gfp_t, struct request_queue *, struct blkcg *); + +typedef void blkcg_pol_init_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_online_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_offline_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_free_pd_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_reset_pd_stats_fn(struct blkg_policy_data *); + +typedef void blkcg_pol_stat_pd_fn(struct blkg_policy_data *, struct seq_file *); + +struct blkcg_policy { + int plid; + struct cftype *dfl_cftypes; + struct cftype *legacy_cftypes; + blkcg_pol_alloc_cpd_fn *cpd_alloc_fn; + blkcg_pol_init_cpd_fn *cpd_init_fn; + blkcg_pol_free_cpd_fn *cpd_free_fn; + blkcg_pol_bind_cpd_fn *cpd_bind_fn; + blkcg_pol_alloc_pd_fn *pd_alloc_fn; + blkcg_pol_init_pd_fn *pd_init_fn; + blkcg_pol_online_pd_fn *pd_online_fn; + blkcg_pol_offline_pd_fn *pd_offline_fn; + blkcg_pol_free_pd_fn *pd_free_fn; + blkcg_pol_reset_pd_stats_fn *pd_reset_stats_fn; + blkcg_pol_stat_pd_fn *pd_stat_fn; +}; + +struct blkg_conf_ctx { + struct block_device *bdev; + struct blkcg_gq *blkg; + char *body; +}; + +struct blk_iolatency { + struct rq_qos rqos; + struct timer_list timer; + bool enabled; + atomic_t enable_cnt; + struct work_struct enable_work; +}; + +struct iolatency_grp; + +struct child_latency_info { + spinlock_t lock; + u64 last_scale_event; + u64 scale_lat; + u64 nr_samples; + struct iolatency_grp *scale_grp; + atomic_t scale_cookie; +}; + +struct percentile_stats { + u64 total; + u64 missed; +}; + +struct latency_stat { + union { + struct percentile_stats ps; + struct blk_rq_stat rqs; + }; +}; + +struct iolatency_grp { + struct blkg_policy_data pd; + struct latency_stat *stats; + struct latency_stat cur_stat; + struct blk_iolatency *blkiolat; + unsigned int max_depth; + struct rq_wait rq_wait; + atomic64_t window_start; + atomic_t scale_cookie; + u64 min_lat_nsec; + u64 cur_win_nsec; + u64 lat_avg; + u64 nr_samples; + bool ssd; + struct child_latency_info child_lat; +}; + +union uu { + short unsigned int us; + unsigned char b[2]; +}; + +struct mbi_range { + u32 spi_start; + u32 nr_spis; + long unsigned int *bm; +}; + +struct acpi_rw_lock { + void *writer_mutex; + void *reader_mutex; + u32 num_readers; +}; + +enum scale_freq_source { + SCALE_FREQ_SOURCE_CPUFREQ = 0, + SCALE_FREQ_SOURCE_ARCH = 1, + SCALE_FREQ_SOURCE_CPPC = 2, +}; + +struct scale_freq_data { + enum scale_freq_source source; + void (*set_freq_scale)(); +}; + +struct trace_event_raw_thermal_pressure_update { + struct trace_entry ent; + long unsigned int thermal_pressure; + int cpu; + char __data[0]; +}; + +struct trace_event_data_offsets_thermal_pressure_update {}; + +typedef void (*btf_trace_thermal_pressure_update)(void *, int, long unsigned int); + +typedef int (*of_irq_init_cb_t)(struct device_node *, struct device_node *); + +struct of_intc_desc { + struct list_head list; + of_irq_init_cb_t irq_init_cb; + struct device_node *dev; + struct device_node *interrupt_parent; +}; + +struct udp_tunnel_nic_ops { + void (*get_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *); + void (*set_port_priv)(struct net_device *, unsigned int, unsigned int, u8); + void (*add_port)(struct net_device *, struct udp_tunnel_info *); + void (*del_port)(struct net_device *, struct udp_tunnel_info *); + void (*reset_ntf)(struct net_device *); + size_t (*dump_size)(struct net_device *, unsigned int); + int (*dump_write)(struct net_device *, unsigned int, struct sk_buff *); +}; + +struct seccomp_notif_sizes { + __u16 seccomp_notif; + __u16 seccomp_notif_resp; + __u16 seccomp_data; +}; + +struct seccomp_notif { + __u64 id; + __u32 pid; + __u32 flags; + struct seccomp_data data; +}; + +struct seccomp_notif_resp { + __u64 id; + __s64 val; + __s32 error; + __u32 flags; +}; + +struct seccomp_notif_addfd { + __u64 id; + __u32 flags; + __u32 srcfd; + __u32 newfd; + __u32 newfd_flags; +}; + +struct action_cache { + long unsigned int allow_native[8]; +}; + +struct notification; + +struct seccomp_filter { + refcount_t refs; + refcount_t users; + bool log; + bool wait_killable_recv; + struct action_cache cache; + struct seccomp_filter *prev; + struct bpf_prog *prog; + struct notification *notif; + struct mutex notify_lock; + wait_queue_head_t wqh; +}; + +struct ctl_path { + const char *procname; +}; + +enum notify_state { + SECCOMP_NOTIFY_INIT = 0, + SECCOMP_NOTIFY_SENT = 1, + SECCOMP_NOTIFY_REPLIED = 2, +}; + +struct seccomp_knotif { + struct task_struct *task; + u64 id; + const struct seccomp_data *data; + enum notify_state state; + int error; + long int val; + u32 flags; + struct completion ready; + struct list_head list; + struct list_head addfd; +}; + +struct seccomp_kaddfd { + struct file *file; + int fd; + unsigned int flags; + __u32 ioctl_flags; + union { + bool setfd; + int ret; + }; + struct completion completion; + struct list_head list; +}; + +struct notification { + struct semaphore request; + u64 next_id; + struct list_head notifications; +}; + +struct seccomp_log_name { + u32 log; + const char *name; +}; + +struct crypto_rng; + +struct rng_alg { + int (*generate)(struct crypto_rng *, const u8 *, unsigned int, u8 *, unsigned int); + int (*seed)(struct crypto_rng *, const u8 *, unsigned int); + void (*set_ent)(struct crypto_rng *, const u8 *, unsigned int); + unsigned int seedsize; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct crypto_rng { + struct crypto_tfm base; +}; + +struct drbg_string { + const unsigned char *buf; + size_t len; + struct list_head list; +}; + +typedef uint32_t drbg_flag_t; + +struct drbg_core { + drbg_flag_t flags; + __u8 statelen; + __u8 blocklen_bytes; + char cra_name[128]; + char backend_cra_name[128]; +}; + +struct drbg_state; + +struct drbg_state_ops { + int (*update)(struct drbg_state *, struct list_head *, int); + int (*generate)(struct drbg_state *, unsigned char *, unsigned int, struct list_head *); + int (*crypto_init)(struct drbg_state *); + int (*crypto_fini)(struct drbg_state *); +}; + +enum drbg_seed_state { + DRBG_SEED_STATE_UNSEEDED = 0, + DRBG_SEED_STATE_PARTIAL = 1, + DRBG_SEED_STATE_FULL = 2, +}; + +struct drbg_state { + struct mutex drbg_mutex; + unsigned char *V; + unsigned char *Vbuf; + unsigned char *C; + unsigned char *Cbuf; + size_t reseed_ctr; + size_t reseed_threshold; + unsigned char *scratchpad; + unsigned char *scratchpadbuf; + void *priv_data; + struct crypto_skcipher *ctr_handle; + struct skcipher_request *ctr_req; + __u8 *outscratchpadbuf; + __u8 *outscratchpad; + struct crypto_wait ctr_wait; + struct scatterlist sg_in; + struct scatterlist sg_out; + enum drbg_seed_state seeded; + long unsigned int last_seed_time; + bool pr; + bool fips_primed; + unsigned char *prev; + struct crypto_rng *jent; + const struct drbg_state_ops *d_ops; + const struct drbg_core *core; + struct drbg_string test_data; +}; + +enum drbg_prefixes { + DRBG_PREFIX0 = 0, + DRBG_PREFIX1 = 1, + DRBG_PREFIX2 = 2, + DRBG_PREFIX3 = 3, +}; + +struct sdesc { + struct shash_desc shash; + char ctx[0]; +}; + +struct io_sync { + struct file *file; + loff_t len; + loff_t off; + int flags; + int mode; +}; + +enum devm_ioremap_type { + DEVM_IOREMAP = 0, + DEVM_IOREMAP_UC = 1, + DEVM_IOREMAP_WC = 2, + DEVM_IOREMAP_NP = 3, +}; + +struct pcim_iomap_devres { + void *table[6]; +}; + +struct arch_io_reserve_memtype_wc_devres { + resource_size_t start; + resource_size_t size; +}; + +enum auditsc_class_t { + AUDITSC_NATIVE = 0, + AUDITSC_COMPAT = 1, + AUDITSC_OPEN = 2, + AUDITSC_OPENAT = 3, + AUDITSC_SOCKETCALL = 4, + AUDITSC_EXECVE = 5, + AUDITSC_OPENAT2 = 6, + AUDITSC_NVALS = 7, +}; + +struct msi_map { + int index; + int virq; +}; + +struct msix_entry { + u32 vector; + u16 entry; +}; + +enum support_mode { + ALLOW_LEGACY = 0, + DENY_LEGACY = 1, +}; + +struct acpi_evaluate_info { + struct acpi_namespace_node *prefix_node; + const char *relative_pathname; + union acpi_operand_object **parameters; + struct acpi_namespace_node *node; + union acpi_operand_object *obj_desc; + char *full_pathname; + const union acpi_predefined_info *predefined; + union acpi_operand_object *return_object; + union acpi_operand_object *parent_package; + u32 return_flags; + u32 return_btype; + u16 param_count; + u16 node_flags; + u8 pass_number; + u8 return_object_type; + u8 flags; +}; + +enum acpi_return_package_types { + ACPI_PTYPE1_FIXED = 1, + ACPI_PTYPE1_VAR = 2, + ACPI_PTYPE1_OPTION = 3, + ACPI_PTYPE2 = 4, + ACPI_PTYPE2_COUNT = 5, + ACPI_PTYPE2_PKG_COUNT = 6, + ACPI_PTYPE2_FIXED = 7, + ACPI_PTYPE2_MIN = 8, + ACPI_PTYPE2_REV_FIXED = 9, + ACPI_PTYPE2_FIX_VAR = 10, + ACPI_PTYPE2_VAR_VAR = 11, + ACPI_PTYPE2_UUID_PAIR = 12, + ACPI_PTYPE_CUSTOM = 13, +}; + +struct acpi_power_register { + u8 descriptor; + u16 length; + u8 space_id; + u8 bit_width; + u8 bit_offset; + u8 access_size; + u64 address; +} __attribute__((packed)); + +struct acpi_lpi_states_array { + unsigned int size; + unsigned int composite_states_size; + struct acpi_lpi_state *entries; + struct acpi_lpi_state *composite_states[8]; +}; + +enum hid_class_request { + HID_REQ_GET_REPORT = 1, + HID_REQ_GET_IDLE = 2, + HID_REQ_GET_PROTOCOL = 3, + HID_REQ_SET_REPORT = 9, + HID_REQ_SET_IDLE = 10, + HID_REQ_SET_PROTOCOL = 11, +}; + +enum netlink_attribute_type { + NL_ATTR_TYPE_INVALID = 0, + NL_ATTR_TYPE_FLAG = 1, + NL_ATTR_TYPE_U8 = 2, + NL_ATTR_TYPE_U16 = 3, + NL_ATTR_TYPE_U32 = 4, + NL_ATTR_TYPE_U64 = 5, + NL_ATTR_TYPE_S8 = 6, + NL_ATTR_TYPE_S16 = 7, + NL_ATTR_TYPE_S32 = 8, + NL_ATTR_TYPE_S64 = 9, + NL_ATTR_TYPE_BINARY = 10, + NL_ATTR_TYPE_STRING = 11, + NL_ATTR_TYPE_NUL_STRING = 12, + NL_ATTR_TYPE_NESTED = 13, + NL_ATTR_TYPE_NESTED_ARRAY = 14, + NL_ATTR_TYPE_BITFIELD32 = 15, +}; + +enum netlink_policy_type_attr { + NL_POLICY_TYPE_ATTR_UNSPEC = 0, + NL_POLICY_TYPE_ATTR_TYPE = 1, + NL_POLICY_TYPE_ATTR_MIN_VALUE_S = 2, + NL_POLICY_TYPE_ATTR_MAX_VALUE_S = 3, + NL_POLICY_TYPE_ATTR_MIN_VALUE_U = 4, + NL_POLICY_TYPE_ATTR_MAX_VALUE_U = 5, + NL_POLICY_TYPE_ATTR_MIN_LENGTH = 6, + NL_POLICY_TYPE_ATTR_MAX_LENGTH = 7, + NL_POLICY_TYPE_ATTR_POLICY_IDX = 8, + NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 9, + NL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 10, + NL_POLICY_TYPE_ATTR_PAD = 11, + NL_POLICY_TYPE_ATTR_MASK = 12, + __NL_POLICY_TYPE_ATTR_MAX = 13, + NL_POLICY_TYPE_ATTR_MAX = 12, +}; + +struct netlink_policy_dump_state { + unsigned int policy_idx; + unsigned int attr_idx; + unsigned int n_alloc; + struct { + const struct nla_policy *policy; + unsigned int maxtype; + } policies[0]; +}; + +enum nf_nat_manip_type { + NF_NAT_MANIP_SRC = 0, + NF_NAT_MANIP_DST = 1, +}; + +struct nf_conntrack_tuple_mask { + struct { + union nf_inet_addr u3; + union nf_conntrack_man_proto u; + } src; +}; + +enum nf_ct_ext_id { + NF_CT_EXT_HELPER = 0, + NF_CT_EXT_NAT = 1, + NF_CT_EXT_SEQADJ = 2, + NF_CT_EXT_ACCT = 3, + NF_CT_EXT_SYNPROXY = 4, + NF_CT_EXT_NUM = 5, +}; + +struct nf_conntrack_helper; + +struct nf_conntrack_expect { + struct hlist_node lnode; + struct hlist_node hnode; + struct nf_conntrack_tuple tuple; + struct nf_conntrack_tuple_mask mask; + void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); + struct nf_conntrack_helper *helper; + struct nf_conn *master; + struct timer_list timeout; + refcount_t use; + unsigned int flags; + unsigned int class; + union nf_inet_addr saved_addr; + union nf_conntrack_man_proto saved_proto; + enum ip_conntrack_dir dir; + struct callback_head rcu; +}; + +struct nf_conntrack_expect_policy; + +struct nf_conntrack_helper { + struct hlist_node hnode; + char name[16]; + refcount_t refcnt; + struct module *me; + const struct nf_conntrack_expect_policy *expect_policy; + struct nf_conntrack_tuple tuple; + int (*help)(struct sk_buff *, unsigned int, struct nf_conn *, enum ip_conntrack_info); + void (*destroy)(struct nf_conn *); + int (*from_nlattr)(struct nlattr *, struct nf_conn *); + int (*to_nlattr)(struct sk_buff *, const struct nf_conn *); + unsigned int expect_class_max; + unsigned int flags; + unsigned int queue_num; + u16 data_len; + char nat_mod_name[16]; +}; + +struct nf_conntrack_expect_policy { + unsigned int max_expected; + unsigned int timeout; + char name[16]; +}; + +struct nf_nat_range2 { + unsigned int flags; + union nf_inet_addr min_addr; + union nf_inet_addr max_addr; + union nf_conntrack_man_proto min_proto; + union nf_conntrack_man_proto max_proto; + union nf_conntrack_man_proto base_proto; +}; + +struct vlan_group { + unsigned int nr_vlan_devs; + struct hlist_node hlist; + struct net_device **vlan_devices_arrays[16]; +}; + +struct vlan_info { + struct net_device *real_dev; + struct vlan_group grp; + struct list_head vid_list; + unsigned int nr_vids; + struct callback_head rcu; +}; + +enum vlan_flags { + VLAN_FLAG_REORDER_HDR = 1, + VLAN_FLAG_GVRP = 2, + VLAN_FLAG_LOOSE_BINDING = 4, + VLAN_FLAG_MVRP = 8, + VLAN_FLAG_BRIDGE_BINDING = 16, +}; + +struct vlan_pcpu_stats { + u64_stats_t rx_packets; + u64_stats_t rx_bytes; + u64_stats_t rx_multicast; + u64_stats_t tx_packets; + u64_stats_t tx_bytes; + struct u64_stats_sync syncp; + u32 rx_errors; + u32 tx_dropped; +}; + +struct vlan_priority_tci_mapping { + u32 priority; + u16 vlan_qos; + struct vlan_priority_tci_mapping *next; +}; + +struct vlan_dev_priv { + unsigned int nr_ingress_mappings; + u32 ingress_priority_map[8]; + unsigned int nr_egress_mappings; + struct vlan_priority_tci_mapping *egress_priority_map[16]; + __be16 vlan_proto; + u16 vlan_id; + u16 flags; + struct net_device *real_dev; + netdevice_tracker dev_tracker; + unsigned char real_dev_addr[6]; + struct proc_dir_entry *dent; + struct vlan_pcpu_stats *vlan_pcpu_stats; +}; + +enum vlan_protos { + VLAN_PROTO_8021Q = 0, + VLAN_PROTO_8021AD = 1, + VLAN_PROTO_NUM = 2, +}; + +struct vlan_vid_info { + struct list_head list; + __be16 proto; + u16 vid; + int refcount; +}; + +enum { + INET_ULP_INFO_UNSPEC = 0, + INET_ULP_INFO_NAME = 1, + INET_ULP_INFO_TLS = 2, + INET_ULP_INFO_MPTCP = 3, + __INET_ULP_INFO_MAX = 4, +}; + +struct tcpvegas_info { + __u32 tcpv_enabled; + __u32 tcpv_rttcnt; + __u32 tcpv_rtt; + __u32 tcpv_minrtt; +}; + +struct tcp_dctcp_info { + __u16 dctcp_enabled; + __u16 dctcp_ce_state; + __u32 dctcp_alpha; + __u32 dctcp_ab_ecn; + __u32 dctcp_ab_tot; +}; + +struct tcp_bbr_info { + __u32 bbr_bw_lo; + __u32 bbr_bw_hi; + __u32 bbr_min_rtt; + __u32 bbr_pacing_gain; + __u32 bbr_cwnd_gain; +}; + +union tcp_cc_info { + struct tcpvegas_info vegas; + struct tcp_dctcp_info dctcp; + struct tcp_bbr_info bbr; +}; + +enum { + MPTCP_SUBFLOW_ATTR_UNSPEC = 0, + MPTCP_SUBFLOW_ATTR_TOKEN_REM = 1, + MPTCP_SUBFLOW_ATTR_TOKEN_LOC = 2, + MPTCP_SUBFLOW_ATTR_RELWRITE_SEQ = 3, + MPTCP_SUBFLOW_ATTR_MAP_SEQ = 4, + MPTCP_SUBFLOW_ATTR_MAP_SFSEQ = 5, + MPTCP_SUBFLOW_ATTR_SSN_OFFSET = 6, + MPTCP_SUBFLOW_ATTR_MAP_DATALEN = 7, + MPTCP_SUBFLOW_ATTR_FLAGS = 8, + MPTCP_SUBFLOW_ATTR_ID_REM = 9, + MPTCP_SUBFLOW_ATTR_ID_LOC = 10, + MPTCP_SUBFLOW_ATTR_PAD = 11, + __MPTCP_SUBFLOW_ATTR_MAX = 12, +}; + +enum mptcp_data_avail { + MPTCP_SUBFLOW_NODATA = 0, + MPTCP_SUBFLOW_DATA_AVAIL = 1, +}; + +struct mptcp_subflow_context { + struct list_head node; + union { + struct { + long unsigned int avg_pacing_rate; + u64 local_key; + u64 remote_key; + u64 idsn; + u64 map_seq; + u32 snd_isn; + u32 token; + u32 rel_write_seq; + u32 map_subflow_seq; + u32 ssn_offset; + u32 map_data_len; + __wsum map_data_csum; + u32 map_csum_len; + u32 request_mptcp: 1; + u32 request_join: 1; + u32 request_bkup: 1; + u32 mp_capable: 1; + u32 mp_join: 1; + u32 fully_established: 1; + u32 pm_notified: 1; + u32 conn_finished: 1; + u32 map_valid: 1; + u32 map_csum_reqd: 1; + u32 map_data_fin: 1; + u32 mpc_map: 1; + u32 backup: 1; + u32 send_mp_prio: 1; + u32 send_mp_fail: 1; + u32 send_fastclose: 1; + u32 send_infinite_map: 1; + u32 rx_eof: 1; + u32 remote_key_valid: 1; + u32 disposable: 1; + u32 stale: 1; + u32 local_id_valid: 1; + u32 valid_csum_seen: 1; + u32 is_mptfo: 1; + u32 __unused: 8; + enum mptcp_data_avail data_avail; + u32 remote_nonce; + u64 thmac; + u32 local_nonce; + u32 remote_token; + union { + u8 hmac[20]; + u64 iasn; + }; + u8 local_id; + u8 remote_id; + u8 reset_seen: 1; + u8 reset_transient: 1; + u8 reset_reason: 4; + u8 stale_count; + long int delegated_status; + long unsigned int fail_tout; + }; + struct { + long unsigned int avg_pacing_rate; + u64 local_key; + u64 remote_key; + u64 idsn; + u64 map_seq; + u32 snd_isn; + u32 token; + u32 rel_write_seq; + u32 map_subflow_seq; + u32 ssn_offset; + u32 map_data_len; + __wsum map_data_csum; + u32 map_csum_len; + u32 request_mptcp: 1; + u32 request_join: 1; + u32 request_bkup: 1; + u32 mp_capable: 1; + u32 mp_join: 1; + u32 fully_established: 1; + u32 pm_notified: 1; + u32 conn_finished: 1; + u32 map_valid: 1; + u32 map_csum_reqd: 1; + u32 map_data_fin: 1; + u32 mpc_map: 1; + u32 backup: 1; + u32 send_mp_prio: 1; + u32 send_mp_fail: 1; + u32 send_fastclose: 1; + u32 send_infinite_map: 1; + u32 rx_eof: 1; + u32 remote_key_valid: 1; + u32 disposable: 1; + u32 stale: 1; + u32 local_id_valid: 1; + u32 valid_csum_seen: 1; + u32 is_mptfo: 1; + u32 __unused: 8; + enum mptcp_data_avail data_avail; + u32 remote_nonce; + u64 thmac; + u32 local_nonce; + u32 remote_token; + union { + u8 hmac[20]; + u64 iasn; + }; + u8 local_id; + u8 remote_id; + u8 reset_seen: 1; + u8 reset_transient: 1; + u8 reset_reason: 4; + u8 stale_count; + long int delegated_status; + long unsigned int fail_tout; + } reset; + }; + struct list_head delegated_node; + u32 setsockopt_seq; + u32 stale_rcv_tstamp; + struct sock *tcp_sock; + struct sock *conn; + const struct inet_connection_sock_af_ops *icsk_af_ops; + void (*tcp_state_change)(struct sock *); + void (*tcp_error_report)(struct sock *); + struct callback_head rcu; +}; + +enum { + CAP_HWCAP = 1, +}; + +struct secondary_data { + struct task_struct *task; + long int status; +}; + +enum mitigation_state { + SPECTRE_UNAFFECTED = 0, + SPECTRE_MITIGATED = 1, + SPECTRE_VULNERABLE = 2, +}; + +typedef int (*cpu_stop_fn_t)(void *); + +enum vcpu_sysreg { + __INVALID_SYSREG__ = 0, + MPIDR_EL1 = 1, + CSSELR_EL1 = 2, + SCTLR_EL1 = 3, + ACTLR_EL1 = 4, + CPACR_EL1 = 5, + ZCR_EL1 = 6, + TTBR0_EL1 = 7, + TTBR1_EL1 = 8, + TCR_EL1 = 9, + ESR_EL1 = 10, + AFSR0_EL1 = 11, + AFSR1_EL1 = 12, + FAR_EL1 = 13, + MAIR_EL1 = 14, + VBAR_EL1 = 15, + CONTEXTIDR_EL1 = 16, + TPIDR_EL0 = 17, + TPIDRRO_EL0 = 18, + TPIDR_EL1 = 19, + AMAIR_EL1 = 20, + CNTKCTL_EL1 = 21, + PAR_EL1 = 22, + MDSCR_EL1 = 23, + MDCCINT_EL1 = 24, + OSLSR_EL1 = 25, + DISR_EL1 = 26, + PMCR_EL0 = 27, + PMSELR_EL0 = 28, + PMEVCNTR0_EL0 = 29, + PMEVCNTR30_EL0 = 59, + PMCCNTR_EL0 = 60, + PMEVTYPER0_EL0 = 61, + PMEVTYPER30_EL0 = 91, + PMCCFILTR_EL0 = 92, + PMCNTENSET_EL0 = 93, + PMINTENSET_EL1 = 94, + PMOVSSET_EL0 = 95, + PMUSERENR_EL0 = 96, + APIAKEYLO_EL1 = 97, + APIAKEYHI_EL1 = 98, + APIBKEYLO_EL1 = 99, + APIBKEYHI_EL1 = 100, + APDAKEYLO_EL1 = 101, + APDAKEYHI_EL1 = 102, + APDBKEYLO_EL1 = 103, + APDBKEYHI_EL1 = 104, + APGAKEYLO_EL1 = 105, + APGAKEYHI_EL1 = 106, + ELR_EL1 = 107, + SP_EL1 = 108, + SPSR_EL1 = 109, + CNTVOFF_EL2 = 110, + CNTV_CVAL_EL0 = 111, + CNTV_CTL_EL0 = 112, + CNTP_CVAL_EL0 = 113, + CNTP_CTL_EL0 = 114, + RGSR_EL1 = 115, + GCR_EL1 = 116, + TFSR_EL1 = 117, + TFSRE0_EL1 = 118, + DACR32_EL2 = 119, + IFSR32_EL2 = 120, + FPEXC32_EL2 = 121, + DBGVCR32_EL2 = 122, + NR_SYS_REGS = 123, +}; + +enum arm64_bp_harden_el1_vectors { + EL1_VECTOR_BHB_LOOP = 0, + EL1_VECTOR_BHB_FW = 1, + EL1_VECTOR_BHB_CLEAR_INSN = 2, + EL1_VECTOR_KPTI = 3, +}; + +struct __ftr_reg_entry { + u32 sys_id; + struct arm64_ftr_reg *reg; +}; + +typedef void kpti_remap_fn(int, int, phys_addr_t, long unsigned int); + +typedef void ttbr_replace_func(phys_addr_t); + +struct xa_limit { + u32 max; + u32 min; +}; + +enum { + IRQ_DOMAIN_FLAG_HIERARCHY = 1, + IRQ_DOMAIN_NAME_ALLOCATED = 2, + IRQ_DOMAIN_FLAG_IPI_PER_CPU = 4, + IRQ_DOMAIN_FLAG_IPI_SINGLE = 8, + IRQ_DOMAIN_FLAG_MSI = 16, + IRQ_DOMAIN_FLAG_MSI_REMAP = 32, + IRQ_DOMAIN_FLAG_NO_MAP = 64, + IRQ_DOMAIN_FLAG_MSI_PARENT = 256, + IRQ_DOMAIN_FLAG_MSI_DEVICE = 512, + IRQ_DOMAIN_FLAG_NONCORE = 65536, +}; + +enum { + IRQCHIP_FWNODE_REAL = 0, + IRQCHIP_FWNODE_NAMED = 1, + IRQCHIP_FWNODE_NAMED_ID = 2, +}; + +enum msi_desc_filter { + MSI_DESC_ALL = 0, + MSI_DESC_NOTASSOCIATED = 1, + MSI_DESC_ASSOCIATED = 2, +}; + +struct msi_domain_template { + char name[48]; + struct irq_chip chip; + struct msi_domain_ops ops; + struct msi_domain_info info; +}; + +struct msi_ctrl { + unsigned int domid; + unsigned int first; + unsigned int last; + unsigned int nirqs; +}; + +enum { + FTRACE_UPDATE_CALLS = 1, + FTRACE_DISABLE_CALLS = 2, + FTRACE_UPDATE_TRACE_FUNC = 4, + FTRACE_START_FUNC_RET = 8, + FTRACE_STOP_FUNC_RET = 16, + FTRACE_MAY_SLEEP = 32, +}; + +struct ftrace_graph_ent { + long unsigned int func; + int depth; +} __attribute__((packed)); + +struct ftrace_graph_ret { + long unsigned int func; + int depth; + unsigned int overrun; + long long unsigned int calltime; + long long unsigned int rettime; +}; + +typedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *); + +typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); + +struct fgraph_ops { + trace_func_graph_ent_t entryfunc; + trace_func_graph_ret_t retfunc; +}; + +enum { + BPF_F_BPRM_SECUREEXEC = 1, +}; + +struct btf_id_set { + u32 cnt; + u32 ids[0]; +}; + +struct btf_param { + __u32 name_off; + __u32 type; +}; + +struct bpf_trace_run_ctx { + struct bpf_run_ctx run_ctx; + u64 bpf_cookie; +}; + +typedef u64 (*btf_bpf_bprm_opts_set)(struct linux_binprm *, u64); + +typedef u64 (*btf_bpf_ima_inode_hash)(struct inode *, void *, u32); + +typedef u64 (*btf_bpf_ima_file_hash)(struct file *, void *, u32); + +typedef u64 (*btf_bpf_get_attach_cookie)(void *); + +struct bvec_iter_all { + struct bio_vec bv; + int idx; + unsigned int done; +}; + +struct bio_alloc_cache { + struct bio *free_list; + struct bio *free_list_irq; + unsigned int nr; + unsigned int nr_irq; +}; + +struct biovec_slab { + int nr_vecs; + char *name; + struct kmem_cache *slab; +}; + +struct bio_slab { + struct kmem_cache *slab; + unsigned int slab_ref; + unsigned int slab_size; + char name[8]; +}; + +struct io_notif_data { + struct file *file; + struct ubuf_info uarg; + long unsigned int account_pages; + bool zc_report; + bool zc_used; + bool zc_copied; +}; + +struct trace_event_raw_iommu_group_event { + struct trace_entry ent; + int gid; + u32 __data_loc_device; + char __data[0]; +}; + +struct trace_event_raw_iommu_device_event { + struct trace_entry ent; + u32 __data_loc_device; + char __data[0]; +}; + +struct trace_event_raw_map { + struct trace_entry ent; + u64 iova; + u64 paddr; + size_t size; + char __data[0]; +}; + +struct trace_event_raw_unmap { + struct trace_entry ent; + u64 iova; + size_t size; + size_t unmapped_size; + char __data[0]; +}; + +struct trace_event_raw_iommu_error { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + u64 iova; + int flags; + char __data[0]; +}; + +struct trace_event_data_offsets_iommu_group_event { + u32 device; +}; + +struct trace_event_data_offsets_iommu_device_event { + u32 device; +}; + +struct trace_event_data_offsets_map {}; + +struct trace_event_data_offsets_unmap {}; + +struct trace_event_data_offsets_iommu_error { + u32 device; + u32 driver; +}; + +typedef void (*btf_trace_add_device_to_group)(void *, int, struct device *); + +typedef void (*btf_trace_remove_device_from_group)(void *, int, struct device *); + +typedef void (*btf_trace_attach_device_to_domain)(void *, struct device *); + +typedef void (*btf_trace_detach_device_from_domain)(void *, struct device *); + +typedef void (*btf_trace_map)(void *, long unsigned int, phys_addr_t, size_t); + +typedef void (*btf_trace_unmap)(void *, long unsigned int, size_t, size_t); + +typedef void (*btf_trace_io_page_fault)(void *, struct device *, long unsigned int, int); + +struct debugfs_u32_array { + u32 *array; + u32 n_elements; +}; + +struct xdp_attachment_info { + struct bpf_prog *prog; + u32 flags; +}; + +enum udp_tunnel_nic_info_flags { + UDP_TUNNEL_NIC_INFO_MAY_SLEEP = 1, + UDP_TUNNEL_NIC_INFO_OPEN_ONLY = 2, + UDP_TUNNEL_NIC_INFO_IPV4_ONLY = 4, + UDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN = 8, +}; + +struct nsim_sa { + struct xfrm_state *xs; + __be32 ipaddr[4]; + u32 key[4]; + u32 salt; + bool used; + bool crypt; + bool rx; +}; + +struct nsim_ipsec { + struct nsim_sa sa[33]; + struct dentry *pfile; + u32 count; + u32 tx; + u32 ok; +}; + +struct nsim_ethtool_pauseparam { + bool rx; + bool tx; + bool report_stats_rx; + bool report_stats_tx; +}; + +struct nsim_ethtool { + u32 get_err; + u32 set_err; + u32 channels; + struct nsim_ethtool_pauseparam pauseparam; + struct ethtool_coalesce coalesce; + struct ethtool_ringparam ring; + struct ethtool_fecparam fec; +}; + +struct nsim_dev; + +struct nsim_dev_port; + +struct nsim_bus_dev; + +struct netdevsim { + struct net_device *netdev; + struct nsim_dev *nsim_dev; + struct nsim_dev_port *nsim_dev_port; + u64 tx_packets; + u64 tx_bytes; + struct u64_stats_sync syncp; + struct nsim_bus_dev *nsim_bus_dev; + struct bpf_prog *bpf_offloaded; + u32 bpf_offloaded_id; + struct xdp_attachment_info xdp; + struct xdp_attachment_info xdp_hw; + bool bpf_tc_accept; + bool bpf_tc_non_bound_accept; + bool bpf_xdpdrv_accept; + bool bpf_xdpoffload_accept; + bool bpf_map_accept; + struct nsim_ipsec ipsec; + struct { + u32 inject_error; + u32 sleep; + u32 __ports[8]; + u32 (*ports)[4]; + struct debugfs_u32_array dfs_ports[2]; + } udp_ports; + struct nsim_ethtool ethtool; +}; + +struct devlink_region; + +struct devlink_health_reporter; + +struct nsim_dev_health { + struct devlink_health_reporter *empty_reporter; + struct devlink_health_reporter *dummy_reporter; + struct dentry *ddir; + char *recovered_break_msg; + u32 binary_len; + bool fail_recover; +}; + +struct nsim_dev_hwstats { + struct dentry *ddir; + struct dentry *l3_ddir; + struct mutex hwsdev_list_lock; + struct list_head l3_list; + struct notifier_block netdevice_nb; + struct delayed_work traffic_dw; +}; + +struct nsim_dev_psample; + +struct nsim_fib_data; + +struct nsim_trap_data; + +struct nsim_vf_config; + +struct nsim_dev { + struct nsim_bus_dev *nsim_bus_dev; + struct nsim_fib_data *fib_data; + struct nsim_trap_data *trap_data; + struct dentry *ddir; + struct dentry *ports_ddir; + struct dentry *take_snapshot; + struct dentry *nodes_ddir; + struct nsim_vf_config *vfconfigs; + struct bpf_offload_dev *bpf_dev; + bool bpf_bind_accept; + bool bpf_bind_verifier_accept; + u32 bpf_bind_verifier_delay; + struct dentry *ddir_bpf_bound_progs; + u32 prog_id_gen; + struct list_head bpf_bound_progs; + struct list_head bpf_bound_maps; + struct netdev_phys_item_id switch_id; + struct list_head port_list; + bool fw_update_status; + u32 fw_update_overwrite_mask; + u32 max_macs; + bool test1; + bool dont_allow_reload; + bool fail_reload; + struct devlink_region *dummy_region; + struct nsim_dev_health health; + struct nsim_dev_hwstats hwstats; + struct flow_action_cookie *fa_cookie; + spinlock_t fa_cookie_lock; + bool fail_trap_group_set; + bool fail_trap_policer_set; + bool fail_trap_policer_counter_get; + bool fail_trap_drop_counter_get; + struct { + struct udp_tunnel_nic_shared utn_shared; + u32 __ports[8]; + bool sync_all; + bool open_only; + bool ipv4_only; + bool shared; + bool static_iana_vxlan; + u32 sleep; + } udp_ports; + struct nsim_dev_psample *psample; + u16 esw_mode; +}; + +enum nsim_dev_port_type { + NSIM_DEV_PORT_TYPE_PF = 0, + NSIM_DEV_PORT_TYPE_VF = 1, +}; + +struct nsim_dev_port { + struct list_head list; + struct devlink_port devlink_port; + unsigned int port_index; + enum nsim_dev_port_type port_type; + struct dentry *ddir; + struct dentry *rate_parent; + char *parent_name; + struct netdevsim *ns; +}; + +struct nsim_bus_dev { + struct device dev; + struct list_head list; + unsigned int port_count; + unsigned int num_queues; + struct net *initial_net; + unsigned int max_vfs; + unsigned int num_vfs; + bool init; +}; + +struct nsim_vf_config { + int link_state; + u16 min_tx_rate; + u16 max_tx_rate; + u16 vlan; + __be16 vlan_proto; + u16 qos; + u8 vf_mac[6]; + bool spoofchk_enabled; + bool trusted; + bool rss_query_enabled; +}; + +struct eeprom_req_info { + struct ethnl_req_info base; + u32 offset; + u32 length; + u8 page; + u8 bank; + u8 i2c_address; +}; + +struct eeprom_reply_data { + struct ethnl_reply_data base; + u32 length; + u8 *data; +}; + +struct netdev_notifier_info_ext { + struct netdev_notifier_info info; + union { + u32 mtu; + } ext; +}; + +struct netdev_notifier_changeupper_info { + struct netdev_notifier_info info; + struct net_device *upper_dev; + bool master; + bool linking; + void *upper_info; +}; + +typedef u8 dscp_t; + +struct fib_config { + u8 fc_dst_len; + dscp_t fc_dscp; + u8 fc_protocol; + u8 fc_scope; + u8 fc_type; + u8 fc_gw_family; + u32 fc_table; + __be32 fc_dst; + union { + __be32 fc_gw4; + struct in6_addr fc_gw6; + }; + int fc_oif; + u32 fc_flags; + u32 fc_priority; + __be32 fc_prefsrc; + u32 fc_nh_id; + struct nlattr *fc_mx; + struct rtnexthop *fc_mp; + int fc_mx_len; + int fc_mp_len; + u32 fc_flow; + u32 fc_nlflags; + struct nl_info fc_nlinfo; + struct nlattr *fc_encap; + u16 fc_encap_type; +}; + +struct fib_result { + __be32 prefix; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + u32 tclassid; + struct fib_nh_common *nhc; + struct fib_info *fi; + struct fib_table *table; + struct hlist_head *fa_head; +}; + +struct fib_result_nl { + __be32 fl_addr; + u32 fl_mark; + unsigned char fl_tos; + unsigned char fl_scope; + unsigned char tb_id_in; + unsigned char tb_id; + unsigned char prefixlen; + unsigned char nh_sel; + unsigned char type; + unsigned char scope; + int err; +}; + +struct rtentry { + long unsigned int rt_pad1; + struct sockaddr rt_dst; + struct sockaddr rt_gateway; + struct sockaddr rt_genmask; + short unsigned int rt_flags; + short int rt_pad2; + long unsigned int rt_pad3; + void *rt_pad4; + short int rt_metric; + char *rt_dev; + long unsigned int rt_mtu; + long unsigned int rt_window; + short unsigned int rt_irtt; +}; + +struct in6_flowlabel_req { + struct in6_addr flr_dst; + __be32 flr_label; + __u8 flr_action; + __u8 flr_share; + __u16 flr_flags; + __u16 flr_expires; + __u16 flr_linger; + __u32 __flr_pad; +}; + +struct static_key_false_deferred { + struct static_key_false key; + long unsigned int timeout; + struct delayed_work work; +}; + +struct ipcm6_cookie { + struct sockcm_cookie sockc; + __s16 hlimit; + __s16 tclass; + __u16 gso_size; + __s8 dontfrag; + struct ipv6_txoptions *opt; +}; + +struct ip6fl_iter_state { + struct seq_net_private p; + struct pid_namespace *pid_ns; + int bucket; +}; + +struct netlbl_calipso_ops { + int (*doi_add)(struct calipso_doi *, struct netlbl_audit *); + void (*doi_free)(struct calipso_doi *); + int (*doi_remove)(u32, struct netlbl_audit *); + struct calipso_doi * (*doi_getdef)(u32); + void (*doi_putdef)(struct calipso_doi *); + int (*doi_walk)(u32 *, int (*)(struct calipso_doi *, void *), void *); + int (*sock_getattr)(struct sock *, struct netlbl_lsm_secattr *); + int (*sock_setattr)(struct sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + void (*sock_delattr)(struct sock *); + int (*req_setattr)(struct request_sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + void (*req_delattr)(struct request_sock *); + int (*opt_getattr)(const unsigned char *, struct netlbl_lsm_secattr *); + unsigned char * (*skbuff_optptr)(const struct sk_buff *); + int (*skbuff_setattr)(struct sk_buff *, const struct calipso_doi *, const struct netlbl_lsm_secattr *); + int (*skbuff_delattr)(struct sk_buff *); + void (*cache_invalidate)(); + int (*cache_add)(const unsigned char *, const struct netlbl_lsm_secattr *); +}; + +struct calipso_map_cache_bkt { + spinlock_t lock; + u32 size; + struct list_head list; +}; + +struct calipso_map_cache_entry { + u32 hash; + unsigned char *key; + size_t key_len; + struct netlbl_lsm_cache *lsm_data; + u32 activity; + struct list_head list; +}; + +struct alt_instr { + s32 orig_offset; + s32 alt_offset; + u16 cpufeature; + u8 orig_len; + u8 alt_len; +}; + +typedef void (*alternative_cb_t)(struct alt_instr *, __le32 *, __le32 *, int); + +enum aarch64_insn_hint_cr_op { + AARCH64_INSN_HINT_NOP = 0, + AARCH64_INSN_HINT_YIELD = 32, + AARCH64_INSN_HINT_WFE = 64, + AARCH64_INSN_HINT_WFI = 96, + AARCH64_INSN_HINT_SEV = 128, + AARCH64_INSN_HINT_SEVL = 160, + AARCH64_INSN_HINT_XPACLRI = 224, + AARCH64_INSN_HINT_PACIA_1716 = 256, + AARCH64_INSN_HINT_PACIB_1716 = 320, + AARCH64_INSN_HINT_AUTIA_1716 = 384, + AARCH64_INSN_HINT_AUTIB_1716 = 448, + AARCH64_INSN_HINT_PACIAZ = 768, + AARCH64_INSN_HINT_PACIASP = 800, + AARCH64_INSN_HINT_PACIBZ = 832, + AARCH64_INSN_HINT_PACIBSP = 864, + AARCH64_INSN_HINT_AUTIAZ = 896, + AARCH64_INSN_HINT_AUTIASP = 928, + AARCH64_INSN_HINT_AUTIBZ = 960, + AARCH64_INSN_HINT_AUTIBSP = 992, + AARCH64_INSN_HINT_ESB = 512, + AARCH64_INSN_HINT_PSB = 544, + AARCH64_INSN_HINT_TSB = 576, + AARCH64_INSN_HINT_CSDB = 640, + AARCH64_INSN_HINT_CLEARBHB = 704, + AARCH64_INSN_HINT_BTI = 1024, + AARCH64_INSN_HINT_BTIC = 1088, + AARCH64_INSN_HINT_BTIJ = 1152, + AARCH64_INSN_HINT_BTIJC = 1216, +}; + +struct alt_region { + struct alt_instr *begin; + struct alt_instr *end; +}; + +typedef struct { + unsigned int __softirq_pending; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +} irq_cpustat_t; + +enum tick_nohz_mode { + NOHZ_MODE_INACTIVE = 0, + NOHZ_MODE_LOWRES = 1, + NOHZ_MODE_HIGHRES = 2, +}; + +struct tick_sched { + struct hrtimer sched_timer; + long unsigned int check_clocks; + enum tick_nohz_mode nohz_mode; + unsigned int inidle: 1; + unsigned int tick_stopped: 1; + unsigned int idle_active: 1; + unsigned int do_timer_last: 1; + unsigned int got_idle_tick: 1; + ktime_t last_tick; + ktime_t next_tick; + long unsigned int idle_jiffies; + long unsigned int idle_calls; + long unsigned int idle_sleeps; + ktime_t idle_entrytime; + ktime_t idle_waketime; + ktime_t idle_exittime; + ktime_t idle_sleeptime; + ktime_t iowait_sleeptime; + long unsigned int last_jiffies; + u64 timer_expires; + u64 timer_expires_base; + u64 next_timer; + ktime_t idle_expires; + atomic_t tick_dep_mask; + long unsigned int last_tick_jiffies; + unsigned int stalled_jiffies; +}; + +struct swap_slots_cache { + bool lock_initialized; + struct mutex alloc_lock; + swp_entry_t *slots; + int nr; + int cur; + spinlock_t free_lock; + swp_entry_t *slots_ret; + int n_ret; +}; + +struct dx_hash_info { + u32 hash; + u32 minor_hash; + int hash_version; + u32 *seed; +}; + +struct ext4_filename { + const struct qstr *usr_fname; + struct fscrypt_str disk_name; + struct dx_hash_info hinfo; +}; + +struct bus_attribute { + struct attribute attr; + ssize_t (*show)(struct bus_type *, char *); + ssize_t (*store)(struct bus_type *, const char *, size_t); +}; + +enum pcie_link_width { + PCIE_LNK_WIDTH_RESRV = 0, + PCIE_LNK_X1 = 1, + PCIE_LNK_X2 = 2, + PCIE_LNK_X4 = 4, + PCIE_LNK_X8 = 8, + PCIE_LNK_X12 = 12, + PCIE_LNK_X16 = 16, + PCIE_LNK_X32 = 32, + PCIE_LNK_WIDTH_UNKNOWN = 255, +}; + +enum pci_bus_speed { + PCI_SPEED_33MHz = 0, + PCI_SPEED_66MHz = 1, + PCI_SPEED_66MHz_PCIX = 2, + PCI_SPEED_100MHz_PCIX = 3, + PCI_SPEED_133MHz_PCIX = 4, + PCI_SPEED_66MHz_PCIX_ECC = 5, + PCI_SPEED_100MHz_PCIX_ECC = 6, + PCI_SPEED_133MHz_PCIX_ECC = 7, + PCI_SPEED_66MHz_PCIX_266 = 9, + PCI_SPEED_100MHz_PCIX_266 = 10, + PCI_SPEED_133MHz_PCIX_266 = 11, + AGP_UNKNOWN = 12, + AGP_1X = 13, + AGP_2X = 14, + AGP_4X = 15, + AGP_8X = 16, + PCI_SPEED_66MHz_PCIX_533 = 17, + PCI_SPEED_100MHz_PCIX_533 = 18, + PCI_SPEED_133MHz_PCIX_533 = 19, + PCIE_SPEED_2_5GT = 20, + PCIE_SPEED_5_0GT = 21, + PCIE_SPEED_8_0GT = 22, + PCIE_SPEED_16_0GT = 23, + PCIE_SPEED_32_0GT = 24, + PCIE_SPEED_64_0GT = 25, + PCI_SPEED_UNKNOWN = 255, +}; + +enum pci_mmap_api { + PCI_MMAP_SYSFS = 0, + PCI_MMAP_PROCFS = 1, +}; + +struct acpi_table_rsdp { + char signature[8]; + u8 checksum; + char oem_id[6]; + u8 revision; + u32 rsdt_physical_address; + u32 length; + u64 xsdt_physical_address; + u8 extended_checksum; + u8 reserved[3]; +} __attribute__((packed)); + +enum gpiod_flags { + GPIOD_ASIS = 0, + GPIOD_IN = 1, + GPIOD_OUT_LOW = 3, + GPIOD_OUT_HIGH = 7, + GPIOD_OUT_LOW_OPEN_DRAIN = 11, + GPIOD_OUT_HIGH_OPEN_DRAIN = 15, +}; + +struct clk_gpio { + struct clk_hw hw; + struct gpio_desc *gpiod; +}; + +struct n_tty_data { + size_t read_head; + size_t commit_head; + size_t canon_head; + size_t echo_head; + size_t echo_commit; + size_t echo_mark; + long unsigned int char_map[4]; + long unsigned int overrun_time; + int num_overrun; + bool no_room; + unsigned char lnext: 1; + unsigned char erasing: 1; + unsigned char raw: 1; + unsigned char real_raw: 1; + unsigned char icanon: 1; + unsigned char push: 1; + char read_buf[4096]; + long unsigned int read_flags[64]; + unsigned char echo_buf[4096]; + size_t read_tail; + size_t line_start; + size_t lookahead_count; + unsigned int column; + unsigned int canon_column; + size_t echo_tail; + struct mutex atomic_read_lock; + struct mutex output_lock; +}; + +enum { + ERASE = 0, + WERASE = 1, + KILL = 2, +}; + +typedef u32 note_buf_t[106]; + +struct cpu_attr { + struct device_attribute attr; + const struct cpumask * const map; +}; + +struct link_mode_info { + int speed; + u8 lanes; + u8 duplex; +}; + +struct linkmodes_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; + bool peer_empty; +}; + +enum cache_type { + CACHE_TYPE_NOCACHE = 0, + CACHE_TYPE_INST = 1, + CACHE_TYPE_DATA = 2, + CACHE_TYPE_SEPARATE = 3, + CACHE_TYPE_UNIFIED = 4, +}; + +struct cacheinfo { + unsigned int id; + enum cache_type type; + unsigned int level; + unsigned int coherency_line_size; + unsigned int number_of_sets; + unsigned int ways_of_associativity; + unsigned int physical_line_partition; + unsigned int size; + cpumask_t shared_cpu_map; + unsigned int attributes; + void *fw_token; + bool disable_sysfs; + void *priv; +}; + +struct cpu_cacheinfo { + struct cacheinfo *info_list; + unsigned int num_levels; + unsigned int num_leaves; + bool cpu_map_populated; +}; + +typedef struct { + u64 val; +} pfn_t; + +typedef unsigned int zap_flags_t; + +typedef unsigned int pgtbl_mod_mask; + +struct zap_details { + struct folio *single_folio; + bool even_cows; + zap_flags_t zap_flags; +}; + +typedef int (*pte_fn_t)(pte_t *, long unsigned int, void *); + +typedef long unsigned int pte_marker; + +struct mmu_table_batch { + struct callback_head rcu; + unsigned int nr; + void *tables[0]; +}; + +struct mmu_gather_batch { + struct mmu_gather_batch *next; + unsigned int nr; + unsigned int max; + struct page *pages[0]; +}; + +struct mmu_gather { + struct mm_struct *mm; + struct mmu_table_batch *batch; + long unsigned int start; + long unsigned int end; + unsigned int fullmm: 1; + unsigned int need_flush_all: 1; + unsigned int freed_tables: 1; + unsigned int cleared_ptes: 1; + unsigned int cleared_pmds: 1; + unsigned int cleared_puds: 1; + unsigned int cleared_p4ds: 1; + unsigned int vma_exec: 1; + unsigned int vma_huge: 1; + unsigned int vma_pfn: 1; + unsigned int batch_count; + struct mmu_gather_batch *active; + struct mmu_gather_batch local; + struct page *__pages[8]; +}; + +struct copy_subpage_arg { + struct page *dst; + struct page *src; + struct vm_area_struct *vma; +}; + +struct firmware { + size_t size; + const u8 *data; + void *priv; +}; + +enum fw_opt { + FW_OPT_UEVENT = 1, + FW_OPT_NOWAIT = 2, + FW_OPT_USERHELPER = 4, + FW_OPT_NO_WARN = 8, + FW_OPT_NOCACHE = 16, + FW_OPT_NOFALLBACK_SYSFS = 32, + FW_OPT_FALLBACK_PLATFORM = 64, + FW_OPT_PARTIAL = 128, +}; + +enum fw_status { + FW_STATUS_UNKNOWN = 0, + FW_STATUS_LOADING = 1, + FW_STATUS_DONE = 2, + FW_STATUS_ABORTED = 3, +}; + +struct fw_state { + struct completion completion; + enum fw_status status; +}; + +struct firmware_cache; + +struct fw_priv { + struct kref ref; + struct list_head list; + struct firmware_cache *fwc; + struct fw_state fw_st; + void *data; + size_t size; + size_t allocated_size; + size_t offset; + u32 opt_flags; + bool is_paged_buf; + struct page **pages; + int nr_pages; + int page_array_size; + bool need_uevent; + struct list_head pending_list; + const char *fw_name; +}; + +struct firmware_fallback_config { + unsigned int force_sysfs_fallback; + unsigned int ignore_sysfs_fallback; + int old_timeout; + int loading_timeout; +}; + +struct fw_sysfs { + bool nowait; + struct device dev; + struct fw_priv *fw_priv; + struct firmware *fw; + void *fw_upload_priv; +}; + +struct of_timer_irq { + int irq; + int index; + int percpu; + const char *name; + long unsigned int flags; + irq_handler_t handler; +}; + +struct of_timer_base { + void *base; + const char *name; + int index; +}; + +struct of_timer_clk { + struct clk *clk; + const char *name; + int index; + long unsigned int rate; + long unsigned int period; +}; + +struct timer_of { + unsigned int flags; + struct device_node *np; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct clock_event_device clkevt; + struct of_timer_base of_base; + struct of_timer_irq of_irq; + struct of_timer_clk of_clk; + void *private_data; + long: 64; + long: 64; +}; + +enum { + BPF_LOCAL_STORAGE_GET_F_CREATE = 1, + BPF_SK_STORAGE_GET_F_CREATE = 1, +}; + +struct bpf_local_storage_elem { + struct hlist_node map_node; + struct hlist_node snode; + struct bpf_local_storage *local_storage; + struct callback_head rcu; + long: 64; + struct bpf_local_storage_data sdata; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_local_storage_cache { + spinlock_t idx_lock; + u64 idx_usage_counts[16]; +}; + +enum { + SK_DIAG_BPF_STORAGE_REQ_NONE = 0, + SK_DIAG_BPF_STORAGE_REQ_MAP_FD = 1, + __SK_DIAG_BPF_STORAGE_REQ_MAX = 2, +}; + +enum { + SK_DIAG_BPF_STORAGE_REP_NONE = 0, + SK_DIAG_BPF_STORAGE = 1, + __SK_DIAG_BPF_STORAGE_REP_MAX = 2, +}; + +enum { + SK_DIAG_BPF_STORAGE_NONE = 0, + SK_DIAG_BPF_STORAGE_PAD = 1, + SK_DIAG_BPF_STORAGE_MAP_ID = 2, + SK_DIAG_BPF_STORAGE_MAP_VALUE = 3, + __SK_DIAG_BPF_STORAGE_MAX = 4, +}; + +typedef u64 (*btf_bpf_sk_storage_get)(struct bpf_map *, struct sock *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_sk_storage_delete)(struct bpf_map *, struct sock *); + +typedef u64 (*btf_bpf_sk_storage_get_tracing)(struct bpf_map *, struct sock *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_sk_storage_delete_tracing)(struct bpf_map *, struct sock *); + +struct bpf_sk_storage_diag { + u32 nr_maps; + struct bpf_map *maps[0]; +}; + +struct bpf_iter_seq_sk_storage_map_info { + struct bpf_map *map; + unsigned int bucket_id; + unsigned int skip_elems; +}; + +struct bpf_iter__bpf_sk_storage_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + struct sock *sk; + }; + union { + void *value; + }; +}; + +enum { + XFRM_LOOKUP_ICMP = 1, + XFRM_LOOKUP_QUEUE = 2, + XFRM_LOOKUP_KEEP_DST_REF = 4, +}; + +struct ip_options_data { + struct ip_options_rcu opt; + char data[40]; +}; + +struct inet_peer { + struct rb_node rb_node; + struct inetpeer_addr daddr; + u32 metrics[17]; + u32 rate_tokens; + u32 n_redirects; + long unsigned int rate_last; + union { + struct { + atomic_t rid; + }; + struct callback_head rcu; + }; + __u32 dtime; + refcount_t refcnt; +}; + +struct ipcm_cookie { + struct sockcm_cookie sockc; + __be32 addr; + int oif; + struct ip_options_rcu *opt; + __u8 ttl; + __s16 tos; + char priority; + __u16 gso_size; +}; + +struct net_protocol { + int (*handler)(struct sk_buff *); + int (*err_handler)(struct sk_buff *, u32); + unsigned int no_policy: 1; + unsigned int icmp_strict_tag_validation: 1; +}; + +struct icmp_ext_hdr { + __u8 reserved1: 4; + __u8 version: 4; + __u8 reserved2; + __sum16 checksum; +}; + +struct icmp_extobj_hdr { + __be16 length; + __u8 class_num; + __u8 class_type; +}; + +struct icmp_ext_echo_ctype3_hdr { + __be16 afi; + __u8 addrlen; + __u8 reserved; +}; + +struct icmp_ext_echo_iio { + struct icmp_extobj_hdr extobj_hdr; + union { + char name[16]; + __be32 ifindex; + struct { + struct icmp_ext_echo_ctype3_hdr ctype3_hdr; + union { + __be32 ipv4_addr; + struct in6_addr ipv6_addr; + } ip_addr; + } addr; + } ident; +}; + +struct icmp_err { + int errno; + unsigned int fatal: 1; +}; + +struct icmp_bxm { + struct sk_buff *skb; + int offset; + int data_len; + struct { + struct icmphdr icmph; + __be32 times[3]; + } data; + int head_len; + struct ip_options_data replyopts; +}; + +struct icmp_control { + enum skb_drop_reason (*handler)(struct sk_buff *); + short int error; +}; + +struct xdp_desc { + __u64 addr; + __u32 len; + __u32 options; +}; + +struct xdp_buff_xsk { + struct xdp_buff xdp; + dma_addr_t dma; + dma_addr_t frame_dma; + struct xsk_buff_pool *pool; + u64 orig_addr; + struct list_head free_list_node; +}; + +struct xdp_umem; + +struct xsk_queue; + +struct xsk_buff_pool { + struct device *dev; + struct net_device *netdev; + struct list_head xsk_tx_list; + spinlock_t xsk_tx_list_lock; + refcount_t users; + struct xdp_umem *umem; + struct work_struct work; + struct list_head free_list; + u32 heads_cnt; + u16 queue_id; + long: 16; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct xsk_queue *fq; + struct xsk_queue *cq; + dma_addr_t *dma_pages; + struct xdp_buff_xsk *heads; + struct xdp_desc *tx_descs; + u64 chunk_mask; + u64 addrs_cnt; + u32 free_list_cnt; + u32 dma_pages_cnt; + u32 free_heads_cnt; + u32 headroom; + u32 chunk_size; + u32 chunk_shift; + u32 frame_len; + u8 cached_need_wakeup; + bool uses_need_wakeup; + bool dma_need_sync; + bool unaligned; + void *addrs; + spinlock_t cq_lock; + struct xdp_buff_xsk *free_heads[0]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xsk_dma_map { + dma_addr_t *dma_pages; + struct device *dev; + struct net_device *netdev; + refcount_t users; + struct list_head list; + u32 dma_pages_cnt; + bool dma_need_sync; +}; + +struct xdp_umem { + void *addrs; + u64 size; + u32 headroom; + u32 chunk_size; + u32 chunks; + u32 npgs; + struct user_struct *user; + refcount_t users; + u8 flags; + bool zc; + struct page **pgs; + int id; + struct list_head xsk_dma_list; + struct work_struct work; +}; + +struct xdp_ring; + +struct xsk_queue { + u32 ring_mask; + u32 nentries; + u32 cached_prod; + u32 cached_cons; + struct xdp_ring *ring; + u64 invalid_descs; + u64 queue_empty_descs; +}; + +struct xdp_sock { + struct sock sk; + struct xsk_queue *rx; + struct net_device *dev; + struct xdp_umem *umem; + struct list_head flush_node; + struct xsk_buff_pool *pool; + u16 queue_id; + bool zc; + enum { + XSK_READY = 0, + XSK_BOUND = 1, + XSK_UNBOUND = 2, + } state; + long: 64; + struct xsk_queue *tx; + struct list_head tx_list; + spinlock_t rx_lock; + u64 rx_dropped; + u64 rx_queue_full; + struct list_head map_list; + spinlock_t map_list_lock; + struct mutex mutex; + struct xsk_queue *fq_tmp; + struct xsk_queue *cq_tmp; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_ring { + u32 producer; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 pad1; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 consumer; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 pad2; + u32 flags; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u32 pad3; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct xdp_umem_ring { + struct xdp_ring ptrs; + u64 desc[0]; +}; + +struct timens_offset { + s64 sec; + u64 nsec; +}; + +struct timens_offsets { + struct timespec64 monotonic; + struct timespec64 boottime; +}; + +struct time_namespace { + struct user_namespace *user_ns; + struct ucounts *ucounts; + struct ns_common ns; + struct timens_offsets offsets; + struct page *vvar_page; + bool frozen_offsets; +}; + +struct arch_vdso_data {}; + +struct vdso_timestamp { + u64 sec; + u64 nsec; +}; + +struct vdso_data { + u32 seq; + s32 clock_mode; + u64 cycle_last; + u64 mask; + u32 mult; + u32 shift; + union { + struct vdso_timestamp basetime[12]; + struct timens_offset offset[12]; + }; + s32 tz_minuteswest; + s32 tz_dsttime; + u32 hrtimer_res; + u32 __unused; + struct arch_vdso_data arch_data; +}; + +enum vdso_abi { + VDSO_ABI_AA64 = 0, + VDSO_ABI_AA32 = 1, +}; + +enum vvar_pages { + VVAR_DATA_PAGE_OFFSET = 0, + VVAR_TIMENS_PAGE_OFFSET = 1, + VVAR_NR_PAGES = 2, +}; + +struct vdso_abi_info { + const char *name; + const char *vdso_code_start; + const char *vdso_code_end; + long unsigned int vdso_pages; + struct vm_special_mapping *dm; + struct vm_special_mapping *cm; +}; + +enum aarch64_map { + AA64_MAP_VVAR = 0, + AA64_MAP_VDSO = 1, +}; + +struct node_vectors { + unsigned int id; + union { + unsigned int nvectors; + unsigned int ncpus; + }; +}; + +struct syscore_ops { + struct list_head node; + int (*suspend)(); + void (*resume)(); + void (*shutdown)(); +}; + +enum bpf_core_relo_kind { + BPF_CORE_FIELD_BYTE_OFFSET = 0, + BPF_CORE_FIELD_BYTE_SIZE = 1, + BPF_CORE_FIELD_EXISTS = 2, + BPF_CORE_FIELD_SIGNED = 3, + BPF_CORE_FIELD_LSHIFT_U64 = 4, + BPF_CORE_FIELD_RSHIFT_U64 = 5, + BPF_CORE_TYPE_ID_LOCAL = 6, + BPF_CORE_TYPE_ID_TARGET = 7, + BPF_CORE_TYPE_EXISTS = 8, + BPF_CORE_TYPE_SIZE = 9, + BPF_CORE_ENUMVAL_EXISTS = 10, + BPF_CORE_ENUMVAL_VALUE = 11, + BPF_CORE_TYPE_MATCHES = 12, +}; + +struct bpf_core_relo { + __u32 insn_off; + __u32 type_id; + __u32 access_str_off; + enum bpf_core_relo_kind kind; +}; + +enum { + BTF_KIND_UNKN = 0, + BTF_KIND_INT = 1, + BTF_KIND_PTR = 2, + BTF_KIND_ARRAY = 3, + BTF_KIND_STRUCT = 4, + BTF_KIND_UNION = 5, + BTF_KIND_ENUM = 6, + BTF_KIND_FWD = 7, + BTF_KIND_TYPEDEF = 8, + BTF_KIND_VOLATILE = 9, + BTF_KIND_CONST = 10, + BTF_KIND_RESTRICT = 11, + BTF_KIND_FUNC = 12, + BTF_KIND_FUNC_PROTO = 13, + BTF_KIND_VAR = 14, + BTF_KIND_DATASEC = 15, + BTF_KIND_FLOAT = 16, + BTF_KIND_DECL_TAG = 17, + BTF_KIND_TYPE_TAG = 18, + BTF_KIND_ENUM64 = 19, + NR_BTF_KINDS = 20, + BTF_KIND_MAX = 19, +}; + +struct btf_enum { + __u32 name_off; + __s32 val; +}; + +struct btf_array { + __u32 type; + __u32 index_type; + __u32 nelems; +}; + +struct btf_member { + __u32 name_off; + __u32 type; + __u32 offset; +}; + +struct btf_enum64 { + __u32 name_off; + __u32 val_lo32; + __u32 val_hi32; +}; + +struct bpf_core_cand { + const struct btf *btf; + __u32 id; +}; + +struct bpf_core_cand_list { + struct bpf_core_cand *cands; + int len; +}; + +struct bpf_core_accessor { + __u32 type_id; + __u32 idx; + const char *name; +}; + +struct bpf_core_spec { + const struct btf *btf; + struct bpf_core_accessor spec[64]; + __u32 root_type_id; + enum bpf_core_relo_kind relo_kind; + int len; + int raw_spec[64]; + int raw_len; + __u32 bit_offset; +}; + +struct bpf_core_relo_res { + __u64 orig_val; + __u64 new_val; + bool poison; + bool validate; + bool fail_memsz_adjust; + __u32 orig_sz; + __u32 orig_type_id; + __u32 new_sz; + __u32 new_type_id; +}; + +enum slab_state { + DOWN = 0, + PARTIAL = 1, + PARTIAL_NODE = 2, + UP = 3, + FULL = 4, +}; + +struct kmalloc_info_struct { + const char *name[4]; + unsigned int size; +}; + +struct slabinfo { + long unsigned int active_objs; + long unsigned int num_objs; + long unsigned int active_slabs; + long unsigned int num_slabs; + long unsigned int shared_avail; + unsigned int limit; + unsigned int batchcount; + unsigned int shared; + unsigned int objects_per_slab; + unsigned int cache_order; +}; + +struct kmem_obj_info { + void *kp_ptr; + struct slab *kp_slab; + void *kp_objp; + long unsigned int kp_data_offset; + struct kmem_cache *kp_slab_cache; + void *kp_ret; + void *kp_stack[16]; + void *kp_free_stack[16]; +}; + +struct trace_event_raw_kmem_cache_alloc { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + long unsigned int gfp_flags; + int node; + bool accounted; + char __data[0]; +}; + +struct trace_event_raw_kmalloc { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + size_t bytes_req; + size_t bytes_alloc; + long unsigned int gfp_flags; + int node; + char __data[0]; +}; + +struct trace_event_raw_kfree { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + char __data[0]; +}; + +struct trace_event_raw_kmem_cache_free { + struct trace_entry ent; + long unsigned int call_site; + const void *ptr; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + char __data[0]; +}; + +struct trace_event_raw_mm_page_free_batched { + struct trace_entry ent; + long unsigned int pfn; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + long unsigned int gfp_flags; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + int migratetype; + int percpu_refill; + char __data[0]; +}; + +struct trace_event_raw_mm_page_pcpu_drain { + struct trace_entry ent; + long unsigned int pfn; + unsigned int order; + int migratetype; + char __data[0]; +}; + +struct trace_event_raw_mm_page_alloc_extfrag { + struct trace_entry ent; + long unsigned int pfn; + int alloc_order; + int fallback_order; + int alloc_migratetype; + int fallback_migratetype; + int change_ownership; + char __data[0]; +}; + +struct trace_event_raw_rss_stat { + struct trace_entry ent; + unsigned int mm_id; + unsigned int curr; + int member; + long int size; + char __data[0]; +}; + +struct trace_event_data_offsets_kmem_cache_alloc {}; + +struct trace_event_data_offsets_kmalloc {}; + +struct trace_event_data_offsets_kfree {}; + +struct trace_event_data_offsets_kmem_cache_free { + u32 name; +}; + +struct trace_event_data_offsets_mm_page_free {}; + +struct trace_event_data_offsets_mm_page_free_batched {}; + +struct trace_event_data_offsets_mm_page_alloc {}; + +struct trace_event_data_offsets_mm_page {}; + +struct trace_event_data_offsets_mm_page_pcpu_drain {}; + +struct trace_event_data_offsets_mm_page_alloc_extfrag {}; + +struct trace_event_data_offsets_rss_stat {}; + +typedef void (*btf_trace_kmem_cache_alloc)(void *, long unsigned int, const void *, struct kmem_cache *, gfp_t, int); + +typedef void (*btf_trace_kmalloc)(void *, long unsigned int, const void *, size_t, size_t, gfp_t, int); + +typedef void (*btf_trace_kfree)(void *, long unsigned int, const void *); + +typedef void (*btf_trace_kmem_cache_free)(void *, long unsigned int, const void *, const struct kmem_cache *); + +typedef void (*btf_trace_mm_page_free)(void *, struct page *, unsigned int); + +typedef void (*btf_trace_mm_page_free_batched)(void *, struct page *); + +typedef void (*btf_trace_mm_page_alloc)(void *, struct page *, unsigned int, gfp_t, int); + +typedef void (*btf_trace_mm_page_alloc_zone_locked)(void *, struct page *, unsigned int, int, int); + +typedef void (*btf_trace_mm_page_pcpu_drain)(void *, struct page *, unsigned int, int); + +typedef void (*btf_trace_mm_page_alloc_extfrag)(void *, struct page *, int, int, int, int); + +typedef void (*btf_trace_rss_stat)(void *, struct mm_struct *, int, long int); + +struct selinux_mapping; + +struct selinux_map { + struct selinux_mapping *mapping; + u16 size; +}; + +struct sidtab; + +struct selinux_policy { + struct sidtab *sidtab; + struct policydb policydb; + struct selinux_map map; + u32 latest_granting; +}; + +struct sidtab_str_cache; + +struct sidtab_entry { + u32 sid; + u32 hash; + struct context context; + struct sidtab_str_cache *cache; + struct hlist_node list; +}; + +struct sidtab_node_inner; + +struct sidtab_node_leaf; + +union sidtab_entry_inner { + struct sidtab_node_inner *ptr_inner; + struct sidtab_node_leaf *ptr_leaf; +}; + +struct sidtab_node_inner { + union sidtab_entry_inner entries[512]; +}; + +struct sidtab_node_leaf { + struct sidtab_entry entries[39]; +}; + +struct sidtab_isid_entry { + int set; + struct sidtab_entry entry; +}; + +struct convert_context_args; + +struct sidtab_convert_params { + struct convert_context_args *args; + struct sidtab *target; +}; + +struct convert_context_args { + struct selinux_state *state; + struct policydb *oldp; + struct policydb *newp; +}; + +struct sidtab { + union sidtab_entry_inner roots[4]; + u32 count; + struct sidtab_convert_params *convert; + bool frozen; + spinlock_t lock; + u32 cache_free_slots; + struct list_head cache_lru_list; + spinlock_t cache_lock; + struct sidtab_isid_entry isids[27]; + struct hlist_head context_to_sid[512]; +}; + +struct perm_datum { + u32 value; +}; + +struct role_trans_key { + u32 role; + u32 type; + u32 tclass; +}; + +struct role_trans_datum { + u32 new_role; +}; + +struct filename_trans_key { + u32 ttype; + u16 tclass; + const char *name; +}; + +struct filename_trans_datum { + struct ebitmap stypes; + u32 otype; + struct filename_trans_datum *next; +}; + +struct level_datum { + struct mls_level *level; + unsigned char isalias; +}; + +struct cat_datum { + u32 value; + unsigned char isalias; +}; + +struct range_trans { + u32 source_type; + u32 target_type; + u32 target_class; +}; + +struct selinux_mapping { + u16 value; + unsigned int num_perms; + u32 perms[32]; +}; + +struct policydb_compat_info { + int version; + int sym_num; + int ocon_num; +}; + +struct ucred { + __u32 pid; + __u32 uid; + __u32 gid; +}; + +struct scm_fp_list { + short int count; + short int max; + struct user_struct *user; + struct file *fp[253]; +}; + +struct scm_cookie { + struct pid *pid; + struct scm_fp_list *fp; + struct scm_creds creds; + u32 secid; +}; + +struct scm_timestamping { + struct __kernel_old_timespec ts[3]; +}; + +struct scm_timestamping64 { + struct __kernel_timespec ts[3]; +}; + +struct nf_nat_hook { + int (*parse_nat_setup)(struct nf_conn *, enum nf_nat_manip_type, const struct nlattr *); + void (*decode_session)(struct sk_buff *, struct flowi *); + unsigned int (*manip_pkt)(struct sk_buff *, struct nf_conn *, enum nf_nat_manip_type, enum ip_conntrack_dir); + void (*remove_nat_bysrc)(struct nf_conn *); +}; + +struct nf_ct_hook { + int (*update)(struct net *, struct sk_buff *); + void (*destroy)(struct nf_conntrack *); + bool (*get_tuple_skb)(struct nf_conntrack_tuple *, const struct sk_buff *); + void (*attach)(struct sk_buff *, const struct sk_buff *); +}; + +struct nf_conntrack_net { + atomic_t count; + unsigned int expect_count; + unsigned int users4; + unsigned int users6; + unsigned int users_bridge; + struct ctl_table_header *sysctl_header; +}; + +struct nf_ct_iter_data { + struct net *net; + void *data; + u32 portid; + int report; +}; + +enum nf_ct_helper_flags { + NF_CT_HELPER_F_USERSPACE = 1, + NF_CT_HELPER_F_CONFIGURED = 2, +}; + +struct nf_conn_help { + struct nf_conntrack_helper *helper; + struct hlist_head expectations; + u8 expecting[4]; + int: 32; + char data[32]; +}; + +enum nf_ct_ecache_state { + NFCT_ECACHE_DESTROY_FAIL = 0, + NFCT_ECACHE_DESTROY_SENT = 1, +}; + +struct nf_conn_counter { + atomic64_t packets; + atomic64_t bytes; +}; + +struct nf_conn_acct { + struct nf_conn_counter counter[2]; +}; + +struct nf_conn_tstamp { + u_int64_t start; + u_int64_t stop; +}; + +struct nf_ct_timeout { + __u16 l3num; + const struct nf_conntrack_l4proto *l4proto; + char data[0]; +}; + +struct nf_conn_timeout { + struct nf_ct_timeout *timeout; +}; + +struct nf_conn_labels { + long unsigned int bits[2]; +}; + +struct nf_ct_seqadj { + u32 correction_pos; + s32 offset_before; + s32 offset_after; +}; + +struct nf_conn_seqadj { + struct nf_ct_seqadj seq[2]; +}; + +struct nf_conn_synproxy { + u32 isn; + u32 its; + u32 tsoff; +}; + +struct conntrack_gc_work { + struct delayed_work dwork; + u32 next_bucket; + u32 avg_timeout; + u32 count; + u32 start_time; + bool exiting; + bool early_drop; +}; + +struct bpf_tramp_link; + +struct bpf_tramp_links { + struct bpf_tramp_link *links[38]; + int nr_links; +}; + +struct bpf_tramp_link { + struct bpf_link link; + struct hlist_node tramp_hlist; + u64 cookie; +}; + +struct bpf_struct_ops { + const struct bpf_verifier_ops *verifier_ops; + int (*init)(struct btf *); + int (*check_member)(const struct btf_type *, const struct btf_member *); + int (*init_member)(const struct btf_type *, const struct btf_member *, void *, const void *); + int (*reg)(void *); + void (*unreg)(void *); + const struct btf_type *type; + const struct btf_type *value_type; + const char *name; + struct btf_func_model func_models[64]; + u32 type_id; + u32 value_id; +}; + +struct bpf_dummy_ops_state { + int val; +}; + +struct bpf_dummy_ops { + int (*test_1)(struct bpf_dummy_ops_state *); + int (*test_2)(struct bpf_dummy_ops_state *, int, short unsigned int, char, long unsigned int); +}; + +enum bpf_struct_ops_state { + BPF_STRUCT_OPS_STATE_INIT = 0, + BPF_STRUCT_OPS_STATE_INUSE = 1, + BPF_STRUCT_OPS_STATE_TOBEFREE = 2, +}; + +struct bpf_struct_ops_value { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + char data[0]; +}; + +struct bpf_struct_ops_map { + struct bpf_map map; + struct callback_head rcu; + const struct bpf_struct_ops *st_ops; + struct mutex lock; + struct bpf_link **links; + void *image; + struct bpf_struct_ops_value *uvalue; + struct bpf_struct_ops_value kvalue; +}; + +struct bpf_struct_ops_bpf_dummy_ops { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct bpf_dummy_ops data; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_struct_ops_tcp_congestion_ops { + refcount_t refcnt; + enum bpf_struct_ops_state state; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct tcp_congestion_ops data; +}; + +enum { + BPF_STRUCT_OPS_TYPE_bpf_dummy_ops = 0, + BPF_STRUCT_OPS_TYPE_tcp_congestion_ops = 1, + __NR_BPF_STRUCT_OPS_TYPE = 2, +}; + +struct cache_type_info { + const char *size_prop; + const char *line_size_props[2]; + const char *nr_sets_prop; +}; + +enum ethtool_supported_ring_param { + ETHTOOL_RING_USE_RX_BUF_LEN = 1, + ETHTOOL_RING_USE_CQE_SIZE = 2, + ETHTOOL_RING_USE_TX_PUSH = 4, +}; + +enum { + ETHTOOL_TCP_DATA_SPLIT_UNKNOWN = 0, + ETHTOOL_TCP_DATA_SPLIT_DISABLED = 1, + ETHTOOL_TCP_DATA_SPLIT_ENABLED = 2, +}; + +struct rings_reply_data { + struct ethnl_reply_data base; + struct ethtool_ringparam ringparam; + struct kernel_ethtool_ringparam kernel_ringparam; +}; + +enum kvm_bus { + KVM_MMIO_BUS = 0, + KVM_PIO_BUS = 1, + KVM_VIRTIO_CCW_NOTIFY_BUS = 2, + KVM_FAST_MMIO_BUS = 3, + KVM_NR_BUSES = 4, +}; + +struct trace_event_raw_ipi_raise { + struct trace_entry ent; + u32 __data_loc_target_cpus; + const char *reason; + char __data[0]; +}; + +struct trace_event_raw_ipi_handler { + struct trace_entry ent; + const char *reason; + char __data[0]; +}; + +struct trace_event_data_offsets_ipi_raise { + u32 target_cpus; +}; + +struct trace_event_data_offsets_ipi_handler {}; + +typedef void (*btf_trace_ipi_raise)(void *, const struct cpumask *, const char *); + +typedef void (*btf_trace_ipi_entry)(void *, const char *); + +typedef void (*btf_trace_ipi_exit)(void *, const char *); + +enum ipi_msg_type { + IPI_RESCHEDULE = 0, + IPI_CALL_FUNC = 1, + IPI_CPU_STOP = 2, + IPI_CPU_CRASH_STOP = 3, + IPI_TIMER = 4, + IPI_IRQ_WORK = 5, + IPI_WAKEUP = 6, + NR_IPI = 7, +}; + +struct audit_fsnotify_mark { + dev_t dev; + long unsigned int ino; + char *path; + struct fsnotify_mark mark; + struct audit_krule *rule; +}; + +enum pgt_entry { + NORMAL_PMD = 0, + HPAGE_PMD = 1, + NORMAL_PUD = 2, + HPAGE_PUD = 3, +}; + +struct mnt_idmap { + struct user_namespace *owner; + refcount_t count; +}; + +struct mount_attr { + __u64 attr_set; + __u64 attr_clr; + __u64 propagation; + __u64 userns_fd; +}; + +struct mount_kattr { + unsigned int attr_set; + unsigned int attr_clr; + unsigned int propagation; + unsigned int lookup_flags; + bool recurse; + struct user_namespace *mnt_userns; + struct mnt_idmap *mnt_idmap; +}; + +enum umount_tree_flags { + UMOUNT_SYNC = 1, + UMOUNT_PROPAGATE = 2, + UMOUNT_CONNECTED = 4, +}; + +struct acpi_vendor_uuid { + u8 subtype; + u8 data[16]; +}; + +struct acpi_vendor_walk_info { + struct acpi_vendor_uuid *uuid; + struct acpi_buffer *buffer; + acpi_status status; +}; + +struct clk_mux { + struct clk_hw hw; + void *reg; + const u32 *table; + u32 mask; + u8 shift; + u8 flags; + spinlock_t *lock; +}; + +enum pm_qos_req_action { + PM_QOS_ADD_REQ = 0, + PM_QOS_UPDATE_REQ = 1, + PM_QOS_REMOVE_REQ = 2, +}; + +struct sockaddr_nl { + __kernel_sa_family_t nl_family; + short unsigned int nl_pad; + __u32 nl_pid; + __u32 nl_groups; +}; + +struct nlmsgerr { + int error; + struct nlmsghdr msg; +}; + +enum nlmsgerr_attrs { + NLMSGERR_ATTR_UNUSED = 0, + NLMSGERR_ATTR_MSG = 1, + NLMSGERR_ATTR_OFFS = 2, + NLMSGERR_ATTR_COOKIE = 3, + NLMSGERR_ATTR_POLICY = 4, + NLMSGERR_ATTR_MISS_TYPE = 5, + NLMSGERR_ATTR_MISS_NEST = 6, + __NLMSGERR_ATTR_MAX = 7, + NLMSGERR_ATTR_MAX = 6, +}; + +struct nl_pktinfo { + __u32 group; +}; + +enum { + NETLINK_UNCONNECTED = 0, + NETLINK_CONNECTED = 1, +}; + +enum netlink_skb_flags { + NETLINK_SKB_DST = 8, +}; + +struct netlink_notify { + struct net *net; + u32 portid; + int protocol; +}; + +struct netlink_tap { + struct net_device *dev; + struct module *module; + struct list_head list; +}; + +struct trace_event_raw_netlink_extack { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_data_offsets_netlink_extack { + u32 msg; +}; + +typedef void (*btf_trace_netlink_extack)(void *, const char *); + +struct netlink_sock { + struct sock sk; + u32 portid; + u32 dst_portid; + u32 dst_group; + u32 flags; + u32 subscriptions; + u32 ngroups; + long unsigned int *groups; + long unsigned int state; + size_t max_recvmsg_len; + wait_queue_head_t wait; + bool bound; + bool cb_running; + int dump_done_errno; + struct netlink_callback cb; + struct mutex *cb_mutex; + struct mutex cb_def_mutex; + void (*netlink_rcv)(struct sk_buff *); + int (*netlink_bind)(struct net *, int); + void (*netlink_unbind)(struct net *, int); + struct module *module; + struct rhash_head node; + struct callback_head rcu; + struct work_struct work; +}; + +struct listeners; + +struct netlink_table { + struct rhashtable hash; + struct hlist_head mc_list; + struct listeners *listeners; + unsigned int flags; + unsigned int groups; + struct mutex *cb_mutex; + struct module *module; + int (*bind)(struct net *, int); + void (*unbind)(struct net *, int); + bool (*compare)(struct net *, struct sock *); + int registered; +}; + +struct listeners { + struct callback_head rcu; + long unsigned int masks[0]; +}; + +struct netlink_tap_net { + struct list_head netlink_tap_all; + struct mutex netlink_tap_lock; +}; + +struct netlink_compare_arg { + possible_net_t pnet; + u32 portid; +}; + +struct netlink_broadcast_data { + struct sock *exclude_sk; + struct net *net; + u32 portid; + u32 group; + int failure; + int delivery_failure; + int congested; + int delivered; + gfp_t allocation; + struct sk_buff *skb; + struct sk_buff *skb2; +}; + +struct netlink_set_err_data { + struct sock *exclude_sk; + u32 portid; + u32 group; + int code; +}; + +struct nl_seq_iter { + struct seq_net_private p; + struct rhashtable_iter hti; + int link; +}; + +struct bpf_iter__netlink { + union { + struct bpf_iter_meta *meta; + }; + union { + struct netlink_sock *sk; + }; +}; + +enum perf_event_sample_format { + PERF_SAMPLE_IP = 1, + PERF_SAMPLE_TID = 2, + PERF_SAMPLE_TIME = 4, + PERF_SAMPLE_ADDR = 8, + PERF_SAMPLE_READ = 16, + PERF_SAMPLE_CALLCHAIN = 32, + PERF_SAMPLE_ID = 64, + PERF_SAMPLE_CPU = 128, + PERF_SAMPLE_PERIOD = 256, + PERF_SAMPLE_STREAM_ID = 512, + PERF_SAMPLE_RAW = 1024, + PERF_SAMPLE_BRANCH_STACK = 2048, + PERF_SAMPLE_REGS_USER = 4096, + PERF_SAMPLE_STACK_USER = 8192, + PERF_SAMPLE_WEIGHT = 16384, + PERF_SAMPLE_DATA_SRC = 32768, + PERF_SAMPLE_IDENTIFIER = 65536, + PERF_SAMPLE_TRANSACTION = 131072, + PERF_SAMPLE_REGS_INTR = 262144, + PERF_SAMPLE_PHYS_ADDR = 524288, + PERF_SAMPLE_AUX = 1048576, + PERF_SAMPLE_CGROUP = 2097152, + PERF_SAMPLE_DATA_PAGE_SIZE = 4194304, + PERF_SAMPLE_CODE_PAGE_SIZE = 8388608, + PERF_SAMPLE_WEIGHT_STRUCT = 16777216, + PERF_SAMPLE_MAX = 33554432, +}; + +typedef long unsigned int perf_trace_t[1024]; + +struct ext4_orphan_block_tail { + __le32 ob_magic; + __le32 ob_checksum; +}; + +struct linux_efi_tpm_eventlog { + u32 size; + u32 final_events_preboot_size; + u8 version; + u8 log[0]; +}; + +struct efi_tcg2_final_events_table { + u64 version; + u64 nr_events; + u8 events[0]; +}; + +enum { + IORES_DESC_NONE = 0, + IORES_DESC_CRASH_KERNEL = 1, + IORES_DESC_ACPI_TABLES = 2, + IORES_DESC_ACPI_NV_STORAGE = 3, + IORES_DESC_PERSISTENT_MEMORY = 4, + IORES_DESC_PERSISTENT_MEMORY_LEGACY = 5, + IORES_DESC_DEVICE_PRIVATE_MEMORY = 6, + IORES_DESC_RESERVED = 7, + IORES_DESC_SOFT_RESERVED = 8, + IORES_DESC_CXL = 9, +}; + +struct nvmem_cell; + +struct snmp_mib { + const char *name; + int entry; +}; + +struct warn_args; + +struct acpi_pci_root_ops; + +struct acpi_pci_root_info { + struct acpi_pci_root *root; + struct acpi_device *bridge; + struct acpi_pci_root_ops *ops; + struct list_head resources; + char name[16]; +}; + +struct acpi_pci_root_ops { + struct pci_ops *pci_ops; + int (*init_info)(struct acpi_pci_root_info *); + void (*release_info)(struct acpi_pci_root_info *); + int (*prepare_resources)(struct acpi_pci_root_info *); +}; + +struct acpi_pci_generic_root_info { + struct acpi_pci_root_info common; + struct pci_config_window *cfg; +}; + +struct proc_timens_offset { + int clockid; + struct timespec64 val; +}; + +struct bpf_iter_seq_map_info { + u32 map_id; +}; + +struct bpf_iter__bpf_map { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; +}; + +enum alarmtimer_type { + ALARM_REALTIME = 0, + ALARM_BOOTTIME = 1, + ALARM_NUMTYPE = 2, + ALARM_REALTIME_FREEZER = 3, + ALARM_BOOTTIME_FREEZER = 4, +}; + +enum alarmtimer_restart { + ALARMTIMER_NORESTART = 0, + ALARMTIMER_RESTART = 1, +}; + +struct alarm { + struct timerqueue_node node; + struct hrtimer timer; + enum alarmtimer_restart (*function)(struct alarm *, ktime_t); + enum alarmtimer_type type; + int state; + void *data; +}; + +struct timerfd_ctx { + union { + struct hrtimer tmr; + struct alarm alarm; + } t; + ktime_t tintv; + ktime_t moffs; + wait_queue_head_t wqh; + u64 ticks; + int clockid; + short unsigned int expired; + short unsigned int settime_flags; + struct callback_head rcu; + struct list_head clist; + spinlock_t cancel_lock; + bool might_cancel; +}; + +struct kernfs_global_locks { + struct mutex open_file_mutex[1024]; +}; + +enum kernfs_root_flag { + KERNFS_ROOT_CREATE_DEACTIVATED = 1, + KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 2, + KERNFS_ROOT_SUPPORT_EXPORTOP = 4, + KERNFS_ROOT_SUPPORT_USER_XATTR = 8, +}; + +struct kernfs_root { + struct kernfs_node *kn; + unsigned int flags; + struct idr ino_idr; + u32 last_id_lowbits; + u32 id_highbits; + struct kernfs_syscall_ops *syscall_ops; + struct list_head supers; + wait_queue_head_t deactivate_waitq; + struct rw_semaphore kernfs_rwsem; +}; + +struct simple_xattrs { + struct rb_root rb_root; + rwlock_t lock; +}; + +struct kernfs_iattrs { + kuid_t ia_uid; + kgid_t ia_gid; + struct timespec64 ia_atime; + struct timespec64 ia_mtime; + struct timespec64 ia_ctime; + struct simple_xattrs xattrs; + atomic_t nr_user_xattrs; + atomic_t user_xattr_size; +}; + +struct kernfs_super_info { + struct super_block *sb; + struct kernfs_root *root; + const void *ns; + struct list_head node; +}; + +enum { + I_DATA_SEM_NORMAL = 0, + I_DATA_SEM_OTHER = 1, + I_DATA_SEM_QUOTA = 2, +}; + +struct ext4_extent { + __le32 ee_block; + __le16 ee_len; + __le16 ee_start_hi; + __le32 ee_start_lo; +}; + +struct ext4_extent_idx { + __le32 ei_block; + __le32 ei_leaf_lo; + __le16 ei_leaf_hi; + __u16 ei_unused; +}; + +struct ext4_extent_header { + __le16 eh_magic; + __le16 eh_entries; + __le16 eh_max; + __le16 eh_depth; + __le32 eh_generation; +}; + +struct ext4_ext_path { + ext4_fsblk_t p_block; + __u16 p_depth; + __u16 p_maxdepth; + struct ext4_extent *p_ext; + struct ext4_extent_idx *p_idx; + struct ext4_extent_header *p_hdr; + struct buffer_head *p_bh; +}; + +enum { + pci_channel_io_normal = 1, + pci_channel_io_frozen = 2, + pci_channel_io_perm_failure = 3, +}; + +struct device_attach_data { + struct device *dev; + bool check_async; + bool want_async; + bool have_async; +}; + +struct nfnl_ct_hook { + size_t (*build_size)(const struct nf_conn *); + int (*build)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, u_int16_t, u_int16_t); + int (*parse)(const struct nlattr *, struct nf_conn *); + int (*attach_expect)(const struct nlattr *, struct nf_conn *, u32, u32); + void (*seq_adjust)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, s32); +}; + +struct nf_queue_entry { + struct list_head list; + struct sk_buff *skb; + unsigned int id; + unsigned int hook_index; + struct nf_hook_state state; + u16 size; +}; + +struct nfgenmsg { + __u8 nfgen_family; + __u8 version; + __be16 res_id; +}; + +struct nfnl_info { + struct net *net; + struct sock *sk; + const struct nlmsghdr *nlh; + const struct nfgenmsg *nfmsg; + struct netlink_ext_ack *extack; +}; + +enum nfnl_callback_type { + NFNL_CB_UNSPEC = 0, + NFNL_CB_MUTEX = 1, + NFNL_CB_RCU = 2, + NFNL_CB_BATCH = 3, +}; + +struct nfnl_callback { + int (*call)(struct sk_buff *, const struct nfnl_info *, const struct nlattr * const *); + const struct nla_policy *policy; + enum nfnl_callback_type type; + __u16 attr_count; +}; + +enum nfnl_abort_action { + NFNL_ABORT_NONE = 0, + NFNL_ABORT_AUTOLOAD = 1, + NFNL_ABORT_VALIDATE = 2, +}; + +struct nfnetlink_subsystem { + const char *name; + __u8 subsys_id; + __u8 cb_count; + const struct nfnl_callback *cb; + struct module *owner; + int (*commit)(struct net *, struct sk_buff *); + int (*abort)(struct net *, struct sk_buff *, enum nfnl_abort_action); + void (*cleanup)(struct net *); + bool (*valid_genid)(struct net *, u32); +}; + +enum nfqnl_msg_types { + NFQNL_MSG_PACKET = 0, + NFQNL_MSG_VERDICT = 1, + NFQNL_MSG_CONFIG = 2, + NFQNL_MSG_VERDICT_BATCH = 3, + NFQNL_MSG_MAX = 4, +}; + +struct nfqnl_msg_packet_hdr { + __be32 packet_id; + __be16 hw_protocol; + __u8 hook; +} __attribute__((packed)); + +struct nfqnl_msg_packet_hw { + __be16 hw_addrlen; + __u16 _pad; + __u8 hw_addr[8]; +}; + +struct nfqnl_msg_packet_timestamp { + __be64 sec; + __be64 usec; +}; + +enum nfqnl_vlan_attr { + NFQA_VLAN_UNSPEC = 0, + NFQA_VLAN_PROTO = 1, + NFQA_VLAN_TCI = 2, + __NFQA_VLAN_MAX = 3, +}; + +enum nfqnl_attr_type { + NFQA_UNSPEC = 0, + NFQA_PACKET_HDR = 1, + NFQA_VERDICT_HDR = 2, + NFQA_MARK = 3, + NFQA_TIMESTAMP = 4, + NFQA_IFINDEX_INDEV = 5, + NFQA_IFINDEX_OUTDEV = 6, + NFQA_IFINDEX_PHYSINDEV = 7, + NFQA_IFINDEX_PHYSOUTDEV = 8, + NFQA_HWADDR = 9, + NFQA_PAYLOAD = 10, + NFQA_CT = 11, + NFQA_CT_INFO = 12, + NFQA_CAP_LEN = 13, + NFQA_SKB_INFO = 14, + NFQA_EXP = 15, + NFQA_UID = 16, + NFQA_GID = 17, + NFQA_SECCTX = 18, + NFQA_VLAN = 19, + NFQA_L2HDR = 20, + NFQA_PRIORITY = 21, + __NFQA_MAX = 22, +}; + +struct nfqnl_msg_verdict_hdr { + __be32 verdict; + __be32 id; +}; + +enum nfqnl_msg_config_cmds { + NFQNL_CFG_CMD_NONE = 0, + NFQNL_CFG_CMD_BIND = 1, + NFQNL_CFG_CMD_UNBIND = 2, + NFQNL_CFG_CMD_PF_BIND = 3, + NFQNL_CFG_CMD_PF_UNBIND = 4, +}; + +struct nfqnl_msg_config_cmd { + __u8 command; + __u8 _pad; + __be16 pf; +}; + +enum nfqnl_config_mode { + NFQNL_COPY_NONE = 0, + NFQNL_COPY_META = 1, + NFQNL_COPY_PACKET = 2, +}; + +struct nfqnl_msg_config_params { + __be32 copy_range; + __u8 copy_mode; +} __attribute__((packed)); + +enum nfqnl_attr_config { + NFQA_CFG_UNSPEC = 0, + NFQA_CFG_CMD = 1, + NFQA_CFG_PARAMS = 2, + NFQA_CFG_QUEUE_MAXLEN = 3, + NFQA_CFG_MASK = 4, + NFQA_CFG_FLAGS = 5, + __NFQA_CFG_MAX = 6, +}; + +struct nf_queue_handler { + int (*outfn)(struct nf_queue_entry *, unsigned int); + void (*nf_hook_drop)(struct net *); +}; + +struct nfqnl_instance { + struct hlist_node hlist; + struct callback_head rcu; + u32 peer_portid; + unsigned int queue_maxlen; + unsigned int copy_range; + unsigned int queue_dropped; + unsigned int queue_user_dropped; + u_int16_t queue_num; + u_int8_t copy_mode; + u_int32_t flags; + spinlock_t lock; + unsigned int queue_total; + unsigned int id_sequence; + struct list_head queue_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef int (*nfqnl_cmpfn)(struct nf_queue_entry *, long unsigned int); + +struct nfnl_queue_net { + spinlock_t instances_lock; + struct hlist_head instance_table[16]; +}; + +struct iter_state { + struct seq_net_private p; + unsigned int bucket; +}; + +enum arm_smccc_conduit { + SMCCC_CONDUIT_NONE = 0, + SMCCC_CONDUIT_SMC = 1, + SMCCC_CONDUIT_HVC = 2, +}; + +struct arm_smccc_res { + long unsigned int a0; + long unsigned int a1; + long unsigned int a2; + long unsigned int a3; +}; + +enum spectre_v4_policy { + SPECTRE_V4_POLICY_MITIGATION_DYNAMIC = 0, + SPECTRE_V4_POLICY_MITIGATION_ENABLED = 1, + SPECTRE_V4_POLICY_MITIGATION_DISABLED = 2, +}; + +struct spectre_v4_param { + const char *str; + enum spectre_v4_policy policy; +}; + +enum bhb_mitigation_bits { + BHB_LOOP = 0, + BHB_FW = 1, + BHB_HW = 2, + BHB_INSN = 3, +}; + +typedef long unsigned int elf_greg_t; + +typedef elf_greg_t elf_gregset_t[34]; + +struct elf_siginfo { + int si_signo; + int si_code; + int si_errno; +}; + +struct elf_prstatus_common { + struct elf_siginfo pr_info; + short int pr_cursig; + long unsigned int pr_sigpend; + long unsigned int pr_sighold; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + struct __kernel_old_timeval pr_utime; + struct __kernel_old_timeval pr_stime; + struct __kernel_old_timeval pr_cutime; + struct __kernel_old_timeval pr_cstime; +}; + +struct elf_prstatus { + struct elf_prstatus_common common; + elf_gregset_t pr_reg; + int pr_fpvalid; +}; + +struct kimage_arch { + void *dtb; + phys_addr_t dtb_mem; + phys_addr_t kern_reloc; + phys_addr_t el2_vectors; + phys_addr_t ttbr0; + phys_addr_t ttbr1; + phys_addr_t zero_page; + long unsigned int phys_offset; + long unsigned int t0sz; +}; + +typedef long unsigned int kimage_entry_t; + +struct kexec_segment { + union { + void *buf; + void *kbuf; + }; + size_t bufsz; + long unsigned int mem; + size_t memsz; +}; + +struct kimage { + kimage_entry_t head; + kimage_entry_t *entry; + kimage_entry_t *last_entry; + long unsigned int start; + struct page *control_code_page; + struct page *swap_page; + void *vmcoreinfo_data_copy; + long unsigned int nr_segments; + struct kexec_segment segment[16]; + struct list_head control_pages; + struct list_head dest_pages; + struct list_head unusable_pages; + long unsigned int control_page; + unsigned int type: 1; + unsigned int preserve_context: 1; + unsigned int file_mode: 1; + struct kimage_arch arch; + void *elf_headers; + long unsigned int elf_headers_sz; + long unsigned int elf_load_addr; +}; + +enum kmsg_dump_reason { + KMSG_DUMP_UNDEF = 0, + KMSG_DUMP_PANIC = 1, + KMSG_DUMP_OOPS = 2, + KMSG_DUMP_EMERG = 3, + KMSG_DUMP_SHUTDOWN = 4, + KMSG_DUMP_MAX = 5, +}; + +struct node { + struct device dev; + struct list_head access_list; +}; + +struct movable_operations { + bool (*isolate_page)(struct page *, isolate_mode_t); + int (*migrate_page)(struct page *, struct page *, enum migrate_mode); + void (*putback_page)(struct page *); +}; + +struct trace_event_raw_mm_compaction_isolate_template { + struct trace_entry ent; + long unsigned int start_pfn; + long unsigned int end_pfn; + long unsigned int nr_scanned; + long unsigned int nr_taken; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_migratepages { + struct trace_entry ent; + long unsigned int nr_migrated; + long unsigned int nr_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_begin { + struct trace_entry ent; + long unsigned int zone_start; + long unsigned int migrate_pfn; + long unsigned int free_pfn; + long unsigned int zone_end; + bool sync; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_end { + struct trace_entry ent; + long unsigned int zone_start; + long unsigned int migrate_pfn; + long unsigned int free_pfn; + long unsigned int zone_end; + bool sync; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_try_to_compact_pages { + struct trace_entry ent; + int order; + long unsigned int gfp_mask; + int prio; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_suitable_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + int ret; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_defer_template { + struct trace_entry ent; + int nid; + enum zone_type idx; + int order; + unsigned int considered; + unsigned int defer_shift; + int order_failed; + char __data[0]; +}; + +struct trace_event_raw_mm_compaction_kcompactd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_kcompactd_wake_template { + struct trace_entry ent; + int nid; + int order; + enum zone_type highest_zoneidx; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_compaction_isolate_template {}; + +struct trace_event_data_offsets_mm_compaction_migratepages {}; + +struct trace_event_data_offsets_mm_compaction_begin {}; + +struct trace_event_data_offsets_mm_compaction_end {}; + +struct trace_event_data_offsets_mm_compaction_try_to_compact_pages {}; + +struct trace_event_data_offsets_mm_compaction_suitable_template {}; + +struct trace_event_data_offsets_mm_compaction_defer_template {}; + +struct trace_event_data_offsets_mm_compaction_kcompactd_sleep {}; + +struct trace_event_data_offsets_kcompactd_wake_template {}; + +typedef void (*btf_trace_mm_compaction_isolate_migratepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_mm_compaction_isolate_freepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_mm_compaction_migratepages)(void *, struct compact_control *, unsigned int); + +typedef void (*btf_trace_mm_compaction_begin)(void *, struct compact_control *, long unsigned int, long unsigned int, bool); + +typedef void (*btf_trace_mm_compaction_end)(void *, struct compact_control *, long unsigned int, long unsigned int, bool, int); + +typedef void (*btf_trace_mm_compaction_try_to_compact_pages)(void *, int, gfp_t, int); + +typedef void (*btf_trace_mm_compaction_finished)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_suitable)(void *, struct zone *, int, int); + +typedef void (*btf_trace_mm_compaction_deferred)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_defer_compaction)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_defer_reset)(void *, struct zone *, int); + +typedef void (*btf_trace_mm_compaction_kcompactd_sleep)(void *, int); + +typedef void (*btf_trace_mm_compaction_wakeup_kcompactd)(void *, int, int, enum zone_type); + +typedef void (*btf_trace_mm_compaction_kcompactd_wake)(void *, int, int, enum zone_type); + +typedef enum { + ISOLATE_ABORT = 0, + ISOLATE_NONE = 1, + ISOLATE_SUCCESS = 2, +} isolate_migrate_t; + +struct crypto_aead_spawn { + struct crypto_spawn base; +}; + +struct show_busy_params { + struct seq_file *m; + struct blk_mq_hw_ctx *hctx; +}; + +struct acpi_init_walk_info { + u32 table_index; + u32 object_count; + u32 method_count; + u32 serial_method_count; + u32 non_serial_method_count; + u32 serialized_method_count; + u32 device_count; + u32 op_region_count; + u32 field_count; + u32 buffer_count; + u32 package_count; + u32 op_region_init; + u32 field_init; + u32 buffer_init; + u32 package_init; + acpi_owner_id owner_id; +}; + +struct acpi_get_devices_info { + acpi_walk_callback user_function; + void *context; + const char *hid; +}; + +enum arch_timer_ppi_nr { + ARCH_TIMER_PHYS_SECURE_PPI = 0, + ARCH_TIMER_PHYS_NONSECURE_PPI = 1, + ARCH_TIMER_VIRT_PPI = 2, + ARCH_TIMER_HYP_PPI = 3, + ARCH_TIMER_HYP_VIRT_PPI = 4, + ARCH_TIMER_MAX_TIMER_PPI = 5, +}; + +struct arch_timer_mem_frame { + bool valid; + phys_addr_t cntbase; + size_t size; + int phys_irq; + int virt_irq; +}; + +struct arch_timer_mem { + phys_addr_t cntctlbase; + size_t size; + struct arch_timer_mem_frame frame[8]; +}; + +struct acpi_table_gtdt { + struct acpi_table_header header; + u64 counter_block_addresss; + u32 reserved; + u32 secure_el1_interrupt; + u32 secure_el1_flags; + u32 non_secure_el1_interrupt; + u32 non_secure_el1_flags; + u32 virtual_timer_interrupt; + u32 virtual_timer_flags; + u32 non_secure_el2_interrupt; + u32 non_secure_el2_flags; + u64 counter_read_block_address; + u32 platform_timer_count; + u32 platform_timer_offset; +} __attribute__((packed)); + +struct acpi_gtdt_header { + u8 type; + u16 length; +} __attribute__((packed)); + +enum acpi_gtdt_type { + ACPI_GTDT_TYPE_TIMER_BLOCK = 0, + ACPI_GTDT_TYPE_WATCHDOG = 1, + ACPI_GTDT_TYPE_RESERVED = 2, +}; + +struct acpi_gtdt_timer_block { + struct acpi_gtdt_header header; + u8 reserved; + u64 block_address; + u32 timer_count; + u32 timer_offset; +} __attribute__((packed)); + +struct acpi_gtdt_timer_entry { + u8 frame_number; + u8 reserved[3]; + u64 base_address; + u64 el0_base_address; + u32 timer_interrupt; + u32 timer_flags; + u32 virtual_timer_interrupt; + u32 virtual_timer_flags; + u32 common_flags; +} __attribute__((packed)); + +struct acpi_gtdt_watchdog { + struct acpi_gtdt_header header; + u8 reserved; + u64 refresh_frame_address; + u64 control_frame_address; + u32 timer_interrupt; + u32 timer_flags; +} __attribute__((packed)); + +struct acpi_gtdt_descriptor { + struct acpi_table_gtdt *gtdt; + void *gtdt_end; + void *platform_timer; +}; + +struct fwnode_link { + struct fwnode_handle *supplier; + struct list_head s_hook; + struct fwnode_handle *consumer; + struct list_head c_hook; +}; + +enum dpm_order { + DPM_ORDER_NONE = 0, + DPM_ORDER_DEV_AFTER_PARENT = 1, + DPM_ORDER_PARENT_BEFORE_DEV = 2, + DPM_ORDER_DEV_LAST = 3, +}; + +struct class_interface { + struct list_head node; + struct class *class; + int (*add_dev)(struct device *, struct class_interface *); + void (*remove_dev)(struct device *, struct class_interface *); +}; + +struct dev_ext_attribute { + struct device_attribute attr; + void *var; +}; + +union device_attr_group_devres { + const struct attribute_group *group; + const struct attribute_group **groups; +}; + +struct class_dir { + struct kobject kobj; + struct class *class; +}; + +struct root_device { + struct device dev; + struct module *owner; +}; + +struct strp_msg { + int full_len; + int offset; +}; + +enum __sk_action { + __SK_DROP = 0, + __SK_PASS = 1, + __SK_REDIRECT = 2, + __SK_NONE = 3, +}; + +enum sk_psock_state_bits { + SK_PSOCK_TX_ENABLED = 0, +}; + +struct tls_crypto_info { + __u16 version; + __u16 cipher_type; +}; + +struct tls12_crypto_info_aes_gcm_128 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_aes_gcm_256 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[32]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_chacha20_poly1305 { + struct tls_crypto_info info; + unsigned char iv[12]; + unsigned char key[32]; + unsigned char salt[0]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_gcm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_sm4_ccm { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls_strparser { + struct sock *sk; + u32 mark: 8; + u32 stopped: 1; + u32 copy_mode: 1; + u32 msg_ready: 1; + struct strp_msg stm; + struct sk_buff *anchor; + struct work_struct work; +}; + +struct tls_sw_context_rx { + struct crypto_aead *aead_recv; + struct crypto_wait async_wait; + struct sk_buff_head rx_list; + void (*saved_data_ready)(struct sock *); + u8 reader_present; + u8 async_capable: 1; + u8 zc_capable: 1; + u8 reader_contended: 1; + struct tls_strparser strp; + atomic_t decrypt_pending; + spinlock_t decrypt_compl_lock; + struct sk_buff_head async_hold; + struct wait_queue_head wq; +}; + +struct tls_prot_info { + u16 version; + u16 cipher_type; + u16 prepend_size; + u16 tag_size; + u16 overhead_size; + u16 iv_size; + u16 salt_size; + u16 rec_seq_size; + u16 aad_size; + u16 tail_size; +}; + +struct cipher_context { + char *iv; + char *rec_seq; +}; + +union tls_crypto_context { + struct tls_crypto_info info; + union { + struct tls12_crypto_info_aes_gcm_128 aes_gcm_128; + struct tls12_crypto_info_aes_gcm_256 aes_gcm_256; + struct tls12_crypto_info_chacha20_poly1305 chacha20_poly1305; + struct tls12_crypto_info_sm4_gcm sm4_gcm; + struct tls12_crypto_info_sm4_ccm sm4_ccm; + }; +}; + +struct tls_context { + struct tls_prot_info prot_info; + u8 tx_conf: 3; + u8 rx_conf: 3; + u8 zerocopy_sendfile: 1; + u8 rx_no_pad: 1; + int (*push_pending_record)(struct sock *, int); + void (*sk_write_space)(struct sock *); + void *priv_ctx_tx; + void *priv_ctx_rx; + struct net_device *netdev; + struct cipher_context tx; + struct cipher_context rx; + struct scatterlist *partially_sent_record; + u16 partially_sent_offset; + bool in_tcp_sendpages; + bool pending_open_record_frags; + struct mutex tx_lock; + long unsigned int flags; + struct proto *sk_proto; + struct sock *sk; + void (*sk_destruct)(struct sock *); + union tls_crypto_context crypto_send; + union tls_crypto_context crypto_recv; + struct list_head list; + refcount_t refcount; + struct callback_head rcu; +}; + +enum { + INET_FRAG_FIRST_IN = 1, + INET_FRAG_LAST_IN = 2, + INET_FRAG_COMPLETE = 4, + INET_FRAG_HASH_DEAD = 8, + INET_FRAG_DROP = 16, +}; + +struct ipfrag_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + }; + struct sk_buff *next_frag; + int frag_run_len; +}; + +struct udp_seq_afinfo { + sa_family_t family; + struct udp_table *udp_table; +}; + +struct inet_protosw { + struct list_head list; + short unsigned int type; + short unsigned int protocol; + struct proto *prot; + const struct proto_ops *ops; + unsigned char flags; +}; + +enum { + FRA_UNSPEC = 0, + FRA_DST = 1, + FRA_SRC = 2, + FRA_IIFNAME = 3, + FRA_GOTO = 4, + FRA_UNUSED2 = 5, + FRA_PRIORITY = 6, + FRA_UNUSED3 = 7, + FRA_UNUSED4 = 8, + FRA_UNUSED5 = 9, + FRA_FWMARK = 10, + FRA_FLOW = 11, + FRA_TUN_ID = 12, + FRA_SUPPRESS_IFGROUP = 13, + FRA_SUPPRESS_PREFIXLEN = 14, + FRA_TABLE = 15, + FRA_FWMASK = 16, + FRA_OIFNAME = 17, + FRA_PAD = 18, + FRA_L3MDEV = 19, + FRA_UID_RANGE = 20, + FRA_PROTOCOL = 21, + FRA_IP_PROTO = 22, + FRA_SPORT_RANGE = 23, + FRA_DPORT_RANGE = 24, + __FRA_MAX = 25, +}; + +enum { + FR_ACT_UNSPEC = 0, + FR_ACT_TO_TBL = 1, + FR_ACT_GOTO = 2, + FR_ACT_NOP = 3, + FR_ACT_RES3 = 4, + FR_ACT_RES4 = 5, + FR_ACT_BLACKHOLE = 6, + FR_ACT_UNREACHABLE = 7, + FR_ACT_PROHIBIT = 8, + __FR_ACT_MAX = 9, +}; + +typedef struct rt6_info * (*pol_lookup_t)(struct net *, struct fib6_table *, struct flowi6 *, const struct sk_buff *, int); + +struct fib6_rule { + struct fib_rule common; + struct rt6key src; + struct rt6key dst; + dscp_t dscp; +}; + +struct efi_boot_memmap { + long unsigned int map_size; + long unsigned int desc_size; + u32 desc_ver; + long unsigned int map_key; + long unsigned int buff_size; + efi_memory_desc_t map[0]; +}; + +struct efi_vendor_dev_path { + struct efi_generic_dev_path header; + efi_guid_t vendorguid; + u8 vendordata[0]; +}; + +struct linux_efi_initrd { + long unsigned int base; + long unsigned int size; +}; + +typedef u32 efi_tcg2_event_log_format; + +struct efi_tcg2_event { + u32 event_size; + struct { + u32 header_size; + u16 header_version; + u32 pcr_index; + u32 event_type; + } __attribute__((packed)) event_header; +} __attribute__((packed)); + +struct efi_tcg2_tagged_event { + u32 tagged_event_id; + u32 tagged_event_data_size; +}; + +typedef struct efi_tcg2_event efi_tcg2_event_t; + +typedef struct efi_tcg2_tagged_event efi_tcg2_tagged_event_t; + +union efi_tcg2_protocol; + +typedef union efi_tcg2_protocol efi_tcg2_protocol_t; + +union efi_tcg2_protocol { + struct { + void *get_capability; + efi_status_t (*get_event_log)(efi_tcg2_protocol_t *, efi_tcg2_event_log_format, efi_physical_addr_t *, efi_physical_addr_t *, efi_bool_t *); + efi_status_t (*hash_log_extend_event)(efi_tcg2_protocol_t *, u64, efi_physical_addr_t, u64, const efi_tcg2_event_t *); + void *submit_command; + void *get_active_pcr_banks; + void *set_active_pcr_banks; + void *get_result_of_set_active_pcr_banks; + }; + struct { + u32 get_capability; + u32 get_event_log; + u32 hash_log_extend_event; + u32 submit_command; + u32 get_active_pcr_banks; + u32 set_active_pcr_banks; + u32 get_result_of_set_active_pcr_banks; + } mixed_mode; +}; + +union efi_load_file_protocol; + +typedef union efi_load_file_protocol efi_load_file_protocol_t; + +union efi_load_file_protocol { + struct { + efi_status_t (*load_file)(efi_load_file_protocol_t *, efi_device_path_protocol_t *, bool, long unsigned int *, void *); + }; + struct { + u32 load_file; + } mixed_mode; +}; + +typedef union efi_load_file_protocol efi_load_file2_protocol_t; + +typedef struct { + u32 attributes; + u16 file_path_list_length; + u8 variable_data[0]; +} __attribute__((packed)) efi_load_option_t; + +typedef struct { + u32 attributes; + u16 file_path_list_length; + const efi_char16_t *description; + const efi_device_path_protocol_t *file_path_list; + u32 optional_data_size; + const void *optional_data; +} efi_load_option_unpacked_t; + +typedef efi_status_t (*efi_exit_boot_map_processing)(struct efi_boot_memmap *, void *); + +enum efistub_event { + EFISTUB_EVT_INITRD = 0, + EFISTUB_EVT_LOAD_OPTIONS = 1, + EFISTUB_EVT_COUNT = 2, +}; + +struct efi_measured_event { + efi_tcg2_event_t event_data; + efi_tcg2_tagged_event_t tagged_event; + u8 tagged_event_data[0]; +} __attribute__((packed)); + +struct ftr_set_desc { + char name[20]; + struct arm64_ftr_override *override; + struct { + char name[10]; + u8 shift; + u8 width; + bool (*filter)(u64); + } fields[0]; +}; + +struct ext4_io_end_vec { + struct list_head list; + loff_t offset; + ssize_t size; +}; + +struct ext4_io_end { + struct list_head list; + handle_t *handle; + struct inode *inode; + struct bio *bio; + unsigned int flag; + refcount_t count; + struct list_head list_vec; +}; + +typedef struct ext4_io_end ext4_io_end_t; + +struct ext4_io_submit { + struct writeback_control *io_wbc; + struct bio *io_bio; + ext4_io_end_t *io_end; + sector_t io_next_block; +}; + +struct ima_queue_entry { + struct hlist_node hnext; + struct list_head later; + struct ima_template_entry *entry; +}; + +struct ima_h_table { + atomic_long_t len; + atomic_long_t violations; + struct hlist_head queue[1024]; +}; + +enum { + DISK_EVENT_MEDIA_CHANGE = 1, + DISK_EVENT_EJECT_REQUEST = 2, +}; + +enum { + DISK_EVENT_FLAG_POLL = 1, + DISK_EVENT_FLAG_UEVENT = 2, + DISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE = 4, +}; + +struct blk_integrity_profile; + +struct blk_integrity { + const struct blk_integrity_profile *profile; + unsigned char flags; + unsigned char tuple_size; + unsigned char interval_exp; + unsigned char tag_size; +}; + +struct blk_integrity_iter; + +typedef blk_status_t integrity_processing_fn(struct blk_integrity_iter *); + +typedef void integrity_prepare_fn(struct request *); + +typedef void integrity_complete_fn(struct request *, unsigned int); + +struct blk_integrity_profile { + integrity_processing_fn *generate_fn; + integrity_processing_fn *verify_fn; + integrity_prepare_fn *prepare_fn; + integrity_complete_fn *complete_fn; + const char *name; +}; + +struct blk_integrity_iter { + void *prot_buf; + void *data_buf; + sector_t seed; + unsigned int data_size; + short unsigned int interval; + unsigned char tuple_size; + const char *disk_name; +}; + +struct bdev_inode { + struct block_device bdev; + struct inode vfs_inode; +}; + +struct syscall_info { + __u64 sp; + struct seccomp_data data; +}; + +struct tegra194_pcie_ecam { + void *config_base; + void *iatu_base; + void *dbi_base; +}; + +struct acpi_table_iort { + struct acpi_table_header header; + u32 node_count; + u32 node_offset; + u32 reserved; +}; + +struct acpi_iort_node { + u8 type; + u16 length; + u8 revision; + u32 identifier; + u32 mapping_count; + u32 mapping_offset; + char node_data[1]; +} __attribute__((packed)); + +enum acpi_iort_node_type { + ACPI_IORT_NODE_ITS_GROUP = 0, + ACPI_IORT_NODE_NAMED_COMPONENT = 1, + ACPI_IORT_NODE_PCI_ROOT_COMPLEX = 2, + ACPI_IORT_NODE_SMMU = 3, + ACPI_IORT_NODE_SMMU_V3 = 4, + ACPI_IORT_NODE_PMCG = 5, + ACPI_IORT_NODE_RMR = 6, +}; + +struct acpi_iort_id_mapping { + u32 input_base; + u32 id_count; + u32 output_base; + u32 output_reference; + u32 flags; +}; + +struct acpi_iort_its_group { + u32 its_count; + u32 identifiers[1]; +}; + +struct acpi_iort_named_component { + u32 node_flags; + u64 memory_properties; + u8 memory_address_limit; + char device_name[1]; +} __attribute__((packed)); + +struct acpi_iort_root_complex { + u64 memory_properties; + u32 ats_attribute; + u32 pci_segment_number; + u8 memory_address_limit; + u16 pasid_capabilities; + u8 reserved[1]; +} __attribute__((packed)); + +struct acpi_iort_smmu { + u64 base_address; + u64 span; + u32 model; + u32 flags; + u32 global_interrupt_offset; + u32 context_interrupt_count; + u32 context_interrupt_offset; + u32 pmu_interrupt_count; + u32 pmu_interrupt_offset; + u64 interrupts[1]; +} __attribute__((packed)); + +struct acpi_iort_smmu_v3 { + u64 base_address; + u32 flags; + u32 reserved; + u64 vatos_address; + u32 model; + u32 event_gsiv; + u32 pri_gsiv; + u32 gerr_gsiv; + u32 sync_gsiv; + u32 pxm; + u32 id_mapping_index; +} __attribute__((packed)); + +struct acpi_iort_pmcg { + u64 page0_base_address; + u32 overflow_gsiv; + u32 node_reference; + u64 page1_base_address; +}; + +struct acpi_iort_rmr { + u32 flags; + u32 rmr_count; + u32 rmr_offset; +}; + +struct acpi_iort_rmr_desc { + u64 base_address; + u64 length; + u32 reserved; +} __attribute__((packed)); + +enum acpi_predicate { + all_versions = 0, + less_than_or_equal = 1, + equal = 2, + greater_than_or_equal = 3, +}; + +struct acpi_platform_list { + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; + char *table; + enum acpi_predicate pred; + char *reason; + u32 data; +}; + +enum iommu_resv_type { + IOMMU_RESV_DIRECT = 0, + IOMMU_RESV_DIRECT_RELAXABLE = 1, + IOMMU_RESV_RESERVED = 2, + IOMMU_RESV_MSI = 3, + IOMMU_RESV_SW_MSI = 4, +}; + +struct iommu_resv_region { + struct list_head list; + phys_addr_t start; + size_t length; + int prot; + enum iommu_resv_type type; + void (*free)(struct device *, struct iommu_resv_region *); +}; + +struct iommu_iort_rmr_data { + struct iommu_resv_region rr; + const u32 *sids; + u32 num_sids; +}; + +struct iort_its_msi_chip { + struct list_head list; + struct fwnode_handle *fw_node; + phys_addr_t base_addr; + u32 translation_id; +}; + +struct iort_fwnode { + struct list_head list; + struct acpi_iort_node *iort_node; + struct fwnode_handle *fwnode; +}; + +typedef acpi_status (*iort_find_node_callback)(struct acpi_iort_node *, void *); + +struct iort_pci_alias_info { + struct device *dev; + struct acpi_iort_node *node; +}; + +struct iort_dev_config { + const char *name; + int (*dev_init)(struct acpi_iort_node *); + void (*dev_dma_configure)(struct device *, struct acpi_iort_node *); + int (*dev_count_resources)(struct acpi_iort_node *); + void (*dev_init_resources)(struct resource *, struct acpi_iort_node *); + int (*dev_set_proximity)(struct device *, struct acpi_iort_node *); + int (*dev_add_platdata)(struct platform_device *); +}; + +struct req { + struct req *next; + struct completion done; + int err; + const char *name; + umode_t mode; + kuid_t uid; + kgid_t gid; + struct device *dev; +}; + +struct gov_attr_set { + struct kobject kobj; + struct list_head policy_list; + struct mutex update_lock; + int usage_count; +}; + +struct governor_attr { + struct attribute attr; + ssize_t (*show)(struct gov_attr_set *, char *); + ssize_t (*store)(struct gov_attr_set *, const char *, size_t); +}; + +struct dbs_governor; + +struct dbs_data { + struct gov_attr_set attr_set; + struct dbs_governor *gov; + void *tuners; + unsigned int ignore_nice_load; + unsigned int sampling_rate; + unsigned int sampling_down_factor; + unsigned int up_threshold; + unsigned int io_is_busy; +}; + +struct policy_dbs_info; + +struct dbs_governor { + struct cpufreq_governor gov; + struct kobj_type kobj_type; + struct dbs_data *gdbs_data; + unsigned int (*gov_dbs_update)(struct cpufreq_policy *); + struct policy_dbs_info * (*alloc)(); + void (*free)(struct policy_dbs_info *); + int (*init)(struct dbs_data *); + void (*exit)(struct dbs_data *); + void (*start)(struct cpufreq_policy *); +}; + +struct policy_dbs_info { + struct cpufreq_policy *policy; + struct mutex update_mutex; + u64 last_sample_time; + s64 sample_delay_ns; + atomic_t work_count; + struct irq_work irq_work; + struct work_struct work; + struct dbs_data *dbs_data; + struct list_head list; + unsigned int rate_mult; + unsigned int idle_periods; + bool is_shared; + bool work_in_progress; +}; + +struct cs_policy_dbs_info { + struct policy_dbs_info policy_dbs; + unsigned int down_skip; + unsigned int requested_freq; +}; + +struct cs_dbs_tuners { + unsigned int down_threshold; + unsigned int freq_step; +}; + +struct gro_cell { + struct sk_buff_head napi_skbs; + struct napi_struct napi; +}; + +struct percpu_free_defer { + struct callback_head rcu; + void *ptr; +}; + +struct skb_checksum_ops { + __wsum (*update)(const void *, int, __wsum); + __wsum (*combine)(__wsum, __wsum, int, int); +}; + +struct inet_timewait_sock { + struct sock_common __tw_common; + __u32 tw_mark; + volatile unsigned char tw_substate; + unsigned char tw_rcv_wscale; + __be16 tw_sport; + unsigned int tw_transparent: 1; + unsigned int tw_flowlabel: 20; + unsigned int tw_pad: 3; + unsigned int tw_tos: 8; + u32 tw_txhash; + u32 tw_priority; + struct timer_list tw_timer; + struct inet_bind_bucket *tw_tb; +}; + +struct xfrm_dst { + union { + struct dst_entry dst; + struct rtable rt; + struct rt6_info rt6; + } u; + struct dst_entry *route; + struct dst_entry *child; + struct dst_entry *path; + struct xfrm_policy *pols[2]; + int num_pols; + int num_xfrms; + u32 xfrm_genid; + u32 policy_genid; + u32 route_mtu_cached; + u32 child_mtu_cached; + u32 route_cookie; + u32 path_cookie; +}; + +struct blkg_rwstat { + struct percpu_counter cpu_cnt[5]; + atomic64_t aux_cnt[5]; +}; + +struct blkg_rwstat_sample { + u64 cnt[5]; +}; + +struct pcie_device { + int irq; + struct pci_dev *port; + u32 service; + void *priv_data; + struct device device; +}; + +struct pcie_port_service_driver { + const char *name; + int (*probe)(struct pcie_device *); + void (*remove)(struct pcie_device *); + int (*suspend)(struct pcie_device *); + int (*resume_noirq)(struct pcie_device *); + int (*resume)(struct pcie_device *); + int (*runtime_suspend)(struct pcie_device *); + int (*runtime_resume)(struct pcie_device *); + int (*slot_reset)(struct pcie_device *); + int port_type; + u32 service; + struct device_driver driver; +}; + +struct portdrv_service_data { + struct pcie_port_service_driver *drv; + struct device *dev; + u32 service; +}; + +typedef int (*pcie_callback_t)(struct pcie_device *); + +typedef u64 acpi_integer; + +struct acpi_pcc_info { + u8 subspace_id; + u16 length; + u8 *internal_buffer; +}; + +struct mbox_chan; + +struct mbox_chan_ops { + int (*send_data)(struct mbox_chan *, void *); + int (*flush)(struct mbox_chan *, long unsigned int); + int (*startup)(struct mbox_chan *); + void (*shutdown)(struct mbox_chan *); + bool (*last_tx_done)(struct mbox_chan *); + bool (*peek_data)(struct mbox_chan *); +}; + +struct mbox_controller; + +struct mbox_client; + +struct mbox_chan { + struct mbox_controller *mbox; + unsigned int txdone_method; + struct mbox_client *cl; + struct completion tx_complete; + void *active_req; + unsigned int msg_count; + unsigned int msg_free; + void *msg_data[20]; + spinlock_t lock; + void *con_priv; +}; + +struct mbox_controller { + struct device *dev; + const struct mbox_chan_ops *ops; + struct mbox_chan *chans; + int num_chans; + bool txdone_irq; + bool txdone_poll; + unsigned int txpoll_period; + struct mbox_chan * (*of_xlate)(struct mbox_controller *, const struct of_phandle_args *); + struct hrtimer poll_hrt; + spinlock_t poll_hrt_lock; + struct list_head node; +}; + +struct mbox_client { + struct device *dev; + bool tx_block; + long unsigned int tx_tout; + bool knows_txdone; + void (*rx_callback)(struct mbox_client *, void *); + void (*tx_prepare)(struct mbox_client *, void *); + void (*tx_done)(struct mbox_client *, void *, int); +}; + +struct pcc_mbox_chan { + struct mbox_chan *mchan; + u64 shmem_base_addr; + u64 shmem_size; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +}; + +struct pcc_data { + struct pcc_mbox_chan *pcc_chan; + void *pcc_comm_addr; + struct completion done; + struct mbox_client cl; + struct acpi_pcc_info ctx; +}; + +struct acpi_pci_routing_table { + u32 length; + u32 pin; + u64 address; + u32 source_index; + char source[4]; +}; + +typedef void (*of_init_fn_1)(struct device_node *); + +struct clk_fixed_rate { + struct clk_hw hw; + long unsigned int fixed_rate; + long unsigned int fixed_accuracy; + long unsigned int flags; +}; + +struct lirc_scancode { + __u64 timestamp; + __u16 flags; + __u16 rc_proto; + __u32 keycode; + __u64 scancode; +}; + +enum rc_driver_type { + RC_DRIVER_SCANCODE = 0, + RC_DRIVER_IR_RAW = 1, + RC_DRIVER_IR_RAW_TX = 2, +}; + +struct rc_scancode_filter { + u32 data; + u32 mask; +}; + +enum rc_filter_type { + RC_FILTER_NORMAL = 0, + RC_FILTER_WAKEUP = 1, + RC_FILTER_MAX = 2, +}; + +struct ir_raw_event_ctrl; + +struct rc_dev { + struct device dev; + bool managed_alloc; + const struct attribute_group *sysfs_groups[5]; + const char *device_name; + const char *input_phys; + struct input_id input_id; + const char *driver_name; + const char *map_name; + struct rc_map rc_map; + struct mutex lock; + unsigned int minor; + struct ir_raw_event_ctrl *raw; + struct input_dev *input_dev; + enum rc_driver_type driver_type; + bool idle; + bool encode_wakeup; + u64 allowed_protocols; + u64 enabled_protocols; + u64 allowed_wakeup_protocols; + enum rc_proto wakeup_protocol; + struct rc_scancode_filter scancode_filter; + struct rc_scancode_filter scancode_wakeup_filter; + u32 scancode_mask; + u32 users; + void *priv; + spinlock_t keylock; + bool keypressed; + long unsigned int keyup_jiffies; + struct timer_list timer_keyup; + struct timer_list timer_repeat; + u32 last_keycode; + enum rc_proto last_protocol; + u64 last_scancode; + u8 last_toggle; + u32 timeout; + u32 min_timeout; + u32 max_timeout; + u32 rx_resolution; + u32 tx_resolution; + struct device lirc_dev; + struct cdev lirc_cdev; + ktime_t gap_start; + spinlock_t lirc_fh_lock; + struct list_head lirc_fh; + bool registered; + int (*change_protocol)(struct rc_dev *, u64 *); + int (*open)(struct rc_dev *); + void (*close)(struct rc_dev *); + int (*s_tx_mask)(struct rc_dev *, u32); + int (*s_tx_carrier)(struct rc_dev *, u32); + int (*s_tx_duty_cycle)(struct rc_dev *, u32); + int (*s_rx_carrier_range)(struct rc_dev *, u32, u32); + int (*tx_ir)(struct rc_dev *, unsigned int *, unsigned int); + void (*s_idle)(struct rc_dev *, bool); + int (*s_wideband_receiver)(struct rc_dev *, int); + int (*s_carrier_report)(struct rc_dev *, int); + int (*s_filter)(struct rc_dev *, struct rc_scancode_filter *); + int (*s_wakeup_filter)(struct rc_dev *, struct rc_scancode_filter *); + int (*s_timeout)(struct rc_dev *, unsigned int); +}; + +struct ir_raw_event { + union { + u32 duration; + u32 carrier; + }; + u8 duty_cycle; + unsigned int pulse: 1; + unsigned int overflow: 1; + unsigned int timeout: 1; + unsigned int carrier_report: 1; +}; + +struct ir_raw_event_ctrl { + struct list_head list; + struct task_struct *thread; + struct { + union { + struct __kfifo kfifo; + struct ir_raw_event *type; + const struct ir_raw_event *const_type; + char (*rectype)[0]; + struct ir_raw_event *ptr; + const struct ir_raw_event *ptr_const; + }; + struct ir_raw_event buf[512]; + } kfifo; + ktime_t last_event; + struct rc_dev *dev; + spinlock_t edge_spinlock; + struct timer_list edge_handle; + struct ir_raw_event prev_ev; + struct ir_raw_event this_ev; + u32 bpf_sample; + struct bpf_prog_array *progs; +}; + +enum led_brightness { + LED_OFF = 0, + LED_ON = 1, + LED_HALF = 127, + LED_FULL = 255, +}; + +struct led_trigger {}; + +struct rc_filter_attribute { + struct device_attribute attr; + enum rc_filter_type type; + bool mask; +}; + +struct linger { + int l_onoff; + int l_linger; +}; + +struct so_timestamping { + int flags; + int bind_phc; +}; + +enum txtime_flags { + SOF_TXTIME_DEADLINE_MODE = 1, + SOF_TXTIME_REPORT_ERRORS = 2, + SOF_TXTIME_FLAGS_LAST = 2, + SOF_TXTIME_FLAGS_MASK = 3, +}; + +struct sock_txtime { + __kernel_clockid_t clockid; + __u32 flags; +}; + +struct cgroup_cls_state { + struct cgroup_subsys_state css; + u32 classid; +}; + +struct aarch64_insn_patch { + void **text_addrs; + u32 *new_insns; + int insn_cnt; + atomic_t cpu_count; +}; + +struct elf64_note { + Elf64_Word n_namesz; + Elf64_Word n_descsz; + Elf64_Word n_type; +}; + +enum bpf_stats_type { + BPF_STATS_RUN_TIME = 0, +}; + +struct bpf_prog_info { + __u32 type; + __u32 id; + __u8 tag[8]; + __u32 jited_prog_len; + __u32 xlated_prog_len; + __u64 jited_prog_insns; + __u64 xlated_prog_insns; + __u64 load_time; + __u32 created_by_uid; + __u32 nr_map_ids; + __u64 map_ids; + char name[16]; + __u32 ifindex; + __u32 gpl_compatible: 1; + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; + __u32 nr_jited_func_lens; + __u64 jited_ksyms; + __u64 jited_func_lens; + __u32 btf_id; + __u32 func_info_rec_size; + __u64 func_info; + __u32 nr_func_info; + __u32 nr_line_info; + __u64 line_info; + __u64 jited_line_info; + __u32 nr_jited_line_info; + __u32 line_info_rec_size; + __u32 jited_line_info_rec_size; + __u32 nr_prog_tags; + __u64 prog_tags; + __u64 run_time_ns; + __u64 run_cnt; + __u64 recursion_misses; + __u32 verified_insns; + __u32 attach_btf_obj_id; + __u32 attach_btf_id; +}; + +struct bpf_map_info { + __u32 type; + __u32 id; + __u32 key_size; + __u32 value_size; + __u32 max_entries; + __u32 map_flags; + char name[16]; + __u32 ifindex; + __u32 btf_vmlinux_value_type_id; + __u64 netns_dev; + __u64 netns_ino; + __u32 btf_id; + __u32 btf_key_type_id; + __u32 btf_value_type_id; + __u64 map_extra; +}; + +struct bpf_btf_info { + __u64 btf; + __u32 btf_size; + __u32 id; + __u64 name; + __u32 name_len; + __u32 kernel_btf; +}; + +struct bpf_spin_lock { + __u32 val; +}; + +struct radix_tree_preload { + local_lock_t lock; + unsigned int nr; + struct xa_node *nodes; +}; + +struct bpf_tramp_run_ctx { + struct bpf_run_ctx run_ctx; + u64 bpf_cookie; + struct bpf_run_ctx *saved_run_ctx; +}; + +struct bpf_attach_target_info { + struct btf_func_model fmodel; + long int tgt_addr; + const char *tgt_name; + const struct btf_type *tgt_type; +}; + +struct bpf_tracing_link { + struct bpf_tramp_link link; + enum bpf_attach_type attach_type; + struct bpf_trampoline *trampoline; + struct bpf_prog *tgt_prog; +}; + +enum perf_bpf_event_type { + PERF_BPF_EVENT_UNKNOWN = 0, + PERF_BPF_EVENT_PROG_LOAD = 1, + PERF_BPF_EVENT_PROG_UNLOAD = 2, + PERF_BPF_EVENT_MAX = 3, +}; + +enum bpf_audit { + BPF_AUDIT_LOAD = 0, + BPF_AUDIT_UNLOAD = 1, + BPF_AUDIT_MAX = 2, +}; + +struct bpf_prog_kstats { + u64 nsecs; + u64 cnt; + u64 misses; +}; + +struct bpf_raw_tp_link { + struct bpf_link link; + struct bpf_raw_event_map *btp; +}; + +struct bpf_perf_link { + struct bpf_link link; + struct file *perf_file; +}; + +typedef u64 (*btf_bpf_sys_bpf)(int, union bpf_attr *, u32); + +typedef u64 (*btf_bpf_sys_close)(u32); + +typedef u64 (*btf_bpf_kallsyms_lookup_name)(const char *, int, int, u64 *); + +struct firmware_cache { + spinlock_t lock; + struct list_head head; + int state; + spinlock_t name_lock; + struct list_head fw_names; + struct delayed_work work; + struct notifier_block pm_notify; +}; + +struct fw_cache_entry { + struct list_head list; + const char *name; +}; + +struct fw_name_devm { + long unsigned int magic; + const char *name; +}; + +struct firmware_work { + struct work_struct work; + struct module *module; + const char *name; + struct device *device; + void *context; + void (*cont)(const struct firmware *, void *); + u32 opt_flags; +}; + +enum { + SYSTAB = 0, + MMBASE = 1, + MMSIZE = 2, + DCSIZE = 3, + DCVERS = 4, + PARAMCOUNT = 5, +}; + +struct compat_ifconf { + compat_int_t ifc_len; + compat_caddr_t ifcbuf; +}; + +enum { + BPF_F_CURRENT_NETNS = -1, +}; + +struct bpf_sock_tuple { + union { + struct { + __be32 saddr; + __be32 daddr; + __be16 sport; + __be16 dport; + } ipv4; + struct { + __be32 saddr[4]; + __be32 daddr[4]; + __be16 sport; + __be16 dport; + } ipv6; + }; +}; + +struct xdp_md { + __u32 data; + __u32 data_end; + __u32 data_meta; + __u32 ingress_ifindex; + __u32 rx_queue_index; + __u32 egress_ifindex; +}; + +struct nf_conn___init { + struct nf_conn ct; +}; + +struct bpf_ct_opts { + s32 netns_id; + s32 error; + u8 l4proto; + u8 dir; + u8 reserved[2]; +}; + +enum { + NF_BPF_CT_OPTS_SZ = 12, +}; + +struct fib4_rule { + struct fib_rule common; + u8 dst_len; + u8 src_len; + dscp_t dscp; + __be32 src; + __be32 srcmask; + __be32 dst; + __be32 dstmask; +}; + +struct xfrm_policy_afinfo { + struct dst_ops *dst_ops; + struct dst_entry * (*dst_lookup)(struct net *, int, int, const xfrm_address_t *, const xfrm_address_t *, u32); + int (*get_saddr)(struct net *, int, xfrm_address_t *, xfrm_address_t *, u32); + int (*fill_dst)(struct xfrm_dst *, struct net_device *, const struct flowi *); + struct dst_entry * (*blackhole_route)(struct net *, struct dst_entry *); +}; + +struct ip_beet_phdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 padlen; + __u8 reserved; +}; + +enum { + XFRM_MODE_FLAG_TUNNEL = 1, +}; + +enum { + XFRM_STATE_VOID = 0, + XFRM_STATE_ACQ = 1, + XFRM_STATE_VALID = 2, + XFRM_STATE_ERROR = 3, + XFRM_STATE_EXPIRED = 4, + XFRM_STATE_DEAD = 5, +}; + +struct xfrm_state_afinfo { + u8 family; + u8 proto; + const struct xfrm_type_offload *type_offload_esp; + const struct xfrm_type *type_esp; + const struct xfrm_type *type_ipip; + const struct xfrm_type *type_ipip6; + const struct xfrm_type *type_comp; + const struct xfrm_type *type_ah; + const struct xfrm_type *type_routing; + const struct xfrm_type *type_dstopts; + int (*output)(struct net *, struct sock *, struct sk_buff *); + int (*transport_finish)(struct sk_buff *, int); + void (*local_error)(struct sk_buff *, u32); +}; + +struct xfrm_tunnel_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + union { + struct ip_tunnel *ip4; + struct ip6_tnl *ip6; + } tunnel; +}; + +struct xfrm_mode_skb_cb { + struct xfrm_tunnel_skb_cb header; + __be16 id; + __be16 frag_off; + u8 ihl; + u8 tos; + u8 ttl; + u8 protocol; + u8 optlen; + u8 flow_lbl[3]; +}; + +struct elf64_phdr { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +}; + +typedef long unsigned int ulong; + +struct rcu_gp_oldstate { + long unsigned int rgos_norm; + long unsigned int rgos_exp; +}; + +struct swait_queue { + struct task_struct *task; + struct list_head task_list; +}; + +enum ctx_state { + CONTEXT_DISABLED = -1, + CONTEXT_KERNEL = 0, + CONTEXT_IDLE = 1, + CONTEXT_USER = 2, + CONTEXT_GUEST = 3, + CONTEXT_MAX = 4, +}; + +struct context_tracking { + atomic_t state; + long int dynticks_nesting; + long int dynticks_nmi_nesting; +}; + +struct rt_mutex { + struct rt_mutex_base rtmutex; + struct lockdep_map dep_map; +}; + +struct rcu_exp_work { + long unsigned int rew_s; + struct work_struct rew_work; +}; + +struct rcu_node { + raw_spinlock_t lock; + long unsigned int gp_seq; + long unsigned int gp_seq_needed; + long unsigned int completedqs; + long unsigned int qsmask; + long unsigned int rcu_gp_init_mask; + long unsigned int qsmaskinit; + long unsigned int qsmaskinitnext; + long unsigned int expmask; + long unsigned int expmaskinit; + long unsigned int expmaskinitnext; + long unsigned int cbovldmask; + long unsigned int ffmask; + long unsigned int grpmask; + int grplo; + int grphi; + u8 grpnum; + u8 level; + bool wait_blkd_tasks; + struct rcu_node *parent; + struct list_head blkd_tasks; + struct list_head *gp_tasks; + struct list_head *exp_tasks; + struct list_head *boost_tasks; + struct rt_mutex boost_mtx; + long unsigned int boost_time; + struct mutex boost_kthread_mutex; + struct task_struct *boost_kthread_task; + unsigned int boost_kthread_status; + long unsigned int n_boosts; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + raw_spinlock_t fqslock; + spinlock_t exp_lock; + long unsigned int exp_seq_rq; + wait_queue_head_t exp_wq[4]; + struct rcu_exp_work rew; + bool exp_need_flush; + raw_spinlock_t exp_poll_lock; + long unsigned int exp_seq_poll_rq; + struct work_struct exp_poll_wq; + long: 64; + long: 64; +}; + +struct sched_param { + int sched_priority; +}; + +enum tick_dep_bits { + TICK_DEP_BIT_POSIX_TIMER = 0, + TICK_DEP_BIT_PERF_EVENTS = 1, + TICK_DEP_BIT_SCHED = 2, + TICK_DEP_BIT_CLOCK_UNSTABLE = 3, + TICK_DEP_BIT_RCU = 4, + TICK_DEP_BIT_RCU_EXP = 5, +}; + +union rcu_noqs { + struct { + u8 norm; + u8 exp; + } b; + u16 s; +}; + +struct rcu_data { + long unsigned int gp_seq; + long unsigned int gp_seq_needed; + union rcu_noqs cpu_no_qs; + bool core_needs_qs; + bool beenonline; + bool gpwrap; + bool cpu_started; + struct rcu_node *mynode; + long unsigned int grpmask; + long unsigned int ticks_this_gp; + struct irq_work defer_qs_iw; + bool defer_qs_iw_pending; + struct work_struct strict_work; + struct rcu_segcblist cblist; + long int qlen_last_fqs_check; + long unsigned int n_cbs_invoked; + long unsigned int n_force_qs_snap; + long int blimit; + int dynticks_snap; + bool rcu_need_heavy_qs; + bool rcu_urgent_qs; + bool rcu_forced_tick; + bool rcu_forced_tick_exp; + long unsigned int barrier_seq_snap; + struct callback_head barrier_head; + int exp_dynticks_snap; + struct task_struct *rcu_cpu_kthread_task; + unsigned int rcu_cpu_kthread_status; + char rcu_cpu_has_work; + long unsigned int rcuc_activity; + unsigned int softirq_snap; + struct irq_work rcu_iw; + bool rcu_iw_pending; + long unsigned int rcu_iw_gp_seq; + long unsigned int rcu_ofl_gp_seq; + short int rcu_ofl_gp_flags; + long unsigned int rcu_onl_gp_seq; + short int rcu_onl_gp_flags; + long unsigned int last_fqs_resched; + long unsigned int last_sched_clock; + long int lazy_len; + int cpu; +}; + +struct rcu_state { + struct rcu_node node[9]; + struct rcu_node *level[3]; + int ncpus; + int n_online_cpus; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int gp_seq; + long unsigned int gp_max; + struct task_struct *gp_kthread; + struct swait_queue_head gp_wq; + short int gp_flags; + short int gp_state; + long unsigned int gp_wake_time; + long unsigned int gp_wake_seq; + long unsigned int gp_seq_polled; + long unsigned int gp_seq_polled_snap; + long unsigned int gp_seq_polled_exp_snap; + struct mutex barrier_mutex; + atomic_t barrier_cpu_count; + struct completion barrier_completion; + long unsigned int barrier_sequence; + raw_spinlock_t barrier_lock; + struct mutex exp_mutex; + struct mutex exp_wake_mutex; + long unsigned int expedited_sequence; + atomic_t expedited_need_qs; + struct swait_queue_head expedited_wq; + int ncpus_snap; + u8 cbovld; + u8 cbovldnext; + long unsigned int jiffies_force_qs; + long unsigned int jiffies_kick_kthreads; + long unsigned int n_force_qs; + long unsigned int gp_start; + long unsigned int gp_end; + long unsigned int gp_activity; + long unsigned int gp_req_activity; + long unsigned int jiffies_stall; + long unsigned int jiffies_resched; + long unsigned int n_force_qs_gpstart; + const char *name; + char abbr; + long: 56; + long: 64; + arch_spinlock_t ofl_lock; + int nocb_is_setup; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +enum rcutorture_type { + RCU_FLAVOR = 0, + RCU_TASKS_FLAVOR = 1, + RCU_TASKS_RUDE_FLAVOR = 2, + RCU_TASKS_TRACING_FLAVOR = 3, + RCU_TRIVIAL_FLAVOR = 4, + SRCU_FLAVOR = 5, + INVALID_RCU_FLAVOR = 6, +}; + +struct kvfree_rcu_bulk_data { + long unsigned int nr_records; + struct kvfree_rcu_bulk_data *next; + void *records[0]; +}; + +struct kfree_rcu_cpu; + +struct kfree_rcu_cpu_work { + struct rcu_work rcu_work; + struct callback_head *head_free; + struct kvfree_rcu_bulk_data *bkvhead_free[2]; + struct kfree_rcu_cpu *krcp; +}; + +struct kfree_rcu_cpu { + struct callback_head *head; + struct kvfree_rcu_bulk_data *bkvhead[2]; + struct kfree_rcu_cpu_work krw_arr[2]; + raw_spinlock_t lock; + struct delayed_work monitor_work; + bool initialized; + int count; + struct delayed_work page_cache_work; + atomic_t backoff_page_cache_fill; + atomic_t work_in_progress; + struct hrtimer hrtimer; + struct llist_head bkvcache; + int nr_bkv_objs; +}; + +struct rcu_stall_chk_rdr { + int nesting; + union rcu_special rs; + bool on_blkd_list; +}; + +struct debugfs_blob_wrapper { + void *data; + long unsigned int size; +}; + +typedef efi_status_t efi_query_variable_store_t(u32, long unsigned int, bool); + +typedef struct { + efi_guid_t guid; + u64 table; +} efi_config_table_64_t; + +typedef struct { + u16 version; + u16 length; + u32 runtime_services_supported; +} efi_rt_properties_table_t; + +struct efivar_operations { + efi_get_variable_t *get_variable; + efi_get_next_variable_t *get_next_variable; + efi_set_variable_t *set_variable; + efi_set_variable_t *set_variable_nonblocking; + efi_query_variable_store_t *query_variable_store; +}; + +struct efivars { + struct kset *kset; + struct kobject *kobject; + const struct efivar_operations *ops; +}; + +struct linux_efi_random_seed { + u32 size; + u8 bits[0]; +}; + +struct linux_efi_memreserve { + int size; + atomic_t count; + phys_addr_t next; + struct { + phys_addr_t base; + phys_addr_t size; + } entry[0]; +}; + +typedef u16 ucs2_char_t; + +struct features_reply_data { + struct ethnl_reply_data base; + u32 hw[2]; + u32 wanted[2]; + u32 active[2]; + u32 nochange[2]; + u32 all[2]; +}; + +typedef __s64 Elf64_Sxword; + +struct elf64_rela { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +}; + +typedef struct elf64_rela Elf64_Rela; + +enum aarch64_reloc_op { + RELOC_OP_NONE = 0, + RELOC_OP_ABS = 1, + RELOC_OP_PREL = 2, + RELOC_OP_PAGE = 3, +}; + +enum aarch64_insn_movw_imm_type { + AARCH64_INSN_IMM_MOVNZ = 0, + AARCH64_INSN_IMM_MOVKZ = 1, +}; + +struct bpf_bloom_filter { + struct bpf_map map; + u32 bitset_mask; + u32 hash_seed; + u32 aligned_u32_count; + u32 nr_hash_funcs; + long unsigned int bitset[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct memory_tier { + struct list_head list; + struct list_head memory_types; + int adistance_start; + struct device dev; + nodemask_t lower_tier_mask; +}; + +struct memory_notify { + long unsigned int start_pfn; + long unsigned int nr_pages; + int status_change_nid_normal; + int status_change_nid; +}; + +struct memory_dev_type { + struct list_head tier_sibiling; + int adistance; + nodemask_t nodes; + struct kref kref; +}; + +struct demotion_nodes { + nodemask_t preferred; +}; + +struct node_memory_type_map { + struct memory_dev_type *memtype; + int map_count; +}; + +struct kernel_cpustat { + u64 cpustat[10]; +}; + +struct ext4_system_zone { + struct rb_node node; + ext4_fsblk_t start_blk; + unsigned int count; + u32 ino; +}; + +struct shash_instance { + void (*free)(struct shash_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[256]; + struct crypto_instance base; + } s; + struct shash_alg alg; + }; +}; + +struct crypto_shash_spawn { + struct crypto_spawn base; +}; + +struct hmac_ctx { + struct crypto_shash *hash; +}; + +struct io_uring_rsrc_update { + __u32 offset; + __u32 resv; + __u64 data; +}; + +typedef struct io_wq_work *free_work_fn(struct io_wq_work *); + +typedef void io_wq_work_fn(struct io_wq_work *); + +struct io_wq_data { + struct io_wq_hash *hash; + struct task_struct *task; + io_wq_work_fn *do_work; + free_work_fn *free_work; +}; + +struct io_tctx_node { + struct list_head ctx_node; + struct task_struct *task; + struct io_ring_ctx *ctx; +}; + +struct tcpa_event { + u32 pcr_index; + u32 event_type; + u8 pcr_value[20]; + u32 event_size; + u8 event_data[0]; +}; + +enum tcpa_event_types { + PREBOOT = 0, + POST_CODE = 1, + UNUSED = 2, + NO_ACTION = 3, + SEPARATOR = 4, + ACTION = 5, + EVENT_TAG = 6, + SCRTM_CONTENTS = 7, + SCRTM_VERSION = 8, + CPU_MICROCODE = 9, + PLATFORM_CONFIG_FLAGS = 10, + TABLE_OF_DEVICES = 11, + COMPACT_HASH = 12, + IPL = 13, + IPL_PARTITION_DATA = 14, + NONHOST_CODE = 15, + NONHOST_CONFIG = 16, + NONHOST_INFO = 17, +}; + +struct tcpa_pc_event { + u32 event_id; + u32 event_size; + u8 event_data[0]; +}; + +enum tcpa_pc_event_ids { + SMBIOS = 1, + BIS_CERT = 2, + POST_BIOS_ROM = 3, + ESCD = 4, + CMOS = 5, + NVRAM = 6, + OPTION_ROM_EXEC = 7, + OPTION_ROM_CONFIG = 8, + OPTION_ROM_MICROCODE = 10, + S_CRTM_VERSION = 11, + S_CRTM_CONTENTS = 12, + POST_CONTENTS = 13, + HOST_TABLE_OF_DEVICES = 14, +}; + +struct trace_event_raw_thermal_temperature { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int temp_prev; + int temp; + char __data[0]; +}; + +struct trace_event_raw_cdev_update { + struct trace_entry ent; + u32 __data_loc_type; + long unsigned int target; + char __data[0]; +}; + +struct trace_event_raw_thermal_zone_trip { + struct trace_entry ent; + u32 __data_loc_thermal_zone; + int id; + int trip; + enum thermal_trip_type trip_type; + char __data[0]; +}; + +struct trace_event_data_offsets_thermal_temperature { + u32 thermal_zone; +}; + +struct trace_event_data_offsets_cdev_update { + u32 type; +}; + +struct trace_event_data_offsets_thermal_zone_trip { + u32 thermal_zone; +}; + +typedef void (*btf_trace_thermal_temperature)(void *, struct thermal_zone_device *); + +typedef void (*btf_trace_cdev_update)(void *, struct thermal_cooling_device *, long unsigned int); + +typedef void (*btf_trace_thermal_zone_trip)(void *, struct thermal_zone_device *, int, enum thermal_trip_type); + +struct fib_notifier_info { + int family; + struct netlink_ext_ack *extack; +}; + +enum fib_event_type { + FIB_EVENT_ENTRY_REPLACE = 0, + FIB_EVENT_ENTRY_APPEND = 1, + FIB_EVENT_ENTRY_ADD = 2, + FIB_EVENT_ENTRY_DEL = 3, + FIB_EVENT_RULE_ADD = 4, + FIB_EVENT_RULE_DEL = 5, + FIB_EVENT_NH_ADD = 6, + FIB_EVENT_NH_DEL = 7, + FIB_EVENT_VIF_ADD = 8, + FIB_EVENT_VIF_DEL = 9, +}; + +struct fib_notifier_net { + struct list_head fib_notifier_ops; + struct atomic_notifier_head fib_chain; +}; + +struct mr_table_ops { + const struct rhashtable_params *rht_params; + void *cmparg_any; +}; + +struct vif_device { + struct net_device *dev; + netdevice_tracker dev_tracker; + long unsigned int bytes_in; + long unsigned int bytes_out; + long unsigned int pkt_in; + long unsigned int pkt_out; + long unsigned int rate_limit; + unsigned char threshold; + short unsigned int flags; + int link; + struct netdev_phys_item_id dev_parent_id; + __be32 local; + __be32 remote; +}; + +struct mr_table { + struct list_head list; + possible_net_t net; + struct mr_table_ops ops; + u32 id; + struct sock *mroute_sk; + struct timer_list ipmr_expire_timer; + struct list_head mfc_unres_queue; + struct vif_device vif_table[32]; + struct rhltable mfc_hash; + struct list_head mfc_cache_list; + int maxvif; + atomic_t cache_resolve_queue_len; + bool mroute_do_assert; + bool mroute_do_pim; + bool mroute_do_wrvifwhole; + int mroute_reg_vif_num; +}; + +struct fib_rt_info { + struct fib_info *fi; + u32 tb_id; + __be32 dst; + int dst_len; + dscp_t dscp; + u8 type; + u8 offload: 1; + u8 trap: 1; + u8 offload_failed: 1; + u8 unused: 5; +}; + +struct uncached_list { + spinlock_t lock; + struct list_head head; + struct list_head quarantine; +}; + +struct rt_cache_stat { + unsigned int in_slow_tot; + unsigned int in_slow_mc; + unsigned int in_no_route; + unsigned int in_brd; + unsigned int in_martian_dst; + unsigned int in_martian_src; + unsigned int out_slow_tot; + unsigned int out_slow_mc; +}; + +struct fib_alias { + struct hlist_node fa_list; + struct fib_info *fa_info; + dscp_t fa_dscp; + u8 fa_type; + u8 fa_state; + u8 fa_slen; + u32 tb_id; + s16 fa_default; + u8 offload; + u8 trap; + u8 offload_failed; + struct callback_head rcu; +}; + +struct fib_prop { + int error; + u8 scope; +}; + +enum transparent_hugepage_flag { + TRANSPARENT_HUGEPAGE_NEVER_DAX = 0, + TRANSPARENT_HUGEPAGE_FLAG = 1, + TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG = 2, + TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG = 3, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG = 4, + TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG = 5, + TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG = 6, + TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG = 7, + TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG = 8, +}; + +struct shared_policy { + struct rb_root root; + rwlock_t lock; +}; + +struct shmem_inode_info { + spinlock_t lock; + unsigned int seals; + long unsigned int flags; + long unsigned int alloced; + long unsigned int swapped; + long unsigned int fallocend; + struct list_head shrinklist; + struct list_head swaplist; + struct shared_policy policy; + struct simple_xattrs xattrs; + atomic_t stop_eviction; + struct timespec64 i_crtime; + unsigned int fsflags; + struct inode vfs_inode; +}; + +struct trace_event_raw_hugepage_set_pmd { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pmd; + char __data[0]; +}; + +struct trace_event_raw_hugepage_update { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pte; + long unsigned int clr; + long unsigned int set; + char __data[0]; +}; + +struct trace_event_raw_migration_pmd { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pmd; + char __data[0]; +}; + +struct trace_event_data_offsets_hugepage_set_pmd {}; + +struct trace_event_data_offsets_hugepage_update {}; + +struct trace_event_data_offsets_migration_pmd {}; + +typedef void (*btf_trace_hugepage_set_pmd)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_hugepage_update)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_set_migration_pmd)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_remove_migration_pmd)(void *, long unsigned int, long unsigned int); + +struct termios { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; +}; + +struct termios2 { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t c_line; + cc_t c_cc[19]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +struct termio { + short unsigned int c_iflag; + short unsigned int c_oflag; + short unsigned int c_cflag; + short unsigned int c_lflag; + unsigned char c_line; + unsigned char c_cc[8]; +}; + +struct iommu_group { + struct kobject kobj; + struct kobject *devices_kobj; + struct list_head devices; + struct mutex mutex; + void *iommu_data; + void (*iommu_data_release)(void *); + char *name; + int id; + struct iommu_domain *default_domain; + struct iommu_domain *blocking_domain; + struct iommu_domain *domain; + struct list_head entry; + unsigned int owner_cnt; + void *owner; +}; + +enum iommu_fault_type { + IOMMU_FAULT_DMA_UNRECOV = 1, + IOMMU_FAULT_PAGE_REQ = 2, +}; + +struct fsl_mc_obj_desc { + char type[16]; + int id; + u16 vendor; + u16 ver_major; + u16 ver_minor; + u8 irq_count; + u8 region_count; + u32 state; + char label[16]; + u16 flags; +}; + +struct fsl_mc_io; + +struct fsl_mc_device_irq; + +struct fsl_mc_resource; + +struct fsl_mc_device { + struct device dev; + u64 dma_mask; + u16 flags; + u32 icid; + u16 mc_handle; + struct fsl_mc_io *mc_io; + struct fsl_mc_obj_desc obj_desc; + struct resource *regions; + struct fsl_mc_device_irq **irqs; + struct fsl_mc_resource *resource; + struct device_link *consumer_link; + const char *driver_override; +}; + +enum fsl_mc_pool_type { + FSL_MC_POOL_DPMCP = 0, + FSL_MC_POOL_DPBP = 1, + FSL_MC_POOL_DPCON = 2, + FSL_MC_POOL_IRQ = 3, + FSL_MC_NUM_POOL_TYPES = 4, +}; + +struct fsl_mc_resource_pool; + +struct fsl_mc_resource { + enum fsl_mc_pool_type type; + s32 id; + void *data; + struct fsl_mc_resource_pool *parent_pool; + struct list_head node; +}; + +struct fsl_mc_device_irq { + unsigned int virq; + struct fsl_mc_device *mc_dev; + u8 dev_irq_index; + struct fsl_mc_resource resource; +}; + +struct fsl_mc_io { + struct device *dev; + u16 flags; + u32 portal_size; + phys_addr_t portal_phys_addr; + void *portal_virt_addr; + struct fsl_mc_device *dpmcp_dev; + union { + struct mutex mutex; + raw_spinlock_t spinlock; + }; +}; + +struct group_device { + struct list_head list; + struct device *dev; + char *name; +}; + +struct iommu_group_attribute { + struct attribute attr; + ssize_t (*show)(struct iommu_group *, char *); + ssize_t (*store)(struct iommu_group *, const char *, size_t); +}; + +struct group_for_pci_data { + struct pci_dev *pdev; + struct iommu_group *group; +}; + +struct __group_domain_type { + struct device *dev; + unsigned int type; +}; + +struct input_dev_poller { + void (*poll)(struct input_dev *); + unsigned int poll_interval; + unsigned int poll_interval_max; + unsigned int poll_interval_min; + struct input_dev *input; + struct delayed_work work; +}; + +struct ir_raw_handler { + struct list_head list; + u64 protocols; + int (*decode)(struct rc_dev *, struct ir_raw_event); + int (*encode)(enum rc_proto, u32, struct ir_raw_event *, unsigned int); + u32 carrier; + u32 min_timeout; + int (*raw_register)(struct rc_dev *); + int (*raw_unregister)(struct rc_dev *); +}; + +struct ir_raw_timings_manchester { + unsigned int leader_pulse; + unsigned int leader_space; + unsigned int clock; + unsigned int invert: 1; + unsigned int trailer_space; +}; + +struct ir_raw_timings_pd { + unsigned int header_pulse; + unsigned int header_space; + unsigned int bit_pulse; + unsigned int bit_space[2]; + unsigned int trailer_pulse; + unsigned int trailer_space; + unsigned int msb_first: 1; +}; + +struct ir_raw_timings_pl { + unsigned int header_pulse; + unsigned int bit_space; + unsigned int bit_pulse[2]; + unsigned int trailer_space; + unsigned int msb_first: 1; +}; + +struct cper_sec_proc_arm { + u32 validation_bits; + u16 err_info_num; + u16 context_info_num; + u32 section_length; + u8 affinity_level; + u8 reserved[3]; + u64 mpidr; + u64 midr; + u32 running_state; + u32 psci_state; +}; + +enum hw_event_mc_err_type { + HW_EVENT_ERR_CORRECTED = 0, + HW_EVENT_ERR_UNCORRECTED = 1, + HW_EVENT_ERR_DEFERRED = 2, + HW_EVENT_ERR_FATAL = 3, + HW_EVENT_ERR_INFO = 4, +}; + +struct aer_header_log_regs { + unsigned int dw0; + unsigned int dw1; + unsigned int dw2; + unsigned int dw3; +}; + +struct trace_event_raw_mc_event { + struct trace_entry ent; + unsigned int error_type; + u32 __data_loc_msg; + u32 __data_loc_label; + u16 error_count; + u8 mc_index; + s8 top_layer; + s8 middle_layer; + s8 lower_layer; + long int address; + u8 grain_bits; + long int syndrome; + u32 __data_loc_driver_detail; + char __data[0]; +}; + +struct trace_event_raw_arm_event { + struct trace_entry ent; + u64 mpidr; + u64 midr; + u32 running_state; + u32 psci_state; + u8 affinity; + char __data[0]; +}; + +struct trace_event_raw_non_standard_event { + struct trace_entry ent; + char sec_type[16]; + char fru_id[16]; + u32 __data_loc_fru_text; + u8 sev; + u32 len; + u32 __data_loc_buf; + char __data[0]; +}; + +struct trace_event_raw_aer_event { + struct trace_entry ent; + u32 __data_loc_dev_name; + u32 status; + u8 severity; + u8 tlp_header_valid; + u32 tlp_header[4]; + char __data[0]; +}; + +struct trace_event_raw_memory_failure_event { + struct trace_entry ent; + long unsigned int pfn; + int type; + int result; + char __data[0]; +}; + +struct trace_event_data_offsets_mc_event { + u32 msg; + u32 label; + u32 driver_detail; +}; + +struct trace_event_data_offsets_arm_event {}; + +struct trace_event_data_offsets_non_standard_event { + u32 fru_text; + u32 buf; +}; + +struct trace_event_data_offsets_aer_event { + u32 dev_name; +}; + +struct trace_event_data_offsets_memory_failure_event {}; + +typedef void (*btf_trace_mc_event)(void *, const unsigned int, const char *, const char *, const int, const u8, const s8, const s8, const s8, long unsigned int, const u8, long unsigned int, const char *); + +typedef void (*btf_trace_arm_event)(void *, const struct cper_sec_proc_arm *); + +typedef void (*btf_trace_non_standard_event)(void *, const guid_t *, const guid_t *, const char *, const u8, const u8 *, const u32); + +typedef void (*btf_trace_aer_event)(void *, const char *, const u32, const u8, const u8, struct aer_header_log_regs *); + +typedef void (*btf_trace_memory_failure_event)(void *, long unsigned int, int, int); + +struct mmpin { + struct user_struct *user; + unsigned int num_pg; +}; + +struct ubuf_info_msgzc { + struct ubuf_info ubuf; + union { + struct { + long unsigned int desc; + void *ctx; + }; + struct { + u32 id; + u16 len; + u16 zerocopy: 1; + u32 bytelen; + }; + }; + struct mmpin mmp; +}; + +struct ip_fraglist_iter { + struct sk_buff *frag; + struct iphdr *iph; + int offset; + unsigned int hlen; +}; + +struct ip_frag_state { + bool DF; + unsigned int hlen; + unsigned int ll_rs; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + __be16 not_last_frag; +}; + +struct ip_reply_arg { + struct kvec iov[1]; + int flags; + __wsum csum; + int csumoffset; + int bound_dev_if; + u8 tos; + kuid_t uid; +}; + +struct vmap_area { + long unsigned int va_start; + long unsigned int va_end; + struct rb_node rb_node; + struct list_head list; + union { + long unsigned int subtree_max_size; + struct vm_struct *vm; + }; +}; + +typedef unsigned int kasan_vmalloc_flags_t; + +struct rb_augment_callbacks { + void (*propagate)(struct rb_node *, struct rb_node *); + void (*copy)(struct rb_node *, struct rb_node *); + void (*rotate)(struct rb_node *, struct rb_node *); +}; + +struct vfree_deferred { + struct llist_head list; + struct work_struct wq; +}; + +enum fit_type { + NOTHING_FIT = 0, + FL_FIT_TYPE = 1, + LE_FIT_TYPE = 2, + RE_FIT_TYPE = 3, + NE_FIT_TYPE = 4, +}; + +struct vmap_block_queue { + spinlock_t lock; + struct list_head free; +}; + +struct vmap_block { + spinlock_t lock; + struct vmap_area *va; + long unsigned int free; + long unsigned int dirty; + long unsigned int dirty_min; + long unsigned int dirty_max; + struct list_head free_list; + struct callback_head callback_head; + struct list_head purge; +}; + +struct jbd2_journal_revoke_header_s { + journal_header_t r_header; + __be32 r_count; +}; + +typedef struct jbd2_journal_revoke_header_s jbd2_journal_revoke_header_t; + +struct jbd2_revoke_table_s { + int hash_size; + int hash_shift; + struct list_head *hash_table; +}; + +struct jbd2_revoke_record_s { + struct list_head hash; + tid_t sequence; + long long unsigned int blocknr; +}; + +enum evm_ima_xattr_type { + IMA_XATTR_DIGEST = 1, + EVM_XATTR_HMAC = 2, + EVM_IMA_XATTR_DIGSIG = 3, + IMA_XATTR_DIGEST_NG = 4, + EVM_XATTR_PORTABLE_DIGSIG = 5, + IMA_VERITY_DIGSIG = 6, + IMA_XATTR_LAST = 7, +}; + +struct ima_max_digest_data { + struct ima_digest_data hdr; + u8 digest[64]; +}; + +enum data_formats { + DATA_FMT_DIGEST = 0, + DATA_FMT_DIGEST_WITH_ALGO = 1, + DATA_FMT_DIGEST_WITH_TYPE_AND_ALGO = 2, + DATA_FMT_STRING = 3, + DATA_FMT_HEX = 4, + DATA_FMT_UINT = 5, +}; + +enum digest_type { + DIGEST_TYPE_IMA = 0, + DIGEST_TYPE_VERITY = 1, + DIGEST_TYPE__LAST = 2, +}; + +struct sg_io_v4 { + __s32 guard; + __u32 protocol; + __u32 subprotocol; + __u32 request_len; + __u64 request; + __u64 request_tag; + __u32 request_attr; + __u32 request_priority; + __u32 request_extra; + __u32 max_response_len; + __u64 response; + __u32 dout_iovec_count; + __u32 dout_xfer_len; + __u32 din_iovec_count; + __u32 din_xfer_len; + __u64 dout_xferp; + __u64 din_xferp; + __u32 timeout; + __u32 flags; + __u64 usr_ptr; + __u32 spare_in; + __u32 driver_status; + __u32 transport_status; + __u32 device_status; + __u32 retry_delay; + __u32 info; + __u32 duration; + __u32 response_len; + __s32 din_resid; + __s32 dout_resid; + __u64 generated_tag; + __u32 spare_out; + __u32 padding; +}; + +typedef int bsg_sg_io_fn(struct request_queue *, struct sg_io_v4 *, fmode_t, unsigned int); + +struct bsg_device { + struct request_queue *queue; + struct device device; + struct cdev cdev; + int max_queue; + unsigned int timeout; + unsigned int reserved_size; + bsg_sg_io_fn *sg_io_fn; +}; + +struct rta_mfc_stats { + __u64 mfcs_packets; + __u64 mfcs_bytes; + __u64 mfcs_wrong_if; +}; + +struct vif_entry_notifier_info { + struct fib_notifier_info info; + struct net_device *dev; + short unsigned int vif_index; + short unsigned int vif_flags; + u32 tb_id; +}; + +enum { + MFC_STATIC = 1, + MFC_OFFLOAD = 2, +}; + +struct mr_mfc { + struct rhlist_head mnode; + short unsigned int mfc_parent; + int mfc_flags; + union { + struct { + long unsigned int expires; + struct sk_buff_head unresolved; + } unres; + struct { + long unsigned int last_assert; + int minvif; + int maxvif; + long unsigned int bytes; + long unsigned int pkt; + long unsigned int wrong_if; + long unsigned int lastuse; + unsigned char ttls[32]; + refcount_t refcount; + } res; + } mfc_un; + struct list_head list; + struct callback_head rcu; + void (*free)(struct callback_head *); +}; + +struct mfc_entry_notifier_info { + struct fib_notifier_info info; + struct mr_mfc *mfc; + u32 tb_id; +}; + +struct mr_vif_iter { + struct seq_net_private p; + struct mr_table *mrt; + int ct; +}; + +struct mr_mfc_iter { + struct seq_net_private p; + struct mr_table *mrt; + struct list_head *cache; + spinlock_t *lock; +}; + +struct sadb_alg { + __u8 sadb_alg_id; + __u8 sadb_alg_ivlen; + __u16 sadb_alg_minbits; + __u16 sadb_alg_maxbits; + __u16 sadb_alg_reserved; +}; + +enum { + XFRM_SHARE_ANY = 0, + XFRM_SHARE_SESSION = 1, + XFRM_SHARE_USER = 2, + XFRM_SHARE_UNIQUE = 3, +}; + +struct xfrm_user_sec_ctx { + __u16 len; + __u16 exttype; + __u8 ctx_alg; + __u8 ctx_doi; + __u16 ctx_len; +}; + +struct xfrm_user_tmpl { + struct xfrm_id id; + __u16 family; + xfrm_address_t saddr; + __u32 reqid; + __u8 mode; + __u8 share; + __u8 optional; + __u32 aalgos; + __u32 ealgos; + __u32 calgos; +}; + +enum xfrm_ae_ftype_t { + XFRM_AE_UNSPEC = 0, + XFRM_AE_RTHR = 1, + XFRM_AE_RVAL = 2, + XFRM_AE_LVAL = 4, + XFRM_AE_ETHR = 8, + XFRM_AE_CR = 16, + XFRM_AE_CE = 32, + XFRM_AE_CU = 64, + __XFRM_AE_MAX = 65, +}; + +struct xfrm_userpolicy_type { + __u8 type; + __u16 reserved1; + __u8 reserved2; +}; + +enum xfrm_sadattr_type_t { + XFRMA_SAD_UNSPEC = 0, + XFRMA_SAD_CNT = 1, + XFRMA_SAD_HINFO = 2, + __XFRMA_SAD_MAX = 3, +}; + +struct xfrmu_sadhinfo { + __u32 sadhcnt; + __u32 sadhmcnt; +}; + +enum xfrm_spdattr_type_t { + XFRMA_SPD_UNSPEC = 0, + XFRMA_SPD_INFO = 1, + XFRMA_SPD_HINFO = 2, + XFRMA_SPD_IPV4_HTHRESH = 3, + XFRMA_SPD_IPV6_HTHRESH = 4, + __XFRMA_SPD_MAX = 5, +}; + +struct xfrmu_spdinfo { + __u32 incnt; + __u32 outcnt; + __u32 fwdcnt; + __u32 inscnt; + __u32 outscnt; + __u32 fwdscnt; +}; + +struct xfrmu_spdhinfo { + __u32 spdhcnt; + __u32 spdhmcnt; +}; + +struct xfrmu_spdhthresh { + __u8 lbits; + __u8 rbits; +}; + +struct xfrm_usersa_info { + struct xfrm_selector sel; + struct xfrm_id id; + xfrm_address_t saddr; + struct xfrm_lifetime_cfg lft; + struct xfrm_lifetime_cur curlft; + struct xfrm_stats stats; + __u32 seq; + __u32 reqid; + __u16 family; + __u8 mode; + __u8 replay_window; + __u8 flags; +}; + +struct xfrm_usersa_id { + xfrm_address_t daddr; + __be32 spi; + __u16 family; + __u8 proto; +}; + +struct xfrm_aevent_id { + struct xfrm_usersa_id sa_id; + xfrm_address_t saddr; + __u32 flags; + __u32 reqid; +}; + +struct xfrm_userspi_info { + struct xfrm_usersa_info info; + __u32 min; + __u32 max; +}; + +struct xfrm_userpolicy_info { + struct xfrm_selector sel; + struct xfrm_lifetime_cfg lft; + struct xfrm_lifetime_cur curlft; + __u32 priority; + __u32 index; + __u8 dir; + __u8 action; + __u8 flags; + __u8 share; +}; + +struct xfrm_userpolicy_id { + struct xfrm_selector sel; + __u32 index; + __u8 dir; +}; + +struct xfrm_user_acquire { + struct xfrm_id id; + xfrm_address_t saddr; + struct xfrm_selector sel; + struct xfrm_userpolicy_info policy; + __u32 aalgos; + __u32 ealgos; + __u32 calgos; + __u32 seq; +}; + +struct xfrm_user_expire { + struct xfrm_usersa_info state; + __u8 hard; +}; + +struct xfrm_user_polexpire { + struct xfrm_userpolicy_info pol; + __u8 hard; +}; + +struct xfrm_usersa_flush { + __u8 proto; +}; + +struct xfrm_user_report { + __u8 proto; + struct xfrm_selector sel; +}; + +struct xfrm_user_mapping { + struct xfrm_usersa_id id; + __u32 reqid; + xfrm_address_t old_saddr; + xfrm_address_t new_saddr; + __be16 old_sport; + __be16 new_sport; +}; + +struct xfrm_user_offload { + int ifindex; + __u8 flags; +}; + +struct xfrm_userpolicy_default { + __u8 in; + __u8 fwd; + __u8 out; +}; + +enum xfrm_nlgroups { + XFRMNLGRP_NONE = 0, + XFRMNLGRP_ACQUIRE = 1, + XFRMNLGRP_EXPIRE = 2, + XFRMNLGRP_SA = 3, + XFRMNLGRP_POLICY = 4, + XFRMNLGRP_AEVENTS = 5, + XFRMNLGRP_REPORT = 6, + XFRMNLGRP_MIGRATE = 7, + XFRMNLGRP_MAPPING = 8, + __XFRMNLGRP_MAX = 9, +}; + +enum { + XFRM_DEV_OFFLOAD_IN = 1, + XFRM_DEV_OFFLOAD_OUT = 2, + XFRM_DEV_OFFLOAD_FWD = 3, +}; + +struct km_event { + union { + u32 hard; + u32 proto; + u32 byid; + u32 aevent; + u32 type; + } data; + u32 seq; + u32 portid; + u32 event; + struct net *net; +}; + +struct xfrm_policy_walk { + struct xfrm_policy_walk_entry walk; + u8 type; + u32 seq; +}; + +struct xfrm_kmaddress { + xfrm_address_t local; + xfrm_address_t remote; + u32 reserved; + u16 family; +}; + +struct xfrm_migrate { + xfrm_address_t old_daddr; + xfrm_address_t old_saddr; + xfrm_address_t new_daddr; + xfrm_address_t new_saddr; + u8 proto; + u8 mode; + u16 reserved; + u32 reqid; + u16 old_family; + u16 new_family; +}; + +struct xfrm_mgr { + struct list_head list; + int (*notify)(struct xfrm_state *, const struct km_event *); + int (*acquire)(struct xfrm_state *, struct xfrm_tmpl *, struct xfrm_policy *); + struct xfrm_policy * (*compile_policy)(struct sock *, int, u8 *, int, int *); + int (*new_mapping)(struct xfrm_state *, xfrm_address_t *, __be16); + int (*notify_policy)(struct xfrm_policy *, int, const struct km_event *); + int (*report)(struct net *, u8, struct xfrm_selector *, xfrm_address_t *); + int (*migrate)(const struct xfrm_selector *, u8, u8, const struct xfrm_migrate *, int, const struct xfrm_kmaddress *, const struct xfrm_encap_tmpl *); + bool (*is_alive)(const struct km_event *); +}; + +struct xfrm_algo_aead_info { + char *geniv; + u16 icv_truncbits; +}; + +struct xfrm_algo_auth_info { + u16 icv_truncbits; + u16 icv_fullbits; +}; + +struct xfrm_algo_encr_info { + char *geniv; + u16 blockbits; + u16 defkeybits; +}; + +struct xfrm_algo_comp_info { + u16 threshold; +}; + +struct xfrm_algo_desc { + char *name; + char *compat; + u8 available: 1; + u8 pfkey_supported: 1; + union { + struct xfrm_algo_aead_info aead; + struct xfrm_algo_auth_info auth; + struct xfrm_algo_encr_info encr; + struct xfrm_algo_comp_info comp; + } uinfo; + struct sadb_alg desc; +}; + +struct xfrmk_sadinfo { + u32 sadhcnt; + u32 sadhmcnt; + u32 sadcnt; +}; + +struct xfrmk_spdinfo { + u32 incnt; + u32 outcnt; + u32 fwdcnt; + u32 inscnt; + u32 outscnt; + u32 fwdscnt; + u32 spdhcnt; + u32 spdhmcnt; +}; + +struct xfrm_translator { + int (*alloc_compat)(struct sk_buff *, const struct nlmsghdr *); + struct nlmsghdr * (*rcv_msg_compat)(const struct nlmsghdr *, int, const struct nla_policy *, struct netlink_ext_ack *); + int (*xlate_user_policy_sockptr)(u8 **, int); + struct module *owner; +}; + +struct xfrm_dump_info { + struct sk_buff *in_skb; + struct sk_buff *out_skb; + u32 nlmsg_seq; + u16 nlmsg_flags; +}; + +struct xfrm_link { + int (*doit)(struct sk_buff *, struct nlmsghdr *, struct nlattr **, struct netlink_ext_ack *); + int (*start)(struct netlink_callback *); + int (*dump)(struct sk_buff *, struct netlink_callback *); + int (*done)(struct netlink_callback *); + const struct nla_policy *nla_pol; + int nla_max; +}; + +enum perf_sample_regs_abi { + PERF_SAMPLE_REGS_ABI_NONE = 0, + PERF_SAMPLE_REGS_ABI_32 = 1, + PERF_SAMPLE_REGS_ABI_64 = 2, +}; + +enum perf_event_arm_regs { + PERF_REG_ARM64_X0 = 0, + PERF_REG_ARM64_X1 = 1, + PERF_REG_ARM64_X2 = 2, + PERF_REG_ARM64_X3 = 3, + PERF_REG_ARM64_X4 = 4, + PERF_REG_ARM64_X5 = 5, + PERF_REG_ARM64_X6 = 6, + PERF_REG_ARM64_X7 = 7, + PERF_REG_ARM64_X8 = 8, + PERF_REG_ARM64_X9 = 9, + PERF_REG_ARM64_X10 = 10, + PERF_REG_ARM64_X11 = 11, + PERF_REG_ARM64_X12 = 12, + PERF_REG_ARM64_X13 = 13, + PERF_REG_ARM64_X14 = 14, + PERF_REG_ARM64_X15 = 15, + PERF_REG_ARM64_X16 = 16, + PERF_REG_ARM64_X17 = 17, + PERF_REG_ARM64_X18 = 18, + PERF_REG_ARM64_X19 = 19, + PERF_REG_ARM64_X20 = 20, + PERF_REG_ARM64_X21 = 21, + PERF_REG_ARM64_X22 = 22, + PERF_REG_ARM64_X23 = 23, + PERF_REG_ARM64_X24 = 24, + PERF_REG_ARM64_X25 = 25, + PERF_REG_ARM64_X26 = 26, + PERF_REG_ARM64_X27 = 27, + PERF_REG_ARM64_X28 = 28, + PERF_REG_ARM64_X29 = 29, + PERF_REG_ARM64_LR = 30, + PERF_REG_ARM64_SP = 31, + PERF_REG_ARM64_PC = 32, + PERF_REG_ARM64_MAX = 33, + PERF_REG_ARM64_VG = 46, + PERF_REG_ARM64_EXTENDED_MAX = 47, +}; + +struct tracer_stat { + const char *name; + void * (*stat_start)(struct tracer_stat *); + void * (*stat_next)(void *, int); + cmp_func_t stat_cmp; + int (*stat_show)(struct seq_file *, void *); + void (*stat_release)(void *); + int (*stat_headers)(struct seq_file *); +}; + +struct stat_node { + struct rb_node node; + void *stat; +}; + +struct stat_session { + struct list_head session_list; + struct tracer_stat *ts; + struct rb_root stat_root; + struct mutex stat_mutex; + struct dentry *file; +}; + +enum { + XA_CHECK_SCHED = 4096, +}; + +enum positive_aop_returns { + AOP_WRITEPAGE_ACTIVATE = 524288, + AOP_TRUNCATED_PAGE = 524289, +}; + +struct wb_lock_cookie { + bool locked; + long unsigned int flags; +}; + +typedef int (*writepage_t)(struct page *, struct writeback_control *, void *); + +struct dirty_throttle_control { + struct wb_domain *dom; + struct dirty_throttle_control *gdtc; + struct bdi_writeback *wb; + struct fprop_local_percpu *wb_completions; + long unsigned int avail; + long unsigned int dirty; + long unsigned int thresh; + long unsigned int bg_thresh; + long unsigned int wb_dirty; + long unsigned int wb_thresh; + long unsigned int wb_bg_thresh; + long unsigned int pos_ratio; +}; + +struct rand_data; + +struct jitterentropy { + spinlock_t jent_lock; + struct rand_data *entropy_collector; + unsigned int reset_cnt; +}; + +enum { + IOSQE_FIXED_FILE_BIT = 0, + IOSQE_IO_DRAIN_BIT = 1, + IOSQE_IO_LINK_BIT = 2, + IOSQE_IO_HARDLINK_BIT = 3, + IOSQE_ASYNC_BIT = 4, + IOSQE_BUFFER_SELECT_BIT = 5, + IOSQE_CQE_SKIP_SUCCESS_BIT = 6, +}; + +enum { + IORING_REGISTER_BUFFERS = 0, + IORING_UNREGISTER_BUFFERS = 1, + IORING_REGISTER_FILES = 2, + IORING_UNREGISTER_FILES = 3, + IORING_REGISTER_EVENTFD = 4, + IORING_UNREGISTER_EVENTFD = 5, + IORING_REGISTER_FILES_UPDATE = 6, + IORING_REGISTER_EVENTFD_ASYNC = 7, + IORING_REGISTER_PROBE = 8, + IORING_REGISTER_PERSONALITY = 9, + IORING_UNREGISTER_PERSONALITY = 10, + IORING_REGISTER_RESTRICTIONS = 11, + IORING_REGISTER_ENABLE_RINGS = 12, + IORING_REGISTER_FILES2 = 13, + IORING_REGISTER_FILES_UPDATE2 = 14, + IORING_REGISTER_BUFFERS2 = 15, + IORING_REGISTER_BUFFERS_UPDATE = 16, + IORING_REGISTER_IOWQ_AFF = 17, + IORING_UNREGISTER_IOWQ_AFF = 18, + IORING_REGISTER_IOWQ_MAX_WORKERS = 19, + IORING_REGISTER_RING_FDS = 20, + IORING_UNREGISTER_RING_FDS = 21, + IORING_REGISTER_PBUF_RING = 22, + IORING_UNREGISTER_PBUF_RING = 23, + IORING_REGISTER_SYNC_CANCEL = 24, + IORING_REGISTER_FILE_ALLOC_RANGE = 25, + IORING_REGISTER_LAST = 26, +}; + +enum { + IO_WQ_BOUND = 0, + IO_WQ_UNBOUND = 1, +}; + +struct io_wqe; + +struct io_wq { + long unsigned int state; + free_work_fn *free_work; + io_wq_work_fn *do_work; + struct io_wq_hash *hash; + atomic_t worker_refs; + struct completion worker_done; + struct hlist_node cpuhp_node; + struct task_struct *task; + struct io_wqe *wqes[0]; +}; + +enum { + REQ_F_FIXED_FILE_BIT = 0, + REQ_F_IO_DRAIN_BIT = 1, + REQ_F_LINK_BIT = 2, + REQ_F_HARDLINK_BIT = 3, + REQ_F_FORCE_ASYNC_BIT = 4, + REQ_F_BUFFER_SELECT_BIT = 5, + REQ_F_CQE_SKIP_BIT = 6, + REQ_F_FAIL_BIT = 8, + REQ_F_INFLIGHT_BIT = 9, + REQ_F_CUR_POS_BIT = 10, + REQ_F_NOWAIT_BIT = 11, + REQ_F_LINK_TIMEOUT_BIT = 12, + REQ_F_NEED_CLEANUP_BIT = 13, + REQ_F_POLLED_BIT = 14, + REQ_F_BUFFER_SELECTED_BIT = 15, + REQ_F_BUFFER_RING_BIT = 16, + REQ_F_REISSUE_BIT = 17, + REQ_F_CREDS_BIT = 18, + REQ_F_REFCOUNT_BIT = 19, + REQ_F_ARM_LTIMEOUT_BIT = 20, + REQ_F_ASYNC_DATA_BIT = 21, + REQ_F_SKIP_LINK_CQES_BIT = 22, + REQ_F_SINGLE_POLL_BIT = 23, + REQ_F_DOUBLE_POLL_BIT = 24, + REQ_F_PARTIAL_IO_BIT = 25, + REQ_F_CQE32_INIT_BIT = 26, + REQ_F_APOLL_MULTISHOT_BIT = 27, + REQ_F_CLEAR_POLLIN_BIT = 28, + REQ_F_HASH_LOCKED_BIT = 29, + REQ_F_SUPPORT_NOWAIT_BIT = 30, + REQ_F_ISREG_BIT = 31, + __REQ_F_LAST_BIT = 32, +}; + +enum { + IO_WQ_WORK_CANCEL = 1, + IO_WQ_WORK_HASHED = 2, + IO_WQ_WORK_UNBOUND = 4, + IO_WQ_WORK_CONCURRENT = 16, + IO_WQ_HASH_SHIFT = 24, +}; + +enum io_wq_cancel { + IO_WQ_CANCEL_OK = 0, + IO_WQ_CANCEL_RUNNING = 1, + IO_WQ_CANCEL_NOTFOUND = 2, +}; + +typedef bool work_cancel_fn(struct io_wq_work *, void *); + +enum { + IO_WORKER_F_UP = 1, + IO_WORKER_F_RUNNING = 2, + IO_WORKER_F_FREE = 4, + IO_WORKER_F_BOUND = 8, +}; + +enum { + IO_WQ_BIT_EXIT = 0, +}; + +enum { + IO_ACCT_STALLED_BIT = 0, +}; + +struct io_worker { + refcount_t ref; + unsigned int flags; + struct hlist_nulls_node nulls_node; + struct list_head all_list; + struct task_struct *task; + struct io_wqe *wqe; + struct io_wq_work *cur_work; + struct io_wq_work *next_work; + raw_spinlock_t lock; + struct completion ref_done; + long unsigned int create_state; + struct callback_head create_work; + int create_index; + union { + struct callback_head rcu; + struct work_struct work; + }; +}; + +struct io_wqe_acct { + unsigned int nr_workers; + unsigned int max_workers; + int index; + atomic_t nr_running; + raw_spinlock_t lock; + struct io_wq_work_list work_list; + long unsigned int flags; +}; + +struct io_wqe { + raw_spinlock_t lock; + struct io_wqe_acct acct[2]; + int node; + struct hlist_nulls_head free_list; + struct list_head all_list; + struct wait_queue_entry wait; + struct io_wq *wq; + struct io_wq_work *hash_tail[64]; + cpumask_var_t cpu_mask; +}; + +enum { + IO_WQ_ACCT_BOUND = 0, + IO_WQ_ACCT_UNBOUND = 1, + IO_WQ_ACCT_NR = 2, +}; + +struct io_cb_cancel_data { + work_cancel_fn *fn; + void *data; + int nr_running; + int nr_pending; + bool cancel_all; +}; + +struct online_data { + unsigned int cpu; + bool online; +}; + +struct acpi_device_walk_info { + struct acpi_table_desc *table_desc; + struct acpi_evaluate_info *evaluate_info; + u32 device_count; + u32 num_STA; + u32 num_INI; +}; + +typedef acpi_status (*acpi_pkg_callback)(u8, union acpi_operand_object *, union acpi_generic_state *, void *); + +enum acpi_pptt_type { + ACPI_PPTT_TYPE_PROCESSOR = 0, + ACPI_PPTT_TYPE_CACHE = 1, + ACPI_PPTT_TYPE_ID = 2, + ACPI_PPTT_TYPE_RESERVED = 3, +}; + +struct acpi_pptt_processor { + struct acpi_subtable_header header; + u16 reserved; + u32 flags; + u32 parent; + u32 acpi_processor_id; + u32 number_of_priv_resources; +}; + +struct acpi_pptt_cache { + struct acpi_subtable_header header; + u16 reserved; + u32 flags; + u32 next_level_of_cache; + u32 size; + u32 number_of_sets; + u8 associativity; + u8 attributes; + u16 line_size; +}; + +struct acpi_pptt_cache_v1 { + u32 cache_id; +}; + +struct file_priv { + struct tpm_chip *chip; + struct tpm_space *space; + struct mutex buffer_mutex; + struct timer_list user_read_timer; + struct work_struct timeout_work; + struct work_struct async_work; + wait_queue_head_t async_wait; + ssize_t response_length; + bool response_read; + bool command_enqueued; + u8 data_buffer[4096]; +}; + +struct fib_entry_notifier_info { + struct fib_notifier_info info; + u32 dst; + int dst_len; + struct fib_info *fi; + dscp_t dscp; + u8 type; + u32 tb_id; +}; + +struct fib6_entry_notifier_info { + struct fib_notifier_info info; + struct fib6_info *rt; + unsigned int nsiblings; +}; + +struct devlink_dev_stats { + u32 reload_stats[6]; + u32 remote_reload_stats[6]; +}; + +struct devlink_dpipe_headers; + +struct devlink_ops; + +struct devlink { + u32 index; + struct xarray ports; + struct list_head rate_list; + struct list_head sb_list; + struct list_head dpipe_table_list; + struct list_head resource_list; + struct list_head param_list; + struct list_head region_list; + struct list_head reporter_list; + struct mutex reporters_lock; + struct devlink_dpipe_headers *dpipe_headers; + struct list_head trap_list; + struct list_head trap_group_list; + struct list_head trap_policer_list; + struct list_head linecard_list; + struct mutex linecards_lock; + const struct devlink_ops *ops; + u64 features; + struct xarray snapshot_ids; + struct devlink_dev_stats stats; + struct device *dev; + possible_net_t _net; + struct mutex lock; + struct lock_class_key lock_key; + u8 reload_failed: 1; + refcount_t refcount; + struct completion comp; + struct callback_head rcu; + struct notifier_block netdevice_nb; + long: 64; + char priv[0]; +}; + +typedef u64 devlink_resource_occ_get_t(void *); + +enum nsim_resource_id { + NSIM_RESOURCE_NONE = 0, + NSIM_RESOURCE_IPV4 = 1, + NSIM_RESOURCE_IPV4_FIB = 2, + NSIM_RESOURCE_IPV4_FIB_RULES = 3, + NSIM_RESOURCE_IPV6 = 4, + NSIM_RESOURCE_IPV6_FIB = 5, + NSIM_RESOURCE_IPV6_FIB_RULES = 6, + NSIM_RESOURCE_NEXTHOPS = 7, +}; + +struct nsim_fib_entry { + u64 max; + atomic64_t num; +}; + +struct nsim_per_fib_data { + struct nsim_fib_entry fib; + struct nsim_fib_entry rules; +}; + +struct nsim_fib_data { + struct notifier_block fib_nb; + struct nsim_per_fib_data ipv4; + struct nsim_per_fib_data ipv6; + struct nsim_fib_entry nexthops; + struct rhashtable fib_rt_ht; + struct list_head fib_rt_list; + struct mutex fib_lock; + struct notifier_block nexthop_nb; + struct rhashtable nexthop_ht; + struct devlink *devlink; + struct work_struct fib_event_work; + struct work_struct fib_flush_work; + struct list_head fib_event_queue; + spinlock_t fib_event_queue_lock; + struct mutex nh_lock; + struct dentry *ddir; + bool fail_route_offload; + bool fail_res_nexthop_group_replace; + bool fail_nexthop_bucket_replace; + bool fail_route_delete; +}; + +struct nsim_fib_rt_key { + unsigned char addr[16]; + unsigned char prefix_len; + int family; + u32 tb_id; +}; + +struct nsim_fib_rt { + struct nsim_fib_rt_key key; + struct rhash_head ht_node; + struct list_head list; +}; + +struct nsim_fib4_rt { + struct nsim_fib_rt common; + struct fib_info *fi; + dscp_t dscp; + u8 type; +}; + +struct nsim_fib6_rt { + struct nsim_fib_rt common; + struct list_head nh_list; + unsigned int nhs; +}; + +struct nsim_fib6_rt_nh { + struct list_head list; + struct fib6_info *rt; +}; + +struct nsim_fib6_event { + struct fib6_info **rt_arr; + unsigned int nrt6; +}; + +struct nsim_fib_event { + struct list_head list; + union { + struct fib_entry_notifier_info fen_info; + struct nsim_fib6_event fib6_event; + }; + struct nsim_fib_data *data; + long unsigned int event; + int family; +}; + +struct nsim_nexthop { + struct rhash_head ht_node; + u64 occ; + u32 id; + bool is_resilient; +}; + +struct mptcp_mib { + long unsigned int mibs[52]; +}; + +struct mptcp_out_options { + u16 suboptions; + struct mptcp_rm_list rm_list; + u8 join_id; + u8 backup; + u8 reset_reason: 4; + u8 reset_transient: 1; + u8 csum_reqd: 1; + u8 allow_join_id0: 1; + union { + struct { + u64 sndr_key; + u64 rcvr_key; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + __sum16 csum; + }; + struct { + struct mptcp_addr_info addr; + u64 ahmac; + }; + struct { + struct mptcp_ext ext_copy; + u64 fail_seq; + }; + struct { + u32 nonce; + u32 token; + u64 thmac; + u8 hmac[20]; + }; + }; +}; + +struct mptcp_options_received { + u64 sndr_key; + u64 rcvr_key; + u64 data_ack; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + __sum16 csum; + u16 suboptions; + u32 token; + u32 nonce; + u16 use_map: 1; + u16 dsn64: 1; + u16 data_fin: 1; + u16 use_ack: 1; + u16 ack64: 1; + u16 mpc_map: 1; + u16 reset_reason: 4; + u16 reset_transient: 1; + u16 echo: 1; + u16 backup: 1; + u16 deny_join_id0: 1; + u16 __unused: 2; + u8 join_id; + u64 thmac; + u8 hmac[20]; + struct mptcp_addr_info addr; + struct mptcp_rm_list rm_list; + u64 ahmac; + u64 fail_seq; +}; + +enum mptcp_addr_signal_status { + MPTCP_ADD_ADDR_SIGNAL = 0, + MPTCP_ADD_ADDR_ECHO = 1, + MPTCP_RM_ADDR_SIGNAL = 2, +}; + +struct csum_pseudo_header { + __be64 data_seq; + __be32 subflow_seq; + __be16 data_len; + __sum16 csum; +}; + +struct mptcp_delegated_action { + struct napi_struct napi; + struct list_head head; +}; + +enum linux_mptcp_mib_field { + MPTCP_MIB_NUM = 0, + MPTCP_MIB_MPCAPABLEPASSIVE = 1, + MPTCP_MIB_MPCAPABLEACTIVE = 2, + MPTCP_MIB_MPCAPABLEACTIVEACK = 3, + MPTCP_MIB_MPCAPABLEPASSIVEACK = 4, + MPTCP_MIB_MPCAPABLEPASSIVEFALLBACK = 5, + MPTCP_MIB_MPCAPABLEACTIVEFALLBACK = 6, + MPTCP_MIB_TOKENFALLBACKINIT = 7, + MPTCP_MIB_RETRANSSEGS = 8, + MPTCP_MIB_JOINNOTOKEN = 9, + MPTCP_MIB_JOINSYNRX = 10, + MPTCP_MIB_JOINSYNACKRX = 11, + MPTCP_MIB_JOINSYNACKMAC = 12, + MPTCP_MIB_JOINACKRX = 13, + MPTCP_MIB_JOINACKMAC = 14, + MPTCP_MIB_DSSNOMATCH = 15, + MPTCP_MIB_INFINITEMAPTX = 16, + MPTCP_MIB_INFINITEMAPRX = 17, + MPTCP_MIB_DSSTCPMISMATCH = 18, + MPTCP_MIB_DATACSUMERR = 19, + MPTCP_MIB_OFOQUEUETAIL = 20, + MPTCP_MIB_OFOQUEUE = 21, + MPTCP_MIB_OFOMERGE = 22, + MPTCP_MIB_NODSSWINDOW = 23, + MPTCP_MIB_DUPDATA = 24, + MPTCP_MIB_ADDADDR = 25, + MPTCP_MIB_ECHOADD = 26, + MPTCP_MIB_PORTADD = 27, + MPTCP_MIB_ADDADDRDROP = 28, + MPTCP_MIB_JOINPORTSYNRX = 29, + MPTCP_MIB_JOINPORTSYNACKRX = 30, + MPTCP_MIB_JOINPORTACKRX = 31, + MPTCP_MIB_MISMATCHPORTSYNRX = 32, + MPTCP_MIB_MISMATCHPORTACKRX = 33, + MPTCP_MIB_RMADDR = 34, + MPTCP_MIB_RMADDRDROP = 35, + MPTCP_MIB_RMSUBFLOW = 36, + MPTCP_MIB_MPPRIOTX = 37, + MPTCP_MIB_MPPRIORX = 38, + MPTCP_MIB_MPFAILTX = 39, + MPTCP_MIB_MPFAILRX = 40, + MPTCP_MIB_MPFASTCLOSETX = 41, + MPTCP_MIB_MPFASTCLOSERX = 42, + MPTCP_MIB_MPRSTTX = 43, + MPTCP_MIB_MPRSTRX = 44, + MPTCP_MIB_RCVPRUNED = 45, + MPTCP_MIB_SUBFLOWSTALE = 46, + MPTCP_MIB_SUBFLOWRECOVER = 47, + MPTCP_MIB_SNDWNDSHARED = 48, + MPTCP_MIB_RCVWNDSHARED = 49, + MPTCP_MIB_RCVWNDCONFLICTUPDATE = 50, + MPTCP_MIB_RCVWNDCONFLICT = 51, + __MPTCP_MIB_MAX = 52, +}; + +struct mptcp_pm_add_entry; + +struct perf_callchain_entry_ctx { + struct perf_callchain_entry *entry; + u32 max_stack; + u32 nr; + short int contexts; + bool contexts_maxed; +}; + +struct frame_tail { + struct frame_tail *fp; + long unsigned int lr; +}; + +struct ktime_timestamps { + u64 mono; + u64 boot; + u64 real; +}; + +struct system_time_snapshot { + u64 cycles; + ktime_t real; + ktime_t raw; + enum clocksource_ids cs_id; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; +}; + +struct system_counterval_t { + u64 cycles; + struct clocksource *cs; +}; + +typedef struct { + seqcount_t seqcount; +} seqcount_latch_t; + +struct tk_read_base { + struct clocksource *clock; + u64 mask; + u64 cycle_last; + u32 mult; + u32 shift; + u64 xtime_nsec; + ktime_t base; + u64 base_real; +}; + +struct timekeeper { + struct tk_read_base tkr_mono; + struct tk_read_base tkr_raw; + u64 xtime_sec; + long unsigned int ktime_sec; + struct timespec64 wall_to_monotonic; + ktime_t offs_real; + ktime_t offs_boot; + ktime_t offs_tai; + s32 tai_offset; + unsigned int clock_was_set_seq; + u8 cs_was_changed_seq; + ktime_t next_leap_ktime; + u64 raw_sec; + struct timespec64 monotonic_to_boot; + u64 cycle_interval; + u64 xtime_interval; + s64 xtime_remainder; + u64 raw_interval; + u64 ntp_tick; + s64 ntp_error; + u32 ntp_error_shift; + u32 ntp_err_mult; + u32 skip_second_overflow; +}; + +enum timekeeping_adv_mode { + TK_ADV_TICK = 0, + TK_ADV_FREQ = 1, +}; + +struct tk_fast { + seqcount_latch_t seq; + struct tk_read_base base[2]; +}; + +struct dynevent_arg_pair { + const char *lhs; + const char *rhs; + char operator; + char separator; +}; + +struct fs_error_report { + int error; + struct inode *inode; + struct super_block *sb; +}; + +struct ramfs_mount_opts { + umode_t mode; +}; + +struct ramfs_fs_info { + struct ramfs_mount_opts mount_opts; +}; + +enum ramfs_param { + Opt_mode___2 = 0, +}; + +struct avc_cache { + struct hlist_head slots[512]; + spinlock_t slots_lock[512]; + atomic_t lru_hint; + atomic_t active_nodes; + u32 latest_notif; +}; + +struct selinux_avc { + unsigned int avc_cache_threshold; + struct avc_cache avc_cache; +}; + +struct avc_cache_stats { + unsigned int lookups; + unsigned int misses; + unsigned int allocations; + unsigned int reclaims; + unsigned int frees; +}; + +struct trace_event_raw_selinux_audited { + struct trace_entry ent; + u32 requested; + u32 denied; + u32 audited; + int result; + u32 __data_loc_scontext; + u32 __data_loc_tcontext; + u32 __data_loc_tclass; + char __data[0]; +}; + +struct trace_event_data_offsets_selinux_audited { + u32 scontext; + u32 tcontext; + u32 tclass; +}; + +typedef void (*btf_trace_selinux_audited)(void *, struct selinux_audit_data *, char *, char *, const char *); + +struct avc_xperms_node; + +struct avc_entry { + u32 ssid; + u32 tsid; + u16 tclass; + struct av_decision avd; + struct avc_xperms_node *xp_node; +}; + +struct avc_xperms_node { + struct extended_perms xp; + struct list_head xpd_head; +}; + +struct avc_node { + struct avc_entry ae; + struct hlist_node list; + struct callback_head rhead; +}; + +struct avc_xperms_decision_node { + struct extended_perms_decision xpd; + struct list_head xpd_list; +}; + +struct avc_callback_node { + int (*callback)(u32); + u32 events; + struct avc_callback_node *next; +}; + +typedef s64 int64_t; + +struct menu_device { + int needs_update; + int tick_wakeup; + u64 next_timer_ns; + unsigned int bucket; + unsigned int correction_factor[12]; + unsigned int intervals[8]; + int interval_ptr; +}; + +enum sys_off_mode { + SYS_OFF_MODE_POWER_OFF_PREPARE = 0, + SYS_OFF_MODE_POWER_OFF = 1, + SYS_OFF_MODE_RESTART_PREPARE = 2, + SYS_OFF_MODE_RESTART = 3, +}; + +struct sys_off_data { + int mode; + void *cb_data; + const char *cmd; +}; + +struct sys_off_handler; + +struct pingv6_ops { + int (*ipv6_recv_error)(struct sock *, struct msghdr *, int, int *); + void (*ip6_datagram_recv_common_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + void (*ip6_datagram_recv_specific_ctl)(struct sock *, struct msghdr *, struct sk_buff *); + int (*icmpv6_err_convert)(u8, u8, int *); + void (*ipv6_icmp_error)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *); + int (*ipv6_chk_addr)(struct net *, const struct in6_addr *, const struct net_device *, int); +}; + +struct ping_iter_state { + struct seq_net_private p; + int bucket; + sa_family_t family; +}; + +struct pingfakehdr { + struct icmphdr icmph; + struct msghdr *msg; + sa_family_t family; + __wsum wcheck; +}; + +enum sysctl_writes_mode { + SYSCTL_WRITES_LEGACY = -1, + SYSCTL_WRITES_WARN = 0, + SYSCTL_WRITES_STRICT = 1, +}; + +struct do_proc_dointvec_minmax_conv_param { + int *min; + int *max; +}; + +struct do_proc_douintvec_minmax_conv_param { + unsigned int *min; + unsigned int *max; +}; + +enum ima_hooks { + NONE = 0, + FILE_CHECK = 1, + MMAP_CHECK = 2, + BPRM_CHECK = 3, + CREDS_CHECK = 4, + POST_SETATTR = 5, + MODULE_CHECK = 6, + FIRMWARE_CHECK = 7, + KEXEC_KERNEL_CHECK = 8, + KEXEC_INITRAMFS_CHECK = 9, + POLICY_CHECK = 10, + KEXEC_CMDLINE = 11, + KEY_CHECK = 12, + CRITICAL_DATA = 13, + SETXATTR_CHECK = 14, + MAX_CHECK = 15, +}; + +enum asymmetric_payload_bits { + asym_crypto = 0, + asym_subtype = 1, + asym_key_ids = 2, + asym_auth = 3, +}; + +struct asymmetric_key_subtype { + struct module *owner; + const char *name; + short unsigned int name_len; + void (*describe)(const struct key *, struct seq_file *); + void (*destroy)(void *, void *); + int (*query)(const struct kernel_pkey_params *, struct kernel_pkey_query *); + int (*eds_op)(struct kernel_pkey_params *, const void *, void *); + int (*verify_signature)(const struct key *, const struct public_key_signature *); +}; + +struct open_flags { + int open_flag; + umode_t mode; + int acc_mode; + int intent; + int lookup_flags; +}; + +struct io_open { + struct file *file; + int dfd; + u32 file_slot; + struct filename *filename; + struct open_how how; + long unsigned int nofile; +}; + +struct io_close { + struct file *file; + int fd; + u32 file_slot; +}; + +typedef struct { + size_t bitContainer; + unsigned int bitsConsumed; + const char *ptr; + const char *start; + const char *limitPtr; +} BIT_DStream_t; + +typedef enum { + BIT_DStream_unfinished = 0, + BIT_DStream_endOfBuffer = 1, + BIT_DStream_completed = 2, + BIT_DStream_overflow = 3, +} BIT_DStream_status; + +typedef struct { + BYTE maxTableLog; + BYTE tableType; + BYTE tableLog; + BYTE reserved; +} DTableDesc; + +typedef struct { + BYTE byte; + BYTE nbBits; +} HUF_DEltX1; + +typedef struct { + U32 rankVal[16]; + U32 rankStart[16]; + U32 statsWksp[218]; + BYTE symbols[256]; + BYTE huffWeight[256]; +} HUF_ReadDTableX1_Workspace; + +typedef struct { + U16 sequence; + BYTE nbBits; + BYTE length; +} HUF_DEltX2; + +typedef struct { + BYTE symbol; + BYTE weight; +} sortedSymbol_t; + +typedef U32 rankValCol_t[13]; + +typedef struct { + U32 rankVal[156]; + U32 rankStats[13]; + U32 rankStart0[14]; + sortedSymbol_t sortedSymbol[256]; + BYTE weightList[256]; + U32 calleeWksp[218]; +} HUF_ReadDTableX2_Workspace; + +typedef struct { + U32 tableTime; + U32 decode256Time; +} algo_time_t; + +enum { + POWER_SUPPLY_STATUS_UNKNOWN = 0, + POWER_SUPPLY_STATUS_CHARGING = 1, + POWER_SUPPLY_STATUS_DISCHARGING = 2, + POWER_SUPPLY_STATUS_NOT_CHARGING = 3, + POWER_SUPPLY_STATUS_FULL = 4, +}; + +enum { + POWER_SUPPLY_TECHNOLOGY_UNKNOWN = 0, + POWER_SUPPLY_TECHNOLOGY_NiMH = 1, + POWER_SUPPLY_TECHNOLOGY_LION = 2, + POWER_SUPPLY_TECHNOLOGY_LIPO = 3, + POWER_SUPPLY_TECHNOLOGY_LiFe = 4, + POWER_SUPPLY_TECHNOLOGY_NiCd = 5, + POWER_SUPPLY_TECHNOLOGY_LiMn = 6, +}; + +enum { + POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN = 0, + POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL = 1, + POWER_SUPPLY_CAPACITY_LEVEL_LOW = 2, + POWER_SUPPLY_CAPACITY_LEVEL_NORMAL = 3, + POWER_SUPPLY_CAPACITY_LEVEL_HIGH = 4, + POWER_SUPPLY_CAPACITY_LEVEL_FULL = 5, +}; + +struct acpi_battery_hook { + const char *name; + int (*add_battery)(struct power_supply *, struct acpi_battery_hook *); + int (*remove_battery)(struct power_supply *, struct acpi_battery_hook *); + struct list_head list; +}; + +enum { + ACPI_BATTERY_ALARM_PRESENT = 0, + ACPI_BATTERY_XINFO_PRESENT = 1, + ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY = 2, + ACPI_BATTERY_QUIRK_THINKPAD_MAH = 3, + ACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE = 4, +}; + +struct acpi_battery { + struct mutex lock; + struct mutex sysfs_lock; + struct power_supply *bat; + struct power_supply_desc bat_desc; + struct acpi_device *device; + struct notifier_block pm_nb; + struct list_head list; + long unsigned int update_time; + int revision; + int rate_now; + int capacity_now; + int voltage_now; + int design_capacity; + int full_charge_capacity; + int technology; + int design_voltage; + int design_capacity_warning; + int design_capacity_low; + int cycle_count; + int measurement_accuracy; + int max_sampling_time; + int min_sampling_time; + int max_averaging_interval; + int min_averaging_interval; + int capacity_granularity_1; + int capacity_granularity_2; + int alarm; + char model_number[32]; + char serial_number[32]; + char type[32]; + char oem_info[32]; + int state; + int power_unit; + long unsigned int flags; +}; + +struct acpi_offsets { + size_t offset; + u8 mode; +}; + +struct class_attribute_string { + struct class_attribute attr; + char *str; +}; + +struct class_compat { + struct kobject *kobj; +}; + +struct pps_event_time { + struct timespec64 ts_real; +}; + +enum ptp_clock_events { + PTP_CLOCK_ALARM = 0, + PTP_CLOCK_EXTTS = 1, + PTP_CLOCK_PPS = 2, + PTP_CLOCK_PPSUSR = 3, +}; + +struct ptp_clock_event { + int type; + int index; + union { + u64 timestamp; + struct pps_event_time pps_times; + }; +}; + +enum flow_dissect_ret { + FLOW_DISSECT_RET_OUT_GOOD = 0, + FLOW_DISSECT_RET_OUT_BAD = 1, + FLOW_DISSECT_RET_PROTO_AGAIN = 2, + FLOW_DISSECT_RET_IPPROTO_AGAIN = 3, + FLOW_DISSECT_RET_CONTINUE = 4, +}; + +struct flow_dissector_key_hash { + u32 hash; +}; + +struct flow_dissector_key_num_of_vlans { + u8 num_of_vlans; +}; + +struct flow_keys_digest { + u8 data[16]; +}; + +struct bpf_flow_dissector { + struct bpf_flow_keys *flow_keys; + const struct sk_buff *skb; + const void *data; + const void *data_end; +}; + +enum { + TCA_FLOWER_KEY_CT_FLAGS_NEW = 1, + TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED = 2, + TCA_FLOWER_KEY_CT_FLAGS_RELATED = 4, + TCA_FLOWER_KEY_CT_FLAGS_TRACKED = 8, + TCA_FLOWER_KEY_CT_FLAGS_INVALID = 16, + TCA_FLOWER_KEY_CT_FLAGS_REPLY = 32, + __TCA_FLOWER_KEY_CT_FLAGS_MAX = 33, +}; + +enum { + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 1, + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 2, + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 4, +}; + +struct gre_full_hdr { + struct gre_base_hdr fixed_header; + __be16 csum; + __be16 reserved1; + __be32 key; + __be32 seq; +}; + +struct pptp_gre_header { + struct gre_base_hdr gre_hd; + __be16 payload_len; + __be16 call_id; + __be32 seq; + __be32 ack; +}; + +struct tipc_basic_hdr { + __be32 w[4]; +}; + +struct pppoe_tag { + __be16 tag_type; + __be16 tag_len; + char tag_data[0]; +}; + +struct pppoe_hdr { + __u8 type: 4; + __u8 ver: 4; + __u8 code; + __be16 sid; + __be16 length; + struct pppoe_tag tag[0]; +}; + +struct hsr_tag { + __be16 path_and_LSDU_size; + __be16 sequence_nr; + __be16 encap_proto; +}; + +struct mpls_label { + __be32 entry; +}; + +struct clock_identity { + u8 id[8]; +}; + +struct port_identity { + struct clock_identity clock_identity; + __be16 port_number; +}; + +struct ptp_header { + u8 tsmt; + u8 ver; + __be16 message_length; + u8 domain_number; + u8 reserved1; + u8 flag_field[2]; + __be64 correction; + __be32 reserved2; + struct port_identity source_port_identity; + __be16 sequence_id; + u8 control; + u8 log_message_interval; +} __attribute__((packed)); + +enum batadv_packettype { + BATADV_IV_OGM = 0, + BATADV_BCAST = 1, + BATADV_CODED = 2, + BATADV_ELP = 3, + BATADV_OGM2 = 4, + BATADV_UNICAST = 64, + BATADV_UNICAST_FRAG = 65, + BATADV_UNICAST_4ADDR = 66, + BATADV_ICMP = 67, + BATADV_UNICAST_TVLV = 68, +}; + +struct batadv_unicast_packet { + __u8 packet_type; + __u8 version; + __u8 ttl; + __u8 ttvn; + __u8 dest[6]; +}; + +struct _flow_keys_digest_data { + __be16 n_proto; + u8 ip_proto; + u8 padding; + __be32 ports; + __be32 src; + __be32 dst; +}; + +enum hw_breakpoint_ops { + HW_BREAKPOINT_INSTALL = 0, + HW_BREAKPOINT_UNINSTALL = 1, + HW_BREAKPOINT_RESTORE = 2, +}; + +struct __kernel_old_itimerval { + struct __kernel_old_timeval it_interval; + struct __kernel_old_timeval it_value; +}; + +enum btf_func_linkage { + BTF_FUNC_STATIC = 0, + BTF_FUNC_GLOBAL = 1, + BTF_FUNC_EXTERN = 2, +}; + +struct btf_var_secinfo { + __u32 type; + __u32 offset; + __u32 size; +}; + +enum { + BTF_TRACING_TYPE_TASK = 0, + BTF_TRACING_TYPE_FILE = 1, + BTF_TRACING_TYPE_VMA = 2, + MAX_BTF_TRACING_TYPE = 3, +}; + +enum bpf_jit_poke_reason { + BPF_POKE_REASON_TAIL_CALL = 0, +}; + +struct bpf_kfunc_desc { + struct btf_func_model func_model; + u32 func_id; + s32 imm; + u16 offset; +}; + +struct bpf_kfunc_desc_tab { + struct bpf_kfunc_desc descs[256]; + u32 nr_descs; +}; + +struct bpf_kfunc_btf { + struct btf *btf; + struct module *module; + u16 offset; +}; + +struct bpf_kfunc_btf_tab { + struct bpf_kfunc_btf descs[256]; + u32 nr_descs; +}; + +struct bpf_array_aux { + struct list_head poke_progs; + struct bpf_map *map; + struct mutex poke_mutex; + struct work_struct work; +}; + +struct bpf_array { + struct bpf_map map; + u32 elem_size; + u32 index_mask; + struct bpf_array_aux *aux; + union { + char value[0]; + void *ptrs[0]; + void *pptrs[0]; + }; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef u32 (*bpf_convert_ctx_access_t)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *); + +struct bpf_core_ctx { + struct bpf_verifier_log *log; + const struct btf *btf; +}; + +enum bpf_stack_slot_type { + STACK_INVALID = 0, + STACK_SPILL = 1, + STACK_MISC = 2, + STACK_ZERO = 3, + STACK_DYNPTR = 4, +}; + +struct bpf_verifier_stack_elem { + struct bpf_verifier_state st; + int insn_idx; + int prev_insn_idx; + struct bpf_verifier_stack_elem *next; + u32 log_pos; +}; + +typedef void (*bpf_insn_print_t)(void *, const char *, ...); + +typedef const char * (*bpf_insn_revmap_call_t)(void *, const struct bpf_insn *); + +typedef const char * (*bpf_insn_print_imm_t)(void *, const struct bpf_insn *, __u64); + +struct bpf_insn_cbs { + bpf_insn_print_t cb_print; + bpf_insn_revmap_call_t cb_call; + bpf_insn_print_imm_t cb_imm; + void *private_data; +}; + +struct bpf_call_arg_meta { + struct bpf_map *map_ptr; + bool raw_mode; + bool pkt_access; + u8 release_regno; + int regno; + int access_size; + int mem_size; + u64 msize_max_value; + int ref_obj_id; + int map_uid; + int func_id; + struct btf *btf; + u32 btf_id; + struct btf *ret_btf; + u32 ret_btf_id; + u32 subprogno; + struct btf_field *kptr_field; + u8 uninit_dynptr_regno; +}; + +enum reg_arg_type { + SRC_OP = 0, + DST_OP = 1, + DST_OP_NO_MARK = 2, +}; + +enum bpf_access_src { + ACCESS_DIRECT = 1, + ACCESS_HELPER = 2, +}; + +struct bpf_reg_types { + const enum bpf_reg_type types[10]; + u32 *btf_id; +}; + +enum { + AT_PKT_END = -1, + BEYOND_PKT_END = -2, +}; + +typedef int (*set_callee_state_fn)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *, int); + +struct bpf_kfunc_call_arg_meta { + struct btf *btf; + u32 func_id; + u32 kfunc_flags; + const struct btf_type *func_proto; + const char *func_name; + u32 ref_obj_id; + u8 release_regno; + bool r0_rdonly; + u32 ret_btf_id; + u64 r0_size; + struct { + u64 value; + bool found; + } arg_constant; + struct { + struct btf *btf; + u32 btf_id; + } arg_obj_drop; + struct { + struct btf_field *field; + } arg_list_head; +}; + +enum { + KF_ARG_DYNPTR_ID = 0, + KF_ARG_LIST_HEAD_ID = 1, + KF_ARG_LIST_NODE_ID = 2, +}; + +enum kfunc_ptr_arg_type { + KF_ARG_PTR_TO_CTX = 0, + KF_ARG_PTR_TO_ALLOC_BTF_ID = 1, + KF_ARG_PTR_TO_KPTR = 2, + KF_ARG_PTR_TO_DYNPTR = 3, + KF_ARG_PTR_TO_LIST_HEAD = 4, + KF_ARG_PTR_TO_LIST_NODE = 5, + KF_ARG_PTR_TO_BTF_ID = 6, + KF_ARG_PTR_TO_MEM = 7, + KF_ARG_PTR_TO_MEM_SIZE = 8, +}; + +enum special_kfunc_type { + KF_bpf_obj_new_impl = 0, + KF_bpf_obj_drop_impl = 1, + KF_bpf_list_push_front = 2, + KF_bpf_list_push_back = 3, + KF_bpf_list_pop_front = 4, + KF_bpf_list_pop_back = 5, + KF_bpf_cast_to_kern_ctx = 6, + KF_bpf_rdonly_cast = 7, + KF_bpf_rcu_read_lock = 8, + KF_bpf_rcu_read_unlock = 9, +}; + +enum { + REASON_BOUNDS = -1, + REASON_TYPE = -2, + REASON_PATHS = -3, + REASON_LIMIT = -4, + REASON_STACK = -5, +}; + +struct bpf_sanitize_info { + struct bpf_insn_aux_data aux; + bool mask_to_left; +}; + +enum { + DISCOVERED = 16, + EXPLORED = 32, + FALLTHROUGH = 1, + BRANCH = 2, +}; + +enum { + DONE_EXPLORING = 0, + KEEP_EXPLORING = 1, +}; + +struct vc_selection { + struct mutex lock; + struct vc_data *cons; + char *buffer; + unsigned int buf_len; + volatile int start; + int end; +}; + +enum { + IFLA_BOND_UNSPEC = 0, + IFLA_BOND_MODE = 1, + IFLA_BOND_ACTIVE_SLAVE = 2, + IFLA_BOND_MIIMON = 3, + IFLA_BOND_UPDELAY = 4, + IFLA_BOND_DOWNDELAY = 5, + IFLA_BOND_USE_CARRIER = 6, + IFLA_BOND_ARP_INTERVAL = 7, + IFLA_BOND_ARP_IP_TARGET = 8, + IFLA_BOND_ARP_VALIDATE = 9, + IFLA_BOND_ARP_ALL_TARGETS = 10, + IFLA_BOND_PRIMARY = 11, + IFLA_BOND_PRIMARY_RESELECT = 12, + IFLA_BOND_FAIL_OVER_MAC = 13, + IFLA_BOND_XMIT_HASH_POLICY = 14, + IFLA_BOND_RESEND_IGMP = 15, + IFLA_BOND_NUM_PEER_NOTIF = 16, + IFLA_BOND_ALL_SLAVES_ACTIVE = 17, + IFLA_BOND_MIN_LINKS = 18, + IFLA_BOND_LP_INTERVAL = 19, + IFLA_BOND_PACKETS_PER_SLAVE = 20, + IFLA_BOND_AD_LACP_RATE = 21, + IFLA_BOND_AD_SELECT = 22, + IFLA_BOND_AD_INFO = 23, + IFLA_BOND_AD_ACTOR_SYS_PRIO = 24, + IFLA_BOND_AD_USER_PORT_KEY = 25, + IFLA_BOND_AD_ACTOR_SYSTEM = 26, + IFLA_BOND_TLB_DYNAMIC_LB = 27, + IFLA_BOND_PEER_NOTIF_DELAY = 28, + IFLA_BOND_AD_LACP_ACTIVE = 29, + IFLA_BOND_MISSED_MAX = 30, + IFLA_BOND_NS_IP6_TARGET = 31, + __IFLA_BOND_MAX = 32, +}; + +enum { + IFLA_BOND_AD_INFO_UNSPEC = 0, + IFLA_BOND_AD_INFO_AGGREGATOR = 1, + IFLA_BOND_AD_INFO_NUM_PORTS = 2, + IFLA_BOND_AD_INFO_ACTOR_KEY = 3, + IFLA_BOND_AD_INFO_PARTNER_KEY = 4, + IFLA_BOND_AD_INFO_PARTNER_MAC = 5, + __IFLA_BOND_AD_INFO_MAX = 6, +}; + +enum { + IFLA_BOND_SLAVE_UNSPEC = 0, + IFLA_BOND_SLAVE_STATE = 1, + IFLA_BOND_SLAVE_MII_STATUS = 2, + IFLA_BOND_SLAVE_LINK_FAILURE_COUNT = 3, + IFLA_BOND_SLAVE_PERM_HWADDR = 4, + IFLA_BOND_SLAVE_QUEUE_ID = 5, + IFLA_BOND_SLAVE_AD_AGGREGATOR_ID = 6, + IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE = 7, + IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE = 8, + IFLA_BOND_SLAVE_PRIO = 9, + __IFLA_BOND_SLAVE_MAX = 10, +}; + +enum { + LINK_XSTATS_TYPE_UNSPEC = 0, + LINK_XSTATS_TYPE_BRIDGE = 1, + LINK_XSTATS_TYPE_BOND = 2, + __LINK_XSTATS_TYPE_MAX = 3, +}; + +enum { + BOND_XSTATS_UNSPEC = 0, + BOND_XSTATS_3AD = 1, + __BOND_XSTATS_MAX = 2, +}; + +struct pmu_irq_ops { + void (*enable_pmuirq)(unsigned int); + void (*disable_pmuirq)(unsigned int); + void (*free_pmuirq)(unsigned int, int, void *); +}; + +enum { + BPF_F_BROADCAST = 8, + BPF_F_EXCLUDE_INGRESS = 16, +}; + +struct bpf_nh_params { + u32 nh_family; + union { + u32 ipv4_nh; + struct in6_addr ipv6_nh; + }; +}; + +struct bpf_redirect_info { + u64 tgt_index; + void *tgt_value; + struct bpf_map *map; + u32 flags; + u32 kern_flags; + u32 map_id; + enum bpf_map_type map_type; + struct bpf_nh_params nh; +}; + +struct xsk_map { + struct bpf_map map; + spinlock_t lock; + struct xdp_sock *xsk_map[0]; +}; + +struct xsk_map_node { + struct list_head node; + struct xsk_map *map; + struct xdp_sock **map_entry; +}; + +enum { + BPF_F_INDEX_MASK = 4294967295ULL, + BPF_F_CURRENT_CPU = 4294967295ULL, + BPF_F_CTXLEN_MASK = 4503595332403200ULL, +}; + +enum { + BPF_F_GET_BRANCH_RECORDS_SIZE = 1, +}; + +struct bpf_perf_event_value { + __u64 counter; + __u64 enabled; + __u64 running; +}; + +struct bpf_raw_tracepoint_args { + __u64 args[0]; +}; + +struct btf_ptr { + void *ptr; + __u32 type_id; + __u32 flags; +}; + +enum { + BTF_F_COMPACT = 1, + BTF_F_NONAME = 2, + BTF_F_PTR_RAW = 4, + BTF_F_ZERO = 8, +}; + +enum key_lookup_flag { + KEY_LOOKUP_CREATE = 1, + KEY_LOOKUP_PARTIAL = 2, + KEY_LOOKUP_ALL = 3, +}; + +struct bpf_event_entry { + struct perf_event *event; + struct file *perf_file; + struct file *map_file; + struct callback_head rcu; +}; + +typedef long unsigned int (*bpf_ctx_copy_t)(void *, const void *, long unsigned int, long unsigned int); + +struct bpf_key { + struct key *key; + bool has_ref; +}; + +typedef struct user_pt_regs bpf_user_pt_regs_t; + +struct bpf_perf_event_data { + bpf_user_pt_regs_t regs; + __u64 sample_period; + __u64 addr; +}; + +struct perf_event_query_bpf { + __u32 ids_len; + __u32 prog_cnt; + __u32 ids[0]; +}; + +struct bpf_perf_event_data_kern { + bpf_user_pt_regs_t *regs; + struct perf_sample_data *data; + struct perf_event *event; +}; + +struct trace_event_raw_bpf_trace_printk { + struct trace_entry ent; + u32 __data_loc_bpf_string; + char __data[0]; +}; + +struct trace_event_data_offsets_bpf_trace_printk { + u32 bpf_string; +}; + +typedef void (*btf_trace_bpf_trace_printk)(void *, const char *); + +struct bpf_trace_module { + struct module *module; + struct list_head list; +}; + +typedef u64 (*btf_bpf_override_return)(struct pt_regs *, long unsigned int); + +typedef u64 (*btf_bpf_probe_read_user)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_user_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_kernel_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_compat)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_read_compat_str)(void *, u32, const void *); + +typedef u64 (*btf_bpf_probe_write_user)(void *, const void *, u32); + +typedef u64 (*btf_bpf_trace_printk)(char *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_trace_vprintk)(char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_seq_printf)(struct seq_file *, char *, u32, const void *, u32); + +typedef u64 (*btf_bpf_seq_write)(struct seq_file *, const void *, u32); + +typedef u64 (*btf_bpf_seq_printf_btf)(struct seq_file *, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_perf_event_read)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_perf_event_read_value)(struct bpf_map *, u64, struct bpf_perf_event_value *, u32); + +struct bpf_trace_sample_data { + struct perf_sample_data sds[3]; +}; + +typedef u64 (*btf_bpf_perf_event_output)(struct pt_regs *, struct bpf_map *, u64, void *, u64); + +struct bpf_nested_pt_regs { + struct pt_regs regs[3]; +}; + +typedef u64 (*btf_bpf_get_current_task)(); + +typedef u64 (*btf_bpf_get_current_task_btf)(); + +typedef u64 (*btf_bpf_task_pt_regs)(struct task_struct *); + +typedef u64 (*btf_bpf_current_task_under_cgroup)(struct bpf_map *, u32); + +struct send_signal_irq_work { + struct irq_work irq_work; + struct task_struct *task; + u32 sig; + enum pid_type type; +}; + +typedef u64 (*btf_bpf_send_signal)(u32); + +typedef u64 (*btf_bpf_send_signal_thread)(u32); + +typedef u64 (*btf_bpf_d_path)(struct path *, char *, u32); + +typedef u64 (*btf_bpf_snprintf_btf)(char *, u32, struct btf_ptr *, u32, u64); + +typedef u64 (*btf_bpf_get_func_ip_tracing)(void *); + +typedef u64 (*btf_bpf_get_func_ip_kprobe)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_func_ip_kprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_attach_cookie_kprobe_multi)(struct pt_regs *); + +typedef u64 (*btf_bpf_get_attach_cookie_trace)(void *); + +typedef u64 (*btf_bpf_get_attach_cookie_pe)(struct bpf_perf_event_data_kern *); + +typedef u64 (*btf_bpf_get_attach_cookie_tracing)(void *); + +typedef u64 (*btf_bpf_get_branch_snapshot)(void *, u32, u64); + +typedef u64 (*btf_get_func_arg)(void *, u32, u64 *); + +typedef u64 (*btf_get_func_ret)(void *, u64 *); + +typedef u64 (*btf_get_func_arg_cnt)(void *); + +typedef u64 (*btf_bpf_perf_event_output_tp)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_stackid_tp)(void *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack_tp)(void *, void *, u32, u64); + +typedef u64 (*btf_bpf_perf_prog_read_value)(struct bpf_perf_event_data_kern *, struct bpf_perf_event_value *, u32); + +typedef u64 (*btf_bpf_read_branch_records)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +struct bpf_raw_tp_regs { + struct pt_regs regs[3]; +}; + +typedef u64 (*btf_bpf_perf_event_output_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_stackid_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack_raw_tp)(struct bpf_raw_tracepoint_args *, void *, u32, u64); + +enum { + POWER_SUPPLY_CHARGE_TYPE_UNKNOWN = 0, + POWER_SUPPLY_CHARGE_TYPE_NONE = 1, + POWER_SUPPLY_CHARGE_TYPE_TRICKLE = 2, + POWER_SUPPLY_CHARGE_TYPE_FAST = 3, + POWER_SUPPLY_CHARGE_TYPE_STANDARD = 4, + POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE = 5, + POWER_SUPPLY_CHARGE_TYPE_CUSTOM = 6, + POWER_SUPPLY_CHARGE_TYPE_LONGLIFE = 7, + POWER_SUPPLY_CHARGE_TYPE_BYPASS = 8, +}; + +enum { + POWER_SUPPLY_HEALTH_UNKNOWN = 0, + POWER_SUPPLY_HEALTH_GOOD = 1, + POWER_SUPPLY_HEALTH_OVERHEAT = 2, + POWER_SUPPLY_HEALTH_DEAD = 3, + POWER_SUPPLY_HEALTH_OVERVOLTAGE = 4, + POWER_SUPPLY_HEALTH_UNSPEC_FAILURE = 5, + POWER_SUPPLY_HEALTH_COLD = 6, + POWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE = 7, + POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE = 8, + POWER_SUPPLY_HEALTH_OVERCURRENT = 9, + POWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED = 10, + POWER_SUPPLY_HEALTH_WARM = 11, + POWER_SUPPLY_HEALTH_COOL = 12, + POWER_SUPPLY_HEALTH_HOT = 13, + POWER_SUPPLY_HEALTH_NO_BATTERY = 14, +}; + +enum { + POWER_SUPPLY_SCOPE_UNKNOWN = 0, + POWER_SUPPLY_SCOPE_SYSTEM = 1, + POWER_SUPPLY_SCOPE_DEVICE = 2, +}; + +enum power_supply_charge_behaviour { + POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO = 0, + POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE = 1, + POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE = 2, +}; + +struct power_supply_attr { + const char *prop_name; + char attr_name[31]; + struct device_attribute dev_attr; + const char * const *text_values; + int text_values_len; +}; + +enum { + TCA_CGROUP_UNSPEC = 0, + TCA_CGROUP_ACT = 1, + TCA_CGROUP_POLICE = 2, + TCA_CGROUP_EMATCHES = 3, + __TCA_CGROUP_MAX = 4, +}; + +struct tcf_exts { + __u32 type; + int nr_actions; + struct tc_action **actions; + struct net *net; + netns_tracker ns_tracker; + int action; + int police; +}; + +struct cls_cgroup_head { + u32 handle; + struct tcf_exts exts; + struct tcf_ematch_tree ematches; + struct tcf_proto *tp; + struct rcu_work rwork; +}; + +struct xt_bpf_info { + __u16 bpf_program_num_elem; + struct sock_filter bpf_program[64]; + struct bpf_prog *filter; +}; + +enum xt_bpf_modes { + XT_BPF_MODE_BYTECODE = 0, + XT_BPF_MODE_FD_PINNED = 1, + XT_BPF_MODE_FD_ELF = 2, +}; + +struct xt_bpf_info_v1 { + __u16 mode; + __u16 bpf_program_num_elem; + __s32 fd; + union { + struct sock_filter bpf_program[64]; + char path[512]; + }; + struct bpf_prog *filter; +}; + +struct arm_cpuidle_irq_context {}; + +struct cpu_suspend_ctx { + u64 ctx_regs[13]; + u64 sp; +}; + +struct sleep_stack_data { + struct cpu_suspend_ctx system_regs; + long unsigned int callee_saved_regs[12]; +}; + +struct trace_event_raw_timer_class { + struct trace_entry ent; + void *timer; + char __data[0]; +}; + +struct trace_event_raw_timer_start { + struct trace_entry ent; + void *timer; + void *function; + long unsigned int expires; + long unsigned int now; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_timer_expire_entry { + struct trace_entry ent; + void *timer; + long unsigned int now; + void *function; + long unsigned int baseclk; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_init { + struct trace_entry ent; + void *hrtimer; + clockid_t clockid; + enum hrtimer_mode mode; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_start { + struct trace_entry ent; + void *hrtimer; + void *function; + s64 expires; + s64 softexpires; + enum hrtimer_mode mode; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_expire_entry { + struct trace_entry ent; + void *hrtimer; + s64 now; + void *function; + char __data[0]; +}; + +struct trace_event_raw_hrtimer_class { + struct trace_entry ent; + void *hrtimer; + char __data[0]; +}; + +struct trace_event_raw_itimer_state { + struct trace_entry ent; + int which; + long long unsigned int expires; + long int value_sec; + long int value_nsec; + long int interval_sec; + long int interval_nsec; + char __data[0]; +}; + +struct trace_event_raw_itimer_expire { + struct trace_entry ent; + int which; + pid_t pid; + long long unsigned int now; + char __data[0]; +}; + +struct trace_event_raw_tick_stop { + struct trace_entry ent; + int success; + int dependency; + char __data[0]; +}; + +struct trace_event_data_offsets_timer_class {}; + +struct trace_event_data_offsets_timer_start {}; + +struct trace_event_data_offsets_timer_expire_entry {}; + +struct trace_event_data_offsets_hrtimer_init {}; + +struct trace_event_data_offsets_hrtimer_start {}; + +struct trace_event_data_offsets_hrtimer_expire_entry {}; + +struct trace_event_data_offsets_hrtimer_class {}; + +struct trace_event_data_offsets_itimer_state {}; + +struct trace_event_data_offsets_itimer_expire {}; + +struct trace_event_data_offsets_tick_stop {}; + +typedef void (*btf_trace_timer_init)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_start)(void *, struct timer_list *, long unsigned int, unsigned int); + +typedef void (*btf_trace_timer_expire_entry)(void *, struct timer_list *, long unsigned int); + +typedef void (*btf_trace_timer_expire_exit)(void *, struct timer_list *); + +typedef void (*btf_trace_timer_cancel)(void *, struct timer_list *); + +typedef void (*btf_trace_hrtimer_init)(void *, struct hrtimer *, clockid_t, enum hrtimer_mode); + +typedef void (*btf_trace_hrtimer_start)(void *, struct hrtimer *, enum hrtimer_mode); + +typedef void (*btf_trace_hrtimer_expire_entry)(void *, struct hrtimer *, ktime_t *); + +typedef void (*btf_trace_hrtimer_expire_exit)(void *, struct hrtimer *); + +typedef void (*btf_trace_hrtimer_cancel)(void *, struct hrtimer *); + +typedef void (*btf_trace_itimer_state)(void *, int, const struct itimerspec64 * const, long long unsigned int); + +typedef void (*btf_trace_itimer_expire)(void *, int, struct pid *, long long unsigned int); + +typedef void (*btf_trace_tick_stop)(void *, int, int); + +struct timer_base { + raw_spinlock_t lock; + struct timer_list *running_timer; + long unsigned int clk; + long unsigned int next_expiry; + unsigned int cpu; + bool next_expiry_recalc; + bool is_idle; + bool timers_pending; + long unsigned int pending_map[9]; + struct hlist_head vectors[576]; + long: 64; + long: 64; + long: 64; +}; + +struct process_timer { + struct timer_list timer; + struct task_struct *task; +}; + +struct kioctx; + +struct kioctx_table { + struct callback_head rcu; + unsigned int nr; + struct kioctx *table[0]; +}; + +typedef __kernel_rwf_t rwf_t; + +typedef __kernel_ulong_t aio_context_t; + +enum { + IOCB_CMD_PREAD = 0, + IOCB_CMD_PWRITE = 1, + IOCB_CMD_FSYNC = 2, + IOCB_CMD_FDSYNC = 3, + IOCB_CMD_POLL = 5, + IOCB_CMD_NOOP = 6, + IOCB_CMD_PREADV = 7, + IOCB_CMD_PWRITEV = 8, +}; + +struct io_event { + __u64 data; + __u64 obj; + __s64 res; + __s64 res2; +}; + +struct iocb { + __u64 aio_data; + __u32 aio_key; + __kernel_rwf_t aio_rw_flags; + __u16 aio_lio_opcode; + __s16 aio_reqprio; + __u32 aio_fildes; + __u64 aio_buf; + __u64 aio_nbytes; + __s64 aio_offset; + __u64 aio_reserved2; + __u32 aio_flags; + __u32 aio_resfd; +}; + +typedef int kiocb_cancel_fn(struct kiocb *); + +struct aio_ring { + unsigned int id; + unsigned int nr; + unsigned int head; + unsigned int tail; + unsigned int magic; + unsigned int compat_features; + unsigned int incompat_features; + unsigned int header_length; + struct io_event io_events[0]; +}; + +struct kioctx_cpu; + +struct ctx_rq_wait; + +struct kioctx { + struct percpu_ref users; + atomic_t dead; + struct percpu_ref reqs; + long unsigned int user_id; + struct kioctx_cpu *cpu; + unsigned int req_batch; + unsigned int max_reqs; + unsigned int nr_events; + long unsigned int mmap_base; + long unsigned int mmap_size; + struct page **ring_pages; + long int nr_pages; + struct rcu_work free_rwork; + struct ctx_rq_wait *rq_wait; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct { + atomic_t reqs_available; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + spinlock_t ctx_lock; + struct list_head active_reqs; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + struct mutex ring_lock; + wait_queue_head_t wait; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct { + unsigned int tail; + unsigned int completed_events; + spinlock_t completion_lock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + }; + struct page *internal_pages[8]; + struct file *aio_ring_file; + unsigned int id; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct kioctx_cpu { + unsigned int reqs_available; +}; + +struct ctx_rq_wait { + struct completion comp; + atomic_t count; +}; + +struct fsync_iocb { + struct file *file; + struct work_struct work; + bool datasync; + struct cred *creds; +}; + +struct poll_iocb { + struct file *file; + struct wait_queue_head *head; + __poll_t events; + bool cancelled; + bool work_scheduled; + bool work_need_resched; + struct wait_queue_entry wait; + struct work_struct work; +}; + +struct aio_kiocb { + union { + struct file *ki_filp; + struct kiocb rw; + struct fsync_iocb fsync; + struct poll_iocb poll; + }; + struct kioctx *ki_ctx; + kiocb_cancel_fn *ki_cancel; + struct io_event ki_res; + struct list_head ki_list; + refcount_t ki_refcnt; + struct eventfd_ctx *ki_eventfd; +}; + +struct aio_poll_table { + struct poll_table_struct pt; + struct aio_kiocb *iocb; + bool queued; + int error; +}; + +struct __aio_sigset { + const sigset_t *sigmask; + size_t sigsetsize; +}; + +struct crypto_report_comp { + char type[64]; +}; + +struct crypto_scomp { + struct crypto_tfm base; +}; + +struct scomp_alg { + void * (*alloc_ctx)(struct crypto_scomp *); + void (*free_ctx)(struct crypto_scomp *, void *); + int (*compress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + int (*decompress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct crypto_alg base; +}; + +struct scomp_scratch { + spinlock_t lock; + void *src; + void *dst; +}; + +struct touchscreen_properties { + unsigned int max_x; + unsigned int max_y; + bool invert_x; + bool invert_y; + bool swap_x_y; +}; + +struct inet_diag_sockid { + __be16 idiag_sport; + __be16 idiag_dport; + __be32 idiag_src[4]; + __be32 idiag_dst[4]; + __u32 idiag_if; + __u32 idiag_cookie[2]; +}; + +struct inet_diag_req { + __u8 idiag_family; + __u8 idiag_src_len; + __u8 idiag_dst_len; + __u8 idiag_ext; + struct inet_diag_sockid id; + __u32 idiag_states; + __u32 idiag_dbs; +}; + +struct inet_diag_req_v2 { + __u8 sdiag_family; + __u8 sdiag_protocol; + __u8 idiag_ext; + __u8 pad; + __u32 idiag_states; + struct inet_diag_sockid id; +}; + +struct inet_diag_bc_op { + unsigned char code; + unsigned char yes; + short unsigned int no; +}; + +enum { + INET_DIAG_BC_NOP = 0, + INET_DIAG_BC_JMP = 1, + INET_DIAG_BC_S_GE = 2, + INET_DIAG_BC_S_LE = 3, + INET_DIAG_BC_D_GE = 4, + INET_DIAG_BC_D_LE = 5, + INET_DIAG_BC_AUTO = 6, + INET_DIAG_BC_S_COND = 7, + INET_DIAG_BC_D_COND = 8, + INET_DIAG_BC_DEV_COND = 9, + INET_DIAG_BC_MARK_COND = 10, + INET_DIAG_BC_S_EQ = 11, + INET_DIAG_BC_D_EQ = 12, + INET_DIAG_BC_CGROUP_COND = 13, +}; + +struct inet_diag_hostcond { + __u8 family; + __u8 prefix_len; + int port; + __be32 addr[0]; +}; + +struct inet_diag_markcond { + __u32 mark; + __u32 mask; +}; + +struct inet_diag_msg { + __u8 idiag_family; + __u8 idiag_state; + __u8 idiag_timer; + __u8 idiag_retrans; + struct inet_diag_sockid id; + __u32 idiag_expires; + __u32 idiag_rqueue; + __u32 idiag_wqueue; + __u32 idiag_uid; + __u32 idiag_inode; +}; + +enum { + INET_DIAG_NONE = 0, + INET_DIAG_MEMINFO = 1, + INET_DIAG_INFO = 2, + INET_DIAG_VEGASINFO = 3, + INET_DIAG_CONG = 4, + INET_DIAG_TOS = 5, + INET_DIAG_TCLASS = 6, + INET_DIAG_SKMEMINFO = 7, + INET_DIAG_SHUTDOWN = 8, + INET_DIAG_DCTCPINFO = 9, + INET_DIAG_PROTOCOL = 10, + INET_DIAG_SKV6ONLY = 11, + INET_DIAG_LOCALS = 12, + INET_DIAG_PEERS = 13, + INET_DIAG_PAD = 14, + INET_DIAG_MARK = 15, + INET_DIAG_BBRINFO = 16, + INET_DIAG_CLASS_ID = 17, + INET_DIAG_MD5SIG = 18, + INET_DIAG_ULP_INFO = 19, + INET_DIAG_SK_BPF_STORAGES = 20, + INET_DIAG_CGROUP_ID = 21, + INET_DIAG_SOCKOPT = 22, + __INET_DIAG_MAX = 23, +}; + +struct inet_diag_meminfo { + __u32 idiag_rmem; + __u32 idiag_wmem; + __u32 idiag_fmem; + __u32 idiag_tmem; +}; + +struct inet_diag_sockopt { + __u8 recverr: 1; + __u8 is_icsk: 1; + __u8 freebind: 1; + __u8 hdrincl: 1; + __u8 mc_loop: 1; + __u8 transparent: 1; + __u8 mc_all: 1; + __u8 nodefrag: 1; + __u8 bind_address_no_port: 1; + __u8 recverr_rfc4884: 1; + __u8 defer_connect: 1; + __u8 unused: 5; +}; + +struct inet_diag_handler { + void (*dump)(struct sk_buff *, struct netlink_callback *, const struct inet_diag_req_v2 *); + int (*dump_one)(struct netlink_callback *, const struct inet_diag_req_v2 *); + void (*idiag_get_info)(struct sock *, struct inet_diag_msg *, void *); + int (*idiag_get_aux)(struct sock *, bool, struct sk_buff *); + size_t (*idiag_get_aux_size)(struct sock *, bool); + int (*destroy)(struct sk_buff *, const struct inet_diag_req_v2 *); + __u16 idiag_type; + __u16 idiag_info_size; +}; + +struct bpf_sk_storage_diag; + +struct inet_diag_dump_data { + struct nlattr *req_nlas[4]; + struct bpf_sk_storage_diag *bpf_stg_diag; +}; + +struct inet_diag_entry { + const __be32 *saddr; + const __be32 *daddr; + u16 sport; + u16 dport; + u16 family; + u16 userlocks; + u32 ifindex; + u32 mark; + u64 cgroup_id; +}; + +enum ip6_defrag_users { + IP6_DEFRAG_LOCAL_DELIVER = 0, + IP6_DEFRAG_CONNTRACK_IN = 1, + __IP6_DEFRAG_CONNTRACK_IN = 65536, + IP6_DEFRAG_CONNTRACK_OUT = 65537, + __IP6_DEFRAG_CONNTRACK_OUT = 131072, + IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 131073, + __IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 196608, +}; + +typedef struct { + long unsigned int key[2]; +} hsiphash_key_t; + +struct futex_waitv { + __u64 val; + __u64 uaddr; + __u32 flags; + __u32 __reserved; +}; + +struct futex_vector { + struct futex_waitv w; + struct futex_q q; +}; + +struct follow_page_context { + struct dev_pagemap *pgmap; + unsigned int page_mask; +}; + +struct crypto_attr_alg { + char name[128]; +}; + +struct crypto_attr_type { + u32 type; + u32 mask; +}; + +enum { + CRYPTO_MSG_ALG_REQUEST = 0, + CRYPTO_MSG_ALG_REGISTER = 1, + CRYPTO_MSG_ALG_LOADED = 2, +}; + +struct crypto_larval { + struct crypto_alg alg; + struct crypto_alg *adult; + struct completion completion; + u32 mask; + bool test_started; + long: 24; + long: 64; + long: 64; + long: 64; +}; + +enum { + CRYPTOA_UNSPEC = 0, + CRYPTOA_ALG = 1, + CRYPTOA_TYPE = 2, + __CRYPTOA_MAX = 3, +}; + +struct cryptomgr_param { + struct rtattr *tb[34]; + struct { + struct rtattr attr; + struct crypto_attr_type data; + } type; + struct { + struct rtattr attr; + struct crypto_attr_alg data; + } attrs[32]; + char template[128]; + struct crypto_larval *larval; + u32 otype; + u32 omask; +}; + +struct crypto_test_param { + char driver[128]; + char alg[128]; + u32 type; +}; + +typedef enum { + CODES = 0, + LENS = 1, + DISTS = 2, +} codetype; + +struct gic_quirk { + const char *desc; + const char *compatible; + bool (*init)(void *); + u32 iidr; + u32 mask; +}; + +struct acpi_data_node_attr { + struct attribute attr; + ssize_t (*show)(struct acpi_data_node *, char *); + ssize_t (*store)(struct acpi_data_node *, const char *, size_t); +}; + +struct probe { + struct probe *next; + dev_t dev; + long unsigned int range; + struct module *owner; + kobj_probe_t *get; + int (*lock)(dev_t, void *); + void *data; +}; + +struct kobj_map { + struct probe *probes[255]; + struct mutex *lock; +}; + +struct net_device_devres { + struct net_device *ndev; +}; + +enum ethtool_stringset { + ETH_SS_TEST = 0, + ETH_SS_STATS = 1, + ETH_SS_PRIV_FLAGS = 2, + ETH_SS_NTUPLE_FILTERS = 3, + ETH_SS_FEATURES = 4, + ETH_SS_RSS_HASH_FUNCS = 5, + ETH_SS_TUNABLES = 6, + ETH_SS_PHY_STATS = 7, + ETH_SS_PHY_TUNABLES = 8, + ETH_SS_LINK_MODES = 9, + ETH_SS_MSG_CLASSES = 10, + ETH_SS_WOL_MODES = 11, + ETH_SS_SOF_TIMESTAMPING = 12, + ETH_SS_TS_TX_TYPES = 13, + ETH_SS_TS_RX_FILTERS = 14, + ETH_SS_UDP_TUNNEL_TYPES = 15, + ETH_SS_STATS_STD = 16, + ETH_SS_STATS_ETH_PHY = 17, + ETH_SS_STATS_ETH_MAC = 18, + ETH_SS_STATS_ETH_CTRL = 19, + ETH_SS_STATS_RMON = 20, + ETH_SS_COUNT = 21, +}; + +enum { + ETHTOOL_A_STATS_GRP_UNSPEC = 0, + ETHTOOL_A_STATS_GRP_PAD = 1, + ETHTOOL_A_STATS_GRP_ID = 2, + ETHTOOL_A_STATS_GRP_SS_ID = 3, + ETHTOOL_A_STATS_GRP_STAT = 4, + ETHTOOL_A_STATS_GRP_HIST_RX = 5, + ETHTOOL_A_STATS_GRP_HIST_TX = 6, + ETHTOOL_A_STATS_GRP_HIST_BKT_LOW = 7, + ETHTOOL_A_STATS_GRP_HIST_BKT_HI = 8, + ETHTOOL_A_STATS_GRP_HIST_VAL = 9, + __ETHTOOL_A_STATS_GRP_CNT = 10, + ETHTOOL_A_STATS_GRP_MAX = 4, +}; + +struct stats_req_info { + struct ethnl_req_info base; + long unsigned int stat_mask[1]; +}; + +struct stats_reply_data { + struct ethnl_reply_data base; + union { + struct { + struct ethtool_eth_phy_stats phy_stats; + struct ethtool_eth_mac_stats mac_stats; + struct ethtool_eth_ctrl_stats ctrl_stats; + struct ethtool_rmon_stats rmon_stats; + }; + struct { + struct ethtool_eth_phy_stats phy_stats; + struct ethtool_eth_mac_stats mac_stats; + struct ethtool_eth_ctrl_stats ctrl_stats; + struct ethtool_rmon_stats rmon_stats; + } stats; + }; + const struct ethtool_rmon_hist_range *rmon_ranges; +}; + +enum jump_label_type { + JUMP_LABEL_NOP = 0, + JUMP_LABEL_JMP = 1, +}; + +typedef __kernel_timer_t timer_t; + +typedef struct sigevent sigevent_t; + +struct sigqueue { + struct list_head list; + int flags; + kernel_siginfo_t info; + struct ucounts *ucounts; +}; + +struct cpu_timer { + struct timerqueue_node node; + struct timerqueue_head *head; + struct pid *pid; + struct list_head elist; + int firing; +}; + +struct k_clock; + +struct k_itimer { + struct list_head list; + struct hlist_node t_hash; + spinlock_t it_lock; + const struct k_clock *kclock; + clockid_t it_clock; + timer_t it_id; + int it_active; + s64 it_overrun; + s64 it_overrun_last; + int it_requeue_pending; + int it_sigev_notify; + ktime_t it_interval; + struct signal_struct *it_signal; + union { + struct pid *it_pid; + struct task_struct *it_process; + }; + struct sigqueue *sigq; + union { + struct { + struct hrtimer timer; + } real; + struct cpu_timer cpu; + struct { + struct alarm alarmtimer; + } alarm; + } it; + struct callback_head rcu; +}; + +struct k_clock { + int (*clock_getres)(const clockid_t, struct timespec64 *); + int (*clock_set)(const clockid_t, const struct timespec64 *); + int (*clock_get_timespec)(const clockid_t, struct timespec64 *); + ktime_t (*clock_get_ktime)(const clockid_t); + int (*clock_adj)(const clockid_t, struct __kernel_timex *); + int (*timer_create)(struct k_itimer *); + int (*nsleep)(const clockid_t, int, const struct timespec64 *); + int (*timer_set)(struct k_itimer *, int, struct itimerspec64 *, struct itimerspec64 *); + int (*timer_del)(struct k_itimer *); + void (*timer_get)(struct k_itimer *, struct itimerspec64 *); + void (*timer_rearm)(struct k_itimer *); + s64 (*timer_forward)(struct k_itimer *, ktime_t); + ktime_t (*timer_remaining)(struct k_itimer *, ktime_t); + int (*timer_try_to_cancel)(struct k_itimer *); + void (*timer_arm)(struct k_itimer *, ktime_t, bool, bool); + void (*timer_wait_running)(struct k_itimer *); +}; + +struct epoll_filefd { + struct file *file; + int fd; +} __attribute__((packed)); + +struct epitem; + +struct eppoll_entry { + struct eppoll_entry *next; + struct epitem *base; + wait_queue_entry_t wait; + wait_queue_head_t *whead; +}; + +struct eventpoll; + +struct epitem { + union { + struct rb_node rbn; + struct callback_head rcu; + }; + struct list_head rdllink; + struct epitem *next; + struct epoll_filefd ffd; + struct eppoll_entry *pwqlist; + struct eventpoll *ep; + struct hlist_node fllink; + struct wakeup_source *ws; + struct epoll_event event; +}; + +struct eventpoll { + struct mutex mtx; + wait_queue_head_t wq; + wait_queue_head_t poll_wait; + struct list_head rdllist; + rwlock_t lock; + struct rb_root_cached rbr; + struct epitem *ovflist; + struct wakeup_source *ws; + struct user_struct *user; + struct file *file; + u64 gen; + struct hlist_head refs; + unsigned int napi_id; + u8 nests; +}; + +struct ep_pqueue { + poll_table pt; + struct epitem *epi; +}; + +struct epitems_head { + struct hlist_head epitems; + struct epitems_head *next; +}; + +struct acpi_predefined_names { + const char *name; + u8 type; + char *val; +}; + +struct kbentry { + unsigned char kb_table; + unsigned char kb_index; + short unsigned int kb_value; +}; + +struct kbsentry { + unsigned char kb_func; + unsigned char kb_string[512]; +}; + +struct kbdiacr { + unsigned char diacr; + unsigned char base; + unsigned char result; +}; + +struct kbdiacrs { + unsigned int kb_cnt; + struct kbdiacr kbdiacr[256]; +}; + +struct kbdiacrsuc { + unsigned int kb_cnt; + struct kbdiacruc kbdiacruc[256]; +}; + +struct kbkeycode { + unsigned int scancode; + unsigned int keycode; +}; + +struct kbd_repeat { + int delay; + int period; +}; + +struct tasklet_struct { + struct tasklet_struct *next; + long unsigned int state; + atomic_t count; + bool use_callback; + union { + void (*func)(long unsigned int); + void (*callback)(struct tasklet_struct *); + }; + long unsigned int data; +}; + +enum { + TASKLET_STATE_SCHED = 0, + TASKLET_STATE_RUN = 1, +}; + +struct keyboard_notifier_param { + struct vc_data *vc; + int down; + int shift; + int ledstate; + unsigned int value; +}; + +struct kbd_struct { + unsigned char lockstate; + unsigned char slockstate; + unsigned char ledmode: 1; + unsigned char ledflagstate: 4; + char: 3; + unsigned char default_ledflagstate: 4; + unsigned char kbdmode: 3; + char: 1; + unsigned char modeflags: 5; +}; + +struct vt_spawn_console { + spinlock_t lock; + struct pid *pid; + int sig; +}; + +typedef void k_handler_fn(struct vc_data *, unsigned char, char); + +typedef void fn_handler_fn(struct vc_data *); + +struct getset_keycode_data { + struct input_keymap_entry ke; + int error; +}; + +enum { + IFLA_VRF_UNSPEC = 0, + IFLA_VRF_TABLE = 1, + __IFLA_VRF_MAX = 2, +}; + +enum { + IFLA_VRF_PORT_UNSPEC = 0, + IFLA_VRF_PORT_TABLE = 1, + __IFLA_VRF_PORT_MAX = 2, +}; + +struct pcpu_dstats { + u64 tx_pkts; + u64 tx_bytes; + u64 tx_drps; + u64 rx_pkts; + u64 rx_bytes; + u64 rx_drps; + struct u64_stats_sync syncp; +}; + +enum l3mdev_type { + L3MDEV_TYPE_UNSPEC = 0, + L3MDEV_TYPE_VRF = 1, + __L3MDEV_TYPE_MAX = 2, +}; + +typedef int (*lookup_by_table_id_t)(struct net *, u32); + +struct vrf_map { + struct hlist_head ht[16]; + spinlock_t vmap_lock; + u32 shared_tables; + bool strict_mode; +}; + +struct vrf_map_elem { + struct hlist_node hnode; + struct list_head vrf_list; + u32 table_id; + int users; + int ifindex; +}; + +struct netns_vrf { + bool add_fib_rules; + struct vrf_map vmap; + struct ctl_table_header *ctl_hdr; +}; + +struct net_vrf { + struct rtable *rth; + struct rt6_info *rt6; + struct fib6_table *fib6_table; + u32 tb_id; + struct list_head me_list; + int ifindex; +}; + +struct umd_info { + const char *driver_name; + struct file *pipe_to_umh; + struct file *pipe_from_umh; + struct path wd; + struct pid *tgid; +}; + +struct bpfilter_umh_ops { + struct umd_info info; + struct mutex lock; + int (*sockopt)(struct sock *, int, sockptr_t, unsigned int, bool); + int (*start)(); +}; + +enum { + IFLA_GRE_UNSPEC = 0, + IFLA_GRE_LINK = 1, + IFLA_GRE_IFLAGS = 2, + IFLA_GRE_OFLAGS = 3, + IFLA_GRE_IKEY = 4, + IFLA_GRE_OKEY = 5, + IFLA_GRE_LOCAL = 6, + IFLA_GRE_REMOTE = 7, + IFLA_GRE_TTL = 8, + IFLA_GRE_TOS = 9, + IFLA_GRE_PMTUDISC = 10, + IFLA_GRE_ENCAP_LIMIT = 11, + IFLA_GRE_FLOWINFO = 12, + IFLA_GRE_FLAGS = 13, + IFLA_GRE_ENCAP_TYPE = 14, + IFLA_GRE_ENCAP_FLAGS = 15, + IFLA_GRE_ENCAP_SPORT = 16, + IFLA_GRE_ENCAP_DPORT = 17, + IFLA_GRE_COLLECT_METADATA = 18, + IFLA_GRE_IGNORE_DF = 19, + IFLA_GRE_FWMARK = 20, + IFLA_GRE_ERSPAN_INDEX = 21, + IFLA_GRE_ERSPAN_VER = 22, + IFLA_GRE_ERSPAN_DIR = 23, + IFLA_GRE_ERSPAN_HWID = 24, + __IFLA_GRE_MAX = 25, +}; + +struct ip6_tnl_parm2 { + char name[16]; + int link; + __u8 proto; + __u8 encap_limit; + __u8 hop_limit; + __be32 flowinfo; + __u32 flags; + struct in6_addr laddr; + struct in6_addr raddr; + __be16 i_flags; + __be16 o_flags; + __be32 i_key; + __be32 o_key; +}; + +struct erspan_md2 { + __be32 timestamp; + __be16 sgt; + __u8 hwid_upper: 2; + __u8 ft: 5; + __u8 p: 1; + __u8 o: 1; + __u8 gra: 2; + __u8 dir: 1; + __u8 hwid: 4; +}; + +struct erspan_metadata { + int version; + union { + __be32 index; + struct erspan_md2 md2; + } u; +}; + +enum erspan_encap_type { + ERSPAN_ENCAP_NOVLAN = 0, + ERSPAN_ENCAP_ISL = 1, + ERSPAN_ENCAP_8021Q = 2, + ERSPAN_ENCAP_INFRAME = 3, +}; + +struct erspan_base_hdr { + __u8 vlan_upper: 4; + __u8 ver: 4; + __u8 vlan: 8; + __u8 session_id_upper: 2; + __u8 t: 1; + __u8 en: 2; + __u8 cos: 3; + __u8 session_id: 8; +}; + +enum erspan_bso { + BSO_NOERROR = 0, + BSO_SHORT = 1, + BSO_OVERSIZED = 2, + BSO_BAD = 3, +}; + +struct ip6gre_net { + struct ip6_tnl *tunnels[128]; + struct ip6_tnl *collect_md_tun; + struct ip6_tnl *collect_md_tun_erspan; + struct net_device *fb_tunnel_dev; +}; + +struct qtag_prefix { + __be16 eth_type; + __be16 tci; +}; + +struct posix_clock_desc { + struct file *fp; + struct posix_clock *clk; +}; + +struct dnotify_struct { + struct dnotify_struct *dn_next; + __u32 dn_mask; + int dn_fd; + struct file *dn_filp; + fl_owner_t dn_owner; +}; + +struct dnotify_mark { + struct fsnotify_mark fsn_mark; + struct dnotify_struct *dn; +}; + +struct trace_event_raw_iomap_readpage_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + int nr_pages; + char __data[0]; +}; + +struct trace_event_raw_iomap_range_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + loff_t size; + loff_t offset; + u64 length; + char __data[0]; +}; + +struct trace_event_raw_iomap_class { + struct trace_entry ent; + dev_t dev; + u64 ino; + u64 addr; + loff_t offset; + u64 length; + u16 type; + u16 flags; + dev_t bdev; + char __data[0]; +}; + +struct trace_event_raw_iomap_iter { + struct trace_entry ent; + dev_t dev; + u64 ino; + loff_t pos; + u64 length; + unsigned int flags; + const void *ops; + long unsigned int caller; + char __data[0]; +}; + +struct trace_event_data_offsets_iomap_readpage_class {}; + +struct trace_event_data_offsets_iomap_range_class {}; + +struct trace_event_data_offsets_iomap_class {}; + +struct trace_event_data_offsets_iomap_iter {}; + +typedef void (*btf_trace_iomap_readpage)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_readahead)(void *, struct inode *, int); + +typedef void (*btf_trace_iomap_writepage)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_release_folio)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_invalidate_folio)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_dio_invalidate_fail)(void *, struct inode *, loff_t, u64); + +typedef void (*btf_trace_iomap_iter_dstmap)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_iter_srcmap)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_writepage_map)(void *, struct inode *, struct iomap *); + +typedef void (*btf_trace_iomap_iter)(void *, struct iomap_iter *, const void *, long unsigned int); + +typedef struct { + __be64 a; + __be64 b; +} be128; + +struct gf128mul_4k { + be128 t[256]; +}; + +struct ghash_ctx { + struct gf128mul_4k *gf128; +}; + +struct ghash_desc_ctx { + u8 buffer[16]; + u32 bytes; +}; + +typedef long int mpi_limb_signed_t; + +struct karatsuba_ctx { + struct karatsuba_ctx *next; + mpi_ptr_t tspace; + mpi_size_t tspace_size; + mpi_ptr_t tp; + mpi_size_t tp_size; +}; + +struct acpi_pci_link_irq { + u32 active; + u8 triggering; + u8 polarity; + u8 resource_type; + u8 possible_count; + u32 possible[16]; + u8 initialized: 1; + u8 reserved: 7; +}; + +struct acpi_pci_link { + struct list_head list; + struct acpi_device *device; + struct acpi_pci_link_irq irq; + int refcnt; +}; + +typedef acpi_status (*acpi_repair_function)(struct acpi_evaluate_info *, union acpi_operand_object **); + +struct acpi_repair_info { + char name[4]; + acpi_repair_function repair_function; +}; + +struct acpi_thermal_state { + u8 critical: 1; + u8 hot: 1; + u8 passive: 1; + u8 active: 1; + u8 reserved: 4; + int active_index; +}; + +struct acpi_thermal_state_flags { + u8 valid: 1; + u8 enabled: 1; + u8 reserved: 6; +}; + +struct acpi_thermal_critical { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; +}; + +struct acpi_thermal_hot { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; +}; + +struct acpi_thermal_passive { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; + long unsigned int tc1; + long unsigned int tc2; + long unsigned int tsp; + struct acpi_handle_list devices; +}; + +struct acpi_thermal_active { + struct acpi_thermal_state_flags flags; + long unsigned int temperature; + struct acpi_handle_list devices; +}; + +struct acpi_thermal_trips { + struct acpi_thermal_critical critical; + struct acpi_thermal_hot hot; + struct acpi_thermal_passive passive; + struct acpi_thermal_active active[10]; +}; + +struct acpi_thermal_flags { + u8 cooling_mode: 1; + u8 devices: 1; + u8 reserved: 6; +}; + +struct acpi_thermal { + struct acpi_device *device; + acpi_bus_id name; + long unsigned int temperature; + long unsigned int last_temperature; + long unsigned int polling_frequency; + volatile u8 zombie; + struct acpi_thermal_flags flags; + struct acpi_thermal_state state; + struct acpi_thermal_trips trips; + struct acpi_handle_list devices; + struct thermal_zone_device *thermal_zone; + int kelvin_offset; + struct work_struct thermal_check_work; + struct mutex thermal_check_lock; + refcount_t thermal_check_count; +}; + +struct pm_clk_notifier_block { + struct notifier_block nb; + struct dev_pm_domain *pm_domain; + char *con_ids[0]; +}; + +enum pce_status { + PCE_STATUS_NONE = 0, + PCE_STATUS_ACQUIRED = 1, + PCE_STATUS_PREPARED = 2, + PCE_STATUS_ENABLED = 3, + PCE_STATUS_ERROR = 4, +}; + +struct pm_clock_entry { + struct list_head node; + char *con_id; + struct clk *clk; + enum pce_status status; + bool enabled_when_prepared; +}; + +struct of_phandle_iterator { + const char *cells_name; + int cell_count; + const struct device_node *parent; + const __be32 *list_end; + const __be32 *phandle_end; + const __be32 *cur; + uint32_t cur_count; + phandle phandle; + struct device_node *node; +}; + +struct privflags_reply_data { + struct ethnl_reply_data base; + const char (*priv_flag_names)[32]; + unsigned int n_priv_flags; + u32 priv_flags; +}; + +enum efi_rts_ids { + EFI_NONE = 0, + EFI_GET_TIME = 1, + EFI_SET_TIME = 2, + EFI_GET_WAKEUP_TIME = 3, + EFI_SET_WAKEUP_TIME = 4, + EFI_GET_VARIABLE = 5, + EFI_GET_NEXT_VARIABLE = 6, + EFI_SET_VARIABLE = 7, + EFI_QUERY_VARIABLE_INFO = 8, + EFI_GET_NEXT_HIGH_MONO_COUNT = 9, + EFI_RESET_SYSTEM = 10, + EFI_UPDATE_CAPSULE = 11, + EFI_QUERY_CAPSULE_CAPS = 12, +}; + +struct efi_runtime_work { + void *arg1; + void *arg2; + void *arg3; + void *arg4; + void *arg5; + efi_status_t status; + struct work_struct work; + enum efi_rts_ids efi_rts_id; + struct completion efi_rts_comp; +}; + +struct dma_sgt_handle { + struct sg_table sgt; + struct page **pages; +}; + +struct dma_devres { + size_t size; + void *vaddr; + dma_addr_t dma_handle; + long unsigned int attrs; +}; + +struct bpf_iter_seq_link_info { + u32 link_id; +}; + +struct bpf_iter__bpf_link { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_link *link; + }; +}; + +struct asymmetric_key_ids { + void *id[3]; +}; + +struct gen_pool_chunk { + struct list_head next_chunk; + atomic_long_t avail; + phys_addr_t phys_addr; + void *owner; + long unsigned int start_addr; + long unsigned int end_addr; + long unsigned int bits[0]; +}; + +struct genpool_data_align { + int align; +}; + +struct genpool_data_fixed { + long unsigned int offset; +}; + +enum { + PCI_REASSIGN_ALL_RSRC = 1, + PCI_REASSIGN_ALL_BUS = 2, + PCI_PROBE_ONLY = 4, + PCI_CAN_SKIP_ISA_ALIGN = 8, + PCI_ENABLE_PROC_DOMAINS = 16, + PCI_COMPAT_DOMAIN_0 = 32, + PCI_SCAN_ALL_PCIE_DEVS = 64, +}; + +struct pericom8250 { + void *virt; + unsigned int nr; + int line[0]; +}; + +enum ethtool_fec_config_bits { + ETHTOOL_FEC_NONE_BIT = 0, + ETHTOOL_FEC_AUTO_BIT = 1, + ETHTOOL_FEC_OFF_BIT = 2, + ETHTOOL_FEC_RS_BIT = 3, + ETHTOOL_FEC_BASER_BIT = 4, + ETHTOOL_FEC_LLRS_BIT = 5, +}; + +enum { + NLBL_UNLABEL_C_UNSPEC = 0, + NLBL_UNLABEL_C_ACCEPT = 1, + NLBL_UNLABEL_C_LIST = 2, + NLBL_UNLABEL_C_STATICADD = 3, + NLBL_UNLABEL_C_STATICREMOVE = 4, + NLBL_UNLABEL_C_STATICLIST = 5, + NLBL_UNLABEL_C_STATICADDDEF = 6, + NLBL_UNLABEL_C_STATICREMOVEDEF = 7, + NLBL_UNLABEL_C_STATICLISTDEF = 8, + __NLBL_UNLABEL_C_MAX = 9, +}; + +enum { + NLBL_UNLABEL_A_UNSPEC = 0, + NLBL_UNLABEL_A_ACPTFLG = 1, + NLBL_UNLABEL_A_IPV6ADDR = 2, + NLBL_UNLABEL_A_IPV6MASK = 3, + NLBL_UNLABEL_A_IPV4ADDR = 4, + NLBL_UNLABEL_A_IPV4MASK = 5, + NLBL_UNLABEL_A_IFACE = 6, + NLBL_UNLABEL_A_SECCTX = 7, + __NLBL_UNLABEL_A_MAX = 8, +}; + +struct netlbl_unlhsh_tbl { + struct list_head *tbl; + u32 size; +}; + +struct netlbl_unlhsh_addr4 { + u32 secid; + struct netlbl_af4list list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_addr6 { + u32 secid; + struct netlbl_af6list list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_iface { + int ifindex; + struct list_head addr4_list; + struct list_head addr6_list; + u32 valid; + struct list_head list; + struct callback_head rcu; +}; + +struct netlbl_unlhsh_walk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct dyn_arch_ftrace {}; + +struct ftrace_func_entry { + struct hlist_node hlist; + long unsigned int ip; + long unsigned int direct; +}; + +enum ftrace_bug_type { + FTRACE_BUG_UNKNOWN = 0, + FTRACE_BUG_INIT = 1, + FTRACE_BUG_NOP = 2, + FTRACE_BUG_CALL = 3, + FTRACE_BUG_UPDATE = 4, +}; + +enum { + FTRACE_FL_ENABLED = 2147483648, + FTRACE_FL_REGS = 1073741824, + FTRACE_FL_REGS_EN = 536870912, + FTRACE_FL_TRAMP = 268435456, + FTRACE_FL_TRAMP_EN = 134217728, + FTRACE_FL_IPMODIFY = 67108864, + FTRACE_FL_DISABLED = 33554432, + FTRACE_FL_DIRECT = 16777216, + FTRACE_FL_DIRECT_EN = 8388608, +}; + +struct dyn_ftrace { + long unsigned int ip; + long unsigned int flags; + struct dyn_arch_ftrace arch; +}; + +enum { + FTRACE_UPDATE_IGNORE = 0, + FTRACE_UPDATE_MAKE_CALL = 1, + FTRACE_UPDATE_MODIFY_CALL = 2, + FTRACE_UPDATE_MAKE_NOP = 3, +}; + +enum { + FTRACE_ITER_FILTER = 1, + FTRACE_ITER_NOTRACE = 2, + FTRACE_ITER_PRINTALL = 4, + FTRACE_ITER_DO_PROBES = 8, + FTRACE_ITER_PROBE = 16, + FTRACE_ITER_MOD = 32, + FTRACE_ITER_ENABLED = 64, +}; + +enum perf_record_ksymbol_type { + PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, + PERF_RECORD_KSYMBOL_TYPE_BPF = 1, + PERF_RECORD_KSYMBOL_TYPE_OOL = 2, + PERF_RECORD_KSYMBOL_TYPE_MAX = 3, +}; + +struct ftrace_mod_load { + struct list_head list; + char *func; + char *module; + int enable; +}; + +enum { + FTRACE_HASH_FL_MOD = 1, +}; + +enum regex_type { + MATCH_FULL = 0, + MATCH_FRONT_ONLY = 1, + MATCH_MIDDLE_ONLY = 2, + MATCH_END_ONLY = 3, + MATCH_GLOB = 4, + MATCH_INDEX = 5, +}; + +enum { + FTRACE_MODIFY_ENABLE_FL = 1, + FTRACE_MODIFY_MAY_SLEEP_FL = 2, +}; + +struct ftrace_func_probe { + struct ftrace_probe_ops *probe_ops; + struct ftrace_ops ops; + struct trace_array *tr; + struct list_head list; + void *data; + int ref; +}; + +struct ftrace_page { + struct ftrace_page *next; + struct dyn_ftrace *records; + int index; + int order; +}; + +struct ftrace_rec_iter { + struct ftrace_page *pg; + int index; +}; + +struct ftrace_iterator { + loff_t pos; + loff_t func_pos; + loff_t mod_pos; + struct ftrace_page *pg; + struct dyn_ftrace *func; + struct ftrace_func_probe *probe; + struct ftrace_func_entry *probe_entry; + struct trace_parser parser; + struct ftrace_hash *hash; + struct ftrace_ops *ops; + struct trace_array *tr; + struct list_head *mod_list; + int pidx; + int idx; + unsigned int flags; +}; + +struct ftrace_glob { + char *search; + unsigned int len; + int type; +}; + +struct ftrace_func_map { + struct ftrace_func_entry entry; + void *data; +}; + +struct ftrace_func_mapper { + struct ftrace_hash hash; +}; + +enum graph_filter_type { + GRAPH_FILTER_NOTRACE = 0, + GRAPH_FILTER_FUNCTION = 1, +}; + +struct ftrace_graph_data { + struct ftrace_hash *hash; + struct ftrace_func_entry *entry; + int idx; + enum graph_filter_type type; + struct ftrace_hash *new_hash; + const struct seq_operations *seq_ops; + struct trace_parser parser; +}; + +struct ftrace_mod_func { + struct list_head list; + char *name; + long unsigned int ip; + unsigned int size; +}; + +struct ftrace_mod_map { + struct callback_head rcu; + struct list_head list; + struct module *mod; + long unsigned int start_addr; + long unsigned int end_addr; + struct list_head funcs; + unsigned int num_funcs; +}; + +struct ftrace_init_func { + struct list_head list; + long unsigned int ip; +}; + +struct kallsyms_data { + long unsigned int *addrs; + const char **syms; + size_t cnt; + size_t found; +}; + +struct commit_header { + __be32 h_magic; + __be32 h_blocktype; + __be32 h_sequence; + unsigned char h_chksum_type; + unsigned char h_chksum_size; + unsigned char h_padding[2]; + __be32 h_chksum[8]; + __be64 h_commit_sec; + __be32 h_commit_nsec; +}; + +struct journal_block_tag3_s { + __be32 t_blocknr; + __be32 t_flags; + __be32 t_blocknr_high; + __be32 t_checksum; +}; + +typedef struct journal_block_tag3_s journal_block_tag3_t; + +struct journal_block_tag_s { + __be32 t_blocknr; + __be16 t_checksum; + __be16 t_flags; + __be32 t_blocknr_high; +}; + +typedef struct journal_block_tag_s journal_block_tag_t; + +struct ima_key_entry { + struct list_head list; + void *payload; + size_t payload_len; + char *keyring_name; +}; + +struct statx_timestamp { + __s64 tv_sec; + __u32 tv_nsec; + __s32 __reserved; +}; + +struct statx { + __u32 stx_mask; + __u32 stx_blksize; + __u64 stx_attributes; + __u32 stx_nlink; + __u32 stx_uid; + __u32 stx_gid; + __u16 stx_mode; + __u16 __spare0[1]; + __u64 stx_ino; + __u64 stx_size; + __u64 stx_blocks; + __u64 stx_attributes_mask; + struct statx_timestamp stx_atime; + struct statx_timestamp stx_btime; + struct statx_timestamp stx_ctime; + struct statx_timestamp stx_mtime; + __u32 stx_rdev_major; + __u32 stx_rdev_minor; + __u32 stx_dev_major; + __u32 stx_dev_minor; + __u64 stx_mnt_id; + __u32 stx_dio_mem_align; + __u32 stx_dio_offset_align; + __u64 __spare3[12]; +}; + +struct io_statx { + struct file *file; + int dfd; + unsigned int mask; + unsigned int flags; + struct filename *filename; + struct statx *buffer; +}; + +struct io_uring_sync_cancel_reg { + __u64 addr; + __s32 fd; + __u32 flags; + struct __kernel_timespec timeout; + __u64 pad[4]; +}; + +struct io_cancel_data { + struct io_ring_ctx *ctx; + union { + u64 data; + struct file *file; + }; + u32 flags; + int seq; +}; + +struct io_cancel { + struct file *file; + u64 addr; + u32 flags; + s32 fd; +}; + +enum { + AML_FIELD_UPDATE_PRESERVE = 0, + AML_FIELD_UPDATE_WRITE_AS_ONES = 32, + AML_FIELD_UPDATE_WRITE_AS_ZEROS = 64, +}; + +struct clk_multiplier { + struct clk_hw hw; + void *reg; + u8 shift; + u8 width; + u8 flags; + spinlock_t *lock; +}; + +struct devres_node { + struct list_head entry; + dr_release_t release; + const char *name; + size_t size; +}; + +struct devres { + struct devres_node node; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u8 data[0]; +}; + +struct devres_group { + struct devres_node node[2]; + void *id; + int color; +}; + +struct action_devres { + void *data; + void (*action)(void *); +}; + +struct pages_devres { + long unsigned int addr; + unsigned int order; +}; + +enum pkt_hash_types { + PKT_HASH_TYPE_NONE = 0, + PKT_HASH_TYPE_L2 = 1, + PKT_HASH_TYPE_L3 = 2, + PKT_HASH_TYPE_L4 = 3, +}; + +struct rx_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_rx_queue *, char *); + ssize_t (*store)(struct netdev_rx_queue *, const char *, size_t); +}; + +struct virtio_driver { + struct device_driver driver; + const struct virtio_device_id *id_table; + const unsigned int *feature_table; + unsigned int feature_table_size; + const unsigned int *feature_table_legacy; + unsigned int feature_table_size_legacy; + int (*validate)(struct virtio_device *); + int (*probe)(struct virtio_device *); + void (*scan)(struct virtio_device *); + void (*remove)(struct virtio_device *); + void (*config_changed)(struct virtio_device *); + int (*freeze)(struct virtio_device *); + int (*restore)(struct virtio_device *); +}; + +typedef __u32 __virtio32; + +typedef __u64 __virtio64; + +struct virtio_net_config { + __u8 mac[6]; + __virtio16 status; + __virtio16 max_virtqueue_pairs; + __virtio16 mtu; + __le32 speed; + __u8 duplex; + __u8 rss_max_key_size; + __le16 rss_max_indirection_table_length; + __le32 supported_hash_types; +}; + +struct virtio_net_hdr_v1 { + __u8 flags; + __u8 gso_type; + __virtio16 hdr_len; + __virtio16 gso_size; + union { + struct { + __virtio16 csum_start; + __virtio16 csum_offset; + }; + struct { + __virtio16 start; + __virtio16 offset; + } csum; + struct { + __le16 segments; + __le16 dup_acks; + } rsc; + }; + __virtio16 num_buffers; +}; + +struct virtio_net_hdr_v1_hash { + struct virtio_net_hdr_v1 hdr; + __le32 hash_value; + __le16 hash_report; + __le16 padding; +}; + +struct virtio_net_hdr_mrg_rxbuf { + struct virtio_net_hdr hdr; + __virtio16 num_buffers; +}; + +struct virtio_net_ctrl_hdr { + __u8 class; + __u8 cmd; +}; + +typedef __u8 virtio_net_ctrl_ack; + +struct virtio_net_ctrl_mac { + __virtio32 entries; + __u8 macs[0]; +}; + +struct virtio_net_ctrl_mq { + __virtio16 virtqueue_pairs; +}; + +struct virtio_net_ctrl_coal_tx { + __le32 tx_max_packets; + __le32 tx_usecs; +}; + +struct virtio_net_ctrl_coal_rx { + __le32 rx_max_packets; + __le32 rx_usecs; +}; + +struct failover_ops { + int (*slave_pre_register)(struct net_device *, struct net_device *); + int (*slave_register)(struct net_device *, struct net_device *); + int (*slave_pre_unregister)(struct net_device *, struct net_device *); + int (*slave_unregister)(struct net_device *, struct net_device *); + int (*slave_link_change)(struct net_device *, struct net_device *); + int (*slave_name_change)(struct net_device *, struct net_device *); + rx_handler_result_t (*slave_handle_frame)(struct sk_buff **); +}; + +struct failover { + struct list_head list; + struct net_device *failover_dev; + netdevice_tracker dev_tracker; + struct failover_ops *ops; +}; + +struct ewma_pkt_len { + long unsigned int internal; +}; + +struct virtnet_stat_desc { + char desc[32]; + size_t offset; +}; + +struct virtnet_sq_stats { + struct u64_stats_sync syncp; + u64 packets; + u64 bytes; + u64 xdp_tx; + u64 xdp_tx_drops; + u64 kicks; + u64 tx_timeouts; +}; + +struct virtnet_rq_stats { + struct u64_stats_sync syncp; + u64 packets; + u64 bytes; + u64 drops; + u64 xdp_packets; + u64 xdp_tx; + u64 xdp_redirects; + u64 xdp_drops; + u64 kicks; +}; + +struct send_queue { + struct virtqueue *vq; + struct scatterlist sg[19]; + char name[40]; + struct virtnet_sq_stats stats; + struct napi_struct napi; + bool reset; +}; + +struct receive_queue { + struct virtqueue *vq; + struct napi_struct napi; + struct bpf_prog *xdp_prog; + struct virtnet_rq_stats stats; + struct page *pages; + struct ewma_pkt_len mrg_avg_pkt_len; + struct page_frag alloc_frag; + struct scatterlist sg[19]; + unsigned int min_buf_len; + char name[40]; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct xdp_rxq_info xdp_rxq; +}; + +struct virtio_net_ctrl_rss { + u32 hash_types; + u16 indirection_table_mask; + u16 unclassified_queue; + u16 indirection_table[128]; + u16 max_tx_vq; + u8 hash_key_length; + u8 key[40]; +}; + +struct control_buf { + struct virtio_net_ctrl_hdr hdr; + virtio_net_ctrl_ack status; + struct virtio_net_ctrl_mq mq; + u8 promisc; + u8 allmulti; + __virtio16 vid; + __virtio64 offloads; + struct virtio_net_ctrl_rss rss; +}; + +struct virtnet_info { + struct virtio_device *vdev; + struct virtqueue *cvq; + struct net_device *dev; + struct send_queue *sq; + struct receive_queue *rq; + unsigned int status; + u16 max_queue_pairs; + u16 curr_queue_pairs; + u16 xdp_queue_pairs; + bool xdp_enabled; + bool big_packets; + unsigned int big_packets_num_skbfrags; + bool mergeable_rx_bufs; + bool has_rss; + bool has_rss_hash_report; + u8 rss_key_size; + u16 rss_indir_table_size; + u32 rss_hash_types_supported; + u32 rss_hash_types_saved; + bool has_cvq; + bool any_header_sg; + u8 hdr_len; + struct delayed_work refill; + bool refill_enabled; + spinlock_t refill_lock; + struct work_struct config_work; + bool affinity_hint_set; + struct hlist_node node; + struct hlist_node node_dead; + struct control_buf *ctrl; + u8 duplex; + u32 speed; + u32 tx_usecs; + u32 rx_usecs; + u32 tx_max_packets; + u32 rx_max_packets; + long unsigned int guest_offloads; + long unsigned int guest_offloads_capable; + struct failover *failover; +}; + +struct taint_flag { + char c_true; + char c_false; + bool module; +}; + +struct latch_tree_root { + seqcount_latch_t seq; + struct rb_root tree[2]; +}; + +struct mod_tree_root { + struct latch_tree_root root; + long unsigned int addr_min; + long unsigned int addr_max; +}; + +struct trace_event_raw_module_load { + struct trace_entry ent; + unsigned int taints; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_free { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_refcnt { + struct trace_entry ent; + long unsigned int ip; + int refcnt; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_module_request { + struct trace_entry ent; + long unsigned int ip; + bool wait; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_data_offsets_module_load { + u32 name; +}; + +struct trace_event_data_offsets_module_free { + u32 name; +}; + +struct trace_event_data_offsets_module_refcnt { + u32 name; +}; + +struct trace_event_data_offsets_module_request { + u32 name; +}; + +typedef void (*btf_trace_module_load)(void *, struct module *); + +typedef void (*btf_trace_module_free)(void *, struct module *); + +typedef void (*btf_trace_module_get)(void *, struct module *, long unsigned int); + +typedef void (*btf_trace_module_put)(void *, struct module *, long unsigned int); + +typedef void (*btf_trace_module_request)(void *, char *, bool, long unsigned int); + +struct symsearch { + const struct kernel_symbol *start; + const struct kernel_symbol *stop; + const s32 *crcs; + enum mod_license license; +}; + +struct mod_initfree { + struct llist_node node; + void *module_init; +}; + +struct mmp_struct { + __le32 mmp_magic; + __le32 mmp_seq; + __le64 mmp_time; + char mmp_nodename[64]; + char mmp_bdevname[32]; + __le16 mmp_check_interval; + __le16 mmp_pad1; + __le32 mmp_pad2[226]; + __le32 mmp_checksum; +}; + +struct x509_parse_context { + struct x509_certificate *cert; + long unsigned int data; + const void *key; + size_t key_size; + const void *params; + size_t params_size; + enum OID key_algo; + enum OID last_oid; + enum OID sig_algo; + u8 o_size; + u8 cn_size; + u8 email_size; + u16 o_offset; + u16 cn_offset; + u16 email_offset; + unsigned int raw_akid_size; + const void *raw_akid; + const void *akid_raw_issuer; + unsigned int akid_raw_issuer_size; +}; + +enum dd_data_dir { + DD_READ = 0, + DD_WRITE = 1, +}; + +enum { + DD_DIR_COUNT = 2, +}; + +enum dd_prio { + DD_RT_PRIO = 0, + DD_BE_PRIO = 1, + DD_IDLE_PRIO = 2, + DD_PRIO_MAX = 2, +}; + +enum { + DD_PRIO_COUNT = 3, +}; + +struct io_stats_per_prio { + uint32_t inserted; + uint32_t merged; + uint32_t dispatched; + atomic_t completed; +}; + +struct dd_per_prio { + struct list_head dispatch; + struct rb_root sort_list[2]; + struct list_head fifo_list[2]; + struct request *next_rq[2]; + struct io_stats_per_prio stats; +}; + +struct deadline_data { + struct dd_per_prio per_prio[3]; + enum dd_data_dir last_dir; + unsigned int batching; + unsigned int starved; + int fifo_expire[2]; + int fifo_batch; + int writes_starved; + int front_merges; + u32 async_depth; + int prio_aging_expire; + spinlock_t lock; + spinlock_t zone_lock; +}; + +struct partition_affinity { + cpumask_t mask; + void *partition_id; +}; + +struct partition_desc { + int nr_parts; + struct partition_affinity *parts; + struct irq_domain *domain; + struct irq_desc *chained_desc; + long unsigned int *bitmap; + struct irq_domain_ops ops; +}; + +struct tcg_efi_specid_event_algs { + u16 alg_id; + u16 digest_size; +}; + +struct tcg_efi_specid_event_head { + u8 signature[16]; + u32 platform_class; + u8 spec_version_minor; + u8 spec_version_major; + u8 spec_errata; + u8 uintnsize; + u32 num_algs; + struct tcg_efi_specid_event_algs digest_sizes[0]; +}; + +struct tcg_pcr_event { + u32 pcr_idx; + u32 event_type; + u8 digest[20]; + u32 event_size; + u8 event[0]; +}; + +struct tcg_event_field { + u32 event_size; + u8 event[0]; +}; + +struct tcg_pcr_event2_head { + u32 pcr_idx; + u32 event_type; + u32 count; + struct tpm_digest digests[0]; +}; + +struct ethtool_cmd { + __u32 cmd; + __u32 supported; + __u32 advertising; + __u16 speed; + __u8 duplex; + __u8 port; + __u8 phy_address; + __u8 transceiver; + __u8 autoneg; + __u8 mdio_support; + __u32 maxtxpkt; + __u32 maxrxpkt; + __u16 speed_hi; + __u8 eth_tp_mdix; + __u8 eth_tp_mdix_ctrl; + __u32 lp_advertising; + __u32 reserved[2]; +}; + +struct ethtool_value { + __u32 cmd; + __u32 data; +}; + +enum tunable_type_id { + ETHTOOL_TUNABLE_UNSPEC = 0, + ETHTOOL_TUNABLE_U8 = 1, + ETHTOOL_TUNABLE_U16 = 2, + ETHTOOL_TUNABLE_U32 = 3, + ETHTOOL_TUNABLE_U64 = 4, + ETHTOOL_TUNABLE_STRING = 5, + ETHTOOL_TUNABLE_S8 = 6, + ETHTOOL_TUNABLE_S16 = 7, + ETHTOOL_TUNABLE_S32 = 8, + ETHTOOL_TUNABLE_S64 = 9, +}; + +struct ethtool_gstrings { + __u32 cmd; + __u32 string_set; + __u32 len; + __u8 data[0]; +}; + +struct ethtool_sset_info { + __u32 cmd; + __u32 reserved; + __u64 sset_mask; + __u32 data[0]; +}; + +struct ethtool_perm_addr { + __u32 cmd; + __u32 size; + __u8 data[0]; +}; + +enum ethtool_flags { + ETH_FLAG_TXVLAN = 128, + ETH_FLAG_RXVLAN = 256, + ETH_FLAG_LRO = 32768, + ETH_FLAG_NTUPLE = 134217728, + ETH_FLAG_RXHASH = 268435456, +}; + +struct ethtool_rxfh { + __u32 cmd; + __u32 rss_context; + __u32 indir_size; + __u32 key_size; + __u8 hfunc; + __u8 rsvd8[3]; + __u32 rsvd32; + __u32 rss_config[0]; +}; + +struct ethtool_get_features_block { + __u32 available; + __u32 requested; + __u32 active; + __u32 never_changed; +}; + +struct ethtool_gfeatures { + __u32 cmd; + __u32 size; + struct ethtool_get_features_block features[0]; +}; + +struct ethtool_set_features_block { + __u32 valid; + __u32 requested; +}; + +struct ethtool_sfeatures { + __u32 cmd; + __u32 size; + struct ethtool_set_features_block features[0]; +}; + +enum ethtool_sfeatures_retval_bits { + ETHTOOL_F_UNSUPPORTED__BIT = 0, + ETHTOOL_F_WISH__BIT = 1, + ETHTOOL_F_COMPAT__BIT = 2, +}; + +struct ethtool_per_queue_op { + __u32 cmd; + __u32 sub_command; + __u32 queue_mask[128]; + char data[0]; +}; + +struct ethtool_rx_flow_rule { + struct flow_rule *rule; + long unsigned int priv[0]; +}; + +struct ethtool_rx_flow_spec_input { + const struct ethtool_rx_flow_spec *fs; + u32 rss_ctx; +}; + +struct ethtool_phy_ops { + int (*get_sset_count)(struct phy_device *); + int (*get_strings)(struct phy_device *, u8 *); + int (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *); + int (*start_cable_test)(struct phy_device *, struct netlink_ext_ack *); + int (*start_cable_test_tdr)(struct phy_device *, struct netlink_ext_ack *, const struct phy_tdr_config *); +}; + +struct ethtool_devlink_compat { + struct devlink *devlink; + union { + struct ethtool_flash efl; + struct ethtool_drvinfo info; + }; +}; + +struct ethtool_link_usettings { + struct ethtool_link_settings base; + struct { + __u32 supported[4]; + __u32 advertising[4]; + __u32 lp_advertising[4]; + } link_modes; +}; + +struct ethtool_rx_flow_key { + struct flow_dissector_key_basic basic; + union { + struct flow_dissector_key_ipv4_addrs ipv4; + struct flow_dissector_key_ipv6_addrs ipv6; + }; + struct flow_dissector_key_ports tp; + struct flow_dissector_key_ip ip; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_eth_addrs eth_addrs; +}; + +struct ethtool_rx_flow_match { + struct flow_dissector dissector; + int: 32; + struct ethtool_rx_flow_key key; + struct ethtool_rx_flow_key mask; +}; + +enum acpi_srat_type { + ACPI_SRAT_TYPE_CPU_AFFINITY = 0, + ACPI_SRAT_TYPE_MEMORY_AFFINITY = 1, + ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY = 2, + ACPI_SRAT_TYPE_GICC_AFFINITY = 3, + ACPI_SRAT_TYPE_GIC_ITS_AFFINITY = 4, + ACPI_SRAT_TYPE_GENERIC_AFFINITY = 5, + ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY = 6, + ACPI_SRAT_TYPE_RESERVED = 7, +}; + +struct acpi_srat_gicc_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u32 acpi_processor_uid; + u32 flags; + u32 clock_domain; +} __attribute__((packed)); + +enum { + IRQ_STARTUP_NORMAL = 0, + IRQ_STARTUP_MANAGED = 1, + IRQ_STARTUP_ABORT = 2, +}; + +struct page_reporting_dev_info { + int (*report)(struct page_reporting_dev_info *, struct scatterlist *, unsigned int); + struct delayed_work work; + atomic_t state; + unsigned int order; +}; + +enum { + PAGE_REPORTING_IDLE = 0, + PAGE_REPORTING_REQUESTED = 1, + PAGE_REPORTING_ACTIVE = 2, +}; + +struct inotify_event { + __s32 wd; + __u32 mask; + __u32 cookie; + __u32 len; + char name[0]; +}; + +struct chksum_desc_ctx___2 { + __u16 crc; +}; + +enum { + IO_APOLL_OK = 0, + IO_APOLL_ABORTED = 1, + IO_APOLL_READY = 2, +}; + +struct io_poll_update { + struct file *file; + u64 old_user_data; + u64 new_user_data; + __poll_t events; + bool update_events; + bool update_user_data; +}; + +struct io_poll_table { + struct poll_table_struct pt; + struct io_kiocb *req; + int nr_entries; + int error; + bool owning; + __poll_t result_mask; +}; + +enum { + IOU_POLL_DONE = 0, + IOU_POLL_NO_ACTION = 1, + IOU_POLL_REMOVE_POLL_USE_RES = 2, +}; + +enum blake2s_lengths { + BLAKE2S_BLOCK_SIZE = 64, + BLAKE2S_HASH_SIZE = 32, + BLAKE2S_KEY_SIZE = 32, + BLAKE2S_128_HASH_SIZE = 16, + BLAKE2S_160_HASH_SIZE = 20, + BLAKE2S_224_HASH_SIZE = 28, + BLAKE2S_256_HASH_SIZE = 32, +}; + +struct blake2s_state { + u32 h[8]; + u32 t[2]; + u32 f[2]; + u8 buf[64]; + unsigned int buflen; + unsigned int outlen; +}; + +struct clk_lookup { + struct list_head node; + const char *dev_id; + const char *con_id; + struct clk *clk; + struct clk_hw *clk_hw; +}; + +struct clk_lookup_alloc { + struct clk_lookup cl; + char dev_id[20]; + char con_id[16]; +}; + +struct software_node_ref_args { + const struct software_node *node; + unsigned int nargs; + u64 args[8]; +}; + +struct swnode { + struct kobject kobj; + struct fwnode_handle fwnode; + const struct software_node *node; + int id; + struct ida child_ids; + struct list_head entry; + struct list_head children; + struct swnode *parent; + unsigned int allocated: 1; + unsigned int managed: 1; +}; + +struct a4tech_sc { + long unsigned int quirks; + unsigned int hw_wheel; + __s32 delayed_value; +}; + +enum { + TCA_BPF_UNSPEC = 0, + TCA_BPF_ACT = 1, + TCA_BPF_POLICE = 2, + TCA_BPF_CLASSID = 3, + TCA_BPF_OPS_LEN = 4, + TCA_BPF_OPS = 5, + TCA_BPF_FD = 6, + TCA_BPF_NAME = 7, + TCA_BPF_FLAGS = 8, + TCA_BPF_FLAGS_GEN = 9, + TCA_BPF_TAG = 10, + TCA_BPF_ID = 11, + __TCA_BPF_MAX = 12, +}; + +struct flow_cls_common_offload { + u32 chain_index; + __be16 protocol; + u32 prio; + struct netlink_ext_ack *extack; +}; + +enum tc_clsbpf_command { + TC_CLSBPF_OFFLOAD = 0, + TC_CLSBPF_STATS = 1, +}; + +struct tc_cls_bpf_offload { + struct flow_cls_common_offload common; + enum tc_clsbpf_command command; + struct tcf_exts *exts; + struct bpf_prog *prog; + struct bpf_prog *oldprog; + const char *name; + bool exts_integrated; +}; + +struct cls_bpf_head { + struct list_head plist; + struct idr handle_idr; + struct callback_head rcu; +}; + +struct cls_bpf_prog { + struct bpf_prog *filter; + struct list_head link; + struct tcf_result res; + bool exts_integrated; + u32 gen_flags; + unsigned int in_hw_count; + struct tcf_exts exts; + u32 handle; + u16 bpf_num_ops; + struct sock_filter *bpf_ops; + const char *bpf_name; + struct tcf_proto *tp; + struct rcu_work rwork; +}; + +struct trace_event_raw_cgroup_root { + struct trace_entry ent; + int root; + u16 ss_mask; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_cgroup { + struct trace_entry ent; + int root; + int level; + u64 id; + u32 __data_loc_path; + char __data[0]; +}; + +struct trace_event_raw_cgroup_migrate { + struct trace_entry ent; + int dst_root; + int dst_level; + u64 dst_id; + int pid; + u32 __data_loc_dst_path; + u32 __data_loc_comm; + char __data[0]; +}; + +struct trace_event_raw_cgroup_event { + struct trace_entry ent; + int root; + int level; + u64 id; + u32 __data_loc_path; + int val; + char __data[0]; +}; + +struct trace_event_data_offsets_cgroup_root { + u32 name; +}; + +struct trace_event_data_offsets_cgroup { + u32 path; +}; + +struct trace_event_data_offsets_cgroup_migrate { + u32 dst_path; + u32 comm; +}; + +struct trace_event_data_offsets_cgroup_event { + u32 path; +}; + +typedef void (*btf_trace_cgroup_setup_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_destroy_root)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_remount)(void *, struct cgroup_root *); + +typedef void (*btf_trace_cgroup_mkdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rmdir)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_release)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_rename)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_freeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_unfreeze)(void *, struct cgroup *, const char *); + +typedef void (*btf_trace_cgroup_attach_task)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_transfer_tasks)(void *, struct cgroup *, const char *, struct task_struct *, bool); + +typedef void (*btf_trace_cgroup_notify_populated)(void *, struct cgroup *, const char *, int); + +typedef void (*btf_trace_cgroup_notify_frozen)(void *, struct cgroup *, const char *, int); + +enum cgroup_opt_features { + OPT_FEATURE_COUNT = 0, +}; + +enum cgroup2_param { + Opt_nsdelegate = 0, + Opt_favordynmods___2 = 1, + Opt_memory_localevents = 2, + Opt_memory_recursiveprot = 3, + nr__cgroup2_params = 4, +}; + +enum arch_timer_reg { + ARCH_TIMER_REG_CTRL = 0, + ARCH_TIMER_REG_CVAL = 1, +}; + +enum arch_timer_spi_nr { + ARCH_TIMER_PHYS_SPI = 0, + ARCH_TIMER_VIRT_SPI = 1, + ARCH_TIMER_MAX_TIMER_SPI = 2, +}; + +struct arch_timer_kvm_info { + struct timecounter timecounter; + int virtual_irq; + int physical_irq; +}; + +enum arch_timer_erratum_match_type { + ate_match_dt = 0, + ate_match_local_cap_id = 1, + ate_match_acpi_oem_info = 2, +}; + +struct arch_timer_erratum_workaround { + enum arch_timer_erratum_match_type match_type; + const void *id; + const char *desc; + u64 (*read_cntpct_el0)(); + u64 (*read_cntvct_el0)(); + int (*set_next_event_phys)(long unsigned int, struct clock_event_device *); + int (*set_next_event_virt)(long unsigned int, struct clock_event_device *); + bool disable_compat_vdso; +}; + +typedef int (*of_init_fn_1_ret)(struct device_node *); + +struct arch_timer { + void *base; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct clock_event_device evt; +}; + +struct ate_acpi_oem_info { + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; +}; + +typedef bool (*ate_match_fn_t)(const struct arch_timer_erratum_workaround *, const void *); + +struct rss_req_info { + struct ethnl_req_info base; + u32 rss_context; +}; + +struct rss_reply_data { + struct ethnl_reply_data base; + u32 indir_size; + u32 hkey_size; + u32 hfunc; + u32 *indir_table; + u8 *hkey; +}; + +enum lwtunnel_ip_t { + LWTUNNEL_IP_UNSPEC = 0, + LWTUNNEL_IP_ID = 1, + LWTUNNEL_IP_DST = 2, + LWTUNNEL_IP_SRC = 3, + LWTUNNEL_IP_TTL = 4, + LWTUNNEL_IP_TOS = 5, + LWTUNNEL_IP_FLAGS = 6, + LWTUNNEL_IP_PAD = 7, + LWTUNNEL_IP_OPTS = 8, + __LWTUNNEL_IP_MAX = 9, +}; + +enum lwtunnel_ip6_t { + LWTUNNEL_IP6_UNSPEC = 0, + LWTUNNEL_IP6_ID = 1, + LWTUNNEL_IP6_DST = 2, + LWTUNNEL_IP6_SRC = 3, + LWTUNNEL_IP6_HOPLIMIT = 4, + LWTUNNEL_IP6_TC = 5, + LWTUNNEL_IP6_FLAGS = 6, + LWTUNNEL_IP6_PAD = 7, + LWTUNNEL_IP6_OPTS = 8, + __LWTUNNEL_IP6_MAX = 9, +}; + +enum { + LWTUNNEL_IP_OPTS_UNSPEC = 0, + LWTUNNEL_IP_OPTS_GENEVE = 1, + LWTUNNEL_IP_OPTS_VXLAN = 2, + LWTUNNEL_IP_OPTS_ERSPAN = 3, + __LWTUNNEL_IP_OPTS_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_GENEVE_UNSPEC = 0, + LWTUNNEL_IP_OPT_GENEVE_CLASS = 1, + LWTUNNEL_IP_OPT_GENEVE_TYPE = 2, + LWTUNNEL_IP_OPT_GENEVE_DATA = 3, + __LWTUNNEL_IP_OPT_GENEVE_MAX = 4, +}; + +enum { + LWTUNNEL_IP_OPT_VXLAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_VXLAN_GBP = 1, + __LWTUNNEL_IP_OPT_VXLAN_MAX = 2, +}; + +enum { + LWTUNNEL_IP_OPT_ERSPAN_UNSPEC = 0, + LWTUNNEL_IP_OPT_ERSPAN_VER = 1, + LWTUNNEL_IP_OPT_ERSPAN_INDEX = 2, + LWTUNNEL_IP_OPT_ERSPAN_DIR = 3, + LWTUNNEL_IP_OPT_ERSPAN_HWID = 4, + __LWTUNNEL_IP_OPT_ERSPAN_MAX = 5, +}; + +struct geneve_opt { + __be16 opt_class; + u8 type; + u8 length: 5; + u8 r3: 1; + u8 r2: 1; + u8 r1: 1; + u8 opt_data[0]; +}; + +struct nf_synproxy_info { + __u8 options; + __u8 wscale; + __u16 mss; +}; + +struct synproxy_stats { + unsigned int syn_received; + unsigned int cookie_invalid; + unsigned int cookie_valid; + unsigned int cookie_retrans; + unsigned int conn_reopened; +}; + +struct synproxy_net { + struct nf_conn *tmpl; + struct synproxy_stats *stats; + unsigned int hook_ref4; + unsigned int hook_ref6; +}; + +struct synproxy_options { + u8 options; + u8 wscale; + u16 mss_option; + u16 mss_encode; + u32 tsval; + u32 tsecr; +}; + +struct fregs_offset { + const char *name; + int offset; +}; + +struct prev_kprobe { + struct kprobe *kp; + unsigned int status; +}; + +struct kprobe_ctlblk { + unsigned int kprobe_status; + long unsigned int saved_irqflag; + struct prev_kprobe prev_kprobe; +}; + +struct kprobe_blacklist_entry { + struct list_head list; + long unsigned int start_addr; + long unsigned int end_addr; +}; + +struct kprobe_insn_cache { + struct mutex mutex; + void * (*alloc)(); + void (*free)(void *); + const char *sym; + struct list_head pages; + size_t insn_size; + int nr_garbage; +}; + +struct kprobe_insn_page { + struct list_head list; + kprobe_opcode_t *insns; + struct kprobe_insn_cache *cache; + int nused; + int ngarbage; + char slot_used[0]; +}; + +enum kprobe_slot_state { + SLOT_CLEAN = 0, + SLOT_DIRTY = 1, + SLOT_USED = 2, +}; + +struct linux_dirent64 { + u64 d_ino; + s64 d_off; + short unsigned int d_reclen; + unsigned char d_type; + char d_name[0]; +}; + +struct linux_dirent { + long unsigned int d_ino; + long unsigned int d_off; + short unsigned int d_reclen; + char d_name[1]; +}; + +struct getdents_callback___2 { + struct dir_context ctx; + struct linux_dirent *current_dir; + int prev_reclen; + int count; + int error; +}; + +struct getdents_callback64 { + struct dir_context ctx; + struct linux_dirent64 *current_dir; + int prev_reclen; + int count; + int error; +}; + +struct simple_xattr { + struct rb_node rb_node; + char *name; + size_t size; + char value[0]; +}; + +struct xattr_name { + char name[256]; +}; + +struct xattr_ctx { + union { + const void *cvalue; + void *value; + }; + void *kvalue; + size_t size; + struct xattr_name *kname; + unsigned int flags; +}; + +struct crypto_report_aead { + char type[64]; + char geniv[64]; + unsigned int blocksize; + unsigned int maxauthsize; + unsigned int ivsize; +}; + +struct blk_mq_hw_ctx_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_mq_hw_ctx *, char *); + ssize_t (*store)(struct blk_mq_hw_ctx *, const char *, size_t); +}; + +struct pcie_pme_service_data { + spinlock_t lock; + struct pcie_device *srv; + struct work_struct work; + bool noirq; +}; + +struct acpi_create_field_info { + struct acpi_namespace_node *region_node; + struct acpi_namespace_node *field_node; + struct acpi_namespace_node *register_node; + struct acpi_namespace_node *data_register_node; + struct acpi_namespace_node *connection_node; + u8 *resource_buffer; + u32 bank_value; + u32 field_bit_position; + u32 field_bit_length; + u16 resource_length; + u16 pin_number_index; + u8 field_flags; + u8 attribute; + u8 field_type; + u8 access_length; +}; + +struct ladder_device_state { + struct { + u32 promotion_count; + u32 demotion_count; + u64 promotion_time_ns; + u64 demotion_time_ns; + } threshold; + struct { + int promotion_count; + int demotion_count; + } stats; +}; + +struct ladder_device { + struct ladder_device_state states[10]; +}; + +struct ipq { + struct inet_frag_queue q; + u8 ecn; + u16 max_df_size; + int iif; + unsigned int rid; + struct inet_peer *peer; +}; + +struct tx_work { + struct delayed_work work; + struct sock *sk; +}; + +struct tls_rec; + +struct tls_sw_context_tx { + struct crypto_aead *aead_send; + struct crypto_wait async_wait; + struct tx_work tx_work; + struct tls_rec *open_rec; + struct list_head tx_list; + atomic_t encrypt_pending; + spinlock_t encrypt_compl_lock; + int async_notify; + u8 async_capable: 1; + long unsigned int tx_bitmask; +}; + +enum { + TCP_BPF_IPV4 = 0, + TCP_BPF_IPV6 = 1, + TCP_BPF_NUM_PROTS = 2, +}; + +enum { + TCP_BPF_BASE = 0, + TCP_BPF_TX = 1, + TCP_BPF_RX = 2, + TCP_BPF_TXRX = 3, + TCP_BPF_NUM_CFGS = 4, +}; + +struct vfs_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; +}; + +struct vfs_ns_cap_data { + __le32 magic_etc; + struct { + __le32 permitted; + __le32 inheritable; + } data[2]; + __le32 rootid; +}; + +struct cpu_vfs_cap_data { + __u32 magic_etc; + kernel_cap_t permitted; + kernel_cap_t inheritable; + kuid_t rootid; +}; + +struct fb_modelist { + struct list_head list; + struct fb_videomode mode; +}; + +enum { + MATCH_MTR = 0, + MATCH_MEQ = 1, + MATCH_MLE = 2, + MATCH_MLT = 3, + MATCH_MGE = 4, + MATCH_MGT = 5, +}; + +struct node_access_nodes { + struct device dev; + struct list_head list_node; + unsigned int access; +}; + +struct node_attr { + struct device_attribute attr; + enum node_states state; +}; + +struct ifaddrlblmsg { + __u8 ifal_family; + __u8 __ifal_reserved; + __u8 ifal_prefixlen; + __u8 ifal_flags; + __u32 ifal_index; + __u32 ifal_seq; +}; + +enum { + IFAL_ADDRESS = 1, + IFAL_LABEL = 2, + __IFAL_MAX = 3, +}; + +struct ip6addrlbl_entry { + struct in6_addr prefix; + int prefixlen; + int ifindex; + int addrtype; + u32 label; + struct hlist_node list; + struct callback_head rcu; +}; + +struct ip6addrlbl_init_table { + const struct in6_addr *prefix; + int prefixlen; + u32 label; +}; + +enum vlan_ioctl_cmds { + ADD_VLAN_CMD = 0, + DEL_VLAN_CMD = 1, + SET_VLAN_INGRESS_PRIORITY_CMD = 2, + SET_VLAN_EGRESS_PRIORITY_CMD = 3, + GET_VLAN_INGRESS_PRIORITY_CMD = 4, + GET_VLAN_EGRESS_PRIORITY_CMD = 5, + SET_VLAN_NAME_TYPE_CMD = 6, + SET_VLAN_FLAG_CMD = 7, + GET_VLAN_REALDEV_NAME_CMD = 8, + GET_VLAN_VID_CMD = 9, +}; + +enum vlan_name_types { + VLAN_NAME_TYPE_PLUS_VID = 0, + VLAN_NAME_TYPE_RAW_PLUS_VID = 1, + VLAN_NAME_TYPE_PLUS_VID_NO_PAD = 2, + VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD = 3, + VLAN_NAME_TYPE_HIGHEST = 4, +}; + +struct vlan_ioctl_args { + int cmd; + char device1[24]; + union { + char device2[24]; + int VID; + unsigned int skb_priority; + unsigned int name_type; + unsigned int bind_type; + unsigned int flag; + } u; + short int vlan_qos; +}; + +struct vlan_net { + struct proc_dir_entry *proc_vlan_dir; + struct proc_dir_entry *proc_vlan_conf; + short unsigned int name_type; +}; + +struct xdp_rxtx_ring { + struct xdp_ring ptrs; + struct xdp_desc desc[0]; +}; + +struct ce_unbind { + struct clock_event_device *ce; + int res; +}; + +enum hugetlb_memory_event { + HUGETLB_MAX = 0, + HUGETLB_NR_MEMORY_EVENTS = 1, +}; + +struct fb_event { + struct fb_info *info; + void *data; +}; + +enum backlight_update_reason { + BACKLIGHT_UPDATE_HOTKEY = 0, + BACKLIGHT_UPDATE_SYSFS = 1, +}; + +enum backlight_type { + BACKLIGHT_RAW = 1, + BACKLIGHT_PLATFORM = 2, + BACKLIGHT_FIRMWARE = 3, + BACKLIGHT_TYPE_MAX = 4, +}; + +enum backlight_notification { + BACKLIGHT_REGISTERED = 0, + BACKLIGHT_UNREGISTERED = 1, +}; + +enum backlight_scale { + BACKLIGHT_SCALE_UNKNOWN = 0, + BACKLIGHT_SCALE_LINEAR = 1, + BACKLIGHT_SCALE_NON_LINEAR = 2, +}; + +struct backlight_device; + +struct backlight_ops { + unsigned int options; + int (*update_status)(struct backlight_device *); + int (*get_brightness)(struct backlight_device *); + int (*check_fb)(struct backlight_device *, struct fb_info *); +}; + +struct backlight_properties { + int brightness; + int max_brightness; + int power; + int fb_blank; + enum backlight_type type; + unsigned int state; + enum backlight_scale scale; +}; + +struct backlight_device { + struct backlight_properties props; + struct mutex update_lock; + struct mutex ops_lock; + const struct backlight_ops *ops; + struct notifier_block fb_notif; + struct list_head entry; + struct device dev; + bool fb_bl_on[32]; + int use_count; +}; + +struct dma_fence_cb; + +typedef void (*dma_fence_func_t)(struct dma_fence *, struct dma_fence_cb *); + +struct dma_fence_cb { + struct list_head node; + dma_fence_func_t func; +}; + +struct dma_fence_array_cb { + struct dma_fence_cb cb; + struct dma_fence_array *array; +}; + +struct cytp_contact { + int x; + int y; + int z; +}; + +struct cytp_report_data { + int contact_cnt; + struct cytp_contact contacts[2]; + unsigned int left: 1; + unsigned int right: 1; + unsigned int middle: 1; + unsigned int tap: 1; +}; + +struct cytp_data { + int fw_version; + int pkt_size; + int mode; + int tp_min_pressure; + int tp_max_pressure; + int tp_width; + int tp_high; + int tp_max_abs_x; + int tp_max_abs_y; + int tp_res_x; + int tp_res_y; + int tp_metrics_supported; +}; + +struct ptp_clock_caps { + int max_adj; + int n_alarm; + int n_ext_ts; + int n_per_out; + int pps; + int n_pins; + int cross_timestamping; + int adjust_phase; + int rsv[12]; +}; + +struct ptp_sys_offset { + unsigned int n_samples; + unsigned int rsv[3]; + struct ptp_clock_time ts[51]; +}; + +struct ptp_sys_offset_extended { + unsigned int n_samples; + unsigned int rsv[3]; + struct ptp_clock_time ts[75]; +}; + +struct ptp_sys_offset_precise { + struct ptp_clock_time device; + struct ptp_clock_time sys_realtime; + struct ptp_clock_time sys_monoraw; + unsigned int rsv[4]; +}; + +struct channels_reply_data { + struct ethnl_reply_data base; + struct ethtool_channels channels; +}; + +enum uts_proc { + UTS_PROC_ARCH = 0, + UTS_PROC_OSTYPE = 1, + UTS_PROC_OSRELEASE = 2, + UTS_PROC_VERSION = 3, + UTS_PROC_HOSTNAME = 4, + UTS_PROC_DOMAINNAME = 5, +}; + +enum { + BPF_RB_NO_WAKEUP = 1, + BPF_RB_FORCE_WAKEUP = 2, +}; + +enum { + BPF_RB_AVAIL_DATA = 0, + BPF_RB_RING_SIZE = 1, + BPF_RB_CONS_POS = 2, + BPF_RB_PROD_POS = 3, +}; + +enum { + BPF_RINGBUF_BUSY_BIT = 2147483648, + BPF_RINGBUF_DISCARD_BIT = 1073741824, + BPF_RINGBUF_HDR_SZ = 8, +}; + +struct bpf_dynptr_kern { + void *data; + u32 size; + u32 offset; +}; + +struct bpf_ringbuf { + wait_queue_head_t waitq; + struct irq_work work; + u64 mask; + struct page **pages; + int nr_pages; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + spinlock_t spinlock; + atomic_t busy; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int consumer_pos; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long unsigned int producer_pos; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + char data[0]; +}; + +struct bpf_ringbuf_map { + struct bpf_map map; + struct bpf_ringbuf *rb; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct bpf_ringbuf_hdr { + u32 len; + u32 pg_off; +}; + +typedef u64 (*btf_bpf_ringbuf_reserve)(struct bpf_map *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_submit)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_discard)(void *, u64); + +typedef u64 (*btf_bpf_ringbuf_output)(struct bpf_map *, void *, u64, u64); + +typedef u64 (*btf_bpf_ringbuf_query)(struct bpf_map *, u64); + +typedef u64 (*btf_bpf_ringbuf_reserve_dynptr)(struct bpf_map *, u32, u64, struct bpf_dynptr_kern *); + +typedef u64 (*btf_bpf_ringbuf_submit_dynptr)(struct bpf_dynptr_kern *, u64); + +typedef u64 (*btf_bpf_ringbuf_discard_dynptr)(struct bpf_dynptr_kern *, u64); + +typedef u64 (*btf_bpf_user_ringbuf_drain)(struct bpf_map *, void *, void *, u64); + +enum { + PERCPU_REF_INIT_ATOMIC = 1, + PERCPU_REF_INIT_DEAD = 2, + PERCPU_REF_ALLOW_REINIT = 4, +}; + +struct blk_plug_cb; + +typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool); + +struct blk_plug_cb { + struct list_head list; + blk_plug_cb_fn callback; + void *data; +}; + +struct trace_event_raw_block_buffer { + struct trace_entry ent; + dev_t dev; + sector_t sector; + size_t size; + char __data[0]; +}; + +struct trace_event_raw_block_rq_requeue { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_rq_completion { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + int error; + char rwbs[8]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_rq { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + unsigned int bytes; + char rwbs[8]; + char comm[16]; + u32 __data_loc_cmd; + char __data[0]; +}; + +struct trace_event_raw_block_bio_complete { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + int error; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_bio { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_plug { + struct trace_entry ent; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_unplug { + struct trace_entry ent; + int nr_rq; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_split { + struct trace_entry ent; + dev_t dev; + sector_t sector; + sector_t new_sector; + char rwbs[8]; + char comm[16]; + char __data[0]; +}; + +struct trace_event_raw_block_bio_remap { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_raw_block_rq_remap { + struct trace_entry ent; + dev_t dev; + sector_t sector; + unsigned int nr_sector; + dev_t old_dev; + sector_t old_sector; + unsigned int nr_bios; + char rwbs[8]; + char __data[0]; +}; + +struct trace_event_data_offsets_block_buffer {}; + +struct trace_event_data_offsets_block_rq_requeue { + u32 cmd; +}; + +struct trace_event_data_offsets_block_rq_completion { + u32 cmd; +}; + +struct trace_event_data_offsets_block_rq { + u32 cmd; +}; + +struct trace_event_data_offsets_block_bio_complete {}; + +struct trace_event_data_offsets_block_bio {}; + +struct trace_event_data_offsets_block_plug {}; + +struct trace_event_data_offsets_block_unplug {}; + +struct trace_event_data_offsets_block_split {}; + +struct trace_event_data_offsets_block_bio_remap {}; + +struct trace_event_data_offsets_block_rq_remap {}; + +typedef void (*btf_trace_block_touch_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_dirty_buffer)(void *, struct buffer_head *); + +typedef void (*btf_trace_block_rq_requeue)(void *, struct request *); + +typedef void (*btf_trace_block_rq_complete)(void *, struct request *, blk_status_t, unsigned int); + +typedef void (*btf_trace_block_rq_error)(void *, struct request *, blk_status_t, unsigned int); + +typedef void (*btf_trace_block_rq_insert)(void *, struct request *); + +typedef void (*btf_trace_block_rq_issue)(void *, struct request *); + +typedef void (*btf_trace_block_rq_merge)(void *, struct request *); + +typedef void (*btf_trace_block_bio_complete)(void *, struct request_queue *, struct bio *); + +typedef void (*btf_trace_block_bio_bounce)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_backmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_frontmerge)(void *, struct bio *); + +typedef void (*btf_trace_block_bio_queue)(void *, struct bio *); + +typedef void (*btf_trace_block_getrq)(void *, struct bio *); + +typedef void (*btf_trace_block_plug)(void *, struct request_queue *); + +typedef void (*btf_trace_block_unplug)(void *, struct request_queue *, unsigned int, bool); + +typedef void (*btf_trace_block_split)(void *, struct bio *, unsigned int); + +typedef void (*btf_trace_block_bio_remap)(void *, struct bio *, dev_t, sector_t); + +typedef void (*btf_trace_block_rq_remap)(void *, struct request *, dev_t, sector_t); + +struct throtl_grp; + +struct throtl_qnode { + struct list_head node; + struct bio_list bios; + struct throtl_grp *tg; +}; + +struct throtl_service_queue { + struct throtl_service_queue *parent_sq; + struct list_head queued[2]; + unsigned int nr_queued[2]; + struct rb_root_cached pending_tree; + unsigned int nr_pending; + long unsigned int first_pending_disptime; + struct timer_list pending_timer; +}; + +struct throtl_grp { + struct blkg_policy_data pd; + struct rb_node rb_node; + struct throtl_data *td; + struct throtl_service_queue service_queue; + struct throtl_qnode qnode_on_self[2]; + struct throtl_qnode qnode_on_parent[2]; + long unsigned int disptime; + unsigned int flags; + bool has_rules_bps[2]; + bool has_rules_iops[2]; + uint64_t bps[4]; + uint64_t bps_conf[4]; + unsigned int iops[4]; + unsigned int iops_conf[4]; + uint64_t bytes_disp[2]; + unsigned int io_disp[2]; + long unsigned int last_low_overflow_time[2]; + uint64_t last_bytes_disp[2]; + unsigned int last_io_disp[2]; + uint64_t carryover_bytes[2]; + unsigned int carryover_ios[2]; + long unsigned int last_check_time; + long unsigned int latency_target; + long unsigned int latency_target_conf; + long unsigned int slice_start[2]; + long unsigned int slice_end[2]; + long unsigned int last_finish_time; + long unsigned int checked_last_finish_time; + long unsigned int avg_idletime; + long unsigned int idletime_threshold; + long unsigned int idletime_threshold_conf; + unsigned int bio_cnt; + unsigned int bad_bio_cnt; + long unsigned int bio_cnt_reset_time; + struct blkg_rwstat stat_bytes; + struct blkg_rwstat stat_ios; +}; + +enum hwparam_type { + hwparam_ioport = 0, + hwparam_iomem = 1, + hwparam_ioport_or_iomem = 2, + hwparam_irq = 3, + hwparam_dma = 4, + hwparam_dma_addr = 5, + hwparam_other = 6, +}; + +struct uart_driver { + struct module *owner; + const char *driver_name; + const char *dev_name; + int major; + int minor; + int nr; + struct console *cons; + struct uart_state *state; + struct tty_driver *tty_driver; +}; + +struct plat_serial8250_port { + long unsigned int iobase; + void *membase; + resource_size_t mapbase; + unsigned int irq; + long unsigned int irqflags; + unsigned int uartclk; + void *private_data; + unsigned char regshift; + unsigned char iotype; + unsigned char hub6; + unsigned char has_sysrq; + upf_t flags; + unsigned int type; + unsigned int (*serial_in)(struct uart_port *, int); + void (*serial_out)(struct uart_port *, int, int); + void (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *); + void (*set_ldisc)(struct uart_port *, struct ktermios *); + unsigned int (*get_mctrl)(struct uart_port *); + int (*handle_irq)(struct uart_port *); + void (*pm)(struct uart_port *, unsigned int, unsigned int); + void (*handle_break)(struct uart_port *); +}; + +enum { + PLAT8250_DEV_LEGACY = -1, + PLAT8250_DEV_PLATFORM = 0, + PLAT8250_DEV_PLATFORM1 = 1, + PLAT8250_DEV_PLATFORM2 = 2, + PLAT8250_DEV_FOURPORT = 3, + PLAT8250_DEV_ACCENT = 4, + PLAT8250_DEV_BOCA = 5, + PLAT8250_DEV_EXAR_ST16C554 = 6, + PLAT8250_DEV_HUB6 = 7, + PLAT8250_DEV_AU1X00 = 8, + PLAT8250_DEV_SM501 = 9, +}; + +struct old_serial_port { + unsigned int uart; + unsigned int baud_base; + unsigned int port; + unsigned int irq; + upf_t flags; + unsigned char io_type; + unsigned char *iomem_base; + short unsigned int iomem_reg_shift; +}; + +struct irq_info { + struct hlist_node node; + int irq; + spinlock_t lock; + struct list_head *head; +}; + +enum xdp_buff_flags { + XDP_FLAGS_HAS_FRAGS = 1, + XDP_FLAGS_FRAGS_PF_MEMALLOC = 2, +}; + +enum { + VETH_INFO_UNSPEC = 0, + VETH_INFO_PEER = 1, + __VETH_INFO_MAX = 2, +}; + +struct veth_stats { + u64 rx_drops; + u64 xdp_packets; + u64 xdp_bytes; + u64 xdp_redirect; + u64 xdp_drops; + u64 xdp_tx; + u64 xdp_tx_err; + u64 peer_tq_xdp_xmit; + u64 peer_tq_xdp_xmit_err; +}; + +struct veth_rq_stats { + struct veth_stats vs; + struct u64_stats_sync syncp; +}; + +struct veth_rq { + struct napi_struct xdp_napi; + struct napi_struct *napi; + struct net_device *dev; + struct bpf_prog *xdp_prog; + struct xdp_mem_info xdp_mem; + struct veth_rq_stats stats; + bool rx_notify_masked; + long: 56; + long: 64; + struct ptr_ring xdp_ring; + struct xdp_rxq_info xdp_rxq; +}; + +struct veth_priv { + struct net_device *peer; + atomic64_t dropped; + struct bpf_prog *_xdp_prog; + struct veth_rq *rq; + unsigned int requested_headroom; +}; + +struct veth_xdp_tx_bq { + struct xdp_frame *q[16]; + unsigned int count; +}; + +struct veth_q_stat_desc { + char desc[32]; + size_t offset; +}; + +struct netdev_notifier_change_info { + struct netdev_notifier_info info; + unsigned int flags_changed; +}; + +struct nduseroptmsg { + unsigned char nduseropt_family; + unsigned char nduseropt_pad1; + short unsigned int nduseropt_opts_len; + int nduseropt_ifindex; + __u8 nduseropt_icmp_type; + __u8 nduseropt_icmp_code; + short unsigned int nduseropt_pad2; + unsigned int nduseropt_pad3; +}; + +enum { + NDUSEROPT_UNSPEC = 0, + NDUSEROPT_SRCADDR = 1, + __NDUSEROPT_MAX = 2, +}; + +struct inet6_ifaddr { + struct in6_addr addr; + __u32 prefix_len; + __u32 rt_priority; + __u32 valid_lft; + __u32 prefered_lft; + refcount_t refcnt; + spinlock_t lock; + int state; + __u32 flags; + __u8 dad_probes; + __u8 stable_privacy_retry; + __u16 scope; + __u64 dad_nonce; + long unsigned int cstamp; + long unsigned int tstamp; + struct delayed_work dad_work; + struct inet6_dev *idev; + struct fib6_info *rt; + struct hlist_node addr_lst; + struct list_head if_list; + struct list_head if_list_aux; + struct list_head tmp_list; + struct inet6_ifaddr *ifpub; + int regen_count; + bool tokenized; + u8 ifa_proto; + struct callback_head rcu; + struct in6_addr peer_addr; +}; + +struct rs_msg { + struct icmp6hdr icmph; + __u8 opt[0]; +}; + +struct ra_msg { + struct icmp6hdr icmph; + __be32 reachable_time; + __be32 retrans_timer; +}; + +struct route_info { + __u8 type; + __u8 length; + __u8 prefix_len; + __u8 reserved_l: 3; + __u8 route_pref: 2; + __u8 reserved_h: 3; + __be32 lifetime; + __u8 prefix[0]; +}; + +typedef s8 int8_t; + +enum p9_msg_t { + P9_TLERROR = 6, + P9_RLERROR = 7, + P9_TSTATFS = 8, + P9_RSTATFS = 9, + P9_TLOPEN = 12, + P9_RLOPEN = 13, + P9_TLCREATE = 14, + P9_RLCREATE = 15, + P9_TSYMLINK = 16, + P9_RSYMLINK = 17, + P9_TMKNOD = 18, + P9_RMKNOD = 19, + P9_TRENAME = 20, + P9_RRENAME = 21, + P9_TREADLINK = 22, + P9_RREADLINK = 23, + P9_TGETATTR = 24, + P9_RGETATTR = 25, + P9_TSETATTR = 26, + P9_RSETATTR = 27, + P9_TXATTRWALK = 30, + P9_RXATTRWALK = 31, + P9_TXATTRCREATE = 32, + P9_RXATTRCREATE = 33, + P9_TREADDIR = 40, + P9_RREADDIR = 41, + P9_TFSYNC = 50, + P9_RFSYNC = 51, + P9_TLOCK = 52, + P9_RLOCK = 53, + P9_TGETLOCK = 54, + P9_RGETLOCK = 55, + P9_TLINK = 70, + P9_RLINK = 71, + P9_TMKDIR = 72, + P9_RMKDIR = 73, + P9_TRENAMEAT = 74, + P9_RRENAMEAT = 75, + P9_TUNLINKAT = 76, + P9_RUNLINKAT = 77, + P9_TVERSION = 100, + P9_RVERSION = 101, + P9_TAUTH = 102, + P9_RAUTH = 103, + P9_TATTACH = 104, + P9_RATTACH = 105, + P9_TERROR = 106, + P9_RERROR = 107, + P9_TFLUSH = 108, + P9_RFLUSH = 109, + P9_TWALK = 110, + P9_RWALK = 111, + P9_TOPEN = 112, + P9_ROPEN = 113, + P9_TCREATE = 114, + P9_RCREATE = 115, + P9_TREAD = 116, + P9_RREAD = 117, + P9_TWRITE = 118, + P9_RWRITE = 119, + P9_TCLUNK = 120, + P9_RCLUNK = 121, + P9_TREMOVE = 122, + P9_RREMOVE = 123, + P9_TSTAT = 124, + P9_RSTAT = 125, + P9_TWSTAT = 126, + P9_RWSTAT = 127, +}; + +struct p9_wstat { + u16 size; + u16 type; + u32 dev; + struct p9_qid qid; + u32 mode; + u32 atime; + u32 mtime; + u64 length; + const char *name; + const char *uid; + const char *gid; + const char *muid; + char *extension; + kuid_t n_uid; + kgid_t n_gid; + kuid_t n_muid; +}; + +struct p9_flock { + u8 type; + u32 flags; + u64 start; + u64 length; + u32 proc_id; + char *client_id; +}; + +struct p9_getlock { + u8 type; + u64 start; + u64 length; + u32 proc_id; + char *client_id; +}; + +struct p9_rstatfs { + u32 type; + u32 bsize; + u64 blocks; + u64 bfree; + u64 bavail; + u64 files; + u64 ffree; + u64 fsid; + u32 namelen; +}; + +enum p9_proto_versions { + p9_proto_legacy = 0, + p9_proto_2000u = 1, + p9_proto_2000L = 2, +}; + +enum p9_req_status_t { + REQ_STATUS_ALLOC = 0, + REQ_STATUS_UNSENT = 1, + REQ_STATUS_SENT = 2, + REQ_STATUS_RCVD = 3, + REQ_STATUS_FLSHD = 4, + REQ_STATUS_ERROR = 5, +}; + +enum p9_fid_reftype { + P9_FID_REF_CREATE = 0, + P9_FID_REF_GET = 1, + P9_FID_REF_PUT = 2, + P9_FID_REF_DESTROY = 3, +}; + +struct trace_event_raw_9p_client_req { + struct trace_entry ent; + void *clnt; + __u8 type; + __u32 tag; + char __data[0]; +}; + +struct trace_event_raw_9p_client_res { + struct trace_entry ent; + void *clnt; + __u8 type; + __u32 tag; + __u32 err; + char __data[0]; +}; + +struct trace_event_raw_9p_protocol_dump { + struct trace_entry ent; + void *clnt; + __u8 type; + __u16 tag; + unsigned char line[32]; + char __data[0]; +}; + +struct trace_event_raw_9p_fid_ref { + struct trace_entry ent; + int fid; + int refcount; + __u8 type; + char __data[0]; +}; + +struct trace_event_data_offsets_9p_client_req {}; + +struct trace_event_data_offsets_9p_client_res {}; + +struct trace_event_data_offsets_9p_protocol_dump {}; + +struct trace_event_data_offsets_9p_fid_ref {}; + +typedef void (*btf_trace_9p_client_req)(void *, struct p9_client *, int8_t, int); + +typedef void (*btf_trace_9p_client_res)(void *, struct p9_client *, int8_t, int, int); + +typedef void (*btf_trace_9p_protocol_dump)(void *, struct p9_client *, struct p9_fcall *); + +typedef void (*btf_trace_9p_fid_ref)(void *, struct p9_fid *, __u8); + +enum { + Opt_msize = 0, + Opt_trans = 1, + Opt_legacy = 2, + Opt_version = 3, + Opt_err___2 = 4, +}; + +enum { + MPTCP_PM_ATTR_UNSPEC = 0, + MPTCP_PM_ATTR_ADDR = 1, + MPTCP_PM_ATTR_RCV_ADD_ADDRS = 2, + MPTCP_PM_ATTR_SUBFLOWS = 3, + MPTCP_PM_ATTR_TOKEN = 4, + MPTCP_PM_ATTR_LOC_ID = 5, + MPTCP_PM_ATTR_ADDR_REMOTE = 6, + __MPTCP_PM_ATTR_MAX = 7, +}; + +struct mptcp_pm_addr_entry { + struct list_head list; + struct mptcp_addr_info addr; + u8 flags; + int ifindex; + struct socket *lsk; +}; + +enum freezer_state_flags { + CGROUP_FREEZER_ONLINE = 1, + CGROUP_FREEZING_SELF = 2, + CGROUP_FREEZING_PARENT = 4, + CGROUP_FROZEN = 8, + CGROUP_FREEZING = 6, +}; + +struct freezer { + struct cgroup_subsys_state css; + unsigned int state; +}; + +struct io_sqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 flags; + __u32 dropped; + __u32 array; + __u32 resv1; + __u64 resv2; +}; + +struct io_cqring_offsets { + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 overflow; + __u32 cqes; + __u32 flags; + __u32 resv1; + __u64 resv2; +}; + +struct io_uring_params { + __u32 sq_entries; + __u32 cq_entries; + __u32 flags; + __u32 sq_thread_cpu; + __u32 sq_thread_idle; + __u32 features; + __u32 wq_fd; + __u32 resv[3]; + struct io_sqring_offsets sq_off; + struct io_cqring_offsets cq_off; +}; + +struct io_uring_probe_op { + __u8 op; + __u8 resv; + __u16 flags; + __u32 resv2; +}; + +struct io_uring_probe { + __u8 last_op; + __u8 ops_len; + __u16 resv; + __u32 resv2[3]; + struct io_uring_probe_op ops[0]; +}; + +struct io_uring_restriction { + __u16 opcode; + union { + __u8 register_op; + __u8 sqe_op; + __u8 sqe_flags; + }; + __u8 resv; + __u32 resv2[3]; +}; + +enum { + IORING_RESTRICTION_REGISTER_OP = 0, + IORING_RESTRICTION_SQE_OP = 1, + IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, + IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3, + IORING_RESTRICTION_LAST = 4, +}; + +struct io_uring_getevents_arg { + __u64 sigmask; + __u32 sigmask_sz; + __u32 pad; + __u64 ts; +}; + +struct io_uring_file_index_range { + __u32 off; + __u32 len; + __u64 resv; +}; + +struct io_overflow_cqe { + struct list_head list; + struct io_uring_cqe cqe; +}; + +struct trace_event_raw_io_uring_create { + struct trace_entry ent; + int fd; + void *ctx; + u32 sq_entries; + u32 cq_entries; + u32 flags; + char __data[0]; +}; + +struct trace_event_raw_io_uring_register { + struct trace_entry ent; + void *ctx; + unsigned int opcode; + unsigned int nr_files; + unsigned int nr_bufs; + long int ret; + char __data[0]; +}; + +struct trace_event_raw_io_uring_file_get { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + int fd; + char __data[0]; +}; + +struct trace_event_raw_io_uring_queue_async_work { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + u8 opcode; + unsigned int flags; + struct io_wq_work *work; + int rw; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_defer { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int data; + u8 opcode; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_link { + struct trace_entry ent; + void *ctx; + void *req; + void *target_req; + char __data[0]; +}; + +struct trace_event_raw_io_uring_cqring_wait { + struct trace_entry ent; + void *ctx; + int min_events; + char __data[0]; +}; + +struct trace_event_raw_io_uring_fail_link { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + void *link; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_complete { + struct trace_entry ent; + void *ctx; + void *req; + u64 user_data; + int res; + unsigned int cflags; + u64 extra1; + u64 extra2; + char __data[0]; +}; + +struct trace_event_raw_io_uring_submit_sqe { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + u32 flags; + bool force_nonblock; + bool sq_thread; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_poll_arm { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + int mask; + int events; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_task_add { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + int mask; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_req_failed { + struct trace_entry ent; + void *ctx; + void *req; + long long unsigned int user_data; + u8 opcode; + u8 flags; + u8 ioprio; + u64 off; + u64 addr; + u32 len; + u32 op_flags; + u16 buf_index; + u16 personality; + u32 file_index; + u64 pad1; + u64 addr3; + int error; + u32 __data_loc_op_str; + char __data[0]; +}; + +struct trace_event_raw_io_uring_cqe_overflow { + struct trace_entry ent; + void *ctx; + long long unsigned int user_data; + s32 res; + u32 cflags; + void *ocqe; + char __data[0]; +}; + +struct trace_event_raw_io_uring_task_work_run { + struct trace_entry ent; + void *tctx; + unsigned int count; + unsigned int loops; + char __data[0]; +}; + +struct trace_event_raw_io_uring_short_write { + struct trace_entry ent; + void *ctx; + u64 fpos; + u64 wanted; + u64 got; + char __data[0]; +}; + +struct trace_event_raw_io_uring_local_work_run { + struct trace_entry ent; + void *ctx; + int count; + unsigned int loops; + char __data[0]; +}; + +struct trace_event_data_offsets_io_uring_create {}; + +struct trace_event_data_offsets_io_uring_register {}; + +struct trace_event_data_offsets_io_uring_file_get {}; + +struct trace_event_data_offsets_io_uring_queue_async_work { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_defer { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_link {}; + +struct trace_event_data_offsets_io_uring_cqring_wait {}; + +struct trace_event_data_offsets_io_uring_fail_link { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_complete {}; + +struct trace_event_data_offsets_io_uring_submit_sqe { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_poll_arm { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_task_add { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_req_failed { + u32 op_str; +}; + +struct trace_event_data_offsets_io_uring_cqe_overflow {}; + +struct trace_event_data_offsets_io_uring_task_work_run {}; + +struct trace_event_data_offsets_io_uring_short_write {}; + +struct trace_event_data_offsets_io_uring_local_work_run {}; + +typedef void (*btf_trace_io_uring_create)(void *, int, void *, u32, u32, u32); + +typedef void (*btf_trace_io_uring_register)(void *, void *, unsigned int, unsigned int, unsigned int, long int); + +typedef void (*btf_trace_io_uring_file_get)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_queue_async_work)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_defer)(void *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_link)(void *, struct io_kiocb *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_cqring_wait)(void *, void *, int); + +typedef void (*btf_trace_io_uring_fail_link)(void *, struct io_kiocb *, struct io_kiocb *); + +typedef void (*btf_trace_io_uring_complete)(void *, void *, void *, u64, int, unsigned int, u64, u64); + +typedef void (*btf_trace_io_uring_submit_sqe)(void *, struct io_kiocb *, bool); + +typedef void (*btf_trace_io_uring_poll_arm)(void *, struct io_kiocb *, int, int); + +typedef void (*btf_trace_io_uring_task_add)(void *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_req_failed)(void *, const struct io_uring_sqe *, struct io_kiocb *, int); + +typedef void (*btf_trace_io_uring_cqe_overflow)(void *, void *, long long unsigned int, s32, u32, void *); + +typedef void (*btf_trace_io_uring_task_work_run)(void *, void *, unsigned int, unsigned int); + +typedef void (*btf_trace_io_uring_short_write)(void *, void *, u64, u64, u64); + +typedef void (*btf_trace_io_uring_local_work_run)(void *, void *, int, unsigned int); + +enum { + IORING_RSRC_FILE = 0, + IORING_RSRC_BUFFER = 1, +}; + +enum { + IO_CHECK_CQ_OVERFLOW_BIT = 0, + IO_CHECK_CQ_DROPPED_BIT = 1, +}; + +enum { + IO_EVENTFD_OP_SIGNAL_BIT = 0, + IO_EVENTFD_OP_FREE_BIT = 1, +}; + +struct io_defer_entry { + struct list_head list; + struct io_kiocb *req; + u32 seq; +}; + +struct io_wait_queue { + struct wait_queue_entry wq; + struct io_ring_ctx *ctx; + unsigned int cq_tail; + unsigned int nr_timeouts; +}; + +struct io_tctx_exit { + struct callback_head task_work; + struct completion completion; + struct io_ring_ctx *ctx; +}; + +struct io_task_cancel { + struct task_struct *task; + bool all; +}; + +struct creds; + +struct ip6_fraglist_iter { + struct ipv6hdr *tmp_hdr; + struct sk_buff *frag; + int offset; + unsigned int hlen; + __be32 frag_id; + u8 nexthdr; +}; + +struct ip6_frag_state { + u8 *prevhdr; + unsigned int hlen; + unsigned int mtu; + unsigned int left; + int offset; + int ptr; + int hroom; + int troom; + __be32 frag_id; + u8 nexthdr; +}; + +struct ip6_rt_info { + struct in6_addr daddr; + struct in6_addr saddr; + u_int32_t mark; +}; + +struct nf_ipv6_ops { + void (*route_input)(struct sk_buff *); + int (*fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *)); + int (*reroute)(struct sk_buff *, const struct nf_queue_entry *); +}; + +struct br_input_skb_cb { + struct net_device *brdev; + u16 frag_max_size; + u8 proxyarp_replied: 1; + u8 src_port_isolated: 1; +}; + +struct nf_bridge_frag_data; + +struct xdp_diag_req { + __u8 sdiag_family; + __u8 sdiag_protocol; + __u16 pad; + __u32 xdiag_ino; + __u32 xdiag_show; + __u32 xdiag_cookie[2]; +}; + +struct xdp_diag_msg { + __u8 xdiag_family; + __u8 xdiag_type; + __u16 pad; + __u32 xdiag_ino; + __u32 xdiag_cookie[2]; +}; + +enum { + XDP_DIAG_NONE = 0, + XDP_DIAG_INFO = 1, + XDP_DIAG_UID = 2, + XDP_DIAG_RX_RING = 3, + XDP_DIAG_TX_RING = 4, + XDP_DIAG_UMEM = 5, + XDP_DIAG_UMEM_FILL_RING = 6, + XDP_DIAG_UMEM_COMPLETION_RING = 7, + XDP_DIAG_MEMINFO = 8, + XDP_DIAG_STATS = 9, + __XDP_DIAG_MAX = 10, +}; + +struct xdp_diag_info { + __u32 ifindex; + __u32 queue_id; +}; + +struct xdp_diag_ring { + __u32 entries; +}; + +struct xdp_diag_umem { + __u64 size; + __u32 id; + __u32 num_pages; + __u32 chunk_size; + __u32 headroom; + __u32 ifindex; + __u32 queue_id; + __u32 flags; + __u32 refs; +}; + +struct xdp_diag_stats { + __u64 n_rx_dropped; + __u64 n_rx_invalid; + __u64 n_rx_full; + __u64 n_fill_ring_empty; + __u64 n_tx_invalid; + __u64 n_tx_ring_empty; +}; + +struct trans_pgd_info { + void * (*trans_alloc_page)(void *); + void *trans_alloc_arg; +}; + +struct trace_bprintk_fmt { + struct list_head list; + const char *fmt; +}; + +enum sgp_type { + SGP_READ = 0, + SGP_NOALLOC = 1, + SGP_CACHE = 2, + SGP_WRITE = 3, + SGP_FALLOC = 4, +}; + +enum scan_result { + SCAN_FAIL = 0, + SCAN_SUCCEED = 1, + SCAN_PMD_NULL = 2, + SCAN_PMD_NONE = 3, + SCAN_PMD_MAPPED = 4, + SCAN_EXCEED_NONE_PTE = 5, + SCAN_EXCEED_SWAP_PTE = 6, + SCAN_EXCEED_SHARED_PTE = 7, + SCAN_PTE_NON_PRESENT = 8, + SCAN_PTE_UFFD_WP = 9, + SCAN_PTE_MAPPED_HUGEPAGE = 10, + SCAN_PAGE_RO = 11, + SCAN_LACK_REFERENCED_PAGE = 12, + SCAN_PAGE_NULL = 13, + SCAN_SCAN_ABORT = 14, + SCAN_PAGE_COUNT = 15, + SCAN_PAGE_LRU = 16, + SCAN_PAGE_LOCK = 17, + SCAN_PAGE_ANON = 18, + SCAN_PAGE_COMPOUND = 19, + SCAN_ANY_PROCESS = 20, + SCAN_VMA_NULL = 21, + SCAN_VMA_CHECK = 22, + SCAN_ADDRESS_RANGE = 23, + SCAN_DEL_PAGE_LRU = 24, + SCAN_ALLOC_HUGE_PAGE_FAIL = 25, + SCAN_CGROUP_CHARGE_FAIL = 26, + SCAN_TRUNCATED = 27, + SCAN_PAGE_HAS_PRIVATE = 28, +}; + +struct trace_event_raw_mm_khugepaged_scan_pmd { + struct trace_entry ent; + struct mm_struct *mm; + long unsigned int pfn; + bool writable; + int referenced; + int none_or_zero; + int status; + int unmapped; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page { + struct trace_entry ent; + struct mm_struct *mm; + int isolated; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_isolate { + struct trace_entry ent; + long unsigned int pfn; + int none_or_zero; + int referenced; + bool writable; + int status; + char __data[0]; +}; + +struct trace_event_raw_mm_collapse_huge_page_swapin { + struct trace_entry ent; + struct mm_struct *mm; + int swapped_in; + int referenced; + int ret; + char __data[0]; +}; + +struct trace_event_raw_mm_khugepaged_scan_file { + struct trace_entry ent; + struct mm_struct *mm; + long unsigned int pfn; + u32 __data_loc_filename; + int present; + int swap; + int result; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_khugepaged_scan_pmd {}; + +struct trace_event_data_offsets_mm_collapse_huge_page {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_isolate {}; + +struct trace_event_data_offsets_mm_collapse_huge_page_swapin {}; + +struct trace_event_data_offsets_mm_khugepaged_scan_file { + u32 filename; +}; + +typedef void (*btf_trace_mm_khugepaged_scan_pmd)(void *, struct mm_struct *, struct page *, bool, int, int, int, int); + +typedef void (*btf_trace_mm_collapse_huge_page)(void *, struct mm_struct *, int, int); + +typedef void (*btf_trace_mm_collapse_huge_page_isolate)(void *, struct page *, int, int, bool, int); + +typedef void (*btf_trace_mm_collapse_huge_page_swapin)(void *, struct mm_struct *, int, int, int); + +typedef void (*btf_trace_mm_khugepaged_scan_file)(void *, struct mm_struct *, struct page *, struct file *, int, int, int); + +struct collapse_control { + bool is_khugepaged; + u32 node_load[64]; + nodemask_t alloc_nmask; +}; + +struct khugepaged_mm_slot { + struct mm_slot slot; + int nr_pte_mapped_thp; + long unsigned int pte_mapped_thp[8]; +}; + +struct khugepaged_scan { + struct list_head mm_head; + struct khugepaged_mm_slot *mm_slot; + long unsigned int address; +}; + +struct sg_pool { + size_t size; + char *name; + struct kmem_cache *slab; + mempool_t *pool; +}; + +struct fb_cmap_user { + __u32 start; + __u32 len; + __u16 *red; + __u16 *green; + __u16 *blue; + __u16 *transp; +}; + +struct execute_work { + struct work_struct work; +}; + +struct timer_rand_state { + long unsigned int last_time; + long int last_delta; + long int last_delta2; +}; + +enum chacha_constants { + CHACHA_CONSTANT_EXPA = 1634760805, + CHACHA_CONSTANT_ND_3 = 857760878, + CHACHA_CONSTANT_2_BY = 2036477234, + CHACHA_CONSTANT_TE_K = 1797285236, +}; + +enum blake2s_iv { + BLAKE2S_IV0 = 1779033703, + BLAKE2S_IV1 = 3144134277, + BLAKE2S_IV2 = 1013904242, + BLAKE2S_IV3 = 2773480762, + BLAKE2S_IV4 = 1359893119, + BLAKE2S_IV5 = 2600822924, + BLAKE2S_IV6 = 528734635, + BLAKE2S_IV7 = 1541459225, +}; + +enum { + CRNG_EMPTY = 0, + CRNG_EARLY = 1, + CRNG_READY = 2, +}; + +enum { + CRNG_RESEED_START_INTERVAL = 1000, + CRNG_RESEED_INTERVAL = 60000, +}; + +struct crng { + u8 key[32]; + long unsigned int generation; + local_lock_t lock; +}; + +struct batch_u8 { + u8 entropy[96]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +struct batch_u16 { + u16 entropy[48]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +struct batch_u32 { + u32 entropy[24]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +struct batch_u64 { + u64 entropy[12]; + local_lock_t lock; + long unsigned int generation; + unsigned int position; +}; + +enum { + POOL_BITS = 256, + POOL_READY_BITS = 256, + POOL_EARLY_BITS = 128, +}; + +struct fast_pool { + long unsigned int pool[4]; + long unsigned int last; + unsigned int count; + struct timer_list mix; +}; + +struct entropy_timer_state { + long unsigned int entropy; + struct timer_list timer; + atomic_t samples; + unsigned int samples_per_bit; +}; + +enum { + NUM_TRIAL_SAMPLES = 8192, + MAX_SAMPLES_PER_BIT = 66, +}; + +enum { + MIX_INFLIGHT = 2147483648, +}; + +struct trackpoint_data { + u8 variant_id; + u8 firmware_id; + u8 sensitivity; + u8 speed; + u8 inertia; + u8 reach; + u8 draghys; + u8 mindrag; + u8 thresh; + u8 upthresh; + u8 ztime; + u8 jenks; + u8 drift_time; + bool press_to_select; + bool skipback; + bool ext_dev; +}; + +struct trackpoint_attr_data { + size_t field_offset; + u8 command; + u8 mask; + bool inverted; + u8 power_on_default; +}; + +struct zpff_device { + struct hid_report *report; +}; + +struct unix_skb_parms { + struct pid *pid; + kuid_t uid; + kgid_t gid; + struct scm_fp_list *fp; + u32 secid; + u32 consumed; +}; + +struct group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +}; + +struct group_filter { + union { + struct { + __u32 gf_interface_aux; + struct __kernel_sockaddr_storage gf_group_aux; + __u32 gf_fmode_aux; + __u32 gf_numsrc_aux; + struct __kernel_sockaddr_storage gf_slist[1]; + }; + struct { + __u32 gf_interface; + struct __kernel_sockaddr_storage gf_group; + __u32 gf_fmode; + __u32 gf_numsrc; + struct __kernel_sockaddr_storage gf_slist_flex[0]; + }; + }; +}; + +struct mld_msg { + struct icmp6hdr mld_hdr; + struct in6_addr mld_mca; +}; + +struct mld2_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + struct in6_addr grec_mca; + struct in6_addr grec_src[0]; +}; + +struct mld2_report { + struct icmp6hdr mld2r_hdr; + struct mld2_grec mld2r_grec[0]; +}; + +struct mld2_query { + struct icmp6hdr mld2q_hdr; + struct in6_addr mld2q_mca; + __u8 mld2q_qrv: 3; + __u8 mld2q_suppress: 1; + __u8 mld2q_resv2: 4; + __u8 mld2q_qqic; + __be16 mld2q_nsrcs; + struct in6_addr mld2q_srcs[0]; +}; + +struct igmp6_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; +}; + +struct igmp6_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct inet6_dev *idev; + struct ifmcaddr6 *im; +}; + +enum { + EVENT_TRIGGER_FL_PROBE = 1, +}; + +struct event_trigger_ops; + +struct event_command; + +struct event_trigger_data { + long unsigned int count; + int ref; + int flags; + struct event_trigger_ops *ops; + struct event_command *cmd_ops; + struct event_filter *filter; + char *filter_str; + void *private_data; + bool paused; + bool paused_tmp; + struct list_head list; + char *name; + struct list_head named_list; + struct event_trigger_data *named_data; +}; + +struct event_trigger_ops { + void (*trigger)(struct event_trigger_data *, struct trace_buffer *, void *, struct ring_buffer_event *); + int (*init)(struct event_trigger_data *); + void (*free)(struct event_trigger_data *); + int (*print)(struct seq_file *, struct event_trigger_data *); +}; + +struct event_command { + struct list_head list; + char *name; + enum event_trigger_type trigger_type; + int flags; + int (*parse)(struct event_command *, struct trace_event_file *, char *, char *, char *); + int (*reg)(char *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg)(char *, struct event_trigger_data *, struct trace_event_file *); + void (*unreg_all)(struct trace_event_file *); + int (*set_filter)(char *, struct event_trigger_data *, struct trace_event_file *); + struct event_trigger_ops * (*get_trigger_ops)(char *, char *); +}; + +struct enable_trigger_data { + struct trace_event_file *file; + bool enable; + bool hist; +}; + +enum event_command_flags { + EVENT_CMD_FL_POST_TRIGGER = 1, + EVENT_CMD_FL_NEEDS_REC = 2, +}; + +struct fstrim_range { + __u64 start; + __u64 len; + __u64 minlen; +}; + +struct ext4_allocation_request { + struct inode *inode; + unsigned int len; + ext4_lblk_t logical; + ext4_lblk_t lleft; + ext4_lblk_t lright; + ext4_fsblk_t goal; + ext4_fsblk_t pleft; + ext4_fsblk_t pright; + unsigned int flags; +}; + +struct ext4_locality_group { + struct mutex lg_mutex; + struct list_head lg_prealloc_list[10]; + spinlock_t lg_prealloc_lock; +}; + +struct ext4_free_data { + struct list_head efd_list; + struct rb_node efd_node; + ext4_group_t efd_group; + ext4_grpblk_t efd_start_cluster; + ext4_grpblk_t efd_count; + tid_t efd_tid; +}; + +struct ext4_prealloc_space { + struct list_head pa_inode_list; + struct list_head pa_group_list; + union { + struct list_head pa_tmp_list; + struct callback_head pa_rcu; + } u; + spinlock_t pa_lock; + atomic_t pa_count; + unsigned int pa_deleted; + ext4_fsblk_t pa_pstart; + ext4_lblk_t pa_lstart; + ext4_grpblk_t pa_len; + ext4_grpblk_t pa_free; + short unsigned int pa_type; + spinlock_t *pa_obj_lock; + struct inode *pa_inode; +}; + +enum { + MB_INODE_PA = 0, + MB_GROUP_PA = 1, +}; + +struct ext4_free_extent { + ext4_lblk_t fe_logical; + ext4_grpblk_t fe_start; + ext4_group_t fe_group; + ext4_grpblk_t fe_len; +}; + +struct ext4_allocation_context { + struct inode *ac_inode; + struct super_block *ac_sb; + struct ext4_free_extent ac_o_ex; + struct ext4_free_extent ac_g_ex; + struct ext4_free_extent ac_b_ex; + struct ext4_free_extent ac_f_ex; + __u32 ac_groups_considered; + __u32 ac_flags; + __u16 ac_groups_scanned; + __u16 ac_groups_linear_remaining; + __u16 ac_found; + __u16 ac_tail; + __u16 ac_buddy; + __u8 ac_status; + __u8 ac_criteria; + __u8 ac_2order; + __u8 ac_op; + struct page *ac_bitmap_page; + struct page *ac_buddy_page; + struct ext4_prealloc_space *ac_pa; + struct ext4_locality_group *ac_lg; +}; + +struct ext4_buddy { + struct page *bd_buddy_page; + void *bd_buddy; + struct page *bd_bitmap_page; + void *bd_bitmap; + struct ext4_group_info *bd_info; + struct super_block *bd_sb; + __u16 bd_blkbits; + ext4_group_t bd_group; +}; + +typedef int (*ext4_mballoc_query_range_fn)(struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t, void *); + +struct sg { + struct ext4_group_info info; + ext4_grpblk_t counters[18]; +}; + +struct attribute_container { + struct list_head node; + struct klist containers; + struct class *class; + const struct attribute_group *grp; + struct device_attribute **attrs; + int (*match)(struct attribute_container *, struct device *); + long unsigned int flags; +}; + +struct transport_container; + +struct transport_class { + struct class class; + int (*setup)(struct transport_container *, struct device *, struct device *); + int (*configure)(struct transport_container *, struct device *, struct device *); + int (*remove)(struct transport_container *, struct device *, struct device *); +}; + +struct transport_container { + struct attribute_container ac; + const struct attribute_group *statistics; +}; + +struct anon_transport_class { + struct transport_class tclass; + struct attribute_container container; +}; + +enum { + OD_NORMAL_SAMPLE = 0, + OD_SUB_SAMPLE = 1, +}; + +struct od_ops { + unsigned int (*powersave_bias_target)(struct cpufreq_policy *, unsigned int, unsigned int); +}; + +struct od_policy_dbs_info { + struct policy_dbs_info policy_dbs; + unsigned int freq_lo; + unsigned int freq_lo_delay_us; + unsigned int freq_hi_delay_us; + unsigned int sample_type: 1; +}; + +struct od_dbs_tuners { + unsigned int powersave_bias; +}; + +struct debug_reply_data { + struct ethnl_reply_data base; + u32 msg_mask; +}; + +struct ip6_ra_chain { + struct ip6_ra_chain *next; + struct sock *sk; + int sel; + void (*destructor)(struct sock *); +}; + +enum { + GP_IDLE = 0, + GP_ENTER = 1, + GP_PASSED = 2, + GP_EXIT = 3, + GP_REPLAY = 4, +}; + +enum rsapubkey_actions { + ACT_rsa_get_e___2 = 0, + ACT_rsa_get_n___2 = 1, + NR__rsapubkey_actions = 2, +}; + +struct pkcs7_parse_context { + struct pkcs7_message *msg; + struct pkcs7_signed_info *sinfo; + struct pkcs7_signed_info **ppsinfo; + struct x509_certificate *certs; + struct x509_certificate **ppcerts; + long unsigned int data; + enum OID last_oid; + unsigned int x509_index; + unsigned int sinfo_index; + const void *raw_serial; + unsigned int raw_serial_size; + unsigned int raw_issuer_size; + const void *raw_issuer; + const void *raw_skid; + unsigned int raw_skid_size; + bool expect_skid; +}; + +struct acpi_table_cdat { + u32 length; + u8 revision; + u8 checksum; + u8 reserved[6]; + u32 sequence; +}; + +struct virtio_pci_common_cfg { + __le32 device_feature_select; + __le32 device_feature; + __le32 guest_feature_select; + __le32 guest_feature; + __le16 msix_config; + __le16 num_queues; + __u8 device_status; + __u8 config_generation; + __le16 queue_select; + __le16 queue_size; + __le16 queue_msix_vector; + __le16 queue_enable; + __le16 queue_notify_off; + __le32 queue_desc_lo; + __le32 queue_desc_hi; + __le32 queue_avail_lo; + __le32 queue_avail_hi; + __le32 queue_used_lo; + __le32 queue_used_hi; +}; + +struct virtio_pci_modern_common_cfg { + struct virtio_pci_common_cfg cfg; + __le16 queue_notify_data; + __le16 queue_reset; +}; + +struct virtio_pci_modern_device { + struct pci_dev *pci_dev; + struct virtio_pci_common_cfg *common; + void *device; + void *notify_base; + resource_size_t notify_pa; + u8 *isr; + size_t notify_len; + size_t device_len; + int notify_map_cap; + u32 notify_offset_multiplier; + int modern_bars; + struct virtio_device_id id; +}; + +struct hid_item { + unsigned int format; + __u8 size; + __u8 type; + __u8 tag; + union { + __u8 u8; + __s8 s8; + __u16 u16; + __s16 s16; + __u32 u32; + __s32 s32; + __u8 *longdata; + } data; +}; + +struct hid_global { + unsigned int usage_page; + __s32 logical_minimum; + __s32 logical_maximum; + __s32 physical_minimum; + __s32 physical_maximum; + __s32 unit_exponent; + unsigned int unit; + unsigned int report_id; + unsigned int report_size; + unsigned int report_count; +}; + +struct hid_local { + unsigned int usage[12288]; + u8 usage_size[12288]; + unsigned int collection_index[12288]; + unsigned int usage_index; + unsigned int usage_minimum; + unsigned int delimiter_depth; + unsigned int delimiter_branch; +}; + +struct hid_parser { + struct hid_global global; + struct hid_global global_stack[4]; + unsigned int global_stack_ptr; + struct hid_local local; + unsigned int *collection_stack; + unsigned int collection_stack_ptr; + unsigned int collection_stack_size; + struct hid_device *device; + unsigned int scan_flags; +}; + +struct hiddev { + int minor; + int exist; + int open; + struct mutex existancelock; + wait_queue_head_t wait; + struct hid_device *hid; + struct list_head list; + spinlock_t list_lock; + bool initialized; +}; + +struct hidraw { + unsigned int minor; + int exist; + int open; + wait_queue_head_t wait; + struct hid_device *hid; + struct device *dev; + spinlock_t list_lock; + struct list_head list; +}; + +struct hid_dynid { + struct list_head list; + struct hid_device_id id; +}; + +enum { + ETHTOOL_A_BITSET_BIT_UNSPEC = 0, + ETHTOOL_A_BITSET_BIT_INDEX = 1, + ETHTOOL_A_BITSET_BIT_NAME = 2, + ETHTOOL_A_BITSET_BIT_VALUE = 3, + __ETHTOOL_A_BITSET_BIT_CNT = 4, + ETHTOOL_A_BITSET_BIT_MAX = 3, +}; + +enum { + ETHTOOL_A_BITSET_BITS_UNSPEC = 0, + ETHTOOL_A_BITSET_BITS_BIT = 1, + __ETHTOOL_A_BITSET_BITS_CNT = 2, + ETHTOOL_A_BITSET_BITS_MAX = 1, +}; + +enum { + ETHTOOL_A_BITSET_UNSPEC = 0, + ETHTOOL_A_BITSET_NOMASK = 1, + ETHTOOL_A_BITSET_SIZE = 2, + ETHTOOL_A_BITSET_BITS = 3, + ETHTOOL_A_BITSET_VALUE = 4, + ETHTOOL_A_BITSET_MASK = 5, + __ETHTOOL_A_BITSET_CNT = 6, + ETHTOOL_A_BITSET_MAX = 5, +}; + +struct perf_pmu_events_attr { + struct device_attribute attr; + u64 id; + const char *event_str; +}; + +struct pmu_probe_info { + unsigned int cpuid; + unsigned int mask; + armpmu_init_fn init; +}; + +struct clock_read_data { + u64 epoch_ns; + u64 epoch_cyc; + u64 sched_clock_mask; + u64 (*read_sched_clock)(); + u32 mult; + u32 shift; +}; + +struct armv8pmu_probe_info { + struct arm_pmu *pmu; + bool present; +}; + +enum pci_p2pdma_map_type { + PCI_P2PDMA_MAP_UNKNOWN = 0, + PCI_P2PDMA_MAP_NOT_SUPPORTED = 1, + PCI_P2PDMA_MAP_BUS_ADDR = 2, + PCI_P2PDMA_MAP_THRU_HOST_BRIDGE = 3, +}; + +struct pci_p2pdma_map_state { + struct dev_pagemap *pgmap; + int map; + u64 bus_off; +}; + +enum { + TRACE_NOP_OPT_ACCEPT = 1, + TRACE_NOP_OPT_REFUSE = 2, +}; + +enum { + HUGETLB_SHMFS_INODE = 1, + HUGETLB_ANONHUGE_INODE = 2, +}; + +struct hugetlbfs_inode_info { + struct shared_policy policy; + struct inode vfs_inode; + unsigned int seals; +}; + +struct simple_transaction_argresp { + ssize_t size; + char data[0]; +}; + +struct simple_attr { + int (*get)(void *, u64 *); + int (*set)(void *, u64); + char get_buf[24]; + char set_buf[24]; + void *data; + const char *fmt; + struct mutex mutex; +}; + +typedef __kernel_mode_t mode_t; + +struct orlov_stats { + __u64 free_clusters; + __u32 free_inodes; + __u32 used_dirs; +}; + +struct resource_win { + struct resource res; + resource_size_t offset; +}; + +struct irq_override_cmp { + const struct dmi_system_id *system; + unsigned char irq; + unsigned char triggering; + unsigned char polarity; + unsigned char shareable; + bool override; +}; + +struct res_proc_context { + struct list_head *list; + int (*preproc)(struct acpi_resource *, void *); + void *preproc_data; + int count; + int error; +}; + +typedef enum { + ACPI_TRACE_AML_METHOD = 0, + ACPI_TRACE_AML_OPCODE = 1, + ACPI_TRACE_AML_REGION = 2, +} acpi_trace_event_type; + +enum amd_chipset_gen { + NOT_AMD_CHIPSET = 0, + AMD_CHIPSET_SB600 = 1, + AMD_CHIPSET_SB700 = 2, + AMD_CHIPSET_SB800 = 3, + AMD_CHIPSET_HUDSON2 = 4, + AMD_CHIPSET_BOLTON = 5, + AMD_CHIPSET_YANGTZE = 6, + AMD_CHIPSET_TAISHAN = 7, + AMD_CHIPSET_UNKNOWN = 8, +}; + +struct amd_chipset_type { + enum amd_chipset_gen gen; + u8 rev; +}; + +struct amd_chipset_info { + struct pci_dev *nb_dev; + struct pci_dev *smbus_dev; + int nb_type; + struct amd_chipset_type sb_type; + int isoc_reqs; + int probe_count; + bool need_pll_quirk; +}; + +enum nf_ct_sysctl_index { + NF_SYSCTL_CT_MAX = 0, + NF_SYSCTL_CT_COUNT = 1, + NF_SYSCTL_CT_BUCKETS = 2, + NF_SYSCTL_CT_CHECKSUM = 3, + NF_SYSCTL_CT_LOG_INVALID = 4, + NF_SYSCTL_CT_EXPECT_MAX = 5, + NF_SYSCTL_CT_ACCT = 6, + NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC = 7, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_SENT = 8, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_RECV = 9, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_ESTABLISHED = 10, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_FIN_WAIT = 11, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE_WAIT = 12, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_LAST_ACK = 13, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_TIME_WAIT = 14, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE = 15, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_RETRANS = 16, + NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_UNACK = 17, + NF_SYSCTL_CT_PROTO_TCP_LOOSE = 18, + NF_SYSCTL_CT_PROTO_TCP_LIBERAL = 19, + NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST = 20, + NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS = 21, + NF_SYSCTL_CT_PROTO_TIMEOUT_UDP = 22, + NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM = 23, + NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP = 24, + NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6 = 25, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_CLOSED = 26, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_WAIT = 27, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_ECHOED = 28, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_ESTABLISHED = 29, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_SENT = 30, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_RECD = 31, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_ACK_SENT = 32, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_HEARTBEAT_SENT = 33, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_HEARTBEAT_ACKED = 34, + NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_DATA_SENT = 35, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_REQUEST = 36, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_RESPOND = 37, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_PARTOPEN = 38, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_OPEN = 39, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSEREQ = 40, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSING = 41, + NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_TIMEWAIT = 42, + NF_SYSCTL_CT_PROTO_DCCP_LOOSE = 43, + NF_SYSCTL_CT_LWTUNNEL = 44, + __NF_SYSCTL_CT_LAST_SYSCTL = 45, +}; + +struct ifaddrmsg { + __u8 ifa_family; + __u8 ifa_prefixlen; + __u8 ifa_flags; + __u8 ifa_scope; + __u32 ifa_index; +}; + +enum { + IFA_UNSPEC = 0, + IFA_ADDRESS = 1, + IFA_LOCAL = 2, + IFA_LABEL = 3, + IFA_BROADCAST = 4, + IFA_ANYCAST = 5, + IFA_CACHEINFO = 6, + IFA_MULTICAST = 7, + IFA_FLAGS = 8, + IFA_RT_PRIORITY = 9, + IFA_TARGET_NETNSID = 10, + IFA_PROTO = 11, + __IFA_MAX = 12, +}; + +struct ifa_cacheinfo { + __u32 ifa_prefered; + __u32 ifa_valid; + __u32 cstamp; + __u32 tstamp; +}; + +enum { + IFLA_INET_UNSPEC = 0, + IFLA_INET_CONF = 1, + __IFLA_INET_MAX = 2, +}; + +struct in_validator_info { + __be32 ivi_addr; + struct in_device *ivi_dev; + struct netlink_ext_ack *extack; +}; + +struct inet_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; +}; + +struct devinet_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table devinet_vars[34]; +}; + +typedef __u32 Elf32_Addr; + +typedef __u16 Elf32_Half; + +typedef __u32 Elf32_Off; + +struct elf32_hdr { + unsigned char e_ident[16]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +}; + +typedef struct elf32_hdr Elf32_Ehdr; + +struct elf32_phdr { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +}; + +typedef struct elf32_phdr Elf32_Phdr; + +typedef struct elf64_phdr Elf64_Phdr; + +typedef struct elf32_note Elf32_Nhdr; + +struct vm_unmapped_area_info { + long unsigned int flags; + long unsigned int length; + long unsigned int low_limit; + long unsigned int high_limit; + long unsigned int align_mask; + long unsigned int align_offset; +}; + +struct trace_event_raw_vm_unmapped_area { + struct trace_entry ent; + long unsigned int addr; + long unsigned int total_vm; + long unsigned int flags; + long unsigned int length; + long unsigned int low_limit; + long unsigned int high_limit; + long unsigned int align_mask; + long unsigned int align_offset; + char __data[0]; +}; + +struct trace_event_raw_vma_mas_szero { + struct trace_entry ent; + struct maple_tree *mt; + long unsigned int start; + long unsigned int end; + char __data[0]; +}; + +struct trace_event_raw_vma_store { + struct trace_entry ent; + struct maple_tree *mt; + struct vm_area_struct *vma; + long unsigned int vm_start; + long unsigned int vm_end; + char __data[0]; +}; + +struct trace_event_raw_exit_mmap { + struct trace_entry ent; + struct mm_struct *mm; + struct maple_tree *mt; + char __data[0]; +}; + +struct trace_event_data_offsets_vm_unmapped_area {}; + +struct trace_event_data_offsets_vma_mas_szero {}; + +struct trace_event_data_offsets_vma_store {}; + +struct trace_event_data_offsets_exit_mmap {}; + +typedef void (*btf_trace_vm_unmapped_area)(void *, long unsigned int, struct vm_unmapped_area_info *); + +typedef void (*btf_trace_vma_mas_szero)(void *, struct maple_tree *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_vma_store)(void *, struct maple_tree *, struct vm_area_struct *); + +typedef void (*btf_trace_exit_mmap)(void *, struct mm_struct *); + +enum ima_fs_flags { + IMA_FS_BUSY = 0, +}; + +struct xxhash64_tfm_ctx { + u64 seed; +}; + +struct xxhash64_desc_ctx { + struct xxh64_state xxhstate; +}; + +struct _gpt_header { + __le64 signature; + __le32 revision; + __le32 header_size; + __le32 header_crc32; + __le32 reserved1; + __le64 my_lba; + __le64 alternate_lba; + __le64 first_usable_lba; + __le64 last_usable_lba; + efi_guid_t disk_guid; + __le64 partition_entry_lba; + __le32 num_partition_entries; + __le32 sizeof_partition_entry; + __le32 partition_entry_array_crc32; +} __attribute__((packed)); + +typedef struct _gpt_header gpt_header; + +struct _gpt_entry_attributes { + u64 required_to_function: 1; + u64 reserved: 47; + u64 type_guid_specific: 16; +}; + +typedef struct _gpt_entry_attributes gpt_entry_attributes; + +struct _gpt_entry { + efi_guid_t partition_type_guid; + efi_guid_t unique_partition_guid; + __le64 starting_lba; + __le64 ending_lba; + gpt_entry_attributes attributes; + __le16 partition_name[36]; +}; + +typedef struct _gpt_entry gpt_entry; + +struct _gpt_mbr_record { + u8 boot_indicator; + u8 start_head; + u8 start_sector; + u8 start_track; + u8 os_type; + u8 end_head; + u8 end_sector; + u8 end_track; + __le32 starting_lba; + __le32 size_in_lba; +}; + +typedef struct _gpt_mbr_record gpt_mbr_record; + +struct _legacy_mbr { + u8 boot_code[440]; + __le32 unique_mbr_signature; + __le16 unknown; + gpt_mbr_record partition_record[4]; + __le16 signature; +} __attribute__((packed)); + +typedef struct _legacy_mbr legacy_mbr; + +struct dmt_videomode { + u32 dmt_id; + u32 std_2byte_code; + u32 cvt_3byte_code; + const struct fb_videomode *mode; +}; + +struct acpi_fadt_info { + const char *name; + u16 address64; + u16 address32; + u16 length; + u8 default_length; + u8 flags; +}; + +struct acpi_fadt_pm_info { + struct acpi_generic_address *target; + u16 source; + u8 register_num; +}; + +struct virtio_balloon_config { + __le32 num_pages; + __le32 actual; + union { + __le32 free_page_hint_cmd_id; + __le32 free_page_report_cmd_id; + }; + __le32 poison_val; +}; + +struct virtio_balloon_stat { + __virtio16 tag; + __virtio64 val; +} __attribute__((packed)); + +struct balloon_dev_info { + long unsigned int isolated_pages; + spinlock_t pages_lock; + struct list_head pages; + int (*migratepage)(struct balloon_dev_info *, struct page *, struct page *, enum migrate_mode); +}; + +enum virtio_balloon_vq { + VIRTIO_BALLOON_VQ_INFLATE = 0, + VIRTIO_BALLOON_VQ_DEFLATE = 1, + VIRTIO_BALLOON_VQ_STATS = 2, + VIRTIO_BALLOON_VQ_FREE_PAGE = 3, + VIRTIO_BALLOON_VQ_REPORTING = 4, + VIRTIO_BALLOON_VQ_MAX = 5, +}; + +enum virtio_balloon_config_read { + VIRTIO_BALLOON_CONFIG_READ_CMD_ID = 0, +}; + +struct virtio_balloon { + struct virtio_device *vdev; + struct virtqueue *inflate_vq; + struct virtqueue *deflate_vq; + struct virtqueue *stats_vq; + struct virtqueue *free_page_vq; + struct workqueue_struct *balloon_wq; + struct work_struct report_free_page_work; + struct work_struct update_balloon_stats_work; + struct work_struct update_balloon_size_work; + spinlock_t stop_update_lock; + bool stop_update; + long: 56; + long unsigned int config_read_bitmap; + struct list_head free_page_list; + spinlock_t free_page_list_lock; + long unsigned int num_free_page_blocks; + u32 cmd_id_received_cache; + __virtio32 cmd_id_active; + __virtio32 cmd_id_stop; + int: 32; + wait_queue_head_t acked; + unsigned int num_pages; + int: 32; + struct balloon_dev_info vb_dev_info; + struct mutex balloon_lock; + unsigned int num_pfns; + __virtio32 pfns[256]; + struct virtio_balloon_stat stats[10]; + struct shrinker shrinker; + struct notifier_block oom_nb; + struct virtqueue *reporting_vq; + struct page_reporting_dev_info pr_dev_info; +} __attribute__((packed)); + +enum { + BOND_OPTFLAG_NOSLAVES = 1, + BOND_OPTFLAG_IFDOWN = 2, + BOND_OPTFLAG_RAWVAL = 4, +}; + +enum { + BOND_VALFLAG_DEFAULT = 1, + BOND_VALFLAG_MIN = 2, + BOND_VALFLAG_MAX = 4, +}; + +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; + int ipv6mr_ifindex; +}; + +struct group_req { + __u32 gr_interface; + struct __kernel_sockaddr_storage gr_group; +}; + +struct ip6_mtuinfo { + struct sockaddr_in6 ip6m_addr; + __u32 ip6m_mtu; +}; + +struct compat_group_req { + __u32 gr_interface; + struct __kernel_sockaddr_storage gr_group; +} __attribute__((packed)); + +struct compat_group_source_req { + __u32 gsr_interface; + struct __kernel_sockaddr_storage gsr_group; + struct __kernel_sockaddr_storage gsr_source; +} __attribute__((packed)); + +struct compat_group_filter { + union { + struct { + __u32 gf_interface_aux; + struct __kernel_sockaddr_storage gf_group_aux; + __u32 gf_fmode_aux; + __u32 gf_numsrc_aux; + struct __kernel_sockaddr_storage gf_slist[1]; + } __attribute__((packed)); + struct { + __u32 gf_interface; + struct __kernel_sockaddr_storage gf_group; + __u32 gf_fmode; + __u32 gf_numsrc; + struct __kernel_sockaddr_storage gf_slist_flex[0]; + } __attribute__((packed)); + }; +} __attribute__((packed)); + +enum probe_insn { + INSN_REJECTED = 0, + INSN_GOOD_NO_SLOT = 1, + INSN_GOOD = 2, +}; + +struct audit_aux_data { + struct audit_aux_data *next; + int type; +}; + +struct audit_chunk; + +struct audit_tree_refs { + struct audit_tree_refs *next; + struct audit_chunk *c[31]; +}; + +struct audit_aux_data_pids { + struct audit_aux_data d; + pid_t target_pid[16]; + kuid_t target_auid[16]; + kuid_t target_uid[16]; + unsigned int target_sessionid[16]; + u32 target_sid[16]; + char target_comm[256]; + int pid_count; +}; + +struct audit_aux_data_bprm_fcaps { + struct audit_aux_data d; + struct audit_cap_data fcap; + unsigned int fcap_ver; + struct audit_cap_data old_pcap; + struct audit_cap_data new_pcap; +}; + +struct audit_nfcfgop_tab { + enum audit_nfcfgop op; + const char *s; +}; + +struct rand_data { + __u64 data; + __u64 old_data; + __u64 prev_time; + __u64 last_delta; + __s64 last_delta2; + unsigned int osr; + unsigned char *mem; + unsigned int memlocation; + unsigned int memblocks; + unsigned int memblocksize; + unsigned int memaccessloops; + int rct_count; + unsigned int apt_observations; + unsigned int apt_count; + unsigned int apt_base; + unsigned int apt_base_set: 1; + unsigned int health_failure: 1; +}; + +struct RigidDiskBlock { + __u32 rdb_ID; + __be32 rdb_SummedLongs; + __s32 rdb_ChkSum; + __u32 rdb_HostID; + __be32 rdb_BlockBytes; + __u32 rdb_Flags; + __u32 rdb_BadBlockList; + __be32 rdb_PartitionList; + __u32 rdb_FileSysHeaderList; + __u32 rdb_DriveInit; + __u32 rdb_Reserved1[6]; + __u32 rdb_Cylinders; + __u32 rdb_Sectors; + __u32 rdb_Heads; + __u32 rdb_Interleave; + __u32 rdb_Park; + __u32 rdb_Reserved2[3]; + __u32 rdb_WritePreComp; + __u32 rdb_ReducedWrite; + __u32 rdb_StepRate; + __u32 rdb_Reserved3[5]; + __u32 rdb_RDBBlocksLo; + __u32 rdb_RDBBlocksHi; + __u32 rdb_LoCylinder; + __u32 rdb_HiCylinder; + __u32 rdb_CylBlocks; + __u32 rdb_AutoParkSeconds; + __u32 rdb_HighRDSKBlock; + __u32 rdb_Reserved4; + char rdb_DiskVendor[8]; + char rdb_DiskProduct[16]; + char rdb_DiskRevision[4]; + char rdb_ControllerVendor[8]; + char rdb_ControllerProduct[16]; + char rdb_ControllerRevision[4]; + __u32 rdb_Reserved5[10]; +}; + +struct PartitionBlock { + __be32 pb_ID; + __be32 pb_SummedLongs; + __s32 pb_ChkSum; + __u32 pb_HostID; + __be32 pb_Next; + __u32 pb_Flags; + __u32 pb_Reserved1[2]; + __u32 pb_DevFlags; + __u8 pb_DriveName[32]; + __u32 pb_Reserved2[15]; + __be32 pb_Environment[17]; + __u32 pb_EReserved[15]; +}; + +struct walk_rcec_data { + struct pci_dev *rcec; + int (*user_callback)(struct pci_dev *, void *); + void *user_data; +}; + +struct acpi_lpat { + int temp; + int raw; +}; + +struct acpi_lpat_conversion_table { + struct acpi_lpat *lpat; + int lpat_count; +}; + +struct tty_audit_buf { + struct mutex mutex; + dev_t dev; + unsigned int icanon: 1; + size_t valid; + unsigned char *data; +}; + +struct learning_pkt { + u8 mac_dst[6]; + u8 mac_src[6]; + __be16 type; + u8 padding[46]; +}; + +struct arp_pkt { + __be16 hw_addr_space; + __be16 prot_addr_space; + u8 hw_addr_len; + u8 prot_addr_len; + __be16 op_code; + u8 mac_src[6]; + __be32 ip_src; + u8 mac_dst[6]; + __be32 ip_dst; +} __attribute__((packed)); + +struct alb_walk_data { + struct bonding *bond; + struct slave *slave; + const u8 *mac_addr; + bool strict_match; +}; + +enum efi_secureboot_mode { + efi_secureboot_mode_unset = 0, + efi_secureboot_mode_unknown = 1, + efi_secureboot_mode_disabled = 2, + efi_secureboot_mode_enabled = 3, +}; + +struct exit_boot_struct { + struct efi_boot_memmap *boot_memmap; + efi_memory_desc_t *runtime_map; + int runtime_entry_count; + void *new_fdt_addr; +}; + +enum aarch64_insn_special_register { + AARCH64_INSN_SPCLREG_SPSR_EL1 = 49664, + AARCH64_INSN_SPCLREG_ELR_EL1 = 49665, + AARCH64_INSN_SPCLREG_SP_EL0 = 49672, + AARCH64_INSN_SPCLREG_SPSEL = 49680, + AARCH64_INSN_SPCLREG_CURRENTEL = 49682, + AARCH64_INSN_SPCLREG_DAIF = 55825, + AARCH64_INSN_SPCLREG_NZCV = 55824, + AARCH64_INSN_SPCLREG_FPCR = 55840, + AARCH64_INSN_SPCLREG_DSPSR_EL0 = 55848, + AARCH64_INSN_SPCLREG_DLR_EL0 = 55849, + AARCH64_INSN_SPCLREG_SPSR_EL2 = 57856, + AARCH64_INSN_SPCLREG_ELR_EL2 = 57857, + AARCH64_INSN_SPCLREG_SP_EL1 = 57864, + AARCH64_INSN_SPCLREG_SPSR_INQ = 57880, + AARCH64_INSN_SPCLREG_SPSR_ABT = 57881, + AARCH64_INSN_SPCLREG_SPSR_UND = 57882, + AARCH64_INSN_SPCLREG_SPSR_FIQ = 57883, + AARCH64_INSN_SPCLREG_SPSR_EL3 = 61952, + AARCH64_INSN_SPCLREG_ELR_EL3 = 61953, + AARCH64_INSN_SPCLREG_SP_EL2 = 61968, +}; + +enum perf_event_task_context { + perf_invalid_context = -1, + perf_hw_context = 0, + perf_sw_context = 1, + perf_nr_task_contexts = 2, +}; + +struct bp_slots_histogram { + atomic_t *count; +}; + +struct bp_cpuinfo { + unsigned int cpu_pinned; + struct bp_slots_histogram tsk_pinned; +}; + +struct acpi_table_tpm2 { + struct acpi_table_header header; + u16 platform_class; + u16 reserved; + u64 control_address; + u32 start_method; +} __attribute__((packed)); + +struct acpi_tpm2_phy { + u8 start_method_specific[12]; + u32 log_area_minimum_length; + u64 log_area_start_address; +}; + +enum bios_platform_class { + BIOS_CLIENT = 0, + BIOS_SERVER = 1, +}; + +struct client_hdr { + u32 log_max_len; + u64 log_start_addr; +} __attribute__((packed)); + +struct server_hdr { + u16 reserved; + u64 log_max_len; + u64 log_start_addr; +} __attribute__((packed)); + +struct acpi_tcpa { + struct acpi_table_header hdr; + u16 platform_class; + union { + struct client_hdr client; + struct server_hdr server; + }; +} __attribute__((packed)); + +struct quirks_list_struct { + struct hid_device_id hid_bl_item; + struct list_head node; +}; + +enum qdisc_class_ops_flags { + QDISC_CLASS_OPS_DOIT_UNLOCKED = 1, +}; + +typedef void tcf_chain_head_change_t(struct tcf_proto *, void *); + +struct mini_Qdisc_pair { + struct mini_Qdisc miniq1; + struct mini_Qdisc miniq2; + struct mini_Qdisc **p_miniq; +}; + +struct tcf_block_ext_info { + enum flow_block_binder_type binder_type; + tcf_chain_head_change_t *chain_head_change; + void *chain_head_change_priv; + u32 block_index; +}; + +struct ingress_sched_data { + struct tcf_block *block; + struct tcf_block_ext_info block_info; + struct mini_Qdisc_pair miniqp; +}; + +struct clsact_sched_data { + struct tcf_block *ingress_block; + struct tcf_block *egress_block; + struct tcf_block_ext_info ingress_block_info; + struct tcf_block_ext_info egress_block_info; + struct mini_Qdisc_pair miniqp_ingress; + struct mini_Qdisc_pair miniqp_egress; +}; + +enum { + XT_CONNMARK_SET = 0, + XT_CONNMARK_SAVE = 1, + XT_CONNMARK_RESTORE = 2, +}; + +enum { + D_SHIFT_LEFT = 0, + D_SHIFT_RIGHT = 1, +}; + +struct xt_connmark_tginfo1 { + __u32 ctmark; + __u32 ctmask; + __u32 nfmask; + __u8 mode; +}; + +struct xt_connmark_tginfo2 { + __u32 ctmark; + __u32 ctmask; + __u32 nfmask; + __u8 shift_dir; + __u8 shift_bits; + __u8 mode; +}; + +struct xt_connmark_mtinfo1 { + __u32 mark; + __u32 mask; + __u8 invert; +}; + +enum { + KERNEL_PARAM_OPS_FL_NOARG = 1, +}; + +struct param_attribute { + struct module_attribute mattr; + const struct kernel_param *param; +}; + +struct module_param_attrs { + unsigned int num; + struct attribute_group grp; + struct param_attribute attrs[0]; +}; + +struct kmalloced_param { + struct list_head list; + char val[0]; +}; + +struct platform_suspend_ops { + int (*valid)(suspend_state_t); + int (*begin)(suspend_state_t); + int (*prepare)(); + int (*prepare_late)(); + int (*enter)(suspend_state_t); + void (*wake)(); + void (*finish)(); + bool (*suspend_again)(); + void (*end)(); + void (*recover)(); +}; + +struct platform_s2idle_ops { + int (*begin)(); + int (*prepare)(); + int (*prepare_late)(); + void (*check)(); + bool (*wake)(); + void (*restore_early)(); + void (*restore)(); + void (*end)(); +}; + +enum s2idle_states { + S2IDLE_STATE_NONE = 0, + S2IDLE_STATE_ENTER = 1, + S2IDLE_STATE_WAKE = 2, +}; + +enum { + TEST_NONE = 0, + TEST_CORE = 1, + TEST_CPUS = 2, + TEST_PLATFORM = 3, + TEST_DEVICES = 4, + TEST_FREEZER = 5, + __TEST_AFTER_LAST = 6, +}; + +struct jbd2_journal_block_tail { + __be32 t_checksum; +}; + +struct trace_event_raw_jbd2_checkpoint { + struct trace_entry ent; + dev_t dev; + int result; + char __data[0]; +}; + +struct trace_event_raw_jbd2_commit { + struct trace_entry ent; + dev_t dev; + char sync_commit; + tid_t transaction; + char __data[0]; +}; + +struct trace_event_raw_jbd2_end_commit { + struct trace_entry ent; + dev_t dev; + char sync_commit; + tid_t transaction; + tid_t head; + char __data[0]; +}; + +struct trace_event_raw_jbd2_submit_inode_data { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_start_class { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned int type; + unsigned int line_no; + int requested_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_extend { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned int type; + unsigned int line_no; + int buffer_credits; + int requested_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_handle_stats { + struct trace_entry ent; + dev_t dev; + tid_t tid; + unsigned int type; + unsigned int line_no; + int interval; + int sync; + int requested_blocks; + int dirtied_blocks; + char __data[0]; +}; + +struct trace_event_raw_jbd2_run_stats { + struct trace_entry ent; + dev_t dev; + tid_t tid; + long unsigned int wait; + long unsigned int request_delay; + long unsigned int running; + long unsigned int locked; + long unsigned int flushing; + long unsigned int logging; + __u32 handle_count; + __u32 blocks; + __u32 blocks_logged; + char __data[0]; +}; + +struct trace_event_raw_jbd2_checkpoint_stats { + struct trace_entry ent; + dev_t dev; + tid_t tid; + long unsigned int chp_time; + __u32 forced_to_close; + __u32 written; + __u32 dropped; + char __data[0]; +}; + +struct trace_event_raw_jbd2_update_log_tail { + struct trace_entry ent; + dev_t dev; + tid_t tail_sequence; + tid_t first_tid; + long unsigned int block_nr; + long unsigned int freed; + char __data[0]; +}; + +struct trace_event_raw_jbd2_write_superblock { + struct trace_entry ent; + dev_t dev; + blk_opf_t write_flags; + char __data[0]; +}; + +struct trace_event_raw_jbd2_lock_buffer_stall { + struct trace_entry ent; + dev_t dev; + long unsigned int stall_ms; + char __data[0]; +}; + +struct trace_event_raw_jbd2_journal_shrink { + struct trace_entry ent; + dev_t dev; + long unsigned int nr_to_scan; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_jbd2_shrink_scan_exit { + struct trace_entry ent; + dev_t dev; + long unsigned int nr_to_scan; + long unsigned int nr_shrunk; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_jbd2_shrink_checkpoint_list { + struct trace_entry ent; + dev_t dev; + tid_t first_tid; + tid_t tid; + tid_t last_tid; + long unsigned int nr_freed; + long unsigned int nr_scanned; + tid_t next_tid; + char __data[0]; +}; + +struct trace_event_data_offsets_jbd2_checkpoint {}; + +struct trace_event_data_offsets_jbd2_commit {}; + +struct trace_event_data_offsets_jbd2_end_commit {}; + +struct trace_event_data_offsets_jbd2_submit_inode_data {}; + +struct trace_event_data_offsets_jbd2_handle_start_class {}; + +struct trace_event_data_offsets_jbd2_handle_extend {}; + +struct trace_event_data_offsets_jbd2_handle_stats {}; + +struct trace_event_data_offsets_jbd2_run_stats {}; + +struct trace_event_data_offsets_jbd2_checkpoint_stats {}; + +struct trace_event_data_offsets_jbd2_update_log_tail {}; + +struct trace_event_data_offsets_jbd2_write_superblock {}; + +struct trace_event_data_offsets_jbd2_lock_buffer_stall {}; + +struct trace_event_data_offsets_jbd2_journal_shrink {}; + +struct trace_event_data_offsets_jbd2_shrink_scan_exit {}; + +struct trace_event_data_offsets_jbd2_shrink_checkpoint_list {}; + +typedef void (*btf_trace_jbd2_checkpoint)(void *, journal_t *, int); + +typedef void (*btf_trace_jbd2_start_commit)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_locking)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_flushing)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_commit_logging)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_drop_transaction)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_end_commit)(void *, journal_t *, transaction_t *); + +typedef void (*btf_trace_jbd2_submit_inode_data)(void *, struct inode *); + +typedef void (*btf_trace_jbd2_handle_start)(void *, dev_t, tid_t, unsigned int, unsigned int, int); + +typedef void (*btf_trace_jbd2_handle_restart)(void *, dev_t, tid_t, unsigned int, unsigned int, int); + +typedef void (*btf_trace_jbd2_handle_extend)(void *, dev_t, tid_t, unsigned int, unsigned int, int, int); + +typedef void (*btf_trace_jbd2_handle_stats)(void *, dev_t, tid_t, unsigned int, unsigned int, int, int, int, int); + +typedef void (*btf_trace_jbd2_run_stats)(void *, dev_t, tid_t, struct transaction_run_stats_s *); + +typedef void (*btf_trace_jbd2_checkpoint_stats)(void *, dev_t, tid_t, struct transaction_chp_stats_s *); + +typedef void (*btf_trace_jbd2_update_log_tail)(void *, journal_t *, tid_t, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_write_superblock)(void *, journal_t *, blk_opf_t); + +typedef void (*btf_trace_jbd2_lock_buffer_stall)(void *, dev_t, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_count)(void *, journal_t *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_scan_enter)(void *, journal_t *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_scan_exit)(void *, journal_t *, long unsigned int, long unsigned int, long unsigned int); + +typedef void (*btf_trace_jbd2_shrink_checkpoint_list)(void *, journal_t *, tid_t, tid_t, tid_t, long unsigned int, long unsigned int, tid_t); + +struct jbd2_stats_proc_session { + journal_t *journal; + struct transaction_stats_s *stats; + int start; + int max; +}; + +struct netdev_notifier_offload_xstats_rd; + +struct netdev_notifier_offload_xstats_ru; + +struct netdev_notifier_offload_xstats_info { + struct netdev_notifier_info info; + enum netdev_offload_xstats_type type; + union { + struct netdev_notifier_offload_xstats_rd *report_delta; + struct netdev_notifier_offload_xstats_ru *report_used; + }; +}; + +struct nsim_dev_hwstats_netdev { + struct list_head list; + struct net_device *netdev; + struct rtnl_hw_stats64 stats; + bool enabled; + bool fail_enable; +}; + +enum nsim_dev_hwstats_do { + NSIM_DEV_HWSTATS_DO_DISABLE = 0, + NSIM_DEV_HWSTATS_DO_ENABLE = 1, + NSIM_DEV_HWSTATS_DO_FAIL = 2, +}; + +struct nsim_dev_hwstats_fops { + const struct file_operations fops; + enum nsim_dev_hwstats_do action; + enum netdev_offload_xstats_type type; +}; + +struct dim_sample { + ktime_t time; + u32 pkt_ctr; + u32 byte_ctr; + u16 event_ctr; + u32 comp_ctr; +}; + +struct dim_stats { + int ppms; + int bpms; + int epms; + int cpms; + int cpe_ratio; +}; + +struct dim { + u8 state; + struct dim_stats prev_stats; + struct dim_sample start_sample; + struct dim_sample measuring_sample; + struct work_struct work; + void *priv; + u8 profile_ix; + u8 mode; + u8 tune_state; + u8 steps_right; + u8 steps_left; + u8 tired; +}; + +enum rdma_nl_counter_mode { + RDMA_COUNTER_MODE_NONE = 0, + RDMA_COUNTER_MODE_AUTO = 1, + RDMA_COUNTER_MODE_MANUAL = 2, + RDMA_COUNTER_MODE_MAX = 3, +}; + +enum rdma_nl_counter_mask { + RDMA_COUNTER_MASK_QP_TYPE = 1, + RDMA_COUNTER_MASK_PID = 2, +}; + +enum rdma_restrack_type { + RDMA_RESTRACK_PD = 0, + RDMA_RESTRACK_CQ = 1, + RDMA_RESTRACK_QP = 2, + RDMA_RESTRACK_CM_ID = 3, + RDMA_RESTRACK_MR = 4, + RDMA_RESTRACK_CTX = 5, + RDMA_RESTRACK_COUNTER = 6, + RDMA_RESTRACK_SRQ = 7, + RDMA_RESTRACK_MAX = 8, +}; + +struct rdma_restrack_entry { + bool valid; + u8 no_track: 1; + struct kref kref; + struct completion comp; + struct task_struct *task; + const char *kern_name; + enum rdma_restrack_type type; + bool user; + u32 id; +}; + +struct rdma_link_ops { + struct list_head list; + const char *type; + int (*newlink)(const char *, struct net_device *); +}; + +struct auto_mode_param { + int qp_type; +}; + +struct rdma_counter_mode { + enum rdma_nl_counter_mode mode; + enum rdma_nl_counter_mask mask; + struct auto_mode_param param; +}; + +struct rdma_hw_stats; + +struct rdma_port_counter { + struct rdma_counter_mode mode; + struct rdma_hw_stats *hstats; + unsigned int num_counters; + struct mutex lock; +}; + +struct rdma_stat_desc; + +struct rdma_hw_stats { + struct mutex lock; + long unsigned int timestamp; + long unsigned int lifespan; + const struct rdma_stat_desc *descs; + long unsigned int *is_disabled; + int num_counters; + u64 value[0]; +}; + +struct rdma_counter { + struct rdma_restrack_entry res; + struct ib_device *device; + uint32_t id; + struct kref kref; + struct rdma_counter_mode mode; + struct mutex lock; + struct rdma_hw_stats *stats; + u32 port; +}; + +enum rdma_driver_id { + RDMA_DRIVER_UNKNOWN = 0, + RDMA_DRIVER_MLX5 = 1, + RDMA_DRIVER_MLX4 = 2, + RDMA_DRIVER_CXGB3 = 3, + RDMA_DRIVER_CXGB4 = 4, + RDMA_DRIVER_MTHCA = 5, + RDMA_DRIVER_BNXT_RE = 6, + RDMA_DRIVER_OCRDMA = 7, + RDMA_DRIVER_NES = 8, + RDMA_DRIVER_I40IW = 9, + RDMA_DRIVER_IRDMA = 9, + RDMA_DRIVER_VMW_PVRDMA = 10, + RDMA_DRIVER_QEDR = 11, + RDMA_DRIVER_HNS = 12, + RDMA_DRIVER_USNIC = 13, + RDMA_DRIVER_RXE = 14, + RDMA_DRIVER_HFI1 = 15, + RDMA_DRIVER_QIB = 16, + RDMA_DRIVER_EFA = 17, + RDMA_DRIVER_SIW = 18, + RDMA_DRIVER_ERDMA = 19, +}; + +enum ib_cq_notify_flags { + IB_CQ_SOLICITED = 1, + IB_CQ_NEXT_COMP = 2, + IB_CQ_SOLICITED_MASK = 3, + IB_CQ_REPORT_MISSED_EVENTS = 4, +}; + +struct ib_mad; + +enum rdma_link_layer { + IB_LINK_LAYER_UNSPECIFIED = 0, + IB_LINK_LAYER_INFINIBAND = 1, + IB_LINK_LAYER_ETHERNET = 2, +}; + +enum rdma_netdev_t { + RDMA_NETDEV_OPA_VNIC = 0, + RDMA_NETDEV_IPOIB = 1, +}; + +enum ib_srq_attr_mask { + IB_SRQ_MAX_WR = 1, + IB_SRQ_LIMIT = 2, +}; + +enum ib_mr_type { + IB_MR_TYPE_MEM_REG = 0, + IB_MR_TYPE_SG_GAPS = 1, + IB_MR_TYPE_DM = 2, + IB_MR_TYPE_USER = 3, + IB_MR_TYPE_DMA = 4, + IB_MR_TYPE_INTEGRITY = 5, +}; + +enum ib_uverbs_advise_mr_advice { + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH = 0, + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE = 1, + IB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT = 2, +}; + +struct uverbs_attr_bundle; + +struct rdma_cm_id; + +struct iw_cm_id; + +struct iw_cm_conn_param; + +struct ib_qp; + +struct ib_send_wr; + +struct ib_recv_wr; + +struct ib_cq; + +struct ib_wc; + +struct ib_srq; + +struct ib_grh; + +struct ib_device_attr; + +struct ib_udata; + +struct ib_device_modify; + +struct ib_port_attr; + +struct ib_port_modify; + +struct ib_port_immutable; + +struct rdma_netdev_alloc_params; + +union ib_gid; + +struct ib_gid_attr; + +struct ib_ucontext; + +struct rdma_user_mmap_entry; + +struct ib_pd; + +struct ib_ah; + +struct rdma_ah_init_attr; + +struct rdma_ah_attr; + +struct ib_srq_init_attr; + +struct ib_srq_attr; + +struct ib_qp_init_attr; + +struct ib_qp_attr; + +struct ib_cq_init_attr; + +struct ib_mr; + +struct ib_sge; + +struct ib_mr_status; + +struct ib_mw; + +struct ib_xrcd; + +struct ib_flow; + +struct ib_flow_attr; + +struct ib_flow_action; + +struct ib_wq; + +struct ib_wq_init_attr; + +struct ib_wq_attr; + +struct ib_rwq_ind_table; + +struct ib_rwq_ind_table_init_attr; + +struct ib_dm; + +struct ib_dm_alloc_attr; + +struct ib_dm_mr_attr; + +struct ib_counters; + +struct ib_counters_read_attr; + +struct ib_device_ops { + struct module *owner; + enum rdma_driver_id driver_id; + u32 uverbs_abi_ver; + unsigned int uverbs_no_driver_id_binding: 1; + const struct attribute_group *device_group; + const struct attribute_group **port_groups; + int (*post_send)(struct ib_qp *, const struct ib_send_wr *, const struct ib_send_wr **); + int (*post_recv)(struct ib_qp *, const struct ib_recv_wr *, const struct ib_recv_wr **); + void (*drain_rq)(struct ib_qp *); + void (*drain_sq)(struct ib_qp *); + int (*poll_cq)(struct ib_cq *, int, struct ib_wc *); + int (*peek_cq)(struct ib_cq *, int); + int (*req_notify_cq)(struct ib_cq *, enum ib_cq_notify_flags); + int (*post_srq_recv)(struct ib_srq *, const struct ib_recv_wr *, const struct ib_recv_wr **); + int (*process_mad)(struct ib_device *, int, u32, const struct ib_wc *, const struct ib_grh *, const struct ib_mad *, struct ib_mad *, size_t *, u16 *); + int (*query_device)(struct ib_device *, struct ib_device_attr *, struct ib_udata *); + int (*modify_device)(struct ib_device *, int, struct ib_device_modify *); + void (*get_dev_fw_str)(struct ib_device *, char *); + const struct cpumask * (*get_vector_affinity)(struct ib_device *, int); + int (*query_port)(struct ib_device *, u32, struct ib_port_attr *); + int (*modify_port)(struct ib_device *, u32, int, struct ib_port_modify *); + int (*get_port_immutable)(struct ib_device *, u32, struct ib_port_immutable *); + enum rdma_link_layer (*get_link_layer)(struct ib_device *, u32); + struct net_device * (*get_netdev)(struct ib_device *, u32); + struct net_device * (*alloc_rdma_netdev)(struct ib_device *, u32, enum rdma_netdev_t, const char *, unsigned char, void (*)(struct net_device *)); + int (*rdma_netdev_get_params)(struct ib_device *, u32, enum rdma_netdev_t, struct rdma_netdev_alloc_params *); + int (*query_gid)(struct ib_device *, u32, int, union ib_gid *); + int (*add_gid)(const struct ib_gid_attr *, void **); + int (*del_gid)(const struct ib_gid_attr *, void **); + int (*query_pkey)(struct ib_device *, u32, u16, u16 *); + int (*alloc_ucontext)(struct ib_ucontext *, struct ib_udata *); + void (*dealloc_ucontext)(struct ib_ucontext *); + int (*mmap)(struct ib_ucontext *, struct vm_area_struct *); + void (*mmap_free)(struct rdma_user_mmap_entry *); + void (*disassociate_ucontext)(struct ib_ucontext *); + int (*alloc_pd)(struct ib_pd *, struct ib_udata *); + int (*dealloc_pd)(struct ib_pd *, struct ib_udata *); + int (*create_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); + int (*create_user_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *); + int (*modify_ah)(struct ib_ah *, struct rdma_ah_attr *); + int (*query_ah)(struct ib_ah *, struct rdma_ah_attr *); + int (*destroy_ah)(struct ib_ah *, u32); + int (*create_srq)(struct ib_srq *, struct ib_srq_init_attr *, struct ib_udata *); + int (*modify_srq)(struct ib_srq *, struct ib_srq_attr *, enum ib_srq_attr_mask, struct ib_udata *); + int (*query_srq)(struct ib_srq *, struct ib_srq_attr *); + int (*destroy_srq)(struct ib_srq *, struct ib_udata *); + int (*create_qp)(struct ib_qp *, struct ib_qp_init_attr *, struct ib_udata *); + int (*modify_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_udata *); + int (*query_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_qp_init_attr *); + int (*destroy_qp)(struct ib_qp *, struct ib_udata *); + int (*create_cq)(struct ib_cq *, const struct ib_cq_init_attr *, struct ib_udata *); + int (*modify_cq)(struct ib_cq *, u16, u16); + int (*destroy_cq)(struct ib_cq *, struct ib_udata *); + int (*resize_cq)(struct ib_cq *, int, struct ib_udata *); + struct ib_mr * (*get_dma_mr)(struct ib_pd *, int); + struct ib_mr * (*reg_user_mr)(struct ib_pd *, u64, u64, u64, int, struct ib_udata *); + struct ib_mr * (*reg_user_mr_dmabuf)(struct ib_pd *, u64, u64, u64, int, int, struct ib_udata *); + struct ib_mr * (*rereg_user_mr)(struct ib_mr *, int, u64, u64, u64, int, struct ib_pd *, struct ib_udata *); + int (*dereg_mr)(struct ib_mr *, struct ib_udata *); + struct ib_mr * (*alloc_mr)(struct ib_pd *, enum ib_mr_type, u32); + struct ib_mr * (*alloc_mr_integrity)(struct ib_pd *, u32, u32); + int (*advise_mr)(struct ib_pd *, enum ib_uverbs_advise_mr_advice, u32, struct ib_sge *, u32, struct uverbs_attr_bundle *); + int (*map_mr_sg)(struct ib_mr *, struct scatterlist *, int, unsigned int *); + int (*check_mr_status)(struct ib_mr *, u32, struct ib_mr_status *); + int (*alloc_mw)(struct ib_mw *, struct ib_udata *); + int (*dealloc_mw)(struct ib_mw *); + int (*attach_mcast)(struct ib_qp *, union ib_gid *, u16); + int (*detach_mcast)(struct ib_qp *, union ib_gid *, u16); + int (*alloc_xrcd)(struct ib_xrcd *, struct ib_udata *); + int (*dealloc_xrcd)(struct ib_xrcd *, struct ib_udata *); + struct ib_flow * (*create_flow)(struct ib_qp *, struct ib_flow_attr *, struct ib_udata *); + int (*destroy_flow)(struct ib_flow *); + int (*destroy_flow_action)(struct ib_flow_action *); + int (*set_vf_link_state)(struct ib_device *, int, u32, int); + int (*get_vf_config)(struct ib_device *, int, u32, struct ifla_vf_info *); + int (*get_vf_stats)(struct ib_device *, int, u32, struct ifla_vf_stats *); + int (*get_vf_guid)(struct ib_device *, int, u32, struct ifla_vf_guid *, struct ifla_vf_guid *); + int (*set_vf_guid)(struct ib_device *, int, u32, u64, int); + struct ib_wq * (*create_wq)(struct ib_pd *, struct ib_wq_init_attr *, struct ib_udata *); + int (*destroy_wq)(struct ib_wq *, struct ib_udata *); + int (*modify_wq)(struct ib_wq *, struct ib_wq_attr *, u32, struct ib_udata *); + int (*create_rwq_ind_table)(struct ib_rwq_ind_table *, struct ib_rwq_ind_table_init_attr *, struct ib_udata *); + int (*destroy_rwq_ind_table)(struct ib_rwq_ind_table *); + struct ib_dm * (*alloc_dm)(struct ib_device *, struct ib_ucontext *, struct ib_dm_alloc_attr *, struct uverbs_attr_bundle *); + int (*dealloc_dm)(struct ib_dm *, struct uverbs_attr_bundle *); + struct ib_mr * (*reg_dm_mr)(struct ib_pd *, struct ib_dm *, struct ib_dm_mr_attr *, struct uverbs_attr_bundle *); + int (*create_counters)(struct ib_counters *, struct uverbs_attr_bundle *); + int (*destroy_counters)(struct ib_counters *); + int (*read_counters)(struct ib_counters *, struct ib_counters_read_attr *, struct uverbs_attr_bundle *); + int (*map_mr_sg_pi)(struct ib_mr *, struct scatterlist *, int, unsigned int *, struct scatterlist *, int, unsigned int *); + struct rdma_hw_stats * (*alloc_hw_device_stats)(struct ib_device *); + struct rdma_hw_stats * (*alloc_hw_port_stats)(struct ib_device *, u32); + int (*get_hw_stats)(struct ib_device *, struct rdma_hw_stats *, u32, int); + int (*modify_hw_stat)(struct ib_device *, u32, unsigned int, bool); + int (*fill_res_mr_entry)(struct sk_buff *, struct ib_mr *); + int (*fill_res_mr_entry_raw)(struct sk_buff *, struct ib_mr *); + int (*fill_res_cq_entry)(struct sk_buff *, struct ib_cq *); + int (*fill_res_cq_entry_raw)(struct sk_buff *, struct ib_cq *); + int (*fill_res_qp_entry)(struct sk_buff *, struct ib_qp *); + int (*fill_res_qp_entry_raw)(struct sk_buff *, struct ib_qp *); + int (*fill_res_cm_id_entry)(struct sk_buff *, struct rdma_cm_id *); + int (*enable_driver)(struct ib_device *); + void (*dealloc_driver)(struct ib_device *); + void (*iw_add_ref)(struct ib_qp *); + void (*iw_rem_ref)(struct ib_qp *); + struct ib_qp * (*iw_get_qp)(struct ib_device *, int); + int (*iw_connect)(struct iw_cm_id *, struct iw_cm_conn_param *); + int (*iw_accept)(struct iw_cm_id *, struct iw_cm_conn_param *); + int (*iw_reject)(struct iw_cm_id *, const void *, u8); + int (*iw_create_listen)(struct iw_cm_id *, int); + int (*iw_destroy_listen)(struct iw_cm_id *); + int (*counter_bind_qp)(struct rdma_counter *, struct ib_qp *); + int (*counter_unbind_qp)(struct ib_qp *); + int (*counter_dealloc)(struct rdma_counter *); + struct rdma_hw_stats * (*counter_alloc_stats)(struct rdma_counter *); + int (*counter_update_stats)(struct rdma_counter *); + int (*fill_stat_mr_entry)(struct sk_buff *, struct ib_mr *); + int (*query_ucontext)(struct ib_ucontext *, struct uverbs_attr_bundle *); + int (*get_numa_node)(struct ib_device *); + size_t size_ib_ah; + size_t size_ib_counters; + size_t size_ib_cq; + size_t size_ib_mw; + size_t size_ib_pd; + size_t size_ib_qp; + size_t size_ib_rwq_ind_table; + size_t size_ib_srq; + size_t size_ib_ucontext; + size_t size_ib_xrcd; +}; + +struct ib_core_device { + struct device dev; + possible_net_t rdma_net; + struct kobject *ports_kobj; + struct list_head port_list; + struct ib_device *owner; +}; + +enum ib_atomic_cap { + IB_ATOMIC_NONE = 0, + IB_ATOMIC_HCA = 1, + IB_ATOMIC_GLOB = 2, +}; + +struct ib_odp_caps { + uint64_t general_caps; + struct { + uint32_t rc_odp_caps; + uint32_t uc_odp_caps; + uint32_t ud_odp_caps; + uint32_t xrc_odp_caps; + } per_transport_caps; +}; + +struct ib_rss_caps { + u32 supported_qpts; + u32 max_rwq_indirection_tables; + u32 max_rwq_indirection_table_size; +}; + +struct ib_tm_caps { + u32 max_rndv_hdr_size; + u32 max_num_tags; + u32 flags; + u32 max_ops; + u32 max_sge; +}; + +struct ib_cq_caps { + u16 max_cq_moderation_count; + u16 max_cq_moderation_period; +}; + +struct ib_device_attr { + u64 fw_ver; + __be64 sys_image_guid; + u64 max_mr_size; + u64 page_size_cap; + u32 vendor_id; + u32 vendor_part_id; + u32 hw_ver; + int max_qp; + int max_qp_wr; + u64 device_cap_flags; + u64 kernel_cap_flags; + int max_send_sge; + int max_recv_sge; + int max_sge_rd; + int max_cq; + int max_cqe; + int max_mr; + int max_pd; + int max_qp_rd_atom; + int max_ee_rd_atom; + int max_res_rd_atom; + int max_qp_init_rd_atom; + int max_ee_init_rd_atom; + enum ib_atomic_cap atomic_cap; + enum ib_atomic_cap masked_atomic_cap; + int max_ee; + int max_rdd; + int max_mw; + int max_raw_ipv6_qp; + int max_raw_ethy_qp; + int max_mcast_grp; + int max_mcast_qp_attach; + int max_total_mcast_qp_attach; + int max_ah; + int max_srq; + int max_srq_wr; + int max_srq_sge; + unsigned int max_fast_reg_page_list_len; + unsigned int max_pi_fast_reg_page_list_len; + u16 max_pkeys; + u8 local_ca_ack_delay; + int sig_prot_cap; + int sig_guard_cap; + struct ib_odp_caps odp_caps; + uint64_t timestamp_mask; + uint64_t hca_core_clock; + struct ib_rss_caps rss_caps; + u32 max_wq_type_rq; + u32 raw_packet_caps; + struct ib_tm_caps tm_caps; + struct ib_cq_caps cq_caps; + u64 max_dm_size; + u32 max_sgl_rd; +}; + +struct hw_stats_device_data; + +struct rdma_restrack_root; + +struct uapi_definition; + +struct ib_port_data; + +struct ib_device { + struct device *dma_device; + struct ib_device_ops ops; + char name[64]; + struct callback_head callback_head; + struct list_head event_handler_list; + struct rw_semaphore event_handler_rwsem; + spinlock_t qp_open_list_lock; + struct rw_semaphore client_data_rwsem; + struct xarray client_data; + struct mutex unregistration_lock; + rwlock_t cache_lock; + struct ib_port_data *port_data; + int num_comp_vectors; + union { + struct device dev; + struct ib_core_device coredev; + }; + const struct attribute_group *groups[4]; + u64 uverbs_cmd_mask; + char node_desc[64]; + __be64 node_guid; + u32 local_dma_lkey; + u16 is_switch: 1; + u16 kverbs_provider: 1; + u16 use_cq_dim: 1; + u8 node_type; + u32 phys_port_cnt; + struct ib_device_attr attrs; + struct hw_stats_device_data *hw_stats_data; + u32 index; + spinlock_t cq_pools_lock; + struct list_head cq_pools[3]; + struct rdma_restrack_root *res; + const struct uapi_definition *driver_def; + refcount_t refcount; + struct completion unreg_completion; + struct work_struct unregistration_work; + const struct rdma_link_ops *link_ops; + struct mutex compat_devs_mutex; + struct xarray compat_devs; + char iw_ifname[16]; + u32 iw_driver_flags; + u32 lag_flags; +}; + +enum ib_signature_type { + IB_SIG_TYPE_NONE = 0, + IB_SIG_TYPE_T10_DIF = 1, +}; + +enum ib_t10_dif_bg_type { + IB_T10DIF_CRC = 0, + IB_T10DIF_CSUM = 1, +}; + +struct ib_t10_dif_domain { + enum ib_t10_dif_bg_type bg_type; + u16 pi_interval; + u16 bg; + u16 app_tag; + u32 ref_tag; + bool ref_remap; + bool app_escape; + bool ref_escape; + u16 apptag_check_mask; +}; + +struct ib_sig_domain { + enum ib_signature_type sig_type; + union { + struct ib_t10_dif_domain dif; + } sig; +}; + +struct ib_sig_attrs { + u8 check_mask; + struct ib_sig_domain mem; + struct ib_sig_domain wire; + int meta_length; +}; + +enum ib_sig_err_type { + IB_SIG_BAD_GUARD = 0, + IB_SIG_BAD_REFTAG = 1, + IB_SIG_BAD_APPTAG = 2, +}; + +struct ib_sig_err { + enum ib_sig_err_type err_type; + u32 expected; + u32 actual; + u64 sig_err_offset; + u32 key; +}; + +union ib_gid { + u8 raw[16]; + struct { + __be64 subnet_prefix; + __be64 interface_id; + } global; +}; + +enum ib_gid_type { + IB_GID_TYPE_IB = 0, + IB_GID_TYPE_ROCE = 1, + IB_GID_TYPE_ROCE_UDP_ENCAP = 2, + IB_GID_TYPE_SIZE = 3, +}; + +struct ib_gid_attr { + struct net_device *ndev; + struct ib_device *device; + union ib_gid gid; + enum ib_gid_type gid_type; + u16 index; + u32 port_num; +}; + +struct ib_cq_init_attr { + unsigned int cqe; + u32 comp_vector; + u32 flags; +}; + +struct ib_dm_mr_attr { + u64 length; + u64 offset; + u32 access_flags; +}; + +struct ib_dm_alloc_attr { + u64 length; + u32 alignment; + u32 flags; +}; + +enum ib_mtu { + IB_MTU_256 = 1, + IB_MTU_512 = 2, + IB_MTU_1024 = 3, + IB_MTU_2048 = 4, + IB_MTU_4096 = 5, +}; + +enum ib_port_state { + IB_PORT_NOP = 0, + IB_PORT_DOWN = 1, + IB_PORT_INIT = 2, + IB_PORT_ARMED = 3, + IB_PORT_ACTIVE = 4, + IB_PORT_ACTIVE_DEFER = 5, +}; + +struct rdma_stat_desc { + const char *name; + unsigned int flags; + const void *priv; +}; + +struct ib_port_attr { + u64 subnet_prefix; + enum ib_port_state state; + enum ib_mtu max_mtu; + enum ib_mtu active_mtu; + u32 phys_mtu; + int gid_tbl_len; + unsigned int ip_gids: 1; + u32 port_cap_flags; + u32 max_msg_sz; + u32 bad_pkey_cntr; + u32 qkey_viol_cntr; + u16 pkey_tbl_len; + u32 sm_lid; + u32 lid; + u8 lmc; + u8 max_vl_num; + u8 sm_sl; + u8 subnet_timeout; + u8 init_type_reply; + u8 active_width; + u16 active_speed; + u8 phys_state; + u16 port_cap_flags2; +}; + +struct ib_device_modify { + u64 sys_image_guid; + char node_desc[64]; +}; + +struct ib_port_modify { + u32 set_port_cap_mask; + u32 clr_port_cap_mask; + u8 init_type; +}; + +enum ib_event_type { + IB_EVENT_CQ_ERR = 0, + IB_EVENT_QP_FATAL = 1, + IB_EVENT_QP_REQ_ERR = 2, + IB_EVENT_QP_ACCESS_ERR = 3, + IB_EVENT_COMM_EST = 4, + IB_EVENT_SQ_DRAINED = 5, + IB_EVENT_PATH_MIG = 6, + IB_EVENT_PATH_MIG_ERR = 7, + IB_EVENT_DEVICE_FATAL = 8, + IB_EVENT_PORT_ACTIVE = 9, + IB_EVENT_PORT_ERR = 10, + IB_EVENT_LID_CHANGE = 11, + IB_EVENT_PKEY_CHANGE = 12, + IB_EVENT_SM_CHANGE = 13, + IB_EVENT_SRQ_ERR = 14, + IB_EVENT_SRQ_LIMIT_REACHED = 15, + IB_EVENT_QP_LAST_WQE_REACHED = 16, + IB_EVENT_CLIENT_REREGISTER = 17, + IB_EVENT_GID_CHANGE = 18, + IB_EVENT_WQ_FATAL = 19, +}; + +struct ib_ucq_object; + +typedef void (*ib_comp_handler)(struct ib_cq *, void *); + +struct ib_event; + +struct ib_cq { + struct ib_device *device; + struct ib_ucq_object *uobject; + ib_comp_handler comp_handler; + void (*event_handler)(struct ib_event *, void *); + void *cq_context; + int cqe; + unsigned int cqe_used; + atomic_t usecnt; + enum ib_poll_context poll_ctx; + struct ib_wc *wc; + struct list_head pool_entry; + union { + struct irq_poll iop; + struct work_struct work; + }; + struct workqueue_struct *comp_wq; + struct dim *dim; + ktime_t timestamp; + u8 interrupt: 1; + u8 shared: 1; + unsigned int comp_vector; + struct rdma_restrack_entry res; +}; + +struct ib_uqp_object; + +enum ib_qp_type { + IB_QPT_SMI = 0, + IB_QPT_GSI = 1, + IB_QPT_RC = 2, + IB_QPT_UC = 3, + IB_QPT_UD = 4, + IB_QPT_RAW_IPV6 = 5, + IB_QPT_RAW_ETHERTYPE = 6, + IB_QPT_RAW_PACKET = 8, + IB_QPT_XRC_INI = 9, + IB_QPT_XRC_TGT = 10, + IB_QPT_MAX = 11, + IB_QPT_DRIVER = 255, + IB_QPT_RESERVED1 = 4096, + IB_QPT_RESERVED2 = 4097, + IB_QPT_RESERVED3 = 4098, + IB_QPT_RESERVED4 = 4099, + IB_QPT_RESERVED5 = 4100, + IB_QPT_RESERVED6 = 4101, + IB_QPT_RESERVED7 = 4102, + IB_QPT_RESERVED8 = 4103, + IB_QPT_RESERVED9 = 4104, + IB_QPT_RESERVED10 = 4105, +}; + +struct ib_qp_security; + +struct ib_qp { + struct ib_device *device; + struct ib_pd *pd; + struct ib_cq *send_cq; + struct ib_cq *recv_cq; + spinlock_t mr_lock; + int mrs_used; + struct list_head rdma_mrs; + struct list_head sig_mrs; + struct ib_srq *srq; + struct ib_xrcd *xrcd; + struct list_head xrcd_list; + atomic_t usecnt; + struct list_head open_list; + struct ib_qp *real_qp; + struct ib_uqp_object *uobject; + void (*event_handler)(struct ib_event *, void *); + void *qp_context; + const struct ib_gid_attr *av_sgid_attr; + const struct ib_gid_attr *alt_path_sgid_attr; + u32 qp_num; + u32 max_write_sge; + u32 max_read_sge; + enum ib_qp_type qp_type; + struct ib_rwq_ind_table *rwq_ind_tbl; + struct ib_qp_security *qp_sec; + u32 port; + bool integrity_en; + struct rdma_restrack_entry res; + struct rdma_counter *counter; +}; + +struct ib_usrq_object; + +enum ib_srq_type { + IB_SRQT_BASIC = 0, + IB_SRQT_XRC = 1, + IB_SRQT_TM = 2, +}; + +struct ib_srq { + struct ib_device *device; + struct ib_pd *pd; + struct ib_usrq_object *uobject; + void (*event_handler)(struct ib_event *, void *); + void *srq_context; + enum ib_srq_type srq_type; + atomic_t usecnt; + struct { + struct ib_cq *cq; + union { + struct { + struct ib_xrcd *xrcd; + u32 srq_num; + } xrc; + }; + } ext; + struct rdma_restrack_entry res; +}; + +struct ib_uwq_object; + +enum ib_wq_state { + IB_WQS_RESET = 0, + IB_WQS_RDY = 1, + IB_WQS_ERR = 2, +}; + +enum ib_wq_type { + IB_WQT_RQ = 0, +}; + +struct ib_wq { + struct ib_device *device; + struct ib_uwq_object *uobject; + void *wq_context; + void (*event_handler)(struct ib_event *, void *); + struct ib_pd *pd; + struct ib_cq *cq; + u32 wq_num; + enum ib_wq_state state; + enum ib_wq_type wq_type; + atomic_t usecnt; +}; + +struct ib_event { + struct ib_device *device; + union { + struct ib_cq *cq; + struct ib_qp *qp; + struct ib_srq *srq; + struct ib_wq *wq; + u32 port_num; + } element; + enum ib_event_type event; +}; + +struct ib_global_route { + const struct ib_gid_attr *sgid_attr; + union ib_gid dgid; + u32 flow_label; + u8 sgid_index; + u8 hop_limit; + u8 traffic_class; +}; + +struct ib_grh { + __be32 version_tclass_flow; + __be16 paylen; + u8 next_hdr; + u8 hop_limit; + union ib_gid sgid; + union ib_gid dgid; +}; + +struct ib_mr_status { + u32 fail_status; + struct ib_sig_err sig_err; +}; + +struct rdma_ah_init_attr { + struct rdma_ah_attr *ah_attr; + u32 flags; + struct net_device *xmit_slave; +}; + +enum rdma_ah_attr_type { + RDMA_AH_ATTR_TYPE_UNDEFINED = 0, + RDMA_AH_ATTR_TYPE_IB = 1, + RDMA_AH_ATTR_TYPE_ROCE = 2, + RDMA_AH_ATTR_TYPE_OPA = 3, +}; + +struct ib_ah_attr { + u16 dlid; + u8 src_path_bits; +}; + +struct roce_ah_attr { + u8 dmac[6]; +}; + +struct opa_ah_attr { + u32 dlid; + u8 src_path_bits; + bool make_grd; +}; + +struct rdma_ah_attr { + struct ib_global_route grh; + u8 sl; + u8 static_rate; + u32 port_num; + u8 ah_flags; + enum rdma_ah_attr_type type; + union { + struct ib_ah_attr ib; + struct roce_ah_attr roce; + struct opa_ah_attr opa; + }; +}; + +enum ib_wc_status { + IB_WC_SUCCESS = 0, + IB_WC_LOC_LEN_ERR = 1, + IB_WC_LOC_QP_OP_ERR = 2, + IB_WC_LOC_EEC_OP_ERR = 3, + IB_WC_LOC_PROT_ERR = 4, + IB_WC_WR_FLUSH_ERR = 5, + IB_WC_MW_BIND_ERR = 6, + IB_WC_BAD_RESP_ERR = 7, + IB_WC_LOC_ACCESS_ERR = 8, + IB_WC_REM_INV_REQ_ERR = 9, + IB_WC_REM_ACCESS_ERR = 10, + IB_WC_REM_OP_ERR = 11, + IB_WC_RETRY_EXC_ERR = 12, + IB_WC_RNR_RETRY_EXC_ERR = 13, + IB_WC_LOC_RDD_VIOL_ERR = 14, + IB_WC_REM_INV_RD_REQ_ERR = 15, + IB_WC_REM_ABORT_ERR = 16, + IB_WC_INV_EECN_ERR = 17, + IB_WC_INV_EEC_STATE_ERR = 18, + IB_WC_FATAL_ERR = 19, + IB_WC_RESP_TIMEOUT_ERR = 20, + IB_WC_GENERAL_ERR = 21, +}; + +enum ib_wc_opcode { + IB_WC_SEND = 0, + IB_WC_RDMA_WRITE = 1, + IB_WC_RDMA_READ = 2, + IB_WC_COMP_SWAP = 3, + IB_WC_FETCH_ADD = 4, + IB_WC_BIND_MW = 5, + IB_WC_LOCAL_INV = 6, + IB_WC_LSO = 7, + IB_WC_REG_MR = 8, + IB_WC_MASKED_COMP_SWAP = 9, + IB_WC_MASKED_FETCH_ADD = 10, + IB_WC_RECV = 128, + IB_WC_RECV_RDMA_WITH_IMM = 129, +}; + +struct ib_cqe { + void (*done)(struct ib_cq *, struct ib_wc *); +}; + +struct ib_wc { + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + enum ib_wc_status status; + enum ib_wc_opcode opcode; + u32 vendor_err; + u32 byte_len; + struct ib_qp *qp; + union { + __be32 imm_data; + u32 invalidate_rkey; + } ex; + u32 src_qp; + u32 slid; + int wc_flags; + u16 pkey_index; + u8 sl; + u8 dlid_path_bits; + u32 port_num; + u8 smac[6]; + u16 vlan_id; + u8 network_hdr_type; +}; + +struct ib_srq_attr { + u32 max_wr; + u32 max_sge; + u32 srq_limit; +}; + +struct ib_xrcd { + struct ib_device *device; + atomic_t usecnt; + struct inode *inode; + struct rw_semaphore tgt_qps_rwsem; + struct xarray tgt_qps; +}; + +struct ib_srq_init_attr { + void (*event_handler)(struct ib_event *, void *); + void *srq_context; + struct ib_srq_attr attr; + enum ib_srq_type srq_type; + struct { + struct ib_cq *cq; + union { + struct { + struct ib_xrcd *xrcd; + } xrc; + struct { + u32 max_num_tags; + } tag_matching; + }; + } ext; +}; + +struct ib_qp_cap { + u32 max_send_wr; + u32 max_recv_wr; + u32 max_send_sge; + u32 max_recv_sge; + u32 max_inline_data; + u32 max_rdma_ctxs; +}; + +enum ib_sig_type { + IB_SIGNAL_ALL_WR = 0, + IB_SIGNAL_REQ_WR = 1, +}; + +struct ib_qp_init_attr { + void (*event_handler)(struct ib_event *, void *); + void *qp_context; + struct ib_cq *send_cq; + struct ib_cq *recv_cq; + struct ib_srq *srq; + struct ib_xrcd *xrcd; + struct ib_qp_cap cap; + enum ib_sig_type sq_sig_type; + enum ib_qp_type qp_type; + u32 create_flags; + u32 port_num; + struct ib_rwq_ind_table *rwq_ind_tbl; + u32 source_qpn; +}; + +struct ib_uobject; + +struct ib_rwq_ind_table { + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; + u32 ind_tbl_num; + u32 log_ind_tbl_size; + struct ib_wq **ind_tbl; +}; + +enum ib_qp_state { + IB_QPS_RESET = 0, + IB_QPS_INIT = 1, + IB_QPS_RTR = 2, + IB_QPS_RTS = 3, + IB_QPS_SQD = 4, + IB_QPS_SQE = 5, + IB_QPS_ERR = 6, +}; + +enum ib_mig_state { + IB_MIG_MIGRATED = 0, + IB_MIG_REARM = 1, + IB_MIG_ARMED = 2, +}; + +enum ib_mw_type { + IB_MW_TYPE_1 = 1, + IB_MW_TYPE_2 = 2, +}; + +struct ib_qp_attr { + enum ib_qp_state qp_state; + enum ib_qp_state cur_qp_state; + enum ib_mtu path_mtu; + enum ib_mig_state path_mig_state; + u32 qkey; + u32 rq_psn; + u32 sq_psn; + u32 dest_qp_num; + int qp_access_flags; + struct ib_qp_cap cap; + struct rdma_ah_attr ah_attr; + struct rdma_ah_attr alt_ah_attr; + u16 pkey_index; + u16 alt_pkey_index; + u8 en_sqd_async_notify; + u8 sq_draining; + u8 max_rd_atomic; + u8 max_dest_rd_atomic; + u8 min_rnr_timer; + u32 port_num; + u8 timeout; + u8 retry_cnt; + u8 rnr_retry; + u32 alt_port_num; + u8 alt_timeout; + u32 rate_limit; + struct net_device *xmit_slave; +}; + +enum ib_wr_opcode { + IB_WR_RDMA_WRITE = 0, + IB_WR_RDMA_WRITE_WITH_IMM = 1, + IB_WR_SEND = 2, + IB_WR_SEND_WITH_IMM = 3, + IB_WR_RDMA_READ = 4, + IB_WR_ATOMIC_CMP_AND_SWP = 5, + IB_WR_ATOMIC_FETCH_AND_ADD = 6, + IB_WR_BIND_MW = 8, + IB_WR_LSO = 10, + IB_WR_SEND_WITH_INV = 9, + IB_WR_RDMA_READ_WITH_INV = 11, + IB_WR_LOCAL_INV = 7, + IB_WR_MASKED_ATOMIC_CMP_AND_SWP = 12, + IB_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13, + IB_WR_REG_MR = 32, + IB_WR_REG_MR_INTEGRITY = 33, + IB_WR_RESERVED1 = 240, + IB_WR_RESERVED2 = 241, + IB_WR_RESERVED3 = 242, + IB_WR_RESERVED4 = 243, + IB_WR_RESERVED5 = 244, + IB_WR_RESERVED6 = 245, + IB_WR_RESERVED7 = 246, + IB_WR_RESERVED8 = 247, + IB_WR_RESERVED9 = 248, + IB_WR_RESERVED10 = 249, +}; + +struct ib_sge { + u64 addr; + u32 length; + u32 lkey; +}; + +struct ib_send_wr { + struct ib_send_wr *next; + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + struct ib_sge *sg_list; + int num_sge; + enum ib_wr_opcode opcode; + int send_flags; + union { + __be32 imm_data; + u32 invalidate_rkey; + } ex; +}; + +struct ib_ah { + struct ib_device *device; + struct ib_pd *pd; + struct ib_uobject *uobject; + const struct ib_gid_attr *sgid_attr; + enum rdma_ah_attr_type type; +}; + +struct ib_mr { + struct ib_device *device; + struct ib_pd *pd; + u32 lkey; + u32 rkey; + u64 iova; + u64 length; + unsigned int page_size; + enum ib_mr_type type; + bool need_inval; + union { + struct ib_uobject *uobject; + struct list_head qp_entry; + }; + struct ib_dm *dm; + struct ib_sig_attrs *sig_attrs; + struct rdma_restrack_entry res; +}; + +struct ib_recv_wr { + struct ib_recv_wr *next; + union { + u64 wr_id; + struct ib_cqe *wr_cqe; + }; + struct ib_sge *sg_list; + int num_sge; +}; + +struct ib_rdmacg_object {}; + +struct ib_uverbs_file; + +struct ib_ucontext { + struct ib_device *device; + struct ib_uverbs_file *ufile; + struct ib_rdmacg_object cg_obj; + struct rdma_restrack_entry res; + struct xarray mmap_xa; +}; + +struct uverbs_api_object; + +struct ib_uobject { + u64 user_handle; + struct ib_uverbs_file *ufile; + struct ib_ucontext *context; + void *object; + struct list_head list; + struct ib_rdmacg_object cg_obj; + int id; + struct kref ref; + atomic_t usecnt; + struct callback_head rcu; + const struct uverbs_api_object *uapi_object; +}; + +struct ib_udata { + const void *inbuf; + void *outbuf; + size_t inlen; + size_t outlen; +}; + +struct ib_pd { + u32 local_dma_lkey; + u32 flags; + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; + u32 unsafe_global_rkey; + struct ib_mr *__internal_mr; + struct rdma_restrack_entry res; +}; + +struct ib_wq_init_attr { + void *wq_context; + enum ib_wq_type wq_type; + u32 max_wr; + u32 max_sge; + struct ib_cq *cq; + void (*event_handler)(struct ib_event *, void *); + u32 create_flags; +}; + +struct ib_wq_attr { + enum ib_wq_state wq_state; + enum ib_wq_state curr_wq_state; + u32 flags; + u32 flags_mask; +}; + +struct ib_rwq_ind_table_init_attr { + u32 log_ind_tbl_size; + struct ib_wq **ind_tbl; +}; + +enum port_pkey_state { + IB_PORT_PKEY_NOT_VALID = 0, + IB_PORT_PKEY_VALID = 1, + IB_PORT_PKEY_LISTED = 2, +}; + +struct ib_port_pkey { + enum port_pkey_state state; + u16 pkey_index; + u32 port_num; + struct list_head qp_list; + struct list_head to_error_list; + struct ib_qp_security *sec; +}; + +struct ib_ports_pkeys; + +struct ib_qp_security { + struct ib_qp *qp; + struct ib_device *dev; + struct mutex mutex; + struct ib_ports_pkeys *ports_pkeys; + struct list_head shared_qp_list; + void *security; + bool destroying; + atomic_t error_list_count; + struct completion error_complete; + int error_comps_pending; +}; + +struct ib_ports_pkeys { + struct ib_port_pkey main; + struct ib_port_pkey alt; +}; + +struct ib_dm { + struct ib_device *device; + u32 length; + u32 flags; + struct ib_uobject *uobject; + atomic_t usecnt; +}; + +struct ib_mw { + struct ib_device *device; + struct ib_pd *pd; + struct ib_uobject *uobject; + u32 rkey; + enum ib_mw_type type; +}; + +enum ib_flow_attr_type { + IB_FLOW_ATTR_NORMAL = 0, + IB_FLOW_ATTR_ALL_DEFAULT = 1, + IB_FLOW_ATTR_MC_DEFAULT = 2, + IB_FLOW_ATTR_SNIFFER = 3, +}; + +enum ib_flow_spec_type { + IB_FLOW_SPEC_ETH = 32, + IB_FLOW_SPEC_IB = 34, + IB_FLOW_SPEC_IPV4 = 48, + IB_FLOW_SPEC_IPV6 = 49, + IB_FLOW_SPEC_ESP = 52, + IB_FLOW_SPEC_TCP = 64, + IB_FLOW_SPEC_UDP = 65, + IB_FLOW_SPEC_VXLAN_TUNNEL = 80, + IB_FLOW_SPEC_GRE = 81, + IB_FLOW_SPEC_MPLS = 96, + IB_FLOW_SPEC_INNER = 256, + IB_FLOW_SPEC_ACTION_TAG = 4096, + IB_FLOW_SPEC_ACTION_DROP = 4097, + IB_FLOW_SPEC_ACTION_HANDLE = 4098, + IB_FLOW_SPEC_ACTION_COUNT = 4099, +}; + +struct ib_flow_eth_filter { + u8 dst_mac[6]; + u8 src_mac[6]; + __be16 ether_type; + __be16 vlan_tag; + u8 real_sz[0]; +}; + +struct ib_flow_spec_eth { + u32 type; + u16 size; + struct ib_flow_eth_filter val; + struct ib_flow_eth_filter mask; +}; + +struct ib_flow_ib_filter { + __be16 dlid; + __u8 sl; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ib { + u32 type; + u16 size; + struct ib_flow_ib_filter val; + struct ib_flow_ib_filter mask; +}; + +struct ib_flow_ipv4_filter { + __be32 src_ip; + __be32 dst_ip; + u8 proto; + u8 tos; + u8 ttl; + u8 flags; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ipv4 { + u32 type; + u16 size; + struct ib_flow_ipv4_filter val; + struct ib_flow_ipv4_filter mask; +}; + +struct ib_flow_ipv6_filter { + u8 src_ip[16]; + u8 dst_ip[16]; + __be32 flow_label; + u8 next_hdr; + u8 traffic_class; + u8 hop_limit; + u8 real_sz[0]; +}; + +struct ib_flow_spec_ipv6 { + u32 type; + u16 size; + struct ib_flow_ipv6_filter val; + struct ib_flow_ipv6_filter mask; +}; + +struct ib_flow_tcp_udp_filter { + __be16 dst_port; + __be16 src_port; + u8 real_sz[0]; +}; + +struct ib_flow_spec_tcp_udp { + u32 type; + u16 size; + struct ib_flow_tcp_udp_filter val; + struct ib_flow_tcp_udp_filter mask; +}; + +struct ib_flow_tunnel_filter { + __be32 tunnel_id; + u8 real_sz[0]; +}; + +struct ib_flow_spec_tunnel { + u32 type; + u16 size; + struct ib_flow_tunnel_filter val; + struct ib_flow_tunnel_filter mask; +}; + +struct ib_flow_esp_filter { + __be32 spi; + __be32 seq; + u8 real_sz[0]; +}; + +struct ib_flow_spec_esp { + u32 type; + u16 size; + struct ib_flow_esp_filter val; + struct ib_flow_esp_filter mask; +}; + +struct ib_flow_gre_filter { + __be16 c_ks_res0_ver; + __be16 protocol; + __be32 key; + u8 real_sz[0]; +}; + +struct ib_flow_spec_gre { + u32 type; + u16 size; + struct ib_flow_gre_filter val; + struct ib_flow_gre_filter mask; +}; + +struct ib_flow_mpls_filter { + __be32 tag; + u8 real_sz[0]; +}; + +struct ib_flow_spec_mpls { + u32 type; + u16 size; + struct ib_flow_mpls_filter val; + struct ib_flow_mpls_filter mask; +}; + +struct ib_flow_spec_action_tag { + enum ib_flow_spec_type type; + u16 size; + u32 tag_id; +}; + +struct ib_flow_spec_action_drop { + enum ib_flow_spec_type type; + u16 size; +}; + +struct ib_flow_spec_action_handle { + enum ib_flow_spec_type type; + u16 size; + struct ib_flow_action *act; +}; + +enum ib_flow_action_type { + IB_FLOW_ACTION_UNSPECIFIED = 0, + IB_FLOW_ACTION_ESP = 1, +}; + +struct ib_flow_action { + struct ib_device *device; + struct ib_uobject *uobject; + enum ib_flow_action_type type; + atomic_t usecnt; +}; + +struct ib_flow_spec_action_count { + enum ib_flow_spec_type type; + u16 size; + struct ib_counters *counters; +}; + +struct ib_counters { + struct ib_device *device; + struct ib_uobject *uobject; + atomic_t usecnt; +}; + +union ib_flow_spec { + struct { + u32 type; + u16 size; + }; + struct ib_flow_spec_eth eth; + struct ib_flow_spec_ib ib; + struct ib_flow_spec_ipv4 ipv4; + struct ib_flow_spec_tcp_udp tcp_udp; + struct ib_flow_spec_ipv6 ipv6; + struct ib_flow_spec_tunnel tunnel; + struct ib_flow_spec_esp esp; + struct ib_flow_spec_gre gre; + struct ib_flow_spec_mpls mpls; + struct ib_flow_spec_action_tag flow_tag; + struct ib_flow_spec_action_drop drop; + struct ib_flow_spec_action_handle action; + struct ib_flow_spec_action_count flow_count; +}; + +struct ib_flow_attr { + enum ib_flow_attr_type type; + u16 size; + u16 priority; + u32 flags; + u8 num_of_specs; + u32 port; + union ib_flow_spec flows[0]; +}; + +struct ib_flow { + struct ib_qp *qp; + struct ib_device *device; + struct ib_uobject *uobject; +}; + +struct ib_pkey_cache; + +struct ib_gid_table; + +struct ib_port_cache { + u64 subnet_prefix; + struct ib_pkey_cache *pkey; + struct ib_gid_table *gid; + u8 lmc; + enum ib_port_state port_state; +}; + +struct ib_port_immutable { + int pkey_tbl_len; + int gid_tbl_len; + u32 core_cap_flags; + u32 max_mad_size; +}; + +struct ib_port; + +struct ib_port_data { + struct ib_device *ib_dev; + struct ib_port_immutable immutable; + spinlock_t pkey_list_lock; + spinlock_t netdev_lock; + struct list_head pkey_list; + struct ib_port_cache cache; + struct net_device *netdev; + struct hlist_node ndev_hash_link; + struct rdma_port_counter port_counter; + struct ib_port *sysfs; +}; + +struct rdma_netdev_alloc_params { + size_t sizeof_priv; + unsigned int txqs; + unsigned int rxqs; + void *param; + int (*initialize_rdma_netdev)(struct ib_device *, u32, struct net_device *, void *); +}; + +struct ib_counters_read_attr { + u64 *counters_buff; + u32 ncounters; + u32 flags; +}; + +struct rdma_user_mmap_entry { + struct kref ref; + struct ib_ucontext *ucontext; + long unsigned int start_pgoff; + size_t npages; + bool driver_removed; +}; + +struct genl_dumpit_info { + const struct genl_family *family; + struct genl_split_ops op; + struct nlattr **attrs; +}; + +enum devlink_command { + DEVLINK_CMD_UNSPEC = 0, + DEVLINK_CMD_GET = 1, + DEVLINK_CMD_SET = 2, + DEVLINK_CMD_NEW = 3, + DEVLINK_CMD_DEL = 4, + DEVLINK_CMD_PORT_GET = 5, + DEVLINK_CMD_PORT_SET = 6, + DEVLINK_CMD_PORT_NEW = 7, + DEVLINK_CMD_PORT_DEL = 8, + DEVLINK_CMD_PORT_SPLIT = 9, + DEVLINK_CMD_PORT_UNSPLIT = 10, + DEVLINK_CMD_SB_GET = 11, + DEVLINK_CMD_SB_SET = 12, + DEVLINK_CMD_SB_NEW = 13, + DEVLINK_CMD_SB_DEL = 14, + DEVLINK_CMD_SB_POOL_GET = 15, + DEVLINK_CMD_SB_POOL_SET = 16, + DEVLINK_CMD_SB_POOL_NEW = 17, + DEVLINK_CMD_SB_POOL_DEL = 18, + DEVLINK_CMD_SB_PORT_POOL_GET = 19, + DEVLINK_CMD_SB_PORT_POOL_SET = 20, + DEVLINK_CMD_SB_PORT_POOL_NEW = 21, + DEVLINK_CMD_SB_PORT_POOL_DEL = 22, + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 23, + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 24, + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 25, + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 26, + DEVLINK_CMD_SB_OCC_SNAPSHOT = 27, + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 28, + DEVLINK_CMD_ESWITCH_GET = 29, + DEVLINK_CMD_ESWITCH_SET = 30, + DEVLINK_CMD_DPIPE_TABLE_GET = 31, + DEVLINK_CMD_DPIPE_ENTRIES_GET = 32, + DEVLINK_CMD_DPIPE_HEADERS_GET = 33, + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 34, + DEVLINK_CMD_RESOURCE_SET = 35, + DEVLINK_CMD_RESOURCE_DUMP = 36, + DEVLINK_CMD_RELOAD = 37, + DEVLINK_CMD_PARAM_GET = 38, + DEVLINK_CMD_PARAM_SET = 39, + DEVLINK_CMD_PARAM_NEW = 40, + DEVLINK_CMD_PARAM_DEL = 41, + DEVLINK_CMD_REGION_GET = 42, + DEVLINK_CMD_REGION_SET = 43, + DEVLINK_CMD_REGION_NEW = 44, + DEVLINK_CMD_REGION_DEL = 45, + DEVLINK_CMD_REGION_READ = 46, + DEVLINK_CMD_PORT_PARAM_GET = 47, + DEVLINK_CMD_PORT_PARAM_SET = 48, + DEVLINK_CMD_PORT_PARAM_NEW = 49, + DEVLINK_CMD_PORT_PARAM_DEL = 50, + DEVLINK_CMD_INFO_GET = 51, + DEVLINK_CMD_HEALTH_REPORTER_GET = 52, + DEVLINK_CMD_HEALTH_REPORTER_SET = 53, + DEVLINK_CMD_HEALTH_REPORTER_RECOVER = 54, + DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE = 55, + DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET = 56, + DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR = 57, + DEVLINK_CMD_FLASH_UPDATE = 58, + DEVLINK_CMD_FLASH_UPDATE_END = 59, + DEVLINK_CMD_FLASH_UPDATE_STATUS = 60, + DEVLINK_CMD_TRAP_GET = 61, + DEVLINK_CMD_TRAP_SET = 62, + DEVLINK_CMD_TRAP_NEW = 63, + DEVLINK_CMD_TRAP_DEL = 64, + DEVLINK_CMD_TRAP_GROUP_GET = 65, + DEVLINK_CMD_TRAP_GROUP_SET = 66, + DEVLINK_CMD_TRAP_GROUP_NEW = 67, + DEVLINK_CMD_TRAP_GROUP_DEL = 68, + DEVLINK_CMD_TRAP_POLICER_GET = 69, + DEVLINK_CMD_TRAP_POLICER_SET = 70, + DEVLINK_CMD_TRAP_POLICER_NEW = 71, + DEVLINK_CMD_TRAP_POLICER_DEL = 72, + DEVLINK_CMD_HEALTH_REPORTER_TEST = 73, + DEVLINK_CMD_RATE_GET = 74, + DEVLINK_CMD_RATE_SET = 75, + DEVLINK_CMD_RATE_NEW = 76, + DEVLINK_CMD_RATE_DEL = 77, + DEVLINK_CMD_LINECARD_GET = 78, + DEVLINK_CMD_LINECARD_SET = 79, + DEVLINK_CMD_LINECARD_NEW = 80, + DEVLINK_CMD_LINECARD_DEL = 81, + DEVLINK_CMD_SELFTESTS_GET = 82, + DEVLINK_CMD_SELFTESTS_RUN = 83, + __DEVLINK_CMD_MAX = 84, + DEVLINK_CMD_MAX = 83, +}; + +enum devlink_sb_pool_type { + DEVLINK_SB_POOL_TYPE_INGRESS = 0, + DEVLINK_SB_POOL_TYPE_EGRESS = 1, +}; + +enum devlink_sb_threshold_type { + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0, + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 1, +}; + +enum devlink_eswitch_mode { + DEVLINK_ESWITCH_MODE_LEGACY = 0, + DEVLINK_ESWITCH_MODE_SWITCHDEV = 1, +}; + +enum devlink_eswitch_encap_mode { + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0, + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1, +}; + +enum devlink_param_cmode { + DEVLINK_PARAM_CMODE_RUNTIME = 0, + DEVLINK_PARAM_CMODE_DRIVERINIT = 1, + DEVLINK_PARAM_CMODE_PERMANENT = 2, + __DEVLINK_PARAM_CMODE_MAX = 3, + DEVLINK_PARAM_CMODE_MAX = 2, +}; + +enum { + DEVLINK_ATTR_STATS_RX_PACKETS = 0, + DEVLINK_ATTR_STATS_RX_BYTES = 1, + DEVLINK_ATTR_STATS_RX_DROPPED = 2, + __DEVLINK_ATTR_STATS_MAX = 3, + DEVLINK_ATTR_STATS_MAX = 2, +}; + +enum { + DEVLINK_FLASH_OVERWRITE_SETTINGS_BIT = 0, + DEVLINK_FLASH_OVERWRITE_IDENTIFIERS_BIT = 1, + __DEVLINK_FLASH_OVERWRITE_MAX_BIT = 2, + DEVLINK_FLASH_OVERWRITE_MAX_BIT = 1, +}; + +enum devlink_attr_selftest_id { + DEVLINK_ATTR_SELFTEST_ID_UNSPEC = 0, + DEVLINK_ATTR_SELFTEST_ID_FLASH = 1, + __DEVLINK_ATTR_SELFTEST_ID_MAX = 2, + DEVLINK_ATTR_SELFTEST_ID_MAX = 1, +}; + +enum devlink_selftest_status { + DEVLINK_SELFTEST_STATUS_SKIP = 0, + DEVLINK_SELFTEST_STATUS_PASS = 1, + DEVLINK_SELFTEST_STATUS_FAIL = 2, +}; + +enum devlink_attr_selftest_result { + DEVLINK_ATTR_SELFTEST_RESULT_UNSPEC = 0, + DEVLINK_ATTR_SELFTEST_RESULT = 1, + DEVLINK_ATTR_SELFTEST_RESULT_ID = 2, + DEVLINK_ATTR_SELFTEST_RESULT_STATUS = 3, + __DEVLINK_ATTR_SELFTEST_RESULT_MAX = 4, + DEVLINK_ATTR_SELFTEST_RESULT_MAX = 3, +}; + +enum devlink_trap_action { + DEVLINK_TRAP_ACTION_DROP = 0, + DEVLINK_TRAP_ACTION_TRAP = 1, + DEVLINK_TRAP_ACTION_MIRROR = 2, +}; + +enum devlink_trap_type { + DEVLINK_TRAP_TYPE_DROP = 0, + DEVLINK_TRAP_TYPE_EXCEPTION = 1, + DEVLINK_TRAP_TYPE_CONTROL = 2, +}; + +enum { + DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT = 0, + DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE = 1, +}; + +enum devlink_reload_action { + DEVLINK_RELOAD_ACTION_UNSPEC = 0, + DEVLINK_RELOAD_ACTION_DRIVER_REINIT = 1, + DEVLINK_RELOAD_ACTION_FW_ACTIVATE = 2, + __DEVLINK_RELOAD_ACTION_MAX = 3, + DEVLINK_RELOAD_ACTION_MAX = 2, +}; + +enum devlink_reload_limit { + DEVLINK_RELOAD_LIMIT_UNSPEC = 0, + DEVLINK_RELOAD_LIMIT_NO_RESET = 1, + __DEVLINK_RELOAD_LIMIT_MAX = 2, + DEVLINK_RELOAD_LIMIT_MAX = 1, +}; + +enum devlink_linecard_state { + DEVLINK_LINECARD_STATE_UNSPEC = 0, + DEVLINK_LINECARD_STATE_UNPROVISIONED = 1, + DEVLINK_LINECARD_STATE_UNPROVISIONING = 2, + DEVLINK_LINECARD_STATE_PROVISIONING = 3, + DEVLINK_LINECARD_STATE_PROVISIONING_FAILED = 4, + DEVLINK_LINECARD_STATE_PROVISIONED = 5, + DEVLINK_LINECARD_STATE_ACTIVE = 6, + __DEVLINK_LINECARD_STATE_MAX = 7, + DEVLINK_LINECARD_STATE_MAX = 6, +}; + +enum devlink_attr { + DEVLINK_ATTR_UNSPEC = 0, + DEVLINK_ATTR_BUS_NAME = 1, + DEVLINK_ATTR_DEV_NAME = 2, + DEVLINK_ATTR_PORT_INDEX = 3, + DEVLINK_ATTR_PORT_TYPE = 4, + DEVLINK_ATTR_PORT_DESIRED_TYPE = 5, + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 6, + DEVLINK_ATTR_PORT_NETDEV_NAME = 7, + DEVLINK_ATTR_PORT_IBDEV_NAME = 8, + DEVLINK_ATTR_PORT_SPLIT_COUNT = 9, + DEVLINK_ATTR_PORT_SPLIT_GROUP = 10, + DEVLINK_ATTR_SB_INDEX = 11, + DEVLINK_ATTR_SB_SIZE = 12, + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 13, + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 14, + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 15, + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 16, + DEVLINK_ATTR_SB_POOL_INDEX = 17, + DEVLINK_ATTR_SB_POOL_TYPE = 18, + DEVLINK_ATTR_SB_POOL_SIZE = 19, + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 20, + DEVLINK_ATTR_SB_THRESHOLD = 21, + DEVLINK_ATTR_SB_TC_INDEX = 22, + DEVLINK_ATTR_SB_OCC_CUR = 23, + DEVLINK_ATTR_SB_OCC_MAX = 24, + DEVLINK_ATTR_ESWITCH_MODE = 25, + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 26, + DEVLINK_ATTR_DPIPE_TABLES = 27, + DEVLINK_ATTR_DPIPE_TABLE = 28, + DEVLINK_ATTR_DPIPE_TABLE_NAME = 29, + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 30, + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 31, + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 32, + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 33, + DEVLINK_ATTR_DPIPE_ENTRIES = 34, + DEVLINK_ATTR_DPIPE_ENTRY = 35, + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 36, + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 37, + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 38, + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 39, + DEVLINK_ATTR_DPIPE_MATCH = 40, + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 41, + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 42, + DEVLINK_ATTR_DPIPE_ACTION = 43, + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 44, + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 45, + DEVLINK_ATTR_DPIPE_VALUE = 46, + DEVLINK_ATTR_DPIPE_VALUE_MASK = 47, + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 48, + DEVLINK_ATTR_DPIPE_HEADERS = 49, + DEVLINK_ATTR_DPIPE_HEADER = 50, + DEVLINK_ATTR_DPIPE_HEADER_NAME = 51, + DEVLINK_ATTR_DPIPE_HEADER_ID = 52, + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 53, + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 54, + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 55, + DEVLINK_ATTR_DPIPE_FIELD = 56, + DEVLINK_ATTR_DPIPE_FIELD_NAME = 57, + DEVLINK_ATTR_DPIPE_FIELD_ID = 58, + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 59, + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 60, + DEVLINK_ATTR_PAD = 61, + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62, + DEVLINK_ATTR_RESOURCE_LIST = 63, + DEVLINK_ATTR_RESOURCE = 64, + DEVLINK_ATTR_RESOURCE_NAME = 65, + DEVLINK_ATTR_RESOURCE_ID = 66, + DEVLINK_ATTR_RESOURCE_SIZE = 67, + DEVLINK_ATTR_RESOURCE_SIZE_NEW = 68, + DEVLINK_ATTR_RESOURCE_SIZE_VALID = 69, + DEVLINK_ATTR_RESOURCE_SIZE_MIN = 70, + DEVLINK_ATTR_RESOURCE_SIZE_MAX = 71, + DEVLINK_ATTR_RESOURCE_SIZE_GRAN = 72, + DEVLINK_ATTR_RESOURCE_UNIT = 73, + DEVLINK_ATTR_RESOURCE_OCC = 74, + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID = 75, + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS = 76, + DEVLINK_ATTR_PORT_FLAVOUR = 77, + DEVLINK_ATTR_PORT_NUMBER = 78, + DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER = 79, + DEVLINK_ATTR_PARAM = 80, + DEVLINK_ATTR_PARAM_NAME = 81, + DEVLINK_ATTR_PARAM_GENERIC = 82, + DEVLINK_ATTR_PARAM_TYPE = 83, + DEVLINK_ATTR_PARAM_VALUES_LIST = 84, + DEVLINK_ATTR_PARAM_VALUE = 85, + DEVLINK_ATTR_PARAM_VALUE_DATA = 86, + DEVLINK_ATTR_PARAM_VALUE_CMODE = 87, + DEVLINK_ATTR_REGION_NAME = 88, + DEVLINK_ATTR_REGION_SIZE = 89, + DEVLINK_ATTR_REGION_SNAPSHOTS = 90, + DEVLINK_ATTR_REGION_SNAPSHOT = 91, + DEVLINK_ATTR_REGION_SNAPSHOT_ID = 92, + DEVLINK_ATTR_REGION_CHUNKS = 93, + DEVLINK_ATTR_REGION_CHUNK = 94, + DEVLINK_ATTR_REGION_CHUNK_DATA = 95, + DEVLINK_ATTR_REGION_CHUNK_ADDR = 96, + DEVLINK_ATTR_REGION_CHUNK_LEN = 97, + DEVLINK_ATTR_INFO_DRIVER_NAME = 98, + DEVLINK_ATTR_INFO_SERIAL_NUMBER = 99, + DEVLINK_ATTR_INFO_VERSION_FIXED = 100, + DEVLINK_ATTR_INFO_VERSION_RUNNING = 101, + DEVLINK_ATTR_INFO_VERSION_STORED = 102, + DEVLINK_ATTR_INFO_VERSION_NAME = 103, + DEVLINK_ATTR_INFO_VERSION_VALUE = 104, + DEVLINK_ATTR_SB_POOL_CELL_SIZE = 105, + DEVLINK_ATTR_FMSG = 106, + DEVLINK_ATTR_FMSG_OBJ_NEST_START = 107, + DEVLINK_ATTR_FMSG_PAIR_NEST_START = 108, + DEVLINK_ATTR_FMSG_ARR_NEST_START = 109, + DEVLINK_ATTR_FMSG_NEST_END = 110, + DEVLINK_ATTR_FMSG_OBJ_NAME = 111, + DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE = 112, + DEVLINK_ATTR_FMSG_OBJ_VALUE_DATA = 113, + DEVLINK_ATTR_HEALTH_REPORTER = 114, + DEVLINK_ATTR_HEALTH_REPORTER_NAME = 115, + DEVLINK_ATTR_HEALTH_REPORTER_STATE = 116, + DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT = 117, + DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT = 118, + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS = 119, + DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD = 120, + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER = 121, + DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME = 122, + DEVLINK_ATTR_FLASH_UPDATE_COMPONENT = 123, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG = 124, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE = 125, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL = 126, + DEVLINK_ATTR_PORT_PCI_PF_NUMBER = 127, + DEVLINK_ATTR_PORT_PCI_VF_NUMBER = 128, + DEVLINK_ATTR_STATS = 129, + DEVLINK_ATTR_TRAP_NAME = 130, + DEVLINK_ATTR_TRAP_ACTION = 131, + DEVLINK_ATTR_TRAP_TYPE = 132, + DEVLINK_ATTR_TRAP_GENERIC = 133, + DEVLINK_ATTR_TRAP_METADATA = 134, + DEVLINK_ATTR_TRAP_GROUP_NAME = 135, + DEVLINK_ATTR_RELOAD_FAILED = 136, + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS = 137, + DEVLINK_ATTR_NETNS_FD = 138, + DEVLINK_ATTR_NETNS_PID = 139, + DEVLINK_ATTR_NETNS_ID = 140, + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP = 141, + DEVLINK_ATTR_TRAP_POLICER_ID = 142, + DEVLINK_ATTR_TRAP_POLICER_RATE = 143, + DEVLINK_ATTR_TRAP_POLICER_BURST = 144, + DEVLINK_ATTR_PORT_FUNCTION = 145, + DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER = 146, + DEVLINK_ATTR_PORT_LANES = 147, + DEVLINK_ATTR_PORT_SPLITTABLE = 148, + DEVLINK_ATTR_PORT_EXTERNAL = 149, + DEVLINK_ATTR_PORT_CONTROLLER_NUMBER = 150, + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT = 151, + DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK = 152, + DEVLINK_ATTR_RELOAD_ACTION = 153, + DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED = 154, + DEVLINK_ATTR_RELOAD_LIMITS = 155, + DEVLINK_ATTR_DEV_STATS = 156, + DEVLINK_ATTR_RELOAD_STATS = 157, + DEVLINK_ATTR_RELOAD_STATS_ENTRY = 158, + DEVLINK_ATTR_RELOAD_STATS_LIMIT = 159, + DEVLINK_ATTR_RELOAD_STATS_VALUE = 160, + DEVLINK_ATTR_REMOTE_RELOAD_STATS = 161, + DEVLINK_ATTR_RELOAD_ACTION_INFO = 162, + DEVLINK_ATTR_RELOAD_ACTION_STATS = 163, + DEVLINK_ATTR_PORT_PCI_SF_NUMBER = 164, + DEVLINK_ATTR_RATE_TYPE = 165, + DEVLINK_ATTR_RATE_TX_SHARE = 166, + DEVLINK_ATTR_RATE_TX_MAX = 167, + DEVLINK_ATTR_RATE_NODE_NAME = 168, + DEVLINK_ATTR_RATE_PARENT_NODE_NAME = 169, + DEVLINK_ATTR_REGION_MAX_SNAPSHOTS = 170, + DEVLINK_ATTR_LINECARD_INDEX = 171, + DEVLINK_ATTR_LINECARD_STATE = 172, + DEVLINK_ATTR_LINECARD_TYPE = 173, + DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES = 174, + DEVLINK_ATTR_NESTED_DEVLINK = 175, + DEVLINK_ATTR_SELFTESTS = 176, + DEVLINK_ATTR_RATE_TX_PRIORITY = 177, + DEVLINK_ATTR_RATE_TX_WEIGHT = 178, + DEVLINK_ATTR_REGION_DIRECT = 179, + __DEVLINK_ATTR_MAX = 180, + DEVLINK_ATTR_MAX = 179, +}; + +enum devlink_dpipe_field_mapping_type { + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0, + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 1, +}; + +enum devlink_dpipe_match_type { + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0, +}; + +enum devlink_dpipe_action_type { + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0, +}; + +enum devlink_dpipe_field_ethernet_id { + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0, +}; + +enum devlink_dpipe_field_ipv4_id { + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0, +}; + +enum devlink_dpipe_field_ipv6_id { + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0, +}; + +enum devlink_dpipe_header_id { + DEVLINK_DPIPE_HEADER_ETHERNET = 0, + DEVLINK_DPIPE_HEADER_IPV4 = 1, + DEVLINK_DPIPE_HEADER_IPV6 = 2, +}; + +enum devlink_resource_unit { + DEVLINK_RESOURCE_UNIT_ENTRY = 0, +}; + +enum devlink_port_fn_attr_cap { + DEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT = 0, + DEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT = 1, + __DEVLINK_PORT_FN_ATTR_CAPS_MAX = 2, +}; + +enum devlink_port_function_attr { + DEVLINK_PORT_FUNCTION_ATTR_UNSPEC = 0, + DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR = 1, + DEVLINK_PORT_FN_ATTR_STATE = 2, + DEVLINK_PORT_FN_ATTR_OPSTATE = 3, + DEVLINK_PORT_FN_ATTR_CAPS = 4, + __DEVLINK_PORT_FUNCTION_ATTR_MAX = 5, + DEVLINK_PORT_FUNCTION_ATTR_MAX = 4, +}; + +enum devlink_port_fn_state { + DEVLINK_PORT_FN_STATE_INACTIVE = 0, + DEVLINK_PORT_FN_STATE_ACTIVE = 1, +}; + +enum devlink_port_fn_opstate { + DEVLINK_PORT_FN_OPSTATE_DETACHED = 0, + DEVLINK_PORT_FN_OPSTATE_ATTACHED = 1, +}; + +struct devlink_linecard_ops; + +struct devlink_linecard_type; + +struct devlink_linecard { + struct list_head list; + struct devlink *devlink; + unsigned int index; + refcount_t refcount; + const struct devlink_linecard_ops *ops; + void *priv; + enum devlink_linecard_state state; + struct mutex state_lock; + const char *type; + struct devlink_linecard_type *types; + unsigned int types_count; + struct devlink *nested_devlink; +}; + +struct devlink_port_new_attrs { + enum devlink_port_flavour flavour; + unsigned int port_index; + u32 controller; + u32 sfnum; + u16 pfnum; + u8 port_index_valid: 1; + u8 controller_valid: 1; + u8 sfnum_valid: 1; +}; + +struct devlink_linecard_ops { + int (*provision)(struct devlink_linecard *, void *, const char *, const void *, struct netlink_ext_ack *); + int (*unprovision)(struct devlink_linecard *, void *, struct netlink_ext_ack *); + bool (*same_provision)(struct devlink_linecard *, void *, const char *, const void *); + unsigned int (*types_count)(struct devlink_linecard *, void *); + void (*types_get)(struct devlink_linecard *, void *, unsigned int, const char **, const void **); +}; + +struct devlink_sb_pool_info { + enum devlink_sb_pool_type pool_type; + u32 size; + enum devlink_sb_threshold_type threshold_type; + u32 cell_size; +}; + +struct devlink_dpipe_field { + const char *name; + unsigned int id; + unsigned int bitwidth; + enum devlink_dpipe_field_mapping_type mapping_type; +}; + +struct devlink_dpipe_header { + const char *name; + unsigned int id; + struct devlink_dpipe_field *fields; + unsigned int fields_count; + bool global; +}; + +struct devlink_dpipe_match { + enum devlink_dpipe_match_type type; + unsigned int header_index; + struct devlink_dpipe_header *header; + unsigned int field_id; +}; + +struct devlink_dpipe_action { + enum devlink_dpipe_action_type type; + unsigned int header_index; + struct devlink_dpipe_header *header; + unsigned int field_id; +}; + +struct devlink_dpipe_value { + union { + struct devlink_dpipe_action *action; + struct devlink_dpipe_match *match; + }; + unsigned int mapping_value; + bool mapping_valid; + unsigned int value_size; + void *value; + void *mask; +}; + +struct devlink_dpipe_entry { + u64 index; + struct devlink_dpipe_value *match_values; + unsigned int match_values_count; + struct devlink_dpipe_value *action_values; + unsigned int action_values_count; + u64 counter; + bool counter_valid; +}; + +struct devlink_dpipe_dump_ctx { + struct genl_info *info; + enum devlink_command cmd; + struct sk_buff *skb; + struct nlattr *nest; + void *hdr; +}; + +struct devlink_dpipe_table_ops; + +struct devlink_dpipe_table { + void *priv; + struct list_head list; + const char *name; + bool counters_enabled; + bool counter_control_extern; + bool resource_valid; + u64 resource_id; + u64 resource_units; + struct devlink_dpipe_table_ops *table_ops; + struct callback_head rcu; +}; + +struct devlink_dpipe_table_ops { + int (*actions_dump)(void *, struct sk_buff *); + int (*matches_dump)(void *, struct sk_buff *); + int (*entries_dump)(void *, bool, struct devlink_dpipe_dump_ctx *); + int (*counters_set_update)(void *, bool); + u64 (*size_get)(void *); +}; + +struct devlink_dpipe_headers { + struct devlink_dpipe_header **headers; + unsigned int headers_count; +}; + +struct devlink_resource_size_params { + u64 size_min; + u64 size_max; + u64 size_granularity; + enum devlink_resource_unit unit; +}; + +enum devlink_param_type { + DEVLINK_PARAM_TYPE_U8 = 0, + DEVLINK_PARAM_TYPE_U16 = 1, + DEVLINK_PARAM_TYPE_U32 = 2, + DEVLINK_PARAM_TYPE_STRING = 3, + DEVLINK_PARAM_TYPE_BOOL = 4, +}; + +union devlink_param_value { + u8 vu8; + u16 vu16; + u32 vu32; + char vstr[32]; + bool vbool; +}; + +struct devlink_param_gset_ctx { + union devlink_param_value val; + enum devlink_param_cmode cmode; +}; + +struct devlink_flash_notify { + const char *status_msg; + const char *component; + long unsigned int done; + long unsigned int total; + long unsigned int timeout; +}; + +struct devlink_param { + u32 id; + const char *name; + bool generic; + enum devlink_param_type type; + long unsigned int supported_cmodes; + int (*get)(struct devlink *, u32, struct devlink_param_gset_ctx *); + int (*set)(struct devlink *, u32, struct devlink_param_gset_ctx *); + int (*validate)(struct devlink *, u32, union devlink_param_value, struct netlink_ext_ack *); +}; + +struct devlink_param_item { + struct list_head list; + const struct devlink_param *param; + union devlink_param_value driverinit_value; + bool driverinit_value_valid; +}; + +enum devlink_param_generic_id { + DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET = 0, + DEVLINK_PARAM_GENERIC_ID_MAX_MACS = 1, + DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV = 2, + DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT = 3, + DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI = 4, + DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX = 5, + DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN = 6, + DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY = 7, + DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE = 8, + DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE = 9, + DEVLINK_PARAM_GENERIC_ID_ENABLE_REMOTE_DEV_RESET = 10, + DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH = 11, + DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA = 12, + DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET = 13, + DEVLINK_PARAM_GENERIC_ID_ENABLE_IWARP = 14, + DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE = 15, + DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE = 16, + __DEVLINK_PARAM_GENERIC_ID_MAX = 17, + DEVLINK_PARAM_GENERIC_ID_MAX = 16, +}; + +struct devlink_flash_update_params { + const struct firmware *fw; + const char *component; + u32 overwrite_mask; +}; + +struct devlink_region_ops { + const char *name; + void (*destructor)(const void *); + int (*snapshot)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u8 **); + int (*read)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *); + void *priv; +}; + +struct devlink_port_region_ops { + const char *name; + void (*destructor)(const void *); + int (*snapshot)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u8 **); + int (*read)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *); + void *priv; +}; + +enum devlink_health_reporter_state { + DEVLINK_HEALTH_REPORTER_STATE_HEALTHY = 0, + DEVLINK_HEALTH_REPORTER_STATE_ERROR = 1, +}; + +struct devlink_fmsg; + +struct devlink_health_reporter_ops { + char *name; + int (*recover)(struct devlink_health_reporter *, void *, struct netlink_ext_ack *); + int (*dump)(struct devlink_health_reporter *, struct devlink_fmsg *, void *, struct netlink_ext_ack *); + int (*diagnose)(struct devlink_health_reporter *, struct devlink_fmsg *, struct netlink_ext_ack *); + int (*test)(struct devlink_health_reporter *, struct netlink_ext_ack *); +}; + +struct devlink_health_reporter { + struct list_head list; + void *priv; + const struct devlink_health_reporter_ops *ops; + struct devlink *devlink; + struct devlink_port *devlink_port; + struct devlink_fmsg *dump_fmsg; + struct mutex dump_lock; + u64 graceful_period; + bool auto_recover; + bool auto_dump; + u8 health_state; + u64 dump_ts; + u64 dump_real_ts; + u64 error_count; + u64 recovery_count; + u64 last_recovery_ts; + refcount_t refcount; +}; + +struct devlink_fmsg { + struct list_head item_list; + bool putting_binary; +}; + +struct devlink_trap_metadata { + const char *trap_name; + const char *trap_group_name; + struct net_device *input_dev; + netdevice_tracker dev_tracker; + const struct flow_action_cookie *fa_cookie; + enum devlink_trap_type trap_type; +}; + +struct devlink_trap_policer { + u32 id; + u64 init_rate; + u64 init_burst; + u64 max_rate; + u64 min_rate; + u64 max_burst; + u64 min_burst; +}; + +struct devlink_trap_group { + const char *name; + u16 id; + bool generic; + u32 init_policer_id; +}; + +struct devlink_trap { + enum devlink_trap_type type; + enum devlink_trap_action init_action; + bool generic; + u16 id; + const char *name; + u16 init_group_id; + u32 metadata_cap; +}; + +enum devlink_trap_generic_id { + DEVLINK_TRAP_GENERIC_ID_SMAC_MC = 0, + DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH = 1, + DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER = 2, + DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER = 3, + DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST = 4, + DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER = 5, + DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE = 6, + DEVLINK_TRAP_GENERIC_ID_TTL_ERROR = 7, + DEVLINK_TRAP_GENERIC_ID_TAIL_DROP = 8, + DEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET = 9, + DEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC = 10, + DEVLINK_TRAP_GENERIC_ID_DIP_LB = 11, + DEVLINK_TRAP_GENERIC_ID_SIP_MC = 12, + DEVLINK_TRAP_GENERIC_ID_SIP_LB = 13, + DEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR = 14, + DEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC = 15, + DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE = 16, + DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE = 17, + DEVLINK_TRAP_GENERIC_ID_MTU_ERROR = 18, + DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH = 19, + DEVLINK_TRAP_GENERIC_ID_RPF = 20, + DEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE = 21, + DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS = 22, + DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS = 23, + DEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE = 24, + DEVLINK_TRAP_GENERIC_ID_DECAP_ERROR = 25, + DEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC = 26, + DEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP = 27, + DEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP = 28, + DEVLINK_TRAP_GENERIC_ID_STP = 29, + DEVLINK_TRAP_GENERIC_ID_LACP = 30, + DEVLINK_TRAP_GENERIC_ID_LLDP = 31, + DEVLINK_TRAP_GENERIC_ID_IGMP_QUERY = 32, + DEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT = 33, + DEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT = 34, + DEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT = 35, + DEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE = 36, + DEVLINK_TRAP_GENERIC_ID_MLD_QUERY = 37, + DEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT = 38, + DEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT = 39, + DEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE = 40, + DEVLINK_TRAP_GENERIC_ID_IPV4_DHCP = 41, + DEVLINK_TRAP_GENERIC_ID_IPV6_DHCP = 42, + DEVLINK_TRAP_GENERIC_ID_ARP_REQUEST = 43, + DEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE = 44, + DEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY = 45, + DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT = 46, + DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT = 47, + DEVLINK_TRAP_GENERIC_ID_IPV4_BFD = 48, + DEVLINK_TRAP_GENERIC_ID_IPV6_BFD = 49, + DEVLINK_TRAP_GENERIC_ID_IPV4_OSPF = 50, + DEVLINK_TRAP_GENERIC_ID_IPV6_OSPF = 51, + DEVLINK_TRAP_GENERIC_ID_IPV4_BGP = 52, + DEVLINK_TRAP_GENERIC_ID_IPV6_BGP = 53, + DEVLINK_TRAP_GENERIC_ID_IPV4_VRRP = 54, + DEVLINK_TRAP_GENERIC_ID_IPV6_VRRP = 55, + DEVLINK_TRAP_GENERIC_ID_IPV4_PIM = 56, + DEVLINK_TRAP_GENERIC_ID_IPV6_PIM = 57, + DEVLINK_TRAP_GENERIC_ID_UC_LB = 58, + DEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE = 59, + DEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE = 60, + DEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE = 61, + DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES = 62, + DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS = 63, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT = 64, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT = 65, + DEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT = 66, + DEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT = 67, + DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT = 68, + DEVLINK_TRAP_GENERIC_ID_PTP_EVENT = 69, + DEVLINK_TRAP_GENERIC_ID_PTP_GENERAL = 70, + DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE = 71, + DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP = 72, + DEVLINK_TRAP_GENERIC_ID_EARLY_DROP = 73, + DEVLINK_TRAP_GENERIC_ID_VXLAN_PARSING = 74, + DEVLINK_TRAP_GENERIC_ID_LLC_SNAP_PARSING = 75, + DEVLINK_TRAP_GENERIC_ID_VLAN_PARSING = 76, + DEVLINK_TRAP_GENERIC_ID_PPPOE_PPP_PARSING = 77, + DEVLINK_TRAP_GENERIC_ID_MPLS_PARSING = 78, + DEVLINK_TRAP_GENERIC_ID_ARP_PARSING = 79, + DEVLINK_TRAP_GENERIC_ID_IP_1_PARSING = 80, + DEVLINK_TRAP_GENERIC_ID_IP_N_PARSING = 81, + DEVLINK_TRAP_GENERIC_ID_GRE_PARSING = 82, + DEVLINK_TRAP_GENERIC_ID_UDP_PARSING = 83, + DEVLINK_TRAP_GENERIC_ID_TCP_PARSING = 84, + DEVLINK_TRAP_GENERIC_ID_IPSEC_PARSING = 85, + DEVLINK_TRAP_GENERIC_ID_SCTP_PARSING = 86, + DEVLINK_TRAP_GENERIC_ID_DCCP_PARSING = 87, + DEVLINK_TRAP_GENERIC_ID_GTP_PARSING = 88, + DEVLINK_TRAP_GENERIC_ID_ESP_PARSING = 89, + DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_NEXTHOP = 90, + DEVLINK_TRAP_GENERIC_ID_DMAC_FILTER = 91, + DEVLINK_TRAP_GENERIC_ID_EAPOL = 92, + DEVLINK_TRAP_GENERIC_ID_LOCKED_PORT = 93, + __DEVLINK_TRAP_GENERIC_ID_MAX = 94, + DEVLINK_TRAP_GENERIC_ID_MAX = 93, +}; + +enum devlink_trap_group_generic_id { + DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS = 0, + DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS = 1, + DEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS = 2, + DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS = 3, + DEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS = 4, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS = 5, + DEVLINK_TRAP_GROUP_GENERIC_ID_STP = 6, + DEVLINK_TRAP_GROUP_GENERIC_ID_LACP = 7, + DEVLINK_TRAP_GROUP_GENERIC_ID_LLDP = 8, + DEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING = 9, + DEVLINK_TRAP_GROUP_GENERIC_ID_DHCP = 10, + DEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY = 11, + DEVLINK_TRAP_GROUP_GENERIC_ID_BFD = 12, + DEVLINK_TRAP_GROUP_GENERIC_ID_OSPF = 13, + DEVLINK_TRAP_GROUP_GENERIC_ID_BGP = 14, + DEVLINK_TRAP_GROUP_GENERIC_ID_VRRP = 15, + DEVLINK_TRAP_GROUP_GENERIC_ID_PIM = 16, + DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB = 17, + DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY = 18, + DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY = 19, + DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6 = 20, + DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT = 21, + DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL = 22, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE = 23, + DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP = 24, + DEVLINK_TRAP_GROUP_GENERIC_ID_PARSER_ERROR_DROPS = 25, + DEVLINK_TRAP_GROUP_GENERIC_ID_EAPOL = 26, + __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 27, + DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 26, +}; + +enum { + DEVLINK_F_RELOAD = 1, +}; + +struct devlink_info_req; + +struct devlink_ops { + u32 supported_flash_update_params; + long unsigned int reload_actions; + long unsigned int reload_limits; + int (*reload_down)(struct devlink *, bool, enum devlink_reload_action, enum devlink_reload_limit, struct netlink_ext_ack *); + int (*reload_up)(struct devlink *, enum devlink_reload_action, enum devlink_reload_limit, u32 *, struct netlink_ext_ack *); + int (*port_type_set)(struct devlink_port *, enum devlink_port_type); + int (*port_split)(struct devlink *, struct devlink_port *, unsigned int, struct netlink_ext_ack *); + int (*port_unsplit)(struct devlink *, struct devlink_port *, struct netlink_ext_ack *); + int (*sb_pool_get)(struct devlink *, unsigned int, u16, struct devlink_sb_pool_info *); + int (*sb_pool_set)(struct devlink *, unsigned int, u16, u32, enum devlink_sb_threshold_type, struct netlink_ext_ack *); + int (*sb_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *); + int (*sb_port_pool_set)(struct devlink_port *, unsigned int, u16, u32, struct netlink_ext_ack *); + int (*sb_tc_pool_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16 *, u32 *); + int (*sb_tc_pool_bind_set)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16, u32, struct netlink_ext_ack *); + int (*sb_occ_snapshot)(struct devlink *, unsigned int); + int (*sb_occ_max_clear)(struct devlink *, unsigned int); + int (*sb_occ_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *, u32 *); + int (*sb_occ_tc_port_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u32 *, u32 *); + int (*eswitch_mode_get)(struct devlink *, u16 *); + int (*eswitch_mode_set)(struct devlink *, u16, struct netlink_ext_ack *); + int (*eswitch_inline_mode_get)(struct devlink *, u8 *); + int (*eswitch_inline_mode_set)(struct devlink *, u8, struct netlink_ext_ack *); + int (*eswitch_encap_mode_get)(struct devlink *, enum devlink_eswitch_encap_mode *); + int (*eswitch_encap_mode_set)(struct devlink *, enum devlink_eswitch_encap_mode, struct netlink_ext_ack *); + int (*info_get)(struct devlink *, struct devlink_info_req *, struct netlink_ext_ack *); + int (*flash_update)(struct devlink *, struct devlink_flash_update_params *, struct netlink_ext_ack *); + int (*trap_init)(struct devlink *, const struct devlink_trap *, void *); + void (*trap_fini)(struct devlink *, const struct devlink_trap *, void *); + int (*trap_action_set)(struct devlink *, const struct devlink_trap *, enum devlink_trap_action, struct netlink_ext_ack *); + int (*trap_group_init)(struct devlink *, const struct devlink_trap_group *); + int (*trap_group_set)(struct devlink *, const struct devlink_trap_group *, const struct devlink_trap_policer *, struct netlink_ext_ack *); + int (*trap_group_action_set)(struct devlink *, const struct devlink_trap_group *, enum devlink_trap_action, struct netlink_ext_ack *); + int (*trap_drop_counter_get)(struct devlink *, const struct devlink_trap *, u64 *); + int (*trap_policer_init)(struct devlink *, const struct devlink_trap_policer *); + void (*trap_policer_fini)(struct devlink *, const struct devlink_trap_policer *); + int (*trap_policer_set)(struct devlink *, const struct devlink_trap_policer *, u64, u64, struct netlink_ext_ack *); + int (*trap_policer_counter_get)(struct devlink *, const struct devlink_trap_policer *, u64 *); + int (*port_function_hw_addr_get)(struct devlink_port *, u8 *, int *, struct netlink_ext_ack *); + int (*port_function_hw_addr_set)(struct devlink_port *, const u8 *, int, struct netlink_ext_ack *); + int (*port_fn_roce_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_roce_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_fn_migratable_get)(struct devlink_port *, bool *, struct netlink_ext_ack *); + int (*port_fn_migratable_set)(struct devlink_port *, bool, struct netlink_ext_ack *); + int (*port_new)(struct devlink *, const struct devlink_port_new_attrs *, struct netlink_ext_ack *, unsigned int *); + int (*port_del)(struct devlink *, unsigned int, struct netlink_ext_ack *); + int (*port_fn_state_get)(struct devlink_port *, enum devlink_port_fn_state *, enum devlink_port_fn_opstate *, struct netlink_ext_ack *); + int (*port_fn_state_set)(struct devlink_port *, enum devlink_port_fn_state, struct netlink_ext_ack *); + int (*rate_leaf_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_leaf_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_leaf_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_leaf_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_node_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_node_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *); + int (*rate_node_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_node_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *); + int (*rate_node_new)(struct devlink_rate *, void **, struct netlink_ext_ack *); + int (*rate_node_del)(struct devlink_rate *, void *, struct netlink_ext_ack *); + int (*rate_leaf_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); + int (*rate_node_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *); + bool (*selftest_check)(struct devlink *, unsigned int, struct netlink_ext_ack *); + enum devlink_selftest_status (*selftest_run)(struct devlink *, unsigned int, struct netlink_ext_ack *); +}; + +enum devlink_info_version_type { + DEVLINK_INFO_VERSION_TYPE_NONE = 0, + DEVLINK_INFO_VERSION_TYPE_COMPONENT = 1, +}; + +struct devlink_info_req { + struct sk_buff *msg; + void (*version_cb)(const char *, enum devlink_info_version_type, void *); + void *version_cb_priv; +}; + +struct trace_event_raw_devlink_hwmsg { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + bool incoming; + long unsigned int type; + u32 __data_loc_buf; + size_t len; + char __data[0]; +}; + +struct trace_event_raw_devlink_hwerr { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + int err; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_report { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_recover_aborted { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + bool health_state; + u64 time_since_last_recover; + char __data[0]; +}; + +struct trace_event_raw_devlink_health_reporter_state_update { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_reporter_name; + u8 new_state; + char __data[0]; +}; + +struct trace_event_raw_devlink_trap_report { + struct trace_entry ent; + u32 __data_loc_bus_name; + u32 __data_loc_dev_name; + u32 __data_loc_driver_name; + u32 __data_loc_trap_name; + u32 __data_loc_trap_group_name; + char input_dev_name[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_devlink_hwmsg { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 buf; +}; + +struct trace_event_data_offsets_devlink_hwerr { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 msg; +}; + +struct trace_event_data_offsets_devlink_health_report { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; + u32 msg; +}; + +struct trace_event_data_offsets_devlink_health_recover_aborted { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; +}; + +struct trace_event_data_offsets_devlink_health_reporter_state_update { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 reporter_name; +}; + +struct trace_event_data_offsets_devlink_trap_report { + u32 bus_name; + u32 dev_name; + u32 driver_name; + u32 trap_name; + u32 trap_group_name; +}; + +typedef void (*btf_trace_devlink_hwmsg)(void *, const struct devlink *, bool, long unsigned int, const u8 *, size_t); + +typedef void (*btf_trace_devlink_hwerr)(void *, const struct devlink *, int, const char *); + +typedef void (*btf_trace_devlink_health_report)(void *, const struct devlink *, const char *, const char *); + +typedef void (*btf_trace_devlink_health_recover_aborted)(void *, const struct devlink *, const char *, bool, u64); + +typedef void (*btf_trace_devlink_health_reporter_state_update)(void *, const struct devlink *, const char *, bool); + +typedef void (*btf_trace_devlink_trap_report)(void *, const struct devlink *, struct sk_buff *, const struct devlink_trap_metadata *); + +struct devlink_linecard_type { + const char *type; + const void *priv; +}; + +struct devlink_resource { + const char *name; + u64 id; + u64 size; + u64 size_new; + bool size_valid; + struct devlink_resource *parent; + struct devlink_resource_size_params size_params; + struct list_head list; + struct list_head resource_list; + devlink_resource_occ_get_t *occ_get; + void *occ_get_priv; +}; + +struct devlink_sb { + struct list_head list; + unsigned int index; + u32 size; + u16 ingress_pools_count; + u16 egress_pools_count; + u16 ingress_tc_count; + u16 egress_tc_count; +}; + +struct devlink_region { + struct devlink *devlink; + struct devlink_port *port; + struct list_head list; + union { + const struct devlink_region_ops *ops; + const struct devlink_port_region_ops *port_ops; + }; + struct mutex snapshot_lock; + struct list_head snapshot_list; + u32 max_snapshots; + u32 cur_snapshots; + u64 size; +}; + +struct devlink_snapshot { + struct list_head list; + struct devlink_region *region; + u8 *data; + u32 id; +}; + +enum devlink_multicast_groups { + DEVLINK_MCGRP_CONFIG = 0, +}; + +struct devlink_reload_combination { + enum devlink_reload_action action; + enum devlink_reload_limit limit; +}; + +struct devlink_flash_component_lookup_ctx { + const char *lookup_name; + bool lookup_name_found; +}; + +typedef int devlink_chunk_fill_t(void *, u8 *, u32, u64, struct netlink_ext_ack *); + +struct devlink_fmsg_item { + struct list_head list; + int attrtype; + u8 nla_type; + u16 len; + int value[0]; +}; + +struct devlink_stats { + u64_stats_t rx_bytes; + u64_stats_t rx_packets; + struct u64_stats_sync syncp; +}; + +struct devlink_trap_policer_item { + const struct devlink_trap_policer *policer; + u64 rate; + u64 burst; + struct list_head list; +}; + +struct devlink_trap_group_item { + const struct devlink_trap_group *group; + struct devlink_trap_policer_item *policer_item; + struct list_head list; + struct devlink_stats *stats; +}; + +struct devlink_trap_item { + const struct devlink_trap *trap; + struct devlink_trap_group_item *group_item; + struct list_head list; + enum devlink_trap_action action; + struct devlink_stats *stats; + void *priv; +}; + +struct root_domain; + +struct sched_domain_attr { + int relax_domain_level; +}; + +struct fmeter { + int cnt; + int val; + time64_t time; + spinlock_t lock; +}; + +enum prs_errcode { + PERR_NONE = 0, + PERR_INVCPUS = 1, + PERR_INVPARENT = 2, + PERR_NOTPART = 3, + PERR_NOTEXCL = 4, + PERR_NOCPUS = 5, + PERR_HOTPLUG = 6, + PERR_CPUSEMPTY = 7, +}; + +struct cpuset { + struct cgroup_subsys_state css; + long unsigned int flags; + cpumask_var_t cpus_allowed; + nodemask_t mems_allowed; + cpumask_var_t effective_cpus; + nodemask_t effective_mems; + cpumask_var_t subparts_cpus; + nodemask_t old_mems_allowed; + struct fmeter fmeter; + int attach_in_progress; + int pn; + int relax_domain_level; + int nr_subparts_cpus; + int partition_root_state; + int use_parent_ecpus; + int child_ecpus_count; + enum prs_errcode prs_err; + struct cgroup_file partition_file; +}; + +struct tmpmasks { + cpumask_var_t addmask; + cpumask_var_t delmask; + cpumask_var_t new_cpus; +}; + +typedef enum { + CS_ONLINE = 0, + CS_CPU_EXCLUSIVE = 1, + CS_MEM_EXCLUSIVE = 2, + CS_MEM_HARDWALL = 3, + CS_MEMORY_MIGRATE = 4, + CS_SCHED_LOAD_BALANCE = 5, + CS_SPREAD_PAGE = 6, + CS_SPREAD_SLAB = 7, +} cpuset_flagbits_t; + +enum subparts_cmd { + partcmd_enable = 0, + partcmd_disable = 1, + partcmd_update = 2, + partcmd_invalidate = 3, +}; + +struct cpuset_migrate_mm_work { + struct work_struct work; + struct mm_struct *mm; + nodemask_t from; + nodemask_t to; +}; + +typedef enum { + FILE_MEMORY_MIGRATE = 0, + FILE_CPULIST = 1, + FILE_MEMLIST = 2, + FILE_EFFECTIVE_CPULIST = 3, + FILE_EFFECTIVE_MEMLIST = 4, + FILE_SUBPARTS_CPULIST = 5, + FILE_CPU_EXCLUSIVE = 6, + FILE_MEM_EXCLUSIVE = 7, + FILE_MEM_HARDWALL = 8, + FILE_SCHED_LOAD_BALANCE = 9, + FILE_PARTITION_ROOT = 10, + FILE_SCHED_RELAX_DOMAIN_LEVEL = 11, + FILE_MEMORY_PRESSURE_ENABLED = 12, + FILE_MEMORY_PRESSURE = 13, + FILE_SPREAD_PAGE = 14, + FILE_SPREAD_SLAB = 15, +} cpuset_filetype_t; + +struct gnu_property { + u32 pr_type; + u32 pr_datasz; +}; + +struct elf_prpsinfo { + char pr_state; + char pr_sname; + char pr_zomb; + char pr_nice; + long unsigned int pr_flag; + __kernel_uid_t pr_uid; + __kernel_gid_t pr_gid; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pr_sid; + char pr_fname[16]; + char pr_psargs[80]; +}; + +struct memelfnote { + const char *name; + int type; + unsigned int datasz; + void *data; +}; + +struct elf_thread_core_info { + struct elf_thread_core_info *next; + struct task_struct *task; + struct elf_prstatus prstatus; + struct memelfnote notes[0]; +}; + +struct elf_note_info { + struct elf_thread_core_info *thread; + struct memelfnote psinfo; + struct memelfnote signote; + struct memelfnote auxv; + struct memelfnote files; + siginfo_t csigdata; + size_t size; + int thread_notes; +}; + +struct debugfs_fsdata { + const struct file_operations *real_fops; + refcount_t active_users; + struct completion active_users_drained; +}; + +struct debugfs_mount_opts { + kuid_t uid; + kgid_t gid; + umode_t mode; + unsigned int opts; +}; + +enum { + Opt_uid___2 = 0, + Opt_gid___2 = 1, + Opt_mode___3 = 2, + Opt_err___3 = 3, +}; + +struct debugfs_fs_info { + struct debugfs_mount_opts mount_opts; +}; + +struct rsa_mpi_key { + MPI n; + MPI e; + MPI d; + MPI p; + MPI q; + MPI dp; + MPI dq; + MPI qinv; +}; + +enum { + REQ_FSEQ_PREFLUSH = 1, + REQ_FSEQ_DATA = 2, + REQ_FSEQ_POSTFLUSH = 4, + REQ_FSEQ_DONE = 8, + REQ_FSEQ_ACTIONS = 7, + FLUSH_PENDING_TIMEOUT = 5000, +}; + +typedef uint64_t vli_type; + +enum xz_check { + XZ_CHECK_NONE = 0, + XZ_CHECK_CRC32 = 1, + XZ_CHECK_CRC64 = 4, + XZ_CHECK_SHA256 = 10, +}; + +struct xz_dec_hash { + vli_type unpadded; + vli_type uncompressed; + uint32_t crc32; +}; + +struct xz_dec_lzma2; + +struct xz_dec_bcj; + +struct xz_dec { + enum { + SEQ_STREAM_HEADER = 0, + SEQ_BLOCK_START = 1, + SEQ_BLOCK_HEADER = 2, + SEQ_BLOCK_UNCOMPRESS = 3, + SEQ_BLOCK_PADDING = 4, + SEQ_BLOCK_CHECK = 5, + SEQ_INDEX = 6, + SEQ_INDEX_PADDING = 7, + SEQ_INDEX_CRC32 = 8, + SEQ_STREAM_FOOTER = 9, + } sequence; + uint32_t pos; + vli_type vli; + size_t in_start; + size_t out_start; + uint32_t crc32; + enum xz_check check_type; + enum xz_mode mode; + bool allow_buf_error; + struct { + vli_type compressed; + vli_type uncompressed; + uint32_t size; + } block_header; + struct { + vli_type compressed; + vli_type uncompressed; + vli_type count; + struct xz_dec_hash hash; + } block; + struct { + enum { + SEQ_INDEX_COUNT = 0, + SEQ_INDEX_UNPADDED = 1, + SEQ_INDEX_UNCOMPRESSED = 2, + } sequence; + vli_type size; + vli_type count; + struct xz_dec_hash hash; + } index; + struct { + size_t pos; + size_t size; + uint8_t buf[1024]; + } temp; + struct xz_dec_lzma2 *lzma2; + struct xz_dec_bcj *bcj; + bool bcj_active; +}; + +struct loopback_dev { + struct rc_dev *dev; + u32 txmask; + u32 txcarrier; + u32 txduty; + bool idle; + bool wideband; + bool carrierreport; + u32 rxcarriermin; + u32 rxcarriermax; +}; + +struct bpf_sk_lookup_kern { + u16 family; + u16 protocol; + __be16 sport; + u16 dport; + struct { + __be32 saddr; + __be32 daddr; + } v4; + struct { + const struct in6_addr *saddr; + const struct in6_addr *daddr; + } v6; + struct sock *selected_sk; + u32 ingress_ifindex; + bool no_reuseport; +}; + +struct udp_skb_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + __u16 cscov; + __u8 partial_cov; +}; + +struct udp_dev_scratch { + u32 _tsize_state; + u16 len; + bool is_linear; + bool csum_unnecessary; +}; + +struct udp_iter_state { + struct seq_net_private p; + int bucket; + struct udp_seq_afinfo *bpf_seq_afinfo; +}; + +struct cpu_stop_done; + +struct cpu_stop_work { + struct list_head list; + cpu_stop_fn_t fn; + long unsigned int caller; + void *arg; + struct cpu_stop_done *done; +}; + +struct nodemask_scratch { + nodemask_t mask1; + nodemask_t mask2; +}; + +enum { + MPOL_DEFAULT = 0, + MPOL_PREFERRED = 1, + MPOL_BIND = 2, + MPOL_INTERLEAVE = 3, + MPOL_LOCAL = 4, + MPOL_PREFERRED_MANY = 5, + MPOL_MAX = 6, +}; + +struct sp_node { + struct rb_node nd; + long unsigned int start; + long unsigned int end; + struct mempolicy *policy; +}; + +struct mempolicy_operations { + int (*create)(struct mempolicy *, const nodemask_t *); + void (*rebind)(struct mempolicy *, const nodemask_t *); +}; + +struct queue_pages { + struct list_head *pagelist; + long unsigned int flags; + nodemask_t *nmask; + long unsigned int start; + long unsigned int end; + struct vm_area_struct *first; +}; + +enum tis_access { + TPM_ACCESS_VALID = 128, + TPM_ACCESS_ACTIVE_LOCALITY = 32, + TPM_ACCESS_REQUEST_PENDING = 4, + TPM_ACCESS_REQUEST_USE = 2, +}; + +enum tis_status { + TPM_STS_VALID = 128, + TPM_STS_COMMAND_READY = 64, + TPM_STS_GO = 32, + TPM_STS_DATA_AVAIL = 16, + TPM_STS_DATA_EXPECT = 8, + TPM_STS_READ_ZERO = 35, +}; + +enum tis_int_flags { + TPM_GLOBAL_INT_ENABLE = 2147483648, + TPM_INTF_BURST_COUNT_STATIC = 256, + TPM_INTF_CMD_READY_INT = 128, + TPM_INTF_INT_EDGE_FALLING = 64, + TPM_INTF_INT_EDGE_RISING = 32, + TPM_INTF_INT_LEVEL_LOW = 16, + TPM_INTF_INT_LEVEL_HIGH = 8, + TPM_INTF_LOCALITY_CHANGE_INT = 4, + TPM_INTF_STS_VALID_INT = 2, + TPM_INTF_DATA_AVAIL_INT = 1, +}; + +enum tis_defaults { + TIS_MEM_LEN = 20480, + TIS_SHORT_TIMEOUT = 750, + TIS_LONG_TIMEOUT = 2000, + TIS_TIMEOUT_MIN_ATML = 14700, + TIS_TIMEOUT_MAX_ATML = 15000, +}; + +enum tpm_tis_flags { + TPM_TIS_ITPM_WORKAROUND = 1, + TPM_TIS_INVALID_STATUS = 2, + TPM_TIS_DEFAULT_CANCELLATION = 4, +}; + +struct tpm_tis_phy_ops; + +struct tpm_tis_data { + u16 manufacturer_id; + int locality; + int irq; + bool irq_tested; + long unsigned int flags; + void *ilb_base_addr; + u16 clkrun_enabled; + wait_queue_head_t int_queue; + wait_queue_head_t read_queue; + const struct tpm_tis_phy_ops *phy_ops; + short unsigned int rng_quality; + unsigned int timeout_min; + unsigned int timeout_max; +}; + +enum tpm_tis_io_mode { + TPM_TIS_PHYS_8 = 0, + TPM_TIS_PHYS_16 = 1, + TPM_TIS_PHYS_32 = 2, +}; + +struct tpm_tis_phy_ops { + int (*read_bytes)(struct tpm_tis_data *, u32, u16, u8 *, enum tpm_tis_io_mode); + int (*write_bytes)(struct tpm_tis_data *, u32, u16, const u8 *, enum tpm_tis_io_mode); + int (*verify_crc)(struct tpm_tis_data *, size_t, const u8 *); +}; + +struct tis_vendor_durations_override { + u32 did_vid; + struct tpm1_version version; + long unsigned int durations[3]; +}; + +struct tis_vendor_timeout_override { + u32 did_vid; + long unsigned int timeout_us[4]; +}; + +struct bpf_sk_lookup { + union { + union { + struct bpf_sock *sk; + }; + __u64 cookie; + }; + __u32 family; + __u32 protocol; + __u32 remote_ip4; + __u32 remote_ip6[4]; + __be16 remote_port; + __u32 local_ip4; + __u32 local_ip6[4]; + __u32 local_port; + __u32 ingress_ifindex; +}; + +struct btf_id_dtor_kfunc { + u32 btf_id; + u32 kfunc_btf_id; +}; + +struct trace_event_raw_bpf_test_finish { + struct trace_entry ent; + int err; + char __data[0]; +}; + +struct trace_event_data_offsets_bpf_test_finish {}; + +typedef void (*btf_trace_bpf_test_finish)(void *, int *); + +struct bpf_test_timer { + enum { + NO_PREEMPT = 0, + NO_MIGRATE = 1, + } mode; + u32 i; + u64 time_start; + u64 time_spent; +}; + +struct xdp_page_head { + struct xdp_buff orig_ctx; + struct xdp_buff ctx; + struct xdp_frame frm; + u8 data[0]; +}; + +struct xdp_test_data { + struct xdp_buff *orig_ctx; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct xdp_rxq_info rxq; + struct net_device *dev; + struct page_pool *pp; + struct xdp_frame **frames; + struct sk_buff **skbs; + struct xdp_mem_info mem; + u32 batch_size; + u32 frame_cnt; + long: 64; + long: 64; +}; + +struct bpf_fentry_test_t { + struct bpf_fentry_test_t *a; +}; + +struct prog_test_member1 { + int a; +}; + +struct prog_test_member { + struct prog_test_member1 m; + int c; +}; + +struct prog_test_ref_kfunc { + int a; + int b; + struct prog_test_member memb; + struct prog_test_ref_kfunc *next; + refcount_t cnt; +}; + +struct prog_test_pass1 { + int x0; + struct { + int x1; + struct { + int x2; + struct { + int x3; + }; + }; + }; +}; + +struct prog_test_pass2 { + int len; + short int arr1[4]; + struct { + char arr2[4]; + long unsigned int arr3[8]; + } x; +}; + +struct prog_test_fail1 { + void *p; + int x; +}; + +struct prog_test_fail2 { + int x8; + struct prog_test_pass1 x; +}; + +struct prog_test_fail3 { + int len; + char arr1[2]; + char arr2[0]; +}; + +struct bpf_raw_tp_test_run_info { + struct bpf_prog *prog; + void *ctx; + u32 retval; +}; + +struct rtc_time { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +}; + +struct rtc_wkalrm { + unsigned char enabled; + unsigned char pending; + struct rtc_time time; +}; + +struct rtc_param { + __u64 param; + union { + __u64 uvalue; + __s64 svalue; + __u64 ptr; + }; + __u32 index; + __u32 __pad; +}; + +struct rtc_class_ops { + int (*ioctl)(struct device *, unsigned int, long unsigned int); + int (*read_time)(struct device *, struct rtc_time *); + int (*set_time)(struct device *, struct rtc_time *); + int (*read_alarm)(struct device *, struct rtc_wkalrm *); + int (*set_alarm)(struct device *, struct rtc_wkalrm *); + int (*proc)(struct device *, struct seq_file *); + int (*alarm_irq_enable)(struct device *, unsigned int); + int (*read_offset)(struct device *, long int *); + int (*set_offset)(struct device *, long int); + int (*param_get)(struct device *, struct rtc_param *); + int (*param_set)(struct device *, struct rtc_param *); +}; + +struct rtc_device; + +struct rtc_timer { + struct timerqueue_node node; + ktime_t period; + void (*func)(struct rtc_device *); + struct rtc_device *rtc; + int enabled; +}; + +struct rtc_device { + struct device dev; + struct module *owner; + int id; + const struct rtc_class_ops *ops; + struct mutex ops_lock; + struct cdev char_dev; + long unsigned int flags; + long unsigned int irq_data; + spinlock_t irq_lock; + wait_queue_head_t irq_queue; + struct fasync_struct *async_queue; + int irq_freq; + int max_user_freq; + struct timerqueue_head timerqueue; + struct rtc_timer aie_timer; + struct rtc_timer uie_rtctimer; + struct hrtimer pie_timer; + int pie_enabled; + struct work_struct irqwork; + long unsigned int set_offset_nsec; + long unsigned int features[1]; + time64_t range_min; + timeu64_t range_max; + time64_t start_secs; + time64_t offset_secs; + bool set_start_time; +}; + +struct trace_event_raw_alarmtimer_suspend { + struct trace_entry ent; + s64 expires; + unsigned char alarm_type; + char __data[0]; +}; + +struct trace_event_raw_alarm_class { + struct trace_entry ent; + void *alarm; + unsigned char alarm_type; + s64 expires; + s64 now; + char __data[0]; +}; + +struct trace_event_data_offsets_alarmtimer_suspend {}; + +struct trace_event_data_offsets_alarm_class {}; + +typedef void (*btf_trace_alarmtimer_suspend)(void *, ktime_t, int); + +typedef void (*btf_trace_alarmtimer_fired)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_start)(void *, struct alarm *, ktime_t); + +typedef void (*btf_trace_alarmtimer_cancel)(void *, struct alarm *, ktime_t); + +struct alarm_base { + spinlock_t lock; + struct timerqueue_head timerqueue; + ktime_t (*get_ktime)(); + void (*get_timespec)(struct timespec64 *); + clockid_t base_clockid; +}; + +struct crypto_report_rng { + char type[64]; + unsigned int seedsize; +}; + +struct blk_ia_range_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct blk_independent_access_range *, char *); +}; + +struct once_work { + struct work_struct work; + struct static_key_true *key; + struct module *module; +}; + +enum iommu_dma_cookie_type { + IOMMU_DMA_IOVA_COOKIE = 0, + IOMMU_DMA_MSI_COOKIE = 1, +}; + +struct iova { + struct rb_node node; + long unsigned int pfn_hi; + long unsigned int pfn_lo; +}; + +struct iova_rcache; + +struct iova_domain { + spinlock_t iova_rbtree_lock; + struct rb_root rbroot; + struct rb_node *cached_node; + struct rb_node *cached32_node; + long unsigned int granule; + long unsigned int start_pfn; + long unsigned int dma_32bit_pfn; + long unsigned int max32_alloc_size; + struct iova anchor; + struct iova_rcache *rcaches; + struct hlist_node cpuhp_dead; +}; + +struct iova_fq; + +struct iommu_dma_cookie { + enum iommu_dma_cookie_type type; + union { + struct { + struct iova_domain iovad; + struct iova_fq *fq; + atomic64_t fq_flush_start_cnt; + atomic64_t fq_flush_finish_cnt; + struct timer_list fq_timer; + atomic_t fq_timer_on; + }; + dma_addr_t msi_iova; + }; + struct list_head msi_page_list; + struct iommu_domain *fq_domain; + struct mutex mutex; +}; + +typedef int (*list_cmp_func_t)(void *, const struct list_head *, const struct list_head *); + +struct iommu_dma_msi_page { + struct list_head list; + dma_addr_t iova; + phys_addr_t phys; +}; + +struct iova_fq_entry { + long unsigned int iova_pfn; + long unsigned int pages; + struct list_head freelist; + u64 counter; +}; + +struct iova_fq { + struct iova_fq_entry entries[256]; + unsigned int head; + unsigned int tail; + spinlock_t lock; +}; + +typedef u64 (*btf_bpf_tcp_send_ack)(struct tcp_sock *, u32); + +struct task_struct; + +struct pcpu_freelist_node; + +struct pcpu_freelist_head { + struct pcpu_freelist_node *first; + raw_spinlock_t lock; +}; + +struct pcpu_freelist_node { + struct pcpu_freelist_node *next; +}; + +struct pcpu_freelist { + struct pcpu_freelist_head *freelist; + struct pcpu_freelist_head extralist; +}; + +enum rseq_cpu_id_state { + RSEQ_CPU_ID_UNINITIALIZED = -1, + RSEQ_CPU_ID_REGISTRATION_FAILED = -2, +}; + +enum rseq_flags { + RSEQ_FLAG_UNREGISTER = 1, +}; + +enum rseq_cs_flags { + RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT = 1, + RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = 2, + RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = 4, +}; + +struct rseq_cs { + __u32 version; + __u32 flags; + __u64 start_ip; + __u64 post_commit_offset; + __u64 abort_ip; +}; + +struct trace_event_raw_rseq_update { + struct trace_entry ent; + s32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_rseq_ip_fixup { + struct trace_entry ent; + long unsigned int regs_ip; + long unsigned int start_ip; + long unsigned int post_commit_offset; + long unsigned int abort_ip; + char __data[0]; +}; + +struct trace_event_data_offsets_rseq_update {}; + +struct trace_event_data_offsets_rseq_ip_fixup {}; + +typedef void (*btf_trace_rseq_update)(void *, struct task_struct *); + +typedef void (*btf_trace_rseq_ip_fixup)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +struct saved { + struct path link; + struct delayed_call done; + const char *name; + unsigned int seq; +}; + +struct nameidata { + struct path path; + struct qstr last; + struct path root; + struct inode *inode; + unsigned int flags; + unsigned int state; + unsigned int seq; + unsigned int next_seq; + unsigned int m_seq; + unsigned int r_seq; + int last_type; + unsigned int depth; + int total_link_count; + struct saved *stack; + struct saved internal[2]; + struct filename *name; + struct nameidata *saved; + unsigned int root_seq; + int dfd; + vfsuid_t dir_vfsuid; + umode_t dir_mode; +}; + +struct renamedata { + struct user_namespace *old_mnt_userns; + struct inode *old_dir; + struct dentry *old_dentry; + struct user_namespace *new_mnt_userns; + struct inode *new_dir; + struct dentry *new_dentry; + struct inode **delegated_inode; + unsigned int flags; +}; + +enum { + LAST_NORM = 0, + LAST_ROOT = 1, + LAST_DOT = 2, + LAST_DOTDOT = 3, +}; + +enum { + WALK_TRAILING = 1, + WALK_MORE = 2, + WALK_NOFOLLOW = 4, +}; + +enum gcry_mpi_constants { + MPI_C_ZERO = 0, + MPI_C_ONE = 1, + MPI_C_TWO = 2, + MPI_C_THREE = 3, + MPI_C_FOUR = 4, + MPI_C_EIGHT = 5, +}; + +typedef acpi_status (*acpi_execute_op)(struct acpi_walk_state *); + +struct clk_bulk_data { + const char *id; + struct clk *clk; +}; + +struct devm_clk_state { + struct clk *clk; + void (*exit)(struct clk *); +}; + +struct clk_bulk_devres { + struct clk_bulk_data *clks; + int num_clks; +}; + +struct vcs_poll_data { + struct notifier_block notifier; + unsigned int cons_num; + int event; + wait_queue_head_t waitq; + struct fasync_struct *fasync; +}; + +struct vivaldi_data { + u32 function_row_physmap[24]; + unsigned int num_function_row_keys; +}; + +struct atkbd { + struct ps2dev ps2dev; + struct input_dev *dev; + char name[64]; + char phys[32]; + short unsigned int id; + short unsigned int keycode[512]; + long unsigned int force_release_mask[8]; + unsigned char set; + bool translated; + bool extra; + bool write; + bool softrepeat; + bool softraw; + bool scroll; + bool enabled; + unsigned char emul; + bool resend; + bool release; + long unsigned int xl_bit; + unsigned int last; + long unsigned int time; + long unsigned int err_count; + struct delayed_work event_work; + long unsigned int event_jiffies; + long unsigned int event_mask; + struct mutex mutex; + struct vivaldi_data vdata; +}; + +enum nfnetlink_groups { + NFNLGRP_NONE = 0, + NFNLGRP_CONNTRACK_NEW = 1, + NFNLGRP_CONNTRACK_UPDATE = 2, + NFNLGRP_CONNTRACK_DESTROY = 3, + NFNLGRP_CONNTRACK_EXP_NEW = 4, + NFNLGRP_CONNTRACK_EXP_UPDATE = 5, + NFNLGRP_CONNTRACK_EXP_DESTROY = 6, + NFNLGRP_NFTABLES = 7, + NFNLGRP_ACCT_QUOTA = 8, + NFNLGRP_NFTRACE = 9, + __NFNLGRP_MAX = 10, +}; + +enum nfnl_batch_attributes { + NFNL_BATCH_UNSPEC = 0, + NFNL_BATCH_GENID = 1, + __NFNL_BATCH_MAX = 2, +}; + +struct nfnl_net { + struct sock *nfnl; +}; + +struct nfnl_err { + struct list_head head; + struct nlmsghdr *nlh; + int err; + struct netlink_ext_ack extack; +}; + +enum { + NFNL_BATCH_FAILURE = 1, + NFNL_BATCH_DONE = 2, + NFNL_BATCH_REPLAY = 4, +}; + +typedef struct sk_buff * (*gro_receive_sk_t)(struct sock *, struct list_head *, struct sk_buff *); + +struct latch_tree_ops { + bool (*less)(struct latch_tree_node *, struct latch_tree_node *); + int (*comp)(void *, struct latch_tree_node *); +}; + +struct iomap_dio { + struct kiocb *iocb; + const struct iomap_dio_ops *dops; + loff_t i_size; + loff_t size; + atomic_t ref; + unsigned int flags; + int error; + size_t done_before; + bool wait_for_completion; + union { + struct { + struct iov_iter *iter; + struct task_struct *waiter; + struct bio *poll_bio; + } submit; + struct { + struct work_struct work; + } aio; + }; +}; + +struct ipc_proc_iface { + const char *path; + const char *header; + int ids; + int (*show)(struct seq_file *, void *); +}; + +struct ipc_proc_iter { + struct ipc_namespace *ns; + struct pid_namespace *pid_ns; + struct ipc_proc_iface *iface; +}; + +typedef struct { + u64 a; + u64 b; +} u128; + +typedef struct { + __le64 b; + __le64 a; +} le128; + +struct gf128mul_64k { + struct gf128mul_4k *t[16]; +}; + +struct queue_sysfs_entry { + struct attribute attr; + ssize_t (*show)(struct request_queue *, char *); + ssize_t (*store)(struct request_queue *, const char *, size_t); +}; + +struct fib_nh_notifier_info { + struct fib_notifier_info info; + struct fib_nh *fib_nh; +}; + +struct fault_info { + int (*fn)(long unsigned int, long unsigned int, struct pt_regs *); + int sig; + int code; + const char *name; +}; + +struct idmap_key { + bool map_up; + u32 id; + u32 count; +}; + +enum bpf_lru_list_type { + BPF_LRU_LIST_T_ACTIVE = 0, + BPF_LRU_LIST_T_INACTIVE = 1, + BPF_LRU_LIST_T_FREE = 2, + BPF_LRU_LOCAL_LIST_T_FREE = 3, + BPF_LRU_LOCAL_LIST_T_PENDING = 4, +}; + +struct bpf_lru_node { + struct list_head list; + u16 cpu; + u8 type; + u8 ref; +}; + +struct bpf_lru_list { + struct list_head lists[3]; + unsigned int counts[2]; + struct list_head *next_inactive_rotation; + raw_spinlock_t lock; +}; + +struct bpf_lru_locallist { + struct list_head lists[2]; + u16 next_steal; + raw_spinlock_t lock; +}; + +struct bpf_common_lru { + struct bpf_lru_list lru_list; + struct bpf_lru_locallist *local_list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef bool (*del_from_htab_func)(void *, struct bpf_lru_node *); + +struct bpf_lru { + union { + struct bpf_common_lru common_lru; + struct bpf_lru_list *percpu_lru; + }; + del_from_htab_func del_from_htab; + void *del_arg; + unsigned int hash_offset; + unsigned int nr_scans; + bool percpu; + long: 56; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct trace_event_raw_mmap_lock { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + char __data[0]; +}; + +struct trace_event_raw_mmap_lock_acquire_returned { + struct trace_entry ent; + struct mm_struct *mm; + u32 __data_loc_memcg_path; + bool write; + bool success; + char __data[0]; +}; + +struct trace_event_data_offsets_mmap_lock { + u32 memcg_path; +}; + +struct trace_event_data_offsets_mmap_lock_acquire_returned { + u32 memcg_path; +}; + +typedef void (*btf_trace_mmap_lock_start_locking)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_mmap_lock_released)(void *, struct mm_struct *, const char *, bool); + +typedef void (*btf_trace_mmap_lock_acquire_returned)(void *, struct mm_struct *, const char *, bool, bool); + +struct memcg_path { + local_lock_t lock; + char *buf; + local_t buf_idx; +}; + +enum kcore_type { + KCORE_TEXT = 0, + KCORE_VMALLOC = 1, + KCORE_RAM = 2, + KCORE_VMEMMAP = 3, + KCORE_USER = 4, +}; + +struct kcore_list { + struct list_head list; + long unsigned int addr; + size_t size; + int type; +}; + +struct recovery_info { + tid_t start_transaction; + tid_t end_transaction; + int nr_replays; + int nr_revokes; + int nr_revoke_hits; +}; + +struct acpi_table_mcfg { + struct acpi_table_header header; + u8 reserved[8]; +}; + +struct acpi_mcfg_allocation { + u64 address; + u16 pci_segment; + u8 start_bus_number; + u8 end_bus_number; + u32 reserved; +}; + +struct mcfg_entry { + struct list_head list; + phys_addr_t addr; + u16 segment; + u8 bus_start; + u8 bus_end; +}; + +struct mcfg_fixup { + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; + u16 segment; + struct resource bus_range; + const struct pci_ecam_ops *ops; + struct resource cfgres; +}; + +struct tpm1_get_random_out { + __be32 rng_data_len; + u8 rng_data[128]; +}; + +struct net_failover_info { + struct net_device *primary_dev; + struct net_device *standby_dev; + struct rtnl_link_stats64 primary_stats; + struct rtnl_link_stats64 standby_stats; + struct rtnl_link_stats64 failover_stats; + spinlock_t stats_lock; +}; + +enum nfulnl_msg_types { + NFULNL_MSG_PACKET = 0, + NFULNL_MSG_CONFIG = 1, + NFULNL_MSG_MAX = 2, +}; + +struct nfulnl_msg_packet_hdr { + __be16 hw_protocol; + __u8 hook; + __u8 _pad; +}; + +struct nfulnl_msg_packet_hw { + __be16 hw_addrlen; + __u16 _pad; + __u8 hw_addr[8]; +}; + +struct nfulnl_msg_packet_timestamp { + __be64 sec; + __be64 usec; +}; + +enum nfulnl_vlan_attr { + NFULA_VLAN_UNSPEC = 0, + NFULA_VLAN_PROTO = 1, + NFULA_VLAN_TCI = 2, + __NFULA_VLAN_MAX = 3, +}; + +enum nfulnl_attr_type { + NFULA_UNSPEC = 0, + NFULA_PACKET_HDR = 1, + NFULA_MARK = 2, + NFULA_TIMESTAMP = 3, + NFULA_IFINDEX_INDEV = 4, + NFULA_IFINDEX_OUTDEV = 5, + NFULA_IFINDEX_PHYSINDEV = 6, + NFULA_IFINDEX_PHYSOUTDEV = 7, + NFULA_HWADDR = 8, + NFULA_PAYLOAD = 9, + NFULA_PREFIX = 10, + NFULA_UID = 11, + NFULA_SEQ = 12, + NFULA_SEQ_GLOBAL = 13, + NFULA_GID = 14, + NFULA_HWTYPE = 15, + NFULA_HWHEADER = 16, + NFULA_HWLEN = 17, + NFULA_CT = 18, + NFULA_CT_INFO = 19, + NFULA_VLAN = 20, + NFULA_L2HDR = 21, + __NFULA_MAX = 22, +}; + +enum nfulnl_msg_config_cmds { + NFULNL_CFG_CMD_NONE = 0, + NFULNL_CFG_CMD_BIND = 1, + NFULNL_CFG_CMD_UNBIND = 2, + NFULNL_CFG_CMD_PF_BIND = 3, + NFULNL_CFG_CMD_PF_UNBIND = 4, +}; + +struct nfulnl_msg_config_cmd { + __u8 command; +}; + +struct nfulnl_msg_config_mode { + __be32 copy_range; + __u8 copy_mode; + __u8 _pad; +} __attribute__((packed)); + +enum nfulnl_attr_config { + NFULA_CFG_UNSPEC = 0, + NFULA_CFG_CMD = 1, + NFULA_CFG_MODE = 2, + NFULA_CFG_NLBUFSIZ = 3, + NFULA_CFG_TIMEOUT = 4, + NFULA_CFG_QTHRESH = 5, + NFULA_CFG_FLAGS = 6, + __NFULA_CFG_MAX = 7, +}; + +struct nfulnl_instance { + struct hlist_node hlist; + spinlock_t lock; + refcount_t use; + unsigned int qlen; + struct sk_buff *skb; + struct timer_list timer; + struct net *net; + netns_tracker ns_tracker; + struct user_namespace *peer_user_ns; + u32 peer_portid; + unsigned int flushtimeout; + unsigned int nlbufsiz; + unsigned int qthreshold; + u_int32_t copy_range; + u_int32_t seq; + u_int16_t group_num; + u_int16_t flags; + u_int8_t copy_mode; + struct callback_head rcu; +}; + +struct nfnl_log_net { + spinlock_t instances_lock; + struct hlist_head instance_table[16]; + atomic_t global_seq; +}; + +struct eprobe_trace_entry_head { + struct trace_entry ent; +}; + +struct trace_eprobe { + const char *event_system; + const char *event_name; + char *filter_str; + struct trace_event_call *event; + struct dyn_event devent; + struct trace_probe tp; +}; + +struct eprobe_data { + struct trace_event_file *file; + struct trace_eprobe *ep; +}; + +struct wait_page_key { + struct folio *folio; + int bit_nr; + int page_match; +}; + +struct trace_event_raw_mm_filemap_op_page_cache { + struct trace_entry ent; + long unsigned int pfn; + long unsigned int i_ino; + long unsigned int index; + dev_t s_dev; + unsigned char order; + char __data[0]; +}; + +struct trace_event_raw_filemap_set_wb_err { + struct trace_entry ent; + long unsigned int i_ino; + dev_t s_dev; + errseq_t errseq; + char __data[0]; +}; + +struct trace_event_raw_file_check_and_advance_wb_err { + struct trace_entry ent; + struct file *file; + long unsigned int i_ino; + dev_t s_dev; + errseq_t old; + errseq_t new; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_filemap_op_page_cache {}; + +struct trace_event_data_offsets_filemap_set_wb_err {}; + +struct trace_event_data_offsets_file_check_and_advance_wb_err {}; + +typedef void (*btf_trace_mm_filemap_delete_from_page_cache)(void *, struct folio *); + +typedef void (*btf_trace_mm_filemap_add_to_page_cache)(void *, struct folio *); + +typedef void (*btf_trace_filemap_set_wb_err)(void *, struct address_space *, errseq_t); + +typedef void (*btf_trace_file_check_and_advance_wb_err)(void *, struct file *, errseq_t); + +enum behavior { + EXCLUSIVE = 0, + SHARED = 1, + DROP = 2, +}; + +struct io_timeout_data { + struct io_kiocb *req; + struct hrtimer timer; + struct timespec64 ts; + enum hrtimer_mode mode; + u32 flags; +}; + +struct io_timeout { + struct file *file; + u32 off; + u32 target_seq; + struct list_head list; + struct io_kiocb *head; + struct io_kiocb *prev; +}; + +struct io_timeout_rem { + struct file *file; + u64 addr; + struct timespec64 ts; + u32 flags; + bool ltimeout; +}; + +struct xxh32_state { + uint32_t total_len_32; + uint32_t large_len; + uint32_t v1; + uint32_t v2; + uint32_t v3; + uint32_t v4; + uint32_t mem32[4]; + uint32_t memsize; +}; + +struct its_vpe; + +struct its_vm { + struct fwnode_handle *fwnode; + struct irq_domain *domain; + struct page *vprop_page; + struct its_vpe **vpes; + int nr_vpes; + irq_hw_number_t db_lpi_base; + long unsigned int *db_bitmap; + int nr_db_lpis; + u32 vlpi_count[16]; +}; + +struct its_vpe { + struct page *vpt_page; + struct its_vm *its_vm; + atomic_t vlpi_count; + int irq; + irq_hw_number_t vpe_db_lpi; + bool resident; + bool ready; + union { + struct { + int vpe_proxy_event; + bool idai; + }; + struct { + struct fwnode_handle *fwnode; + struct irq_domain *sgi_domain; + struct { + u8 priority; + bool enabled; + bool group; + } sgi_config[16]; + atomic_t vmapp_count; + }; + }; + raw_spinlock_t vpe_lock; + u16 col_idx; + u16 vpe_id; + bool pending_last; +}; + +struct its_vlpi_map { + struct its_vm *vm; + struct its_vpe *vpe; + u32 vintid; + u8 properties; + bool db_enabled; +}; + +enum its_vcpu_info_cmd_type { + MAP_VLPI = 0, + GET_VLPI = 1, + PROP_UPDATE_VLPI = 2, + PROP_UPDATE_AND_INV_VLPI = 3, + SCHEDULE_VPE = 4, + DESCHEDULE_VPE = 5, + COMMIT_VPE = 6, + INVALL_VPE = 7, + PROP_UPDATE_VSGI = 8, +}; + +struct its_cmd_info { + enum its_vcpu_info_cmd_type cmd_type; + union { + struct its_vlpi_map *map; + u8 config; + bool req_db; + struct { + bool g0en; + bool g1en; + }; + struct { + u8 priority; + bool group; + }; + }; +}; + +struct acpi_table_madt { + struct acpi_table_header header; + u32 address; + u32 flags; +}; + +struct acpi_madt_local_apic { + struct acpi_subtable_header header; + u8 processor_id; + u8 id; + u32 lapic_flags; +}; + +struct acpi_madt_local_sapic { + struct acpi_subtable_header header; + u8 processor_id; + u8 id; + u8 eid; + u8 reserved[3]; + u32 lapic_flags; + u32 uid; + char uid_string[1]; +} __attribute__((packed)); + +struct acpi_madt_local_x2apic { + struct acpi_subtable_header header; + u16 reserved; + u32 local_apic_id; + u32 lapic_flags; + u32 uid; +}; + +typedef u32 (*acpi_sci_handler)(void *); + +struct acpi_sci_handler_info { + struct acpi_sci_handler_info *next; + acpi_sci_handler address; + void *context; +}; + +struct acpi_comment_node { + char *comment; + struct acpi_comment_node *next; +}; + +struct uart_match { + struct uart_port *port; + struct uart_driver *driver; +}; + +struct nsim_dev_dummy_reporter_ctx { + char *break_msg; +}; + +struct gre_protocol { + int (*handler)(struct sk_buff *); + void (*err_handler)(struct sk_buff *, u32); +}; + +struct _strp_msg { + struct strp_msg strp; + int accum_len; +}; + +struct tls_msg { + u8 control; +}; + +struct sk_skb_cb { + unsigned char data[20]; + unsigned char pad[4]; + struct _strp_msg strp; + struct tls_msg tls; + u64 temp_reg; +}; + +enum lsm_rule_types { + LSM_OBJ_USER = 0, + LSM_OBJ_ROLE = 1, + LSM_OBJ_TYPE = 2, + LSM_SUBJ_USER = 3, + LSM_SUBJ_ROLE = 4, + LSM_SUBJ_TYPE = 5, +}; + +enum policy_types { + ORIGINAL_TCB = 1, + DEFAULT_TCB = 2, +}; + +enum policy_rule_list { + IMA_DEFAULT_POLICY = 1, + IMA_CUSTOM_POLICY = 2, +}; + +struct ima_rule_opt_list { + size_t count; + char *items[0]; +}; + +struct ima_rule_entry { + struct list_head list; + int action; + unsigned int flags; + enum ima_hooks func; + int mask; + long unsigned int fsmagic; + uuid_t fsuuid; + kuid_t uid; + kgid_t gid; + kuid_t fowner; + kgid_t fgroup; + bool (*uid_op)(kuid_t, kuid_t); + bool (*gid_op)(kgid_t, kgid_t); + bool (*fowner_op)(vfsuid_t, kuid_t); + bool (*fgroup_op)(vfsgid_t, kgid_t); + int pcr; + unsigned int allowed_algos; + struct { + void *rule; + char *args_p; + int type; + } lsm[6]; + char *fsname; + struct ima_rule_opt_list *keyrings; + struct ima_rule_opt_list *label; + struct ima_template_desc *template; +}; + +enum policy_opt { + Opt_measure = 0, + Opt_dont_measure = 1, + Opt_appraise = 2, + Opt_dont_appraise = 3, + Opt_audit = 4, + Opt_hash = 5, + Opt_dont_hash = 6, + Opt_obj_user = 7, + Opt_obj_role = 8, + Opt_obj_type = 9, + Opt_subj_user = 10, + Opt_subj_role = 11, + Opt_subj_type = 12, + Opt_func = 13, + Opt_mask = 14, + Opt_fsmagic = 15, + Opt_fsname = 16, + Opt_fsuuid = 17, + Opt_uid_eq = 18, + Opt_euid_eq = 19, + Opt_gid_eq = 20, + Opt_egid_eq = 21, + Opt_fowner_eq = 22, + Opt_fgroup_eq = 23, + Opt_uid_gt = 24, + Opt_euid_gt = 25, + Opt_gid_gt = 26, + Opt_egid_gt = 27, + Opt_fowner_gt = 28, + Opt_fgroup_gt = 29, + Opt_uid_lt = 30, + Opt_euid_lt = 31, + Opt_gid_lt = 32, + Opt_egid_lt = 33, + Opt_fowner_lt = 34, + Opt_fgroup_lt = 35, + Opt_digest_type = 36, + Opt_appraise_type = 37, + Opt_appraise_flag = 38, + Opt_appraise_algos = 39, + Opt_permit_directio = 40, + Opt_pcr = 41, + Opt_template = 42, + Opt_keyrings = 43, + Opt_label = 44, + Opt_err___4 = 45, +}; + +enum { + mask_exec = 0, + mask_write = 1, + mask_read = 2, + mask_append = 3, +}; + +struct iov_iter_state { + size_t iov_offset; + size_t count; + long unsigned int nr_segs; +}; + +typedef s32 compat_ssize_t; + +struct compat_iovec { + compat_uptr_t iov_base; + compat_size_t iov_len; +}; + +struct fib_rule_uid_range { + __u32 start; + __u32 end; +}; + +struct fib_rule_notifier_info { + struct fib_notifier_info info; + struct fib_rule *rule; +}; + +union efi_rng_protocol; + +typedef union efi_rng_protocol efi_rng_protocol_t; + +union efi_rng_protocol { + struct { + efi_status_t (*get_info)(efi_rng_protocol_t *, long unsigned int *, efi_guid_t *); + efi_status_t (*get_rng)(efi_rng_protocol_t *, efi_guid_t *, long unsigned int, u8 *); + }; + struct { + u32 get_info; + u32 get_rng; + } mixed_mode; +}; + +struct bpf_iter__bpf_map_elem { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_map *map; + }; + union { + void *key; + }; + union { + void *value; + }; +}; + +enum bpf_text_poke_type { + BPF_MOD_CALL = 0, + BPF_MOD_JUMP = 1, +}; + +struct bpf_iter_seq_array_map_info { + struct bpf_map *map; + void *percpu_value_buf; + u32 index; +}; + +struct prog_poke_elem { + struct list_head list; + struct bpf_prog_aux *aux; +}; + +struct crypto_rfc3686_ctx { + struct crypto_skcipher *child; + u8 nonce[4]; +}; + +struct crypto_rfc3686_req_ctx { + u8 iv[16]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct skcipher_request subreq; +}; + +enum { + LINUX_RAID_PARTITION___2 = 253, +}; + +struct sgi_volume { + s8 name[8]; + __be32 block_num; + __be32 num_bytes; +}; + +struct sgi_partition { + __be32 num_blocks; + __be32 first_block; + __be32 type; +}; + +struct sgi_disklabel { + __be32 magic_mushroom; + __be16 root_part_num; + __be16 swap_part_num; + s8 boot_file[16]; + u8 _unused0[48]; + struct sgi_volume volume[15]; + struct sgi_partition partitions[16]; + __be32 csum; + __be32 _unused1; +}; + +struct acpi_processor_errata { + u8 smp; + struct { + u8 throttle: 1; + u8 fdma: 1; + u8 reserved: 6; + u32 bmisx; + } piix4; +}; + +struct builtin_fw { + char *name; + void *data; + long unsigned int size; +}; + +struct pps_kinfo { + __u32 assert_sequence; + __u32 clear_sequence; + struct pps_ktime assert_tu; + struct pps_ktime clear_tu; + int current_mode; +}; + +struct pps_fdata { + struct pps_kinfo info; + struct pps_ktime timeout; +}; + +struct pps_bind_args { + int tsformat; + int edge; + int consumer; +}; + +struct xfrm_spi_skb_cb { + struct xfrm_tunnel_skb_cb header; + unsigned int daddroff; + unsigned int family; + __be32 seq; +}; + +struct clock_data { + seqcount_latch_t seq; + struct clock_read_data read_data[2]; + ktime_t wrap_kt; + long unsigned int rate; + u64 (*actual_read_sched_clock)(); +}; + +enum tlb_flush_reason { + TLB_FLUSH_ON_TASK_SWITCH = 0, + TLB_REMOTE_SHOOTDOWN = 1, + TLB_LOCAL_SHOOTDOWN = 2, + TLB_LOCAL_MM_SHOOTDOWN = 3, + TLB_REMOTE_SEND_IPI = 4, + NR_TLB_FLUSH_REASONS = 5, +}; + +struct trace_event_raw_tlb_flush { + struct trace_entry ent; + int reason; + long unsigned int pages; + char __data[0]; +}; + +struct trace_event_data_offsets_tlb_flush {}; + +typedef void (*btf_trace_tlb_flush)(void *, int, long unsigned int); + +struct trace_event_raw_mm_migrate_pages { + struct trace_entry ent; + long unsigned int succeeded; + long unsigned int failed; + long unsigned int thp_succeeded; + long unsigned int thp_failed; + long unsigned int thp_split; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_raw_mm_migrate_pages_start { + struct trace_entry ent; + enum migrate_mode mode; + int reason; + char __data[0]; +}; + +struct trace_event_raw_migration_pte { + struct trace_entry ent; + long unsigned int addr; + long unsigned int pte; + int order; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_migrate_pages {}; + +struct trace_event_data_offsets_mm_migrate_pages_start {}; + +struct trace_event_data_offsets_migration_pte {}; + +typedef void (*btf_trace_mm_migrate_pages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, enum migrate_mode, int); + +typedef void (*btf_trace_mm_migrate_pages_start)(void *, enum migrate_mode, int); + +typedef void (*btf_trace_set_migration_pte)(void *, long unsigned int, long unsigned int, int); + +typedef void (*btf_trace_remove_migration_pte)(void *, long unsigned int, long unsigned int, int); + +struct folio_referenced_arg { + int mapcount; + int referenced; + long unsigned int vm_flags; + struct mem_cgroup *memcg; +}; + +struct ei_entry { + struct list_head list; + long unsigned int start_addr; + long unsigned int end_addr; + int etype; + void *priv; +}; + +struct acpi_connection_info { + u8 *connection; + u16 length; + u8 access_length; +}; + +struct acpi_ffh_info { + u64 offset; + u64 length; +}; + +struct acpi_reg_walk_info { + u32 function; + u32 reg_run_count; + acpi_adr_space_type space_id; +}; + +struct virtio_pci_vq_info { + struct virtqueue *vq; + struct list_head node; + unsigned int msix_vector; +}; + +struct virtio_pci_device { + struct virtio_device vdev; + struct pci_dev *pci_dev; + struct virtio_pci_legacy_device ldev; + struct virtio_pci_modern_device mdev; + bool is_legacy; + u8 *isr; + spinlock_t lock; + struct list_head virtqueues; + struct virtio_pci_vq_info **vqs; + int msix_enabled; + int intx_enabled; + cpumask_var_t *msix_affinity_masks; + char (*msix_names)[256]; + unsigned int msix_vectors; + unsigned int msix_used_vectors; + bool per_vq_vectors; + struct virtqueue * (*setup_vq)(struct virtio_pci_device *, struct virtio_pci_vq_info *, unsigned int, void (*)(struct virtqueue *), const char *, bool, u16); + void (*del_vq)(struct virtio_pci_vq_info *); + u16 (*config_vector)(struct virtio_pci_device *, u16); +}; + +typedef unsigned int __kernel_old_dev_t; + +enum { + LO_FLAGS_READ_ONLY = 1, + LO_FLAGS_AUTOCLEAR = 4, + LO_FLAGS_PARTSCAN = 8, + LO_FLAGS_DIRECT_IO = 16, +}; + +struct loop_info { + int lo_number; + __kernel_old_dev_t lo_device; + long unsigned int lo_inode; + __kernel_old_dev_t lo_rdevice; + int lo_offset; + int lo_encrypt_type; + int lo_encrypt_key_size; + int lo_flags; + char lo_name[64]; + unsigned char lo_encrypt_key[32]; + long unsigned int lo_init[2]; + char reserved[4]; +}; + +struct loop_info64 { + __u64 lo_device; + __u64 lo_inode; + __u64 lo_rdevice; + __u64 lo_offset; + __u64 lo_sizelimit; + __u32 lo_number; + __u32 lo_encrypt_type; + __u32 lo_encrypt_key_size; + __u32 lo_flags; + __u8 lo_file_name[64]; + __u8 lo_crypt_name[64]; + __u8 lo_encrypt_key[32]; + __u64 lo_init[2]; +}; + +struct loop_config { + __u32 fd; + __u32 block_size; + struct loop_info64 info; + __u64 __reserved[8]; +}; + +enum { + Lo_unbound = 0, + Lo_bound = 1, + Lo_rundown = 2, + Lo_deleting = 3, +}; + +struct loop_device { + int lo_number; + loff_t lo_offset; + loff_t lo_sizelimit; + int lo_flags; + char lo_file_name[64]; + struct file *lo_backing_file; + struct block_device *lo_device; + gfp_t old_gfp_mask; + spinlock_t lo_lock; + int lo_state; + spinlock_t lo_work_lock; + struct workqueue_struct *workqueue; + struct work_struct rootcg_work; + struct list_head rootcg_cmd_list; + struct list_head idle_worker_list; + struct rb_root worker_tree; + struct timer_list timer; + bool use_dio; + bool sysfs_inited; + struct request_queue *lo_queue; + struct blk_mq_tag_set tag_set; + struct gendisk *lo_disk; + struct mutex lo_mutex; + bool idr_visible; +}; + +struct loop_cmd { + struct list_head list_entry; + bool use_aio; + atomic_t ref; + long int ret; + struct kiocb iocb; + struct bio_vec *bvec; + struct cgroup_subsys_state *blkcg_css; + struct cgroup_subsys_state *memcg_css; +}; + +struct loop_worker { + struct rb_node rb_node; + struct work_struct work; + struct list_head cmd_list; + struct list_head idle_list; + struct loop_device *lo; + struct cgroup_subsys_state *blkcg_css; + long unsigned int last_ran_at; +}; + +struct xfrm_input_afinfo { + u8 family; + bool is_ipip; + int (*callback)(struct sk_buff *, u8, int); +}; + +struct xfrm6_protocol { + int (*handler)(struct sk_buff *); + int (*input_handler)(struct sk_buff *, int, __be32, int); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32); + struct xfrm6_protocol *next; + int priority; +}; + +enum con_flush_mode { + CONSOLE_FLUSH_PENDING = 0, + CONSOLE_REPLAY_ALL = 1, +}; + +struct kmsg_dump_iter { + u64 cur_seq; + u64 next_seq; +}; + +struct kmsg_dumper { + struct list_head list; + void (*dump)(struct kmsg_dumper *, enum kmsg_dump_reason); + enum kmsg_dump_reason max_reason; + bool registered; +}; + +struct trace_event_raw_console { + struct trace_entry ent; + u32 __data_loc_msg; + char __data[0]; +}; + +struct trace_event_data_offsets_console { + u32 msg; +}; + +typedef void (*btf_trace_console)(void *, const char *, size_t); + +struct console_cmdline { + char name[16]; + int index; + bool user_specified; + char *options; +}; + +enum printk_info_flags { + LOG_NEWLINE = 2, + LOG_CONT = 8, +}; + +enum devkmsg_log_bits { + __DEVKMSG_LOG_BIT_ON = 0, + __DEVKMSG_LOG_BIT_OFF = 1, + __DEVKMSG_LOG_BIT_LOCK = 2, +}; + +enum devkmsg_log_masks { + DEVKMSG_LOG_MASK_ON = 1, + DEVKMSG_LOG_MASK_OFF = 2, + DEVKMSG_LOG_MASK_LOCK = 4, +}; + +enum con_msg_format_flags { + MSG_FORMAT_DEFAULT = 0, + MSG_FORMAT_SYSLOG = 1, +}; + +struct latched_seq { + seqcount_latch_t latch; + u64 val[2]; +}; + +struct devkmsg_user { + atomic64_t seq; + struct ratelimit_state rs; + struct mutex lock; + char buf[8192]; + struct printk_info info; + char text_buf[8192]; + struct printk_record record; +}; + +struct d_partition { + __le32 p_size; + __le32 p_offset; + __le32 p_fsize; + u8 p_fstype; + u8 p_frag; + __le16 p_cpg; +}; + +struct disklabel { + __le32 d_magic; + __le16 d_type; + __le16 d_subtype; + u8 d_typename[16]; + u8 d_packname[16]; + __le32 d_secsize; + __le32 d_nsectors; + __le32 d_ntracks; + __le32 d_ncylinders; + __le32 d_secpercyl; + __le32 d_secprtunit; + __le16 d_sparespertrack; + __le16 d_sparespercyl; + __le32 d_acylinders; + __le16 d_rpm; + __le16 d_interleave; + __le16 d_trackskew; + __le16 d_cylskew; + __le32 d_headswitch; + __le32 d_trkseek; + __le32 d_flags; + __le32 d_drivedata[5]; + __le32 d_spare[5]; + __le32 d_magic2; + __le16 d_checksum; + __le16 d_npartitions; + __le32 d_bbsize; + __le32 d_sbsize; + struct d_partition d_partitions[18]; +}; + +typedef struct { + const uint8_t *externalDict; + size_t extDictSize; + const uint8_t *prefixEnd; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +typedef union { + long long unsigned int table[4]; + LZ4_streamDecode_t_internal internal_donotuse; +} LZ4_streamDecode_t; + +typedef uintptr_t uptrval; + +typedef enum { + noDict = 0, + withPrefix64k = 1, + usingExtDict = 2, +} dict_directive; + +typedef enum { + endOnOutputSize = 0, + endOnInputSize = 1, +} endCondition_directive; + +typedef enum { + decode_full_block = 0, + partial_decode = 1, +} earlyEnd_directive; + +struct pci_bus_resource { + struct list_head list; + struct resource *res; + unsigned int flags; +}; + +struct apd_private_data; + +struct apd_device_desc { + unsigned int fixed_clk_rate; + struct property_entry *properties; + int (*setup)(struct apd_private_data *); +}; + +struct apd_private_data { + struct clk *clk; + struct acpi_device *adev; + const struct apd_device_desc *dev_desc; +}; + +struct amba_id { + unsigned int id; + unsigned int mask; + void *data; +}; + +struct amba_driver { + struct device_driver drv; + int (*probe)(struct amba_device *, const struct amba_id *); + void (*remove)(struct amba_device *); + void (*shutdown)(struct amba_device *); + const struct amba_id *id_table; + bool driver_managed_dma; +}; + +enum SS4_PACKET_ID { + SS4_PACKET_ID_IDLE = 0, + SS4_PACKET_ID_ONE = 1, + SS4_PACKET_ID_TWO = 2, + SS4_PACKET_ID_MULTI = 3, + SS4_PACKET_ID_STICK = 4, +}; + +enum V7_PACKET_ID { + V7_PACKET_ID_IDLE = 0, + V7_PACKET_ID_TWO = 1, + V7_PACKET_ID_MULTI = 2, + V7_PACKET_ID_NEW = 3, + V7_PACKET_ID_UNKNOWN = 4, +}; + +struct alps_protocol_info { + u16 version; + u8 byte0; + u8 mask0; + unsigned int flags; +}; + +struct alps_model_info { + u8 signature[3]; + struct alps_protocol_info protocol_info; +}; + +struct alps_nibble_commands { + int command; + unsigned char data; +}; + +struct alps_bitmap_point { + int start_bit; + int num_bits; +}; + +struct alps_fields { + unsigned int x_map; + unsigned int y_map; + unsigned int fingers; + int pressure; + struct input_mt_pos st; + struct input_mt_pos mt[4]; + unsigned int first_mp: 1; + unsigned int is_mp: 1; + unsigned int left: 1; + unsigned int right: 1; + unsigned int middle: 1; + unsigned int ts_left: 1; + unsigned int ts_right: 1; + unsigned int ts_middle: 1; +}; + +struct alps_data { + struct psmouse *psmouse; + struct input_dev *dev2; + struct input_dev *dev3; + char phys2[32]; + char phys3[32]; + struct delayed_work dev3_register_work; + const struct alps_nibble_commands *nibble_commands; + int addr_command; + u16 proto_version; + u8 byte0; + u8 mask0; + u8 dev_id[3]; + u8 fw_ver[3]; + int flags; + int x_max; + int y_max; + int x_bits; + int y_bits; + unsigned int x_res; + unsigned int y_res; + int (*hw_init)(struct psmouse *); + void (*process_packet)(struct psmouse *); + int (*decode_fields)(struct alps_fields *, unsigned char *, struct psmouse *); + void (*set_abs_params)(struct alps_data *, struct input_dev *); + int prev_fin; + int multi_packet; + int second_touch; + unsigned char multi_data[6]; + struct alps_fields f; + u8 quirks; + struct timer_list timer; +}; + +struct crypto_queue { + struct list_head list; + struct list_head *backlog; + unsigned int qlen; + unsigned int max_qlen; +}; + +struct virtio_crypto_ctrl_header { + __le32 opcode; + __le32 algo; + __le32 flag; + __le32 queue_id; +}; + +struct virtio_crypto_cipher_session_para { + __le32 algo; + __le32 keylen; + __le32 op; + __le32 padding; +}; + +struct virtio_crypto_session_input { + __le64 session_id; + __le32 status; + __le32 padding; +}; + +struct virtio_crypto_cipher_session_req { + struct virtio_crypto_cipher_session_para para; + __u8 padding[32]; +}; + +struct virtio_crypto_hash_session_para { + __le32 algo; + __le32 hash_result_len; + __u8 padding[8]; +}; + +struct virtio_crypto_hash_create_session_req { + struct virtio_crypto_hash_session_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_mac_session_para { + __le32 algo; + __le32 hash_result_len; + __le32 auth_key_len; + __le32 padding; +}; + +struct virtio_crypto_mac_create_session_req { + struct virtio_crypto_mac_session_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_aead_session_para { + __le32 algo; + __le32 key_len; + __le32 hash_result_len; + __le32 aad_len; + __le32 op; + __le32 padding; +}; + +struct virtio_crypto_aead_create_session_req { + struct virtio_crypto_aead_session_para para; + __u8 padding[32]; +}; + +struct virtio_crypto_rsa_session_para { + __le32 padding_algo; + __le32 hash_algo; +}; + +struct virtio_crypto_ecdsa_session_para { + __le32 curve_id; + __le32 padding; +}; + +struct virtio_crypto_akcipher_session_para { + __le32 algo; + __le32 keytype; + __le32 keylen; + union { + struct virtio_crypto_rsa_session_para rsa; + struct virtio_crypto_ecdsa_session_para ecdsa; + } u; +}; + +struct virtio_crypto_akcipher_create_session_req { + struct virtio_crypto_akcipher_session_para para; + __u8 padding[36]; +}; + +struct virtio_crypto_alg_chain_session_para { + __le32 alg_chain_order; + __le32 hash_mode; + struct virtio_crypto_cipher_session_para cipher_param; + union { + struct virtio_crypto_hash_session_para hash_param; + struct virtio_crypto_mac_session_para mac_param; + __u8 padding[16]; + } u; + __le32 aad_len; + __le32 padding; +}; + +struct virtio_crypto_alg_chain_session_req { + struct virtio_crypto_alg_chain_session_para para; +}; + +struct virtio_crypto_sym_create_session_req { + union { + struct virtio_crypto_cipher_session_req cipher; + struct virtio_crypto_alg_chain_session_req chain; + __u8 padding[48]; + } u; + __le32 op_type; + __le32 padding; +}; + +struct virtio_crypto_destroy_session_req { + __le64 session_id; + __u8 padding[48]; +}; + +struct virtio_crypto_op_ctrl_req { + struct virtio_crypto_ctrl_header header; + union { + struct virtio_crypto_sym_create_session_req sym_create_session; + struct virtio_crypto_hash_create_session_req hash_create_session; + struct virtio_crypto_mac_create_session_req mac_create_session; + struct virtio_crypto_aead_create_session_req aead_create_session; + struct virtio_crypto_akcipher_create_session_req akcipher_create_session; + struct virtio_crypto_destroy_session_req destroy_session; + __u8 padding[56]; + } u; +}; + +struct virtio_crypto_op_header { + __le32 opcode; + __le32 algo; + __le64 session_id; + __le32 flag; + __le32 padding; +}; + +struct virtio_crypto_cipher_para { + __le32 iv_len; + __le32 src_data_len; + __le32 dst_data_len; + __le32 padding; +}; + +struct virtio_crypto_hash_para { + __le32 src_data_len; + __le32 hash_result_len; +}; + +struct virtio_crypto_mac_para { + struct virtio_crypto_hash_para hash; +}; + +struct virtio_crypto_aead_para { + __le32 iv_len; + __le32 aad_len; + __le32 src_data_len; + __le32 dst_data_len; +}; + +struct virtio_crypto_cipher_data_req { + struct virtio_crypto_cipher_para para; + __u8 padding[24]; +}; + +struct virtio_crypto_hash_data_req { + struct virtio_crypto_hash_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_mac_data_req { + struct virtio_crypto_mac_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_alg_chain_data_para { + __le32 iv_len; + __le32 src_data_len; + __le32 dst_data_len; + __le32 cipher_start_src_offset; + __le32 len_to_cipher; + __le32 hash_start_src_offset; + __le32 len_to_hash; + __le32 aad_len; + __le32 hash_result_len; + __le32 reserved; +}; + +struct virtio_crypto_alg_chain_data_req { + struct virtio_crypto_alg_chain_data_para para; +}; + +struct virtio_crypto_sym_data_req { + union { + struct virtio_crypto_cipher_data_req cipher; + struct virtio_crypto_alg_chain_data_req chain; + __u8 padding[40]; + } u; + __le32 op_type; + __le32 padding; +}; + +struct virtio_crypto_aead_data_req { + struct virtio_crypto_aead_para para; + __u8 padding[32]; +}; + +struct virtio_crypto_akcipher_para { + __le32 src_data_len; + __le32 dst_data_len; +}; + +struct virtio_crypto_akcipher_data_req { + struct virtio_crypto_akcipher_para para; + __u8 padding[40]; +}; + +struct virtio_crypto_op_data_req { + struct virtio_crypto_op_header header; + union { + struct virtio_crypto_sym_data_req sym_req; + struct virtio_crypto_hash_data_req hash_req; + struct virtio_crypto_mac_data_req mac_req; + struct virtio_crypto_aead_data_req aead_req; + struct virtio_crypto_akcipher_data_req akcipher_req; + __u8 padding[48]; + } u; +}; + +struct virtio_crypto_inhdr { + __u8 status; +}; + +struct crypto_engine { + char name[30]; + bool idling; + bool busy; + bool running; + bool retry_support; + struct list_head list; + spinlock_t queue_lock; + struct crypto_queue queue; + struct device *dev; + bool rt; + int (*prepare_crypt_hardware)(struct crypto_engine *); + int (*unprepare_crypt_hardware)(struct crypto_engine *); + int (*do_batch_requests)(struct crypto_engine *); + struct kthread_worker *kworker; + struct kthread_work pump_requests; + void *priv_data; + struct crypto_async_request *cur_req; +}; + +struct crypto_engine_op { + int (*prepare_request)(struct crypto_engine *, void *); + int (*unprepare_request)(struct crypto_engine *, void *); + int (*do_one_request)(struct crypto_engine *, void *); +}; + +struct crypto_engine_ctx { + struct crypto_engine_op op; +}; + +struct data_queue { + struct virtqueue *vq; + spinlock_t lock; + char name[32]; + struct crypto_engine *engine; +}; + +struct virtio_crypto { + struct virtio_device *vdev; + struct virtqueue *ctrl_vq; + struct data_queue *data_vq; + spinlock_t ctrl_lock; + u32 max_data_queues; + u32 curr_queue; + u32 crypto_services; + u32 cipher_algo_l; + u32 cipher_algo_h; + u32 hash_algo; + u32 mac_algo_l; + u32 mac_algo_h; + u32 aead_algo; + u32 akcipher_algo; + u32 max_cipher_key_len; + u32 max_auth_key_len; + u64 max_size; + long unsigned int status; + atomic_t ref_count; + struct list_head list; + struct module *owner; + uint8_t dev_id; + bool affinity_hint_set; +}; + +struct virtio_crypto_ctrl_request { + struct virtio_crypto_op_ctrl_req ctrl; + struct virtio_crypto_session_input input; + struct virtio_crypto_inhdr ctrl_status; + struct completion compl; +}; + +struct virtio_crypto_request; + +typedef void (*virtio_crypto_data_callback)(struct virtio_crypto_request *, int); + +struct virtio_crypto_request { + uint8_t status; + struct virtio_crypto_op_data_req *req_data; + struct scatterlist **sgs; + struct data_queue *dataq; + virtio_crypto_data_callback alg_cb; +}; + +struct virtio_crypto_rsa_ctx { + MPI n; +}; + +struct virtio_crypto_akcipher_ctx { + struct crypto_engine_ctx enginectx; + struct virtio_crypto *vcrypto; + struct crypto_akcipher *tfm; + bool session_valid; + __u64 session_id; + union { + struct virtio_crypto_rsa_ctx rsa_ctx; + }; +}; + +struct virtio_crypto_akcipher_request { + struct virtio_crypto_request base; + struct virtio_crypto_akcipher_ctx *akcipher_ctx; + struct akcipher_request *akcipher_req; + void *src_buf; + void *dst_buf; + uint32_t opcode; +}; + +struct virtio_crypto_akcipher_algo { + uint32_t algonum; + uint32_t service; + unsigned int active_devs; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct akcipher_alg algo; +}; + +struct tc_act_bpf { + __u32 index; + __u32 capab; + int action; + int refcnt; + int bindcnt; +}; + +enum { + TCA_ACT_BPF_UNSPEC = 0, + TCA_ACT_BPF_TM = 1, + TCA_ACT_BPF_PARMS = 2, + TCA_ACT_BPF_OPS_LEN = 3, + TCA_ACT_BPF_OPS = 4, + TCA_ACT_BPF_FD = 5, + TCA_ACT_BPF_NAME = 6, + TCA_ACT_BPF_PAD = 7, + TCA_ACT_BPF_TAG = 8, + TCA_ACT_BPF_ID = 9, + __TCA_ACT_BPF_MAX = 10, +}; + +struct tcf_bpf { + struct tc_action common; + struct bpf_prog *filter; + union { + u32 bpf_fd; + u16 bpf_num_ops; + }; + struct sock_filter *bpf_ops; + const char *bpf_name; +}; + +struct tcf_bpf_cfg { + struct bpf_prog *filter; + struct sock_filter *bpf_ops; + const char *bpf_name; + u16 bpf_num_ops; + bool is_ebpf; +}; + +typedef struct { + long unsigned int fds_bits[16]; +} __kernel_fd_set; + +typedef __kernel_fd_set fd_set; + +struct poll_table_entry { + struct file *filp; + __poll_t key; + wait_queue_entry_t wait; + wait_queue_head_t *wait_address; +}; + +struct poll_table_page; + +struct poll_wqueues { + poll_table pt; + struct poll_table_page *table; + struct task_struct *polling_task; + int triggered; + int error; + int inline_index; + struct poll_table_entry inline_entries[9]; +}; + +struct poll_table_page { + struct poll_table_page *next; + struct poll_table_entry *entry; + struct poll_table_entry entries[0]; +}; + +enum poll_time_type { + PT_TIMEVAL = 0, + PT_OLD_TIMEVAL = 1, + PT_TIMESPEC = 2, + PT_OLD_TIMESPEC = 3, +}; + +typedef struct { + long unsigned int *in; + long unsigned int *out; + long unsigned int *ex; + long unsigned int *res_in; + long unsigned int *res_out; + long unsigned int *res_ex; +} fd_set_bits; + +struct sigset_argpack { + sigset_t *p; + size_t size; +}; + +struct poll_list { + struct poll_list *next; + int len; + struct pollfd entries[0]; +}; + +struct pci_slot_attribute { + struct attribute attr; + ssize_t (*show)(struct pci_slot *, char *); + ssize_t (*store)(struct pci_slot *, const char *, size_t); +}; + +struct input_event { + __kernel_ulong_t __sec; + __kernel_ulong_t __usec; + __u16 type; + __u16 code; + __s32 value; +}; + +struct virtio_crypto_config { + __le32 status; + __le32 max_dataqueues; + __le32 crypto_services; + __le32 cipher_algo_l; + __le32 cipher_algo_h; + __le32 hash_algo; + __le32 mac_algo_l; + __le32 mac_algo_h; + __le32 aead_algo; + __le32 max_cipher_key_len; + __le32 max_auth_key_len; + __le32 akcipher_algo; + __le64 max_size; +}; + +struct nvmem_cell_info { + const char *name; + unsigned int offset; + unsigned int bytes; + unsigned int bit_offset; + unsigned int nbits; + struct device_node *np; +}; + +struct nvmem_cell_lookup { + const char *nvmem_name; + const char *cell_name; + const char *dev_id; + const char *con_id; + struct list_head node; +}; + +enum { + NVMEM_ADD = 1, + NVMEM_REMOVE = 2, + NVMEM_CELL_ADD = 3, + NVMEM_CELL_REMOVE = 4, +}; + +typedef int (*nvmem_reg_read_t)(void *, unsigned int, void *, size_t); + +typedef int (*nvmem_reg_write_t)(void *, unsigned int, void *, size_t); + +typedef int (*nvmem_cell_post_process_t)(void *, const char *, unsigned int, void *, size_t); + +enum nvmem_type { + NVMEM_TYPE_UNKNOWN = 0, + NVMEM_TYPE_EEPROM = 1, + NVMEM_TYPE_OTP = 2, + NVMEM_TYPE_BATTERY_BACKED = 3, + NVMEM_TYPE_FRAM = 4, +}; + +struct nvmem_keepout { + unsigned int start; + unsigned int end; + unsigned char value; +}; + +struct nvmem_config { + struct device *dev; + const char *name; + int id; + struct module *owner; + struct gpio_desc *wp_gpio; + const struct nvmem_cell_info *cells; + int ncells; + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + enum nvmem_type type; + bool read_only; + bool root_only; + bool ignore_wp; + struct device_node *of_node; + bool no_of_node; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + nvmem_cell_post_process_t cell_post_process; + int size; + int word_size; + int stride; + void *priv; + bool compat; + struct device *base_dev; +}; + +struct nvmem_cell_table { + const char *nvmem_name; + const struct nvmem_cell_info *cells; + size_t ncells; + struct list_head node; +}; + +struct nvmem_device { + struct module *owner; + struct device dev; + int stride; + int word_size; + int id; + struct kref refcnt; + size_t size; + bool read_only; + bool root_only; + int flags; + enum nvmem_type type; + struct bin_attribute eeprom; + struct device *base_dev; + struct list_head cells; + const struct nvmem_keepout *keepout; + unsigned int nkeepout; + nvmem_reg_read_t reg_read; + nvmem_reg_write_t reg_write; + nvmem_cell_post_process_t cell_post_process; + struct gpio_desc *wp_gpio; + void *priv; +}; + +struct nvmem_cell_entry { + const char *name; + int offset; + int bytes; + int bit_offset; + int nbits; + struct device_node *np; + struct nvmem_device *nvmem; + struct list_head node; +}; + +struct nvmem_cell { + struct nvmem_cell_entry *entry; + const char *id; +}; + +enum { + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN = 0, + ETHTOOL_UDP_TUNNEL_TYPE_GENEVE = 1, + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = 2, + __ETHTOOL_UDP_TUNNEL_TYPE_CNT = 3, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = 1, + ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = 2, + __ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT = 3, + ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = 2, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = 1, + ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = 2, + ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = 3, + __ETHTOOL_A_TUNNEL_UDP_TABLE_CNT = 4, + ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = 3, +}; + +enum { + ETHTOOL_A_TUNNEL_UDP_UNSPEC = 0, + ETHTOOL_A_TUNNEL_UDP_TABLE = 1, + __ETHTOOL_A_TUNNEL_UDP_CNT = 2, + ETHTOOL_A_TUNNEL_UDP_MAX = 1, +}; + +struct ethnl_tunnel_info_dump_ctx { + struct ethnl_req_info req_info; + int pos_hash; + int pos_idx; +}; + +struct pt_regs; + +struct clk { + struct clk_core *core; + struct device *dev; + const char *dev_id; + const char *con_id; + long unsigned int min_rate; + long unsigned int max_rate; + unsigned int exclusive_count; + struct hlist_node clks_node; +}; + +enum format_type { + FORMAT_TYPE_NONE = 0, + FORMAT_TYPE_WIDTH = 1, + FORMAT_TYPE_PRECISION = 2, + FORMAT_TYPE_CHAR = 3, + FORMAT_TYPE_STR = 4, + FORMAT_TYPE_PTR = 5, + FORMAT_TYPE_PERCENT_CHAR = 6, + FORMAT_TYPE_INVALID = 7, + FORMAT_TYPE_LONG_LONG = 8, + FORMAT_TYPE_ULONG = 9, + FORMAT_TYPE_LONG = 10, + FORMAT_TYPE_UBYTE = 11, + FORMAT_TYPE_BYTE = 12, + FORMAT_TYPE_USHORT = 13, + FORMAT_TYPE_SHORT = 14, + FORMAT_TYPE_UINT = 15, + FORMAT_TYPE_INT = 16, + FORMAT_TYPE_SIZE_T = 17, + FORMAT_TYPE_PTRDIFF = 18, +}; + +struct printf_spec { + unsigned int type: 8; + int field_width: 24; + unsigned int flags: 8; + unsigned int base: 8; + int precision: 16; +}; + +struct page_flags_fields { + int width; + int shift; + int mask; + const struct printf_spec *spec; + const char *name; +}; + +struct trace_event_raw_test_pages_isolated { + struct trace_entry ent; + long unsigned int start_pfn; + long unsigned int end_pfn; + long unsigned int fin_pfn; + char __data[0]; +}; + +struct trace_event_data_offsets_test_pages_isolated {}; + +typedef void (*btf_trace_test_pages_isolated)(void *, long unsigned int, long unsigned int, long unsigned int); + +struct ext4_fc_tl { + __le16 fc_tag; + __le16 fc_len; +}; + +struct ext4_fc_head { + __le32 fc_features; + __le32 fc_tid; +}; + +struct ext4_fc_add_range { + __le32 fc_ino; + __u8 fc_ex[12]; +}; + +struct ext4_fc_del_range { + __le32 fc_ino; + __le32 fc_lblk; + __le32 fc_len; +}; + +struct ext4_fc_dentry_info { + __le32 fc_parent_ino; + __le32 fc_ino; + __u8 fc_dname[0]; +}; + +struct ext4_fc_inode { + __le32 fc_ino; + __u8 fc_raw_inode[0]; +}; + +struct ext4_fc_tail { + __le32 fc_tid; + __le32 fc_crc; +}; + +enum { + EXT4_FC_STATUS_OK = 0, + EXT4_FC_STATUS_INELIGIBLE = 1, + EXT4_FC_STATUS_SKIPPED = 2, + EXT4_FC_STATUS_FAILED = 3, +}; + +struct ext4_fc_dentry_update { + int fcd_op; + int fcd_parent; + int fcd_ino; + struct qstr fcd_name; + unsigned char fcd_iname[32]; + struct list_head fcd_list; + struct list_head fcd_dilist; +}; + +struct __track_dentry_update_args { + struct dentry *dentry; + int op; +}; + +struct __track_range_args { + ext4_lblk_t start; + ext4_lblk_t end; +}; + +struct dentry_info_args { + int parent_ino; + int dname_len; + int ino; + int inode_len; + char *dname; +}; + +enum { + AML_FIELD_ACCESS_ANY = 0, + AML_FIELD_ACCESS_BYTE = 1, + AML_FIELD_ACCESS_WORD = 2, + AML_FIELD_ACCESS_DWORD = 3, + AML_FIELD_ACCESS_QWORD = 4, + AML_FIELD_ACCESS_BUFFER = 5, +}; + +struct subsys_dev_iter { + struct klist_iter ki; + const struct device_type *type; +}; + +struct subsys_interface { + const char *name; + struct bus_type *subsys; + struct list_head node; + int (*add_dev)(struct device *, struct subsys_interface *); + void (*remove_dev)(struct device *, struct subsys_interface *); +}; + +typedef int (*dummy_ops_test_ret_fn)(struct bpf_dummy_ops_state *, ...); + +struct bpf_dummy_ops_test_args { + u64 args[12]; + struct bpf_dummy_ops_state state; +}; + +struct sockaddr_xdp { + __u16 sxdp_family; + __u16 sxdp_flags; + __u32 sxdp_ifindex; + __u32 sxdp_queue_id; + __u32 sxdp_shared_umem_fd; +}; + +struct xdp_ring_offset { + __u64 producer; + __u64 consumer; + __u64 desc; + __u64 flags; +}; + +struct xdp_mmap_offsets { + struct xdp_ring_offset rx; + struct xdp_ring_offset tx; + struct xdp_ring_offset fr; + struct xdp_ring_offset cr; +}; + +struct xdp_umem_reg { + __u64 addr; + __u64 len; + __u32 chunk_size; + __u32 headroom; + __u32 flags; +}; + +struct xdp_statistics { + __u64 rx_dropped; + __u64 rx_invalid_descs; + __u64 tx_invalid_descs; + __u64 rx_ring_full; + __u64 rx_fill_ring_empty_descs; + __u64 tx_ring_empty_descs; +}; + +struct xdp_options { + __u32 flags; +}; + +struct xdp_ring_offset_v1 { + __u64 producer; + __u64 consumer; + __u64 desc; +}; + +struct xdp_mmap_offsets_v1 { + struct xdp_ring_offset_v1 rx; + struct xdp_ring_offset_v1 tx; + struct xdp_ring_offset_v1 fr; + struct xdp_ring_offset_v1 cr; +}; + +typedef u64 p4dval_t; + +struct reuseport_array { + struct bpf_map map; + struct sock *ptrs[0]; +}; + +struct keyctl_pkey_query { + __u32 supported_ops; + __u32 key_size; + __u16 max_data_size; + __u16 max_sig_size; + __u16 max_enc_size; + __u16 max_dec_size; + __u32 __spare[10]; +}; + +struct keyctl_pkey_params { + __s32 key_id; + __u32 in_len; + union { + __u32 out_len; + __u32 in2_len; + }; + __u32 __spare[7]; +}; + +enum { + Opt_err___5 = 0, + Opt_enc = 1, + Opt_hash___2 = 2, +}; + +typedef u32 acpi_event_status; + +struct acpi_table_ecdt { + struct acpi_table_header header; + struct acpi_generic_address control; + struct acpi_generic_address data; + u32 uid; + u8 gpe; + u8 id[1]; +} __attribute__((packed)); + +enum acpi_ec_event_state { + EC_EVENT_READY = 0, + EC_EVENT_IN_PROGRESS = 1, + EC_EVENT_COMPLETE = 2, +}; + +struct transaction; + +struct acpi_ec { + acpi_handle handle; + int gpe; + int irq; + long unsigned int command_addr; + long unsigned int data_addr; + bool global_lock; + long unsigned int flags; + long unsigned int reference_count; + struct mutex mutex; + wait_queue_head_t wait; + struct list_head list; + struct transaction *curr; + spinlock_t lock; + struct work_struct work; + long unsigned int timestamp; + enum acpi_ec_event_state event_state; + unsigned int events_to_process; + unsigned int events_in_progress; + unsigned int queries_in_progress; + bool busy_polling; + unsigned int polling_guard; +}; + +struct transaction { + const u8 *wdata; + u8 *rdata; + short unsigned int irq_count; + u8 command; + u8 wi; + u8 ri; + u8 wlen; + u8 rlen; + u8 flags; +}; + +typedef int (*acpi_ec_query_func)(void *); + +enum ec_command { + ACPI_EC_COMMAND_READ = 128, + ACPI_EC_COMMAND_WRITE = 129, + ACPI_EC_BURST_ENABLE = 130, + ACPI_EC_BURST_DISABLE = 131, + ACPI_EC_COMMAND_QUERY = 132, +}; + +enum { + EC_FLAGS_QUERY_ENABLED = 0, + EC_FLAGS_EVENT_HANDLER_INSTALLED = 1, + EC_FLAGS_EC_HANDLER_INSTALLED = 2, + EC_FLAGS_QUERY_METHODS_INSTALLED = 3, + EC_FLAGS_STARTED = 4, + EC_FLAGS_STOPPED = 5, + EC_FLAGS_EVENTS_MASKED = 6, +}; + +struct acpi_ec_query_handler { + struct list_head node; + acpi_ec_query_func func; + acpi_handle handle; + void *data; + u8 query_bit; + struct kref kref; +}; + +struct acpi_ec_query { + struct transaction transaction; + struct work_struct work; + struct acpi_ec_query_handler *handler; + struct acpi_ec *ec; +}; + +enum tc_link_layer { + TC_LINKLAYER_UNAWARE = 0, + TC_LINKLAYER_ETHERNET = 1, + TC_LINKLAYER_ATM = 2, +}; + +struct tc_ratespec { + unsigned char cell_log; + __u8 linklayer; + short unsigned int overhead; + short int cell_align; + short unsigned int mpu; + __u32 rate; +}; + +enum { + TCA_STAB_UNSPEC = 0, + TCA_STAB_BASE = 1, + TCA_STAB_DATA = 2, + __TCA_STAB_MAX = 3, +}; + +struct qdisc_rate_table { + struct tc_ratespec rate; + u32 data[256]; + struct qdisc_rate_table *next; + int refcnt; +}; + +enum qdisc_state_t { + __QDISC_STATE_SCHED = 0, + __QDISC_STATE_DEACTIVATED = 1, + __QDISC_STATE_MISSED = 2, + __QDISC_STATE_DRAINING = 3, +}; + +struct Qdisc_class_common { + u32 classid; + struct hlist_node hnode; +}; + +struct Qdisc_class_hash { + struct hlist_head *hash; + unsigned int hashsize; + unsigned int hashmask; + unsigned int hashelems; +}; + +struct qdisc_watchdog { + u64 last_expires; + struct hrtimer timer; + struct Qdisc *qdisc; +}; + +struct tc_query_caps_base { + enum tc_setup_type type; + void *caps; +}; + +enum tc_root_command { + TC_ROOT_GRAFT = 0, +}; + +struct tc_root_qopt_offload { + enum tc_root_command command; + u32 handle; + bool ingress; +}; + +struct check_loop_arg { + struct qdisc_walker w; + struct Qdisc *p; + int depth; +}; + +struct tcf_bind_args { + struct tcf_walker w; + long unsigned int base; + long unsigned int cl; + u32 classid; +}; + +struct tc_bind_class_args { + struct qdisc_walker w; + long unsigned int new_cl; + u32 portid; + u32 clid; +}; + +struct qdisc_dump_args { + struct qdisc_walker w; + struct sk_buff *skb; + struct netlink_callback *cb; +}; + +struct tcp_md5sig { + struct __kernel_sockaddr_storage tcpm_addr; + __u8 tcpm_flags; + __u8 tcpm_prefixlen; + __u16 tcpm_keylen; + int tcpm_ifindex; + __u8 tcpm_key[80]; +}; + +struct tcp_timewait_sock { + struct inet_timewait_sock tw_sk; + u32 tw_rcv_wnd; + u32 tw_ts_offset; + u32 tw_ts_recent; + u32 tw_last_oow_ack_time; + int tw_ts_recent_stamp; + u32 tw_tx_delay; + struct tcp_md5sig_key *tw_md5_key; +}; + +enum tcp_tw_status { + TCP_TW_SUCCESS = 0, + TCP_TW_RST = 1, + TCP_TW_ACK = 2, + TCP_TW_SYN = 3, +}; + +struct tcp4_pseudohdr { + __be32 saddr; + __be32 daddr; + __u8 pad; + __u8 protocol; + __be16 len; +}; + +struct tcp_md5sig_pool { + struct ahash_request *md5_req; + void *scratch; +}; + +enum tcp_seq_states { + TCP_SEQ_STATE_LISTENING = 0, + TCP_SEQ_STATE_ESTABLISHED = 1, +}; + +struct tcp_seq_afinfo { + sa_family_t family; +}; + +struct tcp_iter_state { + struct seq_net_private p; + enum tcp_seq_states state; + struct sock *syn_wait_sk; + int bucket; + int offset; + int sbucket; + int num; + loff_t last_pos; +}; + +struct bpf_tcp_iter_state { + struct tcp_iter_state state; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + struct sock **batch; + bool st_bucket_done; +}; + +struct bpf_iter__tcp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct sock_common *sk_common; + }; + uid_t uid; +}; + +struct bpf_iter_seq_prog_info { + u32 prog_id; +}; + +struct bpf_iter__bpf_prog { + union { + struct bpf_iter_meta *meta; + }; + union { + struct bpf_prog *prog; + }; +}; + +struct proc_fs_context { + struct pid_namespace *pid_ns; + unsigned int mask; + enum proc_hidepid hidepid; + int gid; + enum proc_pidonly pidonly; +}; + +enum proc_param { + Opt_gid___3 = 0, + Opt_hidepid = 1, + Opt_subset = 2, +}; + +struct kernfs_open_node { + struct callback_head callback_head; + atomic_t event; + wait_queue_head_t poll; + struct list_head files; + unsigned int nr_mmapped; + unsigned int nr_to_release; +}; + +enum bio_post_read_step { + STEP_INITIAL = 0, + STEP_DECRYPT = 1, + STEP_VERITY = 2, + STEP_MAX = 3, +}; + +struct bio_post_read_ctx { + struct bio *bio; + struct work_struct work; + unsigned int cur_step; + unsigned int enabled_steps; +}; + +struct fsverity_info; + +struct sem; + +struct sem_queue; + +struct sem_undo; + +struct semid_ds { + struct ipc_perm sem_perm; + __kernel_old_time_t sem_otime; + __kernel_old_time_t sem_ctime; + struct sem *sem_base; + struct sem_queue *sem_pending; + struct sem_queue **sem_pending_last; + struct sem_undo *undo; + short unsigned int sem_nsems; +}; + +struct sem { + int semval; + struct pid *sempid; + spinlock_t lock; + struct list_head pending_alter; + struct list_head pending_const; + time64_t sem_otime; + long: 64; +}; + +struct sem_queue { + struct list_head list; + struct task_struct *sleeper; + struct sem_undo *undo; + struct pid *pid; + int status; + struct sembuf *sops; + struct sembuf *blocking; + int nsops; + bool alter; + bool dupsop; +}; + +struct sem_undo { + struct list_head list_proc; + struct callback_head rcu; + struct sem_undo_list *ulp; + struct list_head list_id; + int semid; + short int *semadj; +}; + +struct semid64_ds { + struct ipc64_perm sem_perm; + long int sem_otime; + long int sem_ctime; + long unsigned int sem_nsems; + long unsigned int __unused3; + long unsigned int __unused4; +}; + +struct seminfo { + int semmap; + int semmni; + int semmns; + int semmnu; + int semmsl; + int semopm; + int semume; + int semusz; + int semvmx; + int semaem; +}; + +struct sem_undo_list { + refcount_t refcnt; + spinlock_t lock; + struct list_head list_proc; +}; + +struct sem_array { + struct kern_ipc_perm sem_perm; + time64_t sem_ctime; + struct list_head pending_alter; + struct list_head pending_const; + struct list_head list_id; + int sem_nsems; + int complex_count; + unsigned int use_global_lock; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sem sems[0]; +}; + +struct usage_priority { + __u32 usage; + bool global; + unsigned int slot_overwrite; +}; + +typedef bool (*hid_usage_cmp_t)(struct hid_usage *, unsigned int, unsigned int); + +enum ethtool_multicast_groups { + ETHNL_MCGRP_MONITOR = 0, +}; + +struct ethnl_dump_ctx { + const struct ethnl_request_ops *ops; + struct ethnl_req_info *req_info; + struct ethnl_reply_data *reply_data; + int pos_hash; + int pos_idx; +}; + +typedef void (*ethnl_notify_handler_t)(struct net_device *, unsigned int, const void *); + +enum { + SKB_FCLONE_UNAVAILABLE = 0, + SKB_FCLONE_ORIG = 1, + SKB_FCLONE_CLONE = 2, +}; + +struct sk_buff_fclones { + struct sk_buff skb1; + struct sk_buff skb2; + refcount_t fclone_ref; +}; + +enum { + TCP_NO_QUEUE = 0, + TCP_RECV_QUEUE = 1, + TCP_SEND_QUEUE = 2, + TCP_QUEUES_NR = 3, +}; + +enum tsq_flags { + TSQF_THROTTLED = 1, + TSQF_QUEUED = 2, + TCPF_TSQ_DEFERRED = 4, + TCPF_WRITE_TIMER_DEFERRED = 8, + TCPF_DELACK_TIMER_DEFERRED = 16, + TCPF_MTU_REDUCED_DEFERRED = 32, +}; + +enum { + BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, + BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, +}; + +struct tcp_out_options { + u16 options; + u16 mss; + u8 ws; + u8 num_sack_blocks; + u8 hash_size; + u8 bpf_opt_len; + __u8 *hash_location; + __u32 tsval; + __u32 tsecr; + struct tcp_fastopen_cookie *fastopen_cookie; + struct mptcp_out_options mptcp; +}; + +struct tsq_tasklet { + struct tasklet_struct tasklet; + struct list_head head; +}; + +struct profile_hit { + u32 pc; + u32 hits; +}; + +struct selinux_policy_convert_data; + +struct selinux_load_state { + struct selinux_policy *policy; + struct selinux_policy_convert_data *convert_data; +}; + +struct selinux_policy_convert_data { + struct convert_context_args args; + struct sidtab_convert_params sidtab_params; +}; + +struct selinux_audit_rule { + u32 au_seqno; + struct context au_ctxt; +}; + +enum { + IF_LINK_MODE_DEFAULT = 0, + IF_LINK_MODE_DORMANT = 1, + IF_LINK_MODE_TESTING = 2, +}; + +enum lw_bits { + LW_URGENT = 0, +}; + +struct rnd_state { + __u32 s1; + __u32 s2; + __u32 s3; + __u32 s4; +}; + +struct xdp_cpumap_stats { + unsigned int redirect; + unsigned int pass; + unsigned int drop; +}; + +struct bpf_binary_header { + u32 size; + int: 32; + u8 image[0]; +}; + +typedef void (*bpf_jit_fill_hole_t)(void *, unsigned int); + +struct bpf_prog_pack { + struct list_head list; + void *ptr; + long unsigned int bitmap[0]; +}; + +struct bpf_prog_dummy { + struct bpf_prog prog; +}; + +typedef u64 (*btf_bpf_user_rnd_u32)(); + +typedef u64 (*btf_bpf_get_raw_cpu_id)(); + +struct _bpf_dtab_netdev { + struct net_device *dev; +}; + +struct xdp_mem_allocator { + struct xdp_mem_info mem; + union { + void *allocator; + struct page_pool *page_pool; + }; + struct rhash_head node; + struct callback_head rcu; +}; + +struct trace_event_raw_xdp_exception { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_xdp_bulk_tx { + struct trace_entry ent; + int ifindex; + u32 act; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_xdp_redirect_template { + struct trace_entry ent; + int prog_id; + u32 act; + int ifindex; + int err; + int to_ifindex; + u32 map_id; + int map_index; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_kthread { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int sched; + unsigned int xdp_pass; + unsigned int xdp_drop; + unsigned int xdp_redirect; + char __data[0]; +}; + +struct trace_event_raw_xdp_cpumap_enqueue { + struct trace_entry ent; + int map_id; + u32 act; + int cpu; + unsigned int drops; + unsigned int processed; + int to_cpu; + char __data[0]; +}; + +struct trace_event_raw_xdp_devmap_xmit { + struct trace_entry ent; + int from_ifindex; + u32 act; + int to_ifindex; + int drops; + int sent; + int err; + char __data[0]; +}; + +struct trace_event_raw_mem_disconnect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + char __data[0]; +}; + +struct trace_event_raw_mem_connect { + struct trace_entry ent; + const struct xdp_mem_allocator *xa; + u32 mem_id; + u32 mem_type; + const void *allocator; + const struct xdp_rxq_info *rxq; + int ifindex; + char __data[0]; +}; + +struct trace_event_raw_mem_return_failed { + struct trace_entry ent; + const struct page *page; + u32 mem_id; + u32 mem_type; + char __data[0]; +}; + +struct trace_event_data_offsets_xdp_exception {}; + +struct trace_event_data_offsets_xdp_bulk_tx {}; + +struct trace_event_data_offsets_xdp_redirect_template {}; + +struct trace_event_data_offsets_xdp_cpumap_kthread {}; + +struct trace_event_data_offsets_xdp_cpumap_enqueue {}; + +struct trace_event_data_offsets_xdp_devmap_xmit {}; + +struct trace_event_data_offsets_mem_disconnect {}; + +struct trace_event_data_offsets_mem_connect {}; + +struct trace_event_data_offsets_mem_return_failed {}; + +typedef void (*btf_trace_xdp_exception)(void *, const struct net_device *, const struct bpf_prog *, u32); + +typedef void (*btf_trace_xdp_bulk_tx)(void *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_xdp_redirect)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_redirect_map_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32); + +typedef void (*btf_trace_xdp_cpumap_kthread)(void *, int, unsigned int, unsigned int, int, struct xdp_cpumap_stats *); + +typedef void (*btf_trace_xdp_cpumap_enqueue)(void *, int, unsigned int, unsigned int, int); + +typedef void (*btf_trace_xdp_devmap_xmit)(void *, const struct net_device *, const struct net_device *, int, int, int); + +typedef void (*btf_trace_mem_disconnect)(void *, const struct xdp_mem_allocator *); + +typedef void (*btf_trace_mem_connect)(void *, const struct xdp_mem_allocator *, const struct xdp_rxq_info *); + +typedef void (*btf_trace_mem_return_failed)(void *, const struct xdp_mem_info *, const struct page *); + +struct io_uring_recvmsg_out { + __u32 namelen; + __u32 controllen; + __u32 payloadlen; + __u32 flags; +}; + +struct io_async_msghdr { + union { + struct iovec fast_iov[8]; + struct { + struct iovec fast_iov_one; + __kernel_size_t controllen; + int namelen; + __kernel_size_t payloadlen; + }; + struct io_cache_entry cache; + }; + struct iovec *free_iov; + struct sockaddr *uaddr; + struct msghdr msg; + struct __kernel_sockaddr_storage addr; +}; + +struct io_async_connect { + struct __kernel_sockaddr_storage address; +}; + +struct io_shutdown { + struct file *file; + int how; +}; + +struct io_accept { + struct file *file; + struct sockaddr *addr; + int *addr_len; + int flags; + u32 file_slot; + long unsigned int nofile; +}; + +struct io_socket { + struct file *file; + int domain; + int type; + int protocol; + int flags; + u32 file_slot; + long unsigned int nofile; +}; + +struct io_connect { + struct file *file; + struct sockaddr *addr; + int addr_len; + bool in_progress; +}; + +struct io_sr_msg { + struct file *file; + union { + struct compat_msghdr *umsg_compat; + struct user_msghdr *umsg; + void *buf; + }; + unsigned int len; + unsigned int done_io; + unsigned int msg_flags; + u16 flags; + u16 addr_len; + void *addr; + struct io_kiocb *notif; +}; + +struct io_recvmsg_multishot_hdr { + struct io_uring_recvmsg_out msg; + struct __kernel_sockaddr_storage addr; +}; + +struct dma_fence_chain { + struct dma_fence base; + struct dma_fence *prev; + u64 prev_seqno; + struct dma_fence *fence; + union { + struct dma_fence_cb cb; + struct irq_work work; + }; + spinlock_t lock; +}; + +struct efi_system_resource_entry_v1 { + efi_guid_t fw_class; + u32 fw_type; + u32 fw_version; + u32 lowest_supported_fw_version; + u32 capsule_flags; + u32 last_attempt_version; + u32 last_attempt_status; +}; + +struct efi_system_resource_table { + u32 fw_resource_count; + u32 fw_resource_count_max; + u64 fw_resource_version; + u8 entries[0]; +}; + +struct esre_entry { + union { + struct efi_system_resource_entry_v1 *esre1; + } esre; + struct kobject kobj; + struct list_head list; +}; + +struct esre_attribute { + struct attribute attr; + ssize_t (*show)(struct esre_entry *, char *); + ssize_t (*store)(struct esre_entry *, const char *, size_t); +}; + +struct ip_rt_info { + __be32 daddr; + __be32 saddr; + u_int8_t tos; + u_int32_t mark; +}; + +struct igmphdr { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; +}; + +enum { + PIM_TYPE_HELLO = 0, + PIM_TYPE_REGISTER = 1, + PIM_TYPE_REGISTER_STOP = 2, + PIM_TYPE_JOIN_PRUNE = 3, + PIM_TYPE_BOOTSTRAP = 4, + PIM_TYPE_ASSERT = 5, + PIM_TYPE_GRAFT = 6, + PIM_TYPE_GRAFT_ACK = 7, + PIM_TYPE_CANDIDATE_RP_ADV = 8, +}; + +struct pimreghdr { + __u8 type; + __u8 reserved; + __be16 csum; + __be32 flags; +}; + +typedef short unsigned int vifi_t; + +struct vifctl { + vifi_t vifc_vifi; + unsigned char vifc_flags; + unsigned char vifc_threshold; + unsigned int vifc_rate_limit; + union { + struct in_addr vifc_lcl_addr; + int vifc_lcl_ifindex; + }; + struct in_addr vifc_rmt_addr; +}; + +struct mfcctl { + struct in_addr mfcc_origin; + struct in_addr mfcc_mcastgrp; + vifi_t mfcc_parent; + unsigned char mfcc_ttls[32]; + unsigned int mfcc_pkt_cnt; + unsigned int mfcc_byte_cnt; + unsigned int mfcc_wrong_if; + int mfcc_expire; +}; + +struct sioc_sg_req { + struct in_addr src; + struct in_addr grp; + long unsigned int pktcnt; + long unsigned int bytecnt; + long unsigned int wrong_if; +}; + +struct sioc_vif_req { + vifi_t vifi; + long unsigned int icount; + long unsigned int ocount; + long unsigned int ibytes; + long unsigned int obytes; +}; + +struct igmpmsg { + __u32 unused1; + __u32 unused2; + unsigned char im_msgtype; + unsigned char im_mbz; + unsigned char im_vif; + unsigned char im_vif_hi; + struct in_addr im_src; + struct in_addr im_dst; +}; + +enum { + IPMRA_TABLE_UNSPEC = 0, + IPMRA_TABLE_ID = 1, + IPMRA_TABLE_CACHE_RES_QUEUE_LEN = 2, + IPMRA_TABLE_MROUTE_REG_VIF_NUM = 3, + IPMRA_TABLE_MROUTE_DO_ASSERT = 4, + IPMRA_TABLE_MROUTE_DO_PIM = 5, + IPMRA_TABLE_VIFS = 6, + IPMRA_TABLE_MROUTE_DO_WRVIFWHOLE = 7, + __IPMRA_TABLE_MAX = 8, +}; + +enum { + IPMRA_VIF_UNSPEC = 0, + IPMRA_VIF = 1, + __IPMRA_VIF_MAX = 2, +}; + +enum { + IPMRA_VIFA_UNSPEC = 0, + IPMRA_VIFA_IFINDEX = 1, + IPMRA_VIFA_VIF_ID = 2, + IPMRA_VIFA_FLAGS = 3, + IPMRA_VIFA_BYTES_IN = 4, + IPMRA_VIFA_BYTES_OUT = 5, + IPMRA_VIFA_PACKETS_IN = 6, + IPMRA_VIFA_PACKETS_OUT = 7, + IPMRA_VIFA_LOCAL_ADDR = 8, + IPMRA_VIFA_REMOTE_ADDR = 9, + IPMRA_VIFA_PAD = 10, + __IPMRA_VIFA_MAX = 11, +}; + +enum { + IPMRA_CREPORT_UNSPEC = 0, + IPMRA_CREPORT_MSGTYPE = 1, + IPMRA_CREPORT_VIF_ID = 2, + IPMRA_CREPORT_SRC_ADDR = 3, + IPMRA_CREPORT_DST_ADDR = 4, + IPMRA_CREPORT_PKT = 5, + IPMRA_CREPORT_TABLE = 6, + __IPMRA_CREPORT_MAX = 7, +}; + +struct mfc_cache_cmp_arg { + __be32 mfc_mcastgrp; + __be32 mfc_origin; +}; + +struct mfc_cache { + struct mr_mfc _c; + union { + struct { + __be32 mfc_mcastgrp; + __be32 mfc_origin; + }; + struct mfc_cache_cmp_arg cmparg; + }; +}; + +struct icmp_filter { + __u32 data; +}; + +struct raw_sock { + struct inet_sock inet; + struct icmp_filter filter; + u32 ipmr_table; +}; + +enum { + MPTCP_PM_ADDR_ATTR_UNSPEC = 0, + MPTCP_PM_ADDR_ATTR_FAMILY = 1, + MPTCP_PM_ADDR_ATTR_ID = 2, + MPTCP_PM_ADDR_ATTR_ADDR4 = 3, + MPTCP_PM_ADDR_ATTR_ADDR6 = 4, + MPTCP_PM_ADDR_ATTR_PORT = 5, + MPTCP_PM_ADDR_ATTR_FLAGS = 6, + MPTCP_PM_ADDR_ATTR_IF_IDX = 7, + __MPTCP_PM_ADDR_ATTR_MAX = 8, +}; + +enum { + MPTCP_PM_CMD_UNSPEC = 0, + MPTCP_PM_CMD_ADD_ADDR = 1, + MPTCP_PM_CMD_DEL_ADDR = 2, + MPTCP_PM_CMD_GET_ADDR = 3, + MPTCP_PM_CMD_FLUSH_ADDRS = 4, + MPTCP_PM_CMD_SET_LIMITS = 5, + MPTCP_PM_CMD_GET_LIMITS = 6, + MPTCP_PM_CMD_SET_FLAGS = 7, + MPTCP_PM_CMD_ANNOUNCE = 8, + MPTCP_PM_CMD_REMOVE = 9, + MPTCP_PM_CMD_SUBFLOW_CREATE = 10, + MPTCP_PM_CMD_SUBFLOW_DESTROY = 11, + __MPTCP_PM_CMD_AFTER_LAST = 12, +}; + +enum mptcp_event_type { + MPTCP_EVENT_UNSPEC = 0, + MPTCP_EVENT_CREATED = 1, + MPTCP_EVENT_ESTABLISHED = 2, + MPTCP_EVENT_CLOSED = 3, + MPTCP_EVENT_ANNOUNCED = 6, + MPTCP_EVENT_REMOVED = 7, + MPTCP_EVENT_SUB_ESTABLISHED = 10, + MPTCP_EVENT_SUB_CLOSED = 11, + MPTCP_EVENT_SUB_PRIORITY = 13, + MPTCP_EVENT_LISTENER_CREATED = 15, + MPTCP_EVENT_LISTENER_CLOSED = 16, +}; + +enum mptcp_event_attr { + MPTCP_ATTR_UNSPEC = 0, + MPTCP_ATTR_TOKEN = 1, + MPTCP_ATTR_FAMILY = 2, + MPTCP_ATTR_LOC_ID = 3, + MPTCP_ATTR_REM_ID = 4, + MPTCP_ATTR_SADDR4 = 5, + MPTCP_ATTR_SADDR6 = 6, + MPTCP_ATTR_DADDR4 = 7, + MPTCP_ATTR_DADDR6 = 8, + MPTCP_ATTR_SPORT = 9, + MPTCP_ATTR_DPORT = 10, + MPTCP_ATTR_BACKUP = 11, + MPTCP_ATTR_ERROR = 12, + MPTCP_ATTR_FLAGS = 13, + MPTCP_ATTR_TIMEOUT = 14, + MPTCP_ATTR_IF_IDX = 15, + MPTCP_ATTR_RESET_REASON = 16, + MPTCP_ATTR_RESET_FLAGS = 17, + MPTCP_ATTR_SERVER_SIDE = 18, + __MPTCP_ATTR_AFTER_LAST = 19, +}; + +enum mptcp_pm_status { + MPTCP_PM_ADD_ADDR_RECEIVED = 0, + MPTCP_PM_ADD_ADDR_SEND_ACK = 1, + MPTCP_PM_RM_ADDR_RECEIVED = 2, + MPTCP_PM_ESTABLISHED = 3, + MPTCP_PM_SUBFLOW_ESTABLISHED = 4, + MPTCP_PM_ALREADY_ESTABLISHED = 5, + MPTCP_PM_MPC_ENDPOINT_ACCOUNTED = 6, +}; + +struct mptcp_pm_add_entry { + struct list_head list; + struct mptcp_addr_info addr; + struct timer_list add_timer; + struct mptcp_sock *sock; + u8 retrans_times; +}; + +struct pm_nl_pernet { + spinlock_t lock; + struct list_head local_addr_list; + unsigned int addrs; + unsigned int stale_loss_cnt; + unsigned int add_addr_signal_max; + unsigned int add_addr_accept_max; + unsigned int local_addr_max; + unsigned int subflows_max; + unsigned int next_id; + long unsigned int id_bitmap[4]; +}; + +struct filter_pred; + +struct prog_entry { + int target; + int when_to_branch; + struct filter_pred *pred; +}; + +struct regex; + +typedef int (*regex_match_func)(char *, struct regex *, int); + +struct regex { + char pattern[256]; + int len; + int field_len; + regex_match_func match; +}; + +enum filter_op_ids { + OP_GLOB = 0, + OP_NE = 1, + OP_EQ = 2, + OP_LE = 3, + OP_LT = 4, + OP_GE = 5, + OP_GT = 6, + OP_BAND = 7, + OP_MAX = 8, +}; + +enum filter_pred_fn { + FILTER_PRED_FN_NOP = 0, + FILTER_PRED_FN_64 = 1, + FILTER_PRED_FN_S64 = 2, + FILTER_PRED_FN_U64 = 3, + FILTER_PRED_FN_32 = 4, + FILTER_PRED_FN_S32 = 5, + FILTER_PRED_FN_U32 = 6, + FILTER_PRED_FN_16 = 7, + FILTER_PRED_FN_S16 = 8, + FILTER_PRED_FN_U16 = 9, + FILTER_PRED_FN_8 = 10, + FILTER_PRED_FN_S8 = 11, + FILTER_PRED_FN_U8 = 12, + FILTER_PRED_FN_COMM = 13, + FILTER_PRED_FN_STRING = 14, + FILTER_PRED_FN_STRLOC = 15, + FILTER_PRED_FN_STRRELLOC = 16, + FILTER_PRED_FN_PCHAR_USER = 17, + FILTER_PRED_FN_PCHAR = 18, + FILTER_PRED_FN_CPU = 19, + FILTER_PRED_FN_ = 20, + FILTER_PRED_TEST_VISITED = 21, +}; + +struct filter_pred { + enum filter_pred_fn fn_num; + u64 val; + struct regex regex; + short unsigned int *ops; + struct ftrace_event_field *field; + int offset; + int not; + int op; +}; + +enum { + FILT_ERR_NONE = 0, + FILT_ERR_INVALID_OP = 1, + FILT_ERR_TOO_MANY_OPEN = 2, + FILT_ERR_TOO_MANY_CLOSE = 3, + FILT_ERR_MISSING_QUOTE = 4, + FILT_ERR_OPERAND_TOO_LONG = 5, + FILT_ERR_EXPECT_STRING = 6, + FILT_ERR_EXPECT_DIGIT = 7, + FILT_ERR_ILLEGAL_FIELD_OP = 8, + FILT_ERR_FIELD_NOT_FOUND = 9, + FILT_ERR_ILLEGAL_INTVAL = 10, + FILT_ERR_BAD_SUBSYS_FILTER = 11, + FILT_ERR_TOO_MANY_PREDS = 12, + FILT_ERR_INVALID_FILTER = 13, + FILT_ERR_IP_FIELD_ONLY = 14, + FILT_ERR_INVALID_VALUE = 15, + FILT_ERR_ERRNO = 16, + FILT_ERR_NO_FILTER = 17, +}; + +struct filter_parse_error { + int lasterr; + int lasterr_pos; +}; + +typedef int (*parse_pred_fn)(const char *, void *, int, struct filter_parse_error *, struct filter_pred **); + +enum { + INVERT = 1, + PROCESS_AND = 2, + PROCESS_OR = 4, +}; + +struct ustring_buffer { + char buffer[1024]; +}; + +enum { + TOO_MANY_CLOSE = -1, + TOO_MANY_OPEN = -2, + MISSING_QUOTE = -3, +}; + +struct filter_list { + struct list_head list; + struct event_filter *filter; +}; + +struct function_filter_data { + struct ftrace_ops *ops; + int first_filter; + int first_notrace; +}; + +struct genradix_iter { + size_t offset; + size_t pos; +}; + +struct genradix_node { + union { + struct genradix_node *children[512]; + u8 data[4096]; + }; +}; + +struct acpi_osi_entry { + char string[64]; + bool enable; +}; + +struct acpi_osi_config { + u8 default_disabling; + unsigned int linux_enable: 1; + unsigned int linux_dmi: 1; + unsigned int linux_cmdline: 1; + unsigned int darwin_enable: 1; + unsigned int darwin_dmi: 1; + unsigned int darwin_cmdline: 1; +}; + +typedef int (*pm_callback_t)(struct device *); + +struct linkinfo_reply_data { + struct ethnl_reply_data base; + struct ethtool_link_ksettings ksettings; + struct ethtool_link_settings *lsettings; +}; + +enum mapping_status { + MAPPING_OK = 0, + MAPPING_INVALID = 1, + MAPPING_EMPTY = 2, + MAPPING_DATA_FIN = 3, + MAPPING_DUMMY = 4, + MAPPING_BAD_CSUM = 5, +}; + +struct page_change_data { + pgprot_t set_mask; + pgprot_t clear_mask; +}; + +struct cfd_percpu { + call_single_data_t csd; +}; + +struct call_function_data { + struct cfd_percpu *pcpu; + cpumask_var_t cpumask; + cpumask_var_t cpumask_ipi; +}; + +struct smp_call_on_cpu_struct { + struct work_struct work; + struct completion done; + int (*func)(void *); + void *data; + int ret; + int cpu; +}; + +struct bpf_storage_blob { + struct bpf_local_storage *storage; +}; + +typedef u64 (*btf_bpf_inode_storage_get)(struct bpf_map *, struct inode *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_inode_storage_delete)(struct bpf_map *, struct inode *); + +struct selinux_kernel_status { + u32 version; + u32 sequence; + u32 enforcing; + u32 policyload; + u32 deny_unknown; +}; + +typedef u32 depot_stack_handle_t; + +union handle_parts { + depot_stack_handle_t handle; + struct { + u32 slabindex: 16; + u32 offset: 10; + u32 valid: 1; + u32 extra: 5; + }; +}; + +struct stack_record { + struct stack_record *next; + u32 hash; + u32 size; + union handle_parts handle; + long unsigned int entries[0]; +}; + +struct acpi_wakeup_handler { + struct list_head list_node; + bool (*wakeup)(void *); + void *context; +}; + +struct phc_vclocks_reply_data { + struct ethnl_reply_data base; + int num; + int *index; +}; + +struct tcp_info { + __u8 tcpi_state; + __u8 tcpi_ca_state; + __u8 tcpi_retransmits; + __u8 tcpi_probes; + __u8 tcpi_backoff; + __u8 tcpi_options; + __u8 tcpi_snd_wscale: 4; + __u8 tcpi_rcv_wscale: 4; + __u8 tcpi_delivery_rate_app_limited: 1; + __u8 tcpi_fastopen_client_fail: 2; + __u32 tcpi_rto; + __u32 tcpi_ato; + __u32 tcpi_snd_mss; + __u32 tcpi_rcv_mss; + __u32 tcpi_unacked; + __u32 tcpi_sacked; + __u32 tcpi_lost; + __u32 tcpi_retrans; + __u32 tcpi_fackets; + __u32 tcpi_last_data_sent; + __u32 tcpi_last_ack_sent; + __u32 tcpi_last_data_recv; + __u32 tcpi_last_ack_recv; + __u32 tcpi_pmtu; + __u32 tcpi_rcv_ssthresh; + __u32 tcpi_rtt; + __u32 tcpi_rttvar; + __u32 tcpi_snd_ssthresh; + __u32 tcpi_snd_cwnd; + __u32 tcpi_advmss; + __u32 tcpi_reordering; + __u32 tcpi_rcv_rtt; + __u32 tcpi_rcv_space; + __u32 tcpi_total_retrans; + __u64 tcpi_pacing_rate; + __u64 tcpi_max_pacing_rate; + __u64 tcpi_bytes_acked; + __u64 tcpi_bytes_received; + __u32 tcpi_segs_out; + __u32 tcpi_segs_in; + __u32 tcpi_notsent_bytes; + __u32 tcpi_min_rtt; + __u32 tcpi_data_segs_in; + __u32 tcpi_data_segs_out; + __u64 tcpi_delivery_rate; + __u64 tcpi_busy_time; + __u64 tcpi_rwnd_limited; + __u64 tcpi_sndbuf_limited; + __u32 tcpi_delivered; + __u32 tcpi_delivered_ce; + __u64 tcpi_bytes_sent; + __u64 tcpi_bytes_retrans; + __u32 tcpi_dsack_dups; + __u32 tcpi_reord_seen; + __u32 tcpi_rcv_ooopack; + __u32 tcpi_snd_wnd; + __u32 tcpi_rcv_wnd; + __u32 tcpi_rehash; +}; + +struct mptcp_info { + __u8 mptcpi_subflows; + __u8 mptcpi_add_addr_signal; + __u8 mptcpi_add_addr_accepted; + __u8 mptcpi_subflows_max; + __u8 mptcpi_add_addr_signal_max; + __u8 mptcpi_add_addr_accepted_max; + __u32 mptcpi_flags; + __u32 mptcpi_token; + __u64 mptcpi_write_seq; + __u64 mptcpi_snd_una; + __u64 mptcpi_rcv_nxt; + __u8 mptcpi_local_addr_used; + __u8 mptcpi_local_addr_max; + __u8 mptcpi_csum_enabled; +}; + +struct mptcp_subflow_data { + __u32 size_subflow_data; + __u32 num_subflows; + __u32 size_kernel; + __u32 size_user; +}; + +struct mptcp_subflow_addrs { + union { + __kernel_sa_family_t sa_family; + struct sockaddr sa_local; + struct sockaddr_in sin_local; + struct sockaddr_in6 sin6_local; + struct __kernel_sockaddr_storage ss_local; + }; + union { + struct sockaddr sa_remote; + struct sockaddr_in sin_remote; + struct sockaddr_in6 sin6_remote; + struct __kernel_sockaddr_storage ss_remote; + }; +}; + +struct bpf_cgroup_storage_map { + struct bpf_map map; + spinlock_t lock; + struct rb_root root; + struct list_head list; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct crypto_ahash_spawn { + struct crypto_spawn base; +}; + +struct gcm_instance_ctx { + struct crypto_skcipher_spawn ctr; + struct crypto_ahash_spawn ghash; +}; + +struct crypto_gcm_ctx { + struct crypto_skcipher *ctr; + struct crypto_ahash *ghash; +}; + +struct crypto_rfc4106_ctx { + struct crypto_aead *child; + u8 nonce[4]; +}; + +struct crypto_rfc4106_req_ctx { + struct scatterlist src[3]; + struct scatterlist dst[3]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct aead_request subreq; +}; + +struct crypto_rfc4543_instance_ctx { + struct crypto_aead_spawn aead; +}; + +struct crypto_rfc4543_ctx { + struct crypto_aead *child; + struct crypto_sync_skcipher *null; + u8 nonce[4]; +}; + +struct crypto_rfc4543_req_ctx { + struct aead_request subreq; +}; + +struct crypto_gcm_ghash_ctx { + unsigned int cryptlen; + struct scatterlist *src; + int (*complete)(struct aead_request *, u32); +}; + +struct crypto_gcm_req_priv_ctx { + u8 iv[16]; + u8 auth_tag[16]; + u8 iauth_tag[16]; + struct scatterlist src[3]; + struct scatterlist dst[3]; + struct scatterlist sg; + struct crypto_gcm_ghash_ctx ghash_ctx; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct ahash_request ahreq; + struct skcipher_request skreq; + } u; +}; + +struct disk_events { + struct list_head node; + struct gendisk *disk; + spinlock_t lock; + struct mutex block_mutex; + int block; + unsigned int pending; + unsigned int clearing; + long int poll_msecs; + struct delayed_work dwork; +}; + +struct cpu_rmap { + struct kref refcount; + u16 size; + u16 used; + void **obj; + struct { + u16 index; + u16 dist; + } near[0]; +}; + +struct irq_glue { + struct irq_affinity_notify notify; + struct cpu_rmap *rmap; + u16 index; +}; + +enum pci_bar_type { + pci_bar_unknown = 0, + pci_bar_io = 1, + pci_bar_mem32 = 2, + pci_bar_mem64 = 3, +}; + +typedef acpi_status (*acpi_object_converter)(struct acpi_namespace_node *, union acpi_operand_object *, union acpi_operand_object **); + +struct acpi_simple_repair_info { + char name[4]; + u32 unexpected_btypes; + u32 package_index; + acpi_object_converter object_converter; +}; + +union input_seq_state { + struct { + short unsigned int pos; + bool mutex_acquired; + }; + void *p; +}; + +struct input_devres { + struct input_dev *input; +}; + +struct xfrm_if_decode_session_result { + struct net *net; + u32 if_id; +}; + +struct xfrm_if_cb { + bool (*decode_session)(struct sk_buff *, short unsigned int, struct xfrm_if_decode_session_result *); +}; + +struct xfrm_flo { + struct dst_entry *dst_orig; + u8 flags; +}; + +struct xfrm_pol_inexact_node { + struct rb_node node; + union { + xfrm_address_t addr; + struct callback_head rcu; + }; + u8 prefixlen; + struct rb_root root; + struct hlist_head hhead; +}; + +struct xfrm_pol_inexact_key { + possible_net_t net; + u32 if_id; + u16 family; + u8 dir; + u8 type; +}; + +struct xfrm_pol_inexact_bin { + struct xfrm_pol_inexact_key k; + struct rhash_head head; + struct hlist_head hhead; + seqcount_spinlock_t count; + struct rb_root root_d; + struct rb_root root_s; + struct list_head inexact_bins; + struct callback_head rcu; +}; + +enum xfrm_pol_inexact_candidate_type { + XFRM_POL_CAND_BOTH = 0, + XFRM_POL_CAND_SADDR = 1, + XFRM_POL_CAND_DADDR = 2, + XFRM_POL_CAND_ANY = 3, + XFRM_POL_CAND_MAX = 4, +}; + +struct xfrm_pol_inexact_candidates { + struct hlist_head *res[4]; +}; + +enum { + TASKSTATS_TYPE_UNSPEC = 0, + TASKSTATS_TYPE_PID = 1, + TASKSTATS_TYPE_TGID = 2, + TASKSTATS_TYPE_STATS = 3, + TASKSTATS_TYPE_AGGR_PID = 4, + TASKSTATS_TYPE_AGGR_TGID = 5, + TASKSTATS_TYPE_NULL = 6, + __TASKSTATS_TYPE_MAX = 7, +}; + +enum { + TASKSTATS_CMD_ATTR_UNSPEC = 0, + TASKSTATS_CMD_ATTR_PID = 1, + TASKSTATS_CMD_ATTR_TGID = 2, + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 3, + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 4, + __TASKSTATS_CMD_ATTR_MAX = 5, +}; + +enum { + CGROUPSTATS_CMD_UNSPEC = 3, + CGROUPSTATS_CMD_GET = 4, + CGROUPSTATS_CMD_NEW = 5, + __CGROUPSTATS_CMD_MAX = 6, +}; + +enum { + CGROUPSTATS_TYPE_UNSPEC = 0, + CGROUPSTATS_TYPE_CGROUP_STATS = 1, + __CGROUPSTATS_TYPE_MAX = 2, +}; + +enum { + CGROUPSTATS_CMD_ATTR_UNSPEC = 0, + CGROUPSTATS_CMD_ATTR_FD = 1, + __CGROUPSTATS_CMD_ATTR_MAX = 2, +}; + +struct listener { + struct list_head list; + pid_t pid; + char valid; +}; + +struct listener_list { + struct rw_semaphore sem; + struct list_head list; +}; + +enum actions { + REGISTER = 0, + DEREGISTER = 1, + CPU_DONT_CARE = 2, +}; + +enum string_size_units { + STRING_UNITS_10 = 0, + STRING_UNITS_2 = 1, +}; + +enum mcopy_atomic_mode { + MCOPY_ATOMIC_NORMAL = 0, + MCOPY_ATOMIC_ZEROPAGE = 1, + MCOPY_ATOMIC_CONTINUE = 2, +}; + +struct resv_map { + struct kref refs; + spinlock_t lock; + struct list_head regions; + long int adds_in_progress; + struct list_head region_cache; + long int region_cache_count; + struct page_counter *reservation_counter; + long unsigned int pages_per_hpage; + struct cgroup_subsys_state *css; +}; + +struct file_region { + struct list_head link; + long int from; + long int to; + struct page_counter *reservation_counter; + struct cgroup_subsys_state *css; +}; + +struct hugetlb_vma_lock { + struct kref refs; + struct rw_semaphore rw_sema; + struct vm_area_struct *vma; +}; + +struct huge_bootmem_page { + struct list_head list; + struct hstate *hstate; +}; + +struct hugetlb_cgroup_per_node { + long unsigned int usage[4]; +}; + +struct hugetlb_cgroup { + struct cgroup_subsys_state css; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct page_counter hugepage[4]; + struct page_counter rsvd_hugepage[4]; + atomic_long_t events[4]; + atomic_long_t events_local[4]; + struct cgroup_file events_file[4]; + struct cgroup_file events_local_file[4]; + struct hugetlb_cgroup_per_node *nodeinfo[0]; +}; + +enum vma_resv_mode { + VMA_NEEDS_RESV = 0, + VMA_COMMIT_RESV = 1, + VMA_END_RESV = 2, + VMA_ADD_RESV = 3, + VMA_DEL_RESV = 4, +}; + +struct node_hstate { + struct kobject *hugepages_kobj; + struct kobject *hstate_kobjs[4]; +}; + +struct tpmrm_priv { + struct file_priv priv; + struct tpm_space space; +}; + +enum usb_phy_interface { + USBPHY_INTERFACE_MODE_UNKNOWN = 0, + USBPHY_INTERFACE_MODE_UTMI = 1, + USBPHY_INTERFACE_MODE_UTMIW = 2, + USBPHY_INTERFACE_MODE_ULPI = 3, + USBPHY_INTERFACE_MODE_SERIAL = 4, + USBPHY_INTERFACE_MODE_HSIC = 5, +}; + +struct linkstate_reply_data { + struct ethnl_reply_data base; + int link; + int sqi; + int sqi_max; + struct ethtool_link_ext_stats link_stats; + bool link_ext_state_provided; + struct ethtool_link_ext_state_info ethtool_link_ext_state_info; +}; + +enum dns_payload_content_type { + DNS_PAYLOAD_IS_SERVER_LIST = 0, +}; + +struct dns_payload_header { + __u8 zero; + __u8 content; + __u8 version; +}; + +typedef u64 (*bpf_trampoline_enter_t)(struct bpf_prog *, struct bpf_tramp_run_ctx *); + +typedef void (*bpf_trampoline_exit_t)(struct bpf_prog *, u64, struct bpf_tramp_run_ctx *); + +struct jit_ctx { + const struct bpf_prog *prog; + int idx; + int epilogue_offset; + int *offset; + int exentry_idx; + __le32 *image; + u32 stack_size; + int fpb_offset; +}; + +struct bpf_plt { + u32 insn_ldr; + u32 insn_br; + u64 target; +}; + +struct arm64_jit_data { + struct bpf_binary_header *header; + u8 *image; + struct jit_ctx ctx; +}; + +struct stat { + long unsigned int st_dev; + long unsigned int st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + long unsigned int st_rdev; + long unsigned int __pad1; + long int st_size; + int st_blksize; + int __pad2; + long int st_blocks; + long int st_atime; + long unsigned int st_atime_nsec; + long int st_mtime; + long unsigned int st_mtime_nsec; + long int st_ctime; + long unsigned int st_ctime_nsec; + unsigned int __unused4; + unsigned int __unused5; +}; + +typedef struct ns_common *ns_get_path_helper_t(void *); + +struct ns_get_path_task_args { + const struct proc_ns_operations *ns_ops; + struct task_struct *task; +}; + +struct hashtab_info { + u32 slots_used; + u32 max_chain_len; +}; + +struct ahash_alg { + int (*init)(struct ahash_request *); + int (*update)(struct ahash_request *); + int (*final)(struct ahash_request *); + int (*finup)(struct ahash_request *); + int (*digest)(struct ahash_request *); + int (*export)(struct ahash_request *, void *); + int (*import)(struct ahash_request *, const void *); + int (*setkey)(struct crypto_ahash *, const u8 *, unsigned int); + int (*init_tfm)(struct crypto_ahash *); + void (*exit_tfm)(struct crypto_ahash *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct hash_alg_common halg; +}; + +struct crypto_hash_walk { + char *data; + unsigned int offset; + unsigned int alignmask; + struct page *pg; + unsigned int entrylen; + unsigned int total; + struct scatterlist *sg; + unsigned int flags; +}; + +struct ahash_instance { + void (*free)(struct ahash_instance *); + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + union { + struct { + char head[256]; + struct crypto_instance base; + } s; + struct ahash_alg alg; + }; +}; + +struct crypto_report_hash { + char type[64]; + unsigned int blocksize; + unsigned int digestsize; +}; + +struct ahash_request_priv { + crypto_completion_t complete; + void *data; + u8 *result; + u32 flags; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + void *ubuf[0]; +}; + +typedef enum { + set_basic = 0, + set_rle = 1, + set_compressed = 2, + set_repeat = 3, +} symbolEncodingType_e; + +typedef enum { + ZSTD_no_overlap = 0, + ZSTD_overlap_src_before_dst = 1, +} ZSTD_overlap_e; + +typedef struct { + blockType_e blockType; + U32 lastBlock; + U32 origSize; +} blockProperties_t; + +typedef struct { + U32 fastMode; + U32 tableLog; +} ZSTD_seqSymbol_header; + +typedef struct { + size_t litLength; + size_t matchLength; + size_t offset; + const BYTE *match; +} seq_t; + +typedef struct { + size_t state; + const ZSTD_seqSymbol *table; +} ZSTD_fseState; + +typedef struct { + BIT_DStream_t DStream; + ZSTD_fseState stateLL; + ZSTD_fseState stateOffb; + ZSTD_fseState stateML; + size_t prevOffset[3]; + const BYTE *prefixStart; + const BYTE *dictEnd; + size_t pos; +} seqState_t; + +typedef enum { + ZSTD_lo_isRegularOffset = 0, + ZSTD_lo_isLongOffset = 1, +} ZSTD_longOffset_e; + +typedef enum { + ZSTD_p_noPrefetch = 0, + ZSTD_p_prefetch = 1, +} ZSTD_prefetch_e; + +struct pci_dynid { + struct list_head node; + struct pci_device_id id; +}; + +struct drv_dev_and_id { + struct pci_driver *drv; + struct pci_dev *dev; + const struct pci_device_id *id; +}; + +enum { + FOU_ATTR_UNSPEC = 0, + FOU_ATTR_PORT = 1, + FOU_ATTR_AF = 2, + FOU_ATTR_IPPROTO = 3, + FOU_ATTR_TYPE = 4, + FOU_ATTR_REMCSUM_NOPARTIAL = 5, + FOU_ATTR_LOCAL_V4 = 6, + FOU_ATTR_LOCAL_V6 = 7, + FOU_ATTR_PEER_V4 = 8, + FOU_ATTR_PEER_V6 = 9, + FOU_ATTR_PEER_PORT = 10, + FOU_ATTR_IFINDEX = 11, + __FOU_ATTR_MAX = 12, +}; + +enum { + FOU_CMD_UNSPEC = 0, + FOU_CMD_ADD = 1, + FOU_CMD_DEL = 2, + FOU_CMD_GET = 3, + __FOU_CMD_MAX = 4, +}; + +enum { + FOU_ENCAP_UNSPEC = 0, + FOU_ENCAP_DIRECT = 1, + FOU_ENCAP_GUE = 2, +}; + +struct fou { + struct socket *sock; + u8 protocol; + u8 flags; + __be16 port; + u8 family; + u16 type; + struct list_head list; + struct callback_head rcu; +}; + +struct fou_cfg { + u16 type; + u8 protocol; + u8 flags; + struct udp_port_cfg udp_config; +}; + +struct fou_net { + struct list_head fou_list; + struct mutex fou_lock; +}; + +struct trace_event_raw_tls_device_offload_set { + struct trace_entry ent; + struct sock *sk; + u64 rec_no; + int dir; + u32 tcp_seq; + int ret; + char __data[0]; +}; + +struct trace_event_raw_tls_device_decrypted { + struct trace_entry ent; + struct sock *sk; + u64 rec_no; + u32 tcp_seq; + u32 rec_len; + bool encrypted; + bool decrypted; + char __data[0]; +}; + +struct trace_event_raw_tls_device_rx_resync_send { + struct trace_entry ent; + struct sock *sk; + u64 rec_no; + u32 tcp_seq; + int sync_type; + char __data[0]; +}; + +struct trace_event_raw_tls_device_rx_resync_nh_schedule { + struct trace_entry ent; + struct sock *sk; + char __data[0]; +}; + +struct trace_event_raw_tls_device_rx_resync_nh_delay { + struct trace_entry ent; + struct sock *sk; + u32 sock_data; + u32 rec_len; + char __data[0]; +}; + +struct trace_event_raw_tls_device_tx_resync_req { + struct trace_entry ent; + struct sock *sk; + u32 tcp_seq; + u32 exp_tcp_seq; + char __data[0]; +}; + +struct trace_event_raw_tls_device_tx_resync_send { + struct trace_entry ent; + struct sock *sk; + u64 rec_no; + u32 tcp_seq; + char __data[0]; +}; + +struct trace_event_data_offsets_tls_device_offload_set {}; + +struct trace_event_data_offsets_tls_device_decrypted {}; + +struct trace_event_data_offsets_tls_device_rx_resync_send {}; + +struct trace_event_data_offsets_tls_device_rx_resync_nh_schedule {}; + +struct trace_event_data_offsets_tls_device_rx_resync_nh_delay {}; + +struct trace_event_data_offsets_tls_device_tx_resync_req {}; + +struct trace_event_data_offsets_tls_device_tx_resync_send {}; + +typedef void (*btf_trace_tls_device_offload_set)(void *, struct sock *, int, u32, u8 *, int); + +typedef void (*btf_trace_tls_device_decrypted)(void *, struct sock *, u32, u8 *, u32, bool, bool); + +typedef void (*btf_trace_tls_device_rx_resync_send)(void *, struct sock *, u32, u8 *, int); + +typedef void (*btf_trace_tls_device_rx_resync_nh_schedule)(void *, struct sock *); + +typedef void (*btf_trace_tls_device_rx_resync_nh_delay)(void *, struct sock *, u32, u32); + +typedef void (*btf_trace_tls_device_tx_resync_req)(void *, struct sock *, u32, u32); + +typedef void (*btf_trace_tls_device_tx_resync_send)(void *, struct sock *, u32, u8 *); + +struct token_bucket { + spinlock_t lock; + int chain_len; + struct hlist_nulls_head req_chain; + struct hlist_nulls_head msk_chain; +}; + +struct clone_args { + __u64 flags; + __u64 pidfd; + __u64 child_tid; + __u64 parent_tid; + __u64 exit_signal; + __u64 stack; + __u64 stack_size; + __u64 tls; + __u64 set_tid; + __u64 set_tid_size; + __u64 cgroup; +}; + +struct multiprocess_signals { + sigset_t signal; + struct hlist_node node; +}; + +typedef int (*proc_visitor)(struct task_struct *, void *); + +struct trace_event_raw_task_newtask { + struct trace_entry ent; + pid_t pid; + char comm[16]; + long unsigned int clone_flags; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_task_rename { + struct trace_entry ent; + pid_t pid; + char oldcomm[16]; + char newcomm[16]; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_data_offsets_task_newtask {}; + +struct trace_event_data_offsets_task_rename {}; + +typedef void (*btf_trace_task_newtask)(void *, struct task_struct *, long unsigned int); + +typedef void (*btf_trace_task_rename)(void *, struct task_struct *, const char *); + +struct vm_stack { + struct callback_head rcu; + struct vm_struct *stack_vm_area; +}; + +struct acpi_madt_generic_translator { + struct acpi_subtable_header header; + u16 reserved; + u32 translation_id; + u64 base_address; + u32 reserved2; +} __attribute__((packed)); + +struct acpi_srat_gic_its_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u16 reserved; + u32 its_id; +} __attribute__((packed)); + +struct rdists { + struct { + raw_spinlock_t rd_lock; + void *rd_base; + struct page *pend_page; + phys_addr_t phys_base; + u64 flags; + cpumask_t *vpe_table_mask; + void *vpe_l1_base; + } *rdist; + phys_addr_t prop_table_pa; + void *prop_table_va; + u64 flags; + u32 gicd_typer; + u32 gicd_typer2; + int cpuhp_memreserve_state; + bool has_vlpis; + bool has_rvpeid; + bool has_direct_lpi; + bool has_vpend_valid_dirty; +}; + +struct its_collection { + u64 target_address; + u16 col_id; +}; + +struct its_baser { + void *base; + u64 val; + u32 order; + u32 psz; +}; + +struct its_cmd_block; + +struct its_device; + +struct its_node { + raw_spinlock_t lock; + struct mutex dev_alloc_lock; + struct list_head entry; + void *base; + void *sgir_base; + phys_addr_t phys_base; + struct its_cmd_block *cmd_base; + struct its_cmd_block *cmd_write; + struct its_baser tables[8]; + struct its_collection *collections; + struct fwnode_handle *fwnode_handle; + u64 (*get_msi_base)(struct its_device *); + u64 typer; + u64 cbaser_save; + u32 ctlr_save; + u32 mpidr; + struct list_head its_device_list; + u64 flags; + long unsigned int list_nr; + int numa_node; + unsigned int msi_domain_flags; + u32 pre_its_base; + int vlpi_redist_offset; +}; + +struct its_cmd_block { + union { + u64 raw_cmd[4]; + __le64 raw_cmd_le[4]; + }; +}; + +struct event_lpi_map { + long unsigned int *lpi_map; + u16 *col_map; + irq_hw_number_t lpi_base; + int nr_lpis; + raw_spinlock_t vlpi_lock; + struct its_vm *vm; + struct its_vlpi_map *vlpi_maps; + int nr_vlpis; +}; + +struct its_device { + struct list_head entry; + struct its_node *its; + struct event_lpi_map event_map; + void *itt; + u32 nr_ites; + u32 device_id; + bool shared; +}; + +struct cpu_lpi_count { + atomic_t managed; + atomic_t unmanaged; +}; + +struct its_cmd_desc { + union { + struct { + struct its_device *dev; + u32 event_id; + } its_inv_cmd; + struct { + struct its_device *dev; + u32 event_id; + } its_clear_cmd; + struct { + struct its_device *dev; + u32 event_id; + } its_int_cmd; + struct { + struct its_device *dev; + int valid; + } its_mapd_cmd; + struct { + struct its_collection *col; + int valid; + } its_mapc_cmd; + struct { + struct its_device *dev; + u32 phys_id; + u32 event_id; + } its_mapti_cmd; + struct { + struct its_device *dev; + struct its_collection *col; + u32 event_id; + } its_movi_cmd; + struct { + struct its_device *dev; + u32 event_id; + } its_discard_cmd; + struct { + struct its_collection *col; + } its_invall_cmd; + struct { + struct its_vpe *vpe; + } its_vinvall_cmd; + struct { + struct its_vpe *vpe; + struct its_collection *col; + bool valid; + } its_vmapp_cmd; + struct { + struct its_vpe *vpe; + struct its_device *dev; + u32 virt_id; + u32 event_id; + bool db_enabled; + } its_vmapti_cmd; + struct { + struct its_vpe *vpe; + struct its_device *dev; + u32 event_id; + bool db_enabled; + } its_vmovi_cmd; + struct { + struct its_vpe *vpe; + struct its_collection *col; + u16 seq_num; + u16 its_list; + } its_vmovp_cmd; + struct { + struct its_vpe *vpe; + } its_invdb_cmd; + struct { + struct its_vpe *vpe; + u8 sgi; + u8 priority; + bool enable; + bool group; + bool clear; + } its_vsgi_cmd; + }; +}; + +typedef struct its_collection * (*its_cmd_builder_t)(struct its_node *, struct its_cmd_block *, struct its_cmd_desc *); + +typedef struct its_vpe * (*its_cmd_vbuilder_t)(struct its_node *, struct its_cmd_block *, struct its_cmd_desc *); + +struct lpi_range { + struct list_head entry; + u32 base_id; + u32 span; +}; + +struct its_srat_map { + u32 numa_node; + u32 its_id; +}; + +struct exar8250_platform { + int (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *); + const struct serial_rs485 *rs485_supported; + int (*register_gpio)(struct pci_dev *, struct uart_8250_port *); + void (*unregister_gpio)(struct uart_8250_port *); +}; + +struct exar8250; + +struct exar8250_board { + unsigned int num_ports; + unsigned int reg_shift; + int (*setup)(struct exar8250 *, struct pci_dev *, struct uart_8250_port *, int); + void (*exit)(struct pci_dev *); +}; + +struct exar8250 { + unsigned int nr; + struct exar8250_board *board; + void *virt; + int line[0]; +}; + +enum { + IFLA_VF_LINK_STATE_AUTO = 0, + IFLA_VF_LINK_STATE_ENABLE = 1, + IFLA_VF_LINK_STATE_DISABLE = 2, + __IFLA_VF_LINK_STATE_MAX = 3, +}; + +struct nf_ct_helper_expectfn { + struct list_head head; + const char *name; + void (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *); +}; + +union nf_conntrack_nat_help {}; + +struct nf_conn_nat { + union nf_conntrack_nat_help help; +}; + +struct nf_nat_lookup_hook_priv { + struct nf_hook_entries *entries; + struct callback_head callback_head; +}; + +struct nf_nat_hooks_net { + struct nf_hook_ops *nat_hook_ops; + unsigned int users; +}; + +struct nat_net { + struct nf_nat_hooks_net nat_proto_net[11]; +}; + +struct nf_nat_proto_clean { + u8 l3proto; + u8 l4proto; +}; + +struct fprop_local_single { + long unsigned int events; + unsigned int period; + raw_spinlock_t lock; +}; + +enum error_detector { + ERROR_DETECTOR_KFENCE = 0, + ERROR_DETECTOR_KASAN = 1, + ERROR_DETECTOR_WARN = 2, +}; + +struct warn_args { + const char *fmt; + va_list args; +}; + +struct trace_probe_log { + const char *subsystem; + const char **argv; + int argc; + int index; +}; + +struct trace_event_raw_oom_score_adj_update { + struct trace_entry ent; + pid_t pid; + char comm[16]; + short int oom_score_adj; + char __data[0]; +}; + +struct trace_event_raw_reclaim_retry_zone { + struct trace_entry ent; + int node; + int zone_idx; + int order; + long unsigned int reclaimable; + long unsigned int available; + long unsigned int min_wmark; + int no_progress_loops; + bool wmark_check; + char __data[0]; +}; + +struct trace_event_raw_mark_victim { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_wake_reaper { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_start_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_finish_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_skip_task_reaping { + struct trace_entry ent; + int pid; + char __data[0]; +}; + +struct trace_event_raw_compact_retry { + struct trace_entry ent; + int order; + int priority; + int result; + int retries; + int max_retries; + bool ret; + char __data[0]; +}; + +struct trace_event_data_offsets_oom_score_adj_update {}; + +struct trace_event_data_offsets_reclaim_retry_zone {}; + +struct trace_event_data_offsets_mark_victim {}; + +struct trace_event_data_offsets_wake_reaper {}; + +struct trace_event_data_offsets_start_task_reaping {}; + +struct trace_event_data_offsets_finish_task_reaping {}; + +struct trace_event_data_offsets_skip_task_reaping {}; + +struct trace_event_data_offsets_compact_retry {}; + +typedef void (*btf_trace_oom_score_adj_update)(void *, struct task_struct *); + +typedef void (*btf_trace_reclaim_retry_zone)(void *, struct zoneref *, int, long unsigned int, long unsigned int, long unsigned int, int, bool); + +typedef void (*btf_trace_mark_victim)(void *, int); + +typedef void (*btf_trace_wake_reaper)(void *, int); + +typedef void (*btf_trace_start_task_reaping)(void *, int); + +typedef void (*btf_trace_finish_task_reaping)(void *, int); + +typedef void (*btf_trace_skip_task_reaping)(void *, int); + +typedef void (*btf_trace_compact_retry)(void *, int, enum compact_priority, enum compact_result, int, int, bool); + +enum p9_perm_t { + P9_DMDIR = 2147483648, + P9_DMAPPEND = 1073741824, + P9_DMEXCL = 536870912, + P9_DMMOUNT = 268435456, + P9_DMAUTH = 134217728, + P9_DMTMP = 67108864, + P9_DMSYMLINK = 33554432, + P9_DMLINK = 16777216, + P9_DMDEVICE = 8388608, + P9_DMNAMEDPIPE = 2097152, + P9_DMSOCKET = 1048576, + P9_DMSETUID = 524288, + P9_DMSETGID = 262144, + P9_DMSETVTX = 65536, +}; + +struct p9_dirent { + struct p9_qid qid; + u64 d_off; + unsigned char d_type; + char d_name[256]; +}; + +struct p9_rdir { + int head; + int tail; + uint8_t buf[0]; +}; + +struct sha1_state { + u32 state[5]; + u64 count; + u8 buffer[64]; +}; + +typedef void sha1_block_fn(struct sha1_state *, const u8 *, int); + +enum { + GENHD_FL_REMOVABLE = 1, + GENHD_FL_HIDDEN = 2, + GENHD_FL_NO_PART = 4, +}; + +struct badblocks { + struct device *dev; + int count; + int unacked_exist; + int shift; + u64 *page; + int changed; + seqlock_t lock; + sector_t sector; + sector_t size; +}; + +struct blk_major_name { + struct blk_major_name *next; + int major; + char name[16]; + void (*probe)(dev_t); +}; + +typedef struct { + U32 f1c; + U32 f1d; + U32 f7b; + U32 f7c; +} ZSTD_cpuid_t; + +typedef struct { + size_t error; + int lowerBound; + int upperBound; +} ZSTD_bounds; + +typedef enum { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3, +} ZSTD_ResetDirective; + +typedef enum { + ZSTD_d_windowLogMax = 100, + ZSTD_d_experimentalParam1 = 1000, + ZSTD_d_experimentalParam2 = 1001, + ZSTD_d_experimentalParam3 = 1002, + ZSTD_d_experimentalParam4 = 1003, +} ZSTD_dParameter; + +struct ZSTD_inBuffer_s { + const void *src; + size_t size; + size_t pos; +}; + +typedef struct ZSTD_inBuffer_s ZSTD_inBuffer; + +typedef ZSTD_DCtx ZSTD_DStream; + +typedef enum { + ZSTDnit_frameHeader = 0, + ZSTDnit_blockHeader = 1, + ZSTDnit_block = 2, + ZSTDnit_lastBlock = 3, + ZSTDnit_checksum = 4, + ZSTDnit_skippableFrame = 5, +} ZSTD_nextInputType_e; + +typedef struct { + size_t compressedSize; + long long unsigned int decompressedBound; +} ZSTD_frameSizeInfo; + +enum pcie_reset_state { + pcie_deassert_reset = 1, + pcie_warm_reset = 2, + pcie_hot_reset = 3, +}; + +typedef int (*arch_set_vga_state_t)(struct pci_dev *, bool, unsigned int, u32); + +struct pci_reset_fn_method { + int (*reset_fn)(struct pci_dev *, bool); + char *name; +}; + +struct pci_pme_device { + struct list_head list; + struct pci_dev *dev; +}; + +struct pci_saved_state { + u32 config_space[16]; + struct pci_cap_saved_data cap[0]; +}; + +struct pci_devres { + unsigned int enabled: 1; + unsigned int pinned: 1; + unsigned int orig_intx: 1; + unsigned int restore_intx: 1; + unsigned int mwi: 1; + u32 region_mask; +}; + +struct brd_device { + int brd_number; + struct gendisk *brd_disk; + struct list_head brd_list; + spinlock_t brd_lock; + struct xarray brd_pages; + u64 brd_nr_pages; +}; + +enum { + NAPIF_STATE_SCHED = 1, + NAPIF_STATE_MISSED = 2, + NAPIF_STATE_DISABLE = 4, + NAPIF_STATE_NPSVC = 8, + NAPIF_STATE_LISTED = 16, + NAPIF_STATE_NO_BUSY_POLL = 32, + NAPIF_STATE_IN_BUSY_POLL = 64, + NAPIF_STATE_PREFER_BUSY_POLL = 128, + NAPIF_STATE_THREADED = 256, + NAPIF_STATE_SCHED_THREADED = 512, +}; + +struct net_device_path_stack { + int num_paths; + struct net_device_path path[5]; +}; + +struct bpf_xdp_link { + struct bpf_link link; + struct net_device *dev; + int flags; +}; + +struct netdev_net_notifier { + struct list_head list; + struct notifier_block *nb; +}; + +struct netdev_notifier_changelowerstate_info { + struct netdev_notifier_info info; + void *lower_state_info; +}; + +struct netdev_notifier_pre_changeaddr_info { + struct netdev_notifier_info info; + const unsigned char *dev_addr; +}; + +struct netdev_notifier_offload_xstats_rd { + struct rtnl_hw_stats64 stats; + bool used; +}; + +struct netdev_notifier_offload_xstats_ru { + bool used; +}; + +enum { + NESTED_SYNC_IMM_BIT = 0, + NESTED_SYNC_TODO_BIT = 1, +}; + +struct netdev_notifier_bonding_info { + struct netdev_notifier_info info; + struct netdev_bonding_info bonding_info; +}; + +enum qdisc_state2_t { + __QDISC_STATE2_RUNNING = 0, +}; + +struct tc_skb_cb { + struct qdisc_skb_cb qdisc_cb; + u16 mru; + u8 post_ct: 1; + u8 post_ct_snat: 1; + u8 post_ct_dnat: 1; + u16 zone; +}; + +typedef int (*bpf_op_t)(struct net_device *, struct netdev_bpf *); + +struct dev_kfree_skb_cb { + enum skb_free_reason reason; +}; + +struct netdev_adjacent { + struct net_device *dev; + netdevice_tracker dev_tracker; + bool master; + bool ignore; + u16 ref_nr; + void *private; + struct list_head list; + struct callback_head rcu; +}; + +struct timer_list_iter { + int cpu; + bool second_pass; + u64 now; +}; + +struct trace_event_raw_error_report_template { + struct trace_entry ent; + enum error_detector error_detector; + long unsigned int id; + char __data[0]; +}; + +struct trace_event_data_offsets_error_report_template {}; + +typedef void (*btf_trace_error_report_end)(void *, enum error_detector, long unsigned int); + +struct static_key_mod { + struct static_key_mod *next; + struct jump_entry *entries; + struct module *mod; +}; + +struct static_key_deferred { + struct static_key key; + long unsigned int timeout; + struct delayed_work work; +}; + +struct list_lru_memcg { + struct callback_head rcu; + struct list_lru_one node[0]; +}; + +struct list_lru_memcg_table { + struct list_lru_memcg *mlru; + struct mem_cgroup *memcg; +}; + +struct iomap_ops; + +struct keyring_read_iterator_context { + size_t buflen; + size_t count; + key_serial_t *buffer; +}; + +struct acpi_dev_match_info { + struct acpi_device_id hid[2]; + const char *uid; + s64 hrv; +}; + +struct clk_composite { + struct clk_hw hw; + struct clk_ops ops; + struct clk_hw *mux_hw; + struct clk_hw *rate_hw; + struct clk_hw *gate_hw; + const struct clk_ops *mux_ops; + const struct clk_ops *rate_ops; + const struct clk_ops *gate_ops; +}; + +struct lirc_fh { + struct list_head list; + struct rc_dev *rc; + int carrier_low; + struct { + union { + struct __kfifo kfifo; + unsigned int *type; + const unsigned int *const_type; + char (*rectype)[0]; + unsigned int *ptr; + const unsigned int *ptr_const; + }; + unsigned int buf[0]; + } rawir; + struct { + union { + struct __kfifo kfifo; + struct lirc_scancode *type; + const struct lirc_scancode *const_type; + char (*rectype)[0]; + struct lirc_scancode *ptr; + const struct lirc_scancode *ptr_const; + }; + struct lirc_scancode buf[0]; + } scancodes; + wait_queue_head_t wait_poll; + u8 send_mode; + u8 rec_mode; +}; + +struct ts_state { + unsigned int offset; + char cb[48]; +}; + +struct ts_config; + +struct ts_ops { + const char *name; + struct ts_config * (*init)(const void *, unsigned int, gfp_t, int); + unsigned int (*find)(struct ts_config *, struct ts_state *); + void (*destroy)(struct ts_config *); + void * (*get_pattern)(struct ts_config *); + unsigned int (*get_pattern_len)(struct ts_config *); + struct module *owner; + struct list_head list; +}; + +struct ts_config { + struct ts_ops *ops; + int flags; + unsigned int (*get_next_block)(unsigned int, const u8 **, struct ts_config *, struct ts_state *); + void (*finish)(struct ts_config *, struct ts_state *); +}; + +struct skb_seq_state { + __u32 lower_offset; + __u32 upper_offset; + __u32 frag_idx; + __u32 stepped_offset; + struct sk_buff *root_skb; + struct sk_buff *cur_skb; + __u8 *frag_data; + __u32 frag_off; +}; + +struct ip_auth_hdr { + __u8 nexthdr; + __u8 hdrlen; + __be16 reserved; + __be32 spi; + __be32 seq_no; + __u8 auth_data[0]; +}; + +struct page_frag_1k { + void *va; + u16 offset; + bool pfmemalloc; +}; + +struct napi_alloc_cache { + struct page_frag_cache page; + struct page_frag_1k page_small; + unsigned int skb_count; + void *skb_cache[64]; +}; + +typedef int (*sendmsg_func)(struct sock *, struct msghdr *, struct kvec *, size_t, size_t); + +typedef int (*sendpage_func)(struct sock *, struct page *, int, size_t, int); + +enum cpuhp_smt_control { + CPU_SMT_ENABLED = 0, + CPU_SMT_DISABLED = 1, + CPU_SMT_FORCE_DISABLED = 2, + CPU_SMT_NOT_SUPPORTED = 3, + CPU_SMT_NOT_IMPLEMENTED = 4, +}; + +struct trace_event_raw_cpuhp_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_multi_enter { + struct trace_entry ent; + unsigned int cpu; + int target; + int idx; + void *fun; + char __data[0]; +}; + +struct trace_event_raw_cpuhp_exit { + struct trace_entry ent; + unsigned int cpu; + int state; + int idx; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_cpuhp_enter {}; + +struct trace_event_data_offsets_cpuhp_multi_enter {}; + +struct trace_event_data_offsets_cpuhp_exit {}; + +typedef void (*btf_trace_cpuhp_enter)(void *, unsigned int, int, int, int (*)(unsigned int)); + +typedef void (*btf_trace_cpuhp_multi_enter)(void *, unsigned int, int, int, int (*)(unsigned int, struct hlist_node *), struct hlist_node *); + +typedef void (*btf_trace_cpuhp_exit)(void *, unsigned int, int, int, int); + +struct cpuhp_cpu_state { + enum cpuhp_state state; + enum cpuhp_state target; + enum cpuhp_state fail; + struct task_struct *thread; + bool should_run; + bool rollback; + bool single; + bool bringup; + struct hlist_node *node; + struct hlist_node *last; + enum cpuhp_state cb_state; + int result; + struct completion done_up; + struct completion done_down; +}; + +struct cpuhp_step { + const char *name; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } startup; + union { + int (*single)(unsigned int); + int (*multi)(unsigned int, struct hlist_node *); + } teardown; + struct hlist_head list; + bool cant_stop; + bool multi_instance; +}; + +enum cpu_mitigations { + CPU_MITIGATIONS_OFF = 0, + CPU_MITIGATIONS_AUTO = 1, + CPU_MITIGATIONS_AUTO_NOSMT = 2, +}; + +union swap_header { + struct { + char reserved[4086]; + char magic[10]; + } magic; + struct { + char bootbits[1024]; + __u32 version; + __u32 last_page; + __u32 nr_badpages; + unsigned char sws_uuid[16]; + unsigned char sws_volume[16]; + __u32 padding[117]; + __u32 badpages[1]; + } info; +}; + +struct swap_extent { + struct rb_node rb_node; + long unsigned int start_page; + long unsigned int nr_pages; + sector_t start_block; +}; + +enum legacy_fs_param { + LEGACY_FS_UNSET_PARAMS = 0, + LEGACY_FS_MONOLITHIC_PARAMS = 1, + LEGACY_FS_INDIVIDUAL_PARAMS = 2, +}; + +struct legacy_fs_context { + char *legacy_data; + size_t data_size; + enum legacy_fs_param param_type; +}; + +struct proc_maps_private { + struct inode *inode; + struct task_struct *task; + struct mm_struct *mm; + struct vma_iterator iter; + struct mempolicy *task_mempolicy; +}; + +struct mem_size_stats { + long unsigned int resident; + long unsigned int shared_clean; + long unsigned int shared_dirty; + long unsigned int private_clean; + long unsigned int private_dirty; + long unsigned int referenced; + long unsigned int anonymous; + long unsigned int lazyfree; + long unsigned int anonymous_thp; + long unsigned int shmem_thp; + long unsigned int file_thp; + long unsigned int swap; + long unsigned int shared_hugetlb; + long unsigned int private_hugetlb; + u64 pss; + u64 pss_anon; + u64 pss_file; + u64 pss_shmem; + u64 pss_dirty; + u64 pss_locked; + u64 swap_pss; +}; + +enum clear_refs_types { + CLEAR_REFS_ALL = 1, + CLEAR_REFS_ANON = 2, + CLEAR_REFS_MAPPED = 3, + CLEAR_REFS_SOFT_DIRTY = 4, + CLEAR_REFS_MM_HIWATER_RSS = 5, + CLEAR_REFS_LAST = 6, +}; + +struct clear_refs_private { + enum clear_refs_types type; +}; + +typedef struct { + u64 pme; +} pagemap_entry_t; + +struct pagemapread { + int pos; + int len; + pagemap_entry_t *buffer; + bool show_pfn; +}; + +struct numa_maps { + long unsigned int pages; + long unsigned int anon; + long unsigned int active; + long unsigned int writeback; + long unsigned int mapcount_max; + long unsigned int dirty; + long unsigned int swapcache; + long unsigned int node[64]; +}; + +struct numa_maps_private { + struct proc_maps_private proc_maps; + struct numa_maps md; +}; + +enum hugetlbfs_size_type { + NO_SIZE = 0, + SIZE_STD = 1, + SIZE_PERCENT = 2, +}; + +struct hugetlbfs_fs_context { + struct hstate *hstate; + long long unsigned int max_size_opt; + long long unsigned int min_size_opt; + long int max_hpages; + long int nr_inodes; + long int min_hpages; + enum hugetlbfs_size_type max_val_type; + enum hugetlbfs_size_type min_val_type; + kuid_t uid; + kgid_t gid; + umode_t mode; +}; + +enum hugetlb_param { + Opt_gid___4 = 0, + Opt_min_size = 1, + Opt_mode___4 = 2, + Opt_nr_inodes = 3, + Opt_pagesize = 4, + Opt_size = 5, + Opt_uid___3 = 6, +}; + +struct nlmsg_perm { + u16 nlmsg_type; + u32 perm; +}; + +struct sidtab_str_cache { + struct callback_head rcu_member; + struct list_head lru_member; + struct sidtab_entry *parent; + u32 len; + char str[0]; +}; + +struct ptp_clock; + +struct kvm_ptp_clock { + struct ptp_clock *ptp_clock; + struct ptp_clock_info caps; +}; + +struct update_classid_context { + u32 classid; + unsigned int batch; +}; + +enum { + SCTP_CHUNK_FLAG_T = 1, +}; + +struct tls12_crypto_info_aes_ccm_128 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_aria_gcm_128 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[16]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +struct tls12_crypto_info_aria_gcm_256 { + struct tls_crypto_info info; + unsigned char iv[8]; + unsigned char key[32]; + unsigned char salt[4]; + unsigned char rec_seq[8]; +}; + +enum { + TLS_BASE = 0, + TLS_SW = 1, + TLS_HW = 2, + TLS_HW_RECORD = 3, + TLS_NUM_CONFIG = 4, +}; + +struct tls_rec { + struct list_head list; + int tx_ready; + int tx_flags; + struct sk_msg msg_plaintext; + struct sk_msg msg_encrypted; + struct scatterlist sg_aead_in[2]; + struct scatterlist sg_aead_out[2]; + char content_type; + struct scatterlist sg_content_type; + char aad_space[13]; + u8 iv_data[16]; + long: 24; + long: 64; + long: 64; + struct aead_request aead_req; + u8 aead_req_ctx[0]; +}; + +struct tls_decrypt_arg { + union { + struct { + bool zc; + bool async; + u8 tail; + }; + struct { + bool zc; + bool async; + u8 tail; + } inargs; + }; + struct sk_buff *skb; +}; + +struct tls_decrypt_ctx { + u8 iv[16]; + u8 aad[13]; + u8 tail; + struct scatterlist sg[0]; +}; + +struct rusage { + struct __kernel_old_timeval ru_utime; + struct __kernel_old_timeval ru_stime; + __kernel_long_t ru_maxrss; + __kernel_long_t ru_ixrss; + __kernel_long_t ru_idrss; + __kernel_long_t ru_isrss; + __kernel_long_t ru_minflt; + __kernel_long_t ru_majflt; + __kernel_long_t ru_nswap; + __kernel_long_t ru_inblock; + __kernel_long_t ru_oublock; + __kernel_long_t ru_msgsnd; + __kernel_long_t ru_msgrcv; + __kernel_long_t ru_nsignals; + __kernel_long_t ru_nvcsw; + __kernel_long_t ru_nivcsw; +}; + +struct waitid_info { + pid_t pid; + uid_t uid; + int status; + int cause; +}; + +struct wait_opts { + enum pid_type wo_type; + int wo_flags; + struct pid *wo_pid; + struct waitid_info *wo_info; + int wo_stat; + struct rusage *wo_rusage; + wait_queue_entry_t child_wait; + int notask_error; +}; + +struct decrypt_bh_ctx { + struct work_struct work; + struct buffer_head *bh; +}; + +struct bh_lru { + struct buffer_head *bhs[16]; +}; + +struct bh_accounting { + int nr; + int ratelimit; +}; + +struct asymmetric_key_parser { + struct list_head link; + struct module *owner; + const char *name; + int (*parse)(struct key_preparsed_payload *); +}; + +struct io_fadvise { + struct file *file; + u64 offset; + u32 len; + u32 advice; +}; + +struct io_madvise { + struct file *file; + u64 addr; + u32 len; + u32 advice; +}; + +struct bpf_prog_offload_ops { + int (*insn_hook)(struct bpf_verifier_env *, int, int); + int (*finalize)(struct bpf_verifier_env *); + int (*replace_insn)(struct bpf_verifier_env *, u32, struct bpf_insn *); + int (*remove_insns)(struct bpf_verifier_env *, u32, u32); + int (*prepare)(struct bpf_prog *); + int (*translate)(struct bpf_prog *); + void (*destroy)(struct bpf_prog *); +}; + +struct nsim_bpf_bound_prog { + struct nsim_dev *nsim_dev; + struct bpf_prog *prog; + struct dentry *ddir; + const char *state; + bool is_loaded; + struct list_head l; +}; + +struct nsim_map_entry { + void *key; + void *value; +}; + +struct nsim_bpf_bound_map { + struct netdevsim *ns; + struct bpf_offloaded_map *map; + struct mutex mutex; + struct nsim_map_entry entry[2]; + struct list_head l; +}; + +enum nf_ct_tcp_action { + NFCT_TCP_IGNORE = 0, + NFCT_TCP_INVALID = 1, + NFCT_TCP_ACCEPT = 2, +}; + +enum tcp_bit_set { + TCP_SYN_SET = 0, + TCP_SYNACK_SET = 1, + TCP_FIN_SET = 2, + TCP_ACK_SET = 3, + TCP_RST_SET = 4, + TCP_NONE_SET = 5, +}; + +enum { + REGION_INTERSECTS = 0, + REGION_DISJOINT = 1, + REGION_MIXED = 2, +}; + +struct resource_constraint { + resource_size_t min; + resource_size_t max; + resource_size_t align; + resource_size_t (*alignf)(void *, const struct resource *, resource_size_t, resource_size_t); + void *alignf_data; +}; + +enum { + MAX_IORES_LEVEL = 5, +}; + +struct region_devres { + struct resource *parent; + resource_size_t start; + resource_size_t n; +}; + +struct kallsym_iter { + loff_t pos; + loff_t pos_arch_end; + loff_t pos_mod_end; + loff_t pos_ftrace_mod_end; + loff_t pos_bpf_end; + long unsigned int value; + unsigned int nameoff; + char type; + char name[512]; + char module_name[56]; + int exported; + int show_value; +}; + +struct bpf_iter__ksym { + union { + struct bpf_iter_meta *meta; + }; + union { + struct kallsym_iter *ksym; + }; +}; + +typedef int dio_iodone_t(struct kiocb *, loff_t, ssize_t, void *); + +typedef void dio_submit_t(struct bio *, struct inode *, loff_t); + +enum { + DIO_LOCKING = 1, + DIO_SKIP_HOLES = 2, +}; + +struct dio_submit { + struct bio *bio; + unsigned int blkbits; + unsigned int blkfactor; + unsigned int start_zero_done; + int pages_in_io; + sector_t block_in_file; + unsigned int blocks_available; + int reap_counter; + sector_t final_block_in_request; + int boundary; + get_block_t *get_block; + dio_submit_t *submit_io; + loff_t logical_offset_in_bio; + sector_t final_block_in_bio; + sector_t next_block_for_io; + struct page *cur_page; + unsigned int cur_page_offset; + unsigned int cur_page_len; + sector_t cur_page_block; + loff_t cur_page_fs_offset; + struct iov_iter *iter; + unsigned int head; + unsigned int tail; + size_t from; + size_t to; +}; + +struct dio { + int flags; + blk_opf_t opf; + struct gendisk *bio_disk; + struct inode *inode; + loff_t i_size; + dio_iodone_t *end_io; + void *private; + spinlock_t bio_lock; + int page_errors; + int is_async; + bool defer_completion; + bool should_dirty; + int io_error; + long unsigned int refcount; + struct bio *bio_list; + struct task_struct *waiter; + struct kiocb *iocb; + ssize_t result; + union { + struct page *pages[64]; + struct work_struct complete_work; + }; + long: 64; + long: 64; + long: 64; +}; + +struct iomap_swapfile_info { + struct iomap iomap; + struct swap_info_struct *sis; + uint64_t lowest_ppage; + uint64_t highest_ppage; + long unsigned int nr_pages; + int nr_extents; + struct file *file; +}; + +typedef struct { + __le32 *p; + __le32 key; + struct buffer_head *bh; +} Indirect; + +enum { + Opt_debug = 0, + Opt_dfltuid = 1, + Opt_dfltgid = 2, + Opt_afid = 3, + Opt_uname = 4, + Opt_remotename = 5, + Opt_cache = 6, + Opt_cachetag = 7, + Opt_nodevmap = 8, + Opt_cache_loose = 9, + Opt_fscache = 10, + Opt_mmap = 11, + Opt_access = 12, + Opt_posixacl = 13, + Opt_locktimeout = 14, + Opt_err___6 = 15, +}; + +enum { + IOPRIO_WHO_PROCESS = 1, + IOPRIO_WHO_PGRP = 2, + IOPRIO_WHO_USER = 3, +}; + +struct nsim_trap_item; + +struct nsim_trap_data { + struct delayed_work trap_report_dw; + struct nsim_trap_item *trap_items_arr; + u64 *trap_policers_cnt_arr; + u64 trap_pkt_cnt; + struct nsim_dev *nsim_dev; + spinlock_t trap_lock; +}; + +enum nsim_devlink_param_id { + NSIM_DEVLINK_PARAM_ID_BASE = 16, + NSIM_DEVLINK_PARAM_ID_TEST1 = 17, +}; + +struct nsim_trap_item { + void *trap_ctx; + enum devlink_trap_action action; +}; + +enum { + NSIM_TRAP_ID_BASE = 93, + NSIM_TRAP_ID_FID_MISS = 94, +}; + +struct nsim_rate_node { + struct dentry *ddir; + struct dentry *rate_parent; + char *parent_name; + u16 tx_share; + u16 tx_max; +}; + +struct compress_format { + unsigned char magic[2]; + const char *name; + decompress_fn decompressor; +}; + +struct ida_bitmap { + long unsigned int bitmap[16]; +}; + +struct trace_event_raw_irq_handler_entry { + struct trace_entry ent; + int irq; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_irq_handler_exit { + struct trace_entry ent; + int irq; + int ret; + char __data[0]; +}; + +struct trace_event_raw_softirq { + struct trace_entry ent; + unsigned int vec; + char __data[0]; +}; + +struct trace_event_data_offsets_irq_handler_entry { + u32 name; +}; + +struct trace_event_data_offsets_irq_handler_exit {}; + +struct trace_event_data_offsets_softirq {}; + +typedef void (*btf_trace_irq_handler_entry)(void *, int, struct irqaction *); + +typedef void (*btf_trace_irq_handler_exit)(void *, int, struct irqaction *, int); + +typedef void (*btf_trace_softirq_entry)(void *, unsigned int); + +typedef void (*btf_trace_softirq_exit)(void *, unsigned int); + +typedef void (*btf_trace_softirq_raise)(void *, unsigned int); + +struct tasklet_head { + struct tasklet_struct *head; + struct tasklet_struct **tail; +}; + +enum { + RES_USAGE___2 = 0, + RES_RSVD_USAGE = 1, + RES_LIMIT___2 = 2, + RES_RSVD_LIMIT = 3, + RES_MAX_USAGE___2 = 4, + RES_RSVD_MAX_USAGE = 5, + RES_FAILCNT___2 = 6, + RES_RSVD_FAILCNT = 7, +}; + +struct mpage_readpage_args { + struct bio *bio; + struct folio *folio; + unsigned int nr_pages; + bool is_readahead; + sector_t last_block_in_bio; + struct buffer_head map_bh; + long unsigned int first_logical_block; + get_block_t *get_block; +}; + +struct mpage_data { + struct bio *bio; + sector_t last_block_in_bio; + get_block_t *get_block; +}; + +struct keyctl_dh_params { + union { + __s32 private; + __s32 priv; + }; + __s32 prime; + __s32 base; +}; + +struct keyctl_kdf_params { + char *hashname; + char *otherinfo; + __u32 otherinfolen; + __u32 __spare[8]; +}; + +struct crypto_comp { + struct crypto_tfm base; +}; + +struct acpi_pkg_info { + u8 *free_space; + acpi_size length; + u32 object_space; + u32 num_packages; +}; + +struct unipair { + short unsigned int unicode; + short unsigned int fontpos; +}; + +struct uni_pagedict { + u16 **uni_pgdir[32]; + long unsigned int refcount; + long unsigned int sum; + unsigned char *inverse_translations[4]; + u16 *inverse_trans_unicode; +}; + +struct eee_reply_data { + struct ethnl_reply_data base; + struct ethtool_eee eee; +}; + +enum { + UDP_BPF_IPV4 = 0, + UDP_BPF_IPV6 = 1, + UDP_BPF_NUM_PROTS = 2, +}; + +enum { + IFLA_INET6_UNSPEC = 0, + IFLA_INET6_FLAGS = 1, + IFLA_INET6_CONF = 2, + IFLA_INET6_STATS = 3, + IFLA_INET6_MCAST = 4, + IFLA_INET6_CACHEINFO = 5, + IFLA_INET6_ICMP6STATS = 6, + IFLA_INET6_TOKEN = 7, + IFLA_INET6_ADDR_GEN_MODE = 8, + IFLA_INET6_RA_MTU = 9, + __IFLA_INET6_MAX = 10, +}; + +enum in6_addr_gen_mode { + IN6_ADDR_GEN_MODE_EUI64 = 0, + IN6_ADDR_GEN_MODE_NONE = 1, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY = 2, + IN6_ADDR_GEN_MODE_RANDOM = 3, +}; + +struct ifla_cacheinfo { + __u32 max_reasm_len; + __u32 tstamp; + __u32 reachable_time; + __u32 retrans_time; +}; + +struct prefixmsg { + unsigned char prefix_family; + unsigned char prefix_pad1; + short unsigned int prefix_pad2; + int prefix_ifindex; + unsigned char prefix_type; + unsigned char prefix_len; + unsigned char prefix_flags; + unsigned char prefix_pad3; +}; + +enum { + PREFIX_UNSPEC = 0, + PREFIX_ADDRESS = 1, + PREFIX_CACHEINFO = 2, + __PREFIX_MAX = 3, +}; + +struct prefix_cacheinfo { + __u32 preferred_time; + __u32 valid_time; +}; + +struct in6_ifreq { + struct in6_addr ifr6_addr; + __u32 ifr6_prefixlen; + int ifr6_ifindex; +}; + +enum { + DEVCONF_FORWARDING = 0, + DEVCONF_HOPLIMIT = 1, + DEVCONF_MTU6 = 2, + DEVCONF_ACCEPT_RA = 3, + DEVCONF_ACCEPT_REDIRECTS = 4, + DEVCONF_AUTOCONF = 5, + DEVCONF_DAD_TRANSMITS = 6, + DEVCONF_RTR_SOLICITS = 7, + DEVCONF_RTR_SOLICIT_INTERVAL = 8, + DEVCONF_RTR_SOLICIT_DELAY = 9, + DEVCONF_USE_TEMPADDR = 10, + DEVCONF_TEMP_VALID_LFT = 11, + DEVCONF_TEMP_PREFERED_LFT = 12, + DEVCONF_REGEN_MAX_RETRY = 13, + DEVCONF_MAX_DESYNC_FACTOR = 14, + DEVCONF_MAX_ADDRESSES = 15, + DEVCONF_FORCE_MLD_VERSION = 16, + DEVCONF_ACCEPT_RA_DEFRTR = 17, + DEVCONF_ACCEPT_RA_PINFO = 18, + DEVCONF_ACCEPT_RA_RTR_PREF = 19, + DEVCONF_RTR_PROBE_INTERVAL = 20, + DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN = 21, + DEVCONF_PROXY_NDP = 22, + DEVCONF_OPTIMISTIC_DAD = 23, + DEVCONF_ACCEPT_SOURCE_ROUTE = 24, + DEVCONF_MC_FORWARDING = 25, + DEVCONF_DISABLE_IPV6 = 26, + DEVCONF_ACCEPT_DAD = 27, + DEVCONF_FORCE_TLLAO = 28, + DEVCONF_NDISC_NOTIFY = 29, + DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL = 30, + DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL = 31, + DEVCONF_SUPPRESS_FRAG_NDISC = 32, + DEVCONF_ACCEPT_RA_FROM_LOCAL = 33, + DEVCONF_USE_OPTIMISTIC = 34, + DEVCONF_ACCEPT_RA_MTU = 35, + DEVCONF_STABLE_SECRET = 36, + DEVCONF_USE_OIF_ADDRS_ONLY = 37, + DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT = 38, + DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 39, + DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 40, + DEVCONF_DROP_UNSOLICITED_NA = 41, + DEVCONF_KEEP_ADDR_ON_DOWN = 42, + DEVCONF_RTR_SOLICIT_MAX_INTERVAL = 43, + DEVCONF_SEG6_ENABLED = 44, + DEVCONF_SEG6_REQUIRE_HMAC = 45, + DEVCONF_ENHANCED_DAD = 46, + DEVCONF_ADDR_GEN_MODE = 47, + DEVCONF_DISABLE_POLICY = 48, + DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN = 49, + DEVCONF_NDISC_TCLASS = 50, + DEVCONF_RPL_SEG_ENABLED = 51, + DEVCONF_RA_DEFRTR_METRIC = 52, + DEVCONF_IOAM6_ENABLED = 53, + DEVCONF_IOAM6_ID = 54, + DEVCONF_IOAM6_ID_WIDE = 55, + DEVCONF_NDISC_EVICT_NOCARRIER = 56, + DEVCONF_ACCEPT_UNTRACKED_NA = 57, + DEVCONF_MAX = 58, +}; + +struct ipv6_params { + __s32 disable_ipv6; + __s32 autoconf; +}; + +enum { + INET6_IFADDR_STATE_PREDAD = 0, + INET6_IFADDR_STATE_DAD = 1, + INET6_IFADDR_STATE_POSTDAD = 2, + INET6_IFADDR_STATE_ERRDAD = 3, + INET6_IFADDR_STATE_DEAD = 4, +}; + +union fwnet_hwaddr { + u8 u[16]; + struct { + __be64 uniq_id; + u8 max_rec; + u8 sspd; + u8 fifo[6]; + } uc; +}; + +struct in6_validator_info { + struct in6_addr i6vi_addr; + struct inet6_dev *i6vi_dev; + struct netlink_ext_ack *extack; +}; + +struct ifa6_config { + const struct in6_addr *pfx; + unsigned int plen; + u8 ifa_proto; + const struct in6_addr *peer_pfx; + u32 rt_priority; + u32 ifa_flags; + u32 preferred_lft; + u32 valid_lft; + u16 scope; +}; + +enum cleanup_prefix_rt_t { + CLEANUP_PREFIX_RT_NOP = 0, + CLEANUP_PREFIX_RT_DEL = 1, + CLEANUP_PREFIX_RT_EXPIRE = 2, +}; + +enum { + IPV6_SADDR_RULE_INIT = 0, + IPV6_SADDR_RULE_LOCAL = 1, + IPV6_SADDR_RULE_SCOPE = 2, + IPV6_SADDR_RULE_PREFERRED = 3, + IPV6_SADDR_RULE_HOA = 4, + IPV6_SADDR_RULE_OIF = 5, + IPV6_SADDR_RULE_LABEL = 6, + IPV6_SADDR_RULE_PRIVACY = 7, + IPV6_SADDR_RULE_ORCHID = 8, + IPV6_SADDR_RULE_PREFIX = 9, + IPV6_SADDR_RULE_MAX = 10, +}; + +struct ipv6_saddr_score { + int rule; + int addr_type; + struct inet6_ifaddr *ifa; + long unsigned int scorebits[1]; + int scopedist; + int matchlen; +}; + +struct ipv6_saddr_dst { + const struct in6_addr *addr; + int ifindex; + int scope; + int label; + unsigned int prefs; +}; + +struct if6_iter_state { + struct seq_net_private p; + int bucket; + int offset; +}; + +enum addr_type_t { + UNICAST_ADDR = 0, + MULTICAST_ADDR = 1, + ANYCAST_ADDR = 2, +}; + +struct inet6_fill_args { + u32 portid; + u32 seq; + int event; + unsigned int flags; + int netnsid; + int ifindex; + enum addr_type_t type; +}; + +enum { + DAD_PROCESS = 0, + DAD_BEGIN = 1, + DAD_ABORT = 2, +}; + +struct uprobe_trace_entry_head { + struct trace_entry ent; + long unsigned int vaddr[0]; +}; + +struct trace_uprobe { + struct dyn_event devent; + struct uprobe_consumer consumer; + struct path path; + struct inode *inode; + char *filename; + long unsigned int offset; + long unsigned int ref_ctr_offset; + long unsigned int nhit; + struct trace_probe tp; +}; + +struct uprobe_dispatch_data { + struct trace_uprobe *tu; + long unsigned int bp_addr; +}; + +struct uprobe_cpu_buffer { + struct mutex mutex; + void *buf; +}; + +typedef bool (*filter_func_t)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *); + +typedef void (*acpi_gbl_event_handler)(u32, acpi_handle, u32, void *); + +struct acpi_table_bert { + struct acpi_table_header header; + u32 region_length; + u64 address; +}; + +struct acpi_table_attr { + struct bin_attribute attr; + char name[4]; + int instance; + char filename[8]; + struct list_head node; +}; + +struct acpi_data_attr { + struct bin_attribute attr; + u64 addr; +}; + +struct acpi_data_obj { + char *name; + int (*fn)(void *, struct acpi_data_attr *); +}; + +struct event_counter { + u32 count; + u32 flags; +}; + +struct clk_notifier { + struct clk *clk; + struct srcu_notifier_head notifier_head; + struct list_head node; +}; + +struct clk_notifier_data { + struct clk *clk; + long unsigned int old_rate; + long unsigned int new_rate; +}; + +struct clk_parent_map; + +struct clk_core { + const char *name; + const struct clk_ops *ops; + struct clk_hw *hw; + struct module *owner; + struct device *dev; + struct device_node *of_node; + struct clk_core *parent; + struct clk_parent_map *parents; + u8 num_parents; + u8 new_parent_index; + long unsigned int rate; + long unsigned int req_rate; + long unsigned int new_rate; + struct clk_core *new_parent; + struct clk_core *new_child; + long unsigned int flags; + bool orphan; + bool rpm_enabled; + unsigned int enable_count; + unsigned int prepare_count; + unsigned int protect_count; + long unsigned int min_rate; + long unsigned int max_rate; + long unsigned int accuracy; + int phase; + struct clk_duty duty; + struct hlist_head children; + struct hlist_node child_node; + struct hlist_head clks; + unsigned int notifier_count; + struct dentry *dentry; + struct hlist_node debug_node; + struct kref ref; +}; + +struct clk_onecell_data { + struct clk **clks; + unsigned int clk_num; +}; + +struct clk_hw_onecell_data { + unsigned int num; + struct clk_hw *hws[0]; +}; + +struct clk_parent_map { + const struct clk_hw *hw; + struct clk_core *core; + const char *fw_name; + const char *name; + int index; +}; + +struct trace_event_raw_clk { + struct trace_entry ent; + u32 __data_loc_name; + char __data[0]; +}; + +struct trace_event_raw_clk_rate { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int rate; + char __data[0]; +}; + +struct trace_event_raw_clk_rate_range { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int min; + long unsigned int max; + char __data[0]; +}; + +struct trace_event_raw_clk_parent { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_pname; + char __data[0]; +}; + +struct trace_event_raw_clk_phase { + struct trace_entry ent; + u32 __data_loc_name; + int phase; + char __data[0]; +}; + +struct trace_event_raw_clk_duty_cycle { + struct trace_entry ent; + u32 __data_loc_name; + unsigned int num; + unsigned int den; + char __data[0]; +}; + +struct trace_event_raw_clk_rate_request { + struct trace_entry ent; + u32 __data_loc_name; + u32 __data_loc_pname; + long unsigned int min; + long unsigned int max; + long unsigned int prate; + char __data[0]; +}; + +struct trace_event_data_offsets_clk { + u32 name; +}; + +struct trace_event_data_offsets_clk_rate { + u32 name; +}; + +struct trace_event_data_offsets_clk_rate_range { + u32 name; +}; + +struct trace_event_data_offsets_clk_parent { + u32 name; + u32 pname; +}; + +struct trace_event_data_offsets_clk_phase { + u32 name; +}; + +struct trace_event_data_offsets_clk_duty_cycle { + u32 name; +}; + +struct trace_event_data_offsets_clk_rate_request { + u32 name; + u32 pname; +}; + +typedef void (*btf_trace_clk_enable)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_enable_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_disable)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_disable_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_prepare)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_prepare_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_unprepare)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_unprepare_complete)(void *, struct clk_core *); + +typedef void (*btf_trace_clk_set_rate)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_rate_complete)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_min_rate)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_max_rate)(void *, struct clk_core *, long unsigned int); + +typedef void (*btf_trace_clk_set_rate_range)(void *, struct clk_core *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_clk_set_parent)(void *, struct clk_core *, struct clk_core *); + +typedef void (*btf_trace_clk_set_parent_complete)(void *, struct clk_core *, struct clk_core *); + +typedef void (*btf_trace_clk_set_phase)(void *, struct clk_core *, int); + +typedef void (*btf_trace_clk_set_phase_complete)(void *, struct clk_core *, int); + +typedef void (*btf_trace_clk_set_duty_cycle)(void *, struct clk_core *, struct clk_duty *); + +typedef void (*btf_trace_clk_set_duty_cycle_complete)(void *, struct clk_core *, struct clk_duty *); + +typedef void (*btf_trace_clk_rate_request_start)(void *, struct clk_rate_request *); + +typedef void (*btf_trace_clk_rate_request_done)(void *, struct clk_rate_request *); + +struct clk_notifier_devres { + struct clk *clk; + struct notifier_block *nb; +}; + +struct of_clk_provider { + struct list_head link; + struct device_node *node; + struct clk * (*get)(struct of_phandle_args *, void *); + struct clk_hw * (*get_hw)(struct of_phandle_args *, void *); + void *data; +}; + +struct clock_provider { + void (*clk_init_cb)(struct device_node *); + struct device_node *np; + struct list_head node; +}; + +enum { + BPF_F_RECOMPUTE_CSUM = 1, + BPF_F_INVALIDATE_HASH = 2, +}; + +enum { + BPF_F_HDR_FIELD_MASK = 15, +}; + +enum { + BPF_F_PSEUDO_HDR = 16, + BPF_F_MARK_MANGLED_0 = 32, + BPF_F_MARK_ENFORCE = 64, +}; + +enum { + BPF_F_TUNINFO_IPV6 = 1, +}; + +enum { + BPF_F_ZERO_CSUM_TX = 2, + BPF_F_DONT_FRAGMENT = 4, + BPF_F_SEQ_NUMBER = 8, +}; + +enum { + BPF_F_TUNINFO_FLAGS = 16, +}; + +enum { + BPF_CSUM_LEVEL_QUERY = 0, + BPF_CSUM_LEVEL_INC = 1, + BPF_CSUM_LEVEL_DEC = 2, + BPF_CSUM_LEVEL_RESET = 3, +}; + +enum { + BPF_F_ADJ_ROOM_FIXED_GSO = 1, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 2, + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 4, + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 8, + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 16, + BPF_F_ADJ_ROOM_NO_CSUM_RESET = 32, + BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 64, +}; + +enum { + BPF_ADJ_ROOM_ENCAP_L2_MASK = 255, + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, +}; + +enum { + BPF_SK_LOOKUP_F_REPLACE = 1, + BPF_SK_LOOKUP_F_NO_REUSEPORT = 2, +}; + +enum bpf_adj_room_mode { + BPF_ADJ_ROOM_NET = 0, + BPF_ADJ_ROOM_MAC = 1, +}; + +enum bpf_hdr_start_off { + BPF_HDR_START_MAC = 0, + BPF_HDR_START_NET = 1, +}; + +enum bpf_lwt_encap_mode { + BPF_LWT_ENCAP_SEG6 = 0, + BPF_LWT_ENCAP_SEG6_INLINE = 1, + BPF_LWT_ENCAP_IP = 2, +}; + +enum { + BPF_SKB_TSTAMP_UNSPEC = 0, + BPF_SKB_TSTAMP_DELIVERY_MONO = 1, +}; + +struct bpf_tunnel_key { + __u32 tunnel_id; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; + __u8 tunnel_tos; + __u8 tunnel_ttl; + union { + __u16 tunnel_ext; + __be16 tunnel_flags; + }; + __u32 tunnel_label; + union { + __u32 local_ipv4; + __u32 local_ipv6[4]; + }; +}; + +struct bpf_xfrm_state { + __u32 reqid; + __u32 spi; + __u16 family; + __u16 ext; + union { + __u32 remote_ipv4; + __u32 remote_ipv6[4]; + }; +}; + +struct bpf_tcp_sock { + __u32 snd_cwnd; + __u32 srtt_us; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u64 bytes_received; + __u64 bytes_acked; + __u32 dsack_dups; + __u32 delivered; + __u32 delivered_ce; + __u32 icsk_retransmits; +}; + +struct bpf_xdp_sock { + __u32 queue_id; +}; + +struct sk_msg_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 size; + union { + struct bpf_sock *sk; + }; +}; + +struct sk_reuseport_md { + union { + void *data; + }; + union { + void *data_end; + }; + __u32 len; + __u32 eth_protocol; + __u32 ip_protocol; + __u32 bind_inany; + __u32 hash; + union { + struct bpf_sock *sk; + }; + union { + struct bpf_sock *migrating_sk; + }; +}; + +struct bpf_sock_addr { + __u32 user_family; + __u32 user_ip4; + __u32 user_ip6[4]; + __u32 user_port; + __u32 family; + __u32 type; + __u32 protocol; + __u32 msg_src_ip4; + __u32 msg_src_ip6[4]; + union { + struct bpf_sock *sk; + }; +}; + +struct bpf_sock_ops { + __u32 op; + union { + __u32 args[4]; + __u32 reply; + __u32 replylong[4]; + }; + __u32 family; + __u32 remote_ip4; + __u32 local_ip4; + __u32 remote_ip6[4]; + __u32 local_ip6[4]; + __u32 remote_port; + __u32 local_port; + __u32 is_fullsock; + __u32 snd_cwnd; + __u32 srtt_us; + __u32 bpf_sock_ops_cb_flags; + __u32 state; + __u32 rtt_min; + __u32 snd_ssthresh; + __u32 rcv_nxt; + __u32 snd_nxt; + __u32 snd_una; + __u32 mss_cache; + __u32 ecn_flags; + __u32 rate_delivered; + __u32 rate_interval_us; + __u32 packets_out; + __u32 retrans_out; + __u32 total_retrans; + __u32 segs_in; + __u32 data_segs_in; + __u32 segs_out; + __u32 data_segs_out; + __u32 lost_out; + __u32 sacked_out; + __u32 sk_txhash; + __u64 bytes_received; + __u64 bytes_acked; + union { + struct bpf_sock *sk; + }; + union { + void *skb_data; + }; + union { + void *skb_data_end; + }; + __u32 skb_len; + __u32 skb_tcp_flags; + __u64 skb_hwtstamp; +}; + +enum { + TCP_BPF_IW = 1001, + TCP_BPF_SNDCWND_CLAMP = 1002, + TCP_BPF_DELACK_MAX = 1003, + TCP_BPF_RTO_MIN = 1004, + TCP_BPF_SYN = 1005, + TCP_BPF_SYN_IP = 1006, + TCP_BPF_SYN_MAC = 1007, +}; + +enum { + BPF_LOAD_HDR_OPT_TCP_SYN = 1, +}; + +enum { + BPF_FIB_LOOKUP_DIRECT = 1, + BPF_FIB_LOOKUP_OUTPUT = 2, +}; + +enum { + BPF_FIB_LKUP_RET_SUCCESS = 0, + BPF_FIB_LKUP_RET_BLACKHOLE = 1, + BPF_FIB_LKUP_RET_UNREACHABLE = 2, + BPF_FIB_LKUP_RET_PROHIBIT = 3, + BPF_FIB_LKUP_RET_NOT_FWDED = 4, + BPF_FIB_LKUP_RET_FWD_DISABLED = 5, + BPF_FIB_LKUP_RET_UNSUPP_LWT = 6, + BPF_FIB_LKUP_RET_NO_NEIGH = 7, + BPF_FIB_LKUP_RET_FRAG_NEEDED = 8, +}; + +struct bpf_fib_lookup { + __u8 family; + __u8 l4_protocol; + __be16 sport; + __be16 dport; + union { + __u16 tot_len; + __u16 mtu_result; + }; + __u32 ifindex; + union { + __u8 tos; + __be32 flowinfo; + __u32 rt_metric; + }; + union { + __be32 ipv4_src; + __u32 ipv6_src[4]; + }; + union { + __be32 ipv4_dst; + __u32 ipv6_dst[4]; + }; + __be16 h_vlan_proto; + __be16 h_vlan_TCI; + __u8 smac[6]; + __u8 dmac[6]; +}; + +struct bpf_redir_neigh { + __u32 nh_family; + union { + __be32 ipv4_nh; + __u32 ipv6_nh[4]; + }; +}; + +enum bpf_check_mtu_flags { + BPF_MTU_CHK_SEGS = 1, +}; + +enum bpf_check_mtu_ret { + BPF_MTU_CHK_RET_SUCCESS = 0, + BPF_MTU_CHK_RET_FRAG_NEEDED = 1, + BPF_MTU_CHK_RET_SEGS_TOOBIG = 2, +}; + +struct bpf_dispatcher_prog { + struct bpf_prog *prog; + refcount_t users; +}; + +struct bpf_dispatcher { + struct mutex mutex; + void *func; + struct bpf_dispatcher_prog progs[48]; + int num_progs; + void *image; + void *rw_image; + u32 image_off; + struct bpf_ksym ksym; +}; + +struct sk_reuseport_kern { + struct sk_buff *skb; + struct sock *sk; + struct sock *selected_sk; + struct sock *migrating_sk; + void *data_end; + u32 hash; + u32 reuseport_id; + bool bind_inany; +}; + +struct compat_sock_fprog { + u16 len; + compat_uptr_t filter; +}; + +struct udp6_sock { + struct udp_sock udp; + struct ipv6_pinfo inet6; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct tcp6_sock { + struct tcp_sock tcp; + struct ipv6_pinfo inet6; +}; + +struct ipv6_bpf_stub { + int (*inet6_bind)(struct sock *, struct sockaddr *, int, u32); + struct sock * (*udp6_lib_lookup)(struct net *, const struct in6_addr *, __be16, const struct in6_addr *, __be16, int, int, struct udp_table *, struct sk_buff *); + int (*ipv6_setsockopt)(struct sock *, int, int, sockptr_t, unsigned int); + int (*ipv6_getsockopt)(struct sock *, int, int, sockptr_t, sockptr_t); +}; + +enum { + SEG6_LOCAL_ACTION_UNSPEC = 0, + SEG6_LOCAL_ACTION_END = 1, + SEG6_LOCAL_ACTION_END_X = 2, + SEG6_LOCAL_ACTION_END_T = 3, + SEG6_LOCAL_ACTION_END_DX2 = 4, + SEG6_LOCAL_ACTION_END_DX6 = 5, + SEG6_LOCAL_ACTION_END_DX4 = 6, + SEG6_LOCAL_ACTION_END_DT6 = 7, + SEG6_LOCAL_ACTION_END_DT4 = 8, + SEG6_LOCAL_ACTION_END_B6 = 9, + SEG6_LOCAL_ACTION_END_B6_ENCAP = 10, + SEG6_LOCAL_ACTION_END_BM = 11, + SEG6_LOCAL_ACTION_END_S = 12, + SEG6_LOCAL_ACTION_END_AS = 13, + SEG6_LOCAL_ACTION_END_AM = 14, + SEG6_LOCAL_ACTION_END_BPF = 15, + SEG6_LOCAL_ACTION_END_DT46 = 16, + __SEG6_LOCAL_ACTION_MAX = 17, +}; + +struct seg6_bpf_srh_state { + struct ipv6_sr_hdr *srh; + u16 hdrlen; + bool valid; +}; + +typedef u64 (*btf_bpf_skb_get_pay_offset)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_get_nlattr)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_get_nlattr_nest)(struct sk_buff *, u32, u32); + +typedef u64 (*btf_bpf_skb_load_helper_8)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_8_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_16)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_16_no_cache)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_skb_load_helper_32)(const struct sk_buff *, const void *, int, int); + +typedef u64 (*btf_bpf_skb_load_helper_32_no_cache)(const struct sk_buff *, int); + +struct bpf_scratchpad { + union { + __be32 diff[128]; + u8 buff[512]; + }; +}; + +typedef u64 (*btf_bpf_skb_store_bytes)(struct sk_buff *, u32, const void *, u32, u64); + +typedef u64 (*btf_bpf_skb_load_bytes)(const struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_flow_dissector_load_bytes)(const struct bpf_flow_dissector *, u32, void *, u32); + +typedef u64 (*btf_bpf_skb_load_bytes_relative)(const struct sk_buff *, u32, void *, u32, u32); + +typedef u64 (*btf_bpf_skb_pull_data)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_sk_fullsock)(struct sock *); + +typedef u64 (*btf_sk_skb_pull_data)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_l3_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_l4_csum_replace)(struct sk_buff *, u32, u64, u64, u64); + +typedef u64 (*btf_bpf_csum_diff)(__be32 *, u32, __be32 *, u32, __wsum); + +typedef u64 (*btf_bpf_csum_update)(struct sk_buff *, __wsum); + +typedef u64 (*btf_bpf_csum_level)(struct sk_buff *, u64); + +enum { + BPF_F_NEIGH = 2, + BPF_F_PEER = 4, + BPF_F_NEXTHOP = 8, +}; + +typedef u64 (*btf_bpf_clone_redirect)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_redirect)(u32, u64); + +typedef u64 (*btf_bpf_redirect_peer)(u32, u64); + +typedef u64 (*btf_bpf_redirect_neigh)(u32, struct bpf_redir_neigh *, int, u64); + +typedef u64 (*btf_bpf_msg_apply_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_cork_bytes)(struct sk_msg *, u32); + +typedef u64 (*btf_bpf_msg_pull_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_push_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_msg_pop_data)(struct sk_msg *, u32, u32, u64); + +typedef u64 (*btf_bpf_get_cgroup_classid_curr)(); + +typedef u64 (*btf_bpf_skb_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_cgroup_classid)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_route_realm)(const struct sk_buff *); + +typedef u64 (*btf_bpf_get_hash_recalc)(struct sk_buff *); + +typedef u64 (*btf_bpf_set_hash_invalid)(struct sk_buff *); + +typedef u64 (*btf_bpf_set_hash)(struct sk_buff *, u32); + +typedef u64 (*btf_bpf_skb_vlan_push)(struct sk_buff *, __be16, u16); + +typedef u64 (*btf_bpf_skb_vlan_pop)(struct sk_buff *); + +typedef u64 (*btf_bpf_skb_change_proto)(struct sk_buff *, __be16, u64); + +typedef u64 (*btf_bpf_skb_change_type)(struct sk_buff *, u32); + +typedef u64 (*btf_sk_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_bpf_skb_adjust_room)(struct sk_buff *, s32, u32, u64); + +typedef u64 (*btf_bpf_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_change_tail)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_sk_skb_change_head)(struct sk_buff *, u32, u64); + +typedef u64 (*btf_bpf_xdp_get_buff_len)(struct xdp_buff *); + +typedef u64 (*btf_bpf_xdp_adjust_head)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_load_bytes)(struct xdp_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_xdp_store_bytes)(struct xdp_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_xdp_adjust_tail)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_adjust_meta)(struct xdp_buff *, int); + +typedef u64 (*btf_bpf_xdp_redirect)(u32, u64); + +typedef u64 (*btf_bpf_xdp_redirect_map)(struct bpf_map *, u64, u64); + +typedef u64 (*btf_bpf_skb_event_output)(struct sk_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_skb_get_tunnel_key)(struct sk_buff *, struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_get_tunnel_opt)(struct sk_buff *, u8 *, u32); + +typedef u64 (*btf_bpf_skb_set_tunnel_key)(struct sk_buff *, const struct bpf_tunnel_key *, u32, u64); + +typedef u64 (*btf_bpf_skb_set_tunnel_opt)(struct sk_buff *, const u8 *, u32); + +typedef u64 (*btf_bpf_skb_under_cgroup)(struct sk_buff *, struct bpf_map *, u32); + +typedef u64 (*btf_bpf_skb_cgroup_id)(const struct sk_buff *); + +typedef u64 (*btf_bpf_skb_ancestor_cgroup_id)(const struct sk_buff *, int); + +typedef u64 (*btf_bpf_sk_cgroup_id)(struct sock *); + +typedef u64 (*btf_bpf_sk_ancestor_cgroup_id)(struct sock *, int); + +typedef u64 (*btf_bpf_xdp_event_output)(struct xdp_buff *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_get_socket_cookie)(struct sk_buff *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_ptr_cookie)(struct sock *); + +typedef u64 (*btf_bpf_get_socket_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_addr)(struct bpf_sock_addr_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sock_ops)(struct bpf_sock_ops_kern *); + +typedef u64 (*btf_bpf_get_netns_cookie_sk_msg)(struct sk_msg *); + +typedef u64 (*btf_bpf_get_socket_uid)(struct sk_buff *); + +typedef u64 (*btf_bpf_sk_setsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sk_getsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_unlocked_sk_setsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_unlocked_sk_getsockopt)(struct sock *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_setsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_addr_getsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_setsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_getsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int); + +typedef u64 (*btf_bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops_kern *, int); + +typedef u64 (*btf_bpf_bind)(struct bpf_sock_addr_kern *, struct sockaddr *, int); + +typedef u64 (*btf_bpf_skb_get_xfrm_state)(struct sk_buff *, u32, struct bpf_xfrm_state *, u32, u64); + +typedef u64 (*btf_bpf_xdp_fib_lookup)(struct xdp_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_skb_fib_lookup)(struct sk_buff *, struct bpf_fib_lookup *, int, u32); + +typedef u64 (*btf_bpf_skb_check_mtu)(struct sk_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_xdp_check_mtu)(struct xdp_buff *, u32, u32 *, s32, u64); + +typedef u64 (*btf_bpf_lwt_in_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_xmit_push_encap)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_store_bytes)(struct sk_buff *, u32, const void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_action)(struct sk_buff *, u32, void *, u32); + +typedef u64 (*btf_bpf_lwt_seg6_adjust_srh)(struct sk_buff *, u32, s32); + +typedef u64 (*btf_bpf_skc_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_lookup_udp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sk_release)(struct sock *); + +typedef u64 (*btf_bpf_xdp_sk_lookup_udp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_skc_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_xdp_sk_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64); + +typedef u64 (*btf_bpf_sock_addr_skc_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_sock_addr_sk_lookup_udp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64); + +typedef u64 (*btf_bpf_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_get_listener_sock)(struct sock *); + +typedef u64 (*btf_bpf_skb_ecn_set_ce)(struct sk_buff *); + +typedef u64 (*btf_bpf_tcp_check_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_gen_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_sk_assign)(struct sk_buff *, struct sock *, u64); + +typedef u64 (*btf_bpf_sock_ops_load_hdr_opt)(struct bpf_sock_ops_kern *, void *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_store_hdr_opt)(struct bpf_sock_ops_kern *, const void *, u32, u64); + +typedef u64 (*btf_bpf_sock_ops_reserve_hdr_opt)(struct bpf_sock_ops_kern *, u32, u64); + +typedef u64 (*btf_bpf_skb_set_tstamp)(struct sk_buff *, u64, u32); + +typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *, u32); + +typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *, struct tcphdr *); + +typedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *); + +typedef u64 (*btf_sk_select_reuseport)(struct sk_reuseport_kern *, struct bpf_map *, void *, u32); + +typedef u64 (*btf_sk_reuseport_load_bytes)(const struct sk_reuseport_kern *, u32, void *, u32); + +typedef u64 (*btf_sk_reuseport_load_bytes_relative)(const struct sk_reuseport_kern *, u32, void *, u32, u32); + +typedef u64 (*btf_bpf_sk_lookup_assign)(struct bpf_sk_lookup_kern *, struct sock *, u64); + +typedef u64 (*btf_bpf_skc_to_tcp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_timewait_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_tcp_request_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_udp6_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_unix_sock)(struct sock *); + +typedef u64 (*btf_bpf_skc_to_mptcp_sock)(struct sock *); + +typedef u64 (*btf_bpf_sock_from_file)(struct file *); + +struct mptcp_sock; + +struct bpf_cpu_map_entry; + +struct bpf_dtab_netdev; + +struct unix_sock; + +struct __user_cap_header_struct { + __u32 version; + int pid; +}; + +typedef struct __user_cap_header_struct *cap_user_header_t; + +struct __user_cap_data_struct { + __u32 effective; + __u32 permitted; + __u32 inheritable; +}; + +typedef struct __user_cap_data_struct *cap_user_data_t; + +struct cpu_stop_done { + atomic_t nr_todo; + int ret; + struct completion completion; +}; + +struct cpu_stopper { + struct task_struct *thread; + raw_spinlock_t lock; + bool enabled; + struct list_head works; + struct cpu_stop_work stop_work; + long unsigned int caller; + cpu_stop_fn_t fn; +}; + +enum multi_stop_state { + MULTI_STOP_NONE = 0, + MULTI_STOP_PREPARE = 1, + MULTI_STOP_DISABLE_IRQ = 2, + MULTI_STOP_RUN = 3, + MULTI_STOP_EXIT = 4, +}; + +struct multi_stop_data { + cpu_stop_fn_t fn; + void *data; + unsigned int num_threads; + const struct cpumask *active_cpus; + enum multi_stop_state state; + atomic_t thread_ack; +}; + +struct bpf_lpm_trie_key { + __u32 prefixlen; + __u8 data[0]; +}; + +struct lpm_trie_node { + struct callback_head rcu; + struct lpm_trie_node *child[2]; + u32 prefixlen; + u32 flags; + u8 data[0]; +}; + +struct lpm_trie { + struct bpf_map map; + struct lpm_trie_node *root; + size_t n_entries; + size_t max_prefixlen; + size_t data_size; + spinlock_t lock; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct hash_ctx { + struct af_alg_sgl sgl; + u8 *result; + struct crypto_wait wait; + unsigned int len; + bool more; + long: 24; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct ahash_request req; +}; + +struct acpi_pci_id { + u16 segment; + u16 bus; + u16 device; + u16 function; +}; + +struct acpi_mem_mapping { + acpi_physical_address physical_address; + u8 *logical_address; + acpi_size length; + struct acpi_mem_mapping *next_mm; +}; + +struct acpi_mem_space_context { + u32 length; + acpi_physical_address address; + struct acpi_mem_mapping *cur_mm; + struct acpi_mem_mapping *first_mm; +}; + +struct acpi_data_table_space_context { + void *pointer; +}; + +enum { + ETHTOOL_A_FEC_STAT_UNSPEC = 0, + ETHTOOL_A_FEC_STAT_PAD = 1, + ETHTOOL_A_FEC_STAT_CORRECTED = 2, + ETHTOOL_A_FEC_STAT_UNCORR = 3, + ETHTOOL_A_FEC_STAT_CORR_BITS = 4, + __ETHTOOL_A_FEC_STAT_CNT = 5, + ETHTOOL_A_FEC_STAT_MAX = 4, +}; + +struct fec_stat_grp { + u64 stats[9]; + u8 cnt; +}; + +struct fec_reply_data { + struct ethnl_reply_data base; + long unsigned int fec_link_modes[2]; + u32 active_fec; + u8 fec_auto; + struct fec_stat_grp corr; + struct fec_stat_grp uncorr; + struct fec_stat_grp corr_bits; +}; + +struct cipso_v4_map_cache_bkt { + spinlock_t lock; + u32 size; + struct list_head list; +}; + +struct cipso_v4_map_cache_entry { + u32 hash; + unsigned char *key; + size_t key_len; + struct netlbl_lsm_cache *lsm_data; + u32 activity; + struct list_head list; +}; + +struct frag_queue { + struct inet_frag_queue q; + int iif; + __u16 nhoffset; + u8 ecn; +}; + +struct nft_ct_frag6_pernet { + struct ctl_table_header *nf_frag_frags_hdr; + struct fqdir *fqdir; +}; + +enum { + IFLA_VLAN_UNSPEC = 0, + IFLA_VLAN_ID = 1, + IFLA_VLAN_FLAGS = 2, + IFLA_VLAN_EGRESS_QOS = 3, + IFLA_VLAN_INGRESS_QOS = 4, + IFLA_VLAN_PROTOCOL = 5, + __IFLA_VLAN_MAX = 6, +}; + +struct ifla_vlan_flags { + __u32 flags; + __u32 mask; +}; + +enum { + IFLA_VLAN_QOS_UNSPEC = 0, + IFLA_VLAN_QOS_MAPPING = 1, + __IFLA_VLAN_QOS_MAX = 2, +}; + +struct ifla_vlan_qos_mapping { + __u32 from; + __u32 to; +}; + +struct ptrace_peeksiginfo_args { + __u64 off; + __u32 flags; + __s32 nr; +}; + +struct ptrace_syscall_info { + __u8 op; + __u8 pad[3]; + __u32 arch; + __u64 instruction_pointer; + __u64 stack_pointer; + union { + struct { + __u64 nr; + __u64 args[6]; + } entry; + struct { + __s64 rval; + __u8 is_error; + } exit; + struct { + __u64 nr; + __u64 args[6]; + __u32 ret_data; + } seccomp; + }; +}; + +struct ptrace_rseq_configuration { + __u64 rseq_abi_pointer; + __u32 rseq_abi_size; + __u32 signature; + __u32 flags; + __u32 pad; +}; + +struct pde_opener { + struct list_head lh; + struct file *file; + bool closing; + struct completion *c; +}; + +enum { + BIAS = 2147483648, +}; + +typedef void (*swap_r_func_t)(void *, void *, int, const void *); + +typedef int (*cmp_r_func_t)(const void *, const void *, const void *); + +struct wrapper { + cmp_func_t cmp; + swap_func_t swap; +}; + +struct region { + unsigned int start; + unsigned int off; + unsigned int group_len; + unsigned int end; + unsigned int nbits; +}; + +enum { + REG_OP_ISFREE = 0, + REG_OP_ALLOC = 1, + REG_OP_RELEASE = 2, +}; + +struct fb_cvt_data { + u32 xres; + u32 yres; + u32 refresh; + u32 f_refresh; + u32 pixclock; + u32 hperiod; + u32 hblank; + u32 hfreq; + u32 htotal; + u32 vtotal; + u32 vsync; + u32 hsync; + u32 h_front_porch; + u32 h_back_porch; + u32 v_front_porch; + u32 v_back_porch; + u32 h_margin; + u32 v_margin; + u32 interlace; + u32 aspect_ratio; + u32 active_pixels; + u32 flags; + u32 status; +}; + +struct tc_skb_ext { + __u32 chain; + __u16 mru; + __u16 zone; + u8 post_ct: 1; + u8 post_ct_snat: 1; + u8 post_ct_dnat: 1; +}; + +enum { + NLBL_MGMT_C_UNSPEC = 0, + NLBL_MGMT_C_ADD = 1, + NLBL_MGMT_C_REMOVE = 2, + NLBL_MGMT_C_LISTALL = 3, + NLBL_MGMT_C_ADDDEF = 4, + NLBL_MGMT_C_REMOVEDEF = 5, + NLBL_MGMT_C_LISTDEF = 6, + NLBL_MGMT_C_PROTOCOLS = 7, + NLBL_MGMT_C_VERSION = 8, + __NLBL_MGMT_C_MAX = 9, +}; + +enum { + NLBL_MGMT_A_UNSPEC = 0, + NLBL_MGMT_A_DOMAIN = 1, + NLBL_MGMT_A_PROTOCOL = 2, + NLBL_MGMT_A_VERSION = 3, + NLBL_MGMT_A_CV4DOI = 4, + NLBL_MGMT_A_IPV6ADDR = 5, + NLBL_MGMT_A_IPV6MASK = 6, + NLBL_MGMT_A_IPV4ADDR = 7, + NLBL_MGMT_A_IPV4MASK = 8, + NLBL_MGMT_A_ADDRSELECTOR = 9, + NLBL_MGMT_A_SELECTORLIST = 10, + NLBL_MGMT_A_FAMILY = 11, + NLBL_MGMT_A_CLPDOI = 12, + __NLBL_MGMT_A_MAX = 13, +}; + +struct netlbl_domhsh_walk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct audit_rule_data { + __u32 flags; + __u32 action; + __u32 field_count; + __u32 mask[64]; + __u32 fields[64]; + __u32 values[64]; + __u32 fieldflags[64]; + __u32 buflen; + char buf[0]; +}; + +enum { + IO_SQ_THREAD_SHOULD_STOP = 0, + IO_SQ_THREAD_SHOULD_PARK = 1, +}; + +enum pci_ers_result { + PCI_ERS_RESULT_NONE = 1, + PCI_ERS_RESULT_CAN_RECOVER = 2, + PCI_ERS_RESULT_NEED_RESET = 3, + PCI_ERS_RESULT_DISCONNECT = 4, + PCI_ERS_RESULT_RECOVERED = 5, + PCI_ERS_RESULT_NO_AER_DRIVER = 6, +}; + +struct acpi_prmt_module_info { + u16 revision; + u16 length; + u8 module_guid[16]; + u16 major_rev; + u16 minor_rev; + u16 handler_info_count; + u32 handler_info_offset; + u64 mmio_list_pointer; +} __attribute__((packed)); + +struct acpi_prmt_handler_info { + u16 revision; + u16 length; + u8 handler_guid[16]; + u64 handler_address; + u64 static_data_buffer_address; + u64 acpi_param_buffer_address; +} __attribute__((packed)); + +struct prm_mmio_addr_range { + u64 phys_addr; + u64 virt_addr; + u32 length; +} __attribute__((packed)); + +struct prm_mmio_info { + u64 mmio_count; + struct prm_mmio_addr_range addr_ranges[0]; +}; + +struct prm_buffer { + u8 prm_status; + u64 efi_status; + u8 prm_cmd; + guid_t handler_guid; +} __attribute__((packed)); + +struct prm_context_buffer { + char signature[4]; + u16 revision; + u16 reserved; + guid_t identifier; + u64 static_data_buffer; + struct prm_mmio_info *mmio_ranges; +}; + +struct prm_handler_info { + guid_t guid; + void *handler_addr; + u64 static_data_buffer_addr; + u64 acpi_param_buffer_addr; + struct list_head handler_list; +}; + +struct prm_module_info { + guid_t guid; + u16 major_rev; + u16 minor_rev; + u16 handler_count; + struct prm_mmio_info *mmio_info; + bool updatable; + struct list_head module_list; + struct prm_handler_info handlers[0]; +}; + +struct acpi_port_info { + char *name; + u16 start; + u16 end; + u8 osi_dependency; +}; + +struct thermal_hwmon_device { + char type[20]; + struct device *device; + int count; + struct list_head tz_list; + struct list_head node; +}; + +struct thermal_hwmon_attr { + struct device_attribute attr; + char name[16]; +}; + +struct thermal_hwmon_temp { + struct list_head hwmon_node; + struct thermal_zone_device *tz; + struct thermal_hwmon_attr temp_input; + struct thermal_hwmon_attr temp_crit; +}; + +enum { + TRACE_SIGNAL_DELIVERED = 0, + TRACE_SIGNAL_IGNORED = 1, + TRACE_SIGNAL_ALREADY_PENDING = 2, + TRACE_SIGNAL_OVERFLOW_FAIL = 3, + TRACE_SIGNAL_LOSE_INFO = 4, +}; + +struct trace_event_raw_signal_generate { + struct trace_entry ent; + int sig; + int errno; + int code; + char comm[16]; + pid_t pid; + int group; + int result; + char __data[0]; +}; + +struct trace_event_raw_signal_deliver { + struct trace_entry ent; + int sig; + int errno; + int code; + long unsigned int sa_handler; + long unsigned int sa_flags; + char __data[0]; +}; + +struct trace_event_data_offsets_signal_generate {}; + +struct trace_event_data_offsets_signal_deliver {}; + +typedef void (*btf_trace_signal_generate)(void *, int, struct kernel_siginfo *, struct task_struct *, int, int); + +typedef void (*btf_trace_signal_deliver)(void *, int, struct kernel_siginfo *, struct k_sigaction *); + +enum sig_handler { + HANDLER_CURRENT = 0, + HANDLER_SIG_DFL = 1, + HANDLER_EXIT = 2, +}; + +struct dax_holder_operations { + int (*notify_failure)(struct dax_device *, u64, u64, int); +}; + +struct ext4_lazy_init { + long unsigned int li_state; + struct list_head li_request_list; + struct mutex li_list_mtx; +}; + +struct partial_cluster { + ext4_fsblk_t pclu; + ext4_lblk_t lblk; + enum { + initial = 0, + tofree = 1, + nofree = 2, + } state; +}; + +struct ext4_journal_cb_entry { + struct list_head jce_list; + void (*jce_func)(struct super_block *, struct ext4_journal_cb_entry *, int); +}; + +struct ext4_fsmap { + struct list_head fmr_list; + dev_t fmr_device; + uint32_t fmr_flags; + uint64_t fmr_physical; + uint64_t fmr_owner; + uint64_t fmr_length; +}; + +struct trace_event_raw_ext4_other_inode_update_time { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t orig_ino; + uid_t uid; + gid_t gid; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_free_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + uid_t uid; + gid_t gid; + __u64 blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_request_inode { + struct trace_entry ent; + dev_t dev; + ino_t dir; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_allocate_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t dir; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_evict_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int nlink; + char __data[0]; +}; + +struct trace_event_raw_ext4_drop_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int drop; + char __data[0]; +}; + +struct trace_event_raw_ext4_nfs_commit_metadata { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_ext4_mark_inode_dirty { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int ip; + char __data[0]; +}; + +struct trace_event_raw_ext4_begin_ordered_truncate { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t new_size; + char __data[0]; +}; + +struct trace_event_raw_ext4__write_begin { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int len; + char __data[0]; +}; + +struct trace_event_raw_ext4__write_end { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int len; + unsigned int copied; + char __data[0]; +}; + +struct trace_event_raw_ext4_writepages { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long int nr_to_write; + long int pages_skipped; + loff_t range_start; + loff_t range_end; + long unsigned int writeback_index; + int sync_mode; + char for_kupdate; + char range_cyclic; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_write_pages { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int first_page; + long int nr_to_write; + int sync_mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_write_pages_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 lblk; + __u32 len; + __u32 flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_writepages_result { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + int pages_written; + long int pages_skipped; + long unsigned int writeback_index; + int sync_mode; + char __data[0]; +}; + +struct trace_event_raw_ext4__page_op { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int index; + char __data[0]; +}; + +struct trace_event_raw_ext4_invalidate_folio_op { + struct trace_entry ent; + dev_t dev; + ino_t ino; + long unsigned int index; + size_t offset; + size_t length; + char __data[0]; +}; + +struct trace_event_raw_ext4_discard_blocks { + struct trace_entry ent; + dev_t dev; + __u64 blk; + __u64 count; + char __data[0]; +}; + +struct trace_event_raw_ext4__mb_new_pa { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 pa_pstart; + __u64 pa_lstart; + __u32 pa_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_release_inode_pa { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + __u32 count; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_release_group_pa { + struct trace_entry ent; + dev_t dev; + __u64 pa_pstart; + __u32 pa_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_discard_preallocations { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int len; + unsigned int needed; + char __data[0]; +}; + +struct trace_event_raw_ext4_mb_discard_preallocations { + struct trace_entry ent; + dev_t dev; + int needed; + char __data[0]; +}; + +struct trace_event_raw_ext4_request_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int len; + __u32 logical; + __u32 lleft; + __u32 lright; + __u64 goal; + __u64 pleft; + __u64 pright; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_allocate_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + unsigned int len; + __u32 logical; + __u32 lleft; + __u32 lright; + __u64 goal; + __u64 pleft; + __u64 pright; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_free_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + long unsigned int count; + int flags; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_file_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t parent; + int datasync; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_file_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_sync_fs { + struct trace_entry ent; + dev_t dev; + int wait; + char __data[0]; +}; + +struct trace_event_raw_ext4_alloc_da_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int data_blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4_mballoc_alloc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u32 orig_logical; + int orig_start; + __u32 orig_group; + int orig_len; + __u32 goal_logical; + int goal_start; + __u32 goal_group; + int goal_len; + __u32 result_logical; + int result_start; + __u32 result_group; + int result_len; + __u16 found; + __u16 groups; + __u16 buddy; + __u16 flags; + __u16 tail; + __u8 cr; + char __data[0]; +}; + +struct trace_event_raw_ext4_mballoc_prealloc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u32 orig_logical; + int orig_start; + __u32 orig_group; + int orig_len; + __u32 result_logical; + int result_start; + __u32 result_group; + int result_len; + char __data[0]; +}; + +struct trace_event_raw_ext4__mballoc { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int result_start; + __u32 result_group; + int result_len; + char __data[0]; +}; + +struct trace_event_raw_ext4_forget { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 block; + int is_metadata; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_update_reserve_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int used_blocks; + int reserved_data_blocks; + int quota_claim; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_reserve_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int reserved_data_blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_da_release_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 i_blocks; + int freed_blocks; + int reserved_data_blocks; + __u16 mode; + char __data[0]; +}; + +struct trace_event_raw_ext4__bitmap_load { + struct trace_entry ent; + dev_t dev; + __u32 group; + char __data[0]; +}; + +struct trace_event_raw_ext4_read_block_bitmap_load { + struct trace_entry ent; + dev_t dev; + __u32 group; + bool prefetch; + char __data[0]; +}; + +struct trace_event_raw_ext4__fallocate_mode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + int mode; + char __data[0]; +}; + +struct trace_event_raw_ext4_fallocate_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t pos; + unsigned int blocks; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_unlink_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ino_t parent; + loff_t size; + char __data[0]; +}; + +struct trace_event_raw_ext4_unlink_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4__truncate { + struct trace_entry ent; + dev_t dev; + ino_t ino; + __u64 blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_convert_to_initialized_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t m_lblk; + unsigned int m_len; + ext4_lblk_t u_lblk; + unsigned int u_len; + ext4_fsblk_t u_pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_convert_to_initialized_fastpath { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t m_lblk; + unsigned int m_len; + ext4_lblk_t u_lblk; + unsigned int u_len; + ext4_fsblk_t u_pblk; + ext4_lblk_t i_lblk; + unsigned int i_len; + ext4_fsblk_t i_pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4__map_blocks_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + unsigned int len; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4__map_blocks_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + unsigned int flags; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + unsigned int len; + unsigned int mflags; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_load_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_load_inode { + struct trace_entry ent; + dev_t dev; + ino_t ino; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_sb { + struct trace_entry ent; + dev_t dev; + long unsigned int ip; + int blocks; + int rsv_blocks; + int revoke_creds; + int type; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_inode { + struct trace_entry ent; + long unsigned int ino; + dev_t dev; + long unsigned int ip; + int blocks; + int rsv_blocks; + int revoke_creds; + int type; + char __data[0]; +}; + +struct trace_event_raw_ext4_journal_start_reserved { + struct trace_entry ent; + dev_t dev; + long unsigned int ip; + int blocks; + char __data[0]; +}; + +struct trace_event_raw_ext4__trim { + struct trace_entry ent; + int dev_major; + int dev_minor; + __u32 group; + int start; + int len; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_handle_unwritten_extents { + struct trace_entry ent; + dev_t dev; + ino_t ino; + int flags; + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + unsigned int len; + unsigned int allocated; + ext4_fsblk_t newblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_get_implied_cluster_alloc_exit { + struct trace_entry ent; + dev_t dev; + unsigned int flags; + ext4_lblk_t lblk; + ext4_fsblk_t pblk; + unsigned int len; + int ret; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_show_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + ext4_lblk_t lblk; + short unsigned int len; + char __data[0]; +}; + +struct trace_event_raw_ext4_remove_blocks { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t from; + ext4_lblk_t to; + ext4_fsblk_t ee_pblk; + ext4_lblk_t ee_lblk; + short unsigned int ee_len; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_rm_leaf { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t ee_lblk; + ext4_fsblk_t ee_pblk; + short int ee_len; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_rm_idx { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_fsblk_t pblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_remove_space { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t end; + int depth; + char __data[0]; +}; + +struct trace_event_raw_ext4_ext_remove_space_done { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t start; + ext4_lblk_t end; + int depth; + ext4_fsblk_t pc_pclu; + ext4_lblk_t pc_lblk; + int pc_state; + short unsigned int eh_entries; + char __data[0]; +}; + +struct trace_event_raw_ext4__es_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_remove_extent { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t lblk; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_find_extent_range_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_find_extent_range_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_lookup_extent_enter { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_lookup_extent_exit { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + int found; + char __data[0]; +}; + +struct trace_event_raw_ext4__es_shrink_enter { + struct trace_entry ent; + dev_t dev; + int nr_to_scan; + int cache_cnt; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_shrink_scan_exit { + struct trace_entry ent; + dev_t dev; + int nr_shrunk; + int cache_cnt; + char __data[0]; +}; + +struct trace_event_raw_ext4_collapse_range { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_insert_range { + struct trace_entry ent; + dev_t dev; + ino_t ino; + loff_t offset; + loff_t len; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_shrink { + struct trace_entry ent; + dev_t dev; + int nr_shrunk; + long long unsigned int scan_time; + int nr_skipped; + int retried; + char __data[0]; +}; + +struct trace_event_raw_ext4_es_insert_delayed_block { + struct trace_entry ent; + dev_t dev; + ino_t ino; + ext4_lblk_t lblk; + ext4_lblk_t len; + ext4_fsblk_t pblk; + char status; + bool allocated; + char __data[0]; +}; + +struct trace_event_raw_ext4_fsmap_class { + struct trace_entry ent; + dev_t dev; + dev_t keydev; + u32 agno; + u64 bno; + u64 len; + u64 owner; + char __data[0]; +}; + +struct trace_event_raw_ext4_getfsmap_class { + struct trace_entry ent; + dev_t dev; + dev_t keydev; + u64 block; + u64 len; + u64 owner; + u64 flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_shutdown { + struct trace_entry ent; + dev_t dev; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_ext4_error { + struct trace_entry ent; + dev_t dev; + const char *function; + unsigned int line; + char __data[0]; +}; + +struct trace_event_raw_ext4_prefetch_bitmaps { + struct trace_entry ent; + dev_t dev; + __u32 group; + __u32 next; + __u32 ios; + char __data[0]; +}; + +struct trace_event_raw_ext4_lazy_itable_init { + struct trace_entry ent; + dev_t dev; + __u32 group; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_replay_scan { + struct trace_entry ent; + dev_t dev; + int error; + int off; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_replay { + struct trace_entry ent; + dev_t dev; + int tag; + int ino; + int priv1; + int priv2; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_commit_start { + struct trace_entry ent; + dev_t dev; + tid_t tid; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_commit_stop { + struct trace_entry ent; + dev_t dev; + int nblks; + int reason; + int num_fc; + int num_fc_ineligible; + int nblks_agg; + tid_t tid; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_stats { + struct trace_entry ent; + dev_t dev; + unsigned int fc_ineligible_rc[10]; + long unsigned int fc_commits; + long unsigned int fc_ineligible_commits; + long unsigned int fc_numblks; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_dentry { + struct trace_entry ent; + dev_t dev; + tid_t t_tid; + ino_t i_ino; + tid_t i_sync_tid; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_inode { + struct trace_entry ent; + dev_t dev; + tid_t t_tid; + ino_t i_ino; + tid_t i_sync_tid; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_track_range { + struct trace_entry ent; + dev_t dev; + tid_t t_tid; + ino_t i_ino; + tid_t i_sync_tid; + long int start; + long int end; + int error; + char __data[0]; +}; + +struct trace_event_raw_ext4_fc_cleanup { + struct trace_entry ent; + dev_t dev; + int j_fc_off; + int full; + tid_t tid; + char __data[0]; +}; + +struct trace_event_raw_ext4_update_sb { + struct trace_entry ent; + dev_t dev; + ext4_fsblk_t fsblk; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_data_offsets_ext4_other_inode_update_time {}; + +struct trace_event_data_offsets_ext4_free_inode {}; + +struct trace_event_data_offsets_ext4_request_inode {}; + +struct trace_event_data_offsets_ext4_allocate_inode {}; + +struct trace_event_data_offsets_ext4_evict_inode {}; + +struct trace_event_data_offsets_ext4_drop_inode {}; + +struct trace_event_data_offsets_ext4_nfs_commit_metadata {}; + +struct trace_event_data_offsets_ext4_mark_inode_dirty {}; + +struct trace_event_data_offsets_ext4_begin_ordered_truncate {}; + +struct trace_event_data_offsets_ext4__write_begin {}; + +struct trace_event_data_offsets_ext4__write_end {}; + +struct trace_event_data_offsets_ext4_writepages {}; + +struct trace_event_data_offsets_ext4_da_write_pages {}; + +struct trace_event_data_offsets_ext4_da_write_pages_extent {}; + +struct trace_event_data_offsets_ext4_writepages_result {}; + +struct trace_event_data_offsets_ext4__page_op {}; + +struct trace_event_data_offsets_ext4_invalidate_folio_op {}; + +struct trace_event_data_offsets_ext4_discard_blocks {}; + +struct trace_event_data_offsets_ext4__mb_new_pa {}; + +struct trace_event_data_offsets_ext4_mb_release_inode_pa {}; + +struct trace_event_data_offsets_ext4_mb_release_group_pa {}; + +struct trace_event_data_offsets_ext4_discard_preallocations {}; + +struct trace_event_data_offsets_ext4_mb_discard_preallocations {}; + +struct trace_event_data_offsets_ext4_request_blocks {}; + +struct trace_event_data_offsets_ext4_allocate_blocks {}; + +struct trace_event_data_offsets_ext4_free_blocks {}; + +struct trace_event_data_offsets_ext4_sync_file_enter {}; + +struct trace_event_data_offsets_ext4_sync_file_exit {}; + +struct trace_event_data_offsets_ext4_sync_fs {}; + +struct trace_event_data_offsets_ext4_alloc_da_blocks {}; + +struct trace_event_data_offsets_ext4_mballoc_alloc {}; + +struct trace_event_data_offsets_ext4_mballoc_prealloc {}; + +struct trace_event_data_offsets_ext4__mballoc {}; + +struct trace_event_data_offsets_ext4_forget {}; + +struct trace_event_data_offsets_ext4_da_update_reserve_space {}; + +struct trace_event_data_offsets_ext4_da_reserve_space {}; + +struct trace_event_data_offsets_ext4_da_release_space {}; + +struct trace_event_data_offsets_ext4__bitmap_load {}; + +struct trace_event_data_offsets_ext4_read_block_bitmap_load {}; + +struct trace_event_data_offsets_ext4__fallocate_mode {}; + +struct trace_event_data_offsets_ext4_fallocate_exit {}; + +struct trace_event_data_offsets_ext4_unlink_enter {}; + +struct trace_event_data_offsets_ext4_unlink_exit {}; + +struct trace_event_data_offsets_ext4__truncate {}; + +struct trace_event_data_offsets_ext4_ext_convert_to_initialized_enter {}; + +struct trace_event_data_offsets_ext4_ext_convert_to_initialized_fastpath {}; + +struct trace_event_data_offsets_ext4__map_blocks_enter {}; + +struct trace_event_data_offsets_ext4__map_blocks_exit {}; + +struct trace_event_data_offsets_ext4_ext_load_extent {}; + +struct trace_event_data_offsets_ext4_load_inode {}; + +struct trace_event_data_offsets_ext4_journal_start_sb {}; + +struct trace_event_data_offsets_ext4_journal_start_inode {}; + +struct trace_event_data_offsets_ext4_journal_start_reserved {}; + +struct trace_event_data_offsets_ext4__trim {}; + +struct trace_event_data_offsets_ext4_ext_handle_unwritten_extents {}; + +struct trace_event_data_offsets_ext4_get_implied_cluster_alloc_exit {}; + +struct trace_event_data_offsets_ext4_ext_show_extent {}; + +struct trace_event_data_offsets_ext4_remove_blocks {}; + +struct trace_event_data_offsets_ext4_ext_rm_leaf {}; + +struct trace_event_data_offsets_ext4_ext_rm_idx {}; + +struct trace_event_data_offsets_ext4_ext_remove_space {}; + +struct trace_event_data_offsets_ext4_ext_remove_space_done {}; + +struct trace_event_data_offsets_ext4__es_extent {}; + +struct trace_event_data_offsets_ext4_es_remove_extent {}; + +struct trace_event_data_offsets_ext4_es_find_extent_range_enter {}; + +struct trace_event_data_offsets_ext4_es_find_extent_range_exit {}; + +struct trace_event_data_offsets_ext4_es_lookup_extent_enter {}; + +struct trace_event_data_offsets_ext4_es_lookup_extent_exit {}; + +struct trace_event_data_offsets_ext4__es_shrink_enter {}; + +struct trace_event_data_offsets_ext4_es_shrink_scan_exit {}; + +struct trace_event_data_offsets_ext4_collapse_range {}; + +struct trace_event_data_offsets_ext4_insert_range {}; + +struct trace_event_data_offsets_ext4_es_shrink {}; + +struct trace_event_data_offsets_ext4_es_insert_delayed_block {}; + +struct trace_event_data_offsets_ext4_fsmap_class {}; + +struct trace_event_data_offsets_ext4_getfsmap_class {}; + +struct trace_event_data_offsets_ext4_shutdown {}; + +struct trace_event_data_offsets_ext4_error {}; + +struct trace_event_data_offsets_ext4_prefetch_bitmaps {}; + +struct trace_event_data_offsets_ext4_lazy_itable_init {}; + +struct trace_event_data_offsets_ext4_fc_replay_scan {}; + +struct trace_event_data_offsets_ext4_fc_replay {}; + +struct trace_event_data_offsets_ext4_fc_commit_start {}; + +struct trace_event_data_offsets_ext4_fc_commit_stop {}; + +struct trace_event_data_offsets_ext4_fc_stats {}; + +struct trace_event_data_offsets_ext4_fc_track_dentry {}; + +struct trace_event_data_offsets_ext4_fc_track_inode {}; + +struct trace_event_data_offsets_ext4_fc_track_range {}; + +struct trace_event_data_offsets_ext4_fc_cleanup {}; + +struct trace_event_data_offsets_ext4_update_sb {}; + +typedef void (*btf_trace_ext4_other_inode_update_time)(void *, struct inode *, ino_t); + +typedef void (*btf_trace_ext4_free_inode)(void *, struct inode *); + +typedef void (*btf_trace_ext4_request_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_allocate_inode)(void *, struct inode *, struct inode *, int); + +typedef void (*btf_trace_ext4_evict_inode)(void *, struct inode *); + +typedef void (*btf_trace_ext4_drop_inode)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_nfs_commit_metadata)(void *, struct inode *); + +typedef void (*btf_trace_ext4_mark_inode_dirty)(void *, struct inode *, long unsigned int); + +typedef void (*btf_trace_ext4_begin_ordered_truncate)(void *, struct inode *, loff_t); + +typedef void (*btf_trace_ext4_write_begin)(void *, struct inode *, loff_t, unsigned int); + +typedef void (*btf_trace_ext4_da_write_begin)(void *, struct inode *, loff_t, unsigned int); + +typedef void (*btf_trace_ext4_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_journalled_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_da_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_writepages)(void *, struct inode *, struct writeback_control *); + +typedef void (*btf_trace_ext4_da_write_pages)(void *, struct inode *, long unsigned int, struct writeback_control *); + +typedef void (*btf_trace_ext4_da_write_pages_extent)(void *, struct inode *, struct ext4_map_blocks *); + +typedef void (*btf_trace_ext4_writepages_result)(void *, struct inode *, struct writeback_control *, int, int); + +typedef void (*btf_trace_ext4_writepage)(void *, struct page *); + +typedef void (*btf_trace_ext4_readpage)(void *, struct page *); + +typedef void (*btf_trace_ext4_releasepage)(void *, struct page *); + +typedef void (*btf_trace_ext4_invalidate_folio)(void *, struct folio *, size_t, size_t); + +typedef void (*btf_trace_ext4_journalled_invalidate_folio)(void *, struct folio *, size_t, size_t); + +typedef void (*btf_trace_ext4_discard_blocks)(void *, struct super_block *, long long unsigned int, long long unsigned int); + +typedef void (*btf_trace_ext4_mb_new_inode_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_mb_new_group_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_mb_release_inode_pa)(void *, struct ext4_prealloc_space *, long long unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_mb_release_group_pa)(void *, struct super_block *, struct ext4_prealloc_space *); + +typedef void (*btf_trace_ext4_discard_preallocations)(void *, struct inode *, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_mb_discard_preallocations)(void *, struct super_block *, int); + +typedef void (*btf_trace_ext4_request_blocks)(void *, struct ext4_allocation_request *); + +typedef void (*btf_trace_ext4_allocate_blocks)(void *, struct ext4_allocation_request *, long long unsigned int); + +typedef void (*btf_trace_ext4_free_blocks)(void *, struct inode *, __u64, long unsigned int, int); + +typedef void (*btf_trace_ext4_sync_file_enter)(void *, struct file *, int); + +typedef void (*btf_trace_ext4_sync_file_exit)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_sync_fs)(void *, struct super_block *, int); + +typedef void (*btf_trace_ext4_alloc_da_blocks)(void *, struct inode *); + +typedef void (*btf_trace_ext4_mballoc_alloc)(void *, struct ext4_allocation_context *); + +typedef void (*btf_trace_ext4_mballoc_prealloc)(void *, struct ext4_allocation_context *); + +typedef void (*btf_trace_ext4_mballoc_discard)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_mballoc_free)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_forget)(void *, struct inode *, int, __u64); + +typedef void (*btf_trace_ext4_da_update_reserve_space)(void *, struct inode *, int, int); + +typedef void (*btf_trace_ext4_da_reserve_space)(void *, struct inode *); + +typedef void (*btf_trace_ext4_da_release_space)(void *, struct inode *, int); + +typedef void (*btf_trace_ext4_mb_bitmap_load)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_mb_buddy_bitmap_load)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_load_inode_bitmap)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_read_block_bitmap_load)(void *, struct super_block *, long unsigned int, bool); + +typedef void (*btf_trace_ext4_fallocate_enter)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_punch_hole)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_zero_range)(void *, struct inode *, loff_t, loff_t, int); + +typedef void (*btf_trace_ext4_fallocate_exit)(void *, struct inode *, loff_t, unsigned int, int); + +typedef void (*btf_trace_ext4_unlink_enter)(void *, struct inode *, struct dentry *); + +typedef void (*btf_trace_ext4_unlink_exit)(void *, struct dentry *, int); + +typedef void (*btf_trace_ext4_truncate_enter)(void *, struct inode *); + +typedef void (*btf_trace_ext4_truncate_exit)(void *, struct inode *); + +typedef void (*btf_trace_ext4_ext_convert_to_initialized_enter)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *); + +typedef void (*btf_trace_ext4_ext_convert_to_initialized_fastpath)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *, struct ext4_extent *); + +typedef void (*btf_trace_ext4_ext_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_ind_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int); + +typedef void (*btf_trace_ext4_ext_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ind_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ext_load_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_load_inode)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_journal_start_sb)(void *, struct super_block *, int, int, int, int, long unsigned int); + +typedef void (*btf_trace_ext4_journal_start_inode)(void *, struct inode *, int, int, int, int, long unsigned int); + +typedef void (*btf_trace_ext4_journal_start_reserved)(void *, struct super_block *, int, long unsigned int); + +typedef void (*btf_trace_ext4_trim_extent)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_trim_all_free)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t); + +typedef void (*btf_trace_ext4_ext_handle_unwritten_extents)(void *, struct inode *, struct ext4_map_blocks *, int, unsigned int, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_get_implied_cluster_alloc_exit)(void *, struct super_block *, struct ext4_map_blocks *, int); + +typedef void (*btf_trace_ext4_ext_show_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t, short unsigned int); + +typedef void (*btf_trace_ext4_remove_blocks)(void *, struct inode *, struct ext4_extent *, ext4_lblk_t, ext4_fsblk_t, struct partial_cluster *); + +typedef void (*btf_trace_ext4_ext_rm_leaf)(void *, struct inode *, ext4_lblk_t, struct ext4_extent *, struct partial_cluster *); + +typedef void (*btf_trace_ext4_ext_rm_idx)(void *, struct inode *, ext4_fsblk_t); + +typedef void (*btf_trace_ext4_ext_remove_space)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int); + +typedef void (*btf_trace_ext4_ext_remove_space_done)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int, struct partial_cluster *, __le16); + +typedef void (*btf_trace_ext4_es_insert_extent)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_cache_extent)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_remove_extent)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_find_extent_range_enter)(void *, struct inode *, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_find_extent_range_exit)(void *, struct inode *, struct extent_status *); + +typedef void (*btf_trace_ext4_es_lookup_extent_enter)(void *, struct inode *, ext4_lblk_t); + +typedef void (*btf_trace_ext4_es_lookup_extent_exit)(void *, struct inode *, struct extent_status *, int); + +typedef void (*btf_trace_ext4_es_shrink_count)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_es_shrink_scan_enter)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_es_shrink_scan_exit)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_collapse_range)(void *, struct inode *, loff_t, loff_t); + +typedef void (*btf_trace_ext4_insert_range)(void *, struct inode *, loff_t, loff_t); + +typedef void (*btf_trace_ext4_es_shrink)(void *, struct super_block *, int, u64, int, int); + +typedef void (*btf_trace_ext4_es_insert_delayed_block)(void *, struct inode *, struct extent_status *, bool); + +typedef void (*btf_trace_ext4_fsmap_low_key)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_fsmap_high_key)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_fsmap_mapping)(void *, struct super_block *, u32, u32, u64, u64, u64); + +typedef void (*btf_trace_ext4_getfsmap_low_key)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_getfsmap_high_key)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_getfsmap_mapping)(void *, struct super_block *, struct ext4_fsmap *); + +typedef void (*btf_trace_ext4_shutdown)(void *, struct super_block *, long unsigned int); + +typedef void (*btf_trace_ext4_error)(void *, struct super_block *, const char *, unsigned int); + +typedef void (*btf_trace_ext4_prefetch_bitmaps)(void *, struct super_block *, ext4_group_t, ext4_group_t, unsigned int); + +typedef void (*btf_trace_ext4_lazy_itable_init)(void *, struct super_block *, ext4_group_t); + +typedef void (*btf_trace_ext4_fc_replay_scan)(void *, struct super_block *, int, int); + +typedef void (*btf_trace_ext4_fc_replay)(void *, struct super_block *, int, int, int, int); + +typedef void (*btf_trace_ext4_fc_commit_start)(void *, struct super_block *, tid_t); + +typedef void (*btf_trace_ext4_fc_commit_stop)(void *, struct super_block *, int, int, tid_t); + +typedef void (*btf_trace_ext4_fc_stats)(void *, struct super_block *); + +typedef void (*btf_trace_ext4_fc_track_create)(void *, handle_t *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_link)(void *, handle_t *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_unlink)(void *, handle_t *, struct inode *, struct dentry *, int); + +typedef void (*btf_trace_ext4_fc_track_inode)(void *, handle_t *, struct inode *, int); + +typedef void (*btf_trace_ext4_fc_track_range)(void *, handle_t *, struct inode *, long int, long int, int); + +typedef void (*btf_trace_ext4_fc_cleanup)(void *, journal_t *, int, tid_t); + +typedef void (*btf_trace_ext4_update_sb)(void *, struct super_block *, ext4_fsblk_t, unsigned int); + +struct ext4_err_translation { + int code; + int errno; +}; + +enum { + Opt_bsd_df = 0, + Opt_minix_df = 1, + Opt_grpid = 2, + Opt_nogrpid = 3, + Opt_resgid = 4, + Opt_resuid = 5, + Opt_sb = 6, + Opt_nouid32 = 7, + Opt_debug___2 = 8, + Opt_removed = 9, + Opt_user_xattr = 10, + Opt_acl = 11, + Opt_auto_da_alloc = 12, + Opt_noauto_da_alloc = 13, + Opt_noload = 14, + Opt_commit = 15, + Opt_min_batch_time = 16, + Opt_max_batch_time = 17, + Opt_journal_dev = 18, + Opt_journal_path = 19, + Opt_journal_checksum = 20, + Opt_journal_async_commit = 21, + Opt_abort = 22, + Opt_data_journal = 23, + Opt_data_ordered = 24, + Opt_data_writeback = 25, + Opt_data_err_abort = 26, + Opt_data_err_ignore = 27, + Opt_test_dummy_encryption = 28, + Opt_inlinecrypt = 29, + Opt_usrjquota = 30, + Opt_grpjquota = 31, + Opt_quota = 32, + Opt_noquota = 33, + Opt_barrier = 34, + Opt_nobarrier = 35, + Opt_err___7 = 36, + Opt_usrquota = 37, + Opt_grpquota = 38, + Opt_prjquota = 39, + Opt_dax = 40, + Opt_dax_always = 41, + Opt_dax_inode = 42, + Opt_dax_never = 43, + Opt_stripe = 44, + Opt_delalloc = 45, + Opt_nodelalloc = 46, + Opt_warn_on_error = 47, + Opt_nowarn_on_error = 48, + Opt_mblk_io_submit = 49, + Opt_debug_want_extra_isize = 50, + Opt_nomblk_io_submit = 51, + Opt_block_validity = 52, + Opt_noblock_validity = 53, + Opt_inode_readahead_blks = 54, + Opt_journal_ioprio = 55, + Opt_dioread_nolock = 56, + Opt_dioread_lock = 57, + Opt_discard = 58, + Opt_nodiscard = 59, + Opt_init_itable = 60, + Opt_noinit_itable = 61, + Opt_max_dir_size_kb = 62, + Opt_nojournal_checksum = 63, + Opt_nombcache = 64, + Opt_no_prefetch_block_bitmaps = 65, + Opt_mb_optimize_scan = 66, + Opt_errors = 67, + Opt_data = 68, + Opt_data_err = 69, + Opt_jqfmt = 70, + Opt_dax_type = 71, +}; + +struct mount_opts { + int token; + int mount_opt; + int flags; +}; + +struct ext4_fs_context { + char *s_qf_names[3]; + struct fscrypt_dummy_policy dummy_enc_policy; + int s_jquota_fmt; + short unsigned int qname_spec; + long unsigned int vals_s_flags; + long unsigned int mask_s_flags; + long unsigned int journal_devnum; + long unsigned int s_commit_interval; + long unsigned int s_stripe; + unsigned int s_inode_readahead_blks; + unsigned int s_want_extra_isize; + unsigned int s_li_wait_mult; + unsigned int s_max_dir_size_kb; + unsigned int journal_ioprio; + unsigned int vals_s_mount_opt; + unsigned int mask_s_mount_opt; + unsigned int vals_s_mount_opt2; + unsigned int mask_s_mount_opt2; + long unsigned int vals_s_mount_flags; + long unsigned int mask_s_mount_flags; + unsigned int opt_flags; + unsigned int spec; + u32 s_max_batch_time; + u32 s_min_batch_time; + kuid_t s_resuid; + kgid_t s_resgid; + ext4_fsblk_t s_sb_block; +}; + +struct ext4_mount_options { + long unsigned int s_mount_opt; + long unsigned int s_mount_opt2; + kuid_t s_resuid; + kgid_t s_resgid; + long unsigned int s_commit_interval; + u32 s_min_batch_time; + u32 s_max_batch_time; +}; + +struct ip_mreq_source { + __be32 imr_multiaddr; + __be32 imr_interface; + __be32 imr_sourceaddr; +}; + +struct ip_msfilter { + __be32 imsf_multiaddr; + __be32 imsf_interface; + __u32 imsf_fmode; + __u32 imsf_numsrc; + union { + __be32 imsf_slist[1]; + struct { + struct { } __empty_imsf_slist_flex; + __be32 imsf_slist_flex[0]; + }; + }; +}; + +struct in_pktinfo { + int ipi_ifindex; + struct in_addr ipi_spec_dst; + struct in_addr ipi_addr; +}; + +enum { + BPFILTER_IPT_SO_SET_REPLACE = 64, + BPFILTER_IPT_SO_SET_ADD_COUNTERS = 65, + BPFILTER_IPT_SET_MAX = 66, +}; + +enum { + BPFILTER_IPT_SO_GET_INFO = 64, + BPFILTER_IPT_SO_GET_ENTRIES = 65, + BPFILTER_IPT_SO_GET_REVISION_MATCH = 66, + BPFILTER_IPT_SO_GET_REVISION_TARGET = 67, + BPFILTER_IPT_GET_MAX = 68, +}; + +enum { + TLS_INFO_UNSPEC = 0, + TLS_INFO_VERSION = 1, + TLS_INFO_CIPHER = 2, + TLS_INFO_TXCONF = 3, + TLS_INFO_RXCONF = 4, + TLS_INFO_ZC_RO_TX = 5, + TLS_INFO_RX_NO_PAD = 6, + __TLS_INFO_MAX = 7, +}; + +struct tls_cipher_size_desc { + unsigned int iv; + unsigned int key; + unsigned int salt; + unsigned int tag; + unsigned int rec_seq; +}; + +enum { + TLSV4 = 0, + TLSV6 = 1, + TLS_NUM_PROTS = 2, +}; + +enum flowlabel_reflect { + FLOWLABEL_REFLECT_ESTABLISHED = 1, + FLOWLABEL_REFLECT_TCP_RESET = 2, + FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES = 4, +}; + +struct in6_rtmsg { + struct in6_addr rtmsg_dst; + struct in6_addr rtmsg_src; + struct in6_addr rtmsg_gateway; + __u32 rtmsg_type; + __u16 rtmsg_dst_len; + __u16 rtmsg_src_len; + __u32 rtmsg_metric; + long unsigned int rtmsg_info; + __u32 rtmsg_flags; + int rtmsg_ifindex; +}; + +struct ip6t_ip6 { + struct in6_addr src; + struct in6_addr dst; + struct in6_addr smsk; + struct in6_addr dmsk; + char iniface[16]; + char outiface[16]; + unsigned char iniface_mask[16]; + unsigned char outiface_mask[16]; + __u16 proto; + __u8 tos; + __u8 flags; + __u8 invflags; +}; + +struct ip6t_entry { + struct ip6t_ip6 ipv6; + unsigned int nfcache; + __u16 target_offset; + __u16 next_offset; + unsigned int comefrom; + struct xt_counters counters; + unsigned char elems[0]; +}; + +struct ip6t_standard { + struct ip6t_entry entry; + struct xt_standard_target target; +}; + +struct ip6t_error { + struct ip6t_entry entry; + struct xt_error_target target; +}; + +struct ip6t_icmp { + __u8 type; + __u8 code[2]; + __u8 invflags; +}; + +struct ip6t_getinfo { + char name[32]; + unsigned int valid_hooks; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_entries; + unsigned int size; +}; + +struct ip6t_replace { + char name[32]; + unsigned int valid_hooks; + unsigned int num_entries; + unsigned int size; + unsigned int hook_entry[5]; + unsigned int underflow[5]; + unsigned int num_counters; + struct xt_counters *counters; + struct ip6t_entry entries[0]; +}; + +struct ip6t_get_entries { + char name[32]; + unsigned int size; + struct ip6t_entry entrytable[0]; +}; + +struct trace_event_raw_rpm_internal { + struct trace_entry ent; + u32 __data_loc_name; + int flags; + int usage_count; + int disable_depth; + int runtime_auto; + int request_pending; + int irq_safe; + int child_count; + char __data[0]; +}; + +struct trace_event_raw_rpm_return_int { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int ip; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_rpm_internal { + u32 name; +}; + +struct trace_event_data_offsets_rpm_return_int { + u32 name; +}; + +typedef void (*btf_trace_rpm_suspend)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_resume)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_idle)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_usage)(void *, struct device *, int); + +typedef void (*btf_trace_rpm_return_int)(void *, struct device *, long unsigned int, int); + +struct mmap_unlock_irq_work { + struct irq_work irq_work; + struct mm_struct *mm; +}; + +struct bpf_iter_seq_task_common { + struct pid_namespace *ns; + enum bpf_iter_task_type type; + u32 pid; + u32 pid_visiting; +}; + +struct bpf_iter_seq_task_info { + struct bpf_iter_seq_task_common common; + u32 tid; +}; + +struct bpf_iter__task { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; +}; + +struct bpf_iter_seq_task_file_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + u32 tid; + u32 fd; +}; + +struct bpf_iter__task_file { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + u32 fd; + union { + struct file *file; + }; +}; + +struct bpf_iter_seq_task_vma_info { + struct bpf_iter_seq_task_common common; + struct task_struct *task; + struct vm_area_struct *vma; + u32 tid; + long unsigned int prev_vm_start; + long unsigned int prev_vm_end; +}; + +enum bpf_task_vma_iter_find_op { + task_vma_iter_first_vma = 0, + task_vma_iter_next_vma = 1, + task_vma_iter_find_vma = 2, +}; + +struct bpf_iter__task_vma { + union { + struct bpf_iter_meta *meta; + }; + union { + struct task_struct *task; + }; + union { + struct vm_area_struct *vma; + }; +}; + +typedef u64 (*btf_bpf_find_vma)(struct task_struct *, u64, bpf_callback_t, void *, u64); + +struct bpf_iter_aux_info; + +struct fscrypt_name { + const struct qstr *usr_fname; + struct fscrypt_str disk_name; + u32 hash; + u32 minor_hash; + struct fscrypt_str crypto_buf; + bool is_nokey_name; +}; + +struct ext4_dir_entry { + __le32 inode; + __le16 rec_len; + __le16 name_len; + char name[255]; +}; + +struct ext4_dir_entry_tail { + __le32 det_reserved_zero1; + __le16 det_rec_len; + __u8 det_reserved_zero2; + __u8 det_reserved_ft; + __le32 det_checksum; +}; + +typedef enum { + EITHER = 0, + INDEX = 1, + DIRENT = 2, + DIRENT_HTREE = 3, +} dirblock_type_t; + +struct fake_dirent { + __le32 inode; + __le16 rec_len; + u8 name_len; + u8 file_type; +}; + +struct dx_countlimit { + __le16 limit; + __le16 count; +}; + +struct dx_entry { + __le32 hash; + __le32 block; +}; + +struct dx_root_info { + __le32 reserved_zero; + u8 hash_version; + u8 info_length; + u8 indirect_levels; + u8 unused_flags; +}; + +struct dx_root { + struct fake_dirent dot; + char dot_name[4]; + struct fake_dirent dotdot; + char dotdot_name[4]; + struct dx_root_info info; + struct dx_entry entries[0]; +}; + +struct dx_node { + struct fake_dirent fake; + struct dx_entry entries[0]; +}; + +struct dx_frame { + struct buffer_head *bh; + struct dx_entry *entries; + struct dx_entry *at; +}; + +struct dx_map_entry { + u32 hash; + u16 offs; + u16 size; +}; + +struct dx_tail { + u32 dt_reserved; + __le32 dt_checksum; +}; + +struct ext4_renament { + struct inode *dir; + struct dentry *dentry; + struct inode *inode; + bool is_dir; + int dir_nlink_delta; + struct buffer_head *bh; + struct ext4_dir_entry_2 *de; + int inlined; + struct buffer_head *dir_bh; + struct ext4_dir_entry_2 *parent_de; + int dir_inlined; +}; + +typedef int (*of_init_fn_2)(struct device_node *, struct device_node *); + +struct acpi_madt_generic_distributor { + struct acpi_subtable_header header; + u16 reserved; + u32 gic_id; + u64 base_address; + u32 global_irq_base; + u8 version; + u8 reserved2[3]; +}; + +enum acpi_madt_gic_version { + ACPI_MADT_GIC_VERSION_NONE = 0, + ACPI_MADT_GIC_VERSION_V1 = 1, + ACPI_MADT_GIC_VERSION_V2 = 2, + ACPI_MADT_GIC_VERSION_V3 = 3, + ACPI_MADT_GIC_VERSION_V4 = 4, + ACPI_MADT_GIC_VERSION_RESERVED = 5, +}; + +enum gic_type { + GIC_V2 = 0, + GIC_V3 = 1, +}; + +struct gic_kvm_info { + enum gic_type type; + struct resource vcpu; + unsigned int maint_irq; + bool no_maint_irq_mask; + struct resource vctrl; + bool has_v4; + bool has_v4_1; + bool no_hw_deactivation; +}; + +union gic_base { + void *common_base; + void **percpu_base; +}; + +struct gic_chip_data { + union gic_base dist_base; + union gic_base cpu_base; + void *raw_dist_base; + void *raw_cpu_base; + u32 percpu_offset; + u32 saved_spi_enable[32]; + u32 saved_spi_active[32]; + u32 saved_spi_conf[64]; + u32 saved_spi_target[255]; + u32 *saved_ppi_enable; + u32 *saved_ppi_active; + u32 *saved_ppi_conf; + struct irq_domain *domain; + unsigned int gic_irqs; +}; + +struct dma_fence_unwrap { + struct dma_fence *chain; + struct dma_fence *array; + unsigned int index; +}; + +struct sync_file { + struct file *file; + char user_name[32]; + struct list_head sync_file_list; + wait_queue_head_t wq; + long unsigned int flags; + struct dma_fence *fence; + struct dma_fence_cb cb; +}; + +struct sync_merge_data { + char name[32]; + __s32 fd2; + __s32 fence; + __u32 flags; + __u32 pad; +}; + +struct sync_fence_info { + char obj_name[32]; + char driver_name[32]; + __s32 status; + __u32 flags; + __u64 timestamp_ns; +}; + +struct sync_file_info { + char name[32]; + __s32 status; + __u32 flags; + __u32 num_fences; + __u32 pad; + __u64 sync_fence_info; +}; + +enum { + NETNSA_NONE = 0, + NETNSA_NSID = 1, + NETNSA_PID = 2, + NETNSA_FD = 3, + NETNSA_TARGET_NSID = 4, + NETNSA_CURRENT_NSID = 5, + __NETNSA_MAX = 6, +}; + +struct net_fill_args { + u32 portid; + u32 seq; + int flags; + int cmd; + int nsid; + bool add_ref; + int ref_nsid; +}; + +struct rtnl_net_dump_cb { + struct net *tgt_net; + struct net *ref_net; + struct sk_buff *skb; + struct net_fill_args fillargs; + int idx; + int s_idx; +}; + +struct virtio_9p_config { + __virtio16 tag_len; + __u8 tag[0]; +}; + +struct virtio_chan { + bool inuse; + spinlock_t lock; + struct p9_client *client; + struct virtio_device *vdev; + struct virtqueue *vq; + int ring_bufs_avail; + wait_queue_head_t *vc_wq; + long unsigned int p9_max_pages; + struct scatterlist sg[128]; + char *tag; + struct list_head chan_list; +}; + +struct ZSTD_DCtx_s; + +typedef struct ZSTD_DCtx_s ZSTD_DCtx___2; + +typedef ZSTD_DCtx___2 ZSTD_DStream___2; + +typedef ZSTD_ErrorCode zstd_error_code; + +typedef ZSTD_DCtx___2 zstd_dctx; + +typedef ZSTD_inBuffer zstd_in_buffer; + +typedef ZSTD_outBuffer zstd_out_buffer; + +typedef ZSTD_DStream___2 zstd_dstream; + +typedef ZSTD_frameHeader zstd_frame_header; + +struct maple_metadata { + unsigned char end; + unsigned char gap; +}; + +struct maple_pnode; + +struct maple_range_64 { + struct maple_pnode *parent; + long unsigned int pivot[15]; + union { + void *slot[16]; + struct { + void *pad[15]; + struct maple_metadata meta; + }; + }; +}; + +struct maple_arange_64 { + struct maple_pnode *parent; + long unsigned int pivot[9]; + void *slot[10]; + long unsigned int gap[10]; + struct maple_metadata meta; +}; + +struct maple_topiary { + struct maple_pnode *parent; + struct maple_enode *next; +}; + +enum maple_type { + maple_dense = 0, + maple_leaf_64 = 1, + maple_range_64 = 2, + maple_arange_64 = 3, +}; + +struct maple_node { + union { + struct { + struct maple_pnode *parent; + void *slot[31]; + }; + struct { + void *pad; + struct callback_head rcu; + struct maple_enode *piv_parent; + unsigned char parent_slot; + enum maple_type type; + unsigned char slot_len; + unsigned int ma_flags; + }; + struct maple_range_64 mr64; + struct maple_arange_64 ma64; + struct maple_alloc alloc; + }; +}; + +struct ma_topiary { + struct maple_enode *head; + struct maple_enode *tail; + struct maple_tree *mtree; +}; + +struct ma_wr_state { + struct ma_state *mas; + struct maple_node *node; + long unsigned int r_min; + long unsigned int r_max; + enum maple_type type; + unsigned char offset_end; + unsigned char node_end; + long unsigned int *pivots; + long unsigned int end_piv; + void **slots; + void *entry; + void *content; +}; + +struct trace_event_raw_ma_op { + struct trace_entry ent; + const char *fn; + long unsigned int min; + long unsigned int max; + long unsigned int index; + long unsigned int last; + void *node; + char __data[0]; +}; + +struct trace_event_raw_ma_read { + struct trace_entry ent; + const char *fn; + long unsigned int min; + long unsigned int max; + long unsigned int index; + long unsigned int last; + void *node; + char __data[0]; +}; + +struct trace_event_raw_ma_write { + struct trace_entry ent; + const char *fn; + long unsigned int min; + long unsigned int max; + long unsigned int index; + long unsigned int last; + long unsigned int piv; + void *val; + void *node; + char __data[0]; +}; + +struct trace_event_data_offsets_ma_op {}; + +struct trace_event_data_offsets_ma_read {}; + +struct trace_event_data_offsets_ma_write {}; + +typedef void (*btf_trace_ma_op)(void *, const char *, struct ma_state *); + +typedef void (*btf_trace_ma_read)(void *, const char *, struct ma_state *); + +typedef void (*btf_trace_ma_write)(void *, const char *, struct ma_state *, long unsigned int, void *); + +struct maple_big_node { + struct maple_pnode *parent; + long unsigned int pivot[33]; + union { + struct maple_enode *slot[34]; + struct { + long unsigned int padding[21]; + long unsigned int gap[21]; + }; + }; + unsigned char b_end; + enum maple_type type; +}; + +struct maple_subtree_state { + struct ma_state *orig_l; + struct ma_state *orig_r; + struct ma_state *l; + struct ma_state *m; + struct ma_state *r; + struct ma_topiary *free; + struct ma_topiary *destroy; + struct maple_big_node *bn; +}; + +struct prctl_mm_map { + __u64 start_code; + __u64 end_code; + __u64 start_data; + __u64 end_data; + __u64 start_brk; + __u64 brk; + __u64 start_stack; + __u64 arg_start; + __u64 arg_end; + __u64 env_start; + __u64 env_end; + __u64 *auxv; + __u32 auxv_size; + __u32 exe_fd; +}; + +struct rlimit64 { + __u64 rlim_cur; + __u64 rlim_max; +}; + +struct tms { + __kernel_clock_t tms_utime; + __kernel_clock_t tms_stime; + __kernel_clock_t tms_cutime; + __kernel_clock_t tms_cstime; +}; + +struct getcpu_cache { + long unsigned int blob[16]; +}; + +struct crypto_report_akcipher { + char type[64]; +}; + +struct rq_map_data { + struct page **pages; + long unsigned int offset; + short unsigned int page_order; + short unsigned int nr_entries; + bool null_mapped; + bool from_user; +}; + +struct bio_map_data { + bool is_our_pages: 1; + bool is_null_mapped: 1; + struct iov_iter iter; + struct iovec iov[0]; +}; + +struct io_uring_rsrc_register { + __u32 nr; + __u32 flags; + __u64 resv2; + __u64 data; + __u64 tags; +}; + +struct io_uring_rsrc_update2 { + __u32 offset; + __u32 resv; + __u64 data; + __u64 tags; + __u32 nr; + __u32 resv2; +}; + +struct io_rsrc_update { + struct file *file; + u64 arg; + u32 nr_args; + u32 offset; +}; + +struct acpi_table_pcct { + struct acpi_table_header header; + u32 flags; + u64 reserved; +}; + +enum acpi_pcct_type { + ACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0, + ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE = 1, + ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 = 2, + ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE = 3, + ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE = 4, + ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE = 5, + ACPI_PCCT_TYPE_RESERVED = 6, +}; + +struct acpi_pcct_subspace { + struct acpi_subtable_header header; + u8 reserved[6]; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +} __attribute__((packed)); + +struct acpi_pcct_hw_reduced { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; +} __attribute__((packed)); + +struct acpi_pcct_hw_reduced_type2 { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved; + u64 base_address; + u64 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u16 min_turnaround_time; + struct acpi_generic_address platform_ack_register; + u64 ack_preserve_mask; + u64 ack_write_mask; +} __attribute__((packed)); + +struct acpi_pcct_ext_pcc_master { + struct acpi_subtable_header header; + u32 platform_interrupt; + u8 flags; + u8 reserved1; + u64 base_address; + u32 length; + struct acpi_generic_address doorbell_register; + u64 preserve_mask; + u64 write_mask; + u32 latency; + u32 max_access_rate; + u32 min_turnaround_time; + struct acpi_generic_address platform_ack_register; + u64 ack_preserve_mask; + u64 ack_set_mask; + u64 reserved2; + struct acpi_generic_address cmd_complete_register; + u64 cmd_complete_mask; + struct acpi_generic_address cmd_update_register; + u64 cmd_update_preserve_mask; + u64 cmd_update_set_mask; + struct acpi_generic_address error_status_register; + u64 error_status_mask; +} __attribute__((packed)); + +typedef int (*acpi_tbl_entry_handler_arg)(union acpi_subtable_headers *, void *, const long unsigned int); + +struct acpi_subtable_proc { + int id; + acpi_tbl_entry_handler handler; + acpi_tbl_entry_handler_arg handler_arg; + void *arg; + int count; +}; + +struct pcc_chan_reg { + void *vaddr; + struct acpi_generic_address *gas; + u64 preserve_mask; + u64 set_mask; + u64 status_mask; +}; + +struct pcc_chan_info { + struct pcc_mbox_chan chan; + struct pcc_chan_reg db; + struct pcc_chan_reg plat_irq_ack; + struct pcc_chan_reg cmd_complete; + struct pcc_chan_reg cmd_update; + struct pcc_chan_reg error; + int plat_irq; +}; + +enum ip_conntrack_expect_events { + IPEXP_NEW = 0, + IPEXP_DESTROY = 1, +}; + +struct arpreq { + struct sockaddr arp_pa; + struct sockaddr arp_ha; + int arp_flags; + struct sockaddr arp_netmask; + char arp_dev[16]; +}; + +struct wq_flusher; + +struct worker; + +struct workqueue_attrs; + +struct pool_workqueue; + +struct wq_device; + +struct workqueue_struct { + struct list_head pwqs; + struct list_head list; + struct mutex mutex; + int work_color; + int flush_color; + atomic_t nr_pwqs_to_flush; + struct wq_flusher *first_flusher; + struct list_head flusher_queue; + struct list_head flusher_overflow; + struct list_head maydays; + struct worker *rescuer; + int nr_drainers; + int saved_max_active; + struct workqueue_attrs *unbound_attrs; + struct pool_workqueue *dfl_pwq; + struct wq_device *wq_dev; + char *lock_name; + struct lock_class_key key; + struct lockdep_map lockdep_map; + char name[24]; + struct callback_head rcu; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + unsigned int flags; + struct pool_workqueue *cpu_pwqs; + struct pool_workqueue *numa_pwq_tbl[0]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct workqueue_attrs { + int nice; + cpumask_var_t cpumask; + bool no_numa; +}; + +struct worker_pool; + +struct worker { + union { + struct list_head entry; + struct hlist_node hentry; + }; + struct work_struct *current_work; + work_func_t current_func; + struct pool_workqueue *current_pwq; + unsigned int current_color; + struct list_head scheduled; + struct task_struct *task; + struct worker_pool *pool; + struct list_head node; + long unsigned int last_active; + unsigned int flags; + int id; + int sleeping; + char desc[24]; + struct workqueue_struct *rescue_wq; + work_func_t last_func; +}; + +struct pool_workqueue { + struct worker_pool *pool; + struct workqueue_struct *wq; + int work_color; + int flush_color; + int refcnt; + int nr_in_flight[16]; + int nr_active; + int max_active; + struct list_head inactive_works; + struct list_head pwqs_node; + struct list_head mayday_node; + struct work_struct unbound_release_work; + struct callback_head rcu; + long: 64; + long: 64; +}; + +struct worker_pool { + raw_spinlock_t lock; + int cpu; + int node; + int id; + unsigned int flags; + long unsigned int watchdog_ts; + int nr_running; + struct list_head worklist; + int nr_workers; + int nr_idle; + struct list_head idle_list; + struct timer_list idle_timer; + struct timer_list mayday_timer; + struct hlist_head busy_hash[64]; + struct worker *manager; + struct list_head workers; + struct completion *detach_completion; + struct ida worker_ida; + struct workqueue_attrs *attrs; + struct hlist_node hash_node; + int refcnt; + struct callback_head rcu; +}; + +enum { + POOL_MANAGER_ACTIVE = 1, + POOL_DISASSOCIATED = 4, + WORKER_DIE = 2, + WORKER_IDLE = 4, + WORKER_PREP = 8, + WORKER_CPU_INTENSIVE = 64, + WORKER_UNBOUND = 128, + WORKER_REBOUND = 256, + WORKER_NOT_RUNNING = 456, + NR_STD_WORKER_POOLS = 2, + UNBOUND_POOL_HASH_ORDER = 6, + BUSY_WORKER_HASH_ORDER = 6, + MAX_IDLE_WORKERS_RATIO = 4, + IDLE_WORKER_TIMEOUT = 300000, + MAYDAY_INITIAL_TIMEOUT = 10, + MAYDAY_INTERVAL = 100, + CREATE_COOLDOWN = 1000, + RESCUER_NICE_LEVEL = -20, + HIGHPRI_NICE_LEVEL = -20, + WQ_NAME_LEN = 24, +}; + +struct wq_flusher { + struct list_head list; + int flush_color; + struct completion done; +}; + +struct wq_device { + struct workqueue_struct *wq; + struct device dev; +}; + +struct trace_event_raw_workqueue_queue_work { + struct trace_entry ent; + void *work; + void *function; + u32 __data_loc_workqueue; + int req_cpu; + int cpu; + char __data[0]; +}; + +struct trace_event_raw_workqueue_activate_work { + struct trace_entry ent; + void *work; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_workqueue_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_data_offsets_workqueue_queue_work { + u32 workqueue; +}; + +struct trace_event_data_offsets_workqueue_activate_work {}; + +struct trace_event_data_offsets_workqueue_execute_start {}; + +struct trace_event_data_offsets_workqueue_execute_end {}; + +typedef void (*btf_trace_workqueue_queue_work)(void *, int, struct pool_workqueue *, struct work_struct *); + +typedef void (*btf_trace_workqueue_activate_work)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_execute_start)(void *, struct work_struct *); + +typedef void (*btf_trace_workqueue_execute_end)(void *, struct work_struct *, work_func_t); + +struct wq_barrier { + struct work_struct work; + struct completion done; + struct task_struct *task; +}; + +struct cwt_wait { + wait_queue_entry_t wait; + struct work_struct *work; +}; + +struct apply_wqattrs_ctx { + struct workqueue_struct *wq; + struct workqueue_attrs *attrs; + struct list_head list; + struct pool_workqueue *dfl_pwq; + struct pool_workqueue *pwq_tbl[0]; +}; + +struct work_for_cpu { + struct work_struct work; + long int (*fn)(void *); + void *arg; + long int ret; +}; + +struct fscrypt_info; + +struct debugfs_reg32 { + char *name; + long unsigned int offset; +}; + +struct debugfs_regset32 { + const struct debugfs_reg32 *regs; + int nregs; + void *base; + struct device *dev; +}; + +struct debugfs_devm_entry { + int (*read)(struct seq_file *, void *); + struct device *dev; +}; + +struct hd_geometry { + unsigned char heads; + unsigned char sectors; + short unsigned int cylinders; + long unsigned int start; +}; + +struct blkpg_ioctl_arg { + int op; + int flags; + int datalen; + void *data; +}; + +struct blkpg_partition { + long long int start; + long long int length; + int pno; + char devname[64]; + char volname[64]; +}; + +struct pr_reservation { + __u64 key; + __u32 type; + __u32 flags; +}; + +struct pr_registration { + __u64 old_key; + __u64 new_key; + __u32 flags; + __u32 __pad; +}; + +struct pr_preempt { + __u64 old_key; + __u64 new_key; + __u32 type; + __u32 flags; +}; + +struct pr_clear { + __u64 key; + __u32 flags; + __u32 __pad; +}; + +struct internal_state { + int dummy; +}; + +struct acpi_madt_generic_redistributor { + struct acpi_subtable_header header; + u16 reserved; + u64 base_address; + u32 length; +} __attribute__((packed)); + +struct redist_region { + void *redist_base; + phys_addr_t phys_base; + bool single_redist; +}; + +struct partition_desc; + +struct gic_chip_data___2 { + struct fwnode_handle *fwnode; + void *dist_base; + struct redist_region *redist_regions; + struct rdists rdists; + struct irq_domain *domain; + u64 redist_stride; + u32 nr_redist_regions; + u64 flags; + bool has_rss; + unsigned int ppi_nr; + struct partition_desc **ppi_descs; +}; + +enum gic_intid_range { + SGI_RANGE = 0, + PPI_RANGE = 1, + SPI_RANGE = 2, + EPPI_RANGE = 3, + ESPI_RANGE = 4, + LPI_RANGE = 5, + __INVALID_RANGE__ = 6, +}; + +struct acpi_genl_event { + acpi_device_class device_class; + char bus_id[15]; + u32 type; + u32 data; +}; + +enum { + ACPI_GENL_ATTR_UNSPEC = 0, + ACPI_GENL_ATTR_EVENT = 1, + __ACPI_GENL_ATTR_MAX = 2, +}; + +enum { + ACPI_GENL_CMD_UNSPEC = 0, + ACPI_GENL_CMD_EVENT = 1, + __ACPI_GENL_CMD_MAX = 2, +}; + +struct virtio_blk_geometry { + __virtio16 cylinders; + __u8 heads; + __u8 sectors; +}; + +struct virtio_blk_config { + __virtio64 capacity; + __virtio32 size_max; + __virtio32 seg_max; + struct virtio_blk_geometry geometry; + __virtio32 blk_size; + __u8 physical_block_exp; + __u8 alignment_offset; + __virtio16 min_io_size; + __virtio32 opt_io_size; + __u8 wce; + __u8 unused; + __virtio16 num_queues; + __virtio32 max_discard_sectors; + __virtio32 max_discard_seg; + __virtio32 discard_sector_alignment; + __virtio32 max_write_zeroes_sectors; + __virtio32 max_write_zeroes_seg; + __u8 write_zeroes_may_unmap; + __u8 unused1[3]; + __virtio32 max_secure_erase_sectors; + __virtio32 max_secure_erase_seg; + __virtio32 secure_erase_sector_alignment; +}; + +struct virtio_blk_outhdr { + __virtio32 type; + __virtio32 ioprio; + __virtio64 sector; +}; + +struct virtio_blk_discard_write_zeroes { + __le64 sector; + __le32 num_sectors; + __le32 flags; +}; + +struct virtio_blk_vq { + struct virtqueue *vq; + spinlock_t lock; + char name[16]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct virtio_blk { + struct mutex vdev_mutex; + struct virtio_device *vdev; + struct gendisk *disk; + struct blk_mq_tag_set tag_set; + struct work_struct config_work; + int index; + int num_vqs; + int io_queues[3]; + struct virtio_blk_vq *vqs; +}; + +struct virtblk_req { + struct virtio_blk_outhdr out_hdr; + u8 status; + struct sg_table sg_table; + struct scatterlist sg[0]; +}; + +struct nf_ct_bridge_info { + struct nf_hook_ops *ops; + unsigned int ops_size; + struct module *me; +}; + +struct xfrm_skb_cb { + struct xfrm_tunnel_skb_cb header; + union { + struct { + __u32 low; + __u32 hi; + } output; + struct { + __be32 low; + __be32 hi; + } input; + } seq; +}; + +struct xfrm_trans_tasklet { + struct work_struct work; + spinlock_t queue_lock; + struct sk_buff_head queue; +}; + +struct xfrm_trans_cb { + union { + struct inet_skb_parm h4; + struct inet6_skb_parm h6; + } header; + int (*finish)(struct net *, struct sock *, struct sk_buff *); + struct net *net; +}; + +struct bpf_devmap_val { + __u32 ifindex; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +struct xdp_dev_bulk_queue { + struct xdp_frame *q[16]; + struct list_head flush_node; + struct net_device *dev; + struct net_device *dev_rx; + struct bpf_prog *xdp_prog; + unsigned int count; +}; + +struct bpf_dtab; + +struct bpf_dtab_netdev { + struct net_device *dev; + struct hlist_node index_hlist; + struct bpf_dtab *dtab; + struct bpf_prog *xdp_prog; + struct callback_head rcu; + unsigned int idx; + struct bpf_devmap_val val; +}; + +struct bpf_dtab { + struct bpf_map map; + struct bpf_dtab_netdev **netdev_map; + struct list_head list; + struct hlist_head *dev_index_head; + spinlock_t index_lock; + unsigned int items; + u32 n_buckets; + long: 64; + long: 64; + long: 64; +}; + +struct shmid_ds { + struct ipc_perm shm_perm; + int shm_segsz; + __kernel_old_time_t shm_atime; + __kernel_old_time_t shm_dtime; + __kernel_old_time_t shm_ctime; + __kernel_ipc_pid_t shm_cpid; + __kernel_ipc_pid_t shm_lpid; + short unsigned int shm_nattch; + short unsigned int shm_unused; + void *shm_unused2; + void *shm_unused3; +}; + +struct shmid64_ds { + struct ipc64_perm shm_perm; + __kernel_size_t shm_segsz; + long int shm_atime; + long int shm_dtime; + long int shm_ctime; + __kernel_pid_t shm_cpid; + __kernel_pid_t shm_lpid; + long unsigned int shm_nattch; + long unsigned int __unused4; + long unsigned int __unused5; +}; + +struct shminfo64 { + long unsigned int shmmax; + long unsigned int shmmin; + long unsigned int shmmni; + long unsigned int shmseg; + long unsigned int shmall; + long unsigned int __unused1; + long unsigned int __unused2; + long unsigned int __unused3; + long unsigned int __unused4; +}; + +struct shminfo { + int shmmax; + int shmmin; + int shmmni; + int shmseg; + int shmall; +}; + +struct shm_info { + int used_ids; + __kernel_ulong_t shm_tot; + __kernel_ulong_t shm_rss; + __kernel_ulong_t shm_swp; + __kernel_ulong_t swap_attempts; + __kernel_ulong_t swap_successes; +}; + +struct shmid_kernel { + struct kern_ipc_perm shm_perm; + struct file *shm_file; + long unsigned int shm_nattch; + long unsigned int shm_segsz; + time64_t shm_atim; + time64_t shm_dtim; + time64_t shm_ctim; + struct pid *shm_cprid; + struct pid *shm_lprid; + struct ucounts *mlock_ucounts; + struct task_struct *shm_creator; + struct list_head shm_clist; + struct ipc_namespace *ns; + long: 64; + long: 64; + long: 64; +}; + +struct shm_file_data { + int id; + struct ipc_namespace *ns; + struct file *file; + const struct vm_operations_struct *vm_ops; +}; + +enum x509_actions { + ACT_x509_extract_key_data = 0, + ACT_x509_extract_name_segment___2 = 1, + ACT_x509_note_OID___2 = 2, + ACT_x509_note_issuer = 3, + ACT_x509_note_not_after = 4, + ACT_x509_note_not_before = 5, + ACT_x509_note_params = 6, + ACT_x509_note_serial = 7, + ACT_x509_note_sig_algo = 8, + ACT_x509_note_signature = 9, + ACT_x509_note_subject = 10, + ACT_x509_note_tbs_certificate = 11, + ACT_x509_process_extension = 12, + NR__x509_actions = 13, +}; + +struct bsg_job; + +typedef int bsg_job_fn(struct bsg_job *); + +struct bsg_buffer { + unsigned int payload_len; + int sg_cnt; + struct scatterlist *sg_list; +}; + +struct bsg_job { + struct device *dev; + struct kref kref; + unsigned int timeout; + void *request; + void *reply; + unsigned int request_len; + unsigned int reply_len; + struct bsg_buffer request_payload; + struct bsg_buffer reply_payload; + int result; + unsigned int reply_payload_rcv_len; + struct request *bidi_rq; + struct bio *bidi_bio; + void *dd_data; +}; + +typedef enum blk_eh_timer_return bsg_timeout_fn(struct request *); + +enum scsi_device_event { + SDEV_EVT_MEDIA_CHANGE = 1, + SDEV_EVT_INQUIRY_CHANGE_REPORTED = 2, + SDEV_EVT_CAPACITY_CHANGE_REPORTED = 3, + SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED = 4, + SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED = 5, + SDEV_EVT_LUN_CHANGE_REPORTED = 6, + SDEV_EVT_ALUA_STATE_CHANGE_REPORTED = 7, + SDEV_EVT_POWER_ON_RESET_OCCURRED = 8, + SDEV_EVT_FIRST = 1, + SDEV_EVT_LAST = 8, + SDEV_EVT_MAXBITS = 9, +}; + +struct bsg_device; + +struct bsg_set { + struct blk_mq_tag_set tag_set; + struct bsg_device *bd; + bsg_job_fn *job_fn; + bsg_timeout_fn *timeout_fn; +}; + +typedef void ip6_icmp_send_t(struct sk_buff *, u8, u8, __u32, const struct in6_addr *, const struct inet6_skb_parm *); + +struct icmpv6_msg { + struct sk_buff *skb; + int offset; + uint8_t type; +}; + +struct icmp6_err { + int err; + int fatal; +}; + +enum { + NLBL_CALIPSO_C_UNSPEC = 0, + NLBL_CALIPSO_C_ADD = 1, + NLBL_CALIPSO_C_REMOVE = 2, + NLBL_CALIPSO_C_LIST = 3, + NLBL_CALIPSO_C_LISTALL = 4, + __NLBL_CALIPSO_C_MAX = 5, +}; + +enum { + NLBL_CALIPSO_A_UNSPEC = 0, + NLBL_CALIPSO_A_DOI = 1, + NLBL_CALIPSO_A_MTYPE = 2, + __NLBL_CALIPSO_A_MAX = 3, +}; + +struct netlbl_calipso_doiwalk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct netlbl_domhsh_walk_arg___2 { + struct netlbl_audit *audit_info; + u32 doi; +}; + +typedef int __kernel_daddr_t; + +struct ustat { + __kernel_daddr_t f_tfree; + long unsigned int f_tinode; + char f_fname[6]; + char f_fpack[6]; +}; + +struct statfs { + __kernel_long_t f_type; + __kernel_long_t f_bsize; + __kernel_long_t f_blocks; + __kernel_long_t f_bfree; + __kernel_long_t f_bavail; + __kernel_long_t f_files; + __kernel_long_t f_ffree; + __kernel_fsid_t f_fsid; + __kernel_long_t f_namelen; + __kernel_long_t f_frsize; + __kernel_long_t f_flags; + __kernel_long_t f_spare[4]; +}; + +struct statfs64 { + __kernel_long_t f_type; + __kernel_long_t f_bsize; + __u64 f_blocks; + __u64 f_bfree; + __u64 f_bavail; + __u64 f_files; + __u64 f_ffree; + __kernel_fsid_t f_fsid; + __kernel_long_t f_namelen; + __kernel_long_t f_frsize; + __kernel_long_t f_flags; + __kernel_long_t f_spare[4]; +}; + +enum SHIFT_DIRECTION { + SHIFT_LEFT = 0, + SHIFT_RIGHT = 1, +}; + +struct ext4_extent_tail { + __le32 et_checksum; +}; + +struct pnp_info_buffer { + char *buffer; + char *curr; + long unsigned int size; + long unsigned int len; + int stop; + int error; +}; + +typedef struct pnp_info_buffer pnp_info_buffer_t; + +struct clk_div_table { + unsigned int val; + unsigned int div; +}; + +struct clk_divider { + struct clk_hw hw; + void *reg; + u8 shift; + u8 width; + u8 flags; + const struct clk_div_table *table; + spinlock_t *lock; +}; + +struct swap_cgroup_ctrl { + struct page **map; + long unsigned int length; + spinlock_t lock; +}; + +struct swap_cgroup { + short unsigned int id; +}; + +struct folio_iter { + struct folio *folio; + size_t offset; + size_t length; + struct folio *_next; + size_t _seg_count; + int _i; +}; + +struct iomap_ioend { + struct list_head io_list; + u16 io_type; + u16 io_flags; + u32 io_folios; + struct inode *io_inode; + size_t io_size; + loff_t io_offset; + sector_t io_sector; + struct bio *io_bio; + struct bio io_inline_bio; +}; + +struct iomap_writepage_ctx; + +struct iomap_writeback_ops { + int (*map_blocks)(struct iomap_writepage_ctx *, struct inode *, loff_t); + int (*prepare_ioend)(struct iomap_ioend *, int); + void (*discard_folio)(struct folio *, loff_t); +}; + +struct iomap_writepage_ctx { + struct iomap iomap; + struct iomap_ioend *ioend; + const struct iomap_writeback_ops *ops; +}; + +struct iomap_page { + atomic_t read_bytes_pending; + atomic_t write_bytes_pending; + spinlock_t uptodate_lock; + long unsigned int uptodate[0]; +}; + +struct iomap_readpage_ctx { + struct folio *cur_folio; + bool cur_folio_in_bio; + struct bio *bio; + struct readahead_control *rac; +}; + +struct fat_boot_sector { + __u8 ignored[3]; + __u8 system_id[8]; + __u8 sector_size[2]; + __u8 sec_per_clus; + __le16 reserved; + __u8 fats; + __u8 dir_entries[2]; + __u8 sectors[2]; + __u8 media; + __le16 fat_length; + __le16 secs_track; + __le16 heads; + __le32 hidden; + __le32 total_sect; + union { + struct { + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat16; + struct { + __le32 length; + __le16 flags; + __u8 version[2]; + __le32 root_cluster; + __le16 info_sector; + __le16 backup_boot; + __le16 reserved2[6]; + __u8 drive_number; + __u8 state; + __u8 signature; + __u8 vol_id[4]; + __u8 vol_label[11]; + __u8 fs_type[8]; + } fat32; + }; +}; + +struct msdos_partition { + u8 boot_ind; + u8 head; + u8 sector; + u8 cyl; + u8 sys_ind; + u8 end_head; + u8 end_sector; + u8 end_cyl; + __le32 start_sect; + __le32 nr_sects; +}; + +enum msdos_sys_ind { + DOS_EXTENDED_PARTITION = 5, + LINUX_EXTENDED_PARTITION = 133, + WIN98_EXTENDED_PARTITION = 15, + LINUX_DATA_PARTITION = 131, + LINUX_LVM_PARTITION = 142, + LINUX_RAID_PARTITION___3 = 253, + SOLARIS_X86_PARTITION = 130, + NEW_SOLARIS_X86_PARTITION = 191, + DM6_AUX1PARTITION = 81, + DM6_AUX3PARTITION = 83, + DM6_PARTITION = 84, + EZD_PARTITION = 85, + FREEBSD_PARTITION = 165, + OPENBSD_PARTITION = 166, + NETBSD_PARTITION = 169, + BSDI_PARTITION = 183, + MINIX_PARTITION = 129, + UNIXWARE_PARTITION = 99, +}; + +struct solaris_x86_slice { + __le16 s_tag; + __le16 s_flag; + __le32 s_start; + __le32 s_size; +}; + +struct solaris_x86_vtoc { + unsigned int v_bootinfo[3]; + __le32 v_sanity; + __le32 v_version; + char v_volume[8]; + __le16 v_sectorsz; + __le16 v_nparts; + unsigned int v_reserved[10]; + struct solaris_x86_slice v_slice[16]; + unsigned int timestamp[16]; + char v_asciilabel[128]; +}; + +struct bsd_partition { + __le32 p_size; + __le32 p_offset; + __le32 p_fsize; + __u8 p_fstype; + __u8 p_frag; + __le16 p_cpg; +}; + +struct bsd_disklabel { + __le32 d_magic; + __s16 d_type; + __s16 d_subtype; + char d_typename[16]; + char d_packname[16]; + __u32 d_secsize; + __u32 d_nsectors; + __u32 d_ntracks; + __u32 d_ncylinders; + __u32 d_secpercyl; + __u32 d_secperunit; + __u16 d_sparespertrack; + __u16 d_sparespercyl; + __u32 d_acylinders; + __u16 d_rpm; + __u16 d_interleave; + __u16 d_trackskew; + __u16 d_cylskew; + __u32 d_headswitch; + __u32 d_trkseek; + __u32 d_flags; + __u32 d_drivedata[5]; + __u32 d_spare[5]; + __le32 d_magic2; + __le16 d_checksum; + __le16 d_npartitions; + __le32 d_bbsize; + __le32 d_sbsize; + struct bsd_partition d_partitions[16]; +}; + +struct unixware_slice { + __le16 s_label; + __le16 s_flags; + __le32 start_sect; + __le32 nr_sects; +}; + +struct unixware_vtoc { + __le32 v_magic; + __le32 v_version; + char v_name[8]; + __le16 v_nslices; + __le16 v_unknown1; + __le32 v_reserved[10]; + struct unixware_slice v_slice[16]; +}; + +struct unixware_disklabel { + __le32 d_type; + __le32 d_magic; + __le32 d_version; + char d_serial[12]; + __le32 d_ncylinders; + __le32 d_ntracks; + __le32 d_nsectors; + __le32 d_secsize; + __le32 d_part_start; + __le32 d_unknown1[12]; + __le32 d_alt_tbl; + __le32 d_alt_len; + __le32 d_phys_cyl; + __le32 d_phys_trk; + __le32 d_phys_sec; + __le32 d_phys_bytes; + __le32 d_unknown2; + __le32 d_unknown3; + __le32 d_pad[8]; + struct unixware_vtoc vtoc; +}; + +struct reciprocal_value_adv { + u32 m; + u8 sh; + u8 exp; + bool is_wide_m; +}; + +struct barrett_ctx_s; + +typedef struct barrett_ctx_s *mpi_barrett_t___2; + +struct gcry_mpi_point { + MPI x; + MPI y; + MPI z; +}; + +typedef struct gcry_mpi_point *MPI_POINT; + +enum gcry_mpi_ec_models { + MPI_EC_WEIERSTRASS = 0, + MPI_EC_MONTGOMERY = 1, + MPI_EC_EDWARDS = 2, +}; + +enum ecc_dialects { + ECC_DIALECT_STANDARD = 0, + ECC_DIALECT_ED25519 = 1, + ECC_DIALECT_SAFECURVE = 2, +}; + +struct mpi_ec_ctx { + enum gcry_mpi_ec_models model; + enum ecc_dialects dialect; + int flags; + unsigned int nbits; + MPI p; + MPI a; + MPI b; + MPI_POINT G; + MPI n; + unsigned int h; + MPI_POINT Q; + MPI d; + const char *name; + struct { + struct { + unsigned int a_is_pminus3: 1; + unsigned int two_inv_p: 1; + } valid; + int a_is_pminus3; + MPI two_inv_p; + mpi_barrett_t___2 p_barrett; + MPI scratch[11]; + } t; + void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); + void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); +}; + +struct field_table { + const char *p; + void (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *); + void (*mul2)(MPI, MPI, struct mpi_ec_ctx *); + void (*pow2)(MPI, const MPI, struct mpi_ec_ctx *); +}; + +typedef u32 (*acpi_osd_handler)(void *); + +struct acpi_os_dpc { + acpi_osd_exec_callback function; + void *context; + struct work_struct work; +}; + +struct acpi_ioremap { + struct list_head list; + void *virt; + acpi_physical_address phys; + acpi_size size; + union { + long unsigned int refcount; + struct rcu_work rwork; + } track; +}; + +struct acpi_hp_work { + struct work_struct work; + struct acpi_device *adev; + u32 src; +}; + +struct vring_desc { + __virtio64 addr; + __virtio32 len; + __virtio16 flags; + __virtio16 next; +}; + +struct vring_avail { + __virtio16 flags; + __virtio16 idx; + __virtio16 ring[0]; +}; + +struct vring_used_elem { + __virtio32 id; + __virtio32 len; +}; + +typedef struct vring_used_elem vring_used_elem_t; + +struct vring_used { + __virtio16 flags; + __virtio16 idx; + vring_used_elem_t ring[0]; +}; + +typedef struct vring_desc vring_desc_t; + +typedef struct vring_avail vring_avail_t; + +typedef struct vring_used vring_used_t; + +struct vring { + unsigned int num; + vring_desc_t *desc; + vring_avail_t *avail; + vring_used_t *used; +}; + +struct vring_packed_desc_event { + __le16 off_wrap; + __le16 flags; +}; + +struct vring_packed_desc { + __le64 addr; + __le32 len; + __le16 id; + __le16 flags; +}; + +struct vring_desc_state_split { + void *data; + struct vring_desc *indir_desc; +}; + +struct vring_desc_state_packed { + void *data; + struct vring_packed_desc *indir_desc; + u16 num; + u16 last; +}; + +struct vring_desc_extra { + dma_addr_t addr; + u32 len; + u16 flags; + u16 next; +}; + +struct vring_virtqueue_split { + struct vring vring; + u16 avail_flags_shadow; + u16 avail_idx_shadow; + struct vring_desc_state_split *desc_state; + struct vring_desc_extra *desc_extra; + dma_addr_t queue_dma_addr; + size_t queue_size_in_bytes; + u32 vring_align; + bool may_reduce_num; +}; + +struct vring_virtqueue_packed { + struct { + unsigned int num; + struct vring_packed_desc *desc; + struct vring_packed_desc_event *driver; + struct vring_packed_desc_event *device; + } vring; + bool avail_wrap_counter; + u16 avail_used_flags; + u16 next_avail_idx; + u16 event_flags_shadow; + struct vring_desc_state_packed *desc_state; + struct vring_desc_extra *desc_extra; + dma_addr_t ring_dma_addr; + dma_addr_t driver_event_dma_addr; + dma_addr_t device_event_dma_addr; + size_t ring_size_in_bytes; + size_t event_size_in_bytes; +}; + +struct vring_virtqueue { + struct virtqueue vq; + bool packed_ring; + bool use_dma_api; + bool weak_barriers; + bool broken; + bool indirect; + bool event; + unsigned int free_head; + unsigned int num_added; + u16 last_used_idx; + bool event_triggered; + union { + struct vring_virtqueue_split split; + struct vring_virtqueue_packed packed; + }; + bool (*notify)(struct virtqueue *); + bool we_own_ring; +}; + +struct hv_ops; + +struct hvc_struct { + struct tty_port port; + spinlock_t lock; + int index; + int do_wakeup; + char *outbuf; + int outbuf_size; + int n_outbuf; + uint32_t vtermno; + const struct hv_ops *ops; + int irq_requested; + int data; + struct winsize ws; + struct work_struct tty_resize; + struct list_head next; + long unsigned int flags; +}; + +struct hv_ops { + int (*get_chars)(uint32_t, char *, int); + int (*put_chars)(uint32_t, const char *, int); + int (*flush)(uint32_t, bool); + int (*notifier_add)(struct hvc_struct *, int); + void (*notifier_del)(struct hvc_struct *, int); + void (*notifier_hangup)(struct hvc_struct *, int); + int (*tiocmget)(struct hvc_struct *); + int (*tiocmset)(struct hvc_struct *, unsigned int, unsigned int); + void (*dtr_rts)(struct hvc_struct *, int); +}; + +struct byd_data { + struct timer_list timer; + struct psmouse *psmouse; + s32 abs_x; + s32 abs_y; + volatile long unsigned int last_touch_time; + bool btn_left; + bool btn_right; + bool touch; +}; + +struct stacktrace_cookie { + long unsigned int *store; + unsigned int size; + unsigned int skip; + unsigned int len; +}; + +struct signalfd_siginfo { + __u32 ssi_signo; + __s32 ssi_errno; + __s32 ssi_code; + __u32 ssi_pid; + __u32 ssi_uid; + __s32 ssi_fd; + __u32 ssi_tid; + __u32 ssi_band; + __u32 ssi_overrun; + __u32 ssi_trapno; + __s32 ssi_status; + __s32 ssi_int; + __u64 ssi_ptr; + __u64 ssi_utime; + __u64 ssi_stime; + __u64 ssi_addr; + __u16 ssi_addr_lsb; + __u16 __pad2; + __s32 ssi_syscall; + __u64 ssi_call_addr; + __u32 ssi_arch; + __u8 __pad[28]; +}; + +struct signalfd_ctx { + sigset_t sigmask; +}; + +enum p9_open_mode_t { + P9_OREAD = 0, + P9_OWRITE = 1, + P9_ORDWR = 2, + P9_OEXEC = 3, + P9_OTRUNC = 16, + P9_OREXEC = 32, + P9_ORCLOSE = 64, + P9_OAPPEND = 128, + P9_OEXCL = 4096, +}; + +enum acpi_cedt_type { + ACPI_CEDT_TYPE_CHBS = 0, + ACPI_CEDT_TYPE_CFMWS = 1, + ACPI_CEDT_TYPE_CXIMS = 2, + ACPI_CEDT_TYPE_RDPAS = 3, + ACPI_CEDT_TYPE_RESERVED = 4, +}; + +struct acpi_madt_io_apic { + struct acpi_subtable_header header; + u8 id; + u8 reserved; + u32 address; + u32 global_irq_base; +}; + +struct acpi_madt_interrupt_override { + struct acpi_subtable_header header; + u8 bus; + u8 source_irq; + u32 global_irq; + u16 inti_flags; +} __attribute__((packed)); + +struct acpi_madt_nmi_source { + struct acpi_subtable_header header; + u16 inti_flags; + u32 global_irq; +}; + +struct acpi_madt_local_apic_nmi { + struct acpi_subtable_header header; + u8 processor_id; + u16 inti_flags; + u8 lint; +} __attribute__((packed)); + +struct acpi_madt_local_apic_override { + struct acpi_subtable_header header; + u16 reserved; + u64 address; +} __attribute__((packed)); + +struct acpi_madt_io_sapic { + struct acpi_subtable_header header; + u8 id; + u8 reserved; + u32 global_irq_base; + u64 address; +}; + +struct acpi_madt_interrupt_source { + struct acpi_subtable_header header; + u16 inti_flags; + u8 type; + u8 id; + u8 eid; + u8 io_sapic_vector; + u32 global_irq; + u32 flags; +}; + +struct acpi_madt_local_x2apic_nmi { + struct acpi_subtable_header header; + u16 inti_flags; + u32 uid; + u8 lint; + u8 reserved[3]; +}; + +struct acpi_madt_core_pic { + struct acpi_subtable_header header; + u8 version; + u32 processor_id; + u32 core_id; + u32 flags; +} __attribute__((packed)); + +struct cpio_data { + void *data; + size_t size; + char name[18]; +}; + +enum acpi_subtable_type { + ACPI_SUBTABLE_COMMON = 0, + ACPI_SUBTABLE_HMAT = 1, + ACPI_SUBTABLE_PRMT = 2, + ACPI_SUBTABLE_CEDT = 3, +}; + +struct acpi_subtable_entry { + union acpi_subtable_headers *hdr; + enum acpi_subtable_type type; +}; + +struct acpi_table_apmt { + struct acpi_table_header header; +}; + +struct acpi_apmt_node { + u16 length; + u8 flags; + u8 type; + u32 id; + u64 inst_primary; + u32 inst_secondary; + u64 base_address0; + u64 base_address1; + u32 ovflw_irq; + u32 reserved; + u32 ovflw_irq_flags; + u32 proc_affinity; + u32 impl_id; +} __attribute__((packed)); + +struct of_pci_iommu_alias_info { + struct device *dev; + struct device_node *np; +}; + +enum { + ETHTOOL_A_CABLE_PAIR_A = 0, + ETHTOOL_A_CABLE_PAIR_B = 1, + ETHTOOL_A_CABLE_PAIR_C = 2, + ETHTOOL_A_CABLE_PAIR_D = 3, +}; + +enum { + ETHTOOL_A_CABLE_RESULT_UNSPEC = 0, + ETHTOOL_A_CABLE_RESULT_PAIR = 1, + ETHTOOL_A_CABLE_RESULT_CODE = 2, + __ETHTOOL_A_CABLE_RESULT_CNT = 3, + ETHTOOL_A_CABLE_RESULT_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = 0, + ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = 1, + ETHTOOL_A_CABLE_FAULT_LENGTH_CM = 2, + __ETHTOOL_A_CABLE_FAULT_LENGTH_CNT = 3, + ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = 2, +}; + +enum { + ETHTOOL_A_CABLE_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_NEST_RESULT = 1, + ETHTOOL_A_CABLE_NEST_FAULT_LENGTH = 2, + __ETHTOOL_A_CABLE_NEST_CNT = 3, + ETHTOOL_A_CABLE_NEST_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_TEST_NTF_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_NTF_HEADER = 1, + ETHTOOL_A_CABLE_TEST_NTF_STATUS = 2, + ETHTOOL_A_CABLE_TEST_NTF_NEST = 3, + __ETHTOOL_A_CABLE_TEST_NTF_CNT = 4, + ETHTOOL_A_CABLE_TEST_NTF_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = 0, + ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = 1, + ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = 2, + ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = 3, + ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = 4, + __ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT = 5, + ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = 4, +}; + +enum { + ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = 0, + ETHTOOL_A_CABLE_AMPLITUDE_PAIR = 1, + ETHTOOL_A_CABLE_AMPLITUDE_mV = 2, + __ETHTOOL_A_CABLE_AMPLITUDE_CNT = 3, + ETHTOOL_A_CABLE_AMPLITUDE_MAX = 2, +}; + +enum { + ETHTOOL_A_CABLE_PULSE_UNSPEC = 0, + ETHTOOL_A_CABLE_PULSE_mV = 1, + __ETHTOOL_A_CABLE_PULSE_CNT = 2, + ETHTOOL_A_CABLE_PULSE_MAX = 1, +}; + +enum { + ETHTOOL_A_CABLE_STEP_UNSPEC = 0, + ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = 1, + ETHTOOL_A_CABLE_STEP_LAST_DISTANCE = 2, + ETHTOOL_A_CABLE_STEP_STEP_DISTANCE = 3, + __ETHTOOL_A_CABLE_STEP_CNT = 4, + ETHTOOL_A_CABLE_STEP_MAX = 3, +}; + +enum { + ETHTOOL_A_CABLE_TDR_NEST_UNSPEC = 0, + ETHTOOL_A_CABLE_TDR_NEST_STEP = 1, + ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = 2, + ETHTOOL_A_CABLE_TDR_NEST_PULSE = 3, + __ETHTOOL_A_CABLE_TDR_NEST_CNT = 4, + ETHTOOL_A_CABLE_TDR_NEST_MAX = 3, +}; + +enum { + KTW_FREEZABLE = 1, +}; + +struct kthread_create_info { + int (*threadfn)(void *); + void *data; + int node; + struct task_struct *result; + struct completion *done; + struct list_head list; +}; + +struct kthread { + long unsigned int flags; + unsigned int cpu; + int result; + int (*threadfn)(void *); + void *data; + struct completion parked; + struct completion exited; + struct cgroup_subsys_state *blkcg_css; + char *full_name; +}; + +enum KTHREAD_BITS { + KTHREAD_IS_PER_CPU = 0, + KTHREAD_SHOULD_STOP = 1, + KTHREAD_SHOULD_PARK = 2, +}; + +struct kthread_flush_work { + struct kthread_work work; + struct completion done; +}; + +struct mlock_pvec { + local_lock_t lock; + struct pagevec vec; +}; + +struct inodes_stat_t { + long int nr_inodes; + long int nr_unused; + long int dummy[5]; +}; + +enum file_time_flags { + S_ATIME = 1, + S_MTIME = 2, + S_CTIME = 4, + S_VERSION = 8, +}; + +enum { + TCA_FLOWER_UNSPEC = 0, + TCA_FLOWER_CLASSID = 1, + TCA_FLOWER_INDEV = 2, + TCA_FLOWER_ACT = 3, + TCA_FLOWER_KEY_ETH_DST = 4, + TCA_FLOWER_KEY_ETH_DST_MASK = 5, + TCA_FLOWER_KEY_ETH_SRC = 6, + TCA_FLOWER_KEY_ETH_SRC_MASK = 7, + TCA_FLOWER_KEY_ETH_TYPE = 8, + TCA_FLOWER_KEY_IP_PROTO = 9, + TCA_FLOWER_KEY_IPV4_SRC = 10, + TCA_FLOWER_KEY_IPV4_SRC_MASK = 11, + TCA_FLOWER_KEY_IPV4_DST = 12, + TCA_FLOWER_KEY_IPV4_DST_MASK = 13, + TCA_FLOWER_KEY_IPV6_SRC = 14, + TCA_FLOWER_KEY_IPV6_SRC_MASK = 15, + TCA_FLOWER_KEY_IPV6_DST = 16, + TCA_FLOWER_KEY_IPV6_DST_MASK = 17, + TCA_FLOWER_KEY_TCP_SRC = 18, + TCA_FLOWER_KEY_TCP_DST = 19, + TCA_FLOWER_KEY_UDP_SRC = 20, + TCA_FLOWER_KEY_UDP_DST = 21, + TCA_FLOWER_FLAGS = 22, + TCA_FLOWER_KEY_VLAN_ID = 23, + TCA_FLOWER_KEY_VLAN_PRIO = 24, + TCA_FLOWER_KEY_VLAN_ETH_TYPE = 25, + TCA_FLOWER_KEY_ENC_KEY_ID = 26, + TCA_FLOWER_KEY_ENC_IPV4_SRC = 27, + TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK = 28, + TCA_FLOWER_KEY_ENC_IPV4_DST = 29, + TCA_FLOWER_KEY_ENC_IPV4_DST_MASK = 30, + TCA_FLOWER_KEY_ENC_IPV6_SRC = 31, + TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK = 32, + TCA_FLOWER_KEY_ENC_IPV6_DST = 33, + TCA_FLOWER_KEY_ENC_IPV6_DST_MASK = 34, + TCA_FLOWER_KEY_TCP_SRC_MASK = 35, + TCA_FLOWER_KEY_TCP_DST_MASK = 36, + TCA_FLOWER_KEY_UDP_SRC_MASK = 37, + TCA_FLOWER_KEY_UDP_DST_MASK = 38, + TCA_FLOWER_KEY_SCTP_SRC_MASK = 39, + TCA_FLOWER_KEY_SCTP_DST_MASK = 40, + TCA_FLOWER_KEY_SCTP_SRC = 41, + TCA_FLOWER_KEY_SCTP_DST = 42, + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT = 43, + TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK = 44, + TCA_FLOWER_KEY_ENC_UDP_DST_PORT = 45, + TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK = 46, + TCA_FLOWER_KEY_FLAGS = 47, + TCA_FLOWER_KEY_FLAGS_MASK = 48, + TCA_FLOWER_KEY_ICMPV4_CODE = 49, + TCA_FLOWER_KEY_ICMPV4_CODE_MASK = 50, + TCA_FLOWER_KEY_ICMPV4_TYPE = 51, + TCA_FLOWER_KEY_ICMPV4_TYPE_MASK = 52, + TCA_FLOWER_KEY_ICMPV6_CODE = 53, + TCA_FLOWER_KEY_ICMPV6_CODE_MASK = 54, + TCA_FLOWER_KEY_ICMPV6_TYPE = 55, + TCA_FLOWER_KEY_ICMPV6_TYPE_MASK = 56, + TCA_FLOWER_KEY_ARP_SIP = 57, + TCA_FLOWER_KEY_ARP_SIP_MASK = 58, + TCA_FLOWER_KEY_ARP_TIP = 59, + TCA_FLOWER_KEY_ARP_TIP_MASK = 60, + TCA_FLOWER_KEY_ARP_OP = 61, + TCA_FLOWER_KEY_ARP_OP_MASK = 62, + TCA_FLOWER_KEY_ARP_SHA = 63, + TCA_FLOWER_KEY_ARP_SHA_MASK = 64, + TCA_FLOWER_KEY_ARP_THA = 65, + TCA_FLOWER_KEY_ARP_THA_MASK = 66, + TCA_FLOWER_KEY_MPLS_TTL = 67, + TCA_FLOWER_KEY_MPLS_BOS = 68, + TCA_FLOWER_KEY_MPLS_TC = 69, + TCA_FLOWER_KEY_MPLS_LABEL = 70, + TCA_FLOWER_KEY_TCP_FLAGS = 71, + TCA_FLOWER_KEY_TCP_FLAGS_MASK = 72, + TCA_FLOWER_KEY_IP_TOS = 73, + TCA_FLOWER_KEY_IP_TOS_MASK = 74, + TCA_FLOWER_KEY_IP_TTL = 75, + TCA_FLOWER_KEY_IP_TTL_MASK = 76, + TCA_FLOWER_KEY_CVLAN_ID = 77, + TCA_FLOWER_KEY_CVLAN_PRIO = 78, + TCA_FLOWER_KEY_CVLAN_ETH_TYPE = 79, + TCA_FLOWER_KEY_ENC_IP_TOS = 80, + TCA_FLOWER_KEY_ENC_IP_TOS_MASK = 81, + TCA_FLOWER_KEY_ENC_IP_TTL = 82, + TCA_FLOWER_KEY_ENC_IP_TTL_MASK = 83, + TCA_FLOWER_KEY_ENC_OPTS = 84, + TCA_FLOWER_KEY_ENC_OPTS_MASK = 85, + TCA_FLOWER_IN_HW_COUNT = 86, + TCA_FLOWER_KEY_PORT_SRC_MIN = 87, + TCA_FLOWER_KEY_PORT_SRC_MAX = 88, + TCA_FLOWER_KEY_PORT_DST_MIN = 89, + TCA_FLOWER_KEY_PORT_DST_MAX = 90, + TCA_FLOWER_KEY_CT_STATE = 91, + TCA_FLOWER_KEY_CT_STATE_MASK = 92, + TCA_FLOWER_KEY_CT_ZONE = 93, + TCA_FLOWER_KEY_CT_ZONE_MASK = 94, + TCA_FLOWER_KEY_CT_MARK = 95, + TCA_FLOWER_KEY_CT_MARK_MASK = 96, + TCA_FLOWER_KEY_CT_LABELS = 97, + TCA_FLOWER_KEY_CT_LABELS_MASK = 98, + TCA_FLOWER_KEY_MPLS_OPTS = 99, + TCA_FLOWER_KEY_HASH = 100, + TCA_FLOWER_KEY_HASH_MASK = 101, + TCA_FLOWER_KEY_NUM_OF_VLANS = 102, + TCA_FLOWER_KEY_PPPOE_SID = 103, + TCA_FLOWER_KEY_PPP_PROTO = 104, + TCA_FLOWER_KEY_L2TPV3_SID = 105, + __TCA_FLOWER_MAX = 106, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPTS_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPTS_GENEVE = 1, + TCA_FLOWER_KEY_ENC_OPTS_VXLAN = 2, + TCA_FLOWER_KEY_ENC_OPTS_ERSPAN = 3, + TCA_FLOWER_KEY_ENC_OPTS_GTP = 4, + __TCA_FLOWER_KEY_ENC_OPTS_MAX = 5, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS = 1, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE = 2, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA = 3, + __TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX = 4, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPT_VXLAN_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP = 1, + __TCA_FLOWER_KEY_ENC_OPT_VXLAN_MAX = 2, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_VER = 1, + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_INDEX = 2, + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_DIR = 3, + TCA_FLOWER_KEY_ENC_OPT_ERSPAN_HWID = 4, + __TCA_FLOWER_KEY_ENC_OPT_ERSPAN_MAX = 5, +}; + +enum { + TCA_FLOWER_KEY_ENC_OPT_GTP_UNSPEC = 0, + TCA_FLOWER_KEY_ENC_OPT_GTP_PDU_TYPE = 1, + TCA_FLOWER_KEY_ENC_OPT_GTP_QFI = 2, + __TCA_FLOWER_KEY_ENC_OPT_GTP_MAX = 3, +}; + +enum { + TCA_FLOWER_KEY_MPLS_OPTS_UNSPEC = 0, + TCA_FLOWER_KEY_MPLS_OPTS_LSE = 1, + __TCA_FLOWER_KEY_MPLS_OPTS_MAX = 2, +}; + +enum { + TCA_FLOWER_KEY_MPLS_OPT_LSE_UNSPEC = 0, + TCA_FLOWER_KEY_MPLS_OPT_LSE_DEPTH = 1, + TCA_FLOWER_KEY_MPLS_OPT_LSE_TTL = 2, + TCA_FLOWER_KEY_MPLS_OPT_LSE_BOS = 3, + TCA_FLOWER_KEY_MPLS_OPT_LSE_TC = 4, + TCA_FLOWER_KEY_MPLS_OPT_LSE_LABEL = 5, + __TCA_FLOWER_KEY_MPLS_OPT_LSE_MAX = 6, +}; + +enum { + TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = 1, + TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = 2, +}; + +enum flow_cls_command { + FLOW_CLS_REPLACE = 0, + FLOW_CLS_DESTROY = 1, + FLOW_CLS_STATS = 2, + FLOW_CLS_TMPLT_CREATE = 3, + FLOW_CLS_TMPLT_DESTROY = 4, +}; + +struct flow_cls_offload { + struct flow_cls_common_offload common; + enum flow_cls_command command; + long unsigned int cookie; + struct flow_rule *rule; + struct flow_stats stats; + u32 classid; +}; + +enum tcf_proto_ops_flags { + TCF_PROTO_OPS_DOIT_UNLOCKED = 1, +}; + +struct gtp_pdu_session_info { + u8 pdu_type; + u8 qfi; +}; + +struct fl_flow_key { + struct flow_dissector_key_meta meta; + struct flow_dissector_key_control control; + struct flow_dissector_key_control enc_control; + struct flow_dissector_key_basic basic; + struct flow_dissector_key_eth_addrs eth; + struct flow_dissector_key_vlan vlan; + struct flow_dissector_key_vlan cvlan; + union { + struct flow_dissector_key_ipv4_addrs ipv4; + struct flow_dissector_key_ipv6_addrs ipv6; + }; + struct flow_dissector_key_ports tp; + struct flow_dissector_key_icmp icmp; + struct flow_dissector_key_arp arp; + struct flow_dissector_key_keyid enc_key_id; + union { + struct flow_dissector_key_ipv4_addrs enc_ipv4; + struct flow_dissector_key_ipv6_addrs enc_ipv6; + }; + struct flow_dissector_key_ports enc_tp; + struct flow_dissector_key_mpls mpls; + struct flow_dissector_key_tcp tcp; + struct flow_dissector_key_ip ip; + struct flow_dissector_key_ip enc_ip; + struct flow_dissector_key_enc_opts enc_opts; + struct flow_dissector_key_ports_range tp_range; + struct flow_dissector_key_ct ct; + struct flow_dissector_key_hash hash; + struct flow_dissector_key_num_of_vlans num_of_vlans; + struct flow_dissector_key_pppoe pppoe; + struct flow_dissector_key_l2tpv3 l2tpv3; +}; + +struct fl_flow_mask_range { + short unsigned int start; + short unsigned int end; +}; + +struct fl_flow_mask { + struct fl_flow_key key; + struct fl_flow_mask_range range; + u32 flags; + struct rhash_head ht_node; + struct rhashtable ht; + struct rhashtable_params filter_ht_params; + struct flow_dissector dissector; + struct list_head filters; + struct rcu_work rwork; + struct list_head list; + refcount_t refcnt; +}; + +struct fl_flow_tmplt { + struct fl_flow_key dummy_key; + struct fl_flow_key mask; + struct flow_dissector dissector; + struct tcf_chain *chain; +}; + +struct cls_fl_head { + struct rhashtable ht; + spinlock_t masks_lock; + struct list_head masks; + struct list_head hw_filters; + struct rcu_work rwork; + struct idr handle_idr; +}; + +struct cls_fl_filter { + struct fl_flow_mask *mask; + struct rhash_head ht_node; + struct fl_flow_key mkey; + struct tcf_exts exts; + struct tcf_result res; + struct fl_flow_key key; + struct list_head list; + struct list_head hw_list; + u32 handle; + u32 flags; + u32 in_hw_count; + struct rcu_work rwork; + struct net_device *hw_dev; + refcount_t refcnt; + bool deleted; +}; + +struct netlbl_domhsh_tbl { + struct list_head *tbl; + u32 size; +}; + +struct mptcp_skb_cb { + u64 map_seq; + u64 end_seq; + u32 offset; + u8 has_rxtstamp: 1; +}; + +struct trace_event_raw_mptcp_subflow_get_send { + struct trace_entry ent; + bool active; + bool free; + u32 snd_wnd; + u32 pace; + u8 backup; + u64 ratio; + char __data[0]; +}; + +struct trace_event_raw_mptcp_dump_mpext { + struct trace_entry ent; + u64 data_ack; + u64 data_seq; + u32 subflow_seq; + u16 data_len; + u16 csum; + u8 use_map; + u8 dsn64; + u8 data_fin; + u8 use_ack; + u8 ack64; + u8 mpc_map; + u8 frozen; + u8 reset_transient; + u8 reset_reason; + u8 csum_reqd; + u8 infinite_map; + char __data[0]; +}; + +struct trace_event_raw_ack_update_msk { + struct trace_entry ent; + u64 data_ack; + u64 old_snd_una; + u64 new_snd_una; + u64 new_wnd_end; + u64 msk_wnd_end; + char __data[0]; +}; + +struct trace_event_raw_subflow_check_data_avail { + struct trace_entry ent; + u8 status; + const void *skb; + char __data[0]; +}; + +struct trace_event_data_offsets_mptcp_subflow_get_send {}; + +struct trace_event_data_offsets_mptcp_dump_mpext {}; + +struct trace_event_data_offsets_ack_update_msk {}; + +struct trace_event_data_offsets_subflow_check_data_avail {}; + +typedef void (*btf_trace_mptcp_subflow_get_send)(void *, struct mptcp_subflow_context *); + +typedef void (*btf_trace_mptcp_sendmsg_frag)(void *, struct mptcp_ext *); + +typedef void (*btf_trace_get_mapping_status)(void *, struct mptcp_ext *); + +typedef void (*btf_trace_ack_update_msk)(void *, u64, u64, u64, u64, u64); + +typedef void (*btf_trace_subflow_check_data_avail)(void *, __u8, struct sk_buff *); + +enum { + MPTCP_CMSG_TS = 1, + MPTCP_CMSG_INQ = 2, +}; + +struct mptcp_sendmsg_info { + int mss_now; + int size_goal; + u16 limit; + u16 sent; + unsigned int flags; + bool data_lock_held; +}; + +struct subflow_send_info { + struct sock *ssk; + u64 linger_time; +}; + +struct irq_devres { + unsigned int irq; + void *dev_id; +}; + +struct irq_desc_devres { + unsigned int from; + unsigned int cnt; +}; + +enum bpf_stack_build_id_status { + BPF_STACK_BUILD_ID_EMPTY = 0, + BPF_STACK_BUILD_ID_VALID = 1, + BPF_STACK_BUILD_ID_IP = 2, +}; + +struct bpf_stack_build_id { + __s32 status; + unsigned char build_id[20]; + union { + __u64 offset; + __u64 ip; + }; +}; + +enum { + BPF_F_SKIP_FIELD_MASK = 255, + BPF_F_USER_STACK = 256, + BPF_F_FAST_STACK_CMP = 512, + BPF_F_REUSE_STACKID = 1024, + BPF_F_USER_BUILD_ID = 2048, +}; + +enum perf_callchain_context { + PERF_CONTEXT_HV = 18446744073709551584ULL, + PERF_CONTEXT_KERNEL = 18446744073709551488ULL, + PERF_CONTEXT_USER = 18446744073709551104ULL, + PERF_CONTEXT_GUEST = 18446744073709549568ULL, + PERF_CONTEXT_GUEST_KERNEL = 18446744073709549440ULL, + PERF_CONTEXT_GUEST_USER = 18446744073709549056ULL, + PERF_CONTEXT_MAX = 18446744073709547521ULL, +}; + +struct stack_map_bucket { + struct pcpu_freelist_node fnode; + u32 hash; + u32 nr; + u64 data[0]; +}; + +struct bpf_stack_map { + struct bpf_map map; + void *elems; + struct pcpu_freelist freelist; + u32 n_buckets; + struct stack_map_bucket *buckets[0]; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +typedef u64 (*btf_bpf_get_stackid)(struct pt_regs *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stackid_pe)(struct bpf_perf_event_data_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_get_stack)(struct pt_regs *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_task_stack)(struct task_struct *, void *, u32, u64); + +typedef u64 (*btf_bpf_get_stack_pe)(struct bpf_perf_event_data_kern *, void *, u32, u64); + +struct d_partition___2 { + __le32 p_res; + u8 p_fstype; + u8 p_res2[3]; + __le32 p_offset; + __le32 p_size; +}; + +struct disklabel___2 { + u8 d_reserved[270]; + struct d_partition___2 d_partitions[2]; + u8 d_blank[208]; + __le16 d_magic; +} __attribute__((packed)); + +struct xz_dec_bcj { + enum { + BCJ_X86 = 4, + BCJ_POWERPC = 5, + BCJ_IA64 = 6, + BCJ_ARM = 7, + BCJ_ARMTHUMB = 8, + BCJ_SPARC = 9, + } type; + enum xz_ret ret; + bool single_call; + uint32_t pos; + uint32_t x86_prev_mask; + uint8_t *out; + size_t out_pos; + size_t out_size; + struct { + size_t filtered; + size_t size; + uint8_t buf[16]; + } temp; +}; + +struct acpi_irq_parse_one_ctx { + int rc; + unsigned int index; + long unsigned int *res_flags; + struct irq_fwspec *fwspec; +}; + +struct cpufreq_policy_data { + struct cpufreq_cpuinfo cpuinfo; + struct cpufreq_frequency_table *freq_table; + unsigned int cpu; + unsigned int min; + unsigned int max; +}; + +struct cpufreq_freqs { + struct cpufreq_policy *policy; + unsigned int old; + unsigned int new; + u8 flags; +}; + +struct cpufreq_driver { + char name[16]; + u16 flags; + void *driver_data; + int (*init)(struct cpufreq_policy *); + int (*verify)(struct cpufreq_policy_data *); + int (*setpolicy)(struct cpufreq_policy *); + int (*target)(struct cpufreq_policy *, unsigned int, unsigned int); + int (*target_index)(struct cpufreq_policy *, unsigned int); + unsigned int (*fast_switch)(struct cpufreq_policy *, unsigned int); + void (*adjust_perf)(unsigned int, long unsigned int, long unsigned int, long unsigned int); + unsigned int (*get_intermediate)(struct cpufreq_policy *, unsigned int); + int (*target_intermediate)(struct cpufreq_policy *, unsigned int); + unsigned int (*get)(unsigned int); + void (*update_limits)(unsigned int); + int (*bios_limit)(int, unsigned int *); + int (*online)(struct cpufreq_policy *); + int (*offline)(struct cpufreq_policy *); + int (*exit)(struct cpufreq_policy *); + int (*suspend)(struct cpufreq_policy *); + int (*resume)(struct cpufreq_policy *); + void (*ready)(struct cpufreq_policy *); + struct freq_attr **attr; + bool boost_enabled; + int (*set_boost)(struct cpufreq_policy *, int); + void (*register_em)(struct cpufreq_policy *); +}; + +struct fib6_gc_args { + int timeout; + int more; +}; + +enum fib6_walk_state { + FWS_S = 0, + FWS_L = 1, + FWS_R = 2, + FWS_C = 3, + FWS_U = 4, +}; + +struct fib6_walker { + struct list_head lh; + struct fib6_node *root; + struct fib6_node *node; + struct fib6_info *leaf; + enum fib6_walk_state state; + unsigned int skip; + unsigned int count; + unsigned int skip_in_node; + int (*func)(struct fib6_walker *); + void *args; +}; + +struct ipv6_route_iter { + struct seq_net_private p; + struct fib6_walker w; + loff_t skip; + struct fib6_table *tbl; + int sernum; +}; + +struct bpf_iter__ipv6_route { + union { + struct bpf_iter_meta *meta; + }; + union { + struct fib6_info *rt; + }; +}; + +struct rt6_rtnl_dump_arg { + struct sk_buff *skb; + struct netlink_callback *cb; + struct net *net; + struct fib_dump_filter filter; +}; + +struct fib6_cleaner { + struct fib6_walker w; + struct net *net; + int (*func)(struct fib6_info *, void *); + int sernum; + void *arg; + bool skip_notify; +}; + +enum { + FIB6_NO_SERNUM_CHANGE = 0, +}; + +struct fib6_dump_arg { + struct net *net; + struct notifier_block *nb; + struct netlink_ext_ack *extack; +}; + +struct fib6_nh_pcpu_arg { + struct fib6_info *from; + const struct fib6_table *table; +}; + +struct lookup_args { + int offset; + const struct in6_addr *addr; +}; + +enum lruvec_flags { + LRUVEC_CONGESTED = 0, +}; + +enum pgdat_flags { + PGDAT_DIRTY = 0, + PGDAT_WRITEBACK = 1, + PGDAT_RECLAIM_LOCKED = 2, +}; + +struct reclaim_stat { + unsigned int nr_dirty; + unsigned int nr_unqueued_dirty; + unsigned int nr_congested; + unsigned int nr_writeback; + unsigned int nr_immediate; + unsigned int nr_pageout; + unsigned int nr_activate[2]; + unsigned int nr_ref_keep; + unsigned int nr_unmap_fail; + unsigned int nr_lazyfree_fail; +}; + +struct trace_event_raw_mm_vmscan_kswapd_sleep { + struct trace_entry ent; + int nid; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_kswapd_wake { + struct trace_entry ent; + int nid; + int zid; + int order; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_wakeup_kswapd { + struct trace_entry ent; + int nid; + int zid; + int order; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_begin_template { + struct trace_entry ent; + int order; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_direct_reclaim_end_template { + struct trace_entry ent; + long unsigned int nr_reclaimed; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_start { + struct trace_entry ent; + struct shrinker *shr; + void *shrink; + int nid; + long int nr_objects_to_shrink; + long unsigned int gfp_flags; + long unsigned int cache_items; + long long unsigned int delta; + long unsigned int total_scan; + int priority; + char __data[0]; +}; + +struct trace_event_raw_mm_shrink_slab_end { + struct trace_entry ent; + struct shrinker *shr; + int nid; + void *shrink; + long int unused_scan; + long int new_scan; + int retval; + long int total_scan; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_isolate { + struct trace_entry ent; + int highest_zoneidx; + int order; + long unsigned int nr_requested; + long unsigned int nr_scanned; + long unsigned int nr_skipped; + long unsigned int nr_taken; + unsigned int isolate_mode; + int lru; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_write_folio { + struct trace_entry ent; + long unsigned int pfn; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_inactive { + struct trace_entry ent; + int nid; + long unsigned int nr_scanned; + long unsigned int nr_reclaimed; + long unsigned int nr_dirty; + long unsigned int nr_writeback; + long unsigned int nr_congested; + long unsigned int nr_immediate; + unsigned int nr_activate0; + unsigned int nr_activate1; + long unsigned int nr_ref_keep; + long unsigned int nr_unmap_fail; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_lru_shrink_active { + struct trace_entry ent; + int nid; + long unsigned int nr_taken; + long unsigned int nr_active; + long unsigned int nr_deactivated; + long unsigned int nr_referenced; + int priority; + int reclaim_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_node_reclaim_begin { + struct trace_entry ent; + int nid; + int order; + long unsigned int gfp_flags; + char __data[0]; +}; + +struct trace_event_raw_mm_vmscan_throttled { + struct trace_entry ent; + int nid; + int usec_timeout; + int usec_delayed; + int reason; + char __data[0]; +}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_sleep {}; + +struct trace_event_data_offsets_mm_vmscan_kswapd_wake {}; + +struct trace_event_data_offsets_mm_vmscan_wakeup_kswapd {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_begin_template {}; + +struct trace_event_data_offsets_mm_vmscan_direct_reclaim_end_template {}; + +struct trace_event_data_offsets_mm_shrink_slab_start {}; + +struct trace_event_data_offsets_mm_shrink_slab_end {}; + +struct trace_event_data_offsets_mm_vmscan_lru_isolate {}; + +struct trace_event_data_offsets_mm_vmscan_write_folio {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_inactive {}; + +struct trace_event_data_offsets_mm_vmscan_lru_shrink_active {}; + +struct trace_event_data_offsets_mm_vmscan_node_reclaim_begin {}; + +struct trace_event_data_offsets_mm_vmscan_throttled {}; + +typedef void (*btf_trace_mm_vmscan_kswapd_sleep)(void *, int); + +typedef void (*btf_trace_mm_vmscan_kswapd_wake)(void *, int, int, int); + +typedef void (*btf_trace_mm_vmscan_wakeup_kswapd)(void *, int, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_begin)(void *, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_direct_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_memcg_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_shrink_slab_start)(void *, struct shrinker *, struct shrink_control *, long int, long unsigned int, long long unsigned int, long unsigned int, int); + +typedef void (*btf_trace_mm_shrink_slab_end)(void *, struct shrinker *, int, int, long int, long int, long int); + +typedef void (*btf_trace_mm_vmscan_lru_isolate)(void *, int, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, isolate_mode_t, int); + +typedef void (*btf_trace_mm_vmscan_write_folio)(void *, struct folio *); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_inactive)(void *, int, long unsigned int, long unsigned int, struct reclaim_stat *, int, int); + +typedef void (*btf_trace_mm_vmscan_lru_shrink_active)(void *, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int, int); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_begin)(void *, int, int, gfp_t); + +typedef void (*btf_trace_mm_vmscan_node_reclaim_end)(void *, long unsigned int); + +typedef void (*btf_trace_mm_vmscan_throttled)(void *, int, int, int, int); + +struct scan_control { + long unsigned int nr_to_reclaim; + nodemask_t *nodemask; + struct mem_cgroup *target_mem_cgroup; + long unsigned int anon_cost; + long unsigned int file_cost; + unsigned int may_deactivate: 2; + unsigned int force_deactivate: 1; + unsigned int skipped_deactivate: 1; + unsigned int may_writepage: 1; + unsigned int may_unmap: 1; + unsigned int may_swap: 1; + unsigned int proactive: 1; + unsigned int memcg_low_reclaim: 1; + unsigned int memcg_low_skipped: 1; + unsigned int hibernation_mode: 1; + unsigned int compaction_ready: 1; + unsigned int cache_trim_mode: 1; + unsigned int file_is_tiny: 1; + unsigned int no_demotion: 1; + s8 order; + s8 priority; + s8 reclaim_idx; + gfp_t gfp_mask; + long unsigned int nr_scanned; + long unsigned int nr_reclaimed; + struct { + unsigned int dirty; + unsigned int unqueued_dirty; + unsigned int congested; + unsigned int writeback; + unsigned int immediate; + unsigned int file_taken; + unsigned int taken; + } nr; + struct reclaim_state reclaim_state; +}; + +typedef enum { + PAGE_KEEP = 0, + PAGE_ACTIVATE = 1, + PAGE_SUCCESS = 2, + PAGE_CLEAN = 3, +} pageout_t; + +enum folio_references { + FOLIOREF_RECLAIM = 0, + FOLIOREF_RECLAIM_CLEAN = 1, + FOLIOREF_KEEP = 2, + FOLIOREF_ACTIVATE = 3, +}; + +enum scan_balance { + SCAN_EQUAL = 0, + SCAN_FRACT = 1, + SCAN_ANON = 2, + SCAN_FILE = 3, +}; + +struct latency_bucket { + long unsigned int total_latency; + int samples; +}; + +struct avg_latency_bucket { + long unsigned int latency; + bool valid; +}; + +struct throtl_data { + struct throtl_service_queue service_queue; + struct request_queue *queue; + unsigned int nr_queued[2]; + unsigned int throtl_slice; + struct work_struct dispatch_work; + unsigned int limit_index; + bool limit_valid[2]; + long unsigned int low_upgrade_time; + long unsigned int low_downgrade_time; + unsigned int scale; + struct latency_bucket tmp_buckets[18]; + struct avg_latency_bucket avg_buckets[18]; + struct latency_bucket *latency_buckets[2]; + long unsigned int last_calculate_time; + long unsigned int filtered_latency; + bool track_bio_latency; +}; + +enum tg_state_flags { + THROTL_TG_PENDING = 1, + THROTL_TG_WAS_EMPTY = 2, + THROTL_TG_CANCELING = 4, +}; + +struct strarray { + char **array; + size_t n; +}; + +struct pci_domain_busn_res { + struct list_head list; + struct resource res; + int domain_nr; +}; + +struct unimapdesc { + short unsigned int entry_ct; + struct unipair *entries; +}; + +struct vt_stat { + short unsigned int v_active; + short unsigned int v_signal; + short unsigned int v_state; +}; + +struct vt_sizes { + short unsigned int v_rows; + short unsigned int v_cols; + short unsigned int v_scrollsize; +}; + +struct vt_consize { + short unsigned int v_rows; + short unsigned int v_cols; + short unsigned int v_vlin; + short unsigned int v_clin; + short unsigned int v_vcol; + short unsigned int v_ccol; +}; + +struct vt_event { + unsigned int event; + unsigned int oldev; + unsigned int newev; + unsigned int pad[4]; +}; + +struct vt_setactivate { + unsigned int console; + struct vt_mode mode; +}; + +struct vt_event_wait { + struct list_head list; + struct vt_event event; + int done; +}; + +struct tunnel_msg { + __u8 family; + __u8 flags; + __u16 reserved2; + __u32 ifindex; +}; + +enum { + VNIFILTER_ENTRY_STATS_UNSPEC = 0, + VNIFILTER_ENTRY_STATS_RX_BYTES = 1, + VNIFILTER_ENTRY_STATS_RX_PKTS = 2, + VNIFILTER_ENTRY_STATS_RX_DROPS = 3, + VNIFILTER_ENTRY_STATS_RX_ERRORS = 4, + VNIFILTER_ENTRY_STATS_TX_BYTES = 5, + VNIFILTER_ENTRY_STATS_TX_PKTS = 6, + VNIFILTER_ENTRY_STATS_TX_DROPS = 7, + VNIFILTER_ENTRY_STATS_TX_ERRORS = 8, + VNIFILTER_ENTRY_STATS_PAD = 9, + __VNIFILTER_ENTRY_STATS_MAX = 10, +}; + +enum { + VXLAN_VNIFILTER_ENTRY_UNSPEC = 0, + VXLAN_VNIFILTER_ENTRY_START = 1, + VXLAN_VNIFILTER_ENTRY_END = 2, + VXLAN_VNIFILTER_ENTRY_GROUP = 3, + VXLAN_VNIFILTER_ENTRY_GROUP6 = 4, + VXLAN_VNIFILTER_ENTRY_STATS = 5, + __VXLAN_VNIFILTER_ENTRY_MAX = 6, +}; + +enum { + VXLAN_VNIFILTER_UNSPEC = 0, + VXLAN_VNIFILTER_ENTRY = 1, + __VXLAN_VNIFILTER_MAX = 2, +}; + +struct nf_conntrack_nat_helper { + struct list_head list; + char mod_name[16]; + struct module *module; +}; + +struct errormap { + char *name; + int val; + int namelen; + struct hlist_node list; +}; + +struct p9_fd_opts { + int rfd; + int wfd; + u16 port; + bool privport; +}; + +enum { + Opt_port = 0, + Opt_rfdno = 1, + Opt_wfdno = 2, + Opt_err___8 = 3, + Opt_privport = 4, +}; + +enum { + Rworksched = 1, + Rpending = 2, + Wworksched = 4, + Wpending = 8, +}; + +struct p9_conn; + +struct p9_poll_wait { + struct p9_conn *conn; + wait_queue_entry_t wait; + wait_queue_head_t *wait_addr; +}; + +struct p9_conn { + struct list_head mux_list; + struct p9_client *client; + int err; + spinlock_t req_lock; + struct list_head req_list; + struct list_head unsent_req_list; + struct p9_req_t *rreq; + struct p9_req_t *wreq; + char tmp_buf[7]; + struct p9_fcall rc; + int wpos; + int wsize; + char *wbuf; + struct list_head poll_pending_link; + struct p9_poll_wait poll_wait[2]; + poll_table pt; + struct work_struct rq; + struct work_struct wq; + long unsigned int wsched; +}; + +struct p9_trans_fd { + struct file *rd; + struct file *wr; + struct p9_conn conn; +}; + +struct die_args { + struct pt_regs *regs; + const char *str; + long int err; + int trapnr; + int signr; +}; + +struct module_sect_attr { + struct bin_attribute battr; + long unsigned int address; +}; + +struct module_sect_attrs { + struct attribute_group grp; + unsigned int nsections; + struct module_sect_attr attrs[0]; +}; + +struct module_notes_attrs { + struct kobject *dir; + unsigned int notes; + struct bin_attribute attrs[0]; +}; + +struct bpf_iter__cgroup { + union { + struct bpf_iter_meta *meta; + }; + union { + struct cgroup *cgroup; + }; +}; + +struct cgroup_iter_priv { + struct cgroup_subsys_state *start_css; + bool visited_all; + bool terminate; + int order; +}; + +struct splice_desc { + size_t total_len; + unsigned int len; + unsigned int flags; + union { + void *userptr; + struct file *file; + void *data; + } u; + loff_t pos; + loff_t *opos; + size_t num_spliced; + bool need_wakeup; +}; + +typedef int splice_actor(struct pipe_inode_info *, struct pipe_buffer *, struct splice_desc *); + +typedef int splice_direct_actor(struct pipe_inode_info *, struct splice_desc *); + +struct tracefs_dir_ops { + int (*mkdir)(const char *); + int (*rmdir)(const char *); +}; + +struct tracefs_mount_opts { + kuid_t uid; + kgid_t gid; + umode_t mode; + unsigned int opts; +}; + +struct tracefs_fs_info { + struct tracefs_mount_opts mount_opts; +}; + +struct broken_edid { + u8 manufacturer[4]; + u32 model; + u32 fix; +}; + +struct __fb_timings { + u32 dclk; + u32 hfreq; + u32 vfreq; + u32 hactive; + u32 vactive; + u32 hblank; + u32 vblank; + u32 htotal; + u32 vtotal; +}; + +enum { + ACPI_BUTTON_LID_INIT_IGNORE = 0, + ACPI_BUTTON_LID_INIT_OPEN = 1, + ACPI_BUTTON_LID_INIT_METHOD = 2, + ACPI_BUTTON_LID_INIT_DISABLED = 3, +}; + +struct acpi_button { + unsigned int type; + struct input_dev *input; + char phys[32]; + long unsigned int pushed; + int last_state; + ktime_t last_time; + bool suspended; + bool lid_state_initialized; +}; + +enum { + VMGENID_SIZE = 16, +}; + +struct vmgenid_state { + u8 *next_id; + u8 this_id[16]; +}; + +struct irqchip_fwid { + struct fwnode_handle fwnode; + unsigned int type; + char *name; + phys_addr_t *pa; +}; + +struct bpf_offload_dev { + const struct bpf_prog_offload_ops *ops; + struct list_head netdevs; + void *priv; +}; + +struct bpf_offload_netdev { + struct rhash_head l; + struct net_device *netdev; + struct bpf_offload_dev *offdev; + struct list_head progs; + struct list_head maps; + struct list_head offdev_netdevs; +}; + +struct ns_get_path_bpf_prog_args { + struct bpf_prog *prog; + struct bpf_prog_info *info; +}; + +struct ns_get_path_bpf_map_args { + struct bpf_offloaded_map *offmap; + struct bpf_map_info *info; +}; + +struct input_mask { + __u32 type; + __u32 codes_size; + __u64 codes_ptr; +}; + +struct evdev_client; + +struct evdev { + int open; + struct input_handle handle; + struct evdev_client *grab; + struct list_head client_list; + spinlock_t client_lock; + struct mutex mutex; + struct device dev; + struct cdev cdev; + bool exist; +}; + +struct evdev_client { + unsigned int head; + unsigned int tail; + unsigned int packet_head; + spinlock_t buffer_lock; + wait_queue_head_t wait; + struct fasync_struct *fasync; + struct evdev *evdev; + struct list_head node; + enum input_clock_type clk_type; + bool revoked; + long unsigned int *evmasks[32]; + unsigned int bufsize; + struct input_event buffer[0]; +}; + +struct of_bus___2 { + void (*count_cells)(const void *, int, int *, int *); + u64 (*map)(__be32 *, const __be32 *, int, int, int); + int (*translate)(__be32 *, u64, int); +}; + +struct sch_frag_data { + long unsigned int dst; + struct qdisc_skb_cb cb; + __be16 inner_protocol; + u16 vlan_tci; + __be16 vlan_proto; + unsigned int l2_len; + u8 l2_data[18]; + int (*xmit)(struct sk_buff *); +}; + +enum cpio_fields { + C_MAGIC = 0, + C_INO = 1, + C_MODE = 2, + C_UID = 3, + C_GID = 4, + C_NLINK = 5, + C_MTIME = 6, + C_FILESIZE = 7, + C_MAJ = 8, + C_MIN = 9, + C_RMAJ = 10, + C_RMIN = 11, + C_NAMESIZE = 12, + C_CHKSUM = 13, + C_NFIELDS = 14, +}; + +enum what { + PROC_EVENT_NONE = 0, + PROC_EVENT_FORK = 1, + PROC_EVENT_EXEC = 2, + PROC_EVENT_UID = 4, + PROC_EVENT_GID = 64, + PROC_EVENT_SID = 128, + PROC_EVENT_PTRACE = 256, + PROC_EVENT_COMM = 512, + PROC_EVENT_COREDUMP = 1073741824, + PROC_EVENT_EXIT = 2147483648, +}; + +typedef u64 (*btf_bpf_task_storage_get_recur)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_task_storage_get)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_task_storage_delete_recur)(struct bpf_map *, struct task_struct *); + +typedef u64 (*btf_bpf_task_storage_delete)(struct bpf_map *, struct task_struct *); + +struct user_arg_ptr { + union { + const char * const *native; + } ptr; +}; + +struct netport_security_struct { + u32 sid; + u16 port; + u8 protocol; +}; + +struct sel_netport_bkt { + int size; + struct list_head list; +}; + +struct sel_netport { + struct netport_security_struct psec; + struct list_head list; + struct callback_head rcu; +}; + +struct cpuidle_state_kobj { + struct cpuidle_state *state; + struct cpuidle_state_usage *state_usage; + struct completion kobj_unregister; + struct kobject kobj; + struct cpuidle_device *device; +}; + +struct cpuidle_device_kobj { + struct cpuidle_device *dev; + struct completion kobj_unregister; + struct kobject kobj; +}; + +struct cpuidle_attr { + struct attribute attr; + ssize_t (*show)(struct cpuidle_device *, char *); + ssize_t (*store)(struct cpuidle_device *, const char *, size_t); +}; + +struct cpuidle_state_attr { + struct attribute attr; + ssize_t (*show)(struct cpuidle_state *, struct cpuidle_state_usage *, char *); + ssize_t (*store)(struct cpuidle_state *, struct cpuidle_state_usage *, const char *, size_t); +}; + +typedef unsigned int t_key; + +struct key_vector { + t_key key; + unsigned char pos; + unsigned char bits; + unsigned char slen; + union { + struct hlist_head leaf; + struct { + struct { } __empty_tnode; + struct key_vector *tnode[0]; + }; + }; +}; + +struct tnode { + struct callback_head rcu; + t_key empty_children; + t_key full_children; + struct key_vector *parent; + struct key_vector kv[1]; +}; + +struct trie_stat { + unsigned int totdepth; + unsigned int maxdepth; + unsigned int tnodes; + unsigned int leaves; + unsigned int nullpointers; + unsigned int prefixes; + unsigned int nodesizes[32]; +}; + +struct trie { + struct key_vector kv[1]; +}; + +struct fib_trie_iter { + struct seq_net_private p; + struct fib_table *tb; + struct key_vector *tnode; + unsigned int index; + unsigned int depth; +}; + +struct fib_route_iter { + struct seq_net_private p; + struct fib_table *main_tb; + struct key_vector *tnode; + loff_t pos; + t_key key; +}; + +struct rt6_exception { + struct hlist_node hlist; + struct rt6_info *rt6i; + long unsigned int stamp; + struct callback_head rcu; +}; + +struct netevent_redirect { + struct dst_entry *old; + struct dst_entry *new; + struct neighbour *neigh; + const void *daddr; +}; + +struct trace_event_raw_fib6_table_lookup { + struct trace_entry ent; + u32 tb_id; + int err; + int oif; + int iif; + __u8 tos; + __u8 scope; + __u8 flags; + __u8 src[16]; + __u8 dst[16]; + u16 sport; + u16 dport; + u8 proto; + u8 rt_type; + char name[16]; + __u8 gw[16]; + char __data[0]; +}; + +struct trace_event_data_offsets_fib6_table_lookup {}; + +typedef void (*btf_trace_fib6_table_lookup)(void *, const struct net *, const struct fib6_result *, struct fib6_table *, const struct flowi6 *); + +enum rt6_nud_state { + RT6_NUD_FAIL_HARD = -3, + RT6_NUD_FAIL_PROBE = -2, + RT6_NUD_FAIL_DO_RR = -1, + RT6_NUD_SUCCEED = 1, +}; + +struct fib6_nh_dm_arg { + struct net *net; + const struct in6_addr *saddr; + int oif; + int flags; + struct fib6_nh *nh; +}; + +struct __rt6_probe_work { + struct work_struct work; + struct in6_addr target; + struct net_device *dev; + netdevice_tracker dev_tracker; +}; + +struct fib6_nh_frl_arg { + u32 flags; + int oif; + int strict; + int *mpri; + bool *do_rr; + struct fib6_nh *nh; +}; + +struct fib6_nh_excptn_arg { + struct rt6_info *rt; + int plen; +}; + +struct fib6_nh_match_arg { + const struct net_device *dev; + const struct in6_addr *gw; + struct fib6_nh *match; +}; + +struct fib6_nh_age_excptn_arg { + struct fib6_gc_args *gc_args; + long unsigned int now; +}; + +struct fib6_nh_rd_arg { + struct fib6_result *res; + struct flowi6 *fl6; + const struct in6_addr *gw; + struct rt6_info **ret; +}; + +struct ip6rd_flowi { + struct flowi6 fl6; + struct in6_addr gateway; +}; + +struct fib6_nh_del_cached_rt_arg { + struct fib6_config *cfg; + struct fib6_info *f6i; +}; + +struct arg_dev_net_ip { + struct net_device *dev; + struct net *net; + struct in6_addr *addr; +}; + +struct arg_netdev_event { + const struct net_device *dev; + union { + unsigned char nh_flags; + long unsigned int event; + }; +}; + +struct rt6_mtu_change_arg { + struct net_device *dev; + unsigned int mtu; + struct fib6_info *f6i; +}; + +struct rt6_nh { + struct fib6_info *fib6_info; + struct fib6_config r_cfg; + struct list_head next; +}; + +struct fib6_nh_exception_dump_walker { + struct rt6_rtnl_dump_arg *dump; + struct fib6_info *rt; + unsigned int flags; + unsigned int skip; + unsigned int count; +}; + +enum reboot_type { + BOOT_TRIPLE = 116, + BOOT_KBD = 107, + BOOT_BIOS = 98, + BOOT_ACPI = 97, + BOOT_EFI = 101, + BOOT_CF9_FORCE = 112, + BOOT_CF9_SAFE = 113, +}; + +struct sys_off_handler { + struct notifier_block nb; + int (*sys_off_cb)(struct sys_off_data *); + void *cb_data; + enum sys_off_mode mode; + bool blocking; + void *list; +}; + +struct shmem_sb_info { + long unsigned int max_blocks; + struct percpu_counter used_blocks; + long unsigned int max_inodes; + long unsigned int free_inodes; + raw_spinlock_t stat_lock; + umode_t mode; + unsigned char huge; + kuid_t uid; + kgid_t gid; + bool full_inums; + ino_t next_ino; + ino_t *ino_batch; + struct mempolicy *mpol; + spinlock_t shrinklist_lock; + struct list_head shrinklist; + long unsigned int shrinklist_len; +}; + +struct shmem_falloc { + wait_queue_head_t *waitq; + long unsigned int start; + long unsigned int next; + long unsigned int nr_falloced; + long unsigned int nr_unswapped; +}; + +struct shmem_options { + long long unsigned int blocks; + long long unsigned int inodes; + struct mempolicy *mpol; + kuid_t uid; + kgid_t gid; + umode_t mode; + bool full_inums; + int huge; + int seen; +}; + +enum shmem_param { + Opt_gid___5 = 0, + Opt_huge = 1, + Opt_mode___5 = 2, + Opt_mpol = 3, + Opt_nr_blocks = 4, + Opt_nr_inodes___2 = 5, + Opt_size___2 = 6, + Opt_uid___4 = 7, + Opt_inode32 = 8, + Opt_inode64 = 9, +}; + +enum blacklist_hash_type { + BLACKLIST_HASH_X509_TBS = 1, + BLACKLIST_HASH_BINARY = 2, +}; + +enum { + IORING_MSG_DATA = 0, + IORING_MSG_SEND_FD = 1, +}; + +struct io_msg { + struct file *file; + struct file *src_file; + struct callback_head tw; + u64 user_data; + u32 len; + u32 cmd; + u32 src_fd; + u32 dst_fd; + u32 flags; +}; + +struct acpi_pci_device { + acpi_handle device; + struct acpi_pci_device *next; +}; + +struct sysrq_state { + struct input_handle handle; + struct work_struct reinject_work; + long unsigned int key_down[12]; + unsigned int alt; + unsigned int alt_use; + unsigned int shift; + unsigned int shift_use; + bool active; + bool need_reinject; + bool reinjecting; + bool reset_canceled; + bool reset_requested; + long unsigned int reset_keybit[12]; + int reset_seq_len; + int reset_seq_cnt; + int reset_seq_version; + struct timer_list keyreset_timer; +}; + +struct tc_prio_qopt { + int bands; + __u8 priomap[16]; +}; + +struct skb_array { + struct ptr_ring ring; +}; + +struct psched_ratecfg { + u64 rate_bytes_ps; + u32 mult; + u16 overhead; + u16 mpu; + u8 linklayer; + u8 shift; +}; + +struct psched_pktrate { + u64 rate_pkts_ps; + u32 mult; + u8 shift; +}; + +struct pfifo_fast_priv { + struct skb_array q[3]; +}; + +struct syscall_trace_enter { + struct trace_entry ent; + int nr; + long unsigned int args[0]; +}; + +struct syscall_trace_exit { + struct trace_entry ent; + int nr; + long int ret; +}; + +struct syscall_tp_t { + long long unsigned int regs; + long unsigned int syscall_nr; + long unsigned int ret; +}; + +struct syscall_tp_t___2 { + long long unsigned int regs; + long unsigned int syscall_nr; + long unsigned int args[6]; +}; + +enum resctrl_conf_type { + CDP_NONE = 0, + CDP_CODE = 1, + CDP_DATA = 2, +}; + +struct pid_entry { + const char *name; + unsigned int len; + umode_t mode; + const struct inode_operations *iop; + const struct file_operations *fop; + union proc_op op; +}; + +struct limit_names { + const char *name; + const char *unit; +}; + +struct map_files_info { + long unsigned int start; + long unsigned int end; + fmode_t mode; +}; + +struct tgid_iter { + unsigned int tgid; + struct task_struct *task; +}; + +struct io_rename { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +struct io_unlink { + struct file *file; + int dfd; + int flags; + struct filename *filename; +}; + +struct io_mkdir { + struct file *file; + int dfd; + umode_t mode; + struct filename *filename; +}; + +struct io_link { + struct file *file; + int old_dfd; + int new_dfd; + struct filename *oldpath; + struct filename *newpath; + int flags; +}; + +struct acpi_ged_device { + struct device *dev; + struct list_head event_list; +}; + +struct acpi_ged_event { + struct list_head node; + struct device *dev; + unsigned int gsi; + unsigned int irq; + acpi_handle handle; +}; + +struct acpi_namestring_info { + const char *external_name; + const char *next_external_char; + char *internal_name; + u32 length; + u32 num_segments; + u32 num_carats; + u8 fully_qualified; +}; + +struct virtio_crypto_sym_session_info { + __u64 session_id; +}; + +struct virtio_crypto_skcipher_ctx { + struct crypto_engine_ctx enginectx; + struct virtio_crypto *vcrypto; + struct crypto_skcipher *tfm; + struct virtio_crypto_sym_session_info enc_sess_info; + struct virtio_crypto_sym_session_info dec_sess_info; +}; + +struct virtio_crypto_sym_request { + struct virtio_crypto_request base; + uint32_t type; + struct virtio_crypto_skcipher_ctx *skcipher_ctx; + struct skcipher_request *skcipher_req; + uint8_t *iv; + bool encrypt; +}; + +struct virtio_crypto_algo { + uint32_t algonum; + uint32_t service; + unsigned int active_devs; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct skcipher_alg algo; +}; + +enum ethtool_podl_pse_admin_state { + ETHTOOL_PODL_PSE_ADMIN_STATE_UNKNOWN = 1, + ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED = 2, + ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED = 3, +}; + +enum ethtool_podl_pse_pw_d_status { + ETHTOOL_PODL_PSE_PW_D_STATUS_UNKNOWN = 1, + ETHTOOL_PODL_PSE_PW_D_STATUS_DISABLED = 2, + ETHTOOL_PODL_PSE_PW_D_STATUS_SEARCHING = 3, + ETHTOOL_PODL_PSE_PW_D_STATUS_DELIVERING = 4, + ETHTOOL_PODL_PSE_PW_D_STATUS_SLEEP = 5, + ETHTOOL_PODL_PSE_PW_D_STATUS_IDLE = 6, + ETHTOOL_PODL_PSE_PW_D_STATUS_ERROR = 7, +}; + +struct pse_control_config { + enum ethtool_podl_pse_admin_state admin_cotrol; +}; + +struct pse_control_status { + enum ethtool_podl_pse_admin_state podl_admin_state; + enum ethtool_podl_pse_pw_d_status podl_pw_status; +}; + +struct pse_reply_data { + struct ethnl_reply_data base; + struct pse_control_status status; +}; + +struct async_entry { + struct list_head domain_list; + struct list_head global_list; + struct work_struct work; + async_cookie_t cookie; + async_func_t func; + void *data; + struct async_domain *domain; +}; + +struct bpf_timer { + long: 64; + long: 64; +}; + +struct bpf_dynptr { + long: 64; + long: 64; +}; + +struct bpf_list_head { + long: 64; + long: 64; +}; + +struct bpf_list_node { + long: 64; + long: 64; +}; + +struct bpf_pidns_info { + __u32 pid; + __u32 tgid; +}; + +typedef u64 (*btf_bpf_map_lookup_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_update_elem)(struct bpf_map *, void *, void *, u64); + +typedef u64 (*btf_bpf_map_delete_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_push_elem)(struct bpf_map *, void *, u64); + +typedef u64 (*btf_bpf_map_pop_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_peek_elem)(struct bpf_map *, void *); + +typedef u64 (*btf_bpf_map_lookup_percpu_elem)(struct bpf_map *, void *, u32); + +typedef u64 (*btf_bpf_get_smp_processor_id)(); + +typedef u64 (*btf_bpf_get_numa_node_id)(); + +typedef u64 (*btf_bpf_ktime_get_ns)(); + +typedef u64 (*btf_bpf_ktime_get_boot_ns)(); + +typedef u64 (*btf_bpf_ktime_get_coarse_ns)(); + +typedef u64 (*btf_bpf_ktime_get_tai_ns)(); + +typedef u64 (*btf_bpf_get_current_pid_tgid)(); + +typedef u64 (*btf_bpf_get_current_uid_gid)(); + +typedef u64 (*btf_bpf_get_current_comm)(char *, u32); + +typedef u64 (*btf_bpf_spin_lock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_spin_unlock)(struct bpf_spin_lock *); + +typedef u64 (*btf_bpf_jiffies64)(); + +typedef u64 (*btf_bpf_get_current_cgroup_id)(); + +typedef u64 (*btf_bpf_get_current_ancestor_cgroup_id)(int); + +typedef u64 (*btf_bpf_strtol)(const char *, size_t, u64, long int *); + +typedef u64 (*btf_bpf_strtoul)(const char *, size_t, u64, long unsigned int *); + +typedef u64 (*btf_bpf_strncmp)(const char *, u32, const char *); + +typedef u64 (*btf_bpf_get_ns_current_pid_tgid)(u64, u64, struct bpf_pidns_info *, u32); + +typedef u64 (*btf_bpf_event_output_data)(void *, struct bpf_map *, u64, void *, u64); + +typedef u64 (*btf_bpf_copy_from_user)(void *, u32, const void *); + +typedef u64 (*btf_bpf_copy_from_user_task)(void *, u32, const void *, struct task_struct *, u64); + +typedef u64 (*btf_bpf_per_cpu_ptr)(const void *, u32); + +typedef u64 (*btf_bpf_this_cpu_ptr)(const void *); + +struct bpf_bprintf_buffers { + char tmp_bufs[1536]; +}; + +typedef u64 (*btf_bpf_snprintf)(char *, u32, char *, const void *, u32); + +struct bpf_hrtimer { + struct hrtimer timer; + struct bpf_map *map; + struct bpf_prog *prog; + void *callback_fn; + void *value; +}; + +struct bpf_timer_kern { + struct bpf_hrtimer *timer; + struct bpf_spin_lock lock; +}; + +typedef u64 (*btf_bpf_timer_init)(struct bpf_timer_kern *, struct bpf_map *, u64); + +typedef u64 (*btf_bpf_timer_set_callback)(struct bpf_timer_kern *, void *, struct bpf_prog_aux *); + +typedef u64 (*btf_bpf_timer_start)(struct bpf_timer_kern *, u64, u64); + +typedef u64 (*btf_bpf_timer_cancel)(struct bpf_timer_kern *); + +typedef u64 (*btf_bpf_kptr_xchg)(void *, void *); + +typedef u64 (*btf_bpf_dynptr_from_mem)(void *, u32, u64, struct bpf_dynptr_kern *); + +typedef u64 (*btf_bpf_dynptr_read)(void *, u32, const struct bpf_dynptr_kern *, u32, u64); + +typedef u64 (*btf_bpf_dynptr_write)(const struct bpf_dynptr_kern *, u32, void *, u32, u64); + +typedef u64 (*btf_bpf_dynptr_data)(const struct bpf_dynptr_kern *, u32, u32); + +struct fsl8250_data { + int line; +}; + +enum { + IFLA_GENEVE_UNSPEC = 0, + IFLA_GENEVE_ID = 1, + IFLA_GENEVE_REMOTE = 2, + IFLA_GENEVE_TTL = 3, + IFLA_GENEVE_TOS = 4, + IFLA_GENEVE_PORT = 5, + IFLA_GENEVE_COLLECT_METADATA = 6, + IFLA_GENEVE_REMOTE6 = 7, + IFLA_GENEVE_UDP_CSUM = 8, + IFLA_GENEVE_UDP_ZERO_CSUM6_TX = 9, + IFLA_GENEVE_UDP_ZERO_CSUM6_RX = 10, + IFLA_GENEVE_LABEL = 11, + IFLA_GENEVE_TTL_INHERIT = 12, + IFLA_GENEVE_DF = 13, + IFLA_GENEVE_INNER_PROTO_INHERIT = 14, + __IFLA_GENEVE_MAX = 15, +}; + +enum ifla_geneve_df { + GENEVE_DF_UNSET = 0, + GENEVE_DF_SET = 1, + GENEVE_DF_INHERIT = 2, + __GENEVE_DF_END = 3, + GENEVE_DF_MAX = 2, +}; + +struct genevehdr { + u8 opt_len: 6; + u8 ver: 2; + u8 rsvd1: 6; + u8 critical: 1; + u8 oam: 1; + __be16 proto_type; + u8 vni[3]; + u8 rsvd2; + u8 options[0]; +}; + +struct geneve_net { + struct list_head geneve_list; + struct list_head sock_list; +}; + +struct geneve_dev; + +struct geneve_dev_node { + struct hlist_node hlist; + struct geneve_dev *geneve; +}; + +struct geneve_config { + struct ip_tunnel_info info; + bool collect_md; + bool use_udp6_rx_checksums; + bool ttl_inherit; + enum ifla_geneve_df df; + bool inner_proto_inherit; +}; + +struct geneve_sock; + +struct geneve_dev { + struct geneve_dev_node hlist4; + struct geneve_dev_node hlist6; + struct net *net; + struct net_device *dev; + struct geneve_sock *sock4; + struct geneve_sock *sock6; + struct list_head next; + struct gro_cells gro_cells; + struct geneve_config cfg; +}; + +struct geneve_sock { + bool collect_md; + struct list_head list; + struct socket *sock; + struct callback_head rcu; + int refcnt; + struct hlist_head vni_list[1024]; +}; + +struct igmpv3_grec { + __u8 grec_type; + __u8 grec_auxwords; + __be16 grec_nsrcs; + __be32 grec_mca; + __be32 grec_src[0]; +}; + +struct igmpv3_report { + __u8 type; + __u8 resv1; + __sum16 csum; + __be16 resv2; + __be16 ngrec; + struct igmpv3_grec grec[0]; +}; + +struct igmpv3_query { + __u8 type; + __u8 code; + __sum16 csum; + __be32 group; + __u8 qrv: 3; + __u8 suppress: 1; + __u8 resv: 4; + __u8 qqic; + __be16 nsrcs; + __be32 srcs[0]; +}; + +struct igmp_mc_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *in_dev; +}; + +struct igmp_mcf_iter_state { + struct seq_net_private p; + struct net_device *dev; + struct in_device *idev; + struct ip_mc_list *im; +}; + +struct smpboot_thread_data { + unsigned int cpu; + unsigned int status; + struct smp_hotplug_thread *ht; +}; + +enum { + HP_THREAD_NONE = 0, + HP_THREAD_ACTIVE = 1, + HP_THREAD_PARKED = 2, +}; + +enum rtmutex_chainwalk { + RT_MUTEX_MIN_CHAINWALK = 0, + RT_MUTEX_FULL_CHAINWALK = 1, +}; + +struct pm_vt_switch { + struct list_head head; + struct device *dev; + bool required; +}; + +struct bpf_map_desc { + int map_fd; + __u32 max_entries; + __u64 initial_value; +}; + +struct bpf_prog_desc { + int prog_fd; +}; + +enum { + BPF_SKEL_KERNEL = 1, +}; + +struct bpf_loader_ctx { + __u32 sz; + __u32 flags; + __u32 log_level; + __u32 log_size; + __u64 log_buf; +}; + +struct bpf_load_and_run_opts { + struct bpf_loader_ctx *ctx; + const void *data; + const void *insns; + __u32 data_sz; + __u32 insns_sz; + const char *errstr; +}; + +struct iterators_bpf__rodata {}; + +struct iterators_bpf { + struct bpf_loader_ctx ctx; + struct { + struct bpf_map_desc rodata; + } maps; + struct { + struct bpf_prog_desc dump_bpf_map; + struct bpf_prog_desc dump_bpf_prog; + } progs; + struct { + int dump_bpf_map_fd; + int dump_bpf_prog_fd; + } links; + struct iterators_bpf__rodata *rodata; +}; + +enum { + VERBOSE_STATUS = 1, +}; + +enum { + Enabled = 0, + Magic = 1, +}; + +typedef struct { + struct list_head list; + long unsigned int flags; + int offset; + int size; + char *magic; + char *mask; + const char *interpreter; + char *name; + struct dentry *dentry; + struct file *interp_file; +} Node; + +struct fsmap { + __u32 fmr_device; + __u32 fmr_flags; + __u64 fmr_physical; + __u64 fmr_owner; + __u64 fmr_offset; + __u64 fmr_length; + __u64 fmr_reserved[3]; +}; + +struct ext4_fsmap_head { + uint32_t fmh_iflags; + uint32_t fmh_oflags; + unsigned int fmh_count; + unsigned int fmh_entries; + struct ext4_fsmap fmh_keys[2]; +}; + +typedef int (*ext4_fsmap_format_t)(struct ext4_fsmap *, void *); + +struct ext4_getfsmap_info { + struct ext4_fsmap_head *gfi_head; + ext4_fsmap_format_t gfi_formatter; + void *gfi_format_arg; + ext4_fsblk_t gfi_next_fsblk; + u32 gfi_dev; + ext4_group_t gfi_agno; + struct ext4_fsmap gfi_low; + struct ext4_fsmap gfi_high; + struct ext4_fsmap gfi_lastfree; + struct list_head gfi_meta_list; + bool gfi_last; +}; + +struct ext4_getfsmap_dev { + int (*gfd_fn)(struct super_block *, struct ext4_fsmap *, struct ext4_getfsmap_info *); + u32 gfd_dev; +}; + +enum gcry_mpi_format { + GCRYMPI_FMT_NONE = 0, + GCRYMPI_FMT_STD = 1, + GCRYMPI_FMT_PGP = 2, + GCRYMPI_FMT_SSH = 3, + GCRYMPI_FMT_HEX = 4, + GCRYMPI_FMT_USG = 5, + GCRYMPI_FMT_OPAQUE = 8, +}; + +struct acpi_madt_generic_msi_frame { + struct acpi_subtable_header header; + u16 reserved; + u32 msi_frame_id; + u64 base_address; + u32 flags; + u16 spi_count; + u16 spi_base; +}; + +struct v2m_data { + struct list_head entry; + struct fwnode_handle *fwnode; + struct resource res; + void *base; + u32 spi_start; + u32 nr_spis; + u32 spi_offset; + long unsigned int *bm; + u32 flags; +}; + +struct soc_device; + +struct nf_hook_entries_rcu_head { + struct callback_head head; + void *allocation; +}; + +struct ftrace_graph_ent_entry { + struct trace_entry ent; + struct ftrace_graph_ent graph_ent; +} __attribute__((packed)); + +struct ftrace_graph_ret_entry { + struct trace_entry ent; + struct ftrace_graph_ret ret; +}; + +struct fgraph_cpu_data { + pid_t last_pid; + int depth; + int depth_irq; + int ignore; + long unsigned int enter_funcs[50]; +}; + +struct fgraph_data { + struct fgraph_cpu_data *cpu_data; + struct ftrace_graph_ent_entry ent; + struct ftrace_graph_ret_entry ret; + int failed; + int cpu; + int: 32; +} __attribute__((packed)); + +enum { + FLAGS_FILL_FULL = 268435456, + FLAGS_FILL_START = 536870912, + FLAGS_FILL_END = 805306368, +}; + +struct prepend_buffer { + char *buf; + int len; +}; + +struct ext4_new_group_input { + __u32 group; + __u64 block_bitmap; + __u64 inode_bitmap; + __u64 inode_table; + __u32 blocks_count; + __u16 reserved_blocks; + __u16 unused; +}; + +struct fsuuid { + __u32 fsu_len; + __u32 fsu_flags; + __u8 fsu_uuid[0]; +}; + +struct move_extent { + __u32 reserved; + __u32 donor_fd; + __u64 orig_start; + __u64 donor_start; + __u64 len; + __u64 moved_len; +}; + +struct fsmap_head { + __u32 fmh_iflags; + __u32 fmh_oflags; + __u32 fmh_count; + __u32 fmh_entries; + __u64 fmh_reserved[6]; + struct fsmap fmh_keys[2]; + struct fsmap fmh_recs[0]; +}; + +typedef void ext4_update_sb_callback(struct ext4_super_block *, const void *); + +struct getfsmap_info { + struct super_block *gi_sb; + struct fsmap_head *gi_data; + unsigned int gi_idx; + __u32 gi_last_flags; +}; + +struct io_xattr { + struct file *file; + struct xattr_ctx ctx; + struct filename *filename; +}; + +enum smbios_attr_enum { + SMBIOS_ATTR_NONE = 0, + SMBIOS_ATTR_LABEL_SHOW = 1, + SMBIOS_ATTR_INSTANCE_SHOW = 2, +}; + +enum acpi_attr_enum { + ACPI_ATTR_LABEL_SHOW = 0, + ACPI_ATTR_INDEX_SHOW = 1, +}; + +struct xgene_pcie { + struct device_node *node; + struct device *dev; + struct clk *clk; + void *csr_base; + void *cfg_base; + long unsigned int cfg_addr; + bool link_up; + u32 version; +}; + +struct iova_magazine; + +struct iova_cpu_rcache; + +struct iova_rcache { + spinlock_t lock; + long unsigned int depot_size; + struct iova_magazine *depot[32]; + struct iova_cpu_rcache *cpu_rcaches; +}; + +struct iova_magazine { + long unsigned int size; + long unsigned int pfns[127]; +}; + +struct iova_cpu_rcache { + spinlock_t lock; + struct iova_magazine *loaded; + struct iova_magazine *prev; +}; + +enum { + AFFINITY = 0, + AFFINITY_LIST = 1, + EFFECTIVE = 2, + EFFECTIVE_LIST = 3, +}; + +struct bucket { + struct hlist_nulls_head head; + raw_spinlock_t raw_lock; +}; + +struct htab_elem; + +struct bpf_htab { + struct bpf_map map; + struct bpf_mem_alloc ma; + struct bpf_mem_alloc pcpu_ma; + struct bucket *buckets; + void *elems; + union { + struct pcpu_freelist freelist; + struct bpf_lru lru; + }; + struct htab_elem **extra_elems; + struct percpu_counter pcount; + atomic_t count; + bool use_percpu_counter; + u32 n_buckets; + u32 elem_size; + u32 hashrnd; + struct lock_class_key lockdep_key; + int *map_locked[8]; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct htab_elem { + union { + struct hlist_nulls_node hash_node; + struct { + void *padding; + union { + struct pcpu_freelist_node fnode; + struct htab_elem *batch_flink; + }; + }; + }; + union { + void *ptr_to_pptr; + struct bpf_lru_node lru_node; + }; + u32 hash; + int: 32; + char key[0]; +}; + +struct bpf_iter_seq_hash_map_info { + struct bpf_map *map; + struct bpf_htab *htab; + void *percpu_value_buf; + u32 bucket_id; + u32 skip_elems; +}; + +struct pcie_link_state { + struct pci_dev *pdev; + struct pci_dev *downstream; + struct pcie_link_state *root; + struct pcie_link_state *parent; + struct list_head sibling; + u32 aspm_support: 7; + u32 aspm_enabled: 7; + u32 aspm_capable: 7; + u32 aspm_default: 7; + char: 4; + u32 aspm_disable: 7; + u32 clkpm_capable: 1; + u32 clkpm_enabled: 1; + u32 clkpm_default: 1; + u32 clkpm_disable: 1; +}; + +struct clk_fixed_factor { + struct clk_hw hw; + unsigned int mult; + unsigned int div; +}; + +struct update_util_data { + void (*func)(struct update_util_data *, u64, unsigned int); +}; + +struct cpu_dbs_info { + u64 prev_cpu_idle; + u64 prev_update_time; + u64 prev_cpu_nice; + unsigned int prev_load; + struct update_util_data update_util; + struct policy_dbs_info *policy_dbs; +}; + +struct tso_t { + int next_frag_idx; + int size; + void *data; + u16 ip_id; + u8 tlen; + bool ipv6; + u32 tcp_seq; +}; + +enum perf_branch_sample_type { + PERF_SAMPLE_BRANCH_USER = 1, + PERF_SAMPLE_BRANCH_KERNEL = 2, + PERF_SAMPLE_BRANCH_HV = 4, + PERF_SAMPLE_BRANCH_ANY = 8, + PERF_SAMPLE_BRANCH_ANY_CALL = 16, + PERF_SAMPLE_BRANCH_ANY_RETURN = 32, + PERF_SAMPLE_BRANCH_IND_CALL = 64, + PERF_SAMPLE_BRANCH_ABORT_TX = 128, + PERF_SAMPLE_BRANCH_IN_TX = 256, + PERF_SAMPLE_BRANCH_NO_TX = 512, + PERF_SAMPLE_BRANCH_COND = 1024, + PERF_SAMPLE_BRANCH_CALL_STACK = 2048, + PERF_SAMPLE_BRANCH_IND_JUMP = 4096, + PERF_SAMPLE_BRANCH_CALL = 8192, + PERF_SAMPLE_BRANCH_NO_FLAGS = 16384, + PERF_SAMPLE_BRANCH_NO_CYCLES = 32768, + PERF_SAMPLE_BRANCH_TYPE_SAVE = 65536, + PERF_SAMPLE_BRANCH_HW_INDEX = 131072, + PERF_SAMPLE_BRANCH_PRIV_SAVE = 262144, + PERF_SAMPLE_BRANCH_MAX = 524288, +}; + +enum perf_event_read_format { + PERF_FORMAT_TOTAL_TIME_ENABLED = 1, + PERF_FORMAT_TOTAL_TIME_RUNNING = 2, + PERF_FORMAT_ID = 4, + PERF_FORMAT_GROUP = 8, + PERF_FORMAT_LOST = 16, + PERF_FORMAT_MAX = 32, +}; + +enum perf_event_ioc_flags { + PERF_IOC_FLAG_GROUP = 1, +}; + +struct perf_ns_link_info { + __u64 dev; + __u64 ino; +}; + +enum { + NET_NS_INDEX = 0, + UTS_NS_INDEX = 1, + IPC_NS_INDEX = 2, + PID_NS_INDEX = 3, + USER_NS_INDEX = 4, + MNT_NS_INDEX = 5, + CGROUP_NS_INDEX = 6, + NR_NAMESPACES = 7, +}; + +enum perf_addr_filter_action_t { + PERF_ADDR_FILTER_ACTION_STOP = 0, + PERF_ADDR_FILTER_ACTION_START = 1, + PERF_ADDR_FILTER_ACTION_FILTER = 2, +}; + +struct perf_addr_filter { + struct list_head entry; + struct path path; + long unsigned int offset; + long unsigned int size; + enum perf_addr_filter_action_t action; +}; + +struct swevent_hlist { + struct hlist_head heads[256]; + struct callback_head callback_head; +}; + +struct pmu_event_list { + raw_spinlock_t lock; + struct list_head list; +}; + +struct perf_cpu_context { + struct perf_event_context ctx; + struct perf_event_context *task_ctx; + int online; + struct perf_cgroup *cgrp; + int heap_size; + struct perf_event **heap; + struct perf_event *heap_default[2]; +}; + +struct min_heap { + void *data; + int nr; + int size; +}; + +struct min_heap_callbacks { + int elem_size; + bool (*less)(const void *, const void *); + void (*swp)(void *, void *); +}; + +typedef int (*remote_function_f)(void *); + +struct remote_function_call { + struct task_struct *p; + remote_function_f func; + void *info; + int ret; +}; + +typedef void (*event_f)(struct perf_event *, struct perf_cpu_context *, struct perf_event_context *, void *); + +struct event_function_struct { + struct perf_event *event; + event_f func; + void *data; +}; + +enum event_type_t { + EVENT_FLEXIBLE = 1, + EVENT_PINNED = 2, + EVENT_TIME = 4, + EVENT_CPU = 8, + EVENT_ALL = 3, +}; + +struct __group_key { + int cpu; + struct pmu *pmu; + struct cgroup *cgroup; +}; + +struct stop_event_data { + struct perf_event *event; + unsigned int restart; +}; + +struct perf_read_data { + struct perf_event *event; + bool group; + int ret; +}; + +struct perf_read_event { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +typedef void perf_iterate_f(struct perf_event *, void *); + +struct remote_output { + struct perf_buffer *rb; + int err; +}; + +struct perf_task_event { + struct task_struct *task; + struct perf_event_context *task_ctx; + struct { + struct perf_event_header header; + u32 pid; + u32 ppid; + u32 tid; + u32 ptid; + u64 time; + } event_id; +}; + +struct perf_comm_event { + struct task_struct *task; + char *comm; + int comm_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + } event_id; +}; + +struct perf_namespaces_event { + struct task_struct *task; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 nr_namespaces; + struct perf_ns_link_info link_info[7]; + } event_id; +}; + +struct perf_cgroup_event { + char *path; + int path_size; + struct { + struct perf_event_header header; + u64 id; + char path[0]; + } event_id; +}; + +struct perf_mmap_event { + struct vm_area_struct *vma; + const char *file_name; + int file_size; + int maj; + int min; + u64 ino; + u64 ino_generation; + u32 prot; + u32 flags; + u8 build_id[20]; + u32 build_id_size; + struct { + struct perf_event_header header; + u32 pid; + u32 tid; + u64 start; + u64 len; + u64 pgoff; + } event_id; +}; + +struct perf_switch_event { + struct task_struct *task; + struct task_struct *next_prev; + struct { + struct perf_event_header header; + u32 next_prev_pid; + u32 next_prev_tid; + } event_id; +}; + +struct perf_ksymbol_event { + const char *name; + int name_len; + struct { + struct perf_event_header header; + u64 addr; + u32 len; + u16 ksym_type; + u16 flags; + } event_id; +}; + +struct perf_bpf_event { + struct bpf_prog *prog; + struct { + struct perf_event_header header; + u16 type; + u16 flags; + u32 id; + u8 tag[8]; + } event_id; +}; + +struct perf_text_poke_event { + const void *old_bytes; + const void *new_bytes; + size_t pad; + u16 old_len; + u16 new_len; + struct { + struct perf_event_header header; + u64 addr; + } event_id; +}; + +struct swevent_htable { + struct swevent_hlist *swevent_hlist; + struct mutex hlist_mutex; + int hlist_refcount; + int recursion[4]; +}; + +enum perf_probe_config { + PERF_PROBE_CONFIG_IS_RETPROBE = 1, + PERF_UPROBE_REF_CTR_OFFSET_BITS = 32, + PERF_UPROBE_REF_CTR_OFFSET_SHIFT = 32, +}; + +enum { + IF_ACT_NONE = -1, + IF_ACT_FILTER = 0, + IF_ACT_START = 1, + IF_ACT_STOP = 2, + IF_SRC_FILE = 3, + IF_SRC_KERNEL = 4, + IF_SRC_FILEADDR = 5, + IF_SRC_KERNELADDR = 6, +}; + +enum { + IF_STATE_ACTION = 0, + IF_STATE_SOURCE = 1, + IF_STATE_END = 2, +}; + +struct perf_aux_event { + struct perf_event_header header; + u64 hw_id; +}; + +struct perf_aux_event___2 { + struct perf_event_header header; + u32 pid; + u32 tid; +}; + +struct perf_aux_event___3 { + struct perf_event_header header; + u64 offset; + u64 size; + u64 flags; +}; + +struct xfrm4_protocol { + int (*handler)(struct sk_buff *); + int (*input_handler)(struct sk_buff *, int, __be32, int); + int (*cb_handler)(struct sk_buff *, int); + int (*err_handler)(struct sk_buff *, u32); + struct xfrm4_protocol *next; + int priority; +}; + +struct icmp6_filter { + __u32 data[8]; +}; + +struct raw6_sock { + struct inet_sock inet; + __u32 checksum; + __u32 offset; + struct icmp6_filter filter; + __u32 ip6mr_table; + struct ipv6_pinfo inet6; +}; + +struct raw_iter_state { + struct seq_net_private p; + int bucket; +}; + +typedef int mh_filter_t(struct sock *, struct sk_buff *); + +struct raw6_frag_vec { + struct msghdr *msg; + int hlen; + char c[4]; +}; + +enum { + SEG6_LOCAL_UNSPEC = 0, + SEG6_LOCAL_ACTION = 1, + SEG6_LOCAL_SRH = 2, + SEG6_LOCAL_TABLE = 3, + SEG6_LOCAL_NH4 = 4, + SEG6_LOCAL_NH6 = 5, + SEG6_LOCAL_IIF = 6, + SEG6_LOCAL_OIF = 7, + SEG6_LOCAL_BPF = 8, + SEG6_LOCAL_VRFTABLE = 9, + SEG6_LOCAL_COUNTERS = 10, + SEG6_LOCAL_FLAVORS = 11, + __SEG6_LOCAL_MAX = 12, +}; + +enum { + SEG6_LOCAL_BPF_PROG_UNSPEC = 0, + SEG6_LOCAL_BPF_PROG = 1, + SEG6_LOCAL_BPF_PROG_NAME = 2, + __SEG6_LOCAL_BPF_PROG_MAX = 3, +}; + +enum { + SEG6_LOCAL_CNT_UNSPEC = 0, + SEG6_LOCAL_CNT_PAD = 1, + SEG6_LOCAL_CNT_PACKETS = 2, + SEG6_LOCAL_CNT_BYTES = 3, + SEG6_LOCAL_CNT_ERRORS = 4, + __SEG6_LOCAL_CNT_MAX = 5, +}; + +enum { + SEG6_LOCAL_FLV_UNSPEC = 0, + SEG6_LOCAL_FLV_OPERATION = 1, + SEG6_LOCAL_FLV_LCBLOCK_BITS = 2, + SEG6_LOCAL_FLV_LCNODE_FN_BITS = 3, + __SEG6_LOCAL_FLV_MAX = 4, +}; + +enum { + SEG6_LOCAL_FLV_OP_UNSPEC = 0, + SEG6_LOCAL_FLV_OP_PSP = 1, + SEG6_LOCAL_FLV_OP_USP = 2, + SEG6_LOCAL_FLV_OP_USD = 3, + SEG6_LOCAL_FLV_OP_NEXT_CSID = 4, + __SEG6_LOCAL_FLV_OP_MAX = 5, +}; + +struct seg6_local_lwt; + +struct seg6_local_lwtunnel_ops { + int (*build_state)(struct seg6_local_lwt *, const void *, struct netlink_ext_ack *); + void (*destroy_state)(struct seg6_local_lwt *); +}; + +enum seg6_end_dt_mode { + DT_INVALID_MODE = -22, + DT_LEGACY_MODE = 0, + DT_VRF_MODE = 1, +}; + +struct seg6_end_dt_info { + enum seg6_end_dt_mode mode; + struct net *net; + int vrf_ifindex; + int vrf_table; + u16 family; +}; + +struct seg6_flavors_info { + __u32 flv_ops; + __u8 lcblock_bits; + __u8 lcnode_func_bits; +}; + +struct pcpu_seg6_local_counters; + +struct seg6_action_desc; + +struct seg6_local_lwt { + int action; + struct ipv6_sr_hdr *srh; + int table; + struct in_addr nh4; + struct in6_addr nh6; + int iif; + int oif; + struct bpf_lwt_prog bpf; + struct seg6_end_dt_info dt_info; + struct seg6_flavors_info flv_info; + struct pcpu_seg6_local_counters *pcpu_counters; + int headroom; + struct seg6_action_desc *desc; + long unsigned int parsed_optattrs; +}; + +struct seg6_action_desc { + int action; + long unsigned int attrs; + long unsigned int optattrs; + int (*input)(struct sk_buff *, struct seg6_local_lwt *); + int static_headroom; + struct seg6_local_lwtunnel_ops slwt_ops; +}; + +struct pcpu_seg6_local_counters { + u64_stats_t packets; + u64_stats_t bytes; + u64_stats_t errors; + struct u64_stats_sync syncp; +}; + +struct seg6_local_counters { + __u64 packets; + __u64 bytes; + __u64 errors; +}; + +struct seg6_action_param { + int (*parse)(struct nlattr **, struct seg6_local_lwt *, struct netlink_ext_ack *); + int (*put)(struct sk_buff *, struct seg6_local_lwt *); + int (*cmp)(struct seg6_local_lwt *, struct seg6_local_lwt *); + void (*destroy)(struct seg6_local_lwt *); +}; + +enum { + BTF_VAR_STATIC = 0, + BTF_VAR_GLOBAL_ALLOCATED = 1, + BTF_VAR_GLOBAL_EXTERN = 2, +}; + +struct btf_var { + __u32 linkage; +}; + +struct btf_decl_tag { + __s32 component_idx; +}; + +struct bpf_sockopt { + union { + struct bpf_sock *sk; + }; + union { + void *optval; + }; + union { + void *optval_end; + }; + __s32 level; + __s32 optname; + __s32 optlen; + __s32 retval; +}; + +struct btf_struct_metas { + u32 cnt; + struct btf_struct_meta types[0]; +}; + +enum btf_kfunc_hook { + BTF_KFUNC_HOOK_COMMON = 0, + BTF_KFUNC_HOOK_XDP = 1, + BTF_KFUNC_HOOK_TC = 2, + BTF_KFUNC_HOOK_STRUCT_OPS = 3, + BTF_KFUNC_HOOK_TRACING = 4, + BTF_KFUNC_HOOK_SYSCALL = 5, + BTF_KFUNC_HOOK_FMODRET = 6, + BTF_KFUNC_HOOK_MAX = 7, +}; + +enum { + BTF_KFUNC_SET_MAX_CNT = 256, + BTF_DTOR_KFUNC_MAX_CNT = 256, +}; + +struct btf_kfunc_set_tab { + struct btf_id_set8 *sets[7]; +}; + +struct btf_id_dtor_kfunc_tab { + u32 cnt; + struct btf_id_dtor_kfunc dtors[0]; +}; + +enum verifier_phase { + CHECK_META = 0, + CHECK_TYPE = 1, +}; + +struct resolve_vertex { + const struct btf_type *t; + u32 type_id; + u16 next_member; +}; + +enum visit_state { + NOT_VISITED = 0, + VISITED = 1, + RESOLVED = 2, +}; + +enum resolve_mode { + RESOLVE_TBD = 0, + RESOLVE_PTR = 1, + RESOLVE_STRUCT_OR_ARRAY = 2, +}; + +struct btf_sec_info { + u32 off; + u32 len; +}; + +struct btf_verifier_env { + struct btf *btf; + u8 *visit_states; + struct resolve_vertex stack[32]; + struct bpf_verifier_log log; + u32 log_type_id; + u32 top_stack; + enum verifier_phase phase; + enum resolve_mode resolve_mode; +}; + +struct btf_show { + u64 flags; + void *target; + void (*showfn)(struct btf_show *, const char *, va_list); + const struct btf *btf; + struct { + u8 depth; + u8 depth_to_show; + u8 depth_check; + u8 array_member: 1; + u8 array_terminated: 1; + u16 array_encoding; + u32 type_id; + int status; + const struct btf_type *type; + const struct btf_member *member; + char name[80]; + } state; + struct { + u32 size; + void *head; + void *data; + u8 safe[32]; + } obj; +}; + +struct btf_kind_operations { + s32 (*check_meta)(struct btf_verifier_env *, const struct btf_type *, u32); + int (*resolve)(struct btf_verifier_env *, const struct resolve_vertex *); + int (*check_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + int (*check_kflag_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *); + void (*log_details)(struct btf_verifier_env *, const struct btf_type *); + void (*show)(const struct btf *, const struct btf_type *, u32, void *, u8, struct btf_show *); +}; + +enum { + BTF_FIELD_IGNORE = 0, + BTF_FIELD_FOUND = 1, +}; + +struct btf_field_info { + enum btf_field_type type; + u32 off; + union { + struct { + u32 type_id; + } kptr; + struct { + const char *node_name; + u32 value_btf_id; + } list_head; + }; +}; + +struct bpf_ctx_convert { + struct __sk_buff BPF_PROG_TYPE_SOCKET_FILTER_prog; + struct sk_buff BPF_PROG_TYPE_SOCKET_FILTER_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_CLS_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_CLS_kern; + struct __sk_buff BPF_PROG_TYPE_SCHED_ACT_prog; + struct sk_buff BPF_PROG_TYPE_SCHED_ACT_kern; + struct xdp_md BPF_PROG_TYPE_XDP_prog; + struct xdp_buff BPF_PROG_TYPE_XDP_kern; + struct __sk_buff BPF_PROG_TYPE_CGROUP_SKB_prog; + struct sk_buff BPF_PROG_TYPE_CGROUP_SKB_kern; + struct bpf_sock BPF_PROG_TYPE_CGROUP_SOCK_prog; + struct sock BPF_PROG_TYPE_CGROUP_SOCK_kern; + struct bpf_sock_addr BPF_PROG_TYPE_CGROUP_SOCK_ADDR_prog; + struct bpf_sock_addr_kern BPF_PROG_TYPE_CGROUP_SOCK_ADDR_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_IN_prog; + struct sk_buff BPF_PROG_TYPE_LWT_IN_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_OUT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_OUT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_XMIT_prog; + struct sk_buff BPF_PROG_TYPE_LWT_XMIT_kern; + struct __sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_prog; + struct sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_kern; + struct bpf_sock_ops BPF_PROG_TYPE_SOCK_OPS_prog; + struct bpf_sock_ops_kern BPF_PROG_TYPE_SOCK_OPS_kern; + struct __sk_buff BPF_PROG_TYPE_SK_SKB_prog; + struct sk_buff BPF_PROG_TYPE_SK_SKB_kern; + struct sk_msg_md BPF_PROG_TYPE_SK_MSG_prog; + struct sk_msg BPF_PROG_TYPE_SK_MSG_kern; + struct __sk_buff BPF_PROG_TYPE_FLOW_DISSECTOR_prog; + struct bpf_flow_dissector BPF_PROG_TYPE_FLOW_DISSECTOR_kern; + bpf_user_pt_regs_t BPF_PROG_TYPE_KPROBE_prog; + struct pt_regs BPF_PROG_TYPE_KPROBE_kern; + __u64 BPF_PROG_TYPE_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_TRACEPOINT_kern; + struct bpf_perf_event_data BPF_PROG_TYPE_PERF_EVENT_prog; + struct bpf_perf_event_data_kern BPF_PROG_TYPE_PERF_EVENT_kern; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_kern; + struct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_prog; + u64 BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_kern; + void *BPF_PROG_TYPE_TRACING_prog; + void *BPF_PROG_TYPE_TRACING_kern; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_prog; + struct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_kern; + struct bpf_sysctl BPF_PROG_TYPE_CGROUP_SYSCTL_prog; + struct bpf_sysctl_kern BPF_PROG_TYPE_CGROUP_SYSCTL_kern; + struct bpf_sockopt BPF_PROG_TYPE_CGROUP_SOCKOPT_prog; + struct bpf_sockopt_kern BPF_PROG_TYPE_CGROUP_SOCKOPT_kern; + __u32 BPF_PROG_TYPE_LIRC_MODE2_prog; + u32 BPF_PROG_TYPE_LIRC_MODE2_kern; + struct sk_reuseport_md BPF_PROG_TYPE_SK_REUSEPORT_prog; + struct sk_reuseport_kern BPF_PROG_TYPE_SK_REUSEPORT_kern; + struct bpf_sk_lookup BPF_PROG_TYPE_SK_LOOKUP_prog; + struct bpf_sk_lookup_kern BPF_PROG_TYPE_SK_LOOKUP_kern; + void *BPF_PROG_TYPE_STRUCT_OPS_prog; + void *BPF_PROG_TYPE_STRUCT_OPS_kern; + void *BPF_PROG_TYPE_EXT_prog; + void *BPF_PROG_TYPE_EXT_kern; + void *BPF_PROG_TYPE_LSM_prog; + void *BPF_PROG_TYPE_LSM_kern; + void *BPF_PROG_TYPE_SYSCALL_prog; + void *BPF_PROG_TYPE_SYSCALL_kern; +}; + +enum { + __ctx_convertBPF_PROG_TYPE_SOCKET_FILTER = 0, + __ctx_convertBPF_PROG_TYPE_SCHED_CLS = 1, + __ctx_convertBPF_PROG_TYPE_SCHED_ACT = 2, + __ctx_convertBPF_PROG_TYPE_XDP = 3, + __ctx_convertBPF_PROG_TYPE_CGROUP_SKB = 4, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK = 5, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCK_ADDR = 6, + __ctx_convertBPF_PROG_TYPE_LWT_IN = 7, + __ctx_convertBPF_PROG_TYPE_LWT_OUT = 8, + __ctx_convertBPF_PROG_TYPE_LWT_XMIT = 9, + __ctx_convertBPF_PROG_TYPE_LWT_SEG6LOCAL = 10, + __ctx_convertBPF_PROG_TYPE_SOCK_OPS = 11, + __ctx_convertBPF_PROG_TYPE_SK_SKB = 12, + __ctx_convertBPF_PROG_TYPE_SK_MSG = 13, + __ctx_convertBPF_PROG_TYPE_FLOW_DISSECTOR = 14, + __ctx_convertBPF_PROG_TYPE_KPROBE = 15, + __ctx_convertBPF_PROG_TYPE_TRACEPOINT = 16, + __ctx_convertBPF_PROG_TYPE_PERF_EVENT = 17, + __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT = 18, + __ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 19, + __ctx_convertBPF_PROG_TYPE_TRACING = 20, + __ctx_convertBPF_PROG_TYPE_CGROUP_DEVICE = 21, + __ctx_convertBPF_PROG_TYPE_CGROUP_SYSCTL = 22, + __ctx_convertBPF_PROG_TYPE_CGROUP_SOCKOPT = 23, + __ctx_convertBPF_PROG_TYPE_LIRC_MODE2 = 24, + __ctx_convertBPF_PROG_TYPE_SK_REUSEPORT = 25, + __ctx_convertBPF_PROG_TYPE_SK_LOOKUP = 26, + __ctx_convertBPF_PROG_TYPE_STRUCT_OPS = 27, + __ctx_convertBPF_PROG_TYPE_EXT = 28, + __ctx_convertBPF_PROG_TYPE_LSM = 29, + __ctx_convertBPF_PROG_TYPE_SYSCALL = 30, + __ctx_convert_unused = 31, +}; + +enum bpf_struct_walk_result { + WALK_SCALAR = 0, + WALK_PTR = 1, + WALK_STRUCT = 2, +}; + +struct btf_show_snprintf { + struct btf_show show; + int len_left; + int len; +}; + +enum { + BTF_MODULE_F_LIVE = 1, +}; + +struct btf_module { + struct list_head list; + struct module *module; + struct btf *btf; + struct bin_attribute *sysfs_attr; + int flags; +}; + +typedef u64 (*btf_bpf_btf_find_by_name_kind)(char *, int, u32, int); + +struct bpf_cand_cache { + const char *name; + u32 name_len; + u16 kind; + u16 cnt; + struct { + const struct btf *btf; + u32 id; + } cands[0]; +}; + +struct arm_smccc_quirk { + int id; + union { + long unsigned int a6; + } state; +}; + +enum crb_defaults { + CRB_ACPI_START_REVISION_ID = 1, + CRB_ACPI_START_INDEX = 1, +}; + +enum crb_loc_ctrl { + CRB_LOC_CTRL_REQUEST_ACCESS = 1, + CRB_LOC_CTRL_RELINQUISH = 2, +}; + +enum crb_loc_state { + CRB_LOC_STATE_LOC_ASSIGNED = 2, + CRB_LOC_STATE_TPM_REG_VALID_STS = 128, +}; + +enum crb_ctrl_req { + CRB_CTRL_REQ_CMD_READY = 1, + CRB_CTRL_REQ_GO_IDLE = 2, +}; + +enum crb_ctrl_sts { + CRB_CTRL_STS_ERROR = 1, + CRB_CTRL_STS_TPM_IDLE = 2, +}; + +enum crb_start { + CRB_START_INVOKE = 1, +}; + +enum crb_cancel { + CRB_CANCEL_INVOKE = 1, +}; + +struct crb_regs_head { + u32 loc_state; + u32 reserved1; + u32 loc_ctrl; + u32 loc_sts; + u8 reserved2[32]; + u64 intf_id; + u64 ctrl_ext; +}; + +struct crb_regs_tail { + u32 ctrl_req; + u32 ctrl_sts; + u32 ctrl_cancel; + u32 ctrl_start; + u32 ctrl_int_enable; + u32 ctrl_int_sts; + u32 ctrl_cmd_size; + u32 ctrl_cmd_pa_low; + u32 ctrl_cmd_pa_high; + u32 ctrl_rsp_size; + u64 ctrl_rsp_pa; +}; + +enum crb_status { + CRB_DRV_STS_COMPLETE = 1, +}; + +struct crb_priv { + u32 sm; + const char *hid; + struct crb_regs_head *regs_h; + struct crb_regs_tail *regs_t; + u8 *cmd; + u8 *rsp; + u32 cmd_size; + u32 smc_func_id; +}; + +struct tpm2_crb_smc { + u32 interrupt; + u8 interrupt_flags; + u8 op_flags; + u16 reserved2; + u32 smc_func_id; +}; + +typedef u64 (*btf_bpf_rc_repeat)(u32 *); + +typedef u64 (*btf_bpf_rc_keydown)(u32 *, u32, u64, u32); + +typedef u64 (*btf_bpf_rc_pointer_rel)(u32 *, s32, s32); + +struct netdev_queue_attribute { + struct attribute attr; + ssize_t (*show)(struct netdev_queue *, char *); + ssize_t (*store)(struct netdev_queue *, const char *, size_t); +}; + +struct udp_tunnel_nic_table_entry; + +struct udp_tunnel_nic { + struct work_struct work; + struct net_device *dev; + u8 need_sync: 1; + u8 need_replay: 1; + u8 work_pending: 1; + unsigned int n_tables; + long unsigned int missed; + struct udp_tunnel_nic_table_entry **entries; +}; + +struct udp_tunnel_nic_shared_node { + struct net_device *dev; + struct list_head list; +}; + +enum udp_tunnel_nic_table_entry_flags { + UDP_TUNNEL_NIC_ENTRY_ADD = 1, + UDP_TUNNEL_NIC_ENTRY_DEL = 2, + UDP_TUNNEL_NIC_ENTRY_OP_FAIL = 4, + UDP_TUNNEL_NIC_ENTRY_FROZEN = 8, +}; + +struct udp_tunnel_nic_table_entry { + __be16 port; + u8 type; + u8 flags; + u16 use_cnt; + u8 hw_priv; +}; + +struct trace_event_raw_cpu { + struct trace_entry ent; + u32 state; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_cpu_idle_miss { + struct trace_entry ent; + u32 cpu_id; + u32 state; + bool below; + char __data[0]; +}; + +struct trace_event_raw_powernv_throttle { + struct trace_entry ent; + int chip_id; + u32 __data_loc_reason; + int pmax; + char __data[0]; +}; + +struct trace_event_raw_pstate_sample { + struct trace_entry ent; + u32 core_busy; + u32 scaled_busy; + u32 from; + u32 to; + u64 mperf; + u64 aperf; + u64 tsc; + u32 freq; + u32 io_boost; + char __data[0]; +}; + +struct trace_event_raw_cpu_frequency_limits { + struct trace_entry ent; + u32 min_freq; + u32 max_freq; + u32 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_start { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + u32 __data_loc_parent; + u32 __data_loc_pm_ops; + int event; + char __data[0]; +}; + +struct trace_event_raw_device_pm_callback_end { + struct trace_entry ent; + u32 __data_loc_device; + u32 __data_loc_driver; + int error; + char __data[0]; +}; + +struct trace_event_raw_suspend_resume { + struct trace_entry ent; + const char *action; + int val; + bool start; + char __data[0]; +}; + +struct trace_event_raw_wakeup_source { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + char __data[0]; +}; + +struct trace_event_raw_clock { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_power_domain { + struct trace_entry ent; + u32 __data_loc_name; + u64 state; + u64 cpu_id; + char __data[0]; +}; + +struct trace_event_raw_cpu_latency_qos_request { + struct trace_entry ent; + s32 value; + char __data[0]; +}; + +struct trace_event_raw_pm_qos_update { + struct trace_entry ent; + enum pm_qos_req_action action; + int prev_value; + int curr_value; + char __data[0]; +}; + +struct trace_event_raw_dev_pm_qos_request { + struct trace_entry ent; + u32 __data_loc_name; + enum dev_pm_qos_req_type type; + s32 new_value; + char __data[0]; +}; + +struct trace_event_raw_guest_halt_poll_ns { + struct trace_entry ent; + bool grow; + unsigned int new; + unsigned int old; + char __data[0]; +}; + +struct trace_event_data_offsets_cpu {}; + +struct trace_event_data_offsets_cpu_idle_miss {}; + +struct trace_event_data_offsets_powernv_throttle { + u32 reason; +}; + +struct trace_event_data_offsets_pstate_sample {}; + +struct trace_event_data_offsets_cpu_frequency_limits {}; + +struct trace_event_data_offsets_device_pm_callback_start { + u32 device; + u32 driver; + u32 parent; + u32 pm_ops; +}; + +struct trace_event_data_offsets_device_pm_callback_end { + u32 device; + u32 driver; +}; + +struct trace_event_data_offsets_suspend_resume {}; + +struct trace_event_data_offsets_wakeup_source { + u32 name; +}; + +struct trace_event_data_offsets_clock { + u32 name; +}; + +struct trace_event_data_offsets_power_domain { + u32 name; +}; + +struct trace_event_data_offsets_cpu_latency_qos_request {}; + +struct trace_event_data_offsets_pm_qos_update {}; + +struct trace_event_data_offsets_dev_pm_qos_request { + u32 name; +}; + +struct trace_event_data_offsets_guest_halt_poll_ns {}; + +typedef void (*btf_trace_cpu_idle)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_cpu_idle_miss)(void *, unsigned int, unsigned int, bool); + +typedef void (*btf_trace_powernv_throttle)(void *, int, const char *, int); + +typedef void (*btf_trace_pstate_sample)(void *, u32, u32, u32, u32, u64, u64, u64, u32, u32); + +typedef void (*btf_trace_cpu_frequency)(void *, unsigned int, unsigned int); + +typedef void (*btf_trace_cpu_frequency_limits)(void *, struct cpufreq_policy *); + +typedef void (*btf_trace_device_pm_callback_start)(void *, struct device *, const char *, int); + +typedef void (*btf_trace_device_pm_callback_end)(void *, struct device *, int); + +typedef void (*btf_trace_suspend_resume)(void *, const char *, int, bool); + +typedef void (*btf_trace_wakeup_source_activate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_wakeup_source_deactivate)(void *, const char *, unsigned int); + +typedef void (*btf_trace_clock_enable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_disable)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_clock_set_rate)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_power_domain_target)(void *, const char *, unsigned int, unsigned int); + +typedef void (*btf_trace_pm_qos_add_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_remove_request)(void *, s32); + +typedef void (*btf_trace_pm_qos_update_target)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_pm_qos_update_flags)(void *, enum pm_qos_req_action, int, int); + +typedef void (*btf_trace_dev_pm_qos_add_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_update_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_dev_pm_qos_remove_request)(void *, const char *, enum dev_pm_qos_req_type, s32); + +typedef void (*btf_trace_guest_halt_poll_ns)(void *, bool, unsigned int, unsigned int); + +struct madvise_walk_private { + struct mmu_gather *tlb; + bool pageout; +}; + +struct migrate_struct { + ext4_lblk_t first_block; + ext4_lblk_t last_block; + ext4_lblk_t curr_block; + ext4_fsblk_t first_pblock; + ext4_fsblk_t last_pblock; +}; + +struct md5_state { + u32 hash[4]; + u32 block[16]; + u64 byte_count; +}; + +struct blk_queue_stats { + struct list_head callbacks; + spinlock_t lock; + int accounting; +}; + +struct io_rw_state { + struct iov_iter iter; + struct iov_iter_state iter_state; + struct iovec fast_iov[8]; +}; + +struct io_async_rw { + struct io_rw_state s; + const struct iovec *free_iovec; + size_t bytes_done; + struct wait_page_queue wpq; +}; + +struct io_rw { + struct kiocb kiocb; + u64 addr; + u32 len; + rwf_t flags; +}; + +struct xfrm_algo_list { + struct xfrm_algo_desc *algs; + int entries; + u32 type; + u32 mask; +}; + +struct xfrm_aead_name { + const char *name; + int icvbits; +}; + +struct pin_cookie { + unsigned int val; +}; + +struct dl_bw { + raw_spinlock_t lock; + u64 bw; + u64 total_bw; +}; + +struct cpudl_item; + +struct cpudl { + raw_spinlock_t lock; + int size; + cpumask_var_t free_cpus; + struct cpudl_item *elements; +}; + +struct cpupri_vec { + atomic_t count; + cpumask_var_t mask; +}; + +struct cpupri { + struct cpupri_vec pri_to_cpu[101]; + int *cpu_to_pri; +}; + +struct perf_domain; + +struct root_domain { + atomic_t refcount; + atomic_t rto_count; + struct callback_head rcu; + cpumask_var_t span; + cpumask_var_t online; + int overload; + int overutilized; + cpumask_var_t dlo_mask; + atomic_t dlo_count; + struct dl_bw dl_bw; + struct cpudl cpudl; + u64 visit_gen; + struct irq_work rto_push_work; + raw_spinlock_t rto_lock; + int rto_loop; + int rto_cpu; + atomic_t rto_loop_next; + atomic_t rto_loop_start; + cpumask_var_t rto_mask; + struct cpupri cpupri; + long unsigned int max_cpu_capacity; + struct perf_domain *pd; +}; + +struct cfs_rq { + struct load_weight load; + unsigned int nr_running; + unsigned int h_nr_running; + unsigned int idle_nr_running; + unsigned int idle_h_nr_running; + u64 exec_clock; + u64 min_vruntime; + struct rb_root_cached tasks_timeline; + struct sched_entity *curr; + struct sched_entity *next; + struct sched_entity *last; + struct sched_entity *skip; + unsigned int nr_spread_over; + long: 32; + long: 64; + long: 64; + long: 64; + struct sched_avg avg; + struct { + raw_spinlock_t lock; + int nr; + long unsigned int load_avg; + long unsigned int util_avg; + long unsigned int runnable_avg; + long: 64; + long: 64; + long: 64; + long: 64; + } removed; + long unsigned int tg_load_avg_contrib; + long int propagate; + long int prop_runnable_sum; + long unsigned int h_load; + u64 last_h_load_update; + struct sched_entity *h_load_next; + struct rq *rq; + int on_list; + struct list_head leaf_cfs_rq_list; + struct task_group *tg; + int idle; + int runtime_enabled; + s64 runtime_remaining; + u64 throttled_pelt_idle; + u64 throttled_clock; + u64 throttled_clock_pelt; + u64 throttled_clock_pelt_time; + int throttled; + int throttle_count; + struct list_head throttled_list; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct cfs_bandwidth { + raw_spinlock_t lock; + ktime_t period; + u64 quota; + u64 runtime; + u64 burst; + u64 runtime_snap; + s64 hierarchical_quota; + u8 idle; + u8 period_active; + u8 slack_started; + struct hrtimer period_timer; + struct hrtimer slack_timer; + struct list_head throttled_cfs_rq; + int nr_periods; + int nr_throttled; + int nr_burst; + u64 throttled_time; + u64 burst_time; +}; + +struct task_group { + struct cgroup_subsys_state css; + struct sched_entity **se; + struct cfs_rq **cfs_rq; + long unsigned int shares; + int idle; + long: 32; + long: 64; + atomic_long_t load_avg; + struct callback_head rcu; + struct list_head list; + struct task_group *parent; + struct list_head siblings; + struct list_head children; + struct cfs_bandwidth cfs_bandwidth; + long: 64; +}; + +enum { + MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY = 1, + MEMBARRIER_STATE_PRIVATE_EXPEDITED = 2, + MEMBARRIER_STATE_GLOBAL_EXPEDITED_READY = 4, + MEMBARRIER_STATE_GLOBAL_EXPEDITED = 8, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE_READY = 16, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ_READY = 64, + MEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ = 128, +}; + +struct sched_domain_shared { + atomic_t ref; + atomic_t nr_busy_cpus; + int has_idle_cores; + int nr_idle_scan; +}; + +struct sched_group; + +struct sched_domain { + struct sched_domain *parent; + struct sched_domain *child; + struct sched_group *groups; + long unsigned int min_interval; + long unsigned int max_interval; + unsigned int busy_factor; + unsigned int imbalance_pct; + unsigned int cache_nice_tries; + unsigned int imb_numa_nr; + int nohz_idle; + int flags; + int level; + long unsigned int last_balance; + unsigned int balance_interval; + unsigned int nr_balance_failed; + u64 max_newidle_lb_cost; + long unsigned int last_decay_max_lb_cost; + u64 avg_scan_cost; + unsigned int lb_count[3]; + unsigned int lb_failed[3]; + unsigned int lb_balanced[3]; + unsigned int lb_imbalance[3]; + unsigned int lb_gained[3]; + unsigned int lb_hot_gained[3]; + unsigned int lb_nobusyg[3]; + unsigned int lb_nobusyq[3]; + unsigned int alb_count; + unsigned int alb_failed; + unsigned int alb_pushed; + unsigned int sbe_count; + unsigned int sbe_balanced; + unsigned int sbe_pushed; + unsigned int sbf_count; + unsigned int sbf_balanced; + unsigned int sbf_pushed; + unsigned int ttwu_wake_remote; + unsigned int ttwu_move_affine; + unsigned int ttwu_move_balance; + char *name; + union { + void *private; + struct callback_head rcu; + }; + struct sched_domain_shared *shared; + unsigned int span_weight; + long unsigned int span[0]; +}; + +struct sched_group_capacity; + +struct sched_group { + struct sched_group *next; + atomic_t ref; + unsigned int group_weight; + struct sched_group_capacity *sgc; + int asym_prefer_cpu; + int flags; + long unsigned int cpumask[0]; +}; + +struct sched_group_capacity { + atomic_t ref; + long unsigned int capacity; + long unsigned int min_capacity; + long unsigned int max_capacity; + long unsigned int next_update; + int imbalance; + int id; + long unsigned int cpumask[0]; +}; + +struct em_perf_state { + long unsigned int frequency; + long unsigned int power; + long unsigned int cost; + long unsigned int flags; +}; + +struct em_perf_domain { + struct em_perf_state *table; + int nr_perf_states; + long unsigned int flags; + long unsigned int cpus[0]; +}; + +struct sched_attr { + __u32 size; + __u32 sched_policy; + __u64 sched_flags; + __s32 sched_nice; + __u32 sched_priority; + __u64 sched_runtime; + __u64 sched_deadline; + __u64 sched_period; + __u32 sched_util_min; + __u32 sched_util_max; +}; + +struct trace_event_raw_sched_kthread_stop { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_stop_ret { + struct trace_entry ent; + int ret; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_queue_work { + struct trace_entry ent; + void *work; + void *function; + void *worker; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_start { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_kthread_work_execute_end { + struct trace_entry ent; + void *work; + void *function; + char __data[0]; +}; + +struct trace_event_raw_sched_wakeup_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int target_cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_switch { + struct trace_entry ent; + char prev_comm[16]; + pid_t prev_pid; + int prev_prio; + long int prev_state; + char next_comm[16]; + pid_t next_pid; + int next_prio; + char __data[0]; +}; + +struct trace_event_raw_sched_migrate_task { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + int orig_cpu; + int dest_cpu; + char __data[0]; +}; + +struct trace_event_raw_sched_process_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_wait { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int prio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_fork { + struct trace_entry ent; + char parent_comm[16]; + pid_t parent_pid; + char child_comm[16]; + pid_t child_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_process_exec { + struct trace_entry ent; + u32 __data_loc_filename; + pid_t pid; + pid_t old_pid; + char __data[0]; +}; + +struct trace_event_raw_sched_stat_template { + struct trace_entry ent; + char comm[16]; + pid_t pid; + u64 delay; + char __data[0]; +}; + +struct trace_event_raw_sched_stat_runtime { + struct trace_entry ent; + char comm[16]; + pid_t pid; + u64 runtime; + u64 vruntime; + char __data[0]; +}; + +struct trace_event_raw_sched_pi_setprio { + struct trace_entry ent; + char comm[16]; + pid_t pid; + int oldprio; + int newprio; + char __data[0]; +}; + +struct trace_event_raw_sched_process_hang { + struct trace_entry ent; + char comm[16]; + pid_t pid; + char __data[0]; +}; + +struct trace_event_raw_sched_move_numa { + struct trace_entry ent; + pid_t pid; + pid_t tgid; + pid_t ngid; + int src_cpu; + int src_nid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_numa_pair_template { + struct trace_entry ent; + pid_t src_pid; + pid_t src_tgid; + pid_t src_ngid; + int src_cpu; + int src_nid; + pid_t dst_pid; + pid_t dst_tgid; + pid_t dst_ngid; + int dst_cpu; + int dst_nid; + char __data[0]; +}; + +struct trace_event_raw_sched_wake_idle_without_ipi { + struct trace_entry ent; + int cpu; + char __data[0]; +}; + +struct trace_event_data_offsets_sched_kthread_stop {}; + +struct trace_event_data_offsets_sched_kthread_stop_ret {}; + +struct trace_event_data_offsets_sched_kthread_work_queue_work {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_start {}; + +struct trace_event_data_offsets_sched_kthread_work_execute_end {}; + +struct trace_event_data_offsets_sched_wakeup_template {}; + +struct trace_event_data_offsets_sched_switch {}; + +struct trace_event_data_offsets_sched_migrate_task {}; + +struct trace_event_data_offsets_sched_process_template {}; + +struct trace_event_data_offsets_sched_process_wait {}; + +struct trace_event_data_offsets_sched_process_fork {}; + +struct trace_event_data_offsets_sched_process_exec { + u32 filename; +}; + +struct trace_event_data_offsets_sched_stat_template {}; + +struct trace_event_data_offsets_sched_stat_runtime {}; + +struct trace_event_data_offsets_sched_pi_setprio {}; + +struct trace_event_data_offsets_sched_process_hang {}; + +struct trace_event_data_offsets_sched_move_numa {}; + +struct trace_event_data_offsets_sched_numa_pair_template {}; + +struct trace_event_data_offsets_sched_wake_idle_without_ipi {}; + +typedef void (*btf_trace_sched_kthread_stop)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_kthread_stop_ret)(void *, int); + +typedef void (*btf_trace_sched_kthread_work_queue_work)(void *, struct kthread_worker *, struct kthread_work *); + +typedef void (*btf_trace_sched_kthread_work_execute_start)(void *, struct kthread_work *); + +typedef void (*btf_trace_sched_kthread_work_execute_end)(void *, struct kthread_work *, kthread_work_func_t); + +typedef void (*btf_trace_sched_waking)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wakeup)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wakeup_new)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_switch)(void *, bool, struct task_struct *, struct task_struct *, unsigned int); + +typedef void (*btf_trace_sched_migrate_task)(void *, struct task_struct *, int); + +typedef void (*btf_trace_sched_process_free)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_exit)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_wait_task)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_process_wait)(void *, struct pid *); + +typedef void (*btf_trace_sched_process_fork)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_process_exec)(void *, struct task_struct *, pid_t, struct linux_binprm *); + +typedef void (*btf_trace_sched_stat_wait)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_sleep)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_iowait)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_blocked)(void *, struct task_struct *, u64); + +typedef void (*btf_trace_sched_stat_runtime)(void *, struct task_struct *, u64, u64); + +typedef void (*btf_trace_sched_pi_setprio)(void *, struct task_struct *, struct task_struct *); + +typedef void (*btf_trace_sched_process_hang)(void *, struct task_struct *); + +typedef void (*btf_trace_sched_move_numa)(void *, struct task_struct *, int, int); + +typedef void (*btf_trace_sched_stick_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_swap_numa)(void *, struct task_struct *, int, struct task_struct *, int); + +typedef void (*btf_trace_sched_wake_idle_without_ipi)(void *, int); + +typedef void (*btf_trace_pelt_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_pelt_rt_tp)(void *, struct rq *); + +struct rt_prio_array { + long unsigned int bitmap[2]; + struct list_head queue[100]; +}; + +struct rt_rq { + struct rt_prio_array active; + unsigned int rt_nr_running; + unsigned int rr_nr_running; + struct { + int curr; + int next; + } highest_prio; + unsigned int rt_nr_migratory; + unsigned int rt_nr_total; + int overloaded; + struct plist_head pushable_tasks; + int rt_queued; + int rt_throttled; + u64 rt_time; + u64 rt_runtime; + raw_spinlock_t rt_runtime_lock; +}; + +struct dl_rq { + struct rb_root_cached root; + unsigned int dl_nr_running; + struct { + u64 curr; + u64 next; + } earliest_dl; + unsigned int dl_nr_migratory; + int overloaded; + struct rb_root_cached pushable_dl_tasks_root; + u64 running_bw; + u64 this_bw; + u64 extra_bw; + u64 bw_ratio; +}; + +struct balance_callback; + +struct rq { + raw_spinlock_t __lock; + unsigned int nr_running; + unsigned int nr_numa_running; + unsigned int nr_preferred_running; + unsigned int numa_migrate_on; + long unsigned int last_blocked_load_update_tick; + unsigned int has_blocked_load; + call_single_data_t nohz_csd; + unsigned int nohz_tick_stopped; + atomic_t nohz_flags; + unsigned int ttwu_pending; + u64 nr_switches; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct cfs_rq cfs; + struct rt_rq rt; + struct dl_rq dl; + struct list_head leaf_cfs_rq_list; + struct list_head *tmp_alone_branch; + unsigned int nr_uninterruptible; + struct task_struct *curr; + struct task_struct *idle; + struct task_struct *stop; + long unsigned int next_balance; + struct mm_struct *prev_mm; + unsigned int clock_update_flags; + u64 clock; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + u64 clock_task; + u64 clock_pelt; + long unsigned int lost_idle_time; + u64 clock_pelt_idle; + u64 clock_idle; + atomic_t nr_iowait; + u64 last_seen_need_resched_ns; + int ticks_without_resched; + int membarrier_state; + struct root_domain *rd; + struct sched_domain *sd; + long unsigned int cpu_capacity; + long unsigned int cpu_capacity_orig; + long unsigned int cpu_capacity_inverted; + struct balance_callback *balance_callback; + unsigned char nohz_idle_balance; + unsigned char idle_balance; + long unsigned int misfit_task_load; + int active_balance; + int push_cpu; + struct cpu_stop_work active_balance_work; + int cpu; + int online; + struct list_head cfs_tasks; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + struct sched_avg avg_rt; + struct sched_avg avg_dl; + u64 idle_stamp; + u64 avg_idle; + long unsigned int wake_stamp; + u64 wake_avg_idle; + u64 max_idle_balance_cost; + struct rcuwait hotplug_wait; + long unsigned int calc_load_update; + long int calc_load_active; + call_single_data_t hrtick_csd; + struct hrtimer hrtick_timer; + ktime_t hrtick_time; + struct sched_info rq_sched_info; + long long unsigned int rq_cpu_time; + unsigned int yld_count; + unsigned int sched_count; + unsigned int sched_goidle; + unsigned int ttwu_count; + unsigned int ttwu_local; + struct cpuidle_state *idle_state; + unsigned int nr_pinned; + unsigned int push_busy; + struct cpu_stop_work push_work; + cpumask_var_t scratch_mask; + long: 64; +}; + +typedef void (*btf_trace_pelt_dl_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_thermal_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_irq_tp)(void *, struct rq *); + +typedef void (*btf_trace_pelt_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_sched_cpu_capacity_tp)(void *, struct rq *); + +typedef void (*btf_trace_sched_overutilized_tp)(void *, struct root_domain *, bool); + +typedef void (*btf_trace_sched_util_est_cfs_tp)(void *, struct cfs_rq *); + +typedef void (*btf_trace_sched_util_est_se_tp)(void *, struct sched_entity *); + +typedef void (*btf_trace_sched_update_nr_running_tp)(void *, struct rq *, int); + +struct cpudl_item { + u64 dl; + int cpu; + int idx; +}; + +struct rt_bandwidth { + raw_spinlock_t rt_runtime_lock; + ktime_t rt_period; + u64 rt_runtime; + struct hrtimer rt_period_timer; + unsigned int rt_period_active; +}; + +typedef int (*tg_visitor)(struct task_group *, void *); + +struct perf_domain { + struct em_perf_domain *em_pd; + struct perf_domain *next; + struct callback_head rcu; +}; + +struct balance_callback { + struct balance_callback *next; + void (*func)(struct rq *); +}; + +struct rq_flags { + long unsigned int flags; + struct pin_cookie cookie; + unsigned int clock_update_flags; +}; + +struct sched_entity_stats { + struct sched_entity se; + struct sched_statistics stats; +}; + +enum { + __SCHED_FEAT_GENTLE_FAIR_SLEEPERS = 0, + __SCHED_FEAT_START_DEBIT = 1, + __SCHED_FEAT_NEXT_BUDDY = 2, + __SCHED_FEAT_LAST_BUDDY = 3, + __SCHED_FEAT_CACHE_HOT_BUDDY = 4, + __SCHED_FEAT_WAKEUP_PREEMPTION = 5, + __SCHED_FEAT_HRTICK = 6, + __SCHED_FEAT_HRTICK_DL = 7, + __SCHED_FEAT_DOUBLE_TICK = 8, + __SCHED_FEAT_NONTASK_CAPACITY = 9, + __SCHED_FEAT_TTWU_QUEUE = 10, + __SCHED_FEAT_SIS_PROP = 11, + __SCHED_FEAT_SIS_UTIL = 12, + __SCHED_FEAT_WARN_DOUBLE_CLOCK = 13, + __SCHED_FEAT_RT_PUSH_IPI = 14, + __SCHED_FEAT_RT_RUNTIME_SHARE = 15, + __SCHED_FEAT_LB_MIN = 16, + __SCHED_FEAT_ATTACH_AGE_LOAD = 17, + __SCHED_FEAT_WA_IDLE = 18, + __SCHED_FEAT_WA_WEIGHT = 19, + __SCHED_FEAT_WA_BIAS = 20, + __SCHED_FEAT_UTIL_EST = 21, + __SCHED_FEAT_UTIL_EST_FASTUP = 22, + __SCHED_FEAT_LATENCY_WARN = 23, + __SCHED_FEAT_ALT_PERIOD = 24, + __SCHED_FEAT_BASE_SLICE = 25, + __SCHED_FEAT_NR = 26, +}; + +struct affinity_context { + const struct cpumask *new_mask; + struct cpumask *user_mask; + unsigned int flags; +}; + +enum cpu_util_type { + FREQUENCY_UTIL = 0, + ENERGY_UTIL = 1, +}; + +struct set_affinity_pending; + +struct migration_arg { + struct task_struct *task; + int dest_cpu; + struct set_affinity_pending *pending; +}; + +struct set_affinity_pending { + refcount_t refs; + unsigned int stop_pending; + struct completion done; + struct cpu_stop_work stop_work; + struct migration_arg arg; +}; + +struct migration_swap_arg { + struct task_struct *src_task; + struct task_struct *dst_task; + int src_cpu; + int dst_cpu; +}; + +enum { + preempt_dynamic_undefined = -1, + preempt_dynamic_none = 0, + preempt_dynamic_voluntary = 1, + preempt_dynamic_full = 2, +}; + +struct cfs_schedulable_data { + struct task_group *tg; + u64 period; + u64 quota; +}; + +enum { + cpuset = 0, + possible = 1, + fail = 2, +}; + +struct xdp_frame_bulk { + int count; + void *xa; + void *q[16]; +}; + +struct xt_tcp { + __u16 spts[2]; + __u16 dpts[2]; + __u8 option; + __u8 flg_mask; + __u8 flg_cmp; + __u8 invflags; +}; + +struct xt_udp { + __u16 spts[2]; + __u16 dpts[2]; + __u8 invflags; +}; + +struct bpf_iter__udp { + union { + struct bpf_iter_meta *meta; + }; + union { + struct udp_sock *udp_sk; + }; + uid_t uid; + int: 32; + int bucket; +}; + +enum uclamp_id { + UCLAMP_MIN = 0, + UCLAMP_MAX = 1, + UCLAMP_CNT = 2, +}; + +struct numa_group { + refcount_t refcount; + spinlock_t lock; + int nr_tasks; + pid_t gid; + int active_nodes; + struct callback_head rcu; + long unsigned int total_faults; + long unsigned int max_faults_cpu; + long unsigned int faults[0]; +}; + +enum { + SD_BALANCE_NEWIDLE = 1, + SD_BALANCE_EXEC = 2, + SD_BALANCE_FORK = 4, + SD_BALANCE_WAKE = 8, + SD_WAKE_AFFINE = 16, + SD_ASYM_CPUCAPACITY = 32, + SD_ASYM_CPUCAPACITY_FULL = 64, + SD_SHARE_CPUCAPACITY = 128, + SD_SHARE_PKG_RESOURCES = 256, + SD_SERIALIZE = 512, + SD_ASYM_PACKING = 1024, + SD_PREFER_SIBLING = 2048, + SD_OVERLAP = 4096, + SD_NUMA = 8192, +}; + +enum sched_tunable_scaling { + SCHED_TUNABLESCALING_NONE = 0, + SCHED_TUNABLESCALING_LOG = 1, + SCHED_TUNABLESCALING_LINEAR = 2, + SCHED_TUNABLESCALING_END = 3, +}; + +enum numa_topology_type { + NUMA_DIRECT = 0, + NUMA_GLUELESS_MESH = 1, + NUMA_BACKPLANE = 2, +}; + +enum numa_faults_stats { + NUMA_MEM = 0, + NUMA_CPU = 1, + NUMA_MEMBUF = 2, + NUMA_CPUBUF = 3, +}; + +enum numa_type { + node_has_spare = 0, + node_fully_busy = 1, + node_overloaded = 2, +}; + +struct numa_stats { + long unsigned int load; + long unsigned int runnable; + long unsigned int util; + long unsigned int compute_capacity; + unsigned int nr_running; + unsigned int weight; + enum numa_type node_type; + int idle_cpu; +}; + +struct task_numa_env { + struct task_struct *p; + int src_cpu; + int src_nid; + int dst_cpu; + int dst_nid; + int imb_numa_nr; + struct numa_stats src_stats; + struct numa_stats dst_stats; + int imbalance_pct; + int dist; + struct task_struct *best_task; + long int best_imp; + int best_cpu; +}; + +struct energy_env { + long unsigned int task_busy_time; + long unsigned int pd_busy_time; + long unsigned int cpu_cap; + long unsigned int pd_cap; +}; + +enum fbq_type { + regular = 0, + remote = 1, + all = 2, +}; + +enum group_type { + group_has_spare = 0, + group_fully_busy = 1, + group_misfit_task = 2, + group_asym_packing = 3, + group_imbalanced = 4, + group_overloaded = 5, +}; + +enum migration_type { + migrate_load = 0, + migrate_util = 1, + migrate_task = 2, + migrate_misfit = 3, +}; + +struct lb_env { + struct sched_domain *sd; + struct rq *src_rq; + int src_cpu; + int dst_cpu; + struct rq *dst_rq; + struct cpumask *dst_grpmask; + int new_dst_cpu; + enum cpu_idle_type idle; + long int imbalance; + struct cpumask *cpus; + unsigned int flags; + unsigned int loop; + unsigned int loop_break; + unsigned int loop_max; + enum fbq_type fbq_type; + enum migration_type migration_type; + struct list_head tasks; +}; + +struct sg_lb_stats { + long unsigned int avg_load; + long unsigned int group_load; + long unsigned int group_capacity; + long unsigned int group_util; + long unsigned int group_runnable; + unsigned int sum_nr_running; + unsigned int sum_h_nr_running; + unsigned int idle_cpus; + unsigned int group_weight; + enum group_type group_type; + unsigned int group_asym_packing; + long unsigned int group_misfit_task_load; + unsigned int nr_numa_running; + unsigned int nr_preferred_running; +}; + +struct sd_lb_stats { + struct sched_group *busiest; + struct sched_group *local; + long unsigned int total_load; + long unsigned int total_capacity; + long unsigned int avg_load; + unsigned int prefer_sibling; + struct sg_lb_stats busiest_stat; + struct sg_lb_stats local_stat; +}; + +struct psci_0_1_function_ids { + u32 cpu_suspend; + u32 cpu_on; + u32 cpu_off; + u32 migrate; +}; + +typedef long unsigned int psci_fn(long unsigned int, long unsigned int, long unsigned int, long unsigned int); + +typedef int (*psci_initcall_t)(const struct device_node *); + +struct psample_group { + struct list_head list; + struct net *net; + u32 group_num; + u32 refcount; + u32 seq; + struct callback_head rcu; +}; + +struct action_gate_entry { + u8 gate_state; + u32 interval; + s32 ipv; + s32 maxoctets; +}; + +struct tcf_qevent { + struct tcf_block *block; + struct tcf_block_ext_info info; + struct tcf_proto *filter_chain; +}; + +struct tcf_filter_chain_list_item { + struct list_head list; + tcf_chain_head_change_t *chain_head_change; + void *chain_head_change_priv; +}; + +struct tcf_net { + spinlock_t idr_lock; + struct idr idr; +}; + +struct tcf_block_owner_item { + struct list_head list; + struct Qdisc *q; + enum flow_block_binder_type binder_type; +}; + +struct tcf_chain_info { + struct tcf_proto **pprev; + struct tcf_proto *next; +}; + +struct tcf_dump_args { + struct tcf_walker w; + struct sk_buff *skb; + struct netlink_callback *cb; + struct tcf_block *block; + struct Qdisc *q; + u32 parent; + bool terse_dump; +}; + +struct raw_frag_vec { + struct msghdr *msg; + union { + struct icmphdr icmph; + char c[1]; + } hdr; + int hlen; +}; + +struct tcp6_pseudohdr { + struct in6_addr saddr; + struct in6_addr daddr; + __be32 len; + __be32 protocol; +}; + +struct dl_bandwidth { + raw_spinlock_t dl_runtime_lock; + u64 dl_runtime; + u64 dl_period; +}; + +struct idle_timer { + struct hrtimer timer; + int done; +}; + +typedef struct rt_rq *rt_rq_iter_t; + +enum acpi_bridge_type { + ACPI_BRIDGE_TYPE_PCIE = 1, + ACPI_BRIDGE_TYPE_CXL = 2, +}; + +struct pci_osc_bit_struct { + u32 bit; + char *desc; +}; + +struct acpi_cedt_cfmws { + struct acpi_cedt_header header; + u32 reserved1; + u64 base_hpa; + u64 window_size; + u8 interleave_ways; + u8 interleave_arithmetic; + u16 reserved2; + u32 granularity; + u16 restrictions; + u16 qtg_id; + u32 interleave_targets[0]; +} __attribute__((packed)); + +struct acpi_table_slit { + struct acpi_table_header header; + u64 locality_count; + u8 entry[1]; +} __attribute__((packed)); + +struct acpi_table_srat { + struct acpi_table_header header; + u32 table_revision; + u64 reserved; +}; + +struct acpi_srat_cpu_affinity { + struct acpi_subtable_header header; + u8 proximity_domain_lo; + u8 apic_id; + u32 flags; + u8 local_sapic_eid; + u8 proximity_domain_hi[3]; + u32 clock_domain; +}; + +struct acpi_srat_mem_affinity { + struct acpi_subtable_header header; + u32 proximity_domain; + u16 reserved; + u64 base_address; + u64 length; + u32 reserved1; + u32 flags; + u64 reserved2; +} __attribute__((packed)); + +struct acpi_srat_x2apic_cpu_affinity { + struct acpi_subtable_header header; + u16 reserved; + u32 proximity_domain; + u32 apic_id; + u32 flags; + u32 clock_domain; + u32 reserved2; +}; + +struct acpi_srat_generic_affinity { + struct acpi_subtable_header header; + u8 reserved; + u8 device_handle_type; + u32 proximity_domain; + u8 device_handle[16]; + u32 flags; + u32 reserved1; +}; + +struct virtio_console_config { + __virtio16 cols; + __virtio16 rows; + __virtio32 max_nr_ports; + __virtio32 emerg_wr; +}; + +struct virtio_console_control { + __virtio32 id; + __virtio16 event; + __virtio16 value; +}; + +struct ports_driver_data { + struct class *class; + struct dentry *debugfs_dir; + struct list_head portdevs; + unsigned int next_vtermno; + struct list_head consoles; +}; + +struct console___2 { + struct list_head list; + struct hvc_struct *hvc; + struct winsize ws; + u32 vtermno; +}; + +struct port_buffer { + char *buf; + size_t size; + size_t len; + size_t offset; + dma_addr_t dma; + struct device *dev; + struct list_head list; + unsigned int sgpages; + struct scatterlist sg[0]; +}; + +struct ports_device { + struct list_head list; + struct work_struct control_work; + struct work_struct config_work; + struct list_head ports; + spinlock_t ports_lock; + spinlock_t c_ivq_lock; + spinlock_t c_ovq_lock; + u32 max_nr_ports; + struct virtio_device *vdev; + struct virtqueue *c_ivq; + struct virtqueue *c_ovq; + struct virtio_console_control cpkt; + struct virtqueue **in_vqs; + struct virtqueue **out_vqs; + int chr_major; +}; + +struct port_stats { + long unsigned int bytes_sent; + long unsigned int bytes_received; + long unsigned int bytes_discarded; +}; + +struct port___2 { + struct list_head list; + struct ports_device *portdev; + struct port_buffer *inbuf; + spinlock_t inbuf_lock; + spinlock_t outvq_lock; + struct virtqueue *in_vq; + struct virtqueue *out_vq; + struct dentry *debugfs_file; + struct port_stats stats; + struct console___2 cons; + struct cdev *cdev; + struct device *dev; + struct kref kref; + wait_queue_head_t waitqueue; + char *name; + struct fasync_struct *async_queue; + u32 id; + bool outvq_full; + bool host_connected; + bool guest_connected; +}; + +struct sg_list { + unsigned int n; + unsigned int size; + size_t len; + struct scatterlist *sg; +}; + +struct serport { + struct tty_struct *tty; + wait_queue_head_t wait; + struct serio *serio; + struct serio_device_id id; + spinlock_t lock; + long unsigned int flags; +}; + +enum { + SEG6_IPTUNNEL_UNSPEC = 0, + SEG6_IPTUNNEL_SRH = 1, + __SEG6_IPTUNNEL_MAX = 2, +}; + +struct seg6_iptunnel_encap { + int mode; + struct ipv6_sr_hdr srh[0]; +}; + +enum { + SEG6_IPTUN_MODE_INLINE = 0, + SEG6_IPTUN_MODE_ENCAP = 1, + SEG6_IPTUN_MODE_L2ENCAP = 2, + SEG6_IPTUN_MODE_ENCAP_RED = 3, + SEG6_IPTUN_MODE_L2ENCAP_RED = 4, +}; + +struct seg6_lwt { + struct dst_cache cache; + struct seg6_iptunnel_encap tuninfo[0]; +}; + +typedef long unsigned int cycles_t; + +enum { + MEMBARRIER_FLAG_SYNC_CORE = 1, + MEMBARRIER_FLAG_RSEQ = 2, +}; + +struct sd_flag_debug { + unsigned int meta_flags; + char *name; +}; + +typedef const struct cpumask * (*sched_domain_mask_f)(int); + +typedef int (*sched_domain_flags_f)(); + +struct sd_data { + struct sched_domain **sd; + struct sched_domain_shared **sds; + struct sched_group **sg; + struct sched_group_capacity **sgc; +}; + +struct sched_domain_topology_level { + sched_domain_mask_f mask; + sched_domain_flags_f sd_flags; + int flags; + int numa_level; + struct sd_data data; + char *name; +}; + +enum membarrier_cmd { + MEMBARRIER_CMD_QUERY = 0, + MEMBARRIER_CMD_GLOBAL = 1, + MEMBARRIER_CMD_GLOBAL_EXPEDITED = 2, + MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = 4, + MEMBARRIER_CMD_PRIVATE_EXPEDITED = 8, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = 16, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = 32, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = 64, + MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = 128, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = 256, + MEMBARRIER_CMD_SHARED = 1, +}; + +enum membarrier_cmd_flag { + MEMBARRIER_CMD_FLAG_CPU = 1, +}; + +enum cpuacct_stat_index { + CPUACCT_STAT_USER = 0, + CPUACCT_STAT_SYSTEM = 1, + CPUACCT_STAT_NSTATS = 2, +}; + +struct cpuacct { + struct cgroup_subsys_state css; + u64 *cpuusage; + struct kernel_cpustat *cpustat; +}; + +struct sugov_tunables { + struct gov_attr_set attr_set; + unsigned int rate_limit_us; +}; + +struct sugov_policy { + struct cpufreq_policy *policy; + struct sugov_tunables *tunables; + struct list_head tunables_hook; + raw_spinlock_t update_lock; + u64 last_freq_update_time; + s64 freq_update_delay_ns; + unsigned int next_freq; + unsigned int cached_raw_freq; + struct irq_work irq_work; + struct kthread_work work; + struct mutex work_lock; + struct kthread_worker worker; + struct task_struct *thread; + bool work_in_progress; + bool limits_changed; + bool need_freq_update; +}; + +struct sugov_cpu { + struct update_util_data update_util; + struct sugov_policy *sg_policy; + unsigned int cpu; + bool iowait_boost_pending; + unsigned int iowait_boost; + u64 last_update; + long unsigned int util; + long unsigned int bw_dl; + long unsigned int max; + long unsigned int saved_idle_calls; +}; + +struct s_data { + struct sched_domain **sd; + struct root_domain *rd; +}; + +enum s_alloc { + sa_rootdomain = 0, + sa_sd = 1, + sa_sd_storage = 2, + sa_none = 3, +}; + +struct asym_cap_data { + struct list_head link; + long unsigned int capacity; + long unsigned int cpus[0]; +}; + +enum hk_flags { + HK_FLAG_TIMER = 1, + HK_FLAG_RCU = 2, + HK_FLAG_MISC = 4, + HK_FLAG_SCHED = 8, + HK_FLAG_TICK = 16, + HK_FLAG_DOMAIN = 32, + HK_FLAG_WQ = 64, + HK_FLAG_MANAGED_IRQ = 128, + HK_FLAG_KTHREAD = 256, +}; + +struct housekeeping { + struct cpumask cpumasks[9]; + long unsigned int flags; +}; + +typedef unsigned int uInt; + +struct nvs_region { + __u64 phys_start; + __u64 size; + struct list_head node; +}; + +struct trace_event_raw_dma_fence { + struct trace_entry ent; + u32 __data_loc_driver; + u32 __data_loc_timeline; + unsigned int context; + unsigned int seqno; + char __data[0]; +}; + +struct trace_event_data_offsets_dma_fence { + u32 driver; + u32 timeline; +}; + +typedef void (*btf_trace_dma_fence_emit)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_init)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_destroy)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_enable_signal)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_signaled)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_start)(void *, struct dma_fence *); + +typedef void (*btf_trace_dma_fence_wait_end)(void *, struct dma_fence *); + +struct default_wait_cb { + struct dma_fence_cb base; + struct task_struct *task; +}; + +enum { + ETHTOOL_A_PAUSE_STAT_UNSPEC = 0, + ETHTOOL_A_PAUSE_STAT_PAD = 1, + ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 2, + ETHTOOL_A_PAUSE_STAT_RX_FRAMES = 3, + __ETHTOOL_A_PAUSE_STAT_CNT = 4, + ETHTOOL_A_PAUSE_STAT_MAX = 3, +}; + +struct pause_reply_data { + struct ethnl_reply_data base; + struct ethtool_pauseparam pauseparam; + struct ethtool_pause_stats pausestat; +}; + +struct ping_table { + struct hlist_nulls_head hash[64]; + spinlock_t lock; +}; + +struct mutex_waiter { + struct list_head list; + struct task_struct *task; + struct ww_acquire_ctx *ww_ctx; + void *magic; +}; + +struct trace_event_raw_lock_acquire { + struct trace_entry ent; + unsigned int flags; + u32 __data_loc_name; + void *lockdep_addr; + char __data[0]; +}; + +struct trace_event_raw_lock { + struct trace_entry ent; + u32 __data_loc_name; + void *lockdep_addr; + char __data[0]; +}; + +struct trace_event_raw_contention_begin { + struct trace_entry ent; + void *lock_addr; + unsigned int flags; + char __data[0]; +}; + +struct trace_event_raw_contention_end { + struct trace_entry ent; + void *lock_addr; + int ret; + char __data[0]; +}; + +struct trace_event_data_offsets_lock_acquire { + u32 name; +}; + +struct trace_event_data_offsets_lock { + u32 name; +}; + +struct trace_event_data_offsets_contention_begin {}; + +struct trace_event_data_offsets_contention_end {}; + +typedef void (*btf_trace_lock_acquire)(void *, struct lockdep_map *, unsigned int, int, int, int, struct lockdep_map *, long unsigned int); + +typedef void (*btf_trace_lock_release)(void *, struct lockdep_map *, long unsigned int); + +typedef void (*btf_trace_contention_begin)(void *, void *, unsigned int); + +typedef void (*btf_trace_contention_end)(void *, void *, int); + +enum stat_item { + ALLOC_FASTPATH = 0, + ALLOC_SLOWPATH = 1, + FREE_FASTPATH = 2, + FREE_SLOWPATH = 3, + FREE_FROZEN = 4, + FREE_ADD_PARTIAL = 5, + FREE_REMOVE_PARTIAL = 6, + ALLOC_FROM_PARTIAL = 7, + ALLOC_SLAB = 8, + ALLOC_REFILL = 9, + ALLOC_NODE_MISMATCH = 10, + FREE_SLAB = 11, + CPUSLAB_FLUSH = 12, + DEACTIVATE_FULL = 13, + DEACTIVATE_EMPTY = 14, + DEACTIVATE_TO_HEAD = 15, + DEACTIVATE_TO_TAIL = 16, + DEACTIVATE_REMOTE_FREES = 17, + DEACTIVATE_BYPASS = 18, + ORDER_FALLBACK = 19, + CMPXCHG_DOUBLE_CPU_FAIL = 20, + CMPXCHG_DOUBLE_FAIL = 21, + CPU_PARTIAL_ALLOC = 22, + CPU_PARTIAL_FREE = 23, + CPU_PARTIAL_NODE = 24, + CPU_PARTIAL_DRAIN = 25, + NR_SLUB_STAT_ITEMS = 26, +}; + +struct partial_context { + struct slab **slab; + gfp_t flags; + unsigned int orig_size; +}; + +struct track { + long unsigned int addr; + depot_stack_handle_t handle; + int cpu; + int pid; + long unsigned int when; +}; + +enum track_item { + TRACK_ALLOC = 0, + TRACK_FREE = 1, +}; + +struct slub_flush_work { + struct work_struct work; + struct kmem_cache *s; + bool skip; +}; + +struct detached_freelist { + struct slab *slab; + void *tail; + void *freelist; + int cnt; + struct kmem_cache *s; +}; + +struct location { + depot_stack_handle_t handle; + long unsigned int count; + long unsigned int addr; + long unsigned int waste; + long long int sum_time; + long int min_time; + long int max_time; + long int min_pid; + long int max_pid; + long unsigned int cpus[2]; + nodemask_t nodes; +}; + +struct loc_track { + long unsigned int max; + long unsigned int count; + struct location *loc; + loff_t idx; +}; + +enum slab_stat_type { + SL_ALL = 0, + SL_PARTIAL = 1, + SL_CPU = 2, + SL_OBJECTS = 3, + SL_TOTAL = 4, +}; + +struct slab_attribute { + struct attribute attr; + ssize_t (*show)(struct kmem_cache *, char *); + ssize_t (*store)(struct kmem_cache *, const char *, size_t); +}; + +struct saved_alias { + struct kmem_cache *s; + const char *name; + struct saved_alias *next; +}; + +enum slab_modes { + M_NONE = 0, + M_PARTIAL = 1, + M_FREE = 2, + M_FULL_NOLIST = 3, +}; + +struct acpipnp_parse_option_s { + struct pnp_dev *dev; + unsigned int option_flags; +}; + +struct focaltech_finger_state { + bool active; + bool valid; + unsigned int x; + unsigned int y; +}; + +struct focaltech_hw_state { + struct focaltech_finger_state fingers[5]; + unsigned int width; + bool pressed; +}; + +struct focaltech_data { + unsigned int x_max; + unsigned int y_max; + struct focaltech_hw_state state; +}; + +enum { + ETHTOOL_A_STRING_UNSPEC = 0, + ETHTOOL_A_STRING_INDEX = 1, + ETHTOOL_A_STRING_VALUE = 2, + __ETHTOOL_A_STRING_CNT = 3, + ETHTOOL_A_STRING_MAX = 2, +}; + +enum { + ETHTOOL_A_STRINGS_UNSPEC = 0, + ETHTOOL_A_STRINGS_STRING = 1, + __ETHTOOL_A_STRINGS_CNT = 2, + ETHTOOL_A_STRINGS_MAX = 1, +}; + +enum { + ETHTOOL_A_STRINGSET_UNSPEC = 0, + ETHTOOL_A_STRINGSET_ID = 1, + ETHTOOL_A_STRINGSET_COUNT = 2, + ETHTOOL_A_STRINGSET_STRINGS = 3, + __ETHTOOL_A_STRINGSET_CNT = 4, + ETHTOOL_A_STRINGSET_MAX = 3, +}; + +enum { + ETHTOOL_A_STRINGSETS_UNSPEC = 0, + ETHTOOL_A_STRINGSETS_STRINGSET = 1, + __ETHTOOL_A_STRINGSETS_CNT = 2, + ETHTOOL_A_STRINGSETS_MAX = 1, +}; + +struct strset_info { + bool per_dev; + bool free_strings; + unsigned int count; + const char (*strings)[32]; +}; + +struct strset_req_info { + struct ethnl_req_info base; + u32 req_ids; + bool counts_only; +}; + +struct strset_reply_data { + struct ethnl_reply_data base; + struct strset_info sets[21]; +}; + +struct semaphore_waiter { + struct list_head list; + struct task_struct *task; + bool up; +}; + +struct bpf_cpumap_val { + __u32 qsize; + union { + int fd; + __u32 id; + } bpf_prog; +}; + +struct bpf_cpu_map_entry; + +struct xdp_bulk_queue { + void *q[8]; + struct list_head flush_node; + struct bpf_cpu_map_entry *obj; + unsigned int count; +}; + +struct bpf_cpu_map; + +struct bpf_cpu_map_entry { + u32 cpu; + int map_id; + struct xdp_bulk_queue *bulkq; + struct bpf_cpu_map *cmap; + struct ptr_ring *queue; + struct task_struct *kthread; + struct bpf_cpumap_val value; + struct bpf_prog *prog; + atomic_t refcnt; + struct callback_head rcu; + struct work_struct kthread_stop_wq; +}; + +struct bpf_cpu_map { + struct bpf_map map; + struct bpf_cpu_map_entry **cpu_map; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct netif_security_struct { + struct net *ns; + int ifindex; + u32 sid; +}; + +struct sel_netif { + struct list_head list; + struct netif_security_struct nsec; + struct callback_head callback_head; +}; + +struct acpi_prt_entry { + struct acpi_pci_id id; + u8 pin; + acpi_handle link; + u32 index; +}; + +struct prt_quirk { + const struct dmi_system_id *system; + unsigned int segment; + unsigned int bus; + unsigned int device; + unsigned char pin; + const char *source; + const char *actual_source; +}; + +enum { + VP_MSIX_CONFIG_VECTOR = 0, + VP_MSIX_VQ_VECTOR = 1, +}; + +struct iosys_map { + union { + void *vaddr_iomem; + void *vaddr; + }; + bool is_iomem; +}; + +struct dma_buf; + +struct dma_buf_attachment; + +struct dma_buf_ops { + bool cache_sgt_mapping; + int (*attach)(struct dma_buf *, struct dma_buf_attachment *); + void (*detach)(struct dma_buf *, struct dma_buf_attachment *); + int (*pin)(struct dma_buf_attachment *); + void (*unpin)(struct dma_buf_attachment *); + struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *, enum dma_data_direction); + void (*unmap_dma_buf)(struct dma_buf_attachment *, struct sg_table *, enum dma_data_direction); + void (*release)(struct dma_buf *); + int (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*end_cpu_access)(struct dma_buf *, enum dma_data_direction); + int (*mmap)(struct dma_buf *, struct vm_area_struct *); + int (*vmap)(struct dma_buf *, struct iosys_map *); + void (*vunmap)(struct dma_buf *, struct iosys_map *); +}; + +struct dma_buf_poll_cb_t { + struct dma_fence_cb cb; + wait_queue_head_t *poll; + __poll_t active; +}; + +struct dma_buf { + size_t size; + struct file *file; + struct list_head attachments; + const struct dma_buf_ops *ops; + unsigned int vmapping_counter; + struct iosys_map vmap_ptr; + const char *exp_name; + const char *name; + spinlock_t name_lock; + struct module *owner; + struct list_head list_node; + void *priv; + struct dma_resv *resv; + wait_queue_head_t poll; + struct dma_buf_poll_cb_t cb_in; + struct dma_buf_poll_cb_t cb_out; +}; + +struct dma_buf_attach_ops; + +struct dma_buf_attachment { + struct dma_buf *dmabuf; + struct device *dev; + struct list_head node; + struct sg_table *sgt; + enum dma_data_direction dir; + bool peer2peer; + const struct dma_buf_attach_ops *importer_ops; + void *importer_priv; + void *priv; +}; + +struct dma_buf_attach_ops { + bool allow_peer2peer; + void (*move_notify)(struct dma_buf_attachment *); +}; + +struct dma_buf_export_info { + const char *exp_name; + struct module *owner; + const struct dma_buf_ops *ops; + size_t size; + int flags; + struct dma_resv *resv; + void *priv; +}; + +struct dma_buf_sync { + __u64 flags; +}; + +struct dma_buf_export_sync_file { + __u32 flags; + __s32 fd; +}; + +struct dma_buf_import_sync_file { + __u32 flags; + __s32 fd; +}; + +struct dma_buf_list { + struct list_head head; + struct mutex lock; +}; + +struct module_reply_data { + struct ethnl_reply_data base; + struct ethtool_module_power_mode_params power; +}; + +struct nhmsg { + unsigned char nh_family; + unsigned char nh_scope; + unsigned char nh_protocol; + unsigned char resvd; + unsigned int nh_flags; +}; + +struct nexthop_grp { + __u32 id; + __u8 weight; + __u8 resvd1; + __u16 resvd2; +}; + +enum { + NEXTHOP_GRP_TYPE_MPATH = 0, + NEXTHOP_GRP_TYPE_RES = 1, + __NEXTHOP_GRP_TYPE_MAX = 2, +}; + +enum { + NHA_UNSPEC = 0, + NHA_ID = 1, + NHA_GROUP = 2, + NHA_GROUP_TYPE = 3, + NHA_BLACKHOLE = 4, + NHA_OIF = 5, + NHA_GATEWAY = 6, + NHA_ENCAP_TYPE = 7, + NHA_ENCAP = 8, + NHA_GROUPS = 9, + NHA_MASTER = 10, + NHA_FDB = 11, + NHA_RES_GROUP = 12, + NHA_RES_BUCKET = 13, + __NHA_MAX = 14, +}; + +enum { + NHA_RES_GROUP_UNSPEC = 0, + NHA_RES_GROUP_PAD = 0, + NHA_RES_GROUP_BUCKETS = 1, + NHA_RES_GROUP_IDLE_TIMER = 2, + NHA_RES_GROUP_UNBALANCED_TIMER = 3, + NHA_RES_GROUP_UNBALANCED_TIME = 4, + __NHA_RES_GROUP_MAX = 5, +}; + +enum { + NHA_RES_BUCKET_UNSPEC = 0, + NHA_RES_BUCKET_PAD = 0, + NHA_RES_BUCKET_INDEX = 1, + NHA_RES_BUCKET_IDLE_TIME = 2, + NHA_RES_BUCKET_NH_ID = 3, + __NHA_RES_BUCKET_MAX = 4, +}; + +struct nh_config { + u32 nh_id; + u8 nh_family; + u8 nh_protocol; + u8 nh_blackhole; + u8 nh_fdb; + u32 nh_flags; + int nh_ifindex; + struct net_device *dev; + union { + __be32 ipv4; + struct in6_addr ipv6; + } gw; + struct nlattr *nh_grp; + u16 nh_grp_type; + u16 nh_grp_res_num_buckets; + long unsigned int nh_grp_res_idle_timer; + long unsigned int nh_grp_res_unbalanced_timer; + bool nh_grp_res_has_num_buckets; + bool nh_grp_res_has_idle_timer; + bool nh_grp_res_has_unbalanced_timer; + struct nlattr *nh_encap; + u16 nh_encap_type; + u32 nlflags; + struct nl_info nlinfo; +}; + +struct nh_dump_filter { + u32 nh_id; + int dev_idx; + int master_idx; + bool group_filter; + bool fdb_filter; + u32 res_bucket_nh_id; +}; + +struct rtm_dump_nh_ctx { + u32 idx; +}; + +struct rtm_dump_res_bucket_ctx { + struct rtm_dump_nh_ctx nh; + u16 bucket_index; + u32 done_nh_idx; +}; + +struct rtm_dump_nexthop_bucket_data { + struct rtm_dump_res_bucket_ctx *ctx; + struct nh_dump_filter filter; +}; + +struct l3mdev_handler { + lookup_by_table_id_t dev_lookup; +}; + +enum rwsem_waiter_type { + RWSEM_WAITING_FOR_WRITE = 0, + RWSEM_WAITING_FOR_READ = 1, +}; + +struct rwsem_waiter { + struct list_head list; + struct task_struct *task; + enum rwsem_waiter_type type; + long unsigned int timeout; + bool handoff_set; +}; + +enum rwsem_wake_type { + RWSEM_WAKE_ANY = 0, + RWSEM_WAKE_READERS = 1, + RWSEM_WAKE_READ_OWNED = 2, +}; + +enum owner_state { + OWNER_NULL = 1, + OWNER_WRITER = 2, + OWNER_READER = 4, + OWNER_NONSPINNABLE = 8, +}; + +typedef u64 (*btf_bpf_cgrp_storage_get)(struct bpf_map *, struct cgroup *, void *, u64, gfp_t); + +typedef u64 (*btf_bpf_cgrp_storage_delete)(struct bpf_map *, struct cgroup *); + +struct userfaultfd_ctx { + wait_queue_head_t fault_pending_wqh; + wait_queue_head_t fault_wqh; + wait_queue_head_t fd_wqh; + wait_queue_head_t event_wqh; + seqcount_spinlock_t refile_seq; + refcount_t refcount; + unsigned int flags; + unsigned int features; + bool released; + atomic_t mmap_changing; + struct mm_struct *mm; +}; + +struct uffd_msg { + __u8 event; + __u8 reserved1; + __u16 reserved2; + __u32 reserved3; + union { + struct { + __u64 flags; + __u64 address; + union { + __u32 ptid; + } feat; + } pagefault; + struct { + __u32 ufd; + } fork; + struct { + __u64 from; + __u64 to; + __u64 len; + } remap; + struct { + __u64 start; + __u64 end; + } remove; + struct { + __u64 reserved1; + __u64 reserved2; + __u64 reserved3; + } reserved; + } arg; +}; + +struct uffdio_api { + __u64 api; + __u64 features; + __u64 ioctls; +}; + +struct uffdio_range { + __u64 start; + __u64 len; +}; + +struct uffdio_register { + struct uffdio_range range; + __u64 mode; + __u64 ioctls; +}; + +struct uffdio_copy { + __u64 dst; + __u64 src; + __u64 len; + __u64 mode; + __s64 copy; +}; + +struct uffdio_zeropage { + struct uffdio_range range; + __u64 mode; + __s64 zeropage; +}; + +struct uffdio_writeprotect { + struct uffdio_range range; + __u64 mode; +}; + +struct uffdio_continue { + struct uffdio_range range; + __u64 mode; + __s64 mapped; +}; + +struct userfaultfd_fork_ctx { + struct userfaultfd_ctx *orig; + struct userfaultfd_ctx *new; + struct list_head list; +}; + +struct userfaultfd_unmap_ctx { + struct userfaultfd_ctx *ctx; + long unsigned int start; + long unsigned int end; + struct list_head list; +}; + +struct userfaultfd_wait_queue { + struct uffd_msg msg; + wait_queue_entry_t wq; + struct userfaultfd_ctx *ctx; + bool waken; +}; + +struct userfaultfd_wake_range { + long unsigned int start; + long unsigned int len; +}; + +typedef short unsigned int __kernel_uid16_t; + +typedef short unsigned int __kernel_gid16_t; + +typedef __kernel_uid16_t uid16_t; + +typedef __kernel_gid16_t gid16_t; + +struct mpage_da_data { + struct inode *inode; + struct writeback_control *wbc; + unsigned int can_map: 1; + long unsigned int first_page; + long unsigned int next_page; + long unsigned int last_page; + struct ext4_map_blocks map; + struct ext4_io_submit io_submit; + unsigned int do_map: 1; + unsigned int scanned_until_end: 1; +}; + +struct memdev { + const char *name; + umode_t mode; + const struct file_operations *fops; + fmode_t fmode; +}; + +enum { + CTRL_CMD_UNSPEC = 0, + CTRL_CMD_NEWFAMILY = 1, + CTRL_CMD_DELFAMILY = 2, + CTRL_CMD_GETFAMILY = 3, + CTRL_CMD_NEWOPS = 4, + CTRL_CMD_DELOPS = 5, + CTRL_CMD_GETOPS = 6, + CTRL_CMD_NEWMCAST_GRP = 7, + CTRL_CMD_DELMCAST_GRP = 8, + CTRL_CMD_GETMCAST_GRP = 9, + CTRL_CMD_GETPOLICY = 10, + __CTRL_CMD_MAX = 11, +}; + +enum { + CTRL_ATTR_UNSPEC = 0, + CTRL_ATTR_FAMILY_ID = 1, + CTRL_ATTR_FAMILY_NAME = 2, + CTRL_ATTR_VERSION = 3, + CTRL_ATTR_HDRSIZE = 4, + CTRL_ATTR_MAXATTR = 5, + CTRL_ATTR_OPS = 6, + CTRL_ATTR_MCAST_GROUPS = 7, + CTRL_ATTR_POLICY = 8, + CTRL_ATTR_OP_POLICY = 9, + CTRL_ATTR_OP = 10, + __CTRL_ATTR_MAX = 11, +}; + +enum { + CTRL_ATTR_OP_UNSPEC = 0, + CTRL_ATTR_OP_ID = 1, + CTRL_ATTR_OP_FLAGS = 2, + __CTRL_ATTR_OP_MAX = 3, +}; + +enum { + CTRL_ATTR_MCAST_GRP_UNSPEC = 0, + CTRL_ATTR_MCAST_GRP_NAME = 1, + CTRL_ATTR_MCAST_GRP_ID = 2, + __CTRL_ATTR_MCAST_GRP_MAX = 3, +}; + +enum { + CTRL_ATTR_POLICY_UNSPEC = 0, + CTRL_ATTR_POLICY_DO = 1, + CTRL_ATTR_POLICY_DUMP = 2, + __CTRL_ATTR_POLICY_DUMP_MAX = 3, + CTRL_ATTR_POLICY_DUMP_MAX = 2, +}; + +struct genl_op_iter { + const struct genl_family *family; + struct genl_split_ops doit; + struct genl_split_ops dumpit; + int cmd_idx; + int entry_idx; + u32 cmd; + u8 flags; +}; + +struct genl_start_context { + const struct genl_family *family; + struct nlmsghdr *nlh; + struct netlink_ext_ack *extack; + const struct genl_split_ops *ops; + int hdrlen; +}; + +struct netlink_policy_dump_state; + +struct ctrl_dump_policy_ctx { + struct netlink_policy_dump_state *state; + const struct genl_family *rt; + struct genl_op_iter *op_iter; + u32 op; + u16 fam_id; + u8 dump_map: 1; + u8 single_op: 1; +}; + +enum xt_statistic_mode { + XT_STATISTIC_MODE_RANDOM = 0, + XT_STATISTIC_MODE_NTH = 1, + __XT_STATISTIC_MODE_MAX = 2, +}; + +enum xt_statistic_flags { + XT_STATISTIC_INVERT = 1, +}; + +struct xt_statistic_priv; + +struct xt_statistic_info { + __u16 mode; + __u16 flags; + union { + struct { + __u32 probability; + } random; + struct { + __u32 every; + __u32 packet; + __u32 count; + } nth; + } u; + struct xt_statistic_priv *master; +}; + +struct xt_statistic_priv { + atomic_t count; + long: 32; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; + long: 64; +}; + +struct trace_event_raw_preemptirq_template { + struct trace_entry ent; + s32 caller_offs; + s32 parent_offs; + char __data[0]; +}; + +struct trace_event_data_offsets_preemptirq_template {}; + +typedef void (*btf_trace_irq_disable)(void *, long unsigned int, long unsigned int); + +typedef void (*btf_trace_irq_enable)(void *, long unsigned int, long unsigned int); + +struct trace_event_raw_cma_alloc_class { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int pfn; + const struct page *page; + long unsigned int count; + unsigned int align; + char __data[0]; +}; + +struct trace_event_raw_cma_release { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int pfn; + const struct page *page; + long unsigned int count; + char __data[0]; +}; + +struct trace_event_raw_cma_alloc_start { + struct trace_entry ent; + u32 __data_loc_name; + long unsigned int count; + unsigned int align; + char __data[0]; +}; + +struct trace_event_data_offsets_cma_alloc_class { + u32 name; +}; + +struct trace_event_data_offsets_cma_release { + u32 name; +}; + +struct trace_event_data_offsets_cma_alloc_start { + u32 name; +}; + +typedef void (*btf_trace_cma_release)(void *, const char *, long unsigned int, const struct page *, long unsigned int); + +typedef void (*btf_trace_cma_alloc_start)(void *, const char *, long unsigned int, unsigned int); + +typedef void (*btf_trace_cma_alloc_finish)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int); + +typedef void (*btf_trace_cma_alloc_busy_retry)(void *, const char *, long unsigned int, const struct page *, long unsigned int, unsigned int); + +enum sel_inos { + SEL_ROOT_INO = 2, + SEL_LOAD = 3, + SEL_ENFORCE = 4, + SEL_CONTEXT = 5, + SEL_ACCESS = 6, + SEL_CREATE = 7, + SEL_RELABEL = 8, + SEL_USER = 9, + SEL_POLICYVERS = 10, + SEL_COMMIT_BOOLS = 11, + SEL_MLS = 12, + SEL_DISABLE = 13, + SEL_MEMBER = 14, + SEL_CHECKREQPROT = 15, + SEL_COMPAT_NET = 16, + SEL_REJECT_UNKNOWN = 17, + SEL_DENY_UNKNOWN = 18, + SEL_STATUS = 19, + SEL_POLICY = 20, + SEL_VALIDATE_TRANS = 21, + SEL_INO_NEXT = 22, +}; + +struct selinux_fs_info { + struct dentry *bool_dir; + unsigned int bool_num; + char **bool_pending_names; + int *bool_pending_values; + struct dentry *class_dir; + long unsigned int last_class_ino; + bool policy_opened; + struct dentry *policycap_dir; + long unsigned int last_ino; + struct selinux_state *state; + struct super_block *sb; +}; + +struct policy_load_memory { + size_t len; + void *data; +}; + +struct internal_container { + struct klist_node node; + struct attribute_container *cont; + struct device classdev; +}; + +enum power_supply_notifier_events { + PSY_EVENT_PROP_CHANGED = 0, +}; + +struct power_supply_battery_ocv_table { + int ocv; + int capacity; +}; + +struct power_supply_resistance_temp_table { + int temp; + int resistance; +}; + +struct power_supply_vbat_ri_table { + int vbat_uv; + int ri_uohm; +}; + +struct power_supply_maintenance_charge_table { + int charge_current_max_ua; + int charge_voltage_max_uv; + int charge_safety_timer_minutes; +}; + +struct power_supply_battery_info { + unsigned int technology; + int energy_full_design_uwh; + int charge_full_design_uah; + int voltage_min_design_uv; + int voltage_max_design_uv; + int tricklecharge_current_ua; + int precharge_current_ua; + int precharge_voltage_max_uv; + int charge_term_current_ua; + int charge_restart_voltage_uv; + int overvoltage_limit_uv; + int constant_charge_current_max_ua; + int constant_charge_voltage_max_uv; + struct power_supply_maintenance_charge_table *maintenance_charge; + int maintenance_charge_size; + int alert_low_temp_charge_current_ua; + int alert_low_temp_charge_voltage_uv; + int alert_high_temp_charge_current_ua; + int alert_high_temp_charge_voltage_uv; + int factory_internal_resistance_uohm; + int factory_internal_resistance_charging_uohm; + int ocv_temp[20]; + int temp_ambient_alert_min; + int temp_ambient_alert_max; + int temp_alert_min; + int temp_alert_max; + int temp_min; + int temp_max; + struct power_supply_battery_ocv_table *ocv_table[20]; + int ocv_table_size[20]; + struct power_supply_resistance_temp_table *resist_table; + int resist_table_size; + struct power_supply_vbat_ri_table *vbat2ri_discharging; + int vbat2ri_discharging_size; + struct power_supply_vbat_ri_table *vbat2ri_charging; + int vbat2ri_charging_size; + int bti_resistance_ohm; + int bti_resistance_tolerance; +}; + +struct psy_am_i_supplied_data { + struct power_supply *psy; + unsigned int count; +}; + +struct psy_get_supplier_prop_data { + struct power_supply *psy; + enum power_supply_property psp; + union power_supply_propval *val; +}; + +struct gnet_estimator { + signed char interval; + unsigned char ewma_log; +}; + +struct net_rate_estimator { + struct gnet_stats_basic_sync *bstats; + spinlock_t *stats_lock; + bool running; + struct gnet_stats_basic_sync *cpu_bstats; + u8 ewma_log; + u8 intvl_log; + seqcount_t seq; + u64 last_packets; + u64 last_bytes; + u64 avpps; + u64 avbps; + long unsigned int next_jiffies; + struct timer_list timer; + struct callback_head rcu; +}; + +enum { + XT_CT_NOTRACK = 1, + XT_CT_NOTRACK_ALIAS = 2, + XT_CT_ZONE_DIR_ORIG = 4, + XT_CT_ZONE_DIR_REPL = 8, + XT_CT_ZONE_MARK = 16, + XT_CT_MASK = 31, +}; + +struct xt_ct_target_info { + __u16 flags; + __u16 zone; + __u32 ct_events; + __u32 exp_events; + char helper[16]; + struct nf_conn *ct; +}; + +struct xt_ct_target_info_v1 { + __u16 flags; + __u16 zone; + __u32 ct_events; + __u32 exp_events; + char helper[16]; + char timeout[32]; + struct nf_conn *ct; +}; + +struct tcp_diag_md5sig { + __u8 tcpm_family; + __u8 tcpm_prefixlen; + __u16 tcpm_keylen; + __be32 tcpm_addr[4]; + __u8 tcpm_key[80]; +}; + +struct lock_list { + struct list_head entry; + struct lock_class *class; + struct lock_class *links_to; + const struct lock_trace *trace; + u16 distance; + u8 dep; + u8 only_xr; + struct lock_list *parent; +}; + +struct lock_chain { + unsigned int irq_context: 2; + unsigned int depth: 6; + unsigned int base: 24; + struct hlist_node entry; + u64 chain_key; +}; + +enum lock_usage_bit { + LOCK_USED_IN_HARDIRQ = 0, + LOCK_USED_IN_HARDIRQ_READ = 1, + LOCK_ENABLED_HARDIRQ = 2, + LOCK_ENABLED_HARDIRQ_READ = 3, + LOCK_USED_IN_SOFTIRQ = 4, + LOCK_USED_IN_SOFTIRQ_READ = 5, + LOCK_ENABLED_SOFTIRQ = 6, + LOCK_ENABLED_SOFTIRQ_READ = 7, + LOCK_USED = 8, + LOCK_USED_READ = 9, + LOCK_USAGE_STATES = 10, +}; + +enum { + LOCKF_USED_IN_HARDIRQ = 1, + LOCKF_USED_IN_HARDIRQ_READ = 2, + LOCKF_ENABLED_HARDIRQ = 4, + LOCKF_ENABLED_HARDIRQ_READ = 8, + LOCKF_USED_IN_SOFTIRQ = 16, + LOCKF_USED_IN_SOFTIRQ_READ = 32, + LOCKF_ENABLED_SOFTIRQ = 64, + LOCKF_ENABLED_SOFTIRQ_READ = 128, + LOCKF_USED = 256, + LOCKF_USED_READ = 512, +}; + +struct pending_free { + struct list_head zapped; + long unsigned int lock_chains_being_freed[1024]; +}; + +struct delayed_free { + struct callback_head callback_head; + int index; + int scheduled; + struct pending_free pf[2]; +}; + +struct circular_queue { + struct lock_list *element[4096]; + unsigned int front; + unsigned int rear; +}; + +enum bfs_result { + BFS_EINVALIDNODE = -2, + BFS_EQUEUEFULL = -1, + BFS_RMATCH = 0, + BFS_RNOMATCH = 1, +}; + +struct posix_acl_xattr_entry { + __le16 e_tag; + __le16 e_perm; + __le32 e_id; +}; + +struct posix_acl_xattr_header { + __le32 a_version; +}; + +enum { + attr_noop = 0, + attr_delayed_allocation_blocks = 1, + attr_session_write_kbytes = 2, + attr_lifetime_write_kbytes = 3, + attr_reserved_clusters = 4, + attr_sra_exceeded_retry_limit = 5, + attr_inode_readahead = 6, + attr_trigger_test_error = 7, + attr_first_error_time = 8, + attr_last_error_time = 9, + attr_feature = 10, + attr_pointer_ui = 11, + attr_pointer_ul = 12, + attr_pointer_u64 = 13, + attr_pointer_u8 = 14, + attr_pointer_string = 15, + attr_pointer_atomic = 16, + attr_journal_task = 17, +}; + +enum { + ptr_explicit = 0, + ptr_ext4_sb_info_offset = 1, + ptr_ext4_super_block_offset = 2, +}; + +struct ext4_attr { + struct attribute attr; + short int attr_id; + short int attr_ptr; + short unsigned int attr_size; + union { + int offset; + void *explicit_ptr; + } u; +}; + +struct sha512_state { + u64 state[8]; + u64 count[2]; + u8 buf[128]; +}; + +typedef void sha512_block_fn(struct sha512_state *, const u8 *, int); + +struct mac_partition { + __be16 signature; + __be16 res1; + __be32 map_count; + __be32 start_block; + __be32 block_count; + char name[32]; + char type[32]; + __be32 data_start; + __be32 data_count; + __be32 status; + __be32 boot_start; + __be32 boot_size; + __be32 boot_load; + __be32 boot_load2; + __be32 boot_entry; + __be32 boot_entry2; + __be32 boot_cksum; + char processor[16]; +}; + +struct mac_driver_desc { + __be16 signature; + __be16 block_size; + __be32 block_count; +}; + +typedef unsigned int FSE_DTable; + +typedef struct { + size_t state; + const void *table; +} FSE_DState_t; + +typedef struct { + U16 tableLog; + U16 fastMode; +} FSE_DTableHeader; + +typedef struct { + short unsigned int newState; + unsigned char symbol; + unsigned char nbBits; +} FSE_decode_t; + +typedef struct { + short int ncount[256]; + FSE_DTable dtable[1]; +} FSE_DecompressWksp; + +struct pciserial_board { + unsigned int flags; + unsigned int num_ports; + unsigned int base_baud; + unsigned int uart_offset; + unsigned int reg_shift; + unsigned int first_offset; +}; + +struct serial_private; + +struct pci_serial_quirk { + u32 vendor; + u32 device; + u32 subvendor; + u32 subdevice; + int (*probe)(struct pci_dev *); + int (*init)(struct pci_dev *); + int (*setup)(struct serial_private *, const struct pciserial_board *, struct uart_8250_port *, int); + void (*exit)(struct pci_dev *); +}; + +struct serial_private { + struct pci_dev *dev; + unsigned int nr; + struct pci_serial_quirk *quirk; + const struct pciserial_board *board; + int line[0]; +}; + +struct f815xxa_data { + spinlock_t lock; + int idx; +}; + +struct timedia_struct { + int num; + const short unsigned int *ids; +}; + +enum pci_board_num_t { + pbn_default = 0, + pbn_b0_1_115200 = 1, + pbn_b0_2_115200 = 2, + pbn_b0_4_115200 = 3, + pbn_b0_5_115200 = 4, + pbn_b0_8_115200 = 5, + pbn_b0_1_921600 = 6, + pbn_b0_2_921600 = 7, + pbn_b0_4_921600 = 8, + pbn_b0_2_1130000 = 9, + pbn_b0_4_1152000 = 10, + pbn_b0_4_1250000 = 11, + pbn_b0_2_1843200 = 12, + pbn_b0_4_1843200 = 13, + pbn_b0_1_15625000 = 14, + pbn_b0_bt_1_115200 = 15, + pbn_b0_bt_2_115200 = 16, + pbn_b0_bt_4_115200 = 17, + pbn_b0_bt_8_115200 = 18, + pbn_b0_bt_1_460800 = 19, + pbn_b0_bt_2_460800 = 20, + pbn_b0_bt_4_460800 = 21, + pbn_b0_bt_1_921600 = 22, + pbn_b0_bt_2_921600 = 23, + pbn_b0_bt_4_921600 = 24, + pbn_b0_bt_8_921600 = 25, + pbn_b1_1_115200 = 26, + pbn_b1_2_115200 = 27, + pbn_b1_4_115200 = 28, + pbn_b1_8_115200 = 29, + pbn_b1_16_115200 = 30, + pbn_b1_1_921600 = 31, + pbn_b1_2_921600 = 32, + pbn_b1_4_921600 = 33, + pbn_b1_8_921600 = 34, + pbn_b1_2_1250000 = 35, + pbn_b1_bt_1_115200 = 36, + pbn_b1_bt_2_115200 = 37, + pbn_b1_bt_4_115200 = 38, + pbn_b1_bt_2_921600 = 39, + pbn_b1_1_1382400 = 40, + pbn_b1_2_1382400 = 41, + pbn_b1_4_1382400 = 42, + pbn_b1_8_1382400 = 43, + pbn_b2_1_115200 = 44, + pbn_b2_2_115200 = 45, + pbn_b2_4_115200 = 46, + pbn_b2_8_115200 = 47, + pbn_b2_1_460800 = 48, + pbn_b2_4_460800 = 49, + pbn_b2_8_460800 = 50, + pbn_b2_16_460800 = 51, + pbn_b2_1_921600 = 52, + pbn_b2_4_921600 = 53, + pbn_b2_8_921600 = 54, + pbn_b2_8_1152000 = 55, + pbn_b2_bt_1_115200 = 56, + pbn_b2_bt_2_115200 = 57, + pbn_b2_bt_4_115200 = 58, + pbn_b2_bt_2_921600 = 59, + pbn_b2_bt_4_921600 = 60, + pbn_b3_2_115200 = 61, + pbn_b3_4_115200 = 62, + pbn_b3_8_115200 = 63, + pbn_b4_bt_2_921600 = 64, + pbn_b4_bt_4_921600 = 65, + pbn_b4_bt_8_921600 = 66, + pbn_panacom = 67, + pbn_panacom2 = 68, + pbn_panacom4 = 69, + pbn_plx_romulus = 70, + pbn_oxsemi = 71, + pbn_oxsemi_1_15625000 = 72, + pbn_oxsemi_2_15625000 = 73, + pbn_oxsemi_4_15625000 = 74, + pbn_oxsemi_8_15625000 = 75, + pbn_intel_i960 = 76, + pbn_sgi_ioc3 = 77, + pbn_computone_4 = 78, + pbn_computone_6 = 79, + pbn_computone_8 = 80, + pbn_sbsxrsio = 81, + pbn_pasemi_1682M = 82, + pbn_ni8430_2 = 83, + pbn_ni8430_4 = 84, + pbn_ni8430_8 = 85, + pbn_ni8430_16 = 86, + pbn_ADDIDATA_PCIe_1_3906250 = 87, + pbn_ADDIDATA_PCIe_2_3906250 = 88, + pbn_ADDIDATA_PCIe_4_3906250 = 89, + pbn_ADDIDATA_PCIe_8_3906250 = 90, + pbn_ce4100_1_115200 = 91, + pbn_omegapci = 92, + pbn_NETMOS9900_2s_115200 = 93, + pbn_brcm_trumanage = 94, + pbn_fintek_4 = 95, + pbn_fintek_8 = 96, + pbn_fintek_12 = 97, + pbn_fintek_F81504A = 98, + pbn_fintek_F81508A = 99, + pbn_fintek_F81512A = 100, + pbn_wch382_2 = 101, + pbn_wch384_4 = 102, + pbn_wch384_8 = 103, + pbn_sunix_pci_1s = 104, + pbn_sunix_pci_2s = 105, + pbn_sunix_pci_4s = 106, + pbn_sunix_pci_8s = 107, + pbn_sunix_pci_16s = 108, + pbn_titan_1_4000000 = 109, + pbn_titan_2_4000000 = 110, + pbn_titan_4_4000000 = 111, + pbn_titan_8_4000000 = 112, + pbn_moxa8250_2p = 113, + pbn_moxa8250_4p = 114, + pbn_moxa8250_8p = 115, +}; + +struct firmware_map_entry { + u64 start; + u64 end; + const char *type; + struct list_head list; + struct kobject kobj; +}; + +struct memmap_attribute { + struct attribute attr; + ssize_t (*show)(struct firmware_map_entry *, char *); +}; + +struct tcp_repair_opt { + __u32 opt_code; + __u32 opt_val; +}; + +struct tcp_repair_window { + __u32 snd_wl1; + __u32 snd_wnd; + __u32 max_window; + __u32 rcv_wnd; + __u32 rcv_wup; +}; + +enum { + TCP_NLA_PAD = 0, + TCP_NLA_BUSY = 1, + TCP_NLA_RWND_LIMITED = 2, + TCP_NLA_SNDBUF_LIMITED = 3, + TCP_NLA_DATA_SEGS_OUT = 4, + TCP_NLA_TOTAL_RETRANS = 5, + TCP_NLA_PACING_RATE = 6, + TCP_NLA_DELIVERY_RATE = 7, + TCP_NLA_SND_CWND = 8, + TCP_NLA_REORDERING = 9, + TCP_NLA_MIN_RTT = 10, + TCP_NLA_RECUR_RETRANS = 11, + TCP_NLA_DELIVERY_RATE_APP_LMT = 12, + TCP_NLA_SNDQ_SIZE = 13, + TCP_NLA_CA_STATE = 14, + TCP_NLA_SND_SSTHRESH = 15, + TCP_NLA_DELIVERED = 16, + TCP_NLA_DELIVERED_CE = 17, + TCP_NLA_BYTES_SENT = 18, + TCP_NLA_BYTES_RETRANS = 19, + TCP_NLA_DSACK_DUPS = 20, + TCP_NLA_REORD_SEEN = 21, + TCP_NLA_SRTT = 22, + TCP_NLA_TIMEOUT_REHASH = 23, + TCP_NLA_BYTES_NOTSENT = 24, + TCP_NLA_EDT = 25, + TCP_NLA_TTL = 26, + TCP_NLA_REHASH = 27, +}; + +struct tcp_zerocopy_receive { + __u64 address; + __u32 length; + __u32 recv_skip_hint; + __u32 inq; + __s32 err; + __u64 copybuf_address; + __s32 copybuf_len; + __u32 flags; + __u64 msg_control; + __u64 msg_controllen; + __u32 msg_flags; + __u32 reserved; +}; + +enum { + BPF_TCP_ESTABLISHED = 1, + BPF_TCP_SYN_SENT = 2, + BPF_TCP_SYN_RECV = 3, + BPF_TCP_FIN_WAIT1 = 4, + BPF_TCP_FIN_WAIT2 = 5, + BPF_TCP_TIME_WAIT = 6, + BPF_TCP_CLOSE = 7, + BPF_TCP_CLOSE_WAIT = 8, + BPF_TCP_LAST_ACK = 9, + BPF_TCP_LISTEN = 10, + BPF_TCP_CLOSING = 11, + BPF_TCP_NEW_SYN_RECV = 12, + BPF_TCP_MAX_STATES = 13, +}; + +enum { + TCP_CMSG_INQ = 1, + TCP_CMSG_TS = 2, +}; + +struct tcp_splice_state { + struct pipe_inode_info *pipe; + size_t len; + unsigned int flags; +}; + +struct pm_qos_request { + struct plist_node node; + struct pm_qos_constraints *qos; +}; + +struct bpf_shim_tramp_link { + struct bpf_tramp_link link; + struct bpf_trampoline *trampoline; +}; + +enum pkcs7_actions { + ACT_pkcs7_check_content_type = 0, + ACT_pkcs7_extract_cert = 1, + ACT_pkcs7_note_OID = 2, + ACT_pkcs7_note_certificate_list = 3, + ACT_pkcs7_note_content = 4, + ACT_pkcs7_note_data = 5, + ACT_pkcs7_note_signed_info = 6, + ACT_pkcs7_note_signeddata_version = 7, + ACT_pkcs7_note_signerinfo_version = 8, + ACT_pkcs7_sig_note_authenticated_attr = 9, + ACT_pkcs7_sig_note_digest_algo = 10, + ACT_pkcs7_sig_note_issuer = 11, + ACT_pkcs7_sig_note_pkey_algo = 12, + ACT_pkcs7_sig_note_serial = 13, + ACT_pkcs7_sig_note_set_of_authattrs = 14, + ACT_pkcs7_sig_note_signature = 15, + ACT_pkcs7_sig_note_skid = 16, + NR__pkcs7_actions = 17, +}; + +struct io_splice { + struct file *file_out; + loff_t off_out; + loff_t off_in; + u64 len; + int splice_fd_in; + unsigned int flags; +}; + +struct thunder_pem_pci { + u32 ea_entry[3]; + void *pem_reg_base; +}; + +struct logo_data { + int depth; + int needs_directpalette; + int needs_truepalette; + int needs_cmapreset; + const struct linux_logo *logo; +}; + +struct tpm_info { + struct resource res; + int irq; +}; + +struct tpm_tis_tcg_phy { + struct tpm_tis_data priv; + void *iobase; +}; + +struct power_supply_hwmon { + struct power_supply *psy; + long unsigned int *props; +}; + +struct hwmon_type_attr_list { + const u32 *attrs; + size_t n_attrs; +}; + +struct tcp_plb_state { + u8 consec_cong_rounds: 5; + u8 unused: 3; + u32 pause_until; +}; + +struct unix_stream_read_state { + int (*recv_actor)(struct sk_buff *, int, int, struct unix_stream_read_state *); + struct socket *socket; + struct msghdr *msg; + struct pipe_inode_info *pipe; + size_t size; + int flags; + unsigned int splice_flags; +}; + +struct bpf_unix_iter_state { + struct seq_net_private p; + unsigned int cur_sk; + unsigned int end_sk; + unsigned int max_sk; + struct sock **batch; + bool st_bucket_done; +}; + +struct bpf_iter__unix { + union { + struct bpf_iter_meta *meta; + }; + union { + struct unix_sock *unix_sk; + }; + uid_t uid; +}; + +enum { + Q_REQUEUE_PI_NONE = 0, + Q_REQUEUE_PI_IGNORE = 1, + Q_REQUEUE_PI_IN_PROGRESS = 2, + Q_REQUEUE_PI_WAIT = 3, + Q_REQUEUE_PI_DONE = 4, + Q_REQUEUE_PI_LOCKED = 5, +}; + +struct callchain_cpus_entries { + struct callback_head callback_head; + struct perf_callchain_entry *cpu_entries[0]; +}; + +struct eventfd_ctx { + struct kref kref; + wait_queue_head_t wqh; + __u64 count; + unsigned int flags; + int id; +}; + +struct sysctl_alias { + const char *kernel_param; + const char *sysctl_param; +}; + +enum synaptics_pkt_type { + SYN_NEWABS = 0, + SYN_NEWABS_STRICT = 1, + SYN_NEWABS_RELAXED = 2, + SYN_OLDABS = 3, +}; + +struct synaptics_hw_state { + int x; + int y; + int z; + int w; + unsigned int left: 1; + unsigned int right: 1; + unsigned int middle: 1; + unsigned int up: 1; + unsigned int down: 1; + u8 ext_buttons; + s8 scroll; +}; + +struct synaptics_device_info { + u32 model_id; + u32 firmware_id; + u32 board_id; + u32 capabilities; + u32 ext_cap; + u32 ext_cap_0c; + u32 ext_cap_10; + u32 identity; + u32 x_res; + u32 y_res; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; +}; + +struct synaptics_data { + struct synaptics_device_info info; + enum synaptics_pkt_type pkt_type; + u8 mode; + int scroll; + bool absolute_mode; + bool disable_gesture; + struct serio *pt_port; + struct synaptics_hw_state agm; + unsigned int agm_count; + long unsigned int press_start; + bool press; + bool report_press; + bool is_forcepad; +}; + +struct min_max_quirk { + const char * const *pnp_ids; + struct { + u32 min; + u32 max; + } board_id; + u32 x_min; + u32 x_max; + u32 y_min; + u32 y_max; +}; + +struct rmem_assigned_device { + struct device *dev; + struct reserved_mem *rmem; + struct list_head list; +}; + +enum { + NLBL_CIPSOV4_C_UNSPEC = 0, + NLBL_CIPSOV4_C_ADD = 1, + NLBL_CIPSOV4_C_REMOVE = 2, + NLBL_CIPSOV4_C_LIST = 3, + NLBL_CIPSOV4_C_LISTALL = 4, + __NLBL_CIPSOV4_C_MAX = 5, +}; + +enum { + NLBL_CIPSOV4_A_UNSPEC = 0, + NLBL_CIPSOV4_A_DOI = 1, + NLBL_CIPSOV4_A_MTYPE = 2, + NLBL_CIPSOV4_A_TAG = 3, + NLBL_CIPSOV4_A_TAGLST = 4, + NLBL_CIPSOV4_A_MLSLVLLOC = 5, + NLBL_CIPSOV4_A_MLSLVLREM = 6, + NLBL_CIPSOV4_A_MLSLVL = 7, + NLBL_CIPSOV4_A_MLSLVLLST = 8, + NLBL_CIPSOV4_A_MLSCATLOC = 9, + NLBL_CIPSOV4_A_MLSCATREM = 10, + NLBL_CIPSOV4_A_MLSCAT = 11, + NLBL_CIPSOV4_A_MLSCATLST = 12, + __NLBL_CIPSOV4_A_MAX = 13, +}; + +struct netlbl_cipsov4_doiwalk_arg { + struct netlink_callback *nl_cb; + struct sk_buff *skb; + u32 seq; +}; + +struct mptcp_diag_ctx { + long int s_slot; + long int s_num; + unsigned int l_slot; + unsigned int l_num; +}; + +#ifndef BPF_NO_PRESERVE_ACCESS_INDEX +#pragma clang attribute pop +#endif + +#endif /* __VMLINUX_H__ */ diff --git a/vmlinux/vmlinux.h b/vmlinux/vmlinux.h new file mode 120000 index 0000000..ba62f1a --- /dev/null +++ b/vmlinux/vmlinux.h @@ -0,0 +1 @@ +x86/vmlinux.h \ No newline at end of file